ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYWE3MjQKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNjcgQEAKK2FjbG9jYWwubTQKK2F1dG9tNHRlLmNhY2hlCitjb25maWcuaAorY29uZmlnLmguaW4KK2NvbmZpZy5oLW5ldworY29uZmlnLmxvZworY29uZmlnLnN0YXR1cworY29uZmlnLmd1ZXNzCitjb25maWcuc3ViCitjb25maWcucnBhdGgKK2NvbmZpZ3VyZQorbGlidG9vbAorc3RhbXAtaAorc3RhbXAtaC5pbgorc3RhbXAtaDEKK2dzdC1lbGVtZW50LWNoZWNrLSoubTQKK2x0bWFpbi5zaAorbWlzc2luZworbWtpbnN0YWxsZGlycworY29tcGlsZQoraW5zdGFsbC1zaAorZGVwY29tcAorYXV0b3JlZ2VuLnNoCitBQk9VVC1OTFMKKy9JTlNUQUxMCitfc3RkaW50LmgKK2dzdC1wbHVnaW5zLWdvb2QtKi50YXIuKgorLmRpcnN0YW1wCisKKy9tNAorCisuZGVwcworLmxpYnMKKyoubG8KKyoubGEKKyoubworTWFrZWZpbGUuaW4KK01ha2VmaWxlCisqfgorKi5zd3AKKyouZ2M/PworCisvbTQKKworL2V4dC9kdi9zbXB0ZV90ZXN0CisvZ3N0L211bHRpZmlsZS90ZXN0LXNwbGl0bXV4LXBhcnQtcmVhZGVyCisvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS5oCisKK3RtcC1vcmMuYworKm9yYy5oCisKKy90ZXN0cy9leGFtcGxlcy9qYWNrL2phY2tfY2xpZW50CisKK0J1aWxkCisqLnVzZXIKKyouc3VvCisqLmlwY2gKKyouc2RmCisqLm9wZW5zZGYKKyouRFNfU3RvcmUKKworL3Rlc3QtZHJpdmVyCisqLmxvZworKi50cnMKKworL2J1aWxkCisvc3VicHJvamVjdHMKZGlmZiAtLWdpdCBhLy5naXRtb2R1bGVzIGIvLmdpdG1vZHVsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU0NmNmNQotLS0gL2Rldi9udWxsCisrKyBiLy5naXRtb2R1bGVzCkBAIC0wLDAgKzEsMyBAQAorW3N1Ym1vZHVsZSAiY29tbW9uIl0KKyAgICAgICAgcGF0aCA9IGNvbW1vbgorICAgICAgICB1cmwgPSBodHRwczovL2Fub25naXQuZnJlZWRlc2t0b3Aub3JnL2dpdC9nc3RyZWFtZXIvY29tbW9uLmdpdApkaWZmIC0tZ2l0IGEvQVVUSE9SUyBiL0FVVEhPUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlZjVhMwotLS0gL2Rldi9udWxsCisrKyBiL0FVVEhPUlMKQEAgLTAsMCArMSwyMSBAQAorRXJpayBXYWx0aGluc2VuIDxvbWVnYUB0ZW1wbGUtYmFwdGlzdC5jb20+CitNYXR0IEhvd2VsbCA8bWhvd2VsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitCcmVudCBCcmFkYnVybiA8YmJyYWRidXJuQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK1dpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BjaGVsbG8uYmU+CitSaWNoYXJkIEJvdWx0b24gPHJpY2hhcmRAdGFydGFydXMub3JnPgorWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CitEYXZpZCBJLiBMZWhuIDxkbGVobkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitDaHJpcyBFbWVyc29uIDxjaHJpc0B0YXJ0YXJ1cy5vcmc+CitKZW5zIFRoaWVsZSA8a2FybWVAdW5mb3JnZXR0YWJsZS5jb20+CitUaG9tYXMgTnliZXJnIDx0aG9tYXNAY29kZWZhY3Rvcnkuc2U+CitCYXN0aWVuIE5vY2VyYSA8aGFkZXNzQGhhZGVzcy5uZXQ+CitDaHJpc3RpYW4gRnJlZHJpayBLYWxhZ2VyIFNjaGFsbGVyIDxVcmFldXNAbGludXhyaXNpbmcub3JnPgorVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CitBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CitDYW1lcm9uIEh1dGNoaXNvbiA8Y2FtaEB4ZG5hLm5ldD4KK0RhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorQmVuamFtaW4gT3R0ZSA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CitSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CitKdWxpZW4gTU9VVFRFIDxqdWxpZW5AbW91dHRlLm5ldD4KK0phbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorQXJ3ZWQgdi4gTWVya2F0eiA8di5tZXJrYXR6QGdteC5uZXQ+CmRpZmYgLS1naXQgYS9DT1BZSU5HIGIvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWRkMzBhCi0tLSAvZGV2L251bGwKKysrIGIvQ09QWUlORwpAQCAtMCwwICsxLDUwNCBAQAorCQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLjEsIEZlYnJ1YXJ5IDE5OTkKKworIENvcHlyaWdodCAoQykgMTk5MSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIExlc3NlciBHUEwuICBJdCBhbHNvIGNvdW50cworIGFzIHRoZSBzdWNjZXNzb3Igb2YgdGhlIEdOVSBMaWJyYXJ5IFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGhlbmNlCisgdGhlIHZlcnNpb24gbnVtYmVyIDIuMS5dCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlcyBhcmUgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlCitmcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuCisKKyAgVGhpcyBsaWNlbnNlLCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZQorc3BlY2lhbGx5IGRlc2lnbmF0ZWQgc29mdHdhcmUgcGFja2FnZXMtLXR5cGljYWxseSBsaWJyYXJpZXMtLW9mIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBvdGhlciBhdXRob3JzIHdobyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91CitjYW4gdXNlIGl0IHRvbywgYnV0IHdlIHN1Z2dlc3QgeW91IGZpcnN0IHRoaW5rIGNhcmVmdWxseSBhYm91dCB3aGV0aGVyCit0aGlzIGxpY2Vuc2Ugb3IgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgdGhlIGJldHRlcgorc3RyYXRlZ3kgdG8gdXNlIGluIGFueSBwYXJ0aWN1bGFyIGNhc2UsIGJhc2VkIG9uIHRoZSBleHBsYW5hdGlvbnMgYmVsb3cuCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20gb2YgdXNlLAorbm90IHByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdAoreW91IGhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZQorZm9yIHRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCk7IHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldAoraXQgaWYgeW91IHdhbnQgaXQ7IHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIGFuZCB1c2UgcGllY2VzIG9mCitpdCBpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGFyZSBpbmZvcm1lZCB0aGF0IHlvdSBjYW4gZG8KK3RoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCitkaXN0cmlidXRvcnMgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZXNlCityaWdodHMuICBUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IKK3lvdSBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnkgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcworb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoreW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQorY29kZS4gIElmIHlvdSBsaW5rIG90aGVyIGNvZGUgd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQorY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzLCBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtCit3aXRoIHRoZSBsaWJyYXJ5IGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZworaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIGEgdHdvLXN0ZXAgbWV0aG9kOiAoMSkgd2UgY29weXJpZ2h0IHRoZQorbGlicmFyeSwgYW5kICgyKSB3ZSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlLCB3aGljaCBnaXZlcyB5b3UgbGVnYWwKK3Blcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgorCisgIFRvIHByb3RlY3QgZWFjaCBkaXN0cmlidXRvciwgd2Ugd2FudCB0byBtYWtlIGl0IHZlcnkgY2xlYXIgdGhhdAordGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSBmcmVlIGxpYnJhcnkuICBBbHNvLCBpZiB0aGUgbGlicmFyeSBpcworbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHRoZSByZWNpcGllbnRzIHNob3VsZCBrbm93Cit0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwgdmVyc2lvbiwgc28gdGhhdCB0aGUgb3JpZ2luYWwKK2F1dGhvcidzIHJlcHV0YXRpb24gd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgcHJvYmxlbXMgdGhhdCBtaWdodCBiZQoraW50cm9kdWNlZCBieSBvdGhlcnMuCisMCisgIEZpbmFsbHksIHNvZnR3YXJlIHBhdGVudHMgcG9zZSBhIGNvbnN0YW50IHRocmVhdCB0byB0aGUgZXhpc3RlbmNlIG9mCithbnkgZnJlZSBwcm9ncmFtLiAgV2Ugd2lzaCB0byBtYWtlIHN1cmUgdGhhdCBhIGNvbXBhbnkgY2Fubm90CitlZmZlY3RpdmVseSByZXN0cmljdCB0aGUgdXNlcnMgb2YgYSBmcmVlIHByb2dyYW0gYnkgb2J0YWluaW5nIGEKK3Jlc3RyaWN0aXZlIGxpY2Vuc2UgZnJvbSBhIHBhdGVudCBob2xkZXIuICBUaGVyZWZvcmUsIHdlIGluc2lzdCB0aGF0CithbnkgcGF0ZW50IGxpY2Vuc2Ugb2J0YWluZWQgZm9yIGEgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBtdXN0IGJlCitjb25zaXN0ZW50IHdpdGggdGhlIGZ1bGwgZnJlZWRvbSBvZiB1c2Ugc3BlY2lmaWVkIGluIHRoaXMgbGljZW5zZS4KKworICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIGxpY2Vuc2UsIHRoZSBHTlUgTGVzc2VyCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4gZGVzaWduYXRlZCBsaWJyYXJpZXMsIGFuZAoraXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBXZSB1c2UKK3RoaXMgbGljZW5zZSBmb3IgY2VydGFpbiBsaWJyYXJpZXMgaW4gb3JkZXIgdG8gcGVybWl0IGxpbmtpbmcgdGhvc2UKK2xpYnJhcmllcyBpbnRvIG5vbi1mcmVlIHByb2dyYW1zLgorCisgIFdoZW4gYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIGEgbGlicmFyeSwgd2hldGhlciBzdGF0aWNhbGx5IG9yIHVzaW5nCithIHNoYXJlZCBsaWJyYXJ5LCB0aGUgY29tYmluYXRpb24gb2YgdGhlIHR3byBpcyBsZWdhbGx5IHNwZWFraW5nIGEKK2NvbWJpbmVkIHdvcmssIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeS4gIFRoZSBvcmRpbmFyeQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0aGVyZWZvcmUgcGVybWl0cyBzdWNoIGxpbmtpbmcgb25seSBpZiB0aGUKK2VudGlyZSBjb21iaW5hdGlvbiBmaXRzIGl0cyBjcml0ZXJpYSBvZiBmcmVlZG9tLiAgVGhlIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBwZXJtaXRzIG1vcmUgbGF4IGNyaXRlcmlhIGZvciBsaW5raW5nIG90aGVyIGNvZGUgd2l0aAordGhlIGxpYnJhcnkuCisKKyAgV2UgY2FsbCB0aGlzIGxpY2Vuc2UgdGhlICJMZXNzZXIiIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYmVjYXVzZSBpdAorZG9lcyBMZXNzIHRvIHByb3RlY3QgdGhlIHVzZXIncyBmcmVlZG9tIHRoYW4gdGhlIG9yZGluYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlLiAgSXQgYWxzbyBwcm92aWRlcyBvdGhlciBmcmVlIHNvZnR3YXJlIGRldmVsb3BlcnMgTGVzcworb2YgYW4gYWR2YW50YWdlIG92ZXIgY29tcGV0aW5nIG5vbi1mcmVlIHByb2dyYW1zLiAgVGhlc2UgZGlzYWR2YW50YWdlcworYXJlIHRoZSByZWFzb24gd2UgdXNlIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtYW55CitsaWJyYXJpZXMuICBIb3dldmVyLCB0aGUgTGVzc2VyIGxpY2Vuc2UgcHJvdmlkZXMgYWR2YW50YWdlcyBpbiBjZXJ0YWluCitzcGVjaWFsIGNpcmN1bXN0YW5jZXMuCisKKyAgRm9yIGV4YW1wbGUsIG9uIHJhcmUgb2NjYXNpb25zLCB0aGVyZSBtYXkgYmUgYSBzcGVjaWFsIG5lZWQgdG8KK2VuY291cmFnZSB0aGUgd2lkZXN0IHBvc3NpYmxlIHVzZSBvZiBhIGNlcnRhaW4gbGlicmFyeSwgc28gdGhhdCBpdCBiZWNvbWVzCithIGRlLWZhY3RvIHN0YW5kYXJkLiAgVG8gYWNoaWV2ZSB0aGlzLCBub24tZnJlZSBwcm9ncmFtcyBtdXN0IGJlCithbGxvd2VkIHRvIHVzZSB0aGUgbGlicmFyeS4gIEEgbW9yZSBmcmVxdWVudCBjYXNlIGlzIHRoYXQgYSBmcmVlCitsaWJyYXJ5IGRvZXMgdGhlIHNhbWUgam9iIGFzIHdpZGVseSB1c2VkIG5vbi1mcmVlIGxpYnJhcmllcy4gIEluIHRoaXMKK2Nhc2UsIHRoZXJlIGlzIGxpdHRsZSB0byBnYWluIGJ5IGxpbWl0aW5nIHRoZSBmcmVlIGxpYnJhcnkgdG8gZnJlZQorc29mdHdhcmUgb25seSwgc28gd2UgdXNlIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICBJbiBvdGhlciBjYXNlcywgcGVybWlzc2lvbiB0byB1c2UgYSBwYXJ0aWN1bGFyIGxpYnJhcnkgaW4gbm9uLWZyZWUKK3Byb2dyYW1zIGVuYWJsZXMgYSBncmVhdGVyIG51bWJlciBvZiBwZW9wbGUgdG8gdXNlIGEgbGFyZ2UgYm9keSBvZgorZnJlZSBzb2Z0d2FyZS4gIEZvciBleGFtcGxlLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgR05VIEMgTGlicmFyeSBpbgorbm9uLWZyZWUgcHJvZ3JhbXMgZW5hYmxlcyBtYW55IG1vcmUgcGVvcGxlIHRvIHVzZSB0aGUgd2hvbGUgR05VCitvcGVyYXRpbmcgc3lzdGVtLCBhcyB3ZWxsIGFzIGl0cyB2YXJpYW50LCB0aGUgR05VL0xpbnV4IG9wZXJhdGluZworc3lzdGVtLgorCisgIEFsdGhvdWdoIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBMZXNzIHByb3RlY3RpdmUgb2YgdGhlCit1c2VycycgZnJlZWRvbSwgaXQgZG9lcyBlbnN1cmUgdGhhdCB0aGUgdXNlciBvZiBhIHByb2dyYW0gdGhhdCBpcworbGlua2VkIHdpdGggdGhlIExpYnJhcnkgaGFzIHRoZSBmcmVlZG9tIGFuZCB0aGUgd2hlcmV3aXRoYWwgdG8gcnVuCit0aGF0IHByb2dyYW0gdXNpbmcgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBMaWJyYXJ5LgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LiAgUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEKKyJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCitmb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoZXJlYXMgdGhlIGxhdHRlciBtdXN0CitiZSBjb21iaW5lZCB3aXRoIHRoZSBsaWJyYXJ5IGluIG9yZGVyIHRvIHJ1bi4KKwwKKwkJICBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSBvciBvdGhlcgorcHJvZ3JhbSB3aGljaCBjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3IKK290aGVyIGF1dGhvcml6ZWQgcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKK3RoaXMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4KK0VhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCisgIEEgImxpYnJhcnkiIG1lYW5zIGEgY29sbGVjdGlvbiBvZiBzb2Z0d2FyZSBmdW5jdGlvbnMgYW5kL29yIGRhdGEKK3ByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcworKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KKworICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yaword2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSIgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKK2NvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCitwb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCitzdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCitpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQorCisgICJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCithbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAoraW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uCithbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCitzdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCit3cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCithbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KKyAgCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncworY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKK3lvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCithcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAorYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKK3dhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCitMaWJyYXJ5LgorCisgIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCithbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCitmZWUuCisMCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KKyAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQorICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKKyAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5CisgICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCisgICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCisgICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKKyAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCisKKyAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcworICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKKyAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQorICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0CisgICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKKyAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCitpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQord2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwordGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwordGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAoraW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQordGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgordGhlc2Ugbm90aWNlcy4KKwwKKyAgT25jZSB0aGlzIGNoYW5nZSBpcyBtYWRlIGluIGEgZ2l2ZW4gY29weSwgaXQgaXMgaXJyZXZlcnNpYmxlIGZvcgordGhhdCBjb3B5LCBzbyB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBhbGwKK3N1YnNlcXVlbnQgY29waWVzIGFuZCBkZXJpdmF0aXZlIHdvcmtzIG1hZGUgZnJvbSB0aGF0IGNvcHkuCisKKyAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IHdpc2ggdG8gY29weSBwYXJ0IG9mIHRoZSBjb2RlIG9mCit0aGUgTGlicmFyeSBpbnRvIGEgcHJvZ3JhbSB0aGF0IGlzIG5vdCBhIGxpYnJhcnkuCisKKyAgNC4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhIHBvcnRpb24gb3IKK2Rlcml2YXRpdmUgb2YgaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtCit1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhY2NvbXBhbnkKK2l0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSwgd2hpY2gKK211c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQorbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgorCisgIElmIGRpc3RyaWJ1dGlvbiBvZiBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Citmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZQorc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50IHRvCitkaXN0cmlidXRlIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorCisgIDUuIEEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIG5vIGRlcml2YXRpdmUgb2YgYW55IHBvcnRpb24gb2YgdGhlCitMaWJyYXJ5LCBidXQgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIHRoZSBMaWJyYXJ5IGJ5IGJlaW5nIGNvbXBpbGVkIG9yCitsaW5rZWQgd2l0aCBpdCwgaXMgY2FsbGVkIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5Ii4gIFN1Y2ggYQord29yaywgaW4gaXNvbGF0aW9uLCBpcyBub3QgYSBkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnksIGFuZAordGhlcmVmb3JlIGZhbGxzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICBIb3dldmVyLCBsaW5raW5nIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5CitjcmVhdGVzIGFuIGV4ZWN1dGFibGUgdGhhdCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnkgKGJlY2F1c2UgaXQKK2NvbnRhaW5zIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5KSwgcmF0aGVyIHRoYW4gYSAid29yayB0aGF0IHVzZXMgdGhlCitsaWJyYXJ5Ii4gIFRoZSBleGVjdXRhYmxlIGlzIHRoZXJlZm9yZSBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KK1NlY3Rpb24gNiBzdGF0ZXMgdGVybXMgZm9yIGRpc3RyaWJ1dGlvbiBvZiBzdWNoIGV4ZWN1dGFibGVzLgorCisgIFdoZW4gYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHVzZXMgbWF0ZXJpYWwgZnJvbSBhIGhlYWRlciBmaWxlCit0aGF0IGlzIHBhcnQgb2YgdGhlIExpYnJhcnksIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgbWF5IGJlIGEKK2Rlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSBldmVuIHRob3VnaCB0aGUgc291cmNlIGNvZGUgaXMgbm90LgorV2hldGhlciB0aGlzIGlzIHRydWUgaXMgZXNwZWNpYWxseSBzaWduaWZpY2FudCBpZiB0aGUgd29yayBjYW4gYmUKK2xpbmtlZCB3aXRob3V0IHRoZSBMaWJyYXJ5LCBvciBpZiB0aGUgd29yayBpcyBpdHNlbGYgYSBsaWJyYXJ5LiAgVGhlCit0aHJlc2hvbGQgZm9yIHRoaXMgdG8gYmUgdHJ1ZSBpcyBub3QgcHJlY2lzZWx5IGRlZmluZWQgYnkgbGF3LgorCisgIElmIHN1Y2ggYW4gb2JqZWN0IGZpbGUgdXNlcyBvbmx5IG51bWVyaWNhbCBwYXJhbWV0ZXJzLCBkYXRhCitzdHJ1Y3R1cmUgbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBhbmQgc21hbGwgbWFjcm9zIGFuZCBzbWFsbCBpbmxpbmUKK2Z1bmN0aW9ucyAodGVuIGxpbmVzIG9yIGxlc3MgaW4gbGVuZ3RoKSwgdGhlbiB0aGUgdXNlIG9mIHRoZSBvYmplY3QKK2ZpbGUgaXMgdW5yZXN0cmljdGVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgbGVnYWxseSBhIGRlcml2YXRpdmUKK3dvcmsuICAoRXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGlzIG9iamVjdCBjb2RlIHBsdXMgcG9ydGlvbnMgb2YgdGhlCitMaWJyYXJ5IHdpbGwgc3RpbGwgZmFsbCB1bmRlciBTZWN0aW9uIDYuKQorCisgIE90aGVyd2lzZSwgaWYgdGhlIHdvcmsgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5LCB5b3UgbWF5CitkaXN0cmlidXRlIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gNi4KK0FueSBleGVjdXRhYmxlcyBjb250YWluaW5nIHRoYXQgd29yayBhbHNvIGZhbGwgdW5kZXIgU2VjdGlvbiA2LAord2hldGhlciBvciBub3QgdGhleSBhcmUgbGlua2VkIGRpcmVjdGx5IHdpdGggdGhlIExpYnJhcnkgaXRzZWxmLgorDAorICA2LiBBcyBhbiBleGNlcHRpb24gdG8gdGhlIFNlY3Rpb25zIGFib3ZlLCB5b3UgbWF5IGFsc28gY29tYmluZSBvcgorbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKK3dvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCit1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Cittb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKK2VuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgorCisgIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQorTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5Cit0aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCitkdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQorY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQorZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQorb2YgdGhlc2UgdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKKyAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKKyAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgorICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCisgICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0CisgICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKKyAgICB1c2VyIGNhbiBtb2RpZnkgdGhlIExpYnJhcnkgYW5kIHRoZW4gcmVsaW5rIHRvIHByb2R1Y2UgYSBtb2RpZmllZAorICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCisgICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCisgICAgTGlicmFyeSB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBhYmxlIHRvIHJlY29tcGlsZSB0aGUgYXBwbGljYXRpb24KKyAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKKworICAgIGIpIFVzZSBhIHN1aXRhYmxlIHNoYXJlZCBsaWJyYXJ5IG1lY2hhbmlzbSBmb3IgbGlua2luZyB3aXRoIHRoZQorICAgIExpYnJhcnkuICBBIHN1aXRhYmxlIG1lY2hhbmlzbSBpcyBvbmUgdGhhdCAoMSkgdXNlcyBhdCBydW4gdGltZSBhCisgICAgY29weSBvZiB0aGUgbGlicmFyeSBhbHJlYWR5IHByZXNlbnQgb24gdGhlIHVzZXIncyBjb21wdXRlciBzeXN0ZW0sCisgICAgcmF0aGVyIHRoYW4gY29weWluZyBsaWJyYXJ5IGZ1bmN0aW9ucyBpbnRvIHRoZSBleGVjdXRhYmxlLCBhbmQgKDIpCisgICAgd2lsbCBvcGVyYXRlIHByb3Blcmx5IHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCBpZgorICAgIHRoZSB1c2VyIGluc3RhbGxzIG9uZSwgYXMgbG9uZyBhcyB0aGUgbW9kaWZpZWQgdmVyc2lvbiBpcworICAgIGludGVyZmFjZS1jb21wYXRpYmxlIHdpdGggdGhlIHZlcnNpb24gdGhhdCB0aGUgd29yayB3YXMgbWFkZSB3aXRoLgorCisgICAgYykgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQKKyAgICBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMKKyAgICBzcGVjaWZpZWQgaW4gU3Vic2VjdGlvbiA2YSwgYWJvdmUsIGZvciBhIGNoYXJnZSBubyBtb3JlCisgICAgdGhhbiB0aGUgY29zdCBvZiBwZXJmb3JtaW5nIHRoaXMgZGlzdHJpYnV0aW9uLgorCisgICAgZCkgSWYgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKKyAgICBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKKyAgICBzcGVjaWZpZWQgbWF0ZXJpYWxzIGZyb20gdGhlIHNhbWUgcGxhY2UuCisKKyAgICBlKSBWZXJpZnkgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlc2UKKyAgICBtYXRlcmlhbHMgb3IgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyB1c2VyIGEgY29weS4KKworICBGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlICJ3b3JrIHRoYXQgdXNlcyB0aGUKK0xpYnJhcnkiIG11c3QgaW5jbHVkZSBhbnkgZGF0YSBhbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yCityZXByb2R1Y2luZyB0aGUgZXhlY3V0YWJsZSBmcm9tIGl0LiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwKK3RoZSBtYXRlcmlhbHMgdG8gYmUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzCitub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKK2NvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KK3doaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKK3RoZSBleGVjdXRhYmxlLgorCisgIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCityZXN0cmljdGlvbnMgb2Ygb3RoZXIgcHJvcHJpZXRhcnkgbGlicmFyaWVzIHRoYXQgZG8gbm90IG5vcm1hbGx5CithY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90Cit1c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91CitkaXN0cmlidXRlLgorDAorICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQorZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAorbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCit0aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKK3Blcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yaworICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKKyAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAgICBTZWN0aW9ucyBhYm92ZS4KKworICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0CisgICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKKyAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCisKKyAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKK3RoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55CithdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgorcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAorb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwordGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5CitzdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoCit0aGlzIExpY2Vuc2UuCisMCisgIDExLiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkgYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQorcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5LAorYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkCithbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKK3NvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cworZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYKK3dyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEzLiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldwordmVyc2lvbnMgb2YgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgorU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAorYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5CitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKKyJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKK2xpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorDAorICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCit3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcworY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKK2RlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKK29mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCithbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KK1dBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCitFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgorT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKK0tJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKK0xJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCitUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KK1dSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCitBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQorRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKK0xJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKK1JFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCitTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICitEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKK2V2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZworcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCitvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KKworICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4gIEl0IGlzCitzYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCisiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIGxpYnJhcnkncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKKyAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKKworCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxNDg0NgotLS0gL2Rldi9udWxsCisrKyBiL0NoYW5nZUxvZwpAQCAtMCwwICsxLDEzMDUwNSBAQAorPT09IHJlbGVhc2UgMS4xMi4wID09PQorCisyMDE3LTA1LTA0ICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0Bjb2F4aW9uLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSAgcmVsZWFzaW5nIDEuMTIuMAorCisyMDE3LTA1LTA0IDEzOjQ3OjIwICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9lbC5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTctMDUtMDIgMTA6MzI6MzAgKzA5MDAgIFNldW5naGEgWWFuZyA8c2gueWFuZ0BsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBjcmFzaCBvbiBtc3Mgc3RyZWFtIGNhdXNlZCBieSBpbnZhbGlkIHN0c2QgZW50cnkgYWNjZXNzCisJICBTaW5jZSBtc3MgaGFzIG5vIG1vb3YsIGRlZmF1bHQgc3RzZCBlbnRyeSBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIG1lZGlhLWNhcHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgyMDQyCisKKz09PSByZWxlYXNlIDEuMTEuOTEgPT09CisKKzIwMTctMDQtMjcgMTc6Mjk6NTggKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdnB4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiBtZXNvbi5idWlsZDoKKwkgIFJlbGVhc2UgMS4xMS45MQorCisyMDE3LTA0LTI3IDE1OjU4OjQ3ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZnVyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDE3LTA0LTI3IDE1OjI4OjAyICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9MSU5HVUFTOgorCSogcG8vZWwucG86CisJKiBwby9mdXIucG86CisJICBwbzogVXBkYXRlIHRyYW5zbGF0aW9ucworCisyMDE3LTA0LTI3IDEyOjU2OjI3ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERvbid0IGNyYXNoIGluIGRlYnVnIG91dHB1dCBpZiBzdHJlYW09PU5VTEwKKwkgIFRoYXQgY2FzZSBpcyBjb3JyZWN0bHkgaGFuZGxlZCBiZWxvdyBidXQgbm90IGluIHRoZSBkZWJ1ZyBvdXRwdXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgxMjcwCisKKzIwMTctMDQtMjUgMTc6MTE6MjcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRG9uJ3QgcGVyZm9ybSBzZWVrcyB3aXRoIGluY29uc2lzdGVudCBzZWVrIHZhbHVlcworCSAgSWYgZ3N0X3NlZ21lbnRfZG9fc2VlaygpIGZhaWxzLCB3ZSBzaG91bGRuJ3QgdHJ5IHNlZWtpbmcgb24gdGhhdAorCSAgcmVzdWx0aW5nIHNlZ21lbnQgYnV0IGp1c3QgZXJyb3Igb3V0LiBDcmFzaGVzIGZ1cnRoZXIgZG93biB0aGUgbGluZQorCSAgb3RoZXJ3aXNlLgorCisyMDE3LTA0LTI0IDIwOjI3OjQ5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNjBhZWVmNiB0byA0OGE1ZDg1CisKKzIwMTctMDQtMjQgMTc6MzE6MDQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHRlc3RzOiBydHAtcGF5bG9hZGluZzogYWRkIHRlc3QgZm9yIHJ0cGgyNjRkZXBheSBhdmMvYnl0ZS1zdHJlYW0gb3V0cHV0CisJICBNYWtlIHN1cmUgYXZjIG91dHB1dCBkb2Vzbid0IGNvbnRhaW4gU1BTL1BQUyBpbmxpbmUsIGJ1dAorCSAgYnl0ZS1zdHJlYW0gb3V0cHV0IGRvZXMuCisKKzIwMTctMDQtMjQgMTc6Mjk6MzcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXk6IGRvbid0IGluc2VydCBTUFMvUFBTIGlubGluZSBmb3IgQVZDIG91dHB1dAorCSAgU1BTL1BQUyBhcmUgaW4gdGhlIGNhcHMgaW4gdGhpcyBjYXNlIGFuZCBzaG91bGRuJ3QgYmUgaW4KKwkgIHRoZSBzdHJlYW0gZGF0YS4KKworMjAxNy0wNC0yMSAxOTowOToxNCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogQ2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzcycgcHJvdmlkZV9jbG9jaygpIGltcGxlbWVudGF0aW9uCisJICBJZiBubyBjbG9jayB3YXMgcHJvdmlkZWQgZGlyZWN0bHkgYnkgcnRzcHNyYy4gVGhpcyBiZWhhdmlvdXIgd2FzIHJlbW92ZWQKKwkgIGJ5IGY4MDEzNDg3YzkxYTZmZmM1NTJhNGIyNWFhMWE3MGYwYmQ1Mzc3ZjggYW5kIHJlc3VsdHMgaW4gcnRzcHNyYyBub3QKKwkgIHByb3ZpZGluZyB0aGUgc3lzdGVtIGNsb2NrIHZpYSB0aGUgcnRwaml0dGVyYnVmZmVyLgorCSAgQXMgYSByZXN1bHQsIGlmIGFub3RoZXIgZWxlbWVudCBsaWtlIGFuIGF1ZGlvIHNpbmssIHByb3ZpZGVzIGEgY2xvY2ssCisJICB0aGUgcGlwZWxpbmUgd291bGQgc2VsZWN0IHRoYXQgKHdoZW4gZ29pbmcgdG8gUEFVU0VEL1BMQVlJTkcgYWdhaW4gbGF0ZXIpLgorCSAgQXVkaW8gY2xvY2tzIHVzdWFsbHkgZG9uJ3QgcHJvZ3Jlc3MgaW4gUEFVU0VELCBhbmQgdGh1cyBvdXIgbGl2ZSBzb3VyY2UKKwkgIHdvbid0IGJlIGFibGUgdG8gdXNlIHRoZSBjbG9jayB0byBwcm9kdWNlIGRhdGEsIG1ha2luZyB0aGUgc2luayBuZXZlcgorCSAgcHJlcm9sbCBhbmQgZXZlcnl0aGluZyBpcyBzdHVjay4KKworMjAxNy0wNC0yMCAxMToyMjoxNSArMDIwMCAgSsO8cmdlbiBTYWNocyA8anVlcmdlbi5zYWNoc0BtZXR6LWNlLmRlPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJlc2V0IHNhbXBsZV9kZXNjcmlwdGlvbl9pZCB0byBkZWZhdWx0CisJICBGaXhlcyBzdHJlYW0gd2hlcmUgc2FtcGxlX2Rlc2NyaXB0aW9uX2lkIGlzIHNwZWNpZmllZCBpbiB0aGUgdGZoZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3ODMzNworCisyMDE3LTA0LTIwIDEzOjE2OjI0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBEb24ndCB1c2UgYW4gZXhwbGljaXQgbmFtZSBmb3IgcmVxdWVzdGluZyBhdWRpbyBwYWRzCisJICAuLi4gdW5sZXNzIHRoZSBtdXhlciB1c2VzIHRoZSBzYW1lIGF1ZGlvIHBhZCB0ZW1wbGF0ZSBuYW1lIGFzCisJICBzcGxpdG11eHNpbmsuIFdlIGNhbid0IHJlcXVlc3QgYSBwYWQgY2FsbGVkICJhdWRpb18wIiBvbiBhIG11eGVyIHRoYXQKKwkgIHdhbnRzIHBhZHMgdG8gYmUgInNpbmtfJWQiLgorCisyMDE3LTAyLTIzIDA5OjMxOjM2ICswOTAwICBDaGFuZ0JvayBDaGFlIDxjaGFuZ2Jvay5jaGVhQGdtYWlsLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IHJlbW92ZSBkdXBsaWNhdGVkIHNlZ21lbnQgaW5pdGlhbGl6YXRpb24KKwkgIEl0J3MgYWxzbyBkb25lIGluIGdzdF9mbHZfZGVtdXhfY2xlYW51cCgpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3OTEwNgorCisyMDE3LTA0LTIwIDIwOjE3OjM1ICsxMDAwICBYYXZpZXIgQ2xhZXNzZW5zIDx4YXZpZXIuY2xhZXNzZW5zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IENvcnJlY3RseSBjYXRjaCBGTFVTSCBldmVudHMgaW4gcHJvYmVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY3NDk4CisKKzIwMTctMDQtMTkgMTI6Mjg6MTIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIFJldmVydCAicnRwYmluOiBwaXBlbGluZSBnZXRzIGFuIEVPUyB3aGVuIGFueSBydHBzb3VyY2VzIGJ5ZXMiCisJICBUaGlzIHJldmVydHMgY29tbWl0IGVlZWEyYTdmZTg4YTE3YjE1MzE4ZDViNmFlNmUxOTBiMmY3NzcwMzAuCisJICBJdCBicmVha3MgRU9TIGluIHNvbWUgc2VuZGVyIHBpcGVsaW5lcywgc2VlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczMjE4I2MyMAorCisyMDE3LTA0LTE0IDE3OjAxOjQ5ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFJlc2V0IGFkYXB0ZXIgaW4gbW9yZSBkaXNjb250aW51aXR5IGNhc2VzCisJICBJbiBwdXNoIG1vZGUgd2UgcHJvY2VzcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGluIHRoZSBhZGFwdGVyLiBXaGVuIHdlIHJlY2VpdmUKKwkgIGEgRElTQ09OVCBidWZmZXIgd2hpY2ggd2UgY2FuJ3QgbWF0Y2ggdG8gYW4gYWN0dWFsIHNhbXBsZSAoYmFzZWQgb24gdGhlIGV4aXN0aW5nCisJICBzYW1wbGUgdGFibGUpIGFuZCB0aGVyZSBpcyBzdGlsbCBkYXRhIHJlbWFpbmluZyBpbiB0aGUgaW5jb21pbmcgYWRhcHRlcix0aGVyZSBpcworCSAgb25lIG9mIHR3byBjYXNlcyBoYXBwZW5pbmc6CisJICAxKSBXZSBhcmUgZG9pbmcgcmV2ZXJzZSBwbGF5YmFjaywgaW4gd2hpY2ggY2FzZSB3ZSBzaG91bGQgZmx1c2ggb3V0IGFsbCBwZW5kaW5nCisJICBkYXRhCisJICAyKSBXZSBoYXZlIGxlZnRvdmVyIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgaW5jb21pbmcgYnVmZmVyLi4uIHdoaWNoIHdlIGNhbid0IGRvCisJICBhbnl0aGluZyBhYm91dC4KKwkgIEZvciB0aGUgc2Vjb25kIGNhc2UsIG1ha2Ugc3VyZSB3ZSBmbHVzaCBvdXQgdGhlIHJlbWFpbmluZyBkYXRhIHNvIHRoYXQgd2UgY2FuIHN0YXJ0CisJICBwYXJzaW5nIGFnYWluIGZyb20gc2NyYXRjaC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03ODEzMTkKKworMjAxNy0wNC0xNCAxMDo1Njo0MSArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogVXNlIEdTVF9FTEVNRU5UX0VSUk9SX1dJVEhfREVUQUlMUworCSAgQWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBrbm93IHRoZSBleGFjdCBzdGF0dXMgY29kZSB0aGF0IHdhcyByZXR1cm5lZAorCSAgYnkgdGhlIHNlcnZlciBpbiBhIHByb2dyYW1tYXRpYyBmYXNoaW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc4MTMwNAorCisyMDE3LTA0LTE2IDE4OjQ3OjU2ICswOTAwICBTZXVuZ2hhIFlhbmcgPHNoLnlhbmdAbGdlLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBGaXggbGVhayBvbiBRdERlbXV4U3RyZWFtU3RzZEVudHJ5CisJICBGaXggdW5pdCB0ZXN0IGZhaWx1cmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03ODEzNjIKKworMjAxNy0wNC0xNCAxMzozODo1MyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSogZ3N0L2lzb21wNC9hdG9tcy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IEZpeCB0aW1lc2NhbGUgb2YgdGltZWNvZGUgdHJhY2tzCisJICBUaGV5IHNob3VsZCBoYXZlIGlkZWFsbHkgdGhlIHNhbWUgdGltZXNjYWxlIG9mIHRoZSB2aWRlbyB0cmFjaywgd2hpY2ggd2UKKwkgIGNhbid0IGd1YXJhbnRlZSBoZXJlIGFzIGluIHRoZW9yeSB0aW1lY29kZSBjb25maWd1cmF0aW9uIGFuZCB2aWRlbworCSAgZnJhbWVyYXRlIGNvdWxkIGJlIGRpZmZlcmVudC4gSG93ZXZlciB3ZSBzaG91bGQgc2V0IGEgY29ycmVjdCB0aW1lc2NhbGUKKwkgIGJhc2VkIG9uIHRoZSBmcmFtZXJhdGUgZ2l2ZW4gaW4gdGhlIHRpbWVjb2RlIGNvbmZpZ3VyYXRpb24sIGFuZCBub3QganVzdAorCSAgdXNlIHRoZSBmcmFtZXJhdGUgbnVtZXJhdG9yLgorCisyMDE3LTA0LTEzIDEzOjI1OjA2ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFByb3Blcmx5IHJlc2V0IGRlbXV4ZXIgd2hlbiBhbGwgc3RyZWFtcyBhcmUgRU9TCisJICBNYWtlIHN1cmUgb2Zmc2V0IGFuZCBuZWVkZWRieXRlcyBhcmUgcHJvcGVybHkgcmVzZXR0ZWQgd2hlbiBhbGwKKwkgIHN0cmVhbXMgYXJlIEVPUyBpbiBwdXNoLW1vZGUuCisJICBBdm9pZHMgY2FzZXMgd2hlbiBzb21lIGRhdGEgbWlnaHQgc3RpbGwgYmUgcHVzaGVkIGJ5IHVwc3RyZWFtIChiZWNhdXNlCisJICBpdCBkaWRuJ3QgeWV0IHNlZSB0aGUgcmVzdWx0aW5nIEdTVF9GTE9XX0VPUyB5ZXQpIGFuZCBxdGRlbXV4IGdldHMKKwkgIGNvbXBsZXRlbHkgbG9zdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03ODEyNjYKKworMjAxNy0wNC0xMyAwODowMDozMCArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBNYWtlIG1vcmUgdXNhZ2Ugb2YgZXJyb3IgbWFjcm8KKwkgIEFuZCBtYWtlIHN1cmUgd2UgYWN0dWFsbHkgdXNlIHRoZSBwcm92aWRlZCBzb3VwX21zZyBhcmd1bWVudCBpbiB0aGUgbWFjcm8KKworMjAxNy0wNC0xMiAxODo0Njo1MyArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvbWVzb24uYnVpbGQ6CisJICBtZXNvbjogUHJpbnQgbWVzc2FnZSB3aGVuIGRpc2FibGluZyB0YWdsaWIgb24gTVNWQworCisyMDE3LTA0LTEyIDEzOjI2OjU5ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogRG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSBwYWQtPmxhc3RfYnVmCisJICBidWYgaXMgdGhlIGN1cnJlbnQgcGFkLT5sYXN0X2J1ZiB2YWx1ZS4gSWYgZXZlciBpdCBnZXRzIGNvcGllZC91bnJlZmZlZCwKKwkgIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRvIHdyaXRlIGJhY2sgdGhlIG5ldyAgcG9pbnRlciB0byB0aGUgbGFzdF9idWYKKwkgIHZhcmlhYmxlLgorCSAgRml4ZXMgdXNpbmcgd3JvbmcgcG9pbnRlciB2YWx1ZXMgaW4gdGhlIGNhc2Ugb2YgZGVjcmFzaW5nIERUUyB2YWx1ZQorCisyMDE3LTA0LTEyIDExOjMzOjA1ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSAgdGVzdHM6IEFkZCB2cDllbmMgdG8gZ2l0aWdub3JlCisKKzIwMTctMDQtMTEgMTM6NDE6NDggKzAyMDAgIErDvHJnZW4gU2FjaHMgPGp1ZXJnZW4uc2FjaHNAbWV0ei1jZS5kZT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXg6IHNhbXBsZSBkZXNjcmlwdGlvbiBpbmRleCBvdmVycmlkZSBpbiB0ZmhkIG5vdCBldmFsdWF0ZWQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzgzMzcKKworMjAxNy0wNC0xMiAxMTowMzoyNCArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBBZGQgb3V0LW9mLWJvdW5kIGNoZWNrCisJICBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVhZCBpbnZhbGlkIG1lbW9yeQorCisyMDE2LTA0LTI3IDEyOjE3OjM3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogbW92ZSBwYXJzaW5nIG9mIHRraGQgb3V0IG9mIHN0c2QgZW50cnkgbG9vcAorCSAgSXQgbmVlZHMgb25seSB0byBiZSByZWFkIG9uY2UuCisKKzIwMTYtMDQtMDcgMTI6MjM6MzUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBjaGVjayBmb3IgYSBkaWZmZXJlbnQgc3RzZCBlbnRyeSBiZWZvcmUgcHVzaGluZyBhIHNhbXBsZQorCSAgQmVmb3JlIHB1c2hpbmcgYSBzYW1wbGUsIGNoZWNrIGlmIHRoZXJlIHdhcyBhIGNoYW5nZSBpbiB0aGUgY3VycmVudAorCSAgc3RzZCBlbnRyeS4gVGhpcyBwYXRjaCBhbHNvIGFzc3VtZXMgdGhhdCB0aGUgZmlyc3Qgc3RzZCBlbnRyeSBpcworCSAgdXNlZCBhcyBkZWZhdWx0IGZvciB0aGUgZmlyc3Qgc2FtcGxlLiBJdCBtaWdodCBjYXVzZSBhbiB1bmVlZGVkCisJICBjYXBzIHJlbmVnb3RpYXRpb24gd2hlbiB0aGlzIGlzbid0IHRoZSBjYXNlLgorCisyMDE2LTA0LTA2IDEyOjU1OjE4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcGFyc2UgYWxsIHN0c2QgZW50cmllcworCSAgc3RzZCBjYW4gaGF2ZSBtdWx0aXBsZSBmb3JtYXQgZW50cmllcywgcGFyc2UgdGhlbSBhbGwuCisJICBUaGlzIGlzIHJlcXVpcmVkIHRvIHBsYXkgRFZCIERBU0ggcHJvZmlsZSB0aGF0IHVzZXMgbXVsdGlwbGUgZW50cmllcworCSAgdG8gaWRlbnRpZnkgdGhlIGRpZmZlcmVudCBhdmFpbGFibGUgYml0cmF0ZXMvb3B0aW9ucyBvbiBkYXNoIHN0cmVhbXMKKwkgIFRoZSBzdHJlYW0gZm9ybWF0LXNwZWNpZmljIGRhdGEgaXMgbm90IHN0b3JlZCBpbnRvIFF0RGVtdXhTdHJlYW1TdHNkRW50cnkKKworMjAxNi0wNC0wNSAxNDozNDowMCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJld29yayBzdHNkIHNhbXBsZSBlbnRyaWVzIGFjY2VzcworCSAgSW5zdGVhZCBvZiB1c2luZyB0aGUgc3RzZCBhcyBhIGJhc2UgcG9pbnRlciwgdXNlIHRoZSBhY3R1YWwgc3RzZAorCSAgZW50cnkgYXMgdGhlIHN0c2QgY2FuIGhhdmUgbXVsdGlwbGUgZW50cmllcy4gVGhpcyBpcyByYXJlbHkgdXNlZAorCSAgZm9yIGZpbGUgcGxheWJhY2sgYnV0IGlzIGEgcG9zc2libGUgcHJvZmlsZSB3aXRoIGluIERWQiBEQVNIIHNwZWNzLgorCSAgVGhpcyBzdGlsbCBkb2Vzbid0IHN1cHBvcnQgc3RzZCB3aXRoIG11bHRpcGxlIGVudHJpZXMgYnV0IG1ha2VzIGl0CisJICBlYXNpZXIgdG8gZG8gc28uCisKKzIwMTYtMDQtMDUgMTg6MDA6MTAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBnZXQgc3RzZCBjaGlsZCBieSBpbmRleCBpbnN0ZWFkIG9mIHR5cGUKKwkgIFRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUgdHlwZQorCisyMDE3LTA0LTA3IDE2OjMzOjE4ICswMzAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkgIHRlc3RzL2NoZWNrL3J0cHJ0eDogYWRkIGNoZWNrcyBmb3IgcnRwcnR4cXVldWUncyBtYXgtc2l6ZS17dGltZSxwYWNrZXRzfSBwcm9wZXJ0aWVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgwODY3CisKKzIwMTctMDQtMDQgMTc6MzM6MzEgKzAzMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHF1ZXVlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhxdWV1ZS5oOgorCSAgcnRwcnR4cXVldWU6IGltcGxlbWVudCBoYW5kbGluZyBvZiB0aGUgbWF4LXNpemUtdGltZSBwcm9wZXJ0eQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc4MDg2NworCisyMDE3LTA0LTEwIDIzOjQ5OjA2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBhdXRvZ2VuLnNoOgorCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDM5YWMyZjUgdG8gNjBhZWVmNgorCisyMDE3LTA0LTEwIDA4OjU2OjAwICswMDAwICBUb2RvciBUb21vdiA8dG9kb3IudG9tb3ZAbGluYXJvLm9yZz4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJvYmplY3Q6IENvcHkgdGltZXN0YW1wIHdoZW4gaW1wb3J0aW5nIGJ1ZmZlcnMKKwkgIFRoaXMgaXMgbmVlZGVkIGZvciBWNEwyX09VVFBVVCBpbnRlcmZhY2UsIGFuZCBpcyBoYXJtbGVzcyBvZgorCSAgVjRMMl9DQVBUVVJFIGludGVyZmFjZXMuIFRoaXMgd2lsbCBmaXggdGltZXN0YW1wIGluIGNhc2VzIGxpa2U6CisJICB2NGwyc3JjIGlvLW1vZGU9ZG1hYnVmICEgdjRsMnZpZGVvTmVuYyBvdXRwdXQtaW8tbW9kZT1kbWFidWYtaW1wb3J0ICEgIC4uLgorCSAgU2FtZSBhcHBseSBmb3IgdXNlcnB0ci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03ODExMTkKKworMjAxNy0wNC0xMCAxNTo1NTozMCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IEZpeCBsYXN0X2R0cyB0cmFja2luZyBmb3IgcmF3IGF1ZGlvIGFuZCBzaW1pbGFyIGZvcm1hdHMKKwkgIEFjY3VtdWxhdGUgdGhlIGR1cmF0aW9ucyBkaXJlY3RseSBhbmQgZG9uJ3Qgc2NhbGUgeWV0IGFub3RoZXIgdGltZSBieQorCSAgdGhlIG51bWJlciBvZiBzYW1wbGVzLgorCisyMDE3LTA0LTA3IDEwOjQ4OjUwICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc3BsaXRtdXguYzoKKwkgIHRlc3RzOiBmaXggbGVhayBpbiBzcGxpdG11eCB0ZXN0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgxMDI1CisKKzIwMTctMDQtMDcgMTU6Mjk6NDMgKzA4MDAgIEx5b24gV2FuZyA8bHlvbi53YW5nQG54cC5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzoKKwkgIHNjYWxldGVtcG86IFNjYWxlIEdBUCBldmVudCB0aW1lc3RhbXAgYW5kIGR1cmF0aW9uIGxpa2UgZm9yIGJ1ZmZlcnMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03ODEwMDgKKworMjAxNy0wMi0xNyAxMDowMTowOCAtMDMwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBvc2cuc2Ftc3VuZy5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmg6CisJICB2NGwyZGVjOiBGaXggcmFjZSB3aGVuIGdvaW5nIGZyb20gUEFVU0VEIHRvIFJFQURZCisJICBSdW5uaW5nIGBnc3QtdmFsaWRhdGUtbGF1bmNoZXIgLXQgdmFsaWRhdGUuZmlsZS5wbGF5YmFjay5jaGFuZ2Vfc3RhdGVfaW50ZW5zaXZlLnZvcmJpc192cDhfMV93ZWJtYAorCSAgb24gb2Ryb2lkIFhVNCAoczVwLW1mYyB2NGwyIGRyaXZlcikgb2Z0ZW4gbGVhZHMgdG86CisJICBFUlJPUjouLi9zdWJwcm9qZWN0cy9nc3QtcGx1Z2lucy1nb29kL3N5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOjIxNTpnc3RfdjRsMl92aWRlb19kZWNfc3RvcDogYXNzZXJ0aW9uIGZhaWxlZDogKGdfYXRvbWljX2ludF9nZXQgKCZzZWxmLT5wcm9jZXNzaW5nKSA9PSBGQUxTRSkKKwkgIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBmb2xsb3dpbmcgcmFjZSBoYXBwZW5zOgorCSAgLSBUMDogTWFpbiB0aHJlYWQKKwkgIC0gVDE6IFVwc3RyZWFtIHN0cmVhbWluZyB0aHJlYWQKKwkgIC0gVDIuIHY0bDJkZWMgcHJvY2Vzc2luZyB0aHJlYWQpCisJICBbVGhlIGRlY29kZXIgaXMgaW4gUEFVU0VEIHN0YXRlXQorCSAgVDAuIFRoZSB2YWxpZGF0ZSBzY2VuYXJpbyBydW5zIGBFeGVjdXRpbmcgKDM2LzQwKSBzZXQtc3RhdGU6IHN0YXRlPW51bGwgcmVwZWF0PTQwYAorCSAgVDEtIFRoZSBkZWNvZGVyIGhhbmRsZXMgYSBmcmFtZQorCSAgVDItIEEgZGVjb2RlZCBmcmFtZSBpcyBwdXNoIGRvd25zdHJlYW0KKwkgIFQyLSBEb3duc3RyZWFtIHJldHVybnMgRkxVU0hJTkcgYXMgaXQgaXMgYWxyZWFkeSBmbHVzaGluZyBjaGFuZ2luZyBzdGF0ZQorCSAgVDItIFRoZSBkZWNvZGVyIHN0b3BzIGl0cyBwcm9jZXNzaW5nIHRocmVhZCBhbmQgc2V0cyBgLT5wcm9jZXNzaW5nID0gRkFMU0VgCisJICBUMS0gVGhlIGRlY29kZXIgaGFuZGxlcyBhbm90aGVyIGZyYW1lCisJICBUMS0gYC0+cHJvY2Vzc2AgaXMgRkFMU0Ugc28gdGhlIGRlY29kZXIgcmVzdGFydHMgaXRzIHN0cmVhbWluZyB0aHJlYWQKKwkgIFQwLSBJbiB2NGwyZGVjLT4gc3RvcCB0aGUgcHJvY2Vzc2luZyB0aHJlYWQgaXMgc3RvcHBlZAorCSAgTk9URTogQXQgdGhpcyBwb2ludCB0aGUgcHJvY2Vzc2luZyB0aHJlYWQgbG9vcCBuZXZlciBzdGFydGVkLgorCSAgVDAtIGFzc2VydGlvbiBmYWlsZWQ6IChnX2F0b21pY19pbnRfZ2V0ICgmc2VsZi0+cHJvY2Vzc2luZykgPT0gRkFMU0UpCisJICBIZXJlIEkgYW0gcmVtb3ZpbmcgdGhlIHdob2xlIC0+cHJvY2Vzc2luZyBsb2dpYyB0byBiYXNlIGl0IGFsbCBvbiB0aGUKKwkgIEdzdFRhc2sgc3RhdGUgdG8gYXZvaWQgZHVwbGljYXRpbmcgdGhlIGtub3dsZWRnZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzg4MzAKKworPT09IHJlbGVhc2UgMS4xMS45MCA9PT0KKworMjAxNy0wNC0wNyAxNjozMTo1NiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIG1lc29uLmJ1aWxkOgorCSAgUmVsZWFzZSAxLjExLjkwCisKKzIwMTctMDQtMDcgMTU6MTg6MTEgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2hyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTctMDQtMDcgMTU6MDY6MzAgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2VsLnBvOgorCSAgcG86IFVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxNy0wNC0wNiAxMjowMTowMCArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IHN0cmVhbWxpbmUgYW5kIGltcHJvdmUgQXVkaW9TcGVjaWZpY0NvbmZpZyBwYXJzaW5nCisJICBBdWRpb1NwZWNpZmlnQ29uZmlnIGlzIHVzZWQgaW4gYSB2YXJpZXR5IG9mIEFBQyBzdHJlYW1zIGJ1dCB3YXMKKwkgIGJlaW5nIHBhcnNlZCBkaWZmZXJlbnRseS4gSW5zdGVhZCwgbWFrZSBldmVyeW9uZSB1c2UgdGhlIHNhbWUgcGFyc2luZy4KKwkgICogUmVtb3ZlIHVudXNlZCAnYml0cycgZmllbGQgKGl0IHdhcyBhbHdheXMgc2V0IHRvIDAgaWYgcHJlc2VudCkKKwkgICogQWRkIHByb3BlciBHQUNvbmZpZyBwYXJzaW5nICh0byBrbm93IHRoZSAgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGZyYW1lCisJICBpZiBwcmVzZW50KS4KKwkgIEZpeGVzIHdyb25nIHJhdGUvY2hhbm5lbHMgY29uZmlndXJhdGlvbiBpbiBzdHJlYW1zIGNvbWluZyBmcm9tIHF0ZGVtdXgKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03ODA5NjYKKworMjAxNy0wNC0wNSAwOTo0NjozMSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogRml4IDMyYml0IG9ubHkgcHJpbnRmIGZvcm1hdAorCSAgVGhlIHByZXZpb3VzIHBhdGNoIHdhcyB1c2luZyAlbGx1IGZvciA2NGJpdHMgcHJpbnRmLCB3aGljaCBpcyAzMmJpdAorCSAgc3BlY2lmaWMuIFdlIGFsc28gdHJhY2UgdGhlIGxhdGVuY3kgaW4gdGltZSBodW1hbiByZWFkYWJsZSBmb3JtIG5vdy4KKworMjAxNi0wMy0xNiAxNjoyMjo0OCArMDEwMCAgUGhpbGlwcCBaYWJlbCA8cC56YWJlbEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogc2V0IHN0cmVhbXBhcm0gZm9yIG91dHB1dHMgdGhhdCBzdXBwb3J0IGl0CisJICBXaXRob3V0IGEgc3BlY2lmaWVkIGZyYW1lcmF0ZSBmcm9tIHRoZSBzaW5rLCB0aGUgZGVjb2RlciBmcmFtZSBpbnRlcnZhbAorCSAgc2hvdWxkIGJlIHNldCB1c2luZyB0aGUgZnJhbWVyYXRlIG9mIHRoZSBlbmNvZGVkIHZpZGVvIHN0cmVhbS4KKwkgIFRoZXJlZm9yZSwgdGhlIHY0bDJvYmplY3Qgc2hvdWxkIGJlIGFibGUgdG8gY2hhbmdlIHRoZSBmcmFtZXJhdGUgb24gdGhlCisJICBvdXRwdXQgaWYgdGhlIFY0TDIgZGV2aWNlIGFjY2VwdHMgaXQuCisJICBUaGlzIGlzIGFsc28gbmVjZXNzYXJ5IGZvciBtZW0ybWVtIGVuY29kZXJzIHNvIHRoYXQgdGhlaXIgYml0cmF0ZQorCSAgY2FsY3VsYXRpb24gY29kZSBtYXkgd29yayBjb3JyZWN0bHkgYW5kIHRoZXkgbWF5IHJlcG9ydCB0aGUgY29ycmVjdAorCSAgZnJhbWUgZHVyYXRpb24gb24gdGhlIGNhcHR1cmUgcXVldWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc5NDY2CisKKzIwMTYtMDMtMTYgMTY6MjQ6NTUgKzAxMDAgIFBoaWxpcHAgWmFiZWwgPHAuemFiZWxAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBvbmx5IHNldCBsYXRlbmN5IGlmIHRoZSBmcmFtZSBkdXJhdGlvbiBpcyB2YWxpZAorCSAgSWYgdGhlIGR1cmF0aW9uIG9mIHRoZSB2NGwyb2JqZWN0IGlzIEdTVF9DTE9DS19USU1FX05PTkUsIGJlY2F1c2UgdGhlCisJICBzaW5rIGRpZCBub3Qgc3BlY2lmeSBhIGZyYW1lcmF0ZSBpbiB0aGUgY2FwcyBhbmQgdGhlIGRyaXZlciBhY2NlcHRzIHRoZQorCSAgZnJhbWVyYXRlLCB0aGUgZGVjb2RlciBlbGVtZW50IHVzZXMgR1NUX0NMT0NLX1RJTUVfTk9ORSB0byBjYWxjdWxhdGUgYW5kCisJICBzZXQgdGhlIGVsZW1lbnQgbGF0ZW5jeS4KKwkgIFdoaWxlIHRoaXMgaXMgYSBidWcgb2YgdGhlIGNhcHR1cmUgZHJpdmVyLCB0aGUgZGVjb2RlciBlbGVtZW50IHNob3VsZAorCSAgbm90IHVzZSB0aGUgaW52YWxpZCBkdXJhdGlvbiB0byBjYWxjdWxhdGUgYSBsYXRlbmN5LCBidXQgcHJpbnQgYSB3YXJuaW5nCisJICBpbnN0ZWFkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3OTQ2NgorCisyMDE2LTExLTIzIDEyOjE3OjU1IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMnNpbms6IEJsb2NrIGluIHByZXJvbGxfd2FpdCBvbiB1bmxvY2sKKwkgIFRoZSBjb3JyZWN0IGJlaGF2aW91ciBvZiBhbnl0aGluZyBzdHVjayBpbiB0aGUgLT5yZW5kZXIoKSBmdW5jdGlvbgorCSAgYmV0d2VlbiAtPnVubG9jaygpIGFuZCAtPnVubG9ja19zdG9wKCkgaXMgdG8gY2FsbAorCSAgZ3N0X2Jhc2Vfc2lua193YWl0X3ByZXJvbGwoKSBhbmQgb25seSByZXR1cm4gYW4gZXJyb3IgaWYgdGhpcyByZXR1cm5zIGFuCisJICBlcnJvciwgb3RoZXJ3aXNlLCBpdCBtdXN0IGNvbnRpbnVlIHdoZXJlIGl0IGxlZnQgb2ZmIQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NDk0NQorCisyMDE3LTA0LTA1IDE1OjU1OjIwICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDlkZWMuYzoKKwkgIHZwOWRlYzogQWRkIHdhcm5pbmdzIGZvciB1bnN1cHBvcnRlZCBmcmFtZSBmb3JtYXRzCisJICBBdCBsZWFzdCBvdXRwdXQgYW4gZWxlbWVudCB3YXJuaW5nIG9uIHRoZSBidXMgd2hlbiB3ZQorCSAgZW5jb3VudGVyIGEgZnJhbWUgZm9ybWF0IEdTdHJlYW1lciBkb2Vzbid0IGN1cnJlbnRseSBzdXBwb3J0LgorCisyMDE3LTA0LTA0IDE3OjU1OjEzICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogSGFuZGxlIFBhcmFtZXRyaWMgU3RlcmVvIHdpdGggSEUtQUFDKHYyKQorCSAgQWNjb3JkaW5nIHRvIElTTy9JRUM6MTQ0OTYtMjoyMDA5ICwgaW4gdGhlIGNhc2Ugb2YgSEUtQUFDdjIgKGF1ZGlvT2JqZWNUeXBlCisJICAyOSkgcGFyYW1ldHJpYyBzdGVyZW8gaXMgdXNlZCAoYSBzaW5nbGUgbW9ubyB0cmFjayBpcyB1c2VkIGFuZCB0aGVuCisJICB0cmFuc2Zvcm1hdGlvbnMgYXJlIGFwcGxpZWQgdG8gaXQgdG8gcHJvdmlkZSBhIHN0ZXJlbyBvdXRwdXQpLgorCSAgV2UgdGhlcmVmb3JlIHJlcG9ydCB0d28gY2hhbm5lbHMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgb25lIHJlcG9ydGVkCisJICBpbiB0aGUgYXVkaW9DaGFubmVsQ29uZmlndXJhdGlvbi4KKwkgIEZpeGVzIHRoZSB2YXJpb3VzIGlzc3VlcyB3aGVyZSBhIGRlbXV4ZXIgd291bGQgcmVwb3J0IHR3byBjaGFubmVscywgYnV0CisJICB0aGVuIHRoZSBwYXJzZXIgd291bGQgc2F5IHRoZXJlJ3Mgb25seSBvbmUgY2hhbm5lbCwgYW5kIHRoZW4gdGhlIGRlY29kZXIKKwkgIHdvdWxkIG91dHB1dCB0d28gY2hhbm5lbHMuCisKKzIwMTctMDQtMDQgMTU6MjI6MjUgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBTaW1wbGlmeSBidWZmZXIgcmVmY291bnRpbmcgaW4gYWRkX2J1ZmZlcigpIGFuZCByZW1vdmUgdW5uZWVkZWQgTlVMTCBjaGVja3MKKworMjAxNy0wNC0wNCAxNTowODozMyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IFNlbGVjdCB0aGUgYmVzdCBwYWQgYmFzZWQgb24gdGhlIGNhY2hlZCBsYXN0X2J1ZiBpZiBhbnkKKwkgIGxhc3RfYnVmIGlzIHRoZSBvbmUgd2UncmUgZ29pbmcgdG8gd3JpdGUgbmV4dCwgbm90IGJ1Zi4gQXMgc3VjaCB3ZQorCSAgc2hvdWxkIGNoZWNrIHRpbWVzdGFtcHMgYWdhaW5zdCB0aGF0IG9uZSBpZiB0aGVyZSBpcyBvbmUgdG8gc2VsZWN0IHRoZQorCSAgZWFybGllc3QgcGFkLgorCSAgQWxzbyByZW1lbWJlciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBhZCBpbiB0aGUgdmVyeSBiZWdpbm5pbmcgd2hlbgorCSAgc3RvcmluZyB0aGUgZmlyc3QgbGFzdF9idWYuCisJICBUaGlzIGJvdGggc29sdmVzIHNvbWUgZWRnZSBjYXNlcyB3aGVyZSBub3QgdGhlIGNvcnJlY3QgbmV4dCBwYWQgd2FzCisJICBzZWxlY3RlZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0YXJnZXQgaW50ZXJsZWF2ZS4KKworMjAxNy0wNC0wNCAxNTowNzo0MCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IEVycm9yIG91dCBpbW1lZGlhdGVseSBpZiBhIHRpbWVjb2RlIGlzIHRvIGJlIHdyaXR0ZW4gYnV0IGRvd25zdHJlYW0gcmV0dXJuIG5vdC1PSworCisyMDE3LTA0LTAzIDExOjM0OjQ5ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFVwZGF0ZSB2YXJpYWJsZXMgYmVmb3JlIGVhcmx5IGV4aXQKKwkgIFRoaXMgaXMgYW4gdXBkYXRlIG9mIGQ3OGQ1ODk2MjcyZDc4ZGY0MWU2OTZmYWM5MjllN2RmYjNiYjNkZmEKKwkgIFdlIHN0aWxsIGV4aXQgYXMgZWFybHkgYXMgcG9zc2libGUgaW4gY2FzZSBvZiBub24tb2svbm9uLXVubGlua2VkIGNvbWJpbmVkCisJICBmbG93LCBidXQgd2UgZmlyc3QgbWFrZSBzdXJlIHRoYXQgd2UgdXBkYXRlIHRoZSBpbnRlcm5hbCBwb3NpdGlvbiB2YXJpYWJsZXMuCisJICBUaGlzIGVuc3VyZXMgdGhhdCBpZiB1cHN0cmVhbXMgImlnbm9yZXMiIHRoZSBmbG93IHJldHVybiAoYW5kIGNhcnJpZXMgb24gcHVzaGluZyksCisJICB3ZSBkb24ndCBlbmQgdXAgcHJvY2Vzc2luZyBkYXRhIHdpdGggY29tcGxldGVseSBib2d1cyB2YXJpYWJsZXMvcG9zaXRpb25zLgorCisyMDE3LTAzLTI0IDAwOjExOjEzICsxMzAwICBEb3VnbGFzIEJhZ25hbGwgPGRvdWdsYXNAaGFsby5nZW4ubno+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuaDoKKwkgIGludGVybGVhdmU6IGF2b2lkIHVzaW5nIHVuaW5pdGlhbGlzZWQgb3JkZXJpbmdfbWFwCisJICBJZiBzZWxmLT5jaGFubmVsX3Bvc2l0aW9ucyA9PSBOVUxMICh3aGljaCBzZWVtcyB1bmxpa2VseSksCisJICBzZWxmLT5kZWZhdWx0X2NoYW5uZWxzX29yZGVyaW5nX21hcCB3aWxsIGJlIHVzZWQgdW5pbnRpYWxpc2VkLgorCSAgV2UgYXZvaWQgdGhhdCBieSBrZWVwaW5nIHRyYWNrIG9mIHRoZSBjaGFubmVsX21hc2ssIHdoaWNoIGlzIHNldCB3aGVuCisJICB0aGUgb3JkZXJpbmcgbWFwIGlzIGluaXRpYWxpc2VkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc4MDMzMQorCisyMDE3LTAzLTIzIDIzOjU2OjMxICsxMzAwICBEb3VnbGFzIEJhZ25hbGwgPGRvdWdsYXNAaGFsby5nZW4ubno+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkgIGludGVybGVhdmU6IGRvbid0IG92ZXJmbG93IGNoYW5uZWwgbWFwIHdpdGggPjY0IGNoYW5uZWxzCisJICBXaGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gNjQgY2hhbm5lbHMsIHdlIGRvbid0IHdhbnQgdG8gZXhjZWVkIHRoZQorCSAgYm91bmRzIG9mIHRoZSBvcmRlcmluZ19tYXAgYnVmZmVyLCBhbmQgaW4gdGhlc2UgY2FzZXMgd2UgZG9uJ3Qgd2FudCB0bworCSAgcmVtcGEgYXQgYWxsLiBIZXJlIHdlIGF2b2lkIGRvaW5nIHRoYXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgwMzMxCisKKzIwMTctMDMtMjggMTQ6MjM6MTYgLTAzMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAb3NnLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9tZXNvbi5idWlsZDoKKwkgIG1lc29uOiBVc2UgZ2V0X3BrZ2NvbmZpZ192YXJpYWJsZSBpbnN0ZWFkIG9mIGNhbGxpbmcgcGtnLWNvbmZpZyBvdXJzZWxmCisJICBJdCBpcyBhdmFsYWlibGUgaW4gbWVzb24gMC4zNiB3aGljaCBpcyBub3cgYXJlIHJlcXVpcmVtZW50CisKKzIwMTctMDMtMjggMTQ6MjI6NDEgLTAzMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAb3NnLnNhbXN1bmcuY29tPgorCisJKiBwa2djb25maWcvZ3N0cmVhbWVyLXBsdWdpbnMtZ29vZC5wYy5pbjoKKwkqIHBrZ2NvbmZpZy9tZXNvbi5idWlsZDoKKwkgIHBrZ2NvbmZpZzogRG8gbm90IGV2ZXIgYnVpbGQgYW4gaW5zdGFsbGVkIC5wYyBmaWxlCisKKzIwMTctMDMtMjggMTE6MTU6NTMgLTAzMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAb3NnLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9tZXNvbi5idWlsZDoKKwkgIG1lc29uOiB0ZXN0OiBGaXggZW52aXJvbm1lbnQgb2JqZWN0IHVzYWdlCisKKzIwMTctMDMtMjggMTE6MTQ6NDcgLTAzMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAb3NnLnNhbXN1bmcuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkqIHBrZ2NvbmZpZy9nc3RyZWFtZXItcGx1Z2lucy1nb29kLnBjLmluOgorCSogcGtnY29uZmlnL21lc29uLmJ1aWxkOgorCSAgcGtnY29uZmlnOiBHZW5lcmF0ZSB0aGUgcGtnLWNvbmZpZyB3aXRoIG1lc29uIHRvbworCisyMDE3LTAzLTI3IDIxOjUyOjAwICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEluIGdhcCBtb2RlLCBjb25zaWRlciB0aGUgbWRhdCBvZmZzZXQgd2hlbiBjYWxjdWxhdGluZyB0aGUgcmVtYWluaW5nIG1kYXQgc2l6ZQorCSAgVGhlIG1kYXQgZ2VuZXJhbGx5IGRvZXMgbm90IHN0YXJ0IGF0IG9mZnNldCAwLCB3ZSBoYXZlIHRvIGluY2x1ZGUgdGhlCisJICBzaXplIG9mIHRoZSBtb29mIGFuZCB3aGF0ZXZlciBlbHNlIHdhcyBpbiBmcm9udCBvZiB0aGUgbWRhdC4KKworMjAxNy0wMy0yNyAxMTo0MzozMSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9hdG9tc3JlY292ZXJ5LmM6CisJICBhdG9tc3JlY292ZXJ5OiBFcnJvciBvdXQgd2hlbiBmc2VlaygpIGZhaWxzIGluc3RlYWQgb2Ygc2lsZW50bHkgaWdub3JpbmcKKwkgIENJRCAxNDAzMjYyCisKKzIwMTctMDMtMjMgMjI6MTM6MDUgKzAxMDAgIENhcmxvcyBSYWZhZWwgR2lhbmkgPGR2QHBzZXVkb3Rlcm1pbmFsLm9yZz4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogQWxzbyBhZGQgdmlkZW9tZXRhIGlmIHRoZXJlIGlzIHBhZGRpbmcgdG8gdGhlIHJpZ2h0IGFuZCBib3R0b20KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03ODA0NzgKKworMjAxNy0wMy0yMSAxMjo1NDoyNyArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IGZpeCBvdXRwdXQgc2VnbWVudCBhbmQgYnVmZmVyIERUUyB0byBjb3JyZXNwb25kIHRvIHRoZSBmbGF0dGVuZWQgUFRTCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgwMzQ3CisKKzIwMTctMDMtMjMgMTc6NTM6MTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBSZW1vdmUgc29tZSB1bnVzZWQgdmFyaWFibGVzCisKKzIwMTctMDMtMjMgMTU6MDE6MTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBSZW1vdmUgYSBjb3VwbGUgb2YgdW5uZWVkZWQgbGV2ZWxzIG9mIGluZGVudGF0aW9uCisKKzIwMTctMDMtMjIgMTg6MTg6NDAgKzAwMDAgIEVucmlxdWUgT2Nhw7FhIEdvbnrDoWxleiA8ZW9jYW5oYUBpZ2FsaWEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRpc3Rpbmd1aXNoIFRGRFQgd2l0aCB2YWx1ZSAwIGZyb20gbm8gVEZEVCBhdCBhbGwKKwkgIFRGRFRzIHdpdGggdGltZSAwIGFyZSBiZWluZyBpZ25vcmVkIHNpbmNlIGNvbW1pdCAxZmMzZDQyZi4gVGhleSdyZQorCSAgbWlzdGFrZW4gd2l0aCB0aGUgY2FzZSBvZiBub3QgaGF2aW5nIFRGRFQsIGJ1dCB0aG9zZSB0d28gY2FzZXMKKwkgIG11c3QgYmUgZGlzdGluZ3Vpc2hlZCBpbiBzb21lIHdheS4KKwkgIFRoaXMgcGF0Y2ggcGFzc2VzIGFuIGV4dHJhIGJvb2xlYW4gZmxhZyB3aGVuIHRoZSBURkRUIGlzIHByZXNlbnQuCisJICBUaGlzIGlzIG5vdyB0aGUgY29uZGl0aW9uIGJlaW5nIGV2YWx1YXRlZCwgaW5zdGVhZCBvZiBjaGVja2luZyBmb3IKKwkgIDAgdGltZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03ODA0MTAKKworMjAxNy0wMy0yMiAxOToxNTowOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IFJlc2V0IGN1cnJlbnQgY2h1bmsgYWZ0ZXIgd3JpdGluZyBvdXQgdGltZWNvZGUKKwkgIElmIHdlIGhhdmUgbXVsdGlwbGUgdHJhY2tzIHdpdGggdGltZWNvZGVzLCBvciBpdCdzIG5vdCB0aGUgZmlyc3QgdHJhY2sKKwkgIHRoYXQgaGFzIHRpbWVjb2Rlcywgb3Igbm90IHRoZSBmaXJzdCBidWZmZXIsIHdlIGFscmVhZHkgc3RhcnRlZCBhIGNodW5rCisJICBmb3IgbWVkaWEgZGF0YS4gV2Ugbm93IG5lZWQgdG8gImNsb3NlIiB0aGF0IGNodW5rIGJlY2F1c2Ugd2Ugd3JvdGUgZGF0YQorCSAgZm9yIHRoZSB0aW1lY29kZSB0cmFjayBhbmQgYSBuZXcgY2h1bmsgaGFzIHRvIGJlIHN0YXJ0ZWQgZm9yIHRoZQorCSAgb3JpZ2luYWwgdHJhY2sgdGhlIG5leHQgdGltZSBpdCBoYXMgZGF0YS4KKworMjAxNy0wMy0yMiAxODo1Mjo1MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5oOgorCSAgcXRtdXg6IERvIHRpbWVjb2RlIGhhbmRsaW5nIHBlciB0cmFjaywgbm90IHBlciBtdXhlciBpbnN0YW5jZQorCSAgVGhlcmUgY291bGQgYmUgbXVsdGlwbGUgdmlkZW8gdHJhY2tzIHdpdGggdGltZWNvZGVzLgorCisyMDE3LTAzLTIyIDAwOjM4OjUxICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIHF0ZGVtdXg6IG1hdHJvc2thZGVtdXg6IElnbm9yZSByZXBlYXRlZCBzZWVrIGV2ZW50cworCSAgU2ltaWxhciB0byB3aGF0IHdhcyBkb25lIGluIGFkYXB0aXZlZGVtdXgsIGlnbm9yZSBzZWVrCisJICBldmVudHMgd2UndmUgYWxyZWFkeSBoYW5kbGVkIC0gc3VjaCBhcyB3aGVuIHRoZXkgYXJlIHJlY2VpdmVkCisJICBvbiBldmVyeSBzcmNwYWQgb2YgZmlsZXMgd2l0aCBsb3RzIG9mIHN0cmVhbXMuCisKKzIwMTctMDMtMjEgMTQ6NTU6MzIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJICBkYXNoZGVtdXg6IFVwZGF0ZSBtZGF0bGVmdCBmcm9tIG92ZXJhbGwgbWRhdHNpemUgYW5kIG9mZnNldCB3aGVuIG9ic2VydmluZyBhIGdhcAorCSAgT3RoZXJ3aXNlIG1kYXRsZWZ0IHdpbGwgaGF2ZSBhIHZhbHVlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaW5pdGlhbAorCSAgbWRhdHNpemUgbWludXMgdGhlIHBhcnRzIG9mIHRoZSBzdHJlYW0gdGhhdCB3ZSBzYXcsIHdoaWNoIGlzIG5vdAorCSAgaW5jbHVkaW5nIGFsbCB0aGUgcGFydHMgb2YgdGhlIHN0cmVhbSB0aGF0IG1pZ2h0J3ZlIGJlZW4gc2tpcHBlZC4KKworMjAxNy0wMy0yMCAxNzowMzozMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIGRvY3M6IHVwZGF0ZSB0d28gcmVmZXJlbmNlcyB0byB0aGUgcmVtb3ZlZCAnbWFkJyBwbHVnaW4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzYxNDAKKworMjAxNy0wMy0yMCAxMjowMzoyOSArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cXVldWUuYzoKKwkgIHJ0cHJ0eHF1ZXVlOiBhZGQgYmFzaWMgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZSBwaXBlbGluZXMKKwkgIE1vc3RseSBleHBsYWluaW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gcnRwcnR4cXVldWUgYW5kIHJ0cHJ0eHNlbmQuCisKKzIwMTctMDMtMTcgMjA6NTg6MjggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvbWVzb24uYnVpbGQ6CisJICB2NGwyOiBGaXggbWVzb24gcGx1Z2luIHNoYXJlZCBvYmplY3QgbmFtZQorCSAgSXQgZGlkbid0IG1hdGNoIGJldHdlZW4gQXV0b01ha2UgYW5kIE1lc29uLCBhbmQgdGhlIE1lc29uIG5hbWUKKwkgIGRpZG4ndCBtYXRoIHRoZSBwbHVnaW4gbmFtZSAodmlkZW80bGludXgyKS4KKworMjAxNy0wMy0xNiAxODoyMDo1NCArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jOgorCSAgcnRwcnR4cmVjZWl2ZTogZml4IGV4YW1wbGUgcGlwZWxpbmVzIGFuZCBpbXByb3ZlIHRoZSBkb2N1bWVudGF0aW9uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcxMzgzCisKKzIwMTctMDMtMTcgMTQ6MTA6NDAgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuaDoKKwkgIGZsYWNwYXJzZTogZml4IHBsYXliYWNrIGlmIHNhbXBsZSBudW1iZXIgZG9lcyBub3Qgc3RhcnQgYXQgMAorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCAyOWI4MDc2ODVkM2M5NjJiYmU4YWZlMzUxYzVkY2E5N2Q1OWViNWUwLCB3aGlsZQorCSAgZml4aW5nIHRoZSBvcmlnaW5hbCBicmVha2luZyB0ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy4KKworMjAxNy0wMy0xNyAxMTozMDowNCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oOgorCSAgUmV2ZXJ0ICJmbGFjcGFyc2U6IGZpeCBwbGF5YmFjayBpZiBzYW1wbGUgbnVtYmVyIGRvZXMgbm90IHN0YXJ0IGF0IDAiCisJICBUaGlzIGJyZWFrcyBnc3QtdmFsaWRhdGUgb24gdGhlIGJ1aWxkIHNlcnZlciAodGhvdWdoIG5vdCBsb2NhbGx5KSwKKwkgIGFuZCBhIHVuaXQgdGVzdCwgYW5kIEkgY2FuJ3QgcnVuIHVuaXQgdGVzdHMgcmlnaHQgbm93IGZvciBzb21lCisJICB1bnJlbGF0ZWQgcmVhc29uLgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCAwNzQ3YjU2ZjhlN2Y0NzMxZDY3ZjhkMTNhNGJkYzQ1M2RkZTBmZGY3LgorCisyMDE3LTAzLTE2IDE3OjQ0OjQxICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBwcmludCB0aGUgY29ycmVjdCB2YXJpYWJsZSBpbiBkZWJ1ZyBzdGF0ZW1lbnQKKwkgIFRoaXMgZGVidWcgc3RhdGVtZW50IGlzIG1lYW50IHRvIHByaW50IHRoZSB0aW1lIHNpbmNlIHRoZSBsYXN0IChlYXJseSkKKwkgIFJUQ1AgdHJhbnNtaXNzaW9uLCBub3QgdGhlIGxhc3QgcmVndWxhciBSVENQIHRyYW5zbWlzc2lvbiAod2hpY2ggYWxzbworCSAgaGFwcGVucyB0byBiZSBzZXQgYSBmZXcgbGluZXMgYWJvdmUgdG8gY3VycmVudF90aW1lLCBzbyB0aGUgZGVidWcgb3V0cHV0CisJICBpcyBqdXN0IGNvbmZ1c2luZykKKworMjAxNy0wMy0xNiAxNzo0MjoyNyArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSAgcnRwcnR4c2VuZDogY29udmVydCBMT0cgbWVzc2FnZSB0byBUUkFDRQorCSAgVGhpcyBpcyBwcmludGVkIHRvbyBvZnRlbiAoZm9yIGV2ZXJ5IGNoYWluZWQgYnVmZmVyISkgYW5kIGp1c3QgY2x1dHRlcnMgdGhlIGxvZ3MuCisKKzIwMTctMDMtMTYgMTQ6NTg6NDUgKzAxMDAgIE1pZ3VlbCBQYXLDrXMgRMOtYXogPG1wYXJpc2RpYXpAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cHNvdXJjZTogZml4IHdhcm5pbmcgbWVzc2FnZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc4MDEwNQorCisyMDE3LTAzLTE2IDEzOjU0OjU0ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmg6CisJICBmbGFjcGFyc2U6IGZpeCBwbGF5YmFjayBpZiBzYW1wbGUgbnVtYmVyIGRvZXMgbm90IHN0YXJ0IGF0IDAKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzc3MzgKKworMjAxNy0wMy0xNSAxODo1ODo1NSArMDEwMCAgTWlndWVsIFBhcsOtcyBEw61heiA8bXBhcmlzZGlhekBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBydHBzb3VyY2U6IGdldCBjbG9jay1yYXRlIGZyb20gcHQgaWYgbmVlZGVkIHRvIGdlbmVyYXRlIFNSCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgwMTA1CisKKzIwMTctMDMtMTYgMTM6NTI6NDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogSW5jbHVkZSBHU3RyZWFtZXIgc291cGh0dHBzcmMgdmVyc2lvbiBpbiBkZWZhdWx0IFVzZXItQWdlbnQgc3RyaW5nCisKKzIwMTctMDMtMTYgMDA6NDE6NDQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXk6IGZpeCBjcmFzaCB3aXRoIGVtcHR5IHNwcm9wcy1wYXJhbWV0ZXJzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgwMDQwCisKKzIwMTctMDMtMTEgMjE6MjA6NDAgLTA4MDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzYW50b3NAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zcmVjb3ZlcnkuYzoKKwkqIGdzdC9pc29tcDQvYXRvbXNyZWNvdmVyeS5oOgorCSAgYXRvbXNyZWNvdmVyeTogYWxzbyBoYW5kbGUgZXh0cmEgYXRvbXMgYWZ0ZXIgJ21kaWEnIGluIGEgJ3RyYWsnCisJICBUYWtlIGludG8gYWNjb3VudCB0aGUgYXRvbXMgYXQgdGhlIGVuZCBvZiB0aGUgJ3RyYWsnIGF0b20gd2hlbgorCSAgcmVjb3ZlcmluZyBpdC4gU28gdGhhdCBpdHMgc2l6ZSAoYWxyZWFkeSBjb21wdXRlZCBhbmQgYWRkZWQgaW4gdGhlIHRyYWsKKwkgIHNpemUpIGlzbid0IG1ha2luZyBvZmZzZXRzIHdyb25nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MTQ3OAorCisyMDE3LTAzLTExIDEyOjU2OjMzIC0wODAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc2FudG9zQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGF2b2lkIGZhbGx0aHJvdWdoIHRvIG1vb3ZyZWNvdmVyeSBmYWlsdXJlIHNlY3Rpb24KKwkgIFJldHVybiBiZWZvcmUgdGhhdCB0byBwcmVzZXJ2ZSBvdXIgc3VjY2Vzc2Z1bGwgcmVzdWx0cywgb3RoZXJ3aXNlIG5vCisJICBtb292IHJlY292ZXJ5IGluZm9ybWF0aW9uIHdvdWxkIGJlIHdyaXR0ZW4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzE0NzgKKworMjAxNy0wMy0xMSAxMjoyNzoyOCAtMDgwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NhbnRvc0BnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXNyZWNvdmVyeS5jOgorCSAgYXRvbXNyZWNvdmVyeTogZXhwZWN0IG1vcmUgYXRvbSB0eXBlcyBhdCB0aGUgaGVhZGVycworCSAgU2tpcCBtb3JlIGF0b21zIGF0IHRoZSBoZWFkZXIgdW50aWwgaXQgZmluZHMgdGhlICdtZGF0JyB0byBjb250aW51ZSB0aGUKKwkgIG1vb3YgcmVjb3ZlcnkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzE0NzgKKworMjAxNy0wMy0xNCAxNjo0MjoyNSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogTWFrZWZpbGUuYW06CisJKiBjb25maWd1cmUuYWM6CisJKiB0ZXN0cy9leGFtcGxlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3B1bHNlLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9leGFtcGxlcy9wdWxzZS9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3B1bHNlL3B1bHNlLmM6CisJICBwdWxzZSBleGFtcGxlOiBSZW1vdmUKKwkgIFRoYXQgZXhhbXBsZSBvbmx5IHRlc3RlZCB0aGUgcHJvcGVydHkgcHJvYmUgaW50ZXJmYWNlLCB3aGljaCBoYXMgYmVlbiByZW1vdmVkLgorCSAgVGhlIHNhbWUga2luZCBvZiB0aGluZyBjYW4gbm93IGJlIGRvbmUgd2l0aCB0aGUgZ2VuZXJpYyBnc3QtZGV2aWNlLW1vbml0b3IgdG9vbC4KKworMjAxNy0wMy0xNCAxNjozODowMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgdjRsMjogUmVtb3ZlIHVudXNlZCBtYWNybworCisyMDE3LTAzLTE0IDE2OjM1OjI1IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyOiBSZW1vdmUgdW51c2VkIGRlZmluaXRpb25zCisKKzIwMTctMDMtMTQgMTA6MTA6MTkgKzAxMDAgIEVtZXJpYyBHcmFuZ2UgPGVncmFuZ2VAZ29wcm8uY29tPgorCisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuYzoKKwkgIHF0bXV4OiBhZGQgQ2luZUZvcm0gc3VwcG9ydAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc4MDAyNAorCisyMDE3LTAzLTE0IDE1OjA5OjQ0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogT25seSBjcmVhdGUgbmV3IGNodW5rcyBpZiB3ZSBoYXZlIG1vcmUgdGhhbiBhIHNpbmdsZSBzdHJlYW0KKwkgIFRoZXJlJ3Mgbm8gcG9pbnQgaW4gY3JlYXRpbmcgbXVsdGlwbGUgY2h1bmtzIG90aGVyd2lzZSwgaXQgb25seSB3YXN0ZXMKKwkgIHNvbWUgYnl0ZXMgZm9yIHN0b3JpbmcgdGhlIGNodW5rIG9mZnNldHMuCisKKzIwMTctMDMtMTQgMTA6MDk6NDYgKzAxMDAgIEVtZXJpYyBHcmFuZ2UgPGVncmFuZ2VAZ29wcm8uY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFkZCBTMTZMIHN1cHBvcnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03ODAwMjIKKworMjAxNy0wMy0xNCAxNTo0ODowOCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwbGl0bXV4LmM6CisJICBzcGxpdG11eCB0ZXN0OiBVc2UgcGFzc2VkIGZpcnN0L2xhc3QgdGltZXN0YW1wcworCSAgRG9uJ3QgaGFyZC1jb2RlIHRoZSBleHBlY3RlZCB0aW1lc3RhbXAgcmFuZ2UsIHVzZSB0aGUKKwkgIHZhbHVlcyB0aGUgY2FsbGVyIGlzIHBhc3NpbmcgaW4uCisKKzIwMTctMDMtMTIgMTE6NDI6MjUgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJICBBZGQgb2xkIHBsdWdpbiBuYW1lcyB0byBjcnVmdCBsaXN0CisJICBUaGlzIHdpbGwgaGVscCBmaXhpbmcgdW5pbnN0YWxsZWQgc2V0dXAuIEFsc28gZml4IG1pc3NpbmcgcGF0aAorCSAgY29ycmVjdGlvbiBpbiBvbmUgb2YgdGhlIHBsdWdpbiB4bWwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc5MzQ0CisKKzIwMTYtMTItMTUgMTI6Mzg6NDAgKzAxMDAgIE1pY2hhZWwgRHV0a2EgPG1haWxAbWljaGFlbC1kdXRrYS5kZT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXksIHJ0cGgyNjVkZXBheTogcmVtb3ZlIHN0cmF5IGdfZGVidWcoKQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3OTg1OAorCisyMDE3LTAzLTEwIDExOjI0OjE0ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGluaXQgZm91cmNjCisJICBJbml0aWFsaXplIHRoZSBmb3VyY2MgdG8gMCBzbyB0aGF0IHdlIGNhbiBkZXRlY3QgZmFpbHVyZSBsYXRlci4KKworMjAxNy0wMy0wOCAyMjo1MDo1MiAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2xpbWl0ZXIuYzoKKwkgIHRlc3RzOiBBZGQgbWlzc2luZyBMREFERCBmb3IgbGlibSBpbiB0ZXN0cyB1c2luZyBtYXRoLmgKKwkgIEFsc28sIHJlbW92ZSB0aGUgbWF0aC5oIGluY2x1ZGUgZm9yIHRoZSBvbmUgdGhhdCBqdXN0IHByZW50ZW5kIHRvIG5lZWQKKwkgIGl0LgorCisyMDE3LTAzLTA4IDIyOjE1OjQ2IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICBGaXggc2hvdXQyIHBsdWdpbiBkb2MgZ2VuZXJhdGlvbgorCSAgSW4gdGhlIHByZXZpb3VzIHBhdGNoLCB3ZSBhbHNvIHJlbmFtZWQgc2hvdXQyc2VuZCB0byBzaG91dDIsIHNvIGl0IGRvZXMKKwkgIG5vdCBjbGFzaCB3aXRoIGl0J3MgZmVhdHVyZS4gVGhvdWdoIHdlIGZvcmdvdCB0byByZW5hbWUgaXQgaW4gdGhlIGRvYworCSAgcmVmZXJlbmNlLiBUaGlzIHBhdGNoIGFsc28gYWRkIGEgY3J1ZnQgZGV0ZWN0aW9uIG9uIHRoZSB4bWwgdGhhdCBtYWRlIG1lCisJICBtaXNzIHRoaXMgZXJyb3IuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc5MzQ0CisKKzIwMTctMDMtMDQgMTA6NTI6NDcgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0Mi54bWw6CisJKiBleHQvcHVsc2UvTWFrZWZpbGUuYW06CisJKiBleHQvcHVsc2UvbWVzb24uYnVpbGQ6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3NvdXAvTWFrZWZpbGUuYW06CisJKiBleHQvc291cC9tZXNvbi5idWlsZDoKKwkqIHN5cy9vc3M0L01ha2VmaWxlLmFtOgorCSAgRml4IHBsdWdpbiBmaWxlbmFtZXMgdG8gbWF0Y2ggcGx1Z2luIG5hbWVzCisJICAtIGxpYmdzdHB1bHNlLnNvIGJlY29tZXMgbGliZ3N0cHVsc2VhdWRpby5zbworCSAgLSBsaWJnc3Rzb3VwaHR0cHNyYy5zbyBiZWNvbWVzIGxpYmdzdHNvdXAuc28KKwkgIC0gbGliZ3N0b3NzNGF1ZGlvLnNvIGJlY29tZXMgbGliZ3N0b3NzNC5zbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3OTM0NAorCisyMDE3LTAzLTA4IDE2OjAxOjAyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJICBxdG11eDogRnJlZSBFRFRTIGluc3RlYWQgb2YganVzdCBjbGVhcmluZyBpdCBhbmQgc2V0dGluZyBpdCB0byBOVUxMCisKKzIwMTctMDMtMDggMTU6Mjc6MzIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBGaXggc29tZSBtZW1vcnkgbGVha3MgcmVsYXRlZCB0byB0aW1lY29kZSB0cmFja3MKKworMjAxNy0wMy0wNCAwMDozNDo0NCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwbGl0bXV4LmM6CisJICBzcGxpdG11eDogQWRkIHVuaXQgdGVzdCBmb3IgcmV2ZXJzZSBwbGF5YmFjaworCSAgRW5zdXJlIHRoYXQgcmV2ZXJzZSBwbGF5YmFjayB3b3JrcyBhbmQgZ2VuZXJhdGVzIHRoZSByYW5nZQorCSAgb2YgdGltZXN0YW1wcyAoMC0zcykgd2UgZXhwZWN0LCBpbiBtb25vdG9uaWNhbGx5IGRlc2NlbmRpbmcgb3JkZXIuCisKKzIwMTctMDItMjggMTE6NTA6NDUgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c3JjLmM6CisJICBzcGxpdG11eHNyYzogRml4IHJldmVyc2UgcGxheWJhY2sKKwkgIEZpeCB0aGUgY2hlY2sgZm9yIHdoZXRoZXIgdGhlIHN0YXJ0IHRpbWUgb2YgdGhlIHNlZ21lbnQgaGFzCisJICBiZWVuIHJlYWNoZWQgd2hlbiBwbGF5aW5nIGluIHJldmVyc2UuIE90aGVyd2lzZSwgcGxheWJhY2sKKwkgIHN0b3BzIGFmdGVyIHJlYWNoaW5nIHRoZSBzdGFydCBvZiBhbnkgZmlsZSBwYXJ0LCBpbnN0ZWFkIG9mCisJICBjb250aW51aW5nIHVudGlsIGFsbCBwYXJ0cyB3aXRoaW4gdGhlIHNlZ21lbnQgaGF2ZSBwbGF5ZWQKKworMjAxNy0wMi0yMiAwMzowMTozMSArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRG9uJ3QgbG9zZSBjcnlwdG8gaW5mbyBvbiBhIG5ldyBtb29mCisJICBXZSBwYXJzZSB0aGUgbmV4dCBtb29mIGluIGFkdmFuY2Ugb2YgaGF2aW5nIHB1c2hlZAorCSAgYWxsIHNhbXBsZXMgZnJvbSB0aGUgcHJldmlvdXMgb25lIGluIHNvbWUgY2FzZXMsIGFuZAorCSAgd2UnbGwgc3RpbGwgbmVlZCB0aGUgY3J5cHRvIGluZm8gZnJvbSB0aGUgcHJldmlvdXMKKwkgIGZyYWdtZW50IHNvIGtlZXAgYXJvdW5kIGFueSB1bnVzZWQgY3J5cHRvIGluZm8gZW50cmllcworCSAgd2hlbiBhZGRpbmcgbmV3IG9uZXMKKworMjAxNy0wMi0yNyAxMzo1NTo1OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSogZ3N0L2lzb21wNC9hdG9tcy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IFVwZGF0ZSBtb2RpZmljYXRpb24gdGltZXMgd2hlbiBzZW5kaW5nIHRoZSBtb292CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc5NDIyCisKKzIwMTctMDMtMDEgMTY6MTE6NDcgLTA4MDAgIE1pY2hhZWwgU21pdGggPG1scnNtaXRoQGdtYWlsLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5oOgorCSAgc2JjcGFyc2U6IEZpeCB1cCB2YWx1ZXMgZm9yIGFsbG9jYXRpb24gZW51bWVyYXRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc5Mzg5CisKKzIwMTctMDItMjggMTM6MTA6NTAgKzAyMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHJlY2VpdmUuYzoKKwkgIHJ0cHJ0eHJlY2VpdmU6IGZpeCBwb3RlbnRpYWwgbGVhayBvZiBvbGQsIHVuYXNzb2NpYXRlZCwgYXNzb2NpYXRpb24gcmVxdWVzdHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjI1NjAKKworMjAxNy0wMi0yOCAxNTo0NzoyMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IERvbid0IGluY3JlbWVudCAtMSAvIHVuc2V0IGluZGljZXMKKwkgIENJRCAxMzk4NTQ1CisKKzIwMTctMDItMjggMTU6MjA6MzEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogUHJvdGVjdCBhZ2FpbnN0IE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSBmb3Igc3RyZWFtcyB3aXRob3V0IGNhcHMKKwkgIENJRCAxMzYzMzMyCisKKzIwMTctMDItMjggMTI6NTc6MDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgcnRwaDI2M3BheTogRnJlZSBtYWMgb24gZXJyb3JzCisJICBDSUQgMTIxMjE0OQorCisyMDE3LTAyLTI4IDEyOjQ1OjI0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSAgcnRwdm9yYmlzcGF5OiBBZGQgbWlzc2luZyBicmVhayB0byBmb3IgbG9vcAorCisyMDE3LTAyLTI4IDExOjAyOjU0ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIGNoZWNrOiBGaXggc3BsaXRtdXggdGVzdCBDRkxBR1MKKwkgIE5lZWRzIHRvIGtub3cgd2hlcmUgdGhlIGdzdGFwcCBoZWFkZXJzIGFyZQorCisyMDE3LTAyLTI3IDIxOjAyOjUxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBjb21waWxhdGlvbiB3aXRoIGdjYyA3CisJICBxdGRlbXV4LmM6IEluIGZ1bmN0aW9uIOKAmHF0ZGVtdXhfcGFyc2Vfc2FtcGxlc+KAmToKKwkgIHF0ZGVtdXguYzo4NDUwOjM5OiBlcnJvcjog4oCYKuKAmSBpbiBib29sZWFuIGNvbnRleHQsIHN1Z2dlc3Qg4oCYJibigJkgaW5zdGVhZCBbLVdlcnJvcj1pbnQtaW4tYm9vbC1jb250ZXh0XQorCSAgaWYgKHN0cmVhbS0+c2FtcGxlc19wZXJfZnJhbWUgKiBzdHJlYW0tPmJ5dGVzX3Blcl9mcmFtZSkgeworCSAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5efn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKzIwMTctMDItMjcgMjE6MDE6MjMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIG1wZWdhdWRpb3BhcnNlOiBGaXggY29tcGlsYXRpb24gd2l0aCBnY2MgNworCSAgZ3N0bXBlZ2F1ZGlvcGFyc2UuYzogSW4gZnVuY3Rpb24g4oCYZ3N0X21wZWdfYXVkaW9fcGFyc2VfcmVzZXTigJk6CisJICBnc3RtcGVnYXVkaW9wYXJzZS5jOjIwOTozOiBlcnJvcjog4oCYbWVtc2V04oCZIHVzZWQgd2l0aCBsZW5ndGggZXF1YWwgdG8gbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhvdXQgbXVsdGlwbGljYXRpb24gYnkgZWxlbWVudCBzaXplIFstV2Vycm9yPW1lbXNldC1lbHQtc2l6ZV0KKwkgIG1lbXNldCAobXAzcGFyc2UtPnhpbmdfc2Vla190YWJsZV9pbnZlcnNlLCAwLCAyNTYpOworCSAgXn5+fn5+CisJICBnc3RtcGVnYXVkaW9wYXJzZS5jOiBJbiBmdW5jdGlvbiDigJhnc3RfbXBlZ19hdWRpb19wYXJzZV9oYW5kbGVfZmlyc3RfZnJhbWXigJk6CisJICBnc3RtcGVnYXVkaW9wYXJzZS5jOjk1MTo3OiBlcnJvcjog4oCYbWVtc2V04oCZIHVzZWQgd2l0aCBsZW5ndGggZXF1YWwgdG8gbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhvdXQgbXVsdGlwbGljYXRpb24gYnkgZWxlbWVudCBzaXplIFstV2Vycm9yPW1lbXNldC1lbHQtc2l6ZV0KKwkgIG1lbXNldCAobXAzcGFyc2UtPnhpbmdfc2Vla190YWJsZV9pbnZlcnNlLCAwLCAyNTYpOworCSAgXn5+fn5+CisKKzIwMTctMDItMjcgMTk6MzE6MzkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJICBydHB2b3JiaXNwYXk6IFdoZW4gZ2V0dGluZyBuZXcgaGVhZGVycywgcmVwbGFjZSB0aGUgb2xkIHZlcnNpb24gb2YgdGhlbQorCSAgVGhpcyBwcmV2ZW50cyBzdG9yaW5nIGFuIGluZmluaXRlIGFtb3VudCBvZiBlLmcuIGNvbW1lbnQgaGVhZGVycyBpZiB0aGV5CisJICBjb21lIHdpdGhvdXQgYSBuZXcgaW5pdGlhbGl6YXRpb24gaGVhZGVyIGluIGZyb250IG9mIHRoZW0uIFRoZXJlIGNhbgorCSAgb25seSBiZSBvbmUgaGVhZGVyIG9mIGVhY2ggdHlwZS4KKworMjAxNy0wMi0yNyAxOToyNTozNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgcnRwLXBheWxvYWRpbmc6IEFkZCBuZXcgdGVzdCBmb3IgVm9yYmlzIHJlbmVnb3RpYXRpb24KKwkgIENoZWNrIGlmIGVuY29kaW5nLCBwYXlsb2FkaW5nLCBkZXBheWxvYWRpbmcgYW5kIGRlY29kaW5nIHdvcmtzIGlmIHRoZQorCSAgc3RyZWFtIGNvbmZpZ3VyYXRpb24gKGFuZCB0aHVzIHRoZSBoZWFkZXJzKSBjaGFuZ2UuCisKKzIwMTctMDItMjcgMTk6MjQ6MDcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJICB2b3JiaXNwYXk6IE9ubHkgcmVwbGFjZSBoZWFkZXJzIHdoZW4gcmVjZWl2aW5nIGEgbmV3IGNvbmZpZyBoZWFkZXIKKwkgIElmIHdlIGFsc28gcmVwbGFjZSBhbGwgaGVhZGVycyB3aGVuIHJlY2VpdmluZyBhbnkgcG9zc2libHkgZm9sbG93aW5nCisJICBjb21tZW50cyBoZWFkZXIsIHdlIHdvdWxkIHRocm93IGF3YXkgdGhlIGNvbmZpZyBoZWFkZXIgYmVmb3JlIGJlaW5nIGFibGUKKwkgIHRvIG1ha2UgdXNlIG9mIGl0LgorCisyMDE3LTAyLTIzIDEyOjExOjE1ICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwbGl0bXV4LmM6CisJICB0ZXN0czogc3BsaXRtdXg6IGFkZCB1bml0IHRlc3QgZm9yIGNvbnRlbnQgd2l0aCBzcGFyc2Ugc3RyZWFtcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MTA4NgorCisyMDE3LTAyLTIyIDExOjIzOjE5ICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4cGFydHJlYWRlci5jOgorCSAgc3BsaXRtdXhwYXJ0cmVhZGVyOiBpZ25vcmUgc3BhcnNlIHN0cmVhbXMgd2hlbiBjYWxjdWxhdGluZyB0aGUgZW5kIG9mZnNldCBvZiBhIHBhcnQKKwkgIEEgc3BhcnNlIHN0cmVhbSdzIGVuZGluZyB0aW1lc3RhbXAgY2FuIGJlIGNvbnNpZGVyYWJseSBzbWFsbGVyCisJICB0aGFuIHRoZSBlbmRpbmcgdGltZXN0YW1wcyBvZiB0aGUgb3RoZXIgc3RyZWFtcywgd2hpY2ggY2FuIGxlYWQKKwkgIHRvIHNraXBwaW5nIGNvbnNpZGVyYWJsZSB0aW1lIGZyb20gdGhlIG5leHQgcGFydC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjEwODYKKworMjAxNy0wMi0yMiAxMToyMTowNiArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuYzoKKwkgIHNwbGl0bXV4cGFydHJlYWRlcjogaWRlbnRpZnkgc3BhcnNlIHN0cmVhbXMKKworMjAxNy0wMi0yNSAyMTo0NzowMyAtMDMwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBwY21hcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBwY211cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkb3JpZW50LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkb3JpZW50Lmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJICBVcGRhdGUgRWRnYXJkIExpbWEncyBlbWFpbAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3OTIzMAorCisyMDE3LTAyLTA4IDEzOjM2OjAwICswMDAwICBBbmRyZXcgPG5pZmlnYXNlQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgcnRwaml0dGVyYnVmZmVyOiBEb24ndCBhbHdheXMgcmVzZXQgUFRTIHRvIDAgYWZ0ZXIgYSBnYXAKKwkgIEluIGZ1bmN0aW9uIHJ0cF9qaXR0ZXJfYnVmZmVyX2NhbGN1bGF0ZV9wdHM6IElmIGdhcCBpbiBpbmNvbWluZyBSVFAKKwkgIHRpbWVzdGFtcHMgaXMgbW9yZSB0aGFuICgzICogamJ1Zi0+Y2xvY2tfcmF0ZSkgd2UgY2FsbAorCSAgcnRwX2ppdHRlcl9idWZmZXJfcmVzZXRfc2tldyB3aGljaCByZXNldHMgcHRzIHRvIDAuIFNvIGNvbXBvbmVudHMgZG93bgorCSAgdGhlIHBpcGVsaW5lIChwbGF5ZXMsIG1peGVycykganVzdCBza2lwIGZyYW1lcy9zYW1wbGVzIHVudGlsIHB0cyBiZWNvbWVzCisJICBlcXVhbCB0byBwdHMgYmVmb3JlIGdhcC4KKwkgIEluIHZlcnNpb24gMS4xMC4yIGFuZCBiZWZvcmUgdGhpcyBjaGVja2luZyB3YXMgYnlwYXNzZWQgZm9yIHBhY2tldHMgd2l0aAorCSAgImVzdGltYXRlZCBkdHMiLCBhbmQgZ2FwcyB3ZXJlIGhhbmRsZWQgY29ycmVjdGx5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3ODM0MQorCisyMDE3LTAyLTI0IDE1OjU5OjQxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkgIG1lc29uOiBVcGRhdGUgdmVyc2lvbgorCisyMDE3LTAyLTI0IDE1OjM3OjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDEuMTEuMiA9PT0KKworMjAxNy0wMi0yNCAxNTowNzoyMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdnB4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJICBSZWxlYXNlIDEuMTEuMgorCisyMDE3LTAyLTI0IDEyOjUwOjIxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDE3LTAyLTI0IDEyOjQ0OjU4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9lbC5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTctMDItMTAgMjA6NTA6MTcgKzA5MDAgIFNldW5naGEgWWFuZyA8c2gueWFuZ0BsZ2UuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IEV4dHJhY3QgcmVkaXJlY3Rpb24gdXJpIG9uIGxpYnNvdXAncyByZXN0YXJ0ZWQgY2FsbGJhY2sKKwkgIExldCBsaWJzb3VwIGhhbmRsZSByZWRpcmVjdGlvbiBhdXRvbWF0aWNhbGx5LgorCSAgQW5kIHRoZW4sIHRvIGZpZ3VyZSBvdXQgcmVkaXJlY3Rpb24gdXJpLCBleHRyYWN0IGl0IG9uICJyZXN0YXJ0ZWQiCisJICBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGZpcmVkIGJlZm9yZSBzb3VwX3Nlc3Npb25fc2VuZCgpIGlzIHJldHVybmVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3ODQyOAorCisyMDE3LTAxLTAyIDE5OjI5OjA0IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IFVwZGF0ZSBpbWFnZSBzaXplIHdoZW4gZXh0cmFwb2xhdGluZworCSAgVXBkYXRlIHRoZSBpbWFnZSBzaXplIGFjY29yZGluZyB0aGUgYW1vdW50IG9mIGRhdGEgd2UgYXJlIGdvaW5nIHRvCisJICByZWFkL3dyaXRlLiBUaGlzIHdvcmthcm91bmQgYnVncyBpbiBkcml2ZXIgd2hlcmUgdGhlIHNpemVpbWFnZSBwcm92aWRlZAorCSAgYnkgVFJZL1NfRk1UIHJlcHJlc2VudCB0aGUgYnVmZmVyIGxlbmd0aCAobWF4aW11bSBzaXplKSByYXRoZXIgdGhlbiB0aGUgZXhwZWN0ZWQKKwkgIGJ5dGVzdXNlZCAoYnVmZmVyIHNpemUpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTU2NAorCisyMDE3LTAyLTE3IDE1OjUwOjMyIC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IGZpeCB0eXBvIGluIF9hY3F1aXJlX2Zvcm1hdCgpIGVycm9yIG1lc3NhZ2VzCisJICBGaXhlczoKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzg4MTUKKworMjAxNy0wMi0wNyAxNzoyNzo1NiArMDEwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgdGVzdHM6IG1hdHJvc2thbXV4LCBxdG11eDogZG9uJ3QgYWRkIGNvZGVjX2RhdGEgYnVmZmVycyB0byB0ZW1wbGF0ZSBjYXBzCisJICBzdHJlYW1oZWFkZXIgYW5kIGNvZGVjX2RhdGEgYnVmZmVycyBmaWVsZHMgYXJlIG9ubHkgbWVhbnQgdG8gYmUKKwkgIGluIHRoZSBuZWdvdGlhdGVkIGNhcHMsIG5vdCB0aGUgdGVtcGxhdGUgY2Fwcy4KKwkgIEZpeGVzIGZhbHNlLXBvc2l0aXZlIGxlYWtzIG9mIHRob3NlIGJ1ZmZlcnMgZGV0ZWN0ZWQgYnkgdGhlIGxlYWtzCisJICB0cmFjZXIsIGFzIHRlbXBsYXRlIGNhcHMgYXJlIHN0YXRpYywgYW5kIHdlIGRlY2lkZWQgdG8gbm90IGluY2x1ZGUKKwkgIGNvZGUgaW4gZ3N0cmVhbWVyIGNvcmUgdG8gaGFuZGxlIHRoaXMgdW51c3VhbCBjYXNlIG9mIHRlbXBsYXRlIGNhcHMKKwkgIGhhdmluZyBidWZmZXJzIGluIHRoZW0uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY4NzYyCisKKzIwMTctMDItMDkgMTI6NDY6NTQgKzAwMDAgIEpvY2hlbiBIZW5uZWJlcmcgPGpoQGhlbm5lYmVyZy1zeXN0ZW1kZXNpZ24uY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSAgcnRwdm9yYmlzcGF5OiBVcGRhdGUgYW5kIHNlbmQgb3V0IGhlYWRlcnMgd2hlbiBuZXcgaGVhZGVycyBhcmUgcmVjZWl2ZWQKKwkgIFRoZSBwYXlsb2FkZXIgbmVlZHMgdG8gcmVzZXQgYW5kIHVwZGF0ZSB0aGUgdm9yYmlzIGNvbmZpZyBkYXRhIHdoaWNoIGlzCisJICBwdXNoZWQgb24gdGhlIG5ldHdvcmsgaWYgaXQgcmVjZWl2ZXMgbmV3IGhlYWRlcnMsIG9yIGF0IGxlYXN0LCBpdCBtYXkKKwkgIGhhdmUgdG8gZG8gc28uCisJICBXaXRob3V0IHRoaXMsIHRoZSBzdHJlYW0gY29uZmlndXJhdGlvbiBjb3VsZCBjaGFuZ2Ugd2l0aG91dCB0aGUKKwkgIHBheWxvYWRlciBzZW5kaW5nIHRoZSBuZXcgY29uZmlndXJhdGlvbiB0byB0aGUgb3RoZXIgc2lkZS4KKworMjAxNy0wMi0xNSAxNDo0ODo1OCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmg6CisJICBzcGxpdG11eHNpbms6IENoYW5nZSBmaWxlcyBvbiBpbmNvbXBhdGlibGUgY2FwcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MTc2MQorCisyMDE3LTAyLTE1IDE2OjM1OjAxIC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBSZXNldCByZWFkeV9mb3Jfb3V0cHV0IG9uIHN0YXRlIGNoYW5nZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MTc2MQorCisyMDE3LTAyLTE1IDE1OjA5OjA2IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgc3BsaXRtdXhzaW5rOiBSZW1vdmUgdW51c2VkIG5leHRfbWF4X291dF9ydW5uaW5nX3RpbWUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjE3NjEKKworMjAxNy0wMi0xNSAxNTowNzozMiAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmg6CisJICBzcGxpdG11eHNpbms6IFJlbW92ZSB1bnVzZWQgbXV4ZWRfb3V0X3RpbWUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjE3NjEKKworMjAxNy0wMi0xNyAxMzowNzowNSArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgUmV2ZXJ0ICJxdGRlbXV4OiBBbHdheXMgc25hcCB0byB0aGUgc3RhcnQgb2YgdGhlIGtleWZyYW1lIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCAxMDc5MDJlYzUxNGJkODI2YWEyOWQyMjk4MTA3ZTJjMDkxZTFjNzc5LgorCSAgVGhpcyBjb21taXQgaW50ZW5kZWQgdG8gZW5zdXJlIHRoYXQga2V5ZnJhbWUgc2Vla3MgbGFuZCBhdCB0aGUKKwkgIHN0YXJ0IHRpbWVzdGFtcCBvZiBhIGtleWZyYW1lLCByYXRoZXIgdGhhbiBpbiB0aGUgbWlkZGxlIG9mIG9uZSwKKwkgIGJ1dCB0aGV5IGNhdXNlIHRyb3VibGUgb24gZmlsZXMgd2l0aCBzcGFyc2Ugc3RyZWFtcywgb3Igd2l0aAorCSAgSlBFRyAnY292ZXIgYXJ0JyB0cmFja3MgdGhhdCBoYXZlIG9ubHkgb25lIG9yIGEgZmV3IEpQRUcgc2FtcGxlcworCSAgd2l0aCB2ZXJ5IGxvbmcgZHVyYXRpb25zLgorCSAgVGhhdCdzIHN0aWxsIGRlc2lyYWJsZSBmb3IgZG9pbmcgc2VhbWxlc3MgY3V0dGluZyBvZiB2aWRlb3MsCisJICBidXQgbmVlZHMgYSByZXRoaW5rIGZvciBpbXBsZW1lbnRhdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzg2OTAKKworMjAxNy0wMi0xNyAwMToyMjoxMSArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmg6CisJICBhdWRpb2Z4L2VjaG86IGFkZGVkIHN1cnJvdW5kLWRlbGF5IGFuZCBzdXJyb3VuZC1tYXNrCisJICBBZGQgYSBuZXcgYm9vbGVhbiBzdXJyb3VuZC1kZWxheSBwcm9wZXJ0eSB0aGF0IG1ha2VzCisJICBhdWRpb2VjaG8ganVzdCBhcHBseSBhIGRlbGF5IHRvIGNlcnRhaW4gY2hhbm5lbHMgdG8gY3JlYXRlCisJICBhIHN1cnJvdW5kIGVmZmVjdCwgcmF0aGVyIHRoYW4gYW4gZWNobyBvbiBhbGwKKwkgIGNoYW5uZWxzLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHVwbWl4aW5nIGZyb20gc3RlcmVvIC0gZm9yIGV4YW1wbGUuCisJICBBZGQgYSBzdXJyb3VuZC1tYXNrIHByb3BlcnR5IHRvIGNvbnRyb2wgd2hpY2ggY2hhbm5lbHMKKwkgIGFyZSBjb25zaWRlcmVkIHN1cnJvdW5kIHNvdW5kIGNoYW5uZWxzIHdoZW4gYWRkaW5nIGEKKwkgIGRlbGF5IHdpdGggc3Vycm91bmQtZGVsYXkgPSB0cnVlCisJICBPcmlnaW5hbCBwYXRjaCBmcm9tIEpvY2hlbiBIZW5uZWJlcmcgPGpoQGhlbm5lYmVyZy1zeXN0ZW1kZXNpZ24uY29tPgorCisyMDE3LTAyLTE1IDAwOjEzOjMwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBVc2UgSVBfTVVMVElDQVNUX0FMTCBmb3IgZmlsdGVyaW5nIElQdjQgcGFja2V0cyBpZiBhdmFpbGFibGUKKwkgIFRoaXMgZ29lcyBhcm91bmQgdGhlIGluZWZmaWNpZW50IGNvbnRyb2wgbWVzc2FnZSBiYXNlZCBmaWx0ZXJpbmcgYW5kCisJICBkb2VzIGFsbCB0aGUgZmlsdGVyaW5nIGtlcm5lbC1zaWRlLiBVbmZvcnR1bmF0ZWx5IHRoaXMgaXMgTGludXgtb25seSBhbmQKKwkgIHRoZXJlIGlzIG5vIElQdjYgdmFyaWFudCBvZiBpdCAoeWV0KS4KKworMjAxNy0wMi0xNCAxOTo1MzozMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogTWFrZWZpbGUuYW06CisJICBtZXNvbjogZGlzdCBtZXNvbiBidWlsZCBmaWxlcworCSAgU2hpcCBtZXNvbiBidWlsZCBmaWxlcyBpbiB0YXJiYWxscywgc28gcGVvcGxlIHdobyB1c2UgdGFyYmFsbHMKKwkgIGluIHRoZWlyIGJ1aWxkcyBjYW4gc3RhcnQgcGxheWluZyB3aXRoIG1lc29uIGFscmVhZHkuCisKKzIwMTctMDItMTAgMTA6NTM6MDUgKzAxMDAgIFPDuHJlbiBKdXVsIDx6cG9uLmRrQGdtYWlsLmNvbT4KKworCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pY3lkZW11eC5jOgorCSAgaWN5ZGVtdXg6IHJlc2V0IHRhZ3Mgb24gZW1wdHkgdmFsdWUKKwkgIFNvbWUgcmFkaW8gc3RyZWFtcyB1c2VzIFN0cmVhbVRpdGxlPScnIHRvIHJlc2V0IHRoZSB0aXRsZSBhZnRlciBhCisJICB0cmFjayBzdG9wcGVkIHBsYXlpbmcsIGUuZy4gd2hpbGUgdGhlIGhvc3QgdGFsa3MgYmV0d2VlbiB0cmFja3Mgb3IKKwkgIGR1cmluZyBuZXdzIHNlZ21lbnRzLgorCSAgVGhpcyBjaGFuZ2UgZm9yY2VzIGFuIGVtcHR5IHRhZyBvYmplY3QgdG8gYmUgZGlzdHJpYnV0ZWQgaWYKKwkgIFN0cmVhbVRpdGxlIG9yIFN0cmVhbVVybCBpcyByZWNlaXZlZCB3aXRoIGVtcHR5IHZhbHVlLCB0aHVzIGFsbG93aW5nCisJICBkb3duc3RyZWFtIGVsZW1lbnRzIHRvIGdldCBub3RpZmllZCBhYm91dCB0aGlzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3ODQzNworCisyMDE3LTAyLTEzIDExOjE3OjI1ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBQcm9wZXJseSBub3RpZnkgbWlzc2luZyBlbGVtZW50cworCSAgSWYgdGhlIHNydHAgZWxlbWVudHMgYXJlIG5vdCBwcmVzZW50LCBwb3N0IGEgbWVzc2FnZSBvbiB0aGUgYnVzCisJICBpbmZvcm1pbmcgYWJvdXQgdGhlIG1pc3NpbmcgcGx1Z2lucy4KKworMjAxNy0wMi0xMCAxMDozMjo1NyAtMDMwMCAgSnVhbiBQYWJsbyBVZ2FydGUgPHVnYXJ0ZUBlbmRsZXNzbS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IG1hcmsgc2luZ2xldG9uIGNhcHMgYXMgIm1heSBiZSBsZWFrZWQiIG9iamVjdHMuCisJICBTZXQgTUFZX0JFX0xFQUtFRCBmbGFnIG9uIHN0YXRpYyBwYWRzIHJldHVybmVkIGJ5IGdzdF92NGwyX29iamVjdF9nZXRfKl9jYXBzKCkKKwkgIGZ1bmN0aW9ucy4gTWFkZSBmdW5jdGlvbnMgdGhyZWFkIHNhZmUgYnkgdXNpbmcgZ19vbmNlX2luaXRbZW50ZXJ8bGVhdmVdCisJICBmdW50aW9ucy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzg0NTMKKworMjAxNy0wMi0wOSAxNDoxODozMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogUmVtb3ZlIG5vdyB1bnVzZWQgZG9uZSBsYWJlbAorCisyMDE3LTAyLTA5IDEyOjU1OjMyICswMTAwICBOaWNrIEthbGxlbiA8bmlja2thbGxlbkBtZS5jb20+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IGRvIG5vdCBjYWNoZSBjYXBzCisJICBVcHN0cmVhbSBlbGVtZW50cyBsaWtlIHZpZGVvZmxpcCBjYW4gdHJhbnNmb3JtIGNhcHMsIHN1Y2ggYXMgY2hhbmdpbmcgd2lkdGggYW5kIGhlaWdodC4KKwkgIFdoZW4gYW4gaW1hZ2VmcmVlemUgZG93bnN0cmVhbSByZWNlaXZlcyBhbiBBQ0NFUFRfQ0FQUyBxdWVyeSBpdCB3aWxsIE5PVyByZXR1cm4KKwkgIGFsbCBjYXBzIHRoYXQgaXQgY2FuIGFjY2VwdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzgzODkKKworMjAxNy0wMi0wOSAxMToyOTo0MyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBBZGQgYSBjb21tZW50IGFib3V0IGhvdyBhdG9tX3RyYWtfc2V0X2Vsc3RfZW50cnkoKSB3b3JrcworCisyMDE0LTA4LTIyIDA5OjU1OjQzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5jOgorCSAgcXRkZW11eDogZGVtb3RlIHNvbWUgbG9nIG1lc3NhZ2VzIHRvIFRSQUNFIGxldmVsCisJICBEb24ndCBzcGFtIGRlYnVnIGxvZyB3aXRoIHVuaW50ZXJlc3Rpbmcgc3R1ZmYuCisKKzIwMTctMDItMDggMTc6MjQ6MjYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvYXRvbXMuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBDbGVhciBlZGl0IGxpc3RzIGV2ZXJ5IHRpbWUgd2UgcmVjYWxjdWxhdGUgdGhlbQorCSAgV2UgcmVjYWxjdWxhdGUgdGhlbSwgc28gYW55IG9sZCBpbmZvcm1hdGlvbiBoYXMgdG8gYmUgZm9yZ290dGVuLgorCSAgT3RoZXJ3aXNlIHdlIHdyaXRlIGludmFsaWQgZWRpdCBsaXN0cyB3aGVuIHdyaXRpbmcgaGVhZGVycyBtdWx0aXBsZQorCSAgdGltZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc4MzMwCisKKzIwMTctMDItMDcgMTM6MTA6MTggKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4cGFydHJlYWRlci5jOgorCSAgc3BsaXRtdXhzcmM6IEFsbG93IGZvciBidWZmZXJzIGJlZm9yZSB0aGUgc2VnbWVudCB3aGVuIG1lYXN1cmluZworCSAgVXNlZCBzaWduZWQgY2FsY3VsYXRpb25zIHdoZW4gbWVhc3VyaW5nIHRoZSBtYXhfdHMgb2YgYW4gaW5wdXQKKwkgIGZyYWdtZW50LCBzbyBhcyB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgZHVyYXRpb24gYW5kIG9mZnNldAorCSAgd2hlbiBidWZmZXJzIGhhdmUgdGltZXN0YW1wcyBwcmVjZWRpbmcgdGhlaXIgc2VnbWVudAorCisyMDE3LTAyLTAyIDEyOjU1OjI1ICswMTAwICBNaWd1ZWwgUGFyw61zIETDrWF6IDxtcGFyaXNkaWF6QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIHJ0cHNlc3Npb246IHJlbGF0ZSByZWNlaXZlZCBGSVJzIGFuZCBQTElzIHRvIHNvdXJjZQorCSAgVGhpcyBpcyBuZWVkZWQgaW4gb3JkZXIgdG86CisJICAtIEF2b2lkIGlnbm9yaW5nIHJlcXVlc3RzIGZvciBkaWZmZXJlbnQgbWVkaWEgc291cmNlcy4KKwkgIC0gQWRkIFNTUkMgZmllbGQgaW4gdGhlIEdzdEZvcmNlS2V5VW5pdCBldmVudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzgwMTMKKworMjAxNy0wMS0zMCAyMDoyMDowOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBzYW5pdHkgY2hlY2sgbnVtYmVyIG9mIHNlZ21lbnRzIGluIGVkaXQgbGlzdAorCSAgRml4ZXMgY3Jhc2ggd2l0aCBmdXp6ZWQgZmlsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzc5NDAKKworMjAxNy0wMS0wMiAyMjoxNjozOSArMDkwMCAgU2V1bmdoYSBZYW5nIDxzaC55YW5nQGxnZS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogU2tpcCBzZWVraW5nIHF1ZXJ5IGlmIHVwc3RyZWFtIGZvcm1hdCBpcyB0aW1lCisJICBEb24ndCBuZWVkIHRvIHF1ZXJ5aW5nIGJ5dGUtZm9ybWF0IHNlZWtpbmcgZm9yIHRpbWUtZm9ybWF0CisJICB1cHN0cmVhbSBjYXNlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc2NzE1CisKKzIwMTYtMTItMDEgMTI6NDc6MDggKzA5MDAgIFNldW5naGEgWWFuZyA8c2gueWFuZ0BsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFVzZSB1cHN0cmVhbSdzIFN0cmVhbUZsYWdzIGlmIHRoZXJlIGFyZQorCSAgV2hlbiBtdWx0aXBsZSBkZW11eGVyJ3MgYXJlIHVzZWQsIHVwc3RyZWFtIG1pZ2h0IHdhbnQgdG8gaW5kaWNhdGUKKwkgIGRlZmF1bHQgc3RyZWFtcyB1c2luZyBHU1RfU1RSRUFNX0ZMQUdfe1NFTEVDVCwgVU5TRUxFQ1R9CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NDQwCisKKzIwMTctMDEtMjcgMTY6MTQ6MTYgKzAyMDAgIFZpdmlhIE5pa29sYWlkb3UgPHZpdmlhQHRvb2xzb25haXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJICBxdG11eDogVGltZWNvZGUgdHJhY2sgZml4ZXMgZm9yIFNUU0QgZW50cnkKKwkgIFRoZSBuX2ZyYW1lcyBmaWVsZCAoZnJhbWVzIHBlciBzZWNvbmQpIHNob3VsZCBmb2xsb3cgdGhlIG5vbWluYWwgZnJhbWUKKwkgIHJhdGUgZm9yIGRyb3AtZnJhbWUgdGltZWNvZGVzLgorCSAgQWxzbywgdGhlIHRyYWsncyB0aW1lc2NhbGUgKGFuZCBkdXJhdGlvbiwgYWNjb3JkaW5nbHkpIHNob3VsZCBmb2xsb3cgdGhlCisJICBTVFNEIGVudHJ5J3MgdGltZXNjYWxlIGFuZCBmcmFtZSBkdXJhdGlvbiAoZnBzX24gYW5kIGZwc19kIGFjY29yZGluZ2x5KSwKKwkgIG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzc4MzIKKworMjAxNy0wMS0xOSAxMTowODoxMSArMDEwMCAgQXJuYXVkIFZyYWMgPGF2cmFjQGZyZWVib3guZnI+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogcmV0cnkgcmVxdWVzdCBvbiBlYXJseSB0ZXJtaW5hdGlvbiBmcm9tIHRoZSBzZXJ2ZXIKKwkgIEZpeCBhIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBieSBjb21taXQgMTgzNjk1YzYxYTU0ZjEgKHJlZmFjdG9yIHRvIHVzZQorCSAgU291cCdzIHN5bmMgQVBJKS4gVGhlIGNvZGUgcHJldmlvdXNseSBhdHRlbXB0ZWQgdG8gcmVjb25uZWN0IHdoZW4gdGhlCisJICBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIGVhcmx5LCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBzdHJlYW0gd2FzIHB1dAorCSAgaW4gcGF1c2UgZm9yIHNvbWUgdGltZS4KKwkgIFJlaW50cm9kdWNlIHRoaXMgZmVhdHVyZSBieSBjaGVja2luZyBpZiBFT1MgaXMgcmVjZWl2ZWQgYmVmb3JlIHRoZQorCSAgZXhwZWN0ZWQgY29udGVudCBzaXplIGlzIGRvd25sb2FkZWQuIEluIHRoaXMgY2FzZSwgZG8gdGhlIHJlcXVlc3QKKwkgIHN0YXJ0aW5nIGF0IHRoZSBwcmV2aW91cyByZWFkIHBvc2l0aW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NjcyMAorCisyMDE3LTAxLTEwIDA5OjQwOjU2IC0wNzAwICBNYXR0IFN0YXBsZXMgPHN0YXBsZXMyNTVAZ21haWwuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaW5kX3N0cmVhbV9ieV9jaGFubmVsIHNob3VsZCBpZ25vcmUgdW5jb25maWd1cmVkIHN0cmVhbXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzcxMDEKKworMjAxNy0wMS0yNSAxODo0MzowMCArMDAwMCAgQnJlbmRhbiBTaGFua3MgPGJyZW5kYW4uc2hhbmtzQHRlcmFkZWsuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogRml4IGRlYnVnIHR5cG8gYW5kIHJlbW92ZSBtaXNsZWFkaW5nIHdhcm5pbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzczNjIKKworMjAxNy0wMS0yNSAyMDo1NjoyNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLmM6CisJICBydHA6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgaW4gZXhhbXBsZQorCSAgY2xpZW50LVBDTUEuYzo4NDoyMjogd2FybmluZzogdW51c2VkIHZhcmlhYmxlICdpc3JjJyBbLVd1bnVzZWQtdmFyaWFibGVdCisJICBHT2JqZWN0ICpzZXNzaW9uLCAqaXNyYywgKm9zcmM7CisJICBeCisKKzIwMTctMDEtMDkgMTE6MzI6MzUgKzA1MzAgIFJhaHVsIEJlZGFya2FyIDxyYWh1bC5iZWRhcmthckBpbWd0ZWMuY29tPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBjaGVjayBmb3Igbm90IE5VTEwgYmVmb3JlIGNsZWFyaW5nIGFkYXB0ZXIKKwkgIEluIGNhc2Ugd2F2cGFyc2UgcmVjZWl2ZXMgYSBtYW51YWxseSBpbmplY3RlZCBGTFVTSF9TVE9QIGV2ZW50CisJICB3aGlsZSBvcGVyYXRpbmcgaW4gcHVsbCBtb2RlIHdlIGdldCBjcml0aWNhbHMgYmVjYXVzZSB3ZSdkIHRyeQorCSAgdG8gY2xlYXIgYSBOVUxMIGFkYXB0ZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3MTIzCisKKzIwMTctMDEtMjQgMTk6MjM6NDQgLTAzMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAb3NnLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9tZXNvbi5idWlsZDoKKwkgIG1lc29uOiBQcm9wZXJseSB1c2UgJzonIGZvciBkZWZpbmluZyBrZXl3b3JkcworCisyMDE3LTAxLTE3IDE2OjQxOjU4ICswMTAwICBKZWFuLUNocmlzdG9waGUgVHJvdGluIDxqZWFuLWNocmlzdG9waGUudHJvdGluQHN0LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogcmVmZXJlbmNlIG1lbW9yeSBiZWZvcmUgdGhlIGJ1ZmZlciBpcyBxdWV1ZWQKKwkgIEluIGdzdF92NGwyX2FsbG9jYXRvcl9xYnVmKCksIHRoZSBtZW1vcnkgaXMgcmVmZXJlbmNlZCBhZnRlciB0aGUKKwkgIGJ1ZmZlciBpcyBxdWV1ZWQuIE9uY2UgcXVldWVkIChWSURJT0NfUUJVRiksIHRoZSBidWZmZXIgbWlnaHQgYmUgaGFuZGxlZAorCSAgYnkgdGhlIFY0TDIgZHJpdmVyIChlLmcuIGRlY29kZWQpIGFuZCBkZXF1ZXVlZCAoZ3N0X3Y0bDJfYWxsb2NhdG9yX2RxYnVmKSwKKwkgIHRocm91Z2ggYSBkaWZmZXJlbnQgdGhyZWFkLCBiZWZvcmUgdGhlIG1lbW9yeSBpcyByZWZlcmVuY2VkIChnc3RfbWVtb3J5X3JlZikuCisJICBJbiB0aGlzIGNhc2UsIGluIGdzdF92NGwyX2FsbG9jYXRvcl9kcWJ1ZigpLCB0aGUgbWVtb3J5IGlzIHVucmVmZXJlbmNlZAorCSAgKGdzdF9tZW1vcnlfdW5yZWYpIGJlZm9yZSBoYXZpbmcgYmVlbiByZWZlcmVuY2VkOiB0aGUgbWVtb3J5IHJlZmNvdW50CisJICByZWFjaGVzIDAsIGFuZCB0aGUgbWVtb3J5IGlzIGZyZWVkLgorCSAgU28sIHRvIGF2b2lkIHRoaXMgY3Jvc3NpbmcgY2FzZSwgaW4gZ3N0X3Y0bDJfYWxsb2NhdG9yX3FidWYoKSwgdGhlCisJICBtZW1vcnkgc2hhbGwgYmUgcmVmZXJlbmNlZCBiZWZvcmUgdGhlIGJ1ZmZlciBpcyBxdWV1ZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3Mzk5CisKKzIwMTctMDEtMjQgMTc6NTk6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkgIHF0bXV4OiBPbmx5IHdyaXRlIDQgYnl0ZSB6ZXJvIHBhZGRpbmcgdG8gdGhlIFZpZGVvIFNhbXBsZSBEZXNjcmlwdGlvbiBpbiBNT1YKKwkgIEZvciBNUDQgdGhpcyBpcyBub3QgZGVmaW5lZCwgYW5kIGl0IGFjdHVhbGx5IGJyZWFrcyB0aGluZ3MgZm9yIE1TRSBpbgorCSAgQ2hyb21lIGlmIHdlIGRvIHRoaXMuIEZvciBNT1YgdGhpcyBpcyByZXF1aXJlZCBieSBzb21lIGJyb2tlbiBzb2Z0d2FyZQorCSAgYnV0IHRoZSBvZmZpY2lhbCBzcGVjaWZpY2F0aW9uIHNheXMgaXQncyBvcHRpb25hbDoKKwkgIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L2NvbnRlbnQvZG9jdW1lbnRhdGlvbi9RdWlja1RpbWUvUVRGRi9RVEZGQ2hhcDMvcXRmZjMuaHRtbAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NzU0MAorCisyMDE3LTAxLTAyIDEzOjQyOjA0ICswMTAwICBTYW50aWFnbyBDYXJvdC1OZW1lc2lvIDxzY2Fyb3RAdHdpbGlvLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwc3RhdHM6IEtlZXAgbnVtYmVyIG9mIG5hY2tzIHNlbnQvcmVjZWl2ZWQgcGVyIHNvdXJjZQorCSAgQ3VycmVudGx5LCB0aGUgbmFjayBwYWNrZXRzIHNlbnQgb3IgcmVjZWl2ZWQgYXJlIGtlcHQgYXQgc2Vzc2lvbiBsZXZlbCwKKwkgIHdoaWNoIG1ha2VzIGl0IGltcG9zc2libGUgdG8gZGlzdGluZ3Vpc2ggaG93IG1hbnkgb2YgdGhlc2UgcGFja2FnZXMgd2VyZQorCSAgc2VudC9yZWNlaXZlZCBwZXIgc3NyYyB3aGVuIHNldmVyYWwgc291cmNlcyBhcmUgaW4gdGhlIHNhbWUgc2Vzc2lvbi4gVGhpcworCSAgcGF0Y2ggaXMgYWxpZ25lZCB3aXRoIHRoZSBodHRwczovL3d3dy53My5vcmcvVFIvd2VicnRjLXN0YXRzLyNkb20tcnRjcnRwc3RyZWFtc3RhdHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzY3MTQKKworMjAxNi0xMi0wOCAxNTo1OTozMyArMDEwMCAgSm9uYXMgSG9sbWJlcmcgPGpvbmFzaGdAYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSAgcnRwaDI2NXBheTogRml4IGhhbmRsaW5nIG9mIGNvbmZpZy1pbnRlcnZhbAorCSAgSW5zZXJ0IFZQUy9TUFMvUFBTIGJlZm9yZSB0aGUgZmlyc3QgTkFMIHVuaXQgY29udGFpbmluZyBhbiBJLWZyYW1lIGluIGFuCisJICBhY2Nlc3MgdW5pdCBvbmx5LiBJZiBhbiBhY2Nlc3MgdW5pdCBjb25zaXN0cyBvZiBzZXZlcmFsIHN1Y2ggTkFMIHVuaXRzCisJICAodGlsZXMpIFZQUy9TUFMvUFBTIHNob3VsZCBvbmx5IGJlIGluc2VydGVkIGJlZm9yZSB0aGUgZmlyc3Qgb2YgdGhlbSBzbworCSAgdGhhdCBwYXJhbWV0ZXJzIGFyZSBvbmx5IHVwZGF0ZWQgYmV0d2VlbiBmcmFtZXMuCisJICBEbyBub3QgaW5zZXJ0IFZQUy9TUFMvUFBTIGJlZm9yZSBQLWZyYW1lcyB3aGVuIGNvbmZpZy1pbnRlcnZhbCBpcyAtMS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzU4MTcKKworMjAxNy0wMS0xOSAxMjoyOTo0NCArMDEwMCAgQXJuYXVkIFZyYWMgPGF2cmFjQGZyZWVib3guZnI+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogcmVwb3J0IGEgdXNlZnVsIGVycm9yIG1lc3NhZ2Ugd2hlbiBzb3VwX3Nlc3Npb25fc2VuZCBmYWlscworCSAgVGhpcyBoZWxwcyB0byB1bmRlcnN0YW5kIGNhc2VzIHdoZXJlIGxpYnNvdXAgZG9lc24ndCBzZXQgdGhlIG1lc3NhZ2UKKwkgIHN0YXR1cyBjb2RlIGFmdGVyIHJ1bm5pbmcgc291cF9zZXNzaW9uX3NlbmQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3MjIyCisKKzIwMTctMDEtMTkgMTE6MDU6MDAgKzAxMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IHByb3Blcmx5IGNoZWNrIHRoYXQgc2VlayByYW5nZSB3YXMgcmVzcGVjdGVkCisJICBUaGlzIGNoZWNrIG11c3QgYmUgZG9uZSBvbmx5IHdoZW4gd2UgYXJlIHN1cmUgdGhlIHJlcXVlc3Qgd2FzCisJICBzdWNjZXNzZnVsbHkgc2VudC4gc291cF9zZXNzaW9uX3NlbmQoKSBtaWdodCBmYWlsIHdpdGhvdXQgc2V0dGluZyB0aGUKKwkgIHN0YXR1cyBjb2RlLiBJbiB0aGlzIGNhc2Ugc3RhdHVzIGNvZGUgaXMgMCBzbyB3ZSB3b3VsZCBvbmx5IGNhdGNoIHRoZQorCSAgZXJyb3IgYWZ0ZXIgdGhlIHNlZWsgcmFuZ2UgY2hlY2suIEluIHRoaXMgY2FzZSB3ZSB3b3VsZCByZXBvcnQgYW4gZXJyb3IKKwkgIHNheWluZyB0aGF0IHRoZSBzZWVrIHJhbmdlIHdhcyBub3QgcmVzcGVjdGVkLCBpbnN0ZWFkIG9mIHJlcG9ydGluZyB0aGUKKwkgIHVuZGVybHlpbmcgZXJyb3IgdGhhdCB0cmlnZ2VyZWQgdGhlIHNvdXBfc2Vzc2lvbl9zZW5kKCkgZmFpbHVyZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL2F0dGFjaG1lbnQuY2dpP2J1Z2lkPTc3NzIyMgorCisyMDE3LTAxLTA5IDIxOjA0OjUxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zm92ZXJsYXkuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zm92ZXJsYXkuaDoKKwkgIGdka3BpeGJ1Zm92ZXJsYXk6IGFkZCBhIHBvc2l0aW9uaW5nIGNvZWZmaWNpZW50IHBhaXIKKwkgIC4uLiBzbyBhcyB0byBhbGxvdyBvbmUgY2xlYXJseSBkZWZpbmVkIChhYnNvbHV0ZSkgcG9zaXRpb25pbmcgbW9kZQorCSAgdGhhdCBjYW4gY2F0ZXIgZm9yIGEgdmFyaWV0eSBvZiBhYnNvbHV0ZSBidXQgYWxzbyByZWxhdGl2ZSBwb3NpdGlvbmluZworCSAgd2l0aCByZXNwZWN0IHRvIGVkZ2Ugb3IgY2VudGVyLgorCisyMDE3LTAxLTIxIDIwOjQ4OjIyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zm92ZXJsYXkuYzoKKwkgIGdka3BpeGJ1Zm92ZXJsYXk6IHVwZGF0ZSBjb21wb3NpdGlvbiBpbiBfYmVmb3JlX3RyYW5zZm9ybQorCSAgLi4uIHNpbmNlIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHBhc3N0aHJvdWdoIG1vZGUgZm9yIGJ1ZmZlciBwcmVwYXJhdGlvbiBiZWZvcmUKKwkgIGNhbGxpbmcgaW50byBfdHJhbnNmb3JtX2lwLgorCisyMDE3LTAxLTA3IDIwOjExOjEzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zm92ZXJsYXkuYzoKKwkgIGdka3BpeGJ1Zm92ZXJsYXk6IGhhbmRsZSBzZXR0aW5nIE5VTEwgZ2RrcGl4YnVmCisJICAuLi4gd2hpY2ggaXMgYSBjbGVhcmVyIHdheSB0byBjbGVhciBhbnkgY3VycmVudCBvdmVybGF5LCBvdGhlciB0aGFuCisJICBmaWRkbGluZyB3aXRoIGFscGhhIG9yIHBvc2l0aW9uaW5nIHByb3BlcnRpZXMgdG8gbWFrZSBpdCB2aXJ0dWFsbHkgZ28gYXdheS4KKworMjAxNy0wMS0yMCAxNzoxNjoxMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IFN0b3AgcmVhZGluZyBhIG5jZHQgc3ViLXRhZyBpZiBpdCBnb2VzIGJlaGluZCB0aGUgc3Vycm91bmRpbmcgdGFnCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3NTMyCisKKzIwMTctMDEtMjAgMDc6NTg6MjYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBGaXggdmFyaW91cyBvdXQgb2YgYm91bmRzIHJlYWRzIHdoZW4gcGFyc2luZyBuY2R0IHRhZ3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzc1MDAKKworMjAxNy0wMS0xOSAxMzo0Njo1OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBJbmNyZW1lbnQgY3VycmVudCBzdHRzIGluZGV4IHdoZW5ldmVyIHdlIGZpbmlzaGVkIG9uZSBzdHRzIGVudHJ5CisJICBPdGhlcndpc2Ugd2UgY291bGQgcmVhZCBtb3JlIGNodW5rcyB0aGFuIHRoZXJlIGFyZSBhdmFpbGFibGUsIGRvaW5nIGFuCisJICBvdXQgb2YgYm91bmRzIHJlYWQgYW5kIHBvdGVudGlhbGx5IGNyYXNoLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NzQ2OQorCisyMDE3LTAxLTE5IDEzOjI1OjUzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIFJldmVydCAicXRkZW11eDogSW5jcmVtZW50IGN1cnJlbnQgc3R0cyBpbmRleCBpbiBhbGwgY29kZSBwYXRocyBhZnRlciByZWFkaW5nIG9uZSBjaHVuayIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgOTlkNWQ3NTcwZDBiNTNkYWQzYmM4ZWI2NTNiMTMyMGVlNDIyYWFjZS4gSXQgYnJva2UKKwkgIHBsYXliYWNrIG9mIHZhcmlvdXMgdmFsaWQgZmlsZXMuCisKKzIwMTctMDEtMTkgMDc6NTI6MzMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogSW5jcmVtZW50IGN1cnJlbnQgc3R0cyBpbmRleCBpbiBhbGwgY29kZSBwYXRocyBhZnRlciByZWFkaW5nIG9uZSBjaHVuaworCSAgT3RoZXJ3aXNlIHdlIGNvdWxkIHJlYWQgbW9yZSBjaHVua3MgdGhhbiB0aGVyZSBhcmUgYXZhaWxhYmxlLCBkb2luZyBhbgorCSAgb3V0IG9mIGJvdW5kcyByZWFkIGFuZCBwb3RlbnRpYWxseSBjcmFzaC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzc0NjkKKworMjAxNy0wMS0xOSAwODozNzozNyArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBJbml0aWFsaXplIHJldHVybiB2YXJpYWJsZQorCSAgSW4gdGhlIG5vcm1hbCB1c2UtY2FzZSB3ZSB3b3VsZCBlbmQgdXAgd2l0aCByZXQgYmVpbmcgdW5pdGlhbGl6ZWQKKwkgIGNhdXNpbmcgaGF2b2MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3MjIyCisKKzIwMTctMDEtMTMgMTI6Mjc6NDAgKzAwMDAgIERhdmlkIFdhcm1hbiA8ZHdhcm1hbkBtYW5nbGViaXQub3JnPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGF2b2lkIFhNUCB0YWcgcGFyc2luZyBmYXRhbCBlcnJvci4KKwkgIHF0ZGVtdXhfaGFuZGxlX3htcF90YWdsaXN0KCkgcmVxdWlyZXMgYSB3cml0YWJsZSB0YWdsaXN0LAorCSAgYnV0IHF0ZGVtdXgtPnRhZ19saXN0IGNhbiBiZWNvbWUgbm9uLXdyaXRhYmxlLCBzcGVjaWZpY2FsbHkKKwkgIGFmdGVyIHNlbmRpbmcgZ2xvYmFsIHRhZ3MgKHF0ZGVtdXguYzo5NTgpLCB3aGljaCBhZGRzIGEKKwkgIHNlY29uZCByZWZlcmVuY2UuICBFbnN1cmUgdGhlIGxpc3QgaXMgbWFkZSB3cml0YWJsZSBiZWZvcmUKKwkgIGNhbGxpbmcgKG1ha2Vfd3JpdGFibGUgd2lsbCBjb3B5IHRoZSBsaXN0IGlmIG5lY2Vzc2FyeSkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY2MTc3CisKKzIwMTYtMDUtMzEgMTM6MTc6NDUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzYW50b3NAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJld29yayB0YWdsaXN0IGhhbmRsaW5nCisJICBLZWVwIHRhZ2xpc3QgYXJvdW5kIGR1cmluZyBlbGVtZW50IGV4aXN0YW5jZSB0byBhdm9pZCBoYXZpbmcgdG8KKwkgIGNyZWF0ZSBpdCBhdCBkaWZmZXJlbnQgcGxhY2VzIGJlZm9yZSB1c2FnZS4gTWFrZXMgY29kZSBzaW1wbGVyIHRvIGhhbmRsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjYxNzcKKworMjAxNy0wMS0xNiAxMTo1ODowMiArMDEwMCAgQXJuYXVkIFZyYWMgPGF2cmFjQGZyZWVib3guZnI+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IG1ha2UgZmxvdyByZXR1cm4gdmFsdWVzIGhhbmRsaW5nIGNsZWFyZXIKKwkgIFRoZSBmbG93IHJldHVybiB2YWx1ZXMgd2FzIHN0b3JlZCBpbiB0aGUgZWxlbWVudCBiZWZvcmUgYmVjYXVzZSB0aGUKKwkgIHJlc3VsdCBoYWQgdG8gYmUgc2V0IGZyb20gY2FsbGJhY2tzLiBUaGlzIGlzIG5vdCB0aGUgY2FzZSBhbnltb3JlLCB3ZQorCSAgY2FuIHJldHVybiB0aGUgZmxvdyByZXN1bHQgZGlyZWN0bHkgZnJvbSBmdW5jdGlvbnMsIG1ha2luZyB0aGUgY29kZQorCSAgZWFzaWVyIHRvIHVuZGVyc3RhbmQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3MjIyCisKKzIwMTctMDEtMTMgMTY6NDA6NDMgKzAxMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IHByb3Blcmx5IHRyYWNrIHJlZGlyZWN0aW9ucworCSAgVGhlIGN1cnJlbnQgY29kZSBjb25maWd1cmVzIGxpYnNvdXAgdG8gaGFuZGxlIHJlZGlyZWN0aW9ucworCSAgdHJhbnNwYXJlbnRseSwgd2l0aG91dCBpbmZvcm1pbmcgdGhlIGNhbGxlciwgdGh1cyBwcmV2ZW50aW5nIHRoZSBlbGVtZW50CisJICB0byByZWNvcmQgdGhlIHJlZGlyZWN0IGNvZGUgYW5kIGxvY2F0aW9uIHVyaS4KKwkgIEZpeCB0aGlzIGJ5IGFsd2F5cyBzZXR0aW5nIHRoZSBTT1VQX01FU1NBR0VfTk9fUkVESVJFQ1QsIHByZXZlbnRpbmcKKwkgIGxpYnNvdXAgZnJvbSBoYW5kbGluZyB0aGUgcmVkaXJlY3Rpb24uIFdoZW4gd2UgcmVjZWl2ZSBhIHJlZGlyZWN0aW9uCisJICByZXF1ZXN0IGFuZCBsaWJzb3VwIGNhbiBzYWZlbHkgaGFuZGxlIGl0LCByZXR1cm4gYSBjdXN0b20gZXJyb3Igd2hpY2gKKwkgIHRyaWdnZXJzIGEgcmV0cnkgd2l0aCB0aGUgbmV3IFVSSS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzcyMjIKKworMjAxNy0wMS0xNyAxMDo1MzozOSArMDEwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5jOgorCSAgcXRtdXg6IGFkZCA0NDQ0IGFuZCA0NDQ0eHEgdmFyaWFudHMgdG8gdmlkZW8veC1wcm9yZXMgcGFkIHRlbXBsYXRlIGNhcHMKKwkgIFRoZXkgYXJlIGhhbmRsZWQgc2luY2UgY29tbWl0IDdiNTY1NDc1YmY1NTFjNTNiOGVlZDQ2ZjcwODZmM2IzNzJmMWY2YzQKKwkgIChxdDogQWRkIHN1cHBvcnQgZm9yIFByb1JlcyA0NDQ0IFhRKS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzczNzcKKworMjAxNy0wMS0xNyAxMDo0ODo1NyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkgIG1hdHJvc2thOiBRdWlldCBhIFdBUk4gd2hlbiBwYXJzaW5nIHB1c2ggbW9kZQorCSAgVGhpcyB3YXJuaW5nIHdhcyBub2lzeSB3aGVuIHJldHVybmluZyBFT1MsIHdoaWNoIGlzCisJICBqdXN0IHVzZWQgdG8gaW5kaWNhdGUgbW9yZSBkYXRhIGlzIG5lZWRlZCBmcm9tIHVwc3RyZWFtLgorCisyMDE3LTAxLTE2IDE0OjUwOjIyICswMTAwICBHZW9yZyBMaXBwaXRzY2ggPGdsaXBwaXRzY2hAdG9vbHNvbmFpci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBEb24ndCB3cml0ZSBTeW5jIFNhbXBsZSBBdG9tIGZvciBQcm9SZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzczMzEKKworMjAxNS0wMS0yOCAwODo1ODoyNiArMDEwMCAgRW5yaWNvIEpvcm5zIDxlam9AcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJICB2NGwyOiBSZW1vdmUgdXNhZ2UgYW5kIGRlZmluaXRpb24gb2YgTE9HX0NBUFMgbWFjcm8KKwkgIFVubGlrZSBmb3JtZXIgZGVmaW5pdGlvbnMgb2YgTE9HX0NBUFMsIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHNpbXBseQorCSAgZXhwYW5kcyB0byBHU1RfREVCVUdfT0JKRUNULiBUaGUgTE9HX0NBUFMgbWFjcm8gaXMgcmFyZWx5IHVzZWQgYW5kIG1vc3QKKwkgIHVzZXMgZHVwbGljYXRlIGFscmVhZHkgZXhpc3RpbmcgR1NUX0RFQlVHX09CSkVDVCBsaW5lcy4gVGhlcmVmb3JlLCB0aGUKKwkgIGNhcHMgYXJlIG9mdGVuIHByaW50ZWQgdHdpY2Ugd2hpY2ggdW5uZWNlc3NhcmlseSBjbHV0dGVycyB0aGUgZGVidWcgbG9nLgorCSAgUmVwbGFjZSBMT0dfQ0FQUyBjYWxscyB3aXRoIEdTVF9ERUJVR19PQkpFQ1QsIHJlbW92ZSBMT0dfQ0FQUyBjYWxscywgYW5kCisJICBkZWxldGUgdGhlIGRlZmluaXRpb24gb2YgTE9HX0NBUFMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc2ODk5CisKKzIwMTctMDEtMTYgMTU6NDA6NDMgKzAxMDAgIEplYW4tQ2hyaXN0b3BoZSBUcm90aW4gPGplYW4tY2hyaXN0b3BoZS50cm90aW5Ac3QuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IHJlbW92ZSBkdXBsaWNhdGVkIGxpbmUgb2YgY29kZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NzMzMAorCisyMDE3LTAxLTE2IDE1OjE3OjE1ICswMTAwICBKZWFuLUNocmlzdG9waGUgVHJvdGluIDxqZWFuLWNocmlzdG9waGUudHJvdGluQHN0LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogZml4IG1lbW9yeSB0eXBlIGluIGFsbG9jYXRvciBwcm9iZQorCSAgVGhlIGJ1ZmZlciBtZW1vcnkgdHlwZSBwcm92aWRlZCB0byB0aGUgVklESU9DX0NSRUFURV9CVUZTIGlvY3RsIHNoYWxsCisJICBiZSBzZXQgd2l0aCB0aGUgdmFsdWUgKCJtZW1vcnkiKSBnaXZlbiBhcyBpbnB1dCBwYXJhbWV0ZXIgb2YgdGhlCisJICBnc3RfdjRsMl9hbGxvY2F0b3JfcHJvYmUoKSBmdW5jdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzczMjcKKworMjAxNy0wMS0xNCAxNToyNzoxOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogZml4IG90aGVyIGljb24gY291bnRlciBjaGVjaworCSAgSXQncyBuZXZlciBnb2luZyB0byBiZSAwIGlmIHdlIGZpcnN0IGluY3JlbWVudCBhbmQgdGhlbiBjaGVjay4KKworMjAxNy0wMS0xNCAxNToxNjo1MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBib2xkbHkgYXNzdW1lIHRoYXQgZmlyc3QgJ2NvdnInIGltYWdlIGlzIHRoZSBmcm9udCBjb3ZlcgorCisyMDE3LTAxLTE0IDE1OjA5OjA3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGV4dHJhY3QgY292ZXIgYXJ0IGltYWdlcyBpbnRvIEdTVF9UQUdfSU1BR0Ugbm90IFBSRVZJRVdfSU1BR0UKKwkgIFRoZXNlIGFyZSB1c3VhbGx5IG11Y2ggYmlnZ2VyIHRoYW4gaWNvbiBzaXplIGFuZCByZXF1aXJlZCBieQorCSAgaVR1bmVzIHRvIGJlIGNlcnRhaW4gZmFpcmx5IGxhcmdlIHNpemVzLiBJbiBxdG11eCBpdCBpcyBhbHNvCisJICB0aGUgSU1BR0UgdGFncyB3aGljaCB3ZSB3cml0ZSBvdXQgYXMgJ2NvdnInIGF0b21zLgorCisyMDE3LTAxLTE0IDE1OjA1OjM2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBhbHNvIHNldCBQSUNUVVJFIHRhZyB3aWR0aCBhbmQgaGVpZ2h0IGlmIGF2YWlsYWJsZQorCisyMDE3LTAxLTE0IDE0OjU4OjUyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBmaXggZW5jb2RlciBpbml0IGVycm9yIHdpdGggc29tZSBHU1RfVEFHX1BSRVZJRVdfSU1BR0VzCisJICBUaGUgZW5jb2RlciBmYWlscyB0byBpbml0aWFsaXNlIHdoZW4gd2UgdHJ5IHRvIHNldCBHU1RfVEFHX1BSRVZJRVdfSU1BR0VzCisJICBzZW50IHRvIHVzZSBieSBxdGRlbXV4IGZyb20gaVR1bmVzLWdlbmVyYXRlZCBtNGEgZmlsZXMuIFdlIHNob3VsZAorCSAgbm90IGp1c3QgYmxpbmRseSB0cmFuc2xhdGUgdGhlIFBSRVZJRVcgdGFnIHRvIGZpbGUgaWNvbiBpbWFnZSB0eXBlcywKKwkgIGJ1dCBjaGVjayBpZiB0aGUgc3BlY2lmaWMgY29uZGl0aW9ucyByZXF1aXJlZCBhcmUgbWV0IChpLmUuIGltYWdlCisJICB0eXBlIDEgbXVzdCBiZSBhIDMyeDMyIFBORyBpY29uLCBhbmQgd2hhdCB3ZSdyZSBnZXR0aW5nIGlzIDUwMHg1MDApLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3Njk2MgorCisyMDE3LTAxLTEzIDEyOjM5OjAwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkgIG1lc29uOiBidW1wIHZlcnNpb24KKworMjAxNi0xMi0yMiAxNzo0MDo0MCArMDIwMCAgVml2aWEgTmlrb2xhaWRvdSA8dml2aWFAdG9vbHNvbmFpci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgc3BsaXRtdXhzaW5rOiBBZGQgb3B0aW9uIGZvciB0aW1lY29kZS1iYXNlZCBzcGxpdAorCSAgSWYgdGhpcyBvcHRpb24gaXMgZ2l2ZW4sIGl0IHdpbGwgY2FsY3VsYXRlIHRoZSBuZXh0IHNwbGl0IHBvaW50IGJhc2VkIG9uCisJICB0aW1lY29kZSBkaWZmZXJlbmNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NDIwOQorCisyMDE3LTAxLTEzIDAwOjAxOjA2ICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IERvbid0IHJlc2V0IHJlcXVlc3QgcGFkIG51bWJlcmluZyBhY3Jvc3MgdXNlcworCSAgV2hlbiByZXNldCwgZG9uJ3QgcmVzdGFydCByZXF1ZXN0IHBhZCBudW1iZXJpbmdzLCBhcworCSAgcmVxdWVzdCBwYWRzIGNhbiBzdXJ2aXZlIGFjcm9zcyBzdGF0ZSBjaGFuZ2VzLiBPbmx5CisJICByZXN0YXJ0IGF0IDAgaWYgYWxsIHJlcXVlc3QgcGFkcyBhcmUgaGFuZGVkIGJhY2sgZmlyc3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3MTc0CisKKzIwMTctMDEtMTEgMTg6NTI6MjggKzAxMDAgIE1hdGhpZXUgRHVwb25jaGVsbGUgPG1hdGhpZXUuZHVwb25jaGVsbGVAb3BlbmNyZWVkLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cXVldWUuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHF1ZXVlLmg6CisJICBydHhxdWV1ZTogRXhwb3NlIGJhc2ljIHN0YXRpc3RpY3MgYXMgcHJvcGVydGllcy4KKwkgIFN0YXRpc3RpY3MgYWJvdXQgdGhlIHRvdGFsIG51bWJlciBvZiByZXRyYW5zbWlzc2lvbiByZXF1ZXN0cworCSAgYW5kIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHJldHJhbnNtaXR0ZWQgcGFja2V0cyBjYW4gYmUgaGVscGZ1bAorCSAgYXQgYXBwbGljYXRpb24tbGV2ZWwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3MTgyCisKKzIwMTctMDEtMTIgMTc6NDU6MzUgKzAxMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQHBhcnJvdC5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBzaW1wbGlmeSB2aWRlby94LWgyNjQgY2FwcyBoYW5kbGluZworCSAgJ3N0cmVhbS1mb3JtYXQnIGFuZCAnYWxpZ25tZW50JyBhcmUgZGVmaW5lZCBpbiBwYWQgdGVtcGxhdGUgY2FwcyBzbworCSAgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayB0aGVtIGFnYWluIGhlcmUuIEFsc28gcmVtb3ZlIGJpdHJhdGUgcGFyc2luZyBmcm9tCisJICBjYXBzIGFzIGJpdHJhdGUgaW4gY2FwcyBkb2Vzbid0IG1ha2Ugc2Vuc2UgYnV0IGZyb20gdGFncywgd2hpY2ggaXMKKwkgIGFjdHVhbGx5IHRoZSBjYXNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NzE4MQorCisyMDE2LTEyLTA4IDE3OjAyOjIyICswMTAwICBBdXLDqWxpZW4gWmFuZWxsaSA8YXVyZWxpZW4uemFuZWxsaUBwYXJyb3QuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogYWRkIGJhc2ljIEhFVkMvSC4yNjUgbXV4aW5nIHN1cHBvcnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzY3NTIKKworMjAxNy0wMS0xMSAxODoyOTowNSArMDEwMCAgR2VvcmcgTGlwcGl0c2NoIDxnbGlwcGl0c2NoQHRvb2xzb25haXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogQ2FsY3VsYXRlIGNsZWFuIGFwZXJ0dXJlIHNpemUKKwkgIENhbGN1bGF0ZSBjbGVhbiBhcGVydHVyZSBkaW1lbnNpb25zIGJ5IGZpcnN0IGd1ZXNzaW5nCisJICBkaXNwbGF5IGFzcGVjdCByYXRpbyBiYXNlZCBvbiBwaXhlbCBhc3BlY3QgcmF0aW8gYW5kCisJICBmcmFtZSBzaXplLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NzEwMAorCisyMDE3LTAxLTEwIDE4OjE5OjU1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmM6CisJICBxdG11eDogV3JpdGUgdGFwdCBhdG9tIGZvciBNT1YgZmlsZXMgaWYgUEFSIG5vdCAxLzEKKwkgIE5lZWRlZCBmb3IgUXVpY2tUaW1lIDcgdG8gcHJvcGVybHkgcGxheSBmaWxlcy4KKwkgIEFsc28gd3JpdGUgdGhlIGNsYXAgYXRvbSBmb3IgTU9WIGZpbGVzIGFsd2F5cywgbm90IG9ubHkgd2hlbiBQcm9SZXMgaXMKKwkgIHVzZWQgYXMgYSB2aWRlbyBjb2RlYy4gSXQncyBtYW5kYXRvcnkgZm9yIE1PVi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzcxMDAKKworMjAxNy0wMS0xMiAxNjozMjo0NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjExLjEgPT09CisKKzIwMTctMDEtMTIgMTU6MzE6MDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnNpZ25hbHM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdnB4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJICBSZWxlYXNlIDEuMTEuMQorCisyMDE3LTAxLTEyIDE0OjM4OjU1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDE3LTAxLTEyIDE0OjM2OjIyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9lbC5wbzoKKwkqIHBvL2hyLnBvOgorCSogcG8vaWQucG86CisJKiBwby96aF9DTi5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTctMDEtMTEgMTc6NTM6MzIgLTA4MDAgIEFuZHJlIE1jQ3VyZHkgPGFybWNjdXJkeUBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZnJlZSBzZXFoIGFmdGVyIGNhbGxpbmcgcXRkZW11eF9wYXJzZV9zdnEzX3N0c2RfZGF0YSgpCisJICBUaGUgc2VxaCBidWZmZXIgYWxsb2NhdGVkIGluIHF0ZGVtdXhfcGFyc2Vfc3ZxM19zdHNkX2RhdGEoKSBuZWVkcyB0bworCSAgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciBhZnRlciB1c2UuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3MTU3CisJICBTaWduZWQtb2ZmLWJ5OiBBbmRyZSBNY0N1cmR5IDxhcm1jY3VyZHlAZ21haWwuY29tPgorCisyMDE3LTAxLTEwIDE2OjAxOjM1ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBpc29tcDQ6IERvbid0IHNwYW0gZGVidWcgbG9nIHdpdGgga25vbncvcGFkZGluZyBhdG9tcworCSAgT25seSBvdXRwdXQgV0FSTklORyBtZXNzYWdlcyBmb3IgYXRvbXMgd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlCisJICBpbnN0ZWFkIG9mIGZvciBwYWRkaW5nL2tub3duIGF0b21zIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55IHByb2Nlc3NpbmcKKwkgIG9uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc3MDk1CisKKzIwMTctMDEtMDkgMTk6MDU6MTAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY2RlcGF5LmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICBGaXggaW5kZW50YXRpb24KKworMjAxNy0wMS0wOSAxOTowNDowNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICB0ZXN0czogcnRwaml0dGVyYnVmZmVyOiBmaXggY29tcGlsZXIgd2FybmluZyBkdWUgdG8gYzk5LWlzbQorCSAgcnRwaml0dGVyYnVmZmVyLmM6NTkyOjM6IGVycm9yOiDigJhmb3LigJkgbG9vcCBpbml0aWFsIGRlY2xhcmF0aW9ucyBhcmUgb25seSBhbGxvd2VkIGluIEM5OSBtb2RlCisKKzIwMTYtMTEtMTEgMTQ6MzE6MDMgKzExMDAgIE1hdHRoZXcgV2F0ZXJzIDxtYXR0aGV3QGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2RldGVjdC5jOgorCSAgYXV0b2RldGVjdDogYnJpbmcgdGhlIGVsZW1lbnQgc3RhdGUgZG93biBhZnRlciBzdWNjZXNzCisJICBPdGhlcndpc2Ugc29tZSBtZXNzYWdlcyB0aGF0IGFyZSBlbWl0dGVkIGJ5IHRoZSBlbGVtZW50IG9uIE5VTEwtPlJFQURZCisJICB3aWxsIG5vdCByZWFjaCB0aGUgYXBwbGljYXRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY0OTQ3CisKKzIwMTctMDEtMDggMDE6MTM6MzIgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogV3JpdGUgdGZkdCBhdG9tIGludG8gZnJhZ21lbnRlZCBmaWxlcy4KKwkgIFRoZSBEQVNIIHNwZWMgcmVxdWlyZXMgdGhhdCB0ZmR0IGF0b21zIGJlIHByZXNlbnQsIHNvCisJICB3cml0ZSBvbmUgb3V0LiBJU08vSUVDIDIzMDA5LTE6MjAxNCA2LjMuNC4yCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA4MjIxCisKKzIwMTctMDEtMDcgMjM6NTU6NDIgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERvbid0IHJlc2V0IG91dHB1dCB0aW1lc3RhbXBzIHdoZW4gbm8gdGZkdAorCSAgSWYgYSBmcmFnbWVudGVkIHN0cmVhbSBkb2Vzbid0IGhhdmUgYSB0ZmR0LCBkb24ndAorCSAgcmVzZXQgdGhlIG91dHB1dCB0aW1lc3RhbXBzIGF0IGVhY2ggZnJhZ21lbnQgYm91bmRhcnkKKwkgIGJ5IGVycm9uZW91c2x5IHVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlIG9mIDAuIEludHJvZHVjZWQKKwkgIGJ5IGNvbW1pdCA2OWZjNDgKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTQyMzAKKworMjAxNi0xMi0xNiAxNjo1MTo0OCAtMDMwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC92cHgvbWVzb24uYnVpbGQ6CisJKiBnc3QvZXF1YWxpemVyL21lc29uLmJ1aWxkOgorCSogZ3N0L2lzb21wNC9tZXNvbi5idWlsZDoKKwkqIG1lc29uLmJ1aWxkOgorCSAgbWVzb246IEluc3RhbGwgcHJlc2V0cyBmaWxlcworCisyMDE3LTAxLTAzIDEwOjEyOjMwICswNTMwICBHYXJpbWEgR2F1ciA8Z2FyaW1hLmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggc29tZSBjYXBzIGxlYWtzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy8vc2hvd19idWcuY2dpP2lkPTc3Njc4OQorCisyMDE2LTEyLTIyIDE3OjM0OjA4ICswMjAwICBWaXZpYSBOaWtvbGFpZG91IDx2aXZpYUBhaGlydS5ldT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkgIHNwbGl0bXV4c2luazogUmV0dXJuIGEgYmluIHdpdGggYSAibG9jYXRpb24iIHByb3BlcnR5IGFzIGEgc2luaworCSAgU3BsaXRtdXhzaW5rIG1pZ2h0IGJlIGNhbGxlZCB3aXRoIGEgY3VzdG9tIGJpbiBhcyBhIHNpbmsuIElmIGl0IGhhcyBhCisJICAibG9jYXRpb24iIHByb3BlcnR5LCBpdCBjYW4gYmUgdXNlZC4KKworMjAxNi0xMS0xOCAyMjo0MjoxOCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgc3BsaXRtdXg6IFJld3JpdGUgYnVmZmVyIGNvbGxlY3Rpb24gYW5kIHNjaGVkdWxpbmcKKwkgIE1ham9ybHkgY2hhbmdlIHRoZSB3YXkgdGhhdCBzcGxpdG11eHNpbmsgY29sbGVjdHMKKwkgIGluY29taW5nIGRhdGEgYW5kIHNlbmRzIGl0IHRvIHRoZSBvdXRwdXQsIHNvIHRoYXQgaXQKKwkgIG1ha2VzIGFsbCBkZWNpc2lvbnMgYWJvdXQgd2hlbiAvIHdoZXJlIHRvIHNwbGl0IGZpbGVzCisJICBvbiB0aGUgaW5wdXQgc2lkZS4KKwkgIFVzZSBzZXBhcmF0ZSBxdWV1ZXMgZm9yIGVhY2ggc3RyZWFtLCBzbyB0aGV5IGNhbiBiZQorCSAgZ3Jvd24gaW5kaXZpZHVhbGx5IGFuZCBrZXB0IGFzIHNtYWxsIGFzIHBvc3NpYmxlLgorCSAgVGhpcyByZW1vdmVzIHJhY2luZXNzIEkgb2JzZXJ2ZWQgd2hlcmUgc29tZXRpbWVzCisJICBzb21lIGRhdGEgd291bGQgZW5kIHVwIHB1dCBpbiBhIGRpZmZlcmVudCBvdXRwdXQgZmlsZQorCSAgb3ZlciBtdWx0aXBsZSBydW5zIHdpdGggdGhlIHNhbWUgaW5wdXQuCisJICBBbHNvIGZpeGVzIGhhbmdzIHdpdGggaW5wdXQgcXVldWVzIGdldHRpbmcgZnVsbAorCSAgYW5kIGNhdXNpbmcgbXV4aW5nIHRvIHN0YWxsIG91dC4KKworMjAxNi0xMS0xNyAyMzo0MDoyNyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc3BsaXRtdXguYzoKKwkgIHNwbGl0bXV4c2luazogQWRkIGZvcm1hdC1sb2NhdGlvbi1mdWxsIHNpZ25hbAorCSAgQWRkIGEgbmV3IHNpZ25hbCBmb3IgZm9ybWF0dGluZyB0aGUgZmlsZW5hbWUsIHdoaWNoIHJlY2VpdmVzCisJICBhIEdzdFNhbXBsZSBjb250YWluaW5nIHRoZSBmaXJzdCBidWZmZXIgZnJvbSB0aGUgcmVmZXJlbmNlCisJICBzdHJlYW0gdGhhdCB3aWxsIGJlIG11eGVkIGludG8gdGhhdCBmaWxlLgorCSAgVXNlZnVsIGZvciBjcmVhdGluZyBmaWxlbmFtZXMgdGhhdCBhcmUgYmFzZWQgb24gdGhlCisJICBydW5uaW5nIHRpbWUgb3Igb3RoZXIgYXR0cmlidXRlcyBvZiB0aGUgYnVmZmVyLgorCSAgVG8gbWFrZSBpdCB3b3JrLCBvcGVuaW5nIG9mIGZpbGVzIGFuZCBzZXR0aW5nIGZpbGVuYW1lcyBpcworCSAgbm93IGRlZmVycmVkIHVudGlsIHRoZXJlIGlzIHNvbWUgZGF0YSB0byB3cml0ZSB0byBpdCwKKwkgIHdoaWNoIGFsc28gcmVxdWlyZXMgc29tZSBjaGFuZ2VzIHRvIGhvdyBhc3luYyBzdGF0ZSBjaGFuZ2VzCisJICBhbmQgZ2FwIGV2ZW50cyBhcmUgaGFuZGxlZC4KKworMjAxNi0xMi0zMSAwMTo1NDowMSArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWx3YXlzIHNuYXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBrZXlmcmFtZQorCSAgV2hlbiBwZXJmb3JtaW5nIGEga2V5LXVuaXQgc2VlaywgYWx3YXlzIHNuYXAgdG8gdGhlIHN0YXJ0IHRzCisJICBvZiB0aGUga2V5ZnJhbWUgYnVmZmVyIHdlIGxhbmRlZCBvbiBzbyB0aGF0IHRoZSBrZXlmcmFtZSBpcworCSAgZW50aXJlbHkgd2l0aGluIHRoZSByZXN1bHRpbmcgb3V0Z29pbmcgc2VnbWVudC4gVGhhdCBzZWVtcworCSAgdGhlIG1vc3Qgc2Vuc2libGUgcmVzdWx0LCBzaW5jZSB0aGUgdXNlciByZXF1ZXN0ZWQgc25hcHBpbmcKKwkgIHRvIHRoZSBrZXlmcmFtZSBwb3NpdGlvbi4KKworMjAxNi0xMi0zMSAwMTo0ODowNCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogT21pdCBjc2xnX3NoaWZ0IHdoZW4gc25hcHBpbmcgc2Vla3MKKwkgIFNlZ21lbnRzIHRpbWVzIGFuZCBzZWVrIHJlcXVlc3RzIGFyZSBzdG9yZWQgYW5kIGhhbmRsZWQKKwkgIGluIHJhdyAnUFRTJyB0aW1lLCB3aXRob3V0IHRoZSBjc2xnX3NoaWZ0IC0gd2hpY2ggb25seSBhcHBsaWVzCisJICB0byBvdXRnb2luZyBzYW1wbGVzLiBPbWl0IHRoZSBjc2xnX3NoaWZ0IHBvcnRpb24gd2hlbgorCSAgZXh0cmFjdGluZyBQVFMgdG8gY29tcGFyZSBmb3IgaW50ZXJuYWwgc2VlayBzbmFwcy4KKwkgIElmIHRoZSBjc2xnX3NoaWZ0IGlzIGluY2x1ZGVkLCB0aGVuIGtleWZyYW1lK3NuYXAtYmVmb3JlIHNlZWtzCisJICBnZW5lcmF0ZSBhIHNlZ21lbnQgc3RhcnQvc3RvcCB0aW1lIHRoYXQgYWxyZWFkeSBpbmNsdWRlcyB0aGUKKwkgIGNzbGdfc2hpZnQsIGFuZCBpdCdzIHRoZW4gYWRkZWQgYSAybmQgdGltZSwgY2F1c2luZyB0aGUKKwkgIGZpcnN0IGJ1ZmZlcihzKSB0byBoYXZlIHRpbWVzdGFtcHMgdGhhdCBhcmUgb3V0IG9mIHNlZ21lbnQuCisKKzIwMTYtMTItMzAgMjI6MzE6MzggKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJICBxdG11eDogUmVtb3ZlIGJvZ3VzIGNoZWNrIGluIGF0b21fc3RzY19hZGRfbmV3X2VudHJ5KCkKKwkgIFJlbW92ZSBhbiBvbGQgY2hlY2sgZnJvbSBhdG9tX3N0c2NfYWRkX25ld19lbnRyeSgpIHRoYXQKKwkgIGV4dGVuZHMgdGhlIGxhc3QgZW50cnkgaW4gdGhlIFNUU0MgaWYgdGhlIHNhbXBsZXMgcGVyIGNodW5rCisJICBtYXRjaGVzLCBhcyB0aGUgbmV3IGludGVybGVhdmUgbWVyZ2luZyBsb2dpYyByZXF1aXJlcyB0aGF0CisJICB0aGUgZmluYWwgZW50cnkgYnkgdXBkYXRlYWJsZS4gVGhlcmUncyBhbHJlYWR5IGNvZGUKKwkgIGJlbG93IHdoaWNoIHNpbXBseSBtZXJnZXMgdGhlIGZpbmFsIGVudHJ5IGludG8gdGhlIHByZXZpb3VzCisJICBvbmUgd2hlbiBuZWVkZWQsIHNvIHJlbHkgb24gdGhhdCBpbnN0ZWFkLgorCSAgRml4ZXMgYXNzZXJ0cyBsaWtlOgorCSAgRVJST1I6YXRvbXMuYzoyOTQwOmF0b21fc3RzY191cGRhdGVfZW50cnk6IGFzc2VydGlvbiBmYWlsZWQ6CisJICAoYXRvbV9hcnJheV9pbmRleCAoJnN0c2MtPmVudHJpZXMsIGxlbiAtIDEpLmZpcnN0X2NodW5rID09IGZpcnN0X2NodW5rKQorCisyMDE2LTA0LTI0IDIxOjM4OjUxICswOTAwICBTZXVuZ2hhIFlhbmcgPHNoLnlhbmdAbGdlLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBGaXgga2V5X3RpbWUgaW4gZ3N0X3F0ZGVtdXhfYWRqdXN0X3NlZWsoKQorCSAgdGltZSBpbiBzZWdtZW50IHNob3VsZCBiZSBQVFMgYmFzZWQgKG5vdCBEVFMpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NTQ5OAorCisyMDE2LTEyLTI4IDIyOjQ5OjI3ICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhwYXJ0cmVhZGVyLmg6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c3JjLmM6CisJICBzcGxpdG11eHNyYzogUGFzcyBzZWVrIGZsYWdzIHdoZW4gYWN0aXZhdGluZy4KKwkgIFBhc3MgYWxsIHNlZWsgZmxhZ3Mgd2hlbiBhY3RpdmF0aW5nIGEgcGFydAorCSAgYmFzZWQgb24gYSBzZWVrLCBzbyB0aGF0IFNOQVAgZmxhZ3MgYXJlIHByZXNlcnZlZC4KKworMjAxNi0xMS0yNiAwMToxMzoxOSArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhwYXJ0cmVhZGVyLmM6CisJICBzcGxpdG11eDogRml4IGEgc21hbGwgcmFjZSBpbiB0aGUgc3BsaXRtdXhzcmMKKwkgIE1ha2Ugc3VyZSB0aGUgc3RhdGUgb2YgdGhlIHBhcnNlciBpcyBzZXQgdG8KKwkgIGNvbGxlY3Rpbmcgc3RyZWFtcyBiZWZvcmUgY2hhaW5pbmcgdXAgdG8gdGhlCisJICBwYXJlbnQgY2hhbmdlX3N0YXRlKCkgbWV0aG9kLCB0byBjbG9zZSBhCisJICBzbWFsbCB3aW5kb3cgdGhhdCBjYW4gY2F1c2UgcGxheWJhY2sgdG8KKwkgIG5ldmVyIGNvbW1lbmNlLgorCisyMDE3LTAxLTAyIDE1OjA2OjMzICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hbXJwYXJzZS5jOgorCSAgY2hlY2s6IFJlbW92ZSBkZWFkIGNvZGUKKworMjAxNi0xMi0zMSAwOTo1MjoyNSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuaDoKKwkgIG11bHRpZmlsZXNpbms6IHJlZmFjdG9yIG1heF9maWxlcyBoYW5kbGluZyBhIGJpdAorCSAgVXNlIEdRdWV1ZSBpbnN0ZWFkIG9mIGEgR1NMaXN0IHNvIHdlIGRvbid0IGhhdmUgdG8gdHJhdmVyc2UKKwkgIHRoZSB3aG9sZSBsaXN0IHRvIGFwcGVuZCBzb21ldGhpbmcgZXZlcnkgdGltZS4gQW5kIGl0IGFsc28KKwkgIGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gaXQgZm9yIHVzLgorCSAgQWRkIGEgZnVuY3Rpb24gdG8gYWRkIGZpbGVuYW1lcyB0byB0aGUgbGlzdCBvZiBvbGQgZmlsZXMgYW5kCisJICB1c2UgaXQgaW4gbW9yZSBwbGFjZXMsIHNvIHRoYXQgbWVtb3J5IGRvZXNuJ3QgYnVpbGQgdXAgaW4KKwkgIG90aGVyIG1vZGVzIGVpdGhlciBpZiBubyBtYXhfZmlsZXMgbGltaXQgaXMgc3BlY2lmaWVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2Njk5MQorCisyMDE2LTA1LTI5IDE3OjIxOjQ3ICswMTAwICBVcnN1bGEgTWFwbGVodXJzdCA8dXJzdWxhQGthbmdhdHJvbml4LmNvLnVrPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIG11bHRpZmlsZXNpbms6IGRvbid0IGxlYWsgbWVtb3J5IHdoZW4gbm8gbWF4LWZpbGVzIGxpbWl0IGlzIHNldAorCSAgVGVjaG5pY2FsbHkgd2Ugd2VyZW4ndCBsZWFraW5nIHRoZSBtZW1vcnksIGp1c3Qgc3RvcmluZyBpdCBpbnRlcm5hbGx5CisJICBhbmQgbmV2ZXIgdXNpbmcgaXQgdW50aWwgdGhlIGVsZW1lbnQgaXMgZnJlZWQuIEJ1dCB3ZSdkIHN0aWxsIHVzZSBtb3JlCisJICBhbmQgbW9yZSBtZW1vcnkgb3ZlciB0aW1lLCBzbyB0aGlzIGlzIG5vdCBnb29kIG92ZXIgbG9uZ2VyIHBlcmlvZHMKKwkgIG9mIHRpbWUuIE9ubHkga2VlcCB0cmFjayBvZiBmaWxlcyBpZiB0aGVyZSdzIGFjdHVhbGx5IGEgbGltaXQgc2V0LAorCSAgc28gdGhhdCB3ZSB3aWxsIHBydW5lIHRoZSBsaXN0IGZyb20gdGltZSB0byB0aW1lLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2Njk5MQorCisyMDE2LTEyLTI5IDEyOjM5OjIwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogYWRqdXN0IHNlZ21lbnQgc3RvcCBmb3IgS0VZX1VOSVQgbmVnYXRpdmUgcmF0ZSBzZWVraW5nCisKKzIwMTYtMTItMjkgMTI6MjU6MzUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBpbXBsZW1lbnQgcHVsbCBtb2RlIFNOQVAgZmxhZyBzZWVraW5nCisKKzIwMTYtMTItMjkgMTE6MjY6MzMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHR3ZWFrIEtFWV9VTklUIFNOQVAgc2VlayBoYW5kbGluZworCSAgUHJldmlvdXNseSwgc2Vla2luZyB0byBwb3NpdGlvbiB5IHdoZXJlIHkgaXMgKHN0cmljdGx5KSB3aXRoaW4gYSBrZXlmcmFtZQorCSAgd291bGQgc2VlayB0byB0aGF0IGtleWZyYW1lIGJvdGggd2l0aCBTTkFQX0JFRk9SRSBhbmQgU05BUF9BRlRFUiwKKwkgIHdoZXJlIHRoZSBsYXR0ZXIgaXMgbm93IGFkanVzdGVkIHRvIHJlYWxseSBzbmFwIHRvIHRoZSBuZXh0IGtleWZyYW1lLgorCisyMDE2LTEyLTI4IDEzOjIzOjExICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBjb3JyZWN0bHkgcGVyZm9ybSBwdWxsIG1vZGUgS0VZX1VOSVQgc2Vla2luZworCSAgUmF0aGVyIGFtYXppbmdseSAoYW5kIGVxdWFsbHkgdW5ub3RpY2VkKSwga2V5dW5pdCBzZWVraW5nIHJlc3VsdGVkIGluIHNlZ21lbnRzCisJICB3aGVyZSBzdGFydCAhPSB0aW1lICh3aGljaCBpcyBib2d1cyBmb3Igc2ltcGxlIGF2aSB0aW1lbGluZSkuICBTbywgcHJvcGVybHkKKwkgIGFkanVzdCB0aGUgc2VnbWVudCAoc3RhcnQpIHJhdGhlciB0aGFuIGZpZGRsaW5nIHdpdGggc2VnbWVudCB0aW1lIChvbmx5KS4KKworMjAxNi0xMi0yOCAxMzowNDo1NCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogcmVzdG9yZSBjb25zaWRlcmluZyBvZiBwdWxsIG1vZGUgS0VZX1VOSVQgc2Vla2luZworCSAgLi4uIGJ5IHVzaW5nIHRoZSBvcmlnaW5hbCBzZWVrIGV2ZW50J3MgZmxhZ3MgcmF0aGVyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcKKwkgIHNlZ21lbnQgZmxhZ3MsIHdoaWNoIGRvIG5vdCBoYXZlIHN1Y2ggY291bnRlcnBhcnQgZmxhZ3MgKGFuZAorCSAgZG8gbm8gbG9uZ2VyIGhhdmUgdGhlbSBjb3ZlcnRseSBzbmVha2luZyBpbiBub3dhZGF5cykuCisKKzIwMTUtMDUtMDggMTI6NDQ6MDEgKzAyMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogb25seSBkcm9wIGFjdHVhbCBzdHJlYW1oZWFkZXIgYnVmZmVycyB3aXRoIHhpcGggY29kZWNzCisJICBXaXRoIFhpcGggY29kZWNzIHRoZSBzdHJlYW0gaGVhZGVyIGJ1ZmZlcnMgYXJlIGJvdGggaW4gdGhlIGNhcHMgYW5kIGFyZQorCSAgdXN1YWxseSBhbHNvIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBpbnB1dCBzdHJlYW0sIGJ1dCBpdCdzIHBlcmZlY3RseQorCSAgcG9zc2libGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGRvZXMgbm90IGhhdmUgdGhlIHN0cmVhbSBoZWFkZXIgYnVmZmVycworCSAgaW5saW5lIGluIHRoZSBkYXRhLiBNYXRyb3NrYW11eCB3b3VsZCBkcm9wIHRoZSBmaXJzdCBOIGJ1ZmZlcnMgYXNzdW1pbmcKKwkgIHRoZXkncmUgc3RyZWFtIGhlYWRlcnMsIGJ1dCB0aGlzIG1lYW50IGl0IHdvdWxkIGRyb3AgYWN0dWFsIHBheWxvYWQgZGF0YQorCSAgd2hlbiB0aGUgc3RyZWFtIGRpZG4ndCBjb250YWluIHRoZSBzdHJlYW0gaGVhZGVycyBpbmxpbmUuIEZpeCB0aGlzIGJ5CisJICBvbmx5IGRyb3BwaW5nIGxlYWRpbmcgYnVmZmVycyBpZiB0aGV5J3JlIGZsYWdnZWQgYXMgc3RyZWFtIGhlYWRlcnMuIFRoaXMKKwkgIGZpeGVzIGlzc3VlcyB3aXRoIHN0cmVhbXMgdGhhdCBhcmUgYmVpbmcgdGFwcGVkIGludG8gYWZ0ZXIgc3RyZWFtaW5nCisJICBoYXMgc3RhcnRlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDkwOTgKKworMjAxNi0xMi0yMSAxNzo0Mzo1OCArMDEwMCAgTmljb2xhIE11cmlubyA8bmljb2xhLm11cmlub0BnbWFpbC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJICBtYXRyb3NrYW11eDogYWRqdXN0IHVuaXQgdGVzdCB0byBtb2RpZmllZCBiZWhhdmlvdXIKKwkgIE5vdyBtYXRyb3NrYW11eCBtYXJrIGFsbCBwYWNrZXRzIG9mIGF1ZGlvLW9ubHkgc3RyZWFtcyBhcyBrZXlmcmFtZXMgc28KKwkgIGluIHRlc3RfYmxvY2tfZ3JvdXAgYWZ0ZXIgcHVzaGluZyB0aGUgdGVzdCBhdWRpbyBkYXRhIDQgYnVmZmVycyBhcmUgcHJvZHVjZWQKKwkgIGFuZCBub3QgbW9yZSAyLiBUaGUgbGFzdCBidWZmZXIgaXMgdGhlIG9yaWdpbmFsIGRhdGEgYW5kIG11c3QgbWF0Y2ggd2l0aCB3aGF0CisJICBwdXNoZWQuIFRoZSByZW1haW5pbmcgb25lcyBhcmUgbWF0cm9za2FtdXggaGVhZGVycworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NDY5NgorCisyMDE2LTA1LTMwIDAxOjE1OjMxICswMjAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IG1hcmsgYWxsIHBhY2tldHMgb2YgYXVkaW8tb25seSBzdHJlYW1zIGFzIGtleWZyYW1lcworCSAgVGhpcyBoZWxwcyB3aXRoIHN0cmVhbWluZyBhdWRpby1vbmx5IHN0cmVhbXMgdmlhIG11bHRpZmRzaW5rLAorCSAgdGNwc2VydmVyc2luayBhbmQgc3VjaC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTQ2OTYKKworMjAxNS0wMy0yOCAxODoxNTozNiArMDEwMCAgTmljb2xhIE11cmlubyA8bmljb2xhLm11cmlub0BnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBhZGQgRzcyMiBhdWRpbyBzdXBwb3J0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ2NTc0CisKKzIwMTYtMTItMTMgMTE6MTE6MDcgKzA5MDAgIFdvbmNodWwgTGVlIDx3b25jaHVsLmxlZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdXBkc3JjOiBBZGQgdG8gam9pbiBtdWx0aXBsZSBtdWx0aWNhc3QgaW50ZXJmYWNlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NjAzMAorCisyMDE1LTAzLTI1IDEzOjUxOjMwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGtsdmRlcGF5LmM6CisJICBydHBrbHZkZXBheTogYWRkIHRoZSBTUEFSU0UgZmxhZyB0byB0aGUgb3V0Z29pbmcgc3RyZWFtLXN0YXJ0IGV2ZW50CisKKzIwMTYtMTItMTQgMTQ6Mzc6NDUgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBtYW5hZ2VyOiBwbGFjZSBjb250ZW50IGJlZm9yZSBTaW5jZS12ZXJzaW9uIEFQSSBtYXJrZXIKKwkgIEF2b2lkcyBjb25mdXNpbmcgdGhlIHBhcnNlcgorCisyMDE2LTEyLTE0IDE0OjE2OjUzIC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6CisJICBzaG91dDI6IGZpeCA0MDQgaW4gcGFja2FnZSBvcmlnaW4KKworMjAxNi0xMi0xNCAyMTo0NToxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBDaGVjayBpZiB3ZSBoYXZlIGVub3VnaCBkYXRhIGF2YWlsYWJsZSB3aGVuIHBhcnNpbmcgZWRpdCBsaXN0cworCSAgQWxzbyBjb25zdW1lIHRoZSBkYXRhIGVudHJ5IGJ5IGVudHJ5IHRvIGdldCBjb21wbGljYXRlZCBpbmRleGluZyBvdXQgb2YKKwkgIHRoZSBjb2RlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NjEwNworCisyMDE2LTEyLTE0IDE5OjE1OjAzICswMTAwICBWw61jdG9yIE1hbnVlbCBKw6FxdWV6IExlYWwgPHZqYXF1ZXpAaWdhbGlhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRG9uJ3QgY2hlY2sgc2l6ZSBpbiBhIG5vbi1saXN0IHZhbHVlCisJICBBZnRlciBjb21taXQgMWVhOTczNWEgSSBzZWUgdGhlc2UgZXJyb3Igd2hpbGUgdXNpbmcgdGhlIHdlYmNhbQorCSAgaW50ZWdyYXRlZCBpbiBteSBsYXB0b3A6CisJICBHU3RyZWFtZXItQ1JJVElDQUwgKio6IGdzdF92YWx1ZV9saXN0X2dldF9zaXplOiBhc3NlcnRpb24gJ0dTVF9WQUxVRV9IT0xEU19MSVNUICh2YWx1ZSknIGZhaWxlZAorCSAgVGhlIGlzc3VlIGlzIGdzdF92NGwyc3JjX3ZhbHVlX3NpbXBsaWZ5KCkgd2FzIGRvaW5nIGl0cyBqb2Igb2YKKwkgIGdlbmVyYXRpbmcgYSBzaW5nbGUgdmFsdWUsIHJhdGhlciB0aGFuIHRoZSBvcmlnaW5hbCBsaXN0LiBUaGF0IHdoeSwKKwkgIHdoZW4gZ2V0dGluZyB0aGUgbGlzdCBzaXplLCBhIGNyaXRpY2FsIHdhcm5pbmcgd2FzIHJhaXNlZC4KKwkgIFRoaXMgcGF0Y2ggdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBjb21waWxlciBvcHRpbWl6YXRpb25zIHRvIHZlcmlmeQorCSAgZmlyc3QgaWYgdGhlIGxpc3Qgd2FzIHNpbXBsaWZpZWQsIHRodXMgdXNlIGl0IGRpcmVjdGx5LCBvdGhlcndpc2UsCisJICBpZiBpdCBpcyBhIGxpc3QsIHZlcmlmeSBpdHMgc2l6ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzYxMDYKKworMjAxNi0xMi0xNCAxMDozOToxMiArMDEwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHRlc3RzL2ppdHRlcmJ1ZmZlcjogTWFqb3IgcmVmYWN0b3JpbmcgYW5kIGNsZWFudXBzCisJICAqIENoYW5nZWQgUENNVS0+VEVTVCBmb3IgY29tbW9uIG1hY3JvcworCSAgKiBDaGFuZ2VkIHZlcmlmeS1mdW5jdGlvbnMgKGxvc3QgJiBydHgpIGludG8gbWFjcm9zLgorCSAgKiBSZW1vdmUgb3B0aW9uIHRvIGFkZCBtYXJrZXItYml0IGZvciB0ZXN0LWJ1ZmZlcnMgKG5vdCB1c2VkIGFueXdoZXJlKQorCSAgKiBBZGQgbmV3IHB1c2hfdGVzdF9idWZmZXIgZnVuY3Rpb24gdGhhdCBtYWtlcyBzdXJlIHRoZXJlIGFyZSBjb3JyZWxhdGlvbgorCSAgYmV0d2VlbiBkdHMgYW5kIHRoZSB0aW1lIG9uIHRoZSBjbG9jay4gKGNsYXNzaWMgdGVzdC1taXN0YWtlKQorCSAgKiBFc3RhYmxpc2hlZCBhIGdlbmVyaWMgc3RhcnRpbmctcG9pbnQgZm9yIHRlc3RzIHdpdGggdGhlCisJICBjb25zdHJ1Y3RfZGV0ZXJtaW5pc3RpY19pbml0aWFsX3N0YXRlIGZ1bmN0aW9uIGFuZCB1c2UgaXQgd2hlcmUKKwkgIGFwcGxpY2FibGUsIHdoaWNoIHJlbW92ZXMgbG90cyBvZiAiYm9pbGVycGxhdGUiIGV2ZXJ5d2hlcmUuCisJICAqIEFkZCBiYXNpYyBsb3N0LWV2ZW50IHRlc3QKKwkgICogUmVtb3ZlIGFzIG11Y2ggIm1hZ2ljIGNvbnN0YW50cyIgYXMgcG9zc2libGUuCisJICAqIFJlbW92ZSAzIHRlc3RzIHRoYXQgbm8gbG9uZ2VyIGFyZSB0ZXN0aW5nIGFueXRoaW5nIHRoYXQgb3RoZXJzIGRvbid0LAorCSAgYW5kIHdhcyBjb21wbGV0ZWx5IHVubWFpbnRhaW5hYmxlLgorCSAgKiBSZW1vdmUgdW5uZWNlc3NhcnkgdXNlIG9mIHRoZSB0ZXN0Y2xvY2sKKwkgICogVmVyaWZ5IGVhY2ggdGVzdCBpcyB0ZXN0aW5nIHdoYXQgaXQgYWN0dWFsbHkgc2F5cyBpdCBkb2VzIChhbmQgbW9kaWZ5CisJICB3aGVyZSBpdCBkb2Vzbid0KQorCSAgSW4gZ2VuZXJhbCwgbWFrZSB0aGUgdGVzdHMgbXVjaCBzbWFsbGVyLCBiZXR0ZXIsIG1vcmUgbWFpbnRhaW5hYmxlIGFuZAorCSAgcmVhZGFibGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0NDA5CisKKzIwMTYtMTItMTQgMDk6NTQ6MTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIC5naXRpZ25vcmU6CisJKiBNYWtlZmlsZS5hbToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIFJlbW92ZSBnZW5lcmF0ZWQgLnNwZWMgZmlsZQorCSAgTGlrZWx5IGV4dHJlbWVseSBiaXRyb3R0ZW4sIGFuZCB3ZSBzaG91bGQgbm90IHNoaXAgdGhpcyBhbnl3YXkuCisKKzIwMTYtMTItMTQgMTA6MTU6MTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQ2hlY2sgdGhhdCB0aGUgWGlUaCBzaXplIGlzIGJpZyBlbm91Z2gKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzU3OTQKKworMjAxNi0xMi0wOSAyMDoyNzo1MyArMDkwMCAgSGVla3lvdW5nIFNlbyA8aGVla3lvdW5nLnNlb0BsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IENoZWNrIG5vZGUgbGVuZ3RoIG9mIHZpZGVvIHNhbXBsZSBkZXNjcmlwdGlvbgorCSAgQWRkIGNoZWNrIGZvciBub2RlIGxlbmd0aCBvZiB2aWRlbyBzYW1wbGUgZGVzY3JpcHRpb24gYW5kIGl0cyBmaWVsZHMgYW5kCisJICBmb3IgdGhlIFhpVGggYXRvbS4KKwkgIEFsc28gdW5pZnkgdGhlIGNvZGUgYSBiaXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1Nzk0CisKKzIwMTYtMTItMDggMTg6NTA6NTIgKzA5MDAgIEhlZWt5b3VuZyBTZW8gPGhlZWt5b3VuZy5zZW9AbGdlLmNvbT4KKworCSogZ3N0L2lzb21wNC9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRW5hYmxlIHh2aWQvbXAyIGNvZGVjIHN1cHBvcnQKKwkgIEFkZCBzdXBwb3J0IGZvciB4dmlkIHZpZGVvIGFuZCBtcDIgYXVkaW8sIGFkZCBtMnYxIGZvdXJjYy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzU3OTQKKworMjAxNi0xMi0xMyAyMjozMjo0NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cDlkZXBheS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZwOWVuYy5jOgorCSAgZ3N0OiBEb24ndCBkZWNsYXJlIHZhcmlhYmxlcyBpbnNpZGUgdGhlIGZvciBsb29wIGhlYWRlcgorCSAgVGhpcyBpcyBhIEM5OSBmZWF0dXJlLgorCisyMDE2LTEyLTExIDEzOjI3OjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvLmM6CisJICBzY2FsZXRlbXBvOiBFbnN1cmUgdG8gcmVpbml0IGJ1ZmZlcnMgd2hlbmV2ZXIgdGhleSB3ZXJlIG5vdCBhbGxvY2F0ZWQgeWV0CisJICBUaGF0IGlzLCB3aGVuZXZlciB3ZSBnbyB0aHJvdWdoIHN0YXJ0L3N0b3Agd2UgaGF2ZSB0byBlbnN1cmUgdGhhdCBvbiB0aGUKKwkgIG5leHQgb3Bwb3J0dW5pdHkgdGhlIGJ1ZmZlcnMgYXJlIHJlYWxsb2NhdGVkIGFnYWluLiBPdGhlcndpc2UgdGhlCisJICBidWZmZXJzIG1pZ2h0IGJlIE5VTEwgYmVjYXVzZSB0aGUgZWxlbWVudCB3YXMgcmV1c2VkIHdpdGggdGhlIHNhbWUKKwkgIGNvbmZpZ3VyYXRpb24gYXMgYmVmb3JlIChpLmUuIHNldF9jYXBzKCkgd291bGRuJ3QgaGF2ZSByZWluaXRlZCB0aGUKKwkgIGJ1ZmZlcnMpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTg5OAorCisyMDE2LTEyLTEwIDEyOjUyOjE4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBkb2NzL2Rlc2lnbi9NYWtlZmlsZS5hbToKKwkqIGRvY3MvZGVzaWduL2Rlc2lnbi1ydHBhdXhpbGlhcnkudHh0OgorCSogZG9jcy9kZXNpZ24vZGVzaWduLXJ0cGNvbGxpc2lvbi50eHQ6CisJKiBkb2NzL2Rlc2lnbi9kZXNpZ24tcnRwcmV0cmFuc21pc3Npb24udHh0OgorCSAgZG9jczogZGVzaWduOiByZW1vdmUsIG1vdmVkIHRvIGdzdC1kb2NzCisKKzIwMTYtMTItMDkgMTc6MTc6MzUgLTAzMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRzYXVuaWVyQGdub21lLm9yZz4KKworCSogbWVzb24uYnVpbGQ6CisJICBtZXNvbjogU3VwcG9ydCBidWlsZGluZyB3aXRob3V0IEdzdCBkZWJ1ZworCisyMDE2LTEyLTA5IDE3OjU1OjM5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSogZ3N0L2ZseC9nc3RmbHhkZWMuaDoKKwkgIGZseGRlYzogT25seSBzZW5kIFNFR01FTlQgZXZlbnRzIGFmdGVyIENBUFMKKwkgIEkuZS4sIGRvbid0IGp1c3QgZm9yd2FyZCB0aGUgZXZlbnQgYnV0IGRlbGF5IGl0IGlmIHdlIGRvbid0IGhhdmUgY2FwcyBvbgorCSAgdGhlIHNyY3BhZCB5ZXQuCisKKzIwMTYtMTItMDkgMTc6NDk6NDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJICBmbHhkZWM6IFVucmVmIGFuZCB1bm1hcCBidWZmZXJzIGluIGFsbCBjb2RlIHBhdGhzIGFzIG5lZWRlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTg4OAorCisyMDE2LTEyLTA2IDE3OjQyOjMxICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuQG9zZy5zYW1zdW5nLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRG9uJ3Qgc2V0IGVtcHR5IGludGVybGFjZS1tb2RlIGxpc3QKKwkgIElmIGZvciBzb21lIHJlYXNvbiB3ZSBmYWlsIHRvIHByb2JlIGZvcm1hdHMgKGFsbCB0cnlfZm10IGNhbGxzIGZhaWwsIGZvcgorCSAgZXhhbXBsZSksIHRoaXMgaXMgbm90IGEgY3JpdGljYWwgZXJyb3IsIGJ1dCB3ZSBlbmQgdXAgd2l0aCBhbiBlbXB0eSBsaXN0CisJICBvZiBpbnRlcmxhY2UgbW9kZXMuIFRoaXMgY2F1c2VzIGFsbCBzdWJzZXF1ZW50IG5lZ290aWF0aW9uIHRvIGZhaWwuCisJICBUaGlzIHBhdGNoIGZpeGVzIGludGVybGFjZS1tb2RlIHNldHRpbmcgdG8gYmUgc2tpcHBlZCBpZiB3ZSBmYWlsZWQgdG8KKwkgIGRldGVjdCBhbnkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NzAyCisKKzIwMTYtMTItMDcgMTc6MjI6MjIgKzA1MzAgIEdhcmltYSBHYXVyIDxnYXJpbWEuZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYzoKKwkgIG1vbm9zY29wZTogVW5yZWYgYWxsb2NhdGlvbiBxdWVyeSBhZnRlciBmaW5pc2hlZCB3aXRoIGl0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NzUyCisKKzIwMTYtMTItMDYgMDc6NDg6NDcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJICBmbHhkZWM6IEFsbG9jYXRlIDAtaW5pdGlhbGl6ZWQgbWVtb3J5IGZvciB0aGUgZGVjb2RlZCBmcmFtZQorCSAgT3RoZXJ3aXNlIHdlIG1pZ2h0IGxlYWsgYXJiaXRyYXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIHVuaW5pdGlhbGl6ZWQKKwkgIG1lbW9yeSBpZiBub3QgZXZlcnkgcGl4ZWwgaXMgd3JpdHRlbi4KKwkgIGh0dHBzOi8vc2NhcnliZWFzdHNlY3VyaXR5LmJsb2dzcG90LmdyLzIwMTYvMTIvMWRheXMtMGRheXMtcG9jcy1tb3JlLWdzdHJlYW1lci1mbGljLmh0bWwKKworMjAxNi0xMi0wNSAwNzo1NzoxOSAtMDcwMCAgTWF0dCBTdGFwbGVzIDxzdGFwbGVzMjU1QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogRml4IHNlc3Npb24gY2xlYW51cCB3aGVuIGhhbmRsaW5nIHJlZGlyZWN0IG9uIFBMQVkKKwkgIFJlZGlyZWN0IG9uIFBMQVkgd2Fzbid0IGRvaW5nIHRoZSBuZWNlc3Nhcnkgc2Vzc2lvbiBjbGVhbnVwLiBGaXhlZCBieQorCSAgcmVtb3ZpbmcgY29kZSBmcm9tIGdzdF9ydHNwc3JjX3NlbmQgdGhhdCBjaGFuZ2VkIHRoZSBzdGF0ZSB2YXJhYmxlIHVwb24KKwkgIGVuY291bnRlcmluZyBhIHJlZGlyZWN0LiBCZXR0ZXIgdG8gbGV0IHRoZSByZWRpcmVjdCBoYW5kbGVycyBpbgorCSAgZ3N0X3J0c3BzcmNfcmV0cmlldmVfc2RwIGFuZCBnc3RfcnRzcHNyY19wbGF5IGRvIHRoZWlyIG93bgorCSAgc3RhdGUtZGVwZW5kZW50IGNsZWFudXAuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NTQzCisKKzIwMTYtMDktMDcgMTY6MTA6MjcgKzAzMDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdWUgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGFsd2F5cyBzZW5kIHRlYXJkb3duIHJlcXVlc3QKKwkgIEFsbG93IENNRF9DTE9TRSB0byBjYW5jZWwgYWxsIGNvbW1hbmRzIG5vdCBvbmx5IENNRF9QQVVTRQorCSAgYW5kIGlnbm9yZSBDTURfV0FJVCB3aGlsZSBjbG9zaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0ODM2MAorCisyMDE2LTEyLTAzIDA4OjE5OjI3ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBSRUFETUU6CisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZjk4MGZkOSB0byAzOWFjMmY1CisKKzIwMTYtMTItMDEgMTc6MDg6MDkgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IERvbid0IGxlYWsgZHVwbGljYXRlIGl0ZW1zCisJICBXaGVuIHByb3ZpZGluZyBpdGVtcyB3aXRoIGEgc2VxbnVtLCB0aGVyZSBpcyBhICh2ZXJ5IHNtYWxsKSBwcm9iYWJpbGl0eQorCSAgdGhhdCBhbiBlbGVtZW50IHdpdGggdGhlIHNhbWUgc2VxbnVtIGFscmVhZHkgZXhpc3RzLiBEb24ndCBmb3JnZXQKKwkgIHRvIGZyZWUgdGhhdCBpdGVtIGlmIGl0IHdhc24ndCBpbnNlcnRlZC4KKwkgIEFuZCBhdm9pZCByZXR1cm5pbmcgdW5kZWZpbmVkIHZhbHVlcyB3aGVuIGRlYWxpbmcgd2l0aCBkdXBsaWNhdGUgaXRlbXMKKworMjAxNi0xMi0wMSAxMToyMzowMiArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBTYW5pdGl6ZSB1bmtub3duIGNvZGVjIGNhcHMKKwkgIFdlIG1pZ2h0IGhhdmUgbm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzIGluIHRoZSB1bmtub3duIGZvdXJjYywgcmVwbGFjZQorCSAgdGhlbSB3aXRoICdfJywgaW4gdGhlIHNhbWUgd2F5IHdlIGRvIGl0IGZvciB1bmtub3duIHRhZ3MuCisKKzIwMTYtMTItMDEgMjA6MDQ6MjggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBGcmVlIHZwcnAgY2h1bmsgYWxzbyBpZiBpdCBleGlzdGVkIGJ1dCB3ZSBtYWRlIG5vIHVzZSBvZiBpdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTQ3OQorCisyMDE2LTEyLTAxIDE3OjM4OjMzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thZGVtdXg6IEZpeCBtZW1vcnkgbGVhayB3aGVuIHBhcnNpbmcgYXR0YWNobWVudHMKKwkgIGdzdF90YWdfaW1hZ2VfZGF0YV90b19pbWFnZV9zYW1wbGUoKSBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUKKwkgIHBhc3NlZCBtZW1vcnksIHNvIGRvbid0IHNldCBpdCB0byBOVUxMIHRvIGFsbG93IHVzIHRvIGZyZWUgaXQgbGF0ZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NDcyCisKKzIwMTYtMTItMDEgMTQ6NTY6MTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2FkZW11eDogVW5pZnkgemxpYi9iemlwMiBkZWNvbXByZXNzIGxvb3BzIHdpdGggdGhlIG9uZXMgZnJvbSBxdGRlbXV4CisJICBFc3BlY2lhbGx5LCBzaW1wbGlmeSB0aGUgY29kZSBhIGJpdC4KKworMjAxNi0xMi0wMSAxNDo0MTo0OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBJbmNyZWFzZSBpbmZsYXRlIGJ1ZmZlciBpbiBiaWdnZXIgc3RlcHMKKwkgIDEwMjQgYnl0ZXMgaXMgcXVpdGUgc21hbGwsIGxldCdzIGRvIDQwOTYgYnl0ZXMgKG9yIG9uZSBwYWdlKS4KKwkgIEFsc28gcmVtb3ZlIHJlZHVuZGFudCBpZiwgd2UncmUgYWx3YXlzIGluIHRoYXQgY2FzZSB3aGVuIGdldHRpbmcgaGVyZS4KKworMjAxNi0xMi0wMSAxNDozMDo0OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBFbnN1cmUgdGhhdCBzaXplIG9mIHRoZSBwYXNwIGF0b20gaXMgYXMgbXVjaCBhcyB3ZSBuZWVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NDU1CisKKzIwMTYtMTItMDEgMTQ6MzA6MTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRnJlZSBjb21wcmVzc2VkIG1vb3Ygbm9kZSBhbmQgaXQncyBjb3JyZXNwb25kaW5nIGRlY29tcHJlc3NlZCBkYXRhCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NDU1CisKKzIwMTYtMTItMDEgMTQ6Mjk6MjEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQ2hlY2sgc2l6ZSBvZiBjb21wcmVzc2VkIE1PT1YgaGVhZGVyIGFnYWluc3QgYXZhaWxhYmxlIGRhdGEKKwkgIEFuZCBhY3R1YWxseSByZWFkIHRoZSBzaXplIG9mIHRoZSBjbXZkIGF0b20gZnJvbSB0aGUgcmlnaHQgcG9zaXRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NDU1CisKKzIwMTYtMTItMDEgMTQ6Mjc6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IHpsaWIgaW5mbGF0ZSBsb29wCisJICBIYW5kbGUgZXJyb3JzIGNsZWFubHksIGRlYWxsb2NhdGUgYWxsIG1lbW9yeSBhbmQgcmV0dXJuIHRoZSBhY3R1YWwgc2l6ZQorCSAgb2YgdGhlIGluZmxhdGVkIGRhdGEuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NDU1CisKKzIwMTYtMTItMDEgMTM6Mzg6MTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBNYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggZGF0YSBpbiB0aGUgY29kZWNfZGF0YSB0byBiZSBhYmxlIHRvIHBhcnNlIGl0CisJICBBbHNvIGVycm9yIG91dCBjbGVhbmx5IGlmIG1hcHBpbmcgdGhlIGJ1ZmZlciBmYWlsZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NDUwCisKKzIwMTYtMTItMDEgMTM6MzI6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IG91dCBvZiBib3VuZHMgcmVhZCBpbiB0YWcgcGFyc2luZyBjb2RlCisJICBXZSBjYW4ndCBzaW1wbHkgYXNzdW1lIHRoYXQgdGhlIGxlbmd0aCBvZiB0aGUgdGFnIHZhbHVlIGFzIGdpdmVuCisJICBpbnNpZGUgdGhlIHN0cmVhbSBpcyBjb3JyZWN0IGJ1dCBzaG91bGQgYWxzbyBjaGVjayBhZ2FpbnN0IHRoZSBhbW91bnQgb2YKKwkgIGRhdGEgd2UgaGF2ZSBhY3R1YWxseSBhdmFpbGFibGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NDUxCisKKzIwMTYtMTItMDEgMTU6MDY6MDYgKzA1MzAgIEdhcmltYSBHYXVyIDxnYXJpbWEuZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjZGVwYXkuYzoKKwkgIHJ0cDogRml4IHNvbWUgbWVtb3J5IGxlYWtzIGluIHVzYWdlIG9mIGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcygpCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1MDcxCisKKzIwMTYtMTEtMzAgMTc6NTY6MDIgKzAyMDAgIFZpdmlhIE5pa29sYWlkb3UgPHZpdmlhQGFoaXJ1LmV1PgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFJlYWQgaW50ZXJsYWNpbmcgaW5mb3JtYXRpb24gZnJvbSAnZmllbCcgYXRvbQorCSAgUmVhZCBpbnRlcmxhY2luZyBhbmQgVEZGL0JGRiBpbmZvcm1hdGlvbiBmcm9tIHRoZSAnZmllbCcgYXRvbSBhbmQgcGFzcyBpdAorCSAgaW50byB0aGUgY2FwcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTQxNAorCisyMDE2LTExLTI5IDEzOjU1OjQwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBjb21waWxlciB3YXJuaW5nCisJICBxdGRlbXV4LmM6IEluIGZ1bmN0aW9uIOKAmHF0ZGVtdXhfcGFyc2VfdHJha+KAmToKKwkgIHF0ZGVtdXguYzoxMDE4NDozODogZXJyb3I6IGZvcm1hdCDigJglbHXigJkgZXhwZWN0cyBhcmd1bWVudCBvZiB0eXBlIOKAmGxvbmcgdW5zaWduZWQgaW504oCZLCBidXQgYXJndW1lbnQgOSBoYXMgdHlwZSDigJhnaW50IHtha2EgY29uc3QgaW50feKAmSBbLVdlcnJvcj1mb3JtYXQ9XQorCSAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIkZvdW5kIGpwZWc6IGxlbiAldSwgbmVlZCAlbHUiLCBsZW4sCisJICBeCisKKzIwMTYtMTEtMjggMTM6NDU6MjQgLTA4MDAgIFNjb3R0IEQgUGhpbGxpcHMgPHNjb3R0LmQucGhpbGxpcHNAaW50ZWwuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IENoYW5nZSBvZmZfdCB0eXBlIHRvIGdpbnQKKwkgIG9mZl90IGlzIGEgc2lnbmVkIGludGVnZXIgdHlwZSBwcm92aWRlZCBieSBzeXMvdHlwZXMuaCBvbiBwb3NpeCBzeXN0ZW1zLgorCSAgUmVwbGFjZSB3aXRoIGdpbnQgZm9yIGJ1aWxkaW5nIG9uIG5vbi1wb3NpeCBzeXN0ZW1zIChsaWtlIHdpbmRvd3MpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTI4NworCisyMDE2LTExLTIyIDIxOjAwOjI1IC0wODAwICBTY290dCBEIFBoaWxsaXBzIDxzY290dC5kLnBoaWxsaXBzQGludGVsLmNvbT4KKworCSogbWVzb24uYnVpbGQ6CisJICBtZXNvbjogYWRkIGxpYm0gdG8gaGFzX2Z1bmN0aW9uIGNoZWNrcworCSAgVGhlIGZ1bmN0aW9ucyBmcm9tIG1hdGguaCBtYXkgYmUgaW1wbGVtZW50ZWQgaW4gbGlibS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ4NzYKKworMjAxNi0xMC0yNyAyMzowMjozNyArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvbWVzb24uYnVpbGQ6CisJICBSZXZlcnQgIm1lc29uOiBkdiBwbHVnaW4gbm93IHdvcmtzIG9uIE1TVkMiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDA1YTg5NjEzZmVmZjcwY2ZmNDE2MzY3ZjVhYTgwN2ExZDVjNjhiNjMuCisJICBMZXQncyBub3QgcHV0IGluIHN0dWZmIHRoYXQgbmVlZHMgdW5yZWxlYXNlZCBNZXNvbi4gVGhpcyBjYW4gZ28gaW4KKwkgIGZvciB0aGUgbmV4dCBjeWNsZS4KKworMjAxNi0xMS0yOCAxMzo1MTo0MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IEVuc3VyZSB0aGF0IHRhZ3MgYXJlIHZhbGlkIFVURi04IGJlZm9yZSBhZGRpbmcgdGhlbSB0byB0aGUgdGFnbGlzdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTIxOQorCisyMDE2LTExLTI4IDEyOjIyOjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJICBtdWx0aXBhcnRkZW11eDogUG9zdCBhbiBlcnJvciBtZXNzYWdlIG9uIHRoZSBidXMgaWYgd2UgZ290IEVPUyB3aXRob3V0IGhhdmluZyBhZGRlZCBhbnkgcGFkcworCisyMDE2LTExLTI4IDEyOjAwOjA5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IEhhbmRsZSBub24tVVRGOCBoZWFkZXJzIGFuZCBlcnJvciByZWFzb25zIG1vcmUgZ3JhY2VmdWxseQorCSAgRXNwZWNpYWxseSBkb24ndCBwdXQgdGhlbSBpbnRvIEdzdFN0cnVjdHVyZXMgaW4gb25lIHdheSBvciBhbm90aGVyLCBqdXN0CisJICBpZ25vcmUgdGhlbSBvciBlcnJvciBvdXQgY2xlYW5seSBkZXBlbmRpbmcgb24gdGhlIGltcG9ydGFuY2Ugb2YgdGhlaXIKKwkgIGNvbnRlbnQuCisKKzIwMTYtMTEtMjggMDk6MzA6MjUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSAgdnJhd3BheTogRXJyb3Igb3V0IGNsZWFubHkgaWYgbWFwcGluZyB0aGUgdmlkZW8gZnJhbWUgZmFpbHMKKwkgIEluc3RlYWQgb2YgbGF0ZXIgZGVyZWZlcmVuY2luZyBOVUxMIGFuZCBjcmFzaGluZy4KKworMjAxNi0xMS0yNyAxMToxNDoxMyArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSAgcnRwcnR4c2VuZDogVXBkYXRlIHN0YXRpc3RpY3MgYmVmb3JlIHB1c2hpbmcKKwkgIElmIGFuIGVsZW1lbnQgcXVlcmllcyB0aGUgbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9uIGJ1ZmZlcnMgcHVzaGVkCisJICAqd2hpbGUqIHRoZSBwdXNoIGlzIHN0aWxsIHRha2luZyBwbGFjZSAoYW5kIGJlZm9yZSB0aGUgb2JqZWN0IGxvY2sKKwkgIGlzIHRha2VuIGp1c3QgYWZ0ZXIpIGl0IHdvdWxkIGVuZCB1cCB3aXRoIHRoZSB3cm9uZyBzdGF0aXN0aWMKKwkgIGJlaW5nIHJlcG9ydGVkLgorCSAgSW5jcmVtZW50IGl0IGp1c3QgYmVmb3JlIHRoZSBwdXNoLCBhdm9pZHMgcmFjZXMgd2hlbiBnZXR0aW5nIHN0YXRpc3RpY3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njg3MjMKKworMjAxNi0xMS0yNiAxMToyMDo1MSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogLmdpdG1vZHVsZXM6CisJICBjb21tb246IHVzZSBodHRwcyBwcm90b2NvbCBmb3IgY29tbW9uIHN1Ym1vZHVsZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTExMAorCisyMDE2LTA3LTI4IDE4OjUxOjI0ICswMjAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgZ3N0djRsMmJ1ZmZlcnBvb2w6IGxvY2sgZmx1c2hfc3RvcCBhZ2FpbnN0IHJlZ3VsYXIgcWJ1ZgorCSAgVGhlc2UgY2FuIGJlIGNhbGxlZCBmcm9tIGRpZmZlcmVudCB0aHJlYWRzIGFuZCBib3RoIG1hbmlwdWxhdGUgdGhlCisJICBwb29sLT5idWZmZXJzIGFycmF5LiBMb2NrIHRoZW0gcHJvcGVybHkgYW5kIGxldCBmbHVzaF9zdG9wIG1vdmUgdGhlCisJICBhcnJheSBjb250ZW50cyBpbnRvIGEgdGVtcG9yYXJ5IGFycmF5IG9uIHRoZSBzdGFjayB0byBhdm9pZCBoYXZpbmcKKwkgIHRvIGNhbGwgcmVsZWFzZV9idWZmZXIgdW5kZXIgdGhlIG9iamVjdCBsb2NrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTAxNQorCisyMDE2LTExLTI0IDE0OjI1OjIyICswMTAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgZ3N0djRsMmJ1ZmZlcnBvb2w6IHJlbW92ZSBjcml0aWNhbCBlcnJvciBtZXNzYWdlIHdoZW4gcHJvY2VzcyBpcyBjYWxsZWQgb24gYW4gaW5hY3RpdmUgcG9vbAorCSAgSWYgdGhlIHBvb2wgaXMgaW5hY3RpdmUsIGl0IGlzIGd1YXJhbnRlZWQgdG8gYWxzbyBiZSBmbHVzaGluZywgc28gdGhlCisJICBmb2xsb3dpbmcgY2hlY2sgd2lsbCByZXR1cm4gR1NUX0ZMT1dfRkxVU0hJTkcgYW55d2F5LgorCSAgVGhpcyBjYW4gaGFwcGVuIGlmIGEgdjRsMnNyYyBpcyBibG9ja2luZyBvbiBEUUJVRiBpbiBjcmVhdGUgYW5kIGlzIHNlbnQKKwkgIGFuIEVPUyBldmVudCBvbiBhbm90aGVyIHRocmVhZC4gSW4gdGhhdCBjYXNlIHRoZSBwb29sIGlzIHNldCB0bworCSAgZmx1c2hpbmcvaW5hY3RpdmUgd2l0aG91dCBsb2NraW5nLCB0aGUgdjRsMnNyYyBpcyB1bmJsb2NrZWQsIGFuZCBtYXkKKwkgIGNhbGwgcG9vbF9wcm9jZXNzIHdpdGggYSB2YWxpZCBidWZmZXIgb24gdGhlIGFscmVhZHkgaW5hY3RpdmUgcG9vbC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzUwMTQKKworMjAxNi0xMS0yNCAxNDo0MTo1MiArMDEwMCAgUGhpbGlwcCBaYWJlbCA8cC56YWJlbEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMnNyYzogcmVsZWFzZSBidWZmZXIgaWYgY3JlYXRlIGZhaWxzCisJICBnc3RfYmFzZV9zcmNfZ2V0X3JhbmdlIGRvZXMgbm90IGV4cGVjdCBhIGJ1ZmZlciB0byBiZSByZXR1cm5lZCBpbgorCSAgdGhlIGVycm9yIGNhc2UsIHNvIHdlIGFyZSBsZWFraW5nIGEgcmVmZXJlbmNlIGhlcmUgaWYgY3JlYXRlIGZhaWxzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NTAxNAorCisyMDE2LTExLTIzIDE4OjM0OjA0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogSGFuZGxlIGNyZWF0ZV9zZXNzaW9uKCkgcmV0dXJuaW5nIE5VTEwgaW4gYnVuZGxlIGNvZGUKKwkgIENJRCAxMzk0NDkyLgorCisyMDE2LTExLTIyIDE2OjQyOjU1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogTWFrZSBzdXJlIHRvIG9ubHkgY2hhbmdlIERUUyBvZiB3cml0YWJsZSBidWZmZXJzCisJICBBbmQgdHJpdmlhbCBjbGVhbnVwCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0ODQwCisKKzIwMTYtMTEtMjIgMTY6NDI6MjYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBFcnJvciBvdXQgbXVjaCBlYXJsaWVyIGlmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBQVFMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ4NDAKKworMjAxNi0xMS0yMiAxNjoxODo0MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IE9ubHkgdXNlIGJ1ZmZlciBkdXJhdGlvbnMgaWYgdGhleSBhcmUgYWN0dWFsbHkgdmFsaWQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ4NDAKKworMjAxNi0xMS0yMiAxNTo1OToxOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IFJldmVydCBjb21taXRzIHRoYXQgc2V0IERUUyBhbmQgZHVyYXRpb24gb24gYnVmZmVycyB1bmNvbmRpdGlvbmFsbHkKKwkgIDM5ZjdlNTIyNjZmZGUzYjNjMDM1ZTIyY2JjYmIyYmIxZmEyMDdiMTcgd2FzIHNldHRpbmcgdGhlIGJ1ZmZlciBkdXJhdGlvbgorCSAgdG8gMCBpZiBpcyBub3QgdmFsaWQsIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhpcyBpcyAidGhlIGxhc3QiCisJICBidWZmZXIgYW5kIG5vIG90aGVycyBhcmUgY29taW5nIG5leHQuIFRoaXMgaXMgd3JvbmcsIGxhc3RfYnVmIGlzIHRoZQorCSAgcHJldmlvdXMgYnVmZmVyIGFuZCBub3QgdGhlIHZlcnkgbGFzdCBvbmUuCisJICA0ZTNjMTNjODdjMjU4YzljOTVlMjIxN2QzMmFiMzE0ZDEyYjVmZmZjIHdhcyBzZXR0aW5nIERUUyB0byAwIGlmIHRoZXJlCisJICB3YXMgbm9uZS4gVGhpcyB3aWxsIHNldCBEVFMgdG8gMCBmb3IgYWxsIGUuZy4gYXVkaW8gc3RyZWFtcywgY29tcGxldGVseQorCSAgbWVzc2luZyB1cCBjYWxjdWxhdGlvbnMgaWYgc3RyZWFtcyBkb24ndCBzdGFydCBhdCAwLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NDg0MAorCisyMDE2LTExLTIyIDE1OjU4OjM3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogT25seSB3cml0ZSAiZ2FwIiBlZGl0IGxpc3QgaWYgdGhlcmUgaXMgYSBub24temVybyBnYXAKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ4NDAKKworMjAxNi0xMS0yMyAwNzowOTowNiArMTEwMCAgTWF0dGhldyBXYXRlcnMgPG1hdHRoZXdAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZmx4L2ZseF9jb2xvci5jOgorCSogZ3N0L2ZseC9mbHhfZm10Lmg6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSogZ3N0L2ZseC9nc3RmbHhkZWMuaDoKKwkgIGZseGRlYzogcmV3cml0ZSBsb2dpYyBiYXNlZCBvbiBHc3RCeXRlUmVhZGVyL1dyaXRlcgorCSAgU29sdmVzIG92ZXJyZWFkaW5nL3dyaXRpbmcgdGhlIGdpdmVuIGFycmF5cyBhbmQgd2lsbCBlcnJvciBvdXQgaWYgdGhlCisJICBzdHJlYW1zIGFza3MgdG8gZG8gdGhhdC4KKwkgIEFsc28gZG9lcyBtb3JlIGVycm9yIGNoZWNraW5nIHRoYXQgdGhlIHN0cmVhbSBpcyB2YWxpZCBhbmQgd29uJ3QKKwkgIG92ZXJydW4gYW55IGFsbG9jYXRlZCBhcnJheXMuICBBbHNvIG1pdGlnYXRlIGludGVnZXIgb3ZlcmZsb3cgZXJyb3JzCisJICBjYWxjdWxhdGluZyBhbGxvY2F0aW9uIHNpemVzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NDg1OQorCisyMDE2LTExLTIzIDExOjIwOjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSAgZmx4ZGVjOiBEb24ndCB1bnJlZigpIHBhcmVudCBpbiB0aGUgY2hhaW4gZnVuY3Rpb24KKwkgIFdlIGRvbid0IG93biB0aGUgcmVmZXJlbmNlIGhlcmUsIGl0IGlzIG93bmVkIGJ5IHRoZSBjYWxsZXIgYW5kIGdpdmVuIHRvCisJICB1cyBmb3IgdGhlIHNjb3BlIG9mIHRoaXMgZnVuY3Rpb24uIExlZnRvdmVyIG1pc3Rha2UgZnJvbSAwLjEwIHBvcnRpbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0ODk3CisKKzIwMTYtMTEtMjIgMjA6MzM6MjkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC92cHgvZ3N0dnB4ZGVjLmM6CisJICB2cHhkZWM6IGxpYnZweCdzIHJlbGVhc2UgYnVmZmVyIGlzIHNvbWV0aW1lcyBjYWxsZWQgd2l0aCBmYi0+cHJpdj09TlVMTAorCSAgRG9uJ3QgYXNzZXJ0IG9uIHRoaXMgYnV0IGp1c3QgaWdub3JlIHRoZXNlIGNhc2VzLgorCisyMDE2LTExLTIyIDIwOjI0OjU5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IEZpeCBjbHVzdGVyIHNlYXJjaGluZyBpZiB3ZSBzZWFyY2ggbXVsdGlwbGUgdGltZXMgaW4gb25lIGNodW5rCisJICBBZnRlciBmaW5kaW5nIGEgY2x1c3RlciBpZCBpbiB0aGUgYnl0ZSByZWFkZXIsIHdlIHNraXAgYWhlYWQgdGhlIHJlYWRlcgorCSAgcG9zaXRpb24gYnkgb25lIGZ1cnRoZXIgYnl0ZSB0byBiZSBhYmxlIHRvIGNvbnRpbnVlIHNlYXJjaGluZyBmcm9tIHRoZXJlCisJICBpbnNpZGUgdGhlIHNhbWUgY2h1bmsgaWYgdGhlIGNsdXN0ZXIgY2FuZGlkYXRlIHdhcyBhIGZhbHNlIHBvc2l0aXZlLgorCSAgV2UgaGF2ZSB0byBhY2NvbW9kYXRlIGZvciB0aGF0IGFkZGl0aW9uYWwgYnl0ZSB3aGVuIHJlc3VtaW5nIHRoZSBzZWFyY2gsCisJICBvdGhlcndpc2UgYWxsIGZvbGxvd2luZyBwdWxscyBhcmUgb2ZmLWJ5LW9uZSBmb3IgZXZlcnkgcmVzdW1lIGFuZCB3ZSBydW4KKwkgIGludG8gYW4gYXNzZXJ0aW9uLgorCisyMDE2LTExLTIyIDIwOjAxOjIwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJICBtYXRyb3NrYTogQWRkIHNpemUgY2hlY2tzIHRvIHRoZSBwYXJzaW5nIG9mIEZMQUMgaGVhZGVycworCisyMDE2LTExLTIyIDIzOjQ2OjAwICsxMTAwICBNYXR0aGV3IFdhdGVycyA8bWF0dGhld0BjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJICBmbHhkZWM6IGZpeCBzb21lIHdhcm5pbmdzIGNvbXBhcmluZyB1bnNpZ25lZCA8IDAKKwkgIGJmNDNmNDRmY2ZhZGE1ZWM0YTNjZTYwY2IzNzQzNDA0ODZmZTlmYWMgd2FzIGNvbXBhcmluZyBhbiB1bnNpZ25lZAorCSAgZXhwcmVzc2lvbiB0byBiZSA8IDAgd2hpY2ggd2FzIGFsd2F5cyBmYWxzZS4KKwkgIGdzdGZseGRlYy5jOiBJbiBmdW5jdGlvbiDigJhmbHhfZGVjb2RlX2JydW7igJk6CisJICBnc3RmbHhkZWMuYzozMjI6MzM6IHdhcm5pbmc6IGNvbXBhcmlzb24gb2YgdW5zaWduZWQgZXhwcmVzc2lvbiA8IDAgaXMgYWx3YXlzIGZhbHNlIFstV3R5cGUtbGltaXRzXQorCSAgaWYgKChnbG9uZykgcm93IC0gY291bnQgPCAwKSB7CisJICBeCisJICBnc3RmbHhkZWMuYzozMzI6MzM6IHdhcm5pbmc6IGNvbXBhcmlzb24gb2YgdW5zaWduZWQgZXhwcmVzc2lvbiA8IDAgaXMgYWx3YXlzIGZhbHNlIFstV3R5cGUtbGltaXRzXQorCSAgaWYgKChnbG9uZykgcm93IC0gY291bnQgPCAwKSB7CisJICBeCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0ODM0CisKKzIwMTYtMTEtMjEgMTY6MTc6MzEgKzAyMDAgIFZpdmlhIE5pa29sYWlkb3UgPHZpdmlhQGFoaXJ1LmV1PgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogRW5hYmxlIHVwIHRvIDE2IHVucG9zaXRpb25lZCByYXcgYXVkaW8gY2hhbm5lbHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ3ODkKKworMjAxNi0xMS0yMiAxOTowNTowMCArMTEwMCAgTWF0dGhldyBXYXRlcnMgPG1hdHRoZXdAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSAgZmx4ZGVjOiBhZGQgc29tZSB3cml0ZSBib3VuZHMgY2hlY2tpbmcKKwkgIFdpdGhvdXQgY2hlY2tpbmcgdGhlIGJvdW5kcyBvZiB0aGUgZnJhbWUgd2UgYXJlIHdyaXRpbmcgaW50bywgd2UgY2FuCisJICB3cml0ZSBvZmYgdGhlIGVuZCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgorCSAgaHR0cHM6Ly9zY2FyeWJlYXN0c2VjdXJpdHkuYmxvZ3Nwb3QuZGsvMjAxNi8xMS8wZGF5LWV4cGxvaXQtYWR2YW5jaW5nLWV4cGxvaXRhdGlvbi5odG1sCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0ODM0CisKKzIwMTYtMTEtMjEgMTU6MjU6MjMgKzAwMDAgIERhdmlkIEV2YW5zIDxiYmNyZGRhdmVAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEJlIHN1cmUgbm90IHRvIHJlYWQgb2ZmIGVuZCBvZiBGTEFDIGRmTGEgYm94CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczNzEyCisKKzIwMTYtMTEtMjEgMTE6NDg6NTggKzAxMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGFkZCBzdXBwb3J0IGZvciBza2lwcGluZyBpbnZhbGlkIGRhdGEgaW4gcHVzaCBtb2RlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0NTY2CisKKzIwMTYtMTEtMjEgMTE6NDg6MjkgKzAxMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYXBhcnNlOiBhZGQgc3VwcG9ydCBmb3Igc2tpcHBpbmcgaW52YWxpZCBkYXRhCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0NTY2CisKKzIwMTYtMTEtMTggMTc6MDA6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IE1vdmUgdG8gbmV3IGhlbHBlciBmdW5jdGlvbiB0byBwYXJzZSBhdXRoZW50aWNhdGlvbiByZXNwb25zZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ0MTYKKworMjAxNi0xMS0yMCAxNDoxMjoxNiArMDEwMCAgY2hyaXN0b3BoZWN2ciA8c3RlZmFuc2F0QHRlbGVuZXQuYmU+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IHdyb25nIGNvbXBpbGVyIHdhcm5pbmcgd2l0aCBnY2MgNi4yCisJICB8IC4uLy4uLy4uL2dpdC9nc3QvaXNvbXA0L3F0ZGVtdXguYzogSW4gZnVuY3Rpb24gJ3F0ZGVtdXhfcGFyc2VfdHJlZSc6CisJICB8IC4uLy4uLy4uL2dpdC9nc3QvaXNvbXA0L3F0ZGVtdXguYzoxMDIyNDoyNDogZXJyb3I6ICdzaXplJyBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24gWy1XZXJyb3I9bWF5YmUtdW5pbml0aWFsaXplZF0KKwkgIHwgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZTsKKwkgIHwgICAgICAgICAgICAgICAgICAgICAgICAgXn4KKwkgIHwgLi4vLi4vLi4vZ2l0L2dzdC9pc29tcDQvcXRkZW11eC5jOjEwMTk3OjI1OiBub3RlOiAnc2l6ZScgd2FzIGRlY2xhcmVkIGhlcmUKKwkgIHwgICAgICAgICAgICAgICAgICBndWludDMyIHNpemUsIHRhZzsKKwkgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIF5+fn4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ3NDcKKworMjAxNi0xMS0yMCAxNjoxNTowNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogTWFrZWZpbGUuYW06CisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9NQU5JRkVTVDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIHdpbjMyOiByZW1vdmUgY29waWVzIG9mIGdlbmVyYXRlZCBoZWFkZXJzCisKKzIwMTYtMTEtMjAgMTM6MTQ6MDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIGF2aWRlbXV4OiBFbnN1cmUgdGhhdCByYXcgdmlkZW8gaGF2ZSBwcm9wZXJseSBhbGlnbmVkIGJ1ZmZlcnMKKwkgIFRoYXQgaXMsIGFsaWduZWQgdG8gdG8gMzIgYnl0ZXMgZm9yIHZpZGVvLiBGaXhlcyBjcmFzaGVzIGlmIHRoZSByYXcKKwkgIGJ1ZmZlcnMgYXJlIHBhc3NlZCB0byBTSU1EIHByb2Nlc3NpbmcgZnVuY3Rpb25zLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NDQyOAorCisyMDE2LTExLTIwIDEzOjA4OjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEVuc3VyZSB0aGF0IHJhdyBhdWRpbyBhbmQgdmlkZW8gaGF2ZSBwcm9wZXJseSBhbGlnbmVkIGJ1ZmZlcnMKKwkgIFRoYXQgaXMsIGFsaWduZWQgdG8gdGhlIGJhc2ljIHR5cGUgZm9yIGF1ZGlvIGFuZCB0byAzMiBieXRlcyBmb3IgdmlkZW8uCisJICBGaXhlcyBjcmFzaGVzIGlmIHRoZSByYXcgYnVmZmVycyBhcmUgcGFzc2VkIHRvIFNJTUQgcHJvY2Vzc2luZyBmdW5jdGlvbnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0NDI4CisKKzIwMTYtMTEtMTQgMTQ6NDQ6MTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBBbHdheXMgd3JpdGUgZWRpdCBsaXN0cyBmb3IgdGhlIHRyYWNrcyB0byBnaXZlIGEgbW9yZSBhY2N1cmF0ZSBkdXJhdGlvbgorCSAgQWx3YXlzIHdyaXRlIGFuIGVkaXQgbGlzdCBmb3IgdGhlIHdob2xlIHRyYWNrLiBJbiBnZW5lcmFsIHRoaXMgaXMgbm90CisJICBuZWNlc3NhcnkgZXhjZXB0IGZvciB0aGUgY2FzZSBvZiBoYXZpbmcgYSBnYXAgb3IgRFRTIGFkanVzdG1lbnQgYnV0CisJICBpdCBhbGxvd3MgdG8gZ2l2ZSB0aGUgd2hvbGUgdHJhY2sncyBkdXJhdGlvbiBpbiB0aGUgdXN1YWxseSBtb3JlCisJICBhY2N1cmF0ZSBtZWRpYSB0aW1lc2NhbGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0NDAzCisKKzIwMTYtMTEtMTggMjI6NDU6NDUgKzA5MDAgIFNldW5naGEgWWFuZyA8c2gueWFuZ0BsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFJlbW92ZSB1c2VsZXNzIHJldHVybiB2YXJpYWJsZQorCSAgcXRkZW11eF9leHBvc2Vfc3RyZWFtcygpIHJldHVybnMgZmxvdyBlcnJvciBpbW1lZGlhdGVseSwgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisJICBTbywgdGhlIHZhcmlhYmxlIGZvciB0aGUgZmxvdyByZXR1cm4gaXMgbm90IG5lZWRlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ2NzQKKworMjAxNi0xMS0xNyAxMzo1OTo0OCArMDAwMCAgRGF2aWQgRXZhbnMgPGJiY3JkZGF2ZUBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvZm91cmNjLmg6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmM6CisJICBxdGRlbXV4OiBBZGQgc3VwcG9ydCBmb3IgRkxBQyBlbmNhcHN1bGF0ZWQgaW4gSVNPQk1GRgorCSAgQXMgZGVmaW5lZCBieQorCSAgaHR0cHM6Ly9naXQueGlwaC5vcmcvP3A9ZmxhYy5naXQ7YT1ibG9iX3BsYWluO2Y9ZG9jL2lzb2ZsYWMudHh0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczNzEyCisKKzIwMTYtMTEtMTcgMTk6NTk6NTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBNYXJrIHBhZCBhcyBuZWVkaW5nIHJlY29uZmlndXJhdGlvbiBhZ2FpbiBpZiBpdCBmYWlsZWQKKwkgIEFuZCByZXR1cm4gRkxVU0hJTkcgaW5zdGVhZCBvZiBOT1RfTkVHT1RJQVRFRCBvbiBmbHVzaGluZyBwYWRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NDYyMworCisyMDE2LTExLTE3IDE5OjU5OjI2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSAgbW9ub3Njb3BlOiBNYXJrIHBhZCBhcyBuZWVkaW5nIHJlY29uZmlndXJhdGlvbiBhZ2FpbiBpZiBpdCBmYWlsZWQKKwkgIEFuZCByZXR1cm4gRkxVU0hJTkcgaW5zdGVhZCBvZiBOT1RfTkVHT1RJQVRFRCBvbiBmbHVzaGluZyBwYWRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NDYyMworCisyMDE2LTExLTE3IDE5OjU4OjUyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBNYXJrIHBhZCBhcyBuZWVkaW5nIHJlY29uZmlndXJhdGlvbiBhZ2FpbiBpZiByZWNvbmZpZ3VyYXRpb24gZmFpbGVkCisJICBBbmQgY29uc2lkZXIgbmVnb3RpYXRpb24gZmFpbHVyZXMgb24gZmx1c2hpbmcgcGFkcyBhcyBGTFVTSElORywgbm90IGFzCisJICBOT1RfTkVHT1RJQVRFRC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ2MjMKKworMjAxNi0xMS0xNyAxOTo1NjoyMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJICBkdmRlYzogRml4IGhhbmRsaW5nIG9mIG5lZ290aWF0aW9uIGZhaWx1cmVzCisJICBSZXR1cm4gTk9UX05FR09USUFURUQgaWYgc2VuZGluZyB0aGUgY2FwcyBldmVudCBmYWlscywgb3IgRkxVU0hJTkcgaWYKKwkgIHRoZSBwYWQgd2FzIGZsdXNoaW5nIGF0IHRoYXQgcG9pbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0NjIzCisKKzIwMTYtMTEtMTcgMTc6MTY6MjYgLTA4MDAgIFNjb3R0IEQgUGhpbGxpcHMgPHNjb3R0LmQucGhpbGxpcHNAaW50ZWwuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkgIG1lc29uOiBhZGRfZ2xvYmFsX2FyZ3VtZW50cyAtPiBhZGRfcHJvamVjdF9hcmd1bWVudHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ2NTYKKworMjAxNi0xMS0xNiAxMDo1Mzo1MSArMDUzMCAgVmlub2QgS2VzdGkgPHZpbm9ka2VzdGlAeWFob28uY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBwYWQgcmVxdWVzdCBmYWlscyBmb3IgZmx2bXV4CisJICBzcGxpdG11eHNpbmsgcmVxdWVzdHMgcGFkIGZyb20gZWxlbWVudCB1c2luZyBwYWQgdGVtcGxhdGUgbGlrZSAidmlkZW9fJXUiLCAiYXVkaW9fJXUiIGFuZCAic2lua18lZCIuIFRoaXMgaXMgdHJ1ZSBmb3IgbW9zdCBvZiB0aGUgbXV4ZXJzLgorCSAgQnV0IHNwbGl0bXV4c2luayBub3QgYWJsZSB0byByZXF1ZXN0IHBhZCB0byBmbHZtdXggYXMgZmx2bXV4IGhhcyAiYXVkaW8iIGFuZCAidmlkZW8iIGFzIHBhZCB0ZW1wbGF0ZXMuCisJICBmaXg6IHNwbGl0bXV4c2luayBzaG91bGQgZmFsbGJhY2sgdG8gImF1ZGlvIiBhbmQgICJ2aWRlbyIgd2hlbiB0ZW1wbGF0ZSBub3QgZm91bmQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0NTA3CisKKzIwMTYtMTEtMTcgMTA6MjQ6MjggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSAgbWF0cm9za2FwYXJzZTogQWRkIHJlbWFpbmluZyByZWxldmFudCBwYXJ0cyBmcm9tIGEzYTU1MzA1IHRvIHRoZSBwYXJzZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQ1NjYKKworMjAxNi0xMS0xNiAyMjozOTowMSArMDEwMCAgTmljb2xhIE11cmlubyA8bmljb2xhLm11cmlub0BnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSAgbWF0cm9za2FwYXJzZTogaWdub3JlIHBhcnNpbmcgZXJyb3JzIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUKKwkgIFRoaXMgaXMgdGhlIHNhbWUgY2hhbmdlIGFzIGEzYTU1MzA1IGZvciB0aGUgcGFyc2VyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3NDU2NgorCisyMDE2LTExLTE2IDA4OjU2OjM0ICswMTAwICBQaGlsaXBwZSBOb3JtYW5kIDxwaGlsbkBpZ2FsaWEuY29tPgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnNpZ25hbHM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYnVuZGxlLmM6CisJKiB0ZXN0cy9jaGVjay9tZXNvbi5idWlsZDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC8uZ2l0aWdub3JlOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1ydHBidW5kbGUuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItcnRwYnVuZGxlLmM6CisJICBydHBiaW46IHJlY2VpdmUgYnVuZGxlIHN1cHBvcnQKKwkgIEEgbmV3IHNpZ25hbCBuYW1lZCBvbi1idW5kbGVkLXNzcmMgaXMgcHJvdmlkZWQgYW5kIGNhbiBiZQorCSAgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gdG8gcmVkaXJlY3QgYSBzdHJlYW0gdG8gYSBkaWZmZXJlbnQKKwkgIEdzdFJ0cFNlc3Npb24gb3IgdG8ga2VlcCB0aGUgUlRYIHN0cmVhbSBncm91cGVkIHdpdGhpbiB0aGUKKwkgIEdzdFJ0cFNlc3Npb24gb2YgdGhlIHNhbWUgbWVkaWEgdHlwZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzI3NDAKKworMjAxNi0xMS0xNSAxNjo1MjozOSArMDUzMCAgVmlub2QgS2VzdGkgPHZpbm9ka2VzdGlAeWFob28uY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogYXNzZXJ0aW9uIHdoaWxlIGNvbnZlcnRpbmcgQURUUyBzdHJlYW0gdG8gUkFXCisJICBhYWNwYXJzZSByZXNpemVzIGlucHV0IGJ1ZmZlciB3aGlsZSBjb252ZXJ0aW5nIEFEVFMgc3RyZWFtIHRvIFJBVywKKwkgIER1cmluZyBidWZmZXIgcmVzaXplIGJ1ZmZlciB3cml0ZSBwZXJtaXNzaW9uIGlzIG5vdCBjaGVja2VkLgorCSAgVGhpcyB0aHJvd3MgZ3N0X2J1ZmZlcl9pc193cml0YWJsZSBhc3NlcnRpb24gYW5kIGxlYWRzIHRvIEFWIHN5bmMgaXNzdWUgc29tZSB0aW1lcy4KKwkgIEl0IGlzIGNvcnJlY3RlZCBieSBtYWtpbmcgYnVmZmVyIHdyaXRlYWJsZSB1c2luZyBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQxMjkKKworMjAxNi0xMS0xNSAyMToxNzo1MSArMDkwMCAgU2V1bmdoYSBZYW5nIDxzaC55YW5nQGxnZS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRG9uJ3QgbW9kaWZ5IHVwc3RyZWFtIFRJTUUgc2VnbWVudAorCSAgVElNRSBzZWdtZW50IGltcGxpZXMgdGhhdCBzdHJlYW0vcnVubmluZyB0aW1lIGlzIGJlaW5nIGhhbmRsZWQgYnkgdXBzdHJlYW0uCisJICBTbywgd2Ugc2hvdWxkbid0IG92ZXJyaWRlIGl0IHdpdGhvdXQgYW55IGNsdWUuCisJICBUaGlzIHBhdGNoIGlzIGZvciBmaXhpbmcgc2VlayBpbiBEQVNIIHN0cmVhbWluZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQxOTYKKworMjAxNi0xMS0xNCAyMjozMzoyNyArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bkBvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGNvbmZpZy5oLm1lc29uOgorCSAgbWVzb246IEFkZCBkZWZpbmUgZm9yIHY0bDItcHJvYmUgY29uZmlnIG9wdGlvbgorCisyMDE2LTExLTE0IDE3OjM3OjUxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgIGRlaW50ZXJsZWF2ZTogUmVzZXQgY2FwcyBhY2N1bXVsYXRvciB0byBBTlkgd2hlbiByZXN5bmNpbmcgdGhlIGFkYXB0ZXIsIG5vdCBFTVBUWQorCSAgVGhlIGFjY3VtdWxhdG9yIGlzIGZpbGxlZCBieSBpbnRlcnNlY3Rpbmcgd2l0aCBhbGwgdGhlIHBhZCBjYXBzLCBhcyBzdWNoCisJICBpdCBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggQU5ZIChsaWtlIGl0IGlzIGJlZm9yZSB0aGUgaXRlcmF0aW9uIGlzCisJICBzdGFydGVkKSBhbmQgbm90IHRvIEVNUFRZLgorCSAgRml4ZXMgdGhlIENBUFMgcXVlcnkgYWx3YXlzIHJldHVybmluZyBFTVBUWSBjYXBzIHdoZW4gcmVzeW5jaW5nIGhhcHBlbmVkCisJICBkdXJpbmcgdGhlIHF1ZXJ5LCBlLmcuIGJlY2F1c2UgcGFkcyB3ZXJlIGFkZGVkL3JlbW92ZWQuCisKKzIwMTYtMTEtMTQgMTI6MTM6MTQgKzAxMDAgIFBldHIgS3VsaGF2eSA8YnJhaW5Aamlrb3MuY3o+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IHJlbW92ZSByZWR1bmRhbnQgc2FkZHIgdW5yZWYKKwkgIFRoZSBnX29iamVjdF91bnJlZiAoc2FkZHIpIGJlZm9yZSByZWNlaXZpbmcgbWVzc2FnZSBzZWVtcyB0byBiZSByZWR1bmRhbnQgYXMgaXQKKwkgIGlzIGRvbmUganVzdCBiZWZvcmUganVtcGluZyB0byByZXRyeQorCSAgVGhvdWdoIG5vdCBkaXJlY3RseSByZWxhdGVkLCBwYXJ0IG9mCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyODQxCisKKzIwMTYtMTEtMTIgMjM6MzQ6MjMgKzAxMDAgIFBldHIgS3VsaGF2eSA8YnJhaW5Aamlrb3MuY3o+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IHJlY2VpdmUgY29udHJvbCBtZXNzYWdlcyBvbmx5IGluIG11bHRpY2FzdAorCSAgQ29udHJvbCBtZXNzYWdlcyBhcmUgdXNlZCBvbmx5IGluIG11bHRpY2FzdCBtb2RlIC0gdG8gZGV0ZWN0IGlmIHRoZSBkZXN0aW5hdGlvbgorCSAgYWRkcmVzcyBpcyBub3Qgb3VycyBhbmQgcG9zc2libHkgZHJvcCB0aGUgcGFja2V0LiBIb3dldmVyIGluIG5vbi1tdWx0aWNhc3QKKwkgIG1vZGVzIHRoZSBtZXNzYWdlcyBhcmUgc3RpbGwgYWxsb2NhdGVkIGFuZCBmcmVlZCBldmVuIGlmIG5vdCB1c2VkLiBUaGVyZWZvcmUKKwkgIHJlcXVlc3QgY29udHJvbCBtZXNzYWdlcyBmcm9tIGdfc29ja2V0X3JlY2VpdmVfbWVzc2FnZSgpIG9ubHkgaW4gbXVsdGljYXN0CisJICBtb2RlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3Mjg0MQorCisyMDE2LTExLTExIDEwOjQ1OjAxIC0wODAwICBTY290dCBEIFBoaWxsaXBzIDxzY290dC5kLnBoaWxsaXBzQGludGVsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgVXNlIGludGVybWVkaWF0ZSBndWludCB3aGVuIGhhbmRsaW5nIEdzdFZpZGVvTXVsdGl2aWV3RmxhZ3MKKwkgIFRoZSB1bmRlcmx5aW5nIGludGVnZXIgdHlwZSBvZiB0aGUgZW51bSBHc3RWaWRlb011bHRpdmlld0ZsYWdzIGlzCisJICBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGFuZCBtYXkgbm90IGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyBndWludC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzQyOTMKKworMjAxNi0xMS0xMSAxMDo0NDoxOCAtMDgwMCAgU2NvdHQgRCBQaGlsbGlwcyA8c2NvdHQuZC5waGlsbGlwc0BpbnRlbC5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmM6CisJICBzcGxpdGZpbGVzcmM6IHVwZGF0ZSB1cmlfZ2V0X3R5cGUgdG8gbWF0Y2ggdGhlIHByb3RvdHlwZSBpbiBHc3RVUklIYW5kbGVySW50ZXJmYWNlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0MjkzCisKKzIwMTYtMTAtMjYgMjI6Mzc6MzQgLTA3MDAgIFNjb3R0IEQgUGhpbGxpcHMgPHNjb3R0LmQucGhpbGxpcHNAaW50ZWwuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkgIG1lc29uOiBkb24ndCBhZGRfZ2xvYmFsX2FyZ3VtZW50cyB3aGVuIGJlaW5nIGJ1aWx0IGFzIGEgc3VicHJvamVjdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzU2OAorCisyMDE2LTEwLTIxIDE1OjQ5OjM2ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmg6CisJICBmbGFjcGFyc2U6IGZpeCBoZWFkZXIgcmV3cml0aW5nIGJlaW5nIGlnbm9yZWQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mjc4MDIKKworMjAxNi0xMS0wOSAwNjoyNToyNyArMDAwMCAgU2VhbiBEdUJvaXMgPHNlYW5Ac2lvYnVkLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4Lmg6CisJICBmbHZtdXg6IEFkZCBtZXRhZGF0YWNyZWF0b3IgcHJvcGVydHkKKwkgIEFsbG93IHVzZXJzIHRvIHNldCBtZXRhZGF0YWNyZWF0b3IgdmFsdWUgaW4gdGhlIG1ldGEgcGFja2V0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc0MTMxCisKKzIwMTYtMTEtMDEgMTk6NTY6MzYgKzAyMDAgIFZpdmlhIE5pa29sYWlkb3UgPHZpdmlhQHRvb2xzb25haXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuaDoKKwkgIHNwbGl0bXV4c2luazogVXNlIGZpcnN0IGJ1ZmZlciBUUyBhcyBtdXggc3RhcnQgdGltZQorCSAgRG8gbm90IHVzZSBsYXN0IGJ1ZmZlciBUUyArIGJ1ZmZlciBkdXJhdGlvbiBiZWNhdXNlIGJ1ZmZlciBkdXJhdGlvbgorCSAgbWlnaHQgYmUgaW5hY2N1cmF0ZSwgZXNwZWNpYWxseSBmb3IgZnJhbWUgcmF0ZXMgbGlrZSAzMGZwcyB3aGVyZSBhCisJICByb3VuZGluZyBlcnJvciBpcyBvYnNlcnZlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzM3ODUKKworMjAxNi0xMS0wMyAxNTowMzo1OSArMDEwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBmaXggdGltZXItcmV1c2UgYnVnCisJICBXaGVuIGRvaW5nIHJ0eCwgdGhlIGppdHRlcmJ1ZmZlciB3aWxsIGFsd2F5cyBhZGQgYW4gcnR4LXRpbWVyIGZvciB0aGUgbmV4dAorCSAgc2VxdWVuY2UgbnVtYmVyLgorCSAgSW4gdGhlIGNhc2Ugb2YgdGhlIHBhY2tldCBjb3JyZXNwb25kaW5nIHRvIHRoYXQgc2VxdWVuY2UgbnVtYmVyIGFycml2aW5nLAorCSAgdGhhdCBzYW1lIHRpbWVyIHdpbGwgYmUgcmV1c2VkLCBhbmQgc2ltcGx5IG1vdmVkIG9uIHRvIHdhaXQgZm9yIHRoZQorCSAgZm9sbG93aW5nIHNlcXVlbmNlIG51bWJlciBldGMuCisJICBPbmNlIGFuIHJ0eC10aW1lciBleHBpcmVzIChhZnRlciBhbGwgcmV0cmllcyksIGl0IHdpbGwgYmUgcmVzY2hlZHVsZWQgYXMKKwkgIGEgbG9zdC10aW1lciBpbnN0ZWFkIGZvciB0aGUgc2FtZSBzZXF1ZW5jZSBudW1iZXIuCisJICBOb3csIGlmIHRoaXMgcGFydGljdWxhciBzZXF1ZW5jZS1udW1iZXIgbm93IGFycml2ZXMgKGFmdGVyIHRoZSB0aW1lciBoYXMKKwkgIGJlY29tZSBhIGxvc3QtdGltZXIpLCB0aGUgcmV1c2UgbWVjaGFuaXNtICpzaG91bGQqIG5vdyBzZXQgYSBuZXcKKwkgIHJ0eC10aW1lciBmb3IgdGhlIG5leHQgc2VxdWVuY2UgbnVtYmVyLCBidXQgdGhlIGJ1ZyBpcyB0aGF0IGl0IGRvZXMKKwkgIG5vdCBjaGFuZ2UgdGhlIHRpbWVyLXR5cGUsIGFuZCBoZW5jZSBzY2hlZHVsZXMgYSBsb3N0LXRpbWVyIGZvciB0aGF0CisJICBmb2xsb3dpbmcgc2VxdWVuY2UgbnVtYmVyLCB3aXRoIHRoZSByZXN1bHQgdGhhdCB5b3Ugd2lsbCBoYXZlIGEgdmVyeQorCSAgZWFybHkgbG9zdC1ldmVudCBmb3IgYSBwYWNrZXQgdGhhdCBtaWdodCBzdGlsbCBhcnJpdmUsIGFuZCB5b3Ugd2lsbAorCSAgbmV2ZXIgYmUgYWJsZSB0byBzZW5kIGFueSBydHggZm9yIHRoaXMgcGFja2V0LgorCSAgRm91bmQgYnkgRXJsZW5kIEdyYWZmIC0gZXJsZW5kQHBleGlwLmNvbQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3Mzg5MQorCisyMDE2LTEwLTA5IDE1OjU5OjA1ICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBmaXggbG9zdC1ldmVudCB1c2luZyBkdHMgaW5zdGVhZCBvZiBwdHMKKwkgIFRoZSBsb3N0LWV2ZW50IHdhcyB1c2luZyBhIGRpZmZlcmVudCB0aW1lLWRvbWFpbiAoZHRzKSB0aGFuIHRoZSBvdXRnb2luZworCSAgYnVmZmVycyAocHRzKS4gR2l2ZW4gY2VydGFpbiBuZXR3b3JrLWNvbmRpdGlvbnMgdGhlc2UgdHdvIHdvdWxkIGJlY29tZQorCSAgc3VmZmljaWVudGx5IGRpZmZlcmVudCBhbmQgdGhlIGxvc3QtZXZlbnQgY29udGFpbmVkIHRpbWVzdGFtcC9kdXJhdGlvbgorCSAgdGhhdCB3YXMgcmVhbGx5IHdyb25nLiBBcyBhbiBleGFtcGxlIEdzdEF1ZGlvRGVjb2RlciBjb3VsZCBwcm9kdWNlCisJICBhIHN0cmVhbSB0aGF0IGp1bXBzIGJhY2sgYW5kIGZvcnRoIGluIHRpbWUgYWZ0ZXIgcmVjZWl2aW5nIGEgbG9zdC1ldmVudC4KKwkgIFRoZSBwcmV2aW91cyBiZWhhdmlvciBjYWxjdWxhdGVkIHRoZSBwdHMgKGJhc2VkIG9uIHRoZSBydHB0aW1lKSBpbnNpZGUgdGhlCisJICBydHBfaml0dGVyX2J1ZmZlcl9pbnNlcnQgZnVuY3Rpb24sIGJ1dCBub3cgdGhpcyBmdW5jdGlvbmFsaXR5IGhhcyBiZWVuCisJICByZWZhY3RvcmVkIGludG8gYSBuZXcgZnVuY3Rpb24gcnRwX2ppdHRlcl9idWZmZXJfY2FsY3VsYXRlX3B0cyB0aGF0IGlzCisJICBjYWxsZWQgbXVjaCBlYXJsaWVyIGluIHRoZSBfY2hhaW4gZnVuY3Rpb24gdG8gbWFrZSBwdHMgYXZhaWxhYmxlIHRvCisJICB2YXJpb3VzIGNhbGN1bGF0aW9ucyB0aGF0IHdyb25nbHkgdXNlZCBkdHMgcHJldmlvdXNseQorCSAgKGxpa2UgdGhlIGxvc3QtZXZlbnQpLgorCSAgVGhlcmUgYXJlIGhvd2V2ZXIgdHdvIGNhbGN1bGF0aW9ucyB3aGVyZSB1c2luZyBkdHMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvCisJICBkbzogY2FsY3VsYXRpbmcgdGhlIHJlY2VpdmUtaml0dGVyIGFuZCB0aGUgcnR4LXJvdW5kLXRyaXAtdGltZSwgd2hlcmUgdGhlCisJICBhcnJpdmFsIHRpbWUgb2YgdGhlIGJ1ZmZlciBmcm9tIHRoZSBuZXR3b3JrIGlzIHRoZSByaWdodCBtZXRyaWMKKwkgIChhbmQgaXMgd2hhdCBkdHMgaW4gZmFjdCBpcyB0b2RheSkuCisJICBUaGUgcGF0Y2ggYWxzbyBhZGRzIHR3byB0ZXN0cyByZWdhcmRpbmcgQi1mcmFtZXMgb3IgdGhlCisJICDigJxydHB0aW1lLWdvaW5nLWJhY2t3YXJkc+KAnS1zY2VuYXJpbywgYXMgdGhlcmUgd2VyZSBzb21lIGNvbmNlcm5zIHRoYXQgdGhpcworCSAgcGF0Y2ggbWlnaHQgYnJlYWsgdGhpcyBiZWhhdmlvciAod2hpY2ggdGhlIHRlc3RzIHNob3dzIGl0IGRvZXMgbm90KS4KKworMjAxNi0xMS0wMyAxNjozMzo1MyArMDEwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBmaXggYnVnIGluIHJlc2NoZWR1bGVfdGltZXIKKwkgIFRoZSBuZXcgdGltZW91dCBpcyBhbHdheXMgZ29pbmcgdG8gYmUgKHRpbWVvdXQgKyBkZWxheSksIGhvd2V2ZXIsIHRoZQorCSAgb2xkIGJlaGF2aW9yIGNvbXBhcmVkIHRoZSBjdXJyZW50IHRpbWVvdXQgdG8ganVzdCAodGltZW91dCksIGJhc2ljYWxseQorCSAgYmVpbmcgKGRlbGF5KSBvZmYuCisJICBUaGlzIHdvdWxkIGhhcHBlbiBpZiBydHgtZGVsYXkgPT0gcnR4LXJldHJ5LXRpbWVvdXQsIHdpdGggdGhlIHJlc3VsdCB0aGF0CisJICBhIHNlY29uZCBydHggYXR0ZW1wdCBmb3IgYW55IGJ1ZmZlcnMgd291bGQgYmUgc2NoZWR1bGVkIGltbWVkaWF0ZWx5IGluc3RlYWQKKwkgIG9mIGFmdGVyIHJ0eC1kZWxheSBtcy4KKwkgIFNpbXBseSBjYWxjdWxhdGUgKG5ld190aW1lb3V0ID0gdGltZW91dCArIGRlbGF5KSBhbmQgdGhlbiB1c2UgdGhhdCBpbnN0ZWFkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzkwNQorCisyMDE2LTExLTAzIDEzOjI3OjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYXJzZS5jOgorCSogdGVzdHMvZmlsZXMvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9maWxlcy9hdWRpb3Rlc3RzcmMud2F2OgorCSAgdGVzdHM6IHdhdnBhcnNlOiBhZGQgdGVzdCBmb3IgcHJvY2Vzc2luZyBhbiBhY3R1YWwgLndhdiBmaWxlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczODYxCisKKzIwMTYtMTEtMDMgMTI6MzQ6NTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IERvbid0IHNldCBjYXBzIHRvIE5VTEwgYWZ0ZXIgc2V0dGluZyB0aGVtIG9uIHRoZSBzcmNwYWQKKwkgIFdlIHdvdWxkIGxpa2UgdG8gY2hlY2sgbGF0ZXIgb24gRU9TIGlmIHdlIGZvdW5kIGEga25vd24gc3RyZWFtIHR5cGUgb3IKKwkgIG5vdCwgdG8gcG9zc2libHkgcG9zdCBhbiBlcnJvciBtZXNzYWdlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3Mzg2MQorCisyMDE2LTExLTAyIDE0OjMzOjI4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogRG9uJ3QgZGVyZWYgTlVMTCBwYWRzIGluIGRlYnVnIG91dHB1dAorCSAgVGhhdCB0ZW5kcyB0byBjcmFzaC4KKworMjAxNi0xMS0wMiAxMTo0NjowNyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgaXNvbXA0OiBEb24ndCB1c2UgZ3N0X3ZpZGVvX2NvbG9yaW1ldHJ5X3RvX3N0cmluZ19mdWxsKCkKKwkgIFRoZSBBUEkgd2FzIHJldmVydGVkLiBKdXN0IHVzZSB0aGUgcGxhaW4KKwkgIGdzdF92aWRlb19jb2xvcmltZXRyeV90b19zdHJpbmcoKSBmdW5jdGlvbi4KKworMjAxNi0xMS0wMiAxMTowMDoxMyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IEZpeCBHT2JqZWN0IHdhcm5pbmdzIG9uIHNodXRkb3duLgorCSAgQ29tbWl0IDgzZTcxOCBhZGRlZCBhIHBhZCB0ZW1wbGF0ZSB0byBzcGxpdG11eCByZXF1ZXN0CisJICBwYWRzLCB3aGljaCBtZWFucyB0aGF0IEdzdEVsZW1lbnQgbm93IHJlbGVhc2VzIHRoZSBwYWRzIG9uCisJICBkaXNwb3NlLCBidXQgYWZ0ZXIgaGF2aW5nIHJlbW92ZWQgYWxsIGVsZW1lbnRzIGluIHRoZSBiaW4KKwkgIGFuZCB1bmxpbmtlZCB0aGVtLiBNYWtlIHN1cmUgd2UgY2FuIGhhbmRsZSBjbGVhbnVwIGluIHRoYXQgY2FzZQorCSAgd2l0aG91dCB0aHJvd2luZyBhc3NlcnRpb25zLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3Mzc4NAorCisyMDE2LTExLTAyIDAyOjI1OjUxICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNyYy5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNyYy5oOgorCSAgc3BsaXRtdXhzcmM6IFN0b3JlIHNlZWsgc2VxbnVtIGFuZCBzZW5kIGl0IG9uIEVPUyAvIHNlZ21lbnQgZXZlbnRzLgorCSAgR0VTIHJlbGllcyBvbiB0aGUgRU9TIGV2ZW50IGhhdmluZyB0aGUgc2VxbnVtIG9mIHRoZSBzZWVrIHRoYXQKKwkgIGNhdXNlZCBpdC4KKworMjAxNi0xMS0wMiAwMjoyNTowMCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkgIHNwbGl0bXV4c3JjOiBGb3J3YXJkIGEgbm90LWxpbmtlZCBlcnJvciBvbiB0aGUgYnVzCisJICBIYW5kbGUgbm90LWxpbmtlZCBhcyBmb3Igb3RoZXIgZmF0YWwgZXJyb3JzIGFuZCBwb3N0IGl0CisJICBvbnRvIHRoZSBidXMgc28gdGhlIGFwcCBrbm93cworCisyMDE2LTExLTAxIDIxOjAwOjE1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBjb21waWxlciB3YXJuaW5nCisJICBxdGRlbXV4LmM6IEluIGZ1bmN0aW9uIOKAmHF0ZGVtdXhfcGFyc2VfdHJlZeKAmToKKwkgIHF0ZGVtdXguYzoxMDEzOToxNjogZXJyb3I6IOKAmGNvbG9yX3RhYmxlX2lk4oCZIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbiBbLVdlcnJvcj1tYXliZS11bmluaXRpYWxpemVkXQorCSAgaWYgKGNvbG9yX3RhYmxlX2lkICE9IDApIHsKKwkgIF4KKwkgIHF0ZGVtdXguYzoxMDEyMToxOTogbm90ZTog4oCYY29sb3JfdGFibGVfaWTigJkgd2FzIGRlY2xhcmVkIGhlcmUKKwkgIGd1aW50MTYgY29sb3JfdGFibGVfaWQ7CisJICBefn5+fn5+fn5+fn5+fgorCisyMDE2LTEwLTIwIDE3OjQwOjU5ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogVXNlIGEgZGVmYXVsdCBpbnRlcmxlYXZlIG9mIDI1MG1zIGZvciBhbGwgY29kZWNzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczMjE3CisKKzIwMTYtMTAtMTkgMTQ6MzM6MzMgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBVc2UgYSBkZWZhdWx0IGludGVybGVhdmUgd2hlbiBQcm9SZXMgaXMgdXNlZAorCSAgVGhlIFByb1JlcyBndWlkZWxpbmVzIHN1Z2dlc3QgYW4gaW50ZXJsZWF2ZSBvZiAwLjVzIGlzIGNvbW1vbiwgYnV0CisJICBzcGVjaWZpZXMgdGhhdCBmb3IgUHJvUmVzIGF0IG1vc3QgMk1CIChmb3IgU0QpIGFuZCA0TUIgKGZvciBIRCkgc2hvdWxkCisJICBiZSB1c2VkIHBlciBjaHVuay4KKwkgIEl0IG1pZ2h0IGFsc28gbWFrZSBzZW5zZSB0byB1c2Ugc2ltaWxhciBudW1iZXJzIGluIGdlbmVyYWwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczMjE3CisKKzIwMTYtMTAtMTkgMTQ6MjU6MjggKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBBbGxvdyBjb25maWd1cmluZyB0aGUgaW50ZXJsZWF2ZSBzaXplIGluIGJ5dGVzL3RpbWUKKwkgIFByZXZpb3VzbHkgd2Ugd2VyZSBzd2l0Y2hpbmcgZnJvbSBvbmUgY2h1bmsgdG8gYW5vdGhlciBvbiBldmVyeSBzaW5nbGUKKwkgIGJ1ZmZlci4gVGhpcyB3YXN0ZXMgc29tZSBzcGFjZSBpbiB0aGUgaGVhZGVycyBhbmQsIGRlcGVuZGluZyBvbiB0aGUKKwkgIHNvZnR3YXJlLCBtaWdodCBkZXBlbmQgaW4gbW9yZSByZWFkcyAoZS5nLiBpZiB0aGUgc29mdHdhcmUgaXMgcmVhZGluZworCSAgbXVsdGlwbGUgc2FtcGxlcyBpbiBvbmUgZ28gaWYgdGhleSdyZSBpbiB0aGUgc2FtZSBjaHVuaykuCisJICBUaGUgUHJvUmVzIGd1aWRlbGluZXMgc3VnZ2VzdCBhbiBpbnRlcmxlYXZlIG9mIDAuNXMgaXMgY29tbW9uLCBidXQKKwkgIHNwZWNpZmllcyB0aGF0IGZvciBQcm9SZXMgYXQgbW9zdCAyTUIgKGZvciBTRCkgYW5kIDRNQiAoZm9yIEhEKSBzaG91bGQKKwkgIGJlIHVzZWQgcGVyIGNodW5rLiBUaGlzIHdpbGwgYmUgaGFuZGxlZCBpbiBhIGZvbGxvdy11cCBjb21taXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczMjE3CisKKzIwMTYtMDktMzAgMTg6MjI6MjcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBTZXQgY29tcHJlc3NvciBuYW1lLCBob3Jpem9udGFsL3ZlcnRpY2FsIHJlc29sdXRpb24gYW5kIGRlcHRoIGZvciBQcm9SZXMKKwkgIFRoaXMgaXMgYWxzbyByZXF1aXJlZCBieSBzb21lIHNvZnR3YXJlIHRvIGhhbmRsZSBQcm9SZXMgZmlsZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5MDQ4CisKKzIwMTYtMDktMzAgMTg6MDU6MzggKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZm91cmNjLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0OiBBZGQgc3VwcG9ydCBmb3IgUHJvUmVzIDQ0NDQgWFEKKwkgIEFuZCBhbHNvIDQ0NDQgaW4gdGhlIG11eGVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTA0OAorCisyMDE2LTA5LTMwIDE3OjU4OjM3ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmM6CisJICBxdG11eDogV3JpdGUgJ2NsYXAnIGF0b20gZm9yIFByb1JlcworCSAgSXQncyByZXF1aXJlZCBmb3IgUHJvUmVzIHRvIHdvcmsgd2l0aCBvdGhlciBzb2Z0d2FyZS4KKwkgIEl0IGlzIGFsc28gaW4gdGhlIE1QNCBzdGFuZGFyZCwgYnV0IGludmVudGluZyB2YWx1ZXMgaGVyZSBzZWVtcyBhIGJpdAorCSAgdHJpY2t5IGZvciB0aGUgZ2VuZXJhbCBjYXNlIGFuZCBpdCBkb2VzIG5vdCByZWFsbHkgZ2l2ZSBhbnkgZXh0cmEKKwkgIGluZm9ybWF0aW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTA0OAorCisyMDE2LTA5LTMwIDA5OjU1OjU4ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFJlYWQgY29sb3JpbWV0cnkgaW5mb3JtYXRpb24gZnJvbSBjb2xyIGF0b20gaWYgYXZhaWxhYmxlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyMTgxCisKKzIwMTYtMDktMjkgMjE6NTY6MTggKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvYXRvbXMuaDoKKwkqIGdzdC9pc29tcDQvZm91cmNjLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogQWx3YXlzIHdyaXRlIGNvbHIgYXRvbSB3aXRoIHRoZSBjb2xvcmltZXRyeSBpbmZvcm1hdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MjE4MQorCisyMDE2LTA5LTI5IDE4OjE2OjE4ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogRml4IHdyaXRpbmcgb2YgdGhlICdmaWVsJyBleHRlbnNpb24gYXRvbQorCSAgVGhpcyB3YXMgYWxzbyB3cm9uZyBmb3IgSlBFRzIwMDAuIEFsc28gd3JpdGUgaXQgZm9yIGFsbCBNT1YgZmlsZXMgYW5kCisJICBKUEVHMjAwMCwgbm90IG9ubHkgZm9yIFByb1Jlcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjkwNDgKKworMjAxNi0wOS0yOSAxNzo0MDoyMyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSAgcXRtdXg6IFdyaXRlIDQgYnl0ZXMgb2YgemVyb2VzIGF0IHRoZSBlbmQgb2YgdGhlIHNhbXBsZSBkZXNjcmlwdGlvbiBleHRlbnNpb25zCisJICBUaGlzIGlzIHdvcmtpbmcgYXJvdW5kIHNvbWUgYnJva2VuIHNvZnR3YXJlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTA0OAorCisyMDE2LTA5LTI4IDIwOjU1OjI0ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJICBhdG9tczogJ3Bhc3AnIGF0b20gaXMgYWxzbyBwYXJ0IG9mIE1QNCwgd3JpdGUgaXQgYWx3YXlzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5MDQ4CisKKzIwMTYtMDctMTEgMTk6MzA6MTIgKzAzMDAgIFZpdmlhIE5pa29sYWlkb3UgPHZpdmlhQGFoaXJ1LmV1PgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IFdyaXRlIGFkZGl0aW9uYWwgYXRvbXMgZm9yIHByb3JlcyB2aWRlbworCSAgVGhlc2UgcmVxdWlyZWQgYXRvbXMgYXJlOiBjb2xvcmltZXRyeSwgZmllbGQgaW5mb3JtYXRpb24sIHNwYXRpYWwvdGVtcG9yYWwKKwkgIHF1YWxpdHksIGFuZCB2ZW5kb3IuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5MDQ4CisKKzIwMTQtMDYtMTYgMTc6MjA6MzIgKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW4uc2VsbmVzQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkgIHJ0cGgyNjNkZXBheTogRG9uJ3QgZHJvcCBtb2RlIGIgcGFja2V0cyB3aXRoIHBpY3R1cmUgc3RhcnQgY29kZQorCSAgU29tZSBidWdneSBwYXlsb2FkZXJzLCBlLmcuIHJ0cGgyNjNwYXksIG1heSB1c2UgbW9kZSBCIGZvciBwYWNrZXRzCisJICB0aGF0IHN0YXJ0cyB3aXRoIGEgcGljdHVyZSAob3IgR09CKSBzdGFydCBjb2RlIGFsdGhvdWdoIGl0J3Mgbm90CisJICBhbGxvd2VkLiBMZXQncyBiZSBuaWNlIGFuZCBub3QgZHJvcCB0aGVzZSBwYWNrZXRzL2ZyYW1lcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzM1MTYKKworMjAxNi0wNi0yMiAxMzo1OTozNSArMDIwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBoMjYzLmM6CisJICBydHBoMjYzcHBheTogRml4IGNhcHMgbGVhaworCSAgRml4IGxlYWtpbmcgY2FwcyB3aGVuIGRvd25zdHJlYW0gaGFzIG5vdC1maXhlZCBjYXBzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzUxNQorCisyMDE2LTEwLTI2IDE2OjQyOjE5ICswMjAwICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJICBydHBoMjYzcGF5OiBGaXggaW5kZW50YXRpb24KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzM1MTQKKworMjAxNi0xMC0xOCAxMTozNTo1OCArMDIwMCAgU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgcnRwaDI2M3BheTogVXNlIEdTVF9UUkFDRV9PQkpFQ1QgZm9yIGxvZ2dpbmcgYml0c3RyZWFtIHBhcnNpbmcKKwkgIEJ1bXAgdGhlIGJpdHN0cmVhbSBwYXJzaW5nIHRvIFRSQUNFIGxvZyBsZXZlbCBzbyBpdCBkb2Vzbid0IGZsb29kIHRoZQorCSAgb3V0cHV0IHdoZW4gdHJ5aW5nIHRvIHJlYWQgdGhlIG1vcmUgdXNlZnVsIERFQlVHIGFuZCBMT0cgbWVzc2FnZXMuCisJICBBbHNvIHVzZSBHU1RfREVCVUdfT0JKRUNUIGluc3RlYWQgb2YgR1NUX0RFQlVHIGluIHZhcmlvdXMgcGxhY2VzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczNTE0CisKKzIwMTYtMTAtMTggMTE6MDk6MTAgKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgIHJ0cGgyNjNwYXk6IEZpeCBsZWFrIGZvciBCLWZyYWdtZW50cworCSAgQWx0b3VnaCBjb21taXRzIDZhMTZiZTcsIDY0ZjlkMDggYW5kIDBjN2UzYTggZml4ZWQgc29tZSBpc3N1ZXMgdGhleQorCSAgaW50cm9kdWNlZCBvdGhlcnMuIFRoaXMgcGF0Y2ggZml4ZXMgdGhlIGxlYWsgb2Ygb25lIG1hY3JvYmxvY2sgZm9yIGV2ZXJ5CisJICBCIGZyYWdtZW50LgorCSAgTWFjcm9ibG9jayBzdHJ1Y3R1cmVzIG11c3Qgbm90IGJlIGZyZWVkIGltbWVkaWF0ZWx5IGFmdGVyIGZpbmRpbmcgdGhlCisJICBib3VuZGFyaWVzIGFzIHRoZXkgYXJlIHN0b3JlZCBhbmQgdXNlZCBsYXRlci4gSG93ZXZlciB0aGUgaW5pdGFsIGR1bW15CisJICBzdHJ1Y3R1cmUgKHVzZWQgZm9yIGZpbmRpbmcgdGhlIGZpcnN0IGJvdW5kYXJ5KSBtdXN0IGJlIGZyZWVkLgorCSAgQ0lEICMxMjEyMTU2CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczNTEyCisKKzIwMTYtMTAtMjAgMTM6MTQ6MTMgKzAyMDAgIEFsZWphbmRybyBHLiBDYXN0cm8gPGFsZXhAaWdhbGlhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwYmluOiBhdm9pZCBnZW5lcmF0aW5nIGVycm9ycyB3aGVuIHJ0Y3AgbWVzc2FnZXMgYXJlIGVtcHR5IGFuZCBjaGVjayB0aGUgcXVldWUgaXMgbm90IGVtcHR5CisJICBBZGQgYSBjaGVjayB0byB2ZXJpZnkgYWxsIHRoZSBvdXRwdXQgYnVmZmVycyB3ZXJlIGVtcHR5IGZvciB0aGUKKwkgIHNlc3Npb24gaW4gYSB0aW1vdXQgYW5kIGxvZyBhbiBlcnJvci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzMyNjkKKworMjAxNi0xMC0yNiAxMzoyMToyOSArMDIwMCAgQWxlamFuZHJvIEcuIENhc3RybyA8YWxleEBpZ2FsaWEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBiaW46IHBpcGVsaW5lIGdldHMgYW4gRU9TIHdoZW4gYW55IHJ0cHNvdXJjZXMgYnllcworCSAgSW5zdGVhZCBvZiBzZW5kaW5nIEVPUyB3aGVuIGEgc291cmNlIGJ5ZXMgd2UgaGF2ZSB0byB3YWl0IGZvcgorCSAgYWxsIHRoZSBzb3VyY2VzIHRvIGJlIGdvbmUsIHdoaWNoIG1lYW5zIHRoZXkgYWxyZWFkeSBzZW50IEJZRSBhbmQKKwkgIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXNzaW9uLiBXZSBub3cgaGFuZGxlIHRoZSBFT1MgaW4gdGhlIHJ0Y3AKKwkgIGxvb3AgY2hlY2tpbmcgdGhlIGFtb3VudCBvZiBzb3VyY2VzIGluIHRoZSBzZXNzaW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzIxOAorCisyMDE2LTEwLTIxIDE3OjMxOjAwICswMDAwICBNYXR0IFN0YXBsZXMgPHN0YXBsZXMyNTVAZ21haWwuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBBbHNvIGhhbmRsZSByZWRpcmVjdCBvbiBQTEFZCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyNjEwCisKKzIwMTYtMDgtMzAgMTA6MjQ6NDMgKzAyMDAgIFBldHIgS3VsaGF2eSA8YnJhaW5Aamlrb3MuY3o+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGFsbG93IG1pc3NpbmcgY29udHJvbCBhdHRyaWJ1dGUgaW4gY2FzZSBvZiBhIHNpbmdsZSBzdHJlYW0KKwkgIEltcHJvdmUgUkZDMjMyNiAtIGNoYXB0ZXIgQy4zIGNvbXBhdGliaWxpdHk6CisJICBJbiBjYXNlIGp1c3QgYSBzaW5nbGUgc3RyZWFtIGlzIHNwZWNpZmllZCBpbiBTRFAgYW5kIHRoZSBjb250cm9sIGF0dHJpYnV0ZQorCSAgaXMgbWlzc2luZyBkbyBub3QgZHJvcCB0aGUgc3RyZWFtIGJ1dCByYXRoZXIgYXNzdW1lICJhPWNvbnRyb2w6KiIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzA1NjgKKworMjAxNi0xMC0wOCAxODoxMToxNyArMDIwMCAgV2lsbGlhbSBNYW5sZXkgPHdpbGxAd2lsbGlhbW1hbmxleS5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYzoKKwkgIHY0bDI6IFdhcm4sIGRvbid0IGFzc2VydCBpZiB2NGwgZ2l2ZXMgdXMgYSBidWZmZXIgd2l0aCBhIHRvbyBsYXJnZSBzaXplCisJICBJJ3ZlIHNlZW4gcHJvYmxlbXMgd2hlcmUgdGhlIGBieXRlc3VzZWRgIGZpZWxkIG9mIGB2NGwyX2J1ZmZlcmAgd291bGQgYmUKKwkgIGEgc2lsbHkgbnVtYmVyIGNhdXNpbmcgdGhlIGxhdGVyIGNhbGwgdG86CisJICBnc3RfbWVtb3J5X3Jlc2l6ZSAoZ3JvdXAtPm1lbVtpXSwgMCwgZ3JvdXAtPnBsYW5lc1tpXS5ieXRlc3VzZWQpOworCSAgdG8gcmVzdWx0IGluIHRoaXMgZXJyb3IgdG8gYmUgcHJpbnRlZDoKKwkgIChwdWxzZXZpZGVvOjExKTogR1N0cmVhbWVyLUNSSVRJQ0FMICoqOiBnc3RfbWVtb3J5X3Jlc2l6ZTogYXNzZXJ0aW9uICdzaXplICsgbWVtLT5vZmZzZXQgKyBvZmZzZXQgPD0gbWVtLT5tYXhzaXplJyBmYWlsZWQKKwkgIGJlc2lkZXMgY2F1c2luZyB3aG8ta25vd3Mgd2hhdCBvdGhlciBwcm9ibGVtcy4KKwkgIFdlIG1ha2UgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGJ1ZmZlciBoYXMgc3RpbGwgYmVlbiBkZXF1ZXVlZCBjb3JyZWN0bHkKKwkgIHNvIGp1c3QgY2xhbXAgdG8gYSB2YWxpZCBzaXplIHNvIGRvd25zdHJlYW0gZWxlbWVudHMgd29uJ3QgZW5kIHVwIGluCisJICB1bmRlZmluZWQgYmVoYXZpb3VyLgorCSAgVGhlIGludmFsaWQgYHY0bDJfYnVmZmVyYCBJIHNhdyBmcm9tIG15IGNhcHR1cmUgZGV2aWNlIHdhczoKKwkgIGJ1ZmZlciA9IHsKKwkgIGluZGV4ID0gMCwKKwkgIHR5cGUgPSAxLAorCSAgYnl0ZXN1c2VkID0gNTM0NzQ4OTI4LCAvLyA8LSBJbnZhbGlkCisJICBmbGFncyA9IDgyNjAsIC8vIFY0TDJfQlVGX0ZMQUdfVElNRVNUQU1QX01PTk9UT05JQyB8IFY0TDJfQlVGX0ZMQUdfRVJST1IgfCBWNEwyX0JVRl9GTEFHX0RPTkUKKwkgIGZpZWxkID0gMDEzMzAsIC8vIDwtIEludmFsaWQKKwkgIHRpbWVzdGFtcCA9IHsKKwkgIHR2X3NlYyA9IDAsCisJICB0dl91c2VjID0gMAorCSAgfSwKKwkgIHRpbWVjb2RlID0geworCSAgdHlwZSA9IDAsCisJICBmbGFncyA9IDAsCisJICBmcmFtZXMgPSAwICdcMDAwJywKKwkgIHNlY29uZHMgPSAwICdcMDAwJywKKwkgIG1pbnV0ZXMgPSAwICdcMDAwJywKKwkgIGhvdXJzID0gMCAnXDAwMCcsCisJICB1c2VyYml0cyA9ICJcMDAwXDAwMFwwMDAiCisJICB9LAorCSAgc2VxdWVuY2UgPSAwLAorCSAgbWVtb3J5ID0gMiwKKwkgIG0gPSB7CisJICBvZmZzZXQgPSAzNTM3MjE5NTg0LAorCSAgdXNlcnB0ciA9IDE0MDcwNjY2NTgzNjU0NCwgLy8gQ291bGQgYmUgbm9uc2Vuc2UsIG5vdCBzdXJlCisJICBwbGFuZXMgPSAweDdmZjhkMmQ1YjAwMCwKKwkgIGZkID0gLTc1Nzc0NzcxMgorCSAgfSwKKwkgIGxlbmd0aCA9IDI3NjQ4MDAsCisJICByZXNlcnZlZDIgPSAwLAorCSAgcmVzZXJ2ZWQgPSAwCisJICB9CisJICBUaGlzIGlzIGZyb20gZ2RiIHdpdGggbXkgb3duIGFubm90YXRpb25zIGFkZGVkLgorCSAgVGhpcyB3YXMgd2l0aCBnc3QtcGx1Z2lucy1nb29kIDEuOC4xLCBhIE1hZ2V3ZWxsIFhJMTAwRFVTQi1IRE1JIHZpZGVvCisJICBjYXB0dXJlIGRldmljZSBhbmQga2VybmVsIDMuMTMgdXNpbmcgYSBkb2RneSBIRE1JIGNhYmxlIHdoaWNoIGlzIGdyZWF0IGF0CisJICBicmVha2luZyBIRE1JIGNhcHR1cmUgZGV2aWNlcy4gIEknbSB1c2luZyBpby1tb2RlPXVzZXJwdHIgYW5kIGhhdmUgYnVpbHQKKwkgIGdzdC1wbHVnaW5zLWdvb2Qgd2l0aG91dCBsaWJ2NGwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5NzY1CisKKzIwMTYtMTAtMjAgMjA6NDE6MDcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBVc2UgYSBiZXR0ZXIgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIG1vdmllIGhlYWRlciB0aW1lc2NhbGUKKwkgIFRha2UgdGhlIG1heGltdW0gdmlkZW8gdGltZXNjYWxlLCBvciBpZiBubyB2aWRlbyB0cmFjayBpcyBwcmVzZW50IHRoZQorCSAgcHJldmlvdXMgdmFsdWUgb2YgMTgwMC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjkwNDEKKworMjAxNi0xMC0yMCAyMDowNzoxOSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IEJlIG1vcmUgY2xldmVyIHdpdGggdGhlIGRlZmF1bHQgdmlkZW8gdHJhY2sgdGltZXNjYWxlCisJICBVc2UgdGhlIG51bWJlciBvZiBtaWxsaWZyYW1lcyBwZXIgc2Vjb25kIGZvciBpbnRlZ3JhbCBhbmQgZHJvcC1mcmFtZQorCSAgZnJhbWVyYXRlcywgYXMgc3VnZ2VzdGVkIGJ5IHRoZSBRVCBmaWxlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGFuZCBvdGhlcgorCSAgcGxhY2VzLiBXZSBhbHJlYWR5IGRpZCB0aGF0IGZvciBpbnRlZ3JhbCBmcmFtZXJhdGVzIGJlZm9yZSwgYnV0IG5vdCBmb3IKKwkgIGRyb3AtZnJhbWUgZnJhbWVyYXRlcy4gVGhpcyBub3cga2VlcHMgcHJlY2lzaW9uIGJldHRlci4KKwkgIEZvciBhbGwgb3RoZXIgZnJhbWVyYXRlcywgY2hlY2sgaWYgaXQncyBjbG9zZSB0byBhIHdlbGwta25vd24gZnJhbWVyYXRlCisJICBhbmQgdXNlIHRoYXQgaW5zdGVhZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjkwNDEKKworMjAxNi0xMC0xMCAxMzowMDowMSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZXh0cmFjdCBpbnRlcmxhY2VkIGluZm9ybWF0aW9uIGZyb20ganBlZyB2aWRlbworCSAgVGhpcyBpbmZvcm1hdGlvbiBpcyBoaWRkZW4gaW4gYSBzbWFsbCBjaHVuayBvZiBkYXRhLgorCSAgRm9ybWF0IGZvdW5kIGF0IGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9zdGFuZGFyZHMvcXRmZi0yMDAxLnBkZiwKKwkgIHBhZ2UgOTIsICJWaWRlbyBTYW1wbGUgRGVzY3JpcHRpb24iLCB1bmRlciB0YWJsZSAzLjEuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY3NzcxCisKKzIwMTYtMTAtMjYgMTI6NDY6MjggKzA1MzAgIEphZ2FkaXNoIDxqYWdhZGlzaGthbWF0aGtAZ21haWwuY29tPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJICBnZGtwaXhidWZvdmVybGF5OiBGaXhpbmcgeCBhbmQgeSBvZmZzZXQgY29tcHV0YXRpb24KKwkgIFdoaWxlIGNvbXB1dGluZyB0aGUgeCBhbmQgeSBvZmZzZXRzLCBpdCdzIHRoZSB2aWRlbyByZXNvbHV0aW9uIGFuZAorCSAgcmVzaXplZCBvdmVybGF5IHJlc29sdXRpb24gdG8gYmUgdXNlZCBpbnN0ZWFkIG9mIGFjdHVhbCBvdmVybGF5IGltYWdlCisJICByZXNvbHR1aW9uLiBEdWUgdG8gdGhpcywgdGhlIG92ZXJsYXkgaW1hZ2UgdXNlZCB0byBnZXQgd3JvbmdseSBvdmVybGF5ZWQKKwkgIGluIHVuZGVzaXJlZCBsb2NhdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NzI5MgorCisyMDE2LTExLTAxIDE4OjA5OjAwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkgIG1lc29uOiB1cGRhdGUgdmVyc2lvbgorCisyMDE2LTEwLTI0IDE2OjU2OjMxICswMDAwICBFbnJpcXVlIE9jYcOxYSBHb256w6FsZXogPGVvY2FuaGFAaWdhbGlhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBVc2UgdGhlIHRmZHQgZGVjb2RlIHRpbWUgb24gYnl0ZSBzdHJlYW1zIHdoZW4gaXQncyBzaWduaWZpY2FudGx5IGRpZmZlcmVudCB0aGFuIHRoZSB0aW1lIGluIHRoZSBsYXN0IHNhbXBsZQorCSAgV2UgY29uc2lkZXIgdGhlcmUncyBhIHNpZm5pZmljYW50IGRpZmZlcmVuY2Ugd2hlbiBpdCdzIGxhcmdlciB0aGFuIG9uIHNlY29uZAorCSAgb3IgdGhhbiBoYWxmIHRoZSBkdXJhdGlvbiBvZiB0aGUgbGFzdCBwcm9jZXNzZWQgZnJhZ21lbnQgaW4gY2FzZSB0aGUgbGF0dGVyIGlzCisJICBsYXJnZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU0MjMwCisKKz09PSByZWxlYXNlIDEuMTEuMCA9PT0KKworMjAxNi0xMS0wMSAxODo1MzoxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjEwLjAgPT09CisKKzIwMTYtMTEtMDEgMTc6NTc6NDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjEwLjAKKworMjAxNi0xMS0wMSAxNzo0NzozMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNi0xMS0wMSAxNzo0MTo1MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vZWwucG86CisJICBwbzogVXBkYXRlIHRyYW5zbGF0aW9ucworCisyMDE2LTEwLTI3IDEyOjAxOjU1ICswMjAwICBUb2JpYXMgU2NobmVpZGVyIDx0b2JpYXMuc2NobmVpZGVyQHZvaWNlaW50ZXJjb25uZWN0LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBmaXggZXh0cmEtY29udHJvbHMgbGVhaworCSAgR3N0IHN0cnVjdCB2NGwyb2JqZWN0LT5leHRyYV9jb250cm9scyBpcyBjcmVhdGVkIGlmIHVzZXIgc2V0cyBhcHByb3ByaWF0ZQorCSAgb3B0aW9uIGJ1dCBpdCBpcyBub3QgZnJlZWQgb24gZGVzdHJ1Y3Rpb24gb2YgdjRsMm9iamVjdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzM1ODAKKworMjAxNi0xMC0zMSAxODowMDowNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJICBSZXZlcnQgInNvdXBodHRwc3JjOiByZWR1Y2UgcmVhZGluZyBsYXRlbmN5IGJ5IHVzaW5nIG5vbi1ibG9ja2luZyByZWFkIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCA4ODE2NzY0MTEyNDA4NzY2ODg5YzhiNjgwYTNhZjUxMTE1ZGY0YmY1LgorCSAgSXQgY2F1c2VzIGlzc3VlcyB3aXRoIHRoZSB0aW1lb3V0cywgYW5kIGNhdXNlcyBjb25uZWN0aW9ucyB0byBiZSBjbG9zZWQKKwkgIHdpdGhvdXQgYWN0dWFsIHJlYXNvbi4gTmVlZHMgZnVydGhlciBpbnZlc3RpZ2F0aW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzUwOQorCisyMDE2LTEwLTMxIDA5OjAwOjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBEb24ndCB0cnkgdG8gYWRkIHNyY3BhZCBpZiB3ZSBkb24ndCBrbm93IHZhbGlkIGNhcHMgeWV0CisJICBPdGhlcndpc2Ugd2UnbGwgcnVuIGludG8gYW4gYXNzZXJ0aW9uIG9uIHNwZWNpYWxseSBjcmFmdGVkIGZpbGVzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzY0MworCisyMDE2LTEwLTI3IDExOjIzOjUxICswNTMwICBOaXJiaGVlayBDaGF1aGFuIDxuaXJiaGVla0BjZW50cmljdWxhci5jb20+CisKKwkqIG1lc29uLmJ1aWxkOgorCSAgbWVzb246IFJlbW92ZSB1c2VsZXNzbHkgZHVwbGljYXRlZCBkZXAgY2hlY2tzCisJICBUaGVzZSBjaGVja3MgYXJlIGRvbmUgaW5zaWRlIHRoZSBtZXNvbi5idWlsZCBmaWxlcyBmb3IgZWFjaCBwbHVnaW4uCisKKzIwMTYtMTAtMjcgMTE6MjI6NTkgKzA1MzAgIE5pcmJoZWVrIENoYXVoYW4gPG5pcmJoZWVrQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L21lc29uLmJ1aWxkOgorCSAgbWVzb246IGR2IHBsdWdpbiBub3cgd29ya3Mgb24gTVNWQworCSAgTmVlZHMgYSBNZXNvbiBwYXRjaCB0byBmaWx0ZXIgb3V0IHRoZSB1c2VsZXNzIC1scHRocmVhZAorCSAgaHR0cHM6Ly9naXRodWIuY29tL21lc29uYnVpbGQvbWVzb24vcHVsbC85NjIKKworMjAxNi0xMC0yNyAxNDowMzo0OCArMDIwMCAgQnJhbmtvIFN1YmFzaWMgPGJyYW5rb0BheGlzLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGFsbG93IHJlc29sdXRpb25zIGFib3ZlIDQwOTYKKwkgIE1vZGlmeSB0aGUgY2FwcyBzdHJpbmcgdG8gYWxsb3cgd2lkdGggYW5kIGhlaWdodCBncmVhdGVyIHRoYW4gNDA5Ni4KKwkgIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzdHJpY3QgaXQgc2luY2UgdGhlIG1hdHJvc2thIGZvcm1hdCBhbGxvd3MgdGhlCisJICB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyB0byBiZSB1cCB0byBlaWdodCBieXRlcyBsb25nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzU4MgorCisyMDE2LTEwLTIzIDE3OjIzOjEwIC0wNzAwICBTY290dCBEIFBoaWxsaXBzIDxzY290dC5kLnBoaWxsaXBzQGludGVsLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogQ2hlY2sgZm9yIEdfUExBVEZPUk1fV0lOMzIgZm9yIHByZXNlbmNlIG9mIGlwaV9zcGVjX2Rlc3QKKwkgIEdfT1NfV0lOMzIgaXMgb25seSBzZXQgd2hlbiBub3QgYnVpbGRpbmcgd2l0aCBjeWd3aW4sIGJ1dAorCSAgaXBpX3NwZWNfZGVzdCBpcyBtaXNzaW5nIGJvdGggd2l0aCBhbmQgd2l0aG91dCBjeWd3aW4uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczMTE0CisKKzIwMTYtMTAtMjYgMDg6NTE6NDAgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IHJlc2V0IHJlYWRfcG9zaXRpb24gd2hlbiByZWFkaW5nIGZhaWxzCisJICBzb3VwaHR0cHNyYyBtYWludGFpbnMgdHdvIHZhcmlhYmxlcyBmb3IgdGhlIHBvc2l0aW9uOgorCSAgKiAncmVxdWVzdF9wb3NpdGlvbicgaXMgd2hlcmUgd2Ugd2FudCB0byBiZQorCSAgKiAncmVhZF9wb3NpdGlvbicgaXMgd2hlcmUgd2UgYXJlCisJICBEdXJpbmcgTm9ybWFsIG9wZXJhdGlvbnMgYm90aCBhcmUgdXBkYXRlZCBpbiBzeW5jIHdoZW4gZGF0YSBhcnJpdmVzLiBBIHNlZWsKKwkgIGNoYW5nZXMgJ3JlcXVlc3RfcG9zaXRpb24nIGJ1dCBub3QgJ3JlYWRfcG9zaXRpb24nLgorCSAgV2hlbiB0aGUgdHdvIHBvc2l0aW9ucyBnZXQgb3V0IG9mIHN5bmMsIHRoZW4gYSBuZXcgcmVxdWVzdCBpcyBzZW5kIGFuZCB0aGUKKwkgICdSYW5nZScgaGVhZGVyIGlzIGFkanVzdGVkIHRvIHRoZSBjdXJyZW50ICdyZXF1ZXN0X3Bvc2l0aW9uJy4KKwkgIFdpdGhvdXQgdGhpcyBwYXRjaCwgaWYgcmVhZGluZyBmYWlscywgdGhlbiB0aGUgc291cmNlIGlzIGRlc3Ryb3llZC4gVGhpcworCSAgdHJpZ2dlcnMgYSBuZXcgcmVxdWVzdCwgYnV0IHRoZSByYW5nZSByZW1haW5zIHVuY2hhbmdlZC4gQXMgYSByZXN1bHQsIHRoZQorCSAgb2xkIHJhbmdlIGlzIHVzZWQgYW5kIG9sZCBkYXRhIHdpbGwgYmUgcmVhZC4KKwkgIENoYW5naW5nIHRoZSAncmVhZF9wb3NpdGlvbicgdG8gLTEgbWFrZXMgaXQgZXhwbGljaXRseSBkaWZmZXJlbnQgZnJvbQorCSAgJ3JlcXVlc3RfcG9zaXRpb24nIGFuZCBhcyBhIHJlc3VsdCB0aGUgJ1JhbmdlJyBoZWFkZXIgaXMgdXBkYXRlZCBjb3JyZWN0bHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczNTA5CisKKzIwMTYtMTAtMjUgMDg6NTQ6MzQgLTA3MDAgIFNjb3R0IEQgUGhpbGxpcHMgPHNjb3R0LmQucGhpbGxpcHNAaW50ZWwuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkgIG1lc29uOiBEb24ndCBkZXBlbmQgb24gZ3N0cmVhbWVyLWNoZWNrLTEuMCBvbiB3aW5kb3dzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczMTE0CisKKzIwMTYtMTAtMjUgMTU6MjQ6MjAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcmVzZXQgY29ubmVjdGlvbiBpbmZvIHRvIG5vbi1mbHVzaGluZyB3aGVuIGNsb3NpbmcKKwkgIFRoaXMgc29sdmVzIGEgaGFuZ2luZyBtYWlubG9vcCBpbiBmb2xsb3dpbmcgc2NlbmFyaW86CisJICAqIGNvbm5lY3QgdG8gc291cmNlCisJICAqIG5ldHdvcmsvc2VydmVyIGRyb3BzCisJICAqIHBpcGVsaW5lIHNldCB0byBOVUxMIChhbmQgY29ubmVjdGlvbiB0byBmbHVzaGluZyBhcyBwYXJ0KQorCSAgKiBwaXBlbGluZSBzZXQgdG8gUEFVU0VEL1BMQVlJTkcgKGNvbm5lY3Rpb24gdG8gbm9uLWZsdXNoaW5nLCBidXQgbm90IHJlY29yZGVkKQorCSAgKiBbY29ubmVjdGluZyBzdGlsbCBub3QgcG9zc2libGVdCisJICAqIHBpcGVsaW5lIHNldCB0byBOVUxMID0+IG1haW5sb29wIGhhbmdzIChzaW5jZSBubyBhY3R1YWwgZmx1c2hpbmcgaXMgZG9uZSkKKworMjAxNi0xMC0yNiAxNDozMjo0OCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgc3BsaXRtdXhzaW5rOiBPbmx5IGFsbG93IG9uZSB2aWRlbyByZXF1ZXN0IHBhZAorCSAgVGhlIHBhY2luZyBvZiB0aGUgb3ZlcmFsbCBtdXhpbmcgaXMgY29udHJvbGxlZAorCSAgYnkgdGhlIHZpZGVvIEdPUHMgYXJyaXZpbmcsIHNvIHdlIGNhbiBvbmx5IGhhbmRsZQorCSAgMSB2aWRlbyBzdHJlYW0sIGFuZCB0aGUgcmVxdWVzdCBwYWQgaXMgbmFtZWQgYWNjb3JkaW5nbHkuCisJICBJZ25vcmUgYSByZXF1ZXN0IGZvciBhIDJuZCB2aWRlbyBwYWQgaWYgdGhlcmUncyBhbHJlYWR5CisJICBhbiBhY3RpdmUgb25lLgorCisyMDE2LTEwLTI2IDExOjU5OjMyICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkgIHNwbGl0bXV4c2luazogVGFrZSBvd25lcnNoaXAgb2YgZmxvYXRpbmcgcmVmcworCSAgc2luayB0aGUgZmxvYXRpbmcgcmVmIHdoZW4gaGFuZGVkIGEgbXV4ZXIgb3Igc2luayB0byB1c2Ugc28KKwkgIHdlIGNsZWFybHkgdGFrZSBvd25lcnNoaXAuCisKKzIwMTYtMTAtMjUgMTQ6NTE6NTIgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBTZXQgY2hpbGQgZWxlbWVudHMgdG8gTlVMTCB3aGVuIHJlbW92aW5nLgorCSAgTWFrZSBzdXJlIHRoYXQgZWxlbWVudHMgYXJlIGluIHRoZSBOVUxMIHN0YXRlIHdoZW4gcmVtb3ZpbmcuCisJICBGaXhlcyBjcml0aWNhbCB3YXJuaW5ncyB3aGVuIGVycm9ycyBvY2N1ciBlYXJseSBvbiBpbiBzdGFydGluZyB1cC4KKworMjAxNi0xMC0yNSAxNDo1MDo1MyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IFNldCBwYWQgdGVtcGxhdGUgb24gcmVxdWVzdCBzaW5rIHBhZHMKKwkgIEVuc3VyZSB0aGF0IHRoZSBnaG9zdCBwYWQgcmV0dXJuZWQgYXMgYSByZXF1ZXN0IHBhZAorCSAgaGFzIHRoZSB0ZW1wbGF0ZSB0aGF0IHdhcyByZXF1ZXN0ZWQKKworMjAxNi0xMC0yNSAxMDo1MDo0NyArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkqIHRlc3RzL2NoZWNrL21lc29uLmJ1aWxkOgorCSAgUmV2ZXJ0ICJtZXNvbjogbW92ZSBnc3RyZWFtZXItY2hlY2stMS4wIGRlcGVuZGVuY3kgdG8gdGVzdHMvY2hlY2siCisJICBUaGlzIHJldmVydHMgY29tbWl0IDQ2NjMyNjk0NjYyYjk2ZmRkYjg0OGExZjIwOTFhMjE1YjI4YTJkMzUuCisJICBEb2VzIG5vdCBhY3R1YWxseSB3b3JrLiBTZWU6CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzczMTE0I2MzMQorCisyMDE2LTA2LTA4IDExOjI0OjM3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IEFzc3VtZSBQVFMgaXMgRFRTIHdoZW4gUFRTIGlzIG1pc3NpbmcKKwkgIFRoaXMgZml4ZXMgaXNzdWUgZm9yIGVuY29kZXJzIHRoYXQgb25seSBzZXRzIHRoZSBEVFMuIFdlIGFzc3VtZSB0aGF0CisJICB0aGVyZSB3YXMgbm8gcmUtb3JkZXJpbmcgd2hlbiB0aGF0IGhhcHBlbnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMjA3CisKKzIwMTYtMTAtMjQgMDA6MzQ6MTUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL21lc29uLmJ1aWxkOgorCSAgbWVzb246IGZpeCBidWlsZCBvdXRzaWRlIG9mIGdzdC1hbGwKKworMjAxNi0xMC0yMSAwMDo0Mjo1NCAtMDcwMCAgU2NvdHQgRCBQaGlsbGlwcyA8c2NvdHQuZC5waGlsbGlwc0BpbnRlbC5jb20+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9tZXNvbi5idWlsZDoKKwkgIG1lc29uOiBkaXJlY3Rzb3VuZDogQWRkIG9sZTMyIGxpYnJhcnkgZGVwZW5kZW5jeQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzExNAorCisyMDE2LTEwLTIxIDAwOjQyOjE4IC0wNzAwICBTY290dCBEIFBoaWxsaXBzIDxzY290dC5kLnBoaWxsaXBzQGludGVsLmNvbT4KKworCSogbWVzb24uYnVpbGQ6CisJKiB0ZXN0cy9jaGVjay9tZXNvbi5idWlsZDoKKwkgIG1lc29uOiBtb3ZlIGdzdHJlYW1lci1jaGVjay0xLjAgZGVwZW5kZW5jeSB0byB0ZXN0cy9jaGVjaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzExNAorCisyMDE2LTEwLTIwIDIyOjA4OjE0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb21peGVyLmM6CisJICB0ZXN0czogdmlkZW9taXhlcjogZGlzYWJsZSByYWN5IGZsdXNoX3N0YXJ0X2ZsdXNoX3N0b3AgdGVzdAorCSAgSXQncyBiZWVuIGJyb2tlbiBmb3IgeWVhcnMsIGFuZCBpdCdzIHVubGlrZWx5IGl0IHdpbGwgZXZlcgorCSAgYmUgZml4ZWQgZm9yIGNvbGxlY3RwYWRzL3ZpZGVvbWl4ZXIgbm93IHRoYXQgdGhlcmUncyBjb21wb3NpdG9yCisJICB3aGljaCB3b3JrcyBmaW5lLiBTbyBsZXQncyBkaXNhYmxlIGl0LCBzaW5jZSBhbGwgaXQgZG9lcworCSAgaXMgdGhhdCBpdCBjcmVhdGVzIG5vaXNlIHRoYXQgZGlzdHJhY3RzIGZyb20gb3RoZXIgZmFpbHVyZXMuCisJICBBbHNvIHNlZSB0aGUgY29ycmVzcG9uZGluZyBhZGRlciBidWcgYXMgaXQgZmFpbGVkIGluIHRoZSBzYW1lIHdheToKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDg4OTEKKworMjAxNi0xMC0wOSAxNjo1NjoxMCArMDIwMCAgSmFuIEFsZXhhbmRlciBTdGVmZmVucyAoaGVmdGlnKSA8amFuLnN0ZWZmZW5zQGdtYWlsLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkgIHRlc3RzOiBGaXggc291cGh0dHBzcmMgdGVzdHMgd2l0aG91dCBDS19GT1JLPW5vCisJICBJdCBzZWVtcyB0aGF0IHRoZSBmb3JrZWQgcHJvY2Vzc2VzIGFsbCBhdHRlbXB0IHRvIGhhbmRsZSB0aGUgbGlzdGVuaW5nCisJICBzb2NrZXQgZnJvbSB0aGUgc2VydmVyLCBhbmQgb25seSBvbmUgaGFzIHRvIHNodXRkb3duIHRoZSBzb2NrZXQgdG8gYnJlYWsKKwkgIHRoZSBzZXJ2ZXIgY29tcGxldGVseS4KKwkgIENyZWF0ZSBhIG5ldyBzZXJ2ZXIgaW5zaWRlIGVhY2ggdGVzdCB0byBhdm9pZCB0aGlzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MjY1NgorCisyMDE2LTEwLTA5IDE1OjIzOjUxICswMjAwICBKYW4gQWxleGFuZGVyIFN0ZWZmZW5zIChoZWZ0aWcpIDxqYW4uc3RlZmZlbnNAZ21haWwuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgdGVzdHM6IEZpeCBsZXZlbCB0ZXN0IGluIENLX0ZPUks9bm8gbW9kZQorCSAgVGhlIHRlc3RzIGFjY3VtdWxhdGUgYnVmZmVycyBpbiBHc3RDaGVjaydzIGJ1ZmZlcnMgbGlzdCwgYW5kIHRoZSBsaXN0IGlzCisJICBub3QgKGNvbnNpc3RlbnRseSkgcmVzZXQgYmV0d2VlbiB0ZXN0cy4gRG8gdGhhdCBhbmQgcmVtb3ZlIHRoZSBub3cKKwkgIGNvbmZsaWN0aW5nIHVucmVmcyBmb3Igb3V0YnVmZmVycy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzI2NDQKKworMjAxNi0xMC0wNyAxMzowNDoyNyArMDUzMCAgR2F1cmF2IEd1cHRhIDxnLmd1cHRhQHNhbXN1bmcuY29tPgorCisJKiBzeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1zaW5rLmM6CisJICB3YXZlZm9ybXNpbms6IEZpeCBNZW1vcnkgbGVhayB1c2luZyBHU1RfUFRSX0ZPUk1BVAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MjQ5NworCisyMDE2LTEwLTE4IDEyOjIzOjQyICswNTMwICBOaXJiaGVlayBDaGF1aGFuIDxuaXJiaGVla0BjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tb25vc2NvcGUvbWVzb24uYnVpbGQ6CisJICBtZXNvbjogQWRkIG1pc3NpbmcgZ3N0YXVkaW8gZGVwIHRvIG1vbm9zY29wZQorCSAgSW4gZmlsZSBpbmNsdWRlZCBmcm9tIC4uL3N1YnByb2plY3RzL2dzdC1wbHVnaW5zLWdvb2QvZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYzo0MjowOgorCSAgLi4vc3VicHJvamVjdHMvZ3N0LXBsdWdpbnMtYmFzZS9nc3QtbGlicy9nc3QvYXVkaW8vYXVkaW8uaDoyNjozOTogZmF0YWwgZXJyb3I6IGdzdC9hdWRpby9hdWRpby1lbnVtdHlwZXMuaDogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorCSAgI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby1lbnVtdHlwZXMuaD4KKwkgIF4KKwkgIGNvbXBpbGF0aW9uIHRlcm1pbmF0ZWQuCisJICBodHRwczovL2NpLmdzdHJlYW1lci5uZXQvam9iL0dTdHJlYW1lci1tYXN0ZXItbWVzb24vMjcxL2NvbnNvbGUKKworMjAxNi0xMC0xNiAwMjoxODoyMiArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL21lc29uLmJ1aWxkOgorCSAgbWVzb246IEFkZCBtaXNzaW5nIHBidXRpbHMgZGVwZW5kZW5jeSB0byBtdWx0aWZpbGUKKwkgIEZvdW5kIHZpYSB0aGUgSmVua2lucyBDSToKKwkgIEZBSUxFRDogc3VicHJvamVjdHMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZUBzaGEvZ3N0c3BsaXRtdXhzaW5rLmMubworCSAgWy4uLl0KKwkgIEluIGZpbGUgaW5jbHVkZWQgZnJvbSAuLi9zdWJwcm9qZWN0cy9nc3QtcGx1Z2lucy1nb29kL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmg6MjQ6MCwKKwkgIGZyb20gLi4vc3VicHJvamVjdHMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOjU5OgorCSAgLi4vc3VicHJvamVjdHMvZ3N0LXBsdWdpbnMtYmFzZS9nc3QtbGlicy9nc3QvcGJ1dGlscy9wYnV0aWxzLmg6MzA6NDM6IGZhdGFsIGVycm9yOiBnc3QvcGJ1dGlscy9wYnV0aWxzLWVudW10eXBlcy5oOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisJICAjaW5jbHVkZSA8Z3N0L3BidXRpbHMvcGJ1dGlscy1lbnVtdHlwZXMuaD4KKwkgIF4KKwkgIGNvbXBpbGF0aW9uIHRlcm1pbmF0ZWQuCisJICBodHRwczovL2NpLmdzdHJlYW1lci5uZXQvam9iL0dTdHJlYW1lci1tYXN0ZXItbWVzb24vMjYzL2NvbnNvbGUKKworMjAxNi0xMC0xNSAyMjoxMTowOCArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkgIG1lc29uOiBEb24ndCBzZXQgY19zdGQgdG8gZ251OTkKKwkgIFVzZSB0aGUgZGVmYXVsdCBmb3IgZWFjaCBjb21waWxlciBvbiBldmVyeSBwbGF0Zm9ybSBpbnN0ZWFkLiBUaGlzCisJICBpbXByb3ZlcyBvdXIgY29tcGF0aWJpbGl0eSB3aXRoIGNvbXBpbGVycyB0aGF0IGRvbid0IGhhdmUgZ251OTkgYXMKKwkgIGEgY19zdGQuCisKKzIwMTYtMTAtMDQgMTg6MDQ6MTEgLTAzMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAb3NnLnNhbXN1bmcuY29tPgorCisJKiBtZXNvbi5idWlsZDoKKwkqIHRlc3RzL2NoZWNrL2dldHBsdWdpbnNkaXI6CisJKiB0ZXN0cy9jaGVjay9tZXNvbi5idWlsZDoKKwkgIG1lc29uOiBNYWtlIHVzZSBvZiBuZXcgZW52aXJvbm1lbnQgb2JqZWN0IGFuZCBzZXQgcGx1Z2luIHBhdGggdG8gYnVpbGRkaXIKKwkgIFdvcmthcm91bmQgc291cmNlX3Jvb3QgYmVpbmcgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIGFsbCBwcm9qZWN0cyBpbiB0aGUgc3VicHJvamVjdAorCSAgY2FzZSBhbmQgcmVtb3ZlIG5vdyB1bm5lZWRlZCBnZXRwbHVnaW5zZGlyCisJICBCdW1wIG1lc29uIHJlcXVpcmVtZW50IHRvIDAuMzUKKworMjAxNi0xMC0wNiAxMToxNTo1NCArMDUzMCAgR2F1cmF2IEd1cHRhIDxnLmd1cHRhQHNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LXJ0cGF1eC5jOgorCSAgdGVzdHM6IEZpeCBtZW1vcnkgbGVhayBpbiB0ZXN0IHJ0cGF1eCB0ZXN0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyNDk2CisKKzIwMTYtMTAtMDMgMTE6Mjc6NTQgKzA1MzAgIE5pcmJoZWVrIENoYXVoYW4gPG5pcmJoZWVrQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogRm9yd2FyZCBsYXRlbmN5IHF1ZXJpZXMgdG8gdXBzdHJlYW0KKwkgIFdpdGhvdXQgdGhpcywgbGF0ZW5jeSBxdWVyaWVzIHRvIGltYWdlZnJlZXplIHdpbGwgZmFpbC4KKworMjAxNi0wOS0zMCAxMTozNTozOSAtMDMwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGhvb2tzL3ByZS1jb21taXQuaG9vazoKKwkqIG1lc29uLmJ1aWxkOgorCSogdGVzdHMvY2hlY2svZ2V0cGx1Z2luc2RpcjoKKwkgIG1lc29uOiBTZXR1cCBwcmUgY29tbWl0IGhvb2sgYW5kIGZpeCBnZXRwbHVnaW5zZGlyIGZvciBzdGFuZGFsb25lIGNhc2UKKworMjAxNi0wOS0yOSAwNDo1NToxNCArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkgIHNwbGl0bXV4c3JjOiBIYW5kbGUgc3RvcCBwb2ludCBmcm9tIHNlZ21lbnQKKwkgIElmIHRoZSBzZWVrIHN0b3AgcG9pbnQgKG9yIHN0YXJ0LCBkdXJpbmcgcmV2ZXJzZSBwbGF5KQorCSAgd2FzIHdpdGhpbiB0aGUgc2VnbWVudCB3ZSBqdXN0IGZpbmlzaGVkLCBnbyBFT1MgaW1tZWRpYXRlbHkKKwkgIGluc3RlYWQgb2YgcHJvY2VlZGluZyB0aHJvdWdoIGFsbCBvdGhlciBwYXJ0cyBhbmQgc2VuZGluZworCSAgMCBsZW5ndGggc2Vla3MgdG8gdGhlbS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzIxMzgKKworMjAxNi0wOS0yOSAwMzoyMToyNiArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkgIHNwbGl0bXV4c3JjOiBEcm9wIGxvY2sgc2h1dHRpbmcgZG93biBwYWRzCisJICBBdm9pZCBhIHNwb3JhZGljIGRlYWRsb2NrIG9uIHNodXRkb3duIGJ5IGRyb3BwaW5nCisJICB0aGUgc3BsaXRtdXggbG9jayBhcm91bmQgcGFkIHNodXRkb3duCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyMTM4CisKKzIwMTYtMDktMjkgMDI6NDc6MzYgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4cGFydHJlYWRlci5jOgorCSAgc3BsaXRtdXhzcmM6IEZpeCBleHRyYSB1bnJlZiBoYW5kbGluZyBxdWVyaWVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyMTM4CisKKzIwMTYtMDktMjkgMDQ6NTA6MjUgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4cGFydHJlYWRlci5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuaDoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkgIHNwbGl0bXV4c3JjOiBBdm9pZCBzdGFsbCB3aGVuIHBhcnRzIGdldCBvdXQgb2Ygc3luYworCSAgV2hlbiBvbmUgcGFydCBtb3ZlcyBhaGVhZCBvZiB0aGUgb3RoZXJzIC0gZHVlIHRvIGV4Y2Vzc2l2ZQorCSAgZG93bnN0cmVhbSBxdWV1ZWluZywgb3IgcmVhbGx5IHNtYWxsIGlucHV0IGZpbGVzIC0gdGhlbgorCSAgd2UgY2FuIGVuZCB1cCBhY3RpdmF0aW5nIHBhcnRzIG1vcmUgdGhhbiBvbmNlLiBUaGF0IGNhbiBsZWFkIHRvCisJICBlZmZlY3RzIGxpa2Ugc2h1dHRpbmcgZG93biBwYWQgdGFza3MgcHJlbWF0dXJlbHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyMTM4CisKKzIwMTYtMDktMzAgMTE6NDE6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIG1lc29uLmJ1aWxkOgorCSAgbWVzb246IHVwZGF0ZSB2ZXJzaW9uCisKKz09PSByZWxlYXNlIDEuOS45MCA9PT0KKworMjAxNi0wOS0zMCAxMzowMjoxOSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdnB4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDEuOS45MAorCisyMDE2LTA5LTMwIDEyOjE3OjI2ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDE2LTA5LTMwIDExOjQzOjU0ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9lbC5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTYtMDktMzAgMTM6MjI6MzIgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW5Ab3NnLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvdGFnc2NoZWNraW5nLmM6CisJICB0ZXN0czogRml4IHRhZ3NjaGVja2luZyBmYWlsdXJlIGR1ZSB0byBtaXNzaW5nIFBUUworCSAgcXRtdXggbm93IG5lZWRzIHRoZSBQVFMgKGNvbW1pdCBhOTkzODgzYjcpLCBzbyBsZXQncyBtYWtlIHN1cmUgd2UKKwkgIHByb2R1Y2Ugb25lIHdpdGggb3VyIGJ1ZmZlcnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyMjI4CisKKzIwMTYtMDktMjggMjM6MDM6NTggKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBEb24ndCBjYWxjdWxhdGUgUFRTIG9mZnNldCBhbmQgRFRTIHdpdGggR1NUX0NMT0NLX1RJTUVfTk9ORQorCSAgSnVzdCBlcnJvciBvdXQgaWYgdGhlcmUgaXMgbm8gdmFsaWQgUFRTLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MjE0MworCisyMDE2LTA5LTI5IDE3OjM3OjI4ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuYzoKKwkgIHF0ZGVtdXg6IEFkZCBKUEVHMjAwMCBpaGRyIGF0b20gdG8gdGhlIGxpc3Qgb2Yga25vd24gb25lcworCSAgT3RoZXJ3aXNlIHF0ZGVtdXggaXMgYWx3YXlzIGdvaW5nIHRvIGNvbXBsYWluIGFib3V0IGl0IGJlaW5nIHVua25vd24uCisKKzIwMTYtMDktMjkgMTA6MTk6NTYgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBBbHdheXMgd3JpdGUgdGhlIGRlZmF1bHQgZnJhbWUgZHVyYXRpb24gZm9yIFZQOC85IHRvbworCSAgVGhlIFdlYk0gc3BlYyBhbGxvd3MgdGhpcyBub3csIGFuZCBpdCBhbGxvd3MgdXMgdG8gZ3Vlc3MgYSBmcmFtZXJhdGUuCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MjE0MSBhbmQKKwkgIGFsc28gaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NDM3OQorCisyMDE2LTA5LTI3IDE1OjI2OjE5IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYzoKKwkgIHJ0cGgyNls0NV1kZXBheTogRG9uJ3QgaGFuZGxlIE5BTHMgaW5zaWRlIFNUQVAgdW5pdHMgdHdpY2UKKwkgIFRoZXkndmUgYWxyZWFkeSBiZWVuIGhhbmRsZWQgYmVmb3JlIHB1c2hpbmcgdGhlbSBpbnRvIHRoZSBhZGFwdGVyLgorCisyMDE2LTA5LTI3IDEyOjM5OjEyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9tZXNvbi5idWlsZDoKKwkgIG1lc29uOiB0ZXN0czogZml4IHZwOCBhdmFpbGFiaWxpdHkgY2hlY2tzCisJICBUaG9zZSB2YXJpYWJsZXMgYXJlIG5vdCBkZWZpbmVkIGlmIHZwOCB3YXMgbm90IGZvdW5kLgorCisyMDE2LTA5LTI3IDEwOjIzOjM4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIFJldmVydCAibXVsdGlmaWxlc2luazogc3RyZWFtbGluZSB0aGUgZmlsZS1zd2l0Y2ggY29kZSBhIGJpdCIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgZjFjZWFhYjAyZjNmNTU3ZTIzYjc3YjE0NzcxYTU3NTc4OGY5MmJiNC4KKwkgIFRoaXMgYnJva2UgYXRvbWljIGZpbGUgd3JpdGVzIGluICJidWZmZXIiIG1vZGUuIEl0IGRpZCBtYWtlCisJICBzdXJlIHRoYXQgYW55IHN0cmVhbWhlYWRlcnMgYXJlIHByZXBlbmRlZCB0byBlYWNoIGZpbGUgaW4KKwkgIGJ1ZmZlciBtb2RlIGFzIHdlbGwsIGJ1dCB0aGF0J3Mgbm90IHJlYWxseSBuZWVkZWQgaW4gcHJhY3RpY2UsCisJICB3aGVyZWFzIGF0b21pYyBmaWxlIHdyaXRlcyBhcmUsIHNvIGxldCdzIHJlc3RvcmUgdGhlIHN0YXR1cworCSAgcXVvIGFudGUgZm9yIG5vdyBzaW5jZSB0aGlzIHdhcyBwcmltYXJpbHkgYSBjb2RlIGNsZWFudXAgYW55d2F5LAorCSAgYW5kIGlmIGFueW9uZSBuZWVkcyB0byBzdHJlYW1oZWFkZXJzIGluIGJ1ZmZlciBtb2RlIHRvbyB0aGV5CisJICBjYW4gbWFrZSBhIHBhdGNoIHRvIGltcGxlbWVudCB0aGF0IGRpZmZlcmVudGx5LiBSZS1pbXBsZW1lbnRpbmcKKwkgIHRoZSBhdG9taWMgd3JpdGVzIGluIHRoZSBlbGVtZW50IGFsc28gc2VlbXMgd2F5IHRvbyBtdWNoIHdvcmsuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY2OTkwCisKKzIwMTYtMDktMjcgMTA6MjI6NTcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgUmV2ZXJ0ICJtdWx0aWZpbGVzaW5rOiBjbG9zZSBmaWxlIG9uIHdyaXRlIGVycm9yIHdpdGggbmV4dC1maWxlIG1vZGUgaXMgc2V0IHRvIGJ1ZmZlciIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgODRlNDQxZDI2ODVjZjIyM2QzNDhhOTViZTBjNWJhNjkzYmJmNjYyNC4KKwkgIFRoaXMgd2lsbCBubyBsb25nZXIgYmUgbmVlZGVkIG9uY2Ugd2UgcmV2ZXJ0IGYxY2VhYWIwMi4KKworMjAxNi0wOS0yNiAxMzoyMjoyOSAtMDMwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBvc2cuc2Ftc3VuZy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL21lc29uLmJ1aWxkOgorCSAgbWVzb246IEFkZCBnc3QtcGx1Z2lucy1iYXNlIHBsdWdpbnMgZGlyZWN0b3JpZXMgdG8gYmUgdXNlZCBieSB0ZXN0cworCisyMDE2LTA5LTI2IDE0OjMwOjAwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L21lc29uLmJ1aWxkOgorCSogbWVzb24uYnVpbGQ6CisJKiB0ZXN0cy9jaGVjay9nZXRwbHVnaW5zZGlyOgorCSogdGVzdHMvY2hlY2svbWVzb24uYnVpbGQ6CisJICBtZXNvbjogYWRkIHVuaXQgdGVzdHMKKwkgIE9ubHkgd29ya3MgcHJvcGVybHkgaW4gYW4gaW5zdGFsbGVkIHNldHVwIGN1cnJlbnRseSwgbW9zdAorCSAgbGlrZWx5IHdvbid0IHdvcmsgd2l0aCBhIHN1YnByb2plY3RzIHNldHVwIHlldC4KKworMjAxNi0wOS0yNCAwOTozNjoyNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogbWVzb24uYnVpbGQ6CisJKiBwby9tZXNvbi5idWlsZDoKKwkgIG1lc29uOiBob29rIHVwIHRyYW5zbGF0aW9ucworCisyMDE2LTA5LTA4IDE3OjMwOjQxICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuQGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzcmM6IERvbid0IG5lZ290aWF0ZSB0byBsZXNzIHRoYW4gdHdvIHNlZ21lbnRzCisJICBHc3RBdWRpb1JpbmdCdWZmZXIgZG9lc24ndCBuZWVkcyB1cyB0byBoYXZlIGF0IGxlYXN0IDIgc2VnbWVudHMuIFdlIG1ha2UKKwkgIHN1cmUgdGhhdCBpZiBvdXIgYnVmZmVyIHBhcmFtZXRlcnMgYXJlIHN1Y2ggdGhhdCB0aGUgbWF4bGVuZ3RoIGlzIG5vdCBhdAorCSAgbGVhc3QgMnggZnJhZ3NpemUsIHdlIHN0aWxsIHJlcXVlc3QgdGhlIHJpbmdidWZmZXIgdG8ga2VlcCB0aGF0IG11Y2gKKwkgIHNwYWNlIHNvIGl0IGNvbnRpbnVlcyB0byB3b3JrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MDQ0NgorCisyMDE2LTA5LTI0IDIzOjIyOjAxICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuQGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5oOgorCSAgcnRwc2JjcGF5OiBGaXggdGltZXN0YW1waW5nCisJICBXZSB3ZXJlIGp1c3QgcGlja2luZyB0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGJ1ZmZlciBwdXNoZWQgaW50byBvdXIKKwkgIGFkYXB0ZXIgYmVmb3JlIHdlIGhhZCBlbm91Z2ggZGF0YSB0byBwdXNoIG91dC4KKwkgIFRoaXMgZml4ZXMgdGhpbmdzIHRvIGZpZ3VyZSBvdXQgaG93IGxhcmdlIGVhY2ggZnJhbWUgaXMgYW5kIHdoYXQKKwkgIGR1cmF0aW9uIGl0IGNvdmVycywgc28gd2UgY2FuIHNldCBib3RoIHRoZSB0aW1lc3RhbXAgYW5kIGR1cmF0aW9uCisJICBjb3JyZWN0bHkuCisJICBBbHNvIGFkZHMgc29tZSBESVNDT05UIGhhbmRsaW5nLgorCisyMDE2LTA3LTEyIDE4OjE0OjUyICswMjAwICBHZW9yZyBMaXBwaXRzY2ggPGdsaXBwaXRzY2hAdG9vbHNvbmFpci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBGaXggZm91cmNjIGZvciBQcm9SZXMgUHJveHkKKwkgIFRoaXMgaXMgYXBjbywgYWNjb3JkaW5nIHRvCisJICBodHRwczovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9QXBwbGVfUHJvUmVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5MDQ4CisKKzIwMTYtMDktMTggMjA6NTU6MzEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC92cHgvbWVzb24uYnVpbGQ6CisJICBtZXNvbjogZml4IGJ1aWxkIHdpdGggdnB4IDEuMy54CisJICB2cHggPj0gMS40LjAgaXMgb3B0aW9uYWwKKworMjAxNi0wOS0xNSAxODoxOTozNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogVXNlIG5ldyBiaW4gc3VwcHJlc3NlZCBmbGFncyBBUEkgZm9yIG1hbmFnaW5nIHRoZSBlbGVtZW50IGZsYWdzCisKKzIwMTYtMDktMTUgMDk6NTI6MzEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jOgorCSogZ3N0L3J0cC9kYm9vbGh1ZmYuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIGV4dCwgZ3N0OiBmaXggaW5kZW50YXRpb24KKworMjAxNi0wOS0xNSAwOTo1MjoxNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2bXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBoMjYzLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHNlc3Npb24uYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHZwOS5jOgorCSAgdGVzdHM6IGZpeCBpbmRlbnRhdGlvbgorCisyMDE2LTA4LTExIDExOjA0OjIyIC0wNjAwICBUaG9tYXMgQmx1ZW1lbCA8dGJsdWVtZWxAY29udHJvbDQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogRml4IGNhbGN1bGF0aW5nIG5leHRfc2VxbnVtIHdoZW4gZHJvcHBpbmcgb2xkIGJ1ZmZlcnMgZnJvbSBhIGZ1bGwgcXVldWUuCisJICBGaXhlcyBjYWxjdWxhdGluZyB0aGUgbmV4dCBzZXF1ZW5jZSBudW1iZXIgd2hlbiBhIElURU1fVFlQRV9MT1NUIHdpdGggbW9yZSB0aGFuIG9uZQorCSAgZGVmaW5pdGVseSBsb3N0IHBhY2tldHMgaXMgZW5jb3VudGVyZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5NzU3CisKKzIwMTYtMDgtMTEgMjM6MDc6NDQgKzAyMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogaW1wcm92ZWQgcnR4LXJ0dCBhdmVyYWdpbmcKKwkgIFRoZSBiYXNpYyBpZGVhIGlzIHRoaXM6CisJICAxLiBGb3IgKmxhcmdlciogcnR4LXJ0dCwgd2VpZ2ggYSBuZXcgbWVhc3VyZW1lbnQgYXMgYmVmb3JlCisJICAyLiBGb3IgKnNtYWxsZXIqIHJ0eC1ydHQsIGJlIGEgYml0IG1vcmUgY29uc2VydmF0aXZlIGFuZCB3ZWlnaCBhIGJpdCBsZXNzCisJICAzLiBGb3IgdmVyeSBsYXJnZSBtZWFzdXJlbWVudHMsIGNvbnNpZGVyIHRoZW0gIm91dGxpZXJzIgorCSAgYW5kIGNvdW50IHRoZW0gYSBsb3QgbGVzcworCSAgVGhlIGlkZWEgYmVpbmcgdGhhdCByZWR1Y2luZyB0aGUgcnR4LXJ0dCBpcyBtdWNoIG1vcmUgaGFybWZ1bCB0aGVuCisJICBpbmNyZWFzaW5nIGl0LCBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIGJlIHVuZGVyZXN0aW1hdGluZyB0aGUgcnR0IG9mIHRoZQorCSAgbmV0d29yaywgYW5kIHdoZW4gdXNpbmcgdGhpcyBudW1iZXIgdG8gZXN0aW1hdGUgdGhlIGxhdGVuY3kgeW91IG5lZWQgZm9yCisJICB5b3Ugaml0dGVyYnVmZmVyLCB5b3Ugd291bGQgcmF0aGVyIHdhbnQgaXQgdG8gYmUgYSBiaXQgbGFyZ2VyIHRoZW4gYSBiaXQKKwkgIHNtYWxsZXIsIHBvdGVudGlhbGx5IGxvc2luZyBydHgtcGFja2V0cy4gVGhlICJvdXRsaWVyLWRldGVjdG9yIiBpcyB0aGVyZQorCSAgdG8gcHJldmVudCBhIHNpbmdsZSBza2V3ZWQgbWVhc3VyZW1lbnQgdG8gYWZmZWN0IHRoZSBvdXRjb21lIHRvbyBtdWNoLgorCSAgT24gd2lyZWxlc3MgbmV0d29ya3MsIHRoZXNlIGFyZSBzdXJwcmlzaW5nbHkgY29tbW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTc2OAorCisyMDE2LTA4LTA1IDEyOjUxOjU5ICswMjAwICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogRGV0ZWN0IHdoZXRoZXIgdG8gYXNzdW1lIGVxdWlkaXN0YW50IHNwYWNpbmcgd2hlbiBsb3NzCisJICBBc3N1bWluZyBlcXVpZGlzdGFudCBwYWNrZXQgc3BhY2luZyB3aGVuIHRoYXQncyBub3QgdHJ1ZSBsZWFkcyB0byBtb3JlCisJICBsb3NzIHRoYW4gbmVjZXNzYXJ5IGluIHRoZSBjYXNlIG9mIHJlb3JkZXJpbmcgYW5kIGppdHRlci4gVHlwaWNhbGx5IHRoaXMKKwkgIGlzIHRydWUgZm9yIHZpZGVvIHdoZXJlIG9uZSBmcmFtZSBvZnRlbiBjb25zaXN0cyBvZiBtdWx0aXBsZSBwYWNrZXRzCisJICB3aXRoIHRoZSBzYW1lIHJ0cCB0aW1lc3RhbXAuIEluIHRoaXMgY2FzZSBpdCdzIGJldHRlciB0byBhc3N1bWUgdGhhdCB0aGUKKwkgIG1pc3NpbmcgcGFja2V0cyBoYXZlIHRoZSBzYW1lIHRpbWVzdGFtcCBhcyB0aGUgbGFzdCByZWNlaXZlZCBwYWNrZXQsIHNvCisJICB0aGF0IHRoZSBzY2hlZHVsZWQgbG9zdCB0aW1lciBkb2VzIG5vdCB0aW1lIG91dCB0b28gZWFybHkgY2F1c2luZyB0aGUKKwkgIHBhY2tldHMgdG8gYmUgY29uc2lkZXJlZCBsb3N0IGV2ZW4gdGhvdWdoIHRoZXkgbWF5IGFycml2ZSBpbiB0aW1lLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTc2OAorCisyMDE2LTA3LTI3IDEwOjM5OjUwICswMjAwICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogRG9uJ3QgcmVxdWVzdCBydHggaWYgJ25vdycgaXMgcGFzdCByZXRyeSBwZXJpb2QKKwkgIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2NoZWR1bGUgYW5vdGhlciBFWFBFQ1RFRCB0aW1lciBpZiB3ZSdyZSBhbHJlYWR5CisJICBwYXN0IHRoZSByZXRyeSBwZXJpb2QuIFVuZGVyIG5vcm1hbCBvcGVyYXRpb24gdGhpcyB3b24ndCBoYXBwZW4sIGJ1dCBpZgorCSAgdGhlcmUgYXJlIG1vcmUgdGltZXJzIHRoYW4gdGhlIGppdHRlcmJ1ZmZlciBpcyBhYmxlIHRvIHByb2Nlc3MgaW4KKwkgIHJlYWwtdGltZSwgc2NoZWR1bGluZyBtb3JlIHRpbWVycyB3aWxsIGp1c3QgbWFrZSB0aGUgc2l0dWF0aW9uIHdvcnNlLgorCSAgSW5zdGVhZCwgY29uc2lkZXIgdGhpcyBwYWNrZXQgYXMgbG9zdCBhbmQgbW92ZSBvbi4gVGhpcyBzY2VuYXJpbyBjYW4KKwkgIG9jY3VyIHdpdGggaGlnaCBsb3NzIHJhdGUsIGxvdyBydHQgYW5kIGhpZ2ggY29uZmlndXJlZCBsYXRlbmN5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTc2OAorCisyMDE2LTA3LTI2IDE4OjAxOjQ4ICswMjAwICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogRml4IGxvc3QgZHVyYXRpb24gd2hlbiBnYXAgYWZ0ZXIgbG9zdCB0aW1lcgorCSAgVGhpcyBwYXRjaCBmaXhlcyBhbiBpc3N1ZSB3aXRoIHRoZSBlc3RpbWF0ZWQgZ2FwIGR1cmF0aW9uIHdoZW4gdGhlcmUgaXMKKwkgIGEgZ2FwIGltbWVkaWF0ZWx5IGFmdGVyIGEgbG9zdCB0aW1lciBoYXMgYmVlbiBwcm9jZXNzZWQuIFByZXZpb3VzbHkKKwkgIHRoZXJlIHdhcyBhIGRpc2NyZXBhbmN5IGJldGVlbiB0aGUgZ2FwIGluIHNlcW51bSBhbmQgZ2FwIGluIGR0cyB3aGljaAorCSAgd291bGQgY2F1c2Ugd3JvbmcgY2FsY3VsYXRlZCBkdXJhdGlvbi4gVGhlIGlzc3VlIHdvdWxkIG9ubHkgYmUgc2VlbiB3aXRoCisJICByZXRyYW5taXNzaW9uIGVuYWJsZWQgc2luY2Ugd2hlbiBpdCdzIGRpc2FibGVkIGxvc3QgdGltZXJzIGFyZSBvbmx5CisJICBjcmVhdGVkIHdoZW4gYSBwYWNrZXQgaXMgcmVjZWl2ZWQgYW5kIHRoZSBhY3R1YWwgZ2FwIGxlbmd0aCBhbmQgbGFzdCBkdHMKKwkgIGlzIGtub3duLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTc2OAorCisyMDE2LTA3LTE5IDAxOjExOjU4ICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBFeHBvc2UgcnR4LWRlYWRsaW5lIGFzIGEgcHJvcGVydHkKKwkgIFRoZSBkZWZhdWx0IC0xIGdpdmVzIHRoZSBvbGQgYmVoYXZpb3IuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5NzY4CisKKzIwMTYtMDgtMTEgMTI6MDI6MTkgKzAyMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogSW1wcm92ZWQgZXhwZWN0ZWQtdGltZXIgaGFuZGxpbmcgd2hlbiBnYXAgPiAwCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5NzY4CisKKzIwMTYtMDgtMTEgMTE6NTE6NTAgKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBNYWpvciBpbXByb3ZlbWVudHMgZm9yIFJUWCBzdGF0cworCSAgU3RhdHMgc2hvdWxkIGFsc28gYmUgY29sbGVjdGVkIGZvciB1bnN1Y2Nlc3NmdWwgcGFja2V0cy4KKwkgIHJ0eC1ydHQgaXMgdmVyeSBpbXBvcnRhbnQgZm9yIGRldGVybWluaW5nIHRoZSBuZWNlc3NhcnkgY29uZmlndXJlZAorCSAgbGF0ZW5jeSBvbiB0aGUgaml0dGVyYnVmZmVyLiBJdCdzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHRvIGJlIGFibGUgdG8KKwkgIGluY3JlYXNlIHRoZSBsYXRlbmN5IHdoZW4gcmV0cmFuc21pdHRlZCBwYWNrZXRzIGFycml2ZSB0b28gbGF0ZSBhbmQgYXJlCisJICBjb25zaWRlcmVkIGxvc3QuIFRoaXMgcGF0Y2ggaW5jbHVkZXMgdGhlc2UgbGF0ZSBwYWNrZXRzIGluIHRoZQorCSAgY2FsY3VsYXRpb24gb2YgdGhlIHZhcmlvdXMgcnR4IHN0YXRzLCBtYWtpbmcgdGhlbSBtb3JlIGNvcnJlY3QgYW5kCisJICB1c2VmdWwuCisJICBBbHNvIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBvcmlnaW5hbCBwYWNrZXQgYXJyaXZlcyBhZnRlciBhIE5BQ0sgaXMgc2VudCwKKwkgIHRoZSByZWNlaXZlZCBSVFggcGFja2V0IHNob3VsZCB1cGRhdGUgdGhlIHN0YXRzIHNpbmNlIGl0IHByb3ZpZGVzIHVzZWZ1bAorCSAgaW5mb3JtYXRpb24gYWJvdXQgUlRULgorCSAgVGhlIFJUVCBpcyBvbmx5IHVwZGF0ZWQgaWYgYW5kIG9ubHkgaWYgYWxsIHJlcXVlc3RlZCByZXRyYW5taXNzaW9ucyBhcmUKKwkgIHJlY2VpdmVkLiBUaGF0IHdheSB0aGUgUlRUIGlzIGd1YXJhbnRlZWQgdG8gbWFrZSBzZW5zZS4gSWYgbm90IHdlIGRvbid0CisJICBrbm93IHdoaWNoIHJlcXVlc3QgdGhlIHBhY2tldCBpcyBhIHJlc3BvbnNlIHRvIGFuZCB0aGUgUlRUIG1heSBiZSBib2d1cy4KKwkgIEEgY29uc2VxdWVuY2Ugb2YgdGhpcyBwYXRjaCBpcyB0aGF0IFJUVCBpcyBub3QgdXBkYXRlZCBmb3IgYSByZXF1ZXN0CisJICB3aGVuIG9uZSBvZiB0aGUgUlRYIHBhY2tldHMgZm9yIHRoYXQgc2VxbnVtIGlzIGxvc3QsIGJ1dCB0aGF0IHNpbmNlCisJICBtZWFzdXJlZCBSVFQgd2lsbCBiZSBtb3JlIGFjY3VyYXRlLgorCSAgVGhlIGltcGxlbWVudGF0aW9uIHN0b3JlIHRoZSBSVFggaW5mb3JtYXRpb24gZnJvbSB0aGUgdGltZWQgb3V0IHRpbWVycworCSAgYW5kIHVzZSB0aGlzIHdoZW4gdGhlIHJldHJhbnNtaXR0ZWQgcGFja2V0IGFycml2ZXMuIEZvciBwZXJmb3JtYW5jZQorCSAgdGhlc2UgdGltZXJzIGFyZSBzdG9yZWQgc2VwYXJhdGVseSBmcm9tIHRoZSAibm9ybWFsIiB0aW1lcnMgaW4gb3JkZXIgdG8KKwkgIG5vdCBpbXBhY3QgcGVyZm9ybWFuY2UgKHNlZSBhdHRhY2hlZCBwZXJmb3JtYW5jZSB0ZXN0KS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njk3NjgKKworMjAxNi0wOC0xMSAxMTowMjo0NCArMDIwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBBZGQgYW5kIGV4cG9zZSBtb3JlIHN0YXRzIGFuZCBpbmNyZWFzZSB0ZXN0aW5nIG9mIGl0CisJICBBZGQgbnVtLXB1c2hlZCBhbmQgbnVtLWxvc3QuCisJICBFeHBvc2UgbnVtLWxhdGUsIG51bS1kdXBsaWNhdGVzIGFuZCBhdmctaml0dGVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTc2OAorCisyMDE2LTA3LTA3IDEwOjIwOjAyICswMjAwICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jOgorCSAgcnR4cmVjZWl2ZTogU2V0IGJ1ZmZlciBmbGFnIGZvciByZXRyYW5zbWl0dGVkIHBhY2tldHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njk3NjgKKworMjAxNi0wNy0wOSAyMzo0Nzo0MSArMDIwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogT3B0aW9uIHRvIGRpc2FibGUgcnR4LWRlbGF5LXJlb3JkZXIKKwkgIFdoZW4gZGlzYWJsZWQgd2UgY2FuIHNhdmUgc29tZSBpdGVyYXRpb25zIG92ZXIgdGltZXJzLgorCSAgVGhlcmUgaXMgcHJvYmFibHkgYW4gYXJndW1lbnQgZm9yIHJ0eC1kZWxheS1yZW9yZGVyIHRvIGV4aXN0LCBidXQKKwkgIGZvciBub3JtYWwgb3BlcmF0aW9ucywgaGFuZGxpbmcgaml0dGVyIChyZW9yZGVyaW5nKSBpcyBzb21ldGhpbmcgYQorCSAgaml0dGVyYnVmZmVyIHNob3VsZCBkbywgYW5kIHRoaXMgdmFyaWFibGUgZmVlbHMgbGlrZSBmdW5jdGlvbmFsaXR5IHRoYXQKKwkgIGlzIG5vdCAiaW4tc3luYyIgd2l0aCB3aGF0IHRoZSBqaXR0ZXJidWZmZXIgaXMgdHJ5aW5nIHRvIGFjaGlldmUuCisJICBFeGFtcGxlOiBZb3UgaGF2ZSA1MG1zIGppdHRlciBvbiB5b3VyIG5ldHdvcmssIGFuZCBhcmUgcmVjZWl2aW5nCisJICBhdWRpbyBwYWNrZXRzIHdpdGggMTBtcyBkdXJhdGlvbnMuIEFuIGF1ZGlvIHBhY2tldCBzaG91bGQgbm90IGJlCisJICBjb25zaWRlcmVkIGxhdGUgdW50aWwgaXRzIHJ0eC10aW1lb3V0IGhhcyBleHBpcmVkIChhbmQgaGVuY2UgYSBydHgtZXZlbnQKKwkgIGlzIHNlbnQpLCBidXQgd2l0aCBydHgtZGVsYXktcmVvcmRlciwgZXZlbnRzIHdpbGwgYmUgc2VudCBwcmV0dHkgbXVjaAorCSAgYWxsIHRoZSB0aW1lIGR1ZSB0byB0aGUgaml0dGVyIG9uIHRoZSBuZXR3b3JrLgorCSAgUG9pbnQgYmVpbmc6IFRoZSBqaXR0ZXJidWZmZXIgc2hvdWxkIGFkYXB0IGl0cyBzaXplIHRvIHRoZSBtZWFzdXJlZCBuZXR3b3JrCisJICBqaXR0ZXIsIGFuZCB0aGVuIHJ0eC1kZWxheS1yZW9yZGVyIG5lZWRzIHRvIGFkYXB0IGFzIHdlbGwsIG9yIHNpbXBseQorCSAgZ2V0IG91dCBvZiB0aGUgd2F5IGFuZCBsZXQgdGhlIG90aGVyIChiZXR0ZXIpIHJ0eC1tZWNoYW5pc21zIGRvIHRoZWlyIGpvYi4KKwkgIEFsc28gY2hhbmdlIGZpbmRfdGltZXIgdG8gb25seSB1c2Ugc2VxbnVtIGFzIGFuIGFyZ3VtZW50LCBzaW5jZSB0aGVyZQorCSAgd2lsbCBvbmx5IGV2ZXIgYmUgb25lIHRpbWVyIHBlciBzZXFudW0gYXQgYW55IGdpdmVuIHRpbWUuIEluIHRoZQorCSAgb25lIGNhc2Ugd2hlcmUgdGhlIHR5cGUgbWF0dGVycywgdGhlIGNhbGxlciBzaW1wbHkgY2hlY2tzIHRoZSB0eXBlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTc2OAorCisyMDE2LTA5LTE0IDA5OjU4OjQxIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgIHJ0cGgyNjNwYXk6IEZpeCBkb3VibGUgZnJlZSBmcm9tIGNvdmVyaXR5CisJICBDSUQgIzEzNzI4ODcKKworMjAxNi0wOS0xNCAwOTo1ODozNyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJICBydHBoMjYzcGF5OiBJbmRlbnQgYXMgcGVyIGdzdC1pbmRlbnQKKworMjAxNi0wOS0xNCAxMTozMDo0MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBEZXBlbmQgb24gZ3N0cmVhbWVyIDEuOS4yLjEKKworMjAxNi0wOS0xNCAxMDoxNzowMiArMDkwMCAgV29uY2h1bCBMZWUgPHdvbmNodWwubGVlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuYzoKKwkgIGF1dG9kZXRlY3Q6IFVzZSBnc3RfYmluX3NldF9zdXBwcmVzc2VkX2ZsYWdzKCkgQVBJCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcxMzk1CisKKzIwMTYtMDktMDkgMTU6MzY6MTIgKzAyMDAgIFRob21hcyBTY2hldWVybWFubiA8VGhvbWFzLlNjaGV1ZXJtYW5uQGJhcmNvLmNvbT4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvY2xpZW50LmM6CisJICBqYWNrOiBGaXggcGlwZWxpbmUgaGFuZyB3aGVuIGphY2sgY2hhbmdlcyBzYW1wbGUgcmF0ZSBvciBidWZmZXIgc2l6ZQorCSAgSWYgamFja2QgY2hhbmdlcyB0aGUgYnVmZmVyIHNpemUgb3Igc2FtcGxlIHJhdGUsIGphY2thdWRpb3NpbmsgaGFuZ3MKKwkgIGFuZCBjYW4ndCBiZSBzdG9wcGVkLiBUaGlzIGFsc28gaGFwcGVucyBpZiBqYWNrIGlzIGNvbmZpZ3VyZWQgYXMgc2xhdmUKKwkgIGFuZCBhIGdzdHJlYW1lciBwaXBlbGluZSBpcyBzdGFydGVkIG9uIHRoZSBzbGF2ZSBtYWNoaW5lIHdoaWxlIHRoZSBqYWNrCisJICBtYXN0ZXIgaXNuJ3QgcnVubmluZyB5ZXQuIElmIHRoZSB0aGUgamFjayBtYXN0ZXIgaXMgc3RhcnRlZCBpdCBjaGFuZ2VzCisJICB0aGUgYnVmZmVyIHNpemUgLyBzYW1wbGUgcmF0ZSBhbmQgamFja2F1ZGlvc2luayBjYW4ndCBiZSBzdG9wcGVkLgorCSAgVGhpcyBmaXggY2FsbHMgamFja19zaHV0ZG93bl9jYiB3aGVuIGphY2tfc2FtcGxlX3JhdGVfY2Igb3IKKwkgIGphY2tfYnVmZmVyX3NpemVfY2IgaXMgY2FsbGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MTI3MgorCisyMDE2LTA5LTEyIDIwOjA4OjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXggZmllbGQgb3JkZXJpbmcgZm9yIHJldmVyc2UgcGxheWJhY2sKKwkgIEFuZCBhY3R1YWxseSBjYWxjdWxhdGUgdGhlIGZpZWxkIGR1cmF0aW9uIGluc3RlYWQgb2YgYSBmcmFtZSBkdXJhdGlvbiBzbworCSAgdGhhdCB3ZSBjYW4gcHJvcGVybHkgdGltZXN0YW1wIG91dHB1dCBmcmFtZXMgaW4gZmllbGRzPWFsbCBtb2RlLgorCSAgVGhpcyBpcyBwcm9iYWJseSBzdGlsbCBicm9rZW4gZm9yIHJldmVyc2UgcGxheWJhY2sgaW4gdGVsZWNpbmUgbW9kZS4KKworMjAxNi0wOS0xMiAwOTowMjowMCArMDAwMCAgVGhvbWFzIEtsYXVzbmVyIDx0a0BnaWdhLm9yLmF0PgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBGaXggY29tcGlsYXRpb24gb24gTmV0QlNECisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcxMjc4CisKKzIwMTYtMDktMTAgMjA6NTE6MTAgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBhdXRvZ2VuLnNoOgorCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGIxOGQ4MjAgdG8gZjk4MGZkOQorCisyMDE2LTA5LTA5IDE0OjAyOjI1ICswMjAwICBYYWJpZXIgUm9kcmlndWV6IENhbHZhciA8Y2FsdmFyaXNAaWdhbGlhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBvZmZzZXQgaXMgaXJyZWxldmFudCB3aGVuIG5vIGNyeXB0byBpbmZvCisJICBDYXVzZSBsYXRlciBpdCB3aWxsIHRyeSB0byB1c2UgdGhlIGNyeXB0byBpbmZvIGFycmF5IHRvIGdldCBhbiBpbmRleCBhbmQKKwkgIGF0dGFjaCBvbiBvZiB0aGUgcG9zaXRpb25zIGFzIGJ1ZmZlcidzIGNyeXB0byBpbmZvLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MDk1MQorCisyMDE2LTA5LTEwIDA5OjUzOjU3ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogYXV0b2dlbi5zaDoKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBmNDljNTVlIHRvIGIxOGQ4MjAKKworMjAxNi0wOS0wNyAxNTozMzozMCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vTWFrZWZpbGUuYW06CisJICBvc3hhdWRpbzogRGlzdHJpYnV0ZSBkZXZpY2UgcHJvdmlkZXIgZmlsZXMKKwkgIFRob3NlIHdoZXJlIG1pc3NpbmcgdGhlIHRoZSBkZXYgcmVsZWFzZSB0YXJiYWxscyBmb3IgMS45LjIgd2hpY2gKKwkgIHByZXZlbnRlZCBidWlsZGluZyBmcm9tIHRhcmJhbGwgb24gT1NYIHBsYXRmb3JtCisKKzIwMTYtMDktMDYgMDk6NDk6MzkgKzAyMDAgIFhhYmllciBSb2RyaWd1ZXogQ2FsdmFyIDxjYWx2YXJpc0BpZ2FsaWEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBjcmFzaCB3aXRoIG5vIGNlbmMgYXV4IG9mZnNldAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MDk1MQorCisyMDE2LTA5LTA1IDA5OjM5OjMzICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IHBhcnNlIGEgYml0IG1vcmUgb2YgdGhlIGh1bW9uZ291cyBMT0FTIGRhdGEKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjkyNzgKKworMjAxNi0wOS0wNSAwOTozOTowOCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBtYWtlIGl0IGNsZWFyIHdoZW4gYSBwb3RlbnRpYWwgTE9BUyBmcmFtZSBpcyBub3Qgb25lCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5Mjc4CisKKzIwMTYtMDktMDUgMDk6Mzg6MjYgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogYWRkIGEgZmV3IGNvbW1lbnRzIHRvIGFuY2hvciBwYXJzaW5nIHRvIHRoZSBzcGVjCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5Mjc4CisKKzIwMTYtMDktMDUgMDk6Mzc6MDIgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmg6CisJICBhYWNwYXJzZTogaW1wcm92ZSBjaGFubmVsL3JhdGUgaGFuZGxpbmcKKwkgIEtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgcGFyc2VkIGNoYW5uZWxzL3JhdGUgZmllbGRzIHNvIHRoZXkgY2FuIGJlCisJICB1c2VkIGV2ZW4gaWYgdGhlIGVsZW1lbnQgd2FzIG5vdCB5ZXQgY29uZmlndXJlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjkyNzgKKworMjAxNi0wOS0wNSAwOTozNTo1MyArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBmaXggdmFybGVuZ3RoIG51bWJlciByZWFkaW5nIGFzIHBlciBzcGVjCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5Mjc4CisKKzIwMTYtMDktMDUgMDk6MzU6MDIgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogc3RyaXAgdW5lZWRlZCBzdGF0aWMgYXJyYXlzIHNsYWNrCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5Mjc4CisKKzIwMTYtMDctMTggMTk6MTg6NTggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5oOgorCSAgcnRwbXA0YWRlcGF5OiBPbmx5IGRlY2xhcmUgYSBzdHJlYW0gdG8gYmUgZnJhbWVkIG9uY2UgYSBtYXJrZXIgYml0IGhhcyBiZWVuIHNlZW4KKwkgIFRoaXMgbWF5IGNhdXNlIGEgZmV3IHBhY2tldHMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBwYXJzZXIsIGJ1dCBpdCdzCisJICBiZXR0ZXIgdGhhbiBuZXZlciBwdXNoaW5nIG91dCBidWZmZXJzIGZyb20gYSBzbGlnaHRseSBicm9rZW4gc3RyZWFtCisJICB3aGVyZSBubyBtYXJrZXIgYml0cyBhcmUgc2V0LgorCisyMDE2LTA5LTA2IDE0OjI1OjQyICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSAgZHZkZW11eDogRml4IHRpbWVzdGFtcGluZyBpbiByZXZlcnNlIHBsYXliYWNrIG1vZGUKKwkgIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgcmlnaHQgbm93IGlmIGFmdGVyIGEgZGVtdXhlciB0aGF0IHN1cHBvcnRzIHJldmVyc2UKKwkgIHBsYXliYWNrLCBlLmcuIHdpdGggRFYgY29udGFpbmVyIGluc2lkZSBBVkkgY29udGFpbmVyLgorCisyMDE2LTA5LTA1IDEyOjIzOjU0IC0wMzAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQG9zZy5zYW1zdW5nLmNvbT4KKworCSogbWVzb24uYnVpbGQ6CisJICBtZXNvbjogQnVtcCB2ZXJzaW9uIHRvIDEuOS4yCisKKzIwMTUtMDYtMjYgMjA6MTM6MTcgKzAyMDAgIE1hdGhpZXUgRHVwb25jaGVsbGUgPG1hdGhpZXUuZHVwb25jaGVsbGVAb3BlbmNyZWVkLmNvbT4KKworCSogZ3N0L2lzb21wNC9Hc3RRVE11eC5wcnM6CisJKiBnc3QvaXNvbXA0L01ha2VmaWxlLmFtOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IEltcGxlbWVudCB0aGUgcHJlc2V0IGludGVyZmFjZS4KKwkgICsgQW5kIHByb3ZpZGUgYSAieW91dHViZSIgcHJlc2V0LCB3aGljaCBiYXNlZCBvbgorCSAgaHR0cHM6Ly9zdXBwb3J0Lmdvb2dsZS5jb20veW91dHViZS9hbnN3ZXIvMTcyMjE3MSBzZXRzCisJICBmYXN0c3RhcnQgdG8gVHJ1ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTE1NTkKKworMjAxNi0wOS0wMSAxMjoyNzozNSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjkuMiA9PT0KKworMjAxNi0wOS0wMSAxMjoyNzoxNSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS45LjIKKworMjAxNi0wOS0wMSAxMToyMzozMyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTYtMDktMDEgMTA6NTk6NTEgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2V4YW1wbGVzL2VxdWFsaXplci9kZW1vLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1vc3NzcmMuYzoKKwkgIHRlc3RzL2V4YW1wbGVzOiAjZGVmaW5lIEdES19ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisJICBXZSB1c2UgZ2RrX2NhaXJvX2NyZWF0ZSgpIHdoaWNoIGlzIGRlcHJlY2F0ZWQgc2luY2UgMy4yMi4KKworMjAxNi0wOC0zMSAwNTo1MDo0NCArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9NYWtlZmlsZS5hbToKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSAgb3N4dmlkZW86IFJlbW92ZSBRdWlja1RpbWUgcmVmZXJlbmNlcy4KKwkgIFF1aWNrVGltZS5oIGlzIG5vIGxvbmdlciBhdmFpbGFibGUgb24gT1MgWCAxMC4xMiAoU2llcnJhKSwKKwkgIGFuZCBib3RoIHRoZSBoZWFkZXIgYW5kIHRoZSBmcmFtZXdvcmsgc2VlbSB1bm5lY2Vzc2FyeQorCSAgZm9yIGNvbXBpbGF0aW9uIC0gYXQgbGVhc3QgYXMgb2YgMTAuMTEgKEVsIENhcGl0YW4pLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MDUyNgorCisyMDE2LTA4LTE5IDExOjExOjAzIC0wNzAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZmRlYy5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIFVzZSB0aGUgbmV3IEFQSSB0byBwb3N0IGZsb3cgRVJST1IgbWVzc2FnZXMgb24gdGhlIGJ1cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MDE1OAorCisyMDE2LTA4LTI2IDIxOjMyOjA3ICswMjAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJICBnaXRpZ25vcmU6IGlnbm9yZSBxdGRlbXV4LCBydHBoMjYxIGFuZCBydHB2cDkgdGVzdHMKKworMjAxNi0wOC0yNiAyMToyMjoxNiArMDIwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiB1c2UgR1NUX05FVF9MSUJTIGluc3RlYWQgb2YgaGFyZGNvZGVkIC1sZ3N0bmV0CisJICBGaXhlcyBidWlsZCBpbiBPU1ggd2hlbiBydW5uaW5nICdtYWtlIGNoZWNrJyBpbiBnc3QtdW5pbnN0YWxsZWQuCisKKzIwMTYtMDgtMjYgMjE6MTQ6NDcgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHRlc3RzOiByZW1vdmUgYSB3cm9uZyAnY29uc3QnIHNwZWNpZmllcgorCSAgRml4ZXMgImVycm9yOiBkdXBsaWNhdGUgJ2NvbnN0JyBkZWNsYXJhdGlvbiBzcGVjaWZpZXIiCisKKzIwMTYtMDgtMjYgMjE6MTE6NTkgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBidWlsZDogc2lsZW5jZSBlcnJvciBhYm91dCBwdGhyZWFkIGZvciAnbWFrZSBjaGVjaycgaW4gb3N4CisJICBGaXhlcyAiY2xhbmc6IGVycm9yOiBhcmd1bWVudCB1bnVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uOiAnLXB0aHJlYWQnIgorCisyMDE2LTA4LTI2IDIwOjMxOjEwICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHZwOWVuYzogRml4IGJ1aWxkIG9mIHVuaXQgdGVzdCBieSBsZXR0aW5nIGl0IGxpbmsgdG8gbGliZ3N0dmlkZW8KKworMjAxNi0wOC0yNiAxMjowNjozNSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkgIFJldmVydCAicnRwbXV4OiBmaXggUFJPUF9USU1FU1RBTVBfT0ZGU0VUIHJhbmdlIHByb2JsZW1zIgorCSAgVGhpcyBicm9rZSBBUEksIHNvIHdlIG5lZWQgYSBiZXR0ZXIgc29sdXRpb24hCisJICBUaGlzIHJldmVydHMgY29tbWl0IGM3NTc5ZDMxYTZlOWQ3ODhlOTRiODMyNTgzMDkwNjNkMGFhZTQ4MWUuCisKKzIwMTYtMDYtMDggMTU6MDY6MjggKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOWRlcGF5LmM6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHZwOS5jOgorCSAgcnRwdnA5ZGVwYXk6IFN1cHBvcnQgZmxleGlibGUgbW9kZQorCisyMDE2LTA2LTA2IDE3OjAzOjM2ICswMjAwICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdnA5ZW5jLmM6CisJICB2cDllbmM6IEZpeCBsZWFrIG9mIHZweF9pbWFnZV90CisKKzIwMTYtMDUtMDYgMTM6MzM6MjIgKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGgyNjMuYzoKKwkgIHJ0cGgyNjNwZGVwYXk6IERvbid0IHRyeSB0byBwdXNoIGVtcHR5IGZyYW1lCisJICBJZiB0aGUgcmVzdWx0IG9mIGRlcGF5bG9hZGluZyBpcyBhbiBlbXB0eSBmcmFtZSwganVzdCBkcm9wIGl0LiBUaGlzIGlzCisJICBsaWtlbHkgdGhlIHJlc3VsdCBvZiBhIGJ1Z2d5IHBheWxvYWRlci4KKworMjAxNi0wNS0wNiAxNjowNjo1MyArMDIwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oOgorCSAgcnRwbXV4OiBmaXggUFJPUF9USU1FU1RBTVBfT0ZGU0VUIHJhbmdlIHByb2JsZW1zCisJICBJdCBjb3VsZCBub3Qgc2V0IHRoZSBvZmZzZXQgZm9yIHRoZSBmdWxsIGd1aW50MzIgcmFuZ2UuCisKKzIwMTYtMDUtMDYgMDk6NDQ6NDIgKzAyMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgIHJ0cGJpbjogaW50cm9kdWNlIG1heC1zdHJlYW1zIHByb3BlcnR5CisJICBUbyBiZSBhYmxlIHRvIGNhcCB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgc3RyZWFtcyBmb3Igb25lIHNlc3Npb24uCisJICBUaGlzIGlzIHVzZWZ1bCBmb3IgcHJldmVudGluZyBEb1MgYXR0YWNrcywgd2hlcmUgYSBzZW5kZXIgY2FuIGNoYW5nZQorCSAgU1NSQyBmb3IgZXZlcnkgYnVmZmVyLCBlZmZlY3RpdmVseSBicmluZ2luZyBydHBiaW4gdG8gYSBoYWx0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MDI5MgorCisyMDE2LTAzLTMxIDAwOjEwOjQ5ICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlOiByZW9yZGVyZWQgcGFja2V0cyBhcmUgdmVyeSBub3JtYWwsIGFuZCBzaG91bGQgbm90IGJlIGEgd2FybmluZworCisyMDE2LTAyLTA1IDE0OjE5OjI1ICswMTAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGRlZ3JhZGUgZ193YXJuaW5nIHRvIEdTVF9FUlJPUgorCSAgU28gd2UgZG9uJ3QgYmxvdyB1cCB3aGlsZSBpbnZlc3RpZ2F0aW5nCisKKzIwMTYtMDItMDQgMTQ6MTY6NDAgKzAxMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGgyNjMuYzoKKwkgIHJ0cGgyNjNwZGVwYXk6IEZpeCBwaWN0dXJlIGhlYWRlciBmb3Igbm9uLXdyaXRhYmxlIHBheWxvYWQKKwkgIFVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucyBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCgpIHJldHVybnMgYSBjb3B5IG9mCisJICB0aGUgcGF5bG9hZC4gSW4gdGhpcyBjYXNlIHRoZSBwYXlsb2FkIG1vZGlmaWNhdGlvbnMgd2lsbCBub3QgYWZmZWN0IHRoZQorCSAgcnRwIGJ1ZmZlci4gU28gaW5zdGVhZCBvZiBtb2RpZnlpbmcgdGhlIHBheWxvYWQgYnVmZmVyIGRpcmVjdGx5IHdlCisJICBzaG91bGQgbW9kaWZ5IHRoZSBidWZmZXIgdGhhdCBhY3R1YWxseSBnZXRzIHB1c2hlZCBvbiB0aGUgYWRhcHRlci4KKworMjAxNS0xMS0xOSAxMTo1MDo0NyArMDEwMCAgU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2MWRlcGF5LmM6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGgyNjEuYzoKKwkgIHJ0cGgyNjFkZXBheTogRml4IGNoZWNrIG9mIHZhbGlkIHBheWxvYWQgbGVuZ3RoCisJICBQYWNrZXRzIHdpdGggbm8gSC4yNjEgcGF5bG9hZCBzaG91bGQgYmUgZHJvcHBlZCB0byBhdm9pZCBpbnZhbGlkCisJICB3cml0ZS9yZWFkcy4KKworMjAxNS0xMS0wOSAxMDowNjoyMSArMDEwMCAgU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaDI2My5jOgorCSAgcnRwaDI2M3BheTogRml4IGRvdWJsZSBmcmVlLCBpbnZhbGlkIHJlYWRzIGFuZCBsZWFrCisKKzIwMTQtMDYtMzAgMTU6NDM6NTggKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBzYW5pdHkgY2hlY2sgUlRUIGJlZm9yZSBpZ25vcmluZyBQTEkvRklSCisKKzIwMTQtMDYtMzAgMTU6MDc6NDUgKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBoYW5kbGUgc2RlcyBtZXNzYWdlcyB3aXRoIG5vbi11dGY4IG1vcmUgZ3JhY2VmdWxseQorCisyMDE0LTA2LTE3IDA4OjUyOjUwICswMjAwICBTdGlhbiBTZWxuZXMgPHN0aWFuLnNlbG5lc0BnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgcnRwaDI2M3BheTogY2hhbmdlIGxvZyBsZXZlbCBvbiBiaXRzdHJlYW0gcGFyc2luZyBtZXNzYWdlcworCisyMDE2LTA3LTA3IDExOjEzOjE4ICswMjAwICBNaWtoYWlsIEZsdWRrb3YgPG1pc2hhQHBleGlwLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwcnR4LmM6CisJICB0ZXN0cy9ydHBydHg6IHJlZmFjdG9yIHRoZSB0ZXN0cyB0byB1c2UgZ3N0aGFybmVzcworCSAgVGhlIGZ1bmN0aW9uYWxpdHkgb2YgYWxsIHRoZSB0ZXN0cyB3YXMga2VwdCBleGFjdGx5IHRoZSBzYW1lLiBTb21lIHRlc3RzCisJICB3ZXJlIHJlbmFtZWQ6CisJICB0ZXN0X3B1c2hfZm9yd2FyZF9zZXEgLT4gdGVzdF9ydHhzZW5kX3J0eHJlY2VpdmUKKwkgIHRlc3RfZHJvcF9vbmVfc2VuZGVyIC0+IHRlc3RfcnR4c2VuZF9ydHhyZWNlaXZlX3dpdGhfcGFja2V0X2xvc3MKKwkgIHRlc3RfZHJvcF9tdWx0aXBsZV9zZW5kZXIgLT4gdGVzdF9tdWx0aV9ydHhzZW5kX3J0eHJlY2VpdmVfd2l0aF9wYWNrZXRfbG9zcworCSAgdGVzdF9ydHhyZWNlaXZlX2RhdGFfcmVjb25zdHJ1Y3Rpb24gd2FzIHRlc3RpbmcgdGhhdCByZXRyYW5zbWl0dGVkCisJICBidWZmZXIgcHJvZHVjZWQgYnkgcnR4c2VuZCB3YXMgY29ycmVjdGx5IHRyYW5zZm9ybWVkIHRvIHRoZSBvcmlnaW5hbAorCSAgYnVmZmVyIGJ5IHJ0eHJlY2VpdmUuIE5vdyB3ZSBhcmUgY2hlY2tpbmcgZm9yIHRoaXMgaW4gYWxsIHRoZSB0ZXN0cworCSAgd2hlcmUgYm90aCBydHhzZW5kICYgcnR4cmVjZWl2ZSBhcmUgaW52b2x2ZWQuIFRoYXQncyB3aHkgdGhlIHRlc3Qgd2FzCisJICByZW1vdmVkLgorCisyMDE2LTA4LTI1IDE1OjUyOjM2ICswMjAwICBKb25hcyBIb2xtYmVyZyA8am9uYXNoZ0BheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1cGF5LmM6CisJICBydHBoMjY1cGF5OiBTZXQgUlRQIG1hcmtlciBiaXQKKwkgIFNldCB0aGUgUlRQIG1hcmtlciBiaXQgb24gdGhlIGxhc3QgUlRQIHBhY2tldCBvZiBhbiBILjI2NSBhY2Nlc3MgdW5pdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NzAzOTQKKworMjAxNi0wNy0yNiAxOTozOTo1OCArMDIwMCAgWGFiaWVyIFJvZHJpZ3VleiBDYWx2YXIgPGNhbHZhcmlzQGlnYWxpYS5jb20+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaDoKKwkgIHZpZGVvZmxpcDogYWRkZWQgR3N0VmlkZW9EaXJlY3Rpb24gaW50ZXJmYWNlCisJICBJdCBpbXBsZW1lbnRzIG5vdyB0aGlzIGludGVyZmFjZSB3aXRoIGl0cyB2aWRlby1kaXJlY3Rpb24KKwkgIHByb3BlcnR5LiBWYWx1ZXMgYXJlIGNoYW5nZWQgdG8gR3N0VmlkZW9PcmllbnRhdGlvbk1ldGhvZCBidXQgdGhleSBoYXZlCisJICB0aGUgc2FtZSB2YWx1ZSB0aGFuIHRoZSBvcmlnaW5hbHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY4Njg3CisKKzIwMTUtMTEtMDYgMTA6Mzk6MTYgKzAxMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgZ3N0cnRwc2Vzc2lvbjogcmVmYWN0b3IgZHVwbGljYXRlIGNvZGUgaW50byBhIGZ1bmN0aW9uCisJICBMZXNzIGNvZGUsIGVhc2llciB0byByZWFkLCBtb3JlIGNvbnNpc3RlbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcwMjkzCisKKzIwMTYtMDgtMjMgMTc6MDY6NDQgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogZml4IHR5cG8gaW4gbWF4LW1pc29yZGVyLXRpbWUgcHJvcGVydHkgbmFtZQorCisyMDE2LTA4LTIyIDAwOjA1OjUyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBmaXggcHJpbnRmIGZvcm1hdCBjb21waWxlciB3YXJuaW5nIGluIGRlYnVnIG1lc3NhZ2UKKwkgIE9uIDMyLWJpdCB4ODY6IGdzdHNwbGl0bXV4c2luay5jOjk2NjozMTogd2FybmluZzogZm9ybWF0IOKAmCV14oCZIGV4cGVjdHMKKwkgIGFyZ3VtZW50IG9mIHR5cGUg4oCYdW5zaWduZWQgaW504oCZLCBidXQgYXJndW1lbnQgOSBoYXMgdHlwZQorCSAg4oCYZ3VpbnQ2NCB7YWthIGxvbmcgbG9uZyB1bnNpZ25lZCBpbnR94oCZCisKKzIwMTYtMDgtMTIgMjE6MTI6MzAgKzA1MzAgIE5pcmJoZWVrIENoYXVoYW4gPG5pcmJoZWVrQGNlbnRyaWN1bGFyLmNvbT4KKworCSogLmdpdGlnbm9yZToKKwkqIGNvbmZpZy5oLm1lc29uOgorCSogZXh0L2NhaXJvL21lc29uLmJ1aWxkOgorCSogZXh0L2R2L21lc29uLmJ1aWxkOgorCSogZXh0L2ZsYWMvbWVzb24uYnVpbGQ6CisJKiBleHQvZ2RrX3BpeGJ1Zi9tZXNvbi5idWlsZDoKKwkqIGV4dC9qYWNrL21lc29uLmJ1aWxkOgorCSogZXh0L2pwZWcvbWVzb24uYnVpbGQ6CisJKiBleHQvbGlicG5nL21lc29uLmJ1aWxkOgorCSogZXh0L21lc29uLmJ1aWxkOgorCSogZXh0L3B1bHNlL21lc29uLmJ1aWxkOgorCSogZXh0L3Nob3V0Mi9tZXNvbi5idWlsZDoKKwkqIGV4dC9zb3VwL21lc29uLmJ1aWxkOgorCSogZXh0L3NwZWV4L21lc29uLmJ1aWxkOgorCSogZXh0L3RhZ2xpYi9tZXNvbi5idWlsZDoKKwkqIGV4dC92cHgvbWVzb24uYnVpbGQ6CisJKiBleHQvd2F2cGFjay9tZXNvbi5idWlsZDoKKwkqIGdzdC9hbHBoYS9tZXNvbi5idWlsZDoKKwkqIGdzdC9hcGV0YWcvbWVzb24uYnVpbGQ6CisJKiBnc3QvYXVkaW9meC9tZXNvbi5idWlsZDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvbWVzb24uYnVpbGQ6CisJKiBnc3QvYXVwYXJzZS9tZXNvbi5idWlsZDoKKwkqIGdzdC9hdXRvZGV0ZWN0L21lc29uLmJ1aWxkOgorCSogZ3N0L2F2aS9tZXNvbi5idWlsZDoKKwkqIGdzdC9jdXR0ZXIvbWVzb24uYnVpbGQ6CisJKiBnc3QvZGVidWd1dGlscy9tZXNvbi5idWlsZDoKKwkqIGdzdC9kZWludGVybGFjZS9tZXNvbi5idWlsZDoKKwkqIGdzdC9kdG1mL21lc29uLmJ1aWxkOgorCSogZ3N0L2VmZmVjdHYvbWVzb24uYnVpbGQ6CisJKiBnc3QvZXF1YWxpemVyL21lc29uLmJ1aWxkOgorCSogZ3N0L2Zsdi9tZXNvbi5idWlsZDoKKwkqIGdzdC9mbHgvbWVzb24uYnVpbGQ6CisJKiBnc3QvZ29vbS9tZXNvbi5idWlsZDoKKwkqIGdzdC9nb29tMmsxL21lc29uLmJ1aWxkOgorCSogZ3N0L2ljeWRlbXV4L21lc29uLmJ1aWxkOgorCSogZ3N0L2lkM2RlbXV4L21lc29uLmJ1aWxkOgorCSogZ3N0L2ltYWdlZnJlZXplL21lc29uLmJ1aWxkOgorCSogZ3N0L2ludGVybGVhdmUvbWVzb24uYnVpbGQ6CisJKiBnc3QvaXNvbXA0L21lc29uLmJ1aWxkOgorCSogZ3N0L2xhdy9tZXNvbi5idWlsZDoKKwkqIGdzdC9sZXZlbC9tZXNvbi5idWlsZDoKKwkqIGdzdC9tYXRyb3NrYS9tZXNvbi5idWlsZDoKKwkqIGdzdC9tZXNvbi5idWlsZDoKKwkqIGdzdC9tb25vc2NvcGUvbWVzb24uYnVpbGQ6CisJKiBnc3QvbXVsdGlmaWxlL21lc29uLmJ1aWxkOgorCSogZ3N0L211bHRpcGFydC9tZXNvbi5idWlsZDoKKwkqIGdzdC9yZXBsYXlnYWluL21lc29uLmJ1aWxkOgorCSogZ3N0L3J0cC9tZXNvbi5idWlsZDoKKwkqIGdzdC9ydHBtYW5hZ2VyL21lc29uLmJ1aWxkOgorCSogZ3N0L3J0c3AvbWVzb24uYnVpbGQ6CisJKiBnc3Qvc2hhcGV3aXBlL21lc29uLmJ1aWxkOgorCSogZ3N0L3NtcHRlL21lc29uLmJ1aWxkOgorCSogZ3N0L3NwZWN0cnVtL21lc29uLmJ1aWxkOgorCSogZ3N0L3VkcC9tZXNvbi5idWlsZDoKKwkqIGdzdC92aWRlb2JveC9tZXNvbi5idWlsZDoKKwkqIGdzdC92aWRlb2Nyb3AvbWVzb24uYnVpbGQ6CisJKiBnc3QvdmlkZW9maWx0ZXIvbWVzb24uYnVpbGQ6CisJKiBnc3QvdmlkZW9taXhlci9tZXNvbi5idWlsZDoKKwkqIGdzdC93YXZlbmMvbWVzb24uYnVpbGQ6CisJKiBnc3Qvd2F2cGFyc2UvbWVzb24uYnVpbGQ6CisJKiBnc3QveTRtL21lc29uLmJ1aWxkOgorCSogbWVzb24uYnVpbGQ6CisJKiBtZXNvbl9vcHRpb25zLnR4dDoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9tZXNvbi5idWlsZDoKKwkqIHN5cy9tZXNvbi5idWlsZDoKKwkqIHN5cy92NGwyL21lc29uLmJ1aWxkOgorCSogc3lzL3hpbWFnZS9tZXNvbi5idWlsZDoKKwkqIHRlc3RzL2NoZWNrL21lc29uLmJ1aWxkOgorCSogdGVzdHMvbWVzb24uYnVpbGQ6CisJICBBZGQgc3VwcG9ydCBmb3IgTWVzb24gYXMgYWx0ZXJuYXRpdmUvcGFyYWxsZWwgYnVpbGQgc3lzdGVtCisJICBodHRwczovL2dpdGh1Yi5jb20vbWVzb25idWlsZC9tZXNvbgorCSAgV2l0aCBjb250cmlidXRpb25zIGZyb206CisJICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCSAgSnVzc2kgUGFra2FuZW4gPGpwYWtrYW5lQGdtYWlsLmNvbT4gKG9yaWdpbmFsIHBvcnQpCisJICBIaWdobGlnaHRzIG9mIHRoZSBmZWF0dXJlcyBwcm92aWRlZCBhcmU6CisJICAqIEZhc3RlciBidWlsZHMgb24gTGludXggKH40MC01MCUgZmFzdGVyKQorCSAgKiBUaGUgYWJpbGl0eSB0byBidWlsZCB3aXRoIE1TVkMgb24gV2luZG93cworCSAgKiBHZW5lcmF0ZSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgZmlsZXMKKwkgICogR2VuZXJhdGUgWENvZGUgcHJvamVjdCBmaWxlcworCSAgKiBNdWNoIGZhc3RlciBidWlsZHMgb24gV2luZG93cyAob24tcGFyIHdpdGggTGludXgpCisJICAqIFNlcmlvdXNseSBmYXN0IGNvbmZpZ3VyZSBhbmQgYnVpbGRpbmcgb24gZW1iZWRkZWQKKwkgIC4uLiBhbmQgbWFueSBtb3JlLiBGb3IgbW9yZSBkZXRhaWxzIHNlZToKKwkgIGh0dHA6Ly9ibG9nLm5pcmJoZWVrLmluLzIwMTYvMDUvZ3N0cmVhbWVyLWFuZC1tZXNvbi1uZXctaG9wZS5odG1sCisJICBodHRwOi8vYmxvZy5uaXJiaGVlay5pbi8yMDE2LzA3L2J1aWxkaW5nLWFuZC1kZXZlbG9waW5nLWdzdHJlYW1lci11c2luZy5odG1sCisJICBCdWlsZGluZyB3aXRoIE1lc29uIHNob3VsZCB3b3JrIG9uIGJvdGggTGludXggYW5kIFdpbmRvd3MsIGJ1dCBtYXkKKwkgIG5lZWQgYSBmZXcgbW9yZSB0d2Vha3Mgb24gb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMuCisKKzIwMTYtMDgtMjAgMTY6NTk6MzAgKzA4MDAgIEppZSBKaWFuZyA8amlhbmdqaWVAbnVkdC5lZHUuY24+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgRml4ZWQgc3BsaXRtdXhzaW5rIDMyLWJpdCBvdmVyZmxvdyBidWcKKwkgIEV4dGVuZCB0aGUgYnl0ZSB0cmFja2luZyBjb3VudGVycyB0byA2NC1iaXQgb24KKwkgIGFsbCBwbGF0Zm9ybXMsIGluc3RlYWQgb2YgdXNpbmcgZ3NpemUsIHdoaWNoIG92ZXJmbG93cworCSAgYWZ0ZXIgNEdCLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MDAxOQorCisyMDE2LTA4LTE5IDE3OjE4OjE2ICswMzAwICBWaXZpYSBOaWtvbGFpZG91IDx2aXZpYUB0b29sc29uYWlyLmNvbT4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSAgaXNvbXA0OiBGaXggY292ZXJpdHkgd2FybmluZworCSAgSWYgYXRvbV9jb3B5X2RhdGEgZmFpbHMgdG8gd3JpdGUgYW55dGhpbmcsIHJldHVybiAwCisJICBDSUQgIzEzNzE0NTgKKworMjAxNi0wNC0wOSAwNzo1MTowMyArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyZGV2aWNlcHJvdmlkZXIuYzoKKwkqIHN5cy92NGwyL3Y0bDItdXRpbHMuYzoKKwkgIHY0bDI6IGNvbnNpc3RlbnRseSBjaGVjayAjaWZkZWYgSEFWRV9HVURFViBpbnN0ZWFkIG9mICNpZgorCSAgQm90aCB3b3JrIHdpdGggYXV0b3Rvb2xzIGJ1dCB0aGV5IGRlZmluaXRlbHkgZG9uJ3QgbWVhbiB0aGUgc2FtZSB0aGluZywgY2F1c2UKKwkgIHByb2JsZW1zIHdpdGggb3RoZXIgYnVpbGQgc3lzdGVtcywgYW5kIGFyZSBiYWQgZm9ybS4gRXhpc3RlbmNlIHNob3VsZCBhbHdheXMgYmUKKwkgIGNoZWNrZWQgd2l0aCAjaWZkZWYgb3IgI2lmIGRlZmluZWQuCisKKzIwMTYtMDQtMTkgMTA6NTM6MDUgKzA1MzAgIE5pcmJoZWVrIENoYXVoYW4gPG5pcmJoZWVrQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oOgorCSAgZGlyZWN0c291bmQ6IHBvcnQgYXdheSBmcm9tIG9sZCBEaXJlY3RYIEFQSQorCSAgRDNEWCBoYXMgYmVlbiBkZXByZWNhdGVkIGZvciB0aGUgbGFzdCA0IHllYXJzIGFuZCBsYXRlc3QgdmVyc2lvbnMgb2YKKwkgIFdpbmRvd3Mgbm8gbG9uZ2VyIHNoaXAgaGVhZGVycyBmb3IgaXQuIFRoaXMgaXMgZmluZSBhcyBsb25nIGFzIHlvdSdyZQorCSAgYnVpbGRpbmcgd2l0aCBDZXJiZXJvJ3MgV2luZS1iYXNlZCBEaXJlY3RYIGhlYWRlcnMsIGJ1dCBzdWNrcyBpZiB5b3UKKwkgIHdhbnQgdG8gYnVpbGQgYWdhaW5zdCB0aGUgYWN0dWFsIFdpbmRvd3MgU0RLLgorCSAgV2Ugd2VyZSBqdXN0IHVzaW5nIGl0IHRvIGdldCBlcnJvciBzdHJpbmdzIGFueXdheSwgc28ganVzdCB1c2UgdGhlCisJICBnZW5lcmljIGVycm9yIHN0cmluZyBBUEkuCisKKzIwMTYtMDgtMTggMTI6MDI6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBSZXZlcnQgImZsYWNwYXJzZTogQWRkIG1heGltdW0gYml0cmF0ZSB0YWciCisJICBUaGlzIHJldmVydHMgY29tbWl0IGM3MDNhYjY5ZjUyNjA5MmJiMjZjY2U0MWNhNjkxYTg5NmM4MzgzZDguCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5MzkyCisKKzIwMTYtMDgtMTggMDk6NTc6NTEgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBGaXggdW5pdCB0ZXN0IGJ5IGRpc2FibGluZyBhZGFwdGl2ZSBtaXNvcmRlci9kcm9wb3V0IGNhbGN1bGF0aW9ucworCSAgTmVlZCB0byBzZXQgbWF4LW1pc29yZGVyLXRpbWUgYW5kIG1heC1kcm9wb3V0LXRpbWUgdG8gMCBzbyB0aGUKKwkgIGppdHRlcmJ1ZmZlciBkb2VzIG5vdCBiYXNlIHRoZW0gb24gcGFja2V0IHJhdGUgY2FsY3VsYXRpb25zLgorCSAgSWYgaXQgZG9lcywgb3V0IGdhcCBpcyBiaWcgZW5vdWdoIHRvIGJlIGNvbnNpZGVyZWQgYSBuZXcgc3RyZWFtIGFuZAorCSAgd2Ugd2FpdCBmb3IgYSBmZXcgY29uc2VjdXRpdmUgcGFja2V0cyBqdXN0IHRvIGJlIHN1cmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEzMTEKKworMjAxNi0wOC0wOSAxMjo1NTo1OSArMDMwMCAgVml2aWEgTmlrb2xhaWRvdSA8dml2aWFAYWhpcnUuZXU+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgc3BsaXRtdXhzaW5rOiBBZGQgb3B0aW9uIHRvIHNwbGl0IGF0IGV4YWN0bHkgbWF4LXNpemUtdGltZQorCSAgV2lsbCB0cnkgdG8gcmVxdWVzdCBhIGtleWZyYW1lIGZyb20gdGhlIGVuY29kZXIgdG8gYmUgc2VudCBhdCB0aGUgdGFyZ2V0CisJICBydW5uaW5nIHRpbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5NjY0CisKKzIwMTYtMDgtMDkgMjA6MTY6MTYgKzAzMDAgIFZpdmlhIE5pa29sYWlkb3UgPHZpdmlhQGFoaXJ1LmV1PgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBBbGxvdyB0aW1lIGFuZCBieXRlcyB0byByZWFjaCB0aGVpciByZXNwZWN0aXZlIHRocmVzaG9sZHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njk2NjQKKworMjAxNi0wOC0xNyAwOTo0OTowNCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogQWxsb3cgbWltZXR5cGVzIHdpdGggcHJvcGVydGllcyBhcyBsb25nIGFzIHRoZXkncmUgYXBwbGljYXRpb24vc2RwCisJICBTb21lIHNlcnZlcnMgYWRkIHByb3BlcnRpZXMgbGlrZSBjaGFyc2V0LCBlLmcuCisJICBhcHBsaWNhdGlvbi9zZHA7IGNoYXJzZXQ9dXRmOAorCSAgSWRlYWxseSB3ZSBzaG91bGQgYWxzbyBwYXJzZSB0aGUgY2hhcnNldCBhbmQgZG8gY29udmVyc2lvbiBvZiBhbGwgbWVzc2FnZXMsCisJICBidXQgdGhhdCdzIGZvciBhIGxhdGVyIHRpbWUuCisKKzIwMTYtMDYtMjQgMTY6MzI6MzcgKzAzMDAgIFZpdmlhIE5pa29sYWlkb3UgPHZpdmlhQHRvb2xzb25haXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5oOgorCSAgcXRtdXg6IEFkZGVkIHN1cHBvcnQgZm9yIHdyaXRpbmcgdGltZWNvZGUgdHJhY2sKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njc5NTAKKworMjAxNi0wOC0xMSAxNjozMjoyMSAtMDYwMCAgVGhvbWFzIEJsdWVtZWwgPHRibHVlbWVsQGNvbnRyb2w0LmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazogSW5pdGlhbGl6ZSBieXRlc19zZW50IGZpZWxkLgorCSAgVGhpcyBmaXhlcyBlbmRwb2ludHMgbm90IHJlY2VpdmluZyBhbnkgZGF0YSBpbnRlcm1pdHRlbnRseS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njk3NzMKKworMjAxNi0wOC0xMCAxMTo0NToxMyAtMDYwMCAgVGhvbWFzIEJsdWVtZWwgPHRibHVlbWVsQGNvbnRyb2w0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBBY3R1YWxseSBjYWxjdWxhdGUgdGhlIHBhY2tldCByYXRlIGZvciBtYXgtZHJvcG91dCBhbmQgbWF4LW1pc29yZGVyIGNhbGN1bGF0aW9ucy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEzMTEKKworMjAxNi0wOC0xMCAxMToyNjoxNyAtMDYwMCAgVGhvbWFzIEJsdWVtZWwgPHRibHVlbWVsQGNvbnRyb2w0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IERvbid0IHdhcm4gZm9yIGR1cGxpY2F0ZSBwYWNrZXRzCisJICBUaGlzIGlzIGEgbm9ybWFsIHNjZW5hcmlvIGFuZCBzaG91bGQgbm90IGJlIGEgd2FybmluZy4gIFRoaXMgY2FuCisJICBoYXBwZW4gZnJlcXVlbnRseSB3aGVuIHJlLXRyYW5zbWl0cyBvZiBsb3N0IHBhY2tldHMgYXJlIGVuYWJsZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMjA4CisKKzIwMTYtMDgtMDggMTM6NDk6MTkgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXg6IEZpeCB0eXBvIGNvbnZlcnRpbmcgdG8gcnVubmluZyB0aW1lLgorCSAgVXNlIHRoZSBjb3JyZWN0IGNvbGxlY3RlZCB0aW1lc3RhbXAuCisKKzIwMTYtMDgtMDggMDI6NTM6NDggKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuaDoKKwkgIFJldmVydCAic3BsaXRtdXhzaW5rOiBVc2UgR3N0QmluIGFzeW5jLWhhbmRsaW5nIGluc3RlYWQgb2Ygb3VyIG93bi4iCisJICBUaGlzIHJldmVydHMgY29tbWl0IGZhMDA4ZjI3MWE1MmY4MmRlZGVkYzI4YmQ4MWIwMjBjYTc5MzliNDcuCisJICBhc3luYy1oYW5kbGluZyBpbiBHc3RCaW4gY2F1c2VzIHRoZSBwaXBlbGluZSB0byBzcGluIGF0IDEwMCUKKwkgIENQVSBhcyB0aGUgdG9wLWxldmVsIHBpcGVsaW5lIHRyaWVzIHRvIGNoYW5nZSB0aGF0IHN0YXRlCisJICB0byBQTEFZSU5HIGNvbnN0YW50bHkuIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBhIGNvcmUKKwkgIHByb2JsZW0sIGVzc2VudGlhbGx5LCBidXQgYW4gaW1wcm92ZW1lbnQgaW4gdGhpcyBjYXNlIGZvciBub3cuCisKKzIwMTYtMDgtMDggMDA6NTY6MzggKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXg6IFJlY2hlY2sgc3RhdGUgYWZ0ZXIgdW5sb2NraW5nIG11dGV4LgorCSAgQWZ0ZXIgZHJvcHBpbmcgdGhlIHNwbGl0bXV4IGxvY2ssIHJlLWNoZWNrIHRoZSBzdGF0ZSwKKwkgIGRvbid0IGp1c3QgZmFsbCB0aHJvdWdoIGFuZCBzbGVlcCB1bmNvbmRpdGlvbmFsbHksCisJICBhcyB3ZSBtYXkgaGF2ZSBhbHJlYWR5IG1pc3NlZCB0aGUgd2FrZXVwLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTUxNAorCisyMDE2LTA4LTAzIDAzOjMyOjA3ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNyYy5jOgorCSAgc3BsaXRtdXhzcmM6IERvbid0IHN0b3AgYW5kIGVycm9yIG9uIEVPUyBmbG93IHJldHVybgorCSAgRG9uJ3QgaW1tZWRpYXRlbHkgaGFsdCBvbiBFT1MgZmxvdyByZXR1cm4gZnJvbSBkb3duc3RyZWFtCisJICBkdWUgdG8gb3V0IG9mIHNlZ21lbnQuIExldCB0aGUgZGVtdXhlciBoYW5kbGUgaXQgYW5kIHNlbmQKKwkgIEVPUy4KKworMjAxNi0wOC0wNCAwMDozNjoyOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NhbnRvc0BnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBhdm9pZCB1bnJlZiBvZiBudWxsIGJ1ZmZlcgorCSAgVGhlIGN1cnJlbnQgJ2wnIHBvaW50ZXIgd2lsbCBiZSBOVUxMIHdoZW4gdGhlIGxvb3AKKwkgIGlzIGludGVycnVwdGVkIHdpdGggYSAnYnJlYWsnIHN0YXRlbWVudC4gTmVlZCB0byBoYXZlCisJICBpdCBhZHZhbmNlIHRvIHRoZSBuZXh0IGxpc3QgaXRlbSBiZWZvcmUgaW50ZXJydXB0aW5nLgorCisyMDE2LTA4LTAyIDE0OjAxOjE0ICswMjAwICBDYXJsb3MgUmFmYWVsIEdpYW5pIDxkdkBwc2V1ZG90ZXJtaW5hbC5vcmc+CisKKwkqIGdzdC93YXZwYXJzZS9NYWtlZmlsZS5hbToKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IEFkZCB0YWdzIGZvciBjb250YWluZXIgZm9ybWF0IGFuZCBiaXRyYXRlIGZvciB1bmNvbXByZXNzZWQgUENNCisJICBUaGUgUENNIGJpdHJhdGUgaXMgYWRkZWQgdG8gaGVscCBkb3duc3RyZWFtIGVsZW1lbnRzIChsaWtlIHVyaWRlY29kZWJpbikKKwkgIGZpZ3VyZSBvdXQgYSBwcm9wZXIgbmV0d29yayBidWZmZXIgc2l6ZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2OTM5MAorCisyMDE2LTA4LTAxIDE4OjUyOjI2ICswMjAwICBDYXJsb3MgUmFmYWVsIEdpYW5pIDxkdkBwc2V1ZG90ZXJtaW5hbC5vcmc+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IEFkZCBtYXhpbXVtIGJpdHJhdGUgdGFnCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY5MzkyCisKKzIwMTYtMDctMjggMTc6NTg6MTYgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogV2hlbiByZWNlaXZpbmcgYSBESVNDT05UIGJ1ZmZlciB0aGF0IGRvZXMgbm90IHBvaW50IHRvIGEgc2FtcGxlLCByZW1lbWJlciB0aGUgb2Zmc2V0CisJICBBbmQgZG9uJ3QganVzdCByZXNldCBldmVyeXRoaW5nLiBUaGlzIG1ha2VzIHN1cmUgdGhhdCB3ZSBjYW4gY29udGludWUgdG8KKwkgIGhhbmRsZSBkYXRhIGluIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW86CisJICBtb292OiBkaXNjb250CisJICBtb29mOiBkaXNjb250CisJICBtZGF0OiBjb250aW51b3VzCisJICBQcmV2aW91c2x5IHRoaXMgd291bGQgZmFpbCBiZWNhdXNlIHRoZSBvZmZzZXQgd291bGQgYmUgdGhlIGFjY3VtdWxhdGVkIG9mZnNldAorCSAgZnJvbSBtb292IGFuZCBtb29mIGF0IHRoZSBtZGF0IHBvc2l0aW9uLCB3aGlsZSB0aGUgYnVmZmVyIG9mZnNldCBtaWdodCBiZQorCSAgc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50LgorCisyMDE2LTA3LTI1IDEzOjM0OjAyICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGJ2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzoKKwkgIHJ0cDogRmlsdGVyIHdpdGggdGhlIGZpbHRlciBjYXBzIGluIHRoZSBwYXlsb2FkZXIncyBnZXRjYXBzCisKKzIwMTYtMDMtMDMgMTE6MzU6MDYgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IGluY2x1ZGUgaHR0cC1zdGF0dXMtY29kZSBpbiBlcnJvciBtZXNzYWdlIGRldGFpbHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjMwMzgKKworMjAxNi0wNy0yNSAxODoyMDowMyArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IEZpeCBkZWJ1ZyBzdGF0ZW1lbnQgc2lnbmVkbmVzcy4KKwkgIFRoZSB0cyB2YXJpYWJsZSBpcyBhIEdzdENsb2NrVGltZSwgZG9uJ3QgcHJpbnQgaXQKKwkgIGFzIGEgR3N0Q2xvY2tUaW1lRGlmZi4KKworMjAxNi0wNy0xNyAyMjo0MTowMiArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgc3BsaXRtdXhzaW5rOiBIYW5kbGUgbmVnYXRpdmUgcnVubmluZyB0aW1lCisJICBVc2Ugc2lnbmVkIGNsb2NrIHRpbWVzIGZvciBydW5uaW5nIHRpbWUgZXZlcnl3aGVyZQorCSAgc28gdGhhdCB3ZSBoYW5kbGUgbmVnYXRpdmUgcnVubmluZyB0aW1lcyB3aXRob3V0CisJICBnb2luZyBoYXl3aXJlLCBzaW1pbGFyIHRvIHdoYXQgcXVldWUgYW5kIG11bHRpcXVldWUKKwkgIGRvIHRoZXNlIGRheXMuCisKKzIwMTYtMDctMTggMDA6MTI6NTUgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBEcm9wIGxvY2sgd2hlbiBzZW5kaW5nIGR1bW15IGV2ZW50CisJICBXaGVuIHB1c2hpbmcgdGhlIGR1bW15IGV2ZW50IGludG8gdGhlIG11bHRpcXVldWUsCisJICBkcm9wIHRoZSBzcGxpdG11eCBsb2NrIG9yIGVsc2Ugd2UgbWlnaHQgZGVhZGxvY2suCisKKzIwMTYtMDYtMzAgMDE6NTY6NDEgKzEwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiBJbnRlcnNlY3Qgd2l0aCBmaWx0ZXIgY2FwcyBpbiBnZXRjYXBzIGZ1bmN0aW9uLgorCSAgQWx3YXlzIGludGVyc2VjdCB3aXRoIHRoZSBmaWx0ZXIgY2FwcyBpbiB0aGUgZ2V0Y2FwcyBmdW5jdGlvbgorCSAgdG8gbWFrZSBzdXJlIHdlIHJldHVybiBhIHN1YnNldCBvZiB3aGF0IHdhcyByZXF1ZXN0ZWQuCisJICBPdGhlciBwYXlsb2FkZXJzIGFsc28gaGF2ZSB0aGlzIHByb2JsZW0gYW5kIG5lZWQgZml4aW5nCisJICBpbiBmdXR1cmUgY29tbWl0cy4KKworMjAxNi0wNy0xMiAxNzozMDo1NiArMDIwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0ZGVtdXguYzoKKwkgIHRlc3RzOiBxdGRlbXV4OiBmaXggZWxlbWVudCBhbmQgcGFkIGxlYWsKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njg3MzkKKworMjAxNi0wNy0xMiAxNjo0NTozNiArMDIwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZmlyZmlsdGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2lpcmZpbHRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvYm94LmM6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZWZmZWN0di5jOgorCSAgdGVzdHM6IGZpeCBidXMgbGVha3MKKwkgIGdzdF9idXNfYWRkX3NpZ25hbF93YXRjaCgpIHRha2VzIGEgcmVmIG9uIHRoZSBidXMgd2hpY2ggc2hvdWxkIGJlCisJICByZWxlYXNlZCB1c2luZyBnc3RfYnVzX3JlbW92ZV9zaWduYWxfd2F0Y2goKS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njg3MzkKKworMjAxNi0wNy0xNCAwMzowNzoxMSArMDgwMCAgVGluZy1XZWkgTGFuIDxsYW50d0BzcmMuZ25vbWUub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IENhbGwgQUdfR1NUX1BLR19DT05GSUdfUEFUSCB0byBzZXQgR1NUX1BLR19DT05GSUdfUEFUSAorCSAgR1NUX1BLR19DT05GSUdfUEFUSCBpcyB1c2VkIGluIGRvY3MvcGx1Z2lucyBkaXJlY3RvcnksIHNvCisJICBBR19HU1RfUEtHX0NPTkZJR19QQVRIIG11c3QgYmUgY2FsbGVkIHRvIHNldCBpdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njg3ODcKKworMjAxNi0wNy0xMiAwNzozOTo1OCArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBEb24ndCBkcm9wIGZpbmFsIGJ5dGVzIG9mIGEgcmFuZ2UgcmVxdWVzdAorCSAgQXQgdGhlIGVuZCBvZiBhIHJhbmdlIHJlcXVlc3QsIHdlIGRvbid0IHdhbnQgdG8gcmV0dXJuIEdTVF9GTE9XX0VPUyBvdGhlcndpc2UKKwkgIHRoZSBsYXN0IGJ5dGVzIHdlIGp1c3QgcmVhZCB3aWxsIGJlIGRyb3BwZWQgYnkgYmFzZXNyYy4KKwkgIEluc3RlYWQganVzdCByZXR1cm4gR1NUX0ZMT1dfT0sgKHdoaWNoIHdhcyBzZXQganVzdCBiZWZvcmUpIGFuZCBsZXQgYmFzZXNyYworCSAgaGFuZGxlIHRoZSBmYWN0IHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzZWdtZW50LgorCisyMDE2LTA3LTExIDE4OjMwOjE4IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJkZXZpY2Vwcm92aWRlci5jOgorCSAgdjRsMnByb3ZpZGVyOiBGaXggZGV2aWNlIHR5cGUgZGV0ZWN0aW9uCisJICBUaGUgdHlwZSBkZXRlY3Rpb24gd291bGQgbGVhZCB0byBhc3NlcnRpb24gYXMgaXQgd291bGQgdHJ5CisJICB0byBjcmVhdGUgYSBkZXZpY2Ugd2l0aG91dCBoYXZpbmcgZm91bmQgYW55IHR5cGUgZm9yIGl0LiBJdAorCSAgYWxzbyBkaWRuJ3QgZGV0ZWN0IE1QTEFORSBkZXZpY2VzIHByb3Blcmx5LgorCisyMDE2LTA3LTExIDE4OjI5OjAxIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IERvbid0IGFzc2VydCB3aGVuIHVzZWQgYnkgdGhlIG1vbml0b3IKKwkgIFRoZSBtb25pdG9yIHNldHMgdGhlIG9iamVjdC0+ZWxlbWVudCBvYmplY3QgYXMgYSBHc3RPYmplY3QuIFRoaXMKKwkgIHdvcmtzIGZvciBkZWJ1ZyB0cmFjZXMsIGJ1dCB3aWxsIGFzc2VydCBmb3IgRUxFTUVOVF9FUlJPUi4gVGhpcworCSAgd2FzIHRoZSBvbmx5IGNhc2Ugd2hlcmUgdGhhdCBjb3VsZCBoYXBwZW4uIEFkZCBhIGNoZWNrIGZvciB0aGF0LgorCisyMDE2LTA3LTExIDE3OjM4OjAwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IEluZGVudCB2ZXJ5IGxvbmcgbGluZQorCisyMDE2LTA3LTEyIDAwOjQyOjAyICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IEF0IHRoZSBlbmQgb2YgYSByYW5nZSByZXF1ZXN0LCByZWFkIGFub3RoZXIgdGltZSB0byBmaW5hbGl6ZSB0aGUgcmVxdWVzdAorCSAgSWYgd2UncmUgYXQgdGhlIGVuZCBvZiBhIHJhbmdlIHJlcXVlc3QsIHJlYWQgYWdhaW4gdG8gbGV0IGxpYnNvdXAKKwkgIGZpbmFsaXplIHRoZSByZXF1ZXN0LiBUaGlzIGFsbG93cyB0byByZXVzZSB0aGUgY29ubmVjdGlvbiBhZ2FpbiBsYXRlciwKKwkgIG90aGVyd2lzZSB3ZSB3b3VsZCBoYXZlIHRvIGNhbmNlbCB0aGUgbWVzc2FnZSBhbmQgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCisKKzIwMTYtMDctMTEgMjE6MTM6NDcgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBmMzYzYjMyIHRvIGY0OWM1NWUKKworMjAxNi0wNy0xMSAxOTo1NzoxOCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBGaXgga2VlcC1hbGl2ZSBoYW5kbGluZworCSAgV2UgaGF2ZSB0byBnZXQgcmlkIG9mIHRoZSBtZXNzYWdlIG9uIEVPUyB3aGVuIHRoZSBjb21wbGV0ZSBzdHJlYW0gaXMgcmVhZCB0bworCSAgcmVtZW1iZXIgdGhhdCB3ZSBzdWNjZXNzZnVsbHkgZmluaXNoZWQgaGFuZGxpbmcgdGhpcyBzcGVjaWZpYyBtZXNzYWdlLgorCSAgT3RoZXJ3aXNlIHdlIHdpbGwgY2FuY2VsIGl0IGxhdGVyIGFuZCBjbG9zZSB0aGUgY29ubmVjdGlvbiBpbnN0ZWFkIG9mIHJldXNpbmcKKwkgIGl0IGF0IGEgbGF0ZXIgdGltZS4KKwkgIEl0IG1pZ2h0IGFsc28gbWFrZSBzZW5zZSB0byByZXVzZSBjb25uZWN0aW9ucyBpZiBhIG5vbi0yMDAgcmVzcG9uc2UgaXMKKwkgIHJlY2VpdmVkLiBBcyBsb25nIGFzIHRoZXJlIHdhcyBubyBjb25uZWN0aW9uIGVycm9yLCB0aGUgSFRUUCBjb25uZWN0aW9uIHNob3VsZAorCSAgYmUgcmUtdXNhYmxlLgorCisyMDE2LTA3LTExIDEyOjA1OjA2IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEFsc28gZW5hYmxlIFY0TDIgcHJvYmUgb24gYWFyY2g2NCAoYWthIEFSTSA2NGJpdCkKKworMjAxNi0wNy0xMSAxMTo1OToxOSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLmM6CisJICBydHAgZXhhbXBsZTogRml4IGxlYWsKKwkgIEFsc28gc3RvcCBmZXRjaGluZyB0aGUgaW50ZXJuYWwgc291cmNlIGFzIHRoaXMKKwkgIGZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gYnJva2VuLgorCisyMDE2LTA3LTA4IDE0OjU4OjM3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEVuYWJsZSB2NGwyIHByb2JlIG9uIExpbnV4L0FSTQorCSAgTW9zdCBvZiB0aG9zZSBoYXZlIFY0TDIgZHJpdmVycyB0aGVzZSBkYXlzIGVuYWJsaW5nIGl0IG1ha2Ugc3VyZSB0aGF0IGl0CisJICB0aGlzIGNvZGUgaXMgZW5hYmxlZCBpbiBtYWpvciBkaXN0cmlidXRpb24sIGhlbmNlIHRoYXQgSFcgYWNjZWxlcmF0ZWQKKwkgIGRlY29kZXIvZW5jb2RlciBjYW4gYmUgdXNlZCBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IGl0LiBUaGUgcHJvYmVzIGFyZQorCSAgc2xpZ2h0bHkgaW5jcmVhc2luZyB0aGUgZmlyc3QgaW5pdCBvZiBnc3RyZWFtZXIgbGlicmFyeSwgdGhvdWdoIHRoZQorCSAgcmVzdWx0IGlzIGNhY2hlZCBpbiB0aGUgcmVnaXN0cnkgZm9yIGxhdGVyIHVzZS4KKworMjAxNi0wNy0xMSAwOTo0Njo0OSArMDIwMCAgSm9uYXMgSG9sbWJlcmcgPGpvbmFzaGdAYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHJ0cGgyNjVwYXk6IEFjY2VwdCBhcnJheV9jb21wbGV0ZW5lc3M9MQorCSAgV2hlbiBwYXJzaW5nIE5BTCB1bml0IHR5cGUgaW4gY29kZWNfZGF0YSwgY2hlY2sgdGhlIDZiaXRzIG9mCisJICBOQUxfdW5pdF90eXBlIG9ubHkgYW5kIGRvIG5vdCByZXF1aXJlIHRoZSBhcnJheV9jb21wbGV0ZW5lc3MgYml0IHRvIGJlCisJICAwLCBzaW5jZSB0aGUgZGVmYXVsdCBhbmQgbWFuZGF0b3J5IHZhbHVlIG9mIGFycmF5X2NvbXBsZXRlbmVzcyBpcyAxIGZvcgorCSAgaHZjMS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njg2NTMKKworMjAxNi0wNy0xMCAyMTozNTowNiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBBbHNvIGNvcHkgZGV2aWNlX2NhcHMgaW4gZ3N0X3Y0bDJfZHVwCisJICBUaGlzIGZpeGVzIHJlZ3Jlc3Npb24gd2hlcmUgTTJNIGVycm9yIG91dCBzYXlpbmcgdGhleSBoYXZlIG5vIG91dHB1dAorCSAgZm9ybWF0ICh0aGUgVjRMMiBDQVBUVVJFIHNpZGUpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2ODE5NQorCisyMDE2LTA3LTEwIDIxOjMwOjI3ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBVc2UgY29ycmVjdCBpbjZfcGt0aW5mbyBzdHJ1Y3QgaW5zdGVhZCBvZiBpbl9wa3RpbmZvCisJICBGaXhlcyB0aGUgYnVpbGQgb24gRnJlZUJTRCwgd2hpY2ggZG9lcyBub3QgaGF2ZSB0aGUgbGF0dGVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2ODYyMworCisyMDE2LTA3LTA4IDE3OjI4OjE5ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBmaXggbXVsdGlwbGFuYXIgY2FwdHVyZQorCSAgQWZ0ZXIgc3dpdGNoaW5nIHRvIHVzaW5nIFY0TDJfQ0FQX0RFVklDRV9DQVBTIHdlIGxvc3Qgc3VwcG9ydCBmb3IKKwkgIG11bHRpcGxhbmFyIGRldmljZSB0eXBlcy4gQWZ0ZXIgc29tZSByZXNlYXJjaCwgaXQgbG9va3MgbGlrZQorCSAgdmNhcC5jYXBhYmlsaXRpZXMgdHJlYXRlZCB0aGUgbXVsdGlwbGFuYXIgZmxhZyBvZiBvdXRwdXQgYW5kIGNhcHR1cmUKKwkgIGRldmljZXMgZXF1YWxseSwgYnV0IG5vdCB0aGUgbmV3IGRldmljZV9jYXBzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2ODE5NQorCisyMDE2LTA3LTA4IDE0OjU2OjMwICswMjAwICBNYXRzIExpbmRlc3RhbSA8bWF0c2xtQGF4aXMuY29tPgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguaDoKKwkgIG11bHRpcGFydG11eDogVXNlIFBUUyBhbmQgRFRTIGluc3RlYWQgb2YgdGltZXN0YW1wCisJICBBbmQgcGFzcy10aHJvdWdoIGJvdGggb2YgdGhlbS4KKwkgIEJhc2VkIG9uIGEgcGF0Y2ggYnkgR8O2cmFuIErDtm5zc29uIDxnb3JhbmpuQGF4aXMuY29tPgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzkwMAorCisyMDE2LTA2LTMwIDE0OjQwOjQwICswMjAwICBUaG9tYXMgU2NoZXVlcm1hbm4gPFRob21hcy5TY2hldWVybWFubkBiYXJjby5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jOgorCSAgamFjazogZG9uJ3Qgd2FpdCBmb3IgY2FsbGJhY2tzIGlmIHRoZSBqYWNrIHNlcnZlciBzaHV0IGRvd24KKwkgIE90aGVyd2lzZSB3ZSdsbCB3YWl0IGZvcmV2ZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3Mjc1CisKKzIwMTYtMDYtMjMgMTU6MzA6MTkgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogTGV0IHVwc3RyZWFtIGV2ZW50cyBnbyB0aHJvdWdoIHVwc3RyZWFtCisJICBUaGVyZSdzIG5vIHJlYWwgcmVhc29uIHRvIGF2b2lkIHNlbmRpbmcgUU9TL05BVklHQVRJT04gZXZlbnRzIHVwc3RyZWEuCisJICBTb21lIGVsZW1lbnRzIG1pZ2h0IHdhbnQgdG8gaGF2ZSB0aGF0IGluZm9ybWF0aW9uLgorCisyMDE2LTA2LTIzIDE1OjIyOjU2ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogTGV0IHVwc3RyZWFtIGV2ZW50cyBnbyB0aHJvdWdoIHVwc3RyZWFtCisJICBUaGVyZSdzIG5vIHJlYWwgcmVhc29uIHRvIGF2b2lkIHNlbmRpbmcgUU9TL05BVklHQVRJT04gZXZlbnRzIHVwc3RyZWEuCisJICBTb21lIGVsZW1lbnRzIG1pZ2h0IHdhbnQgdG8gaGF2ZSB0aGF0IGluZm9ybWF0aW9uLgorCisyMDE2LTA2LTIzIDE1OjE3OjM2ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSAgZHZkZW11eDogTGV0IHVwc3RyZWFtIGV2ZW50cyBnbyB0aHJvdWdoIHVwc3RyZWFtCisJICBUaGVyZSdzIG5vIHJlYWwgcmVhc29uIHRvIGF2b2lkIHNlbmRpbmcgUU9TL05BVklHQVRJT04gZXZlbnRzIHVwc3RyZWEuCisJICBTb21lIGVsZW1lbnRzIG1pZ2h0IHdhbnQgdG8gaGF2ZSB0aGF0IGluZm9ybWF0aW9uLgorCSAgQWxzbyByZW1vdmUgZG93bnN0cmVhbS1vbmx5IENBUFMgZXZlbnQgaGFuZGxpbmcgYW5kIG1pbmltaXplIGNvZGUKKworMjAxNi0wNy0wNyAyMzo1Mzo1NCArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMi5jOgorCSAgdjRsMjogZml4IHY0bDIgcHJvYmUgYnVpbGQgZXJyb3IKKwkgIEEgdHlwbyBpbiBnc3RfdjRsMl9wcm9iZV9hbmRfcmVnaXN0ZXIoKSBjYXVzZWQgYSBidWlsZCBlcnJvciB3aGVuIGJ1aWxkaW5nCisJICB3aXRoIC0tZW5hYmxlLXY0bDItcHJvYmUuIEZpeGluZyBpdC4KKwkgIGdzdHY0bDIuYzogSW4gZnVuY3Rpb24gJ2dzdF92NGwyX3Byb2JlX2FuZF9yZWdpc3Rlcic6CisJICBnc3R2NGwyLmM6MTUwOjI1OiBlcnJvcjogJ3N0cnVjdCB2NGwyX2NhcGFiaWxpdHknIGhhcyBubyBtZW1iZXIgbmFtZWQgJ2NhcGFiaWxpdGl0ZXMnCisJICBkZXZpY2VfY2FwcyA9IHZjYXAuY2FwYWJpbGl0aXRlczsKKworMjAxNi0wNy0wMSAyMjo1MzozMyAtMDcwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiB1c2UgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgaW4gbmVnb3RpYXRlKCkKKwkgIEluc3RlYWQgb2YgcmVpbXBsZW1lbnRpbmcgdGhlIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVAorCSAgaW50ZXJlY3Rpb24gbW9kZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjgxOTUKKworMjAxNi0wNy0wMiAwMTo1NjowNyAtMDcwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmRldmljZXByb3ZpZGVyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwycmFkaW8uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiB1c2Ugb3BlbmVkIGRldmljZSBjYXBzIGluc3RlYWQgb2YgcGh5c2ljYWwgZGV2aWNlIG9uZXMKKwkgIFRoZSBzYW1lIHBoeXNpY2FsIGRldmljZSBjYW4gZXhwb3J0IG11bHRpcGxlIGRldmljZXMuIEluCisJICB0aGlzIGNhc2UsIHRoZSBjYXBhYmlsaXRpZXMgZmllbGQgbm93IGNvbnRhaW5zIGEgdW5pb24gb2YKKwkgIGFsbCBjYXBzIGF2YWlsYWJsZSBmcm9tIGFsbCBleHBvcnRlZCBWNEwyIGRldmljZXMgYWxvbmdzaWRlCisJICBhIFY0TDJfQ0FQX0RFVklDRV9DQVBTIGZsYWcgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBkZWNpZGUKKwkgIHdoYXQgY2FwYWJpbGl0aWVzIHRvIGNvbnNpZGVyLiBJbiBvdXIgY2FzZSwgd2UgbmVlZCB0aGUKKwkgIG9uZXMgZnJvbSB0aGUgZXhwb3J0ZWQgZGV2aWNlIHdlIGFyZSB1c2luZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjgxOTUKKworMjAxNi0wNy0wNyAxODoyNDo1OSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IFJlbW92ZSBzdXNwaWNpb3VzIGNoZWNrcyBmb3IgcGFkcyBiZWluZyBhY3RpdmUgYW5kIGxpbmtlZAorCSAgV2Ugc2hvdWxkIGFkZCBhbGwgcGFkcywgbm8gbWF0dGVyIGlmIHRoZXkgYXJlIGxpbmtlZCBvciBhY3RpdmUgb3Igbm90IGF0IHRoaXMKKwkgIHBvaW50LiBTa2lwcGluZyBzb21lIHRoYXQgYXJlIG5vdCB3aWxsIGNhdXNlIGRpZmZlcmVudCBiZWhhdmlvdXIgdGhhbiB3aXRoCisJICBvdGhlciBtdXhlcnMuCisKKzIwMTYtMDctMDcgMTg6MjM6MDcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBFcnJvciBvdXQgaWYgd2Ugc3RhcnQgd3JpdGluZyBkYXRhIHdpdGggc29tZSBwYWRzIG5vdCBoYXZpbmcgYSBjb2RlYyBpZCB5ZXQKKwkgIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIGEpIHVwc3RyZWFtIHNvbWVob3cgZ2V0cyBhcm91bmQgdGhlIENBUFMgZXZlbnQgZmFpbGluZworCSAgb3IgYikgdGhlcmUgbmV2ZXIgYmVpbmcgYW55IENBUFMgZXZlbnQuCisJICBUaGUgZm9sbG93aW5nIGNvZGUgYXNzdW1lcyB0aGF0IGFsbCBwYWRzIGhhdmUgYSBjb2RlYy1pZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njg1MDkKKworMjAxNi0wNy0wNyAxODoxNDo0MyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IENvbnNpc3RlbnRseSB1c2UgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQoKSBmb3Igc2V0dGluZyB0aGUgY29kZWMgaWQKKworMjAxNi0wNy0wNCAwOTo1MDoxMSArMDIwMCAgSm9uYXMgSG9sbWJlcmcgPGpvbmFzaGdAYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHJ0cGgyNjVwYXkvZGVwYXk6IFN5bmMgYWdhaW5zdCBSRkMgNzc5OAorCSAgSGFuZGxlIHNwcm9wLXZwcywgc3Byb3Atc3BzIGFuZCBzcHJvcC1wcHMgaW4gY2FwcyBpbnN0ZWFkIG9mCisJICBzcHJvcC1wYXJhbWV0ZXItc2V0cy4KKwkgIHJ0cGgyNjVwYXkgd29ya3Mgd2l0aCBieXRlLXN0cmVhbSBhbmQgaHZjMSBmb3JtYXRzIGJ1dCBub3QgaGV2MSB5ZXQuIEl0CisJICBoYW5kbGVzIHByb2ZpbGUtaWQsIHRpZXItZmxhZyBhbmQgbGV2ZWwtaWQgaW4gY2FwcyBxdWVyeS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM3NjAKKworMjAxNi0wNy0wNiAwOToyNTowMCArMDIwMCAgSmFuIEFsZXhhbmRlciBTdGVmZmVucyAoaGVmdGlnKSA8amFuLnN0ZWZmZW5zQGdtYWlsLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5oOgorCSAgZmx2ZGVtdXg6IFB1c2ggbm9taW5hbCBiaXRyYXRlIHRhZ3MKKwkgIEFkZCBwZXItc3RyZWFtIHRhZyBsaXN0cywgd2hpY2ggYXJlIHVzZWQgdG8gc2VuZCBub21pbmFsCisJICBiaXRyYXRlIHRhZ3MuIFdoZW4gcmVtdXhpbmcgRkxWID0+IEZMViwgdGhpcyBub3cgcGFzc2VzCisJICB0aHJvdWdoIHRoZSB1cHN0cmVhbSBiaXRyYXRlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2ODQ0MAorCisyMDE2LTA3LTA2IDA5OjI0OjQ5ICswMjAwICBKYW4gQWxleGFuZGVyIFN0ZWZmZW5zIChoZWZ0aWcpIDxqYW4uc3RlZmZlbnNAZ21haWwuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4Lmg6CisJICBmbHZkZW11eDogUmVmYWN0b3IgbWV0YWRhdGEgdGFnIGhhbmRsaW5nCisJICBUaGUgRkxWIGhlYWRlciBjYW5ub3QgYmUgdHJ1c3RlZCB0byBpbmRpY2F0ZSB2aWRlbyBvcgorCSAgYXVkaW8gcHJlc2VuY2UsIGFzIHRoZSBjb21tZW50cyBhbHJlYWR5IG1lbnRpb24uIERvbid0CisJICBkZWxheSBwdXNoaW5nIHRhZ3Mgd2FpdGluZyBmb3Igc3RyZWFtcyB0aGF0IG1pZ2h0IG5ldmVyCisJICBhcHBlYXIuCisJICBUYWdzIGFyZSBub3cgcHVzaGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZXkgY2hhbmdlOgorCSAgLSBBZnRlciBwYXJzaW5nIGFuIG9uTWV0YURhdGEgc2NyaXB0IG9iamVjdAorCSAgLSBBZnRlciBuZWdvdGlhdGluZyBjYXBzIG9uIGEgcGFkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY4NDQwCisKKzIwMTYtMDctMDYgMTI6NDQ6MTAgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IEFBQyBjb2RlY19kYXRhIHZhbHVlcworCSAgQXMgc2VlbiBpbiB0aGUgcGFyZW50IHN3aXRjaCBmb3Igb2JqZWN0X3R5cGVfaWQsIHRoZSA0IHBvc3NpYmxlIHZhbHVlcyBhcmUKKwkgIDB4NDAsIDB4NjYsIDB4NjcgYW5kIDB4NjguIEZpeGluZyB0aGUgbmVzdGVkIHN3aXRjaCB0byBtYXRjaCB0aGVzZSB2YWx1ZXMuCisJICBMb29rcyBsaWtlIGl0IHdhcyBhIHR5cG8gbWFraW5nIHRoZW0gZGVjaW1hbCBpbnN0ZWFkIG9mIGhleGFkZWNpbWFsLgorCSAgQ0lEIDEzNjMzMjgKKworMjAxNi0wNy0wNiAxMzo1MTowMyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjkuMSA9PT0KKworMjAxNi0wNy0wNiAxMzowNjo0NCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS45LjEKKworMjAxNi0wNy0wNiAxMTo0NjoyNiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNi0wNy0wNiAxMToyMjo1MyArMDMwMCAgU3RldmVuIEhvdmluZyA8c2hAYmlnYnJvdGhlci5ubD4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogRml4IGVycm9yIG1lc3NhZ2VzIHRvIGZpcnN0IGNvbnZlcnQgdG8gZG91YmxlcyBiZWZvcmUgZGl2aXNpb24KKworMjAxNi0wNy0wNiAxMDoxODozMCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vZGEucG86CisJKiBwby9oci5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vc2sucG86CisJICBwbzogVXBkYXRlIHRyYW5zbGF0aW9ucworCisyMDE2LTA3LTA1IDIxOjExOjM1ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBTZXQgdG8gUExBWUlORyBhZnRlciBhIHNlZWsgYWdhaW4gYWZ0ZXIgc2V0dGluZyB1cCB0aGUgc2VnbWVudCBhbmQgZXZlcnl0aGluZyBlbHNlCisJICBUaGVyZSdzIGEgc21hbGwgd2luZG93IGZvciBhIHJhY2UgY29uZGl0aW9uIG90aGVyd2lzZS4KKworMjAxNi0wNy0wNCAxNzo0NTo0MCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIHF0bXV4OiBVc2UgY29tcGxldGUgQUFDIGNhcHMgd2l0aCBjb2RlY19kYXRhIGluIHRoZSB0ZXN0cworCisyMDE2LTA3LTA0IDE2OjU4OjM4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogUmVqZWN0IHJhdyBBQUMgaWYgbm8gY29kZWNfZGF0YSBpcyBmb3VuZCBpbiB0aGUgY2FwcworCSAgSWYgbmVjZXNzYXJ5LCBhIGRlbXV4ZXIgd2lsbCBoYXZlIHRvIGludmVudCBzb21ldGhpbmcgaGVyZSBidXQgdGhpcyBpcyBvbmx5IGEKKwkgIHByb2JsZW0gd2l0aCBub24tY29uZm9ybWFudCBmaWxlcyBhbnl3YXkuCisKKzIwMTYtMDctMDQgMTY6NTU6MzIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogSW52ZW50IEFBQyBjb2RlY19kYXRhIGlmIG5vbmUgaXMgcHJlc2VudAorCSAgV2l0aG91dCwgcmF3IEFBQyBjYW4ndCBiZSBoYW5kbGVkIGFuZCB3ZSBoYXZlIHNvbWUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGluCisJICB0aGUgZGVjb2RlciB0aGF0IG1vc3QgbGlrZWx5IGFsbG93cyB1cyB0byBkZWNvZGUgdGhlIHN0cmVhbSBpbiBvbmUgd2F5IG9yCisJICBhbm90aGVyLiBUaGlzIGlzIHRoZSBzYW1lIGNvZGUgYWxyZWFkeSB1c2VkIGJ5IG1hdHJvc2thZGVtdXggZm9yIHRoZSBzYW1lCisJICByZWFzb25zLCBhbmQgZmZtcGVnL3ZsYyBwbGF5IHN1Y2ggZmlsZXMganVzdCBmaW5lIHRvbyBieSBndWVzc3dvcmsuCisKKzIwMTYtMDctMDQgMTQ6NTQ6MTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBSZWplY3QgcmF3IEFBQyBjYXBzIHdpdGhvdXQgY29kZWNfZGF0YQorCSAgVGhlIHJlc3VsdGluZyBmaWxlIGlzIG5vdCBnb2luZyB0byBiZSBwbGF5YWJsZSB3aXRob3V0IGd1ZXNzd29yayBhbmQgcmF3IGNhcHMKKwkgIHNob3VsZCBhbHdheXMgaGF2ZSBjb2RlY19kYXRhLgorCisyMDE2LTA1LTEwIDE1OjQ4OjQ5ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJICBxdGRlbXV4OiBIYW5kbGUgdXBzdHJlYW0gR0FQIGluIHB1c2gtbW9kZS90aW1lIHNlZ21lbnQKKwkgIFRoaXMgaXMgdG8gaGFuZGxlIGNhc2VzIHdoZXJlIHVwc3RyZWFtIGhhbmRsZXMgdGhlIGZyYWdtZW50ZWQgc3RyZWFtaW5nIGluIFRJTUUKKwkgIHNlZ21lbnRzIGFuZCBzZW5kcyB1cyBkYXRhIHdpdGggZ2FwcyB3aXRoaW4gZnJhZ21lbnRzLiBUaGlzIHdvdWxkIGhhcHBlbiB3aGVuIGRlYWxpbmcKKwkgIHdpdGggdHJpY2stbW9kZXMuCisJICBXaGVuIHVwc3RyZWFtIChwdXNoLWJhc2VkLCBUSU1FIFNFR01FTlQpIHdpc2hlcyB0byBzZW5kIGRpc2NvbnRpbnVvdXMgc2FtcGxlcywKKwkgIGl0IG11c3Qgb2JleSB0aGUgZm9sbG93aW5nIHJ1bGVzOgorCSAgKiBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFttb29mXSBtdXN0IGhhdmUgYSB2YWxpZCBHU1RfQlVGRkVSX09GRlNFVAorCSAgKiBUaGUgYnVmZmVycyBjb250YWluaW5nIHRoZSBmaXJzdCBzYW1wbGUgYWZ0ZXIgYSBnYXA6CisJICAqIE1VU1Qgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHNhbXBsZSwKKwkgICogTVVTVCBoYXZlIHRoZSBESVNDT05UIGZsYWcgc2V0LAorCSAgKiBNVVNUIGhhdmUgYSB2YWxpZCBHU1RfQlVGRkVSX09GRlNFVCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmcmFnbWVudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjczNTQKKworMjAxNi0wNy0wMSAxMTo1NDo1NyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL3Y0bDIvdjRsMi11dGlscy5jOgorCSAgdjRsMjogZml4IHBvdGVudGlhbCBkb3VibGUtZnJlZSBvZiBlcnJvciBkZWJ1ZyBzdHJpbmcKKwkgIGdzdF92NGwyX2NsZWFyX2Vycm9yKCkgZG9lc24ndCB3b3JrIGxpa2UgZ19jbGVhcl9lcnJvcigpLCBpdAorCSAgZG9lc24ndCBOVUxMaWZ5IHRoZSBwb2ludGVyLCBzbyBzZXQgZnJlZWQgZGVidWcgc3RyaW5nIHRvIE5VTEwKKwkgIHNvIGl0IGRvZXNuJ3QgZ2V0IGZyZWVkIGFnYWluIGlmIGdzdF92NGwyX2NsZWFyX2Vycm9yKCkgaXMKKwkgIGNhbGxlZCB0d2ljZSBvbiB0aGUgZXJyb3IuCisJICBDSUQgMTM2MjkwMQorCisyMDE2LTA3LTAxIDEwOjA1OjAwICswMDAwICBCcmFkIExhY2tleSA8YmxhY2tleUBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IERvbid0IGRpc2FibGUgVURQIHByb3RvY29scyBvbiByZWRpcmVjdGluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2ODIzMgorCisyMDE2LTA3LTAxIDE3OjI4OjE3ICswOTAwICBTZXVuZ2hhIFlhbmcgPHNoLnlhbmdAbGdlLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBQdXNoIGNhcHMgb25seSB3aGVuIGl0IHdhcyB1cGRhdGVkCisJICBDb21taXQgNzg3M2JlZGUzMTM0YjE1ZTUwNjZlOGQxNGU1NGQxZjUwNTRkMjA2MyBjYXVzZWQgbmV3IGNhcHMKKwkgIGV2ZW50IHBlciBtb29mIHdpdGhvdXQgY29uc2lkZXJhdGlvbiBvZiBkdXBsaWNhdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjgyNjgKKworMjAxNi0wNi0zMCAxNTowMTo0NiArMDIwMCAgSm9uYXMgSG9sbWJlcmcgPGpvbmFzaGdAYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJICBydHBoMjY1ZGVwYXk6IGZpeCBpbnZhbGlkIG1lbW9yeSBhY2Nlc3MKKwkgIDEwIGJ5dGVzIHdhcyBhbGxvY2F0ZWQgZm9yIHN0cmVhbV9mb3JtYXQgYnV0IHNpemUgb2YgImJ5dGUtc3RyZWFtIiBpcworCSAgbW9yZS4gVXNlIGdfc3RyZHVwKCkgaW5zdGVhZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM3NjAKKworMjAxNi0wNi0yOSAyMzozMToyMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkgIHNob3V0MjogVXNlIGEgbm9uLXRpbWVyIEdzdFBvbGwKKwkgIE90aGVyd2lzZSBzZXRfZmx1c2hpbmcoKSB3aWxsIGhhdmUgdW5kZWZpbmVkIHNlbWFudGljcyBhbmQgbm93YWRheXMgY2F1c2VzIGEKKwkgIGdfY3JpdGljYWwoKSB0byB3YXJuIGFib3V0IHRoYXQuCisKKzIwMTYtMDYtMTkgMDI6MDg6MjUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzYW50b3NAZ21haWwuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaDoKKwkgIHNvdXBodHRwc3JjOiBkeW5hbWljYWxseSBhZGp1c3QgYmxvY2tzaXplCisJICBVcGRhdGUgdGhlIGJsb2Nrc2l6ZSBkZXBlbmRpbmcgb24gaG93IG11Y2ggaXMgb2J0YWluZWQgZnJvbSBhIHJlYWQKKwkgIG9mIHRoZSBpbnB1dCBzdHJlYW0uIFRoaXMgYXZvaWRzIGRvaW5nIHRvbyBtYW55IHJlYWRzIGluIHNtYWxsIGNodW5rcworCSAgd2hlbiBsYXJnZXIgYW1vdW50cyBvZiBkYXRhIGFyZSBhdmFpbGFibGUgYW5kIGFsc28gcHJldmVudHMgdXNpbmcKKwkgIGEgdmVyeSBsYXJnZSBtZW1vcnkgYXJlYSB0byByZWFkIGEgc21hbGwgY2h1bmsgb2YgZGF0YS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njc4MzMKKworMjAxNi0wNi0yOCAxNjo0NDo1MCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogV2luZG93cyBoYXMgbm8gaXBpX3NwZWNfZHN0IGluIHN0cnVjdCBpbl9wa3RpbmZvCisKKzIwMTYtMDYtMjggMTU6MTU6MTQgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6ICNkZWZpbmUgX19BUFBMRV9VU0VfUkZDXzM1NDIgdG8gYmUgYWJsZSB0byB1c2UgSVBWNl9QS1RJTkZPIG9uIE9TWC9pT1MKKworMjAxNi0wNi0yOCAxNTowODowNCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogTW92ZSAjaW5jbHVkZXMgYXJvdW5kIHRvIGEpIHdvcmsgYXJvdW5kIGJyb2tlbiBnbGliYyBoZWFkZXIgYW5kIGIpIFdpbmRvd3MKKworMjAxNi0wNi0yOCAxNDoyNTowMyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogRml4IGNvbXBpbGF0aW9uIG9uIFdpbmRvd3MgYW5kICpCU0QvT1NYCisKKzIwMTYtMDYtMjMgMjA6MjE6NTkgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IEZpbHRlciBvdXQgbXVsdGljYXN0IHBhY2tldHMgdGhhdCBhcmUgbm90IGZvciBvdXIgbXVsdGljYXN0IGFkZHJlc3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njc5ODAKKworMjAxNi0wNi0yOCAxMDo1NzoyNyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogV2hlbiBzZWVraW5nLCBjb25zaWRlciB0aGUgY3VycmVudCBlbGVtZW50IHN0YXRlIG9yIHBlbmRpbmcgc3RhdGUgaW5zdGVhZCBvZiB0aGUgUlRTUCBzdGF0ZQorCSAgSWYgd2UgY29uc2lkZXIgdGhlIFJUU1Agc3RhdGUsIHdoYXQgY2FuIGhhcHBlbiBpcyB0aGF0IGl0IGlzIFBMQVlJTkcgYnV0IHRoZQorCSAgZWxlbWVudCBhbHJlYWR5IGFzeW5jaHJvbm91c2x5IHRyaWVkIHRvIFBBVVNFIGFuZCBpdCBqdXN0IGRpZCBub3QgaGFwcGVuIHlldC4KKwkgIFdlIHdvdWxkIHRoZW4gb3ZlcnJpZGUgdGhpcyBzZXR0aW5nIHRvIFBBVVNFRCAod2hpbGUgdGhlIGVsZW1lbnQgYWN0dWFsbHkgaXMKKwkgIGluIFBBVVNFRCkgYW5kIHNldCB0aGUgUlRTUCBzdGF0ZSB0byBQTEFZSU5HIGFnYWluLiBUaGlzIHdvdWxkIHRoZW4gY2F1c2UgdXMKKwkgIHRvIHByb2R1Y2UgcGFja2V0cyB3aGlsZSB0aGUgc2lua3MgYXJlIGFsbCBQQVVTRUQsIHBpbGluZyB1cCB0aG91c2FuZHMgb2YKKwkgIHBhY2tldHMgaW4gdGhlIHJ0cGppdHRlcmJ1ZmZlciBhbmQgb3RoZXIgZWxlbWVudHMgYW5kIGZpbmFsbHkgZmFpbGluZy4KKworMjAxNi0wNi0yNyAwOToyMDozNSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IEFkZCBjb21tZW50IGFib3V0IEgyNjMvTVBFRzRQMiBiZWluZyBub24tc3RhbmRhcmQgZm9yIEZMVgorCSAgVGhleSBhcmUgaG93ZXZlciBzdXBwb3J0ZWQgYnkgZmZtcGVnIGFuZCBhcHBhcmVudGx5IHVzZWQgb3V0IHRoZXJlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2ODAwNgorCisyMDE2LTA2LTI0IDE0OjQ4OjUzICswMzAwICBWaXZpYSBOaWtvbGFpZG91IDx2aXZpYUBhaGlydS5ldT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IEFkZCBzdXBwb3J0IGZvciBIMjYzIGFuZCBNUEVHNCBwYXJ0MgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2ODAwNgorCisyMDE2LTA2LTIxIDE3OjEwOjU2IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgIFVwZGF0ZSBwbHVnaW5zIGRvYworCSAgVGhpcyBpcyBwYXJ0bHkgYXV0b21hdGVkIHVzaW5nICJtYWtlIHVwZGF0ZSIgaW4gZG9jcy9wbHVnaW5zLCBidXQgYWxzbworCSAgcmVxdWlyZWQgbWFudWFsIG1lcmdlLiBBZGRpdGlvbmFsbHksIG1pc3NpbmcgcGx1Z2lucyBhbmQgZWxlbWVudHMgaGF2ZQorCSAgYmVlbiBhZGRlZC4KKworMjAxNi0wNi0yMSAxNzo1MTozOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc3BsaXRtdXguYzoKKwkgIHRlc3RzOiBzcGxpdG11eDogc2tpcCB0ZXN0cyBpZiB0aGVvcmEgb3Igb2dnIHBsdWdpbnMgYXJlIG5vdCBhdmFpbGFibGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njc4NjEKKworMjAxNi0wNi0yMSAxMTo0NjoxMyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gYWMyZjY0NyB0byBmMzYzYjMyCisKKzIwMTYtMDYtMjEgMDc6NDA6NDIgLTA0MDAgIEFhcm9uIEJveGVyIDxib3hlcmFiQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkgIGdzdHJ0cGoya3BheTogdXNlIHRpbGUgYml0IGFuZCB0aWxlIG51bWJlciB0byBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHRpbGVzIGluIHBhY2tldAorCSAgTm93IHdlIGRvbid0IGhhdmUgdG8gcmVseSBvbiBhIHNwZWNpYWwgdmFsdWUgZm9yIHRoZSB0aWxlIG51bWJlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njc4MTcKKworMjAxNi0wNi0yMSAwOTozNDo1NiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkgIHJ0cGoya3BheTogZml4IGNvbXBpbGVyIHdhcm5pbmcgb24gT1MvWAorCSAgZ3N0cnRwajJrcGF5LmM6MzY0OjIxOiBlcnJvcjogaW1wbGljaXQgdHJ1bmNhdGlvbiBmcm9tICdpbnQnIHRvIGJpdGZpZWxkIGNoYW5nZXMgdmFsdWUgZnJvbSAtMSB0byA2NTUzNQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzgxNworCisyMDE2LTA2LTIxIDA5OjM0OjM3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSAgZG9jczogdXBkYXRlCisKKzIwMTYtMDUtMTYgMTc6MzE6NTggKzAyMDAgIEd1aWxsYXVtZSBEZXNtb3R0ZXMgPGd1aWxsYXVtZS5kZXNtb3R0ZXNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jYXBzc2V0dGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pY3lkZW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvanBlZ2VuYy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc3JjLmM6CisJICBmaXggYnVmZmVyIGxlYWtzIGluIHRlc3RzCisJICBOZWVkIHRvIGNhbGwgZ3N0X2NoZWNrX2Ryb3BfYnVmZmVycygpIHRvIHJlbGVhc2UgdGhlIGJ1ZmZlcnMgZXhjaGFuZ2VkCisJICBkdXJpbmcgdGhlIHRlc3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY2NTYxCisKKzIwMTYtMDUtMTcgMTI6NTI6NDMgKzAzMDAgIEd1aWxsYXVtZSBEZXNtb3R0ZXMgPGd1aWxsYXVtZS5kZXNtb3R0ZXNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmM6CisJICBpbnRlcmxlYXZlOiBmaXggbWVzc2FnZSBsZWFrcyBpbiB0ZXN0CisJICBGbHVzaCB0aGUgYnVzIHdoZW4gY2xlYW5pbmcgdXAgc28gcGVuZGluZyBtZXNzYWdlcyBhcmUgZGVzdHJveWVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjU2MQorCisyMDE2LTA1LTE3IDEyOjU4OjA2ICswMzAwICBHdWlsbGF1bWUgRGVzbW90dGVzIDxndWlsbGF1bWUuZGVzbW90dGVzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogZml4IGV2ZW50IGxlYWtzIGluIHRlc3QKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjY1NjEKKworMjAxNi0wNS0xMyAxNToxMjoyMiArMDIwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOgorCSAgZGVpbnRlcmxlYXZlOiBmaXggbGVha3MKKwkgIC0gRmx1c2ggdGhlIGJ1cyBzbyBtZXNzYWdlcyBhcmVuJ3QgbGVha2VkCisJICAtIEZpeCBwYWQgbGVhaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjU2MQorCisyMDE2LTA2LTE3IDE1OjI5OjE2ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IERlcHJlY2F0ZWQgc3Byb3AtcGFyYW1ldGVyLXNldCBwcm9wZXJ0eQorCSAgVGhpcyBpcyBzdXBwb3NlZCB0byBiZSBlaXRoZXIgaW4gdGhlIGNvZGVjX2RhdGEgKGF2YyBzdHJlYW0gZm9ybWF0KSBvciBpbnNpZGUKKwkgIHRoZSBzdHJlYW0sIGFuZCB3ZSBleHRyYWN0IGl0IGZyb20gdGhlcmUuIEl0IHNob3VsZCBub3QgYmUgc2V0IGZyb20gYQorCSAgcHJvcGVydHkgYXMgaXQncyBzdHJlYW0gc3BlY2lmaWMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY3Nzg5CisKKzIwMTYtMDYtMTcgMTI6MTY6MzIgLTA3MDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdcOpIDxhbGVpeEBvYmxvbmcuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBtYWtlIGFsbCBzcnRwIGVuY29kZXIgcHJvcGVydGllcyBleHBsaWNpdAorCSAgVGhlIFNlc3Npb24gRGF0YSBQcm90b2NvbCBkb2Vzbid0IGFsbG93IHNwZWNpZnlpbmcgYSBjaXBoZXIgZm9yIHRoZQorCSAgU1JUQ1AsIHNvIGl0IHdpbGwgdXNlIHRoZSBTUlRQIG9uZS4gSW4gdGhlICJzcnRwZW5jIiBlbGVtZW50IHRoZSBjaXBoZXIKKwkgICJhZXMtMTI4LWljbSIgaXMgdGhlIGRlZmF1bHQgZm9yIFNSVFAgYW5kIFNSVENQLCBidXQgaWYgd2Ugd2FudCB0byBoYXZlCisJICBhbiBTUlRDUCB3aXRoIHRoZSAiYWVzLTI1Ni1pY20iIGNpcGhlciB0aGVuIHdlIGFsc28gbmVlZCB0byBzZXQgdGhlIFNSVFAKKwkgIGNpcGhlciB0byAiYWVzLTI1Ni1pY20iLCBvdGhlcndpc2UgImFlcy0xMjgtaWNtIiB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njc3OTkKKworMjAxNi0wNi0xNyAxOTo1OToxMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cC5jOgorCSAgc291cDogd29yayBhcm91bmQgZnJlcXVlbnQgZGVhZGxvY2tzIGluIEdMaWIgdHlwZSBpbml0aWFsaXNhdGlvbgorCSAgLi4gYnkgcmVnaXN0ZXJpbmcgdGhlIHR5cGVzIGZyb20gdGhlIHBsdWdpbiBpbml0IGZ1bmN0aW9uLiBUaGlzCisJICBzZWVtcyB0byBoZWxwLCBidXQgd2UnbGwgc2VlIGlmIGl0J3MgZW5vdWdoIChtaWdodCBuZWVkIHNpbWlsYXIKKwkgIHRoaW5ncyBlbHNld2hlcmUpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MzkxMQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NDg4NQorCisyMDE2LTA2LTE3IDE2OjA4OjA4ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogVGhlIHByb3JlcyB2YXJpYW50IGlzIHN0b3JlZCBpbiB0aGUgdmFyaWFudCBmaWVsZCwgbm90IGZvcm1hdAorCSAgQW5kIHRoZSBjYXBzIGluIHRoZSBzaW5rIHBhZCB0ZW1wbGF0ZSBhbHJlYWR5IHVzZWQgdmFyaWFudCAob25seSkuCisKKzIwMTYtMDYtMTcgMTM6MDA6NDggKzAyMDAgIEpvbmFzIEhvbG1iZXJnIDxqb25hc2hnQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5oOgorCSAgcnRwaDI2NXBheTogUmVtb3ZlIHNwcm9wLXBhcmFtZXRlci1zZXRzIHByb3BlcnR5CisJICBUaGVyZSBpcyBubyB2YWxpZCB1c2UgY2FzZSB3aGVuIHRoaXMgcHJvcGVydHkgaXMgbmVlZGVkIHNpbmNlIHRoZSB2YWx1ZXMKKwkgIG11c3QgYmUgaW4gZWl0aGVyIGNvZGVjX2RhdGEgb3IgYnVmZmVyIGRhdGEuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzNzYwCisKKzIwMTYtMDYtMTAgMTY6MTc6MjYgKzAyMDAgIEpvbmFzIEhvbG1iZXJnIDxqb25hc2hnQGF4aXMuY29tPgorCisJKiBkb2NzL3BsdWdpbnMvc2Nhbm9iai1idWlsZC5zdGFtcDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSAgcnRwaDI2NXBheTogUmVhZCBOQUxVIHR5cGUgdGhlIHNhbWUgd2F5IGV2ZXJ5d2hlcmUKKwkgIENvc21ldGljIGNoYW5nZSB0byByZWFkIE5BTFUgdHlwZSBpbiBnc3RfcnRwX2gyNjVfcGF5X2RlY29kZV9uYWwoKSB0aGUKKwkgIHNhbWUgd2F5IGFzIGluIG90aGVyIHBsYWNlcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM3NjAKKworMjAxNi0wNi0xNyAxMzo1ODozMyArMDIwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBydHBqaXR0ZXJidWZmZXI6IGZpeCBSVFBKaXR0ZXJCdWZmZXJNb2RlIGRvY3VtZW50YXRpb24KKwkgIERvY3VtZW50YXRpb24gbGFja3MgJ0AnIGJlZm9yZSBlYWNoIGVudW0gdmFsdWVzIGFuZCB0aGVyZSB3YXMgYW4gZXh0cmEKKwkgIGxpbmUgYWZ0ZXIgc3ltYm9sIHNlY3Rpb24gd2hpY2ggY29uZnVzZXMgR1RLLURvYyBwYXJzZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY3Nzg4CisKKzIwMTYtMDUtMjMgMTA6MTg6NDggKzAyMDAgIE1pZ3VlbCBQYXLDrXMgRMOtYXogPG1wYXJpc2RpYXpAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiB0YWtlIHRoZSBsb2NrIHdoZW4gY2hhbmdpbmcgc3RhdHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjYwMjUKKworMjAxNi0wNi0xNSAxMToxOTo0MyArMDIwMCAgSsO8cmdlbiBTbG93YWNrIDxqdXJnZW4uc2xvd2Fja0BiYXJjby5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSAgcnRwaDI2NTogZml4IE5BTCB1bml0IHR5cGUgcGFyc2luZyBhbmQgU1BTL1BQUy9WUFMgZGV0ZWN0aW9uCisJICBGaXhlcyBzcHMvcHBzL3ZwcyBpbnNlcnRpb24gdmlhIHRoZSBjb25maWctaW50ZXJ2YWwgcHJvcGVydHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy8vc2hvd19idWcuY2dpP2lkPTc2NzY4MAorCisyMDE2LTA2LTExIDEyOjE2OjAzICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvc2ltcGxlLWxhdW5jaC1saW5lcy5jOgorCSAgc2ltcGxlLWxhdW5jaC1saW5lczogVXNlIGNvcnJlY3QgSlBFRzIwMDAgY2FwcworCisyMDE2LTA2LTEwIDEzOjQzOjA5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogZml4IGluZGVudGF0aW9uCisKKzIwMTYtMDYtMTAgMTM6NDI6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBmaXggZGF0ZSBwYXJzaW5nIHdoZW4gdGhlcmUgYXJlIHRyYWlsaW5nIHNwYWNlcworCSAgRml4ZXMgcGFyc2luZyBvZiAiVGh1IE1heSAxMSAxNTo1Nzo0NiAyMDA2ICIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY3NDk2CisKKzIwMTYtMDUtMTMgMTU6MDg6MjQgLTA0MDAgIEFhcm9uIEJveGVyIDxib3hlcmFiQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtjb21tb24uaDoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJICBnc3RydHBqMms6IHNldCBzYW1wbGluZyBmaWVsZCByZXF1aXJlZCBieSBSRkMKKwkgIFRoaXMgZmllbGQgaXMgbm93IHJlcXVpcmVkIGluIHRoZSBzaW5rIGNhcHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY2MjM2CisKKzIwMTYtMDYtMDkgMDk6MzA6NDggKzA5MDAgIFNldW5naGEgWWFuZyA8c2gueWFuZ0BsZ2UuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogRml4IHVucmVmIGFzc2VydGlvbiBmYWlsdXJlCisJICBGaXggdW5yZWYgYXNzZXJ0aW9uIGZhaWx1cmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Njc0MjQKKworMjAxNi0wNS0xNCAxNDo0NjoxNyArMDIwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IFdvcmsgd2l0aCBub24tVElNRSBzZWdtZW50cworCSAgV2l0aCBub24tdGltZSBzZWdtZW50cywgaXQgbm93IGFzc3VtZXMgdGhhdCB0aGUgYXJyaXZhbCB0aW1lIG9mIHBhY2tldHMKKwkgIGlzIG5vdCByZWxldmFudCBhbmQgdGhhdCBvbmx5IHRoZSBSVFAgdGltZXN0YW1wIG1hdHRlciBhbmQgaXQgcHJvZHVjZXMKKwkgIGFuIG91dHB1dCBzZWdtZW50IHN0YXJ0IGF0IHJ1bm5pbmcgdGltZSAwLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjQzOAorCisyMDE2LTA2LTA3IDIwOjUzOjM0IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJICBwbmdkZWM6IFdhaXQgZm9yIHNlZ21lbnQgZXZlbnQgYmVmb3JlIGNoZWNraW5nIGl0CisJICBUaGUgaGV1cmlzdGljIHRvIGNob29zZSBiZXR3ZWVuIHBhY2tldGlzZSBvciBub3Qgd2FzIGNoYW5nZWQgdG8gdXNlIHRoZQorCSAgc2VnbWVudCBmb3JtYXQuIFRoZSBwcm9ibGVtIGlzIHRoYXQgdGhpcyBjaGFuZ2UgaXMgcmVhZGluZyB0aGUgc2VnbWVudAorCSAgZHVyaW5nIHRoZSBjYXBzIGV2ZW50IGhhbmRsaW5nLiBUaGUgc2VnbWVudCBldmVudCB3aWxsIG9ubHkgYmUgc2VudAorCSAgYWZ0ZXIuIFRoYXQgcHJldmVudGVkIHRoZSBkZWNvZGVyIHRvIGdvIGluIHBhY2tldGl6ZSBtb2RlLCBhbmQgYXZvaWQKKwkgIHVzZWxlc3MgcGFyc2luZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzYyNTIKKworMjAxNi0wNi0wNiAxNzowMDoyMiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBXYWl0IGZvciBzZWdtZW50IGV2ZW50IGJlZm9yZSBjaGVja2luZyBpdAorCSAgVGhlIGhldXJpc3RpYyB0byBjaG9vc2UgYmV0d2VlbiBwYWNrZXRpc2Ugb3Igbm90IHdhcyBjaGFuZ2UgdG8gdXNlIHRoZQorCSAgc2VnbWVudCBmb3JtYXQuIFRoZSBwcm9ibGVtIGlzIHRoYXQgdGhpcyBjaGFuZ2UgaXMgcmVhZGluZyB0aGUgc2VnbWVudAorCSAgZHVyaW5nIHRoZSBjYXBzIGV2ZW50IGhhbmRsaW5nLiBUaGUgc2VnbWVudCBldmVudCB3aWxsIG9ubHkgYmUgc2VudAorCSAgYWZ0ZXIuIFRoYXQgcHJldmVudGVkIHRoZSBkZWNvZGVyIHRvIGdvIGluIHBhY2tldGl6ZSBtb2RlLCBhbmQgYXZvaWQKKwkgIHVzZWxlc3MgcGFyc2luZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzYyNTIKKworMjAxNi0wNi0wNyAxNjo0MjowOSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogS2VlcCBwYXJ0IG9mIHRoZSBpbnB1dCBidWZmZXIKKwkgIEluc3RlYWQgb2YgY29tcGxldGVseSBnZXR0aW5nIHJpZCBvZiB0aGUgaW5wdXQgYnVmZmVyLCBjb3B5CisJICB0aGUgbWV0YWRhdGEsIHRoZSBmbGFncyBhbmQgdGhlIHRpbWVzdGFtcCBpbnRvIGFuIGVtcHR5IGJ1ZmZlci4KKwkgIFRoaXMgd2F5IHRoZSBkZWNvZGVyIGJhc2UgY2xhc3MgY2FuIGNvcHkgdGhhdCBpbmZvcm1hdGlvbiBhZ2FpbgorCSAgdG8gdGhlIG91dHB1dCBidWZmZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU4NDI0CisKKzIwMTYtMDYtMDcgMTY6NDE6NTggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmM6CisJICB2NGwydmlkZW9kZWM6IENvZGluZyBzdHlsZSBmaXhlcworCisyMDE2LTA2LTA3IDE2OjA5OjIzIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IENvZGluZyBzdHlsZSBmaXhlcworCisyMDE2LTA2LTA3IDE2OjA0OjUyIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDI6IEFkZCBhbiBlcnJvciByZXR1cm4gdG8gX3RyeS9fc2V0X2Zvcm1hdAorCSAgVGhpcyB3YXkgb25lIGNhbiBlYXNpbHkgaWdub3JlIGVycm9ycy4gUHJldmlvdXNseSwgZXJyb3Igd2VyZSBhbHdheXMKKwkgIHBvc3RlZCBvbnQgaGUgYnVzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjE3MgorCisyMDE2LTA2LTA3IDE2OjAxOjU1IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL3Y0bDItdXRpbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDItdXRpbHMuaDoKKwkgIHY0bDItdXRpbDogSW50cm9kdWNlIEdzdFY0bDJFcnJvcgorCSAgVGhpcyBpcyB0byBhbGxvdyByZXR1cm5pbmcgYW4gZXJyb3IgdGhhdCBjYW4gZWFzaWx5IGJlIHNlbnQgYXMKKwkgIG1lc3NhZ2UgdG8gdGhlIGFwcGxpY2F0aW9uIGlmIHRoZSBlbGVtZW50IG5lZWRzIGl0LiBVc2luZyB0aGlzCisJICBhbHNvIGFsbG93IGlnbm9yaW5nIGVycm9ycy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjYxNzIKKworMjAxNi0wNi0wNyAxMjo0MToxOSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBBdm9pZCBkZWNpZGUgYWxsb2NhdGlvbiBvbiBhY3RpdmUgcG9vbAorCSAgdjRsMnNyYyB3aWxsIHJlbmVnb3RpYXRlIG9ubHkgaWYgdGhlIGZvcm1hdCBoYXZlIGNoYW5nZWQuIEFzIG9mIG5vdywKKwkgIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgYWxsb2NhdGlvbncgd2l0aG91dCByZXNldHRpbmcgdGhlCisJICBjYW1lcmEuIFRvIGF2b2lkIHVud2FudGVkIHNpZGUgZWZmZWN0LCBzaW1wbHkga2VlcCB0aGUgb2xkIGFsbG9jYXRpb24KKwkgIGlmIG5vIHJlbmVnb3RpYXRpb24gaXMgdGFraW5nIHBsYWNlLiBUaGlzIGZpeGVzIGFzc2VydGlvbiBhbmQgcG9zc2libGUKKwkgIGZhaWx1cmVzIGluIFVTRVJQVFIgb3IgRE1BQlVGIGltcG9ydCBtb2RlICh3aGVuIHVzaW5nIGRvd25zdHJlYW0gcG9vbHMpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NDA0MgorCisyMDE2LTA0LTI4IDEzOjQ0OjQ5ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSAgcXRkZW11eDogU2hvdyBzdGF0ZSBuYW1lIGluIGRlYnVnZ2luZworCSAgTWFrZXMgaXQgZWFzaWVyIHRvIHRyYWNlIHdoYXQncyBnb2luZyBvbgorCisyMDE2LTA1LTEwIDE1OjQ1OjQyICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFJlbW92ZSB1c2VsZXNzIHZhcmlhYmxlCisJICBUaGF0IHZhcmlhYmxlIGlzIG9ubHkgbmVlZGVkIGZvciBhIGRlYnVnIHN0YXRlbWVudCwgbW92ZSBpdCB0aGVyZQorCisyMDE2LTA1LTEwIDE1OjEwOjM2ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSAgcXRkZW11eDogQWRkL0ZpeCBjb21tZW50cyBvbiB0aGUgdmFyaW91cyBzdHJ1Y3R1cmUgdmFyaWFibGVzCisJICBObyB2YXJpYWJsZXMgd2VyZSBhZGRlZC9yZW1vdmVkLiBUaGlzIHdhcyBqdXN0IGEgZ29vZCBleGN1c2UgdG86CisJICAqIENvbW1lbnQgd2hhdCBtb3N0IHZhcmlhYmxlcyBhcmUgdXNlZCBmb3IgKGFuZCB3aGVuKQorCSAgKiBPcmRlciB0aGVtIGluIHN1Y2ggYSB3YXkgYXMgdG8gc2hvdyBmaXJzdCB0aGUgY29tbW9uIHZhcmlhYmxlcyB1c2VkCisJICBpbiBhbGwgY2FzZXMsIGZvbGxvd2VkIGJ5IHRob3NlIG9ubHkgdXNlZCBpbiBwdXNoLW1vZGUKKworMjAxNi0wNS0xMCAxNTowNzo0MCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBSZW1vdmUgdW51c2VkIHN0cnVjdHVyZQorCSAgTGV0J3MganVzdCByZW1vdmUgaXQsIGJlZW4gY29tbWVudGVkIGZvciA3KyB5ZWFycyA6KQorCisyMDE1LTA5LTAyIDExOjQ4OjI5ICswMjAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogdXNlIGRlY29kZXIgc3RvcCBjb21tYW5kIGluc3RlYWQgb2YgcXVldWVpbmcgZW1wdHkgYnVmZmVycworCSAgT25seSBpZiB0aGUgZGVjb2RlciBzdG9wIGNvbW1hbmQgZmFpbHMsIGtlZXAgcXVldWVpbmcgZW1wdHkgYnVmZmVycyB0bworCSAgc2lnbmFsIGVuZCBvZiBzdHJlYW0gYXMgYmVmb3JlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMzg2NAorCisyMDE0LTEyLTEyIDE0OjMxOjM2ICswMTAwICBQZXRlciBTZWlkZXJlciA8cHMucmVwb3J0QGdteC5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBhZGQgZ3N0X3Y0bDJfZGVjb2Rlcl9jbWQgaGVscGVyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMzODY0CisKKzIwMTYtMDYtMDEgMjA6Mjg6MzkgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRm9yd2FyZCBzZWdtZW50cyBkaXJlY3RseSBpZiB3ZSBhcmUgb3BlcmF0aW5nIGluIFBVU0ggbW9kZSBvbiBmcmFnbWVudGVkIHN0cmVhbXMKKwkgIFdlIHNob3VsZG4ndCBnbyB0aHJvdWdoIHNlZ21lbnQgYWN0aXZhdGlvbiBhcyB3ZSB3aWxsIG9ubHkgaGF2ZSBhIGxpbWl0ZWQKKwkgIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSB3aG9sZSBzdHJlYW0gdGltZWxpbmUgbG9va3MgbGlrZSBmcm9tIHRoZSBtb29mLiBXZQorCSAgb25seSBrbm93IGFib3V0IHRoZSBjdXJyZW50IGZyYWdtZW50LCB3aGlsZSB1cHN0cmVhbSBrbm93cyBhYm91dCB0aGUgd2hvbGUKKwkgIHN0cmVhbS4KKwkgIFRoaXMgZml4ZXMgc2Vla2luZyBpbiBEQVNIIHN0cmVhbXMsIGJvdGggZm9yIHNlZWtzIGFmdGVyIHRoZSBjdXJyZW50IG1vb2YgYW5kCisJICBmb3Igc2Vla3MgaW50byB0aGUgY3VycmVudCBtb29mLiBUaGUgZm9ybWVyIHdvdWxkIGZhaWwgYmVjYXVzZSB0aGUgbW9vZiBlbmRzCisJICBhbmQgd2UgY2FuJ3QgYWN0aXZhdGUgYW55IHNlZ21lbnQsIHRoZSBsYXR0ZXIgd291bGQgY2F1c2UgYSBzZWdtZW50IHRoYXQgc3RvcHMKKwkgIGF0IHRoZSBtb29mIGVuZCwgYW5kIG5vIGZ1cnRoZXIgZnJhZ21lbnRzIHdvdWxkIGJlIHBsYXllZCBiZWNhdXNlIHdlIGVuZCB1cAorCSAgYmVpbmcgRU9TLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzA3MQorCisyMDE2LTA2LTA2IDE3OjU0OjEwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IFVzZSBsb29zZXIgY2FwcyBmb3IgdXBzdHJlYW0KKwkgIFdoZW4gd2UgZml4YXRlIGZvciB1cHN0cmVhbSwgdHJ5IHRvIG5vdCBpbnRyb2R1Y2UgbmV3IGZpZWxkcyB3aGVuIG5vdAorCSAgbmVlZGVkLiBUaGlzIHdhcyBpbXBvcnRlZCBmcm9tIHZpZGVvY29udmVydCBlbGVtZW50LgorCisyMDE1LTAxLTI4IDEyOjA3OjU4ICswMTAwICBFbnJpY28gSm9ybnMgPGVqb0BwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5jOgorCSAgZ3N0djRsMnRyYW5zZm9ybTogZm9ybWF0IGZpeGF0aW9uIGZvciBwcmVmZXJyaW5nIHBhc3N0aHJvdWdoCisJICAqIElmIG91dGdvaW5nIGZvcm1hdCBpcyB1bmZpeGF0ZWQsIHRyeSB0byBzZXQgaXQgdG8gaW5wdXQgZm9ybWF0LgorCSAgKiBDYWxsIGdzdF9jYXBzX2ZpeGF0ZSAoKSBhdCBlbmQgb2YgZml4YXRpb24gcm91dGluZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjcxOQorCisyMDE2LTA1LTIwIDEyOjQ5OjUzICswMjAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJICB2NGwydHJhbnNmb3JtOiBhbGxvdyB0byBjaGFuZ2UgcGl4ZWwgYXNwZWN0IHJhdGlvCisJICBTY2FsZXJzIG1heSBjaGFuZ2Ugd2lkdGggYW5kIGhlaWdodCBpbmRlcGVuZGVudGx5LAorCSAgYWxsb3cgdG8gY2hhbmdlIHBpeGVsIGFzcGVjdCByYXRpby4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjY3MTIKKworMjAxNi0wNS0yMCAxMjozMjoyNSArMDIwMCAgUGhpbGlwcCBaYWJlbCA8cC56YWJlbEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5jOgorCSAgdjRsMnRyYW5zZm9ybTogZml4IHNjYWxpbmcgaW4gY2FzZSBvZiBmaXhlZCBwaXhlbCBhc3BlY3QgcmF0aW8KKwkgIFRvIGNoYW5nZSBwaXhlbCBhc3BlY3QgcmF0aW8gZnJvbSBEQVIgdG8gUEFSLCB0aGUgbmVjZXNzYXJ5IHNjYWxpbmcgZmFjdG9yCisJICBpcyBEQVIvUEFSLCBub3QgREFSKlBBUi4KKwkgIEZvciBnb29kIG1lYXN1cmUsIGFkZCBkZWJ1ZyBvdXRwdXQgc2ltaWxhciB0byB0aGUgZml4ZWQtd2lkdGggYW5kCisJICBmaXhlZC1oZWlnaHQgY2FzZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY2NzExCisKKzIwMTYtMDUtMTMgMTY6Mzk6MjUgKzAyMDAgIFBoaWxpcHAgWmFiZWwgPHAuemFiZWxAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IGZpbGwgY29sb3JpbWV0cnkgaW4gZ3N0X3Y0bDJfb2JqZWN0X2FjcXVpcmVfZm9ybWF0CisJICBJbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGhlIGRlZmF1bHQgY29sb3JpbWV0cnkgY2hvc2VuIGJ5CisJICBnc3RfdmlkZW9faW5mb19zZXRfZm9ybWF0KCksIHNldCBpbmZvLmNvbG9yaW1ldHJ5IGZyb20gdGhlCisJICB2YWx1ZXMgcmV0dXJuZWQgYnkgR19GTVQuIFRoaXMgYWxsb3dzIGRlY29kZXJzIHRvIHByb3BhZ2F0ZQorCSAgdGhlaXIgaW5wdXQgY29sb3JpbWV0cnkgZG93bnN0cmVhbS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjYzODMKKworMjAxNi0wNS0xOCAxMDoxNzoxMiArMDIwMCAgUGhpbGlwcCBaYWJlbCA8cC56YWJlbEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogcmVmYWN0b3IgZ3N0X3Y0bDJfb2JqZWN0X2dldF9jb2xvcnNwYWNlIHRvIHRha2UgYSB2NGwyX2Zvcm1hdCBwYXJhbWV0ZXIKKwkgIE1vdmUgdGhlIGV4dHJhY3Rpb24gb2YgY29sb3JpbWV0cnkgcGFyYW1ldGVycyBmcm9tIHN0cnVjdCB2NGwyX2Zvcm1hdCBhbmQgdGhlCisJICBzZXR0aW5nIG9mIHRoZSBpZGVudGl0eSBtYXRyaXggZm9yIFJHQiBmb3JtYXRzIGludG8gdGhlIGZ1bmN0aW9uIHRvIGF2b2lkIGNvZGUKKwkgIGR1cGxpY2F0aW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjM4MworCisyMDE2LTA1LTEzIDE0OjU4OjQxICswMjAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogdXNlIHZpc2libGUgc2l6ZSwgbm90IGNvZGVkIHNpemUsIGZvciBkb3duc3RyZWFtIG5lZ290aWF0aW9uIGZpbHRlcgorCSAgZ3N0X3Y0bDJfcHJvYmVfY2FwcygpIHJldHVybnMgdGhlIGNvZGVkIHNpemUsIG5vdCB0aGUgdmlzaWJsZSBzaXplLiBTdWJ0cmFjdAorCSAgdGhlIGtub3duIHBhZGRpbmcgZnJvbSBwcm9iZWQgY2FwcyB3aXRoIHRoZSBjb2RlZCBzaXplIGJlZm9yZSB1c2luZyB0aGVtIGFzCisJICBmaWx0ZXIgZm9yIGNhcHMgbmVnb3RpYXRpb24gd2l0aCBkb3duc3RyZWFtIGVsZW1lbnRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjM4MgorCisyMDE2LTA1LTEzIDE0OjQ1OjAyICswMjAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiB1c2UgR19TRUxFQ1RJT04gaW5zdGVhZCBvZiBHX0NST1AgaW4gZ3N0X3Y0bDJfb2JqZWN0X2FjcXVpcmVfZm9ybWF0CisJICBUaGUgZ3N0X3Y0bDJfb2JqZWN0X2FjcXVpcmVfZm9ybWF0KCkgZnVuY3Rpb24gaXMgdXNlZCBieSB2NGwydmlkZW9kZWMgdG8gb2J0YWluCisJICB0aGUgY3VycmVudGx5IHNldCBjYXB0dXJlIGZvcm1hdC4gU2luY2UgR19GTVQgcmV0dXJucyB0aGUgY29kZWQgc2l6ZSwgdGhlCisJICB2aXNpYmxlIHNpemUgbmVlZHMgdG8gYmUgb2J0YWluZWQgZnJvbSB0aGUgY29tcG9zZSByZWN0YW5nbGUgaW4gb3JkZXIgdG8KKwkgIG5lZ290aWF0ZSBpdCB3aXRoIGRvd25zdHJlYW0gZWxlbWVudHMuIFRoZSBHX0NST1AgY2FsbCBoYXNuJ3Qgd29ya2VkIG9uIG1lbTJtZW0KKwkgIGNhcHR1cmUgcXVldWVzIGZvciBhIGxvbmcgdGltZS4gSW5zdGVhZCB1c2UgdGhlIEdfU0VMRUNUSU9OIGNhbGwgdG8gb2J0YWluIHRoZQorCSAgY29tcG9zZSByZWN0YW5nbGUgYW5kIG9ubHkgZmFsbCBiYWNrIHRvIEdfQ1JPUCBmb3IgYW5jaWVudCBrZXJuZWxzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjM4MQorCisyMDE2LTAxLTI3IDA5OjU3OjM4ICswMTAwICBBbmRyZWFzIE5hdW1hbm4gPGFuYXVtYW5uQHVsdHJhdHJvbmlrLmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMnNpbms6IFVzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9PVkVSTEFZIGlmIGRyaXZlciBhZHZlcnRpc2VzIGl0LgorCSAgT24gbW9kZXJuIGtlcm5lbHMsIHRoZSBHL1NfRk1UIGlvY3RscyB3aWxsIGFsd2F5cyBmYWlsIHVzaW5nCisJICBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVkgd2l0aCBWRkxfRElSX1RYIChlLmcuIHJlYWwgb3ZlcmxheSBvdXQgZHJpdmVycykKKwkgIHNpbmNlIHRoaXMgaXMgbm90IHRoZSBpbnRlbnRlZCB1c2UgKHJhdGhlciByeCwgYWNjb3JkaW5nIHRvIHY0bDIgQVBJIGRvYykuCisJICBQcm9iYWJseSB0aGlzIGlzIHdoeSB0aGUgVmlkZW8gT3V0cHV0IE92ZXJsYXkgaW50ZXJmYWNlIHdhcyBjcmVhdGVkLCBzbyBpZgorCSAgdGhlIGRyaXZlciBhZHZlcnRpc2VzIGl0IHdlIG1pZ2h0IGFzIHdlbGwgdXNlLgorCSAgRm9yIG9sZCBrZXJuZWxzIChwcmUgMjAxMikgdGhlIG9sZCB3YXkgbWlnaHQgc3RpbGwgd29yayBzbyBrZWVwaW5nIHRoaXMgZm9yCisJICBjb21wYXRpYmlsaXR5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MTE2NQorCisyMDE2LTA2LTA2IDE4OjUyOjAxICswMTAwICBLaWVyYW4gQmluZ2hhbSA8a2llcmFuQGJpbmdoYW0ueHl6PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBVc2Ugbm9uLWRlcHJlY2F0ZWQgVjRMMiB0eXBlIGZvciBSR0IxNQorCSAgU3VwcG9ydCBmb3IgdGhlIHVwZGF0ZWQgVjRMMl9QSVhfRk1UX1hSR0I1NTUgd2FzIGFkZGVkIGluIGNvbW1pdAorCSAgMjUzOGZlZTJmZDhmZGI3NGIwNWYwYTUxMTI4MWJjNDcwN2U3Y2M0NCBob3dldmVyLCB3aGVuIHNldHRpbmcgdGhlIGZvcm1hdAorCSAgZm9yIHVzZSBpbiB2NGwyIGlvY3RscywgdGhlIG9sZCBkZXByZWNhdGVkIGZvcm1hdCBpcyBzdGlsbCB1c2VkLiBDb252ZXJ0CisJICB0aGlzIHRvIHRoZSBuZXcgYWNjZXB0ZWQgZm9ybWF0IHR5cGUsIGFzIHRoZSBwcmVmZXJyZWQgZm9ybWF0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzMwMAorCisyMDE2LTA1LTA0IDE0OjUwOjMyICswMjAwICBNaWNoYWVsIE9sYnJpY2ggPG0ub2xicmljaEBwZW5ndXRyb25peC5kZT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBwcmVzZXJ2ZSBzZWVrIGZsYWdzCisJICBXaXRob3V0IHRoaXMgc29tZSBmbGFncyBnZXQgbG9zdCBpbiBzdHJlYW1pbmcgbW9kZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjcxOTQKKworMjAxNi0wNi0wNiAxMDo0Nzo1MiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvTWFrZWZpbGUuYW06CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgUmV2ZXJ0ICJXSVAgcmV2ZXJ0IHNvdXAiCisJICBUaGlzIHJldmVydHMgY29tbWl0IGZkYWMzYTdhMjMxZjM4NDg2NjU2MzZjZjgxMjJmOTYxMDNiNDZlM2IuCisJICBXYXMgbm90IHN1cHBvc2VkIHRvIGJlIHB1c2hlZCBidXQgYSBsb2NhbCB3b3JrYXJvdW5kIGZvcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MzkxMSNjMTMKKworMjAxNi0wNi0wMyAxMzowOTozNSArMDIwMCAgTWlndWVsIFBhcsOtcyBEw61heiA8bXBhcmlzZGlhekBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlOiBjb21wbGV0ZSB3YXJuIGxvZyB3aXRoIFNTUkMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjcxOTUKKworMjAxNi0wNS0zMSAxNToyOToxMyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvTWFrZWZpbGUuYW06CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgV0lQIHJldmVydCBzb3VwCisKKzIwMTYtMDYtMDMgMTM6MTg6MzEgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICBkdmRlbXV4OiBVbnJlZiBzZWVrIGV2ZW50IGluIGFueSBjYXNlCisJICBJdCB3b3VsZCBiZSBsZWFrZWQgaWYgbm8gc2VlayBoYW5kbGVyIHdhcyBjdXJyZW50bHkgc2V0LgorCisyMDE2LTA2LTAzIDEwOjQ5OjE3ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguaDoKKwkgIGR2ZGVtdXg6IFByb3Blcmx5IHNldCBldmVudC9tZXNzYWdlIHNlcXVlbmNlIG51bWJlcnMgYmFzZWQgb24gdGhlIHByZXZpb3VzIHNlZWsKKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY1OTM1CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY3MTU3CisKKzIwMTYtMDYtMDMgMTA6MzY6MzIgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJKiBleHQvZHYvZ3N0ZHZkZW11eC5oOgorCSAgZHZkZW11eDogUmVtZW1iZXIgaWYgdXBzdHJlYW0gaGFkIGEgdGltZSBzZWdtZW50IGFuZCBpZiBub3QgcHJvcGVybHkgY3JlYXRlIHRpbWUgc2VnbWVudHMKKwkgIFByZXZpb3VzbHkgdGhlIHNlZ21lbnQudGltZSB3YXMgd3JvbmcsIGFuZCB0aGUgcG9zaXRpb24gd2FzIG5vdCB1cGRhdGVkCisJICBjb3JyZWN0bHksIHJlc3VsdGluZyBpbiBzZWVrcyBpbiBQVVNIIG1vZGUgd2l0aCB1cHN0cmVhbSBwcm92aWRpbmcgYSBCWVRFUworCSAgc2VnbWVudCB0byBub3Qgd29yayBhdCBhbGwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY3MTU3CisKKzIwMTYtMDYtMDMgMDk6NTQ6NTMgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICBkdmRlbXV4OiBJbXBsZW1lbnQgU0VFS0lORyBxdWVyeSBzbyB3ZSBjYW4gYWN0dWFsbHkgc2VlayBpZiB1cHN0cmVhbSBjYW4ndCBzZWVrIGluIFRJTUUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjcxNTcKKworMjAxNi0wNi0wMiAxNDoxOToxNSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkgIGR2ZGVtdXg6IFJlY2FsY3VsYXRlIHRoZSBmcmFtZSBvZmZzZXRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBCWVRFIHNlZ21lbnQgYW5kIHdoZW5ldmVyIHVwc3RyZWFtIGdpdmVzIHVzIGEgdGltZXN0YW1wCisJICBUaGlzIGZpeGVzIHNlZWtpbmcgaW4gRFYgc3RyZWFtcyB3aGVyZSB1cHN0cmVhbSBvcGVyYXRlcyBpbiBQVVNIIG1vZGUgd2l0aCBhCisJICBUSU1FIHNlZ21lbnQgKGUuZy4gYXZpZGVtdXgpLiBXaXRob3V0IHRoaXMsIHdlIHdvdWxkIGdlbmVyYXRlIHdyb25nIGR1cmF0aW9ucworCSAgYW5kIHRpbWVzdGFtcHMgYWZ0ZXIgYSBzZWVrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzE1NworCisyMDE2LTA2LTAyIDEzOjUzOjQ0ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguaDoKKwkgIGR2ZGVtdXg6IFBhc3MtdGhyb3VnaCBidWZmZXIgRElTQ09OVCBmbGFncworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzE1NworCisyMDE2LTA2LTAyIDE2OjE2OjQ1IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOWRlcGF5LmM6CisJICBydHB2cDlkZXBheTogRG9uJ3QgYXNzZXJ0IG9uIGZsZXhpYmxlIG1vZGUgcGFja2V0cworCSAgSW5zdGVhZCBqdXN0IHBvc3QgYSB3YXJuaW5nIG9uIHRoZSBidXMgZm9yIG5vdy4KKworMjAxNi0wNi0wMiAxNTowMzoxNyArMDIwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jOgorCSAgdGVzdHM6IHJ0cGJpbjogZml4IGNhcHMgbGVhaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzE1NgorCisyMDE2LTA2LTAyIDE1OjAwOjAxICswMjAwICBHdWlsbGF1bWUgRGVzbW90dGVzIDxndWlsbGF1bWUuZGVzbW90dGVzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYW1ycGFyc2UuYzoKKwkgIHRlc3RzOiBhbXJwYXJzZTogY2xlYW4gdXAgdGVzdAorCSAgLSB1c2UgR1NUX0NIRUNLX01BSU4oKSB0byByZWR1Y2UgYm9pbGVycGxhdGUKKwkgIC0gdW5yZWYgdGhlIGlucHV0IGNhcHMgdXNpbmcgYSB0ZWFyZG93biBmdW5jdGlvbiB0byBwcmV2ZW50IGxlYWtzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY3MTU2CisKKzIwMTYtMDUtMjAgMTU6MjI6MzUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJICBkZWludGVybGFjZTogRW5zdXJlIERJU0NPTlQgZmxhZyBpcyBwcm9wZXJseSBwcm9wYWdhdGVkCisJICBUaGUgb3V0cHV0IG9mIGRlaW50ZXJsYWNlIGF0IHN0YXJ0dXAsIG9yIHdoZW4gcmVjZWl2aW5nIGEgbmV3IERJU0NPTlQKKwkgIGJ1ZmZlciwgc2hvdWxkIGhhdmUgdGhlIERJU0NPTlQgZmxhZyBzZXQgb24gdGhlIGZpcnN0IGJ1ZmZlci4KKworMjAxNi0wNS0zMSAyMTozNDowNCArMDIwMCAgSm9zZXAgVG9ycmEgPGFkbjc3MEBnbWFpbC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyc3JjOiBjaGVjayBmb3IgdmFsaWQgc2l6ZSBvbiByYXcgdmlkZW8gYnVmZmVycworCSAgRGlzY2FyZCBidWZmZXJzIHRoYXQgZG9lc24ndCBjb250YWluIGVub3VnaCBkYXRhIHdoZW4gZGVhbGluZworCSAgd2l0aCByYXcgdmlkZW8gaW5wdXRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzA4NgorCisyMDE2LTA1LTMxIDE3OjEwOjM2ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFVzZSB0aGUgZGVtdXhlciBzZWdtZW50IGluc3RlYWQgb2YgYSBuZXcgb25lIGZvciBNU1Mgc3RyZWFtcworCSAgVXBzdHJlYW0gbWlnaHQgaGF2ZSB0b2xkIHVzIHNvbWV0aGluZyBhYm91dCB0aGUgdG8gYmUgZXhwZWN0ZWQgc2VnbWVudCwgc28KKwkgIGxldCdzIHVzZSB0aGF0IGluZm9ybWF0aW9uIGluc3RlYWQgb2YgY29taW5nIHVwIHdpdGggYSBbMCwtMV0gc2VnbWVudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjcwNzEKKworMjAxNi0wNS0zMSAxNzowNDozMiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBPbmx5IGFjdGl2YXRlIHNlZ21lbnRzIGFuZCBzZW5kIFNFR01FTlQgZXZlbnRzIGlmIHdlIGhhdmUgc3RyZWFtcworCSAgQnV0IGluIHRoYXQgY2FzZSBhbHNvIHJlbW92ZSB0aGUgcGVuZGluZyBuZXdzZWdtZW50IGV2ZW50LCBvdGhlcndpc2Ugd2Ugd291bGQKKwkgIGxhdGVyIHNlbmQgYSBwb3NzaWJseSBvdXRkYXRlZCBldmVudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjcwNzEKKworMjAxNi0wNS0zMSAxNjo1Mzo1MCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBJbiBQVUxMIG1vZGUsIG5vdGhpbmcgaXMgZXZlciBnb2luZyB0byBzZW5kIHVzIGEgU0VHTUVOVCBldmVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NzA3MQorCisyMDE2LTA1LTMxIDE2OjM4OjM0ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERvbid0IG92ZXJyaWRlIFRJTUUgc2VnbWVudHMgZnJvbSB1cHN0cmVhbSB0aGF0IHdlIGp1c3Qgc2F3CisJICBUaGUgcG9pbnQgb2YgZDhmYjdhOWM5NmIxMDg4MTRiZWVhYTBlNjNmODE4ZDQ2NDhjN2ZlOSB3YXMgdG8gbm90IGhhdmUgYW55CisJICBzcHVyaW91cyBzZWdtZW50cyBzdG9yZWQgZm9yIGxhdGVyIGlmIHdlIGRvIEJZVEVTLT5USU1FIGNvbnZlcnNpb24sIGJ1dAorCSAgb3ZlcnJpZGluZyBhbnkgVElNRSBzZWdtZW50cyBmcm9tIHVwc3RyZWFtIGRvZXMgbm90IG1ha2UgYW55IHNlbnNlLgorCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjMxNjUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjcwNzEKKworMjAxNS0wNy0xNiAwOTo0ODo0NiArMDUzMCAgUHJhc2hhbnQgR290YXJuZSA8cHMuZ290YXJuZUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkgIG11bHRpZmlsZXNyYzogc2V0IHBvc2l0aW9uIGFzIG9mZnNldCBmcm9tIHN0YXJ0LWluZGV4CisJICBxdWVyeSBwb3NpdGlvbiBpbiBHU1RfRk9STUFUX0JVRkZFUiByZXR1cm5zCisJICBvZmZzZXQgZnJvbSBzdGFydC1pbmRleCByYXRoZXIgdGhhbiBpbmRleC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTI0NjIKKworMjAxNi0wNS0yNyAxMjo0OTozMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMuYzoKKwkqIHRlc3RzL2ZpbGVzL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZmlsZXMvZ3JhZGllbnQuajJrOgorCSAgdGVzdHM6IGFkZCB1bml0IHRlc3QgZm9yIEpQRUctMjAwMCBydHAgcGF5bG9hZGVyIGxlYWsKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjY4NzAKKworMjAxNi0wNS0yNSAxNzoxMToxMyArMDIwMCAgUGllcnJlIExhbW90IDxwaWVycmUubGFtb3RAb3BlbndpZGUuZnI+CisKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJICBydHBqMmtwYXk6IEZpeCBidWZmZXIgbWVtb3J5IGxlYWsKKwkgIElucHV0IGJ1ZmZlciBtZW1vcnkgd2FzIG5vdCB1bm1hcHBlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2Njg3MAorCisyMDE2LTA1LTE4IDEyOjEyOjE1ICswMzAwICBHdWlsbGF1bWUgRGVzbW90dGVzIDxndWlsbGF1bWUuZGVzbW90dGVzQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogZml4IGNhcHMgbGVhaworCSAgZ3N0X3Y0bDJfb2JqZWN0X3Byb2JlX2NhcHMoKSB3YXMgdGFraW5nIGFuIGV4dHJhIHJlZiBvbiB0aGUgcmV0dXJuZWQKKwkgIGNhcHMgZm9yIG5vIHJlYXNvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjY2MTAKKworMjAxNi0wNS0yMiAyMDoxNDoxOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkgIHZpZGVvY3JvcCBtYXJrIGNyb3AgcHJvcGVydGllcyBhcyBtdXRhYmxlIGluIHBsYXlpbmcgc3RhdGUKKworMjAxNi0wNS0yMCAxNjo0NzozNSArMDMwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogZml4IGJ1ZmZlciBsZWFrIHdoZW4gZmx1c2hpbmcKKwkgIFdoZW4gZWFybHkgcmV0dXJuaW5nIGluIGdzdF9zb3VwX2h0dHBfc3JjX3JlYWRfYnVmZmVyKCkgYmVjYXVzZSB0aGUKKwkgIGVsZW1lbnQgaXMgRkxVU0hJTkcsIHdlIG5lZWQgdG8gdW5tYXAgYW5kIHVucmVmIHRoZSBidWZmZXIgd2hpY2ggd2FzIGp1c3QgY3JlYXRlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjY3MTgKKworMjAxNi0wNS0yMCAxMToxNTo0NCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBTZXQgc2VlayBldmVudCBzZXFudW0gb24gYWxsIFNFR01FTlQgZXZlbnRzCisJICBTb21lIHdlcmUgZm9yZ290dGVuLgorCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjU5MzUKKworMjAxNi0wNS0yMCAxMToxMjo0NCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgYXZpZGVtdXg6IFBhc3MgdGhyb3VnaCBzZWVrIGV2ZW50IHNlcW51bXMgaW4gYWxsIFNFR01FTlQvRU9TIGV2ZW50cyBhbmQgU0VHTUVOVF9ET05FIG1lc3NhZ2VzL2V2ZW50cworCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjU5MzUKKworMjAxNi0wNS0yMCAxMDo1Njo1MiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBTZXQgc2VlayBldmVudCBzZXFudW0gaW4gRU9TIGFuZCBTRUdNRU5UX0RPTkUgbWVzc2FnZXMvZXZlbnRzCisJICBBbHNvIGFjdHVhbGx5IHN0b3JlIHRoZSBzZXFudW0gaW4gcHVsbCBtb2RlIHNlZWtzLgorCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjU5MzUKKworMjAxNi0wNS0xNyAxMzo0MDozOCArMDMwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGZpeCBjYXBzIGxlYWsKKwkgIFRoZSBjYXBzIHJldHVybmVkIGJ5IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcygpIHdhcyBuZXZlciB1bnJlZmZlZCB3aGVuCisJICBub3QgZWFybHkgcmV0dXJuaW5nLgorCSAgRml4IGEgbGVhayB3aXRoIHRoZSBlbGVtZW50cy9kZWludGVybGFjZSB0ZXN0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjU1OAorCisyMDE2LTAxLTI1IDE2OjI1OjUxICswMTAwICBNaWtoYWlsIEZsdWRrb3YgPG1pc2hhQHBleGlwLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBkb24ndCBhY3Qgb24gc3VzcGljaW91cyBCWUUgUlRDUAorCSAgU29tZSBlbmRwb2ludHMgKGxpa2UgVGFuZGJlcmcgRTIwKSBjYW4gc2VuZCBCWUUgcGFja2V0IGNvbnRhaW5pbmcgb3VyCisJICBpbnRlcm5hbCBTU1JDLiBJIHRoaXMgY2FzZSB3ZSB3b3VsZCBkZXRlY3QgU1NSQyBjb2xsaXNpb24gYW5kIGdldCByaWQKKwkgIG9mIHRoZSBzb3VyY2UgYXQgc29tZSBwb2ludC4gQnV0IGJlY2F1c2Ugd2UgYXJlIHN0aWxsIHNlbmRpbmcgcGFja2V0cworCSAgd2l0aCB0aGF0IFNTUkMgdGhlIHNvdXJjZSB3aWxsIGJlIHJlY3JlYXRlZCBpbW1lZGlhdGVseS4KKwkgIFRoaXMgYnJhbmQgbmV3IGludGVybmFsIHNvdXJjZSB3aWxsIG5vdCBoYXZlIHNvbWUgdmFyaWFibGVzIGluY29ycmVjdGx5CisJICBzZXQgaW4gaXRzIHN0YXRlLiBGb3IgZXhhbXBsZSAnc2VxbnVtLWJhc2VgIGFuZCBgY2xvY2stcmF0ZWAgdmFsdWVzIHdpbGwgYmUKKwkgIC0xLgorCSAgVGhlIGZpeCBpcyBub3QgdG8gYWN0IG9uIEJZRSBSVENQIGlmIGl0IGNvbnRhaW5zIGludGVybmFsIG9yIHVua25vd24KKwkgIFNTUkMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMjE5CisKKzIwMTUtMTEtMTUgMTQ6NTQ6MjggKzAxMDAgIE1pa2hhaWwgRmx1ZGtvdiA8bWlzaGFAcGV4aXAuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBBZGQgdGVzdCBmb3IgbG9ja2luZyBvZiB0aGUgc3RhdHMgc2lnbmFsCisJICBLZWVwaW5nIHRoZSBsb2NrIHdoaWxlIGVtaXR0aW5nIHRoZSBzdGF0cyBzaWduYWwgaW50cm9kdWNlcyBwb3RlbnRpYWwKKwkgIGRlYWRsb2NrIGluIHRob3NlIHNpdHVhdGlvbnMgd2hlbiB0aGUgc2lnbmFsIGNhbGxiYWNrIHdhbnRzIHRoZSBhY2Nlc3MKKwkgIHRvIHJ0cHNlc3Npb24ncyBwcm9wZXJ0aWVzIHdoaWNoIGFsc28gcmVxdXJlIHRoZSBsb2NrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjIxNgorCisyMDE2LTA1LTE5IDE1OjM2OjU3ICswOTAwICBTZXVuZ2hhIFlhbmcgPHNoLnlhbmdAbGdlLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBkb24ndCBob2xkIG9iamVjdCBsb2NrIHdoaWxzdCBwdXNoaW5nIG91dCBoZWFkZXJzCisJICBtYXRyb3NrYWRlbXV4IHdvdWxkIHRha2UgdGhlIEdTVF9PQkpFQ1RfTE9DSyBpbgorCSAgLSBnc3RfbWF0cm9za2FfZGVtdXhfcHVzaF9jb2RlY19kYXRhX2FsbCgpCisJICAtIGdzdF9tYXRyb3NrYV9kZW11eF9xdWVyeSgpCisJICBTb21lIHBhcnNlIGVsZW1lbnQgc3VjaCBhcyBGTEFDIGNoZWNrcyB1cHN0cmVhbSBzZWVrYWJpbGl0eSwgYW5kCisJICB0aGVyZSBpcyBzb21lIHVzZSBjYXNlcyB0aGF0IG1hdHJvc2thLWRlbXV4IGlzIGxpbmtlZCB0byBhIHBhcnNlIGVsZW1lbnQKKwkgIChlLmcuLEZMQUMgZm9ybWF0KSB3aXRob3V0IGludGVybWVkaWF0ZSBlbGVtZW50cyAoZS5nLiwgcXVldWUpLgorCSAgSW4gdGhpcyBjYXNlLCBtYXRyb3NrYS1kZW11eCBuZXZlciByZXR1cm5zIGZyb20gX3B1c2hfY29kZWNfZGF0YV9hbGwoKQorCSAgYmVjYXVzZSB0aGUgcGFyc2VyIGNhbiByZXR1cm4gb25seSBhZnRlciBpdCByZWNlaXZlcyB0aGUgcmVzcG9uc2UgdG8KKwkgIHRoZSB1cHN0cmVhbSBxdWVyeSwgYnV0IHRoYXQncyBub3QgZ29pbmcgdG8gaGFwcGVuIGJlY2F1c2UgaXQncworCSAgZGVhZGxvY2tlZC4KKwkgIEVsZW1lbnRzIG11c3Qgbm90IGhvbGQgdGhlIG9iamVjdCBsb2NrIHdoaWxzdCBwdXNoaW5nIG91dCBldmVudHMKKwkgIG9yIGRhdGEuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY2NjQ1CisKKzIwMTYtMDUtMTkgMTI6NDM6MDEgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5jOgorCSAgc291cGh0dHBjbGllbnRzaW5rOiBTZXQgc2VudF9idWZmZXJzIGFuZCBzdHJlYW1oZWFkZXJfYnVmZmVycyB0byBOVUxMIGFmdGVyIGZyZWVpbmcKKwkgIE90aGVyd2lzZSB3ZSBtaWdodCB1c2UgYW4gYWxyZWFkeSBmcmVlZCBsaXN0IGxhdGVyIGFuZCBjcmFzaCBvciB3b3JzZS4KKworMjAxNi0wNS0xOCAxODozMjo1NyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogZml4IFNpbmNlIHZlcnNpb24gZm9yIG5ldyAibG9vcCIgcHJvcGVydHkKKworMjAxNi0wNS0xNiAxNjoxODozNyArMDIwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOgorCSAgcnRwZGVjOiBmaXggY2xvY2sgbGVhaworCSAgZ3N0X3N5c3RlbV9jbG9ja19vYnRhaW4oKSByZXR1cm5zIGEgbmV3IHJlZi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjY1MjEKKworMjAxNi0wNS0xNyAwNTozMzozNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogYWRkIGRvYyBibHVyYiB3aXRoIHNpbmNlIG1hcmtlciBmb3IgbmV3ICJsb29wIiBwcm9wZXJ0eQorCisyMDE1LTExLTEzIDE1OjUyOjM1ICswMTAwICBEaW1pdHJpb3MgS2F0c2Fyb3MgPHBhdGNoZXJ3b3JrQGdtYWlsLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogYWRkIHN1cHBvcnQgZm9yIHBuZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1ODA1OQorCisyMDE2LTA1LTE1IDIyOjA3OjE0ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuYzoKKwkgIHNwbGl0bXV4c3JjOiBDb25uZWN0IHRvIGRlbXV4IHNpZ25hbHMgYmVmb3JlIGFjdGl2YXRpbmcKKwkgIEZpeCBhIHJhY2UgaW4gc3BsaXRtdXhzcmMgYnkgcHJvcGVybHkgY29ubmVjdGluZyB0byB0aGUKKwkgIGRlbXV4ZXIgc2lnbmFscyB3ZSdyZSBpbnRlcmVzdGVkIGluICpiZWZvcmUqIHNldHRpbmcgaXQgcnVubmluZy4KKworMjAxNi0wNS0xNSAxMzozMTozNyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSAgZG9jczogVXBkYXRlIGZvciBnaXQgbWFzdGVyCisKKzIwMTYtMDUtMTUgMTI6MTY6MjMgKzAyMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5Lmg6CisJICBydHBtcDRncGF5OiBEb24ndCBwcm9kdWNlIHRpbWVzdGFtcHMgYmFzZWQgb24gYnl0ZSBjb3VudAorCSAgVGhlIEdTVF9CVUZGRVJfT0ZGU0VUIG9mIG91dHB1dCBidWZmZXJzIHJldHVybmVkIHRvIEdzdFJ0cEJhc2VQYXlsb2FkCisJICBzaG91bGQgcmVmbGVjdCB0aGUgbnVtYmVyIG9mICJzYW1wbGVzIiBpbiB0aGUgdW5pdCBvZiB0aGUgUlRQIGNsb2NrIGluIHRoaXMKKwkgIGJ1ZmZlci4gSWYgdGhpcyBpcyBub3QgdHJ1ZSwgdGhlbiBpdCBzaG91bGRuJ3QgYmUgc2V0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MTk0MworCisyMDE2LTA1LTE1IDEyOjI0OjAzICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYS1tdXg6IEZpeCBzdHJjbXAgdXNhZ2UKKwkgIEp1c3QgdXNlIGdfc3RyY21wMCB3aGljaCBjYW4gaGFuZGxlIE5VTEwgZW50cmllcworCisyMDE2LTAzLTA0IDEwOjE0OjAwICswMTAwICBDYXJsb3MgUmFmYWVsIEdpYW5pIDxkdkBwc2V1ZG90ZXJtaW5hbC5vcmc+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogVXNlIGF1ZGlvL3gtdW5hbGlnbmVkLXJhdyBpbnN0ZWFkIG9mIGF1ZGlvL3gtcmF3IGZvciBMMTYgZGF0YQorCSAgRGlyZWN0bHkgc2V0dGluZyBhdWRpby94LXJhdyBjYXBzIGxlYWRzIHRvIHByb2JsZW1zIHdoZW4gdGhlIGRlbGl2ZXJlZAorCSAgZGF0YSBibG9ja3MgZG8gbm90IGFsaWduIHByb3Blcmx5IGF0IHNhbXBsZSBib3VuZGFyaWVzIChmb3IgZXhhbXBsZSwgYQorCSAgZGF0YSBibG9jayB3aXRoIDM5MSBieXRlcykuIFNvLCBpbnN0ZWFkLCBzZXQgYXVkaW8veC11bmFsaWduZWQtcmF3IHRvCisJICBsZXQgYSBwYXJzZXIgYmUgYXV0b3BsdWdnZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg5NDYwCisKKzIwMTYtMDUtMTIgMTE6NTI6MDkgKzA5MDAgIFNldW5naGEgWWFuZyA8c2gueWFuZ0BsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFBhcnNpbmcgZWxzdCBib3ggYmFzZWQgb24gdmVyc2lvbgorCSAgc2VnbWVudF9kdXJhdGlvbiBhbmQgbWVkaWFfdGltZSBzaG91bGQgYmUgcGFyc2VkIGJhc2VkIG9uIHZlcnNpb24KKwkgIG9mIGVsc3QgYm94LiBTcGVjaWZpY2F0aW9uIGRlZmluZXMgdGhhdCBhbiBlbHN0IGJveCB3aXRoIHZlcnNpb24gMQorCSAgaGFzIHVpbnQ2NCBhbmQgaW50NjQgdmFsdWVzIGZvciBzZWdtZW50X2R1cmF0aW9uIGFuZCBtZWRpYV90aW1lLAorCSAgcmVzcGVjdGl2ZWx5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjMwMQorCisyMDE2LTA1LTE0IDEyOjU3OjQxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogY2hlY2sgaWYgcmVxdWVzdCB3YXMgY2FuY2VsbGVkIHdoZW4gc2VuZGluZyBtZXNzYWdlCisJICBJdCBtaWdodCBiZSB0aGF0IHRoZSByZXF1ZXN0IHdhcyBhYm9ydGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBhbmQKKwkgIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbGx5CisKKzIwMTYtMDUtMTQgMTI6NDM6NTQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBwcm94eSByZXNvbHZlciBpcyBvbiBieSBkZWZhdWx0CisJICBSZW1vdmUgZnJvbSB0aGUgc2Vzc2lvbiBjcmVhdGlvbiBwYXJhbWV0ZXJzCisKKzIwMTYtMDUtMTQgMTI6MTU6NDggLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZXh0L3NvdXAvTWFrZWZpbGUuYW06CisJICBzb3VwOiB1cGRhdGUgYnVpbGQgdG8gd2FybiBhYm91dCBuZXdlciBkZXByZWNhdGVkIGZ1bmN0aW9ucworCSAgV2UgYWxyZWFkeSBkZXBlbmQgb24gMi40OAorCisyMDE2LTA1LTE0IDExOjA5OjMzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IHJlZHVjZSByZWFkaW5nIGxhdGVuY3kgYnkgdXNpbmcgbm9uLWJsb2NraW5nIHJlYWQKKwkgIE5vbi1ibG9ja2luZyByZWFkIHdpbGwgcmV0dXJuIHRoZSBhbW91bnQgb2YgZGF0YSBhdmFpbGFibGUgd2l0aG91dAorCSAgYmxvY2tpbmcgdG8gd2FpdCBmb3IgdGhlIGZ1bGwgcmVxdWVzdGVkIHNpemUuCisJICBUaGUgZG93bnNpZGUgaXMgdGhhdCBub3cgaXQgc291cGh0dHBzcmMgbmVlZHMgdG8gaGF2ZSBhIHdhaXRpbmcKKwkgIG1lY2hhbmlzbSBpbiBjYXNlIHRoZXJlIGlzIG5vIGRhdGEgYXZhaWxhYmxlIHlldCB0byBhdm9pZCBidXN5CisJICBsb29waW5nIGFyb25kIHRoZSBpbnB1dHN0cmVhbS4KKworMjAxNi0wNS0xNSAxMjozMDo1MCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogVGFrZSB0aGUgbG9jayBhbHJlYWR5IHdoZW4gcmVhZGluZyB0aGUgb3RoZXIgc3RhdHMsIG5vdCBqdXN0IGZvciB0aGUgaGFzaCB0YWJsZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjAyNQorCisyMDE2LTA1LTE0IDE3OjA0OjU3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJICBtYXRyb3NrYTogdXNlIG1hdGgtY29tcGF0LmggZm9yIE5BTiBkZWZpbmUKKworMjAxNi0wNS0xNCAyMzozOToyMiArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgc3BsaXRtdXhzaW5rOiBVc2UgR3N0QmluIGFzeW5jLWhhbmRsaW5nIGluc3RlYWQgb2Ygb3VyIG93bi4KKwkgIFNldCB0aGUgYXN5bmMtaGFuZGxpbmcgcHJvcGVydHkgb24gR3N0QmluIHRvIGxldCBpdCBtYW5hZ2UKKwkgIGFzeW5jLWhhbmRsaW5nIGluc3RlYWQgb2YgdGhlIGxvY2FsIGhhbmRsaW5nIGZyb20gdGhlIHByZXZpb3VzCisJICBjb21taXQuIFdvcmtzIGJlY2F1c2Ugb2YgIzE3NGE1ZSBpbiBjb3JlCisKKzIwMTYtMDUtMTMgMTA6MTc6MzMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJICBzb3VwaHR0cHNyYzogcmVmYWN0b3IgdG8gdXNlIFNvdXAncyBzeW5jIEFQSQorCSAgUmVwbGFjZSB0aGUgYXN5bmMgQVBJIHdpdGggdGhlIHN5bmMgQVBJIHRvIHJlbW92ZSBhbGwgdGhlIGV4dHJhIG1haW5sb29wCisJICBhbmQgY29udGV4dCBoYW5kbGluZy4gQ3VycmVudGx5IGl0IGJsb2NrcyByZWFkaW5nIHVudGlsICdibG9ja3NpemUnCisJICBieXRlcyBhcmUgYXZhaWxhYmxlIGJ1dCB0aGF0IGNhbiBiZSBpbXByb3ZlZCBieSB1c2luZzoKKwkgIGh0dHBzOi8vZGV2ZWxvcGVyLmdub21lLm9yZy9naW8vdW5zdGFibGUvR1BvbGxhYmxlSW5wdXRTdHJlYW0uaHRtbCNnLXBvbGxhYmxlLWlucHV0LXN0cmVhbS1yZWFkLW5vbmJsb2NraW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkzOTExCisKKzIwMTYtMDUtMTQgMDQ6NTA6MzYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkgIHRlc3RzOiBzb3VwaHR0cHNyYzogcmVwbGFjZSBkZXByZWNhdGVkIEFQSQorCSAgQXZvaWQgdXNpbmcgc291cF9zZXJ2ZXJfcnVuX2FzeW5jIGFuZCBvbGQgZ2V0X3BvcnQoKSBBUElzLAorCSAgcmVwbGFjZSB3aXRoIG1lIHNvdXBfc2VydmVyX2xpc3RlbiBhbmQgZ2V0IHRoZSBwb3J0IHRocm91Z2ggdGhlCisJICBVUklzIGxpc3QgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyLgorCisyMDE2LTA1LTE0IDEyOjM0OjEwICswMjAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogVXBncmFkZSBkZWJ1ZyBtZXNzYWdlIHRvIGVycm9yCisJICBJdCBjYXVzZXMgdGhlIGVudGlyZSBwaXBlbGluZSB0byBmYWlsLCBpdCBzaG91bGQgYmUgZWFzaWVyIHRvIGZpbmQuCisKKzIwMTYtMDUtMTQgMTg6MzI6NTIgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuaDoKKwkgIHNwbGl0bXV4c2luazogSGlkZSBpbnRlcm5hbCBhc3luYyBzdGF0ZSBjaGFuZ2VzLgorCSAgV2hlbiBzd2l0Y2hpbmcgZnJhZ21lbnRzLCBoaWRlIHRoZSBhc3luYy1zdGFydC9hc3luYy1kb25lCisJICBtZXNzYWdlcyBmcm9tIHRoZSBwYXJlbnQgYmluLCBhcyBvdGhlcndpc2Ugd2Ugc29tZXRpbWVzICh2ZXJ5IHJhcmVseSkKKwkgIGhhbmcgaW4gUEFVU0VEIGluc3RlYWQgb2YgcmV0dXJuaW5nIC8gY29udGludWluZyB0byBQTEFZSU5HCisJICBzdGF0ZS4KKworMjAxNi0wNS0xMyAyMToyMDoyOCArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IFJlbW92ZSBzdHJheSBjYXJyaWFnZS1yZXR1cm4gZnJvbSBkZWJ1ZworCisyMDE2LTA1LTEzIDE2OjQzOjIxICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgcnRwOiBTaGlwIGdzdHJ0cGoya2NvbW1vbi5oIGZpbGUgdG8gZml4IGRpc3RjaGVjaworCisyMDE1LTA0LTMwIDE0OjQzOjA0ICswMjAwICBKZXNwZXIgTGFyc2VuIDxrbm9yci5qZXNwZXJAZ21haWwuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBEbyBub3Qgd3JpdGUgaW5kZXggYW5kIGhlYWRlciBpZiBpZHggaXMgTlVMTAorCSAgRml4ZXMgY3JpdGljYWxzIHdpdGggZS5nLgorCSAgdmlkZW90ZXN0c3JjIG51bS1idWZmZXJzPTEgISBpZGVudGl0eSBkcm9wLXByb2JhYmlsaXR5PTEuMCAhIGF2aW11eCAhIGZha2VzaW5rCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ4NzAwCisKKzIwMTYtMDUtMTIgMDg6NDM6MzkgLTA0MDAgIEFhcm9uIEJveGVyIDxib3hlcmFiQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkgIHJ0cGoya3BheTogbWFuYWdlIFQgdGlsZSBpbnZhbGlkYXRpb24gYml0IGNvcnJlY3RseSwgdXBkYXRlIHRpbGUgaWQgaW4gaGVhZGVyIGNvcnJlY3RseS4KKwkgIDEuIGFjY29yZGluZyB0byBSRkMsIFQgYml0IGlzIG9ubHkgc2V0IHdoZW4gZWl0aGVyIHRoZSBSVFAgcGFja2V0IG9ubHkgY29udGFpbnMgdGhlIEoySyBtYWluIGhlYWRlciwgb3IgdGhlIHBhY2tldCBjb250YWlucyB0aWxlIHBhcnRzIGZyb20gbXVsdGlwbGUgdGlsZXMuIFRoaXMgaXMgbm93IGJlaW5nIG1hbmFnZWQgY29ycmVjdGx5IGluIHRoZSBjb2RlLiBUaGUgc2Vjb25kIHNjZW5hcmlvIGNhbm5vdCBoYXBwZW4gd2l0aCBvdXIgcGF5bG9hZGVyLCBzaW5jZSB0aWxlIGhlYWRlcnMgYXJlIGFsd2F5cyBwbGFjZWQgaW4gdGhlaXIgb3duIFJUUCBwYWNrZXQsIGFuZCBzbyBhIHBhY2tldCBjYW5ub3QgY29udGFpbiB0aWxlIHBhcnRzIGZyb20gbXVsdGlwbGUgdGlsZXMuCisJICBIb3dldmVyLCBJIGhhdmUgYWRkZWQgY29kZSB0byB0cmFjayBpZiBtdWx0aXBsZSB0aWxlIHBhcnRzIGFyZSBpbmNsdWRlZCBpbiBhIHNpbmdsZSBSVFAgcGFja2V0LCBpbiBjYXNlIGluIHRoZSBmdXR1cmUgd2Ugd2FudCB0byBwdXQgaGVhZGVyIGFuZCBkYXRhIGluIHNhbWUgcGFja2V0LgorCSAgMi4gT2xkIGNvZGUgd291bGQgc2V0IHRoZSB0aWxlIGlkIHRvIHplcm8gZm9yIGFsbCBKMksgcGFja2V0cy4gVGhpcyBpcyBub3cgc2V0IGNvcnJlY3RseSB0byB0aGUgYXBwcm9wcmlhdGUgdGlsZSBpZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDUxODcKKworMjAxNi0wNS0xMiAwODo0MTo1MSAtMDQwMCAgQWFyb24gQm94ZXIgPGJveGVyYWJAZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5jOgorCSAgcnRwajJrcGF5OiBtYW5hZ2UgZnJhZ21lbnRlZCBoZWFkZXJzIGNvcnJlY3RseQorCSAgSjJLIG1haW4gaGVhZGVyIGZyYW1lbnRhdGlvbiBhY3Jvc3MgbXVsdGlwbGUgUlRQIHBhY2tldHMgaXMgbm93IGhhbmRsZWQgY29ycmVjdGx5CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1MTg3CisKKzIwMTYtMDUtMTEgMTU6MDQ6MjYgLTA0MDAgIEFhcm9uIEJveGVyIDxib3hlcmFiQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtjb21tb24uaDoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5oOgorCSAgcnRwajJrOiBtb3ZlIGNvbW1vbiBjb2RlIHRvIHNoYXJlZCBoZWFkZXIsIGNvZGUgY2xlYW4gdXAKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDUxODcKKworMjAxNi0wNS0xMSAxNTowMTozMiAtMDQwMCAgQWFyb24gQm94ZXIgPGJveGVyYWJAZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGoya2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5jOgorCSAgcnRwajJrOiB1cGRhdGUgZG9jdW1lbnRhdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTE4NworCisyMDE2LTA1LTEyIDE0OjQzOjQzICswMjAwICBQYXRyaWNpYSBNdXNjYWx1IDxwYXRyaWNpYUBheGlzLmNvbT4KKworCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5oOgorCSAgYXVwYXJzZTogRml4IHN0aWNreSBldmVudCBtaXNvcmRlcmluZyB3YXJuaW5nCisJICBNYWtlIHN1cmUgdGhhdCBzcmMgcGFkIGhhcyBjYXBzIGJlZm9yZSBzZW5kaW5nIHNlZ21lbnQgZXZlbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY2MzU5CisKKzIwMTYtMDUtMTEgMDk6Mjg6MTMgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IERvbid0IG5vdGlmeSBhYm91dCBzdGF0cyBwcm9wZXJ0eSBjaGFuZ2VzIHdoaWxlIHRha2luZyB0aGUgc2Vzc2lvbiBsb2NrCisJICBUaGUgc2lnbmFsIGhhbmRsZXJzIG1pZ2h0IHdhbnQgdG8gYWN0dWFsbHkgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3RhdHMKKwkgIHByb3BlcnR5LCB3aGljaCB3b3VsZCB0YWtlIHRoZSBzZXNzaW9uIGxvY2sgYWdhaW4gYW5kIGRlYWRsb2NrLgorCSAgVGhpcyB3YXMgaW50cm9kdWNlZCBieSAyZTk2MGU3MDc1MGEwY2I3ZTExMTdkMGMwOWQwODU5Nzg2NmEyOWVlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjAyNQorCisyMDE2LTA1LTAzIDEzOjU5OjU0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogaW1wcm92ZSBlZHRzIHNlZ21lbnQgaGFuZGxpbmcgYWZ0ZXIgc2Vla3MgaW4gcHVzaCBtb2RlCisJICBQcm9wZXJseSBoYW5kbGUgZWR0cyBzZWdtZW50cyBmb3IgcHVzaC1iYXNlZCBvcGVyYXRpb24gc2Vla2luZy4KKwkgIFdlIG9ubHkgc3VwcG9ydCBlZHRzIHRoYXQgYSBzaW5nbGUgc2VnbWVudCB0aGF0IGhhcyBtZWRpYSBhdCB0aGUgZW5kLAorCSAgYmVpbmcgcHJlY2VlZGVkIGJ5IGFueSBudW1iZXIgb2YgZ2FwIHNlZ21lbnRzLgorCSAgVGhpcyBhbHNvIGFsbG93cyB0aGUgcXQgc2VnbWVudCByYXRlIHRvIGJlIHJlc3BlY3RlZCBhZnRlciBzZWVrcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NTY2OQorCisyMDE2LTA1LTAzIDEwOjQxOjA2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcHJvcGVybHkgYWN0aXZhdGUgc2VnbWVudCB3aXRoIHJhdGUgIT0gMS4wCisJICBBbHNvIHVzZSB0aGUgcXQgcmF0ZSB0byBpZGVudGlmeSB0aGUgcG9zaXRpb24gd2l0aGluIGEgcXQgc2VnbWVudAorCSAgdG8gcHJvcGVybHkgdHJhbnNsYXRlIHBsYXliYWNrIHRpbWUgdG8gcXQgbWVkaWEgdGltZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NTY2OQorCisyMDE2LTA1LTAzIDExOjQ1OjAxICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IEZpeCBzdGFsbCB3aGVuIHJlY2VpdmluZyBhbHJlYWR5IGxvc3QgcGFja2V0CisJICBXaGVuIGEgcGFja2V0IGFycml2ZXMgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNvbnNpZGVyZWQgbG9zdCBhcyBwYXJ0IG9mIGEKKwkgIGxhcmdlIGdhcCB0aGUgImxvc3QgdGltZXIiIGZvciB0aGlzIHdpbGwgYmUgY2FuY2VsbGVkLiBJZiB0aGUgcmVtYWluaW5nCisJICBwYWNrZXRzIG9mIHRoaXMgbGFyZ2UgZ2FwIG5ldmVyIGFycml2ZXMsIHRoZXJlIHdpbGwgYmUgbWlzc2luZyBlbnRyaWVzCisJICBpbiB0aGUgcXVldWUgYW5kIHRoZSBsb29wIGZ1bmN0aW9uIHdpbGwga2VlcCB3YWl0aW5nIGZvciB0aGVzZSBwYWNrZXRzCisJICB0byBhcnJpdmUgYW5kIG5ldmVyIHB1c2ggYW5vdGhlciBwYWNrZXQsIGVmZmVjdGl2ZWx5IHN0YWxsaW5nIHRoZQorCSAgcGlwZWxpbmUuCisJICBUaGUgcHJvcG9zZWQgZml4IGNvbmNpZGVycyBwYXJ0cyBvZiBhIGxhcmdlIGdhcCBkZWZpbml0ZWx5IGxvc3QgKHNpbmNlCisJICB0aGV5IGFyZSBjYWxjdWxhdGVkIGZyb20gbGF0ZW5jeSkgYW5kIGlnbm9yZXMgdGhlIGxhdGUgYXJyaXZhbHMuCisJICBJbiBwcmFjdGljZSB0aGUgaXNzdWUgaXMgcmFyZSBzaW5jZSBsYXJnZSBnYXBzIGFyZSBzY2hlZHVsZWQgaW1tZWRpYXRlbHksCisJICBhbmQgZm9yIHRoZSBzdGFsbCB0byBoYXBwZW4gdGhlIGxhdGUgYXJyaXZhbCBuZWVkcyB0byBiZSBwcm9jZXNzZWQKKwkgIGJlZm9yZSB0aGlzIHRpbWVzIG91dC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjU5MzMKKworMjAxNi0wNS0wNSAxNDoxODoyMSArMDIwMCAgTWlndWVsIFBhcsOtcyBEw61heiA8bXBhcmlzZGlhekBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IFRha2Ugc2Vzc2lvbiBsb2NrIHdoZW4gY3JlYXRpbmcgc3RhdHMKKwkgIFRoZSBhY2Nlc3MgdG8gdGhlIHNlc3Npb24gaGFzaCB0YWJsZSBtdXN0IGhhcHBlbiB3aGlsZSB0aGUgc2Vzc2lvbiBsb2NrIGlzCisJICB0YWtlbiwgb3RoZXJ3aXNlIGFub3RoZXIgdGhyZWFkIG1pZ2h0IG1vZGlmeSB0aGUgaGFzaCB0YWJsZSB3aGlsZSB3ZSdyZQorCSAgY3JlYXRpbmcgdGhlIHN0YXRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NjAyNQorCisyMDE2LTA1LTAzIDIxOjE3OjAxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdXBkYXRlIHNlZ21lbnQgd2hlbiBuZXcgZHVyYXRpb24gaXMgZm91bmQKKwkgIE90aGVyd2lzZSB0aGUgb2xkIHNlZ21lbnQgd2lsbCBoYXZlIGEgc2hvcnRlciBzdG9wIHRpbWUgYW5kIHdvdWxkCisJICBjYXVzZSB0aGUgc3RyZWFtIHRvIGVuZCB0b28gZWFybHkuCisKKzIwMTYtMDUtMDQgMTE6Mzc6MjkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBkaXNtZW1iZXIgYWN0aXZhdGVfc2VnbWVudCBpbnRvIDIgcGFydHMKKwkgIE9uZSB0aGF0IHVwZGF0ZXMgYW5kIHB1c2ggYSBuZXcgc2VnbWVudCwgdGhlIG90aGVyIHdpbGwgbW92ZSB0aGUKKwkgIHN0cmVhbSB0byB0aGUgbmV3IHNlZ21lbnQgc3RhcnRpbmcgcG9zaXRpb24KKworMjAxNi0wNS0wNCAwOTozMDoyNyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSAgZHY6IFVzZSBjb3JyZWN0IHBpeGVsLWFzcGVjdC1yYXRpbyB2YWx1ZXMKKwkgIFRoZSBwcmV2aW91cyBvbmVzIHJlc3VsdGVkIGluIG9kZCBkaXNwbGF5IGFzcGVjdCByYXRpb3MgYW5kIHdlcmUgZGlmZmVyZW50CisJICBmcm9tIHRoZSBvbmVzIHVzZWQgYnkgZS5nLiBmZm1wZWcuIFRoZSBuZXcgb25lcyBub3cgcmVzdWx0IGluIGRpc3BsYXkgYXNwZWN0CisJICByYXRpb3Mgb2YgNDozIGFuZCAxNjo5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NTk0NgorCisyMDE1LTExLTA5IDE3OjU1OjA5ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zcGxpdG11eC5jOgorCSAgdGVzdHM6IGFkZCBzcGxpdG11eHNyYyB0ZXN0IGZvciBuZXcgImZvcm1hdC1sb2NhdGlvbiIgc2lnbmFsCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzNjI1CisKKzIwMTUtMTEtMDkgMTc6NTE6MTIgKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkgIHNwbGl0bXV4c3JjOiBhZGQgYSBmb3JtYXQtbG9jYXRpb24gc2lnbmFsIHRoYXQgYWxsb3dzIGJ5cGFzc2luZyB0aGUgbG9jYXRpb24gcHJvcGVydHkKKwkgIFRoaXMgc2lnbmFsIGFsbG93cyBhIHVzZXIgdG8gZGlyZWN0bHkgcmV0dXJuIGEgc29ydGVkIGxpc3Qgb2YKKwkgIGZpbGVzIHRvIGJlIGpvaW5lZCwgc28gdGhhdCB0aGV5IGRvbid0IGhhdmUgdG8gZm9sbG93IHRoZQorCSAgZmlsZW5hbWUgcGF0dGVybiB0aGF0IHRoZSAibG9jYXRpb24iIHByb3BlcnR5IGV4cGVjdHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzNjI1CisKKzIwMTYtMDUtMDQgMTE6MTU6MjAgLTA0MDAgIFhhdmllciBDbGFlc3NlbnMgPHhhdmllci5jbGFlc3NlbnNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkgIHNwbGl0bXV4c2luazogRml4IGRlYWRsb2NrIGNhc2Ugd2hlbiBzb3VyY2UgcmVhY2hlcyBFT1MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjUwNzIKKworMjAxNi0wNS0wMyAyMjo1OToyNyAtMDcwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogc2ltcGxpZnkgYW5kIGNvcnJlY3QgaGVhZGVyIHNjYW5uaW5nCisJICBUaGUgd2F2IHNwZWMgdGVsbHMgdGhhdCAnZm10JyAoYW5kICdiZXh0JyBpZiBwcmVzZW50KSBtdXN0IGNvbWUgYmVmb3JlICdkYXRhJy4KKwkgIFRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IGZvciAnZm10JyB0byBiZSBmaXJzdC4gV2UgYWxyZWFkeSBoYWQgYSBsaXN0IG9mIGNodW5rcworCSAgdG8gc2tpcCwgYnV0IGl0IGlzIGVhc2llciB0byBqdXN0IHNraXAgYW55IGNodW5rIHdoaWxlIHNlZWtpbmcgZm9yICdmbXQnLgorCSAgVGhpcyBmaXhlcyByZWFkaW5nIGZpbGVzIGdlbmVyYXRlZCBieSBQcm9Ub29scy4KKworMjAxNi0wNC0zMCAyMjoxNToxMyArMDkwMCAgSHl1bmp1biBLbyA8enpvb25AaWdhbGlhLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9kZXZpY2Vwcm92aWRlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvZGV2aWNlcHJvdmlkZXIuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmg6CisJICBvc3hhdWRpbzogU3VwcG9ydCBhdWRpbyBkZXZpY2UgcHJvdmlkZXIgb24gb3N4CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzMjY1CisKKzIwMTYtMDUtMDEgMTU6MDk6MjcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogc2V0IGF1ZGlvIGhlYWRlciByYXRlIGFjY29yZGluZyB0byBjYWxjdWxhdGVkIGJwcyBpbiBzdG9wX2ZpbGUKKwkgIC4uLiBub3cgdGhhdCBzZXRfZmllbGRzIGlzIG5vIGxvbmdlciBjYWxsZWQgdGhlcmUgYnkKKwkgIGU1Mzg2MDhiM2Y5MDUzOTAwM2RlMjFjMWRiMjM4ZjNjOWI5NDZlMzAKKworMjAxNi0wNC0yOSAxNTowNDoxMSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IFN0b3JlIHRoZSBzZWdtZW50IHNlcXVlbmNlIG51bWJlciBpbiB0aGUgRU9TIGV2ZW50cyBhbmQgU0VHTUVOVF9ET05FIGV2ZW50cy9tZXNzYWdlCisJICBBbHNvIGluc3RlYWQgb2Ygc3RvcmluZyBpdCBwZXIgc3RyZWFtLCBzdG9yZSBpdCBnbG9iYWxseSBpbiB0aGUgZGVtdXhlci4gSXQncworCSAgdGhlIHNhbWUgZm9yIGVhY2ggc3RyZWFtIGFueXdheS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjU4MDYKKworMjAxNi0wNC0xMSAxMDo1NDozOCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogQWx3YXlzIGJpbmQgdG8gQU5ZIHdoZW4gYWRkcmVzcyBpcyBhIG11bHRpY2FzdCBhZGRyZXNzIGFuZCBub3Qgb25seSBvbiBXaW5kb3dzCisJICBGb3IgSVB2NiBhZGRyZXNzZXMsIGJpbmRpbmcgdG8gYSBtdWx0aWNhc3QgZ3JvdXAgZG9lcyBub3Qgd29yayBvbiBMaW51eAorCSAgZWl0aGVyLiBBbHdheXMgYmluZCB0byBBTlkgYW5kIHRoZW4gbGF0ZXIgam9pbiB0aGUgbXVsdGljYXN0IGdyb3VwLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDY3OQorCisyMDE2LTA0LTI2IDE3OjAxOjQ5ICswODAwICBTb25nIEJpbmcgPGIwNjQ5OEBmcmVlc2NhbGUuY29tPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzoKKwkgIHhpbWFnZXV0aWw6IHNob3VsZG4ndCBpbXBsZW1lbnQgdHJhbnNmb3JtIGlmIGRvbid0IHN1cHBvcnQgaXQKKwkgIHNob3VsZG4ndCBpbXBsZW1lbnQgdHJhbnNmb3JtIGlmIGRvbid0IHN1cHBvcnQgaXQuIE9yIGdzdF9idWZmZXJfY29weV9pbnRvKCkKKwkgIHdpbGwgcHJpbnQgRVJST1IgbG9nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NTU4MworCisyMDE2LTA0LTI4IDE2OjI0OjUyICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogQWxsb3cgTVBFRy0xIExheWVyIDEgYW5kIDIgaW4gYWRkaXRpb24gdG8gMyBpbiBNUDQKKwkgIFZpYSB0aGUgTVBFRy00IFBhcnQgMyBzcGVjIHdlIGNhbiBzdXBwb3J0IHRoZSBvdGhlciBsYXllcnMgdG9vLgorCSAgQWxzbyBjb3JyZWN0IHRoZSBzYW1wbGVzIHBlciBmcmFtZSBjYWxjdWxhdGlvbiBmb3IgTVAzIGlmIGl0J3MgTVBFRy0yIG9yCisJICBNUEVHLTIuNS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjU3MjUKKworMjAxNi0wNC0yNyAyMDo0NjozNCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogVXBkYXRlIGNhcHMgZm9yIFRDUCB3aGVuZXZlciB0aGV5IGNoYW5nZQorCSAgV2Ugb25seSBjaGFuZ2VkIHRoZW0gZm9yIFVEUCBzbyBmYXIsIHdoaWNoIGNhdXNlZCB0aGUgd3Jvbmcgc2VxbnVtLWJhc2UgYW5kCisJICBvdGhlciBpbmZvcm1hdGlvbiB0byBiZSBwYXNzZWQgdG8gcnRwaml0dGVyYnVmZmVyL2V0YyB3aGVuIHNlZWtpbmcuIFRoaXMKKwkgIHVzdWFsbHkgd2Fzbid0IHRoYXQgbXVjaCBvZiBhIHByb2JsZW0gYXMgdGhlIGNvZGUgdGhlcmUgaXMgcm9idXN0IGVub3VnaCwgYnV0CisJICBldmVyeSBub3cgYW5kIHRoZW4gaXQgY2F1c2VzIHVzIHRvIGRyb3AgdXAgdG8gMzI3NTYgcGFja2V0cyBiZWZvcmUgd2UKKwkgIGNvbnRpbnVlIGRvaW5nIGFueXRoaW5nIG1lYW5pbmdmdWwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY1Njg5CisKKzIwMTYtMDQtMjcgMjA6MzM6MzggKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBFbnN1cmUgdG8gbm90IHRha2UgY2FwcyB3aXRoIHRoZSB3cm9uZyBwdCBmb3IgZ2V0dGluZyB0aGUgY2xvY2stcmF0ZQorCSAgRXNwZWNpYWxseSB0aGUgY2FwcyBvbiB0aGUgcGFkIG1pZ2h0IGJlIG91dCBvZiBkYXRlLCBhbmQgdGhlIG5ldyBjYXBzIHdvdWxkIGJlCisJICBwcm92aWRlZCBmb3IgdGhlIGN1cnJlbnQgcHQgdmlhIHRoZSByZXF1ZXN0LXB0LW1hcCBzaWduYWwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY1Njg5CisKKzIwMTYtMDQtMjcgMTg6Mjc6MTcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IERvbid0IHByb3BhZ2F0ZSBzcHVyaW91cyBzdGF0ZSBjaGFuZ2UgcmV0dXJucyBmcm9tIGludGVybmFsIGVsZW1lbnRzIGZ1cnRoZXIKKwkgIFdlIGhhbmRsZSB0aGVtIGluc2lkZSBydHNwc3JjIGFuZCBvdmVycmlkZSB0aGVtIGluIGFsbCBvdGhlciBjYXNlcyBhbnl3YXksIHNvCisJICBkbyB0aGUgc2FtZSBmb3IgImludGVybmFsIiBzdGF0ZSBjaGFuZ2VzIGxpa2UgUEFVU0VELT5QQVVTRUQgYW5kCisJICBQTEFZSU5HLT5QTEFZSU5HLgorCSAgVGhpcyBrZWVwcyB1bmV4cGVjdGVkIE5PX1BSRVJPTEwgdG8gY29uZnVzZSBzdGF0ZSBjaGFuZ2VzIGluIEdzdEJpbi4KKwkgIFNlZSBhbHNvIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjA1MzIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjU2ODkKKworMjAxNi0wNC0yNyAxNDowOTowMyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogRG9uJ3Qgb3ZlcnJpZGUgbWF4aW11bSBhdWRpbyBjaHVuayBzaXplIHdpdGggdGhlIHNjYWxlIGFnYWluIGp1c3QgYmVmb3JlIHdyaXRpbmcgaXQKKwkgIHNldF9maWVsZHMoKSBzaG91bGQgb25seSBiZSBjYWxsZWQgaW4gdGhlIGJlZ2lubmluZywgb3RoZXJ3aXNlIHdlIHdpbGwgbmV2ZXIKKwkgIHJlbWVtYmVyIHRoZSBtYXhpbXVtIGF1ZGlvIGNodW5rIHNpemUgYW5kIHdyaXRlIGEgd3JvbmcgYmxvY2sgYWxpZ24uLi4gd2hpY2gKKwkgIHRoZW4gY2F1c2VzIHdyb25nIHRpbWVzdGFtcHMgYW5kIG90aGVyIHByb2JsZW1zLgorCisyMDE2LTA0LTI3IDEzOjUzOjAwICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBBY3R1YWxseSBzdG9yZSB0aGUgbGFyZ2VzdCBhdWRpbyBjaHVuayBzaXplIGZvciB0aGUgVkJSIGNhc2Ugb2YgTVAyL01QMworCSAgM2VhMzM4Y2UyNzFlMWY2YTk2ZDJlZDQ5ZDQ0NzJiMDkxZjZmOGI3ZSBjaGFuZ2VkIGF2aW11eCB0byBkbyB0aGF0LCBidXQgaXQKKwkgIG5ldmVyIGFjdHVhbGx5IGtlcHQgdHJhY2sgb2YgdGhlIG1heCBhdWRpbyBjaHVuayBmb3IgTVAzIGFuZCBNUDIuIFRoZXNlIGFyZQorCSAga25vd2luZyB0aGUgaGRyLnNjYWxlIG9ubHkgYWZ0ZXIgcGFyc2luZyB0aGUgZnJhbWVzIGluc3RlYWQgb2YgYXQgc2V0Y2FwcworCSAgdGltZS4KKworMjAxNi0wNC0yNSAxNTowMzoxNCArMDIwMCAgTWF0cyBMaW5kZXN0YW0gPG1hdHNsbUBheGlzLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazogQWxsb3cgc2V0dGluZyAic29ja2V0LXY2IiB3aXRob3V0IHNldHRpbmcgInNvY2tldCIgdG9vCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY0ODk3CisKKzIwMTYtMDQtMjIgMTU6MDI6MTYgKzAxMDAgIE1hcmlvIFNhbmNoZXogUHJhZGEgPG1hcmlvQGVuZGxlc3NtLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cHhlbmMuYzoKKwkgIHZweGVuYzogUHJvcGVybHkgaGFuZGxlIGZyYW1lcyB3aXRoIHRvbyBsb3cgZHVyYXRpb24KKwkgIFdoZW4gYSBmcmFtZSdzIGR1cmF0aW9uIGlzIHRvbyBsb3csIGNhbGxpbmcgZ3N0X3V0aWxfdWludDY0X3NjYWxlKCkKKwkgIHRvIHNjYWxlIGl0cyB2YWx1ZSBjYW4gcmVzdWx0IGludG8gaXQgYmVpbmcgdHJ1bmNhdGVkIHRvIHplcm8sIHdoaWNoCisJICB3aWxsIGNhdXNlIHRoZSB2cHggZW5jb2RlciB0byByZXR1cm4gYW4gVlBYX0NPREVDX0lOVkFMSURfUEFSQU0gZXJyb3IKKwkgIHdoZW4gdHJ5aW5nIHRvIGVuY29kZS4KKwkgIFRvIHByZXZlbnQgdGhpcyBmcm9tIGhhcHBlbmluZywgd2Ugc2ltcGx5IGlnbm9yZSB0aGUgZHVyYXRpb24gd2hlbgorCSAgZW5jb2RpbmcgaWYgaXQgYmVjb21lcyB6ZXJvIGFmdGVyIHNjYWxpbmcsIGxvZ2dpbmcgYSB3YXJuaW5nIG1lc3NhZ2UuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY1MzkxCisKKzIwMTYtMDQtMjIgMTU6NDg6MDggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGZpeCBkZXNjcmlwdGlvbiBvZiBsaW5lYXIgaW50ZXJsYWNpbmcgbWV0aG9kCisKKzIwMTYtMDQtMjEgMTQ6MDg6MTkgLTAzMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRzYXVuaWVyQGdub21lLm9yZz4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdjogSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGRvIG5vdCBnZXQgYW55IENvbGxlY3REYXRhIGluIGhhbmRsZV9idWZmZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjUzMjAKKworMjAxNi0wNC0xMSAyMjo0MToyMCArMDkwMCAgU2V1bmdoYSBZYW5nIDxzaC55YW5nQGxnZS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRG8gbm90IHVzZSB1bnJlbGlhYmxlIGZyYW1lcmF0ZQorCSAgdGltZXNjYWxlLzEgaXMgdW5yZWxpYWJsZSB2YWx1ZSBmb3IgZnJhbWVyYXRlLiBEdWUgdG8gZG93bnN0cmVhbQorCSAgZWxlbWVudCB1c3VhbGx5IHVzZSBmcmFtZXJhdGUgZ2VuZXJhdGVkIGJ5IHF0ZGVtdXgsIGxldCBpdCBiZSBvbWl0dGVkCisJICB1bnRpbCB0aGUgZnJhbWVyYXRlIGNhbiBiZSByZWxpYWJseSBjYWxjdWxhdGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDczMworCisyMDE2LTA0LTIxIDEyOjUzOjMzICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSAgUmV2ZXJ0ICJxdGRlbXV4OiBleHBvc2Ugc3RyZWFtcyB3aXRoIGZpcnN0IG1vb2YgZm9yIGZyYWdtZW50ZWQgZm9ybWF0IgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCBkOGJiNjY4N2VhMjUxNTcwYzMzMTAzODI3OWE0M2Q0NDgxNjdkNmFkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDczMworCisyMDE2LTAyLTA5IDE3OjE3OjA5ICswMDAwICBBbGV4IEFzaGxleSA8YnVnemlsbGFAYXNobGV5LWZhbWlseS5uZXQ+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc3VwcG9ydCBzZWVraW5nIG9mIENFTkMgZW5jcnlwdGVkIHN0cmVhbXMKKwkgIFdoZW4gcGxheWluZyBhIHN0cmVhbSB0aGF0IGhhcyBiZWVuIHByb3RlY3RlZCBieSBEQVNIIENFTkMsIHBsYXliYWNrCisJICB3aWxsIGZhaWwgaWYgYSBzZWVrIGlzIHBlcmZvcm1lZC4gUXRkZW11eCBwcm9kdWNlcyB0aGUgZXJyb3IgInN0cmVhbQorCSAgaXMgcHJvdGVjdGVkIHVzaW5nIGNlbmMsIGJ1dCBubyBjZW5jIHByb3RlY3Rpb24gc3lzdGVtIGluZm9ybWF0aW9uCisJICBoYXMgYmVlbiBmb3VuZCIgYW5kIHBsYXliYWNrIHN0b3BzLgorCSAgVGhlIHByb2JsZW0gaXMgdGhhdCBnc3RfcXRkZW11eF9yZXNldCgpIGdldHMgY2FsbGVkIGFzIHBhcnQgb2YgdGhlCisJICBGTFVTSCBkdXJpbmcgYSBzZWVrLiBUaGlzIGZ1bmN0aW9uIGZyZWVzIHRoZSBwcm90ZWN0aW9uX3N5c3RlbV9pZHMKKwkgIGFycmF5LiBXaGVuIGdzdF9xdGRlbXV4X2NvbmZpZ3VyZV9wcm90ZWN0ZWRfY2FwcygpIGlzIGNhbGxlZCBhZnRlciB0aGUKKwkgIHNlZWsgaGFzIGNvbXBsZXRlZCwgdGhlIHByb3RlY3Rpb25fc3lzdGVtX2lkcyBhcnJheSBpcyBlbXB0eSBhbmQKKwkgIHF0ZGVtdXggaXMgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgY29ycmVjdCBvdXRwdXQgY2FwcyBmb3IgdGhlIHByb3RlY3RlZAorCSAgc3RyZWFtLgorCSAgVGhpcyBjb21taXQgY2hhbmdlcyBpdCB0byBvbmx5IGZyZWUgdGhlIHByb3RlY3Rpb25fc3lzdGVtX2lkcyBvbgorCSAgaGFyZCByZXNldHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYxNzg3CisKKzIwMTYtMDQtMTggMTQ6MzM6MTAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgdWRwc3JjOiBhZGQgInJldHJpZXZlLXNlbmRlci1hZGRyZXNzIiBwcm9wZXJ0eQorCSAgVGhpcyBhbGxvd3MgZGlzYWJsaW5nIG9mIHNlbmRlciBhZGRyZXNzIHJldHJpZXZhbCwgd2hpY2ggbWlnaHQKKwkgIGJlIHVzZWZ1bCBpbiBjZXJ0YWluIHNjZW5hcmlvcywgbGlrZSB3aGVuIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkLAorCSAgb3IgdGhlIHNlbmRlciBhZGRyZXNzIGlzIG5vdCBvZiBpbnRlcmVzdCAoZS5nLiB3aGVuIHJlY2VpdmluZyBhbgorCSAgTVBFRy1UUyBzdHJlYW0pLiBEaXNhYmxpbmcgc2VuZGVyIGFkZHJlc3MgcmV0cmlldmFsIGluIHRob3NlCisJICBjYXNlcyBjYW4gaGF2ZSBtaW5vciBwZXJmb3JtYW5jZSBhZHZhbnRhZ2VzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU2MzMyMworCisyMDE1LTExLTI2IDEzOjE1OjA2ICswMTAwICBEaW1pdHJpb3MgS2F0c2Fyb3MgPHBhdGNoZXJ3b3JrQGdtYWlsLmNvbT4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgdjRsMjogQ2hhbmdlIHdhcm5pbmcgaGFuZGxpbmcgdG8gYnJlYWsgaW5maW5pdGUgbWVzc2FnZSBsb29wCisJICB2NGwyc3JjIGNhbiBjYXVzZSBhbiAiaW5maW5pdGUgbWVzc2FnZSBsb29wIiB3aGVuIGEgYmFzZSBjb250cm9sIGV4cG9zZWQgYXMgYQorCSAgcHJvcGVydHkgaXMgbm90IHByb3ZpZGVkIGJ5IHRoZSBkZXZpY2UuIEluIHRoZXNlIGNhc2VzLCBpZiBpbiB0aGUgd2FybmluZyBtZXNzYWdlCisJICBoYW5kbGluZyBmb3IgdGhlIGJ1cywgdGhlIEdTVF9ERUJVR19CSU5fVE9fRE9UX0ZJTEUqIGNhdGVnb3J5IG9mIGZ1bmN0aW9ucyBhcmUgdXNlZCwKKwkgIHRoZSBzcmMgbG9va3VwIGNhdXNlcyBhIG5ldyB3YXJuaW5nIHRvIGJlIHBvc3RlZCBvbiB0aGUgYnVzLCBjYXVzaW5nIGEgbG9vcC4KKwkgIFRoaXMgcGF0Y2ggY2hhbmdlcyB0aGUgd2FybmluZyBmb3IgdGhlc2UgY29udHJvbHMgc28gdGhleSBhcmUgbm90IHBvc3RlZCBvbiB0aGUgYnVzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1ODcwMworCisyMDE2LTA0LTE1IDEwOjQ0OjAyIC0wNDAwICBYYXZpZXIgQ2xhZXNzZW5zIDx4YXZpZXIuY2xhZXNzZW5zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGl0bXV4c2luazogQXZvaWQgY3JlYXRpbmcgc21hbGwgZmlsZSBhdCBFT1MKKwkgIFdoZW4gRU9TIGlzIHJlYWNoZWQsIHRoZSBjdXJyZW50IGZpbGUgZ2V0IGNsb3NlZCBhbmQgdGhlIGxhc3QKKwkgIEdPUCBpbiB0aGUgbXEgd2FzIHdyaXR0ZW4gaW4gYSBuZXcgZmlsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjUwNzIKKworMjAxNi0wNC0xNSAxOTo1OToxNSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSAgc2NhbGV0ZW1wbzogUzE2IHVzZXMgUzMyIHRlbXBvcmFyeSBidWZmZXJzLCBmbG9hdC9kb3VibGUgdGhlaXIgb3duIHR5cGUKKwkgIE1ha2Ugc3VyZSB0byBhbGxvY2F0ZSBub3Qgb25seSBhIFMxNiBidWZmZXIgZm9yIFMxNiBidXQgYSB0d2ljZSBhcyBiaWcgb25lIHRvCisJICBob2xkIFMzMi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjUxMTYKKworMjAxNi0wNC0xNiAwMjoxNzoyNiArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIFJldmVydCAicHVsc2VzaW5rOiB1bmNvcmsgaWYgbmVlZGVkIHVwb24gY29tbWl0IgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCAwZGQ0NmFjY2Y2ZDI4MmZmMDcwNjU4NTJiZDkxYzg1Yzc4YWYzMzk0LgorCSAgV2l0aCBzb21lIGF1ZGlvc2lua3MsIHN0YXJ0aW5nIHRoZSByaW5nYnVmZmVyIG9uIHRoZSBmaXJzdCBjb21taXQKKwkgIGNhdXNlcyBhdWRpbyBnbGl0Y2hlcyBhdCBzdGFydHVwIGJ5IHN0YXJ0aW5nIHRvIG91dHB1dCBzZWdtZW50cworCSAgZnJvbSB0aGUgcmluZ2J1ZmZlciBiZWZvcmUgaXQgaGFzIGJlZW4gZmlsbGVkIC8gZnVsbHkgcHJlcm9sbGVkLiBUaGlzCisJICBkb2Vzbid0IHVzdWFsbHkgaGFwcGVuIHdpdGggcHVsc2VzaW5rIGJlY2F1c2Ugd2UgbWFwIHRoZSBwdWxzZWF1ZGlvCisJICByaW5nYnVmZmVyIGRpcmVjdGx5LCBidXQgd2Ugc2hvdWxkIGtlZXAgdGhpbmdzIGNvbnNpc3RlbnQgd2l0aAorCSAgb3RoZXIgc2lua3Mgd2l0aCByZWdhcmRzIHRvIHN0YXJ0dXAgbGF0ZW5jeSwgcGx1cyBpdCBnaXZlcyBtb3JlCisJICBoZWFkd2F5IHRvIGF2b2lkIGdsaXRjaGluZywgc2hvdWxkIHRoZSBpbml0aWFsIDJuZCBzZWdtZW50IHRha2UKKwkgIG1vcmUgdGhhbiAxMG1zIHRvIGdlbmVyYXRlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NzA3NgorCisyMDE2LTA0LTE1IDAwOjQ2OjU2IC0wNzAwICBBbGVpeCBDb25jaGlsbG8gRmxhcXXDqSA8YWxlaXhAb2Jsb25nLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogYWRkIHNydHAgcm9sbG92ZXIgY291bnRlcnMgZnJvbSBtaWtleSBjcnlwdG8gc2Vzc2lvbnMKKwkgIFRoZSBzZXJ2ZXIgY2FuIHNlbmQgbXVsdGlwbGUgY3J5cHRvIHNlc3Npb25zLCBvbmUgZm9yIGVhY2ggU1NSQyB3aXRoIGl0cworCSAgb3duIHJvbGxvdmVyIGNvdW50ZXIuIFdlIHBhcnNlIHRoaXMgaW5mb3JtYXRpb24gYW5kIHBhc3MgaXQgdG8gdGhlIFNSVFAKKwkgIGRlY29kZXIgdmlhIHRoZSAicmVxdWVzdC1rZXkiIHNpZ25hbC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzA1NDAKKworMjAxNi0wNC0xNSAxNDozNTowNyArMDAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBGaXggZGVidWcgb3V0cHV0IHdoZW4gcmVzeW5jaW5nCisJICBEb24ndCBvdXRwdXQgdGhlIHBvaW50ZXIgdmFsdWUgb2YgdGhlIHRpbWUoKSBmdW5jdGlvbiBhcyBhIHRpbWVzdGFtcAorCSAgYnkgdXNpbmcgdGhlIGNvcnJlY3QgdmFyaWFibGUuCisJICBGaXhlcyBidWlsZCBvbiBSYXNwYmVycnkgUGkgMy4KKworMjAxNi0wNC0xNSAxMTozNjozNiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJICBzb3VwaHR0cGNsaWVudHNpbms6IElmIG5vIHByb3h5IGlzIHNldCBieSBwcm9wZXJ0aWVzLCB1c2UgdGhlIGRlZmF1bHQgbGlic291cCBwcm94eSByZXNvbHZlcgorCSAgVGhhdCBpcywgdXNlIHdoYXRldmVyIHN5c3RlbSBzZXR0aW5ncyB0aGVyZSBtaWdodCBleGlzdC4gVGhpcyBpcyB0aGUgc2FtZQorCSAgYmVoYXZpb3VyIHdlIHVzZSBpbiB0aGUgSFRUUCBzb3VyY2UuCisKKzIwMTYtMDQtMTQgMTA6MDE6MjggKzAxMDAgIEp1bGllbiBJc29yY2UgPGouaXNvcmNlQHNhbXN1bmcuY29tPgorCisJKiBSRUFETUU6CisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNmYyZDIwOSB0byBhYzJmNjQ3CisKKzIwMTYtMDQtMTMgMTg6NDU6MDcgKzAxMDAgIERhbWlhbiBaaW9icm8gPGRhbWlhbkB4bWVtZW50b2l0LmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmg6CisJICBzcGxpdG11eHNpbms6IEFkZCBtYXhfZmlsZXNfbnVtYmVyIHByb3BlcnR5CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ0NjEyCisKKzIwMTYtMDQtMTMgMTA6NTc6MDMgLTA3MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IGRyb3AgcmVmZXJlbmNlIHRvIHZpZGVvbWl4ZXIgMgorCSAgRml4IGEgc21hbGwgZ3JhbW1hciBtaXN0YWtlIG9uICJvdmVybGF5ZWQiIHdoaWxlIGF0IGl0LgorCisyMDE2LTA0LTEzIDA5OjU3OjE2ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzoKKwkgIHhpbWFnZTogSW5pdGlhbGl6ZSBhbGwgZmllbGRzIGluIHRoZSBtZXRhIGV4cGxpY2l0bHkKKwkgIFRoZSBtZXRhIGlzIG5vdCBhbGxvY2F0ZWQgd2l0aCBhbGwgZmllbGRzIGluaXRpYWxpemVkIHRvIHplcm9lcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjQ5MDIKKworMjAxNi0wNC0xMiAwOTo0MTowMCArMDAwMCAgUGFvbG8gUGV0dGluYXRvIDxwcGV0dGluYUBjaXNjby5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBGb3J3YXJkIHN0aWNreSBldmVudHMgb24gYnVmZmVyIGxpc3RzIHRvbywgbm90IG9ubHkgb24gYnVmZmVycworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDkzMworCisyMDE2LTA0LTEyIDE1OjAxOjI4ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBEcmFpbiB0aGUgZmllbGQgaGlzdG9yeSBpZiB0aGUgY2FwcyBhcmUgY2hhbmdpbmcKKwkgIE90aGVyd2lzZSB3ZSB3aWxsIHVzZSBmaWVsZHMgZnJvbSB0aGUgb2xkIGNhcHMgd2l0aCBldmVyeXRoaW5nIHNldCB1cCBmb3IgdGhlCisJICBuZXcgY2FwcywgY2F1c2luZyBjcmFzaGVzIGFuZCB3b3JzZS4KKwkgIEFsc28gZG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlIHNhbWUgY2FwcyBhcmUgc2V0IHR3aWNlLgorCisyMDE2LTA0LTEyIDE1OjAwOjMxICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBJbnN0ZWFkIG9mIGNvbmZ1c2luZyBjcmFzaGVzIGxhdGVyLCBqdXN0IGVycm9yIG91dCBpbW1lZGlhdGVseSBpZiBtYXBwaW5nIGEgdmlkZW8gZnJhbWUgZmFpbHMKKwkgIFRoaXMgcHJvYmFibHkgc3RpbGwgY3Jhc2hlcyBidXQgYXQgbGVhc3Qgd2UgZ2V0IHNvbWUgaGludCBhYm91dCB3aGF0IGdvZXMKKwkgIHdyb25nIGluc3RlYWQgb2YgcmFuZG9tIGJlaGF2aW91ciBsYXRlci4KKworMjAxNi0wNC0xMiAxMTozODo1MSArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBjaGVjayBzdHJlYW0gaXMgYXZhaWxhYmxlIGluIFBJRkYgcGFyc2VyCisJICBxdGRlbXV4LT5zdHJlYW1zIGlzIGFuIGFycmF5LCBpdCB3aWxsIG5ldmVyIGV2YWx1YXRlIHRvIHRydWUgd2hlbiBjb21wYXJpbmcKKwkgIHRvIE5VTEwuIEluc3RlYWQgd2Ugd2FudCB0byBjaGVjayB0aGUgbnVtYmVyIG9mIHN0cmVhbXMgdG8gbWFrZSBzdXJlIHRoZQorCSAgc3RyZWFtIGlzIGF2YWlsYWJsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM2MTQKKwkgIENJRCAxMzU4Mzg5CisKKzIwMTYtMDQtMTIgMTE6Mzc6MzYgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgUmV2ZXJ0ICJxdGRlbXV4OiByZWR1bmRhbnQgY2hlY2sgaW4gUElGRiBwYXJzZXIiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDQxZTEwNTI0ZjNiYWJkZDkyYWFjOGM4YzlkNWI5Y2RmMTg0YzJkNGUuCisKKzIwMTYtMDQtMTIgMTE6MDU6NTAgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVkdW5kYW50IGNoZWNrIGluIFBJRkYgcGFyc2VyCisJICBxdGRlbXV4LT5zdHJlYW1zIGlzIGFuIGFycmF5IG9mIHNpemUgR1NUX1FUREVNVVhfTUFYX1NUUkVBTVMsIGl0IHdpbGwgbmV2ZXIKKwkgIGV2YWx1YXRlIHRvIHRydWUgd2hlbiBjb21wYXJpbmcgdG8gTlVMTC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM2MTQKKwkgIENJRCAxMzU4Mzg5CisKKzIwMTYtMDQtMTIgMTE6NTY6MDggKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBhdm9pZCBsZWFraW5nIEdWYWx1ZXMKKwkgIHVuc2V0IHRoZSBHVmFsdWUgaWYgd2UgZG9uJ3QgdXNlIGl0IGFueSBtb3JlIHRvIGF2b2lkIGxlYWtzLgorCisyMDE2LTA0LTEyIDEwOjE1OjM5ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogRml4IHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF90c19kaWZmKCkgZmlsbCBsZXZlbCBjYWxjdWxhdGlvbgorCSAgVGhlIGhlYWQgb2YgdGhlIHF1ZXVlIGlzIHRoZSBvbGRlc3QgcGFja2V0IChhcyBpbiBsb3dlc3Qgc2VxbnVtKSwgdGhlIHRhaWwgaXMKKwkgIHRoZSBuZXdlc3QgcGFja2V0LiBUbyBjYWxjdWxhdGUgdGhlIGZpbGwgbGV2ZWwsIHdlIHNob3VsZCBjYWxjdWxhdGUgdGFpbC1oZWFkCisJICB3aGlsZSBjb25zaWRlcmluZyB3cmFwYXJvdW5kcy4gTm90IHRoZSBvdGhlciB3YXkgYXJvdW5kLgorCSAgT3RoZXIgY29kZSBpcyBhbHJlYWR5IGRvaW5nIHRoaXMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY0ODg5CisKKzIwMTYtMDQtMTEgMTA6NDQ6NTYgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSAgcnRwbWFuYWdlcjogSXQncyBHU1RfTElCUywgbm90IEdTVF9MSUJTX0xJQlMKKworMjAxNi0wNC0xMSAwODozMzoxNyArMDkwMCAgU2V1bmdoYSBZYW5nIDxzaC55YW5nQGxnZS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IHBhcnNpbmcgc2VnbWVudCBkdXJhdGlvbiBvZiBlbXB0eSBlZGl0IGxpc3QgYm94CisJICBGb3IgZW1wdHkgZWRpdCBsaXN0LCBzZWdtZW50LWR1cmF0aW9uIGluIGVkaXQgbGlzdCBib3ggc2hvdWxkIG5vdCBiZQorCSAgdXNlZCBmb3Igc2VnbWVudCBldmVudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjQ4NzAKKworMjAxNi0wNC0wOCAxMzowNTo1NyArMDIwMCAgTmljb2xhIE11cmlubyA8bmljb2xhLm11cmlub0BnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBtYWtlIHRpbWVjb2Rlc2NhbGUgY29uZmlndXJhYmxlCisJICBJbiBzb21lIHVzZSBjYXNlcyB0aGUgZGVmYXVsdCB0aW1lY29kZXNjYWxlIHdpbGwgcHJvZHVjZSBibG9ja3Mgd2l0aCB0aGUgc2FtZSB0aW1lc3RhbXAKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjQ3NjkKKworMjAxNi0wNC0wNyAxMzowMTo1MiArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXRlcmJ1ZmZlcjogTW92ZSBhc3NlcnRpb24gdG8gdGhlIHJpZ2h0IGxvY2F0aW9uCisJICBXZSBzaG91bGRuJ3QgaGF2ZSAibGF0ZSIgbG9zdCB0aW1lcnMgYXQgdGhhdCBwb2ludAorCisyMDE2LTAzLTAyIDE0OjI1OjI0ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogU3BlZWQgdXAgbG9zdCB0aW1lb3V0IGhhbmRsaW5nCisJICBXaGVuIGRvd25zdHJlYW0gYmxvY2tzLCAibG9zdCIgdGltZXJzIGFyZSBjcmVhdGVkIHRvIG5vdGlmeSB0aGUKKwkgIG91dGdvaW5nIHRocmVhZCB0aGF0IHBhY2tldHMgYXJlIGxvc3QuCisJICBUaGUgcHJvYmxlbSBpcyB0aGF0IGZvciBoaWdoIHBhY2tldC1yYXRlIHN0cmVhbXMsIHdlIG1pZ2h0IGVuZCB1cCB3aXRoCisJICBhIGJpZyBsaXN0IG9mIGxvc3QgdGltZW91dHMgKGhhZCBhIHVzZS1jYXNlIHdpdGggfjEwMDAuLi4pLgorCSAgVGhlIHByb2JsZW0gaXNuJ3Qgc28gbXVjaCB0aGUgYW1vdW50IG9mIGxvc3QgdGltZW91dHMgdG8gaGFuZGxlLCBidXQKKwkgIHJhdGhlciB0aGUgd2F5IHRoZXkgd2VyZSBoYW5kbGVkLiBBbGwgdGltZXJzIHdvdWxkIGZpcnN0IGJlIGl0ZXJhdGVkLAorCSAgdGhlbiB0aGUgb25lIHNlbGVjdGVkIHdvdWxkIGJlIGhhbmRsZWQgLi4uIHRvIHJlLWl0ZXJhdGUgdGhlIGxpc3QgYWdhaW4uCisJICBBbGwgb2YgdGhpcyBpcyBiZWluZyBkb25lIHdoaWxlIHRoZSBqYnVmIGxvY2sgaXMgdGFrZW4sIHdoaWNoIGluIHNvbWUgdXNlLWNhc2VzCisJICB3b3VsZCByZXR1cm4gaW4gaG9sZGluZyB0aGF0IGxvY2sgZm9yIDEwcy4uLiBibG9ja2luZyBhbnkgYnVmZmVycyBmcm9tCisJICBiZWluZyBhY2NlcHRlZCBpbiBpbnB1dC4uLiB3aGljaCB3b3VsZCB0aGVuIGFycml2ZSBsYXRlIC4uLiB3aGljaCB3b3VsZAorCSAgY3JlYXRlIHBsZW50eSBvZiBsb3N0IHRpbWVycyAuLi4gd2hpY2ggd291bGQgY2F1c2UgdGhlIHNhbWUgaXNzdWUuCisJICBJbiBvcmRlciB0byBhdm9pZCB0aGF0IHNpdHVhdGlvbiwgaGFuZGxlIHRoZSBsb3N0IHRpbWVycyBpbW1lZGlhdGVseSB3aGVuCisJICBpdGVyYXRpbmcgdGhlIGxpc3Qgb2YgcGVuZGluZyB0aW1lcnMuIFRoaXMgbW9kaWZpZXMgdGhlIGNvbXBsZXhpdHkgZnJvbQorCSAgYSBxdWFkcmF0aWMgdG8gYSBsaW5lYXIgY29tcGxleGl0eS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI5ODgKKworMjAxNi0wMy0wMiAxNDoyMzowMSArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IERvbid0IGNyZWF0ZSBsb3N0IGV2ZW50cyBpZiB3ZSBkb24ndCBuZWVkIHRoZW0KKwkgIFdoZW4gImRvLWxvc3QiIGlzIHNldCB0byBGQUxTRSB3ZSBkb24ndCB1c2Uvc2VuZCB0aGUgbG9zdCBldmVudHMuCisJICBJbiB0aGF0IGNhc2UsIGRvbid0IGNyZWF0ZSB0aGVtIHRvIHN0YXJ0IHdpdGggOikKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI5ODgKKworMjAxNi0wMy0wMiAxMzo1NzowNyArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IEFkZCB0cmFjaW5nIG9mIGxvY2sgdXNhZ2UKKwkgIEhlbHBzIHdpdGggZGVidWdnaW5nIGxvY2sgdXNhZ2UKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI5ODgKKworMjAxNi0wMi0xMCAxOTo1Njo1OSArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyZGV2aWNlcHJvdmlkZXIuYzoKKwkgIHY0bDI6IERvbid0IGxlYWsgdjRsMiBvYmplY3RzIGFuZCBwcm9wcyBvbiBwcm9iZSBlcnJvcnMKKworMjAxNi0wNC0wNCAxNzo0MjowMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHRlc3RzOiBhZGQgdW5pdCB0ZXN0IGZvciBqcGVnIGRlcGF5bG9hZGVyIHBhY2tldCBsb3NzIGhhbmRsaW5nCisJICBNYWtlIHN1cmUgaXQgYWx3YXlzIG91dHB1dHMgc29tZXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIHZhbGlkCisJICBKUEVHIGZyYW1lLCBpZS4gc3RhcnRzIHdpdGggYW4gU09JIG1hcmtlciBhbmQgZW5kcyB3aXRoIGFuIEVPSQorCSAgbWFya2VyLgorCisyMDE2LTAzLTE1IDAzOjI1OjI2ICswNTMwICBOaXJiaGVlayBDaGF1aGFuIDxuaXJiaGVla0BjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJICBydHBqcGVnZGVwYXk6IERvbid0IHNlbmQgaW52YWxpZCBmcmFtZXMgZG93bnN0cmVhbSBhZnRlciBwYWNrZXQgbG9zcyBvciBhIERJU0NPTlQKKwkgIEFmdGVyIGNsZWFyaW5nIHRoZSBhZGFwdGVyIGR1ZSB0byBhIERJU0NPTlQsIGFzIG1pZ2h0IGhhcHBlbiB3aGVuIHNvbWUgcGFja2V0KHMpCisJICBoYXZlIGJlZW4gbG9zdCwgdGhlIGRlcGF5bG9hZGVyIHdhcyBwdXNoaW5nIGRhdGEgaW50byB0aGUgYWRhcHRlciAod2hpY2ggaGFkIG5vCisJICBoZWFkZXIgZHVlIHRvIHRoZSBjbGVhciksIGNyZWF0aW5nIGEgaGVhZGVybGVzcyBmcmFtZSBvdXQgb2YgaXQsIGFuZCBzZW5kaW5nIGl0CisJICBkb3duc3RyZWFtLiBUaGUgZG93bnN0cmVhbSBkZWNvZGVyIHdvdWxkIHRoZW4gdXN1YWxseSBpZ25vcmUgaXQ7IHVubGVzcyB0aGVyZQorCSAgd2VyZSBsb3RzIG9mIERJU0NPTlRzIGZyb20gdGhlIGppdHRlcmJ1ZmZlciBpbiB3aGljaCBjYXNlIHRoZSBkZWNvZGVyIHdvdWxkIHJlYWNoCisJICBpdHMgbWF4X2Vycm9ycyBsaW1pdCBhbmQgdGhyb3cgYW4gZWxlbWVudCBlcnJvci4gTm93IHdlIGp1c3QgZGlzY2FyZCB0aGF0IGRhdGEuCisJICBJdCBpcyBwcm9iYWJ5IG5vdCB3b3J0aCB0cnlpbmcgdG8gc2FsdmFnZSB0aGlzIGRhdGEgYmVjYXVzZSBub24tcHJvZ3Jlc3NpdmUKKwkgIGpwZWcgZG9lcyBub3QgZGVncmFkZSBncmFjZWZ1bGx5IGFuZCBtYWtlcyB0aGUgdmlkZW8gdW53YXRjaGFibGUgZXZlbiB3aXRoCisJICBsb3cgcGFja2V0IGxvc3Mgc3VjaCBhcyAzLTUlLgorCisyMDE2LTAxLTA1IDE2OjE1OjE2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRwaml0dGVyYnVmZmVyOiBBZGQgUkZDNzI3MyBtZWRpYSBjbG9jayBoYW5kbGluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjI1OQorCisyMDE1LTA3LTEwIDA5OjQ0OjE1ICswMjAwICBQaGlsaXBwZSBOb3JtYW5kIDxwaGlsbkBpZ2FsaWEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFBJRkYgYm94IGRldGVjdGlvbiBhbmQgcGFyc2luZyBzdXBwb3J0CisJICBUaGUgUElGRiBkYXRhIGlzIHN0b3JlZCBpbiBhIGN1c3RvbSBVVUlEIGJveCB3aGljaCBpcyBwYXJzZWQgYW5kIHRoZQorCSAgY3J5cHRvX2luZm8gb2YgdGhlIGVsZW1lbnQgaXMgdXBkYXRlZCBhY2NvcmRpbmdseS4gVGhpcyBhbGxvd3MKKwkgIGRvd25zdHJlYW0gZGVjcnlwdG9ycyB0byBwcm9jZXNzIGFuZCBkZWNyeXB0IHRoZSBwcm90ZWN0ZWQgY29udGVudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM2MTQKKworMjAxNi0wNC0wMSAxMjoxNTowNSArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOgorCSAgcnRwdm9yYmlzZGVwYXk6IHJlbW92ZSBkZWFkIGNvZGUKKwkgIHBheWxvYWRfYnVmZmVyIGhhc24ndCBiZWVuIGFzc2lnbmVkIGEgdmFsdWUgYmVmb3JlIHRoZSBqdW1wcyB0bworCSAgc3dpdGNoX2ZhaWxlZCBvciBwYWNrZXRfc2hvcnQuIFNvIHRoZSB2YWx1ZSBtdXN0IGJlIE5VTEwuIE5vIG5lZWQKKwkgIHRvIHVubWFwIGFuZCB1bnJlZi4KKwkgIENJRCAjMTMxNjQ3NgorCisyMDE2LTAzLTMxIDE0OjU3OjIwICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgIHJ0cGgyNjNwYXk6IGZpeCBsZWFrCisJICBGcmVlIG1lbW9yeSBvZiBjdXJyZW50IG1hY3JvYmxvY2sgb25jZSBpdCBpc24ndCBuZWVkZWQgc28gaXQgaXNuJ3QgbGVha2VkCisJICBieSB0aGUgY2FsbCBvZiB0aGUgZ3N0X3J0cF9oMjYzX3BheV9CX21iZmluZGVyIGZ1bmN0aW9uLgorCSAgaWYgKCEobWFjID0gZ3N0X3J0cF9oMjYzX3BheV9CX21iZmluZGVyIChjb250ZXh0LCBnb2IsIG1hYywgbWIpKSkgeworCSAgQ0lEIDEyMTIxNTYKKworMjAxNi0wMy0zMSAwMjoxNTowNCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eDogSGFuZGxlIGEgaGFuZyBkcmFpbmluZyBvdXQgYXQgRU9TCisJICBNYWtlIHN1cmUgdGhhdCBhbGwgZGF0YSBpcyBkcmFpbmVkIG91dCB3aGVuIHRoZSByZWZlcmVuY2UgcGFkCisJICBnb2VzIEVPUy4gRml4ZXMgYSBwcm9ibGVtIHdoZXJlIGRhdGEgdGhhdCBhcnJpdmVzIG9uIG90aGVyCisJICBwYWRzIGFmdGVyIHRoZSByZWZlcmVuY2UgcGFkIGZpbmlzaGVzIGNhbiBzdGFsbCBmb3JldmVyIGFuZAorCSAgbmV2ZXIgcGFzcyBFT1MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYzNzExCisKKzIwMTYtMDMtMTggMTU6NDU6MDEgLTA0MDAgIFhhdmllciBDbGFlc3NlbnMgPHhhdmllci5jbGFlc3NlbnNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkgIHNwbGl0bXV4c2luazogRml4IG9jY2FzaW9uYWwgZGVhZGxvY2sgd2hlbiBlbmRpbmcgZmlsZSB3aXRoIHN1YnRpdGxlCisJICBEZWFkbG9jayBvY2N1cnMgd2hlbiBzcGxpdHRpbmcgZmlsZXMgaWYgb25lIHN0cmVhbSByZWNlaXZlZCBubyBidWZmZXIgZHVyaW5nCisJICB0aGUgZmlyc3QgR09QIG9mIHRoZSBuZXh0IGZpbGUuIFRoYXQgY2FuIGhhcHBlbiBpbiB0aGF0IHNjZW5hcmlvIGZvciBleGFtcGxlOgorCSAgMSkgVGhlIGZpcnN0IEdPUCBvZiB2aWRlbyBpcyBjb2xsZWN0ZWQsIGl0IGhhcyBhIGR1cmF0aW9uIG9mIDEwcy4KKwkgIG1heF9pbl9ydW5uaW5nX3RpbWUgaXMgc2V0IHRvIDEwcy4KKwkgIDIpIE90aGVyIHN0cmVhbXMgY2F0Y2h1cCBhbmQgd2UgcmVjZWl2ZSB0aGUgZmlyc3Qgc3VidGl0bGUgYnVmZmVyIGF0IHRzPTAgYW5kCisJICBoYXMgYSBkdXJhdGlvbiBvZiAxbWluLgorCSAgMykgV2UgcmVjZWl2ZSB0aGUgMm5kIHN1YnRpdGxlIGJ1ZmZlciB3aXRoIGEgdHM9MW1pbi4gaW5fcnVubmluZ190aW1lIGlzIHNldCB0bworCSAgMW1pbi4gVGhhdCBidWZmZXIgaXMgYmxvY2tlZCBpbiBoYW5kbGVfbXFfaW5wdXQoKSBiZWNhdXNlCisJICBtYXhfaW5fcnVubmluZ190aW1lIGlzIHN0aWxsIDEwcy4KKwkgIDQpIFNpbmNlIGFsbCBpbl9ydW5uaW5nX3RpbWUgYXJlIG5vdyA+IDEwcywgbWF4X291dF9ydW5uaW5nX3RpbWUgaXMgbm93IHNldCB0bworCSAgMTBzLiBUaGF0IGZpcnN0IEdPUCBnZXRzIHJlY29yZGVkIGludG8gdGhlIGZpbGUuIFRoZSBtdXhlciBwb3AgYnVmZmVycyBvdXQKKwkgIG9mIHRoZSBtcSwgd2hlbiBpdCB0cmllcyB0byBwb3AgYSAybmQgc3VidGl0bGUgYnVmZmVyIGl0IGJsb2NrcyBiZWNhdXNlIHRoZQorCSAgR3N0RGF0YVF1ZXVlIGlzIGVtcHR5LgorCSAgNSkgQSAybmQgR09QIG9mIHZpZGVvIGlzIGNvbGxlY3RlZCBhbmQgaGFzIGEgZHVyYXRpb24gb2YgMTBzIGFzIHdlbGwuCisJICBtYXhfaW5fcnVubmluZ190aW1lIGlzIG5vdyAyMHMuIFNpbmNlIHN1YnRpdGxlJ3MgaW5fcnVubmluZ190aW1lIGlzIGFscmVhZHkKKwkgIDFtaW4sIHRoYXQgR09QIGlzIGFscmVhZHkgY29tcGxldGUuCisJICA2KSBCdXQgbGV0J3Mgc2F5IHdlIG92ZXJyYW4gdGhlIG1heCBmaWxlIHNpemUsIHdlIHRodXMgc2V0IHN0YXRlIHRvCisJICBTUExJVE1VWF9TVEFURV9FTkRJTkdfRklMRSBub3cuIEFzIHNvb24gYXMgYSBidWZmZXIgd2l0aCB0cyA+IDEwcyAoZW5kIG9mCisJICBwcmV2aW91cyBHT1ApIGFycml2ZXMgaW4gaGFuZGxlX21xX291dHB1dCgpLCBFT1MgZXZlbnQgaXMgc2VudCBkb3duc3RyZWFtCisJICBpbnN0ZWFkLiBCdXQgc2luY2UgdGhlIHN1YnRpdGxlIHF1ZXVlIGlzIGVtcHR5LCB0aGF0J3MgbmV2ZXIgZ29pbmcgdG8KKwkgIGhhcHBlbi4gUGlwZWxpbmUgaXMgbm93IGRlYWRsb2NrZWQuCisJICBUbyBmaXggdGhpcyBzaXR1YXRpb24gd2UgaGF2ZSB0bzoKKwkgIC0gU2VuZCBhIGR1bW15IGV2ZW50IHRocm91Z2ggdGhlIHF1ZXVlIHRvIHdha2V1cCBvdXRwdXQgdGhyZWFkLgorCSAgLSBVcGRhdGUgb3V0X3J1bm5pbmdfdGltZSB0byBhdCBsZWFzdCBtYXhfb3V0X3J1bm5pbmdfdGltZSBzbyBpdCBzZW5kcyBFT1MuCisJICAtIFJlc3BlY3QgdGltZSBvcmRlciwgc28gd2Ugc2V0IG91dF9ydW5uaW5nX3RpbT1tYXhfaW5fcnVubmluZ190aW1lIGJlY2F1c2UKKwkgIHRoYXQncyBiaWdnZXIgdGhhbiBwcmV2aW91cyBidWZmZXIgYW5kIHNtYWxsZXIgdGhhbiBuZXh0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MzcxMQorCisyMDE1LTExLTE3IDE4OjE3OjM1ICswMTAwICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogQWRkIG5ldyBzaWduYWwgJ29uLWFwcC1ydGNwJworCSAgU2ltaWxhciB0byB0aGUgJ29uLWZlZWRiYWNrLXJ0Y3AnIHNpZ25hbCwgYnV0IGVtaXR0ZWQgZm9yIFJUQ1AgQVBQCisJICBwYWNrZXRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjIxNworCisyMDE2LTAzLTI0IDE1OjU3OjExICswOTAwICBNaW5qYWUgS2ltIDxuYXRlLmtpbUBsZ2UuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cG1hbmFnZXI6IFNldCB0byBpbml0aWFsIHZhbHVlIGZvciAnbnRwbnMnIGluIGdldF9jdXJyZW50X3RpbWVzKCkKKwkgIEluaXRpYWxpemUgIm50cG5zIiB2YXJpYWJsZSB0byAtMSBhcyB0aGUgT0UgY29tcGlsZXIgZm9yIHNvbWUgcmVhc29uIGRvZXNuJ3QKKwkgIHJlYWxpemUgdGhhdCB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGFsbCBjb2RlIHBhdGhzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDExOQorCisyMDE2LTAxLTMxIDExOjA4OjM4ICsxMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkgIHJ0cGpwZWdwYXk6IEFsbG93IGRpZmZlcmVudCBxdWFudGl6YXRpb24gdGFibGVzIGZvciBjb21wb25lbnRzIDIgYW5kIDMKKwkgIFJGQyAyNDM1IG1lbnRpb25zIGluIHNlY3Rpb24gNC4xIHRoYXQgVS9WIHVzZSB0YWJsZSBudW1iZXIgMSwgYnV0IHRoaXMgc2VlbXMKKwkgIGp1c3QgbGlrZSBhbiBleGFtcGxlLiBTb21lIGVuY29kZXJzIGFyZSBub3QgZm9sbG93aW5nIHRoYXQgYW5kIHRoZXJlIHNlZW1zIHRvCisJICBiZSBubyByZWFzb24gdG8gcmVqZWN0IHRoZWlyIHN0cmVhbXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYxMzQ1CisKKzIwMTYtMDMtMjQgMTk6MjM6MTIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cHhkZWMuYzoKKwkgIHZweGRlYzogVXNlIHRocmVhZHMgb24gbXVsdGktY29yZSBzeXN0ZW1zCisJICBUaGlzIGlzIGEgcmVkbyBvZiBjb21taXQgYjg0OGMxYjZmZmQxZTUwODIyODgyMGEwMTNmOTRmYjQ0NWU0Nzc3Zi4gVGhlCisJICBjb2RlIHdhcyBsb3N0IHdoZW4gdGhlIGVsZW1lbnRzIHdoZXJlIHBvcnRlZCB0byB1c2UgYSBiYXNlY2xhc3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY0MTY5CisKKzIwMTYtMDItMjkgMjM6NDA6MDMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwbGl0bXV4LmM6CisJICBzcGxpdG11eHNpbms6IG9ubHkgdHJ5IHRvIGNyZWF0ZSBpbnRlcm5hbCBzaW5rIGlmIGl0IGRvZXNuJ3QgZXhpc3QKKwkgIFRoaXMgYWxsb3dzIHNwbGl0bXV4c2luayB0byBiZSByZXVzZWQgYWZ0ZXIgYmVpbmcgcHV0IHRvIE5VTEwuCisJICBUZXN0IGluY2x1ZGVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyODkzCisKKzIwMTUtMTAtMDEgMTM6NDE6MjMgKzAyMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQHBhcnJvdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IHByb2JlIGFsbCBjb2xvcnNwYWNlIHN1cHBvcnRlZCBieSBkZXZpY2UKKwkgIEEgZGV2aWNlIGNhbiBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgY29sb3JzcGFjZSBmb3IgYSBnaXZlbiBpbWFnZQorCSAgZGltZW5zaW9uIGFuZCBwaXhlbCBmb3JtYXQuIFNvIHdlIGhhdmUgdG8gcHJvYmUgYWxsIHRoZSBzdXBwb3J0ZWQKKwkgIGNvbG9yc3BhY2UgYW5kIG5vdCBvbmx5IHJlbHkgb24gdGhlIGRlZmF1bHQgb25lLiBPdGhlcndpc2Ugd2UgY291bGQgZW5kCisJICB1cCB3aXRoIG5lZ290aWF0aW9uIGZhaWx1cmUgaWYgdGhlIGNhcHMgY29sb3JpbWV0cnkgZmllbGQgZG9uJ3QgbWF0Y2gKKwkgIHRoZSB2NGwyIGRldmljZSBkZWZhdWx0IG9uZSBldmVuIGlmIHRoZSB2NGwyIGNvdWxkIHN1cHBvcnQgc3VjaAorCSAgY29sb3JpbWV0cnkuCisJICBUaGlzIHBhdGNoIGVuYWJsZSBwcm9iaW5nIGlmIGNvbG9yc3BhY2UgZm9yIGJvdGggY2FwdHVyZSBhbmQgb3V0cHV0CisJICBkZXZpY2UuIEl0IHJlYWxseSBtYWtlcyBzZW5zZSBmb3Igb3V0cHV0IGRldmljZSBzaW5jZSB0aGUgY29sb3JzcGFjZQorCSAgc2hhbGwgYmUgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiBhbmQgYSBsaXR0bGUgbGVzcyBmb3IgY2FwdHVyZSBkZXZpY2UKKwkgIHdoaWNoLCBhdCB0aGUgbW9tZW50LCBzaGFsbCBwcm92aWRlIHRoZSBjb2xvcnNwYWNlOyBpZTogdGhlIHY0bDIKKwkgIHNwZWNpZmljYXRpb24gc2VlbXMgdG8gbm90IHRha2UgaW50byBhY2NvdW50IHRoZSBmYWN0IHRoYXQgYSBjYXB0dXJlCisJICBkZXZpY2UgY291bGQgZG8gY29sb3JzcGFjZSBjb252ZXJzaW9uLgorCSAgQXMgYSBzaWRlIGVmZmV0LCBwcm9iaW5nIHRha2VzIHNvbWUgdGltZXMgYW5kIHNvIHNsaWd0aGx5IGRlbGF5IHY0bDIKKwkgIGluaXRpYWxpemF0aW9uLiBOb3RlIHRoYXQgdGhpcyBwYXRjaCBvbmx5IHByb2JlIGNvbG9yc3BhY2UgYW5kIG5vdCBhbGwKKwkgIGNvbG9yc3BhY2UsIG1hdHJpeCwgdHJhbnNmZXIgYW5kIHJhbmdlIGNvbWJpbmF0aW9uIHRvIGF2b2lkIHRha2luZyB0b28KKwkgIG11Y2ggdGltZSwgZXNwZWNpYWxseSB3aXRoIGxvdy1zcGVlZCBkZXZpY2VzIGFzIGZ1bGwgcHJvYmluZyBkbyAxNzgyCisJICBpb2N0bC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTU5MzcKKworMjAxNi0wMy0yNCAxNjoyMTo1NiArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2ZGVtdXguYzoKKwkgIGNoZWNrOiBGaXggaW5kZW50YXRpb24KKworMjAxNi0wMy0yNCAxNjoyMDozOSArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2ZGVtdXguYzoKKwkgIHRlc3RzOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcworCisyMDE2LTAzLTE2IDIwOjI2OjE2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgIGRlaW50ZXJsZWF2ZTogUmV0dXJuIHRoZSBjdXJyZW50IGNhcHMgb24gdGhlIHNyY3BhZHMgb24gY2FwcyBxdWVyaWVzCisJICBJdCdzIG5vdCBsaWtlIHdlIGNvdWxkIGFjY2VwdCBhbnkgb3RoZXIgY2FwcyBoZXJlLiBUaGUgY2FwcyBhcmUgZGVjaWRlZCBieSB0aGUKKwkgIHVwc3RyZWFtIGNhcHMgZXZlbnQuCisJICBBbHNvIGtlZXAgdGhlIGZpbHRlciBvcmRlciBpbnRhY3Qgd2hlbiBmaWx0ZXJpbmcgdGhlIHJlc3VsdHMgYWdhaW5zdCB0aGUKKwkgIGZpbHRlciBjYXBzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MzMyNgorCisyMDE2LTAzLTI0IDE1OjE0OjIzICswOTAwICBKaW1teSBPaG4gPHlvbmdqaW4ub2huQGxnZS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IHF0ZGVtdXggbWVtb3J5IGxlYWsgaW4gc3JjX2NvbnZlcnQgZnVuY3Rpb24KKwkgIElmIHdlIGRvbid0IGZpbmQgdGhlIGluZGV4IG9mIHRoZSBzYW1wbGUgY29ycmVjdGx5IGluIHNyY19jb252ZXJ0IGZ1bmN0aW9uLAorCSAgd2UgaGF2ZSB0byB1bnJlZiBhYm91dCB0aGUgcXRkZW11eCBiZWZvcmUgcmV0dXJuaW5nIHZhbHVlLgorCSAgU28sIEkgaGF2ZSBtb2RpZnkgaXQgYWJvdXQgaW5zdGVhZCBwYXNzIHF0ZGVtdXggYXMgYSBwYXJhbWV0ZXIgaW50bworCSAgc3JjX2NvbnZlcnQgZnVuY3Rpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYzOTczCisKKzIwMTYtMDMtMjIgMTM6MTU6MjAgKzA5MDAgIEppbW15IE9obiA8eW9uZ2ppbi5vaG5AbGdlLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBBZGQgY2hlY2sgY29uZGl0aW9uIGZvciBmYWlsIGNhc2UgaW4gZ2V0X2R1cmF0aW9uIGZ1bmN0aW9uCisJICBDdXJyZW50bHksIGdldF9kdXJhdGlvbiBmdW5jdGlvbiBhbHdheXMgcmV0dXJuIHRoZSBUUlVFIGV2ZW4gdGhvdWdoCisJICBpdCBjYW4ndCBiZSBzZXQgZHVyYXRpb24gY29ycmVjdGx5LiBTbywgd2UgbmVlZCB0byBhZGQgdGhlIGVsc2UgY29uZGl0aW9uCisJICBhYm91dCB0aGUgZmFpbCBjYXNlLiBBbHNvLCB3ZSBhbHJlYWR5IHNldCB0aGUgR1NUX0NMT0NLX1RJTUVfTk9ORQorCSAgaW4gdGhpcyBmdW5jdGlvbi4gU28gSSBoYXZlIG1vZGlmeSBpdCB3aGljaCBpcyByZWxhdGVkIGNvZGUgaW4gc29tZQorCSAgZnVuY3Rpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYzOTY4CisKKzIwMTYtMDMtMjEgMTA6MTE6MjMgKzA5MDAgIEppbW15IE9obiA8eW9uZ2ppbi5vaG5AbGdlLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBNb2RpZnkgZGF0YSB0eXBlIG9mIGR1cmF0aW9uIGluIGhhbmRsZV9zcmNfcXVlcnkgZnVuY3Rpb24KKwkgIERhdGEgdHlwZSBvZiBkdXJhdGlvbiBuZWVkIHRvIG1vZGlmeSBmcm9tIGd1aW50NjQgdG8gR3N0Q2xvY2tUaW1lCisJICBmb3IgY29uc2lzdGVuY3kgaW4gaGFuZGxlX3NyY19xdWVyeSBmdW5jdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjM5NjUKKworMjAxNi0wMy0xOCAxNDo0MDo1OCArMDIwMCAgVml2aWEgTmlrb2xhaWRvdSA8dml2aWFAYWhpcnUuZXU+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogQWRkZWQgdW5pdCB0ZXN0cyBmb3IgZmllbGQ9YXV0bworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2Mzg2OQorCisyMDE2LTAzLTE3IDIxOjIxOjAyICswMjAwICBWaXZpYSBOaWtvbGFpZG91IDx2aXZpYUB0b29sc29uYWlyLmNvbT4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuaDoKKwkgIGRlaW50ZXJsYWNlOiBBZGRlZCAiYXV0byIgZmllbGRzIG1vZGUKKwkgIFRoZSAiYXV0byIgZmllbGRzIG1vZGUgd2lsbCBkZXRlY3QgdGhlIHVwc3RyZWFtIGFuZCBkb3duc3RyZWFtIGZyYW1lcmF0ZXMgYW5kCisJICB3aWxsIGRlY2lkZSB0byBkZWludGVybGFjZSBhbGwgb3Igb25seSB0b3AgZmllbGRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2Mzg2OQorCisyMDE2LTAzLTE2IDIwOjE3OjU1ICswMTAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkBnbWFpbC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogZG9uJ3QgZW1pdCBwYWQtYWRkZWQgdW50aWwgY2FwcyBhcmUgcmVhZHkKKwkgIEluIG90aGVyIHdvcmRzLCBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgc2hvdWxkIG5ldmVyIHJldHVybiBOVUxMCisJICBpbiBhIHBhZC1hZGRlZCBjYWxsYmFjayBmcm9tIHRoZSBkZW11eGVyLgorCSAgQWRkZWQgdGVzdHMgZm9yIHRoZSB0d28gc3BlY2lhbCBjYXNlcyB3aXRoIEFBQyBhbmQgSC4yNjQgd2hlcmUgdGhpcworCSAgd291bGQgaGFwcGVuIGV2ZXJ5IHRpbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYzNzgwCisKKzIwMTYtMDMtMDQgMTA6MzA6MTIgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkqIGV4dC9jYWlyby9nc3RjYWlyb292ZXJsYXkuYzoKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZmRlYy5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvanBlZy9nc3RzbW9rZWRlYy5jOgorCSogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzoKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkqIGV4dC90YWdsaWIvZ3N0YXBldjJtdXguY2M6CisJKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnB4L2dzdHZwOWRlYy5jOgorCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHNiY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmM6CisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSogZ3N0L2RlYnVndXRpbHMvYnJlYWtteWRhdGEuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2NwdXJlcG9ydC5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0Y2Fwc2RlYnVnLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2c2Vlay5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0cHVzaGZpbGVzcmMuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHRhZ2luamVjdC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Rlc3RwbHVnaW4uYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0b3AuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJKiBnc3QvZWZmZWN0di9nc3RyYWRpb2FjLmM6CisJKiBnc3QvZWZmZWN0di9nc3RyZXYuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJpcHBsZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c3RyZWFrLmM6CisJKiBnc3QvZWZmZWN0di9nc3R2ZXJ0aWdvLmM6CisJKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzoKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaXNvbXA0L2dzdHJ0cHhxdGRlcGF5LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL3dlYm0tbXV4LmM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c3JjLmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmdhbmFseXNpcy5jOgorCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmdsaW1pdGVyLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ3ZvbHVtZS5jOgorCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cEwyNGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cEwyNHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhYzNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYxcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGtsdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGtsdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBvcHVzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3RyZWFtZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3RyZWFtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cDlkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cDlwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHF1ZXVlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlYWxwaGEuYzoKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9tZWRpYW4uYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6CisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuYzoKKwkqIHN5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXNpbmsuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdXRvZGV0ZWN0LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgZ29vZDogdXNlIG5ldyBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSgpCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYzMDc2CisKKzIwMTYtMDMtMDQgMDk6NDI6NDQgKzAxMDAgIERhdmlkIEJ1Y2htYW5uIDxkYXZpZC5idWNobWFubkBnbWFpbC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2Zsdm11eC5jOgorCSAgZmx2bXV4OiBUZXN0IHRvIHZlcmlmeSBmbHZtdXggaGFuZGxlcyBEVFMgd2l0aCBHU1RfQ0xPQ0tfVElNRSBOT05FCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMjA3CisKKzIwMTUtMTEtMDQgMTQ6NTE6MTkgKzA5MDAgIEppaGFlIFlpIDxqaWhhZS55aUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYXZvaWQgcG90ZW50aWFsbHkgb3ZlcmZsb3dpbmcgZXhwcmVzc2lvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NzU2OQorCisyMDE2LTAzLTIyIDEwOjQzOjQ1ICswOTAwICBKaW1teSBPaG4gPHlvbmdqaW4ub2huQGxnZS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWRkIHRoZSBmdW5jdGlvbiB0byBnZXQgY2hhbm5lbHMgYW5kIHNhbXBsZSByYXRlIGZvciBBQUMKKwkgIEFkZCBhYWNfZ2V0X2NoYW5uZWxzIGFuZCBzYW1wbGVfcmF0ZSBmdW5jdGlvbiB0byBnZXQgdGhlc2UgdmFsdWUgZm9yCisJICBBQUMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ5MTEwCisKKzIwMTYtMDMtMjQgMTM6MzM6MDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQKKworPT09IHJlbGVhc2UgMS44LjAgPT09CisKKzIwMTYtMDMtMjQgMTI6Mjc6MzMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjguMAorCisyMDE2LTAzLTI0IDEyOjAyOjU5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDE2LTAzLTE2IDIwOjE4OjQxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgIGRlaW50ZXJsZWF2ZTogVXNlIEdzdEl0ZXJhdG9yIGZvciBpdGVyYXRpbmcgYWxsIHBhZHMgaW5zdGVhZCBvZiBtYW51YWxseSBpdGVyYXRpbmcgdGhlbSB3aGlsZSBob2xkaW5nIHRoZSBvYmplY3QgbG9jayBhbGwgdGhlIHRpbWUKKwkgIERvaW5nIHF1ZXJpZXMgd2hpbGUgaG9sZGluZyB0aGUgb2JqZWN0IGxvY2sgaXMgYSBiaXQgZGFuZ2Vyb3VzLCBhbmQgaW4gdGhpcworCSAgY2FzZSBjYXVzZXMgZGVhZGxvY2tzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MzMyNgorCisyMDE2LTAzLTE3IDIwOjUzOjI3ICswMjAwICBWaXZpYSBOaWtvbGFpZG91IDx2aXZpYUB0b29sc29uYWlyLmNvbT4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogRml4IHR5cG8gdG8gbm90IGNoYW5nZSB0aGUgaW5wdXQgY2FwcyBidXQgb3VyIGZpbHRlcmVkIGNhcHMKKwkgIENoYW5naW5nIHRoZSBpbnB1dCBjYXBzIGFuZCBub3QgdXNpbmcgdGhlbSBhbnltb3JlIGFmdGVyd2FyZHMgaXMgdXNlbGVzcywgYW5kCisJICBpdCBicmVha3MgbmVnb3RpYXRpb24gaW4gcGlwZWxpbmVzIGxpa2U6CisJICBnc3QtbGF1bmNoLTEuMCB2aWRlb3Rlc3RzcmMgISAidmlkZW8veC1yYXcsZnJhbWVyYXRlPTI1LzEsaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiICEKKwkgIGRlaW50ZXJsYWNlIGZpZWxkcz1hbGwgISAidmlkZW8veC1yYXcsZnJhbWVyYXRlPTUwLzEsaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUiICEKKwkgIGZha2VzaW5rCisKKz09PSByZWxlYXNlIDEuNy45MSA9PT0KKworMjAxNi0wMy0xNSAxMjowNDozOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdnB4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDEuNy45MQorCisyMDE2LTAzLTE1IDExOjUzOjM3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTYtMDMtMTUgMTE6NDE6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2h1LnBvOgorCSogcG8vc3IucG86CisJICBwbzogVXBkYXRlIHRyYW5zbGF0aW9ucworCisyMDE2LTAzLTE1IDAzOjI2OjE0ICswNTMwICBOaXJiaGVlayBDaGF1aGFuIDxuaXJiaGVla0BjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBtYW5hZ2VyOiBTb21lIGNvbW1lbnQgYW5kIGRvY3VtZW50YXRpb24gY2xhcmlmaWNhdGlvbnMvZml4ZXMKKworMjAxNi0wMy0xMyAxMDozMzoxMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIFJldmVydCAiZmxhY3BhcnNlOiBwdXNoIHRhZ3MgaW4gcHJlX3B1c2hfZnJhbWUiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDQwNjVmY2I4MGE0OTkyNGI3MGYwYzhmYzE1OWRlYzBmZjQ3OTQzYTEuCisJICBmbGFjcGFyc2Ugc2hvdWxkIG5vdCBwdXNoIHRhZ3MgYnkgaXRzZWxmLCB0aGUgYmFzZSBjbGFzcyBpcyBnb2luZyB0byBkbyB0aGF0CisJICB3aGlsZSBwcm9wZXJseSBtZXJnaW5nIGluIHVwc3RyZWFtIHRhZ3MuIEl0IGp1c3QgZGlkbid0IGJlY2F1c2Ugb2YgYSBidWcgaW4KKwkgIHRoZSBiYXNlIGNsYXNzLCB3aGljaCB3YXMgaGlkZGVuIGJ5IHRoaXMgY29tbWl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MzU1MworCisyMDE2LTAyLTI1IDA1OjE3OjUxICswNTMwICBOaXJiaGVlayBDaGF1aGFuIDxuaXJiaGVla0BjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZGJvb2xodWZmLmM6CisJKiBnc3QvcnRwL2Rib29saHVmZi5oOgorCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuYzoKKwkgIHdpbjMyOiBEb24ndCB1c2UgX19hdHRyaWJ1dGVfXyBvbiBNU1ZDCisJICBVc2UgTVNWQy1lcXVpdmFsZW50cyBmb3IgYWxpZ25tZW50IGFuZCBwYWNraW5nIGNvbXBpbGVyIGRpcmVjdGl2ZXMgd2hlbiBidWlsZGluZworCSAgb24gTVNWQworCisyMDE2LTAyLTI1IDA1OjE2OjQyICswNTMwICBOaXJiaGVlayBDaGF1aGFuIDxuaXJiaGVla0BjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkgIHdpbjMyOiBEb24ndCB0cnkgdG8gaW5jbHVkZSB4bWF0aC5oIG9uIG5ld2VyIFZpc3VhbCBTdHVkaW8KKworMjAxNi0wMi0yNSAwNToxNjowOSArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYzoKKwkgIGdzdCBGYWN0b3Igb3V0IGVuZGlhbi1vcmRlciBSR0IgZm9ybWF0cworCSAgTVNWQyBzZWVtcyB0byBpZ25vcmUgcHJlcHJvY2Vzc29yIGNvbmRpdGlvbmFscyBpbnNpZGUgc3RhdGljIHBhZAorCSAgdGVtcGxhdGUgbWFjcm9zLgorCisyMDE2LTAzLTA4IDE3OjM3OjE3ICswMTAwICBUaG9tYXMgUm9vcyA8dGhvbWFzLnJvb3NAaW5kdXN0cm9uaWMuZGU+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmN0c291bmRzaW5rOiBTZXR0aW5nIHZvbHVtZSBzaG91bGQgbm90IHVubXV0ZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NTEwNgorCisyMDE2LTAzLTA4IDEzOjU3OjI0ICswMTAwICBUaG9tYXMgUm9vcyA8dGhvbWFzLnJvb3NAaW5kdXN0cm9uaWMuZGU+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmN0c291bmRzaW5rOiBGaXggdm9sdW1lIHJlc2V0IG9uIHVubXV0ZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NTEwNgorCisyMDE2LTAzLTA4IDEzOjAzOjU1ICswMTAwICBBbGJhbiBCZWRlbCA8YWxiYW4uYmVkZWxAYXZpb25pYy1kZXNpZ24uZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IGZpeCBjYXB0dXJlIHdpdGggYmF5ZXIgZm9ybWF0cyBvdGhlciB0aGFuIGJnZ3IKKwkgIGdzdF92NGwyX29iamVjdF9nZXRfY2Fwc19pbmZvKCkgYWx3YXlzIHJldHVybiBWNEwyX1BJWF9GTVRfU0JHR1I4CisJICBmb3IgYWxsIGJheWVyIGZvcm1hdHMuIFRoaXMgaXMgb2J2aW91c2x5IGJyb2tlbiBpZiB0aGUgZGV2aWNlIHVzZQorCSAgYW5vdGhlciBvcmRlcmluZy4gRml4IHRoaXMgYnkgcHJvcGVybHkgcmVhZGluZyB0aGUgZm9ybWF0IHBhcmFtZXRlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjMzMTgKKworMjAxNi0wMy0wNyAxMDoyODowNiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJlc2V0IHBlbmRpbmcgc2VnbWVudCBpZiB3ZSBhcmUgYWxyZWFkeSBwdXNoaW5nIG9uZQorCSAgV2hlbiB1cHN0cmVhbSBpcyBydW5uaW5nIGluIGJ5dGVzIGluIHB1c2gtbW9kZSwgcXRkZW11eCB3aWxsCisJICBjb252ZXJ0IHNlZWtzIGZyb20gdGltZSB0byBieXRlcyBhbmQgc2VuZCBpdCB1cHN0cmVhbS4gVXBzdHJlYW0KKwkgIGVsZW1lbnQgd2lsbCBwZXJmb3JtIGEgYnl0ZSBzZWVrIGFuZCBzZW5kIGEgYnl0ZSBzZWdtZW50IHRvIHF0ZGVtdXgKKwkgIHRoYXQgd2lsbCBjb252ZXJ0IGl0IHRvIHRpbWUgYW5kIHB1c2ggaXQgZG93bnN0cmVhbS4KKwkgIFRoZXJlIGlzLCBob3dldmVyLCB0aGUgcGVuZGluZ19zZWdtZW50IHZhcmlhYmxlIHRoYXQgc3RvcmVzIGEgbmV3CisJICBzZWdtZW50IGV2ZW50IHRvIGJlIHB1c2hlZCBiZWZvcmUgdGhlIG5leHQgZGF0YS4gV2hlbiBoYW5kbGluZyBzZWVrcworCSAgYXMgbWVudGlvbmVkIGFib3ZlIHRoaXMgdmFyaWFibGUgd2FzIGJlaW5nIGlnbm9yZWQgYW5kLCBpZiBpdCBjb250YWluZWQKKwkgIHNvbWUgc2VnbWVudCBldmVudCwgaXQgd291bGQgb3ZlcnJpZGUgdGhlIG9uZSByZXN1bHRpbmcgZnJvbSB0aGUgc2Vlay4KKwkgIFRoaXMgd291bGQgcmVzdG9yZSBhIHByZXZpb3VzIHNlZ21lbnQgYW5kIHdvdWxkIGNhdXNlIHRoZSBzZWVrIHNlZ21lbnQKKwkgIHRvIGJlIGRpc2NhcmRlZCBkb3duc3RyZWFtLgorCSAgVGhpcyBwYXRjaCBmaXhlcyB0aGlzIGlzc3VlIGJ5IHVucmVmaW5nIGFueSBwZW5kaW5nIHNlZ21lbnQgYXMgdGhlCisJICBzZWVrIGZyb20gdXBzdHJlYW0gc2hvdWxkIGNvbnRhaW4gdGhlIGxhdGVzdCBvbmUgdGhhdCBzaG91bGQgYmUKKwkgIHVzZWQsIGFzIHJlcXVlc3RlZCBieSB0aGUgYXBwbGljYXRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYzMTY1CisKKzIwMTYtMDMtMDcgMTA6Mjc6NDEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBydW4gZ3N0LWluZGVudAorCSAgT3RoZXJ3aXNlIGNvbW1pdHMgd2lsbCBmYWlsIHdpdGggb3VyIGluZGVudCBjaGVjayBob29rCisKKzIwMTYtMDMtMDQgMTU6MDk6NDUgKzAxMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogZml4IGNvbG9yaW1ldHJ5IGZvciBOVjEyCisJICBSZXBsaWNhdGUgVjRMMl9NQVBfUVVBTlRJWkFUSU9OX0RFRkFVTFQgbWFjcm8gYmVoYXZpb3IuCisJICBBdCAjdjRsIGl0IHdhcyBkZXNjcmliZWQgdGhhdCBkb2N1bWVudGF0aW9uIG1pZ2h0IGJlIHdyb25nIGFuZCB0aGF0CisJICB3ZSBzaG91bGQgdHJ1c3QgdGhpcyBtYWNybyBpbnN0ZWFkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjUyOQorCisyMDE2LTAzLTA0IDE0OjA3OjE5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBGaXggbXVsdGljYXN0IGdyb3VwIGpvaW5pbmcgd2l0aCBwcm92aWRlZCBzb2NrZXRzIG9uIFdpbmRvd3MKKwkgIE9uIFdpbmRvd3MgdGhlIHNvY2tldCB3aWxsIGJlIGJvdW5kIHRvIEFOWSBpbnN0ZWFkIG9mIHRoZSBtdWx0aWNhc3QgZ3JvdXAsCisJICBhcyBiaW5kaW5nIHRvIGEgbXVsdGljYXN0IGdyb3VwIGRvZXMgbm90IHdvcmsuIFdoaWNoIHdvdWxkIG1lYW4gdGhhdCB3ZQorCSAgb3ZlcnJpZGUgc3JjLT5hZGRyIHRvIGJlY29tZSBBTlkgYW5kIHdvbid0IGF1dG9tYXRpY2FsbHkgam9pbiBhIG11bHRpY2FzdAorCSAgZ3JvdXAgYW55bW9yZSBvbiBXaW5kb3dzLgorCSAgT24gTGludXggd2Ugd291bGQgYXV0b21hdGljYWxseSBqb2luIGEgbXVsdGljYXN0IGdyb3VwLCBrZWVwIGl0IGNvbnNpc3RlbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYzMDkzCisKKzIwMTYtMDMtMDIgMTM6MTM6MjQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgUmV2ZXJ0ICJydHBqaXR0ZXJidWZmZXI6IGRvbid0IGZvcmdldCB0byB1bmxvY2sgbXV0ZXggaW4gZXJyb3IgY29kZSBwYXRoIGluIHR3byBjYXNlcyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgYTdmYjdiNTM1OTJkODdmNzk4MzU0NGRlYmI3NGQzNjRmYzMyNTdhZC4KKwkgIFRoZSBtdXRleCBpcyB0YWtlbiBieSB0aGUgY2FsbGVyLCB3ZSBzaG91bGQga2VlcCBpdCBsb2NrZWQgd2hlbiByZXR1cm5pbmcgc28KKwkgIHRoZSBjYWxsZXIgY2FuIHVubG9jayBpdCBhZ2Fpbi4KKworMjAxNi0wMy0wMSAxNTowMToyMiArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogcHVzaCB0YWdzIGluIHByZV9wdXNoX2ZyYW1lCisJICBQdXNoIGEgdGFnIGV2ZW50IGJlZm9yZSBwcmUtcm9sbCBpZiB3ZSBoYXZlIHRhZ3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyNjYwCisKKz09PSByZWxlYXNlIDEuNy45MCA9PT0KKworMjAxNi0wMy0wMSAxODoxNTo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS43LjkwCisKKzIwMTYtMDMtMDEgMTc6MDM6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNi0wMy0wMSAxNjo1MzoyNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYmcucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZnIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTYtMDMtMDEgMTQ6MTQ6MDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBkb24ndCBmb3JnZXQgdG8gdW5sb2NrIG11dGV4IGluIGVycm9yIGNvZGUgcGF0aCBpbiB0d28gY2FzZXMKKworMjAxNi0wMi0yOSAxMDoxMDoyNCArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYS1kZW11eDogcmVtb3ZlIGltcG9zc2libGUgY29uZGl0aW9uCisJICBJdCBpcyBpbXBvc3NpYmxlIGZvciBhIGd1aW50IHRvIGhhdmUgYSBuZWdhdGl2ZSB2YWx1ZSwgbm8gbmVlZCB0byBjaGVjayBmb3IKKwkgIHRoaXMuIEludHJvZHVjZWQgaW4gY29tbWl0IDY4NjFkMTFjNDllYTBmMzBkMjQzMmNmNGViZjYxMDhiYzg5ODk3ZjEKKwkgIENJRCAxMzU0NTA5CisKKzIwMTYtMDItMjggMTA6MTI6MzYgKzAxMDAgIFBldHIgVmlrdG9yaW4gPGVuY3Vrb3VAZ21haWwuY29tPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgIGFscGhhOiBGaXggc2FtcGxlIHBpcGVsaW5lCisJICBVc2UgdGhlIHpvcmRlciBwYWQgcHJvcGVydHkgdG8gbWFrZSBzdXJlIHRoZSBzZW1pdHJhbnNwYXJlbnQKKwkgIHZpZGVvIGlzIG9uIHRvcCBvZiB0aGUgYmFja2dyb3VuZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI4MDkKKworMjAxNi0wMi0yOCAxMzo0MjoyOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3Jndm9sdW1lLmM6CisJICByZ3ZvbHVtZTogbWFrZSB0YWcgbGlzdCB3cml0YWJsZSBiZWZvcmUgbW9kaWZ5aW5nIGl0CisJICBNYWtpbmcgdGhlIGV2ZW50IGl0c2VsZiB3cml0YWJsZSBpcyBub3QgZW5vdWdoLCBpdCB3b24ndCBtYWtlCisJICB0aGUgYWN0dWFsIHRhZ2xpc3QgaW4gdGhlIGV2ZW50IHdyaXRhYmxlIGFzIHdlbGwuIEluc3RlYWQsIGp1c3QKKwkgIG1ha2UgYSBjb3B5IG9mIHRoZSB0YWdsaXN0IGFuZCB0aGVuIGNyZWF0ZSBhIG5ldyB0YWcgZXZlbnQgZnJvbQorCSAgdGhhdCBpZiByZXF1aXJlZCwgcmVwbGFjaW5nIHRoZSBvbGQgb25lLiBCZWZvcmUgd2Ugd291bGQKKwkgIGluYWR2ZXJ0ZW50bHkgbW9kaWZ5IHRhZ2xpc3RzIHVwc3RyZWFtIGVsZW1lbnRzIG1pZ2h0IHN0aWxsCisJICBiZSBob2xkaW5nIG9uIHRvLiBBZGQgdW5pdCB0ZXN0IGZvciB0aGlzIGFzIHdlbGwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyNzkzCisKKzIwMTYtMDItMjggMTM6MDE6MzQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IFByb3Blcmx5IGVycm9yIG91dCBpZiBiaW5kaW5nIHRoZSBVRFAgc29ja2V0cyBmYWlscworCSAgdWRwc3JjIGlzIG5vdCByZXR1cm5pbmcgdXMgYSBzb2NrZXQgaW4gdGhhdCBjYXNlLgorCisyMDE2LTAyLTI3IDIwOjMzOjMyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJICBnb29tOiBVc2UgZ29vbV9zZXRfcmVzb2x1dGlvbigpIGluc3RlYWQgb2YgcmVjcmVhdGluZyB0aGUgZ29vbSBpbnN0YW5jZSB3aGVuIHRoZSByZXNvbHV0aW9uIGNoYW5nZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI3NjUKKworMjAxNi0wMi0yNyAyMDozMjo0NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSAgUmV2ZXJ0ICJnb29tOiBJbml0aWFsaXplIHRoZSBnb29tIHN0cnVjdCBvbmx5IG9uY2Ugd2Uga25vdyB3aWR0aC9oZWlnaHQgYW5kIHJlY3JlYXRlIGl0IGlmIHRob3NlIGNoYW5nZSIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgY2M2ZTEwMjY0M2MxYmFlOTI4MzE2ZGNhOWYzNGRiMDI4ZmI5YTY3ZS4KKworMjAxNi0wMi0yNyAyMDozMToxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSAgZ29vbTogSW5pdGlhbGl6ZSB0aGUgZ29vbSBzdHJ1Y3Qgb25seSBvbmNlIHdlIGtub3cgd2lkdGgvaGVpZ2h0IGFuZCByZWNyZWF0ZSBpdCBpZiB0aG9zZSBjaGFuZ2UKKwkgIEZpeGVzIGNyYXNoIHdoZW4gdGhlIHdpZHRoIGFuZC9vciBoZWlnaHQgaXMgY2hhbmdpbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyNzY1CisKKzIwMTYtMDItMjYgMTI6NDE6MDcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBiNjRmMDNmIHRvIDZmMmQyMDkKKworMjAxNi0wMi0yNSAyMjo1NDoxOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJICBkb2NzOiBhZGQgcnRwb3B1c2RlcGF5IGFuZCBydHBvcHVzcGF5IHRvIGRvY3VtZW50YXRpb24KKworMjAxNi0wMi0xNyAxNToxNToxMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cG9wdXNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBvcHVzZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBvcHVzcGF5Lmg6CisJICBydHA6IG9wdXM6IG1vdmUgT3B1cyBSVFAgcGF5bG9hZGVyL2RlcGF5bG9hZGVyIGZyb20gLWJhZCB0byAtZ29vZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NjI4MgorCisyMDE2LTAyLTE3IDE1OjEwOjAwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJICBNZXJnZSBicmFuY2ggJ3BsdWdpbi1tb3ZlLXJ0cC1vcHVzJworCSAgTW92ZSBPcHVzIFJUUCBkZXBheWxvYWRlci9wYXlsb2FkZXIgZnJvbSAtYmFkIHRvIC1nb29kLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NjI4MgorCisyMDE2LTAyLTI1IDExOjMzOjEzICswMTAwICBQaGlsaXBwZSBOb3JtYW5kIDxwaGlsbkBpZ2FsaWEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGNlbmMgYXV4IGluZm8gcGFyc2luZyBmcm9tIG1kYXQgc3VwcG9ydCBpbiBQVUxMIG1vZGUKKwkgIFRoaXMgaXMgYWxyZWFkeSBzdXBwb3J0ZWQgZm9yIFBVU0ggbW9kZSBidXQgd2FzIGZhaWxpbmcgaW4gUFVMTCBtb2RlLgorCSAgVGhlIGF1eCBpbmZvIGlzIHNvbWV0aW1lcyBzdG9yZWQgaW4gdGhlIG1kYXQgYmVmb3JlIHRoZSBmaXJzdCBzYW1wbGUsCisJICBzbyB0aGUgbG9vcCB0YXNrIG5lZWRzIHRvIHB1bGwgZGF0YSBzdG9yZWQgYXQgdGhhdCBsb2NhdGlvbiBhbmQKKwkgIHBlcmZvcm0gdGhlIGF1eCBpbmZvIGNlbmMgcGFyc2luZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjE3MDAKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI1MTYKKworMjAxNi0wMi0yNCAxMToyODowOSArMDEwMCAgUGhpbGlwcGUgTm9ybWFuZCA8cGhpbG5AaWdhbGlhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwcmV2ZW50IGJ1ZmZlciBmbG93IGlmIGFueSBzdHJlYW0gZmFpbGVkIHRvIGJlIGV4cG9zZWQKKwkgIEluIHNvbWUgY2FzZXMgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9uIGNhbiBmYWlsLCBmb3IgaW5zdGFuY2UgaWYgdGhlCisJICBzdHJlYW0gaXMgcHJvdGVjdGVkIGFuZCBubyBkZWNyeXB0b3Igd2FzIGZvdW5kLiBGb3IgdGhvc2Ugc2l0dWF0aW9ucworCSAgdGhlIGRlbXV4ZXIgc2hvdWxkbid0IGVtaXQgYW55IGRhdGEgb24gdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIHBhZCBvZgorCSAgdGhlIHN0cmVhbSBhbmQgYmFpbCBvdXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyNTE2CisKKzIwMTYtMDItMjQgMDk6MTI6MDMgKzAxMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBoaWxuQGlnYWxpYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZG9uJ3QgcHVzaCBlbmNyeXB0ZWQgYnVmZmVyIHdpdGhvdXQgY2VuYyBtZXRhZGF0YQorCSAgV2hlbiB0aGUgY2VuYyBtZXRhZGF0YSBpcyBzdG9yZWQgb3V0c2lkZSBvZiB0aGUgbW9vZiBib3ggYW5kIHRoZQorCSAgc3RyZWFtIGlzIGV4cG9zZWQgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgY2VuYyBtZXRhZGF0YSBoYXNuJ3QgYmVlbgorCSAgcHJvY2Vzc2VkIHlldCB3aGlsZSB0aGUgZmlyc3QgYnVmZmVyIGlzIGJlaW5nIHB1c2hlZC4gV2hlbiB0aGlzCisJICBoYXBwZW5zIHRoZSBidWZmZXIgY2FuJ3QgcG9zc2libHkgYmUgZGVjcnlwdGVkIGRvd25zdHJlYW0gc28gZG9uJ3QKKwkgIHB1c2ggaXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyNTE2CisKKzIwMTUtMTAtMjEgMTY6MjE6NDUgKzAyMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBoaWxuQGlnYWxpYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVhZCBzYWlvIGF1eF9pbmZvX3R5cGUgYXMgYSBGT1VSQ0MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTY4OTcKKworMjAxNi0wMi0yMyAxODoyNzo0NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZkZWMuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJICBnc3Q6IEhhbmRsZSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMoKSByZXR1cm5pbmcgTlVMTCBncmFjZWZ1bGx5CisKKzIwMTYtMDItMjMgMTg6MTI6NTQgKzAyMDAgIERhdmUgQ3JhaWcgPGRjcmFpZ0BicmlnaHRzaWduLmJpej4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYzoKKwkgIHJ0cGgyNjVkZXBheTogRG9uJ3QgYXNzdW1lIHRoYXQgZ2V0X2N1cnJlbnRfY2FwcygpIHJldHVybnMgbm9uLU5VTEwgY2FwcyBhZnRlciBoYXNfY3VycmVudF9jYXBzKCkKKwkgIFJlbW92ZSBjYWxscyB0byBnc3RfcGFkX2hhc19jdXJyZW50X2NhcHMoKSB3aGljaCB0aGVuIGdvIG9uIHRvIGNhbGwKKwkgIGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcygpIGFzIHRoZSBjYXBzIGNhbiBnbyB0byBOVUxMIGluIGJldHdlZW4uIEluc3RlYWQganVzdAorCSAgdXNlIGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcygpIGFuZCBjaGVjayBmb3IgTlVMTC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTk1MzkKKworMjAxNS0xMi0xNiAxMjo0MDozOSArMDAwMCAgRGF2ZSBDcmFpZyA8ZGNyYWlnQGJyaWdodHNpZ24uYml6PgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmM6CisJICBnc3Q6IERvbid0IGFzc3VtZSB0aGF0IGdldF9jdXJyZW50X2NhcHMoKSByZXR1cm5zIG5vbi1OVUxMIGNhcHMgYWZ0ZXIgaGFzX2N1cnJlbnRfY2FwcygpCisJICBSZW1vdmUgY2FsbHMgdG8gZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzKCkgd2hpY2ggdGhlbiBnbyBvbiB0byBjYWxsCisJICBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMoKSBhcyB0aGUgY2FwcyBjYW4gZ28gdG8gTlVMTCBpbiBiZXR3ZWVuLiBJbnN0ZWFkIGp1c3QKKwkgIHVzZSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMoKSBhbmQgY2hlY2sgZm9yIE5VTEwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU5NTM5CisKKzIwMTUtMTItMTYgMTA6NTQ6MTcgKzAwMDAgIERhdmUgQ3JhaWcgPGRjcmFpZ0BicmlnaHRzaWduLmJpej4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IEhhbmRsZSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMoKSByZXR1cm5pbmcgTlVMTCBncmFjZWZ1bGx5CisJICBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgcGlwZWxpbmUgaXMgY3VycmVudGx5IHNodXR0aW5nIGRvd24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU5NTM5CisKKzIwMTYtMDItMjMgMTU6NTc6MTggKzAxMDAgIExpbnVzIFN2ZW5zc29uIDxsaW51c3NuQGF4aXMuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thLWRlbXV4OiBEb24ndCBoYW5kbGUgc2VlayB1bnRpbCByZWFkeQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjU0MgorCisyMDE2LTAyLTIzIDE1OjU1OjEzICswMTAwICBMaW51cyBTdmVuc3NvbiA8bGludXNzbkBheGlzLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYS1kZW11eDogVW5yZWYgc2VlayBldmVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjU0MgorCisyMDE2LTAyLTIyIDExOjAxOjQwICswMTAwICBBdXLDqWxpZW4gWmFuZWxsaSA8YXVyZWxpZW4uemFuZWxsaUBwYXJyb3QuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIG11bHRpZmlsZXNpbms6IGNsb3NlIGZpbGUgb24gd3JpdGUgZXJyb3Igd2l0aCBuZXh0LWZpbGUgbW9kZSBpcyBzZXQgdG8gYnVmZmVyCisJICBJZiB3ZSBoYXZlIGFuIGVycm9yIGR1cmluZyBmd3JpdGUgY2FsbCwgZmlsZSBzdGF5cyBvcGVuIGFuZCB0aHVzIG5leHQKKwkgIGluY29taW5nIGJ1ZmZlciB3aWxsIHRyaWdnZXIgYW4gYXNzZXJ0IHdoZW4gdHJ5aW5nIHRvIG9wZW5pbmcgYSBuZXcKKwkgIGZpbGUuCisJICBUaGlzIGhhcHBlbnMgaWYgd2UgZG8gbm90IHJlc3RhcnQgZWxlbWVudCwgZmlsZSBpcyBjbG9zZWQgYXQgc3RvcCwgYW5kCisJICBpZiBhcHBsaWNhdGlvbiBoYW5kbGVzIHRoZSByZXR1cm5lZCBHU1RfRkxPV19FUlJPUiB0byBrZWVwIGJpbiBhbGl2ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjI0MzQKKworMjAxNi0wMi0xOSAyMzo0NDo0MiArMDEwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGRvbid0IG91dHB1dCBlbXB0eSB0YWdzL3RhZyBlbGVtZW50cworCSAgU3VjaCBmaWxlcyB3aWxsIG5vdCBwbGF5IG9uIEFuZHJvaWQsIGJlY2F1c2Ugb2YgYnVnIGluIGxpYndlYm0gbWF0cm9za2EgcGFyc2luZywgd2hpY2ggaXMgc3RpbGwgcHJlc2VudCBpbiA2LjAuMQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjM0OQorCisyMDE2LTAyLTA0IDE1OjU5OjA0ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYS1kZW11eDogbWFrZSB1cCBhbiBPcHVzSGVhZCBibG9jayBpZiBwb3NzaWJsZSB3aGVuIG1pc3NpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjE0ODkKKworMjAxNi0wMi0wNCAxMDo0MzoxNSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thLW11eDogbWFrZSB1cCBhbiBPcHVzSGVhZCBibG9jayBpZiBwb3NzaWJsZSB3aGVuIG1pc3NpbmcKKwkgIFRoaXMgYmxvY2sgaXMgbmVlZGVkIGluIHRoZSBNYXRyb3NrYSBmaWxlLCBidXQgZGF0YSBjb21pbmcgZnJvbQorCSAgUlRQIG1heSBub3QgaGF2ZSBvbmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYxNDg5CisKKzIwMTYtMDItMjIgMTM6NTM6MjEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBtYWtlIHN0cmVhbS1pZCBtb3JlIHJlYWRhYmxlIGFuZCBvcmRlci1mcmllbmRseQorCSAgLi4uIGFzIHN0cmVhbXMgYXJlIHNvIG9yZGVyZWQgYnkgaWQgYnkgZS5nLiBkZWNvZGViaW4KKwkgIChhbmQgYXMgdHlwaWNhbGx5IGFscmVhZHkgaG9ub3VyZWQgYnkgb3RoZXIgZGVtdXhlcnMpLgorCisyMDE2LTAyLTIyIDEzOjI1OjUxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thOiByZW1vdmUgY29uZnVzaW5nIGR1cGxpY2F0ZSB0cmFjayB1aWQgZmllbGQKKworMjAxNi0wMi0yMiAxNDowMzowMiArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cDlwYXkuYzoKKwkgIHJ0cHZwOXBheTogYWRkIG1pc3NpbmcgYnJlYWsKKwkgIFZQOV9QQVlfUElDVFVSRV9JRF83QklUUyBhbmQgVlA5X1BBWV9QSUNUVVJFX0lEXzE1QklUUyBhcmUgbXV0dWFsbHkKKwkgIGV4Y2x1c2l2ZSBvcHRpb25zIG9mIHRoZSBwaWN0dXJlLWlkLW1vZGUuIFdlIGNhbiBicmVhayBhZnRlciB0aGUKKwkgIGZpcnN0IGNhc2UuCisJICAxIG9yIDIgYnl0ZXMgbmVlZCB0byBiZSBhZGRlZCB0byB0aGUgaGVhZGVyIGxlbmd0aCBkZXBlbmRpbmcgb24gdGhlCisJICBQaWN0dXJlSUQgc2l6ZS4KKwkgIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC11YmVydGktcGF5bG9hZC12cDktMDAjc2VjdGlvbi00LjIKKwkgIENJRCAxMzUzNDc5CisKKzIwMTYtMDItMjIgMDk6MDk6MDEgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBGaXggYnVmZmVyIG1lbW9yeSBsZWFrCisJICBidWZmZXIgYmVpbmcgbWFwcGVkIGlzIG5vdCBiZWluZyB1bm1hcHBlZCBpbiBzb21lIGNhc2VzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyNDIwCisKKzIwMTUtMTEtMDQgMTA6MTk6MDMgKzAxMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cG1hbmFnZXI6IERvbid0IHdhcm4gZm9yIGR1cGxpY2F0ZS9yZW9yZGVyZWQgcGFja2V0cworCSAgVGhpcyBpcyBhIG5vcm1hbCBzY2VuYXJpbyBhbmQgc2hvdWxkIG5vdCBiZSBhIHdhcm5pbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMjA4CisKKzIwMTYtMDItMjEgMDk6NDc6NDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hbHBoYS9hbHBoYS52Y3Byb2o6CisJKiBnc3QvYXVwYXJzZS9hdXBhcnNlLnZjcHJvajoKKwkqIGdzdC9hdmkvYXZpLnZjcHJvajoKKwkqIGdzdC9jdXR0ZXIvY3V0dGVyLnZjcHJvajoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2RlYnVnLnZjcHJvajoKKwkqIGdzdC9kZWJ1Z3V0aWxzL25hdmlnYXRpb250ZXN0LnZjcHJvajoKKwkqIGdzdC9lZmZlY3R2L2VmZmVjdHYudmNwcm9qOgorCSogZ3N0L2ZseC9mbHhkZWMudmNwcm9qOgorCSogZ3N0L2dvb20vZ29vbS52Y3Byb2o6CisJKiBnc3QvZ29vbTJrMS9nb29tLnZjcHJvajoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUudmNwcm9qOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LnZjcHJvajoKKwkqIGdzdC9sYXcvYWxhdy52Y3Byb2o6CisJKiBnc3QvbGF3L211bGF3LnZjcHJvajoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS52Y3Byb2o6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydC52Y3Byb2o6CisJKiBnc3QvcnRwL3J0cC52Y3Byb2o6CisJKiBnc3Qvc21wdGUvc21wdGUudmNwcm9qOgorCSogZ3N0L3NwZWN0cnVtL3NwZWN0cnVtLnZjcHJvajoKKwkqIGdzdC91ZHAvdWRwLnZjcHJvajoKKwkqIGdzdC92aWRlb2JveC92aWRlb2JveC52Y3Byb2o6CisJKiBnc3QvdmlkZW9jcm9wL3ZpZGVvY3JvcC52Y3Byb2o6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ2FtbWEudmNwcm9qOgorCSogZ3N0L3ZpZGVvZmlsdGVyL3ZpZGVvYmFsYW5jZS52Y3Byb2o6CisJKiBnc3QvdmlkZW9maWx0ZXIvdmlkZW9maWx0ZXIudmNwcm9qOgorCSogZ3N0L3ZpZGVvZmlsdGVyL3ZpZGVvZmxpcC52Y3Byb2o6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLnZjcHJvajoKKwkqIGdzdC93YXZlbmMvd2F2ZW5jLnZjcHJvajoKKwkqIGdzdC93YXZwYXJzZS93YXZwYXJzZS52Y3Byb2o6CisJKiBnc3QveTRtL3k0bWVuYy52Y3Byb2o6CisJKiB3aW4zMi9NQU5JRkVTVDoKKwkqIHdpbjMyL3ZzNi9hdXRvZ2VuLmRzcDoKKwkqIHdpbjMyL3ZzNi9nc3RfcGx1Z2luc19nb29kLmRzdzoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhbGF3LmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhbHBoYS5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0YWxwaGFjb2xvci5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0YXBldGFnLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhdWRpb2Z4LmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhdXBhcnNlLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhdXRvZGV0ZWN0LmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhdmkuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdGN1dHRlci5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0ZGlyZWN0c291bmQuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdGVmZmVjdHYuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdGZseC5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0Z29vbS5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0aWN5ZGVtdXguZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdGlkM2RlbXV4LmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RpbnRlcmxlYXZlLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RqcGVnLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RsZXZlbC5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0bWF0cm9za2EuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdG1lZGlhbi5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0bW9ub3Njb3BlLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RtdWxhdy5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0bXVsdGlwYXJ0LmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RwbmcuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdHF0ZGVtdXguZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdHJ0cC5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0cnRzcC5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0c21wdGUuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdHNwZWV4LmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3R1ZHAuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdHZpZGVvYmFsYW5jZS5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0dmlkZW9ib3guZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdHZpZGVvY3JvcC5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0dmlkZW9mbGlwLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3R2aWRlb21peGVyLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3R3YXZlZm9ybS5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0d2F2ZW5jLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3R3YXZwYXJzZS5kc3A6CisJKiB3aW4zMi92czcvbGliZ3N0ZGlyZWN0c291bmQudmNwcm9qOgorCSogd2luMzIvdnM4L2dzdC1wbHVnaW5zLWdvb2Quc2xuOgorCSogd2luMzIvdnM4L2xpYmdzdDEzOTQudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdGFhc2luay52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0YWxhdy52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0YWxwaGEudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdGFscGhhY29sb3IudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdGFubm9kZXgudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdGFwZXRhZy52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0YXVkaW9meC52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0YXVwYXJzZS52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0YXV0b2RldGVjdC52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0YXZpLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3RjYWNhc2luay52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0Y2Rpby52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0Y3V0dGVyLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3RkaXJlY3Rzb3VuZC52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0ZHYudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdGVmZmVjdHYudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdGZsYWMudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdGZseGRlYy52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0Z29vbS52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0aWN5ZGVtdXgudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdGlkM2RlbXV4LnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3RqcGVnLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3RsYWRzcGEudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdGxldmVsLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3RtYXRyb3NrYS52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0bW5nLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3Rtb25vc2NvcGUudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdG11bGF3LnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3RtdWx0aXBhcnQudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdHBuZy52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0cnRwLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3RydHNwLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3RzaG91dDIudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdHNtcHRlLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3RzcGVleC52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0dGFnbGliLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3R1ZHAudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdHZpZGVvYmFsYW5jZS52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0dmlkZW9ib3gudmNwcm9qOgorCSogd2luMzIvdnM4L2xpYmdzdHZpZGVvZmxpcC52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0dmlkZW9taXhlci52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0d2F2ZW5jLnZjcHJvajoKKwkqIHdpbjMyL3ZzOC9saWJnc3R3YXZwYXJzZS52Y3Byb2o6CisJICB3aW4zMjogcmVtb3ZlIG91dGRhdGVkIGJ1aWxkIGNydWZ0CisJICBUaGlzIGhhc24ndCBiZWVuIHRvdWNoZWQgZm9yIGdlbmVyYXRpb25zLCBkb2Vzbid0IHdvcmssCisJICBhbmQgaXMganVzdCBjYXVzaW5nIGNvbmZ1c2lvbi4gV2UgYWxzbyBkb24ndCB3YW50IHRvCisJICBtYWludGFpbiB0aGVzZSBmaWxlcyBtYW51YWxseS4KKworMjAxNi0wMi0yMCAxMTo1MTo1NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGRvbid0IHVzZSB1bmRlY2xhcmVkIGNvcmUgZGVidWcgY2F0ZWdvcnkgc3ltYm9scworCisyMDE2LTAyLTA2IDE0OjM5OjA1ICswMTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHdvcmthcm91bmQgZm9yIGZpbGVzIHdpdGggd3JvbmcgY29sb3JfdGFibGVfaWQgdmFsdWUKKwkgIEluc3RlYWQgb2YgZXJyb3Jpbmcgb3V0LCBqdXN0IHVzZSB0aGUgZGVmYXVsdCBjb2xvciB0YWJsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjE2MzcKKworMjAxNi0wMi0xOSAxNTowMjowNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA5ZGVwYXkuYzoKKwkgIGZsdm11eCwgcnRwdnA5ZGVwYXk6IGZpeCBpbmRlbnRhdGlvbgorCisyMDE2LTAyLTE5IDE1OjAzOjA0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJzcmM6IGZpeCBpbmRlbnRhdGlvbgorCisyMDE1LTEyLTA0IDAwOjQ2OjM0ICsxMTAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkBnbWFpbC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IHBsdWcgbGVhayhzKSBpbiBlcnJvci1zY2VuYXJpbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjIxMAorCisyMDE1LTEyLTA0IDAwOjQ2OjEyICsxMTAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkBnbWFpbC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBmaXggZW9zIGV2ZW50IGxlYWsKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjIyMDkKKworMjAxNi0wMi0xOSAxNDo0MTowNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2ZGVtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2Zsdm11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaDI2My5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICB0ZXN0czogZml4IGluZGVudGF0aW9uCisKKzIwMTYtMDItMTggMTY6MDk6MjkgKzAxMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQGdtYWlsLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICB0ZXN0czogcnRwaml0dGVyYnVmZmVyOiBwb3J0IHRlc3RoYXJuZXNzIHRvIEdzdEhhcm5lc3MgYW5kIGNsZWFudXAvaW1wcm92ZQorCSAgUHJvYmFibHkgZm91bmQgYSBidWcgYXMgd2VsbCwgaW4gdGhhdCB0aGVyZSBhcmUgc29tZSB0aW1lc3RhbXBzIGluCisJICB0aGVyZSB0aGF0IGFyZSBsb29raW5nIHZlcnkgd3JvbmcuIChtYXJrZWQgd2l0aCBGSVhNRSkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjIyNjcKKworMjAxNi0wMi0xOCAxMDoyNzoxOSArMDEwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHRlc3RzOiBydHBqaXR0ZXJidWZmZXI6IHRlc3QgY2xlYW51cHMvaW1wcm92ZW1lbnRzCisJICBVc2UgZmFpbF91bmxlc3MgYW5kIGZyaWVuZHMgaW5zdGVhZCBvZiBnX2Fzc2VydAorCSAgRmFjdG9yIHNlcS1udW0gY2hlY2tpbmcgb3V0IHRvIHNlcGFyYXRlIGZ1bmN0aW9uCisJICBDaGVjayBtb3JlIHJldHVybi12YWx1ZXMgZnJvbSBwdXNoIGFuZCBjcmFuayBhbmQgb3RoZXJzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMjU0CisKKzIwMTUtMTItMDMgMTE6MDc6MDUgKzAxMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHRlc3RzOiBydHBqaXR0ZXJidWZmZXI6IGZpeCBsZWFrcyBpbiB1bml0IHRlc3QKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjIyMTQKKworMjAxNi0wMi0xOSAxMjozODoyOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjcuMiA9PT0KKworMjAxNi0wMi0xOSAxMTo0OTo1NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFsczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS43LjIKKworMjAxNi0wMi0xOSAxMDozMTo0OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTYtMDItMTggMTg6MzM6MTMgKzAxMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBoaWxuQGlnYWxpYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcGx1ZyBsZWFrcyBpbiBjZW5jIGF1eCBpbmZvIHBhcnNpbmcKKworMjAxNi0wMi0xOCAxMzo0MzowNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICB0ZXN0czogZml4IHNwdXJpb3VzIHNvdXBodHRwc3JjIHRlc3QgdGltb3V0cworCSAgU2V0IEdTRVRUSU5HU19CQUNLRU5EPW1lbW9yeSwgYXBwYXJlbnRseSB0aGVyZSdzIHNvbWV0aGluZworCSAgYWJvdXQgZm9yaygpIGFuZCB0aGUgZGNvbmYgYmFja2VuZCAob3Igd2hhdGV2ZXIgZWxzZSB0aGF0CisJICBkcmFncyBpbiBvciBhY3RpdmF0ZXMpIHRoYXQgbWVzc2VzIHVwIGxvY2tpbmcgYW5kIGNhdXNlcworCSAgdGltZW91dHMgZHVlIHRvIGRlYWRsb2NrcyBpbiBnX211dGV4X2xvY2soKSwgc2luY2UKKwkgIGV2ZXJ5dGhpbmcgd29ya3MgZmluZSB3aXRoIENLX0ZPUks9bm8gYXMgd2VsbC4KKworMjAxNi0wMi0xOCAxMToxMDoxNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBVbm1hcCB3YXZwYWNrIGhlYWRlciBidWZmZXIgYWZ0ZXIgY3JlYXRpbmcgaXQKKwkgIE90aGVyd2lzZSBpdCB3aWxsIGJlIG1hcHBlZCB3cml0YWJsZSBhbGwgdGhlIHRpbWUgYW5kIHdlIGNhbid0IHJlYWQgZnJvbSBpdAorCSAgYW55d2hlcmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMjM5CisKKzIwMTUtMTItMDggMTg6NDk6NDAgKzAxMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogQWRkIHRlc3QgZm9yIGJpZyBzZXFudW0gZ2FwIGhhbmRsaW5nCisJICBNYWtlIHN1cmUgdGhhdCB0aGUgcGFja2V0cyBxdWV1ZWQgd2hlbiBkZXRlY3RpbmcgYSBiaWcgZ2FwIGFyZSBwdXNoZWQKKwkgIGFmdGVyIHJlc2V0ICg1IGNvbnNlY3RpdmUgc2VxbnVtcykgYW5kIG5vdCBkcm9wcGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjIxMQorCisyMDE2LTAyLTE3IDE1OjAzOjEzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHV0aWxzLmg6CisJICBydHA6IHNwcmlua2xlIHNvbWUgR19HTlVDX0lOVEVSTkFMIGZvciBpbnRlcm5hbCB1dGlscyBmdW5jdGlvbnMKKworMjAxNi0wMi0wOSAxMzoxNzowMCArMDAwMCAgQWxleCBBc2hsZXkgPGJ1Z3ppbGxhQGFzaGxleS1mYW1pbHkubmV0PgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IG9ubHkgdHJhbnNmb3JtIHByb3RlY3RlZCBjYXBzIG9uY2UKKwkgIENvbW1pdCA3ODczYmVkZTMxMzRiMTVlNTA2NmU4ZDE0ZTU0ZDFmNTA1NGQyMDYzCisJICAoaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MDc3NCkgY2hhbmdlZCB0aGUKKwkgIGJlaGF2aW91ciBvZiBxdGRlbXV4IHRvIGNhbGwgZ3N0X3F0ZGVtdXhfY29uZmlndXJlX3N0cmVhbSgpIGZvcgorCSAgZXZlcnkgbmV3IG1vb2YuCisJICBXaGVuIHBsYXlpbmcgYSBwcm90ZWN0ZWQgc3RyZWFtLCBnc3RfcXRkZW11eF9jb25maWd1cmVfc3RyZWFtKCkKKwkgIGNhbGxzIGdzdF9xdGRlbXV4X2NvbmZpZ3VyZV9wcm90ZWN0ZWRfY2FwcygpLiBUaGUKKwkgIGdzdF9xdGRlbXV4X2NvbmZpZ3VyZV9wcm90ZWN0ZWRfY2FwcygpIGZ1bmN0aW9uIHRha2VzIHRoZSBvcmlnaW5hbAorCSAgbWVkaWEgZm9ybWF0LCBwdXRzIHRoaXMgaW4gYSBmaWVsZCBjYWxsZWQgIm9yaWdpbmFsLW1lZGlhLXR5cGUiCisJICBhbmQgdGhlbiBjaGFuZ2VzIHRoZSBjYXBzIHRvICJhcHBsaWNhdGlvbi94LWNlbmMiLgorCSAgVGhlIGdzdF9xdGRlbXV4X2NvbmZpZ3VyZV9wcm90ZWN0ZWRfY2FwcygpIGRpZCBub3QgaGFuZGxlIHRoZSBjYXNlCisJICBvZiBiZWluZyBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIGNhdXNpbmcgaXQgdG8gaW5jb3JyZWN0bHkgc2V0IHRoZQorCSAgY2Fwcy4gVGhlIHNlY29uZCBjYWxsIHdhcyBjYXVzaW5nIHRoZSBjYXBzIHRvIGJlIHNldCB0bzoKKwkgIGFwcGxpY2F0aW9uL3gtY2VuYywgb3JpZ2luYWwtbWVkaWEtdHlwZSJhcHBsaWNhdGlvbi94LWNlbmMiCisJICBUaGlzIGNvbW1pdCBtYWtlcyBnc3RfcXRkZW11eF9jb25maWd1cmVfcHJvdGVjdGVkX2NhcHMoKSBjaGVjayB0aGF0CisJICB0aGUgY2FwcyBoYXZlIGFscmVhZHkgYmVlbiB0cmFuc2Zvcm1lZCwgc28gdGhhdCBpdCBvbmx5IGdldHMKKwkgIGNoYW5nZWQgb25jZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjE3NjkKKworMjAxNS0xMS0wMyAxNDo1MDo1MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBvcHVzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSAgb3B1czogQWRkIHByb3BlciBzdXBwb3J0IGZvciBtdWx0aWNoYW5uZWwgYXVkaW8KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTcxNTIKKworMjAxNS0wNi0zMCAxMzo1MTozMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBvcHVzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSAgb3B1czogQ29weSBtZXRhZGF0YSBpbiB0aGUgKGRlKXBheWxvYWRlciwgYnV0IG9ubHkgdGhlIHJlbGV2YW50IG9uZXMKKwkgIFRoZSBwYXlsb2FkZXIgZGlkbid0IGNvcHkgYW55dGhpbmcgc28gZmFyLCB0aGUgZGVwYXlsb2FkZXIgY29waWVkIGV2ZXJ5CisJICBwb3NzaWJsZSBtZXRhLiBMZXQncyBtYWtlIGl0IGNvbnNpc3RlbnQgYW5kIGp1c3QgY29weSBhbGwgbWV0YXMgd2l0aG91dCB0YWdzIG9yCisJICB3aXRoIG9ubHkgdGhlIGF1ZGlvIHRhZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTE3NzQKKworMjAxNS0wNS0wNCAxMToyMzoxNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBvcHVzZGVwYXkuYzoKKwkgIG9wdXNkZXBheTogU2V0IG11bHRpc3RyZWFtPUZBTFNFIG9uIHRoZSBPcHVzIGNhcHMKKwkgIFRoZSBSVFAgT3B1cyBtYXBwaW5nIG9ubHkgYWxsb3dzIG1vbm8vc3RlcmVvLCBhbmQgbm90IG11bHRpc3RyZWFtIE9wdXMKKwkgIHN0cmVhbXMuCisKKzIwMTUtMDMtMjQgMTM6NTc6NTQgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSAgcnRwb3B1c3BheTogRm9yd2FyZCBzdGVyZW8gcHJlZmVyZW5jZXMgZnJvbSBjYXBzIHVwc3RyZWFtCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ2NjE3CisKKzIwMTUtMDMtMjQgMTM6NTY6MjEgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSAgcnRwb3B1c3BheTogU2V0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdG8gMiBhcyBwZXIgUkZDIGRyYWZ0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ2NjE3CisKKzIwMTUtMDMtMjMgMTI6MjQ6NTUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG9wdXNwYXkuYzoKKwkgIG9wdXM6IEhhbmRsZSBzcHJvcC1zdGVyZW8gYW5kIHNwcm9wLW1heGNhcHR1cmVyYXRlIFJUUCBjYXBzIGZpZWxkcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjYxNworCisyMDE1LTAyLTE5IDE0OjMwOjEwICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmM6CisJICBydHBvcHVzcGF5OiBkZWZhdWx0IGVuY29kaW5nIG5hbWUgdG8gT1BVUworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNzgxMAorCisyMDE1LTAyLTE5IDE0OjA1OjA2ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmM6CisJICBydHBvcHVzcGF5OiBtYWtlIGNhcHMgd3JpdGFibGUgYmVmb3JlIHRydW5jYXRpbmcgdGhlbQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNzgxMAorCisyMDE1LTAyLTA1IDEwOjI3OjUxICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmM6CisJICBydHBvcHVzcGF5OiBuZWdvdGlhdGUgdGhlIGVuY29kaW5nIG5hbWUKKwkgIENocm9tZSB1c2VzIGEgZGlmZmVyZW50IGVuY29kaW5nIG5hbWUgdGhhdCBnc3RyZWFtZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3ODEwCisKKzIwMTQtMTEtMDEgMTA6MTA6MjcgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG9wdXNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmM6CisJICBydHBvcHVzOiBVc2UgT1BVUyBlbmNvZGluZyBuYW1lCisJICBCb3RoIEZpcmVmb3ggYW5kIENocm9tZSB1c2VzIE9QVVMgYXMgdGhlIGVuY29kaW5nIGluIHRoZWlyIFNEUC4KKwkgIEFkZGluZyB0aGlzIG5vdyBkZWZhY3RvIHN0YW5kYXJkIG5hbWUgcmVtb3ZlIHRoZSBuZWVkIGZvciBzcGVjaWFsCisJICBjYXNlIGluIFNEUCBwYXJzaW5nIGNvZGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3ODEwCisKKzIwMTMtMDEtMzEgMTI6MzA6NDkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSAgb3B1c3BheTogZml4IHRpbWVzdGFtcHMKKwkgIENvcHkgdGltZXN0YW1wcyB0byBwYXlsb2FkZWQgYnVmZmVyLgorCSAgQXZvaWQgaW5wdXQgYnVmZmVyIG1lbW9yeSBsZWFrLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MjkyOQorCisyMDEyLTExLTAzIDIwOjM4OjAwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvcnRwL2dzdHJ0cG9wdXNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBvcHVzZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBvcHVzcGF5Lmg6CisJICBGaXggRlNGIGFkZHJlc3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc1MjAKKworMjAxMi0xMC0yMiAxMjowODo0MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmM6CisJICBvcHVzcGF5OiByZW1vdmUgcG9pbnRsZXNzIGNhcHMgc2VyaWFsaXphdGlvbgorCSAgUmVtb3ZlIHRoZSBjYXBzIHNlcmlhbGl6YXRpb24gaW4gdGhlIHJ0cCBjYXBzLiB0aGUgc3BlYyBub3IgdGhlIHJlY2VpdmVyCisJICBkb2VzIGFueXRoaW5nIHdpdGggaXQuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg2NTQ3CisKKzIwMTItMTAtMTcgMTc6MzQ6MjYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG9wdXNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmM6CisJICBVc2UgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSgpCisJICB3aGVyZSBwb3NzaWJsZS4gQXZvaWRzIHNvbWUgc3RyaW5nIGNvcGllcy4gQWxzbyByZS1pbmRlbnQKKwkgIHNvbWUgc3R1ZmYuIEFsc28gc29tZSBpbmRlbnQgZml4ZXMgaGVyZSBhbmQgdGhlcmUuCisKKzIwMTItMDktMjAgMTg6NDE6MjQgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSAgcnRwb3B1c3BheTogQWxsb2NhdGUgdGhlIHJ0cCBidWZmZXIgY29ycmVjdGx5CisJICBVc2UgdGhlIHJpZ2h0IGZ1bmN0aW9ucyB0byBhbGxvY2F0ZSB0aGUgcnRwIGJ1ZmZlcgorCisyMDEyLTA5LTE0IDE3OjA4OjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBvcHVzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSAgcmVwbGFjZSBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUgd2l0aCBnc3RfZWxlbWVudF9jbGFzc19zZXRfbWV0YWRhdGEKKworMjAxMi0wMy0wNyAxNzoxNDoyOSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5jOgorCSAgb3B1czogcG9ydCB0byB1cGRhdGVkIDAuMTEKKworMjAxMS0xMi0zMCAxMTo0MToxNyArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG9wdXNkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG9wdXNwYXkuaDoKKwkgIE1lcmdlIHJlbW90ZS10cmFja2luZyBicmFuY2ggJ29yaWdpbi9tYXN0ZXInIGludG8gMC4xMS1wcmVtZXJnZQorCSAgQ29uZmxpY3RzOgorCSAgZG9jcy9saWJzL01ha2VmaWxlLmFtCisJICBleHQva2F0ZS9nc3RrYXRldGlnZXIuYworCSAgZXh0L29wdXMvZ3N0b3B1c2RlYy5jCisJICBleHQveHZpZC9nc3R4dmlkZW5jLmMKKwkgIGdzdC1saWJzL2dzdC9iYXNlY2FtZXJhYmluc3JjL01ha2VmaWxlLmFtCisJICBnc3QtbGlicy9nc3QvYmFzZWNhbWVyYWJpbnNyYy9nc3RiYXNlY2FtZXJhc3JjLmMKKwkgIGdzdC1saWJzL2dzdC9iYXNlY2FtZXJhYmluc3JjL2dzdGJhc2VjYW1lcmFzcmMuaAorCSAgZ3N0LWxpYnMvZ3N0L3ZpZGVvL2dzdGJhc2V2aWRlb2NvZGVjLmMKKwkgIGdzdC1saWJzL2dzdC92aWRlby9nc3RiYXNldmlkZW9jb2RlYy5oCisJICBnc3QtbGlicy9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvZGVjb2Rlci5jCisJICBnc3QtbGlicy9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvZW5jb2Rlci5jCisJICBnc3QvYXNmbXV4L2dzdGFzZm11eC5jCisJICBnc3QvYXVkaW92aXN1YWxpemVycy9nc3R3YXZlc2NvcGUuYworCSAgZ3N0L2NhbWVyYWJpbjIvZ3N0Y2FtZXJhYmluMi5jCisJICBnc3QvZGVidWd1dGlscy9nc3Rjb21wYXJlLmMKKwkgIGdzdC9mcmVpMHIvZ3N0ZnJlaTBybWl4ZXIuYworCSAgZ3N0L21wZWdwc211eC9tcGVncHNtdXguYworCSAgZ3N0L21wZWd0c211eC9tcGVndHNtdXguYworCSAgZ3N0L214Zi9teGZtdXguYworCSAgZ3N0L3ZpZGVvbWVhc3VyZS9nc3R2aWRlb21lYXN1cmVfc3NpbS5jCisJICBnc3QvdmlkZW9wYXJzZXJzL2dzdGgyNjRwYXJzZS5jCisJICBnc3QvdmlkZW9wYXJzZXJzL2dzdG1wZWc0dmlkZW9wYXJzZS5jCisKKzIwMTEtMTItMDkgMTc6MjU6NDEgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG9wdXNwYXkuYzoKKwkgIG9wdXNlbmM6IGFkZCB1cHN0cmVhbSBuZWdvdGlhdGlvbiBmb3IgbXVsdGlzdHJlYW0gYWJpbGl0eQorCSAgVGhpcyB3aWxsIGhlbHAgZWxlbWVudHMgdGhhdCBjYW5ub3QgZGVhbCB3aXRoIG11bHRpc3RyZWFtLAorCSAgc3VjaCBhcyB0aGUgUlRQIHBheWxvYWRlci4KKwkgIFRoZSBjYXBzIG5vdyBkbyBub3QgaW5jbHVkZSBhICJzdHJlYW1zIiBmaWVsZCBhbnltb3JlLCBidXQKKwkgIGEgIm11bHRpc3RyZWFtIiBib29sZWFuLCBzaW5jZSB3ZSBoYXZlIG5vIHJlYWwgdXNlIGZvciBrbm93aW5nCisJICB0aGUgZXhhY3QgYW1vdW50IG9mIHN0cmVhbXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY1MDc4CisKKzIwMTEtMTItMDcgMTU6MTM6MTEgLTAyMDAgIERhbmlsbyBDZXNhciBMZW1lcyBkZSBQYXVsYSA8ZGFuaWxvLmNlc2FyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBvcHVzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG9wdXNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwb3B1c3BheS5oOgorCSAgQWRkaW5nIG9wdXMgUlRQIHBheWxvYWRlci9kZXBheWxvYWRlciBlbGVtZW50CisJICBBZGRpbmcgT1BVUyBSVFAgbW9kdWxlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRyYWZ0OgorCSAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2lkL2RyYWZ0LXNwaXR0a2EtcGF5bG9hZC1ydHAtb3B1cy0wMC50eHQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjQ4MTcKKworMjAxNi0wMi0xNyAxMzoyNjowMiArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHV0aWxzLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHV0aWxzLmg6CisJICBydHA6IGgyNjQvaDI2NTogYXZvaWQgZHVwbGljYXRpb24gb2YgcmVhZF9nb2xvbWIoKQorCSAgVGhlcmUgaXMgbm8gbmVlZCB0byBoYXZlIHR3byBpZGVudGljYWwgaW1wbGVtZW50YXRpb25zIG9mIHRoZSByZWFkX2dvbG9tYgorCSAgZnVuY3Rpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYxNjA2CisKKzIwMTYtMDItMTcgMTQ6Mzc6NDQgKzAxMDAgIE9nbnlhbiBUb25jaGV2IDxvZ255YW5AYXhpcy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIFRSSUNLTU9ERV9LRVlfVU5JVFMKKwkgIFdoZW4gdGhlIHRyaWNrbW9kZSBrZXktdW5pdHMgZmxhZyBpcyBzZXQgb24gdGhlIHNlZ21lbnQsIHNpbXBseSBza2lwCisJICBhbnkgc2FtcGxlIG9uIGEgdmlkZW8gc3RyZWFtIHRoYXQgaXNuJ3QgYSBrZXlmcmFtZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MjE4NQorCisyMDE1LTA4LTIxIDE0OjE1OjE4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thLWRlbXV4OiBzZW5kIEdBUCBldmVudHMgZm9yIGxhZ2dpbmcgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMgdG9vCisJICBTZW5kIEdBUCBldmVudHMgZm9yIG5vbi1zdWJ0aXRsZSBzdHJlYW1zIHRvbyBpZiB0aGV5IGxhZyB0b28gbXVjaAorCSAgYmVoaW5kLCBidXQgdXNlIGEgaGlnaGVyIHRocmVzaG9sZCB0aGFuIGZvciBzdWJ0aXRsZXMuCisJICBUaGlzIGhlbHBzIHdpdGggZml4aW5nIHByZXJvbGxpbmcgd2l0aCBhIGZpbGUgd2hlcmUgb25lIG9mIHRoZQorCSAgYXVkaW8gc3RyZWFtcyBvbmx5IGhhcyBkYXRhIHN0YXJ0aW5nIGZyb20gMTlzIG9ud2FyZHMuIEl0J3Mgbm90CisJICBhIGNvbXBsZXRlIGZpeCB5ZXQsIGl0IGFsc28gcmVxdWlyZXMgY2hhbmdlcyBlbHNld2hlcmUsIHN1Y2ggYXMKKwkgIGluIGJhc2VwYXJzZSwgdG8gbWFrZSBzdXJlIGNhcHMgYXJlIHByb3BhZ2F0ZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjE0NDYwCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzODk5CisKKzIwMTUtMTItMjMgMTk6NTQ6MTMgKzAxMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA5ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA5ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA5cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOXBheS5oOgorCSAgcnRwdnA5cGF5OiBydHB2cDlkZXBheTogSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBkcmFmdCAwMQorCSAgUXVpY2sgYW5kIGRpcnR5IGltcGxlbWVudGF0aW9uIG9mIGFuIFJUUCBwYXlsb2FkZXIgYW5kIGRlcGF5bG9hZGVyCisJICBmb3IgVlA5LiBJbiBwYXJ0aWNhbHVyIGl0IGFzc3VtZXMgbm8gc3BhdGlhbCBvciB0ZW1wb3JhbCBsYXllcmluZywKKwkgIG5vbi1mbGV4aWJsZSBtb2RlLCBhbmQgc29tZSBvdGhlciBiaXRzIGFuZCBwaWVjZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU0NzczCisKKzIwMTYtMDItMTYgMDk6MDI6MzAgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBGaXggc3RyaW5nIG1lbW9yeSBsZWFrCisJICBjb2RlY19uYW1lIGlzIG5vdCBiZWluZyBmcmVlZCBpbiBhbGwgY29uZGl0aW9ucyBsZWFkaW5nIHRvIG1lbW9yeSBsZWFrCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMTE3CisKKzIwMTUtMTItMTAgMTI6MTU6NTIgKzAxMDAgIE1pZ3VlbCBQYXLDrXMgRMOtYXogPG1wYXJpc2RpYXpAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgcnRwYmluOiBhZGQgImdldC1zZXNzaW9uIiBzaWduYWwKKwkgIFRoaXMgZ2V0cyB0aGUgR3N0UlRQU2Vzc2lvbiBlbGVtZW50LCBhcyBjb21wYXJlZCB0byB0aGUgUlRQU2Vzc2lvbiBvYmplY3QKKwkgIHRoYXQgaXMgcmV0dXJuZWQgYnkgZ2V0LWludGVybmFsLXNlc3Npb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU5MjkzCisKKzIwMTYtMDItMTYgMDA6MTk6MDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSAgcnRwOiBoMjY1OiBob29rIHVwIG1vdmUgUlRQIEguMjY1IHBheWxvYWRlci9kZXBheWxvYWRlciB0byBidWlsZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MTYwNgorCisyMDE2LTAyLTE2IDAwOjE0OjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSAgcnRwOiBoMjY1OiB1c2UgY29tbW9uIG1ldGEgdXRpbGl0eSBmdW5jdGlvbnMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjE2MDYKKworMjAxNi0wMi0wNSAxODoxODozMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1dHlwZXMuaDoKKwkgIHJ0cDogaDI2NTogcmVtb3ZlIGNvZGVjcGFyc2VyIGRlcGVuZGVuY3kgZnJvbSBoMjY1IHBheWxvYWRlci9kZXBheWxvYWRlcgorCSAgTG9va3MgbGlrZSBpdCBqdXN0IHVzZXMgdGhlIE5BTCBlbnVtcyBhbmQgbm90aGluZyBlbHNlIGZyb20KKwkgIHRoZSBjb2RlY3BhcnNlcnMsIGFuZCB0aGF0J3MgdGhlIG9ubHkgcmVhc29uIGl0IGhhZCB0byBiZQorCSAgbW92ZWQgZnJvbSAtZ29vZCB0byAtYmFkIHdoZW4gaXQgd2FzIG9yaWdpbmFsbHkgYWRkZWQuIFdlCisJICBjYW4gcHJvYmFibHkga2VlcCB0aG9zZSBOQUwgZW51bXMgdXAgdG8gZGF0ZSBlbm91Z2gsIHNvIGxldCdzCisJICByZW1vdmUgdGhlIGNvZGVjcGFyc2VyIGRlcGVuZGVuY3kgc28gaXQgY2FuIGJlIG1vdmVkIGJhY2sgaW50bworCSAgLWdvb2QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYxNjA2CisKKzIwMTYtMDItMTYgMDA6MjQ6NTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkgIE1lcmdlIGJyYW5jaCAncGx1Z2luLW1vdmUtcnRwLWgyNjUnCisJICBNb3ZlIFJUUCBILjI2NSBwYXlsb2FkZXIvZGVwYXlsb2FkZXIgZnJvbSAtYmFkIHRvIC1nb29kLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MTYwNgorCisyMDE2LTAyLTA1IDE1OjM0OjUxICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuaDoKKwkgIGdzdHJ0cGgyNjVkZXBheToga2VlcCBjb25zaXN0ZW5jeSB3aXRoIHJ0cGgyNjRkZXBheQorCSAgVXNlIGdzdF9ydHBfZHJvcF9tZXRhKCkgYW5kIHRoZSBzYW1lIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IKKwkgIGdzdF9ydHBfY29weV9tZXRhKCkgdG8ga2VlcCBjb25zaXN0ZW5jeSB3aXRoIHRoZSBSVFAgZWxlbWVudHMgaW4KKwkgIGdzdC1wbHVnaW5zLWdvb2QKKworMjAxNi0wMi0wNSAxMzo1NjozNCArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYzoKKwkgIHJ0cGgyNjVkZXBheTogZml4IHRlcm1pbmF0aW9uIG9mIGFjY2VzcyB1bml0CisJICBPbmx5IGNvbnNpZGVyIHRoZSBhY2Nlc3MgdW5pdCBjb21wbGV0ZSB3aGVuIHRoZSBuZXh0LW9jY3VycmluZyBWQ0wgTkFMIHVuaXQKKwkgIGhhcyB0aGUgZmlyc3QgYml0IGFmdGVyIGl0cyBOQUwgdW5pdCBoZWFkZXIgZXF1YWwgdG8gMS4KKworMjAxNi0wMS0xNSAxNjoxMDowMiArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYzoKKwkgIHJ0cGgyNjVkZXBheTogZml4IHVubmVlZGVkIHN1Yi1idWZmZXIgY3JlYXRpb24KKwkgIFdlIGNyZWF0ZSBhIHN1Yi1idWZmZXIganVzdCB0byBjb3B5IG92ZXIgaXRzIG1ldGFzIGFuZCB0aGVuIHRocm93IGl0CisJICBhd2F5IGltbWVkaWF0ZWx5LCBqdXN0IHVzZSB0aGUgb3JpZ2luYWwgaW5wdXQgYnVmZmVyIGRpcmVjdGx5LgorCisyMDE2LTAxLTE1IDE1OjU2OjU5ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVwYXkuYzoKKwkgIHJ0cGgyNjVwYXk6IGFkZCAic2VuZCBWUFMvU1BTL1BQUyB3aXRoIGV2ZXJ5IGtleSBmcmFtZSIgbW9kZQorCSAgSXQncyBub3QgZW5vdWdoIHRvIGhhdmUgdGltZW91dCBvciBldmVudCBiYXNlZCBWUFMvU1BTL1BQUyBpbmZvcm1hdGlvbgorCSAgc2VudCBpbiBSVFAgcGFja2V0cy4gVGhlcmUgYXJlIHNvbWUgc2NlbmFyaW9zIHdoZW4ga2V5IGZyYW1lcyBtYXkgYXBwZWFyCisJICBtb3JlIGZyZXF1ZW50bHkgdGhhbiBvbmNlIGEgc2Vjb25kLCBpbiB3aGljaCBjYXNlIHRoZSBtaW5pbXVtIHRpbWVvdXQKKwkgIGZvciAiY29uZmlnLWludGVydmFsIiBvZiAxIHNlY29uZCBmb3Igc2VuZGluZyBWUFMvU1BTL1BQUyBpc24ndCBlbm91Z2guCisJICBJdCBtaWdodCBhbHNvIGJlIGRlc2lyYWJsZSBpbiBnZW5lcmFsIHRvIG1ha2Ugc3VyZSB0aGUgVlBTL1NQUy9QUFMgaXMKKwkgIGF2YWlsYWJsZSB3aXRoIGV2ZXJ5IGtleWZyYW1lIChwYWNrZXQgbG9zcyBhc2lkZSksIHNvIHJlY2VpdmVycyBjYW4KKwkgIGFjdHVhbGx5IHBpY2sgdXAgZGVjb2RpbmcgaW1tZWRpYXRlbHkgZnJvbSB0aGUgZmlyc3Qga2V5ZnJhbWUgaWYKKwkgIFZQUy9TUFMvUFBTIGlzIG5vdCBzaWduYWxlZCBvdXQgb2YgYmFuZC4KKwkgIFRoaXMgY29tbWl0IGFkZHMgdGhlIHBvc3NpYmlsaXR5IHRvIHNlbmQgVlBTL1NQUy9QUFMgd2l0aCBldmVyeSBrZXkgZnJhbWUuCisJICBUaGlzIG1vZGUgY2FuIGJlIGVuYWJsZWQgYnkgc2V0dGluZyAiY29uZmlnLWludGVydmFsIiBwcm9wZXJ0eSB0byAtMS4gSW4KKwkgIHRoaXMgY2FzZSB0aGUgcGF5bG9hZGVyIHdpbGwgYWRkIFZQUywgU1BTIGFuZCBQUFMgYmVmb3JlIGV2ZXJ5IGtleSAoSURSKQorCSAgZnJhbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU3ODkyCisKKzIwMTYtMDEtMTUgMTU6MTk6NDEgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1cGF5Lmg6CisJICBydHBoMjY1cGF5OiBjaGFuZ2UgY29uZmlnLWludGVydmFsIHByb3BlcnR5IHR5cGUgZnJvbSB1aW50IHRvIGludAorCSAgVGhpcyB3YXkgd2UgY2FuIHVzZSAtMSBhcyBzcGVjaWFsIHZhbHVlLCB3aGljaCBpcyBuaWNlciB0aGFuIE1BWFVJTlQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU3ODkyCisKKzIwMTUtMDgtMTUgMTY6MjI6MjAgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJICBydHBoMjY1ZGVwYXk6IG1ha2Ugc3VyZSB3ZSBjYWxsIGhhbmRsZV9uYWwgZm9yIGVhY2ggTkFMCisJICBDYWxsIGhhbmRsZV9uYWwgZm9yIGVhY2ggTkFMIGluIHRoZSBTVEFQLUEgUlRQIHBhY2tldC4gVGhpcyBtYWtlcyBzdXJlCisJICB3ZSBjb3JyZWN0bHkgZXh0cmFjdCB0aGUgU1BTIGFuZCBQUFMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMwOTk5CisKKzIwMTUtMDgtMTUgMTQ6NDU6MzQgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSAgcnRwaDI2NXBheTogQ29weSBtZXRhZGF0YSBpbiB0aGUgcGF5bG9hZGVyLCBidXQgb25seSB0aGUgcmVsZXZhbnQgb25lcworCSAgVGhlIHBheWxvYWRlciBkaWRuJ3QgY29weSBhbnl0aGluZyBzbyBmYXIsIHRoZSBkZXBheWxvYWRlciBjb3BpZWQgZXZlcnkKKwkgIHBvc3NpYmxlIG1ldGEuIExldCdzIG1ha2UgaXQgY29uc2lzdGVudCBhbmQganVzdCBjb3B5IGFsbCBtZXRhcyB3aXRob3V0CisJICB0YWdzIG9yIHdpdGggb25seSB0aGUgdmlkZW8gdGFnLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTc3NAorCisyMDE1LTA4LTE1IDExOjQxOjQwICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVwYXkuYzoKKwkgIHJ0cGgyNjVwYXk6IFVzZSBHU1RfV0FSTklOR19PQkpFQ1QoKSBpbnN0ZWFkIG9mIEdTVF9XQVJOSU5HKCkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTMyMjgKKworMjAxNS0wOC0xNSAxMTozMDozNiArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1cGF5LmM6CisJICBydHBoMjY1cGF5OiBmaXggcG90ZW50aWFsIGNyYXNoIHdoZW4gc2h1dHRpbmcgZG93bgorCSAgQSByYWNlIGNvbmRpdGlvbiBpbiB0aGUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uIG1heSBjYXVzZSBidWZmZXJzIHRvIGJlCisJICB1bnJlZmZlZCB3aGlsZSB0aGV5IGFyZSBzdGlsbCB1c2VkIGJ5IHRoZSBzdHJlYW1pbmcgdGhyZWFkIGluCisJICBnc3RfcnRwX2gyNjVfcGF5X3NlbmRfdnBzX3Nwc19wcHMoKSByZXN1bHRpbmcgaW4gYSBjcmFzaC4gQ2hhaW4gdXAgdG8gdGhlCisJICBwYXJlbnQgY2xhc3MgZmlyc3QgaW4gdGhlIHN0YXRlIGNoYW5nZSBmdW5jdGlvbiB0byBtYWtlIHN1cmUgc3RyZWFtaW5nCisJICBoYXMgc3RvcHBlZCBhbmQgb25seSB0aGVuIGZyZWUgdGhvc2UgYnVmZmVycy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDEzODEKKworMjAxNS0wOC0xNCAxNTowODowOCArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1cGF5LmM6CisJICBydHBoMjY1cGF5OiBmaXggYnVmZmVyIGxlYWsgd2hlbiB1c2luZyBTUFMvUFBTCisJICBGaXhlcyBhIGJ1ZmZlciBsZWFrIHRoYXQgd291bGQgb2NjdXIgaWYgdGhlIHBpcGVsaW5lIHdhcyBzaHV0ZG93biB3aGlsZSBhCisJICBTUFMvUFBTIGhlYWRlciB3YXMgYmVpbmcgY3JlYXRlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDEyNzEKKworMjAxNS0wOC0xNCAxMTo0OTo1MSArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5Lmg6CisJICBydHBoMjY1ZGVwYXk6IGNvcHkgbWV0YWRhdGEgaW4gdGhlIGRlcGF5bG9hZGVyLCBidXQgb25seSB0aGUgcmVsZXZhbnQgb25lcworCSAgVGhlIHBheWxvYWRlciBkaWRuJ3QgY29weSBhbnl0aGluZyBzbyBmYXIsIHRoZSBkZXBheWxvYWRlciBjb3BpZWQgZXZlcnkKKwkgIHBvc3NpYmxlIG1ldGEuIExldCdzIG1ha2UgaXQgY29uc2lzdGVudCBhbmQganVzdCBjb3B5IGFsbCBtZXRhcyB3aXRob3V0CisJICB0YWdzIG9yIHdpdGggb25seSB0aGUgdmlkZW8gdGFnLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTc3NAorCisyMDE1LTA4LTEyIDE3OjU0OjUyICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVkZXBheS5jOgorCSAgcnRwaDI2NWRlcGF5OiBjaGVja2luZyBpZiBkZXBheSBoYXMgc3BzL3BwcyBuYWxzIGJlZm9yZSBpbnNlcnRpb24KKwkgIFJlbGF0ZWQgdG86IGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM0MzAKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTMyMjgKKworMjAxNS0wOC0xMiAxNzoyMjo0MiArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYzoKKwkgIHJ0cGgyNjVkZXBheTogb25seSB1cGRhdGUgdGhlIHNyY3BhZCBjYXBzIGlmIHNvbWV0aGluZyBlbHNlIHRoYW4gdGhlIGNvZGVjX2RhdGEgY2hhbmdlZAorCSAgaDI2NHBhcnNlIGFuZCBnc3RydHBoMjY0ZGVwYXkgZG8gdGhlIHNhbWUsIGxldCdzIGtlZXAgdGhlIGJlaGF2aW91cgorCSAgY29uc2lzdGVudC4gQXMgd2Ugbm93IGluY2x1ZGUgdGhlIGNvZGVjX2RhdGEgaW5zaWRlIHRoZSBzdHJlYW0sIHRoaXMgY2F1c2VzCisJICBsZXNzIGNhcHMgcmVuZWdvdGlhdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTMyMjgKKworMjAxNS0wOC0xMiAxNjo0Mzo0OCArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYzoKKwkgIHJ0cGgyNjVkZXBheTogUFBTIHJlcGxhY2VzIG9sZCBQUFMgaWYgaXQgaGFzIHRoZSBzYW1lIGlkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzMjI4CisKKzIwMTUtMDgtMTIgMTY6MTE6MDAgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJICBydHBoMjY1ZGVwYXk6IEluc2VydCBTUFMvUFBTIE5BTHMgaW50byB0aGUgc3RyZWFtCisJICBydHBoMjY0ZGVwYXkgZG9lcyB0aGUgc2FtZSBhbmQgdGhpcyBmaXhlcyBkZWNvZGluZyBvZiBzb21lIHN0cmVhbXMgd2l0aCAzMgorCSAgU1BTIChvciAyNTYgUFBTKS4gSXQgaXMgYWxsb3dlZCB0byBoYXZlIFNQUyBJRCAwIHRvIDMxIChvciBQUFMgSUQgMCB0byAyNTUpLAorCSAgYnV0IHRoZSBmaWVsZCBpbiB0aGUgY29kZWNfZGF0YSBmb3IgdGhlIG51bWJlciBvZiBTUFMgb3IgUFBTIGlzIG9ubHkgNQorCSAgKG9yIDgpIGJpdC4gQXMgc3VjaCwgMzIgU1BTIChvciAyNTYgUFBTKSBhcmUgaW50ZXJwcmV0ZWQgYXMgMCBldmVyeXdoZXJlLgorCSAgVGhpcyBsb29rcyBsaWtlIGEgbWlzdGFrZSBpbiB0aGUgcGFydCBvZiB0aGUgc3BlY3QgYWJvdXQgdGhlIGNvZGVjX2RhdGEuCisKKzIwMTUtMDgtMTIgMTU6NDk6NTAgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJICBydHBoMjY1ZGVwYXk6IGltcGxlbWVudCBwcm9jZXNzX3J0cF9wYWNrZXQoKSB2ZnVuYworCSAgRm9yIG1vcmUgb3B0aW1pc2VkIFJUUCBwYWNrZXQgaGFuZGxpbmc6IG1lYW5zIHdlIGRvbid0IG5lZWQgdG8gbWFwIHRoZQorCSAgaW5wdXQgYnVmZmVyIGFnYWluIGJ1dCBjYW4ganVzdCByZS11c2UgdGhlIG1hcHBpbmcgdGhlIGJhc2UgY2xhc3MgaGFzCisJICBhbHJlYWR5IGRvbmUuCisJICBCYXNlZCBvbjogaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MDIzNQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MzIyOAorCisyMDE1LTA4LTEyIDE1OjE0OjUwICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVkZXBheS5jOgorCSAgcnRwaDI2NWRlcGF5OiBVc2UgR1NUX0JVRkZFUl9QVFMoKSBpbnN0ZWFkIG9mIEdTVF9CVUZGRVJfVElNRVNUQU1QKCkKKwkgIFN3aXRjaGluZyB0byBHU1RfQlVGRkVSX1RJTUVTVEFNUCgpIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBydHAgY29kZS4KKworMjAxNS0wOC0xMiAxNDo1OTo1MyArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYzoKKwkgIHJ0cGgyNjVkZXBheTogcHJldmVudCB0cnlpbmcgdG8gZ2V0IDAgYnl0ZXMgZnJvbSBhZGFwdGVyCisJICBUaGlzIGNhdXNlcyBhbiBhc3NlcnRpb24gYW5kIHdvdWxkIGxlYWQgdG8gZ2V0dGluZyBhIE5VTEwgaW5zdGVhZAorCSAgb2YgYSBidWZmZXIuIFdpdGhvdXQgcHJvcGVyIGNoZWNraW5nIHRoaXMgd291bGQgZWFzaWx5IGxlYWQgdG8gYQorCSAgc2VnZmF1bHQuCisJICBSZWxhdGVkIHRvIHJwdGgyNjRkZXBheTogaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNzE5OQorCisyMDE1LTA3LTI5IDE3OjI5OjI4ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVwYXkuYzoKKwkgIHJ0cDogcmVtb3ZlIGRlYWQgYXNzaWdubWVudAorCSAgVmFsdWUgc2V0IHRvIHJldCB3aWxsIGJlIG92ZXJ3cml0dGVuIGF0IGxlYXN0IG9uY2UgYXQgdGhlIGVuZCBvZiB0aGUgd2hpbGUKKwkgIGxvb3AsIHJlbW92aW5nIGFzc2lnbm1lbnQuCisKKzIwMTUtMDQtMjQgMTY6NDg6MjMgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSAgcmVtb3ZlIHVudXNlZCBlbnVtIGl0ZW1zIFBST1BfTEFTVAorCSAgVGhpcyB3ZXJlIHByb2JhYmx5IGFkZGVkIHRvIHRoZSBlbnVtcyBkdWUgdG8gY2FyZ28gY3VsdCBwcm9ncmFtbWluZyBhbmQgYXJlCisJICB1bnVzZWQuCisKKzIwMTUtMDMtMDYgMTQ6NTQ6NDEgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJICBydHA6IGRvbmxfcHJlc2VudCB2YXJpYWJsZSB1bnVzZWQKKwkgIGRvbmxfcHJlc2VudCBpcyBub3QgaW1wbGVtZW50ZWQsIHlldCB0aGUgdmFsdWUgaXMgc2V0IGFuZCBjaGVja2VkIGEgZmV3IHRpbWVzLgorCSAgQ2xlYW5pbmcgdGhpcy4KKwkgIENJRCAjMTI0OTY4NworCisyMDE1LTAxLTA4IDE1OjM2OjA0ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVwYXkuYzoKKwkgIHJ0cDogdmFsdWUgdHJ1bmNhdGVkIHRvbyBzaG9ydCBjcmVhdGVzIGRlYWQgY29kZQorCSAgdHlwZSBpcyB0cnVuY2F0ZWQgdG8gMC0zMSB3aXRoICImIDB4MWYiLCBidXQgcmlnaHQgYWZ0ZXIgdGhhdCBpdCBpcyBjaGVja3MgaWYKKwkgIHRoZSB2YWx1ZSBpcyBlcXVpdmFsZW50IHRvIEdTVF9IMjY1X05BTF9WUFMsIEdTVF9IMjY1X05BTF9TUFMsIGFuZAorCSAgR1NUX0gyNjVfTkFMX1BQUyAod2hpY2ggYXJlIDMyLCAzMywgYW5kIDM0IHJlc3BlY3RpdmVseSkuIE9idmlvdXNseSwgdGhpcyB3aWxsCisJICBuZXZlciBiZSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBtYXhpbXVtIDMxIGFmdGVyIHRoZSB0cnVuY2F0aW9uLgorCSAgVGhlIGludGVudGlvbiBvZiB0aGUgY29kZSB3YXMgdG8gdHJ1bmNhdGUgdG8gMC02My4KKworMjAxNS0wMS0wOCAxNToyNzo0NCArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYzoKKwkgIHJ0cDogZml4IG5hbCB1bml0IHR5cGUgY2hlY2sKKwkgIEFmdGVyIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbiB0aGUgcHJldmlvdXMgY29tbWl0IGlzIHdyb25nLiBUaGUgY29kZSBpbnRlbmRlZCB0bworCSAgY2hlY2sgaWYgdGhlIHR5cGUgaXMgMzkgb3IgdGhlIHJhbmdlcyA0MS00NCBhbmQgNDgtNTUuIEp1c3QgbGlrZSBnc3RoMjY1cGFyc2UuYworCSAgZG9lcy4gVHlwZSA0MCB3b3VsZCBub3QgYmUgY29tcGxldGUuCisKKzIwMTUtMDEtMDggMTM6NDc6MDkgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmM6CisJICBydHA6IGZpeCBkZWFkIGNvZGUgYW5kIGNoZWNrIGZvciBpbXBvc3NpYmxlIHZhbHVlcworCSAgbmFsX3R5cGUgaXMgdGhlIGluZGV4IGZvciBhIEdzdEgyNjVOYWxVbml0VHlwZSBlbnVtLiBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGRlYWQKKwkgIGNvZGUgaGVyZToKKwkgIEZpcnN0LCBhZnRlciBjaGVja2luZyBpZiBuYWxfdHlwZSBpcyA+PSAzOSB0aGVyZSBhcmUgdHdvIE9SIGNvbmRpdGlvbmFscyB0aGF0CisJICBjaGVjayBpZiB0aGUgdmFsdWUgaXMgaW4gcmFuZ2VzIGhpZ2hlciB0aGFuIHRoYXQgbnVtYmVyLCBzbyBpZiBuYWxfdHlwZSA+PSAzOQorCSAgZmFsbHMgaW4gdGhlIFRydWUgYnJhbmNoIHRob3NlIG90aGVyIGNvbmRpdGlvbnMgYXJlbid0IGNoZWNrZWQgYW5kIGlmIGl0IGZhbGxzCisJICBpbiB0aGUgRmFsc2UgYnJhbmNoIGFuZCB0aGV5IGFyZSBjaGVja2VkLCB0aGV5IHdpbGwgYWx3YXlzIGFsc28gYmUgRmFsc2UuIFRoZXkKKwkgIGFyZSByZWR1bmRhbnQuCisJICBTZWNvbmQsIHRoZSBlbnVtIGhhcyBhIHJhbmdlIG9mIDAgdG8gNDAuIFNvIHRoZSBjaGVja3MgZm9yIHJhbmdlcyBoaWdoZXIgdGhhbiA0MQorCSAgc2hvdWxkIG5ldmVyIGJlIFRydWUuCisJICBSZW1vdmluZyB0aGlzIHJlZHVuZGFudCBjaGVja3MuCisJICBDSUQgMTI0OTY4NAorCisyMDE0LTEwLTE2IDEwOjM0OjAxICswMjAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1cGF5Lmg6CisJICBydHA6IGFkZCBoMjY1IFJUUCBwYXlsb2FkZXIgKyBkZXBheWxvYWRlcgorCisyMDE2LTAyLTE1IDExOjUxOjQ2ICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBtdXguYzoKKwkgIHRlc3RzOiBydHBtdXg6IEZpeCBlbGVtZW50IG1lbW9yeSBsZWFrCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyMDU3CisKKzIwMTYtMDItMTIgMjA6NTc6MjkgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tb25vc2NvcGUvbW9ub3Njb3BlLmM6CisJICBtb25vc2NvcGU6IHJld29yayB0aGUgc2NhbGluZyBjb2RlCisJICBUaGUgcnVubmluZyBhdmVyYWdlIHdhcyB3cm9uZyBhbmQgdGhlIHJlc3VsdGluZyBzY2FsaW5nIGZhY3RvciB3YXMgb25seSBoZWxkIGluCisJICBwbGFjZSB1c2luZyB0aGUgQ0xBTVAuIEluIGFkZHRpb24gd2UgYXJlIG5vdyBjb252ZXJpbmcgcXVpY2tseSB0byB2b2x1bWUKKwkgIGNoYW5nZXMuCisJICBGSW5hbGx5IG5vdyB3aXRoIHRoaXMgY2hhbmdlLCB3ZSBjYW4gY2hhbmdlIHRoZSByZXNvbHV0aW9uIGRlZmluZXMgYW5kCisJICBldmVyeXRoaWduIGFkanVzdHMuCisKKzIwMTYtMDEtMjggMTc6MDA6NTUgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tb25vc2NvcGUvY29udm9sdmUuYzoKKwkqIGdzdC9tb25vc2NvcGUvbW9ub3Njb3BlLmM6CisJKiBnc3QvbW9ub3Njb3BlL21vbm9zY29wZS5oOgorCSAgbW9ub3Njb3BlOiB1c2UgY29uc3RhbnRzIGluIHRoZSBkcmF3aW5nIGNvZGUKKwkgIE1ha2UgYWxsIHRoZSBkcmF3aW5nIG9wcyBiZSBiYXNlZCBvbiB0aGUgY29uc3RhbnRzLiBUaGlzIHdheSB3ZSBjYW4gY2hhbmdlCisJICB0aGUgZml4ZWQgc2l6ZSBhdCBsZWFzdCBhdCBjb21waWxlIHRpbWUuCisKKzIwMTYtMDEtMjggMDk6NTE6MTcgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6CisJICBtb25vc2NvcGU6IHJlcGxhY2UgaGFyZGNvZGVkIHZhbHVlcyBieSBjb25zdGFudHMKKwkgIFRoaXMgYXQgbGVhc3QgZXN0YWJsaXNoZXMgdGhlIHJlbGF0aW9uc2hpcC4KKworMjAxNi0wMS0yOCAwOTo0MzoxMiArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L21vbm9zY29wZS9jb252b2x2ZS5jOgorCSogZ3N0L21vbm9zY29wZS9jb252b2x2ZS5oOgorCSogZ3N0L21vbm9zY29wZS9tb25vc2NvcGUuYzoKKwkqIGdzdC9tb25vc2NvcGUvbW9ub3Njb3BlLmg6CisJICBtb25vc2NwZTogbWFrZSB0aGUgY29udm9sdmVyIHVzZSBkeW5hbWljIG1lbW9yeQorCSAgUmVwbGFjZSBhbGwgI2RlZmluZXMgd2l0aCBtZW1iZXJzIGFuZCBpbml0aWFsaXplIHRoZSBjb252b2x2ZXIgd2l0aCBhIHBhcmFtZXRlci4KKworMjAxNi0wMS0yOCAwODo1Njo0NCArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L21vbm9zY29wZS9SRUFETUU6CisJICBtb25vc2NvcGU6IHVwZGF0ZSBSRUFETUUKKwkgIFdlIGNhbiBhbHJlYWR5IGNyZWF0ZSBtdWx0aXBsZSBpbnN0YW5jZXMuCisKKzIwMTYtMDEtMjggMDg6NTM6MzUgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tb25vc2NvcGUvY29udm9sdmUuYzoKKwkqIGdzdC9tb25vc2NvcGUvbW9ub3Njb3BlLmM6CisJICBtb25vc2NvcGU6IGNvZGUgY2xlYW51cAorCSAgVXNlIGNvbnN0YW50cyBtb3JlIG9mdGVuLiBDbGVhbnVwIGNvbW1lbnRzIGFuZCBhZGQgbW9yZSB0byBleHBsYWluIGhvdyB0aGluZ3MKKwkgIHdvcmsuCisKKzIwMTYtMDItMDggMjM6NDE6MzIgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IHJlbW92ZSBjaGVjayBmb3IgaW1wb3NzaWJsZSBjb25kaXRpb24KKwkgIENvbW1pdCBiZDI3YTFmMzBiNDQ1OGYyZWRlZTUzYzc2ZGQwN2ZiMzU5MDRiNjFkIGFkZGVkIGEgZmV3IGVycm9yIGhhbmRsaW5nCisJICBtZW1vcnkgbWFuYWdlbWVudCBjaGVja3MuIFRoZXNlIGNoZWNrIHNyY2NhcHMgdG8gc2VlIGlmIGl0IG5lZWRzIHRvIGJlCisJICB1bnJlZmVyZW5jZWQgYmVmb3JlIHJldHVybmluZywgaW4gdGhlIGNhc2Ugb2YgaW52YWxpZF9jYXBzIHRoaXMgZ290byBqdW1wCisJICBhbHdheXMgaGFwcGVucyBiZWZvcmUgc3JjY2FwcyBpcyBzZXQsIHNvIGl0IHdpbGwgYWx3YXlzIGJlIE5VTEwgaW4gdGhpcworCSAgZXJyb3IgbGFiZWwuCisJICBDSUQgIzEzNTIwMzUKKworMjAxNi0wMi0wOCAxMjo0ODo0NiArMDEwMCAgUGlvdHIgRHLEhWcgPHBpb3RyZHJhZ0BnbWFpbC5jb20+CisKKwkqIHBvL1BPVEZJTEVTLmluOgorCSAgcG86IHVwZGF0ZSBQT1RGSUxFUworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MTcwNQorCisyMDE2LTAyLTA4IDE1OjMxOjU1ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJICB2NGwyYWxsb2NhdG9yOiBGaXggc3BlbGxpbmcgb2YgcmVlbnF1ZXVlaW5nCisJICBUbyBtYXRjaCBjb21taXQgN2Q3MDc0Y2VmMDI3MmNkNTE1NTA5OGJmYzJiZGE2ODQ5ZGQ4OTI2Ny4gSSBsb3ZlIHRoZSBpZGVhCisJICBvZiBhaW1pbmcgZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25zZWN1dGl2ZSB2b3dlbHMuCisKKzIwMTYtMDItMDggMTA6MTc6NDkgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogRml4IHNwZWxsaW5nIG9mIHF1ZXVlaW5nCisJICBEaWRuJ3Qga25vdyB3aGljaCBvbmUgdG8gY2hvb3NlIGJldHdlZW4gcXVldWluZyBhbmQgcXVldWVpbmcsIHNvIEkgcGlja2VkCisJICB0aGUgb25lIHdpdGggdGhlIGJpZ2dlc3QgYW1vdW50IG9mIHZvd2VscyBpbiBhIHJvdyA7LVAgKGJvdGggYXJlCisJICBhY2NlcHRhYmxlIGFwcGFyZW50bHkpCisKKzIwMTYtMDItMDcgMTU6MDI6MzUgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogRG9uJ3QgcGFzcyB0aGUgc2FtZSBkYXRhIG92ZXIgYW5kIG92ZXIKKwkgIFdlIGFscmVhZHkgcGFzcyB0aGUgZW50aXJlIGZyYW1lIHRvIHRoZSBkZWNvZGVyLiBJZiB0aGUgZGVjb2RlciBhc2sgZm9yCisJICBtb3JlIGRhdGEsIGRvbid0IHBhc3MgdGhlIHNhbWUgZGF0YSBhZ2FpbiBhcyB0aGlzIGxlYWRzIHRvIGluZmluaXQgbG9vcC4KKwkgIEluc3RlYWQsIHNpbXBseSBmYWlsIHRoZSBmaWxsIGZ1bmN0aW9uIHRvIHNpZ25hbCB0aGUgcHJvYmxlbSB3aXRoIHRoYXQKKwkgIGZyYW1lLiBJdCB3aWxsIHRoZW4gYmUgc2tpcHBlZCBwcm9wZXJseS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjE2NzAKKworMjAxNi0wMi0wOCAwMDoxMDozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL2x6by5jOgorCSAgbWF0cm9za2E6IGdldCByaWQgb2YgX3N0ZGludC5oIGluY2x1ZGUKKworMjAxNi0wMi0wNSAyMDowMDo1NyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBleHRlbmQgdGhlIEFNX1RFU1RTX0VOVklST05NRU5UIGZyb20gY2hlY2subWFrCisJICBUbyBnZXQgdGhlIENLX0RFRkFVTFRfVElNRU9VVCBkZWZpbmVkIGZvciBhbGwgdGVzdHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjE0NzIKKworMjAxNi0wMi0wNSAxODowNDozMSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBhdXRvZ2VuLnNoOgorCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDg2ZTQ2NjMgdG8gYjY0ZjAzZgorCisyMDE2LTAxLTMwIDE4OjQzOjMwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkgIHJ0cGpwZWdwYXk6IFNraXAgQVBQIGFuZCBKUEcgbWFya2VycyBhbmQgcHJpbnQgd2FybmluZ3MgZm9yIHVua25vd24gbWFya2VycworCSAgRm9yIEFQUC9KUEcgbWFya2VycyB0aGUgc2l6ZSBpcyBmb2xsb3dpbmcgYW5kIHdlIGhhdmUgdG8gc2tpcCB0aGF0LiBUaGlzIGlzCisJICBub3QgcmVhbGx5IGEgcHJvYmxlbSB1bmxlc3MgdGhlIG1hcmtlciBjb250YWlucyBlLmcuIGEgcHJldmlldyBKUEVHIG9yCisJICBzb21ldGhpbmcgZWxzZSB0aGF0IHdlIG1pZ2h0IGludGVycHJldGUgYXMgYW5vdGhlciBtYXJrZXIuCisKKzIwMTYtMDEtMjYgMjI6Mzc6MzAgKzA5MDAgIFNldW5naGEgWWFuZyA8c2gueWFuZ0BsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBmcmFtZXJhdGUgY2FsY3VsYXRpb24gZm9yIGZyYWdtZW50ZWQgZm9ybWF0CisJICBxdGRlbXV4IGNhbGN1bGF0ZXMgZnJhbWVyYXRlIHVzaW5nIGR1cmF0aW9uIGFuZCB0aGUgbnVtYmVyIG9mIHNhbXBsZS4KKwkgIEluIGNhc2Ugb2YgZnJhZ21lbnRlZCBtcDQgZm9ybWF0LCBob3dldmVyLCB0aGUgbnVtYmVyIG9mIHNhbXBsZSBjYW4KKwkgIGJlIGZpZ3VyZSBvdXQgYWZ0ZXIgcGFyc2luZyBldmVyeSBtb29mIGJveC4gQmVjYXVzZSBxdGRlbXV4IGRvZXMgbm90CisJICBwYXJzZSBldmVyeSBtb29mIGluIFFUREVNVVhfU1RBVEVfSEVBREVSIHN0YXRlLCBpdCB3aWxsIGNhdXNlIGluY29ycmVjdAorCSAgZnJhbWVyYXRlIGNhbGN1bGF0aW9uLgorCSAgVGhpcyBwYXRjaCB3aWxsIHRyaWdlciBnc3RfcXRkZW11eF9jb25maWd1cmVfc3RyZWFtKCkgZm9yIGV2ZXJ5IG5ldyBtb29mLgorCSAgVGhlbiwgZnJhbWVyYXRlIHdpbGwgYmUgY2FsY3VsYXRlZCBieSB1c2luZyBkdXJhdGlvbiBhbmQgbl9zYW1wbGVzIG9mIHRoZSBtb29mLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MDc3NAorCisyMDE2LTAxLTI4IDIyOjM2OjIzICswOTAwICBTZXVuZ2hhIFlhbmcgPHNoLnlhbmdAbGdlLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBoYW5kbGluZyB6ZXJvIHNlZ21lbnQtZHVyYXRpb24gZWRpdCBsaXN0CisJICBCYXNlZCBvbiBkb2N1bWVudCBJU09fSUVDXzE0NDk2LTEyLCBlZGl0IGxpc3QgYm94IGNhbiBoYXZlCisJICBzZWdtZW50IGR1cmF0aW9uIGFzIHplcm8uIEl0IGRvZXMgbm90IGltcGx5IHRoYXQgbWVkaWFfc3RhcnQgZXF1YWxzIHRvCisJICBtZWRpYV9zdG9wLiBCdXQsIGl0IGp1c3QgaW5kaWNhdGVzIGEgc2FtcGxlIHdoaWNoIHNob3VsZCBiZSBwcmVzZW50ZWQKKwkgIGF0IHRoZSBmaXJzdC4gVGhpcyBwYXRjaCBkZXJpdmVzIHNlZ21lbnQgZHVyYXRpb24gdXNpbmcgbWVkaWFfdGltZQorCSAgYW5kIGR1cmF0aW9uIG9mIGZpbGUuIEFuZCBzZXQgZGVyaXZlZCBkdXJhdGlvbiB0byBzZWdtZW50LWR1cmF0aW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MDc4MQorCisyMDE2LTAxLTI4IDIxOjM2OjU0ICswOTAwICBTZXVuZ2hhIFlhbmcgPHNoLnlhbmdAbGdlLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGV4cG9zZSBzdHJlYW1zIHdpdGggZmlyc3QgbW9vZiBmb3IgZnJhZ21lbnRlZCBmb3JtYXQKKwkgIEluIGNhc2Ugb2YgcHVzaCBtb2RlLCBxdGRlbXV4IGV4cG9zZSBzdHJlYW1zIGFmdGVyIGdvdCBtb292IGJveC4KKwkgIFdlIGNhbiBub3QgZ3VhcmFudGVlIHRoYXQgYSBtb292IGJveCBoYXMgc2FtcGxlIGRhdGEgc3VjaCBhcyBzYW1wbGUgZHVyYXRpb24KKwkgIGFuZCB0aGUgbnVtYmVyIG9mIHNhbXBsZSBpbiBzdGJsIGJveCBmb3IgZnJhZ21lbnRlZCBmb3JtYXQgY2FzZS4KKwkgIFNvLCBpZiBhIG1vb3YgaGFzIG5vIHNhbXBsZSBkYXRhLCBzdHJlYW1zIHdpbGwgbm90IGJlIGV4cG9zZWQgdW50aWwgZ2V0IHRoZSBmaXJzdCBtb29mLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MDc3OQorCisyMDE2LTAxLTI3IDE4OjQ4OjE3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBDaGVjayBmb3Igc3Vic2V0IGluc3RlYWQgb2Ygbm9uLWVtcHR5IGludGVyc2VjdGlvbiBmb3IgQUNDRVBUX0NBUFMKKworMjAxNi0wMS0yNyAxODo0NDoyMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogVW5zZXQgUkVDT05GSUdVUkUgZmxhZyBvbiBzcmNwYWQgd2hlbmV2ZXIgd2UgY29uZmlndXJlIG5ldyBjYXBzCisJICBQcmV2ZW50cyBkb3VibGUtbmVnb3RpYXRpb24gZHVyaW5nIHN0YXJ0dXAgYW5kIGluIHNvbWUgb3RoZXIgY2FzZXMuCisKKzIwMTYtMDEtMjcgMTY6NDM6MjIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogQWRkIG5lZ290aWF0aW9uIHVuaXQgdGVzdHMgZm9yIGFsbCA0IG1vZGVzCisJICBUaGVzZSBub3cgY2hlY2sgdGhlIG91dHB1dCBjYXBzIGJhc2VkIG9uIHRoZSBpbnB1dCBjYXBzIGFuZCBhIGZvbGxvd2luZworCSAgY2Fwc2ZpbHRlciBhbmQgbWFrZSBzdXJlIHRoZSBjYXBzIGFyZSBleGFjdGx5IGFzIGV4cGVjdGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MDk5NQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDM4OAorCisyMDE2LTAxLTI2IDE3OjM5OjIwICswMTAwICBWaXZpYSBOaWtvbGFpZG91IDx2aXZpYUB0b29sc29uYWlyLmNvbT4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogRG8gcGFzc3Rocm91Z2ggaW4gYXV0byBtb2RlIGlmIGRvd25zdHJlYW0gb25seSBzdXBwb3J0cyBpbnRlcmxhY2VkCisJICBJZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKwkgIDEpIHVwc3RyZWFtIGFuZCBkb3duc3RyZWFtIGNhcHMgYXJlIGNvbXBhdGlibGUKKwkgIDIpIHVwc3RyZWFtIGlzIGludGVybGFjZWQKKwkgIDMpIGRvd25zdHJlYW0gZG9lc24ndCBzdXBwb3J0IHByb2dyZXNzaXZlIG1vZGUKKwkgIHRoZW4gZGVpbnRlcmxhY2Ugd2lsbCBqdXN0IGRvIHBhc3N0aHJvdWdoIGluc3RlYWQgb2YgZmFpbGluZyB0byBsaW5rLgorCSAgVGhpcyBpcyBkb25lIHdpdGggdGhlIGZvbGxvd2luZyBzY2VuYXJpbyBpbiBtaW5kOgorCSAgdmlkZW90ZXN0c3JjICEgInZpZGVvL3gtcmF3LGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiAhIGRlaW50ZXJsYWNlCisJICBuYW1lPWRlaW5fc3JjICEgdGVlIG5hbWU9dCAhIHF1ZXVlICEgZGVpbnRlcmxhY2UgbmFtZT1kZWluX2ZpbGUgISBmaWxlc2luayB0LiAhCisJICBxdWV1ZSAhIGRlaW50ZXJsYWNlIG5hbWU9ZGVpbl9kZXNrdG9wICEgYXV0b3ZpZGVvc2luaworCSAgSW4gdGhpcyBjYXNlLCBkZWluX3NyYyB3aWxsIGRvIHRoZSBkZWludGVybGFjaW5nLiBIb3dldmVyLAorCSAgdmlkZW90ZXN0c3JjICEgInZpZGVvL3gtcmF3LGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiAhIGRlaW50ZXJsYWNlCisJICBuYW1lPWRlaW5fc3JjICEgdGVlIG5hbWU9dCAhIHF1ZXVlICEgZGVpbnRlcmxhY2UgbmFtZT1kZWluX2ZpbGUgISBmaWxlc2luayB0LiAhCisJICBxdWV1ZSAhIGRlaW50ZXJsYWNlIG5hbWU9ZGVpbl9kZXNrdG9wICEgYXV0b3ZpZGVvc2luayB0LiAhIHF1ZXVlICEKKwkgICJ2aWRlby94LXJhdyxpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIgISBmYWtlc2luaworCSAgSW4gdGhpcyBjYXNlLCBjYXBzIGF1dG8tbmVnb3RpYXRpb24gd2lsbCBtYWtlIGRlaW5fZmlsZSBhbmQgZGVpbl9kZXNrdG9wIGRvCisJICB0aGUgZGVpbnRlcmxhY2luZywgd2hpbGUgZGVpbl9zcmMgd2lsbCBiZSBwYXNzdGhyb3VnaC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjA5OTUKKworMjAxNi0wMS0yNiAxODowNTo1MSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuaDoKKwkgIGRlaW50ZXJsYWNlOiBBZGQgbW9kZT1hdXRvLXN0cmljdAorCSAgSW4gdGhpcyBtb2RlIHdlIHdpbGwgcGFzc3Rocm91Z2ggYWxsIHByb2dyZXNzaXZlIGNhcHMgYnV0IGludGVybGFjZWQgY2FwcyBtdXN0IGJlCisJICBjYXBzIHdoZXJlIHdlIGFjdHVhbGx5IHN1cHBvcnQgZGVpbnRlcmxhY2luZy4KKwkgIFRoaXMgaXMgdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIGF1dG8gYW5kIGF1dG8tc3RyaWN0LCBhdXRvIHdvdWxkCisJICBwYXNzdGhyb3VnaCBhbGwgdW5zdXBwb3J0ZWQgaW50ZXJsYWNlZCBjYXBzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDM4OAorCisyMDE2LTAxLTI2IDE3OjUwOjMwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBJbXBsZW1lbnQgcmVjb25maWd1cmF0aW9uIGEgYml0IGJldHRlcgorCSAgQW5kIGUuZy4gY29uc2lkZXIgcmVjb25maWd1cmF0aW9uIGNhdXNlZCBieSBSRUNPTkZJR1VSRSBldmVudHMgdG9vLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDM4OAorCisyMDE2LTAxLTI2IDExOjU3OjA5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBSZXdyaXRlIGNhcHMgbmVnb3RpYXRpb24KKwkgIFByZXZpb3VzbHkgdGhlIHJlc3VsdCBvZiB0aGUgQ0FQUyBxdWVyeSBhbmQgQUNDRVBUX0NBUFMgZGVwZW5kZWQgb24gd2hhdCBraW5kCisJICBvZiBjYXBzIHdlcmUgbGFzdCBzZXQsIGFuZCBlLmcuIGlmIHdlIGxhc3QgaGFkIGludGVybGFjZWQgY2FwcyBvciBub3QuIFRoYXQncworCSAganVzdCBicm9rZW4uCisJICBBbHNvIHByZXZpb3VzbHkgdGhlIGhhbmRsaW5nIG9mIG5vbi1zeXNtZW0gY2FwcyBmZWF0dXJlcyB3YXMgcmF0aGVyIHJhbmRvbSBhbmQKKwkgIHVudXN1YWJsZS4KKwkgIE5vdyB0aGUgYmVoYXZpb3VyIGlzIHRoZSBmb2xsb3dpbmcsIGRlcGVuZGluZyBvbiB0aGUgbW9kZSBwcm9wZXJ0eToKKwkgIDEpIG1vZGU9ZGlzYWJsZWQKKwkgIENvbXBsZXRlbHkgZG8gcGFzc3Rocm91Z2ggb2YgZXZlcnl0aGluZworCSAgMikgbW9kZT1pbnRlcmxhY2VkCisJICBPbmx5IGFjY2VwdCBmb3JtYXRzIHdlIGNhbiBhY3R1YWxseSBkZWludGVybGFjZSwgYW5kIGFjY2VwdCBpbnRlcmxhY2VkCisJICBhbmQgcHJvZ3Jlc3NpdmUgY29udGVudCBhbmQgYWx3YXlzIHJ1biB0aGUgZGVpbnRlcmxhY2VyIGFuZCBvdXRwdXQKKwkgIHByb2dyZXNzaXZlIGNvbnRlbnQKKwkgIDMpIG1vZGU9YXV0byAoaS5lLiBwbGF5YmluKQorCSAgQWNjZXB0IGFsbCBwcm9ncmVzc2l2ZSBmb3JtYXRzIGFzIHBhc3N0aHJvdWdoLCBhY2NlcHQgYWxsIGZvcm1hdHMgdGhhdCB3ZQorCSAgY2FuIGRlaW50ZXJsYWNlIG91cnNlbHZlcyAod2hpY2ggd2UgZG8gdGhlbiksIGJ1dCBhbHNvIGFjY2VwdCBldmVyeXRoaW5nCisJICBlbHNlIGZvciB3aGljaCB3ZSB0aGVuIGp1c3QgcGFzc3Rocm91Z2guIEluIGF1dG8gbW9kZSwgZGVpbnRlcmxhY2luZyBpcyBiZXN0CisJICBlZmZvcnQ6IElmIHdlIGNhbiwgd2UgZGVpbnRlcmxhY2UsIGlmIHdlIGNhbid0IHdlIGp1c3Qgb3V0cHV0IGludGVybGFjZWQKKwkgIGNvbnRlbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwMzg4CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYwNTUzCisKKzIwMTYtMDEtMjYgMTE6MzQ6NDAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IFJlbW92ZSB1bnVzZWQsIG9ic29sZXRlIGJ1ZmZlcmFsbG9jIGNvZGUKKworMjAxNi0wMS0yNiAxODo1MDozOCArMDEwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHVzZSBBX0FBQyBpbnN0ZWFkIG9mIEFfQUFDL01QRUd4L3kKKwkgIFNvbWUgR29vZ2xlQ2FzdCBjb21wYXRpYmxlIGRldmljZXMgaWdub3JlIEFfQUFDL01QRUd4L3kgdHJhY2tzOyBBbHNvIGFjY29yZGluZyB0byBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1NYXRyb3NrYSBBX0FBQy9NUEVHeC95IGlzIG9ic29sZXRlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYxMTQ0CisKKzIwMTYtMDEtMjUgMTc6MjE6MjQgKzAxMDAgIFbDrWN0b3IgTWFudWVsIErDoXF1ZXogTGVhbCA8dmphcXVlekBpZ2FsaWEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2MXBheS5jOgorCSAgZ3N0OiBGaXggdW5pbnRpYWxpemVkIHZhcmlhYmxlIHdhcm5pbmdzCisJICBXaGlsZSBjcm9zcy1jb21waWxpbmcgd2l0aCBMaW5hcm8gR0NDIDUuMS0yMDE1LjA4LCBpdCBjb21wbGFpbmVkCisJICBhYm91dCBhIGNvdXBsZSB1bml0aWFsaXplZCB2YXJpYWJsZXMuCisJICBUaGlzIHBhdGNoIGluaXRpYWxpemVzIHRoZW0gdG8gemVyby4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjEwOTQKKworMjAxNi0wMS0yNSAxNTowMzoyMyArMDEwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuYzoKKwkgIHNwbGl0bXV4c3JjOiBwcmludCBwb3RlbnRpYWxseSBuZWdhdGl2ZSBvZmZzZXQgd2l0aCBhIHNpZ24KKworMjAxNi0wMS0yMSAxNzo0MTo1NSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBSZS1hZGQgY29sb3JpbWV0cnkgZmllbGQgZm9yIFJHQiBmb3JtYXRzCisJICBUaGlzIHRpbWUsIGNoZWNrIGlmIGl0J3MgYW4gUkdCIGZvcm1hdCBhbmQgc2V0cyB0aGUgdHJhbnNmb3JtYXRpb24KKwkgIG1hdHJpeCB0byBpZGVudGl0eS4gVGhlIHJlc3Qgb2YgdGhlIGNvbG9yaW1ldHJ5IGluZm9ybWF0aW9uIGlzCisJICBtZWFuaW5nZnVsbCBhbmQgc2hhbGwgYmUga2VwdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTk2MjQKKworMjAxNi0wMS0yMiAxMDowMzo1MCArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IGZpeCBzUkdCIGNvbG9yc3BhY2UgZGVmaW5pdGlvbgorCSAgVjRsMiBjYW4gYWxzbyB1c2UgdGhlIHNSR0IgY29sb3JzcGFjZSBmb3IgWVVWIGZvcm1hdHMgYW5kIHRodXMgbmVlZHMgYQorCSAgZGVmYXVsdCBtYXRyaXguCisKKzIwMTYtMDEtMjEgMTU6Mjk6NDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHRhZ2luamVjdC5jOgorCSAgdGFnaW5qZWN0OiBmaXggc2FtcGxlIHBpcGVsaW5lIGluIGRvY3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Nzk1NzEKKworMjAxNi0wMS0yMSAxMDo0OTo0NCArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IEFkZCBhZG9iZSBjb2xvcnNwYWNlIHN1cHBvcnQKKwkgIFVzZSB0aGUgbmV3IHByaW1hcmllcyBhbmQgdHJhbnNmZXIgZnVuY3Rpb24gZm9yIEFkb2JlIFJHQi4KKwkgIEV4cGxpY2l0bHkgbGlzdCB0aGUgY29sb3JpbWV0cnkgaW5zdGVhZCBvZiB1c2luZyB0aGUgZGVmYXVsdCBHU3RyZWFtZXIKKwkgIG9uZXMuIFRoZSBkZWZhdWx0cyBmb3IgQlQyMDIwLCBmb3IgZXhhbXBsZSwgZG8gbm90IG1hdGNoLgorCSAgRXhwbGljaXRseSBzZXQgdGhlIG1hdHJpeCBvZiBTUkdCIHRvIFJHQi4KKworMjAxNi0wMS0yMCAxMzo0MTozMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDhlbmMuYzoKKwkgIHZwOGVuYzogRW5zdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgdmFsaWQgZnJhbWUgdXNlciBkYXRhIGJlZm9yZSB1c2luZyBpdAorCSAgT3RoZXJ3aXNlIHdlJ3JlIGdvaW5nIHRvIGRlcmVmZXJlbmNlIE5VTEwgcG9pbnRlcnMuCisKKzIwMTYtMDEtMjAgMTA6MDI6NDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC92cHgvZ3N0dnB4ZGVjLmM6CisJICB2cHhkZWM6IFVucmVmIGZyYW1lIGluIGFsbCBjb2RlIHBhdGhzIG9mIGhhbmRsZV9mcmFtZSgpCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYwNjY2CisKKzIwMTYtMDEtMTkgMjI6NDk6MjAgKzAxMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRzYXVuaWVyQGdub21lLm9yZz4KKworCSogZXh0L3ZweC9nc3R2cHhlbmMuYzoKKwkgIHZweGVuYzogVW5yZWYgZnJhbWUgb24gRVJST1IKKwkgIEFsbCBjb2RlIHBhdGhzIGZvciBoYW5kbGVfZnJhbWUoKSBtdXN0IHNvbWVob3cgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGZyYW1lLCBiZQorCSAgaXQgYnkgYWN0dWFsbHkgdW5yZWZmaW5nLCBmb3J3YXJkaW5nIHRoZSBmcmFtZSBlbHNld2hlcmUgb3Igc3RvcmluZyBpdCBmb3IKKwkgIGxhdGVyLgorCSAgaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYwNjY2CisKKzIwMTYtMDEtMjAgMTg6MjA6NDMgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyZGV2aWNlcHJvdmlkZXIuYzoKKwkgIHY0bDI6IERvbid0IGZyZWUgcHJvcHMgc3RydWN0dXJlIHR3aWNlLgorCSAgZ3N0X3Y0bDJfZGV2aWNlX3Byb3ZpZGVyX3Byb2JlX2RldmljZSgpIGZyZWVzIHRoZSBwYXNzZWQgcHJvcHMKKwkgIHN0cnVjdHVyZSwgZG9uJ3QgZnJlZSBpdCBhZ2FpbiBpbiB0aGUgY2FsbGVyLgorCisyMDE2LTAxLTE5IDE1OjE1OjM1IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IENsZWFudXAgdW5lZWRlZCByZXR1cm4gc3RhdGVtZW50CisKKzIwMTYtMDEtMTkgMTU6MTQ6NTkgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRG9uJ3Qgc2V0IGNvbG9yaW1ldHJ5IGZvciBub24gWVVWIGZvcm1hdHMKKwkgIFNldHRpbmcgY29sb3JtZXRyeSBpbiBjYXBzIGZvciBSR0IgaGF2ZSBubyBtZWFuaW5nLCBidXQgd29yc3QgaXQKKwkgIGNvbmZ1c2VzIHRoZSBjb252ZXJ0ZXJzIGRvd25zdHJlYW0uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU5NjI0CisKKzIwMTYtMDEtMTkgMTM6MDE6MTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwY2hhbm5lbHMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2hhbm5lbHMuaDoKKwkgIHJ0cDogZml4IGNvbXBpbGVyIHdhcm5pbmdzIHdpdGggZ2NjLTYKKwkgIEluIGZpbGUgaW5jbHVkZWQgZnJvbSBnc3RydHBMMTZkZXBheS5oOjI3OjAsCisJICBmcm9tIGdzdHJ0cC5jOjczOgorCSAgZ3N0cnRwY2hhbm5lbHMuaDoxNTQ6MzM6IGVycm9yOiAnY2hhbm5lbF9vcmRlcnMnIGRlZmluZWQgYnV0IG5vdCB1c2VkIFstV2Vycm9yPXVudXNlZC1jb25zdC12YXJpYWJsZV0KKwkgIHN0YXRpYyBjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgY2hhbm5lbF9vcmRlcnNbXSA9CisKKzIwMTYtMDEtMTkgMTQ6NTc6MDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IERvbid0IHBsYXkgYW55dGhpbmcgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgZGF0YSBjaHVuayBldmVuIHdoZW4gc2Vla2luZworCSAgRXNwZWNpYWxseSBpbiBwdXNoIG1vZGUgd2Ugd291bGQgY29tcGxldGVseSBpZ25vcmUgdGhlIHNpemUgb2YgdGhlIGRhdGEgY2h1bmsKKwkgIHdoZW4gbm90IHN0b3AgcG9zaXRpb24gaXMgZ2l2ZW4gZm9yIHRoZSBzZWVrLiBJbnN0ZWFkIG1ha2Ugc3VyZSB0aGF0IHRoZSBlbmQKKwkgIG9mZnNldCBpcyBhdCBtb3N0IHRoZSBlbmQgb2YgdGhlIGRhdGEgY2h1bmsgaWYga25vd24uCisJICBXaXRob3V0IHRoaXMgd2Ugd291bGQgb3V0cHV0IGFueXRoaW5nIGFmdGVyIHRoZSBkYXRhIGNodW5rLCBwb3NzaWJseSBjYXVzaW5nCisJICBsb3VkIG5vaXNlcyBpZiB0aGUgbWVkaWEgZmlsZSBpcyBmb2xsb3dlZCBieSBhbiBJTkZPIGNodW5rIG9yIGFuIElEMyB0YWcuCisKKzIwMTYtMDEtMTkgMTQ6NTU6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IERvbid0IGRvIGNhbGN1bGF0aW9ucyB3aXRoIC0xIG9mZnNldHMgd2hlbiBoYW5kbGluZyBTRUdNRU5UIGV2ZW50cworCSAgV2UgdXNlIHRoYXQgdG8gc2lnbmFsICJpbmZpbml0eSIsIHRha2luZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoYXQgYW5kIHNvbWUKKwkgIG90aGVyIHZhbHVlIGlzIG5vdCBnb2luZyB0byBnaXZlIHVzIGFueSB1c2VmdWwgcmVzdWx0IGZvciB0aGUgZW5kIG9mZnNldHMgb2YKKwkgIHNlZ21lbnRzLgorCisyMDE2LTAxLTE4IDExOjMwOjQ1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBSZXZlcnQgIldJUDogcnRwaml0dGVyYnVmZmVyOiBBZGQgUkZDNzI3MyBtZWRpYSBjbG9jayBoYW5kbGluZyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgMjcxNTAxZjY1NzZkZTRkMTQxZTdjMmY2MThlMjhiOWUzYjFlNWIzOC4KKwkgIEl0IHdhc24ndCBtZWFudCB0byBiZSBwdXNoZWQgeWV0IGFzIHRoZSBjb21taXQgbWVzc2FnZSBpbmRpY2F0ZXMuCisKKzIwMTYtMDEtMTIgMTQ6MDE6MjEgLTA4MDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdcOpIDxhY29uY2hpbGxvQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogaGFuZGxlIHJ0Y3Avc3J0Y3AgY2FwcyBwcm9wZXJseSB3aGVuIHVzaW5nIGludGVybGVhdmVkIGRhdGEKKwkgIFdlIGNoZWNrIHRoZSBzdHJlYW0gcHJvZmlsZSBhbmQgdXNlIHRoZSBwcm9wZXIgUlRDUCBjYXBzOgorCSAgYXBwbGljYXRpb24veC1zcnRjcCBpZiB3ZSBhcmUgdXNpbmcgYSBzZWN1cmUgcHJvZmlsZSBhbmQKKwkgIGFwcGxpY2F0aW9uL3gtcnRjcCBvdGhlcndpc2UuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYwNTU2CisKKzIwMTYtMDEtMDUgMTY6MTU6MTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkgIFdJUDogcnRwaml0dGVyYnVmZmVyOiBBZGQgUkZDNzI3MyBtZWRpYSBjbG9jayBoYW5kbGluZworCisyMDE2LTAxLTE1IDExOjM2OjM1ICswMDAwICBUaGliYXVsdCBTYXVuaWVyIDx0c2F1bmllckBnbm9tZS5vcmc+CisKKwkqIGV4dC92cHgvZ3N0dnB4ZW5jLmM6CisJICB2cDhlbmM6IFJldHVybiBGTE9XX0VSUk9SIHdoZW4gYW4gZXJyb3IgYWNjdXJlcworCSAgRkFMU0Ugd291bGQgbWVhbiBGTE9XX09LCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYwNjY2CisKKzIwMTYtMDEtMTUgMDM6NTc6NDUgKzA1MzAgIE5pcmJoZWVrIENoYXVoYW4gPG5pcmJoZWVrQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2hhbC5jOgorCSAgb3N4YXVkaW86IGJyZWFrIGFzIHNvb24gYXMgdGhlIGRldmljZSBpcyBmb3VuZAorCSAgTm8gbmVlZCB0byBsb29wIGZ1cnRoZXIgaWYgdGhlcmUncyBubyBzaWRlLWVmZmVjdHMgZm9yIGl0CisKKzIwMTYtMDEtMTUgMDM6NTY6NDkgKzA1MzAgIE5pcmJoZWVrIENoYXVoYW4gPG5pcmJoZWVrQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2hhbC5jOgorCSAgb3N4YXVkaW86IEZpeCBlcnJvciBoYW5kbGluZyB3aGVuIHNlbGVjdGluZy9vcGVuaW5nIGRldmljZXMKKwkgIFBvc3QgYW4gZWxlbWVudCBlcnJvciB3aGVuIHRoZSBDb3JlQXVkaW8gZGV2aWNlIGNhbm5vdCBiZSBzZWxlY3RlZCBvciBvcGVuZWQuCisJICBBbHNvIGVuc3VyZSB0aGF0IHdlIHBvc3QgYSBHU1RfRVJST1Igd2l0aCBtb3JlIGRldGFpbC4KKworMjAxNi0wMS0xMyAyMzo0MDoyMCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogV2hlbiBmbHVzaGluZyBvbiBFT1MsIGRvbid0IHByb2Nlc3MgbW9yZSBkYXRhIHRoYW4gdGhlICJkYXRhIiBzaXplCisJICBFdmVuIGlmIHdlIGhhdmUgbW9yZSBkYXRhIHF1ZXVlZCB1cCB3aGVuIGZsdXNoaW5nIHRoYW4gdGhlIHNpemUgb2YgdGhlIGRhdGEKKwkgIGNodW5rLCBkb24ndCBwcm9jZXNzIGFuZCBvdXRwdXQgaXQuIElmIHRoZSBkYXRhIHNpemUgaXMga25vd24sIHRoaXMgbGlrZWx5CisJICBjb250YWlucyBhbm90aGVyIGNodW5rIChlLmcuIGFuIElORk8gY2h1bmspIG9yIHRoaW5ncyBsaWtlIElEMyB0YWdzLiBKdXN0CisJICBvdXRwdXR0aW5nIHRoZW0gYXMgaWYgdGhleSB3ZXJlIGRhdGEgaXMgZ29pbmcgdG8gY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvdXIKKwkgIGFuZCB1bnBsZWFzYW50IGF1ZGlvIG5vaXNlcy4KKworMjAxNC0wOC0yOSAxNTo0MDoyMyArMDIwMCAgQW50b25pbyBPc3BpdGUgPGFvMkBhbzIuaXQ+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZlbmMuYzoKKwkgIHRlc3RzOiBmaXggYSB0aGlua28gaW4gdGhlIHdhdmVuYyBleGFtcGxlCisJICBUaGUgY29kZSBpcyBzdXBwb3NlZCB0byBmb2xsb3cgc29tZWhvdyB3aGF0IHRoZSBjb21tZW50IGFib3ZlIHNheXMsIHRoYXQKKwkgIGlzIHRvIGhhdmUgb25lIGNoYW5uZWwgd2l0aCBhIHdhdmUgb2YgZnJlcSA0NDAgYW5kIHRoZSBvdGhlciBjaGFubmVsCisJICB3aXRoIGEgd2F2ZSBvZiBmcmVxIDg4MCwgYnV0IGFuIG9mZiBieSBvbmUgZXJyb3IgcmVzdWx0cyBpbiBmcmVxdWVuY2llcworCSAgb2YgMCBhbmQgNDQwLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNTY3MworCisyMDE0LTA4LTI5IDE1OjA3OjU4ICswMjAwICBBbnRvbmlvIE9zcGl0ZSA8YW8yQGFvMi5pdD4KKworCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSAgaW50ZXJsZWF2ZTogRml4IHRoZSBleGFtcGxlIGJ5IHNldHRpbmcgY2hhbm5lbC1tYXNrcyBpbiB0aGUgc2luayBwYWRzCisJICBUaGUgY3VycmVudCBleGFtcGxlIGRvZXMgbm90IHdvcmssIGl0IGZhaWxzIHdpdGg6CisJICBFUlJPUjogZnJvbSBlbGVtZW50IC9Hc3RQaXBlbGluZTpwaXBlbGluZTAvR3N0RGVjb2RlQmluOmRlY29kZWJpbjAvR3N0V2F2UGFyc2U6d2F2cGFyc2UwOiBJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuCisJICBnc3R3YXZwYXJzZS5jKDIxNzgpOiBnc3Rfd2F2cGFyc2VfbG9vcCAoKTogL0dzdFBpcGVsaW5lOnBpcGVsaW5lMC9Hc3REZWNvZGVCaW46ZGVjb2RlYmluMC9Hc3RXYXZQYXJzZTp3YXZwYXJzZTA6CisJICBzdHJlYW1pbmcgdGFzayBwYXVzZWQsIHJlYXNvbiBub3QtbmVnb3RpYXRlZCAoLTQpCisJICBUaGlzIGlzIGJlY2F1c2UgbmVnb3RpYXRpb24gd2l0aCB3YXZlbmMgZ2V0cyBtZXNzZWQgdXAgYnkgdGhlIG1pc3NpbmcKKwkgIGNoYW5uZWwgcG9zaXRpb25zIGNvbmZpZ3VyYXRpb24uCisJICBUaGUgcHJvcGVyIHdheSB0byBkZWZpbmUgdGhlIGNoYW5uZWwgbGF5b3V0IHdoZW4gdXNpbmcgdGhlIGludGVybGVhdmUKKwkgIGVsZW1lbnQgaW4gY29kZSB3b3VsZCBiZSB0byBzZXQgdGhlIGNoYW5uZWwtcG9zaXRpb25zIHByb3BlcnR5LCBidXQKKwkgIGdzdC1sYXVuY2gtMS4wIGRvZXMgbm90IGtub3cgaG93IHRvIGRlYWwgd2l0aCBhcnJheXM7IHNvIHRoZSBleGFtcGxlCisJICBwaXBlbGluZSB3b3JrcyBhcm91bmQgdGhlIGlzc3VlIGJ5IHNldHRpbmcgdGhlIGNoYW5uZWwtbWFza3MgaW4gdGhlIHNpbmsKKwkgIHBhZHMuCisJICBBbHNvIGZpeCBhIHJlcGV0aXRpb24gaW4gdGhlIGRlaW50ZXJsZWF2ZSBleGFtcGxlIGRlc2NyaXB0aW9uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1NjczCisKKzIwMTYtMDEtMTEgMTY6Mjk6NTUgKzAwMDAgIFRpbSBTaGVyaWRhbiA8dGltLnNoZXJpZGFuQGltZ3RlYy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0c2JjcGFyc2UuYzoKKwkgIHNiY3BhcnNlOiBGaXggZnJhbWUgbGVuZ3RoIGNhbGN1bGF0aW9uCisJICBTQkMgZnJhbWUgbGVuZ3RoIGNhbGN1bGF0aW9uIHdhc24ndCBiZWluZyByb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IGJ5dGUKKwkgIChhcyBzcGVjaWZpZWQgaW4gdGhlIEEyRFAgMS4wIHNwZWNpZmljYXRpb24sIHNlY3Rpb24gMTIuOSkuIFRoaXMgY291bGQKKwkgIGNhdXNlICdzdGVyZW8nIGFuZCAnam9pbnQgc3RlcmVvJyBtb2RlIFNCQyBzdHJlYW1zIHRvIGhhdmUgaW5jb3JyZWN0bHkKKwkgIGNhbGN1bGF0ZWQgZnJhbWUgbGVuZ3Rocy4KKwkgIEluY29ycmVjdCBmcmFtZSBsZW5ndGggY2FsY3VsYXRpb24gY2F1c2VzIGZyYW1lIGNvYWxlc2NpbmcgdG8gZmFpbCwgYXMKKwkgIHN1YnNlcXVlbnQgZnJhbWVzIGluIHRoZSBzdHJlYW0gYXJlbid0IGZvdW5kIGluIHRoZSBleHBlY3RlZCBsb2NhdGlvbnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQyNDQ2CisKKzIwMTYtMDEtMTAgMjI6NTQ6MTIgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogZGVtb3RlIHdhcm5pbmcgb24gd3JvbmcgcmVzZXJ2ZWQgdmFsdWUgdG8gZml4bWUKKwkgIFdlIGFyZSBsaWtlbHkganVzdCBwYXJzaW5nIGEgYmFja3dhcmQtY29tcGF0aWJsZSBzdHJlYW0gd2UKKwkgIGRvbid0IGZ1bGx5IHN1cHBvcnQuCisKKzIwMTYtMDEtMDggMTY6Mjc6MDUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogc2ltcGxpZnkgY2FwcyBzZWxlY3Rpb24KKwkgIFRoZSBkb3duc3RyZWFtIGNhcHMgcXVlcnkgd2l0aCBhIGZpbHRlciBhbHJhZWR5IGdpdmVzIHVzIHRoZSBwb3NzaWJsZQorCSAgaW50ZXJzZWN0aW9uIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgaXQgYWdhaW4gd2l0aCBkb3duc3RyZWFtCisJICBpZiBpdCBpcyBzdXBwb3J0ZWQuIEp1c3QgdHJ5IHRvIHNldCBpdCBkaXJlY3RseS4KKworMjAxNi0wMS0wNyAyMDo0Mjo0MSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIHJ0cGgyNjRkZXBheTogZml4IHVubmVjZXNzYXJ5IHN1Yi1idWZmZXIgY3JlYXRpb24KKwkgIFdlIGNyZWF0ZSBhIHN1Yi1idWZmZXIganVzdCB0byBjb3B5IG92ZXIgaXRzIG1ldGFzIGFuZCB0aGVuCisJICB0aHJvdyBpdCBhd2F5IGltbWVkaWF0ZWx5LCBqdXN0IHVzZSB0aGUgb3JpZ2luYWwgaW5wdXQgYnVmZmVyCisJICBkaXJlY3RseS4KKworMjAxNi0wMS0wNyAyMDozODoyNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBkdmRlcGF5LmM6CisJICBydHBkdmRlcGF5OiBmaXggdW5uZWNlc3Nhcnkgc3ViLWJ1ZmZlciBjcmVhdGlvbgorCSAgV2UgY3JlYXRlIGEgc3ViLWJ1ZmZlciBqdXN0IHRvIGNvcHkgb3ZlciBpdHMgbWV0YXMgYW5kIHRoZW4KKwkgIHRocm93IGl0IGF3YXkgaW1tZWRpYXRlbHksIGp1c3QgdXNlIHRoZSBvcmlnaW5hbCBpbnB1dCBidWZmZXIKKwkgIGRpcmVjdGx5LgorCisyMDE2LTAxLTA3IDIwOjM0OjA1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJICBydHBhbXJkZXBheTogZml4IHVubmVjZXNzYXJ5IHN1Yi1idWZmZXIgY3JlYXRpb24KKwkgIFdlIGNyZWF0ZSBhIHN1Yi1idWZmZXIganVzdCB0byBjb3B5IG92ZXIgaXRzIG1ldGFzIGFuZCB0aGVuCisJICB0aHJvdyBpdCBhd2F5IGltbWVkaWF0ZWx5LCBqdXN0IHVzZSB0aGUgb3JpZ2luYWwgaW5wdXQgYnVmZmVyCisJICBkaXJlY3RseS4KKworMjAxNi0wMS0wNyAyMDoyNzoyOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIHJ0cHZyYXdkZXBheTogZml4IG1ham9yIG1lbW9yeSBsZWFrIGFuZCBwZXJmb3JtYW5jZSBpc3N1ZQorCSAgV2UgY2FsbCBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCgpIHdoaWNoIGNyZWF0ZXMgYSBzdWItYnVmZmVyCisJICBvZiBlYWNoIGlucHV0IGJ1ZmZlciwganVzdCB0byBjb3B5IG92ZXIgbWV0YXMsIGFuZCB0aGVuIGxlYWsgaXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYwMjg5CisKKzIwMTYtMDEtMDggMTU6MzI6NDcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzoKKwkgIHJnYW5hbHlzaXM6IEZpeCBjb21waWxlciB3YXJuaW5ncyBpbiB0aGUgdW5pdCB0ZXN0CisJICBlbGVtZW50cy9yZ2FuYWx5c2lzLmM6OTE5OjY2OiBlcnJvcjogc2hpZnRpbmcgYSBuZWdhdGl2ZSBzaWduZWQgdmFsdWUgaXMgdW5kZWZpbmVkCisJICBbLVdlcnJvciwtV3NoaWZ0LW5lZ2F0aXZlLXZhbHVlXQorCSAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2ludDE2X3N0ZXJlbyAoODAwMCwgMTYsIDUxMiwgLTEgPDwgMTQsIDApKTsKKwkgIH5+IF4KKwkgIGVsZW1lbnRzL3JnYW5hbHlzaXMuYzo5Mjk6Njk6IGVycm9yOiBzaGlmdGluZyBhIG5lZ2F0aXZlIHNpZ25lZCB2YWx1ZSBpcyB1bmRlZmluZWQKKwkgIFstV2Vycm9yLC1Xc2hpZnQtbmVnYXRpdmUtdmFsdWVdCisJICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfaW50MTZfc3RlcmVvICg4MDAwLCAxNiwgNTEyLCAwLCAtMSA8PCAxNCkpOworCSAgfn4gXgorCSAgZWxlbWVudHMvcmdhbmFseXNpcy5jOjkzOTo2NDogZXJyb3I6IHNoaWZ0aW5nIGEgbmVnYXRpdmUgc2lnbmVkIHZhbHVlIGlzIHVuZGVmaW5lZAorCSAgWy1XZXJyb3IsLVdzaGlmdC1uZWdhdGl2ZS12YWx1ZV0KKwkgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9pbnQxNl9tb25vICg4MDAwLCAxNiwgNTEyLCAtMSA8PCAxNCkpOworCSAgfn4gXgorCisyMDE2LTAxLTA1IDE4OjEzOjA2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBkb24ndCBtYXAgYnVmZmVyIG11bHRpcGxlIHRpbWVzIHdoZW4gcGFyc2luZworCisyMDE2LTAxLTA3IDE4OjIwOjMwICswMjAwICBTdGV2ZW4gSG92aW5nIDxzaEBiaWdicm90aGVyLm5sPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thOiBTdG9yZSBzdWJ0aXRsZSBzdHJlYW0gY291bnQgaW4gdGhlIGNvcnJlY3QgdmFyaWFibGUKKwkgIEFuZCBkb24ndCBvdmVycmlkZSB0aGUgdmlkZW8gc3RyZWFtIGNvdW50IGluc3RlYWQuCisKKzIwMTYtMDEtMDUgMTg6NTk6MDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVybmJhbmRzLmM6CisJICBlcXVhbGl6ZXI6IFRoZSBjaGlsZC1wcm94eSBBUEkgaXMgR09iamVjdCBiYXNlZCBpbiAxLngKKwkgIE5vdCBHc3RPYmplY3QgYW55bW9yZS4KKworMjAxNS0wNS0yMSAxNzo0MToxMiArMDIwMCAgUGFibG8gQW50b24gPHBhYmxvLmFudG9uQHZvZGFseXMtbGFicy5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDItKjogQ29uZmlndXJpbmcgb3V0cHV0IHBvb2wgY29ycmVjdGx5IGZvciB1c2luZyBkcml2ZXJzIG1pbl9idWZmZXIgaWYgcHJlc2VudC4KKwkgIFNpZ25lZC1vZmYtYnk6IFBhYmxvIEFudG9uIDxwYWJsby5hbnRvbkB2b2RhbHlzLWxhYnMuY29tPgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NTczNgorCisyMDE1LTEyLTMxIDE1OjQ2OjMxIC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGFkZCBkZWJ1ZyBtc2cgb24gQ1JDIG1pc21hdGNoIHdoaWxlIHZhbGlkYXRpbmcgZnJhbWUgaGVhZGVyCisKKzIwMTUtMTItMzEgMTY6MDA6NDkgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogZHJvcCB1bm5lZWRlZCBicmFjZXMgYXQgX3BhcnNlX2ZyYW1lKCkgZXhpdAorCSAgQWRkaXRpb25hbGx5LCBkcm9wIHJlZHVuZGFudCBjb21tZW50ICYgbGluZSBicmVhaworCisyMDE1LTEyLTMxIDE1OjU1OjE4IC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IG1pbm9yIGdyYW1tYXIgY29ycmVjdGlvbgorCisyMDE1LTEyLTMxIDE1OjM0OjU3IC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IHVwZGF0ZSBVUkxzIG9uIHBvaW50ZXJzIHRvIG9ubGluZSBzcGVjCisKKzIwMTUtMTItMzEgMTQ6NDA6MTUgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogbWFrZSBidWZmZXIgRFRTIHNldHRpbmcgZXhwbGljaXRseSB1bmNvbmRpdGlvbmFsCisJICBXZSBhcmUgc2V0dGluZyBpdCB0byBQVFMgcmVnYXJkbGVzcyBvZiBibG9ja19zdHJhdGVneQorCisyMDE1LTEyLTMxIDE0OjIxOjQwIC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGFkZCBhY3R1YWwgaW52YWxpZCBibG9jayB0eXBlIHRvIHdhcm5pbmcKKwkgIEZvciBzb21lb25lIHRoYXQgcmVhZCB0aGUgc3BlYyBpcyBjbGVhciB0aGUgb25seSAqaW52YWxpZCoKKwkgIGRhdGEgYmxvY2sgdHlwZSBpcyAxMjcuIEZvciB0aGUgcmVzdCwgaXRzIHVzZWZ1bCBpbmZvcm1hdGlvbi4KKwkgIEFkZGl0aW9uYWxseS4gdmFsdWVzIDctMTI2IGFyZSBjdXJyZW50bHkgcmVzZXJ2ZWQgYnkgdGhlCisJICBzcGVjIHNvIHRoZSBzaXR1YXRpb24gbWlnaHQgY2hhbmdlIGluIHRoZSBmdXR1cmUuCisKKzIwMTUtMTItMzEgMTQ6MTI6MzYgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogdXNlIHNoaWZ0IGluc3RlYWQgb2YgbWFzayAmIGNvbXAKKwkgIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgb24gdGhlIGZpcnN0IGJpdCBvZiB0aGUgZmlyc3QKKwkgIGJ5dGUgb2YgdGhlIG1ldGFkYXRhIGJsb2NrIGhlYWRlciB0byBmaWd1cmUgb3V0IHdoZXRoZXIKKwkgIGlzIG1hcmtlZCBhcyB0aGUgbGFzdCBvbmUuIFRoZSBzaGlmdCBtYWtlcyBpdCBxdWl0ZQorCSAgY2xlYXJlci4KKworMjAxNS0xMi0zMSAxMjo1MjoxMyAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiB3YXJuIG9uIHdpc2hmdWwgcGFyc2luZyBvZiB3ZWlyZCBoZWFkZXJzCisJICBJZiB3ZSBnZXQgYW55dGhpbmcgZnJvbSA3IHRvIDEyNiBhcyB0eXBlIHdoZW4gcGFyc2luZworCSAgYSBtZXRhZGF0YSBibG9jayBoZWFkZXIsIHdlIGFyZSBsaWtlbHkgZGVhbGluZyB3aXRoIGEKKwkgIEZMQUMgc3RyZWFtIHZlcnNpb24gd2UgZG9uJ3QgZnVsbHkgdW5kZXJzdGFuZC4gSXNzdWUKKwkgIGEgd2FybmluZyBpZiBzby4KKwkgIERvY3VtZW50IGZ1bmN0aW9uIGFzc3VtcHRpb25zIHJlZ2FyZGluZyB0aGUgcGFzc2VkLW9uCisJICB0eXBlIHdoaWxlIGF0IHRoaXMuCisKKzIwMTUtMTItMzEgMTE6MzM6NDUgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogc2hvdyBtZWFuaW5nZnVsIGluZm8gb24gZnJhbWUgQ1JDIGNoZWNrCisJICBBcyBDUkNzIGFyZSBjYWxjdWxhdGVkIGZvciB0aGUgY29tcGFyaXRpb24gYWxyZWFkeSwgd2UKKwkgIG1pZ2h0IGFzIHdlbGwgKGNoZWFwbHkpIGluZm9ybSB0aGUgdXNlciBob3cgdGhlIG51bWJlcnMKKwkgIGRpZmZlciBpZiBhIG1pc3NtYXRjaGVkIHBhaXIgaXMgZm91bmQuCisJICBXaGlsZSBhdCBpdDoKKwkgIFJlcGhyYXNlIGNhbmRpZGF0ZS1mcmFtZSBtZXNzYWdlIHRvIG1ha2UgbW9yZSBzZW5zZQorCisyMDE1LTEyLTMxIDAyOjQwOjQzIC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGRyb3AgcmVtYWluaW5nIHRyYWlsaW5nIHdoaXRlc3BhY2UKKworMjAxNS0xMi0zMSAwMjoxNTowNiAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBkcm9wIHN1cGVyZmxvdXMgZWxzZSBjbGF1c2VzCisKKzIwMTUtMTItMzEgMDE6MDk6NTEgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogZmFjdG9yIG91dCBidWZmZXIgdGltZSBhbmQgb2Zmc2V0IHJlc2V0dGluZworCSAgQXZvaWRzIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIHJlc2V0dGluZyBwYXR0ZXJuCisKKzIwMTUtMTItMzEgMDA6NTQ6NDggLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogbW92ZSBibG9jayBoYW5kbGluZyBieSB0eXBlIG91dCBvZiBfcGFyc2VfZnJhbWUoKQorCisyMDE1LTEwLTA3IDE4OjUxOjI1ICswOTAwICBIeXVuanVuIEtvIDx6em9vbi5rb0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcmVwbGFjZSBkdXBsaWNhdGVkIGNvZGVzIHRvIGNhbGwgbmV3IGJhc2Ugc2RwIGFwaXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDU4ODAKKworMjAxNS0xMi0zMCAxMjoxNjo1NiAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBkcm9wIHJlZHVuZGFudCByZXR1cm4gc3RhdGVtZW50IG9uIF9oZWFkZXJfaXNfdmFsaWQoKQorCSAgRml4IHRoZSByYXRoZXIgdmFndWUgZXJyb3IgbWVzc2FnZSB3aGlsZSBhdCBpdC4KKworMjAxNS0xMi0zMCAwMTo1NjoyNiAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiByZXdvcmsgZ3N0X2ZsYWNfcGFyc2VfZnJhbWVfaXNfdmFsaWQoKQorCSAgZHJvcCB1bm5lY2Vzc2FyeSBuZXN0aW5nIGxvb2tpbmcgZm9yIGVuZCBvZiBmcmFtZQorCisyMDE1LTEyLTMwIDAwOjM3OjA0IC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGZhY3RvciBvdXQgY29udGV4dCBjbGVhcmluZyByb3V0aW5lCisKKzIwMTUtMTItMjkgMTg6MDU6NTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogR3VhcmQgYWdhaW5zdCBubyBjb2RlYyBkYXRhIGluIHByb3JlcyBjYXBzIGNyZWF0aW9uCisJICBDSUQgMTM0NjUzMgorCisyMDE1LTEyLTI5IDE3OjU4OjM4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L2dzdHZweGRlYy5jOgorCSAgdnB4ZGVjOiBJbml0aWFsaXplIGJ1ZmZlciB2YXJpYWJsZSB0byBOVUxMCisJICBGYWxzZSBwb3NpdGl2ZSBidXQgdHJpdmlhbCB0byBmaXggYW5kIHBvc3NpYmx5IGNhdXNpbmcgY29tcGlsZXIgd2FybmluZ3MgYXQKKwkgIHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0b28uCisJICBDSUQgMTM0NjUzNQorCisyMDE1LTA3LTI3IDE1OjUzOjI2ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmRldmljZXByb3ZpZGVyLmM6CisJICB2NGwyZGV2aWNlcHJvdmlkZXI6IGFkZCBwcm9wZXJ0aWVzIHRvIHRoZSBkZXZpY2UKKwkgIEFkZCBwcm9wZXJ0aWVzIHRvIHRoZSBkZXZpY2Ugd2l0aCBleGFjdGx5IHRoZSBzYW1lIGtleXMgYW5kIHNlbWF0aWNzCisJICBhcyB3aGF0IHB1bHNlYXVkaW8gdXNlcyBhcyBwcm9wZXJ0eSBrZXlzLgorCSAgQWxzbyBoYW5kbGUgdGhlIGNhc2Ugd2hlbiBhIGRldmljZSBpcyBwcm9iZWQgbWFudWFsbHkgYW5kIG5vdCB0aHJvdWdoIGd1ZGV2LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvL3Nob3dfYnVnLmNnaT9pZD03NTk3ODAKKworMjAxNS0xMi0yNSAxMTo0MToxOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSAgc2NhbGV0ZW1wbzogRnJlZSB0aGUgdmFyaW91cyBidWZmZXJzIGluIEdzdEJhc2VUcmFuc2Zvcm06OnN0b3AoKQorCSAgUHJldmlvdXNseSB3ZSBsZWFrZWQgdGhlbSBjb21wbGV0ZWx5LCBidXQgYXMgdGhleSdyZSBzcGVjaWZpYyB0byB0aGUgY2FwcworCSAgZnJlZWluZyB0aGVtIGluIHN0b3AoKSBpbnN0ZWFkIG9mIGZpbmFsaXplKCkgbWFrZXMgbW9zdCBzZW5zZS4KKworMjAxNS0xMi0yNCAxNToyODowNiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjcuMSA9PT0KKworMjAxNS0xMi0yNCAxNDoxNjoyMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdnB4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDEuNy4xCisKKzIwMTUtMTItMjQgMTM6MTk6MjQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2hyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTUtMTItMjQgMTI6MjI6MzIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2NzLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSAgcG86IFVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxNS0xMi0yMSAwOTo1NzozMyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSAgcXRkZW11eDogZHJvcCBmbHVzaGVzIGZyb20gb3VyIG93biBvZmZzZXQgc2VlaworCSAgUHJldmVudHMgZG93bnN0cmVhbSBmcm9tIHJlY2VpdmluZyBmbHVzaGVzIGZvciBhIHNlZWsgb25seSBpbgorCSAgdXBzdHJlYW0uIFRob3NlIHNlZWtzIGFyZSBvbmx5IHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgcmlnaHQKKwkgIG9mZnNldCB3aGVuIHNraXBwaW5nIG9yIHJldHVybmluZyB0byBxdCBhdG9tcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTg5MjgKKworMjAxNS0xMS0xMSAxNjo1MzoxOSArMDEwMCAgVGhpYmF1bHQgU2F1bmllciA8dHNhdW5pZXJAZ25vbWUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IEFsd2F5cyBzZXQgdGhlIGNoYW5uZWwgbWFzayBmb3IgUENNIHN0cmVhbXMKKwkgIEp1c3QgdXNlIHRoZSBnc3RfYXVkaW9fY2hhbm5lbF9nZXRfZmFsbGJhY2tfbWFzayBmdW5jdGlvbiBmb3Igbm93IGFzCisJICB0aGUgc3BlY2lmaWNhdGlvbiBpcyB0b28gY29tcGxpY2F0ZWQgYW5kIG5vYm9keSBpbXBsZW1lbnRzIGl0LgorCisyMDE1LTEyLTIxIDExOjM3OjI2ICswMTAwICBUaG9tYXMgUm9vcyA8dGhvbWFzLnJvb3NAaW5kdXN0cm9uaWMuZGU+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmVjdHNvdW5kc2luazogRml4IHNsZWVwIGZvciBidWZmZXItdGltZSBsb3dlciB0aGFuIDIwMDAwMAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0ODY4MAorCisyMDE1LTEyLTIxIDEyOjMxOjE5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IFVzZSAtQnN5bWJvbGljLWZ1bmN0aW9ucyBpZiBhdmFpbGFibGUKKwkgIFdoaWxlIHRoaXMgaXMgbW9yZSB1c2VmdWwgZm9yIGxpYnJhcmllcywgc29tZSBvZiBvdXIgcGx1Z2lucyB3aXRoIG11bHRpcGxlCisJICBmaWxlcyBhbmQgc29tZSBpbnRlcm5hbCBBUEkgY2FuIGFsc28gYmVuZWZpdCBmcm9tIHRoaXMuCisKKzIwMTUtMTItMTggMTU6MzQ6NTIgKzAwMDAgIFdpbGxpYW0gTWFubGV5IDx3aWxsQHdpbGxpYW1tYW5sZXkubmV0PgorCisJKiBnc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuaDoKKwkgIHByb2dyZXNzcmVwb3J0OiBhZGQgc3VwcG9ydCBmb3IgdXNpbmcgZm9ybWF0PWJ1ZmZlcnMgd2l0aCBkby1xdWVyeT1mYWxzZQorCSAgVGhpcyBpcyB1c2VmdWwgZm9yIGludmVzdGlnYXRpbmcgYW5kIGRlYnVnZ2luZyBwaXBlbGluZXMgd2hpY2ggYXJlCisJICBwcm9kdWNpbmcgYnVmZmVycyBhdCBhIHNsb3dlci9mYXN0ZXIgcmF0ZSB0aGFuIHlvdSB3b3VsZCBleHBlY3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU5NjM1CisKKzIwMTUtMTItMTggMTU6NDk6NDMgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogVXBkYXRlIGZvcm1hdHMgdGFibGUKKwkgIFRoaXMgY2hhbmdlIGFkZCBhbGwgdGhlIG5ldyBSR0IgYmFzZWQgZm9ybWF0LiBUaG9zZSBmb3JtYXQgcmVtb3ZlcyB0aGUKKwkgIGFtYmlndWl0eSB3aXRoIHRoZSBBTFBIQSBjaGFubmVsLiBTb21lIG90aGVyIG1pc3NpbmcgbXVsdGlwbGFuYXIgZm9ybWF0CisJICBoYXMgYmVlbiBhZGRlZCB3aXRoIHNvbWUgYWRkaXRpb25hbCBjbGVhbnVwLgorCisyMDE1LTEyLTE4IDA1OjE3OjE1ICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IERvbid0IHdyaXRlIGludmFsaWQgZWRpdCBsaXN0IHN0YXJ0IHRpbWUuCisJICBBdm9pZCB3cml0aW5nIGEgbmVnYXRpdmUgbnVtYmVyIGFzIGEgbGFyZ2UgcG9zaXRpdmUKKwkgIGludGVnZXIgaW4gYW4gZWRpdCBsaXN0IHdoZW4gdGhlIGZpcnN0X3RzIGlzIHNtYWxsZXIKKwkgIHRoYW4gdGhlIGZpcnN0X2R0cyAtIHdoaWNoIGNhbiBoYXBwZW4gd2hlbiB0aGUgZmlyc3QKKwkgIHBhY2tldCByZWNlaXZlZCBoYXMgYSBQVFMgYnV0IG5vIERUUy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTk2MTUKKworMjAxNS0xMi0wNCAyMzoxNjo0NSArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IE9ubHkgdXBkYXRlIHJ1bm5pbmcgdGltZSB3aGVuIGl0IGluY3JlYXNlcy4KKwkgIERvbid0IGluY3JlbWVudCBydW5uaW5nIHRpbWUgZnJvbSBldmVyeSBidWZmZXIuIFRoZSBjb3JyZWN0CisJICBsb2dpYyB0byBvbmx5IGluY3JlbWVudCB3aGVuIHJ1bm5pbmcgdGltZSBhZHZhbmNlcyBpcyBhCisJICBsaXR0bGUgZnVydGhlciBkb3duLCBzbyBkZWxldGUgdGhpcyBsZWZ0LW92ZXIgbGluZS4KKworMjAxNS0xMS0xOCAxMTowMToyMCArMDEwMCAgVGhpYmF1bHQgU2F1bmllciA8dHNhdW5pZXJAZ25vbWUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYS1tdXg6IEltcGxlbWVudCBwcm9yZXMgc3VwcG9ydAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1ODI1OAorCisyMDE1LTExLTE4IDE2OjIwOjM4ICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBtYXRyb3NrYS1kZW11eDogUGxheSBQcm9SZXMgdmlkZW8gc3RyZWFtcworCSAgR2VuZXJhdGUgdmlkZW8veC1wcm9yZXMgY2FwcyBmb3IgUHJvUmVzIHZpZGVvIHN0cmVhbXMuCisJICBFdmVyeSBmcmFtZSBuZWVkcyBhbiA4IGJ5dGUgaGVhZGVyIHByZXBlbmRlZCwgYXMgZGVzY3JpYmVkIGluCisJICBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1BcHBsZV9Qcm9SZXMjRnJhbWVfbGF5b3V0CisJICBzbyBkbyB0aGF0IGluIGEgcG9zdC1wcm9jZXNzaW5nIGNhbGxiYWNrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1ODI1OAorCisyMDE1LTEyLTE4IDEwOjE4OjA5ICswNTMwICBSYXZpIEtpcmFuIEsgTiA8cmF2aS5raXJhbkBzYW1zdW5nLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmg6CisJICBkdmRlYzogUmVtb3ZlIHVudXNlZCBmaWVsZHMKKwkgIFJlbW92ZSB1bnVzZWQgZmllbGRzIGZyYW1lX2xlbiBhbmQgc3BhY2UKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTk2MTQKKworMjAxNS0xMi0xNyAxNjowMzowNCArMDEwMCAgVmluY2VudCBEZWhvcnMgPHZpbmNlbnQuZGVob3JzQG9wZW53aWRlLmZyPgorCisJKiBnc3QvcnRwL2dzdHJ0cGoya2RlcGF5LmM6CisJICBydHBqMmtkZXBheTogUHVzaCBvbmUgSlBFRzIwMDAgZnJhbWUgcGVyIGJ1ZmZlciwgbm90IGEgYnVmZmVyIGxpc3Qgd2l0aCBtdWx0aXBsZSBidWZmZXJzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU4OTQzCisKKzIwMTUtMTItMTYgMTE6NDM6NTggKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jOgorCSAgZHYxMzk0OiBsb2cgZXJyb3IgaWYgZmFpbGVkIHRvIHNldCBzb2NrZXQgc3RhdHVzIGZsYWcKKwkgIExvZyBhbiBlcnJvciBtZXNzYWdlIGlmIGZhaWxlZCB0byBzZXQgd3JpdGUgb3IgcmVhZCBzb2NrZXQgYXMKKwkgIG5vbi1ibG9ja2luZy4KKwkgIENJRCAxMTM5NjA4CisJICBDSUQgMTEzOTYwOQorCisyMDE1LTEyLTE1IDE3OjEwOjAwICswMDAwICBEYXZlIENyYWlnIDxkYXZlY3JhaWdAdW5iYWxhbmNlZGF1ZGlvLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0c2JjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IENoZWNrIGZvciBOVUxMIHJldHVybiB2YWx1ZSBvZiBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMoKQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1OTUwMworCisyMDE1LTEyLTE2IDA5OjM1OjUzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkgIGRvY3M6IHVwZGF0ZSB0byBnaXQKKworMjAxNS0xMi0xNSAxNDoyNzoyMiAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBleHQvdnB4L01ha2VmaWxlLmFtOgorCSAgdnB4OiBBZGQgbWlzc2luZyBoZWFkZXJzIGluIE1ha2VmaWxlLmFtCisJICBUaGlzIGZpeGVzIGRpc3RjaGVjay4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTU1MTAKKworMjAxNS0wOS0yNCAxMjo1NzowMCArMDUzMCAgUHJhc2hhbnQgR290YXJuZSA8cHMuZ290YXJuZUBzYW1zdW5nLmNvbT4KKworCSogZXh0L3ZweC9NYWtlZmlsZS5hbToKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnB4L2dzdHZwOGVuYy5oOgorCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkqIGV4dC92cHgvZ3N0dnA5ZW5jLmg6CisJKiBleHQvdnB4L2dzdHZweGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cHhlbmMuaDoKKwkgIHZweDogY3JlYXRlZCBjb21tb24gYmFzZWNsYXNzIEdzdFZQWEVuYworCSAgR3N0VlA4RW5jIGFuZCBHc3RWUDlFbmMgaGFzIGFsbW9zdCA4MCUgY29kZSBpbiBjb21tb24uCisJICBjcmVhdGVkIGNvbW1vbiBiYXNlY2xhc3MgR3N0VlBYRW5jIGZvciBHc3RWUDhFbmMgYW5kIEdzdFZQOUVuYworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NTUxMAorCisyMDE1LTEyLTE1IDEyOjU3OjUzIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC92cHgvZ3N0dnA5ZGVjLmM6CisJKiBleHQvdnB4L2dzdHZweGRlYy5jOgorCSogZXh0L3ZweC9nc3R2cHhkZWMuaDoKKwkgIHZweGRlYzogUmVtb3ZlIHVubmVlZGVkIGFkZCB2aWRlb19tZXRhCisJICBUaGlzIGFsc28gcmVtb3ZlIGNvcGllcyBmb3IgVlA4LCB3aGljaCB3YXMgbm90IGNvcnJlY3RseSBpbiBwbGFjZQorCSAgaW4gcHJldmlvdXMgcmVsYXRlZCBwYXRjaC4KKworMjAxNS0xMi0xNSAwOTo0OToyNCArMDUzMCAgUHJhc2hhbnQgR290YXJuZSA8cHMuZ290YXJuZUBzYW1zdW5nLmNvbT4KKworCSogZXh0L3ZweC9NYWtlZmlsZS5hbToKKwkqIGV4dC92cHgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnB4L2dzdHZwOGRlYy5oOgorCSogZXh0L3ZweC9nc3R2cDlkZWMuYzoKKwkqIGV4dC92cHgvZ3N0dnA5ZGVjLmg6CisJKiBleHQvdnB4L2dzdHZweGRlYy5jOgorCSogZXh0L3ZweC9nc3R2cHhkZWMuaDoKKwkgIHZweDogY3JlYXRlZCBjb21tb24gYmFzZSBjbGFzcyBHc3RWUFhkZWMgZm9yIHZweCBkZWNvZGVycworCSAgQmFzZSBjbGFzcyBmb3IgdGhlIHZwOGRlYyBhbmQgdnA5ZGVjLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NTUxMAorCisyMDE1LTA2LTEwIDA5OjE3OjA4IC0wNDAwICBYYXZpZXIgQ2xhZXNzZW5zIDx4YXZpZXIuY2xhZXNzZW5zQGNvbGxhYm9yYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IEFkZCBHVGxzSW50ZXJhY3Rpb24gcHJvcGVydHkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTA3MDkKKworMjAxNS0xMi0xNCAwOTowNTowNiAtMDUwMCAgRXZhbiBDYWxsYXdheSA8ZXZhbi5jYWxsYXdheUBpcGNvbmZpZ3VyZS5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IFJldHJ5IGNvbm5lY3Rpb24gaWYgdHVubmVsaW5nIG5lZWRzIGF1dGhlbnRpY2F0aW9uCisJICBMZXZlcmFnZSByZXNwb25zZSBmcm9tIGdzdF9ydHNwX2Nvbm5lY3Rpb25fY29ubmVjdF93aXRoX3Jlc3BvbnNlIHRvCisJICBkZXRlcm1pbmUgaWYgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIGJlIHJldHJpZWQgdXNpbmcgYXV0aGVudGljYXRpb24uICBJZgorCSAgc28sIGFkZCB0aGUgYXBwcm9wcmlhdGUgYXV0aGVudGljYXRpb24gaGVhZGVycyBiYXNlZCB1cG9uIHRoZSByZXNwb25zZQorCSAgYW5kIHJldHJ5IHRoZSBjb25uZWN0aW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0OTU5NgorCisyMDE1LTEyLTE0IDE0OjE5OjA1ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBjaGVjayBwb3J0LXJhbmdlIGZvcm1hdAorCSAgVGhlIHN0cmluZyBjb3VsZCBleGlzdCBidXQgd2l0aCBhIHdyb25nIGZvcm1hdCwgaW4gdGhhdCBjYXNlIHdlIHN0aWxsIHdhbnQKKwkgIHRvIHJlc2V0IHRoZSB2YWx1ZXMgb2YgY2xpZW50X3BvcnRfcmFuZ2UubWluIGFuZCBtYXggbGlrZSB3ZSBkbyBpZiB0aGVyZSBpcworCSAgbm8gc3RyaW5nLgorCSAgQ0lEIDExMzk1OTMKKworMjAxNS0xMi0xNCAxNDo1NToxMiArMDEwMCAgVGhvbWFzIFJvb3MgPHRob21hcy5yb29zQGluZHVzdHJvbmljLmRlPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkaXJlY3Rzb3VuZHNpbms6IENoZWNrIGRldmljZSBwcm9wZXJ0eSBhbmQgZmFpbCBpZiBkZXZpY2UgY2FuJ3QgYmUgZm91bmQKKwkgIERvbid0IHVzZSBkZWZhdWx0IGlmIGEgc3BlY2lmaWMgZGV2aWNlIGlzIHNldCBidXQgaXQgY2FuJ3QgYmUgZm91bmQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU5NDUyCisKKzIwMTUtMTItMTQgMTQ6MTU6MDAgKzAxMDAgIFRob21hcyBSb29zIDx0aG9tYXMucm9vc0BpbmR1c3Ryb25pYy5kZT4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgZGlyZWN0c291bmRzaW5rOiBGaXggaGFuZGxpbmcgb2YgdGhlIG11dGUgcHJvcGVydHkKKwkgIC0gc2V0IG11dGUgdmFsdWUgYXQgc3RhcnR1cAorCSAgLSBjb3JyZWN0IHNldCBhbmQgZ2V0IG11dGUgZnVuY3Rpb25zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1MTA2CisKKzIwMTUtMTItMTEgMTE6MjM6MTMgKzAxMDAgIFRob21hcyBSb29zIDx0aG9tYXMucm9vc0BpbmR1c3Ryb25pYy5kZT4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgZGlyZWN0c291bmRzaW5rOiBDaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIEdldFN0YXR1cygpIHRvbyB0byBkZWNpZGUgaWYgdGhlcmUgd2FzIGFuIGVycm9yCisJICBJZiBHZXRTdGF0dXMoKSBmYWlscywgdGhlIHN0YXR1cyBpdHNlbGYgd29uJ3QgYmUgdmVyeSBtZWFuaW5nZnVsIGJ1dCB3ZSBhbHNvCisJICBoYXZlIHRvIGxvb2sgYXQgaXRzIHJldHVybiB2YWx1ZS4gVGhpcyBmaXhlcyBibG9ja2luZyBwaXBlbGluZXMgd2hlbiByZW1vdmluZworCSAgc291bmQgZGV2aWNlcyBvciBkdXJpbmcgb3RoZXIgZXJyb3JzLCB3aGVyZSB3ZSB3b3VsZG4ndCBub3RpY2UgdGhlIGVycm9yIGFuZAorCSAgdGhlbiB3YWl0IGZvcmV2ZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM0MDk4CisKKzIwMTUtMTItMTAgMTc6NDE6NDYgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvYXRvbXMuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIGlzb21wNDogcmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXJzIGluIGJ1aWxkXypfZXh0ZW5zaW9uCisJICBBdG9tVFJBSyBwYXJhbWV0ZXIgaXMgbm90IHVzZWQgYnkgYnVpbGRfbW92X2FsYWNfZXh0ZW5zaW9uKCksCisJICBidWlsZF9qcDJoX2V4dGVuc2lvbigpLCBvciBidWlsZF9tb3ZfYWxhY19leHRlbnNpb24oKSAgYW5kIGNhbiBiZQorCSAgcmVtb3ZlZC4KKworMjAxNS0xMi0xMCAxNToxMTowNyArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgaXNvbXA0OiByZXBsYWNlIHZhcmlhYmxlIG9ubHkgdXNlZCBvbmNlCisJICBSZXBsYWNlIGhhc19zaGlmdCB2YXJpYWJsZSB3aXRoIHZhbHVlIHNpbmNlIGl0IGlzIG9ubHkgdXNlIG9uY2UuCisKKzIwMTUtMTItMDkgMTI6MjQ6MDkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBGaXggcGFja2V0IGRyb3BwaW5nIGFmdGVyIGEgYmlnIGRpc2NvbnQKKwkgIFdlIHdvdWxkIHF1ZXVlIDUgY29uc2VjdGl2ZSBwYWNrZXRzIGJlZm9yZSBjb25zaWRlcmluZyBhIHJlc2V0IGFuZCBhIHByb3BlcgorCSAgZGlzY29udCBoZXJlLiBJbnN0ZWFkIG9mIGV4cGVjdGluZyB0aGUgbmV4dCBvdXRwdXQgcGFja2V0IHRvIGhhdmUgdGhlIGN1cnJlbnQKKwkgIHNlcW51bSAoaS5lLiB0aGUgZmlmdGgpLCBleHBlY3QgaXQgdG8gaGF2ZSB0aGUgZmlyc3Qgc2VxbnVtLiBPdGhlcndpc2Ugd2UncmUKKwkgIGdvaW5nIHRvIGRyb3AgYWxsIHF1ZXVlZCB1cCBwYWNrZXRzLgorCisyMDE1LTEyLTA5IDExOjQ5OjAyICswNTMwICBSYXZpIEtpcmFuIEsgTiA8cmF2aS5raXJhbkBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5oOgorCSAgaW50ZXJsZWF2ZTogUmVtb3ZlIHVuc2VkIGZpZWxkCisJICBSZW1vdmUgdW51c2VkIGZpZWxkIGNvbGxlY3RfZXZlbnQgaW4gaW50ZXJsZWF2ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTkyMjYKKworMjAxNS0xMi0wNyAxNjozMzoxNCArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBTdG9wIHB1c2hpbmcgZGF0YSBhcyBzb29uIGFzIHBvc3NpYmxlIGluIHB1c2gtbW9kZQorCSAgV2hlbiB3b3JraW5nIGluIHB1c2gtbW9kZSwgd2UgYXR0ZW1wdCB0byBwdXNoIG91dCBldmVyeXRoaW5nIGN1cnJlbnRseQorCSAgYnVmZmVyZWQgaW4gdGhlIGFkYXB0ZXIuCisJICBUaGlzIGhhcyB0d28gcGl0ZmFsbHM6CisJICAqIFdlIGNvdWxkIHN0b3AgZWFybGllciAodGhlIG1vbWVudCB3ZSBnZXQgYSBub24tb2sgb3Igbm9uLW5vdC1saW5rZWQpCisJICAqIFdlIHJldHVybiB0aGUgbGFzdCBjb21iaW5lZCBmbG93IHJldHVybiwgd2hpY2ggbWlnaHQgYmUgY29tcGxldGVseQorCSAgZGlmZmVyZW50IGZyb20gdGhlIHByZXZpb3VzIGNvbWJpbmVkIGZsb3cgcmV0dXJuCisKKzIwMTUtMTItMDcgMDk6MDg6MDkgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBhdXRvZ2VuLnNoOgorCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGIzMTk5MDkgdG8gODZlNDY2MworCisyMDE1LTEyLTA3IDE0OjQxOjUxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBBZGQgYSB3YXJuaW5nIGlmIGFuIGVtcHR5IFJUQ1AgcGFja2V0IGlzIHRyaWVkIHRvIGJlIHNlbnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTkxMTkKKworMjAxNS0xMS0zMCAxOToyMDoxMyAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZweC9nc3R2cDhkZWMuaDoKKwkqIGV4dC92cHgvZ3N0dnA5ZGVjLmM6CisJKiBleHQvdnB4L2dzdHZwOWRlYy5oOgorCSAgdnB4ZGVjOiBVc2UgR3N0TWVtb3J5IHRvIGF2b2lkIGNvcGllcworCSAgV2l0aCB0aGUgVlBYIGRlY29kZXJzIGl0J3Mgbm90IHNpbXBsZSB0byB1c2UgZG93bnN0cmVhbSBidWZmZXIgcG9vbCwKKwkgIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgaW1hZ2Ugc2l6ZSBhbmQgYWxpZ25tZW50IHdoZW4gYnVmZmVycyBnZXQKKwkgIGFsbG9jYXRlZC4gV2UgY2FuIHRob3VnaCB1c2UgR3N0QWxsb2NhdG9yIChmb3IgZG93bnN0cmVhbSwgb3IgdGhlIHN5c3RlbQorCSAgYWxsb2NhdG9yKSB0byBhdm9pZCBhIGNvcHkgYmVmb3JlIHB1c2hpbmcgaWYgZG93bnN0cmVhbSBzdXBwb3J0cworCSAgR3N0VmlkZW9NZXRhLiBUaGlzIHdvdWxkIHN0aWxsIGNhdXNlIGEgY29weSBmb3Igc2luayB0aGF0IHJlcXVpcmVzCisJICBzcGVjaWFsaXplZCBtZW1vcnkgYW5kIGRvZXMgbm90IGhhdmUgYSBHc3RBbGxvY2F0b3IgZm9yIHRoYXQsIHRob3VnaAorCSAgaXQgd2lsbCBncmVhdGx5IGltcHJvdmUgcGVyZm9ybWFuY2UgZm9yIHNpbmsgbGlrZSBnbGltYWdlc2luayBhbmQKKwkgIGNsdXR0ZXJzaW5rLiBUbyBhdm9pZCBhbGxvY2F0aW5nIGZvciBldmVyeSBidWZmZXIsIHdlIGFsc28gdXNlIGEKKwkgIGludGVybmFsIGJ1ZmZlciBwb29sLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTM3MgorCisyMDE1LTExLTMwIDA4OjQyOjM1ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogQXZvaWQgb3Zlci1za2lwcGluZyB3aGVuIGNoZWNraW5nIExPQVMgY29uZmlnCisJICBUaGVyZSBtaWdodCBiZSBtdWx0aXBsZSBMT0FTIGNvbmZpZyBpbiBhIHJvdyBpbiBhIGZ1bGwgZnJhbWUuIFRoZSBmaXJzdAorCSAgb25lIG1pZ2h0IGJlIGEgbXVsdGktbGF5ZXIgY29uZmlnICh3aGljaCB3ZSBjYW4ndCBwcm9wZXJseSBwYXJzZSB5ZXQpLi4uCisJICBidXQgdGhlbiBmb2xsb3dlZCBieSBhIHZhbGlkIChzaW5nbGUtbGF5ZXIpIG9uZS4KKwkgIFRoZSBjb2RlIHdhcyBwcmV2aW91c2x5IHNraXBwaW5nIHdob2xlIGZyYW1lcyAoaW5zdGVhZCBvZiBqdXN0IHRoZSBMT0FTCisJICBjb25maWcgd2UgZmFpbGVkIHRvIHJlYWQpIHJlc3VsdGluZyBpbiBtdWx0aXBsZSBmcmFtZXMgKHNlZW4gdXAgdG8gNnMgaW4KKwkgIHNvbWUgc2l0dWF0aW9uKSBiZWluZyBkcm9wcGVkIGJlZm9yZSBmaW5hbGx5IGdldHRpbmcgdGhlIGNvbmZpZ3VyYXRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU4ODI2CisKKzIwMTUtMTEtMjUgMTc6MDg6NTYgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBQcm9wZXJseSBzZXQgU1BBUlNFIHN0cmVhbSBmbGFncyBmb3Igc3VicGljdHVyZS9zdWJ0aXRsZQorCSAgQW5kIHdoaWxlIHdlJ3JlIGF0IGl0LCBhbHNvIGRldGVjdCAnRFhTQScgYXMgYmVpbmcgYSB2YXJpYW50IGZvdXJjYworCSAgb2YgJ0RYU0InIGZvciBYU1VCCisKKzIwMTUtMTEtMzAgMjE6MjM6NTIgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkgIHRlc3RzOiBzb3VwaHR0cHNyYzogZ3JhbW1hciBmaXgKKworMjAxNS0xMS0zMCAyMTowMToxNyAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSAgdGVzdHM6IHNvdXBodHRwc3JjOiBzd2l0Y2ggc2hvdXRjYXN0IHN0cmVhbSBwcm92aWRlcgorCSAgRml4ZXMgZmFpbGluZyBJQ1kgdGVzdC4gUHJldmlvdXMgcHJvdmlkZXIgaGFzCisJICBzdHJlYW1pbmcgZGlzYWJsZWQgb3V0c2lkZSBVSy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTgxMTQKKworMjAxNS0xMS0xOCAxNjoxMDoxMSArMDEwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IGRvbid0IGNyYXNoIGlmIHdlIG5ldmVyIGdvdCBhdWRpbyBjYXBzIGJlZm9yZSBzdG9wcGluZworCSAgYXVkcy5ibG9ja2FsaWduIGlzIHNldCBvbmNlIHRoZSBmaXJzdCBjYXBzIGFycml2ZS4gSWYKKwkgIGdzdF9hdmlfbXV4X3N0b3BfZmlsZSgpIGlzIGNhbGxlZCBiZWZvcmUgdGhpcyBoYXBwZW5zIHRoZW4gYXVkcy5ibG9ja2FsaWduCisJICBpcyB6ZXJvIGFuZCBnc3RfYXZpX211eF9hdWRzaW5rX3NldF9maWVsZHMoKSBjYXVzZSBhIGNyYXNoOgorCSAgWy4uLl0KKwkgIGF2aXBhZC0+cGFyZW50Lmhkci5yYXRlID0gYXZpcGFkLT5hdWRzLmF2X2JwcyAvIGF2aXBhZC0+YXVkcy5ibG9ja2FsaWduOworCSAgWy4uLl0KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTg5MTIKKworMjAxNS0xMi0wMSAxODoyMDoyMyArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogZG9uJ3QgYmxvY2sgd2hlbiByZXN1cmVjdGluZyBhIGJ1ZmZlcgorCSAgV2hlbiB3ZSBhcmUgcmVzdXJlY3RpbmcgYSBidWZmZXIsIGRvbid0IGJsb2NrLiBpbnN0ZWFkIGxldCB1cyBjb3B5IGEKKwkgIGJ1ZmZlci4KKworMjAxNS0xMi0wMSAwMDozMDowOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiByZW1vdmUgZXh0cmEgdmFyaWFibGUgdG8gaW1wcm92ZSByZWFkYWJpbGl0eQorCSAgTWFrZXMgaXQgZWFzaWVyIHRvIHNlZSB0aGF0IHRoZSBldmVudCBpcyBiZWluZyByZXBsYWNlZC91bnJlZmVkCisKKzIwMTUtMTItMDEgMDA6MjI6MzYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogcmVzcGVjdCBzZXFudW0gaW4gc2VlayBldmVudHMKKwkgIFByb3BhZ2F0ZSB0aGUgb3JpZ2luYWwgc2VlayBzZXFudW0gdG8gZXZlbnRzIG9yaWdpbmF0ZWQgZnJvbQorCSAgc2Vla2luZyB0byBtYWtlIHN1cmUgdGhleSBoYXZlIHRoZSBzYW1lIHZhbHVlCisKKzIwMTUtMTItMDEgMDA6MDM6MjEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogZmx1c2ggdXBzdHJlYW0gd2hlbiBzZWVraW5nIGluIHB1bGwgbW9kZQorCSAgTWFrZXMgc3VyZSB1cHN0cmVhbSB3aWxsIHVuYmxvY2sgYW5kIHJldHVybiB0aGUgdGhyZWFkIHNvIHRoYXQKKwkgIHNlZWtpbmcgY2FuIGNvbnRpbnVlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU4ODYxCisKKzIwMTUtMTEtMjcgMDk6Mjc6MjkgKzAxMDAgIEFudG9uIEJvbmRhcmVua28gPGFudG9uYm9AYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogYWRkICJzZW5kIFNQUy9QUFMgd2l0aCBldmVyeSBrZXkgZnJhbWUiIG1vZGUKKwkgIEl0J3Mgbm90IGVub3VnaCB0byBoYXZlIHRpbWVvdXQgb3IgZXZlbnQgYmFzZWQgU1BTL1BQUyBpbmZvcm1hdGlvbiBzZW50CisJICBpbiBSVFAgcGFja2V0cy4gVGhlcmUgYXJlIHNvbWUgc2NlbmFyaW9zIHdoZW4ga2V5IGZyYW1lcyBtYXkgYXBwZWFyCisJICBtb3JlIGZyZXF1ZW50bHkgdGhhbiBvbmNlIGEgc2Vjb25kLCBpbiB3aGljaCBjYXNlIHRoZSBtaW5pbXVtIHRpbWVvdXQKKwkgIGZvciAiY29uZmlnLWludGVydmFsIiBvZiAxIHNlY29uZCBmb3Igc2VuZGluZyBTUFMvUFBTIGlzIG5vdCBzdWZmaWNpZW50LgorCSAgSXQgbWlnaHQgYWxzbyBiZSBkZXNpcmFibGUgaW4gZ2VuZXJhbCB0byBtYWtlIHN1cmUgdGhlIFNQUy9QUFMgaXMKKwkgIGF2YWlsYWJsZSB3aXRoIGV2ZXJ5IGtleWZyYW1lIChwYWNrZXQgbG9zcyBhc2lkZSksIHNvIHJlY2VpdmVycyBjYW4KKwkgIGFjdHVhbGx5IHBpY2sgdXAgZGVjb2RpbmcgaW1tZWRpYXRlbHkgZnJvbSB0aGUgZmlyc3Qga2V5ZnJhbWUgaWYKKwkgIFNQUy9QUFMgaXMgbm90IHNpZ25hbGVkIG91dCBvZiBiYW5kLgorCSAgVGhpcyBwYXRjaCBhZGRzIHRoZSBwb3NzaWJpbGl0eSB0byBzZW5kIFNQUy9QUFMgd2l0aCBldmVyeSBrZXkgZnJhbWUuIFRoaXMKKwkgIG1vZGUgY2FuIGJlIGVuYWJsZWQgYnkgc2V0dGluZyAiY29uZmlnLWludGVydmFsIiBwcm9wZXJ0eSB0byAtMS4gSW4gdGhpcworCSAgY2FzZSB0aGUgcGF5bG9hZGVyIHdpbGwgYWRkIFNQUyBhbmQgUFBTIGJlZm9yZSBldmVyeSBrZXkgKElEUikgZnJhbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU3ODkyCisKKzIwMTUtMTEtMjcgMDk6MDM6NTEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgcnRwaDI2NHBheTogY2hhbmdlIGNvbmZpZy1pbnRlcnZhbCBwcm9wZXJ0eSB0eXBlIGZyb20gdWludCB0byBpbnQKKwkgIFRoaXMgd2F5IHdlIGNhbiB1c2UgLTEgYXMgc3BlY2lhbCB2YWx1ZSwgd2hpY2ggaXMgbmljZXIgdGhhbiBNQVhVSU5ULgorCSAgVGhpcyBpcyBiYWNrd2FyZHMgY29tcGF0aWJsZSBldmVuIHdpdGggdGhlIEdWYWx1ZSBBUEksIGFzIHNob3duIGJ5CisJICBhIHVuaXQgdGVzdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTc4OTIKKworMjAxNS0xMS0yNiAyMTo0NjoxMSArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgc3VwcG9ydCBmb3IgT3B1cworCSAgQWRkIHN1cHBvcnQgZm9yIGRlbXV4aW5nIE9wdXMgZW5jYXBzdWxhdGVkIGluIE1QNCBmaWxlcywgYmFzZWQgb24gdGhlCisJICBmb2xsb3dpbmcgc3BlYzogaHR0cHM6Ly93d3cub3B1cy1jb2RlYy5vcmcvZG9jcy9vcHVzX2luX2lzb2JtZmYuaHRtbAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MjY0MworCisyMDE1LTExLTI1IDIyOjQ4OjMyICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHVzZSBtYWNybyBmb3IgY29kZWNfbmFtZQorCSAgVXNlIF9jb2RlYygpIG1hY3JvIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgY29kZS4KKworMjAxNS0wMy0yNSAxNjozMjo1NSArMDEwMCAgUGhpbGlwcCBaYWJlbCA8cC56YWJlbEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmM6CisJICB2NGwyOiB2aWRlb2RlYzogY2hvb3NlIGZvcm1hdCBmcm9tIGNhcHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzM4MjcKKworMjAxNS0wMy0yNyAxNTowMjozMyArMDEwMCAgUGhpbGlwcCBaYWJlbCA8cC56YWJlbEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgdjRsMjogYWRkIGdzdF92NGwyX29iamVjdF9wcm9iZV9jYXBzCisJICBBZGQgYSB2YXJpYW50IG9mIGdzdF92NGwyX29iamVjdF9nZXRfY2FwcyB0aGF0IGJ5cGFzc2VzIHRoZSBwcm9iZWRfY2FwcyBjYWNoZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzM4MjcKKworMjAxNS0xMS0xOSAxNzoyMDo1NSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJICB2NGwyLXByb2JlOiBTa2lwIGRldmljZXMgd2l0aG91dCBzdXBwb3J0ZWQgZm9ybWF0cworCisyMDE1LTExLTEzIDEyOjM1OjU5IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkgIHY0bDI6IFRyYWNrIC9kZXYvdmlkZW8qIHRvIHRyaWdnZXJlZCByZXF1aXJlZCBwcm9iZQorCSAgSWYgc29tZXRoaW5nIGluIC9kZXYvdmlkZW8qIGdldCBhZGRlZCwgcmVtb3ZlZCBvciByZXBsYWNlZCwgd2UgbmVlZCB0bworCSAgcHJvYmUgdGhlIGRldmljZXMgYWdhaW4gaW4gb3JkZXIgdG8gZW5zdXJlIHRoZSBkeW5hbWljIGRldmljZXMgYXJlIHVwIHRvCisJICBkYXRlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1ODA4NQorCisyMDE1LTExLTI1IDE0OjUxOjQwICsxMTAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwbWFuYWdlcjogcnRwc2Vzc2lvbjogZG9uJ3Qgc2VuZCBlbXB0eSBSVENQIHBhY2tldHMKKwkgIGdlbmVyYXRlX3J0Y3AgY2FuIHByb2R1Y2UgZW1wdHkgcGFja2V0cyB3aGVuIHJlZHVjZWQgc2l6ZSBSVENQIGlzIHR1cm5lZCBvbi4KKwkgIFNraXAgdGhlbSBzaW5jZSBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcHVzaCB0aGVtIGFuZCB0aGV5IGNhdXNlIGVycm9ycyB3aXRoCisJICBlbGVtZW50cyB0aGF0IGV4cGVjdCBSVENQIHBhY2tldHMgdG8gY29udGFpbiBkYXRhIChsaWtlIHNydHBlbmMpLgorCisyMDE1LTExLTI0IDEwOjU3OjI4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVzdG9yZSB0aGUgc2VnbWVudCBvbiBjYXNlIG9mIHNvZnQgcmVzZXQKKwkgIFdoZW4gc2Vla2luZyBiYWNrIHRvIHJlc3RvcmUgdGhlIG1kYXQgcG9zaXRpb24gYSBmbHVzaCBpcyBwdXNoZWQKKwkgIHRocm91Z2ggYW5kIGl0IHJlc2V0cyBkb3duc3RyZWFtIHNlZ21lbnQgaW5mb3JtYXRpb24uIE1ha2Ugc3VyZQorCSAgdGhhdCBhZnRlciB0aGUgZmx1c2ggKHRoYXQgZG9lcyBhIHNvZnQgcmVzZXQpIGEgc2VnbWVudCB3aWxsCisJICBiZSBwdXNoZWQgYWdhaW4KKwkgIEZpeGVzIHJlZ3Jlc3Npb25zIHNwb3R0ZWQgYXQKKwkgIGh0dHBzOi8vY2kuZ3N0cmVhbWVyLm5ldC9qb2IvR1N0cmVhbWVyLW1hc3Rlci12YWxpZGF0ZS8yMTAwLworCisyMDE1LTExLTIwIDEyOjQ0OjIyICswMDAwICBHcmFoYW0gTGVnZ2V0dCA8bWluZnJpbkBzaGFycC5mbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICBtdWx0aWZpbGVzaW5rOiBmaXggc3BlbGxpbmcgb2YgdmFyaWFibGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTgzOTAKKworMjAxNS0xMS0yMCAxMTowNTo1MSArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdW5pdGUgZHVwbGljYXRlIEZvdXJDQworCSAgVW5pdGUgaW4gZm91cmNjLmggdGhlIEZvdXJDQ3MgdGhhdCBhcmUgdXNlZCB0d2ljZSBvciBtb3JlIGluIHF0ZGVtdXgKKworMjAxNS0xMS0xOSAxNTozMzo0NSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDI6IEZpeCBjYXB0dXJlL291dHB1dC1pby1tb2RlIHByb3BlcnRpZXMKKwkgIFRoZXJlIHdhcyBzb21lIG1pc3MtbWF0Y2ggaW4gdGhlIGltcGxlbWVudGF0aW9uLiBUaGlzIG1ha2VzIGl0CisJICBjb25jaXN0ZW50LCB0aG91Z2ggZnVuY3Rpb25hbGx5IGl0IHdvcmtlZCwgZXhjZXB0IHRoZSB2aWRlbyBkZWNvZGVyCisJICBvdXRwdXQtaW8tbW9kZSBnZXR0ZXIuCisKKzIwMTUtMTEtMTkgMTk6NDg6MDYgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkgIGF0b21zOiByZW1vdmUgdW51c2VkIGFyZ3VtZW50IG9mIGJ1aWxkX21vdl93YXZlX2V4dGVuc2lvbigpCisJICBBdG9tVHJhayAqIHRyYWsgYXJndW1lbnQgb2YgYnVpbGRfbW92ZV93YXZlX2V4dGVuc2lvbigpIGlzbid0IHVzZWQuCisJICBSZW1vdmluZyBpdC4KKworMjAxNS0xMS0xOSAxOToyODoyMCArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVtb3ZlIGR1cGxpY2F0ZSBGb3VyQ0MKKwkgIFVzZSB0aGUgYXZhaWxhYmxlIEZvdXJDQ3MgaW4gZm91cmNjLmggaW5zdGVhZCBvZiBkdXBsaWNhdGluZyB0aGVtLgorCisyMDE1LTExLTE5IDE4OjM2OjM5ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgaXNvbXA0OiBjZW50cmFsaXplIGFsbCBGb3VyQ0MKKwkgIDEwIEZvdXJDQ3MgZ2VuZXJhdGVkIHdpdGggR1NUX01BS0VfRk9VUkNDKCkgaW4gZ3N0cXRtdXguYyBhbmQgYXRvbXMuYworCSAgYWxyZWFkeSBleGlzdCBpbiBmb3VyY2MuaC4gRG9uJ3QgZHVwbGljYXRlIHRoZXNlIGFuZCB1c2UgdGhlbSBkaXJlY3RseS4KKwkgIFBsdXMgbW92aW5nIDYgdG8gZm91cmNjLmgsIHRvIGNlbnRyYWxpemUgdGhlbSBhbGwuCisKKzIwMTUtMTEtMTkgMTc6MzI6MTIgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS93ZWJtLW11eC5jOgorCSAgbWF0cm9za2Evd2VibW11eDogZml4IG91dGRhdGVkIGV4YW1wbGUgbGF1bmNoIGxpbmVzCisJICBVcGRhdGUgZ3N0LWxhdW5jaC0wLjEwIGxpbmVzIHRvIGdzdC1sYXVuY2gtMS4wCisKKzIwMTUtMTEtMTYgMTM6MjY6NTAgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvYXRvbXMuaDoKKwkqIGdzdC9pc29tcDQvZm91cmNjLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJICBpc29tcDQ6IGFkZCBzdXBwb3J0IGZvciBPcHVzIGluIG1wNG1wdXgKKwkgIEFkZCBzdXBwb3J0IGZvciBtdXhpbmcgTVA0IGZpbGVzIGNvbnRhaW5pbmcgT3B1cy4gQmFzZWQgb24gdGhlIHNwZWMKKwkgIGRldGFpbGVkIGhlcmU6CisJICBodHRwczovL3d3dy5vcHVzLWNvZGVjLm9yZy9kb2NzL29wdXNfaW5faXNvYm1mZi5odG1sCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQyNjQzCisKKzIwMTUtMTEtMTggMTk6MTA6NTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogUmVwbGFjZSB0YWJzIHdpdGggc3BhY2VzCisKKzIwMTUtMTEtMTggMTk6MDc6NTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQ2FzdCB0byBzaWduZWQgaW50ZWdlcnMgdG8gcHJldmVudCB1bnNpZ25lZCBjb21wYXJlIGJldHdlZW4gbmVnYXRpdmUgYW5kIHBvc2l0aXZlIG51bWJlcnMKKwkgIFRoaXMgZml4ZXMgc2Vla2luZyBpZiB0aGUgZmlyc3QgZW50cmllcyBpbiB0aGUgc2FtcGxlcyB0YWJsZSBhcmUgbmVnYXRpdmUuIFRoZQorCSAgYmluYXJ5IHNlYXJjaCB3b3VsZCBhbHdheXMgZmFpbCBvbiB0aGlzIGFzIHRoZSBhcnJheSB3b3VsZCBub3QgYmUgc29ydGVkIGlmCisJICBpbnRlcnByZXRpbmcgdGhlIG5lZ2F0aXZlIG51bWJlcnMgYXMgaHVnZSBwb3NpdGl2ZSBudW1iZXJzLiBUaGlzIGNhdXNlZCB1cyB0bworCSAgYWx3YXlzIG91dHB1dCBidWZmZXJzIGZyb20gdGhlIGJlZ2lubmluZyBhZnRlciBhIHNlZWsgaW5zdGVhZCBvZiBjbG9zZSB0byB0aGUKKwkgIHNlZWsgcG9zaXRpb24uCisJICBBbHNvIGFkZCBhIGNhc2UgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gZm9yIGVxdWFsaXR5LgorCisyMDE1LTExLTE4IDE2OjAxOjQ4ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogcmVtb3ZlIGR1cGxpY2F0ZSBjaGVjaworCSAgV2Ugd2FudCAxIG9yIDIgc3RyZWFtaGVhZGVycywgdGhlIGNoZWNrICBpZiAoYnVmYXJyLT5sZW4gIT0gMSAmJgorCSAgYnVmYXJyLT5sZW4gIT0gMikgaXMgZW5vdWdoLiBOb3QgbmVlZCB0byBjaGVjayBpZiBidWZhcnItPmxlbiBpcyA8PSAwIG9yCisJICA+IDI1NS4KKworMjAxNS0xMS0xOCAxNDo0ODozNiArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJICBzb3VwaHR0cGNsaWVudHNpbms6IEZpeCBlcnJvciBsZWFrIGFuZCBoYW5kbGUgZXJyb3IKKwkgIGdfdGhyZWFkX3RyeV9uZXcgYWxsb3dzIGZvciBwb3NzaWJsaXR5IG9mIGZhaWx1cmVzLiBJbiBjYXNlIGl0IGZhaWxzLAorCSAgZXJyb3IgaXMgbm90IGhhbmRsZWQgYW5kIGxlYWtlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTgyNjAKKworMjAxNS0xMS0xNSAxNzoxNjoyOSAtMDgwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmM6CisJICBydHBnc3RkZXBheTogUHJvcGVybHkgaGFuZGxlIGJhY2t3YXJkIGNvbXBhdCBmb3IgZXZlbnQgZGVzZXJpYWxpemF0aW9uCisJICBBY3R1YWwgY29kZSBpcyBjaGVja2luZyBmb3IgYSBOVUxMIHRlcm1pbmF0b3IgYW5kIGEgJzsnIHRlcm1pbmF0b3IsCisJICBmb3IgYmFja3dhcmQgY29tcGF0LCBpbiBhIGNoYWluZWQgd2F5IHRoYXQgY2F1c2UgYWxsIGV2ZW50cyBiZWluZyByZWplY3RlZC4KKwkgIFRoZSBwcm9wZXIgY29uZGl0aW9uIGlzIHRvIHJlamVjdCB0aGUgZXZlbnRzIHdoZW4gdGVybWluYXRvciBpc24ndAorCSAgaW4gWydcMCcsICc7J10gc2V0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1ODE1MQorCisyMDE1LTExLTE1IDE3OjExOjAyIC0wODAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJICB0ZXN0czogcnRwLXBheWxvYWRpbmc6IFRlc3QgZm9yIGhhbmRsaW5nIG9mIGN1c3RvbSBldmVudHMgaW4gcnRwZ3N0CisJICBBZGQgYSBzaW1wbGUgdGVzdCB0aGF0IGNoZWNrcyBwcm9wZXIgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24KKwkgIG9mIGN1c3RvbSBldmVudHMgd2l0aCBydHBnc3RwYXkgYW5kIHJ0cGdzdGRlcGF5LgorCisyMDE1LTExLTE2IDE2OjIzOjQzIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnB4L2dzdHZwOWRlYy5jOgorCSAgdnB4ZGVjOiBVc2UgdGhyZWFkcyBvbiBtdWx0aS1jb3JlIHN5c3RlbXMKKwkgIFRoaXMgYWRkcyBhbiBhdXRvbWF0aWMgbW9kZSB0byB0aGUgdGhyZWFkcyBwcm9wZXJ0eSBvZiB2cHhkZWMgaW4gb3JkZXIgdG8KKwkgIHVzZSBhcyBtYW55IHRocmVhZHMgYXMgdGhlcmUgaXMgQ1BVIG9uIHRoZSBwbGF0Zm9ybS4gVGhpcyBicmluZ3MgYmFjaworCSAgR1N0cmVhbWVyIFZQWCBkZWNvZGluZyBwZXJmb3JtYW5jZSBjbG9zZXIgdG8gd2hhdCBpcyBhY2hpZXZlZCBieSBvdGhlcgorCSAgcGxheWVycywgaW5jbHVkaW5nIENocm9taXVtLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1ODE5NQorCisyMDE1LTExLTE2IDEwOjU4OjMyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogb25seSBzZW5kIGluaXRpYWwgZ2FwcyBmb3Igbm9uLWZyYWdtZW50ZWQgc3RyZWFtcworCSAgSXQgd291bGQgYmUgdW51c3VhbCB0byBoYXZlIHRoZSBoZWFkZXIgc2VnbWVudCB3aXRoIGFuICdlZHRzJyBhdG9tCisJICBpbmRpY2F0aW5nIGdhcHMgYXQgdGhlIGJlZ2lubmluZyB3aGVuIGhhbmRsaW5nIGZyYWdtZW50ZWQgc3RyZWFtcy4KKwkgIFRoZSBoZWFkZXIgdXN1YWxseSBkb2Vzbid0IGNvbnRhaW4gYW55IHRpbWVzdGFtcGluZyBpbmZvcm1hdGlvbiwgdGhpcworCSAgc2hvdWxkIGNvbWUgZnJvbSB0aGUgcGxheWxpc3QvbWFuaWZlc3QgYW5kIHRoZSBzZWdtZW50cyB3aXRoIG1lZGlhCisJICBpbiB0aG9zZSBzY2VuYXJpb3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU4MTcxCisKKzIwMTUtMTEtMTcgMDk6NDE6MzQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBSZXZlcnQgIlJldmVydCAicXRkZW11eDogcmVzcGVjdCBxdCBzZWdtZW50cyBpbiBwdXNoLW1vZGUgZm9yIGVtcHR5IHN0YXJ0cyIiCisJICBUaGlzIHJldmVydHMgY29tbWl0IGQ4NDJmZjI4OGE5ZDAxMjE0YTA0NmJlY2JmZDljYmZmM2E0YWNlYTAuCisJICBUaGlzIHdhcyByZXZlcnRlZCBieSBhY2NpZGVudAorCisyMDE1LTExLTE3IDEyOjM5OjA1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkgIHVkcHNyYzogQWRkICJsb29wIiBwcm9wZXJ0eSBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIG11bHRpY2FzdCBsb29wYmFjaworCSAgT24gUE9TSVgsIElQX01VTFRJQ0FTVF9MT09QIGlzIGEgc2V0dGluZyBmb3IgdGhlIHNlbmRlciBzb2NrZXQuIE9uIFdpbmRvd3MgaXQKKwkgIGlzIGEgc2V0dGluZyBmb3IgdGhlIHJlY2VpdmVyIHNvY2tldC4gQXMgc3VjaCB3ZSB3aWxsIG5lZWQgaXQgb24gdWRwc3JjIHRvbyB0bworCSAgYWxsb3cgZmlsdGVyaW5nIG91dCBvdXIgb3duIG11bHRpY2FzdCBwYWNrZXRzLgorCisyMDE1LTExLTE2IDEzOjUyOjA1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIFJldmVydCAicXRkZW11eDogcmVzcGVjdCBxdCBzZWdtZW50cyBpbiBwdXNoLW1vZGUgZm9yIGVtcHR5IHN0YXJ0cyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgMTQyZDhlMmQyM2U1NjAyZTczODI5NzdhZjEwNDNkNjIxNjI1ZjhjOC4KKworMjAxNS0xMS0xNiAxNjo1NjowNCArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBGaXggc3RyaW5nIG1lbW9yeSBsZWFrCisJICBUaGUgc3RyaW5nIGdvdCB1c2luZyBnX3N0cmR1cF9wcmludGYgd2lsbCBiZSBhbGxvY2F0ZWQgbWVtb3J5CisJICBhbmQgc2hvdWxkIGJlIGZyZWVkIGFmdGVyIHVzZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTgxNjEKKworMjAxNS0xMS0xNCAyMTo1MToxMSAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyL29iamVjdDogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2sgYmVmb3JlIGdfZnJlZSgpCisKKzIwMTUtMTEtMTQgMjE6NDU6MjkgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkgIG9zc3NyYzogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2sgYmVmb3JlIGdfZnJlZSgpCisKKzIwMTUtMTEtMTQgMjE6NDM6MjQgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc3JjLmM6CisJICBzdW5hdWRpb3NyYzogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2tzIGJlZm9yZSBnX2ZyZWUoKQorCisyMDE1LTExLTE0IDIxOjM2OjMwIC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IHJlbW92ZSB1bm5lY2Vzc2FyeSBOVUxMIGNoZWNrcyBiZWZvcmUgZ19mcmVlKCkKKworMjAxNS0xMS0xNCAyMTozMTowOCAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2tzIGJlZm9yZSBnX2ZyZWUoKQorCisyMDE1LTExLTE0IDIxOjI2OjIxIC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2EvcmVhZC1jb21tb246IHJlbW92ZSB1bm5lY2Vzc2FyeSBOVUxMIGNoZWNrcyBiZWZvcmUgZ19mcmVlKCkKKworMjAxNS0xMS0xNCAyMDo0MzoxMCAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJICBpc29tcDQvYXRvbXM6IHJlbW92ZSB1bm5lY2Vzc2FyeSBOVUxMIGNoZWNrcyBiZWZvcmUgZ19mcmVlKCkKKworMjAxNS0xMS0xNCAyMDozNTo1NCAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgcnRwL3RoZW9yYXBheTogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2tzIGJlZm9yZSBnX2ZyZWUoKQorCisyMDE1LTExLTE0IDIwOjMzOjU0IC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJICBydHAvdm9yYmlzcGF5OiByZW1vdmUgdW5uZWNlc3NhcnkgTlVMTCBjaGVja3MgYmVmb3JlIGdfZnJlZSgpCisKKzIwMTUtMTEtMTQgMjA6MzE6MzQgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBydHAvanBlZ3BheTogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2tzIGJlZm9yZSBnX2ZyZWUoKQorCisyMDE1LTExLTE0IDIwOjI3OjA0IC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJICBydHBnc3RwYXk6IHJlbW92ZSB1bm5lY2Vzc2FyeSBOVUxMIGNoZWNrcyBiZWZvcmUgZ19mcmVlKCkKKworMjAxNS0xMS0xNCAyMDoyMjowOSAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiByZW1vdmUgdW5uZWNlc3NhcnkgTlVMTCBjaGVja3MgYmVmb3JlIGdfZnJlZSgpCisKKzIwMTUtMTEtMTQgMjA6MTQ6MjUgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2ZseC9nc3RmbHhkZWMuYzoKKwkgIGZseGRlYzogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2sgYmVmb3JlIGdfZnJlZSgpCisKKzIwMTUtMTEtMTQgMjA6MDk6NTQgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2VmZmVjdHYvZ3N0b3AuYzoKKwkgIGVmZmVjdHYvb3B0djogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2tzIGJlZm9yZSBnX2ZyZWUoKQorCisyMDE1LTExLTE0IDIwOjA1OjAzIC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzoKKwkgIGVmZmVjdHYvc2hhZ2FkZWxpY3R2OiByZW1vdmUgdW5uZWNlc3NhcnkgTlVMTCBjaGVja3MgYmVmb3JlIGdfZnJlZSgpCisKKzIwMTUtMTEtMTQgMjA6MDE6NDMgLTA4MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmM6CisJICBlZmZlY3R2L3JpcHBsZTogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2tzIGJlZm9yZSBnX2ZyZWUoKQorCisyMDE1LTExLTE0IDE5OjU2OjU3IC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkgIGVmZmVjdHYvcmFkaW9hYzogcmVtb3ZlIHVubmVjZXNzYXJ5IE5VTEwgY2hlY2tzIGJlZm9yZSBnX2ZyZWUoKQorCisyMDE1LTExLTE0IDE5OjUyOjEyIC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHN0cmVhay5jOgorCSAgZWZmZWN0di9zdHJlYWs6IHJlbW92ZSB1bm5lY2Vzc2FyeSBOVUxMIGNoZWNrIGJlZm9yZSBnX2ZyZWUoKQorCisyMDE1LTExLTE0IDE3OjA0OjU1IC0wODAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyZXluYWxkb0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6CisJICBzaG91dDI6IHJlbW92ZSB1bm5lY2Vzc2FyeSBOVUxMIGNoZWNrcyBiZWZvcmUgZ19mcmVlKCkKKworMjAxNS0xMS0xNCAxNjo1NzoxMyAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOWVuYy5jOgorCSAgdnA5ZW5jOiByZW1vdmUgdW5uZWNlc3NhcnkgTlVMTCBjaGVjayBiZWZvcmUgZ19mcmVlKCkKKworMjAxNS0xMS0xNCAxNjo1NDo0MiAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSAgdnA4ZW5jOiByZW1vdmUgdW5uZWNlc3NhcnkgTlVMTCBjaGVjayBiZWZvcmUgZ19mcmVlKCkKKworMjAxNS0xMS0xNCAxNjoyMDozMyAtMDgwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IHJlbW92ZSB1bm5lY2Vzc2FyeSBOVUxMIGNoZWNrcyBiZWZvcmUgZ19mcmVlKCkKKworMjAxNS0xMS0xMyAxMzozNDowMiArMDEwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogYWRkIHN1cHBvcnQgb2YgTlYxNiwgTlY2MSBhbmQgTlYyNCBmb3JtYXRzCisJICBNYXBwZWQgcmVzcGVjdGl2ZWx5IHRvIFY0TDJfUElYX0ZNVF9OVjE2L1Y0TDJfUElYX0ZNVF9OVjE2TSwKKwkgIFY0TDJfUElYX0ZNVF9OVjYxLFY0TDJfUElYX0ZNVF9OVjYxTSBhbmQgVjRMMl9QSVhfRk1UX05WMjQgdjRsMiBmb3JtYXRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1ODA1OAorCisyMDE1LTExLTExIDE0OjEwOjUzICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4cGFydHJlYWRlci5jOgorCSAgc3BsaXRtdXhwYXJ0cmVhZGVyOiBGaXggR0NvbmQgbGVhaworCSAgaW5hY3RpdmVfY29uZCBpcyBub3QgYmVpbmcgY2xlYXJlZCByZXN1bHRpbmcgaW4gbWVtb3J5IGxlYWsuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU3OTI0CisKKzIwMTUtMDgtMDYgMTI6NDQ6MjAgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGZpeCBvdXRwdXQgc3RhdGUgbWVtb3J5IGxlYWsKKwkgIFdoZW4ganBlZ19maW5pc2hfZGVjb21wcmVzcyBpcyBjYWxsZWQsIG91dHB1dCBzdGF0ZSByZWZlcmVuY2UgaXMgYmVpbmcgY3JlYXRlZC4KKwkgIEJ1dCBpZiB0aGVyZSBpcyBhbnkgZmFpbHVyZXMgaW4gZmluaXNoaW5nIGRlY29tcHJlc3MsIGl0IGp1bXBzIHRvIHNldGptcCwKKwkgIGFuZCBhdCB0aGF0IHBvaW50IHN0YXRlIHdhcyBub3QgcmVmZXJlbmNlZC4gUmVzdWx0aW5nIGluIGxlYWsgb2Ygb3V0cHV0IHN0YXRlLgorCSAgSGVuY2UgYWRkaW5nIGFub3RoZXIgc2V0am1wIGFmdGVyIG91dHB1dCBzdGF0ZSBpcyByZWZlcmVuY2VkLgorCSAgU2ltaWxhcmx5IGFkZGluZyBhbm90aGVyIHNldGptcCB0byB1bm1hcCB0aGUgZnJhbWUgaW4gY2FzZSBlcnJvciBoYXBwZW5zIGJlZm9yZQorCSAgZmluaXNoX2RlY29tcHJlc3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTMwODcKKworMjAxNS0wOC0xMCAxMToyMzo0NSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJlc3BlY3QgcXQgc2VnbWVudHMgaW4gcHVzaC1tb2RlIGZvciBlbXB0eSBzdGFydHMKKwkgIEluIHB1c2gtbW9kZSBpdCBpcyBoYXJkIHRvIHN1cHBvcnQgcXQgc2VnbWVudHMgb3ZlcmFsbCBidXQgaXQgaXMKKwkgIHBvc3NpYmxlIHRvIHN1cHBvcnQgd2hlbiB0aGUgZmlsZSBpc24ndCBoZWF2aWx5IGVkaXRlZCBidXQganVzdCBjb250YWluCisJICBhIHNlZ21lbnQgdG8gaW5kaWNhdGUgYSBnYXAgYXQgdGhlIGJlZ2lubmluZy4gVGhpcyBhbHNvIGFsbG93cyBwcm9wZXJseQorCSAgdGltZXN0YW1waW5nIGRhdGEgdGhhdCBoYXMgbmVnYXRpdmUgRFRTIGluIHB1c2gtbW9kZS4KKwkgIEl0IGlzIHJlbGV2YW50IHRvIHN1cHBvcnQgdGhvc2UgZm9yIDIgc2NlbmFyaW9zOgorCSAgMSkgZnJhZ21lbnRlZCBzdHJlYW1pbmcKKwkgIDIpIEhUVFAgcGxheWJhY2sgb2YgJ3JlZ3VsYXInIG1wNAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MzQ4NAorCisyMDE1LTExLTA1IDE4OjM5OjMzICswNTMwICBOaXJiaGVlayBDaGF1aGFuIDxuaXJiaGVla0BjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWRldmljZXByb3ZpZGVyLmM6CisJICBwdWxzZTogRG9uJ3QgbGVhayBjYXBzIGFuZCBzdHJ1Y3R1cmVzIGluIHRoZSBkZXZpY2UgcHJvdmlkZXIKKworMjAxNS0xMS0wNCAxOTowMToyMCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cG1hbmFnZXI6IERvY3VtZW50IHByb3BlcnRpZXMgdGhhdCBhcmUgZXhwcmVzc2VkIGluIGJpdHMgcGVyIHNlY29uZAorCSAgVGhpcyBjaGFuZ2VkIGluIDkyOGNkMTEwYmNlYTVkMTQzY2FiM2VhNzQ3OTkxODUxZDUyZWNiYWQgYW5kCisJICA3M2MwYzI5MjBmOWFjYTk2OTgyYTRkZTBjMjBiMzQxN2FhMTQ4YjgxIGJ1dCB3YXMgbm90IGRvY3VtZW50ZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3ODYzCisKKzIwMTUtMTEtMDQgMTg6NTE6MzIgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBtYW5hZ2VyOiBUcml2aWFsIGdzdC1pbmRlbnQgZml4ZXMKKworMjAxNS0wOC0xMiAxMzozNTo0MCArMDIwMCAgUGhpbGlwcGUgTm9ybWFuZCA8cGhpbG5AaWdhbGlhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IHN1cHBvcnQgZm9yIGNlbmMgYXV4aWxpYXJ5IGluZm8gcGFyc2luZyBvdXRzaWRlIG9mIG1vb2YgYm94CisJICBXaGVuIHRoZSBjZW5jIGF1eCBpbmZvIGluZGV4IGlzIG91dCBvZiBtb29mIGJvdW5kYXJpZXMsIGtlZXAgdHJhY2sgb2YKKwkgIGl0IGFuZCBwYXJzZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZGF0IGJveCwgYmVmb3JlIHRoZSBmaXJzdCBzYW1wbGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1NjE0CisKKzIwMTUtMTEtMDMgMjA6MzM6MTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogVXNlIGNvZGVjdXRpbHMgaGVscGVycyBmb3IgY3JlYXRpbmcgT3B1cyBjYXBzCisJICBBbHNvIGZpeCB1cCBjb2RlYyBkYXRhIHdpdGggdmFsdWVzIGZyb20gdGhlIGNvbnRhaW5lci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTcxNTIKKworMjAxNS0xMS0wMyAxNDo1MTo0OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBUaGVyZSBpcyBubyBtdWx0aXN0cmVhbSBmaWVsZCBmb3IgT3B1cyBhbnltb3JlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU3MTUyCisKKzIwMTUtMTEtMDMgMTI6NDI6NTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS93ZWJtLW11eC5jOgorCSAgbWF0cm9za2Evd2VibW11eDogU3VwcG9ydCBPcHVzIGluIHdlYm1tdXggYW5kIFZQOSBpbiBtYXRyb3NrYW11eAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyOTk1MAorCisyMDE1LTExLTAzIDEyOjQwOjE1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFBhcnNlIGFuZCBoYW5kbGUgQ29kZWNEZWxheSwgU2Vla1ByZXJvbGwgYW5kIERpc2NhcmRQYWRkaW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI3MzA1CisKKzIwMTUtMTEtMDMgMTI6MTg6MTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBXcml0ZSBDb2RlY0RlbGF5LCBEaXNjYXJkUGFkZGluZyBhbmQgU2Vla1ByZXJvbGwgZm9yIE9wdXMKKwkgIEFuZCBhbHNvIGFkanVzdCB0aW1lc3RhbXBzIGFuZCBkdXJhdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBjb2RlYyBkZWxheSwgYm90aAorCSAgc2hvdWxkIGluY2x1ZGUgaXQgZm9yIHdoYXRldmVyIHJlYXNvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjczMDUKKworMjAxNS0xMS0wMyAxMTo0OTo1NCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IE9wdXMgaGVhZGVycyBhcmUgbm90IGluLWJhbmQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjczMDUKKworMjAxNS0xMS0wMyAyMjowMTowNyArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkgIHY0bDI6IFNldCBPX0NMT0VYRUMgb24gdGhlIGRldmljZSBmZAorCSAgVGhpcyBpcyBuZWVkZWQgdG8gbWFrZSBzdXJlIHRoYXQgY2hpbGQgcHJvY2Vzc2VzIGRvbid0IGluaGVyaXQgdGhlIHZpZGVvCisJICBkZXZpY2UgZmQgd2hpY2ggY2FuIGNhdXNlIHByb2JsZW1zIHdpdGggc29tZSBkcml2ZXJzLgorCisyMDE1LTExLTAzIDE0OjQ2OjMwICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cG1hbmFnZXI6IHN3aXRjaCBHX0dJTlQ2NF9GT1JNQVQgZm9yIEdTVF9TVElNRV9BUkdTCisJICBObyBuZWVkIHRvIHVzZSBHX0dJTlQ2NF9GT1JNQVQgZm9yIHBvdGVudGlhbGx5IG5lZ2F0aXZlIHZhbHVlcyBvZgorCSAgR3N0Q2xvY2tUaW1lRGlmZi4gU2luY2UgMS42IHRoZXNlIGNhbiBiZSBoYW5kbGVkIHdpdGggR1NUX1NUSU1FX0FSR1MuCisJICBQbHVzIGl0IGNyZWF0ZXMgbW9yZSByZWFkYWJsZSB2YWx1ZXMgaW4gdGhlIGxvZ3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU3NDgwCisKKzIwMTUtMTEtMDMgMTQ6MjY6MjkgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNiZ0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwbWFuYWdlcjogdXNlIEdTVF9TVElNRV9BUkdTIGZvciBHc3RDbG9ja1RpbWVEaWZmCisJICBObyBuZWVkIHRvIG1hbnVhbGx5IGhhbmRsZSBuZWdhdGl2ZSB2YWx1ZXMgb2YgZGlmZiwgR1NUX1NUSU1FX0FSR1MgZG9lcworCSAgZXhhY3RseSB0aGlzLgorCisyMDE1LTExLTAyIDE2OjUzOjE1ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogdXNlIEdTVF9TVElNRV9BUkdTIGZvciBHc3RDbG9ja1RpbWVEaWZmCisJICBObyBuZWVkIHRvIG1hbnVhbGx5IGhhbmRsZSBuZWdhdGl2ZSB2YWx1ZXMgb2YgZGlmZiwgR1NUX1NUSU1FX0FSR1MgZG9lcworCSAgZXhhY3RseSB0aGlzLgorCisyMDE1LTExLTAyIDE2OjQzOjQ2ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiB1c2UgR1NUX1NUSU1FX0FSR1MgZm9yIEdzdENsb2NrVGltZURpZmYKKwkgIE5vIG5lZWQgdG8gbWFudWFsbHkgaGFuZGxlIG5lZ2F0aXZlIHZhbHVlcyBvZiBkaWZmLCBHU1RfU1RJTUVfQVJHUyBpcworCSAgYXZhaWxhYmxlIGZvciB0aGlzLgorCisyMDE1LTEwLTMwIDEwOjA1OjM3ICswNTMwICBSYXZpIEtpcmFuIEsgTiA8cmF2aS5raXJhbkBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOgorCSAgYXVkaW9jaGViYmFuZDogRml4IHR5cG8gaW4gZXhhbXBsZSBwaXBlbGluZQorCSAgRml4IHR5cG8gaW4gZXhhbXBsZSBwaXBlbGluZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTczNDAKKworMjAxNS0xMC0yOCAyMzo0NzozMCArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyZGV2aWNlcHJvdmlkZXIuYzoKKwkgIHY0bDI6IGZpeCBkb3VibGUtdW5yZWYgaW4gdGhlIHY0bDIgZGV2aWNlIHByb3ZpZGVyCisKKzIwMTUtMTAtMjcgMTA6NDg6MDAgKzAxMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJICBtYXRyb3NrYW11eDogZG9uJ3QgZHJvcCBKUEVHIGZyYW1lcyB0aGF0IG9ubHkgaGF2ZSBQVFMgYnV0IG5vIERUUyBzZXQKKwkgIEZvciB0aGUgTVMvVmZXIGNvZGVjIGlkcywgd2Ugd2FudCB0byB3cml0ZSBEVFMgdGltZXN0YW1wcyBpbnN0ZWFkCisJICBvZiBQVFMgYmVjYXVzZSB0aGF0J3Mgd2hhdCBldmVyeW9uZSBlbHNlIHNlZW1zIHRvIGRvIChhbmQgaXQncyBhbHNvCisJICBob3cgaXQgaXMgaW4gQVZJKS4gU28gZm9yIHRob3NlIGlucHV0IGZvcm1hdHMgd2UgdXNlIHRoZSBidWZmZXIgRFRTCisJICBpbnN0ZWFkIG9mIHRoZSBQVFMuIEhvd2V2ZXIsIGlmIHRoZXJlJ3Mgbm8gRFRTIHNldCBidXQgb25seSB0aGUgUFRTCisJICB0aGVuIGp1c3QgdGFrZSB0aGUgUFRTIGluc3RlYWQgb2YgZHJvcHBpbmcgdGhlIGlucHV0IGJ1ZmZlci4gVGhpcworCSAgaXMgdXNlZnVsIGVzcGVjaWFsbHkgZm9yIEktZnJhbWUgb25seSBjb2RlY3MgbGlrZSBKUEVHIGFuZCBodWZmeXV2LAorCSAgYnV0IHNob3VsZCBhbHNvIGJlIGZpbmUgYXMgZmFsbGJhY2sgaW4gZ2VuZXJhbC4KKwkgIEZpeGVzIHJlZ3Jlc3Npb24gd2l0aCBpbnB1dCBKUEVHIGZyYW1lcyB0aGF0IG9ubHkgaGF2ZSBQVFMgc2V0IG9uIHRoZW0uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU2OTY3CisKKzIwMTUtMTAtMjQgMjM6NTc6MzggKzAyMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwbGl0bXV4LmM6CisJICB0ZXN0cy9jaGVjay9zcGxpdG11eDogdGVzdCB0aGF0IHRoZSByZWxlYXNlX3BhZCB2ZnVuYyBvZiBzcGxpdG11eHNpbmsgYWN0dWFsbHkgcmVsZWFzZXMgcGFkcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MzYyMgorCisyMDE1LTEwLTI0IDIzOjU3OjI5ICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBkbyBub3QgZGVzdHJveSB0aGUgbXVsdGlxdWV1ZSAmIG11eGVyIHdoZW4gZ29pbmcgdG8gTlVMTAorCSAgSW5zdGVhZCwgZGVsYXkgaXQgdW50aWwgYWxsIHJlcXVlc3QgcGFkcyBoYXZlIGJlZW4gcmVsZWFzZWQuIFRoaXMgaXMKKwkgIGJlY2F1c2UgdGhlIHJlbGVhc2VfcGFkKCkgdmZ1bmMgcmVxdWlyZXMgdGhlIG11bHRpcXVldWUgYW5kIG11eGVyIHRvCisJICBiZSB0aGVyZSBpbiBvcmRlciB0byByZWxlYXNlIHRoZWlyIHJlcXVlc3QgcGFkcyBhcyB3ZWxsLiBJZiB0aG9zZQorCSAgZWxlbWVudHMgYXJlIGRlc3Ryb3llZCBlYXJsaWVyLCByZWxlYXNlX3BhZCgpIGRvZXMgbm90IHdvcmssIG5vCisJICBwYWRzIGFyZSByZWxlYXNlZCBhbmQgc29tZSByZXNvdXJjZXMgYXJlIGxlYWtlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM2MjIKKworMjAxNS0xMC0yMCAxNToyODoxMCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBSZWFkIGJ1ZmZlciB0aW1lc3RhbXAgKmFmdGVyKiBhY3R1YWxseSBzZXR0aW5nIGl0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU2ODA5CisKKzIwMTUtMTAtMjQgMTc6MTQ6MDcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uaDoKKwkgIHNjYWxldGVtcG86IEZpeCBoYW5kbGluZyBvZiByYXRlIDwgMAorCSAgV2UgaGF2ZSB0byByZXZlcnNlIGFsbCBzYW1wbGVzIGluIGEgYnVmZmVyIGJlZm9yZSBwcm9jZXNzaW5nIHRoZW0gdG8gcHJvcGVybHkKKwkgIGhhdmUgY29udGludW91cyBkYXRhIGZyb20gb25lIGJ1ZmZlciB0byBhbm90aGVyLiBBcyBhIHJlc3VsdCB3ZSB3aWxsIGhhdmUgYQorCSAgbmVnYXRpdmUgYXBwbGllZCByYXRlIGFuZCBhIHJhdGUgb2YgMS4wLgorCSAgQWxzbyBtYWtlIHN1cmUgdGhhdCBpbnB1dCBidWZmZXJzIGFyZSBjb3JyZWN0bHkgY2xpcHBlZCB0byB0aGUgc2VnbWVudCwKKwkgIG90aGVyd2lzZSBvdXIgY2FsY3VsYXRpb25zIGFyZSBnb2luZyB0byBnbyB3cm9uZy4KKwkgIEFsc28gY29weSBvdmVyIHRoZSBzZWdtZW50IGV2ZW50J3Mgc2VxdWVuY2UgbnVtYmVyIHRvIHRoZSBvdXRwdXQgc2VnbWVudCB3aGlsZQorCSAgd2UncmUgYXQgaXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU3MDMzCisKKzIwMTUtMTAtMTkgMTg6MDQ6NTYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogYnJlYWsgYXMgc29vbiBhcyBub24taW50ZXJsYWNlZCBpZiBmb3VuZAorCSAgSXQgbG9va3MgZm9yIGEgbm9uLWludGVybGFjZWQgZW50cnkgb24gdGhlIGZpbHRlciBjYXBzLCBicmVhaworCSAgYXMgc29vbiBhcyBvbmUgaXMgZm91bmQgdG8gYXZvaWQgd2FzdGluZyBjcHUKKworMjAxNS0xMC0xOSAxNzo1MDoyOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBpbXBsZW1lbnQgYWNjZXB0LWNhcHMKKwkgIEltcGxlbWVudCBhY2NlcHQtY2FwcyBoYW5kbGVyIHRvIGF2b2lkIGRvaW5nIGEgZnVsbCBjYXBzIHF1ZXJ5CisJICBkb3duc3RyZWFtIHRvIGhhbmRsZSBpdC4KKwkgIFRoaXMgY29tbWl0IGltcGxlbWVudHMgYWNjZXB0LWNhcHMgYXMgYSBzaW1wbGlmaWNhdGlvbiBvZiB0aGUgX2dldGNhcHMKKwkgIGZ1bmN0aW9uLCBzbyBpdCBleHBvc2VzIHRoZSBzYW1lIGxpbWl0YXRpb25zIHRoYXQgZ2V0Y2FwcyB3b3VsZC4KKwkgIEZvciBleGFtcGxlLCBub3QgYWNjZXB0aW5nIHJlbmVnb3RpYXRpb24gdG8gY2FwcyB3aXRoIGNhcHNmZWF0dXJlcyB3aGVuCisJICBpdCB3YXMgbGFzdCBjb25maWd1cmVkIHRvIGEgY2FwcyB0aGF0IGl0IGhhcyB0byBkZWludGVybGFjZS4KKworMjAxNS0xMC0xOSAxNzowNjoyOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jOgorCSAgdGVzdHM6IGRlaW50ZXJsYWNlOiBmaXggc21hbGwgdHlwbyBpbiBjb21tZW50CisKKzIwMTUtMTAtMjYgMDA6NDE6MjggKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9maWxlcy9NYWtlZmlsZS5hbToKKwkgIGNoZWNrOiBEaXN0IHNwbGl0dmlkZW8wWzAxMl0ub2dnIHRlc3QgZmlsZXMuCisKKzIwMTUtMTAtMjMgMjA6MTY6MTcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uaDoKKwkgIHNjYWxldGVtcG86IEFkZCBzdXBwb3J0IGZvciBGNjQKKworMjAxNS0xMC0yMiAxNzo0MDozOCAtMDcwMCAgTWlzY2hhIFNwaWVnZWxtb2NrIDxtc3BpZWdlbG1vY2tAZ21haWwuY29tPgorCisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9ydHAvUkVBRE1FOgorCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHJlY2VpdmUuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICBkb2NzOiBNaW5vciBmaXhlcyBpbiB2YXJpb3VzIHBsYWNlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1Njk5NgorCisyMDE1LTEwLTIxIDE3OjQzOjMxICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvZ29vbS9wbHVnaW5faW5mby5jOgorCSAgZ29vbTogcmVtb3ZlIGNvbXBpbGVyIHRyaWNrCisJICBBZnRlciBjb21taXQgMmNiNmNmZWQyMjE2NmIyNjJhZTUwY2I1OGYzZmYxMWRkOGJhOTFmOSB0aGVyZSBpcyBubyBuZWVkIHRvCisJICB0cmljayB0aGUgY29tcGlsZXIgYW55bW9yZSBhYm91dCB0aGUgdXNhZ2Ugb2YgdmFyaWFibGUgY3B1Rmxhdm91ci4KKworMjAxNS0xMC0yMSAxNDozNTowMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGI5OTgwMGEgdG8gYjMxOTkwOQorCisyMDE1LTEwLTIxIDE3OjQxOjM4ICswNTMwICBSYXZpIEtpcmFuIEsgTiA8cmF2aS5raXJhbkBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuaDoKKwkgIGF1ZGlvZng6IHJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKwkgIFJlbW92ZSB1bnN1ZWQgdmFyaWFibGUgaGF2ZV9jb2VmZnMgaW4gYXVkaW9meGJhc2VpaXJmaWx0ZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTY5MDUKKworMjAxNS0xMC0yMCAxNzoyOTo0MiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgVXNlIG5ldyBHU1RfRU5BQkxFX0VYVFJBX0NIRUNLUyAjZGVmaW5lCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU2ODcwCisKKzIwMTUtMTAtMjEgMTQ6MjU6NTUgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIFJFQURNRToKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA5YWVkMWQ3IHRvIGI5OTgwMGEKKworMjAxNS0xMC0yMSAxMTo1MzowOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IHJlbGF4IGNyZWF0aW9uIHRpbWUgcGFyc2luZworCSAgUGFyc2Ugd3JvbmcgdGltZXN0YW1wcyBsaWtlIHdlIHVzZWQgdG8gd3JpdGUgYXMgd2VsbCwKKwkgIGUuZy4gMTA6OTo0MiwgYW5kIHRoZSBob3VyIG1pZ2h0IGJlIHdpdGhvdXQgYSBsZWFkaW5nCisJICB6ZXJvIGluIGFueSBjYXNlLgorCisyMDE1LTEwLTIxIDExOjQ1OjM1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogZml4IGluZGVudGF0aW9uCisKKzIwMTUtMTAtMjEgMTE6NDQ6NTAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBleHRyYWN0IGJvdGggY3JlYXRpb24gZGF0ZSBhbmQgdGltZQorCSAgQmVmb3JlIHdlIG9ubHkgZXh0cmFjdGVkIHRoZSBkYXRlIHBhcnQuCisKKzIwMTUtMTAtMjEgMTE6MTY6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IGZpeCB3cml0aW5nIG9mIGNyZWF0aW9uIHRpbWUKKwkgIERvbid0IHdyaXRlIHRpbWUgYXMgZS5nLiAxMTo5OjQyCisKKzIwMTUtMTAtMTMgMTI6NDI6NTYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkgIHJ0cGoya3BheTogdXBkYXRlIGZyYWdtZW50IG9mZnNldAorCSAgSXQgd2FzIGFsd2F5cyBiZWluZyBzZXQgdG8gMCwgbWFraW5nIHRoZSByZXN1bHRpbmcgc3RyZWFtIGJyb2tlbgorCSAgZm9yIHRoZSByZWNlaXZlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NjQyMgorCisyMDE1LTEwLTE5IDE1OjM2OjM3ICswMzAwICBSeWFuIEhlbmRyaWNrc29uIDxyeWFuLmhlbmRyaWNrc29uQGFsdW0ubWl0LmVkdT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IERvbid0IHVuY29uZGl0aW9uYWxseSB1c2Ugc3RybmxlbigpCisJICBJdCdzIG5vdCBhdmFpbGFibGUgb24gb2xkZXIgT1NYIGFuZCB3ZSBjYW4gYXMgd2VsbCB1c2UgbWVtY2hyKCkgaGVyZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTYxNTQKKworMjAxNS0xMC0xOSAxNzozODozMiArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSAgYXVwYXJzZTogRml4IGV2ZW50IG1lbW9yeSBsZWFrCisJICBGcmVlIHRoZSBldmVudCBhZnRlciBiZWluZyBoYW5kbGVkIHRvIHByZXZlbnQgbWVtb3J5IGxlYWsuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU2Nzk5CisKKzIwMTUtMTAtMTkgMDk6MTQ6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXhtYXAuYzoKKwkgIHF0bXV4OiB1bmlmeSByYXcgYXVkaW8gY2FwcyBpbnRvIGEgc2luZ2xlIGNhcHMgc3RydWN0dXJlCisKKzIwMTUtMTAtMTQgMTU6NDI6NTAgLTA3MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHJleW5hbGRvQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgc3VwcG9ydCBmb3IgRkZWMSBjb2RlZCBzdHJlYW1zIGluIG1vdgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjQ5NQorCisyMDE1LTEwLTE0IDE1OjUzOjI2ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IEVPUyBpbW1lZGlhdGVseSBpZiB3ZSBoYXZlIGFuIGVtcHR5IHNlZWsgc2VnbWVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0ODMxNgorCisyMDE1LTEwLTE0IDEwOjQzOjE5ICswMzAwICBTdGF2cm9zIFZhZ2lvbml0aXMgPHN0YXZyb3N2QGRpZ2lzb2Z0LnR2PgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IE1ha2Ugbm9uLWluY2x1c2l2ZSBzZWdtZW50IGJvdW5kYXJpZXMgaW5jbHVzaXZlCisJICBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZSBmaWxlc3JjIGFuZCBzb3VwaHR0cHNyYyBhcmUgYmVoYXZpbmcKKwkgIGRpZmZlcmVudGx5IHJlZ2FyZGluZyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIHNlZ21lbnQgYm91bmRhcmllcy4gVGhlCisJICBmaWxlc3JjIGlzIHVzaW5nIGEgbm9uLWluY2x1c2l2ZSBib3VuZGFyaWVzLCB3aGlsZSB0aGUgc291cGh0dHBzcmMKKwkgIHVzZXMgaW5jbHVzaXZlLiBDdXJyZW50bHkgdGhlIGhsc2RlbXV4IGNhbGN1bGF0ZXMgdGhlIGJvdW5kYXJpZXMgYXMKKwkgIGluY2x1c2l2ZSwgc28gZm9yIHRoaXMgcmVhc29uIHRoZXJlIGlzIG5vIHByb2JsZW0gd2l0aCB0aGUgc291cGh0dHBzcmMsCisJICBidXQgdGhlcmUgaXMgYW4gaXNzdWUgaW4gdGhlIGZpbGVzcmMuCisJICBUaGUgR3N0U2VnbWVudCBpcyBub24taW5jbHVzaXZlLCBzbyB0aGUgcHJvcG9zZWQgc29sdXRpb24gaXMgdG8gdXNlCisJICBub24taW5jbHVzaXZlIGJvdW5kYXJpZXMgaW4gdGhlIGhsc2RlbXV4IGluIG9yZGVyIHRvIGJlIGNvbnNpc3RlbnQuCisJICBNYWtlIHRoZSBjaGFuZ2UgaW4gdGhlIGhsc2RlbXV4LCB3aWxsIGJyZWFrIHRoZSBzb3VwaHR0cHNyYywgd2hpY2gKKwkgIHdpbGwgZXhwZWN0IGluY2x1c2l2ZSBib3VuZGFyaWVzLCBidXQgdGhlIGhsc2RlbXV4IHdpbGwgb2ZmZXIKKwkgIG5vbi1pbmNsdXNpdmUuIFRoaXMgY2hhbmdlIG1ha2VzIHN1cmUgdGhhdCB0aGUgbm9uLWluY2x1c2l2ZQorCSAgYm91bmRhcmllcyBhcmUgY29udmVydGVkIHRvIGluY2x1c2l2ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDgzMTYKKworMjAxNS0xMC0xMSAyMjowNzo1NCArMDAwMCAgR3JhaGFtIExlZ2dldHQgPG1pbmZyaW5Ac2hhcnAuZm0+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmg6CisJICBzb3VwaHR0cGNsaWVudHNpbms6IEFkZCB0aGUgcmV0cnkgYW5kIHJldHJ5LWRlbGF5IHByb3BlcnRpZXMKKwkgIFRoZXNlIGFsbG93IGEgZmFpbGVkIHJlcXVlc3QgdG8gYmUgcmV0cmllZCBhZnRlciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHNlY29uZHMKKwkgIGluc3RlYWQgb2YgZmFpbGluZyB0aGUgcGlwZWxpbmUuIFRha2UgYWNjb3VudCBvZiB0aGUgUmV0cnktQWZ0ZXIgaGVhZGVyIGlmCisJICBwcmVzZW50LiBBZGQgcmV0cmllcyBwYXJhbWV0ZXIgdGhhdCBjb250cm9scyB0aGUgbnVtYmVyIG9mIHRpbWVzIGFuIEhUVFAKKwkgIHJlcXVlc3Qgd2lsbCBiZSByZXRyaWVkIGJlZm9yZSBmYWlsaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NjMxOAorCisyMDE1LTEwLTE0IDEyOjAzOjE1ICswMjAwICBHdWlsbGF1bWUgRGVzbW90dGVzIDxndWlsbGF1bWUuZGVzbW90dGVzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggY2FwcyBsZWFrCisJICBJZiB0aGUgUXREZW11eFN0cmVhbSBhcmUgcmUtdXNlZCB0aGV5IG1heSBhbHJlYWR5IGhhdmUgY2FwcyB3aGljaCB1c2VkCisJICB0byBiZSBsZWFrZWQuCisJICBSZXByb2R1Y2VkIHVzaW5nIHRoZQorCSAgdmFsaWRhdGUuZGFzaC5wbGF5YmFjay5zZWVrX2ZvcndhcmQuZGFzaF9leE1QRF9CSVBfVEMxIHZhbGlkYXRlCisJICBzY2VuYXJpby4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTY1NjEKKworMjAxNS0xMC0xNCAwOToyOTo1MCArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBGaXggdGFnbGlzdCBtZW1vcnkgbGVhaworCSAgRnJlZSB0aGUgc3RyZWFtIGFuZCBpdHMgc3ViIGl0ZW1zIGluc3RlYWQgb2YganVzdCB0aGUgc3RyZWFtCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU2NTQ0CisKKzIwMTUtMTAtMTEgMTI6MDY6MjYgKzAxMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRzYXVuaWVyQGdub21lLm9yZz4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5jOgorCSAgcXRtdXg6IEFsbG93IG5lZ290aWF0aW5nIHRvIFM4IGFzIGEgcmF3IGZvcm1hdCBidXQgc3RvcCBtYWtpbmcgaXQgYmVzdCBjaG9pY2UKKwkgIE5lZ290aWF0aW9uIHRvIGF1ZGlvL3gtcmF3LGZvcm1hdD1TOCB3YXMgbm90IHBvc3NpYmxlIGJlY2F1c2UgUzggZG9lcworCSAgbm90IGhhdmUgYSBiaXQgb3JkZXIgc28gd2UgZW5kZWQgdXAgZG9pbmcgYGlmICghZW50cnkuZm91cmNjKSBnb3RvIHJlZnVzZV9jYXBzO2AKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTYzODcKKworMjAxNS0xMC0xMSAwOToxODo0MCArMDEwMCAgVGhpYmF1bHQgU2F1bmllciA8dHNhdW5pZXJAZ25vbWUub3JnPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogQWRkIHByb3JlcyBzdXBwb3J0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU2Mzg4CisKKzIwMTUtMTAtMTIgMTg6NTY6MzIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IGFkZCBHU1RfUExVR0lOU19CQVNFX0xJQlMgZm9yIGZsdmRlbXV4IGNoZWNrCisJICBTbyBpdCBwdWxscyBpbiB0aGUgcmlnaHQgbGliZ3N0dGFnLTEuMC4KKworMjAxNS0xMC0xMSAyMjoyNzo0NyArMDEwMCAgSnVsaWVuIElzb3JjZSA8ai5pc29yY2VAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9nb29tL01ha2VmaWxlLmFtOgorCSogZ3N0L2dvb20vZ3N0YXVkaW92aXN1YWxpemVyLmM6CisJKiBnc3QvZ29vbS9nc3RhdWRpb3Zpc3VhbGl6ZXIuaDoKKwkqIGdzdC9nb29tL2dzdGdvb20uaDoKKwkqIGdzdC9nb29tMmsxL01ha2VmaWxlLmFtOgorCSogZ3N0L2dvb20yazEvZ3N0YXVkaW92aXN1YWxpemVyLmM6CisJKiBnc3QvZ29vbTJrMS9nc3RhdWRpb3Zpc3VhbGl6ZXIuaDoKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uaDoKKwkgIGdvb20vZ29vbTJrMTogcmVtb3ZlIG9ic29sZXRlIGxlZnQgb3ZlciBmaWxlcworCSAgVGhleSBub3cgdXNlIHRoZSBuZXcgR3N0QXVkaW9WaXN1YWxpemVyIGJhc2UgY2xhc3MKKwkgIGZyb20gZ3N0LXBsdWdpbnMtYmFzZS9nc3QtbGlicy9nc3QvcGJ1dGlscworCSAgQWxzbyBmaXhlZCB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGdzdF9hdWRpb192aXN1YWxpemVyX2dldF90eXBlCisJICBBZGRlZCBHU1RfUExVR0lOU19CQVNFX0xJQlMgdG8gTWFrZWZpbGUuYW0gYW5kIHJlLW9yZGVyIExJQkFERC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDI4NzUKKworMjAxNS0xMC0xMiAxMDo0ODoyMyArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgbXBlZ2F1ZGlvcGFyc2U6IEZpeCBidWZmZXIgbWVtb3J5IGxlYWsgZHVyaW5nIGZhaWx1cmVzCisJICBtYXBwZWQgYnVmZmVyIGlzIG5vdCBiZWluZyB1bm1hcHBlZCBkdXJpbmcgZmFpbHVyZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTYyMzEKKworMjAxNS0xMC0xMiAxMToxODo1MSArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJICBzb3VwaHR0cGNsaWVudHNpbms6IENoZWNrIGlmIHNvdXAgbWVzc2FnZSBpcyBjcmVhdGVkCisJICBJZiBzb3VwIG1lc3NhZ2UgaXMgbm90IGNyZWF0ZWQgdGhlbiB0aGUgc2FtZSBzaG91bGQgbm90IGJlIHBhc3NlZAorCSAgb24sIHdoaWNoIGlzIHJlc3VsdGluZyBpbiBzZWdmYXVsdC4gSGVuY2UgdGhyb3dpbmcgYSB3YXJuaW5nIG1lc3NhZ2UKKwkgIGFuZCByZXR1cm5pbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTUzMjYKKworMjAxNS0xMC0xMiAxMToxNToxNSArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJICBzb3VwaHR0cGNsaWVudHNpbms6IENoZWNrIGlmIGxvY2F0aW9uIGJlaW5nIHNldCBpcyB2YWxpZAorCSAgQWRkaW5nIGEgY2hlY2sgaW4gc2V0X3Byb3BlcnR5IHRvIGZpbmQgaWYgdGhlIGxvY2F0aW9uIHVyaSBpcyB2YWxpZAorCSAgYW5kIHByaW50aW5nIHdhcm5pbmcgaWYgbm90IHZhbGlkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NTMyNgorCisyMDE1LTEwLTEyIDExOjA5OjMwICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkgIHNvdXBodHRwY2xpZW50c2luazogRml4IG1lbW9yeSBsZWFrcyBkdXJpbmcgZmFpbHVyZXMKKwkgIGZyZWVpbmcgc3RyZWFtaGVhZGVyX2J1ZmZlcnMgYW5kIHNlbnRfYnVmZmVycyBkdXJpbmcgZmFpbHVyZSBjYXNlcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTUzMjYKKworMjAxNS0xMC0xMiAxMTowMzoxNyArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJICBzb3VwaHR0cGNsaWVudHNpbms6IFJlcGxhY2UgcmVkdW5kYW50IGZyZWVfYnVmZmVyX2xpc3QgZnVuY3Rpb24KKwkgIFJlbW92aW5nIGZyZWVfYnVmZmVyX2xpc3QgYW5kIHJlcGxhY2luZyBpdCB3aXRoIGFscmVhZHkgYXZhaWxhYmxlIGZ1bmN0aW9uCisJICBnX2xpc3RfZnJlZV9mdWxsCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1MzI2CisKKzIwMTUtMTAtMTEgMTY6NDA6MDEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgY2hlY2s6IERvbid0IGZvcmdldCBiYXNlIENGTEFHUyBmb3IgZmx2ZGVtdXggY2hlY2sKKwkgIGVsZW1lbnRzL2ZsdmRlbXV4LmM6MjU6MjU6IGZhdGFsIGVycm9yOiBnc3QvdGFnL3RhZy5oOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisKKzIwMTUtMTAtMTEgMTE6Mzc6NTEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgbWF0cm9za2FtdXg6IENyZWF0ZSBhIFRJTUUgc2VnbWVudCB3aGVuIGNyZWF0aW5nIHN0cmVhbWFibGUgb3V0cHV0CisJICBSZWxhdGVkIHRvIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTQ0MzUgd2hpY2gKKwkgIGRvZXMgdGhlIHNhbWUgZm9yIGZsdm11eC4KKworMjAxNS0wOS0yMyAxMzo1MDo1MiArMDIwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiBnc3QvZmx2L01ha2VmaWxlLmFtOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IG91dHB1dCBzcGVleCB2b3JiaXNjb21tZW50IGFzIGEgR3N0VGFnTGlzdAorCSAgVGhpcyBpcyB3aGF0IHNwZWV4ZGVjIGV4cGVjdHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1NDc4CisKKzIwMTUtMDktMjIgMjI6NTk6MTYgKzAyMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQGdtYWlsLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2Zsdm11eC5jOgorCSAgZmx2bXV4OiBHU1RfQlVGRkVSX09GRlNFVHMgc2hvdWxkIGJlIEdTVF9CVUZGRVJfT0ZGU0VUX05PTkUKKwkgIE9yIGVsc2UgZmx2ZGVtdXggZG9uJ3QgdW5kZXJzdGFuZCBpdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NDQzNQorCisyMDE1LTA5LTAyIDEwOjQ0OjU5ICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkBnbWFpbC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZtdXguYzoKKwkgIGZsdm11eDogdXNlIHRpbWUgc2VnbWVudCBhbmQgY29weSB0aW1lc3RhbXBzIHdoZW4gc3RyZWFtYWJsZQorCSAgQWRkIGEgYmFzaWMgdGVzdCB1c2luZyBzcGVleCBkYXRhIHRvIHZlcmlmeSB0aW1lc3RhbXBpbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU0NDM1CisKKzIwMTUtMDktMjMgMTM6MTQ6MDMgKzAyMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQGdtYWlsLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IHNwZWV4IGlzIGFsc28gYWx3YXlzIDE2S0h6CisJICBUaGlzIGlzIGp1c3QgYSBjb3NtZXRpYyBjaGFuZ2UgZm9yIHRoZSBsb2dzLCBzaW5jZSB0aGUgcmlnaHQgY2FwcworCSAgZm9yIFNwZWV4IGlzIGJlaW5nIHNldCBlbHNld2hlcmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1NDc5CisKKzIwMTUtMDctMTQgMTU6MTk6NDQgKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBtYW5hZ2VyOiBBZGQgJ3NvdXJjZS1zdGF0cycgdG8gc3RhdHMgYW5kIG5vdGlmeQorCSAgQWRkIHN0YXRpdGljcyBmcm9tIGVhY2ggcnRwIHNvdXJjZSB0byB0aGUgcnRwIHNlc3Npb24gcHJvcGVydHkuCisJICAnc291cmNlLXN0YXRzJyBpcyBhIEdWYWx1ZUFycmF5IHdoZXJlIGVhY2ggZWxlbWVudCBpcyBhIEdzdFN0cnVjdHVyZSBvZgorCSAgc3RhdHMgZm9yIG9uZSBydHAgc291cmNlLgorCSAgVGhlIGF2YWlsYWJpbGl0eSBvZiBuZXcgc3RhdHMgaXMgc2lnbmFsZWQgdmlhIGdfb2JqZWN0X25vdGlmeS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTI2NjkKKworMjAxNS0wNi0wNSAxNzoyMDozMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogSW1wbGVtZW50IHNlbmRpbmcgb2YgcmVkdWNlZCBzaXplIFJUQ1AgcGFja2V0cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MDQ1NgorCisyMDE1LTEwLTA4IDE1OjAxOjEzICswNTMwICBSYXZpIEtpcmFuIEsgTiA8cmF2aS5raXJhbkBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmg6CisJICBhdWRpb2Z4OiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlCisJICBSZW1vdmUgdW51c2VkIHZhcmlhYmxlICdkZWdyZWUnIGluIGF1ZGlvZHluYW1pYworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NjIzNAorCisyMDE1LTEwLTA4IDE0OjQ0OjA3ICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBtZW1vcnkgbGVhayBmb3IgY29ycnVwdGVkIGZpbGUKKwkgIEZyZWUgYnJhbmRzIGJlZm9yZSBvdmVycmlkaW5nIHRoZW0uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU2MjI2CisKKzIwMTUtMTAtMDggMTE6NDQ6MDQgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZmRlYy5jOgorCSAgZ2RrcGl4YnVmZGVjOiBGaXggcGl4YnVmX2xvYWRlciBsZWFrIGR1cmluZyBmYWlsdXJlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NjIxOQorCisyMDE1LTEwLTA3IDIzOjIzOjQ1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogQWRkIG1pc3NpbmcgYnJlYWsKKworMjAxNS0xMC0wNyAxMzowMzowMiArMDIwMCAgTWlndWVsIFBhcsOtcyBEw61heiA8bXBhcmlzZGlhekBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwbWFuYWdlcjogVGFrZSBpbnRvIGFjY291bnQgcGFja2V0IHJhdGUgZm9yIG1heC1kcm9wb3V0IGFuZCBtYXgtbWlzb3JkZXIgY2FsY3VsYXRpb25zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMzExCisKKzIwMTUtMTAtMDcgMTM6MDI6MTIgKzAyMDAgIE1pZ3VlbCBQYXLDrXMgRMOtYXogPG1wYXJpc2RpYXpAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSAgcnRwbWFuYWdlcjogYWRkICJtYXgtZHJvcG91dC10aW1lIiBhbmQgIm1heC1taXNvcmRlci10aW1lIiBwcm9wcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTMxMQorCisyMDE1LTEwLTA3IDE3OjE0OjU3ICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogRml4IGRhdGUgbWVtb3J5IGxlYWsKKwkgIFdoZW4gZ2V0dGluZyBkYXRlIGZyb20gdGFnbGlzdCwgdGhlIG1lbW9yeSBzaG91bGQgYmUgZnJlZWQgYWZ0ZXIKKwkgIHVzaW5nIGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NjE3MQorCisyMDE1LTEwLTA1IDExOjAzOjM4ICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogRml4IHNhbXBsZSBtZW1vcnkgbGVhaworCSAgV2hlbiBnZXR0aW5nIHNhbXBsZSBmcm9tIHRhZ2xpc3QsIHRoZSBtZW1vcnkgc2hvdWxkIGJlIGZyZWVkIGFmdGVyCisJICB1c2luZyBpdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTYwNjgKKworMjAxNS0xMC0wNSAxMzoxMDo1NiArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzoKKwkgIGN1dHRlcjogRml4IGJ1ZmZlciBsZWFrCisJICBCdWZmZXIgaXMgYWRkZWQgdG8gdGhlIGludGVybmFsIGNhY2hlLCBhbmQgcHVzaGVkIG9ubHkgd2hlbiBhY2N1bXVsYXRlZAorCSAgYnVmZmVyIGR1cmF0aW9uIGNyb3NzZXMgMjAwIG1zLiBTbyB3aGVuIHRoZSBjaGFpbiBlbmRzLCB0aGUgYnVmZmVyIGFjY3VtdWxhdGVkCisJICBpcyBub3QgZnJlZWQuIEZyZWVpbmcgdGhlIGNhY2hlIHdoZW4gdGhlIHN0YXRlIGNoYW5nZXMgZnJvbSBQQVVTRUQgdG8gUkVBRFkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU0MjEyCisKKzIwMTUtMDgtMzEgMjE6MTA6MTYgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBVc2UgZGVmYXVsdCB1cHN0cmVhbSBldmVudCBoYW5kbGluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjY5NAorCisyMDE1LTA4LTMxIDIxOjA1OjAzIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oOgorCSAgcnRwbXV4OiBBcyAweEZGRkZGRkZGIGlzIGEgdmFsaWQgc3NyYywgY2hlY2sgaWYgaXQgaGFzIGJlZW4gc2V0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyNjk0CisKKzIwMTUtMDctMjIgMDk6NDc6MjIgKzAyMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cG11eC5jOgorCSAgZ3N0cnRwbXV4OiBhbGxvdyB0aGUgc3NyYy1wcm9wZXJ0eSB0byBkZWNpZGUgc3NyYyBvbiBvdXRnb2luZyBidWZmZXJzCisJICBCeSBub3QgZG9pbmcgdGhpcywgdGhlIG11eGVyIGlzIG5vdCBlZmZlY3RpdmVseSBhIHJ0cG11eGVyLCByYXRoZXIgYQorCSAgZnVubmVsLCBzaW5jZSBpdCBzaG91bGQgYmUgYSBzaW5nbGUgc3RyZWFtIHRoYXQgZXhpc3RzIHRoZSBtdXhlci4KKwkgIElmIG5vdCBzcGVjaWZpZWQsIHRha2UgdGhlIGZpcnN0IHNzcmMgc2VlbiBvbiBhIHNpbmtwYWQsIGFsbG93aW5nIHVwc3RyZWFtCisJICB0byBkZWNpZGUgc3NyYyBpbiAicGFzc3Rocm91Z2giIHdpdGggb25seSBvbmUgc2lua3BhZC4KKwkgIEFsc28sIGxldCBkb3duc3RyZWFtIHNzcmMgb3ZlcnJ1bGUgaW50ZXJuYWwgY29uZmlndXJlZCBvbmUKKwkgIFdlIGhlbmNlIGhhcyB0aGUgZm9sbG93aW5nIG9yZGVyIGZvciBkZXRlcm1pbmluZyB0aGUgc3NyYyB1c2VkIGJ5CisJICBydHBtdXg6CisJICAwLiBTdWdnZXN0aW9uIGZyb20gR3N0UlRQQ29sbGlzaW9uIGV2ZW50CisJICAxLiBEb3duc3RyZWFtIGNhcHMKKwkgIDIuIHNzcmMtUHJvcGVydHkKKwkgIDMuIChGaXJzdCkgdXBzdHJlYW0gY2FwcyBjb250YWluaW5nIHNzcmMKKwkgIDQuIFJhbmRvbWx5IGdlbmVyYXRlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjY5NAorCisyMDE1LTEwLTAyIDIyOjQyOjIwICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBGaXh1cCBsYXN0IGNvbW1pdAorCisyMDE1LTEwLTAyIDIyOjIxOjQ1ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgVXBkYXRlIEdMaWIgZGVwZW5kZW5jeSB0byAyLjQwLjAKKworMjAxNS0wNi0zMCAxNjo1NjoxOSArMDIwMCAgTWlndWVsIFBhcsOtcyBEw61heiA8bXBhcmlzZGlhekBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwc3RhdHM6IGFkZCB1dGlsaXR5IGZvciBjYWxjdWxhdGluZyBSVFAgcGFja2V0IHJhdGUKKworMjAxNS0wOC0xMCAxODoxNDozOSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGhhbmRsZSBlbXB0eSBzZWdtZW50cyBpbiBzZWVraW5nIGFkanVzdAorCSAgSWYgc2Vla2luZyB0YXJnZXRzIGFuIGVtcHR5IHNlZ21lbnQgc2tpcCBpdCBhcyB0aGVyZSBpcyBubyBtZWRpYQorCSAgb2Zmc2V0IHRvIGdldCBmcm9tIGl0LiBJbnN0ZWFkIGxvb2sgZm9yIHRoZSBuZXh0IG9uZS4KKwkgIFRoaXMgZG9lc24ndCBtYWtlIHNlZWtpbmcgaW4gcHVzaC1tb2RlIHdvcmsgaWYgeW91IHNlZWsgdG8gYW4KKwkgIGVtcHR5IHNlZ21lbnQgYnV0IGF0IGxlYXN0IHdvbid0IGdldCB5b3UgdG8gd3Jvbmcgb2Zmc2V0cy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM0ODQKKworMjAxNS0wNC0xNyAxNDoyNTo0MyArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmg6CisJICBzcGxpdG11eHNpbms6IHBvc3QgbWVzc2FnZXMgd2hlbiBmcmFnbWVudHMgYXJlIGJlaW5nIG9wZW5lZCBhbmQgY2xvc2VkCisJICBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gdHJhY2sgdGhlIGNyZWF0ZWQgZnJhZ21lbnRzCisJICAodG8gbG9nIHRoZW0gaW4gYSByZWNvcmRpbmcgZGF0YWJhc2UsIGZvciBleGFtcGxlKQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MDEwOAorCisyMDE1LTA0LTI5IDE4OjIzOjI4ICswMTAwICBSYW1pcm8gUG9sbGEgPHJhbWlyby5wb2xsYUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgc3BsaXRtdXhzaW5rOiBhbGxvdyBub24tdmlkZW8gc3RyZWFtcyB0byBzZXJ2ZSBhcyByZWZlcmVuY2UKKwkgIEluIHRoZSBhYnNlbmNlIG9mIGEgdmlkZW8gc3RyZWFtLCB0aGUgZmlyc3Qgc3RyZWFtIHdpbGwgYmUgdXNlZCBhcworCSAgcmVmZXJlbmNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MzYxNworCisyMDE1LTA3LTIyIDE3OjQ1OjEyICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBpbml0aWFsaXplIG11eF9zdGFydF90aW1lIHByb3Blcmx5CisJICBtdXhfc3RhcnRfdGltZSByZWZlcnMgdG8gdGhlIHJ1bm5pbmdfdGltZSBvZiB0aGUgYnVmZmVyCisJICB0aGF0IGdvZXMgZmlyc3QgaW4gdGhlIG91dHB1dCBmaWxlLiBOb3JtYWxseSB0aGlzIHRpbWUgaXMKKwkgIDAsIHNvIHRoaXMgdmFyaWFibGUgaXMgaW5pdGlhbGl6ZWQgdG8gMCBkdXJpbmcgdGhlIHN0YXRlCisJICBjaGFuZ2UgdG8gUEFVU0VELgorCSAgSG93ZXZlciwgd2hlbiBkZWFsaW5nIHdpdGggZHluYW1pYyBwaXBlbGluZXMgYW5kIHN0YXJ0aW5nCisJICBhIHJlY29yZGluZyB3aGlsZSB0aGUgcGlwZWxpbmUgaGFzIGFscmVhZHkgcnVuIGZvciBhIHdoaWxlLAorCSAgdGhlIHJ1bm5pbmdfdGltZSBvZiB0aGUgZmlyc3QgYnVmZmVyIGlzID4gMCBhbmQgdGhpcyBjYXVzZXMKKwkgIGEgcHJvYmxlbSB3aXRoIGRldGVjdGluZyB0aGUgZW5kIG9mIHRoZSBmaXJzdCBmaWxlKHMpIHdoZW4KKwkgIHNwbGl0dGluZyBieSBkdXJhdGlvbiwgYmVjYXVzZSB0aGUgY29kZSB3aWxsIGxhdGVyIGNvbXBhcmUKKwkgIHRoZSB0aHJlc2hvbGRfdGltZSB3aXRoIChsYXN0IGJ1ZmZlciBydW5uaW5nX3RpbWUgLSBtdXhfc3RhcnRfdGltZSkKKwkgIGFuZCB3aWxsIGdldCBpdCB3cm9uZyB1bnRpbCBtdXhfc3RhcnRfdGltZSBhZHZhbmNlcyBlbm91Z2gKKwkgIHRvIG1ha2UgdGhpcyBkaWZmZXJlbmNlIDwgdGhyZXNob2xkX3RpbWUsIGNyZWF0aW5nIGVtcHR5IGZpbGVzCisJICBpbiB0aGUgbWVhbnRpbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzNjI0CisKKzIwMTUtMDktMTYgMTY6MDM6MDIgKzA5MDAgIFZpbmVldGggVCBNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogUmV2ZXJzZSBwbGF5YmFjayBkb2VzIG5vdCBjb25zaWRlciBzZWdtZW50LnN0YXJ0CisJICBEdXJpbmcgcmV2ZXJzZSBwbGF5YmFjaywgdGhlIG1lZGlhIHNob3VsZCBzdG9wIHBsYXlpbmcgYXQgc2VnbWVudC5zdGFydAorCSAgVGhpcyBkb2VzIG5vdCBoYXBwZW4sIGFuZCBhdmlkZW11eCBjb250aW51ZXMgdG8gcHJvY2VzcyBkYXRhIGV2ZW4gd2hlbgorCSAgY3VycmVudCB0aW1lc3RhbXAgaXMgbGVzcyB0aGF0IHNlZ21lbnQuc3RhcnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1MDk0CisKKzIwMTUtMDktMjMgMTI6Mzk6MzUgKzA5MDAgIE1hbmFzYSBBdGhyZXlhIDxtYW5hc2EuYXRocmV5YUBsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IENoZWNrIG11bHRpIHRyZXggdG8gZmluZCB0cmFjayBpZCBpbiBtcDQgbXBlZy1kYXNoIHN0cmVhbQorCSAgSWYgc3RyZWFtIGhhcyBtb3JlIHRoYW4gb25lIHRyZXggYm94IHdoaWNoIGlzIG5vdCBtYXRjaGVkIHRvIGFjdHVhbAorCSAgdHJhY2sgaWQsIGl0IG1ha2VzIHF0ZGVtdXggY3Jhc2hlZC4KKwkgIEF1dGhvciA6IE1hbmFzYSBBdGhyZXlhIChtYW5hc2EuYXRocmV5YUBsZ2UuY29tKQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NDg2NAorCisyMDE1LTA5LTA0IDE0OjI0OjQ1ICswNTMwICBSYXZpIEtpcmFuIEsgTiA8cmF2aS5raXJhbkBzYW1zdW5nLmNvbT4KKworCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJICBzbXB0ZTogZ2V0IHNpemUsIHN0cmlkZSBpbmZvIHVzaW5nIFZpZGVvSW5mbworCSAgVXNlIFZpZGVvSW5mbyBkYXRhIHRvIGdldCBzaXplIHN0cmlkZSBhbmQKKwkgIG9mZnNldCwgaW5zdGVhZCBvZiBoYXJkIGNvZGVkIG1hY3Jvcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTQ1NTgKKworMjAxNS0wOS0wNCAxNDoxODo1MCArMDUzMCAgUmF2aSBLaXJhbiBLIE4gPHJhdmkua2lyYW5Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSAgc21wdGU6IGZyZWUgbWFzaworCSAgRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCB0byAnbWFzaycgdG8gYXZvaWQKKwkgIG1lbW9yeSBsZWFrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NDU1NQorCisyMDE1LTA4LTIwIDExOjAyOjU4ICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSogdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYzoKKwkqIHRlc3RzL2ljbGVzL2dka3BpeGJ1Zm92ZXJsYXktdGVzdC5jOgorCSogdGVzdHMvaWNsZXMvZ2RrcGl4YnVmc2luay10ZXN0LmM6CisJKiB0ZXN0cy9pY2xlcy90ZXN0LW9zczQuYzoKKwkqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6CisJICBnc3RyZWFtZXI6IGdvb2Q6IHRlc3RzOiBGaXggbWVtb3J5IGxlYWtzIHdoZW4gY29udGV4dCBwYXJzZSBmYWlscy4KKwkgIFdoZW4gZ19vcHRpb25fY29udGV4dF9wYXJzZSBmYWlscywgY29udGV4dCBhbmQgZXJyb3IgdmFyaWFibGVzIGFyZSBub3QgZ2V0dGluZyBmcmVlJ2QKKwkgIHdoaWNoIHJlc3VsdHMgaW4gbWVtb3J5IGxlYWtzLiBGcmVlJ2luZyB0aGUgc2FtZS4KKwkgIEFuZCByZXBsYWNpbmcgZ19lcnJvcl9mcmVlIHdpdGggZ19jbGVhcl9lcnJvciwgd2hpY2ggY2hlY2tzIGlmIHRoZSBlcnJvciBiZWluZyBwYXNzZWQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM4NTMKKworMjAxNS0xMC0wMiAxNjoxODoxNSArMDkwMCAgSHl1bmp1biBLbyA8enpvb24ua29Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlOiBkb2Vzbid0IGhhbmRsZSBwcm9iYXRpb24gYW5kIHJ0cCBnYXAgaW4gY2FzZSBvZiBzZW5kZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTQ1NDgKKworMjAxNS0xMC0wMiAxNjoxNjozMiArMDkwMCAgSHl1bmp1biBLbyA8enpvb24ua29Ac2Ftc3VuZy5jb20+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFsczoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBtYW5hZ2VyOiBhZGQgbmV3IG9uLW5ldy1zZW5kZXItc3NyYywgb24tc2VuZGVyLXNzcmMtYWN0aXZlIHNpZ25hbHMKKwkgIEFsbG93cyBmb3IgYXBwbGljYXRpb25zIHRvIGdldCBpbnRlcm5hbCBzb3VyY2UncyBSVFAgc3RhdGlzdGljcy4KKwkgIChlZy4gc2VuZGVyIHNvdXJjZXMgZm9yIGEgc2VydmVyL2NsaWVudCkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDY3NDcKKworMjAxNS0xMC0wMiAxNDoxNzo0OCArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICB4aW1hZ2VzcmM6IEdhdGhlciBhbmQgY29hbGVzY2UgYWxsIGRhbWFnZWQgYXJlYXMgYmVmb3JlIHJldHJpZXZpbmcuCisJICBUaGVzZSBkYXlzIHRoZSB4c2VydmVyIHNlZW1zIHRvIGdpdmUgdXMgdGhlIHNhbWUgZGFtYWdlIHJlZ2lvbnMKKwkgIG92ZXIgYW5kIG92ZXIgZm9yIGVudGlyZSB3aW5kb3dzLCBhbmQgd2UgcmV0cmlldmUgdGhlbSBtdWx0aXBsZQorCSAgdGltZXMsIHdoaWNoIGdpdmVzIHRpbWUgZm9yIG1vcmUgZGFtYWdlIHRvIGFwcGVhci4gSW5zdGVhZCwganVzdAorCSAgcXVpY2tseSBnYXRoZXIgYWxsIGRhbWFnZWQgYXJlYXMgaW50byBhIHJlZ2lvbiBsaXN0IGFuZCBjb3B5CisJICBvdXQgb25jZS4KKworMjAxNS0xMC0wMSAxNjoyNDozMiArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2dvb20yazEvTWFrZWZpbGUuYW06CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmg6CisJICBnb29tMmsxOiB1c2UgdGhlIG5ldyBhdWRpb3Zpc3VhbGl6ZXIgYmFzZSBjbGFzcworCSAgUmViYXNlIHRvIGhhdmUgZ29vbSB1c2luZyB0aGUgR3N0QXVkaW9WaXN1YWxpemVyIGJhc2UgY2xhc3MgaW4KKwkgIGdzdC1wbHVnaW5zLWJhc2UvZ3N0LWxpYnMvZ3N0L3BidXRpbHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDI4NzUKKworMjAxNS0xMC0wMSAxNjoxNjowOCArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc2JnQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2dvb20vTWFrZWZpbGUuYW06CisJKiBnc3QvZ29vbS9nc3Rnb29tLmg6CisJICBnb29tOiB1c2UgdGhlIG5ldyBhdWRpb3Zpc3VhbGl6ZXIgYmFzZSBjbGFzcworCSAgUmViYXNlIHRvIGhhdmUgZ29vbSB1c2luZyB0aGUgR3N0QXVkaW9WaXN1YWxpemVyIGJhc2UgY2xhc3MgaW4KKwkgIGdzdC1wbHVnaW5zLWJhc2UvZ3N0LWxpYnMvZ3N0L3BidXRpbHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDI4NzUKKworMjAxNS0wOS0zMCAxNzozNTozMyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOgorCSAgZGVpbnRlcmxlYXZlOiBpbXBsZW1lbnQgYWNjZXB0LWNhcHMKKwkgIEF2b2lkIHVzaW5nIGRlZmF1bHQgYWNjZXB0LWNhcHMgaGFuZGxlciB0aGF0IHdpbGwgcXVlcnkgZG93bnN0cmVhbQorCSAgYW5kIGlzIG1vcmUgZXhwZW5zaXZlLiBKdXN0IGNoZWNrIGlmIHRoZSBjYXBzIGlzIGNvbXBhdGlibGUgd2l0aAorCSAgdGhlIHRlbXBsYXRlIGFuZCBjaGVjayBpZiB0aGUgY2hhbm5lbHMgYXJlIHRoZSBzYW1lLgorCisyMDE1LTA5LTMwIDA5OjM1OjM5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOgorCSAgdGVzdHM6IGRlaW50ZXJsZWF2ZTogYWxzbyBjaGVjayBmb3IgY2FwcyBxdWVyeSByZXN1bHRzCisKKzIwMTUtMDktMzAgMTI6MzA6NTkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJICBkZWludGVybGVhdmU6IHVzZSB0aGUgY2FwcyBxdWVyeSBmaWx0ZXIKKwkgIEl0IHdhcyBiZWluZyBpZ25vcmVkIGFuZCB3b3VsZCBsZWFkIHRvIHdyb25nIHJlc3VsdHMgaWYgdGhlCisJICBlbGVtZW50IGRvaW5nIHRoZSBxdWVyeSB3b3VsZCByZWx5IG9uIHRoZSBpbnRlcnNlY3Rpb24gYmVpbmcgbWFkZS4KKworMjAxNS0wOS0zMCAxMDowMDozMSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgIGRlaW50ZXJsZWF2ZTogaW1wbGVtZW50IGEgY2FwcyBxdWVyeSBoYW5kbGVyIGZvciB0aGUgc2lua3BhZAorCSAgSXQgd2FzIG1pc3NpbmcgYW5kIGFwcGFyZW50bHkgY29kZSByZWxpZWQgb24gaGF2aW5nIGl0IHRoZXJlCisJICBmb3Igbm90IGFsbG93aW5nIGEgY2hhbmdlIGluIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKworMjAxNS0wOS0zMCAwOTowNTowMyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgIGRlaW50ZXJsZWF2ZTogZml4IGNhcHMgbGVhaworCSAgQ2FwcyBmcm9tIHRoZSBwYWQgdGVtcGxhdGUgYXJlIGJlaW5nIGxlYWtlZC4gSW4gYW55IGNhc2UgaXQgaXMKKwkgIGZyb20gYSBzdGF0aWMgcGFkIHRlbXBsYXRlIGFuZCB3aWxsICdsZWFrJyBpbiB0aGUgZW5kLCBqdXN0IGRvaW5nCisJICB0aGUgY2xlYW51cCBmb3IgdGhlIGdvb2QgcHJhY3RpY2UuCisKKzIwMTUtMDktMjkgMTE6MTU6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2dka3BpeGJ1Zm92ZXJsYXkuYzoKKwkgIHRlc3RzOiBnZGtwaXhidWZvdmVybGF5OiBhZGQgbWluaW1hbCB1bml0IHRlc3QKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTU3NzMKKworMjAxNS0wOS0yOSAxMToxMjo0OCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5jOgorCSAgZ2RrcGl4YnVmc2luazogZG9uJ3QgbGVhayBvbGQgcGl4ZWwgYnVmZmVyIHdoZW4gc2V0dGluZyBhIG5ldyBvdmVybGF5CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1NzczCisKKzIwMTUtMDktMjggMjA6MjU6MjIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IGF2b2lkIHBvdGVudGlhbCBzdHJpbmcgb3ZlcmZsb3cKKwkgIFdlIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgZnVsbCBjb250cm9sIG92ZXIgdGhlIGlucHV0IHRhZ3MsIHNvCisJICBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIElTUkMgdGFnIGNvbnRhaW5zIGEgbG9uZ2VyIHN0cmluZyB0aGFuCisJICBleHBlY3RlZCwgaW4gd2hpY2ggY2FzZSB3ZSdkIHdyaXRlIG92ZXIgdGhlIGVuZCBvZiB0aGUgc3RhdGljLXNpemUKKwkgIDEzIGJ5dGUgYnVmZmVyIHRoYXQgaXMgRkxBQ19fU3RyZWFtTWV0YWRhdGFfQ3VlU2hlZXRfVHJhY2s6OmlzcmMuCisJICBNYWtlIHN1cmUgdG8gb25seSBjb3B5IHRoZSBJU1JDIGlmIGl0J3Mgbm90IHRvbyBsb25nLCBhbmQgbWFrZQorCSAgc3VyZSB0aGUgYnVmZmVyIHdlIHdyaXRlIHRvIGlzIGFsd2F5cyBOVUwtdGVybWluYXRlZCBieSB1c2luZworCSAgZ19zdHJsY3B5KCkuCisJICBDSUQgMTMyNDkzMS4KKworMjAxNS0wOS0yOCAxODowMzo1MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBSZW1vdmUgbGVmdG92ZXIgYXNzZXJ0aW9uIGZyb20gMC4xMAorCSAgV2Ugbm93IGFsbG9jYXRlIG1lbW9yeSB2aWEgR3N0QWxsb2NhdG9yIGFuZCBhcyBzdWNoIGNhbiBoYW5kbGUgYXJiaXRyYXJ5CisJICBhbGlnbm1lbnRzLCBub3Qgb25seSA8PSBHX01FTV9BTElHTi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTU3MDgKKworMjAxNS0wOS0yNSAxMDowMTozNyArMDIwMCAgR3VpbGxhdW1lIE1hcnF1ZWJpZWxsZSA8Z3VpbGxhdW1lLm1hcnF1ZWJpZWxsZUBwYXJyb3QuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogZml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGluIExPQVMgY29uZmlnIHJlYWRpbmcKKwkgIE9uIHJlYWRpbmcgTE9BUyBjb25maWcsIGZsYWcgdj0xIGFuZCB2QT0xIGNvbWJpbmF0aW9uIGNhbiBvY2N1ciwgbGVhZGluZyB0byB3YXJuaW5nCisJICAiU3BlYyBzYXlzICJUQkQiLi4uIi4gUmV0dXJuaW5nIFRSVUUgb24gdGhpcyBjYXNlIHdoaWxlIHBhcmFtZXRlcnMgJ3NhbXBsZV9yYXRlJyBhbmQKKwkgICdjaGFubmVscycgYXJlIHBvaW50aW5nIHRvIHVuaW5pdGlhbGl6ZWQgdmFsdWVzIGNhbiBlbmQgb24gc2V0dGluZyByYW5kb20gdmFsdWVzIGFzCisJICByYXRlIGFuZCBjaGFubmVscyBvbiBzcmMgY2Fwcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTU2MTEKKworMjAxNS0wOS0xOCAwMDo1ODoyMyArMTAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIEZpeCBzb21lIGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4gYnVpbGRpbmcgd2l0aCBHX0RJU0FCTEVfQVNTRVJUCisJICBUb3VjaGVzIHJ0cG1hbmFnZXIgYW5kIGdka3BpeGJ1ZnNpbmsKKworMjAxNS0wOC0xOCAxNDozMDo1NyArMDEwMCAgQ2hyaXMgQmFzcyA8Zmxvb2JsZWZsYW1AZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuYzoKKwkgIHF0ZGVtdXg6IHN1cHBvcnQgdGltZWQtdGV4dCBzdWJ0aXRsZSB0cmFja3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyODE4CisKKzIwMTUtMDktMjYgMDA6MTI6NDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGdzdDogRG9uJ3QgdXNlIGRlcHJlY2F0ZWQgZ3N0X3NlZ21lbnRfdG9fcG9zaXRpb24oKQorCisyMDE1LTA5LTIxIDEzOjQ3OjIxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHBiaW4vcnRwaml0dGVyYnVmZmVyL3J0c3BzcmM6IEFkZCBwcm9wZXJ0eSB0byBzZXQgbWF4aW11bSBtcyBiZXR3ZWVuIFJUQ1AgU1IgUlRQIHRpbWUgYW5kIGxhc3Qgb2JzZXJ2ZWQgUlRQIHRpbWUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTUxMjUKKworMjAxNS0wOS0xNiAxOToyODoxMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cGJpbi9zZXNzaW9uOiBBbGxvdyBSVENQIHN5bmMgdG8gaGFwcGVuIGJhc2VkIG9uIGNhcHR1cmUgdGltZSBvciBzZW5kIHRpbWUKKwkgIFNlbmQgdGltZSBpcyB0aGUgcHJldmlvdXMgYmVoYXZpb3VyIGFuZCB0aGUgZGVmYXVsdCwgYnV0IHRoZXJlIGFyZSB1c2UgY2FzZXMKKwkgIHdoZXJlIHlvdSB3YW50IHRvIHN5bmNocm9uaXplIGJhc2VkIG9uIHRoZSBjYXB0dXJlIHRpbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1MTI1CisKKzIwMTUtMDktMjUgMjM6NTE6MDkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQKKworPT09IHJlbGVhc2UgMS42LjAgPT09CisKKzIwMTUtMDktMjUgMjM6MTU6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjYuMAorCisyMDE1LTA5LTI1IDIyOjU3OjM0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDE1LTA5LTI1IDE0OjA4OjA5ICswMjAwICBUaGliYXVsdCBTYXVuaWVyIDx0c2F1bmllckBnbm9tZS5vcmc+CisKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJICBzbXB0ZWFscGhhOiBEbyBub3Qgc2V0IHdpZHRoL2hlaWdodCBiZWZvcmUgY29tcGFyaW5nIHdpdGggb2xkIHZhbHVlcworCSAgT3RoZXJ3aXNlIHdlIGVuZCB1cCBjb25zaWRlcmluZyB0aGUgdmFsdWVzIGRpZCBub3QgY2hhbmdlIGFuZCB3ZSB3cm9uZ2x5CisJICB3b3JrIHdpdGggdGhlIG9sZCB2aWRlbyBmb3JtYXQgKHdoaWNoIHdpbGwgbGVhZCB0byB3cm9uZworCSAgYmVoYXZpb3VyL3NlZ2ZhdWx0cykuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1NjIxCisKKzIwMTUtMDktMjMgMjA6NTk6MDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWNjdW11bGF0ZSBzZWdtZW50cyBmb3IgZWRpdCBsaXN0cyBiZWZvcmUgYWN0aXZhdGluZyB0aGUgbmV4dCBzZWdtZW50CisJICBlY2ViMmNjYzczOTA5MmQ5NjRkNzg5NDVlMTljMmVjZWRiZDIxNGUyIGJyb2tlIHNlZ21lbnQgc2Vla3MgYnkgYWx3YXlzCisJICBhY2N1bXVsYXRpbmcgc2VnbWVudHMgbWFudWFsbHkgd2hlbiBhY3RpdmF0aW5nIGEgc2VnbWVudC4gVGhpcyBpcyBvbmx5CisJICBuZWVkZWQgd2hlbiBoYW5kbGluZyBlZGl0IGxpc3RzLCBub3Qgd2hlbiBhY3RpdmF0aW5nIGEgc2VnbWVudCBiZWNhdXNlIG9mIGEKKwkgIHNlZWsuIERvIHRoZSBhY2N1bXVsYXRpb24gd2hlbiBzd2l0Y2hpbmcgZWRpdCBsaXN0IHNlZ21lbnRzIGluc3RlYWQuCisJICBUaGlzIGZpeGVzIHNlZ21lbnQgc2Vla3MgYWdhaW4sIHdoaWxlIGtlZXBpbmcgZWRpdCBsaXN0cyBwbGF5YmFjayB3b3JraW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NTQ3MQorCisyMDE1LTA5LTIzIDE3OjQzOjUxICswNTMwICBWaWtyYW0gRnVncm8gPHZpa3JhbS5mdWdyb0BnbWFpbC5jb20+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IHNlbmQgcGhhc2UgdmFsdWVzIGluIHRoZSBHc3RNZXNzYWdlIGZvciBQaGFzZSBpbmZvCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1NDYzCisKKzIwMTUtMDktMjIgMDA6NDY6MDEgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYS1tdXg6IERvbid0IG91dHB1dCBhIHdhcm5pbmcgb24gTU9OTyBtdWx0aXZpZXcgbW9kZS4KKworMjAxNS0wOS0xOSAxNzowMjoxOCArMDIwMCAgU2ViYXN0aWFuIFJhc211c3NlbiA8c2VicmFzQGhvdG1haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJICBydHB0aGVvcmFkZXBheTogRml4IG1lbW9yeSBsZWFrcworCSAgVGhlIHNhbWUgbWVtb3J5IGxlYWtzIHdlcmUgZml4ZWQgaW4gaWRlbnRpY2FsIGZhc2hpb24gZm9yCisJICB2b3JiaXNkZXBheSBpbiAwNmVmZWZmNWQ5Nzk1NzZhMjUyZTVkYWU1N2Y0NmQ2NDQ1YjFkZjEyIGluIDIwMDkuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1Mjc3CisKKzIwMTUtMDktMTkgMTc6MDQ6MDcgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJhc0Bob3RtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJICBydHB7dm9yYmlzLHRoZW9yYX17cGF5LGRlcGF5fTogQ29zbWV0aWMgY2xlYW51cAorCSAgKiB1c2UgZ19saXN0X2ZyZWVfZnVsbCgpLCBkb24ndCBpdGVyYXRlIGVsZW1lbnRzIG1hdWFsbHkgd2hlbiBmcmVlaW5nCisJICAqIGNhbGwgZ3N0X3J0cF8qX3BheV9jbGVhcl9wYWNrZXQoKSwgZG9uJ3QgZHVwbGljYXRlIGl0cyBjb2RlCisJICAqIHVzZSBnc3RfYnVmZmVyX3VucmVmKCkgdG8gY2xhcmlmeSB0aGF0IGl0IGlzIGJ1ZmZlcnMgYmVpbmcgcmVsZWFzZWQsCisJICBpbnN0ZWFkIG9mIHJlZmVyaW5nIGRpcmVjdGx5IHRvIGdzdF9taW5pX29iamVjdF91bnJlZigpCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU1Mjc3CisKKzIwMTUtMDktMTkgMTg6NDQ6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSAgcnRwe3ZvcmJpcyx0aGVvcmF9cGF5OiBTdG9yZSBoZWFkZXJzIGluIHRoZSBwYWNrZXQgYnVmZmVycyBsaXN0cywgbm90IGEgTlVMTCBidWZmZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTUyNjUKKworPT09IHJlbGVhc2UgMS41LjkxID09PQorCisyMDE1LTA5LTE4IDE5OjMzOjEzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFsczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS41LjkxCisKKzIwMTUtMDktMTggMTk6MjM6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2hyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTUtMDktMTggMTE6NTA6MzEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL3poX0NOLnBvOgorCSAgcG86IFVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxNS0wOS0xNyAxMDo1MDowMSArMDkwMCAgRXVuaGFlIENob2kgPGV1bmhhZTEuY2hvaUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IEZpeCB0YWdsaXN0IGxlYWsKKwkgIGdzdF90YWdfbGlzdF9pbnNlcnQoKSBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgaW5zZXJ0ZWQgdGFnbGlzdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTUxMzgKKworMjAxNS0wOS0xNiAwNzowNTozNiArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBTa2lwIExPQVMgQUFDIHVudGlsIGEgdmFsaWQgY29uZmlnIGlzIHNlZW4uCisJICBJdCdzIG5vcm1hbCB3aGVuIGRyb3BwaW5nIGludG8gdGhlIG1pZGRsZSBvZiBhIHN0cmVhbSB0bworCSAgbm90IGFsd2F5cyBoYXZlIHRoZSBjb25maWcgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LCBzbyBza2lwIExPQVMKKwkgIHVudGlsIGEgdmFsaWQgY29uZmlnIGlzIHNlZW4gd2l0aG91dCBlaXRoZXIgc2V0dGluZyBpbnZhbGlkCisJICBjYXBzIG9yIGVycm9yaW5nIG91dC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEzODYKKworMjAxNS0wOS0xMyAxNTo0MTozOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogcmVzZXQganVzdCBhIGJpdCBtb3JlIHVwb24gZmx1c2hfc3RvcAorCisyMDE1LTA5LTEzIDE1OjQwOjA5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiByZW1vdmUgZGVhZCBzdHJ1Y3QgbWVtYmVyCisKKzIwMTUtMDktMTEgMTc6MDk6MjggKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICBtdWx0aXVkcHNpbms6IGZpeCBHRXJyb3IgbWVtb3J5IGxlYWsgd2hlbiBob3N0bmFtZSByZXNvbHV0aW9uIGZhaWxzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU0ODY5CisKKzIwMTUtMDktMTAgMTU6MjY6NTQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgIG1hdHJvc2thbXV4OiBkcm9wIEhFQURFUiBmbGFnIGZyb20gb3V0cHV0IGJ1ZmZlcnMKKwkgIERyb3AgSEVBREVSIGZsYWcgZnJvbSBvdXRwdXQgYnVmZmVycyBpZiB0aGV5IGFyZSBub3QgaW5kZWVkCisJICBoZWFkZXJzLgorCSAgRml4ZXMgcmVzZW5kaW5nIG9mIGhlYWRlcnMgaW4gdGNwIGNvbm5lY3Rpb24gaGFuZGxpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTQ3NjgKKworMjAxNS0wOS0xMCAxNjowMDo1MCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgIG1hdHJvc2thbXV4OiBmaXggbWF0cm9za2FtdXggISBtYXRyb3NrYWRlbXV4CisJICBEb24ndCBjYXJyeSBvdmVyIERJU0NPTlQgZmxhZ3MgZnJvbSB0aGUgaW5wdXQgYnVmZmVycyB0byB0aGUKKwkgIG91dHB1dCBidWZmZXIsIG9yIHRoZSBkZW11eGVyIG1pZ2h0IHJlc2V0IGl0cyBzdGF0ZSB3aGVuIGl0CisJICByZWNlaXZlcyB0aGUgZmlyc3QgZGF0YSBidWZmZXIganVzdCBhZnRlciBwYXJzaW5nIHRoZSBzaW1wbGUKKwkgIGJsb2NrIGhlYWRlciwgYW5kIHRoZW4gZXhwZWN0IHNhbmUgZGF0YSB0byBmb2xsb3cuCisJICBGaXhlcyBtYXRyb3NrYW11eCAhIGRlbXV4IGVycm9yaW5nIG91dC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTQ3NjgKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTc4MDUKKworMjAxNS0wOS0wOSAxMjo1MTo0MCAtMDcwMCAgTWFydGluIEtlbGx5IDxtYXJ0aW5Ac3Vycm91bmQuaW8+CisKKwkqIGdzdC9ydHNwL1JFQURNRToKKwkgIHJ0c3A6IGZpeCBzbWFsbCBSRUFETUUgdHlwbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NDgwNworCisyMDE1LTA5LTA0IDE5OjQ1OjM3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgd2F2cGFja3BhcnNlOiBzZXQgYm90aCBwdHMgYW5kIGR0cyBzbyBiYXNlcGFyc2UgZG9lc24ndCBtYWtlIHVwIHdyb25nIGR0cyBhZnRlciBzZWVrcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjEwNgorCisyMDE1LTA5LTA0IDE5OjM0OjQxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBzZXQgYm90aCBwdHMgYW5kIGR0cyBzbyBiYXNlcGFyc2UgZG9lc24ndCBtYWtlIHVwIHdyb25nIGR0cyBhZnRlciBhIHNlZWsKKwkgIGZsYWMgY29udGFpbnMgdGhlIHNhbXBsZSBvZmZzZXQgaW4gdGhlIGZyYW1lIGhlYWRlciwgc28gYWZ0ZXIgYSBzZWVrCisJICB3aXRob3V0IGluZGV4IGZsYWNwYXJzZSB3aWxsIGtub3cgdGhlIGV4YWN0IHBvc2l0aW9uIHdlIGxhbmRlZCBvbiBhbmQKKwkgIHRpbWVzdGFtcCBidWZmZXJzIGFjY29yZGluZ2x5LiBJdCBvbmx5IHNldCB0aGUgcHRzIHRob3VnaCwgd2hpY2ggbWVhbnMKKwkgIHRoZSBiYXNlcGFyc2Utc2V0IGR0cyB3aGljaCB3YXMgc2V0IHRvIHRoZSBzZWVrIHBvc2l0aW9uIHByZXZhaWxzLCBhbmQKKwkgIHNpbmNlIHRoZSBzZWVrIHdhcyBiYXNlZCBvbiBhbiBlc3RpbWF0ZSwgdGhlcmUncyBsaWtlbHkgYSBkaXNjcmVwYW5jeQorCSAgYmV0d2VlbiB3aGVyZSB3ZSB3YW50ZWQgdG8gbGFuZCBhbmQgd2hlcmUgd2UgZGlkIGxhbmQsIHNvIGZyb20gaGVyZSBvbgorCSAgdGhhdCBkdHMvcHRzIGRpZmZlcmVuY2Ugd2lsbCBiZSBtYWludGFpbmVkLCB3aXRoIGR0cyBwb3NzaWJseSBtdWx0aXBsZQorCSAgc2Vjb25kcyBhaGVhZCBvZiBwdHMsIHdoaWNoIGlzIGp1c3Qgd3JvbmcuIFRoZSBlYXNpZXN0IHdheSB0byBmaXggdGhpcworCSAgaXMgdG8ganVzdCBzZXQgYm90aCBwdHMgYW5kIGR0cyBiYXNlZCBvbiB0aGUgc2FtcGxlIG9mZnNldCwgYnV0IHBlcmhhcHMKKwkgIHBhcnNlZCBhdWRpbyBzaG91bGQganVzdCBub3QgaGF2ZSBkdHMgc2V0IGF0IGFsbC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTIxMDYKKworMjAxNS0wOS0wNiAxNjozMzowMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSAgZG9jczogcmVtb3ZlIHByb3BlcnRpZXMgYW5kIHNpZ25hbHMgdGhhdCBubyBsb25nZXIgZXhpc3QKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjY0NDMKKworMjAxMy0xMC0xMSAxNToxMzowMCArMDAwMCAgR2VvcmdlIENocmlzcyA8Z3NjaHJpc3NAZ21haWwuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBNYWtlIHRoZSBlbGVtZW50IGNvdW50IGluIGFycmF5cyBub3QgaW5jbHVkZSBlbmQKKwkgIE9uZS1saW5lIHJlbW92YWwgb2YgdGFnc193cml0dGVuKysKKwkgIFRoaXMgc2hvdWxkIGZpeCBydG1wIG91dHB1dCB0byBjcnRtcHNlcnZlciwgYW5kIGhvcGVmdWxseQorCSAgbm9vbmUgaXMgZXhwZWN0aW5nIHRoYXQgdGhlIGVsZW1lbnQgY291bnQgaW5jbHVkZXMgdGhlIGVuZAorCSAgZWxlbWVudCwgYXMgZGlmZmVyZW50IGJpdHMgb2YgZG9jdW1lbnRhdGlvbiBzYXkgZGlmZmVyZW50CisJICB0aGluZ3MgYWJvdXQgd2hldGhlciBpdCBzaG91bGQgb3Igbm90LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MTYyNAorCisyMDE1LTA3LTMwIDAwOjU5OjE1ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4Lmg6CisJICBmbHZtdXg6IFN0b3JlIGluY29taW5nIGJpdHJhdGUgdGFncyBhbmQgc2VuZCBpbiB0aGUgbWV0YWRhdGEKKwkgIEFwcGFyZW50bHkgdGhlIE1pY3Jvc29mdCBBenVyZSBSVE1QIHNlcnZlciByZXF1aXJlcyB0aGF0IHRoZQorCSAgdmlkZW9kYXRhcmF0ZSBhbmQgYXVkaW9kYXRhcmF0ZSBtZXRhZGF0YSBiZSBwcm92aWRlZCwgc28KKwkgIHNldCB0aG9zZSwgZXZlbiBpZiBpdCdzIHRvIDAuIFVzZSB0aGUgYWN0dWFsIGlucHV0IGJpdHJhdGUKKwkgIHRhZ3MgaWYgYXZhaWxhYmxlLgorCisyMDE1LTA5LTA0IDAwOjA2OjI5ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogRG9uJ3QgcGFyc2Uga2V5IGRhdGEgbW9yZSB0aGFuIG5lZWRlZC4KKwkgIFdoZW4gYW4gYXV4aWxsaWFyeSBzdHJlYW1zIGFyZSBwcmVzZW50IGluIHRoZSBTRFAgbWVkaWEsCisJICB0aGVyZSdzIG5vIG5lZWQgdG8gcmUtcGFyc2UgdGhlIFNEUCBhdHRyaWJ1dGVzIG11bHRpcGxlCisJICB0aW1lcy4KKworMjAxNS0wOS0wMyAyMDo1Njo1NSArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IEZpeCBTUlRQICsgUlRYLCBhdXRoIGFjY2VzcywgYSBsZWFrLCBhbmQgYW4gaW52YWxpZCBtZW1vcnkgYWNjZXNzLgorCSAgSW4gcGFyc2Vfa2V5bWdtdCgpLCBkb24ndCBtdXRhdGUgdGhlIGlucHV0IHN0cmluZyB0aGF0J3MgYmVlbiBwYXNzZWQKKwkgIGFzIGNvbnN0LCBlc3BlY2lhbGx5IHNpbmNlIHdlIG1pZ2h0IG5lZWQgdGhlIG9yaWdpbmFsIHZhbHVlIGFnYWluIGlmCisJICB0aGUgc2FtZSBrZXkgaW5mbyBhcHBsaWVzIHRvIG11bHRpcGxlIHN0cmVhbXMgKFJUWCwgZm9yIGV4YW1wbGUpLgorCSAgV2hlbiBhIHJlc291cmNlIGlzIDQwNCwgYW5kIHdlIGhhdmUgYXV0aCBpbmZvIC0gcmV0cnkgd2l0aCB0aGUgYXV0aAorCSAgaW5mbyB0aGUgc2FtZSBhcyBpZiB3ZSBoYWQgcmVjZWl2ZSB1bmF1dGhvcmlzZWQsIGluIGNhc2UgdGhlIHJlc291cmNlCisJICBpc24ndCBldmVuIHZpc2libGUgdW50aWwgY3JlZGVudGlhbHMgYXJlIHN1cHBsaWVkLgorCSAgRml4IGEgbWVtb3J5IGxlYWsgaGFuZGxpbmcgTWlrZXkgZGF0YS4KKwkgIFdoZW4gZ2VuZXJhdGluZyBhIHJhbmRvbSBrZXlzdHJpbmcsIGRvbid0IG92ZXJydW4gdGhlIDMwIGJ5dGUKKwkgIGJ1ZmZlciBieSBnZW5lcmF0aW5nIDMyIGJ5dGVzIGludG8gaXQuCisKKzIwMTUtMDktMDQgMTU6MTg6MDUgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IEZpeCBidWlsZCB3aXRoIEdMaWIgPCAyLjQ0CisJICBHX0lPX0VSUk9SX0NPTk5FQ1RJT05fQ0xPU0VEIHdhcyBhZGRlZCBpbiAyLjQ0LgorCisyMDE1LTA5LTA0IDEyOjAxOjUyICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBJZ25vcmUgR19JT19FUlJPUl9DT05ORUNUSU9OX0NMT1NFRCB3aGVuIHJlY2VpdmluZyBkYXRhCisJICBUaGlzIGhhcHBlbnMgb24gV2luZG93cyBpZiB3ZSB1c2UgdGhlIHNhbWUgc29ja2V0IGZvciBzZW5kaW5nIHBhY2tldHMsCisJICBhbmQgdGhlIHJlbW90ZSBzZW5kcyBJQ01QIHBvcnQvaG9zdCB1bnJlYWNoYWJsZSBtZXNzYWdlcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTQ1MzQKKworMjAxNS0wOS0wMiAyMToxMjo0MSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOgorCSAgcnRwdm9yYmlzL3RoZW9yYWRlcGF5OiBGaXggaGFuZGxpbmcgb2YgZnJhZ21lbnRlZCBwYWNrZXRzCisJICBUaGlzIHdhcyBicm9rZW4gaW4gYjEwODlmYjUyMCBieSBub3QgY29uc2lkZXJpbmcgdGhlIGZ1bGwgcGFja2V0IGxlbmd0aCBvZiBhCisJICBmcmFnbWVudGVkIHBhY2tldCBidXQgb25seSB0aGUgbGVuZ3RoIG9mIHRoZSBmaXJzdCBvbmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU0NDE3CisKKzIwMTUtMDktMDEgMTU6Mzk6MjIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIGR0bWZzcmM6IFJlcGx5IHRvIGxhdGVuY3kgcXVlcnkKKworMjAxNS0wOC0zMSAxNjo0MjozMCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwc2Vzc2lvbi5jOgorCSAgdGVzdHM6IEZpeCBydHBzZXNzaW9uIHRlc3QgZmFpbHVyZQorCSAgVGhlIHRpbWUgb2YgdGhlIGZpcnN0IFJUQ1AgcGFja2V0IGlzIHNlbWktcmFuZG9tLCBzbworCSAgc29tZXRpbWVzIGl0IHdhcyBwcm9kdWNlZCBiZWZvcmUgZW5vdWdoIHBhY2tldHMgZnJvbQorCSAgdGhlIHNlY29uZCBTU1JDIHdlcmUgcmVjZWl2ZWQuIEZpcnN0IGRyb3AgcXVldWVkIFJUQ1AKKwkgIHBhY2tldHMsIHRoZW4gYWR2YW5jZSB0aGUgY2xvY2sgZW5vdWdoIHRvIGVuc3VyZQorCSAgdGhhdCBhdCBsZWFzdCBvbmUgbmV3IFJUQ1AgcGFja2V0IGlzIHByb2R1Y2VkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MDczMQorCisyMDE1LTA4LTMxIDEzOjU2OjA0ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgbGV2ZWw6IGltcHJvdmUgdGhlIHRlc3QgZm9yIG11bHRpLWNoYW5uZWwgbW9kZQorCSAgQ2hhbmdlIHRoZSB0ZXN0IHRvIHZlcmlmeSB0aGUgcmVhZC1pbmRleCBmb3IgbXVsdGlwbGUgbWVzc2FnZXMgcGVyIGJ1ZmZlci4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU0MTQ0CisKKzIwMTUtMDgtMzEgMTI6NDY6NTIgKzAyMDAgIEphbiBBbGV4YW5kZXIgU3RlZmZlbnMgKGhlZnRpZykgPGphbi5zdGVmZmVuc0BnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogQWxpZ24gcmF3IHZpZGVvIGZyYW1lcyB0byAzMiBieXRlcworCSAgT3V0cHV0dGluZyB1bmFsaWduZWQgdmlkZW8gZnJhbWVzIGNhdXNlcyB2aWRlb3NjYWxlIGV0IGFsIHRvCisJICBjcmFzaCB3aGVuIGF0dGVtcHRpbmcgU0lNRC1hY2NlbGVyYXRlZCBjb252ZXJzaW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjk2NQorCisyMDE1LTA4LTI2IDIzOjE2OjQ2ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGxldmVsOiBmaXggbGV2ZWwgY2FsY3VsYXRpb25zIGZvciBtdXRsaXBsZSBjaGFubmVscworCSAgVGhpcyB3YXMgYnJva2VuIHdpdGggN2I5MGJmMzIxNTA4OTdhMTQxYTI5YTEyZWNhYjU1NWQ4YzViN2ZhYi4KKworMjAxNS0wOC0yNyAxMDoyODo1NSArMDUzMCAgUmF2aSBLaXJhbiBLIE4gPHJhdmkua2lyYW5Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSAgc21wdGU6IEZpeCBtZW1vcnkgbGVhaworCSAgSW4gZ3N0X3NtcHRlX2NvbGxlY3RlZCgpLCBjaGVjayB1cGZyb250IGlmIGlucHV0IGZvcm1hdHMgYXJlIHNhbWUKKwkgIG9yIG5vdC4gVGhpcyBhdm9pZHMgYWxsb2NhdGlvbiBvZiBpbjEgYW5kIGluMiBidWZmZXJzIGFuZAorCSAgc3Vic2VxdWVudCBtZW1vcnkgbGVhayB3aGVuIGlucHV0IGZvcm1hdHMgZG8gbm90IG1hdGNoLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1NDE1MworCisyMDE1LTA4LTIxIDExOjUyOjE5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSAgdGVzdHM6IHNvdXBodHRwc3JjOiBkb24ndCB0cnkgdG8gY29ubmVjdCB0byBkZWFkIHJhZGlvIHNlcnZlcgorCisyMDE1LTA4LTIxIDE2OjI5OjE2ICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBUcml2aWFsIGZpeCB0byBjaGVjayBjb3JyZWN0IGNvbmRpdGlvbgorCSAgV2hlbiBjaGVja2luZyBmb3IgZGVzY3JpYmUgbWV0aG9kLCBiZWNhdXNlIG9mIG1pc3NpbmcgcGFyZW50aGVzZXMsIHdyb25nCisJICBjb25kaXRpb24gaXMgYmVpbmcgY2hlY2tlZCwgd2hpY2ggd2lsbCByZXN1bHQgaW4gd3JvbmcgYmVoYXZpb3IuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzOTEyCisKKzIwMTUtMDgtMjEgMTM6MTk6MDIgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2E6IHJlYWQ6IGZpeCB0YWcgbGlzdCBtZW1vcnkgbGVhaworCSAgZ3N0X3RvY19lbnRyeV9tZXJnZV90YWdzIG1ha2VzIGEgbmV3IHJlZiBvZiB0aGUgdGFnbGlzdCwgc28gaXQgc2hvdWxkCisJICBiZSB1bnJlZidlZCBhcyBzb29uIGFzIHRoZSB0YWdzIGFyZSBtZXJnZWQgdG8gdGhlIHRvY2VudHJ5CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzOTA0CisKKzIwMTUtMDgtMjEgMTI6MjA6NTkgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkgIHdhdnBhY2tkZWM6IGZpeCB0YWdsaXN0IG1lbW9yeSBsZWFrCisJICBXaGVuIHBhc3NpbmcgdGhlIHRhZ2xpc3QgdG8gZ3N0X2F1ZGlvX2RlY29kZXJfbWVyZ2VfdGFncywgdGhlIHJlZmVyZW5jZSBpcyBpbmNyZWFzZWQKKwkgIGJ5IGF1ZGlvZGVjb2RlciBhbmQgdGhlIGNhbGxlciBzaG91bGQgZnJlZSB0aGUgdGFnbGlzdCBiZWluZyBwYXNzZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzOTAzCisKKzIwMTUtMDgtMjAgMTQ6NDU6MzMgKzAyMDAgIEplYW4tTWljaGVsIEhhdXRib2lzIDxqZWFuLW1pY2hlbC5oYXV0Ym9pc0B2ZW8tbGFicy5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IGZpeCBwYWQgY2xvc2luZworCSAgU2lnbmVkLW9mZi1ieTogSmVhbi1NaWNoZWwgSGF1dGJvaXMgPGplYW4tbWljaGVsLmhhdXRib2lzQHZlby1sYWJzLmNvbT4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM4NzUKKworPT09IHJlbGVhc2UgMS41LjkwID09PQorCisyMDE1LTA4LTE5IDEzOjI5OjUzICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjUuOTAKKworMjAxNS0wOC0xOSAxMjo0Nzo0MiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNS0wOC0xOSAxMToyOTo1NSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vZWwucG86CisJKiBwby96aF9DTi5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTUtMDgtMTMgMTc6Mjk6NTggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJICBtdWx0aWZpbGVzcmM6IGZpeCByZWdyZXNzaW9uIHdpdGggc3RhcnRpbmcgZnJvbSBpbmRleCBzZXQgdmlhIGluZGV4IHByb3BlcnR5CisJICBXaGVuIHdlIGhhdmVuJ3Qgc3RhcnRlZCB5ZXQsIHNldCB0aGUgc3RhcnRfaW5kZXggd2hlbiB3ZSBzZXQgdGhlIGluZGV4IHByb3BlcnR5LAorCSAgc28gdGhhdCB3ZSBzdGFydCBhdCB0aGUgcmlnaHQgaW5kZXggcG9zaXRpb24gYWZ0ZXIgdGhlIGluaXRpYWwgc2Vlay4gVGhlIGluZGV4CisJICBwcm9wZXJ0eSB3YXMgbmV2ZXIgcmVhbGx5IG1lYW50IHRvIGJlIGZvciB3cml0aW5nLCBidXQgaXQgdXNlZCB0byB3b3JrLCBzbyBsZXQncworCSAgc3VwcG9ydCBpdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM5NDcyCisKKzIwMTUtMDgtMTggMTA6NTI6MTEgKzAxMDAgIEFsZXggQXNobGV5IDxidWd6aWxsYUBhc2hsZXktZmFtaWx5Lm5ldD4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggb2Zmc2V0IGNhbGN1bGF0aW9uIHdoZW4gcGFyc2luZyBDRU5DIGF1eCBpbmZvCisJICBDb21taXQgN2Q3ZTU0Y2U2ODYzZmY1M2UxODhkMDI3NmQyNjUxYjY1MDgyZmZkYiBhZGRlZCBzdXBwb3J0IGZvcgorCSAgREFTSCBjb21tb24gZW5jcnlwdGlvbiwgaG93ZXZlciBjb21taXQKKwkgIGJiMzM2ODQwYzBiMGIwMmZhMThkYzQ0MzdjZTBkZWQzZDkxNDI4MDEgdGhhdCB3ZW50IG9udG8gbWFzdGVyCisJICBzaG9ydGx5IGJlZm9yZSB0aGUgQ0VOQyBjb21taXQgY2F1c2VkIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgQ0VOQworCSAgYXV4IGluZm8gb2Zmc2V0IHRvIGJlIGluY29ycmVjdC4KKwkgIFRoZSBiYXNlX29mZnNldCB3YXMgYmVpbmcgYWRkZWQgaWYgcHJlc2VudCwgYnV0IGlmIHRoZSBiYXNlX29mZnNldAorCSAgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtb29mLCB0aGUgb2Zmc2V0IHdhcyBiZWluZyBhZGRlZCB0d2ljZS4KKwkgIFRoZSBjb3JyZWN0IGFwcHJvYWNoIGlzIHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZQorCSAgbW9vZiBhbmQgdXNlIHRoYXQgb2Zmc2V0IHdoZW4gcGFyc2luZyB0aGUgQ0VOQyBhdXggaW5mby4KKworMjAxNS0wOC0xNyAxNDoyODoyNCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBhY3R1YWxseSByZXR1cm4gdHJ1ZSBmb3IgYWNjZXB0LWNhcHMgcXVlcnkgaGFuZGxpbmcKKworMjAxNS0wOC0xNyAxNDowNzoxMCArMDkwMCAgSHl1bmp1biBLbyA8enpvb24ua29Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwa2x2cGF5LmM6CisJICBydHA6IGNvcHkgbWV0YWRhdGEgaW4gdGhlIChkZSlwYXlsb2FkZXJzIHdoaWNoIGlzIG1pc3NlZCBiZWZvcmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM3MDYKKworMjAxNS0wOC0xNiAxNToyMTo1MSAtMDQwMCAgRHVzdGluIFNwaWN1enphIDxkdXN0aW5AdmlydHVhbHJvYWRzaWRlLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oOgorCSAgZGlyZWN0c291bmRzaW5rOiBhbGxvdyBzcGVjaWZ5aW5nIGF1ZGlvIHBsYXliYWNrIGRldmljZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MzY3MAorCisyMDE1LTA4LTE2IDEzOjUxOjQ3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IHJlbW92ZSBzaW5nbGUgZW50cnkgaWYgZnJvbSBsb29wCisJICBJdGVyYXRlIGZyb20gdGhlIDJuZCBjaGFubmVsIG9uIGFuZCBjcmVhdGUgdGhlIDEgY2hhbm5lbCBzdHJ1Y3QKKwkgIG91dHNpZGUgdG8gbWFrZSBsb29wIHN0cnVjdHVyZSBzaW1wbGVyIGFuZCBvbmx5IHNsaWdodGx5IGZhc3Rlci4KKworMjAxNS0wOC0xNiAxMzoyMTo0MSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBpbXBsZW1lbnQgcHJvcGVyIGFjY2VwdC1jYXBzCisJICBTaG91bGQganVzdCBjb21wYXJlIHdpdGggd2hhdCBjYW4gYmUgaW1tZWRpYXRlbGx5IGFjY2VwdGVkIGJ5CisJICB0aGUgZWxlbWVudC4gZmxhY2VuYyBjYW4ndCByZW5lZ290aWF0ZSBzbyBpZiBpdCBoYXMgYSBjYXBzIGFscmVhZHkKKwkgIGl0IHNob3VsZCBvbmx5IGFjY2VwdCBpZiBpdCBpcyB0aGF0IGNhcHMgb3RoZXJ3aXNlIGp1c3QgdXNlIHRoZQorCSAgdGVtcGxhdGUgY2FwcworCisyMDE1LTA4LTE2IDEzOjAzOjM2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IGltcHJvdmUgc2luayBwYWQgdGVtcGxhdGUgY2FwcworCSAgUmVtb3ZlcyB0aGUgbmVlZCBmb3IgY3VzdG9tIGNhcHMgcXVlcnkgaGFuZGxpbmcgYW5kIG1ha2VzIGl0IG1vcmUKKwkgIGNvcnJlY3QgZnJvbSB0aGUgYmVnaW5uaW5nIG9uIHRoZSB0ZW1wbGF0ZS4gSXQgaXMgYSBiaXQgdWdsaWVyCisJICB0byByZWFkIGJlY2F1c2UgdGhlcmUgaXMgMSBlbnRyeSBwZXIgY2hhbm5lbCBidXQgbWFrZXMgY29kZSBlYXNpZXIKKwkgIHRvIG1haW50YWluLgorCisyMDE1LTA4LTE2IDEyOjQxOjU2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICB5NG1lbmNvZGU6IGZpeCBnc3QtbGF1bmNoIHZlcnNpb24gaW4gZG9jdW1lbnRhdGlvbgorCisyMDE1LTA4LTE1IDIyOjMyOjIxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzoKKwkgIGF1ZGlvZW5jb2RlcnM6IHVzZSB0ZW1wbGF0ZSBzdWJzZXQgY2hlY2sgZm9yIGFjY2VwdC1jYXBzCisJICBJdCBpcyBmYXN0ZXIgdGhhbiBkb2luZyBhIHF1ZXJ5IHRoYXQgcHJvcGFnYXRlcyBkb3duc3RyZWFtIGFuZAorCSAgc2hvdWxkIGJlIGVub3VnaAorCSAgRWxlbWVudHM6IHNwZWV4ZW5jLCB3YXZwYWNrZW5jLCBtdWxhd2VuYywgYWxhd2VuYworCisyMDE1LTA4LTE1IDIyOjI5OjQxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICB2aWRlb2VuY29kZXJzOiB1c2UgdGVtcGxhdGUgc3Vic2V0IGNoZWNrIGZvciBhY2NlcHQtY2FwcworCSAgSXQgaXMgZmFzdGVyIHRoYW4gZG9pbmcgYSBxdWVyeSB0aGF0IHByb3BhZ2F0ZXMgZG93bnN0cmVhbSBhbmQKKwkgIHNob3VsZCBiZSBlbm91Z2gKKwkgIEVsZW1lbnRzOiBqcGVnZW5jLCBwbmdlbmMsIHZwOGVuYywgdnA5ZW5jLCB5NG1lbmMKKworMjAxNS0wOC0xNiAxNzoyMToyNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgbXBlZ2F1ZGlvcGFyc2U6IHVzZSBuZXcgYmFzZXBhcnNlIEFQSSB0byBmaXggdGFnIGhhbmRsaW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc5NzY4CisKKzIwMTUtMDMtMTcgMTc6NTA6MzcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0c2JjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IHVzZSBuZXcgYmFzZSBwYXJzZSBBUEkgdG8gZml4IHRhZyBoYW5kbGluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3OTc2OAorCisyMDE1LTA4LTE2IDE0OjM3OjUzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiB1c2UgbmV3IGJhc2VwYXJzZSBBUEkgYW5kIGZpeCB0YWcgaGFuZGxpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Nzk3NjgKKworMjAxNS0wOC0xNiAxMzowNDowMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBVc2Ugc2lnbmVkIGludGVnZXIgdHlwZSB0byBiZSBhYmxlIHRvIGNoZWNrIGZvciBuZWdhdGl2ZSBzdWJ0cmFjdGlvbiByZXN1bHRzCisJICBDSUQgMTMxNTgyOQorCisyMDE1LTA4LTE2IDExOjUwOjM0ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJICBydHB2b3JiaXNkZXBheTogcmVtb3ZlIGRlYWQgY29kZQorCSAgcGF5bG9hZF9idWZmZXIgbXVzdCBiZSBOVUxMIGluIGlnbm9yZV9yZXNlcnZlZC4gQ2hlY2sgd2lsbCBhbHdheXMgYmUgZmFsc2UuCisJICBJbnRyb2R1Y2VkIGJ5IGIxMDg5ZmI1MjA3Njk3YmEyNmVkYjRmZjY2ZWQwZjQ2NWM2ZGYzY2YKKwkgIENJRCAjMTMxNjQ3NgorCisyMDE1LTA4LTE1IDIyOjQ1OjUzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuaDoKKwkgIGFsYXdlbmM6IHBvcnQgdG8gQXVkaW9FbmNvZGVyIGJhc2UgY2xhc3MKKworMjAxNS0wOC0xNSAwOToxNjoyMyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJICBhdWRpb2RlY29kZXJzOiB1c2UgZGVmYXVsdCBwYWQgYWNjZXB0LWNhcHMgaGFuZGxpbmcKKwkgIEF2b2lkcyB1c2VsZXNzIGNoZWNrIG9mIGRvd25zdHJlYW0gY2FwcyB3aGVuIGhhbmRsaW5nIGFuCisJICBhY2NlcHQtY2FwcyBxdWVyeQorCSAgRWxlbWVudHM6IGZsYWNkZWMsIHNwZWV4ZGVjLCB3YXZwYWNrZGVjLCBtdWxhd2RlYywgYWxhd2RlYworCisyMDE1LTA4LTE1IDA4OjQ5OjU3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZweC9nc3R2cDlkZWMuYzoKKwkgIHZpZGVvZGVjb2RlcnM6IHVzZSBkZWZhdWx0IHBhZCBhY2NlcHQtY2FwcyBoYW5kbGluZworCSAgQXZvaWRzIHVzZWxlc3MgY2hlY2sgb2YgZG93bnN0cmVhbSBjYXBzIHdoZW4gaGFuZGxpbmcgYW4KKwkgIGFjY2VwdC1jYXBzIHF1ZXJ5CisJICBFbGVtZW50czoganBlZ2RlYywgcG5nZGVjLCB2cDhkZWMsIHZwOWRlYworCisyMDE1LTA4LTE1IDExOjMxOjA0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkgIGFsYXdkZWM6IG1ha2UgZXJyb3IgaGFuZGxpbmcgYSBiaXQgbmljZXIKKwkgIFByaW50IHRoZSBlbGVtZW50IGFsb25nIHdpdGggdGhlIGRlYnVnIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHRyYWNlCisJICB0aGUgZmFpbHVyZXMKKworMjAxNS0wOC0xNSAxMTowNDoxNiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmg6CisJICBhbGF3ZGVjOiBwb3J0IHRvIGF1ZGlvZGVjb2RlciBiYXNlIGNsYXNzCisJICBtdWxhd2RlYyB3YXMgYWxyZWFkeSBwb3J0ZWQsIGFsYXdkZWMgd2FzIGxlZnQgYmVoaW5kLgorCisyMDE1LTA4LTE1IDEwOjM0OjE0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogb25seSBsb29rIGZvciBtb3JlIHNhbXBsZXMgaW4gbW9vZnMgaW4gcHVsbC1tb2RlCisJICBGb3IgcGxheWJhY2sgb2Ygc29tZSBmcmFnbWVudGVkIGZvcm1hdHMgd2l0aCBxdGRlbXV4IGl0IHdpbGwKKwkgIHRyeSB0byBsb29rIGZvciB0aGUgbmV4dCBtb29mIGFmdGVyIGZpbmlzaGluZyBvbmUgYnV0IGl0IGlzIG9ubHkKKwkgIHBvc3NpYmxlIGZvciBwdWxsLW1vZGUuIEZvciBwbGF5YmFjayBvZiBzdHJlYW1pbmcgZnJhZ21lbnRlZCBmb3JtYXRzCisJICBzdWNoIGFzIERBU0ggaXQgc2hvdWxkIGp1c3Qgbm90IHRyeSB0byBsb29rIGZvciBhbm90aGVyIG1vb2YgYnV0CisJICBpbnN0ZWFkIHdhaXQgZm9yIG1vcmUgZGF0YS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTI2MDIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTI2MDMKKworMjAxNS0wOC0xNSAxMjo1ODo1MCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSAgZGNhcGFyc2U6IERvbid0IGxvb2sgZm9yIGEgc2Vjb25kIHN5bmN3b3JkCisJICBUaGVyZSBhcmUgc3RyZWFtcyBvdXQgdGhlcmUgdGhhdCBjb25zaXN0ZW50bHkgY29udGFpbiBnYXJiYWdlIGJldHdlZW4KKwkgIGV2ZXJ5IGZyYW1lIHNvIHdlIG5ldmVyIGV2ZXIgZmluZCBhIHNlY29uZCBjb25zZWN1dGl2ZSBzeW5jd29yZC4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM4MjM3CisKKzIwMTUtMDgtMTUgMTE6MTI6MDUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnB4L2dzdHZwOWVuYy5jOgorCSAgdnA4ZW5jLCB2cDllbmM6IHJlc2V0IG11bHRpcGFzcyBmaWxlIGluZGV4IHdoZW4gc3RvcHBpbmcgZW5jb2RlcgorCSAgRml4ZXMgbXVsdGlwYXNzIGVuY29kaW5nIHdoZW4gcmUtdXNpbmcgdGhlIHNhbWUgZWxlbWVudC9waXBlbGluZQorCSAgZm9yIHN1YnNlcXVlbnQgZW5jb2RpbmcgcnVucy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDc3MjgKKworMjAxNS0wOC0xNSAxMTowOTo0MiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkqIGV4dC92cHgvZ3N0dnA5ZW5jLmg6CisJICB2cDllbmM6IHByb3ZpZGUgc3VwcG9ydCBmb3IgbXVsdGlwbGUgcGFzcyBjYWNoZSBmaWxlcworCSAgU29tZSBmaWxlcyBtYXkgcHJvdmlkZSBkaWZmZXJlbnQgY2FwcyBpbnNpZ2h0IG9mIG9uZSBzdHJlYW0uIFNpbmNlCisJICB2cDllbmMgc3VwcG9ydCBjYXBzIHJlaW5pdCwgd2Ugc2hvdWxkIHN1cHBvcnQgY2FjaGUgcmVpbml0IHRvby4KKwkgIElmIG1vcmUgdGhlbiBmaWxlIGNhY2hlIGZpbGUgd2lsbCBiZSBjcmVhdGVkLCB0aGUgbmFtaW5nIHdpbGwgYmU6CisJICBjYWNoZSBjYWNoZS4xIGNhY2hlLjIgLi4uCisJICBCYXNlZCBvbiBwYXRjaCBieTogT2xla3NpaiBSZW1wZWwgPGxpbnV4QHJlbXBlbC1wcml2YXQuZGU+CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3NzI4CisKKzIwMTUtMDgtMTQgMTE6NDE6NDIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYWFjcGFyc2UuYzoKKwkgIHRlc3RzOiBhYWNwYXJzZTogdXNlIGNhcHMgcXVlcnkgaW5zdGVhZCBvZiBhY2NlcHQtY2FwcworCSAgVGhlIGFjY2VwdC1jYXBzIHF1ZXJ5IGp1c3QgZG9lcyBhIHNoYWxsb3cgY2hlY2sgYXQgdGhlIGN1cnJlbnQKKwkgIGVsZW1lbnQgd2hpbGUgYXQgdGhpcyB0ZXN0IHdlIHdhbnQgaXQgdG8gYWxzbyBsb29rIGF0IGRvd25zdHJlYW0uCisJICBTbyB1c2UgY2FwcyBxdWVyeSB0aGVyZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM2MjMKKworMjAxNS0wOC0xNCAxMTo0MDoyMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2VyczogZW5hYmxlIGFjY2VwdC10ZW1wbGF0ZSBmbGFnCisJICBEbyBhIHF1aWNrIGNoZWNrIHdpdGggdGhlIHBhZCB0ZW1wbGF0ZSBjYXBzIGFzIGl0IGlzIGVub3VnaC4gVXNlcnMKKwkgIHNob3VsZCBoYXZlIGZpZ3VyZWQgdGhlIGFwcHJvcHJpYXRlIGZ1bGwgY2FwcyBvbiBhIHByZXZpb3VzIGNhcHMgcXVlcnkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM2MjMKKworMjAxNS0wOC0xNCAxNTo0Njo1MyArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogc2VuZCB0aGUgVXNlci1BZ2VudCBoZWFkZXIKKwkgIFNvbWV0aW1lcyBpdCBpcyB1c2VmdWwgdG8ga25vdyB0aGlzIGluZm9ybWF0aW9uIG9uIHRoZQorCSAgc2VydmVyIHNpZGUuIE90aGVyIHBvcHVsYXIgaW1wbGVtZW50YXRpb25zICh2bGMsIGZmbXBlZywgLi4uKQorCSAgYWxzbyBzZW5kIHRoaXMgaGVhZGVyIG9uIGV2ZXJ5IG1lc3NhZ2UuCisJICBUaGlzIGluY2x1ZGVzIGEgbmV3ICJ1c2VyLWFnZW50IiBwcm9wZXJ0eSB0aGF0IHRoZSB1c2VyCisJICBjYW4gc2V0IHRvIHVzZSBhIGN1c3RvbSBVc2VyLUFnZW50IHN0cmluZy4gVGhlIGRlZmF1bHQKKwkgIGlzICJHU3RyZWFtZXIvPHZlcnNpb24+IgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MDEwMQorCisyMDE1LTA4LTE0IDE1OjQyOjQyICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiB3cmFwIGdzdF9ydHNwX21lc3NhZ2VfaW5pdF9yZXF1ZXN0IGluIGEgbG9jYWwgZnVuY3Rpb24KKwkgIFRoaXMgd2lsbCBhbGxvdyBhZGRpbmcgY29tbW9uIHJlcXVlc3QgaW5pdGlhbGl6YXRpb24sIGxpa2UgdGhlCisJICB1c2VyIGFnZW50IHN0cmluZywgaW4ganVzdCBvbmUgcGxhY2UuCisKKzIwMTUtMDgtMTQgMDk6MzY6MDkgKzA1MzAgIFByYXNoYW50IEdvdGFybmUgPHBzLmdvdGFybmVAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSAgYXVkaW9lY2hvOiBtYWtlIHN1cmUgYnVmZmVyIGdldHMgcmVhbGxvY2F0ZWQgaWYgbWF4X2RlbGF5IGNoYW5nZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM0OTAKKworMjAxNS0wNy0wOSAwOTo1MToyNiArMDIwMCAgT2xla3NpaiBSZW1wZWwgPGxpbnV4QHJlbXBlbC1wcml2YXQuZGU+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnB4L2dzdHZwOGVuYy5oOgorCSAgdnA4ZW5jOiBwcm92aWRlIHN1cHBvcnQgZm9yIG11bHRpcGxlIHBhc3MgY2FjaGUgZmlsZXMKKwkgIFNvbWUgZmlsZXMgbWF5IHByb3ZpZGUgZGlmZmVyZW50IGNhcHMgaW5zaWdodCBvZiBvbmUgc3RyZWFtLiBTaW5jZSB2cDhlbmMKKwkgIHN1cHBvcnQgY2FwcyByZWluaXQsIHdlIHNob3VsZCBzdXBwb3J0IGNhY2hlIHJlaW5pdCB0b28uCisJICBJZiBtb3JlIHRoZW4gZmlsZSBjYWNoZSBmaWxlIHdpbGwgYmUgY3JlYXRlZCwgdGhlIG5hbWluZyB3aWxsIGJlOgorCSAgY2FjaGUKKwkgIGNhY2hlLjEKKwkgIGNhY2hlLjIKKwkgIC4uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NzcyOAorCisyMDE1LTA0LTE1IDIyOjUxOjUxICswMjAwICBSYW1pcm8gUG9sbGEgPHJhbWlyby5wb2xsYUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJICBydHBtcDRnZGVwYXk6IGZpeCB0aW1lc3RhbXBzIGZvciBSVFAgcGFja2V0cyB3aXRoIG11bHRpcGxlIEFVcworCSAgVXNlIGNvbnN0YW50RHVyYXRpb24gdG8gY2FsY3VsYXRlIHRoZSB0aW1lc3RhbXAgb2Ygbm9uLWZpcnN0IEFVIGluIHRoZQorCSAgUlRQIHBhY2tldC4KKwkgIElmIGNvbnN0YW50RHVyYXRpb24gaXMgbm90IHByZXNlbnQgaW4gdGhlIE1JTUUgcGFyYW1ldGVycywgaXRzIHZhbHVlCisJICBtdXN0IGJlIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIHRpbWluZyBpbmZvcm1hdGlvbiBmcm9tIHR3byBjb25zZWN1dGl2ZQorCSAgUlRQIHBhY2tldHMgd2l0aCBBVS1JbmRleCBlcXVhbCB0byAwLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0Nzg4MQorCisyMDE1LTA4LTE0IDA2OjQzOjEzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogcmVtb3ZlIHVubmVjZXNzYXJ5IGlmLCBnX2ZyZWUgaXMgbnVsbCBzYWZlCisKKzIwMTUtMDgtMTQgMDg6MzM6NTYgKzAxMDAgIEFsZXggQXNobGV5IDxidWd6aWxsYUBhc2hsZXktZmFtaWx5Lm5ldD4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJICBzb3VwaHR0cHNyYzogYWRkIHByb3BlcnR5IHRvIHNldCBIVFRQIG1ldGhvZAorCSAgVG8gYWxsb3cgc291cGh0dHBzcmMgdG8gYmUgdXNlIEhUVFAgbWV0aG9kcyBvdGhlciB0aGFuIEdFVAorCSAgKGUuZy4gSEVBRCksIGFkZCBhICJtZXRob2QiIHByb3BlcnR5IHRoYXQgaXMgYSBzdHJpbmcuIElmIHRoaXMKKwkgIHByb3BlcnR5IGlzIG5vdCBzZXQsIEdFVCBpcyB1c2VkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjQxMworCisyMDE1LTA4LTE0IDExOjEzOjAxICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9nZW5lcmljL3N0YXRlcy5jOgorCSAgY2hlY2s6IFJlbmFtZSBzdGF0ZXMgdW5pdCB0ZXN0CisJICBNYWtlcyBpdCBlYXNpZXIgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIG90aGVyIG1vZHVsZXMgc3RhdGVzIHVuaXQgdGVzdAorCisyMDE1LTA4LTE0IDA5OjIxOjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZ29vbS9nc3RhdWRpb3Zpc3VhbGl6ZXIuYzoKKwkqIGdzdC9nb29tL2dzdGF1ZGlvdmlzdWFsaXplci5oOgorCSogZ3N0L2dvb20yazEvZ3N0YXVkaW92aXN1YWxpemVyLmM6CisJKiBnc3QvZ29vbTJrMS9nc3RhdWRpb3Zpc3VhbGl6ZXIuaDoKKwkgIGdvb206IFJlbmFtZSBnZXRfdHlwZSgpIGZ1bmN0aW9uIG9mIGJhc2UgY2xhc3MgdG8gcHJldmVudCBzeW1ib2wgY29uZmxpY3RzCisJICBUaGlzIGlzIGEgcHJvYmxlbSB3aGVuIHN0YXRpY2FsbHkgbGlua2luZy4KKworMjAxNS0wOC0xMyAxNjozMjo1NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IEtlZXAgdGhlIERUUyBlc3RpbWF0ZSBpZiB3ZSBnb3Qgbm8gRFRTIGFmdGVyIGEgaml0dGVyYnVmZmVyIHJlc2V0CisJICBPdGhlcndpc2Ugd2Ugd2lsbCBqdXN0IG91dHB1dCBidWZmZXJzIHdpdGhvdXQgdGltZXN0YW1wcyBhZnRlciBhIHJlc2V0IGlmIG5vCisJICB0aW1lc3RhbXBzIGFyZSBwcm92aWRlZCBieSB1cHN0cmVhbSwgZS5nLiB3aGVuIHVzaW5nIFJUU1Agb3ZlciBUQ1AuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ5NTM2CisKKzIwMTUtMDgtMTIgMTc6MTY6MDEgKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5oOgorCSAgbWF0cm9za2E6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM1NTYKKworMjAxNS0wOC0wNCAyMDo1OToxNyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDI0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBidmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2MWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMXNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzYmNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc2lyZW5kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHV0aWxzLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHV0aWxzLmg6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJICBydHA6IENvcHkgbWV0YWRhdGEgaW4gdGhlIChkZSlwYXlsb2FkZXIsIGJ1dCBvbmx5IHRoZSByZWxldmFudCBvbmVzCisJICBUaGUgcGF5bG9hZGVyIGRpZG4ndCBjb3B5IGFueXRoaW5nIHNvIGZhciwgdGhlIGRlcGF5bG9hZGVyIGNvcGllZCBldmVyeQorCSAgcG9zc2libGUgbWV0YS4gTGV0J3MgbWFrZSBpdCBjb25zaXN0ZW50IGFuZCBqdXN0IGNvcHkgYWxsIG1ldGFzIHdpdGhvdXQKKwkgIHRhZ3Mgb3Igd2l0aCBvbmx5IHRoZSB2aWRlbyB0YWcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxNzc0CisKKzIwMTUtMDgtMTAgMTg6MjA6MTUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggc21hbGwgdHlwbyBpbiBjb21tZW50CisKKzIwMTUtMDgtMTAgMTY6MTk6MTggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSAgZ29vbTJrMS9kb2M6IEZpeHVwIHByZXZpb3VzIGNvbW1pdAorCisyMDE1LTA4LTEwIDE1OjU1OjE5IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5oOgorCSAgZ29vbTJrMS9kb2M6IFVzZSBHc3RHb29tMmsxIG5hbWVzcGFjZQorCSAgVGhlIGRvYyBnZW5lcmF0b3IgaXNuJ3QgaGFwcHkgd2hlbiB3ZSBoYXZlIGNsYXNzIG5hbWUgY2xhc2guIFNpbXBseQorCSAgdXNlIGl0J3Mgb3duIG5hbWVzcGFjZS4KKworMjAxNS0wOC0xMCAxNzoxMDo0MiArMDUzMCAgUHJhc2hhbnQgR290YXJuZSA8cHMuZ290YXJuZUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmM6CisJICBhdWRpb2VjaG86IHJlbW92ZWQgdW51c2VkIHZhcmlhYmxlIGluIHNldF9wcm9wZXJ0eQorCSAgdW51c2VkIGxvY2FsIHZhcmlhYmxlICdkZWxheScgaXMgcmVtb3ZlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM0NTAKKworMjAxNS0wOC0xMCAxMjo0NToyNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggc3Vib3B0aW1hbCBxdWV1ZSBpdGVyYXRpb24gY29kZQorCisyMDE1LTA4LTA5IDE3OjI1OjQ1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRvbid0IHVzZSBnbGliIDIuNDQtb25seSBBUEkKKworMjAxNS0wNy0yOSAxNDoxNDo1MCArMDEwMCAgQWxleCBBc2hsZXkgPGJ1Z3ppbGxhQGFzaGxleS1mYW1pbHkubmV0PgorCisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF90eXBlcy5jOgorCSAgcXRkZW11eDogYWRkIHN1cHBvcnQgZm9yIElTT0JNRkYgQ29tbW9uIEVuY3J5cHRpb24KKwkgIFRoaXMgY29tbWl0IGFkZHMgc3VwcG9ydCBmb3IgSVNPQk1GRiBDb21tb24gRW5jcnlwdGlvbiAoY2VuYyksIGFzCisJICBkZWZpbmVkIGluIElTTy9JRUMgMjMwMDEtNy4gSXQgdXNlcyBhIEdzdFByb3RlY3Rpb24gZXZlbnQgdG8KKwkgIHBhc3MgdGhlIGNvbnRlbnRzIG9mIFBTU0ggYm94ZXMgdG8gZG93bnN0cmVhbSBkZWNyeXB0b3IgZWxlbWVudHMKKwkgIGFuZCBhdHRhY2hlZCBHc3RQcm90ZWN0aW9uTWV0YSB0byBlYWNoIHNhbXBsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDU5OTEKKworMjAxNS0wOC0xMCAxNDoxMzo1MCArMDkwMCAgSHl1bmp1biBLbyA8enpvb24ua29Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXk6IGNoZWNraW5nIGlmIGRlcGF5IGhhcyBzcHMvcHBzIG5hbHMgYmVmb3JlIGluc2VydGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MzQzMAorCisyMDE1LTA4LTA4IDE2OjQ0OjQ5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogZml4IG91dGRhdGVkIGNvbW1lbnQKKwkgIFRoZSBkZWZhdWx0IGJlaGF2aW91ciB3YXMgY2hhbmdlZCBpbiB0aGUgMC4xMCAtPiAxLngKKwkgIHRyYW5zaXRpb24sIGJ1dCB0aGUgY29tbWVudCB3YXMgbm90IHVwZGF0ZWQuCisKKzIwMTUtMDgtMDggMTc6NDI6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJICBydHB0aGVvcmFwYXk6IElmIGZsdXNoaW5nIGEgcGFja2V0IGZhaWxlZCwgZ28gb3V0IG9mIHRoZSBsb29wIGltbWVkaWF0ZWx5CisKKzIwMTUtMDgtMDggMTc6NDE6MDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJICBydHB2b3JiaXNwYXk6IElmIGZsdXNoaW5nIGEgcGFja2V0IGZhaWxlZCwgZ28gb3V0IG9mIHRoZSBsb29wIGltbWVkaWF0ZWx5CisKKzIwMTUtMDgtMDggMTc6MzQ6NTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5oOgorCSAgcnRwdGhlb3JhcGF5OiBFeHRyYWN0IHBpeGVsIGZvcm1hdCBmcm9tIHRoZSBpZGVudCBoZWFkZXIgdG8gcHV0IGl0IGludG8gdGhlIHNhbXBsaW5nIGZpZWxkIG9mIHRoZSBjYXBzCisJICBXZSBhbHdheXMgcHV0IDQ6MjowIGludG8gdGhlIGNhcHMgYmVmb3JlLCB3aGljaCBvYnZpb3VzbHkgaXMgd3JvbmcgZm9yIDQ6MjoyCisJICBhbmQgNDo0OjQgZm9ybWF0cy4KKworMjAxNS0wOC0wNiAxNzo0NjoxMyArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBrbHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBrbHZwYXkuYzoKKwkgIHJ0cGtsdihkZSlwYXk6IGFkZCAiUlRQIiBpbiB0aGUga2xhc3Mgc3RyaW5nCisJICBHc3RSVFNQTWVkaWEgdXNlcyB0aGlzIGNsYXNzaWZpY2F0aW9uIHRvIGRldGVjdCB0aGUgcmVhbCBwYXlsb2FkZXIKKwkgIGluc2lkZSBhIGR5bnBheSBiaW4gYW5kIGFzc2VydHMgaWYgaXQgZG9lc24ndCBmaW5kIGl0LCB0aGVyZWZvcmUKKwkgIGl0IGlzIHJlcXVpcmVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzMzI1CisKKzIwMTUtMDgtMDUgMTE6MTM6MDkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYXV4LmM6CisJICB0ZXN0czogcnRwYXV4OiB1c2UgYSBkeW5hbWljIHB0IGluIHRoZSB0ZXN0CisJICAxKSBUZXN0cyB0aGF0IHVzaW5nIGR5bmFtaWMgUFQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvbmVzIHdvcmsKKwkgIDIpIElmIHdlIGV2ZXIgZGVjaWRlIHRvIGNoYW5nZSB0aGUgY29kZWMgaGVyZSB3ZSBkb24ndCBuZWVkIHRvCisJICB3b3JyeSBhYm91dCBjaGFuZ2UgdGhlIFBUIGZvciB0aGUgZGVmYXVsdCBvbmUgb2YgdGhlIG5ldyBjb2RlYworCSAgaW4gdGhlIHRlc3QKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDY0NDUKKworMjAxNS0wOC0wNSAxMDo1MzoxNSArMDkwMCAgSHl1bmp1biBLbyA8enpvb24ua29Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuYzoKKwkgIHJ0cHJ0eHNlbmQ6IHByaW50IHZhbGlkIHR5cGUgd2hlcmUgZ3VpbnQzMiBpcyBleHBlY3RlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjQ0NQorCisyMDE1LTA4LTA2IDExOjMzOjM3ICswOTAwICBIeXVuanVuIEtvIDx6em9vbi5rb0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY21hcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzoKKwkgIHJ0cHBheWxvYWQ6IHNldCBzdGFuZGFyZCBwYXlsb2FkIHR5cGUgYXMgZGVmYXVsdAorCSAgSW5pdGlhbGl6ZSB0aGUgUFQgdG8gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvZGVjIGFuZCBjaGVjayBpZgorCSAgaXQgaXMgc3RpbGwgdGhlIGRlZmF1bHQgYmVmb3JlIGRlY2xhcmluZyB0aGUgcHQgdG8gYmUgZHluYW1pYyBvcgorCSAgbm90IHdoZW4gc2V0dGluZyB0aGUgY2Fwcy4KKwkgIEFsc28gdXNlIHRoZSBQVCBjb25zdGFudHMgZnJvbSB0aGUgcnRwIGxpYiB3aGVuIHBvc3NpYmxlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3OTY1CisKKzIwMTUtMDctMjYgMTI6MDc6NTYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBzdG9yZSB0aGUgbW9vZi1vZmZzZXQgYWxzbyBmb3IgcHVzaCBtb2RlCisJICBJdCB3aWxsIGJlIHVzZWQgaW4gc29tZSBjYXNlcyBmb3IgZ2V0dGluZyB0aGUgY29ycmVjdCBvZmZzZXRzCisJICBmcm9tIHRydW4gYXRvbXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyNjAzCisKKzIwMTUtMDctMjYgMDI6MDk6MjQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuaDoKKwkgIHF0ZGVtdXg6IGhhbmRsZSBkZWZhdWx0LWJhc2UtaXMtbW9vZiBmbGFnCisJICBIYW5kbGUgdGhlIGZsYWcgZnJvbSB0aGUgdGZoZCB0aGF0IHNpZ25hbHMgdGhlIGJhc2Ugb2Zmc2V0IHRvCisJICBzdGFydCBmcm9tIHRoZSBtb29mIGF0b20KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTI2MDMKKworMjAxNS0wNy0yOSAxODo1NDozNSAtMDYwMCAgR2xlbiBEaWVuZXIgPGdyZEBsb2dhbm1pbGwubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYWRlbXV4OiBQcmVzZXJ2ZSBmb3J3YXJkIHJlZmVyZW5jZWQgdHJhY2sgdGFncworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1Mjg1MAorCisyMDE1LTA4LTA0IDE4OjA3OjM1IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGF1eC5jOgorCSAgdGVzdHM6IHJ0cGF1eDogZml4IHRlc3QgZmFpbHVyZQorCSAgVGhlIFJUUCBQVCBmb3IgYWxhdyBpcyA4LgorCSAgTGVzcyB0aGFuIDUwIHBhY2tldHMgYXJlIHJlY2VpdmVkIGluIHRoZSBsZW5ndGggb2YgdGhpcyB0ZXN0IHNvIGl0CisJICB3b3VsZCBuZXZlciBkcm9wIGEgYnVmZmVyIG9yIHdvdWxkIGRyb3Agb25seSB0aGUgbGFzdCBidWZmZXIgYW5kCisJICBpdCB3b3VsZCBmYWlsIHNvbWV0aW1lcyB3aGVuIHRoZSByZWNlaXZlZCB3b3VsZG4ndCByZWNlaXZlIHRoZQorCSAgcmV0cmFuc21pc3Npb24gcGFja2V0IGluIHRpbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ2NDQ1CisKKzIwMTUtMDgtMDQgMjA6NTk6MTcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc3RyZWFtZGVwYXkuYzoKKwkgIHJ0cHN0cmVhbWRlcGF5OiBPbmx5IGFsbG93IGFjdGl2YXRpb24gaW4gcHVzaCBtb2RlCisJICBXZSBuZWVkIGEgcHJvcGVyIGNhcHMgZXZlbnQgZnJvbSB1cHN0cmVhbSB3aXRoIHRoZSBmdWxsIFJUUCBjYXBzIGFzIHdlIGNhbid0CisJICBjcmVhdGUgY2FwcyBvdXJzZWx2ZXMgZnJvbSB0aGluIGFpci4gRml4ZXMgdXNhZ2Ugb2YgcnRwc3RyZWFtZGVwYXkgYWZ0ZXIgZS5nLgorCSAgYSBmaWxlc3JjIG9yIGFueSBvdGhlciBlbGVtZW50IHRoYXQgc3VwcG9ydHMgcHVsbCBtb2RlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MzA2NgorCisyMDE1LTA4LTA0IDE2OjI4OjE3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cDogZml4IHR5cG8gaW4gdHJhbnNsYXRlZCBzdHJpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTMyNDAKKworMjAxNS0wOC0wNCAxMjoyNTo0NiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIHJ0cGgyNjRkZXBheTogUHV0IHRoZSBwcm9maWxlIGFuZCBsZXZlbCBpbnRvIHRoZSBjYXBzCisKKzIwMTUtMDgtMDQgMTI6MDk6MTIgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXk6IE9ubHkgdXBkYXRlIHRoZSBzcmNwYWQgY2FwcyBpZiBzb21ldGhpbmcgZWxzZSB0aGFuIHRoZSBjb2RlY19kYXRhIGNoYW5nZWQKKwkgIGgyNjRwYXJzZSBkb2VzIHRoZSBzYW1lLCBsZXQncyBrZWVwIHRoZSBiZWhhdmlvdXIgY29uc2lzdGVudC4gQXMgd2Ugbm93CisJICBpbmNsdWRlIHRoZSBjb2RlY19kYXRhIGluc2lkZSB0aGUgc3RyZWFtIHRvbyBoZXJlLCB0aGlzIGNhdXNlcyBsZXNzIGNhcHMKKwkgIHJlbmVnb3RpYXRpb24uCisKKzIwMTUtMDgtMDQgMTE6NDg6MjcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXk6IFBQUyByZXBsYWNlcyBhbmQgb2xkIFBQUyBpZiBpdCBoYXMgdGhlIHNhbWUgaWQsIGluZGVwZW5kZW50IG9mIFNQUyBpZAorCSAgVGhlIHNwZWMgc2F5czoKKwkgIFdoZW4gYSBwaWN0dXJlIHBhcmFtZXRlciBzZXQgTkFMIHVuaXQgd2l0aCBhIHBhcnRpY3VsYXIgdmFsdWUgb2YKKwkgIHBpY19wYXJhbWV0ZXJfc2V0X2lkIGlzIHJlY2VpdmVkLCBpdHMgY29udGVudCByZXBsYWNlcyB0aGUgY29udGVudCBvZiB0aGUKKwkgIHByZXZpb3VzIHBpY3R1cmUgcGFyYW1ldGVyIHNldCBOQUwgdW5pdCwgaW4gZGVjb2Rpbmcgb3JkZXIsIHdpdGggdGhlIHNhbWUKKwkgIHZhbHVlIG9mIHBpY19wYXJhbWV0ZXJfc2V0X2lkICh3aGVuIGEgcHJldmlvdXMgcGljdHVyZSBwYXJhbWV0ZXIgc2V0IE5BTCB1bml0CisJICB3aXRoIHRoZSBzYW1lIHZhbHVlIG9mIHBpY19wYXJhbWV0ZXJfc2V0X2lkIHdhcyBwcmVzZW50IGluIHRoZSBiaXRzdHJlYW0pLgorCisyMDE1LTA4LTAzIDEzOjQ1OjU5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IHJlbW92ZSBleHRyYSBcbiBhdCBkZWJ1ZyBtZXNzYWdlCisKKzIwMTUtMDgtMDMgMTM6NDI6MjAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkgIHNwbGl0bXV4c2luazogcHJldmVudCBkZWFkbG9jayB3aGVuIHN0YXRlcyBjaGFuZ2UgdG9vIGZhc3QKKwkgIElmIHRoZSBHT1AgaXMgY29tcGxldGVkLCBwYWRzIGhhdmUgdG8gc3RhcnQgZ2F0aGVyaW5nIGZvciB0aGUKKwkgIG5leHQgb25lIGJ1dCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSB0aGUgc3RhdGUgbWlnaHQgZ28gdG8KKwkgIENPTExFQ1RJTkdfR09QX1NUQVJUIGFuZCBiYWNrIHRvIFdBSVRJTkdfR09QX0NPTVBMRVRFIGJlZm9yZSB0aGUKKwkgIHRocmVhZCBoYXMgYSBjaGFuY2UgdG8gd2FrZSB1cCBhbmQgcHJvY2VlZCwgbGVhdmluZyBpdCB0cmFwcGVkIGluCisJICB0aGUgY2hlY2tfY29tcGxldGVkX2dvcCBsb29wIGFuZCBkZWFkbG9ja2luZyB0aGUgb3RoZXIgdGhyZWFkcworCSAgd2FpdGluZyBmb3IgaXQgdG8gYWR2YW5jZS4KKwkgIFRvIHNvbHZlIGl0LCB0aGlzIHBhdGNoIGFsc28gY2hlY2tzIHRoYXQgdGhhIGlucHV0IHJ1bm5pbmcgdGltZQorCSAgaGFzbid0IGNoYW5nZWQgdG8gcHJldmVudCB0aGlzIHNjZW5hcmlvLgorCisyMDE1LTA4LTAzIDE3OjU1OjAxICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgcnRwaDI2NGRlcGF5OiBJbnNlcnQgU1BTL1BQUyBOQUxzIGludG8gdGhlIHN0cmVhbQorCSAgaDI2NHBhcnNlIGRvZXMgdGhlIHNhbWUgYW5kIHRoaXMgZml4ZXMgZGVjb2Rpbmcgb2Ygc29tZSBzdHJlYW1zIHdpdGggMzIgU1BTCisJICAob3IgMjU2IFBQUykuIEl0IGlzIGFsbG93ZWQgdG8gaGF2ZSBTUFMgSUQgMCB0byAzMSAob3IgUFBTIElEIDAgdG8gMjU1KSwgYnV0CisJICB0aGUgZmllbGQgaW4gdGhlIGNvZGVjX2RhdGEgZm9yIHRoZSBudW1iZXIgb2YgU1BTIG9yIFBQUyBpcyBvbmx5IDUgKG9yIDgpIGJpdC4KKwkgIEFzIHN1Y2gsIDMyIFNQUyAob3IgMjU2IFBQUykgYXJlIGludGVycHJldGVkIGFzIDAgZXZlcnl3aGVyZS4KKwkgIFRoaXMgbG9va3MgbGlrZSBhIG1pc3Rha2UgaW4gdGhlIHBhcnQgb2YgdGhlIHNwZWMgYWJvdXQgdGhlIGNvZGVjX2RhdGEuCisKKzIwMTUtMDctMzAgMTE6Mjk6MjcgKzA5MDAgIEV1bmhhZSBDaG9pIDxldW5oYWUxLmNob2lAc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogaGFuZGxlIGVtcHR5IGh0dHAgcHJveHkgc3RyaW5nCisJICAxKSBJZiB0aGUgc3lzdGVtIGh0dHBfcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldAorCSAgb3Igc2V0IHRvIGFuIGVtcHR5IHN0cmluZywgd2UgbXVzdCBub3Qgc2V0IHByb3h5IHRvIGF2b2lkCisJICBodHRwIGNvbm5lY3Rpb24gZXJyb3IuCisJICAyKSBJbiBjYXNlIG9mIHByb3h5IHByb3BlcnR5IHNldHRpbmcsIGlmIHVzZXIgd2FudCB0byBjbGVhcgorCSAgdGhlIHByb3h5IHNldHRpbmcsIHRoZXkgc2hvdWxkIGJlIGFibGUgdG8gc2V0IGl0IHRvIE5VTEwgb3IKKwkgIGFuIGVtcHR5IHN0cmluZyBhZ2Fpbiwgc28gdGhpcyBpcyBmaXhlZCB0b28uCisJICAzKSBDaGVjayBpZiB0aGUgcHJveHkgc3RyaW5nIHdhcyBwYXJzZWQgY29ycmVjdGx5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1Mjg2NgorCisyMDE1LTA3LTI5IDE1OjQ2OjIwICswNTMwICBSYXZpIEtpcmFuIEsgTiA8cmF2aS5raXJhbkBzYW1zdW5nLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9kdi9nc3RkdmRlbXV4Lmg6CisJICBkdmRlbXV4OiByZW1vdmUgdW51c2VkIHZhcmlhYmxlCisJICBSZW1vdmUgdW51c2VkIHZhcmlhYmxlICdmcmFtZWNvdW50JyBmcm9tIGR2ZGVtdXgKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTMwMDgKKworMjAxNS0wNy0zMCAxNTozMjowOSArMDkwMCAgVmluZWV0aCBUTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYXNzZXJ0aW9uIGVycm9yIGR1ZSB0byB3cm9uZyBjb25kaXRpb24gY2hlY2sKKwkgIEluIG1lZGlhIHRvIGNhcHMgZnVuY3Rpb24sIHJlc2VydmVkX2tleXMgYXJyYXkgaXMgYmVpbmcgdXNlZCBmb3IgdmFyaWFibGUgaSwKKwkgIGxlYWRpbmcgdG8gR0xpYi1DUklUSUNBTCAqKjogZ19hc2NpaV9zdHJjYXNlY21wOiBhc3NlcnRpb24gJ3MxICE9IE5VTEwnIGZhaWxlZAorCSAgY2hhbmdlZCBpdCB0byB2YXJpYWJsZSBqCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzMDA5CisKKzIwMTUtMDctMzAgMTU6MjE6MjAgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJICBydHBtcDR2ZGVwYXk6IHJ0cGJ1ZmZlciBpcyBiZWluZyB1bnJlZidlZCB0d2ljZQorCSAgcHJvY2Vzc19ydHBfcGFja2V0IGRvZXNuJ3QgdHJhbnNmZXIgdGhlIHJ0cCBidWZmZXIgdG8gbXA0dl9wcm9jZXNzX2RlcGF5CisJICB0aGUgcmVmZXJuY2Ugc2hvdWxkIG5vdCBiZSByZW1vdmVkIGhlcmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTMwNDIKKworMjAxNS0wNy0yOSAxMToyNjo0NiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogU3RyaXAga2V5cyBmcm9tIHRoZSBmbXRwIHRoYXQgd2UgdXNlIGludGVybmFsbHkgaW4gb3VyIGNhcHMKKwkgIFNraXAga2V5cyBmcm9tIHRoZSBmbXRwLCB3aGljaCB3ZSBhbHJlYWR5IHVzZSBvdXJzZWx2ZXMgZm9yIHRoZQorCSAgY2Fwcy4gU29tZSBzb2Z0d2FyZSBpcyBhZGRpbmcgcmFuZG9tIHRoaW5ncyBsaWtlIGNsb2NrLXJhdGUgaW50bworCSAgdGhlIGZtdHAsIGFuZCB3ZSB3b3VsZCBvdGhlcndpc2UgaGVyZSBzZXQgYSBzdHJpbmctdHlwZWQgY2xvY2stcmF0ZQorCSAgaW4gdGhlIGNhcHMuLi4gYW5kIHRodXMgZmFpbCB0byBjcmVhdGUgdmFsaWQgUlRQIGNhcHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTMwMDkKKworMjAxNS0wNy0yOSAxOToyODozMyArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IFN1cHBvcnQgbXBlZ3RzbXV4IGFzIGEgbXV4ZXIuCisJICBBcyBhIGZhbGxiYWNrLCBsb29rIGZvciBhIHBhZCB0ZW1wbGF0ZSBzaW5rXyVkIG9uCisJICB0aGUgbXV4ZXIgd2hlbiByZXF1ZXN0aW5nIHBhZHMsIHRvIHN1cHBvcnQgbXBlZ3RzbXV4CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyOTk5CisKKzIwMTUtMDYtMjUgMDE6MzU6MjcgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4cGFydHJlYWRlci5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuaDoKKwkgIHNwbGl0bXV4c3JjOiBVc2UgYSBzZXBhcmF0ZSBsb2NrIHRvIGRlbGF5IHR5cGVmaW5kLgorCSAgRG9uJ3QgaG9sZCB0aGUgbWFpbiBzcGxpdG11eCBwYXJ0IGxvY2sgb3ZlcgorCSAgdGhlIHBhcmVudCBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24sIGFzIGl0IHByZXZlbnRzCisJICBwb3N0aW5nIGVycm9yIG1lc3NhZ2VzIHRoYXQgaGFwcGVuLiBTaW5jZSB0aGUgcHVycG9zZQorCSAgaXMgdG8gcHJldmVudCB0eXBlZmluZGluZyBmcm9tIHByb2NlZWRpbmcsIHVzZSBhCisJICBzZXBhcmF0ZSBtdXRleCBqdXN0IGZvciB0aGF0LgorCisyMDE1LTA3LTI5IDEzOjQzOjUwICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thOiBmaXggbWVtb3J5IGxlYWsKKwkgIEFmdGVyIGFkZGluZyB0byB0YWcgbGlzdCwga2V5X3ZhbCBpcyBub3QgYmVpbmcgZnJlZSdkCisJICByZXN1bHRpbmcgaW4gbWVtb3J5IGxlYWsKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTI5OTIKKworMjAxNS0wNy0yNyAxMzozNDoxNCArMDkwMCAgTWFuYXNhIEF0aHJleWEgPG1hbmFzYS5hdGhyZXlhQGxnZS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IDE2LWJpdCBQQ00gYXVkaW8gYWR2ZXJ0aXNlZCB3aXRoICdyYXcgJyBmb3VyY2MKKwkgICdOT05FJyBhbmQgJ3JhdyAnIGZvdXJjYyBkb24ndCBhbHdheXMgY29udGFpbiBVOCBhdWRpbywgaXQgY2FuCisJICBiZSBtb3JlIGJpdHMgYXMgd2VsbCwgaW4gd2hpY2ggY2FzZSBpdCdzIGp1c3QgbGlrZSAndHdvcycuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyNjEzCisKKzIwMTUtMDctMjQgMTU6MTA6MDUgKzAyMDAgIERpbWl0cmlvcyBLYXRzYXJvcyA8cGF0Y2hlcndvcmtAZ21haWwuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyOiBBbGxvdyBmcmFtZXJhdGUgdG8gYmUgbGFyZ2UgdGhlbiAxMDBwZnMKKwkgIFRoaXMgbGltaXQgd2FzIGFyYml0cmFyeS4gV2Ugc3RpbGwgZml4YXRlIG5lYXIgMTAwcGZzIGZvciBjb21wYXRpYmlsaXR5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjgyNQorCisyMDE1LTA3LTI1IDAzOjI1OjI4IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBvY3JldGUuY2E+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBTdG9wIHdpdGhvdXQgcG9zdGluZyBlcnJvciBvbiBmbHVzaGluZworCSAgVGhpcyBjb3VsZCBqdXN0IGJlIGEgbm9ybWFsIHBpcGVsaW5lIHNodXRkb3duLgorCisyMDE1LTA3LTIzIDE1OjAwOjA4ICswOTAwICBIeXVuanVuIEtvIDx6em9vbi5rb0BzYW1zdW5nLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBzZXQgR1NUX0JVRkZFUl9DT1BZX0ZMQUdTIHRvIGNvcHkgZmxhZ3MgYWxzbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjYxOAorCisyMDE1LTA3LTE2IDE4OjA5OjMwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYWRlbXV4LmM6CisJICB0ZXN0czogYWRkIG1pbm1hbCBtYXRyb3NrYWRlbXV4IHRlc3QgZm9yIHN1YnRpdGxlIG91dHB1dAorCSAgU29tZSBvZiB0aGUgc3VidGl0bGUgY2h1bmtzIHdpbGwgaGF2ZSBlbWJlZGRlZAorCSAgTlVMLXRlcm1pbmF0b3JzIChsYXN0IHRocmVlKSwgc29tZSBkb24ndCAoZmlyc3QgdGhyZWUpLAorCSAgc29tZSB3aWxsIGhhdmUgbWFya3VwLCBzb21lIHdvbid0LCBzb21lIHdpbGwgYmUgdmFsaWQKKwkgIFVURi04IChhbGwgYnV0IGxhc3QpLCBzb21lIHdvbid0IChsYXN0IHN0YW56YSkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyNDIxCisKKzIwMTUtMDctMTYgMTg6NDk6MjYgKzAzMDAgIERpbWl0cmlvcyBDaHJpc3RpZGlzIDxkY2hyaXN0aWRpc0BteWtvbGFiLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBmaXggZm9yIHN1YnRpdGxlIGJ1ZmZlcnMgd2l0aCBOVUwgdGVybWluYXRvcnMKKwkgIENvbW1pdCA0NTg5MmVjOCBjcmVhdGVkIGEgcmVncmVzc2lvbiB3aGVyZSBnX3V0ZjhfdmFsaWRhdGUoKSB3b3VsZCBmYWlsCisJICBpZiB0aGUgc3VidGl0bGUgYnVmZmVyIGhhZCBhIE5VTCB0ZXJtaW5hdG9yIGFzIHBhcnQgb2YgdGhlIGRhdGEuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyNDIxCisKKzIwMTUtMDctMjEgMTM6MzE6MDUgKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOGRlcGF5LmM6CisJICBydHB2cDhkZXBheTogQ2hlY2sgYXZhaWxhYmxlIGJ5dGVzIGJlZm9yZSBjb3B5CisJICBOZWVkIHRvIGNoZWNrIHRoYXQgdGhlIG51bWJlciBvZiBieXRlcyB3ZSB3YW50IHRvIGNvcHkgZnJvbSB0aGUgYWRhcHRlcgorCSAgYWN0dWFsbHkgaXMgYXZhaWxhYmxlIGFuZCBoYW5kbGUgdGhlIGVycm9yIGNhc2UgZ3JhY2VmdWxseS4gVGhpcyBlcnJvcgorCSAgbWF5IGhhcHBlbiBpZiBtYWxmb3JtZWQgcGFja2V0cyBhcmUgcmVjZWl2ZWQgYW5kIHdlIGRvbid0IGhhdmUgYQorCSAgY29tcGxldGUgZnJhbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyNjYzCisKKzIwMTUtMDctMTYgMDk6MzI6MzYgKzA5MDAgIFBhdWwgSHl1bmlsIDxwYXVsLmh5dW5pbEBsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBTdXBwb3J0IHN1YnRpdGxlIHdoZW4gdHJhY2sgc3VidHlwZSBpcyBmb3VyY2Nfc3VidAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjY1NQorCisyMDE1LTA3LTIwIDE2OjU5OjQwICswODAwICBTb25nIEJpbmcgPGIwNjQ5OEBmcmVlc2NhbGUuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IFNldCB0aW1lc3RhbXAgd2hlbiBxdWV1ZSBidWZmZXIuCisJICBTaG91bGQgc2V0IHRpbWVzdGFtcCB3aGVuIHF1ZXVlIGJ1ZmZlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTI2MTgKKworMjAxNS0wNy0xNiAxNToxMjoxNyArMDIwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cG11eC5jOgorCSAgcnRwbXV4OiBoYW5kbGUgZGlmZmVyZW50IHNzcmMncyBvbiBzaW5rcGFkcworCSAgRG8gdGhpcyBieSBub3QgcHV0dGluZyB0aGUgc3NyYyBmcm9tIHRoZSBzcmMgcGFkcyBpbiB0aGUgY2FwcyB1c2VkIHRvCisJICBwcm9iZSBvdGhlciBzaW5rcGFkcywgYW5kIHRoZW4gIGludGVyc2VjdGluZyB3aXRoIGl0IGxhdGVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjQ5MQorCisyMDE1LTA3LTE2IDE3OjE5OjAzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS93ZWJtLW11eC5jOgorCSAgVXBkYXRlIG1haWxpbmcgbGlzdCBhZGRyZXNzIGZyb20gc291cmNlZm9yZ2UgdG8gZnJlZWRlc2t0b3AKKworMjAxNS0wNy0xNSAxMzo0NDo1MiArMDMwMCAgRGltaXRyaW9zIENocmlzdGlkaXMgPGRjaHJpc3RpZGlzQG15a29sYWIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGZpeCB0cmFpbGluZyAnKicgZGlzcGxheWVkIHdpdGggc29tZSB0ZXh0IHN1YnRpdGxlcworCSAgVGhlIHN1YnRpdGxlIGJ1ZmZlciB3ZSBwdXNoIG91dCBzaG91bGQgbm90IGluY2x1ZGUgYSBOVUwgdGVybWluYXRvcgorCSAgYXMgcGFydCBvZiB0aGUgZGF0YSwgd2UganVzdCBhZGQgc3VjaCBhIHRlcm1pbmF0b3IgZm9yIHNhZmV0eSwgYnV0CisJICBpdCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBidWZmZXIgc2l6ZS4KKwkgIEEgTlVMIHRlcm1pbmF0b3IgaXMgbm90IHZhbGlkIFVURi04LCBzbyBjaGVja3Mgd2lsbCBmYWlsIGlmIGl0J3MKKwkgIGluY2x1ZGVkIGluIHRoZSBzaXplLCBhbmQgdGhlIE5VTCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBmYWxsYmFjaworCSAgY2hhcmFjdGVyIHNwZWNpZmllZCB3aGVuIGNvbnZlcnRpbmcsIGkuZS4gJyonLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjQyMQorCisyMDE1LTA3LTE1IDE4OjIzOjA1ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlZGV2aWNlcHJvdmlkZXIuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuaDoKKwkgIHB1bHNlOiBhZGQgcHJvcGVydGllcyB0byBHc3REZXZpY2UKKwkgIEFkZCB0aGUgZXh0cmEgcHJvcGVydGllcyB3ZSBnZXQgZnJvbSBwdWxzZSB0byB0aGUgR3N0RGV2aWNlIHdlIGV4cG9zZQorCSAgd2l0aCB0aGUgZGV2aWNlIG1vbml0b3IKKworMjAxNS0wNy0xNSAxNzoyMDoyMCArMDUzMCAgUmF2aSBLaXJhbiBLIE4gPHJhdmkua2lyYW5Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5jOgorCSAgYXVkaW9meDogRml4IHR5cG8gaW4gZXhhbXBsZSBwaXBlbGluZXMKKwkgIEZpeCB0eXBvIGluIGV4YW1wbGUgcGlwZWxpbmVzIG9mIGF1ZGlvd3NpbmNiYW5kIGFuZCBhdWRpb2ludmVydC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTI0MTYKKworMjAxNS0wNC0xNSAxODoyNzowNCArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkgIHNwbGl0bXV4c2luazogYWRkIGEgImZvcm1hdC1sb2NhdGlvbiIgc2lnbmFsIHRoYXQgYWxsb3dzIGJldHRlciBjb250cm9sIG92ZXIgZmlsZW5hbWVzCisJICBJbiBjZXJ0YWluIGFwcGxpY2F0aW9ucywgc3BsaXR0aW5nIGludG8gZmlsZXMgbmFtZWQgYWZ0ZXIgYSBiYXNlCisJICBsb2NhdGlvbiB0ZW1wbGF0ZSBhbmQgYW4gaW5jcmVtZW50YWwgc2VxdWVuY2UgbnVtYmVyIGlzIG5vdCBlbm91Z2guCisJICBUaGlzIHNpZ25hbCBnaXZlcyBtb3JlIGZpbmUtZ3JhaW5lZCBjb250cm9sIHRvIHRoZSBhcHBsaWNhdGlvbiB0bworCSAgZGVjaWRlIGhvdyB0byBuYW1lIHRoZSBmaWxlcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTAxMDYKKworMjAxNS0wNC0xNSAyMDoxMzoyNyArMDMwMCAgSWx5YSBLb25zdGFudGlub3YgPGlseWEua29uc3RhbnRpbm92QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jOgorCSAgb3N4YXVkaW9zcmM6IG5vIHJlc2FtcGxpbmcgb24gT1MgWAorCSAgVW5saWtlIFJlbW90ZSBJTywgQVVIQUwgZG9lc24ndCBoYXZlIGJ1aWx0LWluIHJlc2FtcGxpbmcKKwkgIGZvciBzb3VyY2VzIC0tIGNvbmZpcm1lZCBieSBDb3JlIEF1ZGlvIGVuZ2luZWVyIERvdWcgV3lhdHQ6CisJICBodHRwOi8vbGlzdHMuYXBwbGUuY29tL2FyY2hpdmVzL2NvcmVhdWRpby1hcGkvMjAwNi9TZXAvbXNnMDAwODguaHRtbAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0Mzc1OAorCisyMDE1LTA0LTE1IDE4OjI5OjE0ICswMzAwICBJbHlhIEtvbnN0YW50aW5vdiA8aWx5YS5rb25zdGFudGlub3ZAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvLmM6CisJICBvc3hhdWRpb3NyYzogYXZvaWQgZ2V0X2NoYW5uZWxfbGF5b3V0CisJICBUaGlzIG9ubHkgcHJvZHVjZXMgYSB3YXJuaW5nIGFuZCBzZXJ2ZXMgbm8gcHVycG9zZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDM3NTgKKworMjAxNS0wNC0wNyAxNTo0MDoxNCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYzoKKwkgIG9zeGF1ZGlvOiBBdm9pZCBtYWtpbmcgYSBkdXBsaWNhdGUgc3RydWN0dXJlIGluIGNhcHMgZm9yIG1vbm8vc3RlcmVvIGNhc2UKKwkgIEZvciAxY2ggb3IgMmNoIGRldmljZXMsIHdlIGp1c3QgbmVlZCB0byBzZXQgdGhlIGNhcHMgdG8gYWxsb3cgYm90aAorCSAgb3B0aW9ucyBzaW5jZSBDb3JlQXVkaW8gd2lsbCB1cC9kb3dubWl4IGFwcHJvcHJpYXRlbHkuCisJICBBbHNvIGZpeGVzIHRoZSBjb25kaXRpb24gZm9yIHRoZSAyY2ggY2FzZSB0byBiZSBleGFjdCwgcmF0aGVyIHRoYW4gYXQKKwkgIGxlYXN0IDIgY2hhbm5lbHMgc2luY2UgdGhlIGRvd25taXggd2lsbCBub3QgdGFrZSBwbGFjZSBpbiB0aGUgPnN0ZXJlbworCSAgY2FzZS4KKworMjAxNS0wNC0wNiAxNjoyMjozNCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9oYWwuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9yZW1vdGVpby5jOgorCSAgb3N4YXVkaW86IERvbid0IHNldCB0aGUgZm9ybWF0IG9uIGFuIGluaXRpYWxpemVkIEF1ZGlvVW5pdAorCSAgV2UgbmVlZCB0byBpbml0aWFsaXplIHRoZSBBdWRpb1VuaXQgZWFybHkgdG8gYmUgYWJsZSB0byBwcm9iZSB0aGUKKwkgIHVuZGVybHlpbmcgZGV2aWNlLCBidXQgYWNjb3JkaW5nIHRvIHRoZSBBdWRpb1VuaXRJbml0aWFsaXplKCkgYW5kCisJICBBdWRpb1VuaXRVbmluaXRpYWxpemUoKSBkb2N1bWVudGF0aW9uLCBmb3JtYXQgY2hhbmdlcyBzaG91bGQgYmUgZG9uZQorCSAgd2hpbGUgdGhlIEF1ZGlvVW5pdCBpcyB1bmluaXRpYWxpemVkLiBTbyB3ZSBleHBsaWNpdGx5IHVuaW5pdGlhbGl6ZSB0aGUKKwkgIEF1ZGlvVW5pdCBkdXJpbmcgYSBmb3JtYXQgY2hhbmdlIGFuZCByZWluaXRpYWxpemUgaXQgd2hlbiB3ZSdyZSBkb25lLgorCisyMDE1LTA0LTA2IDE1OjU1OjU5ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5oOgorCSAgb3N4YXVkaW86IE1pbm9yIHNwZWxsaW5nIGZpeCAodW5pdGlhbGl6ZSAtPiB1bmluaXRpYWxpemUpCisKKzIwMTUtMDMtMjEgMjA6MzQ6MjUgKzAyMDAgIElseWEgS29uc3RhbnRpbm92IDxpbHlhLmtvbnN0YW50aW5vdkBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5oOgorCSAgb3N4YXVkaW86IEZpeCBsb2NrdXAgaW4gX2F1ZGlvX3VuaXRfcHJvcGVydHlfbGlzdGVuZXIKKwkgIF9hdWRpb191bml0X3Byb3BlcnR5X2xpc3RlbmVyIGlzIGNhbGxlZCBlaXRoZXIgZnJvbSBhIENvcmUgQXVkaW8gdGhyZWFkCisJICBvciBhcyBhIHJlc3VsdCBvZiBhIENvcmUgQXVkaW8gQVBJIChlLmcuIEF1ZGlvVW5pdEluaXRpYWxpemUpCisJICBmcm9tIG91ciBvd24gdGhyZWFkLiBJbiB0aGUgbGF0dGVyIGNhc2UsIG9zeGJ1ZiBjYW4gYmUgYWxyZWFkeSBsb2NrZWQKKwkgIChHU3RyZWFtZXIncyBtdXRleCBpcyBub3QgcmVjdXJzaXZlKS4KKwkgIFdlIGludHJvZHVjZSB0aGUgZmxhZyBjYWNoZWRfY2Fwc192YWxpZCBhbmQgdXNlIGl0IGluc3RlYWQgb2YgbnVsbGlmeWluZworCSAgY2FjaGVkX2NhcHMgd2hlbiB3ZSBjYW5ub3QgbG9jayBvbiBvc3hidWYuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQzNzU4CisKKzIwMTUtMDMtMTIgMTI6MTU6MTIgKzAyMDAgIElseWEgS29uc3RhbnRpbm92IDxpbHlhLmtvbnN0YW50aW5vdkBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYzoKKwkgIG9zeGF1ZGlvOiBJbnZhbGlkYXRlIGNhY2hlZCBjYXBzIG9uIGZvcm1hdCBjaGFuZ2UKKwkgIExpc3RlbiBmb3IgY2hhbmdlcyBpbiBoYXJkd2FyZSBzdHJlYW0gZm9ybWF0IGFuZCBjaGFubmVsIGxheW91dCwgYW5kCisJICBpbnZhbGlkYXRlIGNhY2hlZCBjYXBzIChzaW5jZSB0aGV5IGNvbnRhaW4gdGhlIHByZWZlcnJlZCBjYXBzKS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDM3NTgKKworMjAxNS0wMy0wOSAyMzozNDowNiArMDIwMCAgSWx5YSBLb25zdGFudGlub3YgPGlseWEua29uc3RhbnRpbm92QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9oYWwuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9yZW1vdGVpby5jOgorCSAgb3N4YXVkaW86IE92ZXJoYXVsIG9mIHByb2JpbmcgY2FwcworCSAgLSBQcm9iaW5nIGNhcHMgaXMgdW5pZmllZCBiZXR3ZWVuIHNvdXJjZSBhbmQgc2luaworCSAgLSBIYXJkd2FyZSBzdHJlYW0gZm9ybWF0IGlzIG5vdyByZXBvcnRlZCBhcyBwcmVmZXJyZWQgY2FwYWJpbGl0aWVzCisJICAoZHluYW1pY2FsbHkgdXBkYXRlZCB3aGVuIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcykKKwkgIC0gR2V0IGhhcmR3YXJlIGNoYW5uZWwgbGF5b3V0IGZyb20gUmVtb3RlIElPIGp1c3QgbGlrZSBmcm9tIEhBTAorCSAgLSBNb3JlIGNvbXByZWhlbnNpdmUgbWFwcGluZyBiZXR3ZWVuIEF1ZGlvQ2hhbm5lbExhYmVsIGFuZAorCSAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24KKwkgIC0gU3VwcG9ydCBmb3IgdW5wb3NpdGlvbmVkIGNoYW5uZWwgbGF5b3V0cworCSAgLSBBbm5vdW5jZSBzdGVyZW8tbW9ubyB1cG1peGluZy9kb3dubWl4aW5nIGluIGNhcHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDM3NTgKKworMjAxNS0wMy0wOSAyMzoxNTo1NiArMDIwMCAgSWx5YSBLb25zdGFudGlub3YgPGlseWEua29uc3RhbnRpbm92QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jOgorCSAgb3N4YXVkaW86IEF1ZGlvVW5pdEluaXRpYWxpemUgb24gb3BlbgorCSAgQ2FsbCBBdWRpb1VuaXRJbml0aWFsaXplIHVwb24gb3Blbi4gT3RoZXJ3aXNlLCB3ZSBjYW5ub3QgZ2V0CisJICAoaGFyZHdhcmUpIHN0cmVhbSBmb3JtYXQgbm9yIGNoYW5uZWwgbGF5b3V0IGZyb20gdGhlIG91dGVyIHNjb3BlLgorCisyMDE1LTA3LTEyIDE0OjI3OjE1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cEwyNGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBrbHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzYmNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOGRlcGF5LmM6CisJICBydHA6IGRlcGF5bG9hZGVyczogaW1wbGVtZW50IHByb2Nlc3NfcnRwX3BhY2tldCgpIHZmdW5jCisJICBGb3IgbW9yZSBvcHRpbWlzZWQgUlRQIHBhY2tldCBoYW5kbGluZzogbWVhbnMgd2UgZG9uJ3QKKwkgIG5lZWQgdG8gbWFwIHRoZSBpbnB1dCBidWZmZXIgYWdhaW4gYnV0IGNhbiBqdXN0IHJlLXVzZQorCSAgdGhlIG1hcHBpbmcgdGhlIGJhc2UgY2xhc3MgaGFzIGFscmVhZHkgZG9uZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTAyMzUKKworMjAxNS0wNS0yNyAxOToxOToyNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIHJ0cHZyYXdkZXBheTogaW1wbGVtZW50IHByb2Nlc3NfcnRwX3BhY2tldCgpIHZmdW5jCisJICBGb3IgbW9yZSBvcHRpbWlzZWQgUlRQIHBhY2tldCBoYW5kbGluZzogbWVhbnMgd2UgZG9uJ3QKKwkgIG5lZWQgdG8gbWFwIHRoZSBpbnB1dCBidWZmZXIgYWdhaW4gYnV0IGNhbiBqdXN0IHJlLXVzZQorCSAgdGhlIG1hcCB0aGUgYmFzZSBjbGFzcyBoYXMgYWxyZWFkeSBkb25lLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MDIzNQorCisyMDE1LTA3LTEwIDAwOjEzOjMyICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogRml4IGluZGVudGlvbgorCisyMDE1LTA3LTA5IDIzOjU5OjEwICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogQWx3YXlzIGVzdGltYXRlIERUUyBmcm9tIHRoZSBjdXJyZW50IGNsb2NrIHRpbWUKKwkgIEVzdGltYXRpbmcgaXQgZnJvbSB0aGUgUlRQIHRpbWUgd2lsbCBnaXZlIHVzIHRoZSBQVFMsIHNvIGluIGNhc2VzIG9mIFBUUyE9RFRTCisJICB3ZSB3b3VsZCBwcm9kdWNlIHdyb25nIERUUy4gQXMgbm93IHRoZSBlc3RpbWF0ZWQgRFRTIGlzIGJhc2VkIG9uIHRoZSBjbG9jaywKKwkgIGRvbid0IHN0b3JlIGl0IGluIHRoZSBqaXR0ZXJidWZmZXIgaXRlbXMgYXMgaXQgd291bGQgb3RoZXJ3aXNlIGJlIHVzZWQgaW4gdGhlCisJICBza2V3IGNhbGN1bGF0aW9ucyBhbmQgd291bGQgaW5mbHVlbmNlIHRoZSByZXN1bHRzLiBXZSBvbmx5IHJlYWxseSBuZWVkIHRoZSBEVFMKKwkgIGZvciB0aW1lciBjYWxjdWxhdGlvbnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ5NTM2CisKKzIwMTUtMDctMDkgMDk6MjY6MDkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkgIGdpdGlnbm9yZTogaWdub3JlIHJ0cGgyNjMgdGVzdAorCisyMDE1LTA3LTA4IDIzOjQ3OjQ0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBmaXggYnVpbGQgZXJyb3Igd2l0aCBnY2MgKERlYmlhbiA0LjkuMi0yMSkgNC45LjIKKwkgIFJlcGxhY2Ugc3RhdGljIGNvbnN0YW50cyB3aXRoIG1hY3JvcyB0byBtYWtlIGdjYyBoYXBweQorCSAgQ0MgICAgICAgZWxlbWVudHMvZWxlbWVudHNfcnRwaml0dGVyYnVmZmVyLXJ0cGppdHRlcmJ1ZmZlci5vCisJICBlbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzozODc6MTogZXJyb3I6IGluaXRpYWxpemVyIGVsZW1lbnQgaXMgbm90IGNvbnN0YW50CisJICBzdGF0aWMgY29uc3QgR3N0Q2xvY2tUaW1lIFBDTVVfQlVGX0RVUkFUSU9OID0gUENNVV9CVUZfTVMgKiBHU1RfTVNFQ09ORDsKKwkgIF4KKwkgIGVsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOjM4ODoxOiBlcnJvcjogaW5pdGlhbGl6ZXIgZWxlbWVudCBpcyBub3QgY29uc3RhbnQKKwkgIHN0YXRpYyBjb25zdCBndWludCBQQ01VX0JVRl9TSVpFID0gNjQwMDAgKiBQQ01VX0JVRl9NUyAvIDEwMDA7CisJICBeCisJICBlbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzozOTA6NTogZXJyb3I6IGluaXRpYWxpemVyIGVsZW1lbnQgaXMgbm90IGNvbnN0YW50CisJICBQQ01VX0JVRl9DTE9DS19SQVRFICogUENNVV9CVUZfTVMgLyAxMDAwOworCisyMDE1LTA3LTA4IDIzOjQwOjQ1IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBydW4gaW5kZW50IGFuZCBmaXggc29tZSBjb21tZW50cworCSAgRml4IGluZGVudCBvbiB0aGlzIGZpbGUgYW5kIGJyZWFrIHNvbWUgY29tbWVudCBsaW5lcyBpbnRvIHR3byB0byBtYWtlCisJICBpdCBmaXQgODAgY2hhcnMgcGVyIGxpbmUKKworMjAxNS0wNy0wOCAxNTowMjoyNCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJld29yayBzZWdtZW50IGV2ZW50IGhhbmRsaW5nIGZvciBhZGFwdGl2ZSBzdHJlYW1pbmcKKwkgIFdoZW4gYSBuZXcgdGltZSBzZWdtZW50IGlzIHJlY2VpdmVkIHVwc3RyZWFtIGlzIGdvaW5nIHRvIHJlc3RhcnQKKwkgIHdpdGggYSBuZXcgYXRvbS4gTWFrZSB0aGUgbmVlZGVkYnl0ZXMgYW5kIHRvZHJvcCB2YXJpYWJsZXMKKwkgIHJlZmxlY3QgdGhhdCB0byBhdm9pZCB3YWl0aW5nIHRvbyBtdWNoIG9yIGRyb3BwaW5nIHRoZQorCSAgaW5pdGlhbCBieXRlcyB0aGF0IGNvbnRhaW4gdGhlIGhlYWRlci4KKworMjAxNS0wNy0wOCAxMjozNTo1NSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHB1c2ggZGF0YSBmcm9tIGFkYXB0ZXIgYmVmb3JlIHN0YXJ0aW5nIG5ldyBzZWdtZW50CisJICBUaGUgYWRhcHRlciBtaWdodCBoYXZlIGRhdGEgcmVtYWluaW5nIGZyb20gdGhlIHByZXZpb3VzIHNlZ21lbnQsCisJICBwdXNoIGl0IGFsbCBiZWZvcmUgY2xlYXJpbmcgdGhlIGFkYXB0ZXIgYW5kIHN0YXJ0aW5nIGEgbmV3IHNlZ21lbnQuCisJICBJdCBjYW4gYWNjdW11bGF0ZSBkYXRhIGlmIGl0IGhhZCBwdXNoZWQgYW5kIGdvdCBub3QtbGlua2VkLCByZXR1cm5pbmcKKwkgIGltbWVkaWF0ZWx5IHdpdGhvdXQgcHJvY2Vzc2luZyBhbGwgdGhlIGRhdGEuIEJlZm9yZSBzdGFydGluZyBhIG5ldworCSAgc2VnbWVudCB0aGlzIGRhdGEgc2hvdWxkIGJlIGhhbmRsZWQuCisKKzIwMTUtMDctMDggMTk6NTk6MTMgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBDYWxjdWxhdGUgRFRTIGZyb20gdGhlIGNsb2NrIGlmIHdlIGhhZCBub25lIGZvciB0aGUgZmlyc3QgcGFja2V0IGFmdGVyIGEgcmVzZXQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDk1MzYKKworMjAxNS0wNy0wOCAyMTowODozNiArMDIwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBmaXggZ2FwLXRpbWUgY2FsY3VsYXRpb24gYW5kIHJlbW92ZSAibGF0ZSIKKwkgIFRoZSBhbW91bnQgb2YgdGltZSB0aGF0IGlzIGNvbXBsZXRlbHkgZXhwaXJlZCBhbmQgbm90IHdvcnRoIHdhaXRpbmcgZm9yLAorCSAgaXMgdGhlIGR1cmF0aW9uIG9mIHRoZSBwYWNrZXRzIGluIHRoZSBnYXAgKGdhcCAqIGR1cmF0aW9uKSAtIHRoZQorCSAgbGF0ZW5jeSAoc2l6ZSkgb2YgdGhlIGppdHRlcmJ1ZmZlciAocHJpdi0+bGF0ZW5jeV9ucykuIFRoaXMgaXMgdGhlIGR1cmF0aW9uCisJICB0aGF0IHdlIG1ha2UgYSAibXVsdGktbG9zdCIgcGFja2V0IGZvci4KKwkgIFRoZSAibGF0ZSIgY29uY2VwdCBtYWRlIHNvbWUgc2Vuc2UgaW4gMC4xMCBhcyBpdCByZWZsZWN0ZWQgdGhhdCBhIGJ1ZmZlcgorCSAgY29taW5nIGluIGhhZCBub3QgYmVlbiB3YWl0ZWQgZm9yIGF0IGFsbCwgYnV0IGhhZCBhIHRpbWVzdGFtcCB0aGF0IHdhcworCSAgb3V0c2lkZSB0aGUgaml0dGVyYnVmZmVyIHRvIHdhaXQgZm9yLiBXaXRoIHRoZSByZXdyaXRlIG9mIHRoZSB3YWl0aW5nCisJICAodGltZW91dCkgbWVjaGFuaXNtIGluIDEuMCwgdGhpcyBubyBsb25nZXIgbWFrZXMgYW55IHNlbnNlLCBhbmQgdGhlCisJICB2YXJpYWJsZSBubyBsb25nZXIgcmVmbGVjdHMgYW55dGhpbmcgbWVhbmluZ2Z1bCAobnVtID4gMCBpcyB1c2VsZXNzLAorCSAgdGhlIGR1cmF0aW9uIGlzIHdoYXQgbWF0dGVycykKKwkgIEZpeGVkIHVwIHRoZSB0ZXN0cyB0aGF0IGhhZCBiZWVuIHNsaWdodGx5IG1vZGlmaWVkIGluIDEuMCB0byBhbGxvdyBmYXVsdHkKKwkgIGJlaGF2aW9yIHRvIHNuZWFrIGluLCBhbmQgcG9ydCBzb21lIG9mIHRoZW0gdG8gdXNlIEdzdEhhcm5lc3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM4MzYzCisKKzIwMTUtMDYtMzAgMTE6MjE6MzEgKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIFJldmVydCAicnRwaml0dGVyYnVmZmVyOiBGaXggZXhwZWN0ZWRfZHRzIGNhbGMgaW4gY2FsY3VsYXRlX2V4cGVjdGVkIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCAwNWJkNzA4ZmM1ZTg4MTM5MGZlODM5ODAzYjUzMTQ0MzkzZDk1YWIwLgorCSAgVGhlIHJldmVydGVkIHBhdGNoIGlzIHdyb25nIGFuZCBpbnRyb2R1Y2VzIGEgcmVncmVzc2lvbiBiZWNhdXNlIHRoZXJlCisJICBtYXkgc3RpbGwgYmUgdGltZSB0byByZWNlaXZlIHNvbWUgb2YgdGhlIHBhY2tldHMgaW5jbHVkZWQgaW4gdGhlIGdhcAorCSAgaWYgdGhleSBhcmUgcmVvcmRlcmVkLgorCisyMDE1LTA3LTA3IDIzOjUzOjAyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZmx1c2ggc2FtcGxlcyBiZWZvcmUgYWRkaW5nIG1vcmUgZnJvbSBtb29mCisJICBBdm9pZHMgYWNjdW11bGF0aW5nIGFsbCBzYW1wbGVzIGZyb20gYSBmcmFnbWVudGVkIHN0cmVhbSB0aGF0IGNvdWxkCisJICBsZWFkIHRvIGEgJ2luZGV4LXRvby1iaWcnIGVycm9yIG9uY2UgaXQgZ29lcyBvdmVyIDUwTUIgb2YgZGF0YS4gSXQKKwkgIGNvdWxkIHJlYWNoIHRoYXQgYmVmb3JlIDJoIG9mIHBsYXliYWNrIHNvIGl0IGRvZXNuJ3QgdGFrZSB0aGF0IGxvbmcuCisJICBBcyB1cHN0cmVhbSBlbGVtZW50cyBhcmUgcHJvdmlkaW5nIGRhdGEgaW4gdGltZSBmb3JtYXQgdGhleSBzaG91bGQKKwkgIGJlIHRoZSBvbmVzIHRoYXQgaGF2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmdWxsIG1lZGlhIGluZGV4CisJICBhbmQgc2hvdWxkIGJlIGFibGUgdG8gc2VlayBpZiBwb3NzaWJsZS4KKworMjAxNS0wNy0wNyAyMzo1NjoxMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSAgcXRkZW11eDogcmVuYW1lIHVwc3RyZWFtX25ld3NlZ21lbnQgdG8gdXBzdHJlYW1fZm9ybWF0X2lzX3RpbWUKKwkgIHVwc3RyZWFtX25ld3NlZ21lbnQgaXNuJ3QgcmVhbGx5IGNsZWFyIG9uIHdoYXQgaXQgbWVhbnMsIGl0IGlzIHNldAorCSAgdG8gVFJVRSB3aGVuIHRoZSB1cHN0cmVhbSBlbGVtZW50IHNlbmRzIGEgc2VnbWVudCBpbiBUSU1FIGZvcm1hdCwgc28KKwkgIHJlbmFtZSBpdCB0byBiZSBtb3JlIGNsZWFyIGFib3V0IGl0LgorCSAgSXQgaXMgaW1wb3J0YW50IHRvIGtub3cgdGhpcyBiZWNhdXNlIGl0IG1lYW5zIHRoYXQgdXBzdHJlYW0gaGFzCisJICBhIG5vdGlvbiBvZiB0aW1lIGFuZCBxdGRlbXV4IGlzIGxpa2VseSBiZWluZyBkcml2ZW4gYnkgYW4gdXBzdHJlYW0KKwkgIGVsZW1lbnQgdGhhdCBpcyByZWFkaW5nIGZyb20gYSBoaWdoZXIgbGV2ZWwgYWJzdHJhY3Rpb24gdGhhbiBhIGZpbGUsCisJICBzdWNoIGFzIGEgREFTSCwgTVNTIG9yIERMTkEgZWxlbWVudC4KKworMjAxNS0wNy0wNyAyMTozMTowOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBsZWFrIGJ5IGZsdXNoaW5nIHByZXZpb3VzIHNhbXBsZSBpbmZvIGZyb20gdHJhaworCSAgSW4gZnJhZ21lbnRlZCBzdHJlYW1pbmcsIG11bHRpcGxlIG1vb3YvbW9vZiB3aWxsIGJlIHBhcnNlZCBhbmQgdGhlaXIKKwkgIHByZXZpb3VzbHkgc3RvcmVkIHNhbXBsZXMgYXJyYXkgbWlnaHQgbGVhayB3aGVuIG5ldyB2YWx1ZXMgYXJlIHBhcnNlZC4KKwkgIFRoZSBwYXJzZV90cmFrIGFuZCBjYWxsZWVzIHdvbid0IGZyZWUgdGhlIHByZXZpb3VzbHkgc3RvcmVkIHZhbHVlcworCSAgYmVmb3JlIHBhcnNpbmcgdGhlIG5ldyBvbmVzLgorCSAgSW4gc3RlcC1ieS1zdGVwLCB0aGlzIGlzIHdoYXQgaGFwcGVuczoKKwkgIDEpIGluaXRpYWwgbW9vdiBpcyBwYXJzZWQsIHRyYWtzIGFzIHdlbGwsIHN0cmVhbXMgYXJlIGNyZWF0ZWQuIFRoZQorCSAgdHJhayBkb2Vzbid0IGNvbnRhaW4gc2FtcGxlcyBiZWNhdXNlIHRoZXkgYXJlIGluIHRoZSBtb29mJ3MgdHJ1bgorCSAgYm94ZXMuIG5fc2FtcGxlcyBpcyBzZXQgdG8gMCB3aGlsZSBwYXJzaW5nIHRoZSB0cmFrIGFuZCB0aGUgc2FtcGxlcworCSAgYXJyYXkgaXMgc3RpbGwgTlVMTC4KKwkgIDIpIG1vb2ZzIGFyZSBwYXJzZWQsIGFuZCB0aGVpciB0cnVuIGJveGVzIHdpbGwgaW5jcmVhc2Ugbl9zYW1wbGVzIGFuZAorCSAgY3JlYXRlL2V4dGVuZCB0aGUgc2FtcGxlcyBhcnJheQorCSAgMykgQXQgc29tZSBwb2ludCBhIG5ldyBtb292IG1pZ2h0IGJlIHNlbnQgKGJpdHJhdGUgc3dpdGNoaW5nLCBmb3IgZXhhbXBsZSkKKwkgIGFuZCBwYXJzaW5nIHRoZSB0cmFrIHdpbGwgb3ZlcndyaXRlIG5fc2FtcGxlcyB3aXRoIHRoZSB2YWx1ZXMgZnJvbQorCSAgdGhpcyB0cmFrLiBJZiB0aGUgbl9zYW1wbGVzIGlzIHNldCB0byAwIHF0ZGVtdXggd2lsbCBhc3N1bWUgdGhhdAorCSAgdGhlIHNhbXBsZXMgYXJyYXkgaXMgTlVMTCBhbmQgd2lsbCBsZWFrIGl0IHdoZW4gYSBuZXcgb25lIGlzCisJICBjcmVhdGVkIGZvciB0aGUgc3Vic2VxdWVudCBtb29mcy4KKwkgIFRoaXMgcGF0Y2ggbWFrZXMgcXRkZW11eCBwcm9wZXJseSBmcmVlIHByZXZpb3VzIHNhbXBsZSBkYXRhIGJlZm9yZQorCSAgY3JlYXRpbmcgbmV3IG9uZXMgYW5kIGFkZHMgYW4gYXNzZXJ0IHRvIGNhdGNoIGZ1dHVyZSBvY2N1cnJlbmNlcyBvZgorCSAgdGhpcyBpc3N1ZSB3aGVuIHRoZSBjb2RlIGNoYW5nZXMuCisKKzIwMTUtMDctMDcgMTY6NDY6MzMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggaW5kZXggc2l6ZSBjaGVjayBhbmQgZGVidWcgbWVzc2FnZQorCSAgSXQgaXMgYWxsb2NhdGluZyBzYW1wbGVzX2NvdW50ICsgbl9zYW1wbGVzLCBub3Qgb25seSBuX3NhbXBsZXMKKworMjAxNS0wNy0wOCAxNzowMjowNSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IENhbGN1bGF0ZSByZWNlaXZlIHRpbWUgaWYgd2UgZG9uJ3QgaGF2ZSBhbnkKKwkgIFRoaXMgaXMgcmVxdWlyZWQgdG8gcHJvcGVybHkgc2NoZWR1bGUgcGFja2V0IGxvc3MgdGltZXJzIGFuZCBtYWtlCisJICBzdXJlIGFsbCBvdXIgY2FsY3VsYXRpb25zIHdvcmsgcHJvcGVybHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ5NTM2CisKKzIwMTUtMDctMDggMTU6MTM6MTcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBIYW5kbGUgc2VxbnVtIGdhcHMgaW4gVENQIHN0cmVhbXMgd2l0aG91dCBlcnJvcmluZyBvdXQgb3Igb3ZlcmZsb3dpbmcgY2FsY3VsYXRpb25zCisJICBUaGF0IGlzLCBoYW5kbGUgRFRTPT1HU1RfQ0xPQ0tfVElNRV9OT05FIGNvcnJlY3RseS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDk1MzYKKworMjAxNS0wNy0wOCAyMDozMTo0MiArMDkwMCAgVmluZWV0aCBUIE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggZXZlbnQgbGVhaworCSAgd2hlbiBzZWVrIGZhaWxzIGluIGF2aWRlbXV4LCBldmVudCBpcyBub3QgYmVpbmcgZnJlZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyMTE3CisKKzIwMTUtMDctMDggMTI6MDI6MjIgKzAyMDAgIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5jOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBoMjYzLmM6CisJICBydHBoMjYzZGVwYXk6IE1ha2Ugc3VyZSBwYXlsb2FkIGlzIGxhcmdlIGVub3VnaAorCSAgUGx1cyBuZXcgdW5pdCB0ZXN0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjExMgorCisyMDE1LTA3LTA4IDA4OjU5OjQ5ICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGtsdmRlcGF5LmM6CisJICBydHBrbHZkZXBheTogZml4IHByaW50ZiBmb3JtYXQgY29tcGlsZXIgd2FybmluZworCSAgdl9sZW4gaXMgb2YgdHlwZSBndWludDY0LCBidXQgd2hpbGUgcHJpbnQgdGhlIHZhbHVlKDE2ICsgbGVuX3NpemUgKyB2X2xlbikKKwkgIEdfR1NJWkVfRk9STUFUIGlzIGJlaW5nIHVzZWQgaW5zdGVhZCBvZiBHX0dVSU5UNjRfRk9STUFUCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyMTAwCisKKzIwMTUtMDctMDcgMjA6MjU6NDcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSAgZG9jczogYWRkIG5ldyBSVFAgZWxlbWVudHMgdG8gZG9jcworCisyMDE1LTA3LTA3IDIwOjA3OjMxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgdGVzdHM6IHJ0cC1wYXlsb2FkaW5nOiBhZGQgYmFzaWMgdW5pdCB0ZXN0IGZvciBLTFYgcGF5bG9hZGluZworCSAgQWxzbyBtYWtlIGl0IHNvIHRoYXQgdGhlIG10dSBpcyBhbHdheXMgc2V0IGlmIHNwZWNpZmllZCwgbm90CisJICBvbmx5IGluIGNhc2Ugb2YgdGhlIHJhdGhlciB3ZWlyZCBidWZmZXJsaXN0IHRlc3QgY29kZSBwYXRoLgorCSAgVGhpcyBhbGxvd3MgdXMgdG8gZWFzaWx5IG1ha2UgdGhlIHBheWxvYWRlciBmcmFnbWVudCBhIHBheWxvYWQKKwkgIGFjcm9zcyBtdWx0aXBsZSBvdXRwdXQgcGFja2V0cyBieSBzZXR0aW5nIGEgc21hbGwgTVRVIG9uIGl0LgorCisyMDE1LTA3LTA3IDE5OjU4OjQyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGtsdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGtsdmRlcGF5Lmg6CisJICBydHBrbHZkZXBheTogaW1wcm92ZSBzdGFydCBkZXRlY3Rpb24gYW5kIGhhbmRsZSBmcmFnbWVudGVkIEtMViB1bml0cworCisyMDE1LTA3LTA1IDIwOjI1OjEwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwa2x2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwa2x2ZGVwYXkuaDoKKwkgIHJ0cDogYWRkIFNNUFRFIDMzNk0gS0xWIG1ldGFkYXRhIGRlcGF5bG9hZGVyCisJICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NTk3CisKKzIwMTQtMDgtMDkgMTA6MDg6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHBrbHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwa2x2cGF5Lmg6CisJICBydHA6IGFkZCBTTVBURSAzMzZNIEtMViBtZXRhZGF0YSBwYXlsb2FkZXIKKwkgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY1OTcKKworMjAxNS0wNy0wNyAxNjo1OToyMCArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSogZ3N0L2lzb21wNC9hdG9tcy5oOgorCSogZ3N0L2lzb21wNC9hdG9tc3JlY292ZXJ5LmM6CisJKiBnc3QvaXNvbXA0L3Byb3BlcnRpZXMuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgZG9jczogZml4ICJTeW1ib2wgbmFtZSBub3QgZm91bmQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjb21tZW50IGJsb2NrIgorCSAgQWRkIHN5bWJvbHMgb3IgY2hhbmdlIGNvbW1lbnQgaW50byBhIHJlZ3VsYXIgY29tbWVudC4KKworMjAxNS0wNy0wNyAxNjo1ODo1MyArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5oOgorCSAgZG9jczogcmVtb3ZlIG91dGRhdGVkIGRvYyBzdHJpbmdzCisKKzIwMTUtMDctMDMgMjM6MTA6NDAgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgZG9jczogYWRkIG1pc3NpbmcgcGx1Z2lucyBhbmQgZW5zdXJlIG1hc3RlciBkb2MgaXMgc29ydGVkCisKKzIwMTUtMDctMDcgMTU6NTQ6NDEgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgUmV2ZXJ0ICJpbWFnZWZyZWV6ZTogUmVtb3ZlIGltcG9zc2libGUgZXJyb3IgY29uZGl0aW9uIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCBkNDY2MzFjNWM3MzEyYWQ2MTMzOTdmODIzOGM3YTk3MTRhZTNhZTk0LgorCSAgcGFkIG9ubHkgaGFuZGxlIEVPUyBldmVudHMgYnV0IG5vdCBFT1MgZmxvdywgYW5kIHdpbGwgcHVzaCB0aGUgYnVmZmVyIGFnYWluCisJICByZXN1bHRpbmcgaW4gYW4gYXNzZXJ0aW9uIGVycm9yLiBTbyB3ZSBzaG91bGQgbm90IGhhbmRsZSB0aGUgYnVmZmVyCisJICBhbmQgcmV0dXJuIEVPUyBmbG93LgorCisyMDE1LTA3LTA3IDE1OjUwOjUwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOgorCSAgcnRwZzcyOWRlcGF5OiB1bm1hcCBydHAgYnVmZmVyIGluIGVycm9yIHBhdGgKKworMjAxNS0wNy0wNyAxNTo0ODo0MCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6CisJICBydHBnNzI5cGF5OiBmaXggYnVmZmVyIGxlYWsKKwkgIFRoZSBoYW5kbGVfYnVmZmVyIHZmdW5jIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgaW5wdXQgYnVmZmVyLgorCSAgRml4ZXMgZWxlbWVudHMvcnRwLXBheWxvYWRpbmcgdW5kZXIgdmFsZ3JpbmQuCisKKzIwMTUtMDctMDIgMDg6NTI6NDMgKzAyMDAgIFRvYmlhcyBNdWVsbGVyIDxtdWVsbGlAY3J5cHRvYml0Y2guZGU+CisKKwkqIGdzdC9nb29tL2dvb21fY29yZS5jOgorCSAgZ29vbTogSW5pdGlhbGlzZWQgdmFyaWFibGVzIHRvIHJlbW92ZSBjb21waWxlciB3YXJuaW5ncworCSAgZ29vbV9jb3JlLmM6IEluIGZ1bmN0aW9uICdnb29tX3VwZGF0ZSc6CisJICBnb29tX2NvcmUuYzo2ODU6NTogZXJyb3I6ICdwYXJhbTInIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbiBbLVdlcnJvcj1tYXliZS11bmluaXRpYWxpemVkXQorCSAgZ29vbV9saW5lc19zd2l0Y2hfdG8gKGdvb21JbmZvLT5nbWxpbmUyLCBtb2RlLCBwYXJhbTIsIGFtcGxpdHVkZSwgY291bGV1cik7CisJICBeCisJICBnb29tX2NvcmUuYzo2ODQ6NTogZXJyb3I6ICdwYXJhbTEnIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbiBbLVdlcnJvcj1tYXliZS11bmluaXRpYWxpemVkXQorCSAgZ29vbV9saW5lc19zd2l0Y2hfdG8gKGdvb21JbmZvLT5nbWxpbmUxLCBtb2RlLCBwYXJhbTEsIGFtcGxpdHVkZSwgY291bGV1cik7CisJICBeCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUyMDUzCisKKzIwMTUtMDctMDcgMDk6MTg6MzkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2MXBheS5jOgorCSAgcnRwaDI2MXBheTogZml4IGluZGVudGF0aW9uCisKKzIwMTUtMDctMDYgMTk6MTE6MDAgKzA5MDAgIEppbW15IE9obiA8eW9uZ2ppbi5vaG5AbGdlLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYxcGF5LmM6CisJICBydHBoMjYxcGF5OiBGaXggdW5pbml0aWFsaXplZCB2YXJpYWJsZSBjb21waWxlciBlcnJvcgorCSAgZW5kcG9zIHZhcmlhYmxlIGRvZXMgbm90IGNvcnJlY3RseSB1bmRlcnN0YW5kIGluIHRoZQorCSAgNC42LjMgR0NDIHZlcnNpb24uIFNvIGNvbXBpbGUgZXJyb3IgYXBwZWFycyB3aGVuIHdlIGRvCisJICBjb21waWxlIHJ0cGgyNjFwYXkgdXNpbmcgamhidWlsZC4KKwkgIFRoaXMgcGF0Y2ggaXMgZml4ZWQgdGhlIGNvbXBpbGUgZXJyb3IgaW4gNC42LjMgR0NDIHZlcnNpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxOTg1CisKKzIwMTQtMTEtMTIgMTI6MDg6NTggKzAxMDAgIEphbiBBbGV4YW5kZXIgU3RlZmZlbnMgKGhlZnRpZykgPGpzdGVmZmVuc0BtYWtlLnR2PgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogSGFuZGxlIHNlZWsgZmxhZ3MgcHJvcGVybHkKKwkgIEFsbG93cyBmb3Igbm9uLWtleWZyYW1lIHNlZWtzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczODU3MAorCisyMDE1LTAyLTI0IDEwOjUwOjUyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogYXZvaWQgbG9vcGluZyByZWFkaW5nIHRoZSAnbW9vZicgYXRvbSBmb3JldmVyCisJICBJdCBnZXRzIHN0dWNrIGlmIGl0IG9ubHkgZmluZHMgYSBtb29mIGFuZCBubyBtZnJhL21mcm8gb3IgbW9vdgorCSAgYXRvbXMuIFNraXAgdGhlIG1vb2YgdG8gY29udGludWUgdGhlIHBhcnNpbmcgdG8gaGF2ZSBpdCBlaXRoZXIKKwkgIHBsYXkgb3IgZXJyb3Igb3V0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTA4OQorCisyMDE1LTA2LTI2IDEzOjI0OjE3ICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiBpbXByb3ZlIGVycm9yIGhhbmRsaW5nCisJICBmb3IgZmlsZXMgd2hpY2ggaGF2ZSBjb3JydXB0ZWQgaGVhZGVyLCBsaWJmbGFjIGlzIG5vdCBhYmxlIHRvCisJICBwcm9jZXNzIHRoZSBtZXRhZGF0YSBwcm9wZXJseS4gV2UganVzdCB0cnkgdG8gaWdub3JlIHRoZSBlcnJvcgorCSAgYW5kIGNvbnRpbnVlIHdpdGggdGhlIHByb2Nlc3NpbmcsIHNpbmNlIG1ldGFkYXRhIHBhcnNpbmcgaXMgbm90CisJICBtYWtpbmcgbXVjaCBvZiBhIGRpZmZlcmVuY2UgdG8gbGliZmxhYworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTMzNAorCisyMDE1LTA3LTA2IDIwOjE2OjM4ICswOTAwICBIeXVuanVuIEtvIDx6em9vbi5rb0BzYW1zdW5nLmNvbT4KKworCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6CisJICB4aW1hZ2VzcmM6IGFkZCBtZXRhIHRyYW5zZm9ybSBmdW5jdGlvbgorCSAgeGltYWdlIG1ldGFkYXRhIGNhbid0IGJlIHRyYW5zZm9ybWVkIG9yIGNvcGllZCwgYnV0IHByb3ZpZGUgYW4gZW1wdHkKKwkgIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIGluc3RlYWQgb2YgTlVMTCB0byBhbGxvdyB1bmNvbmRpdGlvbmFsIGNhbGxpbmcKKwkgIG9mIG1ldGFzJyB0cmFuc2Zvcm0gZnVuY3Rpb25zLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTc3OAorCisyMDE0LTA2LTE2IDE2OjE0OjI4ICswMjAwICBTdGlhbiBTZWxuZXMgPHN0aWFuLnNlbG5lc0BnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSAgcnRwaDI2M3BkZXBheTogaW5pdCBkZWJ1ZyBjYXRlZ29yeQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MjAxMgorCisyMDE0LTA2LTIwIDEwOjU5OjE0ICswMjAwICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5jOgorCSAgcnRwdjhkZXBheTogaWdub3JlIHJlc2VydmVkIGJpdCBpbiBwYXlsb2FkIGRlc2NyaXB0b3IKKwkgIERyYWZ0IDE2IG9mICJSVFAgUGF5bG9hZCBGb3JtYXQgZm9yIFZQOCIgc3RhdGVzIGluIHNlY3Rpb24gNC4yIHRoYXQ6CisJICBSOiBCaXQgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuICBNVVNUIGJlIHNldCB0byB6ZXJvIGFuZCBNVVNUIGJlCisJICBpZ25vcmVkIGJ5IHRoZSByZWNlaXZlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTE5MjkKKworMjAxNS0wNy0wNCAyMDo1Njo0MiArMDIwMCAgU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYxcGF5LmM6CisJICBydHBoMjYxcGF5OiBydHBoMjYxZGVwYXk6IEFkZCBkb2N1bWVudGF0aW9uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxOTgyCisKKzIwMTUtMDctMDMgMjE6NTg6MTQgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBmNzRiMmRmIHRvIDlhZWQxZDcKKworMjAxNS0wNy0wMyAxNDoyOToxNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYxcGF5LmM6CisJICBydHBoMjYxcGF5OiBGaXggY29tcGlsZXIgd2FybmluZworCSAgZ3N0cnRwaDI2MXBheS5jOiBJbiBmdW5jdGlvbiAnZ3N0X3J0cF9oMjYxX3BheV9jbGFzc19pbml0JzoKKwkgIGdzdHJ0cGgyNjFwYXkuYzoxMDAzOjE3OiBlcnJvcjogdmFyaWFibGUgJ2dvYmplY3RfY2xhc3MnIHNldCBidXQgbm90IHVzZWQgWy1XZXJyb3I9dW51c2VkLWJ1dC1zZXQtdmFyaWFibGVdCisJICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisKKzIwMTUtMDctMDMgMTQ6MDM6MDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2MWRlcGF5LmM6CisJICBydHBoMjYxZGVwYXk6IExldCB0aGUgYmFzZSBjbGFzcyBwdXNoIHRoZSBidWZmZXIgc28gaXQgY2FuIGRlYWwgd2l0aCB0aGUgZmxvdyByZXR1cm4KKworMjAxNS0wNy0wMyAxNDoxMTozNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYxcGF5LmM6CisJICBydHBoMjYxcGF5OiBSZW1vdmUgdW51c2VkIGFkYXB0ZXIKKworMjAxNS0wNy0wMyAxMzoxNzoyNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSAgc3BlZXhwYXk6IERpcmVjdGx5IGF0dGFjaCBwYXlsb2FkIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGluc3RlYWQgb2YgY29weWluZyBpdAorCisyMDE1LTA3LTAzIDEzOjA3OjIwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5jOgorCSAgc2JjcGF5OiBBdHRhY2ggcGF5bG9hZCBkaXJlY3RseSB0byB0aGUgb3V0cHV0IGluc3RlYWQgb2YgY29weWluZworCisyMDE0LTEyLTAxIDE0OjE4OjQwICswMTAwICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYxZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2MXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYxcGF5Lmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgcnRwOiBhZGQgSC4yNjEgUlRQIHBheWxvYWRlciBhbmQgZGVwYXlsb2FkZXIKKwkgIEltcGxlbWVudGF0aW9uIGFjY29yZGluZyB0byBSRkMgNDU4Ny4KKwkgIFBheWxvYWRlciBjcmVhdGUgZnJhZ21lbnRzIG9uIE1CIGJvdW5kYXJpZXMgaW4gb3JkZXIgdG8gbWF0Y2ggTVRVIHNpemUKKwkgIHRoZSBiZXN0IGl0IGNhbi4gU29tZSBkZWNvZGVycy9kZXBheWxvYWRlcnMgaW4gdGhlIHdpbGQgYXJlIHZlcnkgc3RyaWN0CisJICBhYm91dCByZWNlaXZpbmcgYSBjb250aW51b3VzIGJpdC1zdHJlYW0gKGUuZy4gbm8gbm8tb3AgYml0cyBiZXR3ZWVuCisJICBmcmFtZXMpLCBzbyB0aGUgcGF5bG9hZGVyIHdpbGwgc2hpZnQgdGhlIGNvbXByZXNzZWQgYml0LXN0cmVhbSBvZiBhCisJICBmcmFtZSB0byBhbGlnbiB3aXRoIHRoZSBsYXN0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgcHJldmlvdXMgZnJhbWUuCisJICBEZXBheWxvYWRlciBkb2VzIG5vdCB0cnkgdG8gYmUgZmFuY3kgaW4gY2FzZSBvZiBwYWNrZXQgbG9zcy4gSXQgc2ltcGx5CisJICBkcm9wcyBhbGwgcGFja2V0cyBmb3IgYSBmcmFtZSBpZiB0aGVyZSBpcyBhIGxvc3MsIGtlZXBpbmcgaXQgc2ltcGxlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTg4NgorCisyMDE1LTA3LTAzIDEyOjE4OjUyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmM6CisJICBydHBtcHZkZXBheTogRG9uJ3QgZm9yZ2V0IHRvIHVubWFwIHRoZSBpbnB1dCBidWZmZXIKKworMjAxNS0wNy0wMyAxMjoxNDo0NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBtcHZwYXkuYzoKKwkgIHJ0cG1wdnBheTogQ3JlYXRlIGJ1ZmZlciBsaXN0cyBpbnN0ZWFkIG9mIHB1c2hpbmcgZWFjaCBidWZmZXIgaW5kaXZpZHVhbGx5CisKKzIwMTUtMDctMDMgMTI6MDM6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJICBydHBtcGFwYXk6IFVzZSBidWZmZXIgbGlzdHMgaW5zdGVhZCBvZiBwdXNoaW5nIGVhY2ggZnJhZ21lbnQgaW5kaXZpZHVhbGx5CisKKzIwMTUtMDctMDMgMTA6NTE6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5jOgorCSAgcnRwbXA0YXBheTogQ3JlYXRlIGJ1ZmZlciBsaXN0cyBhbmQgZG9uJ3QgY29weSBwYXlsb2FkIG1lbW9yeQorCisyMDE1LTA2LTI5IDE2OjE0OjE4ICswMjAwICBNaWd1ZWwgUGFyw61zIETDrWF6IDxtcGFyaXNkaWF6QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IENvbnNpZGVyIHRpbWVycyBsZW4gdG8gY29tcGFyZSB3aXRoIFJUUF9NQVhfRFJPUE9VVAorCSAgV2hlbiB0aGVyZSBhcmUgYSBsb3Qgb2Ygc21hbGwgZ2Fwcywgd2UgY2FuIGNvbnNpZGVyIHRoYXQgdGhlcmUgaXMKKwkgIGEgYmlnIGdhcCAodG9vIGxvc3NlcykgdG8gcmVzZXQgdGhlIGJ1ZmZlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTE2MzYKKworMjAxNS0wNi0yOSAxNTo1Mzo1MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogSWYgcG9zc2libGUsIGFsd2F5cyB1cGRhdGUgdGhlIGN1cnJlbnQgdGltZSBiZWZvcmUgbG9vcGluZyBvdmVyIGFsbCB0aW1lcnMKKwkgIElmIHdlIGhhdmUgYSBjbG9jaywgdXBkYXRlICJub3ciIG5vdyB3aXRoIHRoZSB2ZXJ5IGxhdGVzdCBydW5uaW5nIHRpbWUgd2UgaGF2ZS4KKwkgIElmIHRpbWVycyBhcmUgdW5zY2hlZHVsZWQgYmVsb3cgd2Ugb3RoZXJ3aXNlIHdvdWxkbid0IHVwZGF0ZSBub3cgKGl0J3Mgb25seSB1cGRhdGVkCisJICB3aGVuIHRpbWVycyBleHBpcmUpLCBhbmQgYWxzbyBmb3IgdGhlIHZlcnkgZmlyc3QgbG9vcCBpdGVyYXRpb24gbm93IHdvdWxkIG90aGVyd2lzZQorCSAgYWx3YXlzIGJlIDAuCisJICBBbHNvIHRoZSB0aW1lIGlzIHVzZWQgZm9yIHRoZSB0aW1lb3V0IGZ1bmN0aW9ucywgZS5nLiB0byBjYWxjdWxhdGUgYW55IHRpbWVzCisJICBmb3IgdGhlIG5leHQgdGltZW91dHMgYW5kIHdlIHdvdWxkIG90aGVyd2lzZSBwYXNzIHRvbyBvbGQgdGltZXMgdGhlcmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxNjM2CisKKzIwMTUtMDctMDIgMTQ6MzQ6NTcgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IGZpeCBtZW1vcnkgbGVhaworCSAgdG1wIG5lZWRzIHRvIGJlIGZyZWVkIGJlZm9yZSBnb2luZyBvdXQgb2Ygc2NvcGUgaW4gJ2RvbmUnLgorCSAgQ0lEICMxMzA4OTU0CisKKzIwMTUtMDctMDIgMTI6MjM6NDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkgIHJ0cGgyNjNwcGF5OiBHZW5lcmF0ZSBidWZmZXIgbGlzdHMgYW5kIGF0dGFjaCB0aGUgcGF5bG9hZCBkaXJlY3RseSBpbnN0ZWFkIG9mIGNvcHlpbmcgaXQKKworMjAxNS0wNy0wMiAwOTo0ODowMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJICBydHBoMjYzcGRlcGF5OiBTaW1wbGlmeSBjb2RlIGEgYml0IGFuZCBkbyBsZXNzIGRpcmVjdCBtZW1jcHkgYW5kIGxldCBHc3RCdWZmZXIgZG8gdGhhdCBmb3IgdXMKKworMjAxNS0wNy0wMiAwOToxNzo1OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkgIHJ0cGgyNjNwYXk6IFN0b3AgdXNpbmcgYW4gYWRhcHRlciBhbmQgZGlyZWN0bHkgdXNlIHRoZSBidWZmZXIKKwkgIFdlIGFsd2F5cyBwdXNoZWQgb25lIGJ1ZmZlciBpbnRvIHRoZSBhZGFwdGVyLCB0aGVuIGhhbmRsZWQgZXhhY3RseSB0aGF0IG9uZQorCSAgYnVmZmVyIGFuZCBmbHVzaGVkIGl0IGZyb20gdGhlIGFkYXB0ZXIuIE5vdyBhbHNvIGRvbid0IG1lbWNweSgpIHRoZSBhY3R1YWwKKwkgIHBheWxvYWQgYnV0IGp1c3QgYXR0YWNoIHRoZSBpbnB1dCBidWZmZXIncyBkYXRhIHRvIHRoZSBvdXRwdXQgYnVmZmVyLgorCSAgVGhpcyBjb2RlIHN0aWxsIG5lZWRzIHNvbWUgc2VyaW91cyByZWZhY3RvcmluZy9yZXdyaXRpbmcuCisKKzIwMTUtMDctMDEgMjE6NTc6MjggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJICBydHBnc21wYXk6IFJlbW92ZSBub24tZXhpc3RpbmcgaW5jbHVkZXMgZm9yIG5vdworCSAgZ2l0IGFkZCAtcCBtaXN0YWtlLgorCisyMDE1LTA3LTAxIDE5OjI5OjA3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSAgcnRwZ3N0cGF5OiBVc2UgdGhlIHJldHVybiB2YWx1ZSBvZiBnc3RfYnVmZmVyX2FwcGVuZCgpCisKKzIwMTUtMDctMDEgMTk6MTk6MTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJICBydHBnc21wYXk6IEF0dGFjaCBwYXlsb2FkIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGluc3RlYWQgb2YgY29weWluZyBpdAorCisyMDE1LTA3LTAxIDE3OjU4OjU2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkgIHJ0cGc3MjlwYXk6IEF0dGFjaCBwYXlsb2FkIGRpcmVjdGx5IHRvIG91dHB1dCBidWZmZXJzIGluc3RlYWQgb2YgY29weWluZworCisyMDE1LTA3LTAxIDE3OjQzOjUxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNwYXkuYzoKKwkgIHJ0cGc3MjNwYXk6IEF0dGFjaCBwYXlsb2FkIGJ1ZmZlciB0byB0aGUgb3V0cHV0IGluc3RlYWQgb2YgY29weWluZworCisyMDE1LTA3LTAxIDE3OjMwOjM5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuYzoKKwkgIHJ0cGR2ZGVwYXk6IE1hcCB0aGUgb3V0cHV0IGJ1ZmZlciBvbmNlIGluc3RlYWQgb2Ygb25jZSBldmVyeSA4MCBieXRlcworCisyMDE1LTA3LTAxIDIxOjQ2OjQ2ICswOTAwICBKaW1teSBPaG4gPHlvbmdqaW4ub2huQGxnZS5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggcmV0dXJuIHR5cGUgb2YgaW5kZXhfZW50cnlfb2Zmc2V0X3NlYXJjaCgpCisJICBJdCdzIGEgY29tcGFyZSBmdW5jdGlvbiBhbmQgbWF5IHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlLAorCSAgc28gc2hvdWxkIGZvciBjb3JyZWN0bmVzcyBhbmQgY29uc2lzdGVuY3kgcmV0dXJuIGEgc2lnbmVkCisJICBpbnRlZ2VyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTc4MAorCisyMDE1LTA3LTAxIDE0OjEyOjU3ICswMjAwICBNaWd1ZWwgUGFyw61zIETDrWF6IDxtcGFyaXNkaWF6QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHJlZmFjdG9yIGhhbmRsZV9uZXh0X2J1ZmZlcgorCSAgVGhlIGdvYWwgb2YgdGhpcyBwYXRjaCBpcyBtYWtpbmcgaGFuZGxlX25leHRfYnVmZmVyIGZ1bmN0aW9uCisJICBtb3JlIHJlYWRhYmxlIGF2b2lkaW5nIHVubmVjZXNhcnkgZ290b3MgYW5kIGFkZGluZyBvdGhlcgorCSAgY29zbWV0aWMgY2hhbmdlcy4KKworMjAxNS0wNy0wMSAxNTo0MDoyNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBhYzNwYXkuYzoKKwkgIHJ0cGFjM3BheTogQXR0YWNoIHRoZSBwYXlsb2FkIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGluc3RlYWQgb2YgY29weWluZyBpdAorCSAgTWlnaHQgYWxzbyB3YW50IHRvIHByb2R1Y2UgYnVmZmVyIGxpc3RzIGhlcmUgaWYgbmVlZGVkLgorCisyMDE1LTA3LTAxIDE1OjM4OjQ3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5LmM6CisJICBydHA6IEZpeCBpbmRlbnRpb24KKworMjAxNS0wNy0wMSAxMjozNzoxMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvZXhhbXBsZXMvcnRwL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1WUDgtT1BVUy5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItVlRTLVZQOC1BVFMtT1BVUy5zaDoKKwkgIHJ0cDogQWRkIGV4YW1wbGVzIHdpdGggVlRTL0FUUyBmb3IgVlA4L09QVVMKKwkgIExldCdzIGhhdmUgYW4gZXhhbXBsZSB3aXRoIG1vZGVybiBjb2RlY3MuCisKKzIwMTUtMDYtMzAgMTg6MTE6MzMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogVXNlIEdTVF9XQVJOSU5HX09CSkVDVCgpIGluc3RlYWQgb2YgR1NUX1dBUk5JTkcoKQorCisyMDE1LTA2LTMwIDE0OjA2OjIwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOGRlcGF5LmM6CisJICB2cDhkZXBheTogRG9uJ3QgbG9jay9tYXAgZXZlcnkgbm9uLWtleWZyYW1lIGJ1ZmZlciB0d2ljZQorCSAgSnVzdCBjb3B5IHRoZSBjb21wbGV0ZSBoZWFkZXIgaW5zdGVhZCBvZiBmaXJzdCBsb29raW5nIGF0IHRoZSBmaXJzdCBieXRlCisJICBhbmQgdGhlbiBhdCB0aGUgcmVtYWluaW5nIDEwIGJ5dGVzLgorCisyMDE1LTA2LTI5IDE2OjA1OjQ0ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBkb2N1bWVudCBmYWxsdGhyb3VnaCBjYXNlcworCSAgUGFjaWZ5IGNvdmVyaXR5IGFuZCBkb2N1bWVudCBmYWxsdGhyb3VnaCBjYXNlcyBpbiBzd2l0Y2ggc3RhdGVtZW50cy4KKwkgIENJRCAjMTMwODk0OCwgIzEzMDg5NDcsICMxMzA4OTQ2CisKKzIwMTUtMDYtMjkgMTA6MzY6NTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgUmV2ZXJ0ICJydHBqaXR0ZXJidWZmZXI6IElmIHdlIGhhdmUgYW4gaW1tZWRpYXRlIHRpbWVvdXQsIGRvbid0IHRyeSB0byBmaW5kIGFuIGVhcmxpZXIgdGltZW91dCIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgMGMyMWNkNzE3N2VhODgzYzcxMDk5OTE0N2RkY2VkYjE5MDA0ZDE4Mi4KKwkgIElmIHdlIGhhdmUgbXVsdGlwbGUgaW1tZWRpYXRlIHRpbWVycywgd2Ugd2FudCB0byBmaXJzdCBoYW5kbGUgdGhlIG9uZSB3aXRoIHRoZQorCSAgbG93ZXN0IHNlcXVlbmNlIG51bWJlci4uLiB3aGljaCB3b3VsZCBiZSBicm9rZW4gbm93LgorCSAgSW5zdGVhZCBvZiB0aGlzIHdlIHNob3VsZCBqdXN0IHVzZSBhIEdTZXF1ZW5jZSBmb3IgdGhlIHRpbWVycywgYW5kIGhhdmUgdGhlbQorCSAgc29ydGVkIGZpcnN0IGJ5IHRpbWVzdGFtcCwgYW5kIGZvciBlcXVhbCB0aW1lc3RhbXBzIGJ5IHNlcXVlbmNlIG51bWJlci4gVGhlbgorCSAgd2Ugd291bGQgYWx3YXlzIG9ubHkgaGF2ZSB0byB0YWtlIHRoZSB2ZXJ5IGZpcnN0IHRpbWVyIGZyb20gdGhlIGxpc3QgYW5kIG5ldmVyCisJICBoYXZlIHRvIGxvb2sgYXQgYW55IG90aGVycy4KKworMjAxNS0wNi0yOSAxMDoxNDowNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IElmIHdlIGhhdmUgYW4gaW1tZWRpYXRlIHRpbWVvdXQsIGRvbid0IHRyeSB0byBmaW5kIGFuIGVhcmxpZXIgdGltZW91dAorCSAgSWYgd2UgaGF2ZSBsb3RzIG9mIHN1Y2ggaW1tZWRpYXRlIHRpbWVvdXRzLCB3ZSB3b3VsZCBvdGhlcndpc2UgaGF2ZSBxdWFkcmF0aWMKKwkgIHJ1bnRpbWUgaW4gdGhlIG51bWJlciBvZiB0aW1lb3V0cy4KKworMjAxNS0wNi0xOSAxODowMTowMyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c3JjLmM6CisJICBzcGxpdG11eHNyYzogc3RpY2t5IGV2ZW50cyBhcmUgc2VudCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIHBhZAorCSAgTm8gbmVlZCB0byBzZW5kIHRoZW0gZXhwbGljaXRseSBmcm9tIHRoZSBlbGVtZW50CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMjQwCisKKzIwMTUtMDYtMTkgMTg6MDA6NDAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNyYy5jOgorCSAgc3BsaXRtdXhzcmM6IG1ha2Ugc3VyZSB0byBwdXNoIHN0aWNreSBldmVudHMgYmVmb3JlIGFkZGluZyBwYWQKKwkgIEl0IGFsbG93cyB0aGUgY2FwcyB0byBiZSBzZXQgb24gdGhlIHBhZCBiZWZvcmUgYmVpbmcgYWRkZWQgZm9yCisJICBkeW5hbWljIGF1dG9wbHVnZ2luZyB0byB3b3JrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTI0MAorCisyMDE1LTA2LTI2IDAwOjA1OjI5ICswOTAwICBIeXVuanVuIEtvIDx6em9vbi5rb0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogQWRkIG5ldyBudHAtdGltZS1zb3VyY2UgcHJvcGVydHkgYW5kIGRlcHJlY2F0ZSB1c2UtcGlwZWxpbmUtY2xvY2sgcHJvcGVydHkKKwkgIEVuYWJsZSB0byB1c2UgbmV3IG50cC10aW1lLXNvdXJjZSBwcm9wZXJ0eSBvZiBydHBiaW4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTE0OTYKKworMjAxNS0wNi0yNSAyMzoxOTo1OCArMDkwMCAgSHl1bmp1biBLbyA8enpvb24ua29Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwYmluL3Nlc3Npb246IGZpeCBkZXNjcmlwdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTQ5NgorCisyMDE1LTA2LTI1IDEwOjU3OjI1ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL3NoYXBld2lwZS1leGFtcGxlLmM6CisJICBkb2NzOiBkZWNvZGViaW4yIC0+IGRlY29kZWJpbgorCisyMDE1LTA2LTI1IDEwOjQ3OjA2ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiB1cGRhdGUgZXhhbXBsZSBwaXBlbGluZQorCSAgVXBkYXRlIHJlZmVyZW5jZSB0byBkZWNvZGViaW4yIHRvIGRlY29kZWJpbgorCisyMDE1LTA2LTI1IDEwOjQ1OjM1ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzYmdAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiByZW1vdmUgZGVhZCBhc3NpZ25tZW50cworCSAgVmFsdWVzIGluIGZpZWxkc19yZXF1aXJlZCBhbmQgc2FtZV9idWZmZXIgYXJlIG92ZXJ3cml0dGVuIGJlZm9yZSB1c2VkLiBSZW1vdmluZworCSAgYXNzaWdubWVudAorCisyMDE1LTA2LTI1IDEwOjA2OjA3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvbWlrbW9kL01ha2VmaWxlLmFtOgorCSogZXh0L21pa21vZC9SRUFETUU6CisJKiBleHQvbWlrbW9kL2Rydl9nc3QuYzoKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6CisJKiBleHQvbWlrbW9kL2dzdG1pa21vZC5oOgorCSogZXh0L21pa21vZC9taWttb2RfcmVhZGVyLmM6CisJKiBleHQvbWlrbW9kL21pa21vZF90eXBlcy5jOgorCSogZXh0L21pa21vZC9taWttb2RfdHlwZXMuaDoKKwkqIG00L01ha2VmaWxlLmFtOgorCSogbTQvbGlibWlrbW9kLm00OgorCSogd2luMzIvTUFOSUZFU1Q6CisJKiB3aW4zMi92czgvbGliZ3N0bWlrbW9kLnZjcHJvajoKKwkgIG1pa21vZDogcmVtb3ZlIGFuY2llbnQgdW5wb3J0ZWQgcGx1Z2luCisJICBUaGlzIGhhc24ndCBiZWVuIHRvdWNoZWQgaW4gMTEgeWVhcnMsIGFuZAorCSAgY2xlYXJseSBubyBvbmUncyBiZWVuIG1pc3NpbmcgaXQuCisKKzIwMTUtMDYtMjMgMjA6MTU6MTMgKzA5MDAgIEdpbGJvayBMZWUgPGdpbGJvay5sZWVAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZG9lcyBub3QgZGV0ZWN0IG9yaWVudGF0aW9uCisJICBNb3N0IGZpbGVzIGRvbid0IGNvbnRhaW4gdGhlIHZhbHVlcyBmb3IgdHJhbnNwb3NpbmcgdGhlIGNvb3JkaW5hdGVzCisJICBiYWNrIHRvIHRoZSBwb3NpdGl2ZSBxdWFkcmFudCBzbyBxdGRlbXV4IHdhcyBpZ25vcmluZyB0aGUgcm90YXRpb24KKwkgIHRhZy4gVG8gYmUgYWJsZSB0byBwcm9wZXJseSBoYW5kbGUgdGhvc2UgZmlsZXMgcXRkZW11eCB3aWxsIGFsc28gaWdub3JlCisJICB0aGUgdHJhbnNwb3NpbmcgdmFsdWVzIHRvIG9ubHkgZGV0ZWN0IHRoZSByb3RhdGlvbiB1c2luZyB0aGUgdmFsdWVzCisJICBhYmRlIGZyb20gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeDoKKwkgIFthIGIgY10KKwkgIFtkIGUgZl0KKwkgIFtnIGggaV0KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzg2ODEKKworMjAxNS0wNi0yNSAwMDowNDoxNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjUuMiA9PT0KKworMjAxNS0wNi0yNCAyMzozMDo0MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS41LjIKKworMjAxNS0wNi0yNCAyMjo1NjoxMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNS0wNi0yNCAxMToxNTowMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vbmwucG86CisJICBwbzogVXBkYXRlIHRyYW5zbGF0aW9ucworCisyMDE1LTA2LTIzIDE4OjQyOjU5IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJICBxdG11eDogQ29ycmVjdGx5IHRlc3QgZWFjaCBzZWdtZW50cworCSAgSW4gcHJlc2VuY2Ugb2YgZ2FwcywgcXRkZW11eCB3aWxsIGVtaXQgbXVsdGlwbGUgc2VnbWVudHMuIFRoZQorCSAgc2Vjb25kIHNlZ21lbnQgc3RhcnQgc2hvdWxkIG1hdGNoIHRoZSBDVFRTLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTM2MQorCisyMDE1LTA2LTIzIDE3OjU0OjMxIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBDb3JyZWN0bHkgY2FsY3VsYXRlIHRoZSBlbHN0IG1lZGlhIHN0YXJ0CisJICBUaGUgbWVkaWEgc3RhcnQgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgc2hpZnQgd2UgaGF2ZSBhcHBsaWVkCisJICBidXQgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IFBUUy4gVGhpcyBpcyBkZWZpbmVkIGFzOgorCSAgRHQoMCkgPSAwCisJICBDdCgwKSA9IER0KDApICsgQ1RUUygwKQorCSAgU28gdGhlIG1lZGlhIHN0YXJ0IGlzIGFsd2F5cyB0aGUgZmlyc3QgQ1RUUy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEzNjEKKworMjAxNS0wNi0yMyAxMTo0OTozMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFjY3VtdWxhdGUgcHJldmlvdXMgZWR0cyBlbnRyaWVzIGludG8gc2VnbWVudC5iYXNlCisJICBBbGxvd3MgcGxheWluZyBlZHRzIGVkaXR0ZWQgZmlsZXMgd2l0aCBwcm9wZXIgc3luY2hyb25pemF0aW9uIG9mCisJICBzdHJlYW1zLiBUaGlzIHBhdGNoIGZpeGVzIHRoZSByZWdyZXNzaW9uIGludHJvZHVjZWQgYnkKKwkgIGJmOTVmOTNjMDE4OWFhMDRmMThlMjY0Yjg2YjY1MjdlNDMxYzVkNTMgdGhhdCB3YXMgYWRkZWQgdG8gZml4CisJICBzZWdtZW50IHNlZWtzIGhhbmRsaW5nLgorCSAgSGF2aW5nIHRoZSBhY2N1bXVsYXRlZF9iYXNlIHNlcGFyYXRlZCBmcm9tIHRoZSBtYWluIHNlZ21lbnQuYmFzZQorCSAgYWxsb3dzIGhhbmRsaW5nIGJvdGggc2VnbWVudCBzZWVrcyBhbmQgZWR0cyBlZGl0dGVkIGZpbGVzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTM2MQorCisyMDE1LTA2LTIzIDAwOjU2OjE2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogaW1wcm92ZSBzb21lIGRlYnVnIG1lc3NhZ2VzCisJICBUaG9zZSBtZXNzYWdlcyBhcmUgYWJvdXQgdGhlIHN0cmVhbSwgdXNlIHRoZSBwYWQgYXMgdGhlCisJICBkZWJ1ZyBvYmplY3QgdG8gbWFrZSBpdCBjbGVhciBmcm9tIHRoZSBsb2dzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMzYxCisKKzIwMTUtMDYtMjIgMjI6MjI6MDkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHN0b3JlIGxhc3RfZHRzIG9mIHRoZSBmaXJzdCBidWZmZXIKKwkgIEJ1ZmZlcnMgbmVlZCBub3QgdG8gc3RhcnQgYXQgcnVubmluZy10aW1lIDAgc28gdGhlIGxhc3RfZHRzIG5lZWRzCisJICB0byBiZSB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGJ1ZmZlcidzIGR0cyBhcyBpdCBpcyB1c2VkIHRvIGNvbXB1dGUKKwkgIHRoZSBkdXJhdGlvbiBvZiB0aGUgYnVmZmVycy4gSWYgaXQgd2FzIGxlZnQgYXQgMCB0aGUgZmlyc3QgYnVmZmVyCisJICB3b3VsZCBoYXZlIGEgbGFyZ2VyIGR1cmF0aW9uIHdoZW4gaXQgc2hvdWxkbid0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMzYxCisKKzIwMTUtMDYtMjMgMTc6MTE6NTcgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGZpeCBwb3NzaWJsZSBtZW1vcnkgbGVhaworCSAgd2hlbiBidWZmZXIgaXMgc3RvcmVkIHRvIHNlZWt0YWJsZSwgYW5kIHN0b3AgZ2V0cyBjYWxsZWQgZHVlIHRvCisJICBjb3JydXB0IGZsYWMgZmlsZSwgdGhlbiB0aGUgc2Vla3RhYmxlIGlzIG5vdCBiZWluZyByZWxlYXNlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTM2NAorCisyMDE1LTA2LTIzIDE2OjI4OjQwICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmg6CisJICBSZXZlcnQgInNwbGl0bXV4c2luazogTWFzayBhc3luYy1zdGFydC9kb25lIHdoaWxlIHN3aXRjaGluZyBmaWxlcy4iCisJICBUaGlzIHJldmVydHMgY29tbWl0IGQ2MWU1MzkzZjExMGVkNDgyODE1ZDc3ODA3MjQ1ZDc4YjUyZWZmNDYuCisJICBDYXVzZXMgZmFpbHVyZXMgbXV4aW5nIGxhcmdlciBHT1Agc2l6ZXMgZm9yIHNvbWUgcmVhc29uLiBSZXZlcnRpbmcKKwkgIHdoaWxlIEkgZmlndXJlIGl0IG91dAorCisyMDE1LTA2LTE4IDIzOjIyOjA2ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkgIHNwbGl0bXV4c3JjOiBGaXggc3RhcnR1cCBhbmQgc2h1dGRvd24gcmFjZXMuCisJICBGaXggMiBzdGFydHVwIHJhY2VzIHdoZW4gdGhpbmdzIGhhcHBlbiB0b28gcXVpY2tseSwgYW5kIDEKKwkgIGF0IHNodXRkb3duIGJ5IGhvbGRpbmcgYSByZWYgdG8gdGhlIHBhZHMgaW4gdXNlIHVudGlsIHRoZQorCSAgbG9vcCBmdW5jdGlvbnMgZXhpdC4KKwkgIEhhbmRsZSBlcnJvcnMgYWN0aXZhdGluZyBmaWxlIHBhcnRzIGFuZCBwdWJsaXNoIHRoZW0gb24KKwkgIHRoZSBidXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUwNzQ3CisKKzIwMTUtMDYtMTggMDk6MjY6MTMgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuaDoKKwkgIHNwbGl0bXV4c2luazogTWFzayBhc3luYy1zdGFydC9kb25lIHdoaWxlIHN3aXRjaGluZyBmaWxlcy4KKwkgIFNvbWV0aW1lcywgZXh0cmEgYXN5bmMtc3RhcnQvZG9uZSBmcm9tIHRoZSBpbnRlcm5hbCBzaW5rCisJICB3aGlsZSB0aGUgZWxlbWVudCBpcyBzdGlsbCBzdGFydGluZyB1cCBjYW4gY2F1c2Ugc3BsaXRtdXhzaW5rCisJICB0byBzdGFsbCBpbiBQQVVTRUQgc3RhdGUgd2hlbiBpdCBoYXMgYmVlbiBzZXQgdG8gUExBWUlORworCSAgYnkgdGhlIGFwcC4gRHJvcCB0aGUgY2hpbGQncyBhc3luYy1zdGFydC9kb25lIG1lc3NhZ2VzIHdoaWxlCisJICBzd2l0Y2hpbmcsIHNvIHRoZXkgZG9uJ3QgY2F1c2Ugc3RhdGUgY2hhbmdlcyBhdCB0aGUKKwkgIHNwbGl0bXV4c2luayBsZXZlbC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTA3NDcKKworMjAxNS0wNi0xNSAxNjoxMjoxMCArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2EtZGVtdXg6IFVzZSBnc3RfdmlkZW9fbXVsdGl2aWV3X2d1ZXNzX2hhbGZfYXNwZWN0KCkKKwkgIFVzZSB0aGUgZ3N0X3ZpZGVvX211bHRpdmlld19ndWVzc19oYWxmX2FzcGVjdCgpIHV0aWxpdHkgZnVuY3Rpb24KKwkgIHRvIHNldCB0aGUgaGFsZi1hc3BlY3QgZmxhZyAob3Igbm90KSBvbiBzdGVyZW9zY29waWMgZnJhbWUtcGFja2VkCisJICB2aWRlb3MuCisKKzIwMTUtMDYtMTUgMTY6MTA6MzcgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IE1vdmUgbXVsdGl2aWV3IGNhcHMgY2FsY3VsYXRpb25zLCBhZGQgaGFsZi1hc3BlY3QgaGV1cmlzdGljcworCSAgTW92ZSB0aGUgbXVsdGl2aWV3IGNhcHMgY2FsY3VsYXRpb25zIHRvIHRoZSBjb25maWd1cmVfc3RyZWFtKCkKKwkgIGZ1bmN0aW9uLCBzbyB0aGUgcmVzdCBvZiB0aGUgdmlkZW8gaW5mbyBpcyBhdmFpbGFibGUsIGFuZAorCSAgdXNlIHRoZSBnc3RfdmlkZW9fbXVsdGl2aWV3X2d1ZXNzX2hhbGZfYXNwZWN0KCkgZnVuY3Rpb24gdG8KKwkgIGRldGVybWluZSBpZiB0aGUgaGFsZi1hc3BlY3QgZmxhZyBzaG91bGQgYmUgc2V0IG9uIGZyYW1lLXBhY2tlZAorCSAgdmlkZW8uCisKKzIwMTUtMDYtMTggMTY6MDY6MDIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBBZGQgY3NsZyBzdXBwb3J0CisJICBUaGUgY3NsZyBhdG9tIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIERUUyBzaGlmdC4gVGhpcyBpcworCSAgbmVlZGVkIGluIHJlY2VudCB2ZXJzaW9uIG9mIGN0dHMgYXRvbSB3aGVyZSB0aGUgb2Zmc2V0IGNhbiBiZQorCSAgbmVnYXRpdmUuIFdoZW4gY3NsZyBpcyBtaXNzaW5nLCB3ZSBwYXJzZSB0aGUgQ1RUUyB0YWJsZSBhcyBwcm9wb3NlZAorCSAgaW4gdGhlIHNwZWMgdG8gY2FsY3VsYXRlIHRoZXNlIHZhbHVlcy4KKwkgIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIHdlIG9ubHkgbmVlZCB0byBrbm93IHRoZSBzaGlmdC4gQXMgR1N0cmVhbWVyCisJICBjYW5ub3QgdHJhbnNwb3J0IG5lZ2F0aXZlIHRpbWVzdGFtcHMsIHdlIHNoaWZ0IHRoZSB0aW1lc3RhbXBzIGZvcndhcmQKKwkgIHVzaW5nIHRoYXQgdmFsdWUgYW5kIGFkYXB0IHRoZSBzZWdtZW50IHRvIGNvbXBlbnNhdGUuIFRoaXMgcGF0Y2ggYWxzbworCSAgcmVtb3ZlcyBib2d1cyBvZmZzZXQgb2YgY3R0c19zb2Zmc2V0LCB0aGlzIG9mZnNldCBzaGFsbCBiZSBpbmNsdWRlZAorCSAgaW4gdGhlIGVkaXQgbGlzdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTExMDMKKworMjAxNS0wNi0xOSAxODozNzo1OSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgcXRtdXg6IFRlc3QgZ2FwcyBhdCBzdGFydCBvZiBzdHJlYW0KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEyNDIKKworMjAxNS0wNi0xOSAxODo0MDo0MyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogVXNlIFBUUyB0byBmaWd1cmUtb3V0IHByZXNlbmNlIG9mIGdhcHMKKwkgIFdlIG5lZWQgdG8gbG9vayBhdCB0aGUgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBpbiBvcmRlciB0byBjb25jbHVkZSBpZgorCSAgdGhlcmUgaXMgYSBnYXAgYXQgdGhlIHN0YXJ0IG9mIGEgc3RyZWFtLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTI0MgorCisyMDE1LTA2LTE5IDE2OjQ1OjAyIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBTZXQgZWRpdCBsaXN0IHRvIGNvbXBlbnNhdGUgRFRTIHNoaWZ0CisJICBXZSBzaGlmdCBEVFMgZm9yd2FyZCB0byBhdm9pZCBuZWdhdGl2ZSB0aW1lc3RhbXBzIHdoaWNoIGNhbm5vdCBiZQorCSAgcmVwcmVzZW50ZWQgd2l0aCB2ZXJzaW9uIDAgb2YgdGhlIENUVFMgdGFibGUuIFRvIHN0aWNrIHdpdGggdGhhdAorCSAgdmVyc2lvbiAoYmFja3dhcmQgY29tcGF0aWJpbGl0eSksIHRoZSBzcGVjIHJlY29tbWVuZCB1c2luZyBhbgorCSAgZWRpdCBsaXN0IGVudHJ5IHRvIG1vdmUgYmFjayB0aGUgcHJlc2VudGF0aW9uIHRpbWUgdG8gd2hlcmUgaXQKKwkgIHNob3VsZCBiZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEyNDIKKworMjAxNS0wNi0yMiAxNDozNTo1MiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IEluc2VydCBBVkMgZW5kIG9mIHNlcXVlbmNlCisJICBUaGlzIEZMViBzcGVjaWZpYyBtYXJrIGlzIG5lZWRlZCB0byBwcmV2ZW50IEZsb3cgUGxheWVyIChtb3N0IGxpa2VseQorCSAgYWxsIEZsYXNoIGJhc2UgcGxheWVyKSBmcm9tIGdvaW5nIGludG8gYnVmZmVyaW5nIHN0YXRlIHdoZW4gbmVhciBFT1MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMzIwCisKKzIwMTUtMDYtMjIgMTM6MDU6MjkgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJICBtYXRyb3NrYTogcmVtb3ZlIHVzZWxlc3MgY2hlY2sKKwkgIE5vIG5lZWQgdG8gY2hlY2sgZm9yIGNvbnRleHQgYXZhaWxhYmlsaXR5IHdoaWxlIGZyZWVpbmcuIFdlIGFyZSBpbnNpZGUKKwkgIGluc2lkZSBhIGNvZGUgYmxvY2sgd2l0aCBhIGNvbmRpdGlvbiB0aGF0IGRlcmVmZXJlbmNlcyBjb250ZXh0LgorCSAgaWYgKGNvbnRleHQtPnR5cGUgPT0gMCAuLi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEzMDYKKworMjAxNS0wNi0yMiAxOTozNTo1NyArMDkwMCAgVmluZWV0aCBUIE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9sem8uYzoKKwkgIGx6bzogZml4IG1lbW9yeSBsZWFrCisJICB0aGUgb3BlbmVkIGZpbGUgaXMgbm90IGJlaW5nIGNsb3NlZCBkdXJpbmcgdGVzdCwgd2hpY2ggd2lsbCByZXN1bHQKKwkgIGluIG1lbW9yeSBsZWFrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MTMwNgorCisyMDE1LTA2LTIyIDE5OjMwOjU4ICswOTAwICBWaW5lZXRoIFQgTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZXh0L21pa21vZC9taWttb2RfcmVhZGVyLmM6CisJICBtaWttb2RfcmVhZGVyOiBQb3NzaWJsZSBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2U6CisJICBnc3RfcmVhZGVyIHZhcmlhYmxlIGlzIGJlaW5nIHVzZWQgYmVmb3JlIGFjdHVhbGx5IGNoZWNraW5nIGlmIGl0CisJICBhbGxvY2F0ZWQgcHJvcGVybHkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEzMDYKKworMjAxNS0wNi0yMiAxOTo0NToxNCArMDkwMCAgU2FuZ2t5dSBQYXJrIDxzazExMjIucGFya0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogTWlub3IgY2xlYW4tdXAKKwkgIDEuIEZpeCB0aGUgY29kZSB3aGljaCBpcyB3cm9uZyBjb2Rpbmcgc3R5bGUuCisJICAyLiBGaXggYSB0eXBpbmcgZXJyb3Igb2YgY29tbWVudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEzMTYKKworMjAxNS0wNi0yMiAxMToyODoxMyArMDIwMCAgSm9zZSBBbnRvbmlvIFNhbnRvcyBDYWRlbmFzIDxzYW50b3NjYWRlbmFzQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IERvIG5vdCB0cnkgdG8gcHVzaCBOVUxMIGJ1ZmZlcnMKKwkgIElmIHVwZGF0ZV9yZWNlaXZlcl9zdGF0cygpIGZhaWxzLCB3ZSBjYW4ndCByZWFsbHkgZG8gYW55dGhpbmcgd2l0aCB0aGlzIGJ1ZmZlcgorCSAgYW55bW9yZSBhbmQgaGF2ZSB0byBkcm9wIGl0LiBUaGlzIGhhcHBlbnMgaWYgdGhlcmUncyBhIGJpZyBzZXFudW0KKwkgIGRpc2NvbnRpbnVpdHkgZm9yIGV4YW1wbGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMzExCisKKzIwMTUtMDYtMjIgMTM6MTA6MDIgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiB0cml2aWFsIGNsZWFudXAKKwkgIHRyaXZpYWwgcGF0Y2ggdG8gYWRkIHByb3BlciAoIHdoaWxlIGNoZWNraW5nIGZvciBpZihHX1VOTElLRUxZKCkpCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMzA2CisKKzIwMTUtMDYtMjIgMTM6MTY6MDggKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkgIGRjYXBhcnNlOiBpbml0aWFsaXplIHNpemUgdmFyaWFibGUKKwkgIHNpemUgY2FuIGJlIHVzZWQgaW4gY2xlYW51cCB3aXRob3V0IGJlaW5nIGluaXRpYWxpemVkLiBIZW5jZQorCSAgc2V0dGluZyBpdCB0byAwIHdoZW4gZGVjbGFyaW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMzA2CisKKzIwMTUtMDYtMjIgMTM6MTM6MjkgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIG1wZWdhdWRpb3BhcnNlOiBpbml0aWFsemUgYnBmIHZhcmlhYmxlCisJICBicGYgdmFyaWFibGUgbWlnaHQgYmUgdXNlZCBpbiBjbGVhbnVwIHdpdGhvdXQgYmVpbmcgaW50aWFsaXplZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTEzMDYKKworMjAxNS0wNi0xOSAxNDo1MDo1OSArMDIwMCAgTWlndWVsIFBhcsOtcyBEw61heiA8bXBhcmlzZGlhekBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHF1ZXVlLmM6CisJICBydHBydHhxdWV1ZTogcmV2ZXJzZSBwZW5kaW5nIGxpc3QgYmVmb3JlIHB1c2hpbmcgYnVmZmVycworCSAgV2l0aCB0aGlzIHdlIHNlbmQgdGhlIFJUWCBidWZmZXJzIGluIHRoZSBzYW1lIG9yZGVyCisJICB0aGF0IHRoZXkgd2VyZSByZXF1ZXN0ZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMjk3CisKKzIwMTUtMDYtMjEgMTk6MjI6MTAgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBGaXggRFRTIHZhbGlkaXR5IGNoZWNrCisJICBUaGlzIGNoZWNrIHdhcyB1cC1zaWRlLWRvd24sIGNhdXNpbmcgYSBiYWQgdGltZXN0YW1wIGF0IHN0YXJ0CisJICBhbmQgdGhlbiBhbGwgdGltZXN0YW1wIGJlaW5nIGRlbGF5ZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUxMjk4CisKKzIwMTUtMDYtMTcgMTU6MTk6NDcgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmM6CisJICBjc2xnOiBBZGQgQ29tcG9zaXRpb24gU2hpZnQgTGVhc3QgR3JlYXRlc3QgQXRvbQorCSAgVGhpcyBzaW1wbHkgYWRkIGZvdXJjYyBhbmQgZHVtcCBmdW5jdGlvbiBmb3IgdGhlIGNzbGcgQXRvbS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTExMDMKKworMjAxNS0wNi0xNyAxNToxODozOCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5jOgorCSAgY3R0c19kdW1wOiBGaXggc2lnbmVzcyBpc3N1ZXMKKwkgIEl0IGRpZG4ndCBidWcsIGJ1dCB1c2UgY29ycmVjdCBzaWduZXNzIGluIHRyYWNlcy4gVGhlIG51bWJlciBvZgorCSAgZW50cmllcyBpcyB1bnNpZ25lZCB3aGlsZSB0aGUgb2Zmc2V0IGNhbiBiZSBzaWduZWQgYWNjb3JkaW5nIHRvCisJICByZWNlbnQgc3BlYy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTExMDMKKworMjAxNS0wNi0xNiAxNzo0ODowOCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA2MDE1ZDI2IHRvIGY3NGIyZGYKKworMjAxNS0wNi0xNiAxMTo0MzozOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGdzdF9ydHBfYnVmZmVyX2V4dF90aW1lc3RhbXAoKSBtb2RpZmllcyBpdHMgZmlyc3QgYXJndW1lbnQsIGtlZXAgYSBjb3B5IGFyb3VuZAorCisyMDE1LTA2LTE2IDEwOjMwOjM0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogQ29tcGFyZSBleHQgUlRQIHRpbWVzLCBub3QgcGxhaW4gUlRQIHRpbWUgYW5kIGV4dCBSVFAgdGltZSB3aGVuIGNhbGN1bGF0aW5nIGVsYXBzZWQgdGltZQorCSAgT3RoZXJ3aXNlIGFsbCBSVFAgdGltZXMgYWZ0ZXIgYSB3cmFwYXJvdW5kIHdvdWxkIGJlIGNvbnNpZGVyZWQgYXMgZ29pbmcKKwkgIGJhY2t3YXJkcywgdGhleSB3aWxsIGFsd2F5cyBiZSBzbWFsbGVyIHRoYW4gdGhlIGV4dCBSVFAgdGltZS4KKworMjAxNS0wNi0xNSAxOToyNToxMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IFRoZSBkZWZhdWx0IHJ0cC1wcm9maWxlIHNob3VsZCBiZSBBVlAsIG5vdCBBVlBGCisKKzIwMTUtMDYtMTUgMTQ6MzI6MjEgKzA5MDAgIFNhbmdreXUgUGFyayA8c2sxMTIyLnBhcmtAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IE1pbm9yIGNsZWFudXAKKwkgIDEuIEFkZCBOdWxsIGNoZWNrIGluICdmcmVlX2l0ZW0nIGZ1bmN0aW9uLgorCSAgMi4gRml4IGEgdHlwaW5nIGVycm9yIG9mIGNvbW1lbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUwOTY1CisKKzIwMTUtMDYtMTIgMTc6NDQ6NTEgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsbXV4OiBNYWtlIHN1cmUgYmVzdF90aW1lIGlzIGluaXRpYWxpemVkCisKKzIwMTUtMDYtMTIgMjM6Mjk6MTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmg6CisJICBydHBiaW4vc2Vzc2lvbjogQWRkIG5ldyBudHAtdGltZS1zb3VyY2UgcHJvcGVydHkgYW5kIGRlcHJlY2F0ZSB1c2UtcGlwZWxpbmUtY2xvY2sgcHJvcGVydHkKKwkgIFRoZSBuZXcgcHJvcGVydHkgYWxsb3dzIHRvIHNlbGVjdCB0aGUgdGltZSBzb3VyY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlCisJICBOVFAgdGltZSBpbiBSVENQIHBhY2tldHMuIEJ5IGRlZmF1bHQgaXQgd2lsbCBjb250aW51ZSB0byBjYWxjdWxhdGUgdGhlIE5UUAorCSAgdGltZXN0YW1wICgxOTAwIGVwb2NoKSBiYXNlZCBvbiB0aGUgcmVhbHRpbWUgY2xvY2suIEFsdGVybmF0aXZlbHkgaXQgY2FuIHVzZQorCSAgdGhlIFVOSVggdGltZXN0YW1wICgxOTcwIGVwb2NoKSwgdGhlIHBpcGVsaW5lJ3MgcnVubmluZyB0aW1lIG9yIHRoZSBwaXBlbGluZSdzCisJICBjbG9jayB0aW1lLiBUaGUgbGF0dGVyIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBzeW5jaHJvbml6aW5nIG11bHRpcGxlCisJICByZWNlaXZlcnMgaWYgYWxsIG9mIHRoZW0gc2hhcmUgdGhlIHNhbWUgY2xvY2suCisJICBJZiB1c2UtcGlwZWxpbmUtY2xvY2sgaXMgc2V0IHRvIFRSVUUsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIG50cC10aW1lLXNvdXJjZQorCSAgc2V0dGluZyBhbmQgY29udGludWUgdG8gdXNlIHRoZSBydW5uaW5nIHRpbWUgcGx1cyA3MCB5ZWFycy4gVGhpcyBpcyBvbmx5IGtlcHQKKwkgIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKworMjAxNS0wNC0wNyAxNjowMzo0MiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgdGVzdHM6IHF0bXV4OiB0ZXN0IGZvciBtdXhpbmcgd2l0aCBEVFMgb3V0c2lkZSB0aGUgc2VnbWVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDU3NQorCisyMDE1LTA2LTExIDE3OjI2OjQ5IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWRqdXN0IHNlZ21lbnQgYWNjb3JkaW5nIHRvIGN0dHMgb2Zmc2V0CisJICBJbiBwcmVzZW5jZSBvZiBhIENUVFMsIHRoZSBzZWdtZW50IHN0YXJ0L3N0b3AgbXVzdCBiZSBvZmZzZXQgc28KKwkgIHRoZSBzZWdtZW50IHN0YXJ0L3N0b3AgaW5jbHVkZSB0aGUgUFRTLiBUaGlzIGlzIG5lZWRlZCBzaW5jZSB0aGUKKwkgIFBUUyBjYW5ub3QgYmUgbmVnYXRpdmUgaW4gdGhpcyBmb3JtYXQuIFRoaXMgZml4ZXMgaXNzdWVzIHdoZXJlIHRoZQorCSAgcnVubmluZyB0aW1lIG9mIHRoZSBmaXJzdCBidWZmZXIgaXNuJ3QgYXQgdGhlIHN0YXJ0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDU3NQorCisyMDE1LTA0LTAzIDIwOjM0OjQyIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBIYW5kbGUgRFRTIHdpdGggbmVnYXRpdmUgcnVubmluZyB0aW1lCisJICBBcyBRVCB3b3JrcyB3aXRoIGR1cmF0aW9uLCBzaW1wbHkgYnJpbmcgYmFjayBmaXJzdCBEVFMgdG8gMCBhbmQgc2hpZnQKKwkgIGZvcndhcmQgdGhlIFBUUyBvZiB0aGUgc2FtZSBhbW91bnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwNTc1CisKKzIwMTUtMDYtMTAgMTg6MTU6NTIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4Lmg6CisJICBmbHZtdXg6IEFkZCBuZWdhdGl2ZSBydW50aW1lIERUUyBzdXBwb3J0CisJICBUaGlzIGlzIGRvbmUgYnkgdXNpbmcgbmV3IGZlYXR1cmUgb2YgdGhlIENvbGxlY3RQYWQgY2xpcCBmdW5jdGlvbgorCSAgd2hpY2ggc2V0cyB0aGUgRFRTIGFzIGEgZ2ludDY0IGluIHRoZSBjb2xsZWN0ZWQgZGF0YS4gSXQgYWxzbyBzaW1wbGlmeQorCSAgdGhlIGNvZGUgYSBiaXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwNTc1CisKKzIwMTUtMDYtMTIgMjM6MDY6MjQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBSZW5hbWUgc29tZSB2YXJpYWJsZXMgYW5kIGRlYnVnIG91dHB1dCB0byBtYWtlIG1vcmUgc2Vuc2UKKwkgIExvY2FsIGFuZCByZW1vdGUgd2VyZSBtaXhlZCB1cCBpbiBhIGZldyBwbGFjZXMsIGFuZCB0aGUgdGltZSB3ZSBzdG9yZSBoZXJlIGlzCisJICBub3QgVU5JWCB0aW1lICgxOTcwIGVwb2NoKSwgYnV0IE5UUCB0aW1lICgxOTAwIGVwb2NoKSBpbiBuYW5vc2Vjb25kcy4KKworMjAxNS0wNi0xMiAxOToyMToxMCArMDMwMCAgSWx5YSBLb25zdGFudGlub3YgPGlseWEua29uc3RhbnRpbm92QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb3JlbW90ZWlvLmM6CisJICBvc3hhdWRpbzogZml4IGxhdGVuY3kgcHJvcGVydHkgcXVlcnkgb24gUmVtb3RlSU8KKwkgIEF1ZGlvVW5pdEdldFByb3BlcnR5IHdvdWxkIGZhaWwgd2l0aCBrUGFyYW1FcnIgKC01MCkgZXZlcnkgdGltZSwKKwkgIHNpbXBseSBiZWNhdXNlIHNpemUgd2Fzbid0IGluaXRpYWxpemVkLgorCSAgTm93IGl0IHJldHVybnMgemVybyBsYXRlbmN5LCBidXQgYXQgbGVhc3QgaXQgZG9lc24ndCBmYWlsLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MDg2OAorCisyMDE1LTA0LTA3IDE0OjA2OjE2ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxnaXRAYXJ1bnJhZ2hhdmFuLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogRml4IG1hcHBpbmcgb2YgbGF0ZW5jeSBwYXJhbWV0ZXJzIHRvIGJ1ZmZlciBhdHRyaWJ1dGVzCisKKzIwMTUtMDYtMTIgMDE6NTY6MzcgKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thLWRlbXV4OiBBY3R1YWxseSBzZXQgZGV0ZWN0ZWQgM0QgaW5mbyBpbnRvIG91dHB1dCBjYXBzLgorCSAgVXNlIHRoZSBpbmZvcm1hdGlvbiByZWFkIGZyb20gdGhlIFN0ZXJlb01vZGUgaW5mbworCSAgdG8gY29uZmlndXJlIG11bHRpdmlldy1tb2RlIGFuZCBtdWx0aXZpZXctZmxhZ3MgaW4gdGhlCisJICB2aWRlbyBjYXBzLgorCisyMDE1LTA2LTExIDEzOjM2OjU0ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oOgorCSAgc3BsaXRtdXhzaW5rOiBUYWtlIHJlbGVhc2VkLWJ1dC1ub3QteWV0LW91dHB1dCBieXRlcyBpbnRvIGFjY291bnQKKwkgIFdoZW4gZGVjaWRpbmcgd2hldGhlciBpdCdzIHRpbWUgdG8gc3dpdGNoIHRvIGEgbmV3IGZpbGUsIHRha2UgaW50bworCSAgYWNjb3VudCBkYXRhIHRoYXQncyBiZWVuIHJlbGVhc2VkIGZvciBwdXNoaW5nLCBidXQgaGFzbid0IHlldAorCSAgYmVlbiBwdXNoZWQgLSBiZWNhdXNlIGRvd25zdHJlYW0gaXMgc2xvdyBvciB0aGUgdGhyZWFkcyBoYXZlbid0IGJlZW4KKwkgIHNjaGVkdWxlZC4KKwkgIEZpeGVzIGEgcmFjZSBpbiB0aGUgdW5pdCB0ZXN0IGFuZCBwcm9iYWJseSBpbiBwcmFjdGljZSAtIHNvbWV0aW1lcworCSAgZmFpbGluZyB0byBzd2l0Y2ggd2hlbiBpdCBzaG91bGQgZm9yIGFuIGV4dHJhIEdPUCBvciB0d28uCisJICBBbHNvIGZpeCBhIHByb2JsZW0gaW4gc3BsaXRtdXhzcmMgd2hlcmUgcGxheWJhY2sgc29tZXRpbWVzCisJICBzdGFsbHMgYXQgc3RhcnR1cCBpZiB0eXBlcyBhcmUgZm91bmQgdG9vIHF1aWNrbHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUwNzQ3CisKKzIwMTUtMDYtMTEgMDE6MDQ6NTEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSAgYXRvbXM6IHJlbW92ZSBjdXN0b20gZ3N0X2J1ZmZlcl9uZXcgZnVuY3Rpb24gaW4gZmF2b3Igb2YgY29yZSB2ZXJzaW9uCisJICBSZW1vdmUgYSBjdXN0b20gc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBnc3RfYnVmZmVyX25ld193cmFwcGVkIGJ5CisJICB1c2luZyBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgaW5zaWRlIGEgbWFjcm8gdG8gc2ltcGxpZnkKKwkgIHBhcmFtZXRlcnMgYW5kIGdpdmUgaXQgYSBtb3JlIG1lYW5pbmdmdWwgbmFtZS4KKwkgIEl0IGlzIG9ubHkgdXNlZCB0byBjcmVhdGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgdG8gaGF2ZSBpdHMgZGF0YSBjb3BpZWQuCisKKzIwMTUtMDYtMTEgMDA6MTQ6NDEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSAgYXRvbXM6IHNpbXBsaWZ5IGZyZWUgZm9ybSBkYXRhIGF0b21zIGNyZWF0aW9uCisJICBBdm9pZCBjcmVhdGluZyBhbiBpbnRlcm1lZGlhcnkgYnVmZmVyIG9yIG1lbW9yeSBhcmVhIGp1c3QKKwkgIHRvIGNvcHkgaW50byBhbiBhdG9tJ3MgZGF0YSBhcmVhLgorCisyMDE1LTA2LTEwIDIyOjI3OjI3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvYXRvbXMuaDoKKwkqIGdzdC9pc29tcDQvZm91cmNjLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4Lmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogYWRkIEFDLTMgbXV4aW5nIHN1cHBvcnQKKwkgIEFkZHMgQUMtMyBtdXhpbmcgc3VwcG9ydC4gSXQgaXMgZGVmaW5lZCBmb3IgbXA0IGFuZCAzZ3AgZm9ybWF0cy4KKwkgIE9uZSBleHRyYSBmZWF0dXJlIHRoYXQgd2FzIGFkZGVkIHdhcyB0aGUgYWJpbGl0eSB0byBhZGQgZXh0ZW5zaW9uCisJICBhdG9tcyBhZnRlciBzZXRfY2FwcyBhcyB0aGUgQUMtMyBleHRlbnNpb24gYXRvbSBuZWVkcyBzb21lIGRhdGEKKwkgIHRoYXQgaGFzIHRvIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBzdHJlYW0gaXRzZWxmIGFuZCBpcyBub3QKKwkgIHByZXNlbnQgb24gY2Fwcy4KKworMjAxNS0wNi0xMCAyMjozNjo1OSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJICBxdG11eDogcmVtb3ZlIHVudXNlZCB0eXBlIE1QNFMKKworMjAxNS0wNi0xMCAyMjoyOTowMSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogcmVtb3ZlIGR1cGxpY2F0ZSBhdHRyaWJ1dGUgdmFsdWUgc2V0CisJICBJdCBpcyBhbHNvIHNldCBhIGZldyBsaW5lcyBiZWxvdworCisyMDE1LTA2LTExIDAwOjIyOjU0ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYTogSW1wbGVtZW50IGJhc2ljIHN0ZXJlb3Njb3BpYyB2aWRlbyBzdXBwb3J0CisJICBJbXBsZW1lbnQgc3VwcG9ydCBmb3IgdGhlIHBhY2tlZCB2aWRlbyBmb3JtYXRzIFdlYk0KKwkgIHVzZXMsIG5vdCBhbGwgdGhlIHZhbHVlcyB0aGF0IE1hdHJvc2thIG1pZ2h0IHVzZS4KKwkgIEluIHByYWN0aWNlLCBpdCdzIHJlYWxseSBoYXJkIHRvIGZpbmQgYW55IHNhbXBsZXMgaW4gdGhlCisJICB3aWxkIG9mIGFueS4KKwkgIFN1cHBvcnRlZCBpbiBib3RoIHRoZSBtdXhlciBhbmQgZGVtdXhlci4KKworMjAxNS0wNi0xMCAwMToyNjoxNSArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZm91cmNjLmg6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmM6CisJICBxdGRlbXV4OiBBZGQgYmFzaWMgc3VwcG9ydCBmb3IgTVBFRy1BIHN0ZXJlb3Njb3BpYyB2aWRlbworCSAgVGhlIE1QRUctQSBmb3JtYXQgcHJvdmlkZXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBJU08gYmFzZSBtZWRpYQorCSAgZmlsZSBmb3JtYXQgdG8gc3RvcmUgc3RlcmVvc2NvcGljIGNvbnRlbnQgZW5jb2RlZCB3aXRoIGRpZmZlcmVudAorCSAgY29kZWNzIGxpa2UgSC4yNjQgYW5kIE1QRUctNDoyLiBUaGUgc3RlcmVvIHZpZGVvIG1lZGlhIGluZm9ybWF0aW9uKHN2bWkpCisJICBhdG9tIGRlY2xhcmVzIHRoZSBwcmVzZW5jZSBhbmQgc3RvcmFnZSBtZXRob2QgZm9yIHRoZSB2aWRlby4KKwkgIFN0ZXJlbyB2aWRlbyBpbmZvcm1hdGlvbiBmb3IgTVBFRy1BIGNhbiBhbHNvIGJlIHN1cHBsaWVkIHRocm91Z2gKKwkgIHRoZSAnc3R2aScgYXRvbSAocmVmOiBJU08vSUVDXzE0NDk2LTEyLCBJU08vSUVDXzIzMDAwLTExKSwgd2hpY2gKKwkgIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHBhdGNoLgorCSAgQWxzbyBtaXNzaW5nIGlzIHN1cHBvcnQgZm9yIHN0ZXJlbyB2aWRlbyBlbmNvZGVkIGFzIHNlcGFyYXRlIHZpZGVvIHRyYWNrcworCSAgZm9yIG5vdy4KKwkgIEJhc2VkIG9uIGEgcGF0Y2ggYnkgU3JlZXJlbmogQmFsYWNoYW5kcmFuIDxzcmVlcmVuai5iYWxhY2hhbmRyYW5AaW50ZWwuY29tPgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxMTE1NworCisyMDE1LTA2LTAyIDE2OjE1OjM1IC0wNDAwICBYYXZpZXIgQ2xhZXNzZW5zIDx4YXZpZXIuY2xhZXNzZW5zQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IEFkZCB0bHMtZGF0YWJhc2UgcHJvcGVydHkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTAyOTgKKworMjAxNS0wNi0xMCAxNDozMzo1MCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cDogVXNlIEdTVF9CVUZGRVJfUFRTKCkgaW5zdGVhZCBvZiBHU1RfQlVGRkVSX1RJTUVTVEFNUCgpCisJICBUaGUgbWl4IGJldHdlZW4gYWxsIHRoZXNlIGluIHRoZSBSVFAgY29kZSBpcyBjb25mdXNpbmcsIGxldCdzIHRyeSB0byBiZQorCSAgY29uc2lzdGVudC4KKworMjAxNS0wNi0xMCAxNDo0OTo1MCArMDMwMCAgSWx5YSBLb25zdGFudGlub3YgPGlseWEua29uc3RhbnRpbm92QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBtYW5hZ2VyOiBjbGFyaWZ5IG5lZ2F0aXZlIGxvc3QgcGFja2V0cyBpbiBzdGF0cworCSAgQWxzbzoKKwkgIC0gTW92ZSBub3RlcyBvbiB1bml0cyBiZWZvcmUgZmllbGQgZG9jdW1lbnRhdGlvbi4KKwkgIC0gVW5pZnkgZG9jdW1lbnRhdGlvbiBzdHlsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTA2NTMKKworMjAxNS0wNi0xMCAwNjozODozOSAtMDQwMCAgWGF2aWVyIENsYWVzc2VucyA8eGF2aWVyLmNsYWVzc2Vuc0Bjb2xsYWJvcmEuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IGZpeCBnZXR0ZXIgb2YgInNzbC11c2Utc3lzdGVtLWNhLWZpbGUiCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUwMjk4CisKKzIwMTUtMDYtMTAgMDk6NDk6NDcgKzA5MDAgIFZpbmVldGggVE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IHJldmVyc2UgcGxheWJhY2sKKwkgIFdoZW4gcGVyZm9ybWluZyBzZWVrLCBzZWdtZW50LT5zdGFydCBpcyBiZWluZyB1cGRhdGVkIHdpdGggZGVzaXJlZF9vZmZzZXQsCisJICBidXQgaW4gY2FzZSBvZiByZXZlcnNlIHBsYXliYWNrIHNlZ21lbnQtPnN0YXJ0IHNob3VsZCBiZSAwIGFuZAorCSAgc2VnbWVudC0+c3RvcCBzaG91bGQgYmUgdXBkYXRlZCB3aXRoIGRlc2lyZWQgb2Zmc2V0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc1MDY3NQorCisyMDE1LTAxLTIxIDE4OjA5OjAzICswMTAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgZ3N0djRsMmJ1ZmZlcnBvb2w6IGhhbmRsZSAtRVBJUEUgZnJvbSBEUUJVRiB0byBzaWduYWwgRU9TCisJICBUaGUgVjRMMiBkZWNvZGVyIHNpZ25hbHMgRU9TIGJ5IHJldHVybmluZyAtRVBJUEUgZnJvbSBEUUJVRiBhZnRlciB0aGUKKwkgIGxhc3QgYnVmZmVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MzMzOAorCisyMDE1LTA2LTA2IDIxOjA5OjE5IC0wNDAwICBYYXZpZXIgQ2xhZXNzZW5zIDx4YXZpZXIuY2xhZXNzZW5zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IEFkZCBhIEdUbHNJbnRlcmFjdGlvbiBwcm9wZXJ0eQorCSAgSXQgY2FuIGJlIHVzZWQgZm9yIFRMUyBjbGllbnQgYXV0aGVudGljYXRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUwNDcxCisKKzIwMTUtMDEtMDkgMTE6MzY6MTEgKzAxMDAgIEVucmljbyBKb3JucyA8ZWpvQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJICB2NGwyOiBBbGxvdyBzY2FsaW5nIGluIHRoZSB2NGwyKmNvbnZlcnQgZWxlbWVudAorCSAgVGhpcyBpcyBpbnNwaXJlZCBvZiB2aWRlb3NjYWxlIGFuZCB2aWRlb2NvbnZlcnQgZWxlbWVudHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQyOTE3CisKKzIwMTUtMDYtMDkgMTk6MDI6NTUgKzAzMDAgIElseWEgS29uc3RhbnRpbm92IDxpbHlhLmtvbnN0YW50aW5vdkBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIHJ0cG1hbmFnZXI6IGRvY3VtZW50IHVuaXRzIG9mIHN0YXRzIGFuZCBhcmd1bWVudHMKKwkgIEFsc28sIG1pbm9yIHNwZWxsaW5nIGFuZCBzdHlsZSBjb3JyZWN0aW9ucy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTA2NTMKKworMjAxNS0wNi0wOSAxNDo0MjoyNyArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogTWFrZWZpbGUuYW06CisJICBjcnVmdDogYWRkIHRoZSBvYnNvbGV0ZSB0bXBsIGRpciB0byBjcnVmdC1kaXJzCisKKzIwMTUtMDYtMDkgMTE6MzA6MjIgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBkOWEzMzUzIHRvIDYwMTVkMjYKKworMjAxNS0wNi0wOSAwNzowNDowNyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogY29tbW9uOgorCSAgRml4IGNvbW1vbiB2ZXJzaW9uCisJICBXYXMgYWNjaWRlbnRseSBkb3duZ3JhZGVkIGJ5IDg3YTQ4ODRhY2Q4NjU1YTY1OTFkNzM1YTFkOTQ0ZWNiNWVhM2RlMTYKKworMjAxNS0wNi0wOCAxOToxMTo0MSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBBbHNvIHNldCBjb2xvcmltZXRyeSBvbiBvdXRwdXQgZGV2aWNlcworCSAgVGhpcyBjb21wbGV0ZXMgdGhlIGNvZGUgdGhhdCBzZXQgdGhlIGNvbG9yaW1ldHJ5IG9uIG91dHB1dAorCSAgZGV2aWNlLgorCisyMDE1LTA2LTA4IDE5OjEwOjM0IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGNvbW1vbjoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IEFkZCBtaXNzaW5nIFNNVFAyNDBNIG1hdHJpeAorCSAgVGhpcyBpcyBtaXNzaW5nIGluIHRoZSBkb2MsIGJ1dCB3YXMgaW4gdGhlIGhlYWRlci4KKworMjAxNS0wNi0wOCAyMzowMDoxNiArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L2dvb20vZ29vbV9jb3JlLmM6CisJICBnb29tOiBwb3NzaWJsZSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyB3YXJuaW5nCisJICBCdWlsZCBmYWlscyB3aXRoIHRoZSBsYXRlc3Qgc25hcHNob3Qgb2YgZ2NjLTQuOSBiZWNhdXNlIHBhcmFtMSBhbmQgcGFyYW0yIG1pZ2h0CisJICBwb3NzaWJseSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQuIFRoZXkgYXJlIHNldCBkZXBlbmRpbmcgb24gdGhlIGNhc2VzIG9mIGEgc3dpdGNoCisJICBzdGF0ZW1lbnQgYW5kIHRoZSBjb21waWxlciBzZWVzIHRoaXMgYXMgbm90IGEgY29tcGxldGUgZ3VhcmFudGVlLgorCSAgU2V0IHRoZW0gdG8gMCBpZiB0aGUgc3dpdGNoIHN0YXRlbWVudCBmYWxscyBkb3duIHRvIHRoZSBkZWZhdWx0IGNhc2UuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUwNTY2I2M2CisKKzIwMTUtMDYtMDggMTc6MjQ6MzggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRnVsbHkgaW1wbGVtZW50IGNvbG9yaW1ldHJ5IHN1cHBvcnQKKwkgIFRoaXMgZml4ZXMgd3JvbmcgbWFwcGluZyBmb3Igc1JHQiBhcyBpbiBHU3RyZWFtZXIgc1JHQiBjb3JyZWN0bHkKKwkgIGFwcGx5IHRvIFJHQiBmb3JtYXRzLCB3aGlsZSBpbiBWNEwyIGl0J3MgYW4gYWxpYXMgZm9yIHNZQ0MuIEFsc28KKwkgIGFkZCBzdXBwb3J0IGZvciB0aGUgbmV3IHF1YW50aXphdGlvbiAocmFuZ2UpLCB5Y2Jjcl9lbmNvZGluZyAobWF0cml4KQorCSAgYW5kIHhmZXJfZnVuYyAodHJhbnNmZXIpIGVudW1lcmF0aW9uLgorCisyMDE1LTA2LTA4IDE3OjAxOjE1IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2V4dC90eXBlcy1jb21wYXQuaDoKKwkqIHN5cy92NGwyL2V4dC92NGwyLWNvbW1vbi5oOgorCSogc3lzL3Y0bDIvZXh0L3Y0bDItY29udHJvbHMuaDoKKwkqIHN5cy92NGwyL2V4dC92aWRlb2RldjIuaDoKKwkgIHY0bDI6IFVwZGF0ZSBrZXJuZWwgaGVhZGVycyB0byBsYXRlc3QgZnJvbSBtZWRpYSB0cmVlCisJICBUaGlzIGlzIHRoZSBsYXRlc3QgZnJvbSBtZWRpYSB0cmVlLiBUaGlzIHNob3VsZCBlbmFibGUgbW9yZSBkZXZlbG9wbWVudAorCSAgb2YgdGhlIHY0bDIgZWxlbWVudHMuIFRoaXMgaW5jbHVkZXMgbmV3IGZsYWdzIHJlcXVpcmVzIHRvIGZpeCBkcmFpbmluZworCSAgcGF0aCBpbiBkZWNvZGVyLCBjb2xvcmltZXRyeSBhbmQgbXVjaCBtb3JlLgorCisyMDE1LTA2LTA4IDIzOjA3OjU1ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZDM3YWYzMiB0byBkOWEzMzUzCisKKzIwMTUtMDYtMDggMTk6NDI6MzAgKzAxMDAgIENocmlzIENsYXl0b24gPGNocmlzMjU1M0Bnb29nbGVtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkgIHJ0cHZwOGRlcGF5OiBwb3RlbnRpYWwgYWNjZXNzIGJleW9uZCBlbmQgb2YgYXJyYXkKKwkgIENvbXBpbGluZyAod2l0aCBnY2MtNC45LTIwMTUwNjAzKSBwcm9kdWNlcyBhbiBlcnJvciBiZWNhdXNlIG9mIGFuIGFjY2VzcyBiZXlvbmQKKwkgIHRoZSBlbmQgb2YgYW4gYXJyYXkuIFRoaXMgcGF0Y2ggZml4ZXMgdGhlIGVycm9yIGJ5IGluaXRpYWxpemluZyB0aGUgbG9vcAorCSAgY29udHJvbC9hcnJheSBpbmRleCB2YXJpYWJsZSAoaSkgdG8gMSBhbmQgcmV0dXJuaW5nIGkgLSAxIHdoZW4gYSBtYXRjaCBpcyBmb3VuZC4KKwkgIEFsc28sIGJlY2F1c2UgdGhlIHZhbHVlcyBzdG9yZWQgaW4gdGhlIGFycmF5IGluY3JlYXNlIGluIHZhbHVlIGFzIHRoZSBpbmRleAorCSAgaW5jcmVhc2VzLCB0aGUgPj0gdGVzdCB1bm5lY2Vzc2FyeSwgc28gaXQgaXMgcmVtb3ZlZC4KKworMjAxNS0wNC0zMCAwMjo1Mjo1OCArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IERvbid0IGFjY3VtdWxhdGUgbW9yZSB0aGFuIDIgR09QcworCSAgRG9uJ3QgYWxsb3cgbGFyZ2UgYW1vdW50cyBvZiBkYXRhIHRvIHF1ZXVlIHVwIC0gd2Ugb25seSBuZWVkCisJICB0aGUgR09QIHdlJ3JlIHdyaXRpbmcsIGFuZCB0aGUgR09QIHdlJ3JlIGFjY3VtdWxhdGluZy4KKworMjAxNS0wNC0xNiAxMDo0NDo0OSArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIGlzb21wNDogZnN5bmMgYWZ0ZXIgc2VuZGluZyB1cGRhdGVzIGluIHJvYnVzdCBtb2RlCisJICBVc2UgdGhlIG5ldyBHc3RCdWZmZXIgU1lOQ19BRlRFUiBmbGFnIHRvIHRyaWdnZXIgYW4gZnN5bmMKKwkgIGFmdGVyIHVwZGF0aW5nIHRoZSBtb292IG9yIG1kYXQgYXRvbSwgYW5kIGFmdGVyIHVwZGF0aW5nIHRoZSBmcmVlCisJICBhdG9tIHRvIG1ha2UgaXQgdmlzaWJsZS4KKworMjAxNS0wNC0wMyAwMDo1NzoyMCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIGlzb21wNDogT25seSBzZXQgbW9vdiBoZWFkZXIgaW50byBzdHJlYW1oZWFkZXIgYXQgRU9TCisJICBPbmx5IHVwZGF0ZSB0aGUgbW9vdiBoZWFkZXIgaW50byB0aGUgY2FwcyBpZiBpdCdzIHRoZSBmaW5hbGlzZWQKKwkgIG1vb3YgYXQgRU9TIHRpbWUuIEF2b2lkcyBwb3N0aW5nIGEgYm9ndXMgbW9vdiBhdCBzdGFydHVwIGFuZAorCSAgcmVwZWF0ZWQgdXBkYXRlcyBpbiByb2J1c3QtcmVjb3JkaW5nIG1vZGUKKworMjAxNS0wNC0wMyAwMTo0NDoxNSArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJICB0ZXN0czogVXBkYXRlIG1wNCBtdXggdGVzdCBmb3IgbWRhdCBwbGFjZWhvbGRlciBjaGFuZ2UKKwkgIFRoZSBtcDQgbXV4ZXIgbm93IHdyaXRlcyBhIHBsYWNlLWhvbGRlciBtZGF0IGFzIGEgZnJlZQorCSAgYXRvbSBmb2xsb3dlZCBieSBhIDAtYnl0ZSBtZGF0IHRoYXQgY292ZXJzIHRoZSByZXN0IG9mIHRoZQorCSAgZmlsZSwgbWFraW5nIGl0IHBvc3NpYmxlIHRvIHJld3JpdGUgaXQgYXMgNjQtYml0LCBvciBsZWF2ZQorCSAgaXQgYXMtaXMgaWYgbm90aGluZyBlbHNlIGlzIHdyaXR0ZW4gYWZ0ZXJ3YXJkCisKKzIwMTUtMDQtMDEgMTE6MTU6MzggKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2F0b21zcmVjb3ZlcnkuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIGlzb21wNDogSW1wbGVtZW50IHJvYnVzdCBtdXhpbmcgdXNpbmcgcGluZy1wb25nIHN0cmF0ZWd5CisJICBJbXBsZW1lbnQgYSByb2J1c3QgcmVjb3JkaW5nIG1vZGUsIHdoZXJlIHRoZSBvdXRwdXQKKwkgIGZpbGUgaXMgYWx3YXlzIGluIGEgcGxheWFibGUgc3RhdGUsIHNlZWtpbmcgYW5kIHJld3JpdGluZworCSAgdGhlIG1vb3YgaGVhZGVyIGF0IGEgY29uZmlndXJhYmxlIGludGVydmFsLiBSZXdyaXRpbmcKKwkgIG1vb3YgaXMgZG9uZSB1c2luZyByZXNlcnZlZCBzcGFjZSBhdCB0aGUgc3RhcnQgb2YKKwkgIHRoZSBmaWxlLCBhbmQgYSBwaW5nLXBvbmcgc3RyYXRlZ3kgd2hlcmUgdGhlIG1vb3YKKwkgIGlzIHJlcGxhY2VkIGF0b21pY2FsbHkgc28gaXQncyBuZXZlciBpbnZhbGlkLgorCSAgVHJhY2sgd2hlbiB0YWdzIGhhdmUgYWN0dWFsbHkgY2hhbmdlZCwgYW5kIGRvbid0IHdyaXRlIHRoZW0gaW50bworCSAgdGhlIG1vb3YgdW5sZXNzIHRoZXkndmUgY2hhbmdlZC4gQ2xlYXIgYW55IGV4aXN0aW5nIHRhZ3Mgd2hlbgorCSAgcmUtd3JpdGluZyB0aGVtLCBzbyB3ZSBjYW4gZG8gcHJvZ3Jlc3NpdmUgbW9vdiB1cGRhdGluZyBpbiByb2J1c3QKKwkgIHJlY29yZGluZyBtb2RlLgorCSAgV3JpdGUgcGxhY2Vob2xkZXIgbWRhdCBhcyBhIGZyZWUgYXRvbSBwbHVzIGEgMzItYml0IG1kYXQKKwkgIHdpdGggJzAnIHNpemUsIHdoaWNoIG1lYW5zICJyZXN0IG9mIHRoZSBmaWxlIiBpbiB0aGUgc3BlYy4KKwkgIFJlLXdyaXRlIGl0IGxhdGVyIHRvIGEgZnVsbCA2NC1iaXQgZXh0ZW5kZWQgc2l6ZSBhdG9tIGlmIG5lZWRlZC4KKworMjAxNS0wNC0wMSAwMDo1ODo1MiArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvYXRvbXMuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIGlzb21wNDogVXBkYXRlIGVkaXQgbGlzdCB3aGVuIHJlLXdyaXRpbmcgbW9vdgorCSAgQ29ycmVjdGx5IHVwZGF0ZSBhbnkgZWRpdCBsaXN0cyBlYWNoIHRpbWUgdGhlIG1vb3YgaXMgcmVjYWxjdWxhdGVkLAorCSAgdXBkYXRpbmcgZXhpc3RpbmcgdGFibGUgZW50cmllcyBpZiB0aGV5IGFscmVhZHkgZXhpc3QgaW5zdGVhZCBvZiBqdXN0CisJICBhZGRpbmcgbmV3IG9uZXMuCisKKzIwMTUtMDQtMDggMDE6NDE6MTggKzEwMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBpc29tcDQ6IFJlbW92ZSBhbiBleHRyYSBicmFja2V0IGluIGEgY29tbWVudC4KKworMjAxNS0wMy0xOSAyMDoyOTo0NCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkgIHNwbGl0bXV4c3JjOiBQcm90ZWN0IHRvdGFsX2R1cmF0aW9uIHN0YXRlIHZhcmlhYmxlIHdpdGggdGhlIG9iamVjdCBsb2NrLgorCSAgUHJldmVudCBkZWFkbG9ja3MgZnJvbSBkb3duc3RyZWFtIHF1ZXJ5aW5nIGR1cmF0aW9uIGZyb20gdGhlIHN0cmVhbWluZyB0aHJlYWQuCisKKzIwMTUtMDYtMDcgMjM6MDY6MjAgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSAyMWJhMmU1IHRvIGQzN2FmMzIKKworMjAxNS0wNi0wNyAxOToyNDoyMCArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L2dvb20vZ3N0YXVkaW92aXN1YWxpemVyLmM6CisJICBnb29tOiBjbGVhbiBkZXJlZmVyZW5jZXMgb2YgcHJpdmF0ZSBzdHJ1Y3R1cmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDI4NzUKKworMjAxNS0wNi0wNyAxOToyMDowNCArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L2dvb20yazEvZ3N0YXVkaW92aXN1YWxpemVyLmM6CisJICBnb29tMmsxOiBjbGVhbiBkZXJlZmVyZW5jZXMgb2YgcHJpdmF0ZSBzdHJ1Y3R1cmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDI4NzUKKworMjAxNS0wNi0wNyAxNzozMjowMSArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGM0MDg1ODMgdG8gMjFiYTJlNQorCisyMDE1LTA2LTA3IDE3OjAxOjM3ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICBkb2NzOiByZW1vdmUgdmFyaWFibGVzIHRoYXQgd2UgZGVmaW5lIGluIHRoZSBzbmlwcGV0IGZyb20gY29tbW9uCisJICBUaGlzIGlzIHN5bmNpbmcgb3VyIE1ha2VmaWxlLmFtIHdpdGggdXBzdHJlYW0gZ3RrZG9jLgorCisyMDE1LTA2LTA3IDE3OjE2OjE5ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBhdXRvZ2VuLnNoOgorCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGQ2NzY5OTMgdG8gYzQwODU4MworCisyMDE1LTA2LTA3IDE2OjQ0OjM3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDEuNS4xID09PQorCisyMDE1LTA2LTA3IDEwOjQ2OjM0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0LmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyb3JjLWRpc3QuYzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS41LjEKKworMjAxNS0wNi0wNyAxMDozODoyOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNS0wNi0wNyAxMDozMjozOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogT3ZlcnJpZGUgdGhlIFNTUkMgZnJvbSB0aGUgcGFja2V0cycgU1NSQyBpZiBub25lIHdhcyBnaXZlbiB2aWEgY2FwcyBvciBwcm9wZXJ0eQorCisyMDE1LTA2LTA3IDA5OjM1OjM4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgcG86IFVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxNS0wNi0wNSAxNTozMjoxMCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IERvbid0IHdhcm4gd2hlbiBvcHRpb25hbCBDSUQgYXJlIG5vdCBpbXBsZW1lbnQKKwkgIGdzdF92NGwyX2dldF9hdHRyaWJ1dHJlKCkgc2hhbGwgb25seSBiZSB1c2VkIHdoZW4gdGhlIENJRCBpcyBleHBlY3RlZAorCSAgdG8gYmUgc3VwcG9ydGVkLiBPdGhlcndpc2UsIHdlIGdldCB1bndhbnRlZCB3YXJuaW5nIHBvc3RlZCB0byB0aGUgYnVzLgorCisyMDE1LTA2LTA1IDE2OjQzOjA4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBzZXNzaW9uOiBPbmx5IHN1Z2dlc3Qgb3VyIGludGVybmFsIHNzcmMgaWYgaXQncyBub3QgYSByYW5kb20gb25lIGFuZCB3YXMgc2VsZWN0ZWQgYXMgaW50ZXJuYWwgc3NyYworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0OTU4MQorCisyMDE1LTA2LTA0IDE0OjE4OjAxICswOTAwICBWaW5lZXRoIFRNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJICBpbnRlcmxlYXZlOiBlcnJvciB3aGVuIGNoYW5uZWwtcG9zaXRpb25zLWZyb20taW5wdXQ9RmFsc2UKKwkgIHNlbGYtPmNoYW5uZWxzIGlzIGJlaW5nIGluY3JlbWVudGVkIG9ubHkgd2hlbgorCSAgY2hhbm5lbC1wb3NpdGlvbnMtZnJvbS1pbnB1dCBpcyBzZXQgYXMgVFJVRS4gU28gaW4gY2FzZSBvZiBGQUxTRQorCSAgc2VsZi0+ZnVuYyBpcyBub3Qgc2V0IGFuZCBoZW5jZSBjcmVhdGluZyBhc3NlcnRpb24gZXJyb3IuCisJICBIZW5jZSByZW1vdmluZyB0aGUgY29uZGl0aW9uIHRvIGluY3JlbWVudCBzZWxmLT5jaGFubmVscy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDQyMTEKKworMjAxNS0wNi0wNSAxMDozMzoxMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IEFkZCBzdXBwb3J0IGZvciByZWNlaXZpbmcgcmVkdWNlZCBzaXplIFJUQ1AKKwkgIEl0IHdvcmtlZCBiZWZvcmUgYnV0IGdhdmUgd2FybmluZ3MsIG5vdyB3ZSBqdXN0IGlnbm9yZSBSVENQCisJICBwYWNrZXRzIHRoYXQgZG9uJ3Qgc3RhcnQgd2l0aCBhIFNSLiBBcyBhbGwgd2UncmUgaW50ZXJlc3RlZAorCSAgaW4gaGVyZSBhcmUgU1JzLgorCisyMDE1LTA2LTAzIDEyOjIyOjQyICswMjAwICBKb3NlIEFudG9uaW8gU2FudG9zIENhZGVuYXMgPHNhbnRvc2NhZGVuYXNAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cHNzcmNkZW11eDogQWRkIHN1cHBvcnQgZm9yIHJlZHVjZSBzaXplIHJ0Y3AKKwkgIEFjY29yZGluZyB0byBSRkMgNTUwNiwgcmVkdWNlIHNpemUgcGFja2FnZXMgY2FuIGJlIHNlbnQsIHRoaXMKKwkgIHBhY2thZ2VzIG1heSBub3QgYmUgY29tcG91bmQsIHNvIHdlIG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yCisJICBnZXR0aW5nIHNzcmMgZnJvbSBvdGhlciB0eXBlcyBvZiBwYWNrYWdlcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTAzMjcKKworMjAxNS0wNi0wMyAxMzoxNDo0NCArMDIwMCAgSm9zZSBBbnRvbmlvIFNhbnRvcyBDYWRlbmFzIDxzYW50b3NjYWRlbmFzQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogQWRkIHN1cHBvcnQgZm9yIHJlY2VpdmluZyByZWR1Y2VkIHNpemUgcnRjcAorCSAgU2VlIFJGQyA1NTA2CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUwMzMyCisKKzIwMTUtMDYtMDQgMTY6MDk6NDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBBZGQgc3VwcG9ydCBmb3IgY2hhbm5lbCBjb25maWd1cmF0aW9ucyAxMSwgMTIgYW5kIDE0IGFuZCA3IGFjdHVhbGx5IGhhcyA4IGNoYW5uZWxzCisJICBJU08vSUVDIDE0NDk2LTM6MjAwOS9QREFNIDQgYWRkZWQgMTEsIDEyIGFuZCAxNC4KKworMjAxNS0wNi0wMyAwODo1Nzo1NyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmM6CisJICBhc3Rlcmlza2gyNjM6IFVuLXJhbmsgY2xhc2hpbmcgZGVwYXlsb2FkZXIKKwkgIFRoaXMgZGVwYXlsb2FkZXIgY2xhc2ggd2l0aCB0aGUgc3RhbmRhcmQgb25lIGZvciBIMjYzcC4gSXQgcHJvZHVjZXMgYW4KKwkgIEgyNjNwIHN0cmVhbSB3aXRoIGEgbW9kaWZpZWQgaGVhZGVyLiBJdCB1c2VzIGVuY29kaW5nLW5hbWUgdGhhdCBpcyB0aGUKKwkgIHNhbWUgYXMgSDI2M3AgKEgyNjMtMTk5OCkgdGhvdWdoIHRoZSByZXN1bHRpbmcgRVMgaXMgbm90IGRlY29kYWJsZSBvcgorCSAgcGFyc2FibGUgaW4gR1N0cmVhbWVyLCBtYWtpbmcgaXQgdW5zdWFibGUgaW4gZHluYW1pYyBwaXBlbGluZS4gVGhpcworCSAgcGF0Y2ggdW5yYW5rIHRoaXMgc3BlY2lhbGl6ZWQgZGVwYXlsb2FkZXIgc2luY2UgaXQgY2FuIG9ubHkgYmUgdXNlZCBpbgorCSAgY3VzdG9tIHBpcGVsaW5lLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczOTkzNQorCisyMDE1LTA2LTAyIDE4OjA5OjQ4ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmg6CisJICBnb29tMmsxOiByZW1vdmUgdmFyaWFibGVzIG5vdCBuZWVkZWQgYW55bW9yZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0Mjg3NQorCisyMDE1LTA2LTAyIDE3OjUyOjQ2ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvZ29vbTJrMS9NYWtlZmlsZS5hbToKKwkqIGdzdC9nb29tMmsxL2dzdGF1ZGlvdmlzdWFsaXplci5jOgorCSogZ3N0L2dvb20yazEvZ3N0YXVkaW92aXN1YWxpemVyLmg6CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmg6CisJICBnb29tMmsxOiByZWJhc2UgdG8gdXNlIHRoZSBhdWRpb3Zpc3VhbGl6ZXIgY2xhc3MKKwkgIFJlYmFzZSB0byBoYXZlIGdvb20yazEgdXNpbmcgdGhlIGNvbW1vbiBHc3RBdWRpb1Zpc3VhbGl6ZXIgY2xhc3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDI4NzUKKworMjAxNS0wNi0wMiAxNzoyOTozNiArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L2dvb20vTWFrZWZpbGUuYW06CisJKiBnc3QvZ29vbS9nc3RhdWRpb3Zpc3VhbGl6ZXIuYzoKKwkqIGdzdC9nb29tL2dzdGF1ZGlvdmlzdWFsaXplci5oOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5oOgorCSAgZ29vbTogcmViYXNlIHRvIHVzZSB0aGUgYXVkaW92aXN1YWxpemVyIGNsYXNzCisKKzIwMTUtMDYtMDIgMTY6Mjc6MjQgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FhY3BhcnNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hYzNwYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXBldjJtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FzcGVjdHJhdGlvY3JvcC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9hbXBsaWZ5LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJiYW5kLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJsaW1pdC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9keW5hbWljLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2ludmVydC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW93c2luY2JhbmQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvd3NpbmNsaW1pdC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9lcXVhbGl6ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsYWNwYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzdjJtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdlbmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tcGVnYXVkaW9wYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdsaW1pdGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ3ZvbHVtZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBzZXNzaW9uLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zcGVjdHJ1bS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9ib3guYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9maWx0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tlbmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2twYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMveTRtZW5jLmM6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvc2ltcGxlLWxhdW5jaC1saW5lcy5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3dhdnBhY2suYzoKKwkgIGNoZWNrOiBVc2UgR1NUX0NIRUNLX01BSU4gKCkgbWFjcm8gZXZlcnl3aGVyZQorCSAgTWFrZXMgc291cmNlIGNvZGUgc21hbGxlciwgYW5kIGVuc3VyZXMgd2UgZ28gdGhyb3VnaCBjb21tb24gaW5pdGlhbGl6YXRpb24KKwkgIHBhdGggKGxpa2UgdGhlIG9uZSB0aGF0IHNldHMgdXAgWE1MIHVuaXQgdGVzdCBvdXRwdXQgLi4uKQorCisyMDE1LTA1LTI2IDE0OjQ3OjMxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBzZXNzaW9uOiBPbmx5IHNjaGVkdWxlIGEgdGltZXIgd2hlbiB3ZSBhY3R1YWxseSBoYXZlIHRvIHNlbmQgUlRDUAorCSAgT3RoZXJ3aXNlIHdlIHdpbGwgaGF2ZSAxMHMtMTAwcyBvZiB0aHJlYWQgd2FrZXVwcyBpbiBmZWVkYmFjayBwcm9maWxlcywgY3JlYXRlCisJICBSVENQIHBhY2tldHMsIGV0Yy4ganVzdCB0byBzdXBwcmVzcyB0aGVtIGluIDk5JSBvZiB0aGUgY2FzZXMgKGkuZS4gaWYgbm8KKwkgIGZlZWRiYWNrIGlzIGFjdHVhbGx5IHBlbmRpbmcgYW5kIG5vIHJlZ3VsYXIgUlRDUCBoYXMgdG8gYmUgc2VudCkuCisJICBUaGlzIGltcHJvdmVzIENQVSB1c2FnZSBhbmQgYmF0dGVyeSBsaWZlIHF1aXRlIGEgbG90LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjU0MworCisyMDE1LTA1LTIyIDEzOjQ0OjAzICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBSZW1vdmUgdXNlbGVzcyBnb3RvCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ2NTQzCisKKzIwMTUtMDUtMjEgMTI6NTQ6NDcgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC1ydHguc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LXJ0cGF1eC5jOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtSDI2NC1ydHguc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXJ0cGF1eC5jOgorCSAgZXhhbXBsZXM6IFNldCBSVFAgcHJvZmlsZSB0byBBVlBGIGZvciBydHBhdXggZXhhbXBsZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDY1NDMKKworMjAxNS0wNS0wNCAxNjo0MTo1MCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogU2V0IFJUUCBwcm9maWxlIG9uIHRoZSBydHBzZXNzaW9uIG9iamVjdHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDY1NDMKKworMjAxNS0wNS0yMSAxNDoxMzo1NiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgIHJ0cGJpbjogQWRkIHJ0cC1wcm9maWxlIHByb3BlcnR5IGZvciBzZXR0aW5nIHRoZSBkZWZhdWx0IHByb2ZpbGUgb2YgbmV3bHkgY3JlYXRlZCBzZXNzaW9ucworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjU0MworCisyMDE1LTA1LTA0IDExOjUxOjQxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBPbmx5IHB1dCBSUnMgYW5kIGZ1bGwgU0RFUyBpbnRvIHJlZ3VsYXIgUlRDUCBwYWNrZXRzCisJICBJZiB3ZSBtYXkgc3VwcHJlc3MgdGhlIHBhY2tldCBkdWUgdG8gdGhlIHJ1bGVzIG9mIFJGQzQ1ODUgKGkuZS4gd2hlbgorCSAgYmVsb3cgdGhlIHQtcnItaW50KSwgd2UgY2FuIHNlbmQgYSBzbWFsbGVyIFJUQ1AgcGFja2V0IHdpdGhvdXQgUlJzCisJICBhbmQgZnVsbCBTREVTLiBJbiB0aGVvcnkgd2UgY291bGQgZXZlbiBzZW5kIGEgbWluaW1hbCBSVENQIHBhY2tldAorCSAgYWNjb3JkaW5nIHRvIFJGQzU1MDYsIGJ1dCB3ZSBkb24ndCBzdXBwb3J0IHRoYXQgeWV0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjU0MworCisyMDE1LTA1LTA0IDEzOjUxOjUwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBzZXNzaW9uOiBLZWVwIHRyYWNrIG9mIHRwL3RuIGFuZCB0X3JyX2xhc3Qgc2VwYXJhdGVseQorCSAgT3RoZXJ3aXNlIHdlIGNhbid0IHByb3Blcmx5IHNjaGVkdWxlIFJUQ1AgaW4gZmVlZGJhY2sgcHJvZmlsZXMgYXMgd2UgbmVlZCB0bworCSAgZGlzdGluZ3Vpc2ggdGhlIHRpbWUgd2hlbiB3ZSBsYXN0IGNoZWNrZWQgZm9yIHNlbmRpbmcgUlRDUCAodHApIGJ1dCBtaWdodCBoYXZlCisJICBzdXBwcmVzc2VkIGl0LCBhbmQgdGhlIHRpbWUgd2hlbiB3ZSBsYXN0IGFjdHVhbGx5IHNlbnQgYSBub24tZWFybHkgUlRDUAorCSAgcGFja2V0LgorCSAgVGhpcyB0b2dldGhlciB3aXRoIHRoZSBvdGhlciBjaGFuZ2VzIHNob3VsZCBub3cgcHJvcGVybHkgaW1wbGVtZW50IFJUQ1AKKwkgIHNjaGVkdWxpbmcgYWNjb3JkaW5nIHRvIFJGQzQ1ODUsIGFuZCBlc3BlY2lhbGx5IGFsbG93IHVzIHRvIHNlbmQgZmVlZGJhY2sKKwkgIHBhY2tldHMgYSBsb3QgaWYgbmVlZGVkIGJ1dCBvbmx5IHNlbmQgcmVndWxhciBSVENQIHBhY2tldHMgZXZlcnkgb25jZSBpbiBhCisJICB3aGlsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDY1NDMKKworMjAxNS0wNS0wNCAxMTo0MjowOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIHJ0cHNlc3Npb246IEFkZCBwcm9wZXJ0eSBmb3Igc2VsZWN0aW5nIFJUUCBwcm9maWxlIChBVlAvQVZQRi9ldGMpCisJICBBbmQgbW9kaWZ5IG91ciBSVENQIHNjaGVkdWxpbmcgYWxnb3JpdGhtIGFjY29yZGluZ2x5LiBXZSBub3cgY2FuIHNlbmQgbW9yZQorCSAgUlRDUCBwYWNrZXRzIGlmIG5lZWRlZCBmb3IgZmVlZGJhY2ssIGJ1dCB3aWxsIHRocm90dGxlIGZ1bGwgUlRDUCBwYWNrZXRzIGJ5CisJICBydGNwLW1pbi1pbnRlcnZhbCAodC1yci1pbnQgZnJvbSBSRkM0NTg1KS4KKwkgIEluIG5vbi1mZWVkYmFjayBtb2RlLCBydGNwLW1pbi1pbnRlcnZhbCBpcyBUbWluIGZyb20gUkZDMzU1MCwgd2hpY2ggaXMKKwkgIHN0YXRpY2FsbHkgc2V0IHRvIDFzIG9yIDBzIGJ5IFJGQzQ1ODUuIFRtaW4gZGVmaW5lcyBob3cgb2Z0ZW4gd2Ugc2hvdWxkCisJICBzZW5kIFJUQ1AgcGFja2V0cyBhdCBtb3N0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjU0MworCisyMDE1LTA1LTMwIDE3OjQxOjA1IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSAgbXVsYXdkZWM6IExldCBiYXNlY2xhc3MgZXN0aW1hdGUgYml0cmF0ZQorCSAgVGhpcyBtYWtlcyBwbGF5YmFjayBkaXJlY3RseSBmcm9tIGEgZmlsZSB3b3JrIHdpdGggdGhlIHJpZ2h0IGNhcHMuCisKKzIwMTUtMDUtMjcgMTY6MzE6MjMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmg6CisJICBkeW51ZHBzaW5rOiBrZWVwIEdDYW5jZWxsYWJsZSBmZCBhcm91bmQgaW5zdGVhZCBvZiByZS1jcmVhdGluZyBpdCBjb25zdGFudGx5CisJICBBbmQgY3JlYXRlIGl0IG9ubHkgd2hlbiBzdGFydGluZyB0aGUgZWxlbWVudC4KKworMjAxNS0wNS0yNyAxNTo1NTo1NiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICB1ZHBzaW5rLCBtdWx0aXVkcHNpbms6IGtlZXAgR0NhbmNlbGxhYmxlIGZkIGFyb3VuZCBpbnN0ZWFkIG9mIHJlLWNyZWF0aW5nIGl0IGNvbnN0YW50bHkKKwkgIE90aGVyd2lzZSB3ZSBjb25zdGFudGx5IGNyZWF0ZS9jbG9zZSBldmVudCBmaWxlIGRlc2NyaXB0b3JzLAorCSAgZXZlcnkgdGltZSB3ZSBjYWxsIGdfc29ja2V0X2NvbmRpdGlvbl90aW1lZF93YWl0KCkgb3IKKwkgIGdfc29ja2V0X3NlbmRfbWVzc2FnZShzKSgpLCBpLmUuIGEgbG90LiBXaGljaCBpcyBub3QKKwkgIHBhcnRpY3VsYXJseSBnb29kIGZvciBwZXJmb3JtYW5jZS4KKwkgIENhbid0IGNyZWF0ZSBHQ2FuY2VsbGFibGUgaW4gOjpzdGFydCgpIGhlcmUgYmVjYXVzZSBpdCdzIHVzZWQKKwkgIGluIGNsaWVudF9uZXcoKSB3aGljaCBtYXkgYmUgY2FsbGVkIHZpYSB0aGUgYWRkLWNsaWVudCBhY3Rpb24KKwkgIHNpZ25hbCB3aGljaCBtYXkgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZWxlbWVudCBpcyB1cCBhbmQgcnVubmluZy4KKworMjAxNS0wNS0xOSAxODoxMzoxNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmg6CisJICB1ZHBzcmM6IGtlZXAgR0NhbmNlbGxhYmxlIGZkIGFyb3VuZCBpbnN0ZWFkIG9mIHJlLWNyZWF0aW5nIGl0IGNvbnN0YW50bHkKKwkgIE90aGVyd2lzZSB3ZSBjb25zdGFudGx5IGNyZWF0ZS9jbG9zZSBldmVudCBmaWxlIGRlc2NyaXB0b3JzLAorCSAgZXZlcnkgc2luZ2xlIHRpbWUgd2UgY2FsbCBnX3NvY2tldF9jb25kaXRpb25fdGltZWRfd2FpdCgpIG9yCisJICBnX3NvY2tldF9yZWNlaXZlX21lc3NhZ2UoKSwgaS5lLiB0d2ljZSBwZXIgcGFja2V0IHJlY2VpdmVkIQorCSAgVGhpcyB3YXMgbm90IHBhcnRpY3VsYXJseSBnb29kIGZvciBwZXJmb3JtYW5jZS4KKwkgIEFsc28gb25seSBjcmVhdGUgR0NhbmNlbGxhYmxlIG9uIHN0YXJ0LXVwLgorCisyMDE1LTA1LTI2IDE1OjMzOjM3ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thOiBvdmVyd3JpdHRlbiB2YWx1ZSBhc3NpZ25tZW50CisJICBjdXJwb3MgaXMgc2V0IGFuZCBpbW1lZGlhdGVseSBhZnRlciwgc2V0IGFnYWluLiBSZW1vdmUgdGhlIHJlZHVuZGFudAorCSAgYXNzaWdubWVudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDk5MDkKKworMjAxNS0wNS0yMyAxMzo0NzoxNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIHJ0cHZyYXdkZXBheTogZG9uJ3Qgc2hhZG93IGV4aXN0aW5nIG91dGJ1ZiB2YXJpYWJsZQorCSAgQW5kIGZpeCB1bnJlZiBvZiB0aGUgd3Jvbmcgb25lIHdoaWNoIHdpbGwgY29udGFpbiBOVUxMCisJICBpbiBhbiBlcnJvciBjb2RlIHBhdGguCisKKzIwMTUtMDUtMjMgMTM6MjM6MjIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5oOgorCSAgcnRwdnJhd2RlcGF5OiBtYXAvdW5tYXAgb3V0cHV0IGZyYW1lIG9ubHkgb25jZSwgbm90IGZvciBldmVyeSBpbnB1dCBwYWNrZXQKKwkgIE1hcCBvdXRwdXQgYnVmZmVyIGFmdGVyIGNyZWF0aW5nIGl0IGFuZCBrZWVwIGl0IG1hcHBlZAorCSAgdW50aWwgd2UncmUgZG9uZSB3aXRoIGl0IGluc3RlYWQgb2YgbWFwcGluZy91bm1hcHBpbmcKKwkgIGl0IGZvciBldmVyeSBzaW5nbGUgaW5wdXQgYnVmZmVyLgorCisyMDE1LTA1LTI1IDA4OjQ3OjQ3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVtb3ZlIGZpeG1lIGZyb20gMjAwNgorCSAgSXQgaGFzIGJlZW4gdmVyaWZpZWQgYnkgdXNlIG92ZXIgdGltZS4KKworMjAxNS0wNS0yMyAxNDozNjo0MSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCByZXZlcnNlIHBsYXliYWNrIG9mIGZyYWdtZW50ZWQgbWVkaWEKKwkgIHF0ZGVtdXggY3JlYXRlcyBhIHNhbXBsZXMgYXJyYXkgYW5kIGdldHMgdGhlIHRpbWVzdGFtcHMgZm9yIGJ1ZmZlcnMgYnkKKwkgIGFjY3VtdWxhdGluZyB0aGVpciBkdXJhdGlvbnMuIFdoZW4gZG9pbmcgcmV2ZXJzZSBwbGF5YmFjayBvZiBmcmFnbWVudHMsCisJICBhY2N1bXVsYXRpbmcgc2FtcGxlcyB3aWxsIGxlYWQgdG8gd3JvbmcgdGltZXN0YW1wcyBhcyB0aGUgdGltZXN0YW1wcworCSAgc2hvdWxkIGdvIGRlY3JlYXNpbmcgZnJvbSBmcmFnbWVudCB0byBmcmFnbWVudCBhbmQgdGhlIGFjY3VtdWxhdGlvbgorCSAgd2lsbCBwcm9kdWNlIHdyb25nIHJlc3VsdHMuCisJICBJbiB0aGlzIGNhc2UsIHdoZW4gcmVjZWl2aW5nIGEgZGlzY29udCBmb3IgZnJhZ21lbnRlZCByZXZlcnNlIHBsYXliYWNrLAorCSAgdGhlIHByZXZpb3VzIHNhbXBsZXMgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGZsdXNoZWQgYmVmb3JlIG5ldyBkYXRhCisJICBpcyBwcm9jZXNzZWQuCisKKzIwMTUtMDUtMjMgMDE6MDM6MTggKzA5MDAgIEppbW15IE9obiA8eW9uZ2ppbi5vaG5AbGdlLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkgIHNwbGl0ZmlsZXNyYzogSW1wbGVtZW50IGJpbmFyeSBzZWFyY2ggaW4gZmluZF9wYXJ0X2Zvcl9vZmZzZXQKKwkgIEltcGxlbWVudCBiaW5hcnkgc2VhcmNoIHVzaW5nIGdzdF91dGlsX2FycmF5X2JpbmFyeV9zZWFyY2gKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDk2OTAKKworMjAxNS0wNS0yMSAxMzoyNjo1MyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogRG9uJ3QgY3Jhc2ggaWYgd2UgcmVjZWl2ZSBGSVIvUExJIGZyb20gYSBzb3VyY2Ugd2UgZG9uJ3Qga25vdworCisyMDE1LTA1LTIxIDA5OjM1OjU4ICswMjAwICBTYW50aWFnbyBDYXJvdC1OZW1lc2lvIDxzYW5jYW5lQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogRml4IGNvbGxlY3Rpb24gb2Ygc3RhdGlzdGljcworCSAgU3RhdHMgc2hvdWxkIGJlIGNvbGxlY3RlZCBvbiB0aGUgbWVkaWEgcnRwIHNvdXJjZSBub3QgaW4gdGhlCisJICBzZW5kZXIgb25lLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0OTY2OQorCisyMDE1LTA0LTIwIDEwOjA3OjMwICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oOgorCSAgbXVsdGlmaWxlc2luazogQWRkIGEgbmV3IG1heC1kdXJhdGlvbiBmaWxlIHN3aXRjaGluZyBtb2RlCisJICBUaGlzIG5ldyBtb2RlIGVuc3VyZXMgdGhhdCBmaWxlcyB3aWxsIG5ldmVyIGV4Y2VlZCBhIGNlcnRhaW4gZHVyYXRpb24KKwkgIGJhc2VkIG9uIGluY29taW5nIGJ1ZmZlciBQVFMgKGFuZCBkdXJhdGlvbiBpZiBwcmVzZW50KQorCSAgTm90ZToKKwkgICogWW91IG5lZWQgdGltZXN0YW1wZWQgYnVmZmVycyAoZHVoKS4gSWYgc29tZSBvZiB0aGUgaW5jb21pbmcgYnVmZmVycyBkb24ndAorCSAgaGF2ZSBQVFMsIHRoZW4gaXQgd2lsbCBqdXN0IGFjY2VwdCB0aGVtIGluIHRoZSBjdXJyZW50IGZpbGUKKworMjAxNS0wNC0xNyAxNjoxODozMiArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICBtdWx0aWZpbGVzaW5rOiBzdHJlYW1saW5lIHRoZSBmaWxlLXN3aXRjaCBjb2RlIGEgYml0CisJICBVc2UgdGhlIHNhbWUgZnVuY3Rpb25zIHJlZ2FyZGxlc3Mgb2YgdGhlIG1vZGUgd2UgYXJlIHVzaW5nCisKKzIwMTUtMDQtMDIgMTM6MzU6MTggKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmg6CisJICBtdWx0aWZpbGVzaW5rOiBhZGQgImFnZ3JlZ2F0ZS1nb3BzIiBwcm9wZXJ0eSB0byBwcm9jZXNzIEdPUHMgYXMgYSB3aG9sZQorCSAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIG5leHQtZmlsZT1tYXgtc2l6ZQorCSAgKGFuZCBwZXJoYXBzIGEgZnV0dXJlIG5leHQtZmlsZT1tYXgtZHVyYXRpb24pIHRvIG1ha2Ugc3VyZSB0aGF0CisJICBlYWNoIGZpbGUgcGFydCBzdGFydHMgY2xlYW5seSB3aXRoIGEga2V5IGZyYW1lIGFuZCB0aGUgYXBwcm9wcmlhdGUgaGVhZGVycy4KKwkgIEluIG9yZGVyIGZvciB0aGlzIHByb3BlcnR5IHRvIHdvcmsgY29ycmVjdGx5LCB1cHN0cmVhbSBlbGVtZW50cyBzaG91bGQgbWFrZQorCSAgc3VyZSB0aGFuIGFueSBoZWFkZXJzIHRoYXQgbmVlZCB0byBiZSB3cml0dGVuIGluIGEgc3RhbmRhbG9uZSBmaWxlIGFyZToKKwkgIDEpIGluIHRoZSBzdHJlYW1oZWFkZXIgY2FwcyBmaWVsZAorCSAgMikgYW5kL29yIGluIHRoZSBzdHJlYW0gYXMgb25lIG9yIG1vcmUgYnVmZmVycyBtYXJrZWQgd2l0aCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSCisJICB0aGF0IGFyZSBqdXN0IGJlZm9yZSB0aGUga2V5ZnJhbWUgYnVmZmVyCisJICBUaGlzIGlzIHVzZWZ1bCBmb3IgTVBFRy1UUy9NUEVHLVBTIGZpbGUgc2VnbWVudGluZyBpbgorCSAgY29tYmluYXRpb24gd2l0aCBtcGVndHNtdXggb3IgbXBlZ3BzbXV4LgorCSAgT3JpZ2luYWwgcGF0Y2ggYnk6IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKzIwMTUtMDUtMjAgMTY6Mzc6MjIgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IFVzZSBzaW5nbGUtaW5jbHVkZSBoZWFkZXIgZm9yIHRoZSBSVFNQIGxpYnJhcnkKKworMjAxNC0xMC0yNCAyMzo0NzoyMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcDogZG9uJ3QgdXNlIHNvb24tdG8tYmUtZGVwcmVjYXRlZCBnX2NhbmNlbGxhYmxlX3Jlc2V0KCkKKwkgIEZyb20gdGhlIEFQSSBkb2N1bWVudGF0aW9uOiAiTm90ZSB0aGF0IGl0IGlzIGdlbmVyYWxseSBub3QKKwkgIGEgZ29vZCBpZGVhIHRvIHJldXNlIGFuIGV4aXN0aW5nIGNhbmNlbGxhYmxlIGZvciBtb3JlCisJICBvcGVyYXRpb25zIGFmdGVyIGl0IGhhcyBiZWVuIGNhbmNlbGxlZCBvbmNlLCBhcyB0aGlzCisJICBmdW5jdGlvbiBtaWdodCB0ZW1wdCB5b3UgdG8gZG8uIFRoZSByZWNvbW1lbmRlZCBwcmFjdGljZQorCSAgaXMgdG8gZHJvcCB0aGUgcmVmZXJlbmNlIHRvIGEgY2FuY2VsbGFibGUgYWZ0ZXIgY2FuY2VsbGluZworCSAgaXQsIGFuZCBsZXQgaXQgZGllIHdpdGggdGhlIG91dHN0YW5kaW5nIGFzeW5jIG9wZXJhdGlvbnMuCisJICBZb3Ugc2hvdWxkIGNyZWF0ZSBhIGZyZXNoIGNhbmNlbGxhYmxlIGZvciBmdXJ0aGVyIGFzeW5jCisJICBvcGVyYXRpb25zLiIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzkxMzIKKworMjAxNS0wNS0xOCAyMDoxMzowMSArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICBSZXZlcnQgImRvYzogV29ya2Fyb3VuZCBndGtkb2MgaXNzdWUiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDE3OTdjOGY4YjEyZDdmNGM3YTk0NDRjOTRmMzRmNGQwOGVjODU5NDUuCisJICBUaGlzIGlzIGZpeGVkIGJ5IHRoZSBndGstZG9jIDEuMjMgcmVsZWFzZS4KKwkgIDxwYXJhPiBjYW5ub3QgY29udGFpbiA8cmVmc2VjdDI+OgorCSAgaHR0cDovL3d3dy5kb2Nib29rLm9yZy90ZGcvZW4vaHRtbC9wYXJhLmh0bWwKKwkgIGh0dHA6Ly93d3cuZG9jYm9vay5vcmcvdGRnL2VuL2h0bWwvcmVmc2VjdDIuaHRtbAorCisyMDE1LTA1LTE4IDE2OjQwOjIxICswMjAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJICBydHBnNzI2cGF5OiBmaXggY2FwcyBsZWFrCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ5NTQ0CisKKzIwMTUtMDUtMTggMTY6MzQ6MTMgKzAyMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOgorCSAgcnRwZzcyNmRlcGF5OiBkb24ndCBsZWFrIGlucHV0IGJ1ZmZlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0OTU0MworCisyMDE1LTA1LTE4IDE3OjM4OjMxICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cHNvdXJjZTogUXVldWUgYmFkIHBhY2tldHMgaW5zdGVhZCBvZiBkcm9wcGluZyB0aGVtCisJICBTbyB3ZSBjYW4gc2VuZCB0aGVtIG91dCBvbmNlIHdlIGZvdW5kIHRoZSBuZXh0LCBjb25zZWN1dGl2ZSBzZXF1ZW5jZSBudW1iZXIgaW4KKwkgIGNhc2Ugb25lIGlzIGZvbGxvd2luZy4KKworMjAxNS0wNS0xOCAxNzozODoxNCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IFVzZSBnX3F1ZXVlX2ZvcmVhY2goKSB0byB1bnJlZiBhbGwgYnVmZmVycyBpbiBxdWV1ZXMKKworMjAxNS0wNS0xOCAxNzoxOTozMSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IFJlZmFjdG9yIHNlcW51bSBjb21wYXJpc29uIGNvZGUgYSBiaXQKKworMjAxNS0wNS0xOCAxNzowODo1MyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IEFsbG93IHNlcXVlbmNlIG51bWJlciB3cmFwYXJvdW5kIGR1cmluZyBwcm9iYXRpb24KKworMjAxNS0wNS0xOCAxNzowNzoyMyArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IE1ha2Ugc2VxdWVuY2UgbnVtYmVyIGNvbXBhcmlzb24gY29kZSBtb3JlIHJlYWRhYmxlCisJICAuLi4gYnkgdXNpbmcgZ3N0X3J0cF9idWZmZXJfY29tcGFyZV9zZXFudW0oKSBhbmQgc2lnbmVkIGludGVnZXJzCisJICBpbnN0ZWFkIG9mIGltcGxpY3RseSB1c2luZyBlZmZlY3RzIG9mIGludGVnZXIgb3Zlci91bmRlcmZsb3dzLgorCisyMDE1LTA0LTIyIDE4OjU0OjA2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogV2hlbiBkZXRlY3RpbmcgYSBodWdlIHNlcW51bSBnYXAsIHdhaXQgZm9yIDUgY29uc2VjdXRpdmUgcGFja2V0cyBiZWZvcmUgcmVzZXR0aW5nIGV2ZXJ5dGhpbmcKKwkgIEl0IG1pZ2h0IGp1c3QgYmUgYSBsYXRlIHJldHJhbnNtaXNzaW9uIG9yIHNwdXJpb3VzIHBhY2tldCBmcm9tIGVsc2V3aGVyZSwgYnV0CisJICByZXNldHRpbmcgZXZlcnl0aGluZyB3b3VsZCBtZWFuIHRoYXQgd2Ugd2lsbCBjYXVzZSBhIG5vdGljZWFibGUgaGlja3VwLiBMZXQncworCSAgZ2V0IHNvbWUgY29uZmlkZW5jZSBmaXJzdCB0aGF0IHRoZSBzZXF1ZW5jZSBudW1iZXJzIGNoYW5nZWQgZm9yIHdoYXRldmVyCisJICByZWFzb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3OTIyCisKKzIwMTUtMDUtMTYgMjM6Mzc6MDYgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jOgorCSogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVybmJhbmRzLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIGRvYzogV29ya2Fyb3VuZCBndGtkb2MgaXNzdWUKKwkgIFdpdGggZ3RrZG9jIDEuMjIsIHRoZSBYTUwgZ2VuZXJhdG9yIGZhaWxzIHdoZW4gYSBpdGVtaXplZGxpc3QgaXMKKwkgIGZvbGxvd2VkIGJ5IGEgcmVmc2VjdDIuIFdvcmthcm91bmQgdGhlIGlzc3VlIGJ5IHdyYXBwaW5nIHRoZQorCSAgcmVmc2VjdDIgaW50byBwYXJhLgorCisyMDE1LTAxLTIzIDEzOjU3OjQwICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuYzoKKwkgIHF0ZGVtdXg6IGF2b2lkIHdyb25nIHdhcm5pbmdzIG9uIHVua25vd24gbm9kZSB0eXBlcworCSAgQWRkICduYW1lJyBhbmQgJ21lYW4nIGZvdXJjY3MsIGFzIHdlIGhhbmRsZSB0aGVtLiBSaWdodCBub3cgZWFjaCB1c2Ugd291bGQKKwkgIHRyaWdnZXIgYSB3YXJuaW5nLgorCisyMDE1LTA1LTA4IDE5OjEzOjAwICswMjAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNmRlcGF5Lmg6CisJICBydHBnNzI2ZGVwYXk6IGFkZCBibG9ja19hbGlnbiB0byBvdXRwdXQgY2FwcworCSAgSXQgaXMgbmVlZGVkIHRvIGNvcnJlY3RseSBuZWdvdGlhdGUgY2FwcyB3aXRoIG1hdHJvc2thbXV4CisJICBhbmQgbW9zdCBvdGhlciBtdXhlcnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ5MTI5CisKKzIwMTUtMDUtMTIgMTM6NDE6NTggKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJICBhdWRpb2Z4YmFzZWZpcmZpbHRlcjogRml4IHRpbWUtZG9tYWluIGNvbnZvbHV0aW9uIHdpdGggPjEgY2hhbm5lbHMKKwkgIGlucHV0X3NhbXBsZXMgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMsIGJ1dCB3ZSB1c2VkIGl0IGFzIHRoZSBudW1iZXIgb2YKKwkgIHNhbXBsZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3MjA0CisKKzIwMTUtMDUtMTIgMTI6MTM6MTYgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnB4L2dzdHZwOWVuYy5jOgorCSAgdnBbODldZW5jOiBQcm9wZXJseSBjb252ZXJ0IGJldHdlZW4gR1N0cmVhbWVyIGFuZCBlbmNvZGVyIHRpbWViYXNlCisJICAuLi4gYnkgc3dpdGNoaW5nIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3Igd2hlbiBzY2FsaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0OTEyMgorCisyMDE1LTA1LTExIDEzOjMzOjI2ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkgIHZwWzg5XWVuYzogRG9uJ3Qgc2V0IHRpbWViYXNlIGZyb20gdGhlIGZyYW1lcmF0ZQorCSAgVGhlIGZyYW1lcmF0ZSB2ZXJ5IG9mdGVuIGlzIGp1c3QgYW4gaW5kaWNhdGlvbiBvZiB0aGUgaWRlYWwgZnJhbWVyYXRlLCBub3QgdGhlCisJICBhY3R1YWwgZnJhbWVyYXRlIG9mIHRoZSBzdHJlYW0uIEJ5IGp1c3QgdXNpbmcgdGhlIGZyYW1lcmF0ZSwgd2UgY29uZnVzZSB0aGUKKwkgIHJhdGUgY29udHJvbCBhbGdvcml0aG0gYWxnb3JpdGhtIGFzIG11bHRpcGxlIGZyYW1lcyB3aWxsIG1hcCB0byB0aGUgc2FtZSBQVFMKKwkgIG9yIGhhdmUgZHVyYXRpb25zIG9mIDAuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ5MTIyCisKKzIwMTUtMDUtMTAgMTQ6MjE6MDQgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja3BhcnNlLmM6CisJICB0ZXN0czogd2F2cGFja3BhcnNlOiBmaXggdW5pdCB0ZXN0CisJICBTZWUgYWxzbyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM4MjM3CisKKzIwMTUtMDUtMTAgMTE6MDU6MDAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6CisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZweC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cHgvZ3N0dnA5ZGVjLmM6CisJKiBleHQvdnB4L2dzdHZwOWVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDI0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDI0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3dhdmVuYy5jOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWFsc2FzcmMtUENNQS5jOgorCSAgZG9jczogdXBkYXRlIGV4YW1wbGUgcGlwZWxpbmVzIGluIGVsZW1lbnQgZG9jcworCSAgTW9zdGx5IGdzdC1sYXVuY2ggLT4gZ3N0LWxhdW5jaC0xLjAKKwkgIFVzZSBhdXRvdmlkZW9zaW5rL2F1dG9hdWRpb3NpbmsgbW9yZSBvZnRlbi4KKwkgIFNwcmlua2xlIHNvbWUgY29udmVydGVycyBoZXJlIGFuZCB0aGVyZS4KKworMjAxNS0wNS0wOSAxOTo0ODo1NSArMDIwMCAgUGlvdHIgRHLEhWcgPHBpb3RyZHJhZ0BnbWFpbC5jb20+CisKKwkqIHBvL1BPVEZJTEVTLmluOgorCSAgcG86IHVwZGF0ZSBQT1RGSUxFUy5pbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0OTE2MworCisyMDE1LTA1LTEwIDEwOjUyOjE4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c3JjLmM6CisJICBzcGxpdG11eHNyYzogbWlub3IgZXJyb3IgbWVzc2FnZSBjbGVhbi11cAorCSAgRG9uJ3QgcHV0IGZpbGVuYW1lIGluIGVycm9yIG1lc3NhZ2Ugc2hvd24gdG8gdXNlci4KKworMjAxNS0wNS0wNyAxNjoyNTozNiArMDIwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGZpeCBidWZmZXIgbGVhayB3aGVuIHN0b3JlZCB0byBzZWVrdGFibGUKKwkgIEZpeCBhIGxlYWsgd2l0aCB0aGUKKwkgIHZhbGlkYXRlLmZpbGUucGxheWJhY2suY2hhbmdlX3N0YXRlX2ludGVuc2l2ZS5zYW1wbGVzX211bHRpbWVkaWFfY3hfZmxhY19ZZXN0ZXJkYXlfZmxhYworCSAgc2NlbmFyaW8uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ5MDcyCisKKzIwMTUtMDUtMDcgMTc6MTA6MzcgKzA5MDAgIFBhdWwgSHl1bmlsIDxwYXVsLmh5dW5pbEBsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBleGFtcGxlIHBpcGVsaW5lIGluIGRvY3MKKwkgIFRoZSBnc3QtbGF1bmNoIHNjcmlwdCBmb3IgZXhhbXBsZSBsYXVuY2ggbGluZSB0byB0ZXN0IHF0ZGVtdXggaXMKKwkgIG1pc3NpbmcgYSBxdWV1ZSBiZWZvcmUgdGhlIGRlY29kZWJpbnMsIG90aGVyd2lzZSB0aGUgZ3N0LWxhdW5jaC0xLjAKKwkgIGNvbW1hbmQgd29uJ3Qgd29yay4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDkwNTQKKworMjAxNS0wNS0wNyAxNDo1MTo0NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgUmV2ZXJ0ICJydHBzZXNzaW9uOiBBbHNvIHJlcG9ydCBpbnRlcm5hbCBzb3VyY2VzIGluIG9uLW5ldy1zc3JjIGFuZCBvbi1zc3JjLWFjdGl2ZSIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgZDIyZWM0OTYzMjhlNmJhOGVkYmYyZDA3MWQ1NjA4YjJhZjI4MzFlOC4KKwkgIEFwcGxpY2F0aW9uIGNvZGUgbWlnaHQgZXhwZWN0IHRoYXQgaXQgb25seSBnZXRzIGV4dGVybmFsIHNvdXJjZXMgb24gdGhvc2UKKwkgIHNpZ25hbHMsIGFuZCBnZXQgY29uZnVzZWQgYnkgdGhpcy4gSWYgYW55dGhpbmcgd2Ugd291bGQgbmVlZCB0byBhZGQgbmV3CisJICBzaWduYWxzLgorCisyMDE1LTAzLTI1IDE1OjI3OjM0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBBbHNvIHJlcG9ydCBpbnRlcm5hbCBzb3VyY2VzIGluIG9uLW5ldy1zc3JjIGFuZCBvbi1zc3JjLWFjdGl2ZQorCSAgV2l0aG91dCB0aGlzIGl0IHNlZW1zIGltcG9zc2libGUgZm9yIGFuIGFwcGxpY2F0aW9uIHRvIGVhc2lseSBnZXQgbm90aWZpZWQKKwkgIGFib3V0IHRoZSBpbnRlcm5hbCBzc3JjcyB0aGF0IGFyZSBjcmVhdGVkLCBlLmcuIHNlbmRlciBzb3VyY2VzLCBhbmQgYWxzbworCSAgdG8ga25vdyB3aGVuIHRoZXkgYXJlIGFjdGl2ZSBhbmQgcHJvZHVjZSBSVENQIHBhY2tldHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ2NzQ3CisKKzIwMTUtMDUtMDQgMTk6MjY6MTQgKzAyMDAgIEd1aWxsYXVtZSBEZXNtb3R0ZXMgPGd1aWxsYXVtZS5kZXNtb3R0ZXNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBmaXggZnJhbWUgbGVha3MgaW4gaGFuZGxlX2ZyYW1lKCkgaW1wbGVtZW50YXRpb24KKwkgIGhhbmRsZV9mcmFtZSgpIGlzIHN1cHBvc2VkIHRvIGNvbnN1bWUgQGZyYW1lLCBzbyBpZiB3ZSBkb24ndCBjYWxsCisJICBnc3RfdmlkZW9fZGVjb2Rlcl9kcm9wX2ZyYW1lKCkgb3IgZ3N0X3ZpZGVvX2RlY29kZXJfZmluaXNoX2ZyYW1lKCkgd2UgaGF2ZSB0bworCSAgcmVsZWFzZSBpdCBtYW51YWxseS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDg5MDkKKworMjAxNS0wNS0wNCAxNjo1MDozOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogRml4IHVwIGxhc3QgY29tbWl0CisKKzIwMTUtMDUtMDQgMTY6NDY6MDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IE9ubHkgZG8gUlRYIHdoZW4gdXNpbmcgYSBmZWVkYmFjayBwcm9maWxlCisKKzIwMTUtMDUtMDQgMTM6NTA6MzEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IFRoZSBzdGF0cyBtaW5faW50ZXJ2YWwgaXMgaW4gc2Vjb25kcywgbm90IG5hbm9zZWNvbmRzCisJICBXZSBoYXZlIHRvIHNjYWxlIGl0IHRvIGNvbXBhcmUgaXQgYWdhaW5zdCBvdXIgY2xvY2sgdGltZXMuCisKKzIwMTUtMDUtMDQgMTE6Mzg6MjcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IE9ubHkgcmV0dXJuIFRSVUUgaWYgZWFybHkgZmVlZGJhY2sgd2FzIHJlcXVlc3RlZCBhbHJlYWR5IGFuZCBpdCdzIGVhcmx5IGVub3VnaAorCisyMDE1LTA0LTMwIDE1OjQyOjM0ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thOiByZW1vdmUgdW51c2VkIHByb3BlcnR5IGVudW0gaXRlbXMKKworMjAxNS0wNC0zMCAxMjoxMzo1OSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggYnVmZmVyIGxlYWsgb24gZW9zIGluIHB1c2ggbW9kZQorCSAgQmFzZWQgb24gcGF0Y2ggYnkgR3VpbGxhdW1lIERlc21vdHRlcy4KKwkgIHNjZW5hcmlvOiB2YWxpZGF0ZS5odHRwLnBsYXliYWNrLnNlZWtfd2l0aF9zdG9wLnJhd19oMjY0XzFfbXA0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ4NjE3CisKKzIwMTUtMDQtMjkgMTk6NDE6MjkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQ2hlY2sgZm9yIHNpemVzIG9mIHRoZSByZHJmIChyZWRpcmVjdCkgYXRvbSBiZWZvcmUgYWNjZXNzaW5nIHRoZSBkYXRhIGFuZCB1c2UgZ19zdHJuZHVwKCkgaW5zdGVhZCBvZiBnX3N0cmR1cCgpCisJICBUaGFua3MgdG8gUmFscGggR2lsZXMgZm9yIHJlcG9ydGluZyB0aGlzLgorCisyMDE1LTA0LTI5IDE1OjUyOjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBPbmx5IGVuYWJsZSByZXRyYW5zbWlzc2lvbnMgaWYgdGhlcmUgaXMgcmV0cmFuc21pc3Npb24gaW5mbyBpbiB0aGUgU0RQCisJICBPdGhlcndpc2Ugd2UncmUgZ29pbmcgdG8gc2VuZCBlYXJseSBSVENQIGFuZCBOQUNLcyBpbiBub24tZmVlZGJhY2sgc2Vzc2lvbnMKKwkgIHRvbywgd2hpY2ggd2lsbCBjb25mdXNlIHNlcnZlcnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ4NjI3CisKKzIwMTUtMDItMTEgMTg6MDk6MjQgKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSAgZHZkZW11eDogZXh0cmFjdCByZWNvcmRpbmcgdGltZQorCSAgRXh0cmFjdHMgdGhlIHJlY29yZGVkIHRpbWUgb2YgdGhlIGR2IGZpbGUgZnJvbQorCSAgdGhlIG1ldGFkYXRhIGFuZCBwdXRzIGl0IGludG8gdGhlIGdsb2JhbCB0YWdzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MzY1NworCisyMDE1LTA0LTI4IDE1OjU5OjI1ICswMjAwICBHdWlsbGF1bWUgRGVzbW90dGVzIDxndWlsbGF1bWUuZGVzbW90dGVzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBmaXggc2VlayBldmVudCBsZWFrCisJICBnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NlZWtfZXZlbnQoKSBkb2Vzbid0IGNvbnN1bWUgdGhlCisJICBldmVudCBzbyB3ZSBoYXZlIHRvIHVucmVmIGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0ODU4NAorCisyMDE1LTA0LTI4IDE1OjQyOjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thLWRlbXV4OiBTZW5kIHBlbmRpbmcgdGFncyB3aGVuIGFkZGluZyBhIG5ldyBwYWQKKwkgIFdlIG1pZ2h0J3ZlIHBhcnNlZCB0aG9zZSB0YWdzIGJlZm9yZSBhbHJlYWR5IGFuZCB0cmllZCB0byBwdXNoIHRoZW0gdG8KKwkgIG5vbi1leGlzdGluZyBwYWRzIGJlZm9yZS4gTm93IGxldCdzIGRvIGl0IGZvciByZWFsLgorCisyMDE1LTA0LTIzIDE4OjU3OjM3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSAgcnRwc3RhdHM6IEF2ZXJhZ2UgUlRDUCBwYWNrZXQgc2l6ZSBpcyBpbiBieXRlcywgYmFuZHdpZHRocyBpbiBiaXRzCisJICBXZSBuZWVkIHRvIGNvbnZlcnQgdGhlIHNpemUgdG8gYml0cyBmb3Igb3VyIGNhbGN1bGF0aW9ucy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDc4NjMKKworMjAxNS0wNC0yMyAxODo1MzozOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuYzoKKwkgIHJ0cHN0YXRzOiBVc2UgdGhlIHNhbWUgbG93ZXIgbGltaXQgZm9yIFJUQ1AgYmFuZHdpZHRoIHRvIHN0b3Agc2VuZGluZyBSVENQIGV2ZXJ5d2hlcmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDc4NjMKKworMjAxNS0wNC0xNCAxODo0MTowNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogVXNlIGJhbmR3aWR0aCBjYWxjdWxhdGlvbiBieSBkZWZhdWx0IGluc3RlYWQgb2Ygc29tZSBhcmJpdHJhcnkgaGFyZGNvZGVkIHZhbHVlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3ODYzCisKKzIwMTUtMDQtMjMgMTg6NDk6MzcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IEJhbmR3aWR0aCBpcyBzdXBwb3NlZCB0byBiZSBpbiBiaXRzL3MsIG5vdCBieXRlcy9zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3ODYzCisKKzIwMTUtMDQtMjcgMTY6MzY6MjcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBGaXggUlRYIHVuaXQgdGVzdAorCSAgVGhlIGNhbGN1bGF0aW9ucyB3ZXJlIGEgYml0IG9mZiBldmVyeXdoZXJlLCBldmVuIGJlZm9yZSB0aGUgY2hhbmdlcyBkb25lCisJICByZWNlbnRseSB0byB0aGUgZGVsYXkgZm9yIFJUWCBvZiBleHBlY3RlZCBmdXR1cmUgcGFja2V0cy4gSXQgb25seSB3b3JrZWQgYnkKKwkgIGFjY2lkZW50LCBidXQgbm93IHRoZSBjYWxjdWxhdGlvbnMgYXJlIGFsbCBjb3JyZWN0IGFnYWluLiBIb3BlZnVsbHkuCisKKzIwMTUtMDQtMjcgMTE6MjI6MTEgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvZGVidWd1dGlscy9icmVha215ZGF0YS5jOgorCSogZ3N0L2RlYnVndXRpbHMvY3B1cmVwb3J0LmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZzZWVrLmM6CisJKiBnc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJKiBnc3QvZmx2L2dzdGluZGV4LmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cnRweHF0ZGVwYXkuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW90ZW1wbGF0ZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIFJlbmFtZSBwcm9wZXJ0eSBlbnVtcyBmcm9tIEFSR18gdG8gUFJPUF8KKwkgIFByb3BlcnR5IGVudW0gaXRlbXMgc2hvdWxkIGJlIG5hbWVkIFBST1BfIGZvciBjb25zaXN0ZW5jeSBhbmQgcmVhZGFiaWxpdHkuCisKKzIwMTUtMDQtMjUgMDI6NDk6NTggKzAzMDAgIElseWEgS29uc3RhbnRpbm92IDxpbHlhLmtvbnN0YW50aW5vdkBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBGaXggInN0YXRzIiBwcm9wZXJ0eSBkb2NzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ4NDM2CisKKzIwMTUtMDQtMjYgMTc6NTQ6NTIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIEFuZHJvaWQubWs6CisJKiBnc3QvYWxwaGEvTWFrZWZpbGUuYW06CisJKiBnc3QvYXBldGFnL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVwYXJzZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdXRvZGV0ZWN0L01ha2VmaWxlLmFtOgorCSogZ3N0L2F2aS9NYWtlZmlsZS5hbToKKwkqIGdzdC9jdXR0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWd1dGlscy9NYWtlZmlsZS5hbToKKwkqIGdzdC9kZWludGVybGFjZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9kdG1mL01ha2VmaWxlLmFtOgorCSogZ3N0L2VmZmVjdHYvTWFrZWZpbGUuYW06CisJKiBnc3QvZXF1YWxpemVyL01ha2VmaWxlLmFtOgorCSogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHgvTWFrZWZpbGUuYW06CisJKiBnc3QvZ29vbS9NYWtlZmlsZS5hbToKKwkqIGdzdC9nb29tMmsxL01ha2VmaWxlLmFtOgorCSogZ3N0L2ljeWRlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L2lkM2RlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L2ltYWdlZnJlZXplL01ha2VmaWxlLmFtOgorCSogZ3N0L2ludGVybGVhdmUvTWFrZWZpbGUuYW06CisJKiBnc3QvaXNvbXA0L01ha2VmaWxlLmFtOgorCSogZ3N0L2xhdy9NYWtlZmlsZS5hbToKKwkqIGdzdC9sZXZlbC9NYWtlZmlsZS5hbToKKwkqIGdzdC9tYXRyb3NrYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9tb25vc2NvcGUvTWFrZWZpbGUuYW06CisJKiBnc3QvbXVsdGlmaWxlL01ha2VmaWxlLmFtOgorCSogZ3N0L211bHRpcGFydC9NYWtlZmlsZS5hbToKKwkqIGdzdC9yZXBsYXlnYWluL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0c3AvTWFrZWZpbGUuYW06CisJKiBnc3Qvc2hhcGV3aXBlL01ha2VmaWxlLmFtOgorCSogZ3N0L3NtcHRlL01ha2VmaWxlLmFtOgorCSogZ3N0L3NwZWN0cnVtL01ha2VmaWxlLmFtOgorCSogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2JveC9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2Nyb3AvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbToKKwkqIGdzdC93YXZlbmMvTWFrZWZpbGUuYW06CisJKiBnc3Qvd2F2cGFyc2UvTWFrZWZpbGUuYW06CisJKiBnc3QveTRtL01ha2VmaWxlLmFtOgorCSAgUmVtb3ZlIG9ic29sZXRlIEFuZHJvaWQgYnVpbGQgY3J1ZnQKKwkgIFRoaXMgaXMgbm90IG5lZWRlZCBhbnkgbG9uZ2VyLgorCisyMDE1LTA0LTI0IDEzOjU1OjA4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJICB2aWRlb2Nyb3A6IHByaW50IHRoZSBwcm9wZXJ0eSB2YWx1ZXMgd2hlbiBzZXQKKwkgIEluc3RlYWQgb2YgcHJpbnRpbmcgdGhlIGN1cnJlbnRseSB1c2VkIHZhbHVlcy4gVGhlIGxvZyBpcyBtZWFudAorCSAgdG8gc2hvdyB3aGF0IHRoZSBwcm9wZXJ0aWVzIGNoYW5nZWQgdG8sIG5vdCB3aGF0IGlzIGJlaW5nIGN1cnJlbnRseQorCSAgdXNlZC4KKworMjAxNS0wNC0yNCAxNzowMToxMCArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2thcmFva2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhxdWV1ZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHJlbW92ZSB1bnVzZWQgZW51bSBpdGVtcyBQUk9QX0xBU1QKKwkgIFRoaXMgd2VyZSBwcm9iYWJseSBhZGRlZCB0byB0aGUgZW51bXMgZHVlIHRvIGNhcmdvIGN1bHQgcHJvZ3JhbW1pbmcgYW5kIGFyZQorCSAgdW51c2VkLiBSZW1vdmluZyB0aGVtLgorCisyMDE1LTA0LTI0IDAwOjMwOjM1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGxldmVsOiBmaXggaW5maW5pdGUgbG9vcCBmb3IgdmVyeSBsb3cgaW50ZXJ2YWwgdmFsdWVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1NTE1CisKKzIwMTUtMDQtMjMgMTY6MDg6NTQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IGRlZmluZSBHU1RfQ0hFQ0tfVEVTVF9FTlZJUk9OTUVOVF9CRUFDT04KKwkgIE1ha2Ugc3VyZSB0aGUgdGVzdCBlbnZpcm9ubWVudCBpcyBzZXQgdXAuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy8vc2hvd19idWcuY2dpP2lkPTc0NzYyNAorCisyMDE1LTA0LTIzIDE2OjA4OjMyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGJ1bXAgYXV0b21ha2UgcmVxdWlyZW1lbnQgdG8gMS4xNCBhbmQgYXV0b2NvbmYgdG8gMi42OQorCSAgVGhpcyBpcyBvbmx5IHJlcXVpcmVkIGZvciBidWlsZHMgZnJvbSBnaXQsIHBlb3BsZSBjYW4gc3RpbGwKKwkgIGJ1aWxkIHRhcmJhbGxzIGlmIHRoZXkgb25seSBoYXZlIG9sZGVyIGF1dG90b29scy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnLy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3NjI0CisKKzIwMTUtMDQtMjMgMTY6MDY6NTcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIC5naXRpZ25vcmU6CisJICBVcGRhdGUgLmdpdGlnbm9yZQorCisyMDE1LTA0LTIzIDA5OjU1OjU5ICswMjAwICBKZXNwZXIgTGFyc2VuIDxrbm9yci5qZXNwZXJAZ21haWwuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBGaXggUlRDUCBjYXBzIGxlYWsKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnLy9zaG93X2J1Zy5jZ2k/aWQ9NzQ4MzUzCisKKzIwMTUtMDQtMjIgMjA6MjQ6MjAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBXaGVuIHJlcXVlc3QgcmV0cmFuc21pc3Npb25zIGZvciBmdXR1cmUgcGFja2V0cywgY29uc2lkZXIgdGhlIHBhY2tldCBzcGFjaW5nIGluIHRoZSBleHRyYSBkZWxheQorCSAgV2Ugbm93IHRha2UgdGhlIG1heGltdW0gb2YgMipqaXR0ZXIgYW5kIDAuNSpwYWNrZXRfc3BhY2luZyBmb3IgdGhlIGV4dHJhCisJICBkZWxheS4gSWYgaml0dGVyIGlzIHZlcnkgbG93LCB0aGlzIHNob3VsZCBwcmV2ZW50IHVubmVjZXNzYXJ5IHJldHJhbnNtaXNzaW9uCisJICByZXF1ZXN0cyB0byBzb21lIGRlZ3JlZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDgwNDEKKworMjAxNS0wNC0yMiAxOTo0MTowNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IFRha2UgYSBydW5uaW5nIGF2ZXJhZ2Ugb2YgdGhlIHBhY2tldCBzcGFjaW5ncyBpbnN0ZWFkIG9mIGp1c3QgdGhlIGxhdGVzdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0ODA0MQorCisyMDE1LTA0LTEzIDExOjIwOjQwICswMjAwICBNaWd1ZWwgUGFyw61zIETDrWF6IDxtcGFyaXNkaWF6QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IEFkZCAicnR4LW5leHQtc2VxbnVtIiBwcm9wZXJ0eQorCSAgSWYgdGhpcyBpcyBzZXQgdG8gRkFMU0UsIHJ0cGppdHRlcmJ1ZmZlciB3aWxsIG5vdCByZXF1ZXN0IHJldHJhbnNtaXNzaW9ucyBmb3IKKwkgIGZ1dHVyZSBwYWNrZXRzIGJhc2VkIG9uIHdoZW4gdGhleSBhcmUgZXN0aW1hdGVkIHRvIGFycml2ZS4KKwkgIFNlZSBhbHNvIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDgwNDEKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk4NjgKKworMjAxNS0wNC0yMiAxOToyOTozNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jOgorCSAgcnR4cmVjZWl2ZTogUHV0IGRlYnVnIG91dHB1dCBmb3IgcmV0cmFuc21pc3Npb24gcmVxdWVzdHMgYXQgdGhlIHJpZ2h0IHBsYWNlCisJICBCZWZvcmUgaXQgd2FzIG9ubHkgZXZlciBwcmludGVkIG9uY2UgZm9yIGV2ZXJ5IHRpbWUgYSBzc3JjIHdhcyBhc3NvY2lhdGVkIHdpdGgKKwkgIGEgc3BlY2lmaWMgc3RyZWFtLgorCisyMDE1LTA0LTIyIDE4OjA1OjI0ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogZG9uJ3QgYWRkIHRoZSBzYW1lIGludGVybGFjZSBtb2RlIHR3aWNlCisJICBTb21lIGRyaXZlcnMgbW9kaWZ5IHRoZSBpbnRlcmxhY2UgbW9kZSB0byBwcm9ncmVzc2l2ZSwgbm8gbWF0dGVyIHdoYXQKKwkgIGlucHV0IHlvdSBnaXZlIHRoZW0sIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGFkZCB0aGUgc2FtZSBpbnRlcmxhY2UgbW9kZQorCSAgdHdpY2UuCisKKzIwMTUtMDQtMjEgMTY6MzQ6MjEgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJICBlcXVhbGl6ZXI6IGZpeCBkeW5hbWljIGNoYW5nZXMgb24gYmFuZHMKKwkgIFdoZW4gd2UgYXJlIGluIHBhc3N0aHJvdWdoLCB0aGUgdHJhbnNmb3JtIGZ1bmN0aW9uIGRvZXNuJ3QgcnVuIGFuZCBpZiB0aGUKKwkgIHBhc3N0aHJvdWdoIGNoZWNrIGlzIGluIHRoaXMgZnVuY3Rpb24gaXQgd2lsbCBuZXZlciBiZSBkZWFjdGl2YXRlZC4gRml4IHRoaXMgYnkKKwkgIGNoZWNraW5nIGRpcmVjdGx5IHdoZW5ldmVyIGEgZ2FpbiBpcyBjaGFuZ2VkLgorCSAgQWxzbyBzZXQgdGhlIHBhc3N0aHJvdWdoIHRvIFRSVUUgYXQgaW5pdCBiZWNhdXNlIHRoZSBnYWlucyBkZWZhdWx0IHRvIDAsIHNvIHdlCisJICBjYW4gcGFzc3Rocm91Z2ggdW50aWwgYW55IGdhaW4gcHJvcGVydHkgaXMgY2hhbmdlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDgwNjgKKworMjAxNS0wNC0yMiAxMDozMDo1MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogSU5TVEFMTDoKKwkgIFJlbW92ZSBJTlNUQUxMIGZpbGUKKwkgIGF1dG90b29scyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHRoaXMsIGFuZCB3aGVuIHVzaW5nIGRpZmZlcmVudCB2ZXJzaW9ucworCSAgZm9yIGF1dG9nZW4uc2ggdGhlcmUgd2lsbCBhbHdheXMgYmUgY2hhbmdlcyB0byBhIGZpbGUgdHJhY2tlZCBieSBnaXQuCisKKzIwMTUtMDQtMjIgMTA6MzA6MTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIExJQ0VOU0VfcmVhZG1lOgorCSAgUmVtb3ZlIExJQ0VOU0VfcmVhZG1lCisJICBJdCdzIGNvbXBsZXRlbHkgb3V0ZGF0ZWQgYW5kIGp1c3QgY29uZnVzaW5nLCBiZXR0ZXIgaWYgcGVvcGxlIGFyZQorCSAgZm9yY2VkIHRvIGxvb2sgYXQgdGhlIGFjdHVhbCBjb2RlIGluIHF1ZXN0aW9uIHRoYW4gdHJ1c3RpbmcgdGhpcyBmaWxlLgorCisyMDE1LTA0LTIxIDE1OjIxOjMzICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBjYXN0IHVudXNlZCByZXR1cm4gdG8gdm9pZAorCSAgUXVlbGwgdW5jaGVja2VkIHJldHVybiB2YWx1ZSBkZWZlY3QgYnkgY2FzdGluZyB0aGUgcmV0dXJuIHZhbHVlIHRvIHZvaWQgYW5kCisJICBtYWtpbmcgaXQgZXhwbGljaXQgaXQgaXMgZ29pbmcgdG8gYmUgaWdub3JlZC4KKwkgIENJRCAjMjA2MDMxCisKKzIwMTUtMDQtMTcgMTM6MDg6MDIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkgIHZwOGRlYzogb3B0aW1pemUgdnB4IGltYWdlIHRvIGdzdGJ1ZmZlciBjb3B5IHdoZW4gc3RyaWRlcyBtYXRjaAorCSAgU29sdmluZyB0aGlzIEZJWE1FLiBDb3B5IHRoZSBmdWxsIHBsYW5lIHdoZW4gc3RyaWRlcyBhcmUgdGhlIHNhbWUKKworMjAxNS0wNC0xNiAxNToxMTowNSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOWRlYy5jOgorCSAgdnA5ZGVjOiBvcHRpbWl6ZSB2cHggaW1hZ2UgdG8gZ3N0YnVmZmVyIGNvcHkgd2hlbiBzdHJpZGVzIG1hdGNoCisJICBTb2x2aW5nIHRoaXMgRklYTUUuIENvcHkgdGhlIGZ1bGwgcGxhbmUgd2hlbiBzdHJpZGVzIGFyZSB0aGUgc2FtZQorCisyMDE1LTA0LTE3IDEzOjMyOjU0ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IGZpeCBtZW1vcnkgbGVhaworCisyMDE1LTA0LTE3IDA2OjUxOjQ2ICswMDAwICBBbGV4IE8nS29uc2tpIDxhbGV4YW5kZXJva29uc2tpQGdtYWlsLmNvbT4KKworCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJICBpY3lkZW11eDogRml4IHNlZ2ZhdWx0IGlmIG1ldGFkYXRhLWludGVydmFsIGlzIDAKKwkgIFByZXZlbnRzIGFuIGV4dHJhIHVucmVmIG9mIEdzdEJ1ZmZlciB3aGVuIHBhc3NpbmcgYSBub24taWN5IHN0cmVhbSB0aHJvdWdoCisJICBpY3lkZW11eCB3aXRoIG1ldGFkYXRhLWludGVydmFsIHNldCB0byAwLgorCSAgUmVwcm9kdWNpYmxlIHdpdGg6CisJICBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPX4vdGVzdHNvbmcubXAzICEgXAorCSAgJ2FwcGxpY2F0aW9uL3gtaWN5LG1ldGFkYXRhLWludGVydmFsPShpbnQpMCcgISBpY3lkZW11eCAhIGRlY29kZWJpbiAhIHdhdmVuYyAhIFwKKwkgIGZpbGVzaW5rIGxvY2F0aW9uPX4vdGVzdHNvbmcud2F2CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ4MDI0CisKKzIwMTUtMDQtMTcgMTE6NTQ6MjMgKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jOgorCSAgYXVkaW9meDogZml4IHR5cG8gaW4gZXhhbXBsZSBwaXBlbGluZXMKKwkgIEZpeCB0eXBvIGluIGV4YW1wbGUgcGlwZWxpbmVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ4MDIyCisKKzIwMTUtMDQtMTUgMTg6MjI6MzcgKzAzMDAgIElseWEgS29uc3RhbnRpbm92IDxpbHlhLmtvbnN0YW50aW5vdkBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9oYWwuYzoKKwkgIG9zeGF1ZGlvOiBmaXggc3BlbGxpbmcgaW4gZGVidWcgbWVzc2FnZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvL3Nob3dfYnVnLmNnaT9pZD03NDc5MzYKKworMjAxNS0wNC0xNiAxNjozMzo0NCArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogdGVzdHMvZXhhbXBsZXMvZXF1YWxpemVyL2RlbW8uYzoKKwkgIHRlc3RzOiBzZWxlY3RhYmxlIGFtb3VudCBvZiBiYW5kcyBpbiBlcXVhbGl6ZXIgZGVtbworCSAgQWRkaW5nIGFuIG9wdGlvbiBpbiB0aGUgZXF1YWxpemVyIGRlbW8gdG8gbWFrZSB0aGUgbnVtYmVyIG9mIGJhbmRzIHNlbGVjdGFibGUuCisKKzIwMTUtMDQtMTYgMTU6MzE6MjUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlL3J0cHJ0eHNlbmQ6IEFsc28gcGFzcyBjb3JyZWN0IHNlcW51bS1vZmZzZXQgYW5kIHBheWxvYWQgdG8gdGhlIFJUWCBydHBzb3VyY2UKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDczOTQKKworMjAxNS0wNC0wNiAxMjo1Njo1MCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IFRyYWNrIFJUWCBzc3JjIGNhcHMKKwkgIFRoaXMgaXMgbmVlZGVkIHNvIHRoYXQgd2UgY2FuIGdlbmVyYXRlIFNSIGZvciBSVFggc3RyZWFtIGNvcnJlY3RseSAodGhlCisJICBjbG9jayByYXRlIGlzIHJlcXVpcmVkKS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDczOTQKKworMjAxNS0wNC0xNCAxMzo1NjozOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSAgcnRwcnR4c2VuZDogQ29weSBvdmVyIHRpbWVzdGFtcHMgZnJvbSB0aGUgb3JpZ25hbCBidWZmZXJzIHRvIHRoZSBSVFggYnVmZmVycworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NzM5NAorCisyMDE1LTA0LTE2IDE2OjAxOjUwICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSAgdGVzdHM6IHN3aXRjaCBlcXVhbGl6ZXIgZGVtbyB0byBwbGF5IGZyb20gdXJpCisJICBTd2l0Y2ggdGhlIGVxdWFsaXplci1uYmFuZHMgZGVtbyB0byB1c2UgdXJpZGVjb2RlYmluLCBzbyB1c2VycyBjYW4gbGlzdGVuIHRvCisJICBzb21ldGhpbmcgbW9yZSBwbGVhc2FudCB0aGFuIHdoaXRlIG5vaXNlLiBJZiBhbnlib2R5IG1pc3NlcyB0aGUgd2hpdGUgbm9pc2UKKwkgIGEgdXJpIGhhbmRsZXIgdG8gYXVkaW90ZXN0c3JjIGNhbiBiZSB1c2VkLgorCisyMDE1LTA0LTE2IDExOjE3OjM4ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSAgdGVzdHM6IGltcHJvdmUgcmVhZGFiaWxpdHkgb2YgZXF1YWxpemVyIGRlbW8KKwkgIFJlbmFtZSB2YXJpYWJsZSBuYW1lIHRvIG1ha2UgaXQgbW9yZSByZWFkYWJsZSwgYWRkIGNvbW1lbnRzIGZvciB0aGUgdGhyZWUKKwkgIHNjYWxlcyBjcmVhdGVkIHBlciBibG9jaywgYW5kIHNldCB0aGUgd2luZG93IHRpdGxlLgorCisyMDE1LTA0LTE1IDE3OjMyOjM3ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSAgdGVzdHM6IGFkZCBtaXNzaW5nIGxpY2Vuc2UgaGVhZGVyIGZvciBlcXVhbGl6ZXIgZGVtbworCisyMDE1LTA0LTE2IDEzOjA5OjE5ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggdGFnIGxpc3QgbGVha3Mgb24gZXJyb3IgcGF0aHMKKworMjAxNS0wNC0xNiAxMjoyMzozOCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IHRhZyBsaXN0IGxlYWsgb24gdW5rbm93biBzdHJlYW0gdHlwZQorCisyMDE1LTA0LTA5IDEzOjE5OjQ5ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZ3N0LXBsdWdpbnMtZ29vZC5zdXBwOgorCSAgc3VwcHJlc3Npb25zOiBpZ25vcmUgYW4gYXBwYXJlbnQgYnVnIGluIHN0cnRvZAorCSAgQSBidWZmZXIgb3ZlcnJlYWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3NTU0CisKKzIwMTUtMDQtMTUgMTE6MDc6MjcgKzAyMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IGRvIG5vdCBhY2Nlc3MgcHJvcGVydHkgdmFyaWFibGUgd2l0aG91dCB0aGUgb2JqZWN0IGxvY2ssIHVzZSB0aGUgbG9jYWwgc3RhY2sgY29weSBpbnN0ZWFkCisKKzIwMTUtMDQtMTQgMTg6NDU6NDQgKzAyMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IGFkZCBwcm9iZSBvbiB0aGUgbXVsdGlxdWV1ZSdzIHNpbmsgcGFkIGluc3RlYWQgb2YgdGhlIGdob3N0IHBhZAorCSAgYmVjYXVzZSBfcmVsZWFzZV9wYWQgdHJpZXMgdG8gcmVsZWFzZSBpdCBmcm9tIGN0eC0+c2lua3BhZCwgd2hpY2ggaXMKKwkgIG11bHRpcXVldWUncyBzaW5rIHBhZCwgYW5kIGN1cnJlbnRseSBmYWlscyBiZWNhdXNlIHRoZSBwcm9iZSBpcyBub3QKKwkgIGluc3RhbGxlZCB0aGVyZQorCisyMDE1LTA0LTE0IDE5OjA4OjI0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJICBydHBydHgqOiBGaXggdHlwb3MKKworMjAxNS0wNC0xNCAxNzoyNDo0NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogTm90IHNlbmRpbmcgZWFybHkgUlRDUCBub3cgYmVjYXVzZSBvZiBkaXRoZXJpbmcgbWVhbnMgd2Ugc2VuZCBpdCB3aXRoIHRoZSBuZXh0IGNvbXBvdW5kIHBhY2tldAorCisyMDE1LTA0LTE0IDE2OjI3OjE4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBJbXByb3ZlIGRlYnVnIG91dHB1dCBhIGJpdCBpZiB3ZSBjYW4ndCBhbGxvdyBlYXJseSBmZWVkYmFjaworCisyMDE1LTA0LTA3IDE4OjAwOjUzIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOGRlcGF5LmM6CisJICBydHB2cDhkZXBheTogV2hlbiBkcm9wcGluZyBpbnRyYSBwYWNrZXQsIHJlcXVlc3Qga2V5ZnJhbWUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDcyMDgKKworMjAxNS0wNC0xMyAyMDoyNTowMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IENoYW5nZSByZXN5bmNpbmcgR1NUX1dBUk5JTkcgdG8gR1NUX0lORk8KKwkgIFRoaXMgYWxzbyBoYXBwZW5zIGluIHRoZSB2ZXJ5IGJlZ2lubmluZyB3aGVuIHdlIHJlY2VpdmUgdGhlIGZpcnN0IHBhY2tldCwgYQorCSAgd2FybmluZyB3b3VsZCBiZSB2ZXJ5IGNvbmZ1c2luZyBoZXJlLiBJbiBhbGwgcGxhY2VzIHdoZXJlIHdlIHNob3VsZCB3YXJuIGFib3V0CisJICB0aGlzLCB3ZSB3b3VsZCd2ZSBwcmludGVkIGEgd2FybmluZyBhbHJlYWR5IGJlZm9yZS4KKworMjAxNS0wNC0wMiAxMzoyNjo0MSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICBtdWx0aWZpbGVzaW5rOiBtaW5vciBkb2NzIGltcHJvdmVtZW50CisKKzIwMTQtMTEtMDYgMTI6MDg6MDMgKzAxMDAgIE1pZ3VlbCBQYXLDrXMgRMOtYXogPG1wYXJpc2RpYXpAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogQWRkICJydHgtbWF4LXJldHJpZXMiIHByb3BlcnR5CisJICBUaGlzIHByb3BlcnR5IGFsbG93cyB0byBsaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmFuc21pc3Npb24KKwkgIGZvciBhIHNwZWNpZmljIHBhY2tldC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk4NjgKKworMjAxNC0xMS0wNCAxNTowMDo1MiArMDEwMCAgTWlndWVsIFBhcsOtcyBEw61heiA8bXBhcmlzZGlhekBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBGaXggZXhwZWN0ZWRfZHRzIGNhbGMgaW4gY2FsY3VsYXRlX2V4cGVjdGVkCisJICBSaWdodCBhYm92ZSB3ZSBjb25zaWRlciBsb3N0X3BhY2tldCBwYWNrZXRzLCBlYWNoIG9mIHRoZW0gaGF2aW5nIGR1cmF0aW9uLAorCSAgYXMgbG9zdCBhbmQgdHJpZ2dlcmVkIHRoZWlyIHRpbWVycyBpbW1lZGlhdGVseS4gQmVsb3cgd2UgdXNlIGV4cGVjdGVkX2R0cworCSAgdG8gc2NoZWR1bGUgcmV0cmFuc21pc3Npb24gb3Igc2NoZWR1bGUgbG9zdCB0aW1lcnMgZm9yIHRoZSBwYWNrZXRzIHRoYXQKKwkgIGNvbWUgYWZ0ZXIgZXhwZWN0ZWRfZHRzLgorCSAgQXMgd2UganVzdCB0cmlnZ2VyZWQgbG9zdF9wYWNrZXRzIHBhY2tldHMgYXMgbG9zdCwgdGhlcmUncyBubyBwb2ludCBpbgorCSAgc2NoZWR1bGluZyBuZXcgdGltZXJzIGZvciB0aGVtIGFuZCB3ZSBjYW4ganVzdCBza2lwIG92ZXIgYWxsIGxvc3QgcGFja2V0cy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk4NjgKKworMjAxNS0wMy0yMCAxODoyMTo1NyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IE1ha2UgdGhlIG5leHQgb3V0cHV0IGJ1ZmZlciBkaXNjb250IGFmdGVyIHJlc2V0dGluZyB0aGUgaml0dGVyYnVmZmVyCisJICBSZXNldHRpbmcgdGhlIGppdHRlcmJ1ZmZlciBkcm9wcyBhbGwgcGFja2V0cyBhbmQgb3RoZXIgdGhpbmdzLCBhbmQgd2lsbCBjYXVzZQorCSAgYSBkaXNjb250aW51aXR5IGluIHRoZSBwYWNrZXRzIHJlY2VpdmVkIGJ5IHRoZSBkZXBheWxvYWRlcnMuIFRoZXkgc2hvdWxkIG5vdworCSAgYWxzbyBmbHVzaCBhbnl0aGluZyB0aGV5IGhhZCBwZW5kaW5nIGFzIHRoZSBuZXcgZGF0YSB3aWxsIHN0YXJ0IGF0IGEgZGlmZmVyZW50CisJICBwb3NpdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk4NjgKKworMjAxNS0wNC0xMCAwOToxNzoyNiArMDkwMCAgSHl1bmp1biBLbyA8enpvb24ua29Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogVXBkYXRlIHNlZ21lbnQuc3RhcnQgYWZ0ZXIga2V5LXVuaXQgc2VlaworCSAgV2hlbiBkb2luZyBrZXkgdWludCBzZWVrLCBxdGRlbXV4IGNhbGxzIGdzdF9xdGRlbXV4X2FkanVzdF9zZWVrCisJICB0byBnZXQgcHJvcGVyIG9mZnNldC4gQW5kIHRoZW4gdGhpcyBvZmZzZXQgaXMgc2V0IHRvCisJICBzZWdtZW50LnBvc2l0aW9uIGFuZCBzZWdtZW50LnRpbWUgaW4gZ3N0X3F0ZGVtdXhfcGVyZm9ybV9zZWVrIGJ1dAorCSAgc2VnbWVudC5zdGFydCBpcyBub3QgdXBkYXRlZC4KKwkgIEFmdGVyIHRoYXQsIGFwcGxpY2F0aW9uIHNlbmRzIHNlZ21lbnQgcXVlcnksCisJICBxdGRlbXV4IHNldHMgc3RhcnQgYW5kIHN0b3AgdG8gcXVlcnkgdXNpbmcgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUuIER1ZQorCSAgdG8gdGhlIHdyb25nIHZhbHVlIGluIHNlZ21lbnQuc3RhcnQsIHRoZSBzdG9wIHBvc2l0aW9uIGlzIHNtYWxsZXIgdGhhbgorCSAgaXQgc2hvdWxkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjgyMgorCisyMDE1LTA0LTA3IDE2OjEyOjQwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiByZW1vdmUgdXNlbGVzcyB2YXJpYWJsZSBkb19wdHMKKwkgIFdlIGFsd2F5cyB3cml0ZSB0aGUgQ1RUUyBpbiBxdG11eC4gSWRlYWxseSB3ZSBvbmx5IHdhbnQgdG8gZG8gdGhhdAorCSAgZm9yIHN0cmVhbXMgdGhhdCBuZWVkIERUUywgaXQgc2hvdWxkIGJlIHByZXNlbnQgb24gdGhlIHRyYWNrIGluZm9ybWF0aW9uCisJICByYXRoZXIgdGhhbiBiZSBkZWNpZGVkIGJhc2VkIG9uIGVhY2ggYnVmZmVyCisKKzIwMTUtMDQtMDcgMDA6NTM6MzUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHJlbW92ZSBzdWJ0cmFjdGlvbiB0aGF0IG1ha2VzIFBUUy9EVFMgc3RhcnQgZnJvbSAwCisJICBBcyBxdCB1c2VzIGR1cmF0aW9ucywgaXQgZG9lc24ndCBtYXR0ZXIsIG9ubHkgdGhlIGRpZmZlcmVuY2UKKwkgIGJldHdlZW4gY29uc2VjdXRpdmUgYnVmZmVycyBpcyBpbXBvcnRhbnQuIEFsc28sIGNvbGxlY3RwYWRzCisJICBhbHJlYWR5IHJlcGxhY2VzIFBUUy9EVFMgd2l0aCB0aGUgcnVubmluZyB0aW1lcyBmb3IgdGhlbS4KKworMjAxNS0wNC0wNiAyMjozNjo0MyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgdGVzdHM6IHF0bXV4OiBhZGQgdGVzdHMgdG8gdmVyaWZ5IGl0IGhhbmRsZXMgbm9uLTAgc2VnbWVudHMKKwkgIEJvdGggaW5wdXQgc3RyZWFtcyBpbiB0aGlzIHRlc3QgaGF2ZSBhIHNlZ21lbnQuc3RhcnQgPSAxMHMsIHNvCisJICBvdXRwdXQgc2hvdWxkIHN0YXJ0IGZyb20gMCBhbnl3YXkuCisJICBBbm90aGVyIHRlc3QgaGFzIGJvdGggc3RhcnRpbmcgYXQgbm9uLTAgc2VnbWVudHMsIGJ1dCB0aGUgcnVubmluZworCSAgdGltZSBvZiBib3RoIHN0cmVhbXMgc2hvdWxkIHN0aWxsIHN0YXJ0IGZyb20gMAorCisyMDE1LTA0LTA2IDIwOjAzOjE5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJICB0ZXN0czogcXRtdXg6IHNpbXBsZSBtdXhpbmcgdGVzdAorCSAgQWRkcyBhIG5ldyBzaW1wbGUgdGVzdCB0aGF0IHZlcmlmaWVzIHRoYXQgZGF0YSBpcyBwcm9wZXJseSBtdXhlZAorCSAgYW5kIHByZXNlcnZlZC4gIFBUUywgRFRTLCBkdXJhdGlvbiBhbmQgY2FwcyBhcmUgdmVyaWZpZWQuCisKKzIwMTUtMDQtMTAgMTA6NTk6MjYgKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuaDoKKwkgIHNtcHRlOiByZW1vdmUgdW51c2VkIGZpZWxkcworCSAgUmVtb3ZlIHRoZSBmaWVsZHMgLSBmb3JtYXQgYW5kIGZwcyBmcm9tIHNtcHRlCisJICBhcyB0aGV5IGFyZSB1bnVzZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3NTk3CisKKzIwMTUtMDQtMTAgMTA6Mjk6NDcgKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hbHBoYS5jOgorCSAgdGVzdHM6IGFkZCB0ZXN0IHN1aXRlIGZvciBhbHBoYQorCSAgQWRkZWQgdGVzdCBzdWl0ZSBmb3IgYWxwaGEgZWxlbWVudCB3aXRoIHRlc3QgY2FzZXMKKwkgIDEuIGFscGhhCisJICAyLiBjaHJvbWEga2V5aW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3NTk1CisKKzIwMTUtMDQtMDkgMTI6NTg6NDYgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9nc3QtcGx1Z2lucy1nb29kLnN1cHA6CisJICBzdXBwcmVzc2lvbnM6IGFkZCBhIHdlbGwga25vd24gemxpYiBpbmZsYXRlIGJ1ZworCisyMDE1LTA0LTA5IDEyOjU4OjI2ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkgIHNwbGl0bXV4c2luazogZml4IG11dGV4IGxlYWsKKworMjAxNS0wNC0wOSAxMjo1ODowNCArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSAgdGVzdHM6IEZpeCBydHBydHggdGVzdCBieSBoYW5kbGluZyBidWZmZXIgbGlzdHMKKwkgIENvbW1pdCAjMTAxOGFhIG1hZGUgcnRwcnR4c2VuZCBoYW5kbGUgYnVmZmVyIGxpc3RzLCBicmVha2luZworCSAgdGhlIHRlc3Qgd2hpY2ggcHJvYmVzIGZvciBidWZmZXJzLCBidXQgbm90IGJ1ZmZlciBsaXN0cy4KKwkgIFVzZSBhIHV0aWxpdHkgZnVuY3Rpb24gdG8gcnVuIHRoZSBwcm9iZSBjYWxsYmFjayBvbiBlYWNoIGJ1ZmZlcgorCSAgaW4gdGhlIGxpc3QgaW4gdHVybiBhbmQgcmVtb3ZlIGFueSBidWZmZXJzIHRoYXQgYXJlIGRyb3BwZWQuCisKKzIwMTUtMDQtMDEgMTE6MTU6MzggKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4Lmg6CisJICBpc29tcDQ6IFJlZmFjdG9yIHZhcmlvdXMgc3RhdGUgdmFyaWFibGVzIGludG8gYSBtdXhfbW9kZSB2YXIKKwkgIEluc3RlYWQgb2YgY2hlY2tpbmcgdmFyaW91cyBzdGF0ZSB2YXJpYWJsZXMgYXJvdW5kIHRoZSBtdXhlciwKKwkgIHRyYWNrIHRoZSBjdXJyZW50IG11eGluZyBtb2RlIGluIGEgc2luZ2xlICdtdXhfbW9kZScgZW51bS4KKwkgIEFkZCBzb21lIGltcGxlbWVudGF0aW9uIG5vdGVzIGFib3V0IHRoZSBkaWZmZXJlbnQgbXV4IG1vZGVzCisKKzIwMTUtMDQtMDggMTY6NDA6MDIgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjZW50cmljdWxhci5jb20+CisKKwkqIGNvbW1vbjoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IFVzZSBBTV9URVNUU19FTlZJUk9OTUVOVAorCSAgTmVlZGVkIGJ5IHRoZSBuZXcgYXV0b21ha2UgdGVzdCBydW5uZXIKKworMjAxNS0wNC0wOCAxMToxNzozMSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkgIHJ0cGgyNjNkZXBheTogRml4IGZyYW1lc2l6ZSBwYXJzaW5nCisJICBUaGUgc3RyaW5nIHBhc3NlZCB0byB0aGUgcGFyc2luZyBmdW5jdGlvbiBvbmx5IGNvbnRhaW5zIGEgZnJhbWVzaXplLCBhbmQKKwkgIG5vdCA8cHQ+ICsgPGZyYW1lc2l6ZT4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjY0MTYKKworMjAxNS0wMy0yMCAxMjoxODozNyArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IGNsaXAgY2h1bmsgc2l6ZSBhYm92ZSB0aGUgdmFsaWQgbWF4aW11bSAoMHg3ZmZmZmZmZikKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjI1NjcKKworMjAxNS0wMy0yMCAwOTowNzozNSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IGNsaXAgY2h1bmsgbGVuZ3RoIHRvIGF2YWlsYWJsZSBkYXRhICh3aGVuIGtub3duKQorCSAgVGhpcyBwcmV2ZW50cyBzaWxseSBjaHVuayBsZW5ndGhzIGZyb20gcG9zc2libHkgb3ZlcmZsb3dpbmcKKwkgIChhdCBsZWFzdCB3aGVuIHdlIGtub3cgdGhlIGFjdHVhbCBkYXRhIGxlbmd0aCkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIyNTY3CisKKzIwMTUtMDQtMDYgMjA6MTc6NTIgLTA3MDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRG9uJ3QgYWNjdW11bGF0ZSBzZWdtZW50IGJhc2VzIG1hbnVhbGx5CisJICBnc3Rfc2VnbWVudF9kb19zZWVrKCkgZG9lcyB0aGF0IGZvciB1cyBhbHJlYWR5LCBhbmQgZG9pbmcgaXQgdHdpY2UKKwkgIHdpbGwgYnJlYWsgbm9uLWZsdXNoaW5nIHNlZWtzIGluIGludGVyZXN0aW5nIHdheXMuIExlZnRvdmVyIGZyb20gMS4wCisJICBwb3J0aW5nLgorCSAgQWxzbyBjb3B5IG92ZXIgc2VnbWVudCBvZmZzZXQgYW5kIGFwcGxpZWRfcmF0ZSwganVzdCBpbiBjYXNlLgorCisyMDE1LTA0LTA2IDE5OjA4OjEwIC0wNzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9pY2xlcy90ZXN0LXNlZ21lbnQtc2Vla3MuYzoKKwkgIGljbGVzOiBGaXggd2FpdGluZyBmb3Igc2VnbWVudC1kb25lIGlmIGl0IGhhcHBlbnMgdG9vIGZhc3QKKwkgIFNvbWV0aW1lcyB3ZSBjYW4gZ2V0IHNlZ21lbnQtZG9uZSBiZWZvcmUgd2UgZ290IGFzeW5jLWRvbmUuIElmIHdlIHdhaXRlZAorCSAgZm9yIGFzeW5jLWRvbmUgb25seSwgdGhlIHNlZ21lbnQtZG9uZSB3b3VsZCBiZSBkcm9wcGVkIGFuZCB3ZSB3b3VsZCB3YWl0CisJICBmb3JldmVyIGZvciBpdCBhIGZldyBsaW5lcyBiZWxvdy4KKworMjAxNS0wNC0wNiAxODo1NTowOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHN0YmxfaW5kZXggaXMgdmFsaWQgZnJvbSAwIG9ud2FyZHMKKwkgIEl0IGluZGljYXRlcyB0aGUgbGFzdCBzYW1wbGUgcGFyc2VkLCBub3QgdGhlIG5leHQgb25lIHRvIHBhcnNlLgorCSAgQXMgaXQgc3RhcnRzIGluIC0xLCBhbnkgdmFsdWUgZnJvbSAwIG9ud2FyZHMgbWVhbnMgdGhhdCBpdCBoYXMKKwkgIHNvbWUgdmFsaWQgZGF0YS4KKworMjAxNS0wNC0wNSAyMDowNjowOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgZG9jczogbWFrZSBHc3RSVENQU3luYyBlbnVtIHNob3cgdXAgaW4gcnRwYmluIGRvY3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDczNTgKKworMjAxNS0wNC0wNSAxMTo0NTo0NSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBkb2NzOiBhZGQgUlRQSml0dGVyQnVmZmVyTW9kZSBlbnVtIHRvIHJ0cGJpbiBkb2NzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3MzU4CisKKzIwMTUtMDQtMDQgMTE6NTU6MDAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICBtdWx0aWZpbGVzaW5rOiBjbG9zZSBmaWxlcyBiZWZvcmUgcG9zdGluZyBtZXNzYWdlCisJICBNYWtlcyBzdXJlIHRoZSBmaWxlcyB3ZXJlIHByb3Blcmx5IGZsdXNoZWQgYW5kIGNsb3NlZCBiZWZvcmUKKwkgIHRoZSBtZXNzYWdlIHJlYWNoZXMgdGhlIGFwcGxpY2F0aW9uCisKKzIwMTUtMDMtMzAgMTM6NTQ6MjMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsdGlmaWxlLmM6CisJICB0ZXN0czogbXVsdGlmaWxlOiBpbmNyZW1lbnQgdGVzdHMgdG8gY2hlY2sgZm9yIG11bHRpZmlsZSBtZXNzYWdlcworCSAgQWxzbyB2ZXJpZnkgdGhhdCB0aGUgbXVsdGlmaWxlc2luayBmaWxlIG1lc3NhZ2VzIGFyZSBiZWluZyBjb3JyZWN0bHkKKwkgIHBvc3RlZCB0byB0aGUgYnVzCisKKzIwMTUtMDMtMzAgMTI6NTE6MzUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsdGlmaWxlLmM6CisJICB0ZXN0czogbXVsdGlmaWxlOiBoYW5kbGUgRklYTUUgZm9yIHByb3BlciBjaGVja2luZyB3aGVuIHRlc3QgZmluaXNoZWQKKwkgIFVzZSBhIEdzdEJ1cyBhbmQgd2FpdCBmb3IgRU9TIHRvIGZpbmlzaCB0aGUgdGVzdHMgaW5zdGVhZCBvZgorCSAgcmVseWluZyBvbiBzbGVlcGluZworCisyMDE1LTAzLTMwIDExOjE0OjA5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgbXVsdGlmaWxlc2luazogcG9zdCBmaWxlIG1lc3NhZ2Ugb24gRU9TCisJICBXaGVuIG11bHRpZmlsZXNpbmsgaXMgb3BlcmF0aW5nIGluIGFueSBtb2RlIG90aGVyIHRoYW4gb25lIGZpbGUKKwkgIHBlciBidWZmZXIsIHRoZSBsYXN0IGZpbGUgY3JlYXRlZCB3b24ndCBoYXZlIGEgZmlsZSBtZXNzYWdlIHBvc3RlZAorCSAgYXMgbXVsdGlmaWxlc2luayBkb2Vzbid0IGhhbmRsZSB0aGUgRU9TIGV2ZW50LgorCSAgVGhpcyBwYXRjaCBmaXhlcyBpdCBieSB1c2luZyB0aGUgbGFzdCBwb3NpdGlvbiB0byBwb3N0IGEgZmlsZQorCSAgbWVzc2FnZSB3aGVuIEVPUyBpcyByZWNlaXZlZC4gVGhpcyBzaG91bGQgZW5zdXJlIGF0IGxlYXN0IHRoZQorCSAgdGltZSByZWxhdGVkIGRhdGEgYW5kIHRoZSBmaWxlbmFtZSBhcmUgcG9zdGVkIHRvIHRoZSBhcHBsaWNhdGlvbgorCSAgb3Igb3RoZXIgZWxlbWVudHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDcwMDAKKworMjAxNS0wNC0wMyAxODo1Nzo1MCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogYXV0b2dlbi5zaDoKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBiYzc2YThiIHRvIGM4ZmIzNzIKKworMjAxNS0wNC0wMyAwMjowODo1MCArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogR3VhcmQgYWdhaW5zdCA2NC1iaXQgb3ZlcmZsb3cKKwkgIEZvciBsYXJnZS1maWxlIGF0b21zLCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93IGluIHRoZSBzaXplIGZpZWxkLAorCSAgd2hpY2ggY291bGQgbWFrZSB1cyBqdW1wIGJhY2t3YXJkIGluIHRoZSBmaWxlIGFuZCBjYXVzZQorCSAgaW5maW5pdGUgbG9vcHMuCisKKzIwMTUtMDQtMDEgMjM6NDY6MTMgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4Lmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgaXNvbXA0OiBNYWtlIG5vbi1zZWVrYWJsZSBkb3duc3RyZWFtIGFuIGVycm9yIGluIG5vcm1hbCBtb2RlCisJICBXaGVuIG5vdCBpbiBmYXN0LXN0YXJ0IG9yIGZyYWdtZW50ZWQgbW9kZSwgd2UgbmVlZCB0byBiZSBhYmxlCisJICB0byByZXdyaXRlIHRoZSBzaXplIG9mIHRoZSBtZGF0IGF0b20sIG9yIGVsc2UgdGhlIG91dHB1dCBqdXN0CisJICB3b24ndCBiZSBwbGF5YWJsZSAtIHRoZSBtZGF0IHBsYWNlaG9sZGVyIHdpdGggc2l6ZSA9PSAwIHdpbGwKKwkgIGNvdmVyIHRoZSByZXN0IG9mIHRoZSBmaWxlLCBpbmNsdWRpbmcgYW55IG1vb3YgYXRvbSB3ZSB3cml0ZSBvdXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA4ODA4CisKKzIwMTQtMDMtMTUgMTU6MjM6MDEgKzAxMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJhc0Bob3RtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHJ0cGgyNjNwYXkvLWRlcGF5OiBhZGQgZnJhbWVzaXplIFNEUCBhdHRyaWJ1dGUKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjY0MTYKKworMjAxNC0wMy0xNSAxMzozMzo1NiArMDEwMCAgU2ViYXN0aWFuIFJhc211c3NlbiA8c2VicmFzQGhvdG1haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBydHBqcGVncGF5Ly1kZXBheTogUmVtb3ZlIGluY29ycmVjdGx5IGludHJvZHVjZWQgZnJhbWVzaXplIFNEUCBhdHRyaWJ1dGUKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjY0MTUKKworMjAxNS0wMy0yNyAyMTowOTo0NCArMDEwMCAgUGV0ZXIgU2VpZGVyZXIgPHBzLnJlcG9ydEBnbXgubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmg6CisJICB2NGwyc3JjOiBkZXZpY2Ugc2VxdWVuY2Uvb2Zmc2V0IGNvcnJlY3Rpb24gaW4gY2FzZSBvZiByZW5lZ290aWF0aW9uCisJICBUaGUgdjRsMiBkZXZpY2UgcmVzdGFydHMgdGhlIHNlcXVlbmNlIGNvdW50ZXIgaW4gY2FzZSBvZiBzdHJlYW1vZmYvc3RyZWFtb24sCisJICB0aGUgR1NUIG9mZnNldCB2YWx1ZXMgYXJlIHN1cHBvc2VkIHRvIGluY3JlbWVudCBzdHJpY3RseSBtb25vdG9uaWMsIHNvCisJICBhZGp1c3QgdGhlIHNlcXVlbmNlIGNvdW50ZXIvb2Zmc2V0IHZhbHVlcyBpbiBjYXNlIG9mIGNhcHMKKwkgIHJlbmVnb3RpYXRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1NDQxCisKKzIwMTQtMTEtMTQgMTQ6MTg6NTEgKzAxMDAgIFBldGVyIFNlaWRlcmVyIDxwcy5yZXBvcnRAZ214Lm5ldD4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMnNyYzogYWRkIGZyYW1lIGxvc3MgZGV0ZWN0aW9uCisJICBJbiBjYXNlIG9mIHY0bDIgZHJpdmVyIGZpbGxlZCBvZmZzZXQvc2VxdWVuY2UgdmFsdWVzIGFkZCBmcmFtZQorCSAgbG9zcyBkZXRlY3Rpb24gKGFuZCB3cml0ZSBhIHdhcm5pbmcgbWVzc2FnZSkuCisJICBNb3ZlIG9mZnNldCBtZXRhIGRhdGEgc2V0dGluZyBhbmQgZnJhbWUgbG9zcyBjaGVja2luZyBhZnRlciB0aGUKKwkgIHRpbWVzdGFtcCBhZGp1c3RtZW50IGNvZGUgdG8gZ2V0IHByb3BlciB0aW1lc3RhbXBzIGZvciB0aGUKKwkgIHdhcm5pbmcgbWVzc2FnZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDU0NDEKKworMjAxNC0xMS0xNCAxMzo0ODo1MSArMDEwMCAgUGV0ZXIgU2VpZGVyZXIgPHBzLnJlcG9ydEBnbXgubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogdXNlIHY0bDIgY2FwdHVyZSBkZXZpY2Ugc2VxdWVuY2UgY291bnRlcgorCSAgVXNlIHRoZSB2NGwyIGNhcHR1cmUgZGV2aWNlIHNlcXVlbmNlIGNvdW50ZXIgZm9yCisJICBzZXR0aW5nIHRoZSBHc3RCdWZmZXIgb2Zmc2V0L29mZnNldF9lbmQgdmFsdWVzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTQ0MQorCisyMDE1LTAzLTMwIDEzOjEyOjM1ICswMjAwICBUb2JpYXMgTW9kc2NoaWVkbGVyIDx0b2JpYXMubW9kc2NoaWVkbGVyQGNldGl0ZWMuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogQXNrIHRoZSBkcml2ZXIgYWJvdXQgaXRzIHJlcXVpcmVtZW50cyBmb3IgbWluX2J1ZmZlcnMgYmVmb3JlIGluaXRpYXRpbmcgYnVmZmVyIHBvb2wuCisJICBJZiBwcm9wb3NlX2FsbG9jYXRpb24oKSBoYWQgbm90IGJlZW4gY2FsbGVkIHlldCwgaXQgd2FzIHBvc3NpYmxlIHRoYXQgdGhlIGRyaXZlciB3YXMgbm90IGFza2VkIGF0IGFsbC4KKwkgIEluIGJ1ZmZlciBwb29sOiBDb25zaWRlciBtaW5pbXVtIG51bWJlciBvZiBidWZmZXJzIHJlcXVlc3RlZCBieSBkcml2ZXIgd2hlbiBzZXR0aW5nIGNvbmZpZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDY4MzQKKworMjAxNS0wNC0wMSAxOTozMDoyNyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5oOgorCSAgcnRwdnA4ZGVwYXk6IFBhcnNlIHdpZHRoL2hlaWdodC9wcm9maWxlIGZyb20ga2V5ZnJhbWVzCisJICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIG11eCB0aGUgcmVzdWx0IGludG8gYSBjb250YWluZXIKKwkgIHN1Y2ggYXMgbWF0cm9za2EuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3MjA4CisKKzIwMTUtMDQtMDEgMTk6MDE6NDkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJICB2cDhlbmM6IEV4cG9zZSBWUDggd2lkdGgvaGVpZ2h0IGxpbWl0YXRpb25zIGluIHRoZSBjYXBzIHRlbXBsYXRlCisJICBUaGUgVlA4IGZvcm1hdCBzcGVjaWZpY2F0aW9uIChSRkMgNjM4NiBzZWN0aW9uIDE4LjEpIHNwZWNpZmllcworCSAgdGhhdCB0aGUgbWF4aW11bSBzaXplIGlzIDE2MzgzeDE2MzgzLgorCisyMDE1LTAzLTMxIDAwOjIwOjEzICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2OiBXaGVuIHBhc3Npbmcgc2VlayBldmVudCB1cHN0cmVhbSwgaG9sZCBhIHJlZi4KKwkgIEluIGNhc2UgdXBzdHJlYW0gY2FuJ3QgaGFuZGxlIHRoZSBzZWVrLCBtYWtlIHN1cmUgd2UKKwkgIGtlZXAgYSByZWYgb24gdGhlIGV2ZW50IHRvIGF0dGVtcHQgdG8gaGFuZGxlIGl0IG91cnNlbHZlcy4KKworMjAxNS0wMy0yNiAxMzozNDo1MyArMDEwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2E6IGZpeCBHVmFsdWUgbGVha3Mgd2hlbiBwYXJzaW5nIHRhZ3MKKwkgIGdzdF90YWdfbGlzdF9hZGRfdmFsdWUoKSBkb2Vzbid0IGNvbnN1bWUgdGhlIEdWYWx1ZSB3ZSBwYXNzIHRvIGl0IHNvIHRoZXJlIGlzCisJICBubyBwb2ludCBjb3B5aW5nIGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjgxMAorCisyMDE1LTAzLTIzIDIwOjU4OjI1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVzdXJyZWN0IHNvbWUgZmxvdyByZXR1cm4gaGFuZGxpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDQ1NzIKKworMjAxNS0wMy0yMyAyMDo1Nzo1NiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogcmVzdXJyZWN0IHNvbWUgZmxvdyByZXR1cm4gaGFuZGxpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDQ1NzIKKworMjAxNS0wMy0yMyAyMDo1Njo0MSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IHJlc3VycmVjdCBzb21lIGZsb3cgcmV0dXJuIGhhbmRsaW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ0NTcyCisKKzIwMTUtMDMtMjcgMTg6NTg6MzEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thOiBzdG9yZSBzdHJlYW0gdGFncyBhbmQgcHVzaCBhcyB1cGRhdGVkCisJICBOZXcgdGFncyBjYW4gYmUgZm91bmQgb24gZGlmZmVyZW50IHBhcnRzIG9mIHRoZSBmaWxlLCBzbyB0aGlzIHBhdGNoCisJICBrZWVwcyB0aGUgc3RyZWFtIHRhZ2xpc3RzIGFyb3VuZCBmb3IgdGhlIGxpZmUgY3ljbGUgb2YgdGhlIHBhZAorCSAgYW5kIGFkZHMgdGhvc2UgbmV3IHRhZ3MgYXMgZm91bmQuIFRoZW4gYSBuZXcgdGFnIGlzIGZvdW5kLCB0aGUKKwkgIHBhZCdzIGlzIG1hcmtlZCB3aXRoIGEgdGFncyBjaGFuZ2VkIGZsYWcsIG1ha2luZyB0aGUgZWxlbWVudCBwdXNoCisJICBhIG5ldyB0YWcgZXZlbnQgb24gdGhlIG5leHQgY2hlY2suIEJlZm9yZSB0aGlzLCB3ZSB3ZXJlIHNlbmRpbmcKKwkgIG9ubHkgdGhlIG5ld2x5IGZvdW5kIHRhZ3MsIGFzIHRoZSBlbGVtZW50IHdhcyBsb3NpbmcgaXRzIHRhZ2xpc3QKKwkgIHdoZW4gcHVzaGluZyB0aGUgZXZlbnQuCisKKzIwMTUtMDMtMTUgMTQ6NDA6MzYgKzAxMDAgIFJhbWlybyBQb2xsYSA8cmFtaXJvLnBvbGxhQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBzZW5kIGdsb2JhbCB0YWdzIGluY3JlbWVudGFsbHkKKwkgIEluc3RlYWQgb2Ygc2VuZGluZyBvbmx5IG5ldyB0YWdzIG9uY2UgdGhleSBhcmUgZm91bmQsIG1lcmdlIHRoZSB0YWdsaXN0CisJICBhbmQgc2VuZCB0aGVtIGluY3JlbWVudGFsbHkuCisKKzIwMTUtMDMtMTQgMTc6MDc6MDUgKzAxMDAgIFJhbWlybyBQb2xsYSA8cmFtaXJvLnBvbGxhQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2FwYXJzZTogc2VuZCBnbG9iYWwgdGFncworCSAgR2xvYmFsIHRhZ3MgYXJlIGFscmVhZHkgYmVpbmcgcmVhZCBpbiBtYXRyb3NrYXBhcnNlLCBidXQgdGhleSBhcmUgbm90CisJICBjdXJyZW50bHkgYmVpbmcgc2VudC4KKwkgIFRoaXMgcGF0Y2ggbWFrZXMgZ2xvYmFsIHRhZ3MgZ2V0IHNlbnQgaW5jcmVtZW50YWxseSB3aGVuZXZlciBuZXcgb25lcworCSAgYXJlIGZvdW5kLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjI0MgorCisyMDE1LTAyLTAzIDEwOjE4OjU4ICswNTMwICBWaW5lZXRoIFQgTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkgIHF1YXJrdHY6IGZpeCAicGxhbmVzIiBwcm9wZXJ0eSByYW5nZSwgYSB2YWx1ZSBvZiAwIGlzIG5vdCBhbGxvd2VkCisJICBXaGVuIHBsYW5lcyBwcm9wZXJ0eSBpcyBzZXQgdG8gMCwgdGhlIHBpcGVsaW5lIGV4ZWN1dGVzIGluCisJICBhbiBpbmZpbml0ZSBsb29wIGFuZCBuZXZlciBleGl0cy4gU2luY2UgcGxhbmVzIG11c3QgbmV2ZXIKKwkgIGJlIDAsIHNldCB0aGUgbWluaW11bSB2YWx1ZSBpbiB0aGUgcHJvcGVydHkgZGVzY3JpcHRpb24KKwkgIHRvIDEuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQzOTA2CisKKzIwMTUtMDMtMjYgMTM6NDI6MDIgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBGaXggdXAgY29tbWVudHMgcmVnYXJkaW5nIERUUworCisyMDE1LTAzLTI1IDE1OjExOjM0IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IEZpeCBzZWdtZW50IGluIFRDUCBtb2RlCisJICBJdCBpcyBleHBlY3RlZCB0aGF0IGJ1ZmZlcnMgYXJlIHRpbWUtc3RhbXBlZCB3aXRoIHJ1bm5pbmcgdGltZS4gU2V0CisJICBhIHNlZ21lbnQgYWNjb3JkaW5nbHkuIEluIHRoaXMgY2FzZSB3ZSBwaWNrIDAsLTEgYXMgdGhpcyBpcyB3aGF0IHVkcHNyYworCSAgd291bGQgZG8uIERlcGF5bG9hZGVycyB3aWxsIHVwZGF0ZSB0aGUgc2VnbWVudCB0byByZWZsZWN0IHRoZSBwbGF5YmFjaworCSAgcG9zaXRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjM1NzAxCisKKzIwMTUtMDMtMjYgMTI6MjE6MjUgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBiZSBtb3JlIHN0cmljdCBhYm91dCB0eXBlZmluZGluZyBEVFMKKwkgIENvZGUgbm93IG1hdGNoZXMgY29tbWVudHMuCisKKzIwMTUtMDMtMjUgMTU6MTA6NTMgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogUmVtb3ZlIHVzZWxlc3MgZnVuY3Rpb24KKwkgIFRoaXMgZnVuY3Rpb24gZGlkbid0IGRvIGFueXRoaW5nIHNwZWNpYWwsIGxldCdzIG5vdCB1c2UgYSBmdW5jdGlvbiBmb3IKKwkgIHRoYXQuCisKKzIwMTUtMDMtMjAgMTM6MDM6MDkgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXI6IEFjY291bnQgZm9yIHJ0eF9yZXRyeSBpbiBvdmVyZmxvdyBjaGVjaworCSAgQXMgcnR4X3JldHJ5IGlzIHBhcnQgb2YgdGhlIHN1YnN0cmFjdGlvbiwgd2UgbmVlZCB0byB0YWtlIGl0IGludG8KKwkgIGFjY291bnQsIG90aGVyd2lzZSB3ZSBtYXkgZW5kdXAgd2l0aCBhIGJpZyB2YWx1ZS4KKworMjAxNS0wMy0yNCAyMzoxNToxNSArMDAwMCAgSnVsaWVuIElzb3JjZSA8ai5pc29yY2VAc2Ftc3VuZy5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5tOgorCSAgb3N4dmlkZW9zaW5rOiBjaGVjayBmb3IgZGVwcmVjYXRlZCBjb25zdGFudHMgcHJpb3IgdG8gT1NYIDEwLjEwCisJICBjb2NvYXdpbmRvdy5tOjMzOTo1OiBlcnJvcjogJ05TT3BlbkdMUEZBV2luZG93JworCSAgaXMgZGVwcmVjYXRlZDogZmlyc3QgZGVwcmVjYXRlZCBpbiBPUyBYIDEwLjkKKwkgIGNvY29hd2luZG93Lm06NTc2Ojc6IGVycm9yOiAnTlNPcGVuR0xQRkFGdWxsU2NyZWVuJworCSAgaXMgZGVwcmVjYXRlZDogZmlyc3QgZGVwcmVjYXRlZCBpbiBPUyBYIDEwLjYKKwkgIGNvY29hd2luZG93Lm06NjA1OjI0OiBlcnJvcjogJ3NldEZ1bGxTY3JlZW4nCisJICBpcyBkZXByZWNhdGVkOiBmaXJzdCBkZXByZWNhdGVkIGluIE9TIFggMTAuNworCisyMDE1LTAzLTI0IDE2OjUxOjEyIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogRml4IHNlZWtpbmcgcXVlcnkKKwkgIFRoZSBzZWdtZW50IHN0YXJ0L3N0b3AgaW4gdGhlIHF1ZXJ5IGlzIG1lYW50IHRvIHJlcHJlc2VudCB0aGUgc2Vla2FibGUKKwkgIHBvcnRpb24gb2YgdGhlIHN0cmVhbS4gSXQgZG9lcyBub3QgbWF0Y2ggdGhlIHNlZ21lbnQgc3RhcnQvc3RvcC4gSW5zdGVhZAorCSAgZXhwb3J0IDAgdG8gZHVyYXRpb24uCisKKzIwMTUtMDMtMjQgMTY6MTg6NTMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBPbmx5IHNldCBjYXBzIG9uY2UgaWYgdGhleSBkb24ndCBjaGFuZ2UKKwkgIFByZXZpb3VzbHkgd2Ugd2VyZSBzZXR0aW5nIG5ldyBjYXBzIHdpdGggdGhlIHNhbWUgY29udGVudCBmb3IgZXZlcnkgSDI2NCBvcgorCSAgQUFDIGNvZGVjX2RhdGEgd2UgZm91bmQgaW4gdGhlIHN0cmVhbSwgc3BhbW1pbmcgZXZlcnl0aGluZyBhbmQgY2F1c2luZworCSAgcmVuZWdvdGlhdGlvbnMuCisKKzIwMTUtMDMtMjQgMTI6NDY6MTkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBEb24ndCBjcmVhdGUgQUFDL0gyNjQgY2FwcyB3aXRob3V0IGNvZGVjX2RhdGEKKwkgIEluc3RlYWQgZGVsYXkgY3JlYXRpbmcgdGhlIGNhcHMgdW50aWwgd2UgcmVhZCB0aGUgY29kZWNfZGF0YSBmcm9tIHRoZSBzdHJlYW0sCisJICBvciBmYWlsIGlmIHdlIGdldCBub3JtYWwgZGF0YSBiZWZvcmUgdGhlIGNvZGVjX2RhdGEuCisJICBBQUMgcmF3IGNhcHMgYW5kIEgyNjQgYXZjIGNhcHMgYWx3YXlzIG5lZWQgY29kZWNfZGF0YSwgc2V0dGluZyBjYXBzIG9uIHRoZSBwYWQKKwkgIHdpdGhvdXQgdGhlbSBpcyBnb2luZyB0byBtYWtlIG5lZ290aWF0aW9uIGZhaWwgbW9zdCBvZiB0aGUgdGltZS4gRXZlbiBpZiB3ZQorCSAgbGF0ZXIgc2V0IG5ldyBjYXBzIHdpdGggdGhlIGNvZGVjX2RhdGEsIHRoYXQncyB1c3VhbGx5IGdvaW5nIHRvIGJlIHRvbyBsYXRlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjY4MgorCisyMDE1LTAzLTI0IDE1OjM5OjIyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogRml4IGluZGVudGlvbgorCisyMDE1LTAzLTIyIDEzOjIzOjQ0ICswMjAwICBJbHlhIEtvbnN0YW50aW5vdiA8aWx5YS5rb25zdGFudGlub3ZAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvLmg6CisJICBvc3hhdWRpbzogRml4IHN0cmluZyBmb3JtYXQgd2FybmluZyBvbiAzMi1iaXQKKwkgIFVJbnQzMiAoRGFyd2luLCBub3QgQzk5J3MgdWludDMyX3QpIGlzICd1bnNpZ25lZCBsb25nJyBvbiAzMi1iaXQKKwkgIHBsYXRmb3Jtcy4KKworMjAxNS0wMy0yMSAxNzo1MDo0MCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogRml4IGFub3RoZXIgaW5zdGFuY2Ugb2Ygc3RpY2t5IGV2ZW50IG1pc29yZGVyaW5nIHdhcm5pbmdzCisJICBNYWtlIHN1cmUgdGhhdCB0aGUgc3luY19zcmMgcGFkIGhhcyBjYXBzIGJlZm9yZSB0aGUgc2VnbWVudCBldmVudC4KKwkgIE90aGVyd2lzZSB3ZSBtaWdodCBnZXQgYSBzZWdtZW50IGV2ZW50IGJlZm9yZSBjYXBzIGZyb20gdGhlIHJlY2VpdmUKKwkgIFJUQ1AgcGFkLCBhbmQgdGhlbiBsYXRlciB3aGVuIHJlY2VpdmluZyBSVENQIHBhY2tldHMgd2lsbCBzZXQgY2Fwcy4KKwkgIFRoaXMgd2lsbCByZXN1bHRzIGluIGEgc3RpY2t5IGV2ZW50IG1pc29yZGVyaW5nIHdhcm5pbmcKKwkgIFRoaXMgZml4ZXMgd2FybmluZ3MgaW4gdGhlIHJ0cGF1eCB1bml0IHRlc3QgYnV0IGFsc28gaW4gdGhlCisJICBydHBhdXggYW5kIHJ0eCBleGFtcGxlcyBpbiB0ZXN0cy9leGFtcGxlcy9ydHAKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDY0NDUKKworMjAxNS0wMy0yMSAxNzoxODo0NyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogQWxzbyBzdGFydCB0aGUgUlRDUCBzZW5kIHRocmVhZCB3aGVuIHJlY2VpdmluZyBSVFAgb3IgUlRDUAorCSAgQmVmb3JlIHdlIG9ubHkgc3RhcnRlZCBpdCB3aGVuIGVpdGhlcjoKKwkgIC0gdGhlcmUgaXMgbm8gc2VuZCBSVFAgc3RyZWFtCisJICBvcgorCSAgLSB3ZSByZWNlaXZlZCBhbiBSVFAgcGFja2V0IGZvciBzZW5kaW5nCisJICBUaGlzIGNvdWxkIG1lYW4gdGhhdCBpZiB0aGUgc2VuZCBSVFAgcGFkcyBhcmUgY29ubmVjdGVkIGJ1dCBuZXZlciByZWNlaXZlIGFueQorCSAgUlRQIGRhdGEsIGFuZCB0aGUgc2FtZSBzZXNzaW9uIGlzIGFsc28gdXNlZCBmb3IgcmVjZWl2aW5nIFJUUC9SVENQLCB3ZSB3b3VsZAorCSAgbmV2ZXIgc3RhcnQgdGhlIFJUQ1AgdGhyZWFkIGFuZCB3b3VsZCBuZXZlciBzZW5kIFJUQ1AgZm9yIHRoZSByZWNlaXZpbmcgcGFydAorCSAgb2YgdGhlIHNlc3Npb24uCisJICBUaGlzIGNhbiBiZSByZXByb2R1Y2VkIHdpdGggYSBwaXBlbGluZSBsaWtlOgorCSAgZ3N0LWxhdW5jaC0xLjAgcnRwYmluIG5hbWU9cnRwYmluIFwKKwkgIHVkcHNyYyBwb3J0PTUwMDAgISAiYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPXZpZGVvLCBjbG9jay1yYXRlPTkwMDAwLCBlbmNvZGluZy1uYW1lPUgyNjQiICEgcnRwYmluLnJlY3ZfcnRwX3NpbmtfMCBcCisJICB1ZHBzcmMgcG9ydD01MDAxICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAgXAorCSAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMCAhIGZha2VzaW5rIG5hbWU9cnRjcF9mYWtlc2luayBzaWxlbnQ9ZmFsc2UgYXN5bmM9ZmFsc2Ugc3luYz1mYWxzZSBcCisJICBydHBiaW4ucmVjdl9ydHBfc3JjXzBfMjU1MzIyNTUzMV85NiAhIGRlY29kZWJpbiAhIHh2aW1hZ2VzaW5rIFwKKwkgIGZha2VzcmMgISB2YWx2ZSBkcm9wPXRydWUgISBydHBiaW4uc2VuZF9ydHBfc2lua18wIFwKKwkgIHJ0cGJpbi5zZW5kX3J0cF9zcmNfMCAhIGZha2VzaW5rIG5hbWU9cnRwX2Zha2VzaW5rIHNpbGVudD1mYWxzZSBhc3luYz1mYWxzZSBzeW5jPWZhbHNlIC12CisJICBCZWZvcmUgdGhpcyBjaGFuZ2UgdGhlIHJ0Y3BfZmFrZXNpbmsgd291bGQgbmV2ZXIgc2VuZCBSVENQIGZvciB0aGUgcmVjZWl2aW5nCisJICBwYXJ0IG9mIHRoZSBzZXNzaW9uIChpLmUuIG5vIHJlY2VpdmVyIHJlcG9ydHMhKSwgYWZ0ZXIgdGhlIGNoYW5nZSBpdCBkb2VzLgorCSAgQW5kIGJlZm9yZSBhbmQgYWZ0ZXIgdGhpcyBjaGFuZ2UgaXQgd291bGQgc2VuZCBSVENQIGZvciB0aGUgcmVjZWl2aW5nIHBhcnQgb2YKKwkgIHRoZSBzZXNzaW9uIGlmIHRoZSBzZW5kZXIgcGFydCB3YXMgb21pdHRlZCAodGhlIGxhc3QgdHdvIGxpbmVzKS4KKworMjAxNS0wMy0xOSAxMTo1NDoxMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSAgcnRwcnR4c2VuZDogQWRkIHN1cHBvcnQgZm9yIGJ1ZmZlciBsaXN0cworCisyMDE1LTAzLTE5IDExOjM5OjM4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhxdWV1ZS5jOgorCSAgcnRwcnR4cXVldWU6IEltcGxlbWVudCBzdXBwb3J0IGZvciBidWZmZXIgbGlzdHMKKworMjAxNS0wMy0xOCAxNzozMjozNiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBJbXByb3ZlIHRyYWNlIHJlYWRhYmlsaXR5CisJICBDaGFuZ2UgdGhlIGNvbW1hbmQgbnVtYmVyIGludG8gc3RyaW5ncy4KKworMjAxNS0wMS0yMCAxMDoxODo1NiArMDEwMCAgSmFuIEFsZXhhbmRlciBTdGVmZmVucyAoaGVmdGlnKSA8anN0ZWZmZW5zQG1ha2UudHY+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkgIGZsdmRlbXV4OiBEb24ndCByZXBlYXRlZGx5IHdhcm4gYWZ0ZXIgbm9fbW9yZV9wYWRzICh2MikKKwkgIFRoaXMgY2FuIGdldCByYXRoZXIgc3BhbW15IGZvciBzdWNoIGEgaGlnaCBsb2cgbGV2ZWwuCisJICBPbmx5IHdhcm4gb25jZSBwZXIgc3RyZWFtLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjI3NAorCisyMDE1LTAzLTE2IDExOjIzOjUyICswMTAwICBKYW4gQWxleGFuZGVyIFN0ZWZmZW5zIChoZWZ0aWcpIDxqc3RlZmZlbnNAbWFrZS50dj4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IEludHJvZHVjZSBjb25zdGFudCBmb3Igbm8tbW9yZS1wYWRzIHRocmVzaG9sZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjI3NAorCisyMDE1LTAxLTIwIDEwOjE4OjI5ICswMTAwICBKYW4gQWxleGFuZGVyIFN0ZWZmZW5zIChoZWZ0aWcpIDxqc3RlZmZlbnNAbWFrZS50dj4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IEZpeCB3YXJuaW5nIHRvIGNvbnRhaW4gJ3ZpZGVvJworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjI3NAorCisyMDE1LTAzLTExIDIxOjI1OjQwICswMTAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBtYXRyb3NrYWRlbXV4OiBmb3IgZHRzIG9ubHkgc3RyZWFtIHNldCBwdHM9ZHRzIGZvciBpbnRyYSBvbmx5IGZvcm1hdHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDUxOTIKKworMjAxNS0wMy0xNCAxNjozOTowOSArMDEwMCAgUmFtaXJvIFBvbGxhIDxyYW1pcm8ucG9sbGFAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2FkZW11eDogZml4IHNlbmRpbmcgb2YgdGFncworCSAgKiBGaXggY3JpdGljYWwgd2hlbiBuZXcgdGFncyBhcmUgZm91bmQgYWZ0ZXIgc2VnbWVudCBldmVudCBoYXMgYWxyZWFkeQorCSAgYmVlbiBzZW50LgorCSAgKiBTZW5kIGdsb2JhbCB0YWdzIGJlZm9yZSBzdHJlYW0gdGFncy4KKwkgICogU3BsaXQgc2VuZGluZyBvZiB0YWdzIG91dCBvZiBnc3RfbWF0cm9za2FfZGVtdXhfc2VuZF9ldmVudCgpIGludG8gaXRzCisJICBvd24gZnVuY3Rpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1OTczCisKKzIwMTUtMDMtMTMgMTg6MjY6MDYgKzAwMDAgIFJhbWlybyBQb2xsYSA8cmFtaXJvLnBvbGxhQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcHJvcGVybHkgZXNjYXBlIHBlcmNlbnQgc2lnbiBpbiBkb2N1bWVudGF0aW9uCisKKzIwMTUtMDMtMTMgMTg6MjY6NDQgKzAwMDAgIFJhbWlybyBQb2xsYSA8cmFtaXJvLnBvbGxhQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSAgcnRwZHRtZm11eDogcHJvcGVybHkgZXNjYXBlIHBlcmNlbnQgc2lnbiBpbiBkb2N1bWVudGF0aW9uCisKKzIwMTUtMDMtMTMgMTg6NDg6MDMgKzAwMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSAgdjRsMnNyYzogZGVsYXkgcmVuZWdvdGlhdGlvbiB1bnRpbCBpdCBpcyBsaWtlbHkgYnVmZmVycyB3ZXJlIHJlY2xhaW1lZAorCSAgQWxsb3cgcmVuZWdvdGlhdGlvbiB0byBoYXBwZW4gd2hlbiBidWZmZXJzIGhhdmUgcmV0dXJuZWQgYWZ0ZXIgYW4gYWxsb2NhdGlvbgorCSAgcXVlcnkuIEFzIHRoZSBhbGxvY2F0aW9uIHF1ZXJ5IGlzIHNlcmlhbGl6ZWQsIGFsbCBidWZmZXJzIGZyb20gdGhlIHBvb2wKKwkgIHNob3VsZCBoYXZlIHJldHVybmVkIGFuZCB3ZSBjYW4gc3RvcCBpdCB0byBjcmVhdGUgYSBuZXcgb25lIGZvciB0aGUKKwkgIG5ldyBmb3JtYXQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODI3NzAKKworMjAxNS0wMy0xMyAxODo0Nzo1NSArMDAwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyb2JqZWN0OiBhZGQgZ3N0X3Y0bDJfb2JqZWN0X3RyeV9mb3JtYXQKKwkgIFNpbWlsYXIgdG8gc2V0X2Zvcm1hdCBidXQgaXQgdXNlcyBUUllfRk1UIGluc3RlYWQgb2YgU19GTVQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODI3NzAKKworMjAxNS0wMy0xMyAxODozODo0MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazogZml4IGNyYXNoIHdpdGggR1NUX0RFQlVHIGVuYWJsZWQKKwkgIGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcygpIGRvZXMgbm90IGdpdmUKKwkgIHVzIGEgcmVmIHRvIHRoZSBhZGRyZXNzLCBzbyBkb24ndCB1bnJlZiBpdC4KKworMjAxNS0wMy0xMiAxMzo0OTo1NiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICBsZXZlbDogRG9uJ3QgcmVhZCBvdmVyIHRoZSBlbmQgb2YgdGhlIGlucHV0IG1lbW9yeQorCSAgUHJldmlvdXNseSB3ZSBhZHZhbmNlZCB0aGUgaW5fZGF0YSBwb2ludGVyIGJ5IGJwcyBmb3IgZXZlcnkgY2hhbm5lbCwgYW5kIHRoZW4KKwkgIGxhdGVyIGFnYWluIGZvciBibG9ja19zaXplKmJwcy4gVGhpcyBjYXVzZWQgdXMgdG8gYmUgb25lIHNhbXBsZSBmdXJ0aGVyIHRoYW4KKwkgIGV4cGVjdGVkIGlmIGFuIGlucHV0IGJ1ZmZlciBjb3ZlcmVkIHR3byBhbmFseXNpcyBmcmFtZXMuIEFuZCBpbiB0aGUgZW5kIGxlYWQKKwkgIHRvIGNvbXBsZXRlbHkgYm9ndXMgdmFsdWVzIHJlcG9ydGVkIGJ5IGxldmVsLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NjA2NQorCisyMDE1LTAzLTEyIDAxOjM3OjA4ICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL29zcy9nc3Rvc3NkbWFidWZmZXIuYzoKKwkgIFJlbW92ZSBhIGNvdXBsZSBvZiBzdXBlcmZsdW91cyB0cmFpbGluZyBzZW1pLWNvbG9ucworCisyMDE1LTAzLTEwIDA5OjMxOjIwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHB1c2hmaWxlc3JjLmM6CisJKiBnc3QvaXNvbXA0L2dzdGlzb2ZmLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2NvbW1vbi5jOgorCSAgRml4IGRvdWJsZSBzZW1pY29sb25zCisKKzIwMTUtMDMtMTAgMTU6NDY6NDAgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c3JjLmM6CisJICBzcGxpdG11eDogU2h1dCBkb3duIGVsZW1lbnQgYmVmb3JlIGRvd253YXJkIHN0YXRlIGNoYW5nZQorCSAgTWFrZSBzdXJlIHRoZSBzdGF0ZSBjaGFuZ2Ugd29uJ3QgaGFuZyB0cnlpbmcgdG8gc2h1dCBkb3duIHBhZHMKKwkgIGJ5IG1ha2luZyBzdXJlIHRoZSBzdHJlYW1pbmcgaGFzIHN0b3BwZWQgYmVmb3JlIGNoYWluaW5nIHVwLgorCisyMDE1LTAzLTA5IDIyOjU4OjA1ICswMjAwICBJbHlhIEtvbnN0YW50aW5vdiA8aWx5YS5rb25zdGFudGlub3ZAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvLmg6CisJICBvc3hhdWRpbzogc3RyZWFtIGZvcm1hdCBpcyBhbiBTUERJRi1vbmx5IGZpZWxkCisKKzIwMTUtMDMtMDkgMjI6NTM6NDEgKzAyMDAgIElseWEgS29uc3RhbnRpbm92IDxpbHlhLmtvbnN0YW50aW5vdkBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5oOgorCSAgb3N4YXVkaW86IGZpeCBzcGFjZXMKKworMjAxNS0wMy0wOSAyMjo1Mjo0NiArMDIwMCAgSWx5YSBLb25zdGFudGlub3YgPGlseWEua29uc3RhbnRpbm92QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmg6CisJICBvc3hhdWRpbzogYWRkIHR5cGUgY2hlY2sgbWFjcm8KKworMjAxNS0wMy0wOSAyMjo1MTo1MSArMDIwMCAgSWx5YSBLb25zdGFudGlub3YgPGlseWEua29uc3RhbnRpbm92QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2NvbW1vbi5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2NvbW1vbi5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2hhbC5jOgorCSAgb3N4YXVkaW86IHJlbmFtZSBnc3RfY29yZV9hdWRpb19zZXRfY2hhbm5lbHNfbGF5b3V0KCkKKwkgIHRvIGdzdF9jb3JlX2F1ZGlvX2dldF9jaGFubmVsX2xheW91dCgpLgorCisyMDE1LTAzLTA5IDIyOjMwOjI4ICswMjAwICBJbHlhIEtvbnN0YW50aW5vdiA8aWx5YS5rb25zdGFudGlub3ZAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9yaW5nYnVmZmVyLmM6CisJICBvc3hhdWRpbzogcmVtb3ZlIHVudXNlZCBmaW5hbGl6ZQorCisyMDE1LTAzLTA5IDE2OjI1OjQzICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOWVuYy5jOgorCSAgdnA5ZW5jOiByZW1vdmUgZHVwbGljYXRlIGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9uCisKKzIwMTUtMDMtMDkgMTY6MjI6MjkgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXk6IHJlbW92ZSB1bnVzZWQgdmFsdWUKKwkgIENJRCAjMTIyNjQ3NAorCisyMDE1LTAzLTA5IDE2OjE0OjM0ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgIHJ0cGgyNjNwYXk6IGZpeCBsZWFrCisJICBDSUQgMTIxMjE1NgorCisyMDE1LTAzLTA5IDE1OjU4OjMzICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgIHJ0cGgyNjNwYXk6IHJlbW92ZSB1bmVlZGVkIHZhcmlhYmxlCisJICBXZSBqdXN0IG5lZWQgdG8gc2F2ZSB0aGUgZWJpdCBpbmZvcm1hdGlvbiBpbiBjYXNlIHRoZXJlIGlzIGFuIGVycm9yIGRlY29kaW5nLgorCisyMDE1LTAzLTA5IDE2OjQ2OjAyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkgIHZwWzg5XWVuYzogUmVzZXQgdGhlIGVuY29kZXIgd2hlbiBmbHVzaGluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTcwNAorCisyMDE1LTAzLTA5IDEyOjUxOjE3ICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thOiBlcnJvciBtb2RlIGlmIGNhbid0IHB1c2ggYnVmZmVyCisJICBJZiBnc3RfcGFkX3B1c2goKSBmYWlscywgaW5mb3JtIGFuZCByZXR1cm4gZmxvdyBlcnJvci4KKworMjAxNS0wMy0wOSAxMjoxMzozNCArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJICBtYXRyb3NrYTogdW51c2VkIHZhbHVlCisJICBWYWx1ZSBzZXQgaW4gcmV0IHdpbGwgYmUgb3ZlcndyaXR0ZW4ganVzdCBiZWZvcmUgZXhpdGluZyB0aGUgZnVuY3Rpb24uCisJICBDSUQgIzEyMjY0NjkKKworMjAxNS0wMy0wOSAxMToxMDozNSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IERyb3AgcGFja2V0cyB3aXRoIHNlcXVlbmNlIG51bWJlcnMgYmVmb3JlIHRoZSBzZXFudW0tYmFzZQorCSAgVGhlc2UgYXJlIG91dHNpZGUgdGhlIGV4cGVjdGVkIHJhbmdlIG9mIHNlcXVlbmNlIG51bWJlcnMgYW5kIHNob3VsZCBiZQorCSAgY2xpcHBlZCwgZXNwZWNpYWxseSBmb3IgUlRTUCB0aGV5IG1pZ2h0IGJlbG9uZyB0byBwYWNrZXRzIGZyb20gYmVmb3JlIGEgc2VlaworCSAgb3IgYSBwcmV2aW91cyBzdHJlYW0gaW4gZ2VuZXJhbC4KKworMjAxNC0wMi0yNyAxMDo1MjoxNiArMDEwMCAgTGludXMgU3ZlbnNzb24gPGxpbnVzc25AYXhpcy5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IERvbid0IGluY2x1ZGUgcGF5bG9hZCB0eXBlIGluIHRoZSBjYXBzIGZvciBmcmFtZXNpemUKKwkgIFdoZW4gdGhlIHNkcCBtZWRpYSBhdHRyaWJ1dGUgZnJhbWVzaXplIGFyZSBjb252ZXJ0ZWQgdG8gY2FwcworCSAgdGhlIDxwYXlsb2FkPiBzaG91bGQgbm90IGJlIGluY2x1ZGVkLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNTMzNQorCisyMDE1LTAzLTA5IDEwOjA1OjE0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogRG9uJ3QgZm9yZ2V0IHRvIHVubG9jayB0aGUgbXV0ZXggd2hlbiByZWNlaXZpbmcgR0FQcyBpbiBUQ1Agc3RyZWFtcworCisyMDE1LTAzLTA5IDExOjI0OjU4ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBNYWtlIHN1cmUgdG8gZmlsdGVyIGNhcHMgaW4gYWxsIGNhc2VzIGR1cmluZyBDQVBTIHF1ZXJ5CisJICBXZSB3ZXJlIHNraXBwaW5nIHRoZSBmaWx0ZXIgc3RlcCB3aGlsZSByZXR1cm5pbmcgdGVtcGxhdGUgY2FwcywgZm9yCisJICBleGFtcGxlLgorCisyMDE1LTAzLTA4IDIxOjE1OjUzICswMDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogRG9uJ3QgdXBkYXRlIGJ1ZmZlciBmb3IgT1VUUFVUCisJICBGb3Igb3V0cHV0IGRldmljZSwgd2Ugc2hvdWxkIG5vdCB1cGRhdGUgdGhlIGJ1ZmZlciB3aXRoIGZsYWdzIGFuZAorCSAgdGltZXN0YW1wIHdoZW4gd2UgZGVxdWV1ZS4gVGhlIGluZm9ybWF0aW9uIGluIHRoZSB2NGwyX2J1ZmZlciBpcyBub3QKKwkgIG1lYW5pbmdmdWwgYW5kIGl0IGJyZWFrcyB0aGUgY2FzZSB3aGVyZSB0aGUgYnVmZmVyIGlzIHJlbmRlcmVkIGF0CisJICBtdWx0aXBsZSBwbGFjZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1NDM4CisKKzIwMTUtMDMtMDggMTg6MDQ6MzQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5jOgorCSAgc291cGh0dHBjbGllbnRzaW5rOiBJbXBsZW1lbnQgY29va2llcyBwcm9wZXJ0eQorCisyMDE1LTAzLTA4IDE4OjAyOjUxICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkgIHNvdXBodHRwY2xpZW50c2luazogSW1wbGVtZW50IGF1dG9tYXRpYy1yZWRpcmVjdCBwcm9wZXJ0eQorCisyMDE1LTAzLTA4IDE3OjU0OjA3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkgIHNvdXBodHRwY2xpZW50c2luazogSW1wbGVtZW50IHByb3h5IHN1cHBvcnQKKwkgIFRoZSBwcm9wZXJ0aWVzIHdlcmUgdGhlcmUgYmVmb3JlLCBidXQgbm90IHVzZWQgYW55d2hlcmUuCisKKzIwMTUtMDItMjEgMjA6MDU6MjQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHJlc3VycmVjdCBzb21lIGZsb3cgcmV0dXJuIGhhbmRsaW5nCisKKzIwMTUtMDMtMDQgMTA6Mjc6MTcgKzAxMDAgIE5pY29sYXMgSHVldCA8bmljb2xhcy5odWV0QHBhcnJvdC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBmaXggTE9BUyBwYXJzaW5nIGlzc3VlCisJICBGaXggbWlzc2luZyBpbmRleCBpbiBzeW5jd29yZCBzZWFyY2hpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDU1ODUKKworMjAxNS0wMy0wNSAxNzo1NDo0MyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkaXJlY3Rzb3VuZHNpbms6IGZpeCBtb2R1bG8gbWF0aCB3aXRoIHJpbmdidWZmZXIgcGFyYW1ldGVycworCSAgVG8gZ2V0IGEgbXVsdGlwbGUgb2YgYnBmIHVzZSBhIHN1YnRyYWN0aW9uIGFuZCBub3QgYW4gYWRkaXRpb24KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDU2ODQKKworMjAxNS0wMy0wNyAwMDo1NTo0NyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IFByb3RlY3QgcHJvcGVydHkgdmFyaWFibGVzIHdpdGggdGhlIG9iamVjdCBsb2NrLgorCSAgVXNlIHRoZSBvYmplY3QgbG9jayBpbnN0ZWFkIG9mIHRoZSBzcGxpdG11eCBsb2NrIHRvIHByb3RlY3QKKwkgIGludGVybmFsIHByb3BlcnR5IHZhcmlhYmxlcywgc28gdGhleSdyZSBub3QgbG9ja2VkIHdoZW4KKwkgIHN3aXRjaGluZyB0byBhIG5ldyBmaWxlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NDQyMAorCisyMDE1LTAzLTA2IDExOjM5OjM5ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICBjaGVjazogYWRkIGppdHRlcmJ1ZmZlciB1bml0IHRlc3QKKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1NTM5CisKKzIwMTUtMDMtMDUgMDk6MTg6NTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IEZpeCBoYW5kbGluZyBvZiBpbnRlcmxlYXZlZCAoVENQKSBzdHJlYW1zCisJICBXZSBuZWVkIHRvIHNldCB1cCB0aGUgdHJhbnNwb3J0IGluIGFueSBjYXNlLCBub3QganVzdCBpZiB3ZSBoYXZlIGEgY29udGFpbmVyCisJICBzdHJlYW0gb3IgYSBub24taW50ZXJsZWF2ZWQgc3RyZWFtLiBPbmx5IGlmIHdlIGhhdmUgYW4gaW50ZXJsZWF2ZWQgc3RyZWFtIGFuZAorCSAgYXJlIHJldHJ5aW5nLCB3ZSBzaG91bGQgbm90IHNldCB1cCB0aGUgc3RyZWFtIGFnYWluLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTU5OQorCisyMDE1LTAzLTA1IDEwOjAwOjMzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZweC9nc3R2cDlkZWMuYzoKKwkgIHZwWzg5XWRlYzogRHJvcCBmcmFtZXMgdGhhdCBoYXZlIG5vIG91dHB1dCBidWZmZXIgYmVjYXVzZSBvZiBlcnJvcnMKKwkgIGZpbmlzaF9mcmFtZSgpIGFzc3VtZXMgdGhhdCB0aGVyZSBpcyBhbiBvdXRwdXQgYnVmZmVyLgorCisyMDE1LTAzLTA1IDA5OjU2OjIzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBEb24ndCB1bnJlZiBjYXBzIHdlIGRvbid0IG93bgorCisyMDE1LTAzLTA1IDA5OjQ2OjE3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBQdXNoIFJUQ1AgY2FwcyBvbiB0aGUgUlRDUCBwYWRzCisJICBPdGhlcndpc2Ugd2Ugd2lsbCBnZXQgbm90LW5lZ290aWF0ZWQgbGF0ZXIgZnJvbSBydHBiaW4sIGFuZCB3aWxsIG5ldmVyIGJlIGFibGUKKwkgIHRvIHNlbmQgUlRDUCBwYWNrZXRzIGJhY2sgdG8gdGhlIHNlcnZlci4gTm90ZSB0aGF0IGVycm9yIGZsb3cgcmV0dXJucyBmcm9tIHRoZQorCSAgUlRDUCBwYWRzIGFyZSBpZ25vcmVkLCB0aGF0J3Mgd2h5IGl0IGRpZG4ndCBmYWlsIG1vcmUgdmlzaWJsZSBiZWZvcmUuCisKKzIwMTUtMDMtMDUgMDk6MzU6MzIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IE1ha2Ugc3VyZSB0byBzZW5kIFNFR01FTlQgZXZlbnRzIG9uIGFsbCBwYWRzCisKKzIwMTUtMDMtMDMgMTY6MjM6MTUgKzAxMDAgIFNhbnRpYWdvIENhcm90LU5lbWVzaW8gPHNhbmNhbmVAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmg6CisJICBydHA6IEFkZCBGdWxsIEludHJhIFJlcXVlc3QgKEZJUikgcGFja2V0cyB0byBzdGF0aXN0aWNzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1NTg3CisKKzIwMTUtMDMtMDMgMTY6MDE6NTMgKzAxMDAgIFNhbnRpYWdvIENhcm90LU5lbWVzaW8gPHNhbmNhbmVAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmg6CisJICBydHA6IEFkZCBQYWNrZXQgTG9zcyBJbmRpY2F0aW9uIChQTEkpIHRvIHN0YXRpc3RpY3MKKwkgIFRoaXMgaXMgaGVscGZ1bCB0byBwcm92aWRlIHN0YXRpc3RpY3MgaW4gdGhlIGZvcm1hdCBkZWZpbmVkIGluCisJICBodHRwOi8vdzNjLmdpdGh1Yi5pby93ZWJydGMtc3RhdHMvI2RpY3Rpb25hcnktcnRjcnRwc3RyZWFtc3RhdHMtbWVtYmVycy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDU1ODcKKworMjAxNS0wMy0wMyAxOToxOTo1MCArMDEwMCAgTmljb2xhIE11cmlubyA8bmljb2xhLm11cmlub0BnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgIG1hdHJvc2thbXV4OiBSZW1vdmUgZHVyYXRpb24gYWNjdW11bGF0aW9uIGxvZ2ljCisJICBEdXJhdGlvbiBhY2N1bXVsYXRpb24gY2FuIGNhdXNlIHJvdW5kaW5nIGVycm9ycyBhbmQgZ2VuZXJhdGUgd3JvbmcKKwkgIGR1cmF0aW9uIHdpdGggZGlmZmVyZW50IGJ1ZmZlcnMgdGhhdCBzaGFyZSB0aGUgc2FtZSB0aW1lc3RhbXAuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1MTkyCisKKzIwMTUtMDMtMDMgMTg6NDA6MTYgKzAxMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thOiBBZGQgYW4gaGVscGVyIG1ldGhvZCB0byBnZXQgYnVmZmVyIHRpbWVzdGFtcHMKKwkgIC4uLiBhbmQgcmVwbGFjZSBHU1RfQlVGRkVSX1RJTUVTVEFNUCB0aGF0IGFsd2F5cyByZXR1cm4gUFRTIHdpdGggdGhpcyBtZXRob2QKKwkgIHRoYXQgcmV0dXJuIFBUUyBvciBEVFMgYmFzZWQgb24gc3RyZWFtIHR5cGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1MTkyCisKKzIwMTUtMDMtMDQgMTE6Mjg6MTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IEFkZCBleHBsYW5hdGlvbiB3aHkgd2UgaGF2ZSBzcGFjZSBmb3IgMzIgaGFzaCB0YWJsZXMKKwkgIEFuZCBhbHNvIGNyZWF0ZSBvbmx5IG9uZSwgdGhlcmUncyBubyBuZWVkIHlldCB0byBjcmVhdGUgYWxsIDMyIHVudGlsCisJICB3ZSBpbXBsZW1lbnQgUkZDMjc2Mi4KKworMjAxNS0wMy0wNCAxMToyNjo1NyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgUmV2ZXJ0ICJydHBzZXNzaW9uOiBEbyBub3QgdXNlIGFuIGFycmF5IG9mIG1hcHMgaWYgdGhleSBhcmUgbm90IGJlaW5nIHVzZWQiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDE1OTFhZGY0Y2Q4NDNkMTNkODYyMmEzMGM2MTk0MjU2OTFhODQxMjguCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1NTg2I2MxOgorCSAgSXQncyB0aGUgYmVnaW5uaW5nIG9mIGFuIGltcGxlbWVudGF0aW9uIG9mIFJGQyAyNzYyLCB3aGljaCBpcyBuZWVkZWQgZm9yCisJICBsYXJnZSBtdWx0aWNhc3QgZ3JvdXBzLiBUaGUgaW1wbGVtZW50YXRpb24gaXMgbm90IHlldCBjb21wbGV0ZSBidXQgd2h5CisJICBub3QgbGVhdmUgd2hhdCBpcyB0aGVyZSBhbmQgaW1wbGVtZW50IFJGQyAyNzYyIGluc3RlYWQ/CisKKzIwMTUtMDMtMDQgMTA6MzU6MTIgKzAxMDAgIFNhbnRpYWdvIENhcm90LU5lbWVzaW8gPHNhbmNhbmVAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBzZXNzaW9uOiBEbyBub3QgdXNlIGFuIGFycmF5IG9mIG1hcHMgaWYgdGhleSBhcmUgbm90IGJlaW5nIHVzZWQKKwkgIHJ0cHNlc3Npb24gZGVjbGFyZXMgYW4gYXJyYXkgb2YgbWFwcyB0byBzdG9yZSBzcnJjcyBidXQgb25seSB0aGUKKwkgIHRoZSBrZXkgMCBpcyBiZWluZyB1c2VkLiBUaGlzIHBhdGNoIHJlcGxhY2VzIHRoZSBhcnJheSBvZiBtYXBzCisJICBmb3IganVzdCBvbmUgbWFwIGFuZCByZW1vdmUgdXNlbGVzcyBwYXJhbWV0ZXJzIGluIHJ0cHNlc3Npb24KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDU1ODYKKworMjAxNS0wMi0yNyAxODoxMjowOSArMDkwMCAgSmltbXkgT2huIDx5b25namluLm9obkBsZ2UuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogcmVtb3ZlIG5vdCBuZWVkZWQgY29kZQorCSAgSW4gZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5LCB0aGVyZSBpcyBub3QgbmVlZGVkIGNvZGUuCisJICBXZSBhbHJlYWR5IGNoZWNrIGFib3V0IHN0cmVhbSBpcyB2YnIgb3Igbm90IGF0IHRoZSB1cHBlciBsaW5lLgorCSAgbywgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGlzIGNvbmRpdGlvbiBiZWNhc2Ugc3RyZWFtIGlzIG5vdAorCSAgdmJyIDEwMCUgaW4gdGhpcyBjYXNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTI3NgorCisyMDE1LTAzLTAzIDIzOjI1OjM1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9pY2xlcy9nZGtwaXhidWZvdmVybGF5LXRlc3QuYzoKKwkgIHRlc3RzOiBnZGtwaXhidWZvdmVybGF5LXRlc3Q6IHJlcGxhY2UgZGVwcmVjYXRlZCBmdW5jdGlvbgorCSAgSnVzdCBhdm9pZCB1c2luZyB0aGUgZGVwcmVjYXRlZCBmdW5jdGlvbiBlbnRpcmVseSwKKwkgIGl0J3MgZWFzeSBlbm91Z2guIERlZmluaW5nIHRoZSBtYWNybyBpcyBub3QgZW5vdWdoLgorCisyMDE1LTAzLTAzIDE5OjA0OjQ4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9pY2xlcy9nZGtwaXhidWZvdmVybGF5LXRlc3QuYzoKKwkgIHRlc3RzOiBnZGtwaXhidWZvdmVybGF5LXRlc3Q6IGZpeCBjb21waWxhdGlvbiBhZ2FpbnN0IG5ld2VyIGdkay1waXhidWYKKwkgIGdka19waXhidWZfbmV3X2Zyb21faW5saW5lKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvdXIKKwkgIG9mIEdSZXNvdXJjZS4KKworMjAxNS0wMy0wMyAxODozOToxNSArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSAgb3N4YXVkaW9zcmM6IEFsbG93IGNhcHMgcmVuZWdvdGlhdGlvbgorCSAgVGhlIHJpbmdidWZmZXIgZG9lcyBhbGxvdyByZW5lZ290aWF0aW9uLCBzbyB3ZSBkbyBub3QgaGF2ZSB0byByZXBvcnQKKwkgIGZpeGVkIGNhcHMgb25jZSBpdCBpcyBhY3F1aXJlZCAoYmFzZWQgb24gYSBzaW1pbGFyIHBhdGNoIGZvciB0aGUgc2luaworCSAgc2lkZSBieSBJbHlhIEtvbnN0YW50aW5vdiA8aWx5YS5rb25zdGFudGlub3ZAZ21haWwuY29tPikuCisKKzIwMTUtMDItMjEgMTQ6NDE6MDggKzAyMDAgIElseWEgS29uc3RhbnRpbm92IDxpbHlhLmtvbnN0YW50aW5vdkBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkgIG9zeGF1ZGlvc2luazogQWxsb3cgcmVuZWdvdGlhdGluZyBjYXBzCisJICBPbmNlIG9zeGF1ZGlvc2luaydzIGRldmljZSBpcyBvcGVuLCBpdCBmaXhhdGVzIG9uIHRoZSBpbml0aWFsIGNhcHMgYW5kCisJICByZWZ1c2VzIHRvIGFjY2VwdCBuZXcgY2Fwcy4gVGhpcyBpcyBlcnJvbmVvdXMgc2luY2UgdGhlIEF1ZGlvIFVuaXQgaXMKKwkgIGNhbiBhY2NlcHQgYSBuZXcgQVNCRCwgYW5kIEdzdEF1ZGlvUmluZ0J1ZmZlciBzdXBwb3J0cyByZWNvbmZpZ3VyYXRpb24KKwkgIGFzIHdlbGwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQzOTI1CisKKzIwMTUtMDMtMDIgMTI6MDQ6MDAgKzAxMDAgIEd3ZW5vbGUgQmVhdWNoZXNuZSA8Z3dlbm9sZS5iZWF1Y2hlc25lQGludGVsLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJhbGxvY2F0b3I6IGZpeCBmZCBsZWFrIGluIERNQUJVRiBpbXBvcnQgbW9kZS4KKwkgIEVuc3VyZSBnc3RfdjRsMl9idWZmZXJfcG9vbF9yZWxlYXNlX2J1ZmZlcigpIHJlbGVhc2VzIHRoZSBhc3NvY2lhdGVkCisJICBHc3RWNGwyTWVtb3J5R3JvdXAuIEluIHBhcnRpY3VsYXIsIHRoaXMgYWxsb3dzIGZvciBjbG9zaW5nIHRoZSBETUFCVUYKKwkgIGhhbmRsZXMgcHJpb3IgdG8gaW5zdGFudGlhdGluZyBuZXcgb25lcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDU0NDMKKworMjAxNS0wMy0wMiAxNTowNjowOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDhlbmMuYzoKKwkgIHZwOGVuYzogVXNlIDAgYXMgZHVyYXRpb24gZm9yIHRoZSBFT1MgImZyYW1lIgorCisyMDE1LTAzLTAyIDE1OjAyOjIwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cDhlbmMuaDoKKwkqIGV4dC92cHgvZ3N0dnA5ZW5jLmM6CisJKiBleHQvdnB4L2dzdHZwOWVuYy5oOgorCSAgdnB7OCw5fWVuYzogVGVsbCB0aGUgZW5jb2RlciBhYm91dCBhY3R1YWwgdGltZXN0YW1wcyBhbmQgZHVyYXRpb25zIG9mIGZyYW1lcworCSAgLi4uIGluc3RlYWQgb2YganVzdCBjb3VudGluZyBmcmFtZXMuIFRoZSB2YWx1ZXMgYXJlIHN1cHBvc2VkIHRvIGJlIGluIHRpbWViYXNlCisJICB1bml0cywgbm90IGZyYW1lIHVuaXRzLiBUaGlzIGZpeGVzIHZhcmlvdXMgcXVhbGl0eSBwcm9ibGVtcyB3aXRoIFZQOC9WUDkKKwkgIGVuY29kaW5nIGFuZCBpbiBnZW5lcmFsIG1ha2VzIHRoZSBlbmNvZGVyIGJlaGF2ZSBiZXR0ZXIuCisJICBUaGFua3MgdG8gTmlyYmhlZWsgQ2hhdWhhbiBmb3Igbm90aWNpbmcgdGhpcyBidWcuCisKKzIwMTUtMDMtMDEgMTM6NTY6MTcgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZweC9nc3R2cDlkZWMuYzoKKwkgIHZweGRlYzogRml4IGNhbGN1bGF0aW9uIG9mIHdpZHRoIGluIGJ5dGVzCisJICBSaWdodCBub3cgd2Ugb25seSBzdXBwb3J0IEk0MjAsIGJ1dCB2cHggc2VlbXMgdG8gc3VwcG9ydCBtb3JlIGZvcm1hdHMuCisJICBUaGlzIHdpbGwgcHJldmVudCBoYXJkIHRvIGZpbmQgYnVnIGluIHRoZSBmdXR1cmUuCisKKzIwMTUtMDMtMDEgMTM6NTI6NTAgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZweC9nc3R2cDlkZWMuYzoKKwkgIHZweGRlYzogRG9uJ3QgbWVtY3B5IGluIGZyYW1lIG1hcCBmYWlsZWQKKwkgIFRoaXMgYXZvaWQgYSBjcmFzaCBpZiBtYXBwaW5nIHRoZSBmcmFtZSBmYWlsZWQuCisKKzIwMTUtMDMtMDEgMTM6NDg6NDUgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IEFkZCBtaXNzaW5nIGJyZWFrCisJICBUaGlzIGlzIGNvc21ldGljIGNoYW5nZS4KKworMjAxNS0wMy0wMSAxMzo0NjoxOCAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSAgdjRsMjogV29ya2Fyb3VuZCBkcml2ZXIgbm90IHNldHRpbmcgZmllbGQgY29ycmVjdGx5CisJICBBcyBpdCdzIHZlcnkgY29tbW9uLCBoYW5kbGUgZHJpdmVyIG5vdCBzZXR0aW5nIGZpZWxkIGluIGJ1ZmZlcnMKKwkgIGJ5IHVzaW5nIHRoZSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBmb3JtYXQuIFRoaXMgd29ya2Fyb3VuZCBhIGxvbmcgdGltZQorCSAgYnVnIGluIFVWQyBkcml2ZXIuIEZvciBldmVuIGJ1Z2dpZXIgZHJpdmVyLCB3ZSBzaW1wbHkgYXNzdW1lCisJICBwcm9ncmVzc2l2ZSBhcyBiZWZvcmUuIFdlIGFsc28gb25seSB3YXJuIG9uY2UsIHRvIGF2b2lkIHNwYW1taW5nLgorCisyMDE1LTAyLTI4IDE4OjEwOjA2ICswMTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBrZXkgdW5pdCBzZWVrCisJICBVbmxpa2UgbWFueSBvdGhlciBzZWVrIGZsYWdzLCB0aGUgS0VZX1VOSVQgc2VlaworCSAgZmxhZyBpcyBub3QgY29waWVkIG92ZXIgaW50byB0aGUgR3N0U2VnbWVudCwKKwkgIHNpbmNlIGl0J3Mgb25seSByZWxldmFudCBmb3IgdGhlIHNlZWsgaXRzZWxmLAorCSAgc28gd2UgbmVlZCB0byBwYXNzIGl0IGV4cGxpY2l0bHkgdG8gdGhlIHNlZWsKKwkgIGhhbmRsZXIgaGVyZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDUzMzkKKworMjAxNS0wMi0yNyAwOTozODowMSArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkgIGRvY3MvcGx1Z2luczogVXBkYXRlcworCisyMDE1LTAyLTI2IDIzOjQxOjQ3ICswMTAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eC9kZW11eDogaW5pdGlhbGl6ZSBkdHNfb25seQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTE5MgorCisyMDE1LTAyLTI2IDIzOjI4OjExICswMTAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHN0b3JlIERUUyBmb3IgVl9NUy9WRlcvRk9VUkNDIHN0cmVhbXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDUxOTIKKworMjAxNS0wMi0yNiAxOTo0ODozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkgIG11bHRpZmlsZTogYXR0ZW1wdCB0byBmaXggZG9jcyBidWlsZCBpc3N1ZSBvbiBidWlsZCBib3QKKworMjAxNS0wMi0yNyAwMDo0MTo0NiArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkgIGludGVybGVhdmU6IERyb3AgY3VzdG9tIGxhdGVuY3kgcXVlcnkgaGFuZGxpbmcKKwkgIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGRlZmF1bHQgcXVlcnkgaGFuZGxlciBub3cuCisKKzIwMTUtMDItMjcgMDA6NDA6MDUgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGdpdEBhcnVucmFnaGF2YW4ubmV0PgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogRHJvcCBjdXN0b20gbGF0ZW5jeSBxdWVyeWluZyBsb2dpYworCSAgVGhpcyBpcyBub3cgaW1wbGVtZW50ZWQgaW4gdGhlIGRlZmF1bHQgbGF0ZW5jeSBxdWVyeSBoYW5kbGVyLgorCisyMDE1LTAyLTI2IDE2OjEwOjQxICswMTAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJybkBheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkgIHJ0cHZvcmJpc3BheTogZml4IHBheWxvYWRlciBkZXNjcmlwdGlvbiBhbmQgYXV0aG9yIGUtbWFpbAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTIyNgorCisyMDE0LTA5LTA1IDE2OjM0OjI2ICswMjAwICBBdXLDqWxpZW4gWmFuZWxsaSA8YXVyZWxpZW4uemFuZWxsaUBwYXJyb3QuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMjogcXVlcnkgY3JvcCBjb25maWd1cmF0aW9uIGFmdGVyIGVhY2ggY2FsbCBvZiBTX0NST1AKKwkgIFNfQ1JPUCBpb2N0bCBpcyB3cml0ZS1vbmx5IGFuZCB0aGUgZGV2aWNlIGNhbiBhZGp1c3QgY3JvcCByZWN0YW5nbGUgc28KKwkgIHdlIHF1ZXJ5IGJhY2sgdGhlIGNyb3AgY29uZmlndXJhdGlvbiBhZnRlciBlYWNoIFNfQ1JPUCB0byBrbm93IHdoYXQgaGFzCisJICBiZWVuIGRvbmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2MTMzCisKKzIwMTUtMDItMjYgMDI6MTI6MTggKzAxMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgbWF0cm9za2FkZW11eDogVl9NUy9WRlcvRk9VUkNDIHN0cmVhbXMgaGF2ZSBEVFMgaW5zdGVhZCBvZiBQVFMKKwkgIFdoZW4gc3VjaCBzdHJlYW0gaXMgcHJlc2VudCBkZW11eGVyIHNob3VsZCBzZXQgRFRTIG9uIGJ1ZmZlcnMgaW5zdGVhZAorCSAgb2YgUFRTLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBob3cgVkxDIGFuZCBsaWJhdi9mZm1wZWcgaGFuZGxlIFZGVworCSAgc3RyZWFtcy4KKwkgIFNhbXBsZSBmaWxlCisJICBodHRwczovL3MzLmFtYXpvbmF3cy5jb20vTWF0ZWpLL1NhbXBsZXMvTWF0cm9za2EtVkZXLURUUy1Pbmx5Lm1rdgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTE5MgorCisyMDE1LTAyLTI1IDE2OjQ1OjExIC0wODAwICBBbGVpeCBDb25jaGlsbG8gRmxhcXXDqSA8YWxlaXhAb2Jsb25nLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBDaGVjayBjb3JydXB0aW9uIGZsYWcgb24gdGhlIHJpZ2h0IGJ1ZmZlcgorCSAgV2Ugd2hlcmUgY2hlY2tpbmcgdGhlIGJ1ZmZlciB3ZSBhcmUgY29weWluZyB0byBpbnN0ZWFkIG9mIHRoZSBidWZmZXIgd2UKKwkgIGFyZSBjb3B5aW5nIGZyb20uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwMDQwCisKKzIwMTUtMDEtMTkgMTU6Mjk6MjQgKzAxMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQHBhcnJvdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IHNldCBjb2xvcnNwYWNlIGluIGNhcHMgZm9yIGNhcHR1cmUgZGV2aWNlcworCSAgVGhpcyBpbmZvcm1hdGlvbiBpcyBzZXQgYnkgdGhlIGRyaXZlciBmb3IgYSBjYXB0dXJlIGRldmljZSwgYW5kIHNvIGNvdWxkCisJICBiZSBmb3J3YXJkZWQgdG8gcGlwZWxpbmUgYnkgc2V0dGluZyB0aGUgY29sb3JpbWV0cnkgaW4gY2Fwcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDMxODYKKworMjAxNC0xMC0wNiAxNzozMDowNiArMDIwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIHY0bDJidWZmZXJwb29sOiBmaXggaW1wb3J0X3VzZXJwdHIoKSBpbiBzaW5nbGUtcGxhbmFyIEFQSSB3aGVuIG5fcGxhbmVzID4gMQorCSAgSW4gdGhlIFY0TDIgc2luZ2xlLXBsYW5hciBBUEksIHdoZW4gZm9ybWF0IGlzIHNlbWktcGxhbmFyL3BsYW5hciwKKwkgIGRyaXZlcnMgZXhwZWN0IHRoZSBwbGFuZXMgdG8gYmUgY29udGlndW91cyBpbiBtZW1vcnkuCisJICBTbyB0aGlzIGNvbW1pdCBjaGFuZ2UgdGhlIHdheSB3ZSBoYW5kbGUgc2VtaS1wbGFuYXIvcGxhbmFyIGZvcm1hdAorCSAgKG5fcGxhbmVzID4gMSkgd2hlbiB3ZSB1c2UgdGhlIHNpbmdsZS1wbGFuYXIgQVBJIChncm91cC0+bl9tZW0gPT0gMSkuCisJICBUbyBjaGVjayB0aGF0IHBsYW5lcyBhcmUgY29udGlndW91cyBhbmQgaGF2ZSBleHBlY3RlZCBzaXplLCBpZTogbm8KKwkgIHBhZGRpbmcuIFdlIHRlc3QgdGhlIGZhY3QgdGhhdCBwbGFuZSAnaScgc3RhcnQgYWRkcmVzcyArIHBsYW5lICdpJworCSAgZXhwZWN0ZWQgc2l6ZSBlcXVhbHMgdG8gcGxhbmUgJ2kgKyAxJyBzdGFydCBhZGRyZXNzLiBJZiBub3QsIHdlIHJldHVybgorCSAgaW4gZXJyb3IuCisJICBNYXRoIGFyZSBkb25lIGluIGJ1ZmZlcnBvb2wgcmF0aGVyIHRoYW4gaW4gYWxsb2NhdG9yIGJlY2F1c2UgdGhlCisJICBmb3JtZXIgaXMgYXdhcmUgb2YgdmlkZW8gaW5mby4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzgwMTMKKworMjAxNS0wMS0yMyAxMDoxNTo0NiArMDEwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJhbGxvY2F0b3I6IGxldCBidWZmZXJwb29sIGNhbGN1bGF0ZSBpbWFnZSBzaXplIHdoZW4gaW1wb3J0aW5nIHVzZXJwdHIKKwkgIE9mZnNldCBhcmUgcmVsYXRpdmUgdG8gdGhlIGJ1ZmZlciBhbmQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHN1YnN0cmFjdGluZworCSAgdGhlbSB3aWxsIGdpdmUgdXMgdGhlIHBsYW5lIHNpemUuIFNvIHdlIGxldCBidWZmZXJwb29sIG1ha2UgdGhlIG1hdGggYXMKKwkgIGl0IGlzIG1vcmUgYXdhcmUgb2YgdmlkZW8gaW5mbyB0aGFuIGFsbG9jYXRvciBhbmQgcGFzcyBhIHNpemUgYXJyYXkgdG8KKwkgIGFsbG9jYXRvciBpbXBvcnQgZnVuY3Rpb24uCisJICBQb2ludGVkIG91dCBieSBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM4MDEzCisKKzIwMTQtMTItMTEgMTY6MTM6MTUgKzAxMDAgIFBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBtYWNxZWwuYmU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IHJlY29nbml6ZSBhbmQgZGlzdGluZ3Vpc2ggYWxsIGJheWVyIGFycmFuZ2VtZW50cworCSAgVXAgdG8gbm93LCB2NGwyc3JjIHJlY29nbml6ZWQgb25seSAiYmdnciIgYW1vbmdzdCB0aGUgYmF5ZXIgYXJyYW5nZW1lbnRzLgorCSAgUmVjb2duaXplIG5vdyBhbHNvIHRoZSAicmdnYiIsICJnYnJnIiBhbmQgImdyYmciIGFycmFuZ2VtZW50cy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDIzNjMKKworMjAxNS0wMS0xNSAxNjoxMTo1MyArMDEwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBzZXQgdjRsMl9idWZmZXIuZmllbGQgd2hlbiBxdWV1aW5nIGJ1ZmZlciBpbiBhbiBvdXRwdXQgZGV2aWNlCisJICBBY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc3BlY2lmaWNhdGlvbiwgYXBwbGljYXRpb24gbXVzdCBzZXQgdGhpcyBmaWVsZAorCSAgZm9yIGFuIG91dHB1dCBkZXZpY2UuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQzMDEzCisKKzIwMTUtMDItMjQgMDU6NTc6MjQgKzAyMDAgIElseWEgS29uc3RhbnRpbm92IDxpbHlhLmtvbnN0YW50aW5vdkBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2NvbW1vbi5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2NvbW1vbi5oOgorCSAgb3N4YXVkaW9zcmM6IGlPUyByZXNhbXBsaW5nIGNhdXNlcyBzdHV0dGVyaW5nCisJICBGaXhlcyBzdHV0dGVyaW5nIGF1ZGlvIHdoZW4gaU9TIEFVIGlzIHJlc2FtcGxpbmcuIFRvIG1ha2UgQVUgcmVzYW1wbGUsCisJICBvbmUgaGFzIHRvIHJlcXVlc3QgYSByYXRlIHRoYXQgZGlmZmVycyBmcm9tIEFWQXVkaW9TZXNzaW9uJ3MKKwkgIHNhbXBsZVJhdGUuIFRoZSByZXNhbXBsaW5nIGl0c2VsZiBpcyBub3QgdGhlIGN1bHByaXQsIGJ1dCByYXRoZXIgb3VyCisJICBBUEkgbWlzdXNlLgorCSAgQXVkaW9Vbml0UmVuZGVyIG1vZGlmaWVzIHRoZSBtRGF0YUJ5dGVTaXplIG1lbWJlcnMgd2l0aCB0aGUKKwkgIGFjdHVhbCByZWFkIGJ5dGVzIGNvdW50LiBUaGVyZWZvcmUsIHRoZXkgbXVzdCBiZSByZWluaXRpYWxpemVkCisJICBiZWZvcmUgZWFjaCBBdWRpb1VuaXRSZW5kZXIuIChUaGUgYnVmZmVycyB0aGVtc2VsdmVzIGNhbiBiZQorCSAgcHJlYWxsb2NhdGVkLikKKwkgIFRoZSAic3R1dHRlciIgd2FzIGNhdXNlZCBieSBvbmUgQXVkaW9Vbml0UmVuZGVyIG1ha2luZyB0aGUgYnVmZmVyCisJICB0b28gc21hbGwgZm9yIG90aGVyIEF1ZGlvVW5pdFJlbmRlciBpbnZvY2F0aW9ucywgbWFraW5nIHRoZW0gZmFpbAorCSAgd2l0aCAtNTAgKHBhcmFtRXJyKS4gQnkgd2F5IG9mIGx1Y2ssIHdoZW4gQVUgZGlkbid0IHJlc2FtcGxlLCBhbGwKKwkgIEF1ZGlvVW5pdFJlbmRlciBpbnZvY2F0aW9ucyByZWFkIHRoZSBzYW1lIG51bWJlciBvZiBieXRlcy4KKwkgIChUaGlzIHBhdGNoIGFkZHJlc3NlcyBzb21lIG5vbi1pbnRlcmxlYXZlZCBhdWRpbyBjb25jZXJucywgYnV0CisJICBhdCB0aGlzIG1vbWVudCB0aGUgZWxlbWVudHMgZG8gbm90IHN1cHBvcnQgbm9uLWludGVybGVhdmVkIGF1ZGlvCisJICBhbmQgbm9uLWludGVybGVhdmVkIGlzIHVudGVzdGVkLikKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDQ5MjIKKworMjAxNS0wMi0yMiAwMTo0OTo1MiArMDEwMCAgS3J6eXN6dG9mIEtvdGxlbmdhIDxwb2Nla0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGltcHJvdmUgZXJyb3IgbWVzc2FnZSB3aGVuIHVuYXV0aG9yaXplZAorCSAgTWFrZSB1c2Ugb2YgTk9UX0FVVEhPUklaRUQgZXJyb3IgY29kZSBpbnN0ZWFkIG9mIGZhbGxpbmcgYmFjayB0byBnZW5lcmljCisJICBSRUFEIGVycm9yLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYwMTczMworCisyMDE1LTAyLTIzIDIwOjA2OjI1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzoKKwkgIHhpbWFnZXNyYzogcmVtb3ZlIHBvaW50bGVzcyBnX3JldHVybl92YWxfaWZfZmFpbCgpCisJICB4aW1hZ2Ugd29uJ3QgZXZlciBiZSBOVUxMIGhlcmUgYmVjYXVzZSB0aGUgZGlzcG9zZQorCSAgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSB4aW1hZ2UtPmRpc3Bvc2UoKS4KKworMjAxNS0wMi0yMyAxOTo0MDoyNSArMDEwMCAgVGhpYmF1bHQgU2F1bmllciA8dHNhdW5pZXJAZ25vbWUub3JnPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEFsbCBzZWdtZW50IHJlc3VsdGluZyBmcm9tIGEgc2VlayBzaG91bGQgaGF2ZSB0aGUgc2FtZSBzZXFudW0KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDQ5ODMKKworMjAxNS0wMi0xOSAyMzoxMjozMSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogRW5hYmxlIGNvcHkgd2hlbiBubyBrbm93biBhbGxvY2F0aW9uIHBhcmFtcworCSAgV2hlbiB0aGVyZSBpcyBubyBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgaW4gdGhlIHF1ZXJ5LCBlbmFibGUgY29weQorCSAgdGhyZXNob2xkLiBXaGVuIHRoaXMgdGhyZXNob2xkIGlzIHJlYWNoZWQsIHRoZSBidWZmZXIgcG9vbCB3aWxsIHN0YXJ0CisJICBjb3B5aW5nIHdoZW4gdGhlIHBvb2wgcmVhY2hlcyBhIGNyaXRpY2FsIGxldmVsLiBJZiB0aGUgZHJpdmVyIHN1cHBvcnRzCisJICBDUkVBVEVfQlVGUywgdGhpcyB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KKworMjAxNS0wMi0xOSAyMzowODozNCAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogVXBkYXRlIGFsbG9jYXRvciBmbGFncworCSAgV2hlbiB3ZSBoaXQgZW11bGF0ZWQgZm9ybWF0cywgd2UgZGlzYWJsZSBDUkVBVEVfQlVGUyBzaW5jZSBsaWJ2NGwyCisJICBjb3BlIHZlcnkgYmFkbHkgd2l0aCBpdC4gQWxzbyBjbGVhciB0aGUgYWxsb2NhdG9yIGZsYWdzIHNvIHdlIHdpbGwKKwkgIG5ldmVyIHRyeSB0byBhbGxvY2F0ZSBtb3JlIGJ1ZmZlcnMuIFRoaXMgZml4ZXMgZmFpbHVyZSB3aGVuIHRoZSBjb3B5CisJICB0aHJlc2hvbGQgaXMgcmVhY2hlZCBhcyB3ZSB3aGVyZSBjYWxsaW5nIENSRUFURV9CVUZTLCB3aGljaCBsZWFkIHRvCisJICBsaWJ2NGwyIGluc3RhYmlsaXR5LgorCisyMDE1LTAyLTE5IDIzOjA3OjIzIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBVc2Ugc3BlY2lmaWMgZGVidWcgY2F0ZWdvcnkKKwkgIFRoZSBwb29sIGhhcyBncm93biBlbm91Z2ggdGhhdCBpdCBpcyBub3cgaGFuZHkgdG8gc2VwZXJhdGUgdjRsMm9iamVjdAorCSAgdHJhY2UgZnJvbSB2NGwyYnVmZmVycG9vbCB0cmFjZS4KKworMjAxNS0wMi0xOSAxNDoyOTowMiArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5LmM6CisJICBydHB2cDhwYXk6IGRlZmF1bHQgZW5jb2RpbmcgbmFtZSB0byBWUDgKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzc4MTAKKworMjAxNS0wMi0xOSAxNDowNjo1MSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5LmM6CisJICBydHB2cDhwYXk6IG1ha2UgY2FwcyB3cml0YWJsZSBiZWZvcmUgdHJ1bmNhdGluZyB0aGVtCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3ODEwCisKKzIwMTUtMDItMDUgMTA6Mjk6MjYgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5jOgorCSAgcnRwdnA4cGF5OiBuZWdvdGlhdGUgZW5jb2RpbmcgbmFtZQorCSAgQ2hyb21lIHVzZXMgYSBkaWZmZXJlbnQgb25lIHRoYW4gZ3N0cmVhbWVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNzgxMAorCisyMDE1LTAyLTE5IDEyOjM1OjA3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBTZW5kIGluaXRpYWwgZXZlbnRzIG9uIHN5bmNfcnRjcCBwYWQgd2hlbiB1c2luZyBSVFAvUlRDUCBtdXhpbmcKKwkgIE90aGVyd2lzZSB3ZSB3aWxsIGp1c3Qgc2VuZCBidWZmZXJzIG9uIHRoZSBwYWQgd2l0aG91dCBhbnkgZXZlbnRzIGJlZm9yZWhhbmQKKwkgIGFuZCB3aWxsIGdldCBnX3dhcm5pbmdzKCkgYWJvdXQgdGhhdC4KKworMjAxNS0wMi0xOSAxMToyMDo1MSArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICBqYWNrOiBjYXNlIG1pc3NpbmcgYnJlYWsgc3RhdGVtZW50CisJICBjb21taXQgYjEwOThjMmVhNWVhYmVhN2FmMDhjZTUxZDIyYjg2N2VhZWQyYmJlMiBhZGRlZCBhIG5ldyBjYXNlIGluCisJICBnc3RfamFja19hdWRpb19zcmNfZ2V0X3Byb3BlcnR5KCkgYnV0IGZvcmdvdCB0byBhZGQgdGhlIGJyZWFrIHN0YXRlbWVudCB0byBpdC4KKworMjAxNS0wMi0xOCAxOToxODowMCArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgUmV2ZXJ0ICJ2NGwyOiBmcmFjdGlvbiBpcyByZXZlcnNlZCIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgYjkxZmUzNjY0NGIxNWFlMDcwZDcyYjllOGE5YzcwODdlODJhZWYxMi4KKworMjAxNS0wMi0xOCAxNzo0OToyOSArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgdjRsMjogZnJhY3Rpb24gaXMgcmV2ZXJzZWQKKwkgIEluIHRoZSBmcmFjdGlvbiAxIC8gMi4gMSBpcyB0aGUgbnVtZXJhdG9yIGFuZCAyIGlzIHRoZSBkZW5vbWluYXRvci4KKwkgIFRoZSBhcmd1bWVudHMgb2YgZnJhY3Rpb24gZ3N0X3ZhbHVlX3NldF9mcmFjdGlvbnMoKSBhcmUgdmFsdWUsCisJICBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yLgorCSAgQWxzbywgZ3N0X3ZhbHVlX3NldF9mcmFjdGlvbigpIGZhaWxzIGlmIGRlbm9taW5hdG9yIGlzIDAgZm9yIG9idmlvdXMKKwkgIHJlYXNvbnMuCisKKzIwMTUtMDItMTcgMjA6MjY6NTUgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMnBvb2w6IERlYWN0aXZhdGUgb3RoZXIgcG9vbAorCSAgV2hlbiBpbXBvcnRpbmcgYnVmZmVycyBmcm9tIGEgZG93bnN0cmVhbSBwb29sLCB3ZSBuZWVkIHRvIGRlYWN0aXZhdGUKKwkgIHRoYXQgcG9vbCB0byBlbnN1cmUgaXQgd2lsbCBiZSB1c2FibGUgYWdhaW4gbGF0ZXIuIFJlbHlpbmcgb24gdGhlCisJICByZWZjb3VudCB0byByZWFjaCB6ZXJvIGRvZXMgbm90IHdvcmssIHNpbmNlIGVsZW1lbnRzIGxpa2UgeHZpbWFnZXNpbmsKKwkgIGtlZXBzIGEgcmVmZXJlbmNlIG9uIHRoZWlyIHByb3Bvc2VkIHBvb2wuCisKKzIwMTUtMDItMTggMTA6MTA6NTMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdG11eDogcmVtb3ZlIG5vdCBuZWVkZWQgY29uZGl0aW9uCisJICBnc3RfYnVmZmVyX3JlcGxhY2UgY2FuIGhhbmRsZSBOVUxMIGlucHV0cyBieSBpdHNlbGYKKworMjAxNS0wMi0xOCAwOTo0MDoxNCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHByZWZlciB0aGUgdGZkdCB0aW1lc3RhbXAgb3ZlciB0aGUgYnVmZmVyJ3MgdGhhdCBpcyBsZXNzIGFjY3VyYXRlCisJICBUaGUgdGZkdCBzaG91bGQgYmUgbW9yZSBhY2N1cmF0ZSBhcyB0aGUgYnVmZmVyIHRpbWVzdGFtcCBpcyBwcm92aWRlZAorCSAgYnkgdGhlIGZyYWdtZW50ZWQgZm9ybWF0IG1hbmlmZXN0IGFuZCBpdCBtaWdodCBqdXN0IGJlIGFuIGFwcHJveGltYXRpb24uCisKKzIwMTUtMDItMTcgMTY6NTc6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBXaGVuIHJlc2V0dGluZyB0aGUgaml0dGVyYnVmZmVyIGJlY2F1c2Ugb2YgcGFja2V0IGRpc2NvbnQsIGRvbid0IGZsdXNoIHN0aWNreSBldmVudHMKKwkgIFdlIHdpbGwgb3RoZXJ3aXNlIGZsdXNoIGF3YXkgU1RSRUFNX1NUQVJULCBDQVBTIG9yIFNFR01FTlQgZXZlbnRzIGFuZCB3aWxsCisJICBjb25mdXNlIGRvd25zdHJlYW0gd2l0aCBidWZmZXJzIHRoYXQgY29tZSBiZWZvcmUgc3VjaCBldmVudHMuCisKKzIwMTUtMDItMTcgMTI6MjA6NTcgKzAxMDAgIGhhcmsgPGhhcmtAcHVzY2lpLm5sPgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmg6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5oOgorCSAgamFjazogQWRkIHByb3BlcnR5IHBvcnQtcGF0dGVybiB0byBzcGVjaWZ5IHdoaWNoIEpBQ0sgcG9ydHMgdG8gY29ubmVjdCB0bworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MDcxOQorCisyMDE1LTAyLTE3IDEyOjMxOjA2ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdGlzb2ZmLmM6CisJKiBnc3QvaXNvbXA0L2dzdGlzb2ZmLmg6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIGlzb21wNDogUmVkZWZpbmUgZ3N0X2lzb2ZmXyBzeW1ib2xzIHRvIGdzdF9pc29mZl9xdF8KKwkgIFdlIG5lZWQgZGlmZmVyZW50IHN5bWJvbCBuYW1lcywgYmVjYXVzZSB0aGVzZSBzeW1ib2xzIGFyZSBhbHNvIHByZXNlbnQKKwkgIGluIHRoZSBmcmFnbWVudGVkIHBsdWdpbiAuLi4gd2hpY2ggd2lsbCBjYXVzZSBjb25mbGljdHMgd2hlbiBkb2luZworCSAgc3RhdGljIGxpbmtpbmcKKworMjAxNS0wMi0xNiAxNDozMTowNSArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L2dvb20yazEvbGluZXMuYzoKKwkgIGdvb20yazE6IHVzZSBmcmFjdGlvbmFsIHBhcnQgb2YgZmxvYXQgZGl2aXNpb24KKworMjAxNS0wMi0xNiAxMzo1OToxNCArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkgIHNwbGl0bXV4c2luOiByZW1vdmUgZGVhZCBjb2RlCisJICBFdmVyeSBpbnN0YW5jZSBvZiBnb3RvIGJlYWNoIGhhcyBidWZfaW5mbyBlcXVhbCBOVUxMLiBEb24ndCBjaGVjaworCSAgZm9yIGEgY29uZGl0aW9uIHRoYXQgbmV2ZXIgaGFwcGVucy4KKwkgIENJRCAjMTI2ODM5OQorCisyMDE1LTAyLTE1IDIxOjQ1OjI0IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc3BsaXRtdXguYzoKKwkgIHNwbGl0bXV4LXRlc3Q6IFBhcnNlIGVycm9yIG1lc3NhZ2UKKwkgIFRoZSB0ZXN0IGhhZCBhIGZ1bmN0aW9uIHRvIHByaW50IHRoZSBlcnJvciwgYnV0IHdhcyBub3QgcGFyc2luZyBpdC4KKwkgIFRoaXMgd2FzIGNhdXNpbmcgd2FybmluZyBhYm91dCBkYmdfaW5mbyBiZWluZyB1c2VkIHVuaW5pdGlhbGl6ZWQuIElmCisJICB0aGUgdGVzdCB3YXMgdGVzdGluZyBhbnkgZXJyb3JzLCB0aGlzIHdvdWxkIGhhdmUgY3Jhc2hlZC4KKworMjAxNS0wMi0xNSAyMTozNDoyOCAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IEZpeCBtaW4gYW5kIG1heCBmb3IgYmFuZHMgcHJvcGVydHkKKwkgIFRoZSBudW1iZXIgb2YgRkZUcyBpcyBjYWxjdWxhdGVkIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtdWxhOgorCSAgZ3VpbnQgbmZmdCA9IDIgKiBiYW5kcyAtIDI7CisJICBuZmZ0IGlzIHBhc3NlZCB0byBnc3RfZmZ0X2YzMl9uZXcoKSBhcyB0aGUgbGVuIGFyZ3VtZW50IGFuZCBpcyBvZiB0eXBlCisJICB1bnNpZ25lZCBpbnRlZ2VyLiBUaGlzIG1ldGhvZCByZXF1aXJlZCB0aGF0IGxlbiBpcyBhdCBsZWFzIDEsIHRoZW4KKwkgIG1heGltdW0gR19NQVhJTlQsIGFzIG90aGVyIHZhbHVlcyB3b3VsZCBiZSBuZWdhdGl2ZS4gSWYgd2UgZXh0cmFwb2xhdGUKKwkgIGZyb20gdGhlIGZvcm11bGEgYWJvdmUgaXQgbWVhbnMgd2UgbmVlZCAiYmFuZHMiIHRvIGJlIGJldHdlZW4gMiBhbmQKKwkgICgoZ3VpbnQpR19NQVhJTlQgKyAyKSAvIDIpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NDIxMworCisyMDE1LTAyLTE1IDE1OjUxOjU1IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogRml4IGZyZWVpbmcgb2Ygc2hhcmVkIG1lbW9yeQorCSAgV2hlbiBtZW1vcnkgKHRoYXQgaGFzIGJlZW4gc2hhcmVkIHVzaW5nIGdzdF9tZW1vcnlfc2hhcmUoKSkgYXJlIGZyZWVkLAorCSAgdGhlIG1lbW9yeSAob3IgdGhlIERNQUJVRiBGRCkgc2hvdWxkIG5vdCBiZWUgZnJlZWQuIFRoZXNlIG1lbW9yaWVzIGhhdmUKKwkgIGEgcGFyZW50LiBUaGlzIGFsc28gcmVtb3ZlcyB0aGUgZXh0cmEgX3Y0bDJtZW1fZnJlZSBmdW5jdGlvbiBhbmQgYXZvaWQKKwkgIGNhbGxpbmcgY2xvc2UgdHdpY2Ugb24gdGhlIERNQUJVRiBGRC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDQ1NzMKKworMjAxNS0wMi0xNCAxMToxMTozMCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRvIG5vdCB1c2Ugc3BhcnNlIHN0cmVhbXMgaW4gcHVzaC1iYXNlZCBzZWVraW5nCisJICBVc2luZyB0aGUgc3BhcnNlIHN0cmVhbXMgY2FuIG1ha2UgdGhlIHB1c2gtYmFzZWQgc2Vla2luZyByZXR1cm4KKwkgIHRvbyBmYXIgaW4gdGhlIHN0cmVhbS4gSXQgYWxzbyBjYW4gbGVhZCB0byBpc3N1ZXMgYXMgdGhlCisJICBzcGFyc2Ugc3RyZWFtcyB3aWxsIGJlIGlnbm9yZWQgd2hlbiByZXN0YXJ0aW5nIHBsYXliYWNrIGFuZCwKKwkgIGlmIHRoZSBzcGFyc2Ugc3RyZWFtIGlzIHRoZSBvbmUgdGhhdCBoYXMgdGhlIGVhcmxpZXN0IHNhbXBsZSwKKwkgIGl0IHdpbGwgY29uZnVzZSBxdGRlbXV4J3Mgb2Zmc2V0cyBhcyBvbmUgc3RyZWFtIHdpbGwgaGF2ZQorCSAgYW4gZWFybGllciBvZmZzZXQgdGhhbiB0aGUgZGVtdXhlcidzIG9uZSB3aGljaCBtaWdodCBsZWFkIHRvCisJICBlYXJseSBFT1MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQyNjYxCisKKzIwMTUtMDItMTMgMTk6NDM6MTYgKzA5MDAgIEppbW15IE9obiA8eW9uZ2ppbi5vaG5AbGdlLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBFbmhhbmNlIGNvZGUgcmVhZGFiaWxpdHkgaW4gcHVsc2VzaW5rX3F1ZXJ5CisJICBJbiBwdWxzZXNpbmtfcXVlcnkgZnVuY3Rpb24sIHdlIHVzZSBhIHN3aXRjaCBmb3IgdGhlIHF1ZXJ5CisJICB0eXBlLiBJbiB0aGUgQ0FQUyBjYXNlLCB0aGVyZSBpcyBubyAnYnJlYWsnLCBpbnN0ZWFkIHdlCisJICByZXR1cm4gcmlnaHQgYXdheS4gVXNlIGEgYnJlYWsgYW5kIHJldHVybiBhdCB0aGUgZW5kIG9mCisJICB0aGUgZnVuY3Rpb24gaW5zdGVhZCBmb3IgYmV0dGVyIGNvZGUgcmVhZGFiaWxpdHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ0NDYxCisKKzIwMTUtMDItMTMgMjA6NDA6NDggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmM6CisJICBzcGxpdG11eHNpbms6IGZsYWcgYXMgc2luayBmcm9tIHRoZSBzdGFydAorCisyMDE1LTAyLTExIDE1OjMwOjQ0ICswMTAwICBQaGlsaXBwZSBOb3JtYW5kIDxwaGlsbkBpZ2FsaWEuY29tPgorCisJKiBnc3QvaXNvbXA0L01ha2VmaWxlLmFtOgorCSogZ3N0L2lzb21wNC9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvZ3N0aXNvZmYuYzoKKwkqIGdzdC9pc29tcDQvZ3N0aXNvZmYuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBJbml0aWFsICdzaWR4JyBhdG9tIHBhcnNpbmcgc3VwcG9ydAorCSAgUGFyc2UgdGhlICdzaWR4JyBhdG9tIGFuZCB1cGRhdGUgdGhlIHRvdGFsIGR1cmF0aW9uIGFjY29yZGluZyB0byB0aGUKKwkgIHBhcnNlciByZXN1bHQuIFRoZSBpc29mZiBwYXJzZXIgY29kZSBpcyBpbXBvcnRlZCBmcm9tCisJICBnc3QtcGx1Z2lucy1iYWQncyBkYXNoZGVtdXggYW5kIGEgZ3N0X2lzb2ZmX3NpZHhfcGFyc2VyX2FkZF9kYXRhKCkKKwkgIGZ1bmN0aW9uIHdhcyBmYWN0b3JlZCBvdXQgb2YgdGhlIGdzdF9pc29mZl9zaWR4X3BhcnNlcl9hZGRfYnVmZmVyKCkKKwkgIGZ1bmN0aW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MzU3OAorCisyMDE1LTAyLTExIDA1OjA2OjQ1ICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBVc2UgZ3N0X3ZpZGVvX2d1ZXNzX2ZyYW1lcmF0ZSgpCisJICBVc2UgZ3N0X3ZpZGVvX2d1ZXNzX2ZyYW1lcmF0ZSgpIGZyb20gbGliZ3N0dmlkZW8gdG8gZ3Vlc3MKKwkgIHNlbnNpYmxlIGNvbW1vbiBmcmFtZXJhdGVzIHdoZXJlIHBvc3NpYmxlIGZyb20gdGhlCisJICBmbG9hdGluZyBwb2ludCBmcHMgaW4gdGhlIHN0cmVhbS4KKworMjAxNS0wMi0xMSAxMzo1MzowMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIEltcHJvdmUgYW5kIGZpeCBMQVRFTkNZIHF1ZXJ5IGhhbmRsaW5nCisJICBUaGlzIG5vdyBmb2xsb3dzIHRoZSBkZXNpZ24gZG9jcyBldmVyeXdoZXJlLCBlc3BlY2lhbGx5IHRoZSBtYXhpbXVtIGxhdGVuY3kKKwkgIGhhbmRsaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NDEwNgorCisyMDE1LTAyLTExIDEwOjI5OjU1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBIYW5kbGUgZmlyc3QgUlRDUCBwYWNrZXQgYW5kIGVhcmx5IGZlZWRiYWNrIGNvcnJlY3RseQorCSAgQWNjb3JkaW5nIHRvIFJGQyA0NTg1IHNlY3Rpb24gMy41LjMgc3RlcCAxIHdlIGFyZSBub3QgYWxsb3dlZCB0byBzZW5kCisJICBhbiBlYXJseSBSVENQIHBhY2tldCBmb3IgdGhlIHZlcnkgZmlyc3Qgb25lLiBJdCBtdXN0IGJlIGEgcmVndWxhciBvbmUuCisJICBBbHNvIG1ha2Ugc3VyZSB0byBub3QgdXNlIGxhc3RfcnRjcF9zZW5kX3RpbWUgaW4gYW55IGNhbGN1bGF0aW9ucyB1bnRpbAorCSAgd2UgYWN0dWFsbHkgc2VudCBhbiBSVENQIHBhY2tldCBhbHJlYWR5LiBJbiBzcGVjaWZpYyB0aGlzIG1lYW5zIHRoYXQgd2UKKwkgIG11c3Qgbm90IHVzZSBpdCBmb3IgZm9yd2FyZCByZWNvbnNpZGVyYXRpb24gb2YgdGhlIGN1cnJlbnQgUlRDUCBzZW5kIHRpbWUuCisJICBJbnN0ZWFkIHdlIGRvbid0IGRvIGFueSBmb3J3YXJkIHJlY29uc2lkZXJhdGlvbiBmb3IgdGhlIGZpcnN0IFJUQ1AgcGFja2V0LgorCisyMDE1LTAyLTEwIDE4OjUzOjUzICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkgIHJ0cGgyNjNkZXBheTogZml4IGNvbXBpbGF0aW9uIHdpdGggZ2NjIDUuMAorCisyMDE1LTAyLTEwIDE2OjAwOjA3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXhzaW5rOiBmaXggZXhhbXBsZSBwaXBlbGluZSBwcm9wZXJseQorCSAgeDI2NGVuYyBtaWdodCBub3QgaGF2ZSBhIG1heC1rZXktaW50IHByb3BlcnR5LCBidXQgaXQKKwkgIGhhcyBhIGtleS1pbnQtbWF4IHByb3BlcnR5Li4uCisKKzIwMTUtMDItMTAgMTQ6NTc6NTUgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkgIHNwbGl0bXV4OiBmaXggdHlwbworCisyMDE1LTAyLTEwIDE0OjU2OjIzICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSAgc3BsaXRtdXg6IHVwZGF0ZSBleGFtcGxlIHBpcGVsaW5lCisJICBFbGVtZW50IHgyNjRlbmMgZG9lc24ndCBoYXZlIGEgbWF4LWtleS1pbnQgcHJvcGVydHkKKworMjAxNS0wMi0xMCAxMzoyOTozMiArMDAwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpcy5iZ0BzYW1zdW5nLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkgIHNwbGl0bXV4OiBmaXggbWVtb3J5IGxlYWsKKwkgIElmIGV4ZWN1dGlvbiBnb2VzIHRvIHRoZSBiZWFjaCBpbiBsaW5lIDk4MSwgYnVmX2luZm8gZ29lcyBvdXQgb2Ygc2NvcGUgd2l0aG91dAorCSAgdGhlIG1lbW9yeSBiZWluZyBmcmVlJ2QuIEhhbmRsZSB0aGlzIGNhc2UuCisJICBDSUQgIzEyNjg0MDMKKworMjAxNS0wMi0wOCAxMjowMzoxMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IGF3a3dhcmQgaWYgY2xhdXNlCisKKzIwMTUtMDItMDcgMDE6NDE6NDkgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4cGFydHJlYWRlci5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwbGl0bXV4LmM6CisJICBzcGxpdG11eDogQWRkIHVuaXQgdGVzdCBmb3IgZmlsZSBzcGxpdHRpbmcKKwkgIEFkZCBhIHVuaXQgdGVzdCBmb3IgZmlsZSBzcGxpdHRpbmcsIGFuZCBmaXggdGhlIGxlYWtzIGluIHRoZQorCSAgc3BsaXRtdXhzaW5rIGl0IGZvdW5kCisKKzIwMTUtMDItMDYgMTQ6NDM6MjIgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IGZpeCB3aGljaCBzdG9wIHZhcmlhYmxlIGlzIHVzZWQgaW4gYXNzaWdubWVudAorCSAgQXNzaWdubWVudCBpcyBkb25lIHRvIHZhcmlhYmxlIHNlZ21lbnQuc3RvcCB3aGVuIHRoZSBpbnRlbnRpb24gd2FzIHRvIGFzc2lnbiB0bworCSAgbG9jYWwgdmFyaWFibGUgc3RvcC4gSW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdCwgdGhlIHZhbHVlIGlzIG5vdyBjbGFtcGVkIGFuZAorCSAgc2VnbWVudC5zdG9wIGlzIHNldCB0byBpdCBzb29uIGFmdGVyLgorCSAgQ0lEICMxMjY1NzczCisKKzIwMTUtMDItMDcgMDA6MTk6MzYgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4cGFydHJlYWRlci5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNyYy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc3BsaXRtdXguYzoKKwkgIHNwbGl0bXV4OiBGaXggbWVtb3J5IGxlYWtzIHVudGlsIHRoZSB0ZXN0IHZhbGdyaW5kcyBjbGVhbgorCisyMDE1LTAyLTA2IDA2OjQyOjE3ICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuYzoKKwkgIHNwbGl0bXV4OiBIYW5kbGUgZWFybHkgRU9TIGR1cmluZyBwYXJ0IHByZXBhcmF0aW9uCisJICBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYSBzaG9ydCBmaWxlIHJlYWNoZXMgRU9TIHdoaWxlIHdlJ3JlIHN0aWxsCisJICB3YWl0aW5nIGZvciBuby1tb3JlLXBhZHMsIGFuZCBtYWtlIHN1cmUgd2UgY29udGludWUgdG8gdGhlIGludGVybmFsCisJICBSRUFEWSBzdGF0ZSBmb3IgcmVhbCBwbGF5YmFjayB0byB3b3JrIHByb3Blcmx5IGxhdGVyLgorCisyMDE1LTAyLTA2IDA1OjAzOjE5ICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvZmlsZXMvc3BsaXR2aWRlbzAwLm9nZzoKKwkqIHRlc3RzL2ZpbGVzL3NwbGl0dmlkZW8wMS5vZ2c6CisJKiB0ZXN0cy9maWxlcy9zcGxpdHZpZGVvMDIub2dnOgorCSAgdGVzdHM6IENoYW5nZSBzcGxpdG11eCB0ZXN0IHZpZGVvIGZpbGVzCisJICBBdm9pZCB0ZXN0IGZhaWx1cmUgYnkgY2hhbmdpbmcgdGhlIHN0b3JlZCB2aWRlbyByZXNvbHV0aW9uCisJICBmcm9tIDgweDYwIHRvIDgweDY0LCB3aGljaCBuZWVkcyBidWcgNzQxMDMwIHRvIGJlIGZpeGVkLgorCisyMDE0LTA4LTAxIDAwOjA3OjUzICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZ3N0L211bHRpZmlsZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhwYXJ0cmVhZGVyLmg6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuaDoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuaDoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXR1dGlscy5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdHV0aWxzLmg6CisJKiBnc3QvbXVsdGlmaWxlL3Rlc3Qtc3BsaXRtdXhwYXJ0cmVhZGVyLmM6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zcGxpdG11eC5jOgorCSogdGVzdHMvZmlsZXMvc3BsaXR2aWRlbzAwLm9nZzoKKwkqIHRlc3RzL2ZpbGVzL3NwbGl0dmlkZW8wMS5vZ2c6CisJKiB0ZXN0cy9maWxlcy9zcGxpdHZpZGVvMDIub2dnOgorCSAgc3BsaXRtdXg6IEltcGxlbWVudCBuZXcgZWxlbWVudHMgZm9yIHNwbGl0dGluZyBmaWxlcyBhdCBtdXggbGV2ZWwuCisJICBJbXBsZW1lbnQgMiBuZXcgZWxlbWVudHMgLSBzcGxpdG11eHNpbmsgYW5kIHNwbGl0bXV4c3JjLgorCSAgc3BsaXRtdXhzaW5rIGlzIGEgYmluIHdoaWNoIHdyYXBzIGEgbXV4ZXIgYW5kIHRha2VzIDEgdmlkZW8gc3RyZWFtLAorCSAgcGx1cyBhdWRpby9zdWJ0aXRsZSBzdHJlYW1zLCBhbmQgc3RhcnRzIGEgbmV3IGZpbGUKKwkgIHdoZW5ldmVyIG5lY2Vzc2FyeSB0byBhdm9pZCBvdmVycnVubmluZyBhIHRocmVzaG9sZCBvZiBlaXRoZXIgYnl0ZXMKKwkgIG9yIHRpbWUuIE5ldyBmaWxlcyBhcmUgc3RhcnRlZCBhdCBhIGtleWZyYW1lLCBhbmQgY29ycmVzcG9uZGluZyBhdWRpbworCSAgYW5kIHN1YnRpdGxlIHN0cmVhbXMgYXJlIHNwbGl0IGF0IHBhY2tldCBib3VuZGFyaWVzIHRvIG1hdGNoCisJICB2aWRlbyBHT1AgdGltZXN0YW1wcy4KKwkgIHNwbGl0bXV4c3JjIGlzIGEgY29ycmVzcG9uZGluZyBzb3VyY2UgZWxlbWVudCB3aGljaCBoYW5kbGVzCisJICB0aGUgc3BsaXRtdXg6Ly8gVVJMIGFuZCBwbGF5cyBiYWNrIGFsbCBjb21wb25lbnQgZmlsZXMsCisJICByZWNvbnN0cnVjdGluZyB0aGUgb3JpZ2luYWwgZWxlbWVudGFyeSBzdHJlYW1zIGFzIGl0IGdvZXMuCisKKzIwMTUtMDItMDQgMTY6MzI6MTQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkqIHRlc3RzL2ZpbGVzL3Rlc3QtY2VydC5wZW06CisJKiB0ZXN0cy9maWxlcy90ZXN0LWtleS5wZW06CisJICB0ZXN0czogc291cGh0dHBzcmM6IHVwZGF0ZSBzc2wga2V5L2NlcnQgcGFpcgorCSAgT3VyIG9uZXMgd2VyZSBleHBpcmVkLiBUaGUgbmV3IG9uZXMgd2VyZSBjb3BpZWQgZnJvbSBsaWJzb3VwJ3MKKwkgIHRlc3RzIGZpbGVzLgorCSAgQWxzbyBzZXRzIHRoZSBwcm9wZXJ0eSB0byB1c2Ugb3VyIG93biBjZXJ0IHRvIHZhbGlkYXRlIHRoZQorCSAgc2VydmVyLCBvdGhlcndpc2UgdGhlIGRlZmF1bHQgc3lzdGVtIGNlcnRzIHdvdWxkIGJlIHVzZWQKKwkgIGFuZCBpdCB3b3VsZCBmYWlsLgorCisyMDE1LTAyLTA0IDAyOjI1OjQ0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXk6IHByZXZlbnQgdHJ5aW5nIHRvIGdldCAwIGJ5dGVzIGZyb20gYWRhcHRlcgorCSAgVGhpcyBjYXVzZXMgYW4gYXNzZXJ0aW9uIGFuZCB3b3VsZCBsZWFkIHRvIGdldHRpbmcgYSBOVUxMIGluc3RlYWQKKwkgIG9mIGEgYnVmZmVyLiBXaXRob3V0IHByb3BlciBjaGVja2luZyB0aGlzIHdvdWxkIGVhc2lseSBsZWFkIHRvCisJICBhIHNlZ2ZhdWx0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3MTk5CisKKzIwMTUtMDItMDQgMjE6NTA6NTEgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBHU1RfU0VHTUVOVF9GTEFHX1RSSUNLTU9ERV9LRVlfVU5JVFMKKwkgIFdoZW4gdGhlIHRyaWNrbW9kZSBrZXktdW5pdHMgZmxhZyBpcyBzZXQgb24gdGhlIHNlZ21lbnQsIHNpbXBseSBza2lwCisJICBhbnkgc2FtcGxlIG9uIGEgdmlkZW8gc3RyZWFtIHRoYXQgaXNuJ3QgYSBrZXlmcmFtZQorCisyMDE1LTAyLTAzIDE3OjM1OjUyICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IGNvbnRhaW5lciBoYW5kbGluZworCSAgV2UgZGV0ZWN0IGEgY29udGFpbmVyIGNvcnJlY3RseSBub3cgc28gd2UgbmVlZCB0byByZXZlcnQgdGhlIHdlaXJkCisJICBjaGVjayB0aGVyZSB3YXMgYmVmb3JlLgorCSAgVXNlIGdzdF9ydHNwc3JjX3N0cmVhbV9wdXNoX2V2ZW50KCkgdG8gcHVzaCB0aGUgY2FwcyBldmVudCBvbiB0aGUKKwkgIHJpZ2h0IHBhZC4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM5MzkxCisKKzIwMTUtMDItMDIgMTk6NDY6MjcgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgbWF0cm9za2FtdXg6IHN0b3JlIGFuZCB3cml0ZSBzdHJlYW0gdGFncworCSAgU2VwYXJhdGUgZ2xvYmFsIGZyb20gc3RyZWFtIHRhZ3Mgc3RvcmFnZSBhbmQgd3JpdGUgdGhlbSB0byB0aGUKKwkgIGFwcHJvcHJpYXRlIHRhZ3MgZW50cnkgaW4gdGhlIG91dHB1dAorCisyMDE1LTAyLTAyIDEzOjM1OjU5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcGFyc2Ugc3RyZWFtIHRhZ3MKKwkgIEtlZXAgZ2xvYmFsIGFuZCBzdHJlYW0gdGFncyBzZXBhcmF0ZWx5IGFuZCBwYXJzZSB0aGUgdWR0YSBub2RlCisJICB0aGF0IGNhbiBiZSBmb3VuZCB1bmRlciB0aGUgdHJhayBhdG9tLiBUaGUgdWR0YSB3aWxsIGNvbnRhaW4KKwkgIHN0cmVhbSBzcGVjaWZpYyB0YWdzIGFuZCB3aWxsIGJlIHB1c2hlZCBhcyBzdWNoCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkyNDczCisKKzIwMTUtMDEtMzEgMTQ6MzI6MzQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5oOgorCSAgcXRtdXg6IHN0b3JlIHN0cmVhbSBhbmQgY29udGFpbmVyIHRhZ3Mgc2VwYXJhdGVseQorCSAgVGFncyByZWNlaXZlZCB2aWEgZXZlbnRzLCB3aGVuIG1hcmtlZCBhcyBzdHJlYW0gdGFncywgd2lsbAorCSAgYmUgc3RvcmVkIG9uIHRoYXQgc3RyZWFtJ3MgdHJhayBhdG9tIGluc3RlYWQgb2YgYmVpbmcgc3RvcmVkCisJICBpbiB0aGUgbWFpbiB0YWdzIGF0b20uIFRoaXMgYWxsb3dzIHRoZSByZXN1bHRpbmcgZmlsZSB0byBoYXZlCisJICBnbG9iYWwgYW5kIHN0cmVhbSB0YWdzIHN0b3JlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTI0NzMKKworMjAxNS0wMS0zMSAxMzoxNDo0NCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogcmVmYWN0b3IgdGFncyBmdW5jdGlvbnMgdG8gYWNjb21vZGF0YSBVRFRBIGF0IHRyYWsgbGV2ZWwKKwkgIFJlZmFjdG9yIHRoZSBmdW5jdGlvbnMgdGhhdCB3ZXJlIGJvdW5kIHRvIHRoZSAnbW9vdicgYXRvbSB0bworCSAgZGlyZWN0bHkgcGFzcyB0aGUgZGVzaXJlZCAndWR0YScgdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgdGFncy4KKwkgIFRoaXMgYWxsb3dzIHRoZSB0YWdzIHRvIGJlIHdyaXR0ZW4gdG8gJ3VkdGEnIGF0IHRoZSAnbW9vdicgb3IKKwkgIHRoZSAndHJhaycgbGV2ZWwsIGNyZWF0aW5nIHRhZ3MgdGhhdCBhcmUgZm9yIHRoZSBjb250YWluZXIgb3IKKwkgIGZvciBhIHN0cmVhbSBvbmx5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MjQ3MworCisyMDE1LTAxLTMxIDEwOjQ3OjQwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBtYXAgYXBwbGljYXRpb24gbmFtZSB0byBfc3dyIHRhZworCSAgSXQgcmVmZXJzIHRvIHRoZSBhcHBsaWNhdGlvbiBuYW1lIGFuZCB2ZXJzaW9uIHVzZWQgdG8gY3JlYXRlIHRoZQorCSAgZmlsZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MjQ3MworCisyMDE1LTAxLTMxIDAyOjMwOjQwICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogRml4IHNlZWtpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGluIHJldmVyc2UgbW9kZS4KKwkgIFNuYXAgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSB3aGVuIHNlZWtpbmcgcGFzdCB0aGUgZW5kIGluIHJldmVyc2UgbW9kZSwKKwkgIGFuZCBhbHNvIGZpeCBHU1RfU0VFS19UWVBFX0VORCBhbmQgR1NUX1NFRUtfVFlQRV9OT05FIGhhbmRsaW5nCisJICBmb3IgdGhlIHN0b3AgcG9zaXRpb24gYnkgYWx3YXlzIHNlZWtpbmcgb24gYSBzZWdtZW50IGluIHN0cmVhbSB0aW1lCisKKzIwMTUtMDEtMzAgMTg6MjI6MzEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IEZpeCBzaWduYWwgbmFtZQorCSAgVGhpcyB3YXNuJ3QgbWVhbnQgdG8gYmUgcHVzaGVkIGF0IGFsbCB5ZXQsIGJ1dCBub3cgdGhhdCBpdCdzIHRoZXJlCisJICBhbHJlYWR5IGl0IHdvbid0IGh1cnQgdG8gbWFrZSBpdCBjb3JyZWN0IGF0IGxlYXN0LgorCisyMDE1LTAxLTMwIDE2OjU2OjM1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwc3RhdHM6IEZpeCB0eXBvIGluIGRvY3VtZW50YXRpb24KKworMjAxNS0wMS0zMCAxNjo1MDozNiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogQWRkIG5ldyBvbi1yZWNlaXZpbmctcnRjcCBzaWduYWwKKwkgIFRoaXMgd2lsbCBiZSBlbWl0dGVkIHdoZW5ldmVyIGFuIFJUQ1AgcGFja2V0IGlzIHJlY2VpdmVkLiBEaWZmZXJlbnQgdG8KKwkgIG9uLWZlZWRiYWNrLXJ0Y3AsIHRoaXMgc2lnbmFsIGdldHMgZXZlcnkgY29tcGxldGUgUlRDUCBwYWNrZXQgYW5kIG5vdAorCSAganVzdCB0aGUgaW5kaXZpZHVhbCBmZWVkYmFjayBwYWNrZXRzLgorCisyMDE1LTAxLTI4IDE0OjAyOjE1IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBzaW1wbGlmeSBzZWdtZW50LmJhc2UgbWF0aAorCSAgUmVtb3ZlIGEgZml4IGZvciBoZWF2aWx5IGVkaXRlZCBmaWxlcyBhZGRlZCBmb3IgZml4aW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ1ODMwIHRvIHdvcmsKKwkgIHdpdGggc2Vla3MgYW5kIHByb3BlciBnYXBzIHBsYXliYWNrLiBUaGUgZml4IHdhcyByZXBsYWNlZAorCSAgZm9yIGEgbW9yZSBnZW5lcmFsIHNvbHV0aW9uIHRoYXQgYmFzZXMgb24gdXNpbmcgcHJldmlvdXMKKwkgIHNlZ21lbnQncyBkdXJhdGlvbiwganVzdCBsaWtlIGl0IHdvcmtzIGZvciBtZWRpYSBzZWdtZW50cworCSAgcGxheWJhY2suCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQzNTE4CisKKzIwMTUtMDEtMjcgMTQ6MDA6MzUgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJvcmMtZGlzdC5jOgorCSAgdmlkZW9taXhlcjogdXBkYXRlIG9yYyBmaWxlcworCisyMDE1LTAxLTI2IDE3OjA4OjEyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IGRhdGEgZHJvcHBpbmcgZm9yIGZyYWdtZW50ZWQgc3RyZWFtcworCSAgRm9yIGZyYWdtZW50ZWQgc3RyZWFtcyB3aXRoIGV4dHJhIGRhdGEgYXQgdGhlIGVuZCBvZiB0aGUgbWRhdAorCSAgcXRkZW11eCB3YXMgbm90IGRyb3BwaW5nIHRob3NlIGJ5dGVzIGFuZCB3b3VsZCB0cnkgdG8gdXNlCisJICB0aGF0IGV4dHJhIGRhdGEgYXMgdGhlIGJlZ2lubmluZyBvZiBhIG5ldyBhdG9tLCBjYXVzaW5nIHRoZQorCSAgc3RyZWFtIHRvIGZhaWwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQzNDA3CisKKzIwMTUtMDEtMjUgMTc6MzA6MzMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IERlcHJlY2F0ZSBydGNwLWltbWVkaWF0ZS1mZWVkYmFjay10aHJlc2hvbGQgcHJvcGVydHkKKwkgIEl0IGhhZCBubyBlZmZlY3Qgc2luY2UgcXVpdGUgc29tZSB0aW1lIGFuZCBhbHNvIGlzIG5vdCBuZWVkZWQgaW4gZ2VuZXJhbCwKKwkgIGVzcGVjaWFsbHkgbm90IHRvIHN3aXRjaCBiZXR3ZWVuIGltbWVkaWF0ZSBmZWVkYmFjayBtb2RlIGFuZCBlYXJseSBmZWVkYmFjaworCSAgbW9kZS4gVGhlIGxhdGVzdCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBSRkMgaXMgdGhhdCBmcm9tIHRoZSBlbmRwb2ludCBwb2ludCBvZgorCSAgdmlldywgYm90aCBtb2RlcyBhcmUgZXhhY3RseSB0aGUgc2FtZS4gUlRDUCBpcyBvbmx5IGFsbG93ZWQgdG8gdXNlIHRoZQorCSAgYmFuZHdpZHRoIGFzIGdpdmVuIGJ5IHRoZSBSRkMgY29uc3RyYWludHMsIGFzIHN1Y2ggaXQgaXMgb25seSBldmVyIHBvc3NpYmxlCisJICB0byBzY2hlZHVsZSBhIFJUQ1AgcGFja2V0IGVhcmx5IGJ1dCBpdCdzIGFnYWluc3QgdGhlIFJGQyB0byBzY2hlZHVsZSBtb3JlIFJUQ1AKKwkgIHBhY2tldHMuCisJICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGltbWVkaWF0ZSBmZWVkYmFjayBtb2RlIGFuZCBlYXJseSBmZWVkYmFjayBtb2RlIGlzIHRoYXQKKwkgIHRoZSBmb3JtZXIgZ3VhcmFudGVlcyB0aGF0IGFuIFJUQ1AgcGFja2V0IGNhbiBiZSBzZW50IGZvciBldmVyeSBldmVudAorCSAgImltbWVkaWF0ZWx5Iiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgYmFuZHdpZHRoIGNhbGN1bGF0aW9ucyBmcm9tIHRoZSBSRkMgaGF2ZQorCSAgcmVzdWx0ZWQgaW4gYW4gUlRDUCBzY2hlZHVsaW5nIGludGVydmFsIHRoYXQgaXMgc21hbGwgZW5vdWdoLiBFYXJseSBmZWVkYmFjaworCSAgbW9kZSBvbiB0aGUgb3RoZXIgaGFuZCBtZWFucyB0aGF0IHdlIGNhbiBzY2hlZHVsZSBzb21lIHBhY2tldHMgZWFybHkgdG8gbWFrZQorCSAgdGhhdCBoYXBwZW4sIGJ1dCBpdCdzIG5vdCBndWFyYW50ZWVkIGF0IGFsbCB0aGF0IGl0J3MgcG9zc2libGUgdG8gc2NoZWR1bGUKKwkgIGFuIFJUQ1AgcGFja2V0IHBlciBldmVudCAoaS5lLiB0aGV5IG5lZWQgdG8gYmUgYWNjdW11bGF0ZWQgb3IgZHJvcHBlZCkuCisKKzIwMTUtMDEtMjIgMTA6Mjk6MzkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IERlbGF5IHRoZSBuZXh0IHJlZ3VsYXIgUlRDUCBwYWNrZXQgYWZ0ZXIgZWFybHkgUlRDUAorCSAgVGhpcyBpcyByZXF1aXJlZCB0byBub3QgZXhjZWVkIHRoZSBzaG9ydCB0ZXJtIGF2ZXJhZ2UgUlRDUCBiaXRyYXRlIHdoZW4KKwkgIHVzaW5nIGVhcmx5IGZlZWRiYWNrIGFzIGNvbXBhcmVkIHRvIHdpdGhvdXQgZWFybHkgZmVlZGJhY2suCisKKzIwMTUtMDEtMjIgMTA6Mjg6NTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IEFkZCBuZXcgc2VuZC1ydGNwLWZ1bGwgc2lnbmFsCisJICBUaGlzIGluZGljYXRlcyB3aXRoIGEgYm9vbGVhbiByZXR1cm4gdmFsdWUgaWYgc2NoZWR1bGluZyBhIG5ldyBSVENQIHBhY2tldAorCSAgd2l0aGluIHRoZSByZXF1ZXN0ZWQgZGVsYXkgd2FzIHBvc3NpYmxlLiBPdGhlcndpc2UgaXQgYmVoYXZlcyBleGFjdGx5IGxpa2UKKwkgIHNlbmQtcnRjcC4gVGhlIG9ubHkgcmVhc29uIGZvciBhZGRpbmcgYSBuZXcgc2lnbmFsIGlzIEFCSSBjb21wYXRpYmlsaXR5LgorCisyMDE1LTAxLTIwIDAwOjMyOjAwICswMDAwICBKaW1teSBPaG4gPHlvbmdqaW4ub2huQGxnZS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogRnJlZSBmb3JtYXRfaW5mbyBpbiBxdWVyeV9nZXRjYXBzCisJICBJZiB3ZSBjYW4gbm90IGNyZWF0ZSBwcm9iZSBzdHJlYW0gaW4gcXVlcnlfZ2V0Y2FwcyBmdW5jdGlvbiwgaXQgd2lsbCBhcHBlYXIKKwkgIG1lbW9yeSBsZWFrYWdlIGZyb20gZm9ybWF0IGluZm8uCisJICBUaGUgZm9sbG93aW5nIHBhdGNoIHByZXZlbnQgbWVtb3J5IGxlYWthZ2UgaW4gcHVsc2VzaW5rLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MzE3OAorCisyMDE1LTAxLTIzIDE3OjM1OjUxICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thZGVtdXg6IHJlbW92ZSB1bm5lY2Vzc2FyeSBjaGVjaworCSAgTm8gbWF0dGVyIGlmIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9pbmRleF9jdWV0cmFjayAoKSByZXR1cm5zIHRoYXQgdGhlCisJICBmbG93IGlzIE9LIG9yIG5vdCwgdGhlIGNoZWNrIHRoZXJlIHdpbGwgYmUgYSBicmVhayBmcm9tIHRoZSBzd2l0Y2guIFJlbW92aW5nIHRoZQorCSAgY2hlY2sgc2luY2UgdGhlIG91dGNvbWUgaXMgdGhlIHNhbWUuCisJICBDSUQgIzEyNjU3NjIKKworMjAxNS0wMS0yMyAxNToxNjoyNSArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IEF2b2lkIHVzaW5nIGZyZWVkIHZhcmlhYmxlCisJICB0aGUgbmFtZSB2YXJpYWJsZSBtaWdodCBoYXZlIGJlZW4gYXR0cmlidXRlZCB0byBwYWRfbmFtZSwgbWFrZSBzdXJlIHdlCisJICBmcmVlIGl0IG9ubHkgKmFmdGVyKiBwYWRfbmFtZSBoYXMgYmVlbiB1c2VkLgorCSAgQ292ZXJpdHkgQ0lEIDogMTI2NTc3NAorCisyMDE1LTAxLTIzIDE1OjEzOjU1ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBBdm9pZCB1c2luZyBmcmVlZCB2YXJpYWJsZQorCSAgdGhlIG5hbWUgdmFyaWFibGUgbWlnaHQgaGF2ZSBiZWVuIGF0dHJpYnV0ZWQgdG8gcGFkX25hbWUsIG1ha2Ugc3VyZSB3ZQorCSAgZnJlZSBpdCBvbmx5ICphZnRlciogcGFkX25hbWUgaGFzIGJlZW4gdXNlZC4KKwkgIENvdmVyaXR5IENJRCA6IDEyNjU3NzUKKworMjAxNC0xMS0xNCAxMjo1OTozMSArMDEwMCAgUGV0ZXIgU2VpZGVyZXIgPHBzLnJlcG9ydEBnbXgubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiByZXVzZSBjYXBzIGZyYW1lcmF0ZSBpZiBub3Qgb3ZlcndyaXR0ZW4gYnkgdjRsMiBkZXZpY2UKKwkgIEVuYWJsZXMgZHVyYXRpb24gc2V0dGluZyBpbiB2NGwyc3JjLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDQwMworCisyMDE1LTAxLTIyIDEwOjI5OjI0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBGaXggaW5kZW50aW9uCisKKzIwMTUtMDEtMjEgMTc6MzY6MjYgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9kdW1wLmM6CisJICBxdGRlbXV4X2R1bXA6IEJ5cGFzcyBldmVuIG1vcmUgY29kZSBpZiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQKKwkgIEFuZCBhdm9pZCB1c2luZyB2YXJpYWJsZXMgdGhhdCB3b24ndCBleGlzdCB3aGVuIGRlYnVnZ2luZyBpcyBkaXNhYmxlZAorCisyMDE1LTAxLTIxIDE1OjMwOjMzICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5jOgorCSAgcXRkZW11eDogT25seSB0cmF2ZXJzZS9kdW1wIG5vZGVzIGlmIGd1YXJhbnRlZWQgdG8gYmUgdXNlZAorCSAgX19nc3RfZGVidWdfbWluIGlzIHRoZSAiZ2xvYmFsIiBsb3dlc3QgZGVidWcgbGV2ZWwgc2V0LiBUaGVyZSdzIG5vCisJICBndWFyYW50ZWUgdGhlIHF0ZGVtdXggZGVidWcgY2F0ZWdvcnkgaXMgYWN0dWFsbHkgc2V0IGF0IHRoYXQgbGV2ZWwuCisKKzIwMTQtMTItMjAgMTc6MDk6MTQgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkgIG1hdHJvc2thOiBBdm9pZCBkZWJ1Z2dpbmcgYmVsb3cgY2F0ZWdvcnkgdGhyZXNob2xkCisJICBUaGlzIHBhcnQgYWxvbmUgd2FzIHdoYXQgbWFkZSB0aGUgbWF0cm9za2EgdGhyZWFkIHRha2UgYSBmdWxsIGNvcmUKKwkgIG9uIGFuIGFuZHJvaWQgcGhvbmUgLi4uCisKKzIwMTUtMDEtMjEgMDk6NTU6MzAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9kdi9nc3RzbXB0ZXRpbWVjb2RlLmM6CisJKiBleHQvbWlrbW9kL21pa21vZF90eXBlcy5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmM6CisJKiBnc3QvZWZmZWN0di9nc3RyYWRpb2FjLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb3RlbXBsYXRlLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIENvbnN0aWZ5IHNvbWUgc3RhdGljIGFycmF5cyBldmVyeXdoZXJlCisKKzIwMTUtMDEtMTkgMTc6NDk6NTQgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBkZWFkbG9jayBzZWVraW5nIGluIGZpbGVzIHdpdGhvdXQgc2VlayBlbnRyaWVzCisJICBBIG11dGV4IHVubG9jayB3YXMgbWlzc2luZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk5NzUKKworMjAxNS0wMS0xOSAxMjozNDoyNSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kLmM6CisJICB2aWRlb21peGVyOiBmaXggaWxsZWdhbCBtZW1vcnkgYWNjZXNzIGluIGJsZW5kIGZ1bmN0aW9uIHdpdGggbmVnYXRpdmUgeXBvcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MTExNQorCisyMDE1LTAxLTEzIDE2OjQ5OjM0IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBQcm94eSBnZXRjYXBzCisJICBSZXBsYWNlIHRoZSBzaW5rX3F1ZXJ5IHdpdGggbmV3IGdldGNhcHMoKSB2aXJ0dWFsIGFuZCB1c2UgdGhlIHByb3h5CisJICBoZWxwZXIgd2l0aCB0aGUgcHJvYmVkIGNhcHMuIFRoaXMgYWxsb3cgdXBzdHJlYW0gZWxlbWVudCB0YWtpbmcgZGVjaXNpb24KKwkgIGJhc2Ugb24gd2hhdCBpcyBzdXBwb3J0ZWQgZG93bnN0cmVhbS4KKworMjAxNS0wMS0xMyAxOTowNToyMCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXhtYXAuYzoKKwkgIHF0bXV4OiBBZGQgc3VwcG9ydCBmb3IgdjIxMAorCisyMDE1LTAxLTEzIDE4OjU4OjAxICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHYyMTAgaXMgdjIxMCwgbm90IFVZVlkgYW5kIHl1djIgaXMgWVVZMiwgbm90IEk0MjAKKwkgIEFsc28gYWRkIGEgZmV3IG90aGVyIHJhdyB2aWRlbyBmb3JtYXRzIHdlIHN1cHBvcnQ6IHYzMDgsIHYyMTYKKwkgIGFuZCBhZGQgY29tbWVudHMgZm9yIGEgZmV3IG90aGVycyB3ZSBkb24ndCBzdXBwb3J0IHlldC4KKwkgIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L21hYy90ZWNobm90ZXMvdG4yMTYyLworCisyMDE1LTAxLTEyIDE1OjU2OjI5ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZjJjNmI5NSB0byBiYzc2YThiCisKKzIwMTUtMDEtMTAgMTU6NTE6MTYgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IERpc2FibGUgaGFjayBmb3IgTlNBcHAgaXRlcmF0aW9uIHdpdGggYSBzcGVjaWFsICNkZWZpbmUKKwkgIFRoZSBoYWNrIGNhdXNlcyBkZWFkbG9ja3MgYW5kIG90aGVyIGludGVyZXN0aW5nIHByb2JsZW1zIGFuZCBpdCByZWFsbHkKKwkgIGNhbiBvbmx5IGJlIGZpeGVkIHByb3Blcmx5IGluc2lkZSBHTGliLiBXZSB3aWxsIGluY2x1ZGUgYSBwYXRjaCBmb3IKKwkgIEdMaWIgaW4gb3VyIGJ1aWxkcyBmb3Igbm93IHRoYXQgaGFuZGxlcyB0aGlzLCBhbmQgaG9wZWZ1bGx5IGF0IHNvbWUKKwkgIHBvaW50IEdMaWIgd2lsbCBhbHNvIG1lcmdlIGEgcHJvcGVyIHNvbHV0aW9uLgorCSAgQSBwcm9wZXIgc29sdXRpb24gd291bGQgZmlyc3QgcmVxdWlyZSB0byByZWZhY3RvciB0aGUgcG9sbGluZyBpbgorCSAgR01haW5Db250ZXh0IHRvIG9ubHkgcHJvdmlkZSBhIHNpbmdsZSBmZCwgZS5nLiB2aWEgZXBvbGwva3F1ZXVlCisJICBvciBhIHRocmVhZCBsaWtlIHRoZSBvbmUgYWRkZWQgYnkgb3VyIHBhdGNoLiBUaGVuIHRoaXMgc2luZ2xlCisJICBmZCBjb3VsZCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgR01haW5Db250ZXh0IGFuZCBkaXJlY3RseSBpbnRlZ3JhdGVkCisJICBpbnRvIGEgTlNSdW5Mb29wLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MTQ1MAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNDM3NAorCisyMDE1LTAxLTA4IDIxOjA3OjA1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogdW5jb3JrIGlmIG5lZWRlZCB1cG9uIGNvbW1pdAorCSAgLi4uIHRvIHByb3ZpZGUgZm9yIGEgcnVubmluZyBjbG9jay4KKworMjAxNS0wMS0wOSAxNjo1OTo1MyAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogUHJldmVudCByZW5lZ290aWF0aW9uCisJICBSZW5lZ290aWF0aW9uIGlzbid0IHN1cHBvcnRlZCwgc2ltcGx5IHByZXZlbnQgaXQgdGhlIHdheSB3ZSBkbyBpbgorCSAgdjRsMnNyYy4KKworMjAxNS0wMS0wNiAxMzo1NDoyNSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogRG9uJ3QgdW5sb2NrIHRoZSBzdHJlYW0gbG9jayB0d2ljZQorCisyMDE1LTAxLTA5IDExOjQwOjQwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IHN0cmVhbSB0aW1lIGNvbnZlcnNpb24KKwkgIFVzZSB0aGUgcmlnaHQgbWFjcm8gdG8gY29udmVydCB0byB0aGUgY29ycmVjdCBzY2FsZSBvciB0aGUKKwkgIHNlZ21lbnQgaW5mb3JtYXRpb24gd2lsbCBiZSB3cm9uZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MjU3MgorCisyMDE1LTAxLTA3IDE4OjQ4OjU4IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogQWRkIHByb3RlY3Rpb24gYWdhaW5zdCBkcml2ZXIgYnVnCisJICB2NGwybG9vcGJhY2sgZHJpdmVyIGhhcyBhIHRoaXMgbmFzdHkgYnVnIHRoYXQgaWYgdGhlIHF1ZXVlIGlzIGxhcmdlcgorCSAgdGhlbiAyIGJ1ZmZlcnMsIGl0IHJldHVybnMgcmFuZG9tIGluZGV4IG9uIGRxYnVmLiBTbyBmYXIgd2UgYXNzdW1lZAorCSAgdGhhdCB0aGUgaW5kZXggd2FzIGFsd2F5cyByaWdodCwgd2hpY2ggd291bGQgbGVhZCB0byBtZW1vcnkgYmVpbmcKKwkgIHVucmVmIHR3aWNlLCBhbmQgZXZlbnR1YWxseSBjcmFzaC4KKworMjAxNS0wMS0wNyAxNzo1ODowNSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBEb24ndCB1c2UgYWxsb2NhdG9yIHNpemUgdG8gaXRlcmF0ZQorCSAgQXMgdGhlIGJ1ZmZlciBhcnJheSBpcyBmaXhlZCBzaXplIGFuZCBzbWFsbCwgaXQncyBzYWZlciB0byBzaW1wbHkKKwkgIHVzZSB0aGlzIHN0YXRpYyBzaXplIHRvIGNsZWFudXAgdGhlIGJ1ZmZlcnMuIFRoaXMgaXMgYWxzbyBtb3JlCisJICBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3QuIFRoZSBhc3NvY2lhdGVkIG1ldGhvZCBpcyBubyBsb25nZXIKKwkgIHJlcXVpcmVkIGFuZCBjYW4gYmUgZHJvcHBlZC4KKworMjAxNS0wMS0wNyAxNzo1NToxNCAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogRG9uJ3QgY2xlYW4gYnVmZmVyIGFycmF5IGluIGRpc3Bvc2UKKwkgIFRoaXMgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGRvbmUsIHBsdXMgdGhpcyBjb2RlIGlzIGluY29ycmVjdAorCSAgYW5kIG1heSBsZWFkIHRvIGNyYXNoLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MjA3NAorCisyMDE1LTAxLTA3IDE3OjQ4OjMxIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBEb24ndCByZWYgcXVldWVkIG91dHB1dCBidWZmZXIKKwkgIFRoaXMgcGFydGx5IHJldmVydCB0byB0aGUgb2xkIDEuMiBiZWhhdmlvci4gSW5zdGVhZCBvZiBrZWVwaW5nIGEKKwkgIHJlZmVyZW5jZSB0byB0aGUgb3V0cHV0IGJ1ZmZlciBxdWV1ZWQsIHdlIHNpbXBseSByZWxlYXNlIHRoZW0gYnV0CisJICBkb24ndCBmb3J3YXJkIGl0IHRvIEdzdEJ1ZmZlclBvb2wuIFRoaXMgd2F5LCB0aGUgYnVmZmVyIHBvb2wgZG9uJ3QKKwkgIG5lZWQgdG8gYmUgZmx1c2hlZCB0byBiZSBzdG9wcGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MjA3NAorCisyMDE1LTAxLTA4IDExOjM3OjIzIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBOZXZlciBmYWlsIG9uIHN0cmVhbW9mZgorCSAgRmFpbGluZyBzdHJlYW1vZmYgcHJldmVudHMgYWxsb2NhdG9yIGZyb20gYmVpbmcgZGlzcG9zZWQgaGVuY2UKKwkgIGxlYWQgdG8gZGV2aWNlIEZEIGxlYWsuIFRoZXJlIGlzIG5vIGtub3duIGNhc2VzIHdoZXJlIHN0cmVhbW9mZgorCSAgbWF5IGZhaWxzIGZvciB3aGljaCB3ZSdkIHN0aWxsIGJlIHN0cmVhbWluZy4gc3RyZWFtb2ZmIGlzIGtub3duCisJICB0byBmYWlsIHdoZW4gYSBkZXZpY2UgaXMgYmVpbmcgdW5wbHVnZ2VkIChpbiB3aGljaCBjYXNlIGVycm5vCisJICAxOS9FTk9ERVYgaXMgc2V0KS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzI3MzQKKworMjAxNS0wMS0wNyAyMTo1MjoxNyAtMDUwMCAgQnJhZCBTbWl0aCA8YnJhZEBjb21zdHlsZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIHY0bDI6IEFkZCBzdXBwb3J0IGZvciBkZXRlY3RpbmcgdGhlIHByZXNlbmNlIG9mIFY0TDIgc3VwcG9ydCBvbiBPcGVuQlNECisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9yZXZpZXc/YnVnPTc0MjUwMworCisyMDE1LTAxLTA0IDE1OjU3OjEwICswMTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJICBhYzNwYXJzZTogcmVxdWVzdCBhdCBsZWFzdCA4IGJ5dGVzIHRvIHByb3Blcmx5IHBhcnNlIGhlYWRlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MjMyNQorCisyMDE1LTAxLTA3IDE2OjIwOjAzIC0wODAwICBNaWNoYWVsIFNtaXRoIDxtaWNoYWVsLnNtaXRoQHJkaW8uY29tPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBza2lwIGFuIGFkZGl0aW9uYWwgdW5pbnRlcmVzdGluZyBjaHVuayB0eXBlIGJlZm9yZSB0aGUgZm10IGNodW5rLgorCisyMDE1LTAxLTA3IDE4OjE2OjEyICswMDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzLmJnQHNhbXN1bmcuY29tPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuYzoKKwkgIGF1ZGlvZHluYW1pYzogYXNzZXJ0IGZ1bmNfaW5kZXggaXMgaW5zaWRlIGJvdW5kcworCSAgQnJpbmdpbmcgYmFjayB0aGUgY2hlY2sgcmVtb3ZlZCBpbiB0aGUgcHJldmlvdXMgY29tbWl0IGJ1dCBoYXZlIHRoYXQgY2hlY2sgYmUgYQorCSAgZ19hc3NlcnQuIENoYW5naW5nIHRoZSBmdW5jdGlvbiB0byBzdGF0aWMgdm9pZCBzaW5jZSByZXR1cm4gY2FuIG5ldmVyIGJlIEZhbHNlLAorCSAgYmVjYXVzZSBhdWRpbyBmb3JtYXQgd2lsbCBuZXZlciBiZSB1bmtvd24uCisKKzIwMTUtMDEtMDcgMTc6MzE6MzkgKzAwMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jOgorCSAgYXVkaW9keW5hbWljOiByZW1vdmUgYWx3YXlzLXRydWUgY29uZGl0aW9uYWwKKwkgIGZ1bmNfaW5kZXggaXMgc2V0IGJ5IHRoZSBzdW0gb2YgdGhyZWUgdGVybmFyeSBvcGVyYXRvcnMgd2hpY2ggYWRkLCAwOjQsIDA6MiwKKwkgIGFuZCAxOjAuIE1pbmltdW0gdmFsdWUgd291bGQgYmUgMCswKzA9MCwgYW5kIG1heGltdW0gd291bGQgYmUgNCsyKzE9Ny4KKwkgIFRoZSBjb25kaXRpb25hbCBjaGVja2luZyBpZiBmdW5jX2luZGV4IGlzID49IDAgYW5kIDwgOCB3aWxsIGFsd2F5cyBiZSB0cnVlLgorCSAgUmVtb3ZpbmcgaXQuCisJICBDSUQgMTIyNjQ0MgorCisyMDE1LTAxLTA3IDE4OjA1OjE4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogSWYgd2UgZ2V0IGEgZ2FwIHdpdGggYSBidWZmZXIgd2l0aG91dCBEVFMsIGVycm9yIG91dAorCSAgV2UgKGN1cnJlbnRseT8pIGNhbid0IHJlYWxseSBoYW5kbGUgZ2FwcyBiZXR3ZWVuIFJUUCBwYWNrZXRzIGlmIHRoZXkncmUgbm90CisJICBwcm9wZXJseSB0aW1lc3RhbXBlZC4gVGhlIGN1cnJlbnQgY29kZSB3b3VsZCBnbyBpbnRvIGNhbGN1bGF0aW9ucyB3aXRoCisJICBHU1RfQ0xPQ0tfVElNRV9OT05FIGFuZCB0aGVuIGNhdXNlIGFzc2VydGlvbnMgZXZlcnl3aGVyZS4gSXQncyBwcm9iYWJseQorCSAgYmV0dGVyIHRvIGVycm9yIG91dCBjbGVhbmx5IGluc3RlYWQuCisKKzIwMTQtMTEtMjEgMTE6Mzk6MTkgLTA4MDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdcOpIDxhbGVpeEBvYmxvbmcuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBzZXQgUExBWUlORyBzdGF0ZSBhZnRlciBjb25maWd1cmluZyBjYXBzCisJICBXZSBzZXQgdG8gUExBWUlORyBhZnRlciB3ZSBoYXZlIGNvbmZpZ3VyZWQgdGhlIGNhcHMsIG90aGVyd2lzZSB3ZQorCSAgbWlnaHQgZW5kIHVwIGNhbGxpbmcgcmVxdWVzdF9rZXkgKHdpdGggU1JUUCkgd2hpbGUgY2FwcyBhcmUgc3RpbGwKKwkgIGJlaW5nIGNvbmZpZ3VyZWQsIGVuZGluZyBpbiBhIGNyYXNoLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDUwNQorCisyMDE0LTEyLTMwIDE4OjAzOjIyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9pY2xlcy9nZGtwaXhidWZvdmVybGF5LXRlc3QuYzoKKwkgIHRlc3RzOiBnZGtwaXhidWZvdmVybGF5LXRlc3Q6IHJlbW92ZSBvdXRkYXRlZCBGSVhNRQorCisyMDE0LTEyLTMwIDE3OjE5OjQyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBjb2xsaXNpb24uYzoKKwkgIHRlc3RzOiBydHBjb2xsaXNpb246IHVzZSBhbGF3ZW5jL2RlYyBpbiB0aGVzZSB0ZXN0cyBpbnN0ZWFkIG9mIFNwZWV4CisJICBUaGV5IHNob3VsZCBhbHdheXMgYmUgYnVpbHQsIHdoaWxlIHRoZSBzcGVleCBlbGVtZW50cyBhcmUgbm90LgorCSAgTmVlZCB0byBjaGVjayBmb3IgYSBzbWFsbGVyIG51bWJlciBvZiBidWZmZXJzIHRoZW4gKDctPjQpIGJlY2F1c2UKKwkgIHNwZWV4ZW5jIHdpbGwgYWRkIDMgaGVhZGVyIGJ1ZmZlcnMgd2hpbGUgYWxhd2VuYyB3aWxsIGp1c3Qgb3V0cHV0CisJICBhcyBtYW55IGJ1ZmZlcnMgYXMgaXQgcmVjZWl2ZXMgYXMgaW5wdXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQyMDk4CisKKzIwMTQtMTItMzAgMTY6MzY6MDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy9zaW1wbGUtbGF1bmNoLWxpbmVzLmM6CisJICB0ZXN0czogc2ltcGxlLWxhdW5jaC1saW5lczogb25seSBydW4ganBlZy9wbmcgdGVzdHMgaWYgZWxlbWVudHMgYXJlIGF2YWlsYWJsZQorCisyMDE0LTEyLTMwIDE2OjI2OjU4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IERvbid0IHJldHVybiBhIGJ1ZmZlciB3aGVuIHJldHVybmluZyBub3QgR1NUX0ZMT1dfT0sKKwkgIGJhc2VzcmMgYXNzdW1lcyB0aGF0IHdlIGRvbid0IHJldHVybiBhIGJ1ZmZlciBpZgorCSAgc29tZXRoaW5nIGVsc2UgdGhhbiBPSyBpcyByZXR1cm5lZC4gSXQgd2lsbCBqdXN0CisJICBsZWFrIGFueSBidWZmZXIgd2UgbWlnaHQgYWNjaWRlbnRpYWxseSBwcm92aWRlCisJICBoZXJlLgorCSAgVGhpcyBjYW4gcG90ZW50aWFsbHkgaGFwcGVuIGR1cmluZyBmbHVzaGluZy4KKwkgIE1heWJlIGZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDE5OTMKKworMjAxNC0xMi0zMCAxNDo1Mjo0MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYXV4LmM6CisJICB0ZXN0czogcnRwYXV4OiB1c2UgYWxhd2VuYy9kZWMgaW4gdGhlc2UgdGVzdHMgaW5zdGVhZCBvZiBTcGVleAorCSAgVGhleSBzaG91bGQgYWx3YXlzIGJlIGJ1aWx0LCB3aGlsZSB0aGUgc3BlZXggZWxlbWVudHMgYXJlIG5vdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDIwOTgKKworMjAxNC0xMi0yOSAxNTozNToxOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBJbXByb3ZlIGRldGVjdGlvbiBvZiBiZWluZyBzdHVjayBhdCB0aGUgc2FtZSBvZmZzZXQKKwkgIE9ubHkgZXJyb3Igb3V0IGlmIHdlIHJlYWQgZnJvbSB0aGUgc2FtZSBwb3NpdGlvbiBhZ2FpbiBhbmQgZ290IHRoZQorCSAgc2FtZSBsZW5ndGguIEp1c3QgdGhlIHNhbWUgcG9zaXRpb24gaXMgbm90IG5lY2Vzc2FyaWx5IGVub3VnaC4KKworMjAxNC0xMi0yOSAxNTowMDowMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBEb24ndCBnZXQgc3R1Y2sgYXQgdGhlIHNhbWUgb2Zmc2V0IHdoZW4gc2VhcmNoaW5nIGZvciBjbHVzdGVycworCSAgVGhpcyBjb3VsZCBoYXBwZW4gaWYgdGhlcmUgaXMgYW4gaW52YWxpZCBjbHVzdGVyIHdpdGggc2l6ZSAwLCBhbmQgaW4gdGhhdAorCSAgY2FzZSBqdXN0IGVycm9yIG91dCBpbnN0ZWFkIG9mIGxvb3BpbmcgZm9yZXZlci4KKworMjAxNC0xMi0yNSAyMTozMjo0MCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGZpeCBBTEFDIG11eGluZworCSAgQWN0dWFsbHkgY29weSB0aGUgY29kZWMgZGF0YSBpbnN0ZWFkIG9mIGNvcHlpbmcgbm90aGluZworCSAgYW5kIHRoZW4gYm9tYmluZyBvdXQgYmVjYXVzZSB0aGVyZSdzIG5vIGRhdGEuCisJICBGaXhlczogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjICEgYXZlbmNfYWxhYyAhIHF0bXV4ICEgZmFrZXNpbmsKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDE3ODMKKworMjAxNC0xMi0yNSAxNTo0ODowNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSAgcnRwcHRkZW11eDoganVzdCBkcm9wIGludmFsaWQgcnRwIHBhY2tldHMgaW5zdGVhZCBvZiBlcnJvcmluZyBvdXQKKwkgIEFwcGFyZW50bHkgbGlucGhvbmUgc2VuZHMgYW4gaW52YWxpZCBSVFAgcGFja2V0IGFzIHZlcnkKKwkgIGZpcnN0IHBhY2tldC4gV2Ugd2FudCB0byBpZ25vcmUgdGhhdCBpbnN0ZWFkIG9mIGVycm9yaW5nCisJICBvdXQgKHNhbWUgZm9yIGFueSBvdGhlciBpbnZhbGlkIHBhY2tldHMgcmVhbGx5KS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDEzOTgKKworMjAxNC0xMi0yNSAxNTo0NDoxNSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSAgcnRwcHRkZW11eDogZml4IDAuMTAtaXNtIGluIGRvY3MKKworMjAxNC0xMi0yNSAxNDo1ODoxMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvaWNsZXMvZ2RrcGl4YnVmb3ZlcmxheS10ZXN0LmM6CisJICB0ZXN0czogZ2RrcGl4YnVmb3ZlcmxheS10ZXN0OiB1c2UgYWJzb2x1dGUgcG9zaXRpb25pbmcgdG8gZml4IGRlbW8KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk1NjYKKworMjAxNC0xMi0yNSAxNDo1MzowOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5oOgorCSAgZ2RrcGl4YnVmb3ZlcmxheTogYWRkICJwb3NpdGlvbmluZy1tb2RlIiBwcm9wZXJ0eSB0byBhbGxvdyBhYnNvbHV0ZSBwb3NpdGlvbnMKKwkgIFNldCBwb3NpdGlvbmluZy1tb2RlPXBpeGVscy1hYnNvbHV0ZSB0byBhbGxvdyBwb3NpdGlvbmluZyB3aXRoCisJICBhYnNvbHV0ZSBjb29yZGluYXRlcywgbWVhbmluZyBuZWdhdGl2ZSB4L3kgb2Zmc2V0cyB3aWxsIGJlCisJICBpbnRlcnByZXRlZCBhcyBiZWluZyB0byB0aGUgbGVmdC9hYm92ZSB0aGUgdmlkZW8gZnJhbWUgaW5zdGVhZAorCSAgb2YgYmVpbmcgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhlIHJpZ2h0L2JvdHRvbSBlZGdlIG9mCisJICB0aGUgdmlkZW8gZnJhbWUgKHdoaWNoIGlzIGEgc2lsbHkgZGVmYXVsdCwgYnV0IHRoYXQncyBob3cgaXQgaXMpLgorCSAgVGhpcyBtZWFucyB3ZSBjYW4gbmljZWx5IHNsaWRlIGltYWdlcyBpbnRvIGFuZCBvdXQgb2YgdGhlIGZyYW1lLAorCSAgc2VlIGdka3BpeGJ1Zm92ZXJsYXktdGVzdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk1NjYKKworMjAxNC0xMi0yMiAxNTozMzo1MSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJICBvc3hhdWRpbzogRGlyZWN0bHkgcmV0dXJuIHRoZSByaW5nYnVmZmVyJ3MgY2FwcyBpZiBpdCBpcyBhY3F1aXJlZAorCisyMDE0LTEyLTIyIDEyOjU2OjE5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkgIG9zeGF1ZGlvOiBQdXQgYWxsIGF1ZGlvIGZvcm1hdHMgaW50byB0aGUgdGVtcGxhdGUgY2FwcworCSAgV2UgcmVwb3J0IHRoZSBwcm9wZXIgY2FwcyBsYXRlciBmcm9tIHRoZSBnZXRfY2FwcygpIHZmdW5jIGltcGxlbWVudGF0aW9uIGFmdGVyCisJICBwcm9iaW5nIHRoZSBzZWxlY3RlZCBkZXZpY2UuCisKKzIwMTQtMTItMjIgMTI6NTY6MDUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3JpbmdidWZmZXIuYzoKKwkgIG9zeGF1ZGlvOiBBbHNvIHNldCB0aGUgYmlnIGVuZGlhbiBmbGFnIGZvciBmbG9hdGluZyBwb2ludCBzYW1wbGVzCisKKzIwMTQtMTItMjIgMTE6NDU6NTkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIE1BSU5UQUlORVJTOgorCSAgTUFJTlRBSU5FUlM6IFVwZGF0ZSBteSBtYWlsIGFkZHJlc3MKKworMjAxNC0xMi0yMiAxMDoyMzowMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJICBvc3hhdWRpbzogRml4IGRlYWRsb2NrIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGluIGRldmljZSBzZWxlY3Rpb24gY29kZQorCSAgQWZ0ZXIgY3JlYXRpbmcgdGhlIHJpbmdidWZmZXIgd2UgaGF2ZSB0byBzZXQgdGhlIGRldmljZSBvbiB0aGUgcmluZ2J1ZmZlciBhcworCSAgaXQgZGVmYXVsdHMgdG8ga0F1ZGlvRGV2aWNlVW5rbm93bi4gQXQgdGhpcyBwb2ludCBpdCBjYW4ndCBoYXZlIGNoYW5nZWQgdG8KKwkgIGFueXRoaW5nIGVsc2UgeWV0IGFuZCB3ZSBkb24ndCBoYXZlIHRvIG5vdGlmeSBhYm91dCBjaGFuZ2VzIHRvIHRoZSBzaW5rL3NyYworCSAgImRldmljZSIgcHJvcGVydHkuIEl0J3MgYWxzbyBub3QgYSBnb29kIGlkZWEgYmVjYXVzZSBHc3RBdWRpb0Jhc2VTcmMgaGFzIHRoZQorCSAgb2JqZWN0IGxvY2sgdGFrZW4gd2hpbGUgdGhlIHJpbmdidWZmZXIgaXMgY3JlYXRlZCwgd2hpY2ggbWlnaHQgY2F1c2UgYQorCSAgZGVhZGxvY2sgaWYgc29tZXRoaW5nIGNhbGxzIGJhY2sgaW50byB0aGUgZWxlbWVudCBmcm9tICJub3RpZnk6OmRldmljZSIuCisJICBPbmNlIHRoZSBiYXNlIGNsYXNzIGlzIGRvbmUgd2l0aCB0aGUgTlVMTF9UT19SRUFEWSBzdGF0ZSBjaGFuZ2UsIGl0IGhhcyBvcGVuZWQKKwkgIHRoZSBkZXZpY2UgdmlhIHRoZSByaW5nYnVmZmVyIGFuZCB0aGlzIG1pZ2h0IGhhdmUgY2hvc2VuIGEgZGlmZmVyZW50IGRldmljZS4KKwkgIEVzcGVjaWFsbHkgaWYgd2UgaW5pdGlhbGx5IHVzZWQga0F1ZGlvRGV2aWNlVW5rbm93bi4gQWxzbyBub3RpZnkgYWJvdXQgdGhpcworCSAgcHJvcGVydHkgY2hhbmdlIGFzIGluaXRpYWxseSBpbnRlbmRlZCBieSB0aGlzIGNvZGUuCisKKzIwMTQtMTItMTkgMTI6MzA6MDMgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJwb29sOiBVcGRhdGUgY29uZmlndXJhdGlvbiBzaXplCisJICBXZSBhbHJlYWR5IHVwZGF0ZSBvdXIgY29weSBvZiBWaWRlb0luZm8uc2l6ZSB0byBwcm9wZXIgc2l6ZSwgbm93IGFsc28KKwkgIHRoZSBjb25maWd1cmF0aW9uIHNvIHRoZSBzaXplIG1hdGNoZXMgb24gcmVsZWFzZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDE0MjAKKworMjAxNC0xMi0xOSAxMDo1NzoyOSArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkgIG1hdHJvc2thLWRlbXV4OiBDYWNoZSB1cHN0cmVhbSBsZW5ndGgKKwkgIEluc3RlYWQgb2YgY29uc3RhbnRseSBxdWVyeWluZyB1cHN0cmVhbSwganVzdCBjYWNoZSB0aGUgbGFzdCBkdXJhdGlvbiwKKwkgIGFuZCBpbiB0aGUgdW5saWtlbHluZXNzIHdlIG1pZ2h0IGhhdmUgZ29uZSBvdmVyIHF1ZXJ5IGFnYWluIGJlZm9yZQorCSAgZGVjaWRpbmcgd2UgYXJlIEVPUy4KKwkgIEN1dCAxNSUgY3B1IG9mZiBtYXRyb3NrYWRlbXV4IHN0cmVhbWluZyB0aHJlYWQgKHNyc2x5Li4uKQorCisyMDE0LTEyLTE3IDE3OjM2OjE4ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYTogbXV4L2RlbXV4IHRoZSBPcHVzSGVhZCBoZWFkZXIKKwkgIFRoaXMgaXMgbWVhbnQgdG8gYmUgc28gKGh0dHBzOi8vd2lraS54aXBoLm9yZy9NYXRyb3NrYU9wdXMgLSB3aGlsZQorCSAgaXQgaXMgbWFya2VkIGFzIGEgZHJhZnQsIHRoaXMgcGFydCB3YXMgY29uZmlybWVkIHRvIGJlIGNvcnJlY3Qgb24KKwkgIElSQyksIGFuZCBhbGxvd3Mgb25lIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZGVtdXhlZCBzdHJlYW0gaXMKKwkgIG11bHRpc3RyZWFtIG9yIG5vdCwgYW5kIHRodXMgc2V0IHRoZSBtdWx0aXN0cmVhbSBjYXBzIGZpZWxkCisJICBhY2NvcmRpbmdseS4gSW4gdHVybiwgdGhpcyBtZWFucyBkb3duc3RyZWFtIGRvZXMgbm90IGhhdmUgdG8gZ3Vlc3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwNzQ0CisKKzIwMTQtMTItMTggMTE6NTA6MzMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IERvbid0IGRlcmVmZXJlbmNlIE5VTEwgaWYgYSBzdWl0YWJsZSBzdHJlYW0gZm9yIHRoZSBBVVggZWxlbWVudCBjYW4ndCBiZSBmb3VuZAorCSAgQ0lEIDEyNTg3MTcKKworMjAxNC0xMi0xOCAxMDo1MzozOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGVmMWZmZGMgdG8gZjJjNmI5NQorCisyMDE0LTEyLTEyIDIzOjA2OjA3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkgIHVkcHNpbms6IGFsbG9jYXRlIHNjcmF0Y2ggc3BhY2UgZm9yIHJlbmRlciBmdW5jdGlvbnMgb24gdGhlIGhlYXAKKwkgIGFuZCBub3QgdGhlIHN0YWNrLiBPdXIgYWxsb2NhdGlvbnMgY291bGQgZ2V0IGEgYml0IHRvbyBsYXJnZQorCSAgdG8gYmUgc3VyZSBpdCdzIG5vdCBnb2luZyB0byBjYXVzZSB0cm91YmxlIHVzaW5nIHRoZSBzdGFjay4KKworMjAxNC0wNi0yNCAwMToxNjozNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazogcmUtdXNlIHNlbmRfYnVmZmVycygpIGNvZGUgcGF0aCBmb3IgcmVuZGVyKCkgZnVuY3Rpb24KKwkgIEl0J3MgbGlrZSByZW5kZXJpbmcgYSBidWZmZXIgbGlzdCwganVzdCB3aXRoIG9uZSBidWZmZXIuCisJICBIYXMgdGhlIGFkZGVkIGFkdmFudGFnZSB0aGF0IGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjbGllbnRzCisJICB3ZSBjYW4gc2VuZCB0aGUgYnVmZmVyIHRvIGFsbCB0aGUgY2xpZW50cyBpbiBvbmUgZ28uCisKKzIwMTQtMDYtMjQgMDE6MTU6MjUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgbXVsdGl1ZHBzaW5rOiBrZWVwIGNsaWVudCBsaXN0IGNvbnNpc3RlbnQgZHVyaW5nIHJlbW92YWxzCisJICBXZSB1bmxvY2sgYW5kIHJlLWxvY2sgdGhlIGNsaWVudCBsb2NrIHdoaWxlIGVtaXR0aW5nIHRoZQorCSAgcmVtb3ZlZCBzaWduYWwsIHdoaWNoIGNhdXNlcyBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIGNsaWVudAorCSAgbGlzdCB2cy4gdGhlIGNsaWVudCBjb3VudHMuIEluc3RlYWQsIHJlbW92ZSB0aGUgY2xpZW50IGZyb20KKwkgIHRoZSBsaXN0IGFscmVhZHkgYmVmb3JlIGVtaXR0aW5nIHRoZSBzaWduYWwgYW5kIHB1dCBpdCBpbnRvCisJICBhIHRlbXBvcmFyeSBsaXN0IG9mIGNsaWVudHMgdG8gYmUgcmVtb3ZlZC4gVGhhdCB3YXkgdGhpbmdzCisJICBsb29rIGNvbnNpc3RlbnQgdG8gdGhlIHN0cmVhbWluZyB0aHJlYWQsIGJ1dCBzaWduYWwgY2FsbGJhY2tzCisJICBjYW4gc3RpbGwgZG8gdGhpbmdzIGxpa2UgZ2V0IHN0YXRzIGZyb20gcmVtb3ZlZCBjbGllbnRzLgorCisyMDE0LTA2LTI0IDAwOjU2OjI3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgbXVsdGl1ZHBzaW5rOiBmaXggY2xpZW50IGNvdW50IGFmdGVyIHJlbW92YWwKKworMjAxNC0wNi0yMyAxODo0MzoyMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazoga2VlcCBjbGllbnQgbGlzdCBzb3J0ZWQgYnkgc29ja2V0IGZhbWlseQorCSAgV2UgbWFrZSB1c2Ugb2YgaW4gdGhlIHNlbmRfYnVmZmVycygpIGZ1bmN0aW9uIGlmIHdlCisJICBuZWVkIHRvIHVzZSBkaWZmZXJlbnQgc29ja2V0cyB0byBzZW5kIHRvIElQdjQgYW5kCisJICBJUHY2IGRlc3RpbmF0aW9ucy4KKworMjAxNC0wNi0yMCAxMTozNjoxOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICBtdWx0aXVkcHNpbms6IGFkZCBzZW5kbW1zZy1yZWFkeSByZW5kZXJfbGlzdCBmdW5jdGlvbiBwcm90b3R5cGUKKwkgIEFkZCBwcm90b3R5cGUgZm9yIGEgcmVuZGVyX2xpc3QoKSBmdW5jdGlvbiB0aGF0IGNhbiB1c2UgYQorCSAgc2VuZG1tc2ctc3R5bGUgZ19zb2NrZXRfc2VuZF9tZXNzYWdlcygpIGZ1bmN0aW9uIG9uY2UgaXQgbGFuZHMKKwkgIGluIEdMaWIuIFdlIGNhbiB1c2UgdGhpcyBpbmZyYXN0cnVjdHVyZSB0byBzZW5kIG11bHRpcGxlIGJ1ZmZlcnMKKwkgIG1hZGUgdXAgYnkgbXVsdGlwbGUgbWVtb3JpZXMgdG8gbXVsdGlwbGUgY2xpZW50cyBpbiBvbmUgZ28sIHdoaWNoCisJICBkcmFzdGljYWxseSByZWR1Y2VzIHRoZSBudW1iZXIgb2Ygc3lzY2FsbHMgbWFkZSB3aGVuIHNlbmRpbmcKKwkgIGhpZ2gtYml0cmF0ZSB2aWRlbyBzdHJlYW1zLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMjE1MgorCisyMDE0LTA2LTE5IDE5OjE2OjAxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkgIG11bHRpdWRwc2luazogbWFrZSB1ZHAgY2xpZW50IHN0cnVjdHVyZSByZWZjb3VudGVkCisJICBVc2UgdGhlIHJlZmNvdW50IGZvciBtZW1vcnkgbWFuYWdlbWVudCBhbmQga2VlcCB0cmFjaworCSAgb2YgdGhlIG51bWJlciBvZiBkdXBsaWNhdGUgY2xpZW50cyBpbiBhIHNlcGFyYXRlCisJICB2YXJpYWJsZS4gVGhpcyB3aWxsIGJlIHVzZWZ1bCBsYXRlciwgYW5kIG1lYW5zIHdlCisJICBkb24ndCBoYXZlIHRvIGhvbGQgdGhlIE9CSkVDVF9MT0NLIGFsbCB0aGUgdGltZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzI4NjYKKworMjAxNC0wNi0xOSAxODozMTowNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICBtdWx0aXVkcHNpbms6IGtlZXAgY291bnQgb2YgbnVtYmVyIG9mIHVuaXF1ZSBhbmQgbm9uLXVuaXF1ZSBJUHY0IGFuZCBJUHY2IGNsaWVudHMKKwkgIFRoaXMgd2lsbCBjb21lIGluIGhhbmR5IGxhdGVyLgorCisyMDE0LTEyLTE2IDE1OjAwOjIyIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogRGlzYWJsZSBjcmVhdGVfYnVmIHdpdGggbGlidjRsMgorCSAgTGlidjRsMiBkb2VzIG5vdCB3b3JrIHdpdGggQ1JFQVRFX0JVRlMuIEluc3RlYWQgb2YgZmFpbGluZyBvbiByYW5kb20KKwkgIGVycm9yIGNhdXNlZCBieSBsaWJ2NGwyLCBkaXNhYmxlIENSRUFURV9CVUZTIHdoZW4gYW4gZW11bGF0ZWQgZm9ybWF0IGlzCisJICBkZXRlY3RlZC4KKworMjAxNC0xMi0wOSAxNzozOToxMiAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJICB2NGwyYWxsb2NhdG9yOiBBZGQgcHJvdGVjdGlvbiBhZ2FpbnN0IGJyb2tlbiBsaWJ2NGwyCisJICBJdCBsb29rcyBsaWtlIGxpYnY0bDIgc3VwcG9ydCBmb3IgQ1JFQVRFX0JVRiBpcyBpbmNvbXBsZXRlLiBUaGF0CisJICBjb21iaW5lIHdpdGggZXhpc3RpbmcgYnVncyBtYXkgbGVhZCB0byBjcmFzaCBpbiBHU3RyZWFtZXIuIFRoZXNlCisJICBjaGVjayB3aWxsIG1ha2UgaXQgcm9idXN0IGJ5OgorCSAgLSBDaGVja2luZyBjcmVhdGUgYnVmIGluZGV4IGlzbid0IGFuIGFscmVhZHkgaW4gdXNlZCBpbmRleAorCSAgLSBDaGVja2luZyB0aGF0IHRoZSBpbmRleCBvdXQgb2YgUVVFUllCVUYgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkCisJICBpbmRleAorCisyMDE0LTEyLTE2IDE2OjM3OjI0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBBZGQgc29tZXRoaW5nIHRvIHRoZSBkZWJ1ZyBsb2dzIGlmIGFuIFJUWCBBVVggZWxlbWVudCBjYW4ndCBiZSBhZGRlZAorCSAgLi4uIGJlY2F1c2UgdGhlIGFwcGxpY2F0aW9uIGFscmVhZHkgaGFzIGEgc2lnbmFsIGhhbmRsZXIgc2V0IHVwIGhlcmUuCisKKzIwMTQtMTEtMjEgMTQ6MTM6MzQgKzExMDAgIE1hdHRoZXcgV2F0ZXJzIDxtYXR0aGV3QGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogYWRkIHJldHJhbnNtaXNzaW9uIHN1cHBvcnQgYWNjb3JkaW5nIHRvIFJGQzQ1ODgKKwkgIEJhc2VkIG9uIHRoZSBjbGllbnQtcnRwYXV4IGV4YW1wbGUKKworMjAxNC0xMi0xNiAxMzoyNTowMSArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogY2xlYXIgcmVjdGFuZ2xlIHN0cnVjdHVyZXMgYmVmb3JlIHVzZQorCisyMDE0LTEyLTA5IDE1OjA5OjU2IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IEFsd2F5cyBzZXQgZm9ybWF0CisJICBSaWdodCBub3cgd2UgdHJ5IHRvIGJlIGNsZXZlciBieSBkZXRlY3RpbmcgaWYgZGV2aWNlIGZvcm1hdCBoYXZlCisJICBjaGFuZ2VkIG9yIG5vdCwgYW5kIHNraXAgc2V0dGluZyBmb3JtYXQgaW4gdGhpcyBjYXNlLiBUaGlzIGlzIHZhbGlkCisJICBiZWhhdmlvdXIgd2l0aCBWNEwyLCBidXQgaXQncyBhbHNvIHZlcnkgZXJyb3IgcHJvbmUuIFRoZSByYXRpb25hbAorCSAgZm9yIG5vdCBzZXR0aW5nIHRoZXNlIGFsbCB0aGUgdGltZSBpcyBmb3Igc3BlZWQsIHRob3VnaCBJIGNhbid0CisJICBtZWFzdXJlIGFueSBub3RpY2VhYmxlIGdhaW4gb24gYW55IEhXIEkgb3duLiBBbHNvLCB1bnRpbCByZWNlbnRseSwKKwkgIHdlIHdoZXJlIGRvaW5nIGdldC9zZXQgb24gdGhlIGZvcm1hdCBmb3IgZWFjaCBmb3JtYXQgd2Ugd2hlcmUKKwkgIHByb2JpbmcsIG1ha2luZyBpdCBuZWFyIHRvIGltcG9zc2libGUgdGhhdCB0aGUgZm9ybWF0IHdvdWxkIG1hdGNoLgorCSAgVGhpcyBhbHNvIGZpeGVzIGJ1ZyB3aGVyZSB3ZSB3aGVyZSBza2lwcGluZyBmcmFtZS1yYXRlIHNldHRpbmcgaWYKKwkgIGZvcm1hdCBkaWRuJ3QgY2hhbmdlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDYzNgorCisyMDE0LTEyLTE1IDE4OjMwOjAxIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJICB2aWRlb2Nyb3A6IFJlbW92ZSB0b2RvIGFib3V0IGNhcHMgZmlsdGVyCisJICBUaGUgZmlsdGVyIGlzIGFscmVhZHkgaW50ZXJlY3RlZC4KKworMjAxNC0xMi0xNSAxODoxOTowNSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuaDoKKwkgIHZpZGVvY3JvcDogTWFrZSBzdXJlIG5ldyBjcm9wIGlzIGFwcGxpZWQKKwkgIFNpbmNlICJiYXNldHJhbnNmb3JtOiBGaXggY2FwcyBlcXVhbGl0eSBjaGVjayIgY29tbWl0IGE3ZjM1NywKKwkgIHNldF9pbmZvKCkgd2lsbCBub3QgYmUgY2FsbGVkIGFueW1vcmUgaWYgY3JvcCBkaWRuJ3QgY2hhbmdlCisJICB0aGUgY2Fwcy4gVGhpcyBpcyBmaXhlZCBieSBzZXR0aW5nICJuZWVkX3VwZGF0ZSIgYm9vbGVhbiB3aGVuCisJICBjcm9wcGluZyBwcm9wZXJ0aWVzIGhhcyBiZWVuIGNoYW5nZWQsIGFuZCB0aGVuIGFwcGx5aW5nIHRoZXNlCisJICBpZiB0aGV5IHdoZXJlIG5vdCBhcHBsaWVkIGJlZm9yZSByZW5kZXJpbmcgdGhlIG5leHQgZnJhbWUuIFRoaXMKKwkgIHBhdGNoIGFsc28gZml4ZWQgdGhlIGxvY2tpbmcsIGRyb3BwaW5nIHVuLW5lZWRlZCBjdXN0b20gbG9jaywKKwkgIGFuZCBubyBob2xkaW5nIG5lZWRsZXNzIGxvY2sgd2hpbGUgZG9pbmcgdGhlIG9wZXJhdGlvbiBhcyB3ZQorCSAgYWxyZWFkeSBob2xkIHRoZSBzdHJlYW1pbmcgbG9jay4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA3ODcKKworMjAxNC0xMi0xMiAxODoxMDozNSArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkgIG9zeGF1ZGlvc2luazogUHJlZmVyIGZpbHRlciBjYXBzIG9yZGVyIHdoaWxlIGdldHRpbmcgY2FwcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDk4NworCisyMDE0LTEyLTA5IDEzOjM4OjI2ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxnaXRAYXJ1bnJhZ2hhdmFuLm5ldD4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSAgb3N4YXVkaW9zaW5rOiBBZGQgc29tZSBlcnJvciBoYW5kbGluZyBhcm91bmQgY2hhbm5lbCBsYXlvdXQgcGFyc2luZworCSAgRm9yIG5vdyB3ZSBqdXN0IHNwaXQgYSB3YXJuaW5nIGFuZCBpZ25vcmUgdGhlIGNoYW5uZWwgbGF5b3V0IGlmIHdlIGNhbid0CisJICBzdXBwb3J0IGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDk4NworCisyMDE0LTEyLTA4IDIyOjM4OjIyICswNTMwICBBcnVuIFJhZ2hhdmFuIDxnaXRAYXJ1bnJhZ2hhdmFuLm5ldD4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJICBvc3hhdWRpbzogVGFrZSBsb2NrIGFyb3VuZCBzaW5rL3NvdXJjZSBiZWZvcmUgYWNjZXNzaW5nIHRoZSByaW5nYnVmZmVyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwOTg3CisKKzIwMTQtMTItMDEgMjE6MDY6MjcgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGdpdEBhcnVucmFnaGF2YW4ubmV0PgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmg6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9yZW1vdGVpby5jOgorCSAgb3N4YXVkaW9zcmM6IFByb2JlIGNoYW5uZWwgbGF5b3V0IHRvbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDk4NworCisyMDE0LTEyLTAxIDIwOjMyOjA0ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxnaXRAYXJ1bnJhZ2hhdmFuLm5ldD4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSAgb3N4YXVkaW9zaW5rOiBPbmx5IGZpeCB1cCBjaGFubmVscy9sYXlvdXQgZm9yIFBDTSBjYXBzIHdoaWxlIHByb2JpbmcKKwkgIEl0J3MgdW5saWtlbHkgdGhhdCBzZXR0aW5nIGEgY2hhbm5lbCBsYXlvdXQgd2lsbCBkbyBtdWNoIGZvciBBQzMvRFRTCisJICBzdHJlYW1zLiBJZiB3ZSBmaW5kIGF0IHNvbWUgcG9pbnQgdGhhdCBpdCBkb2VzIG1ha2Ugc2Vuc2UsIHdlIGNhbgorCSAgcGVyZm9ybSB0aGUgc3RydWN0dXJlIGNvcHlpbmcgdW5jb25kaXRpb25hbGx5IChpLmUuLCB0aGUgY3VycmVudCBjb2RlIGlzCisJICB3cm9uZywgc2luY2UgQUMzL0RUUyB3aWxsIGdldCB0d28gc3RydWN0dXJlcyBub3cgLSBvbmUgd2l0aCB0aGUgY2hhbm5lbAorCSAgbGF5b3V0LCBvbmUgd2l0aG91dCkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwOTg3CisKKzIwMTQtMTItMDEgMTk6NDE6MzUgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGdpdEBhcnVucmFnaGF2YW4ubmV0PgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5oOgorCSAgb3N4YXVkaW9zcmM6IEltcGxlbWVudCBjYXBzIHByb2JpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA5ODcKKworMjAxNC0xMi0wMSAxOToyOTo1NyArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9oYWwuYzoKKwkgIG9zeGF1ZGlvOiBCaW5kIGF1ZGlvIGRldmljZSB0byBhdWRpbyB1bml0IGVhcmx5CisJICBXZSB3YW50IHRvIGJpbmQgdGhlIGRldmljZSBkdXJpbmcgb3BlbiBzbyB0aGF0IHN1YnNlcXVlbnQgZm9ybWF0IHF1ZXJpZXMKKwkgIG9uIHRoZSBhdWRpbyB1bml0IGFyZSBhcyBzcGVjaWZpYyBhcyBwb3NzaWJsZSBmcm9tIHRoYXQgcG9pbnQgb253YXJkcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA5ODcKKworMjAxNC0xMS0yOSAyMzoxNjozMCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkgIG9zeGF1ZGlvc2luazogRml4IHVwIGNhcHMgcXVlcnlpbmcgYSBiaXQKKwkgIFRoaXMgc2hvdWxkIG1ha2UgY2FwcyBxdWVyaWVzIGNvcnJlY3QgaW4gUEFVU0VEIGFuZCBoaWdoZXIgYXMgd2VsbC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA5ODcKKworMjAxNC0xMS0yOCAyMjozMjozNiArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jOgorCSAgb3N4YXVkaW86IE1vdmUgb3N4YXVkaW9zcmMtc3BlY2lmaWMgY29kZSBvdXQgb2YgdGhlIGdlbmVyaWMgcGF0aAorCSAgQXZvaWRzIG9uZSBsYXllcmluZyB2aW9sYXRpb24gKEdzdENvcmVBdWRpbyByZWZlcnJpbmcgdG8KKwkgIEdzdE9zeEF1ZGlvU3JjKS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA5ODcKKworMjAxNC0xMS0yOCAyMjoyMzoxNyArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3JpbmdidWZmZXIuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3JpbmdidWZmZXIuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2hhbC5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb3JlbW90ZWlvLmM6CisJICBvc3hhdWRpbzogQ2xlYW4gdXAgYSBHc3RDb3JlQXVkaW8gLT4gR3N0T3N4QXVkaW9TcmMvU2luayByZWZlcmVuY2UKKwkgIE5vdyB0aGF0IGRldmljZSBzZWxlY3Rpb24gaGFzIG5vIHNpbmsvc291cmNlLXNwZWNpZmljIGJpdHMsIHdlIGNhbiBoYXZlCisJICBnZW5lcmljIGRldmljZSBzZWxlY3Rpb24gZm9yIHRoaXMgcGF0aC4gV2UgZG8gbmVlZCB0byBub3cgdHJhY2sgc3RhdGUKKwkgIGNoYW5nZXMgc28gd2UgY2FuIGxvb2sgdXAgdGhlIGZpbmFsIGRldmljZV9pZCBvbmNlIHRoZSBkZXZpY2UgaXMgb3BlbiwKKwkgIHRob3VnaC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA5ODcKKworMjAxNC0xMS0yOCAxOTo0MDo1MiArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkgIG9zeGF1ZGlvc2luazogTW92ZSBkZXZpY2UgY2FwcyBwcm9iaW5nIHRvIGdldF9jYXBzKCkKKwkgIFRoaXMgc2hvdWxkIGJlIHByZWZlcnJlZCB0byBydW5uaW5nIHRoZSBwcm9iZSBhdCBkZXZpY2Ugb3BlbiB0aW1lLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDk4NworCisyMDE0LTExLTI4IDE4OjM3OjAyICswNTMwICBBcnVuIFJhZ2hhdmFuIDxnaXRAYXJ1bnJhZ2hhdmFuLm5ldD4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2hhbC5jOgorCSAgb3N4YXVkaW86IE1ha2Ugc29tZSBkZWJ1ZyBjb2RlIGNvbXBpbGUgY29uZGl0aW9uYWxseQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDk4NworCisyMDE0LTExLTI4IDE1OjA2OjM1ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxnaXRAYXJ1bnJhZ2hhdmFuLm5ldD4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJICBvc3hhdWRpbzogTW92ZSBkZXZpY2Ugc2VsZWN0aW9uIHRvIHJpbmdidWZmZXItPm9wZW5fZGV2aWNlKCkKKwkgIFRoaXMgaXMgY29uY2VwdHVhbGx5IHRoZSByaWdodCB0aGluZyB0byBkbywgYW5kIGFsbG93cyB1cyB0byBjb3JyZWN0bHkKKwkgIGNhdGNoIGVycm9ycyBpbiBkZXZpY2Ugc2VsZWN0aW9uIGFzIHdlbGwsIHdoaWNoIHdlIGNvdWxkIG5vdCBkbyB3aGlsZQorCSAgY3JlYXRpbmcgdGhlIHJpbmdidWZmZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwOTg3CisKKzIwMTQtMTEtMjggMTQ6MzQ6MzQgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGdpdEBhcnVucmFnaGF2YW4ubmV0PgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9oYWwuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9yZW1vdGVpby5jOgorCSAgb3N4YXVkaW86IENvbnNvbGlkYXRlIGlucHV0IGFuZCBvdXRwdXQgY29kZSBwYXRocyBhIGJpdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDk4NworCisyMDE0LTExLTIxIDExOjU0OjE4ICswMTAwICBUaGliYXVsdCBTYXVuaWVyIDx0c2F1bmllckBnbm9tZS5vcmc+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgRGVpbnRlcmxhY2U6IGluIHF1ZXJ5X2NhcHMgcmV0dXJuIG9ubHkgc3VwcG9ydGVkIGZvcm1hdHMgaWYgZmlsdGVyIGlzIGludGVybGFjZWQKKwkgIEluIHNvbWUgY2FzZXMgdGhlIGN1cnJlbnRseSBzZXQgR3N0VmlkZW9JbmZvIGlzIG5vdCBpbnRlcmxhY2VkLCBidXQKKwkgIHVwc3RyZWFtIGNhcHMgYXJlIGludGVybGFjZWQgYW5kIHRoZSBpbmZvIGlzIHBhc3NlZCBpbiB0aGUgZmlsdGVyLAorCSAgd2Ugc2hvdWxkIHRha2UgdGhhdCBpbmZvIGludG8gYWNjb3VudCBhbmQgbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90CisJICBjb25zaWRlciB0aGF0IGNhc2UgYXMgYSAicGFzcyB0aHJvdWdoIiBjYXNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MTQwNworCisyMDE0LTEyLTEyIDExOjA2OjE3ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBkZWJ1ZyBzdGF0ZW1lbnQKKwkgIEl0IHdhcyB1c2luZyB0aGUgbm9uLWluY3JlYXNpbmcgb2Zmc2V0IHZhcmlhYmxlLCB3aGljaCBtYWRlIHRoYXQgc3RhdGVtZW50CisJICBub3Qgc28gdXNlZnVsIDopCisKKzIwMTQtMTItMTIgMTE6MDM6MTUgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWRkIG1hY3JvcyBmb3IgdGhlIHZhcmlvdXMgdGltZXNjYWxlIGNvbnZlcnNpb25zCisJICBUaGlzIGhlbHBzIG1ha2UgdGhlIGNvZGUgbW9yZSByZWFkYWJsZSBhbmQgYXZvaWQgZnV0dXJlIGJhZCB1c2FnZSBvZgorCSAgc2NhbGluZyBmdW5jdGlvbiBhcmd1bWVudCBvcmRlci4KKworMjAxNC0xMi0xMSAxMDoxNjowNiArMDEwMCAgUGF0cmljayBSYWRpemkgPHBhdHJpY2tyQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IGZpeCBwb3RlbnRpYWwgY3Jhc2ggd2hlbiBzaHV0dGluZyBkb3duCisJICBBIHJhY2UgY29uZGl0aW9uIGluIHRoZSBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24gbWF5IGNhdXNlIGJ1ZmZlcnMKKwkgIHRvIGJlIHVucmVmZmVkIHdoaWxlIHRoZXkgYXJlIHN0aWxsIHVzZWQgYnkgdGhlIHN0cmVhbWluZyB0aHJlYWQKKwkgIGluIGdzdF9ydHBfaDI2NF9wYXlfc2VuZF9zcHNfcHBzKCkgcmVzdWx0aW5nIGluIGEgY3Jhc2guIENoYWluCisJICB1cCB0byB0aGUgcGFyZW50IGNsYXNzIGZpcnN0IGluIHRoZSBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24gdG8KKwkgIG1ha2Ugc3VyZSBzdHJlYW1pbmcgaGFzIHN0b3BwZWQgYW5kIG9ubHkgdGhlbiBmcmVlIHRob3NlIGJ1ZmZlcnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQxMzgxCisKKzIwMTQtMTItMTIgMDA6NDI6MDYgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IENvcHkgZmxhZ3Mgb2YgdGhlIG92ZXJhbGwgc2VnbWVudCB0byBvdXRwdXQgc2VnbWVudHMKKwkgIFByZXNlcnZlIHRoZSBzZWdtZW50IGZsYWdzIG9mIHRoZSBvdmVyYWxsIGRlbXV4IHNlZ21lbnQgb24gdGhlIG91dHB1dAorCSAgc2VnbWVudHMgZm9yIGVhY2ggcGFkLgorCisyMDE0LTEyLTA5IDAyOjQzOjAwICswMTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogdXNlIDY0Yml0IGNodW5rX29mZnNldAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MTI3OQorCisyMDE0LTEyLTEwIDE3OjM5OjE3ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCByb3VuZGluZyBlcnJvcnMgaW4gZHVyYXRpb24gdXBkYXRlCisJICBNYWtlIHN1cmUgd2Ugc3RvcmUgdXBkYXRlZCBzZWdtZW50IHN0b3AvZHVyYXRpb24gd2l0aCB0aGUgc2FtZQorCSAgZ3JhbnVsYXJpdHkgYXMgdGhlIGR1cmF0aW9uIHRpbWVzY2FsZS4KKwkgIEFuZCBhZGQgbW9yZSBkZWJ1ZworCisyMDE0LTEyLTEwIDE2OjU1OjQ0ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFVwZGF0ZSBkdXJhdGlvbiB3aGVuIHdlIGdldCBtb3JlIGluZm9ybWF0aW9uCisJICBXaGVuIGRlYWxpbmcgd2l0aCBmcmFnbWVudGVkIGZpbGVzLCB3ZSB3aWxsIGdldCBtb3JlIGFjY3VyYXRlIGR1cmF0aW9uCisJICBpbmZvcm1hdGlvbiB2aWEgdGhlIG1mcmEgYW5kIG1vb2YgYXRvbXMuCisJICBJbiBvcmRlciBmb3IgcGxheWJhY2sgdG8gbm90IHN0b3AgYXQgdGhlIGluaXRpYWwgZHVyYXRpb24gKGZyb20gdGhlCisJICBtb292IGF0b20pLCB3ZSBuZWVkIHRvIGNoZWNrIGFuZCB1cGRhdGUgdGhlIHZhcmlvdXMgZHVyYXRpb24gdmFyaWFibGVzCisJICB3aGVuIHdlIGZpbmQgbW9yZSBpbmZvcm1hdGlvbi4KKwkgIEZpeGVzIHBsYXliYWNrIG9mIGZyYWdtZW50ZWQgZmlsZXMgaW4gcHVsbCBtb2RlCisKKzIwMTQtMTItMTAgMTU6MDg6NDAgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogUmVtb3ZlIHZhcmlhYmxlIGFzc2lnbm1lbnRzIG5ldmVyIHJlYWQKKwkgIEFzIGRldGVjdGVkIGJ5IGNsYW5nL3NjYW4tYnVpbGQKKworMjAxNC0xMi0xMCAxNDo1NjowNiArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IFVzZSBHc3RDbG9ja1RpbWUgZm9yIG5hbm9zZWNvbmQtYmFzZWQgdGltZSB2YXJpYWJsZXMvZmllbGRzCisJICBBdm9pZHMgY29uZnVzaW9uIHdpdGggdGltZXNjYWxlZC1iYXNlZCB2YXJpYWJsZXMgYW5kIGJ5dGVzIChvZmZzZXQpCisJICB2YXJpYWJsZXMuCisJICBBbmQgdXNlIEdTVF9DTE9DS19USU1FX05PTkUgd2hlcmUgYXBwbGljYWJsZQorCisyMDE0LTEyLTAzIDE0OjQ3OjA1ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvZGVidWd1dGlscy9nc3RwdXNoZmlsZXNyYy5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0cHVzaGZpbGVzcmMuaDoKKwkgIHB1c2hmaWxlc3JjOiBBZGQgVElNRSBTRUdNRU5UIGNhcGFiaWxpdHkKKwkgIEFkZHMgYSBuZXcgc2V0IG9mIHByb3BlcnRpZXMgdG8gbWFrZSBwdXNoZmlsZXNyYyBvdXRwdXQgYSBUSU1FIFNFR01FTlQKKwkgIChpbnN0ZWFkIG9mIHRoZSBmaWxlc3JjIEJZVEUgU0VHTUVOVCkuCisJICBXaGVuIHRpbWUtc2VnbWVudCBpcyBzZXQgdG8gVHJ1ZSB0aGUgZm9sbG93aW5nIHdpbGwgaGFwcGVuOgorCSAgKiBTZWVrcyBhcmUgcmVmdXNlZCAoZGF0YSBzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlKQorCSAgKiBUaGUgQllURSBzZWdtZW50IHdpbGwgYmUgcmVwbGFjZWQgYnkgYSBUSU1FIHNlZ21lbnQgd2l0aCB0aGUgdmFsdWVzCisJICBzcGVjaWZpZWQgaW4gdGhlIHZhcmlvdXMgcHJvcGVydGllcworCSAgKiBUaGUgZmlyc3Qgb3V0Z29pbmcgYnVmZmVyIHdpbGwgaGF2ZSBhIHRpbWVzdGFtcCBzZXQgb24gaXQgKGJ5IGRlZmF1bHQKKwkgIGl0IGhhcyBhIHZhbHVlIG9mIEdTVF9DTE9DS19USU1FX05PTkUpCisKKzIwMTQtMTItMTAgMTE6MzU6MjkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBBbHNvIG9ubHkgdW5yZWYgY2FwcyBpZiB0aGV5J3JlIG5vdCBOVUxMCisKKzIwMTQtMTItMTAgMTE6MzQ6NDIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMoKSB3aWxsIHJldHVybiBOVUxMIGlmIHRoZXJlIGlzIG5vIHBlZXIKKworMjAxNC0xMi0wOSAxNjozODozOCArMDEwMCAgVGhpYmF1bHQgU2F1bmllciA8dHNhdW5pZXJAZ25vbWUub3JnPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkgIHZwWGVuYzogQ0xPQ0tfVElNRV9OT05FIGlzIG5vdCBhIHZhbGlkIG1pbl9sYXRlbmN5IHZhbHVlCisJICBXZSBzaG91bGQganVzdCB1c2UgMCBpZiB3ZSBkbyBub3QgaGF2ZSB0aGUgaW5mb3JtYXRpb24KKworMjAxNC0xMi0wMyAxNzoyNjo1NiArMDEwMCAgVGhpYmF1bHQgU2F1bmllciA8dHNhdW5pZXJAZ25vbWUub3JnPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBVc2UgYW4gZW1wdHkgaXRlcmF0b3IgaW4gaXRlcmF0ZV9pbnRlcm5hbF9saW5rIHdoZW4gbm8gbGlua3MKKwkgIEFuZCBub3QgYSBOVUxMIEl0ZXJhdG9yLCBzbyBpdCBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHdheSBpdCB1c3VhbGx5CisJICB3b3JrcyBhbmQgYXZvaWQgdXNlciB0byBuZWVkIGEgZGlmZmVyZW50IGNvZGUgcGF0aHMgdG8gaGFuZGxlIHRoYXQuCisKKzIwMTQtMTItMDkgMTQ6MDE6NTAgKzAxMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQHBhcnJvdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogc2V0IGJ1ZmZlciBpbnRlcmxhY2UgZmxhZ3Mgd2hlbiBmaWVsZCBpcyBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQKKwkgIElmIHY0bDJfYnVmZmVyLmZpZWxkIGlzIFY0TDJfRklFTERfSU5URVJMQUNFRCwgd2Ugc2V0IGNvcnJlc3BvbmRpbmcKKwkgIEdzdFZpZGVvQnVmZmVyIGZsYWdzIGRlcGVuZGluZyBvbiB0aGUgdmlkZW8gc3RhbmRhcmQuCisJICBBY2NvcmRpbmcgdG8gVjRMMiBzcGVjaWZpY2F0aW9uLCBNL05UU0MgdHJhbnNtaXRzIHRoZSBib3R0b20gZmllbGQKKwkgIGZpcnN0LCBhbGwgb3RoZXIgc3RhbmRhcmRzIHRoZSB0b3AgZmllbGQgZmlyc3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3NjAzCisKKzIwMTQtMTItMDggMjE6MjY6MTggKzAxMDAgIFBhdHJpY2sgUmFkaXppIDxwYXRyaWNrckBheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiBGaXhlcyBidWZmZXIgbGVhayB3aGVuIHVzaW5nIFNQUy9QUFMKKwkgIEZpeGVzIGEgYnVmZmVyIGxlYWsgdGhhdCB3b3VsZCBvY2N1cnIgaWYgdGhlIHBpcGVsaW5lIHdhcyBzaHV0ZG93bgorCSAgd2hpbGUgYSBTUFMvUFBTIGhlYWRlciB3YXMgYmVpbmcgY3JlYXRlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDEyNzEKKworMjAxNC0xMi0wOSAwNDo0MzoyOSArMDEwMCAgTWF0aGlldSBEdXBvbmNoZWxsZSA8bWF0aGlldS5kdXBvbmNoZWxsZUBvcGVuY3JlZWQuY29tPgorCisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSAgYWdpbmd0djogZml4IG1lbWNweSB3aGVuIG5vIGNvbG9yIGFnaW5nIHJlcXVlc3RlZC4KKwkgIHZpZGVvX3NpemUgaXMgdGhlIHNpemUgaW4gcGl4ZWxzLCBhY3R1YWwgc2l6ZSBvZiB0aGUgbWVtY3B5CisJICBoYXMgdG8gYmUgc3RyaWRlICogaGVpZ2h0LgorCisyMDE0LTEyLTA3IDE3OjMzOjUxIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IFdvcmthcm91bmQgbGlidjRsMiBSVyBlbXVsYXRpb24gYnVnCisJICBXaGVuIGxpYnY0bDIgZW11bGF0ZXMgUlcgbW9kZSBvbiB0b3Agb2YgTU1BUCBkZXZpY2VzLCB0aGUgcXVldWVzIGFyZQorCSAgb25seSBpbml0aWFsaXplZCBvbiBmaXJzdCByZWFkLiBUaGUgcHJvYmxlbSBpcyB0aGF0IHBvbGwoKSB3aWxsIGZhaWwKKwkgIGlmIGNhbGxlZCBiZWZvcmUgdGhlIHF1ZXVlcyBhcmUgaW5pdGlhbGl6ZWQgYW5kIHN0cmVhbWluZy4gV29ya2Fyb3VuZAorCSAgdGhpcyBieSBkb2luZyBhIHplcm8gc2l6ZSByZWFkIHdoZW4gcG9vbCBpcyBzdGFydGVkIGluIHRoYXQgSU8gbW9kZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA2MzMKKworMjAxNC0xMi0wNyAxNzoyNzozNyAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBGaXggUlcgaW8gbW9kZQorCSAgSW4gUlcsIGFsbG9jYXRvciBjYW4gYmUgbnVsbCwgbWF4X2J1ZmZlcnMgY2FuIGJlIHplcm8sIGFuZCB3ZSBuZWVkIG5vdAorCSAgdG8gd2FpdCB3aGlsZSB0aGUgcXVldWUgaXMgZW1wdHkgc2luY2UgdGhlcmUgaXMgbm8gcXVldWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwNjMzCisKKzIwMTQtMTItMDMgMTY6NDA6NDkgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBDbGVhbnVwIHVuZWVkZWQgY2hlY2sgYW5kIGNhc2VzCisJICBUaGVyZSBpcyBub3RoaW5nIGluIGJldHdlZW4gdGhlIGJyZWFrIGFuZCB0aGUgImRvbmU6IiBhbnltb3JlLCBwbHVzCisJICBVU0VSUFRSIGFuZCBETUFCVUZfSU1QT1JUIGNhc2UgaXMgZXhhY3RseSB0aGUgc2FtZS4KKworMjAxNC0xMi0wMyAxNzowNzo0OSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMnBvb2w6IEZpeCBDUkVBVEVfQlVGUyBzdXBwb3J0IGZvciBjYXB0dXJlCisJICBUaGlzIHBhdGNoIGZpeGVzIENSRUFURV9CVUZTIHN1cHBvcnQgZm9yIGNhcHR1cmUgZGV2aWNlcy4gSW5pdGlhbGx5IHdlCisJICB3b3VsZCBvbmx5IHRyeSBhbmQgYWxsb2NhdGUgbW9yZSBidWZmZXJzIHdoZW4gdGhlIGNvcHkgdGhyZXNob2xkCisJICBpcyByZWFjaGVkLiBXaGVuIHRoZSB0aHJlc2hvbGQgd2FzIG5vdCBzZXQgKG5lZWRlZCkgaXQgd291bGQgbmV2ZXIKKwkgIGhhcHBlbi4gQW5vdGhlciBwcm9ibGVtIGlzIHRoYXQgb24gY2FwdHVyZSBzaWRlLCBhY3F1aXJlIHJldHVybnMKKwkgIGZpbGxlZCBidWZmZXIsIGhlbmNlIG5lZWQgdG8gcG9vbC4gV2UgbmVlZCB0byBzZXQgYSBzcGVjaWFsIGZsYWcgdG8KKwkgIGZvcmNlIGFsbG9jYXRpb24gdG8gaGFwcGVuLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MTEzNAorCisyMDE0LTEyLTAzIDE2OjI3OjU5IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYzoKKwkgIHY0bDJhbGxvY2F0b3I6IEZpeCBDUkVBVEVfQlVGIHByb2JpbmcKKwkgIEN1cnJlbnQgZm9yIGV2ZXJ5IG1lbW9yeSB0eXBlIHdlIHdoZXJlIHByb2JpbmcgTU1BUCBDUkVBVEVfQlVGUyBpb2N0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MTEzNAorCisyMDE0LTExLTE4IDE2OjUyOjQwICswMTAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBzZXQgZnJhbWVyYXRlIDAvMSB3aGVuIGR1cmF0aW9uIGlzIG5vdCBrbm93bgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDEzMAorCisyMDE0LTEyLTA0IDE3OjI1OjU1ICsxMTAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBNb3JlIGZpeGVzIGZvciByZXZlcnNlIHBsYXliYWNrCisJICBXaGVuIHNlZWtpbmcgb3IgZmluZGluZyB0aGUgcHJldmlvdXMga2V5ZnJhbWUsIGRvCisJICBjb21wYXJpc29ucyBhZ2FpbnN0IHRhcmdldHMgYW5kIHNlZ21lbnRzIHVzaW5nIGNvbXBvc2l0aW9uIHRpbWUKKwkgIHRvIGNvcnJlY3RseSBkZWNpZGUgd2hpY2ggc2FtcGxlIHRpbWVzIG1hdGNoLgorCisyMDE0LTEyLTAzIDExOjEyOjU1ICswMTAwICBUaGliYXVsdCBTYXVuaWVyIDx0c2F1bmllckBnbm9tZS5vcmc+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBVc2UgYW4gZW1wdHkgaXRlcmF0b3IgaW4gaXRlcmF0ZV9pbnRlcm5hbF9saW5rIHdoZW4gbm8gbGlua3MKKwkgIFdlIHVzZWQgdG8gc2V0dXAgYW4gaXRlcmF0b3Igd2l0aCAxIEdWYWx1ZSBzZXQgd2l0aCBhIE5VTEwgb2JqZWN0CisJICBwb2ludGVyIHdoaWNoIGlzIG5vdCB0aGUgbm9ybWFsIHdheSB0byBkbyB0aGF0LiBJbnN0ZWFkIHdlIHNob3VsZCBtYWtlCisJICBzdXJlIHRoYXQgdGhlIGZpcnN0IGNhbGwgdG8gZ3N0X2l0ZXJhdG9yX25leHQgcmV0dXJucyBHU1RfSVRFUkFUT1JfRE9ORS4KKworMjAxNC0xMi0wMyAxMzoyMDo1NyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogSGFuZGxlIHNlZWtzIHBhc3QgRU9TIGFzIGEgc2VlayB0byB0aGUgZW5kCisJICBGaXggcmV2ZXJzZSBwbGF5YmFjayBvZiBldmVyeSBmcmFtZSBieSBtYWtpbmcgc2Vla3MgcGFzdC90byBFT1MKKwkgIGZpbmQgdGhlIGxhc3Qgc2VnbWVudCBhbmQgc3RhcnQgdGhlcmUuCisKKzIwMTQtMTItMDIgMTU6MzM6MjUgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkgIHJ0cG1wYWRlcGF5OiBSZWxheCBjYXBzIHRvIGFsbG93IGFueSBjbG9jay1yYXRlCisJICBTb21lIFdvd3phIHNldHVwcyBzZWVtIHRvIHNlbmQgYW4gaW52YWxpZCBub24tOTAwMDAgY2xvY2stcmF0ZS4KKworMjAxNC0xMi0wMSAyMTowNDowMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRvbid0IHVzZSBHU1RfQ0xPQ0tfVElNRV9OT05FIGluIG5vbiBHc3RDbG9ja1RpbWUgdmFyaWFibGVzCisJICBVc2UgLTEgaW5zdGVhZCBhcyB0aG9zZSBhcmUgZ2ludDY0L2d1aW50NjQgdmFyaWFibGVzIGFuZCBub3QgR3N0Q2xvY2tUaW1lCisKKzIwMTQtMTEtMDcgMTc6MDY6NDkgKzAxMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQHBhcnJvdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuaDoKKwkgIHY0bDJhbGxvY2F0b3I6IGZpeCBnc3RfdjRsMl9hbGxvY2F0b3Jfc3RvcCBwcm90b3R5cGUKKwkgIGdzdF92NGwyX2FsbG9jYXRvcl9zdG9wIHJldHVybnMgYSBHc3RWNGwyUmV0dXJuLCBub3QgYSBnYm9vbGVhbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk3OTIKKworMjAxNC0xMS0wNyAxNjo0MTo1MiArMDEwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiB1bnJlZiBwb29sIHdoZW4gdjRsMl9hbGxvY2F0b3JfbmV3KCkgZmFpbHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk3OTEKKworMjAxNC0xMS0zMCAxNzo1Mjo0NyAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuaDoKKwkgIHY0bDI6IFJlbW92ZSBsYXN0IGluY2x1ZGUgdG8gbGludXgvdmlkZW9kZXYyLmgKKwkgIFdlIG5vdyB1c2UgYW5kIHVwZGF0ZSBvdXIgaW50ZXJuYWwgY29weSBzbyB3ZSBubyBsb25nZXIgaGF2ZSB0byBpZmRlZgorCSAgdGhlIGVudGlyZSBjb2RlIGZvciBmZWF0dXJlcyBhbmQgZGVmaW5lcyB0aGF0IHdoZXJlIGFkZGVkIG92ZXIgdGhlCisJICB5ZWFycy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDA5MDUKKworMjAxNC0wOC0yNCAxMzozODowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGltcGxlbWVudCBzZWVraW5nIGluIGZyYWdtZW50ZWQgbXA0IGZpbGVzIGluIHB1bGwgbW9kZSBiYXNlZCBvbiB0aGUgbWZyYSB0YWJsZQorCisyMDE0LTExLTI5IDE1OjI1OjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHVzZSB0cmFjayBmcmFnbWVudCBkZWNvZGluZyB0aW1lICh0ZmR0KSBpbiBwYXJzZV90cnVuKCkgZm9yIGludGVycG9sYXRpb24KKwkgIEFzIGZhbGxiYWNrIGlmIHdlIGRvbid0IGhhdmUgYW55IGV4aXN0aW5nIHNhbXBsZXMKKwkgIGFzIHJlZmVyZW5jZSBwb2ludCB5ZXQuCisJICBCYXNlZCBvbiBwYXRjaCBieSBEYXZpZCBDb3J2b3lzaWVyIDxkYXZpZC5jb3J2b3lzaWVyQG9yYW5nZS5jb20+CisKKzIwMTQtMTEtMjkgMTQ6Mzc6MjUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBwYXJzZSBtZnJhIHJhbmRvbSBhY2Nlc3MgYm94IGZvciBmcmFnbWVudGVkIG1wNCBmaWxlcworCSAgSWYgaXQncyBwcmVzZW50LCBhbmQgd2Ugb3BlcmF0ZSBpbiBwdWxsIG1vZGUuCisKKzIwMTQtMDgtMTUgMTQ6NTg6MjYgKzAyMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc3RvcCBwYXJzaW5nIGhlYWRlcnMgZm9yIGZyYWdtZW50ZWQgbXA0cyBhdCB0aGUgZmlyc3QgbW9vZgorCSAgQ3VycmVudGx5IGR1cmluZyBoZWFkZXIgcGFyc2luZywgd2Ugc2NhbiB0aHJvdWdoIHRoZSBlbnRpcmUgZmlsZQorCSAgYW5kIHNraXAgZXZlcnkgbW9vZittZGF0IGNodW5rIGZvciBmcmFnbWVudGVkIG1wNHMsIHdoaWNoIG1ha2VzCisJICBzdGFydC11cCBpbmNyZWRpYmx5IHNsb3cuIEluc3RlYWQsIGp1c3Qgc3RvcCBhdCB0aGUgZmlyc3QgbW9vZgorCSAgY2h1bmsgd2hlbiBoYXZlIGEgbW9vdiwgYW5kIHN0YXJ0IGV4cG9zaW5nIHRoZSBzdHJlYW1zLCBzbyB3ZQorCSAgY2FuIGdvIGFuZCBzdGFydCBoYW5kbGluZyB0aGUgbW9vZnMgZm9yIHJlYWwuCisKKzIwMTQtMTEtMjkgMTM6NTk6MzUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2ljbGVzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ljbGVzL2dka3BpeGJ1Zm92ZXJsYXktdGVzdC5jOgorCSAgdGVzdHM6IGFkZCBpbnRlcmFjdGl2ZSBnZGtwaXhidWZvdmVybGF5IHRlc3QKKwkgIEp1c3QgbmVlZCB0byBmaXggdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG5vdyBzbworCSAgdGhhdCBuZWdhdGl2ZSBvZmZzZXRzIGFyZSBhY3R1YWxseSBuZWdhdGl2ZQorCSAgYW5kIG5vdCBmbGlwcGVkIHRvIHBvc2l0aW9uIHRoaW5ncyBmcm9tIHRoZQorCSAgb3Bwb3NpdGUgYm9yZGVyLgorCisyMDE0LTExLTI5IDEzOjUzOjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5Lmg6CisJICBnZGtwaXhidWZvdmVybGF5OiBhZGQgInBpeGJ1ZiIgcHJvcGVydHkKKwkgIFNvIHdlIGNhbiBzZXQgYSBHZGtQaXhidWYgZGlyZWN0bHkgaW5zdGVhZCBvZgorCSAgcmVhZGluZyBpdCBmcm9tIGFuIGltYWdlIGZpbGUgb24gdGhlIGZpbGUgc3lzdGVtLgorCisyMDE0LTExLTI5IDEzOjIzOjUwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9NYWtlZmlsZS5hbToKKwkqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5oOgorCSAgZ2RrcGl4YnVmOiByZW1vdmUgcGl4YnVmc2NhbGUgY29kZSB0aGF0IHdhcyBuZXZlciBwb3J0ZWQKKwkgIERvbid0IHRoaW5rIHdlJ2xsIG5lZWQgdGhpcyBhZ2Fpbi4KKworMjAxNC0xMS0yOSAxODozNTo0MiAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jOgorCSAgcnRwcnR4cmVjZWl2ZTogVXNlIG9mZnNldCB3aGVuIGNvcHlpbmcgaGVhZGVyCisJICBUaGUgaGVhZGVyIGlzIG5vdCBhbHdheXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQsIHNvIHdlIG5lZWQgdG8gY29tcHV0ZQorCSAgdGhlIG9mZnNldCBmaXJzdC4KKworMjAxNC0xMS0yOCAxMzoxMjo0NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3RhZ2xpYi9nc3RhcGV2Mm11eC5jYzoKKwkgIGFwZXYybXV4OiB3cml0ZSBBUEUgdGFncyBhdCBlbmQgZm9yIHdhdnBhY2sgZmlsZXMKKwkgIGh0dHA6Ly93d3cud2F2cGFjay5jb20vZmlsZV9mb3JtYXQudHh0OgorCSAgIkJvdGggdGhlIEFQRXYyIHRhZ3MgYW5kL29yIElEM3YxIHRhZ3MgbXVzdCBjb21lIGF0IHRoZSBlbmQgb2YgdGhlCisJICBXYXZQYWNrIGZpbGUsIHdpdGggdGhlIElEM3YxIGNvbWluZyBsYXN0IGlmIGJvdGggYXJlIHByZXNlbnQuIgorCSAgV2F2UGFjayBmaWxlcyB0aGF0IGNvbnRhaW4gQVBFdjIgdGFncyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlcworCSAgYXJlIHVucGxheWFibGUgb24gcGxheWVycyB0aGF0IHVzZSBGRm1wZWcgKGxpa2UgVkxDKSBhbmQgbW9zdCBvdGhlcgorCSAgc29mdHdhcmUgKGV4Y2VwdCBCYW5zaGVlKS4gUGxheWVycyB0aGF0IHVzZSBsaWJ3YXZwYWNrIGRpcmVjdGx5IGNhbgorCSAgcGxheSB0aGUgZmlsZXMgYmVjYXVzZSBpdCBza2lwcyB0aGUgdGFncywgYnV0IGRvZXMgbm90IHJlY29nbml6ZSB0aGUKKwkgIHRhZyBkYXRhIGF0IHRoYXQgbG9jYXRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzExNDM3CisKKzIwMTQtMTEtMjggMTA6NDE6NTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2ljbGVzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ljbGVzL3Rlc3Qtc2VnbWVudC1zZWVrcy5jOgorCSAgdGVzdHM6IGFkZCBpbnRlcmFjdGl2ZSB0ZXN0IGZvciBnYXBsZXNzIHBsYXliYWNrIHVzaW5nIFNFR01FTlQgc2Vla3MKKwkgIE5vdCB3b3JraW5nIHRvbyB3ZWxsIHlldCwgdGhlcmUgYXJlIGdsaXRjaGVzIGV2ZW4gd2l0aCBXQVYgb3IgRkxBQy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTIzNjgKKworMjAxNC0xMS0yNiAxMDozMzowOSArMDMwMCAgQW5kcmVpIFNhcmFrZWV2IDxzYXJha3VzaGFAZ21haWwuY29tPgorCisJKiBnc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuaDoKKwkgIGFzcGVjdHJhdGlvY3JvcDogSGFuZGxlIHJlc29sdXRpb24gY2hhbmdlcyBwcm9wZXJseQorCSAgV2hlbiBhbiBjYXBzLWV2ZW50IGlzIHJlY2VpdmVkLCB3ZSBtdXN0IGltbWVkaWF0ZWx5IGNoYW5nZSB0aGUgY3JvcAorCSAgdG8gdmlkZW9jcm9wIGNvcnJlY3RseSBjaGFuZ2VkIGNhcHMtZXZlbnQgZGltZW5zaW9uLCBvdGhlcndpc2UgdGhlCisJICB2aWRlb2Nyb3Agd2lsbCBmaXJzdCB1c2UgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBjcm9wIHRoYXQgd2hlbgorCSAgcmVzaXppbmcgdmlkZW8gdG8gYSBzbWFsbGVyIHJlc29sdXRpb24gbWF5IGNhdXNlIGFuIGVycm9yLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc0MDY3MQorCisyMDE0LTExLTI3IDE3OjEwOjUzICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gN2JiMmJjZSB0byBlZjFmZmRjCisKKzIwMTQtMTEtMjcgMTE6MjA6MzYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2ljbGVzL3Rlc3QtYWNjdXJhdGUtc2Vlay5jOgorCSAgdGVzdDogdXNlIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCgpIGZvciB0aW1lc3RhbXAgdG8gc2FtcGxlIGNhbGN1bGF0aW9uCisKKzIwMTQtMTEtMjcgMTE6MTY6MzUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2ljbGVzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ljbGVzL3Rlc3QtYWNjdXJhdGUtc2Vlay5jOgorCSAgdGVzdHM6IGFkZCBpbnRlcmFjdGl2ZSB0ZXN0IGZvciBhY2N1cmF0ZSBzZWVraW5nCisJICBGb3Igc29tZSBhdWRpbyBmb3JtYXRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NTI3NgorCisyMDE0LTExLTI2IDE2OjA0OjI2ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIGlzb21wNDogQ2hlY2sgcHJlc2VuY2Ugb2YgbWZoZCBpbiBtb29mCisJICBUaGUgJ21maGQnIGF0b20gaXMgbWFuZGF0b3J5IGluICdtb29mJy4gV2UgY2FuIGxhdGVyIG9uIGNoZWNrIHdoZXRoZXIKKwkgIHRoZSBmcmFnbWVudCBudW1iZXIgcHJvcGVybHkgaW5jcmVhc2VzCisKKzIwMTQtMTEtMjYgMTU6NTk6MzYgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9kdW1wLmM6CisJICBpc29tcDQ6IEZpeCBtZnJvIGFuZCB0ZnJhIGF0b20gZHVtcGluZworCSAgbWZybyB3YXMgc2tpcHBpbmcgdGhlIHZlcnNpb24vZmxhZ3MKKwkgIHRmcmEgaGFkIHdyb25nIGJ5dGVfcmVhZGVyIHJldHVybiB2YWx1ZSBjaGVja3MKKworMjAxNC0xMS0yNiAxNTo1ODoyNiArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4X2R1bXAuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9kdW1wLmg6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuYzoKKwkgIGlzb21wNDogQWRkIG1maGQgYXRvbSBkdW1waW5nCisKKzIwMTQtMTEtMjcgMDA6MTU6MDIgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEhhbmRsZSBlbXB0eSBzZWdtZW50cyB3aGVuIHNlZWtpbmcgaW4gcmV2ZXJzZSBwbGF5LgorCSAgRW1wdHkgc2VnbWVudHMgaW4gYW4gZWRpdCBsaXN0IGhhdmUgYSBtZWRpYV9zdGFydCB0aW1lIG9mIC0xLAorCSAgYXMgdGhleSBkb24ndCBhY3R1YWxseSBwbGF5IGFueSBtZWRpYS4gQWxsb3cgZm9yIHRoYXQgd2hlbgorCSAgYWxpZ25pbmcgdG8gdGhlIHJlZmVyZW5jZSBzdHJlYW0gaW4gcmV2ZXJzZSBwbGF5LgorCisyMDE0LTExLTI0IDEwOjM2OjU0IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgUmV2ZXJ0ICJ2NGwyYWxsb2NhdG9yOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCBhZDQ0ODBkNTM0MDhhNGQ5N2FiNTMxMTc0ZWYzN2YyNThmMzI1M2MwLgorCisyMDE0LTExLTI0IDEwOjM2OjMwIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIFJldmVydCAidjRsMjogbW92ZSB2Yl9xdWV1ZSBwcm9iaW5nIGZyb20gYWxsb2NhdG9yIHRvIHY0bDJvYmplY3QiCisJICBUaGlzIHJldmVydHMgY29tbWl0IGVjNmI4Yjg0YWY3MTlkODI4ZGRkOTFjNzI0ZTcxNWMwYjRhNTU2YmMuCisKKzIwMTQtMTEtMjQgMTA6MzM6MjkgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgUmV2ZXJ0ICJ2NGwyb2JqZWN0OiBhbGxvdyB0byBhdXRvbWF0aWMgc2VsZWN0aW9uIG9mIGRtYWJ1ZiIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgZTZjMmFkNTU3MWU1ZGVkYjIxMjI4N2VmZTIzOGViNDUwMDMyY2Q0Zi4KKworMjAxNC0xMS0yMyAxNjozNDoxNSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogUkVRVUlSRU1FTlRTOgorCSAgUkVRVUlSRU1FTlRTOiB1cGRhdGUgYSBsaXR0bGUKKwkgIFBlb3BsZSBhY3R1YWxseSBsb29rIGF0IHRoYXQgaXQgc2VlbXMuCisKKzIwMTQtMTEtMjMgMTY6MjI6MTIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pY3lkZW11eC9NYWtlZmlsZS5hbToKKwkgIGljeWRlbXV4OiBkb2VzIG5vdCBuZWVkIHRvIGxpbmsgYWdhaW5zdCB6bGliCisKKzIwMTQtMTEtMjIgMjE6Mjg6MzUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5oOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmg6CisJICBzcGVleDogcmVtb3ZlIHN1cHBvcnQgZm9yIGFuY2llbnQgc3BlZXggdmVyc2lvbnMKKworMjAxNC0xMS0yMSAxMToyMToxOCArMDEwMCAgQnJhbmlzbGF2IEthdHJlbmlhayA8YmthdHJlbmlha0BudXZvdGVjaG5vbG9naWVzLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBsb2cgY29ubmVjdGlvbiBldmVudHMgYXQgaW5mbyBsZXZlbAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczOTMwNQorCisyMDE0LTEwLTIwIDEzOjAwOjM3ICswMjAwICBNaWd1ZWwgUGFyw61zIETDrWF6IDxtcGFyaXNkaWF6QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGVuc3VyZSBydHhfcmV0cnlfcGVyaW9kID49IDAKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzkzNDQKKworMjAxNC0xMS0yMSAxMTo0NDoyNCAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYzoKKwkgIHY0bDJhbGxvY2F0b3I6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKwkgIHRoaXMgd2FzIGludHJvZHVjZWQgYnkgY29tbWl0IGVjNmI4YgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTM4MgorCisyMDE0LTExLTE2IDEyOjM0OjE3IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDI6IEhhbmRsZSBjb3JydXB0ZWQgYnVmZmVyIHdpdGggZW1wdHkgcGF5bG9hZAorCSAgVGhpcyBhbGxvdyBza2lwcGluZyBidWZmZXIgZmxhZ2dlZCB3aXRoIEVSUk9SIHRoYXQgaGFzIG5vIHBheWxvYWQuCisJICBUaGlzIGlzIHR5cGljYWwgYmVoYXZpb3VyIHdoZW4gYSByZWNvdmVyZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nCisJICBjYXB0dXJlIGluIHRoZSBkcml2ZXIsIGJ1dCB0aGF0IG5vIHZhbGlkIGRhdGEgd2FzIGV2ZXIgd3JpdHRlbiBpbnRvIHRoYXQKKwkgIGJ1ZmZlci4gVGhpcyBwYXRjaCBhbHNvIHRyYW5zbGF0ZSBWNEwyX0JVRl9GTEFHX0VSUk9SIGludG8KKwkgIEdTVF9CVUZGRVJfRkxBR19DT1JSVVBURUQuIEhlbmNlIGRlY29kaW5nIGVycm9yIHByb2R1Y2UKKwkgIGJ5IGRlY29kZXIgZHVlIHRvIG1pc3NpbmcgZnJhbWVzIHdpbGwgbm93IGJlIGNvcnJlY3RseSBtYXJrZWQuIEZpbmFsbHksCisJICB0aGlzIGZpeGVzIGEgYnVmZmVyIGxlYWsgd2hlbiBFT1MgaXMgcmVhY2hlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDAwNDAKKworMjAxNC0xMS0yMSAxNjozNjoxNSArMDEwMCAgQmVuamFtaW4gR2FpZ25hcmQgPGJlbmphbWluLmdhaWduYXJkQGxpbmFyby5vcmc+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBhbGxvdyB0byBhdXRvbWF0aWMgc2VsZWN0aW9uIG9mIGRtYWJ1ZgorCSAgSWYgdGhlIHY0bDIgcXVldWUgc3VwcG9ydCBkbWFidWYgc2VsZWN0IHRoaXMgYnVmZmVyIHBvb2wgbW9kZQorCSAgYW5kIHVwZGF0ZSB0aGUgcXVlcnkgd2l0aCBhbGxvY2F0b3IuCisJICBUaGlzIHBhdGNoIG9ubHkgY29uY2VybiBleHBvcnRpbmcgZG1hYnVmIGFuZCBub3QgaW1wb3J0aW5nIGRtYWJ1ZgorCSAgZmQgZnJvbSBkb3duc3RyZWFtIGVsZW1lbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk5MzgyCisKKzIwMTQtMTEtMjEgMTY6MTM6MDUgKzAxMDAgIEJlbmphbWluIEdhaWduYXJkIDxiZW5qYW1pbi5nYWlnbmFyZEBsaW5hcm8ub3JnPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgdjRsMjogbW92ZSB2Yl9xdWV1ZSBwcm9iaW5nIGZyb20gYWxsb2NhdG9yIHRvIHY0bDJvYmplY3QKKwkgIFRoZSBnb2FsIGlzIHRvIG1ha2UgdGhvc2UgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGluIHY0bDJfb2JqZWN0CisJICB0byBiZSBhYmxlIGxhdGVyIHRvIHNlbGVjdCB0aGUgYmVzdCBhbGxvY2F0aW9uIG1ldGhvZCBmb3IgdGhlIHBvb2wKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTkzODIKKworMjAxNC0xMS0yMCAyMjo0Mjo1OSArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgcnRwYmluOiBGaXggdXAgbmV3X2ppdHRlcmJ1ZmZlciBzaWduYWwgcHJvdG90eXBlCisKKzIwMTQtMTEtMjAgMjA6MTk6MjUgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGdpdEBhcnVucmFnaGF2YW4ubmV0PgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogRG9jdW1lbnQgaG93IHRvIGNvbnRyb2wgcGVyLVNTUkMgcmV0cmFuc21pc3Npb24KKworMjAxNC0xMS0yMCAyMDoxODo0NSArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Z2l0QGFydW5yYWdoYXZhbi5uZXQ+CisKKwkqIGRvY3MvZGVzaWduL2Rlc2lnbi1ydHByZXRyYW5zbWlzc2lvbi50eHQ6CisJICBkb2M6IFRyaXZpYWwgc3BlbGxpbmcgYW5kIGNvbnNpc3RlbmN5IHVwZGF0ZQorCisyMDE0LTExLTIwIDEzOjE0OjE0ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIHJ0cGdzdHBheTogcHV0IDAtYnl0ZSBhdCB0aGUgZW5kIG9mIGV2ZW50cworCSAgUHV0IGEgMC1ieXRlIGF0IHRoZSBlbmQgb2YgdGhlIGV2ZW50IHN0cmluZy4gRG9lcyBub3QgYnJlYWsgQUJJIGJlY2F1c2UKKwkgIG9sZCBkZXBheWxvYWRlcnMgd2lsbCBza2lwIHRoZSAwIGJ5dGUgKHdoaWNoIGlzIGluY2x1ZGVkIGluIHRoZSBsZW5ndGgpLgorCSAgRXhwZWN0IGEgMC1ieXRlIGF0IHRoZSBlbmQgb2YgdGhlIGV2ZW50IHN0cmluZyBvciBhIDsgZm9yIG9sZAorCSAgcGF5bG9hZGVycy4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3NTkxCisKKzIwMTQtMTEtMjAgMTI6NDA6MjggKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmM6CisJICBydHBnc3RkZXBheTogYXZvaWQgYnVmZmVyIG92ZXJyZWFkLgorCSAgQ2hlY2sgdGhhdCBhIGNhcHMgZXZlbnQgc3RyaW5nIGlzIDAgdGVybWluYXRlZCBhbmQgdGhlIGV2ZW50IHN0cmluZyBpcworCSAgdGVybWluYXRlZCB3aXRoIGEgOyB0byBhdm9pZCBidWZmZXIgb3ZlcnJlYWRzLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNzU5MQorCisyMDE0LTExLTIwIDEwOjQ1OjA3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogZG9uJ3QgbGltaXQgbWF4IHZpZGVvIHJlc29sdXRpb24gdG8gNDA5Nng0MDk2CisJICBNQVggaXNuJ3QgZW50aXJlbHkgY29ycmVjdCBhcyB1cHBlciBsaW1pdCBlaXRoZXIsCisJICBpdCBzaG91bGQgcmVhbGx5IGJlIE1BWFVJTlQzMiwgYnV0IGl0J3MgdW5saWtlbHkKKwkgIHRvIGJlIGEgcHJvYmxlbSBpbiB0aGUgbmVhciBmdXR1cmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwNDA3CisKKzIwMTQtMTEtMTkgMTU6MDY6MDAgLTA4MDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdcOpIDxhbGVpeEBvYmxvbmcuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggbGVhayBmb3IgbWlrZXkgYmFzZTY0IGRlY29kZWQga2V5LW1nbXQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NDAzOTIKKworMjAxNC0xMS0yMCAwOTowMTozOCArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkgIHZpZGVvYmFsYW5jZTogZml4IHVuaGFuZGxlZCBmb3JtYXQgaW4gcGFzc3Rocm91Z2gKKwkgIEluIHBhc3N0aHJvdWdoIHdlIGNhbiBoYW5kbGUgYWxsIGZvcm1hdHMuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQwMzg3CisKKzIwMTQtMTEtMTkgMTY6MTI6MzggKzAxMDAgIEphbiBBbGV4YW5kZXIgU3RlZmZlbnMgKGhlZnRpZykgPGpzdGVmZmVuc0BtYWtlLnR2PgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogUmVzdHJpY3QgcmVzeW5jaW5nIHRvIFRTIHJlZ3Jlc3Npb25zCisJICBUaGUgYmVoYXZpb3Igb2YgcmVzeW5jaW5nIHZpZGVvIGFuZCBhdWRpbyBpbmRlcGVuLQorCSAgZGVudGx5IGNhbiBjYXVzZSBBL1YgZGVzeW5jcy4gTGV0cyByZXN0cmljdCByZXN5bmNzCisJICB0byBqdW1wcyBiYWNrd2FyZCBmb3Igbm93LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjM5NworCisyMDE0LTExLTE3IDIzOjE2OjAzICsxMTAwICBNYXR0aGV3IFdhdGVycyA8bWF0dGhld0BjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5oOgorCSAgdmlkZW9taXhlcjogZml4IHVwIFFvUyBoYW5kbGluZyBmb3IgbGl2ZSBzb3VyY2VzCisJICBPbmx5IGF0dGVtcHQgYWRhcHRpdmUgZHJvcCB3aGVuIHdlIGFyZSBub3QgbGl2ZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczOTk5NgorCisyMDE0LTExLTEwIDIyOjM0OjM5ICswMTAwICBIZW5uaW5nIEhlaW5vbGQgPGhlbm5pbmdAaXRjb25zdWx0aW5nLWhlaW5vbGQuZGU+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtUENNQS5weToKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLnB5OgorCSAgZXhhbXBsZXM6IHBvcnQgcHl0aG9uIHJ0cCBQQ01BIGNsaWVudC9zZXJ2ZXIgdGVzdHMgdG8gMS4wCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM5OTMwCisKKzIwMTQtMDYtMDQgMTI6MTE6MTAgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiBzZXQgdGhlIGNoYW5uZWwgcG9zaXRpb25zIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBBUEkKKwkgIFRoaXMgYXZvaWRzIF9zZXRfZm9ybWF0IHNldHRpbmcgdGhlIHVucG9zaXRpb25lZCBmbGFnIHdoZW4gcGFzc2VkCisJICBOVUxMIGFzIGNoYW5uZWwgcG9zaXRpb25zLCBhcyBpdCB3b3VsZCBub3QgYmUgY2xlYXJlZCB3aGVuIHNldHRpbmcKKwkgIGFjdHVhbCBjaGFubmVsIHBvc2l0aW9ucyBsYXRlci4KKworMjAxNC0xMS0wMSAyMjozOTo0MSArMDEwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAZGFya29zcGhlcmUuZnI+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnB4L2dzdHZwOWVuYy5jOgorCSAgdnB4OiBtYXJrIGFybnItdHlwZSBwcm9wZXJ0aWVzIGFzIGRlcHJlY2F0ZWQgYW5kIHNldCB0aGVtIHRvIG5vLW9wCisJICBBUk5SIHR5cGUgY29udHJvbCBpbiBsaWJ2cHggaGFzIGJlZW4gZGVwcmVjYXRlZCBzbyB0aGlzIGNvbW1pdCBtYXJrIHRoZQorCSAgdnA4ZW5jIGFuZCB2cDllbmMgYXNzb2NpYXRlZCBwcm9wZXJ0aWVzIGFzIGRlcHJlY2F0ZWQgYW5kIGNoYW5nZSB0aGVpcgorCSAgYmVoYXZpb3IgdG8ganVzdCBkaXNwbGF5IGEgd2FybmluZyBtZXNzYWdlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczOTQ3NgorCisyMDE0LTExLTEwIDEzOjE2OjAxICswNTMwICBBcnVuIFJhZ2hhdmFuIDxnaXRAYXJ1bnJhZ2hhdmFuLm5ldD4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBtYW5hZ2VyOiBUcml2aWFsIHR5cG8gZml4CisKKzIwMTQtMTEtMDkgMTE6MDQ6MzMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thLW11eDogVXNlIEdfREVGSU5FX1RZUEUoKSB0byByZWdpc3RlciB0aGUgcGFkIGluc3RlYWQgb2YgbWFudWFsbHkgcmVnaXN0ZXJpbmcgaXQKKworMjAxNC0xMS0wNiAxNTozNzoyOCArMDEwMCAgR8O2cmFuIErDtm5zc29uIDxnb3JhbmpuQGF4aXMuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogbWFrZSBHc3RNYXRyb3NrYW11eFBhZCBnZXRfdHlwZSgpIGZ1bmN0aW9uIHRocmVhZC1zYWZlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM5NzIyCisKKzIwMTQtMTEtMDcgMTY6MTE6MjQgKzAxMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQHBhcnJvdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYzoKKwkgIHY0bDJhbGxvY2F0b3I6IGZpeCBlcnJvciBtZXNzYWdlIGlmIGFsbG9jYXRvciBpcyBhbHJlYWR5IGFjdGl2ZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczOTc4OQorCisyMDE0LTExLTA2IDIxOjIxOjQwIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBJbXByb3ZlIGJ1ZmZlciB2YWxpZGF0aW9uCisJICBJbXByb3ZlIGJ1ZmZlciB2YWxpZGF0aW9uIGJ5IG1ha2luZyBzdXJlIGVhY2ggbWVtb3J5IGFyZSB0aGUgcmlnaHQKKwkgIG9uZSBhbmQgdGhhdCBlYWNoIG1lbW9yeSBpcyB3cml0YWJsZS4gVGhpcyBmaXhlcyB0ZWFyaW5nIGlzc3VlcyBpbgorCSAgY2FzZSBkb3duc3RyZWFtIHVzZXMgZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlKCkgb3Igb3RoZXIgdHlwZQorCSAgb2YgR3N0QnVmZmVyIGNvcHkgd2hlcmUgbWVtb3J5IGFyZSBvbmx5IHJlZmZlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk3NTQKKworMjAxNC0xMS0wNiAyMTozODo0MyArMDEwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBnc3QvcnRzcC9NYWtlZmlsZS5hbToKKwkgIHJ0c3A6IGZpeCBidWlsZCBpbiBnc3QtdW5pbnN0YWxsZWQgc2V0dXAKKworMjAxNC0xMC0yOSAxODo0NDo0MyArMDEwMCAgVGhpYmF1bHQgU2F1bmllciA8dHNhdW5pZXJAZ25vbWUub3JnPgorCisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5oOgorCSAgaW1hZ2VmcmVlemU6IEhhbmRsZSBzZXFudW1zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM5MzY2CisKKzIwMTQtMTEtMDQgMDg6MTg6NDEgKzA1MzAgIFZpbmVldGggVCBNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuaDoKKwkgIHBuZ2RlYzogY2hhbmdlIHBhcnNlIGxvZ2ljCisJICBSaWdodCBub3cgaW4gcGFyc2UgbG9naWMgdGhlIHNpZ25hdHVyZSBpcyBjaGVja2VkIGV2ZXJ5IHRpbWUgdGhlIHBhcnNlIGZ1bmN0aW9uCisJICBpcyBjYWxsZWQsIGFuZCB0aGUgd2hvbGUgZGF0YSBpcyB0aGUgc2Nhbm5lZCBlYWNoIGFuZCBldmVyeSB0aW1lLCBldmVuIHRob3VnaCB0aGUKKwkgIGRhdGEgaXMgc2Nhbm5lZCBpbiB0aGUgcHJldmlvdXMgaW5zdGFuY2UuIENoYW5naW5nIHRoZSBsb2dpYyBzdWNoIHRoYXQsIHdlIHNraXAKKwkgIHRoZSBieXRlcyB3aGljaCBhcmUgYWxyZWFkeSBzY2FubmVkIGluIHRoZSBwcmV2aW91cyBpbnN0YW5jZXMgb2YgcGFyc2UuIFRoaXMKKwkgIGhlbHBzIGluIGF2b2lkaW5nIG11bHRpcGxlIHNjYW4gb2YgYWxyZWFkeSBzY2FubmVkIGRhdGEvc2lnbmF0dXJlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNzcwOAorCisyMDE0LTExLTAzIDE1OjI2OjA2ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXIyOiByZXZlcnNlIG9yZGVyIG9mIHBhcmFtcyBmb3IgY29udmVydGVyCisKKzIwMTQtMTEtMDMgMTE6NDQ6MjggKzAxMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQHBhcnJvdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogZml4IHR5cG8gaW4gZmxhZ3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk1NDkKKworMjAxNC0xMS0wMiAyMzozMzoyMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMnNyYzogZml4IGEgY291cGxlIG9mIG1pbm9yIGxlYWtzCisKKzIwMTQtMTEtMDIgMTk6NDI6MDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uYzoKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uaDoKKwkgIGdvb20yazE6IHBvc3QgUW9TIG1lc3NhZ2VzIHdoZW4gZHJvcHBpbmcgZnJhbWVzIGR1ZSB0byBRb1MKKworMjAxNC0xMS0wMiAxOToyOTo1MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5oOgorCSAgZ29vbTogcG9zdCBRb1MgbWVzc2FnZXMgd2hlbiBkcm9wcGluZyBmcmFtZXMgZHVlIHRvIFFvUworCisyMDE0LTExLTAyIDE5OjAyOjM1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogdHdlYWsgd3JpdGluZyBhcHAgdGFnIHN0cmluZyBhIGxpdHRsZQorCisyMDE0LTExLTAyIDE2OjUxOjIzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgU3ByaW5rbGUgc29tZSBHX1BBUkFNX0RFUFJFQ0FURUQgYW5kICNpZm5kZWYgR1NUX1JFTU9WRV9ERVBSRUNBVEVECisKKzIwMTQtMTEtMDIgMTY6NTg6MDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6CisJICB0ZXN0czogZG9uJ3QgdXNlIGRlcHJlY2F0ZWQgcHJvcGVydHkgaW4gbGV2ZWwgdW5pdCB0ZXN0CisKKzIwMTQtMTEtMDIgMTM6MDY6MzMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBpbXBsZW1lbnQgZ2V0L3NldCBmb3IgbmV3IHJ0eC1taW4tcmV0cnktdGltZW91dCBwcm9wZXJ0eQorCSAgUHJvcGVydGllcyBhcmUgc28gbXVjaCBtb3JlIHVzZWZ1bCBpZiB5b3UgY2FuIGFjdHVhbGx5IHNldAorCSAgYW5kIGdldCB0aGVpciB2YWx1ZXMuCisKKzIwMTQtMTAtMzAgMTc6NDE6MTkgKzAwMDAgIFNpbW9uIEZhcm5zd29ydGggPHNpbW9uLmZhcm5zd29ydGhAb25lbGFuLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogQ2xlYW4gdXAgaW50ZXJsYWNlIHN1cHBvcnQKKwkgIFJhdGhlciB0aGFuIHRyeSBhbmQgZ3Vlc3MgaW50ZXJsYWNlIHN1cHBvcnQgYXMgcGFydCBvZiBjaGVja2luZyBzdXBwb3J0ZWQKKwkgIHNpemVzLCBsb29rIGZvciBpbnRlcmxhY2Ugc3VwcG9ydCBzcGVjaWZpY2FsbHkgaW4gaXRzIG93biBmdW5jdGlvbi4KKwkgIEFzIGEgY2xlYW51cCwgdXNlIFY0TDJfRklFTERfQU5ZIHdoZW4gcHJvYmluZyBzaXplcywgd2hpY2ggc2hvdWxkIHJlc3VsdCBpbgorCSAgdGhlIGRyaXZlciBkb2luZyB0aGUgcmlnaHQgdGhpbmcuCisJICBXaXRoIG15IGNhcHR1cmUgc2V0dXAsIHRoaXMgZ2V0cyBtZSB0aGUgZm9sbG93aW5nIHNhbXBsZSBjYXBzOgorCSAgRm9yIDEwODBpIHJlc29sdXRpb246CisJICB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpWVVZMiwgd2lkdGg9KGludCkxOTIwLCBoZWlnaHQ9KGludCkxMDgwLCBwaXhlbC1hc3BlY3QtcmF0aW89KGZyYWN0aW9uKTEvMSwgaW50ZXJsYWNlLW1vZGU9KHN0cmluZylpbnRlcmxlYXZlZCwgZnJhbWVyYXRlPShmcmFjdGlvbil7IDI1LzEsIDMwLzEgfQorCSAgRm9yIDcyMHAgcmVzb2x1dGlvbjoKKwkgIHZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylZVVkyLCB3aWR0aD0oaW50KTEyODAsIGhlaWdodD0oaW50KTcyMCwgcGl4ZWwtYXNwZWN0LXJhdGlvPShmcmFjdGlvbikxLzEsIGludGVybGFjZS1tb2RlPShzdHJpbmcpcHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0oZnJhY3Rpb24peyA1MC8xLCA2MC8xIH0KKwkgIEZvciA1NzZpL3AgcmVzb2x1dGlvbiAoYm90aCBwb3NzaWJsZSBhdCB0aGUgcG9pbnQgb2YgcXVlcnkpOgorCSAgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVlVWTIsIHdpZHRoPShpbnQpNzIwLCBoZWlnaHQ9KGludCk1NzYsIHBpeGVsLWFzcGVjdC1yYXRpbz0oZnJhY3Rpb24pMS8xLCBpbnRlcmxhY2UtbW9kZT0oc3RyaW5nKXsgcHJvZ3Jlc3NpdmUsIGludGVybGVhdmVkIH0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24peyAyNS8xLCA1MC8xIH0KKwkgIFRoaXMsIGluIHR1cm4sIG1ha2VzIDU3Nmkgd29yayBjb3JyZWN0bHk7IHdpdGggdGhlIG9sZCBjb2RlLAorCSAgdGhlIGNhcHMgd291bGQgYmUgaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUgZm9yIGludGVybGFjZWQgdmlkZW8uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI2MTk0CisKKzIwMTQtMTEtMDEgMTI6MTg6MDIgKzAxMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQGRhcmtvc3BoZXJlLmZyPgorCisJKiBleHQvdnB4L2dzdHZwOHV0aWxzLmg6CisJICB2cHg6IHJlbW92ZSBjb21wYXRpYmlsaXR5IGRlZmluZXMKKwkgIFdlIGFyZSBndWFyYW50ZWVkIHRvIGhhdmUgVlBYX0lNR19GTVRfSTQyMCwgVlBYX1BMQU5FX1ksCisJICBWUFhfUExBTkVfVSBhbmQgVlBYX1BMQU5FX1YgYXMgd2UgcmVxdWlyZSBsaWJ2cHggPiAxLjEuMC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk0NzYKKworMjAxNC0xMS0wMSAxNTozMzoyMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSAgd2F2cGFjazogcmVtb3ZlIHN1cHBvcnQgZm9yIGFuY2llbnQgQVBJIHZlcnNpb24KKworMjAxNC0xMS0wMSAxMDoxNDozMSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5LmM6CisJICBydHB2cDg6IFVzZSBWUDggZW5jb2RpbmcgbmFtZQorCSAgQm90aCBGaXJlZm94IGFuZCBDaHJvbWUgdXNlcyBWUDggYXMgdGhlIGVuY29kaW5nIGluIHRoZWlyIFNEUC4KKwkgIEFkZGluZyB0aGlzIG5vdyBkZWZhY3RvIHN0YW5kYXJkIG5hbWUgcmVtb3ZlcyB0aGUgbmVlZCBmb3Igc3BlY2lhbAorCSAgY2FzZSBpbiBTRFAgcGFyc2luZyBjb2RlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNzgxMAorCisyMDE0LTExLTAxIDExOjU5OjI2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkgIHJ0cG1wMnRwYXk6IGZpeCB1cCB0ZW1wbGF0ZSBjYXBzIHNvIHdlIGNhbiBvdXRwdXQgdGhlIGRlZmF1bHQgcHQgMzMKKwkgIEFkZCBmaXhlZCBwYXlsb2FkIHR5cGUgZm9yIG1wMnQgdG8gdGVtcGxhdGUgY2FwcyBhcyB3ZWxsLCBzbworCSAgb3VyIG91dHB1dCBjYXBzIG1hdGNoIHRoZSBhZHZlcnRpc2VkIGRlZmF1bHQgcHQuIEZpeGVzIGEKKwkgIHJlZ3Jlc3Npb24gZnJvbSAxLjIuCisJICBUaGVyZSdzIHN0aWxsIHNvbWV0aGluZyB3cm9uZyB3aXRoIGNhcHMgbmVnb3RpYXRpb24gdGhvdWdoLAorCSAgcnRwbXAydHBheSBwYXlsb2FkPTk2ICEgZmFrZXNpbmsgd2lsbCBub3Qgb3V0cHV0IGNhcHMgd2l0aAorCSAgcGF5bG9hZD05Ni4KKworMjAxNC0xMC0zMCAxNTozNzozNiAtMDcwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1w6kgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IG1pa2V5IHJlbGF0ZWQgbWVtb3J5IGxlYWtzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM5NDMwCisKKzIwMTQtMDYtMTAgMTA6MDQ6MDcgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5oOgorCSAgc3BlZXhlbmM6IHVwZGF0ZSBvdXRwdXQgc2VnbWVudCBzdG9wIHRpbWUgdG8gbWF0Y2ggY2xpcHBlZCBzYW1wbGVzCisJICBUaGlzIHdpbGwgbGV0IG9nZ211eCBnZW5lcmF0ZSBhIGdyYW5wb3Mgb24gdGhlIGxhc3QgcGFnZSB0aGF0IHByb3Blcmx5CisJICByZXByZXNlbnRzIHRoZSBjbGlwcGVkIHNhbXBsZXMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLgorCisyMDE0LTA2LTEwIDEwOjU5OjEzICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5oOgorCSAgZmxhY2VuYzogdXBkYXRlIG91dHB1dCBzZWdtZW50IHN0b3AgdGltZSB0byBtYXRjaCBjbGlwcGVkIHNhbXBsZXMKKwkgIFRoaXMgd2lsbCBsZXQgb2dnbXV4IGdlbmVyYXRlIGEgZ3JhbnBvcyBvbiB0aGUgbGFzdCBwYWdlIHRoYXQgcHJvcGVybHkKKwkgIHJlcHJlc2VudHMgdGhlIGNsaXBwZWQgc2FtcGxlcyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCisKKzIwMTQtMTAtMDcgMTU6Mjk6MzMgKzAyMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQHBhcnJvdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogY2xlYW5seSBoYW5kbGUgc3RyZWFtb24gZmFpbHVyZSBmb3Igb3V0cHV0IGRldmljZQorCSAgT24gc3RyZWFtb24gZmFpbHVyZSwgdGhlIHF1ZXVlZCBidWZmZXIgaXMgbm90IHJlbGVhc2VkIGZyb20gdGhlCisJICBidWZmZXJwb29sIGNsYXNzIHBvaW50IG9mIHZpZXcgYmVjYXVzZSBpdCBpcyBxdWV1ZWQgdG8gdGhlIGRyaXZlciBhbmQKKwkgIHRoZSBmbHVzaCBsb2dpYyBpcyBub3QgcGVyZm9ybWVkIHNpbmNlIHdlIGFyZSBub3QgaW4gc3RyZWFtaW5nIHN0YXRlLgorCSAgSXQgY2F1c2VzIHRoZSB2NGwyIGJ1ZmZlcnBvb2wgdG8gYWx3YXlzIHJldHVybiB0aGF0IHN0b3AgbWV0aG9kIGZhaWxlZAorCSAgYW5kIHRvIGxlYWsgdjRsMiBvYmplY3RzIGFuZCBidWZmZXJzLgorCSAgVGhpcyBjb21taXQgc29sdmUgdGhpcyBieSBwZXJmb3JtaW5nIHRoZSBmbHVzaCBsb2dpYyBpbiBlcnJvciBjYXNlLCBpZQorCSAgZmx1c2hpbmcgdGhlIGFsbG9jYXRvciBhbmQgcmVzdG9yaW5nIHF1ZXVlZCBidWZmZXIgc3RhdGUgdG8gbm9uLXF1ZXVlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzgxMDIKKworMjAxNC0xMC0wOCAxMDozMToyMSArMDIwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBpbXBsZW1lbnQgZGlzcG9zZSBtZXRob2QKKwkgIFVucmVmIG9iamVjdHMgaW4gZGlzcG9zZSBtZXRob2QgcmF0aGVyIHRoYW4gaW4gZmluYWxpemUgaW4gb3JkZXIgdG8KKwkgIHByZXZlbnQgY2lyY3VsYXIgcmVmZXJlbmNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczODEwMgorCisyMDE0LTEwLTA4IDEwOjM1OjE0ICswMjAwICBBdXLDqWxpZW4gWmFuZWxsaSA8YXVyZWxpZW4uemFuZWxsaUBwYXJyb3QuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IGNoZWNrIHRoYXQgYWxsb2NhdG9yIGlzIG5vbiBudWxsIHdoZW4gc3RvcHBpbmcgcG9vbAorCSAgT3RoZXJ3aXNlLCB3ZSBjb3VsZCBkZXJlZmVyZW5jZSBOVUxMIGFsbG9jYXRvciB3aGVuIHRoZSBzdG9wIG1ldGhvZCBpcworCSAgY2FsbGVkIGJ5IHRoZSBHc3RCdWZmZXJQb29sJ3MgZmluYWxpemUgbWV0aG9kLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczODEwMgorCisyMDE0LTEwLTA5IDEyOjE1OjA1IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJICB2NGwyc2luazogSW1wbGVtZW50IHVubG9jay91bmxvY2tfc3RvcAorCSAgVGhpcyB3aWxsIHByZXZlbnQgZGVhZGxvY2tzLCBidXQgd2lsbCBhbHNvIHByb3Blcmx5IGZsdXNoIHRoZSBwb29sIGFuZCBhbGxvY2F0b3IKKwkgIHdoZW4gZ29pbmcgdG8gUkVBRFkgc3RhdGUuIEl0IHNob3VsZCBhbHNvIGZpeCBpc3N1ZXMgcmVwb3J0ZWQgb24gbWFpbGluZyBsaXN0CisJICB3aGVuIHNlZWtpbmcgaXMgcGVyZm9ybWVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczODE1MgorCisyMDE0LTEwLTI4IDIxOjMyOjA2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvcHVsc2UvcHVsc2VkZXZpY2Vwcm92aWRlci5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMmRldmljZXByb3ZpZGVyLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuaDoKKwkgIHB1bHNlLCB2NGwyOiBhZGQgbWlzc2luZyBHX0VORF9ERUNMUyBpbiBzb21lIHBsYWNlcworCisyMDE0LTEwLTI3IDE3OjU3OjIwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gODRkMDZjZCB0byA3YmIyYmNlCisKKzIwMTQtMTAtMjcgMTE6MDg6MjAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogRml4IHVuaXQgdGVzdCBub3cgdGhhdCB3ZSBhbHdheXMgaGF2ZSBwcm9maWxlL2xldmVsIGluIHRoZSBjYXBzCisKKzIwMTQtMTAtMjYgMTQ6NTU6NDkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIE1ha2VmaWxlLmFtOgorCSAgUGFyYWxsZWxpc2UgJ21ha2UgY2hlY2stdmFsZ3JpbmQnCisJICBTb21lIG9mIHRoZSBSVFAgdW5pdCB0ZXN0cyBhcmUgdmVyeSBmbGFreSBhbmQgd2lsbAorCSAgZmFpbCBtb3JlIG9mdGVuIHdpdGggdGhlIENQVSBtYXhlZCBvdXQgZnVsbHkuIFRob3NlCisJICB0ZXN0cyBuZWVkIHRvIGJlIGZpeGVkIGluIGFueSBjYXNlIHRob3VnaCwgdGhleSBhbHNvCisJICBmYWlsIG9uIHNsb3dlciBtYWNoaW5lcyBhbmQgYWxzbyBvY2Nhc2lvbmFsbHkgd2l0aAorCSAgbm9ybWFsICdtYWtlIGNoZWNrJy4KKworMjAxNC0xMC0yNiAxMTo0NzoyNSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IEFsd2F5cyBzZXQgcHJvZmlsZS9sZXZlbCBvbiB0aGUgY2FwcworCSAgV2UgaGF2ZSB0aGUgaW5mb3JtYXRpb24gYWxyZWFkeSwgc28gd2h5IG5vdCB1c2UgaXQ/CisKKzIwMTQtMTAtMjUgMTI6MzY6MDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBmaXggY3Jhc2ggb24gc29tZSAzMi1iaXQgc3lzdGVtcworCSAgTWFrZSBzdXJlIHRvIHBhc3MgcmlnaHQgbnVtYmVyIG9mIGJpdHMgdG8gZ3N0X3N0cnVjdHVyZV9uZXcoKQorCSAgd2hpY2ggaXMgYSB2YXJhcmcgZnVuY3Rpb24uCisJICBGaXhlcyBlbGVtZW50cy9ydHBhdXggdW5pdCB0ZXN0IG9uIHBwYzMyLgorCisyMDE0LTEwLTI1IDAwOjU2OjAyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ3ZvbHVtZS5jOgorCSAgdGVzdHM6IGZpeCByZ3ZvbHVtZSB0ZXN0IG9uIGJpZy1lbmRpYW4gc3lzdGVtcworCisyMDE0LTEwLTI1IDAwOjUzOjM5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bGF3ZGVjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWxhd2VuYy5jOgorCSAgdGVzdHM6IGZpeCBtdWxhd2RlYy9tdWxhd2VuYyB0ZXN0IGZvciBiaWcgZW5kaWFuIHN5c3RlbXMKKworMjAxNC0xMC0yNCAyMzo0ODozMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSAgaW50ZXJsZWF2ZTogaW50ZXJzZWN0IHJlc3VsdCB3aXRoIGZpbHRlciBjYXBzIGluIGNhcHMgcXVlcnkKKwkgIEZpeGVzIGNyYXNoIGluIGF1ZGlvdGVzdHNyYyBiZWNhdXNlIG9mIGFuIHVuc3VwcG9ydGVkIGZvcm1hdAorCSAgZ2V0dGluZyBuZWdvdGlhdGVkIG9uIGJpZy1lbmRpYW4gc3lzdGVtcyB3aXRoCisJICBhdWRpb3Rlc3RzcmMgISBpbnRlcmxlYXZlICEgYXVkaW9jb252ZXJ0ICEgd2F2ZW5jCisKKzIwMTQtMTAtMjMgMTU6NDY6MTMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWRldmljZXByb3ZpZGVyLmM6CisJKiBleHQvcHVsc2UvcHVsc2VkZXZpY2Vwcm92aWRlci5oOgorCSAgcHVsc2U6IHJlbW92ZSBzb21lIHVudXNlZCB0eXBlZGVmcworCisyMDE0LTEwLTIyIDE1OjI4OjQ0ICswMjAwICBBbmFuZGEgPGFuYW5kYUBsYXRlbGllcjIzLmNvbT4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkgIHNwZWV4OiBGaXggc2VnZmF1bHQgd2hlbiByZXNldHRpbmcgdGhlIGNvZGVjcyBtdWx0aXBsZSB0aW1lcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczODc5MworCisyMDE0LTEwLTIyIDIyOjUwOjU0ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuQGFjY29zdGVkLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBUZW1wb3JhcmlseSBkaXNhYmxlIHN0cmVhbSBzdGF0dXMgcG9zdGluZworCSAgV2UgbmVlZCBhIG1lY2hhbmlzbSBpbiBQdWxzZUF1ZGlvIHRvIGFsbG93IHJ1bm5pbmcgY29kZSBvdXRzaWRlIHRoZQorCSAgbWFpbmxvb3AgbG9jay4gVGhlbiB3ZSdkIGJlIGFibGUgdG8gcG9zdCB0byB0aGUgYnVzICh0YWtpbmcgdGhlCisJICBHU1RfT0JKRUNUX0xPQ0spLCB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGxvY2tpbmcgb3JkZXIgd2l0aCB0aGUgbWFpbmxvb3AKKwkgIGxvY2ssIHdoaWNoIGlzIHRoZSBjdXJyZW50IGNhdXNlIG9mIGRlYWRsb2NrcyB3aGlsZSB0cnlpbmcgdG8gcG9zdCB0aGUKKwkgIHN0cmVhbSBzdGF0dXMgbWVzc2FnZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2MDcxCisKKzIwMTQtMTAtMjIgMTU6MDQ6MjQgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogbGltaXQgdGhlIHJldHJ5IGZyZXF1ZW5jeQorCSAgV2hlbiB0aGUgUlRUIGFuZCBqaXR0ZXIgYXJlIHZlcnkgbG93IChzdWNoIGFzIG9uIGEgbG9jYWwgbmV0d29yayksIHRoZQorCSAgY2FsY3VsYXRlZCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0IGlzIHZlcnkgc21hbGwuIFNldCBzb21lIHNlbnNpYmxlIGxvd2VyCisJICBib3VuZGFyeSB0byB0aGUgdGltZW91dCBieSBhZGRpbmcgYSBuZXcgcHJvcGVydHkuIFdlIHVzZSB0aGUgcGFja2V0CisJICBzcGFjaW5nIGFzIGEgbG93ZXIgYm91bmRhcnkgYnkgZGVmYXVsdC4KKworMjAxNC0xMC0yMiAxMzo0MDo1OCArMDIwMCAgTWlndWVsIFBhcsOtcyBEw61heiA8bXBhcmlzZGlhekBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgZ3N0cnRwaml0dGVyYnVmZmVyOiBhZGQgInJ0eC1taW4tZGVsYXkiIHByb3BlcnR5CisJICBUaGlzIHByb3BlcnR5IGlzIHVzZWZ1bCB0byBzZXQgYSBtaW4gdGltZSB0byB3YWl0IGJlZm9yZSBzZW5kaW5nIGEKKwkgIHJldHJhbnNtaXNzaW9uIGV2ZW50LgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNTM3OAorCisyMDE0LTEwLTIyIDEzOjI5OjQ4ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IFJlZmFjdG9yIGNvZGUKKwkgIFJlZmFjdG9yIHNvbWUgY29kZSBkZWFsaW5nIHdpdGggY2FsY3VsYXRpbmcgdmFyaW91cyB0aW1lb3V0cy4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1Mzc4CisKKzIwMTQtMTAtMTAgMTk6NTA6MDYgKzAyMDAgIE1pZ3VlbCBQYXLDrXMgRMOtYXogPG1wYXJpc2RpYXpAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBzZXNzaW9uOiBmaXggRWFybHkgRmVlZGJhY2sgVHJhbnNtaXNzaW9uCisJICBJbiBlYXJseSByZXRyYW5zbWlzc2lvbiB3ZSBhcmUgYWxsb3dlZCB0byBzY2hlZHVsZSAxIHJlZ3VsYXIgUlRDUCBwYWNrZXQKKwkgIGF0IGFuIGVhcmxpZXIgdGltZS4gV2hlbiB3ZSBkbyB0aGF0LCB3ZSBuZWVkIHRvIHNldCBhbGxvd19lYXJseSB0byBGQUxTRQorCSAgYW5kIGlnbm9yZS9kcm9wIChvciBtZXJnZSkgYWxsIGZ1dHVyZSByZXF1ZXN0cyBmb3IgZWFybHkgdHJhbnNtaXNzaW9uLgorCSAgV2Ugbm93IGZpcnN0IGNoZWNrIGlmIHdlIGNhbiBzY2hlZHVsZSBhbiBlYXJseSBSVENQIGFuZCBpZiB3ZSBjYW4sCisJICBhY3R1YWxseSBwcmVwYXJlIHRoZSBkYXRhIGZvciB0aGUgbmV4dCBSVENQIGludGVydmFsLgorCSAgQWZ0ZXIgd2Ugc2VuZCB0aGUgbmV4dCByZWd1bGFyIFJUQ1AgYWZ0ZXIgdGhlIGVhcmx5IFJUQ1AsIHdlIHNldAorCSAgYWxsb3dfZWFybHkgdG8gVFJVRSBhZ2FpbiB0byBhbGxvdyBtb3JlIGVhcmx5IHJlcXVlc3RzLgorCSAgUmVtb3ZlIHRoZSBjb25kaXRpb24gZm9yIHRoZSBpbW1lZGlhdGUgZmVlZGJhY2sgZm9yIG5vdy4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzgzMTkKKworMjAxNC0xMC0yMSAxMzowMTozMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGE4Yzg5MzkgdG8gODRkMDZjZAorCisyMDE0LTEwLTIxIDEzOjEwOjI0ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IG1ha2UgZGVidWcgbGluZSBsZXNzIGNvbmZ1c2luZworCisyMDE0LTEwLTIxIDEyOjU4OjEzICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBSRUFETUU6CisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMzYzODhhMSB0byBhOGM4OTM5CisKKzIwMTQtMDctMDIgMTc6NTA6MzUgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgaml0dGVyYnVmZmVyOiByZXdvcmsgcmVzeW5jIGhhbmRsaW5nCisJICBBZGQgYSBuZWVkLXJlc3luYyBzdGF0ZSwgdGhpcyBpcyB3aGVuIHdlIG5lZWQgdG8gdHJ5IHRvIGxvY2sgb24gdG8gYQorCSAgdGltZS9SVFB0aW1lIHBhaXIuCisJICBBbHdheXMgY2hlY2sgdGhlIFJUUCB0aW1lc3RhbXBzIGFuZCBpZiB0aGV5IGdvIGJhY2t3YXJkcywgbWFyayBvdXJzZWx2ZXMKKwkgIGFzIG5lZWQtcmVzeW5jLgorCSAgT25seSByZXN5bmMgd2hlbiBuZWVkLXJlc3luYyBpcyBUUlVFIGFuZCB3ZSBoYXZlIGEgdmFsaWQgdGltZS4gT3RoZXJ3aXNlCisJICB3ZSBrZWVwIHRoZSBvbGQgdmFsdWVzLiBUaGlzIGF2b2lkcyBsb2NraW5nIG9uIHRvIGFuIGludmFsaWQgdGltZSBhbmQKKwkgIGNhdXNpbmcgdXMgdG8gdGltZXN0YW1wIGV2ZXJ5dGhpbmcgd2l0aCAtMS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzA0MTcKKworMjAxNC0xMC0wMyAxNzoyODowNiAtMDcwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1w6kgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHNldCBmdWxsIHN0cmVhbSBjYXBzIG9uIGludGVybmFsIHNyYyBUQ1AgcGFkcworCSAgU2V0IHRoZSBjb21wbGV0ZSBzdHJlYW0gY2FwcyBvbiB0aGUgVENQIGludGVybmFsIHNyYyBwYWRzLiBPdGhlcndpc2UsCisJICBwdGRlbXV4IHdpbGwgbm90IHByb3Blcmx5IGRldGVjdCB0aGUgY2FwcyBjaGFuZ2UuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3ODY4CisKKzIwMTQtMTAtMTcgMjI6MjM6MjcgKzAyMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBtdXguYzoKKwkgIHJ0cG11eDogRG9uJ3Qgc2V0IFBST1hZX0NBUFMgZmxhZyBvbiB0aGUgc3JjIHBhZAorCSAgcnRwbXV4IGJlaGF2ZXMgbGlrZSBhIGZ1bm5lbCBpbiB0aGF0IGl0IGZvcndhcmRzIHdoYXRldmVyIHVwc3RyZWFtIGlzCisJICBzZW5kaW5nIGJ1ZmZlcnMuIFNvIHNldHRpbmcgcHJveHkgY2FwcyBkb2Vzbid0IG1ha2Ugc2Vuc2UgYXMgdGhlCisJICB1cHN0cmVhbSBkb24ndCBoYXZlIHRvIGhhdmUgY29tcGF0aWJsZSBjYXBzLCB0aHVzIHJlc3VsdGluZyBpbiBhbiBlbXB0eQorCSAgY2FwcyBzZXQgYXMgYSByZXN1bHQgb2YgYSBjYXBzIHF1ZXJ5LiBJbnN0ZWFkIHNldCBmaXhlZCBjYXBzIGp1c3QKKwkgIGFzIGZ1bm5lbCBkb2VzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczODcyMgorCisyMDE0LTEwLTIwIDExOjU3OjM4ICswNTMwICBWaW5lZXRoIFQgTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogY3JpdGljYWwgZXJyb3Igd2hlbiBlbGVtZW50IHByb3BlcnRpZXMgc2V0IGFzIG1heC9taW4KKwkgIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSBjYW4gYmUgc2V0IGZyb20gcmFuZ2Ugb2YgLTIxNDc0ODM2NDggdG8gMjE0NzQ4MzY0NworCSAgd2hlbiBpIGxhdW5jaCB0aGUgdmlkZW9ib3ggZWxlbWVudCB3aXRoIHRoYXQgdmFsdWVzLCBpdCBnaXZlcyBhIGNyaXRpY2FsIGVycm9yCisJICAoZ3N0LWNoZWNrLTEuMDoyOTg2OSk6IEdTdHJlYW1lci1DUklUSUNBTCAqKjogZ3N0X3ZhbHVlX3NldF9pbnRfcmFuZ2Vfc3RlcDogYXNzZXJ0aW9uICdzdGFydCA8IGVuZCcgZmFpbGVkCisJICBUaGlzIGhhcHBlbnMgYmVjYXVzZSBtaW4gY2Fubm90IGJlIGVxdWFsIHRvIG1heC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzg4MzgKKworMjAxNC0xMC0xNSAxNzo0NToyNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1cGF5Lmg6CisJICBSZXZlcnQgInJ0cDogYWRkIGgyNjUgUlRQIHBheWxvYWRlciArIGRlcGF5bG9hZGVyIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCBkMDZiYTkwNTFmOTA0YTdlYjQ4MmMwN2E5N2ExODI3MTY5MTU4NjYzLgorCSAgVGhpcyBicmVha3MgdGhlIGJ1aWxkLCBhcyBpdCBkZXBlbmRzIG9uIHBhcnNlciBBUEkgaW4gLWJhZC4KKworMjAxNC0xMC0xNSAxNzozNDo1MCArMDIwMCAgSnVyZ2VuIFNsb3dhY2sgPGp1cmdlbi5zbG93YWNrQGJhcmNvLmNvbT4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjVkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY1cGF5Lmg6CisJICBydHA6IGFkZCBoMjY1IFJUUCBwYXlsb2FkZXIgKyBkZXBheWxvYWRlcgorCisyMDE0LTEwLTA1IDIxOjI0OjI3ICswMjAwICBQZXRlciBHLiBCYXVtIDxwZXRlckBkci1iYXVtLm5ldD4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmg6CisJICB3YXZlbmM6IFN1cHBvcnQgUkY2NCBmb3JtYXQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjUxNDUKKworMjAxNC0xMC0xMSAxMToxODo0MiArMTEwMCAgRGF2aWQgU2Fuc29tZSA8bWVAZGF2aWRzYW5zb21lLmNvbT4KKworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIGVxdWFsaXplcjogRG9uJ3QgY2FsbCBpaXJlcXVhbGl6ZXIncyB0cmFuc2Zvcm1faXAgaW4gcGFzc3Rocm91Z2ggbW9kZQorCSAgSXQgdHJpZXMgdG8gbWFwIHRoZSByZWFkLW9ubHkgYnVmZmVyIHdpdGggR1NUX01BUF9SRUFEV1JJVEUgYW5kIGNyYXNoZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3ODg2CisKKzIwMTQtMTAtMTAgMTg6MzA6MDcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQG9jcmV0ZS5jYT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIHJ0cHNvdXJjZTogUmVuYW1lIHNlcW51bS1iYXNlIHRvIHNlcW51bS1vZmZzZXQgaW4gY2FwcworCSAgVGhpcyB3YXMgbW9kaWZpZWQgYmFjayBpbiAxLjAgaW4gR3N0UnRwQmFzZVBheWxvYWQKKworMjAxNC0xMC0xMCAxODoxMToxOSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAb2NyZXRlLmNhPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kdG1mLmM6CisJICBydHBkdG1mc3JjOiBjbG9jay1iYXNlIGFuZCBzZXFudW0tYmFzZSAtPiB0aW1lc3RhbXAtb2Zmc2V0IGFuZCBzZXFudW0tb2Zmc2V0CisJICBUaGVzZSB3ZXJlIHJlbmFtZWQgaW4gR3N0UlRQQmFzZVBheWxvYWQgaW4gMS4wCisKKzIwMTQtMTAtMTAgMTc6MzA6MjQgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQG9jcmV0ZS5jYT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cG11eC5jOgorCSAgcnRwbXV4OiBjbG9jay1iYXNlIGFuZCBzZXFudW0tYmFzZSAtPiB0aW1lc3RhbXAtb2Zmc2V0IGFuZCBzZXFudW0tb2Zmc2V0CisJICBUaGVzZSB3ZXJlIHJlbmFtZWQgaW4gR3N0UlRQQmFzZVBheWxvYWQgaW4gMS4wCisKKzIwMTQtMTAtMDYgMTQ6MjM6MjIgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuYmdAc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9nb29tMmsxL2ZpbHRlcnMuYzoKKwkgIGdvb20yazE6IHJlbW92aW5nIGJsb2NrIG9mIGNvZGUgdGhhdCBkb2VzIG5vdGhpbmcKKwkgIFRoZSBsb29wIGluIHpvb21GaWx0ZXJTZXRSZXNvbHV0aW9uIGlzIG1lYW50IHRvIGNoYW5nZSB0aGUgdmFsdWVzIGluIHRoZQorCSAgemYtPmZpcmVkZWNbXSBhcnJheS4gRWFjaCBpdGVyYXRpb24gd3JpdGVzIHRoZSB2YWx1ZSBvZiBkZWNjIG9udG8gdGhlIGFycnlhLAorCSAgYnV0IG5vIGNvbmRpdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGRlY2MgYXJlIGV2ZXIgbWV0IGFuZCB0aGUgYXJyYXkgaXMKKwkgIGZpbGxlZCB3aXRoIHplcm8gZm9yIGVhY2ggZWxlbWVudC4gV2hpY2ggaXMgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlCisJICBhcnJheSBiZWZvcmUgdGhlIGxvb3AgYmVnaW5zLgorCSAgVGhlIGxvb3AgZG9lcyBub3RoaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyODM1MworCisyMDE0LTEwLTA0IDE3OjE3OjEzICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogZG9uJ3QgbG9nIGFsbCBjbG9ja19yYXRlIGNoYW5nZXMgYXMgd2FybmluZ3MuCisJICBXZSBuZXZlciBpbml0aWFsaXplIGNsb2NrX3JhdGUgZXhwbGljaXRseSwgdGhlcmVmb3JlIGl0IGlzIDAgYnkgZGVmYXVsdC4gVGhlCisJICBwYXJhbWV0ZXIgaXMgYSB1aW50MzIgYW5kIHRoZSBvbmx5IGNhbGxlciBlbnN1cmUgdGhhdCBpdCBpcyA+MCwgdGhlcmVmb3JlIGl0CisJICB3b24ndCBiZWNvbWUgLTEgZXZlci4KKworMjAxNC0xMC0wMiAxNDoyNjowOCArMDUzMCAgTmlyYmhlZWsgQ2hhdWhhbiA8bmlyYmhlZWtAY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkgIHNvdXBodHRwY2xpZW50c2luazogRml4IGxpZmV0aW1lIG9mIHN0cmVhbSBoZWFkZXJzIGFuZCBxdWV1ZWQgYnVmZmVycworCSAgU3RyZWFtIGhlYWRlcnMgYXJlIHVwZGF0ZWQgd2hlbmV2ZXIgOjpzZXRfY2FwcyBpcyBjYWxsZWQsIHNvIHdlIGNhbid0IGFzc3VtZQorCSAgdGhleSdsbCBiZSB2YWxpZCBiZWZvcmUgdGhlIG1lc3NhZ2UgYm9keSBpcyB3cml0dGVuIG91dC4gV2UgKmNhbiogYXNzdW1lIHRoYXQKKwkgIGZvciBxdWV1ZWQgYnVmZmVycywgYnV0IFNPVVBfTUVNT1JZX1NUQVRJQyBpcyBzdGlsbCB3cm9uZyBmb3IgdGhvc2UuCisJICBBbHNvLCBhZGQgc29tZSBkZWJ1ZyBsb2dnaW5nIGZvciBzdHJlYW0gaGVhZGVyIGludGVyYWN0aW9ucy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzc3NzEKKworMjAxNC0xMC0wMiAwMzoyNjoyMiArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IGZpeCBtZW1vcnkgbGVhayB3aGVuIHByZXBlbmRpbmcgQURUUyBoZWFkZXJzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3NzYxCisKKzIwMTQtMDktMjMgMTA6NDg6MDkgKzAyMDAgIEFudG9uaW8gT3NwaXRlIDxhbzJAYW8yLml0PgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmg6CisJICBpbnRlcmxlYXZlOiBpbnRlcmxlYXZlIHNhbXBsZXMgZm9sbG93aW5nIHRoZSBEZWZhdWx0IENoYW5uZWwgT3JkZXJpbmcKKwkgIEluIG9yZGVyIHRvIGhhdmUgYSBmdWxsIG1hcHBpbmcgYmV0d2VlbiBjaGFubmVsIHBvc2l0aW9ucyBpbiB0aGUgYXVkaW8KKwkgIHN0cmVhbSBhbmQgbG91ZHNwZWFrZXIgcG9zaXRpb25zLCB0aGUgY2hhbm5lbC1tYXNrIGFsb25lIGlzIG5vdCBlbm91Z2g6CisJICB0aGUgY2hhbm5lbHMgbXVzdCBiZSBpbnRlcmxlYXZlZCBmb2xsb3dpbmcgc29tZSBEZWZhdWx0IENoYW5uZWwgT3JkZXJpbmcKKwkgIGFzIG1lbnRpb25lZCBpbiB0aGUgV0FWRUZPUk1BVEVYVEVOU0lCTEVbMV0gc3BlY2lmaWNhdGlvbi4KKwkgIEFzIGEgRGVmYXVsdCBDaGFubmVsIE9yZGVyaW5nIHVzZSB0aGUgb25lIGltcGxpZWQgYnkKKwkgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHdoaWNoIGZvbGxvd3MgdGhlIG9yZGVyaW5nIGRlZmluZWQgaW4gU01QVEUKKwkgIDIwMzYtMi0yMDA4WzJdLgorCSAgTk9URSB0aGF0IHRoZSByZWxhdGl2ZSBvcmRlciBpbiB0aGUgVG9wIExheWVyIGlzIG5vdCBleGFjdGx5IHRoZSBzYW1lIGFzCisJICB0aGUgb25lIGZyb20gdGhlIFdBVkVGT1JNQVRFWFRFTlNJQkxFWzFdIHNwZWNpZmljYXRpb247IGxldCdzIGhvcGUgdXNlcnMKKwkgIHVzaW5nIHNvIG1heSBjaGFubmVscyBhcmUgYWxyZWFkeSBhd2FyZSBvZiBzdWNoIGRpc2NyZXBhbmNpZXMuCisJICBbMV0gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvaGFyZHdhcmUvZG42NTMzMDglMjh2PXZzLjg1JTI5LmFzcHgKKwkgIFsyXSBodHRwOi8vd3d3Lml0dS5pbnQvZG1zX3B1Yi9pdHUtci9vcGIvcmVwL1ItUkVQLUJTLjIxNTktMi0yMDExLVBERi1FLnBkZgorCSAgRml4ZXM6IGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzcxMjcKKworMjAxNC0xMC0wMiAxMDoxMDoxMSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkgIHdhdmVuYzogU2VuZCBDQVBTIGV2ZW50IGFmdGVyIHRoZSBwYWQgd2FzIGFjdGl2YXRlZAorCSAgT3RoZXJ3aXNlIHRoZSBDQVBTIGV2ZW50IHdpbGwgYmUgZHJvcHBlZCBhbmQgd2UgbmV2ZXIgY29uZmlndXJlIGFueSBjYXBzIGF0CisJICBhbGwsIGxlYWRpbmcgdG8gd2VpcmQgYmVoYXZpb3VyIGluIG1hbnkgc2l0dWF0aW9ucy4gRXNwZWNpYWxseSBoZWFkZXIKKwkgIHJld3JpdGluZyBpcyBub3QgZ29pbmcgdG8gd29yayBpZiBhIGNhcHNmaWx0ZXIgaXMgYWZ0ZXIgd2F2ZW5jLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNzczNQorCisyMDE0LTEwLTAxIDIzOjEyOjMwICswNTMwICBOaXJiaGVlayBDaGF1aGFuIDxuaXJiaGVla0BjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5jOgorCSAgc291cGh0dHBjbGllbnRzaW5rOiBBZGQgc29tZSBtb3JlIHVzZWZ1bCBkZWJ1ZyBsb2dnaW5nCisKKzIwMTQtMTAtMDEgMjM6MDU6MDMgKzA1MzAgIE5pcmJoZWVrIENoYXVoYW4gPG5pcmJoZWVrQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJICBzb3VwaHR0cGNsaWVudHNpbms6IEZyZWUgcXVldWVkIGJ1ZmZlcnMgaW4gOjpyZXNldAorCSAgOjpyZW5kZXIgc2V0cyBhIG5ldyBjYWxsYmFjayBmb3Igd3JpdGluZyBvdXQgbmV3IGJ1ZmZlcnMgb25seSBpZiB0aGVyZSBhcmVuJ3QKKwkgIGFscmVhZHkgYnVmZmVycyBxdWV1ZWQgZm9yIHdyaXRpbmcgd2l0aCBhIHByZXZpb3VzbHktc2NoZWR1bGVkIGNhbGxiYWNrLgorCSAgSG93ZXZlciwgaWYgdGhlIHByZXZpb3VzbHktc2NoZWR1bGVkIGNhbGxiYWNrIGlzIGludGVycnVwdGVkIGJ5IGEgc3RhdGUgY2hhbmdlCisJICAoZWl0aGVyIG1hbnVhbGx5IG9yIGR1ZSB0byBhbiBlcnJvcikgYW5kIHRoZXJlIGFyZSBzdGlsbCBidWZmZXJzIGluIHRoZSBxdWV1ZSwKKwkgIHJlc3RhcnRpbmcgdGhlIHBpcGVsaW5lIHdpbGwgcmVzdWx0IGluIGJ1ZmZlcnMgYmVpbmcgcXVldWVkIGZvcmV2ZXIsIGFuZCBubworCSAgY2FsbGJhY2tzIHdpbGwgZXZlciBiZSBzY2hlZHVsZWQsIGFuZCBubyBidWZmZXJzIHdpbGwgYmUgd3JpdHRlbiBvdXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3NzM5CisKKzIwMTQtMTAtMDEgMTc6Mjk6MjkgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBBY3R1YWxseSB1c2UgdGhlIGNvcnJlY3QgR3N0VmlkZW9JbmZvIGZvciBjb252ZXJzaW9uCisKKzIwMTQtMTAtMDEgMTc6MjQ6NTkgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBSZXZlcnQgdGhlIGxhc3QgY29tbWl0IGFuZCBoYW5kbGUgcmVzb2x1dGlvbnMgZGlmZmVyZW5jZXMgcHJvcGVybHkKKwkgIFRoaXMgaXMgYWJvdXQgY29udmVydGluZyB0aGUgZm9ybWF0LCBub3QgYWJvdXQgY29udmVydGluZyBhbnkgd2lkdGhzIGFuZAorCSAgaGVpZ2h0cy4gU3ViY2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8gaGFuZGxlciBkaWZmZXJlbnQgcmVzb2x1dGlvbnMgdGhlbXNlbHZlcywKKwkgIGxpa2UgdGhlIHZpZGVvbWl4ZXJzIGFscmVhZHkgZG8gcHJvcGVybHkuCisKKzIwMTQtMTAtMDEgMTc6MTI6NTkgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBHc3RWaWRlb0NvbnZlcnRlciBjdXJyZW50bHkgY2FuJ3QgcmVzY2FsZSBhbmQgd2lsbCBhc3NlcnQKKwkgIExlYWRzIHRvIHVnbHkgYXNzZXJ0aW9ucyBpbnN0ZWFkIG9mIHByb3Blcmx5IGVycm9yaW5nIG91dDoKKwkgIENSSVRJQ0FMICoqOiBnc3RfdmlkZW9fY29udmVydGVyX25ldzogYXNzZXJ0aW9uICdpbl9pbmZvLT53aWR0aCA9PSBvdXRfaW5mby0+d2lkdGgnIGZhaWxlZAorCisyMDE0LTA5LTMwIDExOjM1OjEyICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkgIHZwOGVuYy92cDllbmM6IFByb3RlY3QgdGhlIGVuY29kZXIgd2l0aCBhIG11dGV4IGluIGFsbCBzaXR1YXRpb25zCisKKzIwMTQtMDktMzAgMTE6MzE6NDMgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC92cHgvZ3N0dnA5ZW5jLmM6CisJICB2cDllbmM6IEFsbG93IGNhcHMgcmVuZWdvdGlhdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNjMyOQorCisyMDE0LTA5LTMwIDExOjI4OjM5ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSAgdnA4ZW5jOiBmaW5pc2goKSBhbmQgZHJhaW4oKSBzaG91bGQgcmV0dXJuIGEgR3N0Rmxvd1JldHVybgorCisyMDE0LTAzLTE0IDEyOjU5OjAyICswMTAwICBKb3NlIEFudG9uaW8gU2FudG9zIENhZGVuYXMgPHNhbnRvc2NhZGVuYXNAZ21haWwuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSAgdnA4ZW5jOiBBbGxvdyBjYXBzIHJlbmVnb3RpYXRpb24KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjYzMjkKKworMjAxNC0wOS0yOSAxMTo0OTo0NSArMDIwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogc2V0IGNvbG9yc3BhY2UgZm9yIG91dHB1dCBkZXZpY2VzCisJICBXaGVuIHRoZSB2NGwyIGRldmljZSBpcyBhbiBvdXRwdXQgZGV2aWNlLCB0aGUgYXBwbGljYXRpb24gc2hhbGwgc2V0IHRoZQorCSAgY29sb3JzcGFjZS4gU28gbWFwIEdTdHJlYW1lciBjb2xvcmltZXRyeSBpbmZvIHRvIFY0TDIgY29sb3JzcGFjZSBhbmQgc2V0CisJICBvbiBzZXRfZm9ybWF0LiBJbiBjYXNlIHdlIGhhdmUgbm8gY29sb3JpbWV0cnkgaW5mb3JtYXRpb24sIHdlIHRyeSB0bworCSAgZ3Vlc3MgaXQgYWNjb3JkaW5nIHRvIHBpeGVsIGZvcm1hdCBhbmQgdmlkZW8gc2l6ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzc1NzkKKworMjAxNC0wOS0yOSAyMjo0ODoxNiArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bkBhY2Nvc3RlZC5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2U6IEFkZCBzb21lIGRvY3VtZW50YXRpb24gYWJvdXQgdGhyZWFkaW5nIGFuZCBzeW5jaHJvbmlzYXRpb24KKwkgIFRoaXMgZ2l2ZXMgYSBxdWljayBpbnRyb2R1Y3Rpb24gdG8gaG93IHRoZSBwdWxzZXNpbmsvcHVsc2VzcmMgY29kZQorCSAgaW50ZXJhY3RzIHdpdGggdGhlIHBhX3RocmVhZGVkX21haW5sb29wIHRoYXQgd2Ugc3RhcnQgdXAgdG8gY29tbXVuaWNhdGUKKwkgIHdpdGggdGhlIHNlcnZlci4KKworMjAxNC0wOS0yOSAyMDoxODowOCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bkBhY2Nvc3RlZC5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogTWFrZSBlbWl0dGluZyBzdHJlYW0gc3RhdHVzIG1lc3NhZ2VzIHN5bmNocm9ub3VzCisJICBUaGUgc3RyZWFtIHN0YXR1cyBtZXNzYWdlcyBhcmUgZW1pdHRlZCBpbiB0aGUgUEEgbWFpbmxvb3AgdGhyZWFkLCB3aGljaAorCSAgbWVhbnMgdGhlIG1haW5sb29wIGxvY2sgaXMgdGFrZW4sIGZvbGxvd2VkIGJ5IHRoZSBHc3Qgb2JqZWN0IGxvY2sgKGJ5CisJICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UoKSkuIEluIGFsbCBvdGhlciBsb2NhdGlvbnMsIHRoZSBvcmRlciBvZgorCSAgbG9ja2luZyBpcyByZXZlcnNlZCAodGhpcyBpcyB1bmF2b2lkYWJsZSBpbiBhIGJ1bmNoIG9mIGNhc2VzIHdoZXJlIHRoZQorCSAgb2JqZWN0IGxvY2sgaXMgdGFrZW4gYnkgR3N0QmFzZVNpbmsgb3IgR3N0QXVkaW9CYXNlU2luaywgYW5kIHRoZW4gd2UgZ2V0CisJICBjb250cm9sIHRvIHRha2UgdGhlIG1haW5sb29wIGxvY2spLgorCSAgVGhlIG9ubHkgd2F5IHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBkZWZlciBjYWxsYmFjayBmb3Igc3RyZWFtIHN0YXR1cworCSAgbWVzc2FnZXMgZG9lc24ndCBkZWFkbG9jayBpcyB0byBlaXRoZXIgc3RvcCBwb3N0aW5nIHRob3NlIG1lc3NhZ2VzLCBvcgorCSAgbWFrZSBzdXJlIHRoYXQgdGhlIG1lc3NhZ2UgZW1pc3Npb24gaXMgY29tcGxldGVkIGJlZm9yZSB3ZSBwcm9jZWVkIHRvCisJICBhbnkgcG9pbnQgdGhhdCBtaWdodCB0YWtlIHRoZSBvYmplY3QgbG9jayBiZWZvcmUgdGhlIG1haW5sb29wIGxvY2sKKwkgICh3aGljaCBpcyB3aGF0IHdlIGRvIGFmdGVyIHRoaXMgcGF0Y2gpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjA3MQorCisyMDE0LTA5LTE2IDEyOjEyOjQ5ICswMjAwICBBbnRvbmlvIE9zcGl0ZSA8YW8yQGFvMi5pdD4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkgIHdhdmVuYzogcHJpbnQgY2hhbm5lbCBtYXNrcyBpbiBoZXhhZGVjaW1hbAorCisyMDE0LTA5LTI3IDE2OjAxOjIxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyZGV2aWNlcHJvdmlkZXIuaDoKKwkgIHY0bDI6IHJlbW92ZSByZWR1bmRhbnQgc3RydWN0IGRlY2xhcmF0aW9uCisKKzIwMTQtMDktMjYgMTM6NDY6MTYgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IEZpeCBjb21waWxlciB3YXJuaW5ncworCSAgZ3N0cnRzcHNyYy5jOjc5Mzk6MTE6IGVycm9yOiBpbXBsaWNpdCBjb252ZXJzaW9uIGZyb20gZW51bWVyYXRpb24gdHlwZSAnR3N0U0RQUmVzdWx0JyB0byBkaWZmZXJlbnQgZW51bWVyYXRpb24gdHlwZQorCSAgJ0dzdFJUU1BSZXN1bHQnIFstV2Vycm9yLC1XZW51bS1jb252ZXJzaW9uXQorCSAgcmVzID0gZ3N0X3NkcF9tZXNzYWdlX25ldyAoJnNkcCk7CisJICB+IF5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisJICBnc3RydHNwc3JjLmM6Nzk0NDoxMTogZXJyb3I6IGltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSBlbnVtZXJhdGlvbiB0eXBlICdHc3RTRFBSZXN1bHQnIHRvIGRpZmZlcmVudCBlbnVtZXJhdGlvbiB0eXBlCisJICAnR3N0UlRTUFJlc3VsdCcgWy1XZXJyb3IsLVdlbnVtLWNvbnZlcnNpb25dCisJICByZXMgPSBnc3Rfc2RwX21lc3NhZ2VfcGFyc2VfdXJpICh1cmksIHNkcCk7CisJICB+IF5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisyMDE0LTA5LTI1IDE1OjAxOjE0ICswMjAwICBKb25hcyBIb2xtYmVyZyA8am9uYXNoZ0BheGlzLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBtYWtlIGRlbXV4ZXIgcmV1c2FibGUKKwkgIFJlbW92ZSBwYWRzIGZyb20gZmxvdyBjb21iaW5lciBhbmQgcmVzZXQgbGFzdAorCSAgZmxvdyByZXR1cm4gdG8gRkxPV19PSyBieSByZXNldHRpbmcgdGhlIGZsb3cgY29tYmluZXIuCisJICBUaGlzIHByZXZlbnRzIEZMT1dfRkxVU0hJTkcgd2hlbiB0cnlpbmcgdG8gcmUtdXNlIHRoZQorCSAgZGVtdXhlciBhZnRlciBzZXR0aW5nIGl0IGJhY2sgdG8gTlVMTC9SRUFEWSBzdGF0ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzczNTkKKworMjAxNC0wOS0yNCAxNjo0NjozNiArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvZ3N0Y21zLmM6CisJKiBnc3QvdmlkZW9taXhlci9nc3RjbXMuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvY29udmVydC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9jb252ZXJ0Lmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjJwYWQuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJvcmMtZGlzdC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy1kaXN0Lmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyb3JjLm9yYzoKKwkgIHZpZGVvbWl4ZXI6IHVzZSB2aWRlbyBsaWJyYXJ5IGNvZGUgaW5zdGVhZCBvZiBjb3B5CisKKzIwMTQtMDktMTggMTY6Mzk6MTkgKzA1MzAgIFNhbmpheSBOTSA8c2FuamF5Lm5tQHNhbXN1bmcuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IEFkZGVkIGluZGV4IGNoZWNrIGJlZm9yZSB1c2luZyB0aGUgaW5kZXgKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzY4NzgKKworMjAxNC0wOS0yMyAyMzozMzozNyArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IERvIG5vdCBpbmZlciBEVFMgb24gYnVmZmVycyBmcm9tIHNwYXJzZSBzdHJlYW1zLgorCSAgRFRTIGRlbHRhIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHNhbXBsZSBkdXJhdGlvbi4gSWYgYnVmZmVyIGhhcyBtaXNzaW5nIERUUywgd2UgdGFrZSBlaXRoZXIgc2VnbWVudCBzdGFydCBvciBwcmV2aW91cyBidWZmZXIgZW5kIHRpbWUsIHdoaWNoZXZlciBpcyBsYXRlci4KKwkgIFRoaXMgbXVzdCBvbmx5IGJlIGRvbmUgZm9yIG5vbiBzcGFyc2Ugc3RyZWFtcywgc3BhcnNlIHN0cmVhbXMgY2FuIGhhdmUgZ2FwcyBiZXR3ZWVuIGJ1ZmZlcnMgKHdoaWNoIGlzIGhhbmRsZWQgbGF0ZXIgYnkgYWRkaW5nIGV4dHJhIGVtcHR5IGJ1ZmZlciB3aXRoIGR1cmF0aW9uIHRoYXQgZmlsbHMgdGhlIGdhcCkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzcwOTUKKworMjAxNC0wOS0xOCAxNzowODozNyArMDUzMCAgU2FuamF5IE5NIDxzYW5qYXkubm1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9nb29tL2lmcy5jOgorCSAgZ29vbTogQ2xhcmlmaWVkIHByZWNlZGVuY2UgYmV0d2VlbiAlIGFuZCA/CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODg3CisKKzIwMTQtMDktMTggMTc6NTk6MzEgKzA1MzAgIFNhbmpheSBOTSA8c2FuamF5Lm5tQHNhbXN1bmcuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwOiBjbGFyaWZ5IGV4cHJlc3Npb24gc28gb3BlcmF0b3IgcHJlY2VkZW5jZSBpcyBjbGVhcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjkwMworCisyMDE0LTA5LTE4IDE2OjA0OjAzICswNTMwICBTYW5qYXkgTk0gPHNhbmpheS5ubUBzYW1zdW5nLmNvbT4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHJlY2VpdmUuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIE1pc2NlbGxhbmVvdXMgbWlub3IgY2xlYW51cHMKKwkgIEZpeCByZWR1bmRhbnQgdmFyaWFibGVzIGFuZCBhc3NpZ25tZW50cywKKwkgIGFuZCB1bnJlYWNoYWJsZSBicmVha3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODc1CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODc2CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODc5CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODgwCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODgxCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODg4CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODkwCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODkyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODkzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODk0CisKKzIwMTQtMDktMjQgMDA6MTI6MTQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IHJlbW92ZSBkdXBsaWNhdGUgYXNzaWdubWVudHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzY4OTcKKworMjAxNC0wOS0yMyAyMjo1NTo0OCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogT25seSBjYWxjdWxhdGUgd2l0aCBkdXJhdGlvbnMgIT0gLTEKKworMjAxNC0wOS0yMyAxOTowODo0OCArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGNvbGxlY3QgcGFkIGZvciBzcGFyc2Ugc3RyZWFtIHNob3VsZCBiZSBjcmVhdGVkIHdpdGggbG9jayBzZXQgdG8gZmFsc2UKKwkgIEF2b2lkcyB3YWl0aW5nIGZvciBidWZmZXJzIGZyb20gc3BhcnNlIHN0cmVhbXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzcwOTUKKworMjAxNC0wOS0yMyAxOTowNzoyNSArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGZpeCBzdWJ0aXRsZSBidWZmZXIgZHVyYXRpb24gYW5kIHN0cmlwIG51bGwgdGVybWluYXRpb24KKwkgIFN0cmlwIHRoZSBcMCBvZmYgdGhlIHN1YnRpdGxlIGFzIHdlIGFscmVhZHkga25vdyB0aGUgc2l6ZSBhbmQgYWxzbyByZW1lbWJlcgorCSAgdG8gc2V0IHRoZSBkdXJhdGlvbiBhcyBidWZmZXIgY29weWluZyBkb2Vzbid0IGRvIGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNzA5NQorCisyMDE0LTA5LTIzIDE5OjA2OjE4ICswMjAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJICBxdG11eDogbW92ZSBzdWJ0aXRsZSBsYXllciBhYm92ZSB2aWRlbyBhbmQgc2V0IGFsdGVybmF0ZSBncm91cAorCSAgbGF5ZXIgLTEgaXMgYWJvdmUgdmlkZW8sIHRoYXQgaXMgMAorCSAgQW5kIGhhdmluZyBhbGwgc3VidGl0bGVzIGluIGFsdGVybmF0ZSBncm91cCAyIG1lYW5zIHRoYXQgb25seSBvbmUKKwkgIHNob3VsZCBiZSBzZWxlY3RlZCBhdCBhIHRpbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3MDk1CisKKzIwMTQtMDktMjMgMDk6NDc6MzEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJICBjaGVjay9zb3VwOiBUZW1wb3JhcmlseSBkaXNhYmxlIEdfRU5BQkxFX0RJQUdOT1NUSUMKKwkgIFRoZSBTT1VQX1NFUlZFUl9QT1JUIHByb3BlcnR5IGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gcmVjZW50IGxpYnNvdXAKKwkgIHZlcnNpb25zLgorCisyMDE0LTA5LTIzIDA5OjQzOjA1ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSAgY2hlY2svc291cDogRGVmaW5lIG1pbmltdW0gdmVyc2lvbiByZXF1aXJlZAorCSAgVG8gYXZvaWQgZGVwcmVjYXRpb24gd2FybmluZ3MKKworMjAxNC0wOS0xOSAxOToxNDoyOCArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBIYW5kbGUgbXA0YSB3aXRob3V0IEVTRFMgYXRvbQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjk4NgorCisyMDE0LTA5LTIyIDE2OjE1OjI3ICswMjAwICBMaW51cyBTdmVuc3NvbiA8bGludXNzbkBheGlzLmNvbT4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHhpbWFnZXNyYzogRml4IGJ1aWxkIHByb2JsZW0gd2l0aG91dCBYRklYRVMKKworMjAxNC0wOS0xOSAxNDozNDoxMyArMDUzMCAgU2FuamF5IE5NIDxzYW5qYXkubm1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jOgorCSAgZHRtZjogUmVtb3ZlZCB1bnVzZWQgc3RydWN0dXJlIG1lbWJlcnMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzY4ODMKKworMjAxNC0wOS0xMSAxMzo0ODo0NCAtMDMwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9Ab3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJICBpc29tcDQ6IGZpeCB3cm9uZyBEQVIgY2FsY3VsYXRpb24gZm9yIFBBUiA8PSAxCisJICBDSUQgIzEyMjY0NTIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzYzOTYKKworMjAxNC0wOS0xOCAxNjo1OTo1MiArMDUzMCAgU2FuamF5IE5NIDxzYW5qYXkubm1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdjogUmVtb3ZlZCB1bnJlYWNoYWJsZSBicmVhayBzdGF0ZW1lbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODg0CisKKzIwMTQtMDktMTcgMTY6Mzc6MTEgKzAyMDAgIE9nbnlhbiBUb25jaGV2IDxvZ255YW5AYXhpcy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBkbyBub3QgbGVhayBlbmNzaW5rIHBhZCBpbiBlcnJvciBjYXNlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODA3CisKKzIwMTQtMDktMTcgMTY6MjM6MjEgKzAyMDAgIE9nbnlhbiBUb25jaGV2IDxvZ255YW5AYXhpcy5jb20+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkgIG11bHRpcGFydGRlbXV4OiBkbyBub3QgbGVhayBuZXcgc3RyZWFtIGV2ZW50CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2ODA1CisKKzIwMTQtMDktMTUgMDk6MDg6MTggKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuaDoKKwkgIHk0bWVuYzogcG9ydCB5NG1lbmMgdG8gdXNlIEdzdFZpZGVvRW5jb2RlciBiYXNlIGNsYXNzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1MDg1CisKKzIwMTQtMDktMTcgMTM6NTU6MTggKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9oYWwuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9yZW1vdGVpby5jOgorCSAgb3N4YXVkaW86IE9TU3RhdHVzIGlzIG5vdCBhIGZvdXJjYywgc28gZG9uJ3QgcHJpbnQgaXQgYXMgb25lLi4uCisKKzIwMTQtMDktMTYgMTQ6MjY6MDggKzAyMDAgIE9nbnlhbiBUb25jaGV2IDxvZ255YW5AYXhpcy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGRvIG5vdCBsZWFrIHVpZCBhZnRlciBwYXJzaW5nIFRPQyBldmVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjczOQorCisyMDE0LTA5LTE2IDIyOjQ3OjEzICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSAgcnRwdnJhd2RlcGF5OiBEZWNsYXJlIHNvbWUgbW9yZSByZXF1aXJlZCBjYXBzIGZpZWxkcyBpbiB0aGUgc2luayB0ZW1wbGF0ZSBjYXBzCisJICBOb3cgb25seSBtaXNzaW5nIGFyZSB3aWR0aCBhbmQgaGVpZ2h0LCB3aGljaCBhcmUgZXhwcmVzc2VkIGFzIHN0cmluZ3MKKwkgIGZvciBSVFAuLi4gc28gd2UgY2FuJ3QgcHV0IHRoZW0gaW50byB0aGUgdGVtcGxhdGUgY2Fwcy4KKworMjAxNC0wOS0xNiAxNjo0NjowNyArMDUzMCAgVmluZWV0aCBUIE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZmRlYy5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmZGVjLmg6CisJICBnZGtwaXhidWZkZWM6IG1vZGlmeSB3cm9uZyBwYWNrZXRpemVkIG1vZGUgbG9naWMKKwkgIHBhY2tldGl6ZWQgbW9kZSBpcyBiZWluZyBzZXQgd2hlbiBmcmFtZXJhdGUgaXMgYmVpbmcgc2V0CisJICB3aGljaCBpcyBub3QgY29ycmVjdC4gQ2hhbmdpbmcgdGhlIHNhbWUgYnkgY2hlY2tpbmcgdGhlCisJICBpbnB1dCBzZWdlbWVudCBmb3JtYXQuIElmIGlucHV0IHNlZ21lbnQgaXMgaW4gVElNRSBpdCBpcworCSAgUGFja2V0aXplZCwgYW5kIGlmIGl0IGlzIGluIEJZVEVTIGl0IGlzIG5vdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzYyNTIKKworMjAxNC0wOS0xNiAxMToyNjoyMiArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBhbmQgdXNlIGNvcnJlY3QgZGVjb2RlciB2YXJpYWJsZSBuYW1lCisKKzIwMTQtMDktMTYgMTE6MjU6NDIgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJICBwbmdkZWM6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKworMjAxNC0wOS0xNiAxMzoyNDoxNSArMDUzMCAgVmluZWV0aCBUIE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdnZGVjOiBtb2RpZnkgd3JvbmcgcGFja2V0aXplZCBtb2RlIGxvZ2ljCisJICBwYWNrZXRpemVkIG1vZGUgaXMgYmVpbmcgc2V0IHdoZW4gZnJhbWVyYXRlIGlzIGJlaW5nIHNldAorCSAgd2hpY2ggaXMgbm90IGNvcnJlY3QuIENoYW5naW5nIHRoZSBzYW1lIGJ5IGNoZWNraW5nIHRoZQorCSAgaW5wdXQgc2VnZW1lbnQgZm9ybWF0LiBJZiBpbnB1dCBzZWdtZW50IGlzIGluIFRJTUUgaXQgaXMKKwkgIFBhY2tldGl6ZWQsIGFuZCBpZiBpdCBpcyBpbiBCWVRFUyBpdCBpcyBub3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2MjUyCisKKzIwMTQtMDktMTYgMTM6MjM6MTYgKzA1MzAgIFZpbmVldGggVCBNIDx2aW5lZXRoLnRtQHNhbXN1bmcuY29tPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgcG5nZGVjOiBtb2RpZnkgd3JvbmcgcGFja2V0aXplZCBtb2RlIGxvZ2ljCisJICBwYWNrZXRpemVkIG1vZGUgaXMgYmVpbmcgc2V0IHdoZW4gZnJhbWVyYXRlIGlzIGJlaW5nIHNldAorCSAgd2hpY2ggaXMgbm90IGNvcnJlY3QuIENoYW5naW5nIHRoZSBzYW1lIGJ5IGNoZWNraW5nIHRoZQorCSAgaW5wdXQgc2VnZW1lbnQgZm9ybWF0LiBJZiBpbnB1dCBzZWdtZW50IGlzIGluIFRJTUUgaXQgaXMKKwkgIFBhY2tldGl6ZWQsIGFuZCBpZiBpdCBpcyBpbiBCWVRFUyBpdCBpcyBub3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM2MjUyCisKKzIwMTQtMDktMTUgMTQ6Mzk6NDEgKzAyMDAgIEFudG9uaW8gT3NwaXRlIDxhbzJAYW8yLml0PgorCisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuaDoKKwkqIHN5cy94aW1hZ2UveGltYWdldXRpbC5jOgorCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmg6CisJICB4aW1hZ2VzcmM6IFJlbW92ZSB1bnVzZWQgc2NyZWVuLW51bSBwcm9wZXJ0eQorCSAgVGhlIHNjcmVlbiBudW1iZXIgY2FuIGJlIHN0aWxsIHNwZWNpZmllZCBhcyBwYXJ0IG9mIHRoZSBkaXNwbGF5LW5hbWUKKwkgIHByb3BlcnR5IChlLmcuIGZvciBzY3JlZW4gMSBvZiBkaXNwbGF5IDAgdXNlIGRpc3BsYXktbmFtZT0iOjAuMSIpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjEyMgorCisyMDE0LTA5LTA0IDE2OjEwOjUxICswMjAwICBBbnRvbmlvIE9zcGl0ZSA8YW8yQGFvMi5pdD4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHhpbWFnZXNyYzogRHJhdyB0aGUgY3Vyc29yIG9ubHkgd2hlbiBpdCBpcyBhY3RpdmUgaW4gdGhlIGNhcHR1cmluZyByZWdpb24KKwkgIFVzZSBYUXVlcnlQb2ludGVyIHRvIGNoZWNrIHRoYXQgdGhlIHBvaW50ZXIgaXMgYWN0dWFsbHkgYWN0aXZlIGluc2lkZQorCSAgdGhlIGNhcHR1cmluZyByZWdpb24uCisJICBUaGlzIHByZXZlbnRzIGRyYXdpbmcgdGhlIGN1cnNvciB3aGVuIHRoZSBwb2ludGVyIGlzIHBhcnRpYWxseSBvdXRzaWRlCisJICBvZiB0aGUgY2FwdHVyZWQgcmVnaW9uIGJ1dCBub3QgYWN0aXZlIGluc2lkZSB0aGUgcmVnaW9uOyBpbiBwYXJ0aWN1bGFyCisJICB0aGlzIGF2b2lkcyBkcmF3aW5nIHRoZSAid2luZG93IHJlc2l6ZSIgY3Vyc29yIHNoYXBlcyB0byB0aGUgY2FwdHVyZWQKKwkgIGltYWdlIHdoZW4gdGhlIG1vdXNlIHBvaW50ZXIgY3Jvc3NlcyBhIHdpbmRvdyBib3JkZXIuCisJICBOT1RFIHRoYXQgdGhpcyBpcyBub3Qgb25seSBhbiBvcHRpbWl6YXRpb24sIHRoaXMgYWxzbyBoYXBwZW4gdG8gZml4CisJICBhIHNlcmlvdXMgcHJvYmxlbSBpbiBtdWx0aS1zY3JlZW4gc2V0dXBzLgorCSAgQmVjYXVzZSBYRml4ZXMgZ2l2ZXMgbm8gaW5mb3JtYXRpb24gb2Ygd2hhdCBzY3JlZW4gdGhlIHBvaW50ZXIgaXMgb24sCisJICB4aW1hZ2VzcmMgd2FzIGFsd2F5cyBkcmF3aW5nIHRoZSBjdXJzb3Igb24gdGhlIGNhcHR1cmVkIHNjcmVlbiBldmVuIGlmCisJICB0aGUgbW91c2UgcG9pbnRlciB3YXMgb24gYW5vdGhlciBzY3JlZW4uCisJICBGb3IgZXhhbXBsZSwgd2hlbiBjYXB0dXJpbmcgZnJvbSBzY3JlZW4gMSAoaS5lLiBkaXNwbGF5LW5hbWU9IjowLjEiKSB0aGUKKwkgIGN1cnNvciB3YXMgZHJhd24gaW4gdGhlIGNhcHR1cmVkIGltYWdlIGV2ZW4gd2hlbiB0aGUgbW91c2UgcG9pbnRlciB3YXMKKwkgIGFjdHVhbGx5IG9uIHNjcmVlbiAwLCB3aGljaCBpcyB3cm9uZyBhbmQgdmlzdWFsbHkgY29uZnVzaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MDY0NgorCisyMDE0LTA5LTA1IDExOjMzOjMxICswMjAwICBBbnRvbmlvIE9zcGl0ZSA8YW8yQGFvMi5pdD4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHhpbWFnZXNyYzogRml4IGRyYXdpbmcgdGhlIGN1cnNvciB3aGVuIGl0IGlzIG91dHNpZGUgdGhlIGNhcHR1cmluZyByZWdpb24KKwkgIFdoZW4gdGhlIGN1cnNvciBpcyBwYXJ0aWFsbHkgb3IgdG90YWxseSBvdXQgb2YgdGhlIGNhcHR1cmluZyByZWdpb24gb24KKwkgIHRoZSB0b3Agc2lkZSBvciBvbiB0aGUgbGVmdCBzaWRlLCBpdCBnZXRzIGRyYXduIGZ1bGx5IGluc2lkZSBvZiB0aGUKKwkgIHJlZ2lvbiB3aXRoIGl0cyBjb29yZGluYXRlcyByb3VuZGVkIHVwIHRvIHRoZSBsZWZ0IG9yIHRvIHRoZSB0b3AgYm9yZGVyLgorCSAgVGhpcyBpcyBpbW1lZGlhdGVseSBub3RpY2VhYmxlIHdoZW4gdXNpbmcgdGhlIHhpZCBwcm9wZXJ0eSB0byBjYXB0dXJlCisJICBhIHNwZWNpZmljIHdpbmRvdy4KKwkgIFRvIGZpeCB0aGUgaXNzdWUsIGFsbG93IG5lZ2F0aXZlIGN4IGFuZCBjeCBjb29yZGluYXRlcyB3aGVuIGNoZWNraW5nIHRoZQorCSAgYm91bmRhcmllcyBiZWZvcmUgZHJhd2luZyB0aGUgY3Vyc29yLgorCSAgTk9URSB0aGF0IHRoZSBib3VuZGFyaWVzIGNoZWNraW5nIGNhbGN1bGF0aW9ucyBzdGlsbCBhbGxvd3MgdGhlIGN1cnNvcgorCSAgdG8gYmUgZHJhd24gd2hlbiBpdCBpcyBvbmx5IHBhcnRpYWxseSBvdXRzaWRlIG9mIHRoZSBjYXB0dXJpbmcgcmVnaW9uLAorCSAgYnV0IHRoaXMgbWFrZXMgc2Vuc2UgYW5kIGdpdmVzIGEgbW9yZSBwbGVhc2luZyB2aXN1YWwgYmVoYXZpb3VyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MDY0NgorCisyMDE0LTA5LTA1IDAwOjE1OjMwICswMjAwICBBbnRvbmlvIE9zcGl0ZSA8YW8yQGFvMi5pdD4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmg6CisJICB4aW1hZ2VzcmM6IEZpeCB0aGUgZGVzdGluYXRpb24gY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnNvcgorCSAgWEZpeGVzIHByb3ZpZGVzIHRoZSBjdXJzb3IgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgd2luZG93LCB0aGlzCisJICBpcyBub3QgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gdXNpbmcgdGhlIHhpZCBwcm9wZXJ0eSB0byBjYXB0dXJlCisJICBhIHNwZWNpZmljIHdpbmRvdywgdGhlIHJlc3VsdCBpcyB0aGF0IHRoZSBjdXJzb3IgZ2V0cyBkcmF3biBhdCB0aGUgd3JvbmcKKwkgIHBvc2l0aW9uLgorCSAgSW4gb3JkZXIgdG8gZml4IHRoaXMgY29uc2lkZXIgdGhlIHdpbmRvdyBsb2NhdGlvbiB3aGVuIGNhbGN1bGF0aW5nIHRoZQorCSAgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTA2NDYKKworMjAxNC0wOS0xNSAxNDo1MToyNCArMDIwMCAgUGV0ZXIgS29yc2dhYXJkIDxwZXRlckBrb3JzZ2FhcmQuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJICB2NGwyYWxsb2NhdG9yOiBPX0NMT0VYRUMgbmVlZHMgX0dOVV9TT1VSQ0UKKwkgIFNpbWlsYXIgdG8gOTRmM2Q2ZmMgLyBieiA3MDk0MjMKKwkgIE9uIHNvbWUgc3lzdGVtcyAoRS5HLiB1Q2xpYmMgYW5kIG9sZGVyIEdsaWJjIHZlcnNpb25zKSwgT19DTE9FWEVDIGlzIG9ubHkKKwkgIGRlZmluZWQgd2hlbiBfR05VX1NPVVJDRSBpcyBzcGVjaWZpZWQsIHNvIGRvIHNvLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjY3MAorCisyMDE0LTA5LTE1IDE4OjExOjM3ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L2RlYnVndXRpbHMvZ3N0Y2Fwc3NldHRlci5jOgorCSAgY2Fwc3NldHRlcjogdXBkYXRlIHRvIDEuMCB0cmFuc2Zvcm1fY2FwcyBzZW1hdGljcworCSAgSW4gMS4wLCB3ZSBwYXNzIHRoZSBjb21wbGV0ZSBjYXBzIHRvIHRyYW5zZm9ybV9jYXBzIHRvIGFsbG93IGZvciBiZXR0ZXIKKwkgIG9wdGltaXphdGlvbnMuIE1ha2UgdGhpcyBmdW5jdGlvbiBhY3R1YWxseSB3b3JrIG9uIG5vbi1zaW1wbGUgY2FwcworCSAgaW5zdGVhZCBvZiBqdXN0IGlnbm9yaW5nIHRoZSBjb25maWd1cmVkIGZpbHRlciBjYXBzLgorCisyMDE0LTA5LTA4IDE0OjA2OjAwICswMjAwICBQZXRlciBHLiBCYXVtIDxwZXRlckBkci1iYXVtLm5ldD4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmg6CisJICB3YXZlbmM6IHVzZSBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFIGZvciBtb3JlIHRoYW4gMiBjaGFubmVscworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMzQ0NAorCisyMDE0LTA5LTEyIDE1OjA2OjUwICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBGaXggcGFyc2luZyBvZiBhZHRsIGNodW5rcworCSAgV2UgaGF2ZSB0byBza2lwIDEyIGJ5dGVzIG9mIGRhdGEgZm9yIHRoZSBjaHVuaywgYW5kIHRoZSBkYXRhIHNpemUKKwkgIHBhc3NlZCB0byB0aGUgc3ViLWNodW5rIHBhcnNpbmcgZnVuY3Rpb25zIHNob3VsZCBoYXZlIDQgYnl0ZXMgbGVzcworCSAgdGhhbiB0aGUgZGF0YSBzaXplLgorCSAgQWxzbyB3aGVuIHBhcnNpbmcgdGhlIHN1Yi1jaHVua3MsIGNoZWNrIGlmIHdlIGFjdHVhbGx5IGhhdmUgZW5vdWdoCisJICBkYXRhIHRvIHJlYWQgaW5zdGVhZCBvZiBqdXN0IGNyYXNoaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjI2NgorCisyMDE0LTA5LTEyIDEwOjU1OjIzICswNTMwICBTYW5qYXkgTk0gPHNhbmpheS5ubUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcDogaW5jbHVkZSBzdHJpbmcuaCBmb3IgbWVtY21wIGFuZCBtZW1zZXQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnLy9zaG93X2J1Zy5jZ2k/aWQ9NzM2NTI4CisKKzIwMTQtMDktMTIgMTM6MzY6MTggKzA1MzAgIEFudWogSmFpc3dhbCA8YW51ai5qYWlzd2FsQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogZG9uJ3QgYml0d2lzZSBPUiB0aGUgc2FtZSBmbGFnIHR3aWNlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy8vc2hvd19idWcuY2dpP2lkPTczNjU0MworCisyMDE0LTA5LTEyIDEwOjM1OjM2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGhhbmRsZSByZWFsIGF1ZGlvIDI4XzgKKwkgIEZpeGVzIGR1cGxpY2F0ZSBjaGVjayBmb3IgMTRfNC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnLy9zaG93X2J1Zy5jZ2k/aWQ9NzM2NTQzCisKKzIwMTQtMDktMTEgMTQ6NDY6MDkgKzA1MzAgIEFudWogSmFpc3dhbCA8YW51ai5qYWlzd2FsQHNhbXN1bmcuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIG11bHRpZmlsZXNpbms6IGRvbid0IE9SIHRoZSBzYW1lIGZsYWcgdHdpY2UKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzY0NjIKKworMjAxNC0wOS0xMSAxMjo1MjoxMSArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBJZiB0aGUgc2VydmVyIHJlcG9ydHMgIkFjY2VwdC1SYW5nZXM6IG5vbmUiIGRvbid0IHRyeSByYW5nZSByZXF1ZXN0cworCisyMDE0LTA5LTEwIDA5OjUwOjQ1ICswMjAwICBPZ255YW4gVG9uY2hldiA8b2dueWFuQGF4aXMuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMnNpbms6IFVucmVmIHBvb2wgYWZ0ZXIgdXNhZ2UKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzYzODQKKworMjAxNC0wOS0wOSAxOTowMzo1MCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IERvbid0IHJhbmsgaXQgZm9yIG5vdworCSAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIGNvbnZlcnRlciB0byBiZSBwaWNrZWQgYXV0b21hdGljYWxseSBpbiBjYXNlCisJICBzb21lb25lIGltcGxlbWVudCBkeW5hbWljIGNvbnZlcnRlciBzZWxlY3Rpb24gc3VwcG9ydC4gSSdkIGxpa2UgdGhpcworCSAgdG8gYmUgcmFua2VkIG9ubHkgZm9yIGtub3duIGRldmljZSwgYXMgaXQncyBoYXJkIHRvIGJlIHN1cmUgYSBkZXZpY2UgaXMKKwkgIGEgY29udmVydGVyIHN1aXRlZCBmb3IgZ2VuZXJhbCBwdXJwb3NlLiBSZS1uZWdvdGlhdGlvbiBpcyBhbHNvIG5lZWRlZAorCSAgYmVmb3JlIHdlIGNhbiByYW5rIGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMzYwNworCisyMDE0LTA5LTA1IDA4OjI5OjIwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSAgdjRsMjogRGV0ZWN0IGJhZCBkcml2ZXJzIHRpbWVzdGFtcHMKKwkgIEV2ZW4gdGhvdWdoIHRoZSBVVkMgZHJpdmVyIGRvIGEgZ3JlYXQgZGVhbCBvZiBlZmZvcnQgdG8gcHJldmVudCBiYWQKKwkgIHRpbWVzdGFtcCB0byBiZSBzZW50IHRvIHVzZXJzcGFjZSwgdGhlcmUgc3RpbGwgZXhpc3QgVVZDIGhhcmR3YXJlIHRoYXQKKwkgIGFyZSBzbyBidWdneSB0aGF0IHRoZSB0aW1lc3RhbXAgZW5kdXAgbmVhcmx5IHJhbmRvbS4gVGhpcyBjb2RlIGRldGVjdAorCSAgYW5kIGlnbm9yZSB0aW1lc3RhbXAgZnJvbSB0aGVzZSBkcml2ZXJzLCBtYWtpbmcgdGhlc2UgY2FtZXJhIHVzYWJsZS4KKwkgIFRoaXMgaGFzIGJlZW4gdGVzdGVkIG9uIGJvdGggaW52YWxpZCBhbmQgdmFsaWQgY2FtZXJhcywgbWFraW5nIHN1cmUgaXQKKwkgIGRvZXMgbm90IHRyaWdnZXIgZm9yIHZhbGlkIGNhbWVyYXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMyOTEwCisKKzIwMTQtMDgtMjkgMTc6MDk6MzAgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogV29ya2Fyb3VuZCBkcml2ZXIgdGhhdCBkb24ndCBzdXBwb3J0IFJFUUJVRlMoMCkKKwkgIFRoZXJlIGlzIHN0aWxsIGFyb3VuZCAxOCBkcml2ZXJzIG5vdCB5ZXQgcG9ydGVkIHRvIHZpZGVvYnVmMi4gVGhlc2UgZHJpdmVyCisJICBkb24ndCBzdXBwb3J0IGZyZWVpbmcgYnVmZmV0cnMgdGhyb3VnaCBSRVFCVUZTKDApIGhlbmNlIGZvciB0aGVzZSB0aGUKKwkgIG1lbW9yeSB0eXBlIHByb2JpbmcgZmFpbHMuIEluIG9yZGVyIHRvIGdhaW4gYmFjayBvdXIgcHJldmlvdXMgYmVoYXZpb3VyIGluCisJICBwcmVzZW5jZSBvZiB0aGVzZSwgd2UgaW1wbGVtZW50IGEgd29ya2Fyb3VuZCB0aGF0IGFzc3VtaW5nIE1NQVAgaXMKKwkgIHN1cHBvcnRlZC4gTm90ZSB0aGF0IGFuIGFsbG9jYXRvciBpcyBvbmx5IGNyZWF0ZWQgZm9yIGRldmljZSB3aXRoCisJICBTVFJFQU1JTkcgc3VwcG9ydCBpbiB0aGUgZGV2aWNlIGNhcGFiaWxpdGllcy4gSW4gc3VjaCBjYXNlIG9uZSBvZiBNTUFQLAorCSAgVVNFUlBUUiBhbmQgRE1BQlVGIGlzIHJlcXVpcmVkLiBUaG91Z2ggRE1BQlVGIGNhbWUgYWZ0ZXJ3YXJkLCBzbyBpcworCSAgbm90IGFuIG9wdGlvbiBhbmQgaW4gcHJhY3RpY2Ugbm9uZSBvZiB0aGVzZSBkcml2ZXJzIHdpbGwgb25seSBkbyBVU0VSUFRSLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNTY2MAorCSAgQWxzby1ieTogSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKworMjAxNC0wOS0wNCAxNToxMTo0MCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDI6IE1lcmdlIG1pbl9idWZmZXJzX2ZvciogdmFyaWFibGUgaW50byBvbmUKKwkgIFJldXNlIHRoZSBzYW1lIG1pbl9idWZmZXJzIHZhcmlhYmxlIGZvciBib3RoIGNhcHR1cmUgYW5kIG91dHB1dCwgdGhpcworCSAgcmVkdWNlIHRoZSBsZW5ndGggb2YgbGluZXMgYW5kIG1ha2UgdGhlIGNvZGUgbW9yZSByZWFkYWJsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzYwNzIKKworMjAxNC0wOS0wNCAxODozNTo0NiArMDIwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIHY0bDI6IHNldCBtaW5fbGF0ZW5jeSBmb3Igb3V0cHV0IGRldmljZSBhY2NvcmRpbmcgdG8gcmVxdWlyZWQgbWluaW11bSBudW1iZXIgb2YgYnVmZmVycworCSAgU2luY2Ugd2UgY2FuIGdldCB0aGUgbWluaW11bSBudW1iZXIgb2YgYnVmZmVycyBuZWVkZWQgYnkgYW4gb3V0cHV0CisJICBkZXZpY2UgdG8gd29yaywgdXNlIGl0IHRvIHNldCBtaW5fbGF0ZW5jeSB3aGljaCB3aWxsIGRldGVybWluZSBob3cgbWFueQorCSAgYnVmZmVycyBhcmUgcXVldWVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjA3MgorCisyMDE0LTA5LTA5IDE2OjEwOjU2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzcmMuYzoKKwkgIHRlc3RzOiB1ZHBzcmM6IGFkZCBjaGVjayB0byBtYWtlIHN1cmUgbXVsdGlwbGUgbWVtb3J5IGNodW5rcyBhcmUgdXNlZAorCisyMDE0LTA5LTA5IDE1OjU1OjE4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzcmMuYzoKKwkgIHRlc3RzOiB1ZHBzcmM6IHdhaXQgZm9yIGJ1ZmZlcnMgd2l0aCBHQ29uZCBpbnN0ZWFkIG9mIHNsZWVwaW5nCisJICBBdm9pZHMgaGFsZi1zZWNvbmQgc2xlZXAgZm9yIG5vIHJlYXNvbi4KKworMjAxNC0wOS0wOSAxNTozMTozMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc3JjLmM6CisJICB0ZXN0czogdWRwc3JjOiBzcGxpdCBvdXQgc29ja2V0IHNldHVwCisKKzIwMTQtMDktMDkgMTM6NDY6NTYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IG1vcmUgZWZmaWNpZW50IG1lbW9yeSBoYW5kbGluZworCSAgRHJvcCB1c2Ugb2YgZ19zb2NrZXRfZ2V0X2F2YWlsYWJsZV9ieXRlcygpIHdoaWNoIGlzCisJICBub3QgdXNlZnVsIG9uIGFsbCBzeXN0ZW1zICh3aGVyZSBpdCByZXR1cm5zIHRoZSBzaXplCisJICBvZiB0aGUgZW50aXJlIGJ1ZmZlciBub3QgdGhhdCBvZiB0aGUgbmV4dCBwZW5kaW5nCisJICBwYWNrZXQpLCBhbmQgaXMgeWV0IGFub3RoZXIgc3lzY2FsbCBhbmQgYXBwYXJlbnRseQorCSAgdmVyeSBpbmVmZmljaWVudCBvbiBXaW5kb3dzIGluIHRoZSBVRFAgY2FzZS4KKwkgIEluc3RlYWQsIHdoZW4gcmVhZGluZyBVRFAgcGFja2V0cywgdXNlIHRoZSBtb3JlIGZlYXR1cmVmdWwKKwkgIGdfc29ja2V0X3JlY2VpdmVfbWVzc2FnZSgpIGNhbGwgdGhhdCBhbGxvd3MgdG8gcmVhZCBpbnRvCisJICBzY2F0dGVyZWQgbWVtb3J5LCBhbmQgYWxsb2NhdGUgb25lIG1lbW9yeSBjaHVuayB3aGljaCBpcworCSAgbGlrZWx5IHRvIGJlIGxhcmdlIGVub3VnaCBmb3IgYSBwYWNrZXQsIHdoaWxlIGFsc28gcHJvdmlkaW5nCisJICBhIGxhcmdlciBhbGxvY2F0ZWQgbWVtb3J5IGNodW5rIGp1c3QgaW4gY2FzZSB0aGUgcGFja2V0CisJICBpcyBsYXJnZXIgdGhhbiBleHBlY3RlZC4gSWYgdGhlIHJlY2VpdmVkIGRhdGEgZml0cyBpbnRvIHRoZQorCSAgZmlyc3QgY2h1bmssIHdlJ2xsIGp1c3QgYWRkIHRoYXQgdG8gdGhlIGJ1ZmZlciB3ZSByZXR1cm4KKwkgIGFuZCByZS11c2UgdGhlIGZhbGxiYWNrIGJ1ZmZlciBmb3IgbmV4dCB0aW1lLCBvdGhlcndpc2Ugd2UKKwkgIGFkZCBib3RoIGNodW5rcyB0byB0aGUgYnVmZmVyLgorCSAgVGhpcyByZWR1Y2VzIG1lbW9yeSB3YXN0ZSBtb3JlIHJlbGlhYmx5IG9uIHN5c3RlbXMgd2hlcmUKKwkgIGdldF9hdmFpbGFibGVfYnl0ZXMoKSBkb2Vzbid0IHdvcmsgcHJvcGVybHkuCisJICBJbiBhIG11bHRpbWVkaWEgc3RyZWFtaW5nIHNjZW5hcmlvLCBpbmNvbWluZyBVRFAgcGFja2V0cworCSAgYXJlIGFsbW9zdCBuZXZlciBmcmFnbWVudGVkIGFuZCB0aHVzIGFsbW9zdCBhbHdheXMgc21hbGxlcgorCSAgdGhhbiB0aGUgTVRVIHNpemUsIHdoaWNoIGlzIGFsc28gd2h5IHdlIGRvbid0IHRyeSB0byBkbworCSAgc29tZXRoaW5nIHNtYXJ0ZXIgd2l0aCBtb3JlIGZhbGxiYWNrIG1lbW9yeSBjaHVua3Mgb2YKKwkgIGRpZmZlcmVudCBzaXplcy4gVGhlIGZhbGxiYWNrIHNjZW5hcmlvIGlzIGp1c3QgZm9yIHdoZW4KKwkgIHNvbWVvbmUgYnVpbHQgYSBicm9rZW4gc2VuZGVyIHBpcGVsaW5lIChub3QgdXNpbmcgYQorCSAgcGF5bG9hZGVyIG9yIHNvbWVzdWNoKQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxMDM2NAorCisyMDE0LTA5LTA5IDEyOjE1OjQzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkgIHVkcHNyYzogcmV3b3JrIG1lbW9yeSBhbGxvY2F0aW9uIGJpdHMgYW5kIGVuc3VyZSB3ZSBhbHdheXMgaGF2ZSB0d28gY2h1bmtzIG9mIG1lbW9yaWVzIHRvIHJlYWQgaW50bworCSAgRmlyc3QgY2h1bmsgaXMgdGhlIGxpa2VseS9leHBlY3RlZCBidWZmZXIgc2l6ZSwgc2Vjb25kIGlzIGFzCisJICBmYWxsYmFjayBpbiBjYXNlIHRoZSBwYWNrZXQgaXMgbGFyZ2VyIGluIHRoZSBlbmQuCisJICBOZXh0IHN0ZXA6IGFjdHVhbGx5IHVzZSB0aGVzZS4KKworMjAxNC0wOS0wOSAwOTo0MjoxNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmg6CisJICB1ZHBzcmM6IHRyYWNrIG1heCBwYWNrZXQgc2l6ZSBhbmQgc2F2ZSBhbGxvY2F0b3IgbmVnb3RpYXRlZCBieSBHc3RCYXNlU3JjCisKKzIwMTQtMDktMDggMTY6MTU6MDUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSAgYXVkaW9lY2hvOiBmaXggZXhhbXBsZSBjb21tYW5kIGxpbmUKKworMjAxNC0wOS0wNyAxMjo0NjowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGZpeCBjcmFzaCB3aXRoIGNlcnRhaW4gdmlkZW9zCisJICBUaGlzIGlzIGEgcmVncmVzc2lvbiBmcm9tIDEuMiBjYXVzZWQgYnkgdGhlIHBvcnQKKwkgIHRvIHRoZSBwYWQgZmxvdyBjb21iaW5lci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzYxOTIKKworMjAxNC0wOS0wNCAxNjoyMToyMCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thLWRlbXV4OiBEb24ndCBoYW5kbGUgcGFyc2UgZXJyb3JzIGF0IHRoZSBlbmQgb2YgZmlsZSBhcyBhbiBlcnJvcgorCSAgQnV0IG9ubHkgaWYgdGhleSBoYXBwZW4gYWZ0ZXIgdGhlIE1hdHJvc2thIHNlZ21lbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1ODMzCisKKzIwMTQtMDktMDQgMTI6MTQ6MTEgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogSW5jbHVkZSByZWRpcmVjdGlvbiB0YXJnZXQgaW4gZXJyb3IgbWVzc2FnZXMKKwkgIEp1c3QgZ2l2aW5nIHRoZSBvcmlnaW5hbCBVUkkgY2FuIGdpdmUgdGhlIGZhbHNlIGltcHJlc3Npb24gdGhhdCBlLmcuCisJICB0aGF0IG9uZSBmYWlsZWQgaG9zdCBuYW1lIHJlc29sdXRpb24sIHdoaWxlIGFjdHVhbGx5IHRoZSByZWRpcmVjdGlvbiB0YXJnZXQKKwkgIGRpZC4KKworMjAxNC0wOS0wMiAxMToxMzo0NCArMDQwMCAgQW5kcmVpIFNhcmFrZWV2IDxzYXJha3VzaGFAZ21haWwuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogRml4IHN5bmNocm9uaXphdGlvbiBpZiBkeW5hbWljYWxseSBjaGFuZ2luZyB0aGUgRlBTCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1ODU5CisKKzIwMTQtMDktMDIgMTM6NTI6NDMgKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkgIHNtcHRlOiBDaGVjayBpZiBpbnB1dCBjYXBzIGFyZSB0aGUgc2FtZSBhbmQgY3JlYXRlIG91dHB1dCBjYXBzIGZyb20gdmlkZW8gaW5mbworCSAgVGhpcyBtYWtlcyBzdXJlIHRoYXQgYWxzbyBwcm9wZXJ0aWVzIGxpa2UgdGhlIHBpeGVsLWFzcGVjdC1yYXRpbyBhcmUgdGhlIHNhbWUKKwkgIGJldHdlZW4gYm90aCBzdHJlYW1zIGFuZCB0aGF0IHRoZSBvdXRwdXQgY2FwcyBjb250YWluIGFsbCBmaWVsZHMgbmVjZXNzYXJ5IGZvcgorCSAgY29tcGxldGUgdmlkZW8gY2Fwcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzU4MDQKKworMjAxNC0wOS0wMiAxNzoyMjowNyArMDUzMCAgVmluZWV0aCBUIE0gPHZpbmVldGgudG1Ac2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IHJlcGxhY2Ugd2l0aCBnc3RfYnVmZmVyX2NvcHkKKwkgIGdzdF9idWZmZXJfcmVmIGFuZCBnc3RfYnVmZmVyX3dyaXRhYmxlIGlzIGJlaW5nIHVzZWQgdG8gY3JlYXRlIGEgd3JpdGFibGUgY29weSBvZiBzb3VyY2UgYnVmZmVyLgorCSAgcmVwbGFjaW5nIHRoZSBzYW1lIHdpdGggZ3N0X2J1ZmZlcl9jb3B5IGFzIHRoZSBmdW5jdGlvbmFsaXR5IGlzIHNhbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1ODgwCisKKzIwMTQtMDktMDMgMjM6MDY6NTMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogbWFyayBqcGVnIGFuZCBwbmcgYXMgcGFyc2VkIHNvIGF2ZGVjX21qcGVnIGNhbiBiZSB1c2VkIHRvbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNTk3MQorCisyMDE0LTA5LTAzIDExOjQ2OjEzICswNTMwICBWaW5lZXRoIFQgTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmZGVjLmM6CisJICBnZGtwaXhidWZkZWM6IGZyZWUgcXVlcnkgYWZ0ZXIgdXNlCisJICBJbiBnc3RfZ2RrX3BpeGJ1Zl9kZWNfc2V0dXBfcG9vbCgpLCBxdWVyeSBpcyBiZWluZyBhbGxvY2F0ZWQgdXNpbmcKKwkgIGdzdF9xdWVyeV9uZXdfYWxsb2NhdGlvbigpLCBidXQgdGhlIHNhbWUgaXMgbm90IHVucmVmZXJlbmNlZAorCSAgaGVuY2UgY2FsbGluZyBnc3RfcXVlcnlfdW5yZWYoKSBhZnRlciB1c2FnZSBvZiBxdWVyeS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzU5NTAKKworMjAxNC0wOS0wMyAyMzo0NjozNCArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmM6CisJICBxdGRlbXV4OiBTaWxlbmNlIHNvbWUgd2FybmluZ3MgZm9yIG5vcm1hbCBmaWxlIGNvbnRlbnRzCisKKzIwMTQtMDktMDEgMDk6NTY6MDIgKzAyMDAgIE5pY29sYXMgSHVldCA8bmljb2xhcy5odWV0QHBhcnJvdC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBGaXggcGFyc2luZyBpc3N1ZSB3aGVuIHRoZSBidWZmZXIgZG9lcyBub3QgaGF2ZSBhIGNvbXBsZXRlIEFEVFMvTE9BUyBmcmFtZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNTUyMAorCisyMDE0LTA5LTAyIDA5OjA5OjQ5ICswMzAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOWRlYy5jOgorCSAgdnA5ZGVjOiBHZXQgaW5wdXQgd2lkdGgvaGVpZ2h0IGZyb20gdGhlIGNvZGVjIGluc3RlYWQgb2YgdGhlIGlucHV0IGNhcHMKKwkgIFRoZXkgYXJlIHJlcG9ydGVkIHByb3Blcmx5IGJ5IGxpYnZweCBpZiB0aGUgY29ycmVjdCBzdHJ1Y3QgbWVtYmVycyBhcmUgdXNlZC4KKwkgIFRoaXMgYWxzbyBmaXhlcyBoYW5kbGluZyBvZiByZXNvbHV0aW9uIGNoYW5nZXMgd2l0aG91dCBpbnB1dCBjYXBzIGNoYW5nZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzE5MzU5CisKKzIwMTMtMTAtMjIgMTg6NDk6MjIgKzAxMDAgIFRvbSBHcmVlbndvb2QgPHRjZGdyZWVud29vZEBob3RtYWlsLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkgIHZwOGRlYzogRml4IGZvciBoYW5kbGluZyByZXNvbHV0aW9uIGNoYW5nZXMgd2hlbiBkZWNvZGluZyBWUDgKKwkgIElmIHRoZSByZXNvbHV0aW9uIGNoYW5nZXMgaW4gdGhlIGJpdHN0cmVhbSB3aXRob3V0IHRoZSBpbnB1dCBjYXBzIGNoYW5naW5nIHdlCisJICB3b3VsZCBwcmV2aW91c2x5IG91dHB1dCBjb3JydXB0ZWQgdmlkZW8gb3IgY3Jhc2guCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzE5MzU5CisKKzIwMTQtMDktMDIgMDA6NTU6MTcgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDlkZWMuYzoKKwkgIHZwOWRlYzogRml4IHNlZ2ZhdWx0IHdoZW4gYSBuZXcgY2FwcyBpcyByZWNlaXZlZAorCSAgUmVtZW1iZXIgdG8gdW5yZWYgdGhlIG91dHB1dCBjYXBzIHdoZW4gYSBuZXcgY2FwcyBldmVudCBpcyByZWNlaXZlZAorCSAgYXMgaXQgc2hvdWxkIGdlbmVyYXRlIGEgbmV3IG9uZSBiYXNlZCBvbiB0aGUgbmV3IGNhcHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM0MjY2CisKKzIwMTQtMDktMDIgMDA6NTQ6MzUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdnA4ZGVjLmM6CisJICB0ZXN0czogdnA4ZGVjOiBhZGQgdGVzdCBmb3IgY2FwcyByZW5lZ290aWF0aW9uCisJICBDaGVjayB0aGF0IHZwOGRlYyBjYW4gcHJvcGVybHkgYWNjZXB0IGEgbmV3IGNhcHMgd2hlbiB1cHN0cmVhbQorCSAgY2hhbmdlcyBpdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNDI2NgorCisyMDE0LTA4LTA1IDEwOjM0OjM5ICswMjAwICBKb3NlIEFudG9uaW8gU2FudG9zIENhZGVuYXMgPHNhbnRvc2NhZGVuYXNAZ21haWwuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSAgdnA4ZGVjOiBSZXNldCBvdXRwdXQgYW5kIGlucHV0IHN0YXRlcyB3aGVuIGNoYW5naW5nIGZvcm1hdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNDI2NgorCisyMDE0LTA5LTAxIDE2OjM5OjIzICswNTMwICBWaW5lZXRoIFQgTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogRG9uJ3QgY2FsbCBnc3RfY2Fwc191bnJlZigpIG9uIHRlbXBsYXRlIGNhcHMgd2hlbiBhbHJlYWR5IHVucmVmZXJlbmNlZAorCSAgQWRkaW5nIGFuIGV4dHJhIGNvbmRpdGlvbiB3aGlsZSBjYWxsaW5nIGdzdF9jYXBzX3VucmVmICh0ZW1wbCkKKwkgIGFuZCByZXBsYWNpbmcgZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoZ3N0X2NhcHNfcmVmIChjYXBzKSkgd2l0aAorCSAgZ3N0X2NhcHNfY29weSAoY2FwcykgaW4gbGluZSAxNzcsIHNpbmNlIHRoZSBmdW5jdGlvbmFsaXR5IGlzIHNhbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1Nzk1CisKKzIwMTQtMDgtMjkgMTI6MDE6MjcgKzAyMDAgIEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IGdldF9uZWFyZXN0X3NpemU6IEZpeCAiVW5zdXBwb3J0ZWQgZmllbGQgdHlwZSIgZXJyb3JzCisJICBNb3N0IFY0TDIgaW9jdGxzIGxpa2UgdHJ5X2ZtdCB3aWxsIGFkanVzdCBpbnB1dCBmaWVsZHMgdG8gbWF0Y2ggd2hhdCB0aGUKKwkgIGhhcmR3YXJlIGNhbiBkbyByYXRoZXIgdGhlbiByZXR1cm5pbmcgLUVJTlZBTC4gQXMgaXMgZG9jbWVudGVkIGhlcmU6CisJICBodHRwOi8vbGludXh0di5vcmcvZG93bmxvYWRzL3Y0bC1kdmItYXBpcy92aWRpb2MtZy1mbXQuaHRtbAorCSAgRUlOVkFMIGlzIG9ubHkgcmV0dXJuZWQgaWYgdGhlIGJ1ZmZlciB0eXBlIGZpZWxkIGlzIGludmFsaWQgb3Igbm90IHN1cHBvcnRlZC4KKwkgIFNvIHVwb24gcmVxdWVzdGluZyBWNEwyX0ZJRUxEX05PTkUgZGV2aWNlcyB3aGljaCBjYW4gb25seSBkbyBpbnRlcmxhY2VkCisJICBtb2RlIHdpbGwgY2hhbmdlIHRoZSBmaWVsZCB2YWx1ZSB0byBlLmcuIFY0TDJfRklFTERfQk9UVE9NIGFzIG9ubHkgcmV0dXJuaW5nCisJICBoYWxmIHRoZSBsaW5lcyBpcyB0aGUgY2xvc2VzdCB0aGV5IGNhbiBkbyB0byBwcm9ncmVzc2l2ZSBtb2Rlcy4KKwkgIEluIGVzc2VuY2UgdGhpcyBtZWFucyB0aGF0IHdlJ3ZlIGZhaWxlZCB0byBnZXQgYSAodXNhYmxlKSBwcm9nZXNzaXZlIG1vZGUKKwkgIGFuZCBzaG91bGQgZmFsbCBiYWNrIHRvIGludGVybGFjZWQgbW9kZS4KKwkgIFRoaXMgY29tbWl0IGFkZHMgYSBjaGVjayBmb3IgaGF2aW5nIGdvdHRlbiBhIHVzYWJsZSBmaWVsZCB2YWx1ZSBhZnRlciB0aGUgZmlyc3QKKwkgIHRyeV9mbXQsIHRvIGZvcmNlIGZhbGxiYWNrIHRvIGludGVybGFjZWQgbW9kZSBldmVuIGlmIHRoZSB0cnlfZm10IHN1Y2NlZWRlZCwKKwkgIHRoZXJlYnkgZml4aW5nIGdldF9uZWFyZXN0X3NpemUgZmFpbGluZyBvbiB0aGVzZSBkZXZpY2VzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNTY2MAorCisyMDE0LTA4LTI5IDEwOjU3OjIwICswMjAwICBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBnZXRfbmVhcmVzdF9zaXplOiBBbHdheXMgcmVpbml0IGFsbCBzdHJ1Y3QgZmllbGRzIG9uIHJldHJ5CisJICBUaGV5IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgdGhlIGlvY3RsIGV2ZW4gaWYgaXQgZmFpbGVkLiBUaGlzIGFsc28gbWFrZXMKKwkgIHRoZSBTX0ZNVCBmYWxsYmFjayBwYXRoIHRyeSBwcm9ncmVzc2l2ZSBmaXJzdCwgbWFraW5nIGl0IGNvbnNpc3RlbnQgd2l0aCB0aGUKKwkgIHByZWZlcnJlZCBUUllfRk1UIHBhdGguCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1NjYwCisKKzIwMTQtMDgtMjkgMTE6NTU6MjYgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IFN0b3JlIHNpemUgb2YgZGF0YSB0YWcgaW4gYSA2NCBiaXQgaW50ZWdlciBsb2NhbGx5IHRvbworCSAgT3RoZXJ3aXNlIHdlIHdpbGwgY2xpcCB0aGUgRFM2NCB2YWx1ZSBvZiBSRjY0IGZpbGVzIHRvIDMyIGJpdHMgYWdhaW4uCisKKzIwMTQtMDgtMjkgMTE6NTM6MjMgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IFVzZSA2NCBiaXQgc2NhbGluZyBmdW5jdGlvbnMgbm93IHRoYXQgZmFjdCBpcyBhIDY0IGJpdCBpbnRlZ2VyCisKKzIwMTQtMDgtMjcgMTg6NTU6MTggKzAyMDAgIFBldGVyIEcuIEJhdW0gPHBldGVyQGRyLWJhdW0ubmV0PgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oOgorCSAgd2F2cGFyc2U6IHN1cHBvcnQgcmY2NCBmb3JtYXQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzU2MjcKKworMjAxNC0wOC0yOCAxMzo0ODo1MCAtMDYwMCAgSmFzb24gTGl0emluZ2VyIDxqbGl0emluZ2VyQGNvbnRyb2w0LmNvbT4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSAgbXVsdGlwYXJ0ZGVtdXg6IEVuc3VyZSBjYXBzIGJlZm9yZSBwYWQgYWRkZWQuCisJICBUaGlzIHN0b3JlcyB0aGUgc3RyZWFtLXN0YXJ0LCBzZXRzIGNhcHMsIGFuZCB0aGVuIGFkZHMgdGhlIHBhZCwKKwkgIHdoaWNoIGVuc3VyZXMgdGhhdCB0aGUgY2FwcyBhcmUgc2V0IGZvciB0aGUgInBhZC1hZGRlZCIgY2FsbGJhY2suCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1NjI2CisKKzIwMTQtMDgtMjggMTU6MDM6NTAgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBGYWxsYmFjayB0byBQVFMgaWYgRFRTIGlzIG1pc3NpbmcKKwkgIEZpeGluZyBhIHJlZ3Jlc3Npb24gaW50cm9kdWNlIHdoZW4gZml4aW5nOgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMTM1MgorCisyMDE0LTA4LTI4IDE2OjEzOjI5ICswNTMwICBWaW5lZXRoIFQgTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogUmVtb3ZlIGltcG9zc2libGUgZXJyb3IgY29uZGl0aW9uCisJICBXZSByZXR1cm4gRU9TIGFmdGVyIHRoZSBmaXJzdCBidWZmZXIsIGFuZCBHc3RQYWQgd2lsbCBtYWtlIHN1cmUgbm93IHRoYXQgd2UKKwkgIHdvbid0IGdldCBhbnkgb3RoZXIgYnVmZmVyIGFmdGVyd2FyZHMgdW50aWwgYSBmbHVzaCBoYXBwZW5zLiBObyBuZWVkIHRvIGNoZWNrCisJICBmb3IgaXQgb3Vyc2VsdmVzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNTU4MQorCisyMDE0LTA4LTI4IDEzOjUzOjIzICswNTMwICBWaW5lZXRoIFQgTSA8dmluZWV0aC50bUBzYW1zdW5nLmNvbT4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmZGVjLmM6CisJICBnZGtwaXhidWZkZWM6IEVPUyBhbmQgTk9UX0xJTktFRCBhcmUgbm8gZXJyb3JzIGluIGdlbmVyYWwKKwkgIERvbid0IHBvc3QgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdGhlbSBidXQgbGV0IHVwc3RyZWFtIGhhbmRsZQorCSAgYW55dGhpbmcgYWNjb3JkaW5nbHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM1NTY0CisKKzIwMTQtMDgtMjcgMjE6MDc6MjYgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4Lmg6CisJICBmbHZtdXg6IENvcnJlY3RseSBvZmZzZXQgdGltZXN0YW1wCisJICBUaGUgcHJldmlvdXMgbWV0aG9kIHdvdWxkIGJyZWFrIEFWIHN5bmMgaW4gdGhlIGNhc2UgYXVkaW8gb3IgdmlkZW8KKwkgIGRpZG4ndCBzdGFydCBhdCB0aGUgc2FtZSBwb2ludCBpbiBydW5uaW5nIHRpbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMxMzUyCisKKzIwMTQtMDgtMjcgMjA6NTY6MTIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogU2F2ZSBkdHMgZnJvbSBidWZmZXIKKwkgIFdlIG5vIGxvbmdlciBzZXQgZHRzIGluIG11eGVkIGJ1ZmZlci4gVGhpcyB3b3VsZCBsZWFkIHRvIGVuY29kaW5nIHRhZ3MKKwkgIHdpdGggdGltZXN0YW1wIDAgaW5zdGVhZCBvZiB0aGUgdGltZXN0YW1wIG9mIHByZXZpb3VzIGJ1ZmZlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzEzNTIKKworMjAxNC0wNy0yOCAyMDo1ODo1OSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5oOgorCSAgZmx2bXV4OiBFbnN1cmUgVGltZXN0YW1wIHN0YXJ0cyBhdCAwCisJICBGTFYgZG9jdW1lbnRhdGlvbiBzdGlwdWxhdGVzIHRoYXQgdGltZXN0YW1wIG11c3Qgc3RhcnQgYXQgemVyby4KKwkgIEluIG9yZGVyIHRvIHJlc3BlY3QgdGhpcyBydWxlLCBrZWVwIHRoZSBmaXJzdCB0aW1lc3RhbXAgYXJvdW5kCisJICBhbmQgb2Zmc2V0IHRoZSB0aW1lc3RhbXAgZnJvbSB0aGlzIHZhbHVlLiBUaGlzIGFsbG93IGZvciBsb25nZXIKKwkgIHJlY29yZGluZyB0aW1lIGluIHByZXNlbmNlIG9mIHRpbWVzdGFtcCB0aGF0IGRvZXMgbm90IHN0YXJ0CisJICBhdCAwIGFscmVhZHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMxMzUyCisKKzIwMTQtMDYtMDYgMjM6MTc6NTIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4Lmg6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2OiBUYWcgdGltZXN0YW1wIGFyZSBEVFMgbm90IFBUUworCSAgVGhlIHRhZ3MgaW4gRkxWIGFyZSBEVFMuIEluIGF1ZGlvIGNhc2VzLCBhbmQgZm9yIG1hbnkgdmlkZW8gZm9ybWF0IHRoaXMgbWFrZXMKKwkgIG5vIGRpZmZlcmVuY2UsIGJ1dCBmb3IgQVZDIHdpdGggQi1GcmFtZXMsIFBUUyBuZWVkIHRvIGJlIGNvbXB1dGVkIGZyb20KKwkgIGNvbXBvc2l0aW9uIHRpbWVzdGFtcCBDVFMsIHdpdGggUFRTID0gRFRTICsgQ1RTLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMTM1MgorCisyMDE0LTA4LTA3IDIxOjU4OjE0IC0wNDAwICBZb3VuZXNzIEFsYW91aSA8a2FrYXJvdG9Aa2FrYXJvdG8uaG9tZWxpbnV4Lm5ldD4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IEFsbG93IHJ0cCBjYXBzIHdpdGhvdXQgY2xvY2stcmF0ZQorCSAgVGhlIGppdHRlcmJ1ZmZlciBzaG91bGRuJ3QgZm9yY2UgY2xvY2stcmF0ZSBvbiBpdHMgc2luayBwYWQsIHRoaXMgd2lsbCBjYXVzZSBhIG5lZ290aWF0aW9uIGlzc3VlIHNpbmNlIHJ0cHNzcmNkZW11eCBkb2Vzbid0IGhhdmUgdGhlIGNsb2NrLXJhdGUgYW5kIGRvZXNuJ3QgYWRkIGl0IHRvIHRoZSBjYXBzLiBUaGUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCB0aGUgY2xvY2stcmF0ZSBjYW4gZWl0aGVyIGJlIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBjYXBzIG9yIHRocm91Z2ggdGhlIHJlcXVlc3QtcHQtbWFwIHNpZ25hbCwgc28gd2UgbXVzdCByZW1vdmUgY2xvY2stcmF0ZSBmcm9tIHRoZSBwYWQgdGVtcGxhdGVzIGFuZCB3ZSBtdXN0IGFjY2VwdCB0aGUgR1NUX0VWRU5UX0NBUFMgaWYgdGhlIGNhcHMgZG9uJ3QgaGF2ZSB0aGUgY2xvY2stcmF0ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzQzMjIKKworMjAxNC0wOC0xOCAxNDowNTo1MiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAb3NnLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGF2b2lkIGNyYXNoaW5nIG9uIGRhc2ggc3RyZWFtcworCSAgREFTSC9mcmFnbWVudGVkIG1vb3YgbWlnaHQgaGF2ZSBubyBzYW1wbGVzIGFzIHRob3NlIGFyZSBjYXJyaWVkCisJICBpbiBtb29mIGZyYWdtZW50cy4gQXZvaWQgY3Jhc2hpbmcgb3IgZmFpbGluZyB0aGUgc3RyZWFtIGJlY2F1c2UKKwkgIG9mIHRoYXQuCisKKzIwMTQtMDgtMTggMTA6MzM6NDggKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tb3Nzc3JjLmM6CisJICBleGFtcGxlczogdXNlICdwb3N0LW1lc3NhZ2VzJyBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRlcHJlY2F0ZWQgJ21lc3NhZ2UnIHByb3BlcnR5CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM0OTc5CisKKzIwMTQtMDgtMTggMTE6NDU6NTQgKzAyMDAgIFbDrWN0b3IgTWFudWVsIErDoXF1ZXogTGVhbCA8dmphcXVlekBpZ2FsaWEuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwOiBmaXggdWRwc3JjIGRvY3VtZW50YXRpb24KKwkgIHVkcHNyYyBndGstZG9jIGRvY3VtZW50YXRpb24gcmVmZXJzIHRvIHNvY2tmZCBhbmQgY2xvc2VmZCBwcm9wZXJ0aWVzIHdoaWNoIGhhcworCSAgYmVlbiByZW1vdmVkLiBUaGlzIHBhdGNoIHJlcGxhY2VzIHRob3NlIHJlZmVyZW5jZXMgdG8gc29ja2V0IGFuZCBjbG9zZS1zb2NrZXQKKwkgIHJlc3BlY3RpdmVseS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzQ5ODcKKworMjAxNC0wOC0xNSAxMDowOTo1NiArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBNYWtlIHRoZSBkZWZhdWx0IHRpbWVzY2FsZSAxLzE4MDAgc2Vjb25kCisJICBUaGUgb2xkIGRlZmF1bHQgdGltZXNjYWxlIG9mIDEgbWlsbGlzZWNvbmQgcHJvZHVjZXMgaXJyYXRpb25hbAorCSAgbnVtYmVycyBmb3IgYSBsb3Qgb2YgZnJhbWVyYXRlL2F1ZGlvLXBhY2tldC1kdXJhdGlvbiBtdWx0aXBsZXMuCisJICAxLzE4MDAgaXMgYSBuaWNlciBudW1iZXIsIGFzIGl0IHRlbmRzIHRvIHByb2R1Y2UgYmV0dGVyIGZyYWN0aW9ucworCSAgYW5kIHRoZXJlZm9yZSBzbGlnaHRseSBoaWdoZXIgYWNjdXJhY3kgb3ZlcmFsbAorCisyMDE0LTA4LTE1IDAxOjE3OjI3ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYTogVXNlIGdzdF92aWRlb19ndWVzc19mcmFtZXJhdGUoKSBmdW5jdGlvbgorCSAgUmVtb3ZlIGxvY2FsIGZyYW1lcmF0ZSBndWVzc2luZyBmdW5jdGlvbiBpbiBmYXZvdXIgb2YKKwkgIHRoZSBuZXcgZ3N0X3ZpZGVvX2d1ZXNzX2ZyYW1lcmF0ZSgpIGZ1bmN0aW9uLgorCisyMDE0LTA4LTE1IDAxOjEyOjIwICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9NYWtlZmlsZS5hbToKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogSW1wcm92ZSBmcmFtZXJhdGUgY2FsY3VsYXRpb24vZ3Vlc3NpbmcKKwkgIENoYW5nZSB0aGUgd2F5IHRoZSBvdXRwdXQgZnJhbWVyYXRlIGlzIGNhbGN1bGF0ZWQKKwkgIHRvIGlnbm9yZSB0aGUgZmlyc3Qgc2FtcGxlICh3aGljaCBpcyBzb21ldGltZXMgdHJ1bmNhdGVkCisJICBpbiBteSB0ZXN0aW5nKSBhbmQgdXNlIHRoZSBuZXcgZ3N0X3ZpZGVvX2d1ZXNzX2ZyYW1lcmF0ZSgpCisJICBmdW5jdGlvbiB0byByZWNvZ25pc2UgY29tbW9uIHN0YW5kYXJkIGZyYW1lcmF0ZXMgYmV0dGVyLgorCSAgUmVtb3ZlIHRoZSBjb2RlIHRoYXQgd2FzIHNvcnRpbmcgdGhlIGZpcnN0IDIwIHNhbXBsZQorCSAgZHVyYXRpb25zIGFuZCB0aGVuIGlnbm9yaW5nIHRoZSByZXN1bHQuCisKKzIwMTQtMDgtMTQgMTY6MzY6NDQgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBVc2UgdGhlIGJlc3Qgd2lkdGgvaGVpZ2h0L2V0YyBpZiBkb3duc3RyZWFtIGNhbiBoYW5kbGUgdGhhdAorCSAgQmVmb3JlIGl0IHdhcyBhbHdheXMgdXNpbmcgd2hhdGV2ZXIgZG93bnN0cmVhbSBwcmVmZXJyZWQsIHdoaWxlCisJICB0aGUgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBjbGFpbWVkIHNvbWV0aGluZyBkaWZmZXJlbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI3MTgwCisKKzIwMTQtMDgtMTQgMTE6Mjk6MDAgKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogQXZvaWQgZG91YmxlIGZyZWUgb2YgVmlkZW9Db252ZXJ0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM0NzY0CisKKzIwMTQtMDgtMTMgMTE6NTg6MzUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBmaXggaW5kZW50YXRpb24KKworMjAxNC0wOC0xMyAxMTo1NDoyNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IHVuLWJyZWFrIGR1cmF0aW9uIHF1ZXJ5aW5nCisJICBDb21taXQgMmI5NDkzYjUgYnJva2UgdGhpcyBpbiB0d28gd2F5czogYSkgd2Ugc2hvdWxkIG9ubHkKKwkgIHBhc3MgZHVyYXRpb24gcXVlcmllcyBpbiBUSU1FIGZvcm1hdCB1cHN0cmVhbSAob3IgYXQgbGVhc3QKKwkgIG5vdCB0aG9zZSBpbiBERUZBVUxUIG9yIEJZVEUgZm9ybWF0KSwgYW5kIGIpIHdlIG11c3RuJ3QKKwkgIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiAncmVzJyBmcm9tIFRSVUUgdG8gRkFMU0UKKwkgIGFuZCBub3Qgc2V0IGl0IGFnYWluIGxhdGVyLiBUaGlzIGxlZCB0byBib2d1cyBkdXJhdGlvbnMKKwkgIGJlaW5nIHJlcG9ydGVkIGZvciBGTFYgcGxheWJhY2sgZnJvbSBmaWxlLCBiZWNhdXNlIFRJTUUKKwkgIHF1ZXJpZXMgd291bGQgZmFpbCAoYXMgJ3JlcycgaGFkIGJlZW4gc2V0IHRvIEZBTFNFKSBhbmQKKwkgIHBhcnNlcnMgdGhlbiBkbyBhIEJZVEUgcXVlcnkgYXMgZmFsbGJhY2sgYW5kIHRyeSB0bworCSAgZ3Vlc3N0aW1hdGUgc29tZXRoaW5nIGluIHJldHVybiwgd2hpY2ggb2YgY291cnNlIGdvZXMKKwkgIGhvcnJpYmx5IHdyb25nIHNpbmNlIHRoZSBCWVRFIHNpemUgcmV0dXJuZWQgaXMgZm9yIHRoZQorCSAgbXV4ZWQgZmlsZS4KKworMjAxNC0wOC0xMyAxMzoyMzoxMCArMDMwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgdmlkZW9iYWxhbmNlOiBBbGxvdyBhbnkgcmF3IGNhcHMgaW4gcGFzc3Rocm91Z2ggbW9kZSwgbm90IGp1c3QgdGhlIG9uZXMgd2UgaGFuZGxlCisKKzIwMTQtMDgtMTMgMTM6MDQ6MjEgKzAzMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkgIHZpZGVvYmFsYW5jZTogQWxsb3cgQU5ZIGNhcHNmZWF0dXJlcywgYnV0IG9ubHkgaW4gcGFzc3Rocm91Z2ggbW9kZQorCSAgV2hlbiBjaGFuZ2luZyB0aGUgcHJvcGVydGllcyB0byBub3QgYmUgaW4gcGFzc3Rocm91Z2ggbW9kZSBhbnltb3JlLAorCSAgd2Ugd2lsbCBvbmx5IGFjY2VwdCBjYXBzIHdlIGNhbiBwcm9jZXNzIG91cnNlbHZlcywgcG90ZW50aWFsbHkgY2F1c2luZworCSAgYSBub3QtbmVnb3RpYXRlZCBlcnJvci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjAzNDUKKworMjAxNC0wOC0xMiAxMTozNDozMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSAgZG9jczogdXBkYXRlIGZvciBnaXQKKworMjAxNC0wOC0xMiAxMTozMzo1NiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBidWlsZCB4aW1hZ2VzcmMgYWdhaW4gd2hlbiBjaGVja3Mgc3VjY2VlZAorCSAgVGhpcmQgdGltZSBsdWNreSwgaG9wZWZ1bGx5LgorCisyMDE0LTA4LTExIDA5OjI2OjE3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGZpeCB4MTEgY2hlY2tzIHRvIGJlIG5vbi1mYXRhbCBhZ2FpbgorCSAgTXVzdCBwYXNzIGFuIGFjdGlvbi1pZi1ub3QtZm91bmQgYXJndW1lbnQgdG8KKwkgIFBLR19DSEVDS19NT0RVTEVTIG9yIGl0IHdpbGwgZXJyb3Igb3V0IHdoZW4KKwkgIGl0IGNhbid0IGZpbmQgdGhlIG1vZHVsZSByZXF1ZXN0ZWQuIEFsc28gZml4CisJICBBQ19DSEVDS19MSUIgdXNhZ2UsIGV4dHJhIGxpYnMgYXJndW1lbnQgd2FzCisJICBpbiB0aGUgd3JvbmcgcGxhY2UuCisKKzIwMTQtMDgtMDcgMTc6MTI6MzggKzAzMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZm9yd2FyZCBESVNDT05UIGZyb20gdXBzdHJlYW0gdG8gdGhlIG91dHB1dCBzdHJlYW1zCisJICBUaGlzIG1ha2VzIHNlbnNlIGluIERBU0ggcmV2ZXJzZSBwbGF5YmFjaywgd2hlcmUgdGhlIHVwc3RyZWFtIGRhc2hkZW11eAorCSAgd2lsbCBkb3dubG9hZCBEQVNIIHNlZ21lbnRzIGluIHJldmVyc2Ugb3JkZXIsIGJ1dCBwdXNoIHRoZWlyIGJ1ZmZlcnMKKwkgIGZvcndhcmQgdG8gcXRkZW11eCBhbmQgbWFyayBlYWNoIHNlZ21lbnQgc3RhcnQgYXMgRElTQ09OVC4gVGhpcyBuZWVkcworCSAgdG8gYmUgZm9yd2FyZGVkIGRvd25zdHJlYW0gdG8gdGhlIHBhcnNlci9kZWNvZGVyLCBvdGhlcndpc2UgaXQgd29uJ3Qgd29yay4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzQ0NDMKKworMjAxNC0wOC0xMCAxODo1NTowNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiB1c2UgcGtnLWNvbmZpZyB0byBkZXRlY3QgeDExIGFuZCBzaW1wbGlmeSBjaGVja3MKKwkgIEFDX1BBVEhfWFRSQSBtYWNybyB1bm5lY2Vzc2FyaWx5IHB1bGxzIGluIGxpYlNNIGFuZCBsaWJJQ0UuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMxMDQ3CisKKzIwMTQtMDgtMTAgMTI6MzA6MDcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHRlc3RzOiBydHAtcGF5bG9hZGluZzogYWRqdXN0IHRlc3QgZGF0YSB0byBhdm9pZCBOQUwgY2hvcHBpbmcKKwkgIC4uLiBhbmQgY29ycmVzcG9uZGluZ2x5IHVuZXhwZWN0ZWQgYnVmZmVyIHNpemVzLgorCisyMDE0LTA4LTA5IDE0OjIyOjQyICswMjAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJyYXNAaG90bWFpbC5jb20+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgc3BlZXhlbmM6IEltcHJvdmUgYW5ub3RhdGlvbiBvZiBpbnRlcm5hbCBmdW5jdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNDU0MgorCisyMDE0LTA4LTA4IDEyOjU0OjMwICswMjAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJyYXNAaG90bWFpbC5jb20+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkgIHNoYXBld2lwZTogVW5yZWYgY2FwcyBhbmQgZWxlbWVudCBhZnRlciB1c2FnZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNDQ3OAorCisyMDE0LTA4LTA5IDIwOjQ3OjMwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGltcHJvdmUgZGVidWcgbG9nZ2luZyBvZiBmb3VyY2NzCisJICBJZiB3ZSBjYW4ndCBzaG93IEFTQ0lJLCBhdCBsZWFzdCBzaG93IHRoZW0KKwkgIGluIGJpZyBlbmRpYW4gb3JkZXIuCisKKzIwMTQtMDgtMDkgMjA6NDY6MDQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogYWRkIHN1cHBvcnQgZm9yICd3bWEgJyBtYXBwaW5nIGFzIGZvdW5kIGluIHNvbWUgaXNtdiBmaWxlcworCSAgZS5nLiBUb19UaGVfTGltaXRfNzIwXzI5NjIuaXNtdgorCisyMDE0LTA4LTA5IDE4OjMxOjIwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFkZCBzdXBwb3J0IGZvciAndmMtMScgbWFwcGluZyBhcyBmb3VuZCBpbiBzb21lIGlzbXYgZmlsZXMKKwkgIGUuZy4gVG9fVGhlX0xpbWl0XzcyMF8yOTYyLmlzbXYKKworMjAxNC0wOC0wNyAxNjozNDozNiArMDIwMCAgU2ViYXN0aWFuIFJhc211c3NlbiA8c2VicmFzQGhvdG1haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJICBydHBoMjYzcHBheTogVW5yZWYgcGFkIHRlbXBsYXRlIGNhcHMgYWZ0ZXIgdXNlCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM0NDM1CisKKzIwMTQtMDgtMDggMTI6MzY6MDEgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJhc0Bob3RtYWlsLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IFVucmVmIGFsbG93ZWQgY2FwcyBhZnRlciB1c2FnZQorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczNDQ3NAorCisyMDE0LTA4LTA4IDEyOjQwOjQ5ICswMjAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJyYXNAaG90bWFpbC5jb20+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IFVucmVmIHBhZCB0ZW1wbGF0ZSBjYXBzIGFmdGVyIHVzYWdlCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM0NDc1CisKKzIwMTQtMDgtMDggMTI6NDQ6MDkgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJhc0Bob3RtYWlsLmNvbT4KKworCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2c2Vlay5jOgorCSAgbmF2c2VlazogVW5yZWYgcGVlciBwYWQgYWZ0ZXIgdXNhZ2UKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzQ0NzYKKworMjAxNC0wOC0wOCAxMjoyOTo1MiArMDIwMCAgU2ViYXN0aWFuIFJhc211c3NlbiA8c2VicmFzQGhvdG1haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogVW5yZWYgcGFkIHRlbXBsYXRlIGNhcHMgYWZ0ZXIgdXNhZ2UKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzQ0NzMKKworMjAxNC0wOC0wNSAxMTo0NzozOSArMDIwMCAgU3JpbWFudGEgUGFuZGEgPHNyaW1hbnRhQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IGFwcGVuZCBwYWNrZXRpemF0aW9uIG1vZGUgcGFyYW1ldGVyIHRvIFNEUAorCSAgQXBwZW5kIHBhY2tldGl6YXRpb24tbW9kZSBwYXJhbWV0ZXIgdG8gU0RQIGRlc2NyaXB0aW9uLgorCSAgUGFja2V0aXphdGlvbiBtb2RlIHNpZ25hbHMgdGhlIHByb3BlcnRpZXMgb2YgYW4gUlRQIHBheWxvYWQgdHlwZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzM1NTYKKworMjAxNC0wOC0wOCAwMzo1ODoxNCArMTAwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgaXNvbXA0L3F0bXV4OiBXcml0ZSBjb3JyZWN0IGZpbGUgZHVyYXRpb24gd2hlbiBnYXBzIGV4aXN0LgorCSAgV2hlbiB3cml0aW5nIG91dCBhIHRyYWsgd2l0aCBhbiBlZGl0IGxpc3QsIG1ha2Ugc3VyZSB0aGUKKwkgIG92ZXJhbGwgZmlsZSBkdXJhdGlvbiBpcyBhbHNvIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUKKwkgIGxlbmd0aGVuaW5nIG9mIHRoZSBzdHJlYW0uCisJICBBZGQgc29tZSBtb3JlIGRlYnVnIHRvIHF0ZGVtdXggdG8gd2FybiBhYm91dCBzdHJlYW1zIHRoYXQKKwkgIGFyZSBsb25nZXIgdGhhbiB0aGUgZmlsZSBhbmQgZ2V0IHRydW5jYXRlZC4KKworMjAxNC0wOC0wNCAxNTozOToxNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogUHVzaCB0aGUgY29ycmVjdCBzZWdtZW50IGluIFRDUCBtb2RlIHdoZW4gc2Vla2luZworCisyMDE0LTA4LTAzIDEyOjMzOjMyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogdW5icmVhayBhdSBhbGlnbmVkIGJ5dGUtc3RyZWFtIHBheWxvYWRpbmcKKworMjAxNC0wNy0yMiAxMzoyNDowOSArMDIwMCAgU3JpbWFudGEgUGFuZGEgPHNyaW1hbnRhQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IGFwcGVuZCBwcm9maWxlLWxldmVsLWlkIHRvIFNEUAorCSAgQXBwZW5kIHByb2ZpbGUtbGV2ZWwtaWQgdG8gU0RQIGlmIGF2YWlsYWJsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzM1MzkKKworMjAxNC0wNy0zMSAxODo0Nzo0OSArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNvbGxhYm9yYS5jb20+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogY29tbW9uOgorCSAgTWFrZWZpbGU6IEFkZCB1c2FnZSBvZiBidWlsZC1jaGVja3Mgc3RlcAorCSAgQWxsb3dzIGJ1aWxkaW5nIGNoZWNrcyB3aXRob3V0IHJ1bm5pbmcgdGhlbQorCisyMDE0LTA3LTMxIDA5OjUzOjUzIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6CisJICB4aW1hZ2VzcmM6IEZpeCB3YXJuaW5nIGFib3V0IG1pc3NpbmcgcmV0dXJuIHZhbHVlCisKKzIwMTQtMDctMjQgMTU6Mjg6MDkgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkqIHN5cy94aW1hZ2UveGltYWdldXRpbC5jOgorCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmg6CisJICB4aW1hZ2VzcmM6IEFkZCBtaXNzaW5nIHJldHVybiB2YWx1ZSB0byBCdWZmZXIgZGlzcG9zZSBmdW5jdGlvbgorCSAgRGVwZW5kaW5nIG9udCBoZSBidWlsZCwgdGhlIG1ldGhvZCBjb3VsZCByZXR1cm4gRkFMU0UsIGhlbmNlIG5ldmVyCisJICBmcmVlIHRoZSBidWZmZXJzLCBvciBhbHJlYWR5IFRSVUUgYW5kIGxlYWQgdG8gYSBjcmFzaDoKKwkgIEZpeGVzOiBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMzNjk1CisKKzIwMTQtMDctMjggMTY6NDk6MTYgKzAyMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBoaWxuQGlnYWxpYS5jb20+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ludGVybGVhdmUuYzoKKwkgIGludGVybGVhdmU6IHNldCBvdXRwdXQgY2FwcyBsYXlvdXQgdG8gaW50ZXJsZWF2ZWQKKwkgIFNldCBvdXRwdXQgY2FwcyBsYXlvdXQgaW5kZXBlbmRlbnRseSBmcm9tIGlucHV0IGNhcHMgbGF5b3V0IHdoaWNoIGNhbgorCSAgYmUgZWl0aGVyIG5vbi1pbnRlcmxlYXZlZCBvciBpbnRlcmxlYXZlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzM4NjYKKworMjAxNC0wNy0yNiAxMjowNjozOSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQG9zZy5zaXNhLnNhbXN1bmcuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IGNsZWFyIGdjb25kCisKKzIwMTQtMDctMjUgMTQ6MzA6MzMgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgUmV2ZXJ0ICJ2NGwyYnVmZmVycG9vbDogV29ya2Fyb3VuZCBlbGVtZW50cyBub3QgcmVxdWVzdGluZyBhbnkgYnVmZmVycyIKKwkgIFRoaXMgd2FzIGEgdGVtcG9yeSB3b3JrYXJvdW5kLCB3ZSBzaG91bGQgZml4IHRoZSBlbmNvZGVycyB0aGF0IGRvIG5vdAorCSAgbmVnb3RhdGlhdGUgdGhlIGFtb3VudCBvZiBidWZmZXJzIHRoZXkgbmVlZC4KKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgZDAzYmNiYTNkYjE1ZDA2ZGJkZWE2Yjc3NmE2ZjI4ZWQyZjAzMjcyYS4KKworMjAxNC0wNy0wOCAxNDozMTo1OSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBEb24ndCBzaGFyZSBvd24gcG9vbCBpZiBtaW4gZXhjZWVkIFY0TDIgY2FwYWNpdHkKKwkgIElmIHRoZSBtaW5pbXVtIHJlcXVpcmVkIGJ1ZmZlciBleGNlZWQgVjRMMiBjYXBhY2l0eSwgZG9uJ3Qgc2hhcmUgZG93bgorCSAgcG9vbC4gVGhpcyBhbGxvdyBzdXBwb3J0IHZlcnkgaGlnaCBsYXRlbmN5LCBsaWtlIHdpdGggeDI2NGVuYyBkZWZhdWx0CisJICBlbmNvZGluZyBzZXR0aW5ncy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzIyODgKKworMjAxNC0wNy0yNSAxNzo0MjoyMCArMDIwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogcXVlcnkgbWluaW11bSByZXF1aXJlZCBidWZmZXJzIGZvciBvdXRwdXQKKwkgIFNvbWUgdjRsMiBkZXZpY2VzIGNvdWxkIHJlcXVpcmUgYSBtaW5pbXVtIGJ1ZmZlcnMgZGlmZmVyZW50IGZyb20gZGVmYXVsdAorCSAgdmFsdWVzLiBSYXRoZXIgdGhhbiBibGluZGx5IHByb3Bvc2UgYSBwb29sIHdpdGggbWluLWJ1ZmZlcnMgc2V0IHRvIHRoZQorCSAgZGVmYXVsdCB2YWx1ZSwgaXQgYXNrIHRoZSBkZXZpY2UgdXNpbmcgY29udHJvbCBpb2N0bC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzM3NTAKKworMjAxNC0wNy0yMyAxODo0MDoxMCArMDIwMCAgQXVyw6lsaWVuIFphbmVsbGkgPGF1cmVsaWVuLnphbmVsbGlAcGFycm90LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiB1c2UgZGlyZWN0bHkgJ29iaicgaW5zdGVhZCBvZiAndjRsMnNpbmstPnY0bDJvYmplY3QnCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMzNjE2CisKKzIwMTQtMDctMjMgMTg6Mzk6NTAgKzAyMDAgIEF1csOpbGllbiBaYW5lbGxpIDxhdXJlbGllbi56YW5lbGxpQHBhcnJvdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJICB2NGwyOiBzZXQgZGVidWcgbWVzc2FnZXMgYWNjb3JkaW5nIHRvIGRldmljZSB0eXBlIGFuZCBJTyBtb2RlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMzNjE2CisKKzIwMTQtMDUtMjQgMTk6MDI6NTkgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBSZW1vdmUgaXNfYWN0aXZlIGNoZWNrcworCSAgVGhlc2UgY2hlY2tzIGFyZSBubyBsb25nZXIgcmVxdWlyZWQgd2l0aCByZWNlbnQgY2hhbmdlIHRvIHRoZSBidWZmZXJwb29sLiBUaGlzCisJICBzaG91bGQgYWxsb3cgY2hhbmdpbmcgdGhlIGNvbmZpZ3VhcnRpb24sIGhlbmNlIHRoZSB3YXkgZm9yd2FyZCByZW5lZ290aWF0aW9uCisJICBzdXBwb3J0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyODI2OAorCisyMDE0LTA3LTIxIDE4OjExOjE2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9sYW5nLmM6CisJICBxdGRlbXV4OiBmaXggbGFuZ3VhZ2UgY29kZSBwYXJzaW5nIGZvciAzLWxldHRlciBjb2RlcyBzdGFydGluZyB3aXRoICdhJworCSAgQW5kIGhhbmRsZSBzcGVjaWFsIHZhbHVlIGZvciAndW5zcGVjaWZpZWQnIGV4cGxpY2l0bHkuCisJICBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vbGlicmFyeS9tYWMvZG9jdW1lbnRhdGlvbi9RdWlja1RpbWUvUVRGRi9RVEZGQ2hhcDQvcXRmZjQuaHRtbAorCisyMDE0LTA3LTA4IDAyOjE4OjI3ICswMjAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAganBlZ2VuYzogQWRkIHN1cHBvcnQgZm9yIGVuY29kaW5nIGZyb20gTlYyMSBhbmQgTlYxMgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMjg3MAorCisyMDE0LTA3LTE5IDE4OjA0OjM4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDEuNC4wID09PQorCisyMDE0LTA3LTE5IDE3OjIwOjM0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS40LjAKKworMjAxNC0wNy0xOSAxNjozNTo0MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNC0wNy0xOSAxMjozMjoyMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTQtMDctMTkgMTE6MzA6MzAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IERvbid0IG92ZXJ3cml0ZSB0aGUgZmlyc3QgY29tcG9uZW50IHdpdGggdGhlIGFscGhhIHZhbHVlIGZvciBCR1J4CisJICBJbnN0ZWFkIGxlYXZlIHRoZSB4IGNvbXBvbmVudCB1bnNldCB3aGVuIGZpbGxpbmcgdGhlIGJvcmRlcnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMzMzgwCisKKzIwMTQtMDctMTYgMTc6MTg6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBQcm9wZXJseSByZXBvcnQgaW4gdGhlIENBUFMgcXVlcnkgdGhhdCB3ZSBjYW4gY29udmVydCBBRFRTPC0+UkFXCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMzMTkwCisKKzIwMTQtMDctMTMgMTY6MDU6NTYgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJhc0Bob3RtYWlsLmNvbT4KKworCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYzoKKwkgIHJndm9sdW1lOiBBdm9pZCB0YWtpbmcgdW5uZWNlc3NhcnkgcmVmcworCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMzEyMgorCisyMDE0LTA3LTEzIDE2OjA0OjIzICswMjAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJyYXNAaG90bWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkgIHJ0cGR0bWZtdXg6IEF2b2lkIHRha2luZyBhbiB1bm5lY2Vzc2FyeSByZWYKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzMxMjIKKworMjAxNC0wNy0xNSAxNjo1OTowNiArMDIwMCAgUGlvdHIgRHLEhWcgPHBpb3RyZHJhZ0BnbWFpbC5jb20+CisKKwkqIHBvL1BPVEZJTEVTLmluOgorCSAgcG86IHVwZGF0ZSBQT1RGSUxFUworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMzIwOAorCisyMDE0LTA3LTExIDEzOjM1OjEwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBGaXggY29weSB0aHJlc2hvbGQgaW1wbGVtZW50YXRpb24KKwkgIFdlIGNhbm5vdCBhbGxvY2F0ZSBuZXcgYnVmZmVyIGluIGFjcXVpcmUsIG90aGVyd2lzZSB0aGUgYmFzZSBjbGFzcworCSAgaXMgbm90IGF3YXJlIGFuZCBnZXQgY29uZnVzZWQuIEluc3RlYWQsIGNvcHkgaW4gX3Byb2Nlc3MoKS4gVGhpcyBsZWFkcworCSAgdG8gY3Jhc2ggb24gZmluYWxpemUuCisJICBGaXhlcyByZWdyZXNzaW9uLCBzZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMjkxMgorCis9PT0gcmVsZWFzZSAxLjMuOTEgPT09CisKKzIwMTQtMDctMTEgMTE6Mzg6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjMuOTEKKworMjAxNC0wNy0xMSAxMDo1ODowOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNC0wNy0xMCAxODoxMToyMCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmFsbG9jYXRvcjogVXNlIHFkYXRhIGluc3RlYWQgb2YgcGFyZW50aW5nIHRvIERtYWJ1Zk1lbW9yeQorCSAgUGFyZW50aW5nIFY0bDJNZW1vcnkgdG8gRG1hYnVmTWVtb3J5IHdhcyBpbiBjb25mbGljdCB3aXRoIHJlY2VudAorCSAgb3B0aW1pemF0aW9uIGluIERtYWJ1Zk1lbW9yeSB0byBhdm9pZCBkdXAoKSwgYW5kIGRpZG4ndCB3b3JrIHdpdGgKKwkgIG1lbW9yeSBzaGFyaW5nLiBJbnN0ZWFkLCB1c2UgYSBxZGF0YSBhbmQgaXQncyBkZXN0cm95IG5vdGlmeS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzA0NDEKKworMjAxNC0wNy0xMSAwODo1MjozOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTQtMDctMDggMTc6NTA6NDcgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBXb3JrYXJvdW5kIGVsZW1lbnRzIG5vdCByZXF1ZXN0aW5nIGFueSBidWZmZXJzCisJICBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgZWxlbWVudCB0aGF0IGRvbid0IHJlcXVlc3QgYnVmZmVycyB3aGVuCisJICB0aGV5IHNob3VsZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzIyODgKKworMjAxNC0wNy0wNiAxMToyNzozNiArMDIwMCAgU2ViYXN0aWFuIFJhc211c3NlbiA8c2VicmFzQGhvdG1haWwuY29tPgorCisJKiB0ZXN0cy9pY2xlcy92aWRlb2Nyb3AtdGVzdC5jOgorCSAgdGVzdHM6IGZpeCBwaXBlbGluZSBsZWFrIGluIHZpZGVvY3JvcCB0ZXN0CisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMyOTc2CisKKzIwMTQtMDctMDYgMTE6MjY6NDYgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJhc0Bob3RtYWlsLmNvbT4KKworCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1ydHBhdXguYzoKKwkgIGV4YW1wbGVzOiBjbGllbnQtcnRwYXV4OiBSZWxlYXNlIHJlZmVyZW5jZSB0byBwYXJlbnQgd2hlbiBkb25lCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMyOTc2CisKKzIwMTQtMDctMTAgMTc6MTk6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGZpeCBxdWVyeSBsZWFrCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMzMDAzCisKKzIwMTQtMDctMTAgMTI6MTA6NDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJICB3YXZlbmM6IFJldHVybiBub3QtbmVnb3RpYXRlZCBpZiB3ZSBnb3Qgbm8gY2FwcyBvciBjYXBzIG5lZ290aWF0aW9uIGZhaWxlZAorCSAgQW5kIGRvIGl0IGFsd2F5cywgbm90IGluc2lkZSBhIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKCkuCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMjkzOQorCisyMDE0LTA3LTA4IDEzOjM0OjI4IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IEVuc3VyZSBpbnRlcm5hbCBwb29sIGFjdGl2YXRpb24KKwkgIEJlZm9yZSB3ZSB3b3VsZCBoaXQgYW4gYXNzZXJ0aW9uICInZ3N0X2J1ZmZlcl9wb29sX2lzX2FjdGl2ZSAoYnBvb2wpJyBmYWlsZWQiCisJICBpZiB0aGUgaW50ZXJuYWwgcG9vbCB3YXMgbm90IHVzZWQgdG8gcHVzaCBidWZmZXIgZG93bnN0cmVhLCBoZW5jZSBub3QKKwkgIGdpdmVuIHRvIHRoZSBiYXNlY2xhc3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMyOTEyCisKKzIwMTQtMDctMDQgMjA6MjI6MTAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBmaXggZG91YmxlIHVubG9jayBpbiBzZWdtZW50IHNlZWsgc2VnbWVudCBjb2RlIHBhdGgKKwkgIFdlIG9ubHkgd2FudCB0byB1bmxvY2sgaWYgd2UgcHVzaCBhbiBldmVudCBkb3duc3RyZWFtIGFuZAorCSAganVtcCB0byBkb25lX3VubG9jayBsYWJlbCBhZnRlcndhcmRzLiBXZSB3b3VsZCBhbHNvIHVubG9jaworCSAgaW4gY2FzZSBvZiBhIHNlZ21lbnQgc2VlayBhbmQgdGhlbiB1bmxvY2sgYWdhaW4gbGF0ZXIsIGFuZAorCSAgbm90aGluZyBnb29kIGNhbiBjb21lIG9mIHRoYXQuCisJICAoVGhpcyBjb2RlIGxvb2tzIGEgYml0IGRvZGd5IGFueXdheSB0aG91Z2gsIHNob3VsZG4ndCBpdAorCSAgYWxzbyBiYWlsIG91dCB3aXRoIEZMT1dfRU9TIGhlcmUgaW4gY2FzZSBvZiBhIHNlZ21lbnQgc2VlaworCSAgc2NlbmFyaW8sIGp1c3Qgd2l0aG91dCB0aGUgZXZlbnQ/KQorCisyMDE0LTA3LTA0IDE5OjQ1OjU1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgdGVzdHM6IHF0bXV4OiBzdXBwcmVzcyBnbGliIGNyaXRpY2FscyBjYXVzZWQgYnkgdGVzdGluZyBkZXByZWNhdGVkIGR0cyBtZXRob2RzCisKKzIwMTQtMDctMDQgMDM6MjE6MzAgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJhc0Bob3RtYWlsLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBhdmlkZW11eCwgd2F2cGFyc2U6IFByaW50IGludmFsaWQgZm91cmNjIGluIGhleAorCSAgUHJldmlvdXNseSB0aGlzIHdhcyBwcmludGVkIGFzIGNoYXJhY3RlcnMgd2hpY2ggY2F1c2VkIGxhdGVyIHByb2Nlc3NpbmcKKwkgIG9mIHRoZSBlcnJvciBtZXNzYWdlIHRvIHNvbWV0aW1lcyB3YXJuIGFib3V0IG5vbi1VVEYtOCBjaGFyYWN0ZXJzLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMjcxNAorCisyMDE0LTA3LTAzIDE1OjIxOjE4IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IFBvb2wgbWlnaHQgYmUgTlVMTCBpbiBkZWNpZGUgYWxsb2NhdGlvbgorCSAgSWYgc3BlY2lhbCBzdHJpZGUgaXMgbmVlZGVkIGFuZCBkb3duc3RyZWFtIGRvbid0IHN1cHBvcnQgVmlkZW9NZXRhLAorCSAgcG9vbCBtaWdodCBiZSBOVUxMIGluIG9yZGVyIHRvIGxldCB0aGUgYmFzZWNsYXNzIGNyZWF0ZSBhIGdlbmVyaWMKKwkgIHBvb2zCrS4gVGhpcyB3b3VsZCBsZWFkIHRvIGFzc2VydGlvbiB3aXRoIG9uIEV4eW5vcyB3aXRoOgorCSAgZ3N0LWxhdW5jaC0xLjAgLXYgZmlsZXNyYyBsb2NhdGlvbj1tb3YgISBxdGRlbXV4ICEgaDI2NHBhcnNlICEgXAorCSAgdjRsMnZpZGVvOGRlYyAhIGZha2VzaW5rCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMyNzA3CisKKzIwMTQtMDctMDMgMTU6Mjk6NTQgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICB2NGwyYnVmZmVycG9vbDogSGFuZGxlIEZEIGVycm9yIGR1cmluZyBwb2xsCisJICBUaGlzIHdpbGwgZW5zdXJlIHdlIGZhaWwgZWFybGllciBpZiBzb21ldGhpbmcgdW5yZWNvdmVyYWJsZQorCSAgaGFwcGVucy4KKworMjAxNC0wNy0wMyAxNToyODo0NSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkgIHY0bDJidWZmZXJwb29sOiBXYWl0IGJlZm9yZSBwb2xsaW5nIGlmIHF1ZXVlIGlzIGVtcHR5CisJICBJbiBrZXJuZWwgYmVmb3JlIDMuMTcsIHBvbGxpbmcgZHVyaW5nIHF1ZXVlIHVuZGVycnVuIHdvdWxkIHVuYmxvY2sgcmlnaHQKKwkgIGF3YXkgYW5kIHRyaWdnZXIgUE9MTEVSUi4gQXMgd2UgYXJlIG5vdCBoYW5kbGluZyBQT0xMRVJSLCB3ZSB3b3VsZCBlbmR1cAorCSAgYmxvY2tpbmcgaW4gRFFCVUYgY2FsbCwgd2hpY2ggd29uJ3QgYmUgdW5ibG9ja2VkIGNvcnJlY3RseSB3aGVuIGdvaW5nCisJICB0byBOVUxMIHN0YXRlLiBBIGRlYWRsb2NrIGF0IHN0YXJ0IGNhdXNlZCBieSBsb2NraW5nIGVycm9yIGluIGxpYnY0bDIgd2FzCisJICBhbHNvIHNlZW4gYmVmb3JlIHRoaXMgcGF0Y2guIEluc3RlYWQsIHdlIHdhaXQgdW50aWwgdGhlIHF1ZXVlIGlzIG5vIGxvbmdlcgorCSAgZW1wdHkgYmVmb3JlIHBvbGxpbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMxMDE1CisKKzIwMTQtMDctMDIgMTY6MDE6NDcgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggZm9yIG1pa2V5IGFwaSBjaGFuZ2UKKworMjAxNC0wNi0zMCAxMDoyOTo1NCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogZml4IHByb2JpbmcgYW5kIGVudW1lcmF0aW9uIG9mIHN0ZXB3aXNlIGZyYW1lIHNpemVzCisJICBUaGUgY29kZSBlbnVtZXJhdGluZyBTVEVQV0lTRSBmcmFtZXNpemVzIHdvdWxkIHN0YXJ0IGZyb20KKwkgIChtaW5fdywgbWluX2gpIGFuZCB0aGVuIGFkZCAoc3RlcF93LCBzdGVwX2gpIHRvIGdldCB0aGUKKwkgIG5leHQgZnJhbWVzaXplLiBIb3dldmVyLCBpdCBzaG91bGQgcmVhbGx5IGFsbG93IGFueSB3aWR0aAorCSAgZnJvbSBtaW5fdyB0byBtYXhfdyB3aXRoIHN0ZXBfdyBhbmQgc2FtZSBmb3IgaGVpZ2h0cy4KKwkgIFNlY29uZGx5LCB3ZSB3b3VsZCBhZGQgYW5kIHByb2JlIGVhY2ggaW5kaXZpZHVhbCBzdGVwcGVkCisJICBmcmFtZSBzaXplIHRvIHRoZSBjYXBzIGFzIHNlcGFyYXRlIHN0cnVjdHVyZSwgd2hpY2ggd291bGQKKwkgIGxlYWQgdG8gaHVuZHJlZHMgaWYgbm90IHRob3VzYW5kcyBvZiBzdHJ1Y3RzIGVuZGluZyB1cCBpbgorCSAgdGhlIHByb2JlZCBjYXBzLiBVc2UgaW50ZWdlciByYW5nZXMgd2l0aCBzdGVwcyBpbnN0ZWFkLgorCSAgVGhpcyB3YXMgcGFydGljdWxhcmx5IG5vdGljYWJsZSB3aXRoIHRoZSBSYXNwYmVycnkgUGkgQ2FtLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNDUyMQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMjQ1OAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNjUyMQorCisyMDE0LTA2LTI3IDExOjMzOjA2ICswMTAwICBEYW5pZWwgRHJha2UgPGRyYWtlQGVuZGxlc3NtLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogZHJvcCB3b3JrYXJvdW5kIGZvciBtaXNiZWhhdmluZyBUUllfRk1UCisJICBUaGlzIHdvcmthcm91bmQgZnJvbSAyMDExIHdhcyBjYXVzaW5nIDI1IFNfRk1UIGlvY3RscyB0byBiZSBzZW50CisJICB0byBteSBVVkMgd2ViY2FtIGZyb20gdW5kZXIgZ3N0X3Y0bDJfb2JqZWN0X2dldF9jYXBzIGFzIGl0IHByb2JlcworCSAgYWxsIHRoZSBmb3JtYXRzLiBJbiB0b3RhbCwgdGhpcyBhZGRzIHVwIHRvIGFib3V0IDUgc2Vjb25kcyBvZgorCSAgZXhlY3V0aW9uIHRpbWUsIG9yIGEgMTAgc2Vjb25kIGRlbGF5IHdoaWxlIHN0YXJ0aW5nIHVwIGNoZWVzZS4KKwkgIFRoZXNlIGlvY3RscyBjb21lIGZyb20gYSB3b3JrYXJvdW5kIGZyb20gMjAxMSB3aGVyZSBUUllfRk1UIG1pZ2h0CisJICBtYWtlIGNoYW5nZXMgdG8gaGFyZHdhcmUgc2V0dGluZ3MsIHNvIFNfRk1UIHdhcyB1c2VkIHRvIHJlc3RvcmUKKwkgIHRoZSBvcmlnaW5hbCBjb25maWc6CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ5MDY3CisJICBUaGUgZHJpdmVyIGJ1ZyBpcyBub3cgYXNzdW1lZCBmaXhlZC4gUmVtb3ZlIHRoZSB3b3JrYXJvdW5kIHRvIGZpeCB0aGUKKwkgIGxvbmcgc3RhcnR1cCBkZWxheS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzIzMjYKKworMjAxNC0wNy0wMSAxMjo1MDozMSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiByZXNldCBRb1Mgb24gc2VnbWVudCBldmVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMjU0MAorCisyMDE0LTA3LTAxIDE1OjE0OjM0ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBzZW5kIGdhcCBldmVudHMgaW5zdGVhZCBvZiBzZWdtZW50IHRyaWNrcworCSAgVGhpcyBmaXhlcyBtaXNzaW5nIGZyYW1lcyBmcm9tIGJlaW5nIHRpbWUgc2tpcHBlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzIzNzIKKworMjAxNC0wNi0zMCAwMDowMDozMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogRml4IG1lbW9yeSBsZWFrcyBpbiB1bml0IHRlc3QKKworMjAxNC0wNi0yOSAyMzo1NToxOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IERvbid0IGxlYWsgY2FwcworCisyMDE0LTA2LTI5IDIwOjAyOjE0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBGaXggY29tcGlsZXIgd2FybmluZyB3aGVuIGNvbXBpbGluZyB3aXRoIEdfRElTQUJMRV9BU1NFUlQKKworMjAxNC0wNi0yOSAxOTo1OTo1MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBydHBzc3JjZGVtdXg6IEZpeCBjb21waWxlciB3YXJuaW5nIHdoZW4gY29tcGlsaW5nIHdpdGggR19ESVNBQkxFX0FTU0VSVAorCisyMDE0LTA2LTI5IDE5OjU3OjU3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogRml4IGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIHdpdGggR19ESVNBQkxFX0FTU0VSVAorCisyMDE0LTA2LTI5IDE5OjU0OjQ0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXggY29tcGlsZXIgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCBHX0RJU0FCTEVfQVNTRVJUCisKKzIwMTQtMDYtMjkgMTc6MDU6MTMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWRldmljZXByb3ZpZGVyLmM6CisJICBwdWxzZTogZml4IGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIHdpdGggLURHX0RJU0FCTEVfQVNTRVJUCisJICBDb21waWxlciBjb21wbGFpbnMgYWJvdXQgdW5pbml0aWFsaXNlZCB2YXJpYWJsZXMgaW4gdGhlIGltcG9zc2libGUKKwkgICdkZWZhdWx0JyBjb2RlIHBhdGggaW4gZGV2aWNlIHByb3ZpZGVyIHNvdXJjZS9zaW5rIHN3aXRjaC1jYXNlLgorCisyMDE0LTA2LTI5IDE3OjAzOjE3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyZGV2aWNlcHJvdmlkZXIuYzoKKwkgIHY0bDI6IGZpeCBjb21waWxlciB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyB3aXRoIC1ER19ESVNBQkxFX0FTU0VSVAorCSAgQ29tcGlsZXIgY29tcGxhaW5zIGFib3V0IHVuaW5pdGlhbGlzZWQgdmFyaWFibGVzIGluIHRoZSBpbXBvc3NpYmxlCisJICAnZGVmYXVsdCcgY29kZSBwYXRoIGluIGRldmljZSBwcm92aWRlciBzb3VyY2Uvc2luayBzd2l0Y2gtY2FzZS4KKworMjAxNC0wNi0yOCAxNzo0MDo0NSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FwYXJzZS5jOgorCSAgdGVzdHM6IG1hdHJvc2thcGFyc2U6IGZhaWwgb24gZXJyb3JzIGFuZCBkaXNhYmxlIHB1bGwgbW9kZSB0ZXN0CisJICBBY3R1YWxseSBsb29rIGZvciBlcnJvciBtZXNzYWdlcyBvbiB0aGUgYnVzIGFuZCBmYWlsIGlmIHRoZXJlCisJICBpcyBvbmUgYmVmb3JlIHRoZSBFT1MgbWVzc2FnZS4gRGlzYWJsZSBwdWxsIG1vZGUgdGVzdCB3aGljaCBpcworCSAgcG9pbnRsZXNzIGFzIGxvbmcgYXMgbWF0cm9za2FwYXJzZSBvbmx5IHN1cHBvcnRzIHB1c2ggbW9kZQorCSAgKHB1bGwgbW9kZSBzdXBwb3J0IGhhcyBub3QgYmVlbiBwb3J0ZWQgb3ZlciB0byAxLjApLgorCisyMDE0LTA2LTI4IDE3OjM3OjIzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thcGFyc2U6IGRvbid0IGVycm9yIG91dCBpZiB0aGVyZSdzIG5vdCBlbm91Z2ggZGF0YSBpbiB0aGUgYWRhcHRlcgorCSAgZ3N0X21hdHJvc2thX3BhcnNlX3Rha2UoKSB3b3VsZCByZXR1cm4gRkxPV19FUlJPUiBpbnN0ZWFkIG9mCisJICBGTE9XX0VPUyBpbiBjYXNlIHRoZXJlJ3MgbGVzcyBkYXRhIGluIHRoZSBhZGFwdGVyIHRoYW4gcmVxdWVzdGVkLAorCSAgYmVjYXVzZSBidWZmZXIgaXMgTlVMTCBpbiB0aGF0IGNhc2Ugd2hpY2ggdHJpZ2dlcnMgdGhlIGVycm9yCisJICBjb2RlIHBhdGguIFRoaXMgbWFkZSB0aGUgdW5pdCB0ZXN0IGZhaWwgKG9jY2FzaW9uYWxseSBhdCBsZWFzdCwKKwkgIGJlY2F1c2Ugb2YgYSBidWcgaW4gdGhlIHVuaXQgdGVzdCB0aGVyZSdzIGEgcmFjZSBhbmQgaXQgd291bGQKKwkgIGhhcHBlbiBvbmx5IHNwb3JhZGljYWxseSkuCisKKzIwMTQtMDYtMjggMTY6NTM6NTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJvcmMtZGlzdC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy1kaXN0Lmg6CisJICB2aWRlb21peGVyOiBVcGRhdGUgZGlzdCBnZW5lcmF0ZWQgT1JDIGZpbGVzCisKKzIwMTQtMDYtMjggMTY6NDg6MTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL2dzdGNtcy5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvZ3N0Y21zLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb2NvbnZlcnQuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvY29udmVydC5oOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy5vcmM6CisJICB2aWRlb21peGVyOiBVcGRhdGUgdmlkZW9jb252ZXJ0IGNvZGUgZnJvbSAtYmFzZQorCSAgQW5kIGFsc28gcmVuYW1lIHRoZSByZW1haW5pbmcgc3ltYm9scyB0byBwcmV2ZW50IGNvbmZsaWN0cworCSAgZHVyaW5nIHN0YXRpYyBsaW5raW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyODQ0MworCisyMDE0LTA2LTI4IDEzOjAxOjQ2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkgIGF1dG92aWRlb3NyYzogdXNlIHZpZGVvdGVzdHNyYyBhcyBmYWxsYmFjayBlbGVtZW50IGluc3RlYWQgb2YgZmFrZXNyYworCSAgZmFrZXNyYyBkb2Vzbid0IGFubm91bmNlIHZpZGVvIGNhcHMsIHNvIG1vc3QgdmlkZW8gcGlwZWxpbmVzIHdpbGwKKwkgIGp1c3QgZXJyb3Igb3V0IHdpdGggbm90LW5lZ290aWF0ZWQgaWYgYSBmYWxsYmFjayBlbGVtZW50IGlzIGNyZWF0ZWQuCisKKzIwMTQtMDYtMjggMTI6NDQ6MzEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2RldGVjdC5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2RldGVjdC5oOgorCSAgYXV0b2F1ZGlvc3JjOiB1c2UgYXVkaW90ZXN0c3JjIGFzIGZhbGxiYWNrIGVsZW1lbnQgaW5zdGVhZCBvZiBmYWtlc3JjCisJICBmYWtlc3JjIGRvZXNuJ3QgYW5ub3VuY2UgYXVkaW8gY2Fwcywgc28gbW9zdCBhdWRpbyBwaXBlbGluZXMgd2lsbAorCSAganVzdCBlcnJvciBvdXQgd2l0aCBub3QtbmVnb3RpYXRlZCBpZiBhIGZhbGxiYWNrIGVsZW1lbnQgaXMgY3JlYXRlZC4KKworPT09IHJlbGVhc2UgMS4zLjkwID09PQorCisyMDE0LTA2LTI4IDExOjIxOjE1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjMuOTAKKworMjAxNC0wNi0yOCAxMTowODozMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNC0wNi0yNiAxNDo1Mjo1NyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL01ha2VmaWxlLmFtOgorCSogZXh0L3B1bHNlL3BsdWdpbi5jOgorCSogZXh0L3B1bHNlL3B1bHNlZGV2aWNlcHJvdmlkZXIuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZWRldmljZXByb3ZpZGVyLmg6CisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJkZXZpY2Vwcm92aWRlci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmRldmljZXByb3ZpZGVyLmg6CisJICBSZW5hbWUgR3N0RGV2aWNlTW9uaXRvciB0byBHc3REZXZpY2VQcm92aWRlcgorCisyMDE0LTA2LTI0IDA5OjE0OjQwICswNTMwICBSYXZpIEtpcmFuIEsgTiA8cmF2aS5raXJhbkBzYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBBZGQgdW5pdCB0ZXN0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMyMTQ0CisKKzIwMTQtMDYtMTYgMTE6MzU6MzkgKzAyMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRzYXVuaWVyQGdub21lLm9yZz4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IERlY2xhcmUgYXMgQ29tcG9zaXRvciBpbiAna2xhc3MnCisKKzIwMTQtMDYtMjYgMTM6NTA6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBmaXggc3BlZXggY2FwcworCSAgRGVjb2RlciBjb21wbGFpbnMgYWJvdXQgIm5vdGlmaWNhdGlvbjogSW52YWxpZCBtb2RlIGVuY291bnRlcmVkLgorCSAgVGhlIHN0cmVhbSBpcyBjb3JydXB0ZWQiIHRob3VnaCwgZXZlbiBpZiBpdCB3b3Jrcywgc28gdGhlcmUncworCSAgcHJvYmFibHkgc29tZXRoaW5nIHdyb25nIHdpdGggdGhlIGdlbmVyYXRlZCBjb2RlYyBoZWFkZXJzLgorCisyMDE0LTA2LTI2IDEzOjQzOjMzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBmaXggc3BlZXggaW4gRkxWCisJICBTcGVleCBpbiBGTFYgaXMgYWx3YXlzIG1vbm8gQCAxNmtIeiwgc2VlCisJICBodHRwOi8vZG93bmxvYWQubWFjcm9tZWRpYS5jb20vZjR2L3ZpZGVvX2ZpbGVfZm9ybWF0X3NwZWNfdjEwXzEucGRmCisJICBzZWN0aW9uIEUuNC4yLjE6ICJJZiB0aGUgU291bmRGb3JtYXQgaW5kaWNhdGVzIFNwZWV4LCB0aGUgYXVkaW8gaXMKKwkgIGNvbXByZXNzZWQgbW9ubyBzYW1wbGVkIGF0IDE2IGtIeiwgdGhlIFNvdW5kUmF0ZSBzaGFsbCBiZSAwLCB0aGUKKwkgIFNvdW5kU2l6ZSBzaGFsbCBiZSAxLCBhbmQgdGhlIFNvdW5kVHlwZSBzaGFsbCBiZSAwIgorCSAgQWxzbyBzZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MzYyMgorCisyMDE0LTA2LTI2IDA1OjE5OjU3ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBpc29tcDQ6IEFkZCBvYmplY3QgdHlwZSBpZCBhbmQgZm91cmNjIGZvciBEVFMvRFRTLUhECisJICBFbmFibGVzIHBsYXliYWNrIGZvciBmaWxlcyB3aXRoIERUUyBhdWRpbyB0cmFja3MuCisJICBBbHNvIGFkZCBhbiBleHRyYSBBQy0zIHZhcmlhbnQgZm91cmNjIGZyb20gTmVybworCisyMDE0LTAzLTEzIDEwOjM1OjMwICswMTAwICBEYXZpZCBGZXJuYW5kZXogPGQuZmVybmFuZGV6bG9wQGdtYWlsLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXIyOiBTb2x2ZSBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiBzcmMgY2FwcyBhcmUgY29uZmlndXJlZAorCSAgQ2hhbmdlIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIE5VTEwgd2hpbGUgaG9sZGluZyB0aGUgbG9jayB0byBhdm9pZAorCSAgcmFjZSBjb25kaXRpb25zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAxMTEwCisKKzIwMTQtMDYtMjUgMTQ6MzQ6MjEgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogaW1wcm92ZSBTUiBwYWNrZXQgaGFuZGxpbmcKKwkgIEltcGxlbWVudCAzIGRpZmZlcmVudCBjYXNlcyBmb3IgaGFuZGxpbmcgdGhlIFNSOgorCSAgMSkgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggdGltaW5nIGluZm9ybWF0aW9uIHRvIGhhbmRsZSB0aGUgU1IgcGFja2V0IGFuZAorCSAgd2UgbmVlZCB0byB3YWl0IGEgbGl0dGxlIGZvciBtb3JlIFJUUCBwYWNrZXRzLiBJbiB0aGF0IGNhc2Ugd2Uga2VlcAorCSAgdGhlIFNSIHBhY2tldCBhcm91bmQgYW5kIHJldHJ5IHdoZW4gd2UgZ2V0IGFuIFJUUCBwYWNrZXQgaW4gdGhlCisJICBjaGFpbiBmdW5jdGlvbi4KKwkgIDIpIHRoZSBTUiBwYWNrZXQgaGFzIGEgdG9vIG9sZCB0aW1lc3RhbXAgYW5kIHNob3VsZCBiZSBkaXNjYXJkZWQuIEl0IGlzCisJICBsYWJlbGVkIGludmFsaWQgYW5kIHRoZSBsYXN0X3NyIGlzIGNsZWFyZWQuCisJICAzKSB0aGUgU1IgcGFja2V0IGlzIG9rIGFuZCB0aGVyZSBpcyBlbm91Z2ggdGltaW5nIGluZm9ybWF0aW9uLCBwcm9jZWVkCisJICB3aXRoIHByb2Nlc3NpbmcgdGhlIFNSIHBhY2tldC4KKwkgIEJlZm9yZSB0aGlzIHBhdGNoLCBjYXNlIDIpIGFuZCAxKSB3ZXJlIGhhbmRsZWQgaW4gdGhlIHNhbWUgd2F5LAorCSAgcmVzdWx0aW5nIHRoYXQgU1IgcGFja2V0cyB3aXRoIHRvbyBvbGQgdGltZXN0YW1wcyB3ZXJlIGNoZWNrZWQgb3ZlciBhbmQKKwkgIG92ZXIgYWdhaW4gZm9yIGVhY2ggUlRQIHBhY2tldC4KKworMjAxNC0wNi0yNCAxMDo0NzozMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc2luay5jOgorCSAgdGVzdHM6IGFkZCB1ZHBzaW5rIHRlc3QgdG8gY2hlY2sgY2xpZW50IGFkZC9yZW1vdmUKKworMjAxNC0wNi0yMyAxNjoxMzoyNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc2luay5jOgorCSAgdGVzdHM6IHBvcnQgdWRwc2luayB0ZXN0cyB0byAxLjAKKwkgIFRoZXkgYWxsIHNlZW0gYSBiaXQgcG9pbnRsZXNzIHRob3VnaC4KKworMjAxNC0wNi0yMyAxOTo1NToyOSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogQWRkIFVZVlkgZm9ybWF0CisKKzIwMTQtMDYtMDYgMTE6MjA6MjEgKzAyMDAgIE1pZ3VlbCBQYXLDrXMgRMOtYXogPG1wYXJpc2RpYXpAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIGdzdHJ0cHNzcmNkZW11eDogbWFuYWdlIHNzcmMgb2YgUlRDUCBSUiBwYWNrZXRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMxMzI0CisKKzIwMTQtMDYtMjMgMjA6NTM6NTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IFVwZGF0ZSBvZmZzZXQgYWZ0ZXIgcGFyc2luZyBhZHRsIGNodW5rCisJICBPdGhlcndpc2Ugd2Ugd2lsbCBwYXJzZSBpdCBvdmVyIGFuZCBvdmVyIGFnYWluIHdpdGhvdXQgZXZlcgorCSAgZ2V0dGluZyBwYXN0IGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMTUzMworCisyMDEzLTA3LTA3IDIwOjE4OjI3ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IHJlbW92ZSBsZWdhY3kgY29kZSBmb3IgcGFzc2luZyBhIHdpbmRvdyBoYW5kbGUKKwkgICJoYXZlLW5zLXZpZXciIGFuZCB0aGUgImVtYmVkIiBwcm9wZXJ0eSB3YXMga2VwdCBpbiAwLjEwIGZvcgorCSAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYnV0IGl0J3Mgbm8gbG9uZ2VyIHVzZWQgaW4gZmF2b3Igb2YKKwkgIHRoZSBHc3RWaWRlb092ZXJsYXkgaW50ZXJmYWNlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAzNzUzCisKKzIwMTQtMDYtMjIgMTk6MzY6MTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQKKworMjAxNC0wNi0yMiAxOToyNjowMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYWRlbXV4OiBEb24ndCBjYWxsIEdTVF9ERUJVR19PQkpFQ1QoKSBhbmQgb3RoZXIgbWFjcm9zIHdpdGggbm9uLUdPYmplY3Qgb2JqZWN0cworCSAgSXQgd2lsbCBjcmFzaCB3aXRoIGxhdGVzdCBHTGliIEdJVCBhbmQgd2FzIG5ldmVyIHN1cHBvc2VkIHRvIHdvcmsgYmVmb3JlCisJICBlaXRoZXIuCisKKz09PSByZWxlYXNlIDEuMy4zID09PQorCisyMDE0LTA2LTIyIDE4OjA4OjAzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFsczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS4zLjMKKworMjAxNC0wNi0yMiAxNzozNjoyOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxNC0wNi0yMiAxNDoyNDoyNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTQtMDYtMjEgMDE6MzI6MDMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWRldmljZW1vbml0b3IuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJkZXZpY2Vtb25pdG9yLmM6CisJICBwdWxzZSwgdjRsMjogdXBkYXRlIGZvciBkZXZpY2UgImtsYXNzIiAtPiAiZGV2aWNlLWNsYXNzIiByZW5hbWUKKworMjAxNC0wNi0yMCAxMjoyMTowNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazogb3B0aW1pc2F0aW9uOiBhdm9pZCB1bm5lY2Vzc2FyeSBtZW1vcnkgcmVmL3VucmVmcworCSAgV2Uga25vdyB0aGUgYnVmZmVyIHdpbGwgc3RheSB2YWxpZCBhbmQgd2Ugd2lsbCBhbHNvIG5vdAorCSAgbW9kaWZ5IHRoZSBidWZmZXIsIHdlIGp1c3Qgd2FudCB0byBzZW5kIG91dCB0aGUgZGF0YS4KKworMjAxNC0wNi0xOSAxNDo1OTo0OCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICBtdWx0aXVkcHNpbms6IGF2b2lkIHNvbWUgdW5uZWNlc3NhcnkgcnVuLXRpbWUgdHlwZSBjaGVja3MKKworMjAxNC0wNi0xOSAxNjoxNzoyMyArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHBhc3MgdGhlIHN0cmVhbSBpZCB3aGVuIGFza2luZyBmb3IgY3J5cHRvIHBhcmFtcworCSAgVGhpcyB3YXkgdGhlIGFwcCBjYW4gY2hvb3NlIGRpZmZlcmVudCBwYXJhbWV0ZXJzIGZvciBlYWNoIHN0cmVhbS4KKworMjAxNC0wNS0yMCAxNDo1ODowNyAtMDcwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1w6kgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IGFkZCBzdXBwb3J0IGZvciBrZXkgbGVuZ3RoIHBhcmFtZXRlcnMKKwkgIFRoaXMgcGF0Y2ggYWRkcyBzdXBwb3J0cyBmb3IgdGhlIGluY29taW5nIGtleSBtYW5hZ2VtZW50IHBhcmFtZXRlcnMgZm9yCisJICBlbmNyeXB0aW9uIGFuZCBhdXRoZW50aWNhdGlvbiBrZXkgbGVuZ3Rocy4KKwkgIEl0IGFsc28gYWRkcyBhIG5ldyBzaWduYWwgcmVxdWVzdC1ydGNwLWtleSB0aGF0IGFsbG93cyB0aGUgdXNlciB0bworCSAgcHJvdmlkZSB0aGUgY3J5cHRvIHBhcmFtZXRlcnMgYW5kIGtleSBmb3IgdGhlIFJUQ1Agc3RyZWFtLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMDQ3MworCisyMDE0LTA2LTE5IDE1OjI1OjAxICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5jOgorCSAgdnA4ZGVwYXk6IGZpeCBoZWFkZXIgc2l6ZSBjaGVja2luZworCSAgVXNlIGEgZGlmZmVyZW50IHZhcmlhYmxlIG5hbWUgdG8gbWFrZSBpdCBjbGVhciB0aGF0IHdlIGFyZSBjYWxjdWxhdGluZworCSAgdGhlIGhlYWRlciBzaXplLgorCSAgQ29ycmVjdGx5IGNoZWNrIHRoYXQgd2UgaGF2ZSBlbm91Z2ggYnl0ZXMgdG8gcmVhZCB0aGUgaGVhZGVyIGJpdHMuIFdlCisJICB3ZXJlIGNoZWNraW5nIGlmIHRoZXJlIHdlcmUgNSBieXRlcyBhdmFpbGFibGUgaW4gdGhlIGhlYWRlciB3aGlsZSB3ZQorCSAgb25seSBuZWVkZWQgMywgY2F1c2luZyB0aGUgcGFja2V0IHRvIGJlIGRpc2NhcmRlZCBhcyB0b28gc21hbGwuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIzNTk1CisKKzIwMTQtMDUtMjAgMTI6Mzk6MzEgKzAyMDAgIEd1aWxsYXVtZSBEZXNtb3R0ZXMgPGd1aWxsYXVtZS5kZXNtb3R0ZXNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5oOgorCSAgcnRwaDI2NHBheTogcHJvcGFnYXRlIHRoZSBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCBmbGFnCisJICBTaW1pbGFybHkgdG8gd2hhdCB3ZSBkaWQgd2l0aCB0aGUgREVMVEFfVU5JVCBmbGFnLCB0aGlzIHBhdGNoCisJICBwcm9wYWdhdGVzIHRoZSBESVNDT05UIGZsYWcgdG8gdGhlIGZpcnN0IFJUUCBwYWNrZXQgYmVpbmcgdXNlZCB0byB0cmFuc2ZlciBhCisJICBESVNDT05UIGJ1ZmZlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzA1NjMKKworMjAxNC0wNS0wNiAxNzo0MjoxNCArMDIwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBydHBoMjY0cGF5OiBwcm9wYWdhdGUgdGhlIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUIGZsYWcKKwkgIERvd25zdHJlYW0gZWxlbWVudHMgbWF5IGJlIGludGVyZXN0ZWQga25vd2luZyBpZiBhIFJUUCBwYWNrZXQgaXMgdGhlIHN0YXJ0CisJICBvZiBhIGtleSBmcmFtZSAodG8gaW1wbGVtZW50IGEgUlRQIGV4dGVuc2lvbiBhcyBkZWZpbmVkIGluIHRoZQorCSAgT05WSUYgU3RyZWFtaW5nIFNwZWMgZm9yIGV4YW1wbGUpLgorCSAgV2UgZG8gdGhpcyBieSBjaGVja2luZyB0aGUgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQgZmxhZyB3ZSByZWNlaXZlIGZyb20KKwkgIHVwc3RyZWFtIGFuZCBwcm9wYWdhdGUgaXQgdG8gdGhlICpmaXJzdCogUlRQIHBhY2tldCBvdXRwdXR0ZWQgdG8gdHJhbnNmZXIgdGhpcworCSAgYnVmZmVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMDU2MworCisyMDE0LTA1LTIwIDEzOjU4OjIwICswMjAwICBHdWlsbGF1bWUgRGVzbW90dGVzIDxndWlsbGF1bWUuZGVzbW90dGVzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuaDoKKwkgIGdzdHJ0cG1wNGdwYXk6IHByb3BhZ2F0ZSB0aGUgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQgZmxhZworCSAgUHJvcGFnYXRlIHRoZSBESVNDT05UIGZsYWcgdG8gdGhlIGZpcnN0IFJUUCBwYWNrZXQgYmVpbmcgdXNlZCB0byB0cmFuc2ZlcgorCSAgYSBESVNDT05UIGJ1ZmZlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzA1NjMKKworMjAxNC0wNS0yMCAxMzo1ODoyMCArMDIwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgcnRwanBlZ3BheTogcHJvcGFnYXRlIHRoZSBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCBmbGFnCisJICBQcm9wYWdhdGUgdGhlIERJU0NPTlQgZmxhZyB0byB0aGUgZmlyc3QgUlRQIHBhY2tldCBiZWluZyB1c2VkIHRvIHRyYW5zZmVyCisJICBhIERJU0NPTlQgYnVmZmVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMDU2MworCisyMDE0LTA2LTE4IDE1OjAzOjI1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZG9uJ3QgbGVhayBmbG93IGNvbWJpbmVyCisKKzIwMTQtMDYtMTggMTQ6Mzg6NTUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJICBydHBqcDJrcGF5OiBwcmUtYWxsb2NhdGUgYnVmZmVyLWxpc3Qgb2YgdGhlIHJpZ2h0IHNpemUKKworMjAxNC0wNi0xOCAxNDozNDowOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBydHBqcGVncGF5OiBwcmUtYWxsb2NhdGUgYnVmZmVyIGxpc3Qgb2YgdGhlIHJpZ2h0IHNpemUKKworMjAxNC0wNi0xOCAxNDoxOToyOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJICBydHBtcDR2cGF5OiBwcmUtYWxsb2NhdGUgYnVmZmVyIGxpc3Qgb2YgdGhlIHJpZ2h0IHNpemUKKworMjAxNC0wNi0xOCAxMzo0NDozMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkgIHJ0cHZwOHBheTogYWxsb2NhdGUgYml0cmVhZGVyIG9uIHRoZSBzdGFjaworCisyMDE0LTA2LTE4IDEzOjI5OjQ3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5jOgorCSAgcnRwdnA4cGF5OiBwb3N0IGVycm9yIG1lc3NhZ2Ugb24gYnVzIG9uIGVycm9yIGFuZCBkb24ndCB1c2UgZ19tZXNzYWdlKCkKKworMjAxNC0wNi0xOCAxMzoyMDo0NCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkgIHJ0cHZwOHBheTogY291cGxlIG9mIG1pbm9yIG9wdGltaXNhdGlvbnMKKwkgIFByZS1hbGxvY2F0ZSBidWZmZXIgbGlzdCBvZiB0aGUgcmlnaHQgc2l6ZSB0byBhdm9pZCByZS1hbGxvY3MuCisJICBBdm9pZCBwbGVudHkgb2YgZG91YmxlIHJ1bnRpbWUgY2FzdCBjaGVja3MgYW5kIHJlLWRvaW5nIHRoZQorCSAgc2FtZSBjYWxjdWxhdGlvbiBvdmVyIGFuZCBvdmVyIGFnYWluIGluIHJ0cF92cDhfY2FsY19wYXlsb2FkX2xlbigpLgorCSAgT25seSBjYWxsIGdzdF9idWZmZXJfZ2V0X3NpemUoKSBvbmNlLgorCisyMDE0LTA2LTE4IDA4OjEwOjAzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSAgcnRwZ3N0cGF5OiBwcmUtYWxsb2NhdGUgYnVmZmVyIGxpc3Qgb2YgdGhlIHJpZ2h0IHNpemUKKwkgIFRvIGF2b2lkIHJlLWFsbG9jcy4KKworMjAxNC0wNi0xOCAwNzo1MjowNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiBwcmUtYWxsb2NhdGUgYnVmZmVybGlzdCBvZiB0aGUgcmlnaHQgc2l6ZQorCSAgVG8gYXZvaWQgdW5uZWNlc3NhcnkgcmUtYWxsb2NzLgorCisyMDE0LTA2LTE2IDIwOjE1OjQzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJICBydHBoMjY0cGF5OiBwdXNoIHNpbmdsZSBidWZmZXIgZGlyZWN0bHksIG5vIG5lZWQgdG8gd3JhcCBpdCBpbiBhIGJ1ZmZlcmxpc3QKKwkgIE5vIHBvaW50IGluIGEgYnVmZmVyIGxpc3QgaWYgd2UganVzdCBoYXZlIG9uZSBzaW5nbGUKKwkgIGJ1ZmZlciB0byBwdXNoLiBGaXggdXAgdW5pdCB0ZXN0IHRvIGhhbmRsZSB0aGF0IGNhc2UKKwkgIGFzIHdlbGwuCisKKzIwMTQtMDYtMTYgMTU6MzU6MTIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5Lmg6CisJICBydHB2cmF3cGF5OiBtYWtlIGNodW5rcyBwZXIgZnJhbWUgY29uZmlndXJhYmxlCisJICBCaXQgb2YgYSBtaXNub21lciBiZWNhdXNlIGl0J3MgcmVhbGx5IGNodW5rcyBwZXIgZmllbGQKKwkgIGFuZCBub3QgcGVyIGZyYW1lLCBidXQgd2UncmUgZ29pbmcgdG8gaWdub3JlIHRoYXQgZm9yCisJICB0aGUgdGltZSBiZWluZy4KKworMjAxNC0wNi0xNiAxNDo1MjoxNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuaDoKKwkgIHJ0cHZyYXdwYXk6IHJlbW92ZSB1bnVzZWQgdmFyaWFibGVzCisKKzIwMTQtMDYtMTYgMTQ6NDQ6MjcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSAgcnRwdnJhd3BheTogcHJlLWFsbG9jYXRlIGJ1ZmZlciBsaXN0cyBvZiBzdWZmaWNpZW50IHNpemUKKwkgIEF2b2lkcyB1bm5lY2Vzc2FyeSByZWFsbG9jcyB3aGVuIGFwcGVuZGluZyBidWZmZXJzCisJICB0byB0aGUgYnVmZmVybGlzdC4KKworMjAxNC0wNi0xNiAxMzo1MTowMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJICBydHB2cmF3cGF5OiBtaWNyby1vcHRpbWlzZSB2YXJpYWJsZSBhY2Nlc3MgaW4gaW5uZXIgbG9vcAorCSAgU3RvcmUgc29tZSB2YWx1ZXMgdGhhdCBkb24ndCBjaGFuZ2UgZHVyaW5nIHRoZSBleGVjdXRpb24KKwkgIG9mIHRoZSBpbm5lciBsb29wcyBsb2NhbGx5LCBzbyB0aGUgY29tcGlsZXIga25vd3MgdGhhdCB0b28uCisKKzIwMTQtMDYtMTYgMTM6Mzg6NDcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSAgcnRwdnJhd3BheTogdXNlIGJ1ZmZlciBsaXN0cworCSAgQ29sbGVjdCBidWZmZXJzIHRvIHNlbmQgb3V0IGluIGJ1ZmZlciBsaXN0cyBpbnN0ZWFkIG9mCisJICBwdXNoaW5nIG91dCBzaW5nbGUgYnVmZmVycyBvbmUgYXQgYSB0aW1lLiBGb3IgSEQgdmlkZW8KKwkgIGVhY2ggZnJhbWUgbWlnaHQgZWFzaWx5IGFkZCB1cCB0byBhIGNvdXBsZSBvZiB0aG91c2FuZAorCSAgcGFja2V0cywgbXVsdGlwbHkgdGhhdCBieSB0aGUgZnJhbWUgcmF0ZSBhbmQgdGhhdCdzIGEKKwkgIGxvdCBvZiBwdXNoKCkgYW5kIHNlbmRtc2coKSBjYWxscyBwZXIgc2Vjb25kLgorCSAgQSBnb29kIHJlYXNvbiB0byBwdXNoIG91dCBidWZmZXJzIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGlzCisJICBsYXRlbmN5LCBzbyB3ZSBkb24ndCBhY2N1bXVsYXRlIHRoZSB3aG9sZSBmcmFtZSBpbiBhIHNpbmdsZQorCSAgYnVmZmVyIGxpc3QsIGJ1dCBpbnN0ZWFkIHB1c2ggaXQgb3V0IGluIGEgZmV3IGNodW5rcywgd2hpY2gKKwkgIGlzIGhvcGVmdWxseSBhIHJlYXNvbmFibGUgY29tcHJvbWlzZS4KKworMjAxNC0wNi0xNiAxNjo0MDowNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgdWRwOiBpbXByb3ZlIGVsZW1lbnQgZGVzY3JpcHRpb25zIGZvciBkeW51ZHBzaW5rIGFuZCBtdWx0aXVkcHNpbmsKKworMjAxNC0wNi0xNiAxNjoxNzoxNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgdWRwOiByZW1vdmUgc3VwcHJlc3Npb24gb2YgY29tcGlsZXIgd2FybmluZ3MgZm9yIGRlcHJlY2F0ZWQgR0xpYiBBUEkKKwkgIE5vdCBuZWVkZWQgYW55IG1vcmUuCisKKzIwMTQtMDYtMTcgMTM6MTY6MjcgKzA1MzAgIFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBGaXggY2FwcyBuZWdvdGlhdGlvbiBpc3N1ZQorCSAgTWFrZSBzdXJlIHRoYXQgaWYgQVlVViBpcyByZWNlaXZlZCBpdCB3aWxsIGRldGVjdCB0aGF0IGl0IGNhbiBwcm9kdWNlCisJICBib3RoIFJHQiBhbmQgWVVWIGZvcm1hdHMKKwkgIFNpZ25lZC1vZmYtYnk6IFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNTI0OAorCisyMDE0LTA2LTE2IDEyOjAyOjQxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJICBydHB0aGVvcmFkZXBheTogZml4IGRvdWJsZSBmcmVlcworCSAgRml4IGRvdWJsZS1mcmVlcyBpbnRyb2R1Y2VkIHRvIGZpeCBhbm90aGVyIGNvdmVyaXR5IHJlcG9ydC4KKwkgIENJRCAxMjIzMDUzCisKKzIwMTQtMDYtMTMgMTA6MTI6MDcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSAgZHludWRwc2luazogcmV0dXJuIEZMVVNISU5HIHdoZW4gc2VuZHRvIGdvdCBjYW5jZWxlZCwgbm90IGFuIGVycm9yCisKKzIwMTQtMDYtMTMgMDk6NTI6MDMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3MvZ3N0b3NzaGVscGVyLmM6CisJICBvc3M6IHNpbXBsaWZ5IHByb2JlZCBjYXBzIGJlZm9yZSByZXR1cm5pbmcgdGhlbQorCSAgRXhwb3NlcyBhbGwgZm9ybWF0cyBpbiB0aGUgZmlyc3Qgc3RydWN0dXJlIGlmIHRoZQorCSAgcmVzdCBpcyB0aGUgc2FtZSBmb3IgYWxsIG9mIHRoZW0uCisKKzIwMTQtMDYtMTMgMDk6NDU6MjggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3MvZ3N0b3NzaGVscGVyLmM6CisJICBvc3M6IG1ha2Ugc3VyZSAxNi1iaXQgZm9ybWF0cyBhcmUgYmVmb3JlIDgtYml0IGZvcm1hdHMgaW4gcHJvYmVkIGNhcHMKKwkgIFByb2JlIHN1cHBvcnRlZCBmb3JtYXRzIGluIG9yZGVyIG9mIGRlc2lyYWJpbGl0eSByYXRoZXIgdGhhbiBpbgorCSAgd2hhdCBvcmRlciB0aGV5IG1heSBoYXBwZW4gdG8gYmUgaW4gdGhlIGZvcm1hdHMgYml0bWFzay4gRml4ZXMKKwkgIGFjY2lkZW50YWxseSBleHBvc3VyZSBvZiA4LWJpdCBmb3JtYXRzIGluIGNhcHMgYmVmb3JlIDE2LWJpdCBmb3JtYXRzCisJICAoaW4gY2FzZSB3aGVyZSBVMTYgd2FzIG5vdCBzdXBwb3J0ZWQgUzggbWlnaHQgYmUgbGlzdGVkIGJlZm9yZSBTMTYpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNjg4NAorCisyMDE0LTA2LTEyIDE2OjM2OjI0IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogQ2xlYW5seSBoYW5kbGUgdjRsMl9hbGxvY2F0b3JfbmV3IGZhaWx1cmUKKworMjAxNC0wNi0xMiAxMToyNDoxNSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkgIHJ0cHRoZW9yZGVwYXk6IGZpeCBsZWFrcworCSAgQ292ZXJpdHkgMTIxMjE2MworCisyMDE0LTA2LTEyIDExOjE2OjA4ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6CisJICBydHBnNzI5cGF5OiBsZWFrIGZpeGVzCisJICBDb3Zlcml0eSAxMjEyMTU5CisKKzIwMTQtMDYtMTIgMTE6MTE6MzggKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgIHJ0cGgyNjNwYXk6IGZpeCBsZWFrCisJICBDb3Zlcml0eSAxMjEyMTU3CisKKzIwMTQtMDYtMTIgMTA6NDM6NTMgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgIHJ0cGgyNjNwYXk6IGZpeCBsZWFrcworCSAgQ292ZXJpdHkgMTIxMjE0OQorCisyMDE0LTA2LTEyIDEwOjMxOjQ3ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSAgcnRwZHZwYXk6IGNhdGNoIGZhaWx1cmVzIHRvIG1hcCBidWZmZXIKKwkgIENvdmVyaXR5IDExMzk3NDEKKworMjAxNC0wNi0xMSAxNzo0Mzo0MiArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkgIG11bHRpcGFydGRlbXV4OiBndWFyZCBhZ2FpbnN0IGhhdmluZyBubyBNSU1FIHR5cGUKKwkgIFRoZSBjb2RlIHdvdWxkIHByZXZpb3VzbHkgY3Jhc2ggdHJ5aW5nIHRvIGluc2VydCBhIE5VTEwgc3RyaW5nCisJICBpbnRvIGEgaGFzaCB0YWJsZS4KKwkgIEl0IGRvZXMgc2VlbSBhIGxpdHRsZSBicm9rZW4gdGhhdCBpbmRleGluZyBpcyBkb25lIGJ5IE1JTUUgdHlwZQorCSAgYW5kIG5vdCBieSBpbmRleCB0aG91Z2gsIHVubGVzcyB0aGUgc3BlYyBzYXlzIHRoZXJlIGNhbm5vdCBiZQorCSAgdHdvIHBhcnRzIHdpdGggdGhlIHNhbWUgTUlNRSB0eXBlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1OTU3MworCisyMDE0LTA2LTEwIDE1OjQyOjE0IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5oOgorCSAgbXVsdGlwYXJ0ZGVtdXg6IFNlbmQgc3RyZWFtLXN0YXJ0IGV2ZW50CisJICBUaGlzIGV2ZW50IHdhcyBub3Qgc2VudC4gU2VuZCBpdCBiZWZvcmUgY2FwcywgdGhpcyByZXF1aXJlcyB0aGUgcGFkIHRvCisJICBiZSBwYXJlbnRlZC4gVGhpcyByZW1vdmVzIHdhcm5pbmcgbGlrZTogIkdvdCBkYXRhIGZsb3cgYmVmb3JlCisJICBzdHJlYW0tc3RhcnQgZXZlbnQiLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMTQ3NQorCisyMDE0LTA2LTEwIDE1OjMzOjMzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhdm9pZCBsb29waW5nIGluZGVmaW5pdGVseSBpbiBicm9rZW4gc3ZxMyBmaWxlcworCSAgQWJvcnQgaWYgYW4gYXRvbSB3aXRoIHNpemUgMCBpcyByZWFkIGZyb20gd2l0aGluIHRoZSBzdnEzIHN0c2QKKwkgIGF0b21zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI2NTEyCisKKzIwMTQtMDYtMTAgMTA6NTI6MjMgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiBhZGQgY29uc3Qgd2hlcmUgYXBwcm9wcmlhdGUKKworMjAxNC0wNi0wOSAxMDozOToyMCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJICBzcGVleGVuYzogYWRkIG1pc3NpbmcgdmFfZW5kIGluIHZhcmlhZGljIGZ1bmN0aW9uCisJICBDb3Zlcml0eSAxMTM5OTQ0CisKKzIwMTQtMDYtMDkgMTA6MDQ6MzggKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBBdHRlbXB0IHVwc3RyZWFtIHNlZWsgZmlyc3QKKwkgIElmIHdlIGhhdmUgYW4gdXBzdHJlYW0gZWxlbWVudCB0aGF0IGNhbiBoYW5kbGUgdGhlIHNlZWsgKHN1Y2ggYXMKKwkgIHJ0bXBzcmMpLCB0cnkgdG8gZG8gdGhhdCBmaXJzdCBiZWZvcmUgYXR0ZW1wdGluZyBpdCBvdXJzZWxmLgorCisyMDE0LTA2LTA0IDExOjM0OjI3ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogZG8gbm90IGluY2x1ZGUgY29kZWNfZGF0YSBvbiByYXcgYXVkaW8gY2FwcworCSAgSWYgdGhlIHdhdiBoZWFkZXIgY29udGFpbnMgYW4gZXh0ZW5kZWQgY2h1bmssIHdlIHdhbnQgdG8ga2VlcAorCSAgdGhlIGNvZGVjX2RhdGEgZmllbGQsIGJ1dCBub3QgZm9yIHJhdyBhdWRpby4KKwkgIFRoaXMgZml4ZXMgc29tZSBlbGVtZW50cyAoc3VjaCBhcyBhZGRlcikgZnJvbSBmYWlsaW5nIHRvIGludGVyc2VjdAorCSAgcmF3IGF1ZGlvIGNhcHMgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGJlIGludGVyc2VjdGFibGUuCisKKzIwMTQtMDYtMDUgMDk6Mzg6MjkgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBRdWVyeSBkdXJhdGlvbiB1cHN0cmVhbSBmaXJzdAorCSAgVXBzdHJlYW0gZWxlbWVudHMgKGxpa2UgcnRtcHNyYykgbWlnaHQgYmUgYWJsZSB0byBwcm92aWRlIHRoZSBkdXJhdGlvbgorCSAgbW9yZSBhY2N1cmF0ZWx5IHRoYW4gZmx2ZGVtdXguIEVzcGVjaWFsbHkgd2l0aCBpbmRleC1sZXNzIHZvZCBmaWxlcworCisyMDE0LTA1LTMwIDE5OjM3OjU3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogQ2xlYW51cCBwb2xsIG1ldGhvZCBhbmQgcmV0cnkgb24gRUlOVFIvRUFHQUlOCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMxMDE1CisKKzIwMTQtMDMtMDYgMTY6Mzc6NTEgKzAxMDAgIEphbiBBbGV4YW5kZXIgU3RlZmZlbnMgKGhlZnRpZykgPGphbi5zdGVmZmVuc0BnbWFpbC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBzZXQgUkVTWU5DIGJ1ZmZlciBmbGFnIHdoZW4gYnJpZGdpbmcgbGFyZ2UgUFRTIGdhcHMKKwkgIFNvIGRvd25zdHJlYW0gZ2V0cyBub3RpZmllZCB3aGVuIHRoaXMgaGFwcGVucy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjU5MDMKKworMjAxNC0wNi0wMyAxNzo1OTozMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwcnR4LmM6CisJICBydHBydHg6IFJlc2V0IHN0YXRlIG9uIGVhY2ggaXRlcmF0aW9uCisJICBPdGhlcndpc2UgaXQgZGlkbid0IHdhaXQgZm9yIHRoZSB0ZXN0IHRvIGZpbmlzaCBiZWZvcmUgY2hlY2tpbmcgdGhlIHJlc3VsdHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI4NTAxCisKKzIwMTQtMDUtMDkgMTQ6MjI6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2FkZW11eDogZG9uJ3QgbGVhayBkb2N0eXBlIHN0cmluZyBpbiBlcnJvciBjb2RlIHBhdGgKKwkgIENJRCAxMjEyMTQ1LgorCisyMDE0LTA1LTIwIDA4OjIwOjQyICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkgIHZwOWVuYzogRG9uJ3QgZGVyZWZlcmVuY2UgTlVMTCBjaGVja3MKKwkgIENJRCAjMTE5NzcwMworCisyMDE0LTA1LTIwIDA4OjIzOjA2ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDhlbmMuYzoKKwkgIHZwOGVuYzogRG9uJ3QgZGVyZWZlcmVuY2UgTlVMTCB2YXJpYWJsZQorCSAgQ0lEICMxMTM5ODM4CisKKzIwMTQtMDUtMzAgMTQ6MzI6NDIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHVwc3RyZWFtIGhhbmRsZXMgc2VlayBpZiBmcmFnbWVudGVkIGFuZCBvbiB0aW1lIHNlZ21lbnQKKwkgIE90aGVyd2lzZSB3ZSBjYW4gcmVqZWN0IHNlZWtzIG9uIGxvY2FsIGZpbGVzIHRoYXQgY29udGFpbiBmcmFnbWVudGVkLWxpa2UKKwkgIGF0b21zIGxpa2UgJ212ZXgnLiBBbHNvIGltcHJvdmUgYSBtZXNzYWdlIGxvZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMDcyMgorCisyMDE0LTA1LTMwIDE2OjQzOjQ0ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIGgyNjRkZXBheTogbWFrZSBzdXJlIHdlIGNhbGwgaGFuZGxlX25hbCBmb3IgZWFjaCBOQUwKKwkgIENhbGwgaGFuZGxlX25hbCBmb3IgZWFjaCBOQUwgaW4gdGhlIFNUQVAtQSBSVFAgcGFja2V0LiBUaGlzIG1ha2VzCisJICBzdXJlIHdlIGNvcnJlY3RseSBleHRyYWN0IHRoZSBTUFMgYW5kIFBQUy4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzA5OTkKKworMjAxNC0wNS0wNyAxNDowOTowNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJICBzb3VwaHR0cHNyYzogQWRkIGN1c3RvbSBzdGlja3kgZXZlbnQgdG8gY29udGFpbiB0aGUgSFRUUCByZXF1ZXN0IGFuZCByZXNwb25zZSBoZWFkZXJzCisJICBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gZS5nLiBnZXQgY29va2llIGluZm9ybWF0aW9uIGRvd25zdHJlYW0uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI5NzA3CisKKzIwMTQtMDUtMjYgMTk6NDc6MzkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogcmVtb3ZlIHN0cmVhbSBsYXN0IGZsb3cgcmV0dXJuCisJICBHc3RQYWQgYWxyZWFkeSBzdG9yZXMgdGhhdCBpbmZvcm1hdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwOTIyNAorCisyMDE0LTA1LTI2IDE5OjM3OjQ2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiByZW1vdmUgbGFzdCBmbG93IHJldHVybiBmcm9tIHN0cmVhbSBzdHJ1Y3QKKwkgIEl0IGlzIGFscmVhZHkgc3RvcmVkIG9uIEdzdFBhZCBvbiBjb3JlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5MjI0CisKKzIwMTQtMDUtMjYgMTk6MTk6NDUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4Lmg6CisJICBmbHZkZW11eDogVXNlIEdzdEZsb3dDb21iaW5lcgorCSAgVXNlIHRoZSBmbG93IGNvbWJpbmVyIHRvIGhhdmUgdGhlIHN0YW5kYXJkIGNvbWJpbmF0aW9uIHJlc3VsdHMgYW5kIGF2b2lkCisJICByZXBlYXRpbmcgdGhlIHNhbWUgY29kZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwOTIyNAorCisyMDE0LTA1LTI2IDEzOjIxOjI1IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYWRlbXV4OiB1c2UgR3N0Rmxvd0NvbWJpbmVyCisJICBVc2UgdGhlIGZsb3cgY29tYmluZXIgdG8gaGF2ZSB0aGUgc3RhbmRhcmQgY29tYmluYXRpb24gcmVzdWx0cyBhbmQgYXZvaWQKKwkgIHJlcGVhdGluZyB0aGUgc2FtZSBjb2RlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5MjI0CisKKzIwMTQtMDUtMjYgMTM6MDQ6MTAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogdXNlIEdzdEZsb3dDb21iaW5lcgorCSAgUmVtb3ZlcyBmbG93IHJldHVybiBjb21iaW5hdGlvbiBjb2RlIHRvIHVzZSB0aGUgbmV3bHkgYWRkZWQgR3N0Rmxvd0NvbWJpbmVyCisKKzIwMTQtMDUtMjMgMTc6NTM6MDAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSAgcXRkZW11eDogdXNlIEdzdEZsb3dDb21iaW5lcgorCSAgUmVtb3ZlcyB0aGUgY29tbW9uIGNvZGUgdG8gY29tYmluaW5nIGZsb3cgcmV0dXJucyB0byBsZXQgaXQgYmUKKwkgIGhhbmRsZWQgYnkgY29yZSBnc3R1dGlscycgR3N0Rmxvd0NvbWJpbmVyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5MjI0CisKKzIwMTQtMDUtMjYgMTA6NTk6NTUgLTA0MDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMnNpbms6IGltcGxlbWVudCBnc3R2aWRlb3Npbmsuc2hvd19mcmFtZSBpbnN0ZWFkIG9mIGdzdGJhc2VzaW5rLnJlbmRlcgorCSAgSXQgYWxsb3dzIHRvIHNob3cgcHJlcm9sbCBmcmFtZS4gRXNwZWNpYWxseSBpdCBhbGxvd3MgdG8gdXBkYXRlIHRoZQorCSAgZnJhbWUgd2hlbiBzZWVraW5nIGluIFBBVVNFRCBzdGF0ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIzMDMKKworMjAxNC0wNS0yNiAxMDo1OTowNiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMnNpbms6IENsZWFudXAgb2xkIHBhZCBhbGxvYyBkZWNsYXJhdGlvbgorCisyMDE0LTA1LTI2IDEyOjM0OjQyIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IENvcHkgYWxyZWFkeSBxdWV1ZWQgYnVmZmVyCisJICBUaGlzIGlzIHJlcXVpcmVkIGFzIGR1cmluZyBwcmVyb2xsIHdlIHBhc3MgdGhlIGZpcnN0IGJ1ZmZlciB0d2ljZSwgaGVuY2UgYWxyZWFkeQorCSAgcXVldWVkLiBJdCBpcyBhbHNvIHVzZWZ1bCwgdG8gYWxsb3cgZmlsdGVycyByZXBsYXlpbmcgYSBwcmV2aW91cyByZW5kZXJlZCBidWZmZXJzLgorCSAgVGhpcyB3aWxsIHJlcXVpcmUgMSBtb3JlIGJ1ZmZlciBpbiBzaW5rIGlmIGxhc3Qtc2FtcGxlIGlzIGVuYWJsZWQsIHNpbmNlIHRoZSBsYXN0CisJICBzYW1wbGUgd2lsbCBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnRseSBxdWV1ZWQgYnVmZmVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMjMwMworCisyMDE0LTA1LTI0IDIwOjIwOjA3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBQb3J0IHRvIGJ1ZmZlcnBvb2wgZmx1c2hfc3RhcnQvc3RvcCBtZXRob2QKKwkgIFBvcnQgdGhlIGJ1ZmZlciBwb29sIHRvIHVzZSB0aGUgbmV3IGZsdXNoX3N0YXJ0L2ZsdXNoX3N0b3AgdmlydHVhbAorCSAgbWV0aG9kcyBhZGRlZCB0byBHc3RCdWZmZXJQb29sLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNzYxMQorCisyMDE0LTA1LTI1IDE3OjQwOjU4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgcG86IHVwZGF0ZQorCisyMDE0LTA1LTI1IDE2OjU0OjE4ICswMjAwICBQaW90ciBEcsSFZyA8cGlvdHJkcmFnQGdtYWlsLmNvbT4KKworCSogcG8vUE9URklMRVMuaW46CisJICBwbzogdXBkYXRlIFBPVEZJTEVTCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI2NTU2CisKKzIwMTQtMDUtMjQgMjM6NTE6NTggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IERvbid0IHF1ZXVlIGFsbCB0aGUgYnVmZmVycyBiZWZvcmUgZGVxdWV1ZWluZyBmaXJzdAorCSAgRm9yIG91dHB1dCBkZXZpY2UsIHdlIHdoZXJlIHF1ZXVpbmcgYWxsIHRoZSBidWZmZXJzLCBhbmQgdGhlbiB3ZSB3b3VsZAorCSAgZGVxdWV1ZSBvbmUuIFRoaXMgbWVhbnMgd2Ugb25seSBoYXZlIDEgYnVmZmVyIGZvciB0aGUgcGlwZWxpbmUsIG5vIG1hdHRlcgorCSAgdGhlIHNpemUgb2YgdGhlIHF1ZXVlLiBJbnN0ZWFkLCBzdGFydCBkZXF1ZXVlZCB3aGVuIG1pbl9sYXRlbmN5IGlzIHJlYWNoZWQuCisJICBFdmVudHVhbGx5LCB0aGlzIHRoZSBtaW5fbGF0ZW5jeSBzaG91bGQgYWxzbyBiZSBhZmZlY3RlZCBieSBjb250cm9sCisJICBNSU5fQlVGRkVSU19GT1JfT1VUUFVUICh1c2UgYnkgZW5jb2RlcnMpLgorCisyMDE0LTA1LTI0IDIzOjQ5OjE5IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogU2ltcGx5IHJlYWQgYmFjayB0aGUgY29uZmlnIHRvIHVwZGF0ZSB0aGUgcXVlcnkKKwkgIEl0J3MgZWFzeSB0byBnZXQgdGhlIG1pbi9tYXggb3V0ZGF0ZSB3aGVuIGhhY2tpbmcgZGVjaWRlIGFsbG9jYXRpb24uIEluCisJICBvcmRlciB0byBhdm9pZCB0aGlzLCBzaW1wbHkgcmVhZCBiYWNrIHRoZSBjaG9vc2VuIHZhbHVlIGZyb20gdGhlIGNvbmZpZy4KKworMjAxNC0wNS0yNCAyMzozMToyNCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogQ2xlYW51cCBhbmQgZml4IGNhbGN1bGF0aW9uIG9mIGxhdGVuY3kKKwkgIENhbGN1bGF0aW9uIG9mIG51bV9idWZmZXJzICh0aGUgbWF4IGxhdGVuY3kgaW4gYnVmZmVycykgd2FzCisJICB1cC1zaWRlLWRvd24uICBJZiB3ZSBjYW4gYWxsY29hdGUsIHRoZW4gb3VyIG1heGltdW0gbGF0ZW5jeSBtYXRjaAorCSAgcG9vbCBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzLiBBbHNvIHJlbmFtZWQgaXQgdG8gbWF4IGxhdGVuY3kuIEZpbmFsbHkKKwkgIGludHJvZHVjZWQgYSBtaW5fbGF0ZW5jeSBmb3IgY2xhcml0eS4KKworMjAxNC0wNS0yNCAyMDowMDoxNCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICBSZXZlcnQgInY0bDJidWZmZXJwb29sOiBQb3J0IHRvIGJ1ZmZlcnBvb2wgZmx1c2hfc3RhcnQvc3RvcCBtZXRob2QiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDJlMGZiNDJlODY4ZmM5ZjZkOThiMDI4ZGVmODBhM2U5NTM1MjczMDcuCisJICBDb25mbGljdHM6CisJICBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmMKKwkgIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmMKKwkgIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jCisKKzIwMTQtMDUtMjQgMTg6NTY6MzIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBGaXggY29uZmlndXJhdGlvbiBvZiBvdGhlcl9wb29sIGFuZCBpbXBvcnRhdGlvbiBjYXNlCisJICBGaXggdGhlIGNob2ljZSBvZiBtaW4vbWF4LCBkb24ndCBvdmVycmlkZSB0aGUgbWluL21heCB3aXRoIG93biBwb29sIHNlbGVjdGVkCisJICBzaXplLCBjb3JyZWN0IG90aGVyX3Bvb2wgaXNfYWN0aXZlIGNoZWNrLCBzdGFydCBmcm9tIG90aGVyX3Bvb2wgY29uZmlnIHdoZW4KKwkgIGNvbmZpZ3VyaW5nIHRoZSBvdGhlciBwb29sIGFuZCBmaW5hbGx5IHZhbGlkYXRlIHRoZSBjb25maWd1cmF0aW9uLgorCisyMDE0LTA1LTI0IDE4OjQ1OjMwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogVXNlIHByb3Bvc2VkIGFsbG9jYXRvciBhcyBkZWZhdWx0CisKKzIwMTQtMDUtMjQgMTg6NDM6MjggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IEZpeCBVU0VSUFRSIG1hcCBmbGFncworCSAgV2UgbmVlZCB0byBtYXAgUkVBRCBvbmx5IGZvciBvdXRwdXQgYW5kIHdyaXRlIG9ubHkgZm9yIGNhcHR1cmUsIHdlIHdoZXJlCisJICBkb2luZyB0aGUgb3Bwb3NpdGUuIFRoaXMgZml4aW5nIFVTRVJQVFIgd2l0aCBnbGltYWdlc2luaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMDY5OAorCisyMDE0LTA1LTI0IDExOjE2OjM1IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwYXJzZSB0a2hkIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBhbmQgYWRkIHRhZ3MgaWYgYXBwcm9wcmlhdGUKKwkgIEhhbmRsZSB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IGNhc2VzIHdoZXJlIHRoZXJlIGFyZSBvbmx5IHNpbXBsZSByb3RhdGlvbnMKKwkgICg5MCwgMTgwIG9yIDI3MCBkZWdyZWVzKSBhbmQgdXNlIGEgdGFnIGZvciB0aG9zZSBjYXNlcy4gVGhpcyBpcyBhIGNvbW1vbiBzY2VuYXJpbworCSAgd2hlbiByZWNvcmRpbmcgd2l0aCBtb2JpbGUgZGV2aWNlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3OTUyMgorCisyMDE0LTA1LTIzIDE5OjEwOjIxIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogUHJldmVudCBudW1fcXVldWVkIGZyb20gZ29pbmcgbmVnYXRpdmUKKworMjAxNC0wNS0yMyAxODoyNTo0OSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogZG9uJ3Qgc3RvcCBpZiBsb29wIHJldHVybmVkIEZMVVNISU5HCisJICBUaGUgZGVjb2RlaW5nIHRocmVhZCByZXR1cm5pbmcgZmx1c2hpbmcgaXNuJ3QgYW4gZXJyb3IsIHdlIHNob3VsZCBzaW1wbHkKKwkgIHRyeSBzdGFydGluZyB0aGUgdGFzayBhZ2Fpbi4gSWYgaXQncyBhY3R1YWxseSBmbHVzaGluZywgaXQgd2lsbCBzdG9wIGFnYWluIGJ5IGl0c2VsZi4KKworMjAxNC0wNS0yMyAxNzo1NDoyMCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogSGFuZGxlIGVhcmx5IHRhc2sgc3RvcAorCisyMDE0LTA1LTIzIDE3OjI4OjEzIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBIYW5kbGUgZ3N0X3BhZF9zdGFydF90YXNrKCkgZmFpbHVyZQorCisyMDE0LTA1LTIzIDE3OjE5OjA3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBBZGQgdHJhY2UgZm9yIEZMVVNIX1NUQVJUL1NUT1AgaGFuZGxpbmcKKworMjAxNC0wNS0yMyAxNzoxODoxNiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogRml4IHVzZSBvZiBhdG9taWMgdmFsdWUKKworMjAxNC0wNS0yMyAxNzowMTo1MyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IEltcHJvdmUgZGVidWdnaW5nCisJICBObyBuZWVkIHRvIHVzZSBvYmotPmVsZW1lbnQsIHRoZSBwb29sIG5vdyBoYXZlIGEgc2lnbmlmaWNhbnQgbmFtZS4gQWxzbyBkb24ndAorCSAgd2FybiBpZiBmbHVzaGluZy4KKworMjAxNC0wNS0yMyAxNzowMTowMiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogRml4IGhhbmRsZV9mcmFtZSBlcnJvciBoYW5kbGluZworCisyMDE0LTA1LTIzIDE1OjU2OjI0IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogQWRkIGEgdHJhY2Ugd2hlbiBfc3RhcnQoKSBpcyBjYWxsZWQKKworMjAxNC0wNS0yMyAxNTo1NjowMiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJICB2NGwyYWxsb2NhdG9yOiBBZGQgZGVidWcgYXNzZXJ0IHRvIGRldGVjdCBjYWxscyBpbiB0aGUgd3Jvbmcgc3RhdGUKKworMjAxNC0wNS0yMyAxNTo1NToyNiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJICB2NGwyYWxsb2NhdG9yOiBSZXNldCBjb3VudCB3aGVuIHN0b3BwZWQKKworMjAxNC0wNS0yMyAxNTo1NTowOCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmFsbG9jYXRvcjogUmV0dXJuIGEgR3N0Rmxvd1JldHVybiBpbnN0ZWFkIG9mIGJvb2xlYW4gaW4gYWxsb2MKKworMjAxNC0wNS0yMyAxNToxNzoyNyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBEb24ndCBsZWFrIGNvbmZpZyBzdHJ1Y3R1cmUKKworMjAxNC0wNS0yMyAxNDoxMjoxMCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IFBvcnQgdG8gYnVmZmVycG9vbCBmbHVzaF9zdGFydC9zdG9wIG1ldGhvZAorCisyMDE0LTA1LTIzIDAzOjAwOjUwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogYWRkIHRhZyBtYXBwaW5ncyBmb3IgX3N3ciwgX21hayBhbmQgX21vZCB0YWdzCisJICBzd3IgLT4gQXBwbGljYXRpb24gbmFtZQorCSAgbWFrIC0+IGRldmljZSBtYW51ZmFjdHVyZXIKKwkgIG1vZCAtPiBkZXZpY2UgbW9kZWwKKworMjAxNC0wNS0yMCAxNzozNzo0OSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgeGltYWdlc3JjOiBGaXggeGltYWdlIGxlYWtzIHdoZW4gYnVmZmVyIGhhcyBtb3JlIHRoZW4gb25lIHhpbWFnZQorCSAgRnJvbSB0aW1lIHRvIHRpbWUsIHdoZW4gdGhlIGltYWdlX3Bvb2wgbGlzdCBoYXMgbW9yZSB0aGVuIDEgZWxlbWVudAorCSAgYW5kIEkgc3VwcG9zZSBhdCBzdGFydCwgYWxsIGJ1dCAxIHBvb2xlZCB4aW1hZ2UgYXJlIGxlYWtlZC4gVGhpcyBpcworCSAgZHVlIHRvIGJyb2tlbiBhbGdvcml0aG0gaW4gZ3N0X3hpbWFnZXNpbmtfc3JjX3hpbWFnZV9nZXQoKS4gVGhlcmUgd2FzCisJICBhbHNvIGEgcmlzayBvZiB1c2UgYWZ0ZXIgZnJlZSBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHhpbWFnZSBzaXplIGhhcworCSAgY2hhbmdlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mjg1MDIKKworMjAxNC0wNS0yMSAxMzoyMzoyNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjMuMiA9PT0KKworMjAxNC0wNS0yMSAxMzowNjozNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb21tb246CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0LWJ1aWxkLnN0YW1wOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3Quc3RhbXA6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdnB4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDEuMy4yCisKKzIwMTQtMDUtMjEgMTI6MTk6MzkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2hyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTQtMDUtMjEgMTA6NTE6MTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSAyMTFmYTVmIHRvIDFmNWQzYzMKKworMjAxNC0wNS0yMCAwODoyMzowNiArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJICB2cDhlbmM6IERvbid0IGRlcmVmZXJlbmNlIE5VTEwgdmFyaWFibGUKKwkgIENJRCAjMTEzOTgzOAorCisyMDE0LTA1LTIwIDA4OjIwOjQyICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkgIHZwOWVuYzogRG9uJ3QgZGVyZWZlcmVuY2UgTlVMTCBjaGVja3MKKwkgIENJRCAjMTE5NzcwMworCisyMDE0LTA1LTE5IDExOjI2OjQ2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IEV4cGxpY2l0bHkgY2FzdCBlbnVtICJzdWJ0eXBlIiB0byBpdHMgInN1cGVydHlwZSIKKwkgIGdzdHY0bDJidWZmZXJwb29sLmM6NjA4OjE4OiBlcnJvcjogaW1wbGljaXQgY29udmVyc2lvbiBmcm9tIGVudW1lcmF0aW9uIHR5cGUKKwkgICdlbnVtIF9Hc3RWNGwyQnVmZmVyUG9vbEFjcXVpcmVGbGFncycgdG8gZGlmZmVyZW50IGVudW1lcmF0aW9uIHR5cGUKKwkgICdHc3RCdWZmZXJQb29sQWNxdWlyZUZsYWdzJyBbLVdlcnJvciwtV2VudW0tY29udmVyc2lvbl0KKwkgIHBhcmFtcy5mbGFncyA9IEdTVF9WNEwyX1BPT0xfQUNRVUlSRV9GTEFHX1JFU1VSRUNUOworCSAgfiBefn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisyMDE0LTA1LTE5IDExOjI0OjA2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZ29vbS90ZW50YWNsZTNkLmM6CisJICBnb29tOiBVc2UgZmFicygpIGluc3RlYWQgb2YgYWJzKCkgdG8gY2FsY3VsYXRlIHRoZSBmbG9hdGluZyBwb2ludCBhYnNvbHV0ZSB2YWx1ZQorCSAgdGVudGFjbGUzZC5jOjI2ODo3OiBlcnJvcjogdXNpbmcgaW50ZWdlciBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnYWJzJyB3aGVuCisJICBhcmd1bWVudCBpcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlIFstV2Vycm9yLC1XYWJzb2x1dGUtdmFsdWVdCisJICBpZiAoYWJzICh0bXAgLSBmeF9kYXRhLT5yb3QpID4gYWJzICh0bXAgLSAoZnhfZGF0YS0+cm90ICsgMi4wICogR19QSSkpKSB7CisJICBeCisKKzIwMTQtMDUtMTkgMTE6MjE6MzYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Rlc3RzLmM6CisJICBkZWJ1Z3V0aWxzOiBQcm9wZXJseSBjYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2Ugd2l0aCB1bnNpZ25lZCB0eXBlcworCSAgdGVzdHMuYzoxNjE6MTY6IGVycm9yOiB0YWtpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIHR5cGUKKwkgICd1bnNpZ25lZCBsb25nJyBoYXMgbm8gZWZmZWN0IFstV2Vycm9yLC1XYWJzb2x1dGUtdmFsdWVdCisJICB0LT5kaWZmICs9IGxhYnMgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpIC0gdC0+ZXhwZWN0ZWQpOworCisyMDE0LTA1LTE2IDE3OjQ2OjMwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBIYW5kbGUgZmx1c2ggd2hpbGUgaW4gc3RhcnRfc3RyZWFtaW5nCisJICBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhIGZsdXNoIG9jY3VyZSB3aGlsZSB0aGUgc3RyZWFtaW5nCisJICB0aHJlYWQgaXMgYmVpbmcgYnJvdWdodCB1cC4gSW4gdGhpcyBjYXNlLCB0aGUgZmx1c2hpbmcgc3RhdGUgb2YgdGhlIHBvbGwKKwkgIG9iamVjdCBpcyBjbGVhcmVkLiBUbyBzb2x2ZSB0aGlzLCB3ZSBzaW1wbHkgc2V0IHRoZSBjYXB0dXJlIHBvbGwgdG8gZmx1c2hpbmcKKwkgIGFnYWluLCB0aGlzIHdheSB3ZSBrbm93IHRoZSB0aHJlYWQgd2lsbCBleGl0LiBUaGUgZGVjb2RlciBzdHJlYW1sb2NrCisJICBpcyB1c2VkIHRvIHN5bmNocm9uaXplIHdpdGggaGFuZGxlIGZyYW1lLgorCisyMDE0LTA1LTE2IDE2OjQ0OjM3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYzoKKwkgIHY0bDJhbGxvY2F0b3I6IERvbid0IHRyYWNlIHR3aWNlIHRoZSBzYW1lIG1lc3NhZ2UKKworMjAxNC0wNS0xNSAxMToyNTo1MCAtMDcwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1w6kgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGFsd2F5cyB1c2UgYSByYW5kb20gc3NyYyBmb3IgdGhlIGludGVybmFsIHNlc3Npb24KKwkgIFVzZSBhIHJhbmRvbSBTU1JDIGRpZmZlcmVudCB0aGFuIDAgZm9yIHRoZSBpbnRlcm5hbCBzZXNzaW9uIFNTUkMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMwMjEyCisKKzIwMTQtMDUtMTYgMTY6NTI6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiB1cGRhdGUgbGFzdF9hY3Rpdml0eSB3aGVuIHNlbmRpbmcgUlRQCisJICBBbHNvIHVwZGF0ZSBsYXN0X2FjdGl2aXR5IHdoZW4gZG9pbmcgc29tZXRoaW5nIHdpdGggdGhlIGludGVybmFsCisJICBzb3VyY2UgdG8gbWFrZSBzdXJlIGRvbid0IHRpbWVvdXQgZWFybHkuCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMDIxNworCisyMDE0LTA1LTE1IDE4OjA4OjUzIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMjogQ2xlYW51cCBNMk0gcHJvcGVydGllcworCSAgTTJNIGRldmljZXMgd2VyZSBzaGFyaW5nIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgc3JjIGFuZCBzaW5rLiBNb3N0IG9mCisJICB0aGVzZSBtYWRlIG5vIHNlbnNlLiBUaGlzIHBhdGNoIHJlZHVjZXMgdGhlIG51bWJlciBvZiBwcm9wZXRpZXMgYW5kCisJICBtYWtlcyBpby1tb2RlIGNsZWFyZXIgYnkgaGF2aW5nIGNhcHR1cmUtaW8tbW9kZSBhbmQgb3V0cHV0LWlvLW1vZGUuIFRoaXMKKwkgIGFsc28gYWNjaWRlbnRseSBmaXhlZCBhIGJ1ZyBpbiBnc3R2NGwydHJhbnNmb3JtIGlvLW1vZGUgY29kZSwgd2hlcmUgdGhlCisJICBjYXB0dXJlIGlvLW1vZGUgY291bGQgbm90IGJlIHNldC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mjk1OTEKKworMjAxNC0wNS0xNSAxNzozOTozOSArMDIwMCAgQmVuamFtaW4gR2FpZ25hcmQgPGJlbmphbWluLmdhaWduYXJkQGxpbmFyby5vcmc+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogVXBkYXRlIHBvb2wgbGltaXQgd2l0aCBoYXJkd2FyZSByZXF1aXJlbWVuc3QKKwkgIElmIHRoZSBkcml2ZXIgbmVlZCBtb3JlIGJ1ZmZlcnMgdGhhbiByZXF1ZXN0ZWQgYnkgdGhlIGNvbmZpZywKKwkgIHVwZGF0ZSB0aGUgcG9vbCBtaW4vbWF4IHZhbHVlcy4gVGhlIG1pbmltdW0gdmFsdWUgZm9yIHRoZSBwb29sCisJICBjb3VsZCBiZSBwcm92aWRlZCBlaXRoZXIgYnkgdGhlIGRyaXZlciBvciBieSB0aGUgcG9vbC4gVGhpcyBpcworCSAgYmVzdCBlZmZvcnQgZm9yIGRyaXZlcnMgdGhhdCBkb24ndCBzdXBwb3J0CisJICBDSUQgVjRMMl9DSURfTUlOX0JVRkZFUlNfRk9SX0NBUFRVUkUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMwMjAwCisKKzIwMTQtMDUtMTUgMTA6NDQ6MjkgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmM6CisJICB2NGwydmlkZW9kZWM6IEhhbmRsZSBzdGFydF9zdHJlYW1pbmcgZXJyb3IKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzAyMDcKKworMjAxNC0wNS0xNSAxMDozOTo0MCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogUHJpbnQgdGhlIGZsb3cgcmV0dXJuIGNhdXNpbmcgdGhlIGxvb3AgdG8gbGVhdmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzAyMDcKKworMjAxNC0wNS0xNSAxMDozMTo0MCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogRG9uJ3QgbG9jayB0aGUgZGVjb2RlciB3aGVuIHN0b3BwaW5nIHRhc2sKKwkgIFRoYXQgc3JjIHBhZCB0YXNrIG1heSBuZWVkIHRvIHRha2UgdGhlIGxvY2sgd2hlbiBiZWluZyBwdWxsZWQKKwkgIGRvd24uIHRha2VpbmcgdGhhdCBsb2NrIGNhbiBsZWFkIHRvIGEgZGVhZGxvY2suCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMwMjA3CisKKzIwMTQtMDUtMTQgMTc6MTg6NTIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5jOgorCSAgdjRsMnRyYW5zZm9ybTogRG9uJ3QgbGVhayBwb29sIGlmIGFjdGl2YXRpb24gZmFpbGVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMwMjA3CisKKzIwMTQtMDUtMTQgMTc6MTg6MzUgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDI6IFNwbGl0IGZsdXNoIGluIHN0YXJ0L3N0b3Bfc3RyZWFtaW5nCisJICBUaGlzIGFsbG93IGNhbGxpbmcgc3RhcnQgc3RyZWFtaW5nIGxhdGVyIGZvciBjYXB0dXJlIGRldmljZS4gQ3VycmVudGx5IGl0IGJyZWFrcworCSAgaW4gZG1hYnVmLWltcG9ydCBiZWNhdXNlIGRvd25zdHJlYW0gaXMgaG9sZGluZyBhIGJ1ZmZlciB0aGF0IHdpbGwgb25seSBiZQorCSAgcmVsZWFzZWQgYWZ0ZXIgc3RyZWFtLXN0YXJ0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMDIwNworCisyMDE0LTA1LTE0IDE1OjEyOjI2IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IEZsdXNoIGJ1ZmZlciBwb29scyBvbiBmbHVzaCBzdG9wCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMwMjA3CisKKzIwMTQtMDUtMTQgMTM6Mjg6MzEgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogRml4IHVzZSBvZiBhdG9taWMgYWN0aXZlIG1hcmtlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMDIwNworCisyMDE0LTA1LTE0IDEzOjA1OjQyIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogRG9uJ3QgZGVhY3RpdmF0ZSBvdGhlcnBvb2wKKwkgIFdlIHNob3VsZCBub3Qgc3RvcCB0aGUgb3RoZXJwb29sIHVubGVzcyB3ZSBhbHNvIHN0b3Agb3VyIG93bgorCSAgcG9vbCwgb3RoZXJ3aXNlIGl0IHdpbGwgbmV2ZXIgZ2V0IHJlc3RhcnRlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzAyMDcKKworMjAxNC0wNS0xNCAxMjozMzo1OCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IEFsc28gdXBkYXRlIG51bV9idWZmZXJzIGZvciBpbXBvcnQgY2FzZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MzAyMDcKKworMjAxNC0wNS0xNCAxMzo0MjoyNSAtMDcwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1w6kgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiB1cGRhdGUgcnRwIGVuY29kZXIvZGVjb2RlciBkb2NzCisJICBVc2UgJXUgaW4gUlRQIGVuY29kZXIvZGVjb2RlciBwYWRzIHRvIG1hdGNoIG90aGVyIHJ0cGJpbiBwYWRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczMDE0NgorCisyMDEzLTEyLTI3IDExOjU1OjE4ICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBzZXNzaW9uLmM6CisJICB0ZXN0cy9jaGVjazogcnRwc2Vzc2lvbjogdGVzdCBpbnRlcm5hbCBzb3VyY2VzIHRpbWluZyBvdXQKKworMjAxMy0xMi0yNiAxNzozMDo0MiArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogcmVtb3ZlIHVudXNlZCBpZiBicmFuY2gKKwkgIDEpIHNvdXJjZXMgdGhhdCBoYXZlIHNlbnQgQllFIGluIHRoZSBwYXN0IGNhbm5vdCBiZSBzZW5kZXJzLCBzaW5jZQorCSAgdGhleSB3b3VsZCBoYXZlIHRpbWVkIG91dCB0byBiZWluZyByZWNlaXZlcnMgaW4gdGhlIG1lYW50aW1lLi4uCisJICAyKSBzb3VyY2VzIHRoYXQgaGF2ZSBzZW50IEJZRSBhcmUgbm93IGJlaW5nIHJlbW92ZWQgZWFybGllciBpbnNpZGUKKwkgIHRoaXMgZnVuY3Rpb24KKworMjAxMy0xMi0yNiAxNzoyOTo0MiArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogY2xlYW51cCBzb3VyY2VzIHRoYXQgaGF2ZSBzZW50IEJZRQorCisyMDEzLTEyLTI2IDE3OjI0OjUxICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiB1bmlmeSBuZXN0ZWQgaWYgY2xhdXNlcworCisyMDEzLTEyLTI2IDE3OjIxOjQ0ICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiB0aW1lb3V0IGludGVybmFsIHNvdXJjZXMgdGhhdCBhcmUgaW5hY3RpdmUgZm9yIGEgbG9uZyB0aW1lIGFuZCBzZW5kIEJZRQorCisyMDE0LTA1LTEzIDEyOjI1OjA0IC0wNzAwICBBbGVpeCBDb25jaGlsbG8gRmxhcXXDqSA8YWxlaXhAb2Jsb25nLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGRvbid0IHN0b3AgbG9vcGluZyBpZiBldmVudCBmb3VuZCBpbiB0aGUgcXVldWUKKwkgIElmIHdlIGFyZSBpbnNlcnRpbmcgYSBwYWNrZXQgaW50byB0aGUgaml0dGVyIHF1ZXVlIHdlIG5lZWQgdG8ga2VlcAorCSAgbG9vcGluZyB0aHJvdWdoIHRoZSBpdGVtcyB1bnRpbCB0aGUgcmlnaHQgcG9zaXRpb24gaXMgZm91bmQuIEN1cnJlbnRseSwKKwkgIHRoZSBjb2RlIHN0b3BzIGFzIHNvb24gYXMgYW4gZXZlbnQgaXMgZm91bmQgaW4gdGhlIHF1ZXVlLgorCSAgUmVnYXJkaW5nIGV2ZW50cywgd2Ugc2hvdWxkIG9ubHkgbW92ZSBwYWNrZXRzIGJlZm9yZSBhbiBldmVudCBpZiB0aGVyZQorCSAgaXMgYW5vdGhlciBwYWNrZXQgYmVmb3JlIHRoZSBldmVudCB0aGF0IGhhcyBhIGxhcmdlciBzZXFudW0uCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzMwMDc4CisKKzIwMTQtMDQtMTcgMTM6MDQ6MDAgKzAwMDAgIEFkcmllbiBTQ0ggPGFkcmllbi5zY2h3YXJ0emVudHJ1YmVyQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGZpeCB0aGUgbWVtb3J5IGxlYWsgb2YgbGFuZ3VhZ2UgYXR0cmlidXRlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI4NDE4CisKKzIwMTQtMDUtMTMgMTM6NDQ6MjAgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRml4IHJlZ3Jlc3Npb24gaW4gb2Zmc2V0IGV4dHJhcG9sYXRpb24KKwkgIFdoZW4gZXh0cmFwb2xhdGluZyB0aGUgb2Zmc2V0LCB3ZSBuZWVkIHRvIHVzZSB0aGUgZXh0cmFwb2xhdGUKKwkgIHN0cmlkZSByYXRoZXIgdGhlbiB0aGUgYmFzZSBzdHJpZGUuIFRoaXMgc2hvdWxkIGZpeCBzdXBwb3J0IGZvciBmb3JtYXQKKwkgIHdpdGggbW9yZSB0aGVuIHR3byBwbGFuZXMgKEk0MjAsIFk0MkIsIGV0YykuCisKKzIwMTQtMDUtMTIgMTg6MDM6MTggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICB2NGwyYnVmZmVycG9vbDogVXNlIGRlZmF1bHQgVmlkZW9JbmZvIGZvciBmcmFtZSBvcGVyYXRpb24KKwkgIFdoZW4gZG9pbmcgZnJhbWUgb3BlcmF0aW9uLCB3ZSBuZWVkIHRvIHVzZSB0aGUgZGVmYXVsdCBWaWRlb0luZm8KKwkgIGFuZCBsZXQgdGhlIGZyYW1lIEFQSSByZWFkIHRoZSB2aWRlbyBtZXRhIGluIG9yZGVyIHRvIGdldCB0aGUgc3RyaWRlCisJICBhbmQgb2Zmc2V0IHJpZ2h0LiBDdXJyZW50bHkgd2Ugd2hlcmUgdXNpbmcgdGhlIHNwZWNpYWxpemVkIFZpZGVvSW5mbworCSAgd2hpY2ggcmVmbGVjdHMgd2hhdCB0aGUgSFcgaXMgc2V0dXAgdG8uCisKKzIwMTQtMDUtMTIgMTc6MjM6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IG1pbm9yIEdWYWx1ZSBoYW5kbGluZyBvcHRpbWlzYXRpb24gaW4gcHJvYmluZyBjb2RlCisKKzIwMTQtMDUtMTIgMTc6MjA6MTQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IGF2b2lkIGxpc3RzIHdpdGggb25lIHNpbmdsZSBmcmFtZXJhdGUgaW4gcHJvYmVkIGNhcHMKKwkgIFNpbXBsaWZ5IGZyYW1lcmF0ZSBmaWVsZCBpZiBwb3NzaWJsZSwgc28gd2UgZG9uJ3QgZW5kIHVwIHdpdGgKKwkgIGUuZy4gZnJhbWVyYXRlID0gKGZyYWN0aW9uKSB7IDMwLzEgfS4gTWF5YmUgdGhlIGhlbHBlciBmdW5jdGlvbgorCSAgc2hvdWxkIGJlIG1vdmVkIHRvIGNvcmUsIGJ1dCB3ZSBjYW4gZG8gdGhpcyBsYXRlci4KKworMjAxNC0wNS0xMiAxNjo1NjozNSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBGaXggbGVhayBvZiBwYWxldHRlX2RhdGEgaW4gZXJyb3IgY2FzZXMKKwkgIENJRCAjMTIxMjE1MQorCisyMDE0LTA1LTEyIDE2OjUzOjMyICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogRnJlZSBub2RlX2hlYWRlciBpbiBlcnJvciBjYXNlcworCSAgQ0lEICMxMjEyMTM0CisKKzIwMTQtMDUtMTIgMTM6NDY6MDEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogRG9uJ3QgdXNlIFdBUk5JTkcgZm9yIG5vdC1saW5rZWQgZmxvdyByZXR1cm4KKwkgIFBvbGx1dGVzIGRlYnVnIGxvZ3MgZm9yIG5vIHJlYXNvbi4gSXQncyBvbmx5IGFuIGVycm9yIGlmIGFsbCBwYWRzCisJICByZXR1cm4gbm90LWxpbmtlZAorCisyMDE0LTA1LTEyIDEzOjQ1OjA2ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5oOgorCSAgZmx2ZGVtdXg6IFNraXAgdW5rbm93biB0YWdzIGluIHB1c2gtbW9kZQorCSAgV2UgYWRkIGEgbmV3IG1vZGUgKFNLSVApIGluIHB1c2gtbW9kZSB0byBza2lwIHRhZ3MgdGhhdCB3ZSBkb24ndCBrbm93biBhYm91dAorCSAgUGFydGlhbGx5IGZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzA3MTIKKworMjAxNC0wNS0xMCAwOToxNDozMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogQWRkIHN1cHBvcnQgZm9yIHZhcmlhYmxlIGJsb2NrIHNpemUgZmlsZXMgYW5kIHJlbW92ZSBkZWFkIGNvZGUKKwkgIFRoaXMgZGVhZCBjb2RlIHdhc24ndCB1c2VkIHNpbmNlIHRoZSAxLjAgcG9ydCBhbmQgd291bGQgbmVlZCB0bworCSAgYmUgbW9kaWZpZWQgaGVhdmlseSBmb3IgdmFyaWFibGUgYmxvY2sgc2l6ZSBzdXBwb3J0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyOTg5NAorCisyMDE0LTA1LTA5IDEyOjE0OjIzIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5jOgorCSAgdjRsMnRyYW5zZm9ybTogRml4IE5VTEwgY2hlY2sgY29weSBwYXN0ZSBlcnJvcgorCSAgQ0lEIDEyMTIxMjkKKworMjAxNC0wNS0wOSAxMjoxMTo1NCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IEZpeCBwb3RlbnRpYWwgZGVhZGxvY2sgZHVlIHRvIG1pc3NpbmcgYnJlYWsKKwkgIENJRCAxMjEyMTMxCisKKzIwMTQtMDUtMDkgMTg6MDE6MjggKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBpbmNyZW1lbnQgYWNjZXB0ZWQgcGFja2V0cyBhZnRlciBsb3NzCisJICBXaGVuIHdlIGRldGVjdCBhIGxvc3QgcGFja2V0LCBleHBlY3QgcGFja2V0cyB3aXRoIGhpZ2hlcgorCSAgc2VxbnVtIG9uIHRoZSBpbnB1dC4KKwkgIEFsc28gdXBkYXRlIHRoZSB1bml0IHRlc3QuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI5NTI0CisKKzIwMTQtMDUtMDQgMTE6MTI6NTQgLTA2MDAgIEphc29uIExpdHppbmdlciA8amxpdHppbmdlcmRldkBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICBBZGQgbmV3IHRlc3QgY2FzZS4KKworMjAxNC0wNS0wOSAxNjoxNDoyMSArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NoYXBld2lwZS5jOgorCSAgc2hhcGV3aXBlOiBubyBuZWVkIHRvIGFjdGl2YXRlIHBhZHMKKwkgIEFjdGl2YXRpb24gd2lsbCBoYXBwZW4gaW4gdGhlIHN0YXRlIGNoYW5nZQorCisyMDE0LTA1LTA5IDEyOjEwOjA0IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRG9uJ3QgbGVhayBjb25maWcgc3RydWN0dXJlCisJICB0aGlzIGZpeGVzIGEgbGVhayBvZiB0aGUgY29uZmlnIHN0cnVjdHVyZSBhbmQgdGFrZSBjYXJlIG9mIG1ha2luZyBzdXJlCisJICBjYXBzIGNhbid0IHJlYWNoIHJlZiAwIGJlZm9yZSB3ZSBhcmUgZG9uZSBkb2luZyBvdXIgY2hlY2suCisJICBDSUQgMTIxMjE0NAorCisyMDE0LTA1LTA5IDEyOjA4OjExIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogUmVtb3ZlIHVuZWVkZWQgY2FzdCBmb3IgY29kZSBjbGFyaXR5CisKKzIwMTQtMDUtMDkgMTE6NTY6NTIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMnBvb2w6IEZpeCBsZWFrIG9mIGNvbmZpZyBzdHJ1Y3R1cmUgaW4gZXJyb3IgY2FzZQorCSAgQ0lEcyAxMjEyMTY3IGFuZCAgMTIxMjE2NworCisyMDE0LTA1LTA5IDExOjUxOjI2IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRml4IHVzZSBvZiB1bml0aWxpemVkIHBvb2wgcG9pbnRlcgorCSAgQ0lEICMxMjEyMTczCisKKzIwMTQtMDUtMDkgMTY6NDg6NTggKzAyMDAgIEVyaWMgVHJvdXNzZXQgPGV0cm91c3NldEBhd294LmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBkb24ndCByZXNwb25kIHRvIGEgcG9zaXRpb24gcXVlcnkgaW4gQllURSBmb3JtYXQgd2l0aCBhIFRJTUUgcG9zaXRpb24KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mjk1NTMKKworMjAxNC0wNS0wOSAxNDoyMjo0MiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYWRlbXV4OiBkb24ndCBsZWFrIGRvY3R5cGUgc3RyaW5nIGluIGVycm9yIGNvZGUgcGF0aAorCSAgQ0lEIDEyMTIxNDUuCisKKzIwMTQtMDUtMDYgMTM6Mzc6NDcgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBSZWFkYmFjayBwb29sIGNvbmZpZyBpZiB1c2VkIHdpdGhpbiB0aGUgYmFzZWNsYXNzCisKKzIwMTQtMDUtMDYgMTI6NTg6NTkgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMjogUmVwbGFjZSBtaXNzLXVzZSBvZiBjcm9wIG1ldGEgaW4gZmF2b3VyIG9mIHByb3BlciBvZmZzZXQKKwkgIFRoaXMgbW92ZXMgYXdheSBmcm9tIGNvcHlpbmcgaW5mb3JtYXRpb24gYW5kIHN0b3JlIGV2ZXJ5dGhpbmcgaW5zaWRlCisJICB0aGUgR3N0VmlkZW9JbmZvIHN0cnVjdHVyZS4gVGhlIGFsaWduZW1lbnQgZXhwb3NlZCBieSB2NGwyIGFwaQorCSAgaXMgbm93IGhhbmRsZWQgdXNpbmcgcHJvcGVyIG9mZnNldC4KKworMjAxNC0wNS0wNiAxMjo1NTozMCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIHY0bDJvYmplY3Q6IFN0eWxlIGZpeAorCisyMDE0LTA1LTA1IDEyOjM4OjMzIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogUmVzZXQgaW1wb3J0ZWQgYnVmZmVyIHNpemUgd2l0aCBleHBlY3RlZCBzaXplCisJICBUaGlzIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgcG9vbCB3b24ndCBhbHdheXMgZGlzY2FyZCBidWZmZXIgd2l0aCB0aGVzZQorCSAgbWVtb3J5IHdoZW4gdGhleSBhcmUgcmVsZWFzZWQuCisKKzIwMTQtMDUtMDUgMTI6Mzc6NDMgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJICB2NGwyYWxsb2NhdG9yOiBSZXNldCBmbHVzaGVkIGdyb3VwCisJICBUaGlzIGVuc3VyZSB0aGF0IGEgZmx1c2hlZCBncm91cCBtZW1vcnkgYXJlIHRoZSBzYW1lIHNpemUgYXMgd2hlbiB0aGV5CisJICB3aGVyZSBvcmlnaW5hbGx5IGFsbG9jYXRlZCAvIGltcG9ydGVkLgorCisyMDE0LTA1LTA1IDEyOjA3OjMxIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICB2NGwyYnVmZmVycG9vbDogR2V0IG51bWJlciBvZiBhbGxvY2F0ZWQgYnVmZmVycyBmcm9tIGFsbG9jYXRvcgorCSAgVGhlIHZhbHVlIG9mIG51bV9hbGxvY2F0ZWQgYnVmZmVyIHdvdWxkIGdldCBjb25mdXNlZCB3aGVuCisJICBidWZmZXIgYXJlIGJlaW5nIGRpc2NhcmRlZC4KKworMjAxNC0wNS0wNSAxMjowNjo0NCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuaDoKKwkgIHY0bDJhbGxvY2F0b3I6IEFkZCBhIG1ldGhvZCB0byByZWFkIG51bWJlciBvZiBhbGxvY2F0ZWQgZ3JvdXAKKworMjAxNC0wNS0wNCAyMDoyMzo0MiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogSW1wcm92ZSBkZWJ1Z2dpbmcKKworMjAxNC0wNS0wNCAxOTo1MTo0OCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IEVuc3VyZSB3ZSBkb24ndCByZS1lbnF1ZXVlIGJ1ZmZlciBkdXJpbmcgZmx1c2gKKworMjAxNC0wNS0wNCAxOToxMzozNyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IEluaXRpbGlhbGl6ZSBkZWJ1ZyBjYXRlZ29yeQorCisyMDE0LTA1LTA0IDE2OjExOjA5IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogRml4IGxpYnY0bDIgc3VwcG9ydAorCSAgTmVlZCB0byBpbmNsdWRlIGNvbmZpZy5oLCBvdGhlcndpc2Ugd2UgZW5kdXAgZGlyZWN0bHkgdXNpbmcgdGhlCisJICBpb2N0L21tYXAvbXVubWFwIGNhbGxzIGFuZCBuZWVkIHRvIHZhbGwgdjRsMl9tdW5tYXAuCisKKzIwMTQtMDUtMDEgMTM6MDQ6MDggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogU2V0IHRoZSBmbGFncyBvbiB0aGUgb2JqZWN0CisJICBXZSB3aGVyZSBub3Qgc2V0dGluZyB0aGUgcHJvYmVkIGZsYWdzIG9uIHRoZSBhbGxvY2F0b3IsIHdoaWNoIG1lYW4gZXZlbiBpZgorCSAgQ1JFQVRFX0JVRlMgd2FzIHN1cHBvcnRlZCBvbiBzb21lIGRyaXZlciwgaXQgd291bGQgZW5kdXAgYmVpbmcgaWdub3JlZC4KKworMjAxNC0wNC0yOSAxNjo0OTo1MiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IFJlLWVucXVldWUgYnVmZmVyIGF0IHN0cmVhbSBzdGFydAorCisyMDE0LTA0LTI5IDE2OjA2OjAwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYzoKKwkgIHY0bDJhbGxvY2F0b3I6IFRoZXJlIGlzIG5vdCBncm91cCBvbiBlcnJvcgorCisyMDE0LTA0LTI5IDE0OjU2OjMxIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IEhhbmRsZSBGTFVTSF9TVE9QIGV2ZW50CisKKzIwMTQtMDQtMjkgMTM6MDU6NDEgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmM6CisJICB2NGwyYnVmZmVycG9vbDogQWNxdWlyZSBjYW5ub3QgcmV0dXJuIGEgYnVmZmVyIGZyb20gYW5vdGhlciBwb29sCisJICBSZXR1cm4gYSBidWZmZXIgZnJvbSBhbiBvdGhlcnBvb2wgaGFzIHVud2FudGVkIHNpZGUgZWZmZWN0cyB0aGF0IGxlYWQgdG8gbGVha3MgYW5kCisJICBwcmV2ZW50cyBkZWFjdGl2YXRpbmcgdGhlIHBvb2wuIEluc3RlYWQsIHdlIGNoYW5nZSB0aGUgX3Byb2Nlc3MoKSBBUEkgc28gaXQgY2FuCisJICByZXBsYWNlIHRoZSBpbnRlcm5hbCBidWZmZXIgd2l0aCB0aGUgYnVmZmVyIGZyb20gdGhlIGRvd25zdHJlYW0gcG9vbC4gVGhpcyBpbXBsaWVkCisJICBtb3ZpbmcgZnJvbSBfZmlsbCgpIHRvIF9jcmVhdGUoKSBtZXRob2QgaW4gdGhlIHNyYy4KKworMjAxNC0wNC0yOSAxMzowMDozMiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IFJlbW92ZSB1bnJlYWNoZWQgYWNxdWlyZSBjb2RlCisJICBUaGUgYWNxdWlyZSBpcyBkb25lIGluIF9wcmVwYXJlIG5vdy4KKworMjAxNC0wNC0yOSAxMjo1NzowOCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IFNhbmV0aXplIGJ1ZmZlciByZWZvdW50IGhhbmRsaW5nCisJICBCdWZmZXIgcmVmY291bnRpbmcgaXMgYSBiaXQgaGFyZCwgYmVjYXVzZSBvZiB0aGUgZHVhbGl0eSBiZXR3ZWVuIENBUFRVUkUgYW5kCisJICBPVVRQVVQgbW9kZS4gSW4gdGhlIGxvbmcgdGVybSwgd2Ugc2hvdWxkIGNvbnNpZGVyIGhhdmluZyB0d28gc2VwZXJhdGUgcG9vbAorCSAgaW5zdGVhZCBvZiB0aGlzIG1lc3MuIEF0IGxlYXN0IHN0YXRlIHNob3VsZCBiZSBiZXR0ZXIga2VwdCB0aGlzIHdheS4KKworMjAxNC0wNC0yOSAxMjo0ODowNCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJICB2NGwydHJhbnNmb3JtOiBBZGQgbW9yZSB0cmFjZXMKKworMjAxNC0wNC0yOCAwODo0ODoyNiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmg6CisJICB2NGwyLWFsbG9jYXRvcjogQWRkIFMgdG8gUkVRQlVGUy9DUkVBVEVfQlVGUyBlbnVtCisJICBBbGwgZW51bSB0aGF0IGhhcyBSRVFCVUZTIGFuZCBDUkVBVEVfQlVGUyB3aGVyZSBtaXNzaW5nIFMsIHdoaWNoIHdhcworCSAgY29uZnVzaW5nIHNpbmNlIHRoZXkgYXJlIHN1cHBvc2VkIHRvIG1hdGNoIHdpdGggYXNzb2NpY2F0ZWQgaW9jdGwgbmFtZS4gVGhpcworCSAgYWxzbyBmaXhlcyB0aGUgeWV0IHVudXNlZCBDQU5fUkVRVUVTVCBmbGFnIGNoZWNrLgorCisyMDE0LTA0LTE4IDE3OjUxOjA3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IEVuYWJsZWQgUW9TCisKKzIwMTQtMDQtMTggMTc6MDI6NTAgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IEZpeHVwIFVTRVJQVFIvRE1BQlVGIGNhcHR1cmUgc3VwcG9ydAorCisyMDE0LTA0LTE4IDE0OjQ1OjAwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IEltcHJvdmUgc2VsZWN0b24gb2YgbWluL21heCBpbiBkZWNpZGUgYWxsb2NhdGlvbgorCisyMDE0LTA0LTE4IDEzOjA5OjAwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogVXBkYXRlIGNvbmZpZyBpZiBtZXRhIGlzIG1pc3NpbmcKKwkgIFJhdGhlciB0aGVuIGhhcmQgZmFpbHVyZSwgd2Ugc2hvdWxkIHVwZGF0ZSB0aGUgY29uZmlnIHdpdGggdGhlIG1ldGEgb3B0aW9uIHdlCisJICBuZWVkIGFuZCByZXR1cm4gZmFsc2UuCisKKzIwMTQtMDQtMTEgMTc6MTA6MTEgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyOiBBZGQgRE1BQlVGIGFuZCBVU0VSUFRSIGltcG9ydGF0aW9uCisKKzIwMTQtMDQtMTcgMjE6NDU6NTggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogVmFsaWQgRkQgYXJlIGJpZ2dlciBvciBlcXVhbCB0byB6ZXJvCisKKzIwMTQtMDQtMTYgMTc6MDQ6NDIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRG9uJ3QgbGVhayBkb3duc3RyZWFtIHBvb2wgaW4gcHJvcG9zZV9hbGxvY2F0aW9uCisJICBwYXJzZV9udGhfYWxsb2NhdGlvbl9wb29sKCkgZ2l2ZSBhIHJlZiBvbiB0aGUgcG9vbCwgd2UgbmVlZCB0byB1bnJlZiBpdAorCSAgd2hlbiBkb25lLgorCisyMDE0LTA0LTE0IDEyOjE5OjM5IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyOiBJbnRyb2R1Y2UgRE1BQlVGX0lNUE9SVCBJTyBtb2RlCisKKzIwMTQtMDQtMTAgMTY6MjY6MzQgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IEFkZCBkbWFidWYgZXhwb3J0IHN1cHBvcnQKKwkgIFRoaXMgY2FuIGJlIGVuYWJsZWQgc2luZyBpby1tb2RlPWRtYWJ1Zi4gVGhpcyB3aWxsIGVuYWJsZWQgbW1hcCBiYXNlCisJICBkcml2ZXJzIHRvIGV4cG9ydCB0aGUgYnVmZmVycyBhcyBkbWFidWYuCisKKzIwMTQtMDQtMTYgMTU6NTE6MDMgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSAgdjRsMmFsbG9jYXRvcjogR3VhcmFudHkgcXVldWVkIHN0YXRlIGludGVncmV0eQorCSAgQmVjYXVzZSBvZiB0aGUgYnVmIGluIHZpZGVvYnVmMiwgZHFidWYgbWF5IGxlYXZlIHRoZSBET05FIGZsYWcgYmVpbmcsCisJICB3aGljaCB3b3VsZCBpbXBsaWVkIHRoYXQgdGhlIGJ1ZmZlciBpcyBxdWV1ZWQuIEFzIHRoaXMgaGFzIGJlZW4gYnJva2VuCisJICBmb3IgNCB5ZWFycywgc2ltcGx5IGd1YXJhbnR5IHRoZSBzdGF0ZSBmbGFncyBpbnRlZ3JpdHkgd2hlbiBkb2luZworCSAgcWJ1Zi9kcWJ1Zi4KKwkgIFNlZSBodHRwczovL3BhdGNod29yay5saW51eHR2Lm9yZy9wYXRjaC8yMzY0MS8KKworMjAxNC0wNC0xNSAxNzozMTo0MiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJICB2NGwydHJhbnNmb3JtOiBJbXBsZW1lbnQgb3Blbi9jbG9zZQorCisyMDE0LTA0LTE1IDE2OjQzOjQxIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IEVuc3VyZSBvdXRwdXQgcG9vbCBpcyBjb25maWd1cmVkCisKKzIwMTQtMDQtMTUgMTY6NDM6MTUgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5oOgorCSAgdjRsMnRyYW5zZm9ybTogQ2hlY2sgaWYgY2FwcyBoYXZlIGNoYW5nZXMgYmVmb3JlIGFzc2VydGluZworCSAgSW4gc2V0X2NhcHMsIG5vdyBjaGVja3MgaWYgY2FwcyBhY3R1YWxseSBjaGFuZ2VkIGFuZCBzdWNjZWVkIGlmIHRoZXkgZGlkbid0CisJICBjaGFuZ2UuCisKKzIwMTQtMDQtMTUgMTY6NDE6NDYgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmM6CisJICB2NGwydmlkZW9kZWM6IEVuc3VyZSBwb29sIGlzIGNvbmZpZ3VyZWQKKworMjAxNC0wNC0wOCAxODo1NDowOSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBBbHdheXMgc2V0IGEgc2l6ZSB3aGVuIGRlY2lkaW5nIGFsbG9jYXRpb24KKworMjAxNC0wNC0wOCAxODoyMDoyNSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBJbXByb3ZlZCBkZWNpZGUgYWxsb2NhdGlvbgorCSAgSW1wcm92ZSBkZWNpZGUgYWxsb2NhdGlvbiBzbyBpdCBwcm9wZXJseSBjb25maWd1cmUgYm90aCBsb2NhbCBhbmQgZG93bnN0cmVhbQorCSAgYnVmZmVyIHBvb2xzLiBBbHNvIHJlYWQgYmFjayB0aGUgcG9vbCBjb25maWcgaWYgaXQgd2FzIGNoYW5nZWQgdG8gdG8gZHJpdmVyCisJICBsaW1pdGF0aW9ucy4KKworMjAxNC0wNC0xNSAxMzozMDowMiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IERvIG5vdCBwcmUtY29uZmlndXJlIHRoZSBwb29sCisJICBQcmUtY29uZmlndXJpbmcgdGhlIHBvb2wgaXMgZXJyb3IgcHJvbmUsIHNpbmNlIGl0IG1heSBoaWRlIGEgY29uZmlndXJhdGlvbiBmYWlsdXJlIGFuZAorCSAgZW5kdXAgd2l0aCBhIHBvb2wgdGhhdCBpcyBub3QgY29uZmlndXJlZCB0aGUgd2F5IGl0IHNob3VsZCAoZS5nLiBubyB2aWRlbyBtZXRhLCB3cm9uZworCSAgcXVldWUgc2l6ZSwgZXRjLikKKworMjAxNC0wNC0xNSAxMzoyMzozMyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IFByZXNlcnZlIGRvd25zdHJlYW0gbWluaW11bSBldmVuIGluIFJXCisKKzIwMTQtMDQtMTUgMTM6MjA6MTIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICB2NGwyYnVmZmVycG9vbDogVHVybiBjcm9wbWV0YSBpbnRvIGEgY3VzdG9tIG9wdGlvbgorCSAgVHVybiBjcm9wIG1ldGEgaW50byBhIGN1c3RvbSBvcHRpb24gYW5kIG1ha2Ugc3VyZSBpdCdzIHRoZXJlIGlzIG5lZWRlZC4KKworMjAxNC0wNC0wOSAxMjo1MzoxOSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyYnVmZmVycG9vbDogRWFybHkgY2F0Y2ggc2hvcnQgYWxsb2NhdGlvbgorCSAgQ2F0Y2ggc2hvcnQgYWxsb2NhdGlvbiBhZnRlciBzYXZpbmcgdGhlIGZvcm1hdC4gVGhpcyBpcyBub3QgYSBjYXRjaCBhbGwsIGJ1dCBzaG91bGQgY2F0Y2gKKwkgIG1vc3Qgb2YgdGhlIG1pc3MtYmVoYXZpbmcgZHJpdmVycyB3aGVuIGRvaW5nIFNfRk1UL0dfRk1UIGFuZCBhdm9pZCBwb3RlbnRpYWwgY3Jhc2guCisKKzIwMTQtMDQtMDQgMjI6NDY6NDAgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICB2NGwyYnVmZmVycG9vbDogUG9ydCB0byB1c2UgR3N0VjRsMkFsbG9jYXRvcgorCisyMDE0LTA0LTA0IDIyOjM1OjQ4IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5oOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5oOgorCSAgSW1wbGVtZW50IFY0bDIgQWxsb2NhdG9yCisJICBUaGlzIGdvYWwgb2YgdGhpcyBhbGxvY2F0b3IgaXMgbWFpbmx5IHRvIGFsbG93IHRyYWNraW5nIHRoZSBtZW1vcnkuCisJICBDdXJyZW50bHksIHdoZW4gYSBidWZmZXIgbWVtb3J5IGhhcyBiZWVuIG1vZGlmaWVkLCB0aGUgYnVmZmVyIGFuZCBpdCdzCisJICBtZW1vcnkgaXMgZGlzcG9zZWQgYW5kIGxvc3QgdW50aWwgdGhlIHN0cmVhbSBpcyByZXN0YXJ0ZWQuCisKKzIwMTQtMDQtMTYgMTY6MzU6NDkgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRG9uJ3QgYWR2ZXJ0aXNlIGNyb3AgbWV0YQorCSAgQ3VycmVudGx5IHdlIGFkdmVydGlzZSBjcm9wIG1ldGEsIGJ1dCBub3QgZWxlbWVudCBoYW5kbGUgc3VwcG9ydCB0aGlzIG1ldGEuCisKKzIwMTQtMDQtMDggMTg6MTg6NTcgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogU2V0dXAgcG9vbCBhbHJlYWR5IHNlbmQgZWxlbWVudCBlcnJvcgorCisyMDE0LTA0LTA4IDE4OjE3OjMxIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IFdvcmthcm91bmQgZGVjb2RlciB0aGF0IHNldCBudW1fcGxhbmVzIHRvIDAgaW4gdGhlIGZvcm1hdAorCSAgU29tZSB3ZWxsIGtub3duIGRlY29kZXIgd3JvbmdseSBzZXQgbnVtX3BsYW5lcyB0byAwIGluIHRoZWlyIGZvcm1hdCBpbnN0ZWFkIG9mCisJICBvbmUuIEluIHRoaXMgY2FzZSB3ZSB3b3VsZCBlbmR1cCB3aXRoIG5vIHNpemUgd2hlbiBkZWNpZGluZyBidWZmZXIgYWxsb2NhdGlvbi4KKworMjAxNC0wNC0wOCAxNzozNDoxOSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBFbnN1cmUgc2l6ZSBiZWZvcmUgY29uZmlndXJpbmcgdGhlIHBvb2wKKworMjAxNC0wNC0wNCAyMjozODowNSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyb2JqZWN0OiBTZXQgbWluaW11bSBidWZmZXJzIHRvIDIKKwkgIEFsbCB0aGUgZWxlbWVudCByZXF1aXJlcyBhdCBsZWFzdCB0d28gYnVmZmVycy4gVGhpcyBpcyBub3QgdXNlZCBmb3IgUlcgbW9kZS4KKworMjAxNC0wNC0wNCAyMjozNzoxNCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyb2JqZWN0OiBSZW1vdmUgdW51c2VkIE1BWF9CVUZGRVJTIGRlZmluZQorCisyMDE0LTA0LTA0IDIyOjM2OjM3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IERvbid0IGhhcmRjb2RlIG1pbi9tYXggdXNlIGRlZmF1bHQgaW5zdGVhZAorCisyMDE0LTA0LTEwIDE3OjQ5OjQxIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IEluc3RhbGwgUFJPUF9DQVBUVVJFX0lPX01PREUgd2l0aCByaWdodCBJRAorCisyMDE0LTA0LTA4IDE4OjU0OjUwIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IGRlY2lkZV9hbGxvY2F0aW9uIHJldHVybnMgYSBib29sZWFuCisKKzIwMTQtMDQtMTAgMTc6NDk6MjkgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmM6CisJICB2NGwydmlkZW9kZWM6IEluc3RhbGwgUFJPUF9DQVBUVVJFX0lPX01PREUgd2l0aCByaWdodCBJRAorCisyMDE0LTAzLTI3IDEzOjIxOjI1IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IEFkZCBwcm9wb3NlX2FsbG9jYXRpb24KKwkgIFRoaXMgc2hvdWxkIHJlbW92ZSAxIGNvcHkgYmV0d2VlbiB0aGUgZGVjb2RlciBhbmQgdGhlIHRyYW5zZm9ybS4KKworMjAxNC0wMy0yNyAxMzoyMDo1MyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMjogTW92ZSBwcm9wb3NlIGFsbG9jYXRpb24gdG8gdjRsMm9iamVjdAorCisyMDE0LTAzLTIwIDE3OjI2OjA1IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkgIHY0bDJ0cmFuc2Zvcm06IEZpeHVwIGNhcHMgcXVlcnkKKworMjAxNC0wMy0yMCAxNTozMToyMiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJICB2NGwydHJhbnNmb3JtOiBTZXR1cCBjcm9wcGluZyBpZiBuZWVkZWQKKworMjAxNC0wMy0xOSAxNzoyNToxNiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJICB2NGwydHJhbnNmb3JtOiBFeHBvc2UgQkdSQSBhbmQgQVJHQiBmb3JtYXRzCisKKzIwMTQtMDMtMTggMTc6MzM6MzggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5jOgorCSAgdjRsMnRyYW5zZm9ybTogRW5zdXJlIG91dHB1dCBwb29sIGlzIGFjdGl2YXRlZAorCSAgVGhhdCBwb29sIG1heSBiZSBkaWZmZXJlbnQgdGhlbiB0aGUgaW50ZXJuYWwgcG9vbC4KKworMjAxNC0wMy0xNiAxOToxMToxNiArMDEwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJICB2NGwydHJhbnNmb3JtOiBFbnN1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2xzIGFjdGljYXRpb24KKworMjAxNC0wMy0xNiAxMTozNjoxOSArMDEwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJICB2NGwydHJhbnNmb3JtOiBNb3ZlIHN1Ymluc3RhbmNlIHN1YmNsYXNzIGluaXQgbmVhciBvdGhlciBpbml0CisKKzIwMTQtMDMtMTUgMTg6NTY6NTEgKzAxMDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5jOgorCSAgdjRsMnRyYW5zZm9ybTogU3RvcCBzdHJlYW0gYmVmb3JlIGNsb3NpbmcgdGhlIGRldmljZXMuCisKKzIwMTQtMDMtMTUgMTY6NTM6NTQgKzAwMDAgIFbDrWN0b3IgTWFudWVsIErDoXF1ZXogTGVhbCA8dmphcXVlekBpZ2FsaWEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmM6CisJICB2NGwydHJhbnNmb3JtOiBjb3B5IG1ldGRhdGEKKworMjAxNC0wMy0wNCAxODozMToyNyAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uaDoKKwkgIEltcGxlbWVudCBHc3RWNGwyVHJhbnNmb3JtCisJICBJbXBsZW1lbnQgYSB2NGwyIGVsZW1lbnQgdGhhdCB3cmFwcyBIVyB2aWRlbyBjb252ZXJ0ZXJzLgorCisyMDE0LTAzLTI3IDE4OjQxOjA3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyOiBQcm9iZSBmb3IgQ1JFQVRFX0JVRlMgaW4gb3JkZXIgdG8gY29ycmVjdGx5IHNldCBwb29sIG1pbi9tYXgKKwkgIEluIG9yZGVyIHRvIGNvcnJlY3RseSBzZXQgdGhlIHBvb2wgbWluL21heCwgd2UgbmVlZCB0byBwcm9iZSBmb3IgQ1JFQVRFX0JVRlMKKwkgIGlvY3RsLiBUaGlzIGNhbiBiZSBkb25lIGFzIHNvb24gYXMgdGhlIGZvcm1hdCBoYXMgYmVlbiBuZWdvdGlhdGVkIHVzaW5nIGEKKwkgIGNvdW50IG9mIDAuCisKKzIwMTQtMDMtMjUgMTU6MjE6MDMgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMjogTW92ZSBjYXB0dXJlIGVvcyBoYW5kbGluZyBpbiBfcHJvY2VzcygpCisJICBOb3cgdGhhdCB3ZSBtaWdodCBiZSBjb3B5aW5nIG91dCBidWZmZXIgKGUuZy4gZG93bnN0cmVhbSBkb24ndCBzdXBwb3J0IHZpZGVvCisJICBtZXRhIGJ1ZyB3ZSBuZWVkIGl0KSB3ZSBuZWVkIHRvIG1vdmUgdGhlIEVPUyBoYW5kbGluZyBpbnNpZGUgdGhlIHByb2Nlc3MKKwkgIG1ldGhvZC4KKworMjAxNC0wMy0yNSAxMDo0OTozOSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBGaXggc3VwcG9ydCBmb3IgcGxhbmFyIGZvcm1hdCBpbiAxIHY0bDIgbXBsYW5lCisJICBTbyBmYXIgd2Ugd2hlcmUgb25seSBzZXR0aW5nIHNhdmluZyB0aGUgZmlyc3QgcGxhbmUgc3RyaWRlIGluIHRoZSBtZXRhLiBUaGlzIHdhcworCSAgbGVhZGluZyB0byB3cm9uZyB2YWx1ZXMgaW4gR3N0VmlkZW9NZXRhLgorCisyMDE0LTAzLTE5IDE3OjUyOjA4IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBDbGVhbmx5IGZhaWwgaWYgc2V0X2Zvcm1hdCBpcyBuZXZlciBjYWxsZWQKKworMjAxNC0wMy0xOSAxNzowMDo1NiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBFeHBvc2UgUkdCMzIgZm9ybWF0cyB3aXRoIGFuZCB3aXRob3V0IGFscGhhCisJICBBcyBzb29uIGEgdGhlIGFscGhhIGNvbXBvbmVudCBjYW4gYmUgc2V0LCB3ZSBjYW4gZXhwb3NlIHRoZSBSR0IzMiBhbmQgQkdSMzIKKwkgIGZvcm1hdCBhcyBBUkdCIGFuZCBCR1JBIGFzIGxvbmcgd2UgY2FuIGRldGVybWluaXN0aWNhbGx5IHNldCB0aGUgYWxwaGEgcGFkZGluZworCSAgdmFsdWUuCisKKzIwMTQtMDMtMTggMTU6NDk6NDkgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IENvcnJlY3RseSBjaGVjayBpZiB2aWRlbyBtZXRhIGlzIG5lZWRlZAorCSAgQ29ycmVjdGx5IGNoZWNrIGlmIHZpZGVvIG1ldGEgaXMgbmVlZGVkLiBJbiBidWZmZXIgcG9vbCwgdHJ1c3QgbmVlZF92aWRlb19tZXRhCisJICBmbGFnIGluIG9yZGVyIHRvIGRlY2lkZSBpZiBjb25maWd1cmF0aW9uIHNob3VsZCBzdWNjZWVkLgorCisyMDE0LTAzLTE4IDE1OjQ1OjE4IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IEZpeCB0aWxlZCBzdHJpZGUgcmVxdWVzdAorCSAgRml4IHN0cmlkZSByZXF1ZXN0IGZvciB0aWxlZCBmb3JtYXQgYW5kIGltcHJvdmUgbG9nZ2luZy4KKworMjAxNC0wMy0xOCAxMTo1Mzo1NyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRW5zdXJlIHZpZGVvIGFuZCBjcm9wIG1ldGEgYXJlIGVuYWJsZWQgaWYgbmVlZGVkCisJICBJbiBjZXJ0YWluIGNhc2VzIHdlIGNhbm5vdCBsaXZlIHdpdGhvdXQgdmlkZW8gbWV0YSBhbmQvb3IgY3JvcCBtZXRhCisJICBiZWluZyBlbmFibGVkIGluIG91ciBpbnRlcm5hbCBidWZmZXIgcG9vbC4gRW5zdXJlIHRoaXMgaXMgYWx3YXlzIHRoZSBjYXNlLAorCSAgcmVnYXJkbGVzcyBvZiBoYXZpbmcgc3VwcG9ydCBmb3IgYWxsb2NhdGlvbiBxdWVyeS4KKworMjAxNC0wMy0xNiAxODozOTozMiArMDEwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogRW5zdXJlIGludGVybmFsIHBvb2wgYXJlIGFjdGl2YXRlZAorCisyMDE0LTAzLTE2IDE3OjAxOjEwICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBDaGVjayB0aGF0IHBvb2wgd2hlcmUgYWxsb2NhdGVkIGJlZm9yZSBmbHVzaGluZyB0aGVtCisJICBVcG9uIGVycm9yLCB0aGUgcG9vbHMgbWlnaHQgbm90IGhhdmUgYmVlbiBhbGxvY2F0ZWQgeWV0LCBoZW5jZSB3ZSBzaG91bGQgbm90CisJICB0cnkgYW5kIGZsdXNoIHRoZW0gKGV2ZW4gdGhvdWdoIHdlIHN0aWxsIHdhbnQgdG8gbWFrZSBzdXJlIHRoZSBwcm9jZXNzaW5nIHRocmVhZAorCSAgaXMgZnVsbHkgc3RvcHBlZCkuCisKKzIwMTQtMDMtMTYgMTY6NTU6NDMgKzAxMDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJICB2NGwyYnVmZmVycG9vbDogRW5mb3JjZSBhY3RpdmF0aW9uIG91dHNpZGUgb2YgcHJvY2VzcworCSAgRW5mb3JjZSBwb29sIGJlaW5nIGFjdGl2YXRlIGZyb20gYmVmb3JlIGNhbGxpbmcgcG9vbCBwcm9jZXNzLiBUaGlzIHNob3VsZAorCSAgaGVscCBjYXRjaGluZyBiYXNpYyBlcnJvcnMgaW4gdGhlIHVzYWdlIG9mIGJ1ZmZlciBwb29sLgorCisyMDE0LTAzLTE2IDEyOjQ0OjE0ICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IGRvbid0IHVzZSBvd24gcG9vbCBpZiBkb3duc3RyZWFtIGRvbid0IHN1cHBvcnQgdmlkZW8gbWV0YQorCisyMDE0LTAzLTE0IDAwOjMxOjMyICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogVXNlIG9iai0+bl92NGwyX3BsYW5lcyBmb3IgY29ycmVjdCBudW1iZXIgb2YgcGxhbmVzCisJICBCdWZmZXIgcG9vbCB3YXMgZ3Vlc3Npbmcgd3JvbmdseSB0aGUgbnVtYmVyIG9mIHBsYW5lcyByYXRoZXIKKwkgIHRoZW4gcmVhZGluZyB0aGUgdmFsdWUgZnJvbSBvYmotPm5fdjRsMl9wbGFuZXMuIFRoaXMgd2FzIGNhdXNpbmcKKwkgIGZvcm1hdCBZVTEyIChJNDIwKSB0byBmYWlsIHVwb24gY2hlY2suCisKKzIwMTQtMDMtMDcgMTY6Mzk6MjkgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRml4IGhhbmRsaW5nIG9mIGNvbnRpdW91cyB2cyBub24tY29udGlndW91cyBzdXBwb3J0CisJICBUaGUgY29tcGxleCBtZWNoYW5pYyB0byB0cnkgYW5kIGNob29zZSB0aGUgcmlnaHQgdGhpbmcgZGlkIG5vdCB3b3JrLiBJbnN0ZWFkLAorCSAgc2ltcGx5IHByb2JlIHRoZSBub24tY29udGlndW91cyBmb3JtYXQgZmlyc3QgYW5kIHRoZW4gdGhlIGNvbnRpZ3VvdXMgb25lLgorCSAgVGhpcyBpcyBpbiBmYWN0IHZlcnkgbG93IG92ZXJoZWFkLCBhcyB0aGVyZSBpcyBhIHJlbGF0aXZlbHkgc21hbGwgbnVtYmVyIG9mCisJICBwaXhlbCBmb3JtYXQgc3VwcG9ydGVkIGJ5IGVhY2ggZGV2aWNlcy4KKworMjAxNC0wNC0xNSAxNTowNzoyMyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5oOgorCSAgdjRsMjogQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgYWxpZ25tZW50IGFuZCBjcm9wcGluZworCisyMDE0LTAzLTEzIDE5OjI0OjUxICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMm9iamVjdDogUmVuYW1lIHNldHVwX2Zvcm1hdCgpIG1ldGhvZCBpbnRvIGFjcXVpcmVfZm9ybWF0KCkKKwkgIFRoZSBzZXR1cF9mb3JtYXQoKSB3YXMgY29uZnVzaW5nIHNpbmNlIGl0IGRvZXMgbm90IHNldCBhbnl0aGluZywgaW4gZmFjdAorCSAgaXQgcmVhZHMgdGhlIHNldHVwIGZyb20gdGhlIGRyaXZlciBhbmQgc2F2ZSBpdC4KKworMjAxNC0wMy0xMyAxODoyMTo0MSArMDEwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBNb3ZlIHR5cGUgZGVjbGFyYXRpb24gdG8gdGhlIHRvcAorCisyMDE0LTAzLTEyIDE4OjA3OjM4ICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBQcm90ZWN0IE5VTEwgcG9vbCB3aGlsZSBnb2luZyB0byBSRUFEWQorCSAgV2hlbiB0aGUgcGlwZWxpbmUgZmFpbHMgZWFybHksIHRoZSBwb29sIG1pZ2h0IGJlIHVuc2V0IGJlZm9yZSB0aGUgcHJvY2Vzc2luZworCSAgdGhyZWFkIGhhcyBydW4gb25jZS4gQWRkIHByb3RlY3Rpb24gYWdhaW5zdCB0aGF0LgorCisyMDE0LTAzLTEyIDE4OjAxOjA5ICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IEZhaWwgY2xlYW5seSBpZiBwaXhlbCBmb3JtYXQgaXMgdW5rb3duIG9yIG5vdCByYXcgdmlkZW8KKwkgIENlcnRhaW4gZGVjb2RlciBoYXMgYmVlbiBmb3VuZCB0byBub3QgY2hvb3NlIGEgZm9ybWF0IGF1dG9tYXRpY2FsbHkuIFJ1bm5pbmcKKwkgIHY0bDJ2aWRlb2RlYyBvbiB0aGVzZSB3b3VsZCBhc3NlcnQuIFRoaXMgcGF0Y2ggd2lsbCBtYWtlIGl0IGZhaWwgY2xlYW5seQorCSAgaW5zdGVhZC4KKworMjAxNC0wMy0xMiAxNzo1NjoxOCArMDEwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogQ2xlYXIgdGhlIGlucHV0IHN0YXRlIHBvaW50ZXIgYWZ0ZXIgdW5yZWYKKwkgIElmIGNhcHMgYXJlIHNldCBhZ2Fpbiwgd2UgaGF2ZSBhIHJpc2sgb2QgcmV0dXJuaW5nIGZyb20gc2V0X2Zvcm1hdCB3aXRoIGEKKwkgIGlucHV0X3N0YXRlIHBvaW50aW5nIHRvIGRlYWQgbWVtb3J5LiBDbGVhcmluZyB0aGUgcG9pbnRlciBhZnRlciB1bnJlZiBmaXgKKwkgIHRoaXMgaXNzdWUuCisKKzIwMTQtMDMtMTIgMTc6MTE6MTYgKzAxMDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmM6CisJICB2NGwydmlkZW9kZWM6IGhhbmRsZSBzdG9wIGJlaW5nIGNhbGxlZCB3aXRob3V0IGZsdXNoCisJICBVcHBvbiBjZXJ0YWluIGRvd25zdHJlYW0gZXJyb3IsIHN0b3AoKSBpcyBjYWxsZWQgd2l0aG91dCBhIGZsdXNoKCkuIFRoaXMgbWVhbiB0aGF0CisJICB0aGUgc3RyZWFtaW5nIHRocmVhZCBtYXkgc3RpbGwgYmUgcnVubmluZyBldmVuIHRob3VnaCB1bmxvY2sgaGFzIGJlZW4gY2FsbGVkLgorCSAgTm93IGNhbGxpbmcgZmx1c2ggdG8gcmVzZXQgdGhlIGRlY29kZXIgc3RhdGUgaWYgd2UgYXJlIHByb2Nlc3NpbmcuCisKKzIwMTQtMDMtMDYgMTg6MTM6MTQgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmM6CisJICB2NGwydmlkZW9kZWM6IERlZmF1bHQgdG8gdGVtcGxhdGUgaW4gY2FwcyBxdWVyeQorCisyMDE0LTAzLTExIDE0OjIzOjMyIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBFbnN1cmUgcHJvY2Vzc2luZyB0aHJlYWQgaGFzIHN0b3BwZWQgd2hlbiBkcmFpbmluZworCisyMDE0LTAzLTExIDE0OjAxOjI3IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSAgdjRsMnZpZGVvZGVjOiBEb24ndCBkcmFpbiBpZiBwcm9jZXNzaW5nIHRocmVhZCBpcyBpbmFjdGl2ZQorCisyMDE0LTA1LTA4IDA5OjQ5OjI0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IENsZWFuIHVwIGFsbCBwZW5kaW5nIG9wZXJhdGlvbnMgZnJvbSBsaWJzb3VwIGJlZm9yZSB1bnJlZmZpbmcgb3VyIGNvbnRleHQKKwkgIFdoZW4gd2UgY2FuY2VsIGNvbm5lY3Rpb24gYXR0ZW1wdHMgYW5kIHNpbWlsYXIgdGhpbmdzLCB0aGVyZSBhcmUgc3RpbGwKKwkgIHNvbWUgb3BlcmF0aW9ucyBwZW5kaW5nIG9uIG91ciBtYWluIGNvbnRleHQgZnJvbSB0aGUgR0NhbmNlbGxhYmxlcy4gV2UKKwkgIHNob3VsZCBsZXQgdGhlbSBhbGwgcnVuIGJlZm9yZSB1bnJlZmZpbmcgb3VyIGNvbnRleHQsIG90aGVyd2lzZSB3ZSBsZWFrCisJICBmaWxlIGRlc2NyaXB0b3JzLgorCSAgVW5mb3J0dW5hdGVseSB0aGlzIHJlcXVpcmVzIGxpYnNvdXAgMi40Ny4wIG9yIG5ld2VyIGFzIGVhcmxpZXIgdmVyc2lvbnMKKwkgIHN0ZWFsIG91ciBtYWluIGNvbnRleHQgZnJvbSB1cyBhbmQgd2UgY2FuJ3QgdXNlIGl0IGZvciBjbGVhbnVwIGxhdGVyCisJICB3aXRob3V0IGFzc2VydGlvbnMgYW5kIGZ1bm55IGNyYXNoZXMuCisJICBCYXNlZCBvbiBhIHBhdGNoIGJ5IERtaXRyeSBTaGF0cm92IDxzaGF0cm92QGdtYWlsLmNvbT4uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjYzOTQ0CisKKzIwMTQtMDUtMDcgMTU6NDk6MzkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJICB0ZXN0czogZml4IGNvbXBpbGF0aW9uIG9mIHNvdXBodHRwc3JjIHRlc3QgZm9yIGxpYnNvdXAgMi40MCBmb3IgcmVhbAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNzMyOQorCisyMDE0LTA1LTA3IDEzOjIzOjUwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSAgdGVzdHM6IGZpeCBjb21waWxhdGlvbiBvZiBzb3VwaHR0cHNyYyB0ZXN0IGZvciBsaWJzb3VwIDIuNDAKKwkgIFNPVVBfQ0hFQ0tfVkVSU0lPTiB3YXMgb25seSBhZGRlZCBpbiAyLjQxLCBidXQgd2Ugb25seQorCSAgZGVwZW5kIG9uIDIuNDAuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI3MzI5CisKKzIwMTQtMDUtMDcgMDA6NTg6MTUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IHNraXAgUElDVFVSRSBoZWFkZXJzIHdpdGhvdXQgYW55IGltYWdlIGRhdGEKKwkgIEZpeGVzIHdhcm5pbmcgaWYgdGhlIGltYWdlIGxlbmd0aCBpcyAwLgorCisyMDE0LTA1LTA2IDA5OjIyOjE4ICswMDAwICDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyIDxscm4xOTg2QGdtYWlsLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiB1c2UgWDExIGRldGVjdGlvbiBtYWNybyBmcm9tIGNvbW1vbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyOTYyMQorCisyMDE0LTA0LTMwIDExOjEzOjEyICswMjAwICBHdWlsbGF1bWUgRGVzbW90dGVzIDxndWlsbGF1bWUuZGVzbW90dGVzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9SRUFETUU6CisJICBydHAvUkVBRE1FOiB1cGRhdGUgcGlwZWxpbmVzIHRvIHdvcmsgd2l0aCAxLjAKKwkgIC0gVXNlIGdzdC1saWJhdiBlbmNvZGVycy9kZWNvZGVycyBpbnN0ZWFkIG9mIGdzdC1mZm1wZWcKKwkgIC0gZ3N0cnRwaml0dGVyYnVmZmVyIC0+IHJ0cGppdHRlcmJ1ZmZlcgorCSAgLSBnc3QtbGF1bmNoLTAuMTAgLT4gZ3N0LWxhdW5jaC0xLjAKKwkgIC0gQWRkICd2aWRlb2NvbnZlcnQnIGVsZW1lbnQKKwkgIC0geHZpbWFnZXNpbmsgLT4gYXV0b3ZpZGVvc2luaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyOTI0NworCisyMDE0LTA1LTA1IDE0OjQxOjA1ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgIG1hdHJvc2thOiByZWppZyB0ZXN0IHRvIGF2b2lkIHVuZGVmaW5lZCBzaGlmdCBiZWhhdmlvcgorCSAgQ292ZXJpdHkgMTE5NTEyMSwgMTE5NTEyMAorCisyMDE0LTA1LTA1IDE0OjMzOjM4ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZweC9nc3R2cDllbmMuYzoKKwkgIHZwOWVuYzogZG8gbm90IGRlcmVmZXJlbmNlIE5VTEwgcG9pbnRlcgorCSAgQ292ZXJpdHkgMTE5NzcwMworCisyMDE0LTA1LTA1IDE0OjMyOjA2ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGVuc3VyZSB3ZSBkb24ndCBkZXJlZmVyZW5jZSBhIE5VTEwgcG9pbnRlcgorCSAgd2hpbGUgd29ya2luZyBvdXQgdGhlIGNvZGVjIElELgorCSAgQ292ZXJpdHkgMTE5NTE0OAorCisyMDE0LTA1LTA1IDEyOjA3OjI1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJICB2NGwyOiBtaW5vciBmaXggZm9yIGNsb3NpbmcgdGhlIGZkCisJICBUaGUgZmQgcmV0dXJuZWQgYnkgb3BlbigpIGNvdWxkIHRoZW9yZXRpY2FsbHkgYmUgMCBhcyB3ZWxsLgorCSAgQ292ZXJpdHkgQ0lEIDEyMTE4MjMuCisKKzIwMTQtMDUtMDQgMjA6MjM6MjkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQG9jcmV0ZS5jYT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkgIHJ0cGF1eC9ydHBydHg6IE1ha2UgdGVzdHMgbm9uLXJhY3kKKwkgIEZpeCB0aGUgcmFjaW5lc3MgYnkgaXRlcmF0aW5nIG9uIGEgY29uZGl0aW9uIGluc3RlYWQgb2YgdXNpbmcgdGhlIGdtYWlubG9vcC4KKwkgIERvbid0IHVzZSB0aGUgRU9TIGFzIHRoZSB0YXJnZXQsIG90aGVyd2lzZSB0aGUgcmV0cmFuc21pc3Npb24gb2YgdGhlIGxhc3QKKwkgIHBhY2tldHMgYXJlIGxvc3QuIEFsc28gY291bnQgdGhlIHJldHJhbm1pc3Npb25zIHJlcXVlc3RzIHRoYXQgYXJlIGRyb3BwZWQuCisJICBDaGVjayB0aGUgY29uZGl0aW9uIGJlZm9yZSBibG9ja2luZyBvbiB0aGUgR0NvbmQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mjg1MDEKKworMjAxNC0wNS0wNCAyMjozMjo1NCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAb2NyZXRlLmNhPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmg6CisJICBydHBydHhyZWNlaXZlOiBXYWl0IHVudGlsIHRpbWVvdXQgdG8gY2xlYXIgYXNzb2NpYXRpb24gcmVxdWVzdHMKKwkgIElmIHR3byBzdHJlYW1zIHJlcXVlc3QgYSByZXRyYW5taXNzaW9uIGZvciB0aGUgc2FtZSBTU1JDLCBpZ25vcmUgdGhlIHNlY29uZAorCSAgb25lIGlmIHRoZSBmaXJzdCBvZW4gaXMgbGVzcyB0aGFuIG9uZSBzZWNvbmQgb2xkLCBvdGhlcndpc2UgdGltZSBvdXQgdGhlIGZpcnN0CisJICBvbmUgYW5kIGlnbm9yZSB0aGUgc2Vjb25kLgorCisyMDE0LTA1LTA0IDE4OjU5OjMzIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBvY3JldGUuY2E+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwbXV4LmM6CisJICBydHBtdXg6IEFsd2F5cyBsZXQgdXBzdHJlYW0gY2hvc2UgdGhlIHNzcmMgaWYgaXQgd2lzaGVzCisKKzIwMTQtMDUtMDQgMTM6Mzc6NDYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGF2b2lkIHN0YWxsIGJ5IGNvcnJ1cHRlZCBzZXFudW0gYWNjb3VudGluZworCisyMDE0LTA1LTA0IDAxOjE0OjMzIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBvY3JldGUuY2E+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWRldmljZW1vbml0b3IuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZWRldmljZW1vbml0b3IuaDoKKwkgIHB1bHNlZGV2aWNlbW9uaXRvcjogSW5kZXggYXJlIHBlciBmYWNpbGl0eSwgbm90IGdsb2JhbAorCSAgU28gbmVlZCB0byBrZWVwIHRoZSB0eXBlIG9mIGRldmljZSBpbiB0aGUgZGV2aWNlIG9iamVjdAorCisyMDE0LTA1LTA0IDAxOjEzOjI0IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBvY3JldGUuY2E+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWRldmljZW1vbml0b3IuYzoKKwkgIHB1bHNlZGV2aWNlbW9uaXRvcjogcGFfc3Vic2NyaXB0aW9uX2V2ZW50X3QgYXJlIGVudW1zLCBub3QgZmxhZ3MKKwkgIENvdmVyaXR5IDExOTUxMzIKKworMjAxNC0wNS0wMiAyMjo0Mjo1NCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJkZXZpY2Vtb25pdG9yLmM6CisJICB2NGwyZGV2aWNlbW9uaXRvcjogUG9ydCB0byB1c2UgR3N0VjRsMkl0ZXJhdG9yCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI3OTI1CisKKzIwMTQtMDUtMDIgMjE6Mzg6MzAgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5oOgorCSAgdjRsMjogVXNlIHNpbmdsZSBwYXNzIGl0ZXJhdG9yIGZvciBNMk0gcHJvYmUKKwkgIEluc3RlYWQgb2YgaGF2aW5nIGVhY2ggTTJNIGNsYXNzIGRvIHRoZWlyIG93biBwcm9iaW5nLCB1c2UgdGhlCisJICBHc3RWNGwySXRlcmF0b3IgYW5kIHByb2JlIGFsbCBkZXZpY2VzIGluIGEgc2luZ2xlIHBhc3MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI3OTI1CisKKzIwMTQtMDUtMDIgMTY6NTU6MDUgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi92NGwyLXV0aWxzLmM6CisJKiBzeXMvdjRsMi92NGwyLXV0aWxzLmg6CisJICB2NGwyOiBBZGQgYSBjb21tb24gZGV2aWNlIGVudW1lcmF0b3IKKwkgIFRoaXMgd2lsbCBhbGxvdyByZW1vdmluZyBjb2RlIGR1cGxpY2F0aW9uIChoZW5jZSBidWdzIGR1cGxpY2F0aW9uKS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mjc5MjUKKworMjAxNC0wMy0xNiAxMTozODowNyArMDEwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5oOgorCSAgdjRsMnZpZGVvZGVjOiBTaW1wbGlmeSBzdWItaW5zdGFuY2lhdGlvbiBtZWNoYW5pc20KKwkgIFNpbXBsaWZ5IHN1Yi1pbnN0YW5jaWF0aW9uIGJ5IGRlZmluaW5nIGFuIGFic3JhY3QgdHlwZSBhbmQgdXNpbmcgc3VidHlwZQorCSAgY2xhc3MgYW5kIGluc3RhbmNlIGluaXQgY2FsbGJhY2suIFRoaXMgYWxzbyBmaXhlcyBhIGJ1ZyB3aGVyZSB0aGUgdGVtcGxhdGUKKwkgIHBhZHMgZ2V0IGluaXRpYWxpemVkIHRvbyBsYXRlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNzkyNQorCisyMDE0LTA1LTAyIDE4OjE4OjI2IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMi5jOgorCSAgdjRsMjogQ2xlYW51cCBwbHVnaW4gcmVnaXN0cmF0aW9uCisJICBUaGVyZSBpcyBubyBwbGFuIHRvIGludHJvZHVjZSBzcGVjaWFsIHNvdXJjZXMgZm9yIGpwZWcsIHRlIHY0bDJzcmMgd29ya3MgZmluZQorCSAgZm9yIHRoaXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI3OTI1CisKKzIwMTQtMDUtMDMgMTg6MzA6MjAgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQG9jcmV0ZS5jYT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGNvbGxpc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogS2VlcCBsb2NhbCBjb25mbGljdGluZyBhZGRyZXNzZXMgaW4gdGhlIHNlc3Npb24KKwkgIEFzIHdlIG5vdyByZXBsYWNlIHRoZSBsb2NhbCBSVFBTb3VyY2Ugb24gYSBjb25mbGljdCwgaXQncyBubyBsb25nZXIgcG9zc2libGUKKwkgIHRvIGtlZXAgbG9jYWwgY29uZmxpY3RzIGluIHRoZSBSVFBTb3VyY2UsIHNvIHRoZXkgaW5zdGVhZCBuZWVkIHRvIGJlIGtlcHQKKwkgIGluIHRoZSBSVFBTZXNzaW9uLgorCSAgQWxzbyBmaXggdGhlIHJ0cGNvbGxpc2lvbiB0ZXN0IHRvIGdlbmVyYXRlIG11bHRpcGxlIGNvbGxpc2lvbnMgaW5zdGVhZCBvZgorCSAgb25lIGJ5IGNoYW5nZSB0aGUgYWRkcmVzcywgYXMgb3RoZXJ3aXNlIHdlIGRldGVjdGVkIHRoYXQgaXQgd2FzIGEgc2luZ2xlIG9uZS4KKworMjAxNC0wNS0wMyAyMDo0ODozMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjMuMSA9PT0KKworMjAxNC0wNS0wMyAxODowMjoyMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFsczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWFvcmMtZGlzdC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0LmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy1kaXN0LmM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDEuMy4xCisKKzIwMTQtMDUtMDMgMTg6MDI6MDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2hyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTQtMDUtMDMgMTc6MjI6NDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSAgcG86IFVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxNC0wNS0wMyAxMTo0MzoyMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc2hhcGV3aXBlLmM6CisJICBzaGFwZXdpcGU6IFNlbmQgaW5pdGlhbCBldmVudHMgYWZ0ZXIgc2V0dGluZyB0aGUgZWxlbWVudHMgdG8gUExBWUlORworCSAgT3RoZXJ3aXNlIHdlIHNlbmQgdGhlbSB0b28gZWFybHksIGFuZCBzZXR0aW5nIHRoZSBlbGVtZW50cyB0byBQTEFZSU5HCisJICBhZnRlcndhcmRzIHdpbGwgZHJvcCBhbGwgdGhlIGV2ZW50cyBhZ2Fpbi4KKworMjAxNC0wNS0wMyAxMDoxNTowMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGJjYjE1MTggdG8gMjExZmE1ZgorCisyMDE0LTA1LTAyIDE3OjEyOjI5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkgIGltYWdlZnJlZXplOiBTZXQgc2VnbWVudCBwb3NpdGlvbiB0byB0aGUgc3RvcCBwb3NpdGlvbiBvZiB0aGUgYnVmZmVyCisKKzIwMTQtMDUtMDIgMTc6MTA6MTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IFByb3Blcmx5IHJlcG9ydCBlcnJvcnMgYmVmb3JlIHN0b3BwaW5nIHRoZSBzcmNwYWQgdGFzaworCisyMDE0LTA1LTAyIDE3OjAyOjAyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkgIGltYWdlZnJlZXplOiBFcnJvciBvdXQgaWYgd2UgaGF2ZSBubyBjYXBzIHlldAorCisyMDE0LTA1LTAyIDE0OjQ5OjI3ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogYXZvaWQgZGl2aWRpbmcgYnkgYSAwIGJsb2NrYWxpZ24KKwkgIFRoaXMgY2FuIGJlIDAuIEluIHRoYXQgY2FzZSwgZG8gbm90IHRyeSB0byBjdXQgb2ZmIHRoZSBsYXN0IGZldworCSAgYnl0ZXMgZnJvbSB0aGUgbGFzdCBidWZmZXIuCisJICBDb3Zlcml0eSAxMTQ2OTcxCisKKzIwMTQtMDUtMDIgMTQ6MjU6MDEgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogZG8gbm90IHVzZSB1aW5pdGlhbGl6ZWQgY2x1dCBvbiBlcnJvcgorCSAgSWYgd2UncmUgbWlzc2luZyBwYXJ0IG9mIHRoZSBjbHV0LCBkbyBub3QgdHJ5IHRvIHVzZSBpdC4gSXQgc2VlbXMKKwkgIHZlcnkgbGlrZWx5IHRoZSBicmVhayB3YXMgbWVhbnQgdG8gYnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggcmF0aGVyCisJICB0aGFuIGZyb20gdGhlIGxvb3AuCisJICBDb3Zlcml0eSAxMTM5ODc4CisKKzIwMTQtMDUtMDIgMTQ6MTg6MDggKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSAgZmx4ZGVjOiBmaXggaW50ZWdlciBvdmVyZmxvdworCSAgQ292ZXJpdHkgMTEzOTg1OQorCisyMDE0LTA1LTAyIDE0OjA5OjAyICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSAgcnRwcWRtZGVwYXk6IHJlbW92ZSBwb2ludGxlc3MgY2hlY2sKKwkgIEJlc2lkZXMsIHRoZSBwb2ludGVyIHdhcyBkZXJlZmVyZW5jZWQgZWFybGllciBhbnl3YXkuCisJICBDb3Zlcml0eSAxMTM5ODUzCisKKzIwMTQtMDUtMDIgMTQ6MDY6MjUgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiByZW1vdmUgZHVwbGljYXRlIHRlc3QKKwkgIGl0ZW0gd2FzIGRlcmVmZXJlbmNlIHByZXZpb3VzbHkuCisJICBXaGlsZSB0aGVyZSwgcmVvcmRlciBzb21lIHRlc3QgZm9yIGZhc3RlciBlYXJseSBvdXQuCisJICBDb3Zlcml0eSAxMTM5ODQ0CisKKzIwMTQtMDUtMDIgMTQ6MDI6NTIgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSAgdnA4ZW5jOiBndWFyZCBhZ2FpbnN0IE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZQorCSAgQ292ZXJpdHkgMTEzOTgzOAorCisyMDE0LTA1LTAyIDEzOjU5OjA3ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogZml4IHRoZW9yZXRpY2FsIGludGVnZXIgb3ZlcmZsb3cKKwkgIFRoaXMgY29kZSBpc24ndCBhY3R1YWxseSB1c2VkIGF0IHRoZSBtb21lbnQsIHVuc3VyZSBpZiBJIHNob3VsZAorCSAganVzdCByZW1vdmUgaXQgb3Igbm90Li4uCisJICBDb3Zlcml0eSAxMTM5ODExCisKKzIwMTQtMDUtMDIgMTM6MzM6MDIgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSAgbWF0cm9za2E6IGJsaW5kbHkgZml4IHdyaXRpbmcgdmFyaWFibGUgbGVuZ3RoIG5lZ2F0aXZlIHZhbHVlcworCSAgU3BvdHRlZCB3aGlsZSBmaXhpbmcgc29tZXRoaW5nIGVsc2UgaW4gdGhlIGFyZWEuCisJICBOb3RoaW5nIGNhbGxzIHRoaXMgd2l0aCBhIG5lZ2F0aXZlIHZhbHVlLgorCisyMDE0LTA1LTAyIDEzOjI5OjMzICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgIG1hdHJvc2thOiBkbyBub3QgbG9zZSB0aGUgdG9wIGJpdHMgd2hlbiB3cml0aW5nIGEgPiAzMiBiaXQgdmFsdWUKKwkgIENvdmVyaXR5IDExMzk4MDYKKworMjAxNC0wNS0wMiAxMjoxMDoyNiArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIHZpZGVvZmxpcDogYWRkIG1pc3NpbmcgYnJlYWsgaW4gc3dpdGNoCisJICBDb3Zlcml0eSAxMTM5NzU1CisKKzIwMTQtMDUtMDIgMTE6Mzk6MzkgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thOiBkbyBub3QgdHJ5IHRvIGNhbGwgZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IG9uIGEgTlVMTCBwYWQKKwkgIGdzdF9tYXRyb3NrYV9wYXJzZV9xdWVyeSBjYW4gYmUgY2FsbGVkIGV4cGxpY2l0ZWx5IHdpdGggYSBOVUxMIHBhZC4KKwkgIElmIHdlIHJlYWNoIHRoaXMgcG9pbnQgd2l0aCBhIE5VTEwgcGFkLCBmYWlsIHRoZSBxdWVyeS4KKwkgIENvdmVyaXR5IDExMzk3MTUKKworMjAxNC0wNS0wMiAxMToyODowMSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSAgbWF0cm9za2E6IGRvIG5vdCByZXR1cm4gR1NUX0ZMT1dfT0sgaWYgd2UgZGlkIG5vdCBnZXQgYSBidWZmZXIKKwkgIENvdmVyaXR5IDExMzk3MTQgKHdoaWNoIHdpbGwgbGlrZWx5IGNvbWUgYmFjayBpbiBhbm90aGVyIGd1aXNlLAorCSAgYXMgdGhlIF9yZWFkX2luaXQgY2FsbCBjYW4gaGF2ZSBhIGZhaWxpbmcgX21hcCkKKworMjAxNC0wNS0wMiAxMToyMDozMyArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJICBtYXRyb3NrYTogY2F0Y2ggZmFpbHVyZSB0byBtYXAgYnVmZmVyCisJICBBdm9pZHMgZGVyZWZlcmVuY2luZyBOVUxMLgorCSAgQ292ZXJpdHkgMTEzOTcxMgorCisyMDE0LTA1LTAyIDEwOjUyOjQ0ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogcmVmdXNlIGNhcHMgd2l0aCBpbnZhbGlkIGZyYW1lcmF0ZQorCSAgQ292ZXJpdHkgMTEzOTcwMQorCisyMDE0LTA1LTAyIDEwOjIxOjA5ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGhhbmRsZSAwIHNpemUgcGFja2V0cyB3aXRob3V0IGRpdmlkaW5nIGJ5IDAKKwkgIENvdmVyaXR5IDExMzk2OTEKKworMjAxNC0wNS0wMiAwOTo0OTozMiArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZ3VhcmQgYWdhaW5zdCBpbnZhbGlkIGZyYW1lIHNpemUgdG8gYXZvaWQgZGl2aXNpb24gYnkgMAorCSAgQ292ZXJpdHkgMTEzOTY5MAorCisyMDE0LTA1LTAyIDA5OjQ5OjE3ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiB0cml2aWFsIHR5cG8gZml4CisKKzIwMTQtMDUtMDIgMDk6NDM6NTQgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkgIHNwZWV4ZGVjOiByZW1vdmUgZGVhZCBjb2RlCisJICBmcHAgY2FuIG5ldmVyIGVxdWFsIDAgaGVyZSwgb3IgdGhlIGxvb3Agd291bGQgbm90IGV4ZWN1dGUgYXQgYWxsLgorCSAgWmVybyBmcHAgd2FzIHBvc3NpYmxlIGJlZm9yZSBhcyB0aGUgbG9vcCBjb25kaXRpb24gd2FzIGFsbG93aW5nCisJICBpdCBzcGVjaWZpY2FsbHksIGJ1dCBubyBtb3JlLgorCSAgQ292ZXJpdHkgMTEzOTY4MQorCisyMDE0LTA1LTAyIDA5OjQxOjE5ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zczQvb3NzNC1wcm9wZXJ0eS1wcm9iZS5jOgorCSAgb3NzNDogcmVtb3ZlIGRlYWQgbWl4ZXIgY29kZQorCSAgVGhpcyB3YXMgcGFydGx5IHJlbW92ZWQgaW4gdGhlIHBvcnQgdG8gMC4xMS4gSWYgc3RpbGwgbmVlZGVkLAorCSAgaXQncyBzdGlsbCB0aGVyZSBpbiB0aGUgaGlzdG9yeS4KKwkgIENvdmVyaXR5IDExMzk2ODcKKworMjAxNC0wNS0wMiAwOTozMzo1MSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3M0L29zczQtcHJvcGVydHktcHJvYmUuYzoKKwkgIG9zczQ6IGZpeCBhIG1pc3NpbmcgdW5sb2NrIGFuZCBhIHJldHVybi1vbmx5LXdoZW4tYXNzZXJ0aW9ucy1lbmFibGVkCisJICBTcG90dGVkIG9uIHRoZSBzaWRlIHdoaWxlIGxvb2tpbmcgYXQgYW5vdGhlciBpc3N1ZS4KKworMjAxNC0wMy0wNyAxNzozMToyOSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBDb3JyZWN0bHkgbWFwIFJHQjMyIGZvcm1hdAorCSAgSW4gdjRsMiBzcGVjaWZpY2F0aW9uLCBSR0IzMiBoYXMgdGhlIGFscGhhLCBvciBwYWRpbmcsIGZpcnN0LCBub3QgbGFzdC4KKwkgIFNlZSBodHRwOi8vbGludXh0di5vcmcvZG93bmxvYWRzL3Y0bC1kdmItYXBpcy9wYWNrZWQtcmdiLmh0bWwgLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU0MDk0MQorCisyMDE0LTA0LTMwIDE4OjA2OjQwICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogcmVtb3ZlIGRlYWQgY29kZQorCSAgRm9yIDggYml0IHdpZHRoLCB3ZSBhbHdheXMgaGF2ZSBkZXB0aD09Z2RlcHRoPT13aWR0aD09OC4KKwkgIENvdmVyaXR5IDExMzk2NzgKKworMjAxNC0wNC0zMCAxNzo0ODo1MyArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIG1wZWdhdWRpb3BhcnNlOiByZW1vdmUgZGVhZCBjb2RlCisJICBBIHN0cmljZXIgY2hlY2sgaXMgYWxyZWFkeSBkb25lIGVhcmxpZXIsIGFuZCBpbnRlZ2VyIG92ZXJmbG93cworCSAgZG8gbm90IHNlZW0gcG9zc2libGUgaGVyZS4KKwkgIENvdmVyaXR5IDExMzk2NzUKKworMjAxNC0wNC0zMCAxNDo1MDo0NCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSAgcnRwdnJhd3BheTogZ3VhcmQgYWdhaW5zdCBwYXRob2xvZ2ljYWwgIm5vIHNwYWNlIiBjb25kaXRpb24KKwkgIEV2ZW4gaWYgb25lIHdvdWwgaG9wZSBvbmUgcGl4ZWwgY2FuIGZpdCBpbiBhIE1UVSwgZW5zdXJlIHdlIGRvIG5vdAorCSAgb3ZlcndyaXRlIGEgYnVmZmVyIGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLgorCSAgU3BvdHRlZCB3aGlsZSBsb29raW5nIGF0IENvdmVyaXR5IDEyMDg3ODYKKworMjAxNC0wNC0zMCAxMTo1MjoxMCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJICBydHBqcGVnZGVwYXk6IHNhbml0eSBjaGVjayBmb3IgTlVMTCBxdGFibGUKKwkgIENhbiBoYXBwZW4gKGF0IGxlYXN0IGluIGNyYWZ0ZWQgc3RyZWFtKQorCSAgQ292ZXJpdHkgMTIwODc3OAorCisyMDE0LTA0LTMwIDAxOjA4OjQxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBwYXNzIG9uIHRhZ3MgZnJvbSB1cHN0cmVhbSBpZiB0aGVyZSBhcmUgYW55CisJICBEb24ndCBqdXN0IGlnbm9yZSB1cHN0cmVhbSB0YWdzIGZyb20gZS5nLiBhbiBJRDMgdGFnIGJlZm9yZQorCSAgdGhlIC53YXYgZGF0YSwgcGFzcyB0aGVtIG9uIGRvd25zdHJlYW0uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI5MjIzCisKKzIwMTQtMDQtMjkgMTY6MjY6NTMgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogb3B0aW1pemUgdGltZXIgdXBkYXRlCisJICBXaGVuIHdlIGFyZSBub3QgZG9pbmcgcmV0cmFuc21pc3Npb24sIHdlIGp1c3QgbmVlZCB0byBmaW5kIHRoZSBjdXJyZW50CisJICBzZXFudW0gc28gd2UgY2FuIHN0b3Agd2hlbiB3ZSBmb3VuZCBpdC4KKworMjAxNC0wNC0yOSAxNjoyMTo0NCArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICBydHBqaXR0ZXJidWZmZXI6IHNtYWxsIG9wdGltaXphdGlvbnMKKwkgIFNtYWxsIG9wdGltaXphdGlvbnMgd2hlcmUgd2UgY2FuLgorCSAgQWRkIHNvbWUgbW9yZSBkZWJ1Zy4KKworMjAxNC0wNC0yOSAxNjoxNjoxNyArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBzaWduYWwgd2hlbiBuZXh0X3NlcW51bSBjaGFuZ2VkCisJICBTaWduYWwgdGhlIHB1c2hpbmcgdGhyZWFkIHdoZW4gdGhlIG5leHRfc2VxbnVtIGNoYW5nZWQgYW5kIHdlIG1pZ2h0IGJlCisJICBhYmxlIHRvIHB1c2ggYSBidWZmZXIgbm93LgorCisyMDE0LTA0LTI5IDE2OjEyOjI5ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IG9ubHkgc2lnbmFsIGV2ZW50IHdoZW4gaGVhZCBjaGFuZ2VkCisJICBBZnRlciBhZGRpbmcgYSBidWZmZXIsIG9ubHkgc2lnbmFsIHRoZSBwdXNoaW5nIHRocmVhZCB3aGVuIHRoZSBoZWFkCisJICBidWZmZXIgY2hhbmdlZCBvciBlbHNlIHdlIGNhdXNlIGEgdXNlbGVzcyB3YWtldXAuCisKKzIwMTQtMDQtMjkgMTU6Mjk6MzEgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgcnRwaml0dGVyYnVmZmVyOiByZXdvcmsgcGFja2V0IGluc2VydAorCSAgUmV3b3JrIHRoZSBwYWNrZXQgcXVldWUgc28gdGhhdCB0aGUgbW9zdCBjb21tb24gYWN0aW9uIChpbnNlcnQgYSBwYWNrZXQKKwkgIGF0IHRoZSB0YWlsIG9mIHRoZSBxdWV1ZSkgZ29lcyB2ZXJ5IGZhc3QuCisJICBSZXBvcnQgaWYgYSBwYWNrZXQgd2FzIGluc2VydGVkIGF0IHRoZSBoZWFkIGluc3RlYWQgb2YgdGhlIHRhaWwgc28gdGhhdAorCSAgd2UgY2FuIGtub3cgd2hlbiB0byByZXRyeSBfcG9wIG9yIF9wZWVrLgorCisyMDE0LTA0LTI4IDE0OjQxOjEwICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSAgcnRwdnJhdzogdXNlIHBsYW5lIHBvaW50ZXJzIHdoZW4gbmVlZGVkCisJICBQYWNrL3VucGFjayBwbGFuYXIgZm9ybWF0cyB0by9mcm9tIHRoZSBmaXJzdCBwbGFuZS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjkwNTgKKworMjAxNC0wNC0yOCAwOTo0NzoxMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJICBzb3VwaHR0cHNyYzogUmVtZW1iZXIgaWYgYSByZWRpcmVjdCBpcyBwZXJtYW5lbnQgb3Igbm90IGFuZCBzdG9yZSBpdCBpbiB0aGUgcXVlcnkKKworMjAxNC0wNC0yNyAyMTo1NzozMSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9nb29tL2NvbmZpZ19wYXJhbS5jOgorCSAgZ29vbTogUmVtb3ZlIGZyZW5jaCBjb21tZW50IHNheWluZyB0byBwcmVmaXggZnVuY3Rpb25zCisJICBBbGwgbm9uLXN0YXRpYyBmdW5jdGlvbiBpbiB0aGlzIGZpbGUgYXJlIGFscmVhZHkgcHJlZml4ZWQgd2l0aCBnb29tXy4KKworMjAxNC0wNC0yOCAwMDoyMDo0NyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2dvb20vZmlsdGVycy5jOgorCSAgZ29vbTogZml4IGNvbXBpbGF0aW9uIG9uIGlvcy1hcm03LTEwLjkgYW5kIG9zeC14ODZfNjQKKwkgIHVpbnQgaXMgbm90IGEgc3RhbmRhcmQgdHlwZSwgYW5kIHRoZSByZXN0IG9mIHRoZSBjb2RlIHVzZXMKKwkgIFVpbnQgd2hpY2ggaXMgbG9jYWxseSB0eXBlZGVmZWQgdG8gdW5zaWduZWQgaW50LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyOTA2NworCisyMDE0LTA0LTI3IDE4OjI5OjExIC0wNDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorCisJKiBnc3QvZ29vbS9maWx0ZXJzLmM6CisJICBnb29tOiBmaXggdW5kZWZpbmVkIGJlaGF2aW91ciBvZiBsZWZ0LXNoaWZ0CisJICBEb24ndCBsZWZ0LXNoaWZ0IGludG8gdGhlIHNpZ24gYml0LCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZCBhbmQgcG90ZW50aWFsbHkKKwkgIGFuIG92ZXJmbG93IGNvdWxkIGZsaXAgdGhlIHNpZ24uCisKKzIwMTQtMDQtMjYgMjA6NTE6MzYgLTA0MDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogY2hlY2sgcmV0dXJuIGZyb20gcXRfZGVtdXhfdmlkZW9fY2FwcworCSAgTm93IHF0ZGVtdXhfdmlkZW9fY2FwcygpIGNhbiByZXR1cm4gTlVMTC4gV2UgbmVlZCB0byBjaGVjayB0aGlzIHJldHVybiBiZWZvcmUKKwkgIHVzaW5nIGl0J3MgdmFsdWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI4OTg3CisKKzIwMTQtMDQtMjYgMjM6MzU6MTcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bW9vdnJlY292ZXIuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXgtZG9jLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBidmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2cGF5LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkgIGRvY3M6IHJlbW92ZSBvdXRkYXRlZCBhbmQgcG9pbnRsZXNzICdMYXN0IHJldmlld2VkJyBsaW5lcyBmcm9tIGRvY3MKKwkgIFRoZXkgYXJlIHZlcnkgY29uZnVzaW5nIGZvciBwZW9wbGUsIGFuZCBtb3JlIG9mdGVuIHRoYW4gbm90CisJICBhbHNvIGp1c3Qgbm90IHZlcnkgYWNjdXJhdGUuIFNlZWluZyAnbGFzdCByZXZpZXdlZDogMjAwNScgaW4KKwkgIHlvdXIgZG9jcyBpcyBub3QgdmVyeSBjb25maWRlbmNlLWluc3BpcmluZy4gTGV0J3MganVzdCByZW1vdmUKKwkgIHRob3NlIGNvbW1lbnRzLgorCisyMDE0LTA0LTI1IDE3OjU4OjQyIC0wNDAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGluaXRpYWxpemUgY2FwcyBwb2ludGVyIHRvIG51bGwKKwkgIE1ha2Ugc3VyZSB0aGUgY2FwcyBwb2ludGVyIHJldHVybnMgaW5pdGlhbGl6ZWQgd2hlbiB1c2luZyBpdCBpbgorCSAgcXRkZW11eF9wYXJzZV90cmVlICgpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyODk4NworCisyMDE0LTA0LTIyIDE3OjA3OjM4ICsxMDAwICBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IENsZWFyIGxhc3RfcHQgb24gZmx1c2gtc3RvcC4KKwkgIE90aGVyd2lzZSwgd2UgZG9uJ3QgcmVjaGVjayB0aGUgYnVmZmVyIGNhcHMgZm9yIGNsb2NrLXJhdGUKKwkgIHByb3Blcmx5IG9uIHRoZSBuZXh0IGNoYWluLgorCisyMDE0LTA0LTIyIDE3OjI5OjAyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXggY29tcGlsZXIgd2FybmluZworCSAgZ3N0ZGVpbnRlcmxhY2UuYzogSW4gZnVuY3Rpb24gJ2dzdF9kZWludGVybGFjZV9vdXRwdXRfZnJhbWUnOgorCSAgZ3N0ZGVpbnRlcmxhY2UuYzoxNTM3OjU3OiBlcnJvcjogJ3BhdHRlcm4ubGVuZ3RoJyBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24gWy1XZXJyb3I9bWF5YmUtdW5pbml0aWFsaXplZF0KKwkgIFRoaXMgYWN0dWFsbHkgaXMgYWx3YXlzIGluaXRpYWxpemVkIGJlZm9yZSBpdCBpcyB1c2VkIHRoZXJlLCBidXQKKwkgIGxldCdzIGp1c3Qgc2lsZW5jZSBnY2MgaGVyZS4KKworMjAxNC0wNC0yMSAxNTo1ODo0NSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBmaXggYnVmZmVyIGxpc3QgZHJvcCBjaGVjaworCSAgV2hpbGUgcG9ydGluZyB0byAwLjExLCB0aGUgY2hlY2sgd2FzIG1pc3Rha2VubHkgbWFkZSBjb25zdGFudCwKKwkgIGluc3RlYWQgb2YgdGVzdGluZyBmb3IgdGhlIHJldHVybiB2YWx1ZSBvZiBwcm9jZXNzX2J1ZmZlcl9sb2NrZWQuCisJICBDb3Zlcml0eSAxMTM5NjYzCisKKzIwMTQtMDQtMjEgMTM6NDQ6MTUgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thOiBmaXggY29udGVudCBlbmNvZGluZyBzY29wZSB2YWxpZGl0eSBjaGVjaworCSAgSXQncyAzIGJpdHMsIGFuZCBodHRwOi8vbWF0cm9za2Eub3JnL3RlY2huaWNhbC9zcGVjcy9pbmRleC5odG1sCisJICBzYXlzIGl0IGNhbid0IGJlIDAuCisJICBDb3Zlcml0eSAxMTM5NjYwCisKKzIwMTQtMDQtMjEgMTM6MzQ6MzcgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogZml4IFBBUiBmcmFjdGlvbiBzYW5pdHkgY2hlY2sKKwkgIEl0IHdhcyBjaGVja2luZyBwYXJfbnVtIHR3aWNlLCBhbmQgbmV2ZXIgcGFyX2RlbnVtLgorCSAgQ292ZXJpdHkgMTEzOTYzNAorCisyMDE0LTA0LTIxIDEzOjMyOjQwICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpaWRwc2luazogd2FybiB3aGVuIHNldHNvY2tvcHQgZmFpbHMKKwkgIFRoaXMgZG9lc24ndCBzZWVtIHRvIGJlIGZhdGFsLCBidXQgaXQncyBnb29kIHRvIGxldCB0aGUgdXNlciBrbm93CisJICBpbiB0aGUgbG9ncy4KKwkgIENvdmVyaXR5IDExMzk2MzAKKworMjAxNC0wNC0yMSAxMzoyNzoyNCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOgorCSAgaW50ZXJsYWNlOiBjYXRjaCBmYWlsdXJlIHRvIGNyZWF0ZSBhdWRpbyBpbmZvIGZyb20gY2FwcworCSAgQ292ZXJpdHkgMTEzOTYyNywgMTEzOTYyOAorCisyMDE0LTAzLTEzIDA5OjM3OjQ4ICswMTAwICBHw7ZyYW4gSsO2bnNzb24gPGdvcmFuam5AYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgZ3N0cnRwaDI2NHBheTogUmVzZXQgc3BzIHBwcyB2YXJpYWJsZSB3aGVuIHN0YXRlIGNoYW5nZS4KKwkgIFJlc2V0IGxhc3Rfc3BzcHBzIGFuZCBzcHMvcHBzIGFycmF5cyAgd2hlbiBzdGF0ZSB0cmFuc2l0aW9uCisJICBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjYwMTUKKworMjAxNC0wNC0xOCAxMToxMToxNCArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkgIGppdHRlcmJ1ZmZlcjogaW1wcm92ZSBFT1MgaGFuZGxpbmcKKwkgIE1ha2UgYSBuZXcgbWV0aG9kIHRvIGRpc2FibGUgdGhlIGppdHRlcmJ1ZmZlciBidWZmZXJpbmcuCisJICBSZXdvcmsgdGhlIHVwZGF0ZV9lc3RpbWF0ZWRfZW9zKCkgbWV0aG9kLiBDYWxjdWxhdGUgaG93IG11Y2ggdGltZQorCSAgdGhlcmUgaXMgbGVmdCB0byBwbGF5LiBJZiB3ZSBoYXZlIGxlc3MgdGhhbiB0aGUgZGVsYXkgb2YgdGhlCisJICBqaXR0ZXJidWZmZXIsIHdlIGRpc2FibGVkIGJ1ZmZlcmluZyBiZWNhdXNlIHdlIG1pZ2h0IG5ldmVyIGJlIGFibGUgdG8KKwkgIGZpbGwgdGhlIGNvbXBsZXRlIGppdHRlcmJ1ZmZlciBhZ2Fpbi4KKwkgIElmIHdlIHJlY2VpdmUgYW4gRU9TIGV2ZW50LCBkaXNhYmxlIGJ1ZmZlcmluZy4gV2Ugd2lsbCBkcmFpbiB0aGUKKwkgIGJ1ZmZlciBhbmQgZXZlbnR1YWxseSBwdXNoIHRoZSBFT1MgZXZlbnQgb3V0LgorCSAgV2hlbiB3ZSByZWFjaCB0aGUgZXN0aW1hdGVkIE5QVCB0aW1lb3V0IGFuZCB3ZSBkaWRuJ3QgcmVjZWl2ZSBhbiBFT1MKKwkgIGV2ZW50LCBtYWtlIG9uZSBhbmQgcXVldWUgaXQgc28gdGhhdCBpdCBjYW4gYmUgcHVzaGVkLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyODAxNworCisyMDE0LTA0LTE4IDEwOjIxOjI3ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogc2VuZCByZWNvbmZpZ3VyZSB3aGVuIGludGVybmFsLXNzcmMgY2hhbmdlcworCSAgV2hlbiB0aGUgaW50ZXJuYWwtc3NyYyBwcm9wZXJ0eSBjaGFuZ2VzLCB3ZSB3YW50IHRvIHNlbmQgYSByZWNvbmZpZ3VyZQorCSAgdXBzdHJlYW0gdG8gbWFrZSBwYXlsb2FkZXJzIHVzZSB0aGUgbmV3IHN1Z2dlc3RlZCBzc3JjLgorCSAgVXNpbmcgdGhlIGludGVybmFsLXNzcmMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBTU1JDIG9mIGEgc3RyZWFtIGlzIG5vdCBhCisJICBnb29kIGlkZWEgYW5kIGRvZXNuJ3Qgd29yayB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBzZW5kZXJzLCB3ZSB3YW50IHRvCisJICBzZXQgdGhlIFNTUkMgZGlyZWN0bHkgb24gdGhlIHBheWxvYWRlcnMuIFRoZXJlZm9yZSwgZGVwcmVjYXRlIHRoaXMKKwkgIHByb3BlcnR5LgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNTM2MQorCisyMDE0LTA0LTE4IDA0OjIzOjI2ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGFzc3VtZSBhIGZ1bGwgYnVmZmVyIHdoZW4gZW9zCisJICBSZXdvcmsgdGhlIGxvZ2ljIHRvIG1ha2UgYnVmZmVyaW5nIG1lc3NhZ2VzIGEgbGl0dGxlLCBtYWtlIHN1cmUgd2UKKwkgIGRvbid0IG1ha2UgdGhlIHNhbWUgbWVzc2FnZSBtdWx0aXBsZSB0aW1lcy4KKwkgIENvbnNpZGVyIHRoZSBidWZmZXIgZnVsbCB3aGVuIEVPUyB3YXMgcmVjZWl2ZWQuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI4MDE3CisKKzIwMTQtMDQtMTcgMTg6MDc6MDkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSAgcnRwcnR4OiBEb24ndCBmb3JnZXQgdG8gdW5tYXAgcnRwIGJ1ZmZlciBpbiB0aGUgdGVzdAorCisyMDE0LTA0LTE3IDE3OjU4OjU4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJICBydHBydHhzZW5kOiBSZXF1aXJlIGNsb2NrLXJhdGUgaW4gdGhlIGNhcHMgYW5kIGhhbmRsZSBubyBzc3JjIGluIHRoZSBjYXBzIHByb3Blcmx5CisKKzIwMTQtMDQtMTcgMTc6NDM6MTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSAgcnRwcnR4OiBQcm92aWRlIGFuIHNzcmMgaW4gdGhlIHRlc3QKKwkgIEFuZCBpbmNyZWFzZSB0aW1lb3V0IHRvIGFsbG93IGFsbCB0ZXN0cyB0byBydW4gaW4gdmFsZ3JpbmQuCisKKzIwMTQtMDQtMTcgMTc6MzM6NDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IEZpeCBtZW1vcnkgbGVha3MgaW4gdGVzdAorCisyMDE0LTA0LTE3IDE3OjI2OjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogRml4IGh1bmRyZWRzIG9mIG1lbW9yeSBsZWFrcyBpbiB0aGUgdGVzdAorCisyMDE0LTA0LTE3IDE3OjAwOjM3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogVW5yZWYgY2xvY2sgaWQgd2hlbiB3YWl0aW5nIGZvciB0aGUgY2xvY2sgaXMgaW50ZXJydXB0ZWQKKworMjAxNC0wNC0xNyAxNjozOTo1OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwY29sbGlzaW9uLmM6CisJICBydHBjb2xsaXNpb246IEZpeCBtZW1vcnkgbGVha3MgaW4gdW5pdCB0ZXN0CisKKzIwMTQtMDQtMTYgMjE6NDA6NDUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBuYW1lIGNvbGxlY3RwYWRzIG9iamVjdCBiYXNlZCBvbiB2aWRlb21peGVyIG5hbWUKKwkgIE1ha2VzIGl0IGVhc2llciB0byB0cmFjayB0aGluZ3MgaW4gZGVidWcgbG9ncyB3aGVuIHRoZXJlCisJICBhcmUgbXVsdGlwbGUgbWl4ZXJzIGFuZCBtdXhlcnMuCisKKzIwMTQtMDQtMTYgMjE6Mzc6MTIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBiZXR0ZXIgbG9nZ2luZyBvZiBpbmNvbWluZyBldmVudHMKKwkgIFRoZSBwYWQgYW5kIHBhcmVudCBuYW1lcyBhcmUgYWxyZWFkeSBsb2dnZWQgYXMgcGFydCBvZiBsb2dnaW5nCisJICB0aGUgb2JqZWN0LiBJbnN0ZWFkIGxvZyB0aGUgZnVsbCBldmVudCBkZXRhaWxzLgorCisyMDE0LTA0LTE2IDE5OjAzOjQ3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBGaXggbWVtb3J5IGxlYWsgaW4gdW5pdCB0ZXN0CisKKzIwMTQtMDQtMTYgMTg6NDk6NDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgbGV2ZWw6IFVzZSB0aGUgY29ycmVjdCBudW1iZXIgb2Ygc2FtcGxlcyB0byBpdGVyYXRlIG92ZXIgdGhlIGlucHV0IGFycmF5CisJICBGaXhlcyBpbnZhbGlkIG1lbW9yeSBhY2Nlc3NlcyBhbmQgYWNjZXNzZXMgdG8gdW5pbml0aWFsaXNlZCBkYXRhLgorCisyMDE0LTA0LTE2IDE4OjAwOjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzoKKwkgIGljeWRlbXV4OiBVbnJlZiBkcm9wcGVkIGV2ZW50cworCisyMDE0LTA0LTE2IDE3OjI5OjMwICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOgorCSAgbWF0cm9za2E6IGZpeCBjaGVjayBmb3IgYW1vdW50IG9mIGRhdGEgdG8gcmVhZAorCSAgSGlzdG9yeSBzaG93cyBsZW5ndGg9PTAgc2hvdWxkIHNldCBkYXRhIHRvIE5VTEwgYW5kIHJldHVybiwKKwkgIHNvIHdlIGRvIHRoYXQgdG9vIGluc3RlYWQgb2YgdHJ5aW5nIHRvIHJlYWQgbm90aGluZy4KKwkgIENvdmVyaXR5IDIwNjIwNQorCisyMDE0LTA0LTE2IDE3OjI1OjQ0ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogZml4IHNpZ24gY29tcGFyaXNvbgorCSAgaGlzdG9yeV9jb3VudCBpcyB1bnNpZ25lZCwgc28gdGhlIHdob2xlIGNvbXBhcmlzb24gd2lsbCBiZSBtYWRlCisJICBhcyB1bnNpZ25lZCwgYW5kIGZhaWwgdG8gcmVqZWN0IHdoYXQgaXQgd2FzIG1lYW50IHRvLgorCSAgQ292ZXJpdHkgMjA2MjA0CisKKzIwMTQtMDQtMTYgMTc6MDQ6NTAgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogcmVtb3ZlIGRlYWQgY29kZQorCSAgc3ViIG1heSBub3QgYmUgTlVMTCBpbiB0aGlzIHN3aXRjaCwgdGhlcmUgaXMgYSBiYWlsIG91dCBqdXN0CisJICBiZWZvcmUgaXQgaWYgc28uCisJICBDb3Zlcml0eSAyMDYwOTgKKworMjAxNC0wNC0xNiAxNjo1OTo0MyArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IHJlbW92ZSBkZWFkIGNvZGUKKwkgIFRoZSBibG9ja19zaXplID09IDAgd2FzIHNob3J0Y3V0IGVhcmxpZXIsIGFuZCB0aGUgdmFyaWFibGUgaXMgbm90CisJICBtb2RpZmllZCBpbiB0aGUgbWVhbnRpbWUuCisJICBDb3Zlcml0eSAyMDYwOTcKKworMjAxNC0wNC0xNiAxNjo1Njo1NCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvY29udmVydC5jOgorCSAgdmlkZW9taXhlcjogcmVtb3ZlIGRlYWQgY29kZQorCSAgV2hpbGUgaXQgc2VlbXMgdG8ga2VlcCBhIGNvbXBpbGUgdGltZSBzZWxlY3Rpb24sIEkgdHJhY2VkIGl0CisJICB0byBzb21lIGNvZGUgY29waWVkIGZyb20gdmlkZW9jb252ZXJ0LCB3aGVyZSBpdCB3YXMgcmVtb3ZlZCwKKwkgIHdpdGggdGhlIGZvbGxvd2luZyBjb21tZW50OgorCSAgQWxzbyByZW1vdmUgdGhlIGhpZ2gtcXVhbGl0eSBJNDIwIHRvIEJHUkEgZmFzdC1wYXRoIGFzIGl0IG5lZWRzCisJICB0aGUgc2FtZSBmaXgsIHdoaWNoIGNhdXNlcyBhbiBhZGRpdGlvbmFsIGluc3RydWN0aW9uLCB3aGljaCBjYXVzZXMKKwkgIG9yYyB0byBlbWl0IG1vcmUgdGhhbiA5NiB2YXJpYWJsZXMsIHdoaWNoIHRoZW4ganVzdCBjcmFzaGVzLgorCSAgVGhpcyBjYW4gb25seSBiZSBmaXhlZCBpbiBvcmMgYnkgYnJlYWtpbmcgQUJJIGFuZCBhbGxvd2luZyBtb3JlCisJICB2YXJpYWJsZXMuCisJICBUaHVzLCBJIHJlbW92ZSBpdCBoZXJlIGFzIHdlbGwuCisJICBDb3Zlcml0eSAyMDYwNjQKKworMjAxNC0wNC0xNiAxNjo1MDozMCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgaXNvbXA0OiBmaXggaW5jb3JyZWN0IG1hc2tpbmcgZm9yIG11bHRpcGxlIHRhZ3MKKwkgIENvdmVyaXR5IDIwNjA1OAorCisyMDE0LTA0LTE2IDE2OjQ1OjA4ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSAgaXNvbXA0OiBmaXggd3JvbmcgYXRvbSBmbGFncyBzZXQgd2hlbiBhZGRpbmcgc2FtcGxlcworCSAgQ292ZXJpdHkgMjA2MDU3CisKKzIwMTQtMDQtMTYgMTY6NDA6MDIgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSAgYXVkaW9meDogZml4IGNvbXBhcmlzb24gb2YgZGVsdGEgdGltZSB0byBhIHRocmVzaG9sZAorCSAgQ292ZXJpdHkgMjA2MDU1CisKKzIwMTQtMDQtMTYgMTY6MzI6MjYgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBkbyBub3QgcmVseSBvbiBjYWxsIGZhaWx1cmUga2VlcGluZyByZXR1cm4gZGF0YSB1bm1vZGlmaWVkCisJICBUaGlzIGlzIGNsZWFyZXIgdGhpcyB3YXkgdG9vLgorCSAgQ292ZXJpdHkgMjA2MDI5CisKKzIwMTQtMDQtMTYgMTY6Mjg6NDkgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L2F0b21zcmVjb3ZlcnkuYzoKKwkgIGlzb21wNDogY2F0Y2ggZnNlZWsgZXJyb3IKKwkgIENvdmVyaXR5IDIwNjAyOAorCisyMDE0LTA0LTE2IDE2OjI1OjQ0ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSAgaXNvbXA0OiByZXBvcnQgZmFpbHVyZXMgdG8gY2FsbGVyCisJICBDb3Zlcml0eSAyMDYwMjcKKworMjAxNC0wNC0xNiAxODowNTo0NiArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiByZWZ1c2Ugc2VyaWFsaWVkIHF1ZXJ5IHdoZW4gYnVmZmVyaW5nCisJICBXaGVuIHdlIGFyZSBidWZmZXJpbmcsIHdlIGNhbid0IGJsb2NrIGFuZCB3YWl0IGZvciB0aGUgc2VyaWFsaXplZCBxdWVyeQorCSAgdG8gY29tcGxldGUgYmVjYXVzZSB0aGUgaml0dGVyYnVmZmVyIHdpbGwgbm90IHRyeSB0byBmb3J3YXJkIHRoZSBxdWVyeQorCSAgd2hpbGUgYnVmZmVyaW5nLiBJbnN0ZWFkLCBqdXN0IHJlZnVzZSB0aGUgcXVlcnkuCisKKzIwMTQtMDQtMTYgMTY6NTE6MTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogZG9uJ3QgZnJlZSB0aGUgc2VyaWFsaXplZCBxdWVyeQorCSAgV2Ugc2hvdWxkIG5ldmVyIGZyZWUgYSBzZXJpYWxpemVkIHF1ZXJ5IGluIHRoZSBxdWV1ZSwgaXQgaXMgdGhlIHVwc3RyZWFtCisJICBjYWxsZXIgdGhhdCB3aWxsIGZyZWUgaXQuCisKKzIwMTQtMDQtMTYgMTc6MzU6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogRml4IG1lbW9yeSBsZWFrIGluIHRoZSB0ZXN0CisKKzIwMTQtMDQtMTYgMTc6MzM6NDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBDcmVhdGUgaGFzaHRhYmxlIG9ubHkgd2hlbiB3ZSBhY3R1YWxseSB1c2UgaXQKKwkgIEluIGVycm9yIGNhc2VzIHdlIHByZXZpb3VzbHkgcmV0dXJuZWQgd2l0aG91dCBmcmVlaW5nIGl0LgorCisyMDE0LTA0LTE2IDE3OjMwOjU5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogQ2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzcycgZGlzcG9zZSBmdW5jdGlvbgorCisyMDE0LTA0LTE2IDE3OjIzOjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogSW5pdGlhbGlzZSBpb2N0bCBzdHJ1Y3Qgd2l0aCB6ZXJvZXMgYmVmb3JlIHBhc3NpbmcgaXQgdG8gaW9jdGwoKQorCisyMDE0LTA0LTE2IDEzOjQ3OjQzICswMjAwICBNYXJjIExlZW1hbiA8bWFyYy5sZWVtYW5AZ21haWwuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBjb3JyZWN0IExPRyBtc2cgZm9yIC0xCisJICBTaWduZWQtb2ZmLWJ5OiBNYXJjIExlZW1hbiA8bWFyYy5sZWVtYW5AZ21haWwuY29tPgorCisyMDE0LTA0LTE1IDIxOjM2OjMwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJICBpbnRlcmxlYXZlOiBGaXggbmVnb3RpYXRpb24gdG8gd29yayBhdCBhbGwgYWdhaW4KKwkgIFRoZSBjYXBzIHF1ZXJ5IGhhbmRsaW5nIGZ1bmN0aW9uIGZvciB0aGUgc2lua3BhZHMgd2FzIGNhbGxlZCBmb3IKKwkgIHRoZSBzcmNwYWQsIGFuZCB0aGUgc2lua3BhZHMgaGFkIG5vbmUuIFRoaXMgY29tbWl0IG1vdmVzIGl0IHRvIHRoZQorCSAgcmlnaHQgcGFkLCBidXQgbm9uZXRoZWxlc3MgdGhlIG5lZ290aWF0aW9uIHN0aWxsIGxvb2tzIHdyb25nLgorCSAgVGhpcyBtYWtlcyB0aGUgdGVzdCBwYXNzIGFnYWluIGFmdGVyIHRoZSByZWNlbnQgY292ZXJpdHkgZml4CisJICBhbmQgYWxzbyBhbGxvd3MgaW50ZXJsZWF2ZSB0byB3b3JrIGFnYWluLCBidXQgc29tZW9uZSBzaG91bGQKKwkgIHJlYWxseSByZXZpZXcgdGhlIG5lZ290aWF0aW9uIGNvZGUgYW5kIGZpeCBpdC4KKworMjAxNC0wNC0xMyAwOTowMzo0MSArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy9vc3M0L29zczQtYXVkaW8uYzoKKwkgIG9zczQ6IE1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnQgaXMgOAorCSAgQXZvaWRzIGRvaW5nIHBvdGVudGlhbCBvdmVyd3JpdGVzIGluIGNoX2xheW91dCAod2hpY2ggb25seSBoYXMgOAorCSAgZmllbGRzKS4KKwkgIENJRCAjMTEzOTgyNgorCisyMDE0LTA0LTEyIDIyOjE2OjM3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IFNldCByYW5rIHRvIE1BUkdJTkFMCisJICBJZiBhdmFpbGFibGUgd2UgcHJlZmVyIHVzaW5nIGdsaW1hZ2VzaW5rIG92ZXIgb3N4dmlkZW9zaW5rLiBJdCBzdXBwb3J0cworCSAgbW9yZSBmb3JtYXRzIGFuZCBpbiBnZW5lcmFsIGhhcyBtb3JlIGZlYXR1cmVzIHRoYW4gb3N4dmlkZW9zaW5rLgorCisyMDE0LTA0LTExIDE4OjE5OjQ5ICswMjAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXk6IG9ubHkgZ3Vlc3MgQVUgYm91bmRhcmllcyB3aGVuIGFyZW4ndCBpbmRpY2F0ZWQgYnkgbWFya2VyCisJICBUaGUgbWFya2VyIGJpdCBpc24ndCBtYW5kYXRvcnkgYW5kIHdlIGhhZCBpbiBwbGFjZSBjb2RlIHRvIGd1ZXNzIEFVCisJICBib3VuZGFyaWVzIGJ5IGRldGVjdGluZyBhIG5ldyBwaWN0dXJlIHN0YXJ0LiBUaGlzIGd1ZXNzaW5nIGNvZGUKKwkgIGRpZG4ndCB3b3JrIHdpdGggaW50ZXJsYWNlZCBjb250ZW50IHRoYXQgaGFzIHByb3BlciBtYXJrZXIgYml0cworCSAgdG8gaW5kaWNhdGUgdGhlIEFVIGJvdW5kYXJpZXMuIEl0IHdhcyBsZWFraW5nIHRoZSBmaXJzdCBmaWVsZCBidWZmZXIKKwkgIGFuZCBwcm9kdWNpbmcgYSBjb3JydXB0ZWQgb3V0cHV0LgorCSAgZml4ZXM6IGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjgwNDEKKworMjAxNC0wNC0xMCAxMDozODoxOSAtMDMwMCAgUmFmYcWCIE11xbx5xYJvIDxnYWx0Z2VuZG9AbzIucGw+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJICBwbmdkZWM6IGVuYWJsZSBsaWJwbmcgaW50ZXJsYWNlZCBwaWN0dXJlIGhhbmRsaW5nCisJICBNYWtlcyBsaWJwbmcgZGVpbnRlcmxhY2UgQWRhbTcgaW50ZXJsYWNlZCBwaWN0dXJlcworCSAgYnkgZGVmYXVsdC4gSXQgaXMgdGhlIG9ubHkgaW50ZXJsYWNlZCBmb3JtYXQgYXZhaWxhYmxlCisJICBhbmQgaWYgdGhlIHBpY3R1cmUgaXNuJ3QgaW50ZXJsYWNlZCB0aGUgY29kZSBzaG91bGQgYmVoYXZlCisJICBhcyBiZWZvcmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI2MTYxCisKKzIwMTQtMDQtMTEgMTM6Mjc6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogT25seSBrZWVwLWFsaXZlIHRoZSBjb25uZWN0aW9uIGluIHN0b3AoKSBpZiB3ZSBoYXZlIGZpbmlzaGVkIGFsbCBwcmV2aW91cyBtZXNzYWdlcworCSAgQWZ0ZXIgY2FuY2VsbGluZyBhIHJlcXVlc3Qgd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbi4KKworMjAxNC0wNC0xMSAxMTo1NDoxMiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJICBkdmRlYzogRG9uJ3Qgc2V0IGJvZ3VzIHRpbWVzdGFtcC9kdXJhdGlvbgorCSAgVGhpcyB3aWxsIGhhcHBlbiBpZiB3ZSBoYXZlIGFuIGluY29taW5nIHN0cmVhbSB3aXRoIGEgbm9uLVRJTUUgc2VnbWVudAorCSAgQ291bGQgYmUgaW1wcm92ZWQgbGF0ZXIgdG8gZmlndXJlIG91dCBwcm9wZXIgcHRzL2R1cmF0aW9uLgorCSAgQ0lEICMxMTk5NzAyCisJICBDSUQgIzExOTk3MDMKKworMjAxNC0wNC0xMSAxMTo1Mzo0MiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJICBkdmRlYzogUHJvcGVybHkgcmVmdXNlIGluY29taW5nIHN0cmVhbSB3aXRob3V0IGZyYW1lcmF0ZQorCSAgVGhlIHJldHVybiB2YWx1ZSB3YXNuJ3QgcHJvcGVybHkgcHJvcGFnYXRlZCBiYWNrIGlmIHRoZSBjYXBzCisJICBkaWRuJ3QgY29udGFpbiBhIGZyYW1lcmF0ZQorCisyMDE0LTA0LTEwIDE2OjM1OjI4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IEFsc28gcmV0cnkgb24gdW5leHBlY3RlZCBuZXR3b3JrIGZhaWx1cmVzCisKKzIwMTQtMDQtMTAgMTU6NDU6NDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IE5ldyBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGJlZm9yZSB3ZSBnaXZlIHVwCisKKzIwMTQtMDMtMTMgMTA6NTY6MTEgKzAxMDAgIEFsZXhhbmRlciBaYWxsZXNvdiA8emFsbGVzb3ZAZ21haWwuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IENoYW5nZSBkZWZhdWx0IHRpbWVvdXQgdG8gMTUgc2Vjb25kcworCSAgSWYgbm90aGluZyBoYXBwZW5zIGFmdGVyIDE1IHNlY29uZHMsIGNoYW5jZXMgYXJlIGdvb2QgdGhhdAorCSAgb3VyIGNvbm5lY3Rpb24gd2lsbCBuZXZlciB3aWxsIHdvcmsuIFN0b3AgYWZ0ZXIgMTUgc2Vjb25kcworCSAgaW5zdGVhZCBvZiB3YWl0aW5nIHVudGlsIHRoZSBzeXN0ZW0ncyBkZWZhdWx0IHRpbWVvdXQsIHdoaWNoCisJICBjYW4gYmUgPiAxIG1pbnV0ZS4KKworMjAxNC0wNC0wOSAxNzozMDo1NCArMDkwMCAgSmltbXkgT2huIDx5b25namluLm9obkBsZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJlcGxhY2UgZHVwbGljYXRlZCB2YXJpYWJsZSB3aGVuIHBhcnNpbmcgdHJleCBhdG9tCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI3ODc4CisKKzIwMTQtMDQtMDkgMTA6NTY6MjkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogVXNlIEdTVF9GTE9XX0ZMVVNISU5HIHdoZW4gZmx1c2hpbmcsIG5vdCBHU1RfRkxPV19FT1MKKwkgIC4uLiBhbmQgcmVzZXQgaXQgcHJvcGVybHkgYWZ0ZXIgZmx1c2hpbmcgaXMgZG9uZS4gRml4ZXMgcGxheWJhY2sKKwkgIGluIG1hbnkgY2FzZXMgd2hlbiBidWZmZXJpbmcgaXMgdXNlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mjc4MjEKKworMjAxNC0wNC0wOSAwODo1ODowNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBQcm9wZXJseSByZXR1cm4gc3RyZWFtIGZsYWdzIHdoZW4gcGFyc2luZyB0cmV4IGF0b20KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03Mjc4NjcKKworMjAxNC0wMy0xOSAxOToxODoxMSArMDAwMCAgTWF0dGhpZXUgQm91cm9uIDxtYXR0aGlldS5ib3Vyb25AY29sbGFib3JhLmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiB1c2UgdGhlIHZpZGVvIGZyYW1lIEFQSSBpbnN0ZWFkIG9mIHRoZSB2aWRlbyBtZXRhIEFQSQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNjczOAorCisyMDE0LTAzLTE5IDE4OjQ3OjM5ICswMDAwICBNYXR0aGlldSBCb3Vyb24gPG1hdHRoaWV1LmJvdXJvbkBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IGFkdmVydGl6ZSB2aWRlbyBtZXRhIEFQSSBzdXBwb3J0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI2NzM3CisKKzIwMTQtMDQtMDggMTE6MzE6MDYgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJICBpbnRlcmxlYXZlOiBBZGQgbWlzc2luZyBicmVhayBpbiBzd2l0Y2ggc3RhdGVtZW50CisJICBUaGUgY2FwcyBxdWVyeSBpcyBoYW5kbGVkIGVudGlyZWx5IGFscmVhZHkgYmVmb3JlLgorCSAgQ0lEICMxMTM5NzU3CisKKzIwMTQtMDQtMDYgMTg6MDM6MTEgLTAzMDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHIudmVyZGVqb0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSAgdGVzdHM6IHNvdXBodHRwc3JjOiB1c2UgU291cEtub3duU3RhdHVzQ29kZSBpZiBuZWVkZWQKKwkgIEZyb20gbGlic291cCBkb2NzOgorCSAgUHJpb3IgdG8gMi40NCBTb3VwU3RhdHVzIHdhcyBjYWxsZWQgU291cEtub3duU3RhdHVzQ29kZSwKKwkgIGJ1dCB0aGUgaW5kaXZpZHVhbCB2YWx1ZXMgaGF2ZSBhbHdheXMgaGFkIHRoZSBuYW1lcyB0aGV5CisJICBoYXZlIG5vdy4KKwkgIEZpeGVzOgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNzMyOQorCisyMDE0LTA0LTA3IDEyOjU4OjIzICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHVzZSBmcmFtZXMsIG5vdCBieXRlcywgZm9yIHBvc2l0aW9uIHF1ZXJ5IGluIFZCUiBzdHJlYW1zCisJICBDb3Zlcml0eSAxMTM5NjQ4CisKKzIwMTQtMDQtMDcgMTI6NDI6MTQgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkgIHNtcHRlOiBmaXggY29weS9wYXN0ZSBlcnJvciBjYXVzaW5nIHVubWFwIG9uIHdyb25nIGJ1ZmZlcgorCSAgQ292ZXJpdHkgMTEzOTY0NworCisyMDE0LTA0LTA3IDEyOjE2OjE3ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogZ3VhcmQgYWdhaW5zdCBmaW5kaW5nIG5vIHN1aXRhYmxlIHBhdHRlcm4KKwkgIFRoZSBjb2RlIGhhbmRsZXMgYSAtMSBwYXR0ZXJuIGluZGV4LCBhbmQgaXQgc2VlbXMgcGxhdXNpYmxlCisJICB0aGF0IGEgcGF0dGVybiBtaWdodCBiZSBmb3VuZCBsYXRlciwgc28gaXQgc2VlbXMgYmVzdCB0byBub3QKKwkgIHNlbmQgYW4gZWxlbWVudCBlcnJvciBoZXJlLgorCSAgQ292ZXJpdHkgMTEzOTc2NgorCisyMDE0LTA0LTA0IDE3OjM4OjE0ICswMjAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogdXBkYXRlIGZvciBuZXcgTUlLRVkgQVBJCisKKzIwMTQtMDQtMDMgMTc6NDA6MDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBzZW5kIHNlbmRlciBTU1JDIGluIHRoZSBNSUtFWSBtZXNzYWdlCisJICBBbGxvY2F0ZSBhIG5ldyBTU1JDIGZvciBvdXIgUlRDUCBtZXNzYWdlcyBiYWNrIHRvIHRoZSBzZXJ2ZXIgYW5kIHNldAorCSAgdGhpcyBpbiB0aGUgTUlLRVkgbWVzc2FnZS4KKworMjAxNC0wNC0wMyAxNzozOTozMCArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IG1ha2UgcmFuZG9tIG51bWJlciBmb3IgdGhlIENTQgorCSAgQXMgcmVjb21tZW5kZWQgaW4gdGhlIFJGQworCisyMDE0LTAzLTI2IDEyOjEwOjQ0ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZG9uJ3QgcHV0IHNwYWNlcyBpbiBrZXltZ210IGhlYWRlcgorCisyMDE0LTAzLTI1IDE3OjQ3OjQ5ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogY3JlYXRlIGFuZCBzZW5kIHRoZSBSVENQIGVuY3J5cHRpb24ga2V5CisJICBDcmVhdGUgYW5kIG1ha2UgYSBrZXkgZm9yIGVuY3J5cHRpbmcgdGhlIFJUQ1AgcGFja2V0cyBiYWNrIHRvIHRoZSBzZXJ2ZXIKKwkgIGFuZCB3cmFwIHRoaXMgaW4gYSBNSUtFWSBtZXNzYWdlIHRoYXQgd2Ugc2VuZCBhcyBhIGhlYWRlciBpbiB0aGUgU0VUVVAKKwkgIHJlcXVlc3QuCisKKzIwMTQtMDQtMDMgMTI6MTg6MzkgKzAyMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmcmVlIHRoZSBzcnRwZGVjIGVsZW1lbnQKKworMjAxNC0wNC0wMyAxMjoxNjoyNSArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGNsZWFudXAgc3RyZWFtX2ZyZWUgZnVuY3Rpb24KKwkgIFRoZXJlIGlzIG5vIHJlYXNvbiB0byBOVUxMIGFsbCBmaWVsZHMsIHdlIHdpbGwgZnJlZSB0aGUgc3RyZWFtIGFueXdheS4KKworMjAxNC0wNC0wMyAxMjowNzozMSArMDIwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBkZW1vdGUgd2FybmluZyB0byBkZWJ1ZworCSAgRm9yIFRDUCwgaXQgaXMgbm9ybWFsIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0aW1lc3RhbXBzIHNvIGRvbid0IFdBUk4gb24KKwkgIGl0LgorCisyMDE0LTAzLTI5IDE5OjEzOjA2IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDI6IEZpeCBzdXBwb3J0IGZvciBjYXBzIHdpdGhvdXQgd2lkdGgsIGhlaWdodCwgZnJhbWVyYXRlIG9yIGZvcm1hdAorCSAgRm9yIGZvcm1hdCBsaWtlIG1wZWd0cywgd2lkdGggYW5kIGhlaWdodCBpcyByYXJlbHkgaW4gdGhlIG5lZ290aWF0ZWQgY2Fwcy4gVGhpcworCSAgcGF0Y2ggZml4ZXMgZmFpbHVyZSB3aGVuIHNldHRpbmcgZm9ybWF0LCBhbmQgcHJldmVudCBpbnRyb2R1Y2luZyB3aWR0aCwgaGVpZ2h0LAorCSAgZnJhbWVyYXRlIGFuZCBmb3JtYXQgdG8gdGhlIGNhcHMgd2hlbiBmaXhhdGluZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjU4NjAKKworMjAxNC0wMy0zMSAxODozNDoxMyArMDIwMCAgVGhpYmF1bHQgU2F1bmllciA8dHNhdW5pZXJAZ25vbWUub3JnPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogQWx3YXlzIHNldCBQVFM9RFRTIG9uIHJhdyB2aWRlbyBzdHJlYW1zCisKKzIwMTQtMDMtMzEgMTg6MzE6MjIgKzAyMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRzYXVuaWVyQGdub21lLm9yZz4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IEFsd2F5cyBzZXQgcGl4ZWwtYXNwZWN0LXJhdGlvIG9uIHJhdyB2aWRlbyBzdHJlYW1zCisJICBUaGF0IGZpZWxkIGlzIG1hbmRhdG9yeSBpbiBjYXBzIGFuZCBpZiBpdCBpcyBub3QgcHJlc2VudCBpbiB0aGUKKwkgIEFWSSBjb250YWluZXIsIGl0IG1lYW5zIHNxdWFyZSBwaXhlbHMgdGh1cyAxLzEuCisKKzIwMTQtMDMtMzAgMDA6MzU6MDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thLW11eDogYWRkIG1hcHBpbmcgZm9yIE9wdXMgYXVkaW8KKwkgIE1pZ2h0IHdhbnQgdG8gY29uc2lkZXIgYWRkaW5nIGNoYW5uZWxzL3JhdGUKKwkgIHJlcXVpcmVtZW50IHRvIHRlbXBsYXRlIGNhcHMsIGJ1dCByZXF1aXJlcworCSAgZml4aW5nIHVwIG9mIGVuY29kZXIgYW5kIHBhcnNlciBmaXJzdC4KKworMjAxNC0wMy0zMCAwMDozMToxMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBtYXRyb3NrYS1kZW11eDogYWRkIG1hcHBpbmcgZm9yIE9wdXMgYXVkaW8gY29kZWMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjczMDUKKworMjAxNC0wMy0yOSAxNzoyMToxNyAtMDQwMCAgV2lsbGlhbSBNYW5sZXkgPHdpbGxAd2lsbGlhbW1hbmxleS5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IEZpeCBzdXBwb3J0IGZvciBtcGVndHMgc3RyZWFtcworCSAgSXQgc2VlbXMgdGhhdCBHU3RyZWFtZXIncyBtcGVndHMgZWxlbWVudHMgKHRzZGVtdXgsIHRzcGFyc2UpIHJlcXVpcmUgY2FwcworCSAgYHZpZGVvL21wZWd0cyxzeXN0ZW1zdHJlYW09dHJ1ZWAuICBBcyBmYXIgYXMgSSBjYW4gc2VlIHRoZSBzaWduaWZpY2FuY2UKKwkgIG9mIHN5c3RlbXN0cmVhbSBpcyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgYSBjb250YWluZXIgZm9ybWF0IHJhdGhlciB0aGFuCisJICBhbiBlbGVtZW50YXJ5IHN0cmVhbS4gIEFzIHRoaXMgaXMgdGhlIGNhc2UgKGFuZCBJIGNhbid0IHVuZGVyc3RhbmQgaG93IGl0CisJICBjb3VsZCBub3QgYmUgdGhlIGNhc2Ugd2l0aCBtcGVndHMpIEkgYWRkIHN5c3RlbXN0cmVhbT10cnVlIHRvIHY0bDJzcmMncworCSAgY2Fwcy4KKwkgIFRoaXMgYWxsb3dzIHY0bDJzcmMgdG8gYmUgbGlua2VkIHdpdGggdHNkZW11eCBmb3IgcGxheWJhY2sgZnJvbSBteQorCSAgSGF1cHBhdWdlIEhELVBWUiB3aXRoIHRoZSBwaXBlbGluZToKKwkgIHY0bDJzcmMgISBxdWV1ZSAhIHRzZGVtdXggISB2aWRlby94LWgyNjQgISBkZWNvZGViaW4gISB4dmltYWdlc2luaworCSAgSW4gY29tYmluYXRpb24gd2l0aCB0aGUgbmV4dCBjb21taXQgdGhpcyBmaXhlcyB1c2luZyBIYXVwcGF1Z2UgSEQtUFZSIHdpdGgKKwkgIEdTdHJlYW1lciAxLjArLgorCisyMDE0LTAxLTE0IDE0OjQ4OjQyICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgdjRsMjogYXR0ZW1wdCB0byBmaXggaW5maW5pdGUgKGZvciBzbWFsbCB2ZXJzaW9uIG9mIGluZmluaXRlKSBsb29wCisKKzIwMTQtMDMtMjkgMTM6MjA6MzAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwbWFuYWdlcjogY29weSBzdGlja3kgZXZlbnRzIHdoZW4gZXhwb3NpbmcgcGFkcyBpbiBtb3JlIHBsYWNlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNDcxMgorCisyMDE0LTAzLTI4IDIwOjExOjM2ICswMTAwICBSaWNvIFR6c2NoaWNoaG9seiA8cmljb3R6QHVidW50dS5jb20+CisKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSAgdjRsMjogZml4IGRpc3RjaGVjaworCSAgTWFrZSBzdXJlIGV4dC8qLmggYXJlIGRpc3QnZWQKKworMjAxNC0wMy0yNyAxOTo1MTo1MCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHhpbWFnZXNyYzogb25seSBleHRyYXBvbGF0ZSBhbHBoYSBtYXNrIGZvciAzMi1iaXQgZGVwdGgKKwkgIEluc3RlYWQgb2YgcGFzc2luZyBib2d1cyBhbHBoYSBtYXNrIHZhbHVlcyB3aGVuIHRoZXJlJ3Mgbm8gYWxwaGEuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI2ODMzCisKKzIwMTQtMDMtMjEgMTM6MDM6MTcgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHhpbWFnZXNyYzogQWRkIEFSR0IvQkdSQSBzdXBwb3J0CisKKzIwMTQtMDMtMjAgMTU6Mjg6MjYgKzAxMDAgIE9nbnlhbiBUb25jaGV2IDxvZ255YW5AYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAganBlZ3BheTogY29uc2lkZXIgaGVhZGVyIGxlbiB3aGVuIGNhbGN1bGF0aW5nIHBheWxvYWQgbGVuCisJICBGaXhlZCBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI2Nzc3CisKKzIwMTQtMDMtMjYgMDg6MDM6MjIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IEFsbCBmcmFtZXMgYXJlIHN5bmMgcG9pbnRzCisKKzIwMTQtMDMtMjYgMDg6MDI6NDMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJICBwbmdkZWM6IEFsbCBmcmFtZXMgYXJlIHN5bmMgcG9pbnRzCisKKzIwMTQtMDMtMjIgMTc6MDc6NDYgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBzZWdtZW50IGNsb3Npbmcgbm90IG5lZWRlZCBpbiAxLngKKwkgIC4uLiBhcyBzZW5kZXIgc2hvdWxkIGtlZXAgdHJhY2sgb2Ygc2VnbWVudCBiYXNlIGFjY3VtdWxhdGlvbi4KKwkgIFJhdGhlciwgaXQgbWF5IGhhdmUgc29tZSBhZHZlcnNlIGVmZmVjdHMgYXMgYSBzcHVyaW91cyBzZWdtZW50IGV2ZW50LAorCSAgZS5nLiBpbiBjb2xsZWN0cGFkcy4KKworMjAxNC0wMy0yMiAxNzowNToxNyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGVhcmx5IHNlbmRpbmcgcGVuZGluZyBjb2RlYy1kYXRhIGZvciBhbGwgc3RyZWFtcworCSAgLi4uIGF0IGxlYXN0IGJlZm9yZSBzeW5jaW5nIGFjcm9zcyBhbGwgc3RyZWFtcyBtaWdodCBjYXVzZSBzb21lIGdhcAorCSAgYWN0aXZpdHkgb24gYW55IG9mIHRob3NlIHN0cmVhbXMsIG5vdGFibHkgc3BhcnNlIHN0cmVhbXMuCisJICBTZWUgYWxzbyAjNzEyMTM0CisKKzIwMTQtMDMtMjIgMTc6MDE6MjcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGhhbmRsZSBib3RoIHN0aWNreSBhbmQgbm9uLXN0aWNreSBjdXN0b20gZXZlbnQKKworMjAxNC0wMy0yNSAxMTo0NDoyNyArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IG9ubHkgZXhwb3NlIHN0cmVhbXMgb24gZGF0YWZsb3cKKwkgIE9ubHkgcHJvYmUgb24gYnVmZmVycywgd2UgZG9uJ3Qgd2FudCB0byBleHBvc2UgdGhlIHN0cmVhbXMgb24gZXZlbnRzLgorCisyMDE0LTAzLTI1IDExOjM2OjQwICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBjb3B5IHN0aWNreSBldmVudHMgdG8gZ2hvc3RwYWQKKwkgIFdoZW4gd2UgZXhwb3NlIGludGVybmFsIHBhZHMgYXMgZ2hvc3RwYWRzLCBmaXJzdCBjb3B5IHRoZSBzdGlja3kgZXZlbnRzCisJICBzbyB0aGF0IHdlIGhhdmUgdGhlIGNhcHMgYW5kIHNlZ21lbnQgZXRjLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNDcxMgorCisyMDE0LTAzLTI0IDE0OjI1OjQzICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogc3J0cCBoYW5kbGluZworCisyMDE0LTAzLTI1IDEwOjIzOjAwICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogc2V0IFNTUkMgb24gY2FwcyBpZiBrbm93bgorCisyMDE0LTAzLTI0IDE2OjU4OjI1ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcHV0IGNhcHMgb24gdWRwc3JjIGluc3RlYWQgb2YgdXNpbmcgdGhlIHNpZ25hbHMKKwkgIFRyeSB0byBhdm9pZCB1c2luZyB0aGUgcmVxdWVzdC1wdC1tYXAgdG8gZ2V0IGNhcHMgYnV0IHNldCB0aGVtIGRpcmVjdGx5CisJICBvbiB0aGUgdWRwc3JjIGVsZW1lbnQuIFRoYXQgd2F5LCB0aGUgY2FwcyBnZXQgbmljZWx5IHRyYW5zZm9ybWVkIGFzIHRoZXkKKwkgIHBhc3MgdGhyb3VnaCB0aGUgZGlmZmVyZW50IGVsZW1lbnRzIGluIHRoZSBydHBiaW4sIGluY2x1ZGluZyB0aGUgQVVYIGFuZAorCSAgZGVjb2Rlci9lbmNvZGVyIGVsZW1lbnRzLgorCisyMDE0LTAzLTI0IDE1OjM1OjA5ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogdXNlIHByb2ZpbGUgdG8gc2V0IHJ0Y3AgY2FwcworCSAgVXNlIHRoZSBuZWdvdGlhdGVkIHByb2ZpbGUgdG8gc2V0IHgtcnRjcCBvciB4LXNydGNwIGNhcHMKKworMjAxNC0wMy0yNCAxNTozNDoyNiArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHNldCB1ZHBzcmMgdG8gUkVBRFkKKwkgIFJFQURZIGlzIGVub3VnaCB0byBhbGxvY2F0ZSBwb3J0cyBub3cKKworMjAxNC0wMy0yNCAxNDoyNToyOCArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IGltcHJvdmUgY2FwcyBoYW5kbGluZworCSAgUHJvdGVjdCBjYXBzIHdpdGggdGhlIGxvY2suCisJICBEb24ndCBwdXNoIHRoZSBjYXBzIGV2ZW50IGZyb20gdGhlIHNldF9wcm9wZXJ0eSBmdW5jdGlvbiBidXQgbWFyayB0aGUKKwkgIHBhZCBmb3IgcmVjb25maWd1cmF0aW9uIHNvIHRoYXQgaXQgd2lsbCByZW5lZ290aWF0ZSBhbmQgcHVzaCB0aGUgbmV3CisJICBjYXBzIGV2ZW50IGluIHRoZSBzdHJlYW1pbmcgdGhyZWFkLgorCisyMDE0LTAzLTI0IDE1OjE1OjM0ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogb3Blbi9jbG9zZSBzb2NrZXQgaW4gTlVMTDwtPlJFQURZIHN0YXRlCisJICBXZSBzaG91bGQgb3BlbiB0aGUgc29ja2V0IHdoZW4gZ29pbmcgdG8gTlVMTDwtPlJFQURZIGFuZCBub3QgaW4gdGhlCisJICBzdGFydC9zdG9wIHZlbXRob2QsIHdoaWNoIGlzIGNhbGxlZCBpbiBSRUFEWTwtPlBBVVNFRC4gVGhpcyBtYWtlcyBpdAorCSAgcG9zc2libGUgdG8gYWxsb2NhdGUgYSBzb2NrZXQgd2l0aG91dCBnb2luZyB0byBQQVVTRUQgKGFuZCBzdGFydGluZyB0aGUKKwkgIG5lZ290aWF0aW9uKS4KKworMjAxNC0wMy0yNCAxNDozNTowMSArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGZyZWUgY2FwcyBpbiBwdG1hcCBhcnJheQorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNjY5NgorCisyMDE0LTAzLTIwIDExOjEyOjUxICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogaGFuZGxlIE5VTEwgcnRwbWFwIGFuZCBwYXJzZSBlcnJvciBiZXR0ZXIKKworMjAxNC0wMy0xNiAyMzo0NjoyMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogRG9uJ3QgY2hlY2sgZm9yIGd1ZGV2IGlmIHZpZGVvNGxpbnV4MiBpcyBub3QgcHJlc2VudAorCisyMDE0LTAzLTE2IDIzOjE5OjU1IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBEb24ndCBmYWlsIGlmIGd1ZGV2IGlzIG5vdCBwcmVzZW50CisJICBQS0dfQ0hFQ0tfTU9EVUxFUyBoYXMgdGhlIGJhZCBoYWJpdCBvZiBmYWlsaW5nIHRoZSBidWlsZCBpZiBpdCBkb2Vzbid0CisJICBnZXQgd2hhdCBpdCB3YW50cywgcHJldmVudCB0aGF0LgorCisyMDEyLTExLTAyIDEzOjMzOjEzICswMTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJkZXZpY2Vtb25pdG9yLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyZGV2aWNlbW9uaXRvci5oOgorCSAgdjRsMjogSW1wbGVtZW50IEdzdERldmljZU1vbml0b3Igc3ViY2xhc3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Nzg0MDIKKworMjAxMy0wOC0xMiAxMTo0OToyMSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL01ha2VmaWxlLmFtOgorCSogZXh0L3B1bHNlL3BsdWdpbi5jOgorCSogZXh0L3B1bHNlL3B1bHNlZGV2aWNlbW9uaXRvci5jOgorCSogZXh0L3B1bHNlL3B1bHNlZGV2aWNlbW9uaXRvci5oOgorCSAgcHVsc2U6IEFkZCBkZXZpY2UgbW9uaXRvcnMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Nzg0MDIKKworMjAxNC0wMy0xNiAxOToyNDoyNiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IFJlbW92ZSBHc3RQcm9wZXJ0eVByb2JlIGxlZnRvdmVycworCisyMDE0LTAyLTE5IDAzOjA0OjAzICswMTAwICBNYXRoaWV1IER1cG9uY2hlbGxlIDxtZHVwb25jaGVsbGUxQGdtYWlsLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmg6CisJICB2aWRlb21peGVyOiBQb3J0IHRvIG5ldyBjb2xsZWN0cGFkcyBBUEkKKwkgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNDcwNQorCisyMDE0LTAzLTE2IDE1OjI2OjA0ICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2V4dC90eXBlcy1jb21wYXQuaDoKKwkqIHN5cy92NGwyL2V4dC92aWRlb2RldjIuaDoKKwkgIHY0bDI6IEFkZCB0eXBlcyBjb21wYXRpYmxpdHkgZm9yIG90aGVyIE9TCisJICBBZGRzIHR5cGUgY29tcGF0aWJsaXR5IHdpdGggb3RoZXIgT1MgbGlrZSBCU0QuIFRoaXMgdXNlcyB0eXBlcyBtYXBwaW5nIG1hY3JvIHRvCisJICBhdm9pZCBjb25mbGljdCB3aXRoIGV4aXN0aW5nIGRlZmluZWQgdHlwZXMuIFdlIHJlc3VzZSBnbGliIHR5cGVzIGFzIHRoZXNlIGFyZQorCSAgYWxyZWFkeSBhdmFpbGFibGUgb24gc3VwcG9ydGVkIHBsYXRmb3Jtcy4gVGhpcyBpcyBHQ0Mgb25seSBiZWNhdXNlIG9mIHRoZQorCSAgbGUzMiB0eXBlIHRoYXQgdXNlcyBiaXR3aXNlIGF0dHJpYnV0ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjY0NTMKKworMjAxNC0wMy0xNiAxNTo1NTowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSAgcHVsc2U6IGZpeCBmb3JtYXQgaW5mbyB0byBjYXBzIGNvbnZlcnNpb24gZm9yIG11bGF3CisKKzIwMTMtMDgtMTMgMTI6MTA6NDIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuaDoKKwkgIHB1bHNlOiBNYWtlIGdzdF9wdWxzZV9mb3JtYXRfaW5mb190b19jYXBzKCkgc2hhcmVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc4NDAyCisKKzIwMTQtMDMtMTUgMTg6NDE6MTYgKzAxMDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL01ha2VmaWxlLmFtOgorCSAgdjRsMjogRml4IHR5cG8gVjRMX0RJUiBpbnRlYWQgb2YgVjRMMl9ESVIKKworMjAxNC0wMy0xNSAxODowNTozMiArMDEwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICB2NGwyLWJ1aWxkOiBTZXQgSEFWRV9HU1RfVjRMMiBpZiBoZWFkZXJzIGFyZSBwcmVzZW50CisJICBUaGUgbmFtZSBvZiBIQVZFXyBuZWVkIHRvIG1hdGNoIHRoZSBVU0VfLiBOb3cgc2V0IEhBVkVfR1NUX1Y0TDIgaWYKKwkgIHZpZGVvZGV2Mi5oIGlzIGZvdW5kLgorCisyMDE0LTAzLTE1IDE2OjQ3OjUxICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHN5cy9NYWtlZmlsZS5hbToKKwkgIHY0bDI6IEFjdHVhbGx5IGJ1aWxkIHRoZSBwbHVnaW4KKwkgIFRoZSBjaGVja3Mgd2VyZSByZW1vdmVkIGluYWR2ZXJ0ZWRseSBpbiBwcmV2aW91cyBwYXRjaCBhbmQgbm90IHJlcGxhY2VkLgorCSAgUmUtaW50cm9kdWNlIHRoZSBjb25maWd1cmUgY2hlY2tzIGFuZCBzb21lIG9mIHRoZSBjaGVja3MgaW4gb3JkZXIgdG8gZW5hYmxlCisJICB0aGlzIHBsdWdpbiBhZ2Fpbi4gV2Ugb25seSBjaGVjayBpZiB2aWRlb2RldjIuaCBleGlzdCBvbiB0aGUgcGxhdGZvcm0gdG8KKwkgIGF2b2lkIGJ1aWxkaW5nIG9uIFdpbmRvd3Mgb3IgT1NYLCB0aG91Z2ggd2UgYnVpbGQgYWdhaW5zdCBvdXIgb3duIGNvcHkuIFRoaXMKKwkgIHdhcyBicmVha2luZyB0aGUgYnVpbGQgb24gYnVpbHQtYm90LgorCisyMDE0LTAzLTE1IDEzOjQ3OjQyICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2hyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICB0cmFuc2xhdGlvbjogUE8gZmlsZSBjaGFuZ2VzIGNhdXNlZCBieSBQT1RGSUxFLmluIHVwZGF0ZQorCisyMDE0LTAzLTE1IDEzOjE3OjIxICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHBvL1BPVEZJTEVTLmluOgorCSogcG8vUE9URklMRVMuc2tpcDoKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb292ZXJsYXkuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb292ZXJsYXkuaDoKKwkgIHY0bDI6IFJlbW92ZSBYViBzdXBwb3J0CisJICBYViBzdXBwb3J0IGZvciB2NGwyIG5ldmVyIGJlY2FtZSB1cHN0cmVhbSBhbmQgZW5kZWQgdXAgYmVpbmcKKwkgIGNvbW1lbnRlZCBvdXQgd2l0aCBhbiB1bmRlZiBmb3IgYSBsb25nIHRpbWUgbm93LgorCisyMDE0LTAzLTE1IDExOjEzOjA1ICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkqIHN5cy9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2V4dC92NGwyLWNvbW1vbi5oOgorCSogc3lzL3Y0bDIvZXh0L3Y0bDItY29udHJvbHMuaDoKKwkqIHN5cy92NGwyL2V4dC92aWRlb2RldjIuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkb3JpZW50LmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgIHY0bDI6IFVzZSBhIGNvcHkgb2YgdmlkZW9kZXYyLmggaGVhZGVyCisJICBXaXRoIHllYXJzIHRoZSBhbW91bnQgb2YgaWZkZWYgaGF2ZSBncm93biB1cCBhbmQgd2UgYXJlIG5vdCBldmVuIHN1cmUgaWYgdGhlCisJICBvbGQgY29kZSBwYXRoIGNvbXBpbGVzLiBFYWNoIHRpbWUgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHY0bDIgZnJhbWV3b3JrIHRvIGFkZAorCSAgdGhlIG5ldyBmZWF0dXJlLCB3ZSBicmVhayBjb21waWxhdGlvbiBvbiBvbGRlciBrZXJuZWwuIFdpdGggZXhjZXB0aW9uIG9mIHR3bworCSAgY29udHJvbHMgaW4gdGhlIHZpZGVvIG9yaWVudGF0aW9uIGNvbnRyb2wsIHRoaXMgcGF0Y2ggZ2V0IHJpZCBvZiBhbGwgaWZkZWYgYnkKKwkgIGluY2x1ZGluZyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdmlkZW9kZXYyLmggaW5zaWRlIEdTdHJlYW1lci4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjM0NDYKKworMjAxNC0wMy0xMiAxNTozMjo1NSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJICBzb3VwaHR0cHNyYzogQWRkIHByb3BlcnRpZXMgZm9yIHNlbGVjdGluZyBTU0wvVExTIGNlcnRpZmljYXRlIGNoZWNraW5nCisJICBBbmQgYnkgZGVmYXVsdCBwcm9wZXJseSBjaGVjayBjZXJ0aWZpY2F0ZXMgYWdhaW5zdCB0aGUgc3lzdGVtJ3MgQ0EKKwkgIGNlcnRpZmljYXRlcy4gRXZlcnl0aGluZyBlbHNlIGlzIG5vdCBhIGdvb2QgZGVmYXVsdCBhdCBhbGwuCisKKzIwMTQtMDMtMTEgMTQ6NTY6MzAgKzAxMDAgIFBlciB4IEpvaGFuc3NvbiA8cGVyeGpvaEBheGlzLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBmaXggYXNzZXJ0IG9uIGZwcyBsb3dlciB0aGFuIDEKKwkgIEZpeGVzIGFzc2VydCBjYXVzZWQgYnkgZ3N0X2R1cmF0aW9uX3RvX2ZyYWN0aW9uIGNhbGxpbmcKKwkgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgd2l0aCBhIGRlbm9taW5hdG9yIG9mIDAgd2hlbiBmcHMgaXMgbGVzcworCSAgdGhhbiAxLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNjEwNgorCisyMDE0LTAzLTExIDAwOjQ2OjA2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXIyOiBzdG9yZSB2aWRlbyBpbmZvIHdpdGggYnVmZmVycyB0byBrZWVwIGl0IGluIHN5bmMKKwkgIEluc3RlYWQgdGhlIHF1ZXVlZCBidWZmZXIgbWlnaHQgaGF2ZSBhbiBvbGQgY2FwcyB3aGlsZSB0aGUgcGFkCisJICBpcyBhbHJlYWR5IHN0b3JpbmcgdGhlIGluZm9ybWF0aW9uIGZvciBhIG5ldyBjYXBzLiBNaXhpbmcgdGhvc2UKKwkgIHdoaWxlIGhhbmRsaW5nIGJ1ZmZlcnMgd2lsbCBvZnRlbiBsZWFkIHRvIGlzc3VlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNTk0OAorCisyMDE0LTAzLTA4IDE5OjI5OjU4IC0wNTAwICBXaWxsaWFtIE1hbmxleSA8d2lsbEB3aWxsaWFtbWFubGV5Lm5ldD4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgdjRsMjogRml4IHR5cG8gY29udG9sIC0+IGNvbnRyb2wKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjU2MzIKKworMjAxNC0wMy0wNCAwMToxNTo0OSArMDAwMCAgV2lsbGlhbSBNYW5sZXkgPHdpbGxAd2lsbGlhbW1hbmxleS5uZXQ+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDI6IE5vcm1hbGlzZSBjb250cm9sIG5hbWVzIGluIHRoZSBzYW1lIHdheSBhcyB2NGwyLWN0bAorCSAgVjRMMiBrZXJuZWwgZHJpdmVycyBhbGxvdyBjb25maWd1cmF0aW9uIG9mIHRoZSBoYXJkd2FyZSBzZXR0aW5ncyB2aWEgYQorCSAgbWVjaGFuaXNtIGNhbGxlZCBjb250cm9scy4gIFRoZXNlIGNhbiBiZSByZWZlcnJlZCB0byBieSBuYW1lIHN1Y2ggYXMKKwkgICJCcmlnaHRuZXNzIiBhbmQgIldoaXRlIEJhbGFuY2UgVGVtcGVyYXR1cmUiLiAgVGhlIHVzZXItc3BhY2UgY29tbWFuZCBsaW5lCisJICBjbGllbnQgZm9yIHNldHRpbmcgdGhlc2UgY29udHJvbHMgKHY0bDItY3RsKSBub3JtYWxpc2VzIHRoZXNlIG5hbWVzIHN1Y2gKKwkgIHRoYXQgdGhleSBvbmx5IGNvbnRhaW4gbG93ZXIgY2FzZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgdGhlCisJICB1bmRlcnNjb3JlICdfJy4gIGUuZzoKKwkgIEtlcm5lbCAgICAgICAgICAgICAgICAgICAgIHY0bDItY3RsCisJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICBCcmlnaHRuZXNzICAgICAgICAgICAgICAgICBicmlnaHRuZXNzCisJICBXaGl0ZSBCYWxhbmNlIFRlbXBlcmF0dXJlICB3aGl0ZV9iYWxhbmNlX3RlbXBlcmF0dXJlCisJICBGb2N1cyAoYWJzb2x1dGUpICAgICAgICAgICBmb2N1c19hYnNvbHV0ZQorCSAgR1N0cmVhbWVyIHNlZW1zIHRvIHdhbnQgdG8gZm9sbG93IHRoaXMgcGF0dGVybiBidXQgZmFpbGVkIGZvciBjb250cm9scyB3aXRoCisJICBtb3JlIHRoYW4gb25lIGNvbnNlY3V0aXZlIG5vbi1hbHBoYW51bSBjaGFyYWN0ZXIuICBlLmcuIEdTdHJlYW1lciB3b3VsZAorCSAgcHJvZHVjZSAiZm9jdXNfX2Fic29sdXRlXyIgcmF0aGVyIHRoYW4gImZvY3VzX2Fic29sdXRlIi4KKwkgIFRoaXMgY29tbWl0IGZpeGVzIHRoYXQgaXNzdWUuICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpcyBwcmVzZXJ2ZWQgYnkKKwkgIG5vcm1hbGlzaW5nIGFsbCBjb250cm9sIG5hbWVzIGJlZm9yZSBjb21wYXJpc29uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNTYzMgorCisyMDE0LTAzLTA3IDE2OjE3OjI5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IE1ha2Ugc3VyZSB0byBub3QgcmV0dXJuIEVPUyBpbW1lZGlhdGVseSBpZiB3ZSBmaW5pc2hlZCBhIHJhbmdlIHJlcXVlc3QKKwkgIE9ubHkgcmV0dXJuIEVPUyB0aGUgbmV4dCB0aW1lIGNyZWF0ZSgpIGlzIGNhbGxlZCwgaWYgYXQgYWxsLiBiYXNlc3JjCisJICBzaG91bGQgYWxyZWFkeSB0YWtlIGNhcmUgb2Ygbm90IGNhbGxpbmcgaXQgYWdhaW4uCisJICBBbHNvIGFsd2F5cyByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlIHByZXZpb3VzIGZsb3cgcmV0dXJuIHdhcworCSAgbm90IE9LLiBUaGlzIGluZGljYXRlcyBhbiBlcnJvciBzb21ld2hlcmUuCisKKzIwMTQtMDMtMDYgMTI6MDY6NDMgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVuZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOgorCSAgcnRwOiBSZW1vdmUgY2FwcyByZXN0cmljdGlvbnMgZnJvbSBSVFAgZGVwYXlsb2FkZXIgc2luayBjYXBzCisJICBSZW1vdmUgY2FwcyByZXN0cmljdGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBkZWZhdWx0IGFuZCBhcmUgbm90CisJICByZXF1aXJlZCBpbiBTRFAuIFdpdGggdGhlIG5ldyB1c2FnZSBvZiBoYXZpbmcgcGFkcyByZXF1aXJlIGEgc3Vic2V0CisJICBvZiB0aGUgY2FwcywgdGhleSB3aWxsIG1ha2UgdGhlIG5lZ290aWF0aW9uIGZhaWwuCisKKzIwMTQtMDMtMDYgMTE6MDI6MDkgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOgorCSAgcnRwc3BlZXhkZXBheTogUmVtb3ZlIGNhcHMgcmVzdHJpY3Rpb25zIGZvciBkZXBheWxvYWRlcgorCSAgVGhlICJlbmNvZGluZy1wYXJhbXMiIGlzIG9wdGlvbmFsIGluIHRoZSBTRFAsIGJlY2F1c2Ugd2Ugbm93IHJlcXVpcmUKKwkgIGEgc3Vic2V0IG9mIHRoZSBjYXBzLCBpdCB3b3VsZCBmYWlsIGNhcHMgbmVnb3RpYXRpb2luIGlmIGl0IHdhc24ndCBwcmVzZW50LgorCSAgU28gcmVtb3ZlZCBpdCBmcm9tIHRoZSB0ZW1wbGF0ZSBjYXBzLgorCisyMDE0LTAzLTA2IDEzOjM4OjA5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IERvbid0IGZvcmdldCB0byBxdWl0IG1haW5sb29wIGFmdGVyIHdlIGNhbmNlbGxlZCB3aGVuIHdlIGdvdCBkYXRhIGFmdGVyIHRoZSBzdG9wIHBvc2l0aW9uCisKKzIwMTQtMDMtMDYgMTM6MzU6NDcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogSWYgd2UgaGFkIGEgc3RvcCBwb3NpdGlvbiwgYWxsb3cgZm9yIHRoZSBzZXJ2ZXIgdG8gZmluaXNoIG91ciBjb25uZWN0aW9uIGluc3RlYWQgb2YganVzdCBjYW5jZWxsaW5nCisJICBPdGhlcndpc2Uga2VlcC1hbGl2ZSBkb2VzIG5vdCBtYWtlIG11Y2ggc2Vuc2UgYW5kIGFsc28gdGhlIHNlcnZlciB3aWxsIGhhdmUKKwkgIGNvbmZ1c2luZyB0aGluZ3MgaW4gdGhlIGxvZ3MuCisKKzIwMTQtMDMtMDYgMTI6MjQ6MDEgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBza2lwIHN0cmVhbXMgd2l0aCBzYW1lIGNvbnRyb2wgdXJsCisJICBLZWVwIHRyYWNrIG9mIHdoYXQgc3RyZWFtcyB3ZSBkaWQgdGhlIFNFVFVQIGZvci4gV2Ugb25seSBuZWVkIHRvCisJICBjb25maWd1cmUgY2Fwcywgd2FpdCBmb3IgcGFkcyBhbmQgcHVzaCBldmVudHMgb24gc2V0dXAgc3RyZWFtcy4gV2UgY2FuCisJICByZW1vdmUgdGhlIGRpc2FibGVkIHN0YXRlIG9mIHRoZSBzdHJlYW0gYW5kIHNpbXBsaWZ5IHNvbWUgY2hlY2tzLgorCSAgQWZ0ZXIgd2Ugc2V0dXAgYSBzdHJlYW0sIHNraXAgdGhlIG90aGVyIHN0cmVhbXMgdGhhdCBoYXZlIHRoZSBzYW1lCisJICBjb250cm9sIHVybC4gVXNlIGEgc2tpcHBlZCBmbGFnIHRvIG1hcmsgc3RyZWFtcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkLgorCisyMDE0LTAzLTA2IDEyOjIyOjQ3ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcmVtb3ZlIG9ic29sZXRlIGNvZGUKKworMjAxNC0wMy0wNSAxNjoxOToxOSArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IGp1c3QgdXNlIHRoZSBTRFAgaW5kZXggYXMgdGhlIHN0cmVhbSBpZAorCSAgVXNlIHRoZSBpbmRleCBvZiB0aGUgbWVkaWEgc3RyZWFtIGluIHRoZSBTRFAgYXMgdGhlIHN0cmVhbSBpZCBpbnN0ZWFkIG9mCisJICBrZWVwaW5nIGEgc2VwYXJhdGUgY291bnRlci4KKworMjAxNC0wMy0wNSAxMzozNToxOSArMDEwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlbzogZml4IGJ1aWxkIG9uIE1hYyBPU1ggTWF2ZXJpY2tzIGFuZCBwdXQgbmV3IHdpbmRvdyBpbiBmcm9udAorCSAgR2V0Q3VycmVudFByb2Nlc3MvU2V0RnJvbnRQcm9jZXNzL1RyYW5zZm9ybVByb2Nlc3NUeXBlIHdhcyBkZXByZWNhdGVkCisJICBhbmQgbm93IHJlbW92ZWQgaW4gTWFjIE9TWCAxMC45LiBvcmRlckZyb250UmVnYXJkbGVzcyBpcyB1c2VkIHRvIG1ha2UKKwkgIHRoZSB2aWRlbyB3aW5kb3cgdGhlIG1vc3QgZnJvbnQgd2luZG93LgorCisyMDE0LTAzLTA1IDE3OjMzOjU2ICswMTAwICBDaHJpc3RpYW4gRnJlZHJpayBLYWxhZ2VyIFNjaGFsbGVyIDx1cmFldXNAbGludXhyaXNpbmcub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBBZGQgZG9jcyBkaXJlY3RvcnkgdG8gc3BlYyBmaWxlCisKKzIwMTQtMDMtMDUgMTU6NDQ6MjUgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBoYW5kbGUgTlVMTCBjb250cm9sIHVybHMgYmV0dGVyCisKKzIwMTQtMDMtMDUgMTQ6Mjg6MjYgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBzbWFsbCBjbGVhbnVwcworCSAgSXQncyBuaWNlciB0byBleHBsaWNpdGx5IGNoZWNrIGZvciBOVUxMIG9uIHBvaW50ZXIgdHlwZXMgdG8gbWFrZSBpdAorCSAgY2xlYXIgdGhhdCBpdCdzIGEgcG9pbnRlciBhbmQgbm90IGEgYm9vbGVhbi4KKworMjAxNC0wMy0wNSAxNDoyNjowMiArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IGhhbmRsZSB1bmtub3duIFNTUkMgaW4gRklSCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI1NzEyCisKKzIwMTQtMDMtMDUgMTE6Mzk6MDkgKzAxMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggc2Vla2luZworCSAgQ2FsbCBnc3RfcnRzcHNyY19jb25uZWN0aW9uX2ZsdXNoIChzcmMsIEZBTFNFKSB0byByZXNldCBjb25uZWN0aW9ucyBhcworCSAgbm9uLWZsdXNoaW5nIGJlZm9yZSBzZW5kaW5nIFBBVVNFIGFuZCBQTEFZIHdpdGggdGhlIG5ldyBucHQgcmFuZ2UuIFdpdGhvdXQgdGhpcworCSAgcGF0Y2gsIHRob3NlIGNvbW1hbmRzIHdvdWxkIGZhaWwgd2l0aCBFSU5UUiBhcyB0aGUgY29ubmVjdGlvbnMgd2VyZSBzdGlsbAorCSAgZmx1c2hpbmcuCisKKzIwMTQtMDMtMDMgMTY6Mzk6MjYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogZXhwb3NlIHhzdWIgYXMgYSBzdWJ0aXRsZSBpbnN0ZWFkIG9mIGFzIGEgdmlkZW8KKwkgIEl0IGlzIHBsYWNlZCBpbnNpZGUgYSAndmlkcycgc3RydWN0LCBzbyBpdCB3YXMgYmVpbmcgZXhwb3NlZCBvbgorCSAgYSBwYWQgbmFtZWQgdmlkZW9fJWQuIFhTVUIgYXJlIHN1YnRpdGxlcyBhbmQgdGhpcyBwYXRjaCBhZGRzCisJICBhbiBzcGVjaWFsIGNhc2UgZm9yIGl0IHRvIGJlIGV4cG9zZWQgaW4gYSBzdWJwaWN0dXJlXyVkIHBhZAorCisyMDE0LTAzLTAzIDE2OjM4OjQ1IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGRvIG5vdCB0cnkgdG8gYWRkIGEgdGFnIHdpdGggdGFnX25hbWUgc2V0IHRvIE5VTEwKKwkgIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGVyZSBhcmUgc3VidGl0bGVzIGluIHRoZSBzdHJlYW0sIGxlYWRpbmcgdG8KKwkgIGFuIGFzc2VydGlvbgorCisyMDE0LTAzLTA0IDE2OjQwOjM0ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogQWRkIHN1cHBvcnQgZm9yIG11bHRpcGxlIHBheWxvYWQgdHlwZXMKKwkgIEEgbWVkaWEgc3RyZWFtIGNhbiBoYXZlIG11bHRpcGxlIHBheWxvYWQgdHlwZXMuIFBhcnNlIGFsbCB0aGUgcGF5bG9hZAorCSAgdHlwZXMgYW5kIGNvbGxlY3QgdGhlIGNhcHMgaW5mb3JtYXRpb24uIFdlIHRoZW4gaGF2ZSB0byBzdG9yZSB0aGUKKwkgIHB0PC0+Y2FwcyBtYXBwaW5nIGluc3RlYWQgb2YgMSBwdCBhbmQgMSBjYXBzLgorCSAgUGFyc2UgdGhlIHByb2ZpbGUgZnJvbSB0aGUgU0RQIGFuZCB1c2UgdGhhdCB0byBuZWdvdGlhdGUgdGhlIHRyYW5zcG9ydAorCSAgaW5zdGVhZCBvZiBhbHdheXMgdXNpbmcgQVZQLgorCSAgUmV3b3JrIGhvdyB3ZSBkbyBzb21lIHR3ZWFrcyBmb3IgQVNGIGFuZCBSZWFsbWVkaWEuCisKKzIwMTQtMDMtMDQgMTE6MzQ6MzkgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiByZWZhY3RvciBwYXlsb2FkIGhhbmRsaW5nCisKKzIwMTQtMDMtMDMgMTE6MzQ6MDAgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogZml4IGJ1ZmZlciBsZXZlbCB3aXRoIGludmFsaWQgRFRTCisJICBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBEVFMgaXMgaW52YWxpZCAod2hlbiB3ZSByZWNlaXZlIFJUUCBwYWNrZXRzIGZyb20KKwkgIFRDUCwgZm9yIGV4YW1wbGUpLiBBcyBhIGZhbGxiYWNrLCB1c2UgdGhlIHJlY29uc3RydWN0ZWQgUFRTIHZhbHVlIHRvCisJICBjYWxjdWxhdGUgdGhlIGJ1ZmZlciBsZXZlbC4KKworMjAxNC0wMy0wMiAwNToxMDoxMyArMDEwMCAgU2ViYXN0aWFuIFJhc211c3NlbiA8c2VicmFzQGhvdG1haWwuY29tPgorCisJKiAuZ2l0aWdub3JlOgorCSAgLmdpdGlnbm9yZTogSWdub3JlIGdjb3YgaW50ZXJtZWRpYXRlIGZpbGVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI1NDgwCisKKzIwMTQtMDItMjggMDk6MzQ6NDYgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBmZTE2NzJlIHRvIGJjYjE1MTgKKworMjAxNC0wMi0yNyAyMzoxNTowNCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIFJldmVydCAiYWFjcGFyc2U6IHB1dCBjb2RlYyBkYXRhIG9uIGNhcHMgZm9yIGxvYXMgZm9ybWF0IgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCBlNDU5Y2YzZTAxYTA4ZjFhM2VmMWZiOTU0YTQxY2ZhMzZiM2U1MTBjLgorCSAgVGhpcyB3YXMgcHVzaGVkIGJ5IGFjY2lkZW50LCB0aGUgYnVnIHNob3VsZCBsaWtlbHkgYmUgZml4ZWQgaW4KKwkgIGxpYmF2IGh0dHBzOi8vYnVnemlsbGEubGliYXYub3JnL3Nob3dfYnVnLmNnaT9pZD02NDQKKworMjAxNC0wMi0yNyAxODo1NTowNCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IG1hcmsgYWxsIHBhcnNlZCBmcmFtZXMgYXMgc3luYyBwb2ludHMKKwkgIGFsbCBqcGVnIGZyYW1lcyBhcmUgc3luYyBwb2ludHMsIHNvIG1hcmsgdGhlbSBhcyBzdWNoIHNvCisJICByZXZlcnNlIHBsYXliYWNrIGNhbiBwcm9wZXJseSB3b3JrIHdpdGggdGhlIHZpZGVvIGRlY29kZXIKKwkgIGJhc2UgY2xhc3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjUxMDQKKworMjAxNC0wMi0yNSAwMToxMjowNSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBwdXQgY29kZWMgZGF0YSBvbiBjYXBzIGZvciBsb2FzIGZvcm1hdAorCSAgZ3N0LWxpYmF2IGF1ZGlvIGRlY29kZXIgYWxzbyBuZWVkcyBjb2RlYyBkYXRhIGZvciBMT0FTIGZvcm1hdCwgb3RoZXJ3aXNlCisJICBpdCB3aWxsIGNvbXBsYWluIGFib3V0IG5vdCBoYXZpbmcgYSBkZWNvZGVyIGNvbmZpZyBhbmQgc2tpcCBhbGwgcGFja2V0cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU5Njc3MgorCisyMDE0LTAyLTI3IDAwOjQzOjQ4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGFsaWduIHJhdyBhdWRpbyBtZW1vcnkgdG8gcG93ZXJzIG9mIHR3bworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNTAwOAorCisyMDE0LTAyLTI3IDAwOjM3OjIwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGNhbGN1bGF0ZSBhbGlnbm1lbnQgcHJvcGVybHkgZm9yIGF1ZGlvIGRlcHRocyBub3QgYSBtdWx0aXBsZSBvZiA4CisKKzIwMTQtMDItMjMgMTk6MDk6MjQgKzAxMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogZml4IGNyYXNoIHdpdGggMjQtYml0IHJhdyBhdWRpbworCSAgRG8gbm90IHRyeSB0byBhbGlnbiBhdWRpbyBidWZmZXJzIHRvIG9kZCBudW1iZXJzLAorCSAgd2hpY2ggd2lsbCBnZXQgdXMgYSBOVUxMIGJ1ZmZlciB3aGljaCB3ZSB0aGVuCisJICBjcmFzaCBvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjUwMDgKKworMjAxNC0wMi0yNyAwMDoxMTo0MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJICBydHBtYW5hZ2VyOiByZS1lbmFibGUgLVdlcnJvcgorCisyMDE0LTAyLTI3IDAwOjExOjExICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogZml4IGNvbXBpbGVyIHdhcm5pbmcKKwkgIGdzdHJ0cGppdHRlcmJ1ZmZlci5jOiBJbiBmdW5jdGlvbiAnZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3AnOgorCSAgZ3N0cnRwaml0dGVyYnVmZmVyLmM6Mjk3ODozOiBlcnJvcjogJ3Jlc3VsdCcgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZCBpbiB0aGlzIGZ1bmN0aW9uCisJICB3aGlsZSAocmVzdWx0ID09IEdTVF9GTE9XX09LKTsKKwkgIF4KKworMjAxNC0wMi0yNiAyMjoxMTo0MSArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDFhMDdkYTkgdG8gZmUxNjcyZQorCisyMDE0LTAyLTI2IDIxOjExOjIzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogRml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgY29tcGlsZXIgd2FybmluZworCisyMDE0LTAyLTI2IDA3OjMyOjMyIC0wNTAwICBKYWtlIEZveXRpayA8amFrZS5mb3l0aWtAaXBjb25maWd1cmUuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogUmVtb3ZlIHJhdyBjb21wYXJpc29ucyBvZiBSVFAgc2VxdWVuY2UgbnVtYmVycworCSAgU2V2ZXJhbCBjb25kaXRpb25hbCBzdGF0ZW1lbnRzIHBlcmZvcm0gY29tcGFyaXNvbiBvbiBSVFAgc2VxdWVuY2UKKwkgIG51bWJlcnMgd2l0aG91dCB0YWtpbmcgdGhlIHNlcXVlbmNlIG51bWJlciByb2xsb3ZlciBpbnRvIGFjY291bnQuCisJICBJbnN0ZWFkLCB1c2UgdGhlIGdzdF9ydHBfYnVmZmVyX2NvbXBhcmVfc2VxbnVtIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlCisJICBjb21wYXJpc29uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNTE1OQorCisyMDE0LTAyLTAzIDAxOjQ0OjIxICswMTAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJyYXNAaG90bWFpbC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IERvbid0IGJ1aWxkIGRpc2FibGVkIHBsdWdpbnMnIGNoZWNrIHRlc3RzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIzNTAyCisKKzIwMTQtMDItMjYgMTE6Mjk6NDUgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGRvY3MvTWFrZWZpbGUuYW06CisJICBkb2NzOiBpbnN0YWxsIHByZWJ1aWx0IHBsdWdpbiBkb2NzIGlmIGd0ay1kb2MgaXMgZGlzYWJsZWQKKwkgIFN5bmMgdG8gdGhlIE1ha2VmaWxlLmFtIGZyb20gZ3N0LXBsdWdpbi1iYXNlIHdoZXJlIGl0IGlzIGRvbmUgcmlnaHQuCisJICBGaXhlcyAjNzI1MDM0CisKKzIwMTQtMDItMjUgMTY6MTA6NTQgLTA1MDAgIEh1Z3VlcyBGcnVjaGV0IDxodWd1ZXMuZnJ1Y2hldEBzdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IGRvIG5vdCBlbWl0ICJwYXJzZWQiIGNhcHMgZm9yIHZwOAorCSAgVlA4IGRvZXNuJ3QgcmVxdWlyZSBwYXJzaW5nICh2cDhwYXJzZSBkb2Vzbid0IGV4aXN0LCBzbyBuZWdvdGlhdGlvbiB3aXRoIGRlbXV4IGZhaWxzCisJICBpZiAicGFyc2VkIiBpcyBzZXQgaW4gY2FwcykuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI0NjM2CisKKzIwMTQtMDItMTEgMTY6Mjc6MDggLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogRG9uJ3QgcmVxdWlyZSBwYXJzZXIgZm9yIFZQOAorCSAgVW50aWwgR1N0cmVhbWVyIGhhcyBvbmUgKHNlZSBidWc3MjI3NjApLCB3ZSBzaG91bGQgbm90IHJlcXVpcmUgYSBwYXJzZXIgZm9yIFZQOC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIxMjgKKworMjAxNC0wMi0xMCAxNzowODoyNSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBDQVBUVVJFX01QTEFORSBpcyB3ZWxsIHRlc3RlZCBub3cKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIxMjgKKworMjAxMy0xMi0xOCAwOTo1NjozNSArMDEwMCAgQmVuamFtaW4gR2FpZ25hcmQgPGJlbmphbWluLmdhaWduYXJkQGxpbmFyby5vcmc+CisKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmg6CisJICB2NGwydmlkZW9kZWM6IENyZWF0ZSBvbmUgZWxlbWVudCBwZXIgZGV2aWNlCisJICBGb3IgZWFjaCB2aWRlb0NkZXZpY2UgcHJvYmUgaXQgaW5wdXQvb3V0cHV0IGNhcGFiaWxpdGllcworCSAgaWYgaXQgbWF0Y2ggd2l0aCB2aWRlbyBkZWNvZGVyIHJlcXVpcmVtZW50IHJlZ2lzdGVyIGEgbmV3IGVsZW1lbnQuCisJICBTaWduZWQtb2ZmLWJ5OiBCZW5qYW1pbiBHYWlnbmFyZCA8YmVuamFtaW4uZ2FpZ25hcmRAbGluYXJvLm9yZz4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIxMjgKKworMjAxMy0xMi0xOSAxNToyNjo1MiAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYzoKKwkgIHY0bDJ2aWRlb2RlYzogQ2FsY3VsYXRlIGxhdGVuY3kgZnJvbSBkZXZpY2UgaW5mb3JtYXRpb24KKwkgIERlY29kZXJzIG9yIG90aGVyIGRldmljZXMgdGhhdCBleHBvc2UgYSBtaW5pbXVtIGJ1ZmZlcnMgcmVxdWlyZWQgcHJvZHVjZQorCSAgYW4gZmlyc3Qgb3V0cHV0LiBXZSB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBjYWxjdWxhdGUgbGF0ZW5jeS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIxMjgKKworMjAxMy0xMS0yOCAxNzoxNDoxOCAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwydmlkZW9kZWM6IEltcGxlbWVudCB2NGwydmlkZW9kZWMKKwkgIEltcGxlbWVudCBhbiBlbGVtZW50IHRoYXQgY2FuIGRyaXZlciBWNEwyIE0yTSBkZWNvZGVyIGRldmljZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIxMjgKKworMjAxNC0wMi0xMSAxMjo0MToyOSArMDEwMCAgR8O2cmFuIErDtm5zc29uIDxnb3JhbmpuQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IG9ubHkgdXBkYXRlIGxhc3Rfc3BzcHBzIHRpbWUgaWYgYWxsIHNwcy9wcHMgZ290IHNlbnQgc3VjY2Vzc2Z1bGx5CisJICBUaGlzIGZpeGVzIGFuIGlzc3VlIHdpdGggZ3N0LXJ0c3Atc2VydmVyIHdoZXJlIG5vIHNwcyBhbmQgcHBzIGFyZQorCSAgc2VudCBmb3IgdGhlIGZpcnN0IGludHJhIGZyYW1lLCBiZWNhdXNlIHRoZSBwYXlsb2FkZXIgc3RhcnRzIHdvcmtpbmcKKwkgIGFscmVhZHkgd2hlbiByZWNlaXZpbmcgREVTQ1JJQkUgYnV0IHRoZXJlIGlzIG5vIHRyYW5zcG9ydHMgc28gaXQgdHJpZXMKKwkgIHRvIHNlbmQgc3BzIGFuZCBwcHMsIGJ1dCB0aGF0IGZhaWxzIHdpdGggYSBGTFVTSElORyBmbG93LiBCdXQgdGhlIHRpbWUKKwkgIGZvciBsYXN0IHNlbnQgc3BzIGFuZCBwcHMgd291bGQgc3RpbGwgYmUgc2V0LCBzbyB3aGVuIFBMQVkgYXJyaXZlcyBhbmQKKwkgIHRoZSBmaXJzdCBpbnRyYSBmcmFtZSBpcyB0byBiZSBzZW50IHRoZXJlIGlzIG5vIHNwcyBhbmQgcHBzIHNlbnQgZHVlIHRvCisJICB0aGF0IHRpbWUgc2luY2UgbGFzdCBzcHMgcHBzIGlzIGxlc3MgdGhhbiBzcHNwcHNfaW50ZXJ2YWwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI0MjEzCisKKzIwMTQtMDItMjUgMDk6MDA6NDUgKzAxMDAgIFNhbnRpYWdvIENhcm90LU5lbWVzaW8gPHNhbmNhbmVAZ21haWwuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBGaXggZGVhZGxvY2sgd2hlbiB0YXNrIGNyZWF0aW9uIGlzIG5vIHN1Y2Nlc3NmdWwKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjUxMjQKKworMjAxNC0wMi0yMiAyMDoxOTo0OSArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2RldGVjdC5jOgorCSAgYXV0b2RldGVjdDogZGVtb3RlIGNhbmRpZGF0ZSBlcnJvciB0byB3YXJuaW5nIGFuZCBwbHVnIGZha2V7c2luayxzcmN9CisJICBJbiB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIG5vIHN1aXRhYmxlIGNhbmRpZGF0ZSB3ZSBwb3N0IGEgd2FybmluZyBhbmQgcGx1ZyBhCisJICBmYWtlLWVsZW1lbnQuIERvIHRoZSBzYW1lIHdoZW4gbm9uIG9mIHRoZSBjYW5kaWRhdGUgd29yay4KKwkgIFRoaXMgaXMgbW9yZSBjb25zaXN0ZW50IGFuZCBwbHVnaW4gdGhlIGZha2VzaW5rIGFzIGEgZmFsbGJhY2sgaXMgcHJvYmFibHkKKwkgIGhlbHBmdWwgZm9yIHJ1bm5pbmcgdW5pdCB0ZXN0cyB3aXRob3V0IHJlcXVpcmluZyBoYXJkd2FyZSBzcmMvc2luayBlbGVtZW50cy4KKwkgIEZpeGVzICM3MjI5ODEKKworMjAxNC0wMi0yMyAxMjozNDo0OCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDI6IG1ha2Ugc29tZSBtb3JlIGNvbnRyb2xzIGNvbmZpZ3VyYWJsZQorCSAgLi4uIGF0IGxlYXN0IGlmIG9uZSB0cmllcyBoYXJkIGVub3VnaCB1c2luZyBleHRyYS1jb250cm9scyBwcm9wZXJ0eS4KKworMjAxNC0wMi0yMyAxMDozOToyMCArMDEwMCAgRGFuIEtlZ2VsIDxkYW5rQGtlZ2VsLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgdjRsMjogUmVxdWlyZSBtcGxhbmFyIHN1cHBvcnQgZm9yIG5vdyBpbiBjb25maWd1cmUKKwkgIFRoZSBjb2RlIGZhaWxzIHRvIGNvbXBpbGUgd2l0aG91dCBjdXJyZW50bHksIHNlZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMzQ0NgorCSAgSXQncyBiZXR0ZXIgdG8gZGlzYWJsZSBpdCBpbnN0ZWFkIG9mIGZhaWxpbmcgY29tcGlsYXRpb24KKwkgIHVudGlsIHRoaXMgaXMgZml4ZWQgcHJvcGVybHkuCisKKzIwMTQtMDItMjMgMDA6MTQ6MDQgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jOgorCSAgamFjazogYWRkIHNvbWUgc2ltcGxlIGxvZyBoYW5kbGVycyBmb3IgamFjaworCSAgQWRkIGxvZyBoYW5kbGVycyBmb3IgamFjayB0aGF0IHdyaXRlIHRvIHRoZSBnc3QgZGVidWcgbG9nLiBUaGlzIGF2b2lkcyBzcGFtbWluZworCSAgdGhlIGNvbnNvbGUgd2hlbiBlLmcuIHVzaW5nIGF1dG9hdWRpb3NpbmssIGhhdmluZyB0aGUgamFjayBlbGVtZW50cyBpbnN0YWxsZWQsCisJICBidXQgbm90IHJ1bm5pbmcgamFjay4KKworMjAxNC0wMi0yMiAyMTozMToyMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyc3JjOiBoYW5kbGUgb2xkIGFuZCBvZGQgZHJpdmVyIGJlaGF2aW91ciB3aGVuIGxpc3RpbmcgY29udHJvbHMKKworMjAxMy0xMS0yOCAxNjo1NDo1OCAtMDgwMCAgRGFycnlsIEdhbXJvdGggPGRnYW1yb3RoQHV2aWMuY2E+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlaWlyZmlsdGVyLmM6CisJICBhdWRpb2Z4YmFzZWlpcmZpbHRlcjogY2hlY2sgaWYgY29lZmZpY2llbnRzIGFyZSBwcm92aWRlZCBpbnNpZGUgZmlsdGVyIGxvY2sKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTk1MjQKKworMjAxNC0wMi0yMSAxOTo0Njo0NCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJzcmM6IGFsc28gdW5zZXQgSU5URVJMQUNFRCBmbGFnIG9uIGJ1ZmZlcnMgaWYgZnJhbWUgaXMgbm90IGludGVybGFjZWQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjQ4OTkKKworMjAxNC0wMi0yMSAxNDozMTo1OSArMDAwMCAgU2ltb24gRmFybnN3b3J0aCA8c2ltb24uZmFybnN3b3J0aEBvbmVsYW4uY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyc3JjOiBGbGFnIGludGVybGFjZWQgYnVmZmVycyBhcyBpbnRlcmxhY2VkLgorCSAgV2UgY29ycmVjdGx5IGluZGljYXRlIHRoZSBmaWVsZCBvcmRlcmluZyBvbiBpbnRlcmxhY2VkIGJ1ZmZlcnMsIGJ1dCBmYWlsIHRvCisJICBmbGFnIHRoZW0gYXMgY29udGFpbmluZyBpbnRlcmxhY2VkIHZpZGVvLCB3aGljaCB3ZSBuZWVkIHRvIGRvIGhlcmUgYmVjYXVzZQorCSAgd2Ugc2lnbmFsIGludGVybGFjZS1tb2RlPW1peGVkIGluIG91ciBjYXBzLiBUaGlzIG1lYW5zIHRoYXQgZG93bnN0cmVhbQorCSAgZWxlbWVudHMgKGxpa2UgdmFhcGlwb3N0cHJvYyBmcm9tIGdzdHJlYW1lci12YWFwaSkgZG9uJ3QgcmVjb2duaXNlIHRoZXNlCisJICBidWZmZXJzIGFzIGluIG5lZWQgb2YgZGVpbnRlcmxhY2luZy4KKwkgIEZpeCB0aGlzIGJ5IHNldHRpbmcgdGhlIGludGVybGFjZWQgZmxhZyBvbiBhbGwgaW50ZXJsYWNlZCBidWZmZXJzLgorCSAgU2lnbmVkLW9mZi1ieTogU2ltb24gRmFybnN3b3J0aCA8c2ltb24uZmFybnN3b3J0aEBvbmVsYW4uY28udWs+CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI0ODk5CisKKzIwMTQtMDItMTkgMTM6NTY6MzcgLTAzMDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHIudmVyZGVqb0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogYmUgbW9yZSBzdHJpY3QgYXQgQURUUyBoZWFkZXIgcGFyc2luZworCSAgQWRkcyB0d28gZXh0cmEgY2hlY2tzOgorCSAgLSBTYW1wbGluZyBmcmVxdWVuY3kgb24gaGVhZGVyIGNhbid0IGJlIDE1LgorCSAgLSBGcmFtZSBzaXplIHNob3VsZCBiZSBhdCBsZWFzdCA5IG9yIDcsIGRlcGVuZGluZworCSAgb24gd2hldGhlciBDUkMgcHJvdGVjdGlvbiBpcyBwcmVzZW50LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNDYzOAorCisyMDE0LTAyLTE5IDEzOjM1OjU5IC0wMzAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyLnZlcmRlam9Ac2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IG1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBBRFRTIGRhdGEKKwkgIFdlIG5lZWQgYXQgbGVhc3QgNiBieXRlcyB0byBwYXNzIG92ZXIgdG8gX2dldF9mcmFtZV9sZW4oKQorCSAgYnV0IHdlIHdlcmUganVzdCBjaGVja2luZyBmb3IgYSBtaW5pbXVtIG9mIDIgYnl0ZXMgZm9yIHRoZQorCSAgc3luY3dvcmQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI0NjM4CisKKzIwMTQtMDItMjAgMjI6NTI6NTcgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuaDoKKwkgIGF1dG9kZXRlY3Q6IGNoZWNrIGlmIHRoZSBraWQgaGFzIGEgc3luYyBwcm9wZXJ0eQorCSAgcHJldmlvdXNseSBhdXRvdmlkZW9zcmMgZGlkIG5vdCBoYXZlIGEgc3luYyBwcm9wZXJ0eSBhbmQgdjRsMnNyYyBoYXMgbm9uZSBlaXRoZXIuCisKKzIwMTQtMDItMTkgMjE6NTU6NTIgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuaDoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmg6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvZGV0ZWN0LmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvZGV0ZWN0Lmg6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmg6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5oOgorCSAgYXV0b2RldGVjdDogdXNlIGEgY29tbW9uIGJhc2VjbGFzcworCSAgVGhpcyBtYWtlcyB0aGUgYWN0dWFsIGVsZW1lbnRzIHN1cGVyIHNpbXBsZS4gV2UncmUgdXNpbmcgdGhlIEVMRU1FTlRfRkxBRyB0bworCSAgY29uZmlndXJlIHNvdXJjZS9zaW5rIGFuZCBhIHN0cmluZyBmb3IgdGhlIEF1ZGlvL1ZpZGVvIHR5cGUuCisKKzIwMTQtMDItMTQgMTc6MTQ6NDIgLTA4MDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdcOpIDxhbGVpeEBvYmxvbmcuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBhZGQgdGxzLWRhdGFiYXNlIHByb3BlcnR5CisJICBBZGQgc3VwcG9ydCBmb3IgYSBuZXcgcHJvcGVydHk6IHRscy1kYXRhYmFzZS4gSWYgdGhlIHByb3BlcnR5IGlzIHNldCwKKwkgIHRoZSBjZXJ0aWZpY2F0ZSBkYXRhYmFzZSB3aWxsIGJlIGdpdmVuIHRvIHRoZSBydHNwIGNvbm5lY3Rpb24gaWYgVExTCisJICBwcm90b2NvbCBpcyBiZWluZyB1c2VkLiBJZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlIGNhbid0IGJlIHZlcmlmaWVkIHdpdGgKKwkgIHRoZSBkZWZhdWx0IGRhdGFiYXNlLCB0aGlzIGFkZGl0aW9uYWwgZGF0YWJhc2Ugd2lsbCBiZSB1c2VkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyNDM5NgorCisyMDE0LTAyLTE5IDIyOjIxOjU0ICswMTAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9yaW5nYnVmZmVyLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJICBvc3hhdWRpbzogcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMKKworMjAxNC0wMi0xOSAyMToyNjowMyArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvZGV0ZWN0LmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvZGV0ZWN0Lmg6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkgIGF1dG9kZXRlY3Q6IGV4dHJhY3QgY29tbW9uIGhlbHBlciBjb2RlCisJICBUaGUgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIHByZXR0eSBuYW1lcyBpcyBiYXNpY2FsbHkgdGhlIHNhbWUuIFVzZSBvbmUgYW5kIGFkZAorCSAgYSBwYXJhbWV0ZXIuCisKKzIwMTQtMDItMTkgMjE6MDE6MzkgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXV0b2RldGVjdC5jOgorCSAgYXV0b2RldGVjdDogaW1wcm92ZSB0aGUgdGVzdHMKKwkgIEFkZCBmYWtlIGF1ZGlvL3ZpZGVvIHNpbmtzLiBQcmV2aW91c2x5IHJ1bm5pbmcgdGhlIHRlc3QgbWlnaHQgYmUgZmxha3kgZHVlIHRvCisJICB0aGUgdXNlIG9mIHJlYWwgZWxlbWVudHMgKGhhcmR3YXJlIGluIHVzZSksIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8gdGVzdCBoZXJlLgorCSAgQWRkIHR3byBtb3JlIHRlc3RzIHRoYXQgY2hlY2sgdGhhdCB0aGUgZmFrZXMgYXJlIGNob3Nlbi4KKworMjAxNC0wMi0xOSAxNToxOTozMCArMDEwMCAgQnJhbmlzbGF2IEthdHJlbmlhayA8YmthdHJlbmlha0BudXZvdGVjaG5vbG9naWVzLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBkbyBub3QgZW1pdCBlcnJvciB3aGVuIGNvbm5lY3Rpb24gd2l0aCB1bmtub3duIHNpemUgZW5kcworCSAgQ29tbWl0IDQ2ZmQxMmFlNWVjNTMyMDBiMTZkZmQ3ZjE3MDQ4ZDZiYzYwZmJmYmMgaW50cm9kdWNlZCBjb25uZWN0aW9uCisJICByZWNvdmVyeS4gQnV0IHdoZW4gc2VydmVyIGRvZXMgbm90IHNwZWNpZnkgY29udGVudC1zaXplLAorCSAgc291cGh0dHBzcmMgdHJpZXMgdG8gcmVjb25uZWN0IGV2ZW4gYWZ0ZXIgcmVndWxhciBlbmQgb2Ygc3RyZWFtLgorCSAgSHR0cCBzZXJ2ZXIgcmVwbGllcyAgd2l0aCBTT1VQX1NUQVRVU19SRVFVRVNURURfUkFOR0VfTk9UX1NBVElTRklBQkxFCisJICBidXQgc291cGh0dHBzcmMgc3RpbGwgZW1pdHMgZXJyb3IgaW5zdGVhZCBvZiBFT1MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI0NzE3CisJICBTaWduZWQtb2ZmLWJ5OiBCcmFuaXNsYXYgS2F0cmVuaWFrIDxia2F0cmVuaWFrQG51dm90ZWNobm9sb2dpZXMuY29tPgorCisyMDE0LTAyLTE5IDExOjI2OjIyICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdXRvZGV0ZWN0LmM6CisJICBhdXRvZGV0ZWN0OiBmaXggdGhlIGRpc2FibGVkIHRlc3QKKwkgIFVzZSBhIHNoYXJlZCBoZWxwZXIgZm9yIGJvdGggdGVzdHMuIEl0IHR1cm5zIG91dCB0aGF0IHRoZSB2YWxncmluZCB2YXJpYW50IGlzCisJICBmaW5lIChtYXliZSBkdWUgdG8gcGlja2luZyB1cCBwdWxzZXNpbmsgdGhvdWdoKS4KKworMjAxNC0wMi0xOSAxMTowNTozNSArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXV0b2RldGVjdC5jOgorCSAgYXV0b2RldGVjdDogcmVtb3ZlIGNydWZ0IGZyb20gdGhlIHRlc3QKKwkgIFJlbW92ZSB0aGUgb2Jzb2xldGUgdmVyc2lvbiBjaGVjayBhbmQgdXNlIHRoZSBpZ25vcmUgbWFjcm8gZm9yIHRoZSBkaXNhYmxlZCB0ZXN0LgorCisyMDE0LTAyLTE4IDIyOjU0OjQ1ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2ZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9paXJmaWx0ZXIuYzoKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBkb2NzOiB1c2UgZG9jYm9vayBtYXJrdXAgZm9yIHhpOmluY2x1ZGUKKwkgIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBjaGFuZ2UgaW4gZ3RrLWRvYy0xLjIwIHdoaWNoIHdyYXBzIHRoZSB8W118IGNvbnRlbnQgaW4KKwkgIENEQVRBIGJyZWFrIHhpOmlubGN1ZGUgZXhhbXBsZXMuIEFzIGluIGEgd2hvbGUgamhidWlsZCBjaGVja291dCB0aGVzZSB3aGVyZQorCSAgdGhlIG9ubHkgNCwgd2UncmUgZml4aW5nIHRoZW0gaW5zdGVhZC4KKworMjAxNC0wMi0xOCAyMjozNTo0NSArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC1kb2MuaDoKKwkgIGlzb21wNG11eDogZml4IGNvcHkgYW5kIHBhc3RlCisJICBUaGlzIGZpeGVzIGRvYyB3YXJuaW5ncy4KKworMjAxNC0wMi0xOCAyMTo0NDoyNCArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2RlYnVndXRpbHMvZ3N0Y2Fwc3NldHRlci5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC1kb2MuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmdhbmFseXNpcy5jOgorCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYzoKKwkgIGRvY3M6IHVzZSB0aGUgZ3RrLWRvYyBzeW50YXggdG8gbGluayB0byBwcm9wZXJ0aWVzCisJICBEb24ndCB1c2UgZG9jYm9vayB1bmxlc3MgbmVlZGVkLiBBbHNvIHN0aXAgb3RoZXIgZG9jYm9vayB0YWdzIGluIHRoZSB0aGUgZmlsZXMgd2UgZml4LgorCisyMDE0LTAyLTE4IDExOjI4OjE4ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGZpeCBjcmFzaCB3aGVuIGdldHRpbmcgdGhlIGN1cnJlbnQtZGV2aWNlIGluIE5VTEwtPlJFQURZCisJICBUaGUgImdvdG8gdW5sb2NrIiBpcyB3cm9uZyBhcyBpbiB0aGlzIGNvZGUgcGF0aCB3ZSBoYXZlbid0IHRha2UgdGhlIGxvY2sgeWV0LgorCSAgRml4ZXMgIzcyNDYxOQorCisyMDE0LTAyLTE0IDIyOjUwOjQ5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBzb3VwOiBXZSBuZWVkIGxpYnNvdXAgPj0gMi40MCBmb3IgcHJvcGVyIHVzYWdlIG9mIHRoZSBjb250ZW50IGRlY29kZXIKKwkgIFByZXZpb3VzIHZlcnNpb25zIGRpZCBub3QgY29uc2lkZXIgb3VyIGNodW5rIGFsbG9jYXRvciBhbmQgYWxsb2NhdGVkCisJICBtZW1vcnkgYnkgdGhlbXNlbHZlcywgd2hpY2ggY2F1c2VkIGNyYXNoZXMgYW5kIGJyb2tlbiBiZWhhdmlvdXIuCisKKzIwMTQtMDItMTQgMTU6Mjc6MjAgLTA1MDAgIFdpbGxpYW0gSm9uIE1jQ2FubiA8d2lsbGlhbS5qb24ubWNjYW5uQGdtYWlsLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICBkb2NzOiBmaXggbWlzbWF0Y2hlZCBwYXJhIHRhZ3MKKwkgIG5ld2VyIGd0a2RvYyBpcyBtb3JlIHNlbnNpdGl2ZSB0byBtaXNtYXRjaGVkIGRvY2Jvb2sgdGFncy4KKwkgIFRoaXMgZml4ZXMgdGhlIGJ1aWxkIGluIG1hc3Rlci4KKworMjAxNC0wMi0xNCAxNTo1OTo0NiArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBhZGQgc3VwcG9ydCBmb3Igc2VyaWFsaXplZCBxdWVyaWVzCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMzg1MAorCisyMDE0LTAyLTE0IDE1OjUzOjU1ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkgIHRlc3RzOiBmaXggdHlwZWNhc3QgdG8gZml4IGNvbXBpbGF0aW9uCisKKzIwMTQtMDItMTQgMTI6MDE6MDAgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBwcm94eSBjYXBzIGFuZCBhbGxvY2F0aW9uIG9uIFJUUCBwYWRzCisJICByZWN2X3J0cF9zaW5rOiBhbGxvdyBwcm94eWluZyBvZiB0aGUgYWxsb2NhdGlvbiBxdWVyeS4KKwkgIHNlbmRfcnRwX3Npbms6IGFsbG93IHByb3h5aW5nIG9mIGNhcHMgYW5kIGFsbG9jYXRpb24uIFRoaXMgYWxsb3dzIHVzIHRvCisJICBxdWVyeSBjYXBzIGRvd25zdHJlYW0gYXMgd2VsbCBhcyBnZXQgYW4gYWxsb2NhdG9yIGZyb20gZG93bnN0cmVhbS4KKwkgIHNlbmRfcnRwX3NyYzogYWxsb3cgcHJveHkgb2YgY2FwcywgdGhpcyBtYWtlcyB0aGUgY2FwcyBxdWVyeSBkbworCSAgdXBzdHJlYW0uCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMzg1MAorCisyMDE0LTAyLTEzIDEyOjI5OjEzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBoYW5kbGUgdGFncyBpbiBtYWMgZW5jb2RpbmcKKwkgIENoZWNrIHRoZSBjaGFyc2V0IGZyb20gKEMpKioqIHRhZ3MgYW5kIHNldCB0aGUgY2hhcnNldAorCSAgdG8gY29udmVydCBmcm9tIE1BQyBlbmNvZGluZyBpZiBzdWl0YWJsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjMxNjYKKworMjAxNC0wMi0xMyAxMjowOToxMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBVc2UgbmV3IGF1dG9tYXRpY19lb3MgQVBJIGZyb20gYmFzZXNyYworCSAgV2Ugd2FudCB0byBub3RpY2Ugb3Vyc2VsdmVzIHRoYXQgd2UncmUgRU9TLiBPdGhlcndpc2Ugd2Ugd2lsbAorCSAgYWx3YXlzIGNhbmNlbCByZXF1ZXN0cyBpbiB0aGUgdmVyeSBlbmQgYW5kIGNvbmZ1c2UgdGhlIHNlcnZlci4uLgorCSAgYW5kIGFsc28gbWFrZSBpdCBpbXBvc3NpYmxlIHRvIHVzZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zLgorCisyMDE0LTAyLTEzIDExOjExOjEzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IENvbnNpc3RlbnRseSB1c2UgaGF2ZV9zaXplIGluc3RlYWQgb2YgY29udGVudF9zaXplIT0wCisKKzIwMTQtMDItMTMgMTA6MzA6MDkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogRnJlZSBleHRyYSBoZWFkZXJzIHdoZW4gZmluYWxpemluZyB0aGUgZWxlbWVudAorCSAgSXQncyBzZXQgYXMgcHJvcGVydHkgYnkgdGhlIGFwcGxpY2F0aW9uLCB3ZSBzaG91bGQgbm90IGp1c3QgcmVzZXQKKwkgIHByb3BlcnRpZXMgd2hlbiBnb2luZyBiYWNrIHRvIFJFQURZLgorCisyMDE0LTAyLTEzIDEwOjI4OjEzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IFByb3Blcmx5IGNsb3NlIHRoZSBzZXNzaW9uIHdoZW4gZ29pbmcgYmFjayB0byBOVUxMCisJICBEb24ndCB3YWl0IGZvciB0aGF0IHVudGlsIHRoZSBlbGVtZW50IGlzIGRpc3Bvc2VkLgorCisyMDEzLTAyLTI4IDEyOjIwOjUyICswMTAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaDoKKwkgIHNvdXBodHRwc3JjOiBhZGQgc3VwcG9ydCBmb3Iga2VlcC1hbGl2ZSBzZXNzaW9ucworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTkyNgorCisyMDE0LTAyLTEyIDEzOjAwOjEzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaDoKKwkgIHNvdXBodHRwc3JjOiBBZGQgImNvbXByZXNzIiBwcm9wZXJ0eSB0byBlbmFibGUvZGlzYWJsZSBhdXRvbWF0aWMgZ3ppcC9kZWZsYXRlIGNvbnRlbnQgZW5jb2RpbmcgaGFuZGxpbmcKKworMjAxNC0wMi0xMiAxMjozOToxMCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBSZXRyeSBjb25uZWN0aW9uIGlmIHdlJ3JlIGZpbmlzaGVkIGJlZm9yZSB0aGUgY29udGVudCBzaXplIG9ubHkgaWYgd2UgYWN0dWFsbHkgaGF2ZSBhIGNvbnRlbnQgc2l6ZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMjE4NQorCisyMDE0LTAyLTEyIDEwOjA4OjUwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwdXRpbHMuYzoKKwkgIHNvdXB1dGlsczogRml4IGNvbXBpbGVyIHdhcm5pbmcKKwkgIGdzdHNvdXB1dGlscy5jOjM1OjI1OiBlcnJvcjogY29tcGFyaXNvbiBvZiBjb25zdGFudCA5IHdpdGggZXhwcmVzc2lvbiBvZiB0eXBlCisJICAnU291cExvZ2dlckxvZ0xldmVsJyBpcyBhbHdheXMgZmFsc2UKKwkgIFstV2Vycm9yLC1XdGF1dG9sb2dpY2FsLWNvbnN0YW50LW91dC1vZi1yYW5nZS1jb21wYXJlXQorCisyMDE0LTAxLTA3IDIzOjAwOjU2IC0wMzAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyLnZlcmRlam9Ac2lzYS5zYW1zdW5nLmNvbT4KKworCSogZXh0L3NvdXAvTWFrZWZpbGUuYW06CisJKiBleHQvc291cC9nc3Rzb3VwLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5oOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJKiBleHQvc291cC9nc3Rzb3VwdXRpbHMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXB1dGlscy5oOgorCSAgc291cGh0dHAqOiBhZGQgYWJpbGl0eSB0byBkbyBIVFRQIHNlc3Npb24gbG9nZ2luZworCSAgVGhpcyBjaGFuZ2VzZXQgYWRkcyB0aGUgbG9nZ2luIGluZnJhc3RydWN0dXJlIGFuZAorCSAgbW9kcyBib3RoIHNvdXBodHRwc3JjIGFuZCBzb3VwaHR0Y2xpZW50c2luayB0byB1c2UgaXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIxNzY0CisKKzIwMTQtMDItMDcgMTQ6MDA6MTUgKzAxMDAgIGRpdmhhZXJlIDxkaXJrLnZhbmhhZXJlbmJvcmdoQHVnZW50LmJlPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thOiBhZGQgc3VwcG9ydCBmb3IgR1JBWTgsIEJHUiBhbmQgUkdCIHZpZGVvIGNvbG91cnNwYWNlcyBpbiBWX1VOQ09NUFJFU1NFRCBjb2RlYworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMzg0OQorCisyMDE0LTAyLTExIDEzOjI1OjQ2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IEFkZCBtYXBwaW5nIGZvciBOT1RfRk9VTkQgYW5kIE5PVF9BVVRIT1JJWkVEIGVycm9ycworCisyMDE0LTAyLTExIDEzOjI1OjIyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IERvbid0IGR1cGxpY2F0ZSBzdGF0dXNfY29kZSB0byBHU3RyZWFtZXIgZXJyb3IgbWFwcGluZworCisyMDE0LTAyLTA5IDIzOjM4OjQ0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZ29vbS9maWx0ZXJzLmM6CisJKiBnc3QvZ29vbTJrMS9maWx0ZXJzLmM6CisJICBnb29tOiBSZW1vdmUgdW51c2VkIGZ1bmN0aW9ucworCisyMDE0LTAyLTA5IDIzOjIxOjIwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thcGFyc2U6IENvbW1lbnQgb3V0IHNvbWUgdW51c2VkIGZ1bmN0aW9ucyB1c2VkIG9ubHkgZnJvbSB0aGUgY29tbWVudGVkIG91dCBwdWxsLW1vZGUgY29kZQorCisyMDE0LTAyLTA4IDIxOjAxOjMyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSAgaWQzdjJtdXg6IEZpeCBhbm90aGVyIGNvbXBpbGVyIHdhcm5pbmcKKworMjAxNC0wMi0wOCAxNzo0MzozMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBGaXggaW1wbGljaXQgZW51bSBjb252ZXJzaW9uIGNvbXBpbGVyIHdhcm5pbmcKKwkgIGVycm9yOiBpbXBsaWNpdCBjb252ZXJzaW9uIGZyb20gZW51bWVyYXRpb24gdHlwZQorCSAgJ1NvdXBTdGF0dXMnIHRvIGRpZmZlcmVudCBlbnVtZXJhdGlvbiB0eXBlICdTb3VwS25vd25TdGF0dXNDb2RlJworCisyMDE0LTAyLTA4IDE3OjQxOjIxICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmM6CisJICBpbnRlcmxlYXZlOiBGaXggdW5pdGlhbGl6ZWQgdmFyaWFibGUgY29tcGlsZXIgd2FybmluZyBpbiB0ZXN0CisJICBlcnJvcjogdmFyaWFibGUgJ21hc2snIGlzIHVzZWQgdW5pbml0aWFsaXplZAorCSAgd2hlbmV2ZXIgJ2lmJyBjb25kaXRpb24gaXMgZmFsc2UgWy1XZXJyb3IsLVdzb21ldGltZXMtdW5pbml0aWFsaXplZF0KKworMjAxNC0wMi0wOCAxNzoyNzo1MSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkgIGlkM3YybXV4OiBGaXggdW5pdGlhbGl6ZWQgdmFyaWFibGUgY29tcGlsZXIgd2FybmluZworCSAgZXJyb3I6IHZhcmlhYmxlICdpbWFnZV90eXBlJyBpcyB1c2VkIHVuaW5pdGlhbGl6ZWQKKwkgIHdoZW5ldmVyICdpZicgY29uZGl0aW9uIGlzIGZhbHNlIFstV2Vycm9yLC1Xc29tZXRpbWVzLXVuaW5pdGlhbGl6ZWRdCisKKzIwMTQtMDItMDggMTc6MjU6MjcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3M0L29zczQtYXVkaW8uaDoKKwkgIG9zczQ6IEZpeCB0eXBvIGluIGhlYWRlciBpbmNsdWRlIGd1YXJkCisJICBlcnJvcjogJ0dTVF9PU1M0X0FVRElPX0gnIGlzIHVzZWQgYXMgYSBoZWFkZXIgZ3VhcmQgaGVyZSwKKwkgIGZvbGxvd2VkIGJ5ICNkZWZpbmUgb2YgYSBkaWZmZXJlbnQgbWFjcm8gWy1XZXJyb3IsLVdoZWFkZXItZ3VhcmRdCisKKzIwMTQtMDItMDggMTc6MjQ6MDYgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuYzoKKwkgIHJ0cHJ0eHNlbmQ6IEZpeCB1bml0aWFsaXplZCB2YXJpYWJsZSBjb21waWxlciB3YXJuaW5nCisJICB2YXJpYWJsZSAncnR4X3NzcmMnIGlzIHVzZWQgdW5pbml0aWFsaXplZCB3aGVuZXZlcgorCSAgJ2lmJyBjb25kaXRpb24gaXMgZmFsc2UgWy1XZXJyb3IsLVdzb21ldGltZXMtdW5pbml0aWFsaXplZF0KKworMjAxNC0wMi0wOCAxNzoyMToxOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5jOgorCSAgcnRwYWMzZGVwYXk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKworMjAxNC0wMi0wOCAxNzoxOToxOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2ZseC9mbHhfZm10Lmg6CisJICBmbHg6IEZpeCB0eXBvIGluIGhlYWRlciBpbmNsdWRlIGd1YXJkCisJICBlcnJvcjogJ19fR1NUX0ZMWF9GTVRfX0hfXycgaXMgdXNlZCBhcyBhIGhlYWRlciBndWFyZCBoZXJlLAorCSAgZm9sbG93ZWQgYnkgI2RlZmluZSBvZiBhIGRpZmZlcmVudCBtYWNybyBbLVdlcnJvciwtV2hlYWRlci1ndWFyZF0KKworMjAxNC0wMi0wNyAxMDowNzo0MSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiByZW1vdmUgaGF2ZV9kdHMgZmxhZyBmcm9tIHBhZHMKKwkgIEl0IHdhcyB1c2VkIGluIHRoZSBwYXN0IGluIDAuMTAgd2hlbiB0aGVyZSB3YXMgbm8gZXhwbGljaXQgRFRTCisJICBmaWVsZCBpbiBidWZmZXJzLCBub3cgd2UgaGF2ZSBpdCBpbiAxLnggc2VyaWVzIGFuZCB3ZSBjYW4KKwkgIGNoZWNrIGl0IGRpcmVjdGx5IHdpdGggR1NUX0JVRkZFUl9EVFNfSVNfVkFMSUQKKworMjAxNC0wMi0wNyAwMTo0OToyNiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBpbXByb3ZlIHN1cHBvcnQgZm9yIHNwYXJzZSBzdHJlYW1zCisJICBEbyBub3QgdHJ5IHRvIHVzZSBzdWJzZXF1ZW50IGJ1ZmZlciB0aW1lc3RhbXBzIHRvIGNhbGN1bGF0ZQorCSAgc3BhcnNlIHN0cmVhbXMgZHVyYXRpb25zIGJlY2F1c2UgdGhlIHN0cmVhbSBpcyBzcGFyc2UgYW5kCisJICB0aGUgYnVmZmVycyBtaWdodCBub3QgYmUgJ3RpbWUgYWRqYWNlbnQnLiBTbyByZWx5IG9uIHRoZQorCSAgZHVyYXRpb24gYW5kIGdpdmUgdGhlIG9wdGlvbiB0byB0aGUgcGFkIHRvIHByb3ZpZGUKKwkgIGN1c3RvbSAnZW1wdHknIGJ1ZmZlcnMgdG8gcmVwcmVzZW50IHRoZSBnYXBzIGluIHRoZQorCSAgc3RyZWFtLCB0aGlzIGNhbiB2YXJ5IG9uIGhvdyB0aGUgZGF0YSBpcyByZXByZXNlbnRlZC4KKwkgIFJpZ2h0IG5vdywgdGhlIG9ubHkgc3BhcnNlIHN0cmVhbSBzdXBwb3J0ZWQgaXMgdHgzZyBzdWJ0aXRsZXMuCisKKzIwMTQtMDItMDYgMTI6MTU6MjIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogYWRkIHN1cHBvcnQgZm9yIHRleHQveC1yYXcgc3VidGl0bGVzCisJICBBZGRzIGl0IHRvIG1wNG11eCwgcXRtdXggYW5kIGdwcG11eC4KKwkgIEJ1ZmZlcnMgbmVlZCB0byBiZSBwcmVmaXhlZCB3aXRoIDIgYnl0ZXMgZm9yIHRoZSB0ZXh0IGxlbmd0aCBiZWZvcmUKKwkgIGJlaW5nIG11eGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU4MTI5NQorCisyMDE0LTAyLTA2IDEyOjA5OjAxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSogZ3N0L2lzb21wNC9hdG9tcy5oOgorCSogZ3N0L2lzb21wNC9mb3VyY2MuaDoKKwkgIHF0bXV4OiBhZGQgc3VwcG9ydCBmb3IgdGhlIFRYM0cgYXRvbXMKKwkgIEFkZHMgZnVuY3Rpb25zIGZvciBjcmVhdGluZyBhbmQgc2V0dGluZyB2YWx1ZXMgcmVsYXRlZCB0byB0aGUKKwkgIHR4M2cgYXRvbSBmb3IgcmF3IHRleHQgc3VidGl0bGUgc3VwcG9ydC4KKwkgIFFURkYgc3BlYyBoYXMgaW5mb3JtYXRpb24gb24gdGhvc2UgYXRvbXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01ODEyOTUKKworMjAxNC0wMi0wNSAxMDoyNzo1NCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXhtYXAuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXhtYXAuaDoKKwkgIHF0bXV4OiBhZGQgc3VidGl0bGUgc3VwcG9ydCB0byBxdG11eG1hcCBzdHJ1Y3R1cmVzCisJICBhZGRzIGJhc2ljIHN0dWJzIGZvciBzdWJ0aXRsZSBzdXBwb3J0IGFyb3VuZCB0aGUgcXRtdXggYW5kCisJICBxdG11eG1hcCBzdHJ1Y3R1cmVzLiBTdGlsbCBubyByZWFsIHN1YnRpdGxlIGltcGxlbWVudGVkLCBidXQKKwkgIGJhc2ljIGZ1bmN0aW9ucyBpbiBwbGFjZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU4MTI5NQorCisyMDE0LTAxLTIwIDE3OjMxOjE0IC0wMzAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyLnZlcmRlam9Ac2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogZmFjdG9yIG91dCByZWFkIGNvbnRleHQgaW5pdC9yZXNldAorCSAgV2hpbGUgYXQgdGhpcywgbW92ZSBfdHJhY2tfcmVzZXQoKSB0byB0cmFjay1pZHMKKwkgIHNvIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgY29tbW9uIHJlYWQgY29udGV4dAorCSAgcmVzZXQgcm91dGluZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjI3MDUKKworMjAxNC0wMi0wNiAxMjoyMTowNyArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5jOgorCSAgZWZmZWN0djogZml4IGRvYyBzZWN0aW9uIG9mIHJldnR2IGVsZW1lbnQKKworMjAxNC0wMi0wNSAxMjo0Njo1NCArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogc3lzL29zeHZpZGVvL01ha2VmaWxlLmFtOgorCSAgb3N4dmlkZW86IEZpeCBsaWJ0b29sIHVzYWdlCisJICAtLXRhZz1DQyBpcyBuZWVkZWQgZm9yIHN0YXRpYyBidWlsZAorCisyMDE0LTAxLTE2IDExOjI2OjQxICswMDAwICBNYXR0aGlldSBCb3Vyb24gPG1hdHRoaWV1LmJvdXJvbkBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBkbyBub3QgdHJ5IHNldCBkZWludGVybGFjZSBtZXRob2QgaWYgcGFzc3Rocm91Z2ggaXMgZW5hYmxlZAorCSAgRml4ZXMgYW4gaXNzdWUgd2l0aCBwcm9ncmVzc2l2ZSBjb250ZW50IGFuZCB1bnN1cHBvcnRlZCB2aWRlbyBmb3JtYXRzCisJICBmb3IgdGhlIGRlaW50ZXJsYWNlIG1ldGhvZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTk2MzYKKworMjAxNC0wMi0wNCAyMToyNjo1NiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogb3JkZXIgZm9ybWF0IGluIHRlbXBsYXRlIGNhcHMgYnkgcHJlZmVyZW5jZQorCSAgVG8gbWluaW1pc2UgcmlzayBvZiBiYWQgZml4YXRpb24sIHRob3VnaCBhdWRpb2NvbnZlcnQKKwkgIGF0IGxlYXN0IHNob3VsZCBiZSBzbWFydCBlbm91Z2ggdG8gYXZvaWQgaXQuCisKKzIwMTQtMDItMDIgMDk6NTc6MDMgLTA4MDAgIERhbiBLZWdlbCA8ZGFua0BrZWdlbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIHY0bDI6IFJlbW92ZSBvYnNvbGV0ZSBkZWZpbml0aW9uIEdTVF9WNEwyX01JU1NJTkdfQlVGREVDTAorCSAgVGhlIG9ubHkgdXNlIHdhcyByZW1vdmVkIGJ5IDllZGMwYzAzNjVmNzlhYjA3ZmYyZTY1NDYxYzY2OTZlMzkzMWEzZjAKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjM0NDYKKworMjAxNC0wMi0wNCAxMzo0Mzo1NiArMDEwMCAgUmFmYcWCIE11xbx5xYJvIDxnYWx0Z2VuZG9AbzIucGw+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJICBnc3Q6IERvbid0IHVzZSBlbmRpYW5uZXNzLXNwZWNpZmljIFM4IGF1ZGlvIGZvcm1hdAorCSAgSXQgZG9lcyBub3QgZXhpc3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIzMzMxCisKKzIwMTQtMDEtMzEgMTQ6MTc6NTQgKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm9vdmVybGF5LmM6CisJICBjYWlyb292ZXJsYXk6IGFkZCBzdXBwb3J0IGZvciBSR0IxNgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMzI4OQorCisyMDE0LTAxLTMwIDA5OjQzOjUwICswMTAwICBQZXIgeCBKb2hhbnNzb24gPHBlcnhqb2hAYXhpcy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgIG1hdHJvc2thbXV4OiBGaXggY29uc3RhbnRseSBncm93aW5nIHVzZWQgdWlkIGxpc3QKKwkgIE1vdmVzIHRoZSB1c2VkIHVpZCBsaXN0IHRvIHRoZSBjbGFzcyB0byBhdm9pZCBoYXZpbmcgaXQgZ3JvdyBmb3JldmVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMzI2OQorCisyMDE0LTAxLTMwIDEwOjQ0OjA1ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZDQ4YmVkMyB0byAxYTA3ZGE5CisKKzIwMTQtMDEtMjQgMDE6NTI6MDggKzAwMDAgIE1pa2UgU2hlbGRvbiA8ZWxsZW9AZ251Lm9yZz4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogSWdub3JlIEJyb2FkY2FzdCBXYXZlIEZvcm1hdCAoQldGKSB0YWdzIHdoZW4gc2VhcmNoaW5nIGZvciAnZm10JyBjaHVuaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMzEyNQorCisyMDE0LTAxLTI5IDEwOjM3OjUzICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBhdXguYzoKKwkgIGNoZWNrOiBVc2UgZmFrZXNpbmsgc3luYz1UcnVlIGluc3RlYWQgb2YgYW4gYXVkaW8gc2luaworCSAgRW5zdXJlcyB0aGUgdGVzdCBjYW4gcnVuIG9uIHN5c3RlbXMgd2l0aG91dCBhbHNhIChvciBhbnkgYXVkaW8gb3V0cHV0IGZvcgorCSAgdGhhdCBtYXR0ZXIpLCBhbmQgd2lsbCBhdm9pZCBwZW9wbGUgcnVubmluZyBidWlsZCBzbGF2ZXMgd29uZGVyaW5nIHdoYXQKKwkgIHRoZSBoZWxsIHdhcyBiZWVwaW5nIGR1cmluZyB0aGUgbmlnaHQgOikKKworMjAxNC0wMS0yNyAyMDowNTo0MiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJICBhYzNwYXJzZTogY3VzdG9tIGdldF9zaW5rX2NhcHMgaGFuZGxpbmcgZm9yIHByaXZhdGUgc3RyZWFtIGNhcHMKKwkgIC4uLiBub3cgdGhhdCB0aG9zZSBhcmUgdHJhbnNmb3JtZWQgcmF0aGVyIHRoYW4gcGFyc2VkLCBzb21lIHRyYW5zZm9ybWluZworCSAgb2YgY2FwcyBpcyByZXF1aXJlZCBhcyB3ZWxsIHRvIG1ha2UgYXV0by1wbHVnZ2luZyBzdWNjZWVkLgorCisyMDE0LTAxLTI1IDAyOjA2OjAwIC0wNTAwICBSeWFuIExvcnRpZSA8ZGVzcnRAZGVzcnQuY2E+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDI6IGd1YXJkIHVzZSBvZiBFTk9EQVRBIHdpdGggI2lmZGVmCisJICBOb3QgYWxsIHN5c3RlbXMgd2l0aCB2NGwgaGF2ZSBFTk9EQVRBIGRlZmluZWQsIHNvIGNoZWNrIHRoYXQgd2UgaGF2ZSBpdAorCSAgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdXNlIGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMjk1MworCisyMDE0LTAxLTI0IDEyOjM3OjM5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBSZXZlcnQgInJ0c3BzcmM6IFByb3h5IHJ0cGppdHRlcmJ1ZmZlciBkby1yZXRyYW5zbWlzc2lvbiBwcm9wZXJ0eSIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgOWY3YjExMjhiMWYwMGEyYjg3YTIzMmZmODkwODY3NTQ5YWI5NWJhNS4KKwkgIFRoaXMgc2hvdWxkIGJlIGhhbmRsZWQgYXV0b21hdGljYWxseSBiZSBydHNwc3JjIGlmIHRoZSBBVlBGIHByb2ZpbGUKKwkgIGlzIHVzZWQsIGFuZCBtYW51YWwgZW5hYmxpbmcgb2YgaXQgY2FuIGJlIGRvbmUgd2l0aCB0aGUgbmV3LW1hbmFnZXIKKwkgIHNpZ25hbC4KKworMjAxNC0wMS0yNCAxMDoyMToxMSArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGFkZCBzaWduYWwgdG8gbm90aWZ5IG9mIG5ldyBtYW5hZ2VyCisJICBTbyB0aGF0IHlvdSBjYW4gY29uZmlndXJlIGFuZCBjb25uZWN0IHRvIHNpZ25hbHMgb24gdGhlIHJ0cGJpbi4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIyODY2CisKKzIwMTQtMDEtMjMgMTU6MTc6NTggLTA4MDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdcOpIDxhbGVpeEBvYmxvbmcuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBQcm94eSBydHBqaXR0ZXJidWZmZXIgZG8tcmV0cmFuc21pc3Npb24gcHJvcGVydHkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjI4NjYKKworMjAxNC0wMS0yMSAxNzo1Mjo0NCArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBoYW5kbGUgZXhwZWN0ZWQgcGFja2V0IGJlaW5nIGFuIFJUWCBwYWNrZXQKKwkgIElmIHRoZSBleHBlY3RlZCBwYWNrZXQgKGRvX25leHRfc2VxbnVtIGlzIFRSVUUpIGlzIHRoZSBvbmUgd2UgcmVxdWVzdGVkCisJICBmb3IgcmV0cmFubWlzc2lvbiBlYXJsaWVyLCBkbyB0aGUgbG9naWMgdG8gdXBkYXRlIHRoZSByZXRyYW5zbWlzc2lvbgorCSAgc3RhdGlzdGljcyBhcyB3ZWxsIGJlZm9yZSBzZXR0aW5nIHVwIHRoZSB0aW1lcnMgZm9yIHRoZSBuZXh0IGV4cGVjdGVkCisJICBwYWNrZXQuCisJICBBbHNvIHJlc2V0IHRoZSByZXRyYW5zbWlzc2lvbiBjb3VudGVyIGlmIHRoZSB0aW1lciBpcyByZXVzZWQgZm9yIGFub3RoZXIKKwkgIHNlcW51bS4KKworMjAxNC0wMS0yMSAxNTo0ODoyMCArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBhZGQgYSBjYXBzIGFjY3VtdWxhdG9yIGZvciB0aGUgcmVxdWVzdC1wdC1tYXAgc2lnbmFsCisJICBBZGQgYW4gYWNjdW11bGF0b3IgdGhhdCBzdG9wcyB0aGUgc2lnbmFsIGVtaXNzaW9uIGFzIHNvb24gYXMgYSBjYXBzIGhhcworCSAgYmVlbiByZXRyaWV2ZWQuIE90aGVyd2lzZSB0aGUgZGVmYXVsdCBoYW5kbGVyIHdvdWxkIGNvbnRpbnVlIGVtaXR0aW5nCisJICB0aGUgc2lnbmFsIGFuZCBwb3NzaWJseSBvdmVyd3JpdGUgdGhlIHJlc3VsdCB3aXRoIE5VTEwgYWdhaW4uCisKKzIwMTQtMDEtMjEgMTU6MjU6NTQgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmM6CisJICBydHhyZWNlaXZlOiBjb3B5IGZsYWdzIGFuZCB0aW1lc3RhbXBzIGZyb20gb3JpZ2luYWwgYnVmZmVyCisKKzIwMTQtMDEtMjEgMTU6MjQ6NTIgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogaWdub3JlIGludmFsaWQgdGltZXN0YW1wcyBpbiBydHQgY2FsY3VsYXRpb24KKwkgIFdoZW4gdGhlIGlucHV0IGJ1ZmZlciBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgdGltZXN0YW1wLCBkb24ndCB0cnkgdG8KKwkgIGNhbGN1bGF0ZSB0aGUgcm91bmQtdHJpcC10aW1lLgorCisyMDE0LTAxLTE2IDE0OjIzOjEzIC0wMzAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyLnZlcmRlam9Ac2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYXBhcnNlOiBiZXR0ZXIgZGVmYXVsdCBjYXBzIHdoZW4gbm9uZSBzZXQKKwkgIFVzZXMgaW5mb3JtYXRpb24gZ2F0aGVyZWQgZHVyaW5nIEVCTUwgcGFyc2luZyB0bworCSAgZm9yZ2UgYSBtb3JlIHN1aXRhYmxlIHNldCBvZiBjYXBzIGluc3RlYWQgb2YgYmxpbmRseQorCSAgYXNzdW1pbmcgZXZlcnl0aGluZyBpcyB2aWRlby94LW1hdHJvc2thLgorCSAgRm9yIGNvbnNpc3RlbmN5LCBzdHJlYW0gdHlwZSByZXNldCB3YXMgYWRkZWQgdG8KKwkgIG1hdHJvc2thLWRlbXV4IHRvby4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIzMTEKKworMjAxNC0wMS0xNSAxNzoyOTozNSArMDEwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwcnR4LmM6CisJICB0ZXN0czogcnRwcnR4Ojp0ZXN0X3J0eHJlY2VpdmVfZGF0YV9yZWNvbnN0cnVjdGlvbjogcmVtb3ZlIHVzZWxlc3MgY29kZSBmb3IgdHJpZ2dlcmluZyByZXRyYW5zbWlzc2lvbgorCSAgVGhlcmUgaXMgbm8gbmVlZCBhbnltb3JlIHRvIHB1c2ggeWV0IGFub3RoZXIgYnVmZmVyIGluIHJ0eHNlbmQKKwkgIGluIG9yZGVyIHRvIHRyaWdnZXIgdGhlIHByZXZpb3VzbHkgcmVxdWVzdGVkIHJldHJhbnNtaXNzaW9ucworCSAgdG8gYWN0dWFsbHkgaGFwcGVuLgorCisyMDE0LTAxLTE1IDE3OjI3OjE5ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkgIHRlc3RzOiBydHBydHg6OnRlc3RfcnR4cmVjZWl2ZV9kYXRhX3JlY29uc3RydWN0aW9uOiBmaXggcmFjZSBjb25kaXRpb24KKwkgIE5vdyB3aXRoIHJ0cHJ0eHNlbmQgcHVzaGluZyBydHggYnVmZmVycyBmcm9tIGEgZGlmZmVyZW50IHRocmVhZCwKKwkgIHRoaXMgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSByZXN1bHQgb2YgdGhlIHRlc3QgaXMgZGV0ZXJtaW5pc3RpYy4KKwkgIFRoaXMgY29kZSBtYWtlcyB1c2Ugb2YgR3N0Q2hlY2sncyBnbG9iYWwgR011dGV4IGFuZCBHQ29uZCB0aGF0IGFyZQorCSAgYmVpbmcgdXNlZCBpbnNpZGUgR3N0Q2hlY2sncyBzaW5rIHBhZCBjaGFpbigpIGZ1bmN0aW9uIGluIG9yZGVyCisJICB0byBzeW5jaHJvbml6ZSB3aXRoIGl0LgorCisyMDE0LTAxLTE1IDE3OjE3OjU3ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkgIHRlc3RzOiBydHBydHg6OnRlc3RfcnR4c2VuZGVyX3BhY2tldF9yZXRlbnRpb246IGZpeCByYWNlIGNvbmRpdGlvbgorCSAgTm93IHdpdGggcnRwcnR4c2VuZCBwdXNoaW5nIHJ0eCBidWZmZXJzIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkLAorCSAgdGhpcyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIHJlc3VsdCBvZiB0aGUgdGVzdCBpcyBkZXRlcm1pbmlzdGljLgorCSAgVGhpcyBjb2RlIG1ha2VzIHVzZSBvZiBHc3RDaGVjaydzIGdsb2JhbCBHTXV0ZXggYW5kIEdDb25kIHRoYXQgYXJlCisJICBiZWluZyB1c2VkIGluc2lkZSBHc3RDaGVjaydzIHNpbmsgcGFkIGNoYWluKCkgZnVuY3Rpb24gaW4gb3JkZXIKKwkgIHRvIHN5bmNocm9uaXplIHdpdGggaXQuCisKKzIwMTQtMDEtMTUgMTE6MjY6MzMgKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSAgdGVzdHM6IHJ0cHJ0eDo6dGVzdF9wdXNoX2ZvcndhcmRfc2VxOiBmaXggcmFjZSBjb25kaXRpb24KKwkgIE5vdyB3aXRoIHJ0cHJ0eHNlbmQgcHVzaGluZyBydHggYnVmZmVycyBmcm9tIGEgZGlmZmVyZW50IHRocmVhZCwKKwkgIHRoaXMgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSByZXN1bHQgb2YgdGhlIHRlc3QgaXMgZGV0ZXJtaW5pc3RpYy4KKwkgIFRoaXMgY29kZSBtYWtlcyB1c2Ugb2YgR3N0Q2hlY2sncyBnbG9iYWwgR011dGV4IGFuZCBHQ29uZCB0aGF0IGFyZQorCSAgYmVpbmcgdXNlZCBpbnNpZGUgR3N0Q2hlY2sncyBzaW5rIHBhZCBjaGFpbigpIGZ1bmN0aW9uIGluIG9yZGVyCisJICB0byBzeW5jaHJvbml6ZSB3aXRoIGl0LgorCisyMDE0LTAxLTE1IDA5OjQ3OjAzICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkgIHRlc3RzOiBydHBydHg6OnRlc3RfcHVzaF9mb3J3YXJkX3NlcTogZml4IGJ1ZmZlciByZWZjb3VudGluZworCisyMDE0LTAxLTIxIDEzOjQyOjM4ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJICBydHBydHhzZW5kOiBlbnN1cmUgdGhhdCBubyBydHggYnVmZmVycyBhcmUgc2VudCBhZnRlciBFT1MKKwkgIFRvIGRvIHRoYXQsIGVucXVldWUgdGhlIEVPUyBldmVudCB0byBiZSBzZW50IGZyb20gdGhlIHNyY3BhZCB0YXNrCisJICB0aHJlYWQgYW5kIGZsdXNoIHRoZSBxdWV1ZSByaWdodCBhZnRlcndhcmRzLCBzbyB0aGF0IG5vIG1vcmUgcnR4CisJICBidWZmZXJzIGNhbiBiZSBzZW50LCBldmVuIGlmIHRoZXJlIGFyZSBtb3JlIHJlcXVlc3RzIGNvbWluZyBpbi4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIzNzAKKworMjAxNC0wMS0xNSAwOTo0NjoxNCArMDEwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5oOgorCSAgcnRwcnR4c2VuZDogcnVuIGEgbmV3IEdzdFRhc2sgb24gdGhlIHNyYyBwYWQKKwkgIFRoZSByZWFzb24gYmVoaW5kIHRoaXMgaXMgdG8gbWluaW1pemUgdGhlIHJldHJhbnNtaXNzaW9uIGRlbGF5LgorCSAgUHJldmlvdXNseSwgd2hlbiBhIE5BQ0sgd2FzIHJlY2VpdmVkLCBydHBydHhzZW5kIHdvdWxkIHB1dCBhCisJICByZXRyYW5zbWlzc2lvbiBwYWNrZXQgaW4gYSBxdWV1ZSBhbmQgaXQgd291bGQgc2VuZCBpdCBmcm9tIGNoYWluKCksCisJICBpLmUuIG9ubHkgYWZ0ZXIgYSBuZXcgYnVmZmVyIHdvdWxkIGFycml2ZS4KKwkgIFRoaXMgdW5mb3J0dW5hdGVseSB3YXMgY2F1c2luZyBiaWcgZGVsYXlzLCBpbiB0aGUgb3JkZXIgb2YgNjAtMTAwIG1zLAorCSAgd2hpY2ggY2FuIGJlIGNyaXRpY2FsIGZvciB0aGUgcmVjZWl2ZXIgc2lkZS4KKwkgIEJ5IGhhdmluZyBhIHNlcGFyYXRlIEdzdFRhc2sgZm9yIHB1c2hpbmcgYnVmZmVycyBvdXQgb2YgcnR4c2VuZCwKKwkgIHdlIGNhbiBwdXNoIGJ1ZmZlcnMgb3V0IHJpZ2h0IGFmdGVyIHJlY2VpdmluZyB0aGUgZXZlbnQsIHdpdGhvdXQKKwkgIHdhaXRpbmcgZm9yIGNoYWluKCkgdG8gZ2V0IGNhbGxlZC4KKworMjAxNC0wMS0wMyAxNzo0Nzo1NSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmg6CisJICBzaG91dDJzZW5kOiBlcnJvciBvdXQgaWYgbm8gY2FwcyB3ZXJlIHJlY2VpdmVkCisJICBJbnN0ZWFkIG9mIGFzc3VtaW5nIHRoYXQgaW5wdXQgaXMgb2dnLgorCisyMDE0LTAxLTAzIDE3OjMwOjEyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSAgc2hvdXQyc2VuZDogYWNjZXB0IGF1ZGlvL3dlYm0sIGF1ZGlvL29nZyBhbmQgdmlkZW8vb2dnIGFzIHdlbGwKKwkgIFRob3NlIGFyZSBhZHZlcnRpc2VkIGluIHRoZSB0ZW1wbGF0ZSBjYXBzLCBidXQgdGhlCisJICBzZXRjYXBzIGhhbmRsZXIgZGlkbid0IGhhbmRsZSB0aGVtLiBCdXQgdGhlbiBvZ2dtdXgKKwkgIGFuZCBvZ2dwYXJzZSBhdCBsZWFzdCBmb3Igbm93IHN0aWxsIGFsd2F5cyBvdXRwdXQKKwkgIGFwcGxpY2F0aW9uL29nZyBhbnl3YXksIHNvIHRoYXQgd2Fzbid0IGEgcmVhbCBwcm9ibGVtLgorCisyMDE0LTAxLTIwIDEwOjEyOjQ1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5jOgorCSAgcnRwdnA4cGF5OiBEb24ndCBsZWFrIGlucHV0IGJ1ZmZlcnMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjI0MTQKKworMjAxNC0wMS0xOSAxNzo0MDo1NiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiByZXNldCBzb21lIG1vcmUgYXVkaW8gcGFkIGRhdGEgd2hlbiBuZWVkZWQKKworMjAxNC0wMS0xOSAxNzozODo1OSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguaDoKKwkgIGF2aW11eDogd3JpdGUgY29ycmVjdCBibG9ja2FsaWduIGZvciB2YnIgYXVkaW8KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA2NTkKKworMjAxNC0wMS0xNiAxNzozNjoxMiAtMDgwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1w6kgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBkbyBub3QgZHJvcCBzZXJpYWxpemVkIGV2ZW50cyB3aGVuIGxhdGVuY3kgaXMgc2V0CisJICBTZXJpYWxpemVkIGV2ZW50cyBhcmUgbm93IHF1ZXVlZCBpbiB0aGUgaml0dGVyIGJ1ZmZlciwgc28gd2UgZG9uJ3QKKwkgIHdhbnQgdG8gZHJvcCB0aGVtIGV2ZW4gbGF0ZW5jeSBpcyBzZXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIyMzcyCisKKzIwMTMtMTItMTEgMDk6MzY6MjIgKzAxMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBkb24ndCBtYWtlIHRoZSBidWZmZXIgd3JpdGFibGUgdW5sZXNzIGFic29sdXRlbHkgbmVjZXNzYXJ5CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIyMzk2CisKKzIwMTMtMDktMTIgMTY6NTY6NTYgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMjogc2V0IEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUIHdoZW4gYXBwcm9wcmlhdGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIzOTQKKworMjAxNC0wMS0xNyAwNzo0NjowOSArMDEwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogZG9uJ3QgcmVmIHRoZSBuZXdseSBjcmVhdGVkIGFsbG9jYXRvcgorCSAgT3RoZXJ3aXNlIHRoZSBhbGxvY2F0b3Igd2lsbCBuZXZlciBiZSBkZWxldGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMjYxMgorCisyMDE0LTAxLTE1IDIyOjQ3OjEyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IERvbid0IHNraXAgYWxsIHZpZGVvIGZyYW1lcyB1bnRpbCB0aGUgZmlyc3Qga2V5ZnJhbWUKKwkgIEluc3RlYWQgZG8gaXQgbGlrZSBhbGwgb3RoZXIgZGVtdXhlcnMgYW5kIGxldCBwYXJzZXJzIGFuZCBkZWNvZGVycworCSAgaGFuZGxlIHRoYXQuIFRoZSBrZXlmcmFtZSBpbmZvcm1hdGlvbiBpbnNpZGUgdGhlIGNvbnRhaW5lciBtaWdodAorCSAgYmUgY29tcGxldGVseSB3cm9uZyBsaWtlIGluIHRoZSBzYW1wbGUgZmlsZSBvZiB0aGUgYnVnIHJlcG9ydCwKKwkgIGFuZCBpZiBpdCBpcyBjb3JyZWN0IGFuZCB3ZSBwdXNoIG5vIGtleWZyYW1lcywgdGhlbiB0aGUgcGFyc2VycworCSAgYW5kIGRlY29kZXJzIHdpbGwgaGFuZGxlIHRoYXQgcHJvcGVybHkgYW55d2F5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MjI3NgorCisyMDE0LTAxLTEzIDEwOjA4OjA5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IHJlbW92ZSBlbHN0X29mZnNldCB2YXJpYWJsZXMKKwkgIFRoZXkgYXJlIG5vdCB1c2VkIGFueW1vcmUKKworMjAxNC0wMS0wNiAyMTozNjoxNyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVtZW1iZXIgcmV2ZXJzZSBwbGF5YmFjayB3aGVuIHZlcmlmeWluZyB0aGUgc2VnbWVudCBlbmQKKwkgIENoZWNrIGlmIHRoZSByYXRlIGlzIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIHRvIGNvcnJlY3RseSBjb21wYXJlIHRoZSBjdXJyZW50CisJICBwb3NpdGlvbiB3aXRoIHRoZSBzZWdtZW50IHRvIG1ha2UgcmV2ZXJzZSBwbGF5YmFjayB3b3JrCisKKzIwMTQtMDEtMDMgMTA6NTk6MzUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSAgcXRkZW11eDogZG8gbm90IGlnbm9yZSBlbXB0eSBzZWdtZW50cworCSAgTWFrZSBzdXJlIGVtcHR5IHNlZ21lbnRzIGFyZSB1c2VkIGFuZCBwdXNoZWQgd2l0aCBhIGdhcCBldmVudAorCSAgdG8gcmVwcmVzZW50IGl0cyBkYXRhIChvciBsYWNrIG9mIGl0KQorCSAgRWFjaCBRdFNlZ21lbnQgaXMgbWFwcGVkIGludG8gYSBHc3RTZWdtZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcKKwkgIG1lZGlhIHJhbmdlLiBGb3IgZW1wdHkgUXRTZWdtZW50cyBhIGdhcCBldmVudCBpcyBwdXNoZWQgaW5zdGVhZAorCSAgb2YgR3N0QnVmZmVycyBhbmQgaXQgYWR2YW5jZXMgdG8gdGhlIG5leHQgUXRTZWdtZW50LgorCSAgVG8gbWFrZSB0aGlzIHdvcmsgd2l0aCBzZWVrcywgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBzdGFydGluZworCSAgJ2Jhc2UnIHRvIG1ha2Ugc3VyZSBpdCByZW1haW5zIGNvbnNpc3RlbnRseSBpbmNyZWFzaW5nIHdoZW4KKwkgIHB1c2hpbmcgbmV3IHNlZ21lbnQgZXZlbnRzLgorCSAgRm9yIGV4YW1wbGU6IGlmIGEgc2VlayBtYWtlcyBxdGRlbXV4IHN0YXJ0IGZyb20gNXMsIHRoZSBmaXJzdAorCSAgc2VnbWVudCB3aWxsIGhhdmUgYSBiYXNlPTAuIFdoZW4gdGhlIG5leHQgc2VnbWVudCBpcyBhY3RpdmF0ZWQsCisJICBpdHMgYmFzZSB0aW1lIHdpbGwgYmUgUXRTZWdtZW50LnRpbWUgLSBxdGRlbXV4LnNlZ21lbnRfYmFzZSBzbworCSAgdGhhdCBpdCBkb2Vzbid0IGluY2x1ZGUgdGhlIGZpcnN0IDVzIHRoYXQgd2VyZW4ndCBwbGF5ZWQgYW5kCisJICBzaG91bGRuJ3QgYmUgYWNjb3VudGVkIG9uIHRoZSBydW5uaW5nIHRpbWUKKwkgIFRoaXMgcHVycG9zZWRseSB3aWxsIHJlbW92ZSB0aGUgZml4IG1hZGUgZm9yCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwMjY0LCBhdCB0aGlzCisJICBwb2ludCBpdCB3YXMgZGVjaWRlZCB0byByZXNwZWN0IHRoZSBnYXBzLCBldmVuIGlmIHRoZXkgY2F1c2UKKwkgIGEgZGVsYXkgb24gcGxheWJhY2ssIGJlY2F1c2UgdGhhdCdzIHRoZSB3YXkgdGhlIGZpbGUgd2FzIGNyYWZ0ZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ1ODMwCisKKzIwMTMtMTItMTIgMjM6MDU6NDMgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSAgdGVzdHM6IFJlbW92ZSB1c2FnZSBvZiB0aGUgc3lzdGVtIGNsb2NrIGZyb20gdGhlIHJ0cHJ0eCB0ZXN0CisKKzIwMTMtMTItMTIgMjM6MjI6NDEgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGNvbGxpc2lvbi5jOgorCSAgdGVzdHM6IEluaXRpYWwgc2VnbWVudCBpbiBydHBjb2xsaXNpb24gdGVzdAorCisyMDE0LTAxLTE0IDE1OjU2OjQyICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LXJ0cGF1eC5jOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1ydHBhdXguYzoKKwkgIGV4YW1wbGVzLyotcnRwYXV4OiBzcGVjaWZ5IHBheWxvYWQgdHlwZSBhc3NvY2lhdGlvbiBmb3IgdGhlIGF1ZGlvIHN0cmVhbSwgc28gdGhhdCBydHggd29ya3MgYWxzbyBmb3IgYXVkaW8KKworMjAxNC0wMS0xNCAxMzowODoxOCArMDEwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSAgcnRwcnR4c2VuZDogcmVtb3ZlIHdyb25nIGNoZWNrIGZvciBwYXlsb2FkIHR5cGUgbm90IGhhdmluZyBiZWVuIHNldAorCSAgMSkgcHQgY2FuIGJlIGxvd2VyIHRoYW4gOTYKKwkgIDIpIHRoZXJlIGlzIG5vIHBvaW50IGluIGNoZWNraW5nIHRoYXQgYmVjYXVzZSBydHBydHhzZW5kIHdpbGwgbm90CisJICBldmVuIHN0b3JlIGJ1ZmZlcnMgZm9yIHBheWxvYWQgdHlwZXMgdGhhdCBpdCBkb2Vzbid0IGtub3cgYWJvdXQsCisJICBzbyB0aGlzIGNhc2Ugd2lsbCBuZXZlciBiZSByZWFjaGVkCisKKzIwMTQtMDEtMTQgMTM6MDE6NDEgKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuYzoKKwkgIHJ0cHJ0eHNlbmQ6IGZpeCBkYXRhIGxvY2tpbmcgd2hlbiBjcmVhdGluZyBydHggcGFja2V0cworCSAgVGhpcyBwYXRjaCBtb3ZlcyB0aGUgY3JlYXRpb24gb2YgcnR4IHBhY2tldHMgdG8gYmUgZG9uZSBlYXJseSwKKwkgIGluIHRoZSBzcmNfZXZlbnQoKSBmdW5jdGlvbiwgd2hlbiB0aGV5IGFyZSByZXF1ZXN0ZWQuIFRoZSBwdXJwb3NlCisJICBpcyB0byBydW4gZ3N0X3J0cF9ydHhfYnVmZmVyX25ldygpIHdpdGggdGhlIG9iamVjdCBsb2NrZWQgdG8KKwkgIHByb3RlY3QgaW50ZXJuYWwgZGF0YSwgYmVjYXVzZSBpZiBpdCBpcyBkb25lIGF0IHRoZSBwdXNoaW5nIHN0YWdlLAorCSAgd2Ugd291bGQgaGF2ZSB0byBsb2NrIGFuZCB1bmxvY2sgbXVsdGlwbGUgdGltZXMgaW4gYSByb3cgd2hpbGUgd2UKKwkgIGFyZSBwdXNoaW5nIHRoZSBydHggYnVmZmVycy4KKwkgIFByZXZpb3VzbHkgdGhlcmUgd2FzIG5vIGxvY2tpbmcgYXQgYWxsLCB3aGljaCB3YXMgdGVycmlibHkgd3JvbmcuCisKKzIwMTQtMDEtMTQgMTI6NTA6MjMgKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuYzoKKwkgIHJ0cHJ0eHNlbmQ6IGxvY2sgYWNjZXNzIHRvIGludGVybmFsIGRhdGEgaW4gc2lua19ldmVudCgpIGZ1bmN0aW9uCisKKzIwMTQtMDEtMTQgMTI6NDQ6MDYgKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuYzoKKwkgIHJ0cHJ0eHNlbmQ6IHJlbW92ZSB1bm5lY2Vzc2FyeSBjYWxsIHRvIHJlc2V0KCkgZnJvbSBmaW5hbGl6ZSgpCisJICAuLi5hbmQgdXNlIF9mcmVlX2Z1bGwoKSBvbiB0aGUgcGVuZGluZyBidWZmZXJzIHF1ZXVlIG5vdyB0aGF0CisJICByZXNldCgpIGlzIG5vdCBiZWluZyBjYWxsZWQKKworMjAxNC0wMS0xNCAxMjozODo1MSArMDEwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSAgcnRwcnR4c2VuZDogcmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXIgZnJvbSB0aGUgaW50ZXJuYWwgcmVzZXQoKSBtZXRob2QKKworMjAxNC0wMS0xNCAxMjozMjozOCArMDEwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSAgcnRwcnR4c2VuZDogVXNlIGdfc2xpY2VfKiBmb3IgYWxsb2NhdGluZyBpbnRlcm5hbCBzdHJ1Y3R1cmVzCisKKzIwMTQtMDEtMTQgMTI6Mjg6MDEgKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHJlY2VpdmUuYzoKKwkgIHJ0cHJ0eHJlY2VpdmU6IHJlbW92ZSBzdHVwaWQgbXV0ZXggdW5sb2NrIGluIHRoZSBtaWRkbGUgb2YgY2hhaW4oKQorCisyMDE0LTAxLTE0IDEyOjI1OjM2ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmM6CisJICBydHBydHhyZWNlaXZlOiB1c2UgR1NUX0RFQlVHX09CSkVDVCAvIEdTVF9XQVJOSU5HX09CSkVDVCBpbnN0ZWFkIG9mIEdTVF9ERUJVRyAvIGdfd2FybmluZworCisyMDE0LTAxLTE0IDEyOjE5OjU4ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmM6CisJICBydHBydHhyZWNlaXZlOiBmaXggaW50ZWdlciBmb3JtYXQgc3BlY2lmaWVycyBpbiBHU1RfREVCVUcKKwkgIHNlcW51bSBpbiB0aGlzIGZ1bmN0aW9uIGlzIDMyLWJpdCwgc28gR19HVUlOVDE2X0ZPUk1BVCB3b3VsZAorCSAgcHJvZHVjZSB1bmRlZmluZWQgb3V0cHV0IG9uIGJpZyBlbmRpYW4gc3lzdGVtcworCisyMDE0LTAxLTE0IDEyOjEzOjQ5ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmg6CisJICBydHBydHhzZW5kOiBjaGFuZ2UgdGhlIHJ0eF9wdF9tYXAgZGlyZWN0bHkgaW4gc2V0X3Byb3BlcnR5KCkgaW5zdGVhZCBvZiBkZWxheWluZyBpdCBmb3IgY2hhaW4oKQorCSAgVGhlIHNhbWUgbG9jayBpcyBoZWxkLCBzbyB0aGVyZSBpcyBubyBwb2ludCBpbiBjb21wbGljYXRpbmcgaXQuLi4KKworMjAxNC0wMS0xNCAxMjowNzo1OCArMDEwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5oOgorCSAgcnRwcnR4cmVjZWl2ZTogY2hhbmdlIHRoZSBydHhfcHRfbWFwIGRpcmVjdGx5IGluIHNldF9wcm9wZXJ0eSgpIGluc3RlYWQgb2YgZGVsYXlpbmcgaXQgZm9yIGNoYWluKCkKKwkgIFRoZSBzYW1lIGxvY2sgaXMgaGVsZCwgc28gdGhlcmUgaXMgbm8gcG9pbnQgaW4gY29tcGxpY2F0aW5nIGl0Li4uCisKKzIwMTQtMDEtMTQgMTE6NTU6MDAgKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHJlY2VpdmUuYzoKKwkgIHJ0cHJ0eHJlY2VpdmU6IHNpbXBsaWZ5IHRoZSBjb2RlIG9mIGZpbmFsaXplKCkKKworMjAxNC0wMS0xNCAxMTo1MjoyMSArMDEwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5oOgorCSAgcnRwcnR4cmVjZWl2ZTogdXNlIHRoZSBHc3RPYmplY3QgbG9jayBpbnN0ZWFkIG9mIGEgbmV3IG9uZQorCisyMDE0LTAxLTE0IDExOjQ1OjUyICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmg6CisJICBydHBydHhzZW5kOiB1c2UgdGhlIEdzdE9iamVjdCBsb2NrIGluc3RlYWQgb2YgYSBuZXcgb25lCisKKzIwMTMtMTItMTAgMTQ6Mjk6NTUgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IEFkZCBOVjEyXzY0WjMyIHN1cHBvcnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjIxMjcKKworMjAxNC0wMS0xNCAxOTowODo0OSArMDkwMCAgSnVzdGluIEpveSA8anVzdGluLmpveS45dG81QGdtYWlsLmNvbT4KKworCSogc3lzL29zcy9nc3Rvc3NoZWxwZXIuYzoKKwkgIG9zc2hlbHBlcjogRG9uJ3QgbGVhayBmZCB3aGVuIGdldHRpbmcgY2FyZCBuYW1lCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIyMTYzCisKKzIwMTQtMDEtMTQgMDk6NDM6MzMgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBSZXZlcnQgImFhY3BhcnNlOiByZWxheCB0aGUgZGV0ZWN0aW9uIG9mIEFEVFMiCisJICBUaGlzIHdhcyBwdXNoZWQgYnkgbWlzdGFrZSBhbG9uZyB3aXRoIHRoZSBWNEwyIGZpeC4KKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgOGViNGIwMzJiZWY0NDQzOTdjNGQyMTFmMjA5NWMxNzNiYTExNDE4Ny4KKworMjAxNC0wMS0xNCAxNTo0MjowMSArMDkwMCAgSnVzdGluIEpveSA8anVzdGluLmpveS45dG81QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJICBydHBnNzI2cGF5OiBkb24ndCBsZWFrIGVuY29kaW5nX25hbWUgc3RyaW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIyMTU5CisKKzIwMTQtMDEtMTMgMDk6MTQ6MDAgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBmaXggYnVpbGQgYnJlYWsgdXNpbmcgVjRMMl9DQVBfVklERU9fTTJNX01QTEFORQorCSAgVGhpcyBtYXkgbm90IGJlIGRlZmluZWQuIFNpbmNlIHRoZSBwcmV2aW91cyB2ZXJzaW9uIHVzZWQKKwkgIG9ubHkgdGhlIG90aGVyIGRlZmluZSAoVjRMMl9DQVBfVklERU9fT1VUUFVUX01QTEFORSksIGZhbGwKKwkgIGJhY2sgb24gdGhpcyBvbmx5IHdoZW4gbm90IGF2YWlsYWJsZS4KKworMjAxMy0wMi0yNyAwMTo0NTo1MiArMDkwMCAgQWtpaGlybyBUc3VrYWRhIDxhdHN1a2FkYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiByZWxheCB0aGUgZGV0ZWN0aW9uIG9mIEFEVFMKKwkgIEFjY29yZGluZyB0byBJU08vSUVDIDEzODE4LTcsICJjaGFubmVsX2NvbmZpZyIgZmllbGQgaW4gQURUUyBoZWFkZXIKKwkgIG1heSBoYXZlIHZhbHVlIG9mIDAsIGFzIGluIHRoZSBjYXNlIG9mIGZyYW1lIHdpdGggUENFLgorCSAgZ3N0X2FhY19wYXJzZV9kZXRlY3Rfc3RyZWFtcygpIHJldHVybmVkIEZBTFNFIGZvciB0aG9zZSBmcmFtZXMKKwkgIGFuZCBkaXNjYXJkZWQgdGhlbS4KKworMjAxNC0wMS0wNyAxMTo1ODoyMyArMDAwMCAgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogY2hlY2sgc2V0X2NvbmZpZyByZXR1cm4gdmFsdWUgaW4gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfbmV3CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTQtMDEtMTAgMTI6NDA6MzEgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogQWRkIHBhcnNlZD0xIGZpZWxkIGZvciBlbmNvZGVkIG91dHB1dAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDE0LTAxLTEwIDEyOjM5OjE2IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IERvbid0IGxlYWsgZW1wdHkgY2FwcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDE0LTAxLTA4IDE2OjUxOjIxICswMDAwICBKdWxpZW4gSXNvcmNlIDxqdWxpZW4uaXNvcmNlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBkbyBub3Qgc3RvcCBhIHN0cmVhbSBub3QgcHJldmlvdXNseSBzdGFydGVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTItMTIgMTY6Mjc6MjEgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRG9uJ3QgZW5mb3JjZSBkaW1lbnNpb24gZmllbGQgb24gZW5jb2RlZCBmb3JtYXRzCisJICBEb24ndCBlbmZvcmNlIGhhdmluZyB3aWR0aCwgaGVpZ2h0IGFuZCBmcmFtZXJhdGUgaW4gdGVtcGxhdGUgY2FwcyBmb3IgZW5jb2RlZAorCSAgZm9ybWF0cy4gVGhlc2UgZG9uJ3QgYWx3YXlzIG5lZWQgdG8gYmUgZXhwb3NlZCBhbmQgbWF5IGJyZWFrIG5lZ290aWF0aW9uIGZvcgorCSAgZGVjb2RlciBhbmQgZGVjb2Rpbmcgc2luay4gSWYgbmVlZGVkLCB0aGVzZSBmaWVsZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQKKwkgIHdoZW4gcHJvYmVkIGNhcHMgYXJlIGtub3duLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDEzLTEyLTEyIDE3OjA5OjU5ICswMDAwICBKdWxpZW4gSXNvcmNlIDxqdWxpZW4uaXNvcmNlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogdW5yZWYgZG93bnN0cmVhbSBwb29sCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTItMTggMTM6Mzc6MjMgLTA1MDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkgIHY0bDJidWZmZXJwb29sOiBhZGQgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfZmx1c2gKKwkgIFNUUkVBTU9GRiBzZXQgYWxsIHY0bDJidWZmZXJzIHRvIERFUVVFVUUgc3RhdGUuCisJICBUaGVuIGZvciBDQVBUVVJFIHdlIGNhbGwgUUJVRiBvbiBlYWNoIGJ1ZmZlci4KKwkgIEZvciBPVVRQVVQgdGhlIGJ1ZmZlcnMgYXJlIGp1c3QgcHVzaCBiYWNrIGluIHRoZSBHc3RCdWZmZXJQb29sCisJICBiYXNlIGNsYXNzICdzIHF1ZXVlLgorCSAgQnV0IHRoZSBsb29wIGFjdHVhbGx5IGxvb2tzIGxpa2UgdGhlIHNhbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTItMTYgMTc6Mjk6MzAgLTA1MDAgIEJlbmphbWluIEdhaWduYXJkIDxiZW5qYW1pbi5nYWlnbmFyZEBsaW5hcm8ub3JnPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBBZGQgdnA4IHN1cHBvcnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0xMiAxNjo0NjowOSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBEb24ndCBmb3JjZSBmcmFtZXJhdGUgZmllbGQgZm9yIE9VVFBVVAorCSAgSWYgdGhlcmUgaXMgbm90aGluZyB0aGF0IHNlZW1zIHRvIGZvcmNlIGEgY2VydGFpbiBmcmFtZXJhdGUgb24gb3V0cHV0IGRldmljZSwgaXQgaXMKKwkgIHByZWZlcmFibGUgdG8gc2ltcGx5IG5vdCBzZXQgdGhhdCBmZWlsZC4gVGhpcyBhbGxvdyBuZWdvdGlhdGlvbiB3aXRoIHRzZGVtdXggaW4gYQorCSAgZGVjb2RlciBmb3IgZXhhbXBsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0xMiAxNDowNzowMyAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyb2JqZWN0OiBfdjRsMmZvdXJjY190b19zdHJ1Y3R1cmUoKSBjYW4gYmUgc3RhdGljCisJICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGFueW1vcmUgb3V0c2lkZSB2NGwyb2JqZWN0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDEzLTEyLTEyIDE0OjIyOjI2IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IEFkZCBNUEVHMS8yIHN1cHBvcnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0xMiAxMjoxODo0NSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBBc2sgZm9yIGEgZGVjZW50IGJ1ZmZlciBzaXplIHdoZW4gZGVhbGluZyB3aXRoIGVuY29kZWQgZm9ybWF0cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDEzLTEyLTA3IDE0OjAzOjUzIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogT24gd2FybiBvbiBzaXplIGNoYW5nZSBpZiBuX3BsYW5lcyA+IDEKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0zMSAxNjozODowOSArMDAwMCAgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IGNoZWNrIGlmIHRyYW5zbGF0ZWQgZm9ybWF0IGlzIHZhbGlkCisJICBBbHNvIGFkZCBhIEZJWE1FIGluIGdzdF92NGwyX29iamVjdF9zZXR1cF9mb3JtYXQKKwkgIHRvIG5vdGUgdGhhdCB0aGUgd2hvbGUgZnVuY3Rpb24gaGFzIHRvIGJlIGltcHJvdmVkCisJICBpbiBvcmRlciB0byBzdXBwb3J0IEVOQ09ERUQgZm9ybWF0cy4KKwkgIEl0IHJlcXVpcmVzIHRvIGhhdmUgYW4gZW5jb2RlciBkZXZpY2Ugd2hpY2ggd2UgZG8gbm90CisJICBoYXZlIHJpZ2h0IG5vdy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0wNyAxMDozMToxNSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBWYWxpZGF0ZSByZXR1cm5lZCBkaW1lbnNpb25zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTItMDUgMTk6MzY6MjUgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRW5zdXJlIG1heCBpcyBub3Qgc21hbGxlciB0aGVuIG1pbiBpbiBkZWNpZGVfYWxsb2NhdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDEzLTEyLTA1IDE5OjM2OjA2IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IERvbid0IGtlZXAgdGhlIG1heCBwYXJhbXRlciB3aGVuIHVzaW5nIG91ciBvd24gcG9vbAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDEzLTEyLTA1IDE5OjM0OjQ0IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogUmVzcGVjdCB0aGUgc3VnZ2VzdGVkIG1pbiBidWZmZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0wNSAxODo0ODo0NCAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBBbGxvY2F0ZSBwb29sIGlmIG5lZWRlZCBpbiBkZWNpZGVfYWxsb2NhdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDEzLTEyLTA1IDE4OjQ5OjE5IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IEFkZCBWNEwyX0NJRF9NSU5fQlVGRkVSU19GT1JfQ0FQVFVSRSBzdXBwb3J0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTItMDUgMTg6NDg6MTUgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogTW92ZSBkZWNpZGUgYWxsb2NhdGlvbiBpbnRvIHY0bDJvYmplY3QKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0wNSAxMzo1MToxMyAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyb2JqZWN0OiBJbXBsZW1lbnQgX3NldHVwX2Zvcm1hdCgpCisJICBUaGlzIG1ldGhvZCBhbGxvdyBzZXR0aW5nIHVwIHRoZSBvYmplY3QgZnJvbSB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgZm9ybWF0IG9uIHRoZQorCSAgZGV2aWNlLiBUaGlzIGlzIHVzZWZ1bCBmb3IgTTJNIGVsZW1lbnQgd2hlcmUgaW5wdXQgZGF0YSBkZWNpZGVzIHRoZSBmb3JtYXQgdGhhdCB3aWxsCisJICBiZSBzZXQgb24gY2FwdHVyZSBzaWRlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDEzLTEyLTEwIDE0OjM0OjE3IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IFNwbGl0IG91dCBzYXZpbmcgZm9ybWF0IGZyb20gc2V0X2Zvcm1hdCgpCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTItMzEgMTU6Mzc6MjYgKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBzZXQgb25seSBvbmUgcGxhbmUgZm9yIGVuY29kZWQgZm9ybWF0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTItMDQgMTY6NDk6MTMgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogTW92ZSBjb2RlIGJsb2NrIHdoZXJlIGl0IGJlbG9uZ3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0wNCAxNjoyNjoxMiAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBEb24ndCBjaGVjayBmb3JtYXQgc3BlY2lmaWMgaW5mb3JtYXRpb24KKwkgIFRoZSBudW1iZXIgb2YgcGxhbmUsIGFuZCB0aGUgc3RyaWRlIGRvZXMgbm90IHJlcHJlc2VudCBhIGNhcGFiaWxpdHkgY2hhbmdlLiBTYW1lIGNhcHMKKwkgIGNhbiBoYXZlIGRpZmZlcmVudCBzdHJpZGUgZnJvbSB0aGUgZGVmYXVsdCBHc3RWaWRlb0luZm8gYW5kIHRoZSBudW1iZXIgb2YgcGxhbmVzIHdpbGwKKwkgIG5ldmVyIGNoYW5nZSBmb3IgMSBmb3JtYXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTItMDQgMTY6MjM6MTggLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IE1vdmUgdGhlIGV4dHJhcG9sYXRpb24gb2Ygc3RyaWRlIGF0IHRoZSByaWdodCBwbGFjZQorCSAgTm93IHRoYXQgd2UgaGF2ZSBhIHN0cmlkZSBhcnJheSwgd2Ugc2hvdWxkIGV4dHJhcG9sYXRlIG9ubHkgd2hlbgorCSAgZWVkZWQgKG5vbiBtdWx0aS1wbGFuYXIgYnVmZmVyKS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0wNCAxNTowOTo0NCAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBNb3ZlIGJhY2sgYXNzZXJ0aW9ucyB3aGVyZSB0aGV5IHNob3VsZCBiZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDEzLTEyLTA0IDE1OjA5OjEwIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IE1vdmUgbXBsYW5lIGxvZ2ljIGludG8gZ3N0X3Y0bDJfb2JqZWN0X2dldF9jYXBzX2luZm8oKQorCSAgSXQgbWFrZXMgdGhlIGdzdF92NGwyX29iamVjdF9zZXRfZm9ybWF0KCkgc2xpZ2h0bHkgc2ltcGxpZXIgYW5kIHdpbGwgbWFrZSB0aGF0CisJICBsb2dpYyByZXVzYWJsZS4gTm90ZSB0aGF0IGdzdF92NGwyX29iamVjdF9oYXNfbXBsYW5lKCkgd2lsbCBhbHdheXMgcmV0dXJuIHRoZQorCSAgc2FtZSB2YWx1ZSBmb3Igb25lIGRldmljZS4gVGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBhZ2FpbnN0IHRoZSBjYXBzIGFzIHRoaXMKKwkgIGhhcyBhbHJlYWR5IGJlZW4gZG9uZSBieSBfb3Blbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0wMyAxODoyNzo0NyAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyb2JqZWN0OiBTcGxpdCBfdjRsMmZvdXJjY190b192aWRlb19mb3JtYXQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0wMiAxODowNToxMSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IFJlcXVlc3QgYnVmZmVycyBvbmx5IG9uY2UKKwkgIFZJRElPQ19SRVFCVUZTIGFsbG9jYXRlcyBidWZmZXIsIGl0IGhhcyBubyBwbGFjZSBpbnNpZGUgc2V0X2NvbmZpZy4gQWxzbywgc29tZSBkcml2ZXIgZG8KKwkgIG5vIGFsbG93IG11bHRpcGxlIGNhbGxzIHRvIHRoaXMgaW9jdGwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTItMDIgMTU6MjY6NTAgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdDogRG9uJ3QgdmFsaWRhdGUgZGltZW5zaW9uIGZvciBlbmNvZGVkIGZvcm1hdAorCSAgV2Ugc2V0IHRoZSBkaW1lbnNpb25zIGp1c3QgaW4gY2FzZSBidXQgZG9uJ3QgdmFsaWRhdGUgdGhlbQorCSAgYWZ0ZXJ3YXJkcy4gRm9yIHNvbWUgY29kZWNzIHRoZSBkaW1lbnNpb25zIGFyZSAqbm90KiBpbiB0aGUKKwkgIGJpdHN0cmVhbSwgSUlSQyBWQzEgaW4gQVNGIG1vZGUgZm9yIGV4YW1wbGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTEtMjggMTc6MTA6MjkgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgdjRsMm9iamVjdDogUXVpcmtzIGZvciBkZXYgd2l0aG91dCBpbml0aWFsIGZvcm1hdAorCSAgTW9zdCBNMk0gaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3VyIGluaXRpYWxseSB3aGVuIFZJRElPQ19HX0ZNVCBpcyBjYWxsZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTEtMjggMTc6MDk6MjYgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgdjRsMm9iamVjdDogQWRkIGdzdF92NGwyX29iamVjdF9vcGVuX3NoYXJlZCgpCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMTEtMjggMTc6MDc6MDUgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5oOgorCSAgdjRsMm9iamVjdDogSW1wbGVtZW50IGdzdF92NGwyX2R1cCgpCisJICBUaGlzIHdpbGwgZHVwbGljYXRlZCB0aGUgRkQgZnJvbSBhbm90aGVyIG9iamVjdCBhbmQgY29weSBvdmVyIHRoZSBwcm9iZWQgcmVzdWx0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDU2OAorCisyMDEzLTExLTI4IDE2OjU5OjU5IC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIHY0bDJvYmplY3Q6IG1ha2UgSU9fTU9ERSBlbnVtIHB1YmxpYworCSAgVGhpcyBpcyB0byBhbGxvdyBhZGRpbmcgYSBzZWNvbmQgaW8tbW9kZSBwcm9wZXJ0eSBvbiBNMk0gZGV2aWNlIGxpa2UgZGVjb2RlciBzbworCSAgaW5wdXQgYW5kIG91dHB1dCBjYW4gYmUgY29udHJvbGxlZCBzZXBhcmF0bHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTMtMDYtMDQgMjM6NDI6MjQgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBiZXR0ZXIgaGFuZGxlIHF1aXJrcyBhY3RpdmF0aW9uCisJICBUaGlzIHdheSB3ZSBjYW4gYWN0aXZhdGUgZGVhY3RpdmF0ZSB0aG9zZSBxdWlya3MgYWxsIGF0IG9uY2UgYXQgb25lCisJICBwbGFjZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0wNi0wNCAyMzozNDowNCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IEZpeCBoMjY0IGNhcHMKKwkgIFY0TDJfUElYX0ZNVF9IMjY0IGlzIGRvY3VtZW50YXRlZCBhcyBieXRlLXN0cmVhbSAod2l0aCBzdGFydCBjb2RlKS4gVGhlIGVuc3VyZSBwcm9wZXIKKwkgIG5lZ290aWF0aW9uIHdpdGggZWxlbWVudCBsaWtlIGgyNjRwYXJzZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA1NjgKKworMjAxMy0xMi0wNiAxNDo0NDo1MSAtMDUwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyb2JqZWN0OiBTcGxpdCBjYXBzIGluIGRpZmZlcmVudCBjYXRlZ29yaWVzCisJICBUaGlzIGlzIG5lZWQgdG8gY29ycmVjdGx5IGV4cG9zZSBjYXBhYmlsaXRpZXMgb24gc3BlY2lhbGl6ZWQgZGV2aWNlcworCSAgbGlrZSBkZWNvZGVycyBhbmQgZW5jb2RlcnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTY4CisKKzIwMTQtMDEtMTAgMTQ6MTY6MDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2FkZW11eDogZG9uJ3QgbGVhayBUT0MgY2hhcHRlciBsaXN0CisKKzIwMTQtMDEtMTAgMDg6NTI6MTYgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogcmVtb3ZlIG9ic29sZXRlIHdyaXRlLWR1bW15LWFuZC1vdmVyd3JpdGUtb24tZW9zIGNvZGUKKwkgIFRoZSBuZWVkIGZvciByZXdyaXRpbmcgYXBwYXJlbnRseSBpcyBvYnNvbGV0ZSAwLjEwIGxlZnRvdmVyLgorCSAgV2Ugbm93IGhhdmUgY2FwcyBmb3Igc3VidGl0bGVzIHdoZW4gd2UgY3JlYXRlIHRoZSBoZWFkZXJzLAorCSAgc28gd2UgYWx3YXlzIHdyaXRlIHRoZSBjb3JyZWN0IGRhdGEgaW4gdGhlIGZpcnN0IHBsYWNlLgorCisyMDE0LTAxLTA5IDIzOjU1OjE2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJICBydHBydHhzZW5kOiByZW1vdmUgZHVwbGljYXRlIGFzc2lnbm1lbnQKKwkgIENvdmVyaXR5IENJRCAxMTUxNjgwCisKKzIwMTQtMDEtMDkgMTg6MjU6MDQgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogd3JpdGUgc3VidGl0bGUgY29kZWMgSUQgYW5kIGRhdGEgYXQgc3RhcnQgd2hlbiBrbm93bgorCSAgVGhpcyBhdm9pZHMgaXNzdWVzIHdpdGggd3JpdGluZyBkdW1teSBkYXRhIGZpcnN0LCB0aGVuIGhhdmluZworCSAgdG8gY29tZSBiYWNrIGFuZCB3cml0ZSBjb3JyZWN0IGRhdGEgbGF0ZXIuIERvaW5nIHNvIHByZXZlbnRzCisJICB0aGUgbXV4ZWQgc3RyZWFtIGZyb20gYmVpbmcgYWN0dWFsbHkgc3RyZWFtYWJsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTIxMzQKKworMjAxNC0wMS0wOSAxNzozMjoxNSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBJbmNsdWRlIEF2YWlsYWJpbGl0eU1hY3Jvcy5oIGZvciBvc3h2aWRlbyBjaGVjaworCSAgT3RoZXJ3aXNlIE1BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEIG1pZ2h0IG5vdCBiZSBkZWZpbmVkCisKKzIwMTQtMDEtMDkgMTE6NTY6MzEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJICBxdG11eDogcmVzcGVjdCB0aGUgSERMUiBib3ggc3RyaW5nIGZvcm1hdCBmb3IgbW92IGFuZCBpc29tZWRpYQorCSAgTW92IHNwZWMgc2F5cyBpdCB1c2VzIGEgcGFzY2FsIHN0eWxlIHN0cmluZywgd2hpbGUgaXNvbWVkaWEgdXNlcworCSAgYSBudWxsIHRlcm1pbmF0ZWQgb25lLiBTdG9yZSB0aGUgY3VycmVudCBhdG9tcyBmbGF2b3IgaW50byB0aGUgSERMUgorCSAgdG8gYmUgYWJsZSB0byBnZW5lcmF0ZSB0aGUgY29ycmVjdCBvdXRwdXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA1OTgyCisKKzIwMTQtMDEtMDggMTE6Mjg6MDQgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBSZXZlcnQgIm1hdHJvc2thbXV4OiBVc2UgdGhlIHJ1bm5pbmcgdGltZSBmb3IgY29udGFpbmVyIHRpbWVzdGFtcHMsIG5vdCBidWZmZXIgdGltZXN0YW1wcyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgYjNhYTg3NTVmZTA3NjM5ZjIyZTQxMDRmNDkzMmQ3NjlkNmM5MDc1YS4KKwkgIFdlIGFyZSBhbHJlYWR5IHVzaW5nIHRoZSBydW5uaW5nLXRpbWUgYmVjYXVzZSB0aGV5IHdlcmUgcGxhY2VkIG9uIHRoZQorCSAgYnVmZmVycyB3aXRoIGdzdF9jb2xsZWN0X3BhZHNfY2xpcF9ydW5uaW5nX3RpbWUoKS4gQXJndWFibHkgaXQgd291bGQgYmUKKwkgIGJldHRlciB0byBub3QgbW9kaWZ5IHRoZSBpbmNvbW1pbmcgYnVmZmVycyBidXQgY29sbGVjdHBhZHMgc2VlbXMgdG8gd2FudAorCSAgdG8gdXNlIGFic29sdXRlIHRpbWVzdGFtcHMgZnJvbSB0aGUgYnVmZmVycyBmb3IgZmluZGluZyB0aGUgYmVzdCBidWZmZXIKKwkgICh0aGlzIGNhbiBiZSBjaGFuZ2VkIHdpdGggYSBjdXN0b20gY29tcGFyZSBmdW5jdGlvbi4uKS4KKworMjAxNC0wMS0wOCAxMDo0MToyNCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBGaXggQUNfQ09NUElMRV9JRkVMU0UgdXNhZ2UKKworMjAxNC0wMS0wOCAxMDozMToxOCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgb3N4dmlkZW9zaW5rOiBJbXByb3ZlIGNvbmZpZ3VyZSBjaGVjayBmb3IgT1NYID49IDEwLjYKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjEyNDUKKworMjAxNC0wMS0wNyAxMjoxMzo1MSAtMDgwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1w6kgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiByZW1vdmUgdW51c2VkIGxpc3Qgb2YgZGVjb2RlcnMKKwkgIHJlbW92ZSBsaXN0IG9mIGRlY29kZXJzLCB3aGljaCBhcmUgYWxyZWFkeSBoYW5kbGVkIGJ5IHRoZSBsaXN0IG9mIGVsZW1lbnRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxOTkzOAorCisyMDE0LTAxLTA4IDA5OjQ2OjU1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogRXJyb3Igb3V0IGlmIEFEUENNIGNhcHMgZG9uJ3QgY29udGFpbiB0aGUgbGF5b3V0IGZpZWxkCisKKzIwMTQtMDEtMDMgMTU6MjU6MjMgKzAxMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogQWRkIHN1cHBvcnQgZm9yIGc3MjYgQURQQ00KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjA5OTUKKworMjAxNC0wMS0wNyAxNTowNDowMiArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHVzZSBuZXcgbWV0aG9kIHRvIGdldCBtZWRpYS10eXBlCisJICBVc2UgdGhlIG5ldyBtZXRob2QgdG8gZ2V0IHRoZSBtZWRpYSB0eXBlIG9mIGEgdHJhbnNwb3J0LgorCisyMDE0LTAxLTA2IDIxOjEyOjE3ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IHNwbGl0IHRoZSB0ZXN0CisJICBUaGlzIHdheSBvbmUgZmFpbHVyZSB3b24ndCBzaGFkb3cgdGhlIG90aGVyIHRlc3QgYW5kIGFsc28gaWYgb25lIGZhaWxzIHdlIGdldAorCSAgYmV0dGVyIGRpc2dub3N0aWNzIHRocm91Z2ggdGhlIHRlc3QtbmFtZS4KKworMjAxNC0wMS0wNiAxNDo1NDo0NiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IEFkZCBIRVZDIC8gaDI2NSBzdXBwb3J0CisKKzIwMTQtMDEtMDYgMTQ6NTQ6MzggKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgbWF0cm9za2FkZW11eDogQWRkIEhFVkMgLyBoMjY1IHN1cHBvcnQKKworMjAxNC0wMS0wNiAxMzozNjozOCArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogcmVtb3ZlIGlmZGVmJ2VkIGNvZGUKKwkgIFdlIGRvIGhhdmUgYWR0bCBhbmQgY3VlIHBhcnNlIGFzIHBhcnQgb2YgdG9jIGhhbmRsaW5nIGFscmVkYXkuIFRoZSBmbXQgY29kZSBpcyBhIGxlZnQgb3ZlciBmcm9tIDwwLjEwIHRpbWVzLgorCisyMDE0LTAxLTA2IDEzOjMyOjU4ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIGF2aWRlbXV4LCB3YXZlcGFyc2U6IG1vcmUgbG9nZ2luZyBmb3IgdW5oYW5kbGVkIGNodW5rcworCSAgQWx3YXlzIHByaW50IGEgd2FybmluZyB3aXRoIHRoZSB0YWcgYW5kIGlmIHBvc3NpYmxlIGRvIGEgbWVtZHVtcC4KKworMjAxNC0wMS0wNSAyMjo0Nzo0MiArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGV4cG9zZSAnc3RybicgLSBzdHJlYW0gbmFtZSAtIGFzIHRpdGxlIHRhZworCisyMDE0LTAxLTA1IDIyOjQxOjI0ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogcGFyc2UgZnVqaSBzdHJkCisJICBXZSBjYW4gZ2V0IG1ha2VyLCBtb2RlbCBhbmQgY2FwdHVyZSBkYXRlIGZyb20gdGhpcyBjaHVuay4KKwkgIEZpeGVzICM2MzYxNDMKKworMjAxNC0wMS0wNSAyMTo0NjozMyArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IC4uLiBhbmQgdXNlIHRoZSBsb2NhbCBhcGkgYm90aCB0aW1lcworCisyMDE0LTAxLTA1IDIxOjM4OjE0ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogY29weSB0aGUgcmlmZiBhcGkgZm9yIG5jZHQgaW50byB0aGUgZWxlbWVudAorCSAgVGhpcyBjaHVuayBpcyBhdmkgc3BlY2lmaWMsIG5vIG5lZWQgdG8gZXhwb3NlIHRoaXMgYXMgcHVibGljIGFwaS4KKworMjAxNC0wMS0wNSAxMDoyODoyMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IEFkZCBtaXNzaW5nIHNlbWljb2xvbiBmcm9tIGxhc3QgY29tbWl0CisKKzIwMTQtMDEtMDUgMTA6MjI6MzcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBVc2UgdGhlIHJ1bm5pbmcgdGltZSBmb3IgY29udGFpbmVyIHRpbWVzdGFtcHMsIG5vdCBidWZmZXIgdGltZXN0YW1wcworCSAgQnVmZmVyIHRpbWVzdGFtcHMgaGF2ZSBubyByZWFsIG1lYW5pbmcgaGVyZSwgYW5kIGZvciBzZWxlY3RpbmcgdGhlIG5leHQKKwkgIGJ1ZmZlciB3ZSBhbHJlYWR5IHVzZSB0aGUgcnVubmluZyB0aW1lIGFueXdheS4KKworMjAxNC0wMS0wNCAyMTozNDozOCArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpOiB1c2UgbmV3IHJpZmYgYXBpIHRvIGV4dHJhY3Qgbmlrb24gbWV0YWRhdGEKKwkgIEZpeGVzICM2MzYxNDMKKworMjAxMy0xMS0wMSAxNjo0MTo0MyArMDAwMCAgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkgIHJ0cHJ0eHNlbmQvcnRwcnR4cmVjZWl2ZTogZ2VuZXJhdGUgZ3RrIGRvYworCisyMDEzLTEyLTAyIDExOjI2OjA5ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkgIHRlc3QvY2hlY2s6IFZlcmlmeSBydHBydHhzZW5kOjpzc3JjLW1hcCBwcm9wZXJ0eSB3b3JrcyBhcyBleHBlY3RlZAorCisyMDEzLTExLTI5IDE5OjM1OjQ0ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBhdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1ydHBhdXguYzoKKwkgIHJ0cHJ0eHJlY2VpdmU6IG1vZGlmeSB0byB1c2UgYSBwYXlsb2FkLXR5cGUgbWFwIGxpa2UgcnRwcnR4c2VuZAorCisyMDEzLTExLTI5IDE5OjU4OjI2ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJICBydHBydHhzZW5kOiBkbyBub3Qga2VlcCBoaXN0b3J5IG9mIHBhY2tldHMgd2l0aCBhbiB1bmtub3duIHBheWxvYWQgdHlwZQorCSAgVGhpcyBhbGxvd3MgdG8gZGlzYWJsZSByZXRyYW5zbWlzc2lvbiBwZXIgcGF5bG9hZCB0eXBlIGJ5IG5vdCBwdXR0aW5nCisJICBhIGNlcnRhaW4gcGF5bG9hZCB0eXBlIGluIHRoZSBtYXAuCisKKzIwMTQtMDEtMDIgMTU6MTg6NTIgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBhdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGNvbGxpc2lvbi5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwcnR4LmM6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXJ0cGF1eC5jOgorCSAgcnRwcnR4c2VuZDogQWxsb3cgU1NSQy1tdWx0aXBsZXhpbmcgYW5kIG11bHRpcGxlIHBheWxvYWQgdHlwZXMgaW4gdGhlIG9yaWdpbmFsIHN0cmVhbQorCSAgQ29uZmxpY3RzOgorCSAgdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1ydHBhdXguYworCisyMDEzLTExLTI1IDE1OjAwOjQ1ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJICBydHBydHhzZW5kOiBBZGQgYW4gcnR4LXNzcmMgcHJvcGVydHkgdG8gYWxsb3cgZXh0ZXJuYWwgY29udHJvbCBvZiB0aGUgc3NyYworCSAgVGhpcyBpcyB1c2VmdWwgd2hlbiBvbmUgbmVlZHMgdG8ga25vdyB0aGUgU1NSQyBiZWZvcmVoYW5kcywgc28gdGhhdCBpdCBjYW4KKwkgIGJlIHVzZWQgZm9yIFNSVFAgZm9yIGV4YW1wbGUuCisKKzIwMTMtMTEtMTMgMTU6MTE6MzUgLTA1MDAgIFRvcnJpZSBGaXNjaGVyIDx0b3JyaWUuZmlzY2hlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC8uZ2l0aWdub3JlOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1ydHBhdXguYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItcnRwYXV4LmM6CisJICBleGFtcGxlczogcnRwOiBBZGQgZW5kLXRvLWVuZCBydHBiaW4gZXhhbXBsZSB3aXRoIFJUWCBlbGVtZW50cworCSAgVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIHJ0cGJpbiB3aXRoIHJldHJhbnNtaXNzaW9uIChydHgpCisJICBlbGVtZW50cyBzZXQgaW4gdGhlIHBsYWNlIG9mIHJ0cGJpbidzICJhdXgiIGVsZW1lbnRzIGluIG9yZGVyIHRvCisJICBlbmFibGUgUlRQIHJldHJhbnNtaXNzaW9uIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgUkZDNDU4OC4KKworMjAxMy0xMS0wNSAxNzozNTowMSArMDAwMCAgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvZGVzaWduL01ha2VmaWxlLmFtOgorCSogZG9jcy9kZXNpZ24vZGVzaWduLXJ0cGF1eGlsaWFyeS50eHQ6CisJICBkb2M6IGFkZCBkZXNpZ24tcnRwYXV4aWxpYXJ5LnR4dCB0byBkZXNjcmliZSBob3cgcnRwYmluIGRlYWxzIHdpdGggYXV4aWxpYXJ5IGVsZW1lbnRzCisKKzIwMTQtMDEtMDIgMTQ6NDg6NDkgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBhbHNvIHB1c2ggRU9TIGV2ZW50IHRvIFJUQ1Agc3JjcGFkCisKKzIwMTQtMDEtMDIgMTQ6NDY6MTEgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBzZXNzaW9uOiBwbGFjZSBTU1JDIGluIFJldHJhbnNtaXNzaW9uIGV2ZW50CisKKzIwMTMtMTEtMDEgMTY6NTc6MTUgKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBhdXguYzoKKwkgIHRlc3RzL2NoZWNrOiBhZGQgcnRwYXV4Ojp0ZXN0X3NpbXBsZV9ydHBiaW5fYXV4CisJICBJdCBzaG93cyBob3cgdG8gdXNlICJzZXQtYXV4LXJlY2VpdmUiIGFuZCAic2V0LWF1eC1zZW5kIgorCSAgcHJvcGVydGllcyBvZiBydHBiaW4gdG8gc2V0IHJ0cHJ0eHNlbmQgYW5kIHJ0cHJ0eHJlY2VpdmUKKwkgIEJ1aWxkIDIgcGlwZWxpbmVzLCBvbmUgZm9yIHJ0cGJpbiBhcyBhIHNlbmRlciBhbmQgb25lIGZvcgorCSAgcnRvYmluIGFzIGEgcmVjZWl2ZS4gVGhlbiB0cmFuc21pdCBhbiBhdWRpbyBzdHJlYW0uCisJICBJdCBhbHNvIGRyb3BzIHNvbWUgcGFja2V0cyB0byBhY3RpdmF0ZSByZXN0cmFuc21pc3Npb24gYW5kCisJICBjaGVjayB0aGV5IGFyZSBhY3R1YWxseSByZXRyYW5zbWl0ZWQuCisKKzIwMTMtMTEtMDEgMTc6MDk6NDIgKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBjb2xsaXNpb24uYzoKKwkgIHRlc3RzL2NoZWNrOiBhZGQgcnRwY29sbGlzaW9uOjp0ZXN0X3J0eF9zc3JjX2NvbGxpc2lvbiB1bml0IHRlc3QKKwkgIGNoZWNrIHRoYXQgcnR4cnRwc2VuZCBjaGFuZ2VzIGl0cyByZXRyYW5zbWlzc2lvbiBzc3JjIHdoZW4KKwkgIGNvbGxpc2lvbiBoYXBwZW5zCisKKzIwMTMtMTEtMDYgMTI6MzQ6MTMgKzAyMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSAgdGVzdHMvY2hlY2s6IGFkZCBydHBydHg6OnRlc3RfcnR4cmVjZWl2ZV9kYXRhX3JlY29uc3RydWN0aW9uCisJICBUaGlzIHVuaXQgdGVzdCB2ZXJpZmllcyB0aGF0IHJldHJhbnNtaXR0ZWQgcnRwIHBhY2tldHMgY29taW5nIG91dAorCSAgb2YgcnRwcnR4cmVjZWl2ZSBhcmUgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsIG9uZXMuCisKKzIwMTMtMTEtMDUgMDk6MzM6NTEgKzAyMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuYzoKKwkgIHJ0cHJ0eHNlbmQ6IHVzZSBhIHJlYWxpc3RpYyBsaW1pdCBmb3IgdGhlIHZhbHVlIG9mIG1heC1zaXplLXBhY2tldHMKKwkgIEdfTUFYSU5UMTYgaXMgY2hvc2VuIGJlY2F1c2UgaWYgdGhlIHF1ZXVlIGNvbnRhaW5zIG1vcmUgdGhhbgorCSAgR19NQVhJTlQxNiBwYWNrZXRzLCBzZXFudW0gY29tcGFyaXNvbiB3aWxsIG5vdCB3b3JrIHByb3Blcmx5LgorCisyMDEzLTExLTA0IDIwOjA1OjAzICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmg6CisJICBydHBydHhzZW5kOiB1c2UgYSBHU2VxdWVuY2UgdG8gaW1wbGVtZW50IHRoZSBidWZmZXIgcXVldWUKKwkgIFRoaXMgaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdCBzZWFyY2hpbmcgdGhlIHF1ZXVlIHRvIGZpbmQgdGhlCisJICBidWZmZXIgd2l0aCB0aGUgcmVxdWVzdGVkIHNlcW51bSBpcyBkb25lIHdpdGggYmluYXJ5IHNlYXJjaC4KKworMjAxMy0xMS0wNCAxODozODoyNCArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwcnR4LmM6CisJICBydHBydHhzZW5kOiByZXRyYW5zbWl0IHBhY2tldHMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHJ0eCByZXF1ZXN0cworCisyMDEzLTExLTAyIDE5OjU2OjQ0ICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkgIHRlc3RzL2NoZWNrOiBBZGQgdW5pdCB0ZXN0IGZvciBydHhzZW5kJ3MgbWF4X3NpemVfdGltZSBwcm9wZXJ0eQorCisyMDEzLTEwLTI5IDE4OjI3OjAwICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmg6CisJICBydHBydHhzZW5kOiBIYW5kbGUgdGhlIG1heF9zaXplX3RpbWUgcHJvcGVydHkKKwkgIFRoaXMgcHJvcGVydHkgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBhbW91bnQgb2YgYnVmZmVycworCSAgdG8ga2VlcCBpbiB0aGUgcmV0cmFuc21pc3Npb24gcXVldWUgZXhwcmVzc2VkIGFzIHRpbWUgKG1zKQorCSAgaW5zdGVhZCBvZiBidWZmZXIgY291bnQgKHdoaWNoIGlzIHRoZSBtYXhfc2l6ZV9idWZmZXJzIHByb3BlcnR5KS4KKworMjAxMy0xMS0wMiAxNToyMTowOCArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSAgcnRwcnR4c2VuZDoga2VlcCBpbXBvcnRhbnQgYnVmZmVyIGluZm9ybWF0aW9uIGluIGEgcHJpdmF0ZSBzdHJ1Y3R1cmUKKwkgIFRoaXMgaXMgdG8gYXZvaWQgbWFwcGluZyBhIGJ1ZmZlciBldmVyeSB0aW1lIHdlIG5lZWQgdG8gcmVhZCBhIHNlcW51bQorCSAgb3IgYSB0aW1lc3RhbXAuCisKKzIwMTMtMTEtMDEgMTE6NTg6NDcgKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSAgdGVzdHMvY2hlY2s6IEFkZCBydHBydHg6OnRlc3RfcnR4c2VuZGVyX3BhY2tldF9yZXRlbnRpb24KKwkgIFRoaXMgdW5pdCB0ZXN0IHZlcmlmaWVzIHRoYXQgdGhlIHJ0eHNlbmQgZWxlbWVudCBjb3JyZWN0bHkgbWFpbnRhaW5zCisJICBhIGJ1ZmZlciBvZiBhbHJlYWR5IHRyYW5zbWl0dGVkIHJ0cCBwYWNrZXRzIGFuZCB0aGF0IGl0IGNhbgorCSAgcmUtdHJhbnNtaXQgYWxsIG9mIHRoZW0gY29ycmVjdGx5IG9uIGRlbWFuZC4gSXQgYWxzbyB2ZXJpZmllcworCSAgdGhhdCB0aGUgbGltaXQgb2YgdGhpcyBidWZmZXIgKG1heC1zaXplLXBhY2tldHMgcHJvcGVydHkpIGlzIHJlc3BlY3RlZC4KKworMjAxMy0xMS0wMSAxNjoyMjoxMyArMDAwMCAgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jOgorCSAgdGVzdHMvY2hlY2s6IGFkZCBydHBydHg6OnRlc3RfZHJvcF9tdWx0aXBsZV9zZW5kZXIgdW5pdCB0ZXN0CisJICBTZXZlcmFsIHNlbmRlcnMgLyBvbmUgcmVjZWl2ZXIKKwkgIFNpbWlsYXIgdGhhbiB0ZXN0X2Ryb3Bfb25lX3NlbmRlciBidXQgd2l0aCBtdWx0aXBsZSBzZW5kZXJzCisJICBtaXhlZCB0aHJvdWdoIHRoZSBmdW5uZWwgZWxlbWVudC4KKwkgIEl0IGRyb3BzIHNvbWUgcGFja2V0cyBhbmQgY2hlY2tzIHRoYXQgdGhleSBhcmUgcmV0cmFuc21pdGVkCisJICBjb3JyZWN0bHkuCisKKzIwMTMtMTEtMDEgMTY6MjE6MDAgKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkgIHRlc3RzL2NoZWNrOiBhZGQgcnRwcnR4Ojp0ZXN0X2Ryb3Bfb25lX3NlbmRlciB1bml0IHRlc3QKKwkgIFRlc3QgZm9yIG9uZSBzZW5kZXIgLyBvbmUgcmVjZWl2ZXIKKwkgIEJ1aWxkIHRoZSBwaXBlbGluZQorCSAgdmlkZW90ZXN0c3JjICEgcnRwdnJhd3BheSAhIHJ0cHJ0eHNlbmQgISBydHBydHhyZWNlaXZlICEgZmFrZXNpbmsKKwkgIGFuZCBkcm9wIHNvbWUgYnVmZmVycyBiZXR3ZWVuIHJ0cHJ0eHNlbmQgYW5kIHJ0cHJ0eHJlY2VpdmUKKwkgIFRoZW4gaXQgY2hlY2tzIHRoYXQgZXZlcnkgZHJvcHBlZCBwYWNrZXQgaGFzIGJlZW4gcmUtc2VudC4KKwkgIEl0IGFsc28gY2hlY2tzIHRoYXQgbm90IHRvbyBtdWNoIHJlcXVlc3RzIGhhcyBiZWVuIHNlbnQuCisKKzIwMTMtMTEtMDEgMTY6MTc6NTEgKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBydHguYzoKKwkgIHRlc3RzL2NoZWNrOiBhZGQgcnRwcnR4Ojp0ZXN0X3B1c2hfZm9yd2FyZF9zZXEKKwkgIGFkZCBzaW1wbGUgdW5pdCB0ZXN0IHRoYXQgbWFudWFsbHkgcHVzaCBidWZmZXJzCisJICBpbiBydHBydHhzZW5kIGNvbm5lY3RlZCB0byBydHBydHhyZWNlaXZlLgorCSAgRHJvcHMgc29tZSBidWZmZXJzIGFuZCBtYWtlIHN1cmUgdGhleSBhcmUgcmV0cmFuc21pc3RlZC4KKworMjAxMy0xMS0wMSAxNTo1MjowMyArMDAwMCAgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbWFuYWdlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5oOgorCSAgcnRwbWFuYWdlcjogYWRkIG5ldyBydHBydHhzZW5kIC8gcnRwcnR4cmVjZWl2ZSBlbGVtZW50cworCSAgVGhlIHB1cnBvc2Ugb2YgdGhlIHNlbmRlciBSVFggb2JqZWN0IGlzIHRvIGtlZXAgYSBoaXN0b3J5CisJICBvZiBSVFAgcGFja2V0cyB1cCB0byBhIGNvbmZpZ3VyYWJsZSBsaW1pdCAoaW4gdGltZSkuIEl0IHdpbGwKKwkgIGxpc3RlbiBmb3IgY3VzdG9tIHJldHJhbnNtaXNzaW9uIGV2ZW50cyBmcm9tIGRvd25zdHJlYW0uIFdoZW4KKwkgIGl0IHJlY2VpdmVzIGEgcmVxdWVzdCBmb3IgcmV0cmFuc21pc3Npb24sIGl0IHdpbGwgbG9vayB1cCB0aGUKKwkgIHJlcXVlc3RlZCBzZXFudW0gaW4gaXRzIGxpc3Qgb2Ygc3RvcmVkIHBhY2tldHMuIElmIHRoZSBwYWNrZXQKKwkgIGlzIGF2YWlsYWJsZSwgaXQgd2lsbCBjcmVhdGUgYSBSVFggcGFja2V0IGFjY29yZGluZyB0byBSRkMgNDU4OAorCSAgYW5kIHNlbmQgdGhpcyBhcyBhbiBhdXhpbGlhcnkgc3RyZWFtLgorCSAgVGhlIHJlY2VpdmVyIHdpbGwgbGlzdGVuIHRvIHRoZSBjdXN0b20gcmV0cmFuc21pc3Npb24gZXZlbnRzCisJICBmcm9tIHRoZSBkb3duc3RyZWFtIGppdHRlcmJ1ZmZlciBhbmQgd2lsbCByZW1lbWJlciB0aGUgU1NSQzEKKwkgIG9mIHRoZSBzdHJlYW0gYW5kIHNlcW51bSB0aGF0IHdhcyByZXF1ZXN0ZWQuIFdoZW4gaXQgc2VlcyBhCisJICBwYWNrZXQgd2l0aCBvbmUgb2YgdGhlIHN0b3JlZCBzZXFudW0sIGl0IGFzc29jaWF0ZXMgdGhlIFNTUkMyCisJICBvZiB0aGUgc3RyZWFtIHdpdGggdGhlIFNTUkMxIG9mIHRoZSBtYXN0ZXIgc3RyZWFtLiBGcm9tIHRoZW4KKwkgIG9uIGl0IGtub3dzIHRoYXQgU1NSQzIgaXMgdGhlIHJldHJhbnNtaXNzaW9uIHN0cmVhbSBvZiBTU1JDMS4KKwkgIFRoaXMgYWxnb3JpdGhtIGlzIHN0YXRlZCBpbiBSRkMgNDU4OC4gRm9yIHRoaXMgYWxnb3JpdGhtIHRvCisJICB3b3JrLCBSRkM0NTg4IGFsc28gc3RhdGVzIHRoYXQgbm8gdHdvIHBlbmRpbmcgcmV0cmFuc21pc3Npb24KKwkgIHJlcXVlc3RzIGNhbiBleGlzdCBmb3IgdGhlIHNhbWUgc2VxbnVtIGFuZCBkaWZmZXJlbnQgU1NSQ3Mgb3IKKwkgIGVsc2UgaXQgd291bGQgYmUgaW1wb3NzaWJsZSB0byBhc3NvY2lhdGUgdGhlIHJldHJhbnNtaXNzaW9uIHdpdGgKKwkgIHRoZSBvcmlnaW5hbCByZXF1ZXN0ZXIgU1NSQy4KKwkgIFdoZW4gdGhlIFJUWCByZWNlaXZlciBoYXMgYXNzb2NpYXRlZCB0aGUgcmV0cmFuc21pc3Npb24gcGFja2V0cywKKwkgIGl0IGNhbiBkZXBheWxvYWQgYW5kIGZvcndhcmQgdGhlbSB0byB0aGUgc291cmNlIHBhZCBvZiB0aGUgZWxlbWVudC4KKwkgIFJUWCBpcyBTU1JDLW11bHRpcGxleGVkCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzExMDg0CisKKzIwMTMtMTEtMDUgMTY6MzY6NDYgKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL2Rlc2lnbi9NYWtlZmlsZS5hbToKKwkqIGRvY3MvZGVzaWduL2Rlc2lnbi1ydHByZXRyYW5zbWlzc2lvbi50eHQ6CisJICBkb2M6IGFkZCBkZXNpZ24gZm9yIHJ0cCByZXRyYW5zbWlzc2lvbgorCSAgRGVzY3JpYmUgaG93IHJ0cHJ0eHNlbmQgYW5kIHJ0cHJ0eHJlY2VpdmUgZ2VuZXJhbGx5IHdvcmsKKwkgIGJ1dCBhbHNvIGhvdyB0aGUgYXNzb2NpYXRpb24gYWxnb3JpdGhtIGlzIGltcGxlbWVudGVkLgorCisyMDE0LTAxLTAyIDIwOjIzOjA1IC0wMzAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyLnZlcmRlam9Ac2lzYS5zYW1zdW5nLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiB1c2Ugc3RhdHVzIGNvZGUgbWFjcm8gaW5zdGVhZCBvZiA0MDcKKwkgIFJlc3Qgb2YgdGhlIGNvZGUgaXMgdXNpbmcgdGhlIF9QUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRAorCSAgbWFjcm8gdG9vLiBFYXNpZXIgdG8gdW5kZXJzdGFuZCBpZiB5b3UgZG9uJ3QgcmVjYWxsIEhUVFAKKwkgIGVycm9yIGNvZGVzIGJ5IGhlYXJ0LgorCisyMDEzLTEyLTMxIDIxOjMxOjQzIC0wMzAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyLnZlcmRlam9Ac2lzYS5zYW1zdW5nLmNvbT4KKworCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmg6CisJICBzaG91dDJzZW5kOiBjaGFuZ2UgYXVkaW9fZm9ybWF0IGZpZWxkIHRvIGZvcm1hdAorCSAgVGhpcyBlbGVtZW50IGFuZCB0aGUgdW5kZXJseWluZyBsaWJzaG91dDIgbGlicmFyeQorCSAgY2FuIGhhbmRsZSB2aWRlbyBtZWRpYSBmaWxlcyB0b28uIFRoZSBjb2RlIGFscmVhZHkKKwkgIGhhbmRsZXMgdmlkZW8vd2VibSBzbyB0aGUgbmFtZSBnZXRzIGNvbmZ1c2luZy4gQWxzbworCSAgYWRkIGFuZCB1c2UgREVGQVVMVF9GT1JNQVQgbWFjcm8gSW5zdGVhZCBvZiBoYXJkd2lyaW5nCisJICBTSE9VVF9GT1JNQVRfVk9SQklTIGF0IGluaXQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjEzNDIKKworMjAxMy0xMi0zMSAyMDowOToyOSAtMDMwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8ci52ZXJkZWpvQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6CisJICBzaG91dDJzZW5kOiBjbGFyaWZ5IG1lYW5pbmcgb2YgdGhlIFVSTCBwcm9wCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIxMzQyCisKKzIwMTMtMTItMjcgMTI6Mjc6MzIgLTAzMDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHIudmVyZGVqb0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkgIHNob3V0MnNlbmQ6IGRvY3MsIGFkZCBhIHNhbXBsZSBwaXBlbGluZQorCSAgQW5kIGZpbmlzaCBhZGRpbmcgc2hvdXQyc2VuZCB0byB0aGUgZG9jcyB3aGlsZSBhdCBpdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMTM0MgorCisyMDEzLTEyLTMxIDE1OjAwOjIyIC0wMzAwICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyLnZlcmRlam9Ac2lzYS5zYW1zdW5nLmNvbT4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5jOgorCSAgZ2RrcGl4YnVmb3ZlcmxheTogcmVtb3ZlIHNwdXJpb3VzIEBzZWVfYWxzbworCisyMDEzLTEyLTA2IDE3OjA4OjU0ICswMDAwICBNYXR0aGlldSBCb3Vyb24gPG1hdHRoaWV1LmJvdXJvbkBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBzdXBwb3J0IGFueSB2aWRlbyBmb3JtYXRzIGFuZCBhbnkgY2FwcyBmZWF0dXJlcyBpZiBkZWludGVybGFjZSBtb2RlIGFsbG93cyBpdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxOTYzNgorCisyMDEzLTEyLTMxIDEzOjMxOjUyICswMTAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJyYXNAaG90bWFpbC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IEhhbmRsZSB2NGwyX2lvY3RsKCkgZXJyb3JzIGV2ZW4gaW4gZXJyb3IgaGFuZGxpbmcKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MjEyNjgKKworMjAxNC0wMS0wMSAxMjoxMTo0MyAtMDgwMCAgSmVyZW15IEh1ZGRsZXN0b24gU2VxdW9pYSA8amVyZW15aHVAYXBwbGUuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vTWFrZWZpbGUuYW06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlbzogdW5pZmRlZiAtRFJVTl9OU19BUFBfVEhSRUFECisKKzIwMTQtMDEtMDEgMTI6MTA6MDEgLTA4MDAgIEplcmVteSBIdWRkbGVzdG9uIFNlcXVvaWEgPGplcmVteWh1QGFwcGxlLmNvbT4KKworCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJICBvc3h2aWRlbzogQXNzdW1lIFNESyBhbmQgZGVwbG95bWVudCB0YXJnZXQgYXJlIGF0IGxlYXN0IFNub3cgTGVvcGFyZAorCisyMDE0LTAxLTAxIDEyOjIzOjUwIC0wODAwICBKZXJlbXkgSHVkZGxlc3RvbiBTZXF1b2lhIDxqZXJlbXlodUBhcHBsZS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogRGlzYWJsZSBvc3h2aWRlbyBvbiBMZW9wYXJkIGFuZCBlYXJsaWVyCisJICBUaGlzIGFsc28gbW92ZXMgdGhlICJvdGhlciBwbGF0Zm9ybXMiIGNoZWNrIGluIE9TIFggdmlkZW8gdG8gYmVmb3JlIHRoZQorCSAgdmFyaWFibGUgaXMgcmVhZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMTI0NQorCisyMDEzLTEyLTMxIDE0OjU3OjI3ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJICB0ZXN0czogYWRkIEFVWCByZWNlaXZlciB1bml0IHRlc3QKKworMjAxMy0xMi0zMSAxMzoyMDowMSArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jOgorCSAgdGVzdHM6IGltcHJvdmUgcnRwYmluIHRlc3QKKworMjAxMy0xMi0zMSAxMzoxNjo0NiArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBhZGQgc29tZSBkb2NzIGFib3V0IEFVWCBlbGVtZW50cworCisyMDEzLTEyLTMxIDEzOjAxOjIyICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJICB0ZXN0czogYWRkIEFVWCBzZW5kZXIgdW5pdCB0ZXN0CisKKzIwMTMtMTItMzEgMTI6MzE6MjUgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgcnRwYmluOiBhZGQgc3VwcG9ydCBmb3IgQVVYIHNlbmRlciBhbmQgcmVjZWl2ZXIKKwkgIEFVWCBlbGVtZW50cyBhcmUgZWxlbWVudHMgdGhhdCBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0aGUgcnRwYmluCisJICBwaXBlbGluZSByaWdodCBiZWZvcmUgb3IgYWZ0ZXIgMSBvciBtb3JlIHNlc3Npb24gZWxlbWVudHMuCisJICBUaGUgQVVYIGVsZW1lbnRzIGFyZSBlc3NlbnRpYWwgZm9yIGltcGxlbWVudGluZyBmdW5jdGlvbmFsaXR5IHN1Y2gKKwkgIGFzIGVycm9yIGNvcnJlY3Rpb24gKEZFQykgYW5kIHJldHJhbnNtaXNzaW9uIChSVFgpLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMTA4NworCisyMDEzLTEyLTMxIDEyOjIyOjM5ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJICB0ZXN0czogYWRkIGRlY29kZXIgdGVzdAorCisyMDEzLTEyLTMwIDE3OjM2OjQyICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IG1ha2UgcmVxdWVzdF9lbGVtZW50IG1ldGhvZCBpbnRlcm5hbGx5CisJICBXZSBjYW4gdXNlIHRoZSBzYW1lIG1ldGhvZCB0byBjcmVhdGUgZW5jb2RlciBhbmQgZGVjb2RlciBlbGVtZW50cywgdGhleQorCSAgYXJlIGp1c3QgaW50ZXJuYWwgZWxlbWVudHMgdGhhdCB3ZSBjcmVhdGUuCisKKzIwMTMtMTItMzEgMTA6MjU6MjggKzAxMDAgIFN0w6lwaGFuZSBDZXJ2ZWF1IDxzY2VydmVhdUBnbWFpbC5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IFNraXAgaWQzIHRhZworCSAgU2tpcCBpZDMgdGFnIGR1cmluZyB3YXYgcGFyc2UuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIxMjQxCisKKzIwMTMtMTItMzEgMTA6MTA6MDUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uaDoKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5tOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSAgb3N4OiBNYWtlIE9TWCB2ZXJzaW9uIGNoZWNrcyBtb3JlIGNvbnNpc3RlbnQKKwkgIEFuZCBlc3BlY2lhbGx5IGFsc28gY29uc2lkZXIgdXBkYXRlIHZlcnNpb25zLCBlLmcuIDEwLjUgd2l0aCB1cGRhdGVzCisJICB3aWxsIGJlIDEwNTEgb3Igc2ltaWxhciBhbmQgdGh1cyBiaWdnZXIgdGhhbiBNQUNfT1NfWF9WRVJTSU9OXzEwXzUgYnV0CisJICBzdGlsbCB3b24ndCBoYXZlIHRoZSBBUEkgd2Ugd2FudCB0byB1c2UuCisKKzIwMTMtMTItMzEgMTA6MDc6MjIgKzAxMDAgIEplcmVteSBIdWRkbGVzdG9uIDxqZXJlbXlodUBmcmVlZGVza3RvcC5vcmc+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkgIG9zeHZpZGVvc2luazogRml4IGJ1aWxkIG9uIHVwZGF0ZWQgT1MgWCBMZW9wYXJkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIxMjQ1CisKKzIwMTMtMTItMzAgMTc6MjM6MjIgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IEFkZCBtaXNzaW5nIGJyZWFrCisJICBJIGd1ZXNzIG5vLW9uZSBub3RpY2VkIHdlIG5vIGxvbmdlciBjb3VsZCBtdXggV01WMyAuLi4KKwkgIENPVkVSSVRZIENJRCAxMTM5NzU5CisKKzIwMTMtMTItMzAgMTc6MjA6MzcgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSAgcnRwdnJhd3BheTogQWRkIG1pc3NpbmcgYnJlYWsKKwkgIENPVkVSSVRZIENJRCAxMTM5NzYyCisKKzIwMTMtMTItMzAgMTc6MDA6NDUgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBpbnRlcm5hbC1zc3JjIGlzIG5vIGxvbmdlciBkZXByZWNhdGVkCisKKzIwMTMtMTItMzAgMTY6NTk6MjAgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogYWRkIFNpbmNlIHRhZ3MKKworMjAxMy0xMi0zMCAxNjo1MjoyOCArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICBydHBiaW46IGFkZCBzaWduYWwgZm9yIG5ldyBqaXR0ZXJidWZmZXIKKwkgIEVtaXQgYSBzaWduYWwgd2hlbiBhIG5ldyBqaXR0ZXJidWZmZXIgaXMgY3JlYXRlZCBzbyB0aGF0IHRoZSBhcHAgY2FuCisJICBoYXZlIGEgY2hhbmNlIHRvIGNvbmZpZ3VyZSBpdC4KKworMjAxMy0xMi0zMCAxNjoyODo1NyArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJICBydHBiaW46IGhhbmRsZSBtdWx0aXBsZSBlbmNvZGVyIGluc3RhbmNlcworCSAgS2VlcCB0cmFjayBvZiBlbGVtZW50cyB0aGF0IGFyZSBhZGRlZCB0byBtdWx0aXBsZSBzZXNzaW9ucyBhbmQgbWFrZSBzdXJlCisJICB3ZSBvbmx5IGFkZCB0aGVtIHRvIHRoZSBydHBiaW4gb25jZSBhbmQgdGhhdCB3ZSBjbGVhbiB0aGVtIHdoZW4gbm8KKwkgIHNlc3Npb24gcmVmZXJzIHRvIHRoZW0gYW55bW9yZS4KKworMjAxMy0xMi0zMCAxNToxNjowOSArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jOgorCSAgdGVzdHM6IGFkZCB1bml0IHRlc3QgZm9yIGVuY29kZXIgZWxlbWVudAorCisyMDEzLTEyLTMwIDE1OjE1OjQzICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IGZpeCBtZW1vcnkgbGVha3MKKworMjAxMy0xMi0zMCAxNTowMzozNCArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jOgorCSAgdGVzdHM6IGZpeCBsZWFrCisKKzIwMTMtMTItMzAgMTU6MDA6NTAgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogZXhwZWN0IHRoZSBwYWRzIG9uIHRoZSBlbmNvZGVycworCSAgRG9uJ3QgdXNlIHJlcXVlc3QgcGFkcyBmb3IgdGhlIGVuY29kZXIgZWxlbWVudHMsIHRoZSBzaWduYWwgaGFuZGxlcgorCSAgc2hvdWxkIHJlcXVlc3QgdGhlIHBhZHMgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZSBhdmFpbGFibGUgd2l0aCB0aGUgcmlnaHQKKwkgIG5hbWUuCisKKzIwMTMtMTItMzAgMTQ6NTY6MDcgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgcnRwYmluOiByZXF1ZXN0LXJ0cC1lbmNvZGVyIGFyZSBubyBhY3Rpb24gc2lnbmFscworCSAgVGhlIHJlcXVlc3QtcnRwLWVuY29kZXIgc2lnbmFscyBhcmUgbm90IGFjdGlvbiBzaWduYWxzIHNvIG1hcmsgdGhlbQorCSAgY29ycmVjdGx5IGFuZCB1c2UgYW4gYWNjdW11bGF0b3IgdG8gY29sbGVjdCB0aGUgcmVzdWx0IHZhbHVlLgorCisyMDEzLTEyLTMwIDE0OjM2OjQ1ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBlbWl0IG1pZGktYmFzZS1ub3RlIHRhZyBmcm9tIGRhdGEgaW4gJ3NtcGwnIGNodW5rCisJICBBZGQgcGFyc2luZyBvZiB0aGUgJ3NtcGwnIGNodW5rLiBSaWdodCBub3cgd2Ugb25seSBncmFiIHRoZSBtaWRpLWJhc2Utbm90ZSBhbmQKKwkgIGVtaXQgaXQgYXMgYSB0YWcuCisKKzIwMTMtMTItMjYgMTI6MDU6MTkgKzAyMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIGdzdHJ0cHNlc3Npb246IHN1Z2dlc3QgdXBzdHJlYW0gdG8gdXNlIHRoZSBuZXcgImludGVybmFsLXNzcmMiIGFmdGVyIGEgY29sbGlzaW9uCisJICBXaGVuIGEgY29sbGlzaW9uIGlzIGZvdW5kIG9uIHRoZSBpbnRlcm5hbCBzc3JjLCB3ZSBoYXZlIHRvIGNoYW5nZSBpdC4KKwkgIElkZWFsbHksIHdlIHdhbnQgYWxzbyB0aGUgcGF5bG9hZGVyIHVwc3RyZWFtIHRvIGZvbGxvdyB0aGlzIGNoYW5nZSBhbmQgdXNlCisJICB0aGUgbmV3IGludGVybmFsIHNzcmMuIElkZWFsbHkgd2Ugd2FudCB0aGlzIGNvbmRpdGlvbiB0byBiZSBhbHdheXMgbWV0OgorCSAgaWYgdGhlcmUgaXMgb25lIHBheWxvYWRlciBzZW5kaW5nIG9uIHRoaXMgc2Vzc2lvbiwgaXRzIHNzcmMgc2hvdWxkIG1hdGNoIHRoZQorCSAgaW50ZXJuYWwgc3NyYy4KKworMjAxMy0xMi0yNiAxMTowNDoyOSArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogYWxsb3cgc2V0dGluZyBpbnRlcm5hbC1zc3JjIGFnYWluCisKKzIwMTMtMTItMzAgMTM6MzE6NDUgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICB5NG1lbmNvZGU6IFJlbW92ZSBkZWFkIGNvZGUKKwkgIHNldC9nZXQgcHJvcGVydHkgaXNuJ3QgdXNlZAorCisyMDEzLTEyLTMwIDEzOjMwOjI0ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHFjZWxwZGVwYXkuYzoKKwkgIHJ0cHFjZWxwZGVwYXk6IFJlbW92ZSB1bmVlZGVkIHZhcmlhYmxlCisKKzIwMTMtMTItMDUgMTU6NTM6NTIgLTA4MDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdcOpIDxhbGVpeEBvYmxvbmcuY29tPgorCisJICBydHBiaW46IGFsbG93IGR5bmFtaWMgUlRQL1JUQ1AgZW5jb2RlcnMvZGVjb2RlcnMKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLltjaF06IGZvdXIgbmV3IGFjdGlvbiBzaWduYWxzIGhhdmUgYmVlbgorCSAgYWRkZWQgKHJlcXVlc3QtcnRwLWVuY29kZXIsIHJlcXVlc3QtcnRwLWRlY29kZXIsIHJlcXVlc3QtcnRjcC1lbmNvZGVyCisJICBhbmQgcmVxdWVzdC1ydGNwLWRlY29kZXIpLiBUaGUgdXNlciB3aWxsIGJlIGFibGUgdG8gcHJvdmlkZSBlbmNvZGVycworCSAgb3IgZGVjb2RlcnMgZHluYW1pY2FsbHkuIFRoZSBlbmNvZGVycyBtdXN0IGZvbGxvdyB0aGUgc3J0cGVuYyBBUEkgYW5kCisJICB0aGUgZGVjb2RlcnMgdGhlIHNydHBkZWMgQVBJLiBIYXZpbmcgc2VwYXJhdGUgc2lnbmFscyBmb3IgUlRQIGFuZCBSVENQCisJICBhbGxvd3MgdGhlIHVzZXIgdG8gdXNlIGRpZmZlcmVudCBlbmNvZGVycy9kZWNvZGVycyBvciBwcm92aWRlIHRoZSBzYW1lCisJICBvbmUgKGUuZy4gdGhhdCB3b3VsZCBiZSB0aGUgY2FzZSBmb3Igc3J0cGVuYykuCisJICBBbHNvLCBydHBiaW4gbm93IGFsbG93cyBhcHBsaWNhdGlvbi94LXNydHAgaW4gaXRzIHBhZHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzE5OTM4CisKKzIwMTMtMTItMjcgMTY6NTE6MzIgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogZHluYW1pY2FsbHkgcmVjYWxjdWxhdGUgUlRYIHBhcmFtZXRlcnMKKwkgIFVzZSB0aGUgcm91bmQtdHJpcC10aW1lIGFuZCBhdmVyYWdlIGppdHRlciB0byBkeW5hbWljYWxseSBjYWxjdWxhdGUgdGhlCisJICByZXRyYW5zbWlzc2lvbiBpbnRlcnZhbCBhbmQgZXhwZWN0ZWQgcGFja2V0IGFycml2YWwgdGltZS4KKwkgIEJhc2VkIG9uIHBhdGNoZXMgZnJvbSBUb3JyaWUgRmlzY2hlciA8dG9ycmllLmZpc2NoZXJAY29sbGFib3JhLmNvLnVrPgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMTQxMgorCisyMDEzLTEyLTI3IDE2OjUwOjUyICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGNhbGN1bGF0ZSBhdmVyYWdlIGppdHRlcgorCisyMDEzLTEyLTI3IDE2OjQ4OjQ4ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiB1c2UgUlRUIGZyb20gdGhlIFJldHJhbnNtaXNzaW9uIGV2ZW50CisJICBQbGFjZSB0aGUgZXN0aW1hdGVkIFJUVCBpbiB0aGUgUmV0cmFuc21pc3Npb24gZXZlbnQgYW5kIGxldCB0aGUgc2Vzc2lvbgorCSAgbWFuYWdlciB1c2UgdGhhdCBpbnN0ZWFkIG9mIHRoZSBoYXJkY29kZWQgdmFsdWUuCisKKzIwMTMtMTItMjcgMTU6NTc6MzkgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogdGFrZSBtb3JlIGFjY3VyYXRlIHJ1bm5pbmctdGltZSBmb3IgTkFDSworCSAgRG9uJ3QgdXNlIHRoZSBjdXJyZW50IHRpbWUgY2FsY3VsYXRlZCBmcm9tIHRoZSB0bWllb3V0IGxvb3AgZm9yIHdoZW4gd2UKKwkgIGxhc3Qgc2NoZWR1bGVkIHRoZSBOQUNLIGJlY2F1c2UgaXQgbWlnaHQgYmUgdW5zY2hlZHVsZWQgYmVjYXVzZSBvZiBhIG1heAorCSAgcGFja2V0IG1pc29yZGVyIGFuZCB0aGVuIHdlIGRvbid0IGFjY3VyYXRlbHkgY2FsY3VsYXRlIHRoZSBjdXJyZW50IHRpbWUuCisJICBJbnN0ZWFkLCB0YWtlIHRoZSBjdXJyZW50IGVsZW1lbnQgcnVubmluZyB0aW1lIHVzaW5nIHRoZSBjbG9jay4KKworMjAxMy0xMi0zMCAxMTowNjozOCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja2RlYy5jOgorCSAgd2F2cGFja2RlYzogU2VuZCBhIENBUFMgZXZlbnQgaW4gdGhlIHVuaXQgdGVzdAorCisyMDEzLTEyLTI3IDAyOjE0OjAyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGltcHJvdmUgbXNzX21vZGUvZnJhZ21lbnRlZCBzcGVjaWFsIGhhbmRsaW5nCisJICBNYWtlIGl0IGNsZWFyIHdoYXQgc2hvdWxkIGJlIGhhbmRsZWQgcHVyZWx5IGJ5IG1zcyBtb2RlOgorCSAgMSkgRXhwb3NlIHRoZSBzdHJlYW1zIG9uIHRoZSBmaXJzdCBtb29mIGFzIHRoZXJlIGFyZSBubyBtb292IGF0b21zCisJICAyKSBQcm9wZXJseSBjbGVhbnVwIHN0cmVhbXMgb24gZmx1c2hlcworCSAgQWRkIGEgbm90ZSBhYm91dCB0aGUgbWVhbmluZyBvZiB1cHN0cmVhbV9uZXdzZWdtZW50IGFuZCBtc3NfbW9kZQorCSAgZm9yIGZ1dHVyZSByZWZlcmVuY2UuCisJICBNYWtlIGFsbCBvdGhlciBzcGVjaWFsIGZyYWdtZW50IGhhbmRsaW5nIHNoYXJlZCBmb3IgYm90aCBkYXNoCisJICBhbmQgbXNzIHN0cmVhbXMuCisKKzIwMTMtMTItMTIgMTA6NTA6MjcgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRyYWluIHRoZSBhZGFwdGVyIGJlZm9yZSBwdXNoaW5nIEVPUworCSAgSW4gYSBmcmFnbWVudGVkIHNjZW5hcmlvLCBxdGRlbXV4IGlzIG9wZXJhdGluZyBpbiBwdXNoIG1vZGUKKwkgIGFuZCBpdCBnZXRzIGEgZnJhZ21lbnRlZCBidWZmZXIuIFdoaWxlIHByb2Nlc3NpbmcgaXRzIGRhdGEKKwkgIGRvd25zdHJlYW0gZ2V0cyB1bmxpbmtlZCAob3IgYSBpbnB1dC1zZWxlY3RvciBjaGFuZ2VzIGl0cworCSAgYWN0aXZlIHBhZCBhbmQgcmV0dXJucyBub3QtbGlua2VkKS4gUXRkZW11eCBzdG9wcyBwcm9jZXNzaW5nCisJICB0aGlzIGZyYWdtZW50IGFuZCByZXR1cm5zIG5vdC1saW5rZWQgdXBzdHJlYW0sIGxlYXZpbmcgdGhlCisJICByZW1haW5pbmcgZGF0YSBpbiBpdHMgYWRhcHRlci4KKwkgIFdoZW4gaXQgZ2V0cyBhbiBFT1MgaXQgc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IGFsbCB0aGUgZGF0YSBpdAorCSAgaGFkIHJlY2VpdmVkIGlzIHB1c2hlZCBiZWZvcmUgcHVzaGluZyBFT1MuCisKKzIwMTMtMTItMjYgMjM6MjE6NDcgLTAzMDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHIudmVyZGVqb0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSAgc2hvdXQyc2VuZDogZHJvcCBJUCBvbmx5IHJlcXVpcmVtZW50IGZvciBfc2V0X2hvc3QoKQorCSAgbGlic2hvdXQyICh3ZSByZXF1aXJlID4gMi4wIGF0IGNvbmZpZyB0aW1lKSBzdXBwb3J0cworCSAgYm90aCBJUCBhbmQgaG9zdG5hbWUgZm9yIF9zZXRfaG9zdCgpLiBEcm9wcGVkIGFuCisJICBvdXRkYXRlZCBGSVhNRSByZWdhcmRpbmcgdGhpcyBsaW1pdGF0aW9uLCBhZGp1c3RlZAorCSAgc29tZSBjb21tZW50cyBhbmQgY2hhbmdlZCB0aGUgcGFyYW0gYmx1cmIgdG8gcmVmbGVjdAorCSAgdGhpcyB0b28uCisKKzIwMTMtMTItMjYgMjE6NDM6MzQgLTAzMDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHIudmVyZGVqb0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSAgc2hvdXQyc2VuZDogUmV0YXJnZXQgRklYTUUgdG8gMi4wCisKKzIwMTMtMTItMjYgMTE6MjE6MzYgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiB1c2UgYWdncmVnYXRlIGNvbnRyb2wgZm9yIFBMQVkvUEFVU0UvVEVBUkRPV04KKwkgIFVzZSB0aGUgYWdncmVnYXRlIGNvbnRyb2wgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgcmVxdWVzdCB1cmwgdG8gcGVyZm9ybQorCSAgUEFVU0UvUExBWSBhbmQgVEVBUkRPV04uCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIxMDAzCisKKzIwMTMtMTItMjQgMTQ6NDA6MjUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYzoKKwkgIHJuZGJ1ZmZlcnNpemU6IFByb3h5IENBUFMsIEFMTE9DQVRJT04sIFNDSEVEVUxJTkcgYW5kIHNyY3BhZCBldmVudHMgcHJvcGVybHkKKworMjAxMy0xMi0yNCAwMDo0MzozOSArMDEwMCAgTmljb2xhIE11cmlubyA8bmljb2xhLm11cmlub0BnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBhZHBjbSBtYXggYmxvY2sgYWxpZ24gaXMgODE5MgorCisyMDEzLTEyLTIzIDEyOjIzOjI3IC0wNjAwICBCcmVuZGFuIExvbmcgPGIubG9uZ0BjYWJsZWxhYnMuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICB2cDlkZWM6IFJlcXVpcmUgdnB4ID49IDEuMy4wIGZvciBidWlsZGluZyB2cDlkZWMgYW5kIHZwOWVuYworCSAgUHJldmlvdXMgdmVyc2lvbnMgZGlkIG5vdCBoYXZlIGEgc3RhYmxlIGJpdHN0cmVhbSBmb3IgVlA5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDk4NgorCisyMDEzLTEyLTIzIDE1OjQ2OjQ4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogVXNlIGNvcnJlY3QgY29kZWMgaWQgZm9yIEFEUENNL0RWSQorCisyMDEzLTEyLTIzIDE1OjQ0OjMwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IENoZWNrIGZvciB0aGUgY29ycmVjdCBzaXplIG9mIGNvZGVjX2RhdGEgaW4gdGhlIEFDTSBjYXNlCisKKzIwMTItMDEtMTQgMTk6NTg6MTcgKzAxMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogYmFzaWMgYWRwY20gc3VwcG9ydAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NDMzOQorCisyMDEzLTEyLTIwIDExOjQ1OjM4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L2Rlc2NyaXB0b3JzLmM6CisJICBxdGRlbXV4OiBGaXggY2FsY3VhdGlvbiBvZiBkZXNjcmlwdG9yIGxlbmd0aAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDgxMworCisyMDEzLTEyLTIyIDIyOjMzOjM5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBhdXRvZ2VuLnNoOgorCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGRiZWRhYTAgdG8gZDQ4YmVkMworCisyMDEzLTEyLTIyIDIxOjU2OjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBwby9NYWtldmFyczoKKwkgIHBvOiBzZXQgZ2V0dGV4dCBkb21haW4gaW4gTWFrZXZhcnMgc28gd2UgZG9uJ3QgaGF2ZSB0byBwYXRjaCB0aGUgZ2VuZXJhdGVkIE1ha2VmaWxlLmluLmluCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA1NDU1CisKKzIwMTMtMTItMTkgMTY6NTA6MTAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IG9uIHJlY2VpdmUgZXJyb3Igb25seSB1bm1hcCBhbmQgdW5yZWYgYnVmZmVyIGlmIG9uZSB3YXMgYWxsb2NlZCBhbmQgbWFwcGVkCisJICBjb3Zlcml0eSBDSUQgMTEzOTg2Ni4KKworMjAxMy0xMi0xOSAxMjo0NzoyMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazogZml4IG1pc2xlYWRpbmcgY29tbWVudAorCSAgVGhvc2UgYXJlIG5vdCBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLgorCisyMDEzLTEyLTE3IDE4OjI4OjI1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICB2cHg6IE1hcmsgVlA5IHN1cHBvcnQgYXMgbm9uLWV4cGVyaW1lbnRhbAorCSAgVGhlcmUgd2FzIGEgbGlidnB4IHJlbGVhc2Ugd2l0aCBWUDkgc3VwcG9ydCBub3cgYW5kIHRoZSBiaXRzdHJlYW0KKwkgIGlzIGZyb3plbiB0b28uCisKKzIwMTMtMTItMTUgMjE6MDQ6MTEgLTA4MDAgIFRvZGQgQWd1bG5pY2sgPHRvZGRAYWd1bG5pY2suY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIFNvbWUgY29tcGlsZXIgd2FybmluZyBmaXhlcyB0byBzYXRpc2Z5IFhDb2RlIGNvbXBpbGVyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIwNTEzCisKKzIwMTMtMTItMTYgMTY6MTc6MDcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJICBpZDN2Mm11eDogU2V0IHBpY3R1cmUgdHlwZSBpbiB0aGUgQVBJQyBmcmFtZXMKKworMjAxMy0xMi0xNiAxNjoxNDo1MiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkgIGlkM3YybXV4OiBTZXQgaW1hZ2UtZGVzY3JpcHRpb24gZnJvbSB0aGUgaW5mbyBzdHJ1Y3QsIG5vdCB0aGUgY2FwcworCisyMDEzLTEyLTE2IDEwOjAyOjM3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuaDoKKwkgIHdhdnBhY2twYXJzZTogUG9zdCBBVURJT19DT0RFQyB0YWcKKworMjAxMy0xMi0xNiAxMDowMDozNyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5oOgorCSAgc2JjcGFyc2U6IFBvc3QgQVVESU9fQ09ERUMgdGFnCisKKzIwMTMtMTItMTYgMDk6NTg6MzEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oOgorCSAgZmxhY3BhcnNlOiBQb3N0IEFVRElPX0NPREVDIHRhZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcyMDUxMgorCisyMDEzLTEyLTE2IDA5OjU2OjI5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmg6CisJICBkY2FwYXJzZTogUG9zdCBBVURJT19DT0RFQyB0YWcKKworMjAxMy0xMi0xNiAwOTo1NDozOCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5oOgorCSAgYW1ycGFyc2U6IFBvc3QgQVVESU9fQ09ERUMgdGFnCisKKzIwMTMtMTItMTYgMDk6NDk6NDggKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuaDoKKwkgIGFjM3BhcnNlOiBQb3N0IEFVRElPX0NPREVDIHRhZworCisyMDEzLTEyLTE2IDA5OjQ2OjE2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmg6CisJICBhYWNwYXJzZTogUG9zdCBBVURJT19DT0RFQyB0YWcKKworMjAxMy0xMi0xNiAwOTo0MToxNCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgbXBlZ2F1ZGlvcGFyc2U6IFVzZSBwYnV0aWxzIGZ1bmN0aW9uYWxpdHkgdG8gY3JlYXRlIHRoZSBBVURJT19DT0RFQyB0YWcKKworMjAxMy0xMi0xMyAxNzozNjozNiAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogQWRkIGVycm9yIG1lc3NhZ2UgaWYgdGhlIGFwcCB0cmllcyB0byBzZXQgdGhlIGludGVybmFsLXNzcmMKKworMjAxMy0xMi0xMyAxNjowODozNSAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogT25seSBjb3VudCBuYWNrcyB3aGVuIGEgbmFjayBwYWNrZXQgaXMgcmVjZWl2ZWQKKwkgIE5vdCB3aGVuIGFueSBSVENQIGZlZWRiYWNrIHBhY2tldCBpcy4KKworMjAxMy0xMi0xMiAyMzoyMjo0MSAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwY29sbGlzaW9uLmM6CisJICB0ZXN0czogSW5pdGlhbGl6ZSBzZWdtZW50IGluIHJ0cGNvbGxpc2lvbiB0ZXN0CisKKzIwMTMtMTItMTMgMTU6NTc6MzYgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IFByb2Nlc3MgUFNGQiBGSVIgcmVxdWVzdHMgd2hpY2ggbGFjayB0aGUgbWVkaWEgc3NyYworCSAgQWNjb3JkaW5nIHRvIFJGQyA1MTA0IHNlY3Rpb24gNC4zLjEuMiwgUlRDUCBQU0ZCIEZJUiBtZXNzYWdlIFNIQUxMCisJICBoYXZlIGEgbWVkaWFfc3NyYyBmaWVsZCBzZXQgdG8gMC4gVGhlIGFjdHVhbCBtZWRpYSBzc3JjIGlzIGluIHRoZSBGQ0kuCisJICBTbyBpbiB0aGF0IGNhc2UsIHdlIGlnbm9yZSB0aGUgcmV0YWluZWQgZmVlZGJhY2sgYW5kIGp1c3QgbGV0IGl0IHRocm91Z2gKKwkgIHRvIHRoZSBydHBfc2Vzc2lvbl9wcm9jZXNzX2ZpcigpIGZ1bmN0aW9uIHdoaWNoIHdpbGwgY2hlY2sgZm9yIHRoZSBhY3R1YWwKKwkgIFNTUkMgaW5zaWRlIHRoZSBGQ0kuCisJICBGaXhlcyBhIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBieSBjb21taXQgNTdjMjdlYzMKKworMjAxMy0xMS0xNCAxNjoxOToyOSArMDIwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIHJ0cHNlc3Npb246IGZpeCByYiBibG9ja3MgZGlzYXBwZWFyaW5nIGFmdGVyIHRoZSBmaXJzdCBydGNwIGN5Y2xlIHdpdGggbXVsdGlwbGUgc2VuZGVycworCSAgUHJldmlvdXNseSwgd2hlbiB0aGUgc2Vzc2lvbiBoYWQgbXVsdGlwbGUgaW50ZXJuYWwgc2VuZGVyIFNTUkNzLCBpdCB3b3VsZAorCSAgaXNzdWUgU1IgcmVwb3J0cyB3aXRoIFJCIGJsb2NrcyBvbmx5IG9uIHRoZSBmaXJzdCBSVENQIHRpbWVvdXQgYW5kIGFmdGVyd2FyZHMKKwkgIFNSIHJlcG9ydHMgd291bGQgYmUgc2VudCBlbXB0eS4gVGhpcyB3YXMgYmVjYXVzZSB0aGUgImdlbmVyYXRpb24iIG51bWJlcgorCSAgaW4gUlRQU291cmNlIHdvdWxkIGluY3JlYXNlIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgc2FtZSBjeWNsZSBhbmQgYWZ0ZXJ3YXJkcworCSAgaXQgd291bGQgYWx3YXlzIGJlIGdyZWF0ZXIgdGhhbiB0aGUgc2Vzc2lvbidzIGdlbmVyYXRpb24sIHdoaWNoIHdvdWxkIGNhdXNlCisJICBpdCB0byBiZSBza2lwcGVkIGZyb20gYmVpbmcgaW5jbHVkZWQgaW4gUkJzLgorCSAgVGhpcyBjb21taXQgZml4ZXMgdGhpcyBwcm9ibGVtIGJ5OgorCSAgMSkgSW5jcmVhc2luZyB0aGUgUlRQU291cmNlIGdlbmVyYXRpb24gb25seSBhdCB0aGUgZW5kIG9mIGVhY2ggY3ljbGUsCisJICB3aGljaCBlc3NlbnRpYWxseSBmaXhlcyB0aGUgcHJvYmxlbSBidXQgb25seSB3aGVuIHRoZSBpbnRlcm5hbCBzZW5kZXJzCisJICBhcmUgbGVzcyB0aGFuIEdTVF9SVENQX01BWF9SQl9DT1VOVC4KKwkgIDIpIEtlZXBpbmcgZm9yIGVhY2ggUlRQU291cmNlIGEgc2V0IG9mIFNTUkNzIHdoaWNoIHN0b3JlcyB3aGljaCBTU1JDJ3MKKwkgIFNSIHRoZSBnaXZlbiBSVFBTb3VyY2UgaGFzIGJlZW4gcmVwb3J0ZWQgaW4sIHdoaWNoIGFsc28gZml4ZXMgdGhlIHByb2JsZW0KKwkgIHdoZW4gdGhlIGludGVybmFsIHNlbmRlcnMgYXJlIG1vcmUgdGhhbiBHU1RfUlRDUF9NQVhfUkJfQ09VTlQuIFRoaXMgaXMKKwkgIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIHRoZSBmYWN0IHRoYXQgYW55IFJUUFNvdXJjZSBpcyBtYXJrZWQgYXMgcmVwb3J0ZWQKKwkgIGluIGl0c2VsZidzIFNSIGFuZCBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIGtub3cgaWYgaXQgaGFzIGJlZW4gcmVwb3J0ZWQKKwkgIGluIG90aGVyIFNScyB0b28gb3Igbm90LCBhbmQgd2hpY2guCisKKzIwMTMtMTEtMTQgMTY6MjM6MzUgKzAyMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHNlc3Npb24uYzoKKwkgIHRlc3RzL2NoZWNrOiBhZGQgYW4gcnRwc2Vzc2lvbiB1bml0IHRlc3QgdG8gdmVyaWZ5IGFsbCBSQnMgYXJlIGluY2x1ZGVkIGluIGFsbCBTUnMsIHJvdW5kcm9iaW4KKwkgIFRoaXMgdGVzdCBjaGVja3MgdGhhdCB3aGVuIHdlIGhhdmUgbXVsdGlwbGUgaW50ZXJuYWwgc2VuZGVyIHNvdXJjZXMKKwkgIGluIHJ0cHNlc3Npb24sIFNScyBjb250YWluIFJCcyBmb3IgZXZlcnkgb3RoZXIgc2VuZGVyIHNvdXJjZSwgYW5kIHRoYXQKKwkgIHRoZXkgYXJlIGluY2x1ZGVkIHJvdW5kcm9iaW4gd2hlbiB0aGV5IGV4Y2VlZCBTVF9SVENQX01BWF9SQl9DT1VOVCwKKwkgIHdoaWNoIGlzIHRoZSBtYXggbnVtYmVyIG9mIFJCcyB0aGF0IGNhbiBmaXQgaW4gYSBTUi4KKworMjAxMy0xMi0xMiAxNjowMToxMCArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGRvY3MvZGVzaWduL2Rlc2lnbi1ydHBjb2xsaXNpb24udHh0OgorCSAgZG9jczogaW1wcm92ZSBkb2NzCisKKzIwMTMtMTEtMDUgMTg6MDM6NDggKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL2Rlc2lnbi9NYWtlZmlsZS5hbToKKwkqIGRvY3MvZGVzaWduL2Rlc2lnbi1ydHBjb2xsaXNpb24udHh0OgorCSAgZG9jOiBhZGQgZGVzaWduLXJ0cGNvbGxpc2lvbi50eHQgdGhhdCBleHBsYWlucyB3aGVuIEdzdFJUUENvbGxpc2lvbiBpcyBjcmVhdGVkCisJICBJdCBhbHNvIHRhbGtzIGFib3V0ICJCWUUgb25seSB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UsIG5vdCB0aGUgd2hvbGUgc2Vzc2lvbi4iCisKKzIwMTMtMTEtMDUgMTI6MzE6NTQgKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBjb2xsaXNpb24uYzoKKwkgIHRlc3RzL2NoZWNrOiBpbXByb3ZlIHJ0cGNvbGxpc2lvbjo6dGVzdF9tYXN0ZXJfc3NyY19jb2xsaXNpb24gdG8gZW5zdXJlIHRoYXQgYSBjb2xsaXNpb24gZG9lcyBub3QgQllFIHRoZSB3aG9sZSBzZXNzaW9uCisJICBDb25mbGljdHM6CisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBjb2xsaXNpb24uYworCisyMDEzLTExLTAxIDE3OjA3OjU3ICswMDAwICBKdWxpZW4gSXNvcmNlIDxqdWxpZW4uaXNvcmNlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwY29sbGlzaW9uLmM6CisJICB0ZXN0cy9jaGVjazogYWRkIHJ0cGNvbGxpc2lvbjo6dGVzdF9tYXN0ZXJfc3NyY19jb2xsaXNpb24gdW5pdCB0ZXN0CisJICBJdCBjaGVja3MgdGhlIHBheWxvYWRlciBjaGFuZ2VzIGl0cyBzc3JjIHdoZW4gY29sbGlzaW9uIGhhcHBlbnMKKworMjAxMy0xMi0xMiAxMDozODo0MyArMDEwMCAgR2VvcmdlIEtpYWdpYWRha2lzIDxnZW9yZ2Uua2lhZ2lhZGFraXNAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjoga2VlcCBleHRyYSBzdGF0cyBmb3Igc2NoZWR1bGluZyBCWUUKKwkgIEtlZXAgYW4gZXh0cmEgc3RhdHMgc3RydWN0dXJlIGZvciBzY2hlZHVsaW5nIHRoZSBCWUUgcGFja2V0cy4gV2hlbiB3ZQorCSAgZGVjaWRlIHRvIHNjaGVkdWxlIEJZRSwgbWFrZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgc3RhdHMgaW50byB0aGUKKwkgIGJ5ZV9zdGF0cy4gVGhlbiB3aGlsZSB3ZSBzY2hlZHVsZSB0aGUgQllFLCB1cGRhdGUgYW5kIHVzZSBvbmx5IHRoZQorCSAgYnllX3N0YXRzLiBXaGVuIHdlIGZpbmlzaGVkIHNjaGVkdWxpbmcgdGhlIEJZRSBwYWNrZXQsIHdlIHVzZSB0aGUKKwkgIHJlZ3VsYXIgc3RhdHMgYWdhaW4uCisKKzIwMTMtMTItMTIgMTA6MzQ6MzggKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IHdoZW4gd2Ugc2NoZWR1bGUgQllFLCBvbmx5IGRlYWwgd2l0aCBCWUUgc291cmNlcworCSAgV2hlbiB3ZSBhcmUgZG9pbmcgdGhlIFJUQ1AgdGltZW91dCB0byBzY2hlZHVsZSBCWUUgcGFja2V0cywgZG9uJ3QKKwkgIGdlbmVyYXRlIFJUQ1AgZm9yIGFsbCBzb3VyY2VzIGJ1dCBvbmx5IGZvciB0aGUgc291cmNlcyBtYXJrZWQgYXMgQllFLgorCisyMDEzLTEyLTEyIDEwOjMyOjQ4ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiByZXNldCBzdGF0ZSBhZnRlciBzY2hlZHVsaW5nIEJZRQorCSAgQWZ0ZXIgd2UgZG8gUlRDUCwgd2UgYXJlIG5vdCBzY2hlZHVsaW5nIGJ5ZSBhbnltb3JlLgorCisyMDEzLTEyLTEyIDEwOjMxOjM4ICswMTAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBhbHNvIGNvdW50IE5BQ0tTIHdoZW4gbm8gc2lnbmFsIHdhcyBwZW5kaW5nCisKKzIwMTMtMTItMTIgMTA6MDk6MjUgKzAxMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IGlnbm9yZSBSVENQIHBhY2tldHMgZm9yIHRoZSBCWUUgc291cmNlcworCSAgV2hlbiB3ZSBhcmUgc2NoZWR1bGluZyBCWUUgcGFja2V0cywgaWdub3JlIGFsbCBSVENQIGZvciB0aGUgc291cmNlcyB0aGF0CisJICBhcmUgc2NoZWR1bGluZyBhIEJZRSBwYWNrZXQuIE90aGVyIHNvdXJjZXMgdGhhdCBhcmUgbm90IHNjaGVkdWxpbmcgQllFCisJICBzaG91bGQgY29udGludWUgcmVjZWl2aW5nIFJUQ1AgcGFja2V0cyBhcyB1c3VhbC4KKworMjAxMy0xMS0wNCAxMTo0ODoyMSArMDAwMCAgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHJ0cHNlc3Npb246IGRldGVybWluZSBpZiB0aGUgc2Vzc2lvbiBpcyBkb2luZyBwb2ludC10by1wb2ludAorCSAgSW4gdGhpcyBjYXNlIFRfZGl0aGVyX21heCBpcyBzZXQgdG8gMCBhY2NvcmRpbmcgdG8gUkZDIDQ1ODUKKworMjAxMy0xMi0xMCAxMTo1NzozNyArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHNlcmlhbGl6ZSBldmVudHMgaW4gdGhlIGJ1ZmZlcgorCSAgU2VyaWFsaXplIGV2ZW50cyBpbnRvIHRoZSBqaXR0ZXJidWZmZXIgYnkgaW5zZXJ0aW5nIHRoZW0gd2l0aCBhIC0xCisJICBzZXFudW0uCisJICBVcGRhdGUgdW5pdCB0ZXN0IHRvIGV4cGVjdCBldmVudHMgZnJvbSB0aGUgc3RyZWFtaW5nIHRocmVhZC4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTI5ODYKKworMjAxMy0xMi0xMCAxMTowNDowNiArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBkZXRlY3QgLTEgc2VxbnVtCisJICBLZWVwIHRoZSBzZXFudW0gYXMgYSBmdWxsIGd1aW50IHNvIHRoYXQgd2UgY2FuIGNoZWNrIGZvciAtMSBlbnRyaWVzIGFuZAorCSAgZGVhbCB3aXRoIHRoZW0gY29ycmVjdGx5LgorCSAgSW1tZWRpYXRlbHkgdHJ5IHRvIHB1c2ggLTEgc2VxbnVtLgorCisyMDEzLTEyLTEwIDExOjAxOjAzICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHJlb3JnYW5pemUgaml0dGVyYnVmZmVyIGl0ZW1zCisJICBLZWVwIHRoZSBvbGRlc3QgaXRlbSBhdCB0aGUgaGVhZCBhbmQgdGhlIG5ld2VzdCBpdGVtcyBvbiB0aGUgdGFpbC4gVGhpcworCSAgbWFrZXMgaXQgZWFzaWVyIHRvIGRlYWwgd2l0aCAtMSBzZXFudW1zLgorCisyMDEzLTEyLTA5IDIzOjM0OjEwICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkgIGppdHRlcmJ1ZmZlcjogY29ycmVjdGx5IGNoZWNrIGZvciBpbnZhbGlkIHZhbHVlcworCSAgQ2hlY2sgZm9yIC0xIG9uIHRoZSBndWludCBmcm9tIHRoZSBidWZmZXIgaXRlbSBpbnN0ZWFkIG9mIG9uIHRoZSBndWludDE2CisJICBvciBndWludDMyLgorCSAgQWxzbyBpbnNlcnQgLTEgc2VxbnVtIGF0IHRoZSBoZWFkIG9mIHRoZSBqaXR0ZXJidWZmZXIuCisKKzIwMTMtMTItMDggMTY6NDk6NTUgKzAxMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cubToKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogZml4IHNlZ2ZhdWx0IHdoZW4gZGVhbGluZyB3aXRoIHBhZGRlZCBmcmFtZXMKKwkgIEZpeGVzIGNyYXNoZXMgd2l0aCB2dGRlYyAhIG9zeHZpZGVvc2luayB3aGVyZSBWaWRlb1Rvb2xib3ggb3V0cHV0cyBwYWRkZWQgVVlWWQorCisyMDEzLTEyLTA1IDEyOjE1OjI5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSAgbXVsYXdkZWM6IFJlcXVpcmUgY2FwcyB0byBiZSBzZXQgYmVmb3JlIGFjY2VwdGluZyBhbnkgZGF0YQorCisyMDEzLTEyLTA1IDEyOjE1OjE5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6CisJICB3YXZwYWNrZGVjOiBSZXF1aXJlIGNhcHMgdG8gYmUgc2V0IGJlZm9yZSBhY2NlcHRpbmcgYW55IGRhdGEKKworMjAxMy0xMi0wNSAxMjoxMzozMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJICBzcGVleGRlYzogUmVxdWlyZSBjYXBzIHRvIGJlIHNldCBiZWZvcmUgYWNjZXB0aW5nIGFueSBkYXRhCisKKzIwMTMtMTItMDUgMTI6MTM6MTAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWNkZWM6IFJlcXVpcmUgY2FwcyB0byBiZSBzZXQgYmVmb3JlIGFjY2VwdGluZyBhbnkgZGF0YQorCisyMDEzLTEyLTA1IDExOjQyOjE1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZweC9nc3R2cDlkZWMuYzoKKwkgIHZweDogVXNlIG5ldyBnc3RfdmlkZW9fZGVjb2Rlcl9zZXRfbmVlZHNfZm9ybWF0KCkgQVBJCisKKzIwMTMtMTItMDQgMTY6MjM6NDMgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogRnJlZSBkZXZpY2VfaW5mbyBpbiBhY2NlcHRzIGNhcHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTk4MTEKKworMjAxMy0xMi0wNCAyMTo1Nzo0OCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkgIHJ0cHRoZW9yYXBheTogRG9uJ3Qgc2VuZCBoZWFkZXJzIHR3aWNlIGlmIHdlIGdvdCB0aGVtIGZyb20gdGhlIGNhcHMgYWxyZWFkeQorCisyMDEzLTEyLTA0IDIxOjU3OjA0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgcnRwdGhlb3JhcGF5OiBEb24ndCBsZWFrIGNvbmZpZyBkYXRhIHdoZW4gcmVjZWl2aW5nIGEgc2Vjb25kIENBUFMgZXZlbnQKKworMjAxMy0xMi0wNCAyMTo1NTo1MyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkgIHJ0cHZvcmJpc3BheTogRG9uJ3Qgc2VuZCBoZWFkZXJzIHR3aWNlIGlmIHdlIGdvdCB0aGVtIGZyb20gdGhlIGNhcHMgYWxyZWFkeQorCisyMDEzLTEyLTA0IDIxOjU0OjE2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSAgcnRwdm9yYmlzcGF5OiBEb24ndCBsZWFrIGNvbmZpZyBkYXRhIHdoZW4gcmVjZWl2aW5nIGEgc2Vjb25kIENBUFMgZXZlbnQKKworMjAxMy0xMi0wNCAyMToxNzowMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN0cmVhbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN0cmVhbWRlcGF5Lmg6CisJICBydHBzdHJlYW1kZXBheTogQWRkIFJGQzQ1NzEgUlRQIHN0cmVhbSBkZXBheWxvYWRpbmcgZWxlbWVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxOTgyOQorCisyMDEzLTEyLTA0IDEwOjEyOjQ2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3RyZWFtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN0cmVhbXBheS5oOgorCSAgcnRwc3RyZWFtcGF5OiBBZGQgUkZDNDU3MSBSVFAgc3RyZWFtIHBheWxvYWRpbmcgZWxlbWVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxOTgyOQorCisyMDEzLTEyLTAzIDE1OjA4OjI1IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGltcHJvdmUgZnJhZ21lbnQtc3RhcnQgdHJhY2tpbmcKKwkgIFNvbWUgYnVmZmVycyBjYW4gaGF2ZSBtdWx0aXBsZSBtb292IGF0b21zIGluc2lkZSBhbmQgdGhlIHN0cmF0ZWd5CisJICBvZiB1c2luZyB0aGUgZ3N0X2FkYXB0ZXJfcHJldl9wdHMgdGltZXN0YW1wIHRvIGdldCB0aGUgYmFzZSB0aW1lc3RhbXAKKwkgIGZvciB0aGUgbWVkaWEgb2YgdGhlIGZyYWdtZW50IHdvdWxkIGZhaWwgYXMgaXQgd291bGQgcmV1c2UgdGhlIHNhbWUKKwkgIGJhc2UgdGltZXN0YW1wIGZvciBhbGwgbW9vZnMgaW4gdGhlIGJ1ZmZlciBpbnN0ZWFkIG9mIGFjY3VtdWxhdGluZworCSAgdGhlIGR1cmF0aW9ucyBmb3IgYWxsIG9mIHRoZW0uCisJICBIZXJlcyBhIGJldHRlciBleHBsYW5hdGlvbiBvZiB0aGUgaXNzdWU6CisJICBxdGRlbXV4IHJlY2VpdmVzIGEgYnVmZmVyIHdoZXJlIFBUUyhidWYpID0gWAorCSAgYnVmIC0+IG1vb2ZBIHwgbW9vZkIgfCBtb29mQworCSAgVGhlIHByb2JsZW0gd2FzIHRoYXQgUFRTKGJ1Zikgd2FzIHVzZWQgYXMgdGhlIGJhc2UgdGltZXN0YW1wIGZvcgorCSAgYWxsIDMgbW9vZnMsIGNhdXNpbmcgYWxsIGJ1ZmZlcnMgdG8gYmUgWCBiYXNlZC4gSW4gdGhpcyBjYXNlIHdlIHdhbnQKKwkgIG9ubHkgbW9vZkEgdG8gYmUgWCBiYXNlZCBhcyBpdCBpcyB3aGF0IHRoZSBQVFMgb24gYnVmIG1lYW5zLCBhbmQgdGhlCisJICBvdGhlciBtb29mQiBhbmQgbW9vZkMganVzdCB1c2UgdGhlIGFjY3VtdWxhdGVkIHRpbWVzdGFtcCBmcm9tIHRoZQorCSAgcHJldmlvdXMgbW9vZnMgZHVyYXRpb25zLgorCSAgVG8gc29sdmUgdGhpcywgdGhpcyBwYXRjaCB1c2VzIGdzdF9hZGFwdGVyX3ByZXZfcHRzIGRpc3RhbmNlCisJICByZXN1bHQsIHRoaXMgYWxsb3dzIHF0ZGVtdXggdG8gY2FsY3VsYXRlIGlmIGl0IHNob3VsZCB1c2UgdGhlCisJICByZXN1bHRpbmcgcHRzIG9yIGp1c3QgYWNjdW11bGF0ZSB0aGUgc2FtcGxlcyBhcyBpdCBjYW4gaWRlbnRpZnkKKwkgIGlmIHRoZSBtb29mcyBiZWxvbmcgdG8gdGhlIHNhbWUgdXBzdHJlYW0gYnVmZmVyIG9yIG5vdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTk3ODMKKworMjAxMy0xMS0yMSAxMjoyOToyOCArMDAwMCAgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyYnVmZmVycG9vbDogYWRkIHN1cHBvcnQgZm9yIG11bHRpLXBsYW5hciBWNGwyIEFQSSBpbiBETUFCVUYgbW9kZQorCSAgRml4ZXMgYnVnIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTI3NTQKKworMjAxMy0xMS0xOSAxNzoxNjoyNyArMDAwMCAgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSAgdjRsMjogcmVmYWN0b3IgYnkgZW11bGF0aW5nIG9uZSB2NGwyX3BsYW5lIGluIG5vbi1NUExBTkUgbW9kZQorCSAgc28gdGhhdCB0aGUgYnVmZmVyIGluZm9ybWF0aW9ucyBjYW4gYmUgcmV0cmlldmVkIHRoZSBzYW1lIHdheQorCSAgaW4gYm90aCBNUExBTkUgYW5kIG5vbi1NUExBTkUgbW9kZS4KKwkgIEhlcmUgImVtdWxhdGluZyIgbWVhbnMgIm1hbnVhbGx5IGZpbGwgaW4gdGhlIHBsYW5lIi4KKwkgIEZpeGVzIGJ1ZyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzEyNzU0CisKKzIwMTMtMTEtMTMgMTI6MDU6NDAgKzAwMDAgIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDI6IGFkZCBzdXBwb3J0IGZvciBtdWx0aS1wbGFuYXIgVjRMMiBBUEkKKwkgIFRoaXMgYXBpIGlzIGluIGxpbnV4IGtlcm5lbCBzaW5jZSB2ZXJzaW9uIDIuNi4zOSwKKwkgIGFuZCBwcmVzZW50IGluIGFsbCB2ZXJzaW9uIDMuCisJICBUaGUgY29tbWl0IHRoYXQgYWRkcyB0aGUgQVBJIGluIG1hc3RlciBicmFuY2ggb2YgdGhlCisJICBsaW51eCBrZXJuZWwgc291cmNlIGlzOgorCSAgaHR0cHM6Ly9naXRodWIuY29tL3RvcnZhbGRzL2xpbnV4L2NvbW1pdC9mOGYzOTE0Y2Y5MjJmNWY5ZTFkNjBlOWUxMGY2ZmI5Mjc0MjkwN2FkCisJICB2NGwyIGRvYzogIlNvbWUgZGV2aWNlcyByZXF1aXJlIGRhdGEgZm9yIGVhY2ggaW5wdXQKKwkgIG9yIG91dHB1dCB2aWRlbyBmcmFtZSB0byBiZSBwbGFjZWQgaW4gZGlzY29udGlndW91cworCSAgbWVtb3J5IGJ1ZmZlcnMiCisJICBUaGVyZSBhcmUgbmV3ZXIgc3RydWN0dXJlcyAnc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUnCisJICBhbmQgJ3N0cnVjdCB2NGwyX3BsYW5lJy4KKwkgIFNvIHRoZSBwaXhlbCBmb3JtYXQgaXMgbm90IHNldHVwIHdpdGggdGhlIHNhbWUgQVBJIHdoZW4gdXNpbmcKKwkgIG11bHRpLXBsYW5hci4KKwkgIEFsc28gZm9yIGdzdC12NGwyLCBvbmUgb2YgdGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBpbiBHc3RWNGwyTWV0YQorCSAgdGhlcmUgYXJlIG5vdyBvbmUgbWVtIHBvaW50ZXIgZm9yIGVhY2ggbWFwZWQgcGxhbmUuCisJICBXaGVuIG5vdCB1c2luZyBtdWx0aS1wbGFuYXIsIHRoaXMgY29tbWl0IHRha2VzIGNhcmUgb2Yga2VlcGluZworCSAgdGhlIHNhbWUgY29kZSBwYXRoIHRoYW4gcHJldmlvdXNseS4gU28gdGhhdCB0aGUgMiBjYXNlcyBhcmUKKwkgIGluIHR3byBkaWZmZXJlbnQgYmxvY2tzIHRyaWdnZXJlZCBmcm9tIFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUi4KKwkgIEZpeGVzIGJ1ZyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzEyNzU0CisKKzIwMTMtMTItMDQgMDk6MTI6MDcgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2VyczogZG9uJ3QgbGVhayB0ZW1wbGF0ZSBjYXBzCisKKzIwMTMtMTItMDMgMjE6NDE6MjggKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FhY3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IHVzZSBBQ0NFUFRfSU5URVJTRUNUIGZsYWcKKwkgIFRoZSBwYXJzZXIgY2FuIGFjY2VwdCBpbnB1dCB0aGF0IGlzIG5vdCBjb21wbGV0ZWx5IHNwZWNpZmllZC4gVXNlIHRoZQorCSAgQUNDRVBUX0lOVEVSU0VDVCBmbGFnIG9uIHRoZSBzaW5rcGFkIHRvIHR3ZWFrIHRoZSBhY2NlcHRjYXBzIGZ1bmN0aW9uIHRvCisJICBjaGVjayBmb3IgaW50ZXJzZWN0aW9uIG9ubHkuIFRoaXMgYWxsb3dzIHVzIHRvIHByb3h5IGRvd25zdHJlYW0KKwkgIGNvbnN0cmFpbnRzIHdoaWxlIHN0aWxsIGFsbG93aW5nIG5vbi1zdWJzZXQgY2FwcyBhcyBpbnB1dC4KKwkgIFdlIGNhbiB0aGVuIGFsc28gcmVtb3ZlIHRoZSBhcHBlbmRlZCB0ZW1wbGF0ZSBjYXBzIHdvcmthcm91bmQuCisJICBNYWtlIGEgdW5pdC10ZXN0IHRvIGNoZWNrIHRoZSBuZXcgZmVhdHVyZS4KKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgMjYwNDBlZTM4Y2I5ZTdjNDJmM2Q5YTAyODJiM2U1Y2FjZTdjYTQyZAorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNTAyNAorCisyMDEzLTEyLTAzIDIxOjM2OjU0ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0c2JjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IHJlbW92ZSBmaWVsZHMgZnJvbSBmaWx0ZXIKKwkgIFdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBmaWVsZHMgZnJvbSB0aGUgZmlsdGVyIHdoZW4gd2UgY2FuIGNvbnZlcnQKKwkgIGJldHdlZW4gdGhlbS4KKworMjAxMy0xMi0wMyAyMToyOToxMyArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHNiY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgYXVkaW9wYXJzZXJzOiByZWZhY3RvciBjb2RlIHRvIHJlbW92ZSBjYXBzIGZpZWxkcworCisyMDEzLTEyLTAyIDAwOjEwOjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBtaWNyb29wdGltaXNhdGlvbjogYXZvaWQgc29tZSB1bm5lY2Vzc2FyeSBHVmFsdWUgY29waWVzCisKKzIwMTMtMTItMDEgMjM6MzI6MjAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGZpeCBvZmYtYnktb25lIGNyYXNoIHdoZW4gZG93bnN0cmVhbSBjYXBzIGNvbnRhaW4gYSBsaXN0IG9mIGZyYW1lcmF0ZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTk1NDQKKworMjAxMy0xMS0yOSAxMToyNjowNSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogVXNlIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vb2YgYXMgdGhlIGJhc2UgZnJhZ21lbnQgc3RhcnQKKwkgIEluIFNtb290aFN0cmVhbWluZyBmcmFnbWVudGVkIHNjZW5hcmlvLCB0aGUgdGltZXN0YW1wcyBhcmUgY2FsY3VsYXRlZAorCSAgc3RhcnRpbmcgZnJvbSB0aGUgZnJhZ21lbnQgYnVmZmVyIHRpbWVzdGFtcC4gV2hlbiB0aGVyZSBpcyBhIG5vdC1saW5rZWQKKwkgIHJldHVybiBmcm9tIGRvd25zdHJlYW0sIHF0ZGVtdXggd2lsbCByZXR1cm4gdXBzdHJlYW0gYW5kIHdpbGwga2VlcCB0aGUKKwkgIG5vbi1wdXNoZWQgZGF0YSBpbnRvIGl0cyBhZGFwdGVyLgorCSAgT24gYSBuZXcgZnJhZ21lbnQgYnVmZmVyIHB1c2hlZCB0byBxdGRlbXV4LCB0aGUgbmV3IGJ1ZmZlciB0aW1lc3RhbXAKKwkgIHdvdWxkIG92ZXJ3cml0ZSB0aGUgcHJldmlvdXMgb25lIHRoYXQgc2hvdWxkIGJlIHVzZWQgb24gdGhlIHN0aWxsCisJICB0byBiZSBwdXNoZWQgYnVmZmVycy4gQmVjYXVzZSBvZiB0aGlzLCB0aGlzIHBhdGNoIHdpbGwgYWxzbworCSAgdXBkYXRlIHRoZSBmcmFnbWVudF9zdGFydCB0aW1lc3RhbXAgZnJvbSB0aGUgYWRhcHRlciBsYXN0IHB0cworCSAgdG8gbWFrZSBzdXJlIHRoZSBtb29mIGFuZCB0aW1lc3RhbXBzIGFyZSBpbiBzeW5jIGFuZCB3aWxsIHJlc3VsdAorCSAgaW4gY29ycmVjdCB0aW1lc3RhbXBzIGZvciBhbGwgZnJhZ21lbnRzLgorCisyMDEzLTExLTE1IDA4OjU0OjA3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGF2b2lkIHJlLXJlYWRpbmcgdGhlIHNhbWUgbW9vdiBhbmQgZW50ZXJpbmcgaW50byBsb29wCisJICBJbiB0aGUgc2NlbmFyaW8gb2YgIm1kYXQgfCBtb292ICh3aXRoIGZyYWdtZW50ZWQgYXJ0aWZhY3RzKSIgcXRkZW11eAorCSAgY291bGQgcmVhZCB0aGUgbW9vdiBhZ2FpbiBhZnRlciB0aGUgbWRhdCBiZWNhdXNlIGl0IHdhcyBjb25zaWRlcmluZyB0aGUKKwkgIG1lZGlhIGFzIGEgZnJhZ21lbnRlZCBvbmUuCisJICBUbyBhdm9pZCB0aGlzIGxvb3AgdGhpcyBwYXRjaCBtYWtlcyBpdCBzdG9yZQorCSAgdGhlIGxhc3QgcHJvY2Vzc2VkIG1vb3Zfb2Zmc2V0IHRvIGF2b2lkIHBhcnNpbmcgaXQgYWdhaW4uCisJICBBbmQgaXQgYWxzbyBjaGVja3MgaWYgdGhlcmUgYXJlIGFueSBzYW1wbGVzIHRvIHBsYXkgYmVmb3JlCisJICByZXN0dXJuaW5nIHRvIHRoZSBtZGF0LCBzbyB0aGF0IGl0IGtub3dzIHRoZXJlIGlzIG5ldyBkYXRhIHRvIGJlIHBsYXllZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTE1NzAKKworMjAxMy0xMS0xNSAwMDo1Mjo1MyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZG8gbm90IGZyZWUgc3RyZWFtcyBpZiB0aGV5IHdlcmUgbm90IGNyZWF0ZWQgbG9jYWxseQorCSAgV2hlbiBwYXJzaW5nIGEgdHJhayBvbmx5IGZyZWUgc3RyZWFtcyBvbiBmYWlsdXJlcyBpZiB0aG9zZSBzdHJlYW1zCisJICB3ZXJlIGNyZWF0ZWQgbG9jYWxseS4gVGhleSBjb3VsZCBoYXZlIGJlZW4gY3JlYXRlZCBmcm9tIGEgcHJldmlvdXMKKwkgIGZyYWdtZW50LCBpbiB0aGlzIGNhc2Ugd2UgdGhleSBoYXZlIHZhbGlkIGluZm8gZnJvbSB0aGUgb3RoZXIgZnJhZ21lbnQuCisJICBJbmNsdWRpbmcgcGFkcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTE1NzAKKworMjAxMy0xMS0yOSAxOTo1Nzo0NiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkgIHZpZGVvbWl4ZXI6IFNpbXBsaWZ5IE5WMTIvMjEgYmxlbmRpbmcgY29kZSBtYWNyb3MKKworMjAxMy0xMS0yOSAxOTo1MDoyNCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkgIHZpZGVvbWl4ZXI6IEZpeCBzZWdmYXVsdCB3aGVuIGZpbGxpbmcgdGhlIGJhY2tncm91bmQgb2YgYSBVWVZZIGZyYW1lCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzEyNDAxCisKKzIwMTMtMTEtMjkgMDk6MjE6NTIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IGNvbXBpbGF0aW9uIHdpdGggZ3N0IGRlYnVnaW5nIGRpc2FibGVkCisJICBxdGRlbXV4LmM6OTQ1MjoxOiBlcnJvcjogbGFiZWwgYXQgZW5kIG9mIGNvbXBvdW5kIHN0YXRlbWVudAorCisyMDEzLTExLTI3IDE3OjAyOjAwICswMTAwICBKb25hcyBIb2xtYmVyZyA8am9uYXNoZ0BheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiBNYXAgaW5idWZmZXIgb25jZSBvbmx5CisJICBEbyBub3QgY2FsbCBnc3RfYnVmZmVyX2V4dHJhY3QoKSB0d2ljZSBzaW5jZSBlYWNoIGNhbGwgd2lsbCBtYXAgYW5kCisJICB1bm1hcCB0aGUgYmlmZmVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxOTQzNAorCisyMDEzLTExLTI4IDExOjU4OjQyIC0wNTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvZmlsdGVyLmM6CisJICB2aWRlb2ZsaXA6IEFkZCB1bml0IHRlc3QgZm9yIHRoZSAnYXV0b21hdGljJyBtZXRob2QKKwkgIFRoZXNlIG5ldyB0ZXN0cyBzZW5kIGEgdGFnIGV2ZW50IGJlZm9yZSBzZWRpbmcgdGhlIGJ1ZmZlci4gVGVzdGVkIGNhc2UgYXJlIGFuCisJICBlbXB0eSB0YWcgbGlzdCwgYSB0YWcgbGlzdCB3aXRoIG9yaWVudGF0aW9uLTE4MCBzZXQgYW5kIGFuIGludmFsaWQgb3JpZW50YXRpb24gdmFsdWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzE5NDk3CisKKzIwMTMtMTEtMjggMTY6MDk6MDQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIHZpZGVvZmxpcDogZG9uJ3QgY3Jhc2ggb24gdGFnIGV2ZW50cyB3aXRob3V0IG9yaWVudGF0aW9uIHRhZworCSAgV291bGQgY3Jhc2ggaW4gZ19mcmVlKCkgdHJ5aW5nIHRvIGZyZWUgYW4gdW5pbml0aWFsaXNlZCBwb2ludGVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxOTQ5NworCisyMDEzLTExLTI4IDE2OjUwOjQyICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogZG9uJ3QgdW5yZWYgYnVmZmVyIHR3aWNlCisJICBDbGVhbmluZyB0aGUgcGFja2V0IGluZm8gd2lsbCBhbHJlYWR5IHVucmVmIHRoZSBidWZmZXIuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzE1MDc4CisKKzIwMTMtMTEtMjggMjI6MzU6MDIgKzExMDAgIEphbiBTY2htaWR0IDxqYW5AY2VudHJpY3VsYXIuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEFkZCBIeWRyb2dlbkF1ZGlvIFJlcGxheUdhaW4gdGFncworCSAgSWRlbnRpY2FsIHRvIHRoZSBpdHVuZXMgKHRtKSB2ZXJzaW9uLCBidXQgbGFiZWxsZWQgd2l0aAorCSAgb3JnLmh5ZHJvZ2VuYXVkaW8ucmVwbGF5Z2FpbiBhcyB0aGUgcHJvZHVjZXIuCisKKzIwMTMtMTEtMjcgMTY6MTU6MTIgKzAxMDAgIE1hdGhpZXUgRHVwb25jaGVsbGUgPG1kdXBvbmNoZWxsZTFAZ21haWwuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogZXhwbGljaXRseSBmYWlsIHdoZW4gYWxwaGEgaW5mb3JtYXRpb24gd291bGQgaGF2ZSBiZWVuIGxvc3QuCisKKzIwMTMtMDUtMjkgMTY6MDY6MDUgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiAuZ2l0aWdub3JlOgorCSAgZ2l0aWdub3JlOiBVcGRhdGVkIHRvIGlnbm9yZSAqLnN3cCBhbmQgLmRpcnN0YW1wCisKKzIwMTMtMTEtMjYgMTE6MTc6NDIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2EtZGVtdXg6IEFsbG93IGEgYml0IG1vcmUgdmFyaWF0aW9uIHdoZW4gZGV0ZWN0aW5nIGNvbW1vbiBmcmFtZXJhdGVzCisJICBJbnN0ZWFkIG9mICsvLSAxbnMgd2UgYWxsb3cgMm5zIG5vdy4gRHVlIHRvIHJvdW5kaW5nIGVycm9ycyB0aGVyZSBhcmUKKwkgIHNvbWUgTWF0cm9za2EgZmlsZXMgb3V0IHRoZXJlIHdpdGggMzMuMzMzMzMxbXMgcGVyIGZyYW1lIGZvciAzMGZwcy4KKworMjAxMy0xMS0yNiAxMDoyMDozMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYS1kZW11eDogVXNlIGdzdF91dGlsX2RvdWJsZV90b19mcmFjdGlvbigpIGluc3RlYWQgb2YgR1ZhbHVlIG1hZ2ljCisKKzIwMTMtMTEtMjUgMTQ6MDM6MjEgLTA1MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSAgdmlkZW9mbGlwOiBTZXQgZGVmYXVsdCBtZXRob2QgYXQgY29udHJ1Y3Rpb24KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTIzMzMKKworMjAxMy0wNS0yOSAxNTo1NzowOSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IFVzZSBzcGFjZSBpbnN0ZWFkIG9mIHRhYnMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTI3NTQKKworMjAxMy0wNS0yOSAxNTo0NDozMSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIHY0bDJvYmplY3Q6IEZpeCBoZWFkZXIgaW5kZW50YXRpb24gc28gaXQncyByZWFkYWJsZSBhZ2FpbgorCSAgSXQncyB1bmZvcnR1bmF0ZSB0byBoYXZlIHRvIGRvIHRoaXMsIGJ1dCB3aXRoIHRoZSBtaXggb2YgdGFicyBhbmQgc3BhY2UsIHBsdXMgYWxsIHRoZSByYW5kb20KKwkgIGluZGVudGF0aW9uIHRoaXMgaGVhZGVyIGhhcyBiZWNvbWUgdmVyeSBoYXJkIHRvIHJlYWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzEyNzU0CisKKzIwMTMtMTEtMjUgMTc6Mzg6MDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGNoZWNrOiBmaXggaml0dGVyYnVmZmVyIGNoZWNrCisJICBEb24ndCBhZHZhbmNlIHRoZSBjbG9jayB0byAyNDBtcyB0b28gZWFybHkuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzEwMDEzCisKKzIwMTMtMTEtMjUgMTE6NDU6MzMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BzaXNhLnNhbXN1bmcuY29tPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBkZXByZWNhdGUgbWF4LWVycm9ycworCSAgVGhlIHByb3BlcnR5IHdhc24ndCB1c2UgaW50ZXJuYWxseSwgbGV0IHRoZSBiYXNlIGNsYXNzIGhhbmRsZSB0aGUKKwkgIG51bWJlciBvZiBlcnJvcnMgdG8gdG9sZXJhdGUuCisKKzIwMTMtMTEtMjUgMTU6NDk6MDcgKzAxMDAgIFdpbSBUYXltYW5zIDx3dGF5bWFuc0ByZWRoYXQuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBpbXByb3ZlIGNsZWFyLXB0LW1hcCBoYW5kbGluZworCSAgRG9uJ3QgcmVzZXQgdGhlIGV4cGVjdGVkIG91dHB1dCBzZXFudW0gd2hlbiBjbGVhcmluZyB0aGUgcHQgbWFwIGJlY2F1c2UgdGhpcworCSAgY291bGQgc3RhbGwgdGhlIGppdHRlcmJ1ZmZlciBmb3JldmVyLgorCSAgQWRkIGEgdW5pdCB0ZXN0IGZvciB0aGlzLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwOTgwMAorCisyMDEzLTEwLTI4IDIxOjMzOjIyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAc2lzYS5zYW1zdW5nLmNvbT4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogbGV0IHRoZSBiYXNlIGNsYXNzIGRlY2lkZSB3aGVuIHRvIHJldHVybiBhbiBlcnJvcgorCSAgVGhlIGJhc2UgdmlkZW9kZWNvZGVyIGNsYXNzIGhhcyBhbiBlcnJvciBjb3VudGluZyBmZWF0dXJlIHRvIHRvbGVyYXRlCisJICBhIGZldyBlcnJvcnMgYmVmb3JlIHBvc3RpbmcgYW4gZXJyb3IgbWVzc2FnZS4gU28gZG9uJ3QgZm9yY2UgdGhlCisJICBlcnJvciBhbmQgbGV0IHRoZSBiYXNlIGNsYXNzIGRlY2lkZSB3aGVuIGl0IHNob3VsZCBoYXBwZW4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTA3NjIKKworMjAxMy0xMC0yOCAyMToyODozMyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHNpc2Euc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IEFkZCBkYXRhIHNraXBwaW5nIG9uIGlucHV0CisJICBBZGQgbWlzc2luZyBieXRlcyBza2lwcGluZyB3aGVuIGJhZCBpbnB1dCBpcyByZWNlaXZlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTA3NjIKKworMjAxMy0xMS0yNSAxMjoxMzo0MyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRGlzY2FyZCAyIGJ5dGUgc3VicGljdHVyZSBwYWNrZXRzCisJICBBcyBmb3IgdGV4dCBzdWJ0aXRsZXMgYW5kIGFzIHN1Z2dlc3RlZCBpbiAjNzEyNjQzLCB0aHJvdworCSAgYXdheSB0aGUgMiBieXRlIHRlcm1pbmF0b3IgcGFja2V0cyB0aGF0IHNvbWUgZW5jb2RlcnMgaW5zZXJ0LgorCSAgVGhpcyB3aWxsIG1ha2UgdGhpbmdzIGJldHRlciB3aGVuIHJlbXV4aW5nIGFuZCBjYXVzZXMgZ2VuZXJhdGlvbgorCSAgb2YgZ2FwIGV2ZW50cy4KKworMjAxMy0xMS0yNSAwMDozNDoyMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGZpeCB3YWtlLXVwIHdoZW4gbmV3IGJ1ZmZlcnMgY29tZSBpbiBhZnRlciBydW5uaW5nIGVtcHR5CisJICBTcG90dGVkIGJ5ICdncmF0aWFzJyBvbiBJUkMuIFByb2JhYmx5IGludHJvZHVjZWQgaW4gcmVjZW50IHJlZmFjdG9yaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxNTAzOQorCisyMDEzLTExLTIzIDEyOjE1OjQwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBjb3JyZWN0bHkgaGFuZGxlIG5lZ2F0aXZlIHJlbGF0aXZlIHRpbWVzdGFtcHMKKwkgIC4uLiByYXRoZXIgdGhhbiBzY2FsaW5nIHRoZXNlIGFzIHVuc2lnbmVkLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMjc0NAorCSAgQmFzZWQgb24gcGF0Y2ggYnkgS3J6eXN6dG9mIEtvdGxlbmdhIDxwb2Nla0B1c2Vycy5zZi5uZXQ+CisKKzIwMTMtMDktMTQgMDM6Mjc6MDkgKzAyMDAgIE1hdGhpZXVEdXBvbmNoZWxsZSA8bWF0aGlldS5kdXBvbmNoZWxsZUBlcGl0ZWNoLmV1PgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuaDoKKwkgIHZpZGVvbWl4ZXIyOiBNZXJnZSB0YWcgZXZlbnRzIHRvIHNlbmQgdGhlbSBpbiBjb2xsZWN0ZWQuCisJICBPdGhlcndpc2UgdGhlcmUgd2VyZSByYWNlIGNvbmRpdGlvbnMgd2hlcmUgd2Ugd291bGQgc2VuZCB0YWdzCisJICBvbiBhIGZsdXNoaW5nIHNyY3BhZC4KKwkgIFdlIGhhdmUgYSB0ZXN0IGZvciB0aGF0IGluIEdFUywgYnV0IHRoaXMgc2hvdWxkIGJlIHRlc3RlZAorCSAgc3lzdGVtYXRpY2FsbHkgd2l0aCBoYXJuZXNzIGluIHRoZSBmdXR1cmUgYXMgSSBiZWxpZXZlIGl0CisJICBpcyB1c2VmdWwgZm9yIGV4YWN0bHkgdGhhdCBraW5kIG9mIGNhc2VzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwODE2NQorCisyMDEzLTExLTE0IDE3OjI5OjUwIC0wMzAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogVXNlIEdzdFZpZGVvSW5mbyBoZWxwZXIgdG8gY3JlYXRlIGNhcHMgZm9yIHJhdyB2aWRlbworCSAgVGhpcyB3YXkgd2UgZG8gbm90IG1pc3MgbWFuZGF0b3J5IGZpZWxkcyBpbiBjYXBzLgorCSAgQXQgdGhlIHNhbWUgdGltZSB1c2UgdGhlIGdzdF9wYl91dGlsc19nZXRfY29kZWNfZGVzY3JpcHRpb24KKwkgIGhlbHBlciB0byBnZXQgY29kZWMgZGVzY3JpcHRpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzEyMzM1CisKKzIwMTMtMTEtMTQgMTY6MTE6MzggLTAzMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBVc2UgR3N0VmlkZW9JbmZvIGhlbHBlciB0byBjcmVhdGUgY2FwcyBmb3IgcmF3IHZpZGVvCisJICBUaGlzIHdheSB3ZSBkbyBub3QgbWlzcyBtYW5kYXRvcnkgZmllbGRzIGluIGNhcHMuCisJICBBdCB0aGUgc2FtZSB0aW1lIHVzZSB0aGUgZ3N0X3BiX3V0aWxzX2dldF9jb2RlY19kZXNjcmlwdGlvbiBoZWxwZXIgdG8KKwkgIGdldCBjb2RlYyBkZXNjcmlwdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTIzMjgKKworMjAxMy0xMS0xMyAyMDoxODoxNyAtMDMwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuaDoKKwkgIG11bHRpZmlsZXNyYzogSW1wbGVtZW50IHNlZWtpbmcgaW4gY2FzZSBvZiBtdWx0aXBsZSBpbWFnZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTIyNTQKKworMjAxMy0xMS0yMiAxMjoyNjoyMSArMDEwMCAgV2ltIFRheW1hbnMgPHd0YXltYW5zQHJlZGhhdC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBwYXNzIGRvd25zdHJlYW0gZmxvd3JldHVybiB0byB1cHN0cmVhbQorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMjcyMgorCisyMDEzLTExLTE4IDE0OjI3OjQ4ICswMTAwICBNaWNoYWVsIE9sYnJpY2ggPG0ub2xicmljaEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogY2xlYXIgY2FjaGVkIGNhcHMgb24gY2xvc2UKKwkgIEEgZGlmZmVyZW50IGRldmljZSB3aXRoIGRpZmZlcmVudCBjYXBzIG1heSBiZSB1c2VkIGZvciB0aGUgbmV4dCBvcGVuLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMjYxMQorCisyMDEzLTExLTIxIDE1OjMwOjM0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPgorCisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrY29tbW9uLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrc3RyZWFtcmVhZGVyLmM6CisJKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBnX21lbW1vdmUoKSBpcyBkZXByZWNhdGVkCisJICBKdXN0IHVzZSBwbGFpbiBtZW1tb3ZlKCksIGdfbWVtbW92ZSgpIGlzIGRlcHJlY2F0ZWQgaW4KKwkgIHJlY2VudCBHTGliIHZlcnNpb25zLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMjgxMQorCisyMDEzLTExLTIxIDExOjMyOjE1ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkgIHJ0cHZvcmJpc2RlcGF5OiBoYW5kbGUgcGFja2V0cyA+IDB4ZmZmZgorCSAgSGFuZGxlIGlucHV0IHBhY2tldCBzaXplcyBsYXJnZXIgdGhhbiAxNiBiaXRzIGluIHRoZSBkZXBheWxvYWRlci4KKwkgIFJlbW92ZSBzaXplIHJlc3RyaWN0aW9ucyBvbiB0aGUgcGF5bG9hZGVyLgorCisyMDEzLTExLTIxIDExOjMwOjI4ICswMTAwICBXaW0gVGF5bWFucyA8d3RheW1hbnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkgIHJ0cHRoZW9yYWRlcGF5OiBoYW5kbGUgcGFja2V0cyA+IDB4ZmZmZgorCSAgUmVvcmdhbml6ZSBzb21lIHRoaW5ncyBpbiB0aGUgZGVwYXlsb2FkZXIgc28gdGhhdCBpdCBjYW4gaGFuZGxlIHBhY2tldHMgbGFyZ2VyCisJICB0aGFuIDE2IGJpdHMuCisJICBSZW1vdmUgdGhlIHNpemUgcmVzdHJpY3Rpb24gb24gdGhlIHBheWxvYWRlci4KKworMjAxMy0xMS0yMSAwMjoyODoyNyArMTEwMCAgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X2R1bXAuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF90eXBlcy5jOgorCSAgaXNvbXA0OiBIYW5kbGUgbXA0cyBzdWJwaWN0dXJlIHN0cmVhbXMgYmV0dGVyLgorCSAgQ2xlYW4gdXAgdGhlIGhhbmRsaW5nIG9mIG1wNHMgc3RyZWFtcy4gVXNlIHRoZSBnZW5lcmljIGVzZHMKKwkgIGRlc2NyaXB0b3IgZnVuY3Rpb24gdG8gZXh0cmFjdCB0aGUgcGFsZXR0ZSwgaW5zdGVhZCBvZiBoYXJkIGNvZGluZworCSAgYSB3cm9uZyBtYWdpYyBvZmZzZXQuCisJICBBZGQgc29tZSBtb3JlIHNpemUgc2FmZXR5IGNoZWNrcyB3aGVuIHBhcnNpbmcgRVMgZGVzY3JpcHRvcnMsIGFuZAorCSAgcmVwbGFjZSBtYWdpYyBudW1iZXJzIHdpdGggdGhlIGRlc2NyaXB0aXZlIGNvbnN0YW50cyB0aGF0IGFyZSBhbHJlYWR5CisJICBkZWZpbmVkLgorCSAgRW5oYW5jZSBkdW1wIG91dHB1dCBmb3Igc3RzZCBhdG9tcy4KKwkgIFN0cmVhbXMgZnJvbSBib3RoIGJ1ZyA3MTI2NDMgYW5kIGhpc3RvcmljIGJ1ZyA1NjgyNzggbm93IGJvdGggd29yaworCSAgY29ycmVjdGx5LgorCSAgRml4ZXM6ICM3MTI2NDMKKworMjAxMy0xMS0yMCAyMjowODoyNSArMTEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSAgcXRkZW11eDogU29ydCBmb3VyY2MgZGVjbGFyYXRpb25zIGFuZCByZW1vdmUgZHVwbGljYXRlcworCisyMDEzLTExLTIwIDIxOjQxOjQ3ICsxMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9pc29tcDQvTWFrZWZpbGUuYW06CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9mdHlwY2MuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXhtYXAuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X2R1bXAuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF90eXBlcy5jOgorCSAgcXRkZW11eDogTWVyZ2UgYWxsIHRoZSBmb3VyY2MgaGVhZGVycyBpbnRvIG9uZQorCSAgUmVtb3ZlIHF0ZGVtdXhfZm91cmNjLmggYW5kIGZ0eXBjYy5oIGFuZCBwdXQgaXQgYWxsIGluIGZvdXJjYy5oCisKKzIwMTMtMTEtMTkgMTA6MTA6NTEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBhdm9pZCBtYXBwaW5nIHRoZSBidWZmZXIKKwkgIFJldXNlIHRoZSBwYXJzZWQgc3RydWN0dXJlIHRvIGdldCB0aGUgdGltZXN0YW1wcy4KKworMjAxMy0xMS0xOCAxNzoxMzo0OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4ICdtYWtlIGNoZWNrJworCSAgRml4IGdlbmVyaWMvc3RhdGVzIGNoZWNrLiBBbHNvLCBnX3JldHVybl9pZl9mYWlsKCkgaXMKKwkgIG5vdCBmb3IgaW50ZXJuYWwgc3RhdGUgY2hlY2tpbmcuCisKKzIwMTMtMTEtMTggMTQ6NDQ6MzYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zm92ZXJsYXkuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZnNpbmsuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkqIGV4dC9yYXcxMzk0L2dzdGhkdjEzOTRzcmMuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc3JjLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJKiBzeXMvb3NzNC9vc3M0LXNpbmsuYzoKKwkqIHN5cy9vc3M0L29zczQtc291cmNlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgZG9jczogZ2V0IHJpZCBvZiAnU2luY2U6IDAuMTAueCcgbWFya2VycworCSAgQW5kIHNvbWUgZ3RrLWRvYyBtYXJrdXAgZml4ZXMuCisKKzIwMTMtMTEtMTYgMTI6MTU6MTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwbWFuYWdlcjogZml4IFNpbmNlIG1hcmtlcnMKKwkgIFNob3VsZCBiZSBuZXh0IHN0YWJsZSByZWxlYXNlIHNlcmllcyB2ZXJzaW9uCisKKzIwMTMtMTEtMTUgMTM6NDg6MDcgKzAyMDAgIEdlb3JnZSBLaWFnaWFkYWtpcyA8Z2VvcmdlLmtpYWdpYWRha2lzQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IEZpeCBzdGF0cyBwcm9wZXJ0eSBmaWVsZCBuYW1lcyBhbmQgZG9jdW1lbnRhdGlvbgorCisyMDEzLTExLTE1IDE1OjIwOjE0ICswMTAwICBUb3JyaWUgRmlzY2hlciA8dG9ycmllLmZpc2NoZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIGdzdHJ0cHNlc3Npb246IEltcGxlbWVudCBhIG51bWJlciBvZiBmZWVkYmFjayBwYWNrZXQgc3RhdGlzdGljcworCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMTY5MworCisyMDEzLTExLTEzIDE3OjExOjA4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAcGFydG5lci5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiByZW1vdmUgbWF0aCBvcGVyYXRpb24gZnJvbSBsb29wCisJICBUaGUgZWxzdF9vZmZzZXQgZG9lc24ndCBjaGFuZ2UgaW5zaWRlIHRoZSBsb29wLCBzbyBjb21wdXRlIGl0CisJICBvdXRzaWRlCisKKzIwMTMtMTEtMTQgMjA6NTQ6MzIgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRtdXg6IGZpeCBwbGF5YmFjayByZWdyZXNzaW9uCisJICBJbiBhZTExNTBlODVjZjk5ZDc0ODI5MzNhYTZmN2U0ZjAxMmZlNDVhM2VjIGZsaXBwaW5nIGEgY29uZGl0aW9uIG1pc2FsaWduZWQgdGhlCisJICBlbHNlIGJyYW5jaCwgd2hlcmUgZm9yIHRoZXJlIGNvbmRpdGlvbiB0aGF0IHdhcyBjaGFuZ2UgdGhlcmUgaXMgbm9uZS4KKwkgIEZpeGVzICM3MTIzMDMKKworMjAxMy0xMS0xNCAwOToyMDowNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHJlbmFtZSBwcm9wZXJ0eSB0byAnc3RhdHMnCisJICBUaGlzIG1ha2VzIHRoZSB1bml0IHRlc3Qgd29yay4KKwkgIFdlIGNhbiBsYXRlciBhbHNvIGFkZCBtb3JlIHN0YXRzLCBub3Qgc3BlY2lmaWMgdG8gcmV0cmFuc21pc3Npb24uCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzExNDExCisKKzIwMTMtMTEtMTIgMTE6MTk6MjUgLTA1MDAgIFRvcnJpZSBGaXNjaGVyIDx0b3JyaWUuZmlzY2hlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGltcGxlbWVudCBydHggc3RhdGlzdGljcworCisyMDEzLTExLTEzIDEwOjQyOjIxICswMDAwICBNYXJjIExlZW1hbiA8bWFyYy5sZWVtYW5AZ21haWwuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyb2JqZWN0OiBwcmludCBGT1VSQ0NfRk9STUFUIHdoZW4gZW51bWVyYXRpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTIyMDYKKworMjAxMy0xMS0wNiAxMjo0MDowNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGFkdmFuY2UgZXhwZWN0ZWQgc2VxbnVtIGFmdGVyIGRyb3BwaW5nCisJICBBZnRlciBkcm9wcGluZyBhIGJ1ZmZlciwgbW92ZSBvdXIgZXhwZWN0ZWQgc2VxbnVtCisJICBDb25mbGljdHM6CisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYworCisyMDEzLTExLTA0IDE1OjQ2OjIyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSAgZ3N0cGF5OiBvbmx5IHNlbmQgb25lIGNhcHMKKwkgIE9ubHkgc2VuZCBvbmUgY2FwcyBpbiBhIHBhY2tldC4gVHdvIGNhcHMgY2FuIGhhcHBlbiB3aGVuIHNldGNhcHMgaXMgY2FsbGVkIGFuZAorCSAgdGhlIGNvbmZpZy1pbnRlcnZhbCBleHBpcmVzIGF0IHRoZSBzYW1lIHRpbWUuCisKKzIwMTMtMTEtMTMgMTA6MjM6MTkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IFVzZSB0aGUgc3luY2VkIGJ1ZmZlciBtb2RlIGluIGF1dG8gbW9kZSBpZiBhIGNsb2NrIHByb3ZpZGVyIGlzIGluIHRoZSBTRFAKKworMjAxMy0xMS0wOCAxMTowOToyMSArMDAwMCAgTWFyYyBMZWVtYW4gPG1hcmMubGVlbWFuQGdtYWlsLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGluaXQgdjRsMl9idWZmZXIgdG8gMHgwIGJlZm9yZSBpb2N0bAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMjEzNworCisyMDEzLTExLTExIDE1OjI3OjE4ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiByZW1vdmUgY29sbGlzaW9uIHJlY29uZmlndXJlIGV2ZW50CisJICBSZW1vdmUgYm9ndXMgcmVjb25maWd1cmUgZXZlbnQgb24gY29sbGlzaW9uLCB3ZSBkb24ndCB3YW50IHRvIHNlbmQgdGhlIGV2ZW50IG9uCisJICB0aGUgcmVjZWl2aW5nIFJUUCBwYWQgYW5kIHRoZSBjb2xsaXNpb24gZXZlbnQgaXMgbm93IGhhbmRsaW5nIHRoaXMKKwkgIGNhc2UuCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMTU2MAorCisyMDEzLTExLTAxIDE3OjA0OjI4ICswMDAwICBKdWxpZW4gSXNvcmNlIDxqdWxpZW4uaXNvcmNlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgZ3N0cnRwc2Vzc2lvbjogc2VuZCBjdXN0b20gdXBzdHJlYW0gZXZlbnQgIkdzdFJUUENvbGxpc2lvbiIgb24gc2VuZF9ydHBfc2luayBwYWQKKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzExNTYwCisKKzIwMTMtMTEtMTEgMTQ6MjU6NTEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHNlc3Npb24uYzoKKwkgIGNoZWNrOiBhZGQgcnRwc2Vzc2lvbiB0ZXN0CisJICBBZGQgYSBiYXNpYyBydHBzZXNzaW9uIHRlc3QgdG8gZW5zdXJlIHRoYXQgUlIgYmxvY2tzIGFyZSBnZW5lcmF0ZWQgd2hlbgorCSAgbXVsdGlwbGUgU1NSQyBzZW5kZXJzIGFyZSBhY3RpdmUuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzExMjcwCisKKzIwMTMtMTEtMTEgMTM6MTc6MjUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IGNvcnJlY3RseSBoYW5kbGUgdGltZXN0YW1wcyB3aGVuIHBhcnNpbmcgeC1wcml2YXRlMS1hYzMKKwkgIC4uLiB0aGUgd2F5IGl0IGhhcyBhbHdheXMgd29ya2VkIGZpbmUgaW4gYTUyZGVjLgorCisyMDEzLTExLTA1IDEwOjQ4OjMzICswMjAwICBHZW9yZ2UgS2lhZ2lhZGFraXMgPGdlb3JnZS5raWFnaWFkYWtpc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogZml4IGNyYXNoIHdoZW4gZG8tcmV0cmFuc21pc3Npb249dHJ1ZSBhbmQgYSBsb3Qgb2YgYnVmZmVycyBhcmUgbG9zdAorCSAgVGhlIHByb2JsZW0gaGVyZSB3YXMgdGhhdCB0aGUgaml0dGVyYnVmZmVyIGxvY2sgd2FzIHVubG9ja2VkIHRvIHB1c2gKKwkgIHRoZSBldmVudCwgYnV0IHRoYXQgY2F1c2VkIGFub3RoZXIgdGhyZWFkIHRvIHJlbW92ZSB0aGUgdGltZXIgY3VycmVudGx5CisJICBiZWluZyBwcm9jZXNzZWQsIHByb2JhYmx5IGJlY2F1c2UgdGhlIGFtb3VudCBvZiBydHggZXZlbnRzCisJICAoYW5kIHRoZXJlZm9yZSB0aW1lcnMpIHdhcyBnZXR0aW5nIHRvbyBoaWdoLiBUaGUgc29sdXRpb24gaXMgdG8KKwkgIHVubG9jayBhbmQgcHVzaCB0aGUgZXZlbnQgb25seSBhZnRlciB0aW1lciBwcm9jZXNzaW5nIGhhcyBmaW5pc2hlZC4KKwkgIGZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTExMzEKKworMjAxMy0xMC0yNCAxMzoxNjo0MiArMDIwMCAgUGVyIHggSm9oYW5zc29uIDxwZXJ4am9oQGF4aXMuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IEF2b2lkIGRpdmlzaW9uIGJ5IHplcm8gYXNzZXJ0IGluIGdzdF9tYXRyb3NrYV9kZW11eF9zZWFyY2hfcG9zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzExODI5CisKKzIwMTMtMTEtMDggMTc6NTk6MjQgKzAxMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBoaWxuQGlnYWxpYS5jb20+CisKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJICB3YXZlbmM6IGdlbmVyYXRlIGEgbm9uLWVtcHR5IGRhdGEgaGVhZGVyCisJICBSZXN0b3JlIHRoZSBiZWhhdmlvciBvZiB0aGUgZWxlbWVudCB0byB0aGUgc3RhdGUgYmVmb3JlIGNvbW1pdAorCSAgZGIyOTUyMmE0MzBlNDQ0NTA0MTVjYTM2NzZhYmQxYjc3ZWU5MjNkOS4gQSBub24tZW1wdHkgaGVhZGVyIGlzCisJICBnZW5lcmF0ZWQgYW5kIHdoZW4gdGhlIEVPUyBldmVudCBpcyByZWNlaXZlZCB0aGUgaGVhZGVyIGlzIGdlbmVyYXRlZAorCSAgYWdhaW4sIHRoaXMgdGltZSB3aXRoIHRoZSBjb3JyZWN0IHNpemUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzExNjk5CisKKzIwMTMtMTEtMDcgMTY6MTc6MTYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlOiB1cGRhdGUgcmVjZWl2ZXIgc3RhdHMgZm9yIHNlbmRlcgorCSAgQW4gaW50ZXJuYWwgc2VuZGVyIGluIGEgc2Vzc2lvbiBpcyBhbHNvIGEgcmVjZWl2ZXIgb2YgaXRzIG93biBwYWNrZXRzIHNvIHVwZGF0ZQorCSAgdGhlIHJlY2VpdmVyIHN0YXRzLiBPdGhlciBzZW5kZXJzIGluIHRoZSBzZXNzaW9uIHdpbGwgdXNlIHRoaXMgaW5mbyB0byBnZW5lcmF0ZQorCSAgY29ycmVjdCBSQiBibG9ja3MgaW4gdGhlaXIgU1IgcmVwb3J0cy4KKworMjAxMy0xMS0wNyAxNjoxMzoxNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IHJlZmFjdG9yIHJlY2VpdmVyIHN0YXRzIHVwZGF0ZQorCisyMDEzLTEwLTI1IDE4OjIyOjAwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAcGFydG5lci5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBoYW5kbGUgZnJhZ21lbnRlZCBmaWxlcyB3aXRoIG1kYXQgYmVmb3JlIG1vb2ZzCisJICBBc3N1bWUgYSBmaWxlIHdpdGggYXRvbXMgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogbW9vdiwgbWRhdCwgbW9vZiwKKwkgIG1kYXQsIG1vb2YgLi4uCisJICBUaGUgZmlyc3QgbW9vdiB1c3VhbGx5IGRvZXNuJ3QgY29udGFpbiBhbnkgc2FtcGxlIGVudHJpZXMgYXRvbXMgKG9yCisJICB0aGV5IGFyZSBhbGwgc2V0IHRvIDAgbGVuZ3RoKSwgYmVjYXVzZSB0aGUgcmVhbCBzYW1wbGVzIGFyZSBzaWduYWxlZAorCSAgYXQgdGhlIG1vb2ZzLiBJbiBwdXNoIG1vZGUsIHF0ZGVtdXggcGFyc2VzIHRoZSBtb292IGFuZCB0aGVuIGZpbmRzIHRoZSBtZGF0LAorCSAgYnV0IHRoZW4gaXQgaGFzIDAgZW50cmllcyBhbmQgYXNzdW1lcyBpdCBpcyBFT1MuCisJICBUaGlzIHBhdGNoIG1ha2VzIGl0IGNvbnRpbnVlIHBhcnNpbmcgaW4gY2FzZSBpdCBpcyBhIGZyYWdtZW50ZWQgZmlsZSBzbyB0aGF0CisJICBpdCBtaWdodCBmaW5kIHRoZSBtb29mcyBhbmQgcGxheSB0aGUgbWVkaWEuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzEwNjIzCisKKzIwMTMtMTAtMjUgMTE6NDI6MzcgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRzLnNhbnRvc0BwYXJ0bmVyLnNhbXN1bmcuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSAgcXRkZW11eDogV2hlbiB1c2luZyBhIGJ1ZmZlcmVkIG1kYXQsIHN0b3JlIGFsbCByZWNlaXZlZCBkYXRhIGZvciBsYXRlciB1c2UKKwkgIEluIHB1c2ggbW9kZSwgd2hlbiBxdGRlbXV4IGNhbid0IHVzZSBhIHNlZWsgdG8gc2tpcCB0aGUgbWRhdCBidWZmZXIgaXQgaGFzCisJICB0byBidWZmZXIgaXQgZm9yIGxhdGVyIHVzZS4KKwkgIFRoZSBpc3N1ZSBpcyB0aGF0IGFmdGVyIHBhcnNpbmcgdGhlIG5leHQgbW9vdi9tb29mLCB0aGVyZSBtaWdodCBiZSBzb21lCisJICB0cmFpbGluZyBieXRlcyBmcm9tIHRoZSBuZXh0IGF0b20gaW4gdGhlIGZpbGUuIFRoaXMgZGF0YSB3YXMgYmVpbmcgZGlzY2FyZGVkCisJICBhbG9uZyB3aXRoIHRoZSBhbHJlYWR5IHBhcnNlZCBtb292L21vb2YgYW5kIHBsYXliYWNrIHdvdWxkIGZhaWwgdG8gY29udGludWUKKwkgIGFmdGVyIHRoZSBjb250ZW50cyBvZiB0aGlzIG1vb3YvbW9vZiBhcmUgcGxheWVkLgorCSAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgYmFkIG9uIGZyYWdtZW50ZWQgZmlsZXMgdGhhdCBoYXZlIHRoZSBtZGF0IGJlZm9yZSB0aGUKKwkgIGNvcnJlc3BvbmRpbmcgbW9vZi4gU28geW91J2QgZ2V0OgorCSAgbWRhdHxtb29mfG1kYXR8bW9vZiAuLi4KKwkgIFdoZW4gYSBtb29mIHdhcyByZWNlaXZlZCwgaXQgdXN1YWxseSBjYW1lIHdpdGggc29tZSBleHRyYSBieXRlcyB0aGF0IHdvdWxkCisJICBiZWxvbmcgdG8gdGhlIG5leHQgbWRhdCAoYmVjYXVzZSB1cHN0cmVhbSBkb2Vzbid0IGNhcmUgYWJvdXQgYXRvbXMgYWxpZ25tZW50KS4KKwkgIFNvIHRob3NlIGJ5dGVzIHdlcmUgYmVpbmcgZGlzY2FyZGVkIGFuZCBwbGF5YmFjayB3b3VsZCBmYWlsLgorCSAgVGhpcyBwYXRjaCBtYWtlcyBxdGRlbXV4IHN0b3JlIHRob3NlIGV4dHJhIGJ5dGVzIHRvIHJldXNlIHRoZW0gbGF0ZXIgYWZ0ZXIgdGhlCisJICBtZGF0IGlzIGVtcHRpZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzEwNjIzCisKKzIwMTMtMTEtMDcgMDk6NDk6NTUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICBtdWx0aXVkcHNpbms6IEFsc28gdXNlIHRoZSBiaW5kLXBvcnQgcHJvcGVydHkgaWYgbm8gYmluZC1hZGRyZXNzIHdhcyBnaXZlbgorCisyMDEzLTExLTA3IDAwOjUxOjEyICswMTAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvaGFsLmM6CisJICBvc3hhdWRpb3Npbms6IGZpeCBzZWdmYXVsdCB3aGVuIHdlIGNhbid0IGdldCB0aGUgY2hhbm5lbHMgbGF5b3V0CisKKzIwMTMtMTEtMDUgMTc6MjY6NDkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5LmM6CisJICBydHB2cDhwYXk6IE1ha2UgUGljdHVyZSBJRCBtb2RlIGNvbmZpZ3VyYWJsZSBhbmQgZGVmYXVsdCB0byBubyBwaWN0dXJlIElECisJICBTb21lIGltcGxlbWVudGF0aW9ucyAobGlucGhvbmUpIG9ubHkgc3VwcG9ydCBubyBwaWN0dXJlIGF0IGFsbCBpbiB0aGUKKwkgIHN0cmVhbSBhbmQgd2lsbCBmYWlsIGlmIG9uZSBpcyBwcm92aWRlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTE0OTcKKworMjAxMy0xMS0wNSAxMToxODozNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDg2NWFhMjAgdG8gZGJlZGFhMAorCisyMDEzLTAxLTI5IDEwOjUxOjA3ICswMTAwICBQYXVsIEhFTlJZUyA8dmlzZWNoZWxsZUBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgQWRkIGNhbGwgdG8gZ3N0X3J0cF9oMjY0X3BheV9jbGVhcl9zcHNfcHBzKCkgd2hlbiByZWNlaXZpbmcgYSBTVFJFQU1fU1RBUlQgZXZlbnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTI3ODcKKworMjAxMy0xMS0wMiAyMjo1MDo0NyArMDEwMCAgUmljbyBUenNjaGljaGhvbHogPHJpY290ekB1YnVudHUuY29tPgorCisJKiBnc3QvcnRzcC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3A6IEFkZCBtaXNzaW5nIGdpby0yLjAgZGVwcyBhbmQgaW5jbHVkZXMKKworMjAxMy0xMS0wMSAxODozMTozNiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9paXJmaWx0ZXIuYzoKKwkgIGF1ZGlvaWlyZmlsdGVyOiBGaXggaW5pdGlhbGl6YXRpb24gY29lZmZpY2llbnQgaGFuZGxpbmcKKwkgIEJyb2tlIHVuaXQgdGVzdC4KKworMjAxMy0xMC0zMSAxNDowNTo0MyAtMDcwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1ZSA8YWxlaXhAb2Jsb25nLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogYWxsb3cgc2V0dGluZyB0bHMgY2VydGlmaWNhdGUgdmFsaWRhdGlvbiBmbGFncworCSAgQWRkZWQgYSBuZXcgcHJvcGVydHkgInRscy12YWxpZGF0aW9uLWZsYWdzIi4gSWYgdGhlIHVybCB0cmFuc3BvcnQgaXMKKwkgIFRMUywgdGhlIHZhbGlkYXRpb24gZmxhZ3Mgd2lsbCBiZSBzZXQgdG8gdGhlIHJ0c3AgY29ubmVjdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTEyMzAKKworMjAxMy0xMC0zMSAyMjo0Mzo0OSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmM6CisJICBhdWRpb2lpcmZpbHRlcjogRG9uJ3QgY3Jhc2ggaWYgbm8gZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgcHJvdmlkZWQKKwkgIC4uLmFuZCBieSBkZWZhdWx0IHVzZSBhIGlkZW50aXR5IGZpbHRlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTAyMTUKKworMjAxMy0xMC0zMSAxOToxNToxMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSAgd2F2cGFja2VuYzogRml4IHdyaXRpbmcgb2YgTUQ1IHN1bXMgYW5kIG90aGVyIG1ldGFkYXRhIGJsb2NrcworCSAgVGhlc2UgZG9uJ3QgaGF2ZSB0aGUgRklOQUxfQkxPQ0sgZmxhZyBzZXQuCisKKzIwMTMtMTAtMzEgMTM6MDI6MTEgLTAyMDAgIERqYWxtYSBMw7pjaW8gU29hcmVzIGRhIFNpbHZhIDxkbHVjaW9AaW1wYS5icj4KKworCSogZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jOgorCSAgaGR2MTM5NHNyYzogTWFrZSBpdCBwb3NzaWJsZSB0byBzZWxlY3QgYSBjYW1lcmEgYnkgaXRzIEdVSUQKKwkgIFRoZSBzb3VyY2UgaGR2MTM5NHNyYyBoYXMgdGhlIGd1aWQgcHJvcGVydHkgdGhhdCBwZXJtaXRzIHNlbGVjdCBhIGNhbWVyYQorCSAgY29ubmVjdGVkIGZyb20gaXRzIEdVSUQgbnVtYmVyLgorCSAgSG93ZXZlciB3aGVuIHRoaXMgcHJvcGVydHkgaXMgc2V0dGVkIHRoZSBzZWxlY3RlZCBjYW1lcmEgaXMgbm90IGNoYW5nZWQuCisJICBUaGUgc291cmNlIGNvbnRpbnVlcyB1c2luZyB0aGUgZGVmYXVsdCBjYW1lcmEuCisJICBUaGlzIHByb2JsZW0gd2FzIHNvbHZlZCB1c2luZyB0aGUgZnVuY3Rpb24gaWVjNjE4ODNfY21wX2Nvbm5lY3QuCisJICBUaGUgcmVmZXJlbmNlIGZvciB0aGUgZnVuY3Rpb24gY291bGQgYmUgZm91bmQgaGVyZToKKwkgIGh0dHA6Ly93d3cuZGVubmVkeS5vcmcvbGliaWVjNjE4ODMvQVBJLWllYzYxODgzLWNtcC1jb25uZWN0Lmh0bWwKKwkgIFRoZSBzb2x1dGlvbiBjYW1lIGZyb20gZHZncmFiIHNvdXJjZSBjb2RlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMDQxNQorCisyMDEzLTEwLTMxIDEzOjIwOjQxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAcGFydG5lci5zYW1zdW5nLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkgIHRlc3RzOiBzb3VwaHR0cHNyYzogYWRkIGV4cGxpY2l0IGNhc3QgdG8gc2lsZW5jZSB3YXJuaW5nCisJICBTaWxlbmNpbmcgdGhpcyB3YXJuaW5nOgorCSAgZWxlbWVudHMvc291cGh0dHBzcmMuYzo1MzM6MTQ6IGVycm9yOiBjb21wYXJpc29uIGJldHdlZW4g4oCYU291cEtub3duU3RhdHVzQ29kZeKAmSBhbmQg4oCYZW51bSA8YW5vbnltb3VzPuKAmSBbLVdlcnJvcj1lbnVtLWNvbXBhcmVdCisJICBpZiAoc3RhdHVzICE9IFNPVVBfU1RBVFVTX09LICYmICFzZW5kX2Vycm9yX2RvYykKKwkgIFdpdGggZ2NjIDQuOC4yIChkZWJpYW4pCisKKzIwMTMtMTAtMzEgMTA6Mzg6MzUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcHJveHkgbmV3IGJ1ZmZlciBtb2RlCisKKzIwMTMtMTAtMzAgMTY6NDk6MzYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBqaXR0ZXJidWZmZXI6IGFkZCBuZXcgdGltZXN0YW1wIG1vZGUKKwkgIEFkZCBhIG5ldyB0aW1lc3RhbXAgbW9kZSB0aGF0IGFzc3VtZXMgdGhlIGxvY2FsIGFuZCByZW1vdGUgY2xvY2sgYXJlCisJICBzeW5jaHJvbml6ZWQuIEl0IHRha2VzIHRoZSBmaXJzdCB0aW1lc3RhbXAgYXMgYSBiYXNlIHRpbWUgYW5kIHRoZW4gdXNlcyB0aGUgUlRQCisJICB0aW1lc3RhbXBzIGZvciB0aGUgb3V0cHV0IFBUUy4KKworMjAxMy0xMC0zMCAyMjoxMjo0NSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYS1kZW11eDogRml4IGNvbXBpbGVyIHdhcm5pbmcKKwkgIG1hdHJvc2thLWRlbXV4LmM6IEluIGZ1bmN0aW9uICdnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSc6CisJICBtYXRyb3NrYS1kZW11eC5jOjEzNzk6NzogZXJyb3I6IGZvcm1hdCAnJXUnIGV4cGVjdHMgYXJndW1lbnQgb2YgdHlwZSAndW5zaWduZWQgaW50JywgYnV0IGFyZ3VtZW50IDQgaGFzIHR5cGUgJ2d1aW50NjQnIFstV2Vycm9yPWZvcm1hdD1dCisJICAiJTAzdSIsIGNvbnRleHQtPnVpZCk7CisJICBeCisKKzIwMTMtMTAtMjggMTM6MjE6MTUgKzAwMDAgIE1hdHRoaWV1IEJvdXJvbiA8bWF0dGhpZXUuYm91cm9uQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvY29udmVydC5jOgorCSAgdmlkZW9taXhlcjogcmVtb3ZlIHVubmVlZGVkIGd1aW50IGNvbXBhcmFpc29uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzExMDEwCisKKzIwMTMtMTAtMjggMTQ6MTM6MTIgKzAwMDAgIE1hdHRoaWV1IEJvdXJvbiA8bWF0dGhpZXUuYm91cm9uQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJICBvc3h2aWRlb3Npbms6IGZpeCBtaXNzaW5nIHNlbGVjdG9yIG5hbWUgd2FybmluZ3MKKwkgIFRoZSBzcGFjZXMgbWF0dGVyIGluIE9iakMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTEwMTMKKworMjAxMy0xMC0yOCAxMzozMTozNCArMDAwMCAgTWF0dGhpZXUgQm91cm9uIDxtYXR0aGlldS5ib3Vyb25AY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIHk0bWVuYzogZml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgd2FybmluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMTAxMQorCisyMDEzLTEwLTI1IDExOjMwOjM2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0cy5zYW50b3NAcGFydG5lci5zYW1zdW5nLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBjaGVjayBpZiB0aGUgZW5kX3RpbWUgaXMgZGVmaW5lZCBiZWZvcmUgdXNpbmcgaXQKKwkgIEF2b2lkcyBzZW5kaW5nIEVPUyB0b28gc29vbiBiZWNhdXNlIG9mIG92ZXJmbG93LiBDYW4gaGFwcGVuIG9uCisJICBmcmFnbWVudGVkIG1wNCBwbGF5YmFjay4KKworMjAxMy0xMC0yMyAxMzozODoyMCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHBhcnRuZXIuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdXNlIGNvcnJlY3QgdW5yZWYgZnVuY3Rpb24KKwkgIEV2ZW50cyBhcmVuJ3QgR3N0T2JqZWN0cywgYnV0IEdzdE1pbmlPYmplY3RzCisKKzIwMTMtMTAtMTUgMDg6MTY6MjAgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVuYW1lIGNodW5rc19hcmVfY2h1bmtzIHRvIGNodW5rc19hcmVfc2FtcGxlcyBhbmQgZmxpcCB0aGUgbG9naWMKKwkgIEFzIHRoZSB2YXJpYWJsZSBuYW1lIHN1Z2dlc3RzLCBzb21ldGltZXMgY2h1bmtzIGFyZSBjaHVua3MuIFJlbmFtZSB0aGUgdmFyaWFibGUKKwkgIHRvIHRlbGwgd2hhdCB0aGV5IGFyZSB3aGVuIHRoZXkgYXJlIG5vdCBjaHVua3MuCisKKzIwMTMtMTAtMDkgMDg6MDQ6MjAgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IHR5cG9zIGFuZCBhZGQgbW9yZSBsb2dnaW5nIGZvciB1bmhhbmRsZWQgcGFydHMKKworMjAxMy0xMC0xNCAxNjoyMzoyNSArMDIwMCAgT2dueWFuIFRvbmNoZXYgPG9nbnlhbkBheGlzLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazogRml4IG1lbW9yeSBsZWFrCisJICBVbm1hcCBhbGwgR3N0TWVtb3J5IG9mIHRoZSBjdXJyZW50IGJ1ZmZlciB3aGVuIGZsdXNoaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcxMDExMAorCisyMDEzLTEwLTEyIDIwOjQ0OjMxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBmaXggYnJva2VuIHNhbXBsZSBwaXBlbGluZQorCSAgd2hpY2ggd2FzIG11eGluZyByYXcgYXVkaW8gYW5kIHZpZGVvIGludG8gZmx2bXV4LCB3aGljaCB3b24ndCB3b3JrLAorCSAgZXZlbiBpZiB0aGVyZSB3ZXJlIGNvbnZlcnRlcnMuCisKKzIwMTMtMTAtMTIgMjA6Mzc6NDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IHJlcXVpcmUgc3RyZWFtLWZvcm1hdD1yYXcgZm9yIG1wZWctMiB0b28sIGJ1dCBkb24ndCByZXF1aXJlIGZyYW1lZCBmaWVsZAorCSAgcmF3IGltcGxpZXMgdGhhdCBpdCdzIGZyYW1lZCBhbHJlYWR5LiBGaXhlcyAuLiAhIGZhYWMgISBmbHZtdXgKKworMjAxMy0xMC0wNyAxNDoyNzoyMSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dHMuc2FudG9zQHBhcnRuZXIuc2Ftc3VuZy5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IGRvIG5vdCBlbWl0IEVPUyB3aGVuIGNvbm5lY3Rpb24gZHJvcHMKKwkgIElmIHRoZSBwaXBlbGluZSBpcyBzdGFsbGVkIGZvciB0b28gbG9uZywgc291cGh0dHBzcmMgd2lsbCBibG9jayBhbmQKKwkgIHN0b3AgZmV0Y2hpbmcgZGF0YSBmcm9tIHRoZSBuZXR3b3JrLiBUaGlzIGNhbiBjYXVzZSB0aGUgY29ubmVjdGlvbiB0bworCSAgZHJvcCBhbmQgc291cGh0dHBzcmMgd291bGQgaGFuZGxlIGl0IGFzIGFuIEVPUy4gVGhpcyBwYXRjaCBtYWtlcyBpdAorCSAgcGVyc2lzdCBhbmQgdHJ5IHRvIGZldGNoIG1vcmUgZGF0YSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBjb250ZW50IGxlbmd0aAorCSAgb3IgdW50aWwgcmVjZWl2aW5nIGFuIGVycm9yIHRoYXQgaXQgaXMgYmV5b25nIGxpbWl0cyBpbiBjYXNlIHRoZSBjb250ZW50CisJICBpcyB1bmtub3duLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MzUzNgorCisyMDEzLTEwLTEwIDEzOjUyOjM1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSogZXh0L2R2L2dzdGR2ZGVjLmg6CisJICBkdmRlYzogRG9uJ3Qgc2VuZCBzZWdtZW50IGV2ZW50IGJlZm9yZSBjYXBzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5NzI4CisKKzIwMTMtMTAtMDkgMTc6NDY6MzMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkgIGR2ZGVtdXg6IFNlbmQgc3RyZWFtLXN0YXJ0LCBjYXBzIGFuZCBzZWdtZW50IGV2ZW50cyBpbiB0aGUgcmlnaHQgb3JkZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDk3MjgKKworMjAxMy0xMC0wOCAxMToyODowNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSAgd2F2ZW5jOiBBLUxhdyBhbmQgTXUtTGF3IGRvbid0IGhhdmUgd2lkdGgvZGVwdGgvc2lnbmVkIGNhcHMgZmllbGRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5NjE0CisKKzIwMTMtMTAtMDcgMTI6NTQ6MTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmM6CisJICBkZWludGVybGFjZTogRml4IGhhbmRsaW5nIG9mIHBsYW5hciB2aWRlbyBmb3JtYXRzIGluIGdyZWVkeWggbWV0aG9kCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5NTA3CisKKzIwMTMtMTAtMDYgMTA6MDE6MjYgLTA3MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHIudmVyZGVqb0BwYXJ0bmVyLnNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYTogVHJpdmlhbCBncmFtbWFyIGZpeCBvbiBkZWJ1ZyBtc2cKKworMjAxMy0xMC0wNiAwOToxNzowMCAtMDcwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8ci52ZXJkZWpvQHBhcnRuZXIuc2Ftc3VuZy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkqIGdzdC9tYXRyb3NrYS93ZWJtLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IEFkZCBjb250ZXh0IGZsYWcgZm9yIFdlYk0KKwkgIFdlYk0gaGFzIGEgY291cGxlIG9mIHNwZWNpZmljIHJlcXVpcmVtZW50cyB3ZSBuZWVkIHRvIGhhbmRsZS4KKwkgIElkZWEgaXMgdG8gc2V0IHRoaXMgZmxhZyBvbmNlIGFuZCBqdXN0IHJlbHkgb24gbXV4LT5pc193ZWJtCisJICBhdCBydW4gdGltZSBpbnN0ZWFkIG9mIHJlcGVhdGVkbHkgZmlndXJpbmcgdGhpcyBvdXQgZnJvbQorCSAgR1NUX01BVFJPU0tBX0RPQ1RZUEVfV0VCTSAod2hpY2ggcmVxdWlyZXMgYSBzdHJjbXAoKSkuCisKKzIwMTMtMTAtMDQgMTQ6NDI6NTkgLTA3MDAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQgPHIudmVyZGVqb0BwYXJ0bmVyLnNhbXN1bmcuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYTogRG8gbm90IHdyaXRlIFNlZ21lbnRVSUQgZm9yIFdlYk0gbXV4CisJICBXZWJNIHNwZWMgc3RhdGVzIFNlZ21lbnRVSUQgaXMgVW5zdXBwb3J0ZWQuIEZpbGVzIHByb2R1Y2VkCisJICB3aXRoIGdzdHJlYW1lciB3aXRob3V0IHRoaXMgY2hhbmdlIHdpbGwgc3BpdCBhbiBlcnJvciBsaWtlCisJICB0aGlzIHdoZW4gcGFzc2VkIHRvIG1rdmFsaWRhdG9yOgorCSAgRVJSMjAxOiBJbnZhbGlkICdTZWdtZW50VUlEJyBmb3IgcHJvZmlsZSAnd2VibScgaW4gSW5mbyBhdCAxOTIKKworMjAxMy0xMC0wNSAwMDowMDowMyArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBtYWtlIGR2ZCBwYWxldHRlIGNoYW5nZSBldmVudCBzdGlja3kKKwkgIFNvIHRoZXkgZG9uJ3QgZ2V0IGxvc3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5NDU0CisKKzIwMTMtMTAtMDMgMTY6Mzk6MjYgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5oOgorCSAgdmlkZW9mbGlwOiBBZGQgYXV0b21hdGljIGZsaXAgbW9kZSBkcml2ZW4gYnkgaW1hZ2Utb3JpZW50YXRpb24gdGFnCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5MzEyCisKKzIwMTMtMTAtMDQgMTM6MzQ6MDkgKzAyMDAgIFBldGVyIEtvcnNnYWFyZCA8cGV0ZXJAa29yc2dhYXJkLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBPX0NMT0VYRUMgbmVlZHMgX0dOVV9TT1VSQ0UKKwkgIE9uIHNvbWUgc3lzdGVtcyAoRS5HLiB1Q2xpYmMgYW5kIG9sZGVyIEdsaWJjIHZlcnNpb25zKSwgT19DTE9FWEVDIGlzIG9ubHkKKwkgIGRlZmluZWQgd2hlbiBfR05VX1NPVVJDRSBpcyBzcGVjaWZpZWQsIHNvIGRvIHNvLgorCSAgX0dOVV9TT1VSQ0UgbmVlZHMgdG8gYmUgZGVmaW5lZCBiZWZvcmUgYW55IHN5c3RlbSBoZWFkZXJzIGFyZSBpbmNsdWRlZCwKKwkgIHNvIG1vdmUgdGhlIGZjbnRsLmggc2VjdGlvbiB1cC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDk0MjMKKworMjAxMy0xMC0wNCAxMjoxMTo1NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGZpeCByYWNlIGluIGZsdXNoLXN0YXJ0L2ZsdXNoLXN0b3AKKwkgIFdoZW4gZmx1c2gtc3RvcCBhcnJpdmVzIGJlZm9yZSB3ZSBwcm9jZXNzIHRoZSByZXN1bHQgb2YgdGhlIF9wdXNoKCkgaW4gdGhlCisJICBsb29wIGZ1bmN0aW9uLCB3ZSBtaWdodCBwYXVzZSBldmVuIHRob3VnaCB3ZSBhcmUgbm90IGZsdXNoaW5nIGFueW1vcmUuIEZpeCB0aGlzCisJICByYWNlIGJ5IHdhaXRpbmcgZm9yIHRoZSBzcmNwYWQgbG9vcCBmdW5jdGlvbiB0byBjb21wbGV0ZWx5IHBhdXNlIGFmdGVyIGRvaW5nIHRoZQorCSAgZmx1c2gtc3RhcnQuCisKKzIwMTMtMTAtMDMgMjI6Mzg6NDMgKzAyMDAgIE1hdGhpZXUgRHVwb25jaGVsbGUgPG1kdXBvbmNoZWxsZTFAZ21haWwuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb2NvbnZlcnQuYzoKKwkgIHZpZGVvbWl4ZXI6IFVwZGF0ZSB2aWRlb2NvbnZlcnQgY29weQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwOTM5MAorCisyMDEzLTEwLTAzIDIxOjM2OjM0ICswMjAwICBNYXRoaWV1IER1cG9uY2hlbGxlIDxtZHVwb25jaGVsbGUxQGdtYWlsLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IENoZWNrIGlmIHRoZSBwYWQgbmVlZHMgcmVjb25maWd1cmF0aW9uIGluIGNvbGxlY3RlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwOTM4NAorCisyMDEzLTEwLTAzIDE0OjM5OjM1ICswMTAwICBNYXR0aGlldSBCb3Vyb24gPG1hdHRoaWV1LmJvdXJvbkBjb2xsYWJvcmEuY29tPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBSZWxheCBzaW5rIGNhcHMKKwkgIFNpbmNlIGpwZWdkZWMgYWxyZWFkeSBwYXJzZSB0aGUganBlZyBzdHJlYW0sIHRoZSBzaW5rIGNhcHMgY291bGQgYmUKKwkgIHJlbGF4ZWQuIFRoaXMgd2lsbCBhbGxvdyBqcGVnZGVjIHRvIGJlIHNlbGVjdGVkIGluIG1vcmUgY2FzZSBhbmQgaW4KKwkgIHBhcnRpY3VsYXIgd2hlbiB0aGUganBlZyB0eXBlZmluZGVyIGRvZXMgbm90IGZpbmQgdGhlIHdpZHRoIGFuZCBoZWlnaHQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5MzUyCisKKzIwMTMtMTAtMDMgMTg6MzM6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IHByaW50IHByb2JlZCBjYXBzIGFzIGNhcHMgYWdhaW4gaW4gZGVidWcgbG9nCisJICBUaGlzIGdvdCBsb3N0IGR1cmluZyByZWZhY3RvcmluZy4KKworMjAxMy0xMC0wMyAxMTo1OToyNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEFkZCBzdXBwb3J0IGZvciB0aGUgbXAydiBmb3VyY2MgZm9yIE1QRUctMiB2aWRlbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwOTI3MAorCisyMDEzLTEwLTAyIDE1OjU2OjUzICswMjAwICBPZ255YW4gVG9uY2hldiA8b2dueWFuQGF4aXMuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IEZpeCBtZW1vcnkgbGVhaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwOTI2NgorCisyMDEzLTA5LTMwIDEyOjMxOjQyICswMzAwICBTcmVlcmVuaiBCYWxhY2hhbmRyYW4gPHNyZWVyZW5qLmJhbGFjaGFuZHJhbkBpbnRlbC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmM6CisJICBxdGRlbXV4OiBBZGQgSEVWQyBzdXBwb3J0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA5MDkzCisKKzIwMTMtMDktMzAgMTI6MjQ6MzIgKzAyMDAgIE9nbnlhbiBUb25jaGV2IDxvZ255YW5AYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJICBydHBnc3RwYXk6IEZpeCBtZW1vcnkgbGVhaworCSAgV2Ugd2VyZSBsZWFraW5nIHRoZSBHTGlzdCBub2RlcyBvZiB0aGUgcGVuZGluZyBidWZmZXJzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwOTA3OQorCisyMDEzLTA5LTMwIDEyOjMxOjAwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgcnRwaml0dGVyYnVmZmVyOiBmaXggcmFjZSB3aGVuIHVwZGF0aW5nIHRoZSBuZXh0X3NlcW51bQorCSAgSWYgd2Ugd2VyZSBub3Qgd2FpdGluZyBmb3IgdGhlIG1pc3Npbmcgc2VxbnVtIHdoZW4gd2UgaW5zZXJ0IHRoZSBsb3N0IHBhY2tldAorCSAgZXZlbnQgaW4gdGhlIGppdHRlcmJ1ZmZlciwgd2UgZW5kIHVwIG5vdCB1cGRhdGluZyB0aGUgbmV4dF9zZXFudW0gYW5kIHdhaXQKKwkgIGZvcmV2ZXIgZm9yIHRoZSBsb3N0IHBhY2tldHMgdG8gYXJyaXZlLiBJbnN0ZWFkLCBrZWVwIHRyYWNrIG9mIHRoZSBhbW91bnQgb2YKKwkgIHBhY2tldHMgY29udGFpbmVkIGJ5IHRoZSBqaXR0ZXJidWZmZXIgaXRlbSBhbmQgdXBkYXRlIHRoZSBuZXh0IGV4cGVjdGVkCisJICBzZXFudW0gb25seSBhZnRlciBwdXNoaW5nIHRoZSBidWZmZXIvZXZlbnQuIFRoaXMgbWFrZXMgc3VyZSB3ZSBjb3JyZWN0bHkgaGFuZGxlCisJICBHQVBTIGluIHRoZSBzZXF1ZW5jZSBudW1iZXJzLgorCisyMDEzLTA5LTMwIDEyOjMwOjIzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogc21hbGwgZGVidWcgaW1wcm92ZW1lbnQKKworMjAxMy0wOS0zMCAxMTo1MzowOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHJlc2V0IHNrZXcgZG9lcyBub3QgcmVzZXQgY2xvY2stcmF0ZQorCSAgRG9uJ3QgcmVzZXQgdGhlIGNsb2NrLXJhdGUgd2hlbiB3ZSByZXNldCB0aGUgc2tldyBjb3JyZWN0aW9uIGFsZ29yaXRobS4KKwkgIFJlc2V0IHRoZSBza2V3IGNvcnJlY3Rpb24gYWxnb3JpdGhtIHdoZW4gd2UgY2hhbmdlIHRoZSBjbG9jay1yYXRlLgorCisyMDEzLTA5LTMwIDExOjE2OjMyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogcGF1c2UgdGltZXIgd2hlbiBQQVVTRUQKKwkgIEFsc28gcGF1c2UgdGhlIHRpbWVyIHdoZW4gd2UgZ28gdG8gdGhlIFBBVVNFRCBzdGF0ZS4gSXQgaXMgcG9zc2libGUgdGhhdCB3ZQorCSAgZG9uJ3QgaGF2ZSBhIGNsb2NrIG9yIGJhc2UtdGltZSBpbiBQQVVTRUQgdG8gcGVyZm9ybSB0aGUgdGltZW91dHMuCisKKzIwMTMtMDktMzAgMTE6MTU6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBpbXByb3ZlIGRlYnVnCisKKzIwMTMtMDktMjYgMjA6NDE6MjYgKzAyMDAgIEhhbnMgTcOlbnNzb24gPGhhbnNtQGF4aXMuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJICBtcDRtdXg6IERvIG5vdCByZXF1aXJlIGZyYW1lcmF0ZSBpbiBwZWVyIHZpZGVvIGNhcHMKKwkgIFJlbW92ZSB0aGUgZnJhbWVyYXRlIHJlc3RyaWN0aW9uIG9uIHRoZSBjYXBzLgorCSAgUmVmZXJlbmNlOiBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA4ODY0CisKKzIwMTMtMDktMjcgMTU6MDU6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGFsc28gZ28gaW50byB0aGUgbG9vcCBmdW5jdGlvbiBhZnRlciBjb25uZWN0CisJICBXaGVuIHdlIGhhdmUgb3BlbmVkIHRoZSBzdHJlYW0sIGdvIGludG8gdGhlIGxvb3AgZnVuY3Rpb24gc28gdGhhdCB3ZSBjYW4KKwkgIHJlY2VpdmUgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyLgorCisyMDEzLTA5LTI3IDEyOjUzOjA2ICswMjAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IG1vdmUgdGhlIGNoZWNrIGZvciBzdWJ0aXRsZSBidWZmZXIgYmVpbmcgbnVsbCB0ZXJtaW5hdGVkIGJlZm9yZSB2YWxpZGF0aW5nIFVURi04CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3OTMzCisKKzIwMTMtMDktMjYgMTY6MjA6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBkb24ndCBjYWxjdWxhdGUgc2tldyB3aXRob3V0IHJ0cHRpbWUKKwkgIFNraXAgdHJ5aW5nIHRvIGNhbGN1bGF0ZSB0aGUgc2tldyB3aGVuIHdlIGRvbid0IGhhdmUgYW4gcnRwdGltZS4KKwkgIEl0IGNhdXNlcyBwcm9ibGVtcyB3aGVuIGxvc3QgcGFja2V0IGV2ZW50cyBhcmUgcGxhY2VkIGluIHRoZSBqaXR0ZXJidWZmZXIuCisKKzIwMTMtMDktMjUgMjM6NDY6MTQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogZ2V0IHJpZCBvZiBBU19TQ1JVQl9JTkNMVURFCisJICBTaG91bGQgbm90IGJlIG5lZWRlZCBhbnkgbW9yZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDc2NTgKKworMjAxMy0wOS0yNSAxNzo0MjowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZGlzYWJsZSBjaGVja3Mgd2hlbiBsaW5raW5nIHBhZHMKKwkgIFdlIGtub3cgdGhlIHBhZCBsaW5rcyB3aWxsIHdvcmsgKGFuZCB3ZSBkb24ndCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlCisJICBhbnl3YXkpLgorCisyMDEzLTA5LTI1IDE3OjM2OjE1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogYXZvaWQgc29tZSBwYWQgbGluayBjaGVja3MKKwkgIExpbmsgcGFkcyB3aXRob3V0IGNoZWNrcywgd2Uga25vdyBpdCB3aWxsIHdvcmsuCisKKzIwMTMtMDktMjUgMTI6NTU6MjEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IERvbid0IGVycm9yIG91dCBpZiBkb3duc3RyZWFtIGlzIG5vdCBzZWVrYWJsZSBmb3Igbm9uLWZyYWdtZW50ZWQgdmFyaWFudHMKKwkgIERvaW5nIHNvIHdvdWxkIGJlIGEgcmVncmVzc2lvbiBvdmVyIDEuMCBhbmQgYnJlYWtzIHRoZSB1bml0IHRlc3QuCisJICBIb3dldmVyIHRoZSByZXN1bHQgd2lsbCBiZSBtb3N0IGxpa2VseSB1bnVzYWJsZSwgc28gbGV0J3MgcG9zdAorCSAgYSB3YXJuaW5nIG1lc3NhZ2Ugb24gdGhlIGJ1cy4KKworMjAxMy0wOS0yNCAwNDowMjowOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGNhbGN1bGF0ZSBzb21lIHN0YXRzCisKKzIwMTMtMDktMjMgMTc6MDU6NDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBtb3ZlIHNlbmRfbG9zdF9ldmVudCBmdW5jdGlvbgorCSAgTW92ZSB0aGUgc2VuZF9sb3N0X2V2ZW50IGZ1bmN0aW9uIHRvIHRoZSBkb19sb3N0X2V2ZW50IGhhbmRsaW5nLCB0aGVyZSBpcyBubworCSAgbmVlZCB0byBoYXZlIGEgc2VwYXJhdGUgZnVuY3Rpb24uCisKKzIwMTMtMDktMTYgMTE6MjA6NTEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgY29kZSB0byBwYXJzZSBjcmVhdGlvbiB0aW1lIGVhcmxpZXIgdGhhbiAxOTcwCisJICBVc2UgZ19kYXRlX3RpbWUgc2Vjb25kcyBtYW5pcHVsYXRpb24gdG8gYWxsb3cgdG8gY292ZXIgdGhlIHF1aWNrdGltZQorCSAgc3BlYyBmb3IgY3JlYXRpb25fdGltZS4gSXQgdXNlcyBzZWNvbmRzIHNpbmNlIDE5MDQuCisJICBCb3RoIHBhdGhzIGNvdWxkIGJlIGRvbmUgdXNpbmcgdGhlIGdlbmVyaWMgYXBwcm9hY2ggb2Ygc2Vjb25kcyBzaW5jZQorCSAgMTkwNCB3aXRoIEdEYXRlVGltZSBoYW5kbGluZywgYnV0IHRoZSBmaXJzdCBwYXRoIHVzaW5nIHNlY29uZHMgZnJvbQorCSAgMTk3MCBzaG91bGQgYmUgbW9yZSBjb21tb25seSBmb3VuZCBhbmQgYXZvaWRzIGEgZmV3IG9iamVjdHMgY3JlYXRpb24gYW5kCisJICByZWYvdW5yZWYsIHNvIGtlZXAgaXQgdGhlcmUgZm9yIHBlcmZvcm1hbmNlLgorCSAgQWRkaXRpb25hbGx5LCB0aGUgY29kZSBmb3IgaGFuZGxpbmcgc2Vjb25kcyBzaW5jZSAxOTcwIGNoYW5nZWQgZnJvbSA+CisJICB0byA+PSBiZWNhdXNlIGhhdmluZyAwIHNlY29uZHMgc2luY2UgMTk3MCBpcyBhbHNvIGEgdmFsaWQgY2FzZSBmb3IgdGhhdAorCSAgcGF0aCB0byBoYW5kbGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3OTc1CisKKzIwMTMtMDktMjEgMDA6NTU6MjYgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogdXBkYXRlIHN0cmVhbS0+cG9zIHdoZW4gc2VuZGluZyBidWZmZXJzIHNvIHRoYXQgZ2FwIGV2ZW50cyBhcmUgbm90IHNlbnQgdW5uZWNlc3NhcmlseQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwODUwNQorCisyMDEzLTA5LTI0IDE4OjMwOjA0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBSRUFETUU6CisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNmIwM2JhNyB0byA4NjVhYTIwCisKKzIwMTMtMDktMjQgMTU6MDU6MjQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBBY3R1YWxseSB1c2UgMS4zLjAuMSBhcyB2ZXJzaW9uIHRvIG1ha2UgY29uZmlndXJlIGhhcHB5CisKKzIwMTMtMDktMjQgMTU6MDA6MjQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjIuMCA9PT0KKworMjAxMy0wOS0yNCAxNDoyMTowOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0bWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjIuMAorCisyMDEzLTA5LTI0IDE0OjIwOjUxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2hyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTMtMDktMjAgMTk6NDM6MjEgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogZml4IHNlZ2ZhdWx0IHJlbGVhc2luZyB0aGUgc2luaworCSAgc2hvd19mcmFtZSBpcyBkZWZlcnJlZCB0byB0aGUgbWFpbiB0aHJlYWQgYW5kIGNhbiBiZSBjYWxsZWQKKwkgIHdoZW4gdGhlIHNpbmsgaGFzIGJlZW4gcmVsZWFzZWQsIHNvIHdlIG5lZWQgdG8ga2VlcCBhbiBleHRyYSByZWYKKwkgIG9uIE9iamVjdGl2ZUMgb2JqZWN0IGhlbHBlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDg1MDEKKworMjAxMy0wOS0xOSAxNzoxMTozNCAtMDQwMCAgUm9iZXJ0IEtyYWtvcmEgPHJvYi5rcmFrb3JhQG1lc3NhZ2VuZXRzeXN0ZW1zLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBSZXN0b3JlIG9yaWdpbmFsIEdzdE1lbW9yeSBpbiBidWZmZXIgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNjA4MworCisyMDEzLTA5LTIzIDE2OjM0OjE1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cG1hbmFnZXI6IHVwZGF0ZSBkb2NzCisKKzIwMTMtMDktMjMgMTU6MzY6MzIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIGRvY3M6IHVwZGF0ZSBkb2NzIHdpdGggMS4wIGVsZW1lbnQgbmFtZXMKKworMjAxMy0wOS0yMyAxNDoxMzozMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICB0ZXN0czogYWRkIHRlc3QgZm9yIHJldHJhbnNtaXNzaW9uIGJlY2F1c2Ugb2YgcmVvcmRlcmluZworCisyMDEzLTA5LTIzIDE0OjEyOjAzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogYWx3YXlzIHN0b3JlIGxvc3QgZXZlbnQgaW4gaml0dGVyYnVmZmVyCisJICBBbHdheXMgcHJlcGFyZSBhIGxvc3QgZXZlbnQgaW4gdGhlIGppdHRlcmJ1ZmZlciwgaXQgaXMgdG8gd2FrZSB1cCBhbmQgbWFrZSB0aGUKKwkgIHB1c2hpbmcgdGhyZWFkIGNvbnRpbnVlLiBXZSBkcm9wIHRoZSBldmVudCB3aGVuIHdlIGFyZSBub3Qgc3VwcG9zZWQgdG8gcHVzaCBsb3N0CisJICBldmVudHMgZG93bnN0cmVhbS4KKworMjAxMy0wOS0yMyAxMToxODo0NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHNjaGVkdWxlIGxvc3QgZXZlbnQgZGlmZmVyZW50bHkKKwkgIFNjaGVkdWxlIHRoZSBsb3N0IGV2ZW50IGJ5IHBsYWNpbmcgaXQgaW5zaWRlIHRoZSBqaXR0ZXJidWZmZXIgd2l0aCB0aGUgc2VxbnVtCisJICB0aGF0IHdhcyBsb3N0IHNvIHRoYXQgdGhlIHB1c2hpbmcgdGhyZWFkIGNhbiBpbnRlcmxlYXZlIGFuZCBwdXNoIGl0IHByb3Blcmx5LgorCisyMDEzLTA5LTIzIDExOjE3OjM0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHRlc3RzOiByZW1vdmUgdGltZW91dHMgZnJvbSBjaGVjaworCSAgVGltZW91dHMgbWFrZSB0aGUgdGVzdCB1bnJlbGlhYmxlIGFuZCBhcmUgbm90IG5lZWRlZC4KKworMjAxMy0wOS0yMyAxMToxNTozMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHJlbW92ZSBsaXN0IGRlYnVnCisKKzIwMTMtMDktMjMgMTE6MTQ6MDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBydHBqaXR0ZXJidWZmZXI6IGFkZCB0eXBlIHRvIHRoZSBpdGVtCisJICBTbyB0aGF0IHRoZSB1cHBlciBsYXllciBjYW4ga25vdyB3aGF0IGRhdGEgaXMgY29udGFpbmVkIGluIHRoZSBpdGVtLgorCisyMDEzLTA5LTIzIDA5OjU4OjMyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBydHBqaXR0ZXJidWZmZXI6IGZpeCBmbHVzaAorCSAgUGFzcyBmdW5jdGlvbiB0byBmbHVzaCB0byBwcm9wZXJseSBmcmVlIHRoZSBxdWV1ZSBpdGVtcy4KKworMjAxMy0wOS0yMSAwMDowODoyMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGFwcGVuZCBzZXFudW0gLTEgcGFja2V0cworCisyMDEzLTA5LTIwIDIzOjQ4OjIwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBydHBqaXR0ZXJidWZmZXI6IHVzZSBzdHJ1Y3R1cmUgdG8gaG9sZCBwYWNrZXQgaW5mb3JtYXRpb24KKwkgIE1ha2UgdGhlIGppdHRlcmJ1ZmZlciBvcGVyYXRlIG9uIGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgYWxsIHRoZSBwYWNrZXQKKwkgIGluZm9ybWF0aW9uLiBUaGlzIGF2b2lkcyBtYXBwaW5nIHRoZSBidWZmZXIgbXVsdGlwbGUgdGltZXMganVzdCB0byBnZXQgdGhlIFJUUAorCSAgaW5mb3JtYXRpb24uIEl0IHdpbGwgYWxzbyBtYWtlIGl0IHBvc3NpYmxlIHRvIHN0b3JlIG90aGVyIG1pbmlvYmplY3RzIHN1Y2ggYXMKKwkgIGV2ZW50cyBsYXRlci4KKworMjAxMy0wOS0yMCAxNzo0ODo1MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHVwZGF0ZSBleHBlY3RlZCB0aW1lciB3aGVuIHBvc3NpYmxlCisJICBXaGVuIHdlIHJlY2VpdmUgYSBwYWNrZXQgYW5kIHdlIGhhdmUgc29tZSBtaXNzaW5nIHBhY2tldHMsIHdlIGNhbiB1cGRhdGUgdGhlaXIKKwkgIGVzdGltYXRlZCBhcnJpdmFsIHRpbWVzIGJhc2VkIG9uIHRoZSB0aW1lc3RhbXAgZGlmZmVyZW5jZS4KKworMjAxMy0wOS0yMCAxNzoxODoyNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGZpeCBvcmRlciBvZiB0aW1lb3V0IGV2ZW50cworCSAgSW1wcm92ZSB0aGUgb3JkZXIgb2YgdGhlIHRpbWVvdXQgZXZlbnRzLCBpZiB0aGVyZSBhcmUgdGltZXJzIHdpdGggdGhlIHNhbWUKKwkgIHRpbWVvdXQsIHdlIHdhbnQgdG8gdHJpZ2dlciB0aGUgbG93ZXN0IHNlcW51bSBmaXJzdC4gRm9yIHRoaXMgd2UgbmVlZCB0byBsb29wCisJICBvdmVyIHRoZSBjb21wbGV0ZSBhcnJheSBvZiB0aW1lcnMgdG8gZmluZCB0aGUgYmVzdCBvbmUgYmVmb3JlIHRyaWdnZXJpbmcgdGhlCisJICB0aW1lb3V0LgorCisyMDEzLTA5LTIwIDE2OjU4OjM4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogc2VuZCBsb3N0IGV2ZW50IGJlZm9yZSBzaWduYWxpbmcgbmV4dCBidWZmZXIKKwkgIEZpcnN0IHNlbmQgdGhlIGxvc3QgZXZlbnQsIHRoZW4gdXBkYXRlIHRoZSBuZXh0X3NlcW51bSBjb3VudGVyIGFuZCB0aGVuCisJICBzZW5kIHRoZSBzaWduYWwgdG8gdGhlIHB1c2hpbmcgdGhyZWFkIHRoYXQgaXQgY2FuIHJldHJ5IHRvIHB1c2ggYSBidWZmZXIuIFRoaXMKKwkgIGF2b2lkcyBwdXNoaW5nIG91dCBidWZmZXJzIGJlZm9yZSB0aGUgbG9zdCBldmVudCBpcyBwdXNoZWQuCisKKzIwMTMtMDktMjAgMTU6MzU6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkgIGppdHRlcmJ1ZmZlcjogY29uZmlndXJlIGNsb2NrLXJhdGUgb24gaml0dGVyYnVmZmVyCisJICBBZGQgYSBnZXQgYW5kIHNldHRlciB0byBjb25maWd1cmUgdGhlIGNsb2NrLXJhdGUgaW4gdGhlIGppdHRlcmJ1ZmZlciBpbnN0ZWFkIG9mCisJICBwYXNzaW5nIGl0IGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBpbnNlcnQgbWV0aG9kLgorCisyMDEzLTA5LTIwIDEyOjI5OjM5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHRlc3RzOiBhZGQgdGVzdCBmb3IgcGFja2V0IGRlbGF5IGFuZCByZXRyYW5zbWlzc2lvbgorCisyMDEzLTA5LTIwIDEyOjI3OjI2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogYWRkIG9wdGlvbiB0byByZXNldCByZXRyYW5zbWlzc2lvbiB0aW1lcnMKKworMjAxMy0wOS0yMCAxMjoyNTo0MyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHN0b3AgdGhlIHRpbWVyIHRocmVhZAorCSAgVGhlIHRpbWVvdXQgY29kZSBjb3VsZCByZWxlYXNlIHRoZSBsb2NrIHNvIHdlIG5lZWQgdG8gY2hlY2sgaWYgd2UgYXJlIGFsbG93ZWQgdG8KKwkgIHdhaXQgZm9yIHRoZSBjbG9jayBzb21lIG1vcmUuCisKKzIwMTMtMDktMjAgMTI6MjU6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiB1bmxvY2sgb25seSBvbmNlCisKKzIwMTMtMDktMjAgMTE6MzA6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgdGVzdHM6IGNoZWNrIGJvdGggUFRTIGFuZCBEVFMKKworMjAxMy0wOS0yMCAxMDo1NTowMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICB0ZXN0czogYWRkIHVuaXQtdGVzdCBmb3IgbXVsdGlwbGUgbWlzc2luZyBwYWNrZXRzCisJICBDaGVjayBpZiBtdWx0aXBsZSBtaXNzaW5nIHBhY2tldHMgZ2VuZXJhdGUgcmV0cmFuc21pc3Npb24gZXZlbnRzIGFuZCB0aGF0IHRoZQorCSAgcmV0cmFubWlzc2lvbiByZXF1ZXN0cyBhcmUgY2FuY2VsZWQgd2hlbiB0aGUgbWlzc2luZyBwYWNrZXQgYXJyaXZlcy4KKworMjAxMy0wOS0yMCAxMDo1MzoyOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGltcHJvdmUgZmx1c2ggYW5kIHNodXRkb3duCisJICBUaGVyZSBpcyBubyBuZWVkIHRvIHVuc2NoZWR1bGUgdGhlIHRpbWVyIGluIGZsdXNoLXN0YXJ0LCBmbHVzaC1zdG9wIHdpbGwgcmVtb3ZlCisJICB0aGUgdGltZXJzIGFuZCB1bnNjaGVkdWxlLgorCSAgVW5zY2hlZHVsZSB0aGUgY3VycmVudCB0aW1lciBiZWZvcmUgYXR0ZW1wdGluZyB0byBqb2luIHRoZSB0aW1lciB0aHJlYWQuCisKKzIwMTMtMDktMjAgMTA6NDM6NTMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgdGVzdHM6IGltcHJvdmUgZGVidWcKKworMjAxMy0wOS0yMCAxMDo0MjoyNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHNldCBjb3JyZWN0IGV4cGVjdGVkIHRpbWUKKwkgIFdoZW4gd2UgYWxyZWFkeSBoYXZlIGEgdGltZXIgZm9yIGEgcGFja2V0LCBza2lwIGl0IGJ1dCBkb24ndCBmb3JnZXQgdG8gYWRqdXN0CisJICB0aGUgZHRzIHRvIHRoZSBleHBlY3RlZCBkdHMgb2YgdGhlIG5leHQgcGFja2V0LgorCisyMDEzLTA5LTIwIDEwOjQxOjU5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogaW1wcm92ZSBkZWJ1ZworCisyMDEzLTA5LTE5IDE2OjU1OjI1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgIGFscGhhOiB1c2UgUE9GRlNFVCBpbnN0ZWFkIG9mIE9GRlNFVAorCSAgVXNlIHRoZSBtb3JlIGNvcnJlY3QgUE9GRlNFVCBtYWNybyB0byBnZXQgdGhlIG9mZnNldCBvZiBhIGNvbXBvbmVudCBpbiBpdHMKKwkgIHBsYW5lLiBUaGUgb2Zmc2V0IG1hY3JvIGdpdmVzIHRoZSBvZmZzZXQgb2YgdGhlIGNvbXBvbmVudCByZWxhdGl2ZSB0byB0aGUgc3RhcnQKKwkgIG9mIHRoZSBmcmFtZS4KKworMjAxMy0wOS0yMSAxODo0NjoyOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvZ29vbS9tbXguaDoKKwkgIGdvb206IEZpeCBNTVggYXNzZW1ibHkgY29tcGlsYXRpb24gd2l0aCBjbGFuZworCSAgY2xhbmcgZG9lcyBub3Qgd2FudCBvciBuZWVkIGEgY2xvYmJlciBsaXN0IGZvciBlbW1zOgorCSAgZXJyb3I6IGNsb2JiZXJzIG11c3QgYmUgbGFzdCBvbiB0aGUgeDg3IHN0YWNrCisJICBQYXRjaCB0YWtlbiBmcm9tIHRoZSBGcmVlQlNEIHBvcnRzLCBwcm92aWRlZCBieQorCSAgRGFuIE1jR3JlZ29yIDxkYW4ubWNncmVnb3JAdXNhc2suY2E+CisKKzIwMTMtMDktMjAgMTY6MTY6NTcgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gYjYxMzY2MSB0byA2YjAzYmE3CisKKzIwMTMtMDktMjAgMTA6MTk6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYS1kZW11eDogTWFrZSBzdXJlIHRoYXQgc3VidGl0bGUgYnVmZmVycyBhcmUgXDAtdGVybWluYXRlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzkzMworCisyMDEzLTA5LTE3IDEyOjE3OjU0ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogaGFuZGxlIGlzc3VlcyBjb3JyZWN0bHkgd2hlbiBkb3duc3RyZWFtIGlzIG5vdCBzZWVrYWJsZQorCSAgVGhlIHN0cmVhbWFibGUgcHJvcGVydHkgb25seSBtYWtlIHNlbnNlIGZvciBmcmFnbWVudGVkIGZvcm1hdHMuCisJICBGb3IgcmVndWxhciBNUDQsIHdoZW4gZG93bnN0cmVhbSBpcyBub3Qgc2Vla2FibGUgd2UgY2FuJ3QgcmV3cml0ZQorCSAgdGhlIGhlYWRlcnMsIHNvIHF0bXV4IGNhbiBvbmx5IHdvcmsgd2l0aCBmYXN0LXN0YXJ0PVRSVUUsIHdoZXJlCisJICB0aGUgaGVhZGVycyBhcmUgd3JpdHRlbiBmaW5pc2hpbmcgdGhlIGZpbGUuCisJICBGb3IgZnJhZ21lbnRlZCBNUDQsIHdoZW4gc3RyZWFtYWJsZSBpcyBub3Qgc2Vla2FibGUgYW5kIHRoZSBzdHJlYW1hYmxlCisJICBwcm9wZXJ0eSBpcyBGQUxTRSwgd2UgbXVzdCBlbmZvcmNlIHN0cmVhbWFibGU9VFJVRSB3YXJuaW5nIHRoZSB1c2VyCisJICBhYm91dCB0aGlzIGNoYW5nZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzI0MgorCisyMDEzLTA5LTE3IDEyOjA2OjA2ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogbWFrZSAic3RyZWFtYWJsZSIgVFJVRSBhcyBkZWZhdWx0CisJICBUaGUgbW9zdCBjb21tb24gdXNlIGNhc2UgZm9yIGZyYWdtZW50ZWQgTVA0IChEYXNoIGFuZCBTbW9vdGggU3RyZWFtaW5nKQorCSAgaXMgcHJvZHVjaW5nIHN0cmVhbWFibGUgY29udGVudCAoZXZlbiBmb3IgVk9EKS4gc3RyZWFtYWJsZT1GQUxTRSB3b3VsZCBvbmx5CisJICBiZSB1c2VkIHRvIGdlbmVyYXRlIGZyYWdtZW50ZWQgTVA0IHdpdGggYW5kIGluZGV4IG9mIE1PT0YncyB0aGF0IGNvdWxkCisJICBiZSByZXByb2R1Y2VkIHdpdGhvdXQgYSBwbGF5bGlzdC9tYW5pZmVzdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzI0MgorCisyMDEzLTA5LTE3IDEyOjAxOjMwICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogZGVwcmVjYXRlIHRoZSBzdHJlYW1hYmxlIHByb3BlcnR5IGZvciBub24tZnJhZ21lbnRlZCBNUDQKKwkgIFRoZSBzdHJlYW1hYmxlIHByb3BlcnR5IG9ubHkgbWFrZXMgc2Vuc2UgZm9yIGZyYWdtZW50ZWQgTVA0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzI0MgorCisyMDEzLTA5LTE5IDE3OjA4OjE5IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSAgdjRsMjogUmVtb3ZlIGNvbW1lbnRlZCBvdXQgbGluZQorCisyMDEzLTA5LTE5IDE4OjQzOjA4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNzRhNjg1NyB0byBiNjEzNjYxCisKKzIwMTMtMDktMTkgMTc6MzU6MjcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGF1dG9nZW4uc2g6CisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMDk4YzBkNyB0byA3NGE2ODU3CisKKzIwMTMtMDktMTkgMTY6NTA6NDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IGRvbid0IGFzc3VtZSBwbGFuYXIgZm9ybWF0cyBoYXZlIGp1c3QgMSBibG9jaworCSAgRG9uJ3QgYXNzdW1lIHBsYW5hciBmb3JtYXRzIGhhdmUganVzdCBvbmUgbWVtb3J5IGJsb2NrIHdpdGggdGhlIGRhdGEgYnV0IHVzZSB0aGUKKwkgIG1hY3JvcyB0byBhY2Nlc3MgdGhlIHJpZ2h0IG1lbW9yeSBibG9jayB3aGVyZSBhIGNvbXBvbmVudCBjYW4gYmUgZm91bmQuCisKKzIwMTMtMDktMTkgMTQ6MTQ6NTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgdGVzdHM6IGFkZCByZXRyYW5zbWlzc2lvbiBqaXR0ZXJidWZmZXIgdGVzdAorCSAgU3RvcmUgYm90aCBEVFMgYW5kIFBUUyBvbiBidWZmZXJzLgorCSAgTWFrZSBhIHF1ZXVlIGZvciBzcmNwYWQgZXZlbnRzLgorCSAgQWN0aXZhdGUgcGFkcyBhZnRlciBsaW5raW5nIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IFJFQ09ORklHVVJFIGV2ZW50cy4KKwkgIEFkZCB0ZXN0IGZvciByZXRyYW5zbWlzc2lvbi4KKworMjAxMy0wOS0xOSAxNDoxMjoxOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGtlZXAgZGVsYXkgYXMgYSBzZXBhcmF0ZSB2YXJpYWJsZSBpbiB0aW1lcgorCSAgS2VlcCBhIHNlcGFyYXRlIGRlbGF5IGluIHRoZSB0aW1lciBzbyB0aGF0IHdlIHN0aWxsIGtub3cgdGhlIG9yaWdpbmFsIHRpbWVzdGFtcAorCSAgb2YgdGhlIHBhY2tldCB0aGF0IHRoaXMgdGltZXIgcmVmZXJzIHRvLiBXZSBjYW4gdGhlbiBwbGFjZSB0aGUgY29ycmVjdAorCSAgcnVubmluZy10aW1lIGluIHRoZSBSZXRyYW5zbWlzc2lvbiBldmVudC4KKworMjAxMy0wOS0xOSAxNDowODo1NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGZpeCB3cml0YWJpbGl0eSBvZiBwcm9wZXJ0aWVzCisKKzIwMTMtMDktMTkgMTE6MzQ6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjEuOTAgPT09CisKKzIwMTMtMDktMTkgMTA6NTA6MjMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS4xLjkwCisKKzIwMTMtMDktMTkgMTA6MjE6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxMy0wOS0xOSAwOTo0NToxOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBwby9jcy5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vcGwucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSAgcG86IFVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxMy0wOS0xMSAxNDoyNzowMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBkbWFidWYgaXMgbm90IGEgc2luZ2xldG9uIGFueW1vcmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDc3OTMKKworMjAxMy0wOS0xNiAxMzo1Mzo0NSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IGRvIG5vdCBkbyBodHRwIHJlcXVlc3RzIGluIFJFQURZCisJICBIRUFEIHJlcXVlc3RzIHRvIGRpc2NvdmVyIGlmIHRoZSBzZXJ2ZXIgaXMgc2Vla2FibGUgc2hvdWxkbid0IGJlIGRvbmUgaW4KKwkgIFJFQURZIGFzIGl0IG1pZ2h0IGxvY2sgdGhlIG1haW4gdGhyZWFkIHRoYXQgaXMgZG9pbmcgdGhlIHN0YXRlIGNoYW5nZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDUzNzEKKworMjAxMy0wOS0xOCAxNjozMjoyOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHJlZXZhbHVhdGUgdGhlIGN1cnJlbnQgdGltZXIgYWZ0ZXIgdGltZW91dAorCSAgV2hlbiB3ZSB0cmlnZ2VyIHRoZSB0aW1lb3V0IGxvZ2ljIG9mIGEgdGltZXIsIHJlZXZhbHVhdGUgaXQgYmVjYXVzZSBpdCBpcworCSAgcG9zc2libGUgdGhhdCBpdCBzdGlsbCBoYXMgdGhlIGxvd2VzdCB0aW1lb3V0LgorCisyMDEzLTA5LTE4IDE2OjMxOjI2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogZG9uJ3QgdXBkYXRlIHRpbWUgd2hlbiB1bnNjaGVkdWxlZAorCSAgRG9uJ3QgdHJ5IHRvIGVzdGltYXRlIHRoZSBjdXJyZW50IHRpbWUgd2hlbiB3ZSBnb3QgdW5zY2hlZHVsZWQuCisKKzIwMTMtMDktMTggMTY6Mjk6MzcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBpbml0IHBhY2tldCBzcGFjaW5nIG9uIGZpcnN0IGJ1ZmZlcgorCSAgQWxyZWFkeSBpbml0IHRoZSBwYWNrZXQgc3BhY2luZyB2YXJpYWJsZXMgb24gdGhlIGZpcnN0IGJ1ZmZlciBzbyB0aGF0IHdlIGNhbgorCSAgY2FsY3VsYXRlIHRoZSBzcGFjaW5nIG9uIHRoZSBzZWNvbmQgYnVmZmVyIGFscmVhZHkuCisKKzIwMTMtMDktMTggMTU6MDg6NDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgdGVzdHM6IGZpeCBjb21tZW50cworCisyMDEzLTA5LTE4IDE0OjU3OjA5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogcHVzaCB0aGUgbG9zdCBldmVudCBmcm9tIHRoZSB0aW1lciB0aHJlYWQKKwkgIEluc3RlYWQgb2YgcHVzaGluZyB0aGUgbG9zdCBldmVudCBmcm9tIHRoZSBjaGFpbiBmdW5jdGlvbiwgc2NoZWR1bGUgYSB0aW1lb3V0CisJICB0aGF0IHdpbGwgcHVzaCB0aGUgbG9zdCBldmVudCBmcm9tIHRoZSB0aW1lciB0aHJlYWQuIFRoaXMgYXZvaWQgYmxvY2tpbmcgdGhlCisJICB1cHN0cmVhbSB0aHJlYWQgd2hpbGUgd2UgcHVzaCBhbmQgc3luYyB0aGUgZXZlbnQuCisKKzIwMTMtMDktMTggMTQ6MjM6NTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBhZGQgYW5vdGhlciB0ZXN0CisJICBUaGUgdGVzdCBpcyBtb2RpZmllZCBzbGlnaHRseSBiZWNhdXNlIHRoZSBsYXRlIGxvc3QgcGFja2V0cyBhcmUgb25seQorCSAgZ2VuZXJhdGVkIG5vdyB3aGVuIGEgbGFyZ2UgZ2FwIGlzIHJlY2VpdmVkLgorCisyMDEzLTA5LTE4IDE0OjEyOjQ3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiByb3VuZCBnYXAgZHVyYXRpb24gdG8gbXVsdGlwbGUgb2YgZHVyYXRpb24KKwkgIE1ha2Ugc3VyZSB0aGUgZ2FwIGR1cmF0aW9uIGluIHRoZSBsb3N0IGV2ZW50IGlzIGEgbXVsdGlwbGUgb2YgdGhlIHBhY2tldAorCSAgZHVyYXRpb24uCisJICBFbmFibGUgYW5vdGhlciB0ZXN0LgorCisyMDEzLTA5LTE4IDEyOjI5OjM4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGtlZXAgdHJhY2sgb2YgZHVyYXRpb24KKwkgIEtlZXAgdHJhY2sgb2YgdGhlIGVzdGltYXRlZCBkdXJhdGlvbiBvZiBtaXNzaW5nIHBhY2tldHMgYW5kIHVzZSBpdCBpbiB0aGUgbG9zdAorCSAgZXZlbnQuCisJICBFbmFibGUgYW5vdGhlciB1bml0IHRlc3QKKworMjAxMy0wOS0xOCAxMTo1OToyOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogaGFuZGxlIGxhcmdlIGdhcHMgd2l0aCBvbmUgbG9zdCBldmVudAorCSAgV2hlbiB3ZSBoYXZlIGEgbGFyZ2UgbnVtYmVyIG9mIG1pc3NpbmcgcGFja2V0cywgZ2VuZXJhdGUgb25lIGxvc3QgZXZlbnQgZm9yIGFsbAorCSAgdGhlIHBhY2tldHMgdGhhdCBoYXZlIG5vIGNoYW5jZSBvZiBiZWluZyBwdXNoZWQgb3V0IGluIHRpbWUuCisJICBGaXggYW5kIGFjdGl2YXRlIHVuaXQgdGVzdCBmb3IgbGFyZ2UgZ2Fwcy4KKworMjAxMy0wOS0xOCAxMTo1NjozOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHJlZmFjdG9yIGxvc3QgZXZlbnQgc2VuZGluZworCSAgQWxzbyBtYWtlIHN1cmUgd2Ugb25seSBpbmNyZW1lbnQgdGhlIGV4cGVjdGVkIHNlcW51bSBhbmQgbGFzdAorCSAgb3V0cHV0IHRpbWVzdGFtcC4KKworMjAxMy0wOS0xNyAyMzoyMTowOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHJlZmFjdG9yIHRpbWVvdXQgdHJpZ2dlcnMKKworMjAxMy0wOS0xNyAyMzowMzo0NSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHNpbXBsaWZ5IHRoZSB0aW1lb3V0IGNvZGUKKwkgIEtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgdGltZSBpbiB0aGUgdGltZW91dCBsb29wLgorCSAgTG9vcCBvdmVyIGFsbCB0aW1lcnMgYW5kIHRyaWdnZXIgYWxsIHRoZSBleHBpcmVkIG9uZXMsIHdlIGNhbiBkbyB0aGlzIGluIHRoZQorCSAgc2FtZSBsb29wIHRoYXQgc2VsZWN0cyB0aGUgbmV3IGJlc3QgdGltZXIuCisKKzIwMTMtMDktMTcgMjM6MDE6MTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiByZWFycmFuZ2UgdGltZXIgdXBkYXRlIGNvZGUKKwkgIEFsc28gdXBkYXRlIHRoZSB0aW1lcnMgd2hlbiByZXRyYW5zbWlzc2lvbiBpcyBkaXNhYmxlZC4gV2UgbmVlZCB0bworCSAgZG8gdGhpcyBiZWNhdXNlIHdoZW4gd2UgYWRkZWQgTE9TVCB0aW1lcnMgd2hlbiB3ZSBkZXRlY3RlZCBtaXNzaW5nIHBhY2tldHMgYW5kCisJICB3ZSBuZWVkIHRvIHJlbW92ZSB0aG9zZSB0aW1lcnMgd2hlbiB0aGUgcGFja2V0IGZpbmFsbHkgYXJyaXZlcy4KKworMjAxMy0wOS0xNyAyMjowMjowNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJICB2aWRlb21peGVyOiBsaW5rIHRvIGxpYm0gZm9yIG1hdGhzIHN0dWZmCisJICBGaXhlcyB1bmRlZmluZWQgcmVmZXJlbmNlcyB0byByaW50IGFuZCBwb3cgb24gdWJ1bnR1CisJICBidWlsZCBib3QuCisKKzIwMTMtMDktMTcgMTU6MTk6NDIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiByZWxlYXNlIGxvY2sgb24gc2h1dGRvd24KKworMjAxMy0wOS0xNyAxNToxMTo0MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBjaGVjazogY2hhbmdlIGZvciB2aWRlb21peGVyIHJlbmFtZWQgb3JjIGZpbGUKKworMjAxMy0wOS0xNCAxNjowMzoyMCArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHJlbW92ZSBNQVhfVE9MRVJBVEVEX0xBVEVORVNTCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3NDExCisKKzIwMTMtMDktMTYgMTU6NTQ6MzcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC1ydHguc2g6CisJICBleGFtcGxlczogd2UgZG9uJ3QgbmVlZCB0aGUgcXVldWUgYW55bW9yZQorCisyMDEzLTA5LTE2IDE1OjUzOjQ3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogdXNlIHNlcGFyYXRlIHRocmVhZCBmb3IgdGltZW91dHMKKwkgIFVzZSBhIHNlcGFyYXRlIHRocmVhZCBmb3Igc2NoZWR1bGluZyB0aGUgdGltZW91dHMgaW5zdGVhZCBvZiB1c2luZyB0aGUKKwkgIGRvd25zdHJlYW0gc3RyZWFtaW5nIHRocmVhZCB0aGF0IG1pZ2h0IGJsb2NrIGF0IGFueSB0aW1lLgorCisyMDEzLTA5LTE0IDE1OjU2OjA0ICswMjAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogc2V0IGZpcnN0X3RzIHRvIERUUyBmb3Igc3RyZWFtcyB0aGF0IGhhdmUgRFRTCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3MzQwCisKKzIwMTMtMDktMTQgMTU6NTU6MjIgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBtYWtlIHN1cmUgZHVyYXRpb24gaXMgYSB2YWxpZCBudW1iZXIgZm9yIGxhc3QgYnVmZmVyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3MzQwCisKKzIwMTMtMDktMTQgMTU6NTQ6MjkgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiB1c2Ugc2VnbWVudC5zdGFydCBvciBsYXN0IGJ1ZmZlciBlbmQgdGltZSBpbiBjYXNlIG9mIG1pc3NpbmcgRFRTCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3MzQwCisKKzIwMTMtMDktMDMgMTg6MTQ6MDQgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIFJldmVydCBxdG11eDogVXNlIGJ1ZmZlciBQVFMgaWYgRFRTIGlzIG5vdCBzZXQiCisJICBUaGlzIHJldmVydHMgY29tbWl0IGY3MmMzY2Y3MWZkZTYyMjA2N2Y0MWYzMWE1Mzk3OGJhNGM5NDQ2OWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3MzQwCisKKzIwMTMtMDktMTYgMTE6MDM6MDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyb3JjLWRpc3QuaDoKKwkgIHZpZGVvbWl4ZXI6IFVwZGF0ZSBvcmMgZ2VuZXJhdGVkIGZpbGVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA4MTMxCisKKzIwMTMtMDktMTMgMTY6MjU6NDkgKzAyMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHJ0cHNlc3Npb246IERlbXV4IFJUQ1AgYnVmZmVycyBmcm9tIHRoZSBSVFAgc3RyZWFtCisJICBJZiB0aGVyZSBhcmUgUlRDUCBidWZmZXJzIGluIHRoZSBSVFAgc3RyZWFtLCBwcm9jZXNzIHRoZW0gYXMKKwkgIFJUQ1AuIFRoaXMgd2F5LCB3ZSB3YW50IHJlY2VpdmUgc3RyZWFtcyBmb2xsb3dpbmcgUkZDIDU3NjEKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc2NTcKKworMjAxMy0wOS0xMyAyMzoyNjoyMSArMTAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBnc3QvcnRwL2dzdHJ0cEwyNGRlcGF5LmM6CisJICBydHA6IFJlbW92ZSBib2d1cyBleHRyYSBjYXBzIGZyb20gTDI0IHRlbXBsYXRlLgorCSAgVGhlIGV4dHJhIGNhcHMgZW50cnkgaW4gdGhlIHRlbXBsYXRlIHdhcyBtYWtpbmcgaXQgc29tZXRpbWVzCisJICBnZXQgcGx1Z2dlZCBmb3IgYW55IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBwYXlsb2FkIHR5cGUuCisKKzIwMTMtMDktMTMgMTI6NDA6NDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwYmluOiB1c2UgUGFja2V0SW5mbyBmb3IgdGhlIHNlbmRlcgorCSAgQXZvaWQgbWFwcGluZyB0aGUgcGFja2V0IG11bHRpcGxlIHRpbWVzIHdoZW4gc2VuZGluZyBSVFAuCisKKzIwMTMtMDktMTMgMTI6MjI6MzYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwYmluOiBzdG9yZSBtb3JlIGluIHRoZSBQYWNrZXRJbmZvCisJICBTdG9yZSBhbGwgaW5mbyBpbiB0aGUgUGFja2V0SW5mbyBzbyB0aGF0IHdlIGNhbiBhdm9pZCBtYXBwaW5nIHRoZSBwYWNrZXQKKwkgIG11bHRpcGxlIHRpbWVzLgorCisyMDEzLTA5LTEzIDExOjMyOjUyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgc2Vzc2lvbjogc3RvcmUgbW9yZSBpbiB0aGUgUGFja2V0SW5mbyBzdHJ1Y3R1cmUKKworMjAxMy0wOS0xMyAxMTowODo1NSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmg6CisJICBydHBiaW46IFJUUEFycml2YWxTdGF0cyAtPiBSVFBQYWNrZXRJbmZvCisJICBSZW5hbWUgYSBzdHJ1Y3R1cmUgYmVjYXVzZSB3ZSBhcmUgYWxzbyBnb2luZyB0byB1c2UgdGhpcyBmb3IgdGhlIHNlbmRlcgorCSAgYml0cy4KKworMjAxMy0wOS0xMyAxMDo1NTozMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIHNvdXJjZTogc21hbGwgY2xlYW51cHMKKworMjAxMy0wOS0xMiAxMzozMTowMSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IG9ubHkgdXBkYXRlIHN0b3AgcG9zaXRpb24gaWYgc2VlayByZXF1ZXN0cyBpdAorCSAgQ2hlY2sgZm9yIEdTVF9TRUVLX1RZUEVfTk9ORSBmb3Igc3RvcCBwb2lzdGlvbiBhbmQgb25seSB1cGRhdGUKKwkgIHRoZSBzdG9wIHRpbWUgaWYgaXQgaXMgcmVxdWVzdGVkLiBPdGhlcndpc2UganVzdCBtYWludGFpbiB3aGF0ZXZlcgorCSAgd2FzIHN0b3JlZCBhdCB0aGUgc2VnbWVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzUzMAorCisyMDEzLTA5LTEzIDA4OjUzOjI1ICswMjAwICBSaWNvIFR6c2NoaWNoaG9seiA8cmljb3R6QHVidW50dS5jb20+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICBydHA6IEFkZCBtaXNzaW5nIGhlYWRlcnMgdHAgZml4IG1ha2UgZGlzdAorCSAgSW4gYWRkaXRpb24gdG8gYTk1NmE2Y2ViMmRlYjg3Y2MxMzYxYWVlMWQ2NjI2NDQ5ZjQ2ZGFiMgorCisyMDEzLTA5LTEyIDE1OjA3OjQ4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IE1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBkYXRhIHRvIHJlYWQgaW1hZ2UgdGFncworCSAgVGhhbmtzIHRvIGlwdXRpbmVpIGZvciByZXBvcnRpbmcgdGhpcyBvbiBJUkMuCisKKzIwMTMtMDktMTIgMTU6MDE6MzYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBoYW5kbGUgc2VnbWVudHMgd2l0aCBub24tMCBzdGFydAorCSAgV2Uga2VlcCB0aGUgRFRTIGFuZCBQVFMgaW4gcnVubmluZy10aW1lIGluc2lkZSB0aGUgaml0dGVyYnVmZmVyLiBNYWtlIHN1cmUgdG8KKwkgIHRyYW5zZm9ybSBpdCBiYWNrIHRvIGEgYnVmZmVyIHRpbWVzdGFtcCBiZWZvcmUgcHVzaGluZyBvdXQgdGhlIGJ1ZmZlci4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDc5MzEKKworMjAxMy0wOS0xMSAxMzoxMTo1OCAtMDYwMCAgU2XDoW4gZGUgQsO6cmNhIDxsZWZ0bW9zdGNhdEBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogRml4IG9mZi1ieS1vbmUgaW4gdmFsaWRhdGlvbiBvZiBVVEYtOAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzkzMworCisyMDEzLTA5LTExIDE0OjMyOjE3IC0wMzAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBEbyBub3QgY2hlY2sgaWYgY2FwcyBhcmUgZW1wdHkgd2hlbiB0aGV5IGFyZSBOVUxMCisJICBJbiB0aGUgY2FzZSB0aGUgY2FwcyBhcmUgYWN0dWFsbHkgTlVMTCwgd2Ugc2hvdWxkIGp1c3QgY29uY2lkZXIgaXQgdGhlCisJICBzYW1lIHdheSBhcyBlbXB0eSBjYXBzIGluIHRoYXQgY2FzZS4KKworMjAxMy0wOS0xMCAxNjo0NDo1MyAtMDYwMCAgU2XDoW4gZGUgQsO6cmNhIDxsZWZ0bW9zdGNhdEBnbWFpbC5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJvcmMtZGlzdC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy1kaXN0Lmg6CisJICB2aWRlb21peGVyOiBmaXggYnVpbGQgaWYgb3JjIGlzIG5vdCBpbnN0YWxsZWQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDc4ODYKKworMjAxMy0wOS0xMCAxNzo1Nzo0OSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFByZXNlcnZlIHNlcW51bSB3aGVuIHB1c2hpbmcgc2VlayB1cHN0cmVhbQorCSAgQWZ0ZXIgY29udmVydGluZyBhIHNlZWsgZnJvbSB0aW1lIHRvIGJ5dGVzLCB1c2UgdGhlIHNhbWUgc2VxbnVtCisJICBvbiB0aGUgZXZlbnQgdGhhdCBnb2VzIHVwc3RyZWFtCisKKzIwMTMtMDktMDUgMDA6MTc6MTYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiB0cmFjayBzdHJlYW1zIHRoYXQgYXJlIEVPUyBvbiBwdXNoIG1vZGUgdG8gZmluaXNoIGVhcmxpZXIKKwkgIFdoZW4gdGhlIHNlZ21lbnQgaGFzIGEgZGVmaW5lZCBzdG9wIHBvc2l0aW9uLCBxdGRlbXV4IHNob3VsZCBjaGVjaworCSAgd2hlbiBzdHJlYW1zIHJlYWNoIHRoaXMgcG9zaXRpb24gYW5kIG1hcmsgdGhvc2UgYXMgRU9TLiBXaGVuIGFsbAorCSAgc3RyZWFtcyBhcmUgRU9TIGl0IHdpbGwgcmV0dXJuIEdTVF9GTE9XX0VPUyB0byB1cHN0cmVhbSB0byBhbGxvdworCSAgdGhlIHBpcGVsaW5lIHRvIGZpbmlzaCBpbnN0ZWFkIG9mIGNvbnRpbnVvdXNseSBjb25zdW1lIGJ1ZmZlcnMKKwkgIGZyb20gdXBzdHJlYW0gdGhhdCBhcmUgbm90IHVzZWZ1bCBmb3IgdGhlIHNlZ21lbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3NTMwCisKKzIwMTMtMDktMDQgMTU6MzQ6MzUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IHByZXNlcnZlIHN0b3Agb2Ygc2VnbWVudCB3aGVuIGRvaW5nIHNlZWtzIGluIHB1c2ggbW9kZQorCSAgV2hlbiBoYW5kbGluZyBzZWVrcyBpbiBwdXNoIG1vZGUsIHF0ZGVtdXggY29udmVydHMgdGhlIHNlZWsgdG8gYnl0ZXMKKwkgIGFuZCBwdXNoZXMgdXBzdHJlYW0uIEl0IG5lZWRzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHNlZWsgYW5kIHRoZQorCSAgc3Vic2VxdWVudCBzZWdtZW50IHRvIGJlIGFibGUgdG8gbWFwIHRoZW0gYmFjayB0byB0aGUgcmVxdWVzdGVkCisJICBzZWVrIHRpbWUgYW5kIHByb3Blcmx5IHByZXNlcnZlIHRoZSBzZWdtZW50IHN0b3Agb2YgdGhlIHNlZWsuCisJICBUaGlzIGlzIGRvbmUgYnkgdXNpbmcgdGhlIHN0YXJ0IG9mZnNldCBpbiBieXRlcyBvZiB0aGUgc2VlaywKKwkgIHRoYXQgc2hvdWxkIGJlIHRoZSBzYW1lIG9mIHRoZSBzZWdtZW50IGZyb20gdXBzdHJlYW0uIEFuZCB0aGlzCisJICBpcyBhbHNvIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggd2hhdCBxdGRlbXV4IGFscmVhZHkgd2FzIHVzaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzUzMAorCisyMDEzLTA3LTI2IDE5OjQwOjUzICswMjAwICBNYXRoaWV1IER1cG9uY2hlbGxlIDxtYXRoaWV1LmR1cG9uY2hlbGxlQGVwaXRlY2guZXU+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMnBhZC5oOgorCSAgdmlkZW9taXhlcjogQWRkIGNvbG9yc3BhY2UgY29udmVyc2lvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNDk1MAorCisyMDEzLTA4LTA2IDE1OjM4OjM5ICswMjAwICBNYXRoaWV1IER1cG9uY2hlbGxlIDxtYXRoaWV1LmR1cG9uY2hlbGxlQGVwaXRlY2guZXU+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBEb24ndCBzZW5kIHJlY29uZmlndXJlIGV2ZW50IHdoZW4gZm9ybWF0cyBvciBQQVIgYXJlIGRpZmZlcmVudAorCSAgSXQgaXMgcmFjeSB3aXRoIG11bHRpcGxlIHBhZHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA0OTUwCisKKzIwMTMtMDctMjUgMTM6NDk6NTcgKzAyMDAgIE1hdGhpZXUgRHVwb25jaGVsbGUgPG1hdGhpZXUuZHVwb25jaGVsbGVAZXBpdGVjaC5ldT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRvcmMub3JjOgorCSogZ3N0L3ZpZGVvbWl4ZXIvZ3N0Y21zLmM6CisJKiBnc3QvdmlkZW9taXhlci9nc3RjbXMuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvY29udmVydC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9jb252ZXJ0Lmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy5vcmM6CisJICB2aWRlb21peGVyOiBCdW5kbGUgcHJpdmF0ZSBjb3BpZXMgb2YgdmlkZW9jb252ZXJ0IGNvZGUKKwkgIElkZWFsbHksIHRoaXMgd291bGQgYmUgcGFydCBvZiBsaWJnc3R2aWRlby4KKwkgIFByZWZpeGVzIHZpZGVvY29udmVydCBzeW1ib2xzIHdpdGggdmlkZW9taXhlcl8uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA0OTUwCisKKzIwMTMtMDgtMjIgMDA6MDM6NDggKzAyMDAgIE1hdGhpZXUgRHVwb25jaGVsbGUgPG1hdGhpZXUuZHVwb25jaGVsbGVAZXBpdGVjaC5ldT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IFVzZSBuZXdseSAjZGVmaW5lZCBtZXRhZGF0YSBuYW1lcy4KKworMjAxMy0wOS0wOSAxNToxMTo1MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogb25seSB3YWl0IGlmIHdlIGZsdXNoZWQKKwkgIE9ubHkgd2FpdCBmb3IgdGhlIFNUUkVBTV9MT0NLIHdoZW4gd2UgZmx1c2hlZCBzb21ldGhpbmcgd2hlbiBzZW5kaW5nCisJICBhIGNvbW1hbmQgZm9yIFBBVVNFRCBvciBQTEFZSU5HLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzYxMQorCisyMDEzLTA5LTA5IDE1OjA5OjQxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiByZXR1cm4gd2hlbiBhIGZsdXNoIHdhcyBpc3N1ZWQKKwkgIE1ha2UgZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCgpIHJldHVybiBUUlVFIHdoZW4gdGhlIGN1cnJlbnQKKwkgIGFjdGlvbiBoYXMgYmVlbiBmbHVzaGVkCisKKzIwMTMtMDktMDkgMTE6MTY6NDAgKzAyMDAgIERhdmlkIEhvbHJveWQgPGRhdmVAYmFkZ2Vycy1pbi1mb2lsLmNvLnVrPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDI0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDI0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwTDI0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cEwyNHBheS5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHJ0cDogYWRkIEwyNCBwYXkgYW5kIGRlcGF5bG9hZGVyCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3NzM0CisKKzIwMTMtMDktMDkgMTQ6NDY6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBGaXggbWlzc2luZyBjb25kaXRpb24gaW4gcHJldmlvdXMgY29tbWl0CisKKzIwMTMtMDktMDkgMTQ6NDQ6NTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDJidWZmZXJwb29sOiBBbHNvIGZpeCBzdHJpZGVzIGZvciBvdGhlciBzZW1pLXBsYW5hciB2aWRlbyBmb3JtYXRzCisKKzIwMTMtMDktMDkgMTQ6NDE6NDIgKzAyMDAgIEFuZHJlZWEgRnVsZ2VyIDxhbmRyZWVhLmZ1bGdlckBwYXJyb3QuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMmJ1ZmZlcnBvb2w6IEZpeCBzdHJpZGUgZm9yIE5WMTIvTlYyMQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzc1OAorCisyMDEzLTA5LTA3IDE2OjM3OjAzICswMjAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thZGVtdXg6IGZpeCBsZWFraW5nIGJ1ZmZlciBhbmQgY2FwcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzY4OAorCisyMDEzLTA5LTA1IDE5OjQ2OjM3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBmaXggYnVpbGQgb24gd2luMzIKKwkgIGdzdHVkcHNyYy5jOjg1NToxNTogZXJyb3I6ICNpZiB3aXRoIG5vIGV4cHJlc3Npb24KKworMjAxMy0wOS0wNCAxNTo1MDo0MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGhhbmRsZSB1bnNlZWthYmxlIHN0cmVhbXMKKwkgIEhhbmRsZSBzdHJlYW1zIHRoYXQgd2UgY2FuJ3Qgc2VlayBpbiBhbmQgaWdub3JlIHRoZW0gaW4gdGhlCisJICBzZWVrIGxvZ2ljLgorCisyMDEzLTA5LTA0IDE1OjI1OjM5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogb25seSBjaGVjayB2aWRlbyBjb21wcmVzc2lvbiBmb3IgdmlkZW8gc3RyZWFtcworCSAgT3IgZWxzZSB3ZSBtaWdodCBkZXJlZiBhIHN0cmVhbSB3aXRoIGEgTlVMTCBzdHJmLnZpZHMgYW5kIHNlZ2ZhdWx0CisKKzIwMTMtMDYtMTggMTM6Mjc6MjAgKzAxMDAgIEFsZXggQXNobGV5IDxidWd6aWxsYUBhc2hsZXktZmFtaWx5Lm5ldD4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSogZ3N0L2lzb21wNC9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvZnR5cGNjLmg6CisJKiBnc3QvaXNvbXA0L2dzdHJ0cHhxdGRlcGF5LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF90eXBlcy5jOgorCSAgcXRkZW11eDogQWRkIHN1cHBvcnQgZm9yIHRoZSBhdmMzIHNhbXBsZSBlbnRyeSBmb3JtYXQgb2YgdGhlIEFWQyBmaWxlIGZvcm1hdAorCSAgQW1lbmRtZW50IDIgb2YgSVNPL0lFQyAxNDQ5Ni0xNSAoQVZDIGZpbGUgZm9ybWF0KSBpcyBkZWZpbmluZyBhIG5ldworCSAgc3RydWN0dXJlIGZvciBmcmFnbWVudGVkIE1QNCBjYWxsZWQgImF2YzMiLiBUaGUgcHJpbmNpcGFsIGRpZmZlcmVuY2UKKwkgIGJldHdlZW4gQVZDMSBhbmQgQVZDMyBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIGNvZGVjIGluaXRpYWxpc2F0aW9uCisJICBkYXRhIChlLmcuIFNQUywgUFBTKS4gSW4gQVZDMSB0aGlzIGRhdGEgaXMgcGxhY2VkIGluIHRoZSBpbml0aWFsCisJICBNT09WIGJveCAobW9vdi50cmFrLm1kaWEubWluZi5zdGJsLnN0c2QuYXZjMSkgYnV0IGluIEFWQzMgdGhpcyBkYXRhCisJICBnb2VzIGluIHRoZSBmaXJzdCBzYW1wbGUgb2YgZXZlcnkgZnJhZ21lbnQgKGkuZS4gdGhlIGZpcnN0IHNhbXBsZSBpbgorCSAgZWFjaCBtZGF0IGJveCkuICBUaGUgcHJpbmNpcGFsIHJlYXNvbiBmb3IgYXZjMyBpcyB0byBtYWtlIGl0IGVhc2llcgorCSAgZm9yIGNsaWVudCBpbXBsZW1lbnRhdGlvbnMsIGJlY2F1c2UgaXQgcmVtb3ZlcyB0aGUgcmVxdWlyZW1lbnQgdG8KKwkgIGluc2VydCB0aGUgU1BTK1BQUyBpbiB0byB0aGUgZGVjb2RlciBwaXBlbGluZSBldmVyeSB0aW1lIHRoZXJlIGlzIGEKKwkgIHJlcHJlc2VudGF0aW9uIGNoYW5nZS4KKwkgIFRoaXMgY29tbWl0IGFkZHMgc3VwcG9ydCBmb3IgdGhlICJhdmMzIiBhdG9tLCB3aGljaCBpcyBhbG1vc3QgaWRlbnRpY2FsCisJICB0byB0aGUgImF2YzEiIGF0b20sIGV4Y2VwdCBpdCBkb2VzIG5vdCBjb250YWluIGFueSBTUFMgb3IgUFBTIGRhdGEuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAyMDA0CisKKzIwMTMtMDktMDQgMDA6Mjc6NTAgKzAyMDAgIE1hdGhpZXUgRHVwb25jaGVsbGUgPG1hdGhpZXUuZHVwb25jaGVsbGVAZXBpdGVjaC5ldT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IERvbid0IHNldCBFT1MgdG8gRkFMU0Ugd2hlbiB0aGUgY29sbGVjdHBhZCAqaXMqIEVPUworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzIzOAorCisyMDEzLTA5LTAzIDE3OjMyOjQxICswMjAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBjbGVhbnVwIG9uIGVycm9yIGFmdGVyIHN0YXRlIGNoYW5nZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNzIyOQorCisyMDEzLTA5LTAzIDExOjIzOjI0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgdWRwc3JjOiBCaW5kIHRvIG11bHRpY2FzdCBhZGRyZXNzZXMgb24gbm9uLVdpbmRvd3Mgc3lzdGVtcworCSAgT24gV2luZG93cyBpdCdzIG5vdCBwb3NzaWJsZSB0byBiaW5kIHRvIGEgbXVsdGljYXN0IGFkZHJlc3MKKwkgIGJ1dCB0aGUgT1Mgd2lsbCBtYWtlIHN1cmUgdG8gZmlsdGVyIG91dCBhbGwgcGFja2V0cyB0aGF0CisJICBhcnJpdmUgbm90IGZvciB0aGUgbXVsdGljYXN0IGFkZHJlc3MgdGhlIHNvY2tldCBqb2luZWQuCisJICBPbiBMaW51eCBhbmQgb3RoZXJzIGl0IGlzIG5lY2Vzc2FyeSB0byBiaW5kIHRvIGEgbXVsdGljYXN0CisJICBhZGRyZXNzIHRvIGxldCB0aGUgT1MgZmlsdGVyIG91dCBhbGwgcGFja2V0cyB0aGF0IGFyZSByZWNlaXZlZAorCSAgb24gdGhlIHNhbWUgcG9ydCBidXQgZm9yIGRpZmZlcmVudCBhZGRyZXNzZXMgdGhhbiB0aGUgbXVsdGljYXN0CisJICBhZGRyZXNzCisJICBBbmQgZGVwcmVjYXRlIHRoZSBtdWx0aWNhc3QtZ3JvdXAgcHJvcGVydHkgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUKKwkgIGFkZHJlc3MgcHJvcGVydHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3MDQyCisKKzIwMTMtMDktMDMgMTA6MTA6MDEgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IEZyZWUgR3N0QmFzZVBhcnNlRnJhbWUgaWYgcHVzaGluZyBhIGhlYWRlciBmYWlsZWQKKworMjAxMy0wOS0wMiAxNjowMjozNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBSZWZhY3RvciBhZGRyZXNzIHJlc29sdmFsIGludG8gaXRzIG93biBmdW5jdGlvbgorCisyMDEzLTA5LTAyIDIzOjAwOjI5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJICByZXBsYXlnYWluOiBmaXggdGFnbGlzdCBsZWFrIGluIHJnYW5hbHlzaXMKKwkgIEFuZCBhZGQgc29tZSBGSVhNRXMuCisKKzIwMTMtMDktMDIgMjI6NTA6NTggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzoKKwkgIHRlc3RzOiByZ2FuYWx5c2lzOiByZW5hbWUgZnVuY3Rpb24gZm9yIGNsYXJpdHkKKworMjAxMy0wMy0xOCAxNDozMjowNyArMDEwMCAgQ2hyaXN0b3BoIFJlaXRlciA8cmVpdGVyLmNocmlzdG9waEBnbWFpbC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzoKKwkgIHRlc3RzOiBmaXggc2tpcHBlZCByZ2FuYWx5c2lzIHRlc3RzCisJICBJbiAwLjEwIGVsZW1lbnRzIHdvdWxkIHBvc3QgdGFnIG1lc3NhZ2VzIG9uIHRoZSBidXMKKwkgIGRpcmVjdGx5LCBhbmQgcmdhbmFseXNpcyB3b3VsZCBvbmx5IHBvc3QgYSB0YWcgbWVzc2FnZQorCSAgd2hlbiBpdCBjaGFuZ2VkIHRhZ3MuIEluIDEuMCwgb25seSBzaW5rcyBwb3N0IHRhZworCSAgbWVzc2FnZXMgd2hlbiB0aGV5IHJlY2VpdmUgdGhlIHNlcmlhbGlzZWQgdGFnIGV2ZW50LgorCSAgVGhpcyBtZWFucyB0aGF0IHdlIGdldCBhbiBhZGRpdGlvbmFsIHRhZyBtZXNzYWdlIG9uCisJICB0aGUgYnVzIG5vdyB3aGVyZSB3ZSBkaWRuJ3QgZXhwZWN0IG9uZSBiZWZvcmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1MDkwCisKKzIwMTMtMDktMDIgMTE6NDY6NTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogUHJvcGVybHkgcHJvcGFnYXRlIGRvd25zdHJlYW0gZmxvdyByZXR1cm5zIHVwc3RyZWFtCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA3MjI5CisKKzIwMTMtMDktMDEgMjE6MTg6MzggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6CisJKiBnc3QvYXZpL2dzdGF2aS5jOgorCSogZ3N0L2lzb21wNC9pc29tcDQtcGx1Z2luLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW8uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkgIERvbid0IHVzZSBzZXRsb2NhbGUgaW4gcGx1Z2lucygpCisJICBPbmx5IGFwcHMgc2hvdWxkIGNhbGwgc2V0bG9jYWxlKCksIG5vdCBsaWJyYXJpZXMuCisKKzIwMTMtMDgtMjkgMTM6MTU6MTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2cGF5LmM6CisJICBydHBtcHZwYXk6IEZpeCBSVFAgYnVmZmVyIGFsbG9jYXRpb24gaW4gcnRwbXB2cGF5CisJICBSVFAgYnVmZmVyIGFsbG9jYXRpb24gc2hvdWxkIG5vdCBiZSBkb25lIHdpdGggcGFkZGluZyBmb3IgdGhlIHNwZWNpZmljIE1QRUcyCisJICBoZWFkZXIgYXMgdGhlIHBhZGRpbmcgaXMgZG9uZSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgYW5kIHRoZSBsYXN0IGJ5dGUgaXMKKwkgIHRoZSBzaXplIG9mIHRoZSBwYWRkaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNjk3MAorCisyMDEzLTA4LTI4IDEwOjUxOjMyICswMjAwICBCZXJuaGFyZCBNaWxsZXIgPGJlcm5oYXJkLm1pbGxlckBzdHJlYW11bmxpbWl0ZWQuY29tPgorCisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmg6CisJICBhdXRvdmlkZW9zaW5rOiBhZGQgc3luYyBwcm9wZXJ0eQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNjk1NQorCisyMDEzLTA4LTI4IDA3OjE1OjAwICswMjAwICBCZXJuaGFyZCBNaWxsZXIgPGJlcm5oYXJkLm1pbGxlckBzdHJlYW11bmxpbWl0ZWQuY29tPgorCisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmg6CisJICBhdXRvYXVkaW9zaW5rOiBpbnRyb2R1Y2Ugc3luYyBwcm9wZXJ0eQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNjk1NQorCisyMDEzLTA4LTI3IDE3OjMzOjQwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcHVzaCBidWZmZXJzIGFmdGVyIHNlZ21lbnQgc3RvcCB1bnRpbCByZWFjaGluZyBhIGtleWZyYW1lCisJICBUaGlzIHNob3VsZCBtYWtlIGRlY29kZXJzIGFibGUgdG8gcHJlY2lzZWx5IHB1c2ggYnVmZmVycyB1bnRpbCB0aGUgc3RvcAorCSAgdGltZSBpbiBjYXNlIHRoZXkgbmVlZCB0aGUgbmV4dCBrZXlmcmFtZSB0byBkbyBpdC4KKwkgIEFsc28sIGFjY29yZGluZyB0byBnc3Rfc2VnbWVudF9jbGlwLCBpdCBzaG91bGQgb25seSBwdXNoIGEgYnVmZmVyIHRoYXQKKwkgIHRoZSBzdGFydGluZyB0cyBpcyBzdHJpY3RseSBzbWFsbGVyIHRoYW4gdGhlIHNlZ21lbnQgc3RvcCwgc28gd2UgY2hhbmdlCisJICB0aGUgbWluIDwgY29tcGFyaXNvbiBmb3IgPD0KKworMjAxMy0wOC0yOCAxMzoyNjo0NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDEuMS40ID09PQorCisyMDEzLTA4LTI4IDEyOjUyOjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdnB4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiBnc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hb3JjLWRpc3QuYzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS4xLjQKKworMjAxMy0wOC0yOCAxMjo1MjoxNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDEzLTA4LTI4IDEyOjMyOjEwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIHBvL3B0X0JSLnBvOgorCSAgcG86IHVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxMy0wOC0yNyAxNToyNToxNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2EtbXV4OiByZW1vdmUgZnJhbWVyYXRlIHJlc3RyaWN0aW9uCisJICBSZW1vdmUgdGhlIGZyYW1lcmF0ZSByZXN0cmljdGlvbiBvbiB0aGUgY2Fwcy4KKworMjAxMy0wOC0yNyAwOTozODoxNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogb25seSB1cGRhdGUgbmV4dCBjaGVjayB0aW1lIHdoZW4gcmVjb25zaWRlcmluZworCSAgRG9uJ3QgdXBkYXRlIHRoZSBuZXh0IFJUQ1AgY2hlY2sgdGltZSBpbiBhbGwgY2FzZXMgYnV0IG9ubHkgd2hlbiB3ZQorCSAgcmVjb25zaWRlcmVkLiBUaGlzIGF2b2lkcyBkZWxheWluZyBzZW5kaW5nIGEgZnVsbCBSVENQIHBhY2tldCB3aGVuIHdlCisJICBhcmUgZG9pbmcgZWFybHkgZmVlZGJhY2suCisKKzIwMTMtMDgtMjcgMDk6Mzc6MzMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IGFkZCBtb3JlIGRlYnVnCisKKzIwMTMtMDgtMjcgMDk6MzQ6NDYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgaml0dGVyYnVmZmVyOiBmaXggdHlwZXMgb2YgdGhlIHJldHJhbnNtaXNzaW9uIGV2ZW50CisKKzIwMTMtMDgtMjcgMDk6MzM6MDMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBvbmx5IHRpbWVvdXQgRVhQRUNURUQgdGltZXJzIG9uIGdhcAorCSAgT25seSB0aW1lb3V0IHRoZSBFWFBFQ1RFRCB0aW1lcnMgd2hlbiB3ZSBkZXRlY3QgYSBsYXJnZSBzZXFudW0gZ2FwLgorCisyMDEzLTA4LTI2IDEzOjQ3OjUzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZS5hYzogRG9uJ3Qgc2V0IEJaMl9MSUJTIGlmIGJ6MiBpcyBub3QgZm91bmQKKworMjAxMy0wOC0yNiAxMTo1MDoyNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRzZXNzaW9uOiBmaXggbG9ja2luZworCSAgV2UgbmVlZCB0byB0YWtlIHRoZSBzZXNzaW9uIGxvY2sgd2hlbiBnZXR0aW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlCisJICBzb3VyY2UuCisKKzIwMTMtMDgtMjYgMTE6NTA6MTMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGFkZCBzb21lIG1vcmUgZGVidWcKKworMjAxMy0wOC0yMCAyMjoxMjowMyArMDIwMCAgTWF0aGlldSBEdXBvbmNoZWxsZSA8bWF0aGlldS5kdXBvbmNoZWxsZUBlcGl0ZWNoLmV1PgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogZG9uJ3Qgc2VuZCBmbHVzaF9zdG9wIHR3aWNlLgorCSAgSWYgd2UgZ2V0IGZsdXNoIHN0YXJ0IGFuZCBhIHNlZWsgd2UgbmVlZCB0byBvbmx5IHNlbmQgZmx1c2hfc3RvcCBvbmNlLgorCSAgTW9yZSBpbmZvIGF0ICM3MDY0NDEKKworMjAxMy0wOC0yMyAxNTo1Njo0MyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5oOgorCSAgbXVsdGlwYXJ0ZGVtdXg6IHByb3BhZ2F0ZSBkaXNjb250CisKKzIwMTMtMDgtMjMgMTU6NDk6NDcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkgIG11bHRpcGFydGRlbXV4OiByZW1vdmUgZHluYW1pYyBzb3VyY3BhZHMgd2hlbiBnb2luZyBmcm9tIFBBVVNFRCB0byBSRUFEWQorCisyMDEzLTA4LTIzIDE1OjI5OjI4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4Lmg6CisJICBtdWx0aXBhcnRkZW11eDogdGltZXN0YW1wIG91dHB1dCBidWZmZXJzIGJhc2VkIG9uIGZpcnN0IGlucHV0IGJ1ZmZlciB0aGF0IHByb3ZpZGVkIGJ5dGVzIG5vdCBsYXN0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjM3NzU0CisKKzIwMTMtMDgtMjMgMTU6NDc6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHF1ZXVlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhxdWV1ZS5oOgorCSAgcnR4cXVldWU6IGFkZCBwcm9wZXJ0eSB0byBjb25maWd1cmUgcXVldWUgc2l6ZQorCisyMDEzLTA4LTIzIDEyOjA3OjU1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQtcnR4LnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtSDI2NC1ydHguc2g6CisJICB0ZXN0czogYWRkIHJldHJhbnNtaXNzaW9uIGV4YW1wbGUKKworMjAxMy0wOC0yMyAxMTo1NTowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgIHJ0cGJpbjogcHJveHkgaml0dGVyYnVmZmVyIGRvLXJldHJhbnNtaXNzaW9uIHByb3BlcnR5CisKKzIwMTMtMDgtMjMgMTE6MTc6NDUgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiB1bm1hcCB0aGUgY29ycmVjdCBidWZmZXIKKwkgIFRoZSBhdWRpbyBidWZmZXIgd2FzIG1hcHBlZCBzbyB1bm1hcCBpdCBhbmQgbm90IHRoZSB2aWRlbyBidWZmZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDY2NDIKKworMjAxMy0wOC0xOCAyMzozMjoyMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSAgcHVsc2VzaW5rOiBBZGQgcHJvcGVydHkgdG8gZmluZCBvdXQgdGhlIGRldmljZSBjdXJyZW50bHkgaW4gdXNlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTkwNzY4CisKKzIwMTMtMDgtMTggMjM6MzE6MTUgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogRGUtZHVwbGljYXRlIGNvZGUgdG8gZ2V0IHRoZSBjdXJyZW50IHNpbmsgaW5wdXQgaW5mbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU5MDc2OAorCisyMDEzLTA4LTE4IDIyOjI3OjM3IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IEltcGxlbWVudCBjaGFuZ2luZyB0aGUgZGV2aWNlIHdoaWxlIHBsYXlpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01OTA3NjgKKworMjAxMy0wOC0xOCAyMzozMjoyMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuaDoKKwkgIHB1bHNlc3JjOiBBZGQgcHJvcGVydHkgdG8gZmluZCBvdXQgdGhlIGRldmljZSBjdXJyZW50bHkgaW4gdXNlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTkwNzY4CisKKzIwMTMtMDgtMTggMjM6MzE6MTUgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzcmM6IERlLWR1cGxpY2F0ZSBjb2RlIHRvIGdldCB0aGUgY3VycmVudCBzb3VyY2Ugb3V0cHV0IGluZm8KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01OTA3NjgKKworMjAxMy0wOC0xOCAyMjoyNzozNyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogSW1wbGVtZW50IGNoYW5naW5nIHRoZSBkZXZpY2Ugd2hpbGUgcGxheWluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU5MDc2OAorCisyMDEzLTA4LTIyIDE0OjU1OjE0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogRml4IGJ6MiBjb25maWd1cmUgY2hlY2sgZm9yIFdpbmRvd3MKKwkgIER1ZSB0byBmdW5jdGlvbiBkZWNvcmF0aW9ucyBvbiBXaW5kb3dzIEFDX0NIRUNLX0xJQiBjYW4ndCBiZSB1c2VkIHRvIGNoZWNrIGZvciBiejIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDY1OTI0CisKKzIwMTMtMDItMjIgMjA6NTc6MDAgKzA5MDAgIEFraWhpcm8gVHN1a2FkYSA8YXRzdWthZGFAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmM6CisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmg6CisJICBwdWxzZXNpbms6IEFkZCBzdXBwb3J0IGZvciBBQUMgcGFzcy10aHJvdWdoCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk0NDQ1CisKKzIwMTMtMDYtMjQgMTc6Mjk6MzcgKzAyMDAgIEtpc2hvcmUgQXJlcGFsbGkgPGtpc2hvcmUuYXJlcGFsbGlAZ21haWwuY29tPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJICBnZGtwaXhidWZvdmVybGF5OiBjcmFzaGVzIGlmIGFueSBwcm9wZXJ0eSBjaGFuZ2VzIGR1cmluZyBwbGF5YmFjayB3aGVuIGxvY2F0aW9uIHByb3BlcnR5IGlzIG5vdCBzZXQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDI5ODgKKworMjAxMy0wOC0yMSAxNDo1NDoyNiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmg6CisJICBwdWxzZTogU2hhcmUgc3RhdGljIGNhcHMgZGVmaW5pdGlvbiBiZXR3ZWVuIHNyYyBhbmQgc2luaworCSAgVGhlIHNyYyB3YXMgYWxzbyBtaXNzaW5nIDI0LWJpdCBzYW1wbGUgZm9ybWF0cworCisyMDEzLTA4LTIxIDE2OjUzOjU5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhxdWV1ZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cXVldWUuaDoKKwkgIHJ0eDogdmFyaW91cyBpbXByb3ZlbWVudHMKKwkgIFVzZSBsb2NraW5nCisJICBEb24ndCBwdXNoIGZyb20gdGhlIGV2ZW50IGhhbmRsZXIsIGNvbGxlY3RlZCBwYWNrZXRzIGluIGEgcXVldWUgYW5kIHB1c2ggZnJvbQorCSAgdGhlIGNoYWluIGZ1bmN0aW9uLgorCSAgQ2xlYXIgcXVldWVzIG9uIHNodXRkb3duLgorCisyMDEzLTA4LTIxIDE2OjUwOjU5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBnZW5lcmF0ZSBldmVudHMgY29ycmVjdGx5CisJICBEbyBjb3JyZWN0IHNoaWZ0aW5nIG9mIHRoZSBiaXRtYXNrIGZvciBsb3N0IHBhY2tldHMuCisKKzIwMTMtMDgtMjEgMTY6NDc6NDAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG1hbmFnZXIuYzoKKwkgIHJ0cDogcmVnaXN0ZXIgcnR4IGVsZW1lbnQgYmV0dGVyCisKKzIwMTMtMDgtMjEgMTY6MzI6NTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgZGlyZWN0c291bmRzaW5rOiBXQVZFRk9STUFURVggaXMgdW5zaWduZWQgZm9yIDggYml0IGludGVnZXJzLCBhbmQgc2lnbmVkIGZvciBvdGhlcnMKKwkgIFByb2JhYmx5IGZpeGVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA1NDc3CisKKzIwMTMtMDgtMjEgMTM6MDM6MzQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IGRvbid0IGlnbm9yZSByZXR1cm4gdmFsdWUgZnJvbSBfZmluaXNoX2ZyYW1lKCkKKwkgIGdzdF92aWRlb19lbmNvZGVyX2ZpbmlzaF9mcmFtZSgpIHdpbGwgcmV0dXJuIEZMT1dfT0sgaGVyZSBpZgorCSAgdGhlcmUncyBubyBvdXRwdXQgYnVmZmVyLgorCisyMDEzLTA4LTIxIDEyOjU2OjM1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSAganBlZ2RlcGF5OiBhZGQgc29tZSBtb3JlIGRlYnVnCisKKzIwMTMtMDgtMjEgMTI6MTA6MDAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuaDoKKwkgIHJ0cGdzdGRlcGF5OiBvbmx5IHB1c2ggZXZlbnRzIHdoZW4gdGhleSBjaGFuZ2VkCisJICBLZWVwIHRyYWNrIG9mIHRoZSBTVFJFQU1fU1RBUlQgYW5kIFRBRyBldmVudHMgYW5kIG9ubHkgcHVzaCB0aGVtCisJICB3aGVuIHRoZXkgY2hhbmdlZC4KKworMjAxMy0wOC0yMSAxMDo1Mjo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIHJ0cGdzdHBheTogdGFnbGlzdHMgc2hvdWxkIG5vdCBiZSBtZXJnZWQgaW4gMS4wCisKKzIwMTMtMDgtMjEgMTA6Mjg6NTAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkgIHJ0cGdzdGRlcGF5OiBmbHVzaCBvbiBGTFVTSF9TVE9QIGV2ZW50CisKKzIwMTMtMDgtMjEgMTA6MDM6NTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJICBydHBnc3RwYXk6IHJlc2V0IG9uIHN0YXRlIGNoYW5nZQorCSAgRG8gZnVsbCByZXNldCBvbiBzdGF0ZSBjaGFuZ2UgdG8gUkVBRFkKKworMjAxMy0wOC0yMSAwOTo1NToyMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIHJ0cGdzdHBheTogcmVzZXQgb24gRkxVU0hfU1RPUAorCSAgQ2xlYXIgdGhlIGFkYXB0ZXIgYW5kIHBlbmRpbmcgYnVmZmVyIGxpc3Qgb24gRkxVU0hfU1RPUC4KKworMjAxMy0wOC0yMSAwOTozOTozMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIHJ0cGdzdHBheTogZG9uJ3QgdXNlIGNsb2NrIGZvciBjb25maWcgaW50ZXJ2YWwKKwkgIFdlIGNhbid0IHVzZSB0aGUgY2xvY2sgdG8gdGltZSBvdXIgY29uZmlnLWludGVydmFsIGJlY2F1c2Ugd2UgYXJlIG5vdAorCSAgbGl2ZSAob3IgdGhlcmUgbWlnaHQgbm90IGJlIGEgY2xvY2sgb3IgdGhlIGNsb2NrIG1pZ2h0IG5vdCBiZSBydW5uaW5nKS4KKwkgIEluc3RlYWQganVzdCBzaW1wbHkgdGFrZSB0aGUgdGltZXN0YW1wIGRpZmYuCisKKzIwMTMtMDgtMjEgMDk6MzM6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5Lmg6CisJICBydHBnc3RheTogZG9uJ3QgdXNlIC8vIGNvbW1lbnRzCisKKzIwMTMtMDgtMDggMTE6NTU6MjIgLTA0MDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IEZpeCByZXNwb25zZSBhcmd1bWVudCBpbiBoYW5kbGUtcmVxdWVzdCBzaWduYWwKKworMjAxMy0wOC0wOCAxMTo1NDo0MSAtMDQwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogQWRkIHNkZXMgcHJvcGVydHkgYW5kIHByb3h5IGl0IHRvIHJ0cGJpbgorCisyMDEzLTA4LTA3IDA5OjQ3OjM1IC0wNDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuaDoKKwkgIFNlbmQgYSBzdHJlYW0tc3RhcnQgd2hlbmV2ZXIgd2Ugc2VuZCB0YWdzIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHRhZ3MgYXJlIGNsZWFyZWQgb24gdGhlIGNsaWVudCBpZiB0aGUgc3RyZWFtLXN0YXJ0IHdhcyBwcmV2aW91c2x5IGxvc3QsIG90aGVyd2lzZSwgdGhlIGNsaWVudCBtYXkgZW5kIHVwIHdpdGggYSBtZXJnZWQgdGFnbGlzdCBvZiBtdWx0aXBsZSBzb25ncworCisyMDEzLTA3LTI1IDIxOjEyOjA1IC0wNDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuaDoKKwkgIHJ0cGdzdHBheTogQWRkIGEgY29uZmlnLWludGVydmFsIHByb3BlcnR5IHRvIHJlc2VuZCB0aGUgY2Fwcy90YWdzIGF0IGEgcmVndWxhciBpbnRlcnZhbCBUaGlzIGlzIHVzZWZ1bCBpbiBjYXNlIHRoZSBwYWNrZXQgY29udGFpbmluZyB0aGUgaW5saW5lZCBjYXBzIHdhcyBsb3N0IG9yIGlmIG5ldyBjbGllbnQgam9pbnMgYW4gYWxyZWFkeSBydW5uaW5nIFJUUCBzdHJlYW0gYW5kIHRoZXkgbWlzc2VkIHRoZSBwcmV2aW91cyB0YWcgZXZlbnRzLiBUaGlzIGFsc28gbWFrZXMgdGhlIHBheWxvYWRlciBrZWVwIGEgbGlzdCBvZiBtZXJnZWQgdGFncyBzbyB0aGUgcmV0cmFuc21pdHRlZCB0YWcgZXZlbnQgY29udGFpbnMgYWxsIHByZXZpb3VzbHkgcmVjZWl2ZWQuIEEgU1RSRUFNX1NUQVJUIGV2ZW50IHdpbGwgZmx1c2ggdGhlIGxpc3Qgb2YgdGFncy4KKworMjAxMy0wNy0yNSAyMToxMDoxMCAtMDQwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIHJ0cGdzdHBheTogUmVmYWN0b3IgdGhlIHNldGNhcHMgYW5kIHVzZSBuZXcgbWV0aG9kIHRvIHNlbmQgYXJiaXRyYXJ5IGNhcHMgYXQgYW55IHRpbWUKKworMjAxMy0wNy0yNSAyMTowMzozNCAtMDQwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIHJ0cGdzdHBheTogRG8gbm90IGZsdXNoIGV2ZW50cyBmb3Igc3RyZWFtLXN0YXJ0IGFuZCBhdm9pZCBjb25mbGljdCBiZXR3ZWVuIGV2ZW50IGFuZCBwZW5kaW5nIGlubGluZSBjYXBzCisKKzIwMTMtMDctMjUgMjA6NTQ6NTAgLTA0MDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5oOgorCSAgcnRwZ3N0cGF5OiBBZGQgYSBjcmVhdGVfZnJvbV9hZGFwdGVyIEFQSSBhbmQgdXNlIGEgbGlzdCBvZiBHc3RCdWZmZXJMaXN0IFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGZpeCBldmVudC9jYXBzIHNlbmRpbmcuIElmIHdlIHNlbmQgYSBTVFJFQU1fU1RBUlQgcGFja2V0LCBpdCB3aWxsIGNhdXNlIGFuIGVycm9yIGJlY2F1c2UgdGhlIHN0cmVhbSBkaWRuJ3QgcmVjZWl2ZSBpdHMgY2FwcyBhbmQgbmV3LXNlZ21lbnQgZXZlbnRzLCBzbyB3ZSBtdXN0IHdhaXQgZm9yIHRoZSBmaXJzdCBidWZmZXIgYmVmb3JlIHNlbmRpbmcgdGhlIHN0cmVhbS1zdGFydCBldmVudCBidWZmZXIuIEhvd2V2ZXIsIHRoZSBjYXBzIHdpbGwgYmUgc2VudCBhdCB0aGUgc2FtZSB0aW1lIGFuZCBzbyB0aGUgJ2lubGluZSBjYXBzJyB3aWxsIGJlIHNldCBmb3IgdGhlIGV2ZW50LiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gcGF5bG9hZCBpbmRpdmlkdWFsIHBhY2tldHMgKGRhdGEsIGNhcHMgb3IgZXZlbnRzKSBhbmQgb25seSBzZW5kIHRoZW0gd2hlbiB3ZSBjYWxsIGZsdXNoLgorCisyMDEzLTA3LTI1IDE3OjU2OjM4IC0wNDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSAgcnRwZ3N0cGF5OiBBZGQgZXR5cGU9NCBmb3IgcGF5bG9hZGluZyBHU1RfRVZFTlRfU1RSRUFNX1NUQVJUCisKKzIwMTMtMDctMjUgMTc6NTI6MTYgLTA0MDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJICBydHBnc3RwYXk6IEZpeCB0eXBvLCBHU1RfRVZFTlRfQ1VTVE9NX0JPVEggaGFzIGV0eXBlIG9mIDMKKworMjAxMy0wOC0yMCAxNDozNjo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGhhbmRsZSBFT1MKKwkgIFdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5LCBhbmQgd2UgcmVjZWl2ZWQgRU9TLCBwYXVzZSBhbmQgcHVzaCBhbiBFT1MKKwkgIGV2ZW50IGRvd25zdHJlYW0uCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA2Mzg3CisKKzIwMTMtMDgtMjAgMTA6MjY6MTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiB1cGRhdGUgZG9jcworCisyMDEzLTA4LTIwIDEwOjI1OjE3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogdXBkYXRlIGFsbCB0aW1lcnMKKwkgIEtlZXAgbG9vcGluZyBvdmVyIGFsbCByZWdpc3RlcmVkIHRpbWVycyBzbyB0aGF0IHdlIGNhbiBtYXJrIHRoZW0gbG9zdCBpbnN0ZWFkIG9mCisJICBzdG9wcGluZyBhcyBzb29uIGFzIHdlIGZpbmQgdGhlIHRpbWVyIGZvciB0aGUgY3VycmVudCBzZXFudW0uCisKKzIwMTMtMDgtMjAgMDg6NTU6NTAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlcworCisyMDEzLTA4LTE5IDIxOjEwOjAwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogcmVvcmdhbml6ZSB0aW1lciBoYW5kbGluZworCSAgUmVzdHJ1Y3R1cmUgaGFuZGxpbmcgb2YgaW5jb21taW5nIHBhY2tldCBhbmQgdGhlIGdhcCB3aXRoIHRoZSBleHBlY3RlZCBzZXFudW0KKwkgIGFuZCByZWdpc3RlciBhbGwgdGltZXJzIGZyb20gdGhlIF9jaGFpbiBmdW5jdGlvbi4KKwkgIENvbnZlcnQgYSB0aW1lciB0byBhIExPU1QgcGFja2V0IHRpbWVyIHdoZW4gdGhlIG1heCBhbW91bnQgb2YgcmV0cmFuc21pc3Npb24KKwkgIHJlcXVlc3RzIGhhcyBiZWVuIHJlYWNoZWQuCisKKzIwMTMtMDgtMTkgMjE6Mzc6NDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiByZWZhY3RvciBwYWNrZXQgc3BhY2luZyBjYWxjdWxhdGlvbgorCisyMDEzLTA4LTE5IDIxOjM0OjM4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjoga2VlcCB0cmFjayBvZiBsYXN0IHNlcW51bSBhbmQgZHRzCisKKzIwMTMtMDgtMTkgMjE6Mjk6NDkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBzbWFsbCBjbGVhbnVwcworCisyMDEzLTA4LTE5IDIxOjIxOjA4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogcmVzZXQgcmV0cmFuc21pc3Npb24gdGltZXJzIGluIGFkZC9yZXNjaGVkdWxlCisJICBSZXNldCB0aGUgcmV0cmFuc21pc3Npb24gdGltZXJzIHdoZW4gYWRkaW5nIGFuZCByZXNjaGVkdWxpbmcgYSB0aW1lci4KKworMjAxMy0wOC0xOSAyMToxMjoxMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHJlbmFtZSB2YXJpYWJsZXMgZm9yIHBhY2tldCBzcGFjaW5nCisKKzIwMTMtMDgtMTkgMTQ6NTg6MDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiByZW1vdmUgbG9zdCB0aW1lciB3aGVuIHdlIGdldCB0aGUgcGFja2V0CisJICBXaGVuIHdlIHJlY2VpdmUgYSBwYWNrZXQsIGFsc28gcmVtb3ZlIHRoZSBMT1NUIHRpbWVyIGZvciBpdC4KKworMjAxMy0wOC0xOSAxNDo1Njo0OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGV4cGVjdGVkIHNlcW51bSBtdXN0IGluY3JlYXNlCisJICBPbmx5IHVwZGF0ZSB0aGUgZXhwZWN0ZWQgc2VxbnVtIHdoZW4gaXQgaXMgYmlnZ2VyIHRoYW4gdGhlIHByZXZpb3VzIGV4cGVjdGVkCisJICBzZXFudW0uCisKKzIwMTMtMDgtMTkgMTQ6NTU6NDkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBhZGQgbW9yZSBkZWJ1ZworCisyMDEzLTA4LTEyIDE2OjE1OjU0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG1hbmFnZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHF1ZXVlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBydHhxdWV1ZS5oOgorCSAgcnR4cXVldWU6IGFkZCByZXRyYW5zbWlzc2lvbiBxdWV1ZSBlbGVtZW50CisKKzIwMTMtMDgtMTIgMTQ6NTM6MzMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IGFkZCBzb21lIGRvY3MKKworMjAxMy0wOC0wNiAxNjoyOTo1NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgc2Vzc2lvbjogaGFuZGxlIE5BQ0sgZmVlZGJhY2sgYW5kIGdlbmVyYXRlIGV2ZW50cworCSAgSGFuZGxlIGFuZCBwYXJzZSB0aGUgZmVlZGJhY2sgTkFDSyBwYWNrZXRzIGFuZCBnZW5lcmF0ZSBhIFJldHJhbnNtaXNzaW9uCisJICBldmVudCBmb3IgZWFjaCBOQUNLZWQgcGFja2V0CisKKzIwMTMtMDgtMTkgMTM6MTk6NDIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBnc3RfdjRsMl9vYmplY3RfZ2V0X2Zvcm1hdF9saXN0CisKKzIwMTItMTAtMjIgMTc6NTg6MDcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSAgdjRsMjogRGUtZHVwbGljYXRlIGNhcHMgcHJvYmluZyBiZXR3ZWVuIHNyYyBhbmQgc2luaworCisyMDEzLTA4LTEzIDE3OjMyOjE3IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBleHQvcHVsc2UvTWFrZWZpbGUuYW06CisJKiBleHQvcHVsc2UvcHVsc2Vwcm9iZS5jOgorCSogZXh0L3B1bHNlL3B1bHNlcHJvYmUuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmg6CisJICBwdWxzZTogUmVtb3ZlIHVudXNlZCBHc3RQdWxzZVByb2JlCisKKzIwMTMtMDgtMTkgMTI6NDY6NDUgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOgorCSogc3lzL3Y0bDIvdHVuZXIuYzoKKwkqIHN5cy92NGwyL3R1bmVyY2hhbm5lbC5jOgorCSogc3lzL3Y0bDIvdHVuZXJub3JtLmM6CisJICB2NGwyOiBVc2UgR19ERUZJTkVfIG1hY3JvcyBmb3IgYWRkZWQgdGhyZWFkIHNhZmV0eQorCisyMDEzLTA4LTE3IDExOjI4OjEzICswMjAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5oOgorCSAgdmlkZW9taXhlcjogRG8gbm90IHNlbmQgZmx1c2hfc3RvcCBvdXJzZWxmIGFmdGVyIGEgZmx1c2hfc3RhcnQKKwkgIFdoZW4gd2UgcmVjZWl2ZSBhIGZsdXNoX3N0YXJ0LCB3ZSBzaG91bGQgd2FpdCBmb3IgdGhlIG5leHQgZmx1c2hfc3RvcAorCSAgYW5kIGZvd2FyZCBpdCwgbm90IGNyZWF0ZSBhIGZsdXNoX3N0b3Agb3Vyc2VsZi4KKworMjAxMy0wOC0xNiAxNzoxMDozMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIGgyNjRkZXBheTogaW5pdCBkZWJ1ZyBjYXRlZ29yeSBlYXJseQorCSAgSW5pdCB0aGUgZGVidWcgdmFyaWFibGUgd2hlbiB3ZSByZWdpc3RlciB0aGUgZWxlbWVudCBiZWNhdXNlIGl0IGlzIGFsc28gdXNlZCBieQorCSAgdGhlIHBheWxvYWRlciBlbGVtZW50IHdoZW4gaXQgY2FsbHMgdGhlIGFkZF9zcHNfcHBzIG1ldGhvZC4KKworMjAxMy0wOC0xNiAxMzoyNjoyOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBQcm9wZXJseSBzZXQgaGVhZGVycyB2aWEgdGhlIGJhc2UgY2xhc3MgaW5zdGVhZCBvZiBqdXN0IHB1c2hpbmcgdGhlbSBkb3duc3RyZWFtCisJICBQcmV2ZW50cyBidWZmZXJzIGZyb20gYmVpbmcgc2VuZCBiZWZvcmUgdGhlIGNhcHMgYW5kIHNlZ21lbnQgZXZlbnRzLgorCisyMDEzLTA4LTE1IDEwOjU5OjEwICswMTAwICBDaHJpcyBCYXNzIDxmbG9vYmxlZmxhbUBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogY2hlY2sgZGVub21pbmF0b3IgaXNuJ3QgemVybyBiZWZvcmUgc2NhbGluZyBkdXJhdGlvbi4KKwkgIFdoZW4gZ3N0X3F0ZGVtdXhfY29uZmlndXJlX3N0cmVhbSBzZXRzIGZwc19kLCBjaGVjayB0aGF0IG5fc2FtcGxlcyBpcworCSAgbm9uLXplcm8gYmVmb3JlIHVzaW5nIGl0IGFzIGEgZGVub21pbmF0b3IgdG8gc2NhbGUgdGhlIHN0cmVhbSBkdXJhdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDYwNzYKKworMjAxMy0wOC0xNSAxNTowODowNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cHgvZ3N0dnA5ZGVjLmM6CisJICBleHQ6IFVzZSBuZXcgZmx1c2ggdmZ1bmMgb2YgdmlkZW8gY29kZWMgYmFzZSBjbGFzc2VzIGFuZCByZW1vdmUgcmVzZXQgaW1wbGVtZW50YXRpb25zCisKKzIwMTMtMDgtMTQgMTY6MTk6MzIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBmb3J3YXJkIGZsdXNoIGJlZm9yZSBzdG9wcGluZyBkYXRhZmxvdworCSAgRmlyc3QgZm9yd2FyZCB0aGUgZmx1c2ggZXZlbnQgYW5kIHRoZW4gc3RvcCBvdXIgbG9vcCBmdW5jdGlvbi4KKworMjAxMy0wOC0xNCAxMzoxMDozMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiByZXF1aXJlIGxpYnNvdXAgPj0gMi4zOAorCSAgQnVtcCBsaWJzb3VwIHJlcXVpcmVtZW50IGZvciBuZXdlciBBUEkgdXNlZCwgbGlrZSBoZWFkZXJzX2dldF9vbmUoKS4KKwkgIDIuMzggaXMgZnJvbSBlYXJseSAyMDEyIGFuZCBpcyBpbiBsaW5lbiB3aXRoIG91ciBHTGliIHJlcXVpcmVtZW50LgorCisyMDEzLTA4LTE0IDExOjU0OjE5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cDogZG9uJ3QgdXNlIGRlcHJlY2F0ZWQgc291cF9tZXNzYWdlX2hlYWRlcnNfZ2V0KCkgQVBJCisKKzIwMTMtMDgtMTMgMTc6NDQ6NTAgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorCisJKiAuZ2l0aWdub3JlOgorCSAgLmdpdGlnbm9yZTogSWdub3JlIGZpbGVzIGZyb20gYXV0b21ha2UgdGVzdC1kcml2ZXIKKworMjAxMy0wOC0xMiAxNToyODozNCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuaDoKKwkgIHJ0cGgyNjRwYXk6IFVzZSB0aGUgU1BTL1BQUyBoYW5kbGluZyBmdW5jdGlvbiBmcm9tIHRoZSBkZXBheWxvYWRlcgorCSAgUmVtb3ZlIGR1cGxpY2F0ZWQgY29waWVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA1NTUzCisKKzIwMTMtMDgtMTIgMTU6MjY6MDggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5oOgorCSAgcnRwaDI2NGRlcGF5OiBNYWtlIHRoZSBTUFMvUFBTIGRlZHVwbGljYXRpb24gZnVuY3Rpb24gZ2VuZXJpYworCSAgTWFrZSBpdCBub3QgdG91Y2ggYW55IGludGVybmFscyBvZiB0aGUgZGVwYXlsb2FkZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDU1NTMKKworMjAxMy0wOC0xMyAxNDowOToyMCArMDEwMCAgQ2hyaXMgQmFzcyA8Zmxvb2JsZWZsYW1AZ21haWwuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogYWxsb3cgY29udmVyc2lvbiBmcm9tIHJhdyBBQUMgdG8gQURUUworCSAgVGhpcyBwYXRjaCB3aWxsIHByZXBlbmQgQURUUyBoZWFkZXJzIHRvIHJhdyBBQUMgYXVkaW8gZnJhbWVzLCBhbGxvd2luZworCSAgdXBzdHJlYW0gZWxlbWVudHMgdG8gbGluayB0byBkZWNvZGVycyB0aGF0IG9ubHkgc3VwcG9ydCBBQUMgaW4gQURUUyBmb3JtYXQuCisJICBOb3RlIHRoYXQgbm8gZXJyb3IgY29ycmVjdGlvbiBiaXRzIGFyZSBhZGRlZCB0byBBRFRTIGZyYW1lcyBpbiB0aGlzIGNvZGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjE1NzQwCisKKzIwMTMtMDgtMTMgMTI6NDQ6MTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogT25seSBmcmVlIEdDaGVja1N1bSBhZnRlciBpdHMgbGFzdCB1c2FnZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNTc2MAorCisyMDEzLTA4LTEzIDEyOjAyOjI5ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IGZpeCBjcml0aWNhbCBzZXR0aW5nIGEgTlVMTCB1cmkgcmVkaXJlY3Rpb24KKworMjAxMy0wNy0xMyAwMTo1MDo1NiArMDIwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJICBzb3VwaHR0cHNyYzogYWRkIHJlZGlyZWN0aW9uIHRvIHRoZSBVUkkgcXVlcnkKKworMjAxMy0wNy0zMSAxMDo0MjowNyArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBlbHN0IHNob3VsZCBvZmZzZXQgc2FtcGxlcyBpbnN0ZWFkIG9mIGJ1ZmZlcnMKKwkgIFRoZSBjdXJyZW50IGFwcHJvYWNoIHdoZXJlIGJ1ZmZlcnMgYXJlIG9mZnNldCBpcyBub3QgaWRlYWwsIGFzIGR1cmluZyBzZWVrCisJICBhbmQgbG9vcCBjdXJyZW50IHRpbWUgaXMgY29tcGFyZWQgdG8gc2FtcGxlIHRpbWVzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDI2NAorCisyMDEzLTA4LTA3IDE5OjMyOjA3ICswMjAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBTZW5kIEVPUyBpZiBidWZfZW5kID49IHNlZ21lbnQuc3RvcAorCSAgVGhhdCBtZWFucyB0aGUgd2hvbGUgc2VnbWVudCBpcyBhbHJlYWR5IHBsYXllZCwgYW5kIHdlIGFyZSBzdXJlIHdlCisJICBhcmUgRU9TIGF0IHRoYXQgcG9pbnQuCisJICBBbHNvIGhhbmRsZSBzZWdtZW50IHNlZWtzLCBhbmQgZG8gbm90IHNlbmQgRU9TIGluIHRoYXQgY2FzZS4KKworMjAxMy0wOC0wNCAxNDo0MDozOCArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHNlbmQgcHJvcGVyIHN0cmVhbV9zdGFydCBldmVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvL3Nob3dfYnVnLmNnaT9pZD03MDU0NDkKKworMjAxMy0wOC0wOCAxMTo1MToxNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IERvbid0IHByaW50IHdhcm5pbmdzIGR1cmluZyBmbHVzaGluZyBhbmQgc3RvcCBhcyBzb29uIGFzIHBvc3NpYmxlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy8vc2hvd19idWcuY2dpP2lkPTcwNTQ0MgorCisyMDEzLTA4LTA3IDExOjE0OjM4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOGRlcGF5LmM6CisJICBydHB2cDhkZXBheTogbWFyayBrZXkgZnJhbWVzIGFuZCBkZWx0YSBmcmFtZXMgcHJvcGVybHkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDU1NTAKKworMjAxMy0wOC0wNSAyMzoyMzo1NyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogYWRkIE5BQ0sgZmVlZGJhY2sgaW4gUlRDUAorCisyMDEzLTA4LTA1IDIzOjIyOjE2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSAgc291cmNlOiBhZGQgbWV0aG9kcyB0byByZWdpc3RlciBOQUNLCisJICBBZGQgYSBtZXRob2QgdG8gcmVnaXN0ZXIgYSBtaXNzaW5nIHBhY2tldCBmb3IgYW4gc3NyYyBhbG9uZyB3aXRoCisJICBtZXRob2RzIHRvIGdldCB0aGUgbWlzc2luZyBwYWNrZXRzIGFuZCBjbGVhciB0aGVtLgorCisyMDEzLTA4LTA0IDIzOjA1OjM2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBzZXNzaW9uOiBoYW5kbGUgUmV0cmFuc21pc3Npb24gZXZlbnQgYW5kIHNjaGVkdWxlIE5BQ0sKKwkgIEhhbmRsZSB0aGUgcmV0cmFuc21pc3Npb24gZXZlbnQgZnJvbSBkb3duc3RyZWFtIGFuZCB1c2UgaXQgdG8gc2NoZWR1bGUgYSBOQUNLCisJICByZXF1ZXN0LgorCisyMDEzLTA4LTA1IDIzOjIwOjI5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBwYXNzIGRhdGEgdG8gcmVtb3ZlIGZ1bmMKKwkgIFBhc3MgdGhlIGRhdGEgdG8gdGhlIHJlbW92ZSBmdW5jdGlvbiBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBkZXJlZiBpdCB3aGVuIHRoZXJlCisJICBpcyBwbGkgb3IgZmlyLgorCisyMDEzLTA4LTA2IDE1OjI4OjUwICswMjAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IGNvbXBpbGF0aW9uCisKKzIwMTMtMDgtMDYgMTU6MTc6NDQgKzAyMDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBSYXcgYnVmZmVyIERUUyBzaG91bGQgYWx3YXlzIGJlIENMT0NLX1RJTUVfTk9ORQorCisyMDEzLTA4LTA2IDExOjU4OjM4ICswMjAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBNYWtlIHN1cmUgdG8gc2VuZCBFT1MgaWYgdGhlIGJ1ZmZlciBlbmQgdGltZSBlcXVhbHMgdGhlIHNlZ21lbnQgZW5kIHRpbWUKKwkgIE90aGVyd2l6ZSBFT1MgbmV2ZXIgZ2V0cyBzZW50IGluIHRoYXQgcGFydGljdWxhciBjYXNlLgorCisyMDEzLTA4LTA1IDA4OjQ5OjUwICswMjAwICBTam9lcmQgU2ltb25zIDxzam9lcmQuc2ltb25zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSAgZ29vbTogRW5zdXJlIHNyYyBjYXBzIGFyZSB3cml0YWJsZQorCSAgSW4gc29tZSBjYXNlcyB0aGUgc3JjIGNhcHMgZGV0ZXJtaW5lZCBieSBnb29tIHdlcmVuJ3Qgd3JpdGFibGUsIGNhdXNpbmcKKwkgIGEgYnVuY2ggb2YgYXNzZXJ0aW9uIGZhaWx1cmVzIGFuZCBmYWlsZWQgY2Fwcy4gRml4ZWQgYnkgYWx3YXlzCisJICBleHBsaWNpdGVseSBtYWtpbmcgdGhlIGNhcHMgd3JpdGFibGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDU0NzUKKworMjAxMy0wOC0wNCAyMzoxODoyOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgc2Vzc2lvbjogdXNlIGNvbW1vbiBzZW5kX3J0Y3AgbWV0aG9kCisJICBSZXVzZSB0aGUgc2VuZF9ydGNwIG1ldGhvZCB0aGF0IGFscmVhZHkgYXNrcyBmb3IgdGhlIGN1cnJlbnQgdGltZSB3aGVuCisJICByZXF1ZXN0aW5nIGEga2V5ZnJhbWUuCisKKzIwMTMtMDgtMDQgMjM6MTI6NTAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHNlc3Npb246IERvbid0IHVzZSBDbG9ja1RpbWVEaWZmIGZvciB1bnNpZ25lZCBkZWxheXMKKworMjAxMy0wOC0wNCAxNjo1MjoxNSArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBVc2UgYnVmZmVyIFBUUyBpZiBEVFMgaXMgbm90IHNldAorCSAgQXZvaWRzIGVuZGluZyB1cCB3aXRoIGNvbXBsZXRlbHkgYm9ndXMgc2NhbGVkIGR1cmF0aW9uL3B0cyB3aGVuIG5ldworCSAgYnVmZmVycyBoYXZlIGludmFsaWQgRFRTLgorCisyMDEzLTA4LTA0IDE0OjMyOjQ3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSAgdGVzdHM6IHNraXAgaHR0cHMgdGVzdCBpZiB0aGVyZSdzIG5vIFRMUyBzdXBwb3J0IGluIHNvdXAvZ2xpYgorCisyMDEzLTA4LTA0IDExOjIwOjQxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkgIHJ0cGRlYzogdXNlIGdlbmVyaWMgbWFyc2hhbGxlcgorCisyMDEzLTA4LTA0IDEwOjUyOjMzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBNYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyLy5naXRpZ25vcmU6CisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDItbWFyc2hhbC5saXN0OgorCSogc3lzL3Y0bDIvdHVuZXItbWFyc2hhbC5saXN0OgorCSogc3lzL3Y0bDIvdHVuZXIuYzoKKwkqIHN5cy92NGwyL3R1bmVyLmg6CisJKiB3aW4zMi9NQU5JRkVTVDoKKwkqIHdpbjMyL2NvbW1vbi90dW5lci1lbnVtdHlwZXMuYzoKKwkqIHdpbjMyL2NvbW1vbi90dW5lci1lbnVtdHlwZXMuaDoKKwkqIHdpbjMyL2NvbW1vbi90dW5lci1tYXJzaGFsLmM6CisJKiB3aW4zMi9jb21tb24vdHVuZXItbWFyc2hhbC5oOgorCSAgdjRsMjogcmVtb3ZlIHVudXNlZCBlbnVtdHlwZXMgYW5kIHVzZSBnZW5lcmljIG1hcnNoYWxsZXIKKworMjAxMy0wOC0wNCAxMDo0NzozOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogTWFrZWZpbGUuYW06CisJKiBnc3QvdWRwLy5naXRpZ25vcmU6CisJKiB3aW4zMi9jb21tb24vZ3N0dWRwLWVudW10eXBlcy5jOgorCSogd2luMzIvY29tbW9uL2dzdHVkcC1lbnVtdHlwZXMuaDoKKwkqIHdpbjMyL2NvbW1vbi9nc3R1ZHAtbWFyc2hhbC5jOgorCSogd2luMzIvY29tbW9uL2dzdHVkcC1tYXJzaGFsLmg6CisJICB1ZHA6IHJlbW92ZSB1bnVzZWQgbWFyc2hhbCBhbmQgZW51bXR5cGVzIGZpbGVzCisKKzIwMTMtMDgtMDQgMDk6Mzg6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogZ3N0L3J0cG1hbmFnZXIvLmdpdGlnbm9yZToKKwkqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLW1hcnNoYWwubGlzdDoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIHdpbjMyL01BTklGRVNUOgorCSogd2luMzIvY29tbW9uL2dzdHJ0cGJpbi1tYXJzaGFsLmM6CisJKiB3aW4zMi9jb21tb24vZ3N0cnRwYmluLW1hcnNoYWwuaDoKKwkgIHJ0cG1hbmFnZXI6IHVzZSBnZW5lcmljIG1hcnNoYWxsZXIKKworMjAxMy0wOC0wNCAwMDoxMzowNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHNlbmQgZXZlbnQgaW4gcmlnaHQgZGlyZWN0aW9uCisKKzIwMTMtMDgtMDIgMTc6Mzg6MzQgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBjcmVhdGUvcmVtb3ZlIG9yYyBkaXJlY3RvcnkgYXQgcHJvcGVyIHRpbWUKKwkgIEJlZm9yZSBhdXRvbWFrZSBjcmVhdGVzIC5kZXBzIGRpcmVjdG9yaWVzLCBhbmQgZHVyaW5nIGRpc3RjbGVhbi4KKworMjAxMy0wOC0wMyAwMDoyNTo0NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogYWRkIEZJUiBhbmQgUExJIGxpa2Ugb3RoZXIgUlRDUCBwYWNrZXRzCisJICBBZGQgdGhlIEZJUiBhbmQgUExJIHBhY2tldHMgbGlrZSB0aGUgb3RoZXIgUlRDUCBwYWNrZXQgaW5zdGVhZCBvZiBmcm9tIHRoZQorCSAgb24tc2VuZGluZy1ydGNwIGRlZmF1bHQgc2lnbmFsIGhhbmRsZXIuCisKKzIwMTMtMDgtMDIgMTc6MjI6NTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBmaXggcHJvcGVydHkgcmFuZ2VzCisKKzIwMTMtMDgtMDIgMTY6NDI6NTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBwdXNoIHJldHJhbnNtaXNzaW9uIGV2ZW50cworCisyMDEzLTA4LTAyIDE0OjEyOjE2ICswMjAwICBMdWJvc3ogU2FybmVja2kgPGx1Ym9zekBnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGJ1aWxkOiBhZGQgc3ViZGlyLW9iamVjdHMgdG8gQU1fSU5JVF9BVVRPTUFLRQorCSAgRml4ZXMgd2FybmluZ3Mgd2l0aCBhdXRvbWFrZSAxLjE0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA1MzUwCisKKzIwMTMtMDgtMDIgMTQ6NTQ6NTYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBhZGQgc3VwcG9ydCBmb3IgcmV0cmFuc21pc3Npb24gcmV0cnkKKwkgIFdoZW4gd2UgZGlkbid0IHJlY2VpdmUgYSBwYWNrZXQgYWZ0ZXIgcmVxdWVzdGluZyByZXRyYW5zbWlzc2lvbiwgcmV0cnkKKwkgIGFza2luZyBmb3IgcmV0cmFuc21pc3Npb24gZm9yIGEgY2VydGFpbiBwZXJpb2QuCisKKzIwMTMtMDgtMDIgMTQ6MTk6NTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBhZGQgcHJvcGVydGllcworCSAgQWRkIHByb3BlcnRpZXMgdG8gY29udHJvbCByZXRyYW5zbWlzc2lvbiBwYXJhbWV0ZXJzCisKKzIwMTMtMDgtMDIgMTI6NDQ6NTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiB1c2UgY29ycmVjdGVkIHRpbWVvdXQgd2hlbiByZXNjaGVkdWxpbmcKKwkgIFdoZW4gd2UgcmVjYWxjdWxhdGUgdGhlIHRpbWVvdXQsIHVzZSB0aGUgY29ycmVjdGVkIHRpbWVvdXQgdmFsdWUgZGVwZW5kaW5nIG9uCisJICB0aGUgdGltZXIgdHlwZS4KKworMjAxMy0wOC0wMiAxMjo0MzowMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHVwZGF0ZSB0aW1lcnMgYWZ0ZXIgcXVldWVpbmcKKwkgIEVsc2Ugd2UgbWlnaHQgdXBkYXRlIHRoZSB0aW1lciBuZWVkbGVzc2x5IGZvciBkdXBsaWNhdGVzLgorCisyMDEzLTA4LTAyIDEyOjQyOjA4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogbW92ZSBtZXRob2QgdXAKKworMjAxMy0wOC0wMiAwNjoyODozMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHNtYWxsIGNsZWFudXAKKworMjAxMy0wOC0wMSAyMzoyNjowNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHVuc2NoZWR1bGUgb2xkIGV4cGVjdGVkIHBhY2tldHMKKwkgIFdoZW4gd2UgcmVjZWl2ZSBhIG5ldyBwYWNrZXQsIHVuc2NoZWR1bGUgb2xkIG91dHN0YW5kaW5nIHBhY2tldHMgd2hlbiB0aGVpcgorCSAgc2VxbnVtIGlzIHRvbyBmYXIgYXdheS4KKworMjAxMy0wOC0wMSAyMzoyOToyMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHJlZmFjdG9yIHRpbWVyIHVwZGF0ZQorCisyMDEzLTA4LTAxIDIzOjI0OjI5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogdXBkYXRlIHRpbWVycyB3aGVuIHJlbW92aW5nCisJICBVcGRhdGUgdGhlIHRpbWVycyB3aGVuIHdlIHJlbW92ZSBhIHRpbWVyLgorCSAgSGFuZGxlIGNhbmNlbGVkIHRpbWVycywgbWFrZSB0aGVtIHVuc2NoZWR1bGUgdGhlIGN1cnJlbnQgdGltZXIgYW5kCisJICB0cmlnZ2VyIHRoZSB0aW1lb3V0IGNvZGUuCisKKzIwMTMtMDgtMDEgMjM6MjI6MDIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBmaXggdHlwbworCisyMDEzLTA4LTAxIDE1OjQwOjUyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogaW1wcm92ZSB0aW1lb3V0IG1hbmFnZW1lbnQKKwkgIElmIHdlIGNoYW5nZSB0aGUgc2VxbnVtIG9mIGFuIGV4aXN0aW5nIHRpbWVyIGFuZCB3ZSB3ZXJlIHdhaXRpbmcgZm9yCisJICB0aGF0IHRpbWVyLCB1bnNjaGVkdWxlIGl0LiBJZiB3ZSBjaGFuZ2UgdGhlIHRpbWVvdXQgb2YgYW4gZXhpc3RpbmcgdGltZXIgYW5kIHdlCisJICB3ZXJlIHdhaXRpbmcgb24gaXQsIG9ubHkgdW5zY2hlZHVsZSB3aGVuIHRoZSBuZXcgdGltZSBpcyBzbWFsbGVyLgorCisyMDEzLTA4LTAxIDE1OjA1OjM1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogaW5zdGFsbCB0aW1lciBmb3IgZXhwZWN0ZWQgYXJyaXZhbAorCSAgSW5zdGFsbCBhIHRpbWVyIHRoYXQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIGV4cGVjdGVkIGFycml2YWwgdGltZSBvZiBhIHBhY2tldAorCSAgZXhwaXJlZC4KKworMjAxMy0wOC0wMSAxNDo1NjowMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGltcHJvdmUgdW5zY2hlZHVsZSBvZiB0aW1lcnMKKwkgIENvbmZsaWN0czoKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jCisKKzIwMTMtMDgtMDEgMTI6MjE6NTMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBtb3ZlIGNvZGUgYXJvdW5kCisKKzIwMTMtMDgtMDEgMTI6MDc6MTEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBlc3RpbWF0ZSBpbnRlciBwYWNrZXQgc3BhY2luZworCSAgV2hlbiB3ZSBzZWUgdHdvIHBhY2tldHMgd2l0aCBjb25zZWN1dGl2ZSBzZXFudW1zIGFuZCBhIGRpZmZlcmVudCBSVFAgdGltZSwgdXNlCisJICB0aGUgRFRTIGRpZmZlcmVuY2UgYXMgdGhlIGludGVyIHBhY2tldCBzcGFjaW5nIGVzdGltYXRlLgorCisyMDEzLTA4LTAxIDEyOjAxOjE1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjoga2VlcCB0cmFjayBvZiBjdXJyZW50IHRpbWVvdXQKKworMjAxMy0wOC0wMSAxMTo0OToxMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGNsZWFudXAgdGltZXIgaGFuZGxpbmcKKworMjAxMy0wOC0wMSAxMTo0MDo0MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHJlc2V0IGlzIG9ubHkgcG9zc2libGUgd2l0aCBhIEdBUAorCisyMDEzLTA4LTAxIDExOjI5OjMyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBvcGVyYXRlIG9uIERUUworCSAgTWFrZSB0aGUgaml0dGVyYnVmZmVyIHNjaGVkdWxlIHRoZSB0aW1lb3V0cyBiYXNlZCBvbiB0aGUgRFRTIGluc3RlYWQKKwkgIG9mIHRoZSBQVFMuIFRoaXMgbWFrZXMgaXQgYWxsIHNtb290aGVyIHdpdGggcmVvcmRlcmVkIGZyYW1lcyBhbmQgZ2l2ZXMKKwkgIHRoZSBkZWNvZGVyIHRpbWUgdG8gcmVvcmRlciB0aGUgZnJhbWVzIGluIHRpbWUuCisKKzIwMTMtMDgtMDEgMTE6MTQ6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiByZW5hbWUgdGltb3V0IHZhcmlhYmxlCisKKzIwMTMtMDctMzEgMTc6MDg6NTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBzbWFsbCBjbGVhbnVwCisKKzIwMTMtMDctMzEgMTY6NTk6NTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBibG9jayBvdXRwdXQgaW4gcGF1c2VkIG9yIGJ1ZmZlcmluZworCisyMDEzLTA3LTMxIDE2OjU5OjA5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogc3RvcmUgcHRzIGluIHRpbWVyCisJICBPbmx5IHN0b3JlIHRoZSBwdHMgaW4gdGhlIHRpbWVyIHNvIHRoYXQgd2UgY2FuIGJvdGggZG8gdGltZW91dHMgd2l0aCB0aW1pbmdzIG9uCisJICB0aGUgaW5wdXQgYW5kIG91dHB1dCBvZiB0aGUgaml0dGVyYnVmZmVyLgorCisyMDEzLTA3LTMwIDIzOjE0OjI0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogcmVmYWN0b3Igaml0dGVyYnVmZmVyCisJICBSZWZhY3RvciB0aGUgaml0dGVyYnVmZmVyIGNvZGUuIE1ha2Ugc2VwYXJhdGUgZnVuY3Rpb24gZm9yIHBlZWtpbmcgYSBidWZmZXIsCisJICBwdXNoaW5nIHRoZSBuZXh0IGJ1ZmZlciwgd2FpdGluZyBmb3IgdGltZW91dHMgYW5kIGhhbmRsaW5nIHRoZSB0aW1lb3V0cy4KKwkgIFRoZSBtYWluIGxvb3Agbm93IHRyaWVzIHRvIHB1c2ggYXMgbWFueSBidWZmZXJzIGFzIGl0IGNhbiB1bnRpbCBpdCBydW5zIG91dCBvZgorCSAgYnVmZmVycyBvciB3aGVuIGl0IGRldGVjdHMgYSBzZXFudW0gZGlzY29udC4gVGhlbiBpdCB3aWxsIHdhaXQgZm9yIHNvbWUgZXZlbnQgdG8KKwkgIGhhcHBlbiBiZWZvcmUgYXR0ZW1wdGluZyB0byBwdXNoIG1vcmUgYnVmZmVycy4KKwkgIE1ha2UgbWV0aG9kcyB0byByZWdpc3RlciB0aW1lb3V0cyBpbiBhbiBhcnJheS4gVGhlc2UgdGltZW91dHMgYXJlIHJlZ2lzdGVyZWQKKwkgIHdoZW4gd2UgZGV0ZWN0IGEgbWlzc2luZyBwYWNrZXQsIHN5bmMgZm9yIHRoZSBmaXJzdCBwYWNrZXQgb3Igd2hlbiB3ZSBmaW5kIGFuCisJICBlc3RpbWF0aW9uIGZvciB0aGUgZW5kLW9mLXN0cmVhbS4KKwkgIFRoaXMgZ3JlYXRseSBzaW1wbGlmaWVzIGFuZCBjbGFyaWZpZXMgdGhlIGNvZGUgYW5kIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8KKwkgIHJlZ2lzdGVyIG1vcmUgY29tcGxpY2F0ZWQgdGltZW91dCBzY2hlbWVzIGxhdGVyLgorCisyMDEzLTA3LTMwIDE4OjUyOjU4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogdXNlIE5VTEwgdG8gaWdub3JlIHBlcmNlbnQKKwkgIElmIHdlIHBhc3MgTlVMTCB0byBwb3AgYW5kIHB1c2ggd2UgaWdub3JlIHRoZSBwZXJjZW50IHJlc3VsdC4KKworMjAxMy0wNy0zMCAwNzowMDoxOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHJlZmFjdG9yCisJICBNb3ZlIGVvcyBlc3RpbWF0aW9uIGludG8gc2VwYXJhdGUgZnVuY3Rpb24KKworMjAxMy0wNy0zMCAxNDoyODoxOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IGRvbid0IGxlYWsgc3RyZWFtX2lkIHN0cmluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNTE0MgorCisyMDEzLTA3LTI5IDE5OjUzOjUyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBwby9MSU5HVUFTOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9oci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vamEucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vcGwucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJICBwbzogdXBkYXRlIHRyYW5zbGF0aW9ucworCisyMDEzLTA3LTI5IDE5OjQ4OjU0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSAgdGVzdHM6IGlnbm9yZSBuZXcgdGVzdCBiaW5hcmllcworCisyMDEzLTA3LTI5IDE0OjQ3OjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQKKworPT09IHJlbGVhc2UgMS4xLjMgPT09CisKKzIwMTMtMDctMjkgMTM6NDI6MTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS4xLjMKKworMjAxMy0wNy0yOSAxMzo0MjowNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxMy0wNy0yOSAxMjoxMjo0MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgZ3N0OiBEb24ndCBzd2FwIHN0YXJ0L3N0b3AgZm9yIG5lZ2F0aXZlIHJhdGVzIGluIHRoZSBTRUdNRU5UIHF1ZXJ5CisKKzIwMTMtMDctMjkgMTE6MTg6NDAgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQ2hlY2sgZm9yIGRhdGEgc2l6ZSB3aGVuIHBhcnNpbmcgaDI2NCBjb2RlYyBkYXRhIGZyb20gc3RyZiBhdG9tCisKKzIwMTMtMDctMjkgMTA6NTM6NTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBJbXBsZW1lbnQgU0VHTUVOVCBxdWVyeQorCisyMDEzLTA3LTI5IDEwOjUzOjQ3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBJbXBsZW1lbnQgU0VHTUVOVCBxdWVyeQorCisyMDEzLTA3LTI5IDEwOjUwOjU5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBJbXBsZW1lbnQgU0VHTUVOVCBxdWVyeQorCisyMDEzLTA3LTI3IDE4OjEwOjIyICswMjAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IFN1cHBvcnQgSDI2NCBmb3VyY2MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDQ5OTYKKworMjAxMy0wNy0yOCAxODowOTozMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBGaXggaGFuZGxpbmcgb2YgaW1hZ2UgdGFncworCSAgVGhlIGNhcHMgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IHRoZSBtaW1ldHlwZSBhbmQgdGhlcmUgaXMKKwkgIG9ubHkgYW4gaW5mbyBzdHJ1Y3R1cmUgZm9yIHRoZSBHc3RTYW1wbGUgaWYgdGhlIGltYWdlLXR5cGUKKwkgIGlzIG5vdCBOT05FLgorCisyMDEzLTA3LTI4IDE4OjA0OjMyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IERvbid0IGNyYXNoIGlmIHRoZXJlIGlzIG5vIGltYWdlIHRhZyBpbmZvcm1hdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNTAxOAorCisyMDEzLTA3LTI4IDE3OjM4OjU2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBGaXggZHVyYXRpb24gcmVwb3J0aW5nIGluIHB1c2ggbW9kZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDkzMworCisyMDEzLTA3LTI4IDE3OjMyOjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBEb24ndCBmb3JnZXQgdW5tYXBwaW5nIGFuZCB1bnJlZmZpbmcgYnVmZmVyCisKKzIwMTMtMDctMjYgMjE6MDY6MTcgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiB1bm1hcCBidWZmZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDQ5NTEKKworMjAxMy0wNy0yNiAyMjozMTo0MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogZG9uJ3QgbWFrZSBidWZmZXIgd3JpdGFibGUgcHJlbWF0dXJlbHkKKwkgIFRoZXJlIGlzIG5vIHJlYXNvbiB0byBtYWtlIHRoZSBTUiBidWZmZXIgd3JpdGFibGUgYXQgdGhpcyBwb2ludC4gVGhpcyBpcyBiZXR0ZXIKKwkgIGRlbGF5ZWQgdW50aWwgbmVlZGVkLgorCisyMDEzLTA3LTI2IDIyOjI1OjUwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBpZ25vcmUgUlRDUCBmb3IgaW5hY3RpdmUgc291cmNlcworCisyMDEzLTA3LTI2IDIyOjI1OjE3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBzbWFsbCBjbGVhbnVwCisKKzIwMTMtMDctMjYgMTc6MTc6MzEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSAgc2Vzc2lvbjogaGFuZGxlIHBhcnRpYWwgUlRDUCByZXBvcnQgYmxvY2tzCisJICBXaGVuIHdlIGhhdmUgbW9yZSBTU1JDcyB0byByZXBvcnQgdGhhbiB3aGF0IGZpdCBpbiBhbiBSVENQIHBhY2tldCwgdXNlIGEKKwkgIGdlbmVyYXRpb24gY291bnRlciB0byBtYWtlIHN1cmUgYWxsIG9mIHRoZW0gZW5kIHVwIGluIGEgcGFja2V0IGV2ZW50dWFsbHkuCisKKzIwMTMtMDctMjYgMTc6MjM6MTAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IGNyZWF0ZSBTU1JDIGJlZm9yZSBkb2luZyBzZXNzaW9uIGNsZWFudXAKKwkgIE1ha2UgdGhlIGludGVybmFsIHNvdXJjZSBiZWZvcmUgd2UgZG8gc2Vzc2lvbiBjbGVhbnVwCisKKzIwMTMtMDctMjYgMTc6MjE6MDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IHJlb3JnYW5pemUgdGhlIHJlcG9ydCBibG9jayBjb2RlCisKKzIwMTMtMDctMjYgMTY6MDI6MDEgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogZml4IG1lbW9yeSBsZWFrIGluIGNoZWNrX3N1YnRpdGxlX2J1ZmZlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNDkyMQorCisyMDEzLTA3LTI2IDE0OjIxOjQwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiByZWZhY3RvciBhY3RpdmUgYW5kIHNlbmRlciBjaGVja3MKKworMjAxMy0wNy0yNiAxMjowNjozNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogcmVtb3ZlIGludGVybmFsIHNvdXJjZXMgb24gdGltZW91dAorCSAgV2hlbiBhbiBpbnRlcm5hbCBzb3VyY2UgdGltZXMgb3V0IGFuZCBiZWNvbWVzIGEgcmVjZWl2ZXIsIHJlbW92ZSBpdC4KKworMjAxMy0wNy0yNiAxMTo0Nzo1NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogY3JlYXRlIGFuIGludGVybmFsIHNvdXJjZSBmb3IgUlRDUAorCSAgV2hlbiB3ZSBuZWVkIHRvIGRvIFJUQ1AgYW5kIHdlIGRvbid0IGhhdmUgYW4gaW50ZXJuYWwgc291cmNlIHlldCwKKwkgIG1ha2Ugb25lLgorCisyMDEzLTA3LTI2IDEwOjQ3OjI4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHNlc3Npb246IHJlbW92ZSBvbGQgY29kZSB0byBjaGFuZ2UgU1NSQworCSAgUmVtb3ZlIGNvZGUgdXNlZCB0byBjaGFuZ2UgdGhlIFNTUkMgYWZ0ZXIgYSBjb2xsaXNpb24uIFdlIG5vdyBzZW5kCisJICBhIFJFQ09ORklHVVJFIGV2ZW50IHVwc3RyZWFtIHRvIG1ha2UgdGhlIHVwc3RyZWFtIGVsZW1lbnQgY2hhbmdlIHRoZSBTU1JDLgorCisyMDEzLTA3LTI2IDEwOjQyOjQ0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHNvdXJjZTogZG9uJ3QgdXBkYXRlIHBhY2tldCBTU1JDCisJICBSZW1vdmUgdGhlIGNvZGUgdG8gdXBkYXRlIHRoZSBTU1JDIGluIHBhY2tldHMsIGl0IGNhbiBuZXZlciBiZSBjYWxsZWQgbm93IHRoYXQKKwkgIHdlIGFsd2F5cyB1c2UgYSBzb3VyY2Ugd2l0aCBtYXRjaGluZyBwYWNrZXQgU1NSQy4KKworMjAxMy0wNy0yNiAxMDoyNDoyMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgc2Vzc2lvbjogZGVsYXkgYWxsb2NhdGlvbiBvZiBpbnRlcm5hbCBzb3VyY2UKKwkgIEFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzb3VyY2Ugd2hlbiB3ZSByZWNlaXZlIGEgY2FwcyB3aXRoIHRoZSBTU1JDIG9yIHdoZW4gd2Ugc2VlCisJICBhIGJ1ZmZlciB3aXRoIHRoZSBTU1JDLgorCisyMDEzLTA3LTI2IDEwOjAwOjU4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBnZW5lcmF0ZSByZWNvbmZpZ3VyZSBvbiBjb2xsaXNpb24KKwkgIFdoZW4gd2UgZGV0ZWN0IGEgY29sbGlzaW9uLCBjaGFuZ2UgdGhlIFNTUkMgdGhhdCB3ZSBzdWdnZXN0IHVwc3RyZWFtCisJICBhbmQgdHJpZ2dlciBSRUNPTkZJR1VSRS4gVGhpcyBzaG91bGQgbWFrZSB1cHN0cmVhbSBzZWxlY3QgYSBuZXcgU1NSQy4KKworMjAxMy0wNy0yNiAwOTozNzoyNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgc2Vzc2lvbjogcHJvZHVjZSBSVENQIGZvciBhbGwgaW50ZXJuYWwgc291cmNlcworCSAgTG9vcCBvdmVyIGFsbCB0aGUgaW50ZXJuYWwgc291cmNlcyBhbmQgcHJvZHVjZSBSVENQLiBXZSBhbHNvIG5lZWQKKwkgIHRvIHF1ZXVlIHRoZSBSVENQIHBhY2tldHMgYW5kIHNlbmQgdGhlbSB3aGVuIHdlIGFyZSBmaW5pc2hlZC4KKworMjAxMy0wNy0yNiAwMTo0MDoyMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgc2Vzc2lvbjogZGVwcmVjYXRlIGludGVybmFsIHNvdXJjZSBhbmQgc3NyYyBwcm9wZXJ0aWVzCisJICBEZXByZWNhdGUgdGhlIGludGVybmFsIHNvdXJjZSBhbmQgaW50ZXJuYWwgc3NyYyBwcm9wZXJ0aWVzLiBUaGVyZSBtaWdodAorCSAgYmUgbW9yZSB0aGFuIG9uZSBpbnRlcm5hbCBzb3VyY2UuCisKKzIwMTMtMDctMjYgMDE6Mjk6MDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IGludGVybmFsIHNvdXJjZXMgZG9uJ3QgdXNlIHByb2JhdGlvbgorCisyMDEzLTA3LTI2IDAxOjI0OjA3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBnaXZlIGNhcHMgdG8gc2Vzc2lvbgorCSAgTGV0IHRoZSBzZXNzaW9uIHBhcnNlIHRoZSBjYXBzIGFuZCB1cGRhdGUgaXRzIFNTUkMgd2hlbiBuZWVkZWQuCisKKzIwMTMtMDctMjYgMDE6MTQ6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHNlc3Npb246IG1ha2UgbWV0aG9kIHRvIHN1Z2dlc3QgYXZhaWxhYmxlIFNTUkMKKwkgIE1ha2UgYSBtZXRob2QgdG8gc3VnZ2VzdCB0aGUgYmVzdCBhdmFpbGFibGUgU1NSQy4gVGhpcyBpcyB0aGUgU1NSQyBvZiB0aGUgbGFzdAorCSAgY3JlYXRlZCBpbnRlcm5hbCBzb3VyY2UgYW5kIGlzIHVzZWQgdG8gaW5zdHJ1Y3QgdXBzdHJlYW0gdG8gcHJvZHVjZSB0aGlzCisJICBTU1JDLgorCisyMDEzLTA3LTI2IDAxOjAxOjQ5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBzZXNzaW9uOiBrZWVwIFNERVMgYW5kIHNldCBvbiBuZXcgaW50ZXJuYWwgc291cmNlcworCSAgS2VlcCB0cmFjayBvZiB0aGUgU0RFUyBvdXJzZWx2ZXMgYW5kIHNldCBpdCBvbiBhbGwgbmV3bHkgY3JlYXRlZAorCSAgaW50ZXJuYWwgc291cmNlcy4KKworMjAxMy0wNy0yNiAwMDo0ODoyNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogbWFrZSBtZXRob2QgdG8gbWFrZSBpbnRlcm5hbCBzb3VyY2VzCisJICBBZGQgYSBtZXRob2QgdG8gb2J0YWluIGFuIGludGVybmFsIHNvdXJjZSBhbmQgdXNlIGl0IHRvIGNyZWF0ZQorCSAgb3VyIGludGVybmFsIHNvdXJjZQorCisyMDEzLTA3LTI2IDAwOjI5OjQxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgc2Vzc2lvbjogY291bnQgaW50ZXJuYWwgc291cmNlcyBhbmQgaG93IG1hbnkgYXJlIHNlbmRlcnMKKworMjAxMy0wNy0yNiAwMDoxNDoyOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogc2VwYXJhdGUgQllFIG1hcmtpbmcgYW5kIHNjaGVkdWxpbmcKKwkgIEZpcnN0IG1hcmsgc291cmNlcyB3aXRoIEJZRSBhbmQgdGhlbiBzY2hlZHVsZSB0aGUgQllFIFJUQ1AgbWVzc2FnZS4KKworMjAxMy0wNy0yNSAyMzo1Njo0NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogZ2V0IFNTUkMgZnJvbSBSVENQIHBhY2tldCBpdHNlbGYKKwkgIEdldCB0aGUgU1NSQyBmcm9tIHRoZSBSVENQIHBhY2tldCBpbnN0ZWFkLgorCisyMDEzLTA3LTI1IDIzOjUxOjM0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBmaXggYmFuZHdpZHRoIGNhbGN1bGF0aW9uCisJICBXZSBpdGVyYXRlIG92ZXIgYWxsIHNvdXJjZXMgYW5kIHRoZSBpbnRlcm5hbCBvbmUgaXMgYWxzbyBpbiB0aGUKKwkgIGhhc2h0YWJsZSBzbyBhdm9pZCBhZGRpbmcgaXQgdHdpY2UuCisKKzIwMTMtMDctMjUgMjM6Mzg6MDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IGFkZCBzb21lIGRvY3MKKworMjAxMy0wNy0yNSAyMzoxMTowNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogUmVhcnJhbmdlIFJUQ1AgcmVwb3J0aW5nIGEgbGl0dGxlCisJICBNYWtlIGEgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYW4gUlRDUCBwYWNrZXQgZm9yIGEgc291cmNlLCBwYXNzIHRoZSBzb3VyY2UgYXMgYQorCSAgcGFyYW1ldGVyLgorCSAgTW92ZSB0aW1lb3V0IG9mIGNvbGxpc2lvbnMgdG8gc2Vzc2lvbiBjbGVhbnVwIHBoYXNlLgorCisyMDEzLTA3LTI1IDIyOjM5OjA0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBtb3ZlIGNoZWNrIGZvciBpc19lYXJseSBhcm91bmQKKwkgIE1vdmUgdGhlIGNoZWNrIGZvciB0aGUgZWFybHkgUlRDUCB0byB3aGVyZSBpdCBpcyBuZWVkZWQgYW5kIHVzZWQuCisKKzIwMTMtMDctMjUgMTc6MzU6MDIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IHBhcnNlIHBhY2tldCBvdXRzaWRlIG9mIHRoZSBzZXNzaW9uIGxvY2sKKworMjAxMy0wNy0yNSAxNzozNDowNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogZG8gbmljZXIgY2hlY2tzIGZvciBpbnRlcm5hbCBzb3VyY2VzCisKKzIwMTMtMDctMjUgMTc6MTU6MzcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBzZXNzaW9uOiBsZXQgc291cmNlIGtlZXAgdHJhY2sgaWYgaXQgc2VudCBCWUUKKworMjAxMy0wNy0yNSAxNzowNjoyMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBzb3VyY2U6IHJlc2V0IG1vcmUKKworMjAxMy0wNy0yNSAxNjo0OTo0MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIHNvdXJjZTogYWxzbyB1c2UgdGhlIHNvdXJjZSBmb3IgYnllX3JlYXNvbgorCSAgU3RvcmUgdGhlIEJZRSByZWFzb24gaW4gb3VyIGludGVybmFsIHNvdXJjZSBvYmplY3QuIFJlbmFtZSB0aGUgbWV0aG9kcyBvbiB0aGUKKwkgIHNvdXJjZSBvYmplY3QgYSBsaXR0bGUgYmVjYXVzZSBub3cgdGhlIEJZRSBjYW4gYmUgcmVjZWl2ZWQgaW4gUlRDUCBvcgorCSAgc2V0IHdoZW4gdGhlIHNlc3Npb24gd2FudHMgdG8gc2VuZCBCWUUuCisKKzIwMTMtMDctMjUgMTY6MjQ6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBzZXNzaW9uOiBjb25maWd1cmUgc2RlcyB3aXRoIHN0cnVjdHVyZSBvbmx5CisJICBSZW1vdmUgY29kZSB0byBjb25maWd1cmUgdGhlIFNERVMgd2l0aCBtZXRob2RzIGFuZCB0eXBlcywgb25seQorCSAgYWxsb3cgY29uZmlndXJhdGlvbiB3aXRoIEdzdFN0cnVjdHVyZQorCisyMDEzLTA3LTI1IDE1OjU2OjM5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiByZWZhY3RvciBhZGQgYW5kIGZpbmQgc291cmNlCisJICBNYWtlIGZ1bmN0aW9ucyB0byBmaW5kIGFuZCBhZGQgYSBzb3VyY2UgdG8gdGhlIGhhc2h0YWJsZS4KKworMjAxMy0wNy0yNSAxNTo0MzoxMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgc2Vzc2lvbjogcmVtb3ZlIHNvdXJjZSBmcm9tIHN5bmNfcnRjcAorCSAgV2UgZG9uJ3QgbmVlZCB0byBrbm93IHRoZSBzZW5kZXIgc291cmNlIG9mIHRoZSBzZXNzaW9uIGluIHRoZQorCSAgY2FsbGJhY2ssIHRoZSBTUiBwYWNrZXQgaXMgZm9yIGFsbCBwYXJ0aWNpcGFudHMgaW4gdGhlIHNlc3Npb24uCisKKzIwMTMtMDctMjQgMTQ6MTg6MTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBhZGQgc29tZSBtb3JlIGRlYnVnCisKKzIwMTMtMDctMTUgMTc6MTE6NDUgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5oOgorCSAgYWFjcGFyc2U6IGFsbG93IGNvbnZlcnNpb24gZnJvbSBBRFRTIHRvIHJhdyBBQUMKKwkgIFNvbWUgbXV4ZXJzIChlZywgcXRtdXgpIG9ubHkgc3VwcG9ydCByYXcgQUFDLCBzbyB0aGlzIGFsbG93cyBsaW5raW5nCisJICBhbiBlbmNvZGVyIHRoYXQgb3V0cHV0cyBBRFRTIG9ubHkgdG8gdGhvc2UgbXV4ZXJzLgorCSAgVGhlIGNvbnZlcnNpb24gaXMgc2ltcGxlIChvbWl0IHRoZSBmaXJzdCA3IG9yIDkgYnl0ZXMgb2YgdGhlIGZyYW1lKSwKKwkgIGJ1dCBoYXMgdG8gYmUgZG9uZSBpbiBwcmVfcHVzaCBpbnN0ZWFkIG9mIGhhbmRsZV9mcmFtZSBhcyAxLjAgZG9lcworCSAgbm90IHNlZW0gdG8gYWxsb3cgc2tpcHBpbmcgYnl0ZXMgdGhlcmUgYXMgMC4xMCB1c2VkIHRvLgorCSAgT3RoZXIgY29udmVyc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgKHlldCkuCisKKzIwMTMtMDctMTUgMTc6MTU6NDQgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogZml4IG9iamVjdF90eXBlIHBhcnNpbmcgb2ZmLWJ5LW9uZSBpbiBBRFRTIGZyYW1lCisJICBBY2NvcmRpbmcgdG8gaHR0cDovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9QURUUywKKwkgIHRoZSB2YWx1ZSBzdG9yZWQgaW4gQURUUyBoZWFkZXJzIGlzIG9uZSBsZXNzIHRoYW4gdGhlIG9iamVjdAorCSAgdHlwZSBvZiB0aGUgQUFDIHN0cmVhbS4KKwkgIEEgbG9vayBhdCBmZm1wZWcgc2hvd3MgaXQgYWxzbyBhZGRzIDEgdG8gdGhlIHZhbHVlIHJlYWQgb2ZmCisJICB0aGUgQURUUyBoZWFkZXIuCisJICBOb3RlIHRoYXQgdGhpcyBtaWdodCBicmVhayBvdGhlciB0aGluZ3MgdGhhdCBoYXBwZW4gdG8gaGF2ZQorCSAgYW4gaW52ZXJzZSBvZmYgYnkgb25lIHRvIG1hdGNoIHRoZSBleGlzdGluZyBjb2RlLgorCisyMDEzLTA3LTI1IDExOjEzOjAxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggc2VxbnVtIGhhbmRsaW5nIGZvciBzZWVrcworCSAgVXNlIHRoZSBzYW1lIHNlcW51bSBhcyB0aGUgc2VlayBmb3IgZmx1c2hlcy9zZWdtZW50cyB0aGF0IGFyZQorCSAgY2F1c2VkIGJ5IHRoZSBzZWVrLiBBbHNvIGRvIHRoZSBzYW1lIGZvciBzZWdtZW50IGV2ZW50cworCSAgRml4ZXMgIzY3NjI0MgorCisyMDEzLTA3LTI1IDAxOjM5OjU4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICBtYXRyb3NrYWRlbXV4OiBmaXggc2VxbnVtIGhhbmRsaW5nIGZvciBzZWVrcworCSAgVXNlIHRoZSBzYW1lIHNlcW51bSBhcyB0aGUgc2VlayBmb3IgZmx1c2hlcy9zZWdtZW50cyB0aGF0IGFyZQorCSAgY2F1c2VkIGJ5IHRoZSBzZWVrLiBBbHNvIGRvIHRoZSBzYW1lIGZvciBzZWdtZW50IGV2ZW50cworCSAgRml4ZXMgIzY3NjI0MgorCisyMDEzLTA3LTI1IDAxOjExOjMxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogY29ycmVjdGx5IGhhbmRsZSBzZXFudW0gZm9yIHNlZWtzIGFuZCBzZWdtZW50cworCSAgVXNlIHRoZSBzYW1lIHNlcW51bSBvbiBtZXNzYWdlcyBhbmQgZXZlbnRzIGZvciBkZXJpdmVkIGV2ZW50cy4KKwkgIEZpeGVkIGZvciBmbHVzaGVzIC8gc3RyZWFtLXN0YXJ0IC8gc2VnbWVudCBhZnRlciBhIHNlZWssIGFuZCBzZWdtZW50CisJICBhZnRlciBhIHNlZ21lbnQuCisJICBGaXhlcyAjNjc2MjQyCisKKzIwMTMtMDctMTIgMjA6MDE6NDIgKzAyMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IGFsd2F5cyBpZ25vcmUgSEVBRCBlcnJvcnMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDQyNDEKKworMjAxMy0wNy0yNSAxNDoyNjowNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJICBqcGVnZW5jOiBDbGVhbiB1cCByZXNldC9zdGFydC9zdG9wIGhhbmRsaW5nCisKKzIwMTMtMDctMjUgMTQ6MTM6MTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAganBlZ2RlYzogVXNlIGJhc2UgY2xhc3MgZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb24gaW5zdGVhZCBvZiByZXBsaWNhdGluZyBpdCBoZXJlCisKKzIwMTMtMDctMjUgMTQ6MTI6NTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogQ2xlYW4gdXAgaGFuZGxpbmcgb2YgcmVzZXQvc3RhcnQvc3RvcAorCisyMDEzLTA3LTI1IDEwOjQxOjIyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvZmlsZXMvaWQzLTQwNzM0OS0xLnRhZzoKKwkqIHRlc3RzL2ZpbGVzL2lkMy00MDczNDktMi50YWc6CisJKiB0ZXN0cy9maWxlcy9pZDMtNDQ3MDAwLXdjb3AudGFnOgorCSAgdGVzdHM6IGZpeCB0ZXN0IElEMyB0YWdzIHVwIG5vdCB0byByZWx5IG9uIGRvZGd5IHR5cGVmaW5kaW5nIGNvZGUKKwkgIENoYW5nZSAweGZmIDB4ZmIgJ21wMycgbWFya2VyIHRvICdmTGFDJyBtYXJrZXIsIHNvIHdlIGNhbiBmaXgKKwkgIHRoZSB0eXBlZmluZGVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MTM2OAorCisyMDEzLTA3LTI1IDA4OjIyOjQ1ICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSAgb3N4YXVkaW9zaW5rOiBpbnRlcnNlY3QgdGhlIHByb2JlZCBjYXBzIHdpdGggdGhlIGZpbHRlciBwYXNzZWQgdG8gZ2V0X2NhcHMoKQorCisyMDEzLTA3LTI0IDE0OjE3OjQ1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIGJpbjogZml4IGNvbXBpbGF0aW9uCisKKzIwMTMtMDctMjQgMTI6NDI6MzEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJICB2cmF3ZGVwYXk6IGZpeCBVWVZQIGZvcm1hdAorCisyMDEzLTA3LTI0IDEyOjQxOjU4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkgIHZyYXdwYXk6IGZpeCBVWVZQIGZvcm1hdAorCisyMDEzLTA3LTI0IDEyOjQxOjQ0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkgIHZyYXdwYXk6IGZpeCBjYXBzCisKKzIwMTMtMDctMjQgMTA6NDk6MDMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBmaXggbG9ja2luZworCSAgVGFrZSB0aGUgbG9jayBlYXJsaWVyIHNvIHRoYXQgd2UgZG8gdGhpbmdzIHRoYXQgZm9sbG93IHdpdGggdGhlIHJpZ2h0CisJICBsb2NraW5nLgorCisyMDEzLTA3LTIzIDE3OjQwOjAyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBkb24ndCB1c2UgaW52YWxpZCB0aW1lcyBpbiBSVENQIHRpbWVvdXRzCisJICBBbiBpbnZhbGlkIHRpbWVvdXQgY2FuIGJlIGNhbGN1bGF0ZWQgd2hlbiB3ZSBkaXNhYmxlZCBSVENQIGJ5IHNldHRpbmcgdGhlCisJICBiYW5kd2lkdGggdG8gMC4gTWFrZSBzdXJlIGFsbCBjb2RlIGNhbiBoYW5kbGUgdGhpcyBjYXNlLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NDYyNgorCisyMDEzLTA3LTIzIDE3OjM4OjIwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBsb2NrIHNlc3Npb24gd2hlbiBjaGFuZ2luZyBiYW5kd2lkdGgKKwkgIFRha2UgdGhlIHNlc3Npb24gbG9jayB3aGVuIGNoYW5naW5nIHRoZSBiYW5kd2lkdGggcHJvcGVydGllcyBzbyB0aGF0IHdlIGRvbid0CisJICBlbmQgdXAgd2l0aCBpbmNvbnNpc3RlbnQgYmVoYXZpb3VyLgorCisyMDEzLTA3LTIzIDE3OjM3OjA1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiByZXNldCBzb21lIFJUQ1AgdmFyaWFibGVzCisJICBUaGUgZWFybHlfc2VuZCB0aW1lIHdhcyBzZXQgdG8gMCBhbmQgYWx3YXlzIHRyaWdnZXJpbmcgYW4gZWFybHkgUlRDUCBwYWNrZXQuCisKKzIwMTMtMDctMjMgMTU6MDM6MzEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEFkZCBhbGwgdGhlIG1wZWcgWERDQU0gdmFyaWFudHMKKwkgIFRoaXMgc2hvdWxkIGNvdmVyIGFsbCBrbm93biBYRENBTSB2YXJpYW50cyAod2hpY2ggYXJlIGFsbCBtcGVnMiB2aWRlbykKKwkgIEZpeGVzICM2NzIyMjcKKworMjAxMy0wNy0wMyAxODo0MTo0MiArMDIwMCAgQ2FybG9zIFJhZmFlbCBHaWFuaSA8ZHZAcHNldWRvdGVybWluYWwub3JnPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgcnRwYmluOiBhZGRlZCBjdXN0b20gZG93bnN0cmVhbSBzeW5jIGV2ZW50CisJICBydHBiaW4gY2FuIG5vdyBzZW5kIGEgY3VzdG9tIGluLWJhbmQgZG93bnN0cmVhbSBldmVudCB3aGljaCBpbmZvcm1zCisJICBkb3duc3RyZWFtIHRoYXQgdGhlIGJpbiBoYXMgcmVjZWl2ZWQgYW4gUlRDUCBTUiBwYWNrZXQuIFRoaXMgaXMgdXNlZnVsCisJICBmb3IgYXBwbGljYXRpb25zIHdoaWNoIHdhbnQgdG8gZHJvcCB0aGUgaW5pdGlhbCB1bnN5bmNocm9uaXplZCByZWNlaXZlZAorCSAgUlRQIHBhY2tldHMuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAzNTYwCisJICBTaWduZWQtb2ZmLWJ5OiBDYXJsb3MgUmFmYWVsIEdpYW5pIDxkdkBwc2V1ZG90ZXJtaW5hbC5vcmc+CisKKzIwMTMtMDctMjIgMTg6MDA6MTYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBmaXggb24tdGhlLWZseSBjaGFuZ2luZyBvZiAibW9kZSIgYW5kICJmaWVsZHMiIHByb3BlcnRpZXMKKwkgIFdlIGNhbGwgc2V0Y2FwcygpIHRvIHJlY29uZmlndXJlIG91cnNlbHZlcywgYnV0IHdlIG5lZWQgdG8gcGFzcworCSAgdGhlIGN1cnJlbnQgKnNpbmsqIGNhcHMsIG5vdCB0aGUgc291cmNlIGNhcHMgdGhlbi4gQWxzbyBmaXggYQorCSAgY2FwcyBsZWFrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MTU5OQorCisyMDEzLTA3LTIyIDE1OjIzOjM5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IEFkZCBzdXBwb3J0IGZvciBncm91cC1pZCBpbiB0aGUgc3RyZWFtLXN0YXJ0IGV2ZW50CisKKzIwMTMtMDctMjIgMTU6MjM6MjAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogQWRkIHN1cHBvcnQgZm9yIGdyb3VwLWlkIGluIHRoZSBzdHJlYW0tc3RhcnQgZXZlbnQKKworMjAxMy0wNy0yMiAxNToyMzoxMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBBZGQgc3VwcG9ydCBmb3IgZ3JvdXAtaWQgaW4gdGhlIHN0cmVhbS1zdGFydCBldmVudAorCisyMDEzLTA3LTIyIDE1OjIyOjU1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICBtYXRyb3NrYWRlbXV4OiBBZGQgc3VwcG9ydCBmb3IgZ3JvdXAtaWQgaW4gdGhlIHN0cmVhbS1zdGFydCBldmVudAorCisyMDEzLTA3LTIyIDE1OjIyOjQ3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBBZGQgc3VwcG9ydCBmb3IgZ3JvdXAtaWQgaW4gdGhlIHN0cmVhbS1zdGFydCBldmVudAorCisyMDEzLTA3LTIyIDE1OjIyOjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkgIGZsdmRlbXV4OiBBZGQgc3VwcG9ydCBmb3IgZ3JvdXAtaWQgaW4gdGhlIHN0cmVhbS1zdGFydCBldmVudAorCisyMDEzLTA3LTIyIDE1OjIyOjE2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIGF2aWRlbXV4OiBBZGQgc3VwcG9ydCBmb3IgZ3JvdXAtaWQgaW4gdGhlIHN0cmVhbS1zdGFydCBldmVudAorCisyMDEzLTA3LTIyIDE1OjIxOjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJKiBleHQvZHYvZ3N0ZHZkZW11eC5oOgorCSAgZHZkZW11eDogQWRkIHN1cHBvcnQgZm9yIGdyb3VwLWlkIGluIHRoZSBzdHJlYW0tc3RhcnQgZXZlbnQKKworMjAxMy0wNy0xOSAyMjo1OToxNSArMDIwMCAgTWF0aGlldSBEdXBvbmNoZWxsZSA8bWF0aGlldS5kdXBvbmNoZWxsZUBlcGl0ZWNoLmV1PgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogdXNlIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSpfcm91bmQuCisJICBUaGVyZSBjb3VsZCBiZSBhIGNhc2Ugd2hlcmU6CisJICAxKSB5b3UgZG8gYSBuZXcgc2V0X2NhcHMgYWZ0ZXIgYnVmZmVycyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgorCSAgMikgdHNfb2Zmc2V0IGdldHMgc2V0IHRvIGEgZGlmZmVyZW50IHZhbHVlLCBlZyAwLjAzMzMzMzMzMworCSAgMykgeW91ciBwYWRzIGdldCBFT1MsIGJ1dCB0aGUgY2hlY2sgZG9yIHRoYXQgZG9lc24ndCB3b3JrCisJICBiZWNhdXNlIHlvdSB1c2UgdHNfb2Zmc2V0ICsgYSB0cnVuY2F0ZWQgdmFsdWUgPCBzZWdtZW50LnN0b3AKKwkgIDQpIHNvIGluIHRoZSBuZXh0IGNvbGxlY3RlZCwgeW91IGVuZCB1cCBjb21wYXJpbmcgZm9yIGV4YW1wbGU6CisJICAwLjk5OTk5OTk5OTkgPiAxLiwgd2hpY2ggaXMgZmFsc2UgYW5kIG1lYW5zIHlvdSBkb24ndCBzZW5kIEVPUy4KKwkgIEFsc28gYWRkcyBzY2FsZV9yb3VuZCBpbiB0d28gb3RoZXIgcGxhY2VzIHdoZXJlIGl0IHBvdGVudGlhbGx5IGNvdWxkCisJICBoYXZlIGNhdXNlZCBwcm9ibGVtcy4KKworMjAxMy0wNy0xNSAxNzo1NToxOSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZm91cmNjLmg6CisJICBxdGRlbXV4OiBBZGQgV1JMRSBzdXBwb3J0CisKKzIwMTMtMDctMTkgMTk6MzU6MjYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IG1ha2UgZmlsZXMgZnJvbSBWaXZvdGVrIGNhbWVyYSBwbGF5CisJICBTa2lwIHRyYWNrcyBvZiAndml2bycgc3VidHlwZSB3aXRoIGVtcHR5IHN0c2QgaW5zdGVhZCBvZgorCSAgZXJyb3Jpbmcgb3V0IHNheWluZyB0aGF0IHRoZSBmaWxlIGlzIGJyb2tlbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTk3OTEKKworMjAxMy0wNy0xOSAxNzoxNDowNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiB3aGVuIHN0cmVhbWluZyBkb24ndCB0cnkgdG8gc2VlayB3aGVuIHN0b3BwaW5nCisJICBJdCBtaWdodCBjYXVzZSBlcnJvcnMgaW4gc2lua3MgdGhhdCBhcmUgbm90IHNlZWthYmxlIGFuZAorCSAgaGF2ZSByZXBvcnRlZCB0aGlzIChsaWtlIGUuZy4gZmRzaW5rKQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NjIyOAorCisyMDEzLTA3LTE5IDE3OjI2OjU0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHNpbXBsaWZ5IHNvbWUgaGVscGVycworCSAgU29tZSBoZWxwZXIgZnVuY3Rpb25zIGFyZSBub3QgbmVlZGVkIGFueW1vcmUgb3IgY2FuIGJlIHNpbXBsaWZpZWQuCisKKzIwMTMtMDctMTkgMTc6MTI6MzcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZm9yIG5vbi1yYXcgdmlkZW8sIG1vdmUgcGFsZXR0ZSBpbiBjYXBzCisJICBXZSBvbmx5IG5lZWQgdG8gYXBwZW5kIHRoZSBwYWxldHRlIHRvIHJhdyB2aWRlbyBidWZmZXJzLCBub24tcmF3IHZpZGVvIGhhcyB0aGUKKwkgIHBhbGV0dGUgaW4gdGhlIGNhcHMgc3RpbGwuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA0MjkyCisKKzIwMTMtMDctMTkgMDE6NDk6MjAgKzAyMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IG5pdHBpY2tpbmcgaW4gZXNkcyBwYXJzaW5nCisKKzIwMTMtMDctMTkgMDE6NDk6MDcgKzAyMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHNldCBwcm9wZXIgY2FwcyBmb3IgbXBlZy0xIGF1ZGlvCisJICBSZW1vdmUgQUFDIHNwZWNpZmljIGZpZWxkcyBmcm9tIG1wZWctMSBhdWRpbyBjYXBzLCByZW1vdmUgYXNzdW1wdGlvbgorCSAgdGhhdCB0aGUgbXBlZzEgYXVkaW8gbGF5ZXIgaXMgMywgYW5kIHNldCBgcGFyc2VkJyBmaWVsZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDQ1NDgKKworMjAxMy0wNi0xNyAyMToyNzozNyArMDIwMCAgQXJuYXVkIFZyYWMgPGF2cmFjQGZyZWVib3guZnI+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZGVjLmg6CisJKiBleHQvdnB4L2dzdHZwOGVuYy5oOgorCSogZXh0L3ZweC9nc3R2cDlkZWMuaDoKKwkqIGV4dC92cHgvZ3N0dnA5ZW5jLmg6CisJICB2cHg6IGZpeCBjb21waWxhdGlvbiB3aGVuIGVuY29kZXIgb3IgZGVjb2RlciBoZWFkZXJzIGFyZSBub3QgaW5zdGFsbGVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA0NTQ3CisKKzIwMTMtMDctMTYgMjA6NDE6MTUgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6CisJICB2aWRlb2Nyb3A6IEZpeCB1bml0IGZvciBHUkFZMTYgZm9ybWF0cworCisyMDEzLTA3LTE2IDIyOjE3OjE3ICswMjAwICBBcm5hdWQgVnJhYyA8YXZyYWNAZnJlZWJveC5mcj4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiByZW1vdmUgY2hhcHRlciBzdHJlYW0KKwkgIFJlbW92ZSBhbGwgc3RyZWFtcyB0aGF0IGFyZSBhY3R1YWxseSB0YWJsZSBvZiBjb250ZW50cywgc2luY2Ugd2Ugd2lsbAorCSAgbmV2ZXIgbmVlZCB0aGUgZGF0YSBhZnRlciBwYXJzaW5nIHRoZW0uCisKKzIwMTMtMDctMTYgMjE6NTk6MzcgKzAyMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHNlbmQgZ2FwIGV2ZW50IGZvciBzcGFyc2Ugc3RyZWFtcyBpbiBwdXNoIG1vZGUKKwkgIFRoaXMgYWxsb3dzIHRvIHByZS1yb2xsIGF0IGxlYXN0IGlmIHRoZSBuZXh0IHN1YnRpdGxlIGJ1ZmZlcgorCSAgaXMgZmFyIGF3YXkuCisKKzIwMTMtMDctMTYgMjE6NTY6MDcgKzAyMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRvIG5vdCB1c2UgaW5kZXhlcyBmcm9tIHNwYXJzZSBzdHJlYW0gd2hlbiBzZWVraW5nIGluIHB1c2ggbW9kZQorCSAgVGhpcyBtYWtlcyBzZWVraW5nIG1vcmUgYWNjdXJhdGUgaW4gcHVzaCBtb2RlLCBzaW5jZSB0aGUgcHJldmlvdXMKKwkgIGtleWZyYW1lIG9uIGEgc3BhcnNlIHN0cmVhbSBtaWdodCBiZSBmYXIgYXdheS4KKworMjAxMy0wNy0xNiAyMTowNDowNyArMDIwMCAgQXJuYXVkIFZyYWMgPGF2cmFjQGZyZWVib3guZnI+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogYWR2ZXJ0aXNlIHN1YnRpdGxlIHN0cmVhbXMgYXMgc3BhcnNlCisKKzIwMTMtMDctMTcgMTc6MTE6NDQgKzAyMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hc3Ryb2thZGVtdXg6IGRvIG5vdCBwdXNoIGRpc2NvbnQgYnVmZmVycyBpZiB0aGV5IGFyZW4ndCBkaXNjb250CisJICBVbnNldCB0aGUgZGlzY29udCBmbGFnIGluc3RlYWQgb2YgcG9zc3NpYmx5IHB1c2hpbmcgYSBidWZmZXIgd2l0aAorCSAgYSBmbGFnIHRoYXQncyBzdGlsbCBzZXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgyMTEwCisKKzIwMTMtMDctMTcgMTU6MTA6MDAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZXh0cmFjdCB0aGUgcGFsZXR0ZSBmcm9tIHN0c2QKKwkgIFNvbWV0aW1lcyBhIHBhbGV0dGUgaXMgaW5zaWRlIHRoZSBzdHNkLCBleHRyYWN0IGl0IGluc3RlYWQgb2YgYWx3YXlzIHVzaW5nCisJICB0aGUgZGVmYXVsdCBvbmUKKworMjAxMy0wNy0xNyAxNDozMDoxNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJICBnb29tMmsxOiBGaXggZXZlbnQgaGFuZGxpbmcgYW5kIG5lZ290aWF0ZSBhcyBzb29uIGFzIHBvc3NpYmxlCisKKzIwMTMtMDctMTcgMTQ6Mjc6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSAgZ29vbTogRml4IGV2ZW50IGhhbmRsaW5nIGFuZCBuZWdvdGlhdGUgYXMgc29vbiBhcyBwb3NzaWJsZQorCisyMDEzLTA3LTExIDE5OjQ1OjE3ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IHdhcm4gYWJvdXQgdGhlIGZ1dHVyZSBkZXByZWNhdGlvbiBvZiB0aGUgImVtYmVkIiBwcm9wZXJ0eQorCisyMDEzLTA3LTE3IDA5OjU2OjAxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFkZCBzdXBwb3J0IGZvciBXUkFXCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA0MjkyCisKKzIwMTMtMDctMTcgMDk6NTQ6NTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcGFsZXR0ZSBpcyBhcHBlbmRlZCB0byBidWZmZXJzLCBub3QgaW4gY2FwcworCSAgRml4IHRoZSBwYWxldHRlIGhhbmRsaW5nLCBpbiAxLjAgd2UgYXBwZW5kIHRoZSBwYWxldHRlIHRvIHRoZSBidWZmZXIgaW5zdGVhZCBvZgorCSAgcGxhY2luZyBpdCBvbiB0aGUgY2Fwcy4KKwkgIFNlZSBhbHNvIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDQyOTIKKworMjAxMy0wNy0xNiAxNTozNzo0OSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSAgcnRwOiBVc2UgZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXJfZmFzdCgpIHdoZXJlIHBvc3NpYmxlIGluIFJUUCBwYXlsb2FkZXJzCisKKzIwMTMtMDctMTUgMTY6MjQ6MDcgKzAyMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJlc2V0IHNlZ21lbnQgb24gZmx1c2ggc3RvcAorCSAgY2NhMmY1NTVkMTQgaW50cm9kdWNlcyBhIHJlZ3Jlc3Npb24sIHdoZXJlIHRoZSBkZW11eCBzZWdtZW50IGlzIG5vdAorCSAgcmVzZXQgb24gZmx1c2ggc3RvcCwgc28gdGhlIG5leHQgdXBzdHJlYW0gc2VnbWVudCBldmVudCB3aWxsIGNhbGN1bGF0ZQorCSAgYW4gaW52YWxpZCBiYXNlIHRpbWUgb24gdGhlIG5ldyBzZWdtZW50IHRvIGJlIHNlbnQgZG93bnN0cmVhbS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDQyNTUKKworMjAxMy0wNy0wNiAxNzoyMDo0OSArMDIwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IG9mZnNldCBzYW1wbGVzIGFjY29yZGluZyB0byBlZGl0IGxpc3QKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDAyNjQKKworMjAxMy0wNy0xNCAxMjo1MDoxMyArMTIwMCAgRG91Z2xhcyBCYWduYWxsIDxkb3VnbGFzQGhhbG8uZ2VuLm56PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9zcGVjdHJ1bS1leGFtcGxlLmM6CisJICBsZXZlbDogRml4IHRoZSBzcGVjdHJ1bSBleGFtcGxlIGZvciAxLjAKKwkgIFRoZSAibWVzc2FnZSIgcHJvcGVydHkgaGFzIGJlZW4gcmVwbGFjZWQgYnkgInBvc3QtbWVzc2FnZXMiLgorCSAgUHJlLXBhdGNoIG91dHB1dDoKKwkgICh0ZXN0X3NwZWN0cnVtOjIzMTAxKTogR0xpYi1HT2JqZWN0LVdBUk5JTkcgKio6IGdfb2JqZWN0X3NldF92YWxpc3Q6CisJICBvYmplY3QgY2xhc3MgYEdzdFNwZWN0cnVtJyBoYXMgbm8gcHJvcGVydHkgbmFtZWQgYG1lc3NhZ2UnCisJICBOZXcgc3BlY3RydW0gbWVzc2FnZSwgZW5kdGltZSAwOjAwOjAwLjEwMDAwMDAwMAorCSAgKHRlc3Rfc3BlY3RydW06MjMxMDEpOiBHU3RyZWFtZXItQ1JJVElDQUwgKio6CisJICBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWU6IGFzc2VydGlvbiBgR1NUX1ZBTFVFX0hPTERTX0xJU1QgKHZhbHVlKScgZmFpbGVkCisJICBbLi4uXQorCSAgUG9zdC1wYXRjaDoKKwkgIE5ldyBzcGVjdHJ1bSBtZXNzYWdlLCBlbmR0aW1lIDA6MDA6MDAuMTAwMDAwMDAwCisJICBiYW5kIDAgKGZyZXEgNDAwKTogbWFnbml0dWRlIC02NS45ODg3NzcgZEIgcGhhc2UgMS41MzMzOTcKKwkgIGJhbmQgMSAoZnJlcSAxMjAwKTogbWFnbml0dWRlIC02NS41NDU1NjMgZEIgcGhhc2UgLTAuNzgwOTAwCisJICBiYW5kIDIgKGZyZXEgMjAwMCk6IG1hZ25pdHVkZSAtNjQuNzkxOTQ2IGRCIHBoYXNlIC0wLjc5OTYxMQorCSAgYmFuZCAzIChmcmVxIDI4MDApOiBtYWduaXR1ZGUgLTY0LjU1NjE3NSBkQiBwaGFzZSAtMC4wNjM2MTUKKwkgIFsuLi5dCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA0MTc5CisKKzIwMTMtMDctMTMgMjA6NTY6MjYgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBiZSBsZXNzIHZlcmJvc2Ugd2hlbiBwYXJzaW5nIExPQVMgc3RyZWFtcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNDE2MgorCisyMDEzLTA3LTEyIDEyOjMxOjM5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJICBzaW5rOiBhbGF3L211bGF3IGNhcHMgZG9uJ3QgaGF2ZSBhIGxheW91dCBwcm9wZXJ0eQorCisyMDEzLTA3LTEyIDEyOjI3OjUzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmM6CisJICBwdWxzZTogcmVsYXggbXVsYXcgYW5kIGFsYXcgZm9ybWF0IGNoZWNrcworCSAgVGhlIGF1ZGlvIGxpYnJhcnkgY29uc2lkZXJzIHRoZW0gYXMgZW5jb2RlZCBmb3JtYXRzIGFuZCBkb2VzIG5vdCBmaWxsIGluIHRoZQorCSAgc2FtcGxlIHdpZHRoLiBUaGUgYXVkaW8gcmluZ2J1ZmZlcnMgaWRlbnRpZmllcyB0aGUgZm9ybWF0IGFzIGFsYXcvbXVsYXcgYW5kIHRoYXQKKwkgIGlzIGFsd2F5cyA4IGJpdHMuCisKKzIwMTMtMDctMTEgMTY6MTM6MDUgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZm91cmNjLmg6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuYzoKKwkgIHF0ZGVtdXg6IHVuc2VsZWN0IGluc3RlYWQgb2YgaWdub3JpbmcgZGlzYWJsZWQgdHJhY2ssIGRldGVjdCBjaGFwdGVyIHRyYWNrCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA0MDA3CisKKzIwMTMtMDctMTEgMjA6NDE6MjMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBpZ25vcmUgZXJyb3JzIGZyb20gSEVBRCByZXF1ZXN0CisJICBIRUFEIHJlcXVlc3RzIGFyZSB1c2VkIHRvIGNoZWNrIHRoZSBzZXJ2ZXIgaGVhZGVycyB0byBzZWUgaWYgaXQKKwkgIHNlZWthYmxlLiBJZ25vcmUgZXJyb3JzIGZyb20gdGhvc2UgcmVxdWVzdHMgYXMgdGhleSBzaG91bGRuJ3QgYmUKKwkgIGNyaXRpY2FsLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwNDA1MworCisyMDEzLTA3LTEyIDAzOjI0OjA4ICswODAwICBLeW9zdWtlIE5la29tdXJhIDxzdXBlcmNhdGV4cGVydEBnbWFpbC5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSAgYXVkaW9lY2hvOiBGaXggaGFuZGxpbmcgb2YgZGVsYXkgcHJvcGVydHkgaW4gUExBWUlORy9QQVVTRUQgc3RhdGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDM5MDEKKworMjAxMy0wNy0wOSAxNzo1Njo1NyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IEVuYWJsZSBwcm94eSBjYXBzIG9uIHRoZSBzcmMgcGFkcworCisyMDEzLTA3LTExIDE2OjU3OjE1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQKKworPT09IHJlbGVhc2UgMS4xLjIgPT09CisKKzIwMTMtMDctMTEgMTU6NTg6NTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFsczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjEuMgorCisyMDEzLTA3LTExIDE1OjU4OjI5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDEzLTA3LTA5IDE1OjM0OjA0ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IGRlZmVyIHRoZSB3aW5kb3cgaGFuZGxlIHNldHVwIHRvIHRoZSBtYWluIHRocmVhZAorCisyMDEzLTA3LTA5IDE1OjMzOjE4ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IGRlZmF1bHQgdG8gdGhlIG1haW4gaW4gY2FzZSB3ZSBhcmUgbm90IHNldHVwIHlldAorCisyMDEzLTA3LTA3IDIyOjE2OjA1ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IGNsb3NlIHRoZSBpbnRlcm5hbCB3aW5kb3cgY29ycmVjdGx5CisKKzIwMTMtMDctMDcgMjE6MTQ6MjIgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogb25seSBjcmVhdGUgdGhlIE5TIGFwcCB0aHJlYWQgZm9yIENvY29hIG9uY2UKKwkgIFRoZSBoZWxwZXIgdGhyZWFkIGZvciBDb2NvYSwgaW4gY2FzZSBubyBOUyBydW4gbG9vcCBpcyBydW5uaW5nLAorCSAgc2hvdWxkIGJlIHN0YXJ0ZWQgb25seSBvbmNlIGFuZCBzaGFyZWQgYWNyb3NzIGFsbCB0aGUgaW5zdGFuY2VzCisJICBydW5uaW5nCisKKzIwMTMtMDctMDkgMTk6MTA6MTcgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogY29ycmVjdCBhcmd1bWVudCBvcmRlciBpbiBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50X3JvdW5kCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAzMzUwCisKKzIwMTMtMDctMDkgMTc6NDI6NTkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBLZWVwIGNhcHMgb3JkZXIgZnJvbSB0aGUgcGVlciBvciB0aGUgZmlsdGVyCisKKzIwMTMtMDctMDkgMTI6NDI6MTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IEZpeCBoYW5kbGluZyBvZiBidWZmZXJzIHdpdGhvdXQgYSBkdXJhdGlvbgorCSAgV2UnbGwgaGF2ZSB0byBwb3AgYnVmZmVyIGZyb20gY29sbGVjdHBhZHMgYW5kIHN0b3JlIGl0CisJICBpbnRlcm5hbGx5IG9ubHkgdG8gZ2V0IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG5leHQgYnVmZmVyLgorCSAgSWYgd2UgY29udGludWUgdG8ga2VlcCBpdCBpbiBjb2xsZWN0cGFkcywgbm8gbmV3IGJ1ZmZlcgorCSAgdG8gY2FsY3VsYXRlIHRoZSBlbmQgdGltZSB3aWxsIGV2ZXIgYXJyaXZlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMzc0MworCisyMDEzLTA3LTA5IDExOjUzOjA3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBGaXggbmVnb3RpYXRpb24gd2l0aCAwLzEgZnJhbWVyYXRlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMzc0MworCisyMDEzLTA3LTA5IDExOjE3OjU5ICswMjAwICBKb25hcyBIb2xtYmVyZyA8am9uYXNoZ0BheGlzLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBVbmxvY2sgc3RyZWFtIGxvY2sgYWZ0ZXIgdXNlCisJICBTdHJlYW0gbG9jayBvZiBzaW5rIHBhZCB3YXMgbm90IHVubG9ja2VkIGFmdGVyIG5vbi11cGRhdGluZyBzZWVrLgorCisyMDEzLTA2LTI3IDEzOjI2OjMxICswMjAwICBPZ255YW4gVG9uY2hldiA8b2dueWFuQGF4aXMuY29tPgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSAgbXVsdGlwYXJ0bXV4OiBSZS1zZXQgbmVlZF9zZWdtZW50IGZsYWcgYWZ0ZXIgRkxVU0hfU1RPUAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMzE4MgorCisyMDEzLTA3LTA1IDExOjUxOjA0ICswMjAwICBNaWNoYWVsIE9sYnJpY2ggPG0ub2xicmljaEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGJ1ZmZlcnBvb2w6IGRvbid0IGZvcmdldCB0byByZWxlYXNlIGJ1ZmZlciBvbiBlcnJvcgorCSAgSWYgdGhlIHBvb2wgaXMgc3RvcHBlZCB3aGlsZSBnc3RfdjRsMl9idWZmZXJfcG9vbF9kcWJ1ZigpIHdhaXRzIGZvciBhCisJICBidWZmZXIgdGhlbiB0aGUgcmV0dXJuIHZhbHVlIGlzIEdTVF9GTE9XX0ZMVVNISU5HLiBJbiB0aGlzIGNhc2UgdGhlIGJ1ZmZlcgorCSAgdG8gcXVldWUgbXVzdCBhbHNvIGJlIHJlbGVhc2VkLiBPdGhlcndpc2UgaXMgd2lsbCBuZXZlciBiZSBkZWxldGVkIG9yCisJICByZXR1cm5lZCB0byBpdHMgcG9vbC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDM3NjQKKworMjAxMy0wNy0wOCAxNDoxNToxMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgcnRwOiBGYWlsIHBheWxvYWRpbmcgdW5pdCB0ZXN0IGlmIGFuIGVycm9yIG1lc3NhZ2UgaXMgcmVjZWl2ZWQKKworMjAxMy0wNy0wOCAxNDowOTozNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJICBydHBoMjYzcHBheTogRG9uJ3QgcGFzcyB1cHN0cmVhbSBmaWx0ZXIgY2FwcyB0byBkb3duc3RyZWFtCisJICBEb3duc3RyZWFtIHVzdWFsbHkgY2FuJ3QgYWNjZXB0IHZpZGVvL3gtaDI2MyBidXQgb25seSBhcHBsaWNhdGlvbi94LXJ0cCwKKwkgIHNvIHdlIHdvdWxkIGFsd2F5cyBnZXQgYW4gZW1wdHkgaW50ZXJzZWN0aW9uIGhlcmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAyNjMyCisKKzIwMTMtMDctMDUgMjI6MDA6MzcgKzAyMDAgIFBpb3RyIERyxIVnIDxwaW90cmRyYWdAZ21haWwuY29tPgorCisJKiBwby9QT1RGSUxFUy5pbjoKKwkgIHBvOiB1cGRhdGUgUE9URklMRVMuaW4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDM2ODUKKworMjAxMy0wNy0wMiAxMToxMzoyNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYXZvaWQgc29tZSBzdHJkdXAKKworMjAxMy0wNy0wMiAxMDozNzo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYWRkIHNlbGVjdC1zdHJlYW0gc2lnbmFsCisJICBBZGQgYSBzaWduYWwgdG8gbGV0IHRoZSBhcHAgc2VsZWN0IHdoYXQgc3RyZWFtcyB3aWxsIGJlIHNlbGVjdGVkLgorCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MzQ0MTkKKworMjAxMy0wNy0wMiAxMDozNzozNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYXZvaWQgc3RyZHVwCisKKzIwMTMtMDctMDIgMTA6MTI6MTcgKzAyMDAgIEouIFJpY2sgUmFtc3RldHRlciA8cmljay5yYW1zdGV0dGVyQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9SRUFETUU6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cDogRml4IGRvY3VtZW50YXRpb24gYW5kIGNvbW1lbnRzIHRvIHVzZSBydHBiaW4gaW5zdGVhZCBvZiBvbGQgZ3N0cnRwYmluCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAzNDI2CisKKzIwMTMtMDctMDEgMTY6NTU6MDEgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBkb24ndCBleHRyYWN0IGRhdGEgZnJvbSBjYXBzIHR3aWNlCisJICBnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMoKSBhbHdheXMgZXh0cmFjdCB3aWR0aCwgaGVpZ2h0LCBpbnRlcmxhY2UgbW9kZSBhbmQKKwkgIGZyYW1lcmF0ZSBub3cuIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gZG8gaXQgYWdhaW4gZm9yIGVuY29kZWQKKwkgIGZvcm1hdHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAzMzk5CisKKzIwMTMtMDYtMjAgMDk6NDE6NDggLTAzMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IGFsc28gY29uc2lkZXIgc3RvcCBwb3NpdGlvbnMgaW4gc2Vla3MKKwkgIFVzZSBzZWVrIHN0b3AgcG9zaXRpb24gYXMgcmFuZ2UgZW5kIGZvciByZXF1ZXN0cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMjIwNgorCisyMDEzLTA2LTE5IDE0OjA2OjQwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IGFsbG93IHNlZWtzIGluIHJlYWR5CisJICBPbiBpc19zZWVrYWJsZSwgY2hlY2sgaWYgdGhlIHNlcnZlcidzIGhlYWRlcnMgaGF2ZSBhbHJlYWR5IGJlZW4KKwkgIHJlY2VpdmVkLiBJZiBub3QsIGRvIGEgSEVBRCByZXF1ZXN0IHRvIGdldCB0aGVtIGJlZm9yZSByZXNwb25kaW5nCisJICB0byBiYXNlc3JjLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMjIwNgorCisyMDEzLTA3LTAxIDE3OjI4OjU1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBhZGQgc2lnbmFsIHRvIG5vdGlmeSBvZiB0aGUgU0RQCisJICBUaGlzIHdheSwgdGhlIGFwcCBjYW4gbG9vayBhbmQgbW9kaWZ5IHRoZSBTRFAuCisKKzIwMTMtMDYtMjEgMTg6MTA6MjggKzAyMDAgIEtpc2hvcmUgQXJlcGFsbGkgPGtpc2hvcmUuYXJlcGFsbGlAZ21haWwuY29tPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJICBnZGtwaXhidWZvdmVybGF5OiBBbGxvdyBuZWdhdGl2ZSBvZmZzZXRzIHRvIHNwZWNpZnkgb2Zmc2V0IGZyb20gYm90dG9tL3JpZ2h0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAyODI2CisKKzIwMTMtMDYtMzAgMjE6MDE6MjAgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvTWFrZWZpbGUuYW06CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGNvbXB1dGUgZnJhbWVyYXRlIGZyb20gYXZlcmFnZSBzYW1wbGUgZHVyYXRpb24KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDMzNTAKKworMjAxMy0wNi0yNSAyMToxNjozOCArMDIwMCAgQWxiYW4gQnJvd2FleXMgPHByYWhhbEB5YWhvby5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBBZGQgZmx2dmVyc2lvbiAxIHRvIHRoZSBmbGFzaC12aWRlbyBjYXBzCisJICBUaGlzIGFsbG93cyB1c2luZyBhdmRlY19mbHYgd2hpY2ggcmVxdWlyZXMgdGhpcyBmaWVsZCB0byBiZQorCSAgcHJlc2VudCBpbiB0aGUgY2Fwcy4gRkxWIG9ubHkgc3VwcG9ydHMgZmxhc2gtdmlkZW8gdmVyc2lvbiAxCisJICByaWdodCBub3cuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAzMDc2CisKKzIwMTMtMDctMDEgMTE6Mzc6MDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJICBkZWludGVybGVhdmU6IERvbid0IGhvbGQgb2JqZWN0IGxvY2sgd2hpbGUgc2VuZGluZyBldmVudHMgZG93bnN0cmVhbQorCSAgQmFzZWQgb24gYSBwYXRjaCBieSBLaXNob3JlIEFyZXBhbGxpIDxraXNob3JlLmFyZXBhbGxpQGdtYWlsLmNvbT4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDMxMTQKKworMjAxMy0wNy0wMSAxMDo1OTowNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IEFkZCBNUEVHNCB2aWRlbyBwcm9maWxlL2xldmVsIHRvIHRoZSBjYXBzCisKKzIwMTMtMDctMDEgMTA6NTY6MjggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBBZGQgQUFDIHByb2ZpbGUvbGV2ZWwgdG8gdGhlIGNhcHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDMzMTIKKworMjAxMy0wNi0yOCAxNToyMTo1NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5Lmg6CisJICB2b3JiaXNwYXk6IGFkZCBzdXBwb3J0IGZvciBjb25maWctaW50ZXJ2YWwKKwkgIEFsaWduIGNvZGUgd2l0aCB0aGUgdGhlb3JhIHBheWxvYWRlciBhbmQgYWRkIHN1cHBvcnQgZm9yIHRoZSBjb25maWctaW50ZXJ2YWwgdG8KKwkgIHBlcmlvZGljYWxseSBzZW5kIG91dCB0aGUgY29uZmlnIGhlYWRlcnMuCisKKzIwMTMtMDYtMjggMTU6MjE6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJICB0aGVvcmFwYXk6IHNtYWxsIGNsZWFudXBzCisKKzIwMTMtMDYtMjggMTI6MDg6MTkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJICB0aGVvcmFwYXk6IGhhbmRsZSBzdHJlYW1oZWFkZXJzIGFzIHdlbGwKKworMjAxMy0wNi0yOCAxMjowNjoyMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkgIHZvcmJpc3BheTogYWx3YXlzIGNvbGxlY3QgaGVhZGVycyBvbiBkYXRhCisJICBXaGVuIHdlIHNlZSBhIGRhdGEgcGFja2V0LCBhbHdheXMgY2hlY2sgaWYgd2UgbmVlZCB0byBjb2xsZWN0IGFueSBwcmV2aW91cworCSAgaGVhZGVycy4KKworMjAxMy0wNi0yOCAxMTo0MzoxNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkgIHZvcmJpc3BheTogaGFuZGxlIHN0cmVhbWhlYWRlciBhcyB3ZWxsCisJICBUYWtlIGNvbmZpZyBzdHJpbmdzIGZyb20gdGhlIHN0cmVhbWhlYWRlciB3aGVuIHdlIGNhbgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NDMxMgorCisyMDEzLTA2LTI3IDA3OjQwOjI5ICswMjAwICBEYXZpZCBTdmVuc3NvbiBGb3JzIDxkYXZpZHNmQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IGF2b2lkIGRvdWJsZSBidWZmZXIgdW5tYXAgb24gZXJyb3IKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDMxNzEKKworMjAxMy0wNi0yNyAxNzowMjoxNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcmVzZXQtc3luYyBiZWZvcmUgcGxheQorCSAgQ2FsbCByZXNldC1zeW5jIG9uIHRoZSBydHBiaW4gYmVmb3JlIHdlIGdvIHRvIHBsYXlpbmcuIFRoaXMgbWFrZXMgdXMgcmVxdWlyZSBTUgorCSAgcGFja2V0cyBmb3IgYWxsIHN0cmVhbXMgYWdhaW4gYmVmb3JlIHdlIGF0dGVtcHQgdG8gc3luYyB0aGVtLiBJZiB3ZSBkb24ndCByZXNldCwKKwkgIGl0IG1pZ2h0IGJlIHRoYXQgd2UgY29tYmluZSBTUiBwYWNrZXRzIGZyb20gYmVmb3JlIGFuZCBhZnRlciB0aGUgUEFVU0UvUExBWUlORworCSAgc3RhdGUgY2hhbmdlIGFuZCBlbmQgdXAgd2l0aCBodWdlIGJvZ3VzIG9mZnNldHMuCisKKzIwMTMtMDYtMjcgMTY6MjM6MjAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBpbXByb3ZlIHN5bmMgb24gZmlyc3QgcGFja2V0cworCSAgRG9uJ3QgdGhyb3cgYXdheSB0aGUgZmlyc3QgUlRDUCBwYWNrZXQgaWYgaXQgYXJyaXZlcyBiZWZvcmUgdGhlIGZpcnN0CisJICBSVFAgcGFja2V0IGJ1dCByZW1lbWJlciBhbmQgdXNlIGl0IHRvIHNpZ25hbCBzeW5jIG9uY2Ugd2UgZ2V0IHRoZQorCSAgUlRQIHBhY2tldC4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkxNDAwCisKKzIwMTMtMDYtMjcgMTY6MTU6NDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBvbmx5IHNpZ25hbCBsb29wIHdoZW4gYWN0aXZlCisJICBPbmx5IHNpZ25hbCB0aGUgbG9vcCBmdW5jdGlvbiB3aGVuIGl0IGlzIGFjdGl2ZS4KKworMjAxMy0wNi0yNyAxNjoxMzozNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHNpZ25hbCB0aW1lc3RhbXAgZGlzY29udAorCSAgV2UgY2FuIG5vdyB1c2UgdGhlIFJFU1lOQyBidWZmZXIgZmxhZyB0byBtYXJrIGEgdGltZXN0YW1wIGRpc2NvbnQgd2hlbiB3ZSB1cGRhdGUKKwkgIHRoZSB0cy1vZmZzZXQgcHJvcGVydHkuCisKKzIwMTMtMDYtMjYgMjA6NDk6NDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAganBlZ3BheTogdHVybiBzb21lIGVycm9ycyBpbnRvIHdhcm5pbmdzCisJICBUdXJuIHNvbWUgZXJyb3JzIGludG8gd2FybmluZ3MsIHdlIGNhbiBjb250aW51ZSBwcm9jZXNzaW5nIHNvIHRoaXMgc2hvdWxkCisJICBub3QgYmUgZmF0YWwuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU3MDc5CisKKzIwMTMtMDYtMjYgMTQ6NTg6NTMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IGF2b2lkIHNvbWUgZmx1c2hlcworCisyMDEzLTA2LTI2IDE0OjQxOjAwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBoYW5kbGUgZGF0YSBtZXNzYWdlIHdoZW4gd2FpdGluZyBmb3IgcmVwbHkKKwkgIFdoZW4gd2UgYXJlIHdhaXRpbmcgZm9yIGEgc2VydmVyIHJlcGx5LCBoYW5kbGUgZGF0YSBtZXNzYWdlcyBpbnN0ZWFkIG9mCisJICBpZ25vcmluZyB0aGVtLgorCisyMDEzLTA2LTI2IDE0OjI3OjM0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBoYW5kbGUgZGF0YSBtZXNzYWdlcyBpbiBzZXBhcmF0ZSBtZXRob2QKKwkgIFJlZmFjdG9yIGFuZCBtYWtlIGEgbWV0aG9kIHRvIGhhbmRsZSBhIGRhdGEgbWVzc2FnZS4KKworMjAxMy0wNi0yNSAyMDozNjoxOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYWRkIHNvbWUgbW9yZSBkb2NzIHRvIGhhbmRsZS1yZXF1ZXN0IHNpZ25hbAorCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDI3MDUKKworMjAxMy0wNi0xMCAxNzoyMDozMCAtMDQwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgU2VuZCBhIGNsb2NrX3Byb3ZpZGUgbWVzc2FnZSBvbiB0aGUgYnVzIHdoZW4gd2UgZ2V0IGEgbmV0Y2xvY2sKKworMjAxMy0wNi0xMCAxNzoyMDoxNCAtMDQwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogRXhwb3NlIHVzZS1waXBlbGluZS1jbG9jayBwcm9wZXJ0eQorCisyMDEzLTA2LTI0IDE3OjExOjM1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgdWRwc2luazogYmluZCB0byB0aGUgZ2l2ZW4gaW50ZXJmYWNlCisJICBBY3R1YWxseSBjYWxsIEJJTkRUT0RFVklDRSB0byBiaW5kIHRvIHRoZSBpbnRlcmZhY2UgYXMgZ2l2ZW4gYnkgdGhlCisJICBwcm9wZXJ0eS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDI4MTkKKworMjAxMy0wNi0yMiAxMDo1OToxNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSAgdnA4ZGVjOiBFcnJvciBvdXQgZ3JhY2VmdWxseSBpZiB3ZSBnZXQgYW4gdW5zdXBwb3J0ZWQgY29sb3IgZm9ybWF0CisJICBJbiB0aGVvcnkgd2UgY2FuIG9ubHkgZ2V0IEk0MjAgdGhvdWdoLCBqdXN0IHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUuCisKKzIwMTMtMDYtMjIgMTA6NTc6NDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZXh0L3ZweC9nc3R2cDlkZWMuYzoKKwkqIGV4dC92cHgvZ3N0dnA5ZW5jLmM6CisJICB2cDk6IEFkZCBzdXBwb3J0IGZvciBZVjEyLCBZNDJCIGFuZCBZNDQ0IGNvbG9yIGZvcm1hdHMKKwkgIFRoZSBlbmNvZGVyIGRvZXMgbm90IHdvcmsgd2l0aCBZNDJCIGFuZCBZNDQ0IHlldCBpdCBzZWVtcy4KKworMjAxMy0wNi0yMiAxMDoyNjoxOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBleHQvdnB4L2dzdHZwOWRlYy5jOgorCSAgdnA5ZGVjOiBVcGRhdGUgZGVmYXVsdCBwb3N0cHJvYyBzZXR0aW5ncyBmcm9tIHZwOV9keF9pZmFjZS5jCisKKzIwMTMtMDYtMjEgMTM6MTE6MzIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2Evd2VibS1tdXguYzoKKwkgIG1hdHJvc2thOiBBZGQgaW5pdGlhbCBWUDkgc3VwcG9ydAorCisyMDEzLTA2LTIxIDEzOjA3OjMwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC92cHgvTWFrZWZpbGUuYW06CisJKiBleHQvdnB4L2dzdHZwOWRlYy5jOgorCSogZXh0L3ZweC9nc3R2cDlkZWMuaDoKKwkqIGV4dC92cHgvZ3N0dnA5ZW5jLmM6CisJKiBleHQvdnB4L2dzdHZwOWVuYy5oOgorCSogZXh0L3ZweC9wbHVnaW4uYzoKKwkgIHZweDogQWRkIGluaXRpYWwsIGV4cGVyaW1lbnRhbCBWUDkgc3VwcG9ydAorCisyMDEzLTA2LTIxIDEwOjMyOjMwICswMjAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWkgYXQgY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwOiBnbyBiYWNrIGludG8gdGhlIGxvb3AgYWZ0ZXIgZG9pbmcgcGF1c2UKKwkgIEFmdGVyIHdlIGRvIGEgcGF1c2UgcmVxdWVzdCwgZ28gYmFjayB0byBsb29wIG1vZGUgc28gdGhhdCB3ZSBjYW4gbGlzdGVuCisJICBmb3Igc2VydmVyIG1lc3NhZ2VzIGFnYWluLgorCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDI3MDUKKworMjAxMy0wNi0yMCAyMzoxNjoxNyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSAgcnRwcHRkZW11eDogV2FpdCBhZnRlciB0aGUgY2FwcyB0byBmb3J3YXJkIHRoZSBvdGhlciBldmVudHMKKwkgIEZpcnN0IGZvcndhcmQgdGhlIHN0cmVhbS1zdGFydCwgdGhlbiB0aGUgY2FwcywgdGhlbiB0aGUgcmVzdAorCisyMDEzLTA2LTIxIDAwOjQyOjAyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgeGltYWdlc3JjOiBjbGVhciBkdHMgb24gYnVmZmVyIGFjcXVpcmVkIGZyb20gcG9vbAorCSAgV2hlbiBzZXR0aW5nIHRpbWVzdGFtcHMgb24gb3V0Z29pbmcgYnVmZmVycywgY2xlYXIgdGhlCisJICBkdHMgZXhwbGljaXRseSwgb3RoZXJ3aXNlIGl0IG1heSBlbmQgdXAgYmVpbmcgc2V0IHRvIGEKKwkgIGJvZ3VzIHZhbHVlIGZyb20gbGFzdCB0aW1lIGl0IHdhcyB1c2VkLiBBdm9pZHMgZXZlcnkKKwkgIHNlY29uZCBvciBzbyBidWZmZXIncyBkdHMgYmVpbmcgc2V0IHRvIDAuIE5vdCB0aGF0IGl0CisJICBzaG91bGQgbWF0dGVyIGZvciByYXcgdmlkZW8uCisKKzIwMTMtMDYtMjAgMTU6MzU6MTEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkgIHY0bDI6IGRvbid0IHJlZGVmaW5lIHRoZSBQRVJGT1JNQU5DRSBkZWJ1ZyB2YXJpYWJsZQorCSAgSXQgaXMgYWxyZWFkeSBkZWZpbmVkIGluIGNvcmUuCisJICBmaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAyNzMyCisKKzIwMTMtMDYtMjAgMTQ6NDM6NDcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGZpeCByYWNlIGluIHN0YXRlIGNoYW5nZSB0byBwYXVzZWQKKwkgIFdoZW4gd2UgZ28gdG8gcGF1c2VkLCB3ZSBmaXJzdCBmbHVzaCB0aGUgY29ubmVjdGlvbiBhbmQgdGhlbiBzZW5kIHRoZSBwYXVzZQorCSAgY29tbWFuZC4gQXMgYSByZXN1bHQgb2YgdGhlIGZsdXNoaW5nLCB0aGUgc2NoZWR1bGVkIHBhdXNlZCBjb21tYW5kIGNhbiBnZXQKKwkgIGxvc3QuIFdhaXQgdW50aWwgdGhlIGNvbm5lY3Rpb24gaXMgY29tcGxldGVseSBmbHVzaGVkIGFuZCB0aGUgcnRzcCB0YXNrIGlzCisJICB3YWl0aW5nIGJlZm9yZSBpc3N1aW5nIHRoZSBwYXVzZWQgb3IgcGxheWluZyByZXF1ZXN0LgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMjcwNQorCisyMDEzLTA2LTIwIDExOjMxOjIyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGhhbmRsZSBTRUdNRU5UIHF1ZXJ5CisKKzIwMTMtMDYtMTkgMTI6Mzc6MzEgKzAyMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyOiBPcHRpbWl6ZSBuZWdvdGlhdGlvbiBieSByZW1vdmluZyB0aGUgcXVlcnkgZmlsdGVyCisJICBBcyBjYW1lcmFzIHRlbmQgdG8gaGF2ZSBhIHF1aXRlIHNwZWNpZmljIHNldCBvZiBjYXBhYmlsaXRpZXMgKHNwZWNpZmljCisJICBmcmFtZXJhdGVzIGZvciBlYWNoIHJlc29sdXRpb24pLCBnZXR0aW5nIHRoZSBwZWVyIGNhcHMgZmlsdGVyZWQgYnkgb3VyCisJICBwcm9iZWQgY2FwcyBjYW4gY2F1c2UgYSBiaWcgaW5jcmVhc2UgaW4gdGhlIGNhcHMgc2l6ZSB3aGljaCBzbG93cyBkb3duCisJICB0aGluZ3MgcXVpcmUgYSBiaXQuCisJICBBcyBmb3IgbmVnb3RpYXRpb24gdjRsMiBpdGVyYXRlcyB0aHJvdWdoIHRoZSBjYXBzIG9mIHRoZSBwZWVyIHRvIGZpbmQgdGhlCisJICBmaXJzdCBpbnRlcnNlY3Rpb24gd2l0aCB0aGUgcHJvYmVkIGNhcHMsIGdldHRpbmcgdGhlIGZ1bGx5IGV4cGFuZGVkCisJICBpbnRlcnNlY3Rpb24gb2YgY2FwYWJpbGl0aWVzIGlzIG5vdCB1c2VmdWwuCisJICBVc2luZyB0aGUgc2FtZSB0ZXN0Y2FzZSBhcyBmb3IgYnVnICM3MDI2MzIsIGFkZGluZyB0aGlzIHBhdGNoIG9uIHRvcCBvZgorCSAgdGhlIHBhdGNoZXMgc3VnZ2VzdGVkIHRoZXJlIHNwZWVkcyB1cCBnZXR0aW5nIHRoZSBpbml0YWwgZnJhbWUgZnJvbQorCSAgYXJvdW5kIH4xNC0xNSBzZWNvbmRzIHRvIGFyb3VuZCB+My00IHNlY29uZHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAyNjM4CisKKzIwMTMtMDYtMTkgMTA6MzA6NTYgKzAyMDAgIEtpc2hvcmUgQXJlcGFsbGkgPGtpc2hvcmUuYXJlcGFsbGlAZ21haWwuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZHVyYXRpb24gcXVlcnkgcmV0dXJucyB6ZXJvIGZvciBEViB2aWRlbyBpbiBhdmkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDI2MjUKKworMjAxMy0wNi0xOSAxMTowNjozNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERpc2FibGUgdXNhZ2Ugb2YgYWxsb2NhdGlvbiBxdWVyaWVzCisJICBUaGlzIGNhbiBvbmx5IHJlbGlhYmx5IHdvcmsgaWYgZGVtdXhlcnMgaGF2ZSBhCisJICBzZXBhcmF0ZSBzdHJlYW1pbmcgdGhyZWFkIHBlciBzcmNwYWQuIFRoaXMgc2hvdWxkIGJlCisJICBkb25lIGluIGEgZGVtdXhlciBiYXNlIGNsYXNzLCB3aGljaCBpbnRlZ3JhdGVzIHBhcnRzCisJICBvZiBtdWx0aXF1ZXVlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAxODU2CisKKzIwMTMtMDYtMTEgMTU6MDI6MjEgKzAxMDAgIEFsZXggQXNobGV5IDxidWd6aWxsYUBhc2hsZXktZmFtaWx5Lm5ldD4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBBdm9pZCBza2lwcGluZyBtb292IGF0b21zIGZvciBmcmFnbWVudGVkIE1QNCBmaWxlcy4KKwkgIGJ1ZyAjNzAwNTA1CisJICBGb2xsb3dpbmcgYSByZXByZXNlbnRhdGlvbiBjaGFuZ2UgdGhhdCBjYXVzZXMgYSByZXNvbHV0aW9uIGNoYW5nZSwKKwkgIHRoZSB2aWRlbyBkZWNvZGVyIGZhaWxzIHRvIGRlY29kZSBjb3JyZWN0bHkuIERhc2hkZW11eCBkZXRlY3RzIHRoZQorCSAgcmVwcmVzZW50YXRpb24gY2hhbmdlIGFuZCBwdXNoZXMgYSBuZXcgY2FwcyBldmVudCBhbmQgYW4KKwkgIGluaXRpYWxpemF0aW9uIHNlZ21lbnQgKGEgbmV3IG1vb3YgYXRvbSkgdG8gdGhlIGRvd25zdHJlYW0gcXRkZW11eCwKKwkgIGJ1dCBpdCBkb2Vzbid0IGhhbmRsZSB0aGlzIG5ldyBtb292IHlldCwgaXQgd2lsbCBvbmx5IHBhcnNlIHRoZQorCSAgZmlyc3Qgb25lIGl0IHJlY2VpdmVzLgorCSAgVGhpcyBjb21taXQgY2hhbmdlcyBxdGRlbXV4IHRvIGFjY2VwdCBhIG5ldyBtb292IGluIGEgZGFzaCBiaXRzdHJlYW0KKwkgIHN3aXRjaGluZyBzY2VuYXJpby4KKworMjAxMy0wNi0xOSAwMDo0Mjo1NCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHNlbmQgc3RyZWFtLXN0YXJ0IG9ubHkgb25jZSBmb3IgZWFjaCBzdHJlYW0KKwkgIERvIG5vdCBzZW5kIHN0cmVhbSBzdGFydCBhZ2FpbiB3aGVuIHJlY29uZmlndXJpbmcgYSBwYWQgZm9yIG5ldyBjYXBzLgorCSAgVGhhdCBpcyBjb21tb24gZm9yIGFkYXB0aXZlIHN0cmVhbXMKKworMjAxMy0wNi0wNSAxNzowMjo0OSArMDIwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IGZpeCBzdXBwb3J0IGluIFZNJ3Mgd2l0aG91dCBoYXJkd2FyZSBhY2NlbGVyYXRpb24KKworMjAxMy0wNi0xNSAxMjoyOTozMSArMDIwMCAgSmVucyBHZW9yZyA8bWFpbEBqZW5zZ2Uub3JnPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSAgcnRwbXAydGRlcGF5OiBhY2NlcHQgbWlzbGFiZWxsZWQgc3RyZWFtcyBmcm9tIEdTdHJlYW1lciAwLjEwIGFzIHdlbGwKKwkgIFRoZSBtcDJ0IHBheWxvYWRlciBpbiAwLjEwIG1pc2xhYmVsbGVkIHRoZSBzdHJlYW1zIGFzIE1QMlQtRVMKKwkgIGluc3RlYWQgb2YgTVAyVCwgc28gYWNjZXB0IHRoYXQgYXMgd2VsbCBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMjQ1NworCisyMDEzLTA2LTE2IDA1OjQwOjEzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBtYW5hZ2UgZWxlbWVudCBzdGF0ZSBvdXJzZWx2ZXMKKwkgIExvY2sgdGhlIHN0YXRlIG9mIHRoZSBhbGwgb3VyIGVsZW1lbnRzIGFuZCBtYW5hZ2UgdGhlaXIgc3RhdGVzCisJICBvdXRzZWx2ZXMuIEJlY2F1c2Ugd2UgYXJlIHdvcmtpbmcgYXN5bmMsIHdlIGNhbid0IHJlbHkgb24gdGhlIHN0YXRlCisJICBjaGFuZ2UgZnVuY3Rpb24gdG8gc2V0IHRoZSBzdGF0ZSBhdCB0aGUgcmlnaHQgdGltZSBvciB0byByZXR1cm4gdGhlCisJICByaWdodCByZXR1cm4gdmFsdWUgZnJvbSB0aGUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMjA0NgorCisyMDEzLTA2LTE0IDE0OjA5OjUwICswMjAwICBCcnVubyBHb256YWxleiA8c3Rlbnlha0BnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogRG9uJ3QgdW5sb2NrIHN0cmVhbSBsb2NrIHdpdGhvdXQgbG9ja2luZyBpdCBmaXJzdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMjE2NworCisyMDEzLTA2LTEzIDE2OjAwOjMzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBzZXNzaW9uOiBVc2UgdGhlIHJpZ2h0IGhhc2h0YWJsZSB0byBjYWxjdWxhdGUgYmFuZHdpZHRoCisJICBEb24ndCB1c2UgYW4gdW51c2VkIGhhc2h0YWJsZSB0byBpdGVyYXRlIHNvdXJjZSB0byBjYWxjdWxhdGUgYmFuZHdpZHRoLgorCSAgUmVtb3ZlIHVudXNlZCBjb2RlLgorCisyMDEzLTA2LTEyIDE2OjI3OjI0IC0wNjAwICBCcmVuZGFuIExvbmcgPGIubG9uZ0BjYWJsZWxhYnMuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBwdWxzZXNpbms6IFJlcXVpcmUgUHVsc2VBdWRpbyA+PSAyLjAKKwkgIFRoaXMgaXMgbmVlZGVkIGZvciBwYV9mb3JtYXRfaW5mb19nZXRfcHJvcF8qIGZ1bmN0aW9ucy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODY0NTkKKworMjAxMy0wNi0xMyAxNDoyMzowOCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkgIFJldmVydCAicHVsc2VzaW5rOiBNYWtlIDIuMCBkZXBlbmRlbmN5IG9wdGlvbmFsIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCAwMTQ1NzAyN2UwZDM4NGFjYTNlNTUxYWU2ODRlMGFhMDc0ZWU1NDk4LgorCSAgV2UnbGwganVzdCBkZXBlbmQgb24gUHVsc2VBdWRpbyAyLjAgb3IgYWJvdmUgaW5zdGVhZCBvZiBoYXZpbmcgdGhlIGJ1ZworCSAgcGFydGlhbGx5IGZpeGVkIGJhc2VkIG9uIHRoZSBpbnN0YWxsZWQgbGlicHVsc2UgdmVyc2lvbi4KKworMjAxMy0wNi0xMyAxMjo0MDoxNSArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkgIHB1bHNlc2luazogTWFrZSAyLjAgZGVwZW5kZW5jeSBvcHRpb25hbAorCSAgVGhlIGdldGNhcHMgZnVuY3Rpb24gd2UgYWRkZWQgdXNlcyBzb21lIHBhX2Zvcm1hdF9pbmZvX2dldF9wcm9wLi4uCisJICBhY2Nlc3NvciBmdW5jdGlvbnMgdGhhdCB3ZXJlIG9ubHkgYWRkZWQgaW4gMi4wLCBzbyB3ZSBvbmx5IGhhdmUgb3VyCisJICBnZXRjYXBzIGltcGxlbWVudGF0aW9uIGV4aXN0IGlmIHdlJ3JlIGNvbXBpbGluZyBhZ2FpbnN0IGxpYnB1bHNlIDIuMCBvcgorCSAgYWJvdmUuCisJICBFdmVudHVhbGx5LCB3ZSBjb3VsZCBidW1wIHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50IHRvIDIuMCBvciBhYm92ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODY0NTkKKworMjAxMy0wNi0xMiAxODoyMzo0NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgUmV2ZXJ0ICJ2aWRlb21peGVyOiBXaGVuIGFsbCBzaW5rcGFkcyBhcmUgZW9zLCB1cGRhdGUgb3V0cHV0IHNlZ21lbnQgc3RvcCBhbmQgZm9yd2FyZCBpdCIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgMmQzOTEwZmM3OTAxYjVmMjllMTZjMGZkZDRlOTA2N2E2ZDdmNjZmZS4KKwkgIEl0J3Mgbm90IHNvbHZpbmcgYW55IHByb2JsZW0gYW5kIGluc3RlYWQgY2F1c2VzIGNvZGUgdG8gZmFsbCBhcGFydC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDE1MTkKKworMjAxMy0wMS0wOSAwOTozOTozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBtYXJrIHN1YnRpdGxlIHN0cmVhbXMgYXMgc3BhcnNlIGluIHN0cmVhbS1zdGFydCBldmVudAorCSAgQW5kIGFsc28gbWFyayB0aGUgc3RyZWFtcyB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0IGlmCisJICBtYXJrZWQgc28gaW4gdGhlIGhlYWRlcnMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjAwNjQ4CisKKzIwMTMtMDYtMTEgMjI6MTI6NTggKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWFvcmMtZGlzdC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYW9yYy1kaXN0Lmg6CisJICBhdWRpb3Bhbm9yYW1hOiBhZGQgcHJlYnVpbHQgZmlsZXMKKworMjAxMy0wNi0xMSAyMDoyNzo1MSArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9wYW5vcmFtYS5jOgorCSAgYXVkaW9wYW5vcmFtYTogY2xlYW51cCBhbmQgZXhwYW5kIHRoZSB0ZXN0cworCSAgU3BsaXQgb3V0IHR3byBtb3JlIHRlc3RzLiBFeHRyYWN0IG1vcmUgY29tbW9uIGNvZGUgaW50byBoZWxwZXJzLiBBZGQgY292ZXJhZ2UgZm9yIGZsb2F0LgorCisyMDEzLTA2LTEwIDIxOjE1OjIwICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmM6CisJICBhdWRpb3Bhbm9yYW1hOiBjbGVhbnVwIG9mIHRyYW5zZm9ybSgpCisJICBPbmx5IG1hcCBpbnB1dCBpZiB3ZSBhcmUgcmVhZGluZyBpdC4gQ2xlYW51cCB0aGUgbG9nZ2luZyBhbmQgdGhlIGNvbW1lbnRzIGEgYml0LgorCisyMDEzLTA2LTA5IDIwOjM1OjE4ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXVkaW9meC9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuaDoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWFvcmMub3JjOgorCSAgYXVkaW9wYW5vcmFtYTogdXNlIG9yYyB0byBzcGVlZHVwIHByb2Nlc3NpbmcKKwkgIFVzZSBzcGVjaWFsIHZhcmlhbnRzIGZvciB0aGUgY2FzZSB3aGVuIHdlIGRvbid0IGNoYW5nZSB0aGUgcGFub3JhbWEgKHBhbj0wLjApLgorCSAgU2ltcGxpZnkgdGhlIHByb2Nlc3NpbmcgZnVuY3Rpb25zIGJ5IHBhc3NpbmcgdGhlIHBhbm9yYW1hIHZhbHVlIGRpcmVjdHkgaW5zdGVhZAorCSAgb2YgdGhlIGluc3RhbmNlLiBVc2Ugb3JjIGZvciBjbGVhcmluZyBidWZmZXJzIHRvby4KKworMjAxMy0wNi0xMSAxOToyNDo0OSArMDIwMCAgTWF0aGlldSBEdXBvbmNoZWxsZSA8bWF0aGlldS5kdXBvbmNoZWxsZUBlcGl0ZWNoLmV1PgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogY2hlY2sgbGFzdCBlbmRfdGltZSBhZnRlciBjb252ZXJzaW9uIHRvIHJ1bm5pbmcgc2VnbWVudAorCSAgVGhlIGxhc3QgZW5kX3RpbWUgd2FzIHNhdmVkIGFmdGVyIGNvbnZlcnNpb24sIHNvIHRoZSBjb21wYXJpc29uCisJICBoYWQgdG8gYmUgbWFkZSBhZnRlciBjb252ZXJzaW9uIGZvciBpdCB0byBtYWtlIHNlbnNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMTM4NQorCisyMDEzLTA2LTExIDE5OjIyOjIwICswMjAwICBNYXRoaWV1IER1cG9uY2hlbGxlIDxtYXRoaWV1LmR1cG9uY2hlbGxlQGVwaXRlY2guZXU+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBhZGQgbWl4LT5zZWdtZW50LnN0YXJ0IHRvIG91dHB1dF9lbmRfdGltZQorCSAgV2hlbiB0aGUgc2VnbWVudCBzdGFydCBpcyBub3QgMCwgdGhpcyBjcmVhdGVkIGEgc2l0dWF0aW9uIHdoZXJlCisJICB0aGUgb3V0cHV0X2VuZF90aW1lIGlzIGluZmVyaW9yIHRvIG91dHB1dF9zdGFydF90aW1lLCBhbmQgdGhlIGR1cmF0aW9uCisJICBvZiB0aGUgbmV4dCBidWZmZXIgZW5kZWQgdXAgdW5kZXJmbG93aW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMTM4NQorCisyMDEzLTA2LTExIDEzOjU0OjUzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogU2VuZCBzdHJlYW0gaGVhZGVycyBhZnRlciB0aGUgc2VnbWVudCBldmVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDc5OQorCisyMDEzLTA2LTExIDEyOjI2OjI0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRG8gYWxsb2NhdGlvbiBxdWVyeSBhZnRlciBleHBvc2luZyBhbGwgcGFkcyBhbmQgbm8tbW9yZS1wYWRzCisJICBBbHNvIGNvbmZpZ3VyZSB2aWRlbyBzdHJlYW1zIGFzIGVhcmx5IGFzIHBvc3NpYmxlLgorCSAgUmVsYXRlZCBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAxODU2CisJICBidXQgbm90IGZpeGluZyB0aGF0LgorCisyMDEzLTA2LTExIDEyOjI1OjQ2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBEb24ndCBmb3J3YXJkIENBUFMgZXZlbnRzIGZyb20gdXBzdHJlYW0KKwkgIEp1c3QgdXNlIHRoZSBkZWZhdWx0IHBhZCBldmVudCBoYW5kbGVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMTk3NgorCisyMDEzLTA1LTI2IDA4OjE4OjA0ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBDYWNoZSB0aGUgZ2V0Y2Fwcy9hY2NlcHRjYXBzIHByb2JlIHN0cmVhbQorCSAgZ2V0Y2FwcyBpcyBjYWxsZWQgZnJlcXVlbnRseSBkdXJpbmcgc3RyZWFtIHNldHVwLCBhbmQgY3JlYXRpbmcgYSBuZXcKKwkgIHN0cmVhbSBlYWNoIHRpbWUgaXMgdmVyeSBpbmVmZmljaWVudC4gVGhlcmUncyBzb21lIG1vcmUgcm9vbSBmb3IKKwkgIG9wdGltaXNhdGlvbiBieSBjYWNoaW5nIHRoZSBxdWVyaWVkIHNpbmsgZm9ybWF0cyBhcyB3ZWxsLCBidXQgdGhpcyBuZWVkcworCSAgc29tZSBtb3JlIGNoYW5nZXMgdG8gbGlzdGVuIGZvciBmb3JtYXQgY2hhbmdlcyBvbiB0aGUgc2luayAoZm9yIHdoZW4KKwkgIHN1cHBvcnRlZCBmb3JtYXRzIGNoYW5nZSBiZXR3ZWVuIHByb2JlIHN0cmVhbSBjcmVhdGlvbiBhbmQgc2luaworCSAgcXVlcnlpbmcpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NjQ1OQorCisyMDEzLTA1LTIzIDIxOjM5OjA4ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5oOgorCSAgcHVsc2VzaW5rOiBBZGQgYSBnZXRjYXBzIGZ1bmN0aW9uCisJICBUaGlzIGFsbG93cyB1cyB0byBoYXZlIG1vcmUgZmluZS10dW5lZCBjYXBzIGluIFJFQURZIG9yIGFib3ZlLiBIb3dldmVyLAorCSAgdGhpcyBpcyBfcmVhbGx5XyBpbmVmZmljaWVudCBzaW5jZSB3ZSBjcmVhdGUgYSBuZXcgc3RyZWFtIGFuZCBxdWVyeSBzaW5rCisJICBmb3IgZXZlcnkgZ2V0Y2FwcyBpbiBSRUFEWSwgd2hpY2ggb24gYSBzaW1wbGUgZ3N0LWxhdW5jaCBsaW5lIGhhcHBlbnMKKwkgIGFib3V0IDM1IHRpbWVzLiBUaGUgbmV4dCBzdGVwIGlzIHRvIGNhY2hlIGdldGNhcHMgcmVzdWx0cy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODY0NTkKKworMjAxMy0wNS0xMCAxMTozMjo0NCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogVGFrZSBhIGxvY2sgb24gdGhlIHJpbmdidWZmZXIgaW4gYWNjZXB0Y2FwcworCSAgVGhpcyBpcyBuZWVkZWQgYXMgYSBjb25jdXJyZW50IHN0YXRlIGNoYW5nZSBjb3VsZCBwdWxsIHRoZSBjb250ZXh0IG9yCisJICBzdHJlYW0gb3V0IGZyb20gdW5kZXIgb3VyIGZlZXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg2NDU5CisKKzIwMTMtMDYtMDkgMjA6Mjk6MDkgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuaDoKKwkgIGF1ZGlvcGFub3JhbWE6IG1vdmUgdGhlIGVudW0gdG8gdGhlIGhlYWRlciBhbmQgdXNlIGluc3RlYWQgb2YgZ2ludAorCSAgTW92ZSB0aGUgZW51bSBmb3IgdGhlIHByb2Nlc3NpbmcgbWV0aG9kIHRvIHRoZSBoZWFkZXIgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZQorCSAgdHlwZSBmb3IgdGhlIGluc3RhbmNlIHN0cnVjdC4KKworMjAxMy0wNi0wOSAyMDozMjoyMiArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkgIGxldmVsOiByZXdvcmsgdGhlIHRlc3RzIHRvIGNvdmVyIG90aGVyIGZvcm1hdHMgdG9vCisKKzIwMTMtMDYtMDUgMTY6MzI6MzAgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMjogbWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIG5vdCBkZWxldGVkIGJlZm9yZSB0aGUgcG9vbAorCSAgVGhlIHBvb2wgYWNjZXNzZXMgZGF0YSBmcm9tIHRoZSB2NGwyb2JqZWN0IHNvIGl0IG11c3QgZXhpc3QgYXQgbGVhc3QKKwkgIGFzIGxvbmcgYXMgdGhlIHBvb2wuIFJlZmNvdW50IHRoZSBlbGVtZW50IHdoaWNoIGNvbnRyb2xzIHRoZSBvYmplY3QKKwkgIGxpdmUtdGltZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDE2NTAKKworMjAxMy0wNi0wNyAxNTozODoyNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9saWJwbmcvTWFrZWZpbGUuYW06CisJICBwbmc6IExpbmsgd2l0aCBsaWJnc3RiYXNlIGZvciBHc3RCeXRlUmVhZGVyIGFuZCBHc3RBZGFwdGVyCisKKzIwMTMtMDYtMDcgMTU6MTU6MTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2ZW5jL01ha2VmaWxlLmFtOgorCSAgd2F2ZW5jOiBMaW5rIHdpdGggbGliZ3N0YmFzZSBmb3IgR3N0Qnl0ZVdyaXRlcgorCisyMDEzLTA2LTA3IDEzOjI2OjM1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogUHVzaCBzdHJlYW0tc3RhcnQgZXZlbnQgaW4gcHVsbCBtb2RlIGJlZm9yZSBhbnl0aGluZyBlbHNlCisKKzIwMTMtMDUtMTAgMTI6MDk6MTkgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJICBwdWxzZXNpbms6IEdldCByaWQgb2YgYWNjZXB0Y2FwcyBzaWRlLWVmZmVjdHMKKwkgIFRoZSBzaW5rIGluZm8gY2FsbGJhY2sgc2hvdWxkIG5vdCBoYXZlIHNpZGUtZWZmZWN0cyBvbiB0aGUgR3N0UHVsc2VTaW5rCisJICBvYmplY3Qgc2luY2Ugd2UgYXJlIHNvbWV0aW1lcyB1c2luZyB3aXRoIGEgZHVtbXkgc3RyZWFtIGluIGFjY2VwdGNhcHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg2NDU5CisKKzIwMTMtMDYtMDUgMTg6MzY6NDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDEuMS4xID09PQorCisyMDEzLTA2LTA1IDE3OjU4OjUxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb21tb246CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFsczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0Lmg6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLWRpc3QuaDoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kb3JjLWRpc3QuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kb3JjLWRpc3QuaDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMS4xLjEKKworMjAxMy0wNi0wNSAxNjozNToxOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDEzLTA2LTA1IDE1OjUwOjA0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkgIHdhdmVuYzogRml4IHRhZ2xpc3QgcmVmIGhhbmRsaW5nIHRoYXQgbWFkZSB0aGUgdW5pdCB0ZXN0IGZhaWwKKworMjAxMy0wNi0wNSAxNToxNDo1NCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMDk4YzBkNyB0byAwMWE3YTQ2CisKKzIwMTMtMDYtMDMgMDk6MTc6NDMgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBpdGVyYXRlIGNvbnRyb2xzIHdpdGggVjRMMl9DVFJMX0ZMQUdfTkVYVF9DVFJMIGlmIHBvc3NpYmxlCisJICBJbiB2Mi42LjE4IGNvbnRyb2wgY2xhc3NlcyB3aGVyZSBhZGRlZCB0byB0aGUgdjRsMiBBUEkuCisJICBJdGVyYXRpbmcgb3ZlciBDSURzIHN0YXJ0aW5nIHdpdGggVjRMMl9DSURfQkFTRSB3aWxsIG9ubHkgZmluZCBjb250cm9scyBmb3IKKwkgIHRoZSBmaXJzdCBjb250cm9sIGNsYXNzLgorCSAgQnkgaXRlcmF0aW5nIHdpdGggVjRMMl9DVFJMX0ZMQUdfTkVYVF9DVFJMIGFsbCBjb250cm9scyBhcmUgZm91bmQuCisJICBUaGlzIGlzIG5lY2Vzc2FyeSB0byBtYWtlIGNvbnRyb2xzIGZyb20gb3RoZXIgY29udHJvbCBjbGFzc2VzIGF2YWlsYWJsZSBpbgorCSAgdGhlIGV4dHJhLWNvbnRyb2xzIHByb3BlcnR5LgorCSAgSWYgVjRMMl9DVFJMX0ZMQUdfTkVYVF9DVFJMIGlzIG5vdCBkZWZpbmVkIGF0IGNvbXBpbGUgdGltZSBvciBub3Qgc3VwcG9ydGVkCisJICBhdCBydW50aW1lIHRoZW4gdGhlIG9sZCBtZWNoYW5pc20gZm9yIGl0ZXJhdGluZyBpcyB1c2VkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMTU0MAorCisyMDEzLTA2LTA1IDEyOjEyOjUzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuYzoKKwkgIHVkcHNpbms6IGF2b2lkIGxlYWtpbmcgdGhlIGhvc3QKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDE1ODYKKworMjAxMy0wNi0wNCAwODoyNjozMyArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIHY0bDI6IGltcHJvdmUgcGl4ZWwgYXNwZWN0IHJhdGlvIGhhbmRsaW5nCisJICBJbnN0ZWFkIG9mIGp1c3QgYXNzdW1pbmcgYSBhc3BlY3QgcmF0aW8gb2YgMS8xIHVzZSBWSURJT0NfQ1JPUENBUCB0byBhc2sKKwkgIHRoZSBkZXZpY2UuCisJICBUaGlzIGFsc28gYWRkIGEgcGl4ZWwtYXNwZWN0LXJhdGlvIHByb3BlcnR5IHRvIG92ZXJ3cml0ZSB0aGUgdmFsdWUgZnJvbSB0aGUKKwkgIGRyaXZlciBhbmQgYSBmb3JjZS1hc3BlY3QtcmF0aW8gcHJvcGVydHkgdG8gaWdub3JlIGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDI4NQorCisyMDEzLTA2LTA0IDE3OjA0OjExICswMjAwICBTdGlybGluZyBXZXN0cnVwIDxzd2VzdHJ1cEBnbWFpbC5jb20+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDI6IEZpeCBjb21waWxhdGlvbiB3aXRoIG9sZGVyIGtlcm5lbHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDE1OTUKKworMjAxMy0wNi0wMyAxNzowNzoxMCArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBjYWxsIFZJRElPQ19SRVFCVUZTIHdpdGggY291bnQgPSAwIGluIHBvb2xfZmluYWxpemUKKwkgIFdpdGhvdXQgdGhpcyB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIGZhaWxzOgorCSAgLSBzZXRfY2FwcygpCisJICAtIG9iamVjdF9zdG9wKCkgKGRvZXMgbm90aGluZykKKwkgIC0gc2V0X2Zvcm1hdCgpIC0+IFZJRElPQ19TX0ZNVAorCSAgLSBzZXRfY29uZmlnKCkgLT4gVklESU9DX1JFUUJVRlMgd2l0aCBjb3VudCA9IE4KKwkgIC0gc2V0X2NhcHMoKQorCSAgLSBvYmplY3Rfc3RvcCgpCisJICAtIHBvb2xfZmluYWxpemUoKQorCSAgLSBzZXRfZm9ybWF0KCkgLT4gVklESU9DX1NfRk1UID0+IEVCVVNZCisJICBVc3VhbGx5IHRoZSBwb29sIGlzIHN0YXJ0ZWQgYWZ0ZXIgc2V0X2NvbmZpZygpLCBpbiB3aGljaCBjYXNlIG9iamVjdF9zdG9wKCkKKwkgIHdpbGwgcmVzdWx0IGluIGEgcG9vbF9zdG9wIGFuZCB0aGVyZWZvcmUgVklESU9DX1JFUUJVRlMgd2l0aCBjb3VudCA9IDAgYnV0CisJICB0aGF0IGlzIG5vdCBndWFyYW50ZWVkLgorCSAgQWxzbyBjYWxsaW5nIFZJRElPQ19SRVFCVUZTIHdpdGggY291bnQgPSAwIGluIHBvb2xfZmluYWxpemUoKSBpZiBuZWNlc3NhcnkKKwkgIGZpeGVzIHRoaXMgcHJvYmxlbS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDE1NDMKKworMjAxMy0wNS0yOCAxOToxNDoxNSArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiByZXdvcmsgc2luayBidWZmZXIgcmVmY291bnRpbmcKKwkgIFRoaXMgaXMgYSBmb2xsb3d1cCBwYXRjaCBmb3IgIzcwMDc4MSwgd2hpY2ggaXMgbm90IHF1aXRlIGNvcnJlY3QuCisJICBUaGUgYnVmZmVyIGhhbmRsaW5nIGlzIHF1aXRlIGNvbXBsaWNhdGVkIGhlcmUuCisJICBUaGUgb3JpZ2luYWwgY29kZSBpbnRlbmRlZCB0byB0aGUgdGhlIGZvbGxvd2luZzoKKwkgIC0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcHJvY2VzcygpIGNhbGxzIFFCVUYgYW5kIGFkZHMgdGhlIGJ1ZmZlciB0byB0aGUKKwkgIGxvY2FsIGxpc3QuCisJICAtIFRoZSBzaW5rIGNhbGxzIGdzdF9idWZmZXJfdW5yZWYoKSB3aGljaCByZXR1cm5zIHRoZSBidWZmZXIgdG8gdGhlIHBvb2wKKwkgIGJ1dCBub3QgdGhlICdmcmVlIGxpc3QnLgorCSAgLSBTb21lIHRpbWUgbGF0ZXIgRFFCVUYgcmV0dXJucyB0aGUgYnVmZmVyIGFuZAorCSAgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcmVsZWFzZV9idWZmZXIoKSBwdXRzIGluIG9uIHRoZSAnZnJlZSBsaXN0Jy4KKwkgIElmIHRoZSBidWZmZXIgbXVzdCBiZSBjb3BpZWQgdGhlbiAocGFyZW50X2NsYXNzKS0+YWNxdWlyZV9idWZmZXIoKSBpcworCSAgY2FsbGVkIGRpcmVjdGx5IHRvIGtlZXAgdGhlIGJ1ZmZlciBpbiB0aGUgcG9vbC4KKwkgIFRoaXMgaGFzIHR3byBwcm9ibGVtczoKKwkgIDEuIElmIGdzdF92NGwyX2J1ZmZlcl9wb29sX3JlbGVhc2VfYnVmZmVyKCkgaXMgY2FsbGVkIGJlZm9yZSB0aGUgYnVmZmVyIGlzCisJICByZXR1cm5lZCB0byB0aGUgcG9vbCwgdGhlbiB0aGUgYnVmZmVyIGlzIHB1dCBvbiB0aGUgJ2ZyZWUgbGlzdCcgdHdpY2UuCisJICBUaGlzIGNhbiBoYXBwZW4gaWYgYSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBpcyBrZXB0IG91dHNpZGUgdGhlIHNpbmssCisJICBvZiBpZiBEUUJVRiByZXR1cm5zIHRoZSBidWZmZXIsIHRoYXQgd2FzIGp1c3QgcXVldWVkIHdpdGggUUJVRi4KKwkgIDIuIElmIGJ1ZmZlcnMgYXJlIGNvcGllZCwgdGhlbiBhbGwgYnVmZmVycyBhcmUgaW4gdGhlIHBvb2wgYXQgYWxsIHRpbWVzLiBBcworCSAgYSByZXN1bHQgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfc3RvcCgpIGFuZCBnc3RfdjRsMl9idWZmZXJfcG9vbF9kcWJ1ZigpCisJICBjYW4gYWNjZXNzIHBvb2wtPmJ1ZmZlcnMgYXQgdGhlIHNhbWUgdGltZSwgd2hpY2ggY2FuIGxlYWQgdG8gbWVtb3J5CisJICBjb3JydXB0aW9uLgorCSAgVGhlIHBhdGNoIGZvciAjNzAwNzgxIGZpeGVzIHRob3NlIHByb2JsZW1zLCBidXQgd2l0aCB0aGUgc2lkZSBlZmZlY3QgdGhhdAorCSAgdGhlcmUgYXJlIGFsd2F5cyBidWZmZXJzIG91dHNpZGUgdGhlIHBvb2wgKGJlY2F1c2UgdGhleSBhcmUgcXVldWVkKSBhbmQKKwkgIHRoZSBwb29sIGlzIG5ldmVyIHN0b3BwZWQuCisJICBUaGlzIHBhdGNoIGZpeGVzIHRoaXMgYnkgcmVsZWFzaW5nIHRoZSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBhZnRlcgorCSAgaGFuZGxpbmcgaXQgKHRvIGF2b2lkIHByb2JsZW0gMi4pIHNvIGl0IGNhbiBiZSByZXR1cm5lZCB0byB0aGUgcG9vbC4KKwkgIGdzdF92NGwyX2J1ZmZlcl9wb29sX3JlbGVhc2VfYnVmZmVyKCkgaXMgb25seSBjYWxsZWQgaWYgdGhlIGJ1ZmZlciBpcworCSAgYWxyZWFkeSBpbiB0aGUgcG9vbCAodG8gYXZvaWQgcHJvYmxlbSAxLikuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAxMzc1CisKKzIwMTMtMDYtMDIgMTU6MjQ6MzggLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBtYWtlIHN1cmUgdGFnbGlzdCBpcyB3cml0YWJsZSBiZWZvcmUgYWRkaW5nIHRhZ3MKKwkgIEF2b2lkcyBhc3NlcnRpb25zCisKKzIwMTMtMDUtMzAgMTk6MjQ6MTMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBlZmZlY3RpdmVseSBza2lwIHRyYWNrcyB0aGF0IHdlcmVuJ3QgbGlzdGVkIG9uIHRoZSAxc3QgbW9vdgorCSAgV2l0aG91dCB0aGlzLCBzdHJlYW0gaXMgTlVMTCBhbmQgdGhlIGNvZGUgd2lsbCB0cnkgdG8gYWNjZXNzIGl0LCBsZWFkaW5nCisJICB0byBzZWdmYXVsdHMuCisKKzIwMTMtMDUtMzAgMTk6MjM6NTAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBza2lwIHJlZHVuZGFudCBjaGVjaworCSAgIWdvdF9tb292IGlzIGFscmVhZHkgY2hlY2tlZCB0aGUgbGluZSBhYm92ZQorCisyMDEzLTA2LTAyIDEzOjAzOjQwICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgdGVzdHM6IGNsZWFudXAgbGV2ZWwgdGVzdHMKKwkgIFNwbGl0IG91dCBhIGZldyBtb3JlIHRlc3RzIHRvIGF2b2lkIGNoZWNraW5nIHRoZSBzYW1lIHN0dWZmIG92ZXIgYW5kIG92ZXIgYWdhaW4uCisKKzIwMTMtMDYtMDEgMjE6MzM6NDYgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5oOgorCSAgbGV2ZWw6IHJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIGluIGluc3RhbmNlIHN0cnVjdAorCisyMDEzLTA1LTMxIDE4OjEzOjAyICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgbGV2ZWw6IGFkZCBhIHRlc3QgZm9yIGNvbnRpbm91cyB0aW1lc3RhbXBzCisJICBBIHRlc3QgdGhhdCBjaGVja3MgdGhhdCBtc2dbbl0udHMgKyBtc2dbbl0uZHVyID09IG1zZ1tuKzFdLnRzLgorCisyMDEzLTA0LTEyIDE2OjAyOjQ0ICswMzAwICBBbnRvbiBCZWxrYSA8YW50b25iZWxrYUBnbWFpbC5jb20+CisKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5oOgorCSAgd2F2ZW5jOiBhZGQgdGFncyAmIHRvYyBzdXBwb3J0CisJICBXcml0ZSB0YWdzIGFzIExJU1QgSU5GTyBjaHVuay4gRm9ybWF0IHRoZSB0b2MgYXMgY3VlICsgTElTVCBhZHRsIGNodW5rLiBSZW1vdmUKKwkgIG9sZCAjaWZkZWYnZWQgY29kZS4KKworMjAxMy0wNS0zMSAxNToxMjowOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBSZXZlcnQgInJ0cGgyNjRwYXk6IFJlc3RydWN0dXJpbmcgdG8gYWxsb3cgZm9yIGFkZGluZyBvcHRpb25hbCBjYXBzIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCA2MTY2Njg5OGNmZTg5YTFiMjFkM2U2ODUwYWI0NGY1YjE2MzNlZDc5LgorCSAgVGhpcyBjb21taXQgY2hhbmdlcyB3aGF0IHRoZSBzZXRfc3BzX3BwcygpIGZ1bmN0aW9uIGRvZXMsIG5vdCBpdCBkb2Vzbid0CisJICBzZXQgY2FwcyBhbnltb3JlIChhbmQgc2hvdWxkIGhhdmUgYmVlbiByZW5hbWVkKS4gVGhlIG1haW4gcHJvYmxlbSBpcyB0aGF0CisJICBub3QgYWxsIGNhbGwgc2l0ZXMgYXJlIHVwZGF0ZWQgYW5kIHRodXMgbGVhayB0aGUgc3RyaW5nLgorCisyMDEzLTA1LTMxIDE1OjExOjEyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIFJldmVydCAicnRwaDI2NHBheS9kZXBheTogQWRkIGZyYW1lIGRpbWVuc2lvbnMgYSBwYXlsb2FkZWQgY2FwcyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgM2RjYTc1NmE1ZGJhNTUyNjYyNTZmMjM5ZTNlMTJhM2QwNThlMTg1YS4KKwkgIFRoZSBIMjY0IFJUUCBzcGVjIGhhcyBubyBhdHRyaWJ1dGVzIGZvciB3aWR0aCBhbmQgaGVpZ2h0LgorCisyMDEzLTA1LTMxIDE1OjA5OjUxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgUmV2ZXJ0ICJydHBoMjY0cGF5L2RlcGF5OiBBZGQgb3B0aW9uYWwgZnJhbWVyYXRlIGNhcHMgZm9yIHVzZSBpbiBTRFAiCisJICBUaGlzIHJldmVydHMgY29tbWl0IGQ4ODI1ZTJhNWMwYmZiODgzZmY4OGUyYzlkYTQ5OWM4MDBlYmNhMGEuCisJICBUaGVyZSBpcyBubyBmcmFtZXJhdGUgYXR0cmlidXRlIGluIHRoZSBoMjY0IFJUUCBzcGVjLgorCisyMDEzLTA1LTMxIDE1OjA4OjE2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBSZXZlcnQgInJ0cGpwZWdwYXkvZGVwYXk6IFJlcGxhY2UgZnJhbWVzaXplIGNhcHMgd2l0aCB3aWR0aC9oZWlnaHQiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDAwNzVkMTExYjQ3NWNhMjc4OTVlZTk0NzYxNTQyNjBiNjkwMjk0MGIuCisJICBFeHRyYSBhcHBsaWNhdGlvbi94LXJ0cCBhcmUgU0RQIGZpZWxkcywgd2hpY2ggYXJlIHN0cmluZ3MuCisKKzIwMTMtMDUtMzEgMTU6MDU6NTEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJICBSZXZlcnQgInJ0cGpwZWdwYXkvZGVwYXk6IFJlcGxhY2UgZnJhbWVyYXRlIGNhcHMgZmllbGQgd2l0aCBmcmFjdGlvbiIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgOWZkMjVhODEwYjg1OWUwZWMyMDUxNzY1Nzg3MzUxMDBkODNkZTRhZi4KKwkgIFdlIGRlYWwgd2l0aCBzZHAgYXR0cmlidXRlcyBpbiBhcHBsaWNhdGlvbi9zZHAsIHdoaWNoIGFyZSBhbHdheXMgc3RyaW5ncy4KKworMjAxMy0wNS0zMSAxMjozMzoyMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYWRkIGV4dHJhIFRMUyB1cmwgcHJvdG9jb2xzCisJICBXZSBhbHNvIHN1cHBvcnQgVExTIHByb3RvY29scyBub3cuCisKKzIwMTMtMDUtMzAgMTQ6NDg6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IEFkZCBGSVhNRSBjb21tZW50IGFib3V0IHRoZSBEVVJBVElPTiBxdWVyeSBmcm9tIGFkZGVyCisJICBDdXJyZW50bHkgdGhlIGNvZGUganVzdCB0YWtlcyB3aXRoIG1heGltdW0gdXBzdHJlYW0gZHVyYXRpb24sIHdoaWNoCisJICBpcyB3cm9uZy4gSXQgc2hvdWxkIGJlIHRoZSBtYXhpbXVtIHVwc3RyZWFtIGR1cmF0aW9uIGluIHJ1bm5pbmcgdGltZS4KKworMjAxMy0wNS0zMCAyMToyMDo1OSArMDIwMCAgTWF0aGlldSBEdXBvbmNoZWxsZSA8bWF0aGlldS5kdXBvbmNoZWxsZUBlcGl0ZWNoLmV1PgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogU2V0IGEgcmVmZXJlbmNlIHRvIG1peC0+Y3VycmVudF9jYXBzIGFzIHRoZSBRVUVSWV9DQVBTIHJlc3VsdC4KKworMjAxMy0wNS0zMCAxNzozNzoxMyArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICBsZXZlbDogbWlzYyBjbGVhbnVwcworCSAgRml4IHNvbWUgb3VkYXRlZCBjb21tZW50cy4gU29ydCBvdXQgc29tZSBjb25mdXNpb24gb2YgaW50ZXJ2YWxfZnJhbWVzIGFuZCBudW1fZnJhbWVzLgorCisyMDEzLTA1LTI5IDIwOjM1OjQxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgdjRsMjogT25seSBjb25kaXRpb25hbGx5IHVzZSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSX01FTlUsIGl0J3Mgbm90IGF2YWlsYWJsZSBpbiBvbGRlciB2ZXJzaW9ucworCisyMDEzLTA1LTIwIDE2OjQ1OjM3ICswMjAwICBNaWNoYWVsIE9sYnJpY2ggPG0ub2xicmljaEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5oOgorCSAgdjRsMjogYWRkIGEgcHJvcGVydHkgZm9yIGFyYml0cmFyeSB2NGwyIGNvbnRyb2xzCisJICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHNldCBhbnkgY29udHJvbHMgdGhhdCBjYW4gYmUgc2V0IHdpdGgKKwkgIFZJRElPQ19TX0NUUkwuCisJICBUaGUgY29udHJvbHMgYXJlIHNldCB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBzZXQgKGlmIHRoZSBkZXZpY2UgaXMgb3BlbikKKwkgIGFuZCB3aGVuIHRoZSBkZXZpY2UgaXMgb3BlbmVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5ODgzNworCisyMDEzLTA1LTI4IDE4OjMxOjA3ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGxldmVsOiBmaXggZGlzY29udGludWl0aWVzIGluIHRpbWVzdGFtcHMKKworMjAxMy0wNS0yOCAxNTo0Njo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka2FuaW1hdGlvbi5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmZGVjLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZkZWMuaDoKKwkgIGdka3BpeGJ1ZmRlYzogS2VlcCBzZXJpYWxpemVkIGV2ZW50cyBpbiBvcmRlciwgYW5kIGRvbid0IHNlbmQgU0VHTUVOVCBiZWZvcmUgQ0FQUworCisyMDEzLTA1LTI4IDE1OjQ1OjQ5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBjcmVhdGUgYW5kIHB1c2ggc3RyZWFtLXN0YXJ0IGluIFRDUCBtb2RlCisKKzIwMTMtMDUtMjggMTU6MTA6MDcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHJlbW92ZSBzb21lIG9ic29sZXRlIGNvZGUKKwkgIEl0IGlzIG5vdCBuZWVkZWQgdG8gZG8gYSBzdGF0ZSBjaGFuZ2UgZnJvbSB0aGUgX3BsYXkoKSBmdW5jdGlvbiBvbgorCSAgb3Vyc2VsdmVzLiBUaGUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uIGFscmVhZHkgZGlkIHRoYXQgYW5kIHdlIGRvbid0IHdhbnQgdG8KKwkgIGludGVyZmVyZSB3aXRoIHRoYXQgKG9yIHVzZSBoYWNrcyB0byBhdm9pZCBpbnRlcmZlcmVuY2UpLgorCisyMDEzLTA1LTI4IDEyOjI0OjM3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBzZXQgUlRDUCBjYXBzIG9uIHRoZSBSVENQIHBhZHMKKworMjAxMy0wNS0yOCAxMjoyMzozNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogc2VuZCBzdHJlYW0tc3RhcnQgYW5kIHNlZ21lbnQgZXZlbnRzCisJICBBbHNvIHNlbmQgc3RyZWFtLXN0YXJ0IGFuZCBzZWdtZW50IGV2ZW50IG9uIHRoZSBSVENQIHBhZC4KKwkgIFdlIGRvbid0IG5lZWQgdG8gc2VuZCBhbnl0aGluZyBvbiB0aGUgc3luY19zcmMgcGFkIGJlY2F1c2Ugd2UKKwkgIGFscmVhZHkgZm9yd2FyZGVkIGFsbCBpbmNvbW1pbmcgZXZlbnRzLgorCisyMDEzLTA0LTI1IDE1OjI1OjA2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBhZGQgc2lnbmFsIHRvIGhhbmRsZSBzZXJ2ZXIgcmVxdWVzdHMKKwkgIEFkZCBhIHNpZ25hbCB0byBiZSBub3RpZmllZCBvZiBhIHNlcnZlciByZXF1ZXN0LiBUaGUgc2lnbmFsIGhhbmRsZXIgY2FuIHRoZW4KKwkgIGNvbnN0cnVjdCB0aGUgcmVzcG9uc2UgbWVzc2FnZSBmb3IgdGhlIHNlcnZlci4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjMyMjA3CisKKzIwMTMtMDUtMjcgMjI6NDM6MjUgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogTWFpbnRhaW4gei1vcmRlciB3aGVuIG5ldyBwYWQgYXJlIGFkZGVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAxMTA5CisKKzIwMTMtMDMtMDYgMTM6MTc6NTQgKzAwMDAgIFRvbSBHcmVlbndvb2QgPHRjZGdyZWVud29vZEBob3RtYWlsLmNvbT4KKworCSogZXh0L3ZweC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmg6CisJICB2cDhlbmM6IEFkZCBwcm9wZXJ0eSB0byBtYW51YWxseSBzcGVjaWZ5IHRoZSB0aW1lYmFzZSBvZiB0aGUgZW5jb2RlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTcwOQorCisyMDEzLTA1LTI1IDEyOjE3OjQwIC0wNDAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBBbHdheXMgaGFuZGxlIGZsdXNoX3N0b3BfcGVuZGluZyBhdG9taWNhbGx5CisJICBJdCBpcyBub3QgcHJvdGVjdGVkIHdpdGggdGhlIENPTExFQ1RfUEFEU19TVFJFQU1fTE9DSyBhbnltb3JlCisKKzIwMTMtMDUtMjMgMTg6MTQ6MTcgLTA0MDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb21peGVyLmM6CisJICB0ZXN0czogdmlkZW9taXhlcjogQWRkIGEgdGVzdHN1aXRlIGZvciB2aWRlb21peGVyCisJICBUaGlzIGlzIG1vc3RseSBjb3B5IHBhc3RlZCBmcm9tIC1iYXNlL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2FkZGVyLmMKKworMjAxMy0wNS0yNSAxMDo1NzowMiAtMDQwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogRG8gbm90IHRha2UgQ09MTEVDVF9QQURTX1NUUkVBTV9MT0NLIHdoZW4gdW5uZWNlc3NhcnkKKwkgIENvbGxlY3RwYWQgdGFrZXMgdGhlIGxvY2sgaXRzZWxmIHdoZW4gcmVjZWl2aW5nIHNlcmlhbGl6ZWQgZXZlbnRzCisJICBhbmQgd2Ugc2hvdWxkIG5vdCB0YWtlIGl0IGZvciBub3Qgc2VyaWFsaXplZCBvbmVzCisKKzIwMTMtMDUtMjQgMTk6MzQ6MDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L2ZseC9nc3RmbHhkZWMuYzoKKwkgIGZseGRlYzogUHJvcGVybHkgc2tpcCBub24tZnJhbWUgY2h1bmtzCisKKzIwMTMtMDUtMjQgMTk6MzE6MTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L2ZseC9nc3RmbHhkZWMuYzoKKwkgIGZseGRlYzogRmx1c2ggZGF0YSBmcm9tIGFkYXB0ZXIgYWZ0ZXIgcmVhZGluZyBpdAorCSAgT3RoZXJ3aXNlIHdlJ3JlIGdvaW5nIGluIGFuIGluZmluaXRlIGxvb3AsIHJlYWRpbmcgdGhlIHNhbWUgZGF0YQorCSAgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4KKworMjAxMy0wNC0yNCAxNTozOTo1NCArMDAwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogZ3N0L2dvb20yazEvTWFrZWZpbGUuYW06CisJICBnb29tMmsxOiBmaXggbW9yZSBkdXBsaWNhdGVkIHN5bWJvbHMKKworMjAxMy0wNS0yMiAwMjo0MDo1MiArMDIwMCAgU2ViYXN0aWFuIFJhc211c3NlbiA8c2Vicm5AYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJICBydHBqcGVncGF5L2RlcGF5OiBSZXBsYWNlIGZyYW1lcmF0ZSBjYXBzIGZpZWxkIHdpdGggZnJhY3Rpb24KKwkgIFRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBoYWQgdGhlIGZvcm1hdHRpbmcgb2YgU0RQIGF0dHJpYnV0ZXMgaGFwcGVuCisJICBpbiBlYWNoIFJUUCBwYXlsb2FkZXIsIG5vdyBpbnN0ZWFkIHRoZSBjb25zdGl0dWVudCB2YWx1ZXMgYXJlIHByb3BhZ2F0ZWQKKwkgIGFzIGNhcHMgZmllbGRzLiBUaGlzIGFsbG93cyBmb3IgYXBwbGljYXRpb25zIHRvIGRvIFNEUCBvZmZlci9hbnN3ZXIKKwkgIGJhc2VkIG9uIGNhcHMgbmVnb3RpYXRpb24uCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwNzQ4CisKKzIwMTMtMDUtMjIgMDE6NTg6NTcgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJuQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBydHBqcGVncGF5L2RlcGF5OiBSZXBsYWNlIGZyYW1lc2l6ZSBjYXBzIHdpdGggd2lkdGgvaGVpZ2h0CisJICBUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gaGFkIHRoZSBmb3JtYXR0aW5nIG9mIFNEUCBhdHRyaWJ1dGVzIGhhcHBlbgorCSAgaW4gZWFjaCBSVFAgcGF5bG9hZGVyLCBub3cgaW5zdGVhZCB0aGUgY29uc3RpdHVlbnQgdmFsdWVzIGFyZSBwcm9wYWdhdGVkCisJICBhcyBjYXBzIGZpZWxkcy4gVGhpcyBhbGxvd3MgZm9yIGFwcGxpY2F0aW9ucyB0byBkbyBTRFAgb2ZmZXIvYW5zd2VyCisJICBiYXNlZCBvbiBjYXBzIG5lZ290aWF0aW9uLgorCSAgS2VlcCBwYXJzaW5nIGEtZnJhbWVyYXRlLCB4LWZyYW1lcmF0ZSBhbmQgeC1kaW1lbnNpb25zIGluIHJ0cGpwZWdkZXBheQorCSAgdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyBwYXlsb2FkZXJzLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDc0OAorCisyMDEzLTA1LTIyIDAzOjE4OjA3ICswMjAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJybkBheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXkvZGVwYXk6IEFkZCBvcHRpb25hbCBmcmFtZXJhdGUgY2FwcyBmb3IgdXNlIGluIFNEUAorCSAgVGhpcyBhbGxvd3MgZm9yIGFwcGxpY2F0aW9ucyB0byBmb3JtYXQgU0RQIGF0dHJpYnV0ZXMgYW5kIHN0aWxsIGRvIFNEUAorCSAgb2ZmZXIvYW5zd2VyIGJhc2VkIG9uIGNhcHMgbmVnb3RpYXRpb24uCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwNzQ5CisKKzIwMTMtMDUtMjIgMDM6MDk6NDQgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJuQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHJ0cGgyNjRwYXkvZGVwYXk6IEFkZCBmcmFtZSBkaW1lbnNpb25zIGEgcGF5bG9hZGVkIGNhcHMKKwkgIFRoaXMgYWxsb3dzIGZvciBhcHBsaWNhdGlvbnMgdG8gZm9ybWF0IFNEUCBhdHRyaWJ1dGVzIGFuZCBzdGlsbCBkbyBTRFAKKwkgIG9mZmVyL2Fuc3dlciBiYXNlZCBvbiBjYXBzIG5lZ290aWF0aW9uLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDc0OQorCisyMDEzLTA1LTIwIDIyOjE0OjQ0ICswMjAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJybkBheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiBSZXN0cnVjdHVyaW5nIHRvIGFsbG93IGZvciBhZGRpbmcgb3B0aW9uYWwgY2FwcworCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDc0OQorCisyMDEzLTA1LTIzIDE4OjQyOjA5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmg6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkgIChkeW58bXVsdGkpdWRwc2luazogQWRkIHByb3BlcnRpZXMgdG8gc3BlY2lmeSB0aGUgYmluZCBhZGRyZXNzIGFuZCBwb3J0CisJICBCeSBkZWZhdWx0IHdlIHVzZSB0aGUgYW55IGFkZHJlc3NlcyBhbmQgYSByYW5kb20gcG9ydCBmb3IgYmluZGluZyB0aGUgc29ja2V0LgorCisyMDEzLTA1LTIzIDE4OjA1OjA3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIChkeW58bXVsdGkpdWRwc2luazogQmluZCBzb2NrZXQgYmVmb3JlIHVzaW5nIGl0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwODc4CisKKzIwMTMtMDUtMjMgMTc6MjU6MjkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIChtdWx0aSl1ZHBzaW5rOiBBZGQgbWlzc2luZyBnZXR0ZXJzIGZvciBzb2NrZXQtdjYgYW5kIHVzZWQtc29ja2V0LXY2IHByb3BlcnRpZXMKKworMjAxMy0wNS0yMiAyMTowMTo0OCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBEb24ndCBob2xkIHN0cmVhbS1sb2NrIHdoaWxlIHB1c2hpbmcgbm9uLXNlcmlhbGl6ZWQgZXZlbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwODY4CisKKzIwMTMtMDUtMjIgMjE6MDA6NDUgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogRG9uJ3QgaG9sZCBvYmplY3QgbG9jayB3aGlsZSBzZW5kaW5nIGV2ZW50cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDg2OAorCisyMDEzLTA1LTIyIDE3OjMyOjMzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IFRoZSByZXR1cm4gdmFsdWUgb2YgZ3N0X3BhZF9zZXRfY2FwcygpIGlzIG5vdCByZWxldmFudCBhbnltb3JlCisJICBDYXBzIGNhbiBmYWlsIHRvIGJlIHNldCBiZWNhdXNlIHRoZSBwYWQgaXMgbm90IGxpbmtlZCB5ZXQgZm9yIGV4YW1wbGUuCisKKzIwMTMtMDUtMTUgMTY6Mzk6MzYgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEFkZCBlcnJvciBpZiBmaWxlIGhhcyBwbGF5cmVhZHkgZHJtCisKKzIwMTMtMDUtMTggMTU6MDY6NDkgLTA0MDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IFNlbmQgYSByZWNvbmZpZ3VyZSBldmVudCB1cHN0cmVhbSBpZiBzaW5rcGFkIGNhcHMgYXJlIG5vdCB1c2FibGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODQyMzcKKworMjAxMy0wNS0yMSAxMjowMjo1MSArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBrZWVwIGEgcmVmZXJlbmNlIHRvIGFsbCBxdWV1ZWQgYnVmZmVycworCSAgV2l0aG91dCB0aGlzLCBhIHF1ZXVlZCBidWZmZXIgbWF5IGJlIHJlcXVpcmVkLCBmaWxsZWQgYW5kIHF1ZXVlZCBiZWZvcmUgaXQKKwkgIGlzIGRlcXVldWVkLgorCSAgQ2FsbGluZyBnc3RfYnVmZmVyX3Bvb2xfYWNxdWlyZV9idWZmZXIoKSBlbnN1cmVzIHRoYXQgdGhlIGJ1ZmZlciBpcyBzZXQgdXAKKwkgIGNvcnJlY3RseSBhbmQgZ3N0X2J1ZmZlcl91bnJlZigpIGNhbGxzIGJ1ZmZlcl9yZWxlYXNlKCkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwNzgxCisKKzIwMTMtMDUtMjEgMTM6MzM6NTkgKzAyMDAgIEFsZXhhbmRlciBTY2hyYWIgPGFsZXhhc0BheGlzLmNvbT4KKworCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzoKKwkgIG11bGF3ZGVjOiBIYW5kbGUgTlVMTCBidWZmZXJzIGluIGhhbmRsZV9mcmFtZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5ODg5NAorCisyMDEzLTA1LTIwIDIxOjQ0OjEzICswMjAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJybkBheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgcnRwanBlZ3BheS9kZXBheTogQWRkIGZyYW1lc2l6ZSBjYXBzIGZvciB1c2UgaW4gU0RQCisJICBUaGUgZm9ybWF0IG9mIHRoZSB2YWx1ZSBhZGhlcmVzIHRvIFJGQzYwNjQgYW5kIGl0IGlzIG1lYW50IHRvIGJlIHBhcnNlZAorCSAgYW5kIGluY2x1ZGVkIGluIHRoZSBTRFAgc2VudCBieSBnc3QtcnRzcC1zZXJ2ZXIgdG8gaXRzIGNsaWVudHMuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwNzQ4CisKKzIwMTMtMDUtMjAgMjE6MzQ6MTMgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJuQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkgIHJ0cGpwZWdwYXk6IEFkZCBvcHRpb25hbCBmcmFtZXJhdGUgY2FwcyBmb3IgdXNlIGluIFNEUAorCSAgVGhlIGZvcm1hdCBvZiB0aGUgdmFsdWUgYWRoZXJlcyB0byBSRkM0NTY2IGFuZCBpdCBpcyBtZWFudCB0byBiZSBwYXJzZWQKKwkgIGFuZCBpbmNsdWRlZCBpbiB0aGUgU0RQIHNlbnQgYnkgZ3N0LXJ0c3Atc2VydmVyIHRvIGl0cyBjbGllbnRzLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDc0OAorCisyMDEzLTA1LTIwIDE5OjU5OjEzICswMjAwICBNYXRoaWV1IER1cG9uY2hlbGxlIDxtYXRoaWV1LmR1cG9uY2hlbGxlQGVwaXRlY2guZXU+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBXaGVuIGFsbCBzaW5rcGFkcyBhcmUgZW9zLCB1cGRhdGUgb3V0cHV0IHNlZ21lbnQgc3RvcCBhbmQgZm9yd2FyZCBpdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTc5MworCisyMDEzLTA1LTIwIDE5OjUxOjA3ICswMjAwICBNYXRoaWV1IER1cG9uY2hlbGxlIDxtYXRoaWV1LmR1cG9uY2hlbGxlQGVwaXRlY2guZXU+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBEb24ndCByZXNldCB0aGUgb3V0cHV0IHNlZ21lbnQgb24gZmx1c2ggc3RvcAorCSAgT25seSBpbml0IGl0IHdoZW4gZ2V0dGluZyBmcm9tIFJFQURZIHRvIFBBVVNFRCwgYW5kIGNoYW5nZSBpdCBvbiBzZWVrIGV2ZW50cy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTk3OTMKKworMjAxMy0wNS0xNyAxMDoxNjo0OCArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyOiBEb24ndCBzdG9wIHN0cmVhbWluZyB3aGVuIHNldF9jYXBzIGlzIGNhbGxlZCB3aXRoIHVuY2hhbmdlZCBjYXBzCisJICBUaGlzIGNhbiBoYXBwZW4gaWYgb3RoZXIgcGFydHMgb2YgdGhlIHBpcGVsaW5lIGFyZSByZWNvbmZpZ3VyZWQuCisJICBTdG9wIHN0cmVhbWluZyBldmVuIGZvciBhIHNob3J0IGFtb3VudCBvZiB0aW1lIGNhbiBiZSBxdWl0ZSB2aXNpYmxlLCBzbyBpdAorCSAgc2hvdWxkIGJlIGF2b2lkZWQgaWYgcG9zc2libGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwNTAzCisKKzIwMTMtMDUtMTggMTU6Mzk6MzYgLTA0MDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMuYzoKKwkgIHRlc3RzOiBSZS1lbmFibGUgdmlkZW9taXhlciB0ZXN0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0MjM3CisKKzIwMTMtMDUtMTggMTQ6MzY6MzkgLTA0MDAgIFRoaWJhdWx0IFNhdW5pZXIgPHRoaWJhdWx0LnNhdW5pZXJAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmg6CisJICB2aWRlb21peGVyOiBTZW5kIGNhcHMgZXZlbnQgZnJvbSB0aGUgc3RyZWFtaW5nIHRocmVhZAorCSAgVGhpcyB3YXkgd2UgYXZvaWQgcmFjZXMgaW4gY2FwcyBuZWdvdGlhdGlvbiBhbmQgd2UgbWFrZSBzdXJlCisJICB0aGF0IHRoZSBjYXBzIGFyZSBzZW50IGFmdGVyIHN0cmVhbS1zdGFydC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODQyMzcKKworMjAxMy0wNS0wNSAyMDoyNToyMCArMDEwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogRG8gbm90IHNlbmQgZmx1c2hfc3RvcCB3aGVuIHJlY2VpdmluZyBhIHNlZWsKKwkgIFRoZXJlIGlzIG5vIHJlYXNvbiB0byBzZW5kIGEgZmx1c2gtc3RvcCB3aGVuIHJlY2VpdmluZyBhIHNlZWsgZXZlbnQuCisJICBJbiB0aGUgY2FzZSBvZiBhIGZsdXNoaW5nIHNlZWssIHdlIGNvdWxkIGV2ZW50dWFsbHkgd2FudCB0bywgYnV0IGluCisJICB0aGUgY29kZSBwYXRoIHdlcmUgd2UgY2hlY2sgaWYgdGhlIHNlZWsgaXMgImZsdXNoaW5nIiwgd2UgaGF2ZSB0aGUKKwkgIGZvbGxvd2luZyBjb21tZW50IHRoYXQgbWFrZXMgc2Vuc2U6CisJICAid2UgY2FuJ3Qgc2VuZCBGTFVTSF9TVE9QIGhlcmUgc2luY2UgdXBzdHJlYW0gY291bGQgc3RhcnQgcHVzaGluZyBkYXRhCisJICBhZnRlciB3ZSB1bmxvY2sgbWl4LT5jb2xsZWN0LgorCSAgV2Ugc2V0IGZsdXNoX3N0b3BfcGVuZGluZyB0byBUUlVFIGluc3RlYWQgYW5kIHNlbmQgRkxVU0hfU1RPUCBhZnRlcgorCSAgZm9yd2FyZGluZyB0aGUgc2VlayB1cHN0cmVhbSBvciBmcm9tIGdzdF92aWRlb21peGVyX2NvbGxlY3RlZCwKKwkgIHdoaWNoZXZlciBoYXBwZW5zIGZpcnN0LiIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODQyMzcKKworMjAxMy0wNS0wNSAyMDoyNDo0OSArMDEwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjI6IFByb3RlY3QgZmx1c2hfc3RvcF9wZW5kaW5nIHdpdGggdGhlIGNvbGxlY3RwYWQgc3RyZWFtIGxvY2sKKwkgIEFuZCBtYWtlIHN1cmUgdG8gZXhwZWN0IGEgZmx1c2gtc3RvcCBhZnRlciBhIGZsdXNoLXN0YXJ0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0MjM3CisKKzIwMTMtMDUtMTcgMTI6Mzc6NTkgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFwYXkuYzoKKwkgIHJ0cG1wNGFwYXk6IGNsZWFyIGNvbmZpZyBidWZmZXIgYmVmb3JlIHVzaW5nIGl0CisJICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHBhcnRzIG9mIHRoZSBtZW1vcnkgYXJlIG9ubHkgbW9kaWZpZWQgd2l0aCAifD0iCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwNTE0CisKKzIwMTMtMDUtMTQgMTc6MzA6MDcgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBEbyBub3QgZXhwZWN0IEVPUyBhZnRlciBhIHNlZ21lbnQgZXZlbnQgaWYgdXBzdHJlYW0gaXMgbXNzCisJICBJbiBjYXNlIHF0ZGVtdXggaXMgaGFuZGxpbmcgYSBtc3Mgc3RyZWFtLCBkbyBub3QgbWFyayB0aGUgc3RyZWFtIHRvIHdhaXQKKwkgIGZvciBFT1MgYWZ0ZXIgYSBzZWdtZW50LiBFdmVuIGlmIGl0IHNlZW1zIHRvIGJlIHRoZSBsYXN0IG9uZSBhY2NvcmRpbmcgdG8KKwkgIHRoZSBjdXJyZW50IHN0cmVhbXMgaW5mb3JtYXRpb24uCisJICBNU1MgaGFuZGxpbmcgaXMgZGlmZmVyZW50IGhlcmUgYmVjYXVzZSB0aGVyZSBpcyBhbm90aGVyIGRlbXV4ZXIgZHJpdmluZworCSAgdGhlIHBpcGVsaW5lCisKKzIwMTMtMDUtMTQgMTY6MzI6NTEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBvbmx5IHNldCBjaGFubmVscyBhbmQgcmF0ZSBpZiBxdGRlbXV4IGtub3dzIGl0CisJICBTZXR0aW5nIGJvdGggb2YgdGhvc2UgdG8gMCBpcyBwb2ludGxlc3MgYW5kIG1lYW5zIHRoYXQgcXRkZW11eAorCSAgZG9lc24ndCBrbm93IHRoZSByZWFsIHZhbHVlLiBBdm9pZCBzZXR0aW5nIGl0IGluIHRoaXMgY2FzZS4KKworMjAxMy0wNS0xNCAxNToyMzowOCArMDIwMCAgQXJuYXVkIFZyYWMgPGF2cmFjQGZyZWVib3guZnI+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc2V0IGFsYWMgY2FwcyB1c2luZyBpbmZvIGZyb20gY29kZWMgYnVmZmVyCisJICBUaGUgc2FtcGxlcmF0ZSBmaWVsZCBpbiB0aGUgU1RTRCBhdG9tIGlzIG5vdCByaWdodCBmb3Igc29tZSBBTEFDIGZpbGVzCisJICAodXN1YWxseSB3aGVuIGF1ZGlvIGlzIDk2a0h6LzI0Yml0cyksIHNvIHRoZSBhdWRpbyBjYXBzIG11c3QgYmUKKwkgIGV4dHJhY3RlZCBmcm9tIHRoZSBjb2RlYyBkYXRhLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDM4MgorCisyMDEzLTA1LTE1IDExOjEzOjEyICswMjAwICBBcm5hdWQgVnJhYyA8YXZyYWNAZnJlZWJveC5mcj4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGRvIG5vdCBwdXNoIGRpc2NvbnQgYnVmZmVycyBpZiB0aGV5IGFyZW4ndCBkaXNjb250CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgyMTEwCisKKzIwMTMtMDUtMTUgMTA6NTE6MzggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNWVkY2Q4NSB0byAwOThjMGQ3CisKKzIwMTMtMDUtMTQgMTA6Mjg6MTAgLTA0MDAgIEpvc2h1YSBNLiBEb2UgPG9zc0BudmwuYXJteS5taWw+CisKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSAgdmlkZW9jcm9wOiBBZGQgc3VwcG9ydCBmb3IgR1JBWTE2X0xFL0dSQVkxNl9CRQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDMzMQorCisyMDEzLTA1LTE0IDE3OjI5OjU4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYzoKKwkgIHJndm9sdW1lOiBTZW5kIGFsbCBldmVudHMgdGhyb3VnaCB0aGUgcHJveHlwYWRzIGluc3RlYWQgb2YganVzdCBzZW5kaW5nIHRvIHRoZSB0YXJnZXQKKwkgIE90aGVyd2lzZSB0aGUgc3RpY2t5IGV2ZW50cyBhcmUgbWlzc2luZyBvbiB0aGUgcHJveHlwYWRzLgorCisyMDEzLTA1LTE0IDE3OjI5OjE4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmd2b2x1bWUuYzoKKwkgIHJndm9sdW1lOiBGaXggZXZlbnQgaGFuZGxpbmcgaW4gdGhlIHVuaXQgdGVzdAorCisyMDEzLTA1LTE0IDE2OjM0OjU0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdsaW1pdGVyLmM6CisJICByZ2xpbWl0ZXI6IEZpeCBldmVudCBoYW5kbGluZyBpbiB1bml0IHRlc3RzCisKKzIwMTMtMDUtMTQgMTY6MzE6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6CisJICByZ2FuYWx5c2lzOiBGaXggZXZlbnQgaGFuZGxpbmcgaW4gdW5pdCB0ZXN0CisKKzIwMTMtMDUtMTQgMTY6MDg6NTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgcXRtdXg6IEZpeCBldmVudCBoYW5kbGluZyBpbiB1bml0IHRlc3QKKworMjAxMy0wNS0xNCAxNjowMDo1OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOgorCSAgbXVsdGlmaWxlOiBGaXggZXZlbnQgaGFuZGxpbmcgaW4gdW5pdCB0ZXN0CisKKzIwMTMtMDUtMTQgMTM6NTg6MDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWxhd2RlYy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsYXdlbmMuYzoKKwkgIG11bGF3OiBGaXggZXZlbnQgaGFuZGxpbmcgaW4gdW5pdCB0ZXN0CisKKzIwMTMtMDUtMTQgMTM6NTI6MTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thcGFyc2U6IE1ha2Ugc3VyZSB0byBzZW5kIGEgc2VnbWVudCBldmVudCBiZWZvcmUgZGF0YWZsb3cKKworMjAxMy0wNS0xNCAxMDo1MjoxOSArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IG9ubHkgYWRkIGludGVybGFjZS1tb2RlIHRvIHRoZSBjYXBzIGZvciByYXcgZm9ybWF0cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDI4MAorCisyMDEzLTA1LTE0IDEyOjAzOjAzICswMjAwICBNaWNoYWVsIE9sYnJpY2ggPG0ub2xicmljaEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogY29weSBhbmQgc2V0IHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29udGVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDI4MgorCisyMDEzLTA1LTE0IDEwOjI1OjU2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW50ZXJsZWF2ZS5jOgorCSAgaW50ZXJsZWF2ZTogRml4IGV2ZW50IGhhbmRsaW5nIGluIHVuaXQgdGVzdAorCisyMDEzLTA1LTE0IDA5OjQ1OjEyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogSW1wcm92ZSBoYW5kbGluZyBvZiBtaW4vbWF4IGJ1ZmZlciBudW1iZXJzIG9mIHRoZSBidWZmZXIgcG9vbAorCisyMDEzLTA1LTE0IDAzOjQyOjU5ICswMjAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBzZXQgY2FwcyBmb3IgYnVmZmVyIHBvb2wgY29uZmlnCisKKzIwMTMtMDUtMTMgMTM6MzA6MzggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgbXVsdGlmaWxlc2luazogTGV0IHRoZSBiYXNlIGNsYXNzIGRvIGdldF90aW1lcworCSAgVGhpcyB3aWxsIG1ha2Ugc3luYz1UUlVFIHdvcmssIHRoZSBkZWZhdWx0IGlzIHN0aWxsIHN5bmM9RkFMU0UKKworMjAxMy0wNS0xMSAyMzowODoyMyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkgIGludGVybGVhdmU6IFNlbmQgc3RyZWFtLXN0YXJ0IGJlZm9yZSBjYXBzIGV2ZW50CisKKzIwMTMtMDUtMTEgMjM6MjQ6MzYgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwbXV4LmM6CisJICBydHBtdXg6IFNlbmQgc3RyZWFtLXN0YXJ0IGJlZm9yZSBjYXBzCisKKzIwMTMtMDUtMTEgMjM6Mjg6MTIgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlci10ZXN0OiBTZW5kIHN0cmVhbS1zdGFydCBiZWZvcmUgY2FwcyBmb2xsb3dlZCBieSBzZWdtZW50CisKKzIwMTMtMDUtMTEgMjM6MzQ6MzYgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW4uYzoKKwkgIHJ0cGJpbi10ZXN0OiBTZW5kIG1pc3Npbmcgc3RyZWFtLXN0YXJ0IGFuZCBzZWdtZW50IGV2ZW50cworCisyMDEzLTA1LTEzIDE1OjM2OjE5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJICB0ZXN0czogRml4IHNvbWUgbW9yZSBldmVudCBoYW5kbGluZyBpbiB0ZXN0cworCisyMDEzLTA1LTEzIDE1OjE5OjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYzoKKwkgIGljeWRlbXV4OiBGaXggZXZlbnQgaGFuZGxpbmcgaW4gdW5pdCB0ZXN0CisKKzIwMTMtMDUtMTMgMTU6MTk6MjUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzoKKwkgIGljeWRlbXV4OiBGaXggc3RpY2t5IGV2ZW50IGhhbmRsaW5nCisKKzIwMTMtMDUtMTMgMTU6MDY6MDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBQdXNoIHN0aWNreSBldmVudHMgaW4gdGhlIHJpZ2h0IG9yZGVyCisKKzIwMTMtMDUtMTMgMTQ6NTU6MTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGVhdmUuYzoKKwkgIGRlaW50ZXJsZWF2ZTogRml4IGV2ZW50IGhhbmRsaW5nIGluIHRlc3QKKworMjAxMy0wNS0xMyAxNDowNzoxMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOgorCSAgZGVpbnRlcmxlYXZlOiBGaXggc3RpY2t5IGV2ZW50IGhhbmRsaW5nCisKKzIwMTMtMDUtMTMgMTM6NTU6NDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgIGRlaW50ZXJsZWF2ZTogQ29kZSBzdHlsZSBmaXhlcworCisyMDEzLTA1LTEzIDEwOjQzOjMyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIHJ0cGdzdHBheTogRmlyc3QgbGV0IGJhc2VjbGFzcyBoYW5kbGUgZXZlbnRzLCB0aGVuIHB1dCB0aGVtIGludG8gdGhlIHN0cmVhbQorCSAgRml4ZXMgaGFuZGxpbmcgb2Ygc3RpY2t5IGV2ZW50cy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDAyMTMKKworMjAxMy0wNS0wOSAyMjowNToyNCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NoYXBld2lwZS5jOgorCSAgc2hhcGV3aXBlLXRlc3Q6IFNlbmQgaW5pdGFsIGV2ZW50cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDAzMworCisyMDEzLTA1LTA5IDE4OjMyOjIzIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwZWN0cnVtLmM6CisJICBzcGVjdHJ1bS10ZXN0OiBTZW5kIGluaXRhbCBldmVudHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDAwMzMKKworMjAxMy0wNS0wOSAxODoyNToxNyAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2ZpbHRlci5jOgorCSAgdmlkZW9maWx0ZXItdGVzdDogU2VuZCBpbml0YWwgZXZlbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwMDMzCisKKzIwMTMtMDUtMDkgMTg6MjM6MzAgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja3BhcnNlLmM6CisJICB3YXZwYWNrcGFyc2UtdGVzdDogU2VuZCBpbml0YWwgZXZlbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwMDMzCisKKzIwMTMtMDUtMDkgMTg6MjE6NTQgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMveTRtZW5jLmM6CisJICB5NG1lbmMtdGVzdDogU2VuZCBpbml0YWwgZXZlbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwMDMzCisKKzIwMTMtMDUtMTAgMTQ6MDA6MzMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJICBtdWx0aXBhcnRkZW11eDogZml4IGV4YW1wbGUgcGlwZWxpbmUKKwkgIE5lZWQganBlZ3BhcnNlLgorCisyMDEzLTA1LTEwIDEzOjM0OjE2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYWxwaGFjb2xvci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXNwZWN0cmF0aW9jcm9wLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2FtcGxpZnkuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmJhbmQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmxpbWl0LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2R5bmFtaWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZWNoby5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9pbnZlcnQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvcGFub3JhbWEuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvd3NpbmNiYW5kLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jbGltaXQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpc3VidGl0bGUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NhcHNzZXR0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kdG1mLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9lcXVhbGl6ZXIuYzoKKwkgIHRlc3RzOiBGaXggc29tZSBtb3JlIHVuaXQgdGVzdHMKKworMjAxMy0wNS0xMCAxMzoxMDoyOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3BhcnNlci5jOgorCSAgdGVzdHM6IEZpeCBwYXJzZXIgdGVzdHMKKworMjAxMy0wNS0wOSAyMjoyMDoyOCAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBzaGFwZXdpcGU6IENhbid0IG1hcCB0d2ljZSB0aGUgc2FtZSBidWZmZXIgZm9yIHdyaXRpbmcKKwkgIEkgdG9vayB0aGUgb3Bwb3J0dW5pdHkgdG8gc2ltcGxpZnkgdGhhdCBjb2RlIGEgYml0LiBXZSBub3cgdXNlCisJICBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUoKSB0byBtYWtlIHRoZSBidWZmZXIgd3JpdGFibGUgYW5kIG1hcCB0d2ljZSB0aGUKKwkgIHNhbWUgYnVmZmVyLCB3aXRoIGZpcnN0IG1hcCBiZWluZyByZWFkL3dyaXRlLCBhbmQgc2Vjb25kIHJlYWQgb25seS4gVGhpcworCSAgZ2V0IHJpZCBvZiB0aGUgY3JpdGljYWw6CisJICBHU3RyZWFtZXItQ1JJVElDQUwgKio6IGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWU6IGFzc2VydGlvbiBgSVNfTVVUQUJMRQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDA0NAorCisyMDEzLTA1LTA5IDIyOjE1OjU0IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkgIHNoYXBld2lwZTogRW5zdXJlIGNhcHMgYXJlIHdyaXRhYmxlCisJICBUaGUgZXhpc3Qgb25lIGNhc2Ugd2hlcmUgdGhhdCB3ZSBlbmR1cCB3aXRoIG9yaWdpbmFsIGNhcHMgaW4gcmV0LCBpbiB3aGljaAorCSAgY2FzZSB3ZSBhcmUgbm90IGd1YXJhdGllZCB0byBoYXZlIHdyaXRhYmxlIGNhcHMuIFNpbXBseSBlbnN1cmUgdGhpcyBpcyB0aGUKKwkgIGNhcHMgYXJlIHdyaXRhYmxlIGJlZm9yZSBlbnRlcmluZyB0aGUgbG9vcC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDAwNDQKKworMjAxMy0wNS0wOSAyMjoxMzo1MSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBzaGFwZXdpcGU6IEZpeCBzYW1wbGUgcGlwZWxpbmUgaW4gZG9jdW1lbnRhdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTcwMDA0NAorCisyMDEzLTA1LTA5IDE4OjA1OjAyIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdlbmMuYzoKKwkgIGpwZWdlbmMtdGVzdDogU2VuZCBpbml0YWwgZXZlbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwMDMzCisKKzIwMTMtMDUtMDkgMTc6NDk6MDMgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdnA4ZW5jLmM6CisJICB2cDhlbmMtdGVzdDogU2VuZCBpbml0YWwgZXZlbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwMDMzCisKKzIwMTMtMDUtMDkgMTc6MjA6MTggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdnA4ZGVjLmM6CisJICB2cDhkZWMtdGVzdDogU2VuZCBpbml0YWwgZXZlbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwMDMzCisKKzIwMTMtMDUtMDkgMTc6MTk6NTMgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja2RlYy5jOgorCSAgd2F2cGFja2RlYy10ZXN0OiBTZW5kIGluaXRpYWwgZXZlbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzAwMDMzCisKKzIwMTMtMDUtMDkgMTY6MjY6MTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgUmV2ZXJ0ICJ2aWRlb21peGVyMjogVGFrZSBpbnRvIGFjY291bnQgbmV3IHNlZ21lbnRzIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCA4NGFlNjcwYWI0MGIyNThhMTBlMWUyMTQ3MWU2ZGM5ZDc4NmJmMDg2LgorCSAgQWN0dWFsbHkgdGhpcyBpcyBub3QgaG93IGl0IGlzIHN1cHBvc2VkIHRvIHdvcmsuIHZpZGVvbWl4ZXIKKwkgIGNyZWF0ZXMgYSBbMCwtMV0gc2VnbWVudCBhbmQgdGhlbiBwdXRzIGZyYW1lcyBvZiB0aGUgZGlmZmVyZW50CisJICBzdHJlYW1zIHRoZXJlIGJhc2VkIG9uIHRoZWlyIHJ1bm5pbmcgdGltZXMgaW4gdGhlaXIgb3duIHNlZ21lbnRzLgorCisyMDEzLTA1LTA2IDIzOjQzOjAzICswMjAwICBNYXRoaWV1IER1cG9uY2hlbGxlIDxtYXRoaWV1LmR1cG9uY2hlbGxlQGVwaXRlY2guZXU+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyMjogVGFrZSBpbnRvIGFjY291bnQgbmV3IHNlZ21lbnRzCisJICBBbHNvIGZvcndhcmQgdGhlIGV2ZW50IGRvd25zdHJlYW0gb24gdGhlIG5leHQgb3Bwb3J0dW5pdHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk5NzkzCisKKzIwMTMtMDUtMDkgMDk6MDc6MzggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIFJldmVydCAiZ3N0cnRzcHNyYzogc2V0IGJ1ZmZlci1zaXplIGZvciBtdWx0aWNhc3QgYnVmZmVycyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgMjQ4MWU5NWQwMzhiNDIyOTdhMDE2ZjFkMmRjMWFmMjZkMjE3NWI0Mi4KKwkgIFRoaXMgaXMgYWxyZWFkeSBkb25lIGZpdmUgbGluZXMgYWJvdmUsIGl0IHdhcyBhZGRlZCBhIHllYXIKKwkgIGFnbyBpbiBjb21taXQgNTYxYjEzMWUuCisKKzIwMTMtMDUtMDggMTk6NTQ6MTkgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2ZpbHRlci5jOgorCSAgdmlkZW9maWx0ZXI6IFVuaXQgdGVzdCBzZW5kIFNFR01FTlQgYmVmb3JlIENBUFMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTk5NjYKKworMjAxMy0wNS0wOCAxOToyMjozMSAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOgorCSAgYXZpbXV4OiBVbml0IHRlc3Qgc2VuZHMgU0VHTUVOVCBiZWZvcmUgY2FwcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTk2NgorCisyMDEzLTA1LTA4IDE5OjA4OjI0IC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW93c2luY2JhbmQuYzoKKwkgIGF1ZGlvd3NpbmNiYW5kOiBUZXN0IHNob3VsZCBzZW5kIHNlZ21lbnQgYWZ0ZXIgQ0FQUworCSAgVGhpcyBtYWtlcyB0aGUgdW5pdCB0ZXN0IHBhc3MgYWdhaW4uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk5OTY2CisKKzIwMTMtMDUtMDggMTk6MDA6MjggLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jbGltaXQuYzoKKwkgIGF1ZGlvd3NpbmNsaW1pdDogVGVzdCBzaG91bGQgc2VuZCBzZWdtZW50IGFmdGVyIENBUFMKKwkgIFRoaXMgbWFrZXMgdGhlIHVuaXQgdGVzdCBwYXNzIGFnYWluLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTk2NgorCisyMDEzLTA1LTA4IDE4OjQ0OjMyIC0wNDAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmM6CisJICBhdWRpb3dzaW5jbGltaXQ6IEZyZXF1ZW5jZSBwcm9wZXJ0eSByZW5hbWVkIGN1dG9mZgorCSAgVXBkYXRpbmcgdGhlIGRvY3VtZW50YXRpb24gdG8gcmVmbGVjdCB0aGlzIGNoYW5nZS4KKwkgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTk2NAorCisyMDEzLTA1LTA4IDE1OjI1OjU4IC0wMzAwICBBaGEgVW5zd29ydGggPGFoYS51bnN3b3J0aEBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIGdzdHJ0c3BzcmM6IHNldCBidWZmZXItc2l6ZSBmb3IgbXVsdGljYXN0IGJ1ZmZlcnMKKwkgIEZvciByZWNlaXZpbmcgdmlkZW8gZGF0YSB2aWEgUlRTUCB3aGVuIHRoZSB2aWRlbyBpcyBzZW50IHZpYQorCSAgbXVsdGljYXN0IHRoZXJlIGlzIG5vIHdheSB0byBzcGVjaWZ5IHRoZSB1ZHBzcmMgYnVmZmVyLXNpemUuCisJICBPbiB3aW5kb3dzIHRoZSBuYXRpdmUgbmV0d29yayBidWZmZXIgaXMgbm90IGxhcmdlIGFuZCB3aXRoIHZpZGVvCisJICBpLWZyYW1lcyBiZWluZyBodWdlIHRoZSBidWZmZXIgaXMgdG8gc21hbGwgYW5kIHlvdSBnZXQgaS1mcmFtZSBjb3JydXB0aW9uLAorCSAgaXQgbG9va3MgdGVycmlibGUsIGFuZCB0aGVyZSBpcyBubyAoZWFzeSkgd2F5IHRvIHNldCB0aGUgdWRwc3JjIGJ1ZmZlci1zaXplLgorCSAgaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTIyNjQKKworMjAxMy0wNS0wOCAxNjowMjowNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyMjogU2VuZCBzdHJlYW0tc3RhcnQgYmVmb3JlIGNhcHMgZXZlbnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTk4OTUKKworMjAxMy0wNS0wNyAxOToxNTo0OSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBmaXggY29tcGlsZXIgd2FybmluZyBvbiB0eXBlIGNoZWNrCisKKzIwMTMtMDQtMTggMDc6NDk6NTQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwdXNoIG5ldyBjYXBzIGV2ZW50cyB3aGVuIGNhcHMgY2hhbmdlCisJICBXaGVuZXZlciB0aGUgZGVtdXhlciBoYXMgYSBuZXcgY2FwcyBvbiBhIHN0cmVhbSwgaXQgc2hvdWxkIHNldCB0aGUKKwkgIG5ld19jYXBzIHZhcmlhYmxlIHRvIHRydWUgYW5kIGEgbmV3IGNhcHMgZXZlbnQgd2lsbCBiZSBwdXNoZWQgYmVmb3JlCisJICB0aGUgbmV4dCBidWZmZXIKKworMjAxMy0wNC0xNyAxNjo1NDoyMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRvIG5vdCBwdXNoIGRpc2NvbnQgYnVmZmVycyBpZiB0aGV5IGFyZW4ndCBkaXNjb250CisJICBxdGRlbXV4IHRha2VzIGl0cyBidWZmZXJzIGZyb20gYSBHc3RBZGFwdGVyLiBUaG9zZSBidWZmZXJzIGFyZSBjcmVhdGVkCisJICBmcm9tIHRoZSBsYXJnZXIgYnVmZmVyIHRoYXQgaXQgb2J0YWluZWQgZnJvbSB1cHN0cmVhbSBhbmQgdGhleSBjYXJyeQorCSAgdGhlIHNhbWUgZmxhZ3MsIGluY2x1ZGluZyBESVNDT05UIGlmIGl0IGlzIHNldC4gSW4gdGhlc2UgY2FzZXMsIGFsbAorCSAgYnVmZmVycyB0aGF0IHF0ZGVtdXggaXMgZ29pbmcgdG8gcHVzaCB3b3VsZCBiZSBtYXJrZWQgYXMgRElTQ09OVC4KKwkgIFRoaXMgc2NlbmFyaW8gY2FuIG1ha2UgcGFyc2Vycy9kZWNvZGVycyBmbHVzaCBvbiBldmVyeSBidWZmZXIgbGVhZGluZworCSAgdG8gbm8gZGVjb2RpbmcgYXQgYWxsIGhhcGVubmluZy4gVGhpcyBwYXRjaCBwcmV2ZW50cyB0aGlzIGJ5IHVuc2V0dGluZworCSAgdGhlIGZsYWcgaWYgaXQgc2hvdWxkbid0IGJlIHNldC4KKworMjAxMy0wNC0xMiAwOTowODoxNiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSAgcXRkZW11eDogc29tZSBjb2RlIGNsZWFudXAgZm9yIG1zcyBoYW5kbGluZyBjb2RlCisJICAqIEV4cGxpY2l0bHkgaW5pdCB2YXJpYWJsZXMgZm9yIGZyYWdtZW50ZWQgZm9ybWF0cyBhdCBpbml0CisJICAqIERvIG5vdCB1c2UgR3N0Q2xvY2tUaW1lIHR5cGUgaWYgdGhlIHZhcmlhYmxlIGlzbid0IGEgdGltZXN0YW1wCisJICAqIEZpeCBhIHN0eWxlL3JlYWRhYmlsaXR5IGlzc3VlIGF0IGFuIGlmIGJsb2NrCisJICAqIEdyb3VwIDIgbXNzIG1vZGUgY29uZGl0aW9uYWwgYmxvY2tzIHRvZ2V0aGVyIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkKKwkgIENvbmZsaWN0czoKKwkgIGdzdC9pc29tcDQvcXRkZW11eC5jCisKKzIwMTMtMDQtMTIgMTA6MjE6MTEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhdm9pZCBzdG9yaW5nIG5vbi10aW1lIG5ld3NlZ21lbnRzIHRvIHB1c2ggbGF0ZXIKKwkgIFRoaXMgY2FuIGNvbmZ1c2UgZG93bnN0cmVhbSB3aGVuIHRoZXkgZ2V0IGEgYnl0ZSBzZWdtZW50IGFmdGVyIHJlY2VpdmluZworCSAgdGhlIG5hdHVyYWwgdGltZSBzZWdtZW50IGZyb20gcXRkZW11eCB0aGF0IGl0IHNlbmRzIHdoZW4gc3RhcnRpbmcgdG8KKwkgIHB1c2ggYnVmZmVycy4gVGhpcyBpcyBzcGVjaWFsbHkgdGhlIGNhc2Ugd2l0aCBwYXJzZXJzIHRoYXQgdHJ5IHRvCisJICBjb252ZXJ0IHRoZSBwb3NpdGlvbiBmcm9tIGJ5dGUgdG8gdGltZSBmb3JtYXQgYW5kIG1pZ2h0IG1pc3MgdGhlCisJICBjb3JyZWN0IHBvc2l0aW9uIGZvciBwbGF5YmFjayB0byBzdGFydC4KKworMjAxMy0wNC0xMCAxODowMjoyOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGF2b2lkIHNldHRpbmcgZmllbGRzIHRvIG5vbi13cml0YWJsZSBjYXBzCisKKzIwMTMtMDMtMTAgMDQ6MTU6MDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZG9uJ3Qgc2VuZCBzbyBtYW55IHNlZ21lbnQgZXZlbnRzCisJICBPbmx5IHNlbmQgb25lIHNlZ21lbnQgZXZlbnQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtLCBub3QKKwkgIGFmdGVyIGVhY2ggbW9vdiBhbmQgbW9vZiBhdG9tLgorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L2lzb21wNC9xdGRlbXV4LmMKKworMjAxMy0wMy0wOCAxNjowMjoyNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwbGFjZSBpbmNvbW1pbmcgdGltZXN0YW1wcyBvbiBvdXRwdXQKKwkgIFBsYWNlIHRoZSBpbmNvbW1pbmcgdGltZXN0YW1wIChpZiBhbnkpIGRpcmVjdGx5IG9udG8gdGhlIG91dGdvaW5nIGJ1ZmZlcnMKKwkgIGFuZCBpbnRlcnBvbGxhdGUgb3RoZXIgdGltZXN0YW1wcy4KKwkgIENvbmZsaWN0czoKKwkgIGdzdC9pc29tcDQvcXRkZW11eC5jCisKKzIwMTMtMDUtMDcgMTA6MTY6MTggLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBpbXByb3ZlIHJlc2V0IG9mIGludGVybmFsIHN0YXR1cworCSAgUmVzZXQgZGlmZmVyZW50IHZhcmlhYmxlcyBvbiBzdGF0ZSBjaGFuZ2VzIHRvIHJlYWR5IGFuZCB3aGVuCisJICBoYW5kbGluZyBhIGZsdXNoLXN0b3AuIEZvciBoYW5kbGluZyBmbHVzaCBzdG9wcyB3ZSBzaG91bGQgY2hlY2sKKwkgIGlmIHRoZXJlIGlzIGFuIHVwc3RyZWFtIGFkYXB0aXZlIGRlbXV4ZXIgZHJpdmluZyB0aGUgcGlwZWxpbmUgYXMgdGhpcworCSAgbWVhbnMgdGhhdCBxdGRlbXV4IHdpbGwgZ2V0IGEgbmV3IG1vb3YgYXRvbS4gRm9yICdzdGFuZGFyZCcgaXNvbWVkaWEKKwkgIHN0cmVhbXMgdGhpcyBpc24ndCB0cnVlIGFuZCBxdGRlbXV4IHNob3VsZCBrZWVwIHRoZSBwcmV2aW91cyBtb292CisJICBpbmZvcm1hdGlvbiBhcm91bmQuCisJICBDb25mbGljdHM6CisJICBnc3QvaXNvbXA0L3F0ZGVtdXguYworCisyMDEzLTAyLTA4IDAwOjI5OjIwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcHJlcGFyZSBxdGRlbXV4IHRvIGFjY2VwdCBtdWx0aXBsZSBkYXNoIG1vb3ZzIGluIGEgcm93CisJICBXaGVuZXZlciBkYXNoZGVtdXggc3dpdGNoZXMgYml0cmF0ZXMgaXQgc2VuZHMgYSBuZXcgbW9vdiB3aXRoIHRoZQorCSAgbmV3IHN0cmVhbSBjb25maWd1cmF0aW9uLiBxdGRlbXV4IHNob3VsZCBub3cgaGFuZGxlIHRoaXMgYnkgc3BsaXR0aW5nCisJICB0aGUgZXhwb3NpbmcgYW5kIGNvbmZpZ3VyYXRpb24gb2Ygc3RyZWFtcyBpbnRvIHNlcGFyYXRlIGZ1bmN0aW9ucy4gV2hlbgorCSAgdGhlIHN0cmVhbSBpcyBuZXcgaXQgaXMgY29uZmlndXJlZCBhbmQgZXhwb3NlZCwgd2hlbiBpdCBpcyBhIG5ldyBiaXRyYXRlCisJICBvZiBhbiBleGlzdGluZyBzdHJlYW0gaXQgaXMgb25seSByZWNvbmZpZ3VyZWQuCisJICBDb25mbGljdHM6CisJICBnc3QvaXNvbXA0L3F0ZGVtdXguYworCisyMDEzLTAyLTA3IDE0OjEyOjUzIC0wMjAwICBBbmRyZSBNb3JlaXJhIE1hZ2FsaGFlcyAoYW5kcnVua28pIDxhbmRyZS5tYWdhbGhhZXNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IE1vdmUgRkxVU0hfU1RPUC9QQVVTRURfVE9fUkVBRFkgaGFuZGxpbmcgdG8gYSByZXNldCBtZXRob2QuCisJICBDb25mbGljdHM6CisJICBnc3QvaXNvbXA0L3F0ZGVtdXguYworCisyMDEzLTAxLTIzIDEwOjU1OjMzIC0wNTAwICBMb3Vpcy1GcmFuY2lzIFJhdHTDqS1Cb3VsaWFubmUgPGxvdWlzLWZyYW5jaXMucmF0dGUtYm91bGlhbm5lQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IFJlbW92ZSBvbGQgcGFkcyB3aGVuIGV4cG9zaW5nIHN0cmVhbXMgYW5kIG90aGVyIGdlbmVyYWwgZml4ZXMuCisJICBDb25mbGljdHM6CisJICBnc3QvaXNvbXA0L3F0ZGVtdXguYworCisyMDEzLTA0LTE2IDEwOjQxOjQzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBoYW5kbGUgbXNzIHN0cmVhbXMKKwkgIHNtb290aHN0cmVhbWluZyBzdHJlYW1zIHNob3VsZCBiZSBoYW5kbGVkIGFzIGEgc3BlY2lhbCBraW5kIG9mCisJICBmcmFnbWVudGVkIGlzb21lZGlhLiBJbiBNU1MgdGhlIGZyYWdtZW50cyB3aWxsIG5vdCBjb250YWluIGEKKwkgICdtb292JyBhdG9tIHdpdGggdGhlIG1lZGlhIGRlc2NyaXB0aW9ucywgdGhpcyBoYXMgdG8gYmUgZXh0cmFjdGVkCisJICBmcm9tIHRoZSBjYXBzLgorCSAgQWRkaXRpb25hbGx5LCB0aGVyZSBzaG91bGQgYmUgYW5vdGhlciBkZW11eGVyIHVwc3RyZWFtIHRoYXQgaXMgbGlrZWx5CisJICBnb2luZyB0byBiZSB0aGUgb25lIHRvIGFuc3dlci9hY3Qgb24gcXVlcmllcyBhbmQgZXZlbnRzLCBzbyBxdGRlbXV4IGhhcworCSAgdG8gZm9yd2FyZCB0aG9zZSB1cHN0cmVhbS4KKworMjAxMy0wNS0wNiAxNjo1NDowMiArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiByZXF1ZXN0IDAgYnVmZmVycyB3aGVuIHN0b3BwaW5nCisJICBXaXRob3V0IHRoaXMgc3RvcHBpbmcgdGhlIHBvb2wgaW4gKl9zZXRfY2FwcygpIGlzIHVzZWxlc3MuCisJICBTX0ZNVCB3aWxsIHN0aWxsIGZhaWwgd2l0aCBFQlVTWS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTk4MzUKKworMjAxMy0wNS0wNyAxNjozMjowMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IEJ5IGRlZmF1bHQgYXNzdW1lIHRoYXQgd2UncmUgd29ya2luZyBvbiBub24tcGFja2V0aXplZCBpbnB1dAorCSAgT25seSBkZXRlY3RpbmcgdGhpcyBpbiBzZXRfZm9ybWF0KCkgZG9lcyBub3Qgd29yayBiZWNhdXNlIHdlIG1pZ2h0CisJICBub3QgZ2V0IGFueSBjYXBzIGF0IGFsbCwgZS5nLiBmcm9tIGZpbGVzcmMuCisKKzIwMTMtMDUtMDcgMTY6MzA6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgcG5nZGVjOiBJbXBsZW1lbnQgcGFyc2luZyBmdW5jdGlvbmFsaXR5CisJICBUaGlzIGFsbG93cyB0byBwbHVnIHBuZ2RlYyBkaXJlY3RseSB3aXRob3V0IGEgcGFyc2VyIGlmIHRoYXQKKwkgIGlzIGRlc2lyZWQuCisJICBQYXJzaW5nIGNvZGUgaXMgYmFzZWQgb24gcG5ncGFyc2UuCisKKzIwMTMtMDUtMDcgMTU6NTQ6MjQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOgorCSAgY2FjYXNpbms6IEZpeCBzdXBwb3J0IGZvciBSR0IgZm9ybWF0cyBhbmQgYWRkIHN1cHBvcnQgZm9yIG1vcmUgb2YgdGhlbQorCisyMDEzLTA1LTA0IDEzOjE5OjUzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBEb24ndCBjb25zaWRlciB0aGUgY29udGVudCBzaXplIGZyb20gdGhlIEhUVFAgaGVhZGVycyBhcyBhYnNvbHV0ZWx5IGNvcnJlY3QKKwkgIFRoZSBIVFRQIHNlcnZlciBjb3VsZCBnaXZlIHdyb25nIGluZm9ybWF0aW9uLCBlLmcuIGlmIHRoZSBIVFRQIHN0cmVhbSBpcworCSAgY2h1bmstZW5jb2RlZCBvciBjb21wcmVzc2VkLCBvciBpZiB0aGUgc2VydmVyIGRvZXMgbm90IGtub3cgdGhlIGNvbXBsZXRlIHNpemUKKwkgIGF0IHRoZSB0aW1lIHdoZW4gdGhlIGZpbGUgaXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuCisJICBBbHNvIHNlZQorCSAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTExNTM1NAorCisyMDEyLTA4LTIwIDA5OjUyOjMyICswMjAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMjogZmlsbCBvdXQgdjRsMl9idWZmZXIuYnl0ZXN1c2VkIGZpZWxkIGZvciB2NGwyc2luaworCSAgV2hlbiBxdWV1aW5nIGEgYnVmZmVyIGZvciBhIHNpbmssIGJ5dGVzdXNlZCBtdXN0IGNvbnRhaW4gdGhlIGFjdHVhbAorCSAgYW1vdW50IG9mIGRhdGEuCisJICBGb3IgYSBzb3VyY2UsIHRoZSBkcml2ZXIgbXVzdCBvdmVyd3JpdGUgdGhpcywgc28gaXQgZG9lc24ndCBtYXR0ZXIKKwkgIHdoYXQgaXMgc2V0IGhlcmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk5NTk4CisKKzIwMTMtMDUtMDMgMjM6NDM6MjYgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJhc0BnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJICBydHBnc3RwYXk6IGZpeCBpbnZhbGlkIG1lbW9yeSBhY2Nlc3MgaW4gZXZlbnQgaGFuZGxlcgorCSAgRmlyc3QgcHJvY2VzcyBldmVudCBpbiBwYXlsb2FkZXIsIHRoZW4gaGFuZCBpdCB0byB0aGUKKwkgIGJhc2UgY2xhc3Mgd2hpY2ggdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBldmVudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTk2MzcKKworMjAxMy0wNS0wNCAwOTo0ODowMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSAgYWMzcGFyc2UsIGRjYXBhcnNlOiBjaGVjayBidWZmZXIgc2l6ZSBiZWZvcmUgdHJpbW1pbmcKKwkgIGFuZCB1bnJlZiBvbGQgYnVmZmVyIGFzIHNvb24gYXMgcG9zc2libGUuCisKKzIwMTMtMDUtMDIgMTU6MDA6MjIgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuaDoKKwkgIGRjYXBhcnNlOiBhZGQgc3VwcG9ydCBmb3IgImF1ZGlvL3gtcHJpdmF0ZTEtZHRzIgorCisyMDEzLTA1LTAyIDE0OjU2OjAyICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmg6CisJICBhYzNwYXJzZTogYWRkIHN1cHBvcnQgZm9yICJhdWRpby94LXByaXZhdGUxLWFjMyIKKworMjAxMy0wNS0wMyAxMjo0NjozNyArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IGFsd2F5cyBnZW5lcmF0ZSB2aWRlbyBpbmZvIGZyb20gY2FwcworCSAgSW4gdGhlIHBhc3QgZ3N0X3ZpZGVvX2luZm9fZnJvbV9jYXBzKCkgb25seSB2aWRlby94LXJhdy4gTm93IGl0IGFsc28KKwkgIHN1cHBvcnRzIG90aGVyIHZpZGVvLyogYW5kIGltYWdlLyogZm9ybWF0cy4KKwkgIFdpdGggdGhpcyBwYXRjaCB0aGUgZm9ybWF0IHdvbid0IGJlIEdTVF9WSURFT19GT1JNQVRfVU5LT1dOIGFuZAorCSAgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfc2V0X2NvbmZpZygpIGhhbmRsZXMgc3RyaWRlcyBjb3JyZWN0bHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk5NTcwCisKKzIwMTMtMDUtMDIgMDk6NDE6MDEgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkgIHY0bDI6IHRyeSB0byBhbGxvY2F0ZSBuZXcgYnVmZmVycyB3aXRoIFZJRElPQ19DUkVBVEVfQlVGUyBpZiBuZWVkZWQKKwkgIElmIG1heF9idWZmZXJzIGlzIDAgdGhlbiBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGJ1ZmZlcnMgKGN1cnJlbnRseSA0KSBpcworCSAgYWxsb2NhdGVkLiBJZiB0aGlzIGlzIG5vdCBlbm91Z2ggdjRsMnNyYyBzdGFydHMgY29weWluZyBidWZmZXJzLgorCSAgV2l0aCB0aGlzIHBhdGNoIFZJRElPQ19DUkVBVEVfQlVGUyBpcyB1c2VkIHRvIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlci4gSWYKKwkgIHRoaXMgZmFpbHMgdjRsMnNyYyBmYWxscyBiYWNrIHRvIGNvcHlpbmcgYnVmZmVycy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTk0NDcKKworMjAxMy0wNC0xNSAxNzozNzowMSArMDIwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiBmaXggc2V0dGluZyB3aW5kb3cgaGFuZGxlIGFmdGVyIHRyYW5zaXRpb24KKwkgIFRoZSBkZXN0cm95ZWQgZmxhZyB3YXMgbm90IHJlc2V0IHByb3Blcmx5IGFuZCBpdCdzIGFsc28gbm90IG5lZWRlZAorCSAgYXMgd2UgY2FuIGNoZWNrIG9zeHdpbmRvdyAhPSBOVUxMCisKKzIwMTMtMDUtMDIgMTM6NDU6NTUgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICBydHA6IGZpeCBkdXBsaWNhdGVkIHN5bWJvbHMgd2l0aCBsaWJ2cHgKKworMjAxMy0wNC0yOSAxMDo1ODowOCArMDIwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogZ3N0L2dvb20yazEvTWFrZWZpbGUuYW06CisJICBnb29tMmsxOiBmaXggZHVwbGljYXRlZCBzeW1ib2xzIHdpdGggZ29vbQorCisyMDEzLTA1LTAxIDE1OjQ5OjQ1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiBJZiB0aGUgYWRhcHRlciBpcyBlbXB0eSBvbiBFT1MgZG9uJ3QgdHJ5IHRvIG1hcCBpdHMgY29udGVudAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTMxNAorCisyMDEzLTA0LTMwIDE0OjM2OjM4ICswMjAwICBPZ255YW4gVG9uY2hldiA8b2dueWFuQGF4aXMuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGFkZCBzdHJlYW0tZm9ybWF0PXJhdyB0byBhYWMgY2FwcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTMwMworCisyMDEzLTA0LTMwIDEzOjA3OjM3ICswMjAwICBNaWNoYWVsIE9sYnJpY2ggPG0ub2xicmljaEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGZpeCBhbmQgY2xlYW51cCBWSURJT0NfRVhQQlVGIGhhbmRsaW5nCisJICBjbGVhciB0aGUgc3RydWN0LCBhbmQgcHJvdmlkZSBhIGNvcnJlY3QgZXJyb3IgbWVzc2FnZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTMzNworCisyMDEyLTA3LTA1IDE4OjAyOjI3ICswMjAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBoYW5kbGUgcmV0dXJuIHZhbHVlIC1FTk9UVFkgZm9yIHVuaW1wbGVtZW50ZWQgVklESU9DX0dfUEFSTQorCSAgTmV3ZXIga2VybmVscyByZXR1cm4gLUVOT1RUWSwgb2xkZXIga2VybmVscyByZXR1cm4gLUVJTlZBTCBpZiB0aGUgaW9jdGwKKwkgIGlzIG5vdCBpbXBsZW1lbnRlZC4gV2l0aCB0aGlzIHBhdGNoLCBHU3RyZWFtZXIgaGFuZGxlcyBib3RoIGNhc2VzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5ODgyNQorCisyMDEzLTA0LTMwIDA5OjE2OjA3ICswMjAwICBNaWNoYWVsIE9sYnJpY2ggPG0ub2xicmljaEBwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogZml4IGJyb2tlbiBib29sZWFuIGV4cHJlc3Npb24gdG8gZGV0ZWN0IG5vbi1mcmFtZSBidWZmZXJzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk5Mjk0CisKKzIwMTMtMDQtMjkgMTE6MDc6NTYgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IEJldHRlciBlcnJvciBtZXNzYWdlIHdoZW4gc2VydmVyIHZlcnNpb24gaXMgdG9vIG9sZAorCSAgV2UgY2hlY2sgZm9yIHRoZSBsaWJyYXJ5IHZlcnNpb24gYXQgY29uZmlndXJlIHRpbWUsIGJ1dCB0aGUgc2VydmVyCisJICB2ZXJzaW9uIGNhbiBvbmx5IHJlYWxseSBiZSBjaGVja2VkIGF0IHJ1bi10aW1lLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5ODc2OAorCisyMDEzLTA0LTI3IDExOjI0OjM4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvdWRwL2dzdHVkcC5jOgorCSAgdWRwOiBsb2cgV0FSTklORyBkZWJ1ZyBtZXNzYWdlIGlmIFVEUCBtdWx0aWNhc3QgaXMgbGlrZWx5IHRvIGJlIGJyb2tlbgorCisyMDEzLTA0LTI3IDExOjE2OjU0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBhZGQgaW5jbHVkZXMgdG8gZ2V0IHNvY2tsZW5fdCBkZWZpbmVkIG9uIFdpbmRvd3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTI0MDAKKworMjAxMy0wNC0yNyAwOTozOTo0NSArMDEwMCAgWXVyeSBEZWxlbmRpayA8YXN5bmMucHJvY2Vzc2luZ2pzQHlhaG9vLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgc3VwcG9ydCBmb3IgVlA2RiBWUDYgZmxhc2ggY29kZWMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTkwMTAKKworMjAxMi0wOS0wNSAxNjozOTozMSArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBhbHNvIHBvbGwgZm9yIG91dHB1dCBkZXZpY2VzCisJICBOb3RlIHRoYXQgdGhlIFY0TDIgQVBJIGRlZmluZXMgdGhhdCBmb3Igb3V0cHV0IGRldmljZXMgUE9MTE9VVAorCSAgaW5kaWNhdGVzIHRoYXQgYSBidWZmZXIgaXMgcmVhZHkgdG8gYmUgZGVxdWV1ZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk4OTkyCisKKzIwMTItMDgtMjAgMDk6NTI6MzQgKzAyMDAgIFBoaWxpcHAgWmFiZWwgPHAuemFiZWxAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IGZpeCBjb3B5aW5nIG9mIGVuY29kZWQgYnVmZmVycworCSAgVGhlIGV4aXN0ZW5jZSBvZiBhIEdzdFZpZGVvRm9ybWF0SW5mbyBkb2VzIG5vdCBndWFyYW50ZWUsIHRoYXQKKwkgIHRoZSBidWZmZXIgY29udGFpbnMgdmlkZW8gZnJhbWVzLCBzbyB0aGUgZm9ybWF0IG11c3QgYmUgY2hlY2tlZC4KKwkgIEFsc28sIGZvciBlbmNvZGVkIGJ1ZmZlcnMgdGhlIGxlbmd0aCBpcyB2YXJpYWJsZSBhbmQgbXVzdCBiZSBzZXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk4OTQ5CisKKzIwMTItMDctMTAgMTU6Mjk6NDAgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBhZGQgc3VwcG9ydCBmb3IgbXBlZzQgYW5kIEguMjYzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk4ODI2CisKKzIwMTMtMDQtMjYgMTI6MTY6NDkgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSAgbW9ub3Njb3BlOiBGaXggZGVidWcgc3RhdGVtZW50CisKKzIwMTMtMDQtMjUgMjE6NTA6MzMgKzAyMDAgIEFsZXhhbmRlciBTY2hyYWIgPG1lcm9zQG1lcm9zLWRlc2t0b3AuKG5vbmUpPgorCisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuaDoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsYXdkZWMuYzoKKwkgIG11bGF3ZGVjOiBjaGFuZ2UgYmFzZSBjbGFzcyB0byBHc3RBdWRpb0RlY29kZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTg4OTQKKworMjAxMy0wNC0yNSAyMDo1OTo1MiArMDIwMCAgTWF0aGlldSBEdXBvbmNoZWxsZSA8bWF0aGlldS5kdXBvbmNoZWxsZUBlcGl0ZWNoLmV1PgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuaDoKKwkgIHZpZGVvbWl4ZXI6IHNlbmQgc3RyZWFtLXN0YXJ0IGV2ZW50LgorCisyMDEyLTEwLTE4IDEwOjM3OjM1ICswMjAwICBQaGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBoYW5kbGUgRU5PREFUQSByZXR1cm4gdmFsdWUgZm9yIFZJRElPQ19FTlVNU1RECisJICBJbiBrZXJuZWwgdjMuNy1yYzEsIFZJRElPQ19FTlVNU1REIHJldHVybnMgRU5PREFUQSBpZiB0aGUgY3VycmVudCBpbnB1dAorCSAgZG9lcyBub3Qgc3VwcG9ydCB0aGUgU1REIEFQSS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTg4MjcKKworMjAxMy0wNC0yNSAxMzoxOTozNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBidnBheS5jOgorCSAgZG9jczogYWRkIHNvbWUgcGF5L2RlcGF5bG9hZGVycworCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01NTE2MzEKKworMjAxMy0wNC0yNSAxMjo0NDoxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWxhd2VuYy5jOgorCSAgbXVsYXc6IFNvbWUgbWlub3IgbWVtbGVhayBmaXhlcyBhbmQgY2xlYW51cAorCisyMDEzLTA0LTI0IDEzOjU2OjU2ICswMjAwICBBbGV4YW5kZXIgU2NocmFiIDxhbGV4YXNAYXhpcy5jb20+CisKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5oOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWxhd2VuYy5jOgorCSAgbXVsYXdlbmM6IGNoYW5nZSB0byBnc3RhdWRpb2VuY29kZXIgYmFzZSwgYWRkZWQgYml0cmF0ZSB0YWdzCisKKzIwMTItMDUtMDMgMTY6MDc6MjcgKzAyMDAgIE1pY2hhZWwgT2xicmljaCA8bS5vbGJyaWNoQHBlbmd1dHJvbml4LmRlPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMjogYnVmZmVycG9vbDogcmVzZXQgYnVmZmVyIHNpemUgaW4gcmVsZWFzZV9idWZmZXIKKwkgIFRoZSBidWZmZXIgbWlnaHQgc3RpbGwgYmUgaW4gdXNlIGVsc2V3aGVyZSB3aGVuIGRlcXVldWluZyBidWZmZXJzIGZvcgorCSAgb3V0cHV0cy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTg4MjIKKworMjAxMi0wNC0yMCAwOTo1MzozNSArMDIwMCAgTWljaGFlbCBPbGJyaWNoIDxtLm9sYnJpY2hAcGVuZ3V0cm9uaXguZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBidWZmZXJwb29sOiByZW1vdmUgdW51c2VkIGluY2x1ZGVzCisJICBUaGUgaGFja3MgdGhhdCBuZWVkZWQgdGhlc2UgYXJlIGxvbmcgZ29uZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTg4MjEKKworMjAxMy0wNC0yNSAxMjoxMjoyMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgKG11bHRpKXVkcHNpbms6IFVzZSBzZXBhcmF0ZSBzb2NrZXRzIGZvciBJUHY0IGFuZCBJUHY2CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTM0MjQzCisKKzIwMTMtMDQtMjUgMTA6NDQ6NDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5oOgorCSAgZHludWRwc2luazogVXNlIHNlcGFyYXRlIHNvY2tldHMgZm9yIElQdjQgYW5kIElQdjYKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01MzQyNDMKKworMjAxMy0wNC0yNSAxMDo0Mzo1NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvTWFrZWZpbGUuYW06CisJICB1ZHA6IERvbid0IGluY2x1ZGUgcmVtb3ZlZCBnc3R1ZHAuaCBpbiBub2luc3RfSEVBREVSUworCisyMDEzLTA0LTE3IDE2OjQ3OjMxIC0wNzAwICBUb2RkIEFndWxuaWNrIDx0b2RkQGFndWxuaWNrLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSAgb3N4YXVkaW86IFVzZSBnc3RfYXVkaW9fY2hhbm5lbF9wb3NpdGlvbnNfdG9fbWFzaygpIHRvIGNyZWF0ZSBtYXNrCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk4ODA3CisKKzIwMTMtMDQtMTcgMTY6MTI6MjYgLTA3MDAgIFRvZGQgQWd1bG5pY2sgPHRvZGRAYWd1bG5pY2suY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJICBvc3hhdWRpbzogUmVtb3ZlIHVudXNlZCBjb2RlCisKKzIwMTMtMDQtMjUgMDk6MTY6MTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmg6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSogZ3N0L3VkcC9nc3R1ZHAuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5oOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkgIHVkcDogUmVtb3ZlIHVudXNlZCBlbnVtIHR5cGUKKworMjAxMy0wNC0yNSAwOToxMzo1MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvTWFrZWZpbGUuYW06CisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcC1tYXJzaGFsLmxpc3Q6CisJICB1ZHA6IFVzZSB0aGUgZ2VuZXJpYyBtYXJzaGFsbGVyIGluc3RlYWQgb2YgZ2VuZXJhdGluZyBtYXJzaGFsbGVycworCisyMDEzLTA0LTI1IDA5OjA3OjQxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmg6CisJICB1ZHBzcmM6IFJlbmFtZSBpbnN0YW5jZSB2YXJpYWJsZSBmcm9tIGhvc3QgdG8gbXVsdGlfZ3JvdXAKKwkgIFRoaXMgaXMgbW9yZSBjb25zaXN0ZW50IGFzIGl0J3MgdXNlZCBmb3IgdGhlIG11bHRpY2FzdC1ncm91cCBwcm9wZXJ0eS4KKworMjAxMy0wNC0yNSAwOTowMzo1NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IEFkZCBiaW5kLWFkZHJlc3MgcHJvcGVydHkKKwkgIFRoaXMgaXMgZXF1aXZhbGVudCB0byBtdWx0aWNhc3QtZ3JvdXAgY3VycmVudGx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKwkgIEluIDIuMCB0aGlzIHNob3VsZCBiZSBoYW5kbGVkIHNlcGFyYXRlbHksIHRoZSBmb3JtZXIgb25seSBiZWluZyB0aGUgbXVsdGljYXN0CisJICBncm91cCBhbmQgdGhlIGxhdHRlciBhbHdheXMgYmVpbmcgdGhlIGFkZHJlc3MgdGhlIHNvY2tldCBpcyBib3VuZCB0bywgZXZlbiBpZgorCSAgYSBtdWx0aWNhc3QgZ3JvdXAgaXMgZ2l2ZW4uCisKKzIwMTMtMDQtMjQgMTY6MjQ6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJICB2cmF3ZGVwYXk6IHJldHVybiBvdXRwdXQgYnVmZmVyIGZyb20gcHJvY2VzcworCSAgUmV0dXJuIHRoZSBvdXRwdXQgYnVmZmVyIGZyb20gdGhlIHByb2Nlc3MgZnVuY3Rpb24gaW5zdGVhZCBvZiBwdXNoaW5nCisJICBpdCBvdXJzZWx2ZXMuIFRoaXMgd2F5LCB0aGUgc3ViY2xhc3MgY2FuIGFjdHVhbGx5IGRlYWwgd2l0aCB0aGUgcmV0dXJuCisJICB2YWx1ZSBvZiB0aGUgcHVzaC4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTM3MjcKKworMjAxMi0xMC0wMSAwOToyOToyMSAtMDMwMCAgRGlvZ28gQ2FyYm9uZXJhIEx1dml6b24gPGRpb2dvLmx1dml6b25AZW5zaXRlYy5jb20uYnI+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IHNhdmUgdGhlIGZvcm1hdCBjb3JyZWN0bHkKKwkgIElmIFRSWV9GTVQgaXMgbm90IGltcGxlbWVudGVkLCAgZ3N0X3Y0bDJfb2JqZWN0X2dldF9uZWFyZXN0X3NpemUgd2lsbAorCSAgdXNlIFNfRk1UIGFuZCB3aWxsIGNoYW5nZSB0aGUgZGV2aWNlJ3Mgb3BlcmF0aW9uIG1vZGUuIFRvIHNhdmUgdGhlCisJICBvbGQgZGV2aWNlIG1vZGUgd2UgbmVlZCB0byBzZXQgdGhlIHR5cGUgZmllbGQgb3IgZWxzZSBpdCB3aWxsIGZhaWwKKwkgIHRvIHNhdmUgdGhlIHByZXZpb3VzIGZvcm1hdC4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODUyMDkKKworMjAxMy0wNC0yNCAxNTozODo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBidmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5jOgorCSAgcnRwOiBhIG1hcmtlciBiaXQgc2hvdWxkIHRyYW5zbGF0ZSB0byBSRVNZTkMKKwkgIEEgbWFya2VyIGJpdCBvbiBhbiBhdWRpbyBwYWNrZXQgZG9lcyBub3QgbWVhbiBhIERJU0NPTlQgKGluIHRoZSBHU3RyZWFtZXIgc2Vuc2UKKwkgIG9mIG1pc3NpbmcgZGF0YSkgYnV0IGl0IG1lYW5zIHRoYXQgdGhlIHBhY2tldCBpcyB0aGUgZW5kIG9mIGEgdGFsa3NwdXJ0IGFuZCB0aHVzCisJICBhIGdvb2Qgb3Bwb3J0dW5pdHkgdG8gcmVzeW5jIHRvIHRoZSBjbG9jay4gVXNlIHRoZSBSRVNZTkMgYnVmZmVyIGZsYWcgdG8gbm90ZQorCSAgdGhpcy4KKwkgIFJlYWwgZGlzY29udGludWl0aWVzIGFyZSBtYXJrZWQgd2l0aCBESVNDT05UIHN0aWxsIHdoZW4gdGhlIHNlcW51bSBoYXMgYSBHQVAgb3IKKwkgIHdoZW4gdGhlIGlucHV0IGJ1ZmZlciBoYXMgdGhlIERJU0NPTlQgZmxhZyBzZXQuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjI3MjA0CisKKzIwMTMtMDQtMjIgMjM6NTE6MzggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIE1BSU5UQUlORVJTOgorCSogUkVBRE1FOgorCSogUkVBRE1FLnN0YXRpYy1saW5raW5nOgorCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDNjYjNkM2MgdG8gNWVkY2Q4NQorCisyMDEzLTA0LTIyIDEwOjE5OjI5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkgIHJ0cGpwZWdkZXBheTogRHJvcCBmcmFtZSBpZiBpdCdzIGxlc3MgdGhhbiAyIGJ5dGVzIGxhcmdlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc3NTYwCisKKzIwMTMtMDQtMTggMTI6MjA6MDggKzAzMDAgIFNyZWVyZW5qIEJhbGFjaGFuZHJhbiA8c3JlZXJlbmouYmFsYWNoYW5kcmFuQGludGVsLmNvbT4KKworCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkgIGF1dG9kZXRlY3Q6IHVzZSBfcGx1Z2luX2ZlYXR1cmVfcmFua19jb21wYXJlIEFQSSBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIHRoZSBjb2RlLgorCisyMDEzLTA0LTE4IDA5OjM3OjMwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5oOgorCSAgb3N4YXVkaW86IEluY2x1ZGUgZ3N0YXVkaW9yaW5nYnVmZmVyLmggdG8gZml4IGNvbXBpbGF0aW9uIGluIDEuMAorCisyMDEzLTA0LTE3IDIxOjA1OjE0ICswMjAwICBQaGlsaXBwZSBOb3JtYW5kIDxwaGlsbkBpZ2FsaWEuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJICBvc3hhdWRpb3Npbms6IGNoYW5uZWwtbWFzayBjb25maWd1cmF0aW9uIGZpeGVzCisJICBTZXQgY2hhbm5lbC1tYXNrIGFjY29yZGluZyB0byBzaW5rJ3MgbGF5b3V0IGluIGNhc2Ugb2Ygc3RlcmVvIGxheW91dC4KKwkgIEFsc28gaW5pdGlhbGl6ZSBhbmQgcmVzZXQgdGhlIG1hc2sgd2hlbiBhbiB1bnJlY29nbml6ZWQgY2hhbm5lbCBpcyBkZXRlY3RlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTgyMjQKKworMjAxMy0wNC0xNSAxOTo1MzoyOCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMnNyYzogRGlzYWJsZSByZW5lZ290aWF0aW9uIGluIHRoZSBuZWdvdGlhdGUgbWV0aG9kCisJICBUaGlzIHdheSwgd2UgZG9uJ3QgYmxvY2sgdGhlIGluaXRpYWwgbmVnb3RpYXRpb24uCisJICBUaGFua3MgdG8gSmVyZW15IFdoaXRpbmcgZm9yIGRvaW5nIGFsbCB0aGUgdGVzdGluZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU5ODEKKworMjAxMy0wNC0xNSAxOTo0NjoxMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgUmV2ZXJ0ICJ2NGwyOiBkaXNhYmxlIHJlbmVnb3RpYXRpb24iCisJICBUaGlzIHJldmVydHMgY29tbWl0IGQxYjI2ZTFkNTk0YWIyYjYzMzI0ZTQzYTM2MzMwNDc1ZTk4Y2RmMTguCisJICBUaGlzIGNhdXNlcyB0aGUgaW5pdGlhbCBuZWdvdGlhdGlvbiB0byBuZXZlciBoYXBwZW4gaWYgYSByZWNvbmZpZ3VyZQorCSAgZXZlbnQgaXMgcmVjZWl2ZWQgYWZ0ZXIgZ3N0X2Jhc2Vfc3JjX3N0YXJ0X2NvbXBsZXRlKCkgYnV0IGJlZm9yZSB0aGUgbG9vcAorCSAgc3RhcnRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTk4MQorCisyMDEzLTA0LTE3IDIxOjEyOjU1ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6CisJICBmbGFjdGFnOiBmb3J3YXJkIGNhcHMgZXZlbnQKKwkgIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBkb3duc3RyZWFtIGVsZW1lbnQgd2lsbCBnZXQgdGhlIGV2ZW50IGFuZCBuZWdvdGlhdGVzLiBBZGQKKwkgIGEgRklYTUUgZm9yIHVwZGF0aW5nIHRoZSBzdHJlYW1oZWFkZXIgZmllbGQgb24gdGggY2Fwcy4KKworMjAxMy0wNC0xNyAwNzo1MDoyNyArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOgorCSAgZmxhYzogYWRkIG1vcmUgbG9nZ2luZworCisyMDEzLTA0LTE3IDIwOjI0OjQ4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2NvbW1vbi5oOgorCSAgb3N4YXVkaW86IEZpeCBtZXJnZSBjb25mbGljdHMKKworMjAxMy0wNC0xNyAxMDoxMDo0NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIG9zeGF1ZGlvOiBGaXggY29uZmlndXJlIGNoZWNrIGZvciBvc3hhdWRpbyBwbHVnaW4KKworMjAxMy0wNC0xNyAwOTo1MDo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3JpbmdidWZmZXIuYzoKKwkgIG9zeGF1ZGlvcmluZ2J1ZmZlcjogRmlyc3QgY2hlY2sgdGhlIHR5cGUsIHRoZW4gY2FzdAorCisyMDEzLTA0LTE2IDIyOjQ2OjAwICswOTAwICBUYWthc2hpIE5ha2FqaW1hIDx0ZWQubmFrYWppbWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9yaW5nYnVmZmVyLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmg6CisJICBvc3hhdWRpbzogdXNlIEdTVF9JU19PU1hfQVVESU9fU0lOSyBpbiByaW5nIGJ1ZmZlci4KKworMjAxMy0wNC0xMCAyMTowNjoxNiArMDkwMCAgVGFrYXNoaSBOYWthamltYSA8dGVkLm5ha2FqaW1hQGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5oOgorCSAgb3N4YXVkaW86IGNhbGwgc2V0X2NoYW5uZWxfcG9zaXRpb25zKCkgaW4gb3N4YXVkaW9yaW5nYnVmZmVyIGFjcXVpcmUoKQorCisyMDEzLTA0LTEyIDEyOjE4OjA0IC0wNzAwICBUb2RkIEFndWxuaWNrIDx0b2RkQGFndWxuaWNrLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jOgorCSAgb3N4YXVkaW86IHVzZSBHU1RfQVVESU9fSU5GT18qIGFjY2Vzc29ycworCSAgQ2hhbmdlcyBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6CisJICAqIFVwZGF0ZSBjbGFzc25hbWUgcmVmZXJlbmNlcworCSAgKiBSZXBsYWNlIEdTVF9CT0lMRVJQTEFURV9GVUxMIHdpdGggR19ERUZJTkVfVFlQRQorCSAgKiBVc2UgbmV3IEdzdEF1ZGlvSW5mbyBzdHJ1Y3QgYW5kIG1ldGhvZHMKKwkgICogVXNlIG5ldyBidWZmZXIgbWVtb3J5IGFsbG9jYXRpb24gc2NoZW1lCisJICBDb25mbGljdHM6CisJICBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9yaW5nYnVmZmVyLmMKKworMjAxMy0wNC0xMiAxMTo1MTo0NiAtMDcwMCAgVG9kZCBBZ3VsbmljayA8dG9kZEBhZ3Vsbmljay5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9oYWwuYzoKKwkgIG9zeGF1ZGlvOiBhZGp1c3QgZm9yIGNoYW5nZXMgdG8gZ2xpYiBtdXRleCBhcGkuCisKKzIwMTMtMDQtMTAgMDE6MjE6NDkgKzA5MDAgIFRha2FzaGkgTmFrYWppbWEgPHRlZC5uYWthamltYUBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSAgb3N4YXVkaW86IHRyeSB0byBmaXggdXAgYWNjb3JkaW5nIHRvIFNlYmFzdGlhbidzIGNvbW1lbnRzCisKKzIwMTMtMDQtMDUgMTA6MDI6MzggKzAyMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBoaWxuQGlnYWxpYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3JpbmdidWZmZXIuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5oOgorCSAgb3N4YXVkaW86IGJ1aWxkIGZpeGVzCisJICBFbmFibGUgdGhlIG9zeGF1ZGlvIHBsdWdpbiBidWlsZCBpbiBjb25maWd1cmUuYWMgYW5kIGZpeCBzb21lCisJICBpbmNsdWRlIGRpcmVjdGl2ZSBvcmRlciBpc3N1ZXMuCisKKzIwMTMtMDQtMDIgMjI6Mjg6MDkgKzA5MDAgIHRlZC1uIDx0ZWQubmFrYWppbWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkgIG9zeGF1ZGlvOiBmaXggbGF5b3V0IGZvciBvc3hhdWRpb3NyYworCisyMDEzLTAzLTMwIDIyOjQ5OjM0ICswOTAwICB0ZWQtbiA8dGVkLm5ha2FqaW1hQGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvZWxlbWVudC5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uaDoKKwkgIG9zeGF1ZGlvOiBwb3J0IHRvIHYuMS4wCisKKzIwMTMtMDQtMTYgMTk6Mjk6NDggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBEb24ndCB1bnJlZiBxdWVyeSwgd2UgZG9uJ3Qgb3duIGl0CisJICBGaXhlcyBkb3VibGUtdW5yZWYgYnVnLiBCdWcgZm91bmQgYnkgWW91bmVzcyBBbGFvdWkKKworMjAxMy0wNC0xNiAyMDo0MToxMCArMDIwMCAgUGhpbGlwcGUgTm9ybWFuZCA8cGhpbG5AaWdhbGlhLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBmaXggU0NIRURVTElORyBxdWVyeSBzdXBwb3J0CisJICBDaGFpbiB0aGUgcXVlcnkgdXAgdG8gcGFyZW50IGJlZm9yZSBhZGRpbmcgX0JBTkRXSURUSF9MSU1JVEVEIGZsYWcsCisJICBzbyB0aGF0IGFsbCB0aGUgb3RoZXIgZmxhZ3MgZ2V0IHNldCwgYW5kIHB1c2ggbW9kZSBnZXRzIGFkZGVkIGFzCisJICBzdXBwb3J0ZWQgYWN0aXZhdGlvbiBtb2RlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MzQ4NAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5ODE1NgorCisyMDEzLTAzLTMxIDEyOjA1OjQ5ICswMjAwICBQaGlsaXBwZSBOb3JtYW5kIDxwaGlsbkBpZ2FsaWEuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IGJhc2ljIHNjaGVkdWxpbmcgcXVlcnkgc3VwcG9ydAorCSAgQW5zd2VyIHRvIHNjaGVkdWxpbmcgcXVlcmllcyB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyBhbmQgdGhlIG5ldworCSAgX0JBTkRXSURUSF9MSU1JVEVEX0ZMQUcgc28gdGhhdCBkb3duc3RyZWFtIGlzIGFkdmlzZWQgdG8gbWluaW1pemUgc2VlaworCSAgb3BlcmF0aW9ucyBhbmQgcGVyZm9ybSBvbi1kaXNrIGJ1ZmZlcmluZyBpZiBwb3NzaWJsZS4KKwkgIEJ1ZyA2OTM0ODQKKworMjAxMy0wNC0xNSAxNDozMjo0NiArMDAwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiBmaXggc2VnZmF1bHQgYWNjZXNzaW5nIG9zeHdpbmRvdyB3aGVuIG5vdCBzZXQgeWV0CisKKzIwMTItMTAtMjQgMTI6MTQ6NTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvYWFsaWIvTWFrZWZpbGUuYW06CisJKiBleHQvY2Fpcm8vTWFrZWZpbGUuYW06CisJKiBleHQvZHYvTWFrZWZpbGUuYW06CisJKiBleHQvZmxhYy9NYWtlZmlsZS5hbToKKwkqIGV4dC9nZGtfcGl4YnVmL01ha2VmaWxlLmFtOgorCSogZXh0L2phY2svTWFrZWZpbGUuYW06CisJKiBleHQvanBlZy9NYWtlZmlsZS5hbToKKwkqIGV4dC9saWJjYWNhL01ha2VmaWxlLmFtOgorCSogZXh0L2xpYnBuZy9NYWtlZmlsZS5hbToKKwkqIGV4dC9taWttb2QvTWFrZWZpbGUuYW06CisJKiBleHQvcHVsc2UvTWFrZWZpbGUuYW06CisJKiBleHQvcmF3MTM5NC9NYWtlZmlsZS5hbToKKwkqIGV4dC9zaG91dDIvTWFrZWZpbGUuYW06CisJKiBleHQvc291cC9NYWtlZmlsZS5hbToKKwkqIGV4dC9zcGVleC9NYWtlZmlsZS5hbToKKwkqIGV4dC90YWdsaWIvTWFrZWZpbGUuYW06CisJKiBleHQvdnB4L01ha2VmaWxlLmFtOgorCSogZXh0L3dhdnBhY2svTWFrZWZpbGUuYW06CisJKiBnc3QvYWxwaGEvTWFrZWZpbGUuYW06CisJKiBnc3QvYXBldGFnL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9wYXJzZXJzL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1cGFyc2UvTWFrZWZpbGUuYW06CisJKiBnc3QvYXV0b2RldGVjdC9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdmkvTWFrZWZpbGUuYW06CisJKiBnc3QvY3V0dGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L2RlYnVndXRpbHMvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW06CisJKiBnc3QvZHRtZi9NYWtlZmlsZS5hbToKKwkqIGdzdC9lZmZlY3R2L01ha2VmaWxlLmFtOgorCSogZ3N0L2VxdWFsaXplci9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHYvTWFrZWZpbGUuYW06CisJKiBnc3QvZmx4L01ha2VmaWxlLmFtOgorCSogZ3N0L2dvb20vTWFrZWZpbGUuYW06CisJKiBnc3QvZ29vbTJrMS9NYWtlZmlsZS5hbToKKwkqIGdzdC9pY3lkZW11eC9NYWtlZmlsZS5hbToKKwkqIGdzdC9pZDNkZW11eC9NYWtlZmlsZS5hbToKKwkqIGdzdC9pbWFnZWZyZWV6ZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9pbnRlcmxlYXZlL01ha2VmaWxlLmFtOgorCSogZ3N0L2lzb21wNC9NYWtlZmlsZS5hbToKKwkqIGdzdC9sYXcvTWFrZWZpbGUuYW06CisJKiBnc3QvbGV2ZWwvTWFrZWZpbGUuYW06CisJKiBnc3QvbWF0cm9za2EvTWFrZWZpbGUuYW06CisJKiBnc3QvbW9ub3Njb3BlL01ha2VmaWxlLmFtOgorCSogZ3N0L211bHRpZmlsZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9tdWx0aXBhcnQvTWFrZWZpbGUuYW06CisJKiBnc3QvcmVwbGF5Z2Fpbi9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwbWFuYWdlci9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHNwL01ha2VmaWxlLmFtOgorCSogZ3N0L3NoYXBld2lwZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9zbXB0ZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9zcGVjdHJ1bS9NYWtlZmlsZS5hbToKKwkqIGdzdC91ZHAvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9ib3gvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9jcm9wL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3Qvd2F2ZW5jL01ha2VmaWxlLmFtOgorCSogZ3N0L3dhdnBhcnNlL01ha2VmaWxlLmFtOgorCSogZ3N0L3k0bS9NYWtlZmlsZS5hbToKKwkqIHN5cy9kaXJlY3Rzb3VuZC9NYWtlZmlsZS5hbToKKwkqIHN5cy9vc3MvTWFrZWZpbGUuYW06CisJKiBzeXMvb3NzNC9NYWtlZmlsZS5hbToKKwkqIHN5cy9vc3hhdWRpby9NYWtlZmlsZS5hbToKKwkqIHN5cy9vc3h2aWRlby9NYWtlZmlsZS5hbToKKwkqIHN5cy9zdW5hdWRpby9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3dhdmVmb3JtL01ha2VmaWxlLmFtOgorCSogc3lzL3hpbWFnZS9NYWtlZmlsZS5hbToKKwkgIGdzdDogQWRkIGJldHRlciBzdXBwb3J0IGZvciBzdGF0aWMgcGx1Z2lucworCisyMDEzLTA0LTEyIDE5OjI2OjExICswMDAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBnc3QvZ29vbTJrMS9NYWtlZmlsZS5hbToKKwkgIGdvb20yazE6IGZpeCBkdXBsaWNhdGVkIHN5bWJvbCB3aXRoIGdvb20KKworMjAxMy0wMy0xMCAxNzoxNzoxNyArMDAwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50LmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvY29tbW9uLmg6CisJICBvc3hhdWRpbzogRml4ZXMgZXJyb3I6ICJHU1RfTEVWRUxfREVGQVVMVCIgcmVkZWZpbmVkCisKKzIwMTMtMDMtMTAgMTc6Mjc6MzAgKzAwMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2hhbC5jOgorCSAgb3N4YXVkaW86IGZpeGVzIGltcGxpY2l0IGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9uICdnZXRwaWQnCisKKzIwMTMtMDQtMTQgMTc6NTU6MDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGF1dG9nZW4uc2g6CisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gYWVkODdhZSB0byAzY2IzZDNjCisKKzIwMTMtMDQtMTQgMTI6MzI6MDYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IGFkZCBiYWNrICJpcmFkaW8tbW9kZSIgcHJvcGVydHkgdG8gZGlzYWJsZSBzZW5kaW5nIG9mIGljZWNhc3QgcmVxdWVzdCBoZWFkZXJzCisJICBJbiAxLjAgd2Ugbm93IGFsd2F5cyBzZW5kIHRoZSBpY2VjYXN0IHJlcXVlc3QgaGVhZGVycyBieSBkZWZhdWx0LCB3aGljaAorCSAgbWFrZXMgdGhlIHNlcnZlciBzZW5kIGljZWNhc3RzIG1ldGFkYXRhIGluc2VydGVkIGludG8gdGhlIHN0cmVhbSBpZiBpdAorCSAgc3VwcG9ydHMgdGhhdC4gSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgdXNlIGNhc2VzIHdoZXJlIHRoaXMgaXMgbm90CisJICBkZXNpcmFibGUsIGxpa2Ugd2hlbiBqdXN0IHNhdmluZyBhIHJhZGlvIHN0cmVhbSB0byBkaXNrLCBzbyBhZGQgYmFjaworCSAgdGhlICJpcmFkaW8tbW9kZSIgcHJvcGVydHkgdG8gYWxsb3cgcGVvcGxlIHRvIGRpc2FibGUgdGhpcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTc5ODQKKworMjAxMy0wNC0xMiAxNjoxNjo0MSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkgIHJ0cDogcmVnaXN0ZXIgdGFnIGltYWdlIHR5cGVzCisJICBUaGUgcnRwZ3N0ZGVwYXkgbmVlZHMgdGhlIHR5cGUgdG8gYmUgYXZhaWxhYmxlIGluIG9yZGVyIHRvIGRlc2VyaWFsaXplIHRoZQorCSAgZXZlbnQuCisKKzIwMTMtMDQtMTIgMTY6MDg6NTggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkgIHJ0cGdzdGRlcGF5OiBoYW5kbGUgZXZlbnQgcGFyc2UgZmFpbHVyZXMgYmV0dGVyCisKKzIwMTMtMDQtMTEgMjI6MjU6MDUgKzAzMDAgIEFudG9uIEJlbGthIDxhbnRvbmJlbGthQGdtYWlsLmNvbT4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkgIHdhdmVuYzogYWRkIFRPQyBzZXR0ZXIgc3VwcG9ydAorCisyMDEzLTA0LTEyIDEyOjMxOjMwICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSAgd2F2ZW5jOiBzbWFsbCBjbGVhbnVwcyBmb3IgdG9jIGhhbmRsaW5nCisJICBEb24ndCBhZGQgZW1wdHkgbGFibC9ub3RlIGNodW5rcy4gQWx3YXlzIHBhc3MgaW5zdGFuY2UgYXMgdGhlIGZpcnN0IHBhcmFtLiBBZGQgbW9yZSBsb2dnaW5nLgorCisyMDEzLTA0LTEyIDEyOjU4OjUwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogUHJveHkgdGhlIG50cC1zeW5jIHByb3BlcnR5IG9mIHJ0cGJpbgorCisyMDEzLTA0LTEyIDEyOjUxOjA1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogR2l2ZSB0aGUgbWFuYWdlciBhbHdheXMgdGhlIG5hbWUgIm1hbmFnZXIiCisJICBUaGlzIGFsbG93cyB0byB1c2UgdGhlIEdzdENoaWxkUHJveHkgaW50ZXJmYWNlIHRvIGFkanVzdAorCSAgcHJvcGVydGllcyBvbiBpdC4KKworMjAxMy0wNC0xMSAyMjo1MzoyOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYWxwaGFjb2xvci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXBldjJtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM3YybXV4LmM6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy5jOgorCSAgdGVzdHM6IGZpeCBzb21lIHByaW50ZiBmb3JtYXQgaXNzdWVzIGluIGRlYnVnIG1lc3NhZ2VzCisKKzIwMTMtMDQtMTEgMTk6Mjc6MTUgKzAzMDAgIEFudG9uIEJlbGthIDxhbnRvbmJlbGthQGdtYWlsLmNvbT4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmg6CisJICB3YXZlbmM6IGFkZCAnbm90ZScgY2h1bmsgc3VwcG9ydAorCisyMDEzLTA0LTExIDIwOjQ2OjI2ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGFkZCBhIGxpdHRsZSBtb3JlIGRvY3MgdG8gdGhlIGF1ZGlvY2xvY2sKKworMjAxMy0wNC0xMSAxNTowMDowNSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBhZGQgc3VwcG9ydCBmb3IgTmV0Q2xpZW50Q2xvY2sKKwkgIFdoZW4gdGhlIHNlcnZlciBzdWdnZXN0cyBhIEdzdE5ldFRpbWVQcm92aWRlciBpbiB0aGUgU0RQLCBzZXQgdXAgYQorCSAgR3N0TmV0Q2xpZW50Q2xvY2sgdGhhdCBzbGF2ZXMgdG8gdGhlIHJlbW90ZSBjbG9jayBhbmQgc3VnZ2VzdCB0aGlzIGNsb2NrIGluCisJICBwcm92aWRlX2Nsb2NrLgorCisyMDEzLTA0LTExIDE0OjU3OjExICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkgIHVkcHNpbms6IGF2b2lkIGFsbG9jIGFuZCBmcmVlIGluIHJlbmRlciBmdW5jdGlvbgorCSAgQXZvaWQgZG9pbmcgYWxsb2MgYW5kIGZyZWUgaW4gdGhlIHJlbmRlciBmdW5jdGlvbiBmb3IgZWFjaCBidWZmZXIuIEluc3RlYWQsCisJICBhbGxvY2F0ZSB0aGUgbmVlZGVkIGFycmF5cyBpbiBfaW5pdCBhbmQgdXNlIHRob3NlLgorCisyMDEzLTA0LTEwIDA4OjM2OjAwICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdmVwYXJzZTogcmVtb3ZlIHN1cGVyZmx1b3VzIGdfbGlzdF9maXJzdCgpIGNhbGxzCisJICBUaGUgdmFyaWFibGVzIGFscmVhZHkgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaXN0LgorCisyMDEzLTA0LTA5IDIzOjEzOjE4ICswMTAwICBBbmRyZWFzIEZlbmthcnQgPGFuZHJlYXMuZmVua2FydEBzdHJlYW11bmxpbWl0ZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHNiY2RlcGF5LmM6CisJICBydHBzYmNkZXBheTogZml4IHNiYyBmcmFtZSBsZW5ndGggY2FsY3VsYXRpb24gZm9yIG1vbm8gYW5kIHN0ZXJlbyBtb2RlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NzQ2MworCisyMDEzLTAzLTI1IDE0OjM1OjAyICswMzAwICBBbnRvbiBCZWxrYSA8YW50b25iZWxrYUBnbWFpbC5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICB3YXZwYXJzZTogYWRkICdub3RlJyBjaHVuayBzdXBwb3J0CisJICBBZGQgJ25vdGUnIGNodW5rIHN1cHBvcnQgaW4gVE9DIGFzIEdTVF9UQUdfQ09NTUVOVAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NjU0OQorCisyMDEzLTA0LTA4IDE3OjUzOjA5IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBjaGVjayB2YWx1ZSBpbnNpZGUgZW5kYSB0byBzZXQgZW5kaWFubmVzcworCisyMDEzLTA0LTA5IDIxOjAwOjEyICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMDRjN2ExZSB0byBhZWQ4N2FlCisKKzIwMTMtMDQtMDkgMTc6MzQ6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSAgaWN5ZGVtdXg6IGF2b2lkIGNvcHkgd2hlbiB3ZSBjYW4KKworMjAxMy0wNC0wOSAxNjo1MjoyMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIGdzdHBheTogdXNlIGJ1ZmZlcmxpc3QgdG8gYXZvaWQgbWVtY3B5CisKKzIwMTMtMDQtMDkgMTY6NTA6NTYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICB1ZHBzaW5rOiBpbXByb3ZlIGRlYnVnCisKKzIwMTMtMDQtMDkgMDA6Mjg6NTQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhcnNlLmM6CisJICB0ZXN0czogcmVmYWN0b3IgbmV3IHdhdnBhcnNlIHRlc3QgYSBsaXR0bGUKKwkgIFVzZSBmYWtlc3JjIGluc3RlYWQgb2YgZmlsZXNyYyB3aXRoIC9kZXYvbnVsbC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTY2ODQKKworMjAxMy0wNC0wOCAxMTozODozMyArMDIwMCAgQWxleGFuZGVyIFNjaHJhYiA8YWxleGFzQGF4aXMuY29tPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBlcnJvciBvdXQgaWYgd2UgcmVjZWl2ZSBlb3MgYmVmb3JlIGFueSB2YWxpZCBkYXRhCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk2Njg0CisKKzIwMTMtMDQtMDcgMDE6NDc6NTYgKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGZvcmNlIGRlaW50ZXJsYWNpbmcgaW4gImludGVybGFjZWQiIG1vZGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTc0NjcKKworMjAxMy0wNC0wNiAxMjo0NToyOCAtMDMwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBjb2xsYWJvcmEuY29tPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmM6CisJICBnZGtwaXhidWZzaW5rOiBBZGQgdGltZXN0YW1wL3J1bm5pbmctdGltZS9zdHJlYW0tdGltZSB0byB0aGUgZW1pdGVkIG1lc3NhZ2UKKworMjAxMy0wNC0wNSAxNDozODo0MyArMDIwMCAgTmljb2xhIE11cmlubyA8bmljb2xhLm11cmlub0BnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjZGVwYXkuYzoKKwkgIHJ0cHNiY2RlcGF5OiBmaXggcHJpbnRmIGZvcm1hdCBjb21waWxlciB3YXJuaW5ncworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NzM0MworCisyMDEzLTA0LTA1IDA5OjM0OjIzICswMTAwICBUb2RkIEFndWxuaWNrIDx0b2RkQGFndWxuaWNrLmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW86IGluY2x1ZGUgcHRocmVhZC5oIHRvIGZpeCBjb21waWxlciB3YXJuaW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk3MzAzCisKKzIwMTMtMDQtMDQgMjI6NDg6NDUgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmg6CisJICBsZXZlbDogcmVzeW5jIG9uIGRpc2NvbnQKKwkgIERyb3AgcGVuZGluZyBkYXRhIG9uIGRpc2NvbnQgYW5kIHN0YXJ0IGEgbmV3IGN5Y2xlIHdpdGggYSBuZXcgYmFzZSB0aW1lc3RhbXAuCisJICBDbGVhbnVwIHNvbWUgdmFyaWFibGVzLgorCisyMDEzLTA0LTAzIDIzOjUyOjQ3ICswMTAwICBUb20gR3JlZW53b29kIDx0Z3JlZW53b29kQFRvbXMtTWFjQm9vay1Qcm8ubG9jYWw+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZGVjLmM6CisJICB2cDhkZWM6IEltcHJvdmUgbG9nZ2luZyB3aGVuIHZweF9jb2RlY19wZWVrX3N0cmVhbV9pbmZvIGZhaWxzCisJICBEZWNvZGUgZmFpbHVyZXMgYW5kIG1pc3Npbmcga2V5ZnJhbWVzIHNob3VsZCBnZXQgZGlmZmVyZW50IGRlYnVnCisJICBvdXRwdXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk3MjMyCisKKzIwMTMtMDQtMDMgMTg6MjQ6MjkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjZGVwYXkuYzoKKwkgIHJ0cHNiY2RlcGF5OiBSYW5rIGFzIHNlY29uZGFyeQorCSAgVGhpcyB3YXksIGl0IHdpbGwgYmUgc2VsZWN0ZWQgYnkgZGVjb2RlYmluCisJICBCdWcgcmVwb3J0ZWQgYnkgYW5kcmVhcy5mZW5rYXJ0QHN0cmVhbXVubGltaXRlZC5jb20KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTcyMjcKKworMjAxMy0wNC0wMyAxOTowNTozOCArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgbGV2ZWw6IHN1YmRpdmlkZSBidWZmZXJzIGZvciBzYW1wbGUgYWNjdXJhdGUgaW50ZXJ2YWwgaGFuZGxpbmcKKwkgIFByZXZpb3VzbHkgd2Ugd291bGQgc2tpcCBsZXZlbCBtZXNzYWdlIHdoZW4gcHJvY2Vzc2luZyBidWZmZXJzID4gdGhlIHJlcXVlc3RlZAorCSAgaW50ZXJ2YWwuIEFsc28gdGhlIG1lc3NhZ2UgZnJlcXVlbmN5IHdvdWxkIGNvbnRhaW4gcXVpdGUgc29tZSBqaXR0ZXIgZHVlIHRvIG9ubHkKKwkgIGNvbnNpZGVyaW5nIHRoZW0gYXQgdGhlIGVuZCBvZiBidWZmZXJzLgorCSAgQ2xlYW51cCB0aGUgdGVzdHMgd2hpbGUgd2UncmUgYXQgaXQuCisKKzIwMTMtMDMtMTkgMDg6MjM6MjUgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IHJlbW92ZSBvbGQgc2luY2UgY29tbWVudHMgYW5kIHVwZGF0ZSBsb2dnaW5nCisJICBEb24ndCBwcmV0ZW5kIHRoYXQgd2UgaGF2ZSBhIHRpbWVzdGFtcCBvbiBhIGJ1ZmZlciB3aGVuIHdlIG5ldmVyIHNldCBvbmUuCisKKzIwMTMtMDMtMTggMjA6NTk6MjMgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IHJlbW92ZSBvbGQgc2luY2UgY29tbWVudAorCisyMDEzLTA0LTAzIDE3OjUzOjEzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogUHJveHkgdGhlIG11bHRpY2FzdC1pZmFjZSBwcm9wZXJ0eSBvZiB1ZHBzcmMKKworMjAxMy0wNC0wMyAxMTowOTo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGZyZWUgYWxsIHF1ZXVlZCBidWZmZXJzCisJICBEb24ndCBqdXN0IGxvb3Agb3ZlciB0aGUgZmlyc3QgbnVtX3F1ZXVlZCBidWZmZXJzIGJ1dCBsb29wIG92ZXIKKwkgIGFsbCB0aGUgYnVmZmVycyBhbmQgY2hlY2sgaWYgdGhleSBuZWVkIHRvIGJlIGZyZWVkLiBJdCBpcyBwb3NzaWJsZSB0aGF0CisJICBub3QgYWxsIGJ1ZmZlcnMgYXJlIHF1ZXVlZCBhbmQgdGhlbiB0aGUgZW50cnkgaW4gb3VyIGFycmF5IHdpbGwgYmUgTlVMTC4KKwkgIFRob3NlIGJ1ZmZlcnMgdGhhdCBhcmUgbm90IHF1ZXVlZCB3ZXJlIGZyZWVkIGluIHN0b3AoKS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTY2NTEKKworMjAxMy0wNC0wMyAxMTowOTozNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGltcHJvdmUgZGVidWcKKworMjAxMy0wNC0wMiAyMzo0MjoyMyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBydHBzc3JjZGVtdXg6IE9ubHkgZm9yd2FyZCBzdGljayBldmVudHMgd2hpbGUgaG9sZGluZyB0aGUgc2lua3BhZCBzdHJlYW0gbG9jaworCSAgT3RoZXJ3aXNlIHdlIGdldCBhIHJhY2Ugd2hlcmUgaWYgdGhlIFJUQ1AgcGFja2V0IGNvbWVzIGluIGZpcnN0IGFuZCB3aGlsZQorCSAgaXQgaXMgYWRkZWQgdGhlIHBhZHMsIHRoZSBzZWdtZW50IGV2ZW50IGFycml2ZXMgb24gdGhlIFJUUCBzdHJlYW0sIHRoZSBldmVudAorCSAgbWF5IGJlIGxvc3QgY29tcGxldGVseSBhbmQgbmV2ZXIgZm9yd2FyZGVkLgorCisyMDEzLTA0LTAyIDIzOjM1OjA2IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cHNzcmNkZW11eDogTm8gbmVlZCB0byBleHBsaWNpdGVseSBmb3J3YXJkIHRoZSBjYXBzCisJICBUaGV5IGFyZSBmb3J3YXJkZWQgd2l0aCB0aGUgb3RoZXIgZXZlbnRzCisKKzIwMTMtMDQtMDIgMjI6Mjk6MzggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4Lmg6CisJICBydHBzc3JjZGVtdXg6IFJlbW92ZSB1bnVzZWQgR3N0U2VnbWVudAorCisyMDEzLTA0LTAyIDIyOjI2OjAyIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cHNzcmNkZW11eDogU2ltcGxpZnkgZXZlbnQgZm9yd2FyZGluZworCSAgVXNlIHRoZSBnc3RfcGFkX2ZvcndhcmQoKSBtZWNoYW5pYywgdGhpcyB3YXkgd2Ugd29uJ3QgbWlzcyBwYWRzIHRoYXQgYXJlCisJICBhZGRlZCB3aGlsZSB3ZSBhcmUgcHVzaGluZworCisyMDEzLTA0LTAyIDIxOjUzOjEwIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cHNzcmNkZW11eDogRG9uJ3QgY3Jvc3MgdGhlIGludGVybmFsIGxpbmtzCisJICBXZSBoYWQgdGhlIHdyb25nIGNvbmRpdGlvbiB0byBjaGVjayBmb3IgdGhlIGludGVybmFsIGxpbmtzLCBzbyBSVFAgYW5kIFJUQ1AKKwkgIHBhZHMgZ290IGNyb3NzZWQhCisKKzIwMTMtMDMtMzEgMTc6NTQ6MTYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogZml4IHNvbWUgZGVidWcgbWVzc2FnZXMKKworMjAxMy0wNC0wMiAyMzozNjoyMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgdjRsMjogZml4IHByaW50ZiBmb3JtYXQgY29tcGlsZXIgd2FybmluZyBpbiBkZWJ1ZyBtZXNzYWdlCisKKzIwMTItMDgtMjkgMTc6MjQ6MDAgKzAyMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIG1hdHJvc2thZGVtdXg6IGhhbmRsZSBUcnVlSEQgYXVkaW8gY29kZWMgaWQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTcxMTMKKworMjAxMy0wMy0zMSAxOToxNDowNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSAgdGhlb3JhcGF5OiBhZGQgZGVsdGEtdW5pdCB0byBvdXRwdXQgZnJhbWVzCisKKzIwMTMtMDMtMjMgMDU6MjI6MjMgKzAxMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiB1c2UgdGltZXN0YW1wIGRlbHRhIGFzIGR1cmF0aW9uIGlmIHBvc3NpYmxlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk2NDM3CisKKzIwMTMtMDMtMzAgMDk6NDQ6NDEgKzAxMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBzYmNkZXBheS5jOgorCSAgcnRwOiBmaXhlcyBkZWJ1ZyBtZXNzYWdlIHByaW50ZiByZWxhdGVkIGNvbXBpbGVyIHdhcm5pbmdzIGluIFNCQyBkZXBheWxvYWRlcgorCisyMDEzLTAzLTI4IDE2OjQ2OjM2ICswMDAwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY2RlcGF5Lmg6CisJICBydHA6IEFkZCBhbiBydHBzYmNkZXBheSBlbGVtZW50CisJICBQcmV0dHkgc3RyYWlnaHRmb3J3YXJkIC0gdGFrZXMgU0JDIGVuY2Fwc3VsYXRlZCBpbiBSVFAsIGRlcGF5bG9hZHMsIGFuZAorCSAgcHVzaGVzIG91dCBTQkMgYnVmZmVycy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTA1ODIKKworMjAxMy0wMy0yNyAyMjoxODozNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuYzoKKwkgIHJ0cDogZml4IFNCQyBwYXlsb2FkZXIKKwkgIEluaXQgUlRQIGJ1ZmZlciBvbiBzdGFjayBjb3JyZWN0bHksIHNvIG1hcHBpbmcgaXQgd29ya3MKKwkgIHdpdGhvdXQgY3JpdGljYWxzIGFuZCB0aGUgcGF5bG9hZGVyIGFjdHVhbGx5IHdvcmtzLgorCisyMDEzLTAzLTI2IDE0OjQ0OjM2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgZGlyZWN0c291bmRzaW5rOiBDaGVjayBmb3IgYSBzdWJzZXQgaW5zdGVhZCBvZiBub24tZW1wdHkgaW50ZXJzZWN0aW9uIGluIGFjY2VwdC1jYXBzCisKKzIwMTMtMDMtMjYgMTQ6Mzk6NTMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkaXJlY3Rzb3VuZHNpbms6IFByb3Blcmx5IGhhbmRsZSB0aGUgZmlsdGVyIGNhcHMgaW4gZ2V0X2NhcHMoKQorCisyMDEzLTAzLTI2IDE0OjM1OjM4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgZGlyZWN0c291bmRzaW5rOiBEb24ndCB1bm5lY2Vzc2FyaWx5IGdldCB0aGUgcGFyZW50IGNsYXNzIGluIGNsYXNzX2luaXQKKwkgIFRoZSB0cmFtcG9saW5lIGdlbmVyYXRlZCBieSBHX0RFRklORV9UWVBFIGRvZXMgdGhhdCBhbHJlYWR5LgorCisyMDEzLTAzLTI1IDE4OjAyOjEwIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIFVzZSAlMDN1IGZvciBmb3JtYXQgaW4gZ3N0X3BhZF9jcmVhdGVfc3RyZWFtX2lkX3ByaW50ZigpCisKKzIwMTMtMDMtMjUgMTA6MTI6MDMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmM6CisJICBjYXBzc2V0dGVyOiBQcmV2ZW50IHVubmVlZGVkIGNhcHMgY29weWluZyBhbmQgYWxsb2NhdGlvbgorCisyMDEzLTAyLTAxIDE0OjMzOjQxICswMTAwICBEaXJrIFZhbiBIYWVyZW5ib3JnaCA8dmhkaXJrQGdtYWlsLmNvbT4KKworCSogZ3N0L2RlYnVndXRpbHMvZ3N0Y2Fwc3NldHRlci5jOgorCSAgY2Fwc3NldHRlcjogUGFzcyBhbnkgb3IgZmlsdGVyIGNhcHMgdXBzdHJlYW0KKwkgIGNhcHNldHRlciBhY2NlcHRzIGFueXRoaW5nIGFuZCBqdXN0IGZvcndhcmRzIGRpZmZlcmVudCBjYXBzLAorCSAgYXMgc3VjaCBpdCBzaG91bGQgcmV0dXJuIEFOWSBjYXBzIG9uIHRoZSBzaW5rcGFkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MzAwNQorCisyMDEzLTAzLTA2IDEzOjE3OjU0ICswMDAwICBUb20gR3JlZW53b29kIDx0Z3JlZW53b29kQFRvbXMtTWFjQm9vay1Qcm8ubG9jYWw+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJICB2cDhlbmM6IEZpeCBmb3IgZGl2aWRlIGJ5IHplcm8gd2hlbiB1c2luZyAwLzEgZnJhbWVyYXRlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NzA5CisKKzIwMTMtMDMtMjQgMTc6NTU6NTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IGV4cG9zZSBDVUUgc2hlZXQgaXRlbXMgYXMgdHJhY2tzIG5vdCBjaGFwdGVyIGVudHJpZXMgaW4gVE9DCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc3MzA2CisKKzIwMTMtMDMtMjMgMTM6MTE6MDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IGFkZCBtb3JlIGV4YW1wbGUgcGlwZWxpbmVzCisKKzIwMTMtMDMtMjMgMTI6NTk6MjYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJICB3YXZlbmM6IGFkZCBzb21lIGV4YW1wbGUgcGlwZWxpbmVzCisKKzIwMTMtMDMtMjAgMjE6Mzg6NDAgKzAzMDAgIEFudG9uIEJlbGthIDxhbnRvbmJlbGthQGdtYWlsLmNvbT4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmg6CisJICB3YXZlbmM6IGFkZCBUT0Mgc3VwcG9ydAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MDk5OAorCisyMDEzLTAzLTIzIDA0OjU2OjM2ICswMTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IG1ha2UgZW1wdHkgc3VidGl0bGUgYnVmZmVyIHJlY29nbml0aW9uIG1vcmUgcm9idXN0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk2MjQ0CisKKzIwMTMtMDMtMDQgMTU6NDk6MDYgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSAgcG5nZW5jOiB1bm1hcCBzb3VyY2UgZnJhbWUgd2hlbiBkb25lCisKKzIwMTMtMDMtMjIgMTU6MTQ6MTUgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogRml4IHRlc3QgcmVncmVzc2lvbiB3aXRoIG9uZSBidWZmZXIgc3RyZWFtcworCisyMDEzLTAzLTA1IDE3OjAwOjE3IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBzcGxpdCBsYXJnZSByYXcgYXVkaW8gc2FtcGxlcworCSAgSW4gb3JkZXIgdG8gZGVhbCB3aXRoIGEgZmlsZSB0aGF0IGhhcyBzYW1wbGVzIHRoYXQgYXJlIDI0IHNlY29uZHMKKwkgIGxvbmcuICBTZWVraW5nIHN0aWxsIGRvZXNuJ3Qgd29yayB3aXRoIHN1Y2ggZmlsZXMuCisKKzIwMTMtMDMtMjIgMTE6NTQ6MDggLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogUmVtb3ZlIGRvY3VtZW50YXRpb24gZm9yIGR0cy1tZXRob2QKKworMjAxMy0wMy0yMiAxMzoyNDozMyAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBkZXByZWNhdGUgZHRzLW1ldGhvZCBwcm9wZXJ0eQorCisyMDEzLTAzLTEzIDE3OjA4OjAzIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IEZpeCBwcm9ibGVtcyBjYXVzaW5nIGJhZCBkdXJhdGlvbnMgaW4gZmlsZQorCSAgLSBGaXggdXAgb3V0LW9mLW9yZGVyIGluY29taW5nIERUUyB2YWx1ZXMuCisJICAtIEZpeCBkdXJhdGlvbiBvZiBpbml0aWFsIHNhbXBsZS4KKworMjAxMy0wMy0xMiAxOTowODoyNiAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBmaXggYWxsIHRpbWVzdGFtcHMgb25jZSBmaXJzdF90cyBpcyBkZXRlcm1pbmVkCisKKzIwMTMtMDItMTQgMTY6MzQ6MzQgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4Lmg6CisJICBxdG11eDogVXNlIFBUUy9EVFMgZnJvbSBpbmNvbWluZyBidWZmZXJzCisJICBSZW1vdmUgb2xkIERUUyBndWVzc2luZyBjb2RlLgorCisyMDEzLTAzLTE4IDEyOjMwOjUwICswMTAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5jOgorCSAgcXRtdXg6IGV4cG9zZSBtdWxhdyBjYXBzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk2MDUyCisKKzIwMTMtMDMtMjIgMTA6NTA6MzQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBSZXF1aXJlIE9yYyA+PSAwLjQuMTcKKwkgIE9yYyAwLjQuMTcgZml4ZXMgYSBidW5jaCBjcmFzaGVzIG9uIGkzODYgYW5kIFJQaSB3aGVuIG9yYworCSAgZnVuY3Rpb25zIGNhbid0IGJlIGNvbXBpbGVkIGFuZCB0aGUgZmFsbGJhY2sgZnVuY3Rpb24gaXMKKwkgIHN1cHBvc2VkIHRvIGJlIHVzZWQuIEFsc28gZml4ZXMgc29tZSBpc3N1ZXMgb24gUG93ZXJQQy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODQzOTkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTM4NjIKKworMjAxMy0wMy0yMiAwODo0NzoxNyArMDAwMCAgUm9kb2xmbyBTY2h1bHogZGUgTGltYSA8cm9kb2xmb0Byb2Rzb2Z0Lm9yZz4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggc2FtcGxlIGxlYWsgd2hlbiBwcm9jZXNzaW5nIHByaXZhdGUgcXQgdGFncworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NjM1NQorCisyMDEzLTAzLTIyIDAyOjI0OjAxICswMTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogc2V0IHN0cmVhbSBsYW5ndWFnZSBjb2RlIGZyb20gdGFnCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk2MzU4CisKKzIwMTMtMDMtMjEgMDI6NTU6MDYgKzAxMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc2VuZCBHQVAgZXZlbnRzIGZvciBzdWJ0aXRsZSBzdHJlYW1zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk2MjQ0CisKKzIwMTMtMDMtMjEgMDI6NTM6MjQgKzAxMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogaWdub3JlIGVtcHR5IHN1YnRpdGxlIGJ1ZmZlcnMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTYyNDQKKworMjAxMy0wMy0yMSAwMjo1MjowNyArMDEwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZm91cmNjLmg6CisJICBxdGRlbXV4OiByZWNvZ25pemUgU0JUTCBzdWJ0eXBlIGZvciBzdWJ0aXRsZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTYyNDQKKworMjAxMy0wMy0xNyAxNjoyNzowMyArMDMwMCAgQW50b24gQmVsa2EgPGFudG9uYmVsa2FAZ21haWwuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBhZGQgc3VwcG9ydCBmb3IgdGhlIHRvYy1zZWxlY3QgZXZlbnQKKwkgIFNlbGVjdCB0cmFja3MgZnJvbSB0aGUgQ1VFIHNoZWV0IGJ5IHNlbmRpbmcgYSB0b2Mtc2VsZWN0CisJICBldmVudCBiYXNlZCBvbiB0aGUgdWlkIGluIHRoZSBUT0MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQwODkxCisKKzIwMTMtMDMtMTkgMTg6MDk6MzEgLTA3MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEByZGlvLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgbXA0bXV4OiBpbiBmYXN0c3RhcnQgbW9kZSwgZG9uJ3Qgb3V0cHV0IHVwIHRvIDQga0Igb2YgZ2FyYmFnZSBhdCB0aGUgZW5kLgorCisyMDEzLTAzLTIwIDAwOjM1OjE3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHNiY3BhcnNlLmM6CisJICBzYmNwYXJzZTogcGFjayBtdWx0aXBsZSBmcmFtZXMgaW50byBvbmUgb3V0cHV0IGJ1ZmZlcgorCSAgRG9uJ3Qgb3V0cHV0IGEgc2luZ2xlIGJ1ZmZlciBmb3IgZXZlcnkgdGlueSBTQkMgZnJhbWUKKworMjAxMy0wMy0xOCAxNDo1OTozNSArMDAwMCAgQmFzdGllbiBOb2NlcmEgPGhhZGVzc0BoYWRlc3MubmV0PgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBmaXggY29tcGlsYXRpb24gYWdhaW5zdCBuZXdlciBrZXJuZWwgaGVhZGVycyBhcyBvbiBGQzE5CisKKzIwMTMtMDMtMTQgMTQ6MTI6MDUgKzAxMDAgIEtpc2hvcmUgQXJlcGFsbGkgPGtpc2hvcmUuYXJlcGFsbGlAZ21haWwuY29tPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBmaXggaW5maW5pdGUgbG9vcCBvbiBFT1Mgd2l0aCBub24tZGVmYXVsdCBtZXRob2RzIG9yIGZpZWxkcworCSAgRml4ZXMgcHJvYmxlbSBvZiBpbmZpbml0ZSBsb29wIGluIGdzdF9kZWludGVybGFjZV9yZXNldF9oaXN0b3J5LgorCSAgTGFzdCBmaWVsZCBpbiB0aGUgaGlzdG9yeSB3YXMgbmV2ZXIgZGVpbnRlcmxhY2VkIGJlY2F1c2UgaWR4IGJlY29tZXMgbmVnYXRpdmUuCisJICBIYXBwZW5zIGUuZy4gd2l0aCBtZXRob2Q9c2NhbGVyYm9iIGZpZWxkcz1ib3R0b20gb3IKKwkgIG1ldGhvZD1ncmVlZHlsIGZpZWxkcz10b3AKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU2NDQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTMxNzMKKworMjAxMy0wMy0xMiAwOTo0ODozMSArMDAwMCAgS2lzaG9yZSBBcmVwYWxsaSA8a2lzaG9yZS5hcmVwYWxsaUBnbWFpbC5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICBkdmRlbXV4OiBkb24ndCByZXR1cm4gRkFMU0Ugd2hlbiBkcm9wcGluZyBzaW5rIGV2ZW50cworCSAgRml4ZXMgcHJvYmxlbSBpbiBjb25qdW5jdGlvbiB3aXRoIGF2aWRlbXV4LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTY0MworCisyMDEzLTAzLTEyIDAwOjE2OjE4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBjaGFuZ2UgcmF3IHZpZGVvIGNhcHMgb3JkZXIgc28gdGhhdCBHUkFZOCBpcyBsYXN0CisJICBQZW9wbGUgbGlrZSBjb2xvdXJzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTU0MworCisyMDEzLTAzLTExIDE0OjUwOjQxICswMTAwICBPZ255YW4gVG9uY2hldiA8b2dueWFuQGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IERvbid0IHVzZSB1cHN0cmVhbSBjYXBzIHdpdGggcGVlcl9xdWVyeV9jYXBzICgpCisJICBDYWxsaW5nIGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzICgpIG9uIHRoZSBzcmMgcGFkIHdpdGggdGhlIGNhcHMKKwkgIHVwc3RyZWFtIGNhbiBwcm9kdWNlIGFzIGEgZmlsdGVyIGZyb20gZ3N0X3J0cF9oMjY0X3BheV9nZXRjYXBzICgpCisJICBpcyB3cm9uZyBhbmQgbWFrZXMgY2FwcyBuZWdvdGlhdGlvbiBmYWlsIGlmIHVwc3RyZWFtIGNhcHMgYXJlIG5vdAorCSAgTlVMTC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU2MjkKKworMjAxMy0wMy0xMCAwOToxMDoxOCArMDEwMCAgRGlyayBWYW4gSGFlcmVuYm9yZ2ggPHZoZGlya0BnbWFpbC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IHN1cHBvcnQgcmF3IEJHUgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTU0MworCisyMDEzLTAzLTEwIDA5OjI1OjM0ICswMTAwICBEaXJrIFZhbiBIYWVyZW5ib3JnaCA8dmhkaXJrQGdtYWlsLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHN1cHBvcnQgcmF3IHZpZGVvIHdpdGggbmVnYXRpdmUgaGVpZ2h0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NTQxCisKKzIwMTMtMDMtMDUgMTQ6NDA6NTYgKzAxMDAgIEpvbmFzIEhvbG1iZXJnIDxqb25hc2hnQGF4aXMuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdXRvZGV0ZWN0LmM6CisJICBhdXRvZGV0ZWN0IGNoZWNrdGVzdDogRG8gbm90IGZhaWwgd2l0aG91dCB2aWRlb3NpbmsKKwkgIElmIHRoZXJlIGlzIG5vIHZpZGVvc2luayBhdmFpbGFibGUgYXV0b3ZpZGVvc2luayB3aWxsIGNvbnRhaW4gYQorCSAgZmFrZXNpbmsgaW5zdGVhZCB3aGljaCBuZWVkcyBzcGVjaWFsIHRyZWF0bWVudCBpbiB0aGUgdW5pdCB0ZXN0LgorCisyMDEzLTAzLTA5IDAxOjE4OjMwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBBbmRyb2lkLm1rOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJKiBnc3QvZHRtZi9nc3RkdG1mLmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mY29tbW9uLmg6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJICBkdG1mOiBtb3ZlIGR0bWYgcGx1Z2luIGZyb20gLWJhZCB0byAtZ29vZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NzQxNgorCisyMDEzLTAzLTA5IDAwOjMwOjM4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBNZXJnZSBicmFuY2ggJ2R0bWYtbW92ZWQtZnJvbS1iYWQnCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg3NDE2CisKKzIwMTMtMDMtMDUgMjE6MjI6MTggKzAxMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHN5cy9vc3hhdWRpby9NYWtlZmlsZS5hbToKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9yZW1vdGVpby5jOgorCSAgb3N4YXVkaW86IGFkZCBzdXBwb3J0IGZvciBpT1MgdXNpbmcgdGhlIFJlbW90ZUlPIEF1ZGlvVW5pdAorCisyMDEzLTAzLTA1IDIxOjE3OjUyICswMTAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vTWFrZWZpbGUuYW06CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9oYWwuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hyaW5nYnVmZmVyLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4cmluZ2J1ZmZlci5oOgorCSAgb3N4YXVkaW86IGFkZCBhIGZhw6dhZGUgZm9yIHRoZSBDb3JlQXVkaW8gQVBJCisKKzIwMTMtMDMtMDcgMDA6MDA6NDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSAyZGUyMjFjIHRvIDA0YzdhMWUKKworMjAxMy0wMy0wMyAxMTo1OTozMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9sem8uYzoKKwkgIG1hdHJvc2thOiBJbmNsdWRlIGNvbmZpZy5oLCBpdCdzIG5lZWRlZCBmb3IgX3N0ZGludC5oCisKKzIwMTMtMDMtMDMgMTE6NTM6MDQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBGaXggKHdyb25nKSB1c2Ugb2YgdW5pbml0aWFsaXplZCB2YXJpYWJsZSBjb21waWxlciB3YXJuaW5nCisKKzIwMTMtMDMtMDIgMTM6NTk6NTIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogYWRkIHZhcmlhbnQgZmllbGQgdG8gSC4yNjMgY2FwcworCSAgYXZkZWNfaDI2MyB3b24ndCBnZXQgcGx1Z2dlZCBvdGhlcndpc2UuCisKKzIwMTMtMDItMjIgMTk6MDY6NTIgKzAxMDAgIEFybmF1ZCBWcmFjIDxhdnJhY0BmcmVlYm94LmZyPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHNraXAgZGlzYWJsZWQgdHJhY2tzCisJICBJU08vSUVDIDE0NDk2LTEyIHNwZWNpZmllcyBkaXNhYmxlZCB0cmFja3Mgc2hvdWxkIGJlIGNvbXBsZXRlbHkKKwkgIGlnbm9yZWQsIHNvIGp1c3QgZG8gaXQuCisJICBBdm9pZHMgZGVhZGxvY2sgZHVyaW5nIHByZXJvbGxpbmcgZm9yIHNvbWUgZmlsZXMuCisJICBBbHNvIHByZXZlbnRzICdjaGFwdGVyJyBzdWJ0aXRsZSB0cmFja3MgZnJvbSBzaG93aW5nIHVwLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5Mzk5MworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYyODc5MAorCisyMDEzLTAyLTI1IDA5OjU4OjEzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgdGVzdHM6IHJlLWFkZCBzdXBwcmVzc2lvbiBmb3IgR1ZhbHVlQXJyYXkgd2FybmluZ3MgdG8gdW5pdCB0ZXN0IGFzIHdlbGwKKworMjAxMy0wMi0yOCAxMzoyNTowNiArMDEwMCAgSm9uYXMgSG9sbWJlcmcgPGpvbmFzaGdAYXhpcy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2R0bWYuYzoKKwkgIHRlc3RzOiB1c2UgcmVsYXRpdmUgaW5jbHVkZSBmb3Igb3V0LW9mLXRyZWUgYnVpbGRzIGluIGR0bWYgdGVzdAorCisyMDEzLTAyLTI4IDA4OjQ2OjU5ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIHNwZWN0cnVtOiByZW1vdmUgdGhlIHNpbmNlIGRvYy1jb21tZW50IGZyb20gMC4xMAorCisyMDEzLTAyLTI4IDA4OjQ0OjE4ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5oOgorCSogdGVzdHMvZXhhbXBsZXMvbGV2ZWwvbGV2ZWwtZXhhbXBsZS5jOgorCSAgbGV2ZWw6IGFkZCBhICJwb3N0LW1lc3NhZ2VzIiBwcm9wZXJ0eSBhbmQgZGVwcmVjYXRlICJtZXNzYWdlIgorCSAgSW4gc3BlY3RydW0gdGhpcyB3YXMgY2hhbmdlZCBmcm9tIDAuMTAgdG8gMS4wLCBsZXRzIGRvIHRoaXMgaGVyZSB0b28uCisKKzIwMTMtMDItMjcgMTg6NTY6NTAgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2R0bWYuYzoKKwkgIHRlc3RzOiBBZGQgdGVzdHMgZm9yIGR0bWZzcmMKKworMjAxMy0wMi0yNyAxNjoxNToyNyAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZHRtZi5jOgorCSAgdGVzdHM6IEZpeCByZWYgbGVhayBpbiBkdG1mIHRlc3QKKworMjAxMy0wMi0yNiAxNDoxODoyMCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzoKKwkgIHJ0cG1wNGdkZXBheTogc3RyZWFtdHlwZSBpcyBub3QgcHV0IGJ5IGFsbCBSVFNQIHNlcnZlciwgbm90IG1ha2UgaXQgb3B0aW9uYWwKKwkgIFNwZWNpZmljIGNhc2UgaGVyZSBpcyBXb3d6YSAzLjUuMAorCisyMDEzLTAyLTI1IDAwOjM1OjU4ICswMTAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgKGF0KSBhcGVzdGFhcnQgKGRvdCkgb3JnPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGxldmVsOiBwdXQgYmFjayBkZXByZWNhdGlvbiB3YXJuaW5ncworCisyMDEzLTAyLTI0IDE3OjAwOjE0ICswMTAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgKGF0KSBhcGVzdGFhcnQgKGRvdCkgb3JnPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6CisJICBsZXZlbDogc2VuZCBsYXN0IG1lc3NhZ2Ugb24gRU9TCisKKzIwMTMtMDItMjMgMTQ6MzQ6MzUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHB1c2ggbW9kZTogaGFuZGxlIHNvbWUgbW9yZSAwLXNpemUgYnVmZmVyIGNhc2VzCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0OTQ0CisKKzIwMTMtMDItMjMgMTg6NTA6NTIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBmaXggdXAgZXhhbXBsZSBwaXBlbGluZSBpbiBkb2NzCisKKzIwMTItMTEtMjAgMTI6MTQ6MDcgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IFVwZGF0ZSBzZWdkb25lIHBlcmlvZGljYWxseQorCSAgVGhpcyBtYWtlcyBzdXJlIHRoYXQgd2UgdXBkYXRlIHNlZ2RvbmUgYmFzZWQgb24gdGhlIHJlYWQgaW5kZXggcmVjZWl2ZWQKKwkgIGR1cmluZyBsYXRlbmN5IHVwZGF0ZXMuIEFzIHRoZSBjb21tZW50IG5vdGVzLCB3ZSBtYWtlIHNvbWUgY29tcHJvbWlzZXMKKwkgIHRvIGRlYWwgd2l0aCB0aGUgZmFjdCB0aGF0IHNlZ2RvbmUgaXMgYSBzZWdtZW50IG11bHRpcGxlLCB3aGlsZSB0aGUgcmVhZAorCSAgaW5kZXggb2ZmZXJzIGZpbmVyIGdyYW51bGFyaXR5LiBUaGUgdXBkYXRlcyBhcmUgYWxzbyBub3QgdmVyeSBvZnRlbgorCSAgKDEwMG1zIHNpbmNlIHRoYXQgaXMgaG93IG9mdGVuIGF1dG9tYXRpYyB0aW1pbmcgdXBkYXRlcyBhcmUgcHJvdmlkZWQpLgorCSAgQWxsIHRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBiYXNlYXVkaW9zaW5rIHNhbXBsZSBhbGlnbm1lbnQgY29kZSB0byB3b3JrCisJICBhdCBhbGwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk0MjU3CisKKzIwMTMtMDItMTMgMTA6NDY6NTQgKzAxMDAgIFBhdWwgSEVOUllTIDx2aXNlY2hlbGxlQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogRml4IHdyb25nIGNvZGUgb3JnYW5pc2F0aW9uIGluIGNhc2Ugb2YgY29sbGlzaW9uCisJICBjaGFuZ2Vfc3NyYyBmaWVsZCBvZiBSVFBTZXNzaW9uIHNob3VsZCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcKKwkgIHJ0cF9zZXNzaW9uX3NjaGVkdWxlX2J5ZV9sb2NrZWQgKCkgYXMgdGhpcyBmdW5jdGlvbiB3aWxsIGNhbGwgcmVjb25zaWRlciBmdW5jdGlvbgorCSAgdGhhdCB3aWxsIHdha2UgdXAgcnRjcF90aHJlYWQgd2hpY2ggd2lsbCBjYWxsIHJ0cF9zZXNzaW9uX29uX3RpbWVvdXQgKCkgdGhhdCB3aWxsCisJICBjaGVjayBjaGFuZ2Vfc3NyYyB0byBjaGFuZ2UgdGhlIHNzcmMuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk0MTg0CisKKzIwMTMtMDItMjEgMTE6MTU6MjMgLTA1MDAgIEplYW4tRnJhbsOnb2lzIEZvcnRpbiBUYW0gPG5la29oYXlvQGdtYWlsLmNvbT4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogaW1wcm92ZSBkZXNjcmlwdGlvbnMgb2YgY2hyb21hIGtleWluZy1yZWxhdGVkIHByb3BlcnRpZXMgYW5kIGVudW1zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk0Mzc0CisKKzIwMTMtMDItMjEgMTU6MDE6MTUgLTA1MDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IERvIG5vdCBvdmVycmlkZSB0aGUgbWV0aG9kIHdpdGggY3VzdG9tIHIvZy9iIHZhbHVlcworCSAgRGVwZW5kaW5nIG9uIHRoZSBvcmRlciBnX29iamVjdF9zZXQoKSBjYWxscyBhYXJlIG1hZGUsIHRoZQorCSAgdGFyZ2V0IHIvZy9iIHNldHRpbmdzIHdpbGwgb3ZlcnJpZGUgdGhlIG1ldGhvZCBpZiBzZXQgdG8KKwkgIGdyZWVuL2JsdWUuIENoYW5nZSB0aGF0IHNvIHdlIGRvIG5vdCB1c2UgdGhlIHRhcmdldC1yL2cvYiB2YWx1ZXMKKwkgIHVubGVzcyB0aGUgbWV0aG9kIGlzIHNldCB0byBjdXN0b20uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk0Mzc0CisKKzIwMTMtMDItMjAgMTU6NDY6NDMgKzAxMDAgIE9nbnlhbiBUb25jaGV2IDxvZ255YW5AYXhpcy5jb20+CisKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkgIGF1cGFyc2U6IGRvIG5vdCBsZWFrIHNyY19jYXBzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk0Mjc1CisKKzIwMTMtMDItMjAgMjE6MDM6MjcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IG9ubHkgZGVsYXkgUlRDUCB3aGVuIHdlIGFyZSBhIHNlbmRlcgorCSAgT25seSBkZWxheSB0aGUgUlRDUCB0aHJlYWQgd2hlbiB3ZSBhcmUgYSBzZW5kZXIsIHdoaWNoIHdlIGNhbiBrbm93IGJlY2F1c2Ugd2UKKwkgIGhhdmUgYSBzZW5kX3J0cF9zcmMgcGFkLiBPdGhlcndpc2Ugd2UgbWlnaHQgZGVsYXkgdGhlIFJUQ1AgdGhyZWFkIGlmIHdlCisJICBhcmUgb25seSBhIHJlY2VpdmVyIGFuZCB0aGVuIHRoZXJlIGlzIG5vIGNvZGUgcGF0aCB0aGF0IHdha2VzIHVwIHRoZQorCSAgUlRDUCB0aHJlYWQgYW5kIHdlIGVuZCB1cCB3aXRob3V0IFJUQ1AgcGFja2V0cy4KKworMjAxMy0wMi0xOSAxMTo0NzoyMCArMDEwMCAgQmVuamFtaW4gR2FpZ25hcmQgPGJlbmphbWluLmdhaWduYXJkQGxpbmFyby5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDI6IEFkZCBzdXBwb3J0IG9mIGRtYWJ1ZgorCSAgdjRsIGhhcyBhZGQgYSBuZXcgSU9DVEwgdG8gZXhwb3J0IGEgYnVmZmVyIGJ5IHVzaW5nIGRtYWJ1Zi4KKwkgIFRoaXMgcGF0Y2ggYWxsb3cgdG8gdXNlIHRoaXMgbmV3IElPVENMIGlmIGl0IGhhcyBiZWVuIGRlZmluZWQgaW4gdmlkZW9kZXYyLmgKKwkgIEkgaW50cm9kdWNlIGEgbmV3IElPIG1vZGUgKEdTVF9WNEwyX0lPX0RNQUJVRikgdG8gZW5hYmxlIHRoaXMgd2F5IG9mIHdvcmtpbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkzODI2CisKKzIwMTMtMDItMTggMjA6MDQ6MDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCB1cCBkb2RneSBjb2RlIHRoYXQgdHJpZXMgdG8gZml4IHVwIGEgYnJva2VuIG1vb3YgYXRvbQorCSAgQWZ0ZXIgZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jKCkgZ3N0X2J1ZmZlcl9jb3B5X2ludG8oKSB3aWxsIGxpa2VseQorCSAgYXBwZW5kIHRvIHRoZSBhbHJlYWR5LWV4aXN0aW5nIG1lbW9yeSBpbnN0ZWFkIG9mIGZpbGxpbmcgaXQuCisKKzIwMTMtMDItMTggMTY6MzI6MTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBwb3RlbnRpYWwgY3Jhc2ggb24gc2hvcnQgTU9PViBhdG9tCisJICBEb24ndCB1bm1hcCBzaG9ydCBNT09WIGF0b20gYnVmZmVyIHR3aWNlLCB3aGljaCBoYXBwZW5lZAorCSAgaW4gdGhlIGNhc2Ugd2hlcmUgd2UgZG9uJ3QgZml4IHVwIHRoZSBNT09WIGF0b20uCisJICBGaXhlcyBjcmFzaGVzIHdoZW4gdGh1bWJuYWlsaW5nIHBhcnRpYWwgbXA0IGZpbGUgd2hlcmUKKwkgIHRoZSBNT09WIGF0b20gaXMgc3RpbGwgaW5jb21wbGV0ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTQwMTAKKworMjAxMy0wMi0xNiAxNjo0OToyMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L3NvdXAvTWFrZWZpbGUuYW06CisJICBzb3VwaHR0cHNyYzogc2V0IFNPVVBfVkVSU0lPTl97TUlOX1JFUVVJUkVELE1BWF9BTExPV0VEfSB0byBzdXBwcmVzcyBkZXByZWNhdGlvbnMgd2l0aCBuZXdlciB2ZXJzaW9ucworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MzkxMQorCisyMDEzLTAyLTE2IDE1OjQ3OjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cDogdXNlIGRlZmF1bHQgcHJveHkgcmVzb2x2ZXIgaW5zdGVhZCBvZiBkZXByZWNhdGVkIEdOT01FIHByb3h5IHJlc29sdmVyCisJICBBcHBhcmVudGx5IHRoZXJlJ3Mgbm8gcmVhc29uIHRvIHVzZSBpdCBhbnkgbG9uZ2VyLiBEcm9wIGxpYnNvdXAtZ25vbWUKKwkgIGRlcGVuZGVuY3kgd2hpbGUgYXQgaXQsIG5vdyB0aGF0IHdlIGRvbid0IG5lZWQgYW55dGhpbmcgZnJvbSBpdCBhbnkKKwkgIG1vcmUgKGl0IG9ubHkgY29uc2lzdHMgZW50aXJlbHkgb2YgZGVwcmVjYXRlZCBBUEkgbm93IGFueXdheXMpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MzkxMQorCisyMDEzLTAyLTE1IDE1OjQzOjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jOgorCSAgdGVzdHM6IGZpeCBzb21lIGgyNjQgY2FwcworCSAgRG9lc24ndCBmaXggYW55dGhpbmcgaW4gcGFydGljdWxhciwgYnV0IGlzCisJICBzdGlsbCBuZWVkZWQgaGVyZSBmb3IgY29ycmVjdG5lc3MuCisKKzIwMTMtMDItMTUgMDg6MTk6MjQgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgIGF1ZGlvcGFub3JhbWE6IHJlbW92ZSBjaGFubmVsLW1hc2sgZnJvbSBjYXBzCisJICBUaGUgY2hhbm5lbC1tYXNrIGlzIG9ubHkgbmVlZGVkIGZvciBjaGFubmVscz4yIHdoaWNoIHdlIGRvbid0IGRvLgorCisyMDEzLTAyLTE1IDE2OjIxOjIxICswMTAwICBCZW5qYW1pbiBHYWlnbmFyZCA8YmVuamFtaW4uZ2FpZ25hcmRAc3Rlcmljc3Nvbi5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBkb24ndCBjaGVjayBzdHJpZGUgZm9yIGVuY29kZWQgZm9ybWF0cworCSAgRG9uJ3QgdHJ5IHRvIGNoZWNrIHRoZSBzdHJpZGUgZm9yIGVuY29kZWQgZm9ybWF0cy4gU29tZSBkcml2ZXJzIG91dHB1dAorCSAgc29tZXRoaW5nICE9IDAgYW5kIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBmYWlsIG9uIHRoYXQuCisKKzIwMTMtMDItMTUgMTQ6MTE6MzYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiB1c2UgZ19zb2NrZXRfc2V0X29wdGlvbigpIHRvIHNldCBidWZmZXIgc2l6ZSB3aXRoIG5ld2VyIEdMaWIgdmVyc2lvbnMKKwkgIFNvIHdlIGhhdmUgdG8gd29ycnkgbGVzcyBhYm91dCBwb3J0YWJpbGl0eS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTI0MDAKKworMjAxMy0wMi0xNCAxNDoxMzoyNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IHJlbW92ZSBzb2YtbWFya2VyIGZyb20gdGVtcGxhdGUgY2FwcyBmb3Igbm93CisJICBOb3cgdGhhdCB0aGUgc3Vic2V0IGNoZWNrIGFjdHVhbGx5IHdvcmtzLCB0aGlzIGJyZWFrcworCSAgdGhpbmdzIHdpdGggZGVtdXhlcnMgdGhhdCBkb24ndCBwdXQgYSAic29mLW1hcmtlciIKKwkgIGluIHRoZWlyIGpwZWcgY2FwcywgYW5kIHdlIGRvbid0IGhhdmUgYSBnb29kIHBhcnNlcgorCSAgdG8gcGx1ZyBlaXRoZXIgeWV0LgorCisyMDEzLTAyLTEzIDEyOjMyOjEwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5oOgorCSAganBlZ2VuYzogUHV0IHRoZSBTT0YgbWFya2VyIGludG8gdGhlIGNhcHMKKworMjAxMy0wMi0xMyAxMjowMjo0NiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJICBydHAtcGF5bG9hZGluZzogRml4IHVuaXQgdGVzdCBjYXBzIGFuZCBBTVIgZGVwYXlsb2FkZXIgc2luayB0ZW1wbGF0ZSBjYXBzCisJICBGaWVsZHMgd2VyZSBtaXNzaW5nIGZyb20gdGhlIGFjdHVhbCBjYXBzLCBvciB0b28gbWFueSBmaWVsZHMKKwkgIGV4aXN0ZWQgaW4gdGhlIHRlbXBsYXRlIGNhcHMuCisKKzIwMTMtMDItMTMgMTE6NTM6MDEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IEZpeCBjYXBzIHVzZWQgaW4gdGhlIHVuaXQgdGVzdAorCSAgVGhlIEFBQyBjYXBzIHBhc3NlZCB3ZXJlIGluY29tcGxldGUuCisKKzIwMTMtMDItMTMgMTE6NDk6NDAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZW5jLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrcGFyc2UuYzoKKwkgIHdhdnBhY2s6IEZpeCB1bml0IHRlc3RzLCB3aWR0aCBpcyBub3cgY2FsbGVkIGRlcHRoIGluIHRoZSBjYXBzIGluIDEuMAorCisyMDEzLTAyLTEyIDIzOjMxOjIyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSAgdGVzdHM6IG1ha2Ugc291cGh0dHBzcmMgdW5pdCB0ZXN0IHdvcmsgZXZlbiBpZiBodHRwX3Byb3h5IGlzIHNldAorCSAgV2UncmUgdGVzdGluZyB3aXRoIGFuIGh0dHAgc2VydmVyIG9uIGxvY2FsaG9zdCwgYnV0IGRvbid0IHN1cHBvcnQKKwkgIGFuIGV4Y2VwdGlvbiBsaXN0IGZvciB0aGUgaHR0cF9wcm94eSwgc28ganVzdCB1bnNldCB0aGUgZW52aXJvbm1lbnQKKwkgIHZhcmlhYmxlIHRvIG1ha2Ugc3VyZSB3ZSBjYW4gcnVuIHRoaXMgdGVzdCBwcm9wZXJseSBldmVuIGlmIHRoZQorCSAgZW52aXJvbm1lbnQgaGFzIGh0dHBfcHJveHkgc2V0LgorCSAgQWxzbywgZG9uJ3Qgc2tpcCBhbGwgdGVzdHMgaWYgdGhlcmUgaXMgYW4gaXNzdWUgd2l0aCB0aGUgU1NMIHNlcnZlciwKKwkgIGp1c3QgcnVuIHRoZSBub24tU1NMIHRlc3RzIHRoZW4uCisJICBodHRwczovL2plbmtpbnMucWEudWJ1bnR1LmNvbS92aWV3L1JhcmluZy92aWV3L0pIQnVpbGQlMjBHbm9tZS9qb2IvamhidWlsZC1hbWQ2NC1nc3QtcGx1Z2lucy1nb29kLworCisyMDEzLTAyLTEyIDEyOjUzOjUyIC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAcmRpby5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZXh0cmFjdCBjb2RlY19kYXRhIGZvciBQcm9SZXMKKworMjAxMy0wMi0wOCAwMTowMjoxMCArMTEwMCAgVGltICdtaXRocm8nIEFuc2VsbCA8bWl0aHJvQG1pdGhpcy5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IEZpeGluZyBidWZmZXIgbGVhayBpbiBnc3RfYXZpX211eF9kb19idWZmZXIKKwkgIGdzdF9hdmlfbXV4X2RvX2J1ZmZlciB3YXMgbGVha2luZyBkYXRhIGZyb20gZ3N0X2NvbGxlY3RfcGFkc19wb3AuCisKKzIwMTMtMDItMTAgMTU6MTA6MzIgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGNvcnJlY3QgZHVyYXRpb24gZm9yIGF1ZGlvIFZCUiBidWZmZXJzIGluIHB1bGwgbW9kZQorCisyMDEzLTAyLTA4IDIxOjI4OjAyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBwcm9wZXIgcG9zaXRpb24gcmVwb3J0aW5nIGFuZCBwdXNoIG1vZGUgdGltZXN0YW1waW5nCisJICAuLi4gYW5kIGFsaWduIGN1cnJlbnRfdG90YWwgc2VtYW50aWNzIGluIHB1c2ggYW5kIHB1bGwgbW9kZSwKKwkgIHdoaWNoIHRyYWNrcyBieXRlcyBmb3IgQ0JSIGFuZCBibG9ja3MgZm9yIFZCUi4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTE0ODEKKworMjAxMy0wMi0wOCAxNzowNToyNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogZGVsYXkgUlRDUCB1bnRpbCBmaXJzdCBSVFAgcGFja2V0CisJICBEZWxheSBzZW5kaW5nIHRoZSBmaXJzdCBSVENQIHBhY2tldCB1bnRpbCB3ZSBoYXZlIHNlbnQgdGhlIGZpcnN0IFJUUCBwYWNrZXQuCisJICBPdGhlcndpc2Ugd2Ugd2lsbCBzZW5kIG91dCBhIFJlY2VpdmVyIFJlcG9ydCBpbnN0ZWFkIG9mIGEgc2VuZGVyIHJlcG9ydC4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkxNDAwCisKKzIwMTMtMDItMDcgMTU6MDY6NDAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IHJlbW92ZSBkZWFkIGNvZGUKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjgzNTUKKworMjAxMy0wMS0yOSAxMDo0ODoxNyArMDEwMCAgUGF1bCBIRU5SWVMgPHZpc2VjaGVsbGVAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJICBydHBwdGRlbXV4OiBmb3J3YXJkIHN0aWNreSBldmVudHMgYW5kIHRoZW4gc2V0IGNhcHMKKwkgIFdoZW4gYSBuZXcgc3JjIHBhZCBpcyBhZGRlZCwgZmlyc3QgZm9yd2FyZCB0aGUgc3RpY2t5IGV2ZW50cyBhbmQgdGhlbgorCSAgc2V0IHRoZSBjYXBzIG9uIHRoZSBzcmMgcGFkCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkyNzg2CisKKzIwMTMtMDItMDcgMTQ6MzI6MjYgKzAxMDAgIE1hcmtvdnRzZXYgVmFkaW0gPHYubWFya292dHNldiBhdCBzYW1zdW5nLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGltcHJvdmUgZGVidWcgb3V0cHV0CisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg4OTM1CisKKzIwMTEtMDktMjYgMTQ6NDI6NTEgLTA3MDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiByZXdvcmsgY2xlYW51cCBvZiBzdHJlYW1zCisJICBNb3ZlIHRoZSB3b3JrIG9mIGNsZWFuaW5nIHVwIHRoZSBjbGllbnQgc3RyZWFtcyBpbiB0aGUgZnJlZV9zdHJlYW0KKwkgIGZ1bmN0aW9uLiBUaGlzIGFsbG93cyB1cyB0byBwcm9wZXJseSBjbGVhbiB1cCB0aGUgY2xpZW50IHN0cmVhbXMgd2hlbiB3ZQorCSAgcmVtb3ZlIGFuIFJUUCBzdHJlYW0gYXMgd2VsbC4KKwkgIEJhc2VkIG9uIHBhdGNoIGJ5IFN1amF5IDxzZGF0YXJAY2lzY28uY29tPgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MDE1NgorCisyMDEzLTAyLTA3IDExOjQwOjM1ICswMTAwICBUaW0gJ21pdGhybycgQW5zZWxsIDxnbm9tZSBhdCBtaXRoaXMuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjI6IGF2b2lkIGNhcHMgbGVhaworCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MzMwNworCisyMDEzLTAyLTA2IDE3OjE1OjExICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogZG8gc2tldyBlc3RpbWF0aW9uIG9ubHkgZm9yIG5ldyB0aW1lc3RhbXBzCisJICBPbmx5IHJ1biB0aGUgc2tldyBlc3RpbWF0aW9uIGNvZGUgd2hlbiB3ZSBoYXZlIGEgbmV3IFJUUCB0aW1lc3RhbXAuIElmIHdlIGhhdmUKKwkgIHRoZSBzYW1lIFJUUCB0aW1lc3RhbXAsIHdlIHNpbXBseSB1c2UgdGhlIHByZXZpb3VzIGVzdGltYXRpb24uIFRoaXMgd29ya3MKKwkgIGJlY2F1c2UgdGhlIG5ldyBvYnNlcnZhdGlvbiB3aXRoIHRoZSBzYW1lIFJUUCB0aW1lc3RhbXAgaGFzIHRvIGhhdmUgYSBiaWdnZXIKKwkgIHJlY2VpdmVyIHRpbWUgYW5kIGlzIHRodXMgbm90IGdvaW5nIHRvIGluZmx1ZW5jZSB0aGUgZXN0aW1hdGlvbiBleGNlcHQgZm9yCisJICBjYXVzaW5nIG1vcmUgaml0dGVyLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MDAyMworCisyMDEzLTAyLTA2IDEzOjUyOjI2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBvbmx5IEVPUyB3aGVuIG91ciBzb3VyY2Ugc2VuZHMgQllFCisJICBPbmx5IEVPUyB3aGVuIHdlIHJlY2VpdmUgYSBCWUUgZXZlbnQgZnJvbSB0aGUgU1NSQyBvZiBvdXIgc3RyZWFtLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NTQ1MworCisyMDEzLTAyLTA2IDEzOjQ3OjUxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBzYXZlIHRoZSBzdHJlYW0gU1NSQworCSAgQ29uZmxpY3RzOgorCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jCisKKzIwMTMtMDItMDYgMTM6MTg6MTggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGZsdXNoIGNvbm5lY3Rpb24gd2hlbiBzdG9wcGluZworCSAgV2hlbiB3ZSBzdG9wLCB3ZSBjYW4gZmx1c2ggYWxsIHBlbmRpbmcgY29tbWFuZHMgc28gdGhhdCB3ZSBjYW4gc3RvcCBhbmQKKwkgIGpvaW4gdGhlIHRhc2suCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0OTI0CisKKzIwMTMtMDItMDUgMjI6MDI6MTMgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9SRUFETUU6CisJICBzcGVjdHJ1bTogcmVtb3ZlIG91dGRhdGVzIHJlYWRtZQorCSAgTGV0cyByZW1vdmUgdGhlIHJlYWRtZSBmcm9tIHByZS0wLjEuMCB0aGF0IGlzIGNvbXBsZXRlbHkgaXJyZWxldmFudCBub3cuCisKKzIwMTMtMDItMDUgMDc6MzI6MjkgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgIGF1ZGlvcGFub3JhbWE6IGFkZCBtb3JlIGRlYnVnIGxvZ2dpbmcKKworMjAxMy0wMi0wNSAwODoyNjoxNCArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvZXhhbXBsZXMvbGV2ZWwvbGV2ZWwtZXhhbXBsZS5jOgorCSAgbGV2ZWwtZXhhbXBsZS4gYXZvaWQgdGFraW5nIHRoZSBhcnJheXMgYWdhaW4gZm9yIGVhY2ggY2hhbm5lbCBmb3IgY2xhcml0eQorCSAgQWxzbyBpbnRyb2R1Y2Ugc29tZSBibGFuayBsaW5lcyBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5IGFuZCB1cGRhdGUgdGhlIGNvbW1lbnRzLgorCisyMDEzLTAyLTA0IDE4OjM4OjQxICswMDAwICBSaWNvIFR6c2NoaWNoaG9seiA8cmljb3R6QHVidW50dS5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvTWFrZWZpbGUuYW06CisJICBhdWRpb3BhcnNlcnM6IGZpeCB0eXBvIGluIG5vaW5zdF9oZWFkZXJzCisKKzIwMTMtMDItMDQgMTE6MDg6MjMgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgIGF1ZGlvcGFub3JhbWE6IGZ1cnRoZXIgcG9ydCB0byAxLjAKKwkgIFRyYW5zZm9ybWNhcHMgaXMgbm90IGNhbGxlZCB3aXRoIGNhcHMgY29udGFpbmluZyBzaW5nbGUgc3RydWN0dXJlcyBhbnltb3JlLiBBbHNvIGFkZCBtaXNzaW5nIGZpbHRlciBoYW5kbGluZy4gU3RpbGwgZG9lcyBub3QgbmVnb3RpYXRlIHRob3VnaC4KKworMjAxMy0wMi0wMyAyMjo0NTo1MiArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSAgYXVkaW9wYW5vcmFtYTogZml4IGNhcHMKKwkgIFdlIGRvbid0IHR1cm4gZmxvYXQgaW50byAzMmJpdCBwY20uIExvb2tzIGxpa2UgYSB0eXBvIGZyb20gdXBkYXRpbmcgdGhlIGNhcHMuCisKKzIwMTMtMDItMDMgMTM6MTQ6NTAgKzAxMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgbGV2ZWw6IEFkZCBtaXNzaW5nIGNvbWEgYmV0d2VlbiBmb3JtYXRzCisKKzIwMTMtMDEtMzEgMjI6NTU6MTggKzExMDAgIE1hdHRoZXcgV2F0ZXJzIDx5c3RyZWV0MDBAZ21haWwuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogZml4IGVvcyB0aW1lc3RhbXAgY2hlY2sKKwkgIGZpeGVzIGhhbmcgaW4gdmlkZW90ZXN0c3JjIG51bS1idWZmZXJzPTIwICEgdmlkZW9taXhlciAhIGZha2VzaW5rCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkyOTM1CisKKzIwMTMtMDEtMzEgMTE6MzU6MDkgKzAxMDAgIERpcmsgVmFuIEhhZXJlbmJvcmdoIDx2aGRpcmtAZ21haWwuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBhZGQgc3VwcG9ydCBmb3IgcmF3IG1vbm9jaHJvbWUgOC1iaXQgdmlkZW8KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTI5MzIKKworMjAxMy0wMS0xOCAyMTowODoxMiArMDQwMCAgQWxleGV5IENoZXJub3YgPGFjaGVybm92QG5lb3NwaGVyZS5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJICBvc3h2aWRlb3Npbms6IE1ha2UgR3N0TmF2aWdhdGlvbiBrZXkgaW5wdXQgZXZlbnRzIGluIG9zeHZpZGVvc2luayBjb21wYXRpYmxlIHdpdGggeCh2KWltYWdlc2luayBvbmVzCisKKzIwMTMtMDEtMjkgMTA6MzA6MzIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGF2b2lkICcuLi5pcyB1c2VkIHVuaW5pdGlhbGl6ZWQnCisKKzIwMTMtMDEtMDkgMTM6MjQ6NDkgLTA1MDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc2V0IGludGVybGVhdmVkIGxheW91dCBjb3JyZWN0bHkgZm9yIExQQ00gYXVkaW8KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjM0NTgKKworMjAxMy0wMS0wOCAyMDo0NToyMSAtMDUwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgc3VwcG9ydCBmb3IgTFBDTSBmb3VyY2MgKHVuY29tcHJlc3NlZCBhdWRpbyBpbiBRdWlja3RpbWU3KQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MzQ1OAorCisyMDEzLTAxLTA4IDIwOjQyOjM1IC0wNTAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHByaW50IGFsbCBkZWJ1ZyBmb3Igc291bmQgc2FtcGxlIGRlc2NyaXB0aW9uIHYyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjYzNDU4CisKKzIwMTMtMDEtMDggMjA6MTQ6MTcgLTA1MDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc291bmQgc2FtcGxlIGRlc2NyaXB0aW9uIHYyIGRvZXNuJ3Qgb3ZlcnJpZGUgc2FtcGxlc19wZXJfcGFja2V0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjYzNDU4CisKKzIwMTMtMDEtMDggMTk6NTc6NTAgLTA1MDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcGFzcyBzdHNkIGRhdGEgdG8gcXRkZW11eF9hdWRpb19jYXBzKCkKKwkgIFdlIHdpbGwgbmVlZCB0aGF0IGxhdGVyIGZvciBMUENNIGZvcm1hdCBzdXBwb3J0LiBEaXNhYmxlCisJICBRRE0yIHBhcnNpbmcgb2Ygc3RzZCBkYXRhIHdoaWNoIGRlYWQgY29kZSBiZWZvcmUgYXMgd2VsbAorCSAgYmVjYXVzZSBkYXRhIHdhcyBhbHdheXMgTlVMTC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjM0NTgKKworMjAxMy0wMS0wOCAxOTo1Njo0NiAtMDUwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgbGVuIGNoZWNrIGZvciBzb3VuZCBzYW1wbGUgZGVzY3JpcHRpb25zIHYxIGFuZCB2MgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MzQ1OAorCisyMDEzLTAxLTI4IDIyOjQyOjI1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cG1hbmFnZXI6IHVzZSBDODktc3R5bGUgY29tbWVudHMKKworMjAxMy0wMS0yOCAxODowNjoxNSAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgZ3N0cnRwc2Vzc2lvbjogRml4IGRvdWJsZS1kZWNsYXJlZCB2YXJpYWJsZQorCisyMDEzLTAxLTI4IDE3OjU4OjIwIC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cDogRml4IGNvbXBpbGF0aW9uIGVycm9ycyBpbiBwcmV2aW91cyBwYXRjaGVzCisKKzIwMTEtMDQtMjggMjI6NTk6MjggKzAyMDAgIEhhYWtvbiBTcG9yc2hlaW0gPGhhYWtvbi5zcG9yc2hlaW1AZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBFbnN1cmUgTVQgc2FmZSBldmVudCBoYW5kbGluZyBhbmQgcGx1ZyBldmVudCBsZWFrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NzgyNgorCisyMDExLTEwLTE3IDIzOjQ1OjM3ICswMjAwICBJZGFyIFRvbGxlZnNlbiA8aXRvbGxlZnNAY2lzY28uY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBtdC1zYWZlIGV2ZW50LXB1c2gKKwkgIEJ5IHRha2luZyBhIHJlZiBvZiB0aGUgc2luay1wYWQgdW5kZXIgbG9jaywgaXQgd29uJ3QgZGlzc2FwcGVhcgorCSAgd2hpbGUgdGhlIHB1c2ggaXMgdGFraW5nIHBsYWNlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY3ODE2CisKKzIwMTItMDEtMDQgMTA6Mjk6NDUgKzAxMDAgIFBhc2NhbCBCdWhsZXIgPHBhYnVobGVyQGNpc2NvLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBydHBzc3JjZGVtdXg6IFNhZmVseSBwdXNoIG9uIHBhZHMgdGhhdCBtaWdodCBiZSByZW1vdmVkIGR1ZSB0byBhIFJUQ1AgQllFCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY3ODE1CisKKzIwMTMtMDEtMjggMjA6NDI6MjYgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBhOTQyMjkzIHRvIDJkZTIyMWMKKworMjAxMy0wMS0yOCAxMTo1NDo1NCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0c2JjcGFyc2UuYzoKKwkgIHNiY3BhcnNlOiBpbml0IHNvbWUgdmFyaWFibGVzIHRvIGF2b2lkIGJvZ3VzIGNvbXBpbGVyIHdhcm5pbmdzCisKKzIwMTMtMDEtMjggMTI6NDE6MDQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSAgcnRwZGVwYXk6IHJlbW92ZSBwYXlsb2FkIHR5cGUgcmVzdHJpY3Rpb25zCisJICBSZW1vdmUgdGhlIHB0IHJlc3RyaWN0aW9ucyBmb3IgYWxsIHRoZSBkZXBheWxvYWRlcnMgdGhhdCBoYXZlIGFuCisJICBlbmNvZGluZy1uYW1lLiBXZSBjYW4gdXNlIHRoaXMgdG8gYXV0b3BsdWcgZGVjb2RlcnMuCisJICBSZW1vdmUgdGhlIGVuY29kaW5nLW5hbWUgZm9yIGFsbCB0aGUgcGF5bG9hZGVycyB3aXRoIGEgZml4ZWQgcGF5bG9hZAorCSAgdHlwZS4KKwkgIFdlIG5vdyBlaXRoZXIgaGF2ZSBhbiBlbmNvZGluZy1uYW1lIG9yIGEgcHQgaW4gdGhlIHNpbmtwYWQgY2FwcyBvZgorCSAgYSBkZXBheWxvYWRlci4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjM5MjkyCisKKzIwMTMtMDEtMjggMTI6MjM6NDEgKzAxMDAgIE1hcmMgTGVlbWFuIDxtYXJjLmxlZW1hbkBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSAgcnRwOiByZW1vdmUgcGF5bG9hZCByZXF1aXJlbWVudHMgZnJvbSBzZWxlY3RlZCBkZXBheWxvYWRlcnMKKwkgIGVuY29kaW5nIG5hbWUgaXMgcmVxdWlyZWQgaW4gdGhlIGNhcHMgYW5kIGlzIGEgYmV0dGVyIGZpdCBmb3IgYXV0b3BsdWdnaW5nIHRoYW4KKwkgIHRoZSBwdCB2YWx1ZS4gSGFyZHdhcmUgbWFudWZhY3R1cmVycyBoYXZlIGEgYmFkIGhhYml0IG9mIHNraW1taW5nIHRocm91Z2ggUkZDcworCSAgYW5kIGluIHRoaXMgY2FzZTsgdXNlIHVuYXNzaWduZWQgbnVtYmVycyBmb3IgZW5jb2RlcnMgaW5zdGVhZCBvZiBkeW5hbWljCisJICBudW1iZXJzLgorCSAgSW4gZXNzZW5jZSwgdGhpcyBwYXRjaCB3aWxsIGFkZCBzdXBwb3J0IGZvciBhIGxvdCBvZiBCb3NjaCBoYXJkd2FyZSBlbmNvZGVycworCSAgd2l0aG91dCBicmVha2luZyBhdXRvcGx1Z2dpbmcuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjM5MjkyCisKKzIwMTMtMDEtMjcgMTA6MTc6NTkgKzA1MzAgIEIuUHJhdGhpYmhhIDxib3NzbGludXhAY2RhYy5pbj4KKworCSogdGVzdHMvZXhhbXBsZXMvamFjay9qYWNrX2NsaWVudC5jOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1hbHNhc3JjLVBDTUEuYzoKKwkqIHRlc3RzL2ljbGVzL3hpbWFnZXNyYy10ZXN0LmM6CisJICB0ZXN0czogdXNlIGdfdGltZW91dF9hZGRfc2Vjb25kcyBpbnN0ZWFkIG9mIGdfdGltZW91dF9hZGQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTI2MTUKKworMjAxMy0wMS0yNyAxMjo1NDoxNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHB1c2ggbW9kZTogb25seSBwYXJzZSBtb292IDEgb25jZQorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MTU3MAorCisyMDEzLTAxLTI2IDIyOjU4OjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBydHBkdG1mc3JjOiBmaXggY29tcGlsZXIgd2FybmluZworCSAgZ3N0cnRwZHRtZnNyYy5jOiBJbiBmdW5jdGlvbiAnZ3N0X2R0bWZfc3JjX3ByZXBhcmVfbWVzc2FnZS5pc3JhLjEnOgorCSAgZ3N0cnRwZHRtZnNyYy5jOjY2OTozOiBlcnJvcjogJ3MnIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbgorCisyMDEzLTAxLTI1IDIxOjA2OjA1IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkgIHJ0cGR0bWZkZXBheTogRml4IG1pc3Npbmcgd29yayBpbiBkb2MKKworMjAxMy0wMS0yNCAyMTowMDowOCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZHRtZi5jOgorCSAgdGVzdHM6IEFkZCB0ZXN0IGZvciBydHBkdG1mZGVwYXkgYW5kIHJ0cGR0bWZzcmMKKworMjAxMy0wMS0yNSAyMDozOTozMyAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgcnRwZHRtZnNyYzogUG9zdCB0aGUgbWVzc2FnZXMgYWZ0ZXIgdGhlIGNsb2NrIHdhaXQKKwkgIFRoaXMgd2F5LCB0aGUgbWVzc2FnZXMgd2lsbCBiZSBjbG9zZXIgaW4gdGltZSB0byB3aGVuIHRoZSBwYWNrZXRzIGFyZSBzZW50IG91dAorCisyMDEzLTAxLTI1IDIwOjM3OjUzIC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBydHBkdG1mc3JjOiBPbmx5IHNldCB0aGUgZHVyYXRpb24gd2hlbiBzdGFydGluZyB0byBzZW5kCisJICBUaGUgZHVyYXRpb24gZGVwZW5kcyBvbiB0aGUgY2xvY2sgcmF0ZSwgd2hpY2ggY291bGQgY2hhbmdlIGR1ZSB0byByZW5lZ290aWF0aW9uCisKKzIwMTMtMDEtMjUgMjA6Mzc6MDkgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIHJ0cGR0bWZzcmM6IHJlbW92ZSAic3NyYyIgZnJvbSBjYXBzCisJICBzc3JjIGlzIHVpbnQgYW5kIHdlIGRvbid0IGhhdmUgYSB1aW50IHJhbmdlIHR5cGUKKworMjAxMy0wMS0yNCAyMTowODo1MSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2lzb21wNC9hdG9tcy5oOgorCSAgcXRtdXg6IHNldCBsYW5ndWFnZSB0byAndW5kZWZpbmVkJyBpbnN0ZWFkIG9mIEVuZ2xpc2ggYnkgZGVmYXVsdAorCisyMDEzLTAxLTIzIDIxOjM1OjI1IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6CisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuaDoKKwkgIHhpbWFnZXNyYzogU2V0IHRoZSBwaXhlbCBhc3BlY3QgcmF0aW8gY29ycmVjdGx5IGluIHRoZSBjYXBzCisKKzIwMTMtMDEtMDggMDg6NTY6NDUgKzAxMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogUmUtZW5hYmxlIHByZXBhcmUtZm9ybWF0IGVtaXNzaW9uCisJICBXaXRoIHRoZSBwb3J0IHRvIGdzdHJlYW1lciAxLjAgdGhlIHByZXBhcmUtZm9ybWF0IHNpZ25hbCBzdG9wcGVkIGJlaW5nCisJICBlbWl0dGVkLiBTdGFydCBlbWl0dGluZyB0aGlzIGFnYWluIGZvciB1c2UgaW4gdXZjaDI2NHNyYy4gIFdoaWxlIHRoZXJlCisJICBjaGFuZ2UgdGhlIGVtaXNzaW9uIHRvIGluY2x1ZGUgdGhlIGNhcHMgZm9yIGV4dHJhIGZsZXhpYmlsaXR5IGluc3RlYWQgb2YKKwkgIGZvdXJjZSwgd2lkdGgsIGhlaWdodC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTIwNDIKKworMjAxMy0wMS0yMiAxODoxMjoxMCArMDEwMCAgQmVuamFtaW4gR2FpZ25hcmQgPGJlbmphbWluLmdhaWduYXJkQHN0LmNvbT4KKworCSogYXV0b2dlbi5zaDoKKwkgIGF1dG9nZW4uc2g6IGFsbG93IGNhbGxpbmcgZnJvbSBvdXQtb2YtdHJlZQorCSAgU2lnbmVkLW9mZi1ieTogQmVuamFtaW4gR2FpZ25hcmQgPGJlbmphbWluLmdhaWduYXJkQHN0LmNvbT4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTIzMDkKKworMjAxMy0wMS0yMiAxOToyNjowOSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHNiY3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IHNiYzogZml4IGJvZ3VzIGNvbXBpbGVyIHdhcm5pbmcKKwkgIGdzdC1wbHVnaW5zLWdvb2QvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5jOiBJbiBmdW5jdGlvbiAnZ3N0X3NiY19wYXJzZV9oYW5kbGVfZnJhbWUnOgorCSAgZ3N0LXBsdWdpbnMtZ29vZC9nc3QvYXVkaW9wYXJzZXJzL2dzdHNiY3BhcnNlLmM6MjEwOjMyOiBlcnJvcjogJ2NoX21vZGUnIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaQorCisyMDEzLTAxLTE5IDEzOjI3OjQ4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGRvbid0IGVycm9yIG91dCBpZiBwYV9zdHJlYW1fcHJvcGxpc3RfdXBkYXRlKCkgd2l0aCBuZXcgdGFncyBmYWlscworCSAgU2hvdWxkbid0IHJlYWxseSBoYXBwZW4gdGhlc2UgZGF5cywgYnV0IGlmIGl0IGRvZXMsIGl0J3Mgbm90IHJlYWxseQorCSAgYSBwcm9ibGVtIGVpdGhlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTYwNjgKKworMjAxMy0wMS0xNiAxODowMToyMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJICB0ZXN0czogc2tpcCBzb3VwaHR0cHNyYyB0ZXN0cyBpZiB0aGVyZSBpcyBubyBsb2NhbCBodHRwIHNlcnZlciB0byB1c2UKKwkgIFNraXAgdGVzdHMgaWYgdGhlIHNlcnZlciBjb3VsZG4ndCBiZSBzdGFydGVkIG9yIHdlIGNhbid0IGNvbm5lY3QKKwkgIHRvIGl0IGZvciBzb21lIHJlYXNvbiAoZS5nLiBkcmFjb25pYyBidWlsZCBib3QgZW52aXJvbm1lbnRzKS4KKworMjAxMy0wMS0xNiAxNDozMjo1NiArMDEwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5jOgorCSAgYXV0b3BhcnNlcnM6IHVzZSBhcHByb3ByaWF0ZSBwcmludGYgZm9ybWF0IGZvciBnc2l6ZQorCisyMDEzLTAxLTE1IDE1OjA1OjQzICswMTAwICBNYXJ0aW4gUGl0dCA8bWFydGlucGl0dEBnbm9tZS5vcmc+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IHVzZSBfMV8wIHZhcmlhbnRzIGZvciB0aGUgdmFyaW91cyByZWdpc3RyeSB2YXJpYWJsZXMKKwkgIFRoZXNlIG92ZXJyaWRlIHRoZSB2YXJpYW50cyB3aXRob3V0IHZlcnNpb24gc3VmZml4LiBNYWtlcyAnbWFrZSBjaGVjaycgd29yaworCSAgcHJvcGVybHkgaW4gZW52aXJvbm1lbnRzIHRoYXQgc2V0IHRoZSBzdWZmaXhlZCB2YXJpYW50IGZvciAxLjAsIHN1Y2ggYXMKKwkgIGpoYnVpbGQuCisKKzIwMTMtMDEtMTEgMTk6MjQ6NDMgKzA0MDAgIEFsZXhleSBDaGVybm92IDxhY2hlcm5vdkBuZW9zcGhlcmUuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cubToKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogRml4IGNyYXNoIGluIG9zeHZpZGVvc2luayB3aXRoIGV4dGVybmFsIHdpbmRvdyBvdXRwdXQKKworMjAxMy0wMS0xNiAxMjowNDo1OSArMDQwMCAgQWxleGV5IENoZXJub3YgPGFjaGVybm92QG5lb3NwaGVyZS5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5tOgorCSAgb3N4dmlkZW9zaW5rOiBNYWtlIEdzdEdMVmlldyBwcm9wYWdhdGUgaW5wdXQgZXZlbnRzIHRvIGl0cyBwYXJlbnQgdmlldworCSAgRml4ZXMgYnVnICM2OTE4MzIKKworMjAxMy0wMS0xNiAxMDoxOTozNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJICBydHBzYmNwYXk6IHVwZGF0ZSBzb21lIGZpZWxkcyBpbiB0aGUgY2FwcyB0byB0aGVpciBuZXcgbmFtZQorCSAgYW5kIHRvIG1hdGNoIHRoZSBwYXJzZXIuICJtb2RlIiBnb3QgcmVuYW1lZCB0byAiY2hhbm5lbC1tb2RlIgorCSAgYW5kICJhbGxvY2F0aW9uIiB0byAiYWxsb2NhdGlvbi1tZXRob2QiLgorCisyMDEzLTAxLTE1IDE3OjQ0OjMzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkgIGRvY3M6IGFkZCBzYmNwYXJzZSBhbmQgcnRwc2JjcGF5IHRvIHBsdWdpbiBkb2NzCisKKzIwMTMtMDEtMTUgMTc6Mzg6MjQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5oOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9wbHVnaW4uYzoKKwkgIGF1ZGlvcGFyc2VyczogYWRkIFNCQyBhdWRpbyBwYXJzZXIKKwkgIEZyb20tc2NyYXRjaCByZXdyaXRlLCB0aGUgYmx1ZXogb25lIHdhcyB1c2VsZXNzIGFuZCBicm9rZW4uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkwNTgyCisKKzIwMTMtMDEtMTUgMTU6MDU6MDQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gYTcyZmFlYSB0byBhOTQyMjkzCisKKzIwMTMtMDEtMTAgMTI6Mzg6MTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5oOgorCSAgcnRwOiBpbXBvcnQgcnRwc2JjcGF5IGZyb20gYmx1ZXogYW5kIHBvcnQgdG8gMS4wCisJICBDb21waWxlcywgYnV0IG5vdCB0ZXN0ZWQgeWV0IChzYmMgZWxlbWVudHMgc3RpbGwgbmVlZCB0byBiZSBwb3J0ZWQpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MDU4MgorCisyMDEzLTAxLTA5IDE5OjU5OjE2IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZHRtZi9NYWtlZmlsZS5hbToKKwkqIGdzdC9kdG1mL2dzdGR0bWYuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZkZXRlY3QuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZkZXRlY3QuaDoKKwkqIGdzdC9kdG1mL3RvbmVfZGV0ZWN0LmM6CisJKiBnc3QvZHRtZi90b25lX2RldGVjdC5oOgorCSAgZHRtZi9zcGFuZHNwOiBNb3ZlIGR0bWZkZXRlY3QgdG8gdXNlIGxpYnNwYW5kc3AKKwkgIFJlbW92ZSBvdXIgY29weSBvZiB0aGUgdG9uZV9kZXRlY3QuYyBmaWxlIGFuZCB1c2UgdGhlIG9yaWdpbmFsCisJICBmcm9tIGxpYnNwYW5kc3AuIEFsc28gbW92ZSB0aGUgZWxlbWVudCB0byB0aGUgc3BhbmRzcCBwbHVnaW4uCisKKzIwMTEtMDItMTMgMTc6NTE6NDUgLTA4MDAgIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKworCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuaDoKKwkgIHJ0cHNiY3BheTogUmVtb3ZlIHdvcmthcm91bmQgZm9yIGNvbXBpbGVyIHdhcm5pbmdzCisKKzIwMTAtMDUtMTkgMTY6NTk6MzAgKzAyMDAgIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKworCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuYzoKKwkgIHJ0cHNiY3BheTogQWRkIHByYWdtYSBiYXNlZCB3b3JrYXJvdW5kIGZvciBHU3RyZWFtZXIgd2FybmluZ3MKKworMjAxMC0wMS0wMSAxNzowODoxNyAtMDgwMCAgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorCisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuaDoKKwkgIHJ0cHNiY3BheTogVXBkYXRlIGNvcHlyaWdodCBpbmZvcm1hdGlvbgorCisyMDA5LTAxLTMwIDAwOjMxOjE1ICswMTAwICBNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJICBydHBzYmNwYXk6IEZpeCBzaWduZWQvdW5zaWduZWQgY29tcGFyaXNvbiBpc3N1ZSB3aXRoaW4gR1N0cmVhbWVyIHBsdWdpbgorCisyMDA5LTAxLTAxIDE5OjMzOjIwICswMTAwICBNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5oOgorCSAgcnRwc2JjcGF5OiBVcGRhdGUgY29weXJpZ2h0IGluZm9ybWF0aW9uCisKKzIwMDgtMTItMjMgMDU6MjU6NTAgKzAxMDAgIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKworCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuaDoKKwkgIHJ0cHNiY3BheTogRmlyc3QgYXR0ZW1wdCBpbiBmaXhpbmcgY29tcGlsZXIgd2FybmluZ3MgKHN0aWxsIG5lZWRzIGNsZWFudXApCisKKzIwMDgtMTItMjAgMjE6NDI6NDkgKzAyMDAgIEpvaGFuIEhlZGJlcmcgPGpvaGFuLmhlZGJlcmdAbm9raWEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5jOgorCSAgcnRwc2JjcGF5OiBNb3JlIGNvZGluZyBzdHlsZSBmaXhlcworCisyMDA4LTAyLTI5IDE5OjM3OjE1ICswMDAwICBMdWl6IEF1Z3VzdG8gdm9uIERlbnR6IDxsdWl6LmRlbnR6QG9wZW5ib3NzYS5vcmc+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJICBydHBzYmNwYXk6IFJlbW92ZSBwb3NzaWJsZSBleHRyYSBtZW1jcHkgZm9yIGdzdHJlYW1lciBwbHVnaW4uCisKKzIwMDgtMDItMjggMTk6Mzg6NTMgKzAwMDAgIEx1aXogQXVndXN0byB2b24gRGVudHogPGx1aXouZGVudHpAb3BlbmJvc3NhLm9yZz4KKworCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuYzoKKwkgIHJ0cHNiY3BheTogRml4IGJ1ZyBzZW5kaW5nIGVtcHR5IHBhY2thZ2VzIGFuZCByZW1vdmUgYSBidWZmZXIgY29weS4KKworMjAwOC0wMi0yMCAxMzozNzowMCArMDAwMCAgTHVpeiBBdWd1c3RvIHZvbiBEZW50eiA8bHVpei5kZW50ekBvcGVuYm9zc2Eub3JnPgorCisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5jOgorCSAgcnRwc2JjcGF5OiBGaXggcnVudGltZSB3YXJuaW5ncyBvZiBnc3RyZWFtZXIgcGx1Z2luLgorCisyMDA4LTAyLTE5IDE5OjQ5OjI0ICswMDAwICBMdWl6IEF1Z3VzdG8gdm9uIERlbnR6IDxsdWl6LmRlbnR6QG9wZW5ib3NzYS5vcmc+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJICBydHBzYmNwYXk6IFVwZGF0ZSBnc3RyZWFtZXIgcGx1Z2luIHRvIHVzZSBuZXcgc2JjIEFQSS4KKworMjAwOC0wMi0wMiAwMzozNzowNSArMDAwMCAgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorCisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuaDoKKwkgIHJ0cHNiY3BheTogVXBkYXRlIGNvcHlyaWdodCBpbmZvcm1hdGlvbgorCisyMDA4LTAxLTMwIDE0OjIxOjQzICswMDAwICBMdWl6IEF1Z3VzdG8gdm9uIERlbnR6IDxsdWl6LmRlbnR6QG9wZW5ib3NzYS5vcmc+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJICBydHBzYmNwYXk6IEZpeGVzIGdzdHJlYW1lciBjYXBzIGFuZCBjb2RlIGNsZWFudXAuCisKKzIwMDgtMDEtMjQgMTQ6MjU6MjkgKzAwMDAgIEx1aXogQXVndXN0byB2b24gRGVudHogPGx1aXouZGVudHpAb3BlbmJvc3NhLm9yZz4KKworCSogZ3N0L3J0cC9nc3RydHBzYmNwYXkuYzoKKwkgIHJ0cHNiY3BheTogRml4IGd0cmVhbWVyIHBheWxvYWRlciBzZW5kaW5nIGZyYWdtZW50ZWQgZnJhbWVzLgorCisyMDA4LTAxLTIzIDE5OjE3OjMzICswMDAwICBMdWl6IEF1Z3VzdG8gdm9uIERlbnR6IDxsdWl6LmRlbnR6QG9wZW5ib3NzYS5vcmc+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5oOgorCSAgcnRwc2JjcGF5OiBGaXggdXNlIG9mIGdzdHJlYW1lciBwbHVnaW4gd2l0aCByaHl0aG1ib3ggYW5kIGJhbnNoZWUgYW5kIHJ0cCB0aW1lc3RhbXBzLgorCisyMDA4LTAxLTIzIDEzOjE0OjAyICswMDAwICBMdWl6IEF1Z3VzdG8gdm9uIERlbnR6IDxsdWl6LmRlbnR6QG9wZW5ib3NzYS5vcmc+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc2JjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNiY3BheS5oOgorCSAgcnRwc2JjcGF5OiBNYWtlIGEyZHBzaW5rIHRvIGFjdCBsaWtlIGEgYmluIGFuZCBzcGxpdCB0aGUgcGF5bG9hZGVyLgorCisyMDEzLTAxLTA4IDE2OjI3OjQyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHA6IHNtYWxsIGltcHJvdmVtZW50cworCisyMDEzLTAxLTA3IDE1OjUwOjMzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogcmVmYWN0b3IgaGFuZGxlIHN5bmMgY29kZQorCSAgTW92ZSB0aGUgY29kZSB0aGF0IGNvbWJpbmVzIHRoZSBsYXN0IFNSIHBhY2tldCBhbmQgdGhlIGN1cnJlbnQgaml0dGVyYnVmZmVyIHN5bmMKKwkgIHZhbHVlcyBpbnRvIGEgc3luYyBzdHJ1Y3R1cmUsIGludG8gaXRzIG93biBmdW5jdGlvbi4gV2Ugd2FudCB0byByZXVzZSB0aGlzIGJpdAorCSAgbGF0ZXIuCisKKzIwMTMtMDEtMDcgMTU6NDU6MTAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cDogaW5jbHVkZSBkb3duc3RyZWFtIGxhdGVuY3kgaW4gU1IgY2FsY3VsYXRpb25zCisJICBXaGVuIHdlIG1ha2UgYSBtYXBwaW5nIGJldHdlZW4gYW4gUlRQIHRpbWVzdGFtcCBhbmQgYW4gTlRQIHRpbWVzdGFtcCwgaW5jbHVkZQorCSAgdGhlIGRvd25zdHJlYW0gbGF0ZW5jeSBhcHBsaWVkIHRvIHRoZSBzaW5rcy4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBoYXZlCisJICBib3RoIHNpbmtzIHJ1biB3aXRoIGRpZmZlcmVudCBsYXRlbmNpZXMgYW5kIHN0aWxsIGhhdmUgY29ycmVjdCBzeW5jIG9uIHRoZQorCSAgY2xpZW50LiBJdCBhbHNvIGlzIG1vcmUgY29ycmVjdCBiZWNhdXNlIHRoZSBSVFAgdGltZXN0YW1wIGluIHRoZSBTUiByZXBvcnQgd2lsbAorCSAgYWN0dWFsbHkgY29ycmVzcG9uZCBtb3JlIGNsb3NlbHkgdG8gdGhlIE5UUCB0aW1lIGl0IHdhcyBzZW50IG9uIHRoZSBzZXJ2ZXIuCisJICBGb3IgcGlwZWxpbmVzIHdpdGggaGlnaCBsYXRlbmN5IG9uIHRoZSBzZW5kZXIgc2lkZSwgdGhpcyBhY3R1YWxseSBhbGxvd3MgYQorCSAgR1N0cmVhbWVyIHJlY2VpdmVyIHRvIHBlcmZvcm0gc3luY2hyb25pc2F0aW9uIGluc3RlYWQgb2YgZHJvcHBpbmcgdGhlIFJUQ1AKKwkgIHBhY2tldHMuCisKKzIwMTMtMDEtMDcgMTQ6MjU6MTQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGRvbid0IGNhc3QgZXZlbnQgZnVuY3Rpb25zCisJICBUaGVyZSBpcyBubyBuZWVkIHRvIGNhc3QgdGhlIGV2ZW50IGZ1bmN0aW9ucyBhbmQgb25seSBjYXVzZXMgcHJvYmxlbXMgbGF0ZXIgd2hlbgorCSAgd2UgY2hhbmdlIHRoZSBzaWduYXR1cmUgbGF0ZXIgYW5kIHRoaW5ncyBzaWxlbnRseSBjb21waWxlcyB3cm9uZyBjb2RlLgorCisyMDEzLTAxLTA3IDE0OjIzOjM0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHA6IG1vcmUgZGVidWcKKworMjAxMy0wMS0wNyAxNDoyMjo0OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogaW1wcm92ZSBkZWJ1ZworCisyMDEzLTAxLTAyIDAwOjAzOjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBzYW5pdHkgY2hlY2sgc2l6ZSBvZiBhdmFpbGFibGUgcGFja2V0IGRhdGEgZm9yIHJlYWRpbmcgdG8gYXZvaWQgbWVtb3J5IHdhc3RlCisJICBPbiBXaW5kb3dzIGFuZCBPUy9YLCBfZ2V0X2F2YWlsYWJsZV9ieXRlcygpIG1heSBub3QgcmV0dXJuIHRoZSBzaXplCisJICBvZiB0aGUgbmV4dCBwZW5kaW5nIHBhY2tldCwgYnV0IHRoZSBzaXplIG9mIGFsbCBwZW5kaW5nIHBhY2tldHMgaW4KKwkgIHRoZSBrZXJuZWwtc2lkZSBidWZmZXIsIHdoaWNoIG1pZ2h0IGJlIHJhdGhlciBsYXJnZSBkZXBlbmRpbmcgb24KKwkgIGNvbmZpZ3VyYXRpb24uIFNhbml0eS1jaGVjayB0aGUgc2l6ZSByZXR1cm5lZCBieSBfZ2V0X2F2YWlsYWJsZV9ieXRlcygpCisJICB0byBtYWtlIHN1cmUgd2UgbmV2ZXIgYWxsb2NhdGUgbW9yZSBtZW1vcnkgdGhhbiB0aGUgbWF4LiBzaXplIGZvcgorCSAgYSBwYWNrZXQsIGlmIGl0J3MgYW4gSVB2NCBzb2NrZXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjEwMzY0CisKKzIwMTMtMDEtMDQgMTA6MDM6MzIgKzAxMDAgIFJvYmVydCBLcmFrb3JhIDxyb2Iua3Jha29yYUBtZXNzYWdlbmV0c3lzdGVtcy5jb20+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDI6IEFsc28gaGFuZGxlIHRoZSBuZXcgRU5PRU5UIHJldHVybiB2YWx1ZSBvZiBWSURJT0NfUVVFUllDVFJMCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkxMDk4CisKKzIwMTMtMDEtMDEgMTk6MTQ6MzYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJICB0ZXN0czogYWRkIHRlc3QgZm9yIHNvdXBodHRwc3JjIGVycm9yIGhhbmRsaW5nIHdpdGggZGF0YQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3ODQyOQorCisyMDEyLTA2LTIyIDIxOjU2OjUyICswMDAwICBOb3JiZXJ0IFdhc2NoYnVlc2NoIDxud2FzY2hidUBvcGVudHYuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IGVycm9yIG91dCBwcm9wZXJseSB3aGVuIHJlY2VpdmluZyBkYXRhIGFsb25nIHdpdGggYW4gZXJyb3Igc3RhdHVzCisJICBXaGVuIHJlY2VpdmluZyBhbiBlcnJvciBjb2RlIGZyb20gdGhlIGh0dHAgc2VydmVyLCBzdWNoIGFzIDQwNCwKKwkgIGRhdGEgbWlnaHQgYmUgc2VudCBhbG9uZyB3aXRoIGl0LCBsaWtlIGEgd2ViIHBhZ2UuIFdlIGRvbid0IHdhbnQKKwkgIHRvIG91dHB1dCB0aGF0IGRhdGEgaW4gdGhpcyBjYXNlLCBhbmQgd2UgYWxzbyB3YW50IHRvIHBhc3MgdGhlCisJICBGTE9XX0VSUk9SIHJldHVybiBiYWNrIHRvIHRoZSBiYXNlIGNsYXNzLCBzbyBpdCBjYW4gc3RvcCBwcm9wZXJseS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Nzg0MjkKKworMjAxMy0wMS0wMSAxMjoyMDoyMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgZG9jczogdXBkYXRlIGZvciBuZXcgcnRzcHNyYyBwcm94eS1pZCBhbmQgcHJveHktcHcgcHJvcGVydGllcworCisyMDEzLTAxLTAxIDEyOjE5OjIzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSAgZG9jczogZml4IGRvY3MgYnVpbGQgYW5kIHVwZGF0ZSBhZnRlciByZW1vdmFsIG9mIG9sZCBjYWlybyBlbGVtZW50cworCisyMDEzLTAxLTAxIDEyOjEyOjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBleHQvY2Fpcm8vTWFrZWZpbGUuYW06CisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm8uYzoKKwkqIGV4dC9jYWlyby9nc3RjYWlyb3JlbmRlci5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmg6CisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzoKKwkqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5oOgorCSogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6CisJKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuaDoKKwkgIGNhaXJvOiByZW1vdmUgb2xkIGNhaXJvLWJhc2VkIHRleHQgcmVuZGVyZXJpbmcgZWxlbWVudAorCSAgVGhleSBoYXZlbid0IHdvcmtlZCB3ZWxsIG9yIGF0IGFsbCBpbiBhIHZlcnkgbG9uZyB0aW1lCisJICBhbmQgd2VyZSByYXRoZXIgYml0LXJvdHRlbiwgYW5kIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgdGhlbQorCSAgYW55IG1vcmUuCisKKzIwMTMtMDEtMDEgMTE6NTI6MDkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9jYWlyby8uZ2l0aWdub3JlOgorCSogZXh0L2NhaXJvL01ha2VmaWxlLmFtOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvLW1hcnNoYWwubGlzdDoKKwkqIGV4dC9jYWlyby9nc3RjYWlyby5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5oOgorCSogdGVzdHMvZXhhbXBsZXMvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9leGFtcGxlcy9jYWlyby9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL2NhaXJvL2NhaXJvX292ZXJsYXkuYzoKKwkgIGNhaXJvOiBwb3J0IGNhaXJvb3ZlcmxheSB0byAwLjExCisJICBUaGUgb3RoZXIgZWxlbWVudHMgYXJlIG5vdCB0aGF0IGludGVyZXN0aW5nIG5vdyB0aGF0IHdlJ3JlCisJICB1c2luZyBwYW5nb2NhaXJvIGluIHRoZSBwYW5nbyBwbHVnaW4sIGFuZCBzaG91bGQgcHJvYmFibHkKKwkgIGp1c3QgYmUgcmVtb3ZlZC4KKworMjAxMi0xMi0zMSAxODo1OToxOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1kZWNvZGViaW4tSDI2M3AtQU1SLnNoOgorCSAgZXhhbXBsZXM6IGNoZWNrIGZvciB1cmkgYXJndW1lbnQgaW4gZGVjb2RlYmluLWgyNjRwLWFtciBzZXJ2ZXIgZXhhbXBsZQorCSAgT3RoZXJ3aXNlIHBlb3BsZSBnZXQgYSByYXRoZXIgY29uZnVzaW5nIGVycm9yIG1lc3NhZ2UuCisKKzIwMTItMTItMzEgMDA6MjI6MjcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IGFkZCAicHJveHktaWQiIGFuZCAicHJveHktcHciIHByb3BlcnRpZXMKKwkgIHRvIG1hdGNoIHNvdXBodHRwc3JjLiB1c2VyL3Bhc3N3b3JkIHBhc3NlZCB2aWEgdGhlIFVSSQorCSAgd2lsbCBzdGlsbCB0YWtlIHByZWNlZGVuY2UgdGhvdWdoLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTM5NTQyNworCisyMDEyLTEyLTI1IDE2OjQ4OjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBzeXMvb3NzNC9vc3M0LXNpbmsuYzoKKwkgIG9zczRzaW5rOiBub3RpZnkgInZvbHVtZSIgcHJvcGVydHkgb24gb3BlbiB0byBtYWtlIGFwcHMgcXVlcnkgaW5pdGlhbCB2b2x1bWUKKwkgIFRoZSBpbml0aWFsIHZvbHVtZSBtaWdodCBub3QgYmUgdGhlIHByb3BlcnR5IGRlZmF1bHQsIHNvCisJICBlbWl0IGEgbm90aWZ5IG9uIHRoZSB2b2x1bWUgcHJvcGVydHkgdG8gbWFrZSBhcHBzIGdldAorCSAgYW4gdXAtdG8tZGF0ZSByZWFkaW5nIG9mIHRoZSBjdXJyZW50IHZvbHVtZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MzEwNTMKKworMjAxMi0xMi0yMCAxNzoxMjozMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IGNtZCBjb21wYXJpc29uCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkwNDc2CisKKzIwMTItMTItMjAgMTc6MTI6MjAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGFkZCBzb21lIG1vcmUgZGVidWcKKworMjAxMi0xMi0yMCAxNjo0NDoyNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3JhdzEzOTQvZ3N0MTM5NGNsb2NrLmM6CisJICAxMzk0Y2xvY2s6IG1hcmsgb3VyIGNsb2NrIHR5cGUgYXMgT1RIRVIKKworMjAxMi0xMi0yMCAxNjoxNToxMyArMDEwMCAgSm9uYXMgSG9sbWJlcmcgPGpvbmFzaGdAYXhpcy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJICB0ZXN0czogYWRkIGpwZWdwYXkgdW5pdCB0ZXN0CisJICBTZWUgYWxzbyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0OTU1CisKKzIwMTItMTItMjAgMTU6NTU6MDIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuaDoKKwkgIGpwZWdlbmM6IHBhc3MgZmxvd3JldHVybiB1cHN0cmVhbQorCisyMDEyLTA5LTI3IDE1OjQyOjU2ICswMjAwICBKb25hcyBIb2xtYmVyZyA8am9uYXNoZ0BheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBydHBqcGVncGF5OiBoYW5kbGUgd2lkdGggYW5kIGhlaWdodCA+IDIwNDAKKwkgIElmIHdpZHRoIG9yIGhlaWdodCBpcyBncmVhdGVyIHRoYW4gMjA0MCBzZXQgd2lkdGggYW5kIGhlaWdodCB0byB6ZXJvIGluCisJICB0aGUgcnRwIGhlYWRlciBhbmQgYWRkIHgtZGltZW5zaW9ucyB0byBvdXRjYXBzLgorCSAgU29sdmVzICM2ODQ5NTUKKworMjAxMi0xMi0yMCAxMzowMzo0MSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGNsZWFudXAgaW4gZmxhZyBkZWZpbmUKKworMjAxMi0xMi0yMCAxMzowMjo1NyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGltcHJvdmUgZGVidWcKKworMjAxMi0xMi0xOCAxNTo1Njo1OSArMDEwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSAgd2F2cGFjazogdXNlIGFwcHJvcHJpYXRlIHByaW50ZiBmb3JtYXQgZm9yIGdzaXplCisKKzIwMTItMTItMTggMTU6NTU6NDMgKzAxMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJICB0YWdsaWI6IHVzZSBhcHByb3ByaWF0ZSBwcmludGYgZm9ybWF0IGZvciBnc2l6ZQorCisyMDEyLTEyLTE4IDE1OjU0OjA4ICswMTAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZkZWMuYzoKKwkgIGdka3BpeGJ1ZjogdXNlIGFwcHJvcHJpYXRlIHByaW50ZiBmb3JtYXQgZm9yIGdzaXplCisKKzIwMTItMTItMTggMTU6NTE6NDYgKzAxMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkgIHJ0cDogdXNlIGFwcHJvcHJpYXRlIHByaW50ZiBmb3JtYXQgZm9yIGdzaXplCisKKzIwMTItMTItMTggMTU6NDY6NTYgKzAxMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IHVzZSBhcHByb3ByaWF0ZSBwcmludGYgZm9ybWF0IGZvciBnc2l6ZQorCisyMDEyLTEyLTE3IDE2OjM1OjU2ICswMTAwICBQaGlsaXBwZSBOb3JtYW5kIDxwaGlsbkBpZ2FsaWEuY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmg6CisJICBpbnRlcmxlYXZlOiBzZXQgc3JjIHBhZCBjYXBzIHVwb24gbGFzdCBzaW5rIHBhZCBDQVBTIGV2ZW50CisJICBHYXRoZXIgY2FwcyBvbiBhbGwgc2luayBwYWRzIGJlZm9yZSBzZXR0aW5nIHRoZSBzcmMgcGFkIGNhcHMuIFRoaXMgaXMKKwkgIHNwZWNpYWxseSBuZWVkZWQgd2hlbiB0aGUgYXVkaW8gY2hhbm5lbCBtYXBwaW5nIGlzIHNldCBvbiB0aGUgc2luaworCSAgcGFkcyBhbmQgdGhlIGVsZW1lbnQgbmVlZHMgdG8gcHJlc2VydmUgaXQgb24gaXRzIHNyYyBwYWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkwMjY3CisKKzIwMTItMTItMTcgMjI6NTU6MTIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2FkZW11eDogc2tpcCBlbXB0eSB0YWdzCisJICBpbnN0ZWFkIG9mIHRyeWluZyB0byBhZGQgdGFncyB3aXRoIGVtcHR5IHN0cmluZ3MsIHdoaWNoCisJICBjYXVzZXMgY3JpdGljYWxzIGF0IHJ1bnRpbWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkwMzU4CisKKzIwMTItMTItMTcgMTU6MTc6MTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2VyczogTWFrZSBzdXJlIHRoZSBjYXBzIGFyZSBhY3R1YWxseSB3cml0YWJsZSBiZWZvcmUgY2hhbmdpbmcgdGhlbQorCisyMDEyLTEyLTE3IDE1OjAxOjAyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IFVzZSB0aGUgcGVlciBjYXBzIGZvciByZXN0cmljdGlvbnMgaW5zdGVhZCBvZiB0aGUgc3JjcGFkIGFsbG93ZWQgY2FwcworCSAgT3RoZXJ3aXNlIHdlIHdpbGwgaW50ZXJzZWN0IHdpdGggdGhlIHNyY3BhZCB0ZW1wbGF0ZSBjYXBzIGFuZCBhZGQgYWxsIHRoZSBjYXBzIGZpZWxkcworCSAgdGhhdCB0aGUgcGFyc2VyIHdpbGwgZXZlciBzZXQsIG5vIG1hdHRlciBpZiBkb3duc3RyZWFtIHJlc3RyaWN0cyB0aGlzIGZpZWxkIG9yIG5vdC4KKwkgIFRoaXMgcmVxdWlyZXMgdXBzdHJlYW0gdG8gc2V0IHRoaXMgZmllbGQgb24gdGhlIGNhcHMgdG8gc3VjY2Vzc2Z1bGx5IG5lZ290aWF0ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTAxODQKKworMjAxMi0xMi0xNCAyMjoyNTowOCArMDAwMCAgS29vcCBNYXN0IDxrd21AcmFpbmJvdy1ydW5uZXIubmw+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIHY0bDI6IFRlYWNoIHdoZXJlIHRoZSB2aWRlb2RldjIuaCBoZWFkZXIgbGl2ZXMgb24gZnJlZWJzZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02OTAyMzMKKworMjAxMi0xMi0xNiAyMzoyNzo0MSArMDAwMCAgQWxleGV5IEZpc2hlciA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogc2V0IGFwcHJvcHJpYXRlIGJsb2NrIGhlYWRlciBmbGFnIGZvciBWUDggaW52aXNpYmxlIGZyYW1lcworCSAgVXNlZnVsIGZvciBkZWJ1Z2dpbmcgbW9zdGx5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NDI1OQorCisyMDEyLTEyLTE2IDE1OjI1OjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJICBkb2NzOiBhZGQgcnRwbXV4IGFuZCBydHBkdG1mbXV4IHRvIHBsdWdpbiBkb2NzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjI5MTE3CisKKzIwMTItMTItMTYgMTU6MTM6MzggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbWFuYWdlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkgIHJ0cG1hbmFnZXI6IG1vdmUgcnRwbXV4IGFuZCBydHBkdG1mbXV4IGVsZW1lbnRzIGZyb20gLWJhZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYyOTExNworCisyMDEyLTExLTAzIDIwOjM4OjAwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4Lmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cG11eC5jOgorCSAgcnRwbXV4OiBGaXggRlNGIGFkZHJlc3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc1MjAKKworMjAxMi0xMC0xNyAxNzozNDoyNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBVc2UgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSgpCisJICB3aGVyZSBwb3NzaWJsZS4gQXZvaWRzIHNvbWUgc3RyaW5nIGNvcGllcy4gQWxzbyByZS1pbmRlbnQKKwkgIHNvbWUgc3R1ZmYuIEFsc28gc29tZSBpbmRlbnQgZml4ZXMgaGVyZSBhbmQgdGhlcmUuCisKKzIwMTItMDktMTAgMjA6Mzg6MTQgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwbXV4LmM6CisJICBydHBtdXg6IE1pc2MgZml4IGZvciAwLjExCisJICBDb252ZXJ0IHRoZSBpbmNvbWluZyBjYXBzIGJlZm9yZSBwcm94eWluZyB0aGVtCisJICBDbGVhciB0aGUgbGFzdF9wYWQgd2hlbiBnb2luZyB0byByZWFkeQorCSAgdGVzdHM6IEltcGxlbWVudCBhY2NlcHRfY2FwcywgZG9uJ3QgbGVhayBldmVudAorCisyMDEyLTA3LTE3IDE2OjM5OjAyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogdXBkYXRlIGZvciBSVFAgYnVmZmVyIGFwaSBjaGFuZ2VzCisKKzIwMTItMDQtMDUgMTg6MDI6NTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXhlci5jOgorCSAgcnRwbXV4OiBVcGRhdGUgZm9yIEdTVF9QTFVHSU5fREVGSU5FKCkgQVBJIGNoYW5nZXMKKworMjAxMi0wNC0wMiAxMTowNzoxOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IGZpeCBjb21waWxhdGlvbgorCisyMDEyLTAzLTExIDE5OjA2OjU5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogZml4IGZvciBjYXBzIGFwaSBjaGFuZ2VzCisKKzIwMTItMDEtMjYgMDY6NTg6NDYgLTA1MDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBGaXggY29tcGlsZXIgd2FybmluZ3MKKworMjAxMi0wMS0yOSAxODowMTowNSArMDAwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IFVucmVmIG5vbi1mb3J3YXJkZWQgZXZlbnRzCisJICBBbHNvLCBkb24ndCB1bnJlZiBmb3J3YXJkZWQgb25lcworCisyMDEyLTAxLTI4IDE2OjU3OjAzICswMDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogcmVzeW5jIGl0ZXJhdG9yIG9uIHJlc3luYworCisyMDEyLTAxLTI3IDEyOjA4OjUyICswMTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oOgorCSAgcnRwbXV4OiBSZS1wdXNoIHN0aWNreSBldmVudHMgb24gaW5wdXQgcGFkIGNoYW5nZQorCisyMDEyLTAxLTI1IDE1OjQzOjAxICswMTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogRG9uJ3QgbGVhayBndmFsdWUgZnJvbSBpdGVyYXRvcgorCisyMDEyLTAxLTI1IDE2OjQ2OjQ0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogbW9yZSBwb3J0aW5nCisKKzIwMTItMDEtMjQgMTQ6MjA6NTIgKzAxMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4Lmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBtdXguYzoKKwkgIHJ0cG11eDogcG9ydCB0byAwLjExCisKKzIwMTEtMTEtMDQgMTI6MjI6MzcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBtYWtlIHJlcXVlc3QgcGFkcyB0YWtlIF8ldQorCisyMDExLTA0LTE0IDE0OjM0OjI2IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4Lmg6CisJICBydHBkdG1mbXV4OiBBZGQgbGFzdC1zdG9wIHRvIGR0bWYtZXZlbnQgdXBzdHJlYW0gZXZlbnRzCisJICBBZGQgdGhlIHJ1bm5pbmcgdGltZSBvZiB0aGUgbGFzdCBvdXRwdXR0ZWQgYnVmZmVyIHRvIHRoZQorCSAgdXBzdHJlYW0gImR0bWYtZXZlbnQiIGV2ZW50cyBzbyB0aGF0IHRoZSBkdG1mIHNvdXJjZSBkb2VzIG5vdAorCSAgbGVhdmUgYSBnYXAuCisKKzIwMTAtMTEtMjUgMTk6MjE6MTEgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBSZW1vdmUgZGVhZCBhc3NpZ25tZW50cworCisyMDEwLTEwLTE5IDEzOjQzOjE0ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBhZGQgbWlzc2luZyBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIGZsYWdzCisJICBDYW5vbmljYWxpemUgcHJvcGVydHkgbmFtZXMgYXMgbmVlZGVkLgorCisyMDEwLTA5LTMwIDE2OjA3OjI5IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBJbXByb3ZlIGRvY3VtZW50YXRpb24KKwkgIEFkZCBhbiBleGFtcGxlIHBpcGVsaW5lLCBhbmQgdHJ5IHRvIGV4cGxhaW4gYSBiaXQgbW9yZSB3aGF0IGl0IGRvZXMuCisKKzIwMTAtMDktMjQgMTM6Mjk6NTUgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSAgcnRwZHRtZm11eDogcmVtb3ZlIHVudXNlZCB2YXJpYWJsZQorCisyMDEwLTA5LTI0IDEzOjI1OjIyICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkgIHJ0cGR0bWZtdXg6IHJlbW92ZSB1bnVzZWQgc2lnbmFsIGJvaWxlcnBsYXRlCisKKzIwMTAtMDktMjQgMTM6MjQ6NDggKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IG5vIG5lZWQgdG8gcmVmIHBhZCBpbiBfY2hhaW4oKQorCisyMDEwLTA4LTI1IDIyOjU2OjAzIC0wNDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogVW5sb2NrIHRoZSByaWdodCBtdXRleAorCSAgVGhlIG11dGV4IGxvY2tlZCBpcyBmb3IgdGhlICdtdXgnIG9iamVjdCwgYnV0IHdlIHVubG9jayB0aGUKKwkgIHBhZCwgd2hpY2ggbWVhbnMgdGhhdCBpZiB0aGUgcnRwbXV4IGdldHMgYSBmbHVzaCwgdGhlbiB0aGUKKwkgIG9iamVjdCBsb2NrIHdpbGwgc3RheSBsb2NrZWQgZm9yZXZlciwgY2F1c2luZyBpdCB0byBmcmVlemUKKwkgIHRoZSBuZXh0IHRpbWUgaXQgdHJpZXMgdG8gdGFrZSBpdC4KKwkgIEZpeGVzIGJ1ZyAjNjI3OTkxCisKKzIwMTAtMDctMDEgMTU6MTk6MTIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkgIHJ0cG11eDogQWRkIHN1cHBvcnQgZm9yIEdzdEJ1ZmZlckxpc3QKKwkgIEZhY3RvciBvdXQgbW9zdCBvZiB0aGUgYnVmZmVyIGhhbmRsaW5nIGFuZCBpbXBsZW1lbnQgYSBjaGFpbl9saXN0CisJICBmdW5jdGlvbi4gQWxzbywgdGhlIERUTUYgbXV4ZXIgaGFzIGJlZW4gbW9kaWZpZWQgdG8ganVzdCBoYXZlIGEKKwkgIGZ1bmN0aW9uIHRvIGFjY2VwdCBvciByZWplY3QgYSBidWZmZXIgaW5zdGVhZCBvZiBoYXZpbmcgdG8gc3ViY2xhc3MKKwkgIGJvdGggY2hhaW4gYW5kIGNoYWluX2xpc3QuCisKKzIwMTAtMDctMDEgMTU6MTU6NDkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IERvbid0IGxlYWsgaW52YWxpZCBidWZmZXJzCisKKzIwMTAtMDYtMDMgMTA6NDM6MjAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJICBydHBtdXg6IGZpeCBtaXNzaW5nIGRlYnVnIGxvZyBtZXNzYWdlIGFyZ3VtZW50CisKKzIwMTAtMDUtMTAgMTg6Mzc6NTUgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSAgcnRwZHRtZm11eDogQWRkIHNvbWUgZGVidWcgbWVzc2FnZXMKKworMjAxMC0wNS0wNyAxODo1Njo1NyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4Lmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oOgorCSAgcnRwZHRtZm11eDogUmVtb3ZlIHN0cmVhbS1sb2NrIGV2ZW50IGhhbmRsaW5nCisKKzIwMTAtMDUtMDcgMTg6NTQ6NDkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSAgcnRwZHRtZm11eDogVXBkYXRlIGRvYyBmb3Igc2ltcGxpZmljYXRpb24KKworMjAxMC0wNS0wNyAxODo0MDozMCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBtdXguYzoKKwkgIHRlc3RzOiBDaGFuZ2UgdGVzdHMgdG8gbm90IHVzZSB0aGUgcHJpb3JpdHkgcGFkcyBpbnN0ZWFkIG9mIHRoZSBldmVudHMKKworMjAxMC0wNS0wNiAxOTo1MTo1OSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4Lmg6CisJICBydHBkdG1mbXV4OiBEcm9wIGJ1ZmZlcnMgb24gbm9uLXByaW9yaXR5IHNpbmtzIHdoZW4gc29tZXRoaW5nIGlzIGluY29taW5nIG9uIHRoZSBwcmlvcml0eSBzaW5rCisKKzIwMTAtMDUtMDYgMTg6MTE6NDAgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkgIHJ0cGR0bWZtdXg6IEFkZCBwcmlvcml0eSBzaW5rIHBhZHMKKworMjAxMC0wNS0wNyAxNzoxNTo0NyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJICBydHBkdG1mbXV4OiBDbGVhbnVwIGV2ZW50IGZ1bmN0aW9uCisKKzIwMTAtMDUtMDcgMTY6NDI6MjIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cG11eC5jOgorCSAgcnRwbXV4OiBBZ2dyZWdhdGUgaW5jb21pbmcgc2VnbWVudHMKKworMjAxMC0wNS0wNiAxOTowOTo0OCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJICBydHBkdG1mbXV4OiBVcGRhdGUgZG9jdW1lbnRhdGlvbgorCisyMDEwLTA1LTA2IDE4OjEwOjQ1IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4Lmg6CisJICBydHBtdXg6IFNpbXBsaWZ5IHJlcXVlc3QgcGFkIGNyZWF0aW9uCisKKzIwMTAtMDMtMjEgMjE6Mzk6MTggKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwbXV4LmM6CisJICBBZGQgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV21pc3NpbmctcHJvdG90eXBlcyB0byBjb25maWd1cmUgZmxhZ3MKKwkgIEFuZCBmaXggYWxsIHdhcm5pbmdzCisKKzIwMTAtMDMtMTggMTc6MzA6MjYgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IGdzdF9lbGVtZW50X2NsYXNzX3NldF9kZXRhaWxzID0+IGdzdF9lbGVtZW50X2NsYXNzX3NldF9kZXRhaWxzX3NpbXBsZQorCisyMDA5LTExLTE4IDE2OjM4OjMzICswMTAwICB1bmtub3duIDxoYXZhcmQuZ3JhZmZALmV1LnRhbmRiZXJnLmludD4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IHVwZGF0ZSB0aGUgY3VycmVudF9zc3JjIGZyb20gdGhlIGNhcHMKKwkgIEZpeGVzICM2MDQxMDEKKworMjAwOS0xMi0wOSAxNDo0MjoyMSArMDEwMCAgSMOldmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQHRhbmRiZXJnLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IHJlbGVhc2UgcGFkcyB3aGVuIGRpc3Bvc2luZworCSAgQmVjYXVzZSBvZiBhbiBhbGxvY2F0ZWQgcHJpdiAoR3N0UlRQTXV4UGFkUHJpdmF0ZSksIHRoZSBlbGVtZW50IHdpbGwKKwkgIGxlYWsgbWVtb3J5IGlmIG5vdCBnc3RfcnRwX211eF9yZWxlYXNlX3BhZCgpIGlzIGNhbGxlZC4gVGhpcyB3b3VsZAorCSAgcHJldmlvdXNseSBvbmx5IGhhcHBlbiBpZiByZWxlYXNlX3JlcXVlc3RfcGFkKCkgd2FzIGNhbGxlZCBleHBsaWNpdGx5LAorCSAgc29tdGhpbmcgdGhhdCBzaG91bGQgbm90IGJlIG5lY2Nlc2FyeS4KKwkgIEZpeGVzICM2MDQwOTkKKworMjAwOS0xMi0wOSAxMzo0MDo0MyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSAgZHRtZm11eDogbWV0aG9kIG5hbWUgY2xlYW51cHMKKworMjAwOS0xMC0wOCAxOTowNjoyNiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBtdXguYzoKKwkgIHRlc3RzOiBBZGQgdGVzdCBmb3IgcnRwZHRtZm11eCBsb2NraW5nCisKKzIwMDktMDktMjggMTk6NTQ6NTMgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwbXV4LmM6CisJICB0ZXN0czogQWRkIHVuaXQgdGVzdCBmb3IgcnRwbXV4CisKKzIwMDktMDktMjggMTM6MzY6NDQgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IERvbid0IGlnbm9yZSByZXF1ZXN0ZWQgcGFkIG5hbWUKKworMjAwOS0wNy0yOSAxNzoyMzozMSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogUmVtb3ZlIGVtcHR5IGZpbmFsaXplCisKKzIwMDktMDctMjEgMTU6MzE6MzMgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IEZyZWUgdGhlIHBhZCBwcml2YXRlIGRhdGEgb24gcGFkIHJlbGVhc2UKKwkgIEZyZWUgdGhlIHBhZCBwcml2YXRlIGRhdGEgb24gcGFkIHJlbGVhc2UgaW5zdGVhZCBvZiB1c2luZyBhIHdlYWsgcmVmLAorCSAgd2hpY2ggaXMgbm90IHRocmVhZCBzYWZlLiBBbHNvLCBsb2NrIHRoZSBjb250ZW50IG9mIHRoZSBwYWQgcHJpdmF0ZSB1c2luZyB0aGUgZWxlbWVudCdzCisJICBvYmplY3QgbG9jay4KKworMjAwOS0wNC0yOCAxNjoxMDoyMSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogUmVqZWN0IHdyb25nIGNhcHMKKworMjAwOS0wNC0yOCAxNjowMzoxOSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogRml4IGxlYWsgRml4ZWQgYSBsZWFrIGRpc2NvdmVyZWQgYnkgTGF1cmVudCBHbGF5YWwgPHNwZWdsZUB5YWhvby5mcj4KKworMjAwOS0wNC0yOCAxNTo1ODo0MSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogRml4IGxlYWsKKwkgIEZpeGVkIGEgbGVhayBkaXNjb3ZlcmVkIGJ5IExhdXJlbnQgR2xheWFsIDxzcGVnbGVAeWFob28uZnI+CisKKzIwMDktMDQtMjIgMTg6MDE6MDcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IEZpeCB3YXJuaW5nCisKKzIwMDktMDQtMjAgMjA6MDA6MTUgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IFNldCBkaWZmZXJlbnQgY2FwcyBkZXBlbmRpbmcgb24gdGhlIGlucHV0CisKKzIwMDktMDQtMjIgMTY6MjU6MDcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IE9ubHkgZnJlZSBwYWQgcHJpdmF0ZSB3aGVuIHBhZCBpcyBkaXNwb3NlZAorCisyMDA5LTA0LTIwIDE4OjQxOjM5IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBSZW1vdmUgdXNlbGVzcyBjYXBzIG1hbmdsaW5nCisKKzIwMDktMDQtMjAgMTg6MzY6NDIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IFJlbmFtZSB2YXJpYWJsZSBmb3IgbW9yZSBjbGFyaXR5CisKKzIwMDktMDQtMjAgMTc6NDM6MzkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IFVzZSBHU1RfQk9JTEVSUExBVEUKKworMjAwOS0wNC0yMCAxNzo0Mjo0MCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4Lmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogRG8gdGhlIGluY2x1ZGVzIGxvY2FsbHkKKworMjAwOS0wNC0xNSAxMzoyMzowMSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogQWRkIEdTVF9ERUJVR19GVU5DUFRScworCisyMDA5LTA0LTE1IDEzOjE1OjU1IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkgIHJ0cGR0bWZtdXg6IFJlbGVhc2UgbG9ja2VkIHBhZCBvbiByZWxlYXNlX3BhZAorCSAgUmVsZWFzZSB0aGUgc3BlY2lhbCBwYWQgaWYgdGhlIHBhZCBpcyByZW1vdmVkIGZyb20gdGhlIG11eGVyLgorCisyMDA5LTA0LTE1IDEzOjA5OjI3IC0wNDAwICBMYXVyZW50IEdsYXlhbCA8c3BnbGVnbGVAeWFob28uZnI+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkgIHJ0cGR0bWZtdXg6IFJlbGVhc2Ugc3BlY2lhbCBvbiBwYWQgZGlzcG9zZQorCSAgRml4ZXMgIzU3NzY5MAorCisyMDA5LTAyLTI1IDExOjQ1OjA1ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgZG9jczogdmFyaW91cyBkb2MgZml4ZXMKKwkgIE5vIHNob3J0LWRlc2MgYXMgd2UgaGF2ZSB0aGVtIGluIHRoZSBlbGVtZW50IGRldGFpbHMuCisJICBBbHNvIGtlZXAgdGhpbmdzIChNYWtlZmlsZS5hbSBhbmQgc2VjdGlvbnMudHh0KSBzb3J0ZWQuCisJICBSZXdvcmQgYW1iaWdvdXMgcmV0dXJucy4gTm8gdGV4dCBhZnRlciBzaW5jZSBwbGVhc2UuCisKKzIwMDktMDItMTAgMTc6MDI6MjQgKzAwMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4ZXIuYzoKKwkgIHJ0cG11eDogTW92ZSBydHBtdXggZnJvbSBnc3QtcGx1Z2lucy1mYXJzaWdodCB0byAtYmFkCisKKzIwMDktMDItMjAgMTc6NDU6NTAgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eGVyLmM6CisJICBydHBtdXg6IFJlLWluZGVudCB0byBHc3Qgc3R5bGUKKworMjAwOS0wMi0xMCAxOToxMToxNSArMDAwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogRG9jdW1lbnQgcnRwIG11eGVyIGEgYml0CisKKzIwMDktMDItMjAgMTM6MzA6NDkgLTA1MDAgIExhdXJlbnQgR2xheWFsIDxzcGdsZWdsZUB5YWhvby5mcj4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5oOgorCSAgcnRwbXV4OiBBZGQgc2lnbmFscyBiZWZvcmUgc3RyZWFtIGxvY2sgYW5kIGFmdGVyIHVubG9ja2luZworCisyMDA5LTAyLTE4IDIwOjE4OjQ2IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBMZXQgc3NyYyB0aHJvdWdoIGdldGNhcHMKKworMjAwOS0wMi0xOCAxOTo1ODo1OCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogUmVuYW1lIGhhdmVfYmFzZSB0byBoYXZlX3RzX2Jhc2UKKworMjAwOS0wMi0xOCAxODoxNDo1MiAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oOgorCSAgcnRwbXV4OiBQcm90ZWN0IHRoZSBzZXFudW0gd2l0aCBvYmplY3QgbG9jayBpbiBydHBtdXgKKworMjAwOS0wMi0xOCAxODowNzo0NCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkgIHJ0cG11eDogUmVtb3ZlIHVudXNlZCBzaW5rX3RzX2Jhc2UKKworMjAwOS0wMi0xOCAxNToyMDo1OCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogSGF2ZSBnZXRjYXBzIHRvIGZvcmNlIHRoZSBzYW1lIGNsb2NrcmF0ZSBvbiBhbGwgcGFkcworCisyMDA5LTAyLTE4IDE3OjA1OjEzIC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBWYWxpZGF0ZSBSVFAgZGF0YSBpbiBSVFAgTXV4CisKKzIwMDktMDItMTggMTQ6MTY6MDAgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkgIHJ0cG11eDogUmVtb3ZlIHVudXNlZCBjbG9jay1yYXRlIHByb3BlcnR5CisKKzIwMDktMDItMTggMTM6NTY6MzYgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5oOgorCSAgcnRwbXV4OiBDbGFyaWZ5IGxvY2tpbmcgaW4gcnRwZHRtZm11eAorCisyMDA5LTAyLTE4IDEzOjMyOjU2IC0wNTAwICBMYXVyZW50IEdsYXlhbCA8c3BnbGVnbGVAeWFob28uZnI+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBNaXNzaW5nIGZvcm1hdCBwYXJhbWV0ZXIKKworMjAwOC0xMi0wMSAxNzo1NToyMiAtMDUwMCAgSMOldmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQHRhbmRiZXJnLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IFVwZGF0ZSBzZXFudW0gYmFzZSBpbiBydHAgbXV4ZXIKKwkgIFdpdGggaGVscCBmcm9tIFdpbQorCisyMDA4LTEyLTAxIDE3OjU0OjU4IC0wNTAwICBIw6V2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAdGFuZGJlcmcuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogRml4IHNvbWUgbW9yZSBsZWFrcworCisyMDA4LTEyLTAxIDE3OjQ4OjI5IC0wNTAwICBIw6V2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAdGFuZGJlcmcuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmM6CisJICBydHBtdXg6IEZpeCBsZWFrCisKKzIwMDgtMDktMjkgMTU6MDM6MDUgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IERvbid0IHVucmVmIGNhcHMgd2UgZG9uJ3Qga25vdyAodGhhbmtzIFdpbSkKKworMjAwOC0wOC0xMiAxMjo0ODowMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogUHV0IHBlci1idWZmZXIgZGVidWcgYXQgbGV2ZWwgTE9HCisKKzIwMDgtMDgtMTIgMTI6NDc6MTQgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IE1ha2UgZGVidWcgcHJpbnQgYWNjdXJhdGUKKworMjAwOC0wOC0xMiAxMjo0NjoyMyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogU2V0IG91ciBjYXBzIG9uIHRoZSBidWZmZXJzCisKKzIwMDgtMDgtMTIgMTI6NDY6MDcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IFRha2UgdGhlIGNsb2NrLWJhc2Ugc3RvcmVkIGZyb20gdGhlIGxhc3Qgc2V0Y2FwcworCisyMDA4LTA4LTEyIDEyOjQxOjU5IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBTdG9yZSB0aGUgY2xvY2stYmFzZSBvbiBzZXRjYXBzCisKKzIwMDgtMDgtMTIgMTI6MzA6NTIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IEFkZCBwYWRwcml2YXRlIHRvIHRoZSByZXF1ZXN0IHBhZHMKKworMjAwOC0wOC0xMSAyMToyMDowNiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogTWFrZSBpbmRlbnRhdGlvbiBtb3JlIGNvcnJlY3QKKworMjAwOC0wOC0xMSAyMTowNTozNCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogRml4IHR5cG8KKworMjAwOC0wOC0xMSAyMTowMzoyMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogU2V0IHNlcW51bS1iYXNlIGFuZCBjbG9jay1iYXNlIGluIGNhcHMgZnJvbSBydHBtdXhlcgorCisyMDA3LTA4LTE1IDEzOjUwOjM4ICswMDAwICBaZWVzaGFuIEFsaSA8Zmlyc3QubGFzdEBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkgIHJ0cG11eDogbW9yZSBkZWJ1ZworCSAgMjAwNzA4MTUxMzUwMzgtZjNmMWUtOWM3YTU0OTBhNTI1YzZlODc1M2NiMWI4YzAzMzU0ZGY5OTEzMmI1Yy5negorCisyMDA3LTA4LTIwIDE4OjUwOjMyICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogbWlzc2luZyBjb21tZW50CisJICAyMDA3MDgyMDE4NTAzMi00ZjBmNi0wYWI2N2I2YWM0MGRkNGUzNWE4ZmU1M2YzY2I2ZGFmZjY1Y2U0M2I5Lmd6CisKKzIwMDctMDctMTIgMTk6NTM6MzYgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogTWFrZSBidWZmZXIgd3JpdGFibGUgYmVmb3JlIHdyaXRpbmcgaW50byBpdAorCSAgMjAwNzA3MTIxOTUzMzYtM2UyZGMtOTFhNWZiNzk3Y2ZhNDkxOWQ0ZTJmOWE3MjhjNmQ2ZmJkM2I4M2Q5My5negorCisyMDA3LTA3LTA2IDIwOjI0OjU5ICswMDAwICBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IFNldCBwYWRzIGFjdGl2ZSB3aGVuIGFkZGluZyB0aGVtIHRvIGEgcG90ZW50aWFsbHkgcnVubmluZyBlbGVtZW50CisJICAyMDA3MDcwNjIwMjQ1OS0zZTJkYy1hMzczMWY4ODU3MjU1OTRkZWYwYTdiZTk5N2ZjN2IzYTczOWVlOTY3Lmd6CisKKzIwMDctMDYtMDcgMTI6MDE6MjEgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogRml4IG11bHRpcGxlIHJlZiBsZWFrcyAocGF0Y2hlcyBieSBTUCBHTEUpCisJICAyMDA3MDYwNzEyMDEyMS0zZTJkYy0wNjFlOWVmN2E0N2IxYjg0ZmE4ZjgwOTJmNGI4YmNjMGU2ZGI4YzhjLmd6CisKKzIwMDctMDUtMjggMTU6MjU6MDUgKzAwMDAgIFplZXNoYW4gQWxpIDxmaXJzdC5sYXN0QG5va2lhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IHNlbmQgZXZlbnQgdG8gYWxsIHNyYyBwYWRzCisJICAyMDA3MDUyODE1MjUwNS1mM2YxZS0wMzkyMTZjNzNkYzkzZjY0YzQ5OTYyYzc3YTAyNTNjYjljZmVjNGQzLmd6CisKKzIwMDctMDUtMjggMTI6Mzc6NDkgKzAwMDAgIFplZXNoYW4gQWxpIDxmaXJzdC5sYXN0QG5va2lhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IHByaW50IGEgd2FybmluZyBpZiByZWNlaXZlIGFuIGVycm9yIGl0ZXJhdGluZyBzaW5rcGFkcworCSAgMjAwNzA1MjgxMjM3NDktZjNmMWUtNGMxZWIzZjUxMWI1NjEwMTQzNjEwYTY1YTk0ZDExN2YyYzNkMjU4MC5negorCisyMDA3LTA1LTI4IDEyOjI4OjA4ICswMDAwICBaZWVzaGFuIEFsaSA8Zmlyc3QubGFzdEBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBkZWFsIHdpdGggYWxsIHRoZSBnc3RfaXRlcmF0b3JfbmV4dCgpIHJldHVybiB2YWx1ZXMKKwkgIDIwMDcwNTI4MTIyODA4LWYzZjFlLWQzMDE2NDRjM2JlNzYzM2VjNmRjNWUyODU5NmU5MzQ2ZDJkYTZhNTAuZ3oKKworMjAwNy0wNS0yNSAxMjozMToxNiArMDAwMCAgWmVlc2hhbiBBbGkgPGZpcnN0Lmxhc3RAbm9raWEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogUmV0dXJuIGNvcnJlY3QgdmFsdWUgZnJvbSB0aGUgZXZlbnQgaGFuZGxlcgorCSAgMjAwNzA1MjUxMjMxMTYtZjNmMWUtMTMxYjM3YjVmNDUyMTYxOGZlMmYxMzIwNDA5YTQ3ZTY1YjM1YWQyZC5negorCisyMDA3LTA1LTI1IDEwOjI3OjA5ICswMDAwICBaZWVzaGFuIEFsaSA8Zmlyc3QubGFzdEBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBWaWxsZSdzIG9yaWdpbmFsIHBhdGNoIHRvIGZpeCB0aGUgdHJhdmVyc2FsIG9mIGR0bWYgZXZlbnQKKwkgIDIwMDcwNTI1MTAyNzA5LWYzZjFlLTZjNDFkMWVmOTM0MDY4YTRmNGU4MTBlN2U5ODFiNDIwMDc1YjBjOTguZ3oKKworMjAwNy0wMy0yOSAxMzo1Mjo1MCArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBTZXQgdGhlIGNvcnJlY3QgdHMtb2Zmc2V0IG9uIHRoZSBnZXRfcHJvcCB2YWx1ZQorCSAgMjAwNzAzMjkxMzUyNTAtNjUwMzUtYTQzZTIyMmQ5MWQ1N2MwYTYxY2IzMjg3NTg2YWFhMjlhYmY3ODY3NC5negorCisyMDA3LTAzLTI5IDEzOjUyOjIzICswMDAwICB6ZWVzaGFuLmFsaUBub2tpYS5jb20gPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IFJlZmFjdG9yaXplIHN0YXRlX2NoYW5nZQorCSAgMjAwNzAzMjkxMzUyMjMtNjUwMzUtMjNhMDEwN2IyZTM5NzcxMGYwMzVjNmU4OGNjMGU0OWI2NWJiNGQ1ZC5negorCisyMDA3LTAzLTI5IDEzOjM2OjIyICswMDAwICB6ZWVzaGFuLmFsaUBub2tpYS5jb20gPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkgIHJ0cG11eDogc2V0IFNTUkMgb24gdGhlIHBhY2tldHMKKwkgIDIwMDcwMzI5MTMzNjIyLTY1MDM1LTFiZTZlMGFhODVhNzEzODlmN2QyNTdiOWNkM2UxM2E3M2Q2Yjc0NWIuZ3oKKworMjAwNy0wMy0yOSAxMzoxOTozNiArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBDb2RlIGNsZWFuLXVwIGFuZCBtb3JlIGRlYnVnIG91dHB1dAorCSAgMjAwNzAzMjkxMzE5MzYtNjUwMzUtOWQ0OTllMjA5ZTBkN2E0MDljM2FhMGQxMDQwNzc4YmFiZjA3NjE3OS5negorCisyMDA3LTAzLTI4IDExOjIyOjE5ICswMDAwICB6ZWVzaGFuLmFsaUBub2tpYS5jb20gPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaDoKKwkgIHJ0cG11eDogVXNlIG93biBjbG9jay1iYXNlCisJICAyMDA3MDMyODExMjIxOS02NTAzNS0xYmE1ZmVmYmM2NTA1OWU5YjBjODYwNTI4YTMxMDYyY2ViNmE3MzMxLmd6CisKKzIwMDctMDMtMjMgMTY6MzE6MzkgKzAwMDAgIHplZXNoYW4uYWxpQG5va2lhLmNvbSA8emVlc2hhbi5hbGlAbm9raWEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oOgorCSAgcnRwbXV4OiBPbmx5IGFjY2VwdCBSVFAgc3RyZWFtcyB0aGF0IGhhdmUgdGhlIHNhbWUgY2xvY2stcmF0ZQorCSAgMjAwNzAzMjMxNjMxMzktNjUwMzUtZmMwYjE3YjBiOGE3YTA0MWY0ODk5NGM0ZjI2ZTk2NTY4MTY4YmY5NS5negorCisyMDA3LTAzLTIyIDE2OjE1OjUyICswMDAwICB6ZWVzaGFuLmFsaUBub2tpYS5jb20gPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSAgcnRwbXV4OiBTb21lIG1vcmUgY29kZS1jbGVhbnVwcworCSAgMjAwNzAzMjIxNjE1NTItNjUwMzUtYmRhOTYxNjVlMTQ2YjRmMWQ1ZmVhMWNjOTU3NmE3YWIzYWJlYmM5ZS5negorCisyMDA3LTAzLTIyIDE1OjQyOjUxICswMDAwICB6ZWVzaGFuLmFsaUBub2tpYS5jb20gPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IHJldHVybiBuZXdwYWQgaW5zdGVhZCBvZiBOVUxMIGFuZCB3YXJuIGlmIGZhaWxlZCB0byBjcmVhdGUgYSBwYWQKKwkgIDIwMDcwMzIyMTU0MjUxLTY1MDM1LWNkYjY2NTFlNjFjMmViMDIwNWNjOGMyNDY5M2I0M2Y5OGEyZGE3MTguZ3oKKworMjAwNy0wMy0yMiAxMjo0MTozMiArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBSZWZhY3Rvcml6ZSB0aGUgUlRQTXV4IGNvZGUKKwkgIDIwMDcwMzIyMTI0MTMyLTY1MDM1LTBhMzI3ODE0NzU0NmUzM2Y2ODcwOTdhNDNiNzc1YjNmNmFhOTlmOTMuZ3oKKworMjAwNy0wMy0yMiAxMjoxNDo1MyArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkgIHJ0cG11eDogU29tZSBtb3JlIGRvYyBmaXhpbmcKKwkgIDIwMDcwMzIyMTIxNDUzLTY1MDM1LTEyZDYwMjI3MjIxN2I1MWJkOTdkZjRlNTc5MDAyNGMzOTk2MjJkZDMuZ3oKKworMjAwNy0wMy0yMiAxMTozMjoyOCArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkgIHJ0cG11eDogTW9yZSBSZWZhY3RvcmluZworCSAgMjAwNzAzMjIxMTMyMjgtNjUwMzUtYmFlMzRhNzk1OTllN2RlNTI5M2VkNzdiMDIyMzYxY2NmZjgyMmJiOS5negorCisyMDA3LTAzLTIyIDExOjMxOjU0ICswMDAwICB6ZWVzaGFuLmFsaUBub2tpYS5jb20gPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jOgorCSAgcnRwbXV4OiBNb3JlIGRvY3VtZW50YXRpb24KKwkgIDIwMDcwMzIyMTEzMTU0LTY1MDM1LTYyNDg1MDU0MWE1YjVmYzNkZjIzMTIwNGJlNWE4M2QwNzIzOWRiMjguZ3oKKworMjAwNy0wMy0yMSAxNjozMzoxMSArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkgIHJ0cG11eDogUmVmYWN0b3IgdGhlIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24KKwkgIDIwMDcwMzIxMTYzMzExLTY1MDM1LTk4N2U3ZjI1ZDFhYjUzMzViNzlmNDRiMjc3YWJmMTVlNGUzN2QzMTcuZ3oKKworMjAwNy0wMy0yMSAxNDo1Mjo0NCArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4Lmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXhlci5jOgorCSAgcnRwbXV4OiBBZGQgUlRQRFRNRk11eCBlbGVtZW50CisJICAyMDA3MDMyMTE0NTI0NC02NTAzNS05YTAxMzkwYjBkZWUzMzk4ZTUzMTk5YTFmYTFkOTM1MjAwNGYzMzhlLmd6CisKKzIwMDctMDMtMjEgMTI6MzE6NDkgKzAwMDAgIHplZXNoYW4uYWxpQG5va2lhLmNvbSA8emVlc2hhbi5hbGlAbm9raWEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5oOgorCSAgcnRwbXV4OiBSZW1vdmUgRFRNRi1zcGVjaWZpYyBjb2RlIGZyb20gUlRQIG11eGVyIGFuZCBtYWtlIGl0IGV4dGVuZGFibGUKKwkgIDIwMDcwMzIxMTIzMTQ5LTY1MDM1LWI4YThmNTVmZjc4ZWVkOGNiYjAwNDJlODI3ODg1ZWRmYzU0MzgyNDIuZ3oKKworMjAwNy0wMy0yMCAxMjowNToyNCArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBQdXQgbW9yZSBoZWxwZnVsIGRlc2NyaXB0aW9uCisJICAyMDA3MDMyMDEyMDUyNC02NTAzNS1kYjI3YTdjZjYzMDdiNTExYWViM2Q5OTZkMjZlNzkwZTM2N2E3YmFkLmd6CisKKzIwMDctMDMtMTYgMTU6MTY6NDEgKzAwMDAgIHplZXNoYW4uYWxpQG5va2lhLmNvbSA8emVlc2hhbi5hbGlAbm9raWEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogcmVtb3ZlIHRoZSAoY29tbWVudGVkLW91dCkgY29kZSBmb3IgYmxvY2tpbmcgdGhlIHBhZHMKKwkgIDIwMDcwMzE2MTUxNjQxLTY1MDM1LTAxMjNhZjM4Nzk1MWY4ODU5NDc5N2M3MjJlODgyY2ZlNzAyNDBhZmYuZ3oKKworMjAwNy0wMy0xNiAxMzoxNDo0NCArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBEcm9wIGJ1ZmZlcnMgaW5zdGVhZCBvZiBibG9ja2luZyB0aGUgc2lua3BhZHMKKwkgIDIwMDcwMzE2MTMxNDQ0LTY1MDM1LTljMTM0NWFkOTYxMDg4ODFmNDU1ZDRiNTVhN2Y2MjNjZDMwMmQwZWQuZ3oKKworMjAwNy0wMy0xNCAxNzoxNjoxOCArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBJbXBsZW1lbnQgc3RyZWFtIGxvY2tpbmcsIG5lZWRlZCBmb3IgRFRNRgorCSAgMjAwNzAzMTQxNzE2MTgtNjUwMzUtZTRkMjRiMTYwNmNlMGEzZTJlNzM5ZjAxODMzZjYxZTRkNzU1NWVhYy5negorCisyMDA3LTAzLTE0IDEwOjIwOjU4ICswMDAwICB6ZWVzaGFuLmFsaUBub2tpYS5jb20gPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmM6CisJICBydHBtdXg6IHVzZSBHU1RfKl9PQkpFQ1QgaW5zdGVhZCBvZiBnXyoKKwkgIDIwMDcwMzE0MTAyMDU4LTY1MDM1LWUyNDQyODg4ZjJlM2U1YTNhNzY1OWFkNzk1NGE0ZmJhMzQ3NDljZTIuZ3oKKworMjAwNy0wMy0xNCAxMDoxODo1NCArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBObyBuZWVkIHRvIG1hbmFnZSBwYWRzLCBwYXJlbnQgZG9lcyB0aGF0IGZvciB1cworCSAgMjAwNzAzMTQxMDE4NTQtNjUwMzUtZWY1ZjRhYmRlMjI3MTAyYTExMjg4MzVhYjMyNTkwNWVhZTRjMzcyNi5negorCisyMDA3LTAzLTE0IDA5OjAzOjU4ICswMDAwICB6ZWVuaXhAZ21haWwuY29tIDx6ZWVuaXhAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYzoKKwkgIHJ0cG11eDogRml4IGNvcHlyaWdodCBoZWFkZXIKKwkgIDIwMDcwMzE0MDkwMzU4LWQwMTRhLTNhNmQzZWVlYWFmNWNiOGNhM2JjYTZhMzNlOTlhNTUxZjU5OGJkNDguZ3oKKworMjAwNy0wMy0wNyAwODo1MzowNyArMDAwMCAgemVlc2hhbi5hbGlAbm9raWEuY29tIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jOgorCSAgcnRwbXV4OiBUaGUgZmlyc3QgaW1wbGVtZW50YXRpb24gb2YgUlRQIG11eGVyCisJICAyMDA3MDMwNzA4NTMwNy02NTAzNS04MzM0MDI0MTNmOTljYjNmOGJlNDg4M2U5MmJhZDRjODcyMjUxMGM5Lmd6CisKKzIwMTItMTItMTUgMjE6Mjc6MDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uaDoKKwkgIHNjYWxldGVtcG86IG5vIG5lZWQgZm9yIGEgcHJpdmF0ZSBzdHJ1Y3QKKworMjAxMi0xMi0xNCAxNToxMzozMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJICBkb2NzOiB1cGRhdGUgcGx1Z2luIGRvY3MKKworMjAxMi0xMi0xNCAxNToxMzoxOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSAgZG9jczogYWRkIHNjYWxldGVtcG8gdG8gZG9jcworCisyMDEyLTExLTA2IDEzOjM2OjM5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4LmM6CisJICBhdWRpb2Z4OiBtb3ZlIHNjYWxldGVtcG8gZWxlbWVudCBmcm9tIC1iYWQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODcyNjIKKworMjAxMi0xMC0yMyAxNDozMzoyMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzoKKwkgIHNjYWxldGVtcG86IEZpeCBldmVudCBsZWFrCisKKzIwMTItMTAtMjMgMTQ6MzI6MjQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvLmM6CisJICBzY2FsZXRlbXBvOiBGaXggdGltZXN0YW1wIHRyYWNraW5nCisKKzIwMTItMTAtMjMgMTQ6MDY6MzcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvLmM6CisJICBzY2FsZXRlbXBvOiBJbXBsZW1lbnQgTEFURU5DWSBxdWVyeQorCisyMDEyLTEwLTIzIDEzOjM5OjE3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5oOgorCSAgc2NhbGV0ZW1wbzogU3RvcmUgaW5zdGFuY2UgcHJpdmF0ZSBkYXRhIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3QKKwkgIEdldHRpbmcgaXQgb3ZlciBhbmQgb3ZlciBhZ2FpbiB2aWEgR19UWVBFX0lOU1RBTkNFX0dFVF9QUklWQVRFKCkKKwkgIGlzIHJlYWxseSBzbG93LgorCisyMDEyLTEwLTE3IDE3OjM0OjI2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSAgc2NhbGV0ZW1wbzogdXNlIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEoKQorCSAgd2hlcmUgcG9zc2libGUuIEF2b2lkcyBzb21lIHN0cmluZyBjb3BpZXMuIEFsc28gcmUtaW5kZW50CisJICBzb21lIHN0dWZmLiBBbHNvIHNvbWUgaW5kZW50IGZpeGVzIGhlcmUgYW5kIHRoZXJlLgorCisyMDEyLTA5LTE0IDE3OjA4OjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSAgc2NhbGV0ZW1wbzogcmVwbGFjZSBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUgd2l0aCBnc3RfZWxlbWVudF9jbGFzc19zZXRfbWV0YWRhdGEKKworMjAxMi0wOS0xNCAxNjo0NTozNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSAgc2NhbGV0ZW1wbzogZmZtcGVnY29sb3JzcGFjZSBpcyBubyBtb3JlCisKKzIwMTItMDQtMDUgMTg6MDI6NTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvcGx1Z2luLmM6CisJICBzY2FsZXRlbXBvOiBVcGRhdGUgZm9yIEdTVF9QTFVHSU5fREVGSU5FKCkgQVBJIGNoYW5nZXMKKworMjAxMi0wMy0xOCAxODozMjo1NSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzoKKwkgIHNjYWxldGVtcG86IHBvcnQgdG8gMC4xMQorCisyMDExLTA3LTA3IDEwOjUyOjUwIC0wNzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzoKKwkgIHNjYWxldGVtcG86IGltcHJvdmUgdGhlIGRvY3MKKwkgIEZpeCB0aGUgc3ludGF4LCBhZGQgbW9yZSBleHBsYW5hdGlvbiBhbmQgeHJlZiB0aGUgcHJvcGVydGllcy4KKworMjAxMS0wMy0yMiAxMzo0Njo0MiArMDEwMCAgQ2hyaXMgRSBKb25lcyA8Y2hyaXNAY2hyaXNlam9uZXMuY29tPgorCisJKiBnc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvLmM6CisJICBzY2FsZXRlbXBvOiBDb3JyZWN0bHkgaGFuZGxlIG5ld3NlZ21lbnQgZXZlbnRzIHdpdGggc3RvcD09LTEKKwkgIEZpeGVzIGJ1ZyAjNjQ1NDIwLgorCisyMDEwLTEwLTE5IDEzOjQzOjE0ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzoKKwkgIHNjYWxldGVtcG86IGFkZCBtaXNzaW5nIEdfUEFSQU1fU1RBVElDX1NUUklOR1MgZmxhZ3MKKwkgIENhbm9uaWNhbGl6ZSBwcm9wZXJ0eSBuYW1lcyBhcyBuZWVkZWQuCisKKzIwMTAtMDMtMTggMTc6MzA6MjYgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSAgc2NhbGV0ZW1wbzogZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X2RldGFpbHMgPT4gZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X2RldGFpbHNfc2ltcGxlCisKKzIwMDktMTEtMDUgMTM6NDA6MzggLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvLmM6CisJICBzY2FsZXRlbXBvOiBwcm9wZXJseSB1cGRhdGUgbmV3IHNlZ21lbnRzCisJICBTY2FsZXRlbXBvIHdhcyBtaXNzaW5nIGFuIHVwZGF0ZSBvZiAnc3RvcCcgaW4KKwkgIG5ldyBzZWdtZW50IHBhcmFtZXRlcnMgd2hlbiBwdXNoaW5nIGl0IGRvd25zdHJlYW0sCisJICB3aGljaCBjYXVzZWQgZmlsZXMgdG8gZW5kIGVhcmxpZXIgd2hlbiByYXRlIDwgMS4KKwkgIEZpeGVzICM1OTk5MDMKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5OiBCYXN0aWFuIEhlY2h0IDxoZWNodGJAZ21haWwuY29tPgorCisyMDA5LTA2LTE0IDIwOjAwOjUxICswMjAwICBNYXhpbWlsaWFuIEjDtmduZXIgPHBibWF4aUBob2VnbmVycy5kZT4KKworCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSAgc2NhbGV0ZW1wbzogRXhwbGljaXRlbHkgY2FzdCB0byBzaWduZWQgaW50ZWdlcnMgdG8gZml4IGEgc2VnZmF1bHQKKwkgIEZpeGVzIGJ1ZyAjNTg1NjYwLgorCisyMDA5LTAyLTEzIDEyOjE4OjQ4IC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jOgorCSAgc2NhbGV0ZW1wbzogRG8gbm90IHVzZSB2b2lkIHBvaW50ZXIgYXJpdGhtZXRpYy4KKworMjAwOC0xMC0zMCAxMjoxMzoxOCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBzY2FsZXRlbXBvOiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBwYXJlbnRfY2xhc3MtPmV2ZW50KCkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvLmM6CisJICBSZXR1cm4gdGhlIHJlc3VsdCBvZiBwYXJlbnRfY2xhc3MtPmV2ZW50KCkuCisKKzIwMDgtMDgtMzEgMTI6MjA6MzMgKzAwMDAgIFJvdiBKdXZhbm8gPHJvdmp1dmFub0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIEFkZCBzY2FsZXRlbXBvIHBsdWdpbiwgd2hpY2ggYWxsb3dzIHRvIHNjYWxlIHRoZSBzcGVlZCBvZiBhdWRpbyB3aXRob3V0IGNoYW5naW5nIHRoZSBwaXRjaCBieSBoYW5kbGluZyBzZWVrcyB3aXRoIGEgci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUm92IEp1dmFubyA8cm92anV2YW5vIGF0IHVzZXJzIGRvdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNjYWxldGVtcG8ueG1sOgorCSAgKiBleGFtcGxlcy9zY2FsZXRlbXBvL01ha2VmaWxlLmFtOgorCSAgKiBleGFtcGxlcy9zY2FsZXRlbXBvL2RlbW8tZ3VpLmM6IChwb3Bfc3RhdHVzX2JhciksCisJICAoc3RhdHVzX2Jhcl9wcmludGYpLCAoZGVtb19ndWlfc2Vla19iYXJfZm9ybWF0KSwgKHVwZGF0ZV9wb3NpdGlvbiksCisJICAoZGVtb19ndWlfc2Vla19iYXJfY2hhbmdlKSwgKGRlbW9fZ3VpX2RvX2NoYW5nZV9yYXRlKSwKKwkgIChkZW1vX2d1aV9kb19zZXRfcmF0ZSksIChkZW1vX2d1aV9kb19yYXRlX2VudGVyZWQpLAorCSAgKGRlbW9fZ3VpX2RvX3RvZ2dsZV9hZHZhbmNlZCksIChkZW1vX2d1aV9kb190b2dnbGVfZGlzYWJsZWQpLAorCSAgKGRlbW9fZ3VpX2RvX3NlZWspLCAoZGVtb19ndWlfZG9fcGxheSksIChkZW1vX2d1aV9kb19wYXVzZSksCisJICAoZGVtb19ndWlfZG9fcGxheV9wYXVzZSksIChkZW1vX2d1aV9kb19vcGVuX2ZpbGUpLAorCSAgKGRlbW9fZ3VpX2RvX3BsYXlsaXN0X3ByZXYpLCAoZGVtb19ndWlfZG9fcGxheWxpc3RfbmV4dCksCisJICAoZGVtb19ndWlfZG9fYWJvdXRfZGlhbG9nKSwgKGRlbW9fZ3VpX2RvX3F1aXQpLAorCSAgKGRlbW9fZ3VpX3JlcXVlc3Rfc2V0X3N0cmlkZSksIChkZW1vX2d1aV9yZXF1ZXN0X3NldF9vdmVybGFwKSwKKwkgIChkZW1vX2d1aV9yZXF1ZXN0X3NldF9zZWFyY2gpLCAoZGVtb19ndWlfcmF0ZV9jaGFuZ2VkKSwKKwkgIChkZW1vX2d1aV9wbGF5aW5nX3N0YXJ0ZWQpLCAoZGVtb19ndWlfcGxheWluZ19wYXVzZWQpLAorCSAgKGRlbW9fZ3VpX3BsYXlpbmdfZW5kZWQpLCAoZGVtb19ndWlfcGxheWVyX2Vycm9yZWQpLAorCSAgKGRlbW9fZ3VpX3N0cmlkZV9jaGFuZ2VkKSwgKGRlbW9fZ3VpX292ZXJsYXBfY2hhbmdlZCksCisJICAoZGVtb19ndWlfc2VhcmNoX2NoYW5nZWQpLCAoZGVtb19ndWlfc2V0X3BsYXllcl9mdW5jKSwKKwkgIChkZW1vX2d1aV9zZXRfcGxheWxpc3RfZnVuYyksIChidWlsZF9ndmFsdWVfYXJyYXkpLAorCSAgKGNyZWF0ZV9hY3Rpb24pLCAoZGVtb19ndWlfc2hvd19mdW5jKSwgKGRlbW9fZ3VpX3NldF9wbGF5ZXIpLAorCSAgKGRlbW9fZ3VpX3NldF9wbGF5bGlzdCksIChkZW1vX2d1aV9zaG93KSwgKGRlbW9fZ3VpX2dldF9wcm9wZXJ0eSksCisJICAoZGVtb19ndWlfc2V0X3Byb3BlcnR5KSwgKGRlbW9fZ3VpX2luaXQpLCAoZGVtb19ndWlfY2xhc3NfaW5pdCksCisJICAoZGVtb19ndWlfZ2V0X3R5cGUpOgorCSAgKiBleGFtcGxlcy9zY2FsZXRlbXBvL2RlbW8tZ3VpLmg6CisJICAqIGV4YW1wbGVzL3NjYWxldGVtcG8vZGVtby1tYWluLmM6IChoYW5kbGVfZXJyb3JfbWVzc2FnZSksCisJICAoaGFuZGxlX3F1aXQpLCAobWFpbik6CisJICAqIGV4YW1wbGVzL3NjYWxldGVtcG8vZGVtby1wbGF5ZXIuYzogKG5vX3BpcGVsaW5lKSwKKwkgIChkZW1vX3BsYXllcl9ldmVudF9saXN0ZW5lciksIChkZW1vX3BsYXllcl9zdGF0ZV9jaGFuZ2VkX2NiKSwKKwkgIChkZW1vX3BsYXllcl9lb3NfY2IpLCAoZGVtb19wbGF5ZXJfYnVpbGRfcGlwZWxpbmUpLCAoX3NldF9yYXRlKSwKKwkgIChkZW1vX3BsYXllcl9zY2FsZV9yYXRlX2Z1bmMpLCAoZGVtb19wbGF5ZXJfc2V0X3JhdGVfZnVuYyksCisJICAoX3NldF9zdGF0ZV9hbmRfd2FpdCksIChkZW1vX3BsYXllcl9sb2FkX3VyaV9mdW5jKSwKKwkgIChkZW1vX3BsYXllcl9wbGF5X2Z1bmMpLCAoZGVtb19wbGF5ZXJfcGF1c2VfZnVuYyksIChfc2Vla190byksCisJICAoZGVtb19wbGF5ZXJfc2Vla19ieV9mdW5jKSwgKGRlbW9fcGxheWVyX3NlZWtfdG9fZnVuYyksCisJICAoZGVtb19wbGF5ZXJfZ2V0X3Bvc2l0aW9uX2Z1bmMpLCAoZGVtb19wbGF5ZXJfZ2V0X2R1cmF0aW9uX2Z1bmMpLAorCSAgKGRlbW9fcGxheWVyX3NjYWxlX3JhdGUpLCAoZGVtb19wbGF5ZXJfc2V0X3JhdGUpLAorCSAgKGRlbW9fcGxheWVyX2xvYWRfdXJpKSwgKGRlbW9fcGxheWVyX3BsYXkpLCAoZGVtb19wbGF5ZXJfcGF1c2UpLAorCSAgKGRlbW9fcGxheWVyX3NlZWtfYnkpLCAoZGVtb19wbGF5ZXJfc2Vla190byksCisJICAoZGVtb19wbGF5ZXJfZ2V0X3Bvc2l0aW9uKSwgKGRlbW9fcGxheWVyX2dldF9kdXJhdGlvbiksCisJICAoZGVtb19wbGF5ZXJfZ2V0X3Byb3BlcnR5KSwgKGRlbW9fcGxheWVyX3NldF9wcm9wZXJ0eSksCisJICAoZGVtb19wbGF5ZXJfaW5pdCksIChkZW1vX3BsYXllcl9jbGFzc19pbml0KSwKKwkgIChkZW1vX3BsYXllcl9nZXRfdHlwZSk6CisJICAqIGV4YW1wbGVzL3NjYWxldGVtcG8vZGVtby1wbGF5ZXIuaDoKKwkgICogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYzogKGJlc3Rfb3ZlcmxhcF9vZmZzZXRfZmxvYXQpLAorCSAgKGJlc3Rfb3ZlcmxhcF9vZmZzZXRfczE2KSwgKG91dHB1dF9vdmVybGFwX2Zsb2F0KSwKKwkgIChvdXRwdXRfb3ZlcmxhcF9zMTYpLCAoZmlsbF9xdWV1ZSksIChyZWluaXRfYnVmZmVycyksCisJICAoZ3N0X3NjYWxldGVtcG9fdHJhbnNmb3JtKSwgKGdzdF9zY2FsZXRlbXBvX3RyYW5zZm9ybV9zaXplKSwKKwkgIChnc3Rfc2NhbGV0ZW1wb19zaW5rX2V2ZW50KSwgKGdzdF9zY2FsZXRlbXBvX3NldF9jYXBzKSwKKwkgIChnc3Rfc2NhbGV0ZW1wb19nZXRfcHJvcGVydHkpLCAoZ3N0X3NjYWxldGVtcG9fc2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfc2NhbGV0ZW1wb19iYXNlX2luaXQpLCAoZ3N0X3NjYWxldGVtcG9fY2xhc3NfaW5pdCksCisJICAoZ3N0X3NjYWxldGVtcG9faW5pdCk6CisJICAqIGdzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uaDoKKwkgICogZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wb3BsdWdpbi5jOiAocGx1Z2luX2luaXQpOgorCSAgQWRkIHNjYWxldGVtcG8gcGx1Z2luLCB3aGljaCBhbGxvd3MgdG8gc2NhbGUgdGhlIHNwZWVkIG9mIGF1ZGlvIHdpdGhvdXQKKwkgIGNoYW5naW5nIHRoZSBwaXRjaCBieSBoYW5kbGluZyBzZWVrcyB3aXRoIGEgcmF0ZSE9MS4wLgorCSAgSW50ZWdyYXRlIGl0IGludG8gdGhlIGRvY3MgYW5kIGFkZCB0aGUgZXhhbXBsZSBhcHBsaWNhdGlvbiBmb3IgaXQuCisJICBGaXhlcyBidWcgIzUzNzcwMC4KKworMjAxMi0xMi0xMyAxMjozNjoyMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJICBjaGVjazogYWRkIChidXQgZGlzYWJsZSkgbW9yZSBydHAgaml0dGVyYnVmZmVyIHRlc3RzCisJICBUZXN0cyBuZWVkIHRvIGJlIHBvcnRlZCB0byAxLjAgYmVmb3JlIHRoZXkgY2FuIGJlIGVuYWJsZWQgYnV0IGFkZGVkIGhlcmUgc28gdGhleQorCSAgZG9uJ3QgZ2V0IGZvcmdvdHRlbi4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY3ODM4CisKKzIwMTItMDEtMTMgMDE6MTE6MzEgKzAxMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQHRhbmRiZXJnLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGJ1bmRsZSB0b2dldGhlciBsYXRlIGxvc3QtZXZlbnRzCisJICBUaGUgc2NlbmFyaW8gd2hlcmUgeW91IGhhdmUgYSBnYXAgaW4gYSBzdGVhZHkgZmxvdyBvZiBwYWNrZXRzIG9mCisJICBzYXkgMTAgc2Vjb25kcyAoNTAwIHBhY2tldHMgb2Ygd2l0aCBkdXJhdGlvbiBvZiAyMG1zKSwgdGhlIGppdHRlcmJ1ZmZlcgorCSAgd2lsbCBpZGxlIHVwIHVudGlsIGl0IHJlY2VpdmVzIHRoZSBmaXJzdCBidWZmZXIgYWZ0ZXIgdGhlIGdhcCwgYnV0IHdpbGwKKwkgIHRoZW4gZ28gb24gdG8gcHJvZHVjZSA0OTkgbG9zdC1ldmVudHMsIHRvICJjb3ZlciB1cCIgdGhlIGdhcC4KKwkgIE5vdyB0aGlzIGlzIG9idmlvdXNseSB3cm9uZywgc2luY2UgdGhlIGxhc3QgcG9zc2libGUgdGltZSBmb3IgdGhlIGVhcmxpZXN0CisJICBsb3N0LWV2ZW50cyB0byBiZSBwbGF5ZWQgb3V0IGhhcyBvYnZpb3VzbHkgZXhwaXJlZCwgYnV0IHRoZSBmYWN0IHRoYXQKKwkgIHRoZSBqaXR0ZXJidWZmZXIgaGFzIGEgImxlbmd0aCIsIHJlcHJlc2VudGVkIHdpdGggaXRzIG93biBsYXRlbmN5IGNvbWJpbmVkCisJICB3aXRoIHRoZSB0b3RhbCBsYXRlbmN5IGRvd25zdHJlYW0sIGFsbG93cyBmb3IgY292ZXJpbmcgdXAgYXQgbGVhc3Qgc29tZQorCSAgb2YgdGhpcyBnYXAuCisJICBTbyBpbiB0aGUgY2FzZSBvZiB0aGUgImxlbmd0aCIgYmVpbmcgMjAwbXMsIHdoaWxlIGhhdmluZyByZWNlaXZlZCBwYWNrZXQKKwkgIDUwMCwgdGhlIGppdHRlcmJ1ZmZlciBzaG91bGQgc3RpbGwgY3JlYXRlIGEgdGltZW91dCBmb3IgcGFja2V0IDQ5MSwgd2hpY2gKKwkgIHdpbGwgaGF2ZSBpdHMgdGltZSBleHBpcmUgYXQgMTAsMDIgc2Vjb25kcywgc3BlY2lhbGx5IHNpbmNlIGl0IG1pZ2h0CisJICBhY3R1YWxseSBhcnJpdmUgaW4gdGltZSEgQnV0IG9idmlvdXNseSwgd2FpdGluZyBmb3IgcGFja2V0IDEwMCwgdGhhdCBoYWQKKwkgIGl0cyB0aW1lIGV4cGlyZSBhdCAyIHNlY29uZHMsIChyZW1lbWJlcmluZyB0aGF0IHRoZSBjdXJyZW50IHRpbWUgaXMgMTApCisJICBpcyB1c2VsZXNzLi4uCisJICBUaGUgcGF0Y2ggd2lsbCBjcmVhdGUgb25lICJiaWciIGxvc3QtZXZlbnQgZm9yIHRoZSBmaXJzdCA0OTAgcGFja2V0cywKKwkgIGFuZCB0aGVuIGdvIG9uIHRvIGNyZWF0ZSBzaW5nbGUgb25lcyBpZiB0aGV5IGNhbiByZWFjaCB0aGVpcgorCSAgcGxheW91dCBkZWFkbGluZS4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY3ODM4CisKKzIwMTItMTItMTMgMDk6Mjc6MTQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGZpeCBUQ1AgcmVjb25uZWN0CisJICBJZ25vcmUgb3RoZXIgY29tbWFuZHMgd2hlbiByZWNvbm5lY3RpbmcsIG90aGVyd2lzZSB0aGUgbG9vcCBmdW5jdGlvbiB3b3VsZCBwYXVzZQorCSAgYW5kIHRoZSByZWNvbm5lY3Rpb24gd291bGQgbm90IGhhcHBlbi4gQ29udGludWUgbG9vcGluZyBhZnRlciBkb2luZyBhIHJlY29ubmVjdAorCSAgc28gdGhhdCB3ZSBoYXZlIGEgY2hhbmNlIHRvIGFjdHVhbGx5IHJlYWQgdGhlIG5ldyBkYXRhLgorCisyMDEyLTEyLTEzIDAxOjAyOjM0ICswNDAwICDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyIDxscm4xOTg2QGdtYWlsLmNvbT4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oOgorCSogc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5oOgorCSAgZGlyZWN0c291bmQsIHdhdmVmb3JtOiBmaXggY29tcGlsYXRpb24gZXJyb3JzIGNhdXNlZCBieSBjaXJjdWxhciBpbmNsdWRlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MDEyNAorCisyMDEyLTEyLTEyIDE3OjM1OjA0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSogZXh0L2phY2svZ3N0amFjay5oOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvamFjay9nc3RqYWNrdXRpbC5oOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXByb2JlLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJKiBzeXMvb3NzL2NvbW1vbi5oOgorCSogc3lzL29zcy9nc3Rvc3NhdWRpby5jOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkqIHN5cy9vc3M0L29zczQtYXVkaW8uaDoKKwkgIGV4dC9zeXM6IEZpeCBzb21lIGNvbXBpbGF0aW9uIGVycm9ycyBjYXVzZWQgYnkgY2lyY3VsYXIgaW5jbHVkZXMKKworMjAxMi0xMi0xMiAxMjowNzozNCArMDEwMCAgUGhpbGlwcGUgTm9ybWFuZCA8cGhpbG5AaWdhbGlhLmNvbT4KKworCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJICBkZWludGVybGVhdmU6IHByb3Blcmx5IHNldCBzcmNwYWQgY2hhbm5lbCBwb3NpdGlvbgorCSAgVGhlIHNyYyBwYWQgY2FwcyBhbHdheXMgZGVzY3JpYmUgYSBzaW5nbGUgYXVkaW8gY2hhbm5lbCBzbyBvbmx5IHRoZQorCSAgZmlyc3QgcG9zaXRpb24gbWF0dGVycyBpZiBkZWludGVybGVhdmUgaXMgY29uZmlndXJlZCB0byBrZWVwIGNoYW5uZWwKKwkgIHBvc2l0aW9ucyBpbiBpdHMgc3JjIHBhZHMuCisKKzIwMTItMTItMTIgMTE6MDk6NDIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHRpbWVvdXQgb24gdWRwc3JjIGlzIGluIG5hbm9zZWNvbmRzCisKKzIwMTItMTItMTIgMTE6MDg6MTMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IGltcHJvdmUgdGltZW91dHMKKwkgIE1ha2UgaXQgcG9zc2libGUgdG8gc2V0IHRoZSB0aW1lb3V0IGFmdGVyIHdlIHdlbnQgdG8gdGhlIFJFQURZIHN0YXRlIGJ5IHVzaW5nCisJICB0aGUgdGltZW91dCB3aGVuIGNoZWNraW5nIHRoZSBjb25kaXRpb24uIFRoaXMgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzZXQgdGhlCisJICB0aW1lb3V0IHdpdGggYSBoaWdoZXIgZ3JhbnVsYXJpdHkgdGhhbiBzZWNvbmRzLgorCisyMDEyLTEyLTExIDEzOjAwOjQ2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaDoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5LmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhcmJsZW5kLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3NjYWxlcmJvYi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwuaW5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS92ZmlyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlYmZmLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZldGZmLmM6CisJICBkZWludGVybGFjZTogYWRkIHN1cHBvcnQgZm9yIHN0cmlkZXMKKwkgIEltcGxlbWVudCBzdHJpZGUgc3VwcG9ydCBjb3JyZWN0bHkgYnkgdGFraW5nIGl0IGZyb20gdGhlIEdzdFZpZGVvRnJhbWUuCisJICBQcm9wb3NlIGEgYnVmZmVycG9vbCB1cHN0cmVhbSB3aGVuIG5vdCBvcGVyYXRpbmcgaW4gcGFzc3Rocm91Z2guCisKKzIwMTItMDktMjcgMTI6MTc6NTggLTA3MDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdWUgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkgIHJ0c3BzcmM6IGRvIG5vdCBjaGFuZ2Ugc3RhdGUgdG8gUExBWUlORyBpZiBjdXJyZW50bHkgY2hhbmluZyBzdGF0ZQorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmMgKGdzdF9ydHNwc3JjX3BsYXkpOiBzdGF0ZSBjaGFuZ2UgbWlnaHQgYmUKKwkgIGhhcHBlbmluZyBpbiB0aGUgYXBwbGljYXRpb24gdGhyZWFkLCBzbyB3ZSBkb24ndCBjaGFuZ2UgdGhlIHN0YXRlIHRvCisJICBQTEFZSU5HIGluIHRoZSBnc3RydHNwc3JjIHRocmVhZCB1bmxlc3MgaXQgaXMgc2FmZS4KKwkgIEEgc3BlY2lmaWMgY2FzZSBpcyB3aGVuIGNoYW5pbmcgdGhlIHN0YXRlIHRvIE5VTEwgZnJvbSB0aGUgYXBwbGljYXRpb24KKwkgIHRocmVhZC4gVGhpcyB3aWxsIHN5bmNocm9ub3VzbHkgdHJ5IHRvIHN0b3AgdGhlIHRhc2sgKHdpdGggdGhlIGVsZW1lbnQKKwkgIHN0YXRlIGxvY2sgYWNxdWlyZWQpLCBidXQgd2Ugd2lsbCB0cnkgYSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgZnJvbQorCSAgZ3N0cnRzcHNyYyB0aHJlYWQgd2hpY2ggd2lsbCBibG9jayBvbiB0aGUgZWxlbWVudCBzdGF0ZSBsb2NrIGNhdXNpbmcgYQorCSAgZGVhZGxvY2suCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0MzEyCisKKzIwMTItMTItMTAgMTE6NDQ6MjYgKzAwMDAgIEFsZXhleSBDaGVybm92IDw0ZXJub3ZAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IEZpeCByZXNpemluZyB0aGUgQ29jb2Egd2luZG93IG9uIHJlY2VpdmluZyBuZXcgY2FwcworCSAgRml4ZXMgYnVnICM2ODk3MzIuCisKKzIwMTItMTEtMzAgMjA6Mzc6NDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkgIHY0bDJzcmM6IGxpbmsgYWdhaW5zdCAtbHJ0IGZvciBjbG9ja19nZXR0aW1lKCkKKwkgIE5lZWQgdG8gZXhwbGljaXRseSBsaW5rIGFnYWluc3QgLWxydCBmb3IgY2xvY2tfZ2V0dGltZSgpLCB3aGljaAorCSAgd2UgZG9uJ3QgZ2V0IGluIHRoZSBsaWJzIGFueSBtb3JlLCBiZWNhdXNlIGNvcmUgbW92ZWQgdGhlCisJICBnbW9kdWxlLW5vLWV4cG9ydC0yLjAgYml0IGludG8gUmVxdWlyZXMuUHJpdmF0ZS4KKwkgIE5vdCByZXF1aXJlZCBmb3IgbmV3ZXIgZ2xpYmMsIGJ1dCBmb3Igb2xkZXIgb25lcywgc28gY2hlY2sgZm9yIHRoYXQuCisKKzIwMTItMTEtMzAgMTc6MjI6NTkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSAgc2hvdXQyc2VuZDogYWNjZXB0IGF1ZGlvL3dlYm0gYXMgd2VsbCBhcyB2aWRlby93ZWJtCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg5MzM2CisKKzIwMTItMTEtMzAgMTc6MjA6MTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOgorCSAgd2VibXV4OiBmaXggbGlua2luZyB3aXRoIHNob3V0MnNlbmQgZWxlbWVudAorCSAgU2hvdXQyc2VuZCBvbmx5IGFjY2VwdHMgd2VibSBmb3JtYXQsIG5vdCBtYXRyb3NrYSwgYnV0IGR1ZQorCSAgdG8gYSBidWcgaW4gbWF0cm9za2FtdXgsIHdlYm1tdXgncyBzb3VyY2UgcGFkIGlzIGFsc28gY3JlYXRlZAorCSAgd2l0aCB0aGUgbWF0cm9za2Egc291cmNlIHBhZCB0ZW1wbGF0ZSBhcyBwYWQgdGVtcGxhdGUsIHdoaWNoCisJICBtYWtlcyB0aGUgbGluayBmdW5jdGlvbiB0aGluayBpdCBjYW4ndCBsaW5rIHdlYm1tdXggdG8gc2hvdXQyc2VuZC4KKwkgIEFsc28gYWRkIHVuaXQgdGVzdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODkzMzYKKworMjAxMi0xMS0yNyAxMToxMzozNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogdXNlIG5ldyBvcHRpb24gcGFyc2VyIGZ1bmN0aW9uCisKKzIwMTItMTEtMjYgMTU6MTc6MTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9sYXcvbXVsYXctY29udmVyc2lvbi5jOgorCSAgbGF3OiBmaXggYWNjaWRlbnRhbCBmaWxlIHBlcm1pc3Npb25zIGNoYW5nZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NzQ2OQorCisyMDEyLTExLTI1IDE2OjA1OjExICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiByZW1vdmUgdW51c2VkIGRlZmluZQorCisyMDEyLTExLTI1IDE0OjE2OjA5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGF2b2lkIGNyaXRpY2FscyBpZiB1bmtub3duIGZvdXJjYyBoYXMgc3BhY2UgYXQgYmVnaW5uaW5nIG9yIGVuZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MjkzNgorCisyMDEyLTExLTI0IDE5OjMyOjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBmaXggYm9yZGVyIGZpbGxpbmcgZm9yIHBsYW5hciBZVVYgZm9ybWF0cworCSAgV2Ugd291bGQgZ2V0IGEgZ3JlZW4gYm9yZGVyIGluc3RlYWQgb2YgYSBibGFjayBvbmUsIGZvcgorCSAgZXhhbXBsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODQ5OTEKKworMjAxMi0xMS0yNCAxNDoyNzozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2xhdy9tdWxhdy1jb252ZXJzaW9uLmM6CisJICBtdWxhdzogY29uc3QtaWZ5IHNvbWUgYXJyYXlzCisKKzIwMTItMTEtMDIgMTI6Mzg6NDQgLTA0MDAgIFJvbGFuZCBLcmlrYXZhIDxya3Jpa2F2YUBnbWFpbC5jb20+CisKKwkqIGdzdC9sYXcvbXVsYXctY29udmVyc2lvbi5jOgorCSAgbXVsYXdkZWM6IGZpeCBpbnRlZ2VyIG92ZXJydW4KKwkgIFRoZXJlIG1pZ2h0IGJlIG1vcmUgdGhhbiA2NTUzNSBzYW1wbGVzIGluIGEgY2h1bmsgb2YgZGF0YS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc0NjkKKworMjAxMi0xMS0yMiAxMTozNDozMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcGF1c2UgdGhlIHRhc2sgaW5zdGVhZCBvZiBzcGlubmluZworCSAgQWN0dWFsbHkgcGF1c2UgdGhlIGxvb3AgdGFzayBpbnN0ZWFkIG9mIHNwaW5uaW5nIGZvcmV2ZXIuCisKKzIwMTItMTEtMTkgMDM6MzE6MzcgLTA1MDAgIEpvc2h1YSBNLiBEb2UgPG9zc0BudmwuYXJteS5taWw+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIHZpZGVvZmxpcDogQWRkIGdyYXkgOC8xNiBzdXBwb3J0CisKKzIwMTItMTEtMTkgMTE6MjU6MTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBiNDk3YzRmIHRvIGE3MmZhZWEKKworMjAxMi0xMS0xNiAxNTozODoyOSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogaGFuZGxlIHNlZ21lbnQgZXZlbnQKKwkgIE1ha2UgYSBzZWdtZW50IGV2ZW50IHdoZW4gd2Ugc2VuZCBhIG5ldyByYW5nZSBoZWFkZXIgdG8gYSBjbGllbnQgKGZpcnN0IFBMQVkKKwkgIHJlcXVlc3Qgb3IgYWZ0ZXIgYSBzZWVrKS4gU2VuZCB0aGUgc2VnbWVudCBldmVudCBpbiBpbnRlcmxlYXZlZCBtb2RlLgorCSAgQ2xlYW4gdGhlIHNlZ21lbnQgZXZlbnQgb24gY2xlYW51cAorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4ODM4MgorCisyMDEyLTExLTE2IDE1OjE4OjA3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggY2hlY2sgZm9yIGFjdGl2ZSBzdHJlYW1zCisJICBBIHN0cmVhbSBjYW4gYmUgYWN0aXZlIHdpdGhvdXQgYSBzcmNwYWQgeWV0IGFuZCB3ZSB3YW50IHRvIHNlbmQKKwkgIGV2ZW50cyBvbiB0aG9zZSBzdHJlYW1zIGFzIHdlbGwuCisKKzIwMTItMTEtMTYgMTM6MzE6MDQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGNyZWF0ZSBhbmQgYWRkIHBhZHMgb3V0c2lkZSBvZiBsb2NrCisJICBDcmVhdGUgYW5kIGFkZCB0aGUgZ2hvc3RwYWQgZm9yIHRoZSBuZXcgc3RyZWFtIG91dHNpZGUgb2YgdGhlIGxvY2sgYmVjYXVzZSBpdAorCSAgaXMgbm90IG5lZWRlZCBhbmQgY2F1c2VzIGRlYWRsb2Nrcy4KKworMjAxMi0wOS0xMiAyMjoxMToyMCAtMDcwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1ZSA8YWxlaXhAb2Jsb25nLmNvbT4KKworCSAgcnRzcHNyYzogYWxsb3cgY2xpZW50IHRvIGRpc2FibGUgcmVjb25uZWN0aW9uCisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuW2NoXTogYWRkZWQgbmV3ICJ1ZHAtcmVjb25uZWN0IiBwcm9wZXJ0eS4gQmVmb3JlLAorCSAgcnRzcHNyYyBhbHdheXMgdHJpZWQgdG8gcmVjb25uZWN0IHRvIHRoZSBzZXJ2ZXIgd2hlbiB0aGUgUlRTUAorCSAgY29ubmVjdGlvbiB3YXMgY2xvc2VkIGJ5IHRoZSBzZXJ2ZXIuIFRoaXMgcHJvcGVydHkgbGV0cyB0aGUgdXNlcgorCSAgZGVjaWRlIHdoZXRoZXIgaXQgd2FudHMgcnRzcHNyYyB0byByZWNvbm5lY3Qgb3Igbm90LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MzkxMgorCisyMDEyLTExLTE2IDEyOjE2OjA1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBjbGVhciB2YXJpYWJsZXMgYmVmb3JlIHJldHJ5aW5nCisJICBFbHNlIHdlIG1pZ2h0IHVucmVmIGFuIG9sZCB1ZHBzcmMgdHdpY2UgaW4gY2xlYW51cC4KKworMjAxMi0xMS0xNiAxMjowMDoxNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcHJvcG9zZSBwb3J0cyBpbiBtdWx0aWNhc3QKKwkgIFdoZW4gdGhlIHVzZXIgY29uZmlndXJlZCBhIHBvcnQtcmFuZ2UsIHByb3Bvc2UgcG9ydHMgZnJvbSB0aGlzIHJhbmdlCisJICBhcyB0aGUgbXVsdGljYXN0IHBvcnRzLiBUaGUgc2VydmVyIGlzIGZyZWUgdG8gaWdub3JlIHRoaXMgcmVxdWVzdCBidXQgaWYgaXQKKwkgIGhvbm91cnMgaXQsIGluY3JlbWVudCBvdXIgcG9ydHMgc28gdGhhdCB3ZSBzdWdnZXN0IHRoZSBuZXh0IHBvcnQgcGFpciBmb3IgdGhlCisJICBuZXh0IHN0cmVhbS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Mzk0MjAKKworMjAxMi0xMS0xNiAxMTo1ODo1MyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYWRkIG1vcmUgZGVidWcKKworMjAxMi0xMS0xNiAwOTowOTozOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICBtdWx0aWZpbGVzaW5rOiBwb3N0IG1lc3NhZ2VzIGluIG1heC1zaXplIG1vZGUgYXMgd2VsbAorCSAgTm8gcmVhc29uIG5vdCB0byByZWFsbHkuCisKKzIwMTItMTEtMTUgMTQ6Mzc6NDQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IHBvc3QgZXJyb3IgYmVmb3JlIHN0b3BwaW5nCisKKzIwMTItMTEtMTQgMDA6MTM6MzYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJICBnc3RfYWRhcHRlcl9wcmV2X3RpbWVzdGFtcCAtPiBnc3RfYWRhcHRlcl9wcmV2X3B0cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NTU5OAorCisyMDEyLTExLTEyIDE5OjIzOjQxICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIHZpZGVvZmxpcDogQWRkIE5WMTIvTlYyMSBzdXBwb3J0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg4MjI1CisKKzIwMTItMTEtMTIgMTM6MDE6MjMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSAgdnA4ZW5jOiBEb24ndCBsZWFrIEdzdFZpZGVvQ29kZWNGcmFtZXMgdGhhdCBjYXVzZSB0aGUgY3JlYXRpb24gb2YgaW52aXNpYmxlIGZyYW1lcworCSAgRml4ZXMgYnVnICM2ODI3MTQuCisKKzIwMTItMTEtMTIgMTE6NDc6MTcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZTogVXNlIG5ldyBHVHlwZSBmb3IgR1RocmVhZCBpbnN0ZWFkIG9mIGp1c3QgR19UWVBFX1BPSU5URVIKKworMjAxMi0xMS0xMiAxMToxNDozNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IHByb3RlY3QgYWdhaW5zdCBpbnZhbGlkIFJUUCBwYWNrZXRzCisKKzIwMTItMTEtMTIgMTA6NDQ6MDEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgcG5nZGVjOiBBY3R1YWxseSB1c2UgdGhlIHN0b3AoKSB2ZnVuYyBpbXBsZW1lbnRhdGlvbgorCisyMDEyLTExLTEyIDEwOjMxOjU5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkgIHZwOGRlYzogRml4IGxhc3QgY29tbWl0CisKKzIwMTItMTEtMTIgMTA6MTA6MTUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgcG5nZGVjOiBLZWVwIHRoZSBpbnB1dCBzdGF0ZSBpbiByZXNldCgpCisJICBJdCdzIHN0aWxsIHZhbGlkIGFmdGVyIGEgZmx1c2ggYW5kIHdlIG1pZ2h0IG5vdCBnZXQgYSBuZXcgb25lLgorCisyMDEyLTExLTEyIDEwOjA4OjU3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkgIHZwOGRlYzogQWxzbyBkZXN0cm95IGRlY29kZXIgaW4gc2V0X2Zvcm1hdCgpIGlmIGl0IHdhcyBjcmVhdGVkIGFscmVhZHkKKwkgIEZpeGVzIGEgbWVtb3J5IGxlYWsuCisKKzIwMTItMTEtMTIgMDk6NDg6NDUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSAgdnA4ZGVjOiBEb24ndCBjbGVhciBpbnB1dCBzdGF0ZSBpbiByZXNldCgpCisJICBUaGUgaW5wdXQgc3RhdGUgaXMgc3RpbGwgdmFsaWQgYWZ0ZXIgZmx1c2hpbmcgdW50aWwKKwkgIG5ldyBjYXBzIGFycml2ZS4KKwkgIEZpeGVzIGJ1ZyAjNjg4MDkyLgorCisyMDEyLTExLTEwIDE4OjIxOjI4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSAgdmlkZW9jcm9wOiBhZGQgc3VwcG9ydCBmb3IgWVYxMgorCSAgV2UgY2FuIGRvIEk0MjAsIHNvIHdlIGNhbiBkbyBZVjEyIGFzIHdlbGwuCisKKzIwMTItMTEtMTAgMTI6Mzk6MDggKzAxMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIG11bHRpZmlsZXNpbms6IGRvbid0IHdyaXRlIHN0cmVhbSBoZWFkZXJzIHdpdGgga2V5LXVuaXQtZXZlbnQKKwkgIERvbid0IHdyaXRlIHN0cmVhbSBoZWFkZXJzLCBsZXQgdXBzdHJlYW0gZWxlbWVudHMgaW5zZXJ0IHRoZW0gaW4gdGhlIHN0cmVhbSBpZgorCSAgYWxsX2hlYWRlcnM9dHJ1ZSBpcyBzZXQgaW4ga2V5IHVuaXQgZXZlbnRzLgorCisyMDEyLTExLTA5IDEzOjI3OjE2ICswMTAwICBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5oOgorCSAgdmlkZW9jcm9wOiBBZGQgTlYxMi9OVjIxIHN1cHBvcnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc5NjQKKworMjAxMi0xMS0wOSAxNjozMTowNSArMDEwMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBleHQvdnB4L2dzdHZwOGRlYy5jOgorCSAgdnA4ZGVjOiBEb24ndCBnaXZlIHVwIHNvIGVhc2lseSBpZiBmYWlsZWQgdG8gZGVjb2RlIGEgZnJhbWUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc0MzYKKworMjAxMi0xMS0wOSAxMToyMjozMCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IEFsc28gY2xlYXIgR0Vycm9yCisKKzIwMTItMTEtMDkgMTE6MjA6MjcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBEb24ndCBlcnJvciBvdXQgaWYgd2UgZ2V0IGFuIElDTVAgZGVzdGluYXRpb24tdW5yZWFjaGFibGUgbWVzc2FnZSB3aGVuIHRyeWluZyB0byByZWFkIHBhY2tldHMKKwkgIFNlZSBidWcgIzUyOTQ1NCBhbmQgIzY4Nzc4MiBhbmQgY29tbWl0CisJICA3NTFmMmJiMzY0NmYyYmVmZjM2OThjOWYwOTkwMGRiZDBlYTA4YWJiCisKKzIwMTItMTEtMDcgMjA6MzU6NTAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZS5hYzogdXBkYXRlIGNvdXJ0ZXN5IG9mIGF1dG91cGRhdGUKKworMjAxMi0xMS0wNyAxODo0ODo0OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogbGV0IEFHX0dTVF9QTFVHSU5fRE9DUyBjaGVjayBmb3IgcHl0aG9uCisJICBBbmQgdXBkYXRlIGNvbW1vbiBmb3IgbW92ZSBmcm9tIEFTX1BBVEhfUFlUSE9OIHRvIEFNX1BBVEhfUFlUSE9OLAorCSAgd2hpY2ggYXMgYSBzaWRlLWVmZmVjdCBzaG91bGQgcGljayB1cCBuZXdlciBweXRob24gdmVyc2lvbnMgYXMKKwkgIHdlbGwuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTYzOTAzCisKKzIwMTItMTEtMDcgMTM6MzY6MzMgKzAxMDAgIENocmlzdGlhbiBGcmVkcmlrIEthbGFnZXIgU2NoYWxsZXIgPHVyYWV1c0BsaW51eHJpc2luLm9yZz4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgIEZpeCB2cDhydHAgaGVhZGVyIG5hbWVzIGluIE1ha2VmaWxlCisKKzIwMTItMTEtMDYgMTU6MDM6NTUgKzAxMDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2Nyb3AuYzoKKwkgIHZpZGVvY3JvcDogQWRkIHN1cHBvcnQgZm9yIGF1dG9tYXRpYyBjcm9wcGluZworCSAgVGhpcyBjaGFuZ2UgZW5hYmxlIGF1dG9tYXRpYyBjcm9wcGluZyB1c2luZyAtMSBzZXQgdG8gbGVmdCwgdG9wLCByaWdodCBvcgorCSAgYm90dG9tIHByb3BlcnR5LiBJbiB0aGUgY2FzZSBib3RoIHNpZGUgYXJlIHNldCB0byBhdXRvbWF0aWMgY3JvcHBpbmcsIHRoZQorCSAgY3JvcGluZyB3aWxsIGJlIGRvbmUgZXF1YWxseSBvbiBib3RoIHNpZGUgKGluIHRoZSBvZGQgY2FzZSwgcmlnaHQgYW5kCisJICBib3R0b20gY3JvcHBpbmcgd2lsbCBiZSAxIHBpeGVsIG1vcmUpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc2MQorCisyMDEyLTExLTAyIDE2OjM5OjI4ICswMTAwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSAgc3BlZXhkZWM6IERvbid0IHVubWFwIG9yIGZpbmlzaF9mcmFtZSBhbiBpbnZhbGlkIEdzdEJ1ZmZlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NzQ2NAorCisyMDEyLTExLTA2IDEzOjIyOjU4ICswMTAwICBNYXJjIExlZW1hbiA8bWFyYy5sZWVtYW5AZ21haWwuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwOiB0aGUgUlRDUCBwb3J0IG51bWJlciBpcyBpbmNsdXNpdmUKKwkgIFRoZSBjb25maWd1cmVkIHBvcnQgbnVtYmVyIHBhaXIgaGFzIGl0cyB1cHBlciBib3VuZCBzZXQgdG8gdGhlIG1heGltdW0KKwkgIGFsbG93ZWQgUlRDUCBwb3J0LCBpbmNsdXNpdmUuCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzOTQyMAorCisyMDEyLTExLTAzIDIwOjM4OjAwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvZHRtZi9nc3RkdG1mZGV0ZWN0LmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mZGV0ZWN0Lmg6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmg6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5oOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5oOgorCSAgRml4IEZTRiBhZGRyZXNzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg3NTIwCisKKzIwMTItMTEtMDQgMDA6MDc6MTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuaDoKKwkqIGV4dC9jYWlyby9nc3RjYWlyby5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5oOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmM6CisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm9yZW5kZXIuaDoKKwkqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOgorCSogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6CisJKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuaDoKKwkqIGV4dC9kdi9nc3Rkdi5jOgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZHYvZ3N0ZHZkZWMuaDoKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJKiBleHQvZHYvZ3N0ZHZkZW11eC5oOgorCSogZXh0L2R2L2dzdHNtcHRldGltZWNvZGUuYzoKKwkqIGV4dC9kdi9nc3RzbXB0ZXRpbWVjb2RlLmg6CisJKiBleHQvZmxhYy9nc3RmbGFjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmg6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmg6CisJKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjdGFnLmg6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGthbmltYXRpb24uYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka2FuaW1hdGlvbi5oOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmZGVjLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZkZWMuaDoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zm92ZXJsYXkuaDoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZnBsdWdpbi5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5oOgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmg6CisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJKiBleHQvamFjay9nc3RqYWNrLmg6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9jbGllbnQuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5oOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5oOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuaDoKKwkqIGV4dC9qYWNrL2dzdGphY2tyaW5nYnVmZmVyLmg6CisJKiBleHQvamFjay9nc3RqYWNrdXRpbC5jOgorCSogZXh0L2phY2svZ3N0amFja3V0aWwuaDoKKwkqIGV4dC9qcGVnL2dzdGpwZWcuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWcuaDoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuaDoKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZGVjLmM6CisJKiBleHQvanBlZy9nc3RzbW9rZWRlYy5oOgorCSogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzoKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmg6CisJKiBleHQvanBlZy9zbW9rZWNvZGVjLmM6CisJKiBleHQvanBlZy9zbW9rZWNvZGVjLmg6CisJKiBleHQvanBlZy9zbW9rZWZvcm1hdC5oOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzoKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmg6CisJKiBleHQvbGlicG5nL2dzdHBuZy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmcuaDoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5oOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmg6CisJKiBleHQvbWlrbW9kL1JFQURNRToKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6CisJKiBleHQvbWlrbW9kL2dzdG1pa21vZC5oOgorCSogZXh0L21pa21vZC9taWttb2RfdHlwZXMuYzoKKwkqIGV4dC9taWttb2QvbWlrbW9kX3R5cGVzLmg6CisJKiBleHQvcHVsc2UvcGx1Z2luLmM6CisJKiBleHQvcHVsc2UvcHVsc2Vwcm9iZS5jOgorCSogZXh0L3B1bHNlL3B1bHNlcHJvYmUuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmg6CisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmM6CisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmg6CisJKiBleHQvcmF3MTM5NC9nc3QxMzk0LmM6CisJKiBleHQvcmF3MTM5NC9nc3QxMzk0Y2xvY2suYzoKKwkqIGV4dC9yYXcxMzk0L2dzdDEzOTRjbG9jay5oOgorCSogZXh0L3JhdzEzOTQvZ3N0MTM5NHByb2JlLmM6CisJKiBleHQvcmF3MTM5NC9nc3QxMzk0cHJvYmUuaDoKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmg6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmg6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuaDoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5oOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4LmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5oOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuaDoKKwkqIGV4dC90YWdsaWIvZ3N0YXBldjJtdXguY2M6CisJKiBleHQvdGFnbGliL2dzdGFwZXYybXV4Lmg6CisJKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5oOgorCSogZXh0L3RhZ2xpYi9nc3R0YWdsaWJwbHVnaW4uYzoKKwkqIGV4dC92cHgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnB4L2dzdHZwOGRlYy5oOgorCSogZXh0L3ZweC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmg6CisJKiBleHQvdnB4L2dzdHZwOHV0aWxzLmM6CisJKiBleHQvdnB4L2dzdHZwOHV0aWxzLmg6CisJKiBleHQvdnB4L3BsdWdpbi5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFjay5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5oOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5oOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5oOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3N0cmVhbXJlYWRlci5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3N0cmVhbXJlYWRlci5oOgorCSogZ3N0LWxpYnMvZ3N0L2dldHRleHQuaDoKKwkqIGdzdC1saWJzL2dzdC9nbGliLWNvbXBhdC1wcml2YXRlLmg6CisJKiBnc3QtbGlicy9nc3QvZ3N0LWkxOG4tcGx1Z2luLmg6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5oOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmg6CisJKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6CisJKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4Lmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0Lmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uaDoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2ZpcmZpbHRlci5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWlpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuaDoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0Lmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb2thcmFva2UuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5oOgorCSogZ3N0L2F1ZGlvZngvbWF0aF9jb21wYXQuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5oOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5oOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5oOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuaDoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuaDoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuaDoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc3JjLmg6CisJKiBnc3QvYXZpL2F2aS1pZHMuaDoKKwkqIGdzdC9hdmkvZ3N0YXZpLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguaDoKKwkqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5oOgorCSogZ3N0L2RlYnVndXRpbHMvYnJlYWtteWRhdGEuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2NwdXJlcG9ydC5jOgorCSogZ3N0L2RlYnVndXRpbHMvY3B1cmVwb3J0Lmg6CisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzZGVidWcuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNkZWJ1Zy5oOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0ZGVidWcuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdG5hdmlnYXRpb250ZXN0LmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZpZ2F0aW9udGVzdC5oOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2c2Vlay5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2c2Vlay5oOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0cHVzaGZpbGVzcmMuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHB1c2hmaWxlc3JjLmg6CisJKiBnc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHRhZ2luamVjdC5oOgorCSogZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Byb2dyZXNzcmVwb3J0Lmg6CisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJKiBnc3QvZGVidWd1dGlscy90ZXN0cGx1Z2luLmM6CisJKiBnc3QvZGVidWd1dGlscy90ZXN0cy5jOgorCSogZ3N0L2RlYnVndXRpbHMvdGVzdHMuaDoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHkuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5hc206CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aG1hY3Jvcy5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvcGx1Z2lucy5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9zY2FsZXJib2IuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwuaW5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS92ZmlyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlYmZmLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZldGZmLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3g4Ni02NF9tYWNyb3MuaW5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmg6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmg6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmg6CisJKiBnc3QvZWZmZWN0di9nc3RlZmZlY3R2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZmZlY3R2Lmg6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0b3AuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RyZXYuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdHJpcHBsZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmg6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmg6CisJKiBnc3QvZWZmZWN0di9nc3RzdHJlYWsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHN0cmVhay5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5oOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmg6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5oOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIzYmFuZHMuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmg6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuaDoKKwkqIGdzdC9mbHYvYW1mZGVmcy5oOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5oOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4Lmg6CisJKiBnc3QvZmx2L2dzdGluZGV4LmM6CisJKiBnc3QvZmx2L2dzdGluZGV4Lmg6CisJKiBnc3QvZmx2L2dzdG1lbWluZGV4LmM6CisJKiBnc3QvZmx4L2ZseF9jb2xvci5jOgorCSogZ3N0L2ZseC9mbHhfY29sb3IuaDoKKwkqIGdzdC9mbHgvZmx4X2ZtdC5oOgorCSogZ3N0L2ZseC9nc3RmbHhkZWMuYzoKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmg6CisJKiBnc3QvZ29vbS9jb25maWdfcGFyYW0uYzoKKwkqIGdzdC9nb29tL2NvbnZvbHZlX2Z4LmM6CisJKiBnc3QvZ29vbS9kcmF3bWV0aG9kcy5jOgorCSogZ3N0L2dvb20vZHJhd21ldGhvZHMuaDoKKwkqIGdzdC9nb29tL2ZpbHRlcnMuYzoKKwkqIGdzdC9nb29tL2ZpbHRlcnNfbW14LnM6CisJKiBnc3QvZ29vbS9mbHlpbmdfc3RhcnNfZnguYzoKKwkqIGdzdC9nb29tL2dvb20uaDoKKwkqIGdzdC9nb29tL2dvb21fY29uZmlnLmg6CisJKiBnc3QvZ29vbS9nb29tX2NvbmZpZ19wYXJhbS5oOgorCSogZ3N0L2dvb20vZ29vbV9jb3JlLmM6CisJKiBnc3QvZ29vbS9nb29tX2ZpbHRlcnMuaDoKKwkqIGdzdC9nb29tL2dvb21fZnguaDoKKwkqIGdzdC9nb29tL2dvb21fZ3JhcGhpYy5oOgorCSogZ3N0L2dvb20vZ29vbV9wbHVnaW5faW5mby5oOgorCSogZ3N0L2dvb20vZ29vbV90b29scy5jOgorCSogZ3N0L2dvb20vZ29vbV90b29scy5oOgorCSogZ3N0L2dvb20vZ29vbV90eXBlZGVmcy5oOgorCSogZ3N0L2dvb20vZ29vbV92aXN1YWxfZnguaDoKKwkqIGdzdC9nb29tL2dyYXBoaWMuYzoKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkqIGdzdC9nb29tL2dzdGdvb20uaDoKKwkqIGdzdC9nb29tL2xpbmVzLmM6CisJKiBnc3QvZ29vbS9saW5lcy5oOgorCSogZ3N0L2dvb20vbWF0aHRvb2xzLmM6CisJKiBnc3QvZ29vbS9tYXRodG9vbHMuaDoKKwkqIGdzdC9nb29tL21vdGlmX2dvb20xLmg6CisJKiBnc3QvZ29vbS9tb3RpZl9nb29tMi5oOgorCSogZ3N0L2dvb20vcGx1Z2luX2luZm8uYzoKKwkqIGdzdC9nb29tL3BwY19kcmF3aW5ncy5oOgorCSogZ3N0L2dvb20vcHBjX2RyYXdpbmdzLnM6CisJKiBnc3QvZ29vbS9wcGNfem9vbV91bHRpbWF0ZS5oOgorCSogZ3N0L2dvb20vcHBjX3pvb21fdWx0aW1hdGUuczoKKwkqIGdzdC9nb29tL3NvdW5kX3Rlc3Rlci5jOgorCSogZ3N0L2dvb20vc291bmRfdGVzdGVyLmg6CisJKiBnc3QvZ29vbS9zdXJmM2QuYzoKKwkqIGdzdC9nb29tL3N1cmYzZC5oOgorCSogZ3N0L2dvb20vdGVudGFjbGUzZC5jOgorCSogZ3N0L2dvb20vdGVudGFjbGUzZC5oOgorCSogZ3N0L2dvb20vdjNkLmM6CisJKiBnc3QvZ29vbS92M2QuaDoKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uYzoKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uaDoKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4Lmg6CisJKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzoKKwkqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5oOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuaDoKKwkqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOgorCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmg6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmg6CisJKiBnc3QvaW50ZXJsZWF2ZS9wbHVnaW4uYzoKKwkqIGdzdC9pbnRlcmxlYXZlL3BsdWdpbi5oOgorCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSogZ3N0L2lzb21wNC9hdG9tcy5oOgorCSogZ3N0L2lzb21wNC9hdG9tc3JlY292ZXJ5LmM6CisJKiBnc3QvaXNvbXA0L2F0b21zcmVjb3ZlcnkuaDoKKwkqIGdzdC9pc29tcDQvZGVzY3JpcHRvcnMuYzoKKwkqIGdzdC9pc29tcDQvZGVzY3JpcHRvcnMuaDoKKwkqIGdzdC9pc29tcDQvZm91cmNjLmg6CisJKiBnc3QvaXNvbXA0L2Z0eXBjYy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG1vb3ZyZWNvdmVyLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bW9vdnJlY292ZXIuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXgtZG9jLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LWRvYy5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5oOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5oOgorCSogZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5jOgorCSogZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5oOgorCSogZ3N0L2lzb21wNC9pc29tcDQtcGx1Z2luLmM6CisJKiBnc3QvaXNvbXA0L3Byb3BlcnRpZXMuYzoKKwkqIGdzdC9pc29tcDQvcHJvcGVydGllcy5oOgorCSogZ3N0L2lzb21wNC9xdGF0b21wYXJzZXIuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X2R1bXAuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9mb3VyY2MuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9sYW5nLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfbGFuZy5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuaDoKKwkqIGdzdC9pc29tcDQvcXRwYWxldHRlLmg6CisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmg6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmg6CisJKiBnc3QvbGF3L2FsYXcuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5oOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmg6CisJKiBnc3QvbGF3L211bGF3LmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5oOgorCSogZ3N0L21hdHJvc2thL2VibWwtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmg6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS5jOgorCSogZ3N0L21hdHJvc2thL3dlYm0tbXV4LmM6CisJKiBnc3QvbWF0cm9za2Evd2VibS1tdXguaDoKKwkqIGdzdC9tb25vc2NvcGUvY29udm9sdmUuYzoKKwkqIGdzdC9tb25vc2NvcGUvY29udm9sdmUuaDoKKwkqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5oOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGUuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmg6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuaDoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5oOgorCSogZ3N0L211bHRpZmlsZS9wYXR0ZXJuc3BlYy5jOgorCSogZ3N0L211bHRpZmlsZS9wYXR0ZXJuc3BlYy5oOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnQuYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguaDoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5oOgorCSogZ3N0L3J0cC9mbnYxaGFzaC5jOgorCSogZ3N0L3J0cC9mbnYxaGFzaC5oOgorCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkqIGdzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmg6CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhYzNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBidmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2hhbm5lbHMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2hhbm5lbHMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIycGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFjZWxwZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcWRtZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWRtZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwc2lyZW5kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbWFuYWdlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmg6CisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0cGRlYy5oOgorCSogZ3N0L3J0c3AvZ3N0cnRzcC5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcC5oOgorCSogZ3N0L3J0c3AvZ3N0cnRzcGV4dC5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcGV4dC5oOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmg6CisJKiBnc3Qvc21wdGUvYmFyYm94d2lwZXMuYzoKKwkqIGdzdC9zbXB0ZS9nc3RtYXNrLmM6CisJKiBnc3Qvc21wdGUvZ3N0bWFzay5oOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuaDoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5oOgorCSogZ3N0L3NtcHRlL3BhaW50LmM6CisJKiBnc3Qvc21wdGUvcGFpbnQuaDoKKwkqIGdzdC9zbXB0ZS9wbHVnaW4uYzoKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5oOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJKiBnc3QvdWRwL2dzdHVkcC5jOgorCSogZ3N0L3VkcC9nc3R1ZHAuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmg6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94Lmg6CisJKiBnc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuaDoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5oOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuaDoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuaDoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaDoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb21lZGlhbi5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvbWVkaWFuLmg6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW90ZW1wbGF0ZS5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL3BsdWdpbi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIycGFkLmg6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuaDoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuaDoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHBsdWdpbi5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oOgorCSogc3lzL29zcy9jb21tb24uaDoKKwkqIHN5cy9vc3MvZ3N0b3NzYXVkaW8uYzoKKwkqIHN5cy9vc3MvZ3N0b3NzZG1hYnVmZmVyLmM6CisJKiBzeXMvb3NzL2dzdG9zc2RtYWJ1ZmZlci5oOgorCSogc3lzL29zcy9nc3Rvc3NoZWxwZXIuYzoKKwkqIHN5cy9vc3MvZ3N0b3NzaGVscGVyLmg6CisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5oOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmg6CisJKiBzeXMvb3NzNC9vc3M0LWF1ZGlvLmM6CisJKiBzeXMvb3NzNC9vc3M0LWF1ZGlvLmg6CisJKiBzeXMvb3NzNC9vc3M0LXByb3BlcnR5LXByb2JlLmM6CisJKiBzeXMvb3NzNC9vc3M0LXByb3BlcnR5LXByb2JlLmg6CisJKiBzeXMvb3NzNC9vc3M0LXNpbmsuYzoKKwkqIHN5cy9vc3M0L29zczQtc2luay5oOgorCSogc3lzL29zczQvb3NzNC1zb3VyY2UuYzoKKwkqIHN5cy9vc3M0L29zczQtc291cmNlLmg6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW8uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmg6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvLmg6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4cmluZ2J1ZmZlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeHJpbmdidWZmZXIuaDoKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW8uYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlci5oOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuaDoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyb3B0aW9ucy5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJvcHRpb25zLmg6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcnRyYWNrLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcnRyYWNrLmg6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmg6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMi5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwycmFkaW8uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJyYWRpby5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvb3ZlcmxheS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvb3ZlcmxheS5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5oOgorCSogc3lzL3Y0bDIvdHVuZXIuYzoKKwkqIHN5cy92NGwyL3R1bmVyLmg6CisJKiBzeXMvdjRsMi90dW5lcmNoYW5uZWwuYzoKKwkqIHN5cy92NGwyL3R1bmVyY2hhbm5lbC5oOgorCSogc3lzL3Y0bDIvdHVuZXJub3JtLmM6CisJKiBzeXMvdjRsMi90dW5lcm5vcm0uaDoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuaDoKKwkqIHN5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXBsdWdpbi5jOgorCSogc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5jOgorCSogc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5oOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmg6CisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzoKKwkqIHN5cy94aW1hZ2UveGltYWdldXRpbC5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYWFjcGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FjM3BhcnNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hbHBoYWNvbG9yLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hbXJwYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXBldjJtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FzcGVjdHJhdGlvY3JvcC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9hbXBsaWZ5LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2R5bmFtaWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZWNoby5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9pbnZlcnQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvcGFub3JhbWEuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1dG9kZXRlY3QuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpc3VidGl0bGUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NhcHNzZXR0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGVhdmUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsYWNwYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2ZGVtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2Zsdm11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZ2RrcGl4YnVmc2luay5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM2RlbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW1hZ2VmcmVlemUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ludGVybGVhdmUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdlbmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FwYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcGFyc2VyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9wYXJzZXIuaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW5fYnVmZmVyX2xpc3QuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc2hhcGV3aXBlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc3BlY3RydW0uYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3N1bmF1ZGlvLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzaW5rLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzcmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9maWx0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZwOGRlYy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdnA4ZW5jLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZGVjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZW5jLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrcGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3k0bWVuYy5jOgorCSogdGVzdHMvY2hlY2svZ2VuZXJpYy9zdGF0ZXMuYzoKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy9lZmZlY3R2LmM6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMuYzoKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy90YWdzY2hlY2tpbmcuYzoKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZlbmMuYzoKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZwYWNrLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L2ZpcmZpbHRlci1leGFtcGxlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L2lpcmZpbHRlci1leGFtcGxlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9jYWlyby9jYWlyb19vdmVybGF5LmM6CisJKiB0ZXN0cy9leGFtcGxlcy9sZXZlbC9sZXZlbC1leGFtcGxlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9wdWxzZS9wdWxzZS5jOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWFsc2FzcmMtUENNQS5jOgorCSogdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL3NoYXBld2lwZS1leGFtcGxlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1vc3NzcmMuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL3NwZWN0cnVtLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jOgorCSogdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYzoKKwkqIHRlc3RzL2ljbGVzL2dka3BpeGJ1ZnNpbmstdGVzdC5jOgorCSogdGVzdHMvaWNsZXMvdGVzdC1vc3M0LmM6CisJKiB0ZXN0cy9pY2xlcy92NGwyc3JjLXRlc3QuYzoKKwkqIHRlc3RzL2ljbGVzL3ZpZGVvYm94LXRlc3QuYzoKKwkqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6CisJKiB0ZXN0cy9pY2xlcy92aWRlb2Nyb3AyLXRlc3QuYzoKKwkqIHRlc3RzL2ljbGVzL3hpbWFnZXNyYy10ZXN0LmM6CisJICBGaXggRlNGIGFkZHJlc3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc1MjAKKworMjAxMi0xMS0wMiAxODo0NzoyNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIHZyYXdkZXBheTogZG9uJ3QgYWNjZXNzIHJ0cCBidWZmZXIgYWZ0ZXIgdW5tYXAKKwkgIFJlYWQgdGhlIG1hcmtlciBiaXQgYmVmb3JlIHdlIHVubWFwIHRoZSBydHAgcGFja2V0LgorCisyMDEyLTExLTAyIDA5OjM0OjI1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkgIHZwOGRlYzogSW1tZWRpYXRlbHkgcmV0dXJuIGlmIG9wZW5pbmcgdGhlIGRlY29kZXIgZmFpbGVkCisJICBJbnN0ZWFkIG9mIGlnbm9yaW5nIGFueSBlcnJvcnMuCisKKzIwMTItMTEtMDEgMjI6MDI6MzkgKzAxMDAgIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKworCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkgIHZwOGRlYzogU2hvcnQgY2lyY3VpdCBnc3RfdnA4X2RlY19oYW5kbGVfZnJhbWUgaWYga2V5ZnJhbWUgaXMgbWlzc2luZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NzM3NgorCisyMDEyLTExLTAyIDEwOjUzOjU3ICsxMzAwICBEb3VnbGFzIEJhZ25hbGwgPGRvdWdsYXNAcGFyYWRpc2UubmV0Lm56PgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSAgdmlkZW9jb252ZXJ0OiBDb21wYXJlIHkgb2Zmc2V0IHdpdGggaGVpZ2h0LCBub3Qgd2lkdGgsIHdoZW4gdGVzdGluZyBmb3Igb3ZlcmxhcAorCSAgVGhpcyBjb3VsZCBoYXZlIHByZXZlbnRlZCBpbWFnZXMgc2hvd2luZyB0aGF0IHNob3VsZCBoYXZlIHdoZW4gdGhlCisJICBzb3VyY2UgaGVpZ2h0IGlzIGdyZWF0ZXIgdGhhbiBpdHMgd2lkdGguCisJICBXaGVuIHdpZHRoIGV4Y2VlZHMgaGVpZ2h0LCBhcyBpcyBjb21tb24sIGl0IHByb2JhYmx5IG9ubHkgY2F1c2VkIGEKKwkgIG1pbmlzY3VsZSBhbW91bnQgb2YgdW5uZWNlc3Nhcnkgd29yay4gIEkgaGF2ZW4ndCB0ZXN0ZWQuCisKKzIwMTItMTEtMDEgMjE6MDk6NTYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5oOgorCSAgcnRwdnA4OiBpbmNsdWRlIGNvbmZpZy5oIGFuZCBtaW5vciBzdHlsZSBmaXhlcworCisyMDEyLTExLTAxIDIwOjEzOjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgcnRwOiBmaXggdGFicy9zcGFjZSBtZXNzIGluIE1ha2VmaWxlLmFtCisKKzIwMTItMTEtMDEgMjA6MDU6NDkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHB2cDguYzoKKwkgIHJ0cDogbW92ZSBWUDggcGF5bG9hZGVyIGFuZCBkZXBheWxvYWRlciBmcm9tIC1iYWQKKwkgIFNwZWMgaXMgc3RpbGwgaW4gZHJhZnQgc3RhdGUsIGJ1dCBzaG91bGQgaG9wZWZ1bGx5IG5vdAorCSAgY2hhbmdlIG11Y2ggbm93LiBCZXNpZGVzLCB3ZSBhbm5vdW5jZSB0aGluZ3MgYXMgVlA4LURSQUZULUlFVEYtMDEKKwkgIGluIG91ciBjYXBzLCBzbyBldmVuIGlmIHRoaW5ncyBjaGFuZ2UgaW4gaW5jb21wYXRpYmxlIHdheXMgaXQKKwkgIHNob3VsZCBub3QgYnJlYWsgYW55dGhpbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg3MjYzCisKKzIwMTItMTAtMTcgMTc6MzQ6MjYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5jOgorCSAgcnRwdnA4OiB1c2UgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSgpCisJICB3aGVyZSBwb3NzaWJsZS4gQXZvaWRzIHNvbWUgc3RyaW5nIGNvcGllcy4gQWxzbyByZS1pbmRlbnQKKwkgIHNvbWUgc3R1ZmYuIEFsc28gc29tZSBpbmRlbnQgZml4ZXMgaGVyZSBhbmQgdGhlcmUuCisKKzIwMTItMDktMTQgMTc6MDg6NDkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5jOgorCSAgcnRwdnA4OiByZXBsYWNlIGdzdF9lbGVtZW50X2NsYXNzX3NldF9kZXRhaWxzX3NpbXBsZSB3aXRoIGdzdF9lbGVtZW50X2NsYXNzX3NldF9tZXRhZGF0YQorCisyMDEyLTA0LTA1IDE4OjAyOjU2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cDguYzoKKwkgIHJ0cHZwODogdXBkYXRlIGZvciBHU1RfUExVR0lOX0RFRklORSgpIEFQSSBjaGFuZ2VzCisKKzIwMTItMDMtMjggMTI6NDk6NTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5LmM6CisJICBydHB2cDg6IHVwZGF0ZSBmb3IgYnVmZmVyIGNoYW5nZXMKKworMjAxMi0wMy0wMSAxNDo1OTo1NSAtMDMwMCAgRGFuaWxvIENlc2FyIExlbWVzIGRlIFBhdWxhIDxkYW5pbG8uY2VzYXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5jOgorCSAgcnRwdnA4OyBmaXggY29tcGF0aWJpbGl0eSB3aXRoIHRoZSB0aGlyZCBkcmFmdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3MTA3MworCisyMDEyLTAxLTI1IDE2OjIwOjQxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkgIHJ0cHZwODogcG9ydCBzb21lIG1vcmUgdG8gbmV3IG1lbW9yeSBBUEkKKworMjAxMi0wMS0yNSAxMDo0NTo1MSArMDEwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5Lmg6CisJICBydHB2cDg6IHBvcnQgdG8gMC4xMQorCisyMDExLTEwLTAzIDEyOjA2OjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkgIHJ0cHZwOHBheTogRml4IHR5cG8KKworMjAxMS0wOS0yMyAyMjo1ODozMCArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5Lmg6CisJICBydHB2cDg6IFVwZGF0ZSB0aGUgcGF5L2RlcGF5IHRvIHRoZSBpZXRmLWRyYWZ0LTAxIHNwZWMKKworMjAxMS0wOS0xMCAxMTozMToyMCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZGJvb2xodWZmLmM6CisJKiBnc3QvcnRwL2Rib29saHVmZi5oOgorCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkgIHJ0cHZwODogZml4IGJpdHN0cmVhbSBwYXJzaW5nIHVzaW5nIHRoZSB3cm9uZyBraW5kIG9mIGJpdHJlYWRlcgorCSAgVlA4IHVzZXMgYSBwcm9iYWJpbGlzdGljIGJvb2wgY29kZXIsIG5vdCBhIHN0cmFpZ2h0IGJpdCBjb2Rlci4KKwkgIFRoaXMgZml4ZXMgcGFyc2luZyB3aGVuIGVycm9yLXJlc2lsaWVudCBpcyBzZXQuCisJICBUaGlzIGNvbW1pdCBpbmNsdWRlcyBhIGNvcHkgb2YgbGlidnB4J3MgYm9vbCBjb2RlciwgQlNEIGxpY2Vuc2VkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MjY5NAorCisyMDExLTA3LTEyIDE4OjAzOjUzIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5jOgorCSAgcnRwdnA4OiBSZWplY3QgdW5rbm93biBiaXRzdHJlYW0gdmVyc2lvbnMKKworMjAxMS0wMy0wNCAxMTo1OTo0NCArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5LmM6CisJICBydHB2cDg6IEZpeCB1bml0aWFsaXplZCB2YXJpYWJsZQorCSAgTWFrZXMgbWFjb3N4IGNvbXBpbGVyIGhhcHB5LgorCisyMDExLTAxLTIzIDE3OjAyOjM4ICswMDAwICBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4ZGVwYXkuYzoKKwkgIHJ0cHZwOGRlcGF5OiBBY2NlcHQgcGFja2V0cyB3aXRoIG9ubHkgb25lIGJ5dGUgb2YgZGF0YQorCSAgV2hlbiBmcmFnbWVudGluZyBwYXJ0aW9ucyBpdCBjYW4gaGFwcGVuIHRoYXQgYW4gUlRQIHBhY2tldCBvbmx5IGNhcmllcyAxCisJICBieXRlIG9mIFJUUCBkYXRhLgorCisyMDExLTAxLTIzIDE2OjQyOjE3ICswMDAwICBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOHBheS5oOgorCSAgcnRwdnA4cGF5OiBUcmVhdCB0aGUgZnJhbWUgaGVhZGVyIGp1c3QgbGlrZSBhbnkgb3RoZXIgcGFydGl0aW9uCisJICBXaGVuIHNldHRpbmcgdXAgdGhlIGluaXRpYWwgbWFwcGluZyBqdXN0IGFjdCBhcyBpZiB0aGUgZ2xvYmFsIGZyYW1lCisJICBpbmZvcm1hdGlvbiBpcyBhbm90aGVyIHBhcnRpdGlvbi4gVGhpcyBzYXZlcyBzcGVjaWFsLWNhc2luZyBpdCBsYXRlciBpbgorCSAgdGhlIGFjdHVhbCBwYWNrZXRpemluZyBjb2RlLgorCisyMDEwLTA1LTE2IDE3OjIzOjE3ICswMTAwICBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisKKwkqIGdzdC9ydHAvZGJvb2xodWZmLkxJQ0VOU0U6CisJKiBnc3QvcnRwL2dzdHJ0cHZwOC5jOgorCSogZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHB2cDhwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnA4cGF5Lmg6CisJICBydHB2cDg6IEFkZCBzaW1wbGUgcGF5bG9hZGVycyBhbmQgZGVwYXlsb2FkZXJzIGZvciBWUDgKKwkgIE1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YgaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvY29kZS9zcGVjcy9ydHAvLAorCSAgdmVyc2lvbiAwLjMuMgorCisyMDEyLTExLTAxIDE4OjQyOjM5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSAgZ3N0cGF5OiBmaXggZm9yIDEuMCBldmVudHMKKwkgIENhcHMgZXZlbnRzIGFyZSBzb21ldGltZXMgbm90IGZvbGxvd2VkIGJ5IGEgYnVmZmVyIGJ1dCBieSBhbiBldmVudC4gRmx1c2ggYW55CisJICBwZW5kaW5nIGNhcHMgYmVmb3JlIHdlIG1ha2UgYSBwYWNrZXQgd2l0aCB0aGUgZXZlbnQuCisJICBDaGFpbiB1cCB0byB0aGUgcGFyZW50IGV2ZW50IGhhbmRsZXIgYmVmb3JlIHdlIGF0dGVtcHQgdG8gcHVzaCBSVFAgcGFja2V0cywgaXQKKwkgIG1pZ2h0IGJlIGEgc2VnbWVudCBldmVudC4KKworMjAxMi0xMS0wMSAxODo0MjoyNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSAgZ3N0ZGVwYXk6IGZpeCBzbWFsbCBsZWFrCisKKzIwMTItMTEtMDEgMTc6NDQ6MTEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkgIGdzdGRlcGF5OiBhZGQgc3VwcG9ydCBmb3IgZXZlbnRzCisJICBDb25mbGljdHM6CisJICBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmMKKworMjAxMi0xMS0wMSAxNzo0MDozMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5Lmg6CisJICBydHBnc3RwYXk6IGFkZCBzdXBwb3J0IGZvciBzZW5kaW5nIGV2ZW50cworCSAgV2UgY3VycmVudGx5IG9ubHkgc2VuZCB0YWdzIGFuZCBjdXN0b20gZXZlbnRzLiBUaGUgb3RoZXIgZXZlbnRzCisJICBtaWdodCBpbnRlcmZlcmUgd2l0aCB0aGUgcmVjZWl2ZXIgdGltaW5ncyBvciBhcmUgb3RoZXJ3aXNlIGhhbmRsZWQKKwkgIGJ5IFJUUC4KKwkgIENvbmZsaWN0czoKKwkgIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmMKKworMjAxMi0xMS0wMSAxNTo1NDo1OCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5Lmg6CisJICBnc3RwYXk6IHJld3JpdGUgcGF5bG9hZGVyCisJICBVc2UgYWRhcHRlciB0byBhc3NlbWJsZSB0aGUgcGF5bG9hZCBhbmQgbWFrZSBhIGZsdXNoIGZ1bmN0aW9uIHRvCisJICB0dXJuIHRoaXMgcGF5bG9hZCBpbnRvIChmcmFnbWVudGVkKSBwYWNrZXRzLgorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L3J0cC9nc3RydHBnc3RwYXkuYworCSAgZ3N0L3J0cC9nc3RydHBnc3RwYXkuaAorCisyMDEyLTExLTAxIDEzOjAzOjQ0ICswMDAwICBEb3VnbGFzIEJhZ25hbGwgPGRvdWdsYXNAcGFyYWRpc2UubmV0Lm56PgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSAgdmlkZW9taXhlcjogZ2V0IGhlaWdodCB2aWEgR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCwgbm90IF9XSURUSAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NzMzMAorCisyMDEyLTExLTAxIDEzOjAyOjE2ICswMDAwICBEb3VnbGFzIEJhZ25hbGwgPGRvdWdsYXNAcGFyYWRpc2UubmV0Lm56PgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVib3g6IGZpeCBib3JkZXIgZmlsbGluZyBmb3IgZ3JheSBmb3JtYXRzCisJICBHZXQgdGhlIGhlaWdodCB2aWEgR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCwgbm90IF9XSURUSC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODczMzAKKworMjAxMi0xMS0wMSAxMTo1ODo1NyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSAgZ3N0ZGVwYXk6IGNoZWNrIGZvciBjb3JyZWN0IGZyYWdtZW50IG9mZnNldAorCSAgTWFrZSBzdXJlIHdlIG9ubHkgaW5zZXJ0IHRoZSBydHAgcGFja2V0IGluIHRoZSBhZGFwdGVyIHdoZW4gdGhlCisJICBmcmFnX29mZnNldCBtYXRjaGVzLiBXaGVuIHRoZSBmaXJzdCBwYWNrZXQgb2YgYSBmcmFnbWVudCBpcyBkcm9wcGVkLAorCSAgaXQgYXZvaWRzIHB1dHRpbmcgdGhlIHJlbWFpbmluZyBwYWNrZXRzIGluIHRoZSBhZGFwdGVyIGFuZCBwcm9jZXNzaW5nCisJICB0aGUgcGFydGlhbCBmcmFnbWVudC4KKwkgIENvbmZsaWN0czoKKwkgIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYworCisyMDEyLTExLTAxIDExOjU0OjUwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSAgZ3N0cGF5OiBzZXQgQyBmbGFnIG9uIGFsbCBidWZmZXJzIG9mIHRoZSBmcmFnbWVudAorCSAgU2V0IHRoZSBDIGZsYWdzIG9uIGFsbCB0aGUgZnJhZ21lbnRzIGluc3RlYWQgb2Ygb25seSB0aG9zZSB3aXRoCisJICBjYXBzIGluIHRoZW0uIFRoaXMgbWFrZXMgaXQgZWFzaWVyIGluIHRoZSByZWNlaXZlciB0byBjaGVjayBpZiB0aGVyZQorCSAgaXMgYSBjYXBzIGluIHRoZSBhc3NlbWJsZWQgZnJhZ21lbnRzIGp1c3QgYnkgbG9va2luZyBhdCB0aGUgbGFzdCBSVFAKKwkgIHBhY2tldCBmbGFncy4KKworMjAxMi0xMS0wMSAxMDo1NTowMyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSAgZ3N0ZGVwYXk6IHVzZSB0aGUgY2Fwc3ZlcnNpb24KKwkgIFRha2UgdGhlIGNhcHMgZnJvbSB0aGUgaW5wdXQgY2FwcyBhbmQgc3RvcmUgaXQgaW4gdGhlIHNsb3QgZ2l2ZW4KKwkgIGJ5IGNhcHN2ZXJzaW9uLgorCisyMDEyLTExLTAxIDEwOjUyOjI1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuaDoKKwkgIGdzdHBheTogc2VuZCBjYXBzIGlubGluZQorCSAgUGxhY2UgdGhlIGNhcHN2ZXJzaW9uIG9uIHRoZSBvdXRnb2luZyBjYXBzIHNvIHRoYXQgdGhleSBlbmQgdXAgaW4KKwkgIGFuIFNEUCBhcyB3ZWxsLiBSZWNlaXZlcnMgbmVlZCB0byBrbm93IHdoYXQgY2Fwc3ZlcnNpb24gYSBwYXJ0aWN1bGFyCisJICBjYXBzIGlzIGZvciB0byBiZSBhYmxlIHRvIG1hdGNoIHRoZSBjYXBzIHRvIHRoZSBDViBpbiB0aGUgUlRQIHBhY2tldHMuCisJICBQbGFjZSB0aGUgY2FwcyBpbnNpZGUgdGhlIFJUUCBwYWNrZXQgd2hlbmV2ZXIgdGhlIGNhcHMgY2hhbmdlLgorCSAgQmFzZWQgb24gcGF0Y2ggYnkgQW5kcnplaiBCaWVuaWVrIDxhbmRyemVqLmJpZW5pZWtAcHVyZS5jb20+CisJICBDb25mbGljdHM6CisJICBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jCisJICBnc3QvcnRwL2dzdHJ0cGdzdHBheS5oCisKKzIwMTItMTAtMzEgMTY6MTc6NDggKzAwMDAgIEFuZHJ6ZWogQmllbmllayA8YW5kcnplai5iaWVuaWVrQHB1cmUuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSAgZ3N0cGF5OiBhZGQgZGVidWcKKwkgIENvbmZsaWN0czoKKwkgIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmMKKworMjAxMi0xMC0zMSAxNjowOToyNiArMDAwMCAgQW5kcnplaiBCaWVuaWVrIDxhbmRyemVqLmJpZW5pZWtAcHVyZS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkgIGRlcGF5OiBjb3JyZWN0bHkgc2tpcCBjYXBzIGhlYWRlciBzaXplCisJICBDb25mbGljdHM6CisJICBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmMKKworMjAxMi0wOS0yOCAwMDo0MzozOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBtYXRyb3NrYWRlbXV4OiBwdXQgc3RyZWFtaGVhZGVycyBvbiB2b3JiaXMvc3BlZXgvZmxhYy90aGVvcmEgY2FwcyB0byBtYWtlIHJlbXV4aW5nIHdvcmsKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDA1ODkKKworMjAxMi0xMC0yOCAwMDowNzo0NiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogZG9uJ3QgYXNzZXJ0IGluIGdldF90aW1lKCkgd2hlbiBjYWxsZWQgYWZ0ZXIgc2h1dGRvd24KKwkgIFdoaWNoIG1pZ2h0IGhhcHBlbiBpZiB0aGUgc291cmNlIGdldHMgc2V0IHRvIE5VTEwgc3RhdGUgYmVmb3JlCisJICB0aGUgcmVzdCBvZiB0aGUgcGlwZWxpbmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg2OTg1CisKKzIwMTItMTAtMzAgMTE6MTA6NDkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL2xldmVsL2xldmVsLWV4YW1wbGUuYzoKKwkgIHRlc3RzOiBmaXggbGV2ZWwgZXhhbXBsZQorCSAgVXNlIHRoZSBHVmFsdWVBcnJheSBpbiB0aGUgbWVzc2FnZS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODcxNTQKKworMjAxMi0xMC0yNyAyMzoyMjozNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2F1cGFyc2UvTWFrZWZpbGUuYW06CisJKiBnc3QvbGV2ZWwvTWFrZWZpbGUuYW06CisJKiBnc3QveTRtL01ha2VmaWxlLmFtOgorCSAgZ3N0OiBmaXggdmFyaWFibGUgb3JkZXIgaW4gc29tZSBNYWtlZmlsZS5hbQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NzAxMworCisyMDEyLTEwLTI3IDE3OjI3OjE2IC0wNDAwICBBbnRvaW5lIFRyZW1ibGF5IDxoZXhhMDBAZ21haWwuY29tPgorCisJKiBleHQvbGliY2FjYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdXBhcnNlL01ha2VmaWxlLmFtOgorCSogZ3N0L2xldmVsL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvY3JvcC9NYWtlZmlsZS5hbToKKwkqIGdzdC95NG0vTWFrZWZpbGUuYW06CisJICBnc3Q6IGFkZCB2YXJpb3VzIG1pc3NpbmcgR1NUX1BMVUdJTlNfQkFTRV9MSUJTIGluIE1ha2VmaWxlLmFtCisJICBUaG9zZSBwbHVnaW5zIGRlcGVuZCBvbiBlaXRoZXIgbGliZ3N0YXVkaW8gb3IgbGliZ3N0dmlkZW8sCisJICB3aGljaCBhcmUgaW4gZ3N0LXBsdWdpbnMtYmFzZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODcwMTMKKworMjAxMi0xMC0yNyAxMzoyNDoyNCArMDEwMCAgQWxleGV5IEZpc2hlciA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IG1hcmsgaW52aXNpYmxlIFZQOCBmcmFtZXMgd2l0aCB0aGUgREVDT0RFX09OTFkgZmxhZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NDI1OQorCisyMDEyLTEwLTI2IDEwOjU1OjI4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWx0aWZpbGUuYzoKKwkgIHRlc3RzOiBhZGQgbXVsdGlmaWxlc3JjIHRlc3QgZm9yIGZpeCBpbiBwcmV2aW91cyBjb21taXQKKwkgIE1ha2Ugc3VyZSB0aGUgc3RvcC1pbmRleCBzZXQgaXMgaG9ub3VyZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0ODUzCisKKzIwMTItMTAtMjYgMTA6MzM6MDMgKzAxMDAgIFN0YXMgU2VyZ2VldiA8c3RzcEBha25ldC5ydT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkgIG11bHRpZmlsZXNyYzogZml4IHN0b3AgaW5kZXggaGFuZGxpbmcKKwkgIE1ha2Ugc3VyZSB0aGUgc3RvcCBpbmRleCBpcyBhbHdheXMgaG9ub3VyZWQuIEF2b2lkcworCSAgZW5kbGVzcyBsb29wIGlmIG9uZSB3YW50cyB0byByZWFkIGFuZCBvdXRwdXQgdGhlIHNhbWUKKwkgIGZpbGUgTiB0aW1lcywgZm9yIGV4YW1wbGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0ODUzCisKKzIwMTItMDgtMjUgMDI6MjY6MjkgKzA0MDAgINCg0YPRgdC70LDQvSDQmNC20LHRg9C70LDRgtC+0LIgPGxybjE5ODZAZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thZGVtdXg6IFN1cHBvcnQgcmVjdXJzaXZlIFNpbXBsZVRhZ3MKKwkgIEZpeGVzICM2ODI2NDQKKwkgIERlcGVuZHMgb24gIzY4MjYxNQorCisyMDEyLTA4LTI0IDEzOjU1OjQxICswNDAwICDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyIDxscm4xOTg2QGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYWRlbXV4OiBFeHBhbmQgdGhlIHRhZyBtYXBwaW5nLgorCSAgKiBBbHNvIGV4cG9zZSB1bmtub3duIHRhZ3MgYXMga2V5PXZhbHVlIHBhaXJzLgorCSAgKiBBcnJhbmdlIHRhZyBtYXAgaW4gdGhlIHNhbWUgb3JkZXIgdGFncyBhcmUgbGlzdGVkIGluIE1hdHJvc2thIHNwZWMsIGxlYXZpbmcKKwkgIHVubWFwcGVkIHRhZ3MgYXMgY29tbWVudHMuCisJICAqIE1vcmUgc3BlY2lmaWMgVE9ET3MuCisJICAqIFJlbW92ZSBkdXBsaWNhdGUgREFURSBkZWZpbmUuCisJICBGaXhlcyAjNjgyNjE1CisJICBEZXBlbmRzIG9uICM2ODI1MjQKKworMjAxMi0xMC0yNiAxMDowOTozOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2FkZW11eDogRml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgY29tcGlsZXIgd2FybmluZworCisyMDEyLTA4LTIzIDE1OjA3OjIyICswNDAwICDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyIDxscm4xOTg2QGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYWRlbXV4OiBNYXRyb3NrYSB0YWcgVGFyZ2V0VHlwZSBzdXBwb3J0CisJICAqIFJlYWRzIFRhcmdldFR5cGUgYW5kIFRhcmdldFR5cGVWYWx1ZSBmcm9tIGEgVGFnLgorCSAgKiBBZnRlciBUYWcgaXMgY29tcGxldGVseSByZWFkLCBwcm9jZXNzZXMgdGFnbGlzdCwgc3Vic3RpdHV0aW5nIHNvbWUgb2YgdGhlCisJICB0YWdzIGRlcGVuZGluZyBvbiB0YXJnZXQgdHlwZSB2YWx1ZSBhbmQgdGhlIHByZXNlbmNlIG9mIHZpZGVvL3N1YnRpdGxlIHN0cmVhbXMuCisJICAqIFN1cHBvcnRzIHJlYWRpbmcgdHdvIG5ldyBzaW1wbGV0YWdzIC0gUEFSVF9OVU1CRVIgYW5kIFRPVEFMX1BBUlRTCisJICBEZXBlbmRzIG9uICM2ODI0NDgKKwkgIEZpeGVzICM2ODI1MjQKKworMjAxMi0wOC0yMiAxNTozMjo0MSArMDQwMCAg0KDRg9GB0LvQsNC9INCY0LbQsdGD0LvQsNGC0L7QsiA8bHJuMTk4NkBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYWRlbXV4OiBQZXItdHJhY2sgdGFncyBmb3IgTWF0cm9za2EKKwkgIFJlcXVpcmVzIE1hdHJvc2thIGZpbGUgdG8gaGF2ZSBzYW5lIGxheW91dCAodHJhY2sgaW5mbyBiZWZvcmUgdGFnIGluZm8pLgorCSAgVXNlcyByZXBsYWNlLW1lcmdlLgorCSAgTWFrZXMgdHJhY2sgVUlEcyA2NC1iaXQuCisJICBGaXhlcyAjNjgyNDQ4CisKKzIwMTItMTAtMjUgMjA6MTg6MzYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJICBtdWx0aWZpbGVzcmM6IGZpeCB0eXBvIGluIHByb3BlcnR5IGRlc2NyaXB0aW9uCisKKzIwMTItMTAtMjUgMTI6MTg6MDMgLTA3MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEByZGlvLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZm91cmNjLmg6CisJICBxdGRlbXV4OiByZWFkIHZpZGVvIGZvcm1hdCBoZWFkZXIgZnVsbHkgKHNvIHdlIGNhbiBmaW5kICdwYXNwJyBhdG9tcykgZm9yIG1vcmUgZm91cmNjcy4gRml4ZXMgYXNwZWN0IHJhdGlvIG9mIHByb3JlcyBmaWxlcy4KKworMjAxMi0xMC0yNSAwMDo0NDozNCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkgIGltYWdlZnJlZXplOiB0aGUgbmV3IGdldF9jYXBzIGFscmVhZHkgZG9lcyB0aGUgZmlsdGVyIGludGVyc2VjdGlvbgorCSAgSXQgc2hvdWxkIGJlIGZhc3RlciB0byBwYXNzIHRoZSBjYXBzIHRvIGludGVyc2VjdCBhcyB0aGUgZmlsdGVyIGNhcHMsCisJICByYXRoZXIgdGhhbiB1c2luZyBOVUxMIGFuZCBpbnRlcnNlY3RpbmcgJ21hbnVhbGx5JyBsYXRlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODY4MzcKKworMjAxMi0xMC0yNSAwMDo0Mzo1MSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkgIGltYWdlZnJlZXplOiBhdm9pZCBhc3NlcnRpb24gd2hlbiB1c2luZyBhY2NlcHQgY2FwcyBxdWVyeQorCSAgVGhpcyBxdWVyeSBtdXN0IHJlY2VpdmUgYSBmaXhlZCBjYXBzLCBzbyBpbWFnZWZyZWV6ZSBzaG91bGQKKwkgIGZpeGF0ZSBpdHMgZnJhbWVyYXRlIGJlZm9yZSBzZW5kaW5nIHRoZSBxdWVyeSBkb3duc3RyZWFtLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NjgzNworCisyMDEyLTEwLTI1IDEyOjMzOjI0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIEJhY2sgdG8gZmVhdHVyZSBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAxLjAuMiA9PT0KKworMjAxMi0xMC0yNSAwMTowMTowOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjAuMgorCisyMDEyLTEwLTI0IDEzOjUwOjAwICswMjAwICBBcm5hdWQgVnJhYyA8YXZyYWNAZnJlZWJveC5mcj4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiB1c2UgY29ycmVjdCB0eXBlIGZvciBjaGFubmVsLW1hc2sgYml0bWFzaworCSAgRml4ZXMgY3Jhc2ggb24gMzItYml0IHN5c3RlbXMuCisKKzIwMTItMTAtMjQgMTE6MTc6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IEZsdXNoIHRoZSByaW5nYnVmZmVyIG9uIEdBUCBldmVudHMgd2l0aG91dCBkdXJhdGlvbgorCSAgVGhpcyBpcyByZXF1aXJlZCB0byBwcm9wZXJseSBzdGFydCB0aGUgcmluZ2J1ZmZlciBhbmQgY2xvY2suCisKKzIwMTItMTAtMDIgMjA6NTE6MjkgKzAyMDAgIE9sZWtzaWogUmVtcGVsIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJICB2cDhlbmM6IHNldCBERUNPREVfT05MWSBmbGFnIG9uIGludmlzaWJsZSBBbHRSZWYgZnJhbWVzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0MjE2CisKKzIwMTItMTAtMjMgMTY6MDI6MDUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBmaXggY292ZXJhcnQgZXh0cmFjdGlvbiBpZiB2b3JiaXMgY29tbWVudHMgY29tZSBhZnRlciBwaWN0dXJlIGhlYWRlcgorCSAgU2VlIHNhbXBsZSBmaWxlIGZvciBidWcgIzY4NDcwMS4KKworMjAxMi0xMC0yMyAxMzo0NToxNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGlnbm9yZSBiYWQgaGVhZGVycyBpZiB3ZSBoYXZlIGEgdmFsaWQgU1RSRUFNSU5GTyBoZWFkZXIKKwkgIElmIHdlIHJ1biBpbnRvIGFueSBoZWFkZXIgcGFyc2luZyBpc3N1ZXMgYW5kIHdlIGhhdmUgYSB2YWxpZAorCSAgU1RSRUFNSU5GTyBoZWFkZXIgYWxyZWFkeSwgZG9uJ3QgZXJyb3Igb3V0LCBidXQganVzdCBzdG9wCisJICBoZWFkZXIgcGFyc2luZyBhbmQgdHJ5IHRvIGZpbmQgc29tZSBhdWRpbyBmcmFtZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0NzAxCisKKzIwMTItMTAtMjMgMTM6NDM6MTAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBwb3N0IHByb3BlciBlcnJvciBtZXNzYWdlIGFuZCBmaXggYnVmZmVyIGxlYWsgb24gaGVhZGVyIHBhcnNpbmcgZXJyb3IKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODQ3MDEKKworMjAxMi0xMC0yMiAyMjozMjo0OSAtMDcwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHJkaW8uY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHdpdGggcmF3IGF1ZGlvLCBzZXQgYSBkZWZhdWx0IGNoYW5uZWwtbWFzayBmb3IgbXVsdGljaGFubmVsIGF1ZGlvLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcGFyc2UgJ2NoYW4nIGJlY2F1c2UgaXQncyBhYnN1cmRseSBjb21wbGV4LgorCisyMDEyLTEwLTIyIDE1OjU0OjE3ICswMjAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJybkBheGlzLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVwZHNyYzogZml4IHR5cG8gY2F1c2luZyBjb21waWxhdGlvbiBlcnJvcgorCSAgZ3N0dWRwc3JjLmM6IEluIGZ1bmN0aW9uICdnc3RfdWRwc3JjX2NyZWF0ZSc6CisJICBnc3R1ZHBzcmMuYzozNjU6IGVycm9yOiAncmV0JyBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODY2NDIKKworMjAxMi0xMC0yMiAxMTo1NTo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpXyBmaXggaW52ZXJ0IGZ1bmN0aW9uCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg2NTUwCisKKzIwMTItMTAtMjIgMTE6NTU6MjIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aTogZml4IGRlYnVnCisKKzIwMTItMTAtMjIgMTE6Mzk6MzcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X2ZvdXJjYy5oOgorCSAgcXRkZW11eDogYWRkIHN1cHBvcnQgZm9yICdnZW5lcmljJyBzYW1wbGVzCisJICBBZGQgc3VwcG9ydCBmb3Igc3R1ZmZpbmcgYSBjb21wbGV0ZSBzdHJlYW0gaW50byAxIHNhbXBsZS4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg2NTUwCisKKzIwMTItMTAtMjAgMTM6MDE6NDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJICB0ZXN0czogcmVtb3ZlIHN1cGVyZmx1b3VzIGdfdHlwZV9pbml0KCkgY2FsbAorCSAgSXQncyBkZXByZWNhdGVkIGluIG5ld2VyIEdMaWIgYW5kIG5vdCBuZWVkZWQgaGVyZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODY0NTYKKworMjAxMi0xMC0yMCAxMTozMjoyNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBmaXggY2FwcyBsZWFrIGluIGFjY2VwdGNhcHMgZnVuY3Rpb24KKworMjAxMi0xMC0xOSAxOToyNDoyMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZG9uJ3QgbGVhayBnc3RfcmlmZl9zdHJmX2F1ZHMgaW4gY2FzZSBvZiBNUy9SSUZGIGF1ZGlvCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgxMTkyCisKKzIwMTItMTAtMTggMjI6MjA6MzkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogdW5zaWduZWQgc3VidGl0bGUgdGVtcGxhdGUKKworMjAxMi0xMC0xOCAxMTozMjoxMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogaW4gYWNjZXB0X2NhcHMoKSBjaGVjayBpZiByaW5nIGJ1ZmZlciBpcyBOVUxMIGJlZm9yZSBkZS1yZWZlcmVuY2luZworCSAgQW5kIHNwcmlua2xlIHNvbWUgdGhyZWFkLXNhZmV0eSAodGFrZSBvYmplY3QgbG9jayBmb3IKKwkgIGFjY2Vzc2luZyByaW5nIGJ1ZmZlciwgYW5kIHBhIG1haW4gbG9vcCBsb2NrIGZvciB0aGUKKwkgIGNvbnRleHQpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Mzc4MgorCisyMDEyLTA5LTEzIDAwOjEwOjAwICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuaDoKKwkgIHZpZGVvbWl4ZXIyOiBGaXggcmFjZSBjb25kaXRpb24gd2hlcmUgYSBzcmMgc2V0Y2FwcyBpcyBpZ25vcmVkCisJICBJZiBib3RoIHBhZHMgcmVjZWl2ZSBkYXRhIGF0IHRoZSBzYW1lIHRpbWUsIHRoZXkgd2lsbCBib3RoIGdldCB0aGVpcgorCSAgc2lua19zZXRjYXBzIGNhbGxlZCB3aGljaCB3aWxsIGNhbGwgdGhlIHNyY19zZXRjYXBzLCBidXQgdGhlcmUgaXMKKwkgIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgdGhlIHNlY29uZCBvbmUgbWlnaHQgbm90IGJlIGNhbGxlZC4KKwkgIEZpeGVzOiBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgzODQyCisKKzIwMTEtMTAtMzEgMTU6NDM6MjUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogZG8gbm90IHVzZSB1bm9mZmljYWwgVl9NSlBFRyBjb2RlYyBpZAorCSAgU2luY2UgaXQncyBub3Qgc3BlYydlZCwgY29uc2lkZXIgaXQgYSBWZlcgY29tcGF0aWJpbGl0eQorCSAgY2FzZS4gTWFueSBhcHBsaWNhdGlvbnMgKGUuZy4gYXZpZGVtdXgpIGRvbid0IHVuZGVyc3RhbmQKKwkgIHRoZSB1bm9mZmljaWFsIFZfTUpQRUcgaWQuCisJICBGaXhlcyAjNjU5ODM3LgorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jCisKKzIwMTItMTAtMTcgMTc6MzQ6MjYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mZGV0ZWN0LmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIFVzZSBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhKCkKKwkgIHdoZXJlIHBvc3NpYmxlLiBBdm9pZHMgc29tZSBzdHJpbmcgY29waWVzLiBBbHNvIHJlLWluZGVudAorCSAgc29tZSBzdHVmZi4gQWxzbyBzb21lIGluZGVudCBmaXhlcyBoZXJlIGFuZCB0aGVyZS4KKworMjAxMi0xMC0xNyAxNzowMzozOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJICBqcGVnLCBwbmcsIHZweDogdXNlIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEoKQorCSAgQXZvaWRzIHNvbWUgc3RyaW5nIGNvcGllcy4KKworMjAxMi0xMC0xNyAxNDoyMzowMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkgIGpwZWdkZXBheTogc3RvcmUgcXVhbnQgdGFibGVzIGluIHppZ3phZyBvcmRlcgorCisyMDEyLTEwLTE3IDEzOjU1OjQ1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHNlc3Npb246IGZpeCBjb21waWxlciB3YXJuaW5nCisKKzIwMTItMTAtMTcgMTM6MzU6MDcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBjbGFyaWZ5IHRoZSBudHAtc3luYyBvcHRpb24KKworMjAxMi0xMC0xNyAxMzoxNTo0OCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogdXBkYXRlIGNhcHMgaW4gdGhlIHNvdXJjZQorCSAgSW5mb3JtIHRoZSBzb3VyY2Ugd2hlbiBjYXBzIGNoYW5nZWQuIFRoaXMgd2FzIHJlbW92ZWQgaW4gdGhlIHBvcnQgdG8gMS4wCisJICBsZWF2aW5nIHRoZSBzb3VyY2UgdW5hd2FyZSBvZiB0aGUgY2xvY2stcmF0ZSBhbmQgdW5hYmxlIHRvIGludGVycG9sbGF0ZQorCSAgcnRwIHRpbWVzdGFtcHMgZm9yIFNSIHBhY2tldHMuCisKKzIwMTItMTAtMTcgMTI6NDY6MzIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBiaW46IHNldCBQVFMgYW5kIERUUyBpbiBqaXR0ZXJidWZmZmVyCisKKzIwMTItMTAtMTcgMTI6MjQ6MjIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBkaXNhYmxlIGNoZWNrIGZvciBudHAtc3luYworCSAgRGlzYWJsZSB0aGUgY2hlY2sgZm9yIHRoZSBudHAtc3luYyBtZXRob2QuIEl0IGlzIGV4cGVjdGVkIHRoYXQKKwkgIGEgcmF0aGVyIGxhcmdlciBvZmZzZXQgbmVlZHMgdG8gYmUgYXBwbGllZCB3aXRoIHRoaXMgbWV0aG9kLgorCisyMDEyLTEwLTE3IDEyOjE3OjMyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cGJpbjogdXNlIHJ1bm5pbmctdGltZSBmb3IgTlRQIHRpbWUKKwkgIFdoZW4gdXNlLXBpcGVsaW5lLWNsb2NrIGlzIHNldCwgdXNlIHRoZSBydW5uaW5nLXRpbWUgb2YgdGhlCisJICBwaXBlbGluZSB0byBjYWxjdWxhdGUgdGhlIE5UUCB0aW1lc3RhbXBzLiBUaGlzIG1ldGhvZCB3b3VsZCBwcmV2aW91c2x5CisJICBvbmx5IHdvcmsgd2hlbiB0aGUgYmFzZS10aW1lIGlzIHNldCB0byAwIGJ1dCB3aXRoIHRoaXMgY2hhbmdlIGl0IGNhbgorCSAgYWxzbyB3b3JrIHdpdGggZGlmZmVyZW50IG9mZnNldHMgYW5kIHdlIGNhbiBhbHNvIGltcGxlbWVudCBwYXVzZS9yZXN1bWUKKwkgIG9mIHRoZSBzZW5kZXIgYW5kIHJlY2VpdmVyIG5vdy4KKworMjAxMi0xMC0xNyAxMDoyMDoxMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmg6CisJICB2aWRlb2Nyb3A6IHBvcnQgdG8gdmlkZW9maWx0ZXIKKworMjAxMi0xMC0xNyAwOTozNjo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogdXNlIG91dF9pbmZvIGZvciBvdXQgcHJvcGVydGllcworCisyMDEyLTEwLTE2IDE0OjQwOjE5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9tZWRpYW4uYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb21lZGlhbi5oOgorCSAgbWVkaWFuOiBzbWFsbCBjbGVhbnVwcworCisyMDEyLTEwLTE2IDEzOjU2OjE5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBNYWtlZmlsZS5hbToKKwkqIGdzdC9tZWRpYW4vLmdpdGlnbm9yZToKKwkqIGdzdC9tZWRpYW4vTWFrZWZpbGUuYW06CisJKiBnc3QvbWVkaWFuL2dzdG1lZGlhbi5jOgorCSogZ3N0L21lZGlhbi9nc3RtZWRpYW4uaDoKKwkqIGdzdC9tZWRpYW4vbWVkaWFuLnZjcHJvajoKKwkgIG1lZGlhbjogcmVtb3ZlIG5vdyB0aGF0IGl0IGlzIGluIHZpZGVvZmlsdGVyCisKKzIwMTItMTAtMTYgMTM6NDk6MTEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogcmVtb3ZlIG1lZGlhbiBmcm9tIGJ1aWxkCisKKzIwMTItMTAtMTYgMTM6NDc6MjQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb21lZGlhbi5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvbWVkaWFuLmg6CisJKiBnc3QvdmlkZW9maWx0ZXIvcGx1Z2luLmM6CisJICB2aWRlb21lZGlhbjogY29weSBtZWRpYSB0byB2aWRlb21lZGlhbgorCSAgQ29weSB0aGUgbWVkaWFuIHZpZGVvIGZpbHRlciB0byB2aWRlb2ZpbHRlcnMgYW5kIHJlbmFtZSB0bworCSAgdmlkZW9tZWRpYW4uCisKKzIwMTItMTAtMTYgMTM6MTI6MjEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9tZWRpYW4vTWFrZWZpbGUuYW06CisJKiBnc3QvbWVkaWFuL2dzdG1lZGlhbi5jOgorCSogZ3N0L21lZGlhbi9nc3RtZWRpYW4uaDoKKwkgIG1lZGlhOiBwb3J0IHRvIDEuMAorCisyMDEyLTEwLTE2IDAxOjAyOjExICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogYXBwZW5kIHBhbGV0dGUgZGF0YSB0byBwYWxldHRlZCA4LWJpdCBSR0IgZnJhbWVzCisJICBGaXhlcyBwbGF5YmFjayBvZiA4LWJpdCBpbmRleGVkIFJHQiB2aWRlb3MsIHdpdGggZml4ZXMgaW4gLWJhc2UuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg2MDQ2CisKKzIwMTItMTAtMTUgMTU6MzY6MDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSAgdnA4ZW5jOiBBbmQgdGhpcyB0aW1lIGZpeCB0aGUgZGVmYXVsdCB0YXJnZXQtYml0cmF0ZSB2YWx1ZSBmb3IgcmVhbAorCisyMDEyLTEwLTE1IDE1OjMwOjMzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZweC9nc3R2cDhlbmMuYzoKKwkgIHZwOGVuYzogRml4IGRlZmF1bHQgdGFyZ2V0LWJpdHJhdGUgdmFsdWUKKworMjAxMi0xMC0xMyAwMDowMzoyOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBkb24ndCBhc3NlcnQgaWYgdXBzdHJlYW0gc2l6ZSBpcyBub3QgYXZhaWxhYmxlIHdoZW4gZ3Vlc3NpbmcgYml0cmF0ZXMKKwkgIEZpeGVzIGFib3J0IGluIHB1c2ggbW9kZSB3aGVyZSB0aGUgc291cmNlIGlzIG5vdCBzZWVrYWJsZSBhbmQgdGhlCisJICBzaXplIG9mIHRoZSBmaWxlIGlzIG5vdCBhdmFpbGFibGUsIGFzIHdpdGgKKwkgIGNhdCBmb28ubXA0IHwgZ3N0LWxhdW5jaC0xLjAgcGxheWJpbiB1cmk9ZmQ6Ly8wCisJICBMZXNzIG5vdGljYWJsZSB3aXRoIHJlbGVhc2VzLCBzaW5jZSB3ZSBkaXNhYmxlIGFsbAorCSAgZ19hc3NlcnQoKSB0aGVyZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODYwMDgKKworMjAxMi0xMC0xMiAxNDozODozMyAtMDcwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHJkaW8uY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGFsbG93IG1vcmUgc3RyZWFtcy4gQnVtcCB0aGlzIGNvbnN0YW50IHRvIDMyLCB3aGljaCBzaG91bGQgYmUgZW5vdWdoIGZvciByZWFsLXdvcmxkIGZpbGVzLgorCisyMDEyLTEwLTEyIDE0OjM1OjI0IC0wNzAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAcmRpby5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc3VwcG9ydCBtb3JlIGRpZmZlcmVudCBmb3VyY2MgdmFsdWVzIGZvciBvdGhlciBQcm9SZXMgdmFyaWFudHMuCisKKzIwMTItMTAtMTEgMjI6MzY6MjEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3AtQU1SLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC1QQ01BLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC1QQ01BLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLVZUUy1IMjYzcC1BVFMtUENNQS5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItVlRTLUgyNjNwLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1hbHNhc3JjLVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWRlY29kZWJpbi1IMjYzcC1BTVIuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2M3AtYWxzYXNyYy1BTVIuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2NC1hbHNhc3JjLVBDTUEuc2g6CisJICBleGFtcGxlczogdXBkYXRlIHNvbWUgZWxlbWVudCBuYW1lcyBmb3IgMS4wIGluIFJUUCBleGFtcGxlcworCSAgZ3N0cnRwYmluIC0+IHJ0cGJpbgorCSAgZmZkZWNfKiAgIC0+IGF2ZGVjXyoKKwkgIGZmZW5jXyogICAtPiBhdmVuY18qCisKKzIwMTItMTAtMTAgMTI6MDU6MzQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHJlbW92ZSB1bnVzZWQgaW5jbHVkZQorCisyMDEyLTEwLTEwIDEwOjU1OjI4ICswMjAwICBSYXNtdXMgUm9oZGUgPHJvaGRlQGR1ZmYuZGs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgbXVsdGl1ZHBzaW5rOiBhZGQgbXVsdGljYXN0LWlmYWNlIHByb3BlcnR5CisJICB1ZHBzcmMgYWxyZWFkeSBoYXMgc3VwcG9ydCBmb3Igc2V0dGluZyB0aGUgbXVsdGljYXN0IGludGVyZmFjZSwgd2hpY2gKKwkgIGlzIHVzZWZ1bCBmb3IgbXVsdGktaG9tZWQgbWFjaGluZXMuIFRoaXMgcGF0Y2ggYWRkcyB0aGUgc2FtZSBjb2RlIHRvCisJICB0aGUgbXVsdGl1ZHBzaW5rLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NTg2NAorCisyMDEyLTEwLTEwIDExOjMyOjE3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgbXVsdGl1ZHBzaW5rOiBkb24ndCBlcnJvciBvbiBzZW5kIGVycm9ycyBidXQgb25seSB3YXJuCisJICBEb24ndCBlcnJvciBvbiBzZW5kIGVycm9ycyBidXQgc2ltcGx5IHBvc3QgYSB3YXJuaW5nLCBpdCdzIHBvc3NpYmxlCisJICB0aGF0IHRoZSBuZXh0IHBhY2tldCB3aWxsIGJlIGZpbmUuCisKKzIwMTItMTAtMTAgMTA6Mjg6MjQgKzAyMDAgIFJhc211cyBSb2hkZSA8cm9oZGVAZHVmZi5kaz4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICBtdWx0aXVkcHNpbms6IGFkZCBmb3JjZS1pcHY0IG9wdGlvbgorCSAgQWRkIGFuIG9wdGlvbiB0byB0aGUgbXVsdGl1ZHBzaW5rIHRoYXQgbWFrZXMgaXQgcG9zc2libGUgdG8gZm9yY2UKKwkgIHRoZSB1c2Ugb2YgYW4gSVB2NCBzb2NrZXQuCisJICBUaGlzIGNhbiBlLmcuIGJlIHVzZWQgdG8gaGFuZGxlIHRoZSBpc3N1ZSBkZXNjcmliZWQgaW4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODI0ODEKKworMjAxMi0xMC0xMCAxMDoxODo1MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICBtdWx0aXVkcHNpbms6IHJlbW92ZSB1bnVzZWQgZmllbGQKKworMjAxMi0xMC0xMCAxMDoxMDoyNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogdXNlIG5lZ290aWF0ZWQgYWxsb2NhdG9yIG9yIHBvb2wKKwkgIFVzZSB0aGUgYmFzZSBjbGFzcyB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdXMgYmVjYXVzZSBpdCBrbm93cyBob3cKKwkgIHRvIHVzZSB0aGUgbmVnb3RpYXRlZCBhbGxvY2F0b3Igb3IgYnVmZmVycG9vbC4KKworMjAxMi0xMC0xMCAxMDowOTozNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazogcG9zdCBlcnJvciB3aGVuIHNvbWV0aGluZyBnb2VzIHdyb25nCisKKzIwMTItMTAtMTAgMTA6MDk6MTAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IGVsZW1lbnRzIHBvc3QgZWxlbWVudCBtZXNzYWdlcworCisyMDEyLTEwLTA3IDE2OjU2OjM4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQgKGJ1ZyBmaXhpbmcpCisKKz09PSByZWxlYXNlIDEuMC4xID09PQorCisyMDEyLTEwLTA3IDE1OjMxOjEyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjAuMQorCisyMDEyLTEwLTA2IDE0OjU3OjEwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNmMwYjUyYyB0byA2YmI2OTUxCisKKzIwMTItMTAtMDUgMTU6MTI6MjcgLTA3MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEByZGlvLmNvbT4KKworCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJICBkZWludGVybGVhdmU6IG91dHB1dCBjaGFubmVscyBzaG91bGQgYmUgbWFya2VkIGFzIE1PTk8sIG5vdCBGUk9OVF9MRUZULCBpZiB3ZSdyZSBub3QgcHJlc2VydmluZyBpbnB1dCBjaGFubmVsIHBvc2l0aW9ucy4KKworMjAxMi0xMC0wNCAxNToxMzoyMCAtMDcwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHJkaW8uY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJICBpbnRlcmxlYXZlOiB1c2UgZ3N0X2F1ZGlvX2NoYW5uZWxfcG9zaXRpb25zX3RvX21hc2sgaW5zdGVhZCBvZiBhIGxvY2FsIGNvcHkgb2YgaGFsZiBvZiBpdC4gSGFuZGxlcyBzb21lIHZhbHVlcyBtb3JlIGNvcnJlY3RseS4KKworMjAxMi0xMC0wNCAyMDozMjo0NSArMDIwMCAgUmFzbXVzIFJvaGRlIDxyb2hkZUBkdWZmLmRrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmM6CisJICBnc3RydHBkZXBheTogZG9uJ3QgbGVhayBpbnB1dCBidWZmZXIKKwkgIFRoZSBydHAgYnVmZmVyIGlzIG5ldmVyIHVubWFwcGVkIGluIHRoZSBub3JtYWwgY29kZSBleGl0IHBhdGgKKwkgIG9mIGdzdF9ydHBfZ3N0X2RlcGF5X3Byb2Nlc3MoLi4pIHJlc3VsdGluZyBpbiBhIG1lbW9yeSBsZWFrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NTUxMgorCisyMDEyLTEwLTA0IDE4OjM3OjE4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgdmlkZW9iYWxhbmNlOiBBZGQgc3VwcG9ydCBmb3IgTlYxMiBhbmQgTlYyMQorCisyMDEyLTEwLTAxIDE1OjExOjA1ICswMjAwICBQYXRyaWNpYSBNdXNjYWx1IDxwYXRyaWNpYUBheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgcnRwaDI2NHBheTogZG8gbm90IHB1c2ggdW5tYXBwZWQgZGF0YQorCSAgQWxzbyBkbyBub3QgdXNlIGEgR3N0QnVmZmVyIGFmdGVyIGl0IGhhcyBiZWVuIHB1c2hlZCBpbnRvIHRoZSBhZGFwdGVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NTIxMworCisyMDEyLTEwLTAzIDEwOjUxOjQ1IC0wNzAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAcmRpby5jb20+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy94aW1hZ2UveGltYWdldXRpbC5jOgorCSAgbWV0YSBpbmZvOiB0aHJlYWRzYWZlIHJlZ2lzdHJhdGlvbiB1c2luZyBnX29uY2UKKworMjAxMi0xMC0wMSAxNTo0NDowMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBwdXNoIG1vZGU7IGhhbmRsZSBzb21lIGluaXRpYWwganVuayBiZWZvcmUgaGRybCBsaXN0CisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg1MDU5CisKKzIwMTItMTAtMDEgMTQ6MDM6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9pY2xlcy9nZGtwaXhidWZzaW5rLXRlc3QuYzoKKwkgIHRlc3RzOiBwb3J0IGdka3BpeGJ1ZnNpbmsgdGVzdAorCisyMDEyLTA5LTI5IDExOjU5OjMxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOgorCSAgUHVyZ2UgcmVmZXJlbmNlcyB0byBsaWJvaWwKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzMyODUKKworMjAxMi0wOS0yOCAxNjo1MTowMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvYXZpLWlkcy5oOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHJlY29nbml6ZSBhbGwgeHN1YiBmcmFtZXMgYXMga2V5ZnJhbWVzCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0OTc3CisKKzIwMTItMDktMjggMTY6NTA6MjUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogcHVzaCBtb2RlOiBmaW5kIHRoZSBjb3JyZWN0IGNodW5rIGZvciBzZWdtZW50IGZvbGxvd2luZyBzZWVrCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0OTc3CisKKzIwMTItMDktMjcgMjI6MTc6NDkgKzAxMDAgIEFybmF1ZCBWcmFjIDxyYXdvdWxAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGZpeCBwYXJzaW5nIGluIHB1c2ggbW9kZSB3aGVuIG1vb3YgYXRvbSBpcyBhdCB0aGUgZW5kCisJICBXaGVuIHBsYXlpbmcgYW4gbXA0IGZpbGUgd2l0aCB0aGUgTU9PViBhdG9tIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIHBsYXliYWNrCisJICBmYWlscyB3aXRoIHRoZSBlcnJvciBtZXNzYWdlICJubyAnbW9vdicgYXRvbSB3aXRoaW4gdGhlIGZpcnN0IDEwIE1CIi4gVGhpcyBpcworCSAgZHVlIHRvIGEgbWlzdGFrZSBpbiB0aGUgdXBzdHJlYW1fc2l6ZSB0eXBpbmcsIG1ha2luZyB0aGUgc2VlayB0byB0aGUgZW5kIG9mCisJICBmaWxlIG5ldmVyIGhhcHBlbmluZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODQ5NzIKKworMjAxMi0wOS0yNyAxNTo1MDo0OSAtMDMwMCAgQW5kcmUgTW9yZWlyYSBNYWdhbGhhZXMgKGFuZHJ1bmtvKSA8YW5kcmUubWFnYWxoYWVzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJICBnYW1tYTogcmVtb3ZlIGR1cGxpY2F0ZSBlbnRyaWVzIGF0IGZvcm1hdCBhdCBjYXBzCisJICBBdm9pZHMgZXh0cmEgY2Fwcy9zdHJ1Y3R1cmVzIHByb2Nlc3NpbmcKKworMjAxMi0wOS0yNyAxNDoxMzo0MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIHJ0cHZyYXdkZXBheTogbmVnb3RpYXRlIHBvb2wgd2l0aCBzcmNwYWQgY2FwcworCisyMDEyLTA5LTI3IDExOjAyOjUxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkgIGR2ZGVtdXg6IFRoZSBjb252ZXJ0IGFuZCBkdXJhdGlvbiBxdWVyaWVzIGFyZSBub3Qgc3VwcG9zZWQgdG8gY2hhbmdlIHRoZSBmb3JtYXQKKworMjAxMi0wOS0yNiAwOToyODo1OSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IGNsZWFyIHZpZGVvIGZyYW1lIG1vcmUgY29ycmVjdGx5CisJICBNYWtlIHN1cmUgbm90IHRvIHRvdWNoIG1lbW9yeSB0aGF0IGRvZXNuJ3QgYmVsb25nIHRvCisJICBvdXIgZnJhbWUsIHdlIG1pZ2h0IGJlIG9uZSBwYXJ0IG9mIGEgc2lkZS1ieS1zaWRlIDNECisJICBmcmFtZSwgb3IgaW4gYSBwaWN0dXJlLWluLXBpY3R1cmUgc2NlbmFyaW8uCisKKzIwMTItMDktMjYgMDA6NDQ6NTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBtaW5vciBjbGVhbi11cAorCSAgVXNlIEdzdEJ5dGVXcml0ZXIsIGJlY2F1c2Ugd2UgY2FuLCBhbmQgZ192YWx1ZV90YWtlX2JveGVkLgorCisyMDEyLTA5LTEwIDEwOjI3OjI4ICswNDAwICBEbWl0cml5IFNhbW9uZW5rbyA8ZG1pdHJpeS5zYW1vbmVua29AdGVsaWdlbnQucnU+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBmaXggc3BlZXggYXVkaW8gZGVjb2RpbmcgYnkgY3JlYXRpbmcgZmFrZSBzdHJlYW0gaGVhZGVyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgzNjIyCisKKzIwMTItMDktMjUgMjE6MjE6MTUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvc2ltcGxlLWxhdW5jaC1saW5lcy5jOgorCSAgdmlkZW9taXhlcjogZml4IHdhcm5pbmdzIHdoZW4gdXNpbmcgdHJhbnNwYXJlbnQgYmFja2dyb3VuZAorCSAgZ3N0X3ZpZGVvX2ZyYW1lX21hcCgpIGluY3JlYXNlcyB0aGUgcmVmY291bnQsIHdoaWNoIG1ha2VzCisJICB0aGUgYnVmZmVyIG5vdCB3cml0YWJsZSBhbnkgbW9yZSB0ZWNobmljYWxseSwgc28gY2FsbGluZworCSAgZ3N0X2J1ZmZlcl9tZW1zZXQoKSBvbiBpdCB3aWxsIGNhdXNlIG5hc3R5IHdhcm5pbmdzLgorCSAgVW5pdCB0ZXN0IGRpc2FibGVkIGJlY2F1c2UgaXQgdmVyeSByYXJlbHkgKGZvciBtZSkKKwkgIGZhaWxzLCBwb3NzaWJseSBuZWdvdGlhdGlvbi1yZWxhdGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NDM5OAorCisyMDEyLTA5LTI1IDEwOjQzOjI4ICswMjAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEFkZCBzb21lIHVzZWZ1bCBkZWJ1ZyBsb2dnaW5nCisKKzIwMTItMDktMjUgMTA6NDE6NDQgKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogRml4IHRlbGVjaW5lCisJICBUaGlzIG9ubHkgYWZmZWN0cyBiZWhhdmlvdXIgaW4gdGVsZWNpbmUgY2FzZXMgd2l0aCBwYXR0ZXJuIGxvY2tpbmcKKwkgIGVuYWJsZWQuIFRoZSBkZWZhdWx0IGNhc2Ugc2hvdWxkIGJlIHVudG91Y2hlZC4KKwkgIFRoaXMgd29ya3Mgd2l0aCB0aGUgb3V0cHV0IGZyb20gZmllbGRhbmFseXNpcyBhdCBsZWFzdCwgYnV0IHRoZSBmaWVsZAorCSAgb3JkZXIgbG9va3Mgc3dhcHBlZCBmb3IgdGVsZWNpbmUgbWl4ZWQgYnVmZmVycyB3aXRoIHRoZQorCSAgRGF2aWRfc2xpZGVzX1NjaGxlZWYgY2xpcC4KKworMjAxMi0wOS0yNSAxNDo0MzoxNSArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJICB2cDhlbmM6IERpc2FibGUgR0xJQiBkZXByZWNhdGlvbiB3YXJuaW5ncworCSAgR1ZhbHVlQXJyYXkgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSAyLjMyIC4uLiBidXQgdGhlcmUncyBubyB1c2FibGUKKwkgIHJlcGxhY2VtZW50IGZvciBpdC4KKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY3MjI4CisKKzIwMTItMDktMjUgMTQ6MTg6MzUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogRml4IGxlYWsKKworMjAxMi0wOS0yNCAxNjo0NjoxOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgQmFjayB0byBkZXZlbG9wbWVudCAoYnVnIGZpeGluZykKKworPT09IHJlbGVhc2UgMS4wLjAgPT09CisKKzIwMTItMDktMjQgMTQ6MDY6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAxLjAuMAorCisyMDEyLTA5LTI0IDExOjU2OjU2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOgorCSAgdGVzdHM6IHJlbW92ZSBnX3ByaW50ZXJyKCkgdGhhdCdzIG5vdCBuZWVkZWQgYW55IGxvbmdlcgorCSAgbm93IHRoYXQgdGNhc2Vfc2tpcF9icm9rZW5fdGVzdCgpIHByaW50cyBpdCBhcyB3ZWxsLgorCisyMDEyLTA5LTIzIDE5OjUwOjQyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6CisJICB0ZXN0czogZGlzYWJsZSBmYWlsaW5nIHJlcGxheWdhaW4gdGVzdHMKKworMjAxMi0wOS0yMyAxNjozMTozNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuaDoKKwkgIHNtcHRlOiBzZW5kIHN0cmVhbS1zdGFydCBldmVudAorCisyMDEyLTA5LTIzIDE2OjEwOjM2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguaDoKKwkgIG11bHRpcGFydG11eDogc2VuZCBzdHJlYW0tc3RhcnQgZXZlbnQKKworMjAxMi0wOS0yMyAxNjowMjoxOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHNlbmQgc3RyZWFtLXN0YXJ0CisKKzIwMTItMDktMjMgMTU6NTc6MzUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBzZW5kIHN0cmVhbS1zdGFydCBldmVudAorCisyMDEyLTA5LTIzIDE1OjQ4OjU0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmg6CisJICBpbnRlcmxlYXZlOiBhZGQgYSBidW5jaCBvZiBGSVhNRXMKKwkgIE5lZWRzIHNvbWUgbW9yZSB3b3JrLCBzbyBzdHJlYW0tc3RhcnQsIGNhcHMgYW5kIHRhZ3MgYXJlCisJICBzZW50IGluIHRoZSByaWdodCBvcmRlci4KKworMjAxMi0wOS0yMyAxNToxODo1NCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogc2VuZCBzdHJlYW0tc3RhcnQgZXZlbnQKKworMjAxMi0wOS0yMyAxNToxNjoxNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogc2VuZCBzdHJlYW0tc3RhcnQgZXZlbnQKKworMjAxMi0wOS0yMiAxNTowMDoyNyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJICBydHBkdG1mZGVwYXk6IFVzZSAxLjAtc3R5bGUgY2FwcyBuZWdvdGlhdGlvbiBhbmQgYXVkaW8veC1yYXcKKworMjAxMi0wOS0yMiAxNjowODowNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDRmOTYyZjcgdG8gNmMwYjUyYworCisyMDEyLTA5LTIxIDIxOjU0OjM2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYW5zd2VyIFVSSSBxdWVyeQorCSAgV2l0aG91dCB0aGlzLCBzb21ldGhpbmcgYWxzbyBhbnN3ZXJlZCB0aGUgcXVlcnkKKwkgIHdpdGggVFJVRSBidXQgd2l0aG91dCBzZXR0aW5nIGEgdXJpLCBub3Qgc3VyZQorCSAgd2hhdCB0aGF0IHdhcy4uCisKKzIwMTItMDktMjAgMTc6Mjg6NDcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogTWFrZSBzdXJlIHRoZSBjYXBzIGRvbid0IGhhdmUgZHVwbGljYXRlZCBzcHMvcHBzCisKKzIwMTItMDktMjAgMTk6NTg6MTIgKzAyMDAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBNdXRlIHN0cmVhbSBwb3N0LWNvbm5lY3Rpb24gaWYgcmVxdWlyZWQKKwkgIEEgYnVnIGluIFB1bHNlQXVkaW8gY2F1c2VzIFBBX1NUUkVBTV9TVEFSVF9NVVRFRCB0byBiZSByZWplY3RlZCBvbgorCSAgcmVjb3JkIHN0cmVhbXMuIFVudGlsIHRoaXMgaXMgZml4ZWQgdXBzdHJlYW0sIHdlIG11dGUgdGhlIHN0cmVhbQorCSAgbWFudWFsbHkgYXQgc3RhcnR1cC4gQmFzZWQgb24gYSBwYXRjaCBieSBBbGJhbiBCcm93YWV5cworCSAgPHByYWhhbEB5YWhvby5jb20+LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NDQ2OQorCisyMDEyLTA5LTIwIDE4OjAwOjU5IC0wNzAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAcmRpby5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogMjQgYml0IGF1ZGlvIGhlcmUgaXMgUzI0TEUsIG5vdCBTMjRfM0xFLgorCisyMDEyLTA5LTIwIDEwOjA3OjI0ICswMjAwICBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IGhhbmRsZSBsYXRlbmN5IHF1ZXJ5IGJlZm9yZSBzZXR0aW5nIHVwIHRoZSBidWZmZXJwb29sCisJICBGaXhlcyBjcmFzaCBpZiBubyBidWZmZXJwb29sIGlzIHNldCB1cCB5ZXQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg0NDMwCisKKzIwMTItMDktMTkgMDk6MTc6MDMgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJICBvc3hhdWRpb3Npbms6IFNwZWNpZnkgZW5kaWFubmVzcyBpbiBJRUMgNjE5MzcgcGF5bG9hZGluZworCSAgQ29ycmVzcG9uZHMgdG8gYW4gQVBJIGNoYW5nZSBpbiBnc3QtcGx1Z2lucy1iYXNlLiBUaGlzIG5lZWRzIHRvIGJlIGZpeGVkCisJICB0byBxdWVyeSB0aGUgZXhwZWN0ZWQgYnl0ZSBvcmRlciB1c2luZyBhcHByb3ByaWF0ZSBBUEkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc4MDIxCisKKzIwMTItMDktMTkgMDk6MTU6NTMgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkaXJlY3Rzb3VuZHNpbms6IFNwZWNpZnkgZW5kaWFubmVzcyBpbiBJRUMgNjE5MzcgcGF5bG9hZGluZworCSAgRGlyZWN0U291bmQgZXhwZWN0cyBuYXRpdmUgZW5kaWFuIGJ5dGUgb3JkZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc4MDIxCisKKzIwMTItMDktMTkgMDk6MTM6MTEgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IFNwZWNpZnkgZW5kaWFubmVzcyBpbiBJRUMgNjE5MzcgcGF5bG9hZGluZworCSAgQ29ycmVzcG9uZHMgdG8gYW4gQVBJIGNoYW5nZSBpbiBnc3QtcGx1Z2lucy1iYXNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3ODAyMQorCisyMDEyLTA5LTE5IDAwOjM5OjAxICswMjAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IFJlbW92ZSBpbmNvcnJlY3QgbG9naWMKKwkgIEkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgdGhlc2UgbGluZXMgd2VyZSBhZGRlZCwgdGhleSBkb24ndCBtYWtlIHNlbnNlIHRvCisJICBtZSBub3cgYW5kIGJvdGggRGF2aWQgYW5kIEkgYWdyZWUgdGhhdCByZW1vdmluZyB0aGVtIG1vdmVzIGNsb3NlciB0bworCSAgcmVsYXRlZCBsb2dpYyBiZWluZyBjb3JyZWN0LCB0aGVyZWZvcmUsIHRoZXkncmUgYmVpbmcgcmVtb3ZlZC4KKwkgIEkndmUgdGVzdGVkIGEgZmV3IHByb2dyZXNzaXZlLCBpbnRlcmxhY2VkIGFuZCB0ZWxlY2luZSBjbGlwcyBhbmQgdGhleQorCSAgYWxsIGJlaGF2ZSBwcm9wZXJseSB0aW1lc3RhbXAtd2lzZSBhbmQgdmlzdWFsbHkgYWZ0ZXIgdGhlc2UgY2hhbmdlcy4KKworMjAxMi0wOS0xOSAwMDoxNzo0OSArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXggZmllbGQgZHVyYXRpb24KKwkgIFRoZSBmcmFtZSByYXRlIGZyYWN0aW9uIGlzIGNvcnJlY3RseSBhZGp1c3RlZCBpbiB0aGUgY2FzZXMgcHJlY2VkaW5nIHRoZQorCSAgZmllbGQgZHVyYXRpb24gY2FsY3VsYXRpb24gYW5kIHNvIHRoZSBmYWN0b3Igb2YgMiBpcyBpbmNvcnJlY3QuCisKKzIwMTItMDktMTggMTA6MzQ6MDMgLTA3MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEByZGlvLmNvbT4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogRml4IFUvViBzdHJpZGVzIGZvciBhIG51bWJlciBvZiBjYXNlcy4KKworMjAxMi0wOS0xOCAxMjoxMzoyMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBpbml0IHZpZGVvaW5mbworCSAgLi4uIHRvIHByZXZlbnQgcmFuZG9tIGJvZ3VzIGNhcHMgZmllbGRzLgorCisyMDEyLTA5LTE4IDEyOjEyOjM5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXI6IGNoYWluIHVwIHRvIGNvbGxlY3RwYWRzIHF1ZXJ5IGZ1bmN0aW9uCisKKzIwMTItMDktMTcgMTM6MTc6MDAgLTA0MDAgIE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogRG9uJ3QgbGV0IEdzdENvbGxlY3RQYWQgc2hhZG93IGN1c3RvbSBzaW5rIHBhZCBxdWVyeSBmdW5jCisJICBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlIGN1c3RvbSBwYWQgcXVlcnkgZnVuY3Rpb24gaXMgbm90IGNhbGxlZC4KKwkgIFRoaXMgcGF0Y2gsIHNldCB0aGF0IHF1ZXJ5IGZ1bmN0aW9uIG9uIHRoZSBHc3RDb2xsZWN0UGFkcyB0byBhdm9pZCB0aGlzCisJICBzaGFkb3dpbmcuCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4NDIzNworCisyMDEyLTA5LTE3IDE4OjIzOjExICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvZmlsZXMvTWFrZWZpbGUuYW06CisJICB0ZXN0czogZGlzdCBpbWFnZS5qcGcgZm9yIGpwZWcgdGVzdAorCis9PT0gcmVsZWFzZSAwLjExLjk5ID09PQorCisyMDEyLTA5LTE3IDE3OjU3OjU4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAwLjExLjk5CisKKzIwMTItMDktMTcgMTY6NTM6MDQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMudHlwZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12cHgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkgIGRvY3M6IHVwZGF0ZQorCisyMDEyLTA5LTE3IDEzOjMwOjE1ICswMjAwICBDaHJpc3RpYW4gRnJlZHJpayBLYWxhZ2VyIFNjaGFsbGVyIDx1cmFldXNAbGludXhyaXNpbi5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIEZpeCBzcGVjIGZpbGUgZm9yIHZwOCBtb3ZlCisKKzIwMTItMDktMTcgMTM6MjM6MzYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBNYWtlZmlsZS5hbToKKwkgIGFubm9kZXg6IEFkZCB0byB0aGUgQ1JVRlRfRElSUworCisyMDEyLTA5LTE3IDEyOjE0OjA3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sOgorCSAgZG9jczogdXBkYXRlCisKKzIwMTItMDktMTcgMDk6NDg6NTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSAgdnA4ZW5jOiBDb3JyZWN0bHkgZmluaXNoIGZyYW1lcworCSAgUHJldmlvdXNseSB3ZSB3b3VsZCBhbHdheXMgZ2V0IHRoZSBzYW1lIGZyYW1lIGlmIG11bHRpcGxlIGZyYW1lcyBhcmUgcGVuZGluZywKKwkgIGxlYWtpbmcgbWVtb3J5IG9mIHRoZSBwcmV2aW91cyBmcmFtZXMgYW5kIGJyZWFraW5nIHRpbWVzdGFtcHMuCisKKzIwMTItMDktMTcgMDk6NDA6NDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSAgdnA4ZW5jOiBBbGxvdyBjaGFuZ2luZyBiaXRyYXRlIGFuZCBvdGhlciBwYXJhbWV0ZXJzIGR1cmluZyBwbGF5YmFjaworCSAgRml4ZXMgYnVnICM2NDgyNzYuCisKKzIwMTItMDktMTcgMDk6MTY6MzkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cDhlbmMuaDoKKwkgIHZwOGVuYzogU3RvcmUgY29uZmlndXJhdGlvbiBpbiB0aGUgdnB4X2NvZGVjX2VuY19jZmdfdCBzdHJ1Y3QgaW5zdGVhZCBvZiBkdXBsaWNhdGluZyBhbGwgdmFyaWFibGVzCisJICBBbHNvIHByb3RlY3QgZW5jb2RlciB3aXRoIGEgbXV0ZXguCisKKzIwMTItMDktMTYgMTY6MDM6MDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSAgdnA4ZW5jOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiB0byByZWZsZWN0IG5ldyBwcm9wZXJ0eSBuYW1lcworCSAgLi4uYW5kIGFsc28gbGluayB0byB0aGUgV2ViTSBlbmNvZGVyIHBhcmFtZXRlcnMgd2Vic2l0ZS4KKworMjAxMi0wOS0xNiAxNTo1Nzo1OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cHgvZ3N0dnA4ZW5jLmM6CisJICB2cDhlbmM6IE1ha2Ugc29tZSBwcm9wZXJ0eSBuYW1lcyBtb3JlIHJlYWRhYmxlCisKKzIwMTItMDktMTYgMTU6NDc6MTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSAgdnA4OiBBZGQgdGVzdHMgdG8gLmdpdGlnbm9yZQorCisyMDEyLTA5LTE2IDE1OjQ2OjMxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdnA4ZW5jLmM6CisJICB2cDhlbmM6IFVwZGF0ZSBwYXRjaCB0byB0aGUgbmV3IHByb3BlcnR5IG5hbWVzCisKKzIwMTItMDktMTYgMTU6NDY6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHZweDogSW50ZWdyYXRlIHRlc3QgaW50byB0aGUgYnVpbGQgc3lzdGVtIHRvbworCisyMDEyLTAyLTA3IDE3OjAwOjI2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92cDhkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDYvNl0gdGVzdHM6IGZpeCBtb3JlIHVuaXQgdGVzdHMKKworMjAxMS0xMS0yNCAyMTo0MjozOSArMDEwMCAgUmVuw6kgU3RhZGxlciA8cmVuZS5zdGFkbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdnA4ZGVjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1LzZdIHRlc3RzOiB1cGRhdGUgZm9yIGdzdGNoZWNrIEFQSSBjaGFuZ2UKKworMjAxMC0wNy0xMCAxNTo0Njo1MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDQvNl0gdnA4ZGVjOiBBZGQgc2ltcGxlIHVuaXQgdGVzdCBmb3IgdnA4ZGVjCisKKzIwMTAtMDctMTAgMTU6NDY6NDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzLzZdIHZwOGVuYzogSW1wcm92ZSB1bml0IHRlc3QgYSBiaXQKKworMjAxMC0wNy0xMCAxNTozMjoyOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDIvNl0gdnA4ZW5jOiBBbHNvIGNoZWNrIHRoZSBvdXRwdXQgY2FwcyBpbiB0aGUgdW5pdCB0ZXN0CisKKzIwMTAtMDctMTAgMTU6Mjk6NDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxLzZdIHZwOGVuYzogQWRkIHNpbXBsZSB1bml0IHRlc3QKKworMjAxMi0wOS0xNiAxNTo0MzozOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSAgdnB4OiBJbnRlZ3JhdGUgaW50byB0aGUgYnVpbGQgc3lzdGVtCisKKzIwMTItMDktMTYgMTU6MzM6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnB4L0dzdFZQOEVuYy5wcnM6CisJKiBleHQvdnB4L01ha2VmaWxlLmFtOgorCSogZXh0L3ZweC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cHgvZ3N0dnA4ZGVjLmg6CisJKiBleHQvdnB4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZweC9nc3R2cDhlbmMuaDoKKwkqIGV4dC92cHgvZ3N0dnA4dXRpbHMuYzoKKwkqIGV4dC92cHgvZ3N0dnA4dXRpbHMuaDoKKwkqIGV4dC92cHgvcGx1Z2luLmM6CisJICB2cHg6IFJlbmFtZSB2cDggcGx1Z2luIHRvIHZweAorCSAgVGhpcyBpcyB1c2luZyBsaWJ2cHgsIHdoaWNoIGNhbiBzdXBwb3J0IG1vcmUgY29kZWNzIHRoYW4ganVzdCBWUDgKKwkgIGFuZCB3aWxsIGxpa2VseSBzdXBwb3J0IGZ1dHVyZSBjb2RlY3MuCisKKzIwMTItMDktMTYgMTU6MzI6MjQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIHZwODogQXBwbHkgcmVtYWluaW5nIGNoYW5nZXMgdGhhdCBnb3QgbG9zdCB3aGlsZSBtb3ZpbmcgdGhlIHBsdWdpbiB2aWEgZ2l0IGFtIHRoYW5rcyB0byBtZXJnZXMKKworMjAxMi0wOS0xNiAxNToyNTowOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTM0LzEzNF0gdnA4ZGVjOiBVbnJlZiBpbnB1dC9vdXRwdXQgc3RhdGVzIHdoZW4gc3RvcHBpbmcgdGhlIGRlY29kZXIKKworMjAxMi0wOS0xNiAxNToxODoyMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvR3N0VlA4RW5jLnByczoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMzMvMTM0XSB2cDhlbmM6IFVwZGF0ZSByZWFsdGltZSBwcm9maWxlIHRvIHRoZSBuZXcgcHJvcGVydGllcworCisyMDEyLTA5LTE2IDEwOjU2OjA3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMzIvMTM0XSB2cDg6IFJlcXVpcmUgbGF0ZXN0IGxpYnZweCByZWxlYXNlICgxLjEuMCBmcm9tIE1heSAyMDEyKQorCSAgRml4ZXMgYnVnICM2ODQxMTYgYW5kIHNpbXBsaWZpZXMgY29uZmlndXJlIGNoZWNrcy4KKworMjAxMi0wOS0xNSAyMDoyMzoxMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTMxLzEzNF0gdnA4ZW5jOiBVc2UgYSBzdHJpbmcgZmllbGQgZm9yIHRoZSBwcm9maWxlIGluIHRoZSBjYXBzCisJICBKdXN0IGZvciBjb25zaXN0ZW5jeSB3aXRoIGFsbCB0aGUgb3RoZXIgY29kZWNzLgorCisyMDEyLTA5LTE1IDAwOjA0OjA3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMzAvMTM0XSB2cDhlbmM6IENvcnJlY3RseSBzZXQgcHJvZmlsZSBpbiBjYXBzCisKKzIwMTItMDktMTQgMjM6NDE6NDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMjkvMTM0XSB2cDg6IFVwZGF0ZSBjb3B5cmlnaHQgYW5kIGF1dGhvcnMKKworMjAxMi0wOS0wOCAxNTozODo0MCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5oOgorCSAgW01PVkVEIEZST00gQkFEIDEyOC8xMzRdIHZwOGVuYzogUmV3b3JrIGVuY29kZXIgcHJvcGVydGllcyB0byBiZSBtb3JlIGluIGxpbmUgd2l0aCB0aGUgbGlidnB4IHRvb2xzIGFuZCBBUEkKKwkgIEFsc28gYWRkIGFsbCBhdmFpbGFibGUgcHJvcGVydGllcy4KKworMjAxMi0wOS0xNCAxNzowODo0OSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDEyNy8xMzRdIHJlcGxhY2UgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X2RldGFpbHNfc2ltcGxlIHdpdGggZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X21ldGFkYXRhCisKKzIwMTItMDctMTkgMDk6MDU6MjggKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDEyNi8xMzRdIHZwOGRlYzogQ2FsbCBnc3RfdmlkZW9fZGVjb2Rlcl9uZWdvdGlhdGUoKQorCisyMDEyLTA4LTE0IDExOjE3OjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMTI1LzEzNF0gdnA4ZGVjOiBBZGQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgZGVjb2RpbmcgdGhyZWFkcworCisyMDEyLTA4LTE0IDExOjA5OjQ2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMjQvMTM0XSB2cDhkZWM6IEFkZCBzdXBwb3J0IGZvciB0aGUgTUZRRSBwb3N0cHJvY2Vzc2luZyBmbGFnCisJICBXaGljaCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgaWYgcG9zdHByb2Nlc3NpbmcgaXMgZW5hYmxlZC4KKworMjAxMi0wOC0wOSAxMzozNzoyMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvTWFrZWZpbGUuYW06CisJICBbTU9WRUQgRlJPTSBCQUQgMTIzLzEzNF0gdnA4OiBVc2UgcGtnLWNvbmZpZyBmaWxlIGZvciBnZXR0aW5nIHRoZSBMSUJTIGFuZCBDRkxBR1MKKworMjAxMi0wOC0wOCAxNzowNjoyMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTIyLzEzNF0gdnA4ZW5jOiBVcGRhdGUgdGhlIHBlci1jb21wb25lbnQgc3RyaWRlcyBmb3IgZXZlcnkgZnJhbWUgdG9vCisJICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIEdzdFZpZGVvQWxpZ25tZW50CisKKzIwMTItMDctMjYgMTk6MzE6MTQgKzAyMDAgIE9sZWtzaWogUmVtcGVsIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTIxLzEzNF0gdnA4ZW5jOiBpbml0aWF0ZSBlbmNvZGVyIHRvIGZpeCBhIGNyYXNoLgorCSAgV2l0aG91dCB0aGlzIHBhdGNoIHZwOGVuYyBzZW5kIGhlYWRlciBiZWZvcmUgYW5kIGFmdGVyIGZpcnN0CisJICBrZXkgZnJhbWUuIE9uIHNlY29uZCBrZXlmcmFtZSB2cDhkZWMgd2lsbCBjcmFzaCB3aXRob3V0IGdldHRpbmcKKwkgIGRlY29kZWQgZnJhbWUuIFdpdGggdGhpcyBwaXBlIGl0IGlzIGVhc3kgdG8gcmVwcm9kdWNlIHRoaXMgaXNzdWU6CisJICBnc3QtbGF1bmNoLTEuMCB2aWRlb3Rlc3RzcmMgISB2cDhlbmMgISB2cDhkZWMgISBmYWtlc2luaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MDY2NworCisyMDEyLTA3LTI4IDAwOjMyOjU4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMjAvMTM0XSB0YWc6IFVwZGF0ZSBmb3IgdGFnbGlzdC90YWcgZXZlbnQgQVBJIGNoYW5nZXMKKworMjAxMi0wNy0yMyAxMDozNTowMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTE5LzEzNF0gZXh0OiBVcGRhdGUgZm9yIHZpZGVvIGJhc2UgY2xhc3NlcyBBUEkgY2hhbmdlcworCisyMDEyLTA3LTIxIDE5OjU5OjIxICswMjAwICBPbGVrc2lqIFJlbXBlbCA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDExOC8xMzRdIHZwOGVuYzogZml4IG1lbW9yeSBsZWFrCisJICB1bnJlZiBmcmFtZS4gaSBob3BlIGl0IGlzIGNvcnJlY3QgcGxhY2UgdG8gZG8gaXQuCisJICBTaWduZWQtb2ZmLWJ5OiBPbGVrc2lqIFJlbXBlbCA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisyMDEyLTA3LTA2IDExOjUwOjUzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDExNy8xMzRdIHVwZGF0ZSBmb3IgcXVlcnkgYXBpIGNoYW5nZXMKKworMjAxMi0wNy0wNiAxMToyNjo1NSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMTYvMTM0XSB1cGRhdGUgZm9yIHF1ZXJ5IGFwaSBjaGFuZ2VzCisKKzIwMTItMDctMDYgMTE6MDM6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTE1LzEzNF0gdXBkYXRlIGZvciBhbGxvY2F0aW9uIHF1ZXJ5IGNoYW5nZXMKKworMjAxMi0wNi0wNyAxMjozMzozMSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDExNC8xMzRdIHZwODogZml4IGNvZGVjIHN0YXRlIGxlYWtzCisJICBJIG9ubHkgdGVzdGVkIHRoYXQgdnA4ZW5jICEgdnA4ZGVjIGRvZXMgbm90IGNyYXNoLCBhcyB2YWxncmluZCBkb2VzIG5vdCBncm9rCisJICBhdCBsZWFzdCBvbmUgb2YgdGhlIGluc3RydWN0aW9ucyB1c2VkIGJ5IHZwOGVuYywgcHJldmVudGluZyBtZSBmcm9tIGNoZWNraW5nCisJICBhIGxlYWssIGFuZCB0aGUgbGFjayBvZiBvbmUgYWZ0ZXIgdGhlIHBhdGNoLgorCisyMDEyLTA2LTA2IDEzOjAyOjQwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDExMy8xMzRdIHVwZGF0ZSBmb3IgdGFnIGV2ZW50IGNoYW5nZQorCisyMDEyLTA1LTI4IDE2OjA1OjIxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5oOgorCSAgW01PVkVEIEZST00gQkFEIDExMi8xMzRdIHZwODogUG9ydCB0byAwLjExIGFnYWluCisKKzIwMTItMDUtMTggMTI6NDY6NTUgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDExMS8xMzRdIHZwOGVuYzogZml4IHRhcmdldCBiaXRyYXRlIGNvbmZpZyB3aXRoIGxpYnZweCAxLjEuMAorCSAgbGlidnB4IDEuMS4wIGRpc2FsbG93cyBhIGJpdHJhdGUgb2YgMCwgd2hpY2ggd2FzIHVzZWQgYnkKKwkgIHZwOGVuYyBhcyBhIGRlZmF1bHQgdmFsdWUuCisJICBJbnN0ZWFkLCB3ZSB1c2UgdGhlIGRlZmF1bHQgbGlidnB4IGJpdHJhdGUsIHNjYWxlZCB0byBvdXIKKwkgIHZpZGVvIHNpemUsIGlmIG5vIGJpdHJhdGUgd2FzIHNwZWNpZmllZC4KKwkgIFRoaXMgZml4ZXMgZW5jb2RpbmcgVlA4IHZpZGVvIHdpdGggbGlidnB4IDEuMS4wLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NjI0NQorCisyMDEyLTA1LTE2IDE0OjA0OjI4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMTAvMTM0XSB2cDhlbmM6IFVwZGF0ZSBmb3IgR3N0VmlkZW9Db2RlY0ZyYW1lIEFQSSBjaGFuZ2VzCisKKzIwMTItMDQtMjcgMTg6MjI6NDIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMTA5LzEzNF0gdnA4ZGVjOiBJbXByb3ZlIG91dHB1dF9zdGF0ZSBoYW5kbGluZworCSAgQXZvaWQgZ2V0dGluZyBvdXRwdXRfc3RhdGUgZm9yIGV2ZXJ5IGJ1ZmZlciBhcyB0aGF0IHJlcXVpcmVzCisJICBnZXR0aW5nIHRoZSBvYmplY3Rsb2NrIGFuZCBkb2luZyByZWZlcmVuY2UgY291bnRpbmcuIFN0b3JlIGl0IGxvY2FsbHkKKwkgIHdoZW4gaXQgaXMgY3JlYXRlZCBhbmQgdXNlIGl0LgorCisyMDEyLTA0LTI3IDA5OjA1OjU3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTA4LzEzNF0gdnA4ZGVjOiBVc2Ugb3V0cHV0c3RhdGUgd2hlbiBjb3B5aW5nIG91dHB1dCBidWZmZXIgZGF0YQorCSAgVXNpbmcgdGhlIGlucHV0IHN0YXRlIHdhcyBjYXVzaW5nIGEgY3Jhc2ggYmVjYXVzZSB0aGUgc3RyaWRlcy9vZmZzZXRzCisJICB3b3VsZCBiZSB3cm9uZy4gRml4IGl0IGJ5IHVzaW5nIHRoZSBvdXRwdXQgYXMgd2UgYXJlIGRlYWxpbmcgd2l0aAorCSAgdGhlIGRlY29kZWQgZnJhbWUuCisKKzIwMTItMDQtMjQgMTE6MDg6NDEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDEwNy8xMzRdIHZwODogUG9ydCB0byAtYmFzZSB2aWRlbyBiYXNlIGNsYXNzZXMKKwkgIENvbmZsaWN0czoKKwkgIGV4dC92cDgvTWFrZWZpbGUuYW0KKwkgIGV4dC92cDgvZ3N0dnA4ZGVjLmMKKwkgIGV4dC92cDgvZ3N0dnA4ZW5jLmMKKwkgIEJhY2sgdG8gMC4xMCBzdGF0ZSBmb3Igbm93LCBuZWVkIHRvIGJlIHBvcnRlZCBhZ2Fpbi4KKworMjAxMi0wNS0xOCAxMjo0Njo1NSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTA2LzEzNF0gdnA4ZW5jOiBmaXggdGFyZ2V0IGJpdHJhdGUgY29uZmlnIHdpdGggbGlidnB4IDEuMS4wCisJICBsaWJ2cHggMS4xLjAgZGlzYWxsb3dzIGEgYml0cmF0ZSBvZiAwLCB3aGljaCB3YXMgdXNlZCBieQorCSAgdnA4ZW5jIGFzIGEgZGVmYXVsdCB2YWx1ZS4KKwkgIEluc3RlYWQsIHdlIHVzZSB0aGUgZGVmYXVsdCBsaWJ2cHggYml0cmF0ZSwgc2NhbGVkIHRvIG91cgorCSAgdmlkZW8gc2l6ZSwgaWYgbm8gYml0cmF0ZSB3YXMgc3BlY2lmaWVkLgorCSAgVGhpcyBmaXhlcyBlbmNvZGluZyBWUDggdmlkZW8gd2l0aCBsaWJ2cHggMS4xLjAuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc2MjQ1CisKKzIwMTItMDQtMDUgMTg6MDI6NTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L3BsdWdpbi5jOgorCSAgW01PVkVEIEZST00gQkFEIDEwNS8xMzRdIGdzdDogVXBkYXRlIGZvciBHU1RfUExVR0lOX0RFRklORSgpIEFQSSBjaGFuZ2VzCisKKzIwMTItMDQtMDQgMTQ6NDE6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L01ha2VmaWxlLmFtOgorCSAgW01PVkVEIEZST00gQkFEIDEwNC8xMzRdIGdzdDogVXBkYXRlIHZlcnNpb25pbmcKKworMjAxMi0wMy0wNiAxNToyMToxNyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTAzLzEzNF0gdnA4ZW5jOiBGaXggJ2FyZ3VtZW50IHRvICdzaXplb2YnIGluICdtZW1zZXQnIGNhbGwgaXMgdGhlIHNhbWUgZXhwcmVzc2lvbiBhcyB0aGUgZGVzdGluYXRpb24nIGNvbXBpbGVyIHdhcm5pbmcKKworMjAxMi0wMS0zMCAxNzoxNzoxNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMDIvMTM0XSB1cGRhdGUgZm9yIEhFQURFUiBmbGFnCisKKzIwMTItMDEtMjUgMTg6NDk6NTggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMDEvMTM0XSBwb3J0IHNvbWUgbW9yZSB0byBuZXcgbWVtb3J5IEFQSQorCSAgRml4ZXMgIzY2ODY3Ny4KKworMjAxMi0wMS0yNCAxMToyMjo0NiArMDEwMCAgT2xla3NpaiBSZW1wZWwgKEFsZXhleSBGaXNoZXIpIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTAwLzEzNF0gdnA4ZW5jOiB0cmFjZSBvdXRnb2luZyB0aW1lc3RhbXBzCisJICBhZGQgaW5mbyBsZXZlbCBwcmludHMgZm9yIG91dGdvaW5nIHRpbWVzdGFtcHMuCisJICBTaWduZWQtb2ZmLWJ5OiBPbGVrc2lqIFJlbXBlbCAoQWxleGV5IEZpc2hlcikgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworMjAxMi0wMS0wNCAxMTowNTo0OCArMDEwMCAgT2xla3NpaiBSZW1wZWwgKEFsZXhleSBGaXNoZXIpIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDk5LzEzNF0gdnA4ZGVjOiB1c2UgaXNfYWx0X2RhdGEgb3B0aW9uIHRvIHByZXZlbnQgdGltZXN0YW1wIGNvbGxpc2lvbnMKKwkgIGFsdHJlZi9pbnZpc2libGUgZnJhbWVzIHVzdWFsbHkgc3RvcmVkIGluIGNvbnRhaW5lciB3aXRoIHNhbWUgdGltZXN0YW1wIGFzCisJICBkZXBlbmRldCBmcmFtZS4gVGhpcyBtYWtlIGJhc2V2aWRlb2RlY29kZXIgdG8gdXBkYXRlIHRpbWVzdGFtcCBmb3IgZGVwZW5kZXQKKwkgIGZyYW1lIGFuZCBjb3VzZSBUUyBjb2xpc2lvbiBvbiBuZXh0IGZyYW1lOgorCSAgXi0gaGVyZSBpcyBhbHRyZWYKKwkgIHRpbWUgICAgIDogMSAyIDMgNCA1IDYgNyA4IDkKKwkgIHdlYm0gdHMgIDogMSAgIDMgNSA1ICAgNyAgIDkKKwkgIHZwOGRlYyB0czogMSAgIDMgICA3ICAgNyAgIDkKKwkgIEZpeCBidWc6IGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTUyNDUKKwkgIFNpZ25lZC1vZmYtYnk6IE9sZWtzaWogUmVtcGVsIChBbGV4ZXkgRmlzaGVyKSA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisyMDEyLTAxLTAyIDA4OjI4OjEzICswMTAwICBPbGVrc2lqIFJlbXBlbCAoQWxleGV5IEZpc2hlcikgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworCSogZXh0L3ZwOC9Hc3RWUDhFbmMucHJzOgorCSogZXh0L3ZwOC9NYWtlZmlsZS5hbToKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwOTgvMTM0XSB2cDg6IGFkZCBpbml0aWFsIHByZXNldCBmaWxlCisJICBUaGlzIGlzIGluaXRpYWwgcHJlc2V0IGZpbGUsIGN1cnJlbnRseSB3aXRoIG9ubHkgb25lIHByb2ZpbGUKKwkgIGZvciByZWFsdGltZSBlbmNvZGluZy4KKwkgIFNpZ25lZC1vZmYtYnk6IE9sZWtzaWogUmVtcGVsIChBbGV4ZXkgRmlzaGVyKSA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisyMDExLTExLTI4IDEzOjA4OjI3ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDk3LzEzNF0gdmFyaW91czogZml4IHBhZCB0ZW1wbGF0ZSByZWYgbGVha3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjI2NjQKKworMjAxMS0xMS0yNSAxMTozNjoxNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDk2LzEzNF0gdnA4ZGVjOiB1c2UgbmV3IGJhc2V2aWRlb2RlY29kZXIgQVBJIHRvIGRyb3AgZnJhbWVzIGFuZCBnZXQgUW9TIG1lc3NhZ2VzIHBvc3RlZAorCisyMDExLTExLTEwIDE1OjEzOjM0ICswMjAwICBNYXJ0IFJhdWRzZXBwIDxsZWlvQGdlbnRvby5vcmc+CisKKwkqIGV4dC92cDgvTWFrZWZpbGUuYW06CisJICBbTU9WRUQgRlJPTSBCQUQgMDk1LzEzNF0gbWltaWMsIG9wZW5jdiwgdnA4LCBhY21tcDNkZWMsIGxpbnN5czogRG9uJ3QgYnVpbGQgc3RhdGljIHBsdWdpbnMKKwkgIFBhc3MgLS10YWc9ZGlzYWJsZS1zdGF0aWMgdG8gbGlidG9vbCBldmVyeXdoZXJlIHdoZXJlIGl0J3MgYmVlbiBmb3Jnb3R0ZW4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjM3NjgKKworMjAxMS0xMS0wMyAxNDowMTo0MSArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA5NC8xMzRdIHZwODogUG9ydCB0byAwLjExCisKKzIwMTEtMDgtMjEgMjA6MTU6MjUgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA5My8xMzRdIHZwOGVuYzogZml4IGRyb3AtZnJhbWUgcHJvcGVydHkKKwkgIEZpeGVzICM2NTY5MjkuCisKKzIwMTEtMDgtMTkgMTk6MTc6MTUgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhlbmMuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwOTIvMTM0XSB2cDg6IHByb2JlIGZvciB0aGUgbmV3IHR1bmluZyBBUEkgdG8ga2VlcCBidWlsZGluZyB3aXRoIG9sZGVyIGxpYnZweAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NjkyOAorCisyMDExLTA4LTE4IDEwOjM5OjI2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwOTEvMTM0XSB2cDhlbmM6IFJlbW92ZSB1bnVzZWQgYW5kIHVzZWxlc3MgdmFyaWFibGUgaW4gdGFncyBoYW5kbGluZworCisyMDExLTA4LTEyIDEyOjA4OjA4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwOTAvMTM0XSB2cDhlbmM6IFVwZGF0ZSBmb3IgYmFzZXZpZGVvZW5jb2RlciA6OmdldF9jYXBzKCkgcmVtb3ZhbAorCisyMDExLTA3LTA5IDE4OjUzOjI0IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMDg5LzEzNF0gdnA4ZW5jOiBBZGQgbW9yZSBwcm9wZXJ0aWVzCisKKzIwMTEtMDYtMTkgMTY6MDY6NDYgKzAyMDAgIEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMDg4LzEzNF0gdnA4ZW5jOiBhZGQgbWluL21heHNlY3Rpb24tcGN0IG9wdGlvbgorCSAgVGhpcyBvcHRpb25zIHNob3VsZCBiZSBnb29kIHRvIHJlZGV1Y2UgZGVjb2RlIENQVSBsb2FkLgorCSAgZm9yIGxvd2VuZCBoYXJkd2FyZToKKwkgIG1pbnNlY3Rpb24tcGN0PTE1IG1heHNlY3Rpb24tcGN0PTQwMAorCSAgZm9yIGhpZW5kIGh3OgorCSAgbWluc2VjdGlvbi1wY3Q9NSBtYXhzZWN0aW9uLXBjdD04MDAKKwkgIHNlZSBleGFtcGxlOgorCSAgaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvdG9vbHMvZW5jb2Rlci1wYXJhbWV0ZXJzLyMyLXBhc3NfdmJyX2VuY29kaW5nX2Zvcl9zbW9vdGhfcGxheWJhY2tfb25fbG93LWVuZF9oYXJkd2FyZQorCSAgU2lnbmVkLW9mZi1ieTogQWxleGV5IEZpc2hlciA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCSAgU2lnbmVkLW9mZi1ieTogRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKzIwMTEtMDYtMTkgMTE6MDU6MzYgKzAyMDAgIEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMDg3LzEzNF0gdnA4ZW5jOiBhZGQgbGFnLWluLWZyYW1lcyBvcHRpb24uCisJICBUaGlzIG9wdGlvbiBzZXQgbWF4aW11bSBvZiBmcmFtZXMgY29kZWMgc2hvdWxkIHJlbWVtYmVyLAorCSAgdG8gbWFrZSBiZXR0ZXIgcHJlZGlrdGlvbiBmb3IgYWx0LXJlZiBmcmFtZXMuCisJICBTZWUgZXhhbXBsZToKKwkgIGh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL3Rvb2xzL2VuY29kZXItcGFyYW1ldGVycy8jMi1wYXNzX2Jlc3RfcXVhbGl0eV92YnJfZW5jb2RpbmcKKwkgIFNpZ25lZC1vZmYtYnk6IEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKwkgIFNpZ25lZC1vZmYtYnk6IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisyMDExLTA2LTE5IDA3OjE2OjU3ICswMjAwICBBbGV4ZXkgRmlzaGVyIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDg2LzEzNF0gdnA4ZW5jOiB1c2UgbXVsdGlwYXNzLmNhY2hlIGZpbGUgbmFtZSBhcyBkZWZhdWx0IGZvciBtdWx0aXBhc3MgbW9kZS4KKwkgIFNpZ25lZC1vZmYtYnk6IEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKwkgIFNpZ25lZC1vZmYtYnk6IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisyMDExLTA3LTIxIDA4OjAzOjUxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwODUvMTM0XSB2cDhlbmM6IFVwZGF0ZSBmb3IgR3N0QmFzZVZpZGVvRW5jb2Rlcjo6ZmluaXNoKCkgc2lnbmF0dXJlIGNoYW5nZQorCisyMDExLTA3LTEyIDE4OjA1OjI1IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA4NC8xMzRdIHZwODogRml4IHNldC1idXQtdW51c2VkIHdhcm5pbmdzCisKKzIwMTEtMDctMDkgMTE6MzE6MDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA4My8xMzRdIHZwOGVuYzogVXNlIGRlc3Ryb3kgbm90aWZ5IHRvIGZyZWUgdGhlIGNvZGVyIGhvb2sKKworMjAxMS0wNi0xOCAxNTo1Njo0OSAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDgyLzEzNF0gdnA4ZW5jOiB1cGRhdGUgZm9yIG5ldyBsaWJ2cHggYXBpCisKKzIwMTEtMDYtMjYgMTU6MTU6NTQgKzAyMDAgIEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwODEvMTM0XSB2cDhlbmM6IGdlbmVyYXRlIGEgdGltZXN0YW1wIGZvciBhbHQtcmVmIGZyYW1lcy4KKwkgIEl0IHdpbGwgZml4IGhhbmRsaW5nIG9mIGFsdHJlZi9pbnZpc2libGUgZnJhbWVzIHNpbmNlIG1hdHJvc2thLW11eAorCSAgZHJvcCBhbnkgZnJhbSB3aXRoIG5vIHRpbWVzdGFtcC4KKwkgIHNlZSBhbHNvOgorCSAgaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvY29kZS9zcGVjcy9jb250YWluZXIvCisJICBUaGUgZW5jb2RlciB3aWxsIGN1cnJlbnRseSBzZXQgdGhlIEFSJ3MgdGltZXN0YW1wIGFzIGNsb3NlIGFzIHBvc3NpYmxlCisJICB0byB0aGUgcHJldmlvdXMgZnJhbWUgd2hpbGUgYXR0ZW1wdGluZyB0byBwcm92aWRlIGEgdGltZXN0YW1wIHRoYXQgaXMKKwkgIHN0cmljdGx5IGluY3JlYXNpbmcuIEluIGNhc2VzIHdoZXJlIHRoZSB0aW1lIGJhc2UgZ2l2ZW4gdG8gdGhlIGVuY29kZXIKKwkgIGF0IGNvbmZpZ3VyZSB0aW1lIGlzIG5vdCBncmFudWxhciBlbm91Z2ggdG8gYWxsb3cgZm9yIHRoaXMgdGhlIEFSCisJICB3aWxsIHNoYXJlIHRoZSBzYW1lIHRpbWVzdGFtcCBhcyBELCBidXQgc2hvdWxkIGJlCisJICB0cmVhdGVkIGFzIGhhdmluZyBubyBkdXJhdGlvbi4KKwkgIEZpeGVzIGJ1ZyAjNjUyOTUxCisJICBTaWduZWQtb2ZmLWJ5OiBBbGV4ZXkgRmlzaGVyIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKzIwMTEtMDYtMTggMTc6NDc6MzYgKzAyMDAgIEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwODAvMTM0XSB2cDhkZWM6IGFkZCBjaGVjayBpZiB3ZSBoYXZlIGxlZ2FsIGFzcGVjdC1yYXRpbyBiZWZvcmUgcmVzZXQgaXQuCisJICB0aGUgY29tbWl0IGY5YjU1MmYwNDk0ZSAodnA4ZGVjOiBzZXQgcGFyIHRvIDEvMSkKKwkgIHdpbGwgZml4IHNpdHVhdGlvbiB3aGVyZSBubyBhc3BlY3QtcmF0aW8gaXMgc2V0LCBidXQgaXQgYnJha2UKKwkgIHN0cmVhbSB3aXRoIGF2YWlsYWJsZSBhc3BlY3QtcmF0aW8uIFRoaXMgcGF0Y2ggZml4IGl0LgorCSAgRml4ZXM6ICM2NTI5MDIuCisJICBTaWduZWQtb2ZmLWJ5OiBBbGV4ZXkgRmlzaGVyIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKzIwMTEtMDYtMDMgMTk6MzY6NTkgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA3OS8xMzRdIHZwOGRlYzogc2V0IHBhciB0byAxLzEKKworMjAxMS0wNS0xOCAxMzoyNzoyMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDc4LzEzNF0gdnA4ZW5jOiBOYW1lIG1heC9taW4gcXVhbnRpemVyIHByb3BlcnRpZXMge21heCxtaW59LXF1YW50aXplcgorCSAgQWxzbyBpbXByb3ZlIHF1YWxpdHkgcHJvcGVydHkgZGVzY3JpcHRpb24uCisKKzIwMTEtMDUtMTggMTM6MjY6MjMgKzAyMDAgIEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMDc3LzEzNF0gdnA4ZW5jOiBBZGQgcHJvcGVydGllcyB0byBzZWxlY3QgYSBtYXhpbXVtIGFuZCBtaW5pbXVtIHF1YW50aXplcgorCSAgRml4ZXMgYnVnICM2NDE0MDUuCisKKzIwMTEtMDUtMTggMTM6MTg6NTggKzAyMDAgIEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNzYvMTM0XSB2cDhlbmM6IEZpeCBxdWFsaXR5IHRvIChjb25zdGFudCkgcXVhbnRpemVyIG1hcHBpbmcKKwkgIFRoaXMgbm93IGFsbG93cyB0byBzZWxlY3QgYWxsIHBvc3NpYmxlIHF1YW50aXplcnMgYmV0d2VlbgorCSAgMCBhbmQgNjMuCisJICBTZWUgYnVnICM2NDE0MDUuCisKKzIwMTEtMDQtMDEgMjI6MTM6NTUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA3NS8xMzRdIHZwOGRlYzogZGVidWcgY29kZSBzdHlsZSBmaXhlcworCisyMDExLTA0LTAxIDIyOjEzOjAwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNzQvMTM0XSB2cDhkZWM6IHByb3BhZ2F0ZSBkb3duc3RyZWFtIGZsb3cgcmV0dXJuIHRvIHVwc3RyZWFtCisKKzIwMTEtMDMtMzAgMTA6MTg6MjMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA3My8xMzRdIGJhc2V2aWRlb2RlY29kZXI6IHJlYWxseSBhbmQgb25seSBzZXQgc3JjIHBhZCBjYXBzIHdoZW5ldmVyIHJlcXVlc3RlZAorCSAgLi4uIHNpbmNlIHN1YmNsYXNzIGlzIGV4cGVjdGVkIHRvIGJlIHdpc2UgZW5vdWdoIHRvIGtub3cgd2hlbiB0byBkbyBzby4KKworMjAxMS0wMy0yOSAxMDo0MTo1NCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDcyLzEzNF0gYmFzZXZpZGVvZGVjb2RlcjogaW52b2tlIHN1YmNsYXNzIHN0YXJ0IG1ldGhvZCBhdCBzdGF0ZSBjaGFuZ2UgYW5kIHVzZSBzZXRfZm9ybWF0CisJICBXaGlsZSB0aGlzIGNoYW5nZXMgQVBJIHNsaWdodGx5IChlLmcuIGFjdHVhbGx5IHVzZXMgc2V0X2Zvcm1hdCBub3cpLCB3aGljaCBpcyBPSworCSAgZm9yIHVuc3RhYmxlIEFQSSwgaXQgaGFzIGZvbGxvd2luZyBtZXJpdHM6CisJICAqIHN5bW1ldHJpYyB3LnIudC4gc3RvcCBhdCBzdGF0ZSBjaGFuZ2UKKwkgICogaW4gbGluZSB3aXRoIG90aGVyIGJhc2UgY2xhc3MgcHJhY3RpY2UKKwkgICogb3RoZXJ3aXNlIG5vIHN1YmNsYXNzIG1ldGhvZCBhdCBzdGF0ZSBjaGFuZ2UgKGdsb2JhbCBhY3RpdmF0aW9uIHRpbWUpCisJICBNb3Jlb3Zlciwgc3ViY2xhc3Nlc2UgYXJlIGVpdGhlciB1bmFmZmVjdGVkIG9yIHRyaXZpYWxseSBhZGp1c3RlZCBhY2NvcmRpbmdseS4KKworMjAxMS0wMy0yOCAwODo1OToyMCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDcxLzEzNF0gYmFzZXZpZGVvZGVjb2Rlcjogc3Vic3VtZSBza2lwX2ZyYW1lIGludG8gZmluaXNoX2ZyYW1lCisKKzIwMTEtMDMtMjQgMTQ6MTA6MDcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA3MC8xMzRdIGJhc2V2aWRlb2VuY29kZXI6IHByb3ZpZGUgcHJvcGVyIHVwc3RyZWFtIGZsb3cgcmV0dXJuIGhhbmRsaW5nCisKKzIwMTEtMDMtMjQgMTM6NTk6MzUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhlbmMuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNjkvMTM0XSB2cDhlbmM6IG1pbm9yIG9wdGltaXphdGlvbiBpbiBzZXR0aW5nIHVwIGltYWdlIGJ1ZmZlcgorCisyMDExLTAzLTI0IDEyOjUwOjIzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNjgvMTM0XSB2cDhlbmM6IHJlZmFjdG9yIGZyYW1lIHByb2Nlc3NpbmcKKworMjAxMS0wMy0yNCAxMTo1NTo0MSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDY3LzEzNF0gdnA4ZW5jOiBkbyBpbml0IGF0IHNldF9mb3JtYXQgdGltZQorCisyMDExLTAzLTI0IDEwOjE1OjU1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMDY2LzEzNF0gdnA4ZW5jOiBmaXgga2V5ZnJhbWUgZm9yY2luZworCisyMDExLTAzLTIzIDA5OjQ1OjIwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNjUvMTM0XSBiYXNldmlkZW9jb2RlYzogcmVtb3ZlIHJlZHVuZGFudCBjYXBzIGZpZWxkCisJICAuLi4gYXMgaXQgaXMgYWxyZWFkeSBhdCBoYW5kIGFzIHRoZSBzcmMgcGFkJ3MgbmVnb3RpYXRlZCBjYXBzLgorCisyMDExLTAzLTIzIDA4OjUwOjMxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMDY0LzEzNF0gdnA4ZW5jOiB1c2UgYmFzZWNsYXNzIGV2ZW50IHZpcnR1YWwgaGFuZGxlcgorCisyMDExLTAyLTIwIDE0OjE2OjE4IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuaDoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMDYzLzEzNF0gYmFzZXZpZGVvOiBtZXJnZSB1dGlscyBoZWFkZXIgaW50byBiYXNldmlkZW9jb2RlYworCisyMDExLTAzLTE3IDE2OjM0OjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9NYWtlZmlsZS5hbToKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNjIvMTM0XSB2cDg6IGZpeCBMSUJBREQgb3JkZXIgaW4gTWFrZWZpbGUuYW0KKworMjAxMS0wMi0wNCAwOTowODoyNiArMDEwMCAgQWxleGV5IEZpc2hlciA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA2MS8xMzRdIHZwOGVuYzogQWRkIGRlc2NyaXB0aW9uIGZvciBiaXRyYXRlIHVuaXRzLgorCisyMDEwLTExLTMwIDE4OjQzOjI0IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNjAvMTM0XSB2cDhlbmM6IFJlYWRkIHNldHRpbmcgb2YgZ3JhbnVsZXBvcworCSAgUmV2ZXJ0IHBhcnRzIG9mIGxhc3QgcGF0Y2ggdGhhdCByZW1vdmVkIHNldHRpbmcgb2YgZ3JhbnVsZXBvcy4KKwkgIG9nZ211eCBzdGlsbCByZXF1aXJlcyBjb3JyZWN0IGdyYW51bGVwb3MgaW4gaW5jb21pbmcgcGFja2V0LgorCisyMDEwLTExLTI5IDIwOjIxOjMxIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNTkvMTM0XSB2cDhlbmM6IERvbid0IG92ZXJyaWRlIHRpbWVzdGFtcHMgc2V0IGJ5IGJhc2UgY2xhc3MKKwkgIEJlY2F1c2UgdGhlIGJhc2UgY2xhc3MgZG9lcyBpdCBjb3JyZWN0bHkuCisJICBGaXhlczogIzYzNTcyMCwgIzYyNTU1OC4KKworMjAxMC0xMS0yNSAxODo1Mjo0NyArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDU4LzEzNF0gdnA4OiBSZW1vdmUgZGVhZCBhc3NpZ25tZW50cworCisyMDEwLTEwLTA5IDE3OjM2OjA3IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDU3LzEzNF0gYmFzZXZpZGVvOiBNb3ZlIGNvbW1vbiBmaWVsZHMvZnVuY3Rpb25zIHRvIGJhc2Vjb2RlYworCisyMDEwLTA5LTE4IDE3OjI4OjQ4IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNTYvMTM0XSBiYXNldmlkZW86IE1vdmUgZGVhZGxpbmUgdG8gZnJhbWUgc3RydWN0dXJlCisKKzIwMTAtMDgtMTMgMTQ6MzQ6MjEgKzAyMDAgIFBoaWxpcCBKw6RnZW5zdGVkdCA8cGhpbGlwakBvcGVyYS5jb20+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDU1LzEzNF0gdnA4ZGVjOiBTZXQgR3N0QmFzZVZpZGVvRGVjb2Rlcjo6cGFja2V0aXplZCB0byBUUlVFIGFzIHNvb24gYXMgcG9zc2libGUKKwkgIFRoaXMgZml4ZXMgYW4gaW5maW5pdGUgbG9vcCBpZiBhbiBFT1MgZXZlbnQgaXMgcmVjZWl2ZWQgYmVmb3JlCisJICBHc3RCYXNlVmlkZW9EZWNvZGVyOjpzdGFydCgpIGlzIGNhbGxlZCwgZS5nLiBpbW1lZGlhdGVseSB3aGVuIHRoZQorCSAgcGFkcyBhcmUgYWN0aXZhdGVkLgorCSAgRml4ZXMgYnVnICM2MjY4MTUuCisKKzIwMTAtMDctMTAgMTY6NTI6MTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhlbmMuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNTQvMTM0XSB2cDhlbmM6IEFkZCBzdXBwb3J0IGZvciBlbmFibGluZyBhdXRvbWF0aWMgaW5zZXJ0aW9uIG9mIGFsdC1yZWYgZnJhbWVzIGJ5IHRoZSBlbmNvZGVyCisKKzIwMTAtMDctMTAgMTY6NTE6NTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA1My8xMzRdIHZwOGVuYzogRml4IGhhbmRsaW5nIG9mIGludmlzaWJsZS9hbHQgcmVmIGZyYW1lcworCisyMDEwLTA3LTAzIDE3OjQ3OjI5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmg6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhlbmMuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNTIvMTM0XSB2cDg6IEFkZCBpbml0aWFsIGRvY3VtZW50YXRpb24sIGJhc2VkIG9uIHRoZSB0aGVvcmFkZWMvdGhlb3JhZW5jIGRvY3VtZW50YXRpb24KKworMjAxMC0wNy0wMyAxNzozNDo1OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvTWFrZWZpbGUuYW06CisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhkZWMuaDoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5oOgorCSogZXh0L3ZwOC9wbHVnaW4uYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNTEvMTM0XSB2cDg6IE1vdmUgc3RydWN0dXJlIGRlZmluaXRpb25zLCBldGMgdG8gcHVibGljIGhlYWRlciBmaWxlcyBmb3IgZ3RrLWRvYworCisyMDEwLTA2LTEyIDA5OjAyOjI5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNTAvMTM0XSB2cDhlbmM6IEltcGxlbWVudCBtdWx0aXBhc3MgZW5jb2RpbmcKKwkgIEZpeGVzIGJ1ZyAjNjIxMzQ4LgorCisyMDEwLTA2LTE0IDE1OjU2OjI0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNDkvMTM0XSB2cDhlbmM6IFNldCBWUDhFX1NFVF9DUFVVU0VEIHRvIDAKKwkgIFRoaXMgc2V0dGluZyBjb250cm9scyBob3cgbXVjaCBDUFUgY2FuIGJlIHVzZWQgYnkgdGhlIGVuY29kZXIsIHNwZWNpZmllZAorCSAgaW4gZnJhY3Rpb25zIG9mIDE2LiBOZWdhdGl2ZSB2YWx1ZXMgbWVhbiBzdHJpY3QgZW5mb3JjZW1lbnQgb2YgdGhpcworCSAgd2hpbGUgcG9zaXRpdmUgdmFsdWVzIGFyZSBhZGFwdGl2ZS4KKwkgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIC00LCB3aGljaCBtZWFucyB0aGF0IHdlJ3JlIG5vdCBydW5uaW5nIGFzIGZhc3QKKwkgIGFzIHBvc3NpYmxlIGFuZCBwcm9iYWJseSBhcmUgd2FzdGluZyBzb21lIHF1YWxpdHkuIDAgaXMgdGhlIHJlY29tbWVuZGVkCisJICBkZWZhdWx0IGJ5IGxpYnZweCB1cHN0cmVhbS4KKworMjAxMC0wNi0xNCAxNTo1MTozMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDQ4LzEzNF0gdnA4ZW5jOiBVc2UgVlBYIGRlZmluZXMgZm9yIFJFQUxUSU1FLCBHT09EL0JFU1QgcXVhbGl0eSBkZWFkbGluZXMgaW5zdGVhZCBvZiBvdXIgb3duCisJICBUaGVzZSBhcmUgdGhlIHZhbHVlcyB1c2VkIGZvciB0aGUgc3BlZWQgcHJvcGVydHkuCisKKzIwMTAtMDYtMDMgMTA6NDk6NDAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA0Ny8xMzRdIHZwOGVuYzogZml4IHByaW50ZiBmb3JtYXQgd2FybmluZyBpbiBsb2cgbWVzc2FnZQorCSAgZ3N0dnA4ZW5jLmM6NTY0OiBlcnJvcjogZm9ybWF0IOKAmCVk4oCZIGV4cGVjdHMgdHlwZSDigJhpbnTigJksIGJ1dCBhcmd1bWVudCA4IGhhcyB0eXBlIOKAmHNpemVfdOKAmQorCSAgZ3N0dnA4ZW5jLmM6NzQ0OiBlcnJvcjogZm9ybWF0IOKAmCVk4oCZIGV4cGVjdHMgdHlwZSDigJhpbnTigJksIGJ1dCBhcmd1bWVudCA4IGhhcyB0eXBlIOKAmHNpemVfdOKAmQorCisyMDA5LTA3LTAzIDE2OjA4OjM4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9NYWtlZmlsZS5hbToKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNDYvMTM0XSBiYXNldmlkZW8sIHZwODogZ3VhcmQgdW5zdGFibGUgQVBJIHdpdGggR1NUX1VTRV9VTlNUQUJMRV9BUEkKKwkgIEFkZCBzb21lIGd1YXJkcyBhbmQgZmF0IHdhcm5pbmdzIHRvIHRoZSBoZWFkZXIgZmlsZXMgd2l0aCBzdGlsbCB1bnN0YWJsZQorCSAgQVBJLCBzbyBwZW9wbGUgd2hvIGp1c3QgbG9vayBhdCB0aGUgaW5zdGFsbGVkIGhlYWRlcnMga25vdyB0aGF0IGl0CisJICBhY3R1YWxseSBpcyB1bnN0YWJsZSBBUEkuCisJICBNZXJnaW5nIHByZXZpb3VzIGNvbW1pdCBpbnRvIGN1cnJlbnQgY29kZWJhc2UuCisKKzIwMTAtMDYtMDEgMTU6NTQ6NTEgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvdnA4L01ha2VmaWxlLmFtOgorCSogZXh0L3ZwOC9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvY29kZWMuYzoKKwkqIGV4dC92cDgvZ3N0L3ZpZGVvL2dzdGJhc2V2aWRlb2NvZGVjLmg6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9kZWNvZGVyLmM6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9kZWNvZGVyLmg6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9lbmNvZGVyLmM6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9lbmNvZGVyLmg6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9wYXJzZS5jOgorCSogZXh0L3ZwOC9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvcGFyc2UuaDoKKwkqIGV4dC92cDgvZ3N0L3ZpZGVvL2dzdGJhc2V2aWRlb3V0aWxzLmM6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW91dGlscy5oOgorCSogZXh0L3ZwOC9nc3QvdmlkZW8vZ3N0dmlkZW9jb21wYXQuYzoKKwkqIGV4dC92cDgvZ3N0L3ZpZGVvL2dzdHZpZGVvY29tcGF0Lmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMDQ1LzEzNF0gYmFzZXZpZGVvOiBNb3ZlIGJhc2UgdmlkZW8gZnJvbSB2cDggdG8gZ3N0LWxpYnMKKworMjAxMC0wNS0yNiAwNjo1MjoxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZwOC9nc3R2cDh1dGlscy5oOgorCSAgW01PVkVEIEZST00gQkFEIDA0NC8xMzRdIHZwODogVXNlIFZQWF9QTEFORV8qIGluc3RlYWQgb2YgUExBTkVfKgorCisyMDEwLTA1LTI0IDExOjA0OjAyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDh1dGlscy5oOgorCSAgW01PVkVEIEZST00gQkFEIDA0My8xMzRdIHZwODogQWRkIGNvbXBhdGlsaWJpdHkgZGVmaW5lcyB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgbGlidnB4IHRvbworCisyMDEwLTA1LTIzIDA5OjI4OjEzICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA0Mi8xMzRdIHZwOGRlYzogcy9JTUdfRk1UX0k0MjAvVlBYX0lNR19GTVRfSTQyMC8KKwkgIFRoaXMgY29ycmVzcG9uZHMgdG8gdXBzdHJlYW0gbGlidnB4IGNvbW1pdCA2Y2Q0YTEwZTE2NzIwM2QxZGViNzlhYmY2MGVlNzI1OTllOTc4OTFiCisKKzIwMTAtMDUtMjIgMTI6NTU6NDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA0MS8xMzRdIHZwOGVuYzogQWxsb3cgYSBtYXhpbXVtIGtleWZyYW1lIGRpc3RhbmNlIG9mIDAsIGkuZS4gYWxsIGZyYW1lcyBhcmUga2V5ZnJhbWVzCisKKzIwMTAtMDUtMjIgMDg6NDU6MzUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDA0MC8xMzRdIHZwOGRlYzogU2V0IGRlY29kZXIgZGVhZGxpbmUgZnJvbSB0aGUgUW9TIGluZm9ybWF0aW9uCisKKzIwMTAtMDUtMjggMTY6MzU6MTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAzOS8xMzRdIHZwOGVuYzogTW92ZSBkZWJ1ZyBvdXRwdXQgb25lIGxpbmUgYWJvdmUgd2hlcmUgdGhlIHBhY2tldCBpcyBzdGlsbCB2YWxpZAorCisyMDEwLTA1LTI4IDE1OjUzOjMwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMzgvMTM0XSB2cDhlbmM6IENvcnJlY3RseSBpZ25vcmUgbm9uLWZyYW1lIHBhY2tldHMgZnJvbSB0aGUgZW5jb2RlcgorCSAgRml4ZXMgYnVnICM2MTk5MTYuCisKKzIwMTAtMDUtMjIgMDc6NDQ6MjcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9kZWNvZGVyLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDM3LzEzNF0gYmFzZXZpZGVvZGVjb2RlcjogVGFrZSB0aGUgZnJhbWUgZHVyYXRpb24gaW50byBhY2NvdW50IHdoZW4gY2FsY3VsYXRpbmcgdGhlIGVhcmxpZXN0IHRpbWUKKwkgIFRoaXMgZm9ybXVsYSBpcyB1c2VkIGluIG1hbnkgb3RoZXIgZWxlbWVudHMgdG9vLgorCSAgRml4ZXMgYnVnICM2MTkzMTguCisKKzIwMTAtMDUtMjIgMDc6MzU6MDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9kZWNvZGVyLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDM2LzEzNF0gYmFzZXZpZGVvZGVjb2RlcjogUmVzZXQgUW9TIHZhbHVlcyB3aGVuIG5lY2Vzc2FyeQorCisyMDEwLTA1LTIyIDA5OjM1OjI0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMzUvMTM0XSB2cDhlbmM6IFVzZSBHU1RfVklERU9fQ0FQU19ZVVYoSTQyMCkgaW5zdGVhZCBvZiBoYW5kd3JpdHRlbiBJNDIwIGNhcHMgZm9yIHRoZSBwYWQgdGVtcGxhdGUKKwkgIEZpeGVzIGJ1ZyAjNjE5MzQ0LgorCisyMDEwLTA1LTIxIDIwOjUzOjM2ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9kZWNvZGVyLmM6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9kZWNvZGVyLmg6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW91dGlscy5oOgorCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMzQvMTM0XSB2cDhkZWM6IGRyb3AgbGF0ZSBmcmFtZXMgYWZ0ZXIgZGVjb2RpbmcgdGhlbQorCSAgVGhpcyBzYXZlcyBhIG1lbWNweSwgd2hpY2ggaXMgYWx3YXlzIHNvbWV0aGluZy4KKworMjAxMC0wNS0yMSAyMToyODoyOSArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMzMvMTM0XSB2cDhlbmM6IHRocmVhZHMgcHJvcGVydHkKKwkgIEluY3JlYXNpbmcgZnJvbSAxIHRvIDIgdGhyZWFkcyBvbiBhbiBUaGlua3BhZCBYNjBzIGRlY3JlYXNlZCBlbmNvZGUgdGltZQorCSAgaW4gYSB0ZXN0IGZyb20gfjI0IHMgdG8gfjE5IHMsIHNvIHRoaXMgaXMgcXVpdGUgdXNlZnVsLgorCSAgSWRlYWxseSB3ZSBzaG91bGQgbGV0IDAgYmUgdGhlIGRlZmF1bHQgYW5kIGF1dG9tYXRpY2FsbHkgbWF0Y2ggdGhlIG51bWJlcgorCSAgb2YgQ1BVIGNvcmVzIChvciBzb21ldGhpbmcpLgorCisyMDEwLTA1LTIxIDE1OjE3OjQ2ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAzMi8xMzRdIHZwOGVuYzogYWRkIG1vZGUgcHJvcGVydHkgdG8gc3dpdGNoIGJldHdlZW4gQ0JSL1ZCUgorCSAgQWx3YXlzIHVzaW5nIENCUiB3aGVuIGJpdHJhdGUgaXMgdXNlZCBpc24ndCB0aGF0IGdyZWF0LCBWQlIgbW9kZQorCSAgY2FuIHByb2R1Y2UgbWVhbmluZ2Z1bCByZXN1bHRzIHRvby4KKworMjAxMC0wNS0yMSAxMDo1NDo1NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDMxLzEzNF0gdnA4ZGVjOiBPbmx5IGVuYWJsZSBwb3N0cHJvY2Vzc2luZyBpZiB0aGUgZGVjb2RlciBzdXBwb3J0cyBpdAorCisyMDEwLTA1LTIxIDA4OjIzOjU4ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBleHQvdnA4L3BsdWdpbi5jOgorCSAgW01PVkVEIEZST00gQkFEIDAzMC8xMzRdIHZwODogdHlwbzogcy9IQVZFX1ZQOF9ERUNPREVSL0hBVkVfVlA4X0VOQ09ERVIvCisJICBGaXh1cCBmb3IgYnVnICM2MTkxNzIuCisKKzIwMTAtMDUtMjEgMDg6MTM6MDYgKzAyMDAgIFBoaWxpcCBKw6RnZW5zdGVkdCA8cGhpbGlwakBvcGVyYS5jb20+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAyOS8xMzRdIHZwODogbW92ZSAjaWZkZWYgSEFWRV9WUDhfRU5DT0RFUi9ERUNPREVSCisJICBPdGhlcndpc2Ugd2UnbGwgdHJ5IGluY2x1ZGluZyBlLmcuIDx2cHgvdnA4Y3guaD4gd2hpY2ggZG9lc24ndCBleGlzdC4KKworMjAxMC0wNS0yMCAyMDowNjowOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDI4LzEzNF0gdnA4ZW5jOiBXcml0ZSBHU3RyZWFtZXIgZWxlbWVudCBhbmQgdmVyc2lvbiBpbiB0aGUgdm9yYmlzY29tbWVudCB2ZW5kb3Igc3RyaW5nCisKKzIwMTAtMDUtMjAgMTY6NDk6MDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkqIGV4dC92cDgvcGx1Z2luLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDI3LzEzNF0gdnA4OiBPbmx5IGVuYWJsZSB0aGUgZW5jb2RlciBvciBkZWNvZGVyIGlmIGl0J3MgYXZhaWxhYmxlIGluIGxpYnZweAorCSAgRml4ZXMgYnVnICM2MTkxNzIuCisKKzIwMTAtMDUtMjAgMTA6MTk6NTQgKzAyMDAgIFBoaWxpcCBKw6RnZW5zdGVkdCA8cGhpbGlwakBvcGVyYS5jb20+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZwOC9wbHVnaW4uYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMjYvMTM0XSB2cDg6IGV4bGN1ZGUgZGVjL2VuYyBiYXNlZCBvbiBDT05GSUdfVlA4X0RFQ09ERVIvRU5DT0RFUgorCSAgVGhpcyBtYXkgbm90IGJlIHZlcnkgYXV0b3Rvb2xpc2gsIGJ1dCB3b3JrcyB3aXRoIGxpYnZweCBpbiB0aGUgc3RhdGUKKwkgIHRoYXQgbGlidnB4IGlzIGFjdHVhbGx5IGluLiBNb3ZlZCB0aGUgZGVidWcgaW5pdCB0byB0aGUgZWxlbWVudHMKKwkgIHRoZW1zZWx2ZXMgdG8gbWluaW1pemUgYW1vdW50IG9mICNpZmRlZnMKKworMjAxMC0wNS0yMCAwOToyNDo1MyArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMjUvMTM0XSB2cDhlbmM6IExpbWl0IG1heC1sYXRlbmN5IHRvIDI1IHRvIG1hdGNoIGxpYnZweAorCSAgRnJvbSBsaWJ2cHgvdnA4L2VuY29kZXIvb255eF9pbnQuaDoKKwkgICNkZWZpbmUgTUFYX0xBR19CVUZGRVJTIChDT05GSUdfUkVBTFRJTUVfT05MWT8gMSA6IDI1KQorCSAgV2hpbGUgd2UgZG9uJ3QgbmVlZCB0byBiZSB0aWVkIHRvIHdoYXQgbGlidnB4IGRvZXMgaW50ZXJuYWxseSwgaXQKKwkgIGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBwcmV0ZW5kIHRvIHN1cHBvcnQgbG9uZ2VyIGZyYW1lIGxhZ3MgdGhhbiBhcmUKKwkgIGFjdHVhbGx5IHBvc3NpYmxlLgorCisyMDEwLTA1LTIwIDA5OjU2OjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnA4L2dzdHZwOHV0aWxzLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDI0LzEzNF0gdnA4OiBVbmRlZiBIQVZFX0NPTkZJR19IIGJlZm9yZSBpbmNsdWRpbmcgbGlidnB4IGhlYWRlcnMKKwkgIEEgcHVibGljIGxpYnZweCBoZWFkZXIgaW5jbHVkZXMgcHJpdmF0ZSBoZWFkZXJzIGlmIHRoaXMgaXMKKwkgIGRlZmluZWQsIGNhdXNpbmcgY29tcGlsYXRpb24gZmFpbHVyZXMgYmVjYXVzZSB0aGUgcHJpdmF0ZSBoZWFkZXJzCisJICBhcmUgbm90IGluc3RhbGxlZCBvZiBjb3Vyc2UuCisKKzIwMTAtMDUtMjAgMDg6NTM6MTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAyMy8xMzRdIHZwOGVuYzogU29tZSBtb3JlIG1pbm9yIGFkanVzdG1lbnRzIGZvciB0aGUgT2dnIG1hcHBpbmcKKworMjAxMC0wNS0xOSAyMzowMjoxOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDIyLzEzNF0gdnA4ZGVjOiBGaXggbWVtb3J5IGxlYWsKKworMjAxMC0wNS0xOSAyMTozNDo0MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDIxLzEzNF0gdnA4ZW5jOiBBZGp1c3QgT2dnIG1hcHBpbmcgZm9yIHRoZSBjaGFuZ2VzCisKKzIwMTAtMDUtMTkgMTg6MTI6MTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAyMC8xMzRdIHZwOGRlYzogQWRkIHByb3BlcnRpZXMgdG8gY29udHJvbCB0aGUgVlA4IGRlY29kZXIgcG9zdCBwcm9jZXNzaW5nIGZlYXR1cmUKKwkgIFRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBmb3Igbm93LgorCisyMDEwLTA1LTE5IDE3OjE2OjU0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMTkvMTM0XSB2cDhlbmM6IFJlbmFtZSBrZXlmcmFtZS1pbnRlcnZhbCB0byBtYXgta2V5ZnJhbWUtZGlzdGFuY2UKKwkgIEFuZCB1c2UgZGVmYXVsdCBzZXR0aW5ncyBmb3IgYnVmZmVyIHNpemVzIHVudGlsIHdlIGV4cG9zZSB0aGlzCisJICBzb21laG93LgorCisyMDEwLTA1LTE5IDE3OjEzOjE3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9NYWtlZmlsZS5hbToKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSogZXh0L3ZwOC9nc3R2cDh1dGlscy5jOgorCSogZXh0L3ZwOC9nc3R2cDh1dGlscy5oOgorCSAgW01PVkVEIEZST00gQkFEIDAxOC8xMzRdIHZwODogSW1wcm92ZSBlcnJvciBoYW5kbGluZyBhbmQgZGVidWcgb3V0cHV0CisKKzIwMTAtMDUtMTkgMTQ6NDY6NDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMTcvMTM0XSB2cDg6IFVzZSBjb3JyZWN0IHN0cmlkZXMgYW5kIHBsYW5lIG9mZnNldHMgZm9yIEdTdHJlYW1lcgorCisyMDEwLTA1LTE4IDE0OjQ3OjU0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhlbmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMTYvMTM0XSB2cDhlbmM6IEltcGxlbWVudCBHc3RUYWdTZXR0ZXIgaW50ZXJmYWNlCisKKzIwMTAtMDUtMTggMTQ6MzM6NDkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAxNS8xMzRdIHZwOGVuYzogRml4IHNldHRpbmcgb2YgdGhlIGtleWZyYW1lIGZsYWcgb24gZW5jb2RlZCBmcmFtZXMKKworMjAxMC0wNS0xOCAxNDozMDoxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDE0LzEzNF0gdnA4ZW5jOiBQb3N0IGFuIGVycm9yIG1lc3NhZ2Ugb24gdGhlIGJ1cyBpZiBlbmNvZGVyIGluaXRpYWxpemF0aW9uIGZhaWxzCisKKzIwMTAtMDUtMTggMTQ6Mjg6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAxMy8xMzRdIHZwOGRlYzogRml4IG1lbW9yeSBsZWFrcyBhbmQgZmFpbCBpZiBpbml0aWFsaXppbmcgdGhlIGRlY29kZXIgZmFpbHMKKworMjAxMC0wNS0xOCAwMjo0NDo1NCAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDEyLzEzNF0gdnA4ZW5jOiBTZXQgdGltZWJhc2UKKwkgIEFsc28gbWlzYyBjbGVhbnVwLgorCisyMDEwLTA1LTE2IDEwOjM2OjEyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMTEvMTM0XSB2cDhkZWM6IEZpeCBkZWNvZGluZyBvZiBpbnZpc2libGUgZnJhbWVzCisKKzIwMTAtMDUtMTQgMTQ6MjY6MzQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAxMC8xMzRdIHZwOGVuYzogVXBkYXRlIHRoZSBsYXRlbmN5IHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBlbmNvZGVyCisKKzIwMTAtMDUtMTQgMTQ6MDI6NTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAwOS8xMzRdIHZwOGRlYzogQ29ycmVjdGx5IGluaXRpYWxpemUgc3RyZWFtIGluZm8gYmVmb3JlIHBlZWtpbmcgYXQgdGhlIHN0cmVhbQorCSAgT3RoZXJ3aXNlIHBlZWtpbmcgd2lsbCBmYWlsIGFuZCB3ZSdsbCBnZXQgaW52YWxpZCB2YWx1ZXMKKworMjAxMC0wNS0xNCAxMTowMToyOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZGVjLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDA4LzEzNF0gdnA4ZGVjOiBNYWtlIHN1cmUgdG8gcGFzcyBhIGtleWZyYW1lIGFzIGZpcnN0IGZyYW1lIHRvIHRoZSBkZWNvZGVyLCBjb3B5IG91dHB1dCBmcmFtZXMgb25seSBvbmNlIGFuZCByZXF1aXJlIHdpZHRoL2hlaWdodC9ldGMgb24gdGhlIGlucHV0IGNhcHMKKworMjAxMC0wNS0xNCAxMDozMDoxOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDA3LzEzNF0gdnA4ZW5jOiBBZGQgc3VwcG9ydCBmb3IgaW52aXNpYmxlIGZyYW1lcyBhbmQgdGhlIE9nZyBtYXBwaW5nCisKKzIwMTAtMDUtMTQgMDE6MTQ6NDYgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvdnA4L2dzdHZwOGRlYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAwNi8xMzRdIHZwOGRlYzogRml4IHJlc2V0IGFmdGVyIHNlZWtpbmcKKwkgIEFsc28gcmVtb3ZlIHNvbWUgdW51c2VkIGNvZGUuCisKKzIwMTAtMDUtMTMgMjE6MTk6MzIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdnA4L2dzdHZwOGVuYy5jOgorCSAgW01PVkVEIEZST00gQkFEIDAwNS8xMzRdIHZwOGVuYzogU2V0IGZyYW1lIG51bWJlcnMgYXMgYnVmZmVyIG9mZnNldHMKKworMjAxMC0wNS0xMyAyMToxODowOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDA0LzEzNF0gdnA4ZW5jOiBBbHdheXMgZ2V0IGFzIG1hbnkgZnJhbWVzIGFzIHBvc3NpYmxlIGZyb20gdGhlIGVuY29kZXIKKworMjAxMC0wNS0xMyAyMTowODowMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDAzLzEzNF0gdnA4ZW5jOiBGaWxsIHRoZSBvbGRlc3QgcGVuZGluZyBmcmFtZSBpbnN0ZWFkIG9mIHRoZSBuZXdlc3QKKworMjAxMC0wNS0xMyAyMDoyMDozMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDAyLzEzNF0gdnA4ZW5jOiBDb3JyZWN0bHkgc2V0IGRlbHRhIHVuaXQgZmxhZyBmb3Igbm9uLWtleWZyYW1lcworCisyMDEwLTA1LTEzIDAxOjA0OjA0IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3ZwOC9NYWtlZmlsZS5hbToKKwkqIGV4dC92cDgvZ3N0L3ZpZGVvL2dzdGJhc2V2aWRlb2NvZGVjLmM6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW9jb2RlYy5oOgorCSogZXh0L3ZwOC9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvZGVjb2Rlci5jOgorCSogZXh0L3ZwOC9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvZGVjb2Rlci5oOgorCSogZXh0L3ZwOC9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvZW5jb2Rlci5jOgorCSogZXh0L3ZwOC9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvZW5jb2Rlci5oOgorCSogZXh0L3ZwOC9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvcGFyc2UuYzoKKwkqIGV4dC92cDgvZ3N0L3ZpZGVvL2dzdGJhc2V2aWRlb3BhcnNlLmg6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3RiYXNldmlkZW91dGlscy5jOgorCSogZXh0L3ZwOC9nc3QvdmlkZW8vZ3N0YmFzZXZpZGVvdXRpbHMuaDoKKwkqIGV4dC92cDgvZ3N0L3ZpZGVvL2dzdHZpZGVvY29tcGF0LmM6CisJKiBleHQvdnA4L2dzdC92aWRlby9nc3R2aWRlb2NvbXBhdC5oOgorCSogZXh0L3ZwOC9nc3R2cDhkZWMuYzoKKwkqIGV4dC92cDgvZ3N0dnA4ZW5jLmM6CisJKiBleHQvdnA4L3BsdWdpbi5jOgorCSAgW01PVkVEIEZST00gQkFEIDAwMS8xMzRdIHZwODogQWRkIGVuY29kZXIvZGVjb2RlcgorCisyMDEyLTA5LTE1IDIyOjE2OjUyICswMjAwICBDaHJpc3RpYW4gRnJlZHJpayBLYWxhZ2VyIFNjaGFsbGVyIDx1cmFldXNAbGludXhyaXNpbi5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIFVwZGF0ZSBzcGVjIGZpbGUgd2l0aCBGMTggbmFtZSBjaGFuZ2UgYW5kIGFkZCBkZWludGVybGFjZXIKKworMjAxMi0wOS0xNSAxOTowNjowNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc3JjLmM6CisJICB1c2UgZ3N0X2VsZW1lbnRfZmFjdG9yeV9nZXRfbWV0YWRhdGEgdG8gcmVwbGFjZSBvYnNvbGV0ZSBBUEkKKworMjAxMi0wOS0xNCAxNzo1NToxNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkgIHJlcGxhY2UgX2dldF9jYXBzX3JlZmZlZCB3aXRoIF9nZXRfY2FwcworCisyMDEyLTA5LTE0IDE3OjA4OjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJICByZXBsYWNlIGdzdF9lbGVtZW50X2NsYXNzX3NldF9kZXRhaWxzX3NpbXBsZSB3aXRoIGdzdF9lbGVtZW50X2NsYXNzX3NldF9tZXRhZGF0YQorCisyMDEyLTA5LTE0IDE3OjA3OjI2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgcmVwbGFjZSBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUgd2l0aCBnc3RfZWxlbWVudF9jbGFzc19zZXRfbWV0YWRhdGEKKworMjAxMi0wOS0xNCAxMzozMDozNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzoKKwkqIGdzdC9ydHAvUkVBRE1FOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtSDI2M3AtQVRTLVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLVZUUy1IMjYzcC5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItZGVjb2RlYmluLUgyNjNwLUFNUi5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjYzcC1hbHNhc3JjLUFNUi5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjY0LWFsc2FzcmMtUENNQS5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3NoYXBld2lwZS9zaGFwZXdpcGUtZXhhbXBsZS5jOgorCSogdGVzdHMvZXhhbXBsZXMvdjRsMi9jYW1jdHJsLmM6CisJKiB0ZXN0cy9pY2xlcy9nZGtwaXhidWZzaW5rLXRlc3QuYzoKKwkgIGZpeCBtb3JlIGNhcHMKKworMjAxMi0wOS0xNCAwMjo1Nzo0NCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAwLjExLjk0ID09PQorCisyMDEyLTA5LTE0IDAyOjQ4OjQzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTEuOTQKKworMjAxMi0wOS0xNCAwMTo1MDo0NCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBwbzogdXBkYXRlIHRyYW5zbGF0aW9ucworCisyMDEyLTA5LTE0IDAxOjQ2OjE0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkgIGRvY3M6IHVwZGF0ZSBkb2NzCisKKzIwMTItMDktMTQgMDA6NDc6MzggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tlbmMuYzoKKwkgIHRlc3RzOiBwdXNoIHN0cmVhbS1zdGFydCBhbmQgc2VnbWVudCBldmVudHMgaW4gd2F2cGFja2VuYyB0ZXN0CisKKzIwMTItMDktMTMgMTA6NTY6MjcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgIHY0bDI6IHJlbW92ZSB1bnVzZWQgcHJvcGVydGllcworCisyMDEyLTA5LTEzIDEwOjE1OjU0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBkaXNhYmxlIHJlY29uZmlndXJlCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MzkwMgorCisyMDEyLTA5LTEwIDIyOjA5OjU5IC0wNzAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IERvbid0IHRyZWF0IGV2ZXJ5IGN1c3RvbS1kb3duc3RyZWFtIGV2ZW50IGFzIEVPUworCSAgRG9uJ3QgZmFsbCB0aHJvdWdoIHRvIHRoZSBFT1MgaGFuZGxpbmcgYWZ0ZXIgcmVjZWl2aW5nIGEKKwkgIGN1c3RvbS1kb3duc3RyZWFtIGV2ZW50LgorCisyMDEyLTA5LTEyIDIxOjA1OjQ0ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIGNvbGxlY3RwYWRzOiByZW1vdmUgZ3N0X2NvbGxlY3RfcGFkc19hZGRfcGFkX2Z1bGwKKwkgIFJlbmFtZSBnc3RfY29sbGVjdF9wYWRzX2FkZF9wYWRfZnVsbCgpIHRvIGdzdF9jb2xsZWN0X3BhZHNfYWRkX3BhZCgpIGFuZCBmaXggYWxsCisJICBpbnZvY2F0aW9ucy4KKworMjAxMi0wOS0xMiAxNzoxNDo0NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICB1ZHA6IGFkZCBpbmNsdWRlIGZvciBJUFBST1RPXyoKKworMjAxMi0wOS0xMiAxNjozOTowOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICB1ZHA6IHByb3Blcmx5IG1hdGNoIGJyYWNlcyBhbmQgY3BwIGRpcmVjdGl2ZXMKKwkgIEZpeGVzIGNvbXBpbGF0aW9uIHdoZXJlIElQVjZfVENMQVNTIG5vdCBkZWZpbmVkLgorCisyMDEyLTA5LTEyIDE0OjQyOjA3ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkgIHNoYXBld2lwZTogVXNlIGRlZmF1bHQgcXVlcnkgaGFuZGxlciB3aGVyZSBuZWVkZWQKKwkgIEFuZCBjbGVhbiB1cCBnZXRfY2FwcyBjb2RlIHdoaWxlIEknbSBhdCBpdAorCisyMDEyLTA5LTEyIDEzOjI4OjA3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBpbXByb3ZlIGZyYW1lcmF0ZSB0cmFuc2Zvcm0KKwkgIEhhbmRsZSBHX01BWElOVCBpbiB0aGUgZnJhbWVyYXRlcyBiZXR0ZXIuIElmIHdlIGNhbm5vdCBkb3VibGUgb3IgZGl2aWRlIHRoZQorCSAgZnJhbWVyYXRlLCBjbGFtcCB0byB0aGUgc21hbGxlc3QvbGFyZ2VzdCBwb3NzaWJsZSB2YWx1ZSB3ZSBjYW4gZXhwcmVzcyBpbnN0ZWFkCisJICBvZiBmYWlsaW5nLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Mzg2MQorCisyMDEyLTA5LTEyIDEzOjE3OjU0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBzbWFsbCBjbGVhbnVwCisKKzIwMTItMDktMDcgMTc6MjA6NTcgLTA0MDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kLmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5oOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXIyOiBBZGRpbmcgbnYxMiBhbmQgbnYyMSBzdXBwb3J0CisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgzODQxCisKKzIwMTItMDktMTIgMTA6MTg6NTMgKzAyMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEByZGlvLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZm91cmNjLmg6CisJICBxdGRlbXV4OiBhZGQgc3VwcG9ydCBmb3IgcHJvcmVzCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgzODM5CisKKzIwMTItMDktMTIgMDA6MTY6MzEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzoKKwkgIHRlc3RzOiBmaXggbW9zdCBvZiB0aGUgcmdhbmFseXNpcyB1bml0IHRlc3RzCisJICBCZWZvcmUgdGhlIGVsZW1lbnQgd291bGQgcG9zdCBtZXNzYWdlcyBvbiB0aGUgYnVzIGl0c2VsZiwgbm93CisJICB0aGUgc2lua3MgZG8gdGhhdCBiYXNlZCBvbiB0aGUgdGFnIGV2ZW50cyB0aGV5IHJlY2VpdmUuIEJ1dAorCSAgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBwcm9wZXIgc2luayBlbGVtZW50cyBpbiB0aGVzZSB1bml0IHRlc3RzLAorCSAgYnV0IGp1c3QgZGFuZ2xpbmcgcGFkcywgd2UgaGF2ZSB0byBwb3N0IHRoZSB0YWcgbWVzc2FnZXMgdGhlCisJICB0ZXN0IGNoZWNrcyBmb3Igb3Vyc2VsdmVzLgorCSAgRG93biBmcm9tIDUyLzU1IGZhaWxpbmcgdG8gNy81MiBmYWlsaW5nLgorCisyMDEyLTA5LTExIDE3OjM2OjUxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIGV4dCwgZ3N0OiBvbmx5IGFjdGl2YXRlIGluIHB1bGwgbW9kZSBpZiB1cHN0cmVhbSBpcyBzZWVrYWJsZQorCisyMDEyLTA5LTExIDE1OjM4OjIzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyOiBkaXNhYmxlIHJlbmVnb3RpYXRpb24KKwkgIFdlIGNhbid0IHlldCB3YWl0IGZvciB0aGUgYnVmZmVycG9vbCB0byBEUkFJTiBiZWZvcmUgc3RhcnRpbmcgcmVuZWdvdGlhdGlvbiBzbworCSAgZGlzYWJsZSBpdCBmb3Igbm93LgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Mjc3MAorCisyMDEyLTA5LTExIDEyOjQ4OjM5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJICB0ZXN0czogcnRwYmluOiBwb3J0IHRvIHRoZSBuZXcgR0xpYiB0aHJlYWQgQVBJCisKKzIwMTItMDktMTEgMTI6MzY6NTYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmg6CisJICBkaXJlY3Rzb3VuZHNpbms6IHBvcnQgdG8gdGhlIG5ldyBHTGliIHRocmVhZCBBUEkKKworMjAxMi0wOS0xMSAxMTo1OTo1NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBkb24ndCByZXNldCBzZWdtZW50CisJICBEb24ndCByZXNldCB0aGUgc2VnbWVudCBiZWNhdXNlIHdlIG5lZWQgdGhlIHZhbHVlcyBmb3IgYWNjdW11bGF0aW9uLiB0aGUgc2VnbWVudAorCSAgaXMgcmVzZXQgYXQgc3RhcnQgYW5kIGFmdGVyIGEgZmx1c2hpbmcgc2Vlay4gRml4ZXMgc29tZSBwcm9ibGVtcyB3aXRoIGZpbGVzIHdpdGgKKwkgIHF1aWNrdGltZSBzZWdtZW50cy4KKworMjAxMi0wOS0xMCAxNzoxNDozNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzZGVtdXguYzoKKwkgIHRlc3RzOiBmaXggaWQzZGVtdXggdGVzdAorCisyMDEyLTA5LTEwIDE0OjMxOjAyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9hbWZkZWZzLmg6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSAgZ3N0OiBhZGp1c3QgY29tbWVudCBzdHlsZQorCisyMDEyLTA5LTEwIDE0OjMwOjQyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHJlbW92ZSBkZWZ1bmN0IGNvbW1lbnRlZCBjb2RlCisKKzIwMTItMDktMTAgMTM6MzU6MTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzcmM6IGNvbnNpZGVyIHN0cmVhbSBhbGl2ZSB3aGVuIG5vdCBjb25uZWN0ZWQgeWV0CisJICBXaGVuIHdlIHN0YXJ0IGFuZCByZW5lZ290aWF0ZSwgdGhlcmUgaXMgYSBtb21lbnQgd2hlcmUgdGhlIHN0cmVhbSBpcyBjcmVhdGVkIGJ1dAorCSAgbm90IHlldCBjb25uZWN0ZWQuIE1ha2Ugc3VyZSBhbGwgZnVuY3Rpb25zIGRlYWwgd2l0aCB0aGlzIHNpdHVhdGlvbiBjb3JyZWN0bHkKKwkgIGluc3RlYWQgb2YgZXJyb3Jpbmcgb3V0LgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MTI0NworCisyMDEyLTA5LTEwIDEyOjE1OjI1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBkb24ndCBmYWlsIHdoZW4gbm90IG5lZ290aWF0ZWQgeWV0CisJICBXaGVuIGdldF90aW1lIGlzIGNhbGxlZCBidXQgd2UgYXJlIG5vdCB5ZXQgbmVnb3RpYXRlZCwgcmV0dXJuIDAgaW5zdGVhZCBvZgorCSAgcG9zdGluZyBhbiBlcnJvci4gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBiYXNlIGNsYXNzIGlzIHN0aWxsIG5lZ290aWF0aW5nIHdoZW4KKwkgIG91ciBnZXRfdGltZSBpcyBjYWxsZWQuCisKKzIwMTItMDktMTAgMTE6MzI6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkqIHN5cy9vc3M0L29zczQtc291cmNlLmM6CisJICB1cGRhdGUgZm9yIGF1ZGlvIGJhc2Ugc3JjIGFwaSBjaGFuZ2UKKworMjAxMi0wOS0xMCAwMDo0Mjo1MiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgdmlkZW8veC0zaXZ4IGFuZCB2aWRlby94LXh2aWQgLT4gdmlkZW8vbXBlZyxtcGVndmVyc2lvbj00CisJICBJZiBpdCBldmVyIHR1cm5zIG91dCB0aGF0IHdlIHJlYWxseSBtdXN0IHVzZSB0aG9lIHNwZWNpZmljCisJICBmb3VyY2NzIGFuZCBub3QgdGhlIGdlbmVyaWMgb25lLCB3ZSBjYW4gc3RpbGwgYWRkIGEgZmxhdm9yCisJICBmaWVsZCB0byB0aGUgY2FwcyBsYXRlci4KKworMjAxMi0wOS0wNyAxNjoxNTo0MiArMDIwMCAgRGFuaWVsYSA8ZGFuaWVsYS5tdXp6dUBzZWxleGVsc2FnLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYXZvaWQgbGVhaworCSAgV2hlbiBzZXR1cCBmYWlscywgbWFrZSBzdXJlIHRvIGNsZWFudXAgYWZ0ZXJ3YXJkcy4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzM1MDkKKworMjAxMi0wOS0wNyAxNToyMzo0NCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkgIHJ0cGFtcmRlcGF5OiB1bm1hcCBydHAgYnVmZmVyCisJICAuLi4gdGhlcmVieSBwbHVnZ2luZyBhIG1lbWxlYWsuCisKKzIwMTItMDktMDcgMTQ6MTM6MTcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgdGVzdHM6IHJ0cC1wYXlsb2FkaW5nOiBhZGp1c3QgdG8gbW9kaWZpZWQgYnVmZmVybGlzdCBzZW1hbnRpY3MKKwkgIC4uLiBub3cgaW1wbGVtZW50ZWQgYnkgYnVmZmVyIG1lbW9yeSBibG9ja3MuCisKKzIwMTItMDktMDcgMTQ6MTE6MzkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IGF2b2lkIGNyYXNoaW5nIG9uIE5VTEwgYWNjZXNzIGluIGRlYnVnIG1lc3NhZ2UKKworMjAxMi0wOS0wNyAxNDoxMTowMiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkgIHJ0cGgyNjNwcGF5OiBwbHVnIGNhcHMgbGVhaworCisyMDEyLTA5LTA2IDE3OjA5OjIwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiByZW1vdmUgcmVkdW5kYW50IF9zZXRfYWxsb2NhdGlvbiBjYWxsCisKKzIwMTItMDktMDYgMTc6MDU6MDAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jOgorCSAgdGVzdHM6IGRlaW50ZXJsYWNlOiBkbyBub3QgbGVhayBkZWludGVybGFjZSBwYWRzCisKKzIwMTItMDktMDYgMTc6MDQ6MzkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBwbHVnIHNvbWUgbGVha3MKKworMjAxMi0wOS0wNiAxNjo0OTowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogcmV1c2UgY29yZSBmdW5jdGlvbiBmb3IgR0NECisKKzIwMTItMDktMDYgMTY6MzE6MDAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBzdXBwb3J0IGZpbHRlciBpbiBnZXRjYXBzCisKKzIwMTItMDktMDYgMTY6MzA6NDQgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBkbyBub3QgbGVhayBnZXRjYXBzIHJlc3VsdAorCisyMDEyLTA5LTA2IDE2OjIzOjI4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5oOgorCSAgZGVpbnRlcmxhY2U6IGFkZCBzdXBwb3J0IGZvciBidWZmZXJwb29sCisJICBBZGQgYnVmZmVycG9vbCBzdXBwb3J0IHRvIGF2b2lkIGEgbWVtY3B5IGluIHRoZSB2aWRlb3Npbmsgd2hlbiBhY3RpdmVseQorCSAgaW50ZXJsYWNpbmcuCisJICBSZW1vdmUgc29tZSBjb21tZW50ZWQgb2Jzb2xldGUgY29kZS4KKworMjAxMi0wOS0wNiAxMzozODo1MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogcHJveHkgYWxsb2NhdGlvbiBxdWVyeSBpbiBwYXNzdGhyb3VnaAorCSAgV2UgY2FuIGxldCB0aGUgYWxsb2NhdGlvbiBxdWVyeSBwYXNzIHdoZW4gd2UgYXJlIG9wZXJhdGluZyBpbiBwYXNzdGhyb3VnaCBtb2RlLgorCisyMDEyLTA5LTA2IDEzOjIzOjQ2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiB1c2UgZGVmYXVsdCBldmVudCBmdW5jdGlvbnMKKwkgIGluc3RlYWQgb2YgYmxpbmRseSBmb3J3YXJkaW5nIHVua25vd24gZXZlbnRzLgorCisyMDEyLTA5LTA2IDEzOjIzOjMwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBzbWFsbCBjbGVhbnVwcworCisyMDEyLTA5LTA2IDEyOjU2OjMwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBjYWxsIGRlZmF1bHQgcXVlcnkgaGFuZGxlcnMKKwkgIENhbGwgdGhlIGRlZmF1bHQgcXVlcnkgaGFuZGxlciBpbnN0ZWFkIG9mIGZvcndhcmRpbmcgdGhlIHF1ZXJ5IGJsaW5kbHkuIEZpeGVzCisJICBpc3N1ZXMgb2Ygc3RyaWRlcyBiZWNhdXNlIG9mIHByb3h5aW5nIHRoZSBhbGxvY2F0aW9uIHF1ZXJ5IHdyb25nbHkuCisKKzIwMTItMDktMDYgMTA6NDI6MjEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IHJlbW92ZSB1bnVzZWQgY29kZS4KKworMjAxMi0wOS0wNiAxMDo0MjowNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2U6IGltcHJvdmUgZGVidWcKKworMjAxMi0wOS0wNSAxMTo1MDowNSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICBkdmRlbXV4OiByZW1vdmUgb2Jzb2xldGUgdXBkYXRlIG5ld3NlZ21lbnQgaGFuZGxpbmcgY29kZQorCisyMDEyLTA5LTA0IDEyOjM1OjUzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJICB2aWRlb2JhbGFuY2U6IGF2b2lkIGRlYWRsb2NrCisJICBfdXBkYXRlX3Byb3BlcnRpZXMgdGFrZXMgdGhlIG9iamVjdCBsb2NrIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCB3aGVuIHRoZQorCSAgb2JqZWN0IGxvY2sgaXMgYWxyZWFkeSB0YWtlbi4KKworMjAxMi0wOS0wMyAxMjo0NjowMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGV4dHJhY3QgaW50ZXJsYWNlZC1uZXNzIG9mIHZpZGVvIHRyYWNrIGZyb20gaW50ZXJsYWNlLW1vZGUgZmllbGQKKwkgIGluc3RlYWQgb2YgdGhlIG9sZCBib29sZWFuICJpbnRlcmxhY2VkIiBmaWVsZC4KKworMjAxMi0wOS0wMyAwMjo1MToyNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdmltdXguYzoKKwkgIHZpZGVvL3gteHZpZCAtPiB2aWRlby9tcGVnLG1wZWd2ZXJzaW9uPTQKKworMjAxMi0wOS0wMiAwMjo1MDo1MCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIHRleHQvcGxhaW4gKyB0ZXh0L3gtcGFuZ28tbWFya3VwIC0+IHRleHQveC1yYXcKKworMjAxMi0wOS0wMiAwMTozMTo1MyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgZ3N0X21lc3NhZ2VfbmV3X2R1cmF0aW9uIC0+IGdzdF9tZXNzYWdlX25ld19kdXJhdGlvbl9jaGFuZ2VkCisKKzIwMTItMDgtMzAgMjI6MDc6MjQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHNlc3Npb246IGFsc28gc3RvcCBwcm9iYXRhdGlvbiBvbiBleGlzdGluZyBzb3VyY2VzCisJICBSZWNlaXZpbmcgYW4gUlRDUCBwYWNrZXQgc2hvdWxkIGFsc28gc3RvcCBwcm9iYXRpb24gb24gc291cmNlcyB3ZSBoYXZlIHNlZW4KKwkgIGJlZm9yZS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODMwNjUKKworMjAxMi0wOC0yMiAxNjozNjoyMSAtMDcwMCAgQWxlaXggQ29uY2hpbGxvIEZsYXF1ZSA8YWxlaXhAb2Jsb25nLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0cDogbWFrZSBydHAgcGFja2V0IHByb2JhdGlvbiBjb25maWd1cmFibGUgKGJ1ZyAjNjgyNTEyKQorCisyMDEyLTA4LTMwIDEyOjIxOjAxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5jOgorCSAgZ2RrcGl4YnVmOiBhZGp1c3QgdG8gbW9kaWZpZWQgdmlkZW8gb3ZlcmxheSBjb21wb3NpdGlvbiBBUEkKKworMjAxMi0wOC0zMCAxMTozMDowMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGZpeHVwIDAuMTEgcG9ydCBvZiBzdXNwZWN0IGZyYW1lIGNoZWNraW5nCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgyOTU5CisKKzIwMTItMDgtMjggMTg6NTY6MTkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogYXZvaWQgaW52YWxpZCBIMjY0IGJ5dGVzdHJlYW0gY29kZWNfZGF0YQorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MTM2OQorCisyMDEyLTA4LTI4IDE5OjAwOjQ0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwb3J0IHNlZ21lbnQgZXZlbnQgY3JlYXRpb24gdG8gMC4xMQorCisyMDEyLTA4LTI4IDE2OjI4OjEzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiByZWxlYXNlIGV4dHJhIGV2ZW50IHJlZiB3aGVuIHJlcGxhY2luZyBwZW5kaW5nIG5ld3NlZ21lbnQgZXZlbnQKKworMjAxMi0wNy0wMyAxNzo1MDoyNCArMDIwMCAgRGF2aWQgQ29ydm95c2llciA8ZGF2aWQuY29ydm95c2llckBvcmFuZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmM6CisJICBpc29tcDQ6IGFkZCBEQVNIIHRmZHQgYm94IHN1cHBvcnQKKwkgIE1QRUcgREFTSCBoYXMgZGVmaW5lZCBhIHNldCBvZiBuZXcgYm94ZXMgdG8gc3BlY2lmeSBkdXJhdGlvbiwgaW5kZXhlcyBhbmQKKwkgIG9mZnNldHMgb2YgSVNPQk1GRiBmcmFnbWVudHMuCisJICBUaGUgVHJhY2sgRnJhZ21lbnQgQmFzZSBNZWRpYSBEZWNvZGUgVGltZSAodGZkdCkgQm94IGNhbiBpbiBwYXJ0aWN1bGFyIGJlCisJICBpbmNsdWRlZCBpbnNpZGUgYSB0cmFmIGJveCB0byBzcGVjaWZ5IHRoZSBhYnNvbHV0ZSBkZWNvZGUgdGltZSwgbWVhc3VyZWQgb24gdGhlCisJICBtZWRpYSB0aW1lbGluZSwgb2YgdGhlIGZpcnN0IHNhbXBsZSBpbiBkZWNvZGUgb3JkZXIgaW4gdGhlIHRyYWNrIGZyYWdtZW50LgorCSAgVGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgdXNlZCBieSB0aGUgaXNvbXA0IGRlbXV4IHRvIGZpbmQgb3V0IHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mCisJICBhbiBNUDQgZnJhZ21lbnQgaW4gdGhlIHRpbWVsaW5lLgorCSAgVGhpcyBwYXRjaCBhZGRzIGNvZGUgdG8gaXNvbXA0IHRvOgorCSAgLSBwYXJzZSB0aGUgdGZkdCBib3gKKwkgIC0gYWRqdXN0IHRoZSB0aW1lL3Bvc2l0aW9uIG1lbWJlciBvZiB0aGUgbmV3IHNlZ21lbnQgc2VudCB3aGVuIHBsYXliYWNrIHN0YXJ0cworCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NzUzNQorCisyMDEyLTA4LTI2IDIyOjM5OjU1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm9yZW5kZXIuYzoKKwkqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOgorCSogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6CisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZXh0L3RhZ2xpYi9nc3RhcGV2Mm11eC5jYzoKKwkqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmJhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RwdXNoZmlsZXNyYy5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0dGFnaW5qZWN0LmM6CisJKiBnc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0b3AuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJKiBnc3QvZWZmZWN0di9nc3RyYWRpb2FjLmM6CisJKiBnc3QvZWZmZWN0di9nc3RyZXYuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJpcHBsZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c3RyZWFrLmM6CisJKiBnc3QvZWZmZWN0di9nc3R2ZXJ0aWdvLmM6CisJKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uYzoKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6CisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOgorCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSogZ3N0L2lzb21wNC9hdG9tc3JlY292ZXJ5LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LWRvYy5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL3dlYm0tbXV4LmM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmM6CisJKiBnc3QvcnRwL1JFQURNRToKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkqIHN5cy9vc3M0L29zczQtc2luay5jOgorCSogc3lzL29zczQvb3NzNC1zb3VyY2UuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwycmFkaW8uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1zaW5rLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSogdGVzdHMvZXhhbXBsZXMvY2Fpcm8vY2Fpcm9fb3ZlcmxheS5jOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC1BTVIuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLVZUUy1IMjYzcC1BVFMtUENNQS5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItVlRTLUgyNjNwLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1hbHNhc3JjLVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWRlY29kZWJpbi1IMjYzcC1BTVIuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2M3AtYWxzYXNyYy1BTVIuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2NC1hbHNhc3JjLVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2ljbGVzL2dka3BpeGJ1ZnNpbmstdGVzdC5jOgorCSogdGVzdHMvaWNsZXMvdmlkZW9jcm9wLXRlc3QuYzoKKwkgIGRvY3M6IGdzdC1sYXVuY2ggLT4gZ3N0LWxhdW5jaC0xLjAgYW5kIGZmbXBlZ2NvbG9yc3BhY2UgLT4gdmlkZW9jb252ZXJ0CisKKzIwMTItMDgtMjYgMjI6MzI6NTQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICBkb2NzOiBnc3QtbGF1bmNoLTAuMTEgLT4gZ3N0LWxhdW5jaC0xLjAKKworMjAxMi0wOC0yNiAyMjowODo1NCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IHRoZSBmaWVsZCBpbiBjYXBzIGlzICJpbnRlcmxhY2UtbW9kZSIgbm90ICJpbnRlcmxhY2UtbWV0aG9kIgorCSAgRml4IGRlaW50ZXJsYWNlIHVuaXQgdGVzdC4gTmVlZCB0byBzZXQgcmlnaHQgZmllbGQgb24gb3V0cHV0IGNhcHMuCisJICBBbHNvIHJlbW92ZSByaWdodCBmaWVsZCAobm90IG9sZCAwLjEwICJpbnRlcmxhY2VkIiBib29sZWFuIGZpZWxkKQorCSAgZnJvbSBjYXBzIGluIHVuaXQgdGVzdCBiZWZvcmUgY29tcGFyaW5nIG9sZCBhbmQgbmV3LgorCisyMDEyLTA4LTI2IDIxOjQ1OjQ0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pY3lkZW11eC5jOgorCSAgdGVzdHM6IGZpeCBpY3lkZW11eCB1bml0IHRlc3QKKwkgIFdhcyB3YWl0aW5nIGZvciBhIHRhZyBtZXNzYWdlIG9uIHRoZSBidXMsIHdoaWNoIHdvdWxkIG5ldmVyCisJICBjb21lLCBiZWNhdXNlIGVsZW1lbnRzIGRvbid0IHBvc3QgdGhvc2UgdGhlbXNlbHZlcyBhbnkgbW9yZQorCSAgYnV0IGxldCBzaW5rcyBwb3N0IHRoZW0gZnJvbSB0YWcgZXZlbnRzLiBPbmx5IHRoYXQgdGhlcmUgYXJlCisJICBubyBzaW5rcyBpbiB0aGlzIHVuaXQgdGVzdC4KKworMjAxMi0wOC0yNiAyMToyNzowMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6CisJICB0ZXN0czogZml4IHZpZGVvY3JvcCBjcm9wX3RvXzF4MSB1bml0IHRlc3QgZm9yIEdSQVk4IGZvcm1hdAorCSAgVXBkYXRlIHRhYmxlIHdpdGggcGl4ZWwgdmFsdWVzIHdpdGggdGhlIHZhbHVlIGFjdHVhbGx5IHByb2R1Y2VkCisJICBieSB2aWRlb3Rlc3RzcmMuCisKKzIwMTItMDgtMjcgMDk6MDA6NDUgKzAyMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogT25seSBwcmludCBjYXBzIGlmIHRoZXkncmUgcHJvdmlkZWQKKworMjAxMi0wOC0yNCAxOTo0MzowOCArMDEwMCAgTWljaGFlbCBSdWJpbnN0ZWluIDxtcnViaW5zdGVpbkByYWktZGV2LmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkgIHZpZGVvbWl4ZXI6IGZpeCBlbmRpYW5uZXNzIGNoZWNrIG9uIHN5c3RlbXMgd2hlcmUgbm9uLWdsaWIgZW5kaWFubmVzcyBkZWZpbmVzIGFyZSBub3Qgc2V0CisJICBPbiBXaW5kb3dzIExJVFRMRV9FTkRJQU4gd2l0aG91dCB0aGUgR18gaW4gd2FzIG5vdCBkZWZpbmVkLCAgc28gdGhlCisJICB0ZXN0IGNvbWVzIG91dCB3cm9uZy4KKworMjAxMi0wOC0yMiAxNzoyMzoyNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIHVkcHNpbms6IGRvbid0IGNyYXNoIG9uIE5VTEwgZXJyb3IKKwkgIENoZWNrIGlmIHRoZXJlIGlzIGFuIGVycm9yIGJlZm9yZSByZXRyaWV2aW5nIGl0cyBtZXNzYWdlLgorCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODI0ODEKKworMjAxMi0wOC0yMiAxMzozMDoxOSArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDY2OGFjZWUgdG8gNGY5NjJmNworCisyMDEyLTA4LTIyIDEzOjE4OjAwICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGJ1bXAgZ3RrLWRvYyByZXEgdG8gMS4xMiAobWFyLTIwMDkpCisJICBUaGlzIGFsbG93cyB1cyB0byBlLmcuIHVuY29uZGl0aW9uYWxseSB1c2UgZ3RrZG9jLXJlYmFzZS4KKworMjAxMi0wOC0yMiAxMToyMTozOCArMDIwMCAgTWFydGluIEVydHNhYXMgPG1lcnRzYXNAY2lzY28uY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IE1ha2Ugb3N4dmlkZW9zaW5rIHVzZSB0aGUgbm9uLWRlcHJlY2F0ZWQgdGhyZWFkaW5nIGFwaSBmcm9tIGdsaWIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgyNDQ2CisKKzIwMTItMDgtMTQgMTU6NDA6MzEgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBIYW5kbGUgbmVnb3RpYXRpb24gZXZlbnRzCisJICBUaGlzIG1ha2VzIHN1cmUgdGhhdCB3ZToKKwkgIGEpIERlc3Ryb3kgYW4gZXhpc3Rpbmcgc3RyZWFtIGlmIGEgbmVnb3RpYXRlKCkgcmVxdWVzdCBjb21lcyBpbjogdGhpcyBpcworCSAgcmVxdWlyZWQgd2hlbiByZWNlaXZpbmcgYSBkb3duc3RyZWFtIHJlbmVnb3RpYXRpb24gcmVxdWVzdCBhZnRlciBhCisJICBzdHJlYW0gaGFzIGJlZW4gY3JlYXRlZC4KKwkgIGIpIENyZWF0ZSBhIG5ldyBzdHJlYW0gb24gcHJlcGFyZSgpOiB0aGlzIGlzIHJlcXVpcmVkIHNpbmNlIHdlIGRvIGEKKwkgIHNldGNhcHMoKSBpbiBuZWdvdGlhdGUoKSwgd2hpY2ggY2F1c2VzIHRoZSBzdHJlYW0gdG8gYmUgZHJvcHBlZCBieSBhCisJICByaW5nYnVmZmVyIHJlbGVhc2UoKSBjYWxsICh0aGlzIGRvZXMgbm90IGhhcHBlbiBkdXJpbmcgZmlyc3QgbmVnb3RpYXRpb24KKwkgIHNpbmNlIHRoZSByZWxlYXNlIGlzIG9ubHkgZG9uZSBvbiBhIHJ1bm5pbmcgcmluZ2J1ZmZlcikuIFRoZSBzdWJzZXF1ZW50CisJICBjYWxsIHRvIHJpbmdidWZmZXIgYWNxdWlyZSgpIGZhaWxzIGJlY2F1c2UgdGhlIHN0cmVhbSB3YXMgbG9zdCBvbgorCSAgcmVsZWFzZSgpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MTI0NworCisyMDEyLTA4LTE0IDE1OjM4OjI3ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSAgcHVsc2U6IENsZWFyIHVucG9zaXRpb25lZCBmbGFnIHdoZW4gc2V0dGluZyBwb3NpdGlvbnMKKwkgIElmIGNvbnZlcnRpbmcgYSBQQSBjaGFubmVsIG1hcCB0byBnc3QgY2hhbm5lbCBwb3NpdGlvbnMgcmVzdWx0cyBpbiBhCisJICB2YWxpZCBzZXQgb2YgY2hhbm5lbCBwb3NpdGlvbnMsIHdlIGNsZWFyIHRoZSB1bnBvc2l0aW9uZWQgZmxhZyBmcm9tIHRoZQorCSAgcmluZ2J1ZmZlciBzcGVjLgorCisyMDEyLTA4LTE0IDA5OjM3OjQ1ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogUmVtb3ZlIHJlZHVuZGFudCBjaGFubmVsLW1hc2sgc2V0dGluZyBmb3Igc3RlcmVvIGNhc2UKKwkgIFRoZSBnc3RhdWRpbyBoZWxwZXIgbGlicmFyaWVzIGFscmVhZHkgdGFrZSBjYXJlIG9mIHRoaXMgY2FzZSBmb3IgdXMuCisKKzIwMTItMDgtMTQgMDk6MzY6MzAgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBEb24ndCB1c2UgbWVtc2V0IHRvIHNldCBpbnZhbGlkIGNoYW5uZWwgcG9zaXRpb25zCisJICBUaGlzIGl0ZXJlYXRlcyBvdmVyIHRoZSBHc3RBdWRpb0luZm8gdG8gc2V0IGludmFsaWQgY2hhbm5lbCBwb3NpdGlvbnMKKwkgIHJhdGhlciB0aGFuIHVzZSBtZW1zZXQoKSB3aGljaCB3b3JrcyByaWdodCBub3cgYmVjYXVzZSBpdCBhc3N1bWVzIHRoYXQKKwkgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0lOVkFMSUQgaXMgLTEuCisKKzIwMTItMDgtMjIgMTA6MzA6MDQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZnNpbmsuYzoKKwkgIGdka3BpeGJ1ZnNpbms6IG1pbm9yIGRvY3MgaW1wcm92ZW1lbnQKKworMjAxMi0wOC0yMiAxMDoyMzoyNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L2dka19waXhidWYvTWFrZWZpbGUuYW06CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZwbHVnaW4uYzoKKwkgIGdka3BpeGJ1ZjogcmUtZW5hYmxlIGFscmVhZHktcG9ydGVkIGdka3BpeGJ1ZnNpbmsKKworMjAxMi0wOC0yMiAxMDowODowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L2dka19waXhidWYvTWFrZWZpbGUuYW06CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5Lmg6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZwbHVnaW4uYzoKKwkgIGdka3BpeGJ1ZjogcG9ydCBnZGtwaXhidWZvdmVybGF5IGVsZW1lbnQgdG8gMC4xMQorCisyMDEyLTA4LTIyIDAwOjAwOjQ2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9NYWtlZmlsZS5hbToKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZmRlYy5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmZGVjLmg6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZwbHVnaW4uYzoKKwkgIGdka3BpeGJ1ZjogcmUtZW5hYmxlIGFscmVhZHktcG9ydGVkIGdka3BpeGJ1ZiBlbGVtZW50IGFzIGdka3BpeGJ1ZmRlYworCSAgTm90IHN1cmUgd2h5IGl0IGFzIGRpc2FibGVkIGV4YWN0bHkgZ2l2ZW4gdGhhdCBpdCBoYWQgYWxyZWFkeQorCSAgYmVlbiBwb3J0ZWQgKHRob3VnaCB3aXRob3V0IG1ldGFzIG9yIGJhc2VjbGFzcykuCisJICBNb3ZlIHBsdWdpbl9pbml0IGJpdHMgaW50byBzZXBhcmF0ZSBzb3VyY2UgZmlsZSwgYW5kIHJlbmFtZQorCSAgZGVjb2RlciBlbGVtZW50IHRvIGdka3BpeGJ1ZmRlYy4KKworMjAxMi0wOC0yMSAyMzoyNTo0NyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L2dka19waXhidWYvZ3N0X2xvYWRlci5jOgorCSAgZ2RrcGl4YnVmOiByZW1vdmUgb2xkIGFuZCB1bnVzZWQgZ3N0X2xvYWRlciBzb3VyY2UgZmlsZQorCSAgT25jZSB1cG9uIGEgdGltZSB1c2VkIHRvIGxvYWQgR1N0cmVhbWVyIHZpZHMgdmlhIEdka1BpeGJ1ZiBBUEkuCisKKzIwMTItMDgtMTYgMTY6NTE6MTYgLTA3MDAgIEFsZWl4IENvbmNoaWxsbyBGbGFxdWUgPGFsZWl4QG9ibG9uZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBtYWtlIGppdHRlcmJ1ZmZlciBkcm9wLW9uLWxhdGVuY3kgYXZhaWxhYmxlIChmaXggIzY4MjA1NSkKKwkgIENvbmZsaWN0czoKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaAorCisyMDEyLTA4LTIxIDE5OjQ3OjQ1ICswODAwICBIdWFjYWkgQ2hlbiA8Y2hlbmhjQGxlbW90ZS5jb20+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDI6IG1ha2UgZ3N0X3Y0bDJfZmlsbF9saXN0cygpIGFkYXB0IHRvIGtlcm5lbCAzLjMrCisJICBXaGVuIGRvIHY0bDJfaW9jdGwoKSB3aXRoIFZJRElPQ19FTlVNSU5QVVQgZmFpbHMgb24gc29tZSBkZXZpY2VzLAorCSAga2VybmVscyBiZWZvcmUgMy4zLjAgcmV0dXJuIEVJTlZBTCwgYnV0IG5ld2VyIGtlcm5lbHMgcmV0dXJuIEVOT1RUWS4KKwkgIFRoaXMgcGF0Y2ggbWFrZSB0aG9zZSBkZXZpY2VzIHdvcmsgd2VsbCBvbiBrZXJuZWwgMy4zKy4KKwkgIFJlbGF0ZWQga2VybmVsIGNvbW1pdDoKKwkgIGh0dHA6Ly9naXQua2VybmVsLm9yZy8/cD1saW51eC9rZXJuZWwvZ2l0L3RvcnZhbGRzL2xpbnV4LmdpdDthPWNvbW1pdDtoPTA3ZDEwNmQwYTMzZDYwNjNkMjA2MTMwNTkwM2RlYjAyNDg5ZWJhMjAKKwkgIFNpZ25lZC1vZmYtYnk6IEh1YWNhaSBDaGVuIDxjaGVuaGNAbGVtb3RlLmNvbT4KKwkgIFNpZ25lZC1vZmYtYnk6IFJ1aSBXYW5nIDx3YW5nckBsZW1vdGUuY29tPgorCSAgU2lnbmVkLW9mZi1ieTogSmllIENoZW4gPGNoZW5qQGxlbW90ZS5jb20+CisKKzIwMTItMDgtMjAgMjM6MzA6MzggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgdmlkZW8veC1kdmQtc3VicGljdHVyZSAtPiBzdWJwaWN0dXJlL3gtZHZkCisKKzIwMTItMDgtMTcgMjA6NTI6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJICBtdWx0aWZpbGVzcmM6IGZpeCBleGFtcGxlIHBpcGVsaW5lIGluIGRvY3MKKworMjAxMi0wOC0xNyAxNDo1OTo1NyArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIzYmFuZHMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2VxdWFsaXplci5jOgorCSAgZXF1YWxpemVyOiBlbmFibGUgcHJlc2V0cyBmb3IgdGhlIG4tYmFuZCBlcXVhbGl6ZXIKKwkgIEFkZCBhIHRlc3QgZm9yIHNhdmluZyBhbmQgcmVzdG9yaW5nIHRoZSBwcmVzZXQuCisKKzIwMTItMDgtMTQgMDE6MjA6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGZpeCBub3QtbmVnb3RpYXRlZCBlcnJvcnMgb24gdmFyaWFibGUgb3IgbWlzc2luZyBmcmFtZXJhdGUgaW4gaW5wdXQgY2FwcworCSAgUmVtb3ZlIHNvbWUgYm9ndXMgY29kZSBJIGFkZGVkIGR1cmluZyBwb3J0aW5nIHRoYXQgd291bGQgZXJyb3Igb3V0CisJICBvbiBtaXNzaW5nIG9yIHZhcmlhYmxlIGZyYW1lcmF0ZXMgaW4gaW5wdXQgY2Fwcy4gSGFuZGxlIHRoaXMgbGlrZQorCSAgd2UgZG8gaW4gMC4xMAorCSAgRml4ZXMgdGVzdF9tb2RlX2Rpc2FibGVkX3Bhc3N0aHJvdWdoIHVuaXQgdGVzdCBjaGVjay4KKworMjAxMi0wOC0xMiAxMzoxNjozMiArMDIwMCAgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorCisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSAgbGF3OiBGaWx0ZXIgbGF5b3V0IGNhcHMgZmllbGQKKwkgIFRoZSBsYXlvdXQgY2FwcyBmaWVsZCBzaG91bGRuJ3QgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIHNpbmsgcGFkCisJICBvZiB7bXUsYX1sYXdkZWMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgxNjc3CisKKzIwMTItMDgtMDkgMTk6NDE6MzQgKzAzMDAgIEFudG9uIEJlbGthIDxhbnRvbmJlbGthQGdtYWlsLmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogYWxsb3cgYSBUT0Mgd2l0aCBzaW5nbGUgYWx0ZXJuYXRpdmUgdG9wLWxldmVsIGVudHJ5CisJICBBbGxvdyBhIFRPQyB0aGF0IGhhcyBhIHNpbmdsZSBhbHRlcm5hdGl2ZSB0b3AtbGV2ZWwgZW50cnkKKwkgIHdpdGggbXVsdGlwbGUgc2VxdWVuY2Ugc3ViLWVudHJpZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01NDA4OTEKKworMjAxMi0wOC0wOSAxMDozMTozOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogQW5kIGZpeCB0aGUgR1RLIGNoZWNrIHRvIHVzZSB0aGUgY29ycmVjdCBwa2ctY29uZmlnIHBhY2thZ2UgbmFtZQorCisyMDEyLTA4LTA5IDEwOjI1OjM4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBGaXggR1RLIHJlcXVpcmVkIHZlcnNpb24gdmFyaWFibGUgbmFtZQorCisyMDEyLTA4LTA5IDA4OjM1OjIzICswMTAwICBNYXR0aGlhcyBDbGFzZW4gPG1jbGFzZW5AcmVkaGF0LmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGZpeCBidWlsZCB3aXRoIHJlY2VudCBrZXJuZWxzLCB0aGUgdjRsMl9idWZmZXIgaW5wdXQgZmllbGQgd2FzIHJlbW92ZWQKKwkgIFRoaXMgd2FzIHVudXNlZCBhcHBhcmVudGx5IGFuZCByZW1vdmVkIGluIHRoZSBrZXJuZWwgaW4gY29tbWl0OgorCSAgRnJvbSAyYjcxOWQ3YmFmNDkwZTI0Y2U3ZDgxN2M2MzM3YjdjODdmZGE4NGMxIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorCSAgRnJvbTogU2FrYXJpIEFpbHVzIDxzYWthcmkuYWlsdXNAaWtpLmZpPgorCSAgRGF0ZTogV2VkLCAyIE1heSAyMDEyIDA5OjQwOjAzIC0wMzAwCisJICBTdWJqZWN0OiBbUEFUQ0hdIFttZWRpYV0gdjRsOiBkcm9wIHY0bDJfYnVmZmVyLmlucHV0IGFuZCBWNEwyX0JVRl9GTEFHX0lOUFVUCisJICBSZW1vdmUgaW5wdXQgZmllbGQgaW4gc3RydWN0IHY0bDJfYnVmZmVyIGFuZCBmbGFnIFY0TDJfQlVGX0ZMQUdfSU5QVVQgd2hpY2gKKwkgIHRlbGxzIHRoZSBmb3JtZXIgaXMgdmFsaWQuIFRoZSBmbGFnIGlzIHVzZWQgYnkgbm8gZHJpdmVyIGN1cnJlbnRseS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODE0OTEKKwkgIENvbmZsaWN0czoKKwkgIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmMKKworMjAxMi0wOC0wOCAxNzoyNTozNiAtMDcwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgcnRwaDI2NHBheTogTWFrZSBpdCBhY3R1YWxseSB3b3JrIGFmdGVyIGNsZWFudXBzCisKKzIwMTItMDgtMDggMTc6NDA6MzQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkgIGdzdDogU2V0IGFsaWdubWVudCBhdCB0aGUgY29ycmVjdCBwbGFjZSBvZiBHc3RBbGxvY2F0aW9uUGFyYW1zCisKKzIwMTItMDgtMDggMTc6Mzk6MDcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgZ3N0OiBTZXQgYWxpZ25tZW50IGF0IHRoZSBjb3JyZWN0IHBsYWNlIG9mIEdzdEFsbG9jYXRpb25QYXJhbXMKKworMjAxMi0wOC0wOCAxNjoyNTo1OCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQKKworPT09IHJlbGVhc2UgMC4xMS45MyA9PT0KKworMjAxMi0wOC0wOCAxNToyMjowNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMC4xMS45MworCisyMDEyLTA4LTA4IDE1OjE3OjIyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogTWFrZWZpbGUuYW06CisJKiB3aW4zMi9NQU5JRkVTVDoKKwkqIHdpbjMyL2NvbW1vbi90dW5lci1lbnVtdHlwZXMuYzoKKwkqIHdpbjMyL2NvbW1vbi90dW5lci1lbnVtdHlwZXMuaDoKKwkqIHdpbjMyL2NvbW1vbi90dW5lci1tYXJzaGFsLmM6CisJKiB3aW4zMi9jb21tb24vdHVuZXItbWFyc2hhbC5oOgorCSAgd2luMzI6IGFkZCBnZW5lcmF0ZWQgdHVuZXItbWFyc2hhbC9lbnVtdHlwZXMgZmlsZXMgZm9yIHY0bDJzcmMgYW5kIHVwZGF0ZQorCSAgQW5kIGdzdC1pbmRlbnQgdGhlIHJpZ2h0IHJ0cCBtYXJzaGFsIGZpbGVzOyBhZGQgbWlzc2luZyBmaWxlcyB0byBNQU5JRkVTVC4KKworMjAxMi0wOC0wOCAxNToxMDozNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLWRpc3QuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kb3JjLWRpc3QuYzoKKwkgIGdzdDogdXBkYXRlIGRpc3RlZCBvcmMgZmlsZXMKKworMjAxMi0wOC0wOCAxMTozMTo1OSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBzeXMvb3NzNC9vc3M0LWF1ZGlvLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgU2lsZW5jZSBzb21lICd2YXJpYWJsZSBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkJyBjb21waWxlciB3YXJuaW5ncworCSAgV2hlbiBjb21waWxpbmcgd2l0aCAtREdfRElTQUJMRV9BU1NFUlQKKworMjAxMi0wOC0wOCAxMDo1Njo1MSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtb292cmVjb3Zlci5jOgorCSogdGVzdHMvaWNsZXMveGltYWdlc3JjLXRlc3QuYzoKKwkgIE5vIGNvZGUgd2l0aCBzaWRlLWVmZmVjdHMgaW5zaWRlIGdfYXNzZXJ0KCkgcGxlYXNlCisKKzIwMTItMDgtMDcgMTE6MTQ6MjEgLTA3MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICBtdWx0aXVkcHNpbms6IFJldHVybiBGTFVTSElORyBpbnN0ZWFkIG9mIEVSUk9SIG9uIHVubG9jaworCSAgSWYgdGhlIGJhc2UgY2xhc3MgYXNrcyBtdWx0aXVkcHNpbmsgdG8gdW5sb2NrLCB0aGVuIGl0IHNob3VsZCByZXR1cm4KKwkgIEZMVVNISU5HLCBub3QgRVJST1IKKworMjAxMi0wNy0yNiAxNjoxOTo1NyArMDMwMCAgQW50b24gQmVsa2EgPGFudG9uYmVsa2FAZ21haWwuY29tPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmg6CisJICBmbGFjZW5jOiBhZGQgVE9DIHN1cHBvcnQKKwkgIEFkZCBUT0MgYXMgZW1iZWRkZWQgY3Vlc2hlZXRzIGluIGZsYWMgZmlsZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQwODkKKworMjAxMi0wOC0wNyAxMjoxMjowOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGdlbmVyYXRlIGVtcHR5IHZvcmJpc2NvbW1lbnQgZm9yIGNvbXBsZXRlIHN0cmVhbWhlYWRlcnMgaWYgbmVlZGVkCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgxMzM1CisKKzIwMTItMDgtMDYgMTg6MDI6NTAgLTA3MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgcnRwc3NyY2RlbXV4OiBCbG9jayBwYWQgd2hpbGUgaXQgaXMgYW5ub3VuY2VkLgorCSAgQmxvY2sgdGhlIFJUUCBwYWQgYW5kIGFzc29jaWF0ZWQgUlRDUCBwYWRzIHdoaWxlIHRoZXkgYXJlIGJlaW5nCisJICBhbm5vdW5jZWQuIFRoaXMgaXQgdG8gcHJldmVudCBhIHJhY2Ugd2hlcmUgb25lIGlzIGFubm91bmNlZCBhbmQKKwkgIGJlZm9yZSB0aGUgY2FsbGJhY2sgaGFzIGNvbm5lY3RlZCBpdCwgdGhlIG90aGVyIG9uZSBnZXRzIGEgYnVmZmVyLgorCSAgV2UgY2FuJ3QgdXNlIHRoZSAicGFkbG9jayIgb2Ygc3NyY2RlbXV4IGJlY2F1c2UgaXQgY2F1c2VzIGRlYWRsb2Nrcy4KKworMjAxMi0wOC0wNiAxNTowMDo1NyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIGNvbW1vbjogdW4tZG8gYWNjaWRlbnRhbCBjb21tb24gdXBkYXRlIHJldmVydCBpbiBjb21taXQgN2I1OTI1YjUKKworMjAxMi0wOC0wNiAxNDo1MDo1MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYzoKKwkgIHJ0cG1wYXJvYnVzdGRlcGF5OiBzZXQgY29ycmVjdCBkYXRhX3NpemUgZm9yIGdlbmVyYXRlZCBkdW1teSBmcmFtZQorCSAgLi4uIHdoaWNoIHByZXZlbnRzIGdldHRpbmcgc3R1Y2sgaW4gYSBsb29wIGlmIHN1Y2ggb25lIGlzIG5lZWRlZC4KKworMjAxMi0wOC0wNiAxNDo1MDowMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYzoKKwkgIHJ0cG1wYXJvYnVzdGRlcGF5OiBpbXByb3ZlIGFuZCBmaXggZGVidWcgc3RhdGVtZW50CisJICAuLi4gc28gaXQgcmVhbGx5IGluZm9ybXMgYWJvdXQgbmV4dCByYXRoZXIgdGhhbiBwYXN0IGZyYW1lLgorCisyMDEyLTA4LTA2IDEyOjM0OjU1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcGFyb2J1c3RkZXBheS5jOgorCSAgcnRwbXBhcm9idXN0ZGVwYXk6IHVwZGF0ZSBhdmFpbGFibGUgYnl0ZXdyaXRlciBzcGFjZSB3aGVuIHJlcG9zaXRpb25pbmcKKwkgIC4uLiBhbmQgYWRkIHNvbWUgbW9yZSBhc3NlcnQgdG8gY2F0Y2ggcG90ZW50aWFsIHN1cnByaXNlcyBlYXJseSBvbi4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODA1NTgKKworMjAxMi0wOC0wNCAxMjo0Nzo0NCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgZ3N0OiBBZGQgc3RyZWFtLWlkIHRvIHN0cmVhbS1zdGFydCBldmVudHMKKworMjAxMi0wOC0wNCAxMjo1NDozMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogQ2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzcycgcXVlcnkgaGFuZGxlciBpZiBubyBwYWQgaXMgcHJvdmlkZWQKKworMjAxMi0wOC0wMiAwMTo0ODoyOSArMDIwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiBhZGQgYSBiZXR0ZXIgZGV0ZWN0aW9uIGZvciB0aGUgbWFpbiBydW4gbG9vcAorCisyMDEyLTA3LTI3IDE2OjEzOjQ5ICswMjAwICBYYXZpIEFydGlnYXMgPHhhcnRpZ2FzQGZsdWVuZG8uY29tPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkaXJlY3Rzb3VuZHNpbms6IERvIG5vdCBvdmVyd3JpdGUgdGhlIERTIGJ1ZmZlciB3aGVuIHRlc3RpbmcgZm9yIEFDMyBzdXBwb3J0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgwNzA2CisJICBDb25mbGljdHM6CisJICBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmMKKworMjAxMi0wOC0wNSAxNjozOToyMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDk0Y2NmNGMgdG8gNjY4YWNlZQorCisyMDEyLTA4LTAzIDE2OjEzOjUyICswMTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cHNzcmNkZW11eDogUmVsZWFzZSBsb2NrIGJlZm9yZSBzaWduYWxsaW5nIG5ldyBwYWQKKwkgIFRoaXMgcHJldmVudHMgYSBkZWFkbG9jayB3aGVyZSBzb21ldGhpbmcgd291bGQgdHJ5IHRvIHB1c2ggYW4gZXZlbnQKKwkgIHRocm91Z2ggdGhlIFNTUkMgZGVtdXggZnJvbSB0aGUgY2FsbGJhY2ssIGNhdXNpbmcgdGhlIHBhZHMgdG8gYmUgaXRlcmF0ZWQKKwkgIGFuZCB0aGUgbG9jayB0YWtlbi4KKworMjAxMi0wOC0wNCAxNjoxMDoxNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FwZXYybXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pY3lkZW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzZGVtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM3YybXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jOgorCSAgZ3N0X3RhZ19saXN0X2ZyZWUgLT4gZ3N0X3RhZ19saXN0X3VucmVmCisKKzIwMTItMDgtMDMgMTQ6MTA6MzIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBtYW5hZ2UgcmFjZSBiZXR3ZWVuIGNvbm5lY3Rpb24gY2xvc2luZyBhbmQgZmx1c2hpbmcKKwkgIC4uLiB3aGVyZSB0aGUgZm9ybWVyIGNhbiBoYXBwZW4gaW4gdGFzayB0aHJlYWQgYW5kIHRoZSBsYXR0ZXIgaW4gbWFpbmxvb3AKKwkgIHVwb24gZG93bndhcmQgc3RhdGUgY2hhbmdlLgorCisyMDEyLTA4LTAzIDE0OjAyOjIzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogaW1wcm92ZSBhbmQgcmVsYXggYXVkaW8gZnJhbWUgcGFyc2luZworCSAgLi4uIHNvIGFzIHRvIHByb3Blcmx5IHJlY29nbml6ZSBmaXJzdCBhdWRpbyBmcmFtZS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODEwNzcKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9mbGFjL2dzdGZsYWNkZWMuYworCisyMDEyLTA4LTAxIDEyOjE2OjQxICswMjAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBkb3VibGUgdW5yZWYgb2YgcHJpdmF0ZSB0YWcgYnVmZmVyCisKKzIwMTItMDctMzAgMTc6NTQ6NTEgKzAzMDAgIEFudG9uIEJlbGthIDxhbnRvbmJlbGthQGdtYWlsLmNvbT4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogY3JlYXRlIFRPQyBhcyBuZWVkZWQKKwkgIEF2b2lkIGNyZWF0aW5nIHRoZSB0b2MgaWYgdGhlIHdhdiBoYXMgbm8gb3IgZW1wdHkgY3VlIGNodW5rLgorCSAgQWxzbyBhIHNtYWxsIGNvZGUgY2xlYW51cC4KKworMjAxMi0wNy0yOCAxMToyNjowMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogdXBkYXRlIGZvciBUT0MgQVBJIGNoYW5nZXMKKworMjAxMi0wNy0yOCAxMToyMjo0MyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYTogdXBkYXRlIGZvciBUT0MgQVBJIGNoYW5nZXMKKworMjAxMi0wNy0yOCAxMToyMDowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogdXBkYXRlIGZvciBUT0MgQVBJIGNoYW5nZXMKKworMjAxMi0wNy0yOCAwMDoxOTo1MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHRhZ2luamVjdC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3Jndm9sdW1lLmM6CisJICB0YWc6IFVwZGF0ZSBmb3IgdGFnbGlzdC90YWcgZXZlbnQgQVBJIGNoYW5nZXMKKworMjAxMi0wNy0yNyAxMjowNTo0NCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvaXNvbXA0LXBsdWdpbi5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdChkZSltdXg6IHBhc3MgcHJpdmF0ZSBibG9iIHRhZ3MgaW4gYSBzYW1wbGUKKwkgIC4uLiByYXRoZXIgdGhhbiBhIGJ1ZmZlciwgYW5kIHRoZSBkZXRhaWxlZCBpbmZvIGluIHRoZSBzYW1wbGUgaW5mbworCSAgcmF0aGVyIHRoYW4gY2Fwcy4KKworMjAxMi0wNy0yNyAxMTozMToxMyArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSAgdmlkZW9jcm9wOiBEb24ndCByZXR1cm4gTlVMTCBmcm9tIF90cmFuc2Zvcm1fY2FwcworCSAgSWYgX3RyYW5zZm9ybV9jYXBzICgpIHJldHVybnMgTlVMTCwgdGhlIGJhc2V0cmFuc2Zvcm0gX3RyYW5zZm9ybV9jYXBzCisJICB0cmllcyB0byBjYWxsIGdzdF9jYXBzX2lzX3N1YnNldCAoKSB3aXRoIGEgTlVMTCBzdWJzZXQgd2hpY2ggaGl0cyBhbgorCSAgYXNzZXJ0aW9uLgorCisyMDEyLTA3LTI3IDExOjI2OjE4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogb2J0YWluIGltYWdlIHR5cGUgZnJvbSB0aGUgc2FtcGxlIGluZm8KKworMjAxMi0wNy0yNyAxMToyNTo0OSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IHJlbW92ZSBleHRyYW5lb3VzIF91bnJlZgorCSAgLi4uIHNpbmNlIHdlIGRpZCBub3Qgb2J0YWluIGEgYnVmZmVyIHJlZiBmcm9tIHRoZSBHc3RTYW1wbGUuCisKKzIwMTItMDctMjcgMTA6MTQ6MjMgKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogVXBkYXRlIHRvIHVzZSBHc3RTYW1wbGUgdGFnIHNldHRpbmcgQVBJCisKKzIwMTItMDctMjYgMTY6MzQ6MjEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJICBydHBtcGFyb2J1c3RkZXBheTogbW9kaWZ5IGJ1ZmZlciBkYXRhIHJhdGhlciB0aGFuIGJ1ZmZlciBpdHNlbGYKKworMjAxMi0wNy0yNiAxNjoyODozMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYzoKKwkgIHJ0cG1wYXJvYnVzdGRlcGF5OiBhdm9pZCBsZWFraW5nIGJ5dGV3cml0ZXIgaW5zdGFuY2UKKworMjAxMi0wNy0yNiAxNjowNDoyMyArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXggdGltZXN0YW1wIGFkanVzdG1lbnQgYW5kIGNhcHMKKworMjAxMi0wNy0yNiAxNjowMzo1NyArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXgvc2ltcGxpZnkgdGVsZWNpbmUgc3RhdGUgY2hlY2tzCisKKzIwMTItMDctMjYgMTI6MDg6NTggKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogSW1wcm92ZSBkZWJ1ZyBvdXRwdXQKKworMjAxMi0wNy0yNiAxMjowODozNiArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXggbG93LWxhdGVuY3kgcGF0dGVybiBsb2NraW5nCisKKzIwMTItMDctMjQgMTY6MTk6NTMgKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogUkZGIHNob3VsZCBiZSBpZ25vcmVkIGluIGRlaW50ZXJsYWNlCisJICBSRkYgb25seSBvY2N1cnMgb24gcHJvZ3Jlc3NpdmUgZnJhbWVzIGluIHRlbGVjaW5lIHNlcXVlbmNlcy4gRm9yCisJICBkZWludGVybGFjZSwgd2UgZG9uJ3Qgd2FudCB0aGVzZSByZXBlYXRlZCBmaWVsZHMgYXMgd2Ugd2lsbCBzaW1wbHkgYmUKKwkgIHB1c2hpbmcgdGhlIHByb2dyZXNzaXZlIGZyYW1lIGFuZCB0aGVuIG1vdmluZyBvbi4KKwkgIEhvd2V2ZXIsIHdlIG5lZWQgdG8gY29uc2lkZXIgUkZGIGluIG9yZGVyIHRvIGNvcnJlY3RseSBpZGVudGlmeSBwYXR0ZXJucworCSAgYW5kIGFkanVzdCB0aGUgdGltZXN0YW1wcy4KKworMjAxMi0wNy0yNCAxNDo1OTo0NyArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBJbXByb3ZlIHByb2Nlc3MgbG9naWMKKwkgIFRoZSBsb2dpYyBub3cgd29ya3MgYmV0dGVyIGlmIHdlIGZpbHRlciBvcnBoYW5zLCB0aGVuIHByb2dyZXNzaXZlLCB0aGVuCisJICB0ZWxlY2luZSBpbnRlcmxhY2VkIGZpZWxkcyB3aGljaCBuZWVkIHRvIGJlIHdvdmVuIGFuZCBmYWxsIHRocm91Z2ggdG8KKwkgIGludGVybGFjZS4gVGVsZWNpbmUgaW50ZXJsYWNlZCBmaWVsZHMgd2lsbCBiZSByZWd1bGFybHkgZGVpbnRlcmxhY2VkIGlmCisJICB0aGVyZSBpcyBubyBwYXR0ZXJuIGxvY2sgZm9yIHVzIHRvIGJlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgdGVsZWNpbmUKKwkgIHBhdHRlcm4uCisJICBUZWxlY2luZSBzZXF1ZW5jZXMgdGhhdCBhcmVuJ3QgMjRmcHMgcHJvZ3Jlc3NpdmUgd2l0aCBSRkYgZmxhZ3MgY2FuJ3QKKwkgIHJlYWxseSBiZSB0ZXN0ZWQgdW50aWwgZmllbGRhbmFseXNpcyBpcyBwb3J0ZWQuCisKKzIwMTItMDctMjUgMTY6MDI6MzQgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBvbmx5IHNldCBjb21wbGV0ZSBvdXRwdXQgY2FwcyBvbmNlCisJICAuLi4gc28gYXMgdG8gYXZvaWQgZG93bnN0cmVhbSBjb21wbGFpbnRzIGFib3V0IG1pc3Npbmcgc3RyZWFtaGVhZGVycy4KKworMjAxMi0wNy0yNSAxNToyOTowNCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWNkZWM6IGFsc28gc3VwcG9ydCBTMjRfMzIgb3V0cHV0CisKKzIwMTItMDctMjUgMTU6Mjg6MTQgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBwYXNzIGNvcnJlY3QgcGFyYW1ldGVycyB0byBlbmNvZGVyIGxpYgorCisyMDEyLTA3LTI1IDE0OjU3OjEzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogYWRqdXN0IHRvIG1vZGlmaWVkIGF1ZGlvZW5jb2RlciBnZXRjYXBzIGhlbHBlciBBUEkKKworMjAxMi0wNy0yNSAxMjo1MDowMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcDogZ28gYW5kIHN0YXkgaW4gdGhlIGxvb3AgZnVuY3Rpb24gb24gUExBWQorCSAgV2hlbiB3ZSBoYXZlIGEgUExBWSByZXF1ZXN0LCBnbyBpbnRvIHRoZSBMT09QIGZ1bmN0aW9uIG5leHQuIFdoZW4gd2UgYXJlCisJICBsb29waW5nLCBrZWVwIG9uIGxvb3BpbmcgdW50aWwgd2UgYXJlIHRvbGQgb3RoZXJ3aXNlLgorCSAgVGhpcyBmaXhlZCBydHNwIGFuZCBUQ1AgY29ubmVjdGlvbnMuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjgwNTUxCisKKzIwMTItMDctMjUgMTI6NDk6MzUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3A6IHNldCBjYXBzIGFmdGVyIGFjdGl2YXRpbmcgdGhlIHBhZAorCisyMDEyLTA3LTI1IDEyOjQ5OjA3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgaDI2NGRlcGF5OiBzbWFsbCBjbGVhbnVwcworCisyMDEyLTA3LTI1IDEwOjA4OjUyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L2dzdHJ0cHhxdGRlcGF5LmM6CisJICB4cXRkZXBheTogZml4IGJ1ZmZlciByZWZjb3VudCBlcnJvcgorCSAgQWZ0ZXIgcHVzaGluZyB0aGUgYnVmZmVyIGludG8gdGhlIGFkYXB0ZXIsIHdlIHNob3VsZCBub3QgbGV0IHRoZSBiYXNlY2xhc3MgcHVzaAorCSAgaXQgb3V0IGFueW1vcmUuIFRoaXMgZXJyb3Igd2FzIGludHJvZHVjZWQgd2hpbGUgcG9ydGluZyB0byAwLjExLgorCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODA1NDAKKworMjAxMi0wNy0yNCAyMTo0MTo1MyArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICBsZXZlbDogcmVtb3ZlIG9ic29sZXRlIGxpYm9pbCBjb21tZW50CisKKzIwMTItMDctMjQgMjE6MTE6MTggKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgbWF0cm9za2FkZW11eDogcHVzaCBtb2RlOiBpbmNyZWFzZSBzZWdtZW50IGFjY3VyYWN5IGZvbGxvd2luZyBzZWVrCisJICBDb25mbGljdHM6CisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYworCisyMDEyLTA3LTI0IDE2OjQxOjUxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBwZXJmb3JtIHByb3BlciBLRVlfVU5JVCBzZWVrIGFsc28gaW4gcHVzaCBtb2RlCisJICBDb25mbGljdHM6CisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYworCisyMDEyLTA3LTI0IDE5OjA0OjM5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogZG9uJ3QgY3Jhc2ggZGVyZWZlcmVuY2luZyBOVUxMIGVycm9yIHdoZW4gbGVhdmluZyBtdWx0aWNhc3QgZ3JvdXAgb24gc2h1dGRvd24KKwkgIFN0cmFuZ2VseSBlbm91Z2gsIGlmIHdlIGRvIHBhc3MgYW4gZXJyb3IgdmFyaWFibGUgdG8gYmUgZmlsbGVkLCB3ZQorCSAgbm8gbG9uZ2VyIGdldCBhbiBlcnJvciBvbiBsZWF2aW5nLgorCisyMDEyLTA3LTI0IDE1OjU1OjEyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHJlYXJyYW5nZSBzb21lIGNoZWNrcyB0byBhdm9pZCBOVUxMIHVzZQorCisyMDEyLTA3LTI0IDE1OjM4OjI0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHVzZSBzYW1lIGZvdXJjYyB0byBkZXRlcm1pbmUgY2FwcyBpbiBkZXRlcm1pbmluZyB1bmNvbXByZXNzZWQtbmVzcworCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3Mzg5OAorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jCisKKzIwMTItMDctMjQgMTU6MzY6NTQgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBSZXZlcnQgImF2aWRlbXV4OiBEb24ndCBjb25zaWRlciAwIGZjY19oYW5kbGVyIGFzIHVuY29tcHJlc3NlZC4iCisJICBUaGlzIHJldmVydHMgY29tbWl0IGM2YjlmNWIyNWFiNDM1NjY5ODE2YTA3MDQ5YjBlNWE4ZjAxZTA5Y2EuCisJICBmb3VyY2MgR1NUX1JJRkZfcmdiID0gMCBzdGlsbCBsZWFkcyB0byByYXcgdW5jb21wcmVzc2VkIHJnYiBjYXBzLgorCSAgU2VlIGFsc28gaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3Mzg5OAorCisyMDEyLTA3LTI0IDEyOjEwOjQ2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogZml4IHVwIGV4YW1wbGUgcGlwZWxpbmUgc29tZSBtb3JlCisJICBObyBtb3JlIGZmbXBlZ2NvbG9yc3BhY2UKKworMjAxMi0wNy0yMCAxNjozMDowMCArMDMwMCAgU3JlZXJlbmogQmFsYWNoYW5kcmFuIDxzcmVlcmVuai5iYWxhY2hhbmRyYW5AaW50ZWwuY29tPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBGaXggdGhlIGV4YW1wbGUgZ3N0LWxhdW5jaCBwaXBlbGluZS4KKworMjAxMi0wNy0yNCAxMjozMzozMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogYXZvaWQgTlVMTCBhY2Nlc3Mgd2hlbiBjaGVja2luZyBzdWJ0aXRsZQorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MDM4OAorCisyMDEyLTA3LTI0IDEyOjIyOjA4ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IFJlc2V0IHBhcnNlciB3aGVuIHdlIGhhdmUgY2FwcyB3aXRob3V0IGNvZGVjX2RhdGEKKwkgIFRoaXMgZW5zdXJlcyB0aGUgZGV0ZWN0aW9uIChhbmQgcHJvcGVyIGRvd25zdHJlYW0gY2FwcyBzZXR0aW5ncykgd2lsbAorCSAgYWN0dWFsbHkgaGFwcGVuIHdoZW4gd2UgaGF2ZSBuZXcgaW5jb21pbmcgY2FwcyB3aXRob3V0IGNvZGVjX2RhdGEuCisJICBUaGlzIHdhcyBlYXNpbHkgdHJpZ2dlcmVkIGJ5IHN0cmVhbXMgZnJvbSBtYXRyb3NrYWRlbXV4IHdoaWNoIGluaXRpYWxseQorCSAgcHJvdmlkZWQgY2FwcyB3aXRoIGEgY29uc3RydWN0ZWQgY29kZWNfZGF0YSwgYnV0IHRoZW4gcHVzaGVkIG5ldyBjYXBzCisJICB3aXRob3V0IHRoZSBjb2RlY19kYXRhIG9uY2UgaXQgZGV0ZWN0ZWQgdGhlIHN0cmVhbSB3YXMgYWR0cy4KKworMjAxMi0wNy0yNCAwOToxNzowOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kb3JjLWRpc3QuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kb3JjLWRpc3QuaDoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kb3JjLm9yYzoKKwkgIHZpZGVvbWl4ZXI6IHByZWZpeCBvcmMgZnVuY3Rpb25zIHdpdGggdmlkZW9fbWl4ZXJfb3JjXworCisyMDEyLTA3LTI0IDA5OjEzOjQ4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5oOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLm9yYzoKKwkgIHZpZGVvYm94OiBwcmVmaXggb3JjIGZ1bmN0aW9ucyB3aXRoIHZpZGVvX2JveF9vcmNfCisKKzIwMTItMDctMjMgMTg6NTE6MDAgKzAyMDAgIENocmlzdGlhbiBGcmVkcmlrIEthbGFnZXIgU2NoYWxsZXIgPHVyYWV1c0BsaW51eHJpc2luLm9yZz4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgVXBkYXRlIHNwZWMgZmlsZSB3aXRoIGxhdGVzdCBjaGFuZ2VzCisKKzIwMTItMDctMjMgMTc6Mzc6NTggKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGdlbmVyYXRlIGNvcnJlY3Qgc2VnbWVudCBzdHJlYW0gdGltZQorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MDI3NQorCisyMDEyLTA3LTIzIDE2OjQyOjU2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGoya2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuaDoKKwkgIHJ0cDogYWx3YXlzIHVzZSBidWZmZXIgbGlzdHMKKworMjAxMi0wNy0yMyAxNToyNDoxNyArMDIwMCAgUGF0cmljaWEgTXVzY2FsdSA8cGF0cmljaWFAYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lmg6CisJICBydHBtcDR2cGF5OiBhbHdheXMgZW5hYmxlIGJ1ZmZlci1saXN0cworCisyMDEyLTA3LTIzIDE1OjIyOjI0ICswMjAwICBQYXRyaWNpYSBNdXNjYWx1IDxwYXRyaWNpYUBheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuaDoKKwkgIHJ0cGpwZWdwYXk6IGFsd2F5cyBlbmFibGUgYnVmZmVyLWxpc3RzCisKKzIwMTItMDctMjMgMTU6NDk6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGdldCBmcmFtZSBmbGFncyBjb3JyZWN0bHkKKwkgIEFsc28gbW92ZSB0aGUgZGVpbnRlcmxhY2UgcGx1Z2luIHRvIHBvcnRlZCBzdGF0dXMKKworMjAxMi0wNy0yMyAxNTozMzo1NCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogcHJvcGVyIHBhcnNlIHJlY292ZXJ5IGFmdGVyIHNlZWsKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODA0MjcKKworMjAxMi0wNy0yMyAxMjozOTowNSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBjbGVhciBvbGQgc2VnbWVudCBldmVudCB3aGVuIHJlcXVlc3RpbmcgbmV3IG9uZQorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MDI4MworCisyMDEyLTA3LTIzIDEwOjMyOjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkgIGV4dDogVXBkYXRlIGZvciB2aWRlbyBiYXNlIGNsYXNzZXMgQVBJIGNoYW5nZXMKKworMjAxMi0wNy0yMyAwODo0OTowNyArMDIwMCAgQWxiYW4gQnJvd2FleXMgPHByYWhhbEB5YWhvby5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IGNvbnZlcnQgYWxsIG5vbiBHU1RfRk9STUFUX0JZVEVTIHRvIGZvcm1hdCBieXRlcy4KKwkgIENvbnZlcnQgYWxsIG5vbiBHU1RfRk9STUFUX0JZVEVTIHRvIGZvcm1hdCBieXRlczoKKwkgIGZpeGVzOgorCSAgR1N0cmVhbWVyLUNSSVRJQ0FMICoqOiBnc3RfcXVlcnlfc2V0X2R1cmF0aW9uOiBhc3NlcnRpb24gYGZvcm1hdCA9PQorCSAgZ192YWx1ZV9nZXRfZW51bSAoZ3N0X3N0cnVjdHVyZV9pZF9nZXRfdmFsdWUgKHMsIEdTVF9RVUFSSyAoRk9STUFUKSkpJworCSAgZmFpbGVkCisJICB3aGVuIHBsYXlpbmcgbW9yZSB0aGFuIG9uZSB3YXYgc3RyZWFtLgorCSAgZ3N0LXBsdWdpbnMtYmFzZS90ZXN0cy9pY2xlcy9wbGF5YmFjay90ZXN0NyB1cmkxLndhdiB1cmkyLndhdgorCisyMDEyLTA3LTIzIDA5OjI1OjIzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogRG9uJ3QgZmFpbCBpZiBtb3JlIGRhdGEgdGhlbiBuZWVkZWQgaXMgYXZhaWxhYmxlIHdoZW4gcGFyc2luZyBjdWUgY2h1bmtzCisJICBGaXhlcyBidWcgIzY4MDMyOC4KKworMjAxMi0wNy0yMyAwOToyMjoyMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IFNvbWUgbWlub3IgY2xlYW51cCB0byB0aGUgY3VlL2xhYmwgcGFyc2luZworCisyMDEyLTA3LTIzIDA4OjQ1OjI4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDk4ZTM4NmYgdG8gOTRjY2Y0YworCisyMDEyLTA3LTE5IDE0OjU1OjQ1ICswMjAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvVG9tc01vQ29tcEFsbC5pbmM6CisJICBkZWludGVybGFjZTogUG9ydCB0byAxLjAKKwkgIFRoaXMgcmVxdWlyZXMgdGhlIGFkZGl0aW9uYWwgSU5URVJMQUNFRCBidWZmZXIgZmxhZyByZWNlbnRseSBhZGRlZCB0bworCSAgLWJhc2UKKworMjAxMi0wNy0yMCAxNToxODo0NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSAgaW50ZXJsZWF2ZTogY29udmVydCB0aGUgb3V0cHV0IHNlZ21lbnQgdG8gdGltZQorCSAgQ29udmVydCB0aGUgc3RvcmVkIGlucHV0IHNlZ21lbnQgdG8gdGltZSBiZWZvcmUgcHVzaGluZyBpdCBvdXQuCisJICBDb25mbGljdHM6CisJICBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmMKKworMjAxMi0wNy0yMCAxMzoxMjo0NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5oOgorCSAgaW50ZXJsZWF2ZTogdHJ5IHRvIGZpeCBzZWdtZW50IGhhbmRsaW5nCisJICBDb25mbGljdHM6CisJICBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmMKKworMjAxMi0wNy0yMCAxNToyODoyMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogTm9uLXVwZGF0ZSBzZWVrcyBzaG91bGQgc3RpbGwgbWFrZSBzdXJlIHRoYXQgcmV2ZXJzZSBwbGF5YmFjayBzdGF0dXMgaXMgcmVzZXQKKwkgIENvbmZsaWN0czoKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jCisKKzIwMTItMDctMjAgMTU6MTg6MjEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFByb3Blcmx5IGluaXRpYWxpemUgZnJvbV9vZmZzZXQgYW5kIGZyb21fdGltZQorCisyMDEyLTA3LTIwIDE0OjI1OjQzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBXZSBuZWVkIGFuIGluZGV4IGFuZCBpbmRleCBlbnRyeSBmb3IgcmV2ZXJzZSBwbGF5YmFjaworCSAgUmV2ZXJzZSBwbGF5YmFjayBkb2VzIG5vdCB3b3JrIHdpdGggaW5kZXgtbGVzcyBmaWxlcyB5ZXQuCisKKzIwMTItMDctMjAgMTQ6MTA6NDEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBjbGVhbiB1cCBwdXNoIG1vZGUgc2VnbWVudCBoYW5kbGluZworCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MDI3NworCisyMDEyLTA3LTIwIDEzOjM1OjI5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwcm9wZXJseSB0cmFuc2Zvcm0gaW5jb21pbmcgc2VnbWVudCBldmVudAorCSAgLi4uIHdoaWNoIGlzIHJlYWxseSB1c2VmdWwgZm9yIHByb3BlciBwdXNoIG1vZGUgc2Vla2luZy4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODAyNzgKKworMjAxMi0wNy0yMCAxMTowNzo1OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICBtYXRyb3NrYWRlbXV4OiBGaXggcmV2ZXJzZSBwbGF5YmFjayBmb3Igc2Vla3Mgd2l0aG91dCBzdG9wIHBvc2l0aW9uCisJICBDb25mbGljdHM6CisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmgKKworMjAxMi0wNy0yMCAxMDo0ODozNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogT25seSB0YWtlIHRoZSBzdHJlYW1fc3RhcnRfdGltZSBpbnRvIGFjY291bnQgZm9yIFNFVCBzZWVrcworCSAgRm9yIG90aGVyIHNlZWtzIHRoZSBzdHJlYW1fc3RhcnRfdGltZSBpcyBhbHJlYWR5IGFkZGVkIHRvIHRoZQorCSAgc2VnbWVudCB2YWx1ZXMuCisJICBDb25mbGljdHM6CisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYworCisyMDEyLTA3LTA4IDIwOjM2OjIyICswMzAwICBBbnRvbiBCZWxrYSA8YW50b25iZWxrYUBnbWFpbC5jb20+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICB3YXZwYXJzZTogQWRkIFRPQyBzdXBwb3J0CisJICBBZGQgc3VwcG9ydCBmb3I6CisJICAqIEN1ZSBDaHVuaworCSAgKiBBc3NvY2lhdGVkIERhdGEgTGlzdCBDaHVuaworCSAgKiBMYWJlbCBDaHVuaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NzMwNgorCisyMDEyLTA1LTA5IDE1OjU4OjE2ICswMjAwICBNYXJpYSBHaW92YW5uYSBDaGlvc3NhIDxtYXJpYWdpb3Zhbm5hLmNoaW9zc2EgYXQgc2VsZXhlbHNhZy5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGFsc28gc2V0IFVEUCBidWZmZXIgc2l6ZSBpbiBtdWx0aWNhc3QKKwkgIEFsc28gc2V0IHRoZSBVRFAgYnVmZmVyIHNpemUgaW4gbXVsdGljYXN0IG1vZGUuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc1NDQ4CisKKzIwMTItMDctMTggMjM6NDM6NTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggaGVhZGVyIHBhcnNpbmcgaW4gcHVzaCBtb2RlCisJICBGaXggJ2JyZWFrJyB0aGF0IGdvdCB3YXJwZWQgdG8gdGhlIHdyb25nIHBsYWNlLAorCSAgcHJvYmFibHkgYXMgcGFydCBvZiBhIG1lcmdlLiBGaXhlcyBHU1RfSVNfQlVGRkVSCisJICBjcml0aWNhbHMgaW4gcGFyc2VfaWRpdCgpIHdoZW4gYmVpbmcgYWNjaWRlbnRhbGx5CisJICBwYXNzZWQgYSBOVUxMIGJ1ZmZlciBiZWNhdXNlIG9mIHRoZSBtaXNzaW5nIGJyZWFrLgorCSAgZ3N0LWxhdW5jaC0xLjAgcGxheWJpbiB1cmk9aHR0cDovL2RvY3MuZ3N0cmVhbWVyLmNvbS9tZWRpYS9zaW50ZWxfdHJhaWxlci00ODBpLmF2aQorCisyMDEyLTA3LTE4IDIyOjQ3OjIyICswMjAwICBBbGJhbiBCcm93YWV5cyA8cHJhaGFsQHlhaG9vLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXA6IGRlcHJlY2F0ZWQgc291cF9tZXNzYWdlX2hlYWRlcnMgX2dldCAtPiBfZ2V0X29uZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY4MDIwNgorCisyMDEyLTA3LTE4IDE4OjI3OjQwICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkgIGpwZWcvcG5nOiBDYWxsIHZpZGVvX2RlY29kZXJfbmVnb3RpYXRlKCkKKworMjAxMi0wNy0xOCAxNzo1Nzo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlYnVndXRpbHMvZ3N0cHVzaGZpbGVzcmMuYzoKKwkgIHVwZGF0ZSBmb3IgZ2hvc3RwYWQgY2hhbmdlcworCisyMDEyLTA3LTE4IDExOjM2OjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBQYXNzIHNlZWsgcmF0ZSB0byB1cHN0cmVhbSBzZWVrIGV2ZW50cyBpbiBwdXNoIG1vZGUKKwkgIEZpeGVzIGJ1ZyAjNjc5NDM1LgorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmMKKworMjAxMi0wNy0xNyAxNjozOTowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJICB1cGRhdGUgZm9yIFJUUCBidWZmZXIgYXBpIGNoYW5nZXMKKworMjAxMi0wNy0xNyAxNjozODoyNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkgIHVwZGF0ZSBmb3IgUlRQIGJ1ZmZlciBhcGkgY2hhbmdlcworCisyMDEyLTA3LTE2IDExOjA3OjQ0ICswMjAwICBQYXRyaWNpYSBNdXNjYWx1IDxwYXRyaWNpYUBheGlzLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiB1c2UgYnVmZmVyIGxpc3RzCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc5OTk0CisKKzIwMTItMDctMTcgMTA6MDE6NTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBGaXggcGFyc2luZyBvZiBJU1JDIGZyb20gdGhlIGN1ZXNoZWV0cworCisyMDEyLTA3LTA1IDE0OjE1OjI1ICswMzAwICBBbnRvbiBCZWxrYSA8YW50b25iZWxrYUBnbWFpbC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oOgorCSAgZmxhY3BhcnNlOiBhZGQgVE9DIHN1cHBvcnQKKwkgIEFkZCBzdXBwb3J0IGVtYmVkZGVkIGN1ZXNoZWV0cyBpbiBmbGFjIGZpbGVzLgorCSAgUGFyc2luZyBNRVRBREFUQV9CTE9DS19DVUVTSEVFVCBhcyBUT0MuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQwODkxCisKKzIwMTItMDctMTMgMTQ6NDM6MzEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBhdm9pZCBzb21lIG1vcmUgZnJhbWUgbWlzcGFyc2luZyBieSBhZGRpdGlvbmFsIGhlYWRlciBzYW5pdHkgY2hlY2sKKwkgIC4uLiB1c2luZyBhIHJlcXVpcmVkIGNvbnN0YW50IGJsb2NraW5nX3N0cmF0ZWd5IGJpdC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Nzk4MDcKKworMjAxMi0wNy0xMyAxMzo1MTo0OCArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgZGVtdXg6IFB1c2ggU1RSRUFNX1NUQVJUIGV2ZW50IHdoZW4gbmVlZGVkCisKKzIwMTItMDctMTEgMTM6MTA6MDcgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBhdm9pZCB3YXJuaW5nIGlmIGJvdGggdHMgYXJlIGVxdWFsCisKKzIwMTItMDctMTEgMTI6Mjg6MjMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgbXVsdGl1ZHBzaW5rOiBjaGVjayB0aGUgcmlnaHQgc2l6ZSB3aGVuIHdhcm5pbmcgYWJvdXQgdG9vIGxhcmdlIHVkcCBwYWNrZXRzCisJICBXaGF0IG1hdHRlcnMgaXMgdGhlIHRvdGFsIHNpemUsIG5vdCB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlCisJICBpbmRpdmlkdWFsIG1lbW9yeSBjaHVua3MgdGhhdCBtYWtlIHVwIHRoZSBwYWNrZXQuCisKKzIwMTItMDctMTAgMTQ6Mzg6MjEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuaDoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuaDoKKwkgIGF1dG9kZXRlY3Q6IHByb3h5IHRzLW9mZnNldCBwcm9wZXJ0aWVzCisJICBQcm94eSB0aGUgdHMtb2Zmc2V0IHByb3BlcnR5IGluIHRoZSBhdWRpbypzaW5rIGVsZW1lbnRzLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3OTM0MworCisyMDEyLTA3LTA5IDE2OjI3OjEwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICBmaXggZm9yIGFsbG9jYXRvciBBUEkgY2hhbmdlcworCisyMDEyLTA3LTA5IDEyOjIyOjAyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB1cGRhdGUgZm9yIHJpZmYgZmllbGQgcmVuYW1lCisKKzIwMTItMDUtMjEgMTM6NTQ6NTEgKzAyMDAgIE1hdGhpYXMgSGFzc2VsbWFubiA8bWF0aGlhc0BvcGVuaXNtdXMuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBkcm9wIHJlZHVuZGFudCBlbGVtZW50c19sZXZlbF9MREFERCBsaW5lCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc2MzAyCisKKzIwMTItMDctMDggMTM6MzA6MzQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdkZWMuYzoKKwkgIHRlc3RzOiBtaW5vciBqcGVnZGVjIGNsZWFuLXVwcyBhbmQgZml4ZXMKKwkgIEZpeCByYWNlIGNvbmRpdGlvbiBpbiBlb3MgY2hlY2tpbmcgYW5kIGEgbGVhay4gQW5kCisJICBidWlsZCBwaXBlbGluZSB3aXRob3V0IHBhcnNlX2xhdW5jaC4KKworMjAxMi0wNS0yMSAxMzo1Mzo1NCArMDIwMCAgTWF0aGlhcyBIYXNzZWxtYW5uIDxtYXRoaWFzQG9wZW5pc211cy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdkZWMuYzoKKwkqIHRlc3RzL2ZpbGVzL2ltYWdlLmpwZzoKKwkgIHRlc3RzOiBBZGQgc29tZSBiYXNpYyB0ZXN0cyBmb3IganBlZ2RlYworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NjMwMgorCisyMDEyLTA3LTA4IDAwOjA4OjU1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJICBkdG1mc3JjOiBwYXNzIHVuaGFuZGxlZCBub24tY3VzdG9tIGV2ZW50cyB0byB0aGUgYmFzZSBjbGFzcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NjYyNgorCisyMDEyLTA3LTA2IDE5OjExOjAyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiBhdm9pZCBzb21lIHJlbG9jYXRpb25zCisKKzIwMTItMDctMDYgMTQ6NDk6MTggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkgIHJ0cG1wNHZwYXk6IHJlbW92ZSBkZXByZWNhdGVkIHNlbmQtY29uZmlnIHByb3BlcnR5CisJICBVc2UgY29uZmlnLWludGVydmFsIGluc3RlYWQuCisKKzIwMTItMDctMDYgMTQ6NDI6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgcnRwaDI2NGRlcGF5OiByZW1vdmUgZGVwcmVjYXRlZCAiYnl0ZS1zdHJlYW0iIGFuZCAiYWNjZXNzLXVuaXQiIHByb3BlcnRpZXMKKwkgIFRoZXNlIHdpbGwgYmUgcGlja2VkIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gZG93bnN0cmVhbSBjYXBzIG5vdywgc28KKwkgIGlmIHlvdSB3YW50IHRoZSBkZXBheWxvYWRlciB0byBvdXRwdXQgYSBzcGVjaWZpYyBmb3JtYXQsIG1ha2Ugc3VyZQorCSAgdGhlIGVsZW1lbnQgZG93bnN0cmVhbSBhZHZlcnRpc2VzIHRoYXQgcHJlZmVyZW5jZSBvciB1c2UgYSBjYXBzZmlsdGVyCisJICBhZnRlciB0aGUgZGVwYXlsb2FkZXIgdG8gZm9yY2UgaXQuCisKKzIwMTItMDctMDYgMTQ6MTM6NTQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IHJlbW92ZSBkZXByZWNhdGVkIGFuZCBub24tZnVuY3Rpb25hbCAicHJvZmlsZS1sZXZlbC1pZCIgcHJvcGVydHkKKwkgIFRoaXMgaXMgbm93IG9wdGlvbmFsbHkgdGFrZW4gZnJvbSBkb3duc3RyZWFtIGNhcHMsIHNvIGNhbiBiZQorCSAgc3BlY2lmaWVkIHZpYSBhIGNhcHNmaWx0ZXIgYWZ0ZXIgdGhlIHBheWxvYWRlci4KKworMjAxMi0wNy0wNiAxNTowNzo1MSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBwZXJmb3JtIGFkZGl0aW9uYWwgc2FuaXR5IGNoZWNrIGJlZm9yZSBjb25maXJtaW5nIEFEVFMgZm9ybWF0CisJICAuLi4gYW5kIHR3ZWFrIGNvbmZ1c2luZyBkZWJ1ZyBtZXNzYWdlLgorCisyMDEyLTA3LTA2IDE1OjI5OjE0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IHJlbW92ZSB1bmhlbHBmdWwgc3RyYXkgZGVidWcgbWVzc2FnZQorCisyMDEyLTA3LTA2IDEzOjE2OjAwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogcmVtb3ZlIGRlcHJlY2F0ZWQgYW5kIHVudXNlZCAibnRwLW5zLWJhc2UiIHByb3BlcnR5CisKKzIwMTItMDctMDYgMTI6NTc6MjAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LWRvYy5jOgorCSAgZG9jczogdXBkYXRlIGlzb21wNCBkb2NzIGZvciBncHBtdXggLT4gM2dwcG11eCBjaGFuZ2UgYXMgd2VsbAorCisyMDEyLTA3LTA2IDEyOjU0OjAyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jOgorCSAgaXNvbXA0OiByZW1vdmUgZ3BwbXV4LCB3aGljaCB3YXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgM2dwcG11eAorCisyMDEyLTA3LTA2IDEyOjQ5OjU0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJICBzbXRwOiByZW1vdmUgZGVwcmVjYXRlZCAiZnBzIiBwcm9wZXJ0eQorCisyMDEyLTA3LTA2IDEyOjQ2OjMwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5oOgorCSAgbXVsdGlwYXJ0ZGVtdXg6IHJlbW92ZSBkZXByZWNhdGVkIGFuZCB1bnVzZWQgImF1dG9zY2FuIiBwcm9wZXJ0eQorCSAgUmVwbGFjZWQgYnkgYm91bmRhcnk9TlVMTC4KKworMjAxMi0wNy0wNiAwOTowNzo0MSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHJ0cGgyNjNwcGF5OiBhY2NlcHQgYW55IGgyNjMgaW5wdXQgdW5sZXNzIGRvd25zdHJlYW0gZm9yY2VzIHNwZWNpZmljIHJlcXVpcmVtZW50cworCSAgcnRwaDI2M3BwYXkgc2hvdWxkIGFjY2VwdCBhbnkgaW5wdXQgY29tcGF0aWJsZSB3aXRoIGl0cyBzaW5rIHRlbXBsYXRlCisJICBjYXBzIGlmIGl0IGp1c3Qgb3V0cHV0cyB0byBlLmcuIHVkcHNpbmsgb3IgZmFrZXNpbmsuCisJICBydHBoMjYzcHBheSAhIHJ0cGgyNjNwZGVwYXkgc2hvdWxkIGFsc28gd29yayB3aXRoIGFueSBjb21wYXRpYmxlIGlucHV0LgorCSAgVGhpcyB3b3VsZCBmYWlsIGJlZm9yZSB3aXRoIG5vdC1uZWdvdGlhdGVkIGVycm9ycyBiZWNhdXNlIHRoZSBnZXRfY2FwcworCSAgZnVuY3Rpb24gd291bGQgc2VlIHRoZSBlbmNvZGluZy1uYW1lIGluIHRoZSBkZXBheWxvYWRlcidzIHRlbXBsYXRlIGNhcHMKKwkgIGFuZCBkZWZhdWx0IHRvIGJhc2VsaW5lIEguMjYzIGJlY2F1c2UgdGhlcmUncyBubyBwcm9maWxlL2xldmVsIGluZm9ybWF0aW9uCisJICBpbiB0aG9zZSBjYXBzLCB3aGljaCBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gaWYgZG93bnN0cmVhbSBoYXMgZmlsdGVyY2FwcworCSAgZnJvbSBhbiBTRFAsIGJ1dCBub3QgaWYgdGhvc2UgZmllbGRzIGFyZSBhYnNlbnQgYmVjYXVzZSB0aGV5IGNhbiBiZQorCSAgYW55dGhpbmcgbGlrZSB3aXRoIHRoZSBkZXBheWxvYWRlcidzIHRlbXBsYXRlIGNhcHMuIE1ha2VzCisJICB2aWRlb3Rlc3RzcmMgISBhdmVuY19oMjYzcCAhIHJ0cGgyNjNwcGF5ICEgcnRwaDI2M3BkZXBheSAhIGZha2VzaW5rCisJICB3b3JrLgorCisyMDEyLTA3LTA1IDIyOjU3OjA1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHRlc3RzOiBmaXggaDI2M3AgcGF5bG9hZCAhIGRlcGF5bG9hZCB1bml0IHRlc3QKKwkgIE5lZWQgdG8gYWRkIGgyNjN2ZXJzaW9uIGZpZWxkIHRvIGlucHV0IGNhcHMgc2luY2UgdGhlCisJICBwYXlsb2FkZXIgc2luayBnZXRfY2FwcyBmdW5jdGlvbiB3aWxsIGNvbnRhaW4gaXQgaW4gdGhlCisJICB0aGUgY2FwcywgYW5kIHRoZSBzdHJpY3RlciBjYXBzIHN1YnNldCBjaGVjayByZXF1aXJlcworCSAgdGhpcyB0byBiZSBwcmVzZW50IGluIHRoZSBpbnB1dCBjYXBzIGFzIHdlbGwgdGhlbi4KKworMjAxMi0wNy0wNiAxMTo1MDo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJICB1cGRhdGUgZm9yIHF1ZXJ5IGFwaSBjaGFuZ2VzCisKKzIwMTItMDctMDYgMTE6MjY6NDYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB1cGRhdGUgZm9yIHF1ZXJ5IGFwaSBjaGFuZ2VzCisKKzIwMTItMDctMDYgMTE6MDI6MjQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdXBkYXRlIGZvciBhbGxvY2F0aW9uIHF1ZXJ5IGNoYW5nZXMKKworMjAxMi0wNy0wNSAxNToxNDozMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3Jndm9sdW1lLmM6CisJICB0ZXN0czogZml4IHJndm9sdW1lIHVuaXQgdGVzdCBldmVudCBoYW5kbGluZworCSAgTXVzdCBmbHVzaCBhZnRlciBFT1MgYmVmb3JlIHNlbmRpbmcgbW9yZSBidWZmZXJzIG9yCisJICBhbm90aGVyIEVPUyBldmVudCwgb3IgdGhlIGV2ZW50IG9yIGJ1ZmZlciB3aWxsIGJlCisJICByZWplY3RlZC4gQWxzbyBzZW5kIGEgU0VHTUVOVCBldmVudCBhdCB0aGUgc3RhcnQKKwkgIG9mIGVhY2ggc3RyZWFtIGZvciBnb29kIG1lYXN1cmUuCisKKzIwMTItMDctMDUgMTM6MTM6MDkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIGdzdDogSW1wbGVtZW50IHNlZ21lbnQtZG9uZSBldmVudAorCisyMDEyLTA3LTA1IDEyOjM1OjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBSZW1vdmUgdGhlIFRPQyBxdWVyeSBoYW5kbGluZworCisyMDEyLTA3LTA0IDE5OjUyOjIyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thOiBVcGRhdGUgZm9yIG5ldyBHc3RUb2MgQVBJCisJICBUT0Mgc3VwcG9ydCBpbiBtYXRyb3NrYW11eCBpcyBkaXNhYmxlZCBmb3Igbm93IGFzIGl0IHdhcyBicm9rZW4gYW55d2F5LgorCisyMDEyLTA3LTA0IDIzOjU3OjE4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6CisJICB0ZXN0czogZml4IHJnYW5hbHlzaXMgdW5pdCB0ZXN0IGV2ZW50IGhhbmRsaW5nCisJICBNdXN0IGZsdXNoIGFmdGVyIEVPUyBiZWZvcmUgc2VuZGluZyBtb3JlIGJ1ZmZlcnMgb3IKKwkgIGFub3RoZXIgRU9TIGV2ZW50LCBvciB0aGUgZXZlbnQgb3IgYnVmZmVyIHdpbGwgYmUKKwkgIHJlamVjdGVkLiBBbHNvIHNlbmQgYSBTRUdNRU5UIGV2ZW50IGF0IHRoZSBzdGFydAorCSAgb2YgZWFjaCBzdHJlYW0gZm9yIGdvb2QgbWVhc3VyZS4KKworMjAxMi0wNy0wNCAxODo1ODo0NiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IGNsZWFyIDAgRFRTIG9uIGJ1ZmZlcnMgb3V0cHV0LCBhcyBzaW5rcyB3aWxsIHByZWZlciBEVFMgb3ZlciBQVFMgZm9yIHN5bmNpbmcKKwkgIFNpbmNlIHRoZSBpbml0aWFsIGRlY29kZWQgc3RpbGwgaW1hZ2UgYnVmZmVyIHdpbGwgaGF2ZSBkdHM9cHRzPTAsIGFuZAorCSAgd2Ugb25seSBzZXQgUFRTIG9uIGJ1ZmZlcnMgd2UgcHVzaCBvdXQsIGFsbCBidWZmZXJzIHB1c2hlZCBvdXQgd291bGQKKwkgIGhhdmUgYSBEVFMgb2YgMC4gU2lua3MsIGhvd2V2ZXIsIHdpbGwgcHJlZmVyIERUUyBvdmVyIFBUUyBpZiBib3RoIGFyZQorCSAgc2V0LCBhbmQgd2lsbCB0aGVyZWZvcmUgYWx3YXlzIHNlZSBhIHRpbWVzdGFtcCBvZiAwIG5vIG1hdHRlciB3aGF0CisJICB0aGUgUFRTIGlzIHNldCB0by4KKwkgIEZpeGVzIHVuaXQgdGVzdCB0b28uCisKKzIwMTItMDctMDQgMjA6NTk6MDMgKzA0MDAgINCg0YPRgdC70LDQvSDQmNC20LHRg9C70LDRgtC+0LIgPGxybjE5ODZAZ21haWwuY29tPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkaXJlY3Rzb3VuZHNpbms6IEZpeCBxdWVyeSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbjsgbW9yZSBkZWJ1Z2dpbmcKKworMjAxMi0wNy0wNCAxOTo0MTo1MiArMDQwMCAg0KDRg9GB0LvQsNC9INCY0LbQsdGD0LvQsNGC0L7QsiA8bHJuMTk4NkBnbWFpbC5jb20+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmVjdHNvdW5kc2luazogRml4IHNwZWMgc3R1ZmYgaW4gZGlyZWN0c291bmRzaW5rCisKKzIwMTItMDUtMzEgMTk6MjI6NDcgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmVjdHNvdW5kc2luazogZml4IGFjY2VzcyB0byBpbnZhbGlkIHBvaW50ZXIgaW4gc2V0X3ZvbHVtZQorCisyMDEyLTA2LTEzIDEyOjEyOjM5ICswMjAwICBTZWJhc3RpYW4gRHI9QzM9QjZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmVjdHNvdW5kc2luazogRml4IGNhcHMgbGVha3MKKworMjAxMi0wNS0yOSAxMTozNzo1OSArMDAwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgZGlyZWN0c291bmRzaW5rOiBmaXggYWNjZXB0Y2FwcyBjaGVjaworCisyMDEyLTA1LTI1IDEwOjE0OjU3ICswMDAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkaXJlY3Rzb3VuZHNpbms6IHVzZSBoZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgZm9yIHNwZGlmIGZvcm1hdHMKKworMjAxMi0wNS0yNSAxMDoxOTowOSArMDAwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgZGlyZWN0c291bmRzaW5rOiBhZGQgc3VwcG9ydCBmb3IgRFRTCisKKzIwMTItMDUtMDggMTY6MjM6NDIgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmVjdHNvdW5kc2luazogZm9yY2UgNDgwMDAga0h6IGZvcmNlIEFDLTMgb3ZlciBzcGRpZgorCisyMDEyLTA3LTA0IDE3OjQyOjQ5ICswNDAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkaXJlY3Rzb3VuZHNpbms6IGFkZCBzdXBwb3J0IGZvciBhYy0zIG92ZXIgc3BkaWYKKworMjAxMi0wNy0wNCAxMjozNzo0MCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmM6CisJICB0ZXN0czogZGlzYWJsZSBkZWludGVybGFjZSB0ZXN0IGZvciBub3csIGVsZW1lbnQgc3RpbGwgbmVlZHMgdG8gYmUgcG9ydGVkCisJICBCdXQgbGVhdmUgaXQgYWN0aXZlIGFuZCBwcmludCBhIEZJWE1FLiBQb3J0aW5nIGlzIGluIHByb2dyZXNzLgorCisyMDEyLTA3LTAzIDE5OjM4OjM5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJICBkZWludGVybGVhdmU7IGRvd25ncmFkZSBjYXBzIGNoYW5nZSBmYWlsdXJlIGRlYnVnIG1lc3NhZ2UKKwkgIEFkZCBzb21lIG1vcmUgaW5mbyBhbmQgZG93bmdyYWRlIHRvIHdhcm5pbmcsIHNvCisJICBpdCBkb2Vzbid0IGxvb2sgbGlrZSB0aGUgdW5pdCB0ZXN0IGZhaWxlZC4KKworMjAxMi0wNy0wMyAxNzo1MjoxMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgIGF1ZGlvcGFub3JhbWE6IGZpeCBuZWdvdGlhdGlvbiBhbmQgdW5pdCB0ZXN0CisJICBNdXN0IHJlbW92ZSBhIHBvc3NpYmx5LWZpeGVkIGNoYW5uZWwtbWFzayBmaWVsZCBpZgorCSAgd2UncmUgZ29pbmcgdG8gc2V0IHVuZml4ZWQgY2hhbm5lbHMgb24gdGhlIHN0cnVjdHVyZSwKKwkgIG9yIGEgZGlmZmVyZW50IGNoYW5uZWwgY291bnQuCisKKzIwMTItMDctMDMgMTc6MjY6MjYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IE9ubHkgcHVzaCB0aGUgVE9DIGV2ZW50LCB0aGUgbWVzc2FnZSBpcyBoYW5kbGVkIGJ5IHRoZSBzaW5rcworCisyMDEyLTA3LTAzIDEyOjQ3OjU4ICswOTAwICBKYXZpZXIgSmFyZMOzbiA8amphcmRvbkBnbm9tZS5vcmc+CisKKwkqIHRlc3RzL2V4YW1wbGVzL2VxdWFsaXplci9kZW1vLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOgorCSogdGVzdHMvaWNsZXMvZ2RrcGl4YnVmc2luay10ZXN0LmM6CisJICB0ZXN0czogZG8gbm90IHVzZSBkZXByZWNhdGVkIGd0aysgc3ltYm9scworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3OTMwMQorCisyMDEyLTA3LTAzIDA5OjI3OjE3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IHJlcXVpcmUgR3RrKyAzLjAgZm9yIHRlc3RzL2V4YW1wbGVzCisKKzIwMTItMDctMDMgMTI6NTc6MTggKzA5MDAgIEphdmllciBKYXJkw7NuIDxqamFyZG9uQGdub21lLm9yZz4KKworCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJICBydHA6IHJlbW92ZSBzb21lIG91dGRhdGVkIGNvbW1lbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc5MzAxCisKKzIwMTItMDYtMjkgMTE6NTE6MzAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IGRlZmF1bHQgdG8gZm9yY2UtYXNwZWN0LXJhdGlvPXRydWUKKworMjAxMi0wNi0yOCAyMDowMzowNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jOgorCSAgcm5kYnVmZmVyc2l6ZTogYWRkIHB1c2ggbW9kZSBzdXBwb3J0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU2MzE3CisKKzIwMTItMDYtMjggMTE6Mjk6NTUgKzAyMDAgIERhdmlkIENvcnZveXNpZXIgPGRhdmlkLmNvcnZveXNpZXJAb3JhbmdlLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBpc29tcDQ6IFRyeSB0byBzZWVrIHVwc3RyZWFtIGJlZm9yZSBwcm9jZXNzaW5nIHNlZWsgcHVzaCBldmVudAorCSAgV2hlbiBpdCByZWNlaXZlcyBhIHNlZWsgaW4gcHVzaCBtb2RlLCB0aGUgcXRkZW11eCBzaG91bGQgZmlyc3QgdHJ5IHRvIHB1c2ggdGhlIGV2ZW50IHVwc3RyZWFtLCBhbmQgb25seSBpZiB1cHN0cmVhbSBmYWlscyBmYWxsIGJhY2sgdG8KKwkgIGl0cyBvd24gc2VlayBsb2dpYy4KKworMjAxMi0wNi0yOCAxMTo0NzoyMCArMDIwMCAgRGF2aWQgQ29ydm95c2llciA8ZGF2aWQuY29ydm95c2llckBvcmFuZ2UuY29tPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIGlzb21wNDogQWxsb3cgZHVyYXRpb24gcXVlcmllcyB0byBiZSBmb3J3YXJkZWQgdXBzdHJlYW0KKwkgIFdoZW4gcmVjZWl2aW5nIGEgZHVyYXRpb24gcXVlcnkgZm9yIFRJTUUgZm9ybWF0LCB0cnkgdG8gcXVlcnkgdXBzdHJlYW0sIGFuZCBvbmx5IGlmIHVwc3RyZWFtIGZhaWxzIGZhbGwgYmFjayB0byBxdGRlbXV4IGR1cmF0aW9uIGhhbmRsaW5nLgorCisyMDEyLTA2LTI4IDExOjU5OjExICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5oOgorCSAgcnRwaDI2NHBheTogY2xlYW51cHMKKwkgIFVzZSB0aGUgY2FwcyBwcm9wZXJ0aWVzIGZvciBhbGlnbm1lbnQgYW5kIGZvcm1hdC4KKwkgIFJlbW92ZSBzb21lIG9sZCBwcm9wZXJ0aWVzLCB3ZSBhbHdheXMgd2FudCB0byB1c2UgYnVmZmVybGlzdHMgd2hlbiB3ZSBjYW4gbm93LgorCisyMDEyLTA2LTI4IDExOjMyOjAzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIGgyNjRwYXk6IHByZWZlciBBVkMsIGl0J3MgZWFzaWVyIHRvIHBhcnNlIGV0YworCisyMDEyLTA2LTI3IDA5OjA5OjMyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJICBqcGVnZW5jOiBtYXJrIGFsbCBvdXRwdXQgZnJhbWVzIGFzIGtleWZyYW1lcworCisyMDEyLTA2LTI2IDE4OjQ4OjExICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYTogdXBkYXRlIGZvciBHc3RUb2MgQVBJIGFkZGl0aW9ucworCisyMDEyLTA2LTI2IDE3OjA0OjQxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thOiBzZXQgaW50ZXJsYWNlLW1vZGUKKworMjAxMi0wNi0yNiAxMzoxOTowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGltcHJvdmUgZGVidWcKKworMjAxMi0wNi0yNiAxMzowMjoxMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIFJldmVydCAidjRsMjogZnJlZSBrZXJuZWwgYnVmZmVycyBiZWZvcmUgYWxsb2NhdGluZyBuZXcgb25lcyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgMWIwOWJjNjA5YTU3OGU3MzFmMGRiYzhmNmU2OThlMjVkOGY0YzVmOC4KKwkgIFNlZW1zIHRvIG1ha2UgbGlidjRsMiBjb21wbGFpbiwgbWF5YmUgYmVjYXVzZSB3ZSBjYWxsIFJFUUJVRlMgd2l0aCAwIGJ1ZmZlcnMKKwkgIGJlZm9yZSB3ZSBhbGxvY2F0ZWQgYnVmZmVycy4KKworMjAxMi0wNi0yNiAxMjowNzo0NyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGZyZWUga2VybmVsIGJ1ZmZlcnMgYmVmb3JlIGFsbG9jYXRpbmcgbmV3IG9uZXMKKwkgIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcwMjU3CisKKzIwMTItMDYtMjYgMTI6MDc6MjkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IGltcHJvdmUgZGVidWcKKworMjAxMi0wNi0yNiAxMToxNDo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IHNldHVwIHN0cmlkZXMgYW5kIG9mZnNldHMgZm9yIGFsbCBwbGFuZXMKKworMjAxMi0wNi0yNSAyMDoxMTo1MyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2EtbXV4OiB1cGRhdGUgZm9yIEdzdFRvY1NldHRlciBjaGFuZ2VzCisKKzIwMTItMDYtMjUgMTM6MzE6MTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFJldHVybiBGQUxTRSBmcm9tIHF1ZXJpZXMgaWYgd2UgY2FuJ3QgYW5zd2VyIFBPU0lUSU9OL0RVUkFUSU9OIHF1ZXJpZXMKKworMjAxMi0wNi0yMSAxNzoxNToxMSArMDMwMCAgQW50b24gQmVsa2EgPGFudG9uYmVsa2FAZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFJldHVybiBGQUxTRSBmcm9tIFRPQyBxdWVyeSBpZiBubyBUT0MgZXhpc3RzIGluc3RlYWQgb2YgYW4gZW1wdHkgVE9DCisKKzIwMTItMDYtMjQgMjI6NTE6MTYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYTogdXBkYXRlIGZvciBHc3RUb2MgQVBJIGNoYW5nZXMKKworMjAxMi0wNi0yMyAxNDo1NzoyOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogdXBkYXRlIGZvciBnc3RfZWxlbWVudF9tYWtlX2Zyb21fdXJpKCkgY2hhbmdlcworCisyMDEyLTA2LTIwIDEyOjMxOjAxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZkZW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2bXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDNkZW11eC5jOgorCSAgdXBkYXRlIGZvciBidXMgYXBpIGNoYW5nZXMKKworMjAxMi0wNi0yMCAxMDozMzo0MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG1vb3ZyZWNvdmVyLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHVwZGF0ZSBmb3IgdGFzayBhcGkgY2hhbmdlCisKKzIwMTItMDYtMjAgMDk6NTk6NDkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tb3Nzc3JjLmM6CisJICB1cGRhdGUgZm9yIGNsb2NrIGFwaSBjaGFuZ2VzCisKKzIwMTItMDYtMTkgMTI6MTU6MzMgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeHJpbmdidWZmZXIuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hyaW5nYnVmZmVyLmg6CisJICBvc3hhdWRpb3Npbms6IHJlc3BlY3QgdGhlIHByZWZlcmVkIGNoYW5uZWwgbGF5b3V0CisJICBJbiBPU1ggaXMgYWxsb3dlZCB0byBjb25maWd1cmUgdGhlIGRlZmF1bHQgYXVkaW8gb3V0cHV0IGRldmljZSwKKwkgIHByZWZlcmVkIGNoYW5uZWwgbGF5b3V0IGFuZCBzcGVha2VyIHBvc2l0aW9ucyB0aHJvdWdoIHRoZSB0b29sCisJICAiQXVkaW8gTUlESSBTZXR1cCIuCisKKzIwMTItMDQtMzAgMjI6NTk6NTggKzAyMDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2EtZGVtdXg6IFNlbmQgZ2FwIGV2ZW50cyBmb3Igc3VidGl0bGUgc3RyZWFtcworCisyMDEyLTA2LTE3IDAxOjAwOjQwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkgIHNwbGl0ZmlsZXNyYzogZml4IHVwIGRvY3MgZm9yIDAuMTEKKworMjAxMi0wNi0xNiAyMzoyOTo0MSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmM6CisJICBzcGxpdGZpbGVzcmM6IHNtYWxsIHVyaSBoYW5kbGVyIGZpeHVwIGFuZCBzb21lIG1vcmUgZG9jcworCSAgR2V0IFVSSSBsb2NhdGlvbiB1c2luZyBnc3RfdXJpX2dldF9sb2NhdGlvbigpLCBzbyBhbnkKKwkgIGVzY2FwZWQgYml0cyBnZXQgdW5lc2NhcGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYwOTA0OQorCisyMDEyLTA2LTE3IDAwOjU5OjIxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkgIHNwbGl0ZmlsZXNyYzogcmUtcG9ydCB0byAwLjExCisKKzIwMTItMDYtMTYgMTk6MDY6MjUgKzAxMDAgIEJhc3RpZW4gTm9jZXJhIDxoYWRlc3NAaGFkZXNzLm5ldD4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkgIHNwbGl0ZmlsZXNyYzogSW1wbGVtZW50IHNwbGl0ZmlsZTovLyBVUkkgc2NoZW1lCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjA5MDQ5CisJICBDb25mbGljdHM6CisJICBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5jCisKKzIwMTItMDYtMTQgMTA6NDM6NTYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkgIHRoZW9yYWRlcGF5OiBmaXggYnVmZmVyIG1lbW9yeQorCSAgVGhlIG1lbW9yeSB3YXMgYWRkZWQgdG8gdGhlIGlucHV0IGJ1ZmZlciBpbnN0ZWFkIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorCisyMDEyLTA2LTEzIDEzOjM2OjQ1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBEb24ndCByZXNldCB0aW1lIGluIGZsdXNoLXN0b3AKKwkgIERvbid0IHJlc2V0IHRoZSB0aW1lIGluIGZsdXNoLXN0b3AuIExpdmUgc291cmNlcyBjYW4gZG8gdGhpcyBmbHVzaCBpbiB0aGUKKwkgIHBsYXlpbmcgc3RhdGUgYW5kIHNvIHRoZSBwaXBlbGluZSB3aWxsIG5ldmVyIGhhdmUgYSBjaGFuY2UgdG8gdXBkYXRlIHRoZQorCSAgYmFzZV90aW1lIG9mIHRoZSBlbGVtZW50cywgd2hpY2ggb25seSBoYXBwZW5zIHdoZW4gZ29pbmcgZnJvbSBwYXVzZWQgdG8KKwkgIHBsYXlpbmcuCisKKzIwMTItMDYtMTIgMTI6NDI6MzEgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5oOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeHJpbmdidWZmZXIuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hyaW5nYnVmZmVyLmg6CisJICBvc3hhdWRpb3Npbms6IEFkZCBzdXBwb3J0IGZvciBTUERJRiBvdXRwdXQKKwkgIEEgYmlnIHJlZmFjdG9yaW5nIHRvIGFsbG93IHBhc3N0aHJvdWdoIEFDMy9EVFMgb3ZlciBTUERJRi4KKwkgIFNldmVyYWwgcmFuZG9tIGNsZWFudXBzIGFuZCBtaW5vciBmaXhlcy4KKworMjAxMS0wOS0wMSAxNTo0MToyNiArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJICBkZWludGVybGFjZTogc2VuZCBRb1MgbWVzc2FnZXMgd2hlbiBkcm9wcGluZyBhIGZyYW1lCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU3OTQxCisKKzIwMTItMDYtMTIgMTY6MDU6NDAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IFJld29yayB0aGUgYXN5bmMgc3RhdGUgaGFuZGxpbmcKKwkgIEFsd2F5cyBzZW5kIHRoZSBmbHVzaGluZyBldmVudHMgdG8gdGhlIHVkcCBlbGVtZW50cyBub3cgdGhhdCBiYXNlc3JjIHN1cHBvcnRzCisJICB0aGlzLiBUaGlzIG1ha2VzIHN1cmUgYSBzZWdtZW50IGV2ZW50IGlzIHNlbnQgY29ycmVjdGx5IGFmdGVyIGEgZmx1c2guCisJICBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbW1hbmQgYW5kIG1ha2UgaXQgcG9zc2libGUgdG8gc3BlY2lmeQorCSAgd2hhdCBjb21tYW5kIHlvdSB3YW50IHRvIGNhbmNlbCB3aGVuIHN0YXJ0aW5nIGEgbmV3IGFzeW5jIGNvbW1hbmQuCisJICBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NzkwNQorCisyMDEyLTA2LTExIDE4OjI0OjIwICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIGNoaWxkcHJveHk6IHVwZGF0ZSBhcGkgdXNlCisKKzIwMTItMDYtMTEgMTI6NTQ6MjcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGFsd2F5cyBwZXJmb3JtIGZ1bGwgc2VlayBpZiBzZWVrIGlzIGZsdXNoaW5nCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc3ODM4CisKKzIwMTItMDYtMTEgMTE6MjA6MTggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJICBybmRidWZmZXJzaXplOiBwcmludGYgZm9ybWF0IGZpeCBmb3IgbG9uZyAtPiBpbnQgY2hhbmdlCisKKzIwMTItMDYtMDggMjA6Mzg6MzQgKzAyMDAgIEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJvYmplY3Q6IERvbid0IHByb2JlIFVWQyBkZXZpY2VzIGZvciBiZWluZyBpbnRlcmxhY2VkCisJICBVVkMgZGV2aWNlcyBhcmUgbmV2ZXIgaW50ZXJsYWNlZCwgYW5kIGRvaW5nIFZJRElPQ19UUllfRk1UIG9uIHRoZW0KKwkgIGNhdXNlcyBleHBlbnNpdmUgYW5kIHNsb3cgVVNCIElPLCBzbyBkb24ndCBwcm9iZSB0aGVtIGZvciBpbnRlcmxhY2VkLgorCSAgVGhpcyBzaGF2ZXMgMiBzZWNvbmRzIG9mIHRoZSBzdGFydHVwIHRpbWUgb2YgY2hlZXNlIHdpdGggYSBMb2dpdGVjaAorCSAgV2ViY2FtIFBybyA5MDAwLgorCSAgU2lnbmVkLW9mZi1ieTogSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Nzc3MjIKKworMjAxMi0wNi0wOSAxNjo1Mzo1NCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYzoKKwkgIGRlYnVnOiBjaGFuZ2Ugcm5kYnVmZmVyc2l6ZSBwcm9wZXJ0aWVzIGZyb20gbG9uZyB0byBpbnQKKwkgIFRoZXNlIHNob3VsZCBhbGwgYmUgaW50IGluc3RlYWQgb2YgbG9uZywgdG8gYXZvaWQgYnVncworCSAgd2hlbiBwYXNzaW5nIHRoZXNlIGFzIHZhcmFyZ3Mgd2l0aCBnX29iamVjdF9zZXQoKSwgYW5kCisJICB0aGVyZSB3YXMgbm8gcmVhc29uIHRvIHVzZSBsb25nIGluIHRoZSBmaXJzdCBwbGFjZSBoZXJlLgorCSAgRml4ZXMgRklYTUUuCisKKzIwMTItMDYtMDggMTU6NTQ6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSogZ3N0L3J0c3AvZ3N0cnRwZGVjLmM6CisJICBlbGVtZW50czogVXNlIGdzdF9wYWRfc2V0X2NhcHMoKSBpbnN0ZWFkIG9mIG1hbnVhbCBldmVudCBmaWRkbGluZworCisyMDEyLTA2LTA4IDE1OjA0OjU5ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDAzYTBlNTcgdG8gOThlMzg2ZgorCisyMDEyLTA2LTA4IDEwOjExOjEyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSogc3lzL29zczQvb3NzNC1hdWRpby5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW50ZXJsZWF2ZS5jOgorCSAgdXBkYXRlIGZvciBhdWRpbyBhcGkgY2hhbmdlCisKKzIwMTItMDYtMDcgMTY6MTI6MzQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDAuMTEuOTIgPT09CisKKzIwMTItMDYtMDcgMTY6MTI6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAwLjExLjkyCisKKzIwMTItMDYtMDcgMTY6MTE6MTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxMi0wNi0wNyAxNTowMzowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogaW1wcm92ZSBjbG9jayBoYW5kbGluZworCSAgUG9zdCB0aGUgbm90aWZ5IG91dHNpZGUgb2YgdGhlIHBhX2xvY2sgdG8gYXZvaWQgYSBkZWFkbG9jayBjYXVzZWQgYnkgYmFzZXNyYworCSAgY2FsbGluZyBnZXRfdGltZSB3aXRoIHRoZSBvYmplY3QgbG9jay4KKwkgIFJlc2V0IHRoZSBjbG9jayBvbiBjb25uZWN0LgorCSAgUG9zdCBjbG9jay1sb3N0IGFuZCBjbG9jay1wcm92aWRlIG1lc3NhZ2VzLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3Mzk3NworCSAgQ29uZmxpY3RzOgorCSAgZXh0L3B1bHNlL3B1bHNlc3JjLmMKKworMjAxMi0wNC0xMiAxMzoyMToxNyArMDMwMCAgTW9oYW1tZWQgU2FtZWVyIDxtc2FtZWVyQGZvb2xhYi5vcmc+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgQmV0dGVyIEdzdENsb2NrIGZvciBwdWxzZXNyYworCSAgVGhpcyBjbG9jayB1c2VzIHRoZSBhY3R1YWwgc3RyZWFtIHRpbWUgKHBhX3N0cmVhbV9nZXRfdGltZSkgdG8gZ2V0IGEgbW9yZSBhY2N1cmF0ZSB0aW1lc3RhbXAuCisJICBDb25mbGljdHM6CisJICBleHQvcHVsc2UvcHVsc2VzcmMuYworCisyMDEyLTA2LTA3IDExOjE2OjUwICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJICBwbmc6IGZpeCB2aWRlbyBzdGF0ZSBsZWFrcworCisyMDEyLTA2LTA3IDExOjE2OjM3ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogZml4IHZpZGVvIHN0YXRlIGxlYWsKKworMjAxMi0wNi0wNyAxMjoxMToxNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogb25seSByZXNldCB0aGUgbWFuYWdlciBvYmplY3Qgd2hlbiB3ZSBkaWQgYSBzZWVrCisJICBPbmx5IHJlc2V0IHRoZSBtYW5hZ2VyIG9iamVjdCB3aGVuIHdlIHVzZWQgYSBSYW5nZSBoZWFkZXIsIGllLiB3aGVuIHdlIGRpZCBhCisJICBzZWVrLiBPdGhlcndpc2Ugd2UganVzdCBwYXVzZWQgYW5kIHdlIGNhbiByZXN1bWUganVzdCBmaW5lLgorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NzQ3NQorCisyMDEyLTA2LTA2IDE2OjEzOjI5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW4uYzoKKwkgIHRlc3RzOiBhZGQgdGVzdCBmb3IgcnRwc2Vzc2lvbiBjbGVhbnVwCisKKzIwMTItMDYtMDYgMTg6MTg6NDEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMWZhYjM1OSB0byAwM2EwZTU3CisKKzIwMTItMDYtMDYgMTQ6MTc6MDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFVwZGF0ZSBmb3IgVE9DIGV2ZW50IEFQSSBjaGFuZ2UKKworMjAxMi0wNi0wNiAxMzowMjoxMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlzdWJ0aXRsZS5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0dGFnaW5qZWN0LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmd2b2x1bWUuYzoKKwkgIHVwZGF0ZSBmb3IgdGFnIGV2ZW50IGNoYW5nZQorCisyMDEyLTA2LTA2IDEzOjAwOjU4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FzcGVjdHJhdGlvY3JvcC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6CisJICBmaXggWTgwMCBmb3JtYXQKKworMjAxMi0wNi0wMSAwMToxOTozNSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cuaDoKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvOiBzdHJhaWdodGZvcndhcmQgcG9ydCB0byAwLjExCisKKzIwMTItMDUtMzEgMTg6Mzk6MjUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkgIFNvbWUgcHJpbnRmIHZhcmlhYmxlIGZvcm1hdCBmaXhlcworCSAgVGhlIG9zeCBjb21waWxlciBjb21wbGFpbnMgYWJvdXQgdGhvc2UKKworMjAxMi0wNi0wNSAwOToxODoxMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgYXVkaW9wYXJzZXJzOiBGaXggR3N0QmFzZVBhcnNlOjpnZXRfc2lua19jYXBzKCkgaW1wbGVtZW50YXRpb25zCisJICBUaGV5IHNob3VsZCB0YWtlIHRoZSBmaWx0ZXIgY2FwcyBpbnRvIGFjY291bnQgYW5kIGFsd2F5cyByZXR1cm4KKwkgIHRoZSB0ZW1wbGF0ZSBjYXBzIGFwcGVuZGVkIHRvIHRoZSBhY3R1YWwgY2Fwcy4gT3RoZXJ3aXNlIHRoZQorCSAgcGFyc2VycyBzdG9wIHRvIGFjY2VwdCB1bnBhcnNlZCBzdHJlYW1zIHdoZXJlIHVwc3RyZWFtIGRvZXMgbm90CisJICBrbm93IGFib3V0IGNoYW5uZWxzLCByYXRlLCBldGMuCisJICBGaXhlcyBidWcgIzY3NzQwMS4KKworMjAxMi0wNi0wNCAxNjoxNzo1MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogc2V0IGNvbG9yaW1ldHJ5IG9uIG91dHB1dCBpbmZvCisKKzIwMTItMDYtMDQgMDg6MTA6MTUgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeHJpbmdidWZmZXIuYzoKKwkgIG9zeGF1ZGlvc2luazogSGFuZGxlIGVuZGlhbm5lc3MgY29ycmVjdGx5CisKKzIwMTItMDYtMDEgMTY6Mzc6MDAgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeHJpbmdidWZmZXIuYzoKKwkgIG9zeGF1ZGlvc2luazogQWRkIHN1cHBvcnQgZm9yIGludCBhdWRpbworCisyMDEyLTA2LTAxIDEwOjI4OjUzICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGYxYjVhOTYgdG8gMWZhYjM1OQorCisyMDEyLTA1LTMxIDEzOjM2OjMyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHNldCB0aGUgcGFsZXR0ZSBzaXplIGNvcnJlY3RseQorCisyMDEyLTA1LTMxIDEwOjE1OjQzICswMjAwICBNaWNoYWVsIEpvbmVzIDxtaWNoYWVsLmpvbmVzQG1hdHJpeC12aXNpb24uZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ2aWRvcmllbnQuaDoKKwkgIHY0bDI6IGFkZCBtaXNzaW5nIEdfRU5EX0RFQ0xTCisJICBHX0JFR0lOX0RFQ0xTIGRpZG4ndCBoYXZlIG1hdGNoaW5nIEdfRU5EX0RFQ0xTCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc3MTY1CisKKzIwMTItMDUtMzEgMTM6MDg6MTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gOTJiNzI2NiB0byBmMWI1YTk2CisKKzIwMTItMDUtMzEgMTA6MjY6MjcgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSAgb3N4dmlkZW9zaW5rOiBSZWFsbHkgZml4IHRoZSBidWlsZCBvbiAxMC41CisJICBUaGUgQVBJIHRoYXQgd2UgdXNlIHRvIHJ1biB0aGUgQ29jb2EgbG9vcCBpbiBhbm90aGVyCisJICB0aHJlYWQgZG9lcyBub3QgZXhpc3QgaW4gMTAuNSBvciBlYXJsaWVyLgorCisyMDEyLTA1LTI2IDEyOjIxOjE4ICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kZWNpbmFAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IGZpeCByYWNlIGluIHN0YXJ0aW5nIHRoZSBydW5sb29wIHRocmVhZAorCSAgQmxvY2sgZ3N0X29zeF92aWRlb19zaW5rX3J1bl9jb2NvYV9sb29wIHVudGlsIHRoZSBsb29wIHRocmVhZCBoYXMgc3RhcnRlZCBhbmQKKwkgIGZpbmlzaGVkIGluaXRpYWxpemluZyBOU0FwcC4gRml4ZXMgb2NjYXNpb25hbCB3YXJuaW5ncy9jcmFzaGVzIGR1ZSB0byB0d28KKwkgIHRocmVhZHMgZ29pbmcgaW5zaWRlIE5TQXBwIGJlZm9yZSBmaW5pc2hMYXVuY2hpbmcgaGFkIGNvbXBsZXRlZC4KKworMjAxMi0wNS0zMCAxNjowMzo1NSArMDIwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJICBvc3h2aWRlb3Npbms6IEZpeCBsYXN0IGNvbW1pdCB0byBhY3R1YWxseSB3b3JrCisJICBNQUNfT1NfWF9WRVJTSU9OXzEwXzYgaXMgb2J2aW91c2x5IG5vdCBkZWZpbmVkIG9uIDEwLjUuCisKKzIwMTItMDUtMzAgMTM6NTE6MzUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvb3N4dmlkZW8vTWFrZWZpbGUuYW06CisJICBvc3h2aWRlb3Npbms6IFB1dCB0aGUgcmlnaHQgZmxhZ3MgaW4gdGhlIHJpZ2h0IHZhcmlhYmxlCisKKzIwMTItMDUtMzAgMTM6MjQ6MDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IEZpeCBHU1RfT0JKQ0ZMQUdTCisKKzIwMTItMDUtMzAgMTI6NDU6MjMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZWMxYzRhOCB0byA5MmI3MjY2CisKKzIwMTItMDUtMzAgMTI6NDM6MzcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJICBvc3h2aWRlb3Npbms6IE5TV2luZG93RGVsZWdhdGUgaXMgYXZhaWxhYmxlIGluIGFsbCBPU1ggdmVyc2lvbnMgbmV3ZXIgdGhhbiAxMC42CisKKzIwMTItMDUtMzAgMTI6NDA6NTcgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSAgb3N4dmlkZW9zaW5rOiBGaXggYnVpbGQgd2l0aCBvbGRlciBPU1ggdmVyc2lvbnMKKworMjAxMi0wNS0zMCAxMTowOToyNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHN5cy9vc3h2aWRlby9NYWtlZmlsZS5hbToKKwkgIGNvbmZpZ3VyZTogQWRkIE9CSkMgc3BlY2lmaWMgY29tcGlsZXIgZmxhZ3MKKwkgIFNlZSBidWcgIzY0MzkzOS4KKworMjAxMi0wNS0zMCAxMToyMzozNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSAzNDI5YmE2IHRvIGVjMWM0YTgKKworMjAxMi0wNS0yOSAxNzo1MDoyMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkgIHZpZGVvOiByZW1vdmUgZHVwbGljYXRlIGZvcm1hdAorCisyMDEyLTA1LTI5IDE2OjUyOjAyICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IFBvc3QgZXJyb3IgbWVzc2FnZSBpZiBFT1MgYmVmb3JlIHBhZHMgd2VyZSBjcmVhdGVkCisJICBIYXBwZW5zIHdpdGggc29tZSBmaWxlcyB3aXRoIG9ubHkgaGVhZGVycworCisyMDEyLTA1LTI4IDE1OjIyOjI2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmg6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuaDoKKwkgIHBuZzogUG9ydCB0byAwLjExIGFnYWluCisKKzIwMTItMDUtMTQgMTI6NDY6NTcgKzAyMDAgIEplbnMgR2VvcmcgPG1haWxAamVuc2dlLm9yZz4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXA6IERyb3AgdHJhbnNmZXJNb2RlLmRsbmEub3JnIGhlYWRlcgorCSAgTGVhdmUgaXQgdG8gdGhlIGFwcGxpY2F0aW9uIHRvIGRlY2lkZSBvbiB0aGUgaGVhZGVyLiBObyBoZWFkZXIgYXQgYWxsCisJICBpcyBiZXR0ZXIgdGhhbiBoYXZpbmcgdGhlIHdyb25nIGhlYWRlciBhcyBETE5BIG1hbmRhdGVzIHRoYXQgYSBtaXNzaW5nCisJICBoZWFkZXIgaGFzIHRvIGJlIHRvbGVyYXRlZCB3aGlsZSBhIHdyb25nIGhlYWRlciBpcyBhbiBlcnJvci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzYwMjAKKworMjAxMi0wNC0wNyAwOTo1MjowOSArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5oOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmg6CisJICBwbmc6IFBvcnQgdG8gYmFzZSB2aWRlbyBjbGFzc2VzCisJICBDb25mbGljdHM6CisJICBleHQvbGlicG5nL2dzdHBuZ2RlYy5jCisJICBleHQvbGlicG5nL2dzdHBuZ2RlYy5oCisJICBleHQvbGlicG5nL2dzdHBuZ2VuYy5jCisJICBleHQvbGlicG5nL2dzdHBuZ2VuYy5oCisJICBSZXZlcnRlZCB0byAwLjEwLCBuZWVkcyB0byBiZSBwb3J0ZWQgYWdhaW4uCisKKzIwMTItMDUtMjcgMDA6MDI6MDggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBmbHYsIG1hdHJvc2thOiBkb24ndCB1c2UgR3N0U3RydWN0dXJlIEFQSSBvbiB0YWcgbGlzdHMKKworMjAxMi0wNS0yNiAxMTo1NzoxNiArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJICBydHBtcDJ0ZGVwYXk6IE9ubHkgb3V0cHV0IGludGVncmFsIG1wZWctdHMgcGFja2V0cworCSAgRnJvbSBSRkMgMjI1MAorCSAgMi4gRW5jYXBzdWxhdGlvbiBvZiBNUEVHIFN5c3RlbSBhbmQgVHJhbnNwb3J0IFN0cmVhbXMKKwkgIC4uLgorCSAgRm9yIE1QRUcyIFRyYW5zcG9ydCBTdHJlYW1zIHRoZSBSVFAgcGF5bG9hZCB3aWxsIGNvbnRhaW4gYW4gaW50ZWdyYWwKKwkgIG51bWJlciBvZiBNUEVHIHRyYW5zcG9ydCBwYWNrZXRzLiAgVG8gYXZvaWQgZW5kIHN5c3RlbQorCSAgaW5lZmZpY2llbmNpZXMsIGRhdGEgZnJvbSBtdWx0aXBsZSBzbWFsbCBNVFMgcGFja2V0cyAobm9ybWFsbHkgZml4ZWQKKwkgIGluIHNpemUgYXQgMTg4IGJ5dGVzKSBhcmUgYWdncmVnYXRlZCBpbnRvIGEgc2luZ2xlIFJUUCBwYWNrZXQuICBUaGUKKwkgIG51bWJlciBvZiB0cmFuc3BvcnQgcGFja2V0cyBjb250YWluZWQgaXMgY29tcHV0ZWQgYnkgZGl2aWRpbmcgUlRQCisJICBwYXlsb2FkIGxlbmd0aCBieSB0aGUgbGVuZ3RoIG9mIGFuIE1UUyBwYWNrZXQgKDE4OCkuCisJICAuLi4uCisJICBTaW5jZSBpdCBuZWVkcyB0byBjb250YWluICJhbiBpbnRlZ3JhbCBudW1iZXIgb2YgTVBFRyB0cmFuc3BvcnQgcGFja2V0cyIsIGEKKwkgIHNpbXBsZSBmaXggaXMgdG8gY2hlY2sgdGhhdCdzIHRoZSBjYXNlLCBhbmQgc3RyaXAgb2ZmIGFueSBsZWZ0b3ZlciBkYXRhLgorCSAgRml4ZXMgIzY3Njc5OQorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYworCisyMDEyLTA1LTI0IDIwOjQzOjE2ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cuaDoKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5tOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiBtYWtlIHN1cmUgYWxsIHNlbGVjdG9ycyBhcmUgcGVyZm9ybWVkIG9uIHRoZSBzYW1lIHRocmVhZAorCSAgV2hlbiB3ZSBhcmUgdXNpbmcgYSBkZWRpY2F0ZWQgdGhyZWFkIHRvIHJ1biB0aGUgbWFpbiBydW4gbG9vcCB3ZQorCSAgbXVzdCBtYWtlIHN1cmUgdGhhdCBhbGwgc2VsZWN0b3JzIGFyZSBwZXJmb3JtZWQgb24gdGhpcyBzYW1lIHRocmVhZC4KKwkgIEZvciBpbnN0YW5jZSBpZiBwZXJmb3JtU2VsZWN0b3JPbk1haW5UaHJlYWQgaXMgY2FsbGVkIGZyb20gdGhlIHJlYWwKKwkgIG1haW4gdGhyZWFkLCBpdCB3aWxsIG5vdCBnbyB0aHJvdWdoIHRoZSBtZXNzYWdlIHF1ZXVlIGFuZCB3aWxsIGJlCisJICBleGVjdXRlZCBmcm9tIHRoZSByZWFsIG1haW4gdGhyZWFkLiBCeSBmb3JjaW5nIHRoZSB0YXJnZXQgdGhyZWFkLAorCSAgd2UgZW5zdXJlIHRoYXQgYWxsIGZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZCBlaXRoZXIgZnJvbSB0aGUgcmVhbAorCSAgbWFpbiB0aHJlYWQgd2hlbiB0aGUgbWFpbiBydW4gbG9vcCBpcyBydW5uaW5nIG9yIGZyb20gb3VyIHRocmVhZAorCSAgc3Bpbm5pbmcgdGhlIG1haW4gbG9vcC4KKworMjAxMi0wNS0yNCAxNjowOTo1NCArMDIwMCAgTWF0aGlhcyBIYXNzZWxtYW5uIDxtYXRoaWFzLmhhc3NlbG1hbm4gYXQgZ214LmRlPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiByZW1vdmUgZnJhbWVyYXRlCisJICBUaGUganBlZyBkZWNvZGVyIGRvZXNuJ3QgbmVlZC9jYXJlIGFib3V0IHRoZSBmcmFtZXJhdGUgdG8gc28gaXQgc2hvdWxkCisJICBub3QgYmUgaW4gdGhlIGNhcHMuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc2MzAyCisKKzIwMTItMDUtMjQgMTM6MDg6MzUgKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRlY2luYUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogc3RhcnQgdGhlIGxvb3AgYmVmb3JlIGNhbGxpbmcgW2dzdHZpZXcgaGF2ZVN1cGVydmlld10KKwkgIC4uLmFzIGhhdmVTdXBlcnZpZXcgcmVxdWlyZXMgdGhlIG1haW5sb29wIHRvIGJlIHJ1bm5pbmcKKworMjAxMi0wNS0yNCAxMzowODoxMyArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZGVjaW5hQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiBmaXggaW5kZW50YXRpb24KKworMjAxMi0wNS0yMiAxNjo0NzozNiArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZGVjaW5hQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zeHZpZGVvL01ha2VmaWxlLmFtOgorCSAgb3N4dmlkZW9zaW5rOiBlbmFibGUgcnVubmluZyB0aGUgY29jb2EgbWFpbiBydW5sb29wIGluIGEgdGhyZWFkCisKKzIwMTItMDUtMjIgMTY6NDU6MjggKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRlY2luYUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogYWRkIGNvZGUgdG8gb3B0aW9uYWxseSBydW4gdGhlIGNvY29hIG1haW4gcnVubG9vcCBpbiBhIHNlcGFyYXRlIHRocmVhZAorCSAgQWRkIGEgbGl0dGxlIGhhY2sgdG8gcnVuIHRoZSBjb2NvYSBtYWluIHJ1bmxvb3AgZnJvbSBhIHNlcGFyYXRlIHRocmVhZCBfd2hlbl8KKwkgIHRoZSBtYWluIHJ1bmxvb3AgaXMgbm90IGJlaW5nIHJ1biAod2hpY2ggbWVhbnMgdGhhdCB0aGUgYXBwIGRvZXNuJ3QgdXNlIGNvY29hKS4KKwkgIFJ1bmxvb3BzIGFyZSB0aHJlYWQgc3BlY2lmaWMsIHNvIHRoZSBoYWNrIGJvaWxzIGRvd24gdG8gZ2V0dGluZyB0aGUgcnVubG9vcCBmb3IKKwkgIHRoZSBtYWluIHRocmVhZCBhbmQgc2V0dGluZyBpdCBhcyB0aGUgcnVubG9vcCBmb3Igb3VyIGRlZGljYXRlZCB0aHJlYWQuCisKKzIwMTItMDUtMjIgMTY6MzI6NTMgKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRlY2luYUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogcmVzZXQgYXBwX3N0YXJ0ZWQgdG8gRkFMU0Ugd2hlbiBzaHV0dGluZyBkb3duCisKKzIwMTItMDUtMjIgMTQ6NDk6MTcgKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRlY2luYUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogcmVuYW1lIGNvY29hIHJ1bmxvb3AgaGVscGVyIGZ1bmNzCisKKzIwMTItMDUtMjIgMTQ6MjY6MTMgKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRlY2luYUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogZG9uJ3QgY3JlYXRlIGFwcGxpY2F0aW9uIG1lbnVzCisKKzIwMTItMDUtMTYgMjE6NTI6NDUgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogcmVzZXQgdGhlIGVtYmVkIHByb3BlcnR5IGZvciBiYWNrd2FyZCBjb21wYXRpbGliaXR5CisKKzIwMTItMDUtMTYgMjE6MTI6MjIgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IGZpeCBuYXZpZ2F0aW9uIHdoZW4gZm9yY2UtYXNwZWN0LXJhdGlvIGlzIGFjdGl2YXRlZAorCisyMDEyLTA1LTE2IDE4OjUyOjQ1ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cuaDoKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5tOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiBhZGQgZm9yY2UtYXNwZWN0LXJhdGlvIHByb3BlcnR5CisKKzIwMTItMDUtMTQgMTg6MDE6MDIgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IHN0YXJ0IGludGVybmFsIHdpbmRvdyBpZiBubyB2aWV3IGlzIHByb3ZpZGVkCisKKzIwMTItMDUtMTQgMTQ6Mjc6NTggKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8eWxhdHV5YUBnbWFpbC5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBvc3h2aWRlb3Npbms6IGltcGxlbWVudCB0aGUgbmF2aWdhdGlvbiBpbnRlcmZhY2UKKworMjAxMi0wNS0xMSAxODoyNDowOCArMDIwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N2aWRlb3Npbms6IGNyZWF0ZSwgZGVzdHJveSwgcmVzaXplIGFuZCBkcmF3IGZyb20gdGhlIG1haW4gdGhyZWFkCisKKzIwMTItMDQtMTkgMDg6Mzc6MjggKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGluY3JlYXNlIE5FV1NFR01FTlQgYWNjdXJhY3kgYWZ0ZXIgc2Vla2luZworCSAgZGVtdXgtPmNvbW1vbi5zZWdtZW50IGlzIHBvcHVsYXRlZCBkdXJpbmcgc2VlayBoYW5kbGluZyB3aXRoIHRoZSB0YXJnZXQKKwkgIHN0YXJ0L3N0b3AgcG9zaXRpb25zLiBEb24ndCBvdmVycmlkZSB0aGVtIHdoZW4gc2VuZGluZyBvdXQgYSBORVdTRUdNRU5ULgorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmMKKworMjAxMi0wNC0xOSAwODozMTowMCArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZEBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogZG9uJ3QgZGlzY2FyZCB0aGUgaW5jb21pbmcgc2VlayBzZWdtZW50IG9uIHB1c2ggYmFzZWQgc2Vla2luZworCSAgVGhlIGluY29taW5nIHNlZWsgc2VnbWVudCB3YXMgYmVpbmcgZGlzY2FyZGVkIGxlYWRpbmcgdG8gcHVzaCBiYXNlZCBzZWVraW5nCisJICBiZWluZyBwb3RlbnRpYWxseSBpbmFjY3VyYXRlLgorCisyMDEyLTA1LTIzIDE4OjEyOjI0ICswMjAwICBTZWJhc3RpYW4gUmFzbXVzc2VuIDxzZWJybkBheGlzLmNvbT4KKworCSogY29tbW9uOgorCSAgY29tbW9uOiBVcGRhdGUgc28gdGhlIHBsdWdpbiBzY2FubmVyIGNoYW5nZXMgYXJlIGluY2x1ZGVkCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc2Njc0CisKKzIwMTItMDUtMjMgMTg6MDc6MzUgKzAyMDAgIFNlYmFzdGlhbiBSYXNtdXNzZW4gPHNlYnJuQGF4aXMuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IHN1cHByZXNzIHNvbWUgd2FybmluZ3Mgd2hlbiBkZWJ1ZyBpcyBkaXNhYmxlZAorCSAgV2FybmluZ3MgYWJvdXQgdW51c2VkIHZhcmlhYmxlcyBzaG91bGQgYmUgc3VwcHJlc3NlZCBpZiBjb3JlIGhhcyB0aGUKKwkgIGRlYnVnIHN5c3RlbSBkaXNhYmxlZC4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzY2NzEKKworMjAxMi0wNS0yNCAwOToyOToyNSArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHA6IGZpeCBidWlsZCBpc3N1ZSBpbiBnc3RydHBoMjY0cGF5LmMKKworMjAxMi0wNS0yMSAxMjoxNzozNSArMDIwMCAgSm9uYXMgSG9sbWJlcmcgPGpvbmFzaGdAYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogQWRkIHVucmVzdHJpY3RlZCBjYXBzCisJICBJZiB0aGVyZSBhcmUgbm8gcHJvZmlsZSByZXN0cmljdGlvbnMgZG93bnN0cmVhbSwgcmV0dXJuIGNhcHMgd2l0aAorCSAgcHJvZmlsZT1jb25zdHJhaW5lZC1iYXNlbGluZSBpbiB0aGUgZmlyc3Qgc3RydWN0dXJlIGFuZCBhcHBlbmQKKwkgIHVucmVzdHJpY3RlZCBjYXBzIGFzIHRoZSBsYXN0IHN0cnVjdHVyZS4KKwkgIEZpeGVzIGJ1ZyAjNjcyMDE5CisKKzIwMTItMDUtMjQgMDk6NTc6MzEgKzAyMDAgIE1hcmlhIEdpb3Zhbm5hIENoaW9zc2EgPG1hcmlhZ2lvdmFubmEuY2hpb3NzYSBhdCBzZWxleGVsc2FnLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcDogYWRkIHRoZSBTY2FsZSBoZWFkZXIgd2hlbiBuZWVkZWQKKwkgIFNldHRpbmcgR1NUX1NFRUtfRkxBR19TS0lQIHdoZW4gc2VuZGluZyBhIHNlZWsgZXZlbnQgaW4gcnRzcHNyYyBzaG91bGQKKwkgIHNldCB0aGUgIlNjYWxlIiBmaWVsZCBpbiB0aGUgcnRzcCBQTEFZIGhlYWRlci4KKwkgIEJlY2F1c2UgdGhlIGJvb2xlYW4gInNyYy0+c2tpcCIgaXMgc2V0IGFmdGVyIHRoZSBjYWxsLCAiU3BlZWQiIGluc3RlYWQKKwkgIG9mICJTY2FsZSIgaXMgYWx3YXlzIHNldC4gTW92ZSB0aGUgYXNzaWdubWVudCBiZWZvcmUgaXNzdWluZyB0aGUgX3BsYXkKKwkgIHJlcXVlc3QuCisJICBGaXhlcyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njc2NjE4CisKKzIwMTItMDUtMTcgMTY6MjM6NTkgKzAzMDAgIFNyZWVyZW5qIEJhbGFjaGFuZHJhbiA8c3JlZXJlbmouYmFsYWNoYW5kcmFuQGludGVsLmNvbT4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogRml4IHRoZSBzYW1wbGUgcGlwZWxpbmUuCisKKzIwMTItMDUtMjIgMTI6MzU6MDQgKzA0MDAgIEFudG9uIE5vdmlrb3YgPHJhbmRvbS5wbGFudEBnbWFpbC5jb20+CisKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSAgaWN5ZGVtdXg6IHdhcm5pbmcgaWYgc2V0dGluZyBzcmNwYWQgY2FwcyBmYWlscworCisyMDEyLTA1LTIyIDEyOjM1OjI5ICswNDAwICBBbnRvbiBOb3Zpa292IDxyYW5kb20ucGxhbnRAZ21haWwuY29tPgorCisJKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzoKKwkgIGljeWRlbXV4OiBhY3RpdmF0ZSBzcmNwYWQgYmVmb3JlIHNldHRpbmcgY2FwcworCSAgQmVmb3JlIGdzdF9wYWRfc2V0X2FjdGl2ZSgpIGlzIGNhbGxlZCwgdGhlIHBhZCBoYXMKKwkgIEZMVVNISU5HIGZsYWcgc2V0LCBzbyBzZXR0aW5nIHRoZSBjYXBzIGZhaWxzCisKKzIwMTItMDUtMjIgMTM6NDY6MjcgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkqIGV4dC9saWJtbmcvTWFrZWZpbGUuYW06CisJKiBleHQvbGlibW5nL2dzdG1uZy5jOgorCSogZXh0L2xpYm1uZy9nc3RtbmcuaDoKKwkqIGV4dC9saWJtbmcvZ3N0bW5nZGVjLmM6CisJKiBleHQvbGlibW5nL2dzdG1uZ2RlYy5oOgorCSogZXh0L2xpYm1uZy9nc3RtbmdlbmMuYzoKKwkqIGV4dC9saWJtbmcvZ3N0bW5nZW5jLmg6CisJICBtbmc6IHJlbW92ZSBleHQvbGlibW5nCisJICBQb3J0IHRvIDAuMTAgd2FzIG5ldmVyIGZpbmlzaGVkLgorCSAgSW50ZXJlc3Qgd2FzIGxvc3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzI0MzY0CisKKzIwMTItMDUtMTggMTY6Mzc6MDQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogZml4IGFzc2VydGlvbiB3aGVuIGhhbmRsaW5nIGEgZGF0ZSB0YWcgYXMgYSBzdHJpbmcKKwkgIERhdGUgdGFncyBhcmUgR0RhdGUsIG5vdCBzdHJpbmdzLiBBZGQgYSBzcGVjaWFsIGNhc2UgdG8gY29udmVydAorCSAgaXQgdG8gdGhlIGV4aWYgZGF0ZSBmb3JtYXQgcmVwcmVzZW50YXRpb24gaW4gc3RyaW5nIHRvIGF2b2lkCisJICB0aGUgYXNzZXJ0aW9uCisKKzIwMTItMDUtMjEgMTE6NDc6MDcgKzAyMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogTGlzdGVuIHRvIHNvdXJjZSBvdXRwdXQgZXZlbnRzLCBub3Qgc2luayBpbnB1dAorCisyMDEyLTA1LTE4IDEyOjUzOjQ0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmM6CisJICBydHBtcDJ0cGF5OiByZXNwZWN0IG10dSBhbmQgcGFja2V0IGJvdW5kYXJpZXMKKwkgIFNlZSAjNjU5OTE1LgorCisyMDEyLTA1LTE4IDExOjEwOjQ2ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZzogUmVtb3ZlIGRlYWQgY29kZQorCSAgQ29uZmxpY3RzOgorCSAgZXh0L2pwZWcvZ3N0anBlZ2RlYy5jCisKKzIwMTItMDUtMTggMTE6MDU6MzUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBGaXggY29tcGlsYXRpb24KKworMjAxMi0wNS0xOCAxMTowMjo1MiArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IFdoZW4gZHJvcHBpbmcgZnJhbWVzIG9uIEVPUywgZmx1c2ggb3V0IGRhdGEKKwkgIENsZWFuZXIgd2F5IG9mIGhhbmRsaW5nIHN0cmF5IGRhdGEKKworMjAxMi0wNS0xNyAwOTozNDowMyArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkgIGpwZWdkZWM6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9qcGVnL2dzdGpwZWdkZWMuYworCisyMDEyLTA1LTE3IDA5OjMzOjE4ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogT25seSBwYXJzZSBmb3IgU09JIHdoZW4gd2UgZGlkbid0IHNlZSBpdCBiZWZvcmUKKworMjAxMi0wNS0xNyAwOTozMTo0MSArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IFJlbWVtYmVyIGlmIHdlIHNhdyBTT0kgYW5kIGhhbmRsZSBzdHJheSBkYXRhIG9uIEVPUworCisyMDEyLTA1LTE1IDIwOjU4OjI1ICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkgIHJ0cGpwZWdwYXk6IEFsbG93IFUgYW5kIFYgY29tcG9uZW50cyB0byB1c2UgZGlmZmVyZW50IHF1YW50IHRhYmxlcyBpZiB0aGV5IGNvbnRhaW4gdGhlIHNhbWUgZGF0YQorCSAgVGhpcyBhbGxvd3Mgc29tZSBjYW1lcmFzIChMb2dpdGVjaCBDOTIwKSB0aGF0IHNwZWNpZnkgZGlmZmVyZW50IHF1YW50CisJICB0YWJsZXMgYnV0IGJvdGggd2l0aCB0aGUgc2FtZSBkYXRhLCB0byB3b3JrLgorCSAgQnVnIHJlcG9ydGVkIGJ5IFJvYmVydCBLcmFrb3JhCisKKzIwMTItMDUtMTQgMTU6NTE6MjkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IGZpeCBwb3NzaWJsZSBkYXRhIGNvcnJ1cHRpb24gYWZ0ZXIgc2Vla2luZworCSAgQ29uc2lkZXIgYSBkb3duc3RyZWFtIGVsZW1lbnQgdGhhdCBtYXkgaXNzdWUgc2Vla3MgaW4gdmVyeSBzaG9ydAorCSAgc3VjY2Vzc2lvbiAoZS5nLiBxdWV1ZTIpLCBkZXBlbmRpbmcgb24gdGhlIGFjY2VzcyBwYXR0ZXJuIG9mCisJICB0aGUgZG93bnN0cmVhbSBlbGVtZW50IChlLmcuIHF0ZGVtdXggd2l0aCBhdWRpby92aWRlbyBjaHVua3MKKwkgIGludGVybGVhdmVkIHNvIHRoYXQgdGhlcmUncyBhbHdheXMgYSBzaXplYWJsZSBnYXAgYmV0d2VlbiB0aGUKKwkgIGN1cnJlbnQgY2h1bmtzIGZvciBlYWNoIHN0cmVhbSkuIEluIHRoaXMgY2FzZSwgcXVldWUyIHdpbGwgbWFpbnRhaW4KKwkgIHR3byByYW5nZXMsIGFuZCBldmVuIHdoZW4gaXQgc2VydmVzIGEgY2h1bmsgZnJvbSBtZW1vcnksIGl0IHdpbGwKKwkgIHN3aXRjaCByYW5nZXMgYW5kIG1ha2Ugc291cGh0dHBzcmMgc2VlayB0byB0aGUgZW5kIG9mIHRoZSBhdmFpbGFibGUKKwkgIGRhdGEgZm9yIHRoYXQgcmFuZ2UsIGFzc3VtaW5nIHRoYXQgdGhhdCdzIHdoZXJlIHdlJ2xsIHdhbnQgdG8KKwkgIGNvbnRpbnVlIHJlYWRpbmcgZnJvbSBuZXh0LgorCSAgVGhpcyBtYXkgbGVhZCB0byB0aGUgZm9sbG93aW5nIHNlZWsgcmVxdWVzdCBwYXR0ZXJuOgorCSAgLSBzb3VyY2UgcmVhZGluZyBwb3NpdGlvbiBBCisJICAtIHNlZWsgdG8gQgorCSAgLSBub3cgcmVhZGluZyBwb3NpdGlvbiBzdGlsbCBBLCByZXF1ZXN0ZWRfcG9zdGlvbiBpcyBCCisJICAtIHN0cmVhbWluZyB0aHJlYWQgdG8gYmUgcmVzdGFydGVkIHRvIGNvbnRpbnVlIGZyb20gQgorCSAgLSBzZWVrIHRvIEEsIGJlZm9yZSBzdHJlYW1pbmcgdGhyZWFkIGhhZCB0aW1lIHRvIGRvIHRoZSBzZWVrCisJICAtIGRvX3NlZWsoKSBub3cgc2VlcyByZWFkaW5nIHBvc2l0aW9uID09IHNlZWsgcG9zaXRpb24gYW5kCisJICByZXR1cm5zIGVhcmx5LgorCSAgLSBob3dldmVyLCByZXF1ZXN0ZWQgcG9zaXRpb24gaXMgc3RpbGwgQiBmcm9tIHRoZSBlYXJsaWVyCisJICBzZWVrIHJlcXVlc3QKKwkgIC0gc3RyZWFtaW5nIHRocmVhZCBzdGFydHMgdXAsIHNlZXMgdGhhdCBhIHNlZWsgdG8gQiBpcyBwZW5kaW5nCisJICBhbmQgcmVxdWVzdHMgZGF0YSBmcm9tIEIgZnJvbSB0aGUgc2VydmVyLCB3aGlsZSB0aGUgR3N0QmFzZVNyYworCSAgc2VnbWVudCBoYXMgb2YgY291cnNlIGJlZW4gdXBkYXRlZC9yZXNldCB0byBwb3NpdGlvbiBBLCB3aGljaAorCSAgd2FzIHRoZSBsYXN0IHNlZWsgcmVxdWVzdC4KKwkgIC0gd2Ugd2lsbCBub3cgc2VuZCBkYXRhIGZvciBwb3NpdGlvbiBCIGFuZCBwcmV0ZW5kIHRoYXQncyB0aGUKKwkgIGRhdGEgZnJvbSBwb3NpdGlvbiBBICh2aWEgdGhlIG5ld3NlZ21lbnQgZXZlbnQsIGV0Yy4pCisJICAtIHRoaXMgY2F1c2VzIGRhdGEgY29ycnVwdGlvbgorCSAgUmVwcm9kdWNpYmxlIGRvaW5nIHNlZWstZW11bGF0ZWQgZmFzdC1mb3J3YXJkL2JhY2t3YXJkIG9uIDAwNjY0OC4KKworMjAxMi0wNS0xNiAwOToxMjo1NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogUmVxdWlyZSBjb3JlL2Jhc2UgMC4xMS45MQorCisyMDEyLTAxLTEzIDE4OjA5OjUwIC0wNTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiAuZ2l0aWdub3JlOgorCSAgLmdpdGlnbm9yZTogYWRkIHZpc3VhbCBzdHVkaW8gSURFIGZpbGVzIGFuZCBPUyBYIC5EU19TdG9yZSBmaWxlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2Nzg5OQorCisyMDEyLTA1LTAzIDA5OjMyOjUwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5oOgorCSAganBlZzogUG9ydCB0byAwLjExIGFnYWluCisKKzIwMTItMDQtMDYgMTI6MTM6MjQgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmg6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmg6CisJICBqcGVnOiBQb3J0IGpwZWdkZWMvanBlZ2VuYyB0byBiYXNlIHZpZGVvIGNsYXNzZXMKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9qcGVnL2dzdGpwZWdkZWMuYworCSAgZXh0L2pwZWcvZ3N0anBlZ2RlYy5oCisJICBleHQvanBlZy9nc3RqcGVnZW5jLmMKKwkgIGV4dC9qcGVnL2dzdGpwZWdlbmMuaAorCSAgUmV2ZXJ0ZWQgdG8gMC4xMCB2ZXJzaW9ucyBmb3Igbm93LCBuZXh0IHBvcnQgYWdhaW4uCisKKzIwMTItMDUtMTMgMTk6MjE6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2Fubm9kZXgvTWFrZWZpbGUuYW06CisJKiBleHQvYW5ub2RleC9nc3Rhbm5vZGV4LmM6CisJKiBleHQvYW5ub2RleC9nc3Rhbm5vZGV4Lmg6CisJKiBleHQvYW5ub2RleC9nc3RjbW1sZGVjLmM6CisJKiBleHQvYW5ub2RleC9nc3RjbW1sZGVjLmg6CisJKiBleHQvYW5ub2RleC9nc3RjbW1sZW5jLmM6CisJKiBleHQvYW5ub2RleC9nc3RjbW1sZW5jLmg6CisJKiBleHQvYW5ub2RleC9nc3RjbW1scGFyc2VyLmM6CisJKiBleHQvYW5ub2RleC9nc3RjbW1scGFyc2VyLmg6CisJKiBleHQvYW5ub2RleC9nc3RjbW1sdGFnLmM6CisJKiBleHQvYW5ub2RleC9nc3RjbW1sdGFnLmg6CisJKiBleHQvYW5ub2RleC9nc3RjbW1sdXRpbHMuYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWx1dGlscy5oOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGRlYy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGVuYy5jOgorCSAgYW5ub2RleDogcmVtb3ZlIGFubm9kZXggcGx1Z2luIGFuZCBDTU1MIGVsZW1lbnRzCisJICBUaGlzIG5ldmVyIHJlYWxseSB0b29rIG9mZiBhbmQgaXMgbW9zdCBsaWtlbHkgY29tcGxldGVseQorCSAgdW51c2VkLiBJZiB0aGVyZSBpcyBzdGlsbCBhIG5lZWQgZm9yIHRoaXMsIGl0IHNob3VsZAorCSAgcHJvYmFibHkgYmUgZG9uZSBkaWZmZXJlbnRseSwgcGVyaGFwcyBpbnNpZGUgb2dnZGVtdXgvbXV4LgorCisyMDEyLTA1LTEzIDE2OjU5OjU4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAwLjExLjkxID09PQorCisyMDEyLTA1LTEzIDE2OjMxOjAzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb21tb246CisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTEuOTEKKworMjAxMi0wNS0xMyAxNjozMDowMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDEyLTA1LTEzIDE1OjU2OjA1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGRjNzAyMDMgdG8gMzQyOWJhNgorCisyMDEyLTA1LTA5IDE1OjE0OjU1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jOgorCSAgcm5kYnVmZmVyc2l6ZTogb25seSBzZW5kIGZsdXNoLXN0b3AgaWYgaXQgd2FzIGEgZmx1c2hpbmcgc2VlaworCisyMDEyLTA1LTA5IDEyOjU0OjExICswMjAwICBQZXRlciBTZWlkZXJlciA8cHMucmVwb3J0QGdteC5uZXQ+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDJzcmM6IGZpeCB2NGwyX3N0ZF9pZCBsb2dnaW5nCisJICBpbnB1dC5zdGQgaXMgb2YgdHlwZSB2NGwyX3N0ZF9pZCB3aGljaCBpcyBkZWZpbmVkIGFzIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLgorCSAgQ2FzdGluZyB0byB1aW50IG1lYW5zIHRoZSBoaWdoZXIgYml0cywgd2ljaCBhcmUgdXNlZCBmb3IgdGhlIHByaXZhdGUgdmlkZW8KKwkgIHN0YW5kYXJkcyBvZiB0aGUgVEkgdmlkZW8gY2FwdHVyZS9kaXNwbGF5IGRyaXZlciBmb3IgZXhhbXBsZSwgYXJlIGxvc3QuCisKKzIwMTItMDUtMDkgMTI6MjQ6MzcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJICBybmRidWZmZXJzaXplOiBtdXN0IHNlbmQgZmx1c2gtc3RvcCBhZnRlciBhY3F1aXJpbmcgdGhlIHN0cmVhbSBsb2NrCisJICBPdGhlcndpc2UgdGhlIHN0cmVhbWluZyB0aHJlYWQgbWlnaHQganVzdCBrZWVwIG9uIGdvaW5nIGFuZCB3ZQorCSAgbWlnaHQgbmV2ZXIgZ2V0IHRoZSBzdHJlYW0gbG9jay4KKworMjAxMi0wNS0wOSAxMToxNToyMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYzoKKwkgIHJuZGJ1ZmZlcnNpemU6IHBvcnQgc2Vla2luZyBjb2RlIHRvIDAuMTEKKworMjAxMi0wNS0wOCAxOTowNzowNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYzoKKwkgIHJuZGJ1ZmZlcnNpemU6IGFkZCBzdXBwb3J0IGZvciBzZWVrcworCSAgVXNlZnVsIGZvciBlLmcuIGZpbGVzcmMgISBybmRidWZmZXJzaXplICEgcXVldWUyICEgLi4uCisKKzIwMTItMDUtMDggMTg6NDU6MzQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJICBybmRidWZmZXJzaXplOiBzZW5kIFNFR01FTlQgZXZlbnQgYmVmb3JlIHB1c2hpbmcgYnVmZmVycworCSAgQ29uZmxpY3RzOgorCSAgZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jCisKKzIwMTItMDUtMDkgMTE6MTU6NTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkgIGludGVybGVhdmU6IGZpeCBjb21waWxhdGlvbiBhZ2FpbgorCisyMDEyLTAxLTEzIDEwOjQ5OjQzICswMTAwICBQYXNjYWwgQnVobGVyIDxwYWJ1aGxlckBjaXNjby5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGNyZWF0aW9uIHNob3VsZCBiZSBzaWduYWxlZCBiZWZvcmUgdmFsaWRhdGlvbgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2Nzg1MAorCisyMDEyLTA1LTA0IDE1OjIwOjQ3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IGRvIG5vdCBwcm94eSBvdXIgZmlsdGVyIGNhcHMgZG93bnN0cmVhbSBvbiBjYXBzIHF1ZXJpZXMKKwkgIERvd25zdHJlYW0gbGlrZWx5IHdvbid0IGFjY2VwdCB2aWRlby94LXJhdyBhbmQgdGhlIGNhcHMgcXVlcnkKKwkgIHdpbGwgcmV0dXJuIEVNUFRZIGNhcHMuIEluc3RlYWQsIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGNhcHMgdGhhdAorCSAgaGFzIGFsbCBzdHJ1Y3R1cmUgbmFtZXMgcmVwbGFjZWQgYnkgJ2ltYWdlL2pwZWcnCisJICBTaW1wbGUgcGlwZWxpbmUgdGhhdCBzaG93cyB0aGUgcHJvYmxlbToKKwkgIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0xICEgInZpZGVvL3gtcmF3LCBcCisJICB3aWR0aD0oaW50KTY0MCwgaGVpZ2h0PShpbnQpNDgwIiAhIHZpZGVvc2NhbGUgISBqcGVnZW5jICEgXAorCSAgImltYWdlL2pwZWcsIHdpZHRoPShpbnQpODAwLCBoZWlnaHQ9KGludCk2MDAiICEgZmlsZXNpbmsgXAorCSAgbG9jYXRpb249L3RtcC9pbWFnZS5qcGcKKworMjAxMi0wNS0wMiAyMToxNzo0MyArMDIwMCAgQWxiYW4gQnJvd2FleXMgPHByYWhhbEB5YWhvby5jb20+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgaXNvbXA0OiBzZXQgbGF5b3V0PWludGVybGVhdmVkIG9uIHJhdyBhdWRpbyBjYXBzCisJICBUaGlzIGZpeGVzIGEgbm90LW5lZ290aWF0ZWQgZXJyb3IgYXQgbGVhc3Qgb24gbW92IGZpbGVzIHdpdGgKKwkgIHR3b3MgYXVkaW8gd2l0aCB0d28gY2hhbm5lbHMgYW5kIHZpZGVvIGR2Y3AuIEFzIHBsYXliaW4gYW5kIGdzdC1sYXVuY2gKKwkgIHNhbXBsZSBjb21pbmcgZnJvbSB0aGUgcXRkZW11eC5jIGZpbGUgdXNlcyBhdWRpb2NvbnZlcnQgYW5kIHRoZSBsYXR0ZXIKKwkgIHJlcXVpcmUgZm9ybWF0IGludGVybGVhdmVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NTMyNgorCisyMDEyLTA1LTAyIDIxOjQ5OjU2ICswNDAwICDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyIDxscm4xOTg2QGdtYWlsLmNvbT4KKworCSogc3lzL3dhdmVmb3JtL01ha2VmaWxlLmFtOgorCSAgd2F2ZWZvcm06IE5vIG1vcmUgZ3N0aW50ZXJmYWNlcworCSAgRml4ZXMgIzY3NTMxOQorCisyMDEyLTA1LTAyIDIwOjE0OjI0ICswNDAwICDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyIDxscm4xOTg2QGdtYWlsLmNvbT4KKworCSogc3lzL2RpcmVjdHNvdW5kL01ha2VmaWxlLmFtOgorCSAgZGlyZWN0c291bmQ6IE5vIG1vcmUgZ3N0aW50ZXJmYWNlcworCSAgRml4ZXMgIzY3NTMxOQorCisyMDEyLTA1LTAxIDE4OjU4OjAzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmg6CisJICB2aWRlb21peGVyOiBjaGFuZ2Ugc2luayBwYWQgdGVtcGxhdGUgbmFtZSBmcm9tIHNpbmtfJWQgdG8gc2lua18ldQorCisyMDEyLTA0LTMwIDExOjAwOjE5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJICBpbnRlcmxlYXZlOiBoYW5kbGUgRU9TIG9uIGFsbCBwYWRzCisJICBXaGVuIGFsbCBwYWRzIGdvIHRvIEVPUyBpbW1lZGlhdGVseSwgd2UgYXJlIG5vdCBuZWdvdGlhdGVkIGFuZCBvdXIgY29sbGVjdGVkCisJICBmdW5jdGlvbiBpcyBjYWxsZWQgKHdpdGhvdXQgYW55IGF2YWlsYWJsZSBkYXRhKS4gSGFuZGxlIHRoaXMgY2FzZSBncmFjZWZ1bGx5LgorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jCisKKzIwMTItMDQtMzAgMTA6NTk6MzEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkgIGludGVybGVhdmU6IGltcHJvdmUgZGVidWdnaW5nCisKKzIwMTItMDUtMDEgMTM6MzE6NTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBVcGRhdGUgZm9yIGJhc2VzcmMgQVBJIGNoYW5nZXMKKworMjAxMi0wNC0zMCAyMzo1NzoyOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IGRvbid0IHNldCB1cCBzdHVmZiBiZWZvcmUgdGhlIGlucHV0IGFuZCBvdXRwdXQgZm9ybWF0cyBhcmUga25vd24KKwkgIEZpeGVzIGNyYXNoIG9uIHN0YXJ0dXAuCisKKzIwMTItMDQtMzAgMTQ6MDk6MjMgKzAyMDAgIFBldGVyIFNlaWRlcmVyIDxwcy5yZXBvcnRAZ214Lm5ldD4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICBtdWx0aWZpbGVzaW5rOiBkb24ndCB3cml0ZSBzdHJlYW0gaGVhZGVyIHR3aWNlIGZvciBmaXJzdCBmaWxlCisKKzIwMTItMDQtMzAgMTM6MzI6NDEgKzAyMDAgIFBldGVyIFNlaWRlcmVyIDxwcy5yZXBvcnRAZ214Lm5ldD4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICBtdWx0aWZpbGVzaW5rOiBmaXggYnVmZmVyIGxpc3Qgc2l6ZSBjYWxjdWxhdGlvbiBpbiByZW5kZXJfbGlzdAorCSAgRml4IHVuaW5pdGlhbGl6ZWQgJ3NpemUnIHZhcmlhYmxlIGluIGNhbGwgdG8gZ3N0X2J1ZmZlcl9saXN0X2ZvcmVhY2goKS4KKworMjAxMi0wNC0zMCAyMTo1ODowMCArMDEwMCAgTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkgIG11bHRpZmlsZTogdW5uZWNlc3Nhcnkgc2l6ZSBjaGVjaworCisyMDEyLTA0LTMwIDIxOjMwOjU2ICswMTAwICBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmk6IGZpeCBidWlsZCBlcnJvcnMKKwkgIGZpeCByZWR1bmRhbnQgZGVjbGFyYXRpb25zCisJICBhbmQgYWxzbyBzdHlsZS9pbmRlbnQgaXNzdWVzCisKKzIwMTItMDQtMjYgMTI6NDc6MjcgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiBpbXBsZW1lbnQgZm9yd2FyZCBzbmFwcGluZyBrZXlmcmFtZSBzZWVraW5nCisJICBSZXF1aXJlcyBhbiBpbmRleC4KKworMjAxMi0wNC0yNiAxMjo0NjoxMSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aTogaW1wbGVtZW50IGZvcndhcmQgc25hcHBpbmcga2V5ZnJhbWUgc2Vla2luZworCSAgSW4gcHVsbCBtb2RlIHdpdGggYW4gaW5kZXguCisKKzIwMTItMDQtMjggMjM6MTQ6MjQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOgorCSAgdGVzdHM6IGZpeCBtYXRyb3NrYW11eCB1bml0IHRlc3QgYWZ0ZXIgbWVkaWEgdHlwZSBjaGFuZ2VzCisKKzIwMTItMDQtMjggMTk6NTc6NTEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL3dlYm0tbXV4LmM6CisJICBtYXRyb3NrYTogdXBkYXRlIGZvciBtZWRpYSB0eXBlIGNoYW5nZXMKKworMjAxMi0wNC0yNCAxNjowODo0NyArMDIwMCAgaWRjLWRyYWdvbiA8aWRjLWRyYWdvbiBhdCBnbXguZGU+CisKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJICBjZWx0ZGVwYXk6IGNhbGN1bGF0ZSBzaXplIGNvcnJlY3RseQorCSAgVGhlIHN1bW1hdGlvbiB3YXMgZG9uZSB3cm9uZywgY2F1c2luZyB0aGUgZGUtcGF5bG9hZGVyIHRvIGV4aXQgaXRzIGxvb3AgdG9vCisJICBlYXJseSwgYmVmb3JlIGFsbCBmcmFtZXMgYXJlIHByb2Nlc3NlZC4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzQ0NzIKKworMjAxMi0wNC0yNCAxNTo1NzoxOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBpbXByb3ZlIGRlYnVnCisKKzIwMTItMDQtMjQgMTU6MzQ6NTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogc3RhcnQgdW5tdXRlZCB3aGVuIHJlcXVlc3RlZAorCSAgV2hlbiB3ZSBleHBsaWNpdGVseSBzZXQgdGhlIG11dGUgcHJvcGVydHkgdG8gRkFMU0UsIGNvbm5lY3QgdG8gcHVsc2VhdWRpbyB3aXRoCisJICB0aGUgUEFfU1RSRUFNX1NUQVJUX1VOTVVURUQgZmxhZyBzZXQsIG90aGVyd2lzZSBwdWxzZWF1ZGlvIHdpbGwgdXNlIGl0cworCSAgcHJldmlvdXNseSB1c2VkIHZhbHVlICh3aGljaCBtaWdodCBzdGFydCB0aGUgc3RyZWFtIG11dGVkKS4KKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzI0MDEKKworMjAxMi0wNC0yNSAwOTo0MTo0NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogaW1wcm92ZSB0aW1lc3RhbXAgY29kZQorCSAgU2FtcGxlIHRoZSBwaXBlbGluZSBjbG9jayBhbmQgZGV2aWNlIGNsb2NrIGNsb3NlciB0byBlYWNob3RoZXIgdG8gcmVkdWNlIGppdHRlci4KKwkgIERvbid0IHN1YnRyYWN0IHRoZSBmcmFtZSBkdXJhdGlvbiBmcm9tIHRoZSB0aW1lc3RhbXAgd2hlbiB3ZSBjYW4gdXNlIHRoZSBkZXZpY2UKKwkgIHRpbWVzdGFtcHMuCisJICBBc3N1bWUgYSBkZWxheSBvZiAxIGZyYW1lIGluIHJlYWQtd3JpdGUgbW9kZS4KKworMjAxMi0wNC0yNCAxMjozNzozMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDI6IHVzZSBkcml2ZXIgdGltZXN0YW1wcworCSAgVXNlIHRoZSBkcml2ZSB0aW1lc3RhbXBzIGZvciB0aW1lc3RhbXBpbmcgb3V0Z29pbmcgYnVmZmVycy4KKworMjAxMi0wNC0yMyAxODowMTozMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyOiBJbXByb3ZlIGJ1ZmZlciBtYW5hZ2VtZW50CisJICBRdWVyeSB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBidWZmZXJzIHdoZW4gZG9pbmcgc2V0X2NvbmZpZygpLiBUaGlzIGFsbG93cyB1cyB0bworCSAgY29uZmlndXJlIHRoZSBwYXJlbnQgYnVmZmVycG9vbCB3aXRoIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0byBwcmVhbGxvY2F0ZS4KKwkgIEtlZXAgdHJhY2sgb2YgdGhlIHByb3ZpZGVkIGFsbG9jYXRvciBhbmQgdXNlIGl0IHdoZW4gd2UgbmVlZCB0byBhbGxvY2F0ZSBhCisJICBidWZmZXIgaW4gUlcgbW9kZS4KKwkgIFdoZW4gd2UgYXJlIGNhbiBub3QgYWxsb2NhdGUgdGhlIHJlcXVlc3RlZCBtYXhfYnVmZmVycyBhbW91bnQgb2YgYnVmZmVycywgbWFrZQorCSAgc3VyZSB3ZSBrZWVwIDIgYnVmZmVycyBhcm91bmQgaW4gdGhlIHBvb2wgYW5kIGNvcHkgdGhlbSBpbnRvIGFuIG91dHB1dCBidWZmZXIuCisJICBUaGlzIG1ha2VzIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBhIGJ1ZmZlciB0byBjYXB0dXJlIGludG8uIFdlIGFsc28gbmVlZCB0bworCSAgZGV0ZWN0IHRob3NlIGNvcGllZCBidWZmZXJzIGFuZCB1bnJlZiB0aGVtIHdoZW4gdGhleSByZXR1cm4gdG8gdGhlIHBvb2wuCisKKzIwMTItMDQtMjMgMTY6NTE6MjggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBmcmVlIHRoZSBxdWV1ZWQgYnVmZmVycworCSAgT25seSBmcmVlIHRoZSBxdWV1ZWQgYnVmZmVycyB0aGF0IHdlIGtlZXAgdHJhY2sgb2YgaW4gb3VyIGJ1ZmZlciBhcnJheS4gZm9yIHJ3CisJICBpby1tb2RlLCB3ZSBkbyBhbGxvY2F0ZSBidWZmZXJzIGJ1dCB3ZSBkb24ndCBrZWVwIHRyYWNrIG9mIHRoZW0gaW4gdGhlIGJ1ZmZlcgorCSAgYXJyYXkuCisKKzIwMTItMDQtMjMgMTY6MTA6MTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBtYXJrIG1lbW9yeSBhcyBuby1zaGFyZQorCSAgV2UgZG9uJ3Qgc3VwcG9ydCBzaGFyaW5nIG91ciBtbWFwcGVkIG1lbW9yeSBzbyBtYXJrIGl0IGFzIE5PX1NIQVJFLgorCisyMDEyLTA0LTIzIDE2OjA5OjU1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICB2NGwyOiByZW1vdmUgb2xkIHVudXNlZCBmaWxlCisKKzIwMTItMDQtMjMgMTM6MzI6NDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDI6IHJlbW92ZSB1bnVzZWQgZnVuY3Rpb24KKworMjAxMi0wNC0xMSAxMjo0MjoxNyArMDEwMCAgQmFzdGllbiBOb2NlcmEgPGhhZGVzc0BoYWRlc3MubmV0PgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cDogSGFuZGxlIGljeSBhbmQgaWN5eCBVUkkgc2NoZW1lcworCSAgQXMgaGFuZGxlZCBieSBRdWlja1RpbWUgKGZvciBpY3kpLCBhbmQgT3JiYW4vQ29kaW5nIFRlY2hub2xvZ2llcworCSAgQUFDL2FhY1BsdXMgUGxheWVyIChmb3IgaWN5eCkuIFNlZSBhbHNvOgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTM5NDIwNworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTQwMzI4NQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3Mzg5OQorCisyMDEyLTA0LTIzIDEwOjAzOjE5ICswMzAwICBNYXJ0IFJhdWRzZXBwIDxtYXJ0LnJhdWRzZXBwQGNvbGxhYm9yYS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIGRvY3M6IEFkZCBTaW5jZSB0YWcgZm9yIG5ldyBHc3RWNGwyU3JjOjpwcmVwYXJlLWZvcm1hdCBzaWduYWwKKworMjAxMi0wNC0yMyAxMDowNzoxMiArMDIwMCAgQ2hyaXMgUGFua293IDxrYWluMjM5NkBnbWFpbC5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJICBhdWRpb2Z4YmFzZWZpcmZpbHRlcjogRml4IHRpbWUtZG9tYWluIGNvbnZvbHV0aW9uIGZvciBtdWx0aWNoYW5uZWwgaW5wdXQKKwkgIEZpeGVzIGJ1ZyAjNjc0MDI1LgorCisyMDEyLTA0LTIxIDExOjA4OjUxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vUE9URklMRVMuaW46CisJICBwbzogcmVtb3ZlIHNvbWUgbW9yZSBub24tZXhpc3RlbnQgZmlsZXMgZnJvbSB0aGUgbGlzdAorCisyMDEyLTA0LTIxIDEwOjA1OjQ1ICswNDAwICDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyIDxscm4xOTg2QGdtYWlsLmNvbT4KKworCSogcG8vUE9URklMRVMuaW46CisJICBwbzogUmVtb3ZlIG5vbi1leGlzdGVudCBwb3RmaWxlcyBmcm9tIHRoZSBsaXN0CisJICBGaXhlcyAjNjc0NTE4CisKKzIwMTItMDQtMjAgMTg6MTM6MTUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9pY2xlcy90ZXN0LW9zczQuYzoKKwkgIHRlc3RzOiBvc3M0OiBsaW1pdCB0ZXN0IHNjb3BlCisKKzIwMTItMDQtMjAgMTg6MTM6MDEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogc3lzL29zczQvTWFrZWZpbGUuYW06CisJKiBzeXMvb3NzNC9vc3M0LWF1ZGlvLmM6CisJKiBzeXMvb3NzNC9vc3M0LWF1ZGlvLmg6CisJKiBzeXMvb3NzNC9vc3M0LW1peGVyLWVudW0uYzoKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXItZW51bS5oOgorCSogc3lzL29zczQvb3NzNC1taXhlci1zbGlkZXIuYzoKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXItc2xpZGVyLmg6CisJKiBzeXMvb3NzNC9vc3M0LW1peGVyLXN3aXRjaC5jOgorCSogc3lzL29zczQvb3NzNC1taXhlci1zd2l0Y2guaDoKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXIuYzoKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXIuaDoKKwkqIHN5cy9vc3M0L29zczQtcHJvcGVydHktcHJvYmUuYzoKKwkqIHN5cy9vc3M0L29zczQtcHJvcGVydHktcHJvYmUuaDoKKwkqIHN5cy9vc3M0L29zczQtc2luay5jOgorCSogc3lzL29zczQvb3NzNC1zaW5rLmg6CisJKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSogc3lzL29zczQvb3NzNC1zb3VyY2UuaDoKKwkgIG9zczQ6IHBvcnQgdG8gMC4xMQorCisyMDEyLTA0LTIwIDE4OjEyOjU0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIHN5cy9vc3MvTWFrZWZpbGUuYW06CisJKiBzeXMvb3NzL2dzdG9zc2F1ZGlvLmM6CisJKiBzeXMvb3NzL2dzdG9zc2hlbHBlci5jOgorCSogc3lzL29zcy9nc3Rvc3NoZWxwZXIuaDoKKwkqIHN5cy9vc3MvZ3N0b3NzbWl4ZXIuYzoKKwkqIHN5cy9vc3MvZ3N0b3NzbWl4ZXIuaDoKKwkqIHN5cy9vc3MvZ3N0b3NzbWl4ZXJlbGVtZW50LmM6CisJKiBzeXMvb3NzL2dzdG9zc21peGVyZWxlbWVudC5oOgorCSogc3lzL29zcy9nc3Rvc3NtaXhlcnRyYWNrLmM6CisJKiBzeXMvb3NzL2dzdG9zc21peGVydHJhY2suaDoKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmg6CisJICBvc3M6IHBvcnQgdG8gMC4xMQorCisyMDEyLTA0LTIwIDE2OjQ5OjU2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJICBtdWx0aXBhcnRkZW11eDogZmlyc3QgYWN0aXZhdGUgcGFkIHRoZW4gc2V0IGNhcHMKKworMjAxMi0wNC0yMCAxMzozNToxNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHNldCBjYXBzIG9uIHNyY3BhZAorCSAgRml4ZXMgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NDIxOQorCisyMDEyLTA0LTE5IDE0OjE2OjAxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMjogdXBkYXRlIGZvciB2aWRlbyBhcGkgY2hhbmdlCisKKzIwMTItMDQtMTkgMTI6Mzg6NTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IGZpeCBjb21waWxhdGlvbiBvbiBvbGRlciB2NGwyCisJICBGaXggY29tcGlsYXRpb24gb24gc3lzdGVtcyB3aGVyZSB0aGUgSDI2NCBmb3JtYXQgaXMgbm90IGRlZmluZWQuCisKKzIwMTItMDQtMTkgMTI6MjA6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkqIGV4dC9yYXcxMzk0L01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHZpZGVvOiBVcGRhdGUgZm9yIGxpYmdzdHZpZGVvIEFQSSBjaGFuZ2VzCisKKzIwMTItMDQtMTkgMDg6Mjc6MDEgKzAwMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDJzcmM6IEFsbG93IG1wZWctdHMgY2FtZXJhcyB0byBuZWdvY2lhdGUgZm9ybWF0CisJICBUaGlzIHJlbW92ZXMgYW4gdWdseSBoYWNrIHVudGlsIHRoZSByZWFzb24gZm9yIHRoZSBoYWNrIGNhbiBiZSBkb2N1bWVudGVkCisKKzIwMTItMDQtMTkgMDk6NTA6MjUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyc3JjOiBGaXggbWVyZ2UKKworMjAxMi0wNC0xOSAwOTo0MDo1MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDJzcmM6IFJlbmFtZSBwcmUtc2V0LWZvcm1hdCBzaWduYWwgdG8gcHJlcGFyZS1mb3JtYXQKKworMjAxMi0wNC0xNiAyMjowODoyMSArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMnNyYzogQWRkIEgyNjQgZW5jb2RlZCBzdHJlYW0gc3VwcG9ydCB0byB0aGUgY2FwcworCSAgVGhpcyBpcyBub3QgZW5vdWdoIHRvIHByb3Blcmx5IHN1cHBvcnQgSDI2NCBjYW1lcmFzLCBidXQgaXQgd2lsbAorCSAgYWxsb3cgYW4gSDI2NCBzdHJlYW0gdG8gYmUgZ2VuZXJhdGVkIGJ5IHY0bDJzcmMgdXNpbmcgdGhlIGRlZmF1bHQKKwkgIHNldHRpbmdzIG9mIHRoZSBjYW1lcmEuIElmIHVzZWQgd2l0aCB0aGUgcHJlLXNldC1mb3JtYXQgc2lnbmFsLCB0aGUKKwkgIEgyNjQgZW5jb2RlciBjYW4gYmUgZnVsbHkgY29uZmlndXJlZC4KKwkgIENvbmZsaWN0czoKKwkgIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYworCisyMDEyLTA0LTE2IDIyOjA2OjIxICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi8uZ2l0aWdub3JlOgorCSogc3lzL3Y0bDIvZ3N0djRsMi1tYXJzaGFsLmxpc3Q6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICB2NGwyc3JjOiBBZGRpbmcgYSBwcmUtc2V0LWZvcm1hdCBzaWduYWwKKwkgIEluIG9yZGVyIHRvIHN1cHBvcnQgVVZDIEgyNjQgZW5jb2RpbmcgY2FtZXJhcywgYW4gSDI2NCBQcm9iZSZDb21taXQKKwkgIG11c3QgaGFwcGVuIGJlZm9yZSB0aGUgbm9ybWFsIHY0bDIgc2V0LWZvcm1hdC4gVGhpcyBuZXcgc2lnbmFsIGlzCisJICBtZWFudCB0byBhbGxvdyBhbiBleHRlcm5hbCBhcHBsaWNhdGlvbiBvciBiaW4gdG8gZG8gaXQuCisJICBJdCBhbHNvIHNlcnZlcyB0byBleHBvc2UgdGhlIGZpbGUgZGVzY3JpcHRvciB1c2VkIGJ5IHY0bDJzcmMgaW4gY2FzZQorCSAgc29tZSBjdXN0b20gaW9jdGxzIG5lZWQgdG8gYmUgY2FsbGVkLgorCSAgQ29uZmxpY3RzOgorCSAgc3lzL3Y0bDIvTWFrZWZpbGUuYW0KKwkgIHN5cy92NGwyL2dzdHY0bDJzcmMuYworCSAgc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jCisKKzIwMTItMDQtMTggMTc6MDk6NDUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvcmF3MTM5NC9nc3QxMzk0cHJvYmUuYzoKKwkqIGV4dC9yYXcxMzk0L2dzdDEzOTRwcm9iZS5oOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJICBkdjEzOTQ6IHBvcnQgdG8gMC4xMQorCisyMDEyLTA0LTE3IDE1OjE0OjI3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuaDoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5oOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4Lmg6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4Lmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguaDoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIycGFkLmg6CisJICBjb2xsZWN0cGFkczI6IHJlbmFtZSB0byBjb2xsZWN0cGFkcworCisyMDEyLTA0LTE2IDE2OjM3OjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICBtaXNjOiBjaGFpbiB1cCB0byBjb2xsZWN0cGFkcyBldmVudCBoYW5kbGVyCisKKzIwMTItMDQtMTYgMDk6MDk6MTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNmRiMjViZSB0byBkYzcwMjAzCisKKzIwMTItMDQtMTUgMjI6NDk6NDcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSAgc2hvdXQyOiB1cGRhdGUgZm9yIG9nZyBtZWRpYSB0eXBlIGNoYW5nZXMKKworMjAxMi0wNC0xMyAxNjo1NDo1MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmg6CisJICBzbXB0ZTogdXNlIHNvbWUgbW9yZSBib2lsZXJwbGF0ZQorCisyMDEyLTA0LTEzIDE2OjU0OjUwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ZseC9nc3RmbHhkZWMuYzoKKwkgIGZseGRlYzogaW1wcm92ZSBzZWdtZW50IGhhbmRsaW5nCisJICAuLi4gdG8gc2VuZCBhIHByb3BlciBUSU1FIHNlZ21lbnQgZG93bnN0cmVhbS4KKworMjAxMi0wNC0xMyAxNjo1NDo0NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5oOgorCSAgZmx4ZGVjOiBwb3J0IHRvIDAuMTEKKworMjAxMi0wNC0xMyAxNjo1NDo0MiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94Lmg6CisJICB2aWRlb2JveDogYWRqdXN0IHRvIGRlcHJlY2F0ZWQgR011dGV4IHNldHVwCisKKzIwMTItMDQtMTMgMTY6NTQ6MzggKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5oOgorCSAgdmlkZW9ib3g6IHBvcnQgdG8gMC4xMQorCisyMDEyLTA0LTEzIDE2OjU0OjMxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlYWxwaGEuYzoKKwkgIGFscGhhLCBzbXB0ZTogYWRqdXN0IHRvIHJlbW92ZWQgY29sb3ItbWF0cml4IGNhcHMgZmllbGQKKworMjAxMi0wNC0xMyAxNjoyNzozNCArMDIwMCAgVsOtY3RvciBNYW51ZWwgSsOhcXVleiBMZWFsIDx2amFxdWV6QGlnYWxpYS5jb20+CisKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSAgdjRsMjogZW5zdXJlIGF1dG9nZW5lcmF0ZWQgZmlsZXMgYXJlIGNyZWF0ZWQKKwkgIFRoZSB0dW5lciBtYXJzaGFsIGFuZCBlbnVtdHlwZXMgYXJlIGF1dG9nZW5lcmF0ZWQsIGFuZCB0aGV5IG5lZWQKKwkgIHRvIGJlIGNyZWF0ZWQgYmVmb3JlIHRoZSBjb21waWxhdGlvbiBvZiBnc3R2NGwydHVuZXIuYworCSAgVGhpcyBwYXRjaCBhZGRzIHRoZSBhdXRvbWFrZSBpbnN0cnVjdGlvbiBmb3IgZW5zdXJpbmcgdGhlCisJICBhdXRvZ2VuZXJhdGlvbiBvZiB0aG9zZSBmaWxlcyBwcmV2aW91cyB0aGUgY29tcGlsYXRpb24uCisKKzIwMTItMDQtMTMgMTM6NDE6NDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBhdXRvZ2VuLnNoOgorCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBNb2Rlcm5pemUgYXV0b3Rvb2xzIHNldHVwIGEgYml0CisJICBBbHNvIHdlIG5vdyBvbmx5IGNyZWF0ZSB0YXIuYnoyIGFuZCB0YXIueHogdGFyYmFsbHMuCisKKzIwMTItMDQtMTMgMTM6Mzc6MTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNDY0ZmUxNSB0byA2ZGIyNWJlCisKKzIwMTItMDQtMTMgMTM6MDQ6MTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBleHQvcHVsc2UvTWFrZWZpbGUuYW06CisJKiBleHQvcHVsc2UvcGx1Z2luLmM6CisJKiBleHQvcHVsc2UvcHVsc2VtaXhlci5jOgorCSogZXh0L3B1bHNlL3B1bHNlbWl4ZXIuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOgorCSogZXh0L3B1bHNlL3B1bHNlbWl4ZXJjdHJsLmg6CisJKiBleHQvcHVsc2UvcHVsc2VtaXhlcnRyYWNrLmM6CisJKiBleHQvcHVsc2UvcHVsc2VtaXhlcnRyYWNrLmg6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5oOgorCSogZ3N0L3J0c3AvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvb3ZlcmxheS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvb3ZlcmxheS5oOgorCSogc3lzL3Y0bDIvdHVuZXItbWFyc2hhbC5saXN0OgorCSogc3lzL3Y0bDIvdHVuZXIuYzoKKwkqIHN5cy92NGwyL3R1bmVyLmg6CisJKiBzeXMvdjRsMi90dW5lcmNoYW5uZWwuYzoKKwkqIHN5cy92NGwyL3R1bmVyY2hhbm5lbC5oOgorCSogc3lzL3Y0bDIvdHVuZXJub3JtLmM6CisJKiBzeXMvdjRsMi90dW5lcm5vcm0uaDoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvcHVsc2UvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ljbGVzL3Y0bDJzcmMtdGVzdC5jOgorCSAgVXBkYXRlIGV2ZXJ5dGhpbmcgZm9yIHRoZSByZW1vdmFsIG9mIHRoZSBpbnRlcmZhY2UgbGlicmFyeSBhbmQgbWl4ZXIvdHVuZXIgaW50ZXJmYWNlcworCisyMDEyLTA0LTEyIDE1OjUwOjE2ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcGFyb2J1c3RkZXBheS5jOgorCSAgcnRwOiBVc2UgdW5jaGVja2VkIHZhcmlhbnQgb2YgR3N0Qnl0ZVdyaXRlciB3aGVyZSBhcHBsaWNhYmxlCisJICBUaGUgc2l6ZSB3YXMgY2hlY2tlZCBiZWZvcmUKKworMjAxMi0wNC0xMiAxNTo0OTo0NCArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgR3N0Qnl0ZVJlYWRlci9Xcml0ZXIKKworMjAxMi0wNC0xMiAxNTo0ODo1NyArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X2R1bXAuYzoKKwkgIGlzb21wNDogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIEdzdEJ5dGVXcml0ZXIKKwkgIEFuZCB1c2UgdW5jaGVja2VkIHZhcmlhbnQgb2YgR3N0Qnl0ZVJlYWRlciB3aGVyZSBhcHBsaWNhYmxlCisKKzIwMTItMDQtMTIgMTU6NDg6MDAgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogVXNlIHVuY2hlY2tlZCB2YXJpYW50IG9mIEdzdEJ5dGVSZWFkZXIKKwkgIFdlIGtub3cgdGhlcmUncyBhdCBsZWFzdCA3IGJ5dGVzIChjaGVja2VkIGFib3ZlKQorCisyMDEyLTA0LTEyIDE1OjQ3OjQ5ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIEdzdEJ5dGVXcml0ZXIKKworMjAxMi0wNC0xMiAxNTo0NzoyNCArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgYXVkaW9wYXJzZXJzOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgR3N0Qml0UmVhZGVyL0dzdEJ5dGVSZWFkZXIKKworMjAxMi0wNC0xMiAxMTo1Nzo1OSArMDEwMCAgdXJhZXVzIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBBZGQgaW50ZXJsZWF2ZSBwbHVnaW4gdG8gc3BlYyBmaWxlCisKKzIwMTItMDQtMTIgMTE6MTk6MDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDAuMTEuOTAgPT09CisKKzIwMTItMDQtMTIgMTA6Mjc6MzEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLWRpc3QuYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0LmM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTEuOTAKKworMjAxMi0wNC0xMiAxMDoyNjo1MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VvLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDEyLTA0LTExIDAwOjE5OjMwICswNDAwICDQoNGD0YHQu9Cw0L0g0JjQttCx0YPQu9Cw0YLQvtCyIDxscm4xOTg2QGdtYWlsLmNvbT4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAgRml4IGZvcm1hdCBzdHJpbmcKKwkgIEZpeGVzICM2NzM4NTkKKworMjAxMi0wNC0xMSAwMDoxOToxNiArMDQwMCAg0KDRg9GB0LvQsNC9INCY0LbQsdGD0LvQsNGC0L7QsiA8bHJuMTk4NkBnbWFpbC5jb20+CisKKwkqIHN5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXNpbmsuYzoKKwkgIFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKwkgIEZpeGVzICM2NzM4NTkKKworMjAxMi0wNC0xMCAxMTo1Nzo1MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIHJlbW90ZS10cmFja2luZyBicmFuY2ggJ29yaWdpbi8wLjEwJworCSAgQ29uZmxpY3RzOgorCSAgZ3N0L2Zsdi9nc3RmbHZkZW11eC5jCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYworCisyMDEyLTA0LTEwIDExOjM3OjQ4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBzb21lIG1vcmUgc2VnbWVudCBoYW5kbGluZyB0d2Vha2luZworCisyMDEyLTA0LTEwIDAwOjUxOjQxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmM6CisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzoKKwkqIGV4dC9jYWlyby9nc3R0aW1lb3ZlcmxheS5jOgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvanBlZy9nc3RzbW9rZWRlYy5jOgorCSogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzoKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6CisJKiBleHQvbGlibW5nL2dzdG1uZ2RlYy5jOgorCSogZXh0L2xpYm1uZy9nc3RtbmdlbmMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSogZXh0L21pa21vZC9nc3RtaWttb2QuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZW1peGVyLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJKiBleHQvdGFnbGliL2dzdGFwZXYybXV4LmNjOgorCSogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2ZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9paXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2thcmFva2UuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmM6CisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSogZ3N0L2RlYnVndXRpbHMvYnJlYWtteWRhdGEuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2NwdXJlcG9ydC5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0Y2Fwc2RlYnVnLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2c2Vlay5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0cHVzaGZpbGVzcmMuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHRhZ2luamVjdC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Rlc3RwbHVnaW4uYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGRpY2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdG9wLmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RyaXBwbGUuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHN0cmVhay5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzoKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bW9vdnJlY292ZXIuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cnRweHF0ZGVwYXkuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2xhdy9hbGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2Evd2VibS1tdXguYzoKKwkqIGdzdC9tZWRpYW4vZ3N0bWVkaWFuLmM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmM6CisJKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBidmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVuZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc2lyZW5wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSogZ3N0L3J0c3AvZ3N0cnRwZGVjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW90ZW1wbGF0ZS5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJKiBzeXMvb3NzL2dzdG9zc21peGVyZWxlbWVudC5jOgorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6CisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOgorCSogc3lzL29zczQvb3NzNC1taXhlci5jOgorCSogc3lzL29zczQvb3NzNC1zaW5rLmM6CisJKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlci5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwycmFkaW8uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1zaW5rLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgVXNlIG5ldyBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhKCkKKworMjAxMi0wNC0wOSAxMjo1NTozNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy9zaW1wbGUtbGF1bmNoLWxpbmVzLmM6CisJICB0ZXN0czogZGlzYWJsZSBzaW1wbGUgc21va2VlbmMvZGVjIGxhdW5jaCBsaW5lcyB0ZXN0CisJICBEaXNhYmxlIHRlc3QgZm9yIHNtb2tlIGVsZW1lbnRzLCB3aGljaCBhcmVuJ3QgcG9ydGVkIHlldAorCSAgKGFuZCBtYXliZSBzaG91bGRuJ3QgYmUgcG9ydGVkKS4KKworMjAxMi0wNC0wOSAwMDoxNDo0OCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ludGVybGVhdmUuYzoKKwkgIGludGVybGVhdmU6IG1ha2UgY2hhbm5lbC1wb2lzaXRpb25zIHByb3BlcnR5IGEgR1ZhbHVlQXJyYXkgYWdhaW4KKwkgIE9yIHBlcmhhcHMgaXQgc2hvdWxkIGp1c3QgYmUgYSBndWludDY0IGNoYW5uZWwgbWFzaywgd2hpY2ggd291bGQKKwkgIGJlIG5pY2VyIGluIEMsIGJ1dCBtb3JlIGF3a3dhcmQgZm9yIGJpbmRpbmdzIChldmVuIG1vcmUgc28gc2luY2UKKwkgIHdlIGNhbid0IGFkZCBhIGZsYWdzIHR5cGUgZm9yIGl0LCBzaW5jZSB0aGF0IG9ubHkgc3VwcG9ydHMgZ3VpbnQKKwkgIHNpemUgZmxhZ3MpLiBGaXhlcyB3YXZlbmMgdW5pdCB0ZXN0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2OTY0MworCisyMDEyLTA0LTA2IDE2OjAzOjQ3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBjbGVhbmx5IGluaXRpYWxpemUgYW5kIHNldCBuZWVkZWQgc2VnbWVudAorCSAgRml4ZXMgIzY3MzE2NS4KKworMjAxMi0wNC0wNSAxNzoxNzoyMiAtMDQwMCAgTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogRml4IHRocmVhZGluZyBpc3N1ZSBpbiBpbmRleCBoYW5kbGluZworCisyMDEyLTA0LTA2IDA5OjEzOjMxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IERvbid0IHVzZSBzdGF0aWMgdmFyaWFibGVzIHRvIGhvbGQgaW5kZXggYXNzb2NpYXRpb25zCisJICBUaGlzIG5vdCByZWFsbHkgdGhyZWFkc2FmZSBpbiBhbnkgd2F5LgorCisyMDEyLTA0LTA1IDE5OjE3OjQ4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2bXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmM6CisJICB0ZXN0czogbWFrZSBmZXcgdGVzdHMgbW9yZSB2YWxncmluZC1mcmllbmRseQorCisyMDEyLTA0LTA1IDE5OjE3OjQyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZGVpbnRlcmxlYXZlLmM6CisJICAoZGUpaW50ZXJsZWF2ZTogZml4IHBvcnRlZCB1bml0IHRlc3QgYW5kIGVuYWJsZSBhcyBwb3J0ZWQKKworMjAxMi0wNC0wNSAxOToxNzozOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxkZWMuYzoKKwkgIHRlc3RzOiBjbW1sZGVjOiBhZGp1c3QgdG8gdGFnIGV2ZW50cyBubyBsb25nZXIgcG9zdGVkIG9uIGJ1cyBieSBlbGVtZW50CisKKzIwMTItMDQtMDUgMTk6MTc6MjkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdXBkc3JjOiBjbGVhciBlcnJvcgorCisyMDEyLTA0LTA1IDE4OjQyOjUzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDdmZGE1MjQgdG8gNDY0ZmUxNQorCisyMDEyLTA0LTA1IDE4OjAyOjU2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZi5jOgorCSAgZ3N0OiBVcGRhdGUgZm9yIEdTVF9QTFVHSU5fREVGSU5FKCkgQVBJIGNoYW5nZXMKKworMjAxMi0wNC0wNSAxNzozNjozOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGFubm9kZXguYzoKKwkqIGV4dC9jYWlyby9nc3RjYWlyby5jOgorCSogZXh0L2R2L2dzdGR2LmM6CisJKiBleHQvZmxhYy9nc3RmbGFjLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWcuYzoKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6CisJKiBleHQvbGlibW5nL2dzdG1uZy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmcuYzoKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6CisJKiBleHQvcHVsc2UvcGx1Z2luLmM6CisJKiBleHQvcmF3MTM5NC9nc3QxMzk0LmM6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3NvdXAvZ3N0c291cC5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4LmM6CisJKiBleHQvdGFnbGliL2dzdHRhZ2xpYnBsdWdpbi5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFjay5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meC5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9wbHVnaW4uYzoKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpLmM6CisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0ZGVidWcuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdG5hdmlnYXRpb250ZXN0LmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGVmZmVjdHYuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzoKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L2ludGVybGVhdmUvcGx1Z2luLmM6CisJKiBnc3QvaXNvbXA0L2lzb21wNC1wbHVnaW4uYzoKKwkqIGdzdC9sYXcvYWxhdy5jOgorCSogZ3N0L2xhdy9tdWxhdy5jOgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EuYzoKKwkqIGdzdC9tZWRpYW4vZ3N0bWVkaWFuLmM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGUuYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9yZXBsYXlnYWluLmM6CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbWFuYWdlci5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcC5jOgorCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkqIGdzdC9zbXB0ZS9wbHVnaW4uYzoKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3VkcC9nc3R1ZHAuYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb3RlbXBsYXRlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvcGx1Z2luLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHBsdWdpbi5jOgorCSogc3lzL29zcy9nc3Rvc3NhdWRpby5jOgorCSogc3lzL29zczQvb3NzNC1hdWRpby5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvLmM6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW8uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXBsdWdpbi5jOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIGdzdDogVXBkYXRlIGZvciBHU1RfUExVR0lOX0RFRklORSgpIEFQSSBjaGFuZ2VzCisKKzIwMTItMDQtMDUgMTM6MjY6MTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IFVwZGF0ZSB2ZXJzaW9uIHRvIDAuMTEuODkuMQorCisyMDEyLTA0LTA0IDIwOjA2OjU4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIHRlc3RzOiBxdG11eDogZW5zdXJlIGluaXRpYWxpemVkIHRlc3QgYnVmZmVyIG1lbW9yeQorCisyMDEyLTA0LTA0IDE0OjQxOjIyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvTWFrZWZpbGUuYW06CisJICBnc3Q6IFVwZGF0ZSB2ZXJzaW9uaW5nCisKKzIwMTItMDQtMDQgMTQ6MzM6MjMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvdmVyc2lvbi5lbnRpdGllcy5pbjoKKwkqIGV4dC9hYWxpYi9NYWtlZmlsZS5hbToKKwkqIGV4dC9jYWlyby9NYWtlZmlsZS5hbToKKwkqIGV4dC9kdi9NYWtlZmlsZS5hbToKKwkqIGV4dC9mbGFjL01ha2VmaWxlLmFtOgorCSogZXh0L2dka19waXhidWYvTWFrZWZpbGUuYW06CisJKiBleHQvamFjay9NYWtlZmlsZS5hbToKKwkqIGV4dC9qcGVnL01ha2VmaWxlLmFtOgorCSogZXh0L2xpYmNhY2EvTWFrZWZpbGUuYW06CisJKiBleHQvbGlicG5nL01ha2VmaWxlLmFtOgorCSogZXh0L3B1bHNlL01ha2VmaWxlLmFtOgorCSogZXh0L3JhdzEzOTQvTWFrZWZpbGUuYW06CisJKiBleHQvc291cC9NYWtlZmlsZS5hbToKKwkqIGV4dC9zcGVleC9NYWtlZmlsZS5hbToKKwkqIGV4dC90YWdsaWIvTWFrZWZpbGUuYW06CisJKiBleHQvd2F2cGFjay9NYWtlZmlsZS5hbToKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkqIGdzdC9hbHBoYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hcGV0YWcvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9meC9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb3BhcnNlcnMvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVwYXJzZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdmkvTWFrZWZpbGUuYW06CisJKiBnc3QvY3V0dGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L2RlYnVndXRpbHMvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW06CisJKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbToKKwkqIGdzdC9lcXVhbGl6ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvZmx2L01ha2VmaWxlLmFtOgorCSogZ3N0L2ljeWRlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L2lkM2RlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L2ludGVybGVhdmUvTWFrZWZpbGUuYW06CisJKiBnc3QvaXNvbXA0L01ha2VmaWxlLmFtOgorCSogZ3N0L2xhdy9NYWtlZmlsZS5hbToKKwkqIGdzdC9sZXZlbC9NYWtlZmlsZS5hbToKKwkqIGdzdC9tYXRyb3NrYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9tdWx0aWZpbGUvTWFrZWZpbGUuYW06CisJKiBnc3QvcmVwbGF5Z2Fpbi9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwbWFuYWdlci9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHNwL01ha2VmaWxlLmFtOgorCSogZ3N0L3NoYXBld2lwZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9zbXB0ZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9zcGVjdHJ1bS9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2JveC9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2Nyb3AvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbToKKwkqIGdzdC93YXZlbmMvTWFrZWZpbGUuYW06CisJKiBnc3Qvd2F2cGFyc2UvTWFrZWZpbGUuYW06CisJKiBnc3QveTRtL01ha2VmaWxlLmFtOgorCSogcGtnY29uZmlnL01ha2VmaWxlLmFtOgorCSogcGtnY29uZmlnL2dzdHJlYW1lci1wbHVnaW5zLWdvb2QtdW5pbnN0YWxsZWQucGMuaW46CisJKiBzeXMvZGlyZWN0c291bmQvTWFrZWZpbGUuYW06CisJKiBzeXMvb3NzL01ha2VmaWxlLmFtOgorCSogc3lzL29zczQvTWFrZWZpbGUuYW06CisJKiBzeXMvb3N4YXVkaW8vTWFrZWZpbGUuYW06CisJKiBzeXMvb3N4dmlkZW8vTWFrZWZpbGUuYW06CisJKiBzeXMvc3VuYXVkaW8vTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy93YXZlZm9ybS9NYWtlZmlsZS5hbToKKwkqIHN5cy94aW1hZ2UvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL2F1ZGlvZngvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9leGFtcGxlcy9jYWlyby9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3B1bHNlL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgIGdzdDogVXBkYXRlIHZlcnNpb25pbmcKKworMjAxMi0wNC0wNCAxMjoxMDo0NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIHJlbW90ZS10cmFja2luZyBicmFuY2ggJ29yaWdpbi8wLjEwJworCSAgQ29uZmxpY3RzOgorCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmMKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmMKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oCisKKzIwMTItMDQtMDMgMTg6MzY6NTAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJICBqcGVnZW5jOiBwbHVnIHRlbXBsYXRlIGNhcHMgbGVhaworCisyMDEyLTA0LTAzIDExOjUwOjAwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogYXZpIG9ubHkga25vd3MgYWJvdXQgRFRTCisJICBPbmx5IHNldCBEVFMgb24gb3V0Z29pbmcgYnVmZmVycyB1bmxlc3Mgd2UgaGF2ZSBhIGtleWZyYW1lIGFuZCB0aGVuIHdlIGNhbiBzZXQKKwkgIHRoZSBQVFMgdG8gRFRTIGFzIHdlbGwuCisKKzIwMTItMDQtMDIgMjM6MzU6NDMgKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWt2OiBwb3J0IHRvYyBjaGFuZ2VzIHRvIDAuMTEKKworMjAxMi0wNC0wMiAyMzoxODowMCArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSAgTWVyZ2UgYnJhbmNoICcwLjEwJworCSAgQ29uZmxpY3RzOgorCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmMKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmMKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oCisKKzIwMTItMDMtMjkgMjM6MjI6MjggKzA0MDAgIEFsZXhhbmRlciBTYXByeWtpbiA8eGVsZml1bUBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgIG1hdHJvc2thOiBhZGQgR3N0VG9jIHN1cHBvcnQgZm9yIG11eGVyCisKKzIwMTItMDMtMjkgMjM6MTI6MTMgKzA0MDAgIEFsZXhhbmRlciBTYXByeWtpbiA8eGVsZml1bUBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2E6IGFkZCBzdXBwb3J0IGZvciBHc3RUb2MgaW4gZGVtdXhlcgorCisyMDEyLTAzLTI5IDIzOjA1OjE0ICswNDAwICBBbGV4YW5kZXIgU2FwcnlraW4gPHhlbGZpdW1AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2E6IGFkZCBjaGFwdGVyIHN1cHBvcnQgaW4gR3N0TWF0cm9za2FSZWFkQ29tbW9uCisKKzIwMTItMDQtMDIgMTM6MDA6MTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZ29vbTJrMS9saW5lcy5jOgorCSAgZ29vbTJrMTogRml4ICdtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24nIGNvbXBpbGVyIHdhcm5pbmcKKworMjAxMi0wNC0wMiAxMToxMzowOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWlpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJICB1c2UgdHJhbnNmb3JtX2lwX29uX3Bhc3N0aHJvdWdoCisKKzIwMTItMDMtMzEgMTU6NDM6NDkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZXF1YWxpemVyLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSogdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYzoKKwkgIHVwZGF0ZSBmb3IgY2hpbGQgcHJveHkgYXBpIGNoYW5nZQorCisyMDEyLTAzLTMwIDE4OjEzOjA4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlzdWJ0aXRsZS5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGVhdmUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ludGVybGVhdmUuYzoKKwkgIHVwZGF0ZSBmb3IgYnVmZmVyIGFwaSBjaGFuZ2UKKworMjAxMi0wMy0zMCAxMjo1Mzo0NCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmg6CisJICBzcGVleGVuYzogVXNlIG5ldyBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfaGVhZGVycygpIEFQSQorCisyMDEyLTAzLTMwIDEyOjE4OjQ1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJICBleHQ6IFVwZGF0ZSBmb3IgR3N0QXVkaW9FbmNvZGVyIEFQSSBjaGFuZ2VzCisKKzIwMTItMDMtMjkgMjM6MjI6MjggKzA0MDAgIEFsZXhhbmRlciBTYXByeWtpbiA8eGVsZml1bUBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgIG1hdHJvc2thOiBhZGQgR3N0VG9jIHN1cHBvcnQgZm9yIG11eGVyCisKKzIwMTItMDMtMjkgMjM6MTI6MTMgKzA0MDAgIEFsZXhhbmRlciBTYXByeWtpbiA8eGVsZml1bUBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2E6IGFkZCBzdXBwb3J0IGZvciBHc3RUb2MgaW4gZGVtdXhlcgorCisyMDEyLTAzLTI5IDIzOjA1OjE0ICswNDAwICBBbGV4YW5kZXIgU2FwcnlraW4gPHhlbGZpdW1AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2E6IGFkZCBjaGFwdGVyIHN1cHBvcnQgaW4gR3N0TWF0cm9za2FSZWFkQ29tbW9uCisKKzIwMTItMDMtMjkgMTc6MjI6MjMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvd2F2cGFjay5jOgorCSAgdGVzdHM6IHdhdnBhY2s6IGZld2VyIGJ1ZmZlcnMgYXJlIGFsc28gYWRlcXVhdGUgYW5kIG1vcmUgY29udmVuaWVudAorCisyMDEyLTAzLTI5IDE3OjIyOjE5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6CisJICB0ZXN0czogdmlkZW9jcm9wOiB1bm1hcCB2aWRlbyBmcmFtZSBhbmQgdW5yZWYgY2FwcworCisyMDEyLTAzLTI5IDE3OjIyOjA0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW93c2luY2JhbmQuYzoKKwkgIHRlc3RzOiBhdWRpb3dzaW5jYmFuZDogdW5tYXAgZXhhbWluZWQgb3V0cHV0IGJ1ZmZlcnMKKworMjAxMi0wMy0yOSAxNzoyMTo1MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IHBsdWcgcmVmIGxlYWsKKworMjAxMi0wMy0yOSAxNzoyMTo1MCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgIGF1ZGlvcGFub3JhbWE6IGZpeCBzdXBwb3J0ZWQgdGVtcGxhdGUgY2FwcyBhbmQgc2FtcGxlIHByb2Nlc3NpbmcKKworMjAxMi0wMy0yOSAxNzoyMTo0MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJICBhbHBoYWNvbG9yOiBwbHVnIHN0cnVjdHVyZSBsZWFrCisKKzIwMTItMDMtMjkgMTY6MDQ6MjYgKzAxMDAgIHVyYWV1cyA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgVXBkYXRlIHNwZWMgZmlsZSB3aXRoIGxhdGVzdCBwb3J0ZWQgcGx1Z2lucworCisyMDEyLTAzLTI5IDE1OjAzOjA5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgcmVtb3RlLXRyYWNraW5nIGJyYW5jaCAnb3JpZ2luLzAuMTAnCisJICBDb25mbGljdHM6CisJICBjb25maWd1cmUuYWMKKworMjAxMi0wMy0yOCAxNjoyNjo1NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy90YWdzY2hlY2tpbmcuYzoKKwkgIHRlc3RzOiB0YWdzY2hlY2tpbmc6IG11eGVycyBuZWVkIFRJTUUgZm9ybWF0CisKKzIwMTItMDMtMjggMTY6MjY6MTUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy5jOgorCSAgdGVzdHM6IGZsYWNkZWM6IG5lZWRzIGZsYWNwYXJzZSBub3dhZGF5cworCisyMDEyLTAzLTI4IDE0OjQ5OjAzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSAgd2F2cGFja2VuYzogcXVlcnkgZG93bnN0cmVhbSBmb3IgQllURSBzZWVraW5nIHN1cHBvcnQKKworMjAxMi0wMy0yOCAxNDo0ODo0NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IHF1ZXJ5IGRvd25zdHJlYW0gZm9yIEJZVEUgc2Vla2luZyBzdXBwb3J0CisKKzIwMTItMDMtMjggMTQ6NDY6MDMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiBjbGVhbiB1cCBvYnNvbGV0ZSBsb2cgc3RhdGVtZW50CisKKzIwMTItMDMtMjggMTI6NDk6MTkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3BhcnNlci5jOgorCSAgdXBkYXRlIGZvciBidWZmZXIgY2hhbmdlcworCisyMDEyLTAzLTI4IDEyOjE2OjQ1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9keW5hbWljLmM6CisJICB0ZXN0czogYXVkaW9keW5hbWljOiBjb3JyZWN0bHkgcG9ydCBvcmlnaW5hbCB0ZXN0IHRvIG1pbmQgaW4gcGxhY2UgdHJhbnNmb3JtCisKKzIwMTItMDMtMjggMTE6MDU6NDMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jOgorCSAgYXVkaW9meDogbW9yZSBhZGp1c3RtZW50IHRvIGNoYW5nZWQgc2VtYW50aWNzIG9mIGF1ZGlvZmlsdGVyIF9zZXR1cCBtZXRob2QKKworMjAxMi0wMy0yOCAxMToxMDoyNCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZmlyZmlsdGVyLmM6CisJICB0ZXN0czogYXVkaW9maXJmaWx0ZXI6IG5lZ290aWF0ZSB0aGUgaW50ZW5kZWQgcmF3IGF1ZGlvIGZvcm1hdAorCisyMDEyLTAzLTI3IDE4OjQxOjQ1ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgd2F2cGFja3BhcnNlOiBpbml0IGRhdGFzdHJ1Y3R1cmUKKworMjAxMi0wMy0yNyAxNzoxODo0MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGRpY2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSAgZWZmZWN0djogZml4IHN0cmlkZXMKKworMjAxMi0wMy0yNyAxNjo0MTowNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6CisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIGNhcHM6IGltcHJvdmUgY2FwcyBoYW5kbGluZworCSAgQXZvaWQgY2FwcyBjb3B5IGFuZCBsZWFrcworCisyMDEyLTAzLTI3IDE0OjA0OjQ4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYzoKKwkgIHRlc3RzOiBpY3lkZW11eDogYWN0aXZhdGUgaW50ZXJuYWwgdGVzdCBoZWxwZXIgc3JjIHBhZAorCisyMDEyLTAzLTI3IDEyOjQ0OjQ2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDI6IHVwZGF0ZSBmb3IgZ2V0X3BhcmFtCisJICBSZW1vdmUgY29uc3QgZnJvbSB0aGUgR3N0Q2Fwcy4KKwkgIFBsdWcgc29tZSBHc3RTdHJ1Y3R1cmUgbGVha3MKKworMjAxMi0wMy0yNyAwMDowMjowOCArMDMwMCAgUmFpbW8gSsOkcnZpIDxyYWltby5qYXJ2aUBnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwOiBGaXggY29tcGlsaW5nIHdpdGggbWluZ3cuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcyODgwCisKKzIwMTItMDMtMjYgMTg6MzE6NDEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ3ZvbHVtZS5jOgorCSAgdGVzdHM6IHJlcGxheWdhaW46IG1pc2MgY29tcGF0aWJpbGl0eSBmaXhlcworCSAgRGlzY2FyZCBjYXBzIGV2ZW50IHdoZW4gY2hlY2tpbmcgZm9yIGFuZCBjb3VudGluZyB2YXJpb3VzIHRhZyBldmVudHMsCisJICBhbmQgcmVtb3ZlIGFsbCB0ZXN0aW5nIG9mIDggYml0cyBkZXB0aCBpbiAxNiBiaXRzIHdpZHRoIGZvcm1hdCBzaW5jZQorCSAgaXQgbm8gbG9uZ2VyIGV4aXN0cy4KKworMjAxMi0wMy0yNiAxODoyODoyNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW4uYzoKKwkgIHRlc3RzOiBydHA6IG1pc2MgY29tcGF0aWJpbGl5IGZpeGVzCisJICAuLi4gc3VjaCBhcyBhbHdheXMgc2V0dGluZyBwYWQgY2FwcyBhbmQgcHJvdmlkaW5nIG5lZWRlZCBjYXBzIGZpZWxkcy4KKworMjAxMi0wMy0yNiAxODoyNjo0MCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvZmlsdGVyLmM6CisJICB0ZXN0czogdmlkZW9maWx0ZXI6IGVuc3VyZSBpbml0aWFsIHNlZ21lbnQgZXZlbnQKKworMjAxMi0wMy0yNiAxODoyNToyOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5oOgorCSAgc2hhcGV3aXBlOiBwcm9wZXIgdmlkZW8gaW5mbyBhbmQgZnJhbWUgbWFuYWdlbWVudAorCSAgLi4uIHBhcnRpY3VsYXJseSBzaW5jZSBlYWNoIGluY29taW5nIHBhZCBoYXMgYSBkaXN0aW5jdCBmb3JtYXQuCisKKzIwMTItMDMtMjYgMTg6MjQ6MDggKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IGVuc3VyZSBvdXRwdXQgY2FwcyBhcmUgc2V0IHdoZW4gcHVzaGluZyBvdXRwdXQgZGF0YQorCSAgLi4uIGV2ZW4gaWYgc29tZSBTUFMvUFBTIGhhcyBub3QgcGFzc2VkIGJ5IHlldC4KKworMjAxMi0wMy0yNiAxODoyMjo1MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgdmlkZW9maWx0ZXI6IGF2b2lkIGhvbGRpbmcgb2JqZWN0IGxvY2sgd2hlbiBjYWxsaW5nIGJhc2V0cmFuc2Zvcm0gZnVuY3Rpb24KKworMjAxMi0wMy0yNiAxODoyMjowMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBmaXggc29tZSBsb2NrIG1hbmFnZW1lbnQKKwkgIC4uLiB0byBhdm9pZCB0cnlpbmcgdG8gdGFrZSBhIG5vbi1yZWN1cnNpdmUgbG9jayB0d2ljZS4KKworMjAxMi0wMy0yNiAxODoyMToxMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6CisJICBydHBMMTYoZGUpcGF5OiBmaXggcmF3IGF1ZGlvIGZvcm1hdCBpbiB0ZW1wbGF0ZSBjYXBzCisKKzIwMTItMDMtMjYgMTg6MjA6NDAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJICByZXBsYXlnYWluOiBhbHNvIHN0aWxsIHBvc3QgdGhlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzCisKKzIwMTItMDMtMjYgMTU6NTk6MDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IGRvbid0IGVycm9yIGluIHNodXRkb3duCisJICBEb24ndCBsb2cgd2l0aCB0aGUgRVJST1IgY2F0ZWdvcnkgd2hlbiB3ZSBhcmUgc3RvcHBpbmcgYmVjYXVzZSB3ZSBhcmUgc2h1dHRpbmcKKwkgIGRvd24uCisJICBGaXhlczogaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3MjgyNAorCisyMDEyLTAzLTI2IDE1OjUxOjI4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyOiBmaXggbGF0ZW5jeQorCisyMDEyLTAzLTI2IDE1OjMwOjAwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkgIHY0bDI6IGNhbGxlZCBiYXNlIGNsYXNzIHN0YXJ0CisJICBDaGFpbiB1cCB0byB0aGUgYmFzZSBjbGFzcyBzdGFydCBtZXRob2Qgc28gdGhhdCBtZXRhZGF0YSBpcyBwcm9wZXJseSB0YWdnZWQuCisJICBSZW1vdmUgYW4gdW51c2VkIHZhcmlhYmxlLgorCSAgZml4ZXM6IGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzI4MTMKKworMjAxMi0wMy0yNiAxMjoxMjo0NSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgUmVwbGFjZSBtYXN0ZXIgd2l0aCAwLjExCisKKzIwMTItMDMtMjUgMDA6MDA6NTkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5Lmg6CisJICBnZGtwaXhidWZvdmVybGF5OiBhZGQgImFscGhhIiBwcm9wZXJ0eSB0byBzZXQgYWxwaGEgb2Ygb3ZlcmxheSBpbWFnZQorCSAgLi4gb3IgdHVybiB0aGUgb3ZlcmxheSBvZmYgYnkgc2V0dGluZyBhbHBoYSB0byAwLjAKKworMjAxMi0wMy0yNCAwOTo1MTowNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IHBsdWcgY2FwcyBsZWFrCisKKzIwMTItMDMtMjMgMTg6NDc6NDUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbWFnZWZyZWV6ZS5jOgorCSAgdGVzdHM6IGltYWdlZnJlZXplOiByZW1vdmUgZXh0cmFuZW91cyBfdW5yZWYKKworMjAxMi0wMy0yMyAxODo0NzowMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOgorCSAgdGVzdHM6IGF2aW11eDogYWRqdXN0IHRvIG1vZGlmaWVkIHNpbmsgcGFkIHRlbXBsYXRlIG5hbWUKKworMjAxMi0wMy0yMyAxODo0NjozNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJICB0ZXN0czogcXRtdXg6IGNsZWFudXAgZWxlbWVudCBzb29uZXIKKwkgIC4uLiB0byBhdm9pZCBzdHJheSByZWZzIGluIHN0aWNreSBjYXBzIGV2ZW50cy4KKworMjAxMi0wMy0yMyAxODo0NTo1NiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvd3NpbmNiYW5kLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jbGltaXQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIHRlc3RzOiBhcnJhbmdlIGZvciBzZW5kaW5nIGFuIGluaXRpYWwgc2VnbWVudCBldmVudAorCSAgLi4uIHdoaWNoIGlzIG5lZWRlZCBub3dhZGF5cyBzaW5jZSB2YXJpb3VzIGdzdF9zZWdtZW50X3RvXy4uLgorCSAgbm8gbG9uZ2VyIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBmb3JtYXQgdG8gdGhlIHNwZWNpZmllZCBvbmUKKwkgIChmcm9tIF9VTkRFRklORUQpLgorCisyMDEyLTAzLTIzIDE4OjQ0OjE1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogaW1tZWRpYXRlbHkgcmV0dXJuIEdTVF9GTE9XX0VPUworCSAgLi4uIHJhdGhlciB0aGFuIF9PSyBzaW5jZSB3ZSB3aWxsIG5vdCBiZSBjYXJpbmcgYWJvdXQgc3Vic2VxdWVudCBidWZmZXIKKwkgIGFueXdheS4KKworMjAxMi0wMy0yMyAxODo0MzozNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IGZpeCBxdWVyeSBhbmQgX2dldGNhcHMgaGFuZGxpbmcKKworMjAxMi0wMy0yMyAxODo0Mjo0OCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmJhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2ZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb2thcmFva2UuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYzoKKwkgIGF1ZGlvZng6IGFkanVzdCB0byBjaGFuZ2VkIHNlbWFudGljcyBvZiBhdWRpb2ZpbHRlciBfc2V0dXAgbWV0aG9kCisJICAuLi4gaW4gdGhhdCBpdCB3aWxsIG5vdyBjYWxsIHN1YmNsYXNzIHdpdGggaW5mbyBvbiBwcm9wb3NlZCBhdWRpbyBmb3JtYXQKKwkgIHdpdGhvdXQgaGF2aW5nIHNldCB0aGF0IGluZm8gYWxyZWFkeSBpbiBiYXNlIGNsYXNzLiAgQXMgc3VjaCwKKwkgIHN1YmNsYXNzIGNhbiBub3QgcmVseSBvbiBhdWRpbyBmb3JtYXQgaW5mbyBiZWluZyBhdmFpbGFibGUgdGhlcmUuCisKKzIwMTEtMDctMTQgMTY6MjM6NDkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5oOgorCSAgcnRwaDI2NGRlcGF5OiBNYWtlIG91dHB1dCBpbiBBVkMgc3RyZWFtIGZvcm1hdCB3b3JrIGV2ZW4gd2l0aG91dCBjb21wbGV0ZSBzcHJvcC1wYXJhbWV0ZXItc2V0CisJICBUaGlzIGFsbG93cyBvdXRwdXR0aW5nIHN0cmVhbXMgaW4gQVZDIGZvcm1hdCBldmVuIGlmIHRoZSBTUFMvUFBTIGFyZSBzZW50IGluc2lkZQorCSAgdGhlIFJUUCBzdHJlYW0uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0ODUwCisJICBQb3J0ZWQgZnJvbSBtYXN0ZXIKKworMjAxMi0wMS0yOSAxODozOTo1NCArMDAwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIHVkcHNpbms6IFVubG9jayBvbiBlcnJvcgorCisyMDEyLTAzLTIyIDE4OjI3OjMwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IHVzZSBzaW5rIHBhZCB0ZW1wbGF0ZSBjYXBzIHJhdGhlciB0aGFuIHNyYworCisyMDEyLTAzLTIyIDE4OjIzOjIyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDEyLTAzLTIyIDE4OjIxOjUyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuaDoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5oOgorCSAgc21wdGU6IHBvcnQgdG8gMC4xMQorCisyMDEyLTAzLTIyIDE2OjEwOjMzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IGludGVyc2VjdCBkb3duc3RyZWFtIGFsbG93ZWQgcGVlciBjYXBzIHdpdGggc2luayBwYWQgdGVtcGxhdGUKKworMjAxMi0wMy0yMiAxNTo1NToyOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgYmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAwLjExLjIgPT09CisKKzIwMTItMDMtMjIgMTU6NTE6MTMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lby5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkqIHdpbjMyL2NvbW1vbi9nc3R1ZHAtbWFyc2hhbC5jOgorCSAgUmVsZWFzZSAwLjExLjIKKworMjAxMi0wMy0yMiAxMTo1NToyOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDEyLTAzLTIyIDExOjUzOjI0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICB1bnBvcnQgZ2RrcGl4YnVmCisJICBub3QgbWVyZ2VkOiBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0ODUwCisJICBDb25mbGljdHM6CisJICBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW0KKwkgIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sCisJICBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dAorCSAgZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHkKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbAorCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLmgKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmMKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmMKKwkgIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jCisJICBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jCisJICBnc3QvZmx2L2dzdGZsdm11eC5jCisJICBnc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuYworCSAgZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYworCisyMDEyLTAzLTIyIDExOjQ1OjExICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJICBzbXB0ZTogb25seSBzdGFydCBjb2xsZWN0cGFkczIgYXQgc3RhdGUgY2hhbmdlIHJhdGhlciB0aGFuIGluaXQKKworMjAxMi0wMy0yMSAxMzoyMjo0MyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9hbXBsaWZ5LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2R5bmFtaWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZWNoby5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9wYW5vcmFtYS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHRlc3RzOiB1cGRhdGUgZm9yIG1lbW9yeSBhcGkgY2hhbmdlcworCisyMDEyLTAzLTIwIDEwOjI0OjA1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIHVwZGF0ZSBmb3IgbWVtb3J5IGFwaSBjaGFuZ2VzCisKKzIwMTItMDMtMTkgMTI6MDE6NDAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBwZXJmb3JtIGFkZGl0aW9uYWwgZnJhbWUgY3JjIGNoZWNrIGlmIGFwcGxpY2FibGUKKwkgIC4uLiBzdWNoIGFzIGEgZnJhbWUgaGVhZGVyIHBhcnNpbmcgdGhyb3dpbmcgc29tZSBzdXNwaWNpb3VzIHdhcm5pbmdzLgorCSAgU28gd2UgY2FuIGJlIGEgYml0IG1vcmUgY29udmluY2VkIHdlIGRldGVybWluZSB0aGUgcmlnaHQgZnJhbWUgZW5kLgorCisyMDEyLTAzLTE5IDExOjU4OjE1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogYXZvaWQgaW5kZWZpbml0ZSBleHRlbmRlZCBzZWFyY2ggZm9yIGZyYW1lIGVuZCBpZiBwb3NzaWJsZQorCSAgLi4uIHdoaWNoIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaWYgbG9ja2VkIG9uIHRvIHRoZSB3cm9uZyBmcmFtZSBzdGFydAorCSAgYW5kL29yIGNvcnJ1cHQgZnJhbWUgYmVpbmcgY3JjIGNoZWNrZWQuCisKKzIwMTItMDMtMTYgMTg6MjM6MjkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmg6CisJICBmbGFjZGVjOiBpbXByb3ZlIGVycm9yIGhhbmRsaW5nIGFuZCByZXNpbGllbmNlCisJICAuLi4gYnkgbm90aW5nIHRoYXQgb25lIG9jY3VycmVkIGluIHRoZSBmaXJzdCBwbGFjZSwgYW5kIHRoZW4gYXBwcm9wcmlhdGVseQorCSAgaWdub3Jpbmcgc29tZSB0cmFuc2llbnQgb25lcy4KKworMjAxMi0wMy0xOSAxMDozMzo0OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBuZWdvdGlhdGUgYW4gYWxsb2NhdG9yIG9uIHRoZSBzcmNwYWRzCisJICBXZSBkbyBhbiBBTExPQ0FUSU9OIHF1ZXJ5IHRvIGZpbmQgb3V0IGFuIGFsbG9jYXRvciBhbmQgcGFyYW1ldGVycyBvbiB0aGUKKwkgIHNyY3BhZHMuIFRoaXMgd2F5IGRlY29kZXJzIChhbmQgc2lua3MpIGNhbiBzcGVjaWZ5IHRoZSBtZW1vcnkgYW5kIHBhcmFtZXRlcnMKKwkgIHRoZXkgd2FudCB1cyB0byB3cml0ZSBpbnRvLgorCisyMDEyLTAzLTE3IDIwOjUzOjMxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5Lmg6CisJICBkb2NzOiB1cGRhdGUgZG9jcyBmb3IgbmV3IHByb3BlcnRpZXMgYW5kIGFkZCBnZGtwaXhidWZvdmVybGF5IGVsZW1lbnQKKwkgIFNvbWV3aGF0IGF0IGxlYXN0LiBObyBpZGVhIHdoeSBpdCBkb2Vzbid0IHBpY2sgdXAgdGhlIGRlc2NyaXB0aW9uCisJICBvciBleGFtcGxlIHBpcGVsaW5lLgorCisyMDEyLTAzLTE4IDAwOjExOjE5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvTWFrZWZpbGUuYW06CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zm92ZXJsYXkuYzoKKwkgIGdka3BpeGJ1Zm92ZXJsYXk6IG1ha2UgbW9zdCBwcm9wZXJ0aWVzIGNvbnRyb2xsYWJsZSBhbmQgZmxhZyB0aGVtIGFzIG11dGFibGUtcGxheWluZworCisyMDEyLTAzLTE3IDIzOjQxOjM4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5oOgorCSAgZ2RrcGl4YnVmb3ZlcmxheTogYWRkIHByb3BlcnRpZXMgZm9yIHBvc2l0aW9uaW5nIGFuZCBzaXppbmcKKworMjAxMi0wMy0xNyAyMDoxODoxOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9nZGtfcGl4YnVmL01ha2VmaWxlLmFtOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5Lmg6CisJICBnZGtwaXhidWY6IGFkZCBnZGtwaXhidWZvdmVybGF5IGVsZW1lbnQKKwkgIFN0aWxsIGxhY2tzIGZlYXR1cmVzIHN1Y2ggYXMgcG9zaXRpb25pbmcgb3IgcmVzaXppbmcsIG9yCisJICBhbmltYXRpb25zLCBidXQgaXQncyB1c2FibGUgYWxyZWFkeSwgYW5kIHN1cHBvcnRzIGxvdHMgb2YKKwkgIGZvcm1hdHMuCisKKzIwMTItMDMtMTYgMjI6NTI6MDIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkgIGRvbid0IHBva2UgaW50byBiYXNldHJhbnNmb3JtIGludGVybmFscworCSAgQnV0IHVzZSB0aGUgbWV0aG9kcworCisyMDEyLTAzLTE2IDIxOjQ3OjIxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgZG9uJ3QgcGFzcyByYW5kb20gcG9pbnRlcnMgdG8gcHVsbF9yYW5nZQorCisyMDEyLTAzLTE1IDIyOjE1OjQ3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSAgdXBkYXJ0ZSBmb3IgYnVmZmVycG9vbCBjaGFuZ2VzCisKKzIwMTItMDMtMTUgMjI6MTE6MTcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdXBkYXRlIGZvciBidWZmZXJwb29sIGNoYW5nZXMKKworMjAxMi0wMy0xNSAyMDozNzo1NiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB1cGRhdGUgZm9yIGFsbG9jYXRpb24gcXVlcnkgY2hhbmdlcworCisyMDExLTA3LTE0IDE2OjIzOjQ5IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuaDoKKwkgIHJ0cGgyNjRkZXBheTogTWFrZSBvdXRwdXQgaW4gQVZDIHN0cmVhbSBmb3JtYXQgd29yayBldmVuIHdpdGhvdXQgY29tcGxldGUgc3Byb3AtcGFyYW1ldGVyLXNldAorCSAgVGhpcyBhbGxvd3Mgb3V0cHV0dGluZyBzdHJlYW1zIGluIEFWQyBmb3JtYXQgZXZlbiBpZiB0aGUgU1BTL1BQUyBhcmUgc2VudCBpbnNpZGUKKwkgIHRoZSBSVFAgc3RyZWFtLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NDg1MAorCisyMDEyLTAzLTE1IDE0OjA2OjQwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdXBkYXRlIGZvciBidWZmZXJwb29sIGFwaSBjaGFuZ2UKKworMjAxMi0wMy0xNSAxMzozNzozNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJICB1cGRhdGUgZm9yIG1lbW9yeSBhcGkgY2hhbmdlcworCisyMDEyLTAzLTE1IDEzOjM2OjE3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYW5ub2RleC9nc3RjbW1sZGVjLmM6CisJKiBleHQvYW5ub2RleC9nc3RjbW1sZW5jLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJiYW5kLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJsaW1pdC5jOgorCSAgdXBkYXRlIGZvciBtZW1vcnkgYXBpIGNoYW5nZXMKKworMjAxMi0wMy0xNCAyMTozNjowMyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAgdXBkYXRlIGZvciBtZW1vcnkgYXBpIGNoYW5nZXMKKworMjAxMi0wMy0xNCAxOTo1NTozMiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdGFrZSBwYWRkaW5nIGludG8gYWNjb3VudAorCisyMDEyLTAzLTE0IDE3OjA3OjUwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuaDoKKwkgIGltYWdlZnJlZXplOiBwb3J0IHRvIDAuMTEKKworMjAxMi0wMy0xNCAxNTo0NTozOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHJlcGx5IEZBTFNlIG9uIHNlcmlhbGl6ZWQgcXVlcmllcworCisyMDEyLTAzLTEzIDIzOjA4OjM4ICswMTAwICBBbmRyZWogR2VsZW5iZXJnIDxhbmRyZWouZ2VsZW5iZXJnQHVkby5lZHU+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5oOgorCSAgcG5nZW5jOiBhZGQgc3VwcG9ydCBmb3IgOC0gYW5kIDE2LWJpdCBncmF5IGltYWdlcworCSAgQWRkIHN1cHBvcnQgZm9yIGRpcmVjdCBlbmNvZGluZyBvZiA4LSBhbmQgMTYtYml0IGJpZyBlbmRpYW4gZ3JheSBpbWFnZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcyMDI1CisKKzIwMTItMDMtMTQgMTE6MjE6MzIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSAgbXA0dnBheTogd2UgY2FuIGFsc28gaGFuZGxlIHgtZGl2eAorCisyMDEyLTAzLTE0IDEwOjM5OjUzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSAgd2F2cGFja2VuYzogZG8gbm90IHNldCBvdXRwdXQgY2FwcyBkaXJlY3RseQorCSAgLi4uIGJ1dCB1c2UgYmFzZSBjbGFzcyBmdW5jdGlvbiBpbnN0ZWFkLgorCisyMDEyLTAzLTEzIDIxOjMxOjQ4ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSAgbXA0dmRlcGF5OiBmaXggYnVmZmVyIGhhbmRsaW5nCisJICBEb24ndCBhbHdheXMgb3V0cHV0IHRoZSBwYXlsb2FkIHN1YmJ1ZmZlciwgdXNlIGEgc2VwYXJhdGUgdmFyaWFibGUgdG8KKwkgIG1ha2UgdGhpbmdzIGNsZWFyZXIgYW5kIHdpdGhvdXQgdGhlIGVycm9yLgorCisyMDEyLTAzLTEzIDIwOjQ5OjQzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgdWRwc2luazogbWFrZSBidWZmZXItc2l6ZSB3b3JrIGFnYWluCisKKzIwMTItMDMtMTMgMjA6MzY6NTYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IGZpeCBTT19SQ1ZCVUYgaGFuZGxpbmcKKworMjAxMi0wMy0xMyAxOToyNjo0NyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogZG9uJ3QgbGVhayB0aGUgYWRkcmVzcworCisyMDEyLTAzLTEzIDE5OjI2OjIzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgaDI2NGRlcGF5OiB1bm1hcCBvbiBlbXB0eSBwYWNrZXQKKworMjAxMi0wMy0xMyAxODowNzoxOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiBkbyBEVFMgYW5kIFBUUyBjb3JyZWN0bHkKKworMjAxMi0wMy0xMyAxNzo1NDo1MCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBzZXQgRFRTIGFuZCBQVFMgb24gb3V0cHV0IGJ1ZmZlcnMKKwkgIFNldCBQVFMgYW5kIERUUyBvbiBvdXRwdXQgYnVmZmVycyBpbnN0ZWFkIG9mIGp1c3QgdGhlIFBUUy4gSW4gc3RyZWFtaW5nIGNhc2VzCisJICB5b3Ugd2FudCB0byBzeW5jaHJvbml6ZWQgZW5jb2RlZCBkYXRhIGJhc2VkIG9uIHRoZSBEVFMgYmVjYXVzZSB0aGF0IGlzCisJICBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuCisKKzIwMTItMDMtMTMgMTc6NTQ6MjggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9kdW1wLmM6CisJICBxdGRlbXV4OiBkZWJ1ZyBhZGRpdGlvbmFsIHNkdHAgZmxhZworCisyMDEyLTAzLTEzIDE3OjI3OjMyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzoKKwkgIHJ0cDogZml4IHVubWFwIGNhbGxzCisKKzIwMTItMDMtMTMgMTM6MjU6MDkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkgIHB1bHNlOiBmaXggZm9ybWF0cywgd2UgY2FuIG5vdCBoYW5kbGUgUzggYnV0IG9ubHkgVTgKKworMjAxMi0wMy0xMyAxMjo0MDozNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogZml4IHN0cmVhbWhlYWRlcnMKKwkgIEZpeCB0aGUgY2FwcyBvZiBmbGFjZW5jLCB0aGUgcmVmZXJlbmNlIGVuY29kZXIgb25seSBzdXBwb3J0IDI0IGJpdHMgaW4KKwkgIDMyIGJpdHMuCisJICBTZXQgc3RyZWFtaGVhZGVyIG9uIG91dHB1dCBjYXBzLgorCisyMDEyLTAzLTEyIDE3OjE3OjAxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSAgdXBkYXRlIGZvciBjYXBzIGFwaSBjaGFuZ2VzCisKKzIwMTItMDMtMTIgMTY6NDM6MjcgKzAyMDAgIFNyZWVyZW5qIEJhbGFjaGFuZHJhbiA8c3JlZXJlbmouYmFsYWNoYW5kcmFuQGludGVsLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlLmFjIDogYnVtcCBHTGliIHJlcXVpcmVtZW50IHRvIDIuMzEuMTQKKwkgIEZpeGVzIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzE5MTEKKworMjAxMi0wMy0xMiAxNToyNzoyNyArMDEwMCAgUm9zcyBCdXJ0b24gPHJvc3MgYXQgYnVydG9uaW5pLmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogZ2VuZXJhdGUgc2Vla3RhYmxlcyBldmVyeSAxMCBzZWMgYnkgZGVmYXVsdAorCSAgU2luY2UgdGhpcyBpcyB3aGF0IHRoZSBjb21tYW5kIGxpbmUgdG9vbCBkb2VzIGFzIHdlbGwsIGl0IHNlZW1zIGxpa2UKKwkgIGEgYmV0dGVyIGRlZmF1bHQuCisKKzIwMTItMDMtMTAgMTM6NDQ6MDggKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IG9ubHkgdW5sb2NrIHBhZCB3aGVuIGl0IHdhcyBsb2NrZWQKKwkgIFRoaXMgZml4ZXMgdGhlIG11dGV4IGJlaW5nIHVubG9ja2VkIHRvbyBtdWNoIGFuZCBlbmRpbmcgdXAgYWxsb3dpbmcKKwkgIG90aGVyIHRocmVhZHMgd2hlbiB0aGV5IHNob3VsZCBub3QuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcxNzc2CisKKzIwMTItMDMtMDcgMTM6Mzk6NTAgKzAxMDAgIEFuZHJlaiBHZWxlbmJlcmcgPGFuZHJlai5nZWxlbmJlcmdAdWRvLmVkdT4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkgIHBuZ2RlYzogYWRkIHN1cHBvcnQgZm9yIHZpZGVvL3gtcmF3LWdyYXkgZm9ybWF0cworCSAgcG5nZGVjIGNhbiBub3cgZGVjb2RlIGdyYXkgOC0gYW5kIDE2LWJpdCBpbWFnZXMgd2l0aG91dCBhbHBoYSBjaGFubmVsCisJICBkaXJlY3QgdG8gdmlkZW8veC1yYXctZ3JheSBmb3JtYXQuIDE2LWJpdCBncmF5IGltYWdlcyBoYXZlIGJpZy1lbmRpYW4KKwkgIGZvcm1hdCwgYmVjYXVzZSBpdCdzIG5hdGl2ZSBQTkcgZW5kaWFubmVzcy4gR3JheSBpbWFnZXMgd2l0aCBhbHBoYQorCSAgY2hhbm5lbCBzdGlsbCBjb252ZXJ0ZWQgdG8gUkdCQS4KKwkgIFNpZ25lZC1vZmYtYnk6IEFuZHJlaiBHZWxlbmJlcmcgPGFuZHJlai5nZWxlbmJlcmdAdWRvLmVkdT4KKworMjAxMi0wMy0wOCAxNzowNzo1MSArMDEwMCAgTWFyYyBMZWVtYW4gPG1hcmMubGVlbWFuQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgZ3N0cnRzcHNyYzogZGlzYWJsZSBSVFNQIGtlZXAtYWxpdmUgb24gcmVxdWVzdAorCisyMDEyLTAzLTEyIDE0OjQ4OjQ3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkgIHNtcHRlOiBmaXggc3RyaWRlIGhhbmRsaW5nCisKKzIwMTItMDMtMTIgMTI6MjM6MTUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9maWx0ZXIuYzoKKwkgIGZpeCBmb3IgY2FwcyBfbm9ybWFsaXplIGNoYW5nZXMKKworMjAxMi0wMy0xMiAxMTo0NzozNSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgZml4IGZvciBjYXBzIGFwaSBjaGFuZ2UKKworMjAxMi0wMy0xMiAxMDo0Mzo1NyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogc3lzL29zczQvb3NzNC1hdWRpby5jOgorCSAgZml4IGZvciBfZG9fc2ltcGxpZnkgY2hhbmdlcworCisyMDEyLTAzLTEyIDA4OjQ4OjMyICswMTAwICBOaWNvbGEgTXVyaW5vIDxuaWNvbGEubXVyaW5vQGdtYWlsLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIGdzdDogRml4IHNvbWUgcXVlcnkgbGVha3MKKworMjAxMi0wMy0xMSAxOTowNjo1OSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgZml4IGZvciBjYXBzIGFwaSBjaGFuZ2VzCisKKzIwMTItMDMtMTEgMTk6MDY6MzcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICBmaXggZm9yIGNhcHMgYXBpIGNoYW5nZXMKKworMjAxMi0wMy0xMCAxMDo1MTo0NCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L2xhdy9hbGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6CisJICBmaXggdGVtcGxhdGUgY2FwcyByZWZjb3VudAorCisyMDEyLTAzLTA5IDE1OjUzOjMyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBmaXggdXNlIG9mIEFDX0xBTkdfUFJPR1JBTQorCSAgTm8gbmVlZCB0byBpbmNsdWRlIHRoZSBpbnQgbWFpbiAoKSB7IH0gYml0cywgdGhlIGJvZHkgaXMgZW5vdWdoLgorCisyMDEyLTAzLTA5IDE1OjI1OjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBmaXggYXV0b2dlbi5zaCB3YXJuaW5ncworCSAgY29uZmlndXJlLmFjOjQxMDogd2FybmluZzogQUNfTEFOR19DT05GVEVTVDogbm8gQUNfTEFOR19TT1VSQ0UgY2FsbCBkZXRlY3RlZCBpbiBib2R5CisKKzIwMTItMDMtMDggMTM6MDY6MTMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuaDoKKwkgIGFhc2luazogcHJvcG9zZSB2aWRlb21ldGEgdXB0cmVhbQorCSAgc3ViY2xhc3MgZnJvbSB2aWRlb3NpbmsuCisJICBQcm9wb3NlIHZpZGVvbWV0YSB1cHN0cmVhbSBiZWNhdXNlIHdlIGNhbiBoYW5kbGUgaXQgd2l0aCB0aGUgdmlkZW8gYXBpLgorCisyMDEyLTAzLTA4IDAxOjUzOjUwIC0wNTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogZG8gbm90IHVucmVmIHNhbXBsZSBjYXBzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcxNTM0CisKKzIwMTItMDMtMDggMTE6MzY6MDEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1dG9kZXRlY3QuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOgorCSAgdGVzdHM6IGltcHJvdmUgbW9yZSB0ZXN0cworCisyMDEyLTAzLTA4IDExOjIwOjQzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jYXBzc2V0dGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9nZGtwaXhidWZzaW5rLmM6CisJICB0ZXN0czogZml4IHNvbWUgbW9yZSB0ZXN0cworCisyMDEyLTAzLTA3IDE1OjIyOjM2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogaW1wcm92ZSBjbGVhbnVwCisJICBSZXVzZSBjbGVhbnVwIG1ldGhvZHMgdG8gbWFrZSBzdXJlIHdlIHJlbW92ZSBhbGwgcGFkcyBjb3JyZWN0bHkKKworMjAxMi0wMy0wNyAxNTowMDoyNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogc2V0IGNhcHMgd2l0aG91dCB0aGUgbG9jaworCSAgUmVsZWFzZSB0aGUgbG9jayBiZWZvcmUgc2V0dGluZyB0aGUgY2FwcyBvbiB0aGUgc3JjcGFkLCB3aGljaCB0cmlnZ2VycyBhbiBldmVudCwKKwkgIHdoaWNoIGNvdWxkIGV2ZW50dWFsbHkgY2FsbCBiYWNrIGludG8gdXMgYW5kIGNhdXNlIGEgZGVhZGxvY2suCisKKzIwMTItMDMtMDcgMTQ6NTU6MDggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkgIHB0ZGVtdXg6IHNldCBjYXBzIGFmdGVyIGFjdGl2YXRpbmcgdGhlIHBhZAorCSAgU2V0IHRoZSBjYXBzIGFmdGVyIHdlIGFjdGl2YXRlZCB0aGUgcGFkIG9yIGVsc2UgaXQgd2lsbCBqdXN0IGZhaWwuCisKKzIwMTItMDMtMDcgMTQ6NTQ6MTUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9sYXcvYWxhdy5jOgorCSogZ3N0L2xhdy9tdWxhdy5jOgorCSAgbGF3OiBhZGQgbGF5b3V0IHRvIGF1ZGlvIGNhcHMKKworMjAxMi0wMy0wNyAxNDo1MTowOSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2xhdy9hbGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9hbGF3LWRlY29kZS5oOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmg6CisJICBsYXc6IHVzZSBHc3RBdWRpb0luZm8KKwkgIFVzZSBHc3RBdWRpb0luZm8gdG8gZ2VuZXJhdGUgb3V0cHV0IGNhcHMuCisKKzIwMTItMDMtMDcgMDQ6MjA6MDAgLTA1MDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0ZGVtdXg6IGNvdmVydCBhcnQgdGFnIHR5cGUgaXMgR3N0U2FtcGxlIG5vdCBHc3RCdWZmZXIgbm93CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcxNTM0CisKKzIwMTItMDMtMDcgMTA6Mjg6NTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBwby9QT1RGSUxFUy5pbjoKKwkgIHBvOiBmaXggUE9URklMRVMuaW4gZm9yIG5ldyB3YXZwYWNrcGFyc2UgbG9jYXRpb24gaW4gc291cmNlIHRyZWUKKworMjAxMi0wMy0wNiAyMTo0NDozNiAtMDgwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcDogQ2hhbmdlIHRoZSBkZWZhdWx0IHBvcnQgdG8gNTAwNAorCSAgdWRwc3JjL3VkcHNpbmsgYXJlIGFsbW9zdCBhbHdheXMgdXNlZCB3aXRoIFJUUCwgc28gbGV0J3MgdXNlIGFuCisJICBSVFAgcG9ydCBhcyB0aGUgZGVmYXVsdCBwb3J0LiAgSXQncyB1bmNsZWFyIHdoeSA0OTUxIHdhcyB1c2VkLCBpdAorCSAgZ29lcyBiYWNrIHRvIGVhcmx5IGNvbW1pdHMgaW4gQ1ZTLgorCisyMDEyLTAzLTA2IDIxOjM2OjAyIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSAgTWVyZ2UgYnJhbmNoICcwLjExJyBvZiBzc2g6Ly9naXQuZnJlZWRlc2t0b3Aub3JnL2dpdC9nc3RyZWFtZXIvZ3N0LXBsdWdpbnMtZ29vZCBpbnRvIDAuMTEKKworMjAxMi0wMy0wNiAxNTo1ODoyMCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSAgc3BlZXhkZWM6IHVzZSBiYXNlIGNsYXNzIHRhZyBoYW5kbGluZyBoZWxwZXIKKwkgIC4uLiBzbyBhcyB0byBlbnN1cmUgdGhlc2UgdG8gYmUgaGFuZGxlZCBhbmQgc2VudCBhdCBwcm9wZXIgdGltZS4KKworMjAxMi0wMy0wNiAxNDoyNToyNyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuYzoKKwkgIHdhdnBhY2s6IEZpeCBwb3NzaWJsZSB1bmRlcmZsb3cgb2YgdW5zaWduZWQgaW50ZWdlciB2YXJpYWJsZQorCisyMDEyLTAzLTA2IDE0OjIyOjQzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHhpbWFnZXNyYzogRml4ICdjb21wYXJpc29uIG9mIHVuc2lnbmVkIGV4cHJlc3Npb24gPj0gMCBpcyBhbHdheXMgdHJ1ZScKKwkgIFRoaXMgdmFyaWFibGUgY2FuIG5ldmVyIGJlIGJlbG93IHplcm8gYW55d2F5LgorCisyMDEyLTAzLTA2IDE0OjE4OjMzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogVXNlIGNvcnJlY3QgZW51bSBmb3IgcmV0dXJuIHZhbHVlcworCisyMDEyLTAzLTA2IDE0OjE2OjIxICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBkdmRlcGF5LmM6CisJICBkdmRlcGF5OiBGaXggJ2NvbXBhcmlzb24gb2YgdW5zaWduZWQgZXhwcmVzc2lvbiA+PSAwIGlzIGFsd2F5cyB0cnVlJyBjb21waWxlciB3YXJuaW5nCisJICBUaGlzIHdhcyBhbiBhY3R1YWwgYnVnIGFzIGl0IGNvdWxkJ3ZlIGNhdXNlZCByZWFkaW5nIGZyb20KKwkgIGludmFsaWQgbWVtb3J5IGFyZWFzIHdoZW4gdGhlIGlucHV0IGlzIGJyb2tlbi4KKworMjAxMi0wMy0wNiAxMzoyMToxMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5hc206CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFRvcC5pbmM6CisJICBkZWludGVybGFjZTogRml4ICd2YXJpYWJsZSAnb2xkYngnIGlzIHVuaW5pdGlhbGl6ZWQgd2hlbiB1c2VkIGhlcmUnIGNvbXBpbGVyIHdhcm5pbmdzCisKKzIwMTItMDMtMDYgMTM6MTk6MjQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXggJ2ltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSBlbnVtZXJhdGlvbiB0eXBlICdHc3REZWludGVybGFjZUZpZWxkcycgdG8gZGlmZmVyZW50IGVudW1lcmF0aW9uIHR5cGUgJ0dzdERlaW50ZXJsYWNlTW9kZScnIGNvbXBpbGVyIHdhcm5pbmcKKworMjAxMi0wMy0wNSAxNToyOTo1NiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuaDoKKwkgIGdkazogY2xlYW51cHMgYW5kIGZpeCByb3dzdHJpZGUKKwkgIEZpeCB0aGUgb3V0cHV0IHJvd3N0cmlkZSwgd2UgbmVlZCB0byB0YWtlIHRoZSBzdHJpZGUgb2YgdGhlIG91dHB1dCB2aWRlbyBmcmFtZS4KKwkgIFNpbmNlIHdlIGFyZSBhbHNvIGRlYWxpbmcgd2l0aCBwbGFuZXMsIHRha2UgdGhlIHBsYW5lIGRhdGEgYW5kIHN0cmlkZS4KKwkgIERvbid0IHN0b3JlIHRoZSBzYW1lIGluZm8gdHdpY2UgaW4gZGlmZmVyZW50IHZhcmlhYmxlcy4KKworMjAxMi0wMy0wNSAxMzozMTo0NCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJICBnZGtwaXhidWY6IGZpeCBldmVudCBoYW5kbGluZworCisyMDEyLTAzLTA1IDEyOjIwOjA3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZGVjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZW5jLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrcGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZwYWNrLmM6CisJICB0ZXN0czogcG9ydCB3YXZwYWNrIHRlc3RzIHRvIDAuMTEKKworMjAxMi0wMy0wNSAxMzozNjozOSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaDoKKwkgIHdhdnBhY2tkZWM6IHBvcnQgdG8gMC4xMQorCisyMDEyLTAzLTA1IDEyOjE3OjM5ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5oOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSAgd2F2cGFja2VuYzogcG9ydCB0byAwLjExCisKKzIwMTItMDMtMDUgMTM6MzQ6MzYgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBleHQvd2F2cGFjay9NYWtlZmlsZS5hbToKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2suYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmg6CisJICB3YXZwYWNrOiByZW1vdmUgbGVnYWN5IHdhdnBhY2twYXJzZQorCisyMDEyLTAzLTA1IDEyOjE1OjQ0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdHdhdnBhY2twYXJzZS5oOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9wbHVnaW4uYzoKKwkgIGF1ZGlvcGFyc2VyczogcG9ydCB3YXZwYWNrcGFyc2UgdG8gMC4xMQorCisyMDEyLTAzLTA1IDEzOjI5OjU5ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmMKKwkgIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmMKKwkgIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmgKKwkgIHN5cy92NGwyL2dzdHY0bDJ2aWRlb292ZXJsYXkuYworCisyMDEyLTAzLTA1IDEyOjQzOjE3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB4LXJhdy1iYXllciAtPiB4LWJheWVyCisKKzIwMTItMDMtMDUgMTE6MTc6MzAgKzAxMDAgIE9sZWtzaWogUmVtcGVsIChBbGV4ZXkgRmlzaGVyKSA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYzoKKwkgIHY0bDJzaW5rOiBkb24ndCB1c2UgZGVwcmVjYXRlZCBYS2V5Y29kZVRvS2V5c3ltCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcxMjk5CisJICBTaWduZWQtb2ZmLWJ5OiBPbGVrc2lqIFJlbXBlbCAoQWxleGV5IEZpc2hlcikgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworMjAxMi0wMy0wNSAxMjowMzowMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3hpbWFnZS9NYWtlZmlsZS5hbToKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICB4aW1hZ2U6IHVzZSBuZXcgc3R5bGUgY2FwcworCisyMDEyLTAzLTA1IDEwOjQ5OjMzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSAgd2F2cGFja2RlYzogYWxsb3cgc29tZSB0aW1lc3RhbXAgdG9sZXJhbmNlIHRvIGFycmFuZ2UgZm9yIHBlcmZlY3QgdGltZXN0YW1waW5nCisJICAuLi4gd2hpY2ggYWxzbyBoYXBwZW5zIHRvIG1ha2Ugc29tZSBtb3JlIHVuaXQgdGVzdHMgcGFzcy4KKworMjAxMi0wMy0wNSAxMDo0Nzo0NCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkgIHdhdnBhY2tkZWM6IGZpeCBjb3B5aW5nIG91dHB1dCBkYXRhCisKKzIwMTItMDMtMDUgMTA6NDY6NTEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJICB3YXZwYWNrZW5jOiByZXN0b3JlIGxlZ2FjeSBidWZmZXIgb2Zmc2V0IGRlY29yYXRpbmcgc29tZXdoYXQKKwkgIC4uLiBhdCBsZWFzdCBzdWZmaWNpZW50bHkgdG8gYWlkIGluIHJlY29nbml6aW5nIHJld3JpdHRlbiBoZWFkZXIgYnVmZmVyCisJICBtYWtpbmcgdW5pdCB0ZXN0IHBhc3MuCisKKzIwMTItMDMtMDUgMTA6NTE6MzMgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmM6CisJICB3YXZwYWNrcGFyc2U6IGluaXRpYWxpemUgaGVhZGVyIHRvIHNpbGVuY2Ugb2xkZXIgZ2NjIHZlcnNpb25zCisKKzIwMTItMDMtMDUgMTA6NDU6NDYgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgd2F2cGFja3BhcnNlOiByZW1vdmUgZW1wdHkgbGluZXMgaW4gdmFyYWJsZSBkZWNsYXJhdGlvbnMgY2F1c2VkIGJ5IG9sZCBpbmRlbnQKKworMjAxMi0wMy0wNSAxMDo0NDo1NCArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFjay5oOgorCSAgamFjazogZml4IG9idmlvdXMgd3JvbmcgZGVmaW5pdGlvbiBmb3IgdGhlIG1hc3RlciBmbGFnCisKKzIwMTItMDMtMDQgMTk6NTU6MjYgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5oOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuaDoKKwkgIGphY2s6IGNoYW5nZSB0aGUgdHJhbnNwb3J0LW1vZGUgZW51bSBpbnRvIGZsYWdzCisJICBPbmUgY2FuIHVzZSAob3Igbm90IHVzZSkgbWFzdGVyIGFuZCBzbGF2ZSBtb2RlIGluZGVwZW5kZW50bHkuCisKKzIwMTItMDMtMDIgMTE6NDk6MDIgLTA1MDAgIEFudG9pbmUgVHJlbWJsYXkgPGhleGEwMEBnbWFpbC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IHN1cHBvcnQgdXAgdG8gNiBjaGFubmVscyBvZiBBQy0zCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcxMjIwCisKKzIwMTItMDMtMDMgMTM6MDQ6NDggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMjogY2xlYXIgRElTQ09OVCBmbGFnIHdoZW4gcmVjeWNsaW5nIGJ1ZmZlcnMgaW50byB0aGUgYnVmZmVyIHBvb2wKKwkgIFRoZSBiYXNlIGNsYXNzIG1heSBoYXZlIHNldCB0aGUgRElTQ09OVCBmbGFnIG9uIHRoZSBmaXJzdCBidWZmZXIgcHVzaGVkCisJICBvdXQuIFdlIG5lZWQgdG8gY2xlYXIgdGhhdCB3aGVuIHJlY3ljbGluZyBidWZmZXJzIGJhY2sgaW50byB0aGUgYnVmZmVyCisJICBwb29sLCBvdGhlcndpc2Ugd2UgY29uc3RhbnRseSBwdXNoIG91dCBidWZmZXJzIHdpdGggdGhlIGRpc2NvbnQgZmxhZworCSAgc2V0LCB3aGljaCBtaWdodCB1cHNldCBkb3duc3RyZWFtIGVsZW1lbnRzLCBlc3AuIGZvciBjb21wcmVzc2VkCisJICBmb3JtYXRzIGxpa2UgbXBlZy10cy4KKworMjAxMi0wMy0wMSAxNDoxNToyOSArMDEwMCAgT2xla3NpaiBSZW1wZWwgKEFsZXhleSBGaXNoZXIpIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSAgdjRsMnNyYzogZml4IHY0bDJfbXVubWFwKCkgZm9yIGNvbXByZXNzZWQgZm9ybWF0cworCSAgTWFrZSBzdXJlIHdlIGFsd2F5cyBjYWxsIG11bm1hcCgpIHdpdGggdGhlIHNhbWUgc2l6ZSB3ZSBjYWxsZWQgbW1hcCgpCisJICB3aXRoIGJlZm9yZS4KKwkgIEN1cnJlbnQgdjRsMnNyYyB1c2VzIHRoZSBzYW1lIHN0cnVjdHVyZSBmb3IgVklESU9DX1FVRVJZQlVGLCBWSURJT0NfUUJVRgorCSAgYW5kIHY0bDJfbXVubWFwIGNhbGxzLiBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZSB2aWRlbyBidWZmZXIgc2l6ZSAobGVuZ3RoKQorCSAgbWF5IHZhcnkgZm9yIGNvbXByZXNzZWQgb3IgZW11bGF0ZWQgYnVmcy4gVklESU9DX1FCVUYgd2lsbCBjaGFuZ2UgaXQgaWYKKwkgIHdlIHBhc3MgdGhlIHBvaW50ZXIgb2YgYSB2NGwyX2J1ZmZlci4gVGhpcyBpcyB3aHkgd2Ugc2hvdWxkIGF2b2lkIHVzaW5nCisJICBzYW1lIHZhcmlhYmxlIGZvciBtbWFwIGFuZCB2aWRlbyBidWZmZXJzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3MTEyNgorCisyMDEyLTAzLTAyIDExOjE3OjMzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9maXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmM6CisJKiBnc3QvZmx2L2dzdGluZGV4LmM6CisJICBnc3Q6IFVwZGF0ZSBmb3IgdGhlIGdzdG1hcnNoYWwuW2NoXSByZW1vdmFsCisKKzIwMTItMDMtMDIgMTA6MTM6MDggKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VtaXhlcmN0cmwuaDoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaDoKKwkgIG1peGVyL2NvbG9yYmFsYW5jZTogVXBkYXRlIGZvciBBUEkgY2hhbmdlcworCisyMDEyLTAzLTAxIDE3OjE1OjU3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJICBhYXNpbms6IGZpeCBzdHJpZGUKKworMjAxMi0wMy0wMSAxMTozNjozNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jOgorCSAgYXVkaW9wYXJzZXJzOiBkaXNhYmxlIG5vbi1wb3J0ZWQgd2F2cGFja3BhcnNlCisKKzIwMTItMDMtMDEgMTE6Mjk6NTAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmMKKwkgIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvaWlyZmlsdGVyLmMKKwkgIHRlc3RzL2V4YW1wbGVzL3Y0bDIvcHJvYmUuYworCisyMDEyLTAyLTI5IDIyOjMxOjIxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5jOgorCSAgZ2RrcGl4YnVmc2luazogcmVtb3ZlIGRlcHJlY2F0ZWQgcHJvcGVydHkKKworMjAxMi0wMi0yOSAyMjozMDo1NiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOgorCSAgZ2RrcGl4YnVmc2NhbGU6IHJlbW92ZSBkZXByZWNhdGVkIHByb3BlcnR5CisKKzIwMTItMDItMjkgMjI6Mjg6MDEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmg6CisJICBnZGtwaXhidWZzaW5rOiBwb3J0IHRvIDAuMTEKKworMjAxMi0wMi0yOSAyMjoyNToyMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5oOgorCSAgZ2RrcGl4YnVmc2NhbGU6IHBvcnQgdG8gMC4xMQorCisyMDEyLTAyLTI5IDIyOjI0OjQ2ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuaDoKKwkgIGdka3BpeGJ1ZmRlYzogcG9ydCB0byAwLjExCisKKzIwMTItMDItMjkgMTc6MjY6MDEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy94aW1hZ2UveGltYWdldXRpbC5jOgorCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmg6CisJICB1cGRhdGUgZm9yIG1ldGFkYXRhIEFQSSBjaGFuZ2VzCisKKzIwMTItMDItMjggMTM6NTE6MTAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jOgorCSAgYXVkaW9wYXJzZXJzOiBhZGQgYmFzZXBhcnNlIGJhc2VkIHdhdnBhY2twYXJzZQorCisyMDEyLTAyLTI4IDExOjM4OjU5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6CisJICB1cGRhdGUgZm9yIG1ldGFkYXRhIHRhZ3MKKworMjAxMi0wMi0yNyAyMzo0NjoxNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tkZWMuYzoKKwkgIHdhdnBhY2tkZWM6IGFkanVzdCB0byBhdWRpbyBmb3JtYXQgbGltaXRhdGlvbnMKKwkgIC4uLiB3aGljaCBkb2VzIG5vdCBhbGxvdyBleHByZXNzaW5nIGFyYml0cmFyeSBkZXB0aCBpbiBhIEdzdEF1ZGlvRm9ybWF0LgorCSAgQWxzbyBhZGp1c3QgdW5pdCB0ZXN0IHRvIG1vZGlmaWVkIGJlaGF2aW91ci4KKworMjAxMi0wMi0yNyAyMzo0NjowOCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzoKKwkgIHdhdnBhY2tkZWM6IGRldGVybWluZSBkZXB0aCBmcm9tIGJ5dGVzIHBlciBzYW1wbGUKKwkgIC4uLiByYXRoZXIgdGhhbiBmcm9tIGJpdHMgcGVyIHNhbXBsZSwgc2luY2Ugc3BlYyBzdGF0ZXMgdmFsdWVzIGFyZSBhbHJlYWR5CisJICBsZWZ0IGp1c3RpZmllZCB3LnIudC4gYml0cyBwZXIgc2FtcGxlIGJ1dCBub3Qgdy5yLnQuIGJ5dGVzIHBlciBzYW1wbGUKKwkgIChhbmQgc28gdGhlIGxhdHRlciBkZXRlcm1pbmVzIHRoZSBub3JtYWxpemF0aW9uLCBvciBpbmRpY2F0ZWQgZGVwdGgpLgorCisyMDEyLTAyLTI3IDIzOjQ2OjAzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5oOgorCSAgd2F2cGFja2RlYzogcG9ydCB0byBhdWRpb2RlY29kZXIKKworMjAxMi0wMi0yNyAyMzo0NTo1NCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tlbmMuYzoKKwkgIHdhdnBhY2tlbmM6IHBvcnQgdG8gYXVkaW9lbmNvZGVyCisJICBBbHNvIGFkanVzdCB1bml0IHRlc3QgdG8gc2xpZ2h0bHkgbW9kaWZpZWQgYmVoYXZpb3VyLgorCisyMDEyLTAyLTI3IDE0OjQ3OjI1ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2Fubm9kZXgvZ3N0YW5ub2RleC5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbHBhcnNlci5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbHRhZy5jOgorCSogZXh0L3B1bHNlL3B1bHNlcHJvYmUuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5jOgorCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogc3lzL29zczQvb3NzNC1hdWRpby5jOgorCSogc3lzL29zczQvb3NzNC1wcm9wZXJ0eS1wcm9iZS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9maXJmaWx0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvaWlyZmlsdGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZGVjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmM6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvd2F2ZW5jLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L2ZpcmZpbHRlci1leGFtcGxlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L2lpcmZpbHRlci1leGFtcGxlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9wdWxzZS9wdWxzZS5jOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1hbHNhc3JjLVBDTUEuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvcHJvYmUuYzoKKwkqIHRlc3RzL2ljbGVzL3Rlc3Qtb3NzNC5jOgorCSAgU3VwcHJlc3MgZGVwcmVjYXRpb24gd2FybmluZ3MgaW4gc2VsZWN0ZWQgZmlsZXMsIGZvciBnX3ZhbHVlX2FycmF5XyogbW9zdGx5CisKKzIwMTItMDItMjcgMTM6MDk6MzEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgc3BlZXhlbmM6IGNoYWluIHVwIHRvIHBhcmVudCBldmVudCBoYW5kbGVyCisKKzIwMTItMDItMjcgMTM6MDU6MzMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IGZpeCBldmVudCBoYW5kbGluZworCSAgRml4IGRvZGd5IHNlZ21lbnQgZXZlbnQgaGFuZGxpbmcKKwkgIENoYWluIHVwIHRvIHBhcmVudCBldmVudCBoYW5kbGVyCisKKzIwMTItMDItMjcgMDk6MTQ6MDQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiB1c2UgcHVibGljIGFwaQorCSAgaW5zdGVhZCBvZiBwb2tpbmcgaW50byB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmVzIG9mIHRoZSBiYXNlIGNsYXNzCisKKzIwMTItMDItMjcgMDE6MDk6MTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgZmx2bXV4LCBtYXRyb3NrYW11eCwgcXRtdXg6IGlmIGluIGRvdWJ0IGFib3V0IGRvd25zdHJlYW0gc2Vla2FiaWxpdHkgZGVmYXVsdCB0byBzdHJlYW1pbmc9dHJ1ZQorCSAgSWYgZG93bnN0cmVhbSBkaWRuJ3QgYW5zd2VyIG91ciBTRUVLSU5HIHF1ZXJ5IGFuZCB0b2xkIHVzCisJICBpdCdzIHNlZWthYmxlLCBkZWZhdWx0IHRvIHN0cmVhbWluZz10cnVlLiBXZSBjb3VsZG4ndCBkbworCSAgdGhpcyBpbiAwLjEwIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zLCBidXQgd2UKKwkgIGNhbiBpbiAwLjExLiBQbGF5IGl0IHNhZmUuCisKKzIwMTItMDItMjcgMDE6MDA6MDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSByZW1vdGUtdHJhY2tpbmcgYnJhbmNoICdvcmlnaW4vbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYworCisyMDEyLTAyLTI3IDAwOjU2OjM3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgY29tbWl0ICdmOTIwNzcyMmNhOGZkOGRjYzFlNzIxNWQ4YWY4NWVmZTRkZWJmZGY0JyBpbnRvIDAuMTEKKworMjAxMi0wMi0yNyAwMDo1NTozOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIG1wZWdhdWRpb3BhcnNlOiBmaXggdXAgYWZ0ZXIgbWVyZ2UKKworMjAxMi0wMi0yNyAwMDo0ODo1NyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGNvbW1pdCAnMzg1MTZhZDM2NzEyOGQ4M2Y5ZTE1NjUyOTAxOGFkYjQ0MzNjZDMyOCcgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYworCSAgZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jCisKKzIwMTItMDItMjYgMjA6Mzk6NTIgKzAxMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJICBnb29tMmsxOiBmaXggY29tcGlsZXIgd2FybmluZworCisyMDEyLTAyLTI2IDIwOjMwOjI0ICswMTAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgbXBlZ2F1ZGlvcGFyc2U6IGZpeCBjb21waWxlciB3YXJuaW5nCisKKzIwMTItMDItMjUgMTU6NTU6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogY3JlYXRlIHN0cmVhbWFibGUgb3V0cHV0IGlmIGRvd25zdHJlYW0gaXMgbm90IHNlZWthYmxlCisJICBJZ25vcmUgdGhlICJzdHJlYW1hYmxlIiBwcm9wZXJ0eSBzZXR0aW5nIGFuZCBjcmVhdGUgc3RyZWFtYWJsZQorCSAgb3V0cHV0IGlmIGRvd25zdHJlYW0gaXMga25vd24gbm90IHRvIGJlIHNlZWthYmxlIChhcyBxdWVyaWVkCisJICB2aWEgYSBTRUVLQUJMRSBxdWVyeSkuCisJICBGaXhlcyBwaXBlbGluZXMgbGlrZSBxdG11eCAhIGFwcHNpbmsgcG9zc2libHkgY3JlYXRpbmcgc2VlbWluZ2x5CisJICBjb3JydXB0ZWQgb3V0cHV0IGlmIHN0cmVhbWFibGUgaGFzIG5vdCBiZWVuIHNldCB0byB0cnVlLgorCisyMDEyLTAyLTI1IDE1OjQ4OjQ0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogY3JlYXRlIHN0cmVhbWFibGUgb3V0cHV0IGlmIGRvd25zdHJlYW0gaXMgbm90IHNlZWthYmxlCisJICBJZ25vcmUgdGhlICJzdHJlYW1hYmxlIiBwcm9wZXJ0eSBzZXR0aW5nIGFuZCBjcmVhdGUgc3RyZWFtYWJsZQorCSAgb3V0cHV0IGlmIGRvd25zdHJlYW0gaXMga25vd24gbm90IHRvIGJlIHNlZWthYmxlIChhcyBxdWVyaWVkCisJICB2aWEgYSBTRUVLQUJMRSBxdWVyeSkuCisJICBGaXhlcyBwaXBlbGluZXMgbGlrZSBmbHZtdXggISBhcHBzaW5rIHBvc3NpYmx5IGNyZWF0aW5nIHNlZW1pbmdseQorCSAgY29ycnVwdGVkIG91dHB1dCBpZiBzdHJlYW1hYmxlIGhhcyBub3QgYmVlbiBzZXQgdG8gdHJ1ZS4KKworMjAxMi0wMi0yNSAxNTo0MDozOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBjcmVhdGUgc3RyZWFtYWJsZSBvdXRwdXQgaWYgZG93bnN0cmVhbSBpcyBub3Qgc2Vla2FibGUKKwkgIElnbm9yZSB0aGUgInN0cmVhbWFibGUiIHByb3BlcnR5IHNldHRpbmcgYW5kIGNyZWF0ZSBzdHJlYW1hYmxlCisJICBvdXRwdXQgaWYgZG93bnN0cmVhbSBpcyBrbm93biBub3QgdG8gYmUgc2Vla2FibGUgKGFzIHF1ZXJpZWQKKwkgIHZpYSBhIFNFRUtBQkxFIHF1ZXJ5KS4KKwkgIEZpeGVzIHBpcGVsaW5lcyBsaWtlIHdlYm1tdXggISBhcHBzaW5rIGNyZWF0aW5nIHNlZW1pbmdseQorCSAgY29ycnVwdGVkIG91dHB1dCBpZiBzdHJlYW1hYmxlIGhhcyBub3QgYmVlbiBzZXQgdG8gdHJ1ZS4KKworMjAxMi0wMi0yNCAxMTowMzo0OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSAgdXBkYXRlIGZvciBiYXNldHJhbnNmb3JtIGNoYW5nZQorCisyMDEyLTAyLTI0IDEwOjI2OjI2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6CisJICB1cGRhdGUgZm9yIG1ldGFkYXRhIGNoYW5nZQorCisyMDEyLTAyLTIzIDA4OjQyOjI1IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGdzdC9kZWJ1Z3V0aWxzL01ha2VmaWxlLmFtOgorCSogZ3N0L2RlYnVndXRpbHMvZWZlbmNlLmM6CisJKiBnc3QvZGVidWd1dGlscy9lZmVuY2UuaDoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2VmZW5jZS52Y3Byb2o6CisJICBlZmVuY2U6IHJlbW92ZSBwbHVnaW4KKwkgIFZhbGdyaW5kIGlzIG11Y2ggbW9yZSB1c2VmdWwgdGhlc2UgZGF5cy4KKworMjAxMi0wMi0yMyAxMjowNToyMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSAgVXBkYXRlIE5FV1MgYW5kIFJFTEVBU0UgYXMgd2VsbAorCisyMDEyLTAyLTIzIDExOjA3OjM1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgQnVtcCB2ZXJzaW9uIGFmdGVyIHJlbGVhc2UKKworMjAxMi0wMi0yMyAxMjowMzoyNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uaDoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlaWlyZmlsdGVyLmg6CisJICBhdWRpb2Z4OiByZW1vdmUgdHJhbnNmb3JtIGxvY2sgdXNhZ2UKKworMjAxMi0wMi0yMyAxMToxNjoyMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uaDoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5oOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgdXBkYXRlIGZvciBiYXNldHJhbnNmb3JtIGxvY2sgcmVtb3ZhbAorCisyMDEyLTAyLTIyIDIzOjM2OjU0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlYnVndXRpbHMvTWFrZWZpbGUuYW06CisJICBkZWJ1Z3V0aWxzOiBkaXNhYmxlIGVmZW5jZSBwbHVnaW4gcHJvcGVybHkKKwkgIFdlIGRvbid0IHdhbnQgaXQgYnVpbHQgaWYgbW1hcCBpc24ndCBhdmFpbGFibGUgZWl0aGVyLi4KKworMjAxMi0wMi0yMiAxNzozOToxNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IGZpeCBnZXRfY2FwcyBmdW5jdGlvbiBzb21lIG1vcmUgc28gdGhhdCBhbGwgc3RydWN0dXJlcyBoYXZlIGNoYW5uZWwgaW5mbworCSAgU2V0IGNoYW5uZWxzIGFuZCBjaGFubmVsLWxheW91dCBvbiB0aGUgcmlnaHQgc3RydWN0dXJlOyB0aGF0IGlzLCB0aGUKKwkgIHN0cnVjdHVyZSB3ZSBhcmUgZ29pbmcgdG8gYXBwZW5kIHRvIHRoZSBjYXBzIHdlIGFyZSBidWlsZGluZywgYW5kIG5vdAorCSAgdGhlIHN0cnVjdHVyZSB3ZSBhcmUgdXNpbmcgYXMgYSB0ZW1wbGF0ZSBmb3IgYWxsIHRoZSBzdHJ1Y3R1cmVzLiBGaXhlcworCSAgZmlyc3Qgc3RydWN0dXJlIG9mIHRoZSByZXR1cm5lZCBjYXBzIG5vdCBoYXZpbmcgYW55IGNoYW5uZWwgaW5mbyBzZXQKKwkgIG9uIGl0LgorCisyMDEyLTAyLTIyIDE3OjA5OjI1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogbWljcm9vcHRpbWlzYXRpb246IGF2b2lkIHVubmVjZXNzYXJ5IGxpc3QgYW5kIHN0cmluZyBjb3BpZXMKKworMjAxMi0wMi0yMiAxNzowMzo0MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IGF1ZGlvIGNhcHMgaGF2ZSBhICpsaXN0KiBvZiBmb3JtYXRzLCBub3QgYW4gYXJyYXkgb2YgZm9ybWF0cworCSAgQSBsaXN0IG9mIHRoaW5ncyBpbiBjYXBzIGlzIHNvbWV0aGluZyB3aGVyZSBvbmUgaXMgcGlja2VkIGluIHRoZQorCSAgY291cnNlIG9mIG5lZ290aWF0aW9uLiBBbiBhcnJheSBpcyBhbHdheXMgc29tZXRoaW5nIHRoYXQgb25seSBtYWtlcworCSAgc2Vuc2UgYXMgYSB3aG9sZSBpbiB0aGF0IG9yZGVyLgorCisyMDEyLTAyLTIyIDE4OjAyOjI3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogcmVtb3ZlIHBvc3QtcG9ydCBib2d1cyBfdW5yZWYKKworMjAxMi0wMi0yMiAxNzowMDoxOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IHJlbW92ZSBib2d1cyBwYWQgbG9ja2luZyB0aGF0IGNhdXNlcyBkZWFkbG9ja3MKKwkgIEl0J3Mgbm90IGNsZWFyIHdoeSB0aGUgcGFkIG9iamVjdCBsb2NrIGlzIHRha2VuIGhlcmUuIEJ1dAorCSAgZ3N0X3BhZF97aGFzLGdldH1fY3VycmVudF9jYXBzKCkgd2lsbCB0cnkgdG8gdGFrZSB0aGUgbG9jaworCSAgYXMgd2VsbCBhbmQgZGVhZGxvY2ssIHNpbmNlIGl0J3Mgbm90IHJlY3Vyc2l2ZS4KKworMjAxMi0wMi0yMiAxNjo1OTo0MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IHNldCByaWdodCBudW1iZXIgb2YgY2hhbm5lbHMgb24gY2FwcyBpbiBnZXRfY2FwcyBmdW5jdGlvbgorCisyMDEyLTAyLTIxIDE3OjE2OjMyIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogYXV0b2dlbi5zaDoKKwkgIGF1dG9nZW46IGF2b2lkIHRvdWNoaW5nIC5wbyBmaWxlcyBkdXJpbmcgJ21ha2UnCisJICBBIHNpbXBsZSB3b3JrYXJvdW5kIHRvIGRlYWwgd2l0aCBHTlUgZ2V0dGV4dCBhdXRvbWFrZSBpbnRlZ3JhdGlvbgorCSAgZmFpbGluZyB0byBkZWFsIHdpdGggZ2l0LiAgRml4ZXM6ICM2NjkyMDcKKworMjAxMi0wMi0yMiAwMjowNjoxNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW50ZXJsZWF2ZS5jOgorCSAgdXBkYXRlIGZvciBuZXcgbWVtb3J5IGFwaQorCisyMDEyLTAyLTIxIDE3OjU3OjQ0ICswMTAwICBWaW5jZW50IFVudHogPHZ1bnR6QGdub21lLm9yZz4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJICBwdWxzZTogRml4IGEgYnVpbGQgd2FybmluZyB3aGVuIGNvbXBpbGluZyB3aXRoIGFzc2VydHMgZGlzYWJsZWQKKwkgIFJldHVybiBhIHZhbHVlIGV2ZW4gaWYgdGhlIGNvZGUgd2lsbCBuZXZlciBiZSByZWFjaGVkLCB0byBtYWtlIGNvbXBpbGVycworCSAgaGFwcHkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcwNTYxCisKKzIwMTItMDItMjEgMTg6NDI6MzEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmg6CisJICBtcGVnYXVkaW9wYXJzZTogc3VwcG9ydCBwYXJzaW5nIGZyZWVmb3JtIGJpdHJhdGUgc3RyZWFtCisKKzIwMTItMDItMjEgMTg6Mzk6MTggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuaDoKKwkgIG1vbm9zY29wZTogcG9ydCB0byAwLjExCisKKzIwMTItMDItMjEgMTA6NTM6NTYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMi0wMi0yMCAxMjoyMjoxMiAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHBoMjY0cGF5OiBGb3JjZSBiYXNlbGluZSBpcyBwcm9maWxlLWxldmVsLWlkIGlzIHVuc3BlY2lmaWVkCisKKzIwMTItMDItMjEgMTA6NDA6MDAgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSAgaWQzdjJtdXg6IEZpeCBtZXJnZSBlcnJvcgorCisyMDEyLTAyLTIwIDEyOjIyOjEyIC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IEZvcmNlIGJhc2VsaW5lIGlzIHByb2ZpbGUtbGV2ZWwtaWQgaXMgdW5zcGVjaWZpZWQKKworMjAxMi0wMi0yMCAxNjozNToxOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIGZpeCBjb21waWxlciB3YXJuaW5ncworCisyMDEyLTAxLTI2IDAzOjI5OjI4IC0wNTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgZml4IGNvbXBpbGVyIHdhcm5pbmdzCisKKzIwMTItMDEtMjYgMDY6NTg6NDYgLTA1MDAgIE1hdGVqIEtub3BwIDxtYXRlai5rbm9wcEBnbWFpbC5jb20+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIEZpeCBjb21waWxlciB3YXJuaW5ncworCisyMDEyLTAyLTE4IDExOjM4OjM2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkgIHRlc3RzOiBmaXggdXAgbGV2ZWwgdGVzdCBmb3IgR3N0VmFsdWVMaXN0IC0+IEdWYWx1ZUFycmF5IGNoYW5nZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3MDMwMworCisyMDEyLTAyLTE2IDE4OjAxOjI5ICswMjAwICBQZXRlcmlzIEtyaXNqYW5pcyA8cGVjaXNrQGdtYWlsLmNvbT4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICBsZXZlbDogdXNlIEdWYWx1ZUFycmF5IGluc3RlYWQgb2YgR3N0VmFsdWVMaXN0IGluIG1lc3NhZ2VzCisJICBVcGRhdGVkIEdzdExldmVsIGVsZW1lbnQgdG8gdXNlIEdWYWx1ZUFycmF5IGluc3RlYWQgb2YKKwkgIEdzdFZhbHVlTGlzdCBmb3Igcm1zL3BlYWsvZGVjYXkga2V5cyBhdHRhY2hlZCB0byBlbGVtZW50CisJICBtZXNzYWdlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3MDMwMworCisyMDEyLTAyLTE4IDAwOjAwOjU0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICB3aW4zMjogYmFjayB0byBkZXZlbG9wbWVudAorCisyMDEyLTAyLTE3IDIzOjU0OjI5ICswMTAwICBEb21pbmlxdWUgTGV1ZW5iZXJnZXIgPGRvbWluaXF1ZS1nbm9tZXppbGxhIGF0IGxldWVuYmVyZ2VyLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgTm8gbG9uZ2VyIHJlZmVyZW5jZSBkZXByZWNhdGVkIGhlYWRlciBmaWxlcyB3aGlsZSBidWlsZGluZyBkb2NzLgorCisyMDEyLTAyLTE3IDIzOjQ5OjIxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jCisKKzIwMTItMDItMTcgMTc6MjE6NTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgZXF1YWxpemVyOiBmaXggc3dpdGNoaW5nIGZyb20gcGFzc3Rocm91Z2ggdG8gbm9uLXBhc3N0aHJvdWdoIHdoZW4gcGFyYW1ldGVycyBjaGFuZ2UKKwkgIGNvbW1pdCBiNWJmMDI5NCBtb3ZlZCB0aGUgaWYobmVlZF9uZXdfY29lZmZpY2llbnRzKSBzZXRfcGFzc3Rocm91Z2goZXF1KQorCSAgYWZ0ZXIgdGhlIGlmKGlzX3Bhc3N0aHJvdWdoKSByZXR1cm4gRkxPV19PSyBzaG9ydGN1dCwgc28gdGhlIHBhc3N0aHJvdWdoCisJICBtb2RlIHdvdWxkIG5ldmVyIGdldCB1cGRhdGVkIGV2ZW4gaWYgdGhlIGNvZWZmaWNpZW50cyBjaGFuZ2UuCisJICBGaXhlcyBlcXVhbGl6ZXItdGVzdCBkb2luZyAuLiBub3RoaW5nLgorCisyMDEyLTAyLTE3IDE3OjU3OjAzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSAgZ29vbSo6IGZpeCBsZWFrZWQgY2FwcyBldmVudAorCisyMDEyLTAyLTE3IDEzOjI2OjUzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgbXBlZ2F1ZGlvcGFyc2U6IHBhcnNlIGVpdGhlciBYaW5nIG9yIFZCUkkgZGF0YQorCSAgLi4uIGFuZCBhdm9pZCBjb25mdXNpbmcgZGVidWcgbWVzc2FnZSBjbGFpbWluZyBuZWl0aGVyIHByZXNlbnQuCisKKzIwMTItMDItMTcgMTQ6Mzg6MDMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9zazogZml4IHNlZ21lbnQgdXBkYXRlCisKKzIwMTItMDItMTcgMTE6MDU6MjcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGJhY2sgdG8gZGV2ZWxvcG1lbnQKKworPT09IHJlbGVhc2UgMC4xMS4xID09PQorCisyMDEyLTAyLTE3IDExOjA0OjQ3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZW8ucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2dsLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJKiB3aW4zMi9jb21tb24vZ3N0cnRwYmluLW1hcnNoYWwuYzoKKwkqIHdpbjMyL2NvbW1vbi9nc3RydHBiaW4tbWFyc2hhbC5oOgorCSAgUkVMRUFTRSAwLjExLjEKKworMjAxMi0wMi0xNiAyMzozMzoxNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkgIGdvb206IGZpeCBidWZmZXIgbGVhaworCisyMDEyLTAyLTE2IDIzOjQwOjU4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSAgZ29vbTJrMTogdXNlIHNvbWUgbW9yZSBib2lsZXJwbGF0ZQorCisyMDEyLTAyLTE2IDIzOjMzOjAxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5oOgorCSAgZ29vbTJrMTogcG9ydCB0byAwLjExCisKKzIwMTItMDItMTYgMTU6MzE6NTMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSAgc2hvdXQyOiB1c2Ugc29tZSBtb3JlIGJvaWxlcnBsYXRlCisKKzIwMTItMDItMTYgMTU6Mjk6MzQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSAgc2hvdXQyOiBwb3J0IHRvIDAuMTEKKworMjAxMi0wMi0xNCAxMTo1NjowMCArMDEwMCAgUGhpbGlwcGUgTm9ybWFuZCA8cGhpbG5AaWdhbGlhLmNvbT4KKworCSogZ3N0L2ludGVybGVhdmUvTWFrZWZpbGUuYW06CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmg6CisJKiBnc3QvaW50ZXJsZWF2ZS9wbHVnaW4uYzoKKwkqIGdzdC9pbnRlcmxlYXZlL3BsdWdpbi5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW50ZXJsZWF2ZS5jOgorCSAgaW50ZXJsZWF2ZTogcG9ydCB0byAwLjExCisJICBQb3J0IG9mIHRoZSBpbnRlcmxlYXZlIGVsZW1lbnQgYW5kIGl0cyB1bml0dGVzdHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY5NjQzCisKKzIwMTItMDItMTYgMTQ6MjM6NTAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMi0wMi0xNiAxNzoxNDoyMCArMDgwMCAgR2FyeSBDaGluZy1QYW5nIExpbiA8Y2hpbmdwYW5nQGdtYWlsLmNvbT4KKworCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgdjRsMnNyYzogZmFpbHVyZSB0byBxdWVyeSBzb21lIG9wdGlvbmFsIGNvbnRyb2xzIGlzIG5vdCBhIGZhdGFsIGVycm9yCisJICBEb24ndCBwb3N0IGEgKGZhdGFsKSBlcnJvciBtZXNzYWdlIG9uIHRoZSBidXMganVzdCBiZWNhdXNlIHdlCisJICBmYWlsZWQgdG8gcXVlcnkgc29tZSBjb250cm9sLiBGaXhlcyBpc3N1ZSB3aXRoIGJ1aWx0LWluCisJICBTdXlpbiBDb3JwIHdlYmNhbSBmb3IgSFAgbm90ZWJvb2sgKHVzYmlkIDA2NGU6ZTI4YSkgb24KKwkgIE9wZW5TdXNlIDEyLjEsIHdoZXJlIHF1ZXJ5aW5nIHJlZC9ibHVlIGJhbGFuY2UgZmFpbHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjcwMTk3CisKKzIwMTItMDItMTYgMTI6NTk6MTAgKzAwMDAgIFR1dWtrYSBQYXNhbmVuIDx0dXVra2EucGFzYW5lbkBpbG1pLmZpPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyc3JjOiBmaXggZm9yIHdlYmNhbXN0dWRpbyB2bG9vcGJhY2sKKwkgIEJlY2F1c2Ugdmxvb2JhY2sgZW1pdHMgMjUgLSBFTk9UVFkgYW5kIG5vIEVJTlZBTCB2NGwyc3JjIHRob3VnaHQgaXQKKwkgIGNhbid0IGhhbmRsZSB0aGlzIGFuZCBkb2VzIG5vdCB3b3JrLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2OTQ1NQorCisyMDEyLTAyLTE2IDExOjIxOjI4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGRlY2xhcmUgdmFyaWFibGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJsb2NrCisJICBJdCdzIGhvdyB3ZSByb2xsLiBGaXhlcyAnSVNPIEM5MCBmb3JiaWRzIG1peGVkIGRlY2xhcmF0aW9ucyBhbmQgY29kZScKKwkgIGNvbXBpbGVyIHdhcm5pbmcuCisKKzIwMTItMDItMTUgMjM6NTU6NDQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9NYWtlZmlsZS5hbToKKwkgIGV4YW1wbGVzOiBmaXggc3BlY3RydW0gZXhhbXBsZSBidWlsZCBpc3N1ZXMKKwkgIEZpbmQgZmZ0IGhlYWRlcnMgaW4gdW5pbnN0YWxsZWQgc2V0dXAsIGZpeCBMSUJTIG9yZGVyLgorCisyMDEyLTAyLTE1IDEyOjQxOjQzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogcmVtb3ZlIHNvbWUgdW51c2VkIGRlY2xhcmF0aW9ucworCisyMDEyLTAyLTE1IDExOjI1OjQ1ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tYXVkaW90ZXN0LmM6CisJICBzcGVjdHJ1bS1kZW1vOiBzaG93IHRoZSBlZmZlY3Qgb2YgZmFzdC1tb2RlCisKKzIwMTItMDItMTQgMTI6MjY6MzcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmM6CisJICBhc3BlY3RyYXRpb2Nyb3A6IGZpeCBjYXBzIHJlZmNvdW50CisKKzIwMTItMDItMTQgMTE6MjI6NDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy9lZmZlY3R2LmM6CisJICB0ZXN0czogZml4IHRlc3QsIHVzZSB2aWRlb2NvbnZlcnQKKworMjAxMi0wMi0xNCAxMDo1MTozOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvZmxhY3BhcnNlLmMKKworMjAxMi0wMi0wOSAxMzo0MTo1MyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IGFkanVzdCB0byBtb2RpZmllZCBiYXNlcGFyc2UgQVBJCisKKzIwMTItMDItMTMgMTc6MTM6MTcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIHVwZGF0ZSBmb3IgbWVtb3J5IGFwaSBjaGFuZ2UKKworMjAxMi0wMi0xMyAxMjowNjozNyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsYWNwYXJzZS5jOgorCSAgdGVzdHM6IGZsYWNwYXJzZTogY2hlY2sgYW5kIGNvbXBhcmUgaW50ZW5kZWQgZGF0YQorCisyMDEyLTAyLTEyIDE3OjAzOjM3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgcmVtb3RlLXRyYWNraW5nIGJyYW5jaCAnb3JpZ2luL21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvdGFnbGliL2dzdGFwZXYybXV4LmNjCisJICBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjCisJICBleHQvdGFnbGliL2dzdHRhZ2xpYm11eC5jCisJICBleHQvdGFnbGliL2dzdHRhZ2xpYm11eC5oCisKKzIwMTItMDItMTIgMTY6MjI6MjEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdGFnbGliL01ha2VmaWxlLmFtOgorCSogZXh0L3RhZ2xpYi9nc3RhcGV2Mm11eC5jYzoKKwkqIGV4dC90YWdsaWIvZ3N0YXBldjJtdXguaDoKKwkqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJKiBleHQvdGFnbGliL2dzdGlkM3YybXV4Lmg6CisJKiBleHQvdGFnbGliL2dzdHRhZ2xpYm11eC5jOgorCSogZXh0L3RhZ2xpYi9nc3R0YWdsaWJtdXguaDoKKwkqIGV4dC90YWdsaWIvZ3N0dGFnbGlicGx1Z2luLmM6CisJICB0YWdsaWI6IHBvcnQgdG8gR3N0VGFnTXV4IGJhc2UgY2xhc3MKKworMjAxMi0wMi0xMiAxMjoyNDo1MCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4LmM6CisJICB0YWdsaWI6IGZpbmlzaCBvZmYgYSBmZXcgbWlzc2VkIHZhcmlhYmxlIGNoYW5nZXMKKwkgIExvY2FsIHZhcmlhYmxlcyBhcmUgbm93IHVudXNlZCwgYW5kIHRoZSB2YWx1ZXMgZnJvbSB0aGUgc2VnbWVudCBjb3B5CisJICBhcmUgdXNlZCBpbnN0ZWFkLCBzbyByZW1vdmUgdGhlIG5vdyB1c2VsZXNzIGxvY2FsIHZhcmlhYmxlcyBhbmQgd3JpdGUKKwkgIHRvIHRoZSBzZWdtZW50IHdoZXJlIGFwcHJvcHJpYXRlLgorCisyMDEyLTAyLTEwIDE2OjIzOjE0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvZmxhYy9nc3RmbGFjZW5jLmMKKwkgIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jCisJICBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmMKKwkgIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jCisJICBleHQvcHVsc2UvcGx1Z2luLmMKKwkgIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmMKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYworCSAgZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmMKKworMjAxMi0wMi0wOCAyMzowMzoyOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogYWRkIHN0cmVhbS1mb3JtYXQgYW5kIGFsaWdubWVudCB0byBoMjY0IHNpbmsgY2FwcworCSAgV2UncmUgaGFwcHkgdG8gYWNjZXB0IGJvdGggYnl0ZS1zdHJlYW0gYW5kIGF2YywgYWR2ZXJ0aXNlCisJICB0aGF0IG9uIHRoZSBzaW5rIGNhcHMgYW5kIGZpeCB1cCBfZ2V0X2NhcHMoKSBmdW5jdGlvbiB0bworCSAgbm90IGp1c3QgcmV0dXJuICJ2aWRlby94LWgyNjQiLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYwNjY2MgorCisyMDEyLTAyLTA4IDIwOjU4OjA0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIHJ0cGgyNjRkZXBheTogYWRkIHN0cmVhbS1mb3JtYXQgYW5kIGFsaWdubWVudCBmaWVsZHMgdG8gc3JjIHRlbXBsYXRlIGNhcHMKKwkgIEJlY2F1c2Ugd2UgY2FuLiBBbmQgc28gd2UgZ2V0IGEgd2FybmluZyBpZiB3ZSB0cnkgdG8gb3V0cHV0IGF2YyB3aXRoCisJICBuYWwgYWxpZ25tZW50IG9yIHNvbWVzdWNoLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYwNjY2MgorCisyMDEyLTAyLTEwIDEzOjQ0OjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHRlc3RzOiBjbGVhbiB1cCBydHAtcGF5bG9hZGluZyB0ZXN0IGEgbGl0dGxlCisJICBGZWVkIGRhdGEgaW50byB0aGUgcGlwZWxpbmUgdXNpbmcgYXBwc3JjIGluc3RlYWQgb2YgZmRzcmMgYW5kCisJICBhIHBpcGUuIFN0b3JlIHVuc2lnbmVkIGJ5dGUgdmFsdWVzIGluIGd1aW50OCBpbnN0ZWFkIG9mIGNoYXIuCisJICBHZXR0aW5nIHJpZCBvZiB0aGUgY2Fwc2ZpbHRlciBhbHNvIGhlbHBzIHRvIGF2b2lkICdmb3JtYXQgaXMKKwkgIG5vdCBmdWxseSBzcGVjaWZpZWQnIHdhcm5pbmdzIHdoZW4gcHVzaGluZyAidmlkZW8veC1oMjY0IiBkYXRhCisJICBpbnRvIHJ0cGgyNjRwYXkgd2l0aCBmdWxseSBzcGVjaWZpZWQgaDI2NCBjYXBzIGluIHRoZSBzaW5rIHRlbXBsYXRlLgorCisyMDEyLTAyLTEwIDEwOjA3OjM0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHY6IHVzZSBkZWZhdWx0IHBhZCBxdWVyeQorCSAgV2UgbmVlZCB0byBjaGFpbiB1cCB1bmtub3duIHF1ZXJpZXMgdG8gdGhlIGRlZmF1bHQgcXVlcnkgaGFuZGxlciBpbnN0ZWFkIG9mCisJICBibGluZGx5IGZvcndhcmRpbmcgdGhlbS4gSW4gdGhpcyBjYXNlIGl0IGNhdXNlZCB0aGUgY2FwcyBxdWVyeSB0byBiZSBmb3J3YXJkZWQKKwkgIHRvIHRoZSB1cHN0cmVhbSB0eXBlZmluZCBhbmQgcmV0dXJuIHRoZSB3cm9uZyB0eXBlIGZvciB0aGUgYXVkaW8vdmlkZW8gcGFkLgorCisyMDEyLTAyLTA5IDIyOjEyOjE0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIHRlc3RzOiBtcGVnYXVkaW9wYXJzZTogcmVtb3ZlIHN0cmF5IGRlY2xhcmF0aW9uCisKKzIwMTItMDItMDkgMjI6MDc6NDggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogY29ycmVjdGx5IHNldCBBRElGIHNyYyBjYXBzCisKKzIwMTItMDItMDkgMjI6MTA6MDcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJICBhYzNwYXJzZTogcHJldmVudCBhIGZldyBkaXJlY3QgZXhpdHMgd2l0aG91dCBjbGVhbnVwCisKKzIwMTItMDItMDkgMjI6MDc6MTggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiBzaGlmdCBpbiBwcm9wZXIgZGlyZWN0aW9uIGZvciBhdWRpbyBzYW1wbGUgY29udmVyc2lvbgorCisyMDEyLTAyLTA5IDE4OjA5OjQ1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGVhdmUuYzoKKwkgIHRlc3RzOiBmaXggY29tcGlsYXRpb24KKworMjAxMi0wMi0wOSAxMDoxMTo0OCArMDEwMCAgTWFyYyBMZWVtYW4gPG1hcmMubGVlbWFuQGdtYWlsLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIG11bHRpdWRwc2luazogdHlwbyBmaXggKGJ5dGVzIHNlbmQgLT4gYnl0ZXMgc2VudCkKKworMjAxMi0wMi0wOCAxNjozNDowMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgR1NUX0ZMT1dfV1JPTkdfU1RBVEUgLT4gR1NUX0ZMT1dfRkxVU0hJTkcKKworMjAxMi0wMi0wOCAxNjozNzoxMyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgR1NUX0ZMT1dfV1JPTkdfU1RBVEUgLT4gR1NUX0ZMT1dfRkxVU0hJTkcKKworMjAxMi0wMi0wNyAxNDoxMDo0NCAtMDgwMCAgUmFscGggR2lsZXMgPGdpbGVzQG1vemlsbGEuY29tPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSAgc2hvdXQyc2VuZDogc2VuZCB2aWRlby93ZWJtIHRocm91Z2ggbGlic2hvdXQuCisJICBUaGlzIHJlcXVpcmVzIFNIT1VUX0ZPUk1BVF9XRUJNLCBhZGRlZCBpbiBsaWJzaG91dCAyLjMuMCwKKwkgIHNvIHZpZGVvL3dlYm0gc3VwcG9ydCBpcyBjb250aW5nZW50IG9uIHRoYXQgc3ltYm9sIGJlaW5nCisJICBkZWZpbmVkLgorCSAgQWxzbyBhbiBpbmRlbnRhdGlvbiBjaGFuZ2UgcmVxdWlyZWQgYnkgdGhlIHByZS1jb21taXQgaG9vay4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Njk1OTAKKworMjAxMi0wMS0zMCAxNjo0MDoxOSArMDEwMCAgUGhpbGlwcGUgTm9ybWFuZCA8cGhpbG5AaWdhbGlhLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2ludGVybGVhdmUvTWFrZWZpbGUuYW06CisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5oOgorCSogZ3N0L2ludGVybGVhdmUvcGx1Z2luLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9wbHVnaW4uaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOgorCSAgZGVpbnRlcmxlYXZlOiBwb3J0IHRvIDAuMTEKKwkgIFBvcnQgb2YgdGhlIGRlaW50ZXJsZWF2ZSBlbGVtZW50IGFuZCBpdHMgdW5pdHRlc3RzLiBUaGUgaW50ZXJsZWF2ZQorCSAgZWxlbWVudCB3aWxsIGJlIHBvcnRlZCBhcyBwYXJ0IG9mIGFub3RoZXIgcGF0Y2gsIGhlbmNlIGRpc2FibGluZyBpdAorCSAgZm9yIG5vdy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Njg4NDcKKworMjAxMi0wMi0wNyAyMzo0MToxMyArMDIwMCAgUmFpbW8gSsOkcnZpIDxyYWltby5qYXJ2aUBnbWFpbC5jb20+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuaDoKKwkgIGRpcmVjdHNvdW5kc2luazogRml4IGNvbXBpbGluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2OTYwNworCisyMDEyLTAyLTA4IDAwOjA4OjQ5ICswMjAwICBSYWltbyBKw6RydmkgPHJhaW1vLmphcnZpQGdtYWlsLmNvbT4KKworCSogc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5jOgorCSAgd2F2ZWZvcm1zaW5rOiBQb3J0IHRvIDAuMTEKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Njk2MTIKKworMjAxMi0wMi0wNyAyMTo1Nzo0NyArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvY2xpZW50LmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IHJld29yayB0cmFuc3BvcnQgc3VwcG9ydAorCSAgTW92ZSBjb21tb24gY29kZSB0byBqYWNrY2xpZW50LiBUaGVyZSB3ZSBjYW4gYWxzbyBoYW5kbGUgdGhlIHJlcXVlc3Qgc3RhdGUKKwkgIG1lc3NhZ2UgaW4gYSBiZXR0ZXIgd2F5LCBhcyB0aGUgZWxlbWVudCBjYWxsYmFja3MgYXJlIG9ubHkgcnVuIGlmIHRoZSBlbGVtZW50IGlzCisJICBhY3RpdmUuCisKKzIwMTItMDItMDcgMTA6NDc6MTkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FwZXYybXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jOgorCSAgdGVzdHM6IGltcHJvdmUgdGFnbXV4IHRlc3RzCisKKzIwMTItMDItMDcgMTA6Mjk6MTEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4LmM6CisJICB0YWdsaWI6IGZpeCBvYmplY3QgcmVnaXN0cmF0aW9uCisJICBXZSBjYW4ndCB1c2UgR19ERUZJTkVfVFlQRSBiZWNhdXNlIHRoZSBjbGFzcyBpcyBub3Qgc2V0IGluIHRoZSBjbGFzc19pbml0IGFuZCB3ZQorCSAgbmVlZCBpdCB0byBnZXQgdGhlIHNyY3BhZCB0ZW1wbGF0ZS4KKwkgIEZpeCBhIGNhcHMgbGVhaworCisyMDEyLTAyLTA3IDEwOjE2OjMyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9qcGVnZW5jLmM6CisJICB0ZXN0czogZml4IGpwZWcgdGVzdAorCisyMDEyLTAyLTA3IDEwOjE1OjUxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cDogZml4IGNhcHMKKworMjAxMi0wMi0wNyAwOTo1NDowMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOgorCSAgZWZmZWN0dHY6IGZpeCBpbml0aWFsaXNhdGlvbgorCisyMDEyLTAyLTA3IDA5OjQyOjA0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgeTRtOiBmaXggbmVnb3RpYXRpb24KKworMjAxMi0wMi0wNyAwOTo0MTo1MSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9maWx0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3k0bWVuYy5jOgorCSAgdGVzdHM6IGZpeCBtb3JlIHRlc3RzCisKKzIwMTItMDItMDYgMjI6MTM6NTMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvZHYvTWFrZWZpbGUuYW06CisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkqIGV4dC9kdi9nc3RkdmRlYy5oOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9kdi9nc3RkdmRlbXV4Lmg6CisJICBkdjogcG9ydCB0byAwLjExCisKKzIwMTItMDItMDYgMTg6MzU6MDEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnbGltaXRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmd2b2x1bWUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwZWN0cnVtLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2Nyb3AuYzoKKwkgIHRlc3Q6IGZpeCBtb3JlIHRlc3RzCisKKzIwMTItMDItMDYgMTU6NTI6NDkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM2RlbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsdGlmaWxlLmM6CisJICB0ZXN0czogZml4IG1vcmUgdGVzdHMKKworMjAxMi0wMi0wNiAxNTo1MjozNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHY6IGZpeCBjYXBzCisKKzIwMTItMDItMDYgMTU6MjA6NTUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9lcXVhbGl6ZXIuYzoKKwkgIGlpcmVxdWFsaXplcjogZml4IGVxdWFsaXplciBhbmQgdW5pdCB0ZXN0CisKKzIwMTItMDItMDYgMTM6NDQ6MjAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvcGFub3JhbWEuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvd3NpbmNiYW5kLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jbGltaXQuYzoKKwkgIHRlc3RzOiBmaXggc29tZSBtb3JlIHRlc3RzCisKKzIwMTItMDItMDYgMTM6NDM6NDkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IHRha2UgdGhlIHBhZCBmcm9tIGNvbGxlY3RwYWRzMiBjb3JyZWN0bHkKKworMjAxMi0wMi0wNiAxMzoyOToyNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9paXJmaWx0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvaW52ZXJ0LmM6CisJICB0ZXN0czogZml4IG1vcmUgdW5pdCB0ZXN0cworCisyMDEyLTAyLTA2IDEzOjI4OjU1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuYzoKKwkgIGF1ZGlvZHluYW1pYzogZml4IG5lZ290aWF0aW9uCisKKzIwMTItMDEtMjggMTE6MTM6MTYgKzAxMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGF2b2lkIHBvc3RpbmcgaW52YWxpZCBkdXJhdGlvbiBmb3IgZWFjaCBmcmFtZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NjU4MworCisyMDEyLTAyLTA2IDEwOjA3OjA2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2FtcGxpZnkuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmJhbmQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmxpbWl0LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2R5bmFtaWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZWNoby5jOgorCSAgdGVzdHM6IGZpeCBtb3JlIHRlc3RzCisKKzIwMTItMDItMDYgMDk6NDk6MzggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FzcGVjdHJhdGlvY3JvcC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOgorCSAgdGVzdHM6IGltcHJvdmUgc29tZSB0ZXN0cworCisyMDEyLTAyLTA2IDA5OjIzOjQ5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHRlc3RzOiBmaXggaml0dGVyYnVmZmVyIHRlc3QKKworMjAxMi0wMi0wNiAwOToyMzowNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGZpeCBjYXBzIGFmdGVyIHB0IGNoYW5nZQorCisyMDEyLTAyLTA2IDA5OjE4OjE3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogZml4IGNhcHMgbGVhaworCisyMDEyLTAyLTAzIDIyOjA1OjU5ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3BsdWdpbi5jOgorCSAgcHVsc2VhdWRpb3Npbms6IExvd2VyIHJhbmsgdG8gcHJldmVudCBhdXRvcGx1Z2dpbmcKKwkgIHB1bHNlYXVkaW9zaW5rIGJyZWFrcyB2aXN1YWxpc2F0aW9ucyBpbiBpdHMgY3VycmVudCBmb3JtLCBzbyBsZXQncworCSAgcHJldmVudCBpdCBmcm9tIGJlaW5nIGF1dG9wbHVnZ2VkIGZvciB0aGUgdGltZSBiZWluZy4KKwkgIFRoZSBiZXN0IHdlIGNhbiBob3BlIHRvIGRvIGluIHRoZSAwLjEwIHNlcmllcyBpcyBxdWVyeSB0aGUgbGlzdCBvZgorCSAgYXZhaWxhYmxlIHNpbmtzIGFuZCB0aGVpciBmb3JtYXRzLCBhbmQgZXhwb3NlIHRoZXNlIGFzIHRoZSBiaW4ncyBzaW5rcGFkCisJICBjYXBzLiBXaGlsZSB0aGlzIGlzIG5vdCBhIGNvbXByZWhlbnNpdmUgc29sdXRpb24sIGl0IHdpbGwgbWFrZSBzdXJlIHRoYXQKKwkgIHdlJ3JlIG9ubHkgdHJ5aW5nIHRvIHN1cHBvcnQgY29tcHJlc3NlZCBmb3JtYXRzIGlmIHdlJ3JlIGNlcnRhaW4gdGhhdAorCSAgb25lIGV4aXN0cy4KKwkgIFRoZSBsb25nLXRlcm0gZml4IGZvciB0aGlzIHdpbGwgYmUgaW4gdGhlIGZvcm0gb2YgcHJvcGVyIHVwc3RyZWFtCisJICByZW5lZ290aWF0aW9uIHN1cHBvcnQgaW4gdGhlIDAuMTEvMS4wIHNlcmllcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjYzNjEKKworMjAxMi0wMi0wMyAxNzoyMzo0OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGRlYy5jOgorCSAgdGVzdHM6IGZpeCBtb3JlIHRlc3RzCisKKzIwMTItMDItMDMgMTY6MTM6NTEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FwZXYybXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2ZpcmZpbHRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9paXJmaWx0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM3YybXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9wYXJzZXIuYzoKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZlbmMuYzoKKwkgIHRlc3RzOiBmaXggc29tZSBtb3JlIHRlc3RzCisKKzIwMTItMDItMDMgMTY6MTI6NTkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBmaXggc3JjcGFkIGNhcHMgaGFuZGxpbmcKKworMjAxMi0wMi0wMyAxNjoxMjoyNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOgorCSAgY21tbGVuYzogZml4IGNhcHMgaGFuZGxpbmcKKworMjAxMi0wMi0wMyAxNDo1MzozMSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IGZpeCBldmVudCBsZWFrIHdoZW4gdGhlcmUgaXMgbm8gcGVlciBvbiB0aGUgc3JjIHBhZAorCisyMDEyLTAyLTAyIDE2OjIxOjI5ICswMDAwICBDaHJpc3RpYW4gRnJlZHJpayBLYWxhZ2VyIFNjaGFsbGVyIDxjaHJpc3RpYW4uc2NoYWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBVcGRhdGUgc3BlYyBmaWxlCisKKzIwMTItMDItMDIgMTI6Mjc6MDkgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBzcGVjaWZ5IHdlIG9ubHkgYWNjZXB0IHJhdyBBQUMgaW4gdGVtcGxhdGUgY2FwcworCSAgTm8gaGVhZGVyIHNlZW1zIHRvIGJlIGFkZGVkLCBhbmQgdGhlIGNvZGVjIElEIGlzIHRoZSBzYW1lIGFzIHVzZWQKKwkgIGZvciByYXcgYnkgZmx2ZGVtdXgsIHNvIHJhdyBzZWVtcyB0aGUgb25seSBzdXBwb3J0ZWQgY2FzZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjUzOTQKKworMjAxMi0wMi0wMiAxMjoyNToyMSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBzcGVjaWZ5IHdlIG9ubHkgb3V0cHV0IHJhdyBBQUMgaW4gdGVtcGxhdGUgY2FwcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NTM5NAorCisyMDEyLTAyLTAxIDE4OjAxOjI3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L3RhZ2xpYi9nc3RhcGV2Mm11eC5jYzoKKwkqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJKiBleHQvdGFnbGliL2dzdHRhZ2xpYm11eC5jOgorCSogZXh0L3RhZ2xpYi9nc3R0YWdsaWJtdXguaDoKKwkgIHRhZ2xpYjogcG9ydCB0byAwLjExCisKKzIwMTItMDItMDEgMTY6NDA6NTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYW5ub2RleC9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb2Z4L01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL01ha2VmaWxlLmFtOgorCSAgYnVpbGQ6IGlnbm9yZSBHVmFsdWVBcnJheSBkZXByZWNhdGlvbiB3YXJuaW5ncyBmb3IgdGhlIHRpbWUgYmVpbmcKKwkgIHVudGlsIHRoaXMgZ2V0cyBzb3J0ZWQgb3V0IHdpdGggdGhlIEdMaWIgZm9sa3MgYW5kIHdlIGhhdmUgYQorCSAgdmlhYmxlIGFsdGVybmF0aXZlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NzIyOAorCisyMDEyLTAyLTAxIDE2OjM2OjUzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlcHJvYmUuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXByb2JlLmg6CisJICBwdWxzZTogZGlzYWJsZSBzb21lIHVudXNlZCBwcm9wZXJ0eSBwcm9iZSBjb2RlCisJICB3aGljaCB3YXMgdXNpbmcgR1ZhbHVlQXJyYXkKKworMjAxMi0wMi0wMSAxNjoxMToxNCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJICBzcGVleDogVXNlIG5ldyBhdWRpbyBlbmNvZGVyL2RlY29kZXIgYmFzZSBjbGFzcyBBUEkgZm9yIHNyY3BhZCBjYXBzCisKKzIwMTItMDItMDEgMTY6MDU6NTEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjOiBVc2UgbmV3IGF1ZGlvIGVuY29kZXIvZGVjb2RlciBiYXNlIGNsYXNzIEFQSSBmb3Igc3JjcGFkIGNhcHMKKworMjAxMi0wMS0zMSAxNTozOTowOSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZXF1YWxpemVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDNkZW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW50ZXJsZWF2ZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnbGltaXRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmd2b2x1bWUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zaGFwZXdpcGUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwZWN0cnVtLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzcmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3k0bWVuYy5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL2ZsYWNkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZlbmMuYzoKKwkgIHRlc3RzOiBmaXggbW9yZSB0ZXN0cworCisyMDEyLTAxLTMwIDE0OjUyOjM3ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmM6CisJICBydHBtcDJ0cGF5OiBkbyBub3QgdHJ5IHRvIGZsdXNoIGEgcGFja2V0IHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Njg4NzQKKworMjAxMi0wMS0zMSAxMzo0MTo0NSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYWxwaGFjb2xvci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9jaGViYmFuZC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9jaGVibGltaXQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZmlyZmlsdGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2lpcmZpbHRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9pbnZlcnQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvd3NpbmNiYW5kLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jbGltaXQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZGVpbnRlcmxhY2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOgorCSAgdGVzdHM6IHVwZGF0ZSBzb21lIHRlc3RzIGZvciBuZXcgbWVtb3J5IGFwaQorCisyMDEyLTAxLTMxIDEyOjIyOjE5ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jOgorCSAgY29udHJvbGxlcjogYWRhcHQgdG8gY29udHJvbC1zb3VyY2UgdHlwZSBjaGFuZ2VzCisKKzIwMTItMDEtMzAgMjE6Mzk6MzQgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3NoYXBld2lwZS9zaGFwZXdpcGUtZXhhbXBsZS5jOgorCSogdGVzdHMvZXhhbXBsZXMvdjRsMi9jYW1jdHJsLmM6CisJICBjb250cm9sbGVyOiByZW5hbWUgY29udHJvbC1iaW5kaW5ncworCSAgZ3N0X2NvbnRyb2xfYmluZGluZ194eHggLT4gZ3N0X3h4eF9jb250cm9sX2JpbmRpbmcgZm9yIGNvbnNpc3RlbmN5LgorCisyMDEyLTAxLTMwIDE3OjE2OjUxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYW5ub2RleC9nc3RjbW1sZW5jLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZGVjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZW5jLmM6CisJICB1cGRhdGUgZm9yIEhFQURFUiBmbGFnCisKKzIwMTAtMDYtMTEgMDg6MzY6MzMgKzAyMDAgIFBhc2NhbCBCdWhsZXIgPHBhc2NhbC5idWhsZXJAdGFuZGJlcmcuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgcnRwaDI2NGRlcGF5OiBFeGNsdWRlIE5BTHUgc2l6ZSBmcm9tIHBheWxvYWQgbGVuZ3RoIG9uIHRydW5jYXRlZCBwYWNrZXRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2Nzg0NgorCisyMDEyLTAxLTI4IDIzOjM1OjUwICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHJlbW92ZSBvYnNvbGV0ZSB2YXJpYWJsZSwgc2V0IGJ1dCBub3QgdXNlZAorCSAgUmVwb3J0ZWQgYnkgYW5kcmVkaWViIG9uICNnc3RyZWFtZXIuCisKKzIwMTItMDEtMjggMTM6MDU6MDkgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBhdm9pZCB3cmFwcGluZyBvcGFxdWUgdG8gdHJhbnNwYXJlbnQKKworMjAxMi0wMS0yOCAxMjozNToxMyArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBkbyBub3QgZnJlZSBtZW1vcnkgdHdpY2UKKwkgIEEgcmVjZW50IGNoYW5nZSB0byBmaXggbGVha2luZyBjb2RlYyBJRCBzdHJpbmcgYWNjaWRlbnRhbGx5IGNhdXNlZAorCSAgb25lIG9mIHRoZSB2ZXJ5IGZldyBwbGFjZXMgdGhhdCB3ZXJlbid0IGxlYWtpbmcgdG8gbm93IGZyZWUgdHdpY2UuCisKKzIwMTItMDEtMjcgMTY6Mjc6NDkgKzAxMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkgIGFsYXdkZWM6IEVhY2ggb3V0cHV0IHNhbXBsZSBpcyAyIGJ5dGVzCisKKzIwMTItMDEtMjcgMTI6MTQ6NDkgKzAxMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBEb24ndCBsZWFrIGNhcHMgZXZlbnQgd2hlbiBub3QgcHVzaGluZworCisyMDEyLTAxLTI3IDEyOjA0OjUzICswMTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJICBydHBwdGRlbXV4OiBGb3J3YXJkIHN0aWNreSBldmVudHMKKworMjAxMi0wMS0yNyAxMjowNDowNSArMDEwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSAgcnRwcHRkZW11eDogUHJvdGVjdCBhbGwgdXNlcyBwYWQgbGlzdCB3aXRoIE9CSkVDVCBMT0NLCisJICBBY3R1YWxseSBwcm90ZWN0IHRoZSBlbnRpcmUgcGFkIGxpc3QgYW5kIHVzZSBpdCBpbiBhIHRocmVhZCBzYWZlCisJICB3YXkuCisKKzIwMTItMDEtMjcgMTI6MDI6MjUgKzAxMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgcnRwc3NyY2RlbXV4OiBGb3J3YXJkIHN0aWNreSBldmVudHMgdG8gbmV3IHBhZHMKKworMjAxMi0wMS0yNyAxMjowMTo0MCArMDEwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBydHBzc3JjZGVtdXg6IEFkZCBzc3JjIHRvIGZvcndhcmRlZCBDQVBTIGV2ZW50cworCSAgQWxzbyBpdGVyYXRlIHRoZSBsaXN0IG9mIEdzdFJ0cFNzcmNEZW11eFBhZCBzYWZlbHkKKworMjAxMi0wMS0yNyAxMTo1OTowOCArMDEwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBydHBzc3JjY2RlbXV4OiBGYWN0b3Igb3V0IGdldHRpbmcgZHBhZCBieSBwYWQKKworMjAxMi0wMS0yNiAxODozNTo0OCArMDEwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogS2VlcCB0aGUgYnVmZmVyIG1hcHBlZCB3aGlsZSBpdCBpcyBiZWluZyBtb2RpZmllZAorCisyMDEyLTAxLTI2IDE4OjM1OjI3ICswMTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwc2Vzc2lvbjogSW5pdGlhbGlzZSB0aGUgYWRkcmVzcyBwb2ludGVyIHRvIE5VTEwKKworMjAxMi0wMS0yNyAxMjowNzo0MyArMDEwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZmRldGVjdC5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJICBkdG1mOiBVc2UgbmV3LXN0eWxlIGNhcHMKKworMjAxMi0wMS0yNyAxNjozNzoxOSArMDEwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDxhbW9yYWxlc0BmbHVtb3Rpb24uY29tPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmg6CisJICBkaXJlY3NvdW5kc2luazogUG9ydCBlbGVtZW50IHRvIDAuMTEKKworMjAxMi0wMS0yNiAxOTo0ODoxNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXIyOiByZW1vdmUgcGFkIGV2ZW50IGZ1bmN0aW9uCisJICBXZSB1c2UgdGhlIG9uZSBmcm9tIGNvbGxlY3RwYWRzCisKKzIwMTItMDEtMjYgMTg6MjY6MDIgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIFJldmVydCAicXRkZW11eDogZml4IEdzdERhdGVUaW1lL0dEYXRlVGltZSBtaXh1cCIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgNTMyNjEyNjExMjBiNGMwMDhkZTYxNjkxYzcwZTk0MzU0YjI4MDA0YS4KKwkgIFRoZSBHc3REYXRlVGltZS0+R0RhdGVUaW1lIGNoYW5nZSBpbiBjb3JlIHdhcyBhcHBhcmVudGx5IGFjY2lkZW50YWwsCisJICBhbmQgaXMgbm93IHJldmVydGVkLgorCisyMDEyLTAxLTI2IDE4OjI1OjIxICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgUmV2ZXJ0ICJhdmlkZW11eDogZml4IEdzdERhdGVUaW1lL0dEYXRlVGltZSBtaXh1cCIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgYWNjOWYxNTA5NjhiMjVjNWFlNWE2OTQwYjM0YWQyZDUxYjE3NGZkMi4KKwkgIFRoZSBHc3REYXRlVGltZS0+R0RhdGVUaW1lIGNoYW5nZSBpbiBjb3JlIHdhcyBhcHBhcmVudGx5IGFjY2lkZW50YWwsCisJICBhbmQgaXMgbm93IHJldmVydGVkLgorCisyMDEyLTAxLTI2IDE3OjUwOjMwICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGZpeCBHc3REYXRlVGltZS9HRGF0ZVRpbWUgbWl4dXAKKwkgIFRoaXMgaXMgYSBibGluZCBmaXggdG8gbWF0Y2ggdGhlIG9uZSBJIGp1c3QgbWFkZSB0byBxdGRlbXV4LAorCSAgYXMgSSBkbyBub3QgaGF2ZSBhbiBBVkkgZmlsZSB3aGVyZSB0aGUgY29kZSBnZXRzIGV4ZWN1dGVkLgorCisyMDEyLTAxLTI2IDE3OjQ3OjI5ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggR3N0RGF0ZVRpbWUvR0RhdGVUaW1lIG1peHVwCisKKzIwMTItMDEtMjYgMTg6NTE6MzAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBtb3JlIGZpeGVzCisKKzIwMTItMDEtMjYgMTg6NDM6MDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICB2aWRlb21peGVyOiBtYWtlIHZpZGVvbWl4ZXIgd29yayBzb21ld2hhdAorCisyMDEyLTAxLTI2IDE4OjE1OjUxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5oOgorCSAgdmlkZW9taXhlcjogcG9ydCB0byAwLjExCisJICBJdCBidWlsZHMgYW5kIGdzdC1pbnNwZWN0LTAuMTEgd29ya3MuLiBvdGhlcndpc2UgdW50ZXN0ZWQKKworMjAxMi0wMS0yNiAxNTo0ODowMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSAgZHludWRwc2luazogZml4IGdldC1zdGF0cyBzaWduYWwgcmVnaXN0cmF0aW9uIHNvbWUgbW9yZQorCisyMDEyLTAxLTI2IDE1OjQ2OjEzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIFJldmVydCAidWRwOiBtYXJrIGFjdGlvbiBzaWduYWxzIGFzIFJVTl9GSVJTVCIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgNWM4MzA4NTk5MTI5ZDllMTYwNmVlZGIyZDM1NDM2MTc2NThkYzMwNi4KKworMjAxMi0wMS0yNiAxNTozOTozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICB1ZHA6IG1hcmsgYWN0aW9uIHNpZ25hbHMgYXMgUlVOX0ZJUlNUCisKKzIwMTItMDEtMjYgMTU6Mzc6MjMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkgIHVkcDogbWFyayAiZ2V0LXN0YXRzIiBhcyBhY3Rpb24gc2lnbmFsCisKKzIwMTItMDEtMjYgMTU6MzA6NDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5oOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIHVkcDogZml4IGdldC1zdGF0cyBhY3Rpb24gc2lnbmFsIHJlZ2lzdHJhdGlvbgorCSAgSXQgcmV0dXJucyBhIEdzdFN0cnVjdHVyZSBub3csIG5vdCBhIEdWYWx1ZUFycmF5CisKKzIwMTItMDEtMjYgMTY6MDU6MzQgKzAxMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8YW1vcmFsZXNAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogZml4IHByaW50IGZvcm1hdAorCisyMDEyLTAxLTI2IDExOjUwOjE5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgIG1hdHJvc2thbXV4OiBGaXggc2l6ZSBvZiBvdXRwdXQgYnVmZmVycworCisyMDEyLTAxLTI2IDExOjMzOjA3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogaW5jbHVkZSByaWdodCBjb2xsZWN0cGFkcyB2ZXJzaW9uCisKKzIwMTItMDEtMjYgMTE6Mjk6MTEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFByb3Blcmx5IHVzZSB0aGUgYWxpZ25tZW50IHBhcmFtZXRlciBvZiBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSgpCisJICBJdCdzIGEgYml0bWFzayBmb3IgdGhlIGFsaWdubWVudCwgbm90IHRoZSBhbGlnbm1lbnQgaXRzZWxmLgorCisyMDEyLTAxLTI2IDExOjE4OjQwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgIG1hdHJvc2thbXV4OiBQcm9wZXJseSB1bm1hcCBXUklURSBtYXBzIG9mIHRoZSBvdXRwdXQgYnVmZmVycworCisyMDEyLTAxLTI2IDEwOjQ0OjI4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkgIHZpZGVvbWl4ZXIyOiBVcGRhdGUgZm9yIHRoZSBuZXcgY29sbGVjdHBhZHMyIGV2ZW50IGhhbmRsaW5nIEFQSQorCisyMDEyLTAxLTI2IDEwOjQwOjA2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IFVwZGF0ZSBmb3IgdGhlIG5ldyBjb2xsZWN0cGFkczIgZXZlbnQgaGFuZGxpbmcgQVBJCisKKzIwMTItMDEtMjYgMTA6Mzc6NTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogVXBkYXRlIGZvciB0aGUgbmV3IGNvbGxlY3RwYWRzMiBldmVudCBoYW5kbGluZyBBUEkKKworMjAxMi0wMS0yNiAxMDoyODo1MSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IFVwZGF0ZSBmb3IgbmV3IGNvbGxlY3RwYWRzMiBldmVudCBoYW5kbGluZyBBUEkKKworMjAxMi0wMS0yNiAxMDoyNzo0MCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IFVwZGF0ZSBmb3IgbmV3IGNvbGxlY3RwYWRzMiBldmVudCBoYW5kbGluZyBBUEkKKworMjAxMi0wMS0yNSAxODo0MTozOCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBPbmx5IGZvcndhcmQgdGhlIGV2ZW50IHdoZW4gd2UgZGlkbid0IGhhbmRsZSBpdCBvdXJzZWx2ZXMKKworMjAxMi0wMS0yNSAxODo0MDowMyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMnBhZC5oOgorCSAgdmlkZW9taXhlcjogc29tZSBtb3JlIHBvcnRpbmcKKworMjAxMi0wMS0yNSAxODowMDo1MiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kLmg6CisJICB2aWRlb21peGVyOiBwb3J0IGJsZW5kIGZ1bmN0aW9uCisKKzIwMTItMDEtMjUgMTY6NTg6MTIgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHY6IEZpeCB1bml0aWFsaXplZCB2YXJpYWJsZXMKKwkgIChvciByYXRoZXIgY2lyY3VtdmVudCBpc3N1ZXMgd2l0aCBuYWl2ZSBjb21waWxlcnMgLi4uKQorCisyMDEyLTAxLTI1IDE1OjIxOjQ0ICswMDAwICBKYXlha3Jpc2huYW4gTSA8amF5LmtyaXNobmFubUBnbWFpbC5jb20+CisKKwkqIGV4dC9jYWlyby9NYWtlZmlsZS5hbToKKwkgIGNhaXJvOiBmaXggYnVpbGQsIG1ha2Ugc3VyZSBsaWJnc3R2aWRlbyBjYW4gYmUgZm91bmQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Njg2NDgKKworMjAxMi0wMS0yNSAxNDo1MDo1MCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZmRldGVjdC5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJICBwb3J0IHRvIG5ldyBtZW1vcnkgQVBJCisKKzIwMTItMDEtMjUgMTM6MTk6MTIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cG1hbmFnZXI6IGRvbid0IHByZXRlbmQgb3VyIHJhbmRvbSBob3N0bmFtZXMgYXJlIGZ1bGx5LXF1YWxpZmllZCBkb21haW4gbmFtZXMKKworMjAxMi0wMS0yNSAxMzo0NzozMCArMDEwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGM0NjNiYzAgdG8gN2ZkYTUyNAorCisyMDEyLTAxLTI1IDEyOjQ5OjM0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICcwLjExJyBvZiBzc2g6Ly9naXQuZnJlZWRlc2t0b3Aub3JnL2dpdC9nc3RyZWFtZXIvZ3N0LXBsdWdpbnMtZ29vZCBpbnRvIDAuMTEKKworMjAxMi0wMS0yNSAxMjo0OToxMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9mbGFjL2dzdGZsYWNkZWMuYworCSAgZXh0L2pwZWcvZ3N0anBlZ2VuYy5jCisJICBleHQvcHVsc2UvcHVsc2VzaW5rLmMKKwkgIHN5cy92NGwyL2dzdHY0bDJzcmMuYworCisyMDEyLTAxLTI1IDEyOjQxOjQyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgIHBuZzogcG9ydCB0byBuZXcgbWVtb3J5IEFQSQorCisyMDEyLTAxLTI1IDEyOjQxOjMwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thOiBwb3J0IHRvIG5ldyBtZW1vcnkgQVBJCisKKzIwMTItMDEtMjQgMTQ6Mzg6NTggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxlbmMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9wYXJzZXIuYzoKKwkgIG1vcmUgbWVtb3J5IEFQSSBwb3J0aW5nCisKKzIwMTItMDEtMjMgMTc6MjU6MzcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWlpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmM6CisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSogZ3N0L2RlYnVndXRpbHMvYnJlYWtteWRhdGEuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Rlc3RzLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOgorCSogZ3N0L2lzb21wNC9hdG9tc3JlY292ZXJ5LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmM6CisJKiBnc3QvaXNvbXA0L2dzdHJ0cHhxdGRlcGF5LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmg6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYzoKKwkqIGdzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkgIHVwZGF0ZSBmb3IgbmV3IG1lbW9yeSBBUEkKKworMjAxMi0wMS0yNSAxMToyMTo1MCArMDEwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZmRldGVjdC5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuaDoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIGR0bWY6IHBvcnQgdG8gMC4xMQorCisyMDEyLTAxLTI1IDExOjM4OjExICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDJhNTkwMTYgdG8gYzQ2M2JjMAorCisyMDEyLTAxLTI0IDE4OjI0OjEzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgIHBuZ2VuYzogZGlzYWJseSBzbmFwc2hvdCBiZWhhdmlvdXIgYnkgZGVmYXVsdAorCSAgLi4uIHNpbmNlIHN1Y2ggYmVoYXZpb3VyIGlzIG5vdCBjb25zaXN0ZW50LCBpZiBhbGxvd2FibGUgYXQgYWxsLgorCisyMDEyLTAxLTI0IDE4OjIzOjIyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmg6CisJICBwbmdkZWM6IHBvcnQgdG8gMC4xMQorCisyMDEyLTAxLTI0IDE4OjIxOjA4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmg6CisJICBwbmdlbmM6IHBvcnQgdG8gMC4xMQorCisyMDEyLTAxLTI0IDE0OjUzOjM4ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogZml4IHN0cmluZyBsZWFrCisKKzIwMTItMDEtMjQgMTQ6NTI6MDkgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBmaXggdXNlIG9mIGZyZWVkIG1lbW9yeQorCisyMDExLTEyLTAxIDE1OjQ5OjQwICswMTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIERvbid0IGNyYXNoIG9uIGVtcHR5IGxhY2VzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY1MjI0CisKKzIwMTItMDEtMjMgMTM6MTU6NDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cG1hbmFnZXI6IGRvbid0IHJldmVhbCB0aGUgdXNlcidzIHVzZXJuYW1lLCBob3N0bmFtZSBvciByZWFsIG5hbWUgYnkgZGVmYXVsdAorCSAgU2VuZCBhIHJhbmRvbWx5IG1hZGUtdXAgdXNlckBob3N0bmFtZSBhcyBDTkFNRSBhbmQgZG9uJ3QKKwkgIHNlbmQgYSBOQU1FIGF0IGFsbCBieSBkZWZhdWx0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2ODMyMAorCisyMDEyLTAxLTIxIDIwOjA3OjU2ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jOgorCSAgY29udHJvbGxlcjogbW92ZSBmcm9tIGNvbnRyb2wtYmluZGluZyB0byBjb250cm9sLWJpbmRpbmctZGlyZWN0CisKKzIwMTItMDEtMjIgMjM6MzE6MTkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QtbGlicy9nc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0Lmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb2ZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9maXJmaWx0ZXIuaDoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5oOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmg6CisJICBEb24ndCB1c2UgZGVwcmVjYXRlZCBHTGliIEFQSQorCisyMDEyLTAxLTIyIDIzOjE1OjE5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJKiBnc3QtbGlicy9nc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuaDoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkqIHRlc3RzL2ljbGVzL2VxdWFsaXplci10ZXN0LmM6CisJKiB0ZXN0cy9pY2xlcy9nZGtwaXhidWZzaW5rLXRlc3QuYzoKKwkqIHRlc3RzL2ljbGVzL3Rlc3Qtb3NzNC5jOgorCSogdGVzdHMvaWNsZXMvdjRsMnNyYy10ZXN0LmM6CisJKiB0ZXN0cy9pY2xlcy92aWRlb2Nyb3AtdGVzdC5jOgorCSAgVXNlIG5ldyBHTGliIEFQSSB1bmNvbmRpdGlvbmFsbHkKKworMjAxMi0wMS0yMCAxNzowNjo0MiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHNpbXBsaWZ5IGludGVybmFsIHNyYyBldmVudCBkZWJ1ZyBsb2dnaW5nCisJICAuLi4gd2hpY2ggYXZvaWRzIGFsbW9zdCBzdXBlcmZsdW91cyBvYnRhaW5pbmcgb2YgcnRzcCBlbGVtZW50LgorCisyMDEyLTAxLTIwIDE3OjAzOjUwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYXZvaWQgTlVMTCBzdHJpbmcgY29tcGFyaXNvbgorCisyMDEyLTAxLTIwIDE3OjAzOjIxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IGFycmFuZ2UgZm9yIGluaXRpYWxpemVkIHZhcmlhYmxlcworCisyMDEyLTAxLTIwIDE3OjAyOjE1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzoKKwkgIHJ0cG1wNGFkZXBheTogcHJldmVudCBvdXQtb2YtYm91bmQgYXJyYXkgYWNjZXNzCisKKzIwMTItMDEtMjAgMTc6MDE6MzcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L2F0b21zcmVjb3ZlcnkuYzoKKwkgIGlzb21wNDogcmVjb3Zlcnk6IGFkZCBzYW5pdHkgY2hlY2sKKwkgIC4uLiBvbiBwb3NzaWJseSBib2d1cy9jb3JydXB0IGlucHV0IGRhdGEuCisKKzIwMTItMDEtMjAgMTc6MDA6NTEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJICBydHB0aGVvcmFkZXBheTogcmVtb3ZlIGRlYWQgY29kZQorCisyMDEyLTAxLTIwIDE2OjU4OjI4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYS1kZW11eDogcmVtb3ZlIHJlZHVuZGFudCB2YXJpYWJsZQorCisyMDEyLTAxLTIwIDE2OjU3OjUyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogZml4IGFyaXRobWV0aWMgZm9yIHVuc2lnbmVkIGNvbXBhcmlzb24KKworMjAxMi0wMS0yMCAxNjo1NTowNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IGFkZCB2YXJpb3VzIG1pc3NpbmcgYnJlYWsKKworMjAxMi0wMS0yMCAxNjo1NDowNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiB0d2VhayBERUZBVUxUIGZvcm1hdCBkdXJhdGlvbiBxdWVyeSByZXNwb25zZQorCisyMDEyLTAxLTIwIDE2OjQ5OjE0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkgIGFscGhhY29sb3I6IHJlbW92ZSByZWR1bmRhbnQgc3RhdGVtZW50CisKKzIwMTItMDEtMjAgMTY6NDg6NDkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiBpbXByb3ZlIHVwc3RyZWFtIHBlZXIgZHVyYXRpb24gcXVlcnlpbmcKKwkgIC4uLiB0byBhdm9pZCBhY2NlcHRpbmcgdW5oYW5kbGVkIGR1cmF0aW9uIHF1ZXJ5IHJlc3VsdC4KKworMjAxMi0wMS0yMCAxNjo0NzozNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzcmM6IGFkZGl0aW9uYWwgZXJyb3IgY29uZGl0aW9uIGNoZWNraW5nCisKKzIwMTItMDEtMjAgMTY6NDY6MjEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGFkZGl0aW9uYWwgZXJyb3IgY29uZGl0aW9uIGNoZWNraW5nCisKKzIwMTItMDEtMjAgMTY6NDQ6MjEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJICBqcGVnZW5jOiBjaGVjayBfYWxsb2NfYnVmZmVyIHJlc3VsdCBhbmQgcGVyZm9ybSBmYWxsYmFjayBhbGxvYyBpZiBuZWVkZWQKKwkgIC4uLiByYXRoZXIgdGhhbiBjYXJyeWluZyBvbiB3aXRoIE5VTEwgYnVmZmVyLgorCisyMDEyLTAxLTIwIDE0OjQ1OjAxICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jOgorCSAgY29udHJvbGxlcjogYWRhcHQgdG8gY29udHJvbCBiaW5kaW5nIGNoYW5nZXMKKworMjAxMi0wMS0yMCAxMTozNzozOCArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL3NoYXBld2lwZS1leGFtcGxlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy92NGwyL2NhbWN0cmwuYzoKKwkgIGNvbnRyb2xsZXI6IGFkYXB0IHRvIGNvbnRyb2xsZXIgYXBpIGNoYW5nZXMKKwkgIERvbid0IHVzZSB0aGUgY29udmVuaWVuY2UgYXBpIGZvciBjb250cm9sIHNvdXJjZXMuCisKKzIwMTItMDEtMTkgMTQ6MjQ6MDQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJKiBjb25maWd1cmUuYWM6CisJICBBZGQgLS1kaXNhYmxlLWZhdGFsLXdhcm5pbmdzIGNvbmZpZ3VyZSBvcHRpb24KKworMjAxMi0wMS0xOSAxMjo0NDozOSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIHVwZGF0ZSBmb3IgbWVtb3J5IEFQSQorCisyMDEyLTAxLTE5IDExOjMzOjUzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvY2xpZW50LmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5oOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuaDoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG1vb3ZyZWNvdmVyLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bW9vdnJlY292ZXIuaDoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5oOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9vdmVybGF5LmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOgorCSAgcG9ydCB0byBuZXcgZ3RocmVhZCBBUEkKKworMjAxMi0wMS0xOCAxNjo1ODoxMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZS5hYzogUmVtb3ZlIEdJTyBjaGVjaywgdGhpcyBpcyBpbiBnc3QtZ2xpYjIubTQgbm93CisKKzIwMTItMDEtMTggMTY6NDY6MTcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMDgwNzE4NyB0byAyYTU5MDE2CisKKzIwMTItMDEtMTggMTY6MTU6NTkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmUuYWM6IFJlcXVpcmUgR0xpYiAyLjMxLjEwIGFuZCBpbXByb3ZlIEdJTyBjaGVjaworCisyMDEyLTAxLTE3IDE2OjU4OjA3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogUmVtb3ZlIHVubmVlZGVkIHNvY2tldC5oIGluY2x1ZGUKKworMjAxMi0wMS0xNyAxNjo1MzozMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOgorCSAgY29uZmlndXJlOiBSZW1vdmUgc29ja2V0L3dpbnNvY2sgc3BlY2lmaWMgY2hlY2tzCisJICBOb3QgbmVjZXNzYXJ5IGFueW1vcmUuCisKKzIwMTItMDEtMTcgMTY6NDk6MTAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IFVwZGF0ZSBmb3IgdGhlIG5ldyBHSU8gdmVyc2lvbnMgb2YgdGhlIHVkcCBlbGVtZW50cworCisyMDEyLTAxLTE3IDEzOjA4OjQyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwbWFuYWdlcjogUG9ydCB0byBHSU8KKworMjAxMi0wMS0xNyAxMToxOTozMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC91ZHAvTWFrZWZpbGUuYW06CisJICBjb25maWd1cmU6IFJlcXVpcmUgR0lPIDIuMzEuMTAKKworMjAxMi0wMS0xNyAxMToxODozMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwLmM6CisJKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6CisJKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmg6CisJICB1ZHA6IFJlbW92ZSBub3cgdW5lY2Vzc2FyeSBjb2RlCisKKzIwMTItMDEtMTcgMTE6MTg6MTUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmg6CisJICB1ZHBzaW5rL211bHRpdWRwc2luazogUG9ydCB0byBHSU8KKworMjAxMi0wMS0xNyAwOTozODozMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmg6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgZHludWRwc2luazogUG9ydCB0byBHSU8KKworMjAxMi0wMS0xNyAwOTozMjoyNyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmg6CisJICBkeW51ZHBzaW5rOiBQb3J0IHRvIEdJTworCisyMDEyLTAxLTE3IDA5OjAzOjM4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5oOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkgIHVkcHNyYzogUG9ydCB0byBHSU8KKworMjAxMi0wMS0xNiAxNzo1MToxOCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJICBjdXR0ZXI6IGZpeCBsZWFrIG9mIHVudXNlZCBHVmFsdWUKKworMjAxMi0wMS0xNiAxNjoxMDowOCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1dG9kZXRlY3QuYzoKKwkgIHRlc3RzOiBmaXggYXV0b2RldGVjdCB0ZXN0IG5vdCB0ZXN0aW5nIGNvcnJlY3RseSBmb3Igc3RhdGUgY2hhbmdlIHN1Y2Nlc3MKKwkgIFN0YXRlIGNoYW5nZSB0byBQQVVTRUQgY2FuIGJlIGRvbmUgYXN5bmMsIHNvIGlmIHRoaXMgaGFwcGVucywgd2UgbmVlZAorCSAgdG8gd2FpdCBmb3IgdGhlIGNoYW5nZSB0byBiZSBkb25lIChvciBmYWlsZWQpLgorCisyMDEyLTAxLTE2IDE1OjQyOjQ2ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSAgcnRwaDI2M3BwYXk6IGZpeCBjYXBzIGxlYWsKKworMjAxMi0wMS0xNiAxMjoxMzo1MCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IG1ha2UgaW50ZXJsYWNlZG5lc3MgdGVzdCBkZXRlcm1pbmlzdGljCisJICBJZiB0aGUgaW50ZXJsYWNlZCBmbGFnIGlzIG5vdCBwcmVzZW50IGluIHRoZSBjYXBzLCB3ZSBhc3N1bWUgdGhlCisJICBkYXRhIGlzIG5vdCBpbnRlcmxhY2VkLCBpbnN0ZWFkIG9mIGxlYXZpbmcgdGhlIGJvb2xlYW4gdW5pbml0aWFsaXplZC4KKworMjAxMi0wMS0xMyAxODoxMjowNSAtMDUwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgbWF0cm9za2E6IGZpeCBwcmludGYgZm9ybWF0IGNvbXBpbGVyIHdhcm5pbmdzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjYyNjE1CisKKzIwMTItMDEtMTMgMTg6MTE6MzYgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBmaXggd3JvbmcgZXJyb3IgY2hlY2sKKwkgIHBhX3N0cmVhbV8qIGZ1bmN0aW9ucyByZXR1cm4gbmVnYXRpdmUgb24gZXJyb3IsIGRlc3BpdGUgdGhlIGRlZmluZXMKKwkgIGZvciBlcnJvciBjb2RlcyBiZWluZyBwb3NpdGl2ZS4KKwkgIEkgb25seSBnb3QgdG8gcmVwcm8gdGhlIGVycm9yIHR3aWNlLCBzbyBJJ20gbm90IHN1cmUgMTAwJSBzdXJlIHRoaXMKKwkgIGZpeGVzIHRoZSBpc3N1ZSAodGhlIG5lZ2F0aXZlIHZhciBiZWluZyB1bmluaXRpYWxpemVkIGFmdGVyIHJldHVybmluZworCSAgZnJvbSBwYV9zdHJlYW1fZ2V0X2xhdGVuY3kpLgorCisyMDEyLTAxLTEzIDE3OjQzOjQ5ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zczQvb3NzNC1zaW5rLmM6CisJKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSAgb3NzNDogZml4IGNhcHMgbGVha3MKKworMjAxMi0wMS0xMyAxNzoyNTo1OSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IGZpeCBjYXBzIGxlYWsKKworMjAxMi0wMS0xMyAxNTo1NzoyMCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOgorCSAgdGVzdHM6IGZpeCBjYXBzIGxlYWsgaW4gdmlkZW90ZXN0c3JjIHRlc3QKKworMjAxMi0wMS0xMyAxMjo1MDowNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICBtYXRyb3NrYWRlbXV4OiBjbGVhbiB1cCBvYnNvbGV0ZSBjbG9zaW5nIHNlZ21lbnQgaGFuZGxpbmcKKworMjAxMi0wMS0xMyAxMDozMjo1OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkgIHJ0cHB0ZGVtdXg6IHBsdWcgcGFkIGxlYWsgaW4gZXJyb3IgY29kZSBwYXRoCisJICBCYXNlZCBvbiBwYXRjaCBieTogU3RpZyBTYW5kbmVzIDxzdGlnLnNhbmRuZXNAY2lzY28uY29tPgorCSAgRG9uJ3QgbGVhayBzcmNwYWQgaWYgdGhlcmUgYXJlIG5vIGNhcHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY3ODIwCisKKzIwMTEtMTAtMDQgMTA6MDA6MDIgKzAyMDAgIFN0aWcgU2FuZG5lcyA8c3RpZ3NhbmRAY2lzY28uY29tPgorCisJKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cubToKKwkgIG9zeHZpZGVvOiBGaXggbGVhayBvZiBOU09wZW5HTFBpeGVsRm9ybWF0IG9iamVjdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NzgxOAorCisyMDExLTA5LTA1IDEwOjQzOjE5ICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IERvbid0IGFzc2VydCB3aGVuIHRoZSBpbnRlcmZhY2UgaXMgbm90IGltcGxlbWVudGVkLgorCSAgU2ltcGx5IHJldHVybiBGQUxTRSBpbnN0ZWFkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NzgxNworCisyMDEyLTAxLTEyIDAwOjE4OjM5ICswMjAwICBSYWltbyBKw6RydmkgPHJhaW1vLmphcnZpQGdtYWlsLmNvbT4KKworCSogc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5jOgorCSogc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5oOgorCSAgd2F2ZWZvcm1zaW5rOiBGaXggbWluZ3cgd2FybmluZ3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Njc3MTkKKworMjAxMi0wMS0xMiAyMzo1NTozMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgR1NUX1RZUEVfREFURSAtPiBHX1RZUEVfREFURQorCisyMDEyLTAxLTEyIDIzOjQ4OjUwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSAgZXFNZXJnZSByZW1vdGUtdHJhY2tpbmcgYnJhbmNoICdvcmlnaW4vbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYworCSAgZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmMKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmMKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jCisKKzIwMTItMDEtMTIgMTg6MjM6NDIgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIGdzdHJ0cHNzcmNkZW11eDogZml4IGVsZW1lbnQgbGVhaworCisyMDEyLTAxLTEyIDE0OjE5OjIyICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYTogZG8gbm90IGxlYWsgYXR0YWNobWVudCBidWZmZXJzCisKKzIwMTItMDEtMTIgMTM6MTc6NTUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogcmVtb3ZlIG9ic29sZXRlIEZJWE1FIGNvbW1lbnRzCisKKzIwMTItMDEtMTIgMTA6MzA6MTEgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBkbyBub3QgZHJvcCB0aGUgZmlyc3QgZGF0YSBidWZmZXIgb24gdGhlIGZsb29yIChhbmQgbGVhayBpdCBlaXRoZXIpCisKKzIwMTItMDEtMTIgMTE6MDg6MzggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGluZGV4LmM6CisJKiBnc3QvZmx2L2dzdG1lbWluZGV4LmM6CisJICBmbHZkZW11eDogYWRkIHByZWZpeCB0byBsb2NhbCBHc3RJbmRleCByZWxhdGVkIGNvcGllcworCSAgLi4uIHRvIGF2b2lkIGR1cGxpY2F0ZSB0eXBlIG5hbWVzIHdpdGggb3RoZXIgc3VjaCBsb2NhbCBjb3BpZXMgaW4gdGhlIHdpbGQuCisKKzIwMTItMDEtMTIgMTE6MDc6MzMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogYWN0aXZhdGUgcGFkIGJlZm9yZSBzZXR0aW5nIGNhcHMKKwkgIC4uLiByYXRoZXIgdGhhbiB0aGUgdXN1YWwgMC4xMCBvdGhlciB3YXkgYXJvdW5kLgorCSAgRml4ZXMgIzY2NzU1OC4KKworMjAxMi0wMS0xMSAxODo0NTozMyAtMDMwMCAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8cmV5bmFsZG9AY29sbGFib3JhLmNvbT4KKworCSogQW5kcm9pZC5tazoKKwkgIFRlbXBvcmFyaWx5IGRpc2FibGluZyBtdWx0aWZpbGUgZm9yIHRoZSBBbmRyb2lkIGJ1aWxkCisJICBUaGVyZSBpcyBhIGhhcmQgZGVwZW5kZW5jeSBvbiBpbm90aWZ5IGNvbW1pbmcgZnJvbSBnaW8uIFdlCisJICBhcmUgbm90IGN1cnJlbnRseSBidW5kbGluZyBpbm90aWZ5IHdpdGggdGhlIEFuZHJvaWQgZGlzdCBzbworCSAgSSdtIGRpc2FibGluZyBtdWx0aWZpbGUgZm9yIG5vdyB1bnRpbCBzb21lb25lIGdldHMgYXJvdW5kCisJICB0byBzb3J0IHRoaXMgb3V0LgorCSAgVGhpcyBjaGFuZ2UgZml4ZXMgYnVpbGRpbmcgb24gQW5kcm9pZAorCisyMDEwLTEwLTIwIDAyOjE3OjQzIC0wNzAwICBMZW8gU2luZ2VyIDxsZW8uc2luZ2VyQGxpZ28ub3JnPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2lpcmZpbHRlci5jOgorCSAgYXVkaW9meDogVXNlIG1vc3QgY29tbW9uIGNvbnZlbnRpb24gZm9yIGRlZmluaXRpb25zIG9mIElJUiBmaWx0ZXIgY29lZmZpY2llbnRzLgorCSAgTW9zdCBzaWduYWwgcHJvY2Vzc2luZyB0ZXh0cywgaW5jbHVkaW5nIE1BVExBQiwgdXNlIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbiBmb3IgSUlSIGZpbHRlciBjb2VmZmljaWVudHM6CisJICBhXzAgeVtuXSArIGFfMSB5W24tMV0gKyAuLi4gKyBhX00geVtuLU1dID0gYl8wIHhbbl0gKyBiXzEgeFtuLTFdICsgLi4uICsgYltOXSB4W24tTl0KKwkgIFVzdWFsbHksIGFfMCBpcyBzZXQgdG8gMSBiZWNhdXNlIHRoZSBjb2VmZmljaWVudHMgY2FuIGFsd2F5cyBiZSByZXNjYWxlZCwgZ2l2aW5nCisJICB5W25dID0gYl8wIHhbbl0gKyBiXzEgeFtuLTFdICsgLi4uICsgYltOXSB4W24tTl0gLSBhXzEgeVtuLTFdIC0gLi4uIC0gYV9NIHlbbi1NXQorCSAgVGhlIGNvbnZlbnRpb24gdGhhdCB3YXMgcHJldmlvdXNseSB1c2VkIGJ5IGF1ZGlvZnhiYXNlaWlyZmlsdGVyIGFuZCBkZXJpdmVkIGNsYXNzIGhhZCB0aGUgYSBhbmQgYiBjb2VmZmljaWVudHMgc3dhcHBlZCwgYW5kIGRpZCBub3QgaGF2ZSB0aGUgbWludXMgc2lnbnMuCisJICBUaGlzIGNoYW5nZSBtYWtlcyB0aGUgYXVkaW9meCBwbHVnaW4gdXNlIHRoZSBtb3JlIGNvbW1vbiBjb252ZW50aW9uIGRlc2NyaWJlZCBhYm92ZS4KKworMjAxMi0wMS0xMSAxNDo0NzozNiArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSogZXh0L2phY2svZ3N0amFjay5oOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5oOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuaDoKKwkgIGphY2s6IGFkZCBhIHRyYW5zcG9ydCBtb2RlIGVudW0KKwkgIENsaWVudHMgY2FuIGNvbmZpZ3VyZSB0aGUgZGVzaXJlZCBiZWhhdmlvdXIgdmlhICJ0cmFuc3BvcnQiIHByb3BlcnR5LiBUaGUKKwkgIGRlZmF1bHQgYmVoYXZpb3VyIGlzIGlnbm9yaW5nIHRoZSB0cmFuc3BvcnQgc3RhdGUuIE90aGVyIG1vZGVzIGFyZSBtYXN0ZXIgYW5kCisJICBzbGF2ZS4KKworMjAxMi0wMS0xMSAxNDoxMDo0NiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogRml4IGJ1ZmZlciBoYW5kbGluZworCSAgc291cGh0dHBzcmMgaXMgbm93IHVzYWJsZSBhZ2FpbiBhbmQgZG9lc24ndCBjcmFzaCBhbnltb3JlCisJICB3aGVuZXZlciBzb21ldGhpbmcgaXMgcmVhZCBmcm9tIGEgSFRUUCBjb25uZWN0aW9uLgorCisyMDEyLTAxLTExIDAxOjQ1OjM0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3dhdmVuYy5jOgorCSAgdGVzdHM6IGZpeCB3YXZlbmMgdGVzdCBvbiBiaWcgZW5kaWFuCisJICB3YXZlbmMgb25seSBhY2NlcHRzIGxpdHRsZS1lbmRpYW4gUENNLCBidXQgbW9zdCBvZiBvdXIKKwkgIGVsZW1lbnRzIHN1Y2ggYXMgYXVkaW90ZXN0c3JjIG9ubHkgcHJvZHVjZSBvciBwcm9jZXNzCisJICBhdWRpbyBpbiBuYXRpdmUgZW5kaWFubmVzcywgc28gd2UgbmVlZCB0byBwbHVnIGEKKwkgIGNvbnZlcnRlciBiZWZvcmUgd2F2ZW5jIG9uIGJpZyBlbmRpYW4gc3lzdGVtcy4KKworMjAxMi0wMS0xMCAyMzowMjo0NSArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICBqYWNrOiBkZWFjdGl2YXRlIHRoZSByZXF1ZXN0X3N0YXRlIGNvZGUKKwkgIFdoZW4gcWphY2tjdGwgaXMgc3RhcnRlZCwgdHJhbnNwb3J0IGlzIHN0b3BwZWQgYnkgZGVmYXVsdC4gVGhpcyB3b3VsZCBiZSBhCisJICByZWdyZXNzaW9uIGZvciBnc3RyZWFtZXIgYXBwcyB0aGF0IGJlZm9yZSBqdXN0IHN0YXJ0ZWQgdG8gcGxheSByaWdodCBhd2F5LgorCisyMDEyLTAxLTEwIDIyOjI3OjExICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9jbGllbnQuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5oOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICBqYWNrOiBhZGQgdHJhbnNwb3J0IGNvbnRyb2wgaGFuZGxpbmcKKwkgIFRoaXMgZmVhdHVyZSBhbGxvd3MgdG8gc3RhcnQgYW5kIHN0b3AgcGxheWJhY2sgZnJvbSBvdGhlciBqYWNrIGFwcGxpY2F0aW9ucyAoZS5nLiBxamFja2N0bCkuCisKKzIwMTItMDEtMTAgMTg6NTA6MjcgKzAxMDAgIE5pY29sYSBNdXJpbm8gPG5pY29sYS5tdXJpbm9AZ21haWwuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogZml4IGNvZGVjX3ByaXYgbGVha3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Njc0MTkKKworMjAxMi0wMS0xMCAxNTowNjozOSArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvY2xpZW50LmM6CisJICBqYWNrOiB1c2UgamFjayB0eXBlIGZvciB0aGUgY2FsbGJhY2sKKwkgIEphY2sgaGVhZGVycyBoYXZlIGEgdHlwZWRlZiBmb3IgdGhlIHNodXRkb3duIGNhbGxiYWNrIGFzIHdlbGwuCisKKzIwMTItMDEtMTAgMTQ6MzI6MzIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYworCSAgZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmMKKwkgIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYworCSAgZ3N0L2F2aS9nc3RhdmltdXguYworCSAgZ3N0L2Zsdi9nc3RmbHZtdXguYworCSAgZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jCisJICBnc3QvaXNvbXA0L2dzdHF0bXV4LmMKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmMKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaAorCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmMKKwkgIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jCisJICBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jCisJICBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jCisJICBnc3Qvc21wdGUvZ3N0c21wdGUuYworCSAgZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYworCSAgZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmMKKwkgIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmMKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYworCSAgZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmMKKwkgIHBvL2phLnBvCisJICBwby9sdi5wbworCSAgcG8vc3IucG8KKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ3ZvbHVtZS5jCisKKzIwMTItMDEtMDkgMjI6NTg6MzIgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICBkb2NzOiBSZW1vdmUgb2xkIHZpZGVvbWl4ZXIgaGVhZGVycworCSAgVGhlc2UgZ290IHJlbW92ZWQgaW4gdGhlIHRyYW5zaXRpb24gdG8gdmlkZW9taXhlcjIuCisKKzIwMTItMDEtMDkgMTc6Mjg6MTcgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogZml4IGNvZGVjIHN0cmluZyBsZWFrcworCisyMDEyLTAxLTA5IDE0OjUxOjQ0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJwYWQuaDoKKwkgIHZpZGVvbWl4ZXI6IFJlbW92ZSB2aWRlb21peGVyIGFuZCByZWdpc3RlciB2aWRlb21peGVyMiBhcyB2aWRlb21peGVyCisKKzIwMTItMDEtMDkgMTE6MzY6NTggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGluaXRpYWxpemUgdmFyaWFibGUgdG8gYXZvaWQgdW5kZWZpbmVkIHVzZQorCisyMDEyLTAxLTA2IDA5OjQwOjIyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5oOgorCSAgZmxhYzogUG9ydCB0byB0aGUgbmV3IHJhdyBhdWRpbyBjYXBzCisKKzIwMTItMDEtMDUgMTk6MjU6MzMgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBpc29tcDQ6IGZpeCBjYXBzIGxlYWsKKworMjAxMi0wMS0wNSAxOTowODowMyArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIGlzb21wNDogcmVtb3ZlIGRlYWQgYXNzaWdubWVudAorCisyMDEyLTAxLTA1IDE0OjE4OjAzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSAgZml4IHBhZCB0ZW1wbGF0ZXMKKworMjAxMi0wMS0wNCAxNTowNTo0MSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJICBzcGVleDogVXBkYXRlIGZvciB0aGUgbmV3IHJhdyBhdWRpbyBjYXBzCisKKzIwMTItMDEtMDQgMTQ6NTQ6MTAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IEFkZCB0aGUgbmV3IGxheW91dCBmaWVsZCB0byB0aGUgcmF3IGF1ZGlvIGNhcHMKKworMjAxMi0wMS0wNCAxNDo1Mjo0NiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSogZXh0L2phY2svZ3N0amFja3V0aWwuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2t1dGlsLmg6CisJICBqYWNrYXVkaW9zcmM6IFBvcnQgdG8gdGhlIG5ldyBtdWx0aWNoYW5uZWwgYXVkaW8gY2FwcworCisyMDEyLTAxLTA0IDE0OjEzOjU0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBBZGQgRkxBQyBhbmQgaW50ZXJsZWF2ZSB0byB0aGUgbm9uLXBvcnRlZCBwbHVnaW5zIGxpc3QKKwkgIEJvdGggbmVlZCB0byBiZSB1cGRhdGVkIHRvIHRoZSBhdWRpby94LXJhdyBjYXBzIGFuZCB3ZXJlIG9ubHkKKwkgIGhhbGYtcG9ydGVkIGJlZm9yZS4KKworMjAxMi0wMS0wNCAxMzo0ODozNiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cEwxNnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBjaGFubmVscy5jOgorCSogZ3N0L3J0cC9nc3RydHBjaGFubmVscy5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJICBydHA6IFVwZGF0ZSBmb3IgdGhlIG5ldyBhdWRpbyBjYXBzCisKKzIwMTItMDEtMDQgMTI6MDY6MTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBVcGRhdGUgZm9yIGxpYmdzdHJpZmYgQVBJIGNoYW5nZXMKKwkgIFN0aWxsIG5lZWRzIHRvIGhhbmRsZSByYXcgYXVkaW8gY2hhbm5lbCByZW9yZGVyaW5nCisKKzIwMTItMDEtMDQgMTI6MDU6MTYgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSAgd2F2ZW5jOiBVcGRhdGUgZm9yIHRoZSBuZXcgcmF3IGF1ZGlvIGNhcHMKKworMjAxMi0wMS0wNCAxMjowMzo1MCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IFVwZGF0ZSBmb3IgdGhlIG5ldyByYXcgYXVkaW8gY2FwcyBsYXlvdXQgZmllbGQKKworMjAxMi0wMS0wNCAxMTo1NzoyMCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJnbGltaXRlci5jOgorCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYzoKKwkgIHJlcGxheWdhaW46IFVwZGF0ZSBmb3IgdGhlIG5ldyBhdWRpbyBjYXBzCisKKzIwMTItMDEtMDQgMTE6NTI6MjkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thOiBVcGRhdGUgZm9yIHRoZSBuZXcgcmF3IGF1ZGlvIGludGVybGVhdmVkIGNhcHMgZmllbGQKKwkgIFN0aWxsIG5lZWRzIHRvIGJlIGZpeGVkIHRvIGhhbmRsZSB0aGUgbXVsdGljaGFubmVsIGNoYW5uZWwtbWFzaworCSAgYW5kIHJlb3JkZXJpbmcuCisKKzIwMTItMDEtMDQgMTE6MzE6MDcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGxldmVsOiBVcGRhdGUgZm9yIHRoZSBuZXcgcmF3IGF1ZGlvIGxheW91dCBmaWVsZAorCisyMDEyLTAxLTA0IDExOjI5OjI2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBpc29tcDQ6IFBvcnQgdG8gdGhlIG5ldyBhdWRpbyBjYXBzCisJICBTdGlsbCBuZWVkcyB0byBoYW5kbGUgdGhlIGNoYW5uZWwgcG9zaXRpb25zL21hc2tzIGFuZAorCSAgY2hhbm5lbCByZW9yZGVyaW5nLgorCisyMDEyLTAxLTA0IDExOjExOjA2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzoKKwkgIGN1dHRlcjogVXBkYXRlIGZvciB0aGUgbmV3IHJhdyBhdWRpbyBsYXlvdXQgZmllbGQKKworMjAxMi0wMS0wNCAxMTowOTozMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkgIGdvb206IFBvcnQgdG8gdGhlIG5ldyBtdWx0aWNoYW5uZWwgY2FwcyBhbmQgdXBkYXRlIGZvciB0aGUgbmV3IHJhdyBhdWRpbyBsYXlvdXQgZmllbGQKKworMjAxMi0wMS0wNCAxMTowODoxOCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJICBlcXVhbGl6ZXI6IFVwZGF0ZSBmb3IgdGhlIG5ldyByYXcgYXVkaW8gbGF5b3V0IGZpZWxkCisKKzIwMTItMDEtMDQgMTE6MDc6MjkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogVXBkYXRlIGZvciB0aGUgbGliZ3N0cmlmZiBBUEkgY2hhbmdlcworCSAgU3RpbGwgbmVlZHMgdG8gZG8gcmVvcmRlcmluZyBvZiBjaGFubmVscyBmb3IgcmF3IGF1ZGlvLgorCisyMDEyLTAxLTA0IDExOjA2OjI4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSAgYXVwYXJzZTogUG9ydCB0byB0aGUgbmV3IG11bHRpY2hhbm5lbCBjYXBzIGFuZCB0aGUgbmV3IHJhdyBhdWRpbyBsYXlvdXQgZmllbGQKKworMjAxMi0wMS0wNCAxMTowMjo0MyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWlpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSAgYXVkaW9meDogUG9ydCB0byB0aGUgbmV3IG11bHRpY2hhbm5lbCBjYXBzIGFuZCB0aGUgbmV3IHJhdyBhdWRpbyBsYXlvdXQgZmllbGQKKworMjAxMi0wMS0wNCAxMDo1NDo0NiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkgIG9zczogUG9ydCB0byB0aGUgbmV3IG11bHRpY2hhbm5lbCBjYXBzIGFuZCB0aGUgcmF3IGF1ZGlvIGNhcHMgaW50ZXJsZWF2ZWQgZmllbGQKKworMjAxMi0wMS0wNCAxMDoyNzowOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSAgcHVsc2U6IFBvcnQgdG8gdGhlIG5ldyBtdWx0aWNoYW5uZWwgY2FwcworCisyMDEyLTAxLTA0IDE5OjUxOjQ2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDc2MmI2OTIgdG8gMDgwNzE4NworCisyMDEyLTAxLTA0IDE3OjU5OjU1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIHRlc3RzOiBmaXggc29tZSBsZWFrcyBhbmQgcmVtb3ZlIGZpbGVzIHdoZW4gZG9uZSBpbiBxdG11eCB0ZXN0CisKKzIwMTEtMTItMTQgMTA6MTQ6MjAgKzAxMDAgIFBldGVyIFNlaWRlcmVyIDxwcy5yZXBvcnRAZ214Lm5ldD4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICBtdWx0aWZpbGVzaW5rOiBwb3N0IGJldHRlciBlcnJvciBtZXNzYWdlIHdoZW4gd2UgcnVuIG91dCBvZiBkaXNrIHNwYWNlCisJICBNYXAgd3JpdGUgZXJybm8gRU5PU1BDIHRvIEdTVF9SRVNPVVJDRV9FUlJPUl9OT19TUEFDRV9MRUZULgorCisyMDEyLTAxLTA0IDEzOjI2OjQ1ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FscGhhY29sb3IuYzoKKwkgIGFscGhhY29sb3I6IE1vcmUgZml4ZXMvY2xlYW51cAorCisyMDEyLTAxLTA0IDEzOjI1OjQwICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogUmVmYWN0b3IgcGFyYW0vcHJvY2VzcyBmdW5jdGlvbnMKKwkgIFdoZW4gOjpzZXRfaW5mbygpIGlzIGNhbGxlZCwgdGhlIGlucHV0L291dHB1dCBWaWRlb0luZm8gYXJlbid0IHNldAorCSAgeWV0IG9uIHRoZSB2aWRlb2ZpbHRlci4KKworMjAxMi0wMS0wNCAxMDowMTo0OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6CisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJICBHU1RfRkxPV19VTkVYUEVDVEVEIC0+IEdTVF9GTE9XX0VPUworCisyMDExLTEyLTMxIDIzOjMzOjMzIC0wNTAwICBNYXRlaiBLbm9wcCA8bWF0ZWoua25vcHBAZ21haWwuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJICBkY2FwYXJzZTogdXNlIHJpZ2h0IHZhcmlhYmxlCisJICBGaXhlcyB1c2Ugb2YgdW5pdGlhbGl6ZWQgdmFyaWFibGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY3MDg1CisKKzIwMTItMDEtMDMgMTU6MjY6MjEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlzdWJ0aXRsZS5jOgorCSogZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIEdTVF9GTE9XX1VORVhQRUNURUQgLT4gR1NUX0ZMT1dfRU9TCisKKzIwMTItMDEtMDMgMTQ6NDI6MjggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy90YWdzY2hlY2tpbmcuYzoKKwkgIHRlc3RzOiByZXdyaXRlIHRlc3QgYSBsaXR0bGUKKwkgIFJld3JpdGUgdGhlIHRhZyBjaGVjayBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gZGVhbCB3aXRoIHRhZyBsaXN0cy4KKworMjAxMi0wMS0wMyAxNDoxNjoyOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9qcGVnZW5jLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWx0aWZpbGUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW5fYnVmZmVyX2xpc3QuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc2hhcGV3aXBlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc2luay5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2ZpbHRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMveTRtZW5jLmM6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jOgorCSAgdGVzdHM6IG1ha2UgbW9yZSB0ZXN0cyBjb21waWxlCisKKzIwMTItMDEtMDMgMTE6NTY6MjUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZXF1YWxpemVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9mbGFjcGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsdmRlbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ljeWRlbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbWFnZWZyZWV6ZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW50ZXJsZWF2ZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnbGltaXRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmd2b2x1bWUuYzoKKwkgIHRlc3Q6IG1ha2UgbW9yZSB1bml0IHRlc3RzIGNvbXBpbGUKKworMjAxMi0wMS0wMyAxMDoyNjo0OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2ZpcmZpbHRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9paXJmaWx0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvaW52ZXJ0LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jYmFuZC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW93c2luY2xpbWl0LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdXRvZGV0ZWN0LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdmltdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aXN1YnRpdGxlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jYXBzc2V0dGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZGVpbnRlcmxlYXZlLmM6CisJKiB0ZXN0cy9jaGVjay9nZW5lcmljL2luZGV4LmM6CisJKiB0ZXN0cy9jaGVjay9nZW5lcmljL3N0YXRlcy5jOgorCSAgdGVzdHM6IGZpeCBzb21lIHVuaXQgdGVzdHMKKwkgIFJlbW92ZSB1bml0IHRlc3QgZm9yIEdzdEluZGV4LgorCSAgTWFrZSBzb21lIG90aGVyIHVuaXQgdGVzdHMgY29tcGlsZQorCisyMDEyLTAxLTAyIDE0OjMyOjQwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BleHQuYzoKKwkgIGF1dG9kZXRlY3QsIHJ0c3A6IGdzdF9yZWdpc3RyeV9nZXRfZGVmYXVsdCgpIC0+IGdzdF9yZWdpc3RyeV9nZXQoKQorCisyMDExLTEyLTMxIDEwOjAwOjQxICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy92NGwyL2NhbWN0cmwuYzoKKwkgIGNvbnRyb2xsZXI6IHBvcnQgdG8gQVBJIGNoYW5nZXMKKworMjAxMS0xMi0zMCAxNzo0MTo0NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2E6IHVwZGF0ZSBmb3IgR3N0SW5kZXggcmVtb3ZhbAorCisyMDExLTEyLTMwIDE3OjIzOjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IHVwZGF0ZSBmb3IgR3N0SW5kZXggcmVtb3ZhbAorCisyMDExLTEyLTMwIDE3OjIwOjU3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkqIGdzdC9mbHYvZ3N0aW5kZXguYzoKKwkqIGdzdC9mbHYvZ3N0aW5kZXguaDoKKwkqIGdzdC9mbHYvZ3N0bWVtaW5kZXguYzoKKwkgIGZsdmRlbXV4OiB1cGRhdGUgZm9yIEdzdEluZGV4IHJlbW92YWwKKwkgIEFkZCBwcml2YXRlIEdzdE1lbUluZGV4IGZvciBub3cuCisKKzIwMTEtMTItMzAgMTc6MTI6MDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogdXBkYXRlIGZvciBHc3RJbmRleCByZW1vdmFsCisKKzIwMTEtMTItMjcgMjI6NTk6MDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1zaW5rLmM6CisJICB3YXZlZm9ybXNpbms6IGZpeCBjb21waWxlciB3YXJuaW5ncyB3aXRoIE1pbmdXCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY2NDg1CisKKzIwMTEtMTItMjcgMTI6MDY6MTYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSAgdGVzdHM6IG1ha2UgZ2l0IGlnbm9yZSBuZXcgdW5pdCB0ZXN0IGJpbmFyeQorCisyMDExLTEyLTI3IDExOjUwOjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogZml4IHZhbGdyaW5kIHdhcm5pbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjY2NDQKKworMjAxMS0xMi0yNyAxMTo0OToxMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc3JjLmM6CisJICB1ZHBzcmM6IGFkZCB1bml0IHRlc3QgdGhhdCBzZW5kcyAwLXNpemUgcGFja2V0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY2NjQ0CisKKzIwMTEtMTItMjEgMTM6MjI6MDMgKzAxMDAgIEpvaG4gT2duZXNzIDxqb2huLm9nbmVzc0BsaW51dHJvbml4LmRlPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBkcm9wIGRhdGFsZXNzIFVEUCBwYWNrZXRzCisJICBJdCBpcyBhbGxvd2VkIHRvIHNlbmQvcmVjZWl2ZSBVRFAgcGFja2V0cyB3aXRoIG5vIGRhdGEuIFdoZW4gc3VjaAorCSAgYSBwYWNrZXQgaXMgYXZhaWxhYmxlLCBzZWxlY3QoKSB3aWxsIHJldHVybiB3aXRoIHN1Y2Nlc3MgYnV0CisJICBpb2N0bChGSU9OUkVBRCkgd2lsbCByZXR1cm4gMC4gQnV0IGEgcmVhZCgpIG11c3Qgc3RpbGwgb2NjdXIgaW4KKwkgIG9yZGVyIHRvIGNsZWFyIG9mZiB0aGUgVURQIHBhY2tldCBmcm9tIHRoZSBxdWV1ZS4KKwkgIFRoaXMgcGF0Y2ggd2lsbCByZWFkIHRoZSBkYXRhbGVzcyBwYWNrZXQgZnJvbSB0aGUgc29ja2V0LiBJZgorCSAgc2VsZWN0KCkgd2FzIHdva2VuIGZvciBvdGhlciByZWFzb25zIChhbmQgRklPTlJFQUQgcmV0dXJucyAwKSwKKwkgIHRoaXMgbWF5IHJlc3VsdCBpbiBhIFVEUCBwYWNrZXQgZ2V0dGluZyBhY2NpZGVudGFsbHkgZHJvcHBlZC4KKwkgIEJ1dCBzaW5jZSBVRFAgaXMgbm90IHJlbGlhYmxlLCB0aGlzIGlzIGFjY2VwdGFibGUuCisJICBOT1RFOiBUaGlzIHBhdGNoIGZpeGVzIGEgbmFzdHkgYnVnIHdoZXJlIHNlbmRpbmcgYSBkYXRhbGVzcworCSAgVURQIHBhY2tldCB0byBhIHVkcHNyYyBpbnN0YW5jZSB3aWxsIGNhdXNlIGFuIGluZmluaXRlCisJICBsb29wLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NjY0NAorCSAgU2lnbmVkLW9mZi1ieTogSm9obiBPZ25lc3MgPGpvaG4ub2duZXNzQGxpbnV0cm9uaXguZGU+CisKKzIwMTEtMTItMjYgMjI6MjI6NTkgKzAwMDAgIFlhYWtvdiBTZWxrb3dpdHogPHlzZWxrb3dpdHpAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBzeXMvTWFrZWZpbGUuYW06CisJKiBzeXMvd2F2ZWZvcm0vTWFrZWZpbGUuYW06CisJICB3YXZlZm9ybTogYWRkIGF1dG90b29scyBiaXRzIGZvciB3YXZlZm9ybSBwbHVnaW4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjY0ODUKKworMjAxMS0xMi0yMSAyMDo1MDoyMSArMDEwMCAgTmljb2xhIE11cmlubyA8bmljb2xhLm11cmlub0BnbWFpbC5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGZpeCBwZWVyX2NhcHMgbGVhaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NjY4OAorCisyMDExLTEyLTI1IDIzOjUyOjQ2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiByZW1vdmUgdW5uZWNlc3NhcnkgY2hlY2sgZm9yIGdkcCBsaWJyYXJ5CisKKzIwMTEtMTItMjUgMjI6MTc6NTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBleHQvcHVsc2UvTWFrZWZpbGUuYW06CisJKiBleHQvcHVsc2UvcGx1Z2luLmM6CisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkgIHB1bHNlOiByZW1vdmUgcHVsc2VhdWRpb3NpbmsgaGVscGVyIGJpbgorCSAgVGhpcyBpcyBjYXVzaW5nIHVzIGxvdHMgb2YgaGVhZGFjaGVzIGluIDAuMTAgYW5kIG5lZWRzIHRvIGJlIGRvbmUKKwkgIGRpZmZlcmVudGx5IGFuZCBwcm9wZXJseSBpbiAwLjExLiBwbGF5YmluIG9yIGRlY29kZWJpbiBzaG91bGQKKwkgIHJlY29uZmlndXJlIHRoZW1zZWx2ZXMgYmFzZWQgb24gcmVjb25maWd1cmUgZXZlbnRzLCBmb3IgZXhhbXBsZS4KKworMjAxMS0xMi0yNSAyMTo0NTo0NSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkgIHB1bHNlOiB1cGRhdGUgZm9yIHJpbmcgYnVmZmVyIGF1ZGlvIGZvcm1hdCB0eXBlIGVudW0gcmVuYW1lCisKKzIwMTEtMTItMjUgMjA6MzQ6NTIgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jOgorCSAgY29udHJvbGxlcjogcG9ydCB0byBuZXcgY29udHJvbCBzb3VyY2UgYXBpCisKKzIwMTEtMTItMjUgMTQ6MjM6MjkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBkb24ndCB0cnkgdG8gcHVzaCBhbHJlYWR5LWZyZWVkIGJ1ZmZlcnMKKwkgIEZpeGVzIHVuaXQgdGVzdC4KKworMjAxMS0xMi0yNCAxMDo1Nzo0MiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IFVzZSBzY2FsZV9jZWlsKCkgZnVuY3Rpb25zIGZyb20gY29yZSBpbnN0ZWFkIG9mIGN1c3RvbSBvbmVzCisKKzIwMTEtMTItMjEgMjM6NTE6MDMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmg6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuaDoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdG5hdmlnYXRpb250ZXN0LmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZpZ2F0aW9udGVzdC5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmg6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmg6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmg6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0b3AuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RyZXYuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdHJpcHBsZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmg6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmg6CisJKiBnc3QvZWZmZWN0di9nc3RzdHJlYWsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHN0cmVhay5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5oOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuaDoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuaDoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaDoKKwkgIHVwZGF0ZSBmb3IgdmlkZW9maWx0ZXIgY2hhbmdlcy4KKworMjAxMS0xMi0yMSAxNzo0MzoxMCArMDEwMCAgQnJhbmtvIFN1YmFzaWMgPGJyYW5rb0BheGlzLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkgIG1hdHJvc2thZGVtdXg6IGRvIG5vdCBjb25zaWRlciBkdXJhdGlvbiBvZiBub24tZmluYWxpemVkIGZpbGUKKwkgIC4uLiB0byBhdm9pZCBpdCBjbGFtcGluZyByZXF1ZXN0ZWQgc2VlayBwb3NpdGlvbi4KKwkgIE5vbi1maW5hbGl6ZWQgZmlsZSBjYXNlLCBkZXRlcm1pbmVkIGJ5IHdoZXRoZXIKKwkgIF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrIGV2ZXIgdXBkYXRlcyB0aGUgc2VnbWVudCBkdXJhdGlvbi4KKwkgIEZpeGVzICM2NTIxOTUuCisKKzIwMTEtMTItMjEgMTU6MDY6NTcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGltcHJvdmUgZGVjaXNpb24gdG8gZmFsbCBiYWNrIHRvIHNjYW5uaW5nIHdoZW4gc2Vla2luZworCSAgLi4uIHdoaWNoIGlzIGJhc2ljYWxseSBpZmYgbm90IHN0cmVhbWluZyBhbmQgbm8gZW50cnkgZm91bmQgaW4gaW5kZXgKKworMjAxMS0xMi0yMSAwOTowOToyNyArMDEwMCAgT2xla3NpaiBSZW1wZWwgKEFsZXhleSBGaXNoZXIpIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFjM3BhcnNlOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlCisJICByZW1vdmUgdW51c2VkIHZhcmlhYmxlIHRvIGZpeCBjb21waWxlIGVycm9yOgorCSAgbWFrZSAtQyBhdWRpb3BhcnNlcnMKKwkgIG1ha2VbM106IEJldHJldGUgVmVyemVpY2huaXMgJy9ob21lL2xleC90bXAvZ3N0LXBsdWdpbnMtZ29vZC9nc3QvYXVkaW9wYXJzZXJzJworCSAgQ0MgICAgIGxpYmdzdGF1ZGlvcGFyc2Vyc19sYS1nc3RhYWNwYXJzZS5sbworCSAgZ3N0YWFjcGFyc2UuYzogSW4gZnVuY3Rpb24gJ2dzdF9hYWNfcGFyc2VfcmVhZF9sb2FzX2F1ZGlvX3NwZWNpZmljX2NvbmZpZyc6CisJICBnc3RhYWNwYXJzZS5jOjQ0NjoxMjogZXJyb3I6IHZhcmlhYmxlICdzYnInIHNldCBidXQgbm90IHVzZWQgWy1XZXJyb3I9dW51c2VkLWJ1dC1zZXQtdmFyaWFibGVdCisJICBjYzE6IGFsbCB3YXJuaW5ncyBiZWluZyB0cmVhdGVkIGFzIGVycm9ycworCSAgU2lnbmVkLW9mZi1ieTogT2xla3NpaiBSZW1wZWwgKEFsZXhleSBGaXNoZXIpIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKzIwMTEtMTItMjEgMTE6NTk6NDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZW1peGVyLmM6CisJKiBleHQvcHVsc2UvcHVsc2Vwcm9iZS5oOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwycmFkaW8uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9wdWxzZS9wdWxzZS5jOgorCSogdGVzdHMvZXhhbXBsZXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvcHJvYmUuYzoKKwkgIHVwZGF0ZSBmb3IgcmVtb3ZlZCBwcm9wZXJ0eSBwcm9iZQorCisyMDExLTA5LTA5IDExOjQyOjA5ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IGxldCBic2lkIDkgYW5kIDEwIHRocm91Z2gKKwkgIEZpbGVzIHdpdGggOSBhbmQgMTAgaGFwcGVuLCBhbmQgc2VlbSB0byBjb21wbHkgd2l0aCB0aGUgPD0gOAorCSAgZm9ybWF0LCBzbyBsZXQgdGhlbSB0aHJvdWdoLgorCSAgVGhlIHNwZWMgc2F5cyBub3RoaW5nIGFib3V0IDkgYW5kIDEwLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1ODU0NgorCisyMDExLTEyLTE5IDIzOjUwOjE5ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy92NGwyL2NhbWN0cmwuYzoKKwkgIGNvbnRyb2xsZXI6IHBvcnQgdG8gbmV3IGludGVycG9sYXRpb24tbW9kZSBhcGkKKworMjAxMS0xMi0xOSAyMjo1Mzo1NyArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvZXhhbXBsZXMvdjRsMi9jYW1jdHJsLmM6CisJICBjb250cm9sbGVyOiBwb3J0IHRvIG5ldyBjb250cm9sbGVyIGFwaQorCisyMDExLTEyLTE5IDE5OjAzOjUyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogdXBkYXRlIGZvciBuZXcgaW50ZXJsYWNlZCBjYXBzCisKKzIwMTEtMTItMTYgMTk6MTU6MzggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBwcm9wZXJseSBkZXRlcm1pbmUgZmluYWwgZHVyYXRpb24KKwkgIC4uLiB3aGljaCBjYW4gYmUgYXV0aG9yYXRpdmVseSBvYnRhaW5lZCBmcm9tIG91ciBvd24gd3JpdHRlbiB0aW1lc3RhbXBzLgorCisyMDExLTEyLTE5IDEzOjU2OjMwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogb25seSB3cml0ZSBmdWxsIG1ldGFkYXRhIGF0IHN0YXJ0CisJICAuLi4gcmF0aGVyIHRoYW4gaGF2aW5nIChwb3RlbnRpYWxseSkgdW5uZWNlc3NhcnkgZHVwbGljYXRlcyB3cml0dGVuIGFsbCBvdmVyLAorCSAgb3IgZXZlbiBjb250cmFkaWN0b3J5IHZhcnlpbmcgZmlsZXNpemUgaW5mbywgb3IgZHVyYXRpb24gaW5mbyB0aGF0IHdpbGwgbm90CisJICBiZSByZXdyaXR0ZW4gdXBvbiBoZWFkZXIgcmV3cml0ZS4KKworMjAxMS0xMi0xNiAxOToxNTowMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IHVzZSBHc3RDb2xsZWN0UGFkczIgYnVmZmVyIGNhbGxiYWNrIGFuZCBydW5uaW5nIHRpbWUgY2xpcHBlcgorCSAgLi4uIHNpbmNlIHRoZSBkZWZhdWx0IGNvbGxlY3Rpb24gaGV1cmlzdGljcyBzdWZmaWNlLgorCisyMDExLTEyLTE2IDE4OjAzOjAxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHVzZSBHc3RDb2xsZWN0UGFkczIgYnVmZmVyIGNhbGxiYWNrIGFuZCBydW5uaW5nIHRpbWUgY2xpcHBlcgorCSAgLi4uIHNpbmNlIGRlZmF1bHQgY29sbGVjdGlvbiBoZXVyaXN0aWNzIHN1ZmZpY2UuCisKKzIwMTEtMTItMTYgMTc6MjA6NTEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogYnJpbmcgYSBmZXcgZGVidWcgc3RhdGVtZW50cyB1cCB0byBzcGVjcworCSAgLi4uIGFuZCBtaW5vciBzcGVsbGluZyBmaXguCisKKzIwMTEtMTItMTYgMTY6NTY6MzcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogYWRkaXRpb25hbCBzdWJ0aXRsZSBzdXBwb3J0CisKKzIwMTEtMTItMTUgMjE6NTA6NDIgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJICBtYXRyb3NrYW11eDogYWRkaXRpb25hbCBidWZmZXIgaGFuZGxpbmcgY2xlYW51cAorCisyMDExLTEyLTE1IDIxOjQ1OjE3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHVzZSBHc3RDb2xsZWN0UGFkczIgYnVmZmVyIGNhbGxiYWNrIGFuZCBydW5uaW5nIHRpbWUgY2xpcHBlcgorCisyMDExLTEyLTA3IDEzOjI0OjU1ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5oOgorCSAgYWFjcGFyc2U6IHBhcnNlIExPQVMgdmFyaWFudAorCSAgVGhlIExPQVMgdmFyaWFudCBzZWVtcyB0byBoYXZlIHRocmVlIGRpZmZlcmVudCBzdWJ2YXJpYW50cyBpdHNlbGYsCisJICBvbmx5IG9uZSBvZiB0aGVtIGlzIGltcGxlbWVudGVkIGFzIG15IHR3byBzYW1wbGVzIGhhcHBlbiB0byBiZQorCSAgdXNpbmcgdGhhdCBvbmUuCisJICBUaGUgc2FtcGxlIHJhdGUgaXMgbm90IGFsd2F5cyByZXBvcnRlZCBjb3JyZWN0bHksIGFzIHRoZSAibWFpbiIKKwkgIHNhbXBsZSByYXRlIGlzIGFwcGFyZW50bHkgc29tZXRpbWVzIGhhbGYgd2hhdCBpdCBzaG91bGQgYmUgKGJvdGgKKwkgIG9mIG15IHNhbXBsZXMgcmVwb3J0IDI0MDAwIEh6IHRoZXJlKSwgYW5kIHRoZXJlIGFyZSB0d28gb3RoZXIKKwkgIHBhcnRzIG9mIHRoZSBzdWJ2YXJpYW50IHdpdGggZGlmZmVyZW50IHNhbXBsaW5nIHJhdGVzLiBPbmUgb2YgdGhlbQorCSAgaXMgcGFyc2VkLCBidXQgbm90IHRoZSBvdGhlciwgYXMgaXQncyBsb2NhdGVkIGFmdGVyIHNvbWUgb3RoZXIKKwkgIGxhcmdlIGFtb3VudCBvZiB2YXJpYWJsZSBkYXRhIHRoYXQgbmVlZHMgcGFyc2luZyBmaXJzdCwgYW5kIHRoZXJlCisJICBzZWVtcyB0byBiZSBhIExPVCBvZiBpdCwgd2hpY2ggaXMgdXNlbGVzcyBmb3Igb3VyIG5lZWRzIGhlcmUuCisJICBUaGlzIGVuZHMgdXAgYmVpbmcgcmF0aGVyIGluY29uc2VxdWVudGlhbCwgYXMgZmZkZWNfYWFjX2xhdG0sCisJICB3aGljaCBpcyB0aGUgb25seSBkZWNvZGVyIHRoYXQgY2FuIGRlY29kZSBzdWNoIHN0cmVhbXMsIGRvZXMgbm90CisJICBuZWVkIHRoZSBzYW1wbGUgcmF0ZSBvbiB0aGUgY2FwcyBhbnl3YXkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY1Mzk0CisKKzIwMTEtMTItMTkgMTA6NDg6NTQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IGRvbid0IHJlbW92ZSBzcmNwYWQKKwkgIERvbid0IHJlbW92ZSB0aGUgYWx3YXlzIHNyY3BhZCBpbiByZWFkeSBhbmQgbWFrZSB0aGUgZWxlbWVudCByZXVzYWJsZS4KKworMjAxMS0xMi0xNSAxNjo0MDoyMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5oOgorCSAgZmx2bXV4OiB1c2UgR3N0Q29sbGVjdFBhZHMyIGV2ZW50IGNhbGxiYWNrCisJICAuLi4gaW4gc3RlYWQgb2YgbG9jYWwgSEFDSy4KKworMjAxMS0xMi0xNSAxNjozMDoxNyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgIG1hdHJvc2thbXV4OiB1c2UgR3N0Q29sbGVjdFBhZHMyIGV2ZW50IGNhbGxiYWNrCisJICAuLi4gaW4gc3RlYWQgb2YgbG9jYWwgSEFDSy4KKworMjAxMS0xMi0xNSAxNjoxNjo1MiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5oOgorCSAgYXZpbXV4OiB1c2UgR3N0Q29sbGVjdFBhZHMyIGV2ZW50IGNhbGxiYWNrCisJICAuLi4gaW4gc3RlYWQgb2YgbG9jYWwgSEFDSy4KKworMjAxMS0xMi0xNSAxNjoxNToyMiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiB1c2UgR3N0Q29sbGVjdFBhZHMyIGV2ZW50IGNhbGxiYWNrCisJICAuLi4gaW4gc3RlYWQgb2YgbG9jYWwgSEFDSy4KKworMjAxMS0xMi0xNCAxOToxMzoyMSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmg6CisJICBzbXB0ZTogcG9ydCB0byBHc3RDb2xsZWN0UGFkczIKKworMjAxMS0xMi0xNCAxOToxMDo1MyArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5oOgorCSAgbXVsdGlwYXJ0bXV4OiBwb3J0IHRvIEdzdENvbGxlY3RQYWRzMgorCisyMDExLTEyLTE0IDE5OjA3OjIzICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgbWF0cm9za2FtdXg6IHBvcnQgdG8gR3N0Q29sbGVjdFBhZHMyCisKKzIwMTEtMTItMTQgMTk6MDI6MjMgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4Lmg6CisJICBxdG11eDogcG9ydCB0byBHc3RDb2xsZWN0UGFkczIKKworMjAxMS0xMi0xNCAxODo1NTozNiArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuaDoKKwkgIGludGVybGVhdmU6IHBvcnQgdG8gR3N0Q29sbGVjdFBhZHMyCisKKzIwMTEtMTItMTQgMTg6NTI6MzcgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguaDoKKwkgIGZseG11eDogcG9ydCB0byBHc3RDb2xsZWN0UGFkczIKKworMjAxMS0xMi0xNCAxODozODowOSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5oOgorCSAgYXZpbXV4OiBwb3J0IHRvIEdzdENvbGxlY3RQYWRzMgorCisyMDExLTEyLTE0IDE4OjM0OjI1ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuaDoKKwkgIGNhaXJvdGV4dG92ZXJsYXk6IHBvcnQgdG8gR3N0Q29sbGVjdFBhZHMyCisKKzIwMTEtMTItMTMgMTg6MTg6NDUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIG1hdHJvc2thZGVtdXg6IGZpbHRlciBib2d1cyBpbmRleCBlbnRyaWVzIHdpdGggbWlzc2luZyBibG9jayBudW1iZXIKKwkgIC4uLiB0byBhdm9pZCBjb250cmFkaWN0b3J5IGluZm9ybWF0aW9uIHJlc3VsdGluZyBpbiBzZWVrcyBzZW5kaW5nIG1vcmUKKwkgIGRvd25zdHJlYW0gdGhhbiBuZWVkZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHNlZ21lbnQuCisKKzIwMTEtMTItMTMgMTg6MTU6MTggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGNhdGVyIGZvciBzYWZlciBhcml0aG1ldGljIHdpdGggZ2xvYmFsIHN0YXJ0IHRpbWUKKworMjAxMS0xMi0xMyAxNzowMjowMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogdHdlYWsgZmluYWwgY2xvc2luZyBzZWdtZW50IHNlbmRpbmcKKwkgIC4uLiB0byBhdm9pZCBpdCBpbnRlcmZlcmluZyB3aXRoIChzcGFyc2UpIHN0cmVhbSBzeW5jaW5nLgorCisyMDExLTEyLTEyIDExOjUxOjA2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBtYWtlIGRlYnVnIG1lc3NhZ2UgbW9yZSB1c2VmdWwKKwkgIEFkZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFnbGlzdCBhbmQgd2hpY2ggcGFkIHJlY2VpdmVkIHRoZQorCSAgdGFnIGV2ZW50IG9uIHRoZSBkZWJ1ZyBsb2dnaW5nLgorCisyMDExLTEyLTEzIDExOjQ2OjQzICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogYXZvaWQgdXNpbmcgZmxvYXRpbmcgcG9pbnQgdW5uZWNlc3NhcmlseQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NTkxMQorCisyMDExLTEyLTEzIDExOjQyOjQwICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogZml4IGZvcm1hdCBzcGVjaWZpZXIgc2lnbmVkbmVzcworCSAgVXNlIHVuc2lnbmVkIHNwZWNpZmllcnMgZm9yIGFsbCB1bnNpZ25lZCB2YWx1ZXMuCisJICBBIGxvdCBvZiB0aGUgdmFsdWVzIHVzZWQgaGVyZSBhcmUgdW5zaWduZWQsIGFuZCBzb21lIGNhbiB0YWtlCisJICBoaWdoIGVub3VnaCB2YWx1ZXMgdGhhdCB0aGVpciBzaWduZWQgY291bnRlcnBhcnQgd2lsbCBiZSBuZWdhdGl2ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjU5MTEKKworMjAxMS0xMi0xMiAxNjo0OToxOSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICB3YXZwYXJzZTogYWRkIGEgaWdub3JlLWxlbmd0aCBwcm9wZXJ0eQorCSAgVGhpcyBhbGxvd3MgcGxheWluZyBicm9rZW4gc3RyZWFtcyB3aGljaCB3cml0ZSBhbiBpbmNvcnJlY3QKKwkgIGxlbmd0aCBpbiB0aGVpciBkYXRhIGNodW5rcyAoc3VjaCBhcywgYXQgbGVhc3QsIG9uZSBzdHJlYW1pbmcKKwkgIGNhbWVyYSkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY1OTExCisKKzIwMTEtMTItMTIgMTE6NTQ6NTYgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QtbGlicy9nc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oOgorCSAgZ2xpYi1jb21wYXQ6IEFkZCBsaWNlbnNlIGJvaWxlcnBsYXRlIGZvciBMR1BMCisKKzIwMTEtMTItMTIgMTU6MTU6NDYgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IG1pbmQgKHVuKXNpZ25lZCBpbiBzb21lIHRpbWVzdGFtcCBhcml0aG1ldGljCisJICAuLi4gdG8gYXZvaWQgZW5kaW5nIHVwIHdpdGggaW52YWxpZCAobmVnYXRpdmUpIGR1cmF0aW9uLgorCisyMDExLTAyLTA5IDE1OjMxOjIyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBpbmNyZWFzZSBwYXJzZSB0b2xlcmFuY2UgZm9yIGZ1enp5IGZpbGUgY2FzZXMKKworMjAxMS0xMi0xMiAxMDozODoyMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIE1ha2VmaWxlLmFtOgorCSAgYnVpbGQ6IGRpc3QgZ2xpYi1jb21wYXQtcHJpdmF0ZS5oIHByb3Blcmx5CisJICBBZGQgbWlzc2luZyBzbGFzaC4KKworMjAxMS0xMi0xMiAxMDoxODoxNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJICB0ZXN0czogdXNlIGF0ZXhpdCwgZ19hdGV4aXQgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBnbGliIG1hc3RlcgorCisyMDExLTEyLTEyIDAyOjUyOjEzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bW9vdnJlY292ZXIuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIFN1cHByZXNzIGRlcHJlY2F0aW9uIHdhcm5pbmdzIGluIHNlbGVjdGVkIGZpbGVzLCBmb3IgZ19zdGF0aWNfcmVjX211dGV4XyogbW9zdGx5CisJICBHU3RhdGljUmVjTXV0ZXggaXMgcGFydCBvZiBvdXIgQVBJL0FCSSwgbm90IG11Y2ggd2UgY2FuIGRvIGhlcmUKKwkgIGluIDAuMTAgZm9yIG1vc3Qgb2YgdGhlc2UuCisKKzIwMTEtMTItMTIgMDI6NDE6MzcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSogdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYzoKKwkqIHRlc3RzL2ljbGVzL2dka3BpeGJ1ZnNpbmstdGVzdC5jOgorCSogdGVzdHMvaWNsZXMvdGVzdC1vc3M0LmM6CisJKiB0ZXN0cy9pY2xlcy92aWRlb2Nyb3AtdGVzdC5jOgorCSAgdGVzdHM6IGdfdGhyZWFkX2luaXQoKSBpcyBkZXByZWNhdGVkIGluIGdsaWIgbWFzdGVyCisJICBJdCdzIG5vdCBuZWVkZWQgYW55IGxvbmdlci4KKworMjAxMS0xMi0xMiAwMjozODozNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogc3lzL29zczQvb3NzNC1taXhlci5jOgorCSogdGVzdHMvaWNsZXMvdjRsMnNyYy10ZXN0LmM6CisJICBVc2UgZ190aHJlYWRfdHJ5X25ldygpIGluc3RlYWQgb2YgZ190aHJlYWRfY3JhdGUoKSB3aXRoIG5ld2VyIGdsaWIgdmVyc2lvbnMKKworMjAxMS0xMi0xMiAwMjozMTozNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmg6CisJICBhbHBoYTogdXNlIG5ldyBnbGliIEFQSSBmb3Igc3RhdGljIG11dGV4IGlmIGF2YWlsYWJsZQorCisyMDExLTEyLTEyIDAyOjMwOjQ1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogTWFrZWZpbGUuYW06CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9jbGllbnQuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJKiBnc3QtbGlicy9nc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICBXb3JrIGFyb3VuZCBkZXByZWNhdGVkIHRocmVhZCBBUEkgaW4gZ2xpYiBtYXN0ZXIKKwkgIEFkZCBwcml2YXRlIHJlcGxhY2VtZW50cyBmb3IgZGVwcmVjYXRlZCBmdW5jdGlvbnMgc3VjaCBhcworCSAgZ19tdXRleF9uZXcoKSwgZ19tdXRleF9mcmVlKCksIGdfY29uZF9uZXcoKSBldGMuLCBtb3N0bHkKKwkgIHRvIGF2b2lkIHRoZSBkZXByZWNhdGlvbiB3YXJuaW5ncy4gV2UnbGwgY2hhbmdlIHRoZXNlCisJICBvdmVyIHRvIHRoZSBuZXcgQVBJIG9uY2Ugd2UgZGVwZW5kIG9uIGdsaWIgPj0gMi4zMi4KKworMjAxMS0xMi0xMiAxMDoyNDo0NSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogUmVxdWlyZSBHTGliID49IDIuMjQKKwkgIEFsbCBvdGhlciBtb2R1bGVzIHJlcXVpcmUgdGhpcyBhbHJlYWR5IGFuZCBub2JvZHkgaXMgdGVzdGluZyB3aXRoCisJICBvbGRlciB2ZXJzaW9ucyBhbnl3YXkuCisKKzIwMTEtMTItMTEgMTg6NDA6MzEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmM6CisJICBnZGtwaXhidWZzaW5rOiBmaXggaW52ZXJ0ZWQgcGl4ZWwtYXNwZWN0LXJhdGlvCisJICBTcG90dGVkIGJ5IE1pa2UgTW9ycmlzb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY1ODgyCisKKzIwMTEtMTItMTEgMTc6NTU6MTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkgIHB1bHNlYXVkaW9zaW5rOiBkb24ndCBsZWFrIHBhZCB0ZW1wbGF0ZQorCisyMDExLTEyLTEwIDE0OjQ4OjU3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJICBzb3VwOiBmaXggc3RhcnQvc3RvcCByYWNlIGluIHNvdXBodHRwY2xpZW50c2luaworCSAgRml4IGNyYXNoIG9yIGhhbmcgaW4gZ2VuZXJpYy9zdGF0ZXMgdW5pdCB0ZXN0IHdoZW4gZG9pbmcgc3RvcCgpCisJICByaWdodCBhZnRlciBzdGFydCgpLiBDcmVhdGUgbWFpbiBsb29wIGluIHRoZSBzdGFydCBmdW5jdGlvbiBhbHJlYWR5CisJICBhbmQgbm90IGp1c3QgaW4gdGhlIHRocmVhZCBmdW5jdGlvbiwgc28gdGhhdCBzdG9wKCkgYWx3YXlzIGhhcyBhCisJICB2YWxpZCBtYWluIGxvb3AgdG8gcXVpdCBvbi4gQWxzbywgY2FsbGluZyBnX21haW5fbG9vcF9xdWl0KCkgYmVmb3JlCisJICBnX21haW5fbG9vcF9ydW4oKSB3b24ndCB3b3JrIGFuZCByZXN1bHQgaW4gdGhlIHN0b3AgZnVuY3Rpb24gd2FpdGluZworCSAgZm9yIHRoZSB0aHJlYWQgdG8gam9pbiBmb3JldmVyLiBUaGVyZWZvcmUsIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8KKwkgIGJlIHJlYWR5IGFuZCBnZXQgdGhlIG1haW4gbG9vcCBydW5uaW5nIGluIHRoZSBzdGFydCgpIGZ1bmN0aW9uLCB0bworCSAgYmUgc3VyZSBzdG9wKCkgYWx3YXlzIHdvcmtzLgorCisyMDExLTEyLTEwIDEzOjM1OjA4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvZmlsZXMvTWFrZWZpbGUuYW06CisJICB0ZXN0czogZGlzdCB0ZXN0IGZpbGUgdXNlZCBpbiBtYXRyb3NrYXBhcnNlIHVuaXQgdGVzdAorCisyMDExLTEyLTEwIDEyOjMyOjMyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmd2b2x1bWUuYzoKKwkgIHRlc3RzOiBmaXggdXAgcmd2b2x1bWUgdGVzdCBmb3IgYmFzZXRyYW5zZm9ybSBldmVudCBjYWNoaW5nCisJICBTb21lIHRlc3RzIGFzc3VtZWQgdGhhdCB0YWcgZXZlbnRzIHdvdWxkIGFsd2F5cyBwdXNoZWQgdGhyb3VnaAorCSAgaW1tZWRpYXRlbHksIHdoaWNoIGlzbid0IHRoZSBjYXNlIGFueSBsb25nZXIsIHNvIHB1c2ggYSBuZXdzZWdtZW50CisJICBldmVudCBhbmQgYW4gZW1wdHkgYnVmZmVyIGZpcnN0LgorCisyMDExLTEyLTEwIDExOjEyOjAxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHNzcmNkZW11eDogZml4IGl0ZXJhdG9yIGFuZCBjYXBzCisKKzIwMTEtMTItMTAgMTE6MTE6MDAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGZvcndhcmQgdGhlIGNhcHMgZXZlbnQKKworMjAxMS0xMi0xMCAxMTowOTo0MyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHNpbXBseSBmb3J3YXJkIHRoZSBjYXBzIGV2ZW50CisJICBmb3J3YXJkIHRoZSBjYXBzIGV2ZW50IHdlIGdldCBhcyBpbnB1dCBpbnN0ZWFkIG9mIG1ha2luZyBhIG5ldyBldmVudCBldGMuLgorCisyMDExLTEyLTA5IDIwOjEwOjE5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBmb3J3YXJkIGNhcHMKKworMjAxMS0xMi0wOSAxOTo0NjowMiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwOiBwYXNzIHBhcmVudCB0byBzZXRjYXBzIG1ldGhvZHMKKworMjAxMS0xMi0xMCAwMjoyMTowMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL0xJTkdVQVM6CisJKiBwby9lby5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHYucG86CisJKiBwby9zci5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTEtMTItMDkgMTY6MDQ6NTYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlOiByZW5hbWUgImNsaWVudCIgcHJvcGVydGllcyB0byAiY2xpZW50LW5hbWUiCisJICBCZXR0ZXIgbmFtZSwgYnV0IGFsc28gbWF0Y2hlcyB0aGUgcHJvcGVydHkgb24gdGhlIGphY2sKKwkgIGVsZW1lbnRzICh3aGVyZSAiY2xpZW50IiBpcyB1c2VkIGZvciBzb21ldGhpbmcgZWxzZSkuCisKKzIwMTEtMTItMDkgMTU6NTA6MjggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IGRvbid0IGxlYWsgY2xpZW50IG5hbWUgd2hlbiBmcmVlaW5nIHRoZSBlbGVtZW50CisJICBBbmQgYWRkIGd0ay1kb2MgY2h1bmtzIGZvciB0aGUgbmV3IHByb3BlcnR5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NTg3MgorCisyMDExLTEyLTA5IDE1OjQ1OjAzICswMDAwICBOaWNvbGFzIEJhcm9uIDxob2dnaW5zQHJhZGlvbS5mcj4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5oOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuaDoKKwkgIGphY2s6IGFkZCAiY2xpZW50LW5hbWUiIHByb3BlcnR5IHRvIGphY2thdWRpb3NpbmsgYW5kIGphY2thdWRpb3NyYworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NTg3MgorCisyMDExLTEyLTA5IDEyOjE5OjEzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2xhdy9NYWtlZmlsZS5hbToKKwkgIGxhdzogZml4IENGTEFHUyBhbmQgTElCUyBvcmRlciBpbiBNYWtlZmlsZS5hbQorCisyMDExLTEyLTA5IDEyOjE1OjMwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgcmVtb3RlLXRyYWNraW5nIGJyYW5jaCAnb3JpZ2luL21hc3RlcicgaW50byAwLjExCisKKzIwMTEtMTItMDkgMTA6NTE6MTQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi1tYXJzaGFsLmxpc3Q6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cDogZml4IG1hcnNoYWxsZXJzCisJICBSZW1vdmUgY3VzdG9tIG1hcnNoYWxsZXJzIGZvciBtaW5vYmplY3QuCisJICBJbml0IFJUQ1AgYnVmZmVyIGNvcnJlY3RseS4KKwkgIEhhbmRsZSByZXN1bHRzIGZyb20gc2V0Y2FwcworCSAgUmVtb3ZlIGFzc2VydHMuCisKKzIwMTEtMTItMDkgMTA6NTA6MTggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9sYXcvTWFrZWZpbGUuYW06CisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L2FsYXcuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOgorCSAgbGF3OiBmaXggbmVnb3RpYXRpb24KKworMjAxMS0xMi0wOCAxMTowMDo0NSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBzdHJlYW0tZm9ybWF0PXJhdyBnb2VzIHdpdGggYWFjIGNhcHMsIG5vdCBtcDMgY2FwcworCisyMDExLTEyLTA4IDAxOjI4OjI2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgcmVtb3RlLXRyYWNraW5nIGJyYW5jaCAnb3JpZ2luL21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmMKKworMjAxMS0xMi0wMiAxMjowNzoyNCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IGRvIG5vdCBpZ25vcmUgdGhlIGhpZ2hlc3QgZnJhbWUgaW50ZXJ2YWwKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjUzODcKKworMjAxMS0xMi0wMiAxMTo1OTowMyArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IGRvIG5vdCBpZ25vcmUgdGhlIGxhcmdlc3QgcmVzb2x1dGlvbgorCSAgVGhlICdtYXgnIHZhbHVlIGlzbid0IGFuIFNUTCBzdHlsZSAib25lIGFmdGVyIHRoZSBlbmQiIGJvdW5kLAorCSAgYnV0IHRoZSBsYXJnZXN0IGFsbG93ZWQgdmFsdWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY1Mzg3CisKKzIwMTEtMTItMDYgMTY6NDc6MjUgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oOgorCSAgZG9jczogYWRkIGFkZCB0aGUgdHdvIGVudW0gdmFsdWVzIHRoYXQgd2VyZSBqdXN0IGFkZGVkIHRvbworCisyMDExLTEyLTA2IDE2OjE0OjU0ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oOgorCSAgbXVsdGlmaWxlc2luazogZXhwb3NlIHRoZSBlbnVtIHByb3BlcnR5IGRvY3MgZm9yIHNwbGl0dGluZyBtb2RlLgorCSAgRml4ZXMgIzY2NTY2Ni4KKworMjAxMS0xMi0wNiAxNDoyMzozMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJICBoMjYzcGF5OiBmaXggaW52YWxpZCByZXR1cm4gdmFsdWUKKworMjAxMS0xMi0wNiAxMzo1OTo1MiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcmVtb3ZlIHVudXNlZCBmbHVzaCBwYXJhbQorCisyMDExLTEyLTA1IDE4OjQwOjI2ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5jOgorCSAgcnRweHF0ZGVwYXk6IEluaXRpYWxpemUgR3N0UlRQQnVmZmVyIGJlZm9yZSB1c2FnZQorCisyMDExLTEyLTA1IDE4OjQwOjEyICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwbWFuYWdlcjogSW5pdGlhbGl6ZSBHc3RSVFBCdWZmZXIgYmVmb3JlIHVzYWdlCisKKzIwMTEtMTItMDUgMTg6Mzk6NTkgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkgIHJ0cDogSW5pdGlhbGl6ZSBHc3RSVFBCdWZmZXIgYmVmb3JlIHVzYWdlCisKKzIwMTEtMTItMDUgMTI6MTU6MjEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiByZXBsYWNlIGRlcHJlY2F0ZWQgR1NUX0NMQVNTX0xPQ0sKKworMjAxMS0xMS0yNCAxMzo1ODowMSArMDEwMCAgU2ViYXN0aWFuIFJhc211c3NlbiA8c2Vicm5AYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgcnRwanBlZ3BheTogQ2VpbCBqcGVnIGRpbWVuc2lvbnMsIGluc3RlYWQgb2YgZmxvb3IKKwkgIEEgSlBFRyBpbWFnZSBpbnNpZGUgYW4gUlRQIHN0cmVhbSBoYXMgYSBwcmVjZWVkaW5nIFJGQzI0MzUgaGVhZGVyIHRoYXQKKwkgIGNvbnZleXMgd2lkdGgvaGVpZ2h0LiBUaGUgZGltZW5zaW9ucyBpbiB0aGlzIGhlYWRlciBhcmUgbGltaXRlZCB0byBiZQorCSAgbXVsdGlwbGVzIG9mIDguIFNpbmNlIEpQRUcgdXNlcyBhbiBNQ1Ugb2YgOHg4IHBpeGVscyBhbnkgaW1hZ2UgbXVzdAorCSAgYWxyZWFkeSBpbmRpcmVjdGx5IGhhdmUgaW1hZ2UgZGF0YSBkaW1lbnNpb25zIHRoYXQgYXJlIHJvdW5kZWQgdXAgaW4KKwkgIG9yZGVyIHRvIGNvbnRhaW4gZW5vdWdoIGRhdGEgdG8gcmVuZGVyIHRoZSBpbWFnZS4gVGhlcmVmb3JlIHRoaXMgZml4CisJICBzYWZlbHkgcm91bmRzIHRoZSBpbWFnZSBkaW1lbnNpb25zIGluIHRoZSBSRkMyNDM1IGhlYWRlciB1cCB0byB0aGUKKwkgIGNsb3Nlc3QgbXVsdGlwbGUgb2YgOC4KKworMjAxMS0xMi0wNCAxMjo1MDo1NyArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oOgorCSAgZmxhY3BhcnNlOiBlbnN1cmUgd2Ugb25seSBjaGVjayBmb3Igc2FtcGxlL2Jsb2NrIG1peHVwIGF0IHN0YXJ0CisJICBPdGhlcndpc2Ugd2UgbWlnaHQgdHJpZ2dlciBhdCBzb21lIHBvaW50IHdpdGhpbiB0aGUgZmlsZSwgYnV0IHRoZQorCSAgY2hlY2sgaXMgb25seSBtYWtpbmcgc2Vuc2UgZm9yIHRoZSBzZWNvbmQgYmxvY2suCisKKzIwMTEtMTItMDMgMTg6MTQ6NTkgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thcGFyc2U6IHdhcm4gaWYgYWNjdW11bGF0aW5nIGhlYWRlcnMgYWZ0ZXIgdGhleSB3ZXJlIHB1c2hlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NTQxMgorCisyMDExLTEwLTI1IDEyOjU0OjQzIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJICBtYXRyb3NrYXBhcnNlOiBmaXggcGFyc2luZworCSAgTWFyayBtb3JlIHBhcnRzIGFzIGJlbG9uZ2luZyB0byBzdHJlYW1oZWFkZXJzLgorCisyMDExLTEyLTAzIDE3OjMwOjEwICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IGZpeCBkaXNjb250aW51aXR5IHRocmVzaG9sZCBjaGVjayB3aGVuIHRpbWVzdGFtcHMgZ28gYmFja3dhcmRzCisJICBTaW5jZSB1bnNpZ25lZCB0eXBlcyBhcmUgdXNlZCwgYSBuZWdhdGl2ZSB2YWx1ZSB3b3VsZCBzaG93IGFzIHZlcnksIHZlcnkKKwkgIHBvc2l0aXZlLgorCSAgRml4ZXMgQS9WIHN5bmMgb24gc29tZS4uLiBsZXNzIHRoYW4gd2VsbCBtYWRlIGZpbGVzIHdoZXJlIHRpbWVzdGFtcHMgZ28KKwkgIGJhY2t3YXJkcy4KKworMjAxMS0xMi0wMiAyMjoyNToxNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmM6CisJKiBnc3QvZGVidWd1dGlscy90ZXN0cGx1Z2luLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIHVwZGF0ZSBmb3IgYmFzZXNpbmsgZXZlbnQgaGFuZGxlciBjaGFuZ2VzCisKKzIwMTEtMTItMDIgMTI6MDE6MjIgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyc3JjOiBhZGQgYSBjb21tZW50IGFib3V0IGEgImhpZGRlbiIgYXNzdW1wdGlvbiBvbiByYW5rIHZhbHVlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NTM4NworCisyMDExLTEyLTAyIDAxOjU4OjMwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgcmVtb3RlLXRyYWNraW5nIGJyYW5jaCAnb3JpZ2luL21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbAorCSAgZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmMKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmMKKwkgIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jCisKKzIwMTEtMTItMDEgMTg6NTU6NDUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDNkZW11eC5jOgorCSAgdXBkYXRlIGZvciB0YWcgQVBJIGNoYW5nZXMKKworMjAxMS0xMi0wMSAxNToyOToxNSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogcGxhY2F0ZSBnY2Mgc2luY2UgLVdlcnJvciBpcyB1c2VkCisJICBJbml0aWFsaXplIHZhbHVlcyB0aGF0IEdDQyBjYW5ub3QgcHJvdmUgYXJlIG5vdCB1c2VkIHdpdGhvdXQKKwkgIGJlaW5nIGluaXRpYWxpemVkLCBhbmQgYXNzZXJ0IHRoYXQgSSBkaWQgbm90IG1lc3MgdXAgbXkgcHJvb2YuCisKKzIwMTEtMTItMDEgMTQ6MTM6MDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBmaXggdXAgTElCUyBvcmRlciBzb20gbW9yZWAKKworMjAxMS0xMi0wMSAxMzoyMjo0MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thLW11eDogZml4IG5hbWUgb2YgbmV3IHByb3BlcnR5IGFuZCB0aGUgdW5pdCB0ZXN0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0Mzc5CisKKzIwMTEtMDktMjUgMTQ6NTc6NTYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIG11bHRpZmlsZXNpbms6IGFkZCBiYXNpYyBidWZmZXIgbGlzdCBoYW5kbGluZworCSAgV2UgYXNzdW1lIGZvciBub3cgdGhhdCBhbGwgYnVmZmVycyBpbiBhIGJ1ZmZlciBsaXN0CisJICBzaG91bGQgZW5kIHVwIGluIHRoZSBzYW1lIGZpbGUgKHNvIHdlIGNhbiBncm91cCBHT1BzCisJICBpbiBidWZmZXIgbGlzdHMsIGZvciBleGFtcGxlKS4gQ291bGQgb3B0aW1pc2UgdGhpcworCSAgYSBiaXQgdG8gYXZvaWQgdGhlIG1lbWNweS4KKworMjAxMS0wOS0yMyAxODo0MzozNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgbXVsdGlmaWxlc2luazogd3JpdGUgc3RyZWFtLWhlYWRlcnMgd2hlbiBzd2l0Y2hpbmcgdG8gdGhlIG5leHQgZmlsZSBpbiBtYXgtc2l6ZSBtb2RlCisKKzIwMTEtMDktMjMgMTg6MzE6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oOgorCSAgbXVsdGlmaWxlc2luazogYWRkIG5ldyAnbWF4LXNpemUnIG1vZGUgZm9yIHN3aXRjaGluZyB0byB0aGUgbmV4dCBmaWxlCisKKzIwMTEtMDktMjMgMTc6NDk6MDUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oOgorCSAgbXVsdGlmaWxlc2luazogYWRkICJtYXgtZmlsZS1zaXplIiBwcm9wZXJ0eSBmb3IgbmV3IG5leHQtZmlsZSBtb2RlCisKKzIwMTEtMTItMDEgMTM6Mzg6MDYgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IERvbid0IGZvcmdldCBTU0Egc3VidGl0bGVzIGluIGxhc3QgY29tbWl0CisKKzIwMTEtMTItMDEgMTM6MzQ6NTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIG1hdHJvc2thZGVtdXg6IE9ubHkgY2hlY2sgZm9yIG1hcmt1cCBhbmQgZXNjYXBlIGlmIG5lY2Vzc2FyeSBmb3IgcGxhaW50ZXh0IHN1YnRpdGxlcworCSAgT3RoZXJ3aXNlIHdlIGJyZWFrIFVTRiBhbmQgQVNTL1NTQSBzdWJ0aXRsZXMuCisKKzIwMTEtMTItMDEgMTM6MjM6MzMgKzAxMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL01ha2VmaWxlLmFtOgorCSAgbXVsdGlmaWxlOiBmaXggYnVpbGQgaW4gdW5pbnN0YWxsZWQgc2V0dXAKKwkgIEFkZCAtYmFzZSBsaWJzIGluY2x1ZGVzIHRvIENGTEFHUywgZml4IG9yZGVyIG9mIExJQlMgPGNpdD4uCisKKzIwMTEtMTItMDEgMTM6MDg6MDEgKzAxMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWx0aWZpbGUuYzoKKwkgIHRlc3RzOiBmaXggZ19ta2R0ZW1wIHByZXNlbmNlIGNoZWNrIGluIG11bHRpZmlsZSB0ZXN0cworCSAgZ19ta2R0ZW1wIHdhcyBhZGRlZCBpbiBnbGliIDIuMzAgZXZlbiB0aG91Z2ggdGhlIGRvYyBjbGFpbXMgaXQgd2FzIGFkZGVkIGluCisJICAyLjI2LgorCisyMDExLTA3LTE3IDIzOjU2OjA0ICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmg6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOgorCSAgbXVsdGlmaWxlc2luazogYWRkIGZsYWcgdG8gY3V0IGFmdGVyIGEgZm9yY2Uga2V5IHVuaXQgZXZlbnQKKworMjAxMS0xMi0wMSAxMjo0NzoyNiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogQ29weSBhbGwgYnVmZmVyIGZsYWdzIHdoZW4gY3JlYXRpbmcgYSBzdWJ0aXRsZSBidWZmZXIgY29weSBhZnRlciBwb3N0cHJvY2Vzc2luZworCSAgVGhpcyBhbHNvIGNvcGllcyB0aGUgY2Fwcy4gT3RoZXJ3aXNlIHdlIGNvdWxkIGVuZCB1cCBwdXNpbmcKKwkgIHRoZSBmaXJzdCBidWZmZXIgd2l0aG91dCBhbnkgY2Fwcywgd2hpY2ggY2F1c2VzIGRvd25zdHJlYW0KKwkgIHRvIG5vdCBnZXQgbm90aWZpZWQgYWJvdXQgdGhlIGNhcHMuCisJICBGaXhlcyBidWcgIzY2NDg5Mi4KKworMjAxMS0xMC0xMSAwMjowNzoxMyArMDIwMCAgQWxleGV5IEZpc2hlciA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogbWFrZSBkZWZhdWx0IGZyYW1lcmF0ZSBvcHRpb25hbCBwZXIgc3RyZWFtCisJICB0aGVyZSBpcyBhdCBsZWFzdCB0d28gdXNlIGNhc2VzIHdoZXJlIGRlZmF1bHQgZnJhbWUgcmF0ZQorCSAgc2hvdWxkIG9yIG1heSBiZSBkaXNhYmxlZDoKKwkgIC0gdnA4IHN0cmVhbSB3aXRoIGFsdHJlZiBmcmFtZSBlbmFibGVkLiBJZiBkZWZhdWx0IGZyYW1lIHJhdGUKKwkgIGlzIGVuYWJsZWQsIHNvbWUgcGxheWVycyB3aWxsIG1pc3NpbnRlcnByZXRlIGl0IChjcml0aWNhbCEpCisJICAtIGZvciB3ZWJtIGNvbnRhaW5lciwgdG8gcmVkdWNlIG1pY3JvIG92ZXJoZWFkCisJICAtIGZvciBzdHJlYW0gd2l0aCB2YXJpYWJsZSBmcmFtZSByYXRlLgorCSAgU2lnbmVkLW9mZi1ieTogQWxleGV5IEZpc2hlciA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisyMDExLTExLTMwIDIyOjEzOjExICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZWZmZWN0di9nc3RyaXBwbGUuYzoKKwkgIHJpcHBsZXR2OiBmaXggQ0xBTVAgZW5kLXZhbHVlcworCisyMDExLTExLTMwIDE5OjI1OjM3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSAgZG9jczogdXBkYXRlIGRvY3MKKworMjAxMS0xMS0zMCAxOTowMDo0MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aWZpbGUvTWFrZWZpbGUuYW06CisJKiBnc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5jOgorCSogZ3N0L211bHRpZmlsZS9wYXR0ZXJuc3BlYy5jOgorCSogZ3N0L211bHRpZmlsZS9wYXR0ZXJuc3BlYy5oOgorCSAgc3BsaXRmaWxlc3JjOiBzcGVjaWZ5IGZpbGVuYW1lcyB2aWEgbm9ybWFsIHdpbGRjYXJkcyBpbnN0ZWFkIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMKKwkgIExlc3MgY3JhY2t0YXN0aWMgaW4gdGhlIGVuZC4KKworMjAxMS0xMC0xMCAxODoyODoxMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmM6CisJICBzcGxpdGZpbGVzcmM6IGNoZWNrIGJ5dGVzIGFjdHVhbGx5IHJlYWQsIGp1c3QgaW4gY2FzZQorCSAgSGFuZGxlIGNvcm5lciBjYXNlIHdoZXJlIHdlIHRyeSB0byByZWFkIGJleW9uZCB0aGUgZW5kIG9mIHRoZQorCSAgbGFzdCBmaWxlIHBhcnQsIGluIHdoaWNoIGNhc2Ugd2Ugd2FudCB0byByZXR1cm4gYSBzaG9ydCByZWFkLgorCSAgSWYgd2UgZ2V0IGZld2VyIGJ5dGVzIHRoYW4gZXhwZWN0ZWQgZm9yIGFueSBvdGhlciBmaWxlIHBhcnQsCisJICB3ZSBzaG91bGQganVzdCBlcnJvciBvdXQsIHNpbmNlIHNvbWV0aGluZyBmaXNoeSdzIGdvaW5nIG9uCisJICB0aGVuLgorCisyMDExLTEwLTA2IDA4OjMzOjE5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkgIHNwbGl0ZmlsZXNyYzogc2V0IG9mZnNldHMgb24gYnVmZmVycworCSAgTG9va3MgbGlrZSBzb21lIHBhcnNlcnMgKGluIHNvbWUgdmVyc2lvbnMgYXQgbGVhc3QpIGV4cGVjdCB0aGUKKwkgIG9mZnNldHMgdG8gYmUgc2V0LCBhbmQgYmVoYXZlIHdlaXJkIGlmIHRoYXQncyBub3QgdGhlIGNhc2UKKwkgIChlLmcuIG9mZi1ieS1vbmUgaW4gaDI2NHBhcnNlKS4KKworMjAxMS0wNy0yOCAyMDoxOTo1NiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9tdWx0aWZpbGUvTWFrZWZpbGUuYW06CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZS5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RzcGxpdGZpbGVzcmMuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmg6CisJICBtdWx0aWZpbGU6IGFkZCBzcGxpdGZpbGVzcmMgZWxlbWVudAorCSAgQWRkIG5ldyBzcGxpdGZpbGVzcmMgZWxlbWVudCB0aGF0IHByZXNlbnRzIG11bHRpcGxlIGZpbGVzCisJICAoc2VsZWN0YWJsZSB2aWEgYSBsb2NhdGlvbiByZWdleCkgYXMgb25lIHNpbmdsZSBjb250aWd1b3VzCisJICBmaWxlLgorCisyMDExLTExLTMwIDA3OjU3OjQwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VtaXhlcmN0cmwuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgdXBkYXRlIGZvciBtb3ZlZCBhdWRpbyBpbnRlcmZhY2VzCisKKzIwMTEtMTEtMjkgMTc6MzQ6MTAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJICBSZXZlcnQgInB1bHNlYXVkaW9zaW5rOiBmaXggY2FwcyBsZWFrIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCBkNmE5ZGU5ZTJhZWRjOGI2NmFiMzIxOTkwMmI1YTM3ZThkNjVhZGEyLgorCSAgc2V0Y2FwcyBmdW5jdGlvbnMgYXJlbid0IHN1cHBvc2VkIHRvIHRha2Ugb3duZXJzaGlwIG9mIHRoZSBjYXBzIHBhc3NlZAorCisyMDExLTExLTI5IDE5OjEwOjU4ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9vdmVybGF5Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkb3JpZW50Lmg6CisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ljbGVzL3Y0bDJzcmMtdGVzdC5jOgorCSAgZml4IGZvciBtb3ZlZCBpbnRlcmZhY2VzCisKKzIwMTEtMTEtMjggMjM6MjA6MzIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBjb21taXQgJzc1MjFiNTk3ZjRkYzQ5ZDhkMTY4ZjM2OGYwZTdlYmFmOThhNzIxNTYnIGludG8gMC4xMQorCisyMDExLTExLTI4IDIxOjI3OjUzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgcmVtb3RlLXRyYWNraW5nIGJyYW5jaCAnb3JpZ2luL21hc3RlcicgaW50byAwLjExCisKKzIwMTEtMTEtMjggMjE6Mjc6NDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBjb21taXQgJ2EyMzM3YjhhZjQ1Y2I1ZThjMDkxZmYwZTFjM2VmNGI2Y2M3YjIwYTMnIGludG8gMC4xMQorCisyMDExLTExLTI4IDE4OjI1OjUyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJICBVcGRhdGUgZm9yIGluZGV4YWJsZSBjaGFuZ2UKKworMjAxMS0xMS0yOCAxNzo1MjowNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkgIHVwZGF0ZSBmb3IgY2xvY2sgcHJvdmlkZXIgQVBJIGNoYW5nZQorCisyMDExLTExLTI4IDE2OjU3OjI0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgZml4IGZvciBlbGVtZW50IGZsYWcgdXBkYXRlcworCisyMDExLTExLTI4IDEyOjU4OjQ0ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmM6CisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzoKKwkqIGV4dC9jYWlyby9nc3R0aW1lb3ZlcmxheS5jOgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSogZXh0L2VzZC9lc2Rtb24uYzoKKwkqIGV4dC9lc2QvZXNkc2luay5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOgorCSogZXh0L2djb25mL2dzdHN3aXRjaHNpbmsuYzoKKwkqIGV4dC9nY29uZi9nc3Rzd2l0Y2hzcmMuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5jOgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzoKKwkqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zaW5rLmM6CisJKiBleHQvaGFsL2dzdGhhbGF1ZGlvc3JjLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZGVjLmM6CisJKiBleHQvanBlZy9nc3RzbW9rZWVuYy5jOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzoKKwkqIGV4dC9saWJtbmcvZ3N0bW5nZGVjLmM6CisJKiBleHQvbGlibW5nL2dzdG1uZ2VuYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOgorCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJKiBleHQvdGFnbGliL2dzdGFwZXYybXV4LmNjOgorCSogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4LmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJKiBnc3QvZGVidWd1dGlscy9icmVha215ZGF0YS5jOgorCSogZ3N0L2RlYnVndXRpbHMvY3B1cmVwb3J0LmM6CisJKiBnc3QvZGVidWd1dGlscy9lZmVuY2UuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNkZWJ1Zy5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0Y2Fwc3NldHRlci5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2aWdhdGlvbnRlc3QuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdG5hdnNlZWsuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHB1c2hmaWxlc3JjLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Byb2dyZXNzcmVwb3J0LmM6CisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJKiBnc3QvZGVidWd1dGlscy90ZXN0cGx1Z2luLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzdHJlYWsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzoKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHJ0cHhxdGRlcGF5LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL3dlYm0tbXV4LmM6CisJKiBnc3QvbWVkaWFuL2dzdG1lZGlhbi5jOgorCSogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmM6CisJKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBidmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVuZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc2lyZW5wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSogZ3N0L3J0c3AvZ3N0cnRwZGVjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6CisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOgorCSogc3lzL29zczQvb3NzNC1zaW5rLmM6CisJKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1zaW5rLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIHZhcmlvdXM6IGZpeCBwYWQgdGVtcGxhdGUgbGVha3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjI2NjQKKworMjAxMS0xMS0yOCAxMzowODoyNyArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZkZXRlY3QuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgdmFyaW91czogZml4IHBhZCB0ZW1wbGF0ZSByZWYgbGVha3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjI2NjQKKworMjAxMS0xMS0yOCAxMTo0NzoxMSArMDEwMCAgQ2hhZCA8Y2hhbm5hQGNhbHRlY2guZWR1PgorCisJKiBnc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYzoKKwkgIHRhZ2luamVjdDogc2V0IGdhcC1hd2FyZQorCSAgVGhlIGVsZW1lbnQgZG9lcyBub3QgbW9kaWZ5IHRoZSBkYXRhIGFueXdheS4KKworMjAxMS0xMS0yNyAyMzozMjoxOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiB1cGRhdGUgcG8gZmlsZXMKKworMjAxMS0xMS0yNyAyMzozMTo0MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIHJlbW90ZS10cmFja2luZyBicmFuY2ggJ29yaWdpbi9tYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYworCisyMDExLTExLTI2IDIxOjM5OjMzICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgZXF1YWxpemVyOiBhbHNvIHN5bmMgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmaWx0ZXIgYmFuZHMKKworMjAxMS0xMS0yNiAxNjowNjo1OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuYzoKKwkgIG1hdHJvc2thZGVtdXg6IGluaXRpYWxpc2Ugc2Vlbl9tYXJrdXBfdGFnIGZpZWxkIG9uIHN1YnRpdGxlIHN0cmVhbSBjb250ZXh0CisKKzIwMTEtMTEtMjYgMTA6MDE6MDcgKzAxMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuaDoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSogZ3N0L21hdHJvc2thL3dlYm0tbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOgorCSAgbWF0cm9za2E6IHBvcnQgdG8gMC4xMQorCSAgU3VwcG9ydCBmb3IgVEFHX0lNQUdFIGFuZCBUQUdfQVRUQUNITUVOVCBpcyBjb21tZW50ZWQgb3V0OyB0aGlzIHJlcXVpcmVzIGNhcHMKKwkgIG9uIGJ1ZmZlcnMgd2hpY2ggaXMgZ29uZSBmcm9tIDAuMTEuCisJICBTZWdtZW50IGhhbmRsaW5nIGluIHRoZSBkZW11eGVyIGlzIGEgYml0IGNvbXBsZXg7IEkgYWRkZWQgc29tZSBGSVhNRSBjb21tZW50cworCSAgaW4gcGxhY2VzIHdoZXJlIEknbSBub3QgeWV0IHN1cmUgaWYgSSBwb3J0ZWQgY29ycmVjdGx5LgorCisyMDExLTExLTI2IDEzOjU0OjIyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L3B1bHNlL3BsdWdpbi5jOgorCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5oOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5oOgorCSAgcHVsc2VhdWRpbzogcmVxdWlyZSBwdWxzZWF1ZGlvID49IDEuMAorCisyMDExLTExLTI2IDEzOjM0OjEwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgcmVtb3RlLXRyYWNraW5nIGJyYW5jaCAnb3JpZ2luL21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYworCSAgZXh0L3B1bHNlL3B1bHNlc3JjLmMKKwkgIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYworCSAgZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jCisJICBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmMKKwkgIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmMKKwkgIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYworCSAgZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5oCisJICBnc3QvZWZmZWN0di9nc3RyaXBwbGUuYworCSAgU29tZSBwb3NzaWJsZSBGSVhNRXMgcmVtYWluaW5nIGluIHRoZSBhdWRpbyBwYXJzZXIgZ2V0Y2FwcyBmdW5jdGlvbnMuCisKKzIwMTEtMTEtMjUgMTk6Mjg6NTUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5jOgorCSAgaXNtbG11eDogVXNlIGlzby1mcmFnbWVudGVkIGFzIHZhcmlhbnQgdHlwZQorCSAgVXNpbmcgJ2lzbycgY29uZmxpY3RzIHdpdGggbXA0bXV4IHZhcmlhbnQgdHlwZSwgaXNtbG11eCBub3cKKwkgIHVzZXMgaXNvLWZyYWdtZW50ZWQKKwkgIEZpeGVzICM2NTY4MjMKKworMjAxMS0xMS0yNCAxMjowNTozMyArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmg6CisJICBwdWxzZXNyYzogSW1wbGVtZW50IEdzdFN0cmVhbVZvbHVtZSBpbnRlcmZhY2UKKwkgIFB1bHNlQXVkaW8gMS4wIHN1cHBvcnRzIHBlci1zb3VyY2Utb3V0cHV0IHZvbHVtZXMsIGFuZCB0aGlzIGV4cG9zZXMgdGhlCisJICBmdW5jdGlvbmFsaXR5IHZpYSB0aGUgR3N0U3RyZWFtVm9sdW1lIGludGVyZmFjZS4KKwkgIFdoZW4gY29tcGlsZWQgYWdhaW5zdCBwcmUtMS4wIFB1bHNlQXVkaW8sIHRoZSBpbnRlcmZhY2UgaXMgbm90CisJICBpbXBsZW1lbnRlZCwgYW5kIHRoZSAidm9sdW1lIiBvciAibXV0ZSIgcHJvcGVydGllcyBhcmUgbm90IGF2YWlsYWJsZS4KKwkgIFRoaXMgYml0IG9mIHVnbGluZXNzIHdpbGwgZ28gYXdheSB3aGVuIHdlIGNhbiBkZXBlbmQgb24gUHVsc2VBdWRpbyAxLjAKKwkgIG9yIGdyZWF0ZXIuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTk1MDU1CisKKzIwMTEtMDktMTAgMjE6MjE6MzggLTA3MDAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBUcml2aWFsIGNvbW1lbnQgY29weS1wYXN0ZS1vIGZpeAorCisyMDExLTExLTE0IDEyOjQzOjI3ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJICBwdWxzZWF1ZGlvc2luazogUmVtb3ZlIHJlZHVuZGFudCBjb2RlCisKKzIwMTEtMTEtMTQgMTI6NDE6NDEgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkgIHB1bHNlYXVkaW9zaW5rOiBDbGVhbiB1cCByZWZjb3VudGluZyBpbiBldmVudCBwcm9iZQorCSAgTWFrZXMgc3VyZSB3ZSBkb24ndCBsZWFrIGEgcmVmY291bnQgaWYgdGhlIG9iamVjdCBpcyBkaXNwb3NlZCBiZWZvcmUgYQorCSAgTkVXU0VHTUVOVCB0dXJucyB1cC4KKworMjAxMS0xMS0yNCAxNjozMTozOCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBmaXggc2Vla2luZworCSAgV2hpY2ggSSBhY2NpZGVudGFsbHkgYnJva2Ugd2hlbiBmaXhpbmcgZmx2IHZpZGVvcyBicmVha2luZyBvbgorCSAgc3B1cmlvdXMgdGltZXN0YW1wIGRpc2NvbnRpbnVpdGllcyBpbiBicm9rZW4gZmlsZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjMxNDMwCisKKzIwMTEtMTEtMjUgMTM6MTM6NDcgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuaDoKKwkgIGVmZmVjdHY6IHJlcGFpciBjb2xvciBtb2RlcyBpbiByYWRpb2FjdHYgYnkgdGFraW5nIHJnYixiZ3IgaW50byBhY2NvdW50CisKKzIwMTEtMTEtMjUgMTE6NDQ6NDkgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkgIHJhZGlvYWN0djogYWRkIG9uZSBtb3JlIHNldCBvZiBjYXBzCisJICBJdCBhbHNvIHdvcmsgaW4gdGhpcyBmb3JtYXQuIEF2b2lkcyB0aGUgbmVlZCBmb3IgY29udmVyc2lvbi4KKworMjAxMS0xMS0yNSAxMTo0NDoxOCArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOgorCSAgZWZmZWN0dHY6IGZpeCByZXZlcnNlIG5lZ290aWF0aW9uCisJICBUaGUgcGx1Z2lucyB3ZXJlIHVzaW5nIF9maXhlZF9jYXBzXyBhbmQgdGh1cyBub3QgYWRqdXN0aW5nIHRvIG5ldyB1cHN0cmVhbQorCSAgc2l6ZXMuIFNwb3R0ZWQgYnkgVGltIE3DvGxsZXIuCisKKzIwMTEtMTEtMjUgMTE6NDM6MTYgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkgIHdhcnB0djogcmVtb3ZlIG5vdCBuZWVkZWQgaWZkZWYKKworMjAxMS0xMS0yNSAxMDoxNTozNSArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmM6CisJICByaXBwbGV0djogY2xlYW4gdXAgdGhlIHJlbmRlcmluZyBjb2RlIGEgYml0CisJICBUaGlzIGlzIGNvcnJydXB0cyB0aGUgbWVtb3kgd2hlbiByZXNpemluZy4gQWRkIGEgRklYTUUgdG8gbWFrZSBpdCByZXNpemVhYmxlCisJICBvbmNlIHRoYXQgaXMgc29sdmVkLgorCisyMDExLTExLTI0IDIxOjQxOjAzICswMTAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hbHBoYWNvbG9yLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2FtcGxpZnkuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmJhbmQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmxpbWl0LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2R5bmFtaWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZWNoby5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9pbnZlcnQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvcGFub3JhbWEuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvd3NpbmNiYW5kLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jbGltaXQuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpc3VidGl0bGUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NhcHNzZXR0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxlbmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2VxdWFsaXplci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdlbmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9wYXJzZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2xpbWl0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3Jndm9sdW1lLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwZWN0cnVtLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2ZpbHRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMveTRtZW5jLmM6CisJICB0ZXN0czogdXBkYXRlIGZvciBnc3RjaGVjayBBUEkgY2hhbmdlCisKKzIwMTEtMTEtMjQgMjA6NDI6NDkgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzdHJlYWsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkgIGVmZmVjdHR2OiBmaXggcmV2ZXJzZSBuZWdvdGlhdGlvbgorCSAgVGhlIHBsdWdpbnMgd2VyZSB1c2luZyBfZml4ZWRfY2Fwc18gYW5kIHRodXMgbm90IGFkanVzdGluZyB0byBuZXcgdXBzdHJlYW0KKwkgIHNpemVzLiBTcG90dGVkIGJ5IFRpbSBNw7xsbGVyLgorCisyMDExLTExLTI0IDE0OjE0OjUzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgbXVsdGlmaWxlc2luazogRml4IGxlYWsgb2YgZmlsZW5hbWUgc3RyaW5ncworCSAgRG8gbm90IGZvcmdldCB0byBmcmVlIHRoZSBmaWxlbmFtZSBzdHJpbmdzIHdoZW4gZGVsZXRpbmcKKwkgIHRoZSBsaXN0IG9mIGZpbGVzLgorCisyMDExLTExLTI0IDE0OjExOjMzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOgorCSAgbXVsdGlmaWxlOiBmaXggYnVpbGQgb2YgdGVzdHMKKwkgIFRlc3RzIGZhaWwgdG8gYnVpbGQgYmVjYXVzZSBnX21rZHRlbXAgaXMgYXZhaWxhYmxlIGZyb20gZ2xpYiBzaW5jZQorCSAgMi4yNi4KKwkgIFRoaXMgcGF0Y2ggYWRkcyBhIGNvbmRpdGlvbiBhcm91bmQgdGhlIHJlZGVmaW5pdGlvbiBvZgorCSAgZ19ta2R0ZW1wIG9uIHRoZSB0ZXN0cyB0byBvbmx5IGJ1aWxkIGl0IGlmIGdsaWIgaXMgb2xkZXIgdGhhbgorCSAgMi4yNi4KKworMjAxMS0wOS0yNyAxNjo0OTo0NSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IHNraXAgaWQzMiB0YWdzCisJICBUaGlzIGFsbG93cyBkZWNvZGluZyBhdCBsZWFzdCBvbmUgc2FtcGxlIHdoZXJlIHNvbWV0aGluZyBoYXMKKwkgIHN0dWZmZWQgc29tZSBJRDMgdGFnIGJlZm9yZSB0aGUgKHN1cHBvc2VkbHkgaW5pdGlhbCkgRk1UXCAuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjYwMjQ5CisKKzIwMTEtMTAtMzEgMTc6MDY6MTggKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJICBlZGdldHY6IHRyaXZpYWwgY29tbWVudCBmaXggZm9yIGNsYXJpdHkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjE4NDEKKworMjAxMS0xMC0zMSAxNzowNDoyMyArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzoKKwkgIGVkZ2V0djogZG9uJ3QgbGVhdmUgYml0cyBvZiB0aGUgb3V0cHV0IGJ1ZmZlciB1bmluaXRpYWxpemVkCisJICBMZXQncyBpbml0aWFsaXplIHRoZW0gdG8gemVyby4gSXQgbG9va3MgYWxyaWdodCwgYnV0IHRoZW4gaXQKKwkgIGFsc28gbG9va3MgYWxyaWdodCB3aXRoIHYzLCBvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHBpeGVscworCSAgZnJvbSB0aGUgc291cmNlLiBJIGRvbid0IGtub3cgd2hhdCB0aGUgb3JpZ2luYWwgaW50ZW50IHdvdWxkCisJICBiZSwgYW5kIHRoZSBvcmlnaW5hbCBlZmZlY3R2IHNvdXJjZSBhbHNvIGhhcyB0aGlzIGJ1Zy9mZWF0dXJlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MTg0MQorCisyMDExLTExLTI0IDEwOjI1OjAyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2U6IFVzZSB0aGUgc2lua3BhZCB0ZW1wbGF0ZSBjYXBzIGFzIGZhbGxiYWNrLCBub3QgdGhlIHNyY3BhZCBvbmVzCisKKzIwMTEtMTEtMjQgMDk6NTk6NDAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJICBtcGVnYXVkaW9wYXJzZTogSW1wbGVtZW50IDo6Z2V0X3NpbmtfY2FwcyB2ZnVuYyB0byBwcm9wYWdhdGUgZG93bnN0cmVhbSBjYXBzIGNvbnN0cmFpbnRzIHVwc3RyZWFtCisKKzIwMTEtMTEtMjQgMDk6NTc6NTcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBJbXBsZW1lbnQgOjpnZXRfc2lua19jYXBzIHZmdW5jIHRvIHByb3BhZ2F0ZSBkb3duc3RyZWFtIGNhcHMgY29uc3RyYWludHMgdXBzdHJlYW0KKworMjAxMS0xMS0yNCAwOTo1NTo0NyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkgIGRjYXBhcnNlOiBJbXBsZW1lbnQgOjpnZXRfc2lua19jYXBzIHZmdW5jIHRvIHByb3BhZ2F0ZSBkb3duc3RyZWFtIGNhcHMgY29uc3RyYWludHMgdXBzdHJlYW0KKworMjAxMS0xMS0yNCAwOTo1MzoxOCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkgIGFtcnBhcnNlOiBJbXBsZW1lbnQgOjpnZXRfc2lua19jYXBzIHZmdW5jIHRvIHByb3BhZ2F0ZSBkb3duc3RyZWFtIGNhcHMgY29uc3RyYWludHMgdXBzdHJlYW0KKworMjAxMS0xMS0yNCAwOTo0OToyNyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkgIGFtcnBhcnNlOiBNYXJrIHNvbWUgbW9yZSBmdW5jdGlvbnMgYXMgc3RhdGljCisKKzIwMTEtMTEtMjQgMDk6NDg6MzMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJICBhYzNwYXJzZTogSW1wbGVtZW50IDo6Z2V0X3NpbmtfY2FwcyB2ZnVuYyB0byBwcm9wYWdhdGUgZG93bnN0cmVhbSBjYXBzIGNvbnN0cmFpbnRzIHVwc3RyZWFtCisKKzIwMTEtMTEtMjQgMDk6NDQ6NTggKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogTWFyayBzb21lIGZ1bmN0aW9ucyBhcyBzdGF0aWMgYW5kIHJlbW92ZSB1bnVzZWQgZnVuY3Rpb24gZGVjbGFyYXRpb25zCisKKzIwMTEtMTEtMjQgMDk6NDM6MTQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogSW1wbGVtZW50IDo6Z2V0X3NpbmtfY2FwcyB2ZnVuYyB0byBwcm9wYWdhdGUgZG93bnN0cmVhbSBjYXBzIGNvbnN0cmFpbnRzIHVwc3RyZWFtCisKKzIwMTEtMTEtMjQgMDE6NDg6MjUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSAgdGVzdHM6IHVwZGF0ZSBzb3VwIHRlc3QgZm9yIHJlbW92ZWQgaXJhZGlvLW1vZGUgcHJvcGVydHkKKworMjAxMS0xMS0yNCAwMTo0NTo0MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IGdldCByaWQgb2YgaXJhZGlvLSogcHJvcGVydGllcywgcG9zdCB0YWdzIGluc3RlYWQKKworMjAxMS0xMS0yNCAwMTo0MDowNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgc291cGh0dHBzcmM6IGFsd2F5cyBzZW5kIGljZWNhc3QgcmVxdWVzdCBoZWFkZXIsIGRyb3AgaXJhZGlvLW1vZGUgcHJvcGVydHkKKwkgIFNlcnZlciBzaG91bGQgaWdub3JlIHVua25vd24vdW5oYW5kbGVkIGhlYWRlcnMuLgorCisyMDExLTExLTI0IDAxOjE5OjMyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogbWFrZSBjb25uZWN0aW9uLXNwZWVkIHByb3BlcnR5IGEgZ3VpbnQ2NAorCisyMDExLTExLTI0IDAwOjUyOjQwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbDoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbWFuYWdlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtUENNQS5weToKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWFsc2FzcmMtUENNQS5weToKKwkgIHJ0cG1hbmFnZXI6IHJlbmFtZSBnc3RydHAqIC0+IHJ0cCoKKwkgIFRoaXMgd2FzIGRvbmUgaW4gMC4xMCB0byBhdm9pZCBjb25mbGljdCB3aXRoIHRoZSBydHAgZWxlbWVudHMgaW4KKwkgIGZhcnNpZ2h0LCBidXQgdGhlIGdzdC1wcmVmaXhpbmcgaXMgbm8gbG9uZ2VyIG5lZWRlZCBpbiAwLjExCisKKzIwMTEtMTEtMjMgMTA6MjM6MjggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0xMS0yMyAwOToyNjoxNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJICBwdWxzZWF1ZGlvc2luazogYXZvaWQgZW5kbGVzcyBjYXBzIGxvb3AKKwkgIENoZWNrIGlmIHRoZSBjYXBzIGFyZSB0aGUgc2FtZSBiZWZvcmUgYWRkaW5nIGEgbmV3IHByb2JlLiBCZWNhdXNlIG9mIHJlY29uZmlndXJlCisJICBldmVudHMsIHVwc3RyZWFtcyBzZW5kcyBtdWx0aXBsZSBjYXBzIGV2ZW50cy4KKworMjAxMS0xMS0yMyAwMDo1NzozOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thcGFyc2UuYzoKKwkqIHRlc3RzL2ZpbGVzL3Bpbmtub2lzZS12b3JiaXMubWt2OgorCSAgdGVzdHM6IGFkZCBiYXNpYyB1bml0IHRlc3QgZm9yIG1hdHJvc2thcGFyc2UKKworMjAxMS0xMS0yMyAwMDo1NjoyNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSAgbWF0cm9za2FwYXJzZTogZG9uJ3QgbGVhayBzdHJlYW0gaGVhZGVycworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NDU0OAorCisyMDExLTExLTIyIDAxOjQwOjM5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgTW9yZSBwcmludGYgZm9ybWF0IHdhcm5pbmcgZml4ZXMKKworMjAxMS0xMS0yMSAyMDozMTozMSArMDEwMCAgTWF0ZWogS25vcHAgPG1hdGVqLmtub3BwQGdtYWlsLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2JyZWFrbXlkYXRhLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIEZpeCBwcmludGYgZm9ybWF0IGNvbXBpbGVyIHdhcm5pbmdzIG9uIE9TIFggLyA2NGJpdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MjYxNQorCisyMDExLTExLTIxIDEzOjM3OjAxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB1cGRhdGUgZm9yIGFjdGl2YXRpb24gY2hhbmdlcworCisyMDExLTExLTE4IDE3OjU5OjE2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RwdXNoZmlsZXNyYy5jOgorCSogZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHVwZGF0ZSBmb3IgbmV3IHNjaGVkdWxpbmcgcXVlcnkKKworMjAxMS0xMS0xOCAxMzo1NzoyMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBhZGQgcGFyZW50IHRvIGFjdGl2YXRlIGZ1bmN0aW9ucworCisyMDExLTExLTE3IDE3OjM2OjA1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFjdGl2YXRlIHBhZCBiZWZvcmUgc2V0dGluZyBjYXBzCisJICBTZXRpbmcgY2FwcyBvbiBhbiBpbmFjdGl2ZSBmbHVzaGluZyBwYWQgZG9lcyBub3RoaW5nLgorCisyMDExLTExLTE3IDE3OjE3OjExICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYworCSAgZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jCisKKzIwMTEtMTEtMTcgMTU6MDI6NTUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxlbmMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ3ZvbHVtZS5jOgorCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5jOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIGFkZCBwYXJlbnQgdG8gcGFkIGZ1bmN0aW9ucworCisyMDExLTExLTE3IDA4OjI0OjU4ICswMTAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgY29sbGVjdHBhZHM6IHBvcnQgQVBJIGNoYW5nZXMKKworMjAxMS0xMS0xNiAxOTowODowNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgc3BlZXhlbmM6IGVuc3VyZSB0byBmcmVlIGFsbG9jYXRlZCBwYWRkZWQgZGF0YQorCisyMDExLTExLTE2IDE4OjU3OjM4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJICBzcGVleGVuYzogcmVzZXQgdGFnIHNldHRlciBpbnRlcmZhY2Ugd2hlbiBhcHByb3ByaWF0ZQorCisyMDExLTExLTE2IDE4OjU3OjIxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogcmVzZXQgdGFnIHNldHRlciBpbnRlcmZhY2Ugd2hlbiBhcHByb3ByaWF0ZQorCisyMDExLTExLTE2IDE3OjU0OjQ5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgYWRkIHBhcmVudCB0byBpbnRlcm5hbCBsaW5rcworCisyMDExLTExLTE2IDE3OjI3OjEzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYW5ub2RleC9nc3RjbW1sZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RwdXNoZmlsZXNyYy5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBhZGQgcGFyZW50IHRvIHF1ZXJ5IGZ1bmN0aW9uCisKKzIwMTEtMTEtMTYgMTI6NDA6MDggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkgIGdvb206IHVwZGF0ZSBmb3IgcmVuYW1lZCBmbGFncworCSAgVXNlIHRoZSBfY2hlY2tfcmVjb25maWd1cmUgbWV0aG9kIGluc3RlYWQgb2YgY2hlY2tpbmcgZmxhZ3MuCisJICBEb24ndCBuZWVkIHRvIHJlZiB0aGUgcGFyZW50IGFueW1vcmUsIGNvcmUgZG9lcyB0aGF0LgorCisyMDExLTExLTE1IDE4OjAxOjE2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgX3F1ZXJ5X3BlZXJfKigpIC0+IF9wZWVyX3F1ZXJ5XyooKQorCisyMDExLTExLTE1IDE3OjQ1OjMxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkgIF9hY2NlcHRfY2FwcygpIC0+IF9xdWVyeV9hY2NlcHRfY2FwcygpCisKKzIwMTEtMTEtMTUgMTc6Mjk6NDUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBfcGVlcl9nZXRfY2FwcygpIC0+IF9wZWVyX3F1ZXJ5X2NhcHMoKQorCisyMDExLTExLTE1IDE2OjU1OjI3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiB0ZXN0cy9pY2xlcy9nZGtwaXhidWZzaW5rLXRlc3QuYzoKKwkgIHVwZGF0ZSBmb3IgX2dldF9jYXBzKCkgLT4gX3F1ZXJ5X2NhcHMoKQorCisyMDExLTExLTE1IDE2OjMxOjQ1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkgIGNoYW5nZSBnZXRjYXBzIHRvIHF1ZXJ5CisJICBDaGFpbiB1cCBldmVudCBmdW5jdGlvbiBpbiBwYXlsb2FkZXJzLgorCisyMDExLTExLTE1IDEzOjIzOjU2ICswMDAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogZml4IHNwdXJpb3VzIHRpbWVzdGFtcCBkaXNjb250aW51aXR5CisJICBXZSBuZWVkIHRvIHRlbGwgdGhlIGJhc2UgY2xhc3MgdGhhdCB3ZSdyZSBkcm9wcGluZyBidWZmZXJzLAorCSAgc28gaXQgZHJvcHMgdGhlIGlucHV0IHRpbWVzdGFtcHMgY29ycmVzcG9uZGluZyB0byB0aGVzZS4KKwkgIE90aGVyd2lzZSwgdGhlIGZpcnN0IGFjdHVhbCBhdWRpbyBidWZmZXJzIHdlIG91dHB1dCB3aWxsIGJlCisJICBzdGFtcGVkIHdpdGggdGhvc2UgLSBHU1RfQ0xPQ0tfVElNRVNUQU1QX05PTkUuIFRoYXQgbWlzbWF0Y2gKKwkgIGJldHdlZW4gaW5wdXQgYnVmZmVyIGNvdW50IGFuZCBvdXRwdXQgYnVmZmVyIGNvdW50IHdpbGwgc3RheQorCSAgd2hpbGUgcGxheWluZy4gV2l0aCBlbm91Z2ggaGVhZGVycyBhbmQgbG9uZyBlbm91Z2ggYnVmZmVyCisJICBkdXJhdGlvbnMsIHRoZSBzaW5rIHdpbGwgaGF2ZSBwbGF5ZWQgZW5vdWdoIGJlZm9yZSByZWNlaXZpbmcKKwkgIHRoZSBmaXJzdCB2YWxpZCB0aW1lc3RhbXAgKHVzdWFsbHkgMCksIGFuZCB3aWxsIHRyaWdnZXIgYW4KKwkgIGF1ZGlibGUgZGlzY29udGludWl0eS4KKworMjAxMS0xMS0xNCAxNTozNDo1NyArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oOgorCSAgZmxhY3BhcnNlOiBkZXRlY3Qgd2hlbiBhIGZpbGUgbGllcyBhYm91dCBmaXhlZCBibG9jayBzaXplCisJICBJZiB0aGUgc2FtcGxlL2Jsb2NrIG51bWJlciBoYXBwZW5zIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBibG9jaworCSAgc2l6ZSwgd2UgYXNzdW1lIHZhcmlhYmxlIGJsb2NrIHNpemUsIGFuZCB0aHVzIGNvdW50ZXJzIGluIHNhbXBsZXMKKwkgIGluIHRoZSBoZWFkZXJzLiBUaGlzIGNhbiBvbmx5IGdldCB1cyBhIGZhbHNlIHBvc2l0aXZlIGZvciBhIGJsb2NrCisJICBzaXplIG9mIDEsIHdoaWNoIGlzIGludmFsaWQuIFdlIGNhbiBnZXQgZmFsc2UgbmVnYXRpdmVzIG1vcmUKKwkgIG9mdGVuIHRob3VnaCAoZWcsIGlmIG5vdCBzdGFydGluZyBhdCB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbSksCisJICBidXQgdGhlbiB0aGF0J3MgYWxyZWFkeSBHSUdPLgorCisyMDExLTA5LTAyIDE5OjIwOjA3IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBnc3RydHBzZXNzaW9uOiBBZGQgc3BlY2lhbCBtb2RlIHRvIHVzZSBGSVIgYXMgcmVwYWlyIGFzIEdvb2dsZSBkb2VzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU4NDE5CisKKzIwMTEtMDktMDEgMTc6NDc6MzggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSAgcnRwc2Vzc2lvbjogU2VuZCBGSVIgcmVxdWVzdHMgaW4gcmVzcG9uc2UgdG8ga2V5IHVuaXQgcmVxdWVzdHMgd2l0aCBhbGwtaGVhZGVycz1UUlVFCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU4NDE5CisKKzIwMTEtMDktMDEgMTY6MjU6MjEgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSAgcnRwc2Vzc2lvbjogUHV0IHRoZSBQTEkgcmVxdWVzdHMgaW4gZWFjaCBSVFBTb3VyY2UKKwkgIEFsc28gcmVmYWN0b3IgYSBiaXQgYW5kIHB1dCBhbGwgdGhlIGtleWZyYW1lIHJlcXVlc3QgY29kZSBpbiBvbmUKKwkgIHBsYWNlIGluc2lkZSBydHBzZXNzaW9uLmMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTg0MTkKKworMjAxMS0wOC0zMSAxNDozNTozMyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogSGFjayB0byBGSVIgYmVjYXVzZSBHb29nbGUgZG9lc24ndCBzZXQgdGhlIHNlbmRlciBzc3JjIGNvcnJlY3RseQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1ODQxOQorCisyMDExLTA4LTMwIDE5OjA2OjEzIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBzZXNzaW9uOiBQcm9jZXNzIHJlY2VpdmVkIEZ1bGwgSW50cmEgUmVxdWVzdHMKKwkgIFByb2Nlc3MgRklSIHJlcXVlc3RzIGFjY29yZGluZyB0byBSRkMgNTEwNAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1ODQxOQorCisyMDExLTExLTA3IDE4OjQzOjI2ICswMDAwICBTam9lcmQgU2ltb25zIDxzam9lcmQuc2ltb25zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogU2V0IHBpeGVsLWFzcGVjdC1yYXRpbyB0byAxLzEKKwkgIFdlIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0IHNldHRpbmcgdGhlIHBpeGVsLWFzcGVjdC1yYXRpbyBmcm9tIFY0TDIuIFNvCisJICBzaW1wbHkgc2V0IGl0IHRvIGJlIDEvMSBpbiB0aGUgY2FwcyB0byBwcmV2ZW50IG5lZ290aWF0aW9uIGZhaWx1cmVzIHdoZW4KKwkgIGZpeGF0aW5nIHRvIHdlaXJkIHZhbHVlcyAoZS5nLiB3aGVuIHRoZSBkb3duc3RyZWFtIGNhcHMgaGFzCisJICBwaXhlbC1hc3BlY3QtcmF0aW8gPSBbIE1JTiwgTUFYIF0gKQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MzU4MAorCisyMDExLTExLTE0IDA5OjM5OjE1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzZGVtdXguYzoKKwkgIHRlc3RzOiBtYWtlIGlkM2RlbXV4IHRlc3QgY29tcGlsZQorCSAgU3RpbGwgZmFpbHMgdGhvdWdoLgorCisyMDExLTExLTEyIDE1OjQyOjI3ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jOgorCSAgY29udHJvbGxlcjogbm8gbmVlZCB0byBleHBsaWNpdGVseSBhZGQgY29udHJvbGxlZCBwcm9wZXJ0aWVzIGFueW1vcmUKKworMjAxMS0xMS0xMyAyMzo0Mjo0NCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RwdXNoZmlsZXNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnJhZGlvLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBVcGRhdGUgZm9yIEdzdFVSSUhhbmRsZXIgZ2V0X3Byb3RvY29scygpIGNoYW5nZXMKKworMjAxMS0xMS0xMyAxODo1MDo1MSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RwdXNoZmlsZXNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnJhZGlvLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBzb3VwLCBwdXNoZmlsZSwgcnRzcCwgdWRwLCB2NGwyOiB1cGRhdGUgZm9yIEdzdFVSSUhhbmRsZXIgQVBJIGNoYW5nZXMKKworMjAxMS0xMS0xMSAxOToyNDoyNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmMKKworMjAxMS0xMS0xMSAxOToyMTo1MCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6CisJICBydHA6IGZpeCBmb3IgcnRwIGhlYWRlciBjaGFuZ2VzCisKKzIwMTEtMTEtMTEgMTA6MDY6MjUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJICBwdWxzZWF1ZGlvc2luazogZml4IGNhcHMgbGVhaworCisyMDExLTExLTExIDE0OjU1OjQ4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBkbyBub3QgbGVhayBjbGllbnRuYW1lIHdoZW4gc2V0dGluZyB1cCBwcm9wZXJ0eQorCisyMDExLTExLTExIDE4OjA1OjM1ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJICBwdWxzZTogQ2hhaW4gdXAgZGlzcG9zZSgpIGluIHB1bHNlYXVkaW9zaW5rCisKKzIwMTEtMTEtMTEgMTI6MzI6NDEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvZ3N0cnRweHF0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZm52MWhhc2guaDoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBidnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdHBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBkdmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGR2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzIycGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcGFyb2J1c3RkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcHZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuaDoKKwkgIHVwZGF0ZSBmb3IgYmFzZSBjbGFzcyByZW5hbWUKKworMjAxMS0xMS0xMSAxMjoyNTowMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5jOgorCSogZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhYzNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBidmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIycGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFjZWxwZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcWRtZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWRtZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwc2lyZW5kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5oOgorCSAgdXBkYXRlIGZvciBiYXNlIGNsYXNzIHJlbmFtZQorCisyMDExLTExLTExIDEyOjAxOjE3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmg6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHVwZGF0ZSBmb3IgYXVkaW9iYXNlKiByZW5hbWUKKworMjAxMS0xMS0xMSAxMTo1Mzo0NSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5oOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBhdWRpbzogdXBkYXRlIGZvciBiYXNlIGNsYXNzIHJlbmFtZQorCisyMDExLTExLTExIDExOjMzOjQ0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmg6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5oOgorCSAgZml4IGZvciByaW5nYnVmZmVyIHJlbmFtZQorCisyMDExLTExLTExIDExOjI0OjAwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2tyaW5nYnVmZmVyLmg6CisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5oOgorCSAgdXBkYXRlIGZvciByaW5nYnVmZmVyIGNoYW5nZQorCisyMDExLTExLTEwIDIzOjE1OjMwICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jOgorCSAgY29udHJvbGxlcjogcG9ydCBhcGkgY2hhbmdlcworCisyMDExLTExLTEwIDIzOjA5OjIzICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvYW5ub2RleC9nc3Rhbm5vZGV4LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJICB2YXJpb3VzOiBhZGQgbWlzc2luZyBpbmNsdWRlcworCisyMDExLTExLTEwIDIxOjM1OjI0ICswMTAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGZpeCBjb21waWxhdGlvbiB3aXRoIHB1bHNlYXVkaW8gMC45CisKKzIwMTEtMTEtMTAgMTg6MzI6NTggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB1cGRhdGUgZm9yIGFkYXB0ZXIgYXBpIGNoYW5nZXMKKworMjAxMS0xMS0xMCAxNzoyMzo0NyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBidnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJICB1cGRhdGUgZm9yIGNoYW5nZWQgYmFzZSBjbGFzc2VzCisKKzIwMTEtMTEtMTAgMTM6NTA6MzQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIGZpeCBmb3IgYXVkaW8gY2xvY2sgY2hhbmdlCisKKzIwMTEtMTEtMTAgMTE6MDM6MTggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHVwZGF0ZSBmb3IgcmVtb3ZlZCBmaXhhdGUgZnVuY3Rpb24KKworMjAxMS0xMS0wOSAxNzo0MDoxMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDExLTExLTA5IDE3OjM4OjAzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHVwZGF0ZXMgZm9yIG5ldyBhY2NlcHRjYXBzIHF1ZXJ5CisKKzIwMTEtMTEtMDggMTU6MzU6MjYgKzAwMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZml4IHdyb25nIHN0cmlkZSB3aGVuIGludmVydGluZyB1bmNvbXByZXNzZWQgdmlkZW8KKwkgIFN1Y2ggZnJhbWVzIGhhdmUgYSBzdHJpZGUgbXVsdGlwbGUgb2YgNCwgc2VlCisJICBodHRwOi8vbHNjdWJlLm9yZy9waXBlcm1haWwvZmZtcGVnLWlzc3Vlcy8yMDEwLUFwcmlsLzAxMDI0Ny5odG1sLgorCSAgVGhpcyBzaG93ZWQgdXAgb24gYSBzYW1wbGUgdXNpbmcgYSBvZGQgd2lkdGggb2YgMjQgYml0IHZpZGVvLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MjI4OAorCisyMDExLTExLTA5IDEyOjI1OjAxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJICBoMjYzcHBheTogcmVwb3J0IHRvIDAuMTEKKworMjAxMS0xMS0wOSAxMjoxODowMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jCisJICBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jCisJICBnc3QvaXNvbXA0L3F0ZGVtdXguYworCisyMDExLTExLTA5IDExOjU2OjA3ICswMTAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBkdG1mOiBmaXggY29tcGlsZXIgd2FybmluZyBmb3IgdW5pbml0aWFsaXplZCB2YWx1ZXMKKworMjAxMS0xMS0wOSAxMTo1MzowMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICByZW1vdmUgcXVlcnkgdHlwZXMKKworMjAxMS0xMS0wOSAxMDozMjowNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogbWluaW1hbCBzYW5pdHkgY2hlY2sgb24gY3JlYXRpb24gZGF0ZXRpbWUKKworMjAxMS0xMS0wNCAxNzo1NDowNCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5oOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5oOgorCSAgZHRtZnNyYzogUmVqZWN0IHN0YXJ0L3N0b3AgcmVxdWVzdHMgdGhhdCBjb21lIG91dCBvZiBvcmRlcgorCisyMDExLTEwLTI5IDE4OjI0OjI2ICswMjAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBkdG1mOiBQb3N0IG1lc3NhZ2VzIHdoZW4gc3RhcnRpbmcgdG8gc2VuZC9yZWNlaXZlIERUTUYKKwkgIFRoaXMgd2F5LCB0aGUgVUkgY2FuIGRpc3BsYXkgdGhlIERUTUYgZXZlbnRzIGFzIHRoZXkgYXMgYmVpbmcgc2VudC4KKworMjAxMS0xMS0wMiAxMjo1ODoxMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSAgcnRwaDI2M3BwYXk6IFJldHVybiB0aGUgc2luayBwYWQgdGVtcGxhdGUgYXMgc2luayBjYXBzLCBub3QgdGhlIHNyYydzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTc3Nzg0CisKKzIwMDktMDMtMTUgMTk6MjY6NDggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSAgcnRwaDI2M3BwYXk6IEFsc28gaW1wbGVtZW50IHNpemUvZnJhbWVyYXRlIHJlc3RyaWN0aW9ucyBpbiBnZXRjYXBzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTc3Nzg0CisKKzIwMDktMDMtMDQgMjA6NTA6MTkgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSAgcnRwaDI2M3BwYXk6IEltcGxlbWVudCBnZXRjYXBzIGZvbGxvd2luZyBSRkMgNDYyOSwgcGlja3MgdGhlIHJpZ2h0IGFubmV4ZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01Nzc3ODQKKworMjAxMS0xMS0wOCAxNDozMTozNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogYWxzbyBzZXQgc2VnbWVudCBzdG9wIGF0IHN0YXJ0dXAgcmF0aGVyIHRoYW4gb25seSBwb3N0IHNlZWsKKwkgIC4uLiBzbyBhcyB0byBlbnN1cmUgY29uc2lzdGVudCBwbGF5YmFjayB3aXRoIG9yIHdpdGhvdXQgc2VlaywgZXNwZWNpYWxseQorCSAgaW4gcHJlc2VuY2Ugb2Ygc29tZSBib2d1cyBlZGl0IGxpc3QgZW50cmllcy4KKworMjAxMS0xMS0wOCAxMToxODowNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICB1cGRhdGUgZm9yIHByb2JlIGFwaSBjaGFuZ2VzCisKKzIwMTEtMTEtMDggMDg6NTA6MTkgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkgIGdvb206IGNvZGUgY2xlYW51cHMKKwkgIE1vdmUgdmFyaWFibGVzIHRvIHRoZSBzY29wZSB3aGVyZSB0aGV5IGFyZSBuZWVkZWQuIFVzZSBvdXIgbWFjcm9zIGFuZCBmdW5jdGlvbnMKKwkgIG1vcmUuCisKKzIwMTEtMTEtMDggMDg6NDk6MDUgKzAxMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkgIGdvb206IGFkZCBhIHNpbmtfcXVlcnkgdG8gZWF0IGFsbG9jYXRpb24gcXVlcmllcworCSAgV2Ugc2hvdWxkIG5vdCBmb3J3YXJkIGFsbG9jYXRpb24gcXVlcmllcyBmb3IgYXVkaW8gdG8gdGhlIHZpZGVvIHNpbmsuCisKKzIwMTEtMTEtMDIgMTc6MDI6NTQgKzAwMDAgIFJhdWwgR3V0aWVycmV6IFNlZ2FsZXMgPHJnc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvTWFrZWZpbGUuYW06CisJICBnc3QvZmx2LzogYWRkIGFtZmRlZnMuaCB0byBub2luc3RfSEVBREVSUworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MzMzNAorCisyMDExLTExLTA3IDE3OjE0OjE3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIGZpeCBmb3IgcHJvYmUgdXBkYXRlcworCisyMDExLTEwLTAzIDE3OjUwOjQzICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5oOgorCSAgZmx2ZGVtdXg6IGRldGVjdCBsYXJnZSBwdHMgZ2FwcyBhbmQgcmVzeW5jCisJICBTaG91bGQgd29yayBvbiBtdWx0aXBsZSBnYXBzLCBidXQgdGVzdGVkIG9uIG9ubHkgb25lLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzMTQzMAorCisyMDExLTA4LTIyIDEwOjQwOjQ1ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogZml4IG9mZiBieSBvbmUgYmV0d2VlbiBncmFucG9zIGFuZCBsYXN0X3N0b3AKKworMjAxMS0xMC0wNyAxOTo0MTozNSArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGZpeCBsYXN0IGZyYW1lIHRpbWVzdGFtcCBpbiBmaXhlZCBibG9jayBzaXplIG1vZGUKKwkgIFRoZSBsYXN0IGJsb2NrIG1heSBoYXZlIGEgZGlmZmVyZW50IGJsb2NrIHNpemUsIHNvIHdlIHNob3VsZCBub3QKKwkgIHVzZSBpdCB0byBzY2FsZSBvciB3ZSdsbCBlbmQgdXAgd2l0aCBhIHdyb25nIHRpbWVzdGFtcC4KKwkgIFNlZSBjb21tZW50IGFuZCBxdW90ZSBmcm9tIHRoZSBGTEFDIGZvcm1hdCBkb2N1bWVudGF0aW9uIGluIHRoZSBjb2RlLgorCSAgRml4ZXMgbG9vcGVkIHBsYXliYWNrIG9mIEZMQUMgZmlsZXMgKHZpYSBhYm91dC10by1maW5pc2gpLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MTIxNQorCisyMDExLTEwLTI3IDE1OjUyOjQ3ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuaDoKKwkgIGNhaXJvdGV4dG92ZXJsYXk6IGFkZCBhICdzaWxlbnQnIHByb3BlcnR5IHRvIHNraXAgcmVuZGVyaW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjYyODU2CisKKzIwMTEtMTEtMDcgMTI6MDA6MTIgKzAxMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJICBtYXRyb3NrYW11eDogZml4IHJlZ3Jlc3Npb24gY2F1c2luZyBtYWxmb3JtZWQgZmlsZXMKKwkgIFRoaXMgd2FzIGNhdXNlZCBieSBtZSBpbiAxYjIxM2QuIEl0IHNlZW1zIEkgd2FzIHRvbyBmb2N1c2VkIG9uIDAuMTEgd2hlbiBJIGRpZAorCSAgdGhpcyBhbmQgdGVzdGVkIHRoZSB3cm9uZyBicmFuY2guCisJICBUaGUgcHJvYmxlbSB3YXMgcmVwb3J0ZWQgYnkgQWxleGV5IEZpc2hlci4KKworMjAxMS0xMS0wNCAxODo0MTozNiArMDEwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5oOgorCSogZ3N0L2FscGhhL01ha2VmaWxlLmFtOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuaDoKKwkqIGdzdC9hdWRpb2Z4L01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2ludmVydC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9rYXJhb2tlLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmM6CisJKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbToKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmM6CisJKiBnc3QvZWZmZWN0di9nc3R2ZXJ0aWdvLmM6CisJKiBnc3QvZXF1YWxpemVyL01ha2VmaWxlLmFtOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmg6CisJKiBnc3Qvc2hhcGV3aXBlL01ha2VmaWxlLmFtOgorCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkqIGdzdC9zbXB0ZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJKiBnc3QvdmlkZW9ib3gvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL3BsdWdpbi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogc3lzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jOgorCSAgY29udHJvbGxlcjogcG9ydCB0byBuZXcgY29udHJvbGxlciBsb2NhdGlvbiBhbmQgYXBpCisKKzIwMTEtMTEtMDQgMTc6Mzk6MTUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIG1vcmUgdGVtcGxhdGUgZml4ZXMKKworMjAxMS0xMS0wNCAxNjoyMToxMyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJICBwdWxzZWF1ZGlvc2luazogbW9yZSAwLjExIGZpeGluZworCSAgTWFrZSBzdXJlIHRoZSBjYXBzIGV2ZW50IGdldHMgdG8gdGhlIHNpbmsuCisKKzIwMTEtMTEtMDQgMTU6MzU6NDIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jOgorCSAgcHVsc2VhdWRpb3Npbms6IHBvcnQgc29tZSBtb3JlCisJICBSZW5hbWUgZGVjb2RlYmluMiAtPiBkZWNvZGViaW4gc29tZSBtb3JlCisJICBDbGVhbnVwIHVwIHNpbmtwYWQgZXZlbnQgaGFuZGxpbmcKKworMjAxMS0xMS0wNCAxMzo1NjowNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJICBwdWxzZWF1ZGlvc2luazogcG9ydCBzb21lIG1vcmUgdG8gMC4xMQorCSAgV2UgbXVzdCBub3QgZm9yd2FyZCB0aGUgY2FwcyBldmVudC4gaW5zdGVhZCB3ZSB3aWxsIGRlY2lkZSB3aGF0IHRvIGRvIHdoZW4gdGhlCisJICBwYWQgYmxvY2sgaXMgdGFrZW4uCisJICBVc2UgZGVjb2RlYmluIGluc3RlYWQgb2YgZGVjb2RlYmluMgorCisyMDExLTExLTA0IDEzOjEyOjM3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4Lmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIG1vcmUgdGVtcGxhdGUgZml4ZXMKKworMjAxMS0xMS0wNCAxMTo1ODoyMiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS93ZWJtLW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSogZ3N0L3J0c3AvZ3N0cnRwZGVjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdmltdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ludGVybGVhdmUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYmluLmM6CisJICBtYWtlICV1IGluIGFsbCByZXF1ZXN0IHBhZCB0ZW1wbGF0ZXMKKworMjAxMS0xMS0wNCAxMTowMTowMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYworCisyMDExLTExLTA0IDEwOjMyOjQ2ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOgorCSAgUG9ydCBhcGVkZW11eAorCisyMDExLTExLTAzIDIzOjI4OjMxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIHJ0cDogdXNlIEdMaWIncyBHX0JJR19FTkRJQU4gZGVmaW5lIGluc3RlYWQgb2YgQklHX0VORElBTgorCSAgRml4ZXMgY29tcGlsZXIgd2FybmluZyBvbiBtaW5ndzMyCisKKzIwMTEtMTEtMDMgMTY6NDM6MDAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHAuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1cGRhdGUgZm9yIG5ldyBuZXQgbGlicmFyeQorCisyMDExLTExLTAyIDEyOjA5OjIwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYW5ub2RleC9nc3RjbW1sZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0dGFnaW5qZWN0LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHRhZ3M6IHVwZGF0ZSBmb3IgdGFnIEFQSSByZW1vdmFsCisKKzIwMTEtMTEtMDIgMTA6NDA6MTIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0xMC0zMSAwMjo0MDowOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1cGRhdGUgZm9yIG5ldGJ1ZmZlciBhcGkgY2hhbmdlCisKKzIwMTEtMTAtMzEgMDI6MzU6NTEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHAuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1cGRhdGUgZm9yIG5ldGFkZHJlc3MgY2hhbmdlCisKKzIwMTEtMTAtMzEgMDI6MjQ6MDQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdXBkYXRlIGZvciBtZXRhIGFwaSBjaGFuZ2UKKworMjAxMS0xMC0yOSAwOToyOToyNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG1vb3ZyZWNvdmVyLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICB1cGRhdGUgZm9yIG5ldyB0YXNrIGFwaQorCisyMDExLTEwLTI5IDA5OjA5OjQ1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgc3RydWN0dXJlOiBmaXggZm9yIGFwaSB1cGRhdGUKKworMjAxMS0xMC0yOSAwODoyNToyNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBidWZmZXJsaXN0OiB1cGRhdGUgZm9yIG5ldyBBUEkKKworMjAxMS0xMS0wMSAwMDo0MDo0MCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgVXBkYXRlIGZvciBwYWQgQVBJIGNoYW5nZXMKKwkgIEdzdFByb2JlVHlwZSwgR3N0UHJvYmVSZXR1cm4gYW5kIEdzdEFjdGl2YXRlTW9kZSAtPiBHc3RQYWQqCisKKzIwMTEtMTAtMzEgMTg6Mzg6NTUgKzAxMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkgIGFjM3BhcnNlOiBmaXggb2J2aW91cyBjcmFzaAorCisyMDExLTEwLTMxIDE2OjE4OjMyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGF2b2lkIHNob3J0Y3V0IGV2YWx1YXRpb24gd2hlbiBhZGRpbmcgcGFpcmVkIG1wNCB0YWcKKwkgIEZpeGVzIChwYXJ0IG9mKSAjNjM4NzExLgorCisyMDExLTEwLTMxIDE1OjQzOjI1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGRvIG5vdCB1c2UgdW5vZmZpY2FsIFZfTUpQRUcgY29kZWMgaWQKKwkgIC4uLiBidXQgYXMgbm90IHNwZWMnZWQgZXNwZWNpYWxseSwgY29uc2lkZXIgaXQgYSBWZlcgY29tcGF0aWJpbGl0eSBjYXNlLgorCSAgRml4ZXMgIzY1OTgzNy4KKworMjAxMS0xMC0zMCAxOTozMDoxNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuaDoKKwkgIGZsYWNlbmM6IHJlbW92ZSBkZWFkIGNvZGUgZnJvbSBoZWFkZXIKKwkgIFdlIHJlcXVpcmUgYSBuZXctZW5vdWdoIGxpYmZsYWMgdGhhdCB0aGlzIGNvbmRpdGlvbiB3aWxsIG5ldmVyIGFwcGx5LgorCisyMDExLTEwLTMwIDE5OjA5OjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogcGFyc2Ugc3RyZWFtIGhlYWRlcnMgZnJvbSBjYXBzIGluIHNldF9mb3JtYXQgZnVuY3Rpb24KKwkgIE5vdCB0aGF0IHRoaXMgc2VlbXMgdG8gYmUgYWN0dWFsbHkgbmVlZGVkLCBsaWJmbGFjIGhhcHBpbHkgZGVjb2RlcworCSAgc3R1ZmYgZXZlbiBpZiB3ZSBqdXN0IGRyb3AgYWxsIGhlYWRlcnMgYW5kIG5ldmVyIGZlZWQgaXQgdG8gdGhlCisJICBsaWJyYXJ5LgorCisyMDExLTEwLTMwIDE4OjQ5OjIxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgZmxhY2RlYzogZG9uJ3QgZXh0cmFjdCBtZXRhZGF0YSwgbGVhdmUgdGhhdCB0byB0aGUgcGFyc2VyIG9yIGNvbnRhaW5lcgorCisyMDExLTEwLTMwIDE4OjQ1OjQ1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgZmxhY2RlYzogd2UgZXhwZWN0IGZyYW1lZCBpbnB1dCBub3csIHJlbW92ZSBzb21lIG1vcmUgY29kZQorCisyMDExLTEwLTA5IDE2OjE4OjA5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgZmxhY2RlYzogbmFpdmUgcG9ydCB0byBHc3RBdWRpb0RlY29kZXIKKwkgIFRoaXMgd291bGQgcHJvYmFibHkgaGF2ZSBiZWVuIHRvbyBpbnZhc2l2ZSB0byBkbyBpbiB0aGUgMC4xMAorCSAgYnJhbmNoLCB3aXRoIGFsbCB0aGUgcHVsbC1tb2RlIGFuZCBwYXJzZXIgaGFuZGxpbmcgY29kZSBpbgorCSAgdGhlcmUuCisKKzIwMTEtMTAtMzAgMTE6NDQ6NTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYW5ub2RleC9nc3RjbW1sZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIGV4dCwgZ3N0OiB1cGRhdGUgZm9yIHRhZ2xpc3QgQVBJIGNoYW5nZXMKKworMjAxMS0xMC0zMCAxMTo0MTozMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IGZpeCBjb21waWxhdGlvbiBvZiBhdWRpbyB0ZXN0cyBpbiB1bmluc3RhbGxlZCBzZXR1cAorCisyMDExLTEwLTI4IDIxOjI2OjMzICswMjAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmM6CisJICBhdWRpb3Bhbm9yYW1hOiBzaW1wbGlmeSBnZXRfdW5pdF9zaXplCisKKzIwMTEtMTAtMjggMjE6MTk6NDIgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZWNoby5jOgorCSAgdGVzdHM6IGF1ZGlvZWNobzogcG9ydCB0byAwLjExCisKKzIwMTEtMTAtMjggMjE6MTg6MzMgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSAgYXVkaW9lY2hvOiBmaXggaW50ZXJuYWwgYnVmZmVyIHNpemUgY2FsY3VsYXRpb24KKworMjAxMS0xMC0yOCAxNDowNTo0OCArMDIwMCAgUmVuw6kgU3RhZGxlciA8cmVuZS5zdGFkbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9jaGViYmFuZC5jOgorCSAgdGVzdHM6IGF1ZGlvY2hlYmJhbmQ6IHBvcnQgdG8gMC4xMQorCisyMDExLTEwLTI4IDE2OjUyOjA4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisKKzIwMTEtMTAtMjggMTU6MDg6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jOgorCSAgcHVsc2VhdWRpb3Npbms6IGZpeCBwb3J0aW5nIGVycm9ycworCSAgVGhlIHByb2JlcyB3ZXJlIHBvcnRlZCB3cm9uZ2x5IGFuZCBjYXVzZWQgZGVhZGxvY2tzLgorCisyMDExLTEwLTI4IDA5OjU3OjM2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogYWRkIHNvZi1tYXJrZXIgdG8gdGVtcGxhdGUgY2Fwcywgc28gd2UgZG9uJ3QgZ2V0IHBsdWdnZWQgZm9yIGxvc3NsZXNzIGpwZWcKKwkgIGpwZWdkZWMgKHVzaW5nIGxpYmpwZWcgNi4yLzgpIGNhbid0IGRlY29kZSBzb21lIGxvc3NsZXNzIHR5cGVzIG9mIEpQRUcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTU2NjQ4CisKKzIwMTEtMTAtMjggMTM6MDY6MjAgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmxpbWl0LmM6CisJICB0ZXN0czogYXVkaW9jaGVibGltaXQ6IHBvcnQgdG8gMC4xMQorCisyMDExLTEwLTI4IDEzOjAyOjU2ICswMjAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWlpcmZpbHRlci5jOgorCSAgYXVkaW9meDogZml4IGNyYXNoIGluIHByb2Nlc3MoKQorCisyMDExLTEwLTI4IDExOjQ4OjMxICswMjAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2FtcGxpZnkuYzoKKwkgIHRlc3RzOiBhdWRpb2FtcGxpZnk6IHBvcnQgdG8gMC4xMQorCisyMDExLTEwLTI4IDEyOjUxOjMxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VhdWRpb3NpbmsuYzoKKwkgIHB1bHNlOiBmaXggY2hlY2sgZm9yIGVtcHR5IGNhcHMKKworMjAxMS0xMC0yOCAxMjozMDozMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZWxhYm9yYXRlIHNvbWUgZGVidWcgc3RhdGVtZW50cworCisyMDExLTEwLTExIDIwOjU2OjUxICswNDAwICBTdGFzIFNlcmdlZXYgPHN0c3BAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogYmUgY2FyZWZ1bCB3aXRoIG5lZ2F0aXZlIGN0cworCSAgRml4ZXMgIzY2MTQ3Ny4KKworMjAxMS0xMC0wNiAxMzowNDo1NCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogdHVuZSBub24tdXBkYXRlIHNlZWsgaGFuZGxpbmcgY2FzZXMKKwkgIEZpeGVzICM2NjEwNDkuCisKKzIwMTEtMTAtMjggMTE6NDY6NDAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGdzdC92aWRlb21peGVyL2dzdGNvbGxlY3RwYWRzMi5jCisKKzIwMTEtMTAtMjggMTE6MTY6MzggKzAyMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jOgorCSAgYXVkaW9keW5hbWljOiBkb24ndCBzZXQgcHJvY2VzcyBmdW5jdGlvbiB0b28gZWFybHkKKwkgIEdzdEF1ZGlvSW5mbyBhbmQgR3N0QXVkaW9GaWx0ZXIgaGF2ZSBiZWVuIGNoYW5nZWQgc28gdGhhdCB0aGlzIGNvZGUgZG9lc24ndAorCSAgY3Jhc2ggYW55bW9yZSB3aGVuIGEgcHJvcGVydHkgaXMgc2V0IGluIE5VTEwgc3RhdGUuCisKKzIwMTEtMTAtMjggMTA6NDI6MDQgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZHluYW1pYy5jOgorCSAgdGVzdHM6IGF1ZGlvZHluYW1pYzogcG9ydCB0byAwLjExCisKKzIwMTEtMTAtMjggMDA6MjQ6MTQgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwZWN0cnVtLmM6CisJICB0ZXN0czogc3BlY3RydW06IHBvcnQgdG8gMC4xMQorCisyMDExLTEwLTI3IDIzOjU3OjE3ICswMjAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3Bhbm9yYW1hLmM6CisJICB0ZXN0czogYXVkaW9wYW5vcmFtYTogcG9ydCB0byAwLjExCisKKzIwMTEtMTAtMjcgMjM6NTY6MTIgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgIGF1ZGlvcGFub3JhbWE6IGZpeCBnZXRfdW5pdF9zaXplCisKKzIwMTEtMTAtMjggMTA6NDA6MzYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjI6IFVzZSB0aGUgY2xpcCBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZSBwcmVwYXJlX2J1ZmZlciBmdW5jdGlvbgorCisyMDExLTEwLTI4IDA5OjA1OjI3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgcnRwbWFuYWdlciwgdjRsMjogZml4IGNvbXBpbGVyIHdhcm5pbmdzIGFmdGVyIGdzdF9jYXBzX25ld19zaW1wbGUoKSBjaGFuZ2UKKworMjAxMS0xMC0yOCAwOTowMTo1NyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IGNvbXBpbGVyIHdhcm5pbmdzIGFmdGVyIGdzdF9jYXBzX25ld19zaW1wbGUoKSBjaGFuZ2UKKworMjAxMS0xMC0yOCAwOTozNjoxNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvZ3N0Y29sbGVjdHBhZHMyLmM6CisJKiBnc3QvdmlkZW9taXhlci9nc3Rjb2xsZWN0cGFkczIuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMnBhZC5oOgorCSAgdmlkZW9taXhlcjI6IFVzZSBjb2xsZWN0cGFkczIgZnJvbSBjb3JlCisKKzIwMTEtMTAtMjcgMTk6Mzk6MjAgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZlbmMvTWFrZWZpbGUuYW06CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSAgd2F2ZW5jOiBwb3J0IHRvIDAuMTEgcmF3IGF1ZGlvIGNhcHMKKworMjAxMS0xMC0yNyAxOTowNjowNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L2Zsdi9nc3RmbHZtdXguYworCisyMDExLTEwLTI3IDE5OjAwOjUyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJKiBnc3QvcnRwL1JFQURNRToKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkgIG1ha2Ugc29tZSBtb3JlIHRoaW5ncyBjb21waWxlIGFnYWluCisKKzIwMTEtMTAtMjcgMTY6MDg6MjIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jCisJICBleHQvcHVsc2UvcHVsc2VzaW5rLmMKKworMjAxMS0xMC0yNyAxNjowMzoxNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIGZpeCBjb21waWxhdGlvbgorCisyMDExLTEwLTI4IDAwOjQxOjQ1ICsxMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IERvbid0IHBvaW50bGVzc2x5IGhvbGQgb2JqZWN0IGxvY2sgb3ZlciBjYXBzIG9wZXJhdGlvbnMKKwkgIEF2b2lkcyBhIGRlYWRsb2NrIHdoZW4gZ2V0Y2FwcyBpcyByZWN1cnNpdmUgZHVlIHRvIHRoZSBnZXRjYXBzIGJlaW5nCisJICByZWZsZWN0ZWQgdXBzdHJlYW0vZG93bnN0cmVhbS4gVGhlIGxvY2sgaXNuJ3QgYWN0dWFsbHkgcHJvdGVjdGluZworCSAgYW55dGhpbmcgaGVyZS4KKworMjAxMS0xMC0yNyAwMDozNzowMyArMTEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBnc3QvZmx2L2FtZmRlZnMuaDoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IGFkZCBzb21lIGNvbW1lbnRzIGFuZCBkZWZpbmVzIHRvIGNsYXJpZnkgY29kZS4KKworMjAxMS0xMC0xMCAxNTozNjoxNCArMDIwMCAgUmVuw6kgU3RhZGxlciA8cmVuZS5zdGFkbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBlYm1sLXdyaXRlIHRvIGJlIG1vcmUgMC4xMSBmcmllbmRseQorCSAgU3dpdGNoaW5nIHRvIGEgbW9yZSAwLjExLWZyaWVuZGx5IHBhdHRlcm4sIHdoZXJlIGdldHRpbmcgdGhlIGJ1ZmZlcidzIGRhdGEKKwkgIHBvaW50ZXIgYW5kIHNldHRpbmcgdGhlIHNpemUgbWFueSB0aW1lcyBpcyBsZXNzIG5hdHVyYWwuIFRoaXMgaXMgb2YgY291cnNlIGluCisJICBwcmVwYXJhdGlvbiB0byB0aGUgdXBjb21pbmcgcG9ydCBvZiB0aGUgcGx1Z2luLgorCisyMDExLTEwLTExIDIxOjQ1OjQ2ICswMjAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSAgbWF0cm9za2E6IHJlbW92ZSBzdGFsZSBmbG9hdGNhc3QgaW5jbHVkZQorCSAgR0RPVUJMRV9UT19CRSB3YXMgbW92ZWQgdG8gY29yZSBhIGxvbmcgdGltZSBhZ28uCisKKzIwMTEtMTAtMTEgMjI6MTA6MjcgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPHJlbmUuc3RhZGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBmaXggcG9zc2libGUgY3Jhc2ggd2l0aCBtYWxmb3JtZWQgZGlyYWMgY29kZWNfZGF0YQorCSAgU2luY2Ugc2l6ZSBpcyB1bnNpZ25lZCwgd2UgbmVlZCB0byBzYWZlZ3VhcmQgYWdhaW5zdCB3cmFwcGluZyBiZWxvdyB6ZXJvLgorCisyMDExLTEwLTIxIDIyOjMzOjM0ICswMjAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgZXF1YWxpemVyOiByZW1vdmUgYXZvaWRhYmxlIGNhbGwgdG8gZ3N0X29iamVjdF9zZXRfbmFtZQorCisyMDExLTEwLTIxIDIyOjMyOjM4ICswMjAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiByZW1vdmUgYXZvaWRhYmxlIGNhbGwgdG8gZ3N0X29iamVjdF9zZXRfbmFtZQorCisyMDExLTEwLTIxIDE0OjUxOjIzICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VtaXhlcmN0cmwuaDoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkqIHN5cy9vc3MvZ3N0b3NzbWl4ZXIuaDoKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXIuYzoKKwkqIHN5cy9vc3M0L29zczQtc291cmNlLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50LmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJyYWRpby5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9vdmVybGF5LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkZW9vdmVybGF5Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkb3JpZW50LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkb3JpZW50Lmg6CisJICBpbnRlcmZhY2VzOiBjbGVhbiB1cCB0aGUgdXNlIG9mIGlmYWNlIGFuZCBjbGFzcy9rbGFzcworCisyMDExLTEwLTIxIDExOjM3OjA1ICswMTAwICBDaHJpc3RpYW4gRnJlZHJpayBLYWxhZ2VyIFNjaGFsbGVyIDxjaHJpc3RpYW4uc2NoYWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBVcGRhdGUgc3BlYyBmaWxlIHNvIGl0cyBwYXJhbGVsLWluc3RhbGxhYmxlIGFuZCBvbmx5IHRyaWVzIHRvIHBhY2thZ2UgcG9ydGVkIHBsdWdpbnMKKworMjAxMS0xMC0xNiAyMDozMDoyNSArMDIwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgIHBuZ2VuYzogaW5jcmVhc2UgYXJiaXRyYXJ5IHJlc29sdXRpb24gbGltaXRzCisJICBBcHBhcmVudGx5IGxpYnBuZyBjYW4gdGVjaG5pY2FsbHkgZG8gdXAgdG8gMl4zMS0xIHJvd3MgYW5kIGNvbHVtbnMuIEhvd2V2ZXIgaXQKKwkgIGltcG9zZXMgYW4gKGFyYml0cmFyeSkgZGVmYXVsdCBsaW1pdCBvZiAxIG1pbGxpb24gKHRoYXQgY291bGQgdGhlb3JldGljYWxseSBiZQorCSAgbGlmdGVkIGJ5IHVzaW5nIHNvbWUgYWRkaXRpb25hbCBBUEkpLgorCSAgTW92ZWQgYXJyYXkgYWxsb2NhdGlvbiB0byB0aGUgaGVhcCBub3cuCisKKzIwMTEtMTAtMTYgMjA6MjU6NDEgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJICBwbmdlbmM6IGRvbid0IHVuY29uZGl0aW9uYWxseSBhbGxvY2F0ZSA0MDk2IHBvaW50ZXJzIG9uIHRoZSBzdGFjaworCSAgSW5zdGVhZCBhbGxvY2F0ZSBhcyBtYW55IGFzIG5lZWRlZCAob24gdGhlIHN0YWNrIHN0aWxsKS4KKworMjAxMS0xMC0xNiAyMDowNToyOCArMDIwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgIHBuZ2VuYzogZW5zdXJlIHNldGNhcHMgd2FzIGNhbGxlZCBiZWZvcmUgY2hhaW4gZnVuY3Rpb24KKwkgIFRoaXMgaXMgbmVlZGVkIHRvIHByb3Blcmx5IGVycm9yIG91dCBmb3IgZS5nLiAiZmFrZXNyYyAhIHBuZ2VuYyAhIGZha2VzaW5rIi4KKworMjAxMS0xMC0xNiAxOTo0NDoyNyArMDIwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgIHBuZ2VuYzogdmFsaWRhdGUgaW5wdXQgYnVmZmVyIHNpemUKKwkgIEp1c3QgZm9yIHNhZmV0eTsgb2YgY291cnNlIHN1Y2ggbWlzbWF0Y2ggcmVwcmVzZW50cyBhIGJ1ZyBpbiBhbm90aGVyIGVsZW1lbnQuCisKKzIwMTEtMTAtMTYgMTk6NDE6MjggKzAyMDAgIFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkqIGV4dC9saWJwbmcvTWFrZWZpbGUuYW06CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuaDoKKwkgIHBuZ2VuYzogbWFrZSBzZXRjYXBzIG1vcmUgcm9idXN0LCB1c2UgZ3N0dmlkZW8gZnVuY3Rpb25zCisJICBBIHNldGNhcHMgZnVuY3Rpb24gbmVlZHMgdG8gYWN0dWFsbHkgdmVyaWZ5IHRoZSBjYXBzIGNhcmVmdWxseS4gSW4gdGhpcyBjYXNlLAorCSAgaXQgd2FzIHBvc3NpYmxlIHRvIGUuZy4gbGluayBhIHZpZGVvIGRlY29kZXIgd2l0aCBZVVYrUkdCIHRlbXBsYXRlIGNhcHMgdG8KKwkgIHBuZ2VuYy4gIFRoYXQgd291bGQgY2F1c2UgYSBjcmFzaCB3aGVuIHRoZSBkZWNvZGVyIHB1c2hlcyBhIFlVViBidWZmZXIuIFNhbWUKKwkgIHRoaW5nIHdoZW4gcHVzaGluZyBhIHZhbGlkIGJ1ZmZlciB0aGF0IGV4Y2VlZHMgdGhlIHJlc29sdXRpb24gbGltaXRzLgorCSAgQWxzbywgbWlzc2luZyBmcmFtZXJhdGUgY2FwcyBmaWVsZCB3b3VsZCBjYXVzZSBhIGdsaWIgY3JpdGljYWwgd2FybmluZyBkdWUgdG8KKwkgIGludmFsaWQgR1ZhbHVlLiBUaGlzIGZhaWxzIGhhcmQgbm93LgorCisyMDExLTEwLTIxIDEwOjAxOjQzICswMjAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkgIGVibWw6IHNtYWxsIGNvcnJlY3Rpb24gdG8gcHJldmlvdXMgY29tbWl0CisJICBTaWduYWwgYSBzaG9ydCByZWFkIHdpdGggVU5FWFBFQ1RFRCwgZXhhY3RseSBsaWtlIHRoZSBwZWVrX2J5dGVzIGZ1bmN0aW9uLgorCisyMDExLTEwLTE5IDEzOjA5OjUxICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBlYm1sOiBGaXggcHVzaC1iYXNlZCBiZWhhdmlvdXIKKwkgIFRoZSAncGVlaycgbWV0aG9kIHdhcyBjb21wbGV0ZWx5IHdyb25nICghPykKKworMjAxMS0xMC0xOCAxODozMToxNyArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jOgorCSAgcHVsc2U6IEdldCBjYXBzIGNvcnJlY3RseSBvbiBwYWQgYmxvY2sKKwkgIEluc3RlYWQgb2YgYWx3YXlzIGdvaW5nIHVwc3RyZWFtLCB3ZSBzaG91bGQgZmlyc3Qgc2VlIGlmIGFscmVhZHkgZ290CisJICBjYXBzIGZyb20gYSBzZXRjYXBzKCkgY2FsbC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjEyNjIKKworMjAxMS0xMC0xOCAxMjoyNToxNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzoKKwkgIHdhdnBhY2tlbmM6IGRvbid0IHVucmVmIGJ1ZmZlciB3aXRoIGdzdF9vYmplY3RfdW5yZWYoKQorCisyMDExLTEwLTE4IDEyOjA1OjAxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IG9ubHkgdXNlIGlzX3BjbSBmb3IgMS4wIG9mIHB1bHNlYXVkaW8KKworMjAxMS0xMC0xOCAxMTo1ODo1NyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBvbmx5IGRpc2FibGUgdHJpY2ttb2RlcyBmb3IgIXBjbQorCSAgT25seSBkaXNhYmxlIHRyaWNrbW9kZXMgd2hlbiB3ZSBhcmUgbm90IGRlYWxpbmcgd2l0aCByYXcgUENNIHNhbXBsZXMuCisKKzIwMTEtMTAtMTYgMTU6MzI6NTAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJICB2aWRlb2Nyb3A6IGZpeCBjb21waWxhdGlvbgorCisyMDExLTEwLTE2IDE1OjI2OjM4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jCisKKzIwMTEtMTAtMTQgMTA6NTY6MTYgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjI6IEZpeCBhIGxlYWsKKwkgIEJ1ZmZlcnMgd2VyZW4ndCBiZWluZyB1bnJlZidlZCBpbiBvbmUgY2FzZSBpbnNpZGUsIGNhdXNpbmcgbWVtb3J5IHVzYWdlCisJICB0byBibG93IHVwLgorCisyMDExLTEwLTE0IDA5OjEwOjAxICswMjAwICBNYXJjIExlZW1hbiA8bWFyYy5sZWVtYW5AZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSAgc2V0IGNvbG91ciBtYXNrcyBmb3IgdmlkZW8veC1yYXctcmdiIGluIHJ0cHZyYXdkZXBheQorCisyMDExLTEwLTEzIDAxOjA1OjEzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogcmUtZW5hYmxlIHZpZGVvY3JvcCBwbHVnaW4KKwkgIEFscmVhZHkgcG9ydGVkIHRvIDAuMTEKKworMjAxMS0xMC0xMyAwMTowNTowNCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuaDoKKwkgIGFzcGVjdHJhdGlvY3JvcDogUG9ydCB0byAwLjExCisKKzIwMTEtMTAtMTMgMDA6Mzk6MjggLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3ZpZGVvY3JvcC9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5oOgorCSAgdmlkZW9jcm9wOiBQb3J0IHRvIDAuMTEKKworMjAxMS0xMC0xMiAxNzo0Mzo0NyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hc3BlY3RyYXRpb2Nyb3AuYzoKKwkgIHRlc3RzOiBhc3BlY3RyYXRpb2Nyb3A6IFBvcnQgdG8gMC4xMQorCisyMDExLTEwLTEyIDA4OjI0OjI4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FscGhhY29sb3IuYzoKKwkgIHRlc3RzOiBhbHBoYWNvbG9yOiBQb3J0IHRvIDAuMTEKKworMjAxMS0xMC0xMyAxNzoxMjoyMyArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IFByb3Blcmx5IHJlZ2lzdGVyIHR5cGUKKwkgIEl0J3MgYSBzdWJjbGFzcyBvZiBHc3RBdWRpb0VuY29kZXIgYW5kIG5vdCBvZiBHc3RFbGVtZW50CisKKzIwMTEtMTAtMTMgMTY6NTk6NTAgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjI6IEZpeCBpbmNvcnJlY3QgZ3N0X2J1ZmZlcl9yZXBsYWNlKCkgY2FsbAorCSAgVGhpcyBnb3QgZXhwb3NlZCB3aGVuIGdzdF9idWZmZXJfcmVwbGFjZSgpIHdhcyBjaGFuZ2VkIGZyb20gYSBtYWNybyB0byBhCisJICBmdW5jdGlvbi4KKworMjAxMS0xMC0xMyAwOTozNDowNCArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgcnRwc3NyY2RlbXV4OiBGaXggd3JvbmcgdXNhZ2Ugb2YgZ3N0X2l0ZXJhdG9yX2ZpbHRlcgorCSAgSXQgdGFrZXMgYSBHVmFsdWUqIGFzIHRoZSB1c2VyX2RhdGEuCisJICBBbmQgZG9uJ3QgZm9yZ2V0IHRvIHVucmVmIHRoZSBkZW11eGVyIGJlZm9yZSByZXR1cm5pbmcuCisKKzIwMTEtMTAtMTMgMDk6MDI6NDcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGZpeCBjb21waWxlCisKKzIwMTEtMTAtMTMgMDg6NTg6MDYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9qcGVnL2dzdGpwZWdkZWMuYworCSAgZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmMKKworMjAxMS0xMC0xMiAwODowOToyMCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZW5jLmM6CisJICB0ZXN0czogY21tbGVuYzogUG9ydCB0byAwLjExCisKKzIwMTEtMTAtMTIgMDg6MDI6MDggLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGRlYy5jOgorCSAgdGVzdHM6IGNtbWxkZWM6IFBvcnQgdG8gMC4xMQorCisyMDExLTEwLTEyIDA3OjI5OjMwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZWF1ZGlvc2luay5jOgorCSAgcHVsc2VhdWRpb3Npbms6IFVzZSBuZXcgR3N0SXRlcmF0b3IgQVBJIGNvcnJlY3RseQorCSAgR3N0SXRlcmF0b3Igbm93IHVzZXMgR1ZhbHVlLCB1c2UgaXQgY29ycmVjdGx5LgorCisyMDExLTEwLTEyIDExOjI2OjUwICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJICBydHB2cmF3cGF5OiBPbmx5IHVzZSAyNCBMU0IgZm9yIGRlcHRoPTI0IFJHQiBjYXBzCisJICAuLi4gYW5kIGluZGVudCB0aGUgbWFza3MgZm9yIGNsYXJpdHkKKworMjAxMS0xMC0xMSAxNDo1ODo0MyArMDIwMCAgUmVuw6kgU3RhZGxlciA8cmVuZS5zdGFkbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGZpeCBzZWdtZW50IGhhbmRsaW5nLCBzbyB3ZSBhY3R1YWxseSB1c2UgcnVubmluZyB0aW1lCisJICBnc3RfbWF0cm9za2FfbXV4X2Jlc3RfcGFkIGFkanVzdHMgdGhlIGJ1ZmZlciB0aW1lc3RhbXAgdG8gcnVubmluZyB0aW1lIHVzaW5nCisJICB0aGUgc2VnbWVudCBzdG9yZWQgaW4gdGhlIHBhZCdzIGNvbGxlY3QgZGF0YS4gSG93ZXZlciwgdGhlIGV2ZW50IGhhbmRsZXIgZGlkbid0CisJICBwYXNzIHRoZSBuZXdzZWdtZW50IGV2ZW50IG9uIHRvIGNvbGxlY3RwYWRzJyBoYW5kbGVyLCBzbyB0aGlzIHNlZ21lbnQgd2FzIG5ldmVyCisJICB1cGRhdGVkIGF0IGFsbC4KKwkgIFJlLWZpeGVzIGJ1ZyAjNDMyNjEyLgorCisyMDExLTEwLTEwIDE5OjAxOjIzICswMTAwICBTam9lcmQgU2ltb25zIDxzam9lcmQuc2ltb25zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnNzIycGF5LmM6CisJICBnc3RydHBnNzIycGF5OiBDb21wZW5zYXRlIGZvciBjbG9ja3JhdGUgdnMuIHNhbXBsZXJhdGUgZGlmZmVyZW5jZQorCSAgVGhlIFJUUCBjbG9jay1yYXRlIHVzZWQgZm9yIEc3MjIgaXMgODAwMCwgZXZlbiB0aG91Z2ggdGhlIHNhbXBsZXJhdGUgaXMKKwkgIDE2MDAwLiBDb21wZW5zYXRlIGZvciB0aGlzIGJ5IHByZXRlbmRpbmcgRzcyMiBoYXMgOCBiaXRzIHBlciBzYW1wbGUKKwkgIGluc3RlYWQgb2YgdGhlIDQgYml0cyBhcyBpZiBpdCB3ZXJlIGEgY29kZWMgdGhhdCByYW4gYXQgaGFsZiB0aGUgc3BlZWQsCisJICBidXQgd2l0aCB0d2ljZSB0aGUgbnVtYmVyIG9mIGJpdHMuIEZpeGVzICM2NjEzNzYKKworMjAxMS0wOS0yNyAxOToyNTo1MyArMDEwMCAgU2pvZXJkIFNpbW9ucyA8c2pvZXJkLnNpbW9uc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IEltcGxlbWVudCB1cHN0cmVhbSBuZWdvdGlhdGlvbgorCSAgQWRkIHVwc3RyZWFtIG5lZ290aWF0aW9uIGZvciBqcGVnZGVjLiBGaXhlcyAjNjYwMjc1CisKKzIwMTEtMTAtMTAgMTk6MDI6NTggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thLWRlbXV4OiBkb24ndCBsZWFrIGF1ZGlvIGNvZGVjX2RhdGEgYnVmZmVyCisKKzIwMTEtMTAtMTAgMTc6NDE6MTAgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJICBhbHBoYTogRG9uJ3QgdXNlIHN0YXJ0KCkgdm1ldGhvZAorCSAgVGhlIG9ubHkgdGhpbmcgd2UncmUgZG9pbmcgaXMgaW5pdGlhbGl6aW5nIHBhcmFtZXRlcnMgLi4uCisJICAqIHdoaWNoIHdvbid0IHdvcmsgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHVwc3RyZWFtL2Rvd25zdHJlYW0gY2FwcworCSAgKiB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkIHdoZW4gOjpzZXRfY2FwcygpIGlzIGNhbGxlZAorCisyMDExLTEwLTEwIDE0OjA4OjI5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisKKzIwMTEtMTAtMTAgMTM6MjI6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOgorCSAgaWQzZGVtdXg6IHBvcnQgdG8gMC4xMQorCisyMDExLTEwLTEwIDEzOjIwOjA0ICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9jYWlyby9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBhZGQgbWlzc2luZyBQTFVHSU5fQVNFX0xJQlMgdG8gTERBREQKKworMjAxMS0xMC0xMCAxMjo1NDoyMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJICBpY3lkZW11eDogcG9ydCB0byAwLjExCisKKzIwMTEtMTAtMTAgMTI6Mjc6MDYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxlbmMuYzoKKwkgIGFubm9kZXg6IHBvcnQgdG8gMC4xMQorCisyMDExLTEwLTEwIDExOjQ4OjIwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYworCisyMDExLTEwLTEwIDAwOjE4OjU2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuaDoKKwkgIHB1bHNlOiBwb3J0IHB1bHNldXRpbCB0byAwLjExCisKKzIwMTEtMTAtMDkgMjE6MTc6MjQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJICBwdWxzZWF1ZGlvc2luazogcG9ydCB0byAwLjExCisKKzIwMTEtMTAtMDkgMTg6NTg6MjkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBGaXhpbmcgZ2V0Y2FwcyBmdW5jdGlvbgorCSAgVXBkYXRlIGdldGNhcHMgZnVuY3Rpb24gdG8gMC4xMSBBUEkKKworMjAxMS0xMC0wOSAyMTozMToyNyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmg6CisJICBzcGVleGVuYzogb25seSBwdXNoIGhlYWRlciBidWZmZXJzIGZvbGxvd2luZyBpbml0aWFsIGV2ZW50cworCisyMDExLTEwLTA5IDE2OjI5OjA1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgcmVtb3RlLXRyYWNraW5nIGJyYW5jaCAnb3JpZ2luL21hc3RlcicgaW50byAwLjExCisKKzIwMTEtMTAtMDkgMTY6MjQ6MzYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5jOgorCSAgcXRkZW11eDogdXBkYXRlIGZvciBfX2dzdF9kZWJ1Z19taW4gbmFtZSBjaGFuZ2UKKworMjAxMS0xMC0wOSAxMToxODoxOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvaXNvbXA0L2F0b21zcmVjb3ZlcnkuYzoKKwkgIHF0bXV4OiBGaXggbWVtb3J5IGxlYWsgb24gYXRvbXMgcmVjb3ZlcnkgZnVuY3Rpb24KKwkgIFJlbWVtYmVyIHRvIGZyZWUgdGhlIGZ0eXAgZGF0YSBhZnRlciB3cml0aW5nIGl0IHRvIGEgZmlsZS4KKwkgIEZpeGVzICM2NjA5NjkKKworMjAxMS0xMC0wNiAxMjoyNjozMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHJlcG9ydCBuZXcgYml0cworCisyMDExLTEwLTA2IDEyOjIzOjM5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYworCSAgZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmMKKwkgIGdzdC9pc29tcDQvYXRvbXMuYworCSAgZ3N0L2lzb21wNC9nc3RxdG11eC5jCisKKzIwMTEtMDktMjEgMTg6NDU6NDIgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgbWF0cm9za2FkZW11eDogaW1wcm92ZSBzZWdtZW50IGhhbmRsaW5nIHdpdGggbm9uLXplcm8gc3RhcnRpbmcgdGltZXN0YW1wCisJICAuLi4gYXMgd2VsbCBhcyByZWxhdGVkIGl0ZW1zLCBzdWNoIGFzIHNlZWtpbmcgYW5kIHBvc2l0aW9uIHJlcG9ydGluZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTk4MDgKKworMjAxMS0wOS0yOSAxODo0MTo1MyArMDQwMCAgU3RhcyBTZXJnZWV2IDxzdHNwQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHY0bDIsIHhpbWFnZXNyYzogZml4IHNvbWUgcHJpbnRmIGZvcm1hdCBjb21waWxlciB3YXJuaW5ncworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2MDE1MAorCisyMDExLTA5LTMwIDEyOjQyOjIyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIHRlc3RzOiBxdG11eDogUmVmYWN0b3IgYml0cmF0ZSBjaGVjayB0ZXN0CisJICBSZWZhY3RvciBiaXRyYXRlIGNoZWNrIHRlc3QgdG8gYWNjb21vZGF0ZSBtdWx0aXBsZSB0ZXN0cworCSAgZm9yIGJpdHJhdGUKKworMjAxMS0wOS0zMCAxMzowMjozMSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkgIHF0bXV4OiB1cGRhdGUgZXNkcyBhdG9tIHVuZGVyIHdhdmUgYXRvbSBmb3IgYWFjIGJpdHJhdGVzCisJICBBQUMgaW4gbW92IGZvcm1hdCBwdXRzIGFuIEVTRFMgYXRvbSBpbnNpZGUgb2YgYSBXQVZFIGF0b20gaW4KKwkgIFNUU0QgYXRvbSwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGJpdHJhdGUgb24gdGhpcyBFU0RTLiBUaGlzIHBhdGNoCisJICBmaXhlcyBpdC4KKworMjAxMS0wOS0zMCAxMjo0MTo1MiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvZm91cmNjLmg6CisJICBxdG11eDogQWxzbyB1cGRhdGUgYnRydCBhdG9tCisJICBXaGVuIHJld3JpdGluZyBiaXRyYXRlcywgYWxzbyB1cGRhdGUgdGhlIGJ0cnQgYXRvbSB1bmRlciBzdHNkCisKKzIwMTEtMDktMzAgMTA6NTU6NTMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgdGVzdHM6IHF0bXV4OiBhZGQgdGVzdHMgZm9yIGJpdHJhdGUgYXZlcmFnZSBjYWxjdWxhdGlvbgorCSAgQWRkcyB0ZXN0cyB0byBtYWtlIHN1cmUgcXRtdXgvbXA0bXV4IHNldHMgYXZlcmFnZSBiaXRyYXRlCisJICBjb3JyZWN0bHkKKworMjAxMS0wOS0yOCAxMTo0MTo0OSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvYXRvbXMuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBDYWxjdWxhdGUgYXZlcmFnZSBiaXRyYXRlIGZvciBzdHJlYW1zCisJICBDYWxjdWxhdGUgYW5kIHVzZSBhdmVyYWdlIGJpdHJhdGUgZm9yIHN0cmVhbXMgd2hlbiBubworCSAgYml0cmF0ZSB0YWcgd2FzIHJlY2VpdmVkCisKKzIwMTEtMDktMjggMTA6NDE6MTQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogQXZvaWQgYSBidWZmZXIgbWV0YWRhdGEgY29weSBpZiBwb3NzaWJsZQorCSAgSWYgZmlyc3RfdHMgaXMgMCB0aGVyZSBpcyBubyBuZWVkIHRvIHN1YnRyYWN0LCBzbyB3ZSBtaWdodAorCSAgc2tpcCBzb21lIGNvcHlpbmcgdG8gbWFrZSB0aGUgYnVmZmVyIG1ldGFkYXRhIHdyaXRhYmxlLgorCisyMDExLTA5LTI5IDIzOjIxOjQ2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJICBzcGVleGVuYzogaW5pdGlhbGlzZSB2YXJpYWJsZSBiZWZvcmUgYWRkaW5nIHRvIGl0CisKKzIwMTEtMDktMjkgMTc6MjE6MjIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5oOgorCSAgc3BlZXhkZWM6IHBvcnQgdG8gYXVkaW9kZWNvZGVyCisKKzIwMTEtMDktMjkgMTY6MzM6MDEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuaDoKKwkgIHNwZWV4ZW5jOiBjbGVhbiB1cCBzb21lIHVudXNlZCByZW1uYW50cworCisyMDExLTA5LTI5IDE3OjMyOjIzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NwZWV4L01ha2VmaWxlLmFtOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuaDoKKwkgIHNwZWV4ZW5jOiBwb3J0IHRvIGF1ZGlvZW5jb2RlcgorCisyMDExLTA5LTI4IDE5OjEwOjI3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogZ2V0IHJpZCBvZiBncmFudWxlcG9zIGhhbmRsaW5nCisJICBMZWF2ZSB0aGF0IHRvIHRoZSBwYXJzZXIgb3IgZGVtdXhlci4gVGhlcmUncyBzdGlsbCBzb21lCisJICBjb2RlIGZvciBvcGVyYXRpbmcgaW4gREVGQVVMVCAoc2FtcGxlcykgZm9ybWF0LCBidXQgdGhhdAorCSAgd2lsbCBiZSByZW1vdmVkIGxhdGVyLgorCisyMDExLTA5LTI4IDE4OjMyOjAwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgZmxhY2RlYzogZ2V0IHJpZCBvZiBwdWxsLW1vZGUgc3VwcG9ydCBhbmQgZm9jdXMgb24gYmVpbmcgYSBkZWNvZGVyCisJICBMZWF2ZSBhbGwgdGhlIG90aGVyIHN0dWZmIHRvIGZsYWNwYXJzZS4KKworMjAxMS0wOS0yOCAxNzoyOTowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGZsYWMsIGpwZWc6IGZpeCBjb21waWxlciB3YXJuaW5nCisKKzIwMTEtMDktMjggMTc6NDA6MDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkgIGZsYWM6IHBvcnQgdG8gMC4xMQorCisyMDExLTA5LTI4IDE3OjM5OjEyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBleHQvZmxhYy9nc3RmbGFjZW5jLmMKKworMjAxMS0wOS0yOCAxNjoxODo1NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDExLTA5LTI4IDE2OjA5OjU4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvTWFrZWZpbGUuYW06CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmg6CisJICBmbGFjZW5jOiBwb3J0IHRvIGF1ZGlvZW5jb2RlcgorCisyMDExLTA5LTI3IDE1OjU5OjI0ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thZGVtdXg6IGVuc3VyZSBtaW5pbWFsIGFsaWdubWVudCBmb3IgYXVkaW8veC1yYXctKiBidWZmZXJzCisJICBTaW5jZSBtYXRyb3NrYWRlbXV4IHdpbGwgYXR0ZW1wdCB0byBwdXNoIHVuYWxpZ25lZCBidWZmZXJzLAorCSAgZG93bnN0cmVhbSBtaWdodCBoYXZlIHRyb3VibGUgd2l0aCB0aG9zZSwgZXNwZWNpYWxseSBpZiBkb3duc3RyZWFtCisJICB1c2VzIE9SQywgc3VjaCBhcyBhdWRpb2NvbnZlcnQuCisJICBFbnN1cmUgd2UgcHVzaCBidWZmZXJzIGFsaWduZWQgdG8gdGhlIGJhc2ljIHR5cGUgYXQgbGVhc3QgZm9yCisJICB0aG9zZSByYXcgYnVmZmVycy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTk3OTgKKworMjAxMS0wOS0yOCAxMjo0NDo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgY29tbW9uCisJICBleHQvcHVsc2UvcHVsc2VzaW5rLmMKKwkgIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5jCisJICBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmMKKwkgIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYworCSAgZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmMKKwkgIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmMKKwkgIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmMKKworMjAxMS0wOS0yOCAwMDoxMDowOSArMDMwMCAgUmFpbW8gSsOkcnZpIDxyYWltby5qYXJ2aUBnbWFpbC5jb20+CisKKwkqIGdzdC9nb29tMmsxL2dvb21fY29yZS5jOgorCSAgZ29vbTJrMTogRml4IGNvbXBpbGVyIHdhcm5pbmdzIG9uIDY0IGJpdCBtaW5ndy13NjQKKwkgIEZpeGVzIGJ1ZyAjNjYwMjk0LgorCisyMDExLTA5LTI1IDE1OjEzOjM5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvTWFrZWZpbGUuYW06CisJKiBleHQvc291cC9nc3Rzb3VwLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5oOgorCSAgc291cDogcmVuYW1lIHNvdXBodHRwc2luayB0byBzb3VwaHR0cGNsaWVudHNpbmsKKwkgIFRvIGF2b2lkIGNvbmZ1c2lvbiwgYW5kIGJlY2F1c2Ugd2UgbWlnaHQgd2FudCBhIHNlcnZlcgorCSAgc2luayBhdCBzb21lIHBvaW50IHRvby4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTk5NDcKKworMjAxMS0wOS0yMyAxNjozOTo0NiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc2luay5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzaW5rLmg6CisJICBzb3VwaHR0cHNpbms6IGRvbid0IGNyZWF0ZSB1bnVzZWQgc2Vjb25kIHNpbmsgcGFkIG9iamVjdAorCSAgVGhlIGJhc2UgY2xhc3Mgd2lsbCBjcmVhdGUgdGhlIHNpbmsgcGFkLgorCisyMDExLTA5LTIzIDE1OjM2OjM2ICswMjAwICBKdWxpZW4gSXNvcmNlIDxqdWxpZW4uaXNvcmNlQGdtYWlsLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IGNvcnJlY3RseSBjaGVjayBmb3IgYWMzL2UtYWMzIHN3aXRjaAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1OTk0MworCisyMDExLTA5LTIxIDE0OjAxOjIwICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBjb21tb246CisJICBVcGRhdGUgY29tbW9uIHRvIDAuMTEgYnJhbmNoCisKKzIwMTEtMDktMjAgMTM6Mzg6NTMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgcnRwaDI2NGRlcGF5OiBpbXByb3ZlIGRvd25zdHJlYW0gZmxvdyByZXR1cm4gZmVlZGJhY2sgdG8gdXBzdHJlYW0KKwkgIC4uLiBhbHRob3VnaCBiYXNlcnRwZGVwYXkgZG9lcyBub3QgcmVhbGx5IG1ha2UgaXQgZWFzeS9wb3NzaWJsZSB0byBkbyBzbworCSAgYWxsIHRoZSB3YXkuCisKKzIwMTEtMDktMjAgMTI6MTE6NDcgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuaDoKKwkgIHhpbWFnZXNyYzogYWRkIHhpZCBhbmQgeG5hbWUgcHJvcGVydGllcyB0byBhbGxvdyBjYXB0dXJpbmcgYSBwYXJ0aWN1bGFyIHdpbmRvdworCSAgQSBwYXJ0aWN1bGFyIHdpbmRvdyBtYXkgYmUgc2VsZWN0ZWQgdXNpbmcgdGhlIG5ldyB4aWQgKFgtV2luZG93CisJICBYSUQsIGVnIGEgcG9pbnRlcikgYW5kIHhuYW1lICh3aW5kb3cgdGl0bGUpIHByb3BlcnRpZXMuIElmIGJvdGgKKwkgIGFyZSBzcGVjaWZpZWQsIHRoZSBYSUQgaXMgdXNlZCBpbiBwcmVmZXJlbmNlLCBmYWxsaW5nIGJhY2sgdG8KKwkgIHhuYW1lIGlmIG5vdCBmb3VuZC4KKwkgIERlZmF1bHQgKGlmIG5vbmUgb2YgeGlkIGFuZCB4bmFtZSBhcmUgc3BlY2lmaWVkLCBvciBpZiBubyBzdWNoCisJICB3aW5kb3cgaXMgZm91bmQpIGlzIHRvIGNhcHR1cmUgdGhlIHJvb3Qgd2luZG93LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU0NjkzMgorCisyMDExLTA4LTAyIDE3OjM5OjQ0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIHRlc3RzOiBhZGQgdW5pdCB0ZXN0IHRvIG1ha2Ugc3VyZSBlbmNvZGViaW4gcGlja3MgbXA0bXV4IGZvciB2YXJpYW50PWlzbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MTQ5NgorCisyMDExLTA5LTE5IDEyOjE1OjExICswMjAwICBIYSBOZ3V5ZW4gPGhhbmd1eXR2QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IEZpeCBhIGxlYWtlZCBjbG9jayBmb3IgZWFjaCBidWZmZXJpbmcgbWVzc2FnZQorCSAgRml4ZXMgYnVnICM2NTkyMzcuCisKKzIwMTEtMDktMTkgMTI6MTE6MzIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IHBhcnNlIGVtYmVkZGVkIElEMzIgdGFncworCisyMDExLTA5LTAyIDEzOjQxOjQxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzZXNzaW9uOiBhdm9pZCBzb3VyY2UgcHJlbWF0dXJlIHRpbWluZyBvdXQKKwkgIFVzZSBzbGlnaHRseSBhZGp1c3RlZCBzZW5kZXIgaW50ZXJ2YWwgdG8gZGV0ZXJtaW5lIHNlbmRlciB0aW1lb3V0IHJhdGhlciB0aGFuCisJICBvdXIgb3duIHNlbmRlciBzaWRlIGludGVydmFsICh3aGljaCBtYXkgaGF2ZSBiZWVuIGZvcmNlZCBzbWFsbCkuCisKKzIwMTEtMDgtMjUgMTI6NDA6NTIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBzZXNzaW9uOiBhdm9pZCB0aW1pbmcgb3V0IHNvdXJjZSB0b28gcXVpY2tseQorCSAgLi4uIGZvbGxvd2luZyBhIFBBVVNFL1BMQVkgY3ljbGUsIHBhcnRpY3VsYXJseSBhcHBsaWNhYmxlIHdoZW4gb3BlcmF0aW5nCisJICB3aXRoIGEgc2hvcnQgUlRDUCBpbnRlcnZhbCAocG9zc2libHkgZm9yY2VkIHNvIHNlcnZlci1zaWRlKS4KKworMjAxMS0wOC0yNCAxNDozNzo1MiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXIvcnRwYmluOiByZWxheCBkcm9wcGluZyBydGNwIHBhY2tldHMKKwkgIC4uLiB0byBhdCBsZWFzdCBoYXZpbmcgaXQgdHJpZ2dlciBhL3Ygc3luY2hyb25pemF0aW9uLCBwb3NzaWJseSB3aXRob3V0CisJICB1c2luZyBwcm92aWRlZCB2YWx1ZXMgd2hpY2ggYXJlIHN0aWxsIG5vdCBjb25zaWRlcmVkIHNhbmUKKwkgIChhcyBwcmV2aW91c2x5IGRyb3BwZWQpLgorCisyMDExLTA4LTI0IDE0OjM0OjIzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHNvbWUgbW9yZSByZXNldCB3aGVuIGNsZWFyaW5nIHB0IG1hcAorCSAgLi4uIHdoaWNoIGluIHBhcnRpY3VsYXIgY2F0ZXJzIGZvciBzb21lIG1vcmUgcmVzZXQgZm9sbG93aW5nIGEgcG9zc2libGUKKwkgIHJ0c3AgUExBWS4KKworMjAxMS0wOC0yMSAyMTo1ODozOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRvIG5vdCBzZXQgZWxlbWVudHMgdG8gUExBWUlORyB3aGVuIGRvaW5nIHNlZWsgaW4gUEFVU0VECisKKzIwMTEtMDktMDEgMTQ6NDc6NDggKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogb25seSByZXNldCBza2V3IG9uIGdhcCBpZiBpbnB1dCB0cyBhdmFpbGFibGUKKworMjAxMS0wOC0xOCAxNDoxMjoyMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBjaGVjayBzb21lIG1vcmUgZm9yIHBvc3NpYmxlIHJ0cCB0aW1lc3RhbXAgZGlzY29udGludWl0eQorCSAgLi4uIHdoZW4gb3BlcmF0aW5nIGluIG5vbiBzbGF2ZSBtb2RlLCBhbmQgcmVzZXQgaWYgZGV0ZWN0ZWQuCisJICBUaGlzIHNob3VsZCBhdm9pZCBzb21lIChsYXJnZSkgYm9ndXMgb3V0Z29pbmcgdGltZXN0YW1wIGR1ZSB0byBqdW1wcworCSAgaW4gcnRwIHRpbWUsIGFzIHJlc3VsdCBvZiBQQVVTRS9QTEFZIG9yIHNlZWsgb3IgLi4uCisKKzIwMTEtMDgtMDggMTI6NDg6NTAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBzd2l0Y2ggdG8gcnRwIHRpbWUgYmFzZWQgc3luY2luZyB3aGVuIGd1ZXNzZWQgYXBwcm9wcmlhdGUKKworMjAxMS0wOC0wOCAxMjoxNToyMCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICBydHBiaW46IGFsdGVybmF0aXZlIGludGVyLXN0cmVhbSBzeW5jaW5nIG1ldGhvZHMKKwkgIC4uLiBhdCBsZWFzdCBpZiBub3Qgc3luY2luZyB0byBOUFQgdGltZToKKwkgICogZWl0aGVyIHN5bmMgdXNpbmcgUlRDUCBTUiBkYXRhIChhcyBjdXJyZW50bHkpCisJICAqIG9ubHkgcGVyZm9ybSB0aGUgYWJvdmUgb25jZSB1c2luZyBpbml0aWFsIFJUQ1AgU1IgcGFja2V0cworCSAgKiBkaXNjYXJkIFJUQ1AgYW5kIHN5bmMgYnkgZXF1YXRpbmcgcHJvdmlkZWQgc3RyZWFtJ3MgY2xvY2stYmFzZSBydHB0aW1lLAorCSAgYXMgcHJvdmlkZWQgYnkgaml0dGVyYnVmZmVyICh0eXBpY2FsbHkgb2J0YWluZWQgZnJvbSBSVFAtSW5mbyBpbiBSVFNQKS4KKworMjAxMS0wOC0wOCAxMjoxMToyNCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBhbHNvIHByb3ZpZGUgY2xvY2stYmFzZSB0byBzeW5jIHNpZ25hbAorCisyMDExLTA4LTA4IDEyOjA5OjQxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgIHJ0cGJpbjogYWxsb3cgY29uZmlndXJhYmxlIHJ0Y3Agc3RyZWFtIHN5bmNpbmcgaW50ZXJ2YWwKKwkgIC4uLiByYXRoZXIgdGhhbiBuZWNlc3NhcmlseSBzeW5jaW5nIGF0IGVhY2ggUlRDUCBTUi4KKworMjAxMS0wOC0wMSAwODozNTowMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IHRyaWdnZXIgcmVjb25zaWRlcmF0aW9uIGlmIHJ0Y3AgaW50ZXJ2YWwgc2V0CisKKzIwMTEtMDgtMDEgMDg6MzI6MjQgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBjb25maWd1cmUgcnRjcCBpbnRlcnZhbCBpZiBwcm92aWRlZAorCSAgLi4uIGluIFBMQVkgcmVzcG9uc2UuCisKKzIwMTEtMDktMTYgMTY6NTM6MjIgKzAzMDAgIExhc3NlIExhdWtrYW5lbiA8bGFzc2UubGF1a2thbmVuQGRpZ2lhLmNvbT4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgaXNvbXA0OiBGaXggYWxsb3dpbmcgemVybyBkdXJhdGlvbiB0cmFja3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Mzc0ODYKKworMjAxMS0wOS0wNSAxMDoxMToxOCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuYzoKKwkgIHVkcHNyYzogZXJyb3Igb3V0IHdoZW4gbm8gcHJvdG9jb2wgaXMgc3BlY2lmaWVkIGluIHRoZSB1cmkKKwkgIEl0IGlzIGNlcnRhaW5seSBiZXR0ZXIgdGhhbiB0byBjcmFzaC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTgxNzgKKworMjAxMS0wOS0xOSAwOTozNzo1OCArMDIwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgc3BlZXhlbmM6IGRvIG5vdCB1c2UgaW52YWxpZCBidWZmZXIgdGltZXN0YW1wcworCisyMDExLTAzLTI5IDEyOjA5OjE4ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL01ha2VmaWxlLmFtOgorCSogZXh0L3B1bHNlL3BsdWdpbi5jOgorCSogZXh0L3B1bHNlL3B1bHNlYXVkaW9zaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmg6CisJICBwdWxzZTogTmV3IHB1bHNlYXVkaW9zaW5rIGVsZW1lbnQgdG8gaGFuZGxlIGZvcm1hdCBjaGFuZ2VzCisJICBUaGlzIGludHJvZHVjZXMgYSBuZXcgYmluIHdoaWNoIHdyYXBzIGFyb3VuZCBwdWxzZXNpbmsgYW5kIGRlcGVuZGluZyBvbgorCSAgdGhlIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoZSBzaW5rLCBwbHVncyBpbi9vdXQgYSBkZWNvZGViaW4yIGFzCisJICByZXF1aXJlZC4gVGhpcyBhbGxvd3MgdXNlcnMgdG8gc3dpdGNoIHNpbmtzIG9uIHRoZSBzdHJlYW0gYW5kIGFkYXB0cworCSAgYWNjb3JkaW5nbHkgKGZvciBleGFtcGxlLCB5b3UgY291bGQgd2F0Y2ggYSBtb3ZpZSBpbiBwYXNzdGhyb3VnaCBtb2RlIG9uCisJICB5b3VyIHJlY2VpdmVyIHdoaWNoIHN1cHBvcnRzIEFDMyBkZWNvZGUsIHRoZW4gcGx1ZyBvdXQgYW5kIHN3aXRjaCB0byBhCisJICBub24tZGlnaXRhbCBwcm9maWxlIHRvIGNvbnRpbnVlIHVuaW50ZXJydXB0ZWQgb24gYW5hbG9nIG91dHB1dCkuCisJICBUaGUgYmluIGlzIHJlcXVpcmVkIGJlY2F1c2UgZG9pbmcgdGhlIHNhbWUgd2l0aCBwbGF5YmluMi9wbGF5c2luayB3aWxsCisJICByZXF1aXJlIEFQSSBjaGFuZ2VzIHRoYXQgY2Fubm90IGJlIG1hZGUgaW4gMC4xMC4gV2l0aCAwLjExLzEuMCwgd2UKKwkgIHNob3VsZCBiZSBhYmxlIHRvIGFzayBmb3IgdXBzdHJlYW0gY2FwcyByZW5lZ290aWF0aW9uIHRvIGRlYWwgd2l0aCBhbGwKKwkgIHRoaXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU3MTc5CisKKzIwMTEtMDktMTYgMTU6MDM6MjMgKzAyMDAgIEJyYW5rbyBTdWJhc2ljIDxicmFua29AYXhpcy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSAgbWF0cm9za2FkZW11eDogQXZvaWQgc2VuZGluZyBFT1Mgd2hlbiBpbiBwYXVzZWQgc3RhdGUKKwkgIENoYW5nZWQgdGhlIGVibWwgcmVhZGVyJ3MgZ3N0X2VibWxfcGVla19pZF9sZW5ndGgoKSBmdW5jdGlvbiBzbworCSAgdGhhdCBpdCByZXR1cm5zIHRoZSBhY3R1YWwgcmVhc29uIGZvciB3aHkgdGhlIHBlZWsgZmFpbGVkLCBpbnN0ZWFkCisJICBvZiAoYWxtb3N0KSBhbHdheXMgcmV0dXJuaW5nIEdTVF9GTE9XX1VORVhQRUNURUQuIFRoaXMgcHJldmVudHMKKwkgIHRoZSBwdWxsaW5nIHRhc2sgZnJvbSBzZW5kaW5nIEVPUyB3aGVuIGRvaW5nIGEgZmx1c2hpbmcgc2Vlay4KKworMjAxMS0wOS0xNSAxNTo1Mzo0NyArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogZml4IHN0dXR0ZXJpbmcgQS9WCisJICBTb21lb25lIGdvdCBoYWQgYnkgaW1wbGljaXQgcHJvbW90aW9uIHRvIHVuc2lnbmVkIGluIG9wcyB3aXRoCisJICBhIHNpZ25lZCBhbmQgYW4gdW5zaWduZWQgdmFsdWUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU5MTUzCisKKzIwMTEtMDktMTQgMTY6Mzc6MTIgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZzZWVrLmM6CisJICBuYXZzZWVrOiB0b2dnbGUgcGF1c2UvcGxheSBvbiBzcGFjZSBiYXIKKwkgIEEgdXNlZnVsIHRoaW5nIHRvIGhhdmUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU5MDY1CisKKzIwMTEtMDktMTQgMTQ6NDY6MDAgKzAyMDAgIERhdmlkIFN2ZW5zc29uIEZvcnMgPGRhdmlkc2ZAYXhpcy5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICBtYXRyb3NrYWRlbXV4OiBjb25maWd1cmFibGUgdGltZXN0YW1wIGdhcCBoYW5kbGluZworCSAgbWF0cm9za2FkZW11eCBwZXJmb3JtcyBzZWdtZW50IHRyaWNrcyB0byBza2lwIGdhcHMgaW4gc3RyZWFtcywKKwkgIG5vdGFibHkgYXQgc3RhcnQgZm9yIG5vbiAwIGJhc2VkIGZpbGVzLiAgVGhlcmUgbWF5IGhvd2V2ZXIgYmUKKwkgIGNhc2VzIHdoZW4gZnVsbCBwcmVzZW50YXRpb24gKGluY2x1ZGluZyBpbnRlcm1lZGlhdGUgZ2FwcykgaXMKKwkgIGRlc2lyZWQsIHNvIGEgcHJvcGVydHkgYWxsb3dzIHRvIGNvbmZpZ3VyZSBhcyBvZiB3aGljaCBnYXAKKwkgIHRvIGFjdCAob3Igbm90IGF0IGFsbCkuCisJICBBUEk6IEdzdE1hdHJvc2thRGVtdXg6Om1heC1nYXAtdGltZQorCSAgRml4ZXMgIzY1OTAwOS4KKworMjAxMS0wOS0xMiAwOToyMTo0NyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2Zsdm11eC5jOgorCSAgdGVzdHM6IGZsdm11eDogRml4IGZsdm11eCdzIHRlc3RzIGFmdGVyIGZpeCBmb3IgcmVxdWVzdCBwYWRzIGhhbmRsaW5nCisJICBOb3cgdGhhdCBmbHZtdXggZG9lc24ndCByZWxlYXNlIGl0cyByZXF1ZXN0IHBhZHMgb24gUEFVU0VELT5SRUFEWSB0aGUKKwkgIHRlc3QgZG9lc24ndCBuZWVkIHRvIHJlLXJlcXVlc3QgdGhlbSBmb3IgZXZlcnkgcmV1c2UgdGVzdCBzdGFydC4KKworMjAxMS0wOS0wOSAwOToxMjo1NiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBGaXggY3R0cyBnZW5lcmF0aW9uIGZvciBzdHJlYW1zIHRoYXQgZG9uJ3Qgc3RhcnQgYXQgMCB0aW1lc3RhbXBzCisJICBTdWJ0cmFjdCB0aGUgZmlyc3QgdGltZXN0YW1wIG9mIGEgc3RyZWFtIGZyb20gYWxsIGlucHV0IGJ1ZmZlcnMgdG8KKwkgIGdldCAwLWJhc2VkIHRpbWVzdGFtcHMgZm9yIGNyZWF0aW5nIGEgc2FuZSBjdHRzIHRhYmxlLiBXaXRob3V0IHRoaXMKKwkgIHBhdGNoIHRoZSBjdHRzIGNvdWxkIGhhdmUgbGFyZ2VyIHZhbHVlcyB0aGFuIG5lZWRlZCwgY2F1c2luZyB0aGUKKwkgIHBsYXliYWNrIHRvIGhhdmUgYSBkZWxheSBhdCBzdGFydHVwLgorCSAgQXMgdGhlIGZpcnN0IHRpbWVzdGFtcCBpcyBvbmx5IGZvdW5kIGFmdGVyIGEgZmV3IGJ1ZmZlcnMgYXJlIHF1ZXVlZAorCSAgKGR1ZSB0byBwb3NzaWJsZSByZW9yZGVyZWQgYnVmZmVycyksIG9uY2Ugd2UgZmluZCB0aGUgZmlyc3QgdGltZXN0YW1wCisJICB3ZSBzdWJ0cmFjdCBpdCBmcm9tIGFsbCBidWZmZXJzIG9uIHRoZSBxdWV1ZSwgZnJvbSB0aGF0IHBvaW50IG9uLAorCSAgYWxsIGJ1ZmZlcnMgaGF2ZSB0aGVpciB0aW1lc3RhbXBzIHN1YnRyYWN0IHdoZW4gdGhleSBhcmUgY29sbGVjdGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1ODY1OQorCisyMDExLTA5LTEyIDA3OjU1OjE5ICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogZG9uJ3QgcmVsZWFzZSByZXF1ZXN0IHBhZHMgZ29pbmcgUEFVU0VELT5SRUFEWQorCSAgRG9uJ3QgcmVsZWFzZSByZXF1ZXN0IHBhZHMgYnV0IGp1c3QgcmVzZXQgdGhlbS4gVGhpcyBtYWtlcyBwaXBlbGluZXMgdXNpbmcKKwkgIGZsdm11eCByZXVzYWJsZS4KKworMjAxMS0wOS0wOSAxMjozNTo1MCArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkgIGFjM3BhcnNlOiB1c2UgYnNpZCA5IGFuZCAxMCB0byBjb250cm9sIHNhbXBsZSByYXRlCisJICBTZWUgaHR0cDovL21hdHJvc2thLm9yZy90ZWNobmljYWwvc3BlY3MvY29kZWNpZC9pbmRleC5odG1sCisJICBUaGUgc3BlYyBpcyBzaWxlbnQgYWJvdXQgdGhpcyB0aG91Z2guLi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTg1NDYKKworMjAxMS0wOS0wNyAxNDoxMzowMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGVuc3VyZSBzb21lIGluaXRpYWwgc3RhdGUgdmFyaWFibGUgc2V0dXAKKwkgIC4uLiB3aGljaCBtaWdodCBvdGhlcndpc2UgYmUgc2tpcHBlZCBpZiB0aGUgUExBWSBjb21tYW5kIGlzIGlzc3VlZCBiZWZvcmUKKwkgIHRoZSBPUEVOIGNvbW1hbmQgaGFkIGEgY2hhbmNlIHRvIGFjdHVhbGx5IGJlIGFjdGVkIHVwb24uCisJICBGaXhlcyAjNjU3Mzc2LgorCisyMDExLTA5LTA4IDE1OjAyOjA1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiB0d2VhayBnYXAgaGFuZGxpbmcKKwkgIC4uLiBzbyBhcyB0byBhdm9pZCBidWZmZXJzIGJlZm9yZSBhbmQgYWZ0ZXIgZ2FwIHRvIGhhdmUgaWRlbnRpY2FsIHJ1bm5pbmcgdGltZS4KKworMjAxMS0wOS0wOCAxMzoyODoyNCArMDIwMCAgR3VpbGxhdW1lIERlc21vdHRlcyA8Z3VpbGxhdW1lLmRlc21vdHRlc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IHVzZSBHU1RfUkVTT1VSQ0VfRVJST1JfQlVTWSBpZiB2NGwyX2lvY3RsIGZhaWxzIHdpdGggRUJVU1kKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTg1NDMKKworMjAxMS0wOS0wNyAwODo1NDoxNyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiByZW1vdmUgb25lIEdfVU5MSUtFTFkgZm9yIHVzZXIgcHJvcGVydHkKKwkgIFVzaW5nIEdfVU5MSUtFTFkgb24gdXNlciBwcm9wZXJ0aWVzIGlzbid0IG5pY2UsIHNwZWNpYWxseSB3aGVuCisJICB0aGF0IGlzIHRoZSBkZWZhdWx0IG9wdGlvbi4KKworMjAxMS0wMy0xNSAxMTowMzo1MyArMDEwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDxhbW9yYWxlc0BmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJICBtYXRyb3NrYW11eDogaGFuZGxlIEdzdEZvcmNlS2V5VW5pdCBldmVudAorCSAgLi4uIGJ5IHN0YXJ0aW5nIGEgbmV3IGNsdXN0ZXIgYWZ0ZXIgZm9yd2FyZGluZyBldmVudC4KKwkgIEZpeGVzICM2NDQxNTQuCisKKzIwMTEtMDktMDcgMTQ6Mjc6MzYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZGVjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZW5jLmM6CisJICBjbW1sOiBVc2UgY29tcGxldGUgY21tbCBjYXBzIGluIHRoZSB1bml0IHRlc3QKKworMjAxMS0wOS0wNyAxNDoyNjowMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJICBxdG11eDogVXNlIGNvbXBsZXRlIE1QRUcgY2FwcyBpbiB0aGUgdW5pdCB0ZXN0CisKKzIwMTEtMDktMDcgMTQ6MTg6NTggKzAyMDAgIFN0ZWZhbiBTYXVlciA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgIGRvY3M6IGNsZWFudXAgbWFrZWZpbGVzCisJICBSZW1vdmUgY29tbWVudGVkIG91dCBwYXJ0cyB0aGF0IHdlIGRvbid0IG5lZWQuIFJlbW92ZSAidGhlIHdpbmdvIGFkZGl0aW9uIiAtIG5vCisJICBzbyB1c2VmdWwgYWZ0ZXIgYWxsLiBOYXJyb3cgZG93biBmaWxlLWdsb2JzIGZvciBwbHVnaW4gZG9jcy4KKworMjAxMS0wOC0yOSAxNDoxMjoyMiArMDIwMCAgS29uc3RhbnRpbiBNaWxsZXIgPGtvbnN0YW50aW4ubWlsbGVyQGdtYWlsLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBEb24ndCBoYW5kbGUgSFRUUCByZXNwb25zZSA0MDcgYXMgZXJyb3IgaWYgcHJveHkgYXV0aGVudGljYXRpb24gZGF0YSBpcyBhdmFpbGFibGUKKwkgIEZpeGVzIGJ1ZyAjNjU3NDIyLgorCisyMDExLTA5LTA3IDEyOjExOjM5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IEFkZCBDb252ZXJ0ZXIgdG8gdGhlIGNsYXNzaWZpY2F0aW9uIGJlY2F1c2UgaXQgY2FuIGNvbnZlcnQgYmV0d2VlbiBkaWZmZXJlbnQgYWxpZ25tZW50cworCSAgVGhpcyBhbGxvd3MgZGVjb2RlYmluMiB0byBsZXQgaXQgbmVnb3RpYXRlIHByb3Blcmx5LgorCisyMDExLTA5LTA3IDEyOjEwOjQ4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2VyczogSW1wcm92ZSBzcmMgdGVtcGxhdGUgY2FwcworCSAgUmVtb3ZlIHRoZSBwYXJzZWQvZnJhbWVkIGZpZWxkcyBhbmQgYWRkIGFsbCBmaWVsZHMgdG8gdGhlIHRlbXBsYXRlCisJICBjYXBzIHRoYXQgYWx3YXlzIGV4aXN0LgorCisyMDExLTA5LTA2IDE1OjU5OjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5oOgorCSAgYWFjcGFyc2U6IHBhcnNlIGNvZGVjX2RhdGEgdG8gZGV0ZXJtaW5lIG51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZQorCSAgRml4ZXMgIzY1NjczNC4KKworMjAxMS0wOS0wNiAyMToyNDo0NiArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGEzOWViODMgdG8gMTFmMGNkNQorCisyMDExLTA5LTA2IDE2OjU3OjEyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IHRyeSB0byBkaXNhYmxlIGRlaW50ZXJsYWNlLi4KKworMjAxMS0wOS0wNiAxNTo0MDozMiArMDIwMCAgU3RlZmFuIFNhdWVyIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDYwNWNkOWEgdG8gYTM5ZWI4MworCisyMDExLTA5LTA2IDE2OjM3OjAzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBjb21tb24KKworMjAxMS0wOS0wNiAxNjowNjoyNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jCisJICBnc3QvaXNvbXA0L3F0ZGVtdXguYworCisyMDExLTA5LTA2IDE1OjQwOjMyICswMjAwICBTdGVmYW4gU2F1ZXIgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNjA1Y2Q5YSB0byBhMzllYjgzCisKKzIwMTEtMDktMDYgMTU6MDU6MzcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJICBtYXRyb3NrYW11eDogbWFrZSBkZWZhdWx0IGR1cmF0aW9uIGNoZWNrIGxlc3Mgc2Vuc2l0aXZlCisJICBGcmFtZSBkdXJhdGlvbiBtaWdodCB2YXJ5IGZvciAxIHVzZWNvbmQsIGluIHRoaXMgY2FzZSBtYXRyb3NrYW11eAorCSAgZGVjaWRlcyB0byBjcmVhdGUgQkxPQ0tHUk9VUCBpbnN0ZWFkIG9mIFNJTVBMRUJMT0NLLgorCSAgQ29udmVydCBkdXJhdGlvbiB0byB0aW1lY29kZXNjYWxlIHdoaWNoIGlzICh0eXBpY2FsbHkpIGxlc3MgcHJlY2lzZSwgYW5kCisJICB0aGVuIGFsc28gYWxsb3cgdGhlIGRpZmZlcmVuY2Ugb2YgMS8tMSB0byBhcnJhbmdlIGZvciBsZXNzIHNlbnNpdGl2ZSBjaGVjay4KKwkgIEJhc2VkIG9uIHBhdGNoIGJ5IEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKwkgIEZpeGVzICM2NTMwODAuCisKKzIwMTEtMDktMDYgMTM6MTg6NDAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSAgcnRwbXA0Z2RlcGF5OiBpbXByb3ZlIGJvZ3VzIGludGVybGVhdmVkIGluZGV4IGNvbXBlbnNhdGluZworCSAgUGF0Y2ggYnkgPGd1ZGFrZUBnbWFpbC5jb20+CisJICBGaXhlcyAjNjU0NTg1LgorCisyMDExLTA5LTA2IDEzOjE2OjI3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrLmg6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuaDoKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9sYXcvYWxhdy5jOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXcuYzoKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICAtZ29vZDogcG9ydCB0byBuZXcgYXVkaW8gY2FwcworCisyMDExLTA5LTA2IDEwOjMzOjIxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBBbGxvdyBwb3NpdGl2ZSwgbm9uLTEuMCBzZWdtZW50IHJhdGVzCisJICBPbmx5IG5lZ2F0aXZlIHJhdGVzIGFyZSBub3Qgc3VwcG9ydGVkLiBGaXhlcyBidWcgIzY1ODMwNS4KKworMjAxMS0wOS0wNSAxNTo1MDo1NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3BhcnNlci5jOgorCSAgdGVzdHM6IHBhcnNlcnM6IHByb3ZpZGUgbW9yZSByZWFsIGRhdGEgd2hlbiB0ZXN0aW5nIGRyYWluaW5nIG9mIGdhcmJhZ2UKKworMjAxMS0wOS0wNSAxNTo1MDowNCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkgIGFtcnBhcnNlOiBmaXggYW5kIHN0cmVhbWxpbmUgdmFsaWQgZnJhbWUgY2hlY2tpbmcKKwkgIC4uLiB0byBoYW5kbGUgdmFyaW91cyBjb21iaW5hdGlvbnMgb2Ygc3luYyBvciBub3QsIGFuZCBzdWZmaWNpZW50IGRhdGEKKwkgIG9yIG5vdCBhcyBtaWdodCBiZSBleHBlY3RlZC4KKwkgIEZpeGVzICM2NTA3MTQuCisKKzIwMTEtMDktMDUgMTQ6NDk6MzIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZyYWdtZW50ZWQgc3VwcG9ydDsgYXZvaWQgYWRqdXN0bWVudCBmb3Iga2V5ZnJhbWUgc2VlaworCSAgLi4uIHNpbmNlIGFsbCBpbmRleCBkYXRhIG1heSBub3QgeWV0IGJlIGF2YWlsYWJsZSBhdCB0aGF0IHRpbWUuCisKKzIwMTEtMDktMDUgMTQ6NDg6MDIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZyYWdtZW50ZWQgc3VwcG9ydDsgbWFyayBhbGwgYXVkaW8gdHJhY2sgc2FtcGxlcyBhcyBrZXlmcmFtZQorCisyMDExLTA5LTA1IDE0OjQ2OjI5ICswMjAwICBCcmlhbiBMaSA8YnJpYW43MDAzQGdtYWlsLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmcmFnbWVudGVkIHN1cHBvcnQ7IHByb3Blcmx5IGluaXQgcmV0dXJuIHZhcmlhYmxlIHZhbHVlCisJICBGaXhlcyAjNjU1OTE4LgorCisyMDExLTA5LTA1IDEzOjMxOjIwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYWRkIGd0ay1kb2MgZm9yIG5ldyBzaG9ydC1oZWFkZXIgcHJvcGVydHkKKworMjAxMS0wOS0wNSAxMzoxODozOSArMDIwMCAgTWFyYyBMZWVtYW4gPG1hcmMubGVlbWFuQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogYWxsb3cgc2VuZGluZyBzaG9ydCBSVFNQIHJlcXVlc3RzIHRvIGEgc2VydmVyCisJICBTb21lIGVuY29kZXJzIChBcmVjb250KSBkbyBub3QgbGlrZSB0aGUgbG9uZyBPUFRJT05TIHNlbnQgYXQgc3RhcnR1cCBhcyBzZW50IGJ5CisJICBHU3RyZWFtZXIsIGJ1dCBkbyBhY2NlcHQgdGhlIHNob3J0IGhlYWRlciBhcyBzZW50IGJ5IExpdmU1NTUuCisJICBUaGlzIHBhdGNoIG1ha2VzIHRoZSBleHRlbmRpbmcgdGhlIHJlcXVlc3Qgb3B0aW9uYWwgYnkgYWRkaW5nIGEgcHJvcGVydHkKKwkgIChzaG9ydC1oZWFkZXIpLgorCSAgRml4ZXMgIzY1NTgwNS4KKwkgIEFQSTogR3N0UlRTUFNyYzpzaG9ydC1oZWFkZXIKKworMjAwOS0wMy0wNCAxNDo1MTowOSAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJICBydHBoMjYzcHBheTogU2V0IEgyNjMtMjAwMCBpZiB0aGF0cyB3aGF0IHRoZSBvdGhlciBzaWRlIHdhbnRzCisJICBUaGUgc3RhdGljIGNhcHMgc3RhdGVzIHRoaXMgZWxlbWVudCBzdXBwb3J0cyBIMjYzLTIwMDAsIGJ1dCBzZXRjYXBzIG5ldmVyCisJICBzZXRzIGl0LCBzbyBpdCB3YXMgbGllLgorCSAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01Nzc3ODQKKworMjAxMS0wOC0zMCAxOTowMjo1MSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogSW5pdGlhbGlzZSB0aGUgbGFzdF9rZXlmcmFtZV9yZXF1ZXN0IHZhcmlhYmxlCisKKzIwMTEtMDgtMzEgMTY6MDQ6MjQgKzAyMDAgIFBldGVyIEtvcnNnYWFyZCA8amFjbWV0QHN1bnNpdGUuZGs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICBtdWx0aXVkcHNpbms6IG1ha2UgYWRkL3JlbW92ZS9jbGVhci9nZXQtc3RhdHMgYWN0aW9uIHNpZ25hbHMKKwkgIGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NzgzMAorCSAgU2lnbmVkLW9mZi1ieTogUGV0ZXIgS29yc2dhYXJkIDxqYWNtZXRAc3Vuc2l0ZS5kaz4KKworMjAxMS0wOC0zMSAxODo0NToxNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydHBheS5jOgorCSAgbXAydDogZml4IGVuY29kaW5nIG5hbWUgYWNjb3JkaW5nIHRvIFJGQzM1NTEKKworMjAxMS0wOC0zMCAxMzozMzo0OSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBwdXNoIG1vZGU7IHBlcmZvcm0gc29tZSBleHRyYSBjaGVja3MgcHJpb3IgdG8gdXBzdHJlYW0gc2Vla2luZworCisyMDExLTA4LTMwIDEzOjI4OjIxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwdXNoIG1vZGU7IGZpeCBidWZmZXJlZCBzdHJlYW1pbmcKKwkgIFRoYXQgaXMsIGluIGNhc2Ugd2hlcmUgbm8gc2VlayBpcyBwZWZvcm1lZCB0byBtb292LCBidXQgcHJlY2VkaW5nCisJICBsaW1pdGVkIG1kYXQgaXMgYnVmZmVyZWQuCisKKzIwMTEtMDgtMzAgMTQ6MDY6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5oOgorCSAgc2hhcGV3aXBlOiBwb3J0IHRvIDAuMTEKKworMjAxMS0wOC0zMCAxMjo0OTowOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgbGF3IGlzIHBvcnRlZCBub3cKKworMjAxMS0wOC0zMCAxMjoyNTozNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2xhdy9hbGF3LmM6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXcuYzoKKwkgIGxhdzogcG9ydCB0byAwLjExCisKKzIwMTEtMDgtMjkgMTk6MTE6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzoKKwkgIGFsYXc6IHBvcnQgdG8gMC4xMQorCisyMDExLTA4LTI5IDE5OjEwOjM1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJICBnb29tOiBmaXggY29tbWVudAorCisyMDExLTA4LTI5IDE4OjAyOjE1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNpbmsuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwOiBwb3J0IHNvdXAgZWxlbWVudHMgdG8gMC4xMQorCisyMDExLTA4LTI5IDE1OjEzOjU2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhdm9pZCBvdmVyZmxvdyB3cmFwYXJvdW5kIGluIHRpbWVzdGFtcCB3aGVuIGFkZGluZyBkdXJhdGlvbnMKKwkgIERvIHNvbWUgdHlwZSBqdWdnbGluZyB0byBhdm9pZCBvdmVyZmxvdywgd2hpbGUgc3RpbGwgYWxsb3dpbmcgZm9yICduZWdhdGl2ZScKKwkgIGR1cmF0aW9ucyAod2hpY2ggd291bGQgbmVlZCBhIHdyYXBhcm91bmQgZWZmZWN0KS4KKworMjAxMS0wOC0yOSAxMzo0Mzo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jCisKKzIwMTEtMDgtMjYgMTQ6MjA6NDkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBhbGxvY2F0aW9uOiBmaXggZm9yIHZtZXRob2QgY2hhbmdlcworCisyMDExLTA4LTI1IDIzOjM3OjQ3ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSAgdjRsMnNyYzogbWFrZSB0aGlzIHdvcmsgbW9yZSB0aGFuIG9uY2UgaW4gYSByb3cKKwkgIFdlIHVzZWQgdG8gc2tpcCBmcmFtZSByYXRlIHNldHVwIGlmIHRoZSBjYW1lcmEgd2FzIGFscmVhZHkgc2V0dXAKKwkgIHdpdGggdGhlIHJlcXVlc3RlZCBmcmFtZSByYXRlLiBUaGlzIGJyZWFrcyBzb21lIGNhbWVyYXMgdGhvdWdoLAorCSAgY2F1c2luZyB0aGVtIHRvIG5vdCBvdXRwdXQgZGF0YSAoc2V2ZXJhbCBtb2RlbHMgb2YgVGhpbmtwYWQgY2FtZXJhcworCSAgaGF2ZSB0aGlzIHByb2JsZW0gYXQgbGVhc3QpLgorCSAgU28sIGRvbid0IHNraXAuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjM4MzAwCisKKzIwMTEtMDgtMjUgMTY6NDE6MjMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHBvcnQgdG8gbmV3IHZpZGVvIGZsYWdzCisKKzIwMTEtMDgtMjQgMTg6NDA6MDcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkgIHB1bHNlOiBhZGQgc29tZSBtb3JlIGNoYW5uZWxzCisKKzIwMTEtMDctMTIgMjE6NDg6MzcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIGR0bWY6IEFkZCBtb3JlIGRlYnVnCisKKzIwMTEtMDctMTIgMTk6MDk6MDIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZjb21tb24uaDoKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIGR0bWY6IE1heCBldmVudCB0eXBlIGlzIDE1CisKKzIwMTEtMDQtMTQgMTU6NDY6MDggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5oOgorCSAgZHRtZnNyYzogQWxpZ24gRFRNRiBzb3VuZCBidWZmZXJzIHdpdGggbGFzdC1zdG9wIGZyb20gZXZlbnQKKwkgIEFsc28gbWFrZSBzdXJlIHRoZSB0aW1lc3RhbXBzIG5ldmVyIGdvIGJhY2t3YXJkcworCisyMDExLTA3LTExIDIxOjMxOjA3IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBydHBkdG1mc3JjOiBDb3JyZWN0bHkgcmVjb2duaXplIHRoZSBlbmQgb2YgYSBidWZmZXIKKworMjAxMS0wNy0xMSAyMDo0NzoyMyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgcnRwZHRtZnNyYzogTWFrZSBzdXJlIHJ0cGR0bWZzcmMgdGltZXN0YW1wcyBkb24ndCBvdmVybGFwCisKKzIwMTEtMDctMTEgMjA6NDY6MjAgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIHJ0cGR0bWZzcmM6IFB1dCB0aGUgaW50ZXIgZGlnaXQgaW50ZXJ2YWwgYXQgdGhlIGVuZCwgbm90IGF0IHRoZSBzdGFydAorCSAgVGhlIHJlYXNvbiBpcyB0byBsZXQgcnRwZHRtZm11eCBkcm9wIGJ1ZmZlcnMgZHVyaW5nIHRoZSBpbnRlciBkaWdpdCBpbnRlcnZhbCwKKwkgIHRoaXMgd2F5LCB0aGVyZSB3aWxsIGJlIG1vcmUgc2lsZW5jZSBhcm91bmQgdGhlIERUTUYgdG9uZXMgc28gSVZGcyB3aWxsIGhhdmUKKwkgIGEgYmV0dGVyIGNoYW5jZSByZWNvZ25pemluZyB0aGVtLgorCisyMDExLTA0LTE0IDE3OjA4OjU3IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuaDoKKwkgIHJ0cGR0bWZzcmM6IFN0YXJ0IGF0IHRoZSBsYXN0X3N0b3AgZnJvbSB0aGUgc3RhcnQgZXZlbnQgaWYgdGhlcmUgd2FzIG9uZQorCSAgVGhlIGdvYWwgaXMgdG8gdHJ5IHRvIG5vdCBoYXZlIGEgR0FQIGJldHdlZW4gdGhlIGF1ZGlvIGFuZCB0aGUgRFRNRgorCisyMDExLTA0LTE0IDE2OjQ5OjM5IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuaDoKKwkgIHJ0cGR0bWZzcmM6IFJlc3BlY3QgcHRpbWUgZnJvbSB0aGUgY2FwcworCSAgUmVzcGVjdCB0aGUgcHRpbWUgZnJvbSB0aGUgY2FwcyBmb3IgdGhlIERUTUYgcGFja2V0cworCisyMDExLTA3LTExIDIxOjMwOjI4IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBydHBkdG1mc3JjOiBKdXN0IGVycm9yIG91dCBpZiB0aGVyZSBpcyBubyBjbG9jaworCisyMDExLTA4LTI0IDE0OjE2OjQ0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisKKzIwMTEtMDgtMjMgMTI6MTI6MTUgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogb25seSByZXF1aXJlIHR3byBmcmFtZXMgaW4gYSByb3cgd2hlbiB3ZSBkbyBub3QgaGF2ZSBzeW5jCisJICBUaGlzIGF2b2lkcyBhIHNpbmdsZSBiaXQgZXJyb3IgZHJvcHBpbmcgdHdvIGZyYW1lcyB1bm5lY2Vzc2FyaWx5LgorCSAgVGhlIHR3byBjb25zZWN1dGl2ZSBmcmFtZXMgY2hlY2sgaXMgc3RpbGwgcmVxdWlyZWQgd2hlbiB3ZSBkb24ndAorCSAgaGF2ZSBzeW5jLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NzA4MAorCisyMDExLTA4LTIzIDIxOjQxOjE1ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBUcml2aWFsIGluZGVudGF0aW9uIGZpeAorCisyMDExLTA4LTIzIDE5OjA5OjMxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkgIHZpZGVvOiBwb3J0IHRvIG5ldyBjb2xvcmltZXRyeSBpbmZvCisKKzIwMTEtMDctMjEgMTc6MjM6MjggLTA0MDAgIE1vbnR5IE1vbnRnb21lcnkgPGNtb250Z29tQHJlZGhhdC5jb20+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWNkZWM6IENvcnJlY3Qgc2FtcGxlIG51bWJlciByb3VuZGluZyByZXN1bHRpbmcgaW4gdGltZXN0YW1wIGppdHRlcgorCSAgZmxhY2RlYyBjb252ZXJ0cyB0aGUgc3JjIHRpbWVzdGFtcCB0byBhIHNhbXBsZSBudW1iZXIsIHVzZXMgdGhhdCBpbnRlcm5hbGx5LCB0aGVuIHJlY29udmVydHMgdGhlIHNhbXBsZSBudW1iZXIgdG8gYSB0aW1lc3RhbXAgZm9yIHRoZSBvdXRwdXQgYnVmZmVyLiAgVW5mb3J0dW5hdGVseSwgc2FtcGxlIG51bWJlcnMgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgaW4gYW4gaW50ZWdlciBudW1iZXIgb2YgbmFub3NlY29uZHMsIGFuZCB0aGUgY29udmVyc2lvbiBwcm9jZXNzIHdhcyB0cnVuY2F0aW5nIHJhdGhlciB0aGFuIHJvdW5kaW5nLCByZXN1bHRpbmcgaW4gc2FtcGxlIG51bWJlcnMgYW5kIG91dHB1dCB0aW1lc3RhbXBzIHRoYXQgd2VyZSBvZnRlbiBvZmYgYnkgYSBmdWxsIHNhbXBsZS4KKwkgIFRoaXMgY29ycmVjdHMgdGhlIHRpbWUtPnNhbXBsZSBjb252ZXNpb24KKworMjAxMS0wOC0yMiAxMzoxMDowNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDExLTA4LTIyIDEyOjI0OjE1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmM6CisJKiBnc3QvaXNvbXA0L2F0b21zLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuYzoKKwkgIGZvdXJjYzogcmVtb3ZlIGZvdXJjYyBmcm9tIGNhcHMKKworMjAxMS0wOC0yMCAxNDo0ODoyMCAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL2JyZWFrbXlkYXRhLmM6CisJICBicmVha215ZGF0YTogZWxlbWVudCBpcyBub3QgcGFzc3Rocm91Z2gKKworMjAxMS0wNy0xMyAxMToyMDozNCAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJICBtdWx0aWZpbGVzcmM6IHF1aWV0IGRlYnVnZ2luZworCisyMDExLTA3LTEwIDIxOjQwOjIwIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuaDoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmg6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhcmJsZW5kLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3NjYWxlcmJvYi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwuaW5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS92ZmlyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlYmZmLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZldGZmLmM6CisJICBkZWludGVybGFjZTogY2hhbmdlIGZpZWxkIGhhbmRsaW5nIHRocm91Z2ggbWV0aG9kcworCSAgVGhpcyBsaWtlbHkgYnJlYWtzIHN0dWZmLiAgVGhlIGdvb2Q6IGFsbCBvZiB0aGUgbWV0aG9kcyBub3cgY3JlYXRlCisJICBmaWVsZCBpbWFnZXMgYWxpZ25lZCB3aXRoIGlucHV0IGZyYW1lcywgd2l0aG91dCB0aW1lc3RhbXAgbWFuZ2xpbmcuCisJICBUaGUgYmFkOiB0aGlzIHRvdWNoZXMgYSBsb3Qgb2YgY29kZSwgbXVjaCBvZiB3aGljaCBpcyBoYWlyeSBhbmQgaW4KKwkgIG5lZWQgb2YgY2xlYW51cC4gIEhvd2V2ZXIsIGF0IHRoaXMgcG9pbnQgd2UgY2FuIHJlYXNvbmFibHkgY3JlYXRlIGEKKwkgIFBTTlItYmFzZWQgdGVzdC4KKworMjAxMS0wOC0yMSAxNDo0MToxNCArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZEBnbWFpbC5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgbXVsdGlmaWxlc2luazogcmVzZXQgLT5zdHJlYW1oZWFkZXJzIHRvIE5VTEwgb24gX3N0b3AKKwkgIEZpeGVzIGludmFsaWQgbWVtb3J5IGFjY2VzcyByZXVzaW5nIG11bHRpZmlsZXNpbmsKKworMjAxMS0wOC0yMCAxMDo0NjoxOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmg6CisJICBjdXR0ZXI6IGJyaW5nIGN1dHRlciBzb21ld2hhdCBpbnRvIHRoaXMgbWlsbGVubml1bQorCisyMDExLTA4LTE5IDE2OjI3OjIwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJICByZzogZml4IGNhcHMKKworMjAxMS0wOC0xOSAxNjoxMzoyMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBwb3J0IGFmdGVyIG1lcmdlCisKKzIwMTEtMDgtMTkgMTY6MTI6MDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0wOC0xOSAxNjowOTo0OCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2ludmVydC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9rYXJhb2tlLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmM6CisJKiBnc3QvYXVwYXJzZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvbGV2ZWwvTWFrZWZpbGUuYW06CisJKiBnc3QvcmVwbGF5Z2Fpbi9NYWtlZmlsZS5hbToKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJnbGltaXRlci5jOgorCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYzoKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgcG9ydCB0byBtb3JlIGF1ZGlvIGFwaSBjaGFuZ2VzCisKKzIwMTEtMDgtMTkgMTQ6MDE6NDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5oOgorCSogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5oOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkqIHN5cy9vc3MvZ3N0b3NzaGVscGVyLmM6CisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2ludmVydC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL2xldmVsL2xldmVsLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL3NwZWN0cnVtLWV4YW1wbGUuYzoKKwkgIHBvcnQgbW9yZSBlbGVtZW50cyB0byBuZXcgYXVkaW8gY2FwcyBhbmQgQVBJCisKKzIwMTEtMDgtMTkgMTE6NDk6NDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5Lmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2ZpcmZpbHRlci5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlaWlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9paXJmaWx0ZXIuaDoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2thcmFva2UuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmg6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYzoKKwkgIHBvcnQgdG8gbmV3IGF1ZGlvIEFQSSBhbmQgY2FwcworCisyMDExLTA4LTE4IDEzOjM3OjM5ICswMjAwICBEYXZpZCBIZW5uaW5nc3NvbiA8ZGF2aWQuaGVubmluZ3Nzb25AY2Fub25pY2FsLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBBbGxvdyB3cml0ZXMgaW4gYmlnZ2VyIGNodW5rcworCSAgVGhlcmUncyBubyB1c2UgaW4gc3BsaXR0aW5nIHRoZSBpbmNvbWluZyBkYXRhIGRvd24gdG8gdGhlIHNlZ3NpemUKKwkgIGxpbWl0IC0gYnkgd3JpdGluZyBhcyBtdWNoIGFzIHBvc3NpYmxlIGluIG9uZSBjaHVuaywgd2UgaW5jcmVhc2UKKwkgIHBlcmZvcm1hbmNlIGFuZCBhdm9pZCBQdWxzZUF1ZGlvIHVubmVjZXNzYXJ5IHJld2luZHMuCisJICBTaWduZWQtb2ZmLWJ5OiBEYXZpZCBIZW5uaW5nc3NvbiA8ZGF2aWQuaGVubmluZ3Nzb25AY2Fub25pY2FsLmNvbT4KKworMjAxMS0wOC0xOCAxOTozNzozOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDExLTA4LTE4IDE5OjIxOjA3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrLmg6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJICBwb3J0IHRvIG5ldyBhdWRpbyBjYXBzLgorCisyMDExLTA4LTA4IDIyOjE0OjI4ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBlbnN1cmUgbm8tbW9yZS1wYWRzIGlzIGFsd2F5cyBlbWl0dGVkCisJICBJbiBwYXJ0aWN1bGFyLCBkbyBzbyBldmVuIGlmIGZhaWxpbmcgdG8gcmVhZCB3aGlsZSBwcmVyb2xsaW5nLAorCSAgc3VjaCBhcyB3aGVuIHJlYWRpbmcgZnJvbSBhIHBhcnRpYWwgZmlsZSAoZWcsIHdoaWxlIGl0IGlzIGJlaW5nCisJICBkb3dubG9hZGVkKS4KKwkgIFRoaXMgZml4ZXMgYSB3ZWRnZSBpbiBwbGF5YmluMi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTE5NjUKKworMjAxMS0wOC0xNyAxNzo1NzoxMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogaW1wcm92ZSBmaXhhdGUgZnVuY3Rpb24KKwkgIFVzZSBuZXcgY29yZSBmdW5jdGlvbiB0byBmaXhhdGUgYSBmaWVsZC4KKwkgIENoYWluIHVwIHRvIHBhcmVudCBmaXhhdGUgZnVuY3Rpb24uCisKKzIwMTEtMDgtMTcgMTU6NTI6MTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9mbGFjL2dzdGZsYWNkZWMuYworCisyMDExLTA4LTE3IDE1OjM5OjI3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvanBlZy9NYWtlZmlsZS5hbToKKwkqIGV4dC9qcGVnL2dzdGpwZWcuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuaDoKKwkgIGpwZWc6IHBvcnQgdG8gMC4xMQorCSAgQWxzbyBkaXNhYmxlIHNtb2tlIGZvciBub3cuCisKKzIwMTEtMDgtMTYgMTc6Mjc6MTMgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiBhdm9pZCB0aW1lc3RhbXAvb2Zmc2V0IHRyYWNraW5nIGdvaW5nIG91dCBvZiBzeW5jCisJICBUaGUgbGliRkxBQyBBUEkgaXMgY2FsbGJhY2sgYmFzZWQsIGFuZCB3ZSBtdXN0IG9ubHkgY2FsbCBpdCB0bworCSAgb3V0cHV0IGRhdGEgd2hlbiB3ZSBrbm93IHdlIGhhdmUgZW5vdWdoIGlucHV0IGRhdGEuIEZvciB0aGlzCisJICByZWFzb24sIGEgc2luZ2xlIHByb2Nlc3Npbmcgc3RlcCBpcyBkb25lIHdoZW4gcmVjZWl2aW5nIGEgYnVmZmVyLgorCSAgSG93ZXZlciwgaWYgdGhlcmUgd2VyZSBtZXRhZGF0YSBidWZmZXJzIHN0aWxsIHBlbmRpbmcsIGEgc3RlcAorCSAgaW50ZW5kZWQgZm9yIHRoZSBmaXJzdCBhdWRpbyBmcmFtZSBtaWdodCBlbmQgdXAgd3JpdGluZyB0aGF0CisJICBsZWZ0b3ZlciBtZXRhZGF0YS4gU2luY2UgYSBzaW5nbGUgc3RlcCBpcyBkb25lIHBlciBidWZmZXIsIHRoaXMKKwkgIHdpbGwgY2F1c2UgZXZlcnkgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gb25lIHN0ZXAgbGF0ZS4KKwkgIFRoaXMgd291bGQgYWRkIHNvbWUgbGF0ZW5jeSAoYSBidWZmZXJmdWxsJ3Mgd29ydGgpLCBwb3NzaWJseQorCSAgbG9zZSBhIGJ1ZmZlciB3aGVuIHNlZWtpbmcgb3IgdGhlIGxpa2UsIGFuZCBhbHNvIGNhdXNlIHRpbWVzdGFtcAorCSAgYW5kIG9mZnNldCB0byBiZSBhcHBsaWVkIHRvIHRoZSB3cm9uZyBidWZmZXIsIGFzIHVwZGF0ZXMgdG8KKwkgIHRoZSAiY3VycmVudCIgc2VnbWVudCBsYXN0X3N0b3AgKGZyb20gaW5jb21pbmcgYnVmZmVyIHRpbWVzdGFtcCkKKwkgIHdpbGwgYmUgYXBwbGllZCB0byBhbiBvdXRwdXQgYnVmZmVyIG9yaWdpbmF0aW5nIGZyb20gdGhlIHByZXZpb3VzCisJICBpbmNvbWluZyBidWZmZXIuCisJICBUaGlzIGZpeGVzIHRoZSBpc3N1ZSBieSBlbnN1cmluZyB0aGF0LCB1cG9uIHJlY2VpdmluZyB0aGUgZmlyc3QKKwkgIGF1ZGlvIGZyYW1lLCBwcm9jZXNzaW5nIGlzIGRvbmUgdGlsbCBhbGwgbWV0YWRhdGEgaXMgcHJvY2Vzc2VkLAorCSAgc28gdGhlIG5leHQgInNpbmdsZSBzdGVwIiBkb25lIHdpbGwgYmUgZm9yIHRoZSBhdWRpbyBmcmFtZS4gQWZ0ZXIKKwkgIHRoaXMsIHdlIHNob3VsZCBrZWVwIHRvIDEgaW5wdXQgYnVmZmVyIC0+IDEgb3V0cHV0IGJ1ZmZlciBhbmQgc28KKwkgIGF2b2lkIGdldHRpbmcgb3V0IG9mIHN5bmMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwOTYwCisKKzIwMTEtMDgtMTcgMTE6MTc6MzggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0wOC0xNiAxNTozMjowNyArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWNkZWM6IGJhaWwgb24gcmVzZXJ2ZWQgdmFsdWUKKwkgIE5vdyB0aGF0IHdlIGxvb2sgYXQgdGhlIHJpZ2h0IGJpdHMsIHdlIGNhbiB0ZXN0IGFnYWluc3QgdGhlIHJlc2VydmVkCisJICB2YWx1ZSBhcyB3ZSBkbyBmb3Igb3RoZXIgZmllbGRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDk2MAorCisyMDExLTA4LTE2IDE1OjI3OjQzICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogZml4IGJpdCB0d2lkZGxpbmcKKwkgIFJpZ2h0IHNoaWZ0aW5nIGEgOCBiaXQgdmFsdWUgYnkgOCBiaXRzIGlzIHR3aWNlIHRvbyBtdWNoCisJICB0byBnZXQgdGhlIGhpZ2ggNCBiaXRzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDk2MAorCisyMDExLTA4LTE2IDE1OjIyOjQ2ICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogd2FybiBpZiB3ZSBzZWUgYSB2YXJpYWJsZSBibG9jayBzaXplIHdoZXJlIHVuc3VwcG9ydGVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwOTYwCisKKzIwMTEtMDgtMTYgMTg6MjU6MjkgKzAxMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIHNwZWN0cnVtOiBhdm9pZCBjcmFzaGluZyBieSByZXNldHRpbmcgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGNoYW5uZWxzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU2NjA2CisKKzIwMTEtMDgtMTYgMTg6MzU6NTMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYworCisyMDExLTA4LTE2IDEzOjE2OjIyICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogZml4IG9mZiBieSBvbmUgaW4gZnJhbWUgc2l6ZSBjaGVjaworCSAgWWVzLCBJIHdhcyB0cmFja2luZyBhbm90aGVyIGJ1ZyBhbmQgdGhlIHNtYWxsIHRlc3QgZmlsZSBJIGdlbmVyYXRlZAorCSAgdG8gdGVzdCB3aXRoIGltcHJvYmFibHkganVzdCBoYXBwZW5lZCB0byB0cmlnZ2VyIHRoaXMsIHdpdGggYSBzZWNvbmQKKwkgIGFuZCBsYXN0IGZyYW1lIG9mIDE2MTUgYnl0ZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU2NjQ5CisKKzIwMTEtMDgtMTUgMTI6MTk6MTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3BhcnNlci5jOgorCSAgdGVzdHM6IHVwZGF0ZSBmb3IgX25lZ290aWF0ZWRfY2FwcygpIGNoYW5nZQorCisyMDExLTA4LTE0IDIwOjQ2OjAxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lkM2RlbXV4L2lkM3YyLjMuMC5odG1sOgorCSogZ3N0L2lkM2RlbXV4L2lkM3YyLjQuMC1mcmFtZXMudHh0OgorCSogZ3N0L2lkM2RlbXV4L2lkM3YyLjQuMC1zdHJ1Y3R1cmUudHh0OgorCSAgaWQzZGVtdXg6IHJlbW92ZSBzcGVjcyBmcm9tIGdpdCBhcyB3ZWxsIG5vdyB0aGF0IHBhcnNpbmcgY29kZSBpcyBpbiAtYmFzZQorCisyMDExLTA3LTE0IDE1OjQyOjM2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2lkM2RlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6CisJKiBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOgorCSogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuaDoKKwkqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOgorCSAgaWQzZGVtdXg6IHVzZSAtYmFzZSBwcm92aWRlZCBpZDMgdGFnIHBhcnNpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTQzODgKKworMjAxMS0wOC0xMyAxNjo1MToyMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSAgamFja2F1ZGlvc3JjOiBmaXggZXJyb3IgbWVzc2FnZSBjb2RlCisJICBBbmQgYWxzbyBwb3N0ICdub3QgZm91bmQnIGVycm9yIGlmIGphY2tkIGlzIG5vdCBldmVuIGluc3RhbGxlZC4KKworMjAxMS0wOC0xMiAxNjozMjo1OCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGluaXRpYWxpemUgYml0cmF0ZSB2YXJpYWJsZSBhbmQgcmVzZXQgZm9yIGVhY2ggbG9vcAorCSAgRG9uJ3QgY2hlY2sgZXZlbnR1YWxseSB1bnNldCB2YXJpYWJsZSBhbmQgZG9uJ3QgYWNjaWRlbnRpYWxseSB1c2UgdmFsdWVzIGZyb20gbGFzdAorCSAgY3ljbGUuCisKKzIwMTEtMDgtMTAgMTE6Mjg6MjYgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJICBhYXNpbms6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzCisKKzIwMTEtMDgtMDkgMTE6Mjg6MTcgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBQcm9wZXJseSBlcnJvciBvdXQgaWYgU0RQIGNvbnRhaW5zIG5vIHN0cmVhbXMKKwkgIEFsc28gZml4ZXMgdW5pdGlhbGl6ZWQgdmFyaWFibGUgZXJyb3Igb24gbWFjb3N4LgorCisyMDExLTA4LTA5IDA5OjA1OjMxICswMTAwICBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHhpbWFnZXNyYzogY2xlYXIgZmxhZ3Mgb24gYnVmZmVyIHJldXNlCisJICBUaGlzIHdpbGwgZW5zdXJlIGEgbG9naWNhbGx5IG5ldyBidWZmZXIgZG9lcyBub3Qga2VlcCBmbGFncyBmcm9tCisJICBhIHByZXZpb3VzIHVzZSBvZiB0aGF0IGJ1ZmZlciAoZWcsIERJU0NPTlQgd291bGQgYmUgc2V0IG9uIHRoZSBmaXJzdAorCSAgYnVmZmVyLCBhbmQgbWlzdGFrZW5seSBrZXB0IHdoZW4gcmV1c2VkKS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTM3MDkKKworMjAxMS0wOC0wOCAxMDo1NDoyNiArMDEwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IHRha2UgY2FyZSBub3QgdG8gY2hhbmdlIHRoZSBjdXJyZW50IGZvcm1hdCB3aGVyZSBhcHByb3ByaWF0ZQorCSAgU29tZSBkcml2ZXJzIGFyZSBidWdneSBhcmUgd2lsbCBjaGFuZ2UgdGhlIGN1cnJlbnQgZm9ybWF0IHdoZW4KKwkgIHByb2Nlc3NpbmcgVklESU9DX1RSWV9GTVQuIFNhdmUgYW5kIHJlc3RvcmUgdGhlIGN1cnJlbnQgZm9ybWF0CisJICB0byBlbnN1cmUgdGhlIGZvcm1hdCBpcyBrZXB0IHVuY2hhbmdlZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDkwNjcKKworMjAxMS0wOC0wOCAxNToyNzoxMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTEtMDgtMDggMTU6MjY6MDAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYWFsaWIvTWFrZWZpbGUuYW06CisJICBhYWxpYjogbWFrZSBzdXJlIC1ER1NUX1VTRV9VTlNUQUJMRV9BUEkgaXMgZGVmaW5lZAorCSAgU28gd2UgZG9uJ3QgZ2V0IHdhcm5pbmdzLgorCisyMDExLTA4LTA4IDE1OjI1OjMxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvb3ZlcmxheS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZGVvb3ZlcmxheS5oOgorCSAgdjRsMjogdXBkYXRlIGZvciBHc3RYT3ZlcmxheSA9PiBHc3RWaWRlb092ZXJsYXkgcmVuYW1lCisKKzIwMTEtMDgtMDcgMTI6MjM6MjYgKzAyMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICB2NGwyc3JjOiBVc2UgZnJhY3Rpb24gY29tcGFyZSB1dGlsIGZ1bmN0aW9uLgorCSAgVXNlIHRoZSBmcmFjdGlvbiBjb21wYXJlIHV0aWxpdHkgdG8gY29tcGFyZSBmdW5jdGlvbiwgbm90IHRoZQorCSAgaGFuZGNyYWZ0ZWQgb25lLiBUaGUgaGFuZGNyYWZ0ZWQgb25lIGlzIGJ1Z2d5IGFzIGl0IGRvZXNuJ3QgdGFrZSBpbnRvCisJICBhY2NvdW50IHJvdW5kaW5nIGVycm9yLiBGb3IgZXhhbXBsZSBjb21wYXJpbmcgYSBmcmFtZXJhdGUgb2YgMjAvMSBvbiBhCisJICBjYW1lcmEgY29uZmlndXJlZCBhcyAzMC8xIGZwcyB3b3VsZCB5aWVsZCB0cnVlOiAxID09ICgxICogMjApLzMwIGFuZCBub3QKKwkgIHJlLWNvbmZpZ3VyZSB0aGUgY2FtZXJhLiBGaXhlcyAjNjU2MTA0CisKKzIwMTEtMDgtMDcgMTE6MTQ6NTAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmg6CisJICBwdWxzZXNyYzogYXZvaWQgcmFjZSBpbiBzdGFydGluZworCSAgU2luZSB0aGUgYmFzZSBjbGFzcyBub3cgZG9lcyB0aGUgbmVnb3RpYXRpb24gZnJvbSB0aGUgc3RyZWFtaW5nIHRocmVhZCB3ZSBoYXZlCisJICB0byBiZSBjYXJlZnVsIGFuZCBjaGVjayBpZiB0aGUgc3RyZWFtIGlzIHJlYWR5IGJlZm9yZSBjaGFuZ2luZyBpdHMgY29ya2VkIHN0YXRlLgorCisyMDExLTA4LTA1IDEyOjI3OjE4ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBjaGVjazogVXNlIEdTVF9DRkxBR1Mgd2hlbiBidWlsZGluZyB0ZXN0cworCSAgRW5zdXJlcyB3ZSBoYXZlIHRoZSBwcm9wZXIgZGVmaW5lIGZvciB1c2luZyB1bnN0YWJsZSBBUEkKKworMjAxMS0wOC0wNSAwODo1OTo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBpc29tcDQ6IGZpeHVwIGFmdGVyIHNtYWxsIGFwaSBjaGFuZ2VzCisJICBQb3J0IHRvIHJlY2VudGx5IGNoYW5nZWQgYXBpIHNvIHRoYXQgaXQgY29tcGlsZXMgYWdhaW4uCisKKzIwMTEtMDgtMDUgMTE6MzI6NDUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QveTRtL01ha2VmaWxlLmFtOgorCSAgeTRtZW5jOiBOb3cgZGVwZW5kcyBvbiBsaWJnc3R2aWRlbworCisyMDExLTA4LTA0IDE4OjQxOjI5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlOiBtb3JlIGNsZWFudXBzCisKKzIwMTEtMDgtMDQgMTg6MTU6NTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzcmM6IHNtYWxsIGNsZWFudXBzCisKKzIwMTEtMDgtMDQgMTY6MzU6NDYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IGNhbGwgc2V0X2NhcHMgbWV0aG9kIG9mIGJhc2VjbGFzcworCSAgQ2FsbCB0aGUgYmFzZWNsYXNzIHNldF9jYXBzIGZ1bmN0aW9uIHRvIG1ha2UgaXQgc2VuZCB0aGUgY2FwcyBldmVudCBhbmQKKwkgIHByb3Blcmx5IHRyaWdnZXIgdGhlIG5lZ290aWF0aW9uIGZ1bmN0aW9ucy4KKworMjAxMS0wOC0wNCAxNjoyNTowNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogc21hbGwgY2xlYW51cHMKKworMjAxMS0wOC0wNCAxNToyNToyMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSAgZ29vbTogcG9ydCB0byBuZXcgY2FwcworCisyMDExLTA4LTA0IDEzOjUyOjE4ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiBTaXplIHZhcmlhYmxlIHNob3VsZCBiZSBhIGd1aW50IGFuZCBub3QgYSBnc2l6ZQorCisyMDExLTA4LTA0IDEyOjUwOjAxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogYWN0aXZhdGUgdGhlIHBvb2wgaW4gZmFsbGJhY2sKKwkgIFdoZW4gbm9ib2R5IGlzIHVzaW5nIG91ciBwb29sLCBhY3RpdmF0ZSBpdCBvdXJzZWx2ZXMuCisJICBBdm9pZCBsZWFraW5nIHRoZSBidWZmZXIgYXJyYXkuCisJICBTZXQgZGVmYXVsdCBwb29sIGNvbmZpZ3VyYXRpb24gd2l0aCBjYXBzLgorCSAgRG9uJ3Qga2VlcCBjdXJyZW50X2NhcHMsIGNvcmUgZG9lcyB0aGF0IGZvciB1cyBub3cuCisKKzIwMTEtMDgtMDMgMjI6NTc6NDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6CisJICBmaXggY29tcGlsYXRpb24KKwkgIGhhbCBlbGVtZW50cyB3ZXJlIHJlbW92ZWQsIHJlbW92ZSB0aGVtIGZyb20gZG9jcyB0b28KKwkgIGNoYW5nZSBleGFtcGxlIGZvciBwYWQtYmxvY2sgQVBJIChhY3R1YWxseSByZW1vdmUgdGhlIHBhZCBibG9jaywgYW4gYXBwbGljYXRpb24KKwkgIHNob3VsZCBub3QgYmUgYm90aGVyZWQgd2l0aCB3b3JraW5nIGFyb3VuZCBidWdzIGluIGVsZW1lbnRzKQorCisyMDExLTA4LTAzIDE4OjM3OjI3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgcG9ydCB0byBuZXcgQVBJCisKKzIwMTEtMDgtMDMgMTg6MjU6MzAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9wdWxzZS9wdWxzZXNpbmsuYworCSAgZXh0L3B1bHNlL3B1bHNlc3JjLmMKKwkgIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYworCSAgZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYworCSAgZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmMKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jCisKKzIwMTEtMDgtMDMgMjI6NTA6MDUgKzEwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS5jOgorCSAgbWF0cm9za2E6IFJlZ2lzdGVyIG5ldyBkZWJ1ZyBjYXRlZ29yeQorCSAgUmVnaXN0ZXIgdGhlIG1hdHJvc2thcmVhZGNvbW1vbiBkZWJ1ZyBjYXRlZ29yeSB3aGVuIHRoZQorCSAgcGx1Z2luIGlzIGxvYWRlZCB0byBhdm9pZCBhc3NlcnRpb24gb3V0cHV0IHdoZW4gZGVidWcgaXMgdHVybmVkIG9uLgorCisyMDExLTA4LTAzIDEzOjM4OjAxICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvaWNsZXMvZ2RrcGl4YnVmc2luay10ZXN0LmM6CisJICB0ZXN0L2lja2xlczogUG9ydCBnZGtwaXhidWZzaW5rIHRlc3QKKworMjAxMS0wOC0wMyAxMzozMzo1OSArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXV0b2RldGVjdC5jOgorCSAgUmV2ZXJ0ICJ0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogRGlzYWJsZSBhdXRvZGV0ZWN0IHRlc3QgdGVtcG9yYXJpbHksIHNvIHRoYXQgdGhlIGJ1aWxkIGJvdHMgdXBkYXRlIC1iYWQgYW5kIHRoZSByYW5rcyBvZiB1bnIuLi4iCisJICBUaGlzIHJldmVydHMgY29tbWl0IDQ3NWFlZDhhZjZkMmE1N2MxZDIxNDkwYzgyNGU3NTRhNmIyMzY3YTkuCisJICBJdCB3b24ndCBjb25zaWRlciBlbGVtZW50cyBmcm9tIGFueXdoZXJlIGVsc2UgYW55bW9yZQorCisyMDExLTA4LTAzIDEzOjEwOjQ2ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9wYXJzZXIuYzoKKwkgIGNoZWNrOiBVcGRhdGUgcGFyc2VyIG1pbmktbGliIHRvIDAuMTEgQVBJCisKKzIwMTEtMDgtMDMgMTM6MDk6MDcgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBwby9QT1RGSUxFUy5pbjoKKwkgIHBvOiB1cGRhdGUgZm9yIG1vZGlmaWVkIHNvdXJjZSBmaWxlIGxvY2F0aW9uCisKKzIwMTEtMDgtMDMgMTM6MDg6NDMgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmUuYWM6IGNhaXJvX2dvYmplY3QgaXNuJ3QgcG9ydGVkIGVpdGhlcgorCisyMDExLTA4LTAzIDEwOjU5OjU2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2hhbC9NYWtlZmlsZS5hbToKKwkqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zaW5rLmM6CisJKiBleHQvaGFsL2dzdGhhbGF1ZGlvc2luay5oOgorCSogZXh0L2hhbC9nc3RoYWxhdWRpb3NyYy5jOgorCSogZXh0L2hhbC9nc3RoYWxhdWRpb3NyYy5oOgorCSogZXh0L2hhbC9nc3RoYWxlbGVtZW50cy5jOgorCSogZXh0L2hhbC9nc3RoYWxlbGVtZW50cy5oOgorCSogZXh0L2hhbC9oYWwuYzoKKwkqIGV4dC9oYWwvaGFsLmg6CisJICBoYWw6IFJlbW92ZSBoYWwgcGx1Z2luCisJICBoYWwgaXMgbm90IGRldmVsb3BlZCBhbnltb3JlIGFuZCBub2JvZHkgaXMgdXNpbmcgdGhlIHBsdWdpbiBub3dhZGF5cy4KKworMjAxMS0wNy0yOSAxMzowMzo1NSArMDIwMCAgUGhpbGlwcGUgTm9ybWFuZCA8cG5vcm1hbmRAaWdhbGlhLmNvbT4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBzb2Z0ZW4gYXNzZXJ0aW9uIGNoZWNrIG9uIHN0cmVhbSBzaXplCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU1NTcwCisKKzIwMTEtMDgtMDMgMTA6MDk6NDIgKzAyMDAgIFJvYmVydCBLcmFrb3JhIDxyb2Iua3Jha29yYUBtZXNzYWdlbmV0c3lzdGVtcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgcnRwanBlZ3BheTogQWRkIHN1cHBvcnQgZm9yIEguMjY0IHBheWxvYWQgaW4gTUpQRUcgY29udGFpbmVyCisJICBTZWUgaHR0cDovL3d3dy5xdWlja2NhbXRlYW0ubmV0L3V2Yy1oMjY0L1VTQl9WaWRlb19QYXlsb2FkX0guMjY0XzAuODcucGRmCisJICBGaXhlcyBidWcgIzY1NTUzMC4KKworMjAxMS0wOC0wMiAyMjowNTowOCAtMDQwMCAgVHJpc3RhbiBNYXR0aGV3cyA8dHJpc3RhbkBzYXQucWMuY2E+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuaDoKKwkgIGphY2thdWRpb3Npbms6IERvbid0IGNhbGwgZ19hbGxvY2EoKSBpbiBwcm9jZXNzX2NiCisJICBnX2FsbG9jYSgpIGlzIG5vdCBSVC1zYWZlLCBzbyBpbnN0ZWFkIHdlIHNob3VsZCBhbGxvY2F0ZSB0aGUKKwkgIG1lbW9yeSBuZWVkZWQgaW4gYWR2YW5jZS4gRml4ZXMgIzY1NTg2NgorCisyMDExLTA4LTAzIDA4OjU4OjAwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBBZGQgaGFsIHRvIHRoZSBsaXN0IG9mIG5vbi1wb3J0ZWQgcGx1Z2lucworCisyMDExLTA4LTAzIDA4OjUzOjI0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBBZGQgbW9ub3Njb3BlIHRvIHRoZSBsaXN0IG9mIG5vbi1wb3J0ZWQgcGx1Z2lucworCisyMDExLTA4LTAzIDA4OjUxOjE5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkgIGVmZmVjdHY6IEZpeCB1bnVzZWQgYnV0IHNldCB2YXJpYWJsZSBjb21waWxlciB3YXJuaW5ncworCisyMDExLTA4LTAyIDIzOjQyOjU4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgZG9jczogZml4IHR3byBtb3JlIFNpbmNlOiB0YWdzCisKKzIwMTEtMDctMzEgMDQ6MTk6MDAgKzAzMDAgIE1hcnQgUmF1ZHNlcHAgPGxlaW9AZ2VudG9vLm9yZz4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogRml4IFNpbmNlIHRhZ3MgZm9yIGZpZWxkYW5hbHlzaXMgcmVsYXRlZCBuZXcgcHJvcGVydGllcworCSAgY29tbWl0IGMxYjEwMGNmOWMgaXMgYWZ0ZXIgMC4xMC4yOSBhbmQgMC4xMC4zMCB3YXMgYSBicmFuY2hlZCByZWxlYXNlLgorCSAgU28gZml4IFNpbmNlIHRhZ3MgZnJvbSAwLjEwLjI5IHRvIDAuMTAuMzEgZm9yIHRoZSBuZXcgcHJvcGVydGllcy4KKworMjAxMS0wOC0wMiAxMTo1MTo0NSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkgIHJ0cHZvcmJpc3BheTogZml4IHBvcnRpbmcgZXJyb3IKKworMjAxMS0wOC0wMiAxMToyOTo0MCArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZS5hYzogRGVmaW5lIGxpc3Qgb2Ygbm9uLXBvcnRlZCBwbHVnaW5zCisKKzIwMTEtMDgtMDIgMTE6Mjk6MjUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBVcGRhdGUgY29tbW9uIHN1Ym1vZHVsZQorCisyMDExLTA4LTAyIDExOjE3OjM4ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlLmFjOiBTb3J0IEFHX0dTVF9DSEVDS19QTFVHSU4gYWxwaGFiZXRpY2FsbHkKKworMjAxMS0wNy0yOSAxNzoyNzowNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5Lmg6CisJICAtZ29vZDogZml4IGZvciBidWZmZXJwb29sIEFQSSBjaGFuZ2UKKworMjAxMS0wNy0yOSAxNzoyMTowMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDogY2hhbmdlIGZvciBuZXcgQVBJCisKKzIwMTEtMDctMjkgMTM6MDU6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGZpeCB2YXJpYWJsZS1zZXQtYnV0LW5vdC11c2VkIGNvbXBpbGVyIHdhcm5pbmcgd2l0aCBvbGRlciBwdWxzZSB2ZXJzaW9ucworCisyMDExLTA3LTI5IDEyOjA3OjI0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogcHJvcGVybHkgaW5pdCBydGNwX21pbl9pbnRlcnZhbAorCisyMDExLTAzLTA5IDExOjA0OjM2ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSAgcHVsc2VzaW5rOiBBZGQgc3VwcG9ydCBmb3IgY29tcHJlc3NlZCBmb3JtYXRzCisJICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgdmFyaW91cyBjb21wcmVzc2VkIGZvcm1hdHMgKEFDMywgRS1BQzMsIERUUyBhbmQKKwkgIE1QMykgcGF5bG9hZGVkIGluIElFQyA2MTkzNyBmb3JtYXQgKHVzZWQgZm9yIHRyYW5zbWlzc2lvbiBvdmVyIFMvUERJRiwKKwkgIEhETUkgYW5kIEJsdWV0b290aCkuCisJICBUaGUgYWNjZXB0Y2FwcygpIGZ1bmN0aW9uIGFsbG93cyBiaW5zIHRvIHByb2JlIGZvciB3aGF0IGZvcm1hdHMgdGhlIHNpbmsKKwkgIGJlaW5nIGNvbm5lY3RlZCB0byBzdXBwb3J0LiBUaGlzIG9ubHkgd29ya3MgYWZ0ZXIgdGhlIGVsZW1lbnQgaXMgc2V0IHRvCisJICBhdCBsZWFzdCBSRUFEWS4KKwkgIElmIHRoZSB1bmRlcmx5aW5nIHNpbmsgY2hhbmdlcyBhbmQgdGhlIGZvcm1hdCB3ZSBhcmUgc3RyZWFtaW5nIGlzIG5vdAorCSAgYXZhaWxhYmxlLCB3ZSBlbWl0IGEgbWVzc2FnZSB0aGF0IHdpbGwgYWxsb3cgdXBzdHJlYW0gZWxlbWVudHMvYmlucyB0bworCSAgYmxvY2sgYW5kIHJlbmVnb3RpYXRlIGEgbmV3IGZvcm1hdC4KKworMjAxMS0wMy0wMSAxNTozNDo0NiArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuaDoKKwkgIHB1bHNlc2luazogVXNlIHRoZSBleHRlbmRlZCBzdHJlYW0gQVBJIGlmIGF2YWlsYWJsZQorCSAgVGhpcyB1c2VzIHRoZSBuZXcgZXh0ZW5kZWQgQVBJIGZvciBjcmVhdGluZyBzdHJlYW1zLiBUaGlzIHdpbGwgYWxsb3cgdXMKKwkgIHRvIHN1cHBvcnQgY29tcHJlc3NlZCBmb3JtYXRzIG5hdGl2ZWx5IGluIHB1bHNlc2luayBhcyB3ZWxsLgorCisyMDExLTA3LTI5IDAwOjA3OjUyICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuaDoKKwkgIHB1bHNlc3JjOiBBZGQgYSBzb3VyY2Utb3V0cHV0LWluZGV4IHByb3BlcnR5CisJICBUaGlzIGV4cG9zZXMgdGhlIHNvdXJjZSBvdXRwdXQgaW5kZXggb2YgdGhlIHJlY29yZCBzdHJlYW0gdGhhdCB3ZSBvcGVuCisJICBzbyB0aGF0IGNsaWVudHMgY2FuIHVzZSB0aGlzIHdpdGggdGhlIGludHJvc3BlY3Rpb24gaWYgdGhleSB3YW50ICh0bworCSAgbW92ZSB0aGUgc3RyZWFtLCBmb3IgZXhhbXBsZSkuCisKKzIwMTEtMDctMjggMTQ6NDQ6NTcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cHNzcmNkZW11eDoga2VlcCBhIHJlZiBvbiB0aGUgc3JjIHBhZCB3aGlsZSB1c2luZyBpdAorCSAgUHJldmVudCBhIHBvc3NpYmxlIHJhY2UgaWYgY2xlYXJfc3NyYygpIGlzIGNhbGxlZCBiZXR3ZWVuIGdldHRpbmcgdGhlIHBhZCBhbmQKKwkgIGRvaW5nIHRoZSBwdXNoLgorCSAgQmFzZWQgb24gcGF0Y2ggYnkgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA5MTYKKworMjAxMS0wNS0yNCAxMToyOTo1NyArMDMwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguaDoKKwkgIHJ0cHNzcmNkZW11eDogTWFrZSB0aGUgcGFkcyBsb2NrIHJlY3Vyc2l2ZSBhbmQgaG9sZCBpdCBhY3Jvc3MgdGhlIHNpZ25hbCBlbWl0CisJICBXZSBuZWVkIHRvIGtlZXAgdGhlIGxvY2sgaGVsZCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgYSBwdXNoIGJlZm9yZSB0aGUgIm5ldy1zc3JjLXBhZCIKKwkgIGhhbmRsZXIgaGFzIGNvbXBsZXRlZC4gQnV0IHdlIG1heSB3YW50IHRvIHB1c2ggYW4gZXZlbnQgZnJvbSBpbnNpZGUgdGhhdCBoYW5kbGVyLCBoZW5jZQorCSAgdGhlIHJlY3Vyc2l2ZSBtdXRleC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA5MTYKKworMjAxMS0wNS0yNCAxMToxNzoyNSArMDMwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBydHBzc3JjZGVtdXg6IFVzZSBQQURzIGxvY2sKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA5MTYKKworMjAxMS0wNy0yOCAxMTowOTowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJICBzcGVleDogdXBkYXRlIGZvciBwb3NpdGlvbi9xdWVyeS9jb252ZXJ0IEFQSSBjaGFuZ2VzCisKKzIwMTEtMDctMjggMTA6NTQ6MzggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2c2Vlay5jOgorCSogZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgZ3N0OiB1ZHBhdGUgZm9yIHBvc2l0aW9uL2R1cmF0aW9uL2NvbnZlcnQgcXVlcnkgQVBJIGNoYW5nZXMKKworMjAxMS0wNy0yOCAwMDozNzoxMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggY29tcGlsZXIgd2FybmluZworCSAgZ3N0YXZpZGVtdXguYzogSW4gZnVuY3Rpb24gJ2dzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtJzoKKwkgIGdzdGF2aWRlbXV4LmM6MTI2MToyNDogZXJyb3I6ICdkYXRhJyBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24gWy1XZXJyb3I9dW5pbml0aWFsaXplZF0KKwkgIGdzdGF2aWRlbXV4LmM6MTIwNDoxMTogbm90ZTogJ2RhdGEnIHdhcyBkZWNsYXJlZCBoZXJlCisKKzIwMTEtMDctMjcgMTg6MTU6MjAgKzAxMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuaDoKKwkgIHJ0cGgyNjRkZXBheTogQ29wZSB3aXRoIEZVLUEgRSBiaXQgbm90IGJlaW5nIHNldAorCSAgU29tZSBoMjY0IHBheWxvYWRlcnMgYXJlIHVuZm9ydHVuYXRlbHkgYnVnZ3kgYW5kIGRvbid0IGNvcnJlY3RseSBzZXQgdGhlCisJICBFIGJpdCBpbiBGVS1BIE5BTCB3aGVuIHRoZXkgaGF2ZSBlbmRlZC4gV29yayBhcm91bmQgdGhpcyBieSBhc3N1bWluZworCSAgc3VjaCBhIGZyYWdtZW50YXRpb24gdW5pdCBoYXMgZW5kZWQgd2hlbiB0aGVyZSB3YXMgbm8gcGFja2V0IGxvc3MgYW5kIGEKKwkgIG5ldyBOQUwgaXMgc3RhcnRlZAorCisyMDExLTA0LTEyIDE3OjAxOjQ3ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5oOgorCSAgYWMzcGFyc2U6IFN1cHBvcnQgc3dpdGNoaW5nIGFsaWdubWVudCBvbi10aGUtZmx5CisJICBUaGlzIGFsbG93cyBzd2l0Y2hpbmcgb2YgYWxpZ25tZW50IGZvciBFLUFDMyBzdHJlYW1zIGF0IHJ1bi10aW1lLiBUaGlzCisJICBpcyByZXF1ZXN0ZWQgYnkgZG93bnN0cmVhbSBlbGVtZW50cyB2aWEgYSBjdXN0b20gZXZlbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwMzEzCisKKzIwMTEtMDctMjcgMTY6NDY6NDYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDI6IHJlbW92ZSB1bnVzZWQgdmFyaWFibGVzCisJICBVc2UgdGhlIG1vcmUgc3BlY2lhbGl6ZWQgdHlwZSBmb3IgdGhlIGJ1ZmZlcnBvb2wuCisJICBVc2UgdGhlIHNpemUgZnJvbSB0aGUgZHJpdmVyIGFzIHRoZSBzaXplIG9mIHRoZSBpbWFnZSB0byByZWFkLgorCSAgRG9uJ3QgY29uZmlndXJlIHRoZSBwb29sIHdoZW4gY3JlYXRlZC4gVGhpcyB3aWxsIGJlIGRvbmUgaW4gdGhlIHNldHVwX2FsbG9jYXRpb24KKwkgIG1ldGhvZCBsYXRlciBvciBieSB1cHN0cmVhbSBmb3Igc2lua3MuCisJICBSZW1vdmUgdW51c2VkIHByb3BlcnRpZXMgYW5kIHZhcmlhYmxlcy4gQnVmZmVycG9vbCBzaXplcyBhcmUgbm93IGNvbmZpZ3VyZWQgaW4KKwkgIHRoZSBidWZmZXJwb29sIGJ5IHRoZSBlbGVtZW50cyBpbiB0aGUgcGlwZWxpbmUuIFdlIG1pZ2h0IHdhbnQgdG8gaW5mbHVlbmNlIHRoZQorCSAgcG9vbCBzaXplIGxhdGVyIHNvbWVob3cuCisKKzIwMTEtMDctMjcgMTM6NDY6MDkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICB2NGwyYnVmZmVycG9vbDogcmVtb3ZlIHVudXNlZCB2YXJpYWJsZQorCisyMDExLTA3LTI3IDEzOjQzOjA4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBhZGQgbWV0YWRhdGEKKworMjAxMS0wNy0yNyAxMzo0MToyOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICBidWZmZXJwb29sOiBjaGVjayBmb3IgbWV0YWRhdGEKKwkgIE9ubHkgYWRkIHZpZGVvIG1ldGFkYXRhIHdoZW4gaXQgd2FzIGNvbmZpZ3VyZWQgaW4gdGhlIHBvb2wuIEZhaWwgaWYgdGhlcmUgd2FzIG5vCisJICB2aWRlbyBtZXRhZGF0YSBjb25maWd1cmVkIGFuZCB0aGUgc3RyaWRlcyBhcmUgbm90IHRoZSBkZWZhdWx0IG9uZXMuCisKKzIwMTEtMDctMjcgMTI6NDI6MjEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuaDoKKwkgIHdhcnA6IGFkZCBzdHJpZGUgc3VwcG9ydAorCisyMDExLTA3LTI3IDEyOjQxOjMzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBhZGQgY29sb3JzcGFjZSB0byBkZWJ1ZworCisyMDExLTA3LTI2IDE3OjQ1OjAxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cDogZml4IGNvbXBpbGF0aW9uCisKKzIwMTEtMDctMjYgMTY6MTU6MDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDI6IHJlbmFtZSBhIHZhcmlhYmxlCisJICBSZW5hbWUgdGhlIHNpemUgdmFyaWFibGUgdG8gc2l6ZWltYWdlIGFuZCBmaWxsIGl0IHdpdGggdGhlIHNpemUgdGhhdCBoYXMgYmVlbgorCSAgZ2l2ZW4gdG8gdXNlIGJ5IHRoZSB2NGwyIGRyaXZlciBpbnN0ZWFkIG9mIG1ha2luZyBzb21ldGhpbmcgdXAuLgorCisyMDExLTA3LTI2IDEzOjE4OjU1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMjogdXNlIG5ldyBzZXR1cF9hbGxvY2F0aW9uIHZtZXRob2QKKworMjAxMS0wNy0yNiAxMDo1NjowNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGltcGxlbWVudCBtb3JlIGJpdHMgb2YgUlcgSS9PIG1vZGUKKwkgIEltcGxlbWVudCB0aGUgcmVsYWVzZSBvZiBSVyBidWZmZXJzIGluIHRoZSBwb29sLgorCSAgV2FybiBmb3IgdW5zdXBwb3J0ZWQgd3JpdGUoKSBtb2RlIGZvciBzaW5rcy4KKworMjAxMS0wNy0yNiAxMDo1NDoyMyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogaW1wcm92ZSBJTyBtb2RlIGVycm9yIGhhbmRsaW5nCisJICBFcnJvciBvdXQgd2hlbiBhbiB1bnN1cHBvcnRlZCBJTyBtb2RlIHdhcyBzZWxlY3RlZAorCisyMDExLTA0LTA5IDEyOjI2OjU2ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYWMzcGFyc2UuYzoKKwkgIGFjM3BhcnNlOiBBZGQgc3VwcG9ydCBmb3IgSUVDIDYxOTM3IGFsaWdubWVudAorCSAgV2hlbiBwdXNoaW5nIG91dCBidWZmZXJzIG92ZXIgUy9QRElGIG9yIEhETUksIElFQyA2MTkzNyBwYXlsb2FkaW5nCisJICByZXF1aXJlcyBlYWNoIGJ1ZmZlciB0byBjb250YWluIDYgYmxvY2tzIGZyb20gZWFjaCBzdWJzdHJlYW0uIFRoaXMgYWRkcworCSAgY29kZSB0byBjb2xsZWN0IGFsbCB0aGUgZnJhbWVzIG5lZWRlZCB0byBtZWV0IHRoaXMgcmVxdWlyZW1lbnQgYmVmb3JlCisJICBwdXNoaW5nIG91dCBhIGJ1ZmZlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTAzMTMKKworMjAxMS0wNi0wOCAxNTo1NzozNyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogQWx3YXlzIHNlbmQgYXBwbGljYXRpb24gcmVxdWVzdGVkIGZlZWRiYWNrIGluIGltbWVkaWF0ZSBtb2RlCisJICBTZW5kIGFzIG1hbnkgYXBwbGljYXRpb24gcmVxdWVzdGVkIGZlZWRiYWNrIG1lc3NhZ2VzIGluIGltbWVkaWF0ZSBtb2RlLCBldmVuIGlmIHRoZXkKKwkgIGhhdmUgYWxyZWFkeSBiZWVuIHNlbnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0NTgzCisKKzIwMTEtMDYtMDggMTQ6NDg6MDEgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IERvbid0IGxldCB0aGUgY29tcHV0ZWQgUlRQIGJhbmR3aWR0aCBmYWxsIHRvbyBsb3cKKwkgIElmIGl0IGZhbGxzIHRvbyBsb3csIHRoZSBjb21wdXRlZCBSVENQIGJhbmR3aWR0aCB3aWxsIGJlIG5lYXIgemVybyBhbmQKKwkgIHRoZSBSVENQIHRocmVhZCB3aWxsIGJlIHN0b3BwZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0NTgzCisKKzIwMTEtMDQtMjUgMTY6MTM6MzggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogV2FpdCBsb25nZXIgdG8gdGltZW91dCBTU1JDIGNvbGxpc2lvbgorCSAgVXNpbmcgdGhlIGN1cnJlbnQgUlRDUCBpbnRlcnZhbCB0byB0aW1lb3V0IFNTUkMgY29sbGlzaW9uIGNhbiBsZWFkIHRvCisJICBjb2xsaXNpb25zIGJlaW5nIHRpbWVkIG91dCBpbW1lZGlhdGVseSBpZiBhIEJZRSBwYWNrZXQgaXMgc2VudCBiZWNhdXNlCisJICBpdCBpcyBzZW50IGltbWVkaWF0ZWx5LCBzbyB0aGUgaW50ZXJ2YWwgaXMgMC4gVGhpcyBpcyBub3Qgd2hhdCB3ZQorCSAgd2FudC4gU28ganVzdCBzZXQgYSBzdGF0aWMgMTAgdGltZXMgdGhlIGRlZmF1bHQgUlRDUCBpbnRlcnZhbCwgaXQKKwkgIHNob3VsZCBiZSBlbm91Z2gKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDg2NDIKKworMjAxMS0wNy0yNSAxNTo1MToyMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICB2NGwyOiByZW1vdmUgdW51c2VkIG1ldGhvZAorCisyMDExLTA3LTI1IDE1OjM4OjM4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogZml4IGZsdXNoaW5nIHN0YXJ0IGFuZCBzdG9wCisJICBNb3ZlIHRoZSBmbHVzaGluZyBjYWxscyB0byB0aGUgcmlnaHQgcGxhY2UgaW4gdGhlIGJ1ZmZlcnBvb2wuCisJICBGaXggdGhlIG1pbiBhbmQgbWF4IGJ1ZmZlciBzaXplcy4KKworMjAxMS0wNy0yNSAxNDo0NzowNSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICB2NGwyOiBkZXF1ZXVlIGJ1ZmZlcnMgd2hlbiBhbGwgYXJlIHF1ZXVlZAorCSAgUHJlZmVyIHRvIGFsd2F5cyB1c2UgdGhlIGRlZmF1bHQgYnVmZmVycG9vbCBxdWV1ZSBmb3IgdGhlIF9hY3F1aXJlIGZ1bmN0aW9uCisJICBiZWNhdXNlIGl0IHByb3Blcmx5IHN1cHBvcnRzIHVuYmxvY2tpbmcgd2hlbiBzZXR0aW5nIGluYWN0aXZlIGV0Yy4gQXMgYSByZXN1bHQsCisJICB3ZSBuZWVkIHRvIGRlcXVldWUgYnVmZmVycyBhbmQgcHV0IHRoZW0gYmFjayBpbiB0aGUgYnVmZmVycG9vbCBxdWV1ZSB3aGVuIHdlCisJICBoYXZlIHF1ZXVlZCBhbGwgYnVmZmVycyBpbiB0aGUgc2luay4KKwkgIFJlbmFtZSBzb21lIHZhcmlhYmxlcyB0byBtb3JlIG1lYW5pbmdmdWxsIG5hbWVzIHRvIGF2b2lkIGEgcHJvYmxlbSB3aXRoCisJICBmcmVlaW5nIHRoZSB3cm9uZyBhbW91bnQgb2YgYnVmZmVycy4KKworMjAxMS0wNy0xOSAxMzozODowMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHNldCBTT1VSQ0UgZmxhZyBhdCBpbml0IHRpbWUKKwkgIEZpeGVzICM2NTQ4MTYuCisKKzIwMTEtMDctMjUgMTA6MTA6NTggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkgIHZlcnRpZ290djogYWRkIHN0cmlkZSBzdXBwb3J0CisKKzIwMTEtMDctMTkgMTg6MjU6MjkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBvbmx5IHRvIFNUUkVBTU9GRiB3aGVuIHN0cmVhbWluZworCSAgT25seSBjYWxsIFNUUkVBTU9GRiB3aGVuIHdlIHByZXZpb3VzbHkgY2FsbGVkIFNUUkVBTU9OCisKKzIwMTEtMDctMjIgMjE6MjY6MzIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuYzoKKwkgIHJlcGxheTogZml4IGZvciBldmVudCBoYW5kbGVyCisKKzIwMTEtMDctMjIgMjE6MTk6NDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZzZWVrLmM6CisJKiBnc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5jOgorCSAgZml4ZXMgZm9yIGV2ZW50IGhhbmRsZXIgY2hhbmdlcworCisyMDExLTA3LTE4IDE2OjQ2OjI3IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgcnRwaDI2NGRlcGF5OiBDb21wbGV0ZSBtZXJnZWQgQVUgb24gbWFya2VyIGJpdAorCSAgVGhlIG1hcmtlciBiaXQgb24gYSBSVFAgcGFja2V0IG1lYW5zIHRoZSBBVSBoYXMgYmVlbiBjb21wbGV0ZWQsIHNvIHB1c2ggaXQgb3V0CisJICBpbW1lZGlhdGVseSB0byByZWR1Y2UgdGhlIGxhdGVuY3kuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0ODUwCisKKzIwMTEtMDctMTggMjA6Mjc6MzggLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBydHBoMjY0cGF5OiBPbmx5IHNldCB0aGUgbWFya2VyIGJpdCBvbiB0aGUgbGFzdCBOQUxVIG9mIGEgbXVsdGktTkFMVSBhY2Nlc3MgdW5pdAorCSAgQW4gYWNjZXNzIHVuaXQgY291bGQgY29udGFpbiBtdWx0aXBsZSBOQUwgdW5pdHMsIGluIHRoYXQgY2FzZSwgb25seSB0aGUgbGFzdAorCSAgUlRQIHBhY2tldCBvZiB0aGUgbGFzdCBOQUxVIHNob3VsZCBoYXZlIGl0cyBtYXJrZXIgYml0IHNldC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTQ4NTAKKworMjAxMS0wNy0yMCAwODo1Mjo1OCArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZEBnbWFpbC5jb20+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJICBtdWx0aXBhcnQ6IGZpeCBjb21waWxlciB3YXJuaW5nCisKKzIwMTEtMDctMTkgMTg6MjA6NDMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJICB2NGwyOiBoYW5kbGUgdW5zdXBwb3J0ZWQgZm9ybWF0cworCisyMDExLTA3LTE5IDE2OjU5OjU1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDI6IEZpeCBzaW5rIGJ1ZmZlcnBvb2wgaGFuZGxpbmcKKwkgIFJlbW92ZSBvbGQgbWV0aG9kLCB1c2UgbmV3dyBfcHJvY2VzcyBtZXRob2QgZm9yIHRoZSBzaW5rLgorCSAgSW5mb3JtIHRoZSBwYXJlbnQgYnVmZmVycG9vbCBjbGFzcyBhYm91dCB0aGUgc2V0dGluZ3MgdG9vLiBUaGlzIGlzIG5lZWRlZCB0byBsZXQKKwkgIGl0IGtub3cgYWJvdXQgdGhlIG1heC1idWZmZXJzLgorCSAgQWxsb2NhdGUgdGhlIG5lZ290aWF0ZWQgbWF4LWJ1ZmZlcnMgYW5kIGluaXRpYWxseSBtbWFwIG1pbi1idWZmZXJzLiBUaGUgaWRlYSBpcworCSAgdGhhdCB0aGUgYnVmZmVycG9vbCB3aWxsIGFsbG9jYXRlIG1vcmUgd2hlbiBuZWVkZWQuCisJICBJbXByb3ZlIGRlYnVnZ2luZy4KKwkgIE9ubHkgcG9sbCBpbiBjYXB0dXJlIG1vZGUsIGl0IGRvZXMgbm90IHNlZW0gdG8gd29yayBpbiBwbGF5YmFjayBtb2RlIG9uIHRoaXMKKwkgIGJlYWdsZWJvYXJkLgorCisyMDExLTA3LTE5IDEyOjA1OjUxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSAgYXVwYXJzZTogYXZvaWQgaGFuZ2luZyBvbiBpbnZhbGlkIHNob3J0IGlucHV0CisJICAuLi4gYXMgaW4gc3VjaCBjYXNlIHRoZXJlIGlzIG5vIHNyY3BhZCB5ZXQgb24gd2hpY2ggdG8gZm9yd2FyZCBFT1MuCisKKzIwMTEtMDctMTggMTU6MTM6MzMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBGaXggZGVmYXVsdCB2YWx1ZSBsZWFraW5nCisJICBSZW1lbWJlciB0byBmcmVlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGNsaWVudCBuYW1lLCBhdm9pZGluZyBhCisJICBsZWFrCisKKzIwMTEtMDctMTggMTg6NTQ6NDkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgIHY0bDI6IE1vcmUgd29yayBvbiBidWZmZXJwb29scworCSAgQWRkIGRpZmZlcmVudCB0cmFuc3BvcnQgbWV0aG9kcyB0byB0aGUgYnVmZmVycG9vbCAoTU1BUCBhbmQgUkVBRC9XUklURSkKKwkgIERvIG1vcmUgcGFyc2luZyBvZiB0aGUgYnVmZmVycG9vbCBjb25maWcuCisJICBTdGFydCBhbmQgc3RvcCBzdHJlYW1pbmcgYmFzZWQgb24gdGhlIGJ1ZmZlcnBvb2wgc3RhdGUuCisJICBNYWtlIHNlcGFyYXRlIG1ldGhvZHMgZm9yIGdldHRpbmcgYSBidWZmZXIgZnJvbSB0aGUgcG9vbCBhbmQgZmlsbGluZyBpdCB3aXRoCisJICBkYXRhLiBUaGlzIGFsbG93cyB1cyB0byBmaWxsIGJ1ZmZlcnMgZnJvbSBvdGhlciBwb29scyB0b28uIEVpdGhlciB1c2UgY29weSBvcgorCSAgcmVhZCB0byBmaWxsIHVwIHRoZSB0YXJnZXQgYnVmZmVycy4KKwkgIEFkZCBwcm9wZXJ0eSB0byBmb3JjZSBhIHRyYW5zZmVyIG1vZGUgaW4gdjRsMnNyYy4KKwkgIEluY3JlYXNlIGRlZmF1bHQgbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gNC4KKwkgIE5lZ290aWF0ZSBidWZmZXJwb29sIGFuZCBpdHMgcHJvcGVydGllcyBpbiB2NGwyc3JjLgorCisyMDExLTA3LTE4IDE0OjI0OjQ4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIHJ0cGgyNjRkZXBheTogcmVzZXQgdXBvbiBGTFVTSF9TVE9QCisJICAuLi4gd2hpY2ggaXMgcGFydGljdWxhcmx5IG5lZWRlZCB3aGVuIG1lcmdpbmcgTkFMIHVuaXRzLCB3aGVyZSBub3QgcmVzZXR0aW5nCisJICB3b3VsZCBsZWFkIHRvIG91dHB1dCBvZiBhbiBvbGRlciAocHJlLWZsdXNoKSBBVSAod2l0aCB1bmludGVuZGVkIHRpbWVzdGFtcCkuCisKKzIwMTEtMDctMTggMTQ6MzA6NTEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIG11bHRpZmlsZXNpbms6IGRvIG5vdCB1c2UgZ19zbGlzdF9mcmVlX2Z1bGwKKwkgIC4uLiBhcyB0aGF0IGlzIG9ubHkgaW4gR0xpYiAyLjI4LCB3aGljaCBpcyBub3QgeWV0IHJlcXVpcmVkIGF0IHRoaXMgdGltZS4KKworMjAxMS0wNy0xOCAxMDo1MjoyMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgdjRsMjogYWRkIElPIG1ldGhvZCBlbnVtCisKKzIwMTEtMDctMTggMTA6NTE6MjEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICBidWZmZXJwb29sOiBpbXByb3ZlIF9uZXcgZnVuY3Rpb24KKworMjAxMS0wNy0xOCAwOTozODoyNiArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZEBnbWFpbC5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWx0aWZpbGUuYzoKKwkgIG11bHRpZmlsZXNpbms6IGFkZCBtYXgtZmlsZXMgcHJvcGVydHkKKwkgIEFkZCBtYXgtZmlsZXMgcHJvcGVydHkgdG8gbGltaXQgdGhlIG51bWJlciBvZiBmaWxlcyBzYXZlZCBvbiBkaXNrLgorCSAgQVBJOiBtdWx0aWZpbGVzaW5rOjptYXgtZmlsZXMKKworMjAxMS0wNy0xNyAyMzozNjo1NSArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZEBnbWFpbC5jb20+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgbXVsdGlmaWxlc2luazogcmVmYWN0b3IgZmlsZSBvcGVuaW5nIGFuZCBjbG9zaW5nIGNvZGUKKworMjAxMS0wNy0xNiAxOTozODo1MSArMDIwMCAgQWxleGV5IEZpc2hlciA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGZpeCBwaXhlbC1hc3BlY3QtcmF0aW8gaWYgaGVhZGVyIGhhcyBvbmx5IG9uZSBkaXNwbGF5IHZhcmlhYmxlCisJICBDdXJyZW50IG1hdHJvc2thIGRlbXV4IGNhbGN1bGF0ZXMgdGhlIHBpeGVsIGFzcGVjdCByYXRpbyBvbmx5IGlmIGJvdGgKKwkgIERpc3BsYXlIZWlnaHQgYW5kIERpc3BsYXlXaWR0aCBhcmUgc2V0LCBidXQgaXQgaXMgbGVnYWwgdG8gdXNlIG9ubHkKKwkgIG9uZSB2YXJpYWJsZSBpZiB0aGUgb3RoZXIgaXMgZXF1YWwgdG8gUGl4ZWxXaWR0aCBvciBQaXhlbEhlaWdodCwgYXQKKwkgIGxlYXN0IHRoZSBta2NsZWFuIHV0aWxpdHkgaXMgZG9pbmcgdGhhdC4gU28gdGhpcyBtYWtzZSBta2NsZWFuZWQKKwkgIGZpbGVzIHBsYXkgY29ycmVjdGx5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1NDc0NAorCisyMDExLTA3LTE2IDIzOjQ3OjUwICswMTAwICBBbnRvaW5lIEphY291dG90IDxhamFjb3V0b3RAb3BlbmJzZC5vcmc+CisKKwkqIGdzdC9nb29tL3BsdWdpbl9pbmZvLmM6CisJICBnb29tOiBmaXggYnVpbGQgb24gUFBDIG9uIG9wZW5ic2QKKwkgIEEgbWlzc2luZyBzeXMvcGFyYW0uaCBpbmNsdWRlIHJlc3VsdHMgaW46CisJICAvdXNyL2luY2x1ZGUvc3lzL3Byb2MuaDo2NDogZXJyb3I6ICdNQVhMT0dOQU1FJyB1bmRlY2xhcmVkIGhlcmUgKG5vdCBpbiBhCisJICBmdW5jdGlvbikKKwkgIC91c3IvaW5jbHVkZS9zeXMvcHJvYy5oOjI4NTogZXJyb3I6ICdNQVhDT01MRU4nIHVuZGVjbGFyZWQgaGVyZSAobm90IGluIGEKKwkgIGZ1bmN0aW9uKQorCSAgd2hlbiBjb21waWxpbmcgZ29vbSBvbiBvcGVuYnNkL3BwYy4gV2UgY2FuIGp1c3QgcmVtb3ZlIHRoZSB0d28gc3lzLyBpbmNsdWRlcworCSAgaGVyZSwgdGhleSBhcmUgbm90IG5lZWRlZCBmb3IgYW55dGhpbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0NzQ5CisKKzIwMTEtMDctMTUgMTc6MDY6MzkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0wNy0xNSAxNjo1NTo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogaW1wbGVtZW50IHNldHVwX2FsbG9jYXRpb24KKwkgIEltcGxlbWVudCB0aGUgc2V0dXBfYWxsb2NhdGlvbiB2bWV0aG9kLCB3ZSdsbCBob3BlZnVsbHkgZG8gc29tZXRoaW5nIGNsZXZlciBpbgorCSAgdGhlcmUgbGF0ZXIuCisKKzIwMTEtMDctMTUgMTY6MjY6MDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IGltcHJvdmUgYnVmZmVycG9vbCBjb25maWcgc2V0dGluZworCSAgUGFzcyB0aGUgY2FwcyBhbmQgdGhlIGRlZmF1bHQgdmlkZW8gc2l6ZSB0byB0aGUgYnVmZmVycG9vbCBjb25maWcuCisJICBEb24ndCBhY3RpdmF0ZSB0aGUgYnVmZmVycG9vbCwgdGhpcyB3aWxsIGJlIGRvbmUgYnkgdGhlIG9iamVjdCB0aGF0IGRlY2lkZXMgdG8KKwkgIHVzZSB0aGUgYnVmZmVycG9vbC4KKwkgIEltcHJvdmUgZGVidWdnaW5nIGFuZCBlcnJvciByZXBvcnRpbmcuCisKKzIwMTEtMDctMTUgMTM6NTI6MzggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBoYW5kbGUgZGVxdWV1ZWluZyBjb3JyZWNseQorCSAgRmlyc3QgY2xlYW4gdXAgdGhlIGJ1ZmZlcnMgaW4gdGhlIHF1ZXVlLCB0aGVuIHRoZSByZW1haW5pbmcgb25lcyBpbiB0aGUKKwkgIGRldmljZS4KKworMjAxMS0wNy0xNSAxMzoyOTo0MiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogdW5yZWYgY29waWVkIGJ1ZmZlcgorCSAgQWZ0ZXIgd2UgY29weSB0aGUgaW5jb21taW5nIGJ1ZmZlciB0byBvbmUgb2Ygb3VyIGJ1ZmZlcnBvb2wgYnVmZmVycywgdW5yZWYgdGhlCisJICB0YXJnZXQgYnVmZmVyIGFmdGVyIHJlbmRlcmluZyBzbyB0aGF0IGl0IGlzIHB1dCBiYWNrIGluIHRoZSBwb29sLgorCisyMDExLTA3LTE1IDEzOjA3OjExICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkgIHY0bDI6IGRlcXVldWUgYnVmZmVycyBmb3IgdGhlIHNpbmsKKwkgIFdoZW4gd2UgaGF2ZSBhbGwgYnVmZmVycyBxdWV1ZWQgZm9yIHBsYXliYWNrIGFuZCB3ZSBuZWVkIGEgbmV3IGVtcHR5IGJ1ZmZlciwKKwkgIGRlcXVldWUgb25lIGFuZCByZXR1cm4gaXQuCisJICBTZXQgdGhlIHJpZ2h0IHNpemUgZm9yIHNpbmsgYnVmZmVycy4KKwkgIEltcHJvdmUgY291bnRpbmcgb2YgcXVldWVkIGJ1ZmZlcnMuCisKKzIwMTEtMDctMTUgMTI6MzU6MTQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiB1c2UgdGhlIHBhcmVudCBxdWV1ZSBmb3IgdGhlIHNpbmsKKwkgIFdlIHdhbnQgdG8gbWFpbnRhaW4gYSBxdWV1ZSBvZiBmcmVlIGJ1ZmZlcnMgZm9yIHRoZSBzaW5rLCB1c2UgdGhlIHBhcmVudCBtZXRob2RzCisJICB0byBkbyB0aGF0LgorCisyMDExLTA3LTE1IDEyOjAwOjU0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogZml4IGVycm9yIG1lc3NhZ2VzCisKKzIwMTEtMDctMTUgMTE6MzA6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJICB2NGwyOiBhZGQgQUxMT0NBVElPTiBxdWVyeSB0byB0aGUgc2luaworCisyMDExLTA3LTE1IDExOjI3OjE4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIHY0bDI6IGNvbnZlcnQgdG8gR3N0QnVmZmVyUG9vbAorCSAgRXh0ZW5kIGZyb20gR3N0QnVmZmVyUG9vbC4KKwkgIEhhbmRsZSB0aGUgbGlmZXRpbWUgb2YgdGhlIHBvb2wgYnVmZmVycyBjb3JyZWN0bHkgd2l0aCB0aGUgc3RhcnQvc3RvcCB2bWV0aG9kcy4KKwkgIE1hcCBhY3F1aXJlIGFuZCByZWxlYXNlIGRpcmVjdGx5IHRvIFFCVUYgYW5kIERRQlVGLiBXZSBzdGlsbCBleHBvc2UgYW4gZXhwbGljaXQKKwkgIHFidWYgZm9yIHRoZSB2NGwyc2luayBmb3Igbm93LgorCisyMDExLTA3LTE1IDExOjE4OjAzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiByZW1vdmUgZXhwZXJpbWVudGFsIG1hcmtlcnMKKworMjAxMS0wNy0xNCAyMDoxMDowMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSAgcnRwcGNtQXBheS9kZXBheTogU3RhdGljIGNsb2NrIHJhdGVzIG9uIHN0YXRpYyBwYXlsb2FkcywgZHluYW1pYyBvbiBkeW5hbWljCisJICBQYXJ0aWFsbHkgcmV2ZXJ0cyAzOTdkYzYwYgorCisyMDExLTA3LTE0IDE2OjIxOjM2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBtZXJnZSBjb2RlCisKKzIwMTEtMDctMTQgMTY6MTI6MTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuaDoKKwkgIHY0bDI6IE1vdmUgb3V0cHV0IGRldGFpbHMgdG8gZGV2aWNlIG9iamVjdAorCSAgTW92ZSB0aGUgZGV0YWlscyBvZiBob3cgYSBidWZmZXIgaXMgcmVuZGVyZWQgdG8gdGhlIGRldmljZSBvYmplY3QuCisKKzIwMTEtMDMtMDQgMTU6NDE6MjIgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogSW1wbGVtZW50IGdldGNhcHMKKwkgIENvbnZlcnQgcHJvZmlsZS1sZXZlbC1pZCBmcm9tIFJUUCBjYXBzIGludG8gdmlkZW8veC1oMjY0IHN0eWxlIGNhcHMgKHdpdGggcHJvZmlsZSBhbmQgbGV2ZWwpCisKKzIwMTEtMDctMTMgMTg6MzI6MDAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5jOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5oOgorCSAgdjRsMjogbW92ZSBjYXB0dXJlIGNvZGUgdG8gZGV2aWNlIG9iamVjdAorCSAgTW92ZSB0aGUgZGV0YWlscyBvZiBob3cgdG8gY2FwdHVyZSB0byB0aGUgZGV2aWNlIG9iamVjdC4gUmVtb3ZlIHRoZQorCSAgdjRsMnNyY19jYWxscy5bY2hdIGZpbGVzIGJlY2F1c2UgdGhleSBhcmUgZW1wdHkgbm93LgorCSAgUHJvdmlkZSB0d28gc2ltcGxlIG1ldGhvZHMgdG8gZ2V0IGFuZCByZXR1cm4gYSBidWZmZXIgdG8gdGhlIGRldmljZS4KKwkgIEFsc28gZG8gYSBzbG93IGNvcHkgd2hlbiB0aGUgYnVmZmVyIGlzIG5vdCBmcm9tIG91ciBwb29sLgorCisyMDExLTA3LTEzIDE2OjU4OjA4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBhZGQgc29tZSBtb3JlIGRlYnVnCisKKzIwMTEtMDctMTMgMTY6NTY6MjEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJICB2NGwyOiBzdG9wIHN0cmVhbWluZyBpbiBSRUFEWSBhbmQgTlVMTAorCisyMDExLTA3LTEzIDE2OjQwOjM5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBzdGFydCBzdHJlYW1pbmcgZm9yIHRoZSBvdXRwdXQgYXMgd2VsbAorCisyMDExLTA3LTEzIDE2OjMzOjU4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnJhZGlvLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuaDoKKwkgIHY0bDI6IExldCB0aGUgZGV2aWNlIG9iamVjdCBtYW5hZ2UgdGhlIHBvb2wKKwkgIFJlbmFtZSBzdGFydCBhbmQgc3RvcCBtZXRob2RzIHRvIG9wZW4gYW5kIGNsb3NlIGJlY2F1c2UgdGhhdCBpcyB3aGF0IHRoZXkgZG8uCisJICBBZnRlciBzZXR0aW5nIHRoZSBmb3JtYXQgb24gdGhlIGRldmljZSBvYmplY3QsIHNldHVwIHRoZSBidWZmZXJwb29scy4gTW92ZSB0aGlzCisJICBjb2RlIGZyb20gdGhlIHY0bDJzcmNfY2FsbHMuYyBmaWxlLCBpdCBpcyBzaGFyZWQgYmV0d2VlbiBzb3VyY2UgYW5kIHNpbmsuCisJICBNYWtlIG5ldyBkZXZpY2Ugc3RhcnQgYW5kIHN0b3AgbWV0aG9kIHRoYXQgbWVyZ2VzIHZhcmlvdXMgYml0cyBvZiBjb21tb24gY29kZQorCSAgc3ByZWFkIG92ZXIgc2V2ZXJhbCBmaWxlcy4KKworMjAxMS0wNy0xMyAxMzo1MjozMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIHY0bDI6IGRvbid0IHN0b3JlIHN0cmlkZSBpbiB0aGUgdmlkZW9pbmZvCisJICBXZSB3YW50IHRvIGtlZXAgdGhlIGRlZmF1bHQgc3RyaWRlcyBpbiB0aGUgdmlkZW9pbmZvLiBLZWVwIHRoZSBzdHJpZGUgb2YgdGhlCisJICB2aWRlbyBmcmFtZXMgc2VwYXJhdGUgc28gdGhhdCB3ZSBjYW4gdXNlIGJvdGggdG8gY29weSBhIHZpZGVvIGZyYW1lIGFuZCBkbworCSAgY29ycmVjdCBzdHJpZGUgY29udmVyc2lvbi4KKworMjAxMS0wNy0xMyAxMzozODoxNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDI6IFVzZSB2aWRlbyBmcmFtZSBjb3B5IGZvciByYXcgdmlkZW8KKwkgIFVzZSB0aGUgdmlkZW8gZnJhbWUgY29weSBBUEkgZm9yIHJhdyB2aWRlbyBmcmFtZXMgc28gdGhhdCB3ZSBjb3B5IHdpdGggdGhlIHJpZ2h0CisJICBzdHJpZGVzLgorCisyMDExLTA3LTEzIDEzOjM3OjU4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMjogYWRkIHZpZGVvIG1ldGFkYXRhIHRvIHJhdyB2aWRlbyBidWZmZXJzCisKKzIwMTEtMDctMTMgMTM6MTU6MDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBzbWFsbCBjbGVhbnVwcworCisyMDExLTA3LTEzIDEzOjAwOjQyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyOiBpbXByb3ZlIGNhcHMgcGFyc2luZworCSAgVXNlIEdzdFZpZGVvSW5mbyB0byBzdG9yZSB0aGUgcGFyc2VkIGNhcHMuCisJICBSZW1vdmUgb3V0c2l6ZSBmcm9tIHRoZSBjYXBzIHBhcnNpbmcgY29kZSwgaXQncyB3cm9uZyBiZWNhdXNlIGl0IGRvZXMgbm90IHVzZQorCSAgdGhlIHN0cmlkZSBnaXZlbiBieSB0aGUgZHJpdmVyLgorCisyMDExLTA3LTEzIDExOjQwOjExICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiB1c2UgZXJybm8KKworMjAxMS0wNy0xMyAxMTozNjo1NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogaGFuZGxlIEVJTlZBTCB3aXRob3V0IHBvc3RpbmcgYSB3YXJuaW5nCisJICBFSU5WQUwgbWVhbnMgdGhhdCBhIGNhbGwgaXMgbm90IHN1cHBvcnRlZCwgd2Ugb25seSB3YW50IHRvIHBvc3QgYSBXQVJOSU5HIHdoZW4KKwkgIHNvbWV0aGluZyBpcyByZWFsbHkgd3JvbmcuCisKKzIwMTEtMDctMTMgMTE6Mjk6MjYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IG9ubHkgc2V0IGZyYW1lcmF0ZSBmb3IgY2FwdHVyZSBmb3Igbm93CisKKzIwMTEtMDctMTMgMTE6MTk6MjggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmg6CisJICB2NGwyOiBNb3ZlIGNvbmZpZ3VyYXRpb24gb2YgZnJhbWVyYXRlIHRvIF9zZXRfZm9ybWF0CisJICBNb3ZlIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBmcmFtZXJhdGUgdG8gd2hlcmUgd2Ugc2V0IHRoZSBvdGhlciBmb3JtYXQKKwkgIHBhcmFtZXRlcnMuCisJICBSZW1vdmUgaGFjayB0byBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIGFjdGl2ZS4KKwkgIFN0b3JlIHN0cmVhbXBhcm0gaW4gdGhlIGRldmljZSBpbmZvLgorCSAgVXNlIHNvbWUgbWFjcm9zIHRvIGFjY2VzcyB0aGUgY3VycmVudCBkZXZpY2UgY29uZmlndXJhdGlvbi4KKwkgIFJlbW92ZSBzb21lIGR1cGxpY2F0ZSBmaWVsZHMgaW4gc3JjIGFuZCBzaW5rIGFuZCB1c2UgdGhlIGRldmljZSBjb25maWd1cmF0aW9uCisJICBpbnN0ZWFkLgorCisyMDExLTA3LTEyIDE5OjEzOjQ1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBmaXggcmV0dXJuIHZhbHVlLi4uCisKKzIwMTEtMDctMTIgMTk6MDM6MzIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmg6CisJICB2NGwyOiBzaW1wbGlmeSBzZXR0aW5nIHRoZSBjYXB0dXJlIGZvcm1hdAorCSAgUGFzcyB0aGUgY2FwcyB0byB0aGUgc2V0X2Zvcm1hdCBmdW5jdGlvbiBhbmQgbWFrZSBfc2V0X2Zvcm1hdCBwYXJzZSB0aGUgY2Fwcy4KKwkgIEFsc28ga2VlcCB0aGUgcGFyc2VkIHZhbHVlcyBpbiB0aGUgdjRsMm9iamVjdCBzbyB0aGF0IHdlIGNhbiByZWZlciB0byB0aGVtIHdoZW4KKwkgIHdlIHdhbnQuCisKKzIwMTEtMDctMTIgMTg6NDE6NDcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuaDoKKwkgIHY0bDI6IHJlbW92ZSBtb3JlIHVudXNlZCBwYXJhbWV0ZXJzCisKKzIwMTEtMDctMTIgMTg6Mjk6MzUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDogaGFuZGxlIG9iamVjdCBvdXQgb2YgdGhlIG5vcm1hbCBmbG93CisKKzIwMTEtMDctMTIgMTg6MTM6NDIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDI6IExldCB0aGUgYnVmZmVycG9vbCBvd24gdGhlIFY0bDJPYmplY3QKKwkgIEtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIGZvcm1hdCBhbmQgc2V0dGluZyBpbiB0aGUKKwkgIHY0bDJvYmplY3QuCisJICBQYXNzIHRoZSB2NGwyb2JqZWN0IHRvIHRoZSBidWZmZXJwb29sIGNvbnN0cnVjdG9yIHNvIHRoYXQgdGhlIGJ1ZmZlcnBvb2wgY2FuCisJICBrbm93IGV2ZXJ5dGhpbmcgYWJvdXQgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIHNldHRpbmdzLiBUaGlzIGFsc28gYWxsb3dzIHVzCisJICB0byByZW1vdmUgc29tZSBhd2t3YXJkIGNvZGUuCisKKzIwMTEtMDctMTIgMTc6MDY6NDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDogcmVtb3ZlIGNhcHMgYXJndW1lbnQsIGl0J3Mgbm90IG5lZWRlZAorCSAgUmVtb3ZlIHRoZSBjYXBzIHBhcmFtZXRlciwgd2UgZG9uJ3QgbmVlZCBpdCBhbnltb3JlIGJlY2F1c2Ugd2UgZG9uJ3Qgc2V0CisJICBjYXBzIG9uIGJ1ZmZlcnMgYW55bW9yZS4KKworMjAxMS0wNy0xMiAxNjo0NjoyMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDogcGFzcyB0aGUgYnl0ZXNwZXJsaW5lIGFyb3VuZAorCSAgV2hlbiBzZXR0aW5nIGEgZm9ybWF0LCByZXR1cm4gdGhlIGJ5dGVzcGVybGluZSB0byB0aGUgY2FsbGVyIHNvIHRoYXQgaXQgY2FuIGJlCisJICB1c2VkIHRvIGFsbG9jYXRlIGJ1ZmZlcnMuCisKKzIwMTEtMDctMTIgMTY6NDM6MDQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICBwb29sOiBtYWtlIGJ1ZmZlciB3cml0YWJsZQorCSAgV2UgbmVlZCB3cml0YWJsZSBidWZmZXJzIHdoZW4gd2UgbmVlZCB0byBkbyBhIHNsb3cgbWVtY3B5LgorCisyMDExLTA3LTEyIDE1OjA0OjM4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IHNlZWtpbmcgcmVncmVzc2lvbgorCSAgLi4uIGludHJvZHVjZWQgd2hlbiBzaHVmZmxpbmcgYXJvdW5kIGNvZGUgZm9yIHRoZSBhc3luYyBpbXBsZW1lbnRhdGlvbgorCSAgYnkgc2V0dGluZyBzdGF0ZSBvZiBzb3VyY2UgKGFuZCB1ZHAgc291cmNlcykgaW4gX3BsYXkgYmVmb3JlIGRvd25zdHJlYW0KKwkgIGZsdXNoaW5nIGlzIHVuZG9uZS4KKworMjAxMS0wNy0xMSAxNToyMzo0MSArMDMwMCAgUmVuw6kgU3RhZGxlciA8cmVuZS5zdGFkbGVyQG5va2lhLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5oOgorCSAgYWMzcGFyc2U6IGZpeCBidWZmZXIgZHVyYXRpb24gb24gYmxvY2tzLXBlci1mcmFtZSBjaGFuZ2UKKwkgIFRoZSBnc3RfYmFzZV9wYXJzZV9zZXRfZnJhbWVfcmF0ZSBjYWxsIHdhcyBwcmVkaWNhdGVkIG9uIGEgY2hhbmdlIHRvCisJICBzYW1wbGUgcmF0ZSwgZHVyYXRpb24gb3IgcHJvZmlsZS4gSG93ZXZlciwgdGhlIGJsb2NrIGNvdW50IHBlciBmcmFtZSBjYW4KKwkgIGFsc28gY2hhbmdlIGJldHdlZW4gcGFja2V0cywgd2hpY2ggd291bGQgcmVzdWx0IGluIGluY29ycmVjdCBidWZmZXIKKwkgIGR1cmF0aW9ucy4KKworMjAxMS0wNy0xMSAxMzo1MTo1MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiBoYW5kbGUgcG9vbHMKKwkgIENyZWF0ZSBhIG5ldyBwb29sIGluIHNldGNhcHMgYW5kIHN0b3AvZGVzdHJveSB0aGUgb2xkIG9uZS4KKwkgIFJlbW92ZSBidWZmZXJfYWxsb2MgZnVuY3Rpb25zLgorCSAgQ2hlY2sgdGhhdCB3ZSBoYXZlIHY0bDIgbWV0YWRhdGEgaW4gc2hvd19mcmFtZSBhbmQgZmFsbCBiYWNrIHRvIG1lbWNweSBpbnRvIGEKKwkgIGJ1ZmZlciBmcm9tIG91ciBwb29sIGlmIHdlIGRvbid0IHJlY2VpdmUgb25lIG9mIG91ciBvd24gYnVmZmVycy4KKworMjAxMS0wNy0xMSAxMjowNDo1NyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSAgdjRsMjogdmFyaW91cyBjbGVhbnVwcworCSAgVmFyaW91cyBjbGVhbnVwcywgYXZvaWRzIHVzZWxlc3MgY2FzdHMsIG1vdmUgZXJyb3IgaGFuZGxpbmcgb3V0c2lkZSBvZiB0aGUgbWFpbgorCSAgY29kZSBmbG93LgorCSAgTmVnb3RpYXRlIHRvIGEgcmVzb25hYmxlIHJlc29sdXRpb24gaW5zdGVhZCBvZiB0aGUgbWF4IHJlc29sdXRpb24uCisKKzIwMTEtMDctMTAgMjE6NTA6MTkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFjZWxwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWRtZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc2lyZW5kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5Lmg6CisJICBydHA6IHBvcnQgcmVtYWluaW5nIHRvIDAuMTEKKworMjAxMS0wNy0xMCAxNDo1NjowMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkqIHN5cy94aW1hZ2UveGltYWdldXRpbC5jOgorCSAgeGltYWdlOiBwb3J0IHRvIDAuMTEKKworMjAxMS0wNy0xMCAxMzo0NDo0OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmg6CisJICB5NG06IHBvcnQgc29tZSBtb3JlCisJICBVc2UgdmlkZW8gaGVscGVycy4KKworMjAxMS0wNy0xMCAxMzoyODoyNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIHk0bTogcG9ydCB0byAwLjExCisKKzIwMTEtMDctMTAgMTI6NDY6MDMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5oOgorCSAgbXVsdGlwYXJ0OiBwb3J0IHRvIDAuMTEKKworMjAxMS0wNy0xMCAxMTo0MjozNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDExLTA3LTEwIDExOjQwOjQwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9NYWtlZmlsZS5hbToKKwkqIGdzdC9kZWJ1Z3V0aWxzL2JyZWFrbXlkYXRhLmM6CisJKiBnc3QvZGVidWd1dGlscy9lZmVuY2UuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNzZXR0ZXIuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGRlYnVnLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2aWdhdGlvbnRlc3QuaDoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHB1c2hmaWxlc3JjLmM6CisJKiBnc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jOgorCSogZ3N0L2RlYnVndXRpbHMvdGVzdHMuYzoKKwkgIGRlYnVnOiBwb3J0IHRvIDAuMTEsIGRpc2FibGUgb3RoZXJzCisJICBEaWFzYWJsZSB0aGUgZWZlbmNlIGFuZCBjYXBzZGVidWcgZWxlbWVudHMsIHBvcnQgdGhlbSBsYXRlci4KKworMjAxMS0wNy0wOSAxOToyMzo0MSAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5oOgorCSAgbXVsdGlmaWxlc3JjOiBJbXByb3ZlIGxvb3BpbmcKKwkgIEFkZCBzdGFydC1pbmRleCBhbmQgc3RvcC1pbmRleCBwcm9wZXJ0aWVzLgorCisyMDExLTA2LTE2IDEzOjU3OjAzICswMTAwICBKb25ueSBMYW1iIDxqb25ueWxhbWJAam9ubnlsYW1iLmNvbT4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmg6CisJICBtdWx0aWZpbGU6IGFkZCBsb29wIHByb3BlcnR5IHRvIG11bHRpZmlsZXNyYworCSAgRml4ZXM6ICM2NTI3MjcKKwkgIFNpZ25lZC1vZmYtYnk6IEpvbm55IExhbWIgPGpvbm55bGFtYkBqb25ueWxhbWIuY29tPgorCSAgU2lnbmVkLW9mZi1ieTogRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKzIwMDktMTEtMjAgMTA6MDc6NDMgKzAxMDAgIFBoaWxpcCBKw6RnZW5zdGVkdCA8cGhpbGlwakBvcGVyYS5jb20+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmVjdHNvdW5kc2luazogMTYtYml0IGF1ZGlvIGlzIHNpZ25lZCwgOC1iaXQgaXMgdW5zaWduZWQuCisJICBQcmV0ZW5kaW5nIHRvIGhhbmRsZSA4LWJpdCBzaWduZWQgY2F1c2VzIGRpc3RvcnRlZCBhdWRpbyB3aGVuCisJICBhY3R1YWxseSBnaXZlbiBzdWNoIGF1ZGlvLCB3aGljaCB5b3Ugd2lsbCBnZXQgaWYgcGFzc2luZyA4LWJpdAorCSAgdW5zaWduZWQgdGhyb3VnaCBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlLCBhcyBhdWRpb3Jlc2FtcGxlCisJICBvbmx5IGhhbmRsZXMgOC1iaXQgc2lnbmVkLiAgRml4ZXMgIzYwNTgzNC4KKwkgIFNpZ25lZC1vZmYtYnk6IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisyMDExLTA3LTA4IDE2OjM3OjExICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMjogZml4IGdyYXkgZm9ybWF0LCB1c2UgZmlsdGVyIGluIGdldGNhcHMKKworMjAxMS0wNy0wOCAxNjoxMDo0NyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDI6IHBvcnQgYW5kIGVuYWJsZSB2NGwyc2luaworCisyMDExLTA3LTA4IDE0OjM0OjQwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBwb3J0IHRvIG5ldyB2aWRlbyBmb3JtYXRzCisKKzIwMTEtMDctMDggMTI6NTE6MTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0wNy0wOCAxMjo0OToxMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwycmFkaW8uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDI6IHBvcnQgdG8gMC4xMQorCisyMDExLTA3LTA3IDE4OjI3OjM2ICswMjAwICBBbGV4ZXkgRmlzaGVyIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogaGFuZGxlIGJsb2NrcyB3aXRoIGR1cmF0aW9uPTAKKwkgIFNvbWUgdmlkZW8gZnJhbWVzLCBmb3IgZXhhbXBsZSBhbHQtcmVmIGZyYW1lIGluIFZQOCwgd2lsbCBiZQorCSAgbmV2ZXIgZGlzcGxheWVkLiBUaGlzIGlzIHdoeSBpdCBoYXMgZHVyYXRpb249MC4KKwkgIFRoaXMgcGF0Y2ggYWxsb3cgdG8gdXNlIHRoaXMgZHVyYXRpb24uCisJICBCdWc6IDY1NDE3NQorCSAgU2lnbmVkLW9mZi1ieTogQWxleGV5IEZpc2hlciA8YnVnLXRyYWNrQGZpc2hlci1wcml2YXQubmV0PgorCisyMDExLTA3LTA2IDE3OjE4OjA1IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eG1hcC5jOgorCSAgcXRtdXg6IEFkZCBkaXJlY3QgZGlyYWMgbWFwcGluZworCisyMDExLTA3LTA3IDE3OjU5OjA0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RyaXBwbGUuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJpcHBsZS5oOgorCSAgZWZmZWN0djogcG9ydCBsYXN0IGVmZmVjdHYgZWxlbWVudCB0byAwLjExCisKKzIwMTEtMDctMDcgMTc6NDk6MzQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHN0cmVhay5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c3RyZWFrLmg6CisJICBlZmZlY3R2OiBwb3J0IHN0cmVha3R2IHRvIDAuMTEKKworMjAxMS0wNy0wNyAxNzo0MDoyMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5oOgorCSAgZWZmZWN0djogcG9ydCByYWRpb2FjdHYgdG8gMC4xMQorCisyMDExLTA3LTA3IDE3OjI5OjU4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzdHJlYWsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkgIGVmZmVjdHY6IGZpeCBkb2NzCisKKzIwMTEtMDctMDcgMTc6Mjk6NDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdG9wLmM6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5oOgorCSAgZWZmZWN0djogcG9ydCBvcCB0byAwLjExCisKKzIwMTEtMDctMDcgMTc6MTg6MjEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6CisJICBlZmZlY3R2OiBwb3J0IHF1YXJrIHR2CisKKzIwMTEtMDctMDcgMTY6NTc6MzkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmV2Lmg6CisJICBlZmZlY3R2OiBwb3J0IHJldnR2IHRvIDAuMTEKKworMjAxMS0wNy0wNyAxNjo0Njo1MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5oOgorCSAgZWZmZWN0djogcG9ydCB2ZXJ0aWdvdHYgdG8gMC4xMQorCisyMDExLTA3LTA3IDE2OjM4OjEwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5oOgorCSAgZWZmZWN0djogcG9ydCBzaGFnYWRlbGljdHYgdG8gMC4xMQorCisyMDExLTA3LTA3IDExOjIyOjI2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSAgYXVwYXJzZTogdXNlIEFMV0FZUyBzcmMgcGFkIHJhdGhlciB0aGFuIFNPTUVUSU1FUworCisyMDExLTA3LTA3IDExOjE0OjE2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSAgYXVwYXJzZTogcG9ydCB0byAwLjExCisKKzIwMTEtMDctMDYgMTk6MDM6NTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBzaGFwZXdpcGU6IGJlZ2lubmluZ3Mgb2YgcG9ydGluZworCisyMDExLTA3LTA2IDE4OjUwOjI2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6CisJKiBnc3QvZWZmZWN0di9nc3R3YXJwLmg6CisJICB3YXJwdHY6IHBvcnQgdG8gMC4xMQorCisyMDExLTA3LTA2IDE4OjUwOjE1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJICBkaWNlOiBrZWVwIHRyYWNrIG9mIGluZm8KKworMjAxMS0wNy0wNiAxODozMjo0NSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5oOgorCSAgZWZmZWN0djogcG9ydCBkaWNlCisKKzIwMTEtMDctMDYgMTg6MDk6NDkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5oOgorCSAgZWZmZWN0djogcG9ydCBhZ2luZ3R2CisKKzIwMTEtMDctMDYgMTc6NTA6NTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hYWxpYi9NYWtlZmlsZS5hbToKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuaDoKKwkgIGFhc2luazogcG9ydCB0byBuZXcgdmlkZW8gQVBJCisKKzIwMTEtMDctMDYgMTc6NDA6MjAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9saWJjYWNhL01ha2VmaWxlLmFtOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzoKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmg6CisJICBjYWNhc2luazogcG9ydCB0byAwLjExCisKKzIwMTEtMDctMDYgMTY6NTA6MzIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWc6IGJlZ2lubmluZ3Mgb2YgcG9ydGluZyB0byAwLjExCisKKzIwMTEtMDctMDYgMTY6MzE6MTggKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiB1c2UgQUxXQVlTIHNvdXJjZSBwYWQgcmF0aGVyIHRoYW4gU09NRVRJTUVTCisKKzIwMTEtMDctMDYgMTY6MTA6MzQgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oOgorCSAgd2F2cGFyc2U6IHBvcnQgdG8gMC4xMQorCisyMDExLTA3LTA2IDE2OjEwOjIzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkgIHdhdmVuYzogcG9ydCB0byAwLjExCisKKzIwMTEtMDctMDYgMTI6MjI6NDMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFkanVzdCB0byB1bnNpZ25lZCBzZWdtZW50IGZpZWxkcworCisyMDExLTA3LTA2IDE1OjU3OjIzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgc3BlZXg6IHBvcnQgc3BlZXggZWxlbWVudHMKKworMjAxMS0wNy0wNiAxMjowNToxMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDExLTA3LTA2IDEwOjExOjUyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwbWFuYWdlcjogcG9ydCB0byAwLjExCisJICAqIHVzZSBHX0RFRklORV9UWVBFCisJICAqIGFkanVzdCB0byBuZXcgR3N0QnVmZmVyIGFuZCBjb3JyZXNwb25kaW5nIHJ0cCBhbmQgcnRjcCBidWZmZXIgaW50ZXJmYWNlcworCSAgKiBtaXNjIGNhcHMgYW5kIHNlZ21lbnQgaGFuZGxpbmcgY2hhbmdlcworCSAgRklYTUU6IGFsc28gcmVsaWVzIG9uIGJlaW5nIGFibGUgdG8gcGFzcyBjYXBzIGFsb25nIHdpdGggYSBidWZmZXIsCisJICB3aGljaCBoYXMgbm8gZXZpZGVudCBlcXVpdmFsZW50IHlldCwgc28gdGhhdCBlaXRoZXIgbmVlZHMgb25lLAorCSAgb3Igc3RpbGwgbmVlZHMgcXVpdGUgc29tZSBjb2RlIHBhdGggbW9kaWZpY2F0aW9uIHRvIGRyYWcgYWxvbmcgY2Fwcy4KKworMjAxMS0wNi0yOSAyMDo1OToyNiArMDMwMCAgUmVuw6kgU3RhZGxlciA8cmVuZS5zdGFkbGVyQG5va2lhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSAgcHVsc2VzaW5rOiBwcmV2ZW50IHJhY2UgY29uZGl0aW9uIGNhdXNpbmcgcmVmIGxlYWsKKwkgIFNpbmNlIGNvbW1pdCA4YmZkODAsIGdzdF9wdWxzZXJpbmdidWZmZXJfc3RvcCBkb2Vzbid0IHdhaXQgZm9yIHRoZQorCSAgZGVmZXJyZWQgY2FsbCB0byBiZSBydW4gYmVmb3JlIHJldHVybmluZy4gVGhpcyBjYXVzZXMgYSByYWNlIHdoZW4KKwkgIFJFQURZLT5OVUxMIGlzIGV4ZWN1dGVkIHNob3J0bHkgYWZ0ZXIsIHdoaWNoIHN0b3BzIHRoZSBtYWlubG9vcC4gVGhpcworCSAgbGVha3MgdGhlIGVsZW1lbnQgcmVmZXJlbmNlIHdoaWNoIGlzIHBhc3NlZCBhcyB1c2VyZGF0YSBmb3IgdGhlIGNhbGxiYWNrCisJICAoaW50cm9kdWNlZCBpbiBjb21taXQgN2NmOTk2LCBidWcgIzYxNDc2NSkuCisJICBUaGUgY29ycmVjdCBmaXggaXMgdG8gd2FpdCBpbiBSRUFEWS0+TlVMTCBmb3IgYWxsIG91dHN0YW5kaW5nIGNhbGxzIHRvCisJICBiZSBmaXJlZCAoc2luY2UgbGlicHVsc2UgZG9lc24ndCBwcm92aWRlIGEgRGVzdHJveU5vdGlmeSBmb3IgdGhlCisJICB1c2VyZGF0YSkuIFdlIGdldCByaWQgb2YgdGhlIHJlZmVyZW5jZSBwYXNzaW5nIGZyb20gN2NmOTk2IGFsdG9nZXRoZXIsCisJICBzaW5jZSBmaW5hbGl6YXRpb24gZnJvbSB0aGUgY2FsbGJhY2sgd291bGQgYW55d2F5cyBsZWFkIHRvIGEgZGVhZGxvY2suCisJICBSZS1maXhlcyBidWcgIzYxNDc2NS4KKworMjAxMS0wNy0wNCAwODo1ODoxNCArMDMwMCAgUmVuw6kgU3RhZGxlciA8cmVuZS5zdGFkbGVyQG5va2lhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBzbWFsbCBjbGVhbnVwIG9mIGNvcHktcGFzdGUgY29kZQorCisyMDExLTA2LTI5IDE5OjUwOjQyICswMzAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAbm9raWEuY29tPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJICBwdWxzZXNpbms6IHJlbW92ZSB1bnVzZWQgbWVtYmVyIHZhcmlhYmxlIGFuZCBtaXNsZWFkaW5nIGxvZyBtZXNzYWdlCisJICBXaW0gY2hhbmdlZCBpdCBpbiBjb21taXQgOGJmZDgwIHNvIHRoYXQgcGFfZGVmZXJfcmFuIGlzIG5vdCByZWFkCisJICBhbnl3aGVyZS4KKwkgIFRoZSBsb2cgbWVzc2FnZSB1c2VkIHRvIGFubm90YXRlIGEgbWFpbmxvb3Bfd2FpdCBjYWxsIHdoaWNoIGlzIGdvbmUuCisKKzIwMTEtMDctMDUgMTU6Mzc6NTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIHZpZGVvZmxpcDogZml4IGNhcHMKKworMjAxMS0wNy0wNSAxMTo0MDo1NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5oOgorCSAgZWZmZWN0djogcG9ydCBlZGdldHYKKworMjAxMS0wNy0wNSAxMDoxMjoyNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEFkZCAtREdTVF9VU0VfVU5TVEFCTEVfQVBJIHRvIHRoZSBjb21waWxlciBmbGFncyB0byBhdm9pZCB3YXJuaW5ncworCisyMDExLTA3LTA0IDEyOjU4OjM4IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSAgZ29vbTogRG9uJ3QgYW5zd2VyIGxhbnRlbmN5IHF1ZXJpZXMgYmVmb3JlIG5lZ290aWF0aW9uCisKKzIwMTEtMDctMDQgMTg6MTU6NDIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcDogcG9ydCB0byBuZXcgQVBJCisKKzIwMTEtMDctMDQgMTg6MTI6NTYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZW1peGVyLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlOiByZW1vdmUgaW1wbGVtZW50c2ludGVyZmFjZQorCisyMDExLTA3LTA0IDE4OjEwOjU1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgIGFscGhhOiBmaXggY2FwcworCisyMDExLTA3LTA0IDE4OjA2OjQ4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5oOgorCSAgYWxwaGE6IHBvcnQgdG8gbmV3IHZpZGVvIEFQSQorCisyMDExLTA3LTA0IDE3OjAwOjM0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgIGFscGhhOiBtb3JlIHBvcnRpbmcKKworMjAxMS0wNy0wNCAxNjowOTozMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuaDoKKwkgIHBvcnQgdG8gbmV3IHZpZGVvIGFwaQorCisyMDExLTA2LTI4IDE0OjAzOjQzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5oOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5oOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5oOgorCSAgdmlkZW86IHBvcnQgdG8gbmV3IHZpZGVvIGFwaXMKKworMjAxMS0wNy0wNCAxNDozMDowOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGF2b2lkIGNyYXNoaW5nIG9uIGludmFsaWQgaW5wdXQgd2l0aG91dCBjb21wb25lbnRzCisKKzIwMTEtMDctMDQgMTE6MDk6MTkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4Lmg6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2OiBwb3J0IHRvIDAuMTEKKwkgICogdXNlIEdfREVGSU5FX1RZUEUKKwkgICogYWRqdXN0IHRvIG5ldyBHc3RCdWZmZXIKKwkgICogbWlzYyBzZWdtZW50IGFuZCBjYXBzIGNoYW5nZXMKKworMjAxMS0wNy0wNCAxMTo0ODoxMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGV4dC9wdWxzZS9wdWxzZXNpbmsuYworCisyMDExLTA3LTA0IDExOjI1OjI4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogcGFzcyBhbG9uZyBzZWdtZW50IGluZm8gdG8gY29sbGVjdHBhZHMKKwkgIC4uLiBzbyBpdCBjYW4gdHJhY2sgdGhpcyBhbmQgYmUgc3Vic2VxdWVudGx5IHVzZWQgdG8gZGV0ZXJtaW5lIHJ1bm5pbmcgdGltZSBldGMuCisKKzIwMTEtMDctMDQgMTE6MjQ6MjMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogaW5kaWNhdGUgcmF3IGZvcm1hdCBpbiBhYWMgY2FwcworCisyMDExLTA3LTA0IDExOjA3OjEzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IG1pbmQgcmVxdWVzdGVkIG5hbWUgZm9yIHJlcXVlc3QgcGFkCisKKzIwMTEtMDctMDQgMTE6MDY6NTQgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZnJlZSBzY2hlZHVsaW5nIHF1ZXJ5CisKKzIwMTEtMDctMDMgMTk6NTE6MzIgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvcHVsc2UvcGx1Z2luLmM6CisJICBwdWxzZTogSW5jcmVhc2UgcmFua3MgdG8gUFJJTUFSWSArIDEwCisJICBTbyB0aGF0IHB1bHNlc3JjL3B1bHNlc2luayBnZXQgY2hvc2VuIG92ZXIgb3RoZXIgcG9zc2libGUgUFJJTUFSWQorCSAgc3JjL3NpbmtzIGJ5IGF1dG9hdWRpb3NpbmsuICBQcmVzdW1hYmx5LCBpZiBwdWxzZSBpcyBhdmFpbGFibGUsIGl0CisJICBpcyBhbHdheXMgcHJlZmVycmVkIG92ZXIgYW5vdGhlciBzcmMvc2luay4KKwkgIEZpeGVzOiAjNjQ3NTQwLgorCisyMDExLTA2LTMwIDE4OjQ3OjQ4IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzoKKwkgIG11bHRpcGFydG11eDogQWRkIFxyXG4gdG8gdGFpbCBvZiBwdXNoZWQgYnVmZmVycworCSAgQ2xpZW50cyBzdWNoIGFzIEZpcmVmb3ggcmVxdWlyZSB0aGUgXHJcbiBhZnRlciB0aGUgcGF5bG9hZC4KKworMjAxMS0wNi0xNiAxNDo1Mjo1MSArMDIwMCAgQnJhbmtvIFN1YmFzaWMgPGJyYW5rb0BheGlzLmNvbT4KKworCSogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBhdm9pZCBsb29waW5nIHdoZW4gc2VhcmNoaW5nIGZvciBjbHVzdGVycworCSAgRml4ZXMgc29tZSBidWdzIHRoYXQgcmVzdWx0cyBpbiB0aGUgZGVtdXhlciBsb29waW5nIHdoZW4gc2VhY2hpbmcKKwkgIGZvciBjbHVzdGVycyBpbiBub24tZmluYWxpemVkIGZpbGVzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MjE5NQorCisyMDExLTA2LTMwIDEyOjMwOjIyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSAgbXVsdGlmaWxlOiBwb3J0IHRvIDAuMTAKKwkgICogdXNlIEdfREVGSU5FX1RZUEUKKwkgICogYWRqdXN0IHRvIG5ldyBHc3RCdWZmZXIKKwkgICogbWlzYyBjYXBzIGhhbmRsaW5nCisKKzIwMTEtMDYtMzAgMTE6MzU6MjEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSAgY3V0dGVyOiBwb3J0IHRvIDAuMTEKKwkgICogdXNlIEdfREVGSU5FX1RZUEUKKwkgICogYWRqdXN0IHRvIG5ldyBHc3RCdWZmZXIKKwkgICogbWlub3IgbWlzYworCisyMDExLTA2LTMwIDExOjE3OjE5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmdhbmFseXNpcy5jOgorCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmdsaW1pdGVyLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ3ZvbHVtZS5jOgorCSAgcmVwbGF5Z2FpbjogcG9ydCB0byAwLjExCisJICAqIHVzZSBHX0RFRklORV9UWVBFCisJICAqIGFkanVzdCB0byBuZXcgR3N0QnVmZmVyCisKKzIwMTEtMDYtMzAgMTA6NTM6MDkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIHNwZWN0cnVtOiByZW1vdmUgZGVwcmVjYXRlZCBwcm9wZXJ0eQorCisyMDExLTA2LTMwIDEwOjUxOjU1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBzcGVjdHJ1bTogcG9ydCB0byAwLjExCisJICAqIHVzZSBHX0RFRklORV9UWVBFCisJICAqIGFkanVzdCB0byBuZXcgR3N0QnVmZmVyCisKKzIwMTEtMDYtMzAgMTA6Mzg6NDkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGxldmVsOiBwb3J0IHRvIDAuMTEKKwkgICogdXNlIEdfREVGSU5FX1RZUEUKKwkgICogYWRqdXN0IHRvIG5ldyBHc3RCdWZmZXIKKworMjAxMS0wNi0zMCAxMDozMDoxNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jOgorCSAgZXF1YWxpemVyOiBwb3J0IHRvIDAuMTEKKworMjAxMS0wNi0xMCAxODo1NDo0OCArMDUzMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thcGFyc2U6IGZpeCByZWZlcmVuY2UgY291bnRpbmcgb2YgcGFyc2UtPnN0cmVhbWhlYWRlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MjI4NgorCSAgU2lnbmVkLW9mZi1ieTogRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKzIwMTEtMDYtMjkgMTQ6Mzk6NTIgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJICBqcGVnZW5jOiBEb24ndCByb3VuZCB1cCBzaXplIG9mIGVuY29kZWQgYnVmZmVycworCSAgRm9yIHNvbWUgcmVhc29uLCBpbiBjb2RlIGRhdGluZyB0byAyMDAxLCBlbmNvZGVkIGpwZWcgYnVmZmVycyB3ZXJlCisJICByb3VuZGVkIHVwIHRvIG11bHRpcGxlcyBvZiA0IGJ5dGVzLiAgV2l0aCB0aGUgYWRkZWQgYm9udXMgdGhhdCB0aGUKKwkgIGV4dHJhIGJ5dGVzIGFyZSB1bndyaXR0ZW4sIGNhdXNpbmcgdmFsZ3JpbmQgaXNzdWVzLiAgT29wcy4gIEkgY2FuJ3QKKwkgIHRoaW5rIG9mIGFueSByZWFzb24gd2h5IEpQRUcgYnVmZmVycyBuZWVkIHRvIGJlIG11bHRpcGxlcyBvZiA0IGJ5dGVzLAorCSAgc28gSSByZW1vdmVkIHRoZSBwYWRkaW5nLiAgVGhlcmUgbWlnaHQgYmUgc29tZSBjb2RlIHNvbWV3aGVyZSB0aGF0CisJICBkZXBlbmRzIG9uIHRoaXMgYmVoYXZpb3IsIHNvIGlmIHRoaXMgbmVlZHMgdG8gYmUgcmV2ZXJ0ZWQsIHBsZWFzZSBmaXgKKwkgIHRoZSB2YWxncmluZCBpc3N1ZXMuCisKKzIwMTEtMDYtMjkgMTI6NDY6MjAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaXNvbXA0L01ha2VmaWxlLmFtOgorCSogZ3N0L2lzb21wNC9hdG9tcy5jOgorCSogZ3N0L2lzb21wNC9hdG9tc3JlY292ZXJ5LmM6CisJKiBnc3QvaXNvbXA0L2dzdHF0bW9vdnJlY292ZXIuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXhtYXAuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cnRweHF0ZGVwYXkuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4Lmg6CisJICBpc29tcDQ6IHBvcnQgdG8gMC4xMQorCisyMDExLTA2LTI4IDEyOjU1OjQ1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHR3ZWFrIHNvbWUgcG9ydGVkIHNlZ21lbnQgaGFuZGxpbmcKKwkgIC4uLiB0byBhdm9pZCBsb3NpbmcgZHVyYXRpb24gZHVyaW5nIHB1c2ggbW9kZSBzZWVraW5nLCBhbmQgdG8gcHJvcGVybHkKKwkgIGFjY3VtdWxhdGUgcnVubmluZyB0aW1lIHdoZW4gc2VnbWVudCBzZWVraW5nLgorCisyMDExLTA2LTI5IDEyOjA1OjA0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGZyZWUgZGF0ZSB0YWcKKworMjAxMS0wNi0yOCAxMjoyNjozNyArMDIwMCAgSm9uYXMgTGFyc3NvbiA8am9uYXMubGFyc3NvbkBoaXEuc2U+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBub3Qgc28gZ3JlZWR5IG1pbmltdW0gZnJhbWUgc2l6ZQorCSAgRml4ZXMgIzY1MzU1OS4KKworMjAxMS0wNi0yNSAxMTozOToyMyAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogcmVtb3ZlIG5vbi1wa2ctY29uZmlnIGNoZWNrIGZvciBzaG91dAorCSAgRml4ZXM6IDY1MzMyNworCisyMDExLTA2LTIwIDE4OjQ5OjU3ICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdW1vdGlvbi5jb20+CisKKwkqIGV4dC9yYXcxMzk0L2dzdDEzOTRjbG9jay5jOgorCSAgZHYxMzk0c3JjOiBtYWtlIHRoZSBpbnRlcm5hbCBjbG9jayB0aHJlYWQgc2FmZQorCSAgRml4ZXM6ICM2NTMwOTEuCisKKzIwMTEtMDYtMjQgMTE6NTQ6MjkgKzAyMDAgIE1pZ3VlbCBBbmdlbCBDYWJyZXJhIE1veWEgPG1hZG1hYzI1MDFAZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogcmV0dXJuIGNvcnJlY3QgdHlwZSB3aGVuIGFzc2VydGlvbiBmYWlscworCisyMDExLTA2LTIzIDExOjI4OjI3IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDY5Yjk4MWYgdG8gNjA1Y2Q5YQorCisyMDExLTA2LTIyIDE2OjQxOjEzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwOiBmaXggZm9yIHVyaSBjaGFuZ2VzCisKKzIwMTEtMDItMDIgMTY6MTg6NTQgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuaDoKKwkgIHB1bHNlOiBEcm9wIHN1cHBvcnQgZm9yIFBBIHZlcnNpb25zIGJlZm9yZSAwLjkuMTYKKwkgIFRoaXMgZHJvcHMgc3VwcG9ydCBmb2YgUHVsc2VBdWRpbyB2ZXJzaW9ucyBwcmlvciB0byAwLjkuMTYsIHdoaWNoIHdhcworCSAgcmVsZWFzZWQgYWJvdXQgMS41IHllYXJzIGFnby4gVGVzdGluZyB3aXRoIHZlcnkgb2xkIHZlcnNpb25zIGlzIG5vdAorCSAgZmVhc2libGUgYW5kIHdlIGRvbid0IHdhbnQgdG8gbWFpbnRhaW4gMiBpbmRlcGVuZGVudCBjb2RlLXBhdGhzLgorCisyMDExLTA2LTIxIDE4OjI0OjQxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBjb25maWd1cmUuYWMKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sCisKKzIwMTEtMDYtMjEgMTg6MTk6MDIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogZml4IGZvciBoZWFkZXIgY2xlYW51cHMKKworMjAxMS0wNi0yMSAxNToxNTowNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJICBydHBtcDRhZGVwYXk6IGZpeCBvdXRwdXQgYnVmZmVyIHRpbWVzdGFtcHMgaW4gY2FzZSBvZiBtdWx0aXBsZSBmcmFtZXMKKworMjAxMS0wNi0yMCAxNjo0NzozNiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogVGhlIHNpZ25hbCBoYXMgNSBhcmd1bWVudHMsIG5vdCA0CisKKzIwMTEtMDYtMjAgMTI6MTM6MTEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IHVzZSBzdHJpbmcgZm9yIHZpZGVvIGZvcm1hdCBub3cKKworMjAxMS0wNi0yMCAxMjowNDo0OCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9NYWtlZmlsZS5hbToKKwkgIGF2aTogbGluayBhZ2FpbnN0IGdzdHZpZGVvIG5vdworCisyMDExLTA2LTIwIDEyOjAzOjI0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpOiBwb3J0IHRvIG5ldyBjYXBzCisKKzIwMTEtMDYtMTggMTM6NDM6MDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJICBCdW1wIGdpdCB2ZXJzaW9uIGFmdGVyIHVucGxhbm5lZCAwLjEwLjMwIHJlbGVhc2UKKwkgIE1lcmdlIGJyYW5jaCAnMC4xMC4zMCcKKwkgIENvbmZsaWN0czoKKwkgIGNvbmZpZ3VyZS5hYworCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWwKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sCisJICBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbAorCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWwKKwkgIHdpbjMyL2NvbW1vbi9jb25maWcuaAorCisyMDExLTA2LTE3IDEwOjM3OjMzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5oOgorCSAgc3VuYXVkaW86IGZpeCB0eXBvIGluIGNvbW1lbnQKKworMjAxMS0wNi0xNyAxODoxMjo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDExLTA2LTE3IDE4OjExOjM4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkgIGF1dG9kZXRlY3Q6IGZpeCBjYXBzCisKKzIwMTEtMDYtMTYgMTU6Mzg6MTAgKzAyMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXMuZGViZXRoZW5jb3VydEBjb2xsYWJvcmEuY29tPgorCisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJICBnb29tOiBmaXggdW51c2VkLWJ1dC1zZXQtY29tcGlsZXIgd2FybmluZ3MKKwkgIFJlbW92ZSB1bm5lY2Vzc2FyeSByZXMgdmFyaWFibGVzLCBjb3JlIGNoZWNrcyBleGlzdGFuY2UKKwkgIGFuZCB0eXBlIG9mIHRoZXNlIGZpZWxkcyBmb3IgdXMgYWxyZWFkeSB2aWEgdGhlIHRlbXBsYXRlCisJICBjYXBzLCBhbmQgd2Uga25vdyB0aGF0IHRoZXNlIGZpZWxkcyBleGlzdCBiZWNhdXNlIHdlJ3ZlCisJICBmaXhhdGVkIHRoZW0gYmVmb3JlIGluIF9uZWdvdGlhdGUoKS4KKworMjAxMS0wNi0xNyAwMzowNzowOSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkgIGF1ZGlvZWNobzogZml4IHBhcmFtIGZsYWdzCisJICBJZiB0aGUgcGFyYW1ldGVyIGNhbm5vdCBiZSBjaGFuZ2VkIGluIHBhdXNlZCZwbGF5aW5nLCBpdCBpcyBub3QgY29udHJvbGFibGUuIFNldAorCSAgdGhlIGFwcHJvcHJpYXRlIG11dGFiaWxpdHkgZmxhZyBpbnN0ZWFkLgorCis9PT0gcmVsZWFzZSAwLjEwLjMwID09PQorCisyMDExLTA2LTE1IDIzOjU3OjM0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAwLjEwLjMwCisJICBUaGlzIGlzIGFuIGFkLWhvYyByZWxlYXNlIHRoYXQgaXMgYWxtb3N0IGlkZW50aWNhbCB0byAwLjEwLjI5OgorCSAgKiB3b3JrIGFyb3VuZCBHTGliIGF0b21pYyBvcHMgQVBJIGNoYW5nZQorCSAgKiBiZXR0ZXIgaGFuZGxpbmcgb2YgbWFsZm9ybWVkIGJ1ZmZlcnMgaW4gUlRQIGRlcGF5bG9kZXJzCisJICAqIHNvbWUgbWlub3IgY29tcGlsYXRpb24gZml4ZXMKKworMjAxMS0wNi0wOCAxODozMzoxMCArMDMwMCAgUmFpbW8gSsOkcnZpIDxyYWltby5qYXJ2aUBnbWFpbC5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaDoKKwkgIHVkcDogRml4IGNvbXBpbGVyIHdhcm5pbmcgb24gbWluZ3ctdzY0CisJICBGaXhlczogIzY1MjE0NC4KKwkgIGdzdHVkcG5ldHV0aWxzLmg6MzI6MDogZXJyb3I6ICJXSU5WRVIiIHJlZGVmaW5lZAorCSAgL3Vzci9pNjg2LXc2NC1taW5ndzMyL3N5cy1yb290L21pbmd3L2luY2x1ZGUvX21pbmd3Lmg6MjMxOjA6IG5vdGU6IHRoaXMgaXMgdGhlCisJICBsb2NhdGlvbiBvZiB0aGUgcHJldmlvdXMgZGVmaW5pdGlvbgorCisyMDExLTA2LTA0IDEzOjQ5OjUyIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSAgaW50ZXJsZWF2ZTogV29yayBhcm91bmQgY2hhbmdlcyBpbiBnX2F0b21pYyBBUEkKKwkgIFNlZSAjNjUxNTE0IGZvciBkZXRhaWxzLgorCisyMDExLTA1LTE4IDEyOjM2OjQwICswMjAwICBKb3NlIEFudG9uaW8gU2FudG9zIENhZGVuYXMgPHNhbnRvc2NhZGVuYXNAZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkgIHJ0cDogRml4IHNlZ21lbnRhdGlvbiBmYXVsdCBwcm9jZXNzaW5nIHBheWxvYWQgYnVmZmVycworCSAgVGhpcyBjb21taXQgY2hlY2tzIGlmIHRoZSB2YWx1ZSByZXR1cm5lZCBieQorCSAgZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfYnVmZmVyIGFuZAorCSAgZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfc3ViYnVmZmVyIGlzIE5VTEwgYmVmb3JlIHVzaW5nIGl0LgorCisyMDExLTA1LTE2IDA5OjA0OjMxICswMjAwICBQaW5vIFRvc2Nhbm8gPHRvc2Nhbm8ucGlub0B0aXNjYWxpLml0PgorCisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmM6CisJICBwdWxzZTogRGVmaW5lIFBBVEhfTUFYIGlmIGl0IGlzbid0IGRlZmluZWQKKwkgIEdOVSBIdXJkIGZvciBleGFtcGxlIGRvZXNuJ3QgZGVmaW5lIGl0LgorCisyMDExLTA0LTI5IDA4OjU1OjE5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkgIHdhdmVuYzogQWxsb3cgc2V0Y2FwcyB0byBiZSBjYWxsZWQgYWZ0ZXIgYSBmb3JtYXQgd2FzIG5lZ290aWF0ZWQgaWYgaXQncyBjb21wYXRpYmxlCisJICBPdGhlcndpc2Ugd2F2ZW5jIHdpbGwgZmFpbCBpZiB1cHN0cmVhbSBkZWNpZGVzIHRvIHNldCBlcXVpdmFsZW50IGNhcHMgb3IgY2FwcworCSAgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGxhdGVyLgorCSAgVGhhbmtzIHRvIEFsZXhhbmRlciBTY2hyZW1tZXIgZm9yIGZpbmRpbmcgdGhpcyBidWcuCisKKzIwMTEtMDYtMTUgMTU6MDY6MjMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBSRVFVSVJFTUVOVFM6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2VzZC9NYWtlZmlsZS5hbToKKwkqIGV4dC9lc2QvZXNkbW9uLmM6CisJKiBleHQvZXNkL2VzZG1vbi5oOgorCSogZXh0L2VzZC9lc2RzaW5rLmM6CisJKiBleHQvZXNkL2VzZHNpbmsuaDoKKwkqIGV4dC9lc2QvZ3N0ZXNkLmM6CisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJKiBtNC9NYWtlZmlsZS5hbToKKwkqIG00L2FzLWFydHMubTQ6CisJKiBtNC9lc2QubTQ6CisJKiBwby9QT1RGSUxFUy5pbjoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFJlbW92ZSBlc291bmQvZXNkc2luayBwbHVnaW4KKworMjAxMS0wNi0xNSAxNDozNzoyOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogUkVRVUlSRU1FTlRTOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkqIGV4dC9nY29uZi9NYWtlZmlsZS5hbToKKwkqIGV4dC9nY29uZi9nc3RnY29uZi5jOgorCSogZXh0L2djb25mL2dzdGdjb25mLmg6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NpbmsuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5oOgorCSogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc3JjLmg6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZlbGVtZW50cy5jOgorCSogZXh0L2djb25mL2dzdGdjb25mZWxlbWVudHMuaDoKKwkqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5jOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zaW5rLmg6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NyYy5jOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zcmMuaDoKKwkqIGV4dC9nY29uZi9nc3Rzd2l0Y2hzaW5rLmM6CisJKiBleHQvZ2NvbmYvZ3N0c3dpdGNoc2luay5oOgorCSogZXh0L2djb25mL2dzdHN3aXRjaHNyYy5jOgorCSogZXh0L2djb25mL2dzdHN3aXRjaHNyYy5oOgorCSogZ2NvbmYvLmdpdGlnbm9yZToKKwkqIGdjb25mL01ha2VmaWxlLmFtOgorCSogZ2NvbmYvZ3N0cmVhbWVyLnNjaGVtYXMuaW46CisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJKiBtNC9NYWtlZmlsZS5hbToKKwkqIG00L2djb25mLTIubTQ6CisJKiBwby9QT1RGSUxFUy5pbjoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgUmVtb3ZlIGdjb25mIGVsZW1lbnRzIGFuZCBwbHVnaW4KKwkgIEdDb25mIHdhcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBHU2V0dGluZ3MgZXRjLgorCisyMDExLTA2LTE1IDE1OjE3OjE5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBmaXggdW5pdGlhbGl6ZWQgYWNjZXNzCisKKzIwMTEtMDYtMDkgMjE6MDY6MjggKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJICBtYXRyb3NrYTogYWRkIG1pc3Npbmcgc3RkaW8gaW5jbHVkZSBmb3Igc3NjYW5mCisKKzIwMTEtMDYtMTMgMTk6MDg6MzggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0wNi0xMyAxNzo1MTo0MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIC1nb29kOiBwb3J0IHNvbWUgbW9yZSBwbHVnaW5zCisKKzIwMTEtMDYtMTMgMTc6MTQ6NTEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3A6IGZpeCBmb3IgZmx1c2hfc3RvcCBBUEkgY2hhbmdlCisKKzIwMTEtMDYtMTMgMTc6MTQ6MDAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJICBydHA6IHBvcnQgc29tZSBtb3JlIChkZSlwYXlsb2FkZXIKKworMjAxMS0wNi0xMyAxNzowNToxOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2Vyczogbm90IHNvIGdyZWVkeSBtaW5pbXVtIGZyYW1lIHNpemUKKwkgIC4uLiB3aGljaCB3aWxsIGJlIGRldGVybWluZWQgYnkgcGFyc2luZyBhbnl3YXksIGFuZCBhdm9pZHMgaW50cm9kdWNpbmcKKwkgIHJlZHVuZGFudCBhZGRpdGlvbmFsIGxhdGVuY3kuCisKKzIwMTEtMDYtMTMgMTY6MzM6NTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgLWdvb2Q6IHVwZGF0ZSBmb3IgYnVmZmVyIEFQSSBjaGFuZ2UKKworMjAxMS0wNi0xMyAxNjozMzo0NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBydHA6IHBvcnQgdG8gMC4xMQorCisyMDExLTA2LTEzIDEzOjI1OjQ5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcHZwYXkuYzoKKwkgIHJ0cDogZml4IGZvciBBUEkgY2hhbmdlcyBpbiB0aGUgYmFzZSBjbGFzc2VzCisKKzIwMTEtMDYtMTMgMTM6MDc6NTAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IHVzZSBjYXBzIGV2ZW50IGZvciBuZWdvdGlhdGlvbgorCisyMDExLTA2LTEzIDEzOjA3OjI3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZml4IGZvciBmbHVzaCBzdG9wIGV2ZW50IGNoYW5nZXMKKworMjAxMS0wNi0wOCAxODozMzoxMCArMDMwMCAgUmFpbW8gSsOkcnZpIDxyYWltby5qYXJ2aUBnbWFpbC5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaDoKKwkgIHVkcDogRml4IGNvbXBpbGVyIHdhcm5pbmcgb24gbWluZ3ctdzY0CisJICBGaXhlczogIzY1MjE0NC4KKwkgIGdzdHVkcG5ldHV0aWxzLmg6MzI6MDogZXJyb3I6ICJXSU5WRVIiIHJlZGVmaW5lZAorCSAgL3Vzci9pNjg2LXc2NC1taW5ndzMyL3N5cy1yb290L21pbmd3L2luY2x1ZGUvX21pbmd3Lmg6MjMxOjA6IG5vdGU6IHRoaXMgaXMgdGhlCisJICBsb2NhdGlvbiBvZiB0aGUgcHJldmlvdXMgZGVmaW5pdGlvbgorCisyMDExLTA2LTExIDE4OjU4OjA3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJICBnb29tOiBmaXggZm9yIGJ1ZmZlcnBvb2wgdXBkYXRlCisKKzIwMTEtMDYtMTAgMTg6MDU6MDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkgIGdvb206IHVwZGF0ZSBmb3IgYWxpZ25tZW50IGNoYW5nZQorCisyMDExLTA2LTA5IDE3OjU2OjE4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IHBvcnQgc29tZSBtb3JlCisKKzIwMTEtMDYtMDkgMTc6NTI6MzQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcDogcG9ydCB0byAwLjExCisKKzIwMTEtMDYtMDkgMTc6NTA6MDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHA6IHBvcnQgdG8gMC4xMQorCisyMDExLTA2LTA5IDExOjM3OjQ3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJICBhYXNpbms6IHJlZ2lzdGVyIHRlbXBsYXRlIGFuZCBrbGFzcyBjb3JyZWN0bHkKKworMjAxMS0wNi0wOSAxMDo1MDo0NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5oOgorCSAgZ29vbTogcG9ydCBnb29tCisKKzIwMTEtMDYtMDggMTg6MDY6NTYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0wNi0wOCAxODowNToyMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSAgYXNzaW5rOiBwb3J0IGFhc2luayB0byAwLjExCisKKzIwMTEtMDYtMDcgMTI6MDY6MDggKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9icmVha215ZGF0YS5jOgorCSogZ3N0L2RlYnVndXRpbHMvY3B1cmVwb3J0LmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzZGVidWcuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNzZXR0ZXIuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdG5hdnNlZWsuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHB1c2hmaWxlc3JjLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Byb2dyZXNzcmVwb3J0LmM6CisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJKiBnc3QvZGVidWd1dGlscy90ZXN0cGx1Z2luLmM6CisJICBkZWJ1Z3V0aWxzOiBTd2l0Y2ggZnJvbSBHU1RfQk9JTEVSUExBVEUgdG8gR19ERUZJTkVfVFlQRQorCisyMDExLTA2LTA3IDExOjI1OjE4ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSAgdmlkZW9maWx0ZXI6IFVzZSBuZXcgR3N0QmFzZVRyYW5zZm9ybTo6dHJhbnNmb3JtX2NhcHMgQVBJCisKKzIwMTEtMDYtMDcgMTE6MjM6NTUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6CisJICBhdXBhcnNlOiBEb24ndCB1c2UgR1NUX0JPSUxFUlBMQVRFCisKKzIwMTEtMDYtMDcgMTE6MjI6MzUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSAgYXVkaW9meGJhc2VmaXJmaWx0ZXI6IEJ1ZmZlcnMgbm8gbG9uZ2VyIGhhdmUgY2FwcworCisyMDExLTA2LTA3IDExOjIwOjAwICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSAgYWxwaGE6IFVzZSBuZXcgdHJhbnNmb3JtX2NhcHMgdm1ldGhvZCAod2l0aCBmaWx0ZXIpCisKKzIwMTEtMDYtMDYgMjA6NDM6MzEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgYXVkaW9wYXJzZXJzOiBmaXggc29tZSBtb3JlIHBhcnNlcnMKKworMjAxMS0wNi0wNiAxODoyMTowNCArMDUzMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBjb2RlIGNvbW1vbiB0byBtYXRyb3NrYWRlbXV4IGFuZCBtYXRyb3NrYXBhcnNlCisJICBNb3ZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdG8gbWF0cm9za2EtcmVhZC1jb21tb24uW2NoXSBmcm9tCisJICBtYXRyb3NrYS1kZW11eC5jIGFuZCBtYXRyb3NrYS1wYXJzZS5jOgorCSAgLSBnc3RfbWF0cm9za2Ffe2RlbXV4LHBhcnNlfV9wYXJzZV9jaGFwdGVycworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDg3NworCisyMDExLTA2LTA2IDE0OjQ3OjI3ICswNTMwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBjb2RlIGNvbW1vbiB0byBtYXRyb3NrYWRlbXV4IGFuZCBtYXRyb3NrYXBhcnNlCisJICBNb3ZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdG8gbWF0cm9za2EtcmVhZC1jb21tb24uW2NoXSBmcm9tCisJICBtYXRyb3NrYS1kZW11eC5jIGFuZCBtYXRyb3NrYS1wYXJzZS5jOgorCSAgLSBnc3RfbWF0cm9za2Ffe2RlbXV4LHBhcnNlfV9wYXJzZV9hdHRhY2htZW50cworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDg3NworCisyMDExLTA2LTA2IDEyOjQzOjE0ICswNTMwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2E6IHJlZmFjdG9yIGNvZGUgY29tbW9uIHRvIG1hdHJvc2thZGVtdXggYW5kIG1hdHJvc2thcGFyc2UKKwkgIE1vdmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiB0byBtYXRyb3NrYS1yZWFkLWNvbW1vbi5bY2hdIGZyb20KKwkgIG1hdHJvc2thLWRlbXV4LmMgYW5kIG1hdHJvc2thLXBhcnNlLmM6CisJICAtIGdzdF9tYXRyb3NrYV97ZGVtdXgscGFyc2V9X3BhcnNlX2F0dGFjaGVkX2ZpbGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA4NzcKKworMjAxMS0wNi0wNSAyMjo0NTo1NSArMDUzMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogcmVmYWN0b3IgY29kZSBjb21tb24gdG8gbWF0cm9za2FkZW11eCBhbmQgbWF0cm9za2FwYXJzZQorCSAgTW92ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIHRvIG1hdHJvc2thLXJlYWQtY29tbW9uLltjaF0gZnJvbQorCSAgbWF0cm9za2EtZGVtdXguYyBhbmQgbWF0cm9za2EtcGFyc2UuYzoKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fcGFyc2VfaW5mbworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDg3NworCisyMDExLTA2LTA1IDEwOjE1OjIzICswNTMwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBjb2RlIGNvbW1vbiB0byBtYXRyb3NrYWRlbXV4IGFuZCBtYXRyb3NrYXBhcnNlCisJICBNb3ZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdG8gbWF0cm9za2EtcmVhZC1jb21tb24uW2NoXSBmcm9tCisJICBtYXRyb3NrYS1kZW11eC5jIGFuZCBtYXRyb3NrYS1wYXJzZS5jOgorCSAgLSBnc3RfbWF0cm9za2Ffe2RlbXV4LHBhcnNlfV9wYXJzZV9tZXRhZGF0YQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDg3NworCisyMDExLTA2LTA1IDA5OjU0OjQyICswNTMwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2E6IHJlZmFjdG9yIGNvZGUgY29tbW9uIHRvIG1hdHJvc2thZGVtdXggYW5kIG1hdHJvc2thcGFyc2UKKwkgIE1vdmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiB0byBtYXRyb3NrYS1yZWFkLWNvbW1vbi5bY2hdIGZyb20KKwkgIG1hdHJvc2thLWRlbXV4LmMgYW5kIG1hdHJvc2thLXBhcnNlLmM6CisJICAtIGdzdF9tYXRyb3NrYV97ZGVtdXgscGFyc2V9X3BhcnNlX21ldGFkYXRhX2lkX3RhZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDg3NworCisyMDExLTA2LTA1IDAyOjI0OjQxICswNTMwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2E6IHJlZmFjdG9yIGNvZGUgY29tbW9uIHRvIG1hdHJvc2thZGVtdXggYW5kIG1hdHJvc2thcGFyc2UKKwkgIE1vdmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiB0byBtYXRyb3NrYS1yZWFkLWNvbW1vbi5bY2hdIGZyb20KKwkgIG1hdHJvc2thLWRlbXV4LmMgYW5kIG1hdHJvc2thLXBhcnNlLmM6CisJICAtIGdzdF9tYXRyb3NrYV97ZGVtdXgscGFyc2V9X3BhcnNlX21ldGFkYXRhX2lkX3NpbXBsZV90YWcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA4NzcKKworMjAxMS0wNi0wNiAxMjo0Mjo1MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHJlc2V0IHN0YXRlIHRyYWNraW5nIHZhcmlhYmxlIHdoZW4gYXBwcm9wcmlhdGUKKwkgIC4uLiBzbyB3ZSBkb24ndCBlbmQgdXAgaW50ZXJydXB0aW5nIGFuIG9wZXJhdGlvbiB0aGF0IHNob3VsZCBub3QgYmUgaW50ZXJydXB0ZWQKKwkgIGJhc2VkIG9uIHRoZSBpbmRpY2F0aW9uIG9mIGEgcHJldmlvdXMgaW50ZXJydXB0YWJsZSBvcGVyYXRpb24uCisKKzIwMTEtMDYtMDQgMTM6NDk6NTIgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJICBpbnRlcmxlYXZlOiBXb3JrIGFyb3VuZCBjaGFuZ2VzIGluIGdfYXRvbWljIEFQSQorCSAgU2VlICM2NTE1MTQgZm9yIGRldGFpbHMuCisKKzIwMTEtMDYtMDQgMTM6NDM6MDAgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNpbmsuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc2luay5oOgorCSAgc291cGh0dHBzaW5rOiBjb2RlIGNsZWFudXAKKworMjAxMS0wNi0wNSAwMjowMDowOCArMDUzMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkgIG1hdHJvc2thcGFyc2U6IFVzZSBBUlRJU1QgdGFnIGluc3RlYWQgb2YgQVVUSE9SIGZvciBHU1RfVEFHX0FSVElTVAorCSAgQVVUSE9SIG9ubHkgZXhpc3RlZCBpbiBhbiBvbGQgdmVyc2lvbiBvZiB0aGUgc3BlYyBhbmQgQVJUSVNUIGlzCisJICB0aGUgbmV3IHJlcGxhY2VtZW50IGZvciB0aGlzLiBXZSBhcmUgc3RpbGwgcmVhZGluZyBib3RoIHRvIHN0aWxsCisJICBiZSBjb21wYXRpYmxlIHdpdGggb2xkIGZpbGVzLgorCSAgRml4ZXMgYnVnICM2NDQ4NzUuCisKKzIwMTEtMDYtMDIgMTg6NTE6MjkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIHN5cy94aW1hZ2UveGltYWdldXRpbC5jCisKKzIwMTEtMDYtMDIgMTg6NDc6MzYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmM6CisJICBhdmk6IHBvcnQgQVZJIGVsZW1lbnRzIHRvIG5ldyBBUEkKKworMjAxMS0wNi0wMiAxMzozODozMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICBkdmRlbXV4OiBGaXJzdCBxdWVyeSB0aGUgcGVlciBkdXJhdGlvbiBpbiB0aGUgcmVxdWVzdGVkIGZvcm1hdCBiZWZvcmUgY29udmVydGluZyB0byBCWVRFUworCSAgRml4ZXMgdXNhZ2Ugb2YgZHZkZW11eCBhZnRlciBhbm90aGVyIGRlbXV4ZXIsIGUuZy4gbXhmZGVtdXguCisJICBGaXhlcyBidWcgIzY1MDUwMy4KKworMjAxMS0wNi0wMiAxMDo0MTo1MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc2luay5jOgorCSAgc291cGh0dHBzaW5rOiBGaXggcmVmY291bnRpbmcgb2YgdGhlICJzZXNzaW9uIiBwcm9wZXJ0eQorCSAgUHJvcGVydGllcyBzaG91bGQgbmV2ZXIgdGFrZSBvd25lcnNoaXAgb2YgdGhlIHZhbHVlcworCSAgcGFzc2VkIHRvIHRoZW0uCisKKzIwMTEtMDYtMDEgMTc6MDQ6MjcgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogRm9yIHN0cmVhbWluZyBmaWxlcywgcHVzaCB0YWdzIGZpcnN0CisKKzIwMTEtMDUtMjQgMTQ6NTI6MDEgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvc291cC9NYWtlZmlsZS5hbToKKwkqIGV4dC9zb3VwL2dzdHNvdXAuYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc2luay5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzaW5rLmg6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cDogQWRkIHNvdXBodHRwc2luaworCisyMDExLTA2LTAxIDEwOjE5OjMxICswMjAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBhbGxvdyBza2lwLWZpcnN0LWJ5dGVzIG9mIGZ1bGwgYnVmZmVyIHNpemUKKworMjAxMS0wNS0zMCAxODozMTo1MCArMDUzMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBjb2RlIGNvbW1vbiB0byBtYXRyb3NrYWRlbXV4IGFuZCBtYXRyb3NrYXBhcnNlCisJICBNb3ZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRvIG1hdHJvc2thLXJlYWQtY29tbW9uLltjaF0gZnJvbQorCSAgbWF0cm9za2EtZGVtdXguYyBhbmQgbWF0cm9za2EtcGFyc2UuYzoKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fcGFyc2VfaGVhZGVyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwODc3CisKKzIwMTEtMDUtMzAgMTI6MDk6MzEgKzAyMDAgIEFudG9uaW8gRnJlZGlhbmkgPGFudG9uaW8uZnJlZGlhbmlAaW53aW5kLml0PgorCisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LmM6CisJICBxdG11eDogVXNlIEdTVF9UQUdfSU1BR0UgZm9yIGNvdmVyYXJ0IHRvbworCSAgRml4ZXMgYnVnICM2MzgxMDcuCisKKzIwMTEtMDUtMzAgMTA6NDA6MDggKzA1MzAgIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogcmVmYWN0b3IgY29kZSBjb21tb24gdG8gbWF0cm9za2FkZW11eCBhbmQgbWF0cm9za2FwYXJzZQorCSAgTW92ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB0byBtYXRyb3NrYS1yZWFkLWNvbW1vbi5bY2hdIGZyb20KKwkgIG1hdHJvc2thLWRlbXV4LmMgYW5kIG1hdHJvc2thLXBhcnNlLmM6CisJICAtIGdzdF9tYXRyb3NrYV97ZGVtdXgscGFyc2V9X2dldF9zZWVrX3RyYWNrCisJICAtIGdzdF9tYXRyb3NrYV97ZGVtdXgscGFyc2V9X3Jlc2V0X3N0cmVhbXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA4NzcKKworMjAxMS0wNS0yOCAyMjowNDozNCArMDUzMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogcmVmYWN0b3IgY29kZSBjb21tb24gdG8gbWF0cm9za2FkZW11eCBhbmQgbWF0cm9za2FwYXJzZQorCSAgTW92ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIHRvIG1hdHJvc2thLXJlYWQtY29tbW9uLltjaF0gZnJvbQorCSAgbWF0cm9za2EtZGVtdXguYyBhbmQgbWF0cm9za2EtcGFyc2UuYzoKKwkgIC0gZ3N0X21hdHJvc2the2RlbXV4LHBhcnNlfV9mb3VuZF9nbG9iYWxfdGFnCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwODc3CisKKzIwMTEtMDUtMjggMTA6NTk6MDkgKzA1MzAgIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogcmVmYWN0b3IgY29kZSBjb21tb24gdG8gbWF0cm9za2FkZW11eCBhbmQgbWF0cm9za2FwYXJzZQorCSAgTW92ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB0byBtYXRyb3NrYS1yZWFkLWNvbW1vbi5bY2hdIGZyb20KKwkgIG1hdHJvc2thLWRlbXV4LmMgYW5kIG1hdHJvc2thLXBhcnNlLmM6CisJICAtIGdzdF9tYXRyb3NrYV9pbmRleF9zZWVrX2ZpbmQKKwkgIC0gZ3N0X21hdHJvc2the2RlbXV4LHBhcnNlfV9kb19pbmRleF9zZWVrCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwODc3CisKKzIwMTEtMDUtMjcgMjM6MTU6MjMgKzA1MzAgIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogcmVmYWN0b3IgY29kZSBjb21tb24gdG8gbWF0cm9za2FkZW11eCBhbmQgbWF0cm9za2FwYXJzZQorCSAgTW92ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIHRvIG1hdHJvc2thLXJlYWQtY29tbW9uLltjaF0gZnJvbQorCSAgbWF0cm9za2EtZGVtdXguYyBhbmQgbWF0cm9za2EtcGFyc2UuYzoKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fdHJhY2tudW1iZXJfdW5pcXVlCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwODc3CisKKzIwMTEtMDUtMjcgMjA6Mjg6MTkgKzA1MzAgIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogcmVmYWN0b3IgY29kZSBjb21tb24gdG8gbWF0cm9za2FkZW11eCBhbmQgbWF0cm9za2FwYXJzZQorCSAgTW92ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIHRvIG1hdHJvc2thLXJlYWQtY29tbW9uLltjaF0gZnJvbQorCSAgbWF0cm9za2EtZGVtdXguYyBhbmQgbWF0cm9za2EtcGFyc2UuYzoKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fZGVjb2RlX2RhdGEKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA4NzcKKworMjAxMS0wNS0yNyAxOTozMDo0OCArMDUzMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBjb2RlIGNvbW1vbiB0byBtYXRyb3NrYWRlbXV4IGFuZCBtYXRyb3NrYXBhcnNlCisJICBNb3ZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdG8gbWF0cm9za2EtcmVhZC1jb21tb24uW2NoXSBmcm9tCisJICBtYXRyb3NrYS1kZW11eC5jIGFuZCBtYXRyb3NrYS1wYXJzZS5jOgorCSAgLSBnc3RfbWF0cm9za2Ffe2RlbXV4LHBhcnNlfV9nZXRfbGVuZ3RoCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwODc3CisKKzIwMTEtMDUtMjcgMDk6MTc6NDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBSZXZlcnQgMWE5MGE2YzQgYW5kIGRyb3AgRGlyYWMgc3VwcG9ydCBhZ2FpbgorCSAgSXQgZG9lcyBub3Qgd29yayBhdCBhbGwgKEEvViBzeW5jIGlzc3VlcyksIGlzIG5vdCB2ZXJ5IHVzZWZ1bCwKKwkgIG90aGVyIGNvbnRhaW5lcnMgd29yayBtdWNoIGJldHRlciB3aXRoIERpcmFjIGFuZCBEaXJhYyBpbiBBVkkKKwkgIGlzIG5vdCBzdXBwb3J0ZWQgYnkgb3RoZXIgc29mdHdhcmUuCisJICBGaXhlcyBidWcgIzU0MTIxNS4KKworMjAxMS0wNS0yNiAyMzozNTo1MiArMDUzMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBjb2RlIGNvbW1vbiB0byBtYXRyb3NrYWRlbXV4IGFuZCBtYXRyb3NrYXBhcnNlCisJICBNb3ZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRvIG1hdHJvc2thLXJlYWQtY29tbW9uLltjaF0gZnJvbQorCSAgbWF0cm9za2EtZGVtdXguYyBhbmQgbWF0cm9za2EtcGFyc2UuYzoKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fZW5jb2RpbmdfY21wCisJICAtIGdzdF9tYXRyb3NrYV97ZGVtdXgscGFyc2V9X3JlYWRfdHJhY2tfZW5jb2RpbmdzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwODc3CisKKzIwMTEtMDUtMjMgMTg6MDY6NDQgKzAzMDAgIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogcmVmYWN0b3IgY29kZSBjb21tb24gdG8gbWF0cm9za2FkZW11eCBhbmQgbWF0cm9za2FwYXJzZQorCSAgTW92ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB0byBtYXRyb3NrYS1yZWFkLWNvbW1vbi5bY2hdIGZyb20KKwkgIG1hdHJvc2thLWRlbXV4LmMgYW5kIG1hdHJvc2thLXBhcnNlLmM6CisJICAtIGdzdF9tYXRyb3NrYV97ZGVtdXgscGFyc2V9X3BlZWtfaWRfbGVuZ3RoX3B1bGwKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fcGVla19pZF9sZW5ndGhfcHVzaAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDg3NworCisyMDExLTA1LTIzIDE4OjA2OjQ0ICswMzAwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBjb2RlIGNvbW1vbiB0byBtYXRyb3NrYWRlbXV4IGFuZCBtYXRyb3NrYXBhcnNlCisJICBNb3ZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdG8gbWF0cm9za2EtcmVhZC1jb21tb24uW2NoXSBmcm9tCisJICBtYXRyb3NrYS1kZW11eC5jIGFuZCBtYXRyb3NrYS1wYXJzZS5jOgorCSAgLSBnc3RfbWF0cm9za2Ffe2RlbXV4LHBhcnNlfV9wZWVrX2FkYXB0ZXIKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA4NzcKKworMjAxMS0wNS0yNiAxMjo0ODozNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy94aW1hZ2UveGltYWdldXRpbC5jOgorCSAgeHZpbWFnZXNpbms6IEZhbGxiYWNrIHRvIG5vbi1YU2htIG1vZGUgaWYgYWxsb2NhdGluZyB0aGUgWFNobSBpbWFnZSBmYWlsZWQKKwkgIEZpeGVzIGJ1ZyAjNjMwNDU2LgorCisyMDExLTA1LTI2IDEyOjIyOjUyICswMjAwICBNYXJjIExlZW1hbiA8bWFyYy5sZWVtYW5AZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkgIHJ0cG1wNHZwYXk6IERlcHJlY2F0ZWQgc2VuZC1jb25maWcgcHJvcGVydHkgYW5kIHJlcGxhY2UgYnkgY29uZmlnLWludGVydmFsCisJICBGaXhlcyBidWcgIzYyMjQxMi4KKworMjAxMC0wNi0yMyAxMToxMjowMCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgbWF0cm9za2FkZW11eDogVVRGLTggc3VidGl0bGVzIG1heSBoYXZlIG1hcmt1cAorCSAgRml4ZXMgIzYxNjkzNi4KKworMjAxMS0wMS0yMyAxNTo1Njo0OSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOgorCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5Lmg6CisJICBjYWlyb3RleHRvdmVybGF5OiBmb3J3YXJkIG5ldyBzZWdtZW50IGV2ZW50cyBmcm9tIHRoZSBzaW5rIHRvIHRoZSBzb3VyY2UKKwkgIE5vdCBkb2luZyBzbyB3aWxsIGNhdXNlIGJ1ZmZlcnMgdG8gYmUgcmVjZWl2ZWQgYnkgZG93bnN0cmVhbSB3aXRob3V0CisJICBhIHRpbWUgYmFzZSBzZXQuCisJICBXZSB1c2UgdGhlIHNhbWUgbWV0aG9kIGF2aW11eCB1c2VzIHRvIGdldCBhY2Nlc3MgdG8gdGhlIGV2ZW50IHdoZW4KKwkgIGNvbGxlY3RwYWRzIGdvdCB0aGUgc2luayBldmVudCBmdW5jdGlvbi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDAzMjMKKworMjAxMS0wMS0yNCAxMToxMTo0OCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOgorCSAgdGV4dG92ZXJsYXk6IGZvcndhcmQgc291cmNlIGV2ZW50cyB0byBzaW5rcworCSAgRXZlbnRzIGFyZSBwYXNzZWQgdG8gdGhlIHZpZGVvIHNpbmssIGFuZCB0byB0aGUgdGV4dCBzaW5rIGlmIGl0IGlzCisJICBsaW5rZWQuCisJICBUaGlzIHdpbGwgYWxsb3cgc2Vla2luZywgZm9yIGluc3RhbmNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU4NjQ1MAorCisyMDExLTA1LTI1IDIxOjEyOjEyICswMjAwICBEYXZpZCBIb3l0IDxkaG95dEBsbG5sLmdvdj4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5oOgorCSAgbXVsdGlwYXJ0ZGVtdXg6IEFkZCBwcm9wZXJ0eSB0byBhc3N1bWUgYSBzaW5nbGUgc3RyZWFtIGFuZCBlbWl0IG5vLW1vcmUtcGFkcworCSAgRml4ZXMgYnVnICM2MTY2ODYuCisKKzIwMTEtMDUtMjUgMTQ6NTA6MjYgKzAyMDAgIE1pZ3VlbCBBbmdlbCBDYWJyZXJhIE1veWEgPG1hZG1hYzI1MDFAZ21haWwuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiB1bmlmb3JtIHVua25vd24gbWVzc2FnZSBoYW5kbGluZworCSAgRG8gdGhlIHNhbWUgcHJvY2Vzc2luZyBpbiBhbGwgdGhlIGNhc2VzIHdoZW4gYW4gdW5rbm93biBtZXNzYWdlIGlzIHJlY2VpdmVkLgorCSAgVGhhdCBpcywgZ2l2ZSBhIHdhcm5pbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUxMDU5CisKKzIwMTEtMDUtMjMgMTg6MDY6NDQgKzAzMDAgIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmg6CisJICBtYXRyb3NrYTogcmVmYWN0b3IgY29kZSBjb21tb24gdG8gbWF0cm9za2FkZW11eCBhbmQgbWF0cm9za2FwYXJzZQorCSAgTW92ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIHRvIG1hdHJvc2thLXJlYWQtY29tbW9uLltjaF0gZnJvbQorCSAgbWF0cm9za2EtZGVtdXguYyBhbmQgbWF0cm9za2EtcGFyc2UuYzoKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fcGVla19wdWxsCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwODc3CisKKzIwMTEtMDUtMjMgMTg6MDY6NDQgKzAzMDAgIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2E6IHJlZmFjdG9yIGNvZGUgY29tbW9uIHRvIG1hdHJvc2thZGVtdXggYW5kIG1hdHJvc2thcGFyc2UKKwkgIE1vdmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiB0byBtYXRyb3NrYS1yZWFkLWNvbW1vbi5bY2hdIGZyb20KKwkgIG1hdHJvc2thLWRlbXV4LmMgYW5kIG1hdHJvc2thLXBhcnNlLmM6CisJICAtIGdzdF9tYXRyb3NrYV97ZGVtdXgscGFyc2V9X3BlZWtfYnl0ZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA4NzcKKworMjAxMS0wNS0yMyAxODowNjo0NCArMDMwMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBjb2RlIGNvbW1vbiB0byBtYXRyb3NrYWRlbXV4IGFuZCBtYXRyb3NrYXBhcnNlCisJICBNb3ZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRvIG1hdHJvc2thLXJlYWQtY29tbW9uLltjaF0gZnJvbQorCSAgbWF0cm9za2EtZGVtdXguYyBhbmQgbWF0cm9za2EtcGFyc2UuYzoKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fZW5jb2Rpbmdfb3JkZXJfdW5pcXVlCisJICAtIGdzdF9tYXRyb3NrYV97ZGVtdXgscGFyc2V9X3JlYWRfdHJhY2tfZW5jb2RpbmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA4NzcKKworMjAxMS0wNS0yNCAxODoyNzoxMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkgIGF1dG9kZXRlY3Q6IHBvcnQgdG8gbmV3IEFQSQorCisyMDExLTA1LTI0IDE3OjM0OjE5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmMKKwkgIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYworCSAgZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYworCSAgZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jCisJICBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYworCisyMDExLTA1LTI0IDEzOjEyOjE5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkgIHBjbXVkZXBheTogYWxsb3cgdmFyaWFibGUgc2FtcGxlIHJhdGUKKworMjAxMS0wNS0yNCAxMzoxMTo1NCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6CisJICBwY21hZGVwYXk6IGFsbG93IHZhcmlhYmxlIHNhbXBsZSByYXRlCisKKzIwMTAtMDQtMDQgMDY6NDM6NDEgLTA1MDAgIFJvYiBDbGFyayA8cm9iQHRpLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBhZGQgbm9ybSBwcm9wZXJ0eQorCSAgQmFzZWQgb24gYSBwYXRjaCBieSBHdWVubmFkaSBMaWFraG92ZXRza2kuCisJICB2MjogdXBkYXRlcyBiZWNhdXNlIEkgZm9yZ290IHRvIGFkZCBHc3RUdW5lciBpbnRlcmZhY2UgdG8gdjRsMnNpbmsKKwkgIHYzOiB1cGRhdGUgdG8gYWRkIGFsbCBwb3NzaWJsZSB2YWx1ZXMgdG8gbm9ybSBlbnVtCisKKzIwMTEtMDUtMjMgMjA6NDY6MDQgKzAzMDAgIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiBmaXhlZCBjb3B5cmlnaHQgaGVhZGVycworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDg3NworCisyMDExLTA1LTIzIDE4OjA2OjQ0ICswMzAwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2E6IHJlZmFjdG9yIGNvZGUgY29tbW9uIHRvIG1hdHJvc2thZGVtdXggYW5kIG1hdHJvc2thcGFyc2UKKwkgIE1vdmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgdG8gbWF0cm9za2EtcmVhZC1jb21tb24uW2NoXSBmcm9tCisJICBtYXRyb3NrYS1kZW11eC5jIGFuZCBtYXRyb3NrYS1wYXJzZS5jOgorCSAgLSBnc3RfbWF0cm9za2FfZGVjb2RlX2NvbnRlbnRfZW5jb2RpbmdzCisJICAtIGdzdF9tYXRyb3NrYV9kZWNvbXByZXNzX2RhdGEKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA4NzcKKworMjAxMS0wNS0yMyAxODo0ODo1NyArMDMwMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oOgorCSAgbWF0cm9za2E6IG1vdmUgR3N0TWF0cm9za2F7RGVtdXgsUGFyc2V9OjpzdGF0ZSB0byBHc3RNYXRyb3NrYVJlYWRDb21tb24KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTA4NzcKKworMjAxMS0wNS0yNCAwOTo0ODo1NiArMDIwMCAgSm9uYXMgTGFyc3NvbiA8am9uYXMubGFyc3NvbkBoaXEuc2U+CisKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IGJ1ZmZlciBsZWFrIHdpdGggY29ycnVwdGVkIGZpbGVzCisJICBGaXhlcyBidWcgIzY1MDkxMi4KKworMjAxMS0wNS0yMyAwMjo0NjozOCAtMDcwMCAgTWlndWVsIEFuZ2VsIENhYnJlcmEgTW95YSA8bWFkbWFjMjUwMUBnbWFpbC5jb20+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGZpeCBwYXJhbWV0ZXIgdHlwZSBpbiB0cmFjZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDkzNworCisyMDExLTA1LTIzIDE4OjA2OjQ0ICswMzAwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uaDoKKwkgIG1hdHJvc2thOiByZWZhY3RvciBjb2RlIGNvbW1vbiB0byBtYXRyb3NrYWRlbXV4IGFuZCBtYXRyb3NrYXBhcnNlCisJICBSZXBsYWNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHdpdGggdGhlaXIgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uXyoKKwkgIGNvdW50ZXJwYXJ0czoKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fcGFyc2VfaW5kZXgKKwkgIC0gZ3N0X21hdHJvc2thX3tkZW11eCxwYXJzZX1fcGFyc2Vfc2tpcAorCSAgLSBnc3RfbWF0cm9za2Ffe2RlbXV4LHBhcnNlfV9zdHJlYW1fZnJvbV9udW0KKwkgIEludHJvZHVjZSBHc3RNYXRyb3NrYVJlYWRDb21tb24gdG8gY29udGFpbiB0aG9zZSBtZW1iZXJzIG9mCisJICBHc3RNYXRyb3NrYURlbXV4IGFuZCBHc3RNYXRyb3NrYVBhcnNlIHRoYXQgd2VyZSB1c2VkIGJ5IHRoZSBhYm92ZQorCSAgZnVuY3Rpb25zLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDg3NworCisyMDExLTA1LTIzIDEzOjUwOjQ2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogdGVsbCBiYXNlcGFyc2UgdGhlIGR1cmF0aW9uIGluIHNhbXBsZXMgZm9yIGJldHRlciBhY2N1cmFjeQorCSAgVGVsbCBHc3RCYXNlUGFyc2UgdGhlIGR1cmF0aW9uIGluIHNhbXBsZXMgaW5zdGVhZCBvZiB0aW1lLCBzbyB0aGF0CisJICBhIGR1cmF0aW9uIHF1ZXJ5IGluIERFRkFVTFQgZm9ybWF0IHdpbGwgcmV0dXJuIHRoZSBjb3JyZWN0IG51bWJlcgorCSAgb2Ygc2FtcGxlcyB3aXRob3V0IHJvdW5kaW5nIGVycm9ycy4gQmFzZXBhcnNlIHdpbGwgY29udmVydCB0aGlzCisJICBpbnRvIHRpbWUgaXRzZWxmIHdoZW4gbmVlZGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDc4NQorCisyMDExLTA1LTIzIDEzOjI1OjQ0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogYWxzbyB0cnkgdXBzdHJlYW0gZmlyc3QgZm9yIGR1cmF0aW9uIHF1ZXJ5IGluIERFRkFVTFQgZm9ybWF0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjUwNzg1CisKKzIwMTEtMDUtMjMgMTM6MjM6MjEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBtYWtlIGNvbnZlcnNpb24gZnJvbSBUSU1FIHRvIERFRkFVTFQgZm9ybWF0IChzYW1wbGVzKSB3b3JrCisJICBGaXggY29weSduJ3Bhc3RlIGVycm9yIGluIHRoZSBwcmV2aW91cyBjb21taXQuCisKKzIwMTEtMDUtMjMgMTE6MzY6MzYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBJbXBsZW1lbnQgY29udmVyc2lvbnMgYmV0d2VlbiBUSU1FIGFuZCBERUZBVUxUIGZvcm1hdAorCSAgRml4ZXMgYnVnICM2NTA3ODUuCisKKzIwMTEtMDUtMjIgMTg6NTA6NTEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBkb24ndCBlcnJvciBvdXQgb24gaW52YWxpZCBtaW5pbXVtX2Jsb2Nrc2l6ZSB2YWx1ZSBpbiBzdHJlYW1pbmZvIGhlYWRlcgorCSAgV2UgZG9uJ3QgdXNlIGl0LCBzbyBtYXkganVzdCBhcyB3ZWxsIGFjY2VwdCBhbiBpbnZhbGlkIHZhbHVlCisJICBvZiAwIGhlcmUsIHdoaWNoIGlzIGxpa2VseSBpbmNvbnNlcXVlbnRpYWwgYW55d2F5LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDY5MQorCisyMDExLTA1LTIwIDEwOjM0OjQ3ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jOgorCSAgcnRwOiBmaXggc3RhdGljIGFycmF5IG92ZXJydW5zIGluIGEgbmljZXIgd2F5CisJICBVc2UgR19OX0VMRU1FTlRTIGluc3RlYWQgb2YgaGFyZC1jb2RpbmcgdGhlIGFycmF5IHNpemUuCisKKzIwMTEtMDUtMjAgMDA6NTM6NDQgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJICBydHA6IGZpeCBzdGF0aWMgYXJyYXkgb3ZlcnJ1bnMKKwkgIFllcyBhcnJheVsxMF0gaGFzIGVsZW1lbnRzIGZyb20gMC4uLjkuCisKKzIwMTEtMDUtMTkgMjM6MzE6MTkgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJICBkb2NzOiB1cGRhdGUgcGx1Z2luIGludHJvc3BlY3Rpb24gZGF0YQorCSAgTm93IG1vcmUgZmlsZXMgYXJlIG1lcmdlZCBhbmQgcHJvZHVjZWQgaW4gYSBjYW5vbmljYWwgZmFzaGlvbiwgd2hpY2ggaG9wZWZ1bGx5CisJICBjcmVhdGVzIGxlc3Mgb3Igbm8gZGVsdGEgaW4gdGhlIGZ1dHVyZS4KKworMjAxMS0wNS0xOSAyMjo1NzoxNSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gOWU1YmJkNSB0byA2OWI5ODFmCisKKzIwMTEtMDUtMTkgMTg6MjE6MzMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgbWlzc2luZyBicmVhaworCisyMDEwLTExLTA4IDE0OjA2OjE1ICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJICBkZWludGVybGFjZTogQWRkIHN1cHBvcnQgZm9yIGRlaW50ZXJsYWNpbmcgdXNpbmcgYnVmZmVyIGNhcHMvZmxhZ3MKKwkgIFdoZW4gbm90IHVzaW5nIHRoZSBmaWVsZGFuYWx5c2lzIGVsZW1lbnQgaW1tZWRpYXRlbHkgdXBzdHJlYW0gb2YgZGVpbnRlcmxhY2UsCisJICBiZWhhdmlvdXIgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWQuIGZpZWxkYW5hbHlzaXMgd2lsbCBzZXQgdGhlIGNhcHMgYW5kIGZsYWdzIG9uCisJICB0aGUgYnVmZmVycyBzdWNoIHRoYXQgdGhleSBjYW4gYmUgaW50ZXJwcmV0ZWQgYW5kIGFjdGVkIHVwb24gdG8gcHJvZHVjZQorCSAgcHJvZ3Jlc3NpdmUgb3V0cHV0LgorCSAgVGhlcmUgYXJlIHR3byBtYWluIG1vZGVzIG9mIG9wZXJhdGlvbjoKKwkgIC0gUGFzc2l2ZSBwYXR0ZXJuIGxvY2tpbmcKKwkgIFBhc3NpdmUgcGF0dGVybiBsb2NraW5nIGlzIGEgbm9uLWJsb2NraW5nLCBsb3ctbGF0ZW5jeSBtb2RlIG9mIG9wZXJhdGlvbiB0aGF0CisJICBpcyBzdWl0YWJsZSBmb3IgY2xvc2UtdG8tbGl2ZSB1c2FnZS4gSW5pdGlhbGx5IGEgdGVsZWNpbmUgc3RyZWFtIHdpbGwgYmUKKwkgIG91dHB1dCBhcyB2YXJpYWJsZSBmcmFtZXJhdGUgd2l0aCBuYcOvdmUgdGltZXN0YW1wIGFkanVzdG1lbnQuIFdpdGggZWFjaAorCSAgaW5jb21pbmcgYnVmZmVyLCBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gbG9jayBvbnRvIGEgcGF0dGVybi4gV2hlbiBhIGxvY2sgaXMKKwkgIG9idGFpbmVkLCB0aGUgc3JjIHBhZCBhbmQgb3V0cHV0IGJ1ZmZlciBjYXBzIHdpbGwgcmVmbGVjdCB0aGUgcGF0dGVybiBhbmQKKwkgIHRpbWVzdGFtcHMgd2lsbCBiZSBhY2N1cmF0ZWx5IGludGVycG9sYXRlZCBiZXR3ZWVuIHBhdHRlcm4gcmVwZWF0cy4gVGhpcworCSAgbWVhbnMgdGhhdCBpbml0aWFsbHkgYW5kIGF0IHBhdHRlcm4gdHJhbnNpdGlvbnMgdGhlcmUgd2lsbCBiZSBzaG9ydCBwZXJpb2RzCisJICBvZiBpbmFjY3VyYXRlIHRpbWVzdGFtcGluZy4KKwkgIC0gQWN0aXZlIHBhdHRlcm4gbG9ja2luZworCSAgQWN0aXZlIHBhdHRlcm4gbG9ja2luZyBpcyBhIGJsb2NraW5nLCBoaWdoLWxhdGVuY3kgbW9kZSBvZiBvcGVyYXRpb24gdGhhdCBpcworCSAgdGFyZ2V0ZWQgYXQgdXNlLWNhc2VzIHdoZXJlIHRpbWVzdGFtcCBhY2N1cmFjeSBpcyBwYXJhbW91bnQuIEJ1ZmZlcnMgd2lsbCBiZQorCSAgcXVldWVkIHVudGlsIGVub3VnaCBhcmUgcHJlc2VudCB0byBtYWtlIGEgbG9jay4gV2hlbiBsb2NrZWQsIHRpbWVzdGFtcHMgd2lsbAorCSAgYmUgYWNjdXJhdGVseSBpbnRlcnBvbGF0ZWQgYmV0d2VlbiBwYXR0ZXJuIHJlcGVhdHMuIE9ycGhhbiBmaWVsZHMgY2FuIGJlCisJICBkcm9wcGVkIG9yIGRlaW50ZXJsYWNlZC4gSWYgbm8gbG9jayBjYW4gYmUgb2J0YWluZWQsIGEgc2luZ2xlIGZpZWxkIG1pZ2h0IGJlCisJICBwdXNoZWQgdGhyb3VnaCB0byBiZSBkZWludGVybGFjZWQuCisJICBMb2NraW5nIGNhbiBhbHNvIGJlIGRpc2FibGVkIG9yICdhdXRvJyBjaG9vc2VzIGJldHdlZW4gcGFzc2l2ZSBhbmQgYWN0aXZlCisJICBsb2NraW5nIG1vZGVzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHVwc3RyZWFtIGlzIGxpdmUuCisKKzIwMTEtMDUtMTAgMTY6MjU6NDAgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IFJlbW92ZSBjb25maWcgc2NyaXB0IGNoZWNrIGZvciBjYWNhCisKKzIwMTEtMDUtMTggMTI6MzY6NDAgKzAyMDAgIEpvc2UgQW50b25pbyBTYW50b3MgQ2FkZW5hcyA8c2FudG9zY2FkZW5hc0BnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOgorCSAgcnRwOiBGaXggc2VnbWVudGF0aW9uIGZhdWx0IHByb2Nlc3NpbmcgcGF5bG9hZCBidWZmZXJzCisJICBUaGlzIGNvbW1pdCBjaGVja3MgaWYgdGhlIHZhbHVlIHJldHVybmVkIGJ5CisJICBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9idWZmZXIgYW5kCisJICBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgaXMgTlVMTCBiZWZvcmUgdXNpbmcgaXQuCisKKzIwMTEtMDUtMTggMTY6MTA6MDcgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGZkMzUwNzMgdG8gOWU1YmJkNQorCisyMDExLTA1LTE4IDEyOjUyOjMxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGVuc3VyZSAwLXBhZGRpbmcgd2hlbiBjb3JyZWN0aW5nIGR1YmlvdXMgbGlzdCBzaXplCisKKzIwMTEtMDUtMTggMTI6MjQ6MjUgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDQ2ZGZjZWEgdG8gZmQzNTA3MworCisyMDExLTA1LTE4IDEwOjIyOjI3ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHVzZSBFSU5WQUwgZm9yIG1pc3NpbmcgdXJsIHBhcmFtZXRlcgorCSAgRml4ZXMgZ2NjIHdhcm5pbmcgYWJvdXQgdXNpbmcgdW5pbml0aWFsaXplZCB2YXJpYWJsZSAncmVzJy4KKworMjAxMS0wNC0yOCAxNTozNzo0MCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkgIHZhcmlvdXM6IGZpeCBhdXRob3IgdGFnIGluIGVsZW1lbnQgZGV0YWlscworCisyMDExLTA0LTIwIDE1OjI1OjU4IC0wNDAwICBDaHJpcyBFIEpvbmVzIDxjaHJpc0BjaHJpc2Vqb25lcy5jb20+CisKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkgIGF1cGFyc2U6IGltcGxlbWVudCBzZWVraW5nCisJICBJbXBsZW1lbnQgc2Vla2luZyBhbmQgc2Vla2luZyBxdWVyeS4gRml4ZXMgIzY0NDUxMgorCisyMDExLTA1LTE3IDE2OjEzOjU5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisKKzIwMTEtMDQtMDYgMTY6MDU6NTUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBhbHNvIGFsbG93IFBBVVNFIHRvIGJlIGludGVycnVwdGVkCisJICAuLi4gYXMgaXQgaXMgb24gdGhlIHdheSBvdXQgdG8gTlVMTC4KKwkgIFNlZSAjNjMyNTA0LgorCisyMDExLTA0LTA2IDE1OjUxOjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZW5zdXJlIHByb3BlciBjbG9zaW5nIGFuZCBjbGVhbnVwCisJICAuLi4gc2luY2UgdGhlIFRFQVJET1dOIHNlcXVlbmNlIG1pZ2h0IG5vdCBoYXZlIGhhZCBhIGNoYW5jZSB0byBldmVuIHN0YXJ0LAorCSAgYnV0IGF0IGxlYXN0IGNvbm5lY3Rpb25zIHNob3VsZCBiZSBjbG9zZWQgKHN5bmNocm9ub3VzbHkpIGFuZCBzdGF0ZSBjbGVhbmVkIHVwLgorCSAgU2VlICM2MzI1MDQuCisKKzIwMTEtMDQtMDYgMTU6NDk6MDEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBmaXggYW5kIGltcHJvdmUgYXN5bmMgaGFuZGxpbmcKKwkgIFNpbXBsaWZ5IHRoZSBjb21tYW5kIGhhbmRsaW5nOyBwYXNzaW5nIGEgY29tbWFuZCB0byB0aHJlYWQgbWVhbnMgd2UgcmVhbGx5CisJICB3YW50IGl0IHRvIGdldCB0aGUgbWVzc2FnZSwgd2hpY2ggbWVhbnMgdG8gYWx3YXlzIGZsdXNoIHByb3ZpZGVkIHRoZSBjb21tYW5kCisJICBjYW4gaGFuZGxlIGJlaW5nIGludGVycnVwdGVkLiAgQ29tbWFuZCB0aHJlYWQgaW5kaWNhdGVzIHdoZXRoZXIgY29tbWFuZAorCSAgYWxsb3dzIGludGVycnVwdGlvbiBhbmQgZW5zdXJlIG5vbi1mbHVzaGluZyBjb25uZWN0aW9uIGFzIGl0IHN1YnNlcXVlbnRseQorCSAgbmVlZHMgaXQuCisJICBJbiBwYXJ0aWN1bGFyLCB0aGlzIGFsc28gbWFrZXMgdGhlIFRFQVJET1dOIHNlcXVlbmNlIGludGVycnVwdGFibGUKKwkgIGFuZCBhbHNvIHByZXZlbnRzIHJhY2VzIHdoZXJlIF9sb29wXyBjb3VsZCBtaXNzIGEgY29tbWFuZCBhbmQgd291bGQKKwkgIGNvbnRpbnVlIHJlY2VpdmluZyAob3IgYXQgbGVhc3QgdHJ5aW5nIHRvKS4KKwkgIFNlZSAjNjMyNTA0LgorCisyMDExLTA0LTA2IDE0OjUzOjI3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogdHdlYWsgcG9zdC1zZWVrIGxvb3AgaGFuZGxpbmcKKworMjAxMS0wMS0xMCAxMjo0NjozNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogb3BlbiBvbiBwbGF5IGFuZCBwYXVzZSB3aGVuIG5vdCBkb25lIHlldAorCSAgV2l0aCB0aGUgYXN5bmMgc3RhdGUgY2hhbmdlcywgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBuZWVkIHRvIG9wZW4gdGhlIHN0cmVhbQorCSAgYmVmb3JlIHBsYXkgYW5kIHBhdXNlLgorCSAgQWxzbyBtYWtlIHN1cmUgd2UgcmVtZW1iZXIgYSBwcmV2aW91cyBvcGVuIGZhaWx1cmUgc28gdGhhdCB3ZSBkb24ndCBrZWVwIHRyeWluZworCSAgYWdhaW4uCisKKzIwMTEtMDEtMTAgMTE6NDU6MDMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGltcHJvdmUgYXN5bmMgaGFuZGxpbmcKKwkgIFNpbXBsaWZ5IHRoZSBjb21tYW5kIGhhbmRsaW5nLCBvbmx5IGNvbnRpbnVlIGxvb3Bpbmcgd2hlbiB3ZSBoYXZlIG5vdCByZWNlaXZlZAorCSAgYW5vdGhlciBjb21tYW5kIG9yIHdoZW4gdGhlIHByZXZpb3VzIGxvb3Agd2FzIHN1Y2Nlc3NmdWxsLgorCSAgQXZvaWQgbG9vcGluZyBvbiBhIGRpc2Nvbm5lY3RlZCBzb2NrZXQuCisKKzIwMTEtMDEtMDcgMTg6MDI6NDkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHJld29yayByZWNvbm5lY3QgY29kZQorCSAgVXNlIHRoZSBzYW1lIGFzeW5jIGNvZGUgcGF0aCB0byBpbXBsZW1lbnQgcmVjb25uZWN0cy4KKwkgIE1ha2Ugc3VyZSB3ZSBvbmx5IHBvc3QgcHJvZ3Jlc3MgbWVzc2FnZXMgd2hlbiBkb2luZyBhc3luYyB0aGluZ3MuCisKKzIwMTEtMDEtMDcgMTc6MTk6NTkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHNtYWxsIGNsZWFudXBzCisJICBNYWtlIHN1cmUgd2UgY2FuY2VsIHRoZSBwcmV2aW91cyB0YXNrIHdoZW4gcXVldWluZyBhIG5ldyBvbmUuCisJICBNb3ZlIHRoZSBtZXNzYWdlcyB0byBhIGNlbnRyYWwgcGxhY2Ugc28gd2UgY2FuIG1vcmUgZWFzaWx5IHBvc3QgdGhlbS4KKworMjAxMS0wMS0wNyAxNToxNTo0OSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZG9uJ3QgcG9zdCBlcnJvcnMgd2hlbiBpbnRlcnJ1cHRpbmcKKworMjAxMS0wMS0wNyAxMzo0MzowNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogaW1wbGVtZW50IG1vcmUgYXN5bmMgaGFuZGxpbmcKKwkgIFJlbW92ZSBzb21lIG9sZCBsb2Nrcy4KKwkgIE1ha2Ugc3VyZSB3ZSBuZXZlciBnbyBpbnRvIHRoZSBsb29wIGZ1bmN0aW9uIHdoZW4gZmx1c2hpbmcuCisKKzIwMTEtMDEtMDcgMTE6NDA6MzIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGZpcnN0IGF0dGVtcHQgYXQgYXN5bmMgaW1wbGVtZW50YXRpb24KKworMjAxMS0wMS0wNyAxMTo0MDoxMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogc21hbGwgaGVhZGVyIGNsZWFudXBzCisKKzIwMTEtMDUtMTcgMTA6NDc6MzIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHNzcmNkZW11eDogRml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgY29tcGlsZXIgd2FybmluZyBmb3IgKHByZS0pIHJlbGVhc2VzIHRvbworCisyMDExLTA0LTI4IDE1OjU3OjA0ICswMjAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMm9iamVjdHM6IE9ubHkgYWxsb3cgbXBlZy10cyBvbiBzb3VyY2Ugb2JqZWN0cworCSAgVWdseSBmaXggZm9yICM2NDgzMTIKKworMjAxMS0wNS0xNyAwOToyNDowOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgcnRwc3NyY2RlbXV4OiBGaXggdW5pbml0aWFsaXplZCB2YXJpYWJsZSBjb21waWxlciB3YXJuaW5nCisKKzIwMTEtMDUtMDYgMTk6MDk6MTcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBzc3JjZGVtdXg6IEltcGxlbWVudCBpdGVyYXRlIGludGVybmFsIGxpbmtzIGZvciBzaW5rIHBhZHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDk2MTcKKworMjAxMS0wNS0wNiAxODo0MTowMSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cHNzcmNkZW11eDogaXRlcmF0ZSBwYWQgZnVuY3Rpb24gaXMgb25seSB2YWxpZCBmb3Igc3JjIHBhZHMKKwkgIFRoZSBpdGVyYXRlIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBmb3Igc3JjIHBhZHMsIHNvIG1hcmsgaXQgYXMgc3VjaCBhbmQgcmVtb3ZlCisJICBkZWFkIGNvZGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ5NjE3CisKKzIwMTEtMDUtMDYgMTg6MTI6NTMgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBydHBzc3JjZGVtdXg6IFJlbGVhc2UgbG9jayBiZWZvcmUgZW1pdHRpbmcgc2lnbmFsCisJICBJZiB0aGUgbG9jayBpcyBub3QgcmVsZWFzZWQgYmVmb3JlIGVtaXR0aW5nIGEgc2lnbmFsLCBpdCBtYXkgY2F1c2UgYSBkZWFkbG9jaworCSAgaWYgYW55IG90aGVyIGZ1bmN0aW9uIGluIHRoZSBlbGVtZW50IGlzIGNhbGxlZC4KKwkgIEFsc28gcmVtb3ZlZCBhbiB1bnVzZWQgdGltZXN0YW1wIHBhcmFtZXRlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0OTYxNworCisyMDExLTA1LTE1IDIzOjI1OjE1ICswMzAwICBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSAgbWF0cm9za2FwYXJzZTogY2FsY3VsYXRlIHNlZ21lbnQgZHVyYXRpb24gYWZ0ZXIgcGFyc2luZyBhbGwgdGhlIElEcworCSAgU2luY2UgdGhlIHNlZ21lbnQgZHVyYXRpb24gaXMgZ2l2ZW4gaW4gdGVybXMgb2YgdGhlCisJICBHU1RfTUFUUk9TS0FfSURfVElNRUNPREVTQ0FMRSB3ZSBzaG91bGQgb25seSBjb252ZXJ0IGl0IGludG8KKwkgIG5hbm9zZWNvbmRzIHdoZW4gd2UgYXJlIHN1cmUgdGhhdCBhbnkgc2NhbGUgc3BlY2lmaWVkIGluIHRoZSBmaWxlIGhhcworCSAgYmVlbiByZWFkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY1MDI1OAorCisyMDExLTA1LTE2IDE3OjUyOjExICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBjb25maWd1cmUuYWMKKworMjAxMS0wNS0xNiAxNzo1MDoxNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jOgorCSAgLWdvb2Q6IGZpeCBmb3IgbmV3IEFQSQorCisyMDExLTA1LTA0IDExOjU1OjIxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBhZGRpdGlvbmFsIGxvY2sgc2FmZXR5CisJICBGaXhlcyAjNjE5NTkwLgorCisyMDExLTA0LTI2IDE2OjA2OjU2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhbHNvIGNoZWNrIGZvciBiaXRyYXRlIGluZm8gaW4gY2FwcworCisyMDEwLTA1LTI1IDAxOjA0OjQzICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGd1ZXNzIGJpdHJhdGUgaWYgb25seSBvbmUgc3RyZWFtJ3MgYml0cmF0ZSBpcyB1bmtub3duCisJICBJZiB0aGUgYml0cmF0ZXMgZm9yIGFsbCBidXQgb25lIGF1ZGlvL3ZpZGVvIHN0cmVhbXMgYXJlIGtub3duLCBhbmQgdGhlCisJICB0b3RhbCBzdHJlYW0gc2l6ZSBhbmQgZHVyYXRpb24gY2FuIGJlIGRldGVybWluZWQsIHRoaXMgY2FsY3VsYXRlcyB0aGUKKwkgIHVua293biBiaXRyYXRlIGFzIChzdHJlYW0gc2l6ZSAvIGR1cmF0aW9uKSAtIChzdW0gb2Yga25vd24gYml0cmF0ZXMpLgorCSAgV2hpbGUgdGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB2ZXJ5IGFjY3VyYXRlLCBpdCBzaG91bGQgYmUgZ29vZAorCSAgZW5vdWdoIGZvciBtb3N0IHB1cnBvc2VzLgorCSAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgdXNlZnVsIGZvciBILjI2MyArIEFBQyBzdHJlYW1zIHdoZXJlIG5vICdidHJ0JyBhdG9tCisJICBpcyBhdmFpbGFibGUgZm9yIHRoZSB2aWRlbyBwb3J0aW9uLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxOTU0OAorCisyMDEwLTA1LTMxIDIzOjU5OjU5ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lzb21wNC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBFeHBvcnQgbWF4IGJpdHJhdGUgZm9yIEFNUi1OQi8tV0Igc3RyZWFtcworCSAgVGhpcyBwYXJzZXMgdGhlICdkYW1yJyBhdG9tIGlmIHByZXNlbnQsIGFuZCBleHBvcnRzIHRoZSBtYXhpbXVtIGJpdHJhdGUKKwkgIG9mIHRoZSBzdHJlYW0gdXNpbmcgdGhlIG1vZGUgc2V0IGZpZWxkIHRvIGRldGVybWluZSB0aGUgaGlnaGVzdCBiaXRyYXRlCisJICBmcmFtZSB0eXBlIHRoYXQgbWlnaHQgYmUgcHJlc2VudC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MjAxODYKKworMjAxMS0wNS0xNiAwOTowNDozMSArMDIwMCAgUGlubyBUb3NjYW5vIDx0b3NjYW5vLnBpbm9AdGlzY2FsaS5pdD4KKworCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSAgcHVsc2U6IERlZmluZSBQQVRIX01BWCBpZiBpdCBpc24ndCBkZWZpbmVkCisJICBHTlUgSHVyZCBmb3IgZXhhbXBsZSBkb2Vzbid0IGRlZmluZSBpdC4KKworMjAxMS0wNS0xNSAyMzoyNToxNSArMDMwMCAgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGNhbGN1bGF0ZSBzZWdtZW50IGR1cmF0aW9uIGFmdGVyIHBhcnNpbmcgYWxsIHRoZSBJRHMKKwkgIFNpbmNlIHRoZSBzZWdtZW50IGR1cmF0aW9uIGlzIGdpdmVuIGluIHRlcm1zIG9mIHRoZQorCSAgR1NUX01BVFJPU0tBX0lEX1RJTUVDT0RFU0NBTEUgd2Ugc2hvdWxkIG9ubHkgY29udmVydCBpdCBpbnRvCisJICBuYW5vc2Vjb25kcyB3aGVuIHdlIGFyZSBzdXJlIHRoYXQgYW55IHNjYWxlIHNwZWNpZmllZCBpbiB0aGUgZmlsZSBoYXMKKwkgIGJlZW4gcmVhZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NTAyNTgKKworMjAxMS0wNS0wOSAxOTowMDo0NSArMDIwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDxhbW9yYWxlc0BmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBBZGQgc3VwcG9ydCBmb3IgbXBlZ3ZlcnNpb24gMiwgd2hpY2ggaXMgYWxzbyBBQUMKKworMjAxMS0wNS0xMSAxMDoyNToxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkgIGZsYWNkZWM6IFNlbmQgRU9TIHdoZW4gc2Vla2luZyBhZnRlciB0aGUgZW5kIG9mIGZpbGUgaW5zdGVhZCBvZiBmYWlsaW5nCisJICBGaXhlcyBidWcgIzY0OTc4MC4KKworMjAxMS0wNC0yOSAwODo1OToyMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJICB3YXZlbmM6IFNldCBmaXhlZGNhcHMgZ2V0Y2FwcyBmdW5jdGlvbiBvbiB0aGUgc2lua3BhZAorCSAgd2F2ZW5jIGRvZXMgbm90IGFsbG93IHRvIGNoYW5nZSB0aGUgY2FwcyBkdXJpbmcgcGxheWJhY2sKKwkgIGFuZCBhbHdheXMgcmV0dXJuaW5nIHRoZSB0ZW1wbGF0ZSBjYXBzIGlzIGp1c3Qgd3JvbmcuCisKKzIwMTEtMDQtMjkgMDg6NTU6MTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSAgd2F2ZW5jOiBBbGxvdyBzZXRjYXBzIHRvIGJlIGNhbGxlZCBhZnRlciBhIGZvcm1hdCB3YXMgbmVnb3RpYXRlZCBpZiBpdCdzIGNvbXBhdGlibGUKKwkgIE90aGVyd2lzZSB3YXZlbmMgd2lsbCBmYWlsIGlmIHVwc3RyZWFtIGRlY2lkZXMgdG8gc2V0IGVxdWl2YWxlbnQgY2FwcyBvciBjYXBzCisJICB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbGF0ZXIuCisJICBUaGFua3MgdG8gQWxleGFuZGVyIFNjaHJlbW1lciBmb3IgZmluZGluZyB0aGlzIGJ1Zy4KKworMjAxMS0wNS0xNCAxMDowMjoyMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQKKworPT09IHJlbGVhc2UgMC4xMC4yOSA9PT0KKworMjAxMS0wNS0xMCAxMDowNDoyOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9nbC5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3JvLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAwLjEwLjI5CisJICBIaWdobGlnaHRzOgorCSAgLSBhbXJwYXJzZSwgYWFjcGFyc2UsIGFjM3BhcnNlLCBmbGFjcGFyc2UsIG1wZWdhdWRpb3BhcnNlLCBkY2FwYXJzZSBhdWRpbyBwYXJzZXJzIChtb3ZlZCBmcm9tIC1iYWQpCisJICAtIG11eGVycyBub3cgbXV4IGJhc2VkIG9uIHJ1bm5pbmcgdGltZQorCSAgLSBJU08gTVA0IG11eGVyczogbXA0bXV4LzNncHBtdXgvcXRtdXgvbWoybXV4IChtb3ZlZCBmcm9tIC1iYWQpCisJICAtIG5ldyBtYXRyb3NrYXBhcnNlIGVsZW1lbnQKKwkgIC0gbmV3IHY0bDJyYWRpbyBlbGVtZW50CisJICAtIHJ0cHNlc3Npb246IHN1cHBvcnQgUlRDUCBFYXJseSBGZWVkYmFjayAodGhlIEFWUEYgcHJvZmlsZSkKKwkgIC0gb3JjIDAuNC4xNCBvciBuZXdlciByZWNvbW1lbmRlZAorCSAgLSBtYW55IG90aGVyIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMKKworMjAxMS0wNS0wNSAxMzoyNDoyMyArMDIwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBGaXggc2lnbmVkIGZsb2F0aW5nIHBvaW50IHZhbHVlcyB3cml0aW5nCisJICBZb3Ugd291bGQgZW5kIHVwIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcyB3aXRoIDAgYmVpbmcgd3JpdHRlbiBvdXQKKwkgIGluc3RlYWQgb2YgdGhlIHByb3BlciB2YWx1ZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDk0NDkKKworMjAxMS0wNS0wNCAxMjowNDoxNSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBhdm9pZCBidWlsZGluZyBpbmRleCB3aGVuIHN0cmVhbWFibGUKKwkgIC4uLiBhcyBpdCB3aWxsIG5vdCBiZSB3cml0dGVuIGFueXdheS4KKwkgIEZpeGVzICM2NDg5MzcgKD8pLgorCisyMDExLTA1LTAyIDEyOjA5OjAyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogTWFrZWZpbGUuYW06CisJICBidWlsZDogYWRkIG9sZCBxdGRlbXV4L3F1aWNrdGltZSBkaXJlY3RvcmllcyB0byBDUlVGVF9ESVJTIGFuZCBDUlVGVF9GSUxFUworCisyMDExLTA1LTAxIDAwOjA0OjAzIC0wNDAwICBUb20gSmFuaXN6ZXdza2kgPHRvbS5qYW5pc3pld3NraUBhbGNhdGVsLWx1Y2VudC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IGRvbid0IG92ZXJ3cml0ZSBtZXRhZGF0YSB0YWcgd2l0aCBkdXJhdGlvbiBpbiBzdHJlYW1pbmcgbW9kZQorCSAgQSBkdXJhdGlvbiB0YWcgZ2V0cyBpbnNlcnRlZCBvbmx5IGZvciBzdHJlYW1hYmxlPWZhbHNlLCBzbyBvbmx5CisJICB1cGRhdGUvd3JpdGUgdGhlIGR1cmF0aW9uIGxhdGVyIGlmIHdlIGFjdHVhbGx5IGluc2VydGVkIHRoYXQgdGFnLAorCSAgb3RoZXJ3aXNlIHdlIHdyaXRlIGdhcmJhZ2UgaW50byBvdGhlciB0YWdzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0OTA2MAorCisyMDExLTA0LTMwIDE4OjE2OjM2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBwby9mci5wbzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIDAuMTAuMjguNCBwcmUtcmVsZWFzZQorCisyMDExLTA0LTMwIDE3OjQ2OjM2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogQW5kcm9pZC5tazoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlzb21wNC54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJKiBnc3QvaXNvbXA0L0xFR0FMOgorCSogZ3N0L2lzb21wNC9NYWtlZmlsZS5hbToKKwkqIGdzdC9pc29tcDQvYXRvbXMuYzoKKwkqIGdzdC9pc29tcDQvYXRvbXMuaDoKKwkqIGdzdC9pc29tcDQvYXRvbXNyZWNvdmVyeS5jOgorCSogZ3N0L2lzb21wNC9hdG9tc3JlY292ZXJ5Lmg6CisJKiBnc3QvaXNvbXA0L2Rlc2NyaXB0b3JzLmM6CisJKiBnc3QvaXNvbXA0L2Rlc2NyaXB0b3JzLmg6CisJKiBnc3QvaXNvbXA0L2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9mdHlwY2MuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtb292cmVjb3Zlci5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG1vb3ZyZWNvdmVyLmg6CisJKiBnc3QvaXNvbXA0L2dzdHF0bXV4LWRvYy5jOgorCSogZ3N0L2lzb21wNC9nc3RxdG11eC1kb2MuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXguaDoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXhtYXAuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cXRtdXhtYXAuaDoKKwkqIGdzdC9pc29tcDQvZ3N0cnRweHF0ZGVwYXkuYzoKKwkqIGdzdC9pc29tcDQvZ3N0cnRweHF0ZGVwYXkuaDoKKwkqIGdzdC9pc29tcDQvaXNvbXA0LXBsdWdpbi5jOgorCSogZ3N0L2lzb21wNC9wcm9wZXJ0aWVzLmM6CisJKiBnc3QvaXNvbXA0L3Byb3BlcnRpZXMuaDoKKwkqIGdzdC9pc29tcDQvcXRhdG9tcGFyc2VyLmg6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXguYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eC5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4LnZjcHJvajoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X2ZvdXJjYy5oOgorCSogZ3N0L2lzb21wNC9xdGRlbXV4X2xhbmcuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF9sYW5nLmg6CisJKiBnc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuYzoKKwkqIGdzdC9pc29tcDQvcXRkZW11eF90eXBlcy5oOgorCSogZ3N0L2lzb21wNC9xdHBhbGV0dGUuaDoKKwkqIHBvL1BPVEZJTEVTLmluOgorCSAgcXVpY2t0aW1lOiByZW5hbWUgcGx1Z2luIHRvIGlzb21wNAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0ODAwNAorCisyMDExLTA0LTI5IDE3OjU1OjI4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IGZpeCBzb21lIHBhcnNlcnMKKworMjAxMS0wNC0yOSAxNzo1NDo0MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgZml4IGVycm9yIGNhdXNlZCBieSBtZXJnaW5nCisKKzIwMTEtMDQtMjkgMTU6NDk6NDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKwkgIENvbmZsaWN0czoKKwkgIGNvbmZpZ3VyZS5hYworCSAgZ3N0L3J0cC9nc3RydHBnc3RwYXkuYworCisyMDExLTA0LTI5IDE1OjQ2OjIxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSAgYXVkaW9meDogZml4IHBhZF9hbGxvYworCisyMDExLTA0LTI3IDEyOjQ1OjUxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogcG8vYmcucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vcnUucG86CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjI4LjMgcHJlLXJlbGVhc2UKKworMjAxMS0wNC0yNiAxNTo1ODoxMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIHJ0cGdzdHBheTogZml4IGJ1ZmZlciBsZWFrCisKKzIwMTEtMDQtMjYgMTU6NTg6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5LmM6CisJICBydHBnc3RwYXk6IGZpeCBidWZmZXIgbGVhaworCisyMDExLTA0LTI2IDE1OjQyOjQ3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IHBvcnQgamFjayBlbGVtZW50cworCisyMDExLTA0LTI1IDEwOjA0OjUyICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBkb2N1bWVudGF0aW9uIHR5cG8gImpwZWdkZGVjIgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0ODU4OQorCisyMDExLTA0LTI1IDE4OjE0OjQ1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSAgcnRwOiBwb3J0IHNvbWUgbW9yZSBlbGVtZW50cworCisyMDExLTA0LTI1IDE3OjI3OjQwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY21hcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211cGF5LmM6CisJICBydHA6IHBvcnQgbW9yZSB0byAwLjExCisKKzIwMTEtMDQtMjUgMTM6MTY6NTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJICBydHA6IHBvcnQgc29tZSBtb3JlIChkZSlwYXlsb2FkZXJzCisKKzIwMTEtMDQtMjUgMTI6NDk6MzYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2ZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlaWlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICBwb3J0IHNvbWUgbW9yZSBlbGVtZW50cyB0byAwLjExCisKKzIwMTEtMDQtMjUgMTE6Mzg6MjggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0wNC0yNCAxNjo0NTowNyAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBhdmltdXgsbWF0cm9za2FtdXg6IEFkZCBzdHJlYW0tZm9ybWF0IHRvIGgyNjQgY2FwcworCSAgRml4ZXMgIzYwNjY2Mi4KKworMjAxMS0wMi0yMCAxMjoxMzo0OSAtMDgwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJICBwbmdkZWM6IFJlbW92ZSB0ZW1wb3JhcnkgY29kZQorCSAgTm93IHRoYXQgd2UgZGVwZW5kIG9uICh3aGF0IHdpbGwgYmUpIC1iYXNlLTAuMTAuMzMuCisKKzIwMTEtMDQtMjQgMTQ6MDM6NTYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGRvbid0IHBhc3MgLVdhZGRyZXNzIHRvIE9iakMgY29tcGlsZXIgb24gT1NYIHdoZW4gY29tcGlsaW5nIG9zeHZpZGVvc2luaworCSAgVGVtcG9yYXJ5IHdvcmthcm91bmQgdW50aWwgd2UgZml4IHRoaXMgcHJvcGVybHkgYW5kIGNoZWNrIGZvcgorCSAgdGhlIE9iakMgd2FybmluZy9lcnJvciBmbGFncyBpbnN0ZWFkIG9mIGp1c3QgcGFzc2luZyBDRkxBR1MgdG8gdGhlCisJICBPYmpDIGNvbXBpbGVyLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MzkzOQorCisyMDExLTA0LTI0IDEzOjI5OjMyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJKiBnc3QvcXVpY2t0aW1lL01ha2VmaWxlLmFtOgorCSAgcXVpY2t0aW1lOiByZW5hbWUgcGx1Z2luIGZpbGVuYW1lIGZyb20gKnF0ZGVtdXgqIHRvICpxdWlja3RpbWUqCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ4MDA0CisKKzIwMTEtMDQtMjQgMTQ6MDM6NDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gYzNjYWZlMSB0byA0NmRmY2VhCisKKzIwMTEtMDQtMjEgMjM6MzA6MjYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZ3N0L3F1aWNrdGltZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtb292cmVjb3Zlci5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC1kb2MuYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXgtZG9jLmg6CisJICBkb2NzOiBhZGQgdmFyaW91cyBxdG11eCB2YXJpYW50cyB0byBkb2N1bWVudGF0aW9uCisKKzIwMTEtMDQtMjEgMjI6NTE6NTIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmg6CisJICBxdWlja3RpbWU6IHJlZ2lzdGVyIDNncHBtdXggZWxlbWVudCBpbiBhZGRpdGlvbiB0byB0aGUgbWlzbmFtZWQgZ3BwbXV4CisKKzIwMTEtMDQtMTggMTg6MDg6MzAgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogUmVtb3ZlIGluY29tcGxldGUgc3VwcG9ydCBmb3IgUlRDUCBGSVIKKwkgIFJlbW92ZSBiaXRzIHRoYXQgd2VyZSBtZWFudCB0byBzdXBwcG9ydCBSVENQIEZJUgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0ODE2MAorCisyMDExLTA0LTE5IDE4OjU1OjMxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6CisJICBmbGFjOiBwb3J0IHRvIDAuMTEKKworMjAxMS0wNC0xOSAxNzozNTo0NyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRwZGVjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1c2UgR19ERUZJTkVfVFlQRSBzb21lIG1vcmUKKworMjAxMS0wNC0xOSAxNzoyMDoxOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkgIGF2aTogdXNlIEdfREVGSU5FX1RZUEUKKworMjAxMS0wNC0xOSAxNzowNzoxOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlbWl4ZXIuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkgIHVzZSBHX0RFRklORV9UWVBFCisKKzIwMTEtMDQtMTkgMTY6MjU6MjggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0wNC0xOSAxNDozMzoyNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZ2VuZXJpYy8uZ2l0aWdub3JlOgorCSogdGVzdHMvY2hlY2svZ2VuZXJpYy9pbmRleC5jOgorCSAgdGVzdHM6IGFkZCBnZW5lcmljIHNldF9pbmRleCB0ZXN0CisKKzIwMTEtMDQtMTkgMTQ6MzM6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogZml4IGRlYWRsb2NrIG9uIHNldHRpbmcgaW5kZXggb24gZmx2ZGVtdXgKKworMjAxMS0wNC0xOSAxNDoxNjoxMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsYWNwYXJzZS5jOgorCSAgdGVzdHM6IGFkZCBpbmRleC1zZXR0aW5nIHRlc3QgZm9yIGJhc2VwYXJzZS9mbGFjcGFyc2UKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDY4MTEKKworMjAxMS0wNC0xOCAxMToyOToxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZwYWNrLmM6CisJICB3YXZwYWNrOiBSZW1vdmUgYnVzIEdTb3VyY2UgdG8gcHJldmVudCBhIHZhbGdyaW5kIHdhcm5pbmcKKworMjAxMS0wNC0xOCAxMToxNDozMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZlbmMuYzoKKwkgIHdhdmVuYzogUmVtb3ZlIGJ1cyBHU291cmNlIHRvIHByZXZlbnQgYSB2YWxncmluZCB3YXJuaW5nCisKKzIwMTEtMDQtMTggMTE6MTE6NTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvdGFnc2NoZWNraW5nLmM6CisJICB0YWdzY2hlY2tpbmc6IFJlbW92ZSBidXMgR1NvdXJjZSB0byBwcmV2ZW50IGEgdmFsZ3JpbmQgd2FybmluZworCisyMDExLTA0LTE4IDExOjEwOjAxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW1hZ2VmcmVlemUuYzoKKwkgIGltYWdlZnJlZXplOiBSZW1vdmUgYnVzIEdTb3VyY2UgdG8gcHJldmVudCBhIHZhbGdyaW5kIHdhcm5pbmcKKworMjAxMS0wNC0xOCAxMDo1NDo0MyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSAgcG9ydCBtb3JlIHBsdWdpbnMgdG8gMC4xMQorCisyMDExLTA0LTE4IDEwOjIzOjQ1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBhbmRyb2lkL2FwZXRhZy5taworCSAgYW5kcm9pZC9hdmkubWsKKwkgIGFuZHJvaWQvZmx2Lm1rCisJICBhbmRyb2lkL2ljeWRlbXV4Lm1rCisJICBhbmRyb2lkL2lkM2RlbXV4Lm1rCisJICBhbmRyb2lkL3F0ZGVtdXgubWsKKwkgIGFuZHJvaWQvcnRwLm1rCisJICBhbmRyb2lkL3J0cG1hbmFnZXIubWsKKwkgIGFuZHJvaWQvcnRzcC5taworCSAgYW5kcm9pZC9zb3VwLm1rCisJICBhbmRyb2lkL3VkcC5taworCSAgYW5kcm9pZC93YXZlbmMubWsKKwkgIGFuZHJvaWQvd2F2cGFyc2UubWsKKwkgIGNvbmZpZ3VyZS5hYworCisyMDExLTA0LTE3IDAxOjI5OjAxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGZpeCAndmFyaWFibGUgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZCcgd2FybmluZ3MgY2F1c2VkIGJ5IC1ER19ESVNBQkxFX0FTU0VSVAorCisyMDExLTA0LTE2IDE4OjUwOjExICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSogd2luMzIvY29tbW9uL2dzdHJ0cGJpbi1tYXJzaGFsLmM6CisJKiB3aW4zMi9jb21tb24vZ3N0cnRwYmluLW1hcnNoYWwuaDoKKwkgIDAuMTAuMjguMiBwcmUtcmVsZWFzZQorCisyMDExLTA0LTE2IDE4OjQ5OjI3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0LmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLWRpc3QuaDoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5oOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRvcmMtZGlzdC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRvcmMtZGlzdC5oOgorCSAgZ3N0OiB1cGRhdGUgZGlzdGVkIG9yYyBiYWNrdXAgY29kZQorCisyMDExLTA0LTE2IDE4OjI5OjQ1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSAgZG9jczogdXBkYXRlIGZvciBwcmUtcmVsZWFzZQorCisyMDExLTA0LTE2IDE4OjI3OjU0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vYmcucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZXMucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL3NsLnBvOgorCSAgcG86IHVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxMS0wNC0xNiAxODoxNzowMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiByZWZ1c2UgaW5jb21wbGV0ZSBsZWdhY3kgaDI2NCBjYXBzCisJICBSZWZ1c2UgaDI2NCBjYXBzIHdpdGhvdXQgc3RyZWFtLWZvcm1hdCBhbmQgY29kZWNfZGF0YSBmaWVsZHMgZm9yCisJICBub3csIHRvIGF2b2lkIGNyZWF0aW5nIGJyb2tlbiBmaWxlcy4gVGhpcyBtaWdodCBjYXVzZSBzb21lIHBpcGVsaW5lcworCSAgdGhhdCB3b3JrZWQgcHJldmlvdXNseSB0byBmYWlsLiBIb3dldmVyLCB0aGUgbW92ZSBmcm9tIC1iYWQgdG8gLWdvb2QKKwkgIGlzIG91ciBvbmx5IGNoYW5jZSB0byBmaXggdGhpcyB1cCwgc28gbWFrZSBpdCBzdHJpY3QgZm9yIG5vdy4gV2UgY2FuCisJICBhbHdheXMgY2hhbmdlIGl0IGJhY2sgdG8gYmUgbGVzcyBzdHJpY3QgaW4gZnV0dXJlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0NzkxOQorCisyMDExLTA0LTE2IDE4OjE2OjExICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiBmaXggYW5vdGhlciB1bnVzZWQtYnV0LXNldC12YXJpYWJsZSB3YXJuaW5nCisKKzIwMTEtMDQtMTYgMTg6MTA6MjQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkgIHB1bHNlLCBzcGVleGVuYywgcnRwZ3NtcGF5OiBkb24ndCB1c2UgZ19hc3NlcnQoKSBmb3IgZXJyb3IgaGFuZGxpbmcKKwkgIERvbid0IHVzZSBnX2Fzc2VydCgpIGZvciBlcnJvciBoYW5kbGluZywgZXZlbiBpZiB0aGV5J3JlIGhpZ2hseSB1bmxpa2VseS4KKwkgIEVpdGhlciB3ZSAqa25vdyogdGhhdCBzb21ldGhpbmcgY2FuJ3QgaGFwcGVuLCBpbiB3aGljaCBjYXNlIHdlCisJICBzaG91bGQganVzdCBub3QgaGFuZGxlIGl0LCBvciB3ZSB0aGluayBzb21ldGhpbmcgY2FuIGhhcHBlbiwgYnV0IGl0IGlzCisJICB2ZXJ5IHZlcnkgdW5saWtlbHkgdGhhdCBpdCB3aWxsIGV2ZXIgaGFwcGVuLCBpbiB3aGljaCBjYXNlIHdlIHNob3VsZAorCSAgaGFuZGxlIGl0IGxpa2UgYW55IG90aGVyIGVycm9yIGluc3RlYWQgb2YgYXNzZXJ0aW5nLgorCSAgZ19hc3NlcnQoKSBpcyBiZXN0IGxlZnQgZm9yIGNvbmRpdGlvbnMgd2UgaGF2ZSBjb250cm9sIG9mLCBsaWtlIGNoZWNraW5nCisJICBpbnRlcm5hbCBjb25zaXN0ZW5jeSBvZiBvdXIgY29kZSwgbm90IGNoZWNraW5nIHJldHVybiB2YWx1ZXMgb2YgZXh0ZXJuYWwKKwkgIGNvZGUuCisJICBGaXhlcyBhIGJ1bmNoIG9mIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIHdpdGggLURHX0RJU0FCTEVfQVNTRVJUOgorCSAgZ3N0cnRwZ3NtcGF5LmM6IEluIGZ1bmN0aW9uICdnc3RfcnRwX2dzbV9wYXlfaGFuZGxlX2J1ZmZlcic6CisJICBnc3RydHBnc21wYXkuYzoxMzA6MTc6IHdhcm5pbmc6IHZhcmlhYmxlICdydHBnc21wYXknIHNldCBidXQgbm90IHVzZWQKKwkgIGdzdHNwZWV4ZW5jLmM6IEluIGZ1bmN0aW9uICdnc3Rfc3BlZXhfZW5jX2VuY29kZSc6CisJICBnc3RzcGVleGVuYy5jOjkwNDoxOTogd2FybmluZzogdmFyaWFibGUgJ3dyaXR0ZW4nIHNldCBidXQgbm90IHVzZWQKKwkgIHB1bHNlc2luay5jOiBJbiBmdW5jdGlvbiAnZ3N0X3B1bHNlc2lua19jaGFuZ2Vfc3RhdGUnOgorCSAgcHVsc2VzaW5rLmM6MjcyNTo5OiB3YXJuaW5nOiB2YXJpYWJsZSAncmVzJyBzZXQgYnV0IG5vdCB1c2VkCisJICBwdWxzZXNyYy5jOiBJbiBmdW5jdGlvbiAnZ3N0X3B1bHNlc3JjX2NoYW5nZV9zdGF0ZSc6CisJICBwdWxzZXNyYy5jOjEyNTM6Nzogd2FybmluZzogdmFyaWFibGUgJ2UnIHNldCBidXQgbm90IHVzZWQKKworMjAxMS0wNC0xNiAxODowNzozNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLmM6CisJICBleGFtcGxlczogZml4IHNvbWUgd2FybmluZ3MgaW4gcnRwIGV4YW1wbGUKKwkgIENhdXNlZCBieSAtREdfRElTQUJMRV9BU1NFUlQKKworMjAxMS0wNC0xNiAxNzo1NzozMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL2xldmVsL2xldmVsLWV4YW1wbGUuYzoKKwkgIGV4YW1wbGVzOiBkb24ndCBwdXQgY29kZSB3aXRoIHNpZGUtZWZmZWN0cyBpbnRvIGdfYXNzZXJ0KCkKKwkgIE90aGVyd2lzZSB0aGluZ3Mgd29uJ3Qgd29yayB0b28gd2VsbCB3aGVuIGNvbXBpbGluZyB3aXRoCisJICAtREdfRElTQUJMRV9BU1NFUlQgKGFzIHdlIGRvIGZvciBwcmUtcmVsZWFzZXMgYW5kIHJlbGVhc2VzKS4KKworMjAxMS0wNC0xNiAxNjo1MTozMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgZGVpbnRlcmxhY2UsIG1hdHJvc2thOiBmaXggdHdvIHZhcmlhYmxlLW1heS1iZS11c2VkLXVuaW5pdGlhbGl6ZWQgY29tcGlsZXIgd2FybmluZ3MKKwkgIFdlIHVzZSAtREdfRElTQUJMRV9BU1NFUlQgZm9yIHRoZSBwcmUtcmVsZWFzZXMsIHdoaWNoIG1ha2VzIHRoZXNlCisJICB3YXJuaW5ncyBwb3AgdXAgaW4gY2FzZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgY292ZXJlZCBieSBnX2Fzc2VydF9ub3RfcmVhY2hlZCgpCisJICBhbmQgdGhlIGxpa2U6CisJICB0dnRpbWUvZ3JlZWR5aC5jOjgwMToxNDogd2FybmluZzogJ3NjYW5saW5lJyBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24KKwkgIG1hdHJvc2thLW11eC5jOjUwMToxOTogd2FybmluZzogJ2NvbnRleHQnIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbgorCisyMDExLTA0LTE2IDE0OjQ1OjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOgorCSAgYXBlZGVtdXg6IFBvcnQgdG8gMC4xMQorCisyMDExLTA0LTE2IDEzOjMzOjQ1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICBqYWNrOiBmaXggdW51c2VkLWJ1dC1zZXQtdmFyaWFibGUgd2FybmluZ3Mgd2l0aCBnY2MtNC42CisKKzIwMTEtMDQtMTYgMTM6MjM6NTAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9jYWlyby9jYWlyb19vdmVybGF5LmM6CisJICBleGFtcGxlczogZml4ICdjb250cm9sIHJlYWNoZXMgZW5kIG9mIG5vbi12b2lkIGZ1bmN0aW9uJyB3YXJuaW5nIGluIGNhaXJvIGV4YW1wbGUKKworMjAxMS0wNC0xNSAxNTo0NzoyNCArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBBZGRyZXNzIHVudXNlZCBidXQgc2V0IHZhcmlhYmxlCisJICBUaGUgdjRsMm9iamVjdCBmb3JtYXRzIGxpc3Qgd2FzIGJlaW5nIG9idGFpbmVkIGludG8gYSBsb2NhbCB2YXJpYWJsZSBhbmQKKwkgIHRoZW4gc3RpbGwgdXNlZCBmcm9tIHRoZSBjb250ZXh0LiBNYWtlIHVzZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUuCisKKzIwMTEtMDQtMTUgMTU6MTc6MzQgKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zczQvb3NzNC1taXhlci1zbGlkZXIuYzoKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXItc3dpdGNoLmM6CisJKiBzeXMvb3NzNC9vc3M0LXByb3BlcnR5LXByb2JlLmM6CisJKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSAgb3NzNDogQWRkcmVzcyB1bnVzZWQgYnV0IHNldCB2YXJpYWJsZXMKKwkgIEdDQyA0LjYueCBjb21wbGFpbnMgYWJvdXQgc3VjaCB2YXJpYWJsZSB1c2FnZS4gVW51c2VkIGJ1dCBzZXQgdmFyaWFibGVzCisJICB3ZXJlIHJlbW92ZWQgZXhjZXB0IHRoYXQgZ3N0X29zczRfbWl4ZXJfc2xpZGVyX3NldF9tdXRlICgpIG5vdyByZXR1cm5zCisJICB0aGUgdmFsdWUgZnJvbSB0aGUgY2FsbCB0byBnc3Rfb3NzNF9taXhlcl9zZXRfY29udHJvbF92YWwgKCkuCisKKzIwMTEtMDQtMTUgMTU6MTQ6MTMgKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJICBqcGVnZW5jOiBwdWxzZXNpbms6IHJhdzEzOTQ6IEFkZHJlc3MgdW51c2VkIGJ1dCBzZXQgdmFyaWFibGVzCisJICBHQ0MgNC42Lnggc3BpdHMgd2FybmluZ3MgYWJvdXQgc3VjaCB1c2FnZSBvZiB2YXJpYWJsZXMuIFRoZSB2YXJpYWJsZXMgaW4KKwkgIHJhdzEzOTQgd2VyZSBtYXJrZWQgd2l0aCBHX0dOVUNfVU5VU0VEIGFzIHRoaXMgc2VlbWVkIG9tcmUgYXBwcm9wcmlhdGUuCisJICBUaGUgb3RoZXJzIHdlcmUgcmVtb3ZlZC4KKworMjAxMS0wNC0xNSAxNToxMjo0NCArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIHk0bWVuY29kZTogc2hhcGV3aXBlOiBBZGRyZXNzIHVudXNlZCBidXQgc2V0IHZhcmlhYmxlcworCSAgR0NDIDQuNi54IGNvbXBsYWlucyBhYm91dCBzdWNoIHVzYWdlLgorCisyMDExLTA0LTE1IDE1OjExOjM1ICswMjAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL2ZsYWNkZWMuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL2xldmVsL2xldmVsLWV4YW1wbGUuYzoKKwkqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6CisJKiB0ZXN0cy9pY2xlcy94aW1hZ2VzcmMtdGVzdC5jOgorCSAgdGVzdHM6IEFkZHJlc3MgdW51c2VkIGJ1dCBzZXQgdmFyaWFibGVzCisJICBHQ0MgNC42Lnggc3BpdHMgd2FybmluZ3MgYWJvdXQgc3VjaCB1c2FnZSBvZiB2YXJpYWJsZXMuCisKKzIwMTEtMDQtMTUgMTU6MzY6NDEgKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRvcmMub3JjOgorCSAgdmlkZW9taXhlcjogRml4IGFyZ2IvcmdiYSBvdmVybGF5IG9yYyBjb2RlCisJICBSZW1vdmUgc29tZSByZWR1bmRhbnQgb3BlcmF0aW9ucyAoY29udnVidykgYW5kIHVzZSB0aGUgY29ycmVjdCB2YXJpYWJsZSwKKwkgIHQyLCBpbiB0aGUgb3JjX292ZXJsYXlfYmdyYSBmdW5jdGlvbi4KKworMjAxMS0wNC0xNSAxNTozMzozNSArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvZ3N0Y29sbGVjdHBhZHMyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjogYWRkcmVzcyB1bnVzZWQgYnV0IHNldCB2YXJpYWJsZXMKKwkgIEdDQyA0LjYueCBzcGl0cyB3YXJuaW5ncyBhYm91dCB2YXJpYWJsZXMgdGhhdCBhcmUgc2V0IGJ1dCB1bnVzZWQuIFN1Y2gKKwkgIHZhcmlhYmxlcyBoYXZlIGJlZW4gcmVtb3ZlZCBpbiBibGVuZCwgY29sbGVjdHBhZHMyIGFuZCB2aWRlb21peGVyMi4KKworMjAxMS0wNC0xNSAxNDo1NzoyMCArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cCwgcnRwbWFuYWdlcjogQWRkcmVzcyB1bnVzZWQgYnV0IHNldCB2YXJpYWJsZXMKKwkgIEdDQyA0LjYueCBzcGl0cyB3YXJuaW5ncyBhYm91dCB2YXJpYWJsZXMgdGhhdCBhcmUgdW51c2VkIGJ1dCBzZXQuIFN1Y2gKKwkgIHZhcmlhYmxlcyBoYXZlIGJlZW4gcmVtb3ZlZCB3aGVyZSB0cml2aWFsIGJ1dCB3aXRoIGNvbW1lbnRzIGxlZnQgYmVoaW5kCisJICBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBpbiBzb21lIGNhc2VzLgorCSAgZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3JlY3ZfcnRjcCAoKSB3YXMgY2hhbmdlZCBpbiBjb21taXQgNDkwMTEzZDQKKwkgIHRvIGFsd2F5cyByZXR1cm4gR1NUX0ZMT1dfT0sgaW5zdGVhZCBvZiB0aGUgcmV0dXJuIHZhbHVlIG9mCisJICBydHBfc2Vzc2lvbl9wcm9jZXNzX3J0Y3AgKCksIHNvIHdlJ2xsIGtlZXAgaXQgdGhhdCB3YXkuCisKKzIwMTEtMDQtMTUgMTE6Mjk6MzAgKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9kZXNjcmlwdG9ycy5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RydHB4cXRkZXBheS5jOgorCSogZ3N0L3F1aWNrdGltZS9xdGRlbXV4LmM6CisJICBxdWlja3RpbWU6IFJlbW92ZSB1bnVzZWQgYnV0IHNldCB2YXJpYWJsZXMKKwkgIEdDQyA0LjYueCBzcGl0cyB3YXJuaW5ncyBhYm91dCBzdWNoIHZhcmlhYmxlIHVzYWdlLiBOb3RlIHRoYXQgc29tZQorCSAgY2FsY3VsYXRpb25zIGFyZSBsZWZ0IGFzIGNvbW1lbnRzIGZvciBpbmZvcm1hdGl2ZSBwdXJwb3Nlcy4KKworMjAxMS0wNC0xNSAxMToyMzozOCArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSAgbWF0cm9za2E6IFJlbW92ZSB1bnVzZWQgYnV0IHNldCB2YXJpYWJsZXMKKwkgIEdDQyA0LjYueCBzcGl0cyB3YXJuaW5ncyBhYm91dCBzdWNoIHZhcmlhYmxlIHVzYWdlLgorCisyMDExLTA0LTE1IDExOjE5OjI2ICswMjAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IFJlbW92ZSB1bnVzZWQgYnV0IHNldCBkdXJhdGlvbiB2YXJpYWJsZQorCSAgR0NDIDQuNi54IHNwaXRzIHdhcm5pbmdzIGFib3V0IHN1Y2ggdmFyaWFibGUgdXNhZ2UuCisKKzIwMTEtMDQtMTUgMTE6MTg6MTkgKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx4ZGVtdXg6IFJlbW92ZSB1bnVzZWQgYnV0IHNldCBrZXlmcmFtZSB2YXJpYWJsZXMKKwkgIFRoZSBGSVhNRXMgYWJvdXQgdGhlIGtleWZyYW1lIGZsYWcgbmV2ZXIgYmVpbmcgdXNlZCBhcmUgbGVmdCBmb3IgbGF0ZXIKKwkgIGZpeGluZywgYXQgd2hpY2ggcG9pbnQgdGhlIGtleWZyYW1lIHZhcmlhYmxlcyBjb3VsZCBiZSBhZGRlZCBiYWNrLgorCisyMDExLTA0LTE1IDExOjE2OjQyICswMjAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzoKKwkgIGVkZ2V0djogUmVtb3ZlIHVudXNlZCBidXQgc2V0IGhlaWdodCB2YXJpYWJsZQorCSAgR0NDIDQuNi54IHNwaXRzIHdhcm5pbmdzIGFib3V0IHN1Y2ggdmFyaWFibGVzLgorCisyMDExLTA0LTE1IDE4OjUxOjIwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogdXBkYXRlIGZvciBnc3RfYmFzZV9wYXJzZV9mcmFtZV9pbml0KCkgQVBJIGNoYW5nZQorCisyMDExLTAyLTAxIDE1OjU3OjAxIC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IFVzZSBleGlzdGluZyBmdW5jdGlvbnMgdG8gcGFyc2UgUlRDUCBGQiBwYWNrZXRzCisJICBVc2UgZXhpc3RpbmcgZnVuY3Rpb25zIHRvIGdldCB0aGUgRkNJIGZyb20gRkIgcGFja2V0cy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MjI1NTMKKworMjAxMS0wMi0wMSAxNjoyMzo1MiAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4tbWFyc2hhbC5saXN0OgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogbWFyc2hhbCBHc3RCdWZmZXIgYXMgYSBNaW5pT2JqZWN0IGluc3RlYWQgb2YgYSBwb2ludGVyCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjIyNTUzCisKKzIwMTEtMDQtMTQgMjM6MjQ6NTYgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IEJldHRlciBjYWxjdWxhdGlvbiBvZiBmcmFtZXJhdGUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDc4MzMKKworMjAxMS0wNC0xMyAxMjozNzowOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBkZWZhdWx0IHRvIGR0cy1tZXRob2Q9cmVvcmRlciBhbmQgcHJlc2VudGF0aW9uLXRpbWU9dHJ1ZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzNjY5OQorCisyMDExLTA0LTE1IDEyOjQ3OjUyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIHRlc3RzOiBxdG11eDogdGVzdCB2YXJpb3VzIGR0cy1tZXRob2RzCisKKzIwMTEtMDQtMTUgMTI6MzQ6MDUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogZml4IGNvcm5lciBjYXNlIGJ1ZmZlciBoYW5kbGluZyBmb3IgcmVvcmRlciBtZXRob2QKKworMjAxMS0wNC0xNCAxMzo0NzowNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBEb24ndCBsZWFrIHRoZSBTRUVLSU5HIHF1ZXJ5CisKKzIwMTEtMDQtMTQgMTM6NDM6MDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bW9vdnJlY292ZXIuYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtb292cmVjb3Zlci5oOgorCSAgcXRtb292cmVjb3ZlcjogRG9uJ3QgbGVhayB0aGUgc3RhdGljIHJlY3Vyc2l2ZSBtdXRleAorCisyMDExLTA0LTE0IDEzOjM3OjUyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnJhZGlvLmM6CisJICB2NGwycmFkaW86IEZyZWUgdmlkZW9kZXYgc3RyaW5nIGJlZm9yZSByZXBsYWNpbmcgaXQKKworMjAxMS0wNC0xNCAxMzoyNDoyMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jOgorCSAgbWF0cm9za2FwYXJzZTogQWxsb3cgd2VibSBhbmQgbWF0cm9za2EgY2FwcyBhbmQgZG9uJ3QgbGVhayBjYXBzCisKKzIwMTEtMDQtMTQgMDc6MzU6MjkgKzAxMDAgIENocmlzdGlhbiBGcmVkcmlrIEthbGFnZXIgU2NoYWxsZXIgPGNocmlzdGlhbi5zY2hhbGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIEFkZCBwYXJzZXIgcGx1Z2luCisKKzIwMTEtMDQtMTMgMjE6NTg6MzYgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvTWFrZWZpbGUuYW06CisJKiBnc3QvZHRtZi9nc3RkdG1mY29tbW9uLmg6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5oOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5oOgorCSAgZHRtZjogTW92ZSBkdXBsaWNhdGUgI2RlZmluZXMgaW50byBhIGNvbW1vbiBpbmNsdWRlCisJICBDZW50cmFsaXplIGR1cGxpY2F0ZWQgY29uc3RhbnRzIHNvIHRoZXkgaGF2ZSB0aGUgc2FtZSB2YWx1ZS4KKwkgIEFsc28gc3RhbmRhcmRpc2UgbWluaW11bSB0b25lIGR1cmF0aW9uIHRvIDI1MG1zIGFuZCBtaW5pbXVtIGludGVyLXRvbmUKKwkgIGludGVydmFsIHRvIDEwMG1zLgorCisyMDExLTAzLTI0IDE0OjM0OjI0IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BlbnRyb3B5d2F2ZS5jb20+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmVjdHNvdW5kc2luazogQWRkIGNvbmRpdGlvbmFscyBvbiBXQVZFX0ZPUk1BVF9ET0xCWV9BQzNfU1BESUYKKworMjAxMS0wNC0xMSAyMDowOToxNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNkZWJ1Zy5jOgorCSAgY2Fwc2RlYnVnOiBmaXggdW51c2VkLWJ1dC1zZXQtdmFyaWFibGUgd2FybmluZ3Mgd2l0aCBnY2MgNC42CisKKzIwMTEtMDQtMTEgMjA6MDU6NTQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZml4IHVudXNlZC1idXQtc2V0LXZhcmlhYmxlIHdhcm5pbmcgd2l0aCBnY2MgNC42CisJICBNb3N0IGxpa2VseSBhIGxlZnRvdmVyIGZyb20gd2hlbiB0aGUgaW5kZXggcGFyc2luZyBjb2RlIHdhcyByZXdyaXR0ZW4uCisKKzIwMTEtMDQtMTEgMTk6NTQ6MDAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJICBhYzNwYXJzZTogZml4IHVudXNlZC1idXQtc2V0LXZhcmlhYmxlIHdhcm5pbmcgd2l0aCBnY2MgNC42CisKKzIwMTEtMDQtMTEgMTk6NTA6MDcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJICB2aWRlb2JhbGFuY2U6IGZpeCBoYW5kbGluZyBvZiBZVVYgaW1hZ2VzIHdpdGggJ29kZCcgd2lkdGhzCisJICBGaXhlcyB1bnVzZWQtYnV0LXNldC12YXJpYWJsZSB3YXJuaW5ncyB3aXRoIGdjYyA0LjYuCisKKzIwMTEtMDQtMTEgMTk6NDk6MjIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICB2aWRlb2ZsaXA6IGZpeCB1bnVzZWQtYnV0LXNldC12YXJpYWJsZSB3YXJuaW5ncyB3aXRoIGdjYyA0LjYKKworMjAxMS0wNC0xMyAxODoxMTozNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYzoKKwkgIGF1ZGlvd3NpbmN7YmFuZCxsaW1pdH06IEZpeCBjaGVjayBmb3IgZGl2aXNvbiBieSB6ZXJvCisKKzIwMTEtMDQtMTMgMTg6MDE6MDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5jOgorCSAgYXVkaW93c2luY2JhbmQ6IEZpeCByYW5nZSBvZiBrZXJuZWwgZWxlbWVudHMgKGxpbSAtPiBsaW0tMSkKKworMjAxMS0wNC0xMyAxODowMDo0NCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5jOgorCSAgYXVkaW93c2luY2xpbWl0OiBBZGQgc29tZSBtb3JlIGJyYWNlcyB0byBtYWtlIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUKKworMjAxMS0wNC0xMSAxODo0MDozMCAtMDUwMCAgSm9yZGkgQnVyZ3VldC1DYXN0ZWxsIDxqb3JkaS5idXJndWV0LWNhc3RlbGxAbGlnby5vcmc+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5jOgorCSAgYXVkaW93c2luY2xpbWl0OiBGaXggcmFuZ2Ugb2Yga2VybmVsIGVsZW1lbnRzIChsaW0gLT4gbGltLTEpIGluIGhpZ2gvbG93LXBhc3MgZmlsdGVycworCisyMDExLTA0LTEzIDE3OjQ5OjIyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkgIGF1ZGlvd3NpbmNiYW5kOiBBZGQgbmV3IHdpbmRvd2luZyBmdW5jdGlvbnM6IGdhdXNzaWFuLCBjb3MgYW5kIGhhbm4KKworMjAxMS0wNC0xMSAxODo0MTo0MyAtMDUwMCAgSm9yZGkgQnVyZ3VldC1DYXN0ZWxsIDxqb3JkaS5idXJndWV0LWNhc3RlbGxAbGlnby5vcmc+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5jOgorCSAgYXVkaW93c2luY2xpbWltdDogQWRkIG5ldyB3aW5kb3dzIHRvIGhpZ2gvbG93LXBhc3MgZmlsdGVyczogZ2F1c3NpYW4sIGNvc2luZSwgaGFubgorCisyMDExLTA0LTEzIDE2OjQ3OjA1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBzZXQgc3RyZWFtLWZvcm1hdD1ieXRlLXN0cmVhbSBvbiBoMjY0IGNhcHMgaWYgdGhlcmUncyBubyBjb2RlYyBkYXRhCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjA2NjYyCisKKzIwMTEtMDQtMTMgMTY6Mzc6MDcgKzAxMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogcmVzdHJpY3QgaDI2NCBzb21lIG1vcmUgdG8gb25seSBhY2NlcHQgQVUtYWxpZ25lZCBBVkMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MDY2NjIKKworMjAxMS0wNC0xMyAxNzoxMToyNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIG1wZWdhdWRpb3BhcnNlOiBUaGUgVkJSSSBoZWFkZXIgaXMgYWx3YXlzIGF0IG9mZnNldCAweDIwLCBpbmRlcGVuZGVudCBvZiBNUEVHIHZlcnNpb24KKwkgIEFsc28gY2xlYW4gdXAgYWR2YW5jaW5nIG9mIHRoZSBkYXRhIHBvaW50ZXIgYSBiaXQuCisJICBGaXhlcyBidWcgIzY0NzY1OS4KKworMjAxMS0wNC0xMyAxNToxODoxMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuYzoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYzoKKwkgIHF0bXV4OiBhZGQgdmFyaWFudC1sZXNzIHZpZGVvL3F1aWNrdGltZSB0byBzb3VyY2UgcGFkIHRlbXBsYXRlIGNhcHMKKwkgIFRoaXMgaXMgbmVlZGVkIGZvciBhdXRvbWF0aWMgdHJhbnNjb2RpbmcgdXNpbmcgZW5jb2RlYmluLiBPdXIgdHlwZWZpbmRlcgorCSAgZG9lcyBub3QgYWx3YXlzIGFkZCBhIHZhcmlhbnQgdG8gdGhlIGZvdW5kIGNhcHMsIGFuZCBlbmNvZGViaW4gbmVlZHMKKwkgIGFuICpleGFjdCogbWF0Y2ggdG8gdGhlIGNhcHMgb24gdGhlIHNvdXJjZSBwYWQgdGVtcGxhdGUsIHNvIHdlIG5lZWQKKwkgIHRvIGFkZCB0aGUgdmFyaWFudC1sZXNzIHZpZGVvL3F1aWNrdGltZSBjYXBzIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsCisJICBmb3IgZW5jb2RlYmluIHRvIGJlIGFibGUgdG8gZmluZCBpdC4gQWRkIHVuaXQgdGVzdCBmb3IgdGhpcyBhcyB3ZWxsLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0Mjg3OQorCisyMDExLTA0LTEzIDE2OjE3OjQxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogUHJvcGVybHkgaW50ZXJwcmV0ZSB0aGUgcmVzdWx0IG9mIHN0cmNtcCgpCisKKzIwMTEtMDQtMTMgMTY6MDk6MDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBEb24ndCBzdG9yZSBpbWFnZSB0YWdzIGluc2lkZSB0aGUgdm9yYmlzY29tbWVudHMgYW5kIHRoZSBmbGFjIG1ldGFkYXRhCisJICBJbnN0ZWFkIG9ubHkgc3RvcmUgdGhlbSBpbnNpZGUgdGhlIGZsYWMgbWV0YWRhdGEuIFRoZXJlJ3MKKwkgIG5vIHBvaW50IGluIHN0b3JpbmcgdGhlbSB0d2ljZSBhbmQgdGhlIGZsYWMgbWV0YWRhdGEgaXMKKwkgIHN0aWxsIHRoZSBvZmZpY2lhbCB3YXkgdG8gc3RvcmUgaW1hZ2UgdGFncyBpbnNpZGUgZmxhYy4KKworMjAxMS0wNC0xMyAxMjozODoxNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvLmdpdGlnbm9yZToKKwkgIHRlc3RzOiBpZ25vcmUgbmV3IHF0bXV4LXJlbGF0ZWQgdGVzdCBiaW5hcmllcworCisyMDExLTA0LTEzIDExOjI1OjExICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZ3N0L3F1aWNrdGltZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhwbHVnaW4uYzoKKwkqIGdzdC9xdWlja3RpbWUvcXVpY2t0aW1lLmM6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHF1aWNrdGltZTogbW92ZSBxdG11eCBwbHVnaW4gZnJvbSAtYmFkIHRvIC1nb29kCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjM2Njk5CisKKzIwMTEtMDQtMTIgMTY6NDI6MTcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgZHRtZjogUmVtb3ZlIGxlZnRvdmVyIE1BRU1PX0JST0tFTiBkZWZpbmVzCisJICBSZW1vdmUgZGVmaW5lcyB0byB3b3JrIGFyb3VuZCBidWdzIGluIG9sZCBNYWVtbyByZWxlYXNlcworCisyMDExLTA0LTA0IDEyOjIxOjIzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IG1vcmUgaGVscGZ1bCBkZWJ1ZyBlcnJvciBtZXNzYWdlIHdoZW4gbm8gbmVlZGVkIGR1cmF0aW9uIG9uIGlucHV0IGJ1ZmZlcnMKKwkgIEZpeGVzICM2NDYyNTYuCisKKzIwMTEtMDMtMjEgMTA6NTY6NTEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogQWRkaW5nIEdzdFRhZ1htcFdyaXRlciBpbnRlcmZhY2UKKwkgIEFkZHMgR3N0VGFnWG1wV3JpdGVyIGludGVyZmFjZSBzdXBwb3J0IHRvIHF0bXV4CisKKzIwMTEtMDMtMjIgMjA6NTM6MDggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogdXNlIHJ1bm5pbmcgdGltZSBmb3Igc3luY2hyb25pemF0aW9uCisJICBTZWUgYWxzbyAjNDMyNjEyLgorCisyMDExLTAzLTEwIDE2OjAzOjU4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHByb3ZpZGUgZm9yIFBUUyBtZXRhZGF0YSB3aGVuIHNvIGNvbmZpZ3VyZWQKKwkgIC4uLiBhbmQgbm90IG9ubHkgd2hlbiBzb3J0LW9mIGZlZWxpbmcgbGlrZSBpdC4KKwkgIEluIGFueSBjYXNlLCBpZiBpdCB0dXJucyBvdXQgYWxsIHJlYWxseSBpcyBpbiBvcmRlciwKKwkgIGFuZCBwcmVzdW1hYmx5IERUUyA9PSBQVFMsIHRoZW4gbm8gY3R0cyB3aWxsIGJlIHByb2R1Y2VkIGFueXdheS4KKworMjAxMS0wMy0xMCAxNjowMjo0MiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBhbHNvIHRyYWNrIG9yaWdpbmFsIFBUUyBidWZmZXIgdGltZXN0YW1wIGluIHJlb3JkZXIgZHRzLW1ldGhvZAorCisyMDExLTAyLTIxIDEyOjE0OjU5ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgUmV2ZXJ0ICJDaGVjayB0aGF0IGNvbGxlY3RwYWRzIGV4aXN0cyBiZWZvcmUgcmVtb3ZpbmcgcGFkIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCA2ZDg3NDA0NzZjY2QzYTM0OThkYzRmMThjMTk3MzM2NDM4MjVjN2I4LgorCSAgRGVwZW5kcyBvbiBhIGNvcmUgY29tbWl0IHRoYXQgd2FzIHJldmVydGVkCisKKzIwMTEtMDItMjAgMjM6NTc6MTkgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBDaGVjayB0aGF0IGNvbGxlY3RwYWRzIGV4aXN0cyBiZWZvcmUgcmVtb3ZpbmcgcGFkCisJICBUaGUgY29yZSBub3cgY2FsbHMgcmVsZWFzZSBwYWQgZnJvbSBmaW5hbGl6ZSwgYXQgd2hpY2ggcG9pbnQKKwkgIHRoZSBjb2xsZWN0cGFkcyBtaWdodCBoYXZlIGFscmVhZHkgYmVlbiBmcmVlZC4KKworMjAxMS0wMS0xMyAxMToyODozMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJICB0ZXN0OiBxdG11eDogVGVzdHMgcXRtdXggcmV1c2UKKwkgIEZvcmNlcyB0aGUgdXNlIG9mIHF0bXV4IGFmdGVyIGl0IGhhcyBiZWVuIHB1dCB0byBQTEFZSU5HIGFuZCBiYWNrCisJICB0byBOVUxMIG9uY2UKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MzkzMzgKKworMjAxMS0wMS0xMyAxNToyNzozNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBzZXQgc3JjIHBhZHMgd2hlbiBzdGFydGluZyBmaWxlCisJICAuLi4gcmF0aGVyIHRoYW4gYXQgX2luaXQgdGltZSwgc28gdGhleSBhcmUgYWxzbyBhdmFpbGFibGUgZm9sbG93aW5nIGEKKwkgIHBhZCAoZGUpYWN0aXZhdGlvbiBjeWNsZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MzkzMzgKKworMjAxMS0wMS0wMyAxNzoyNDoyMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBhZGp1c3QgbmFzdHkgY2FzZSB0aW1lc3RhbXAgdHJhY2tpbmcKKwkgIFRoYXQgaXMsIGFsbCBzb3J0cyBvZiBwcm9ibGVtcyBhcmlzZSB3aXRoIHJlLW9yZGVyZWQgaW5wdXQgdGltZXN0YW1wcyB0aGF0CisJICB0ZW5kIHRvIGRlZnkgYXV0b21hZ2ljIGhhbmRsaW5nIGZvciBldmVyeSBjYXNlLCBzbyBhbGxvdyBmb3IgYSBmZXcgdmFyaWF0aW9ucworCSAgdGhhdCBjYW4gYmUgdHJpZWQgZGVwZW5kaW5nIG9uIGNpcmN1bXN0YW5jZXMuCisJICBBbHNvIHRyeSB0byBkb2N1bWVudCBhY2NvcmRpbmdseS4KKwkgIEFsc28gZml4ZXMgIzYzODI4OC4KKworMjAxMC0xMi0zMCAyMTo0ODo0MSArMDIwMCAgRmVsaXBlIENvbnRyZXJhcyA8ZmVsaXBlLmNvbnRyZXJhc0Bub2tpYS5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBnZXQgcmlkIG9mIHRpbWVzdGFtcCBvdmVycHJvdGVjdGl2ZW5lc3MKKwkgIFNpZ25lZC1vZmYtYnk6IEZlbGlwZSBDb250cmVyYXMgPGZlbGlwZS5jb250cmVyYXNAbm9raWEuY29tPgorCisyMDExLTAxLTAzIDE2OjU2OjU3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSogZ3N0L3F1aWNrdGltZS9hdG9tc3JlY292ZXJ5LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogc2ltcGxpZnkgYW5kIGZpeCBwdHNfb2Zmc2V0IHN0b3JpbmcKKwkgIEluIHBhcnRpY3VsYXIsIG9ubHkgd3JpdGUgYSBjdHRzIGF0b20gaWYgYW5kIG9ubHkgaWYgZXZlciBhIG5vbi16ZXJvIG9mZnNldC4KKworMjAxMS0wMS0wMyAxMDo0MzoxNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBhZGQgc29tZSBtb3JlIGRvY3VtZW50YXRpb24KKworMjAxMC0xMi0wMyAxNToyMzowMCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiByZW1vdmUgbGFyZ2UtZmlsZSBwcm9wZXJ0eQorCSAgUmF0aGVyLCBhdXRvLWRldGVybWluZSBpZiA2NC1iaXRzIGZpZWxkcyBhcmUgbmVlZGVkIGZvciBhIHZhbGlkIHJlc3VsdCwgYW5kCisJICBzdGljayB0byBwbGFpbiAzMi1iaXRzIGlmIG5vdCBuZWVkZWQuCisJICBBUEk6IEdzdFFUTXV4OmxhcmdlLWZpbGUgKHJlbW92ZWQpCisKKzIwMTAtMTItMTkgMTI6NTM6MzQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogRnJlZSBBdG9tSW5mbyBzdHJ1Y3RzCisKKzIwMTAtMTItMTkgMTI6NTA6MzAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogRnJlZSB0YWcgc3RyaW5nIGFmdGVyIHVzZQorCisyMDEwLTEyLTE5IDEyOjEyOjI1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jOgorCSAgdGFnc2NoZWNraW5nOiBGaXggc29tZSBtb3JlIG1lbW9yeSBsZWFrcworCisyMDEwLTEyLTE3IDE5OjQxOjI1ICswMjAwICBMYXNzZSBMYXVra2FuZW4gPGxhc3NlLmxhdWtrYW5lbkBkaWdpYS5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBhbGxvdyB6ZXJvIGR1cmF0aW9uIHRyYWNrcworCisyMDEwLTEyLTAzIDE4OjA5OjQxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGFkZCBkb2N1bWVudGF0aW9uCisKKzIwMTAtMTItMDEgMTA6NDU6NDkgKzAxMDAgIERhdmlkIEhveXQgPGRob3l0QGxsbmwuZ292PgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogaGFuZGxlIG1zdmMgZnRydW5jYXRlIGluY29tcGF0aWJpbGl0eQorCSAgRml4ZXMgIzYzNjE4NS4KKworMjAxMC0xMS0yNyAxNjowNzoxOSAtMDYwMCAgQWxlamFuZHJvIEdvbnphbGV6IDxhZ29uemFsZXpAZGV4dHJhdGVjaC5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBnc3RfcXRtdXhfY2hlY2tfZGlmZmVyZW5jZSB2ZXJpZnkgYmVmb3JlIHN1YnRyYWN0CisJICBBdm9pZCBuZWdhdGl2ZSBvdmVyZmxvdyBieSBjaGVja2luZyB0aGUgb3JkZXIgb2Ygb3BlcmFuZHMKKwkgIG9uIHN1YnRyYWN0aW9uIG9mIHVuc2lnbmVkIGludGVnZXJzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzNTg3OAorCisyMDEwLTExLTE5IDE3OjU1OjM2ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHJlbW92ZSByZW1uYW50IG9mIG9ic29sZXRlIHByb3BlcnR5CisKKzIwMTAtMTEtMTkgMTU6MTg6NTggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgdGVzdHM6IHF0bXV4OiBhbHNvIHVuaXQgdGVzdCBmcmFnbWVudGVkIGZpbGUgY2FzZXMKKworMjAxMC0wNy0zMCAxMjo0ODoyOSArMDIwMCAgTWFyYy1BbmRyw6kgTHVyZWF1IDxtbHVyZWF1QGZsdW1vdGlvbi5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBhbGxvdyBzcGVjaWZ5aW5nIHRyYWsgdGltZXNjYWxlCisJICBUaGlzIGlzIG1haW5seSBiZWNhdXNlIFNtb290aHN0cmVhbWluZyBjbGllbnQgYXJlIGJyb2tlbiBhbmQgZG9uJ3QKKwkgIHRha2UgdGhlIFRpbWVTY2FsZSBwcm9wZXJ0eSBpbnRvIGFjY291bnQuCisKKzIwMTAtMTEtMTkgMTc6NDE6NDEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogaW5jbHVkZSBzZHRwIGF0b21zIGZvciBpc212IGZyYWdtZW50ZWQgZmlsZXMKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5IE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisyMDEwLTExLTE5IDE5OjE3OjQ1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGVuYWJsZSBkZWZhdWx0IGZyYWdtZW50ZWQgZmlsZSBmb3IgaXNtbG11eAorCisyMDEwLTA5LTAyIDEzOjU4OjA1ICswMjAwICBNYXJjLUFuZHLDqSBMdXJlYXUgPG1sdXJlYXVAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSogZ3N0L3F1aWNrdGltZS9mdHlwY2MuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuaDoKKwkgIHF0bXV4OiBhZGQgaXNtbG11eCwgZm9yIGZyYWdtZW50ZWQgaXNtbCBtYWpvciBicmFuZAorCisyMDEwLTExLTE5IDE0OjQ0OjQ1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGZpbmFsaXplIHNpbmtwYWRzIGxpc3QKKworMjAxMC0wNy0yMiAxOTo0MDowNyArMDIwMCAgTWFyYy1BbmRyw6kgTHVyZWF1IDxtbHVyZWF1QGZsdW1vdGlvbi5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBhZGQgbW9vdiBpbiBzdHJlYW1oZWFkZXIKKworMjAxMC0wOC0wNiAxMzoyNjoyNyArMDIwMCAgTWFyYy1BbmRyw6kgTHVyZWF1IDxtbHVyZWF1QGZsdW1vdGlvbi5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBhZGQgc3RyZWFtYWJsZSBwcm9wZXJ0eSB0byBhdm9pZCBidWlsZGluZyBmcmFnbWVudGVkIG1mcmEgaW5kZXgKKworMjAxMC0xMS0xOCAxNjo0ODowNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBhZGQgbWZyYSB0byBmcmFnbWVudGVkIGZpbGUKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5IE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisyMDEwLTExLTE1IDE1OjE3OjU5ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5oOgorCSAgcXRtdXg6IG9wdGlvbmFsbHkgY3JlYXRlIGZyYWdtZW50ZWQgZmlsZQorCSAgSW4gdGhpcyBtb2RlLCBhbiBpbml0aWFsIGVtcHR5IG1vb3YgKGNvbnRhaW5pbmcgb25seSBzdHJlYW0gbWV0YWRhdGEpIGlzIHdyaXR0ZW4sCisJICBmb2xsb3dlZCBieSBmcmFnbWVudHMgY29udGFpbmluZyBhY3R1YWwgZGF0YSAoYWxvbmcgd2l0aCByZXF1aXJlZCBtZXRhZGF0YSkuCisJICBOZXcgZnJhZ21lbnRzIGFyZSBzdGFydGVkIGVpdGhlciBhdCBrZXlmcmFtZSAoaWYgc3VjaCBhcmUgc3BhcnNlKSBvciB3aGVuCisJICBwcm9wZXJ0eSBjb25maWd1cmVkIGR1cmF0aW9uIGV4Y2VlZGVkLgorCSAgQmFzZWQgb24gcGF0Y2ggYnkgTWFyYy1BbmRyw6kgTHVyZWF1IDxtbHVyZWF1QGZsdW1vdGlvbi5jb20+CisJICBGaXhlcyAjNjMyOTExLgorCisyMDEwLTExLTE1IDE1OjEyOjQ1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgcXRtdXg6IHVzZSBoZWxwZXIgdG8gc2V0IGF0b20gZmxhZ3MgZnJvbSBnaXZlbiB1aW50CisKKzIwMTAtMTEtMDkgMTY6NDk6MDcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogcmVmYWN0b3IgY29uZmlndXJpbmcgYW5kIHNlbmRpbmcgb2YgbW9vdgorCSAgQmFzZWQgb24gcGF0Y2ggYnkgTWFyYy1BbmRyw6kgTHVyZWF1IDxtbHVyZWF1QGZsdW1vdGlvbi5jb20+CisKKzIwMTAtMTEtMDkgMTU6NTQ6NDQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogcmVmYWN0b3IgZXh0cmEgdG9wLWxldmVsIGF0b20gaGFuZGxpbmcKKwkgIEFsc28gY2hlY2sgYSBiaXQgbW9yZSBmb3IgcG9zc2libGUgZXJyb3JzLCBhbmQgZnJlZSBwcm9wZXIgaXRlbXMgaW4gc3VjaCBjYXNlLgorCisyMDEwLTExLTA5IDE1OjAxOjE1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHJlZmFjdG9yIHNsaWdodGx5IHVzaW5nIGJ1ZmZlciBoZWxwZXIKKworMjAxMC0xMS0wNSAxMzo0ODo1NyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBmaXggbWlzaW5mb3JtaW5nIGNvbW1lbnQKKworMjAxMC0xMS0wNSAxMjowODoxNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBkZWxlZ2F0ZSBtdmV4IGhhbmRsaW5nIHRvIGF0b21zCisJICAuLi4gd2hpY2gga2VlcHMgcXRtdXggc2ltcGxlci4KKworMjAwOS0wOS0yOCAxNjoxMTozNSArMDIwMCAgTWFyYy1BbmRyw6kgTHVyZWF1IDxtbHVyZWF1QGZsdW1vdGlvbi5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBhZGQgbXZleC90cmV4IGluIGhlYWRlciBpZiBmcmFnbWVudGVkCisJICBPbmUgInRyZXgiIGlzIGFkZGVkIHBlciAidHJhayIuIFdlIGRvbid0IHN1cHBvcnQgZGVmYXVsdCB2YWx1ZXMsCisJICBidXQgdGhlICJ0cmV4IiBib3ggaXMgbWFuZGF0b3J5LgorCisyMDA5LTA5LTI4IDEzOjAxOjMwICswMjAwICBNYXJjLUFuZHLDqSBMdXJlYXUgPG1sdXJlYXVAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkgIHF0bXV4OiBhZGQgYSBjb3VwbGUgb2YgZm91cmNjIGZvciBmcmFnbWVudGVkIG1wNAorCisyMDEwLTExLTA1IDExOjA4OjAxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGF2b2lkIHJlbW92aW5nIHRlbXAgZmlsZSB3aGVuIGVycm9yIG9jY3VycmVkCisKKzIwMDktMDktMzAgMTc6MTY6MzAgKzAyMDAgIE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogdHJ1bmNhdGUgYnVmZmVyIGZpbGUgYWZ0ZXIgZWFjaCBzZW5kCisKKzIwMDktMDktMjggMTY6NTM6NTEgKzAyMDAgIE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogcmVtb3ZlIHRlbXAgZmlsZSB3aGVuIHJlc2V0L2ZpbmFsaXplCisKKzIwMTAtMTAtMTkgMTM6NDM6MTQgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG1vb3ZyZWNvdmVyLmM6CisJICB2YXJpb3VzIChnc3QpOiBhZGQgbWlzc2luZyBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIGZsYWdzCisJICBDYW5vbmljYWxpemUgcHJvcGVydHkgbmFtZXMgYXMgbmVlZGVkLgorCisyMDEwLTEwLTEzIDE3OjQ3OjI5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHByZXZlbnQgaW5maW5pdGUgbG9vcCB3aGVuIGFkanVzdGluZyBmcmFtZXJhdGUKKwkgIEZpeGVzICM2MzIwNzAuCisKKzIwMTAtMTAtMDMgMjM6NDU6NDYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogQWRkIEdfUEFSQU1fU1RBVElDX1NUUklOR1MKKwkgIEFkZCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHRvIHF0bXV4IHByb3BlcnRpZXMKKworMjAxMC0wOS0xNSAxNzo1NDo0OSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkqIGdzdC9xdWlja3RpbWUvZm91cmNjLmg6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4Lmg6CisJICBxdG11eDogRm9sbG93IHhtcCBzZXJpYWxpemF0aW9uIGd1aWRlbGluZXMgY2xvc2VyCisJICBxdCBhbmQgaXNvbSB2YXJpYW50cyBoYXZlIGRpZmZlcmVudCB3YXlzIG9mIHNlcmlhbGl6aW5nCisJICB4bXAsIGZvbGxvdyB0aGVzZSBndWlkZWxpbmVzLgorCSAgVGhvc2UgY2FuIGJlIGZvdW5kIGluIEFkb2JlJ3MgeG1wIGRvY3MuCisKKzIwMTAtMDgtMTYgMTI6MzY6MjQgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogYXV0b2RldGVjdCBvdXQtb2Ytb3JkZXIgaW5wdXQgdGltZXN0YW1wcyBhbmQgZGV0ZXJtaW5lIERUUyBhY2NvcmRpbmdseQorCSAgRmF2b3VyIHVzaW5nIGlucHV0IGJ1ZmZlciB0aW1lc3RhbXBzIGZvciBEVFMsIGJ1dCBmYWxsYmFjayB0byB1c2luZyBidWZmZXIKKwkgIGR1cmF0aW9uIChhY2N1bXVsYXRpb24pIGlmIGlucHV0IHRzIGRldGVjdGVkIG91dC1vZi1vcmRlci4KKwkgIEZpeGVzICM2MjQyMTIuCisKKzIwMTAtMDctMjggMTY6MTU6NTMgKzAyMDAgIE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogdXNlIGNhcHMgYml0cmF0ZSBhdCBsYXN0IGNoYW5jZQorCSAgSWYgd2UgZGlkbid0IGdldCB0aGUgc3RyZWFtJ3MgYml0cmF0ZSBmcm9tIG9uZSBvZiB0aGUgYXRvbXMsCisJICB0cnkgZ2V0dGluZyBpdCBmcm9tIHRoZSBjYXBzIGFzIGEgbGFzdCByZXNvcnQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjI1NDk2CisKKzIwMTAtMDctMjggMTY6MTI6MTEgKzAyMDAgIE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJICBxdG11eDogYnRydCAtIG1heCBiaXRyYXRlIGJlZm9yZSBhdmVyYWdlCisJICBBY2NvcmRpbmcgdG8gaXNvIGJhc2UgbWVkaWEgZmlsZSBmb3JtYXQsIHRoZSBtYXggYml0cmF0ZQorCSAgaXMgYmVmb3JlIHRoZSBhdmcKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MjU0OTYKKworMjAxMC0wNy0wNiAxNDo0ODowOCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBXcml0ZSAnYnRydCcgYXRvbSBmb3IgSC4yNjQgbWVkaWEgaWYgcG9zc2libGUKKwkgIFRoaXMgd3JpdGVzIG91dCB0aGUgb3B0aW9uYWwgJ2J0cnQnIGF0b20gKE1QRUc0Qml0cmF0ZUJveCkgZm9yIEguMjY0CisJICBtZWRpYSBpZiBlaXRoZXIgb3IgYm90aCBvZiBhdmVyYWdlIGFuZCBtYXhpbXVtIGJpdHJhdGUgYXJlIGF2YWlsYWJsZSBmb3IKKwkgIHRoZSBzdHJlYW0uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjIzNjc4CisKKzIwMTAtMDctMDUgMTQ6MDk6NTAgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4Lmg6CisJICBxdG11eDogV3JpdGUgYXZnL21heCBiaXRyYXRlIHRvIEVTRFMgaWYgYXZhaWxhYmxlCisJICBUaGlzIGNvbGxlY3RzIHRoZSAnYml0cmF0ZScgYW5kICdtYXhpbXVtLWJpdHJhdGUnIHRhZ3Mgb24gdGhlCisJICBjb3JyZXNwb25kaW5nIHBhZCBhbmQgdXNlcyB0aGVzZSB0byBwb3B1bGF0ZSB0aGVzZSBmaWVsZHMgaW4gdGhlIEVTRFMKKwkgIHdoZXJlIGFwcGxpY2FibGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjIzNjc4CisKKzIwMTAtMDctMDIgMTI6NDU6MjAgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBEb24ndCB1c2UgYm9ndXMgY29kZWMvZm9ybWF0IHRhZ3MKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MjMzNjUKKworMjAxMC0wNi0yNSAyMDoxOToyMCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBXcml0ZSB1aW50IHRhZ3MgdGhhdCBkb24ndCBoYXZlIGEgY29tcGxlbWVudAorCSAgV3JpdGUgdWludCB0YWdzIHRoYXQgaGF2ZSBjb21wbGVtZW50cyAoZS5nLiB0cmFjay1udW1iZXIvCisJICB0cmFjay1jb3VudCkgZXZlbiB3aGVuIHdlIG9ubHkgaGF2ZSBvbmUgb2YgdGhlbSBhdmFpbGFibGUKKwkgIGFuZCBzZXQgdGhlIG90aGVyIG9uZSB0byAwLgorCSAgRml4ZXMgIzYyMjQ4NAorCisyMDEwLTA2LTIxIDE5OjM5OjU0ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogUmVtb3ZlIHRoZSBwYWQgZnJvbSBvdXIgaW50ZXJuYWwgbGlzdCBiZWZvcmUgY2FsbGluZyBjb2xsZWN0cGFkcworCSAgUHJldmlvdXNseSB3ZSB3b3VsZCBlbmQgdXAgd2l0aCB0aGUgY29sbGVjdHBhZGRhdGEgc3RydWN0dXJlIGFscmVhZHkgZnJlZWQuCisJICBUaGlzIHdvdWxkIHJlc3VsdCBpbiBhIGJvZ3VzIGl0ZXJhdGlvbiBvZiBtdXgtPnNpbmtwYWRzIChhbGwgdGhlCisJICBHc3RRVFBhZCBiZWluZyBmcmVlZCkgYW5kIGl0IHdvdWxkbid0IGJlIHJlbW92ZWQgZnJvbSB0aGF0IGxpc3QuCisJICBGaW5hbGx5LCBkdWUgdG8gaXQgbm90IGJlaW5nIHJlbW92ZWQgZnJvbSB0aGF0IGxpc3QsIHdlIHdvdWxkIGVuZCB1cAorCSAgY2FsbGluZyBhIGJvZ3VzIGdzdF9xdF9tdXhfcGFkX3Jlc2V0IG9uIHRob3NlIHN0cnVjdHVyZXMgPT4gU0VHRkFVTFQKKworMjAxMC0wNS0xMiAxODo1MDozNCAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9xdWlja3RpbWUvZm91cmNjLmg6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogQWRkIFZQOAorCisyMDEwLTA1LTExIDEzOjE1OjM3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jOgorCSAgdGVzdHM6IGRvbid0IGZhaWwgdGFnc2NoZWNraW5nIHRlc3QgaWYgcXRkZW11eCBpcyBub3QgYXZhaWxhYmxlIG9yIHRvbyBvbGQKKworMjAxMC0wMy0yNyAwOTo0NjozMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhwbHVnaW4uYzoKKwkgIHF0bXV4OiB1c2UgR1N0cmVhbWVyIHBhY2thZ2UgbmFtZSBhbmQgb3JpZ2luIGluIHRoZSBwbHVnaW4gaW5mbworCisyMDEwLTAzLTIzIDE3OjM0OjMwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jOgorCSAgdGVzdHM6IHRhZ3NjaGVja2luZzogTmV3IHRhZ3MgdGVzdHMKKwkgIEFkZHMgbmV3IHRhZ3MgY2hlY2tpbmcgdGVzdHMuCisKKzIwMTAtMDMtMjUgMDA6MjA6NTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogaW5pdCBkZWJ1ZyBjYXRlZ29yeSBiZWZvcmUgdXNpbmcgaXQKKworMjAxMC0wMy0yMiAxNjo1NjowMyArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJICBBZGQgLVdvbGQtc3R5bGUtZGVmaW5pdGlvbgorCSAgYW5kIGZpeCB0aGUgd2FybmluZ3MKKworMjAxMC0wMy0yMiAxMzoxNjozMyArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmg6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jOgorCSAgQWRkIC1Xd3JpdGUtc3RyaW5ncworCSAgYW5kIGZpeCBpdHMgd2FybmluZ3MKKworMjAxMC0wMy0yMSAyMTozOToxOCArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zcmVjb3ZlcnkuYzoKKwkqIGdzdC9xdWlja3RpbWUvZGVzY3JpcHRvcnMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvdGFnc2NoZWNraW5nLmM6CisJICBBZGQgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV21pc3NpbmctcHJvdG90eXBlcyB0byBjb25maWd1cmUgZmxhZ3MKKwkgIEFuZCBmaXggYWxsIHdhcm5pbmdzCisKKzIwMTAtMDMtMTggMTc6MzA6MjYgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG1vb3ZyZWNvdmVyLmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlscyA9PiBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUKKworMjAxMC0wMy0xMiAxMToyODo1MSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy90YWdzY2hlY2tpbmcuYzoKKwkgIHRlc3RzOiB0YWdzY2hlY2tpbmc6IEltcHJvdmVtZW50cyBhbmQgbmV3IGdlby1sb2NhdGlvbiB0ZXN0cworCSAgTWFrZXMgc29tZSBpbXByb3ZlbWVudHMgdG8gdGFnc2NoZWNraW5nLmMsIG1ha2luZyBpdCB1c2UKKwkgIGZha2VzcmMgaW5zdGVhZCBvZiB2aWRlb3Rlc3RzcmMgYW5kIGFsbG93aW5nIHRvIHNldCBpbnB1dAorCSAgY2FwcyBzbyB0aGF0IG1vcmUgbXV4ZXJzIGNhbiBiZSB1c2VkLiBQcmV2aW91c2x5IHdlIGNvdWxkCisJICBvbmx5IHVzZSB0aG9zZSB0aGF0IGFjY2VwdGVkIHJhdyB2aWRlbyBjYXBzLgorCSAgQWxzbyBhZGRzIHNvbWUgdGVzdHMgZm9yIGdlby1sb2NhdGlvbiB0YWdzCisKKzIwMTAtMDMtMTIgMTA6NTM6MzYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogVXNlIHhtcCBvbiBtcDRtdXggYW5kIGdwcG11eCB0b28KKwkgIERvIG5vdCByZXN0cmljdCB4bXAgdG8gcXRtdXgsIGJ1dCB1c2UgaXQgdG9vCisJICBvbiBtcDRtdXggYW5kIGdwcG11eAorCisyMDEwLTAzLTA1IDEzOjMzOjM3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jOgorCSAgY2hlY2s6IHRhZ3NjaGVja2luZzogdGVzdHMgZm9yIHRhZ3Mgc2VyaWFsaXphdGlvbiBpbiBtdXhlcnMKKwkgIEFkZHMgYSBjaGVjayB1bml0IHRlc3QgdGhhdCBhaW1zIHRvIHRlc3QgdGFncyBzZXJpYWxpemF0aW9uCisJICBhbmQgZGVzZXJpYWxpemF0aW9uIGNvbnNpc3RlbmN5IChpbiBtdXhlcnMpLiBJdCBwcm92aWRlcyBhCisJICBiYXNpYyBmdW5jdGlvbiB0aGF0IGFsbG93cyBvbmUgdG8gZWFzaWx5IHNwZWNpZnkgdGFncywgYQorCSAgbXV4ZXIgYW5kIGEgZGVtdXhlciBhbmQgYSB0ZXN0IHdpbGwgYmUgZG9uZSB0byBjaGVjayBpZgorCSAgdGhlIHRhZ3MgaGF2ZSBiZWVuIGNvbnNpc3RlbnRseSBtdXhlZCBhbmQgZGVtdXhlZAorCisyMDEwLTAyLTIyIDE2OjQ1OjM0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBhZGQgeG1wIHN1cHBvcnQKKwkgIEFkZHMgeG1wIG1ldGF0YWdzIGFkZGluZyB0byBxdG11eC4KKwkgIEZpeGVzICM2MDk1MzkKKworMjAxMC0wMy0xMSAxNzoxNzoxNSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtb292cmVjb3Zlci5jOgorCSAgcXRtdXg6IGZpeCBHU1RfRUxFTUVOVF9FUlJPUiB1c2FnZQorCSAgV2UgbmVlZCB0byBwYXNzIChOVUxMKSByYXRoZXIgdGhhbiBOVUxMIGZvciBlbXB0eSBhcmd1bWVudHMuCisKKzIwMTAtMDMtMTAgMTA6MjM6MjMgLTA2MDAgIFJvYiBDbGFyayA8cm9iQHRpLmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG1vb3ZyZWNvdmVyLmM6CisJICBxdG11eDogZml4IGNvbXBpbGUgZXJyb3IKKwkgIGdzdC9xdWlja3RpbWUvZ3N0cXRtb292cmVjb3Zlci5jOjI2ODogd2FybmluZzogZm9ybWF0IG5vdCBhIHN0cmluZyBsaXRlcmFsIGFuZCBubyBmb3JtYXQgYXJndW1lbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjEyNDU0CisKKzIwMTAtMDItMjIgMTk6Mzg6MTUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogUmVuYW1lICdhdmMtc2FtcGxlJyB0byAnYXZjJyBpbiBjYXBzCisJICBGaXhlcyAjNjA2NjYyCisKKzIwMTAtMDItMjYgMTE6NTA6MjUgLTA4MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEBzb25nYmlyZG5lc3QuY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogVGFrZSBsb2NrIGFyb3VuZCB1c2Ugb2YgKG5vbi10aHJlYWRzYWZlKSB0YWdzZXR0ZXIgaW50ZXJmYWNlLgorCisyMDEwLTAyLTIyIDE2OjUxOjAwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgcXRtdXg6IHdyaXRlIGFsbCB1ZHRhIGNoaWxkcmVuIGF0b21zCisJICBVRFRBIG1pZ2h0IGhhdmUgTUVUQSBhbmQgb3RoZXIgY2hpbGRyZW4gYXRvbXMKKwkgIHRvZ2V0aGVyLCB3cml0ZSB0aGVtIGFsbC4KKworMjAxMC0wMi0yMiAxMDo0ODoxMSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBVc2UgaW50ZXJuYWwgc2luayBwYWRzIGxpc3QKKwkgIER1ZSB0byBHc3RDb2xsZWN0UGFkcyBzaW5rIHBhZHMgbGlzdCBiZWluZyBub3QgcmVsaWFibHkKKwkgIGl0ZXJhdGFibGUgKHdoZW4gbm90IGluc2lkZSB0aGUgY29sbGVjdGVkIGZ1bmN0aW9uKSB0aGlzCisJICBwYXRjaCBhZGRzIGEgc2luayBwYWRzIGxpc3QgdG8gcXRtdXggdG8gYmUgdXNlZCB3aGVuIGl0ZXJhdGluZworCSAgc2luayBwYWRzIG9uIHJlc2V0IGZ1bmN0aW9uLgorCSAgRml4ZXMgIzYwOTA1NQorCisyMDEwLTAyLTE2IDE3OjEzOjA5ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgcXRtdXg6IHByZXZlbnQgbGVha2luZyBoZGxyIG5hbWUKKworMjAxMC0wMi0xNiAxNjoyNDoxMiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuYzoKKwkgIHF0bXV4OiBzdXBwb3J0IGZvciBBTEFDCisJICBGaXhlcyAjNTgwNzMxLgorCisyMDEwLTAyLTE2IDE0OjE5OjA0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgcXRtdXg6IHJlZmFjdG9yIGJ1aWxkaW5nIHN0c2QgZW50cnkgJ3dhdmUnIGV4dGVuc2lvbgorCisyMDEwLTAyLTA4IDExOjUxOjUyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tc3JlY292ZXJ5LmM6CisJICBxdG11eDogYXRvbXNyZWNvdmVyeTogRml4IGNvbXBpbGF0aW9uIHByb2JsZW0KKwkgIEZpeGVzIGEgY29tcGlsYXRpb24gZXJyb3IgZHVlIHRvIHVudXNlZCBmdW5jdGlvbiByZXN1bHQuCisKKzIwMDktMTItMTIgMTY6MDc6MTUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zcmVjb3ZlcnkuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXNyZWNvdmVyeS5oOgorCSogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtb292cmVjb3Zlci5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG1vb3ZyZWNvdmVyLmg6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4Lmg6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4cGx1Z2luLmM6CisJICBxdG11eDogQWRkcyBtb292IHJlY292ZXJ5IGZlYXR1cmUKKwkgIEFkZHMgYSBuZXcgcHJvcGVydHkgdG8gcXRtdXggdGhhdCBzZXRzIGEgcGF0aCB0byBhIGZpbGUgdG8gd3JpdGUKKwkgIGFuZCB1cGRhdGUgZGF0YSBhYm91dCB0aGUgbW9vdiBhdG9tICh0aGF0IGlzIG5vdCB3cml0ZW4gdGlsbCB0aGUKKwkgIGVuZCBvZiB0aGUgZmlsZSkuIElmIHRoZSBwaXBlbGluZS9hcHAgY3Jhc2hlcyBkdXJpbmcgZXhlY3V0aW9uIGl0CisJICBtaWdodCBiZSBwb3NzaWJsZSB0byByZWNvdmVyIHRoZSBtb3ZpZSB1c2luZyB0aGUgcXRtb292cmVjb3ZlciBlbGVtZW50LgorCSAgcXRtb292cmVjb3ZlciBpcyBhbiBlbGVtZW50IHRoYXQgaXMgYWxzbyBhIHBpcGVsaW5lLiBJdCBpcyBub3QKKwkgIG1lYW50IHRvIGJlIHVzZWQgd2l0aCBvdGhlciBlbGVtZW50cyAoaXQgaGFzIG5vIHBhZHMpLiBJdCBpcyBtZXJlbHkKKwkgIGEgdG9vbC91dGlsaXRhcnkgdG8gcmVjb3ZlciB1bmZpbmlzaGVkIHF0bXV4IGZpbGVzLgorCSAgRml4ZXMgIzYwMTU3NgorCisyMDEwLTAxLTI3IDE5OjA2OjUzIC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgcXRtdXg6IGZvciBmaXhlZC1zYW1wbGUgc2l6ZSBzdHJlYW1zIChQQ00gYXVkaW8sIGV0YykgZG9uJ3QgYWxsb2NhdGUgYW4gZW5vcm1vdXMgYnVmZmVyIHRoYXQgd2UgdGhlbiB3b24ndCB1c2UgYXQgYWxsLgorCisyMDEwLTAxLTI3IDE1OjM3OjM3IC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGhhbmRsZSBtdXhpbmcgYWRwY20gY29ycmVjdGx5LgorCisyMDEwLTAxLTIyIDEzOjM2OjA0IC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgcXRtdXg6IFNldCB0aGUgbWRpYSBoZGxyIG5hbWUgZmllbGQgdG8gd2hhdCBxdWlja3RpbWUgdXNlcy4gRml4IHdyaXRpbmcgaXQgc2luY2UgaXQncyBub3QgbnVsbC10ZXJtaW5hdGVkLiBJbXByb3ZlcyBjb21wYXRpYmlsaXR5IHdpdGggc29tZSBoYXJkd2FyZSBwbGF5ZXJzLgorCisyMDEwLTAxLTIyIDEzOjMwOjA3IC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGVuZGlhbm5lc3MgaW4gZ3N0cmVhbWVyIGlzIGFuIGludCwgbm90IGJvb2xlYW4uCisKKzIwMTAtMDEtMjYgMTc6NTQ6MjggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJICBxdG11eDogc3RyZWFtbGluZSBtb292IGRhdGEgbWVtb3J5IHN0b3JhZ2UKKwkgIEluIHBhcnRpY3VsYXIsIHVzZSBhcnJheXMgcmF0aGVyIHRoYW4gKGRvdWJsZSkgbGlua2VkIGxpc3RzLgorCisyMDEwLTAxLTI2IDEzOjQ0OjA0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGdfZnJlZSBpcyBOVUxMIHNhZmUKKworMjAxMC0wMS0yMCAxMzozMDo0OCArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2Rlc2NyaXB0b3JzLmM6CisJKiBnc3QvcXVpY2t0aW1lL2Rlc2NyaXB0b3JzLmg6CisJKiBnc3QvcXVpY2t0aW1lL3Byb3BlcnRpZXMuYzoKKwkgIFtjbGVhbnVwXSBWYXJpb3VzIHN0eWxlIGFuZCBjbGVhbnVwcworCSAgVmFyaW91cyBmaXhlcyBmb3IgZ3RrLWRvYyB3YXJuaW5ncyBhbmQgbWFraW5nIGZ1bmN0aW9ucyB3aXRob3V0CisJICBhcmd1bWVudHMgdGFrZSB2b2lkIGFzIHBhcmFtZXRlci4KKworMjAxMC0wMS0xNCAwODowOTowMyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBBY3R1YWxseSB1c2UgbmV3IGNhcHMgaW5mbyBvbiByZW5lZ290aWF0aW9uCisJICBGb2xsb3dpbmcgdGhlIHByZXZpb3VzIHF0bXV4IGNvbW1pdCwgdGhpcyBwYXRjaCB0cmllcworCSAgdG8gdXNlIHRoZSBuZXcgaW5mbyBhZGRlZCB0byB0aGUgY2FwcyB0byBmaWxsIHRoZSAndHJhaycKKwkgIGF0b20ncyBmaWVsZHMgYW5kIGNoaWxkcmVuIGF0b21zLiBUaGlzIHdheSBxdG11eCB3aWxsCisJICB1c2UgdGhlIGxhdGUgYWRkZWQgJ2NvZGVjX2RhdGEnIHdoZW4gaDI2NHBhcnNlIGFkZHMKKwkgIGl0IGluIHRoZSBmb2xsb3dpbmcgcGlwZWxpbmU6CisJICB2aWRlb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MjAwICEgeDI2NGVuYyBieXRlLXN0cmVhbT10cnVlICEgXAorCSAgaDI2NHBhcnNlIG91dHB1dC1mb3JtYXQ9MCAhIHF0bXV4ICEgXAorCSAgZmlsZXNpbmsgbG9jYXRpb249dGVzdC5tb3YKKworMjAxMC0wMS0xMyAyMzozMzo1MSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBEbyBjYXBzIHJlbmVnb3RpYXRpb24gd2hlbiBpdCBvbmx5IGFkZHMgZmllbGRzCisJICBRdG11eCBjYW4gYWNjZXB0IGNhcHMgcmVuZWdvdGlhdGlvbiBpZiB0aGUgbmV3IGNhcHMgaXMgYQorCSAgc3VwZXJzZXQgb2YgdGhlIG9sZCBvbmUsIG1lYW5pbmcgdXBzdHJlYW0gYWRkZWQgbmV3IGluZm8gdG8KKwkgIHRoZSBjYXBzLiBUaGlzIHBhdGNoIHN0aWxsIGRvZXNuJ3QgbWFrZSBxdG11eCB1cGRhdGUgYW55CisJICBhdG9tcyBpbmZvIGZyb20gdGhlIG5ldyBpbmZvLCBidXQgYXQgbGVhc3QgaXQgZG9lc24ndAorCSAgcmVqZWN0IHRoZSBuZXcgY2FwcyBhbnltb3JlLgorCSAgQSBwaXBlbGluZSB0aGF0IHJlcHJvZHVjZXMgdGhpcyB1c2UgY2FzZSBpczoKKwkgIHZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0yMDAgISB4MjY0ZW5jIGJ5dGUtc3RyZWFtPXRydWUgISBcCisJICBoMjY0cGFyc2Ugb3V0cHV0LWZvcm1hdD0wICEgcXRtdXggISBcCisJICBmaWxlc2luayBsb2NhdGlvbj10ZXN0Lm1vdgorCisyMDEwLTAxLTEzIDE5OjMwOjQ1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHByb3ZpZGUgcmVxdWVzdCBwYWRzIHVuZGVyIHdpZGVyIGNvbmRpdGlvbnMKKwkgIEZpeGVzICM2MDY4NTkuCisKKzIwMTAtMDEtMTMgMTA6MzU6MDAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogT25seSBhY2NlcHQgYXZjLXNhbXBsZSBoMjY0CisJICBxdG11eCBhbmQgbXA0bXV4IHNob3VsZCBvbmx5IGFjY2VwdCBoMjY0IGluIGF2Yy1zYW1wbGUKKwkgIGZvcm1hdAorCisyMDEwLTAxLTExIDEzOjEzOjQxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eG1hcC5jOgorCSAgUmVuYW1lIGFhYydzIHN0cmVhbS1mb3JtYXQgJ25vbmUnIHRvICdyYXcnCisJICBSZW5hbWVzIGFhYydzIHN0cmVhbS1mb3JtYXQgZnJvbSBwcmV2aW91cyBjb21taXRzIGZyb20gbm9uZSB0bworCSAgcmF3CisKKzIwMTAtMDEtMTEgMTA6MzQ6MzIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJICBxdG11eDogT25seSBhY2NlcHQgc3RyZWFtLWZvcm1hdD0nbm9uZScgYWFjCisJICBPbmx5IGFjY2VwdCByYXcgYWFjIHN0cmVhbXMgKHN0cmVhbS1mb3JtYXQ9bm9uZSkgdG8gYXZvaWQKKwkgIGdlbmVyYXRpbmcgaW52YWxpZCBmaWxlcy4KKwkgIEZpeGVzICM2MDQ5MjUKKworMjAwOS0xMi0yOCAxMTozNDozNSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4Lmg6CisJICBxdG11eDogYWxzbyBhZGQgLmggZmlsZSBjaGFuZ2VzIHRvIHVuYnJlYWsgdGhlIGJ1aWxkCisKKzIwMDktMTItMjcgMjM6NTE6NTAgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHVzZSBjb3JyZWN0IG5hbWVzIGZyb20gdGVtcGxhdGUgZm9yIHJlcXVlc3QgcGFkcworCSAgVGhlIHBhZHMgd2hlcmUgbmFtZXMgcGFkMCwgcGFkMSwgLi4uCisKKzIwMDktMTItMjcgMjM6MzI6NTggKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IG1vdmUgZXJyb3JzIF9uZXdfcGFkIHRvIHRoZSBlbmQKKworMjAwOS0xMi0yMSAxMzo1ODozMCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBBY2NlcHQgbm9uLXBhaXJlZCB1aW50IHRhZ3MKKwkgIEFkZHMgc3VwcG9ydCBmb3IgdW5wYWlyZWQgdW5zaWduZWQgaW50ZXJnZXIgdGFncworCisyMDA5LTEyLTIxIDEyOjA1OjM3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBBZGRzIG5ldyB0YWdzCisJICBNYXBzIG1vcmUgdGFncyB0aGF0IGFyZSBhbHJlYWR5IHBvc3RlZCBieSBxdGRlbXV4CisJICBGaXhlcyAjNTk5NzU5CisKKzIwMDktMTItMTAgMjI6MjA6NDUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJKiBnc3QvcXVpY2t0aW1lL2ZvdXJjYy5oOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5oOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eG1hcC5jOgorCSAgcXRtdXg6IHN1cHBvcnQgbW9yZSBvZiBqMmsKKwkgIFJlYWRzIHRoZSBuZXcgY2FwcyBhZGRlZCB0byBxdGRlbXV4IGJ5IGNvbW1pdAorCSAgYzkxN2Q2NWU2ZGYwYjVkNTg1ZjkwNWM3YWQ3OGE4YTBhNDRiMmNiMAorCSAgYW5kIGFkZHMgaXRzIGNvcnJlc3BvbmRpbmcgYXRvbXMuCisJICBBbHNvIGFkZHMgc3VwcG9ydCBmb3IgaW1hZ2UveC1qcGMgYXMgaXQgaXMgdGhlIHNhbWUKKwkgIGFzIGltYWdlL3gtanAyLCBleGNlcHQgdGhhdCB0aGUgYnVmZmVycyBuZWVkIHRvIGJlCisJICBib3hlZCBpbnNpZGUgYSBqcDJjIGlzb20gYm94IGJlZm9yZSBtdXhpbmcuIFRvIHNvbHZlCisJICB0aGlzIHRoZSBRVFBhZHMgbm93IGhhdmUgYSBmdW5jdGlvbiB0aGF0IChpZgorCSAgbm90IE5VTEwpIGlzIGNhbGxlZCB3aGVuIGEgYnVmZmVyIGlzIGNvbGxlY3RlZC4gVGhpcworCSAgZnVuY3Rpb24gcmV0dXJucyBhIHJlcGxhY2VtZW50IHRvIHRoZSBjdXJyZW50IGNvbGxlY3RlZAorCSAgYnVmZmVyLgorCSAgRml4ZXMgIzU5ODkxNgorCisyMDA5LTEyLTEwIDE2OjUzOjE5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguaDoKKwkgIHF0bXV4OiBNYXBzICdjbGFzc2lmaWNhdGlvbicgdGFnIGZvciAzZ3BwIGZpbGVzCisJICBBZGRzIHRoZSBtYXBwaW5nIG9mICdjbGFzc2lmaWNhdGlvbicgdGFncyB0byB3cml0aW5nIG9mCisJICAnY2xzZicgYXRvbXMgZm9yIGdwcG11eC4KKwkgIEJhc2VkIG9uIGEgcGF0Y2ggYnk6IExhc3NlIExhdWtrYW5lbiA8ZXh0LWxhc3NlLjIubGF1a2thbmVuQG5va2lhLmNvbT4KKworMjAwOS0xMi0wOCAxNzo1OTowNCAtMDgwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHNvbmdiaXJkbmVzdC5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiByZW1vdmUgYysrIGNvbW1lbnRzIGFuZCBhZGQgc29tZSBtb3JlIGNvbW1lbnRzLgorCisyMDA5LTEyLTA4IDE3OjU1OjU2IC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuYzoKKwkgIHF0bXV4OiBhZGQgaW1hIGFkcGNtIHN1cHBvcnQKKworMjAwOS0xMS0yNSAyMTo0MToyNyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiByZXBsYWNlIF9zY2FsZSB3aXRoIF9zY2FsZV9yb3VuZAorCSAgVXNlIHRoZSByb3VuZGluZyB2ZXJzaW9uIGZvciBpbXByb3ZlZCBzeW5jIGJldHdlZW4gc3RyZWFtcy4KKwkgIFNtYWxsIHZhcmlhdGlvbnMgaW4gdGhlIGR1cmF0aW9uIHdoZW4gbXV4aW5nIG1pZ2h0IGxlYWQgdG8KKwkgIGN1bXVsbGF0aXZlIHdyb25nIHRpbWVzdGFtcGluZyB3aGVuIGRlbXV4aW5nLgorCSAgRml4ZXMgIzYwMjkzNgorCisyMDA5LTExLTI0IDE2OjE2OjU2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHVzZSB0aW1lc3RhbXBzIGZvciBtdXhpbmcKKwkgIFRyeSB0byB1c2UgdGltZXN0YW1wcyBldmVuIHdoZW4gdGhlIHN0cmVhbSBoYXMgb3V0IG9mIG9yZGVyCisJICB0aW1lc3RhbXBzLCBvbmx5IGZhbGwgYmFjayB0byBkdXJhdGlvbnMgd2hlbiB3ZSBkZXRlY3QgYW4KKwkgIG91dCBvZiBvcmRlciBidWZmZXIuIEltcHJvdmVzIHN5bmMgYmV0d2VlbiBzdHJlYW1zLgorCisyMDA5LTExLTE5IDE4OjI4OjUyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGZpeCBtaXNzaW5nIGRlYnVnIGFyZ3VtZW50CisJICBBZGRzIGEgbWlzc2luZyBkZWJ1ZyBhcmd1bWVudAorCisyMDA5LTExLTE5IDExOjM2OjE0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IGZpeCBtaXNpbmZvcm1pbmcgZGVidWcgc3RhdGVtZW50CisKKzIwMDktMTEtMTkgMTE6MTQ6NTcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogZW5zdXJlIHdyaXRhYmxlIGJ1ZmZlciBtZXRhZGF0YSBiZWZvcmUgc2V0dGluZyBjYXBzCisKKzIwMDktMTAtMjkgMDg6MzY6MDIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJKiBnc3QvcXVpY2t0aW1lL2ZvdXJjYy5oOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eG1hcC5jOgorCSAgcXRtdXg6IHN1cHBvcnQgZm9yIFNWUTMKKwkgIEFkZHMgc3VwcG9ydCBmb3IgbXV4aW5nIFNWUTMgY29udGVudC4gVXN1YWxseSB0aGlzIGZvcm1hdAorCSAgaGFzIGRlY29kZXIgaW5mbyB0aGF0IG11c3QgYmUgcGFzc2VkIGluIHRoZSAnc2VxaCcgZmllbGQKKwkgIGluIHRoZSBjYXBzLiBJdCBpcyBhbHNvIGdvb2QgdG8gYWRkIHRoZSBnYW1hIGF0b20gdG8gbWFrZQorCSAgcXVpY2t0aW1lIG5vdCBjcmFzaC4KKwkgIEZpeGVzICM1ODc5MjIKKworMjAwOS0xMS0xNyAwOToyNjowNSAtMDMwMCAgVGhpYWdvIFNvdXNhIFNhbnRvcyA8dGhpYWdvc3NAcmVkbW9vbi4obm9uZSk+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBkbyBub3QgbGVhayBhIHN0cmluZworCSAgRnJlZXMgYSBzdHJpbmcgYWZ0ZXIgdXNlLiBBbHNvIGRvZXMgc29tZSBjb2RlIG9yZ2FuaXphdGlvbgorCisyMDA5LTExLTE2IDE0OjU3OjUzIC0wMzAwICBUaGlhZ28gU291c2EgU2FudG9zIDx0aGlhZ29zc0ByZWRtb29uLihub25lKT4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgcXRtdXg6IGRvIG5vdCBhZGQgc2l6ZSB0byB0aGUgcG9pbnRlciB2YXJpYWJsZQorCSAgRG8gbm90IHdyb25nbHkgYWRkIHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIHRvIHRoZQorCSAgcG9pbnRlciB0byB0aGUgYnVmZmVyIHNpemUuIEluc3RlYWQsIGNoZWNrIHRoZSByZXN1bHQKKwkgIHRvIHNlZSBpZiB0aGUgc2VyaWFsaXphdGlvbiB3YXMgb2suCisJICBCYXNlZCBvbiBhIHBhdGNoIGJ5OiAiQ2Fyc3RlbiBLcm9sbCA8Y2FyQHhpbWlkaS5jb20+IgorCSAgRml4ZXMgIzYwMjEwNgorCisyMDA5LTExLTA2IDEwOjM0OjM5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5oOgorCSAgcXRtdXg6IGhhbmRsZSAnbGF0ZScgc3RyZWFtcworCSAgV2hlbiBtdXhpbmcgc3RyZWFtcywgc29tZSBjYW4gc3RhcnQgbGF0ZXIgdGhhbiBvdGhlcnMuIHF0bXV4CisJICBub3cgaGFuZGxlIHRoaXMgYnkgYWRkaW5nIGFuIGVtcHR5IGVkdHMgZW50cnkgd2l0aCB0aGUKKwkgIGR1cmF0aW9uIG9mIHRoZSAnbGF0ZW5lc3MnIHRvIHRoZSBzdHJlYW0ncyB0cmFrLgorCSAgSXQgdG9sZXJhdGVzIGEgc3RyZWFtIHRvIGJlIHVwIHRvIDAuMXMgbGF0ZS4KKwkgIEZpeGVzICM1ODY4NDgKKworMjAwOS0xMS0wNSAyMTozNTo1NiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkgIHF0bXV4OiBhZGRzIHRoZSBFRFRTIGFuZCBFTFRTIGF0b21zIHRvIGF0b21zLmMKKwkgIFRoZXNlIGF0b21zIHdpbGwgYmUgdXNlZnVsIGZvciBzaWduYWxpbmcgc3RyZWFtcworCSAgdGhhdCBzdGFydCBsYXRlciBpbiB0aGUgZmlsZS4gQXMgd2VsbCBmb3IgYWRkaW5nCisJICBlZGl0IGxpc3RzIGlmIG5lZWRlZCBzb21ldGltZSBsYXRlci4KKworMjAwOS0xMS0wNiAwMDo0NjoxMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBBZGRpbmcgc29tZSBpZnMgZm9yIHByb3RlY3Rpb24KKwkgIEFkZGluZyBzb21lcyBpZnMgdG8gcHJvdGVjdCBhZ2FpbnN0IHdhcm5pbmcgY29uZGl0aW9ucworCSAgdGhhdCBtaWdodCBoYXBwZW4gd2hlbiB1cHN0cmVhbSBlbGVtZW50IGlzIG5vdCBzYW5lCisJICBGaXhlcyAjNjAwODk1CisKKzIwMDktMTAtMTYgMTA6NDc6MzIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyPgorCisJKiBnc3QvcXVpY2t0aW1lL2Z0eXBjYy5oOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5oOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eG1hcC5jOgorCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eG1hcC5oOgorCSAgZ3BwbXV4OiBBZGQgc3VwcG9ydCBmb3IgM2dyNgorCSAgS2VlcCB0cmFjayBvZiB0aGUgY2h1bmsgZHVyYXRpb25zIHRvIGJlIGFibGUgdG8gYWRkIDNncjYKKwkgIGJyYW5kIGlmIGl0IGlzIGEgZmFzdHN0YXJ0IGZpbGUgYW5kIHRoZSBsb25nZXN0IGNodW5rIGlzCisJICBzbWFsbGVyIHRoYW4gYSBzZWMuIEltcGxlbWVudGVkIGFjY29yZGluZyB0byAzZ3BwCisJICBUUyAyNi4yNDQgdjYuNC4wICgyMDA1LTA5KQorCSAgRml4ZXMgIzU4NDM2MQorCisyMDA5LTEwLTE1IDIxOjExOjE2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5icj4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IE9ubHkgcHVzaCBmdHlwIGxhdGVyIChpbiBmYXN0c3RhcnQgbW9kZSkKKwkgIEluIGZhc3RzdGFydCBtb2RlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNlbmQgdGhlIGZ0eXAKKwkgIHJpZ2h0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbS4gV2FpdGluZyBhbmQgc2VuZGluZyBpdAorCSAgb25seSBsYXRlciAod2hlbiB0aGUgbW9vdiBhdG9tIGlzIHJlYWR5IHRvIGJlIHNlbnQpIHByb3ZpZGVzCisJICB1cyB3aXRoIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0cmVhbSBhbmQgd2UgY2FuIGJldHRlcgorCSAgc2VsZWN0IHRoZSBjb21wYXRpYmxlIGJyYW5kcy4KKworMjAwOS0xMC0xNSAxNzo1MTozOSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBJbXByb3ZlIGVycm9yIG1lc3NhZ2UKKwkgIEltcHJvdmUgZXJyb3IgbWVzc2FnZSB3aGVuIHdlIGNhbid0IGdldCBvciBlc3RpbWF0ZSB0aGUKKwkgIHRpbWVzdGFtcC9kdXJhdGlvbiBvZiBhIGJ1ZmZlcgorCisyMDA5LTA5LTI5IDE1OjQ3OjEzICswMjAwICBNYXJjLUFuZHLDqSBMdXJlYXUgPG1sdXJlYXVAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgcXRtdXg6IGZpeCBmbGFnc19hc191aW50IHRvIGZsYWdzW10KKworMjAwOS0wOC0wNCAxMjo1ODozNSArMDIwMCAgSmFuIFVyYmFuc2tpIDx3dWxjemVyQHd1bGN6ZXIub3JnPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogRG9uJ3QgcmVxdWlyZSBlbmRpYW5uZXNzIGZpZWxkIGZvciA4IGJpdCByYXcgYXVkaW8KKwkgIEZpeGVzIGJ1ZyAjNTkwMzYwLgorCisyMDA5LTA2LTI1IDA4OjM4OjIxICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJICBxdG11eDogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KKworMjAwOS0wNi0yNSAwODozODoxMCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IEZpeCBkZWJ1ZyBzdGF0ZW1lbnQuCisKKzIwMDktMDYtMTEgMTU6NTQ6NDIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4Lmg6CisJICBxdG11eDogb25seSB1c2UgKDY0LWJpdCkgZXh0ZW5kZWQgKG1kYXQpIGF0b20gc2l6ZSBpZiBuZWVkZWQuICBGaXhlcyAjNTg1MzE5LgorCisyMDA5LTA2LTEwIDE0OjQ2OjE0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgcXRtdXg6IHNldCBkZWZhdWx0IG1vdmllIHRpbWVzY2FsZSB0byBtaWNyb3NlY29uZCB1bml0cworCisyMDA5LTA2LTEwIDEzOjI0OjIwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgcXRtdXg6IGNvbXByZXNzL29wdGltaXplIHN0c2Mgd3JpdGluZworCisyMDA5LTA2LTEwIDEyOjQyOjQ0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuYzoKKwkgIHF0bXV4OiBhZGQgM0dQIHN0eWxlIHRhZ2dpbmcgKGFuZCByZWZhY3RvciBhcHByb3ByaWF0ZWx5KQorCisyMDA5LTA2LTAxIDIzOjAwOjQ0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4IChhbmQgdmFyaWFudHMpOiBoYW5kbGUgcGl4ZWwtYXNwZWN0LXJhdGlvLiAgRml4ZXMgIzU4NDM1OC4KKworMjAwOS0wNi0wMSAyMjo0MjowOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkqIGdzdC9xdWlja3RpbWUvZnR5cGNjLmg6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJICBncHBtdXg6IGVuaGFuY2UgZnR5cCBicmFuZCBoZXVyaXN0aWMuICBGaXhlcyAjNTg0MzYwLgorCisyMDA5LTA1LTI4IDEzOjU2OjEwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiB1c2UgZGlmZmVyZW50IHN0c2QgYXRvbSB0eXBlIGZvciBIMjYzIGZvciBJU08gYW5kIFFUIHZhcmlhbnRzCisJICBGaXhlcyAjNTg0MTE0LgorCisyMDA5LTA1LTE1IDAxOjU0OjQ0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5icj4KKworCSogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgW3F0bXV4XSBGaXhlcyBzZWdmYXVsdCB3aGVuIGFkZGluZyBhIGJsb2IgYXMgZmlyc3QgdGFnLgorCSAgTW92ZXMgdGFncyBkYXRhIGluaXRpYWxpemF0aW9uIHRvIHRoZSBmdW5jdGlvbiB0aGF0IGFjdHVhbGx5IGFwcGVuZHMKKwkgIHRoZSB0YWdzIHRvIHRoZSBsaXN0LiBGaXhlcyAjNTgyNzAyCisJICBBbHNvIGZpeGVzIHNvbWUgc3R5bGUgY2F1Z2h0IGJ5IHRoZSBwcmUtY29tbWl0IGhvb2suCisKKzIwMDktMDUtMTAgMjE6MjE6MzYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJICBncHBtdXg6IEFkZCBNUEVHLTQgcGFydCAyIHRvIHN1cHBvcnRlZCBmb3JtYXRzLiAgRml4ZXMgIzU4MTU5My4KKworMjAwOS0wNS0wNyAxNzo1Mzo0MiArMDEwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDxjaHJpc3RpYW4uc2NoYWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBBZGQgcmFua3MgdG8gdmFyaW91cyBtdXhlcnMgYW5kIGVuY29kZXJzIGluIC1iYWQKKworMjAwOS0wNC0zMCAxNDo0MzozNiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuYzoKKwkgIHF0bXV4OiBjaGFuZ2VzIGNhcHMgb2Ygc3JjIHBhZHMgdG8gdmlkZW8vcXVpY2t0aW1lLCB2YXJpYW50PXNvbWV0aGluZworCSAgVGFrZSBhIGxvb2sgYXQgYnVnICM1ODAwMDUgZm9yIGZ1cnRoZXIgaW5mby4KKworMjAwOS0wNC0yNCAxODo1MzozNiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuYzoKKwkgIG1wNG11eDogQ2hhbmdlcyBzcmMgY2FwcyB0byBhcHBsaWNhdGlvbi94LWlzby1tcDQKKwkgIEZpeGVzICM1ODAwMDUKKworMjAwOS0wMy0yNSAyMToyNDo0NCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBmaXggcmV1c2luZyBlbGVtZW50CisJICBTdGF0ZSBjaGFuZ2UgdG8gUkVBRFkgYW5kIHRoZW4gYmFjayB0byBQQVVTRUQgc2hvdWxkIHN0aWxsIHByb3ZpZGUKKwkgIHRoZSBwcm9wZXIgc3RydWN0dXJlcyBhcyBhcmUgb3RoZXJ3aXNlIGZyZXNobHkgYXZhaWxhYmxlIGZvbGxvd2luZworCSAgYSByZXF1ZXN0X25ld19wYWQuCisJICBQb2ludGVkIG91dCBieSBUaGlhZ28gU2FudG9zLgorCisyMDA5LTAzLTIzIDExOjE3OjM5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICBxdG11eDogZml4IGluY2x1ZGVzIGZvciBsc2VlaworCSAgLS0KKworMjAwOS0wMy0yMCAxNDoyMDoxNiArMDEwMCAgTFJOIDxscm4xOTg2IGF0IGdtYWlsIGRvdCBjb20+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHdpbjMyOiBmaXggc2Vla2luZyBpbiBsYXJnZSBmaWxlcworCSAgVXNlIF9sc2Vla2k2NCgpIG9uIFdpbmRvd3MgdG8gc2VlayBpbiBsYXJnZSBmaWxlcy4KKwkgIEZpeGVzICM1NzYwMjEuCisKKzIwMDktMDMtMDIgMTA6NTc6MzUgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgIHF0bXV4OiBCZSBhIGJpdCBtb3JlIHZlcmJvc2UgaW4gb3VyIGRlYnVnIG1lc3NhZ2Ugd2hlbiBmYWlsaW5nIHRvIHJlbmVnb3RpYXRlCisKKzIwMDktMDEtMjggMTM6MjU6MTQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJICBBZGRpdGlvbmFsIG1lZGlhIHR5cGUgc3VwcG9ydCBpbiBxdG11eCAoYW5kIGZyaWVuZHMpLgorCSAgU3VwcG9ydCBBTVIgYW5kIEgyNjMgZm9yIGJvdGggcXRtdXggYW5kIGdwcG11eCwKKwkgIGFuZCBhZGQgZXh0ZW5zaW9ucyBpbiBzYW1wbGUgdGFibGUgZGVzY3JpcHRpb24uCisKKzIwMDktMDEtMDkgMjE6NTk6NDggKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6IEFkZCB2aWRlby94LXF0LXBhcnQgYW5kIHZpZGVvL3gtbTQtcGFydCB0byBjYXBzIHNvIHNjaHJvZW5jL3NjaHJvcGFyc2UgY2FuIHVzZSBpdC4gIEZpeGVzICM1Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eG1hcC5jOiBBZGQgdmlkZW8veC1xdC1wYXJ0IGFuZCB2aWRlby94LW00LXBhcnQKKwkgIHRvIGNhcHMgc28gc2Nocm9lbmMvc2Nocm9wYXJzZSBjYW4gdXNlIGl0LiAgRml4ZXMgIzU2Njk1OAorCisyMDA4LTEyLTE5IDE4OjUzOjQ3ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOiBEbyBub3QgdGVtcHQgb3Igc3VnZ2VzdCB0byB2aW9sYXRlIGdzdF9jb2xsZWN0X3BhZHMgQVBJIHNwZWNpZmljYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOiAoZ3N0X3F0X211eF9jaGFuZ2Vfc3RhdGUpOgorCSAgRG8gbm90IHRlbXB0IG9yIHN1Z2dlc3QgdG8gdmlvbGF0ZSBnc3RfY29sbGVjdF9wYWRzIEFQSSBzcGVjaWZpY2F0aW9uLgorCisyMDA4LTEyLTE5IDE4OjMzOjQ3ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3F1aWNrdGltZS86IER1YWwgbGljZW5zZSBxdG11eCBMR1BML01JVC4gIEZpeGVzICM1NjQyMzIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOgorCSAgKiBnc3QvcXVpY2t0aW1lL2F0b21zLmg6CisJICAqIGdzdC9xdWlja3RpbWUvZGVzY3JpcHRvcnMuYzoKKwkgICogZ3N0L3F1aWNrdGltZS9kZXNjcmlwdG9ycy5oOgorCSAgKiBnc3QvcXVpY2t0aW1lL2ZvdXJjYy5oOgorCSAgKiBnc3QvcXVpY2t0aW1lL2Z0eXBjYy5oOgorCSAgKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6CisJICAqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguaDoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eG1hcC5jOgorCSAgKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmg6CisJICAqIGdzdC9xdWlja3RpbWUvcHJvcGVydGllcy5jOgorCSAgKiBnc3QvcXVpY2t0aW1lL3Byb3BlcnRpZXMuaDoKKwkgIER1YWwgbGljZW5zZSBxdG11eCBMR1BML01JVC4gIEZpeGVzICM1NjQyMzIuCisKKzIwMDgtMTItMTYgMTY6MjY6NTIgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgVG90YWxseSByZW1vdmUgdGhlIGludGVybmFsIHRhZ2xpc3RzIGFuZCBmdWxseSB1c2UgdGFnc2V0dGVyLiBGaXhlcyB2YXJpb3VzIHRhZyBtdXhpbmcgaXNzdWVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9jZWx0L2dzdGNlbHRlbmMuYzoKKwkgICogZXh0L2NlbHQvZ3N0Y2VsdGVuYy5oOgorCSAgKiBleHQvbWV0YWRhdGEvZ3N0bWV0YWRhdGFtdXguYzoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4Lmg6CisJICBUb3RhbGx5IHJlbW92ZSB0aGUgaW50ZXJuYWwgdGFnbGlzdHMgYW5kIGZ1bGx5IHVzZSB0YWdzZXR0ZXIuIEZpeGVzCisJICB2YXJpb3VzIHRhZyBtdXhpbmcgaXNzdWVzLgorCisyMDA4LTEyLTAxIDE2OjM3OjQ1ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3F1aWNrdGltZS9hdG9tcy5jOiBGaXggbWoyIHNhbXBsZSBkZXNjcmlwdGlvbiBtZXRhZGF0YSBjb25zdHJ1Y3Rpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOiAoYnVpbGRfanAyaF9leHRlbnNpb24pOgorCSAgRml4IG1qMiBzYW1wbGUgZGVzY3JpcHRpb24gbWV0YWRhdGEgY29uc3RydWN0aW9uLgorCisyMDA4LTExLTE4IDAxOjA5OjA5ICswMDAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSAgZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOiBRdWlldCBhIGRlYnVnZ2luZyBtZXNzYWdlIHRoYXQgSSByZWNlbnRseSBhZGRlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4LmM6IFF1aWV0IGEgZGVidWdnaW5nIG1lc3NhZ2UgdGhhdCBJIHJlY2VudGx5CisJICBhZGRlZC4KKworMjAwOC0xMS0xNSAwMjo1NjozMSArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkgIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguKjogVXNlIGR0cyBmcm9tIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCgpIGZvciB2aWRlby94LXF0LXBhcnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4Lmg6CisJICBVc2UgZHRzIGZyb20gR1NUX0JVRkZFUl9PRkZTRVRfRU5EKCkgZm9yIHZpZGVvL3gtcXQtcGFydC4KKworMjAwOC0xMS0xNCAyMToyNDo1MSArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGdzdC9xdWlja3RpbWUvOiBSZXZlcnQgcHJldmlvdXMgY29tbWl0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkgICogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSAgKiBnc3QvcXVpY2t0aW1lL2Rlc2NyaXB0b3JzLmM6CisJICAqIGdzdC9xdWlja3RpbWUvZGVzY3JpcHRvcnMuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9mdHlwY2MuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4Lmg6CisJICAqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuYzoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eG1hcC5oOgorCSAgKiBnc3QvcXVpY2t0aW1lL3Byb3BlcnRpZXMuYzoKKwkgICogZ3N0L3F1aWNrdGltZS9wcm9wZXJ0aWVzLmg6CisJICBSZXZlcnQgcHJldmlvdXMgY29tbWl0LgorCisyMDA4LTExLTE0IDIwOjM4OjE4ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3F1aWNrdGltZS86IER1YWwgbGljZW5zZSBMR1BML01JVCwgYXMgYXBwYXJlbnRseSBzdXBwb3NlZCB0by4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXVpY2t0aW1lL2F0b21zLmM6CisJICAqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9kZXNjcmlwdG9ycy5jOgorCSAgKiBnc3QvcXVpY2t0aW1lL2Rlc2NyaXB0b3JzLmg6CisJICAqIGdzdC9xdWlja3RpbWUvZm91cmNjLmg6CisJICAqIGdzdC9xdWlja3RpbWUvZnR5cGNjLmg6CisJICAqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXguYzoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5oOgorCSAgKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6CisJICAqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9wcm9wZXJ0aWVzLmM6CisJICAqIGdzdC9xdWlja3RpbWUvcHJvcGVydGllcy5oOgorCSAgRHVhbCBsaWNlbnNlIExHUEwvTUlULCBhcyBhcHBhcmVudGx5IHN1cHBvc2VkIHRvLgorCisyMDA4LTExLTE0IDIwOjE3OjEwICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3F1aWNrdGltZS86IEN1dCBkZXRvdXIgaW4gc2FtcGxlIGRlc2NyaXB0aW9uIGV4dGVuc2lvbiBjb25zdHJ1Y3Rpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F1aWNrdGltZS9hdG9tcy5jOiAoYnVpbGRfZXNkc19leHRlbnNpb24pLAorCSAgKGJ1aWxkX21vdl9hYWNfZXh0ZW5zaW9uKSwgKGJ1aWxkX2pwMmhfZXh0ZW5zaW9uKSwKKwkgIChidWlsZF9jb2RlY19kYXRhX2V4dGVuc2lvbik6CisJICAqIGdzdC9xdWlja3RpbWUvYXRvbXMuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOiAoZ3N0X3F0X211eF9hdWRpb19zaW5rX3NldF9jYXBzKSwKKwkgIChnc3RfcXRfbXV4X3ZpZGVvX3Npbmtfc2V0X2NhcHMpOgorCSAgKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4bWFwLmM6IChnc3RfcXRfbXV4X21hcF9mb3JtYXRfdG9faGVhZGVyKToKKwkgIEN1dCBkZXRvdXIgaW4gc2FtcGxlIGRlc2NyaXB0aW9uIGV4dGVuc2lvbiBjb25zdHJ1Y3Rpb24uCisJICBBbHNvIGFjdHVhbGx5IGltcGxlbWVudCBJU08gSlBFRzIwMDAgbWoyIGZvcm1hdC4KKworMjAwOC0xMS0xMSAxOTozMTozNSArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIHRlc3RzL2NoZWNrLzogQWRkIHVuaXQgdGVzdCBmb3IgcXRtdXguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3F0bXV4LmM6IChzZXR1cF9zcmNfcGFkKSwKKwkgICh0ZWFyZG93bl9zcmNfcGFkKSwgKHNldHVwX3F0bXV4KSwgKGNsZWFudXBfcXRtdXgpLAorCSAgKGNoZWNrX3F0bXV4X3BhZCksIChHU1RfU1RBUlRfVEVTVCksIChxdG11eF9zdWl0ZSksIChtYWluKToKKwkgIEFkZCB1bml0IHRlc3QgZm9yIHF0bXV4LgorCisyMDA4LTExLTExIDE5OjI0OjEyICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOiBBZGQgc29tZSBtb3JlIHNhZmV0eS9zYW5pdHkgY2hlY2tzIGluIHRhZyBtYW5pcHVsYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOiAoZ3N0X3F0X211eF9hZGRfbWV0YWRhdGFfdGFncyk6CisJICBBZGQgc29tZSBtb3JlIHNhZmV0eS9zYW5pdHkgY2hlY2tzIGluIHRhZyBtYW5pcHVsYXRpb24uCisKKzIwMDgtMTEtMDggMDI6MDA6NTggKzAwMDAgIFRoaWFnbyBTb3VzYSBTYW50b3MgPHRoaWFnb3NzYW50b3NAZ21haWwuY29tPgorCisJICBDb3B5IHF0bXV4IGZyb20gcmV2aXNpb24gMTQ4IG9mIHRoZSBnc3QtcXRtdXggcmVwb3NpdG9yeS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcGF0Y2ggYnk6IFRoaWFnbyBTb3VzYSBTYW50b3MgPHRoaWFnb3NzYW50b3NAZ21haWwuY29tPgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9xdWlja3RpbWUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9xdWlja3RpbWUvYXRvbXMuYzoKKwkgICogZ3N0L3F1aWNrdGltZS9hdG9tcy5oOgorCSAgKiBnc3QvcXVpY2t0aW1lL2Rlc2NyaXB0b3JzLmM6CisJICAqIGdzdC9xdWlja3RpbWUvZGVzY3JpcHRvcnMuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9mb3VyY2MuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9mdHlwY2MuaDoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eC5jOgorCSAgKiBnc3QvcXVpY2t0aW1lL2dzdHF0bXV4Lmg6CisJICAqIGdzdC9xdWlja3RpbWUvZ3N0cXRtdXhtYXAuYzoKKwkgICogZ3N0L3F1aWNrdGltZS9nc3RxdG11eG1hcC5oOgorCSAgKiBnc3QvcXVpY2t0aW1lL3Byb3BlcnRpZXMuYzoKKwkgICogZ3N0L3F1aWNrdGltZS9wcm9wZXJ0aWVzLmg6CisJICBDb3B5IHF0bXV4IGZyb20gcmV2aXNpb24gMTQ4IG9mIHRoZSBnc3QtcXRtdXggcmVwb3NpdG9yeS4KKwkgIEZpeGVzICM1NTAyODAuCisKKzIwMTEtMDQtMTIgMTg6MjU6MzQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBBbmRyb2lkLm1rOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBnc3QvcXVpY2t0aW1lL0xFR0FMOgorCSogZ3N0L3F1aWNrdGltZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cnRweHF0ZGVwYXkuYzoKKwkqIGdzdC9xdWlja3RpbWUvZ3N0cnRweHF0ZGVwYXkuaDoKKwkqIGdzdC9xdWlja3RpbWUvcXRhdG9tcGFyc2VyLmg6CisJKiBnc3QvcXVpY2t0aW1lL3F0ZGVtdXguYzoKKwkqIGdzdC9xdWlja3RpbWUvcXRkZW11eC5oOgorCSogZ3N0L3F1aWNrdGltZS9xdGRlbXV4LnZjcHJvajoKKwkqIGdzdC9xdWlja3RpbWUvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvcXVpY2t0aW1lL3F0ZGVtdXhfZHVtcC5oOgorCSogZ3N0L3F1aWNrdGltZS9xdGRlbXV4X2ZvdXJjYy5oOgorCSogZ3N0L3F1aWNrdGltZS9xdGRlbXV4X2xhbmcuYzoKKwkqIGdzdC9xdWlja3RpbWUvcXRkZW11eF9sYW5nLmg6CisJKiBnc3QvcXVpY2t0aW1lL3F0ZGVtdXhfdHlwZXMuYzoKKwkqIGdzdC9xdWlja3RpbWUvcXRkZW11eF90eXBlcy5oOgorCSogZ3N0L3F1aWNrdGltZS9xdHBhbGV0dGUuaDoKKwkqIGdzdC9xdWlja3RpbWUvcXVpY2t0aW1lLmM6CisJKiBwby9QT1RGSUxFUy5pbjoKKwkgIHF0ZGVtdXg6IHJlbmFtZSBkaXJlY3RvcnkgdG8gcXVpY2t0aW1lIHRvIG1hdGNoIHBsdWdpbiBuYW1lCisJICBJbiBwcmVwYXJhdGlvbiBmb3IgcXRtdXggbW92aW5nIHRvIC1nb29kLgorCisyMDExLTA0LTEyIDExOjQ5OjU0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IHNpbXBsaWZ5IGZyYW1lcmF0ZSBmcmFjdGlvbiBjYWxjdWxhdGlvbgorCisyMDExLTAxLTI0IDE1OjQ1OjI4IC0wNjAwICBMZW9uYXJkbyBTYW5kb3ZhbCA8bHNhbmRvdmFsQHRpLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5oOgorCSAgZmx2ZGVtdXg6IGFkZCB3aWR0aCwgaGVpZ2h0IGFuZCBmcmFtZXJhdGUgdG8gY2FwcyB3aGVuIHByZXNlbnQgb24gb25NZXRhRGF0YQorCSAgRml4ZXMgIzY0MDQ4My4KKworMjAxMC0wOC0yNCAxMzo1Nzo1NSArMDIwMCAgUGFzY2FsIEJ1aGxlciA8cGFzY2FsLmJ1aGxlckB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgcnRwc3NyY2RlbXV4OiBVbmtub3duIFNTUkMgaXMgbm90IGZhdGFsCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ2OTY2CisKKzIwMTAtMDgtMjQgMTM6NTQ6NTggKzAyMDAgIFBhc2NhbCBCdWhsZXIgPHBhc2NhbC5idWhsZXJAdGFuZGJlcmcuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBOdW1iZXIgb2YgYWN0aXZlIHNvdXJjZXMgc2hvdWxkIGJlIHVwZGF0ZWQgd2hlbmV2ZXIgdGhlIHN0YXR1cyBvZiB0aGUgc291cmNlIGNoYW5nZXMgdG8gYWN0aXZlCisJICBGb3J3YXJkLXBvcnRlZCBieSBPbGl2aWVyIENyw6p0ZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0Njk2NQorCisyMDEwLTA2LTIzIDExOjI5OjU4ICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cG1hbmFnZXI6IGlnbm9yZSBhIEJZRSBpZiBpdCBpcyBzZW50IHdpdGggb3VyIGludGVybmFsIFNTUkMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDY5NjQKKworMjAxMC0wMS0yOSAwOTo0OTo0OCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEFkZHMgbW9yZSBoMjY0IGZpZWxkcyB0byBpdHMgY2FwcworCSAgQWRkcyBhbGlnbm1lbnQ9YXUgYW5kIHN0cmVhbS1mb3JtYXQ9YXZjIHRvIGgyNjQgY2FwcworCSAgRml4ZXMgIzYwNjY2MgorCisyMDExLTA0LTExIDEyOjQ0OjE5ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSAgamFjazogYWxzbyBoYW5kbGUgZGVwcmVjYXRpb25zIGZvciBqYWNrIDEuOS43CisJICBKYWNrIDEuOS43IHdhcyByZWxlYXNlZCAyMC5NYXIuMjAxMSwgbmVlZCB0byBoYW5kbGUgdGhlIGRlcHJlY2F0ZWQgYXBpIGZvciB0aGlzCisJICB2ZXJzaW9uIHRvby4KKworMjAxMS0wNC0xMSAwMDozNjozNSAtMDQwMCAgVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL01ha2VmaWxlLmFtOgorCSAgYW5kcm9pZDogbWFrZSBpdCByZWFkeSBmb3IgYW5kcm9nZW5pemVyCisJICBSZW1vdmUgdGhlIGFuZHJvaWQvIHRvcCBkaXIKKwkgIEZpeGUgdGhlIE1ha2VmaWxlLmFtIHRvIGJlIGFuZHJvZ2VuaXplZAorCSAgVG8gYnVpbGQgZ3N0cmVhbWVyIGZvciBhbmRyb2lkIHdlIGFyZSBub3cgdXNpbmcgYW5kcm9nZW5pemVyIHdoaWNoIGdlbmVyYXRlcyB0aGUgbmVlZGVkIEFuZHJvaWQubWsgZmlsZXMuCisJICBBbmRyb2dlbml6ZXIgY2FuIGJlIGZvdW5kIGhlcmU6IGh0dHA6Ly9naXQuY29sbGFib3JhLmNvLnVrLz9wPXVzZXIvZGVyZWsvYW5kcm9nZW5pemVyLmdpdAorCisyMDExLTA0LTEwIDE4OjU2OjUyIC0wNDAwICBUaGliYXVsdCBTYXVuaWVyIDx0aGliYXVsdC5zYXVuaWVyQGNvbGxhYm9yYS5jby51az4KKworCSogQW5kcm9pZC5tazoKKwkqIGFuZHJvaWQvTk9USUNFOgorCSogYW5kcm9pZC9hcGV0YWcubWs6CisJKiBhbmRyb2lkL2F2aS5tazoKKwkqIGFuZHJvaWQvZmx2Lm1rOgorCSogYW5kcm9pZC9nc3QvcnRwbWFuYWdlci9nc3RydHBiaW4tbWFyc2hhbC5jOgorCSogYW5kcm9pZC9nc3QvcnRwbWFuYWdlci9nc3RydHBiaW4tbWFyc2hhbC5oOgorCSogYW5kcm9pZC9nc3QvdWRwL2dzdHVkcC1lbnVtdHlwZXMuYzoKKwkqIGFuZHJvaWQvZ3N0L3VkcC9nc3R1ZHAtZW51bXR5cGVzLmg6CisJKiBhbmRyb2lkL2dzdC91ZHAvZ3N0dWRwLW1hcnNoYWwuYzoKKwkqIGFuZHJvaWQvZ3N0L3VkcC9nc3R1ZHAtbWFyc2hhbC5oOgorCSogYW5kcm9pZC9pY3lkZW11eC5tazoKKwkqIGFuZHJvaWQvaWQzZGVtdXgubWs6CisJKiBhbmRyb2lkL3F0ZGVtdXgubWs6CisJKiBhbmRyb2lkL3J0cC5tazoKKwkqIGFuZHJvaWQvcnRwbWFuYWdlci5tazoKKwkqIGFuZHJvaWQvcnRzcC5tazoKKwkqIGFuZHJvaWQvc291cC5tazoKKwkqIGFuZHJvaWQvdWRwLm1rOgorCSogYW5kcm9pZC93YXZlbmMubWs6CisJKiBhbmRyb2lkL3dhdnBhcnNlLm1rOgorCSogZ3N0L2FscGhhL01ha2VmaWxlLmFtOgorCSogZ3N0L2FwZXRhZy9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb2Z4L01ha2VmaWxlLmFtOgorCSogZ3N0L2F1cGFyc2UvTWFrZWZpbGUuYW06CisJKiBnc3QvYXV0b2RldGVjdC9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdmkvTWFrZWZpbGUuYW06CisJKiBnc3QvY3V0dGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L2RlYnVndXRpbHMvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW06CisJKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbToKKwkqIGdzdC9lcXVhbGl6ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvZmx2L01ha2VmaWxlLmFtOgorCSogZ3N0L2ZseC9NYWtlZmlsZS5hbToKKwkqIGdzdC9nb29tL01ha2VmaWxlLmFtOgorCSogZ3N0L2dvb20yazEvTWFrZWZpbGUuYW06CisJKiBnc3QvaWN5ZGVtdXgvTWFrZWZpbGUuYW06CisJKiBnc3QvaWQzZGVtdXgvTWFrZWZpbGUuYW06CisJKiBnc3QvaW1hZ2VmcmVlemUvTWFrZWZpbGUuYW06CisJKiBnc3QvaW50ZXJsZWF2ZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9sYXcvTWFrZWZpbGUuYW06CisJKiBnc3QvbGV2ZWwvTWFrZWZpbGUuYW06CisJKiBnc3QvbWF0cm9za2EvTWFrZWZpbGUuYW06CisJKiBnc3QvbW9ub3Njb3BlL01ha2VmaWxlLmFtOgorCSogZ3N0L211bHRpZmlsZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9tdWx0aXBhcnQvTWFrZWZpbGUuYW06CisJKiBnc3QvcXRkZW11eC9NYWtlZmlsZS5hbToKKwkqIGdzdC9yZXBsYXlnYWluL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0c3AvTWFrZWZpbGUuYW06CisJKiBnc3Qvc2hhcGV3aXBlL01ha2VmaWxlLmFtOgorCSogZ3N0L3NtcHRlL01ha2VmaWxlLmFtOgorCSogZ3N0L3NwZWN0cnVtL01ha2VmaWxlLmFtOgorCSogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2JveC9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2Nyb3AvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbToKKwkqIGdzdC93YXZlbmMvTWFrZWZpbGUuYW06CisJKiBnc3Qvd2F2cGFyc2UvTWFrZWZpbGUuYW06CisJKiBnc3QveTRtL01ha2VmaWxlLmFtOgorCSAgYW5kcm9pZDogTWFrZSBpdCByZWFkeSBmb3IgYW5kcm9nZW5pemVyCisJICBSZW1vdmUgdGhlIGFuZHJvaWQvIHRvcCBkaXIKKwkgIEZpeGUgdGhlIE1ha2VmaWxlLmFtIHRvIGJlIGFuZHJvZ2VuaXplZAorCSAgVG8gYnVpbGQgZ3N0cmVhbWVyIGZvciBhbmRyb2lkIHdlIGFyZSBub3cgdXNpbmcgYW5kcm9nZW5pemVyIHdoaWNoIGdlbmVyYXRlcyB0aGUgbmVlZGVkIEFuZHJvaWQubWsgZmlsZXMuCisJICBBbmRyb2dlbml6ZXIgY2FuIGJlIGZvdW5kIGhlcmU6IGh0dHA6Ly9naXQuY29sbGFib3JhLmNvLnVrLz9wPXVzZXIvZGVyZWsvYW5kcm9nZW5pemVyLmdpdAorCisyMDExLTA0LTA1IDIxOjE0OjQzICswMjAwICBIYWFrb24gU3BvcnNoZWltIDxoYWFrb24uc3BvcnNoZWltQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIHJ0cGdzdHBheTogZGVjbGFyZSBmcmFnX29mZnNldCB0byBob2xkIDMyYml0cy4KKwkgIEFzIHNwZWNpZmllZCBpbiBkb2N1bWVuYXRpb24gYWJvdmUgYW5kIGJlbG93LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0Njk1NAorCisyMDExLTA0LTA5IDEyOjQxOjQ4ICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGZpeCB3cm9uZ2x5IGFwcGxpZWQgcGF0Y2gKKwkgIE9idmlvdXNseSByZWN2X3J0cF9zaW5rIGRvZXMgbm90IGhhdmUgbXVjaCB0byBkbyB3aXRoIHNlbmRfcnRjcF9zcmMuLi4KKwkgIFNlZSBjb21taXQgMDQ2ZmYxNzAuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ3MjYzCisKKzIwMTEtMDQtMDggMTU6NTk6NTggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IHVwZGF0ZSBmb3Igc2V0X2ZyYW1lX3Byb3BzIC0+IHNldF9mcmFtZV9yYXRlIEFQSSBjaGFuZ2UKKworMjAxMS0wNC0wOCAwMDowMzoyMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkgIHRlc3RzOiBob29rIHVwIGF1ZGlvcGFyc2VyIHVuaXQgdGVzdHMKKworMjAxMS0wNC0wNyAxODozMDo0OSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIG1wZWdhdWRpb3BhcnNlOiByZWxheCBzeW5jIG1hdGNoIGEgYml0IHdoZW4gZHJhaW5pbmcKKwkgIC4uLiB0byBhdCBsZWFzdCBhbGxvdyBpbml0aWFsIGNhcHMgY2hhbmdlIChidXQgbm8gZnVydGhlciBjYXBzIGppdHRlcikuCisJICBGaXhlcyB1bml0IHRlc3QgYWdhaW4gYWZ0ZXIgcHJldmlvdXMgY2hhbmdlLgorCisyMDExLTA0LTA3IDE1OjIxOjEwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSAgZG9jczogdXBkYXRlIGZvciBjaGFuZ2VzIGluIGdpdAorCisyMDExLTA0LTA3IDE1OjIwOjE5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sOgorCSAgZG9jczogYWRkIGF1ZGlvcGFyc2VycyB0byBkb2NzCisKKzIwMTEtMDQtMDcgMTU6MDc6MTUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jOgorCSAgYWFjcGFyc2UsIGFtcnBhcnNlOiBnc3RfZm9vcGFyc2VfeHl6IC0+IGdzdF9mb29fcGFyc2VfeHl6IHRvIG1hdGNoIEdzdEZvb1BhcnNlCisJICBTZWUgbW92aW5nLXBsdWdpbnMgY2hlY2tsaXN0LgorCisyMDExLTA0LTA3IDE0OjQzOjQyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb3BhcnNlcnMvcGx1Z2luLmM6CisJICBhdWRpb3BhcnNlcnM6IGhvb2sgdXAgdG8gYnVpbGQKKworMjAxMS0wNC0wNyAxMzoyNjo0MSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuaDoKKwkgIGF1ZGlvcGFyc2VyczogcG9ydCB0byBuZXcgR3N0QmFzZVBhcnNlIGluIGNvcmUKKworMjAxMS0wNC0wNCAyMDo1NTozOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIG1wZWdhdWRpb3BhcnNlOiByZXF1aXJlIHRpZ2h0ZXIgc3luYyBtYXRjaCB3aGVuIGRyYWluaW5nCisKKzIwMTEtMDQtMDEgMTQ6NDc6NDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmg6CisJICBtcGVnYXVkaW9wYXJzZTogUGFyc2UgZW5jb2RlciBkZWxheSBhbmQgZW5jb2RlciBwYWRkaW5nIGZyb20gdGhlIExBTUUgaGVhZGVyIGlmIHByZXNlbnQKKworMjAxMS0wMy0wOSAyMzowNjoxNCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvcGx1Z2luLmM6CisJICBkY2FwYXJzZTogQnVtcCByYW5rIHRvIHByaW1hcnkrMQorCSAgU2VlbXMgdG8gd29yayBmaW5lIHdpdGggYSByZWFzb25hYmx5IHdpZGUgcmFuZ2Ugb2YgbWVkaWEsIHNvIGJ1bXBpbmcKKwkgIHJhbmsuCisKKzIwMTEtMDMtMjMgMjI6MDI6MzcgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmg6CisJICBkY2FwYXJzZTogRXhwb3NlIGZyYW1lIHNpemUgaW4gY2FwcworCSAgVGhpcyBleHBvcnRzIHRoZSBzaXplIG9mIHRoZSBmcmFtZSAobnVtYmVyIG9mIGJ5dGVzIGZyb20gb25lIHN5bmMgcG9pbnQKKwkgIHRvIHRoZSBuZXh0KSBhcyB0aGUgImZyYW1lX3NpemUiIGZpZWxkIGluIGNhcHMuCisKKzIwMTEtMDMtMDkgMjM6MDM6MTAgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmg6CisJICBkY2FwYXJzZTogRXhwb3NlIGJsb2NrIHNpemUgaW4gY2FwcworCSAgVGhpcyBzZXRzIHRoZSAiYmxvY2tfc2l6ZSIgZmllbGQgb24gY2FwcyBhcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMKKwkgIGVuY29kZWQgaW4gb25lIGZyYW1lLgorCisyMDExLTAzLTE2IDE1OjUzOjEzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgbXBlZ2F1ZGlvcGFyc2U6IGFkZCBGSVhNRSBmb3IgbWFraW5nIHRoZSBiYXNlIGNsYXNzIHVzZSB4aW5nIHNlZWsgdGFibGVzIGJldHRlcgorCisyMDExLTAzLTE0IDE4OjI1OjI1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5oOgorCSAgZGNhcGFyc2U6IEFkZCBkZXB0aCBhbmQgZW5kaWFubmVzcyB0byB0aGUgY2FwcworCSAgU29tZSBkZWNvZGVycyBjYW4gb25seSBoYW5kbGUgc3BlY2lmaWMgZW5kaWFubmVzcyBvciBhIGZpeGVkCisJICBkZXB0aCBhbmQgdGhpcyBhbGxvd3MgYmV0dGVyIG5lZ290aWF0aW9uLgorCSAgRml4ZXMgYnVnICM2NDQyMDguCisKKzIwMTEtMDItMjYgMTM6NTM6NDQgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBSZXZlcnQgImFhY3BhcnNlOiBhbGxvdyBwYXJzZWQgZnJhbWVzIG9uIHNpbmsgcGFkIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCBlNDliODlkNWM1YTEyNDRmYTBkY2I4YmI0OTk2ZTM4ZmI5YmZmOWU1LgorCisyMDExLTAyLTIzIDE3OjI1OjAzIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IGFsbG93IHBhcnNlZCBmcmFtZXMgb24gc2luayBwYWQKKworMjAxMC0xMC0xMyAxNjoxMjowMiAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3BhcnNlci5jOgorCSAgdGVzdHM6IGZpeCBiYXNlcGFyc2UgdGVzdAorCisyMDEwLTEwLTEzIDE1OjM5OjU1IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5oOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5oOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuaDoKKwkgIGJhc2VwYXJzZTogQ3JlYXRlIGJhc2VwYXJzZSBsaWJyYXJ5CisKKzIwMTEtMDItMDcgMTQ6NDY6NTcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiB0dW5lIFFVRVJZX1NFRUtJTkcgcmVzcG9uc2UKKwkgIEV2ZW4gaWYgd2UgY3VycmVudGx5IGRvIG5vdCBoYXZlIGEgZHVyYXRpb24geWV0LCBhc3N1bWUgc2Vla2FibGUgaWYKKwkgIGl0IGxvb2tzIGxpa2Ugd2UnbGwgbGlrZWx5IGJlIGFibGUgdG8gZGV0ZXJtaW5lIGl0IGxhdGVyIG9uCisJICAod2hpY2ggY29pbmNpZGVzIHdpdGggbmVlZGVkIGluZm9ybWF0aW9uIHRvIHBlcmZvcm0gc2Vla2luZykuCisJICBGaXhlcyAjNjQxMDQ3LgorCisyMDExLTAyLTA4IDIzOjM5OjI0ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogVXBkYXRlIG1pbi9tYXggYml0cmF0ZSBiZWZvcmUgZmlyc3QgcG9zdGluZyB0aGVtCisJICBUaGlzIGF2b2lkcyBwb3N0aW5nIGFuIGluaXRpYWwgbWluLWJpdHJhdGUgb2YgR19VSU5UTUFYIGFuZCBtYXgtYml0cmF0ZQorCSAgb2YgMC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDE4NTcKKworMjAxMS0wMi0wOCAyMzo1MDoxMyArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuaDoKKwkgIG1wZWdhdWRpb3BhcnNlOiBQb3N0IENCUiBiaXRyYXRlIGFzIG5vbWluYWwgYml0cmF0ZQorCSAgRXZlbiBpZiBWQlIgaGVhZGVycyBhcmUgbWlzc2luZywgd2UgY2FuJ3QgZ3VhcmFudGVlIHRoYXQgYSBzdHJlYW0gaXMgaW4KKwkgIGZhY3QgYSBDQlIgc3RyZWFtLCBzbyBpdCdzIHNhZmVyIHRvIGxldCBiYXNlcGFyc2UgY2FsY3VsYXRlIHRoZSBhdmVyYWdlCisJICBiaXRyYXRlIHJhdGhlciB0aGFuIGFzc3VtZSBhIENCUiBzdHJlYW0uIEhvd2V2ZXIsIGluIG9yZGVyIHRvIG1ha2UKKwkgIC9zb21lLyBtZXRhZGF0YSBhdmFpbGFibGUgYmVmb3JlIHRoZSByZXF1aXNpdGUgbnVtYmVyIG9mIGZyYW1lcyBoYXZlCisJICBiZWVuIHBhcnNlZCwgdGhpcyBwb3N0cyB0aGUgYml0cmF0ZSBmcm9tIHRoZSBub24tVkJSIGhlYWRlcnMgYXMgdGhlCisJICBub21pbmFsIGJpdHJhdGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQxODU4CisKKzIwMTAtMDktMDYgMTQ6MTA6MTEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJICBhbXJwYXJzZTogYSB2YWxpZCBhbXItd2IgZnJhbWUgc2hvdWxkIG5vdCBoYXZlIHJlc2VydmVkIGZyYW1lIHR5cGUgaW5kZXgKKwkgIFNlZSAjNjM5NzE1LgorCisyMDExLTAxLTI3IDE2OjUyOjM0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IGltcHJvdmUgaGFuZGxpbmcgb2YgZGVwZW5kZW50IHN1YnN0cmVhbSBmcmFtZXMKKwkgIEluIHBhcnRpY3VsYXIsIHRpbWVzdGFtcHMgb2YgdGhlc2Ugc2hvdWxkIHRyYWNrIG1haW4tc3RyZWFtIHRpbWVzdGFtcHMuCisKKzIwMTEtMDEtMjEgMTQ6NTM6MzkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiB0dW5lIGRlZmF1bHQgZHVyYXRpb24gZXN0aW1hdGUgdXBkYXRlIGludGVydmFsCisJICBSYXRoZXIgdGhhbiBhIGZpeGVkIGRlZmF1bHQgZnJhbWUgY291bnQsIGVzdGltYXRlIGZyYW1lIGNvdW50IHRvIGFpbSBmb3IKKwkgIGFuIGludGVydmFsIGR1cmF0aW9uIGRlcGVuZGluZyBvbiBmcHMgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIG9sZAorCSAgZml4ZWQgZGVmYXVsdC4KKworMjAxMS0wMS0xNCAxNToxNjowNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IHJldmVyc2UgcGxheWJhY2s7IG1pbmQga2V5ZnJhbWVzIGZvciBmcmFnbWVudCBib3VuZGFyeQorCisyMDExLTAxLTEzIDE1OjI2OjIxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSAgYW1ycGFyc2U6IHByb3Blcmx5IGNoZWNrIGZvciBzdWZmaWNpZW50IGF2YWlsYWJsZSBkYXRhIHByaW9yIHRvIGFjY2VzcworCisyMDExLTAxLTEyIDE0OjQwOjM3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogZW5zdXJlIG5vbi1lbXB0eSBjYW5kaWRhdGUgZnJhbWVzCisKKzIwMTEtMDEtMTEgMTU6MjQ6MjMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBjbGFyaWZ5IHNvbWUgZGVidWcgc3RhdGVtZW50cworCisyMDExLTAxLTExIDE1OjI0OjAyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogcHJvcGVybHkgdHJhY2sgdXBzdHJlYW0gdGltZXN0YW1wcworCSAgLi4uIHJhdGhlciB0aGFuIHdpdGggYSBkZWxheS4KKworMjAxMS0wMS0xMSAxNToyMzoyOSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IG5lZWQgcHJvcGVyIGZyYW1lIGR1cmF0aW9uIHRvIG9idGFpbiBzZW5zaWJsZSBmcmFtZSBiaXRyYXRlCisKKzIwMTEtMDEtMTEgMTU6MjI6NTEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBwcm9wZXIgaW5pdGlhbCB2YWx1ZXMgZm9yIGluZGV4IHRyYWNraW5nIHZhcmlhYmxlcworCisyMDExLTAxLTExIDEyOjA1OjEzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogYXJyYW5nZSBmb3IgY29uc2lzdGVudCBldmVudCBoYW5kbGluZworCisyMDExLTAxLTEwIDE2OjU5OjU5ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuaDoKKwkgIGJhc2VwYXJzZTogaGVhZGVyIHN0eWxlIGNsZWFuaW5nCisKKzIwMTEtMDEtMTAgMTc6MDc6MzggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBwcm92aWRlIHNvbWUgbW9yZSBpbml0aWFsIGZyYW1lIG1ldGFkYXRhIGluIHBhcnNlX2ZyYW1lCisJICAuLi4gYW5kIGRvY3VtZW50IGFjY29yZGluZ2x5LgorCisyMDExLTAxLTEwIDE2OjU2OjM2ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiByZWZhY3RvciBwYXNzdGhyb3VnaCBpbnRvIGZvcm1hdCBmbGFncworCSAgQWxzbyBhZGQgYSBmb3JtYXQgZmxhZyB0byBzaWduYWwgYmFzZXBhcnNlIHRoYXQgc3ViY2xhc3MvZm9ybWF0IGNhbiBwcm92aWRlCisJICAocGFyc2VkKSB0aW1lc3RhbXAgcmF0aGVyIHRoYW4gYW4gZXN0aW1hdGVkIG9uZS4gIEluIHBhcnRpY3VsYXIsIHN1Y2ggInN0cm9uZyIKKwkgIHRpbWVzdGFtcCB0aGVuIGFsbG93cyB0byBlLmcuIGRldGVybWluZSBkdXJhdGlvbi4KKworMjAxMS0wMS0xMCAxNTozNDo0OCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5oOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogaW50cm9kdWNlIGEgYmFzZXBhcnNlIGZyYW1lIHRvIHNlcnZlIGFzIGNvbnRleHQKKwkgIC4uLiBhbmQgYWRqdXN0IHN1YmNsYXNzIHBhcnNlcnMgYWNjb3JkaW5nbHkKKworMjAxMS0wMS0wNyAxNjozOTo1MSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5oOgorCSAgYmFzZXBhcnNlOiByZXN0cmljdCBkdXJhdGlvbiBzY2FubmluZyB0byBwdWxsIG1vZGUgYW5kIGF2b2lkIGV4dHJhIHNldF9jYXBzIGNhbGwKKworMjAxMS0wMS0wNyAxNTo1ODo0OSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5oOgorCSAgYmFzZXBhcnNlOiB1cGRhdGUgc29tZSBkb2N1bWVudGF0aW9uCisJICBBbHNvIGFkZCBzb21lIG1vcmUgZGVidWcuCisKKzIwMTEtMDEtMDYgMTE6NDE6NDQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBhbGxvdyBpbmNyZWFzaW5nIG1pbl9zaXplIGZvciBjdXJyZW50IGZyYW1lIHBhcnNpbmcgb25seQorCSAgQWxzbyBjaGVjayB0aGF0IHN1YmNsYXNzIGFjdHVhbGx5IGVpdGhlciBkaXJlY3RzIHRvIHNraXAgYnl0ZXMgb3IKKwkgIGluY3JlYXNlcyBleHBlY3RlZCBmcmFtZSBzaXplIHRvIGF2b2lkIGdvaW5nIG5vd2hlcmUgaW4gYm9ndXMKKwkgIGluZGVmaW5pdGUgbG9vcGluZy4KKworMjAxMS0wMS0xNCAxNToyNjozNyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYWVzcGFyc2U6IGZpeCByZWZhY3RvciByZWdyZXNzaW9uIGluIGxvb3AgYmFzZWQgcGFyc2luZworCisyMDExLTAxLTA2IDExOjE2OjU2ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogcGFzcyBhbGwgYXZhaWxhYmxlIGRhdGEgdG8gc3ViY2xhc3MgcmF0aGVyIHRoYW4gbWluaW11bQorCSAgQWxzbyByZWR1Y2Ugc29tZSBhZGFwdGVyIGNhbGxzIGFuZCBhZGQgYSBmZXcgZGVidWcgc3RhdGVtZW50cy4KKworMjAxMC0xMi0xMCAxNTo1OTo0OSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IGZpeCByZXZlcnNlIHBsYXliYWNrIGhhbmRsaW5nCisKKzIwMTAtMTItMTAgMTQ6NTY6MTMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBtaW5vciB0eXBvIGFuZCBkZWJ1ZyBzdGF0ZW1lbnQgY2xlYW51cAorCisyMDEwLTEyLTEwIDE0OjQwOjA1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmg6CisJICBiYXNlcGFyc2U6IHJlZHVjZSBsb2NraW5nCisJICAuLi4gd2hpY2ggaXMgZWl0aGVyIGFscmVhZHkgbXV0ZSBhbmQvb3IgaW1wbGljaXRseSBoYW5kbGVkIGJ5IFNUUkVBTV9MT0NLLgorCisyMDExLTAxLTE0IDE0OjA4OjM4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogYXZvaWQgbG9vcCBpbiBmcmFtZSBsb2NhdGluZyBpbnRlcnBvbGF0aW9uCisKKzIwMTEtMDEtMTkgMTg6MjY6MzAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBtaW5kIGdzdF9idWZmZXJfdW5yZWYgbm90IGxpa2luZyBOVUxMCisJICBGaXhlcyAjNjM5OTUwLgorCisyMDExLTAxLTE0IDE2OjMwOjExIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2VyczogYmFzZXBhcnNlOiBCZSBjYXJlZnVsIHRvIG5vdCBsb3NlIHRoZSBldmVudCByZWYKKwkgIERvbid0IHVucmVmIHRoZSBldmVudCBpZiBpdCBoYXNuJ3QgYmVlbiBoYW5kbGVkLCBiZWNhdXNlIHRoZSBjYWxsZXIKKwkgIGFzc3VtZXMgaXQgaXMgc3RpbGwgdmFsaWQgYW5kIG1pZ2h0IHJldXNlIGl0LgorCSAgSSByYW4gaW50byB0aGlzIHByb2JsZW0gd2hlbiB0cmFuc2NvZGluZyBhbiBBVkkgKHdpdGggbXAzIGluc2lkZSkKKwkgIHRvIGdwcC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Mzk1NTUKKworMjAxMS0wMS0xMyAxNzoxMDoxMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkgIGRjYXBhcnNlOiBmaXggc3luYyB3b3JkIGZvciAxNC1iaXQgbGl0dGxlIGVuZGlhbiBjb2RpbmcKKwkgIEZpeCBjb3B5J24ncGFzdGUgYnVnIHRoYXQgbWFkZSB1cyBsb29rIGZvciB0aGUgcmF3IGxpdHRsZSBlbmRpYW4KKwkgIHN5bmMgd29yZCB0d2ljZSBpbnN0ZWFkIG9mIGxvb2tpbmcgZm9yIHRoZSAxNC1iaXQgTEUgc3luYyB3b3JkCisJICBhcyB3ZWxsLiBGaXhlcyBwYXJzaW5nIG9mIHN1Y2ggc3RyZWFtcyAoc2VlICM2MzYyMzQgZm9yIHNhbXBsZSBmaWxlKS4KKworMjAxMS0wMS0xMyAxNjoyNzowNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBkb2NzOiBtaW5vciBiYXNlcGFyc2UgZG9jcy9jb21tZW50IGZpeGVzCisJICBSZW1vdmUgY29weSduJ3Bhc3RlIGxlZnRvdmVycy4KKworMjAxMS0wMS0wNiAxMjo0OTo0MyArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IEZpeCB1bml0aWFsaXplZCB2YXJpYWJsZSBvbiBtYWNvc3gKKworMjAxMC0xMi0xMyAxNToxNzoyOSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkgIGFjM3BhcnNlOiByZWxheCBic2lkIGNoZWNraW5nCisJICAuLi4gdG8gdGhlIHdpZGVzdCBwb3NzaWJsZSBzcGVjIGludGVycHJldGF0aW9uLgorCSAgRml4ZXMgIzYzNzA2Mi4KKworMjAxMC0xMi0wMyAxODoxMTo1NiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2VyczogdXBkYXRlIHNvbWUgZG9jdW1lbnRhdGlvbgorCisyMDEwLTEyLTAzIDE4OjExOjM4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgbXBlZ2F1ZGlvcGFyc2U6IGFkZCB0byBkb2N1bWVudGF0aW9uCisKKzIwMTAtMTItMDMgMTg6MTE6MDkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmM6CisJICBkY2FwYXJzZTogYWRkIHRvIGRvY3VtZW50YXRpb24KKworMjAxMC0xMS0wOCAxOTo1ODozMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IGluY3JlYXNlIGtleWZyYW1lIGF3YXJlbmVzcworCSAgLi4uIHdoaWNoIGlzIG5vdCBwYXJ0aWN1bGFyIHJlbGV2YW50IGZvciBhdWRpbyBwYXJzaW5nLCBidXQgbW9yZSBzbworCSAgaW4gdmlkZW8gY2FzZXMuICBJbiBwYXJ0aWN1bGFyLCBhdXRvLWRldGVybWluZSBpZiBkZWFsaW5nIHdpdGggdmlkZW8gKGNhcHMpLgorCisyMDEwLTEyLTAxIDE1OjI4OjUzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5oOgorCSAgYWMzcGFyc2U6IHVzZSBwcm9wZXIgRUFDLTMgY2FwcworCisyMDEwLTExLTMwIDE1OjQxOjAyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogYXZvaWQgdW5leHBlY3RlZCBzdHJheSBtZXRhZGF0YQorCisyMDEwLTExLTMwIDE1OjQwOjI4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogdXNlIHByb3BlciBfTk9ORSBvdXRwdXQgdmFsdWUgd2hlbiBhcHBsaWNhYmxlCisKKzIwMTAtMTEtMjUgMTg6NTY6NDIgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IFJlbW92ZSBkZWFkIGFzc2lnbm1lbnRzCisKKzIwMTAtMTEtMjUgMTc6MTQ6MjMgKzAxMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8YW1vcmFsZXNAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2U6IGZpeCBwb3NzaWJsZSBkaXZpc2lvbi1ieS16ZXJvCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjM1Nzg2CisKKzIwMTAtMTEtMTcgMTY6MjM6NDIgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiB1c2UgY29ycmVjdCBvZmZzZXQgd2hlbiBhZGRpbmcgaW5kZXggZW50cnkKKwkgIC4uLiBiZWFyaW5nIGluIG1pbmQgdGhhdCBCVUZGRVJfT0ZGU0VUIGlzIG1lZGlhIHNwZWNpZmljIGFuZCBtYXkgbm90CisJICByZWZsZWN0IHRoZSBiYXNpYyBvZmZzZXQgYWZ0ZXIgaGF2aW5nIGJlZW4gcGFyc2VkLgorCisyMDEwLTExLTE3IDE0OjMwOjA5ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogZW5oYW5jZW1lbnRzIGZvciB0aW1lc3RhbXAgbWFya2VkIGZyYW1lZCBmb3JtYXRzCisJICBUaGF0IGlzLCBhcyBzdWNoIGZvcm1hdHMgYWxsb3cgc3ViY2xhc3MgdG8gZXh0cmFjdCBwb3NpdGlvbiBmcm9tIGZyYW1lLAorCSAgaXQgaXMgcG9zc2libGUgdG8gZXh0cmFjdCBkdXJhdGlvbiAoaWYgbm90IG90aGVyd2lzZSBwcm92aWRlZCkKKwkgIGZyb20gKG5lYXIpIGxhc3QgZnJhbWUsIGFuZCBhIHNlZWsgY2FuIGZhaXJseSBhY2N1cmF0ZWx5IHRhcmdldCB0aGUgcmVxdWlyZWQKKwkgIHBvc2l0aW9uLgorCSAgRml4ZXMgIzYzMTM4OS4KKworMjAxMC0xMS0xNiAxNzowNjoxNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IHJlZmFjdG9yIGZyYW1lIHNjYW5uaW5nIHBlZm9ybWVkIGJ5IF9sb29wCisKKzIwMTAtMTEtMTYgMTg6MDQ6MDAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBzbGlnaHRseSBvcHRpbWl6ZSBzZW5kaW5nIG9mIHBlbmRpbmcgbmV3c2VnbWVudCBldmVudHMKKworMjAxMC0xMS0xNiAxNzowNDozNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IG1pbm9yIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMKKwkgIEFycmFuZ2UgZm9yIHVwc3RyZWFtIGFzIHdlbGwgYXMgZG93bnN0cmVhbSBmbHVzaGluZyB3aGVuIHNlZWtpbmcuCisJICBBbHNvIGRldGVybWluZSB1cHN0cmVhbSBzaXplIGFzIHdlbGwgYXMgc2Vla2FiaWxpdHkuICBBZGp1c3Qgc29tZSBjb21tZW50cworCSAgdG8gcmVhbGl0eSBhbmQgZW1wbG95IGRlYnVnIHN0YXRlbWVudCBpbiBwcm9wZXIgb3JkZXIuCisKKzIwMTAtMTEtMTcgMTU6MzM6MzYgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogbWlub3IgY2xlYW51cHMKKworMjAxMC0xMS0xNyAxNToyNDozNyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBmaXggcmVncmVzc2lvbiBpbiBBRElGIHNyYyBjYXBzIHNldHRpbmcKKworMjAxMC0xMS0xNiAxMjoxMTo1MyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oOgorCSAgZmxhY3BhcnNlOiBwYXJzZSBzZWVrdGFibGUKKwkgIEZpeGVzICM2MzEzODkgKHBhcnRpYWxseSkuCisKKzIwMTAtMTEtMTYgMTI6MDg6NTQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBtaW5vciByZWZhY3RvciBhbmQgZW5hYmxlIGRlZmF1bHQgYmFzZXBhcnNlIHNlZ21lbnQgY2xpcHBpbmcKKworMjAxMC0xMS0wOSAxOTozODoyNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIG1wZWdhdWRpb3BhcnNlOiBmaXggc2lsbHkgbGVhayBpbiBfcmVzZXQKKworMjAxMC0xMC0yOSAxNDowODo1OCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IHVzZSBvbmx5IHVwc3RyZWFtIGR1cmF0aW9uIGlmIGl0IHByb3ZpZGVzIG9uZQorCisyMDEwLTEwLTI1IDE0OjE1OjUwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogcmVmbG93IHVwZGF0ZV9iaXRyYXRlIGNvZGUKKwkgIC4uLiB3aGljaCBtYWtlcyBsb2NhbCB2YXJpYWJsZXMgcmVwcmVzZW50IHJlYWwgc3RhdGUgYmV0dGVyLCBhbmQgYXZvaWRzCisJICB0cmlnZ2VyaW5nIHVubmVlZGVkIHVwZGF0ZXMvYWN0aW9ucy4KKworMjAxMC0xMC0yNSAxNDoxMzo1MSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IGFkZCBzb21lIGRlYnVnIHN0YXRlbWVudHMKKworMjAxMC0xMC0xOSAyMzoyNTo1NCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkgIGRjYXBhcnNlOiBpbml0IHZhcmlhYmxlIHRvIG1ha2Ugb3N4IGJ1aWxkIGJvdCBoYXBweQorCSAgZ3N0ZGNhcGFyc2UuYzogSW4gZnVuY3Rpb24gJ2dzdF9kY2FfcGFyc2VfY2hlY2tfdmFsaWRfZnJhbWUnOgorCSAgZ3N0ZGNhcGFyc2UuYzoyNDY6IHdhcm5pbmc6ICdiZXN0X3N5bmMnIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbgorCisyMDEwLTEwLTE5IDAwOjE1OjIwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvcGx1Z2luLmM6CisJICBhdWRpb3BhcnNlcnM6IGFkZCB2ZXJ5IGJhc2ljIGR0cy9kY2EgcGFyc2VyCisJICBTdGlsbCBzb21lIGlzc3VlcywgZS5nLiB3aXRoIHNlZWthYmxlIHF1ZXJpZXMgaW4gdG90ZW0sIGJ1dCBhbHNvCisJICBwcm9jZXNzaW5nIGFscmVhZHktY2h1bmtlZCBpbnB1dCAoY3JlYXRlZCB3aXRoIG1hdHJvc2thZGVtdXggISBnZHBwYXkpLgorCisyMDEwLTEwLTE0IDE2OjQ4OjIxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IHByb3Blcmx5IHBhcnNlIGUtYWMzIGZyYW1lIGhlYWRlcgorCSAgQWxzbyBhZGQgYSBmZXcgZGVidWcgc3RhdGVtZW50cy4KKworMjAxMC0xMC0xMyAxMTowMDowMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IHR3ZWFrIHNldHRpbmcgYnVmZmVyIG1ldGFkYXRhOyBhdm9pZCB0aW1lc3RhbXAgaml0dGVyCisJICBGaXhlcyAjNjMxOTkzLgorCisyMDEwLTEwLTEyIDE4OjA3OjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5oOgorCSAgYWFjcGFyc2U6IHN0cmVhbWxpbmUgc3JjIGNhcHMgc2V0dGluZworCSAgSW4gcGFydGljdWxhciwgYWxzbyBzZXQgc3JjIGNhcHMgd2hlbmV2ZXIgY2hhbmdlcyBpbiBzdHJlYW0gd2FycmFudCBkb2luZyBzby4KKworMjAxMC0xMC0xMiAxMDoyODozMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBBZGp1c3QgdW5pdCB0ZXN0cyB0byBuZXcgZmxhY3BhcnNlIGJlaGF2aW91cgorCSAgR2FyYmFnZSBhZnRlciBmcmFtZXMgaXMgbm93IGluY2x1ZGVkIGluIHRoZSBmcmFtZXMgYmVjYXVzZSBmbGFjcGFyc2UKKwkgIGhhcyBubyBlYXN5IHdheSB0byBkZXRlY3QgdGhlIHJlYWwgZW5kIG9mIGEgZnJhbWUuIERlY29kZXJzIGFyZQorCSAgZXhwZWN0ZWQgdG8gZXZlcnl0aGluZyBhZnRlciB0aGUgZnJhbWUgYmVjYXVzZSBvbmx5IGRlY29kaW5nIHRoZQorCSAgYml0c3RyZWFtIHdpbGwgcmV2ZWFsIHRoZSByZWFsIGVuZCBvZiB0aGUgZnJhbWUuCisJICBGaXhlcyBidWcgIzYzMTgxNC4KKworMjAxMC0xMC0xMiAxMDoyNzo1MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IERvbid0IGRyb3AgdGhlIGxhc3QgZnJhbWUgaWYgaXQgaXMgZm9sbG93ZWQgYnkgZ2FyYmFnZQorCSAgU2VlIGJ1ZyAjNjMxODE0LgorCisyMDEwLTEwLTExIDE3OjQ5OjQ2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogcGVyZm9ybSBiaXRyYXRlIGhhbmRsaW5nIGFuZCBwb3N0aW5nIGFmdGVyIG5ld3NlZ21lbnQgc2VuZGluZworCisyMDEwLTEwLTExIDE3OjM2OjE5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogaW1tZWRpYXRlbHkgcG9zdCBzdWJjbGFzcyBwcm92aWRlZCBiaXRyYXRlCisKKzIwMTAtMTAtMTEgMTc6MDY6NDggKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBmaXggcGFyc2luZyB3aXRoIHVua25vd24gZnJhbWVzaXplcworCSAgRml4ZXMgIzYzMTgxNCAobW9zdGx5KS4KKworMjAxMC0xMC0wNyAyMzozNzozNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IFNpbXBsaWZ5IGZyYW1lIGhlYWRlciBwYXJzaW5nIGJ5IHVzaW5nIGxvb2t1cCB0YWJsZXMKKwkgIEJhc2VkIG9uIGEgcGF0Y2ggYnkgRmVsaXBlIENvbnRyZXJhcy4KKwkgIFNlZSBidWcgIzYzMTIwMC4KKworMjAxMC0xMC0wNyAyMzoyODowOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oOgorCSAgZmxhY3BhcnNlOiBEb24ndCBwYXJzZSB0aGUgY29tcGxldGUgRkxBQyBmcmFtZXMgYnV0IG9ubHkgbG9vayBmb3IgdmFsaWQgZnJhbWUgaGVhZGVycworCSAgVGhhbmtzIHRvIEZlbGlwZSBDb250cmVyYXMgZm9yIHRoZSBzdWdnZXN0aW9uLiBUaGlzIGlzIHBhcnRpYWxseQorCSAgYmFzZWQgb24gaGlzIHBhdGNoZXMgYW5kIG1ha2VzIGZsYWNwYXJzZSBtb3JlIHRoYW4gMy41IHRpbWVzIGZhc3Rlci4KKwkgIExvb2tpbmcgZm9yIHZhbGlkIGZyYW1lIGhlYWRlcnMgaXMgdW5saWtlbHkgdG8gZ2l2ZSBmYWxzZSBwb3NpdGl2ZXMKKwkgIGJlY2F1c2UgZXZlcnkgZnJhbWUgaGVhZGVyIGlzIGF0IGxlYXN0IDkgYnl0ZXMgbG9uZywgY29udGFpbnMgYQorCSAgMTQgYml0IHN5bmMgY29kZSBhbmQgYSA4IGJpdCBjaGVja3N1bSBvdmVyIHRoZSBmaXJzdCA4IGJ5dGVzLgorCSAgRml4ZXMgYnVnICM2MzEyMDAuCisKKzIwMTAtMTAtMDYgMTg6MzI6NTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBSZWFsbHkgcG9zdCB0YWdzIG9ubHkgYWZ0ZXIgdGhlIGluaXRpYWwgbmV3c2VnbWVudCBldmVudAorCSAgVGhlIGZpcnN0IG5ld3NlZ21lbnQgZXZlbnQgd2lsbCBiZSBzZW5kIGJ5IHRoZSBmaXJzdCBjYWxsIHRvCisJICBnc3RfYmFzZV9wYXJzZV9wdXNoX2J1ZmZlcigpIGlmIG5lY2Vzc2FyeSwgcG9zdGluZyB0aGUgdGFncworCSAgYmVmb3JlIHRoYXQgaXMgbm90IGEgZ29vZCBpZGVhLiBJbnN0ZWFkIGRvIGl0IGZyb20gdGhlCisJICBHc3RCYXNlUGFyc2U6OnByZV9wdXNoX2J1ZmZlciB2ZnVuYy4KKworMjAxMC0xMC0wNSAxMToxNzo1MiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBSZXZlcnQgImJhc2VwYXJzZTogYWRkIHNraXAgcHJvcGVydHkiCisJICBUaGlzIHJldmVydHMgY29tbWl0IGI1YTNkNjAzNjNkODM3YTEwZjA1MzNjMTQxZWM5M2QxMGI3NDIzMTIuCisJICBSZXZlcnRpbmcgdGhpcyBmb3Igbm93LCBzaW5jZSBubyBvbmUgcmVhbGx5IHNlZW1zIHRvIHJlbWVtYmVyIHdoeSB0aGlzCisJICBwcm9wZXJ0eSBleGlzdHMgb3Igd2hhdCBpdCBjb3VsZCBwb3NzaWJseSBiZSBnb29kIGZvci4gSXQgc2VlbXMgdG8gaGF2ZQorCSAgYmVlbiBpbiB0aGUgb3JpZ2luYWwgbXAzcGFyc2Ugc2luY2UgdGhlIGJlZ2lubmluZyBvZiB0aW1lIGFuZCB3YXMgYmFjay0KKwkgIHBvcnRlZCBmcm9tIHRoZXJlLgorCisyMDEwLTEwLTA0IDEwOjQxOjUyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogRml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgY29tcGlsZXIgd2FybmluZ3MKKwkgIFRoZXNlIHdhcm5pbmdzIGFyZSB3cm9uZywgdGhlIHZhcmlhYmxlcyBhcmUgb25seSB1c2VkIGlmIHRoZXkgd2VyZQorCSAgaW5pdGlhbGl6ZWQgYnkgdGhlIGJpdCByZWFkZXIuCisKKzIwMTAtMDktMTQgMDI6NDg6NTggKzAzMDAgIEZlbGlwZSBDb250cmVyYXMgPGZlbGlwZS5jb250cmVyYXNAZ21haWwuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBmaXggcGljdHVyZSBwYXJzaW5nCisJICBTaWduZWQtb2ZmLWJ5OiBGZWxpcGUgQ29udHJlcmFzIDxmZWxpcGUuY29udHJlcmFzQGdtYWlsLmNvbT4KKworMjAxMC0xMC0wMyAyMzo1NDo0OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IFB1c2ggdGFncyBiZWZvcmUgdGhlIGhlYWRlciBidWZmZXJzIGFyZSBwdXNoZWQKKworMjAxMC0wOC0wMiAyMDo1MDoyMSArMDMwMCAgRmVsaXBlIENvbnRyZXJhcyA8ZmVsaXBlLmNvbnRyZXJhc0BnbWFpbC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IHRyaXZpYWwgY2FwcyBmaXgKKwkgIFNpZ25lZC1vZmYtYnk6IEZlbGlwZSBDb250cmVyYXMgPGZlbGlwZS5jb250cmVyYXNAZ21haWwuY29tPgorCisyMDEwLTEwLTAzIDIzOjUwOjI5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2VyOiBMZXQgdGhlIGZvcm1hdCBzdHJpbmcgYWdyZWUgd2l0aCB0aGUgcGFyYW1ldGVycyB0byBmaXggY29tcGlsZXIgd2FybmluZworCisyMDEwLTEwLTAzIDE1OjQxOjIwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IFVzZSB1bmNoZWNrZWQgdmVyc2lvbnMgb2YgdGhlIGJpdHJlYWRlciBnZXQgZnVuY3Rpb25zCisJICBXZSBkaWRuJ3QgY2hlY2sgdGhlIHJldHVybiB2YWx1ZXMgYW55d2F5Li4uCisKKzIwMTAtMDktMjIgMTU6NDQ6NDMgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBGaXggZGVidWcgb3V0cHV0CisJICBXZSBsb3NlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBhZnRlciBnc3RfcGFkX3B1c2goKSwgc28gdGhlIGRlYnVnCisJICBwcmludCBzaG91bGQgaGFwcGVuIGJlZm9yZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MjIyNzYKKworMjAxMC0xMC0wMSAxMjozNDo1NSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsYWNwYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcGFyc2VyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9wYXJzZXIuaDoKKwkgIGF1ZGlvcGFyc2VyczogYWRkIGZsYWNwYXJzZSB1bml0IHRlc3QKKwkgIC4uLiBhbmQgdHdlYWsgcGFyc2VyIHRlc3QgaGVscGVyIGluIHRoZSBwcm9jZXNzLgorCisyMDEwLTA5LTI5IDE2OjEyOjQyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogc3VwcG9ydCByZXZlcnNlIHBsYXliYWNrCisJICAuLi4gaW4gcHVsbCBtb2RlIG9yIHVwc3RyZWFtIGRyaXZlbi4KKworMjAxMC0wOS0yNyAxMjoxNjo0MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IHJlbW92ZSBkb25lIFRPRE9zIGFuZCB1cGRhdGUgZG9jdW1lbnRhdGlvbgorCisyMDEwLTA5LTI1IDE0OjQwOjU0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogdXNlIGRldGVybWluZWQgc2Vla2FiaWxpdHkgaW4gYW5zd2VyaW5nIFNFRUtJTkcgcXVlcnkKKworMjAxMC0wOS0yNSAxNDozMjowNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IGFkZCBza2lwIHByb3BlcnR5CisKKzIwMTAtMDktMjUgMTM6NTk6MzkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hYzNwYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2VyczogYWRkIGFjM3BhcnNlIGFuZCBtcGVnYXVkaW9wYXJzZSB1bml0IHRlc3QKKworMjAxMC0wOS0yNSAxMzo1OToxOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jOgorCSAgbXBlZ2F1ZGlvcGFyc2U6IGluaXRpYWwgdmVyc2lvbgorCSAgLi4uIGFkZXF1YXRlbHkgZXF1aXZhbGVudCB0byBtcDNwYXJzZSwgc28gbGV0cyBib2xkbHkgc2V0IGl0CisJICB0byBoaWdoZXIgcmFuay4KKworMjAxMC0wOS0yNSAxNDowMTowNyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBzZXQgbWluaW11bSBmcmFtZSBzaXplIGF0IF9zdGFydAorCSAgLi4uIHJhdGhlciB0aGFuIG9uZSB0aW1lIGF0IF9pbml0LgorCisyMDEwLTA5LTI1IDEzOjUwOjUxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYWFjcGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FtcnBhcnNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9wYXJzZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3BhcnNlci5oOgorCSAgYXVkaW9wYXJzZXJzOiByZWZhY3RvciBleGlzdGluZyB1bml0IHRlc3RzIHVzaW5nIGNvbW1vbiBoZWxwZXIKKworMjAxMC0wOS0yMiAxNTowNzowOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5oOgorCSAgYmFzZXBhcnNlOiB1c2UgX3NldF9mcmFtZV9wcm9wcyB0byBjb25maWd1cmUgZnJhbWUgbGVhZF9pbiBhbmQgbGVhZF9vdXQKKwkgIC4uLiBwcm92aWRlZCBhIGNvcnJlc3BvbmRpbmcgZGVjb2RlciB3aXRoIHN1ZmZpY2llbnQgbGVhZGluZyBhbmQgZm9sbG93aW5nCisJICBmcmFtZXMgdG8gY2Fycnkgb3V0IGZ1bGwgZGVjb2RpbmcgZm9yIGEgcGFydGljdWxhciBzZWdtZW50LgorCisyMDEwLTA5LTIyIDE0OjEzOjE3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiB1c2UgX3NldF9kdXJhdGlvbiB0byBjb25maWd1cmUgZHVyYXRpb24gdXBkYXRlIGludGVydmFsCisJICAuLi4gYXMgaXQgbG9naWNhbGx5IGJlbG9uZ3MgdGhlcmUgYXMgb25lIG9yIHRoZSBvdGhlcjsgZWl0aGVyIHN1YmNsYXNzCisJICBjYW4gcHJvdmlkZSBhIGR1cmF0aW9uLCBvciBhbiBlc3RpbWF0ZSBtdXN0IGJlIG1hZGUgKHJlZ3Vhcmx5IHVwZGF0ZWQpLgorCisyMDEwLTA5LTIyIDEzOjU1OjIwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogbG9jYWxpemUgdXNlIG9mIHByb3ZpZGVkIGZwcyBpbmZvcm1hdGlvbgorCisyMDEwLTA5LTIyIDEyOjEzOjEyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogc2VlayB0YWJsZSBhbmQgYWNjdXJhdGUgc2VlayBzdXBwb3J0CisKKzIwMTAtMDktMjEgMTM6NTc6MTAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBwcm9wZXIgYW5kIG1vcmUgZXh0ZW5kZWQgc2VnbWVudCBhbmQgc2VlayBoYW5kbGluZworCSAgVGhhdCBpcywgbG9vcCBwYXVzZSBoYW5kbGluZywgc2VnbWVudCBzZWVrIHN1cHBvcnQsIG5ld3NlZ21lbnQgZm9yIGdhcHMsIGV0YworCisyMDEwLTA5LTIxIDEwOjU3OjA0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmg6CisJICBiYXNlcGFyc2U6IGFkZCBpbmRleCBzdXBwb3J0CisKKzIwMTAtMDktMjEgMDk6NTk6NTYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiByZWZhY3RvciBzdGF0ZSByZXNldAorCisyMDEwLTA5LTIwIDE2OjM5OjM3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogcHJldmVudCBpbmRlZmluaXRlIHJlc3luY2luZworCisyMDEwLTA5LTIwIDEzOjU3OjU1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogc3BlY2lmaWMgRU9TIGhhbmRsaW5nIGlmIG5vIG91dHB1dCBzbyBmYXIKKworMjAxMC0wOS0yMCAxMzozMTo1NyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IGFkanVzdCBfc2V0X2ZyYW1lX3Byb3AgZG9jdW1lbnRhdGlvbiBhbmQgc2V0IGRlZmF1bHQgYXMgY2xhaW1lZAorCisyMDEwLTA5LTIwIDEzOjMwOjU0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogZml4IGJpdHJhdGUgY29weS1hbmQtcGFzdGUgYW5kIHVwZGF0ZSBoZXVyaXN0aWMKKworMjAxMC0wOS0xNyAxODozMzoyOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IHBvc3QgZHVyYXRpb24gbWVzc2FnZSBpZiBhdmVyYWdlIGJpdHJhdGVzIGlzIHVwZGF0ZWQKKworMjAxMC0wOS0xNyAxODoyNDoyMiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5oOgorCSAgYmFzZXBhcnNlOiByZW1vdmUgaXNfc2Vla2FibGUgdm1ldGhvZCBhbmQgdXNlIGEgc2V0X3NlZWsgaW5zdGVhZAorCSAgU2Vla2FiaWxpdHksIGxpa2UgZHVyYXRpb24sIGV0YyBpcyB1bmxpa2VseSB0byBjaGFuZ2UgKGZyZXF1ZW50bHkpLCBhbmQKKwkgIHRoZSBkZWZhdWx0IGFzc3VtcHRpb24gY292ZXJzIG1vc3QgY2FzZXMsIHNvIGxldCBzdWJjbGFzcyBzZXQgd2hlbiBuZWVkZWQuCisJICBBdCB0aGUgc2FtZSB0aW1lLCBhbGxvdyBzdWJjbGFzcyB0byBpbmRpY2F0ZSBpZiBpdCBoYXMgc2Vlay1tZXRhZGF0YSAodGFibGUpCisJICBhdmFpbGFibGUsIGFuZCBwb3NzaWJseSBoYXZlIGl0IHByb3ZpZGUgYW4gYXZlcmFnZSBiaXRyYXRlLgorCisyMDEwLTA5LTE3IDE3OjM1OjQwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IHJlbW92ZSByZWR1bmRhbnQgZGVmYXVsdCBpc19zZWVrYWJsZQorCisyMDEwLTA5LTE3IDE3OjIxOjQ2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmg6CisJICBiYXNlcGFyc2U6IGFkZCBhbm90aGVyIGhvb2sgZm9yIHN1YmNsYXNzIHByaW9yIHRvIHB1c2hpbmcgYnVmZmVyCisJICAuLi4gYW5kIGFsbG93IHN1YmNsYXNzIHRvIHBlcmZvcm0gY3VzdG9tIHNlZ21lbnQgY2xpcHBpbmcsIG9yIHRvCisJICBlbWl0IHRhZ3Mgb3IgbWVzc2FnZXMgYXQgdGhpcyB0aW1lLgorCisyMDEwLTA5LTE3IDE3OjE5OjM3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogMCBjb252ZXJ0cyB0byAwIGJ5IGRlZmF1bHQKKworMjAxMC0wOS0xNiAxODo1Njo0NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5oOgorCSAgYmFzZXBhc2U6IHJlZmFjdG9yIGNvbnZlcnNpb24gdXNpbmcgaGVscGVyIGZ1bmN0aW9uIGFuZCBleHBvcnQgZGVmYXVsdCBjb252ZXJ0CisKKzIwMTAtMDktMTYgMTg6MzU6NDcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBzdHJlYW1saW5lIHF1ZXJ5IGhhbmRsaW5nCisKKzIwMTAtMDktMTYgMTE6NTE6MjAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuaDoKKwkgIGJhc2VwYXJzZTogY2xlYW51cCBzdHJ1Y3QgYW5kIHJlbW92ZSB1bnVzZWQgbWVtYmVyCisKKzIwMTAtMDgtMTYgMTE6MDQ6MzcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jOgorCSAgYXVkaW9wYXJzZXJzOiBpbmNyZWFzZSByYW5rcyB0byBlbmFibGUgYXV0by1wbHVnZ2luZworCSAgQmVjYXVzZSB3ZSBjYW4sIGFuZCBzaG91bGQsIGhhdmUgc29tZSBzaGFrZWRvd24gdGVzdGluZyBiZWZvcmUgaGF2aW5nCisJICB0aGVzZSBtYWtlIGl0IGludG8gLWdvb2QgbGF0ZXIgb24gLi4uCisKKzIwMTAtMDktMjIgMTY6MDc6MjQgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBBbGxvdyBjaGFpbmluZyBvZiBzdWJjbGFzcyBldmVudCBoYW5kbGVycworCSAgVGhpcyBhbGxvd3MgdGhlIGNoaWxkIGNsYXNzIHRvIGNoYWluIGl0cyBldmVudCBoYW5kbGVyIHdpdGgKKwkgIEdzdEJhc2VQYXJzZSwgc28gdGhhdCBzdWJjbGFzc2VzIGRvbid0IGhhdmUgdG8gZHVwbGljYXRlIGFsbCB0aGUgZGVmYXVsdAorCSAgZXZlbnQgaGFuZGxpbmcgbG9naWMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjIyMjc2CisKKzIwMTAtMDgtMjcgMTg6MzU6MTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBEb24ndCB1c2UgR1NUX0ZMT1dfSVNfRkFUQUwoKQorCSAgQWxzbyBkb24ndCBwb3N0IGFuIGVycm9yIG1lc3NhZ2UgZm9yIFVORVhQRUNURUQgYW5kIGRvIGl0CisJICBmb3IgTk9UX0xJTktFRC4KKworMjAxMC0wOS0wNiAxNDoxMjowMCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IG5vbi1USU1FIHNlZWsgZXZlbnQgaXMgc2ltcGx5IG5vdCBoYW5kbGVkCisKKzIwMTAtMDYtMTUgMTU6MzQ6MDUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBmaXggc2VlayBldmVudCByZWYgaGFuZGxpbmcKKworMjAxMC0wNi0xNSAxNTozMzozNyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IHByZXZlbnQgYXJpdGhtZXRpYyBvdmVyZmxvd3MgaW4gcHVsbCBtb2RlIGJ1ZmZlciBjYWNoZSBoYW5kbGluZworCisyMDEwLTA2LTE1IDE1OjMyOjM0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogZml4IHNlZWsgaGFuZGxpbmcKKwkgIEFsbG93IGEgZmV3IG1vcmUgc2VlayBldmVudCB0eXBlIGNvbWJpbmF0aW9ucywgYW5kIHJlYWxseSB1c2UgdGhlIHJlc3VsdAorCSAgb2YgZ3N0X3NlZ21lbnRfc2V0X3NlZWsgdG8gcGVyZm9ybSB0aGUgc2Vlay4gIEFsc28gYWRkIHNvbWUgZGVidWcuCisKKzIwMTAtMDQtMTIgMTg6MDc6MjkgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FhY3BhcnNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hbXJwYXJzZS5jOgorCSAgY2hlY2s6IERvbid0IHJlLWRlY2xhcmUgJ0dMaXN0ICpidWZmZXJzJyBpbiB0aGUgdGVzdHMKKwkgIEl0J3MgYW4gZXh0ZXJuYWwgd2hpY2ggbGl2ZXMgaW4gZ3N0Y2hlY2suYy4gUmVkZWNsYXJpbmcgaXQgbWFrZXMgc29tZQorCSAgY29tcGlsZXJzL2FyY2hpdGVjdHVyZXMgdGhpbmsgdGhlICdidWZmZXJzJyBpbiB0aGUgaW5kaXZpZHVhbCB0ZXN0cyBhcmUKKwkgIGEgZGlmZmVyZW50IHN5bWJvbC4uLiBhbmQgdGhlcmVmb3JlIHdlIGVuZCB1cCBjb21wYXJpbmcgaG9sb2RlY2tzIHdpdGgKKwkgIG9yYW5nZXMuCisKKzIwMTAtMDMtMjYgMTg6NTY6NDkgKzAwMDAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBEb24ndCBlbWl0IGJpdHJhdGUgdGFncyB0b28gZWFybHkKKwkgIFdlIHdhaXQgdG8gcGFyc2UgYSBtaW5pbXVtIG51bWJlciBvZiBmcmFtZXMgKDEwLCBhcmJpdHJhcmlseSkgYmVmb3JlCisJICBlbWl0aW5nIGJpdHJhdGUgdGFncyBzbyB0aGF0IG91ciBlYXJseSBlc3RpbWF0ZXMgYXJlIG5vdCB3aWxkbHkKKwkgIGluYWNjdXJhdGUgZm9yIHN0cmVhbXMgdGhhdCBzdGFydCB3aXRoIGEgc2lsZW5jZS4gSWYgdGhlIHN0cmVhbSBlbmRzCisJICBiZWZvcmUgdGhhdCwgd2UganVzdCBlbWl0IHRoZSB0YWdzIGFueXdheS4KKwkgIFdoaWxlIGl0IF93b3VsZF8gYmUgbmljZXIgdG8gYmUgc3BlY2lmeSB0aGUgdGhyZXNob2xkIHRvIHN0YXJ0IHB1c2hpbmcKKwkgIHRoZSB0YWdzIGluIHRlcm1zIG9mIGR1cmF0aW9uLCB0aGlzIHdvdWxkIGludHJvZHVjZSBtb3JlIGNvbXBsZXhpdHkgdGhhbgorCSAgdGhpcyBtZXJpdHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjE0OTkxCisKKzIwMTAtMDMtMjYgMTg6NTg6MzUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuaDoKKwkgIGZsYWNwYXJzZTogT3B0aW9uYWxseSBjaGVjayB0aGUgb3ZlcmFsbCBmcmFtZSBjaGVja3N1bXMgdG9vIGJlZm9yZSBhY2NlcHRpbmcgYSBmcmFtZSBhcyB2YWxpZAorCSAgVGhpcyBpcyBvcHRpb25hbCBiZWNhdXNlIGl0J3MgYSBxdWl0ZSBleHBlbnNpdmUgb3BlcmF0aW9uIGFuZCBpdCdzIHZlcnkKKwkgIHVubGlrZWx5IHRoYXQgYSBub24tZnJhbWUgaXMgZGV0ZWN0ZWQgYXMgZnJhbWUgYWZ0ZXIgdGhlIGhlYWRlciBDUkMgY2hlY2sKKwkgIGFuZCBjaGVja2luZyBhbGwgYml0cyBmb3IgdmFsaWQgdmFsdWVzLiBUaGUgb3ZlcmFsbCBmcmFtZSBjaGVja3N1bXMgYXJlCisJICBtYWlubHkgdXNlZnVsIHRvIGRldGVjdCBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIGVuY29kZWQgcGF5bG9hZC4KKworMjAxMC0wMy0yNiAxODo0MjoyOCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IENoZWNrIHRoZSBDUkMtOCBvZiB0aGUgaGVhZGVycyBiZWZvcmUgYWNjZXB0aW5nIGEgZnJhbWUgYXMgdmFsaWQKKwkgIFRoaXMgbWFrZXMgZmFsc2UtcG9zaXRpdmVzIGR1cmluZyBzZWVraW5nIG11Y2ggbGVzcyBsaWtlbHkgYW5kIGRldGVjdGlvbiBvZgorCSAgdGhlbSBtdWNoIGZhc3Rlci4KKworMjAxMC0wMy0yNiAxODoyMDoyNCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IFNldCB0aGUgbGFzdCBzdG9wIHRvIHRoZSBidWZmZXIgc3RhcnR0aW1lIGlmIHRoZSBkdXJhdGlvbiBpcyBpbnZhbGlkCisJICAuLi5pbnN0ZWFkIG9mIG5vdCBzZXR0aW5nIGl0IGF0IGFsbC4KKworMjAxMC0wMy0yNiAxODoxOTowMCArMDEwMCAgSm9zaHVhIE0uIERvZSA8am9zaEBqb3NoZG9lLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogU2VuZCBORVdTRUdNRU5UIGV2ZW50IHdpdGggY29ycmVjdCBzdGFydCBhbmQgcG9zaXRpb24KKwkgIEluc3RlYWQgb2YgdGFraW5nIHRoZSBsYXN0IHN0b3AgKHdoaWNoIGNvdWxkIGJlIGJ1ZmZlciBlbmR0aW1lIGluc3RlYWQKKwkgIG9mIHN0YXJ0dGltZSkgYWx3YXlzIHRha2UgdGhlIGJ1ZmZlciBzdGFydHRpbWUuCisJICBGaXhlcyBidWcgIzYxNDAxNi4KKworMjAxMC0wMy0yNiAxNjo0OTowMSArMDAwMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IEZpeCBidWZmZXIgcmVmY291bnQgaXNzdWUKKwkgIFdoZW4gY2FsbGVkIGZyb20gdGhlIEdTVF9GTEFDX1BBUlNFX1NUQVRFX0hFQURFUlMgY2FzZSwKKwkgIGdzdF9mbGFjX3BhcnNlX2hhbmRfaGVhZGVycygpIGRvZXMgYSBnc3RfYnVmZmVyX3NldF9jYXBzKCkgb24gYSBidWZmZXIKKwkgIHdpdGggcmVmY291bnQgPiAxLiBUaGlzIGNoYW5nZSBoYW5kbGVzIHRoaXMgY2FzZSBieSBtYWtpbmcgdGhlIGJ1ZmZlcgorCSAgbWV0YWRhdGFfV3JpdGFibGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjE0MDM3CisKKzIwMTAtMDMtMjUgMTc6MDk6MTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuaDoKKwkgIGF1ZGlvcGFyc2VyczogcmVtb3ZlIHVudXNlZCBHc3RCYXNlUGFyc2VDbGFzc1ByaXZhdGUgc3RydWN0dXJlCisKKzIwMTAtMDMtMjUgMTI6NTU6MDIgKzAwMDAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBNYWtlIGJpdHJhdGUgZXN0aW1hdGlvbiBtb3JlIGFjY3VyYXRlCisJICBUaGlzIGltcGxlbWVudHMgdGhlIGdldF9mcmFtZV9vdmVyaGVhZCgpIHZmdW5jIHNvIHRoYXQgYmFzZXBhcnNlIGNhbgorCSAgbWFrZSBtb3JlIGFjY3VyYXRlIGJpdHJhdGUgZXN0aW1hdGVzLgorCisyMDEwLTAzLTI1IDExOjQ4OjQ2ICswMDAwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IEZpeCBiaXRyYXRlIGNhbGN1bGF0aW9uCisJICBUaGlzIHBhdGNoIGFkZHMgdGhlIGdldF9mcmFtZV9vdmVyaGVhZCgpIHZmdW5jIHNvIHRoYXQgYmFzZXBhcnNlIGNhbgorCSAgYWNjdXJhdGVseSBjYWxjdWxhdGUgdGhlIG1pbi9hdmcvbWF4IGJpdHJhdGVzIGZvciBhYWNwYXJzZS4KKwkgIE5vdGU6IFRoZSBiaXRyYXRlIHdhcyBiZWluZyBpbmNvcnJlY3RseSBjYWxjdWxhdGVkIGZvciBBRFRTIHN0cmVhbXMKKwkgIChpdCdzIG5vdCBpbiB0aGUgaGVhZGVyIGFzIHRoZSBjb2RlIHN1Z2dlc3RzKS4KKworMjAxMC0wMy0yNSAxMToyMjo1OCArMDAwMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5oOgorCSAgYXVkaW9wYXJzZXJzOiBBZGQgYml0cmF0ZSBjYWxjdWxhdGlvbiB0byBiYXNlcGFyc2UKKwkgIFRoaXMgbWFrZXMgYmFzZXBhcnNlIGtlZXAgYSBydW5uaW5nIGF2ZXJhZ2Ugb2YgdGhlIHN0cmVhbSBiaXRyYXRlLCBhcworCSAgd2VsbCBhcyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBiaXRyYXRlcy4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgYQorCSAgdmZ1bmMgdG8gbWFrZSBzdXJlIHRoYXQgcGVyLWZyYW1lIG92ZXJoZWFkIGZyb20gdGhlIGNvbnRhaW5lciBpcyBub3QKKwkgIGFjY291bnRlZCBmb3IgaW4gdGhlIGJpdHJhdGUgY2FsY3VsYXRpb24uCisJICBXZSB0YWtlIGNhcmUgbm90IHRvIG92ZXJyaWRlIHRoZSBiaXRyYXRlLCBtaW5pbXVtLWJpdHJhdGUsIGFuZAorCSAgbWF4aW11bS1iaXRyYXRlIHRhZ3MgaWYgdGhleSBoYXZlIGJlZW4gcG9zdGVkIHVwc3RyZWFtLiBXZSBhbHNvCisJICByYXRlLWxpbWl0IHRoZSBlbWlzc2lvbiBvZiBiaXRyYXRlIHNvIHRoYXQgaXQgaXMgb25seSB0cmlnZ2VyZWQgYnkgYQorCSAgY2hhbmdlIG9mID4xMCBrYnBzLgorCisyMDEwLTAzLTIyIDE2OjU2OjAzICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FtcnBhcnNlLmM6CisJICBBZGQgLVdvbGQtc3R5bGUtZGVmaW5pdGlvbgorCSAgYW5kIGZpeCB0aGUgd2FybmluZ3MKKworMjAxMC0wMy0yMSAyMTozOToxOCArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hYWNwYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYW1ycGFyc2UuYzoKKwkgIEFkZCAtV21pc3NpbmctZGVjbGFyYXRpb25zIC1XbWlzc2luZy1wcm90b3R5cGVzIHRvIGNvbmZpZ3VyZSBmbGFncworCSAgQW5kIGZpeCBhbGwgd2FybmluZ3MKKworMjAxMC0wMy0xOCAxNzozMDoyNiArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJICBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlscyA9PiBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUKKworMjAxMC0wMS0xNCAxMTo1MDozMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IHJlbmFtZSBiYXNlcGFyc2UgR1R5cGUgbmFtZSB0byBhdm9pZCBwb3NzaWJsZSBjb25mbGljdHMKKworMjAxMC0wMS0xMiAxODo1NTo1MyArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogSW5pdGlhbGl6ZSB2YXJpYWJsZXMuCisJICBGaXhlcyBidWlsZCBvbiAkI0AqKCBtYWNvc3gKKworMjAxMC0wMS0xMSAyMjo0MTo1NyArMDMwMCAg0PPx6+DtIMjm4fPr4PLu4iA8bHJuMTk4NkBnbWFpbC5jb20+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuYzoKKwkgIHdpbjMyOiBJbmNsdWRlIGNvbmZpZy5oIGJlZm9yZSBhbnl0aGluZyBlbHNlLiBGaXggbXBlZ2RlbXV4IExJQkFERAorCSAgQmVjYXVzZSBjb25maWcuaCBkZWZpbmVzIF9fTVNWQ1JUX1ZFUlNJT05fXywgd2hpY2ggc2hvdWxkIGJlIGRlZmluZWQKKwkgIGJlZm9yZSBpbmNsdXNpb24gb2YgYW55IHN5c3RlbSBoZWFkZXIuCisJICBBbHNvIGZpeGVzIG1wZWdkZW11eCBNYWtlZmlsZS5hbSBMSUJBREQgdHlwby4KKwkgIEZpeGVzICM2MDY2NjUKKworMjAxMC0wMS0xMSAxMzoyMDoyNiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBBbHNvIGFkZCBzdHJlYW0tZm9ybWF0IHRvIHRlbXBsYXRlIGNhcHMKKwkgIERvIG5vdCBmb3JnZXQgdG8gYWRkIHN0cmVhbS1mb3JtYXQgdG8gdGVtcGxhdGUgY2FwcworCSAgb2ZmIGFhY3BhcnNlCisKKzIwMTAtMDEtMTEgMTM6MTM6NDEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hYWNwYXJzZS5jOgorCSAgUmVuYW1lIGFhYydzIHN0cmVhbS1mb3JtYXQgJ25vbmUnIHRvICdyYXcnCisJICBSZW5hbWVzIGFhYydzIHN0cmVhbS1mb3JtYXQgZnJvbSBwcmV2aW91cyBjb21taXRzIGZyb20gbm9uZSB0bworCSAgcmF3CisKKzIwMTAtMDEtMTEgMTI6MTA6MDIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IHVwZGF0ZSB0ZXN0cyB0byBzdHJlYW0tZm9ybWF0IGNoYW5nZXMKKwkgIFVwZGF0ZXMgYWFjcGFyc2UgdW5pdCB0ZXN0cyB0byBjaGVjayBmb3Igc3RyZWFtLWZvcm1hdAorCSAgY29ycmVjdG5lc3MgYXMgd2VsbC4KKworMjAxMC0wMS0xMSAxMDo1MToxOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBBZGQgc3RyZWFtLWZvcm1hdCB0byBvdXRwdXQgY2FwcworCSAgQWRkcyBzdHJlYW0tZm9ybWF0IGZpZWxkIHRvIG91dHB1dCBjYXBzCisKKzIwMTAtMDEtMDUgMTU6MDU6MDUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYXVkaW9wYXJzZXJzOiBkb2N1bWVudGF0aW9uIGZpeGVzCisKKzIwMTAtMDEtMDUgMTU6MDQ6MzggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJICBhYzNwYXJzZTogYWRkIGRvY3VtZW50YXRpb24KKworMjAxMC0wMS0wNSAxNDo0ODo0OSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oOgorCSAgZmxhY3BhcnNlOiBhZGQgZG9jdW1lbnRhdGlvbgorCisyMDA5LTEyLTIxIDE4OjI5OjQzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogcGVyZm9ybSBhZGRpdGlvbmFsIGZyYW1lIGNoZWNrcyB3aGVuIHJlc3luY2luZworCisyMDEwLTAxLTA1IDE2OjM1OjUyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkgIGZsYWNwYXJzZTogZml4IChtdWx0aXBsZSBjaGFubmVsKSBmcmFtZSBwYXJzaW5nCisKKzIwMTAtMDEtMDUgMTY6MzU6NDQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBkZWNsYXJlIHVucGFyc2VkIGlucHV0IGFuZCBwYXJzZWQgb3V0cHV0CisKKzIwMDktMTItMjEgMTg6MTk6MjMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJICBhYzNwYXJzZTogZml4IHNjYW5uaW5nIGZvciBuZXh0IHN5bmN3b3JkCisKKzIwMDktMTItMjEgMTg6MTg6MzkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBhZGp1c3Qgc2VlayBoYW5kbGluZyBhbmQgbmV3c2VnbWVudCBzZW5kaW5nCisJICBQZXJmb3JtIHNhbml0eSBjaGVjayBvbiB0eXBlIG9mIHNlZWssIGFuZCBvbmx5IHBlcmZvcm0gb25lIHRoYXQgaXMKKwkgIGFwcHJvcHJpYXRlbHkgc3VwcG9ydGVkLiAgQWRqdXN0IGRvd25zdHJlYW0gbmV3c2VnbWVudCBldmVudAorCSAgdG8gZmlyc3QgYnVmZmVyIHRpbWVzdGFtcCB0aGF0IGlzIHNlbnQgZG93bnN0cmVhbS4KKworMjAwOS0xMi0yMSAxMTo1OTo0NSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IG1pbm9yIHJlZmFjdG9yIGNsZWFudXAKKwkgIEFsc28gYWRkIHNvbWUgZGVidWcgbG9nZ2luZy4KKworMjAwOS0xMi0xOCAyMTowNToxMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IGxvY2F0ZSBuZXh0IHN5bmMgY29kZSBtb3JlIGVmZmljaWVudGx5CisKKzIwMDktMTItMTggMjE6MDQ6MTIgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jOgorCSAgZmxhY3BhcnNlOiBiYXNlcGFyc2UgdGFrZXMgY2FyZSBvZiBoYW5kbGluZyBsZWZ0b3ZlciBwaWVjZXMKKworMjAwOS0xMi0xOCAyMTowMjo0MCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IGltcGxlbWVudCBsZWZ0b3ZlciBkcmFpbmluZyBpbiBwdWxsIG1vZGUKKworMjAwOS0xMi0xNyAxMjo0NTozNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmM6CisJICBmbGFjcGFyc2U6IHNldCBfT0ZGU0VUIGFuZCBfT0ZGU0VUX0VORCBvbiBvdXRnb2luZyBidWZmZXJzCisKKzIwMDktMTItMTcgMTI6NDQ6MjAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYzoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jOgorCSAgYXVkaW9wYXJzZXJzOiBtb3ZlICdmbGFjcGFyc2UnIGludG8gaXQKKworMjAwOS0xMi0xNiAxODozODozMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IHByb3ZpZGUgZGVmYXVsdCBjb252ZXJzaW9uIHVzaW5nIGJwcyBpZiBubyBmcHMgYXZhaWxhYmxlCisJICBBbHNvIHN0b3JlIGVzdGltYXRlZCBkdXJhdGlvbiBhcyBzdWNoLCByYXRoZXIgdGhhbiBwcmV0ZW5kaW5nIG90aGVyd2lzZQorCSAgKGUuZy4gc2V0IGJ5IHN1YmNsYXNzKS4KKworMjAwOS0xMi0xOCAxMzozMDoyOSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IGNoZWNrIGZvciByZW1haW5pbmcgZGF0YSB3aGVuIGRyYWluaW5nIGluIHB1c2ggbW9kZQorCisyMDA5LTEyLTE4IDEzOjMwOjA3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogZml4IHB1bGwgbW9kZSBjYWNoZSBzaXplIGNvbXBhcmlzb24KKworMjAwOS0xMi0xOCAxMzowMToxNyArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IEZpeCB1bml0aWFsaXplZCB2YXJpYWJsZS4KKworMjAwOS0xMi0xNyAxNDo0NjowMSArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDxjaHJpc3RpYW4uc2NoYWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL01ha2VmaWxlLmFtOgorCSAgVXBkYXRlIHNwZWMgZmlsZSBhbmQgZml4IGFjM3BhcnNlciBoZWFkZXIgbGlzdGluZyBpbiBNYWtlZmlsZS5hbQorCisyMDA5LTEyLTExIDEwOjI1OjE2IC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuYzoKKwkgIGF1ZGlvcGFyc2U6IGZpeCBhIGZvcm1hdCBzdHJpbmcgYXMgcmVwb3J0ZWQgb24gaXJjLgorCisyMDA5LTExLTIzIDE2OjM0OjUwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IGVuc3VyZSBzdWZmaWNpZW50IGRhdGEgYXZhaWxhYmxlIGZvciBwYXJzaW5nCisKKzIwMDktMTAtMjkgMTU6MTk6MDQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJICBhYzNwYXJzZTogZXh0cmFjdCBhbmQgdXNlIHNvbWUgbW9yZSBkZXRhaWxzIGZvciBFbmhhbmNlZCBBYy0zIHN0cmVhbXMKKworMjAwOS0xMC0yOSAxNToxODozNyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5oOgorCSAgYmFzZXBhcnNlOiBjdXN0b20gYnVmZmVyZmxhZyBpbmRpY2F0ZXMgbm90IHRvIGNvdW50IGZyYW1lIGluIHN0YXRzCisKKzIwMDktMTAtMjggMTQ6MDg6NDMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJICBhYzNwYXJzZTogcGVyZm9ybSBhZGRpdGlvbmFsIGZyYW1lIGNoZWNrcyB3aGVuIHJlc3luY2luZworCisyMDA5LTEwLTI4IDE0OjA3OjE3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IGluZm9ybSBiYXNlIHBhcnNlciBvZiBmcmFtZSBkdXJhdGlvbgorCisyMDA5LTEwLTI3IDE2OjE2OjUwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jOgorCSAgYWMzcGFyc2U6IGltcHJvdmUgc3JjIGNhcHMgc2V0dGluZ3MKKworMjAwOS0xMS0yNyAxNzo1OTowMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jOgorCSAgYWMzcGFyc2U6IGluaXRpYWwgdmVyc2lvbgorCSAgTUFSR0lOQUwgcmFuayBmb3Igbm93OyBtaWdodCB0YWtlIHNvbWUgdGltZSBmb3Igc29tZSAodXNlZnVsKQorCSAgZnJhbWVkPXRydWUvZmFsc2UgdG8gYXBwZWFyIGhlcmUgYW5kIHRoZXJlLgorCisyMDA5LTExLTI2IDE4OjM0OjQ1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5oOgorCSAgYW1ycGFyc2U6IHVzZSAoZGVmYXVsdCkgdGltZSBoYW5kbGluZyBvZiBiYXNlcGFyc2VyIGNsYXNzCisKKzIwMDktMTEtMjYgMTg6MTU6MjEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9wYXJzZXJzL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5oOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9wbHVnaW4uYzoKKwkgIGF1ZGlvcGFyc2VyczogbW92ZSAnYW1ycGFyc2UnIGludG8gaXQKKworMjAwOS0xMS0yNyAxNzoyNzozMiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb3BhcnNlcnMvZ3N0YmFzZXBhcnNlLmM6CisJICBhdWRpb3BhcnNlcnM6IHJlZmVyZW5jZSBHc3RCYXNlUGFyc2Ugbm93IGxpdmVzIGhlcmUKKworMjAwOS0xMS0yOCAxODoxMzozMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hYWNwYXJzZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb3BhcnNlcnMvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmg6CisJKiBnc3QvYXVkaW9wYXJzZXJzL2dzdGJhc2VwYXJzZS5jOgorCSogZ3N0L2F1ZGlvcGFyc2Vycy9nc3RiYXNlcGFyc2UuaDoKKwkqIGdzdC9hdWRpb3BhcnNlcnMvcGx1Z2luLmM6CisJICBhdWRpb3BhcnNlcnM6IHJlbmFtZSAnYWFjcGFyc2UnIHBsdWdpbiB0byBnZW5lcmljICdhdWRpb3BhcnNlcnMnIHBsdWdpbgorCisyMDA5LTExLTI2IDE3OjA0OjQzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FhY3BhcnNlL01ha2VmaWxlLmFtOgorCSogZ3N0L2FhY3BhcnNlL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYWFjcGFyc2UvcGx1Z2luLmM6CisJICBhYWNwYXJzZTogc2VwYXJhdGUgcGx1Z2luIHJlZ2lzdHJhdGlvbiBhbmQgcmVuYW1lIHBsdWdpbgorCisyMDA5LTExLTI2IDE3OjA0OjM2ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogZW5zdXJlIHN1ZmZpY2llbnQgZGF0YSBhdmFpbGFibGUgYmVmb3JlIGFjY2Vzc2luZworCisyMDA5LTExLTA1IDE0OjMxOjQwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYWFjcGFyc2UvZ3N0YWFjcGFyc2UuaDoKKwkgIGFhY3BhcnNlOiB1c2UgKGRlZmF1bHQpIHRpbWUgaGFuZGxpbmcgb2YgYmFzZXBhcnNlciBjbGFzcworCisyMDA5LTEwLTI5IDE1OjE5OjM1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogZml4dXAgY29tbWVudHMgdG8gQy1zdHlsZQorCisyMDA5LTEwLTI5IDE2OjA1OjAwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiByZXNldCBwYXNzdGhyb3VnaCBtb2RlIHRvIGRlZmF1bHQgKGRpc2FibGVkKSBvbiBhY3RpdmF0aW9uCisKKzIwMDktMTAtMjkgMTU6MTY6NTkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWFjcGFyc2UvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IGVuc3VyZSBidWZmZXIgbWV0YWRhdGEgaXMgd3JpdGFibGUKKworMjAwOS0xMC0yOCAxNDowNjoxMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuaDoKKwkgIGJhc2VwYXJzZTogZml4L2VuaGFuY2UgRElTQ09OVCBtYXJraW5nCisJICBJbiBwYXJ0aWN1bGFyLCBjb25zaWRlciBESVNDT05UID09ICFzeW5jLCBhbmQgYWxsb3cgc3ViY2xhc3MgdG8gcXVlcnkKKwkgIHN5bmMgc3RhdGUsIGFzIGl0IG1heSB3YW50IHRvIHBlcmZvcm0gYWRkaXRpb25hbCBjaGVja3MgZGVwZW5kaW5nCisJICBvbiB3aGV0aGVyIHN5bmMgd2FzIGFjaGlldmVkIGVhcmxpZXIgb24uCisJICBBbHNvIGFycmFuZ2UgZm9yIHN1YmNsYXNzIHRvIHF1ZXJ5IHdoZXRoZXIgbGVmdG92ZXIgZGF0YSBpcyBiZWluZyBkcmFpbmVkLgorCisyMDA5LTExLTIzIDE1OjQ4OjI1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5jOgorCSogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5oOgorCSAgYmFzZXBhcnNlOiBhZGQgdGltZXN0YW1wIGhhbmRsaW5nLCBhbmQgZGVmYXVsdCBjb252ZXJzaW9uCisJICBJbiBwYXJ0aWN1bGFyLCAob3B0aW9uYWxseSkgcHJvdmlkZSBiYXNlcGFyc2Ugd2l0aCBhIG5vdGlvbiBvZiBmcmFtZXMgcGVyIHNlY29uZAorCSAgKGFuZCB0aGVyZWZvcmUgYWxzbyBmcmFtZSBkdXJhdGlvbikgYW5kIGhhdmUgaXQgdHJhY2sgZnJhbWUgYW5kIGJ5dGUgY291bnRzLgorCSAgVGhpcyB3YXksIHN1YmNsYXNzIGNhbiBwcm92aWRlIGJhc2VwYXJzZSB3aXRoIGZwcyBhbmQgaGF2ZSBpdCBwcm92aWRlIGRlZmF1bHQKKwkgIGJ1ZmZlciB0aW1lIG1ldGFkYXRhIGFuZCBjb252ZXJzaW9ucywgdGhvdWdoIHN1YmNsYXNzIGNhbiBzdGlsbCBpbnN0YWxsCisJICBjYWxsYmFja3MgdG8gaGFuZGxlIHN1Y2ggaXRzZWxmLgorCisyMDA5LTEwLTI4IDEyOjAyOjAzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBkb2N1bWVudGF0aW9uIGZpeGVzCisKKzIwMDktMTAtMjggMTI6MDA6MDggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWFjcGFyc2UvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IHVzZV9maXhlZF9jYXBzIGZvciBzcmMgcGFkCisJICBBZnRlciBhbGwsIHN0cmVhbSBpcyBhcy1pcywgYW5kIHRoZXJlIGlzIGxpdHRsZSBtb2xkaW5nIHRvIGRvd25zdHJlYW0ncworCSAgdGFzdGUgdGhhdCBjYW4gYmUgZG9uZS4gIElmIHN1YmNsYXNzIGNhbiBhbmQgd2FudHMgdG8gZG8gc28sIGl0IGNhbgorCSAgc3RpbGwgb3ZlcnJpZGUgYXMgc3VjaC4KKworMjAwOS0xMS0yMCAxNzozMjoxMyArMDEwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQGZsdWVuZG8uY29tPgorCisJKiBnc3QvYWFjcGFyc2UvZ3N0YmFzZXBhcnNlLmM6CisJICBhYWNwYXJzZTogRml4IGNvbXBpbGF0aW9uIHdhcm5pbmdzCisKKzIwMDktMTAtMTEgMTE6MjI6MTEgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGFhY3BhcnNlLmM6CisJKiBnc3QvYWFjcGFyc2UvZ3N0YmFzZXBhcnNlLmM6CisJICBhYWNwYXJzZTogZml4IHdhcm5pbmdzIGluIG1hY29zeCBzbm93IGxlb3BhcmQKKworMjAwOS0wOS0yNSAxNzowMjo1MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RhYWNwYXJzZS5jOgorCSogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5jOgorCSogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5oOgorCSAgYWFjcGFyc2U6IGZvcmVnbyAoYm9ndXMpIHBhcnNpbmcgb2YgYWxyZWFkeSBwYXJzZWQgKHJhdykgaW5wdXQKKworMjAwOS0wOC0wNyAxMzowNzoxNyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogcHJldmVudCBpbmZpbml0ZSBsb29wIHdoZW4gZHJhaW5pbmcKKworMjAwOS0wOC0wNyAxMzowNjoyOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogZml4IG1pbm9yIG1lbW9yeSBsZWFrCisKKzIwMDktMDctMTQgMTQ6MDg6MDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWFjcGFyc2UvZ3N0YmFzZXBhcnNlLmM6CisJKiBnc3QvYWFjcGFyc2UvZ3N0YmFzZXBhcnNlLmg6CisJICBhYWNwYXJzZTogQWRkIGZ1bmN0aW9uIGZvciB0aGUgYmFzZXBhcnNlIHN1YmNsYXNzIHRvIHB1c2ggYnVmZmVycyBkb3duc3RyZWFtCisJICBBbHNvIGhhbmRsZSB0aGUgY2FzZSBncmFjZWZ1bGx5IHdoZXJlIHRoZSBzdWJjbGFzcyBkZWNpZGVzIHRvIGRyb3AKKwkgIHRoZSBmaXJzdCBidWZmZXJzIGFuZCBoYXMgbm8gY2FwcyBzZXQgeWV0LiBJdCdzIHN0aWxsIHJlcXVpcmVkIHRvCisJICBoYXZlIHZhbGlkIGNhcHMgc2V0IHdoZW4gdGhlIGZpcnN0IGJ1ZmZlciBzaG91bGQgYmUgcGFzc2VkIGRvd25zdHJlYW0uCisKKzIwMDktMDctMTQgMTQ6MDc6NDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWFjcGFyc2UvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IEZpeCBzZWVrIGV2ZW50IGxlYWtpbmcKKworMjAwOS0wNi0xOCAxMjoxMzoyOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IEFESUY6IGRvIG5vdCBzZW5kIGJvZ3VzIHRpbWVzdGFtcHMsIGxlYXZlIHRvIGRvd25zdHJlYW0gKGRlY29kZXIpCisKKzIwMDktMDYtMDEgMTU6NTM6MjcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWFjcGFyc2UvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBmaXggc2FtcGxlIHJhdGUgZXh0cmFjdGlvbiBmcm9tIGNvZGVjIGRhdGEKKwkgIEluIG9uZSBjYXNlIHdlIGV4dHJhY3RlZCB0aGUgc2FtcGxlIHJhdGUgaW5kZXggZnJvbSB0aGUgY29kZWMgZGF0YQorCSAgYW5kIHNhdmVkIGl0IGFzIHNhbXBsZSByYXRlIHJhdGhlciB0aGFuIGdldHRpbmcgdGhlIHJlYWwgc2FtcGxlCisJICByYXRlIGZyb20gdGhlIHRhYmxlLiBGaXggdGhhdCwgYW5kIGFsc28gbWFrZSBzdXJlIHdlIGRvbid0IGFjY2VzcworCSAgbm9uLWV4aXN0YW50IHRhYmxlIGVudHJpZXMgYnkgYWRkaW5nIGEgc21hbGwgaGVscGVyIGZ1bmN0aW9uIHRoYXQKKwkgIGd1YXJkcyBhZ2FpbnN0IG91dC1vZi1ib3VuZHMgYWNjZXNzIGluIGNhc2Ugb2YgaW52YWxpZCBpbnB1dCBkYXRhLgorCisyMDA5LTA2LTAxIDE0OjAyOjMzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZSwgYW1ycGFyc2U6IHJlbW92ZSBib2d1cyBnc3RfcGFkX2ZpeGF0ZV9jYXBzKCkgY2FsbHMKKworMjAwOS0wNi0wMSAxMzo1NjoxOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogcHJvcGFnYXRlIHJldHVybiB2YWx1ZSBvZiBHc3RCYXNlUGFyc2U6OnNldF9zaW5rX2NhcHMoKQorCSAgZ3N0X2Jhc2VfcGFyc2Vfc2lua19zZXRjYXBzKCkgcHJlc3VtYWJseSBzaG91bGQgZmFpbCBpZiB0aGUgc3ViY2xhc3MKKwkgIHJldHVybnMgRkFMU0UgZnJvbSBpdHMgOjpzZXRfc2lua19jYXBzKCkgZnVuY3Rpb24uCisKKzIwMDktMDYtMDEgMTM6NDc6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWFjcGFyc2UvZ3N0YmFzZXBhcnNlLmM6CisJICBiYXNlcGFyc2U6IGRvbid0IHRyeSB0byBHU1RfTE9HIGFuIGFscmVhZHktZnJlZWQgY2FwcyBzdHJpbmcKKwkgIFRoZSBwcm9wZXIgd2F5IHRvIGxvZyBjYXBzIGlzIHZpYSBHU1RfUFRSX0ZPUk1BVCBhbnl3YXkuCisKKzIwMDktMDYtMDEgMTM6MDU6MzUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWFjcGFyc2UvZ3N0YWFjcGFyc2UuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogc2V0IGNoYW5uZWxzIGFuZCByYXRlIG9uIG91dHB1dCBjYXBzLCBhbmQga2VlcCBjb2RlY19kYXRhCisJICBDcmVhdGUgb3V0cHV0IGNhcHMgZnJvbSBpbnB1dCBjYXBzLCBzbyB3ZSBtYWludGFpbiBhbnkgZmllbGRzIHdlCisJICBtaWdodCBnZXQgb24gdGhlIGlucHV0IGNhcHMsIHN1Y2ggYXMgY29kZWNfZGF0YSBvciByYXRlIGFuZCBjaGFubmVscy4KKwkgIFNldCBjaGFubmVscyBhbmQgcmF0ZSBvbiB0aGUgb3V0cHV0IGNhcHMgaWYgd2UgZG9uJ3QgaGF2ZSBpbnB1dCBjYXBzCisJICBvciB0aGV5IGRvbid0IGNvbnRhaW4gc3VjaCBmaWVsZHMuIFdlIGRvIHRoaXMgcGFydGx5IGJlY2F1c2Ugd2UgY2FuLAorCSAgYnV0IGFsc28gYmVjYXVzZSBzb21lIG11eGVycyBuZWVkIHRoaXMgaW5mb3JtYXRpb24uIFRhZ3JlYWRiaW4gd2lsbAorCSAgYWxzbyBiZSBoYXBweSBhYm91dCB0aGlzLgorCisyMDA5LTA1LTI2IDE5OjQzOjUzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBmaXggZGVidWcgY2F0ZWdvcnkKKworMjAwOS0wNC0yNyAyMjozOToxNSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogZml4IChyZWdyZXNzaW9uIGluKSBuZXdzZWdtZW50IGhhbmRsaW5nCisJICAoYWFjcGFyc2UsIGFtcnBhcnNlLCBmbGFjcGFyc2UpLiAgRml4ZXMgIzU4MDEzMy4KKworMjAwOS0wNC0wNyAwNDo1MzowMiArMDMwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBGaXggc2xpZ2h0bHkgYnJva2VuIGJ1ZmZlci1pbi1zZWdtZW50IGNoZWNrIChhYWNwYXJzZSwgYW1ycGFyc2UsIGZsYWNwYXJzZSkKKworMjAwOS0wNC0wNSAwMzo1MDoxOSArMDMwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5jOgorCSAgYmFzZXBhcnNlOiBGaXggcHVzaCBtb2RlIHNlZWtpbmcgKGFhY3BhcnNlLCBhbXJwYXJzZSkKKwkgIFNlbmRpbmcgdGhlIGZsdXNoLXN0YXJ0IGV2ZW50IGZvcndhcmQgYmVmb3JlIHRha2luZyB0aGUgc3RyZWFtIGxvY2sgYWN0dWFsbHkKKwkgIHdvcmtzLCBpbiBjb250cmFzdCB0byBkZWFkbG9ja2luZyBpbiBkb3duc3RyZWFtIHByZXJvbGxfd2FpdCAoaHVuayAxKS4KKwkgIEFmdGVyIHRoYXQgd2UgZ2V0IHRoZSBjaGFpbiBmdW5jdGlvbiBiZWluZyBzdHVjayBpbiBhIGJ1c3kgbG9vcC4gVGhpcyBpcyBmaXhlZAorCSAgYnkgdXBkYXRpbmcgdGhlIG1pbmltdW0gZnJhbWUgc2l6ZSBpbnNpZGUgdGhlIHN5bmNocm9uaXphdGlvbiBsb29wIGJlY2F1c2UgdGhlCisJICBzdWJjbGFzcyBhc2tzIGZvciBtb3JlIGRhdGEgaW4gdGhpcyB3YXkgKGh1bmsgMikuCisJICBGaW5hbGx5LCB0aGlzIGxlYWRzIHRvIGEgdmVyeSBwcm9iYWJsZSBjcmFzaCBiZWNhdXNlIHRoZSBzdWJjbGFzcyBjYW4gZmluZCBhCisJICB2YWxpZCBmcmFtZSB3aXRoIGEgc2l6ZSBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgZGF0YSBpbiB0aGUKKwkgIGFkYXB0ZXIuIFRoaXMgbWFrZXMgdGhlIHN1YnNlcXVlbnQgZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgY2FsbCByZXR1cm4gTlVMTCwKKwkgIHdoaWNoIGlzIG5vdCBleHBlY3RlZCAoaHVuayAzKS4KKworMjAwOS0wMy0zMSAxNjowNzo0NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogRGVsYXkgbmV3c2VnbWVudCBhcyBsb25nIGFzIHBvc3NpYmxlLgorCSAgSWYgbmV3c2VnbWVudCBpcyBzZW50ICh0b28pIGVhcmx5LCBjYXBzIG1heSBub3QgeWV0IGJlIGZpeGVkL3NldCwKKwkgIGFuZCBkb3duc3RyZWFtIG1heSBub3QgaGF2ZSBiZWVuIGxpbmtlZC4KKworMjAwOS0wMy0xOSAwMToxNzoyNSArMDIwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSogZ3N0L2FhY3BhcnNlL2dzdGFhY3BhcnNlLmM6CisJICBhYWNwYXJzZTogRml4IGJ1c3lsb29wIHdoZW4gc2Vla2luZy4gRml4ZXMgIzU3NTM4OAorCSAgVGhlIHByb2JsZW0gaXMgdGhhdCBhZnRlciBhIGRpc2NvbnQsIHNldF9taW5fZnJhbWVfc2l6ZSgxMDI0KSBpcyBjYWxsZWQgd2hlbgorCSAgZGV0ZWN0X3N0cmVhbSByZXR1cm5zIEZBTFNFLiBIb3dldmVyLCBkZXRlY3Rfc3RyZWFtIGNhbGxzIGNoZWNrX2FkdHNfZnJhbWUKKwkgIHdoaWNoIHNldHMgdGhlIGZyYW1lIHNpemUgb24gaXRzIG93biB0byBzb21ldGhpbmcgbGFyZ2VyIHRoYW4gMTAyNC4gVGhpcyBpcyB0aGUKKwkgIHNhbWUgc2l0dWF0aW9uIGFzIGluIHRoZSBiZWdpbm5pbmcsIHNvIHRoZSBiYXNlIGNsYXNzIGVuZHMgdXAgY2FsbGluZworCSAgY2hlY2tfdmFsaWRfZnJhbWUgaW4gYW4gZW5kbGVzcyBsb29wLgorCisyMDA5LTAzLTE5IDAwOjMyOjQwICswMjAwICBSZW7DqSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorCisJKiBnc3QvYWFjcGFyc2UvZ3N0YWFjcGFyc2UuYzoKKwkgIGFhY3BhcnNlOiBSZWZhY3RvciBjaGVja192YWxpZF9mcmFtZSB0byBleHBvc2UgYnJva2VuIGNvZGUKKwkgIEp1c3QgbW92aW5nIGNvZGUgYXJvdW5kIGFuZCByZW1vdmluZyBhbiB1bmhlbHBmdWwvbWlzbGVhZGluZyBjb21tZW50LgorCisyMDA5LTAyLTI3IDExOjI0OjM3ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogcmV2ZXJ0IGxhc3QgY2hhbmdlIGFuZCBwcm9wZXJseSBmaXgKKwkgIEJhc2VwYXJzZSBpbnRlcm5hbHkgYnJlYWtzIHRoZSBzZW1hbnRpY3Mgb2YgYSBfY2hhaW4gZnVuY3Rpb24gYnkgY2FsbGluZyBpdCB3aXRoCisJICBidWZmZXI9PU5VTEwuIFRoZSByZXNvbiBJIGJlbGl2ZWQgaXQgd2FzIG9rYXkgdG8gcmVtb3ZlIGl0IHdhcyB0aGF0IHRoZXJlIGlzCisJICBhbHNvIGFuIHVuY2hlY2tlZCBhY2Nlc3MgdG8gYnVmZmVyIGxhdGVyIGluIF9jaGFpbi4gQWN0dWFsbHkgdGhhdCBjb2RlIGlzIHdyb25nLAorCSAgYXMgaXQgbW9zdCBwcm9iYWJseSB3YW50cyB0byBzZXQgZGlzY29udCBvbiB0aGUgb3V0Z29pbmcgYnVmZmVyLgorCisyMDA5LTAyLTI2IDExOjAyOjA2ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgIGJhc2VwYXJzZTogcmVtb3ZlIGNoZWNrcyBmb3IgYnVmZmVyPT1OVUxMCisJICBBY2NvcmRpZm4gdG8gZG9jcyBmb3IgR3N0UGFkQ2hhaW5GdW5jdGlvbiBidWZmZXIgY2Fubm90IGJlIE5VTEwuIElmIHdlIHdvdWxkCisJICBsZWF2ZSB0aGUgY2hlY2ssIHdlIHdvdWxkIGFsc28gbmVlZCBtb3JlIHN1Y2ggY2hlY2sgYmVsb3cuCisKKzIwMDktMDItMTEgMDA6MTU6NDMgKzAyMDAgIFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RhYWNwYXJzZS5jOgorCSAgYWFjcGFyc2U6IEZpeCBsaWNlbnNlIHNwZWNpZmllZCBpbiBwbHVnaW4gZGV0YWlscy4KKworMjAwOS0wMS0zMCAxODoxODoxMCArMDAwMCAgSmFuIFNjaG1pZHQgPGphbi5zY2htaWR0QHN1bi5jb20+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgIEZpeCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBkZWZhdWx0IHBhcnNlX2ZyYW1lIGZ1bmN0aW9uLgorCSAgRml4IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGRlZmF1bHQgcGFyc2VfZnJhbWUgZnVuY3Rpb24gaW4gYm90aAorCSAgY29waWVzIG9mIEdzdEJhc2VQYXJzZQorCisyMDA5LTAxLTIzIDE2OjAwOjEwICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hYWNwYXJzZS9nc3RhYWNwYXJzZS5jOgorCSAgTG9nIGFhYyBkZXRhaWxzIGZvdW5kIGluIGNvZGVjX2RhdGEuCisKKzIwMDgtMTEtMTMgMTc6MjQ6NTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hYWNwYXJzZS9nc3RhYWNwYXJzZS5jOiBEb24ndCBhdXRvcGx1ZyBhYWNwYXJzZSB1bnRpbCBpdCB3b3Jrcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYWFjcGFyc2UvZ3N0YWFjcGFyc2UuYzogKHBsdWdpbl9pbml0KToKKwkgIERvbid0IGF1dG9wbHVnIGFhY3BhcnNlIHVudGlsIGl0IHdvcmtzLgorCisyMDA4LTExLTEzIDE1OjIwOjE1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHRlc3RzL2NoZWNrLzogQWRkIHVuaXQgdGVzdHMgZm9yIG5ldyBwYXJzZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hYWNwYXJzZS5jOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hbXJwYXJzZS5jOgorCSAgQWRkIHVuaXQgdGVzdHMgZm9yIG5ldyBwYXJzZXJzLgorCisyMDA4LTExLTEzIDE0OjIxOjM5ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC86IEZpeCBiYXNlcGFyc2UgdHlwZSBuYW1lLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgICogZ3N0L2FtcnBhcnNlL2dzdGJhc2VwYXJzZS5jOgorCSAgRml4IGJhc2VwYXJzZSB0eXBlIG5hbWUuCisKKzIwMDgtMTEtMTMgMTI6NTk6MzQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgQWRkIHR3byBuZXcgYmFzZXBhcnNlIGJhc2VkIHBhcnNlcnMgKGFhYyBhbmQgYW1yKSBmcm9tIEJ1ZyAjNTE4ODU3LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L2FhY3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYWFjcGFyc2UvZ3N0YWFjcGFyc2UuYzoKKwkgICogZ3N0L2FhY3BhcnNlL2dzdGFhY3BhcnNlLmg6CisJICAqIGdzdC9hYWNwYXJzZS9nc3RiYXNlcGFyc2UuYzoKKwkgICogZ3N0L2FhY3BhcnNlL2dzdGJhc2VwYXJzZS5oOgorCSAgKiBnc3QvYW1ycGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hbXJwYXJzZS9nc3RhbXJwYXJzZS5jOgorCSAgKiBnc3QvYW1ycGFyc2UvZ3N0YW1ycGFyc2UuaDoKKwkgICogZ3N0L2FtcnBhcnNlL2dzdGJhc2VwYXJzZS5jOgorCSAgKiBnc3QvYW1ycGFyc2UvZ3N0YmFzZXBhcnNlLmg6CisJICBBZGQgdHdvIG5ldyBiYXNlcGFyc2UgYmFzZWQgcGFyc2VycyAoYWFjIGFuZCBhbXIpIGZyb20gQnVnICM1MTg4NTcuCisKKzIwMTEtMDMtMjAgMDE6MDg6MzggKzAxMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQHRhbmRiZXJnLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IE1ha2Ugc3JjX3F1ZXJ5IE1ULXNhZmUKKwkgIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGVsZW1lbnQgbWlnaHQgYmUgZ29pbmcgZG93biB3aGlsZSB0aGUgZXZlbnQgYXJyaXZlcworCisyMDExLTA0LTA4IDE1OjIyOjQ3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogVW5yZWYgZXZlbnQgaWYgdGhlIHBhcmVudCBlbGVtZW50IGRpc2FwcGVhcmVkCisKKzIwMTEtMDQtMDggMTU6MjI6MTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogVW5yZWYgZXZlbnQgaWYgdGhlIHBhcmVudCBlbGVtZW50IGRpc2FwcGVhcmVkCisKKzIwMTEtMDMtMjEgMTY6MDQ6MzQgKzAxMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQHRhbmRiZXJnLmNvbT4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogTWFrZSB1cHN0cmVhbSBldmVudHMgTVQtc2FmZQorCisyMDExLTAzLTIxIDE2OjA0OjM0ICswMTAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBNYWtlIHVwc3RyZWFtIGV2ZW50cyBNVC1zYWZlCisKKzIwMTEtMDQtMDggMTU6MjA6NTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgcnRwOiBVbnJlZiBldmVudHMgaWYgdGhlIHBhcmVudCBlbGVtZW50IGRpc2FwcGVhcmVkCisKKzIwMTEtMDEtMDYgMTg6MjQ6MzYgKzAxMDAgIE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcyA8b3Jhdm5hc0BjaXNjby5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBydHBtYW5hZ2VyOiBmaXggcGFkIGNhbGxiYWNrcyBzbyB0aGV5IGhhbmRsZSB3aGVuIHBhcmVudCBnb2VzIGF3YXkKKwkgIDEpIFdlIG5lZWQgdG8gbG9jayBhbmQgZ2V0IGEgc3Ryb25nIHJlZiB0byB0aGUgcGFyZW50LCBpZiBzdGlsbCB0aGVyZS4KKwkgIDIpIElmIGl0IGhhcyBnb25lIGF3YXksIHdlIG5lZWQgdG8gaGFuZGxlIHRoYXQgZ3JhY2VmdWxseS4KKwkgIFRoaXMgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIHNhZmVseSBtb2RpZnkgYSBydW5uaW5nIHBpcGVsaW5lLiBIYXMgYmVlbgorCSAgb2JzZXJ2ZWQgd2hlbiBhIHN0cmVhbWluZyB0aHJlYWQgaXMgZG9pbmcgYSBidWZmZXJfYWxsb2MoKSB3aGlsZSBhbgorCSAgYXBwbGljYXRpb24gdGhyZWFkIHNlbmRzIGFuIGV2ZW50IG9uIGEgcGFkIGZ1cnRoZXIgZG93bnN0cmVhbSwgYW5kIGZyb20KKwkgIHdpdGhpbiBhIHBhZCBwcm9iZSAoaG9sZGluZyBTVFJFQU1fTE9DSykgY2FycmllcyBvdXQgdGhlIHBpcGVsaW5lIHBsdW1iaW5nCisJICB3aGlsZSB0aGUgc3RyZWFtaW5nIHRocmVhZCBoYXMgaXRzIGJ1ZmZlcl9hbGxvYygpIGluIHByb2dyZXNzLgorCisyMDEwLTExLTI2IDE1OjIwOjA0ICswMTAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IG1ha2UgaXRlcmF0ZV9pbnRlcm5hbF9saW5rcyBNVC1zYWZlCisKKzIwMTEtMDQtMDggMTQ6MzU6MDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBSZXZlcnQgIlB1bHNlc2luazogQWxsb3cgY2h1bmtzIHVwIHRvIGJ1ZnNpemUgaW5zdGVhZCBvZiBzZWdzaXplIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCAxZTJjMTQ2N2FlMDQyYTNjNmJiMWE2YmMwYzA3YWVmZjEzZWM1ZWRiLgorCSAgVGhlIGNvbW1pdCBjYXVzZXMgcHVsc2VzaW5rIHRvIGlnbm9yZSB0aGUgbGF0ZW5jeS10aW1lIGJhc2VhdWRpb3NpbmsgcHJvcGVydHkuCisKKzIwMTEtMDQtMDggMTE6MTM6MDcgKzAyMDAgIEFsZXhleSBGaXNoZXIgPGJ1Zy10cmFja0BmaXNoZXItcHJpdmF0Lm5ldD4KKworCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSAgcnRwc3BlZXhwYXk6IERvIG5vdCB0cmFuc21pdHQgc2FtcGxlcyB3aXRoIEdBUCBmbGFnCisJICBJZiB3ZSBnZXQgR0FQIHNhbXBsZXMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gdHJhbnNtaXR0IGl0LgorCSAgSW4gc29tZSBzaXR1YXRpb25zLCBtaWNyb3Bob25lIGlzIG11dGVkLCB3ZSBjYW4gZHJvcCBuZXQgdHJhZmZpY2sKKwkgIHVzYWdlIHRvIH4xIGtiaXQvcy4gV2l0aG91dCBwYXRjaCBpdCB3aWxsIHN0YXkgfjIwIGtiaXQvcworCisyMDExLTA0LTA4IDExOjExOjU4ICswMjAwICBBbGV4ZXkgRmlzaGVyIDxidWctdHJhY2tAZmlzaGVyLXByaXZhdC5uZXQ+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgc3BlZXhlbmM6IFVzZSBzcGVleCBpbnRlcm4gc2lsZW5jZSBkZXRlY3Rpb24KKwkgIFNwZWV4IGhhcyBidWlsZCBpbiBzaWxlbmNlIGRldGVjdGlvbi4gSWYgc3BlZXhfZW5jb2RlX2ludCByZXR1cm5zIDAsCisJICB0aGFuIHRoZXJlIGlzIHNpbGVuY2UgYW5kIHNhbXBsZSBkbyBub3QgbmVlZCB0byBiZSB0cmFuc21pdHRlZC4KKwkgIFRoaXMgd29yayBvbmx5IGlmIHZicj0xIGFuZCBkdHg9MSBvcHRpb25hcyBhcmUgZW5hYmxlZC4KKwkgIFNvIGlmIHdlIGdldCAwLCB3ZSBhZGQgR0FQIGZsYWcgdG8gdGhlIHNhbXBsZS4KKworMjAxMS0wNC0wNyAxOTowNDozMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhYzNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2cGF5LmM6CisJICBydHA6IHBvcnQgc29tZSBwYXkvZGVwYXlsb2FkZXJzCisKKzIwMTEtMDQtMDUgMTk6MTU6MTEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICB1ZHBzaW5rOiBoYW5kbGUgc2NhdGhlciBnYXRoZXIgZnJvbSBidWZmZXJzCisJICBJdGVyYXRlIHRoZSBtZW1vcnkgYmxvY2tzIG9uIHRoZSBidWZmZXIgYW5kIHNlbmQgdGhlbSB1c2luZyBzZW5kbXNnLgorCisyMDExLTA0LTA1IDE3OjI2OjQ0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkgIHJ0cGRlYzogcmVzZXQgc3RydWN0dXJlIGJlZm9yZSB1c2UKKworMjAxMS0wNC0wNSAxNzoyMDowOCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jCisKKzIwMTEtMDQtMDUgMTc6MTI6MjggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGhhbmRsZSAqIGNvbnRyb2wgY29ycmVjdGx5CisJICBQYXJzZSBzZXNzaW9uIGNvbnRyb2wgYXR0cmlidXRlcyB3aGVuIG5vIG1lZGlhIGNvbnRyb2wgYXR0cmlidXRlIGlzCisJICBwcmVzZW50LiBUaHJlYXQgKiBjb250cm9sIGF0dHJpYnV0ZXMgYXMgYW4gZW1wdHkgc3RyaW5nLCBqdXN0IGxpa2UgdGhlCisJICBzcGVjIHNheXMuCisJICBGaXhlcyAjNjQ2ODAwCisKKzIwMTEtMDQtMDUgMTc6MDY6NDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHJ0c3AvdWRwOiBwb3J0IHRvIDAuMTEKKworMjAxMS0wNC0wNSAxNDoyODo1NCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBBZGQgc3VwcG9ydCBmb3IgQS1MYXcgYW5kIMK1LUxhdworCSAgRml4ZXMgYnVnICM2NDY1NjcuCisKKzIwMTEtMDQtMDUgMDk6NDQ6MDEgKzAyMDAgIEpvbiBOb3JkYnkgPGpvbm9ub3JAZ21haWwuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IEZpeCBidWlsZCB3aXRoIGphY2sgMC4xMjAuMQorCSAgOTU0NDYyMjY3NGMwZDBhMzE0N2E5YjUxMTQ1MTU5YjAyZWVjNjhlOSBjaGVja2VkCisJICBmb3IgMC4xMjAuMiBhbmQgbGF0ZXIsIGJ1dCB0aGUgZGVwcmVjYXRpb24gd2FzIGludHJvZHVjZWQgaW4KKwkgIDAuMTIwLjEKKworMjAxMS0wNC0wNSAxMToxMzozNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlzdWJ0aXRsZS5jOgorCSAgYXZpOiBtb3JlIHBvcnRpbmcgdG8gMC4xMQorCisyMDExLTA0LTA1IDEyOjA1OjE5ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJyYWRpby5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnhvdmVybGF5LmM6CisJICBkb2NzOiBmaXggZG9jdWVtbnRhdGlvbiB3YXJuaW5ncyAoYW5kIHJlaW5kZW50KQorCisyMDExLTA0LTA0IDE5OjE3OjQzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpOiBwb3J0IHRvIDAuMTEgQVBJCisKKzIwMTEtMDQtMDQgMTc6MzQ6MTcgKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0Lmg6CisJICB2aWRlb21peGVyOiB1cGRhdGUgb3JjIGRpc3QgZmlsZXMKKworMjAxMS0wNC0wNCAxNTo1NzoxMCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMWNjYmUwOSB0byBjM2NhZmUxCisKKzIwMTEtMDMtMDEgMTQ6MDg6MTIgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IEFsd2F5cyBjYWxsIHBhX3N0cmVhbV9uZXdfd2l0aF9wcm9wbGlzdCgpCisJICBwYV9zdHJlYW1fbmV3X3dpdGhfcHJvcGxpc3QoKSBjYW4gdGFrZSBhIE5VTEwgcHJvcGxpc3QsIHNvIHdlIGRvbid0IG5lZWQKKwkgIHRvIGNvbmNlcm4gb3Vyc2VsdmVzIHdpdGggd2hldGhlciBpdCdzIE5VTEwgb3Igbm90LgorCisyMDExLTA0LTA0IDExOjMzOjEwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcGVyZm9ybSBwb3N0LWZsdXNoIHN0YXRlIHRyaWNrcyBkb3duc3RyZWFtIHRvIHVwc3RyZWFtCisJICAuLi4gc28gZG93bnN0cmVhbSBpcyBzZXQgd2hlbiB1cHN0cmVhbSByZXN1bWVzIGRhdGEgZmxvdy4KKworMjAxMS0wNC0wNCAxMToyNzoyOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRpc3RyaWJ1dGUgbmV3IGJhc2VfdGltZSB0byBtYW5hZ2VyIGNoaWxkcmVuIGZvbGxvd2luZyBmbHVzaCBzZWVrCisJICAuLi4gYnkgZm9yY2luZyBhIHN0YXRlIGNoYW5nZWQgdG8gUExBWUlORywgd2hpY2ggc2hvdWxkIG90aGVyd2lzZSBiZSBhCisJICBuby1vcCBhcyBlbGVtZW50cyBzaG91bGQgYWxyZWFkeSBiZSBpbiB0aGF0IHN0YXRlLgorCSAgSW4gcGFydGljdWxhciwgaml0dGVyYnVmZmVyIG5lZWRzIG5ldyBiYXNlX3RpbWUgYXMgc29vbiBhcyBwb3NzaWJsZSB0byBwZXJmb3JtCisJICBwcm9wZXIgdGltaW5nIChlLmcuIGVvcyB0aW1lb3V0IGhhbmRsaW5nKSBhbmQgY2FuJ3Qgd2FpdCBmb3IgdGhlIG5ldyBiYXNlX3RpbWUKKwkgIHRoYXQgd2lsbCBiZSBkaXN0cmlidXRlZCB3aGVuIHRoZSB3aG9sZSBwaXBlbGluZSByZXR1cm5zIHRvIFBMQVlJTkcuCisJICBTZWUgYnVnICM2NDYzOTcuCisKKzIwMTEtMDQtMDQgMTE6MzU6NTkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIFJldmVydCAiaml0dGVyYnVmZmVyOiByZXNldCBlbGVtZW50IGJhc2VfdGltZSB1cG9uIGZsdXNoIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCBmODRiOGE2OWNiYTljNTM4ZjU1NDY4NjljYjRlZjQ1NGFkNWVmYjlkLgorCSAgRml4ZXMgYnVnICM2NDYzOTcuCisKKzIwMTEtMDQtMDQgMTA6MzE6NDQgKzAxMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHY6IFNwZWNpZnkgdGhlIG9ubHkgcG9zc2libGUgc3RyZWFtLWZvcm1hdCBmb3IgaDI2NCBpbiB0aGUgcGFkIHRlbXBsYXRlcy4KKworMjAxMS0wNC0wNCAxMDowNzo0MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IENoZWNrIGZvciBpbnZhbGlkIChlbXB0eSkgY2xhc3NpZmljYXRpb24gaW5mbyBlbnRpdHkgc3RyaW5ncworCSAgT3RoZXJ3aXNlIHRoZSBjbGFzc2lmaWNhdGlvbiBzdHJpbmcgY2FuIGJlIGVtcHR5IGFuZCBnc3RfdGFnX2xpc3RfYWRkKCkgd2lsbAorCSAgY29tcGxhaW4gb3IgaGF2ZSBhIFwwIGluIHRoZSBmaXJzdCBmb3VyIGJ5dGVzLCB3aGljaCBpcyB3cm9uZyB0b28uCisKKzIwMTEtMDQtMDQgMTA6MDE6MjYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBZZWFyIDAgaXMgbm90IGEgdmFsaWQgeWVhciBmb3IgR0RhdGUgYW5kIHRoZSBwcm9sZXB0aWMgZ3JlZ29yaWFuIGNhbGVuZGFyCisKKzIwMTEtMDQtMDEgMTM6MTg6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBBZGQgc3VwcG9ydCBmb3Igd3JpdGluZyBNRVRBREFUQV9CTE9DS19QSUNUVVJFIGJsb2NrcyBmb3IgR1NUX1RBR19JTUFHRSBhbmQgR1NUX1RBR19QUkVWSUVXX0lNQUdFCisKKzIwMTEtMDQtMDEgMTE6MzM6NTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlclsyXTogVXNlIG9yY19tZW1zZXQoKSBpbnN0ZWFkIG9mIG1lbXNldCgpCisKKzIwMTEtMDEtMTkgMTg6MDY6NDUgLTA3MDAgIExhbmUgQnJvb2tzIDxkaXJqdWRAZ21haWwuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmg6CisJICB2aWRlb21peGVyOiBBZGQgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCBvcHRpb24gZm9yIGFscGhhIGNoYW5uZWwgZm9ybWF0cworCisyMDExLTAxLTE5IDEyOjA3OjE3IC0wNzAwICBMYW5lIEJyb29rcyA8ZGlyanVkQGdtYWlsLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kLmg6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy5vcmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuaDoKKwkgIHZpZGVvbWl4ZXIyOiBBZGQgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCBvcHRpb24gZm9yIGFscGhhIGNoYW5uZWwgZm9ybWF0cworCSAgVGhpcyBvcHRpb24gYWxsb3dzIHRoZSB2aWRlb21peGVyMiBlbGVtZW50IHRvIG91dHB1dCBhIHZhbGlkIGFscGhhCisJICBjaGFubmVsIHdoZW4gdGhlIGlucHV0cyBjb250YWluIGEgdmFsaWQgYWxwaGEgY2hhbm5lbC4gVGhpcyBhbGxvd3MKKwkgIG1peGluZyB0byBvY2N1ciBpbiBtdWx0aXBsZSBzdGFnZXMgc2VyaWFsbHkuCisJICBUaGUgZm9sbG93aW5nIHBpcGVsaW5lIHNob3dzIGFuIGV4YW1wbGUgb2Ygc3VjaCBhIHBpcGVsaW5lOgorCSAgZ3N0LWxhdW5jaCB2aWRlb3Rlc3RzcmMgYmFja2dyb3VuZC1jb2xvcj0weDAwMDAwMCBwYXR0ZXJuPWJhbGwgISB2aWRlby94LXJhdy15dXYsZm9ybWF0PVwoZm91cmNjXClBWVVWICEgdmlkZW9taXhlcjIgYmFja2dyb3VuZD10cmFuc3BhcmVudCBuYW1lPW1peDEgISB2aWRlb21peGVyMiBuYW1lPW1peDIgISBmZm1wZWdjb2xvcnNwYWNlICEgYXV0b3ZpZGVvc2luayAgdmlkZW90ZXN0c3JjICEgdmlkZW8veC1yYXcteXV2LGZvcm1hdD1cKGZvdXJjY1wpQVlVViAhIG1peDIuCisJICBUaGUgZmlyc3QgdmlkZW90ZXN0c3JjIGluIHRoaXMgcGlwZWxpbmUgY3JlYXRlcyBhIG1vdmluZyBiYWxsIG9uIGEKKwkgIHRyYW5zcGFyZW50IGJhY2tncm91bmQuIEl0IGlzIHRoZW4gcGFzc2VkIHRvIHRoZSBmaXJzdCB2aWRlb21peGVyMi4KKwkgIFByZXZpb3VzbHksIHRoaXMgdmlkZW9taXhlcjIgd291bGQgaGF2ZSBmb3JjZWQgdGhlIGFscGhhIGNoYW5uZWwgdG8KKwkgIDEuMCBhbmQgZ2l2ZW4gYSBiYWNrZ3JvdW5kIG9mIGNoZWNrZXIsIGJsYWNrLCBvciB3aGl0ZSB0byB0aGUKKwkgIHN0cmVhbS4gV2l0aCB0aGlzIHBhdGNoLCBob3dldmVyLCB5b3UgY2FuIG5vdyBzcGVjaWZ5IHRoZSBiYWNrZ3JvdW5kCisJICBhcyB0cmFuc3BhcmVudCwgYW5kIHRoZSBhbHBoYSBjaGFubmVsIG9mIHRoZSBpbnB1dCB3aWxsIGJlCisJICBwcmVzZXJ2ZWQuIFRoaXMgYWxsb3dzIGZvciBmdXJ0aGVyIG1peGluZyBkb3duc3RyZWFtLCBhcyBpcyBzaG93biBpbgorCSAgdGhlIGFib3ZlIHBpcGVsaW5lIHdoZXJlIHRoZSBhIHNlY29uZCB2aWRlb21peGVyMiBpcyB1c2VkIHRvIG1peCBpbiBhCisJICBiYWNrZ3JvdW5kIG9mIGFuIHNtcHRlIHZpZGVvdGVzdHNyYy4gU28gdGhlIHJlc3VsdCBpcyBhIGJhbGwgaG92ZXJpbmcKKwkgIG92ZXIgdGhlIHNtcHRlIHRlc3Qgc291cmNlLiBUaGlzIGNvdWxkLCBvZiBjb3Vyc2UsIGhhdmUgYmVlbgorCSAgYWNjb21wbGlzaGVkIHdpdGggYSBzaW5nbGUgbWl4ZXIgZWxlbWVudCwgYnV0IHN0YWdlZCBtaXhpbmcgaXMgdXNlZnVsCisJICB3aGVuIGl0IGlzIG5vdCBjb252ZW5pZW50IHRvIG1peCBhbGwgdmlkZW8gYXQgb25jZSAoZS5nLiBhIHBpcGVsaW5lCisJICB3aGVyZSBhIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgYmluIGV4aXN0IGFuZCBhcmUgbWl4ZWQgYXQgdGhlIGZpbmFsCisJICBvdXRwdXQsIGJ1dCB0aGUgZm9yZWdyb3VuZCBiaW4gbmVlZHMgYW4gaW50ZXJuYWwgbWl4ZXIgdG8gY3JlYXRlCisJICB0cmFuc2l0aW9ucyBiZXR3ZWVuIGNsaXBzKS4KKwkgIEZpeGVzIGJ1ZyAjNjM5OTk0LgorCisyMDExLTAzLTMxIDEzOjI1OjAwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBhbHNvIHVuY29yayBkdXJpbmcgRU9TIHdhaXRpbmcgKGFuZCBhZnRlciBFT1MgaXMgcmVuZGVyZWQpCisJICBQdWxzZXNpbmsgd2FzIHJlY2VudGx5IGNoYW5nZWQgdG8gZGVmZXIgdW5jb3JraW5nIHVudGlsIHRoZXJlIGlzIGRhdGEKKwkgIHRvIHdyaXRlLiBUaGlzIGNvbmRpdGlvbiB3aWxsIGhvd2V2ZXIgbmV2ZXIgb2NjdXIgd2hlbiBFT1MgaW4gYmVpbmcKKwkgIHJlbmRlcmVkIChzaW5jZSB0aGF0IG1hcmtzIHRoZSBlbmQgb2YgZGF0YSkuIENoYW5naW5nIHRvIFBBVVNFRCBzdGF0ZQorCSAgd2hpbGUgRU9TIGlzIGJlaW5nIHdhaXRlZCBvbiByZXN1bHRzIGluIGEgaGFuZzogcGF1c2luZyBjb3JrcyB0aGUKKwkgIHN0cmVhbSwgd2hpY2ggd2lsbCBuZXZlciBiZSB1bmRvbmUgc2luY2UgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIHdoZW4KKwkgIGdvaW5nIGJhY2sgdG8gUExBWUlORy4gSWYgcHVsc2VzaW5rIGlzIHRoZSBjbG9jayBwcm92aWRlciwgZGVhZGxvY2sKKwkgIGVuc3VlcyBzaW5jZSB0aW1lIGRvZXNuJ3QgY29udGludWUgaW4gY29ya2VkIHN0YXRlIGFuZCB0aGUgY2xvY2sgaWQKKwkgIGZvciBFT1Mgd2FpdCBuZXZlciBmaXJlcy4KKwkgIEZpeGVzICM2NDU5NjEuCisKKzIwMTEtMDMtMjkgMTY6MzM6NDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW4uYzoKKwkgIHJ0cGJpbjogRG9uJ3QgdHJ5IHRvIHJlcXVlc3QgdGhlIHNhbWUgcmVxdWVzdCBwYWQgdHdpY2UKKworMjAxMS0wMy0yOCAyMzo0Njo0NyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkgIGZsYWNkZWM6IGZpeCBpc3N1ZXMgd2l0aCBsYXJnZSBtZXRhZGF0YSBibG9ja3Mgd2hlbiBzdHJlYW1pbmcgdW5mcmFtZWQgZmxhYworCSAgUGFyc2UgbWV0YWRhdGEgYmxvY2tzIHdoZW4gaGFuZGxpbmcgdW5wYXJzZWQgZmxhYyBpbiBwdXNoIG1vZGUuIFRoaXMKKwkgIHdvcmtzIGFyb3VuZCBhIGJ1bmNoIG9mIGlzc3VlcyB3aXRoIHRoZSBmbGFjIGRlY29kZXIgd2hlbiBoYW5kbGluZworCSAgbWV0YWRhdGEgYmxvY2tzIHRoYXQgYXJlIGxhcmdlciB0aGFuIHRoZSBtYXguIGZsYWMgZnJhbWVzaXplLCB3aGljaAorCSAgY292ZXJhcnQgYmxvY2tzIG9mdGVuIGFyZS4gV2UgbmVlZCB0byBoYXZlIGFsbCB0aGUgZGF0YSBmb3IgdGhlc2UKKwkgIGJsb2NrcyBhdmFpbGFibGUgd2hlbiB3ZSBwYXNzIGRhdGEgdG8gbGliZmxhYy4KKwkgIGh0dHA6Ly9nc3RyZWFtZXItZGV2ZWwuOTY2MTI1Lm40Lm5hYmJsZS5jb20vRmxhYy1maWxlcy10aGF0LXdpbGwtcGxheWJhY2stYnV0LW5vdC1zdHJlYW0tdGQzMzM4MTk4Lmh0bWwjYTMzOTUyNzYKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01NjY3NjkKKworMjAxMS0wMy0yOCAyMTowNTozMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICBwbHVnaW5zOiBwb3J0IHRvIG5ldyBtZW1vcnkgQVBJCisKKzIwMTEtMDMtMjggMjA6NTA6NTkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEtZmRvCisKKzIwMTEtMDMtMjcgMjE6Mzk6NTAgKzAyMDAgIEphbiBVcmJhxYRza2kgPHd1bGN6ZXJAd3VsY3plci5vcmc+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkgIGZsdmRlbXV4OiBEbyBub3QgYnVpbGQgYW4gaW5kZXggaWYgdXBzdHJlYW0gaXMgbm90IHNlZWthYmxlCisJICBBbiBpbmRleCBpcyBub3QgdXNlZnVsIGlmIHVwc3RyZWFtIGNhbm5vdCBoYW5kbGUgc2Vla3MgYW5kIGJ1aWxkaW5nIGl0CisJICBmb3IgaW5maW5pdGUgZmlsZXMsIGZvciBpbnN0YW5jZSBGTFYgc3RyZWFtcywgcmVzdWx0cyBpbiBhIG1lbW9yeSBsZWFrLgorCisyMDExLTAzLTI3IDAxOjE5OjU4ICswMzAwICBBbGV4ZXkgQ2hlcm5vdiA8NGVybm92QGdtYWlsLmNvbT4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogc3lzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwycmFkaW8uYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJyYWRpby5oOgorCSAgdjRsMjogbmV3IHY0bDJyYWRpbyBlbGVtZW50IHRvIGNvbnRyb2wgYW5hbG9nIHJhZGlvIGRldmljZXMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDAxMTgKKworMjAxMS0wMy0yNSAyMjoyMjo0MyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSAxOTNiNzE3IHRvIDFjY2JlMDkKKworMjAxMS0wMy0yNSAxNDo1NjowNiArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gYjc3ZTJiZiB0byAxOTNiNzE3CisKKzIwMTEtMDMtMjUgMTI6NTM6NDMgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2NhaXJvL01ha2VmaWxlLmFtOgorCSAgY2Fpcm86IGZpeCB0aGUgbmFtZSBvZiB0aGUgKi1tYXJzaGFsbC5saXN0IGZpbGUgdG8gdW5icmVhayBtYWtlIGRpc3RjaGVjaworCisyMDExLTAzLTI1IDA5OjMxOjAzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGQ4ODE0YjYgdG8gYjc3ZTJiZgorCisyMDExLTAzLTI1IDA5OjA2OjE2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDZhYWEyODYgdG8gZDg4MTRiNgorCisyMDExLTAzLTI1IDAwOjEwOjU2ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICBzcGVjdHJ1bTogcmVmYWN0b3IgcHJvY2Vzc2luZyBsb29wIGZvciBibG9jayBiYXNlZCBvcGVyYXRpb24KKwkgIFByZXZpb3VzbHkgdGhlIGNoYWluIGZ1bmN0aW9uIHdhcyB3b3JraW5nIHNhbXBsZSBmcmFtZSBiYXNlZC4gSW4gZWFjaCBjeWNsZSBpdAorCSAgd2FzIGNoZWNraW5nIGlmIGl0IGlzIHRpbWUgdG8gcnVuIGEgZmZ0IG9yIGlmIGl0IGlzIHRpbWUgdG8gc2VuZCBhIG1lc3NhZ2UuCisJICBOb3cgd2UgY2hhbmdlZCB0aGUgZGF0YSB0cmFuc2Zvcm0gZnVuY3Rpb25zIHRvIHdvcmsgb24gYSBibG9jayBvZiBkYXRhIGFuZAorCSAgY2FsY3VsYXRlIHRoZSBtYXggbGVuZ3RoIHVudGlsIGVpdGhlciB7ZW5kLW9mLWRhdGEsIGRvLWZmdCwgZG8tbXNnfS4gVGhpcyBhbGxvd3MKKwkgIHVzIGFsc28gdG8gYXZvaWQgdGhlIGR1cGxpY2F0ZWQgY29kZSBmb3IgdGhlIHNpbmdsZSBhbmQgbXVsdGktY2hhbm5lbCBjYXNlIChhcworCSAgdGhlIHRyYW5zZm9ybWVycyBoYXZlIHRoZSBzYW1lIHNpZ25hdHVyZSBub3cpLgorCisyMDExLTAzLTI0IDIzOjQ3OjMzICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGphY2s6IHVuYnJlYWsgdGhlIGJ1aWxkIGZvciBqYWNrMiB1c2VycworCSAgSmFjazIgKHZlcnNpb25zIDEuWC5YKSBkb2VzIG9ubHkgaGF2ZSB0aGF0IEFQSSBpbiBzdm4uIExpbW1pdCB0aGUgdXNlIG9mIHRoZSBuZXcKKwkgIEFQSSBmb3IgamFjazEgdmVyc2lvbnMuCisKKzIwMTEtMDMtMjQgMTg6NDk6MTkgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDZhZWM2YjkgdG8gNmFhYTI4NgorCisyMDExLTAzLTI0IDE0OjE0OjA5ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IGZpeCB0aGUgZXJyb3IgYWNjdW11bGF0aW9uIGFuZCBmcmFtZXNfdG9kbyBoYW5kbGluZworCSAgRXZlbiB0aG91Z2ggd2Ugd3JhcCBhcm91bmQgdGhlIGFjY3VtdWxhdGVkIHNlY29uZCwgd2Ugc3RpbGwgbmVlZCB0byBhZGQgdGhlCisJICBlcnJvciBpbiB0aGUgc2FtZSBjeWNsZS4gSW5jcmVhc2UgdGhlIHRvZG8gaW4gdGhlIHNhbWUgY29uZGl0aW9uYWwgYXMgYWZ0ZXJ3YXJkcworCSAgdGhlIGFjY3VtdWxhdGVkIGVycm9yIHdpbGwgYmUgYmVsb3cgb25lIHNlY29uZC4KKworMjAxMS0wMy0yNCAxMzo1MzoxMiArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIHNwZWN0cnVtOiBmaXggYnJva2VuIGNvZGUgcmVzdWx0aW5nIGZvciBhIHdyb25nIHNwbGl0dXAgb2YgY2hhbmdlcworCisyMDExLTAzLTIyIDE2OjI5OjUzICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICBzcGVjdHJ1bTogc2ltcGxpZnkgdGhlIGhhdmVfaW50ZXJ2YWwgY2FsY3VsYXRpb24KKwkgIE1vdmUgc29tZSBvZiB0aGUgY29uZGl0aW9ucyB0byB0aGUgcGxhY2VzIHdoZXJlIHRoZSBkZXBlbmRlbnQgdmFyaWFibGVzIGNoYW5nZS4KKworMjAxMS0wMy0yMiAxNjoyNjo0NSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIHNwZWN0cnVtOiB1c2UgbG9jYWwgdmFyIGZvciBpbnB1dF9kYXRhIGZ1bmN0aW9uCisJICBBdm9pZCBkZXJlZmVyZW5jaW5nIHRoZSBpbnB1dF9kYXRhIGZyb20gdGhlIGluc3RhbmNlIGZyb20gd2l0aGluIGFuIGlubmVyIGxvb3AuCisKKzIwMTEtMDMtMjMgMTY6MzQ6MTYgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5oOgorCSAgc3BlZXhkZWM6IEdldCBhbmQgdXNlIHN0cmVhbWhlYWRlciBmcm9tIHRoZSBjYXBzIGlmIHBvc3NpYmxlCisJICBUaGlzIGFsbG93cyBwbGF5YmFjayBvZiBzdHJlYW1zIHdoZXJlIHRoZSBzdHJlYW1oZWFkZXIgYnVmZmVycworCSAgd2VyZSBkcm9wcGVkIGZyb20gdGhlIHN0cmVhbSBmb3Igc29tZSByZWFzb24uCisKKzIwMTEtMDMtMjIgMTk6MzY6MzEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiB1c2UgcnVubmluZyB0aW1lIGZvciBzeW5jaHJvbml6YXRpb24KKwkgIEZpeGVzICM0MzI2MTIuCisKKzIwMTEtMDMtMjIgMTk6MzY6MjEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogdXNlIHJ1bm5pbmcgdGltZSBmb3Igc3luY2hyb25pemF0aW9uCisJICBGaXhlcyAjNDMyNjEyLgorCisyMDExLTAzLTIyIDE5OjM1OjU4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogdXNlIHJ1bm5pbmcgdGltZSBmb3Igc3luY2hyb25pemF0aW9uCisJICBTZWUgYnVnICM0MzI2MTIuCisKKzIwMTEtMDMtMjIgMTI6NTM6MjIgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZS5hYzogcmVkdW5kYW50IHVzZXMgb2YgQUNfTVNHX1JFU1VMVCgpCisJICBjbGVhbmVkIHRoZSByZWR1bmRhbnQgdXNlcyBvZiBBQ19NU0dfUkVTVUxUKCkgaW4gY29uZmlndXJlLmFjCisKKzIwMTEtMDMtMTggMTk6MzQ6NTcgKzAxMDAgIEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisKKwkqIGF1dG9nZW4uc2g6CisJICBhdXRvZ2VuOiB3aW5nbyBzaWduZWQgY29tbWVudAorCisyMDExLTAzLTE2IDEwOjQzOjQ3ICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkgIGphY2thdWRpb3Npbms6IEZpeCB0eXBvIGZyb20gOTU0NDYyMjY3NGMwZDBhMzE0N2E5YjUxMTQ1MTU5YjAyZWVjNjhlOQorCisyMDExLTAzLTE2IDA5OjM4OjQzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYTogTWFyayB0YWcgbWFwcGluZyB0YWJsZXMgYXMgc3RhdGljIGNvbnN0CisKKzIwMTEtMDMtMTYgMDk6Mzc6NTggKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogVXNlIEFSVElTVCBpbnN0ZWFkIG9mIEFVVEhPUiBmb3IgR1NUX1RBR19BUlRJU1QKKworMjAxMS0wMy0xNiAwOTozNTo1MCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgbWF0cm9za2FkZW11eDogVXNlIEFSVElTVCBNYXRyb3NrYSB0YWcgaW5zdGVhZCBvZiBBVVRIT1IgZm9yIEdTVF9UQUdfQVJUSVNUCisJICBBVVRIT1Igb25seSBleGlzdGVkIGluIGFuIG9sZCB2ZXJzaW9uIG9mIHRoZSBzcGVjIGFuZCBBUlRJU1QgaXMKKwkgIHRoZSBuZXcgcmVwbGFjZW1lbnQgZm9yIHRoaXMuIFdlIGFyZSBzdGlsbCByZWFkaW5nIGJvdGggdG8gc3RpbGwKKwkgIGJlIGNvbXBhdGlibGUgd2l0aCBvbGQgZmlsZXMuCisJICBGaXhlcyBidWcgIzY0NDg3NS4KKworMjAxMS0wMy0xNSAyMDoxOTo0OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvZmlsdGVyLmM6CisJICB0ZXN0czogZW5hYmxlIG1vcmUgZm9ybWF0cyBpbiB2aWRlb2ZpbHRlciB1bml0IHRlc3QsIGNoZWNrIG1vcmUgcmVzb2x1dGlvbnMKKworMjAxMS0wMy0xNCAxOToxNDowNyAtMDQwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSAgdmlkZW9mbGlwOiBGaXggYnVmZmVyIG92ZXJmbG93IGJ1ZyBmb3Igb2RkIHJlc29sdXRpb25zIGFuZCBZNDIyIGNvbG9yc3BhY2VzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ0NzczCisKKzIwMTEtMDMtMTUgMTk6MzY6MDEgKzAyMDAgIFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkgIHNwZWV4ZGVjOiBzaWxlbmNlIHdhcm5pbmcgbWVzc2FnZSB3aGVuIGFwcHJvcHJpYXRlCisJICBJZiB3ZSBkaWQgbm90IGtub3cgaG93IG1hbnkgZnJhbWVzIHRvIGV4cGVjdCwgdGhlbiB3ZSBnZXQgYW4gdW5leHBlY3RlZAorCSAgZW5kIG9mIHN0cmVhbSB3aGVuIHRyeWluZyB0byBkZWNvZGUgbW9yZSBmcmFtZXMgdGhhdCBhcmUgdGhlcmUsIGlmIHRoZXJlCisJICBhcmUgbGVmdG92ZXIgYml0cyB0byBwYWQgdG8gdGhlIG5leHQgYnl0ZQorCisyMDExLTAzLTE0IDE5OjE0OjA3IC0wNDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICB2aWRlb2ZsaXA6IEFkZCBzdXBwb3J0IGZvciBZVVkyLCBVVllWIGFuZCBZVllVIGNvbG9yc3BhY2VzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ0NzczCisKKzIwMTEtMDMtMTUgMDk6NDM6MzUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2ZpbHRlci5jOgorCSAgdGVzdHM6IGluIHZpZGVvZmlsdGVyIHVuaXQgdGVzdCBhbHNvIGNoZWNrIHdpdGggJ29kZCcgd2lkdGhzIGFuZCBoZWlnaHRzCisJICBBbmQgb25seSB1c2Ugb25lIHRlc3Qgc3VpdGUuCisKKzIwMTEtMDMtMTQgMTk6Mjg6MDcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkgIHNwZWV4ZGVjOiBBbHdheXMgcHJvY2VzcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBwZXIgcGFja2V0IGFzIHNwZWNpZmllZCBpbiB0aGUgaGVhZGVyCisJICBMb29raW5nIGF0IHRoZSByZW1haW5pbmcgYml0cyBpbiB0aGUgYml0c3RyZWFtIGFmdGVyIGRlY29kaW5nIGEKKwkgIHNpbmdsZSBmcmFtZSBjYW4ndCBiZSB1c2VkIGFzIGxvb3AgY29uZGl0aW9uLiBUaGUgcmVtYWluaW5nCisJICBiaXRzIG1pZ2h0IG5vdCBnaXZlIGEgY29tcGxldGUgZnJhbWUgYW5kIHRoZSBzcGVleCBkZWNvZGVyIHdpbGwKKwkgIHRoZW4gb3V0cHV0IG5vdGhpbmcgYnV0IGFjY2VzcyB1bmluaXRpYWxpemVkIG1lbW9yeSwgd2hpY2ggbGVhZHMKKwkgIHRvIHZhbGdyaW5kIHdhcm5pbmdzLgorCSAgRml4ZXMgYnVnICM2NDQ2NjkuCisKKzIwMTEtMDMtMTQgMTU6NDY6NTAgKzAxMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8YW1vcmFsZXNAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHJldHVybiBUUlVFIGZyb20gc2luayBwYWQgZXZlbnQgZnVuY3Rpb24gZm9yIHRhZyBldmVudHMsIHdoaWNoIGFyZSBoYW5kbGVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ0NzMwCisKKzIwMTEtMDMtMTIgMDA6NDQ6MzEgKzA1MzAgIFBoaWxpcCBKw6RnZW5zdGVkdCA8cGhpbGlwakBvcGVyYS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogQmV0dGVyIGZpeCBmb3IgZGVhZGxvY2sgb24gZmFpbGVkIGNvbm5lY3QKKwkgIFRoaXMgcmV2ZXJ0cyB0aGUgcHJldmlvdXMgZml4IHRoYXQgd291bGQgY2F1c2UgYSBkb3VibGUtdW5sb2NrIHdoZW4gdGhlCisJICBzdHJlYW0gY29ubmVjdCBmYWlsZWQuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ0NTEwCisKKzIwMTEtMDMtMTEgMjM6MDY6MzEgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IEZpeCBkZWFkbG9jayBpZiBjb25uZWN0aW5nIHRvIFBBIGZhaWxzCisJICBDb21taXQgZGQ0ZWMyMmUgaW50cm9kdWNlZCBhIGRlYWRsb2NrIGluIHRoZSBmYWlsdXJlIHBhdGggd2hpbGUgdHJ5aW5nCisJICB0byBjb25uZWN0IHRvIFB1bHNlQXVkaW8uIFRoaXMgbWFrZXMgc3VyZSB3ZSBkcm9wIHRoZSBsb2NrIG9uIHRoZQorCSAgcmVzb3VyY2UgbXV0ZXggdG8gYXZvaWQgdGhpcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDQ1MTAKKworMjAxMS0wMy0xMSAxNjo1OToxMCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBvcmRlciBzdGF0ZS10ZXN0IGJsYWNrbGlzdCBhbmQgYWRkIGphY2sgZWxlbWVudHMKKwkgIEphY2sgYXVkaW8gc3JjL3NpbmsgZWxlbWVudHMgcmVjZW50bHkgZ290IG1vdmVkIGZyb20gYmFkIGFuZCBzaG91bGQgYmUgZXhjbHVkZWQKKwkgIGZyb20gdGhlIHRlc3QgKGxpa2UgdGhlIG90aGVyIGRldmljZSBzcGVjaWZpYyBzb3VyY2UgYW5kIHNpbmtzKS4KKwkgIEZpeGVzICM2NDQyODgKKworMjAxMS0wMy0xMSAxMzo0NzoyNiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICBkdmRlbXV4OiBDaGFpbiB1cCB0byB0aGUgcGFyZW50IGNsYXNzJyA6OnNlbmRfZXZlbnQgZm9yIG5vbi1zZWVrIGV2ZW50cworCisyMDExLTAzLTExIDEzOjQ2OjA1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkgIGR2ZGVtdXg6IEZpeCByZWZjb3VudCBpc3N1ZXMgd2l0aCB0aGUgc2VlayBldmVudAorCSAgRml4ZXMgYnVnICM2NDI5NjMuCisKKzIwMTEtMDMtMTEgMDk6NTQ6MDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBkb2NzOiBmaXggcHVsc2VzaW5rIGd0ay1kb2MgbWFya3VwCisKKzIwMTEtMDMtMTEgMTA6Mjk6MDggKzAxMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBub3JtYW5kQGlnYWxpYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSAgamFjazogZml4IGJ1aWxkIGFnYWluc3QgamFjayAwLjEyMC4yCisJICBqYWNrX3BvcnRfZ2V0X3RvdGFsX2xhdGVuY3koKSBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mCisJICBqYWNrX3BvcnRfZ2V0X2xhdGVuY3lfcmFuZ2UoKS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDQ0NzcKKworMjAxMS0wMy0xMCAxNDoyOToyNSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIHNwZWN0cnVtOiBtb3JlIGNvbW1lbnRzIGFuZCB0dW5lIGFuZCBsb2dnaW5nCisKKzIwMTEtMDMtMTAgMTQ6MTU6NDIgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBzcGVjdHJ1bTogYXZvaWQgdW5uZWNjZXNhcnkgZXh0cmEgZmZ0IHJ1bnMKKwkgIEJlZm9yZSBpdCB3YXMgcG9zc2libGUgdGhhdCB3ZSBydW4gYW4gZXh0cmEgZmZ0IHdoZW4gdGhlIHRpbWUgZm9yIHNlbmRpbmcgYSBuZXcKKwkgIG1lc3NhZ2UgaXMgZHVlLiBPbmx5IGRvIHRoaXMgaWYgd2UgaGF2ZSBub3QgcnVuIHRoZSBmZnQgZm9yIHRoZSBpbnRlcnZhbCBhdCBhbGwuCisKKzIwMTEtMDMtMTAgMTQ6MTI6MDEgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBzcGVjdHJ1bTogb25seSBzY2FsZSB0aGUgdmVjdG9ycyB0aGF0IHdlIGFyZSBwcm9jZXNzaW5nCisJICBQaGFzZSBpcyBub3QgcHJvZHVjZWQgYnkgZGVmYXVsdCwgc28gbGV0cyBub3Qgc2NhbGUgaXQgdW5jb25kaXRpb25hbGx5IHRvIHNhdmUgYQorCSAgZmV3IGN5Y2xlcy4KKworMjAxMS0wMy0xMCAxNDoxMDoyNSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5oOgorCSAgc3BlY3RydW06IHB1dCBudW1iZXIgb2YgY2hhbm5lbHMgdG8gaW5zdGFuY2UgdmFyaWFibGUKKwkgIFdoZW4gZnJlZWluZyBkYXRhIHRoZSBmb3JtYXQgbWlnaHQgaGF2ZSBjaGFuZ2VkLiBUaHVzIHdlIG5lZWQgdG8gcmVtZW1iZXIgZm9yCisJICB3aGljaCBmb3JtYXQgd2UgYWxsb2NhdGVkIG1lbW9yeS4KKworMjAxMS0wMy0xMCAxMDoyNzoxNCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIHNwZWN0cnVtOiB1cGRhdGUgZG9jIHJldmlldyBzdGFtcAorCisyMDExLTAzLTEwIDEwOjIyOjI5ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICBzcGVjdHJ1bTogdXNlIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciBkYXRhIHJlYWRlcnMKKwkgIERvbid0IGNoZWNrIHRoZSBmb3JtYXQgZm9yIGVhY2ggc2FtcGxlIGZyYW1lIHRvIHJlYWQuIFdlIGNhbiBtYWtlIHRoYXQgZGVjaXNzaW9uCisJICBpbiBfc2V0dXAgYWxyZWFkeS4gVGhpcyBpcyBzdGlsbCBub3QgaWRlYWwgYXMgd2UgY2FsbCB0aGUgZnVuY3Rpb24gcGVyIGZyYW1lLgorCSAgSWRlYWxseSB3ZSBkZXRlcm1pbmUgaG93IG1hbnkgc2FtcGxlcyB3ZSBjYW4gY29weSBhbmQgaGF2ZSBhIGxvb3AgaW4gdGhlIGlucHV0CisJICByZWFkZXIuIEFzIGFuIGFsdGVybmF0aXZlIHdlIG1pZ2h0IGFsc28gY29uc2lkZXIgdG8gdXNlIHRoZSBmZnQgdmFyaWFudHMgZm9yIHRoZQorCSAgdmFyaW91cyBmb3JtYXRzIGFuZCBub3QgY29udmVydCB0byBmbG9hdCBmb3IgYWxsIGNhc2VzIC0gd2Ugd291bGQgc3RpbGwgbmVlZCB0bworCSAgbWl4IG9yIGRlaW50ZXJsZWF2ZSB0aG91Z2guCisKKzIwMTEtMDMtMDkgMTc6MDc6NDcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBpbXByb3ZlIHJlY292ZXJ5IGZyb20gZmFpbGVkIHNlZWsKKwkgIEluIGNhc2Ugc2VydmVyLXNpZGUgZmFpbHMgdG8gcGVyZm9ybSBzZWVrLCBpLmUuIFBMQVkgYXQgbm9uLXplcm8gcmVxdWVzdGVkCisJICBwb3NpdGlvbiwgcmVjb3Zlcnkgc28gZmFyIHdvdWxkIGFycmFuZ2UgZm9yIHN0cmVhbWluZyB0byBjb250aW51ZSwgYWxiZWl0CisJICBoYXZpbmcgbG9zdCBwb3NpdGlvbiB0cmFja2luZyBpbiB0aGUgcHJvY2Vzcy4gIFNvLCBxdWVyeSBwb3NpdGlvbiBwcmlvcgorCSAgdG8gc2VlayBhbmQgdXNlIHVwb24gZmFpbGVkIHNlZWsuCisKKzIwMTEtMDMtMDkgMTY6NTE6MDAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogaGFuZGxlIHBvc2l0aW9uIHF1ZXJ5CisKKzIwMTEtMDMtMDkgMTY6NTc6MjggKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uaDoKKwkgIHNwZWN0cnVtOiAgbXVsdGktY2hhbm5lbCBzdXBwb3J0CisJICBBZGQgYSBib29sZWFuIG11bHRpLWNoYW5uZWwgcHJvcGVydHkgd2l0aCBhIGRlZmF1bHQgb2YgRkFMU0UuIFdoZW4gc2V0IHRvIFRSVUUKKwkgIHRoZSBlbGVtZW50IHdvbid0IG1peCBhbGwgaW5wdXQgY2hhbm5lbHMgdG8gbW9ubywgYnV0IGluc3RlYWQgcnVuIGEgRkZUIG9uIGVhY2gKKwkgIGNoYW5uZWwuIEluIHRoYXQgY2FzZSB0aGUgcmVzdWx0IG1lc3NhZ2Ugd291bGQgY29udGFpbiBhIDIgZGltZW5zaW9uYWwgYXJyYXkKKwkgIG9mIGNoYW5uZWwgeCBkYXRhIGZvciBtYWduaXR1ZGUgYW5kIHBoYXNlLgorCSAgQVBJOiBHc3RTcGVjdHJ1bTptdWx0aS1jaGFubmVsCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTkzNDgyCisKKzIwMTEtMDMtMDkgMTY6NTU6NTYgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBzcGVjdHJ1bTogbW9yZSB4cmVmcyBpbiB0aGUgZG9jcworCisyMDExLTAzLTA5IDEyOjQxOjE1ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IGZhY3RvciBvdXQgdGhlIGNvZGUgdGhhdCBhY2N1bXVsYXRlZCBzYW1wbGVzIGludG8gdGhlIHJpbmctYnVmZmVyCisJICBVc2UgYSBzZXBhcmF0ZSBmdW5jdGlvbiB0byByZWFkIGEgc2FtcGxlIGZyYW1lIGludG8gYSByaW5nYnVmZmVyIHNsb3QuIEluIHRoZQorCSAgZnV0dXJlIHdlIGNhbiB1c2UgZm9ybWF0LXNwZWNpZmljIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYXZvaWQgdGhlIHJlb2NjdXJpbmcKKwkgIGZvcm1hdCBjaGVja3MuCisKKzIwMTEtMDMtMDkgMTI6Mzg6NTIgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBzcGVjdHJ1bTogcHVsbCBmb3JtYXQgdG8gdGVtcCB2YXIgdG8gaW1wcm92ZSByZWFkYWJpbGl0eSBvZiBsaW5lcyB1c2luZyBpdAorCisyMDExLTAzLTA5IDEyOjIwOjExICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IGNvZGUgY2xlYW51cCBmb3IgY29weWluZyBkYXRhIHRvIHJpbmctYnVmZmVyCisJICBSZW5hbWUgZnAgdG8gaXNfZmxvYXQgYW5kIHJlc3RydWN0dXJlIGlmLWVsc2UgcGFydCBmb3IgaGFuZGxpbmcgdGhlIGRpZmZlcmVudCBmb3JtYXRzLgorCisyMDExLTAzLTA5IDExOjQwOjQ4ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICBzcGVjdHJ1bTogYWRkIGEgR3N0U3BlY3J0dW1DaGFubmVsIGNvbnRleHQgc3RydWN0dXJlCisJICBXZSBub3cga2VlcCB0aGUgZmZ0IGRhdGEgdGhhdCBpcyByZWxhdGVkIHRvIG9uZSBjaGFubmVsIGluIGEgc2VwYXJhdGUgc3RydWN0dXJlCisJICB0byBwcmVwYXJlIGZvciBtdWx0aWNoYW5uZWwgc3VwcG9ydC4gV2UgYWxzbyByZWZhY3RvciB0aGUgY29kZSB0byBvcGVyYXRlIG1vcmUKKwkgIG9mdGVuIG9uIHRoZSBjaGFubmVsIGNvbnRleHQuCisKKzIwMTEtMDMtMDkgMTE6MTg6MTkgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBzcGVjdHJ1bTogY2FsbCB0aGUgaW5zdGFuY2UgdmFyIHNwZWN0cnVtIGluc3RlYWQgb2YgZmlsdGVyCisKKzIwMTEtMDMtMDkgMTE6MTQ6MzcgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBzcGVjdHJ1bTogZG9uJ3QgdmFsdWUgd2UgYWxyZWFkeSB0b29rIGZyb20gdGhlIGd2YWx1ZQorCisyMDExLTAzLTA4IDE3OjI2OjE3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICBjb25maWd1cmUuYWMKKworMjAxMS0wMy0wOCAxNzowMjozMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlYnVndXRpbHMvZWZlbmNlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6CisJICBtZXRhOiB1cGRhdGUgZm9yIG5ldyBBUEkKKworMjAxMS0wMy0wOCAxNjoyODoyNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGFkLWhvYyByZWxlYXNlIGJyYW5jaCAnMC4xMC4yOCcKKworPT09IHJlbGVhc2UgMC4xMC4yOCA9PT0KKworMjAxMS0wMy0wOCAxNTo0Nzo1MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTAuMjgKKwkgIEFkLWhvYyByZWxlYXNlIHRvIGZpeCBidWlsZCBpc3N1ZSB3aXRoIG5ld2VyIGtlcm5lbHMuCisKKzIwMTEtMDMtMDMgMDA6MTY6NDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJICB2NGwyOiByZW1vdmUgdW5uZWNlc3NhcnkgbGludXgvdmlkZW9kZXYuaCBpbmNsdWRlCisJICBDYXVzZXMgY29tcGlsYXRpb24gaXNzdWVzIHdpdGggbmV3ZXIga2VybmVsIGhlYWRlcnMgd2hlcmUgdGhlIG9sZAorCSAgdjRsIGludGVyZmFjZSBoYXMgYmVlbiByZW1vdmVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MzcxNgorCisyMDExLTAzLTA4IDEwOjE0OjIwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBNZXJnZSBicmFuY2ggJ21hc3RlcicgaW50byAwLjExCisJICBDb25mbGljdHM6CisJICB0ZXN0cy9leGFtcGxlcy9jYWlyby9NYWtlZmlsZS5hbQorCisyMDExLTAzLTA3IDE2OjU2OjQzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGFsc28gZXN0aW1hdGUgZW9zIGlmIHZlcnkgbmVhciBlb3MKKworMjAxMS0wMy0wNyAxNjo1NjoxOCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBhdm9pZCB0cnlpbmcgdG8gYnVmZmVyIG1vcmUgdGhhbiBpcyBhdmFpbGFibGUuCisJICBUaGF0IGlzLCBpbiBjYXNlIG9mIHNob3J0IChvciBuZWFyIGVvcyBvZikgc3RyZWFtLCBkZWFkbG9jayAodW50aWwgdGltZW91dCkKKwkgIHdvdWxkIG9jY3VyIHRyeWluZyB0byBidWZmZXIgbW9yZSB0aGFuIGlzIHlldCBmb3J0aGNvbWluZy4KKworMjAxMS0wMy0wNyAxMTowMTowNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiByZXNldCBlbGVtZW50IGJhc2VfdGltZSB1cG9uIGZsdXNoCisJICAuLi4gdG8gYXJyYW5nZSBmb3IgcHJvcGVybHkgc2NoZWR1bGVkIHRpbWVvdXQgKGZvbGxvd2luZyBzZWVrKS4KKworMjAxMS0wMy0wNyAxMDo1NDoyMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL2NhaXJvL2NhaXJvX292ZXJsYXkuYzoKKwkgIGNhaXJvb3ZlcmxheTogQWRkIGEgYnVzIGhhbmRsZXIgdG8gdGhlIGV4YW1wbGUgdG8gaGFuZGxlIEVPUy9FUlJPUi9XQVJOSU5HCisJICBBbHNvIGNsZWFuIHVwIHRoZSBwaXBlbGluZSBwcm9wZXJseS4KKworMjAxMS0wMy0wNyAxMDo0NzoyMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCSAgZXhhbXBsZXM6IEFsd2F5cyBkaXN0IHRoZSBjYWlybyBleGFtcGxlCisKKzIwMTEtMDMtMDcgMTA6NDY6MTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9jYWlyby9NYWtlZmlsZS5hbToKKwkgIGNhaXJvb3ZlcmxheTogVXNlIExEQUREIGluc3RlYWQgb2YgTERGTEFHUyBmb3IgbGlicyBhbmQgYWRkICQoR1NUX0xJQlMpCisKKzIwMTEtMDMtMDUgMjM6MjI6NTggKzAwMDAgIEpvbiBOb3JkYnkgPGpvbm9ub3JAZ21haWwuY29tPgorCisJKiB0ZXN0cy9leGFtcGxlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL2NhaXJvL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvY2Fpcm8vY2Fpcm9fb3ZlcmxheS5jOgorCSAgY2Fpcm9vdmVybGF5OiBSZW1vdmUgdW5uZWNlc3NhcnkgZ3RrL2d0ay14MTEgdXNlIGluIGV4YW1wbGUuCisJICBUaGlzIHJlbW92ZXMgY29kZSwgYW5kIGFsbG93cyB0aGUgZXhhbXBsZSB0byBiZSB1c2VkIG9uIGFueSBwbGF0Zm9ybS4KKwkgIEZpeGVzIGJ1ZyAjNjQzOTgxLgorCisyMDExLTAzLTA0IDE4OjM3OjM4IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogVXNlICNpZmRlZnMgZm9yIFY0TDJfUElYX0ZNVF9QSlBHCisJICBJdCdzIG9ubHkgcmVjZW50bHkgYWRkZWQgdG8ga2VybmVsIGhlYWRlcnMuCisKKzIwMTEtMDItMjMgMTY6NTA6NDMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oOgorCSAgd2F2cGFyc2U6IHR1bmUgb3V0cHV0IG1heCBidWZmZXIgc2l6ZSB0byBtYXRlcmlhbAorCSAgLi4uIHRvIGF2b2lkIGVuZGluZyB1cCB3aXRoIHRvbnMgb2Ygc2hvcnQgdGltZSBidWZmZXJzIGZvciBlLmcuIGhpZ2ggc2FtcGxlCisJICByYXRlIGF1ZGlvLgorCisyMDExLTAzLTA0IDE3OjA0OjM3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9jYWlyby9NYWtlZmlsZS5hbToKKwkgIGV4YW1wbGVzOiBkb24ndCB1c2UgaGFyZGNvZGVjIDAuMTAKKworMjAxMS0wMy0wNCAxNjozMDozNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDExLTAzLTA0IDE1OjUwOjAxICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogYWRkIGEgZG9jIGV4YW1wbGUgZm9yIHNldHRpbmcgc3RyZWFtLXByb3BlcnRpZXMKKworMjAxMS0wMy0wNCAxNTo0MjoxOSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGZpeCB0aGUgeG1sIGluIHRoZSBkb2NzCisKKzIwMTEtMDMtMDMgMDA6MTY6NDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJICB2NGwyOiByZW1vdmUgdW5uZWNlc3NhcnkgbGludXgvdmlkZW9kZXYuaCBpbmNsdWRlCisJICBDYXVzZXMgY29tcGlsYXRpb24gaXNzdWVzIHdpdGggbmV3ZXIga2VybmVsIGhlYWRlcnMgd2hlcmUgdGhlIG9sZAorCSAgdjRsIGludGVyZmFjZSBoYXMgYmVlbiByZW1vdmVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MzcxNgorCisyMDExLTAzLTAyIDIzOjIxOjE1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogdGVzdHMvZXhhbXBsZXMvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9leGFtcGxlcy9jYWlyby9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL2NhaXJvL2NhaXJvX292ZXJsYXkuYzoKKwkgIGNhaXJvb3ZlcmxheTogVGhlIGV4YW1wbGUgYWx3YXlzIHJlcXVpcmVzIGd0ay14MTEKKwkgIENoZWNrIGZvciBndGsteDExIGFuZCBvbmx5IGJ1aWxkIHRoZSBleGFtcGxlIGlmIGl0J3MgYXZhaWxhYmxlLgorCisyMDExLTAzLTAyIDIzOjE0OjM2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5oOgorCSAgY2Fpcm9vdmVybGF5OiBTb21lIG1pbm9yIGNsZWFudXAKKworMjAxMS0wMy0wMiAyMzowOToyMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkgIGRvY3M6IFVwZGF0ZSBpbnNwZWN0ZWQgcGx1Z2luIGRhdGEKKworMjAxMS0wMS0yOCAwMjoxNDowNCArMDIwMCAgSm9uIE5vcmRieSA8am9ub25vckBnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBleHQvY2Fpcm8vLmdpdGlnbm9yZToKKwkqIGV4dC9jYWlyby9NYWtlZmlsZS5hbToKKwkqIGV4dC9jYWlyby9nc3RjYWlyby1tYXJzaGFsLmxpc3Q6CisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm8uYzoKKwkqIGV4dC9jYWlyby9nc3RjYWlyb292ZXJsYXkuYzoKKwkqIGV4dC9jYWlyby9nc3RjYWlyb292ZXJsYXkuaDoKKwkqIHRlc3RzL2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvY2Fpcm8vLmdpdGlnbm9yZToKKwkqIHRlc3RzL2V4YW1wbGVzL2NhaXJvL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvY2Fpcm8vY2Fpcm9fb3ZlcmxheS5jOgorCSAgY2Fpcm9vdmVybGF5OiBBZGQgZ2VuZXJpYyBDYWlybyBvdmVybGF5IHZpZGVvIGVsZW1lbnQuCisJICBBbGxvd3MgYXBwbGljYXRpb25zIHRvIGNvbm5lY3QgdG8gdGhlICJkcmF3IiBzaWduYWwgb2YKKwkgIHRoZSBlbGVtZW50IGFuZCBkbyB0aGVpciBjdXN0b20gZHJhd2luZyB0aGVyZS4KKwkgIEluY2x1ZGVzIGFuIGV4YW1wbGUgYXBwbGljYXRpb24gZGVtb25zdHJhdGluZyB1c2FnZS4KKwkgIEZpeGVzOiBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTk1NTIwCisKKzIwMTEtMDMtMDIgMTM6MDA6MzEgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L21vbm9zY29wZS9tb25vc2NvcGUuYzoKKwkgIG1vbm9zY29wZTogZG9uJ3QgbGVhayB0aGUgbW9ub3Njb3BlX3N0YXRlIGRhdGEKKwkgIFRoZSBtb25vc2NvcGVfY2xvc2UoKSBpbXBsZW1lbnRhdGlvbiB3YXMgZW1wdHkuCisKKzIwMTEtMDMtMDIgMTI6NTk6MzUgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L21vbm9zY29wZS9tb25vc2NvcGUuYzoKKwkgIG1vbm9zY29wZTogd2UgaGF2ZSA2NCBjb2xvcnMsIGRvbid0IGFjY2VzcyBjb2xvcnNbNjRdCisJICBGaXhlcyByZW1haW5pbmcgaW52YWxpZCByZWFkLgorCisyMDExLTAzLTAyIDEwOjI1OjI5ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogYXJyYW5nZSBmb3Igbm9uLWZhdGFsIGVycm9yIHdoZW4gcGFyc2luZyBub24tdml0YWwgcGFydHMKKworMjAxMS0wMy0wMiAxMDo1NjozMyArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbW9ub3Njb3BlL2NvbnZvbHZlLmM6CisJICBtb25vc2NvcGU6IHN0YWNrIG5lZWRzIHRvIGJlIHNpemUrMSBhcyB3ZSBwdXQgYSBlbmQtbWFya2VyIGludG8gaXQKKwkgIFZhbGdyaW5kIGlzIHN0aWxsIGNvbXBsYWluaW5nIGFib3V0IG9uZSBiYWQgcmVhZCwgYnV0IHRoaXMgdGFrZXMgY2FyZSBvZiB0aGUKKwkgIGNyYXNoIG1lbnRpb25lZCBpbiB0aGUgY29tbWVudCBhbmQgaW4gYnVnICM1NjQxMjIuCisKKzIwMTEtMDMtMDEgMjI6NDA6MTkgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci12NGwyLUgyNjNwLWFsc2FzcmMtQU1SLnNoOgorCSAgZXhhbXBsZTogZml4IHRoZSB2YXJpYWJsZSBuYW1lIGZvciB0aGUgaXAtYWRkcmVzcworCSAgRml4IHRoZSBuYW1lIGluIHRoZSBsYXVuY2ggcGlwZWxpbmUgYW5kIHVzZSBhIHZhbHVlIG9mICJsb2NhbGhvc3QiIGJ5IGRlZmF1bHQuCisKKzIwMTEtMDItMjggMTk6MTY6MDAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmUuYWM6IGN5Z3dpbi9taW5ndzsgZW5hYmxlIHBsdWdpbiBsaW5raW5nIHRvIHN0YXRpYyBsaWIKKwkgIFVzZWZ1bCBmb3IgRGlyZWN0WCBwbHVnaW4ocykuCisJICBGaXhlcyAjNjQyNTA3LgorCisyMDExLTAyLTI4IDE5OjEzOjQxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlLmFjOiBleHBvcnQgcGx1Z2luIGRlc2NyaXB0aW9uIG1vcmUgcGxhdGZvcm0gaW5kZXBlbmRlbnQKKwkgIEZpeGVzICM2NDI1MDQuCisKKzIwMTEtMDItMjggMTg6MzI6NTQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMWRlN2Y2YSB0byA2YWVjNmI5CisKKzIwMTEtMDItMjggMTM6Mjk6NDcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIE1lcmdlIGJyYW5jaCAnbWFzdGVyJyBpbnRvIDAuMTEKKworMjAxMS0wMi0yOCAxMzoyODoyOSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogdXNlIE5ldEFkZHJlc3MgbWV0YWRhdGEKKworMjAxMS0wMi0yOCAxMzoxNDozNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcC5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcDogaW1wbGVtZW50IE5ldEFkZHJlc3Mgd2l0aCBtZXRhZGF0YQorCisyMDExLTAyLTI4IDEwOjE2OjUyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMjogcmVnaXN0ZXIgbWV0YWRhdGEKKworMjAxMS0wMi0yNyAxOTo0MzoxMyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlYnVndXRpbHMvZWZlbmNlLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzoKKwkqIHN5cy94aW1hZ2UveGltYWdldXRpbC5oOgorCSAgbWV0YTogZml4IGZvciBuZXcgQVBJCisKKzIwMTEtMDItMjUgMTY6Mjk6MzggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL2VmZW5jZS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6CisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuaDoKKwkgIG1ldGFkYXRhOiB1c2UgbWV0YWRhdGEgZm9yIHByaXZhdGUgYnVmZmVyIGRhdGEKKwkgIFVzZSBidWZmZXIgbWV0YWRhdGEgdG8gc3RvcmUgZWxlbWVudCBwcml2YXRlIGRhdGEuCisKKzIwMTEtMDItMjQgMTM6NTE6MzIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmg6CisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzoKKwkqIHN5cy94aW1hZ2UveGltYWdldXRpbC5oOgorCSAgbWluaW9iamVjdDogcG9ydCB0byAwLjExCisJICBVc2UgYnVmZmVyIHByaXZhdGUgZGF0YSBpbnN0ZWFkIG9mIHN1YmNsYXNzaW5nLgorCisyMDExLTAyLTI0IDEzOjUwOjQ4ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9wdWxzZS9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgIGJ1aWxkOiBkb24ndCBoYXJkY29kZSB2ZXJzaW9uIG51bWJlcgorCisyMDExLTAyLTI0IDEzOjAzOjQ0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSAgaWQzOiB1c2UgYm94ZWQgdHlwZSBpbnN0ZWFkIG9mIG1pbmlvYmplY3QKKworMjAxMS0wMi0yNCAxMzowMDo0OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlYnVndXRpbHMvZWZlbmNlLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHAuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICBtaW5pb2JqZWN0OiB1c2UgYnVmZmVyIHByaXZhdGUgZmllbGQgZm9yIGV4dHJhIGRhdGEKKwkgIFVzZSB0aGUgb3duZXIgcHJpdmF0ZSBmaWVsZCB0byBzdG9yZSBleHRyYSBidWZmZXIgZGF0YSBpbnN0ZWFkIG9mIHVzaW5nCisJICBzdWJjbGFzc2luZy4KKworMjAxMS0wMi0yNCAxMjoyMzo0NCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogYWRkIGR1cmF0aW9uIHdoZW4gZXh0aW1hdGluZyBRb1MgdGltZQorCSAgV2hlbiB3ZSBuZWVkIHRvIGRlY2lkZSBvbiB0aGUgbmV4dCBRb1MgdGltZSwgdGFrZSBpbnRvIGFjY291bnQgdGhlIGR1cmF0aW9uIG9mCisJICB0aGUgYnVmZmVycy4KKworMjAxMS0wMi0yOCAxMTo1ODowNSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCSAgQ29uZmxpY3RzOgorCSAgY29uZmlndXJlLmFjCisKKzIwMTEtMDItMjMgMTc6NDE6MjIgKzAxMDAgIFBoaWxpcCBKw6RnZW5zdGVkdCA8cGhpbGlwakBvcGVyYS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogcmVsZWFzZSBwYV9zaGFyZWRfcmVzb3VyY2VfbXV0ZXggYmVmb3JlIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQKKwkgIE5vdCBkb2luZyBzbyBjYW4gcmVzdWx0IGluIGEgZGVhZGxvY2sgd2hlbiB0d28gdGhyZWFkcyBlbnRlcgorCSAgZ3N0X3B1bHNlcmluZ2J1ZmZlcl9vcGVuX2RldmljZSBhdCB0aGUgc2FtZSB0aW1lLCBhcworCSAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCByZWxlYXNlcyB0aGUgbWFpbmxvb3AgbG9jayB3aGlsZSB3YWl0aW5nLAorCSAgYWxsb3dpbmcgYW5vdGhlciB0aHJlYWQgdG8gdGFrZSBpdCwgcmVzdWx0aW5nIGluIGEgZGVhZGxvY2sgYXMgdHdvCisJICB0aHJlYWRzIHdhaXRzIGZvciB0aGUgbG9jayB0aGUgb3RoZXIgaXMgaG9sZGluZy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDMwODcKKworMjAxMS0wMi0yMyAxNzoxODoxOSArMDEwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBzL3Jlc3NvdXJjZS9yZXNvdXJjZS8KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDMwODcKKworMjAxMS0wMi0yNSAyMDoxMjozNSAtMDgwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJlbW92ZSBhY2NpZGVudGFsIGRlYnVnIG1lc3NhZ2UKKwkgIGluIHByZXZpb3VzIGNvbW1pdAorCisyMDExLTAyLTI1IDE5OjM1OjUxIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWRkIHN1cHBvcnQgZm9yIDJWdXkgYW5kIHIyMTAKKworMjAxMS0wMi0yNCAxNDowODoyNSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaDoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhcmJsZW5kLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3NjYWxlcmJvYi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS92ZmlyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlYmZmLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZldGZmLmM6CisJICBkZWludGVybGFjZTogQWRkIHN1cHBvcnQgZm9yIE5WMjEgY29sb3JzcGFjZQorCisyMDExLTAyLTI0IDE0OjAwOjM3ICswMTAwICBDYXJzdGVuIEtyb2xsIDxjYXJAeGltaWRpLmNvbT4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvc2NhbGVyYm9iLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3ZmaXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmUuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmViZmYuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmV0ZmYuYzoKKwkgIGRlaW50ZXJsYWNlOiBBZGQgc3VwcG9ydCBmb3IgTlYxMiBjb2xvcnNwYWNlCisJICBGaXhlcyBidWcgIzY0Mjk2MS4KKworMjAxMS0wMi0yNCAxMzo1NjowNCArMDEwMCAgQ2Fyc3RlbiBLcm9sbCA8Y2FyQHhpbWlkaS5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICBkdmRlbXV4OiBGaXJzdCB0cnkgaWYgdXBzdHJlYW0gaGFuZGxlcyBUSU1FIHNlZWtzIGJlZm9yZSBoYW5kbGluZyB0aGVtIGhlcmUKKwkgIEZpeGVzIGJ1ZyAjNjQyOTYzLgorCisyMDEwLTExLTA4IDE0OjI1OjU5ICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJICBkZWludGVybGFjZTogU2ltcGxpZnkgc2V0Y2FwcworCSAgVGhlIGN1cnJlbnQgY29kZSBuZXZlciB1c2VzIHVwc3RyZWFtIG5lZ290aWF0aW9uIHNvIHRoZSBjb2RlIGNhbiBiZQorCSAgc2lnbmlmaWNhbnRseSBzaW1wbGlmaWVkLgorCisyMDExLTAxLTI0IDEyOjQ4OjE4ICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5LmM6CisJICBkZWludGVybGFjZTogUG9ydCBncmVlZHlsIHRvIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kCisJICBUaGUgbWFpbiBnb2FsIG9mIHRoaXMgY2hhbmdlIGlzIHRvIHJldXNlIHRoZSBjb21wbGV4IGJ1dCBub3cgbmVhdGx5CisJICB3cml0dGVuIHNjYW5saW5lIHBvaW50ZXIgY2FsY3VsYXRpb24gY29kZSBmcm9tIHRoZSBzaW1wbGUgbWV0aG9kcy4KKworMjAxMS0wMi0yMiAxNToyMDoxMSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzoKKwkgIFJldmVydCAiaWQzZGVtdXg6IGVuc3VyZSBhIHRhZ2xpc3QgYmVmb3JlIGFkZGluZyB0aGUgY29udGFpbmVyIHRhZyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgYTg2YmFiNjY4OTNiYjFhMzMyM2E3NTY0MTA1NzNjMTE3YjgyMTllZi4gVGhlIGlzc3VlIGlzCisJICBmaXhlZCB3aXRoIGNvbW1pdCBmZjVlNWE4ZjBkYWExZmRmODk3OTJkMDcyNmVhMDYzYmJkOTlkYjE4IGluc3RlYWQuCisKKzIwMTEtMDItMjIgMTU6MTk6MDAgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzoKKwkgIGlkM2RlbXV4OiByZXR1cm4gSUQzVEFHU19CUk9LRU5fVEFHIGZvciB1bnN1cHBvcnRlZCB2ZXJzaW9ucworCSAgVGhpcyBwcmV2ZW50cyB1cyBmb3IgdHJ5aW5nIHRvIHdvcmsgd2l0aCBhIE5VTEwgdGFnbGlzdC4KKworMjAxMS0wMi0yMiAxNDoxNToyNyArMDEwMCAgRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCB1bml0aWFsaXplZCB2YXJpYWJsZS4KKworMjAxMS0wMi0yMiAxNDowMToyNyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBlbnN1cmUgc2FuZSBwYXJhbWV0ZXJzIHdoZW4gcGFyc2luZyBzdXBlcmluZGV4CisKKzIwMTEtMDItMjIgMTQ6MDA6MTEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogY2hlY2sgZm9yIE5VTEwgYXVkaW8gc3RyZWFtIGZvcm1hdCBoZWFkZXIgd2hlbiBwYXJzaW5nIHN0cmVhbQorCisyMDExLTAyLTIyIDE0OjUyOjE4ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjYzcC1hbHNhc3JjLUFNUi5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjY0LWFsc2FzcmMtUENNQS5zaDoKKwkgIHJ0cC1leGFtcGxlczogbW92ZSBjYXBzZmlsdGVyIGJlaGluZCBjb252ZXJ0ZXJzCisJICBXZSBuZWVkIHRvIGhhdmUgdGhlIGNhcHNmaWx0ZXIgYmVoaW4gdGhlIGNvbnZlcnRlcnMgdG8gbWFrZSB0aGUgY29udmVydGVycworCSAgY29udmVydCBmcm9tIHRoZSBmb3JtYXRzIHY0bDJzcmMgY2FuIGRvIHRvIHdoYXQgd2UgcmVxdWVzdCB3aXRoIHRoZQorCSAgY2Fwc2ZpbHRlci4KKworMjAxMS0wMi0yMiAxNDo1MDo1OSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQtUENNQS5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtUENNQS5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci12NGwyLUgyNjNwLWFsc2FzcmMtQU1SLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci12NGwyLUgyNjQtYWxzYXNyYy1QQ01BLnNoOgorCSAgcnRwLWV4YW1wbGVzOiBmaXggYXNjaWktYXJ0CisJICBTb21lIGJveGVzIHdoZXJlIG1pc2FsaWduZWQgZHVlIHRvIGxvbmcgImF1ZGlvdGV0c3NyYyIgbmFtZS4gVHJpbSB0cmFpbGluZworCSAgd2hpdGVzcGFjZS4KKworMjAxMS0wMi0yMiAxMzoyOToyNiArMDEwMCAgQmxhaXNlIEdhc3NlbmQgPGJsYWlzZSBhdCB3aWxsb3dnYXJhZ2UgZG90IGNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IGhhbmRsZSBOVUxMIGRlbXV4IGVsZW1lbnRzCisJICBXaGVuIHVzaW5nIGdzdHJ0cGJpbiB3aXRoIGlnbm9yZS1wdD10cnVlLCB0aGUgZnJlZV9zdHJlYW0gZnVuY3Rpb24gdHJpZXMgdG8KKwkgIGNhbGwgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSBhbmQgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIG9uIGEgc3RyZWFtLT5kZW11eAorCSAgd2hpY2ggaXMgTlVMTC4KKwkgIGZpeGVzICM2NDI0MTIKKworMjAxMS0wMS0yNCAxMjoxODozOSArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5jOgorCSAgZGVpbnRlcmxhY2U6IHNtYWxsIGNsZWFuLXVwcworCSAgSW1wcm92ZSBkZWJ1ZyBvdXRwdXQgYnkgcHJpbnRpbmcgdGhlIGJ1ZmZlciBwb2ludGVyIHdoZW4KKwkgIHBvcHBpbmcgYSBidWZmZXIgYW5kIHNpbXBsaWZ5IGNvZGUgdG8gdXNlIHNjYW5saW5lcy5ib3R0b21fZmllbGQKKwkgIGFzIGFwcHJvcHJpYXRlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MjY5MQorCisyMDExLTAxLTI0IDEyOjE4OjM5ICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGZpeCBhc3NpZ25lZCBtZXRob2RfaWQgd2hlbiB1c2luZyBmYWxsYmFjaworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MjY5MQorCisyMDExLTAyLTIxIDE3OjE3OjMyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogZml4IHNldHRpbmcgdGhlIFNERVMgcHJvcGVydHkKKwkgIE9ubHkgdGhlIHNkZXMgdmVyaWFibGUgaXMgcHJvdGVjdGVkIHdpdGggdGhlIG9iamVjdCBsb2NrLgorCSAgVXNlIHRoZSByaWdodCBvYmplY3Qgd2hlbiBzZXR0aW5nIHRoZSBzZGVzIHByb3BlcnR5LgorCisyMDExLTAyLTIxIDEyOjA5OjA3ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIFJldmVydCAiQ2hlY2sgdGhhdCBjb2xsZWN0cGFkcyBleGlzdHMgYmVmb3JlIHJlbW92aW5nIHBhZCIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgOGU2Yjg3NmU3NmM5NDQxMGRiMTYwYWZlNWViMzBmMjE0NTJlNDE5Zi4KKwkgIERlcGVuZHMgb24gYSBjb3JlIGNvbW1pdCB0aGF0IHdhcyByZXZlcnRlZAorCisyMDExLTAyLTIxIDAwOjU1OjQ5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJICBpY3lkZW11eDogZml4IHRhZyBsaXN0IGhhbmRsaW5nIGlzc3VlcyB0aGF0IG1pZ2h0IGhhdmUgY2F1c2VkIGNyYXNoZXMKKwkgIEZpeCBzbGlnaHRseSBjb25mdXNlZCB0YWcgaGFuZGxpbmcgaW4gc29tZSBwbGFjZXM6IG1ha2UgaXQgY2xlYXIgd2hlbgorCSAgd2UncmUgdGFraW5nIG93bmVyc2hpcCBvZiBhIHRhZyBsaXN0IGFuZCB3aGVuIG5vdC4gRm9yIGV4YW1wbGUsCisJICBnc3RfaWN5ZGVtdXhfdGFnX2ZvdW5kKCkgd2FzIHRha2luZyBvd25lcnNoaXAgd2hlbiB0aGUgc291cmNlIHBhZAorCSAgZXhpc3RlZCwgYnV0IG90aGVyd2lzZSBub3QgKGxlYWspLiBBbHNvLCBnc3RfZXZlbnRfcGFyc2VfdGFnKCkgZG9lcworCSAgbm90IHJldHVybiBhIG5ld2x5LWFsbG9jYXRlZCB0YWdsaXN0LCBidXQgYSB0YWcgbGlzdCB0aGF0IGJlbG9uZ3MgdG8KKwkgIHRoZSB0YWcgZXZlbnQsIHNvIGRvbid0IGdpdmUgb3duZXJzaGlwIG9mIGl0IGF3YXkuCisJICBXaGlsZSB3ZSdyZSBhdCBpdCwgc29tZSBtaW5vciBjbGVhbi11cHM6IGRvbid0IHJlLWludmVudCBnX3N0cm5kdXAoKQorCSAgYW5kIHNpbXBsaWZ5IGdzdF9pY3lkZW11eF9wYXJzZV9hbmRfc2VuZF90YWdzKCkgYSBiaXQsIGFuZCBkb24ndAorCSAgbGVhayB0aGUgdGFnIGxpc3QgaW4gY2FzZSBubyB2YWxpZCB0YWdzIHdoZXJlIGZvdW5kLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MTMzMAorCisyMDExLTAyLTIwIDIzOjM5OjQxIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIENoZWNrIHRoYXQgY29sbGVjdHBhZHMgZXhpc3RzIGJlZm9yZSByZW1vdmluZyBwYWQKKwkgIFRoZSBjb3JlIG5vdyBjYWxscyByZWxlYXNlIHBhZCBmcm9tIGZpbmFsaXplLCBhdCB3aGljaCBwb2ludAorCSAgdGhlIGNvbGxlY3RwYWRzIG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuIGZyZWVkLgorCisyMDExLTAyLTE5IDE1OjQ4OjIyIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkgIHBuZ2RlYzogSGFuZGxlIDE2LWJpdC1wZXItY2hhbm5lbCBpbWFnZXMKKworMjAxMS0wMi0xOCAxMDoxMjo0NyArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogc3RyZWFtLT5jdXJyZW50X3RvdGFsIGlzIGFjY3VtdWxhdGVkIGJ5dGUgc2l6ZSBhbmQgbm90IHRpbWUKKwkgIFVzZSB0aW1lc3RhbXAgZm9yIHRoZSBzdHJlYW0gaW5kZXggYXMgd2VsbC4KKworMjAxMS0wMi0xNSAxOTozMzo0NSAtMDgwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICB1ZHBzaW5rOiB3YXJuIHdoZW4gcGFja2V0IGlzIHRvbyBsYXJnZQorCisyMDExLTAyLTE3IDE3OjU5OjI1IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS5jOgorCSAgbWF0cm9za2FwYXJzZTogTmV3IGVsZW1lbnQKKwkgIENvcGllZCBmcm9tIGRlbXV4LiAgRHVwbGljYXRlcyBtdWNoIGNvZGUsIGFsc28gc29tZSBkZWFkIGNvZGUKKwkgIHJlbWFpbmluZy4KKworMjAxMS0wMi0xNyAxNzo1Nzo1NSAtMDgwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogRWFybGllciBkZWJ1ZyBjYXRlZ29yeSBpbml0aWFsaXphdGlvbgorCisyMDExLTAxLTIyIDAwOjEzOjE2IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogZG9uJ3Qgc2V0IGR1cmF0aW9uIGZvciBsaXZlIHN0cmVhbQorCisyMDExLTAxLTA2IDE1OjQ0OjI0IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlYnVndXRpbHMvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWd1dGlscy9uZWdvdGlhdGlvbi5jOgorCSAgZGVidWd1dGlsczogcmVtb3ZlIGJpdHJvdHRlbiBuZWdvdGlhdGlvbiBlbGVtZW50CisJICBXYXNuJ3QgZW5hYmxlZCwgZGlkbid0IHdvcmssIGFuZCBwbGFubmVkIGZlYXR1cmVzIGhhdmUgYmVlbgorCSAgc3VwZXJjZWRlZCBieSBjYXBzZmlsdGVyIGFuZCBjYXBzZGVidWcuCisKKzIwMTAtMDktMTcgMTI6MTA6MzggLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5oOgorCSAgcnRwdnJhd3BheTogSW1wbGVtZW50IGludGVybGFjaW5nCisKKzIwMTEtMDItMTcgMTc6NTc6NDIgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGFsc28gYWRkIHRoZSBmcmFtZS10eXBlIGZvciB0aGUgc3RyZWFtIGluZGV4CisKKzIwMTEtMDItMTcgMTc6NTY6MjkgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGdldCB0aGUgaW5kZXggd3JpdGVyIGlkIHdoZW4gdGhlIHBhZCBoYXMgYSBwYXJlbnQKKwkgIE90aGVyd2lzZSB0aGUgaW5kZXggd3JpdGVyIGhhcyBhIHdlaXJlZCBuYW1lLCBhcyB0aGUgcGFkIGhhcyBubyBwYXJlbnQgeWV0LgorCisyMDExLTAyLTE3IDE0OjAwOjQ4ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGF2aWRlbXV4LCBmbHZkZW11eDogZm9ybWF0dGluZyBjbGVhbnVwCisJICBUcmltIHRyYWlsaW5nIHdoaXRlc3BhY2VzIGFuZCBmaXggdGhlIGZvcm1hdHRpbmcgb2YgZG91YmxlIG5lZ2F0aW9uLgorCisyMDExLTAyLTE3IDEzOjU3OjM3ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGF2aWRlbXV4LCBmbHZkZW11eDogbWFyayBkZWx0YS11bml0cyBpbiB0aGUgaW5kZXgKKwkgIFdlIG5lZWQgdG8gdXNlIHRoZSAnZGVsdGEnIGZsYWcgZm9yIGRlbHRhIHVuaXRzIGFuZCBub3QgdGhlICdub25lJyBmbGFnLgorCisyMDExLTAyLTE3IDExOjU4OjQyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvaWNsZXMvLmdpdGlnbm9yZToKKwkgIC5naXRpZ25vcmU6IGlnbm9yZSBtb3ZlZCBlcXVhbGl6ZXIgdGVzdCBiaW5hcnkKKworMjAxMS0wMi0xNyAxMjo0NjoxNCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBtYXJrIGRlbHRhLXVuaXQgaW4gdGhlIGluZGV4CisJICBXZSBuZWVkIHRvIHVzZSB0aGUgZGVsdGEgZmxhZyBmcm8gZGVsdGEgdW5pdHMgYW5kIG5vdCBub25lLiBQcmludCBtb3JlIGRldGFpbHMKKwkgIHRvIHRoZSBkZWJ1ZyBsb2cuCisKKzIwMTEtMDItMTcgMTI6NDQ6MDEgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZm9ybWF0dGluZyBjbGVhbnVwCisJICBUcmltIHRyYWlsaW5nIHdoaXRlc3BhY2VzIGFuZCBmaXggdGhlIGZvcm1hdHRpbmcgb2YgZG91YmxlIG5lZ2F0aW9uLgorCisyMDExLTAyLTE2IDE3OjA5OjIwICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiByZXdvcmsgX3JlcXVlc3RfbmV3X3BhZCB0byBoYW5kbGUgZXhwbGljdCByZXEtcGFkLW5hbWVzCisJICBEb24ndCBpZ25vcmUgZXhwbGljaXQgcGFkLW5hbWVzLgorCisyMDExLTAyLTE2IDE3OjA2OjUxICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IHJld29yayBfcmVxdWVzdF9uZXdfcGFkIHRvIGhhbmRsZSBleHBsaWN0IHJlcS1wYWQtbmFtZXMKKwkgIERvbid0IGlnbm9yZSBleHBsaWNpdCBwYWQtbmFtZXMuIFJlYXJyYW5nZSB0aGUgY29kZSBhbmQgdGhlIGVycm9yIGhhbmRsaW5nIGEKKwkgIGJpdC4gQWRkIGEgRklYTUUtMC4xMSBmb3IgdGhlIGJhZCBwYWQtbmFtZXMuCisKKzIwMTEtMDItMTYgMTU6Mjg6NTMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgIGljbGVzOiBBZGQgZXF1YWxpemVyLXRlc3QgdG8gdGhlIGJ1aWxkIHN5c3RlbQorCisyMDExLTAyLTE2IDE1OjIzOjUwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1LzVdIGVxdWFsaXplci10ZXN0OiBJbml0aWFsaXplIGRlYnVnIGNhdGVnb3J5IGFmdGVyIGdzdF9pbml0KCkgdG8gZml4IHNlZ2ZhdWx0CisKKzIwMDctMTEtMDcgMTU6MzY6NTkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDQvNV0gdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYzogRml4IGdhaW4gcmFuZ2VzIGZvciB0aGUgbGF0ZXN0IGVxdWFsaXplciBjaGFuZ2VzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2ljbGVzL2VxdWFsaXplci10ZXN0LmM6IChkb19zbGlkZXJfZmlkZGxpbmcpOgorCSAgRml4IGdhaW4gcmFuZ2VzIGZvciB0aGUgbGF0ZXN0IGVxdWFsaXplciBjaGFuZ2VzLgorCisyMDA3LTA1LTIxIDE0OjAxOjE2ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzLzVdIENoYW5nZUxvZzogQ2hhbmdlTG9nIHN1cmdlcnkuIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmMgKEFSR19CQU5EX1dJRFRILCBfZG9faW5pdCwgQVJHX0dBSU4sIF9Hc3RJaXJFcXVhbGl6ZXJCYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIENoYW5nZUxvZzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5LgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jIChBUkdfQkFORF9XSURUSCwgX2RvX2luaXQsIEFSR19HQUlOLAorCSAgX0dzdElpckVxdWFsaXplckJhbmQsIG9iamVjdCwgX0dzdElpckVxdWFsaXplckJhbmRDbGFzcywKKwkgIHBhcmVudF9jbGFzcywgZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9zZXRfcHJvcGVydHksCisJICBnc3RfaWlyX2VxdWFsaXplcl9iYW5kX2NsYXNzX2luaXQsIGdzdF9paXJfZXF1YWxpemVyX2JhbmRfZ2V0X3R5cGUsCisJICBnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9nZXRfY2hpbGRfYnlfaW5kZXgsCisJICBnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9nZXRfY2hpbGRyZW5fY291bnQsCisJICBnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9pbnRlcmZhY2VfaW5pdCwgc2V0dXBfZmlsdGVyLAorCSAgZ3N0X2lpcl9lcXVhbGl6ZXJfY29tcHV0ZV9mcmVxdWVuY2llcywgcGx1Z2luX2luaXQpOgorCSAgKiB0ZXN0cy9pY2xlcy9lcXVhbGl6ZXItdGVzdC5jOgorCSAgQWRkIGZpeG1lIGFuZCBjb21tZW50IGZvciBleGFtcGxlLgorCisyMDA3LTAzLTE0IDE2OjMzOjAzICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAyLzVdIHRlc3RzL2ljbGVzL2VxdWFsaXplci10ZXN0LmM6IFBvcnQgdGhlIGV4YW1wbGUgdG8gbmV3IGVxdWFsaXplciBhcGkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYzogKGVxdWFsaXplcl9zZXRfYmFuZF92YWx1ZSksCisJICAoZXF1YWxpemVyX3NldF9hbGxfYmFuZF92YWx1ZXMpLAorCSAgKGVxdWFsaXplcl9zZXRfYmFuZF92YWx1ZV9hbmRfd2FpdCksCisJICAoZXF1YWxpemVyX3NldF9hbGxfYmFuZF92YWx1ZXNfYW5kX3dhaXQpLCAoZG9fc2xpZGVyX2ZpZGRsaW5nKSwKKwkgIChtYWluKToKKwkgIFBvcnQgdGhlIGV4YW1wbGUgdG8gbmV3IGVxdWFsaXplciBhcGkuCisKKzIwMDctMDItMDMgMjM6MzU6MjYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxLzVdIEZpeCB1cCB0byB1c2UgdGhlIG5ld2x5IHBvcnRlZCAoYWN0dWFsbHkgd29ya2luZykgR3N0QXVkaW9GaWx0ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvZXF1YWxpemVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFzZV9pbml0KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9jbGFzc19pbml0KSwgKGdzdF9paXJfZXF1YWxpemVyX2luaXQpLAorCSAgKHNldHVwX2ZpbHRlciksIChnc3RfaWlyX2VxdWFsaXplcl9jb21wdXRlX2ZyZXF1ZW5jaWVzKSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9zZXRfcHJvcGVydHkpLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl90cmFuc2Zvcm1faXApLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfc2V0dXApLAorCSAgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuaDoKKwkgIEZpeCB1cCB0byB1c2UgdGhlIG5ld2x5IHBvcnRlZCAoYWN0dWFsbHkgd29ya2luZykgR3N0QXVkaW9GaWx0ZXIuCisJICBCdW1wIGNvcmUvYmFzZSByZXF1aXJlbWVudHMgdG8gQ1ZTIGZvciB0aGlzLgorCSAgKiB0ZXN0cy9pY2xlcy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYzogKGNoZWNrX2J1cyksCisJICAoZXF1YWxpemVyX3NldF9iYW5kX3ZhbHVlKSwgKGVxdWFsaXplcl9zZXRfYWxsX2JhbmRfdmFsdWVzKSwKKwkgIChlcXVhbGl6ZXJfc2V0X2JhbmRfdmFsdWVfYW5kX3dhaXQpLAorCSAgKGVxdWFsaXplcl9zZXRfYWxsX2JhbmRfdmFsdWVzX2FuZF93YWl0KSwgKGRvX3NsaWRlcl9maWRkbGluZyksCisJICAobWFpbik6CisJICBBZGQgYnJhaW4tZGVhZCBpbnRlcmFjdGl2ZSB0ZXN0IGZvciBlcXVhbGl6ZXIuCisKKzIwMTEtMDItMTUgMTU6NTk6MzIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBBZGQgUEpQRyBtYXBwaW5nCisJICBBZGRzIG1hcHBpbmcgb2YgcHJvZ3Jlc3NpdmUganBlZyBmb3JtYXQKKworMjAxMS0wMi0xNSAxNjozMDoyMCArMDEwMCAgQW5keSBXaW5nbyA8d2luZ29Ab2Jsb25nLmNvbT4KKworCSAgcGx1ZyBxdGRlbXV4IHJlZmNvdW50IGxlYWtzCisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYyAoZ3N0X3F0ZGVtdXhfc3JjX2NvbnZlcnQpOiBVbnJlZiB0aGUgcXRkZW11eDsgd2UKKwkgIHdlcmVuJ3QgZG9pbmcgc28gYmVmb3JlLgorCSAgKGdzdF9xdGRlbXV4X2hhbmRsZV9zcmNfZXZlbnQsIGdzdF9xdGRlbXV4X2NoYWluKTogRml4IHNvbWUgZXJyb3IKKwkgIGNhc2VzIHdoaWNoIHdvdWxkIGxlYWsgYSByZWYgdG8gdGhlIHF0ZGVtdXguCisKKzIwMTEtMDItMTQgMjA6MjA6MDggKzAxMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8YW1vcmFsZXNAZmx1bW90aW9uLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBBZGQgVVJJIHF1ZXJ5IGhhbmRsZXIKKwkgIEZpeGVzIGJ1ZyAjNjQyMzM3LgorCisyMDExLTAyLTE0IDE3OjQ5OjU0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBhdm9pZCBzb3J0aW5nIE5VTEwgYXJyYXkgb2YgY2x1c3RlciBwb3NpdGlvbnMKKworMjAxMS0wMi0xNCAxNjo0Njo0NiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkgIHRoZW9yYXBheTogaGFuZGxlIDAgc2l6ZWQgcGFja2V0cworCSAgSGFuZGxlIDAgc2l6ZWQgcGFja2V0cyAocmVwZWF0IGZyYW1lKSBpbiB0aGUgcGF5bG9hZGVyIGFuZCBkZXBheWxvYWRlci4KKwkgIEZpeGVzICM2NDE4MjcKKworMjAxMS0wMi0xNCAxNToyMToyOSArMDIwMCAgVHV1a2thIFBhc2FuZW4gPHR1dWtrYS5wYXNhbmVuQGlsbWkuZmk+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHRhZ2luamVjdC5jOgorCSAgdGFnaW5qZWN0OiByZXNlbmQgdGFncyB3aGVuIHRoZXkgYXJlIGNoYW5nZWQKKwkgIEFsbG93IHNldHRpbmcgbmV3IHRhZ3Mgb24gdGhlIHByb3BlcnR5IHdoaWxlIHJ1bm5pbmcgYW5kIHNlbmQgdGhlbS4KKwkgIEZpeGVzICM2NDAyNDkKKworMjAxMS0wMi0xNCAxMjo1MzoyNyArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZjk0ZDczOSB0byAxZGU3ZjZhCisKKzIwMTEtMDItMDcgMjM6MzI6NTMgKzAxMDAgIE1pZ3VlbCBBbmdlbCBDYWJyZXJhIE1veWEgPG1hZG1hYzI1MDFAZ21haWwuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggbWlub3IgbGVha3Mgd2hlbiBoYW5kbGluZyBzZXJ2ZXIgcmVxdWVzdHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQwMTYzCisKKzIwMTEtMDItMTQgMDA6NDk6MDAgKzAwMDAgIEhlYXRoIE5pZWxzb24gPGhlYXRobkBnbWFpbC5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGV4dHJhY3QgTXVzaWNCcmFpbnogdGFncworCSAgRXh0cmFjdCBNdXNpY0JyYWlueiB0YWdzIGFkZGVkIGJ5IE11c2ljQnJhaW56J3MgUGljYXJkCisJICB0YWdnZXIgYXBwbGljYXRpb24uIFRoZXNlIHRhZ3MgKGVzcC4gdGhlIGFsYnVtIGlkKSBhcmUKKwkgIGhlbHBmdWwgZm9yIHJoeXRobWJveCBldC5hbC4gdG8gYXV0b21hdGljYWxseSBkb3dubG9hZHMKKwkgIGNvdmVyIGFydC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDIyMDUKKworMjAxMS0wMi0xNCAwMDozODo0NSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJlZmFjdG9yIGlUdW5lcyB0YWcgcGFyc2luZyBhIGJpdAorCisyMDExLTAyLTEwIDIzOjUyOjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSAgZG9hcDogdXBkYXRlIG1haWxpbmcgbGlzdCBsb2NhdGlvbgorCisyMDExLTAyLTEwIDE4OjExOjQ2ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcHJvcGFnYXRlIGVycm9yIGR1cmluZyBleHBvc2Vfc3RyZWFtcworCSAgLi4uIGFzIGl0IG1heSBvY2N1ciBkdXJpbmcgaW5pdGlhbCBwYXJzaW5nIG9mIGZyYWdtZW50ZWQgZmlsZS4KKworMjAxMS0wMi0xMCAxODowMDoxMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGF2b2lkIHNraXBwaW5nIGV4cG9zaW5nIGEgc3RyZWFtIGZvbGxvd2luZyBhIHJlbW92ZWQgc3RyZWFtCisKKzIwMTEtMDItMTAgMTE6NTY6MzMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgbWF0cm9za2FkZW11eDogc3RvcmUgY2x1c3RlciBwb3NpdGlvbnMgcHJvdmlkZWQgYnkgU2Vla0hlYWQKKwkgIC4uLiBhbmQgdXNlIHRob3NlLCBpZiBhdmFpbGFibGUsIHRvIGxvY2F0ZSBhIGNsdXN0ZXIgcmF0aGVyIHRoYW4gc2Nhbm5pbmcuCisKKzIwMTEtMDItMDkgMTY6MjI6NDcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IHByb3Blcmx5IHJlc3VtZSBjbHVzdGVyIHNjYW5uaW5nCisJICAuLi4gcmF0aGVyIHRoYW4gZ2V0dGluZyBvZmZzZXQgdHJhY2tpbmcgbWVzc2VkIHVwLCBhbmQgdGhlbiBsaWtlbHkKKwkgIGZhaWxpbmcgYSBzdWJzZXF1ZW50IGFzc2VydC4KKworMjAxMS0wMi0wOCAxMDowNzo0MyArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzoKKwkgIGlkM2RlbXV4OiBlbnN1cmUgYSB0YWdsaXN0IGJlZm9yZSBhZGRpbmcgdGhlIGNvbnRhaW5lciB0YWcKKwkgIEluIHRoZSBjYXNlIG9mIGlkM3YxIGFsc28gZG9uJ3QgcmV0dXJuIE5VTEwgb24gZW1wdHkgdGFncywgYnV0IGFsc28gY3JlYXRlIGEgbmV3CisJICB0YWdsaXN0IGFuZCBhZGQgdGhlIGNvbnRhaW5lciB0YWcgZm9yIGNvbnNpc3RlbmN5LgorCisyMDExLTAyLTA3IDE3OjA4OjQ3ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHN0cmlwIHRyYWlsaW5nIHNwYWNlcworCisyMDExLTAyLTA3IDE3OjA3OjQyICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0cHNyYzogc2V0IG11bHRpcGxlIHByb3BlcnRpZXMgaW4gb25lIGdvCisJICBUaGVyZSBpcyBubyBuZWVkIGZvciBzZXBhcmF0ZSBnX29iamVjdF9zZXQoKSBjYWxscyBoZXJlLgorCisyMDExLTAyLTAzIDE2OjEwOjQ5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEhhbmRsZSBpbWFnZSBjYXBzIHdpdGhvdXQgYXNzZXJ0aW5nCisJICBJbWFnZXMgbWlnaHQgaGF2ZSBmcmFtZXJhdGU9MC8xIGluIHRoZSBjYXBzLCB3aGljaCBjYXVzZWQgYW4KKwkgIGFzc2VydGlvbiBvbiBkZWludGVybGFjZS4gSSBkb24ndCBrbm93IG9mIGludGVybGFjZWQgaW1hZ2UgZm9ybWF0cworCSAgYnV0IGRlaW50ZXJsYWNlIG1pZ2h0IGJlIGhhcmRjb2RlZCBvbiBzb21lIGdlbmVyaWMgcGlwZWxpbmVzIGFuZAorCSAgaXQgc2hvdWxkbid0IGFzc2VydC4KKwkgIFRoZSBmaXggd2FzIHRvIHNldCBmaWVsZF9kdXJhdGlvbiB0byAwIGlmIHRoZSBpbnB1dCBoYXMgYSBmcmFtZXJhdGUKKwkgIHdpdGggYSAwIG51bWVyYXRvci4KKwkgIFRoaXMgcGF0Y2ggYWxzbyBhZGRzIGNoZWNrcyBmb3IgdGhpcyBzaXR1YXRpb24gb24gdGhlIHVuaXQgdGVzdHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQxNDAwCisKKzIwMTEtMDItMDQgMTI6MzM6MDkgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIGRvY3M6IGZpeCBwYXJhbWV0ZXIgbmFtZSBpbiB1ZHBzcmMgZG9jcworCSAgSXQgaXMgImJ1ZmZlci1zaXplIiBhbmQgbm90ICJidWZmZXIiLiBBbHNvIHRyaW0gdHJhaWxpbmcgd2hpdGVzcGFjZS4KKworMjAxMS0wMi0wMyAyMzo0Mjo1OSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IGZpeCBpbnRlcmxhY2VkIHNldF9mb3JtYXQgY29uZmlndXJhdGlvbgorCSAgQ29tbWl0IDZjODI2OGRiZmQ1Yzg4ZmFjMjhjODgyZWYyZTQ1OThhNjUyMmUyZDYgYnJva2UgcmVjb3JkaW5nCisJICBmcm9tIGludGVybGFjZWQgdjRsMiBzb3VyY2UgKGUuZy4gdHlwaWNhbCB0diBjYXB0dXJlIGNhcmQpIHNpbmNlCisJICBWNEwyX0ZJRUxEX1NFUV9UQiAod2l0aCBmaWVsZHMgc3RvcmVkIHNlcGFyYXRlbHkpIGRvZXMgbm90IG1hcAorCSAgdG8gY3VycmVudGx5IGRlZmluZWQgaW50ZXJsYWNlZCBmb3JtYXQgKGZpZWxkcyBzdG9yZWQgaW50ZXJsZWF2ZWQpLgorCSAgQmVzaWRlcyB0aGlzIG1pc21hdGNoLCBoYXJkd2FyZSBtaWdodCBxdWl0ZSBsaWtlbHkgbm90IHN1cHBvcnQgb3IKKwkgIGFwcHJlY2lhdGUgdGhpcyBmaWVsZCB2YWx1ZSwgc2luY2UgcXVlcnlpbmcgc3VwcG9ydGVkIGZvcm1hdHMgbWFwcGVkCisJICBfSU5URVJMQUNFRCBmaWVsZCBmb3JtYXRzIHRvIGludGVybGFjZWQ9dHJ1ZSBjYXBzIChzbyB0aGUgbGF0dGVyIHNob3VsZAorCSAgbm90IGJlIG1hcHBlZCB0byBmaWVsZCB2YWx1ZSB0aGF0IGlzIG5vdCBrbm93biB0byBiZSBzdXBwb3J0ZWQpLgorCisyMDExLTAyLTAyIDE4OjI3OjUyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHNvdXJjZTogZml4IHR5cGUgb2YgbnRwbnN0aW1lCisKKzIwMTEtMDItMDIgMTg6MjE6MjYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwYmluOiBHZXQgYW5kIHVzZSB0aGUgTlRQIHRpbWUgd2hlbiByZWNlaXZpbmcgUlRDUAorCSAgV2hlbiB3ZSByZWNlaXZlIGFuIFJUQ1AgcGFja2V0LCBnZXQgdGhlIGN1cnJlbnQgTlRQIHRpbWUgaW4gbmFuc2Vjb25kcyBzbyB0aGF0CisJICB3ZSBjYW4gY29ycmVjdGx5IGNhbGN1bGF0ZSB0aGUgcm91bmQtdHJpcCB0aW1lLgorCisyMDExLTAyLTAxIDE5OjQwOjU4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgZGlyZWN0c291bmQ6IGFycmFuZ2UgZm9yIGRlZmluaXRpb24gb2YgX3N3YWIgb24gQ3lnd2luCisJICBnc3RkaXJlY3Rzb3VuZHNpbmsuYzogSW4gZnVuY3Rpb24gJ2dzdF9kaXJlY3Rzb3VuZF9zaW5rX3dyaXRlJzoKKwkgIGdzdGRpcmVjdHNvdW5kc2luay5jOjU1NzogZXJyb3I6IGltcGxpY2l0IGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9uICdfc3dhYicKKwkgIGdzdGRpcmVjdHNvdW5kc2luay5jOjU1NzogZXJyb3I6IG5lc3RlZCBleHRlcm4gZGVjbGFyYXRpb24gb2YgJ19zd2FiJworCisyMDEwLTEwLTA2IDIxOjE3OjI4IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuaDoKKwkgIHJ0cHRoZW9yYWRlcGF5OiBSZXF1ZXN0IG5ldyBrZXlmcmFtZSBvbiBsb3N0IHBhY2tldHMKKwkgIFRoZW9yYSBjYW4gb25seSB1c2UgdGhlIGxhc3QgZnJhbWUgKG9yIHRoZSBrZXlmcmFtZSkgYXMgYSByZWZlcmVuY2UsIHNvIGluCisJICBwcmFjdGljZS4gSWYgd2UgcmVjZWl2ZSBhIGJ1ZmZlciB0aGF0IHJlZmVyZW5jZXMgYW4gdW5rbm93biBjb2RlYm9vaywgcmVxdWVzdAorCSAgbmV3IGhlYWRlcnMuIEl0IHByb2JhYmx5IG1lYW5zIHRoYXQgaGVhZGVycyB3ZXJlIGxvc3QuCisKKzIwMTAtMDgtMjcgMTQ6MTE6NTMgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLW1hcnNoYWwubGlzdDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHJ0cHNlc3Npb246IEFkZCBhY3Rpb24gc2lnbmFsIHRvIHJlcXVlc3QgZWFybHkgUlRDUAorCisyMDEwLTA4LTI3IDE2OjExOjA2IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHJ0cHNlc3Npb246IEFkZCBjYWxsYmFjayB0byBnZXQgdGhlIGN1cnJlbnQgdGltZQorCisyMDEwLTEwLTE5IDIyOjIxOjU0ICswMjAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHJ0cHNlc3Npb246IERvbid0IHJlbGF5IG1vcmUgdGhhbiBvbmUgUExJIHJlcXVlc3QgcGVyIFJUVAorCSAgRHJvcCBQTEkgcmVxdWVzdHMgaWYgb25lIHdhcyByZWxheSBpbiB0aGUgbGFzdCBSVFQsIHRoZSBvdGhlciBzaWRlIG1heQorCSAganVzdCBub3QgaGF2ZSByZWNlaXZlZCB0aGUga2V5ZnJhbWUgeWV0LgorCisyMDEwLTA2LTIzIDE2OjQzOjI0IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHJ0cHNlc3Npb246IFNlbmQgR3N0Rm9yY2VLZXlVbml0IGV2ZW50IGluIHJlc3BvbnNlIHRvIHJlY2VpdmVkIFJUQ1AgUExJCisKKzIwMTAtMTEtMjQgMTU6Mjc6NDYgLTA1MDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBnc3RydHBzZXNzaW9uOiBGYWxsYmFjayBmb3IgRklSIHRvIFBMSSBpZiBQTEkgaXNuJ3QgYXZhaWxhYmxlCisKKzIwMTAtMDYtMjIgMTk6NTY6NTAgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogSW1wbGVtZW50IHNlbmRpbmcgUExJIHBhY2tldHMgaW4gcmVzcG9uc2UgdG8gR3N0Rm9yY2VLZXlVbml0CisKKzIwMTAtMDYtMjIgMTM6MzM6MzIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIHJ0cHNvdXJjZTogUmV0YWluIFJUQ1AgRmVlZGJhY2sgcGFja2V0cyBmb3IgYSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUKKworMjAxMC0wOS0wNyAxMzozNToxNiArMDMwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBNYWtlIHJ0Y3AgYnVmZmVyIG1ldGFkYXRhIHdyaXRhYmxlIGFmdGVyIHByb2Nlc3NpbmcgaXQKKwkgIEZ1bmN0aW9ucyB0aGF0IHByb2Nlc3MgdGhlIHJ0Y3AgYnVmZmVyIGNvdWxkIGRlY2lkZSB0byBrZWVwIGEgcmVmCisJICBvbiB0aGUgYnVmZmVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuIFNvIG1ha2UgdGhlIG1ldGFkYXRhIHdyaXRhYmxlCisJICBvbmx5IGFmdGVyIHRoZXkgYXJlIGRvbmUuCisKKzIwMTAtMDYtMTcgMTc6MzQ6MTkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLW1hcnNoYWwubGlzdDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHJ0cHNlc3Npb246IEVtaXQgc2lnbmFsIG9uIGluY29taW5nIFJUQ1AgRkIgcGFja2V0CisKKzIwMTEtMDItMDEgMTg6MTc6MTMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGZpeCBjb21waWxhdGlvbgorCisyMDEwLTA2LTE1IDE4OjM5OjQ3IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIHJ0cHNlc3Npb246IEFkZCBtZXRob2QgdG8gcmVxdWVzdCBlYXJseSBSVENQIHBhY2tldAorCSAgSW1wbGVtZW50IHRoZSBlYXJseSBtb2RlIGRlZmluZWQgaW4gUkZDIDQ1ODUuIEluIHRoaXMgbW9kZSwgUlRDUCBmZWVkYmFjaworCSAgcGFja2V0cyBhcmUgc2VudCBlYXJseSB0byBub3RpZmllci4KKworMjAxMC0wNi0wMSAxOToyODowMSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIHJ0cHNlc3Npb246IEFkZCBwcm9wZXJ0eSBmb3IgbWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIFJlZ3VsYXIgUlRDUCBtZXNzYWdlcworCSAgVGhpcyBjYW4gYmUgY2hhbmdlZCBhY2NvcmRpbmcgdG8gUkZDIDQ1ODUKKworMjAxMC0wNi0xNCAxODo0MDozMyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4tbWFyc2hhbC5saXN0OgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogRW1pdCBzaWduYWwgd2hlbiBzZW5kaW5nIGEgY29tcG91bmQgUlRDUCBwYWNrZXQKKwkgIFRoaXMgYWxsb3dzIHVzZXJzIHRvIGFkZCBleHRyYSBSVENQIHBhY2tldHMgdG8gdGhlIGNvbXBvdW5kCisJICBSVENQIHBhY2tldC4KKworMjAxMC0wNi0xOSAxOToxMTowNiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJICBydHBwdGRlbXV4OiBUYWcgdXBzdHJlYW0gY3VzdG9tIGV2ZW50cyB3aXRoIHBheWxvYWQgdHlwZQorCisyMDEwLTA2LTE4IDE5OjEyOjQwIC0wNDAwICBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICBydHBzc3JjZGVtdXg6IFRhZyB1cHN0cmVhbSBjdXN0b20gZXZlbnRzIHdpdGggU1NSQworCisyMDEwLTEwLTAxIDE3OjE5OjE2IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IEVtaXQgIm9uLXNzcmMtdmFsaWRhdGVkIiB3aGVuIHZhbGlkYXRpbmcgYnkgUlRDUAorCSAgRW1pdCAib24tc3NyYy12YWxpZGF0ZWQiIGlmIHRoZSBTU1JDIGlzIHZhbGlkYXRlZCBieSByZWNlaXZpbmcKKwkgIGEgUlRDUCBTREVTIHBhY2tldC4KKworMjAxMS0wMi0wMSAxNjozODoyMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkgIGoya3BheTogc2tpcCBFUEggcGFja2V0cworCSAgSW5jbHVkZSBFUEggbWFya2VycyBpbnRvIHRoZSBwcmV2aW91cyBjaHVuayBvZiBwYWNrZXRzLgorCisyMDExLTAxLTMxIDE3OjU2OjE4IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY21hcGF5Lmg6CisJICBydHBwY21hcGF5OiBSZW5hbWUgdGhlIGNsYXNzIHRvIGhhdmUgdGhlIHJpZ2h0IG5hbWUKKwkgIEl0IHdhcyBuYW1lIHBtY2EgaW5zdGVhZCBvZiBwY21hIGFuZCBtYWRlIGRlYnVnIGxvZ3MgaGFyZCB0byBzZWFyY2guCisKKzIwMTEtMDEtMzEgMDU6NTg6MzYgKzAxMDAgIERhdmlkIEhlbm5pbmdzc29uIDxkYXZpZC5oZW5uaW5nc3NvbkBjYW5vbmljYWwuY29tPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBQdWxzZXNpbms6IEFsbG93IGNodW5rcyB1cCB0byBidWZzaXplIGluc3RlYWQgb2Ygc2Vnc2l6ZQorCSAgQnkgYWxsb3dpbmcgbGFyZ2VyIGNodW5rcyB0byBiZSBzZW50LCBQdWxzZUF1ZGlvIHdpbGwgaGF2ZSBhCisJICBsb3dlciBDUFUgdXNhZ2UuIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgb24gbG93LWVuZCBtYWNoaW5lcywKKwkgIHdoZXJlIFB1bHNlQXVkaW8gY2FuIGNyYXNoIGlmIHBhY2tldHMgYXJlIGNvbWluZyBpbiBhdCBhIGhpZ2hlcgorCSAgcmF0ZSB0aGFuIFB1bHNlQXVkaW8gY2FuIHByb2Nlc3MgdGhlbS4KKwkgIFNpZ25lZC1vZmYtYnk6IERhdmlkIEhlbm5pbmdzc29uIDxkYXZpZC5oZW5uaW5nc3NvbkBjYW5vbmljYWwuY29tPgorCisyMDExLTAxLTMxIDEzOjQ0OjQ1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogc2ltcGxpZnkgdGVtcGxhdGUgY2FwcworCSAgV2UgY2FuIG1lcmdlIGFsbCB0aGUgWVVWIHZhcmlhbnRzIGludG8gb25lIHNpbmdsZSBzdHJ1Y3R1cmUuCisKKzIwMTEtMDEtMjcgMTU6MzU6MDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICB3aW4zMjogZml4IERFRkFVTFRfQVVESU9TSU5LLCBzaG91bGQgYmUgZGlyZWN0KnNvdW5kKnNpbmsKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDA3MDUKKworMjAxMS0wMS0yNyAxNjowMjo0NiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBpbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlIHRvIHBsZWFzZSBtaW5ndzMyIGNvbXBpbGVyCisKKzIwMTEtMDEtMjYgMjI6MjE6MzEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5oOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcDogdXNlIHNvY2tsZW5fdCB3aGVyZSBhcHByb3ByaWF0ZSByYXRoZXIgdGhhbiBjdXN0b20gdHlwZQorCSAgSW4gcGFydGljdWxhciwgZml4ZXMgQ3lnd2luIGJ1aWxkIHdoZXJlIHNvY2tsZW5fdCBpcyBkZWZpbmVkIGFzIGludAorCSAgaW4gbGluZSB3aXRoIG5hdGl2ZSB3aW4zMiBhcGkgZGVmaW5pdGlvbi4KKworMjAxMS0wMS0yNyAxMjoxNjo0NiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IG1pbmQgcm91bmRpbmcgaXNzdWVzIHdoZW4gY29udmVydGluZyBmcm9tIGdsb2JhbCB0aW1lIHRvIG1vdiB0aW1lCisJICBJbiBwYXJ0aWN1bGFyLCB0aGlzIGF2b2lkcyBtaXNzaW5nIHRoZSBpbnRlbmRlZCBrZXlmcmFtZSB3aGVuIGZpcnN0IGNvbnZlcnRpbmcKKwkgIGZyb20gdGhlIGZyYW1lJ3MgbW92IHRpbWUgdG8gZ2xvYmFsIHNlZ21lbnQgdGltZSwgYW5kIHRoZW4gYmFjayBmcm9tIGdsb2JhbAorCSAgdGltZSB0byBtb3YgdGltZSB3aGVuIGFjdGl2YXRpbmcgdGhlIHNlZ21lbnQuCisKKzIwMTEtMDEtMjYgMDg6NDg6NDMgKzAwMDAgIE9nbnlhbiBUb25jaGV2IDxvZ255YW4udG9uY2hldkBheGlzLmNvbT4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJICBtYXRyb3NrYW11eDogZG9uJ3QgbGVhayBlYm1sIHdyaXRlciBjYXBzIHdoZW4gcmUtdXNpbmcgbWF0cm9za2FtdXgKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NDA1NDIKKworMjAxMS0wMS0yNSAyMTo1NjoxOSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogZG9uJ3QgZGl2aWRlIGJ5IDAKKworMjAxMS0wMS0xOCAxNDo0ODowNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogcHVsbCBtb2RlIHNob3VsZCBhbHdheXMgcmVwb3J0IHNlZWthYmxlCisJICAuLi4gYXMgaXQgbm8gbG9uZ2VyIHJlcXVpcmVzIGFuIGluZGV4LCBidXQgY2FuIHNlZWsgYnkgc2Nhbm5pbmcgYXMgd2VsbC4KKworMjAxMS0wMS0xMCAxMjozNDoyMiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZm91cmNjLmg6CisJICBxdGRlbXV4OiBzdXBwb3J0IHNvbWUgbW9yZSBtcGVnLTQgZm91cmNjIHZhcmlhbnRzCisKKzIwMTEtMDEtMTAgMTI6MzQ6MDMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBzaW1wbGlmeSByZXRyaWV2aW5nIHN0c2QgY2hpbGQgZW50cnkgYXRvbQorCisyMDExLTAxLTI0IDE4OjI3OjUyICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IERvbid0IGNvbnNpZGVyIDAgZmNjX2hhbmRsZXIgYXMgdW5jb21wcmVzc2VkLgorCSAgSnVzdCBhdm9pZHMgYSB3YXJuaW5nCisKKzIwMTEtMDEtMjAgMTI6MTQ6MDggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHRha2UgY29uZmlndXJlZCBzdGFydCB0aW1lIGludG8gYWNjb3VudAorCSAgd2hlbiBjcmVhdGluZyB0aGUgbmV3c2VnbWVudCBldmVudCwgdGFrZSB0aGUgY29uZmlndXJlZCBzdGFydCB0aW1lCisJICBpbnRvIGFjY291bnQuCisKKzIwMTEtMDEtMjQgMTU6MTE6MDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggcHJpbnRmIGZvcm1hdCB3YXJuaW5nIG9uIG1pbmd3MzIKKwkgIE1ha2Ugd2luMzIgYnVpbGQgYm90IGhhcHB5IGFnYWluLCBhbmQgbmljZWZ5IG91dHB1dCB3aGlsZSB3ZSdyZSBhdCBpdC4KKwkgIHF0ZGVtdXguYzogSW4gZnVuY3Rpb24gJ3F0ZGVtdXhfcGFyc2VfdHJ1bic6CisJICBxdGRlbXV4LmM6MjE2MjozOiBlcnJvcjogZm9ybWF0ICclbHUnIGV4cGVjdHMgdHlwZSAnbG9uZyB1bnNpZ25lZCBpbnQnLCBidXQgYXJndW1lbnQgOSBoYXMgdHlwZSAnZ3VpbnQzMicKKworMjAxMS0wMS0yNCAxMzozOTo1OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3AtQU1SLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC1QQ01BLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuc2g6CisJICBleGFtcGxlczogYXV0b2F1ZGlzaW5rIC0+IGF1dG9hdWRpb3NpbmsgaW4gUlRQIGV4YW1wbGVzCisKKzIwMTEtMDEtMjQgMDA6MzI6NDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDAuMTAuMjcgPT09CisKKzIwMTEtMDEtMjEgMTI6NTQ6MTYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAwLjEwLjI3CisKKzIwMTEtMDEtMjAgMTQ6MTA6NTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgaDI2NGRlcGF5OiBkb24ndCBsZWFrIGNvZGVjIGRhdGEgYnVmZmVyIGluIGJ5dGUtc3RyZWFtPXRydWUgbW9kZQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MDA2MworCisyMDExLTAxLTIwIDEzOjQxOjMzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZG9uJ3QgbGVhayB1cmwgc3RyaW5nCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQwMDY0CisKKzIwMTEtMDEtMjAgMTE6NDU6NDcgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBHcmFjZWZ1bGx5IGhhbmRsZSBtb3YgZmlsZXMgbWlzdXNpbmcgdGhlIFdBVkUgYXRvbXMKKwkgIENoZWNrIHRoYXQgdGhlIFdBVkVIRUFERVIgbm9kZSBpcyBwcmVzZW50IGluc3RlYWQgb2YgYmxpbmRseSB1c2luZyBpdC4KKwkgIElmIG5vdCBwcmVzZW50IHdlIHdvbid0IGJlIGFibGUgdG8gcHJvdmlkZSBhIG1vcmUgcmVmaW5lZCBjYXBzLCBidXQgYXQKKwkgIGxlYXN0IHdlIHdvbid0IGNyYXNoLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY0MDAyOAorCisyMDExLTAxLTIwIDAwOjA3OjMzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiBmaXggYWNjaWRlbnRhbCBicmVha2FnZSBvZiBuYXZpZ2F0aW9uIGludGVyZmFjZSBzdXBwb3J0CisKKzIwMTEtMDEtMTggMTI6NTg6MjkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjI2LjQgcHJlLXJlbGVhc2UKKworMjAxMS0wMS0xMiAxNDowMzo1NyAtMDgwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5jOgorCSAgZGVpbnRlcmxhY2U6IHJld3JpdGUgaG93IG5laWdoYm9yaW5nIHNjYW4gbGluZXMgYXJlIGNhbGN1bGF0ZWQKKwkgIE9sZCBjb2RlIHdhcyBkaWZmaWN1bHQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGUgbmVpZ2hib3JpbmcKKwkgIHNjYW4gbGluZXMgYXJlIGNhbGN1bGF0ZWQsIGFuZCBpdCBhcHBlYXJlZCB0aGF0IHNvbWUgd2VyZSBvZmYgYnkKKwkgICsyIG9yIC0yLCBkZXBlbmRpbmcgb24gdGhlIGZpZWxkIGZsYWcuICBGaXhlcyAjNjM5MzIxLgorCisyMDExLTAxLTE4IDA5OjMzOjA2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlzdWJ0aXRsZS5jOgorCSAgYXZpc3VidGl0bGU6IHNldCBjYXBzIG9uIHNyY3BhZCB0byBmaXggaXNzdWUgd2l0aCBkaXNjb3ZlcmVyCisJICBTZXQgY2FwcyBmcm9tIHRoZSBzdGFydCBzbyBkaXNjb3ZlcmVyIGRvZXNuJ3QgYmxvdyB1cCBvbgorCSAgc2VlaW5nIG5vIG5lZ290aWF0ZWQgY2FwcyBiZXR3ZWVuIGVsZW1lbnRzIG9uIHByZXJvbGwsCisJICB3aGljaCBtaWdodCBoYXBwZW4gaWYgbm8gc3VidGl0bGUgYnVmZmVycyBoYXZlIGJlZW4KKwkgIHB1c2hlZCB5ZXQgYXQgdGhlIHRpbWUuIFNlZSBmaWxlIGZyb20gYnVnICM2MDMzMDguCisKKzIwMTEtMDEtMTcgMjA6MDk6MTYgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGFydW4ucmFnaGF2YW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IFVuY29yayBzdHJlYW0gd2hpbGUgZmx1c2hpbmcgdGhlIHJpbmdidWZmZXIKKwkgIEFmdGVyIHN0YXJ0aW5nIHRoZSByaW5nYnVmZmVyLCB3ZSB3YWl0IGZvciBlbm91Z2ggZGF0YSB0byBhcnJpdmUgYmVmb3JlCisJICB1bmNvcmtpbmcgdGhlIHN0cmVhbS4gVGhpcyB3aWxsIGNhdXNlIHRoZSBwaXBlbGluZSB0byBzdGFsbCBpZiB3ZSBnZXQgYW4KKwkgIEVPUyAob3Igb3RoZXJ3aXNlIG5lZWQgdG8gZmx1c2ggdGhlIHN0cmVhbSkgYmVmb3JlIHN1ZmZpY2llbnQgZGF0YQorCSAgYmVjb21lcyBhdmFpbGFibGUuIFRoaXMgcGF0Y2ggbWFrZXMgc3VyZSB0aGF0IHRoZSBzdHJlYW0gaXMgdW5jb3JrZWQKKwkgIHdoaWxlIGZsdXNoaW5nIHRvIGF2b2lkIHRoaXMgcHJvYmxlbS4KKwkgIEZpeGVzIGlzc3VlIHdpdGggYSB3ZWJraXQgdW5pdCB0ZXN0IHRlc3RpbmcgcmV2ZXJzZSBwbGF5YmFjayBvZgorCSAgYW4gTVA0IEguMjY0L0FBQyBmaWxlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzOTc0MAorCisyMDExLTAxLTE0IDE0OjUxOjUxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGF2b2lkIGNyZWF0aW5nIGNhcHMgZnJvbSBzdHJpbmcgd2hlbiBwb3NzaWJsZQorCSAgRml4ZXMgIzYzOTUxNi4KKworMjAxMS0wMS0xNCAxNDo0ODo0OSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IHNldCBzcmMgcGFkIGNhcHMgd2hlbiBzdGFydGluZyBmaWxlCisJICBGaXhlcyAjNjM5NTE2LgorCisyMDExLTAxLTEyIDIwOjM4OjU5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IGRlZmluZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfe1RCLEJUfSBpZiBub3QgYXZhaWxhYmxlIGluIGhlYWRlcgorCSAgT2xkZXIga2VybmVscyBkb24ndCBoYXZlIHRoZXNlLCBhbmQgdGhlcmUncyBubyBlYXN5IHdheSB0byBjaGVjayBmb3IgdGhlCisJICBleGlzdGFuY2Ugb2YgZW51bXMgdGhhdCBkb2Vzbid0IGludm9sdmUgYSBjb25maWd1cmUgY2hlY2ssIHNvIGp1c3QgZGVmaW5lCisJICB0aGVzZSBpZiB0aGUgVjRMMl9DQVBfVklERU9fT1VUUFVUX09WRVJMQVkgZGVmaW5lIGlzIG5vdCB0aGVyZSwgd2hpY2ggd2FzCisJICBhZGRlZCBpbiB0aGUgc2FtZSBjb21taXQgYXMgdGhlIFRCL0JUIGVudW0uIEZpeGVzIGNvbXBpbGF0aW9uIG9uIENlbnRPUyA1LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzOTMzOQorCisyMDExLTAxLTExIDIzOjE4OjU5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgMC4xMC4yNi4zIHByZS1yZWxlYXNlCisKKzIwMTEtMDEtMTEgMjI6NDI6NDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSAgZG9jczogdXBkYXRlIGRvY3MKKworMjAxMS0wMS0xMSAyMzozOToxMiArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogTWFrZSBjb3JraW5nIGR1cmluZyBwYXVzZSBzeW5jaHJvbm91cworCSAgVGhpcyBtYWtlcyB0aGUgY2FsbCB0byBwYV9zdHJlYW1fY29yaygpIGR1cmluZyByaW5nYnVmZmVyIHBhdXNlKCkKKwkgIHN5bmNocm9ub3VzLCB3aGljaCBtYWtlcyBzdXJlIHRoYXQgdGhlIGNsb2NrIGRvZXMgbm90IGFkdmFuY2UgYWZ0ZXIgd2UKKwkgIHRha2UgYSBzbmFwc2hvdCBmb3Igc3RhcnRfdGltZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MzkyNDAKKworMjAxMS0wMS0xMSAxOTozMzoxNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2RhLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSAgcG86IHVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxMS0wMS0xMSAxNTo1MDoyOCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZTU3MmM4NyB0byBmOTRkNzM5CisKKzIwMTEtMDEtMTAgMTY6MzY6MTkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gY2NiYWE4NSB0byBlNTcyYzg3CisKKzIwMTEtMDEtMTAgMTQ6NTM6MzkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNDY0NDVhZCB0byBjY2JhYTg1CisKKzIwMTEtMDEtMDcgMTM6MjQ6MDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjI2LjIgcHJlLXJlbGVhc2UKKworMjAxMS0wMS0wNyAxMzowNjozOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTEtMDEtMDcgMDI6MzI6MjAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgIGFscGhhOiBmaXggY29tcGlsZXIgd2FybmluZ3MgY2F1c2VkIGJ5IC1ER19ESVNBQkxFX0FTU0VSVAorCisyMDExLTAxLTA3IDAyOjA2OjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOgorCSAgbWF0cm9za2E6IGRvbid0IHB1dCBlc3NlbnRpYWwgZnVuY3Rpb24gY2FsbHMgaW50byBnX2Fzc2VydCgpCisJICBnX2Fzc2VydCgpIHdpbGwgZXhwYW5kIHRvIE5PT1BzIGlmIC1ER19ESVNBQkxFX0FTU0VSVCBpcyBwYXNzZWQuCisKKzIwMTEtMDEtMDcgMDE6MzU6NDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMnNpbms6IGRvbid0IHB1dCBmdW5jdGlvbmFsIGNvZGUgbGlrZSBpb2N0bCBjYWxscyBpbnRvIGdfcmV0dXJuX2lmX2ZhaWwoKQorCSAgVGhlc2UgbWFjcm9zIHdpbGwgZXhwYW5kIHRvIE5PT1BzIGdpdmVuIHRoZSByaWdodCBkZWZpbmVzLiBBbHNvLAorCSAgZ19yZXR1cm5faWZfZmFpbCgpIGFuZCBmcmllbmRzIGFyZSBtZWFudCB0byBiZSB1c2VkIHRvIGNhdGNoIHByb2dyYW1taW5nCisJICBlcnJvcnMgKGxpa2UgaW52YWxpZCBpbnB1dCB0byBmdW5jdGlvbnMpLCBub3QgcnVudGltZSBlcnJvciBoYW5kbGluZy4KKworMjAxMS0wMS0wNyAwMToxMTowMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IG5ldmVyIGRpc2FibGUgZ19hc3NlcnQoKSBhbmQgY2FzdCBjaGVja3MgZm9yIHRoZSB1bml0IHRlc3RzCisJICBUaGUgdW5pdCB0ZXN0cyBhcmUgcmlkZGxlZCB3aXRoIGdfYXNzZXJ0KCkgYW5kIGZyaWVuZHMsIG1ha2Ugc3VyZSB3ZQorCSAgZG9uJ3QgZGlzYWJsZSBhc3NlcnQgYW5kIGNhc3QgY2hlY2tzIGZvciB0aGUgdW5pdCB0ZXN0cyBldmVuIGlmCisJICB0aGlzIGhhcyBiZWVuIHNwZWNpZmllZCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgYmFzZSwgZS5nLiB2aWEKKwkgIC0tZGlzYWJsZS1nbGliLWFzc2VydHMuCisKKzIwMTEtMDEtMDYgMTI6Mjk6MjEgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSAgcnRwOiBGaXggdW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9uIG1hY29zeAorCisyMDExLTAxLTA2IDEyOjI4OjU4ICswMTAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6CisJICBxdGRlbXV4OiBGaXggdW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9uIG1hY29zeAorCisyMDExLTAxLTA1IDE3OjQ5OjE2IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlYnVndXRpbHMvZ3N0Y2Fwc2RlYnVnLmM6CisJICBjYXBzZGVidWc6IEFkZCBjYXBkZWJ1ZyBkZWJ1ZyBjYXRlZ29yeQorCisyMDEwLTEyLTExIDEyOjQyOjEwIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogQ2hhbmdlIHRoZSBkZWZhdWx0IHRvIGxpbmVhcgorCSAgVGhlIHByZXZpb3VzIGRlZmF1bHQsIGdyZWVkeWgsIHRha2VzIDQgdGltZXMgYXMgbG9uZyBhcyBNUEVHLTIKKwkgIHZpZGVvIGRlY29kaW5nLCBhbmQgaXMgdW5saWtlbHkgZmFzdCBlbm91Z2ggb24gYW55IGN1cnJlbnQgQ1BVCisJICB0byBwbGF5IDEwODBpIHZpZGVvIGluIHJlYWwtdGltZS4gIGdyZWVkeWwgaXNuJ3QgbXVjaCBmYXN0ZXIuCisJICBsaW5lYXIgd2FzIGNob3NlbiBvdmVyIHZmaXIsIHNpbmNlIHRoZSBxdWFsaXR5IGFkdmFudGFnZSBvZiB2ZmlyCisJICBpcyBtaW5pbWFsIGNvbXBhcmVkIHRvIHRoZSBvY2Nhc2lvbmFsIHZpc3VhbCBhcnRpZmFjdHMgYW5kIHNsb3dlcgorCSAgcHJvY2Vzc2luZy4KKworMjAxMS0wMS0wNSAxODozMjo1OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZG9uJ3QgY29uZnVzZSByZXR1cm4gdmFsdWVzCisJICBSZXR1cm4gYSByZXR1cm4gdmFsdWUgb2YgdGhlIHJpZ2h0IHR5cGUuCisKKzIwMTEtMDEtMDUgMTY6MjQ6MTMgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2R1bXAuYzoKKwkgIHF0ZGVtdXg6IEZpeCB1bml0aWFsaXplZCB2YXJpYWJsZXMgb24gbWFjb3N4CisKKzIwMTEtMDEtMDUgMTU6MDM6MzIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJICB2cmF3ZGVwYXk6IGZpeCBsZW5ndGggY2hlY2sKKwkgIEFkZCBzb21lIG1vcmUgZGVidWdnaW5nLgorCSAgQWRkIHRoZSBsZW5ndGggY2hlY2sgc28gd2UgZG9uJ3QgY2F1c2UgdW5uZWVkZWQgd2FybmluZ3MuCisKKzIwMTEtMDEtMDUgMTI6MDQ6MDMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgbXVsdGl1ZHBzaW5rOiBhZGQgYnVmZmVyLXNpemUgcHJvcGVydHkKKwkgIEFkZCBidWZmZXItc2l6ZSBwcm9wZXJ0eSB0byBjb25maWd1cmUgdGhlIGtlcm5lbCBzZW5kIGJ1ZmZlci4KKworMjAxMS0wMS0wMyAyMDoxNjoyMiArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlcyB3aGVuIGRlYnVnLWxvZ2dpbmcgZGlzYWJsZWQKKworMjAxMS0wMS0wMyAyMDowNjozNSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thLWRlbXV4OiByZW1vdmUgdW51c2VkIHZhcmlhYmxlcyB3aGVuIGRlYnVnLWxvZ2dpbmcgZGlzYWJsZWQKKworMjAxMS0wMS0wMyAxODowNToxNSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzoKKwkgIGNhY2FzaW5rOiBmaXggbWFza3MgYW5kIHN0cmlkZXMKKwkgIFVzZSB0aGUgcmlnaHQgZW5kaWFubmVzcyB0byByZWFkIHRoZSBtYXNrcy4KKwkgIFVzZSB0aGUgcmlnaHQgc3RyaWRlcyBmb3IgdGhlIGJpdG1hcC4KKwkgIEZpeGVzICM2Mzg1NjkKKworMjAxMS0wMS0wMyAwMToxODowNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IHVuZG8gcHJlc3VtYWJseSBhY2NpZGVudGFsIGVuYWJsZW1lbnQgb2YgdGhlIEdzdFhPdmVybGF5IGludGVyZmFjZQorCSAgTG9va3MgbGlrZSB0aGlzIGdvdCBlbmFibGVkIGJ5IGFjY2lkZW50IHdoZW4gYWRkaW5nIGl0IHRvIHY0bDJzaW5rLAorCSAgc28gdW5kbyB0aGlzIGZvciBub3cuIE5vdCBzdXJlIGl0IG1ha2VzIG11Y2ggc2Vuc2UgaW4gYSBHU3RyZWFtZXIKKwkgIGNvbnRleHQgd2l0aCBjdXJyZW50IGhhcmR3YXJlLgorCisyMDExLTAxLTAzIDE1OjQwOjExICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBpbmNyZWFzZSB1ZHAgYnVmZmVyIHNpemUKKwkgIFNldCBhIGJpZ2dlciBVRFAgYnVmZmVyIHNpemUgYnkgZGVmYXVsdCB0byByZWR1Y2UgcGFja2V0IGxvc3Mgd2l0aAorCSAgaGlnaCBiaXRyYXRlIHN0cmVhbXMuCisKKzIwMTEtMDEtMDIgMTk6MTk6MjcgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oOgorCSAgbXVsdGlmaWxlc2luazogc2VuZCBzdHJlYW0gaGVhZGVycyBpbiBrZXktZnJhbWUgbW9kZQorCisyMDExLTAxLTAyIDE5OjQzOjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2phY2svTWFrZWZpbGUuYW06CisJKiBleHQvamFjay9SRUFETUU6CisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IGZpeCB1cCBlbGVtZW50IGRldGFpbHMgYW5kIHNvbWUgb3RoZXIgbWlub3IgY2xlYW4tdXBzCisKKzIwMTEtMDEtMDIgMTk6MjM6NTEgKzAwMDAgIEVyaWNoIFNjaHViZXJ0IDxlcmljaEBkZWJpYW4ub3JnPgorCisJKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzoKKwkgIGlkM2RlbXV4OiBmaXggcGFyc2luZyBvZiBJRDN2Mi40IGdlbnJlIGZyYW1lcyB3aXRoIG11bHRpcGxlIGdlbnJlcworCSAgV2UnZCBvbmx5IGV4dHJhY3QgdGhlIGZpcnN0IGdlbnJlIChtdWx0aXBsZSB0aW1lcykgaW5zdGVhZCBvZiBhbGwKKwkgIGdlbnJlcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Mzg1MzUKKworMjAxMS0wMS0wMiAxNzo0MDo0MSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSAgamFjazogdGVtcGxhdGUgY2FwcyBoYWQgbGlzdHMgd2l0aCBvbmUgdmFsdWUsIGp1c3QgdXNlIHZhbHVlIGRpcmVjdGx5CisKKzIwMTEtMDEtMDIgMTc6MDc6MTkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IG1ha2UgZ2V0X3R5cGUgZnVuY3Rpb25zIHRocmVhZC1zYWZlCisJICBCZWNhdXNlIHdlIGNhbiAoc2hvdWxkbid0IGJlIG5lZWRlZCB3aXRoIG90aGVyIHdvcmthcm91bmRzIHN0aWxsIHRoZXJlKS4KKworMjAxMS0wMS0wMiAxNToyNzoxOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSAgZG9jczogdXBkYXRlIHBsdWdpbiBkb2NzCisKKzIwMTEtMDEtMDIgMTU6MjU6NDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiAuZ2l0aWdub3JlOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkqIHRlc3RzL2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvamFjay9NYWtlZmlsZS5hbToKKwkgIGphY2s6IG5ldyBqYWNrYXVkaW9zcmMgYW5kIGphY2thdWRpb3NpbmsgZWxlbWVudHMsIG1vdmVkIGZyb20gZ3N0LXBsdWdpbnMtYmFkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjIxOTI5CisKKzIwMTAtMTAtMTkgMTY6MjM6MjMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICB2YXJpb3VzIChleHQpOiBhZGQgbWlzc2luZyBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIGZsYWdzCisJICBDYW5vbmljYWxpemUgcHJvcGVydHkgbmFtZXMgYXMgbmVlZGVkLgorCisyMDEwLTA5LTA5IDE0OjQ5OjA2IC0wNDAwICBUcmlzdGFuIE1hdHRoZXdzIDxsZS5idXNpbmVzc21hbkBnbWFpbC5jb20+CisKKwkqIGV4dC9qYWNrL01ha2VmaWxlLmFtOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICBqYWNrOiBhZGRlZCB0cmFuc2xhdGFibGUgdGV4dCBmb3Igc2VydmVyIG5vdCBmb3VuZCBlcnJvcgorCisyMDEwLTA5LTA2IDE3OjE3OjU0IC0wNDAwICBUcmlzdGFuIE1hdHRoZXdzIDxsZS5idXNpbmVzc21hbkBnbWFpbC5jb20+CisKKwkqIHRlc3RzL2V4YW1wbGVzL2phY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9leGFtcGxlcy9qYWNrL2phY2tfY2xpZW50LmM6CisJICBleGFtcGxlczogYWRkIHRlc3QgdG8gZGVtb25zdHJhdGUgamFja19jbGllbnRfdCB1c2FnZQorCisyMDEwLTA5LTA2IDE2OjExOjMxIC0wNDAwICBUcmlzdGFuIE1hdHRoZXdzIDxsZS5idXNpbmVzc21hbkBnbWFpbC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvY2xpZW50Lmg6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmg6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5oOgorCSAgamFjazogYWRkZWQgY2xpZW50IHByb3BlcnR5CisKKzIwMTAtMDYtMTcgMTY6MjY6MDcgLTA0MDAgIFRyaXN0YW4gTWF0dGhld3MgPHRyaXN0YW5Ac2F0LnFjLmNhPgorCisJKiBleHQvamFjay9nc3RqYWNrYmluLmM6CisJICBqYWNrOiByZW1vdmVkIHVudXNlZCBmaWxlIGdzdGphY2tiaW4uYworCSAgVGhpcyBpcyBhIDAuOCBsZWZ0b3Zlci4KKworMjAxMC0wNS0xMyAxMjo1NToyOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICBqYWNrc3JjOiBtYWtlIHN1cmUgd2UgYWx3YXlzIHJlYWQgbmZyYW1lcworCSAgRXJyb3Igb3V0IHdoZW4gd2UgYXJlIGFza2VkIHRvIHJlYWQgYSBkaWZmZXJlbnQgc2l6ZSB0aGF0IHdoYXQgd2FzIGNvbmZpZ3VyZWQgYXMKKwkgIHRoZSBqYWNrIHBlcmlvZCBzaXplIGJlY2F1c2UgdGhhdCB3b3VsZCBtZWFuIHNvbWV0aGluZyBlbHNlIGlzIHdyb25nLgorCSAgRml4ZXMgIzYxODQwOQorCisyMDEwLTA1LTExIDE3OjU2OjMxIC0wNDAwICBUcmlzdGFuIE1hdHRoZXdzIDx0cmlzdGFuQHNhdC5xYy5jYT4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuaDoKKwkgIGphY2s6IGltcHJvdmUgcHJvY2Vzc19jYgorCisyMDEwLTA0LTI3IDEwOjQ4OjMyIC0wNDAwICBUcmlzdGFuIE1hdHRoZXdzIDx0cmlzdGFuQHRyaXN0YW4tbGFwdG9wLihub25lKT4KKworCSogZXh0L2phY2svTWFrZWZpbGUuYW06CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2t1dGlsLmM6CisJKiBleHQvamFjay9nc3RqYWNrdXRpbC5oOgorCSAgamFjazogaW1wbGVtZW50IG11bHRpY2hhbm5lbCBzdXBwb3J0IGNvcnJlY3RseSBmb3IgamFja2F1ZGlvc3JjCisJICBGaXhlcyBwYXJ0cyBvZiBidWcgIzYxNjU0MS4KKworMjAxMC0wNC0yNyAxMToyMToxNiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2tyaW5nYnVmZmVyLmg6CisJICBqYWNrOiByZW1vdmUgZW1wdHkgZGlzcG9zZSBhbmQgZmluYWxpemUgbWV0aG9kcworCisyMDEwLTA0LTI3IDEwOjU5OjAwICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSAgamFjazogZG9uJ3QgbGVhayBjYXBzCisJICBBZGQgZGlzcG9zZSBtZXRob2RzIHRvIGNsZWFyIGNhcHMuCisKKzIwMTAtMDQtMjcgMTA6MzQ6MjQgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICBqYWNrOiBkb24ndCB1c2UgR1NUX0RFQlVHX0ZVTkNQVFIgZm9yIGdvYmplY3Qgdm1ldGhvZHMKKworMjAxMC0wMy0yNCAxNTo1OTo1MyArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IGZpeCBlbGVtZW50IG5hbWUgaW4gc2VjdGlvbiBkb2MgYmxvYgorCisyMDEwLTAzLTIyIDE2OjU2OjAzICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSAgQWRkIC1Xb2xkLXN0eWxlLWRlZmluaXRpb24KKwkgIGFuZCBmaXggdGhlIHdhcm5pbmdzCisKKzIwMTAtMDMtMjEgMjE6Mzk6MTggKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZXh0L2phY2svZ3N0amFjay5oOgorCSAgQWRkIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVdtaXNzaW5nLXByb3RvdHlwZXMgdG8gY29uZmlndXJlIGZsYWdzCisJICBBbmQgZml4IGFsbCB3YXJuaW5ncworCisyMDEwLTAzLTE4IDE3OjMwOjI2ICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X2RldGFpbHMgPT4gZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X2RldGFpbHNfc2ltcGxlCisKKzIwMDktMTAtMTIgMDk6MDY6MzcgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICBqYWNrOiBlbnN1cmUgc2VndG90YWwgaXMgYXQgbGVhc3QgMgorCSAgTm90IG9ubHkgYWRqdXN0IGJ1ZmZlci10aW1lIGFuZCBhdm9pZCBzZWd0b3RhbD0wLCBidXQgaW5zdGVhZCBlbnN1cmUgc2VndG90YWwgaXMKKwkgIGF0bGVhc3QgMi4gRG8gc2FtZSBjaGFuZ2Ugb24gamFja3NyYy4gV2UgY291bGQgYWxzbyBjaGVjayB0aGUgbGF0ZW5jeSBhbmQgYnVmZmVyCisJICB0aW1lIGNvbmZpZ3VyZWQgYnkgdGhlIGNsaWVudCBhbmQgYWRqdXN0IGJ1ZmZlci10aW1lIHNvIHRoYXQgd2UgZ2V0IHRvIHRoZSBzYW1lCisJICBudW1iZXIgb2Ygc2VnbWVudHMuCisKKzIwMDktMTAtMTIgMDA6NTE6MjcgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSAgamFjazogZG9uJ3QgY3Jhc2ggaW4gcmluZ2J1ZmZlciB3aXRoIFNJR0ZQRSBvbiBzbWFsbCBidWZmZXItdGltZXMKKwkgIEphY2sgb3ZlcnJpZGVzIHVzZXItc3BlY2lmaWVkIGxhdGVuY3ktdGltZSB3aXRoIHRoZSBvbmUgaXQgZ2V0cyBmcm9tIGphY2sKKwkgIGl0c2VsZi4gSXQgYWxzbyBuZWVkcyB0byBhZGp1c3QgYnVmZmVyLXRpbWUgc29tZXdoYXQgdG8gYXZvaWQgc2VndG90YWwgYmVpbmcgMAorCisyMDA5LTA1LTExIDE2OjEyOjU0ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jOgorCSogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSAgamFjazogd2hlbiBzdG9wcGluZyBwbGF5YmFjaywgZG8gb25lIG1vcmUgY3ljbGUgdG8gZmx1c2ggdGhlIHBvcnQuIEZpeGVzICM1ODIxNjcKKwkgIFRoZSBnc3RfamFja19hdWRpb19jbGllbnRfc2V0X2FjdGl2ZSgpIGZsYWdzIHRoZSBwb3J0IGFzIGRlYWN0aXZhdGluZyBhbmQgdXNlcworCSAgYSBHQ29uZCB0byB3YWl0IHVudGlsIHRoZSBqYWNrX3Byb2Nlc3NfY2IoKSBoYXMgcnVuIG9uY2UgbW9yZSBhbmQgY2xlYXJlZCB0aGUKKwkgIGZsYWcuIFRoaXMgd2F5IHRoZSBjbGllbnQgemVybydzIHRoZSBidWZmZXIuIFRoaXMgaGFwcGVucyBpZiBvbmUgbWFueWFsbHkgZ28KKwkgIHRvIFBBVVNFRCBhbmQgdGhlbiB0byBSRUFEWSwgd2hpbGUgbGV0aW5nIHRoZSBtYWlubG9vcCBydW4gaW5iZXR3ZWVuLgorCisyMDA5LTAzLTE2IDExOjIxOjAyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJKiBleHQvamFjay9nc3RqYWNrLmg6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgIGphY2s6IEFkZCBuZXcgY29ubmVjdGlvbiBtb2RlCisJICBBZGQgYSBuZXcgY29ubmVjdGlvbiBtb2RlIHRvIGphY2tzcmMgYW5kIGphY2tzaW5rLiBJbiB0aGlzIG5ldyBhdXRvLWZvcmNlCisJICBjb25uZWN0aW9uIG1vZGUgamFjayB3aWxsIGNyZWF0ZSBhcyBtYW55IHBvcnRzIGFzIHJlcXVlc3RlZC9uZWVkZWQgaW4gdGhlCisJICBwaXBlbGluZSBhbmQgd2lsbCB0aGVuIGNvbm5lY3QgYXMgbWFueSBwaHlzaWNhbCBwb3J0cyBhcyBwb3NzaWJsZSwgcG9zc2libHkKKwkgIGxlYXZpbmcgc29tZSBwb3J0cyB1bmNvbm5lY3RlZC4KKwkgIEFsc28gZ2V0IHJpZCBvZiBzb21lIGxlZnRvdmVyIGdfcHJpbnQuCisJICBGaXhlcyAjNTc1Mjg0LgorCisyMDA4LTExLTIzIDE3OjUwOjA4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGV4dC9qYWNrLzogUXVlcnkgcG9ydCBsYXRlbmNpZXMgZm9yIHNpbmsvc3JjIGRlbGF5cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jOgorCSAgUXVlcnkgcG9ydCBsYXRlbmNpZXMgZm9yIHNpbmsvc3JjIGRlbGF5cy4KKwkgICogZXh0L2phY2svZ3N0amFja2Jpbi5jOgorCSAgTm8gcHJpbnRmIHBsZWFzZS4KKworMjAwOC0xMS0wNCAxMjo0MjozMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBEb24ndCBpbnN0YWxsIHN0YXRpYyBsaWJzIGZvciBwbHVnaW5zLiBGaXhlcyAjNTUwODUxIGZvciAtYmFkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9hbHNhc3BkaWYvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hbXJ3Yi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FwZXhzaW5rL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXJ0cy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FydHNkL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXVkaW9maWxlL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXVkaW9yZXNhbXBsZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2J6Mi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2NkYXVkaW8vTWFrZWZpbGUuYW06CisJICAqIGV4dC9jZWx0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGMxMzk0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGlyYWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kaXJlY3RmYi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2RpdngvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kdHMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9mYWFjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZmFhZC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2dzbS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2hlcm1lcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2l2b3JiaXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9qYWNrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvanAyay9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xhZHNwYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xjcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xpYmZhbWUvTWFrZWZpbGUuYW06CisJICAqIGV4dC9saWJtbXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tZXRhZGF0YS9NYWtlZmlsZS5hbToKKwkgICogZXh0L21wZWcyZW5jL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXBsZXgvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tdXNlcGFjay9NYWtlZmlsZS5hbToKKwkgICogZXh0L211c2ljYnJhaW56L01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXl0aHR2L01ha2VmaWxlLmFtOgorCSAgKiBleHQvbmFzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbmVvbi9NYWtlZmlsZS5hbToKKwkgICogZXh0L29mYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3BvbHlwL01ha2VmaWxlLmFtOgorCSAgKiBleHQvcmVzaW5kdmQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zZGwvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zaG91dC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NuYXBzaG90L01ha2VmaWxlLmFtOgorCSAgKiBleHQvc25kZmlsZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NvdW5kdG91Y2gvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zcGMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zd2ZkZWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC90YXJraW4vTWFrZWZpbGUuYW06CisJICAqIGV4dC90aGVvcmEvTWFrZWZpbGUuYW06CisJICAqIGV4dC90aW1pZGl0eS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3R3b2xhbWUvTWFrZWZpbGUuYW06CisJICAqIGV4dC94MjY0L01ha2VmaWxlLmFtOgorCSAgKiBleHQveGluZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3h2aWQvTWFrZWZpbGUuYW06CisJICAqIGdzdC1saWJzL2dzdC9hcHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC1saWJzL2dzdC9kc2hvdy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FpZmZwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FwcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvYnVmZmVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYmF5ZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9jZHhhcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9jaGFydC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2NvbG9yc3BhY2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kY2NwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWludGVybGFjZTIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kdmRzcHUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9mZXN0aXZhbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ZpbHRlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ZsYWNwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2dhbWVzL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvaDI2NHBhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbGlicmZiL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWl4bWF0cml4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbW9kcGx1Zy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21wZWcxc3lzL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZzR2aWRlb3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ2RlbXV4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ3RzbXV4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ3ZpZGVvcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tdmUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9uc2YvTWFrZWZpbGUuYW06CisJICAqIGdzdC9udXZkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L292ZXJsYXkvTWFrZWZpbGUuYW06CisJICAqIGdzdC9wYXNzdGhyb3VnaC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3BjYXBwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3BsYXlvbmRlbWFuZC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3Jhd3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcmVhbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0anBlZy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zY2FsZXRlbXBvL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc2RwL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc2VsZWN0b3IvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zbW9vdGgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zbW9vdGh3YXZlL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3BlZWQvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zcGVleHJlc2FtcGxlL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3RlcmVvL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3ViZW5jL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdHRhL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmJpZGVjL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9kcm9wL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9zaWduYWwvTWFrZWZpbGUuYW06CisJICAqIGdzdC92aXJ0dWFsZHViL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvdm1uYy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3k0bS9NYWtlZmlsZS5hbToKKwkgICogc3lzL2FjbWVuYy9NYWtlZmlsZS5hbToKKwkgICogc3lzL2Nkcm9tL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHNob3dkZWN3cmFwcGVyL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHNob3dzcmN3cmFwcGVyL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHZiL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHhyMy9NYWtlZmlsZS5hbToKKwkgICogc3lzL2ZiZGV2L01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3NzNC9NYWtlZmlsZS5hbToKKwkgICogc3lzL3FjYW0vTWFrZWZpbGUuYW06CisJICAqIHN5cy9xdHdyYXBwZXIvTWFrZWZpbGUuYW06CisJICAqIHN5cy92Y2QvTWFrZWZpbGUuYW06CisJICAqIHN5cy93aW5pbmV0L01ha2VmaWxlLmFtOgorCSAgKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBEb24ndCBpbnN0YWxsIHN0YXRpYyBsaWJzIGZvciBwbHVnaW5zLiBGaXhlcyAjNTUwODUxIGZvciAtYmFkLgorCisyMDA4LTA5LTE3IDEzOjU5OjIxICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgRml4IGNvbXBpbGVyIHdhcm5pbmdzIG9uIE9TL1gKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6IChqYWNrX3Byb2Nlc3NfY2IpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzogKGNhbGN1bGF0ZV9za2V3KToKKwkgIEZpeCBjb21waWxlciB3YXJuaW5ncyBvbiBPUy9YCisKKzIwMDgtMDgtMDcgMTM6MTU6MjEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6IFRyeSBjb21taXR0aW5nIHRoaXMgb25jZSBhZ2Fpbi4gTm93IHByb3Blcmx5IHJlbmFtZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICBUcnkgY29tbWl0dGluZyB0aGlzIG9uY2UgYWdhaW4uIE5vdyBwcm9wZXJseSByZW5hbWVkLgorCisyMDA4LTA4LTA3IDA5OjA5OjQ0ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGRvY3MvcGx1Z2lucy86IGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sCisJICBBZGQgbmV3IGVsZW1lbnQgdG8gZG9jcy4KKwkgICogZXh0L2phY2svZ3N0amFjay5oCisJICBBZGQgbWlzc2luZyBmaWxlLgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9zcmMuYzoKKwkgICogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmg6CisJICBSZW5hbWUgamFja2F1ZGlvc3JjIHRvIGphY2tfYXVkaW9fc3JjLgorCisyMDA4LTA4LTA3IDA4OjQ3OjQwICswMDAwICBUcmlzdGFuIE1hdHRoZXdzIDx0cmlzdGFuQHNhdC5xYy5jYT4KKworCSAgZXh0L2phY2svOiBBZGQgYSBqYWNrYXVkaW9zcmMuIFJlZmFjdG9yIHNpbmsgc2xpZ2h0bHkgZm9yIGJldHRlciBjb2RlIHJldXNlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBwYXRjaCBieTogVHJpc3RhbiBNYXR0aGV3cyA8dHJpc3RhbkBzYXQucWMuY2E+CisJICAqIGV4dC9qYWNrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvamFjay9nc3RqYWNrLmM6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jOgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuaDoKKwkgICogZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmM6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5oOgorCSAgKiBleHQvamFjay9nc3RqYWNrcmluZ2J1ZmZlci5oOgorCSAgQWRkIGEgamFja2F1ZGlvc3JjLiBSZWZhY3RvciBzaW5rIHNsaWdodGx5IGZvciBiZXR0ZXIgY29kZSByZXVzZS4KKwkgIEZpeGVzICM1NDUxOTcuCisKKzIwMDgtMDYtMTMgMTE6NTk6MjMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW15dGh0di54bWwKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5zaWduYWxzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxzYXNwZGlmLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFtcndiLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1iYXllci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1iejIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2RhdWRpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jZHhhcGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRzZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2Yi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdmRzcHUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmFhYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mYWFkLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZiZGV2c2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mZXN0aXZhbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1maWx0ZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2ZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZnJlZXplLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzbS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RpbnRlcmxhY2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oMjY0cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxhZHNwYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tZXRhZGF0YS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tbXMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9kcGx1Zy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGVnMmVuYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGVnNHZpZGVvcGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXBlZ3RzcGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXBlZ3ZpZGVvcGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVzZXBhY2sueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVzaWNicmFpbnoueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXZlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW15dGh0di54bWwKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hcy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uZW9uLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5zZmRlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1udXZkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbAorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmF3cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVhbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJmYnNyYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zZGwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2RwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNlbGVjdG9yLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNuZGZpbGUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291bmR0b3VjaC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGNkZWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZWQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXhyZXNhbXBsZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zdGVyZW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3ViZW5jLnhtbAorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGltaWRpdHkueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdHRhLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZjZHNyYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb3NpZ25hbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12bW5jLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdpbGRtaWRpLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXgyNjQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teHZpZC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JkZWMuYzoKKwkgICogZXh0L2FtcndiL2dzdGFtcndiZW5jLmM6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YnBhcnNlLmM6CisJICAqIGV4dC9kYzEzOTQvZ3N0ZGMxMzk0LmM6CisJICAqIGV4dC9kaXJlY3RmYi9kZmJ2aWRlb3NpbmsuYzoKKwkgICogZXh0L2l2b3JiaXMvdm9yYmlzZGVjLmM6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkgICogZXh0L21wZWcyZW5jL2dzdG1wZWcyZW5jLmNjOgorCSAgKiBleHQvbXBsZXgvZ3N0bXBsZXguY2M6CisJICAqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uYzoKKwkgICogZXh0L215dGh0di9nc3RteXRodHZzcmMuYzoKKwkgICogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzoKKwkgICogZXh0L3RpbWlkaXR5L2dzdHRpbWlkaXR5LmM6CisJICAqIGV4dC90aW1pZGl0eS9nc3R3aWxkbWlkaS5jOgorCSAgKiBnc3QtbGlicy9nc3QvYXBwL2dzdGFwcHNpbmsuYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICAqIGdzdC9kdmRzcHUvZ3N0ZHZkc3B1LmM6CisJICAqIGdzdC9mZXN0aXZhbC9nc3RmZXN0aXZhbC5jOgorCSAgKiBnc3QvZnJlZXplL2dzdGZyZWV6ZS5jOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgICogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSAgKiBnc3QvbW9kcGx1Zy9nc3Rtb2RwbHVnLmNjOgorCSAgKiBnc3QvbnV2ZGVtdXgvZ3N0bnV2ZGVtdXguYzoKKwkgIEFkZCBtaXNzaW5nIGVsZW1lbnRzIHRvIGRvY3MuIEZpeCBkb2MtbWFya3VwOiB1c2UgY29udmluaWVuY2Ugc3ludGF4CisJICBmb3IgZXhhbXBsZXMgKHByb2R1Y2VzIHZhbGlkIGRvY2Jvb2spLCBhZGQgc2V2ZXJhbCByZWZzZWMyIHdoZW4gd2UKKwkgIGhhdmUgc2V2ZXJhbCB0aXRsZXMuIEZpeCBzb21lIHR5cGVzLgorCisyMDA4LTA2LTEyIDE0OjQ5OjE4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIERvIG5vdCB1c2Ugc2hvcnRfZGVzY3JpcHRpb24gaW4gc2VjdGlvbiBkb2NzIGZvciBlbGVtZW50cy4gV2UgZXh0cmFjdCB0aGVtIGZyb20gZWxlbWVudCBkZXRhaWxzIGFuZCB0aGVyZSB3aWxsIGJlIHdhci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kYzEzOTQvZ3N0ZGMxMzk0LmM6CisJICAqIGV4dC9pdm9yYmlzL3ZvcmJpc2RlYy5jOgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6CisJICAqIGV4dC9tZXRhZGF0YS9nc3RtZXRhZGF0YWRlbXV4LmM6CisJICAqIGV4dC9teXRodHYvZ3N0bXl0aHR2c3JjLmM6CisJICAqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6CisJICAqIGdzdC1saWJzL2dzdC9hcHAvZ3N0YXBwc2luay5jOgorCSAgKiBnc3QvYmF5ZXIvZ3N0YmF5ZXIycmdiLmM6CisJICAqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgKiBnc3QvcmF3cGFyc2UvZ3N0YXVkaW9wYXJzZS5jOgorCSAgKiBnc3QvcmF3cGFyc2UvZ3N0dmlkZW9wYXJzZS5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwY2xpZW50LmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICAqIGdzdC9zZWxlY3Rvci9nc3RpbnB1dHNlbGVjdG9yLmM6CisJICAqIGdzdC9zZWxlY3Rvci9nc3RvdXRwdXRzZWxlY3Rvci5jOgorCSAgKiBnc3QvdmlkZW9zaWduYWwvZ3N0dmlkZW9hbmFseXNlLmM6CisJICAqIGdzdC92aWRlb3NpZ25hbC9nc3R2aWRlb2RldGVjdC5jOgorCSAgKiBnc3QvdmlkZW9zaWduYWwvZ3N0dmlkZW9tYXJrLmM6CisJICAqIHN5cy9vc3M0L29zczQtbWl4ZXIuYzoKKwkgICogc3lzL29zczQvb3NzNC1zaW5rLmM6CisJICAqIHN5cy9vc3M0L29zczQtc291cmNlLmM6CisJICBEbyBub3QgdXNlIHNob3J0X2Rlc2NyaXB0aW9uIGluIHNlY3Rpb24gZG9jcyBmb3IgZWxlbWVudHMuIFdlIGV4dHJhY3QKKwkgIHRoZW0gZnJvbSBlbGVtZW50IGRldGFpbHMgYW5kIHRoZXJlIHdpbGwgYmUgd2FybmluZ3MgaWYgdGhleSBkaWZmZXIuCisJICBBbHNvIGZpeGluZyB1cCB0aGUgQ2hhbmdlTG9nIG9yZGVyLgorCisyMDA4LTA1LTI2IDE3OjUyOjIxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6IEluY2x1ZGUgdGhlIGVsZW1lbnQgbmFtZSBpbiB0aGUgcG9ydCBuYW1lIHRvIGF2b2lkIGR1cGxpY2F0ZSBwb3J0IG5hbWVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkgIChnc3RfamFja19hdWRpb19zaW5rX2FsbG9jYXRlX2NoYW5uZWxzKToKKwkgIEluY2x1ZGUgdGhlIGVsZW1lbnQgbmFtZSBpbiB0aGUgcG9ydCBuYW1lIHRvIGF2b2lkIGR1cGxpY2F0ZSBwb3J0IG5hbWVzLgorCisyMDA4LTA0LTA2IDIwOjE4OjE2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6IFdvcmsgYXJvdW5kIG1pc3NpbmcgYml0cyBvZiB0aHJlYWQtc2FmZXR5IG9uIG9sZGVyIEdMaWJzIHNvbWUgbW9yZSB0byBhdm9pZCBhc3NlcnRpb25zIHcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6IChnc3RfamFja19hdWRpb19zaW5rX2NsYXNzX2luaXQpOgorCSAgV29yayBhcm91bmQgbWlzc2luZyBiaXRzIG9mIHRocmVhZC1zYWZldHkgb24gb2xkZXIgR0xpYnMgc29tZQorCSAgbW9yZSB0byBhdm9pZCBhc3NlcnRpb25zIHdoZW4gc3RhcnRpbmcgdXAgbXVsdGlwbGUgcGxheWJpbgorCSAgb2JqZWN0cyBjb25jdXJyZW50bHkgKHNlZSAjNTEyMzgyKS4KKworMjAwOC0wMy0xMyAxNDoyNToyMCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBVc2UgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUgYW5kIEdTVF9QQUNLQUdFX09SSUdJTiBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcgdmFsdWVzIHdoZXJlIHBvc3NpYmxlLiBGaXhlcyBidWcgIzUyMjIxMi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYWxzYXNwZGlmL2Fsc2FzcGRpZnNpbmsuYzoKKwkgICogZXh0L2dzbS9nc3Rnc20uYzoKKwkgICogZXh0L2phY2svZ3N0amFjay5jOgorCSAgKiBleHQvbGlibW1zL2dzdG1tcy5jOgorCSAgKiBleHQvbmVvbi9nc3RuZW9uaHR0cHNyYy5jOgorCSAgKiBleHQvc2hvdXQvZ3N0c2hvdXQuYzoKKwkgICogZXh0L3RpbWlkaXR5L2dzdHRpbWlkaXR5LmM6CisJICAqIGV4dC90aW1pZGl0eS9nc3R3aWxkbWlkaS5jOgorCSAgKiBnc3QvbnV2ZGVtdXgvZ3N0bnV2ZGVtdXguYzoKKwkgICogZ3N0L3R0YS9nc3R0dGEuYzoKKwkgIFVzZSBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSBhbmQgR1NUX1BBQ0tBR0VfT1JJR0lOIGluc3RlYWQKKwkgIG9mIGhhcmRjb2RpbmcgdmFsdWVzIHdoZXJlIHBvc3NpYmxlLiBGaXhlcyBidWcgIzUyMjIxMi4KKworMjAwNy0wNy0xOCAwNzo0Mjo0NyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6IEFkZCBzdGRsaWIgaW5jbHVkZSBoZXJlIHRvby4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6IChnc3RfamFja19yaW5nX2J1ZmZlcl9vcGVuX2RldmljZSksCisJICAoZ3N0X2phY2tfcmluZ19idWZmZXJfYWNxdWlyZSk6CisJICBBZGQgc3RkbGliIGluY2x1ZGUgaGVyZSB0b28uCisKKzIwMDctMDQtMDQgMDc6MzY6MjggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOiBUcnkgdCBiZXR0ZXIgbmFtZSBjbGllbnRzLiBwcm9wZXJseSBoYW5kbGUgcmV0dXJuIGNvZGVzIHdoZW4gcmUtIGVzdGFibGlzaGluZyBsaW5rcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6IChnc3RfamFja19yaW5nX2J1ZmZlcl9vcGVuX2RldmljZSksCisJICAoZ3N0X2phY2tfcmluZ19idWZmZXJfYWNxdWlyZSk6CisJICBUcnkgdCBiZXR0ZXIgbmFtZSBjbGllbnRzLiBwcm9wZXJseSBoYW5kbGUgcmV0dXJuIGNvZGVzIHdoZW4gcmUtCisJICBlc3RhYmxpc2hpbmcgbGlua3MuCisKKzIwMDctMDMtMTggMTc6NTc6NDggKzAwMDAgIFBhdWwgRGF2aXMgPHBhdWxAbGludXhhdWRpb3N5c3RlbXMuY29tPgorCisJICBleHQvamFjay9nc3RqYWNrYXVkaW9jbGllbnQuYzogRG9uJ3QgbmVlZCB0byB0YWtlIHRoZSBjb25uZWN0aW9uIGxvY2ssIGl0IHdpbGwgbm90IGJlIHVzZWQgYW5kIGNvdWxkIGNhdXNlIGRlYWRsb2Nrcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IFBhdWwgRGF2aXMgPHBhdWwgYXQgbGludXhhdWRpb3N5c3RlbXMgZG90IGNvbT4KKwkgICogZXh0L2phY2svZ3N0amFja2F1ZGlvY2xpZW50LmM6IChnc3RfamFja19hdWRpb191bnJlZl9jb25uZWN0aW9uKToKKwkgIERvbid0IG5lZWQgdG8gdGFrZSB0aGUgY29ubmVjdGlvbiBsb2NrLCBpdCB3aWxsIG5vdCBiZSB1c2VkIGFuZCBjb3VsZAorCSAgY2F1c2UgZGVhZGxvY2tzLgorCisyMDA3LTAzLTA4IDE1OjI0OjUyICswMDAwICBQYXVsIERhdmlzIDxwYXVsQGxpbnV4YXVkaW9zeXN0ZW1zLmNvbT4KKworCSAgZXh0L2phY2svOiBNYWtlIGFuIG9iamVjdCB0byBtYW5hZ2UgY2xpZW50IGNvbm5lY3Rpb25zIHRvIHRoZSBqYWNrIHNlcnZlciB3aGljaCB3ZSB3aWxsIHVzZSBpbiB0aGUgZnV0dXJlIHRvIHJ1biBzZWxlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEluY2x1ZGVzIHBhdGNoIGJ5OiBQYXVsIERhdmlzIDxwYXVsIGF0IGxpbnV4YXVkaW9zeXN0ZW1zIGRvdCBjb20+CisJICAqIGV4dC9qYWNrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9jbGllbnQuYzogKGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9pbml0KSwKKwkgIChqYWNrX3Byb2Nlc3NfY2IpLCAoamFja19zYW1wbGVfcmF0ZV9jYiksIChqYWNrX2J1ZmZlcl9zaXplX2NiKSwKKwkgIChqYWNrX3NodXRkb3duX2NiKSwgKGNvbm5lY3Rpb25fZmluZCksCisJICAoZ3N0X2phY2tfYXVkaW9fbWFrZV9jb25uZWN0aW9uKSwgKGdzdF9qYWNrX2F1ZGlvX2dldF9jb25uZWN0aW9uKSwKKwkgIChnc3RfamFja19hdWRpb191bnJlZl9jb25uZWN0aW9uKSwKKwkgIChnc3RfamFja19hdWRpb19jb25uZWN0aW9uX2FkZF9jbGllbnQpLAorCSAgKGdzdF9qYWNrX2F1ZGlvX2Nvbm5lY3Rpb25fcmVtb3ZlX2NsaWVudCksCisJICAoZ3N0X2phY2tfYXVkaW9fY2xpZW50X25ldyksIChnc3RfamFja19hdWRpb19jbGllbnRfZnJlZSksCisJICAoZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF9jbGllbnQpLAorCSAgKGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9zZXRfYWN0aXZlKToKKwkgICogZXh0L2phY2svZ3N0amFja2F1ZGlvY2xpZW50Lmg6CisJICBNYWtlIGFuIG9iamVjdCB0byBtYW5hZ2UgY2xpZW50IGNvbm5lY3Rpb25zIHRvIHRoZSBqYWNrIHNlcnZlciB3aGljaCB3ZQorCSAgd2lsbCB1c2UgaW4gdGhlIGZ1dHVyZSB0byBydW4gc2VsZWN0ZWQgamFjayBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIGphY2sKKwkgIGNvbm5lY3Rpb24uCisJICBNYWtlIHNvbWUgc3R1ZmYgYSBiaXQgbW9yZSB0aHJlYWRzYWZlLgorCSAgQWN0aXZhdGUgdGhlIGphY2sgY2xpZW50IEFTQVAuCisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkgIChnc3RfamFja19hdWRpb19zaW5rX2FsbG9jYXRlX2NoYW5uZWxzKSwKKwkgIChnc3RfamFja19hdWRpb19zaW5rX2ZyZWVfY2hhbm5lbHMpLCAoamFja19wcm9jZXNzX2NiKSwKKwkgIChnc3RfamFja19yaW5nX2J1ZmZlcl9vcGVuX2RldmljZSksCisJICAoZ3N0X2phY2tfcmluZ19idWZmZXJfY2xvc2VfZGV2aWNlKSwKKwkgIChnc3RfamFja19yaW5nX2J1ZmZlcl9hY3F1aXJlKSwgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX3JlbGVhc2UpLAorCSAgKGdzdF9qYWNrX2F1ZGlvX3NpbmtfY2xhc3NfaW5pdCksIChnc3RfamFja19hdWRpb19zaW5rX2luaXQpLAorCSAgKGdzdF9qYWNrX2F1ZGlvX3NpbmtfZ2V0Y2Fwcyk6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuaDoKKwkgIFVzZSBuZXcgY2xpZW50IG9iamVjdCB0byBtYW5hZ2UgY29ubmVjdGlvbnMuCisJICBEb24ndCByZW1vdmUgYW5kIHJlY3JlYXRlIGFsbCBwb3J0cywgdHJ5IHRvIHJldXNlIHRoZW0uCisKKzIwMDctMDEtMTIgMTA6MjU6NDAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuKjogSW1wcm92ZSBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzogKGphY2tfc2FtcGxlX3JhdGVfY2IpLAorCSAgKGphY2tfYnVmZmVyX3NpemVfY2IpLCAoamFja19zaHV0ZG93bl9jYiksCisJICAoZ3N0X2phY2tfcmluZ19idWZmZXJfYWNxdWlyZSk6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuaDoKKwkgIEltcHJvdmUgZG9jcy4KKworMjAwNi0xMi0wNiAxNjo1NzoxNyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGV4dC9qYWNrLy5jdnNpZ25vcmU6IElnbm9yZSBvbGQgZmlsZXMgYXMgcmVxdWVzdGVkIGJ5IHRoZSBidWlsZCBzbGF2ZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvamFjay8uY3ZzaWdub3JlOgorCSAgSWdub3JlIG9sZCBmaWxlcyBhcyByZXF1ZXN0ZWQgYnkgdGhlIGJ1aWxkIHNsYXZlLgorCisyMDA2LTExLTMwIDExOjU5OjA0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvTWFrZWZpbGUuYW06IEZpeCBidWlsZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvTWFrZWZpbGUuYW06CisJICBGaXggYnVpbGQuCisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzogKGphY2tfcHJvY2Vzc19jYiksCisJICAoamFja19zYW1wbGVfcmF0ZV9jYiksIChqYWNrX2J1ZmZlcl9zaXplX2NiKSwgKGphY2tfc2h1dGRvd25fY2IpLAorCSAgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX2FjcXVpcmUpOgorCSAgU21hbGwgY2xlYW51cHMuCisKKzIwMDYtMTEtMzAgMTE6NDk6MzYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIEFkZGVkIGZ1bGx5IGZ1bmN0aW9uYWwgamFja2F1ZGlvc2luay4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGV4dC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2phY2svTWFrZWZpbGUuYW06CisJICAqIGV4dC9qYWNrL2dzdGphY2suYzogKHBsdWdpbl9pbml0KToKKwkgICogZXh0L2phY2svZ3N0amFjay5oOgorCSAgKiBleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmM6IChnc3RfamFja19yaW5nX2J1ZmZlcl9nZXRfdHlwZSksCisJICAoZ3N0X2phY2tfcmluZ19idWZmZXJfY2xhc3NfaW5pdCksIChqYWNrX3Byb2Nlc3NfY2IpLAorCSAgKGphY2tfc2FtcGxlX3JhdGVfY2IpLCAoamFja19idWZmZXJfc2l6ZV9jYiksIChqYWNrX3NodXRkb3duX2NiKSwKKwkgIChnc3RfamFja19yaW5nX2J1ZmZlcl9pbml0KSwgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX2Rpc3Bvc2UpLAorCSAgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX2ZpbmFsaXplKSwKKwkgIChnc3RfamFja19yaW5nX2J1ZmZlcl9vcGVuX2RldmljZSksCisJICAoZ3N0X2phY2tfcmluZ19idWZmZXJfY2xvc2VfZGV2aWNlKSwKKwkgIChnc3RfamFja19yaW5nX2J1ZmZlcl9hY3F1aXJlKSwgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX3JlbGVhc2UpLAorCSAgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX3N0YXJ0KSwgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX3BhdXNlKSwKKwkgIChnc3RfamFja19yaW5nX2J1ZmZlcl9zdG9wKSwgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX2RlbGF5KSwKKwkgIChnc3RfamFja19jb25uZWN0X2dldF90eXBlKSwgKGdzdF9qYWNrX2F1ZGlvX3NpbmtfYmFzZV9pbml0KSwKKwkgIChnc3RfamFja19hdWRpb19zaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2phY2tfYXVkaW9fc2lua19pbml0KSwKKwkgIChnc3RfamFja19hdWRpb19zaW5rX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2phY2tfYXVkaW9fc2lua19nZXRfcHJvcGVydHkpLCAoZ3N0X2phY2tfYXVkaW9fc2lua19nZXRjYXBzKSwKKwkgIChnc3RfamFja19hdWRpb19zaW5rX2NyZWF0ZV9yaW5nYnVmZmVyKToKKwkgICogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5oOgorCSAgQWRkZWQgZnVsbHkgZnVuY3Rpb25hbCBqYWNrYXVkaW9zaW5rLgorCisyMDA2LTA0LTA4IDIxOjQ4OjAxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIEZpeCAjMzM3MzY1IChnX3R5cGVfY2xhc3NfcmVmIDwtPiBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2FtcndiL2dzdGFtcndiZGVjLmM6IChnc3RfYW1yd2JkZWNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YmVuYy5jOiAoZ3N0X2FtcndiZW5jX2NsYXNzX2luaXQpOgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JwYXJzZS5jOiAoZ3N0X2FtcndicGFyc2VfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9hcnRzL2dzdF9hcnRzLmM6IChnc3RfYXJ0c19jbGFzc19pbml0KToKKwkgICogZXh0L2FydHNkL2dzdGFydHNkc2luay5jOiAoZ3N0X2FydHNkc2lua19jbGFzc19pbml0KToKKwkgICogZXh0L2F1ZGlvZmlsZS9nc3RhZnNpbmsuYzogKGdzdF9hZnNpbmtfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzcmMuYzogKGdzdF9hZnNyY19jbGFzc19pbml0KToKKwkgICogZXh0L2F1ZGlvcmVzYW1wbGUvZ3N0YXVkaW9yZXNhbXBsZS5jOgorCSAgKiBleHQvY2RhdWRpby9nc3RjZGF1ZGlvLmM6IChnc3RfY2RhdWRpb19jbGFzc19pbml0KToKKwkgICogZXh0L2RpcmVjdGZiL2RmYnZpZGVvc2luay5jOiAoZ3N0X2RmYnZpZGVvc2lua19jbGFzc19pbml0KToKKwkgICogZXh0L2RpdngvZ3N0ZGl2eGRlYy5jOiAoZ3N0X2RpdnhkZWNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9oZXJtZXMvZ3N0aGVybWVzY29sb3JzcGFjZS5jOgorCSAgKGdzdF9oZXJtZXNfY29sb3JzcGFjZV9jbGFzc19pbml0KToKKwkgICogZXh0L2l2b3JiaXMvdm9yYmlzZmlsZS5jOiAoZ3N0X2l2b3JiaXNmaWxlX2NsYXNzX2luaXQpOgorCSAgKiBleHQvamFjay9nc3RqYWNrLmM6IChnc3RfamFja19jbGFzc19pbml0KToKKwkgICogZXh0L2phY2svZ3N0amFja2Jpbi5jOiAoZ3N0X2phY2tfYmluX2NsYXNzX2luaXQpOgorCSAgKiBleHQvbGNzL2dzdGNvbG9yc3BhY2UuYzogKGdzdF9jb2xvcnNwYWNlX2NsYXNzX2luaXQpOgorCSAgKiBleHQvbGliZmFtZS9nc3RsaWJmYW1lLmM6IChnc3RfZmFtZWVuY19jbGFzc19pbml0KToKKwkgICogZXh0L211c2ljYnJhaW56L2dzdHRybS5jOiAoZ3N0X211c2ljYnJhaW56X2NsYXNzX2luaXQpOgorCSAgKiBleHQvbmFzL25hc3NpbmsuYzogKGdzdF9uYXNzaW5rX2NsYXNzX2luaXQpOgorCSAgKiBleHQvc2hvdXQvZ3N0c2hvdXQuYzogKGdzdF9pY2VjYXN0c2VuZF9jbGFzc19pbml0KToKKwkgICogZXh0L3NuYXBzaG90L2dzdHNuYXBzaG90LmM6IChnc3Rfc25hcHNob3RfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9zbmRmaWxlL2dzdHNmLmM6IChnc3Rfc2ZfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9zd2ZkZWMvZ3N0c3dmZGVjLmM6IChnc3Rfc3dmZGVjYnVmZmVyX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zd2ZkZWNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC90YXJraW4vZ3N0dGFya2luZGVjLmM6IChnc3RfdGFya2luZGVjX2NsYXNzX2luaXQpOgorCSAgKiBleHQvdGFya2luL2dzdHRhcmtpbmVuYy5jOiAoZ3N0X3RhcmtpbmVuY19jbGFzc19pbml0KToKKwkgICogZ3N0L2NkeGFwYXJzZS9nc3RjZHhhc3RyaXAuYzogKGdzdF9jZHhhc3RyaXBfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9jaGFydC9nc3RjaGFydC5jOiAoZ3N0X2NoYXJ0X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvY29sb3JzcGFjZS9nc3Rjb2xvcnNwYWNlLmM6IChnc3RfY29sb3JzcGFjZV9jbGFzc19pbml0KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6IChnc3RfZGVpbnRlcmxhY2VfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9mZXN0aXZhbC9nc3RmZXN0aXZhbC5jOiAoZ3N0X2Zlc3RpdmFsX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzogKGdzdF9icHdzaW5jX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGlpci5jOiAoZ3N0X2lpcl9jbGFzc19pbml0KToKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6IChnc3RfbHB3c2luY19jbGFzc19pbml0KToKKwkgICogZ3N0L2xpYnJmYi9nc3RyZmJzcmMuYzogKGdzdF9yZmJzcmNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9taXhtYXRyaXgvbWl4bWF0cml4LmM6IChnc3RfbWl4bWF0cml4X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbXBlZzFzeXMvZ3N0bXBlZzFzeXN0ZW1lbmNvZGUuYzoKKwkgIChnc3Rfc3lzdGVtX2VuY29kZV9jbGFzc19pbml0KToKKwkgICogZ3N0L21wZWcxdmlkZW9wYXJzZS9nc3RtcDF2aWRlb3BhcnNlLmM6CisJICAoZ3N0X21wMXZpZGVvcGFyc2VfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9tcGVnMnN1Yi9nc3RtcGVnMnN1YnQuYzogKGdzdF9tcGVnMnN1YnRfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9tcGVnYXVkaW9wYXJzZS9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgKGdzdF9tcDNwYXJzZV9jbGFzc19pbml0KToKKwkgICogZ3N0L292ZXJsYXkvZ3N0b3ZlcmxheS5jOiAoZ3N0X292ZXJsYXlfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9wYXNzdGhyb3VnaC9nc3RwYXNzdGhyb3VnaC5jOiAocGFzc3Rocm91Z2hfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9wbGF5b25kZW1hbmQvZ3N0cGxheW9uZGVtYW5kLmM6IChwbGF5X29uX2RlbWFuZF9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0anBlZy9nc3RydGpwZWdkZWMuYzogKGdzdF9ydGpwZWdkZWNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZW5jLmM6IChnc3RfcnRqcGVnZW5jX2NsYXNzX2luaXQpOgorCSAgKiBnc3Qvc21vb3RoL2dzdHNtb290aC5jOiAoZ3N0X3Ntb290aF9jbGFzc19pbml0KToKKwkgICogZ3N0L3Ntb290aHdhdmUvZ3N0c21vb3Rod2F2ZS5jOiAoZ3N0X3Ntb290aHdhdmVfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX2NsYXNzX2luaXQpOgorCSAgKiBnc3Qvc3RlcmVvL2dzdHN0ZXJlby5jOiAoZ3N0X3N0ZXJlb19jbGFzc19pbml0KToKKwkgICogZ3N0L3N3aXRjaC9nc3Rzd2l0Y2guYzogKGdzdF9zd2l0Y2hfY2xhc3NfaW5pdCk6CisJICAqIGdzdC90dGEvZ3N0dHRhZGVjLmM6IChnc3RfdHRhX2RlY19jbGFzc19pbml0KToKKwkgICogZ3N0L3R0YS9nc3R0dGFwYXJzZS5jOiAoZ3N0X3R0YV9wYXJzZV9jbGFzc19pbml0KToKKwkgICogZ3N0L3ZiaWRlYy9nc3R2YmlkZWMuYzogKGdzdF92YmlkZWNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6IChnc3RfdmlkZW9fY3JvcF9jbGFzc19pbml0KToKKwkgICogZ3N0L3ZpcnR1YWxkdWIvZ3N0eHNoYXJwZW4uYzogKGdzdF94c2hhcnBlbl9jbGFzc19pbml0KToKKwkgICogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzogKGdzdF95NG1lbmNvZGVfY2xhc3NfaW5pdCk6CisJICAqIHN5cy9jZHJvbS9nc3RjZHBsYXllci5jOiAoY2RwbGF5ZXJfY2xhc3NfaW5pdCk6CisJICAqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIChnc3RfZGlyZWN0c291bmRzaW5rX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvZHhyMy9keHIzYXVkaW9zaW5rLmM6IChkeHIzYXVkaW9zaW5rX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvZHhyMy9keHIzc3B1c2luay5jOiAoZHhyM3NwdXNpbmtfY2xhc3NfaW5pdCk6CisJICAqIHN5cy9keHIzL2R4cjN2aWRlb3NpbmsuYzogKGR4cjN2aWRlb3NpbmtfY2xhc3NfaW5pdCk6CisJICAqIHN5cy9xY2FtL2dzdHFjYW1zcmMuYzogKGdzdF9xY2Ftc3JjX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmM6CisJICAoZ3N0X3Y0bDJfY29sb3JfYmFsYW5jZV9jaGFubmVsX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuYzogKGdzdF92NGwyX3R1bmVyX2NoYW5uZWxfY2xhc3NfaW5pdCksCisJICAoZ3N0X3Y0bDJfdHVuZXJfbm9ybV9jbGFzc19pbml0KToKKwkgICogc3lzL3hpbWFnZXNyYy94aW1hZ2VzcmMuYzogKGdzdF94aW1hZ2VzcmNfY2xhc3NfaW5pdCk6CisJICBGaXggIzMzNzM2NSAoZ190eXBlX2NsYXNzX3JlZiA8LT4gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50KQorCisyMDA2LTA0LTAxIDEwOjA5OjExICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSAgcmV3b3JrIGJ1aWxkOyBhZGQgdHJhbnNsYXRpb25zIGZvciB2NGwyCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJld29yayBidWlsZDsgYWRkIHRyYW5zbGF0aW9ucyBmb3IgdjRsMgorCisyMDA1LTEwLTEyIDE0OjI5OjU1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHJlbmFtZWQgR1NUX0ZMQUdTIG1hY3JvcyB0byBHU1RfT0JKRUNUX0ZMQUdTIG1vdmVkIGJpdHNoaWZ0IGZyb20gbWFjcm8gdG8gZW51bSBkZWZpbml0aW9uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXhhbXBsZXMvaW5kZXhpbmcvaW5kZXhtcGVnLmM6IChtYWluKToKKwkgICogZXh0L2FydHNkL2dzdGFydHNkc2luay5jOiAoZ3N0X2FydHNkc2lua19vcGVuX2F1ZGlvKSwKKwkgIChnc3RfYXJ0c2RzaW5rX2Nsb3NlX2F1ZGlvKSwgKGdzdF9hcnRzZHNpbmtfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2FydHNkL2dzdGFydHNkc2luay5oOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmcGFyc2UuYzogKGdzdF9hZnBhcnNlX29wZW5fZmlsZSksCisJICAoZ3N0X2FmcGFyc2VfY2xvc2VfZmlsZSk6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZwYXJzZS5oOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc2luay5jOiAoZ3N0X2Fmc2lua19vcGVuX2ZpbGUpLAorCSAgKGdzdF9hZnNpbmtfY2xvc2VfZmlsZSksIChnc3RfYWZzaW5rX2NoYWluKSwKKwkgIChnc3RfYWZzaW5rX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzaW5rLmg6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzcmMuYzogKGdzdF9hZnNyY19vcGVuX2ZpbGUpLAorCSAgKGdzdF9hZnNyY19jbG9zZV9maWxlKSwgKGdzdF9hZnNyY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc3JjLmg6CisJICAqIGV4dC9jZGF1ZGlvL2dzdGNkYXVkaW8uYzogKGdzdF9jZGF1ZGlvX2luaXQpOgorCSAgKiBleHQvZGlyZWN0ZmIvZGlyZWN0ZmJ2aWRlb3NpbmsuYzogKGdzdF9kaXJlY3RmYnZpZGVvc2lua19pbml0KToKKwkgICogZXh0L2R0cy9nc3RkdHNkZWMuYzogKGdzdF9kdHNkZWNfaW5pdCk6CisJICAqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkgICogZXh0L2phY2svZ3N0amFja2Jpbi5jOiAoZ3N0X2phY2tfYmluX2luaXQpLAorCSAgKGdzdF9qYWNrX2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvbXVzZXBhY2svZ3N0bXVzZXBhY2tkZWMuYzogKGdzdF9tdXNlcGFja2RlY19pbml0KToKKwkgICogZXh0L211c2ljYnJhaW56L2dzdHRybS5jOiAoZ3N0X211c2ljYnJhaW56X2luaXQpOgorCSAgKiBleHQvbmFzL25hc3NpbmsuYzogKGdzdF9uYXNzaW5rX29wZW5fYXVkaW8pLAorCSAgKGdzdF9uYXNzaW5rX2Nsb3NlX2F1ZGlvKSwgKGdzdF9uYXNzaW5rX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9uYXMvbmFzc2luay5oOgorCSAgKiBleHQvcG9seXAvcG9seXBzaW5rLmM6IChnc3RfcG9seXBzaW5rX2luaXQpOgorCSAgKiBleHQvc2RsL3NkbHZpZGVvc2luay5jOiAoZ3N0X3NkbHZpZGVvc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvc2RsL3NkbHZpZGVvc2luay5oOgorCSAgKiBleHQvc21vb3Rod2F2ZS9nc3RzbW9vdGh3YXZlLmM6IChnc3Rfc21vb3Rod2F2ZV9pbml0KToKKwkgICogZXh0L3NuZGZpbGUvZ3N0c2YuYzogKGdzdF9zZl9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9zZl9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3NmX3JlbGVhc2VfcmVxdWVzdF9wYWQpLAorCSAgKGdzdF9zZl9vcGVuX2ZpbGUpLCAoZ3N0X3NmX2Nsb3NlX2ZpbGUpLCAoZ3N0X3NmX2xvb3ApOgorCSAgKiBleHQvc25kZmlsZS9nc3RzZi5oOgorCSAgKiBleHQvc3dmZGVjL2dzdHN3ZmRlYy5jOiAoZ3N0X3N3ZmRlY19pbml0KToKKwkgICogZXh0L3Rhcmtpbi9nc3R0YXJraW5kZWMuYzogKGdzdF90YXJraW5kZWNfaW5pdCk6CisJICAqIGdzdC9hcGV0YWcvYXBlZGVtdXguYzogKGdzdF9hcGVfZGVtdXhfaW5pdCk6CisJICAqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXBhcnNlLmM6IChnc3RfY2R4YXBhcnNlX2luaXQpOgorCSAgKiBnc3QvY2R4YXBhcnNlL2dzdGNkeGFzdHJpcC5jOiAoZ3N0X2NkeGFzdHJpcF9pbml0KToKKwkgICogZ3N0L2Zlc3RpdmFsL2dzdGZlc3RpdmFsLmM6IChnc3RfZmVzdGl2YWxfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L2Zlc3RpdmFsL2dzdGZlc3RpdmFsLmg6CisJICAqIGdzdC9tcGVnMnN1Yi9nc3RtcGVnMnN1YnQuYzogKGdzdF9tcGVnMnN1YnRfaW5pdCk6CisJICAqIGdzdC9tdWx0aWZpbGVzaW5rL2dzdG11bHRpZmlsZXNpbmsuYzogKGdzdF9tdWx0aWZpbGVzaW5rX2luaXQpLAorCSAgKGdzdF9tdWx0aWZpbGVzaW5rX3NldF9sb2NhdGlvbiksIChnc3RfbXVsdGlmaWxlc2lua19vcGVuX2ZpbGUpLAorCSAgKGdzdF9tdWx0aWZpbGVzaW5rX2Nsb3NlX2ZpbGUpLCAoZ3N0X211bHRpZmlsZXNpbmtfbmV4dF9maWxlKSwKKwkgIChnc3RfbXVsdGlmaWxlc2lua19wYWRfcXVlcnkpLCAoZ3N0X211bHRpZmlsZXNpbmtfaGFuZGxlX2V2ZW50KSwKKwkgIChnc3RfbXVsdGlmaWxlc2lua19jaGFpbiksIChnc3RfbXVsdGlmaWxlc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvbXVsdGlmaWxlc2luay9nc3RtdWx0aWZpbGVzaW5rLmg6CisJICAqIGdzdC92aWRlb2Ryb3AvZ3N0dmlkZW9kcm9wLmM6IChnc3RfdmlkZW9kcm9wX2luaXQpOgorCSAgKiBzeXMvY2Ryb20vZ3N0Y2RwbGF5ZXIuYzogKGNkcGxheWVyX2luaXQpOgorCSAgKiBzeXMvZHhyMy9keHIzYXVkaW9zaW5rLmM6IChkeHIzYXVkaW9zaW5rX2luaXQpLAorCSAgKGR4cjNhdWRpb3Npbmtfb3BlbiksIChkeHIzYXVkaW9zaW5rX2Nsb3NlKSwKKwkgIChkeHIzYXVkaW9zaW5rX2NoYWluX3BjbSksIChkeHIzYXVkaW9zaW5rX2NoYWluX2FjMyksCisJICAoZHhyM2F1ZGlvc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBzeXMvZHhyMy9keHIzYXVkaW9zaW5rLmg6CisJICAqIHN5cy9keHIzL2R4cjNzcHVzaW5rLmM6IChkeHIzc3B1c2lua19pbml0KSwgKGR4cjNzcHVzaW5rX29wZW4pLAorCSAgKGR4cjNzcHVzaW5rX2Nsb3NlKSwgKGR4cjNzcHVzaW5rX2NoYWluKSwKKwkgIChkeHIzc3B1c2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBzeXMvZHhyMy9keHIzc3B1c2luay5oOgorCSAgKiBzeXMvZHhyMy9keHIzdmlkZW9zaW5rLmM6IChkeHIzdmlkZW9zaW5rX2luaXQpLAorCSAgKGR4cjN2aWRlb3Npbmtfb3BlbiksIChkeHIzdmlkZW9zaW5rX2Nsb3NlKSwKKwkgIChkeHIzdmlkZW9zaW5rX3dyaXRlX2RhdGEpLCAoZHhyM3ZpZGVvc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBzeXMvZHhyMy9keHIzdmlkZW9zaW5rLmg6CisJICAqIHN5cy9nbHNpbmsvZ2xpbWFnZXNpbmsuYzogKGdzdF9nbGltYWdlc2lua19pbml0KToKKwkgICogc3lzL3FjYW0vZ3N0cWNhbXNyYy5jOiAoZ3N0X3FjYW1zcmNfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcWNhbXNyY19vcGVuKSwgKGdzdF9xY2Ftc3JjX2Nsb3NlKToKKwkgICogc3lzL3FjYW0vZ3N0cWNhbXNyYy5oOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19pbml0KToKKwkgICogc3lzL3ZjZC92Y2RzcmMuYzogKGdzdF92Y2RzcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF92Y2RzcmNfZ2V0KSwKKwkgIChnc3RfdmNkc3JjX29wZW5fZmlsZSksIChnc3RfdmNkc3JjX2Nsb3NlX2ZpbGUpLAorCSAgKGdzdF92Y2RzcmNfY2hhbmdlX3N0YXRlKSwgKGdzdF92Y2RzcmNfcmVjYWxjdWxhdGUpOgorCSAgKiBzeXMvdmNkL3ZjZHNyYy5oOgorCSAgcmVuYW1lZCBHU1RfRkxBR1MgbWFjcm9zIHRvIEdTVF9PQkpFQ1RfRkxBR1MKKwkgIG1vdmVkIGJpdHNoaWZ0IGZyb20gbWFjcm8gdG8gZW51bSBkZWZpbml0aW9uCisKKzIwMDUtMDktMDUgMTc6MjA6MjkgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJKiBleHQvamFjay9nc3RqYWNrYmluLmM6CisJICBGaXggdXAgYWxsIHRoZSBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb25zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGaXggdXAgYWxsIHRoZSBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb25zLgorCisyMDA0LTA4LTAzIDE0OjI4OjEyICswMDAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQGdub21lLm9yZz4KKworCSAgZml4ZXMgZm9yIEdfRElTQUJMRV9BU1NFUlQgYW5kIGZyaWVuZHMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleGFtcGxlcy9keW5wYXJhbXMvZmlsdGVyLmM6ICh1aV9jb250cm9sX2NyZWF0ZSk6CisJICAqIGV4YW1wbGVzL2dzdHBsYXkvcGxheWVyLmM6IChwcmludF90YWcpOgorCSAgKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9yZXF1ZXN0X25ld19wYWQpOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGthbmltYXRpb24uYzoKKwkgIChnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX21heV9hZHZhbmNlKToKKwkgICogZXh0L2phY2svZ3N0amFjay5jOiAoZ3N0X2phY2tfcmVxdWVzdF9uZXdfcGFkKToKKwkgICogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9tYWRfaWQzX3RvX3RhZ19saXN0KSwKKwkgICh0YWdfbGlzdF90b19pZDNfdGFnX2ZvcmVhY2gpLCAoZ3N0X2lkM190YWdfaGFuZGxlX2V2ZW50KToKKwkgICogZXh0L3ZvcmJpcy9vZ2d2b3JiaXNlbmMuYzogKGdzdF9vZ2d2b3JiaXNlbmNfZ2V0X3RhZ192YWx1ZSk6CisJICAqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmM6IChnc3Rfdm9yYmlzZW5jX2dldF90YWdfdmFsdWUpOgorCSAgKiBleHQveGluZS94aW5lYXVkaW9kZWMuYzogKGdzdF94aW5lX2F1ZGlvX2RlY19jaGFpbik6CisJICAqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8tdGVzdC5jOiAocHJpbnRfdGFnKToKKwkgICogZ3N0L3NpbmUvZGVtby1kcGFyYW1zLmM6IChtYWluKToKKwkgICogZ3N0L3RhZ3MvZ3N0dm9yYmlzdGFnLmM6IChnc3RfdGFnX3RvX3ZvcmJpc19jb21tZW50cyk6CisJICAqIHRlc3RzdWl0ZS9hbHNhL2Zvcm1hdHMuYzogKGNyZWF0ZV9waXBlbGluZSk6CisJICAqIHRlc3RzdWl0ZS9hbHNhL3NpbmVzcmMuYzogKHNpbmVzcmNfZm9yY2VfY2FwcyksIChzaW5lc3JjX2dldCk6CisJICBmaXhlcyBmb3IgR19ESVNBQkxFX0FTU0VSVCBhbmQgZnJpZW5kcworCSAgKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKGFhY190eXBlX2ZpbmQpLAorCSAgKG1wM190eXBlX2ZyYW1lX2xlbmd0aF9mcm9tX2hlYWRlciksIChtcDNfdHlwZV9maW5kKSwKKwkgIChwbHVnaW5faW5pdCk6CisJICByZXF1aXJlIG1wMyB0eXBlZmluZGluZyB0byBoYXZlIGF0IGxlYXN0IE1JTl9IRUFERVJTIHZhbGlkIGhlYWRlcnMKKwkgIGFkZCB0eXBlZmluZGluZyBmb3IgQUFDIGFkdHMgZmlsZXMKKworMjAwNC0wNS0yMSAyMzoyODo1NyArMDAwMCAgU3TDqXBoYW5lIExvZXVpbGxldCA8Z3N0cmVhbWVyQGxlcm91dGllci5uZXQ+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkgIHNlY29uZCBiYXRjaCA6IHJlbW92ZSAnLCcgYXQgZW5kIG9mIGVudW1zIGFzIHRoZXkgY291bGQgY29uZnVzZSBvbGRlciBnY2MsIGZvcmVpZ24gY29tcGlsZXJzIChmb3J0ZSkgYW5kIGd0ay1kb2MgKGluIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBzZWNvbmQgYmF0Y2ggOgorCSAgcmVtb3ZlICcsJyBhdCBlbmQgb2YgZW51bXMgYXMgdGhleSBjb3VsZCBjb25mdXNlIG9sZGVyIGdjYywgZm9yZWlnbiBjb21waWxlcnMgKGZvcnRlKSBhbmQgZ3RrLWRvYworCSAgKGluIGdzdC1wbHVnaW5zL2V4dC8gdGhpcyB0aW1lKQorCisyMDA0LTAzLTE1IDE5OjMyOjI3ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSogZXh0L2phY2svZ3N0amFja2Jpbi5jOgorCSAgZG9uJ3QgbWl4IHRhYnMgYW5kIHNwYWNlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBkb24ndCBtaXggdGFicyBhbmQgc3BhY2VzCisKKzIwMDQtMDMtMTUgMTY6MzI6NTQgKzAwMDAgIEpvaGFuIERhaGxpbiA8am9oYW5AZ25vbWUub3JnPgorCisJICAqLmg6IFJldmVydCBpbmRlbnRpbmcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiAqLmg6IFJldmVydCBpbmRlbnRpbmcKKworMjAwNC0wMy0xNCAyMjozNDozMyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkqIGV4dC9qYWNrL2dzdGphY2tiaW4uYzoKKwkgIGdzdC1pbmRlbnQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZ3N0LWluZGVudAorCisyMDA0LTAxLTEyIDAzOjQwOjE4ICswMDAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSAgUmVtb3ZlIGFsbCB1c2FnZSBvZiBnc3RfcGFkX2dldF9jYXBzKCksIGFuZCByZXBsYWNlIGl0IHdpdGggZ3N0X3BhZF9nZXRfYWxsb3dlZF9jYXBzKCkgb3IgZ3N0X3BhZF9nZXRfbmVnb3RpYXRlZF9jYXAoKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmVtb3ZlIGFsbCB1c2FnZSBvZiBnc3RfcGFkX2dldF9jYXBzKCksIGFuZCByZXBsYWNlIGl0IHdpdGgKKwkgIGdzdF9wYWRfZ2V0X2FsbG93ZWRfY2FwcygpIG9yIGdzdF9wYWRfZ2V0X25lZ290aWF0ZWRfY2FwKCkuCisKKzIwMDMtMTItMjIgMDE6NDc6MDkgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJICBNZXJnZSBDQVBTIGJyYW5jaAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBNZXJnZSBDQVBTIGJyYW5jaAorCisyMDAzLTEyLTEzIDE2OjU5OjUxICswMDAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2phY2svZ3N0amFja2Jpbi5jOgorCSAgcmVtb3ZlZCBHU1RfKl9DQVNULiBEaXNhYmxpbmcgb2YgdHlwZSBjaGVja2luZyBpcyBkb25lIGluIGdsaWIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbW92ZWQgR1NUXypfQ0FTVC4gRGlzYWJsaW5nIG9mIHR5cGUgY2hlY2tpbmcgaXMgZG9uZSBpbiBnbGliLgorCisyMDAzLTEyLTA0IDEwOjM3OjM4ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkgIHJlbW92ZSBjb3B5cmlnaHQgZmllbGQgZnJvbSBwbHVnaW5zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbW92ZSBjb3B5cmlnaHQgZmllbGQgZnJvbSBwbHVnaW5zCisKKzIwMDMtMTEtMDcgMTI6NDc6MDIgKzAwMDAgIFJvbmFsZCBTLiBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFja2Jpbi5jOgorCSAgUmVtb3ZlIGFsbCBjb25maWcuaCBpbmNsdWRlcyBmcm9tIGhlYWRlciBmaWxlcywgYWRkIGl0IHRvIGVhY2ggc291cmNlIGZpbGUgYW5kIHJlbW92ZSBkdXBsaWNhdGUgY29uZmlnLmggaW5jbHVkZXMgZnJvLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJlbW92ZSBhbGwgY29uZmlnLmggaW5jbHVkZXMgZnJvbSBoZWFkZXIgZmlsZXMsIGFkZCBpdCB0byBlYWNoIHNvdXJjZSBmaWxlIGFuZCByZW1vdmUgZHVwbGljYXRlIGNvbmZpZy5oIGluY2x1ZGVzIGZyb20gc2V2ZXJhbCBzb3VyY2UgZmlsZXMKKworMjAwMy0xMS0wMSAyMzo0MzoxMyArMDAwMCAgSWFpbiBIb2xtZXMgPGlhaW5AcHJldHR5cGVvcGxlLm9yZz4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSAgSmFjayBmaXhlZCB0b28KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgSmFjayBmaXhlZCB0b28KKworMjAwMy0xMC0yOSAwMzoxNTo1NSArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkgIGNoYW5nZSBnc3QvYnl0ZXN0cmVhbS5oIHRvIGdzdC9ieXRlc3RyZWFtL2J5dGVzdHJlYW0uaAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBjaGFuZ2UgZ3N0L2J5dGVzdHJlYW0uaCB0byBnc3QvYnl0ZXN0cmVhbS9ieXRlc3RyZWFtLmgKKworMjAwMy0xMC0yOCAyMDo1Mjo0MSArMDAwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkgIG1lcmdlIFRZUEVGSU5EIGJyYW5jaC4gTWFqb3IgY2hhbmdlczoKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgbWVyZ2UgVFlQRUZJTkQgYnJhbmNoLiBNYWpvciBjaGFuZ2VzOgorCSAgLSB0b3RhbGx5IHJld29ya2VkIHR5cGUoZmluZCkgc3lzdGVtCisJICAtIGFsbCB0eXBlZmluZCBmdW5jdGlvbnMgYXJlIGluIGdzdC90eXBlZmluZCBub3cKKwkgIC0gbW9yZSB0eXBlZmluZCBmdW5jdGlvbnMgdGhlbiBiZWZvcmUKKwkgIC0gc29tZSBwbHVnaW5zIG1pZ2h0IGZhaWwgdG8gY29tcGlsZSBub3cgYmVjYXVzZSBJIGRvbid0IGhhdmUgdGhlbSBpbnN0YWxsZWQgYW5kIHRoZXkKKwkgIGEpIHJlcXVpcmUgYnl0ZXN0cmVhbSBvcgorCSAgYikgaGF2ZW4ndCBoYWQgdGhlaXIgdHlwZWZpbmQgZml4ZWQuCisJICBQbGVhc2UgZml4IHRob3NlIHBsdWdpbnMgYW5kIHB1dCB0aGUgdHlwZWZpbmQgZnVuY3Rpb25zIGludG8gZ3N0L3R5cGVmaW5kIGlmIHRoZXkgZG9uJ3QgaGF2ZSBkZXBlbmRlbmNpZXMKKworMjAwMy0xMC0wOCAxNjowODoxOSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJICAvR3N0QnVmZmVyL0dzdERhdGEvIGluIHRoZSBBUEkgd2hlcmUgeW91IGNhbiBwYXNzIGV2ZW50cy4gRml4IHRoZSBwbHVnaW5zIHRvIGRlYWwgd2l0aCB0aGF0LiBGaXhlcyAjMTEzNDg4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAvR3N0QnVmZmVyL0dzdERhdGEvIGluIHRoZSBBUEkgd2hlcmUgeW91IGNhbiBwYXNzIGV2ZW50cy4gRml4IHRoZSBwbHVnaW5zIHRvIGRlYWwgd2l0aCB0aGF0LiBGaXhlcyAjMTEzNDg4LgorCisyMDAzLTEwLTAxIDEzOjE0OjUwICswMDAwICBSb25hbGQgUy4gQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkgIE5ldyB0eXBlZmluZCBzeXN0ZW06IGJ5dGVzdHJlYW0gaXMgbm93IHBhcnQgb2YgdGhlIGNvcmUgYWxsIHBsdWdpbnMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIHVzZSB0aGlzIG5ldyB0eXBlZmluZCBzeXN0ZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBOZXcgdHlwZWZpbmQgc3lzdGVtOgorCSAgKiBieXRlc3RyZWFtIGlzIG5vdyBwYXJ0IG9mIHRoZSBjb3JlCisJICAqIGFsbCBwbHVnaW5zIGhhdmUgYmVlbiBtb2RpZmllZCB0byB1c2UgdGhpcyBuZXcgdHlwZWZpbmQgc3lzdGVtCisJICAqIGFzZiB0eXBlZmluZGluZyBhZGRlZAorCSAgKiBtcGVnIHZpZGVvIHN0cmVhbSB0eXBlZmlkaW5nIHJlbW92ZWQgYmVjYXVzZSBpdCdzIGJyb2tlbgorCSAgKiBkdXBsaWNhdGUgdHlwZWZpbmQgZW50cmllcyByZW1vdmVkCisJICAqIGV4dHJhIGlkMyB0eXBlZmluZGluZyBhZGRlZCwgYmVjYXVzZSB3ZSd2ZSBzZWVuIDQgdHlwZXMgb2YgZmlsZXMKKwkgIChyaWZmL3dhdiwgZmxhYywgdm9yYmlzLCBtcDMpIHdpdGggaWQzIGhlYWRlcnMgYW5kIGVhY2ggb2YgdGhlc2UgbmVlZHMKKwkgIHRvIHdvcmsuIEluc3RlYWQsIEkndmUgYWRkZWQgYW4gaWQzIGVsZW1lbnQgYW5kIGxldCBpdCByZWRvIHR5cGVmaWRpbmcKKwkgIGFmdGVyIHRoZSBpZDMgaGVhZGVyLiB0aGlzIG5lZWRzIGEgaGFjayBiZWNhdXNlIHNwaWRlciBvbmx5IHR5cGVmaW5kcworCSAgb25jZS4gV2UgY2FuIHJlbW92ZSB0aGlzIGhhY2sgb25jZSBzcGlkZXIgc3VwcG9ydHMgbXVsdGlwbGUgdHlwZWZpbmRzLgorCSAgKiB3aXRoIGFsbCB0aGlzLCBtcDMgdHlwZWZpbmRpbmcgaXMgc2VtaS1yZXdyaXR0ZW4KKwkgICogaWQzIHR5cGVmaW5kaW5nIGluIGZsYWMvdm9yYmlzIGlzIHJlbW92ZWQsIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZAorCSAgKiBmaXhlZCBzcGlkZXIgYW5kIGdzdC10eXBlZmluZCB0byB1c2UgdGhpcywgdG9vLgorCSAgKiBPdGhlciBnZW5lcmFsIGNsZWFudXBzCisKKzIwMDMtMDktMzAgMTI6NTY6MjcgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSogZXh0L2phY2svZ3N0amFjay5oOgorCSogZXh0L2phY2svZ3N0amFja2Jpbi5jOgorCSAgY29uZm9ybSB0byB0aGUgYnVmZmVyLWZyYW1lcyBwcm9wcyBlbnRyeSAtLSBtdWNoIG5pY2VyIG5vdy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBjb25mb3JtIHRvIHRoZSBidWZmZXItZnJhbWVzIHByb3BzIGVudHJ5IC0tIG11Y2ggbmljZXIgbm93Li4uCisKKzIwMDMtMDgtMTAgMDA6MDE6NTggKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvamFjay9NYWtlZmlsZS5hbToKKwkgIFJlbW92ZSByZWR1bmRhbnQgcGx1Z2luZGlyIGRlZmluaXRpb24KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmVtb3ZlIHJlZHVuZGFudCBwbHVnaW5kaXIgZGVmaW5pdGlvbgorCisyMDAzLTA3LTE5IDIzOjI1OjI1ICswMDAwICBMZWlmIEpvaG5zb24gPGxlaWZAYW1iaWVudC4yeS5uZXQ+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkgICsgY2hhbmdlcyBmb3IgbmV3IGZsb2F0IGNhcHMgd2l0aG91dCBzbG9wZS9pbnRlcmNlcHQgKyBzb21lIGNhdGVnb3J5IGNoYW5nZXMgZm9yIHBsdWdpbnMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKyBjaGFuZ2VzIGZvciBuZXcgZmxvYXQgY2FwcyB3aXRob3V0IHNsb3BlL2ludGVyY2VwdAorCSAgKyBzb21lIGNhdGVnb3J5IGNoYW5nZXMgZm9yIHBsdWdpbnMKKworMjAwMy0wNy0wNiAyMDo0OTo1MiArMDAwMCAgUm9uYWxkIFMuIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJICBOZXcgbWltZXR5cGVzIGdvbmUgaW50byBlZmZlY3QgdG9kYXkgLSB0aGlzIGNvbW1pdCBjaGFuZ2VzIGFsbCBvbGQgbWltZXR5cGVzIG92ZXIgdG8gdGhlIG5ldyBtaW1ldHlwZXMgc3BlYyBhcyBkZXNjcmkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgTmV3IG1pbWV0eXBlcyBnb25lIGludG8gZWZmZWN0IHRvZGF5IC0gdGhpcyBjb21taXQgY2hhbmdlcyBhbGwgb2xkIG1pbWV0eXBlcyBvdmVyIHRvIHRoZSBuZXcgbWltZXR5cGVzIHNwZWMgYXMgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBjb21taXQncyBkb2N1bWVudC4gTm90ZTogc29tZSBwbHVnaW5zIHdpbGwgYnJlYWssIHNvbWUgcGlwZWxpbmVzIHdpbGwgYnJlYWssIGV4cGVjdCBIRUFEIHRvIGJlIGJyb2tlbiBvciBhdCBsZWFzdCBub3QgMTAwJSB3b3JraW5nIGZvciBhIGZldyBkYXlzLCBidXQgZG9uJ3QgZm9yZ2V0IHRvIHJlcG9ydCBidWdzCisKKzIwMDMtMDctMDEgMDI6Mjc6MDYgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJICBmaXggdHlwZSBwdW5uaW5nCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCB0eXBlIHB1bm5pbmcKKworMjAwMy0wNi0yOSAxOTo0NjoxMyArMDAwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2tiaW4uYzoKKwkgIGNvbXBhdGliaWxpdHkgZml4IGZvciBuZXcgR1NUX0RFQlVHIHN0dWZmLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBjb21wYXRpYmlsaXR5IGZpeCBmb3IgbmV3IEdTVF9ERUJVRyBzdHVmZi4KKwkgIEluY2x1ZGVzIGZpeGVzIGZvciBtaXNzaW5nIGluY2x1ZGVzIGZvciBjb25maWcuaCBhbmQgdW5pc3RkLmgKKwkgIEkgb25seSBlbnN1cmVkIGZvciBwbHVnaW5zIEkgY2FuIGJ1aWxkIHRoYXQgdGhleSB3b3JrLCBzbyBpZiBzb21lIG9mIHRoZW0gYXJlIHN0aWxsIGJyb2tlbiwgeW91IGdvdHRhIGZpeCB0aGVtIHlvdXJzZWx2ZXMgdW5mb3J0dW5hdGVseS4KKworMjAwMy0wNi0xMyAyMToyMToxNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSAgUmVtb3ZlZCB1Z2x5IGNhcHMgZml4ZWQgZmxhZyBoYWNrLCB3aWxsIGJlIGRvbmUgYXV0b21hdGljYWxseSBpbiBjb3JlIHNvb24KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmVtb3ZlZCB1Z2x5IGNhcHMgZml4ZWQgZmxhZyBoYWNrLCB3aWxsIGJlIGRvbmUgYXV0b21hdGljYWxseSBpbgorCSAgY29yZSBzb29uCisKKzIwMDMtMDMtMDQgMTU6MzQ6MjAgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSogZXh0L2phY2svZ3N0amFjay5oOgorCSogZXh0L2phY2svZ3N0amFja2Jpbi5jOgorCSAgdXBkYXRlIGZvciB0aGUgbGF0ZXN0IGphY2sgY3ZzIGFuZCBub24tY290aHJlYWRlZCBnc3Qgc2NoZWR1bGVyCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHVwZGF0ZSBmb3IgdGhlIGxhdGVzdCBqYWNrIGN2cyBhbmQgbm9uLWNvdGhyZWFkZWQgZ3N0IHNjaGVkdWxlcgorCisyMDAzLTAyLTA1IDIwOjM4OjQxICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSAgQ2hhbmdlZCBjYXBzLT5maXhlZCB0byB1c2UgRkxBR19TRVQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQ2hhbmdlZCBjYXBzLT5maXhlZCB0byB1c2UgRkxBR19TRVQKKworMjAwMy0wMS0xMCAxMzozODozMiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkgIFBhZENvbm5lY3QgLT4gUGFkTGluaworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYWRDb25uZWN0IC0+IFBhZExpbmsKKworMjAwMy0wMS0xMCAxMDoyMjoyNSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkgIGFub3RoZXIgYmF0Y2ggb2YgY29ubmVjdC0+bGluayBmaXhlcyBwbGVhc2UgbGV0IG1lIGtub3cgYWJvdXQgaXNzdWVzIGFuZCBwbGVhc2UgcmVmcmFpbiBvZiBtYWtpbmcgdGhlbSB5b3Vyc2VsZiwgc28gdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhbm90aGVyIGJhdGNoIG9mIGNvbm5lY3QtPmxpbmsgZml4ZXMKKwkgIHBsZWFzZSBsZXQgbWUga25vdyBhYm91dCBpc3N1ZXMKKwkgIGFuZCBwbGVhc2UgcmVmcmFpbiBvZiBtYWtpbmcgdGhlbSB5b3Vyc2VsZiwgc28gdGhhdCBJIGRvbid0IHNwZW5kIGRvdWJsZQorCSAgdGhlIHRpbWUgcmVzb2x2aW5nIGNvbmZsaWN0cworCisyMDAyLTEyLTA4IDE0OjUwOjEwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZXh0L2phY2svTWFrZWZpbGUuYW06CisJICBwYXJhbGxlbCBpbnN0YWxsIGZpeGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHBhcmFsbGVsIGluc3RhbGwgZml4ZXMKKworMjAwMi0wOS0yOSAxODoxMjoxOCArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJKiBleHQvamFjay9nc3RqYWNrYmluLmM6CisJICBsaWNlbnNlcyBhZ2FpbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBsaWNlbnNlcyBhZ2FpbgorCisyMDAyLTA5LTE4IDE5OjAyOjUyICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkgIHBsdWdpbnMgcGFydCBvZiBsaWNlbnNlIGZpZWxkIHBhdGNoCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHBsdWdpbnMgcGFydCBvZiBsaWNlbnNlIGZpZWxkIHBhdGNoCisKKzIwMDItMDktMTAgMDk6MzE6NDAgKzAwMDAgIFJvbmFsZCBTLiBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSAgVGhpcyB1cGRhdGVzIGFsbCBwbHVnaW5zIHRvIHRoZSBuZXcgQVBJIGZvciBnc3RfcGFkX3RyeV9zZXRfY2FwcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBUaGlzIHVwZGF0ZXMgYWxsIHBsdWdpbnMgdG8gdGhlIG5ldyBBUEkgZm9yIGdzdF9wYWRfdHJ5X3NldF9jYXBzCisKKzIwMDItMDktMDkgMjM6Mjc6MzggKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJICByZW1vdmluZyB3YXJuaW5ncyBhcyBhcHByb3ZlZCBieSB3aW0KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmVtb3Zpbmcgd2FybmluZ3MgYXMgYXBwcm92ZWQgYnkgd2ltCisKKzIwMDItMDgtMjMgMDQ6MDQ6MTEgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSogZXh0L2phY2svZ3N0amFja2Jpbi5jOgorCSAgZml4IGphY2sgaW5wdXQgcG9ydCBjb25uZWN0aW9uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCBqYWNrIGlucHV0IHBvcnQgY29ubmVjdGlvbgorCisyMDAyLTA3LTA5IDE3OjM5OjE3ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkgIGNvbXBpbGUgZml4ZW4sIGFuZCBwcmVwYXJlIHRvIG1vdmUgTUFJTlRBSU5FUl9NT0RFIHRvIGFzLXZlcnNpb24ubTQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgY29tcGlsZSBmaXhlbiwgYW5kIHByZXBhcmUgdG8gbW92ZSBNQUlOVEFJTkVSX01PREUgdG8gYXMtdmVyc2lvbi5tNAorCisyMDAyLTA3LTAyIDIzOjM1OjA3ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2tiaW4uYzoKKwkgIG1ha2UgamFjayB3b3JrIGluIGFsbCBpdHMgZnVsbCBkdXBsZXggZ2xvcnkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgbWFrZSBqYWNrIHdvcmsgaW4gYWxsIGl0cyBmdWxsIGR1cGxleCBnbG9yeQorCisyMDAyLTA2LTEyIDAzOjMyOjAyICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2tiaW4uYzoKKwkgIHdvcmtpbmcgamFjayBlbGVtZW50cyAoZml4ZWQgYSBwcm9ibGVtIGluIHVwc3RyZWFtIGphY2spIHJhbmRvbSBvdGhlciBmaXhlbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHdvcmtpbmcgamFjayBlbGVtZW50cyAoZml4ZWQgYSBwcm9ibGVtIGluIHVwc3RyZWFtIGphY2spCisJICAqIHJhbmRvbSBvdGhlciBmaXhlbi4uLgorCisyMDAyLTA1LTE1IDE5OjA4OjQ5ICswMDAwICBTdGV2ZSBCYWtlciA8c3RldmVAc3RldmViYWtlci5vcmc+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkgIHVzZSBuZXcgYnl0ZXN0cmVhbSBhcGkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdXNlIG5ldyBieXRlc3RyZWFtIGFwaQorCisyMDAyLTA1LTEzIDE4OjA4OjMzICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkqIGV4dC9qYWNrL2dzdGphY2tiaW4uYzoKKwkgIHVwZGF0ZSB0byBuZXcgamFjayBhcGkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdXBkYXRlIHRvIG5ldyBqYWNrIGFwaQorCisyMDAyLTA1LTA1IDE5OjM5OjE3ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkgIGFkZCBzb21lIGluY2x1ZGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCBzb21lIGluY2x1ZGVzCisKKzIwMDItMDUtMDUgMDE6MDg6MDUgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSogZXh0L2phY2svZ3N0amFjay5oOgorCSogZXh0L2phY2svZ3N0amFja2Jpbi5jOgorCSAgYmV0dGVyIGluaXRpYWxpemF0aW9uLiBpdCBkb2Vzbid0IHdvcmsgb3ZlciBoZXJlLCB0aG91Z2guCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGJldHRlciBpbml0aWFsaXphdGlvbi4gaXQgZG9lc24ndCB3b3JrIG92ZXIgaGVyZSwgdGhvdWdoLgorCisyMDAyLTA1LTA0IDIxOjM4OjU2ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2tiaW4uYzoKKwkgIGEgY29tbWl0IHNvIHRoYXQgamFjayB3aWxsIGJ1aWxkIHdpdGhvdXQgZXJyb3JzIG9uIFVyYWV1cydzIHN5c3RlbSA7KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhIGNvbW1pdCBzbyB0aGF0IGphY2sgd2lsbCBidWlsZCB3aXRob3V0IGVycm9ycyBvbiBVcmFldXMncyBzeXN0ZW0gOykKKworMjAwMi0wNS0wNCAyMDo1MzozNSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJICBzZXQgY2FwcyBvbmNlIHdlIGtub3cgdGhlIHNhbXBsZSByYXRlIG9mIHRoZSBzeXN0ZW0KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgc2V0IGNhcHMgb25jZSB3ZSBrbm93IHRoZSBzYW1wbGUgcmF0ZSBvZiB0aGUgc3lzdGVtCisKKzIwMDItMDUtMDQgMTg6NTc6NDQgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSogZXh0L2phY2svZ3N0amFjay5oOgorCSogZXh0L2phY2svZ3N0amFja2Jpbi5jOgorCSAgc29tZSBqYWNrIGZpeGVzLCBhbHNhIHRvdWNodXBzLCBhbmQgYWRkIHJ0cCBieSBkZWZhdWx0IHRvIHRoZSBidWlsZCBpZiB0aGVyZSBhcmUgYW55IHByb2JsZW1zIGJ1aWxkaW5nIHJ0cCwgd2UncmUgbW92Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHNvbWUgamFjayBmaXhlcywgYWxzYSB0b3VjaHVwcywgYW5kIGFkZCBydHAgYnkgZGVmYXVsdCB0byB0aGUgYnVpbGQKKwkgIGlmIHRoZXJlIGFyZSBhbnkgcHJvYmxlbXMgYnVpbGRpbmcgcnRwLCB3ZSdyZSBtb3ZpbmcgaXQgYmFjayB0byBleHBlcmltZW50YWwgOykKKworMjAwMi0wNC0yMCAyMTo0Mjo1MSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJICBhIGhhY2sgdG8gd29yayBhcm91bmQgaW50bHRvb2wncyBicm9rZW5uZXNzIGEgY3VycmVudCBjaGVjayBmb3IgbXBlZzJkZWMgZGV0YWlscy0+a2xhc3MgcmVvcmdhbml6YXRpb25zIGFuIGVsZW1lbnQgYnIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBhIGhhY2sgdG8gd29yayBhcm91bmQgaW50bHRvb2wncyBicm9rZW5uZXNzCisJICAqIGEgY3VycmVudCBjaGVjayBmb3IgbXBlZzJkZWMKKwkgICogZGV0YWlscy0+a2xhc3MgcmVvcmdhbml6YXRpb25zCisJICAqIGFuIGVsZW1lbnQgYnJvd3NlciB0aGF0IHVzZXMgZGV0YWlscy0+a2xhc3MKKwkgICogc2VwYXJhdGVkIGNkeGEgcGFyc2Ugb3V0IGZyb20gdGhlIGF2aSBkaXJlY3RvcnkKKworMjAwMi0wNC0xNiAxNzoxNDowNSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvamFjay9NYWtlZmlsZS5hbToKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkqIGV4dC9qYWNrL2dzdGphY2tiaW4uYzoKKwkgIEZpbmFsbHkgd2UncmUgb24gdG8gYSBwcm9wZXIgamFjayBzZXR1cCwgd2l0aCBhIHNwZWNpYWxpemVkIGJpbiBhbmQgZWxlbWVudHMgdGhhdCBjYW4gb25seSBnbyBpbiBhIGphY2sgYmluLiBJIGhhZCB0by4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGaW5hbGx5IHdlJ3JlIG9uIHRvIGEgcHJvcGVyIGphY2sgc2V0dXAsIHdpdGggYSBzcGVjaWFsaXplZCBiaW4gYW5kIGVsZW1lbnRzCisJICB0aGF0IGNhbiBvbmx5IGdvIGluIGEgamFjayBiaW4uIEkgaGFkIHRvIGZpeCB0aGUgcGFyc2VyIGZpcnN0IHRvIGRvIHRoaXMsIGJ1dAorCSAgdG8gcnVuIGl0LCB0aGUgc3ludGF4IGlzIGxpa2Ugc286CisJICBnc3QtbGF1bmNoIGphY2tiaW4uKCBmaWxlc3JjICEgbWFkICEgamFja3NpbmsgKQorCSAgQnV0IG9mIGNvdXJzZSBpdCdzIG5vdCBmdWxseSBmdW5jdGlvbmFsIHlldC4gU2lnaC4KKworMjAwMi0wNC0xMSAyMDo0MjoyNiArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJICBHc3RQYWRUZW1wbGF0ZSA8LT4gZ3N0X3BhZF90ZW1wbGF0ZSA8LT4gR1NUX1BBRF9URU1QTEFURSBzYW1lIHdpdGggKmZhY3RvcnkgYW5kIHR5cGVmaW5kLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBHc3RQYWRUZW1wbGF0ZSA8LT4gZ3N0X3BhZF90ZW1wbGF0ZSA8LT4gR1NUX1BBRF9URU1QTEFURQorCSAgc2FtZSB3aXRoICpmYWN0b3J5IGFuZCB0eXBlZmluZC4KKwkgIGFsc28sIHNvbWUgLVdlcnJvciBmaXhlcy4KKworMjAwMi0wMy0zMCAyMTowNzo1MSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvamFjay9nc3RqYWNrLmM6CisJICBhbHBoYWJldGl6YXRpb24gZml4ZW4gYSBqYWNrIGNhcHMgZml4CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogYWxwaGFiZXRpemF0aW9uIGZpeGVuCisJICAqIGEgamFjayBjYXBzIGZpeAorCisyMDAyLTAzLTMwIDE5OjMxOjEzICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL2dzdGphY2suYzoKKwkgIGFkZCBub3RpZnkgYmFjayB0byBmaWxlc3JjLCBpdCdzIG5lZWRlZCBmb3IgTVZDIGFwcGxpY2F0aW9ucyByZW1vdmUgbm90aWZ5IHByaW50b3V0cyBmcm9tIGdzdC1sYXVuY2ggY2xlYW51cCBpbiBnc3QtcC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGFkZCBub3RpZnkgYmFjayB0byBmaWxlc3JjLCBpdCdzIG5lZWRlZCBmb3IgTVZDIGFwcGxpY2F0aW9ucworCSAgKiByZW1vdmUgbm90aWZ5IHByaW50b3V0cyBmcm9tIGdzdC1sYXVuY2gKKwkgICogY2xlYW51cCBpbiBnc3QtcGx1Z2lucyBjb25maWd1cmUuYWMKKwkgICogc29tZSBqYWNrIHVwZGF0ZXMKKwkgICogcmVtb3ZlIFNFTEZfSVRFUkFUSU5HIGZsYWcgaW4gZmF2b3Igb2YgU0VGX1NDSEVEVUxBQkxFIChub3QgYSBjbGVhciBuYW1lLAorCSAgYnV0IGl0J3Mgd2hhdCB3ZSBoYXZlIGZvciB0aGUgbW9tZW50KQorCSAgKiBpbXByb3ZlIHBhcnNpbmcgb2YgcmVxdWVzdCBwYWQgbmFtZXMsIG5vIG1vcmUgc3NjYW5mCisJICAqIGZpeGVzIHRvIHRoZSBmYXN0c2NoZWR1bGVyIE1ha2VmaWxlLmFtCisKKzIwMDItMDMtMjAgMjE6NDU6MDQgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L2phY2svZ3N0amFjay5jOgorCSAgcy9Hbm9tZS1TdHJlYW1lci9HU3RyZWFtZXIvCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHMvR25vbWUtU3RyZWFtZXIvR1N0cmVhbWVyLworCisyMDAyLTAzLTE5IDA0OjEwOjA2ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL01ha2VmaWxlLmFtOgorCSogZXh0L2phY2svZ3N0amFjay5jOgorCSAgcmVtb3ZhbCBvZiAvLy1zdHlsZSBjb21tZW50cyBkb24ndCBsaW5rIHBsdWdpbnMgdG8gY29yZSBsaWJzIC0tIHRoZSB2ZXJzaW9uaW5nIGlzIGRvbmUgaW50ZXJuYWxseSB0byB0aGUgcGx1Z2lucyB3aXRoLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogcmVtb3ZhbCBvZiAvLy1zdHlsZSBjb21tZW50cworCSAgKiBkb24ndCBsaW5rIHBsdWdpbnMgdG8gY29yZSBsaWJzIC0tIHRoZSB2ZXJzaW9uaW5nIGlzIGRvbmUgaW50ZXJuYWxseSB0byB0aGUgcGx1Z2lucyB3aXRoIHRoZSBwbHVnaW5faW5mbyBzdHJ1Y3QsCisJICBhbmQgc3ltYm9sIHJlc29sdXRpb24gaXMgbGF6eSwgc28gd2UgY2FuIGFsd2F5cyBrbm93IGlmIGEgcGx1Z2luIGNhbiBiZSBsb2FkZWQgYnkgdGhlIHBsdWdpbl9pbmZvIGRhdGEuIGluIHRoZW9yeS4KKworMjAwMi0wMy0xOSAwMTozOTo0MyArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvamFjay9NYWtlZmlsZS5hbToKKwkgIHMvQEdTVF9QTFVHSU5fTERGTEFHU0AvJChHU1RfUExVR0lOX0xERkxBR1MpLyBALXN1YnN0aXR1ZWQgdmFyaWFibGVzIHZhcmlhYmxlcyBhcmUgZGVmaW5lZCBhcyBtYWtlIHZhcmlhYmxlcyBhdXRvbWFnaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBzL0BHU1RfUExVR0lOX0xERkxBR1NALyQoR1NUX1BMVUdJTl9MREZMQUdTKS8KKwkgIEAtc3Vic3RpdHVlZCB2YXJpYWJsZXMgdmFyaWFibGVzIGFyZSBkZWZpbmVkIGFzIG1ha2UgdmFyaWFibGVzIGF1dG9tYWdpY2FsbHksCisJICBhbmQgdGhpcyBnaXZlcyB0aGUgdXNlciB0aGUgZnJlZWRvbSB0byBzYXkgbWFrZSBHU1RfUExVR0lOX0xERkxBR1M9LW15ZmxhZworCisyMDAyLTAzLTE4IDA0OjQxOjM1ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9qYWNrL01ha2VmaWxlLmFtOgorCSogZXh0L2phY2svUkVBRE1FOgorCSogZXh0L2phY2svZ3N0amFjay5jOgorCSogZXh0L2phY2svZ3N0amFjay5oOgorCSAgcy9nc3RfZWxlbWVudF9pbnN0YWxsX3N0ZF9wcm9wcy9nc3RfZWxlbWVudF9jbGFzc19pbnN0YWxsX3N0ZF9wcm9wcy8gLS0gaXQganVzdCBtYWtlcyBtb3JlIHNlbnNlIHRoYXQgd2F5IGFkZGVkIGphY2sgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogcy9nc3RfZWxlbWVudF9pbnN0YWxsX3N0ZF9wcm9wcy9nc3RfZWxlbWVudF9jbGFzc19pbnN0YWxsX3N0ZF9wcm9wcy8gLS0gaXQganVzdCBtYWtlcyBtb3JlIHNlbnNlIHRoYXQgd2F5CisJICAqIGFkZGVkIGphY2sgZWxlbWVudCwgZG9lc24ndCBxdWl0ZSB3b3JrIHJpZ2h0IHlldCBidXQgaSBkaWRuJ3Qgd2FudCB0byBsb3NlIHRoZSB3b3JrIC0tIGl0IGRvZXMgYnVpbGQsIHJlZ2lzdGVyLAorCSAgYW5kIGF0dGVtcHQgdG8gcnVuIHRob3VnaAorCSAgKiBpbXBvc2VkIHNvbWUgcmVzdHJpY3Rpb25zIG9uIHRoZSBuYW1pbmcgb2YgcmVxdWVzdCBwYWRzIHRvIGJldHRlciBhbGxvdyBmb3IgcmV2ZXJzZSBwYXJzaW5nCisJICAqIGFkZGVkICclcycgdG8gcmV2ZXJzZSBwYXJzaW5nCisJICAqIGFkZGVkIG5ldyBiaW4gZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIHNlbGYtaXRlcmF0aW5nLCBhbmQgc29tZSBsYW1lIGNvZGUgaW4gZ3N0LWxhdW5jaCB0byB0ZXN0IGl0IG91dAorCSAgKiBmaXhlbiBvbiBsYXVuY2gtZ3VpCisJICAqIGFkZGVkIHBrZy1jb25maWcgc3R1ZmYgZm9yIHRoZSBlZGl0b3IncyBsaWJzCisKKzIwMTEtMDEtMDIgMTE6Mzc6MTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBtYXJrIHY0bDJzaW5rIGFzIGV4cGVyaW1lbnRhbCBhbmQgYnVpbGQgb25seSBpZiAtLWVuYWJsZS1leHBlcmltZW50YWwgaXMgcGFzc2VkCisJICBJdCdzIG5vdCByZWFsbHkgb2YgJ2dvb2QnIHF1YWxpdHkgeWV0LCBidXQgdGhlcmUncyBhIGxvdCBvZgorCSAgY29kZSBzaGFyZWQgd2l0aCB2NGwyc3JjLCBzbyBub3Qgc28gZWFzeSB0byBtb3ZlIGl0IGVsc3doZXJlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxMjI0NAorCisyMDExLTAxLTAyIDAxOjI0OjIxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICBSZXZlcnQgInY0bDI6IGFkZCBub3JtIHByb3BlcnR5IgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCA5ZTFkNDE5ZDA3MzM3ZTZkYjJjYzM5MzY0NzJiZTIwNWNlOTI3ZTU0LgorCSAgUmV2ZXJ0aW5nIHRoaXMgc2luY2UgaXQgYWRkcyB1bnJldmlld2VkIGFuZCBiYWQgQVBJIHRvIHY0bDJzcmMKKwkgIChwcm9wZXJ0eSBvZiB0eXBlIGVudW0sIHdpdGggc2VlbWluZ2x5IHJhbmRvbSBhbmQgdW5zb3J0ZWQgdmFsdWVzKS4KKworMjAxMS0wMS0wMSAyMzoyNjozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRvb2xzLy5naXRpZ25vcmU6CisJKiB0b29scy9NYWtlZmlsZS5hbToKKwkqIHRvb2xzL1JFQURNRS5maWx0ZXJzdGFtcDoKKwkqIHRvb2xzL2ZpbHRlcnN0YW1wLnNoOgorCSogdG9vbHMvZ3N0LWxhdW5jaC1leHQtbS5tOgorCSogdG9vbHMvZ3N0LWxhdW5jaC1leHQuMS5pbjoKKwkqIHRvb2xzL2dzdC12aXN1YWxpc2UtbS5tOgorCSogdG9vbHMvZ3N0LXZpc3VhbGlzZS4xLmluOgorCSAgdG9vbHM6IHJlbW92ZSB1bnVzZWQgbGVmdC1vdmVyIGRpcmVjdG9yeQorCSAgVGhlc2UgYXJlIGFsbCBpbiAtYmFzZS90b29scy4KKworMjAxMC0xMi0zMSAxMzo1NzowNSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5Lmg6CisJICBtcDRhZGVwYXk6IGltcHJvdmUgdGltZXN0YW1wcyBvbiBvdXRnb2luZyBwYWNrZXRzCisJICBJbXByb3ZlIHBhcnNpbmcgb2YgdGhlIHNhbXBsZXJhdGUuCisJICBQYXJzZSB0aGUgZnJhbWVsZW4gc28gdGhhdCB3ZSBjYW4gY2FsY3VsYXRlIHRpbWVzdGFtcHMuCisJICBXaGVuIGludGVycG9sbGF0ZSB0aGUgaW5jb21taW5nIHRpbWVzdGFtcCBvbiBvdXRnb2luZyBidWZmZXJzIHdoZW4gdGhlcmUgYXJlCisJICBtdWx0aXBsZSBzdWJmcmFtZXMuCisJICBmaXhlcyAjNjI1ODI1CisKKzIwMTAtMTItMzEgMDA6MTI6NTMgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvZHRtZi90b25lX2RldGVjdC5jOgorCSAgZHRtZjogRml4IGJ1aWxkIGZhaWx1cmUgY2F1c2VkIGJ5IHByZXZpb3VzIGNvbW1pdAorCisyMDEwLTEyLTMwIDE4OjIwOjQ3IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZmRldGVjdC5jOgorCSogZ3N0L2R0bWYvdG9uZV9kZXRlY3QuYzoKKwkqIGdzdC9kdG1mL3RvbmVfZGV0ZWN0Lmg6CisJICBkdG1mOiBidWlsZCBmaXhlcyBmb3IgTVNWQworCSAgVXNlIGdpbnQxNiBhbmQgR19QSS4KKworMjAxMC0xMi0zMCAxODoxOTo0NyAtMDgwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9kdG1mL3RvbmVfZGV0ZWN0LmM6CisJICBkdG1mOiByZWluZGVudAorCisyMDEwLTEyLTMxIDAyOjE2OjU0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJICBjYWlybywgdmlkZW9maWx0ZXI6IHVzZSBnc3QvbWF0aC1jb21wYXQuaCBoZWFkZXIgZm9yIHJpbnQKKworMjAxMC0xMi0zMCAxNDozMDoyNyAtMDgwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkgIHZpZGVvYmFsYW5jZTogQ2hlY2sgZm9yIEhBVkVfUklOVCBpbnN0ZWFkCisJICBBbHNvIGNoYW5nZSBNX1BJIHRvIEdfUEkgZm9yIGdpZ2dsZXMuCisKKzIwMTAtMTItMzAgMTQ6MjE6MzcgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm9yZW5kZXIuYzoKKwkgIGNhaXJvOiBEb24ndCB1c2UgI2lmZGVmcyBpbnNpZGUgbWFjcm9zCisKKzIwMTAtMTItMzAgMTQ6MjA6NTIgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9rYXJhb2tlLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmM6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkqIGdzdC9nb29tL2NvbnZvbHZlX2Z4LmM6CisJKiBnc3QvZ29vbS9pZnMuYzoKKwkqIGdzdC9nb29tL2xpbmVzLmM6CisJKiBnc3QvZ29vbS90ZW50YWNsZTNkLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L2ZpcmZpbHRlci1leGFtcGxlLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L2lpcmZpbHRlci1leGFtcGxlLmM6CisJICBDaGFuZ2UgTV9QSSB0byBHX1BJCisKKzIwMTAtMTItMzAgMTI6MDc6NTIgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJICB2aWRlb2JhbGFuY2U6IHVzZSBHX09TX1dJTjMyIGZvciB3aW5kb3dzIGNoZWNrCisKKzIwMTAtMTItMzAgMTY6MjQ6MTYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJICBtcDRhZGVwYXk6IGZpeCB0aW1lc3RhbXBzIG9uIGJ1ZmZlcnMKKworMjAxMC0xMi0zMCAxNjoyMjo0OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcHZwYXkuYzoKKwkgIG1wdnBheTogZml4IGZsdXNoaW5nIGFuZCBkaXNjb250CisJICBGaXggZmx1c2hpbmcgYW5kIGRpc2NvbnRzLgorCSAgQ2xlYW4gdXAgaW4gc3RhdGUgY2hhbmdlcy4KKworMjAxMC0xMi0yOSAyMzozODoxOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2EtZGVtdXg6IGluY3JlYXNlIGFsbG93ZWQgbWF4LiBibG9jayBzaXplIGZvciBwdXNoIG1vZGUgZnJvbSAxME0gdG8gMTVNCisJICBJdCB3YXMgYW4gYXJiaXRyYXJ5IGxpbWl0IGZyb20gdGhlIHN0YXJ0LCBtZWFudCBhcyBhIGJhc2ljIHNhbml0eSBjaGVjaywKKwkgIHNvIG1heSBqdXN0IGFzIHdlbGwgaW5jcmVhc2UgaXQgYSBsaXR0bGUuIFdvdWxkIGJlIGdvb2QgdG8gcHJvdmlkZQorCSAgcHJvZ3Jlc3MgcmVwb3J0aW5nIHdoaWxlIGNvbXBsZXRpbmcgdGhlIGJsb2NrIGluIGFueSBjYXNlLi4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MzcwNjAKKworMjAxMC0xMi0yOSAyMzowOTowNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2EtZGVtdXg6IGFzc3VtZSBtYXRyb3NrYSBpZiBubyBkb2N0eXBlIGlzIHNwZWNpZmllZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzODAxOQorCisyMDEwLTEyLTA0IDEzOjQzOjExIC0wNjAwICBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmg6CisJICB2NGwyOiBhZGQgaW50ZXJsYWNlZCBzdXBwb3J0CisKKzIwMTAtMTAtMDIgMTQ6NDU6MTQgLTA1MDAgIFJvYiBDbGFyayA8cm9iQHRpLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS5oOgorCSAgdjRsMnNpbms6IGFkZCBuYXZpZ2F0aW9uIHN1cHBvcnQKKworMjAxMC0wNC0wNCAwNjo0Mzo0MSAtMDUwMCAgUm9iIENsYXJrIDxyb2JAdGkuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuaDoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDI6IGFkZCBub3JtIHByb3BlcnR5CisJICBCYXNlZCBvbiBhIHBhdGNoIGJ5IEd1ZW5uYWRpIExpYWtob3ZldHNraS4KKworMjAxMC0wNy0xMyAxMDowMzo1MSAtMDUwMCAgUm9iIENsYXJrIDxyb2JAdGkuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5oOgorCSAgdjRsMjogY2xlYW51cCBnZXQvc2V0IGlucHV0L291dHB1dAorCSAgb3V0cHV0IGRldmljZXMgc2hvdWxkIHVzZSBnZXQvc2V0IG91dHB1dCwgYW5kIGluIGVpdGhlciBjYXNlIHdlIHNob3VsZAorCSAgbm90IHByaW50IGEgd2FybmluZyBtZXNzYWdlIGlmIHRoZSBpb2N0bCBmYWlscyBidXQgdGhlIGRldmljZSBkb2VzIG5vdAorCSAgY2xhaW0gdG8gc3VwcG9ydCB0aGUgdHVuZXIgaW50ZXJmYWNlCisKKzIwMTAtMDYtMTAgMTE6MTU6NDYgLTA1MDAgIFJvYiBDbGFyayA8cm9iQHRpLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnhvdmVybGF5Lmg6CisJICB2NGwyeG92ZXJsYXk6IGFkZCBzdXBwb3J0IHRvIGNyZWF0ZSB3aW5kb3cKKwkgIElmIHhvdmVybGF5IGlzIGF2YWlsYWJsZSwgdjRsMnNpbmsgc2hvdWxkIGNyZWF0ZSBhIHdpbmRvdyBmb3IgdGhlIG92ZXJsYXkgdG8KKwkgIGRpc3BsYXkgaW4uCisJICBUaGUgd2luZG93IGF1dG9tYXRpY2FsbHkgdHJpZXMgdG8gbWFrZSBpdHNlbGYgYXMgbGFyZ2UgYXMgcG9zc2libGUuCisJICBUaGlzIHdvcmtzIHdlbGwgb24gYSBzbWFsbCBzY3JlZW4sIGJ1dCBwZXJoYXBzIHNob3VsZCBmaXJzdCBhdHRlbXB0IHRvIHVzZQorCSAgdGhlIHNpemUgb2YgdGhlIHZpZGVvIHRoYXQgaXMgcGxheWVkIChubyBzY2FsaW5nKS4KKworMjAxMC0wNC0wNCAwNjo0MToyOCAtMDUwMCAgUm9iIENsYXJrIDxyb2JAdGkuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMnNpbms6IHNwZWNpYWwgaGFuZGxpbmcgZm9yIGNhc2VzIGdzdF9idWZmZXJfbWFrZV9tZXRhZGF0YV93cml0YWJsZSgpCisJICBTcGVjaWFsIGNhc2UgY2hlY2sgZm9yIHN1Yi1idWZmZXJzOiAgSW4gY2VydGFpbiBjYXNlcywgcGxhY2VzIGxpa2UKKwkgIEdzdEJhc2VUcmFuc2Zvcm0sIHdoaWNoIG1pZ2h0IGNoZWNrIHRoYXQgdGhlIGJ1ZmZlciBpcyB3cml0YWJsZSBiZWZvcmUgY29weWluZworCSAgbWV0YWRhdGEsIHRpbWVzdGFtcCwgYW5kIHN1Y2gsIHdpbGwgZmluZCB0aGF0IHRoZSBidWZmZXIgaGFzIG1vcmUgdGhhbiBvbmUKKwkgIHJlZmVyZW5jZSB0byBpdC4gIEluIHRoZXNlIGNhc2VzLCB0aGV5IHdpbGwgY3JlYXRlIGEgc3ViLWJ1ZmZlciB3aXRoIGFuIG9mZnNldD0wCisJICBhbmQgbGVuZ3RoIGVxdWFsIHRvIHRoZSBvcmlnaW5hbCBidWZmZXIgc2l6ZS4KKwkgIFRoaXMgY291bGQgaGFwcGVuIGluIHR3byBzY2VuYXJpb3M6ICgxKSBhIHRlZSBpbiB0aGUgcGlwZWxpbmUsIGFuZCAoMikgYmVjYXVzZQorCSAgdGhlIHJlZmNudCBpcyBpbmNyZW1lbnRlZCBpbiBnc3RfbWluaV9vYmplY3RfZnJlZSgpIGJlZm9yZSB0aGUgZmluYWxpemUgZnVuY3Rpb24KKwkgIGlzIGNhbGxlZCwgYW5kIGRlY3JlbWVudGVkIGFmdGVyIGl0IHJldHVybnMuLiAgYnV0IHJldHVybmluZyB0aGlzIGJ1ZmZlciB0byB0aGUKKwkgIGJ1ZmZlciBwb29sIGluIHRoZSBmaW5hbGl6ZSBmdW5jdGlvbiwgY291bGQgd2FrZSB1cCBhIHRocmVhZCBibG9ja2VkIGluCisJICBfYnVmZmVyX2FsbG9jKCkgd2hpY2ggY291bGQgcnVuIGFuZCBnZXQgYSBidWZmZXIgdy8gcmVmY250PT0yIGJlZm9yZSB0aGUgdGhyZWFkCisJICBvcmlnaW5hbGx5IHVucmVmJ2luZyB0aGUgYnVmZmVyIHJldHVybnMgZnJvbSBmaW5hbGl6ZSBmdW5jdGlvbiBhbmQgZGVjcmVtZW50cworCSAgdGhlIHJlZmNudCBiYWNrIHRvIDEhCisJICBUaGlzIGlzIHJlbGF0ZWQgdG8gaXNzdWUgIzU0NTUwMQorCisyMDEwLTA0LTA0IDA2OjM5OjUyIC0wNTAwICBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBmaXggcmFjZSBjb25kaXRpb24KKwkgIFRoZSBzaXplIG9mIHRoZSBidWZmZXIgd291bGQgYmUgemVybydkIG91dCBpbiBnc3RfdjRsMl9idWZmZXJfZmluYWxpemUoKQorCSAgYWZ0ZXIgdGhlIGJ1ZmZlciBpcyBxYnVmJ2Qgb3IgcHVzaGVkIG9udG8gdGhlIHF1ZXVlIG9mIGF2YWlsYWJsZSBidWZmZXJzLi4KKwkgIGxlYXZpbmcgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSB0aGUgdGhyZWFkIHdhaXRpbmcgZm9yIHRoZSBidWZmZXIgY291bGQgYXdha2UKKwkgIGFuZCBzZXQgYmFjayBhIHZhbGlkIHNpemUgYmVmb3JlIHRoZSBmaW5hbGl6aW5nIHRocmVhZCB6ZXJvcyBvdXQgdGhlIGxlbmd0aC4KKwkgIFRoaXMgd291bGQgcmVzdWx0IHRoYXQgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgaGFzIGxlbmd0aCBvZiB6ZXJvLgorCisyMDEwLTA0LTA0IDA2OjM5OjA4IC0wNTAwICBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5oOgorCSAgdjRsMnNpbms6IGFkZCBwcm9wZXJ0aWVzIHRvIGNvbnRyb2wgY3JvcAorCisyMDEwLTA0LTA0IDA2OjM3OjE2IC0wNTAwICBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS5jOgorCSAgdjRsMjogcmUtZW5hYmxlIHgtb3ZlcmxheSBzdXBwb3J0CisKKzIwMTAtMTItMjUgMTE6NTI6MzYgLTA2MDAgIFJvYiBDbGFyayA8cm9iQHRpLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiBmaXggZm9yIFBBVVNFRC0+UkVBRFktPlBBVVNFRCBzdGF0ZSB0cmFuc2l0aW9ucworCSAgV2hlbiB2NGwyc2luayBnb2VzIHRvIFBBVVNFRC0+UkVBRFkgaXQgb25seSBzdG9wcyBzdHJlYW1pbmcsIHNvIHRoZSBzdGF0ZQorCSAgc2hvdWxkIGJlIHNldCB0byBTVEFURV9QRU5ESU5HX1NUUkVBTU9OIGluIGNhc2UgdGhlIGVsZW1lbnQgdHJhbnNpdGlvbnMKKwkgIGJhY2sgdG8gUExBWUlORy4KKworMjAxMC0wNC0wNCAwNjoyODo1MSAtMDUwMCAgUm9iIENsYXJrIDxyb2JAdGkuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuaDoKKwkgIHY0bDJzaW5rOiBhZGQgIm1pbi1xdWV1ZWQtYnVmcyIgcHJvcGVydHkKKworMjAxMC0wNC0wNCAwNjoyNjo1MCAtMDUwMCAgUm9iIENsYXJrIDxyb2JAdGkuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICB2NGwyc2luazogQWRkIHN1cHBvcnQgZm9yIGJsb2NraW5nIGRlcXVldWUuCisJICBXZSdkIHByZWZlciB0byB0aHJvdHRsZSB0aGUgZGVjb2RlciBpZiB3ZSBydW4gb3V0IG9mIGJ1ZmZlcnMsIHRvIGtlZXAgYSBib3VuZAorCSAgb24gbWVtb3J5IHVzYWdlLiAgQWxzbywgZm9yIE9NQVA0IGl0IGlzIGEgcmVxdWlyZW1lbnQgb2YgdGhlIGRlY29kZXIgdG8gbm90CisJICBhbHRlcm5hdGUgYmV0d2VlbiBtZW1vcnkgYWxsb2NlZCBieSB0aGUgZGlzcGxheSBkcml2ZXIgYW5kIG1hbGxvYydkIHVzZXJzcGFjZQorCSAgbWVtb3J5LgorCisyMDEwLTA0LTA0IDA2OjI0OjQxIC0wNTAwICBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJICB2NGwyOiBjbGVhciBmbGFncyBiZWZvcmUgcmV1c2luZyBidWZmZXIgZnJvbSBidWZmZXIgcG9vbAorCSAgbm90ZTogdGhpcyByZWFsbHkgb25seSBhZmZlY3RzIHY0bDJzaW5rIHNpbmNlIGdzdF92NGwyX2J1ZmZlcl9wb29sX2dldCgpIGlzCisJICBvbmx5IGNhbGxlZCBvbmNlIHBlciBidWZmZXIgaW4gdGhlIHY0bDJzcmMgY2FzZSAoaW4KKwkgIGdzdF92NGwyc3JjX2J1ZmZlcl9wb29sX2FjdGl2YXRlKCkpCisKKzIwMTAtMDQtMDQgMDY6MjM6MzEgLTA1MDAgIFJvYiBDbGFyayA8cm9iQHRpLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiBkb24ndCByZW5kZXIgcHJlcm9sbCBidWZmZXJzCisJICBNb3N0IHY0bDIgZHJpdmVycyB3aWxsIGdldCB1cHNldCB3aGVuIHlvdSBxdWV1ZSB0aGUgc2FtZSBidWZmZXIgdHdpY2UgaW4gYQorCSAgcm93IHdpdGhvdXQgZmlyc3QgZGVxdWV1ZWluZyBpdC4KKwkgIFJlbmRlcmluZyBvZiBwcmUtcm9sbCBidWZmZXJzIGNhbiBiZSByZS1pbnRyb2R1Y2VkIGxhdGVyLCBidXQgd2lsbCByZXF1aXJlCisJICB0cmFja2luZyB0aGUgc3RhdGUgb2YgdGhlIGJ1ZmZlciwgYW5kIGF2b2lkaW5nIHRvIHJlLVFCVUYgaWYgdGhlIGJ1ZmZlciBoYXMKKwkgIGFscmVhZHkgYmVlbiBwYXNzZWQgdG8gdGhlIGRyaXZlci4KKworMjAxMC0wNC0wNCAwNjoyMjo0MyAtMDUwMCAgUm9iIENsYXJrIDxyb2JAdGkuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSAgdjRsMnNpbms6IEltcHJvdmUgYmVoYXZpb3IgZm9yIHNoYXJlZCBidWZmZXJzLgorCSAgV2hlbiB0aGUgZGVjb2RlciBpcyB1c2luZyBwYWRfYWxsb2MoKSwgdjRsMnNpbmsgd291bGQgYmVoYXZlIGJhZGx5IGlmCisJICB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgKCdxdWV1ZS1zaXplJyBwcm9wZXJ0eSkgd2FzIG5vdCBoaWdoIGVub3VnaCB0bworCSAgYWNjb3VudCBmb3IgYWxsIHRoZSBidWZmZXJzIG5lZWRlZCBieSB0aGUgZGVjb2RlciwgYW5kIG90aGVyIGVsZW1lbnRzCisJICAoc3VjaCBhcyBxdWV1ZXMpIGJldHdlZW4gdGhlIGRlY29kZXIgYW5kIHY0bDJzaW5rLiAgVGhpcyBwYXRjaAorCSAgc2xpZ2h0bHkgaW5jcmVhc2VzIHRoZSBkZWZhdWx0IG51bWJlciBvZiBidWZmZXJzLCBhbmQgY2hhbmdlcyB2NGwyc2luaworCSAgdG8gZHJvcCBmcmFtZXMgcmF0aGVyIHRoYW4gcmV0dXJuIGFuIGVycm9yIGluIGNhc2UgdGhlIG51bWJlciBvZgorCSAgYnVmZmVycyBpcyBub3QgaGlnaCBlbm91Z2guCisKKzIwMTAtMTEtMTUgMTU6NTg6MjggKzAxMDAgIEFuZHkgV2luZ28gPHdpbmdvQG9ibG9uZy5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmg6CisJICBhZGQgImNsaWVudCIgcHJvcGVydHkKKwkgICogZXh0L3B1bHNlL3B1bHNlc3JjLmMgKGdzdF9wdWxzZXNyY19jbGFzc19pbml0LCBnc3RfcHVsc2VzcmNfaW5pdCkKKwkgIChnc3RfcHVsc2VzcmNfc2V0X3Byb3BlcnR5LCBnc3RfcHVsc2VzcmNfZ2V0X3Byb3BlcnR5KQorCSAgKGdzdF9wdWxzZXNyY19vcGVuKTogQWRkIGEgImNsaWVudCIgcHJvcGVydHksIGFzIGluIHB1bHNlc2luay4KKwkgIEZpeGVzICM2MzQ5MTQKKworMjAxMC0xMi0yOSAxNTo1NDo0NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHNlcmlhbGlzZS9kZXNlcmlhbGlzZSBmbG9hdHMgd2l0aG91dCBjaGFuZ2luZyBsb2NhbGUKKwkgIFVzZSBnX2FzY2lpX2R0b3N0cigpIGFuZCBnX2FzY2lpX3N0cnRvZCgpIHRvIHNlcmlhbGlzZS9kZXNlcmlhbGlzZQorCSAgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgaW5zdGVhZCBvZiB1Z2x5IGhhY2tzIHRoYXQgc3dpdGNoIGxvY2FsZQorCSAgYmVmb3JlIGFuZCBhZnRlciBjYWxsaW5nIGxpYmMgZnVuY3Rpb25zICh3aGljaCBpcyBub3QgYSBnb29kIGlkZWEKKwkgIGluIGEgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb24pLgorCisyMDEwLTEyLTI5IDE0OjQwOjA1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkgIHJ0cGpwZWdkZXBheTogZml4IGZyYW1lcmF0ZSBwYXJzaW5nIGZvciBsb2NhbGVzIHRoYXQgdXNlIGEgY29tbWEgYXMgZmxvYXRpbmcgcG9pbnQKKwkgIGF0b2YoKSBjb252ZXJ0cyBzdHJpbmdzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBsb2NhbGUsIGJ1dCB0aGUKKwkgIGZyYW1lcmF0ZSBzdHJpbmcgd2lsbCBsaWtlbHkgYWx3YXlzIHVzZSBhIGRvdCBhcyBmbG9hdGluZyBwb2ludAorCSAgc2VwYXJhdG9yLCBzbyB1c2UgZ19hc2NpaV9zdHJ0b2QoKSBpbnN0ZWFkIChidXQgYWxzbyBjYW5vbmljYWxpc2UKKwkgIHRoZSBzdHJpbmcgYmVmb3JlLCBzbyB3ZSBjYW4gaGFuZGxlIGJvdGggZm9ybWF0cyBhcyBpbnB1dCkuCisKKzIwMTAtMTItMjcgMTM6MTE6NTkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlOiB1c2UgdGhlIHJpZ2h0IHZhcmlhYmxlCisJICBVc2UgdGhlIHJpZ2h0IHZhcmlhYmxlIGZvciBzcGVjaWZ5aW5nIHRoYXQgd2Ugc2VudCBhIHJlY2VpdmVyIHJlcG9ydC4KKworMjAxMC0xMi0yMyAxNjo0MjoyOSAtMDYwMCAgUm9iIENsYXJrIDxyb2JAdGkuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMjogZml4IHR5cG8KKworMjAxMC0xMi0yMyAxNjowMzowMCAtMDYwMCAgUm9iIENsYXJrIDxyb2JAdGkuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thLWRlbXV4OiBhZGQgc3RyZWFtLWZvcm1hdCBhbmQgYWxpZ25tZW50IHByb3BlcnRpZXMgZm9yIGgyNjQKKworMjAxMC0xMi0yMiAxMTo0MTo1OSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkgIGdzdHBheTogZml4IGtsYXNzLCBhZGQgUlRQIGFzIGEgdXNlIGNhc2UKKworMjAxMC0xMi0xMiAxNToxMDo0NyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSAgZ3N0ZGVwYXk6IGNsZWFudXAgdGhlIGNhY2hlCisKKzIwMTAtMTItMTIgMDU6MTA6MDEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc3RwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3N0cGF5Lmg6CisJICBnc3RwYXkvZGVwYXk6IGFkZCBnZW5lcmljIGdzdHJlYW1lciBwYXlsb2FkZXIKKwkgIEFkZCB0aGUgYmVnaW5uaW5ncyBvZiBhIGdlbmVyaWMgR1N0cmVhbWVyIGJ1ZmZlcnMgcGF5bG9hZGVyLgorCisyMDEwLTEyLTIzIDE3OjA2OjU4ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkgIG1wNGdwYXk6IHJlc2V0IHN0YXRlIG9uIGZsdXNoLXN0b3AKKworMjAxMC0xMi0yMyAxNjoyNjowNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzoKKwkgIG1wNGdkZXBheTogZmx1c2ggc3RhdGUgb24gZmx1c2gtc3RvcAorCisyMDEwLTEyLTIzIDE2OjI1OjE1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBvbi1ucHQtc3RvcCBpcyBhIG1hbmFnZXIgc2lnbmFsCisKKzIwMTAtMTItMjMgMTU6MjQ6MjkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IGltcHJvdmUgUlRQIHNlc3Npb24gaGFuZGxpbmcKKwkgIFN0b3JlIHRoZSBSVFAgc2Vzc2lvbiBpbiB0aGUgc3RyZWFtIHNvIHRoYXQgd2UgY2FuIG1vcmUgZWZmaWNpZW50bHkKKwkgIHBlcmZvcm0gYWN0aW9ucyBvbiB0aGUgc3RyZWFtIGJhc2VkIG9uIFJUUCBzaWduYWxzLgorCisyMDEwLTEyLTIzIDEzOjU1OjMxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cHNvdXJjZTogaW5jbHVkZSBsYXN0IHNlbmQgUkIgYmxvY2sKKwkgIE9ubHkgcmVwb3J0IFJCIHZhbHVlcyBmb3Igbm9uLWludGVybmFsIHNvdXJjZXMuCisJICBSZXBvcnQgbm90IG9ubHkgdGhlIFJCIGJsb2NrcyB3ZSBsYXN0IHJlY2VpdmVkIGZyb20gYnV0IGFsc28gdGhlIGxhc3QgUkIKKwkgIGJsb2NrIHdlIHNlbnQgdG8gYSBzb3VyY2UuCisKKzIwMTAtMTItMjMgMTM6NTI6NTcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSAgcnRwc2Vzc2lvbjogcmVtZW1iZXIgbGFzdCBzZW50IFJCIHZhbHVlcy4KKworMjAxMC0xMi0yMyAxMzowMDo0OSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IGluY2x1ZGUgYWxsIHN0YXRzIGFuZCBkb2N1bWVudAorCSAgSW5jbHVkZSBhbGwgcG9zc2libGUgc3RhdHMgb2YgYSBzb3VyY2UgaW4gdGhlIHN0YXRzIHN0cnVjdHVyZSBiZWNhdXNlIHdlIG1pZ2h0CisJICBiZSBpbnRlcmVzdGVkIGluIHdoYXQgaGFwcGVuZWQgaW4gdGhlIHBhc3QuCisJICBEb2N1bWVudCB0aGUgc3RhdHMgcHJvcGVydHkgYW5kIHRoZSBmaWVsZHMuCisKKzIwMTAtMTItMjMgMTI6NTk6NTkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtUENNQS5jOgorCSAgZXhhbXBsZXM6IGFkZCBleGFtcGxlIFJUUCBzdGF0cworCSAgQWRkIHNvbWUgbW9yZSBSVFAgZXhhbXBsZXMgZm9yIGhvdyB0byByZXRyaWV2ZSBSVFAgc3RhdHMgaW4gYSByZWNlaXZlci4KKworMjAxMC0xMi0yMyAxMjo1ODowNSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogYWxzbyBlbWl0IFJUQ1AgYWN0aXZpdHkgb24gU1IKKwkgIEFsc28gZW1pdCBSVENQIGFjdGl2aXR5IHNpZ25hbHMgd2hlbiB3ZSByZWNlaXZlIGFuIFNSIHBhY2tldCB3aXRob3V0IFJCIGJsb2NrcywKKwkgIHN1Y2ggYXMgZnJvbSBhIHNlbmRlciB0aGF0IGlzIG5vdCByZWNlaXZpbmcgYW55dGhpbmcuCisKKzIwMTAtMTItMjMgMTE6MTA6NTUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgZG9jczogYWRkIHNvbWUgbW9yZSBnc3RydHBiaW4gZG9jcworCisyMDEwLTEyLTIyIDIxOjI3OjExICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgeGltYWdlc3JjOiByZW1vdGUgaXMgYSBib29sZWFuIChhbmQgbm90IHVpbnQpIHByb3BlcnR5CisKKzIwMTAtMTItMjIgMTk6NTg6MjEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IERvbid0IHVzZSBnc3RfcGFkX2FsbG9jX2J1ZmZlcigpCisJICBVc2luZyB0aGlzIGluIGEgZGVtdXhlciB3aWxsIGNhdXNlIGRlYWRsb2NrcyBpZiB0aGVyZSdzCisJICBhIHBhZCB3aXRoIGEgcGVuZGluZyBwYWQtYmxvY2sgZG93bnN0cmVhbSwgbm8gbWF0dGVyIGlmCisJICB0aGVyZSBpcyBhIHF1ZXVlIGJldHdlZW4gdGhlIHBhZCBvciBub3QuIFF1ZXVlcyBwYXNzCisJICBidWZmZXJhbGxvYyBkb3duc3RyZWFtIGZyb20gdGhlIHNhbWUgdGhyZWFkIGFuZCBvbmx5CisJICBhY3QgYXMgYSB0aHJlYWQgYm91bmRhcnkgZm9yIGV2ZW50cyBhbmQgYnVmZmVycy4KKworMjAxMC0xMi0yMiAxNDoxNDowOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBmaXggc3VidGl0bGUgcGFkIHRlbXBsYXRlLCB3ZSBvbmx5IGhhbmRsZSBrYXRlIGZvciBub3cKKworMjAxMC0xMi0xNiAxMTo0NDo0NCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIGRvY3M6IHVwZGF0ZSBydHNwc3JjIGRvY3MsIHJ0cGJpbiBpcyBub3QgaW4gLWJhZCBhbnkgbW9yZQorCisyMDEwLTEyLTIyIDExOjQyOjMxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiB1bmxvY2sgYmVmb3JlIGVtaXR0aW5nIHNpZ25hbHMKKworMjAxMC0xMi0yMSAyMjozNDo0OSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhYzNwYXkuaDoKKwkgIHJ0cGFjM3BheTogYWRkIEFDMyBwYXlsb2FkZXIKKworMjAxMC0xMi0yMSAyMjoxNzoxOSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5jOgorCSAgYWMzZGVwYXk6IGZpeCBkZWJ1ZyBjYXRlZ29yeSBkZXNjcmlwdGlvbgorCisyMDEwLTEyLTIxIDIyOjE2OjQyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSAgbXBhcGF5OiBhZGQgZGVidWcgY2F0ZWdvcnkKKworMjAxMC0xMi0yMCAxNDo0OTowMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvanBlZ2VuYy5jOgorCSAganBlZ2VuYzogQWRkcyBhbm90aGVyIHRlc3QgY2FzZQorCSAgQWRkcyBhIHRlc3QgZm9yIGpwZWdlbmMgdG8gY2hlY2sgdGhhdCBpcyBwb3NzaWJsZSB0byBuZWdvdGlhdGUgYW5kCisJICBwdXNoIGJ1ZmZlcnMgd2l0aCBkaWZmZXJlbnQgcmVzb2x1dGlvbiBvbmUgYWZ0ZXIgYW5vdGhlci4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Mzc2ODYKKworMjAxMC0xMi0yMSAxMzozNzo0MCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IHNpbmsgcGFkJ3MgZ2V0Y2FwcyBzaG91bGRuJ3QgdXNlIHRoZSBzcmMgcGFkIGdldGNhcHMKKwkgIEluc3RlYWQgb2YgdXNpbmcgZ2V0X2FsbG93ZWRfY2FwcyBvbiB0aGUgc3JjcGFkLCB0aGUgc2lua3BhZCBnZXRjYXBzCisJICBzaG91bGQgdXNlIHRoZSBnZXRjYXBzIG9mIHRoZSBzcmNwYWQncyBwZWVyLiBUaGlzIHdheSB0aGUgc3JjcGFkCisJICBjYW4ga2VlcCB1c2luZyBmaXhlZF9jYXBzIGFuZCBzaW5rcGFkIGdldGNhcHMgZXhwb3NlcyBhbGwgY2FwcworCSAgdGhhdCBjYW4gYmUgbmVnb3RpYXRlZAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzNzY4NgorCisyMDEwLTEyLTIxIDE2OjU4OjQ3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFyb2J1c3RkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkgIHJ0cDogYWRkIFJUUCBoaW50IHRvIHRoZSBrbGFzcworCisyMDEwLTEyLTIxIDE2OjQ5OjI4ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFyb2J1c3RkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkgIHJ0cDogZml4IHJhbmsgb2YgcGF5bG9hZGVycyBhbmQgZGVwYXlsb2FkZXJzCisJICBTZXQgdGhlIHBheWxvYWRlcnMgYW5kIGRlcGF5bG9hZGVycyB0byBhIHJlYXNvbmFibGUgcmFuay4KKworMjAxMC0xMi0yMSAxNToyNDoxOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIHZyYXdkZXBheTogcmVzZXQgZGVwYXlsb2FkZXIgc3RhdGUKKwkgIFJlc2V0IHRoZSBkZXBheWxvYWRlciBzdGF0ZSBvbiBmbHVzaC1zdG9wLgorCisyMDEwLTEyLTIxIDE1OjA3OjE0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5oOgorCSAgbXA0cGF5OiB1c2Ugdm1ldGhvZCBmb3IgaW50ZXJjZXB0aW5nIGV2ZW50cworCisyMDEwLTEyLTIxIDEzOjU1OjQwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgdGhlb3JhcGF5OiBjbGVhciBwYWNrZXQgb24gZmx1c2gtc3RvcAorCisyMDEwLTEyLTIxIDEzOjQ5OjQxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSAgdm9yYmlzcGF5OiBjbGVhciBwYWNrZXQgb24gZmx1c2gtc3RvcAorCisyMDEwLTEyLTIxIDEyOjMxOjQ0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSAgbXA0Z2RlcGF5OiByZXNldCBkZXBheWxvYWRlciBzdGF0ZQorCisyMDEwLTEyLTIxIDEyOjI5OjU4ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIGgyNjRwYXk6IGZsdXNoIGFkYXB0ZXIgb24gZmx1c2gtc3RvcAorCisyMDEwLTEyLTIwIDE4OjQ5OjQ5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSAgbXBhcGF5OiBmbHVzaCBsYXN0IHBhY2tldHMgb24gRU9TCisKKzIwMTAtMTItMjAgMTc6NDc6MDUgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMTY5NDYyYSB0byA0NjQ0NWFkCisKKzIwMTAtMTItMjAgMTY6NTE6NDcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJICBtcGFwYXk6IHJlc2V0IHBheWxvYWRlciBvbiBzdGF0ZSBjaGFuZ2UKKworMjAxMC0xMi0yMCAxNjowNTozNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkgIG1wYXBheTogcmVzZXQgcGF5bG9hZGVyIG9uIGZsdXNoCisJICBSZXNldCB0aGUgcGF5bG9hZGVyIG9uIGEgZmx1c2ggZXZlbnQuCisJICBIYW5kbGUgRElTQ09OVCBiZXR0ZXIuCisKKzIwMTAtMTItMjAgMTU6NTQ6NDUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBnZXQgYmV0dGVyIGJ1ZmZlcmluZyBsZXZlbAorCSAgV2hlbiB0aGUgaml0dGVyYnVmZmVyIGNvbnRhaW5zIC0xIHRpbWVzdGFtcHMsIG1ha2Ugc3VyZSB3ZSBzdGlsbCBjYWxjdWxhdGUgdGhlCisJICBidWZmZXIgZmlsbCBsZXZlbCBieSBza2lwcGluZyB0aGUgLTEgYnVmZmVycy4KKwkgIFRyeSB0byBiZSBtb3JlIHJlc2lsaWVudCB0byB3ZWlyZCBpbnB1dCB0aW1lc3RhbXBzLgorCisyMDEwLTEyLTIwIDExOjEwOjIyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogcHJvdmlkZSBhIGNsb2NrLgorCSAgc2luY2Ugd2UgYXJlIHVzaW5nIHRoZSBjbG9jayBmb3Igc3luYywgd2UgbmVlZCB0byBhbHNvIHByb3ZpZGUgYSBjbG9jayBmb3IgZ29vZAorCSAgbWVhc3VyZS4gVGhlIHJlYXNvbiBpcyB0aGF0IGV2ZW4gaWYgZG93bnN0cmVhbSBlbGVtZW50cyBwcm92aWRlIGEgY2xvY2ssIHdlCisJICBkb24ndCB3YW50IHRvIGhhdmUgdGhhdCBjbG9jayBzZWxlY3RlZCBiZWNhdXNlIGl0IG1pZ2h0IG5vdCBiZSBydW5uaW5nIHlldC4KKworMjAxMC0xMi0yMCAxMDo0OTo1NiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IGNvcHkgYnVmZmVyaW5nIHN0YXRzCisJICB3aGVuIHdlIGNyZWF0ZSBhbiBhZ2dyZWdhdGUgYnVmZmVyaW5nIG1lc3NhZ2UsIGNvcHkgdGhlIGJ1ZmZlcmluZyBzdGF0cyBmb3JtIHRoZQorCSAgbGFzdCBtZXNzYWdlLiBBdCBsZWFzdCB3ZSBnZXQgY29ycmVjdCBidWZmZXJpbmcgbW9kZSB0aGVuLgorCisyMDEwLTEyLTE5IDExOjAyOjQxICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3dhdmVuYy5jOgorCSAgd2F2ZW5jOiBGaXggbWVtb3J5IGxlYWtzIGluIHRoZSB1bml0IHRlc3QKKworMjAxMC0xMi0xOSAxMDo1ODoxNiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuaDoKKwkgIHJhZGlvYWN0djogUHJldmVudCB1c2Ugb2YgdW5pbml0aWFsaXplZCB2YWx1ZXMKKwkgIEZpeGVzIGJ1ZyAjNjE4NjUyLgorCisyMDEwLTEyLTE5IDEwOjIyOjI5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlYnVndXRpbHMvZ3N0Y2Fwc2RlYnVnLmM6CisJICBjYXBzZGVidWc6IERvbid0IGxlYWsgcGFkIHRlbXBsYXRlcyBjcmVhdGVkIGZyb20gc3RhdGljIHBhZCB0ZW1wbGF0ZXMKKworMjAxMC0xMS0yOSAxMjozNjowNiArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5oOgorCSAgeGltYWdlc3JjOiBjaGFuZ2UgZnJvbSBYR2V0SW1hZ2UgdG8gWEdldFN1YkltYWdlIGRlcGVuZGFudCBvbiBhIHByb3BlcnR5CisJICB4aW1hZ2VzcmM6IGNoYW5nZSBmcm9tIFhHZXRJbWFnZSB0byBYR2V0U3ViSW1hZ2UgZGVwZW5kYW50IG9uIGEgcHJvcGVydHkKKwkgIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHBlcmZvcm1hbmNlIGhpdHMgYnkgZGVmYXVsdC4KKworMjAxMC0xMS0yOCAxNjowNDozNSArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICB4aW1hZ2VzcmM6IHVzZSBYR2V0U3ViSW1hZ2UgaW5zdGVhZCBvZiBYR2V0SW1hZ2UsIHdvcmtzIHdpdGggcmVtb3RlIFgKKwkgIHhpbWFnZXNyYzogdXNlIFhHZXRTdWJJbWFnZSBpbnN0ZWFkIG9mIFhHZXRJbWFnZSwgd29ya3Mgd2l0aCByZW1vdGUgWAorCSAgKG9uIG15IHNldHVwIGFueXdheS4uLikKKworMjAxMC0xMS0yNyAxNzoxNTozMiArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDx2aW5jZW50LnBlbnF1ZXJjaEBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICB4aW1hZ2VzcmM6IGZpeCB2YXJpb3VzIHdpZHRoL2hlaWdodCBjYWxjdWxhdGlvbnMgYmVpbmcgb2ZmIGJ5IG9uZSwKKwkgIHhpbWFnZXNyYzogZml4IHZhcmlvdXMgd2lkdGgvaGVpZ2h0IGNhbGN1bGF0aW9ucyBiZWluZyBvZmYgYnkgb25lLAorCSAgYW5kIG1ha2UgaXQgc28gYSBzaW5nbGUgcGl4ZWwgd2lkdGgvaGVpZ2h0IGNhbiBiZSBjYXB0dXJlZCAoZXhjZXB0CisJICB0aGUgdG9wIGxlZnQgb25lLCBhcyAwLDAsMCwwIGlzIHJlc2VydmVkIGZvciBmdWxsIHNjcmVlbiBhcyBwZXIKKwkgIHRoZSBwcm9wZXJ0eSBjb21tZW50cykuCisKKzIwMTAtMTItMTcgMTk6MTk6MzUgLTA2MDAgIFJvYiBDbGFyayA8cm9iQHRpLmNvbT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgZml4IGNvbXBpbGUgZXJyb3JzIG9uIG1hY29zeAorCSAgd2l0aCBpNjg2LWFwcGxlLWRhcndpbjEwLWdjYy00LjIuMToKKwkgIGdzdHY0bDJvYmplY3QuYzogSW4gZnVuY3Rpb24gJ2dzdF92NGwyX29iamVjdF9nZXRfbmVhcmVzdF9zaXplJzoKKwkgIGdzdHY0bDJvYmplY3QuYzoxOTg4OiB3YXJuaW5nOiBmb3JtYXQgJyV1JyBleHBlY3RzIHR5cGUgJ3Vuc2lnbmVkIGludCcsIGJ1dCBhcmd1bWVudCAxMiBoYXMgdHlwZSAnZ2ludCAqJworCSAgZ3N0djRsMm9iamVjdC5jOjE5ODg6IHdhcm5pbmc6IGZvcm1hdCAnJXUnIGV4cGVjdHMgdHlwZSAndW5zaWduZWQgaW50JywgYnV0IGFyZ3VtZW50IDEzIGhhcyB0eXBlICdnaW50IConCisKKzIwMTAtMTItMTcgMTU6Mzg6MTUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgcnRwaDI2NGRlcGF5OiBkZXRlcm1pbmUgb3V0cHV0IGgyNjQgbGF5b3V0IHVzaW5nIGNhcHMgbmVnb3RpYXRpb24KKwkgIC4uLiB0aGVyZWJ5IChwYXJ0aWFsbHkpIGRlcHJlY2F0aW5nIHByb3BlcnRpZXMgY3VycmVudGx5IGNvbnRyb2xsaW5nIHdoZXRoZXIKKwkgIG9yIG5vdCBieXRlLXN0cmVhbSBvdXRwdXQgb3IgTkFML0FVIGFsaWdubWVudCAodGhvdWdoIHByb3BlcnRpZXMgc3RpbGwgZGV0ZXJtaW5lCisJICBmYWxsYmFjayBpZiBub3RoaW5nIHNwZWNpZmllZCBpbiBjYXBzKS4KKwkgIEZpeGVzICM2MDY2NjIuCisKKzIwMTAtMTItMTYgMTg6NTU6NDMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJICBqMmtwYXk6IGhhbmRsZSBFT0MgY29ycmVjdGx5CisJICBEb24ndCBpbmNsdWRlIHRoZSBuZXh0IDIgYnl0ZXMgd2hlbiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZGF0YSBhbmQgdGhlcmUgYXJlCisJICBubyBtb3JlIGJ5dGVzIGxlZnQuCisKKzIwMTAtMTItMTYgMTU6MTU6NDkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGZsdXNoIHJlbWFpbmluZyBidWZmZXJlZCBzYW1wbGVzIG9uIEVPUworCSAgLi4uIHdoaWNoIGNhbiBtYWtlIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGFsbCBvciBub3RoaW5nIHdoZW4gZGVhbGluZworCSAgd2l0aCBzaG9ydCBzdHJlYW1zIGFuZCByZWxhdGl2ZWx5IGxhcmdlIHJpbmdidWZmZXIgc2VnbWVudC4KKworMjAxMC0xMi0xNiAxMDowNDoxOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IENoYW5nZSBjbGFzc2lmaWNhdGlvbiB0byBGaWx0ZXIvRWZmZWN0L1ZpZGVvL0RlaW50ZXJsYWNlCisKKzIwMTAtMTItMTUgMTg6MjE6MzQgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5jOgorCSAgcnRwajJrcGF5OiBJbml0aWFsaXplIGFsbCBmaWVsZHMKKwkgIE1ha2VzIHNhZCBjb21wbGllcnMgaGFwcHkKKworMjAxMC0xMi0xNSAxNjoyMjo1NCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkgIGoya3BheTogY2xlYW51cCBoZWFkZXIgY29uc3RydWN0aW9uCisJICBVc2UgYSBzaW1wbGVyIHdheSBvZiBjb25zdHJ1Y3RpbmcgdGhlIGhlYWRlciB0aGF0IGRvZXNuJ3QgZGVwZW5kIG9uCisJICB0aGUgZW5kaWFubmVzcy4KKworMjAxMC0xMi0xNSAxMzozMDo1MCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogZGVwZW5kIG9uIC1iYXNlIGZyb20gZ2l0IGZvciBuZXcgcnRwIGJhc2UgZGVwYXlsb2FkZXIgZmVhdHVyZXMKKwkgIFRoaXMgaXMgb2sgaW4gdGhpcyBjYXNlLCBzaW5jZSB0aGUgcGxhbiBpcyB0byByZWxlYXNlIGNvcmUvYmFzZSBhZ2FpbgorCSAgYWxvbmcgd2l0aCBnb29kL3VnbHkvYmFkIGluIHRoZSBuZXh0IGN5Y2xlLgorCisyMDEwLTEyLTE1IDE0OjU1OjU4ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSAyMDc0MmFlIHRvIDE2OTQ2MmEKKworMjAxMC0xMi0xNSAxMzoxMjowOSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5oOgorCSAgajJrZGVwYXk6IGFkZCBzdXBwb3J0IGZvciBidWZmZXIgbGlzdHMKKworMjAxMC0xMi0xNCAxODoxMjo0MyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogZml4IGF2ZXJhZ2UgUlRDUCBwYWNrZXQgc2l6ZSBzb21lIG1vcmUuCisJICBGaXggc3R1cGlkIGVycm9yIGluIGF2ZXJhZ2luZyBtYWNyby4KKwkgIEluY2x1ZGUgdWRwIGhlYWRlcnMgaW4gcGFja2V0IGxlbmd0aCBlc3RpbWF0aW9uLgorCisyMDEwLTEyLTE0IDE3OjE1OjIzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSAgcnRwYmluOiBjb3JyZWN0bHkgY2FsY3VsYXRlIFJUQ1AgcGFja2V0IHNpemUKKworMjAxMC0xMi0xNCAxNToyNzo1MiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkgIGoya3BheTogc3RvcCBzY2FubmluZyB3aGVuIHdlIHJlYWNoZWQgdGhlIGVuZAorCSAgU3RvcCBzY2FubmluZyBmb3IgbWFya2VycyB3aGVuIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZGF0YS4KKworMjAxMC0xMi0xMyAxNjoyMzoyNCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMDExYmNjOCB0byAyMDc0MmFlCisKKzIwMTAtMTItMTMgMTI6NTY6MTIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBhdm9pZCBsZWFraW5nIHNpbmsgZXZlbnRzCisJICBBdm9pZCBsZWFraW5nIHRoZSBuZXdzZWdtZW50IGV2ZW50IHdoZW4gaXQgaGFzIHRoZSB3cm9uZyBmb3JtYXQuCisKKzIwMTAtMTItMTIgMTQ6NTM6MTcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSAgbXA0dnBheTogd2UgY2FuIGFsc28gYWNjZXB0IHh2aWQgY2FwcworCisyMDEwLTEyLTEyIDAxOjM5OjA2ICsxMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEF2b2lkIGluZmluaXRlIGxvb3AgZHJhaW5pbmcgZnJhbWVzCisJICBXaGVuIHRoZSBwaXBlbGluZSBpcyBmbHVzaGVkIGp1c3QgYXMgd2UncmUgZHJhaW5pbmcgaGlzdG9yeSwKKwkgIGRvbid0IGxvb3AgaW5maW5pdGVseSwganVzdCBkaXNjYXJkIHRoZSBoaXN0b3J5IGFuZCBhYm9ydC4KKworMjAxMC0xMi0xMSAxNzozOToyMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkgIGpwZWdkZWM6IGFkZCAibWF4LWVycm9ycyIgcHJvcGVydHkgdG8gaWdub3JlIGRlY29kaW5nIGVycm9ycworCSAgQWRkIHByb3BlcnR5IHRvIGlnbm9yZSBkZWNvZGluZyBlcnJvcnMuIERlZmF1bHQgaXMgdG8gaWdub3JlIGEgZmV3CisJICBkZWNvZGluZyBlcnJvcnMgaWYgdGhlIGlucHV0IGlzIHBhY2tldGl6ZWQsIGJ1dCBlcnJvciBvdXQgaW1tZWRpYXRlbHkKKwkgIGlmIHRoZSBpbnB1dCBpcyBub3QgcGFja2V0aXplZC4KKwkgIElnbm9yaW5nIGVycm9ycyBmb3IgcGFja2V0aXplZCBpbnB1dCBtb3N0IGxpa2VseSBkb2Vzbid0IHdvcmsKKwkgIHByb3Blcmx5IHlldCwgc28gZG9uJ3QgZG8gdGhhdCBmb3Igbm93LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYyMzA2MworCisyMDEwLTA1LTI4IDE1OjI3OjE0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAganBlZ2VuYzogZnJlZS9tYWxsb2MgaW5zdGVhZCBvZiByZWFsbG9jLCBhdm9pZHMgbWVtY3B5CisKKzIwMTAtMTItMTEgMTc6NDk6MDMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBDaGVjayBpZiB0aGVyZSdzIGFjdHVhbGx5IGEgc2VlayB0YWJsZSBiZWZvcmUgcGFyc2luZyBpdAorCisyMDEwLTEyLTExIDE3OjQ2OjE3ICswMTAwICBLaXNob3JlIEFyZXBhbGxpIDxraXNob3JlLmFyZXBhbGxpQGdtYWlsLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogSW1wbGVtZW50IENPTlZFUlQgYW5kIEZPUk1BVFMgcXVlcnkKKwkgIEZpeGVzIGJ1ZyAjNjM2Nzg0LgorCisyMDEwLTA3LTAxIDAwOjIyOjA3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYS1kZW11eDogcHV0IHVucmVjb2duaXNlZCBSSUZGIGZvcm1hdCBJRHMgaW50byB0aGUgdW5rbm93biBjYXBzCisJICBFeHRyYSBpbmZvIGNhbid0IGh1cnQuIEZpZWxkIG5hbWVzIGFyZW4ndCBuZWNlc3NhcmlseSBjb25zaXN0ZW50IHdpdGgKKwkgIHdoYXQncyB1c2VkIGVsc2V3aGVyZSB0aG91Z2ggKGUuZy4gYXZpZGVtdXgpLCBidXQgdGhlbiBuZWl0aGVyIGFyZSB0aGUKKwkgIGNhcHMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjIzMTc4CisKKzIwMTAtMTAtMjkgMjI6NTA6MTQgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlbWl4ZXJjdHJsLmM6CisJKiBleHQvcHVsc2UvcHVsc2VtaXhlcmN0cmwuaDoKKwkgIHB1bHNlbWl4ZXI6IEltcGxlbWVudCBNSVhFUl9GTEFHX0FVVE9fTk9USUZJQ0FUSU9OUworCSAgQWRkIHRoZSBtaXhlciBmbGFnIGFuZCBzZW5kIG5vdGlmaWNhdGlvbnMgd2hlbiBlaXRoZXIgdGhlIHZvbHVtZSBvciBtdXRlZAorCSAgc3RhdHVzIGNoYW5nZXMuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjE4Mzg5CisKKzIwMTAtMDItMDggMjE6NDE6MjkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBtYXJrIERJU0NPTlQgd2hlbiByZXN1bWluZyBQTEFZCisJICBJbiBwYXJ0aWN1bGFyLCB3aGVuIHN0cmVhbWluZyBpbnRlcmxlYXZlZCwgdGhpcyBhcnJhbmdlcyBmb3Igc2V0dGluZyBhIG5ldworCSAgdGltZXN0YW1wIG9uIG91dGdvaW5nIGJ1ZmZlciBzbyBkb3duc3RyZWFtIGNhbiBhcHByb3ByaWF0ZSByZXNldAorCSAgdG8gYSBjaGFuZ2UgaW4gKHJ0cCl0aW1lLgorCisyMDEwLTEyLTAyIDE2OjA4OjM0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogZGVncmFkZSBncmFjZWZ1bGx5IHVwb24gZmFpbGluZyBzZWVrIGFuZCB0d2VhayBRVUVSWV9TRUVLSU5HIHJlc3BvbnNlCisKKzIwMTAtMTAtMjUgMTE6NTE6MDYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBhZGQgYW5kIHVzZSBhdXRvIGJ1ZmZlcmluZyBtb2RlCisJICAuLi4gd2hpY2ggc2VsZWN0cyBCVUZGRVIgZm9yIGEgbm9uLWxpdmUgc3RyZWFtLCBhbmQgb3RoZXJ3aXNlIFNMQVZFLgorCSAgRml4ZXMgIzYzMzA4OC4KKworMjAxMC0xMi0wNiAxMjoxNjoxMiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5oOgorCSAgajJrZGVwYXk6IG1ha2UgdGhlIGRlcGF5bG9hZGVyIG1vcmUgcmVzaWxpZW50CisJICBVc2UgMyBhZGFwdGVycywgb25lIHRvIGFjY3VtdWxhdGUgcGFrZXRpemF0aW9uIHVuaXRzLCBhbm90aGVyIG9uIHRvIGFjY3VtdWxhdGUKKwkgIHRpbGVzIGFuZCBhIGxhc3Qgb25lIHRvIGFjY3VtdWxhdGUgdGhlIGZpbmFsIGZyYW1lLgorCSAgRG9uJ3QganVzdCBibGluZGx5IGZsdXNoIHRoZSBhZGFwdGVyIG9uIERJU0NPTlQgYnV0IG9ubHkgZGlzY2FyZCB0aGUgY3VycmVudAorCSAgcGFja2V0aXphdGlvbiB1bml0LgorCSAgV2hlbiB3ZSBkcm9wcGVkIGpwZWcyMDAwIHBhY2tldHMgYmV0d2VlbiBTT1AgbWFya2VycywgYWRqdXN0IHRoZSBTT1QgaGVhZGVyIHdpdGgKKwkgIHRoZSBuZXcgbGVuZ2h0LgorCisyMDEwLTEyLTA5IDEzOjQ5OjA0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IGZsb3cgcmV0dXJuIGFnZ3JlZ2F0aW9uCisKKzIwMTAtMTItMDggMTE6MzU6MzMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggaGFuZGxpbmcgbmVhciBlbmQtb2YtZmlsZSBjb3JuZXIgY2FzZXMKKwkgIEFsc28sIHJlbGF4IHNvbWUgZXJyb3IgaGFuZGxpbmcgdG8gbm90IGJhaWwgb3V0IGNvbXBsZXRlbHkgd2hlbiBzb21ldGhpbmcKKwkgIGZlZWxzIGFtaXNzLCBidXQgY29uc2lkZXIgdGhpcyBFT0YgYW5kIGNvbnRpbnVlIHdpdGggd2FzIG9idGFpbmVkIHNvIGZhci4KKworMjAxMC0xMi0wNyAxNzoxOTowMCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZyYWdtZW50ZWQgc3VwcG9ydDsgZml4IG9mZnNldCBoYW5kbGluZyBhbmQgcmVsYXggZXJyb3IgcmFpc2luZworCSAgSW4gcGFydGljdWxhciwgYWNjZXB0IHVua25vd24gc3RyZWFtIGluIHRyYWNrIGZyYWdtZW50LCBhbmQgb25seSBlcnJvciBvdXQKKwkgIGlmIHRoYXQgcmFpc2VzIHByb2JsZW1zIGxhdGVyIG9uIHdpdGggcmVzcGVjdCB0byBvZmZzZXQgdHJhY2tpbmcuCisJICBGaXhlcyAjNjIwMjgzLgorCisyMDEwLTEyLTA3IDEzOjExOjQ4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiB1c2UgYWFjIGNvZGVjLWRhdGEgdG8gYWRqdXN0IHNhbXBsZXJhdGUgaWYgbmVlZGVkCisJICBCYXNlZCBvbiBwYXRjaCBieSBGYWJpZW4gTGViYWlsbGlmLURlbGFtYXJlIDxmYWJpZW5AYXJxLW1lZGlhLmNvbT4KKwkgIEZpeGVzICM2MzY2MjEuCisKKzIwMTAtMTItMDcgMTE6NDM6MTMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogZG9uJ3QgdW5jb3JrIGluIF9zdGFydAorCSAgRG9uJ3QgdW5jb3JrIGluIHRoZSBfc3RhcnQgbWV0aG9kIGp1c3QgeWV0IGJ1dCB3YWl0IHVudGlsIHdlIGhhdmUgd3JpdHRlbiBzb21lCisJICBzYW1wbGVzIHRvIHB1bHNlYXVkaW8uIFRoaXMgYXZvaWQgdW5kZXJydW5zIG9uIHB1bHNlYXVkaW8gYW5kIGxlc3MgY3JhY2tsaW5nCisJICBub2lzZXMgd2hlbiBzdGFydGluZy4KKworMjAxMC0xMi0wNyAxMTo0Nzo0MSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIGludG8gMC4xMQorCisyMDEwLTEyLTA3IDExOjQzOjEzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGRvbid0IHVuY29yayBpbiBfc3RhcnQKKwkgIERvbid0IHVuY29yayBpbiB0aGUgX3N0YXJ0IG1ldGhvZCBqdXN0IHlldCBidXQgd2FpdCB1bnRpbCB3ZSBoYXZlIHdyaXR0ZW4gc29tZQorCSAgc2FtcGxlcyB0byBwdWxzZWF1ZGlvLiBUaGlzIGF2b2lkIHVuZGVycnVucyBvbiBwdWxzZWF1ZGlvIGFuZCBsZXNzIGNyYWNrbGluZworCSAgbm9pc2VzIHdoZW4gc3RhcnRpbmcuCisKKzIwMTAtMTItMDcgMTE6NDI6MTUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHVzZSBfb2JqZWN0X3JlZl9zaW5rKCkgd2hlbiB3ZSBjYW4KKworMjAxMC0xMi0wNyAxMTo0MDo1OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogZG9uJ3QgYWJ1c2UgdGhlIGNsYXNzIGxvY2sKKwkgIFVzZSBhIG5ldyBzdGF0aWMgbG9jayB0byBwcm90ZWN0IHRoZSBwcm9iZWQgZGV2aWNlIGxpc3QgaW5zdGVhZCBvZiB0aGUgb2JqZWN0CisJICBjbGFzcyBsb2NrLgorCisyMDEwLTEyLTA2IDE5OjU5OjQ5ICswMTAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IGNvbXBpbGVyIHdhcm5pbmdzIG9uIE9TWC4KKworMjAxMC0xMi0wNiAxODoxNzoyNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGFkZCBkZWJ1ZyB0byBub3RpZnkgd2hlbiBza2lwcGluZyB0byBqcGVnIGhlYWRlcgorCisyMDEwLTEyLTA2IDE4OjE2OjE5ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogZGlzY2FyZCBpbmNvbXBsZXRlIGltYWdlCisJICAuLi4gYXMgZGV0ZXJtaW5lZCB3aGVuIGZpbmRpbmcgU09JIG5leHQgaW1hZ2UgYmVmb3JlIGFuIEVPSS4KKwkgIEJhc2VkIG9uIHBhdGNoIGJ5IERhdmlkIEhveXQgPGRhdmlkLmhveXRAbGxubC5nb3Y+CisJICBGaXhlcyAjNjM1NzM0LgorCisyMDEwLTEyLTA2IDE3OjQ1OjM4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogYXZvaWQgaW5maW5pdGUgbG9vcCB3aGVuIHJlc3luY2luZworCSAgRml4ZXMgIzYzNTczNCAocGFydGx5KS4KKworMjAxMC0xMi0wNiAxNzoyODozMiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIG9mIHNzaDovL2dpdC5mcmVlZGVza3RvcC5vcmcvZ2l0L2dzdHJlYW1lci9nc3QtcGx1Z2lucy1nb29kIGludG8gMC4xMQorCisyMDEwLTEyLTA2IDE3OjI3OjUxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBhbmRyb2lkL2FwZXRhZy5tazoKKwkqIGFuZHJvaWQvYXZpLm1rOgorCSogYW5kcm9pZC9mbHYubWs6CisJKiBhbmRyb2lkL2ljeWRlbXV4Lm1rOgorCSogYW5kcm9pZC9pZDNkZW11eC5tazoKKwkqIGFuZHJvaWQvcXRkZW11eC5tazoKKwkqIGFuZHJvaWQvcnRwLm1rOgorCSogYW5kcm9pZC9ydHBtYW5hZ2VyLm1rOgorCSogYW5kcm9pZC9ydHNwLm1rOgorCSogYW5kcm9pZC9zb3VwLm1rOgorCSogYW5kcm9pZC91ZHAubWs6CisJKiBhbmRyb2lkL3dhdmVuYy5tazoKKwkqIGFuZHJvaWQvd2F2cGFyc2UubWs6CisJKiBjb25maWd1cmUuYWM6CisJICBtb3JlIDAuMTAgLT4gMC4xMSBjaGFuZ2VzCisKKzIwMTAtMTItMDYgMTU6MjE6NTMgKzAxMDAgIERhdmlkIEhveXQgPGRob3l0QGxsbmwuZ292PgorCisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkgIGltYWdlZnJlZXplOiBwYXNzIGFsb25nIGVvcyBpZiByZWNlaXZlZCBiZWZvcmUgYnVmZmVyIGFycml2ZXMKKwkgIEZpeGVzICM2MzYxNzIuCisKKzIwMTAtMTAtMjAgMTE6MDU6NDkgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8YW1vcmFsZXNAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogdHJ5IHRvIHdyaXRlIHRpbWVzdGFtcHMgaW4gYWxsIHRoZSBvdXRnb2luZyBidWZmZXJzCisJICBGaXhlcyAjNjMyNjU0LgorCisyMDEwLTEyLTA2IDEyOjIxOjAwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IHN0YXJ0IDAuMTEgYnJhbmNoCisKKzIwMTAtMTItMDYgMTI6MTc6MjEgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuaDoKKwkgIHByb2dyZXNzcmVwb3J0OiBvcHRpb25hbGx5IGRldGVybWluZSBwcm9ncmVzcyB1c2luZyBidWZmZXIgbWV0YWRhdGEKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5IExlbyBTaW5nZXIgPGxzaW5nZXIgYXQgY2FsdGVjaC5lZHU+CisJICBGaXhlcyAjNjI5NDE4LgorCisyMDEwLTEyLTA1IDE0OjM5OjE5ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmM6CisJICBjaGVjazogRml4dXAgdGhlIHNodXR0aW5nIGRvd24gb3JkZXIKKwkgIEZpcnN0IGJyaW5nIGRvd24gZXZlcnl0aGluZyB0byBOVUxMIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHVubGluaworCSAgb3IgdW5yZWYgYW55dGhpbmcuCisJICBBdm9pZHMgdGhlIHRlc3RzIGp1c3QgaGFuZ2luZyB0aGVyZSBmb3IgZXZlciB3YWl0aW5nIHRvIGFjcXVpcmUgYQorCSAgbG9jayB0aGF0IGRvZXNuJ3QgZXhpc3QgYW55bW9yZS4KKworMjAxMC0xMS0wNCAxOTozMTo0NSArMDEwMCAgSmFubmUgR3J1bmF1IDxqYW5uZS5ncnVuYXVAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSAgdjRsMnNyYzogc2V0IHRvcCBmaWVsZCBmaXJzdCBmb3IgaW50ZXJsYWNlZCBidWZmZXJzIGlmIHY0bDIgZXhwb3J0cyBpdAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzNDM5MworCisyMDEwLTExLTA0IDE4OjM2OjA5ICswMTAwICBKYW5uZSBHcnVuYXUgPGphbm5lLmdydW5hdUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IGNoZWNrIGZpZWxkIGluZm9ybWF0aW9uIGFuZCBzZXQgaW50ZXJsYWNlZCBjYXBzIGFjY29yZGluZ2x5CisJICBSZWplY3QgdGhlIGZvcm1hdCBpZiB0aGUgZmllbGQgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzNDM5MQorCisyMDEwLTEyLTAzIDE3OjQyOjE0ICswMTAwICBCZW5qYW1pbiBHYWlnbmFyZCA8YmVuamFtaW4uZ2FpZ25hcmRAc3Rlcmljc3Nvbi5jb20+CisKKwkqIEFuZHJvaWQubWs6CisJKiBhbmRyb2lkL05PVElDRToKKwkqIGFuZHJvaWQvYXBldGFnLm1rOgorCSogYW5kcm9pZC9hdmkubWs6CisJKiBhbmRyb2lkL2Zsdi5tazoKKwkqIGFuZHJvaWQvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLW1hcnNoYWwuYzoKKwkqIGFuZHJvaWQvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLW1hcnNoYWwuaDoKKwkqIGFuZHJvaWQvZ3N0L3VkcC9nc3R1ZHAtZW51bXR5cGVzLmM6CisJKiBhbmRyb2lkL2dzdC91ZHAvZ3N0dWRwLWVudW10eXBlcy5oOgorCSogYW5kcm9pZC9nc3QvdWRwL2dzdHVkcC1tYXJzaGFsLmM6CisJKiBhbmRyb2lkL2dzdC91ZHAvZ3N0dWRwLW1hcnNoYWwuaDoKKwkqIGFuZHJvaWQvaWN5ZGVtdXgubWs6CisJKiBhbmRyb2lkL2lkM2RlbXV4Lm1rOgorCSogYW5kcm9pZC9xdGRlbXV4Lm1rOgorCSogYW5kcm9pZC9ydHAubWs6CisJKiBhbmRyb2lkL3J0cG1hbmFnZXIubWs6CisJKiBhbmRyb2lkL3J0c3AubWs6CisJKiBhbmRyb2lkL3NvdXAubWs6CisJKiBhbmRyb2lkL3VkcC5tazoKKwkqIGFuZHJvaWQvd2F2ZW5jLm1rOgorCSogYW5kcm9pZC93YXZwYXJzZS5tazoKKwkgIEFkZCBidWlsZCBzeXN0ZW0gZm9yIEFuZHJvaWQKKworMjAxMC0wMy0yNiAxMzo1MTo1OCArMDEwMCAgR3VpbGxhdW1lIEVtb250IDxnZW1vbnRAaWdhbGlhLmNvbT4KKworCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2c2Vlay5jOgorCSAgbmF2c2VlazogYWRkIGJhc2ljIHN1cHBvcnQgdG8gY2hhbmdlIHBsYXliYWNrIHJhdGUKKwkgIFRoZSBmb2xsb3dpbmcga2V5cyB3aWxsIG5vdyBiZSBpbnRlcnByZXRlZCBieSBuYXZzZWVrOgorCSAgJ2YnIG1lYW5zIGZhc3QgZm9yd2FyZDogdGhlIHN0cmVhbSBnZXRzIHBsYXllZCBhdCByYXRlIDIuMAorCSAgJ3InIG1lYW5zIHJld2luZDogdGhlIHN0cmVhbSBnZXRzIHBsYXllZCBhdCByYXRlIC0yLjAKKwkgICduJyBtZWFucyBub3JtYWw6IHRoZSBzdHJlYW0gZ2V0cyBwbGF5ZWQgYXQgcmF0ZSAxLjAKKwkgIEZpeGVzICM2MzE1MTYuCisKKzIwMTAtMTItMDEgMTM6MTI6MDQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgc3VwcG9ydCBmb3IgZShhKWMtMyBhdWRpbworCisyMDEwLTExLTE5IDEyOjQ0OjM1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogYXZvaWQgc2VuZGluZyBFT1MgZXZlbnQgdHdpY2UKKworMjAxMC0xMS0xOSAxMjo0NDoxOCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJlbW92ZSBkZWFkIGNvZGUgdHJ5aW5nIHRvIHVwZGF0ZSBzdHJlYW0gZHVyYXRpb24KKwkgIE9uIHRoZSBvbmUgaGFuZCwgaXQgaW5zdWZmaWNpZW50bHkgY2hlY2tzIHdoZXRoZXIgaXQgb25seSB1cGRhdGVzIGEgZHVtbXkKKwkgIHNlZ21lbnQuICBPbiB0aGUgb3RoZXIgaGFuZCwgb25seSBkb2luZyB0aGlzIGF0IHRoZSB0aW1lIHRoZSBsYXN0IHNhbXBsZWQgaXMKKwkgIHByZXBhcmVkIChhbmQgc2VudCBkb3duc3RyZWFtKSBpcyB0b28gbGl0dGxlIHRvbyBsYXRlLgorCisyMDEwLTExLTA5IDEwOjU4OjU3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZnJhZ21lbnRlZCBzdXBwb3J0OyBoYW5kbGUgaXNtdiBzYW1wbGUgZmxhZ3MKKworMjAxMC0xMS0wOCAxMTo0MToyMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZyYWdtZW50ZWQgc3VwcG9ydDsgaGFuZGxlIGlzbXYgc3RibCBhdG9tcworCSAgLi4uIG9yIGxhY2sgb2Ygc29tZSB0aGVyZW9mLCBzdWNoIGFzIG1hbmRhdG9yeSBzdHN6LiAgU2h1ZmZsZSBzb21lIGNvZGUKKwkgIGluIF9zdGJsX2luaXQgdG8gZGV0ZWN0IHRoaXMgZWFybHkgZW5vdWdoLgorCisyMDEwLTExLTA4IDExOjM5OjM3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZnJhZ21lbnRlZCBzdXBwb3J0OyBjb21wZW5zYXRlIGZvciBpc212IG9mZnNldCBoYW5kbGluZworCSAgLi4uIG9yIGxhY2sgdGhlcmVvZiwgd2hpY2ggYWNjb3JkaW5nIHRvIHNwZWNzIHdvdWxkIHB1dCBtZWRpYSBkYXRhIGluCisJICB1bmxpa2VseSBwb3NpdGlvbi4KKworMjAxMC0xMS0wNCAxNDowNzo1NiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGZyYWdtZW50ZWQgc3VwcG9ydCBmb3IgcHVzaCBtb2RlCisKKzIwMTAtMTEtMDQgMTA6MTc6MzcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBmcmFnbWVudGVkIHN1cHBvcnQ7IHByb3BlciBhbmQgaW5jcmVtZW50YWwgbW9vZiBwYXJzaW5nCisJICBUaGF0IGlzLCBwYXJzZSBlYWNoIG1vb2YgaW4gb25lIHBhc3MgKGNvbnNpZGVyaW5nIGFsbCBjb250YWluZWQgc3RyZWFtcycKKwkgIG1ldGFkYXRhKSwgYW5kIGRvIHNvIGluY3JlbWVudGFsbHkgYXMgbmVlZGVkIGZvciBwbGF5YmFjayByYXRoZXIgdGhhbgorCSAgYW4gaW5pdGlhbCBjb21wbGV0ZSBzY2FuIG9mIGFsbCBtb29mICh0aG91Z2ggYWxsIG1vb3Ygc2FtcGxlIG1ldGFkYXRhCisJICBpcyBmdWxseSBwYXJzZWQgYXQgc3RhcnR1cCkuCisKKzIwMTAtMTEtMDQgMTA6MDY6MzAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiByZWZhY3RvciBzdHJlYW0gZnJlZWluZworCisyMDEwLTExLTA0IDEwOjA1OjE1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZGVsZWdhdGUgbGluZWFyIHNlYXJjaCBmb3Igc2FtcGxlIHRvIGJpbmFyeSBzZWFyY2ggd2hlbiBwb3NzaWJsZQorCSAgQWxzbyBhcnJhbmdlIGZvciBwYXJzaW5nIGEgc2FtcGxlIHByaW9yIHRvIHRha2luZyBhIHJlZmVyZW5jZSB0byBpdCwKKwkgIHdoaWNoIHJlcXVpcmVzIGxlc3MgbWVtb3J5IGxheW91dCBhc3N1bXB0aW9ucyBmb3IgY29ycmVjdG5lc3MuCisKKzIwMTAtMTEtMDEgMTU6NTI6MjkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmcmFnbWVudGVkIHN1cHBvcnQ7IGhhbmRsZSBtb292IHNhbXBsZXMgYW5kIHByb3BlciBzdHJlYW0gZHVyYXRpb24KKworMjAxMC0xMS0wMSAxMzo0MDowNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZyYWdtZW50ZWQgc3VwcG9ydDsgY29uc2lkZXIgbXZleCBhbmQgaGFuZGxlIGZsYWdzIGFuZCBvZmZzZXQgZmllbGRzCisKKzIwMTAtMTAtMjggMTY6NDk6NDEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmcmFnbWVudGVkIHN1cHBvcnQ7IGZvcmVnbyBjaGVjayBmb3Igc2hvcnQgc3RyZWFtcworCSAgLi4uIGFzIHNvbWUgYm9ndXMgZmlsZXMgbWF5IGluZGljYXRlIHN0cmVhbXMgb2YgMCBkdXJhdGlvbiBpbiBtb292LAorCSAgd2hpbGUgaW5kaWNhdGluZyB0aGUgY29tcGxldGUgbW92aWUgZHVyYXRpb24gaW4gbXZoZCAodGhlIGxhdHRlciBzaG91bGQKKwkgIGJlIGluIG1laGQpLgorCisyMDEwLTEwLTI4IDE2OjQ2OjQ4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF90eXBlcy5oOgorCSAgcXRkZW11eDogZnJhZ21lbnRlZCBzdXBwb3J0OyBjb2RlIGNsZWFudXBzIGFuZCBvcHRpbWl6YXRpb25zIGluIGF0b20gcGFyc2luZworCSAgQXZvaWQgZXh0cmEgYWxsb2NhdGlvbiBpbiBfcGFyc2VfdHJ1biwgYWRkIG1vcmUgY2hlY2tzIGZvciBwYXJzaW5nIGVycm9ycywKKwkgIGFkZCBvciBhZGp1c3Qgc29tZSBkZWJ1ZyBzdGF0ZW1lbnQsIGZpeCBjb21tZW50cywgc3ByaW5rbGUgc29tZSBicmFuY2gKKwkgIHByZWRpY3Rpb24uCisKKzIwMTAtMDktMTMgMjM6MTk6NDQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwYXJzZV9tb29mIHNob3VsZCByZXR1cm4gVFJVRSBvbiBzdWNjZXNzCisKKzIwMTAtMDktMTAgMjI6NDE6MDMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBGaXggaXRlcmF0aW9uIGJ1ZworCSAgQXZvaWQgaW5maW5pdGUgbG9vcCB3aGVuIGl0ZXJhdGluZyB0cmFmCisKKzIwMTAtMDktMTAgMjE6MzI6MjYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBSZWZhY3RvciB0cnVuIHBhcnNpbmcKKwkgIFRoZSBhbGxvY2F0aW9uIG9mIHRoZSBzYW1wbGVzIGNhbiBiZSBwbGFjZWQgb3V0IG9mIHRoZSBsb29wLgorCSAgTWFrZXMgdGhlIGNvZGUgY2xlYXJlci4KKwkgIEFsc28gYXZvaWQgcmVseWluZyBvbiB0cmFmIGluZm9ybWF0aW9uIGFzIGl0IGlzIHBsYWNlZCBvbiB0aGUKKwkgIGVuZCBvZiB0aGUgZmlsZSBhbmQgbWlnaHQgbm90IGJlIGFjZXNzaWJsZSBvbiBwdXNoIG1vZGUuCisKKzIwMTAtMDktMTAgMDA6Mjk6MjYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBSZW1vdmUgcGFyc2luZyBvZiB1bnVzZWQgYXRvbQorCSAgc2R0cCBhdG9tIGlzIHBhcnNlZCBidXQgbm90IHVzZWQsIHNvIHdlIGRvbid0IGhhdmUgdG8KKwkgIHBhcnNlIGl0LgorCisyMDEwLTExLTA5IDExOjQ1OjAwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdHdlYWsgd2FtIHN1cHBvcnQKKwkgIC4uLiB3aXRoIHNvbWUgY29tbWVudCBhbmQgcG9ydGFiaWxpdHkgbWFjcm9zLgorCisyMDA5LTA5LTIzIDE4OjQ3OjQyICswMjAwICBNYXJjLUFuZHLDqSBMdXJlYXUgPG1sdXJlYXVAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfdHlwZXMuYzoKKwkgIHF0ZGVtdXg6IHN1cHBvcnQgd21hICYgdmMtMQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU5NjMyMQorCisyMDEwLTAzLTExIDA5OjU2OjA0ICswMTAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdW1vdGlvbi5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IHBhcnNlIGZtcDQgc2FtcGxlcyBpbmZvcm1hdGlvbgorCSAgVGhlIGZyYWdtZW50ZWQgbXA0IGZvcm1hdCBzdG9yZXMgdGhlIHRyYWNrcyBhbmQgc2FtcGxlcyBpbmZvcm1hdGlvbiBpbiB0aGUKKwkgICdtb29mJyBib3hlcywgd2hpY2ggYXJlIGFwcGVuZGVkIGJlZm9yZSBlYWNoIGZyYWdtZW50IChmcmFnbWVudC0+J21vb2YnKydtZGF0JykuCisJICBUaGUgJ21mcmEnIGJveCBzdG9yZXMgdGhlIG9mZnNldCBvZiBlYWNoICdtb29mJyBib3ggYW5kIHRoZWlyIHByZXNlbnRhdGlvbgorCSAgdGltZS4gVGhlIGxvY2F0aW9uIG9mIHRoaXMgYm94IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgJ21mcm8nIGJveCwgd2hpY2ggaXMKKwkgIGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKwkgIFRoZSAnbWZyYScgYm94IGlzIHBhcnNlZCB0byBnZXQgdGhlIG9mZnNldCBvZiBlYWNoICdtb29mJyBib3ggYW5kIHRoZWlyCisJICBwcmVzZW50YXRpb24gdGltZS4KKwkgIEVhY2ggJ21vb2YnIGJveCBjYW4gY29udGFpbiBpbmZvcm1hdGlvbiBmb3Igb25lIG9yIG1vcmUgdHJhY2tzIGluc2lkZQorCSAgJ3RmaGQnIGJveGVzLiBGb3IgZWFjaCB0cmFjayBpbiBhICdtb29mJywgd2UgaGF2ZSBhICd0cnVuJyBib3gsIHdoaWNoCisJICBjb250YWlucyBpbmZvcm1hdGlvbiBvZiBlYWNoIHNhbXBsZSAob2Zmc2V0IGFuZCBkdXJhdGlvbikgdXNlZCB0byBidWlsZAorCSAgdGhlIHNhbXBsZXMgdGFibGUuCisJICBCYXNlZCBvbiBwYXRjaCBieSBNYXJjLUFuZHLDqSBMdXJlYXUgPG1sdXJlYXVAZmx1bW90aW9uLmNvbT4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD01OTYzMjEKKworMjAxMC0wMy0xMSAxNTozNDo0OSArMDEwMCAgTWFyYy1BbmRyw6kgTHVyZWF1IDxtbHVyZWF1QGZsdW1vdGlvbi5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0YXRvbXBhcnNlci5oOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2R1bXAuaDoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZm91cmNjLmg6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X3R5cGVzLmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X3R5cGVzLmg6CisJICBxdGRlbXV4OiBhZGQgZnJhZ21lbnRlZCBtcDQgZm91cmNjcworCSAgQWRkcyBmb3VyY2MncyBmb3IgdGZyYSwgdGZoZCwgdHJ1biwgc2R0cCwgdHJleCwgbWVoZCBhbmQKKwkgIHRoZWlyIGR1bXBzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTk2MzIxCisKKzIwMTAtMDMtMTEgMTA6MjQ6NTYgKzAxMDAgIE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwYXJzZSB0aGUgdHJhY2sgaWQgZnJvbSB0aGUgdHJhY2sgaGVhZGVyCisJICBTaWduZWQtb2ZmLWJ5OiBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdW1vdGlvbi5jb20+CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTk2MzIxCisKKzIwMTAtMDMtMTEgMTQ6MTA6MTIgKzAxMDAgIE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhbGxvdyBwdWxsaW5nIGF0b21zIHdpdGggdW5rbm93biBzaXplCisJICBTaWduZWQtb2ZmLWJ5OiBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdW1vdGlvbi5jb20+CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTk2MzIxCisKKzIwMTAtMDctMTQgMjA6MTM6NTUgKzAyMDAgIE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2R1bXAuYzoKKwkgIHF0ZGVtdXg6IG1ha2UgcXRkZW11eF9kdW1wX212aGQgcGFyc2UgdmVyc2lvbiAxIGNvcnJlY3RseQorCSAgVmVyc2lvbnMgMCBhbmQgMSBvZiBtdmhkIGhhdmUgZGlmZmVyZW50IHNpemVzIG9mIGl0cyB2YWx1ZXMKKwkgICgzMmJpdHMvNjRiaXRzKS4gVGhpcyBwYXRjaCBtYWtlcyBpdCBkdW1wIHRoZW0gY29ycmVjdGx5LgorCSAgQWxzbyB1c2UgdGhlIHJpZ2h0IG5vZGUgaW4gdGhlIHBhcmFtZXRlciBhbmQgbm90IHRoZSByb290IG5vZGUuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTk2MzIxCisKKzIwMTAtMTEtMTkgMTI6NDU6MDAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBtaW5vciBjbGVhbnVwcyBpbiBzZXR0aW5nIHN0cmVhbWhlYWRlciBvbiBjYXBzCisKKzIwMTAtMTEtMDIgMTc6MDQ6MDQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IG5vcm1hbGl6ZSBlbXB0eSBDdWVzIHRvIG5vIEN1ZXMKKwkgIC4uLiB0byB0cmlnZ2VyIGluZGV4bGVzcyBzZWVraW5nLgorCisyMDEwLTEwLTI2IDExOjE1OjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGFkZCB3b3JrYXJvdW5kIGZvciBidWdneSBsaXN0IHNpemUKKwkgIEZpeGVzIHRydW5jYXRlZCBleHRyYS1kYXRhIGluIGhkcmwvc3RybC9zdHJmIGR1ZSB0byBidWdneSBjb250YWluaW5nCisJICBsaXN0IHNpemUgbm90IGFjY291bnRpbmcgZm9yIHBhZGRpbmcgaW4gY29udGFpbmVkIGNodW5rcy4KKworMjAxMC0xMi0wMiAxNjoxMTowMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgcnRwc3NyY2RlbXV4OiBkbyBub3QgaG9sZCBjdXN0b20gUEFEX0xPQ0sgd2hlbiBwdXNoaW5nIGRvd25zdHJlYW0KKworMjAxMC0xMi0wMiAxNjoxMDoxNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHJlc2V0IHNlc3Npb24gbWFuYWdlciBiYXNlIHRpbWUgd2hlbiBmbHVzaGluZworCSAgLi4uIGFzIHJ0cGJpbiB1c2VzIHJ1bm5pbmcgdGltZSB0byBoYW5kbGUgcnRwaml0dGVyYnVmZmVyJ3MgYnVmZmVyIG1vZGUgcGF1c2VzLgorCisyMDEwLTEyLTAxIDE2OjUxOjMzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogaW5jbHVkZSByYW5nZSByZXF1ZXN0IGZvciBhbGwgc3RyZWFtcyB3aXRoIG5vbi1hZ2dyZWdhdGUgY29udHJvbAorCisyMDEwLTEwLTA3IDE0OjUwOjUzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IGRlYnVnIHN0YXRlbWVudAorCisyMDEwLTEyLTAzIDE1OjM4OjAwICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogUGFyc2UgbW9yZSB2YXJpYW50cyBvZiBudW1lcmljYWwgSURJVCB0YWcKKworMjAxMC0wNS0wNyAxNzozMDozMCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgIHBuZ2VuYzogVXNlIHByb3BlciBmcmFtZXJhdGUgcmFuZ2UgaW4gY2FwcworCisyMDEwLTEyLTAzIDE1OjA0OjI2ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvd2F2ZW5jLmM6CisJICB0ZXN0czogRml4IHByZXZpb3VzbHkgdW5idWlsZGFibGUvdW50ZXN0ZWQgd2F2ZW5jIHRlc3QKKworMjAxMC0xMC0yNCAxNToyMTowOCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IFJlZmFjdG9yIHRhZyBwdXNoaW5nIGxvZ2ljCisJICBUaGUgbG9naWMgb2Ygd2hlbiB0byBwdXNoIHdhcyB3cm9uZyBhbHNvIChyZXN1bHRpbmcgaW4gc29tZSB0YWdzIG5ldmVyCisJICBiZWluZyBwdXNoZWQpLgorCisyMDEwLTEwLTI0IDE1OjIwOjI3ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvZmx2L01ha2VmaWxlLmFtOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IFVzZSBwYnV0aWxzIGZvciBjb2RlYyBkZXNjcmlwdGlvbnMKKworMjAxMC0wNC0xMyAxMToyOTozMCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc2luay5jOgorCSAgY2hlY2s6IFVzZSBmYWlsX3VubGVzc19lcXVhbHNfaW50IGluc3RlYWQgb2YgZmFpbF9pZgorCSAgTWFrZXMgdGhlIGVycm9yIG1lc3NhZ2UgbW9yZSBpbnRlcmVzdGluZworCisyMDEwLTExLTMwIDE5OjIyOjExICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogQWxzbyBleHRyYWN0IElESVQgdGFncyBwcmVzZW50IHRvbyBlYXJseQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzNjE0MworCisyMDEwLTExLTMwIDE5OjIxOjIzICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogQWxzbyBlbWl0IERhdGVUaW1lIHRhZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzNjE0MworCisyMDEwLTEyLTAzIDAwOjIyOjQ4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogZGV0ZWN0IERUUyBhZHZlcnRpc2VkIGFzIFBDTSBjb3JyZWN0bHkgaW4gc29tZSBtb3JlIGNhc2VzCisJICBUaGUgRFRTIHR5cGVmaW5kZXIgbWF5IHJldHVybiBhIGxvd2VyIHByb2JhYmlsaXR5IGZvciBmcmFtZXMgdGhhdCBzdGFydAorCSAgYXQgbm9uLXplcm8gb2Zmc2V0cyBhbmQgd2hlcmUgdGhlcmUncyBubyBzZWNvbmQgZnJhbWUgc3luYyBpbiB0aGUgZmlyc3QKKwkgIGJ1ZmZlci4gSXQncyBmYWlybHkgdW5saWtlbHkgdGhhdCB3ZSdsbCBhY2lkZW50YWxseSBpZGVudGlmeSBQQ00gZGF0YQorCSAgYXMgRFRTLCBzbyB3ZSBkb24ndCBkbyBhZGRpdGlvbmFsIGNoZWNrcyBmb3Igbm93LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzNjIzNAorCisyMDEwLTExLTA4IDE3OjExOjQyICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IG1ha2VmaWxlIGNsZWFudXAKKwkgIEZpeCBpbmRlbnRhdGlvbi4gVXNlICQoR1NUX01BSk9STUlOT1IpIGluc3RlYWQgb2YgaGFyZGNvZGVkIDAuMTAuCisKKzIwMTAtMTEtMDggMTc6MDI6NTYgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZlbmMuYzoKKwkgIHRlc3RzOiBhZGQgYSB0ZXN0IGZvciB3YXYgbXV4aW5nCisKKzIwMTAtMTEtMDggMTY6NTc6MTcgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW50ZXJsZWF2ZS5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3dhdnBhY2suYzoKKwkgIHRlc3RzOiByZW1vdmUgbmV3bGluZXMgYmV0d2VlbiB2YXJpYWJsZSBkZWNscyAob2xkIGdzdC1pbmRlbnQgZmFpbHVyZSkKKworMjAxMC0xMS0wOCAxNDo0NzowNCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgcG5nZGVjOiB1c2UgcG5nX2Vycm9yKCkgYXMgcmVjb21tZW5kZWQgYnkgbGlicG5nIGRvY3MgdG8gc2lnbmFsIGFuIGVycm9yCisJICBXaXRob3V0IHRoYXQgdGhlIGVsZW1lbnQgbG9vcHMgZW5kbGVzc2x5IG9uIGJyb2VrbiBwbmdzLiBGaXhlcyAjNjM0MzE0CisKKzIwMTAtMTEtMTYgMTc6NDg6MTYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBQYXJzZSBhbmQgdXNlIGNyZWF0aW9uIHRpbWUgdGFnIGZyb20gbXZoZAorCSAgRXhwb3NlIGNyZWF0aW9uIHRpbWUgZnJvbSBtdmhkIGFzIGEgZGF0ZXRpbWUgdGFnCisJICBGaXhlcyAjNjM0OTI4CisKKzIwMTAtMTAtMjcgMTk6MTU6MjAgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8YW1vcmFsZXNAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJICBpY3lkZW11eDogQWRkICdTdHJlYW1VcmwnIG1ldGFkYXRhIGFzIEdTVF9UQUdfSE9NRVBBR0UgdGFnCisKKzIwMTAtMTAtMjMgMTk6MzQ6MDAgLTA0MDAgIFRvbSBKYW5pc3pld3NraSA8VG9tLkphbmlzemV3c2tpQGFsY2F0ZWwtbHVjZW50LmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogRml4IGZvciBuZWxseW1vc2VyIGNvZGVjaWQgc2V0dGluZworCSAgRml4ZXMgYnVnICM2MzI4OTcuCisKKzIwMTAtMTAtMjEgMTY6MTU6MDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogQWRkIHN1cHBvcnQgZm9yIEUtQUMzCisKKzIwMTAtMTAtMjEgMTY6MTQ6NDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogQWRkIHN1cHBvcnQgZm9yIERUUworCisyMDEwLTEwLTMxIDE4OjA4OjE3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBEb24ndCBzZW5kIHNlZWtzIGJlaGluZCB0aGUgZW5kIG9mIGZpbGUgdG8gdGhlIHNlcnZlcgorCSAgQWxzbyBpbXByb3ZlIGRlYnVnIG91dHB1dCwgcmUtaW5pdGlhbGl6ZSB0aGUgY29udGVudCBzaXplIGFuZCBsZXQgdGhlCisJICBzZWVrIGhhbmRsZXIgZXJyb3Igb3V0IG9uIGludmFsaWQgc2VlayBzZWdtZW50cy4KKwkgIEZpeGVzIGJ1ZyAjNjMyOTc3LgorCisyMDEwLTEyLTAyIDE3OjUzOjQyICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5jOgorCSAgajJrcGF5OiB1c2UgU09QIG1hcmtlcnMgdG8gc3BsaXQgYml0c3RyZWFtCisJICBXaGVuIHBhcnNpbmcgdGhlIGJpdHN0cmVhbSwgbG9vayBmb3IgU09QIG1hcmtlcnMgYmVjYXVzZSB3ZSBhcmUgYWxsb3dlZCB0byBzcGxpdAorCSAgcGFja2V0cyBvbiB0aG9zZSBtYXJrZXIgYm91bmRhcmllcy4KKwkgIFJld29yayB0aGUgcGFyc2luZyBjb2RlIGEgbGl0dGxlIHNvIHRoYXQgd2UgY2FuIHBhY2sgbXVsdGlwbGUgUGFja2V0aXphdGlvbgorCSAgdW5pdHMgaW4gb25lIFJUUCBwYWNrZXQuCisKKzIwMTAtMTEtMTggMTI6NDk6NDcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5oOgorCSAgcnRwajJrcGF5OiB1c2UgYnVmZmVyIGxpc3RzCisJICBVc2UgYnVmZmVyIGxpc3RzIGZvciBkb2luZyB6ZXJvY29weSBwYXlsb2FkaW5nLgorCSAgQWRkIHByb3BlcnR5IHRvIGRpc2FibGUgYnVmZmVyIGxpc3RzLgorCisyMDEwLTExLTE2IDE2OjU0OjI1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIGgyNjRwYXk6IHNtYWxsIGNsZWFudXBzCisJICBBbGxvY2F0ZSBhZGFwdGVyIG9ubHkgb25jZS4KKwkgIE1ha2Ugc29tZSBndWludDggKiBjb25zdC4KKworMjAxMC0xMS0xNiAxNTozOToyNCArMDEwMCAgVGFtYmV0IEluZ28gPHRhbWJldCBhdCBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBydHBoMjY0cGF5OiBpbXBsZW1lbnQgZnVsbCBieXRlc3RyZWFtIHNjYW4gbW9kZS4KKwkgIEltcGxlbWVudCB0aGUgZnVsbCBieXRlc3RyZWFtIHNjYW4gbW9kZS4KKwkgIEZpeGVzICM2MzQ5MTAKKworMjAxMC0xMS0xNSAxMDo1MjozMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC1BTVIuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2NC1hbHNhc3JjLVBDTUEuc2g6CisJICBleGFtcGxlczogaW1wcm92ZSBSVFAgZXhhbXBsZXMKKwkgIE1ha2UgdGhlIGV4YW1wbGVzIHVzZSBhdXRvdmlkZW9zaW5rIGFuZCBmZm1wZWdjb2xvcnNwYWNlIGZvciBiZXR0ZXIKKwkgIGNvbXDDoHRpYmlsaXR5LgorCSAgTWFrZSBzb21lIG1vcmUgdmFyaWFibGVzIGZvciB0aGUgc2luayBhbmQgdGhlIGRlY29kZXJzLgorCSAgU2V0IHplcm9sYXRlbmN5IHR1bmluZyBvbiB4MjY0ZW5jIGZvciBiZXR0ZXIgcmVhbHRpbWUgcmVzdWx0cy4KKworMjAxMC0xMS0xMCAxMTowNDo0OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogc2VsZWN0IG11bHRpY2FzdCB0cmFuc3BvcnRzIGluIGEgc21hcnRlciB3YXkKKwkgIFdoZW4gd2Ugc2VlIGEgbXVsdGljYXN0IGFkZHJlc3MgaW4gdGhlIFNEUCBjb25uZWN0aW9uLCBvbmx5IHRyeSB0byBuZWdvdGlhdGUgYQorCSAgbXVsdGljYXN0IHRyYW5zcG9ydCB3aXRoIHRoZSBzZXJ2ZXIuCisJICBGaXhlcyAjNjM0MDkzCisKKzIwMTAtMTItMDIgMTg6MTQ6MTYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBCdW1wIEdMaWIgcmVxdWlyZW1lbnQgdG8gaW1wbGljaXQgcmVxdWlyZW1lbnQKKwkgIGllLiA+PSAyLjIwIHdoaWxlIHdlIGRlcGVuZCBvbiBjb3JlL2Jhc2UgMC4xMC4zMQorCisyMDEwLTEyLTAyIDE4OjEzOjU3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQKKworPT09IHJlbGVhc2UgMC4xMC4yNiA9PT0KKworMjAxMC0xMi0wMSAyMToxNTowOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMC4xMC4yNgorCisyMDEwLTExLTMwIDE1OjI4OjUwIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogYW5hbHlzZSBSRkYgZmllbGRzIGluIGNvcnJlY3Qgb3JkZXIKKwkgIENvZGUgd2FzIHJlcGVhdGluZyB0aGUgc2Vjb25kIGZpZWxkLCBub3QgdGhlIGZpcnN0LgorCSAgRml4ZXM6ICM2MzYxNzkuCisKKzIwMTAtMTEtMjkgMTU6MzI6NDAgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBoYW5kbGUgc3RhbGUgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIHNlc3Npb24gZGF0YQorCSAgSW4gcGFydGljdWxhciwgaGFuZGxlIFVuYXV0aG9yaXplZCBzZXJ2ZXIgcmVzcG9uc2Ugd2hlbiB0cnlpbmcgdG8gY29udmV5CisJICBrZWVwLWFsaXZlLgorCSAgRml4ZXMgIzYzNTUzMi4KKworMjAxMC0xMS0yNiAxNTowMDoyOSArMDEwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIHJ0cGgyNjRkZXBheTogZml4IHNlZ2ZhdWx0IG9uIGVtcHR5IHBheWxvYWQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MzU4NDMKKworMjAxMC0xMS0yNSAxOTowNjoyNyArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJICBkdG1mOiBSZW1vdmUgZGVhZCBhc3NpZ25tZW50cworCisyMDEwLTExLTE4IDAwOjQ1OjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgMC4xMC4yNS41IHByZS1yZWxlYXNlCisKKzIwMTAtMTEtMTggMDA6NDQ6NDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBwby9iZy5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vaHUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3RyLnBvOgorCSAgcG86IHVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAxMC0xMS0xNCAwMDoxODoxNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGZpeCByZWZlcmVuY2UgbGVhaworCisyMDEwLTExLTEyIDIzOjU5OjA2ICsxMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEZsdXNoIFFvUyBhbmQgaGlzdG9yeSBiZWZvcmUgYXBwbHlpbmcgc2VnbWVudAorCSAgV2hlbiBoYW5kbGluZyBuZXdzZWdtZW50LCBmbHVzaCBvdXQgdGhlIGJ1ZmZlciBoaXN0b3J5IGluIHRoZQorCSAgZXhpc3Rpbmcgc2VnbWVudCwgbm90IHRoZSBuZXcgb25lLiBGaXhlcyBwbGF5YmFjayBpbiBzb21lIERWRAorCSAgY2FzZXMuCisJICBQYXJ0aWFsbHkgZml4ZXMgIzYzMzI5NAorCisyMDEwLTExLTEyIDEyOjIwOjE2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogaW1wcm92ZSBldmVudCBsb2dnaW5nCisKKzIwMTAtMTEtMDUgMTc6MDA6MTUgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuaDoKKwkgIGRlaW50ZXJsYWNlOiBJbXBsZW1lbnQgZmllbGQgaGlzdG9yeSBmbHVzaGluZworCSAgSW4gYSBudW1iZXIgb2YgY2FzZXMgaXQgaXMgbmVjZXNzYXJ5IHRvIGZsdXNoIHRoZSBmaWVsZCBoaXN0b3J5IGJ5CisJICBwZXJmb3JtaW5nICdkZWdyYWRlZCcgZGVpbnRlcmxhY2luZyAtIHRoYXQgaXMsIHVzaW5nIHRoZSB1c2VyLWNob3NlbgorCSAgbWV0aG9kIGZvciBhcyBtYW55IGZpZWxkcyBhcyBwb3NzaWJsZSwgdGhlbiB1c2luZyB2ZmlyIGZvciBhcyBsb25nIGFzCisJICB0aGVyZSBhcmUgPj0gMiBmaWVsZHMgcmVtYWluaW5nIGluIHRoZSBoaXN0b3J5LCB0aGVuIHVzaW5nIGxpbmVhciBmb3IKKwkgIHRoZSBsYXN0IGZpZWxkLgorCSAgVGhpcyBzaG91bGQgYXZvaWQgbG9zaW5nIGZpZWxkcyBiZWluZyBrZXB0IGZvciBoaXN0b3J5IGZvciBleGFtcGxlIGF0CisJICBFT1MuCisJICBUaGlzIG1heSBhZGRyZXNzIHBhcnQgb2YgIzYzMzI5NAorCisyMDEwLTExLTA1IDE1OjQ0OjM1ICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IFJlZmFjdG9yIGNoYWluIGZ1bmN0aW9uCisJICBUaGlzIGlzIG5lZWRlZCB0byBiZSBhYmxlIHRvIG91dHB1dCBhIGZyYW1lIGZyb20gb3V0c2lkZSB0aGUgY2hhaW4KKwkgIGZ1bmN0aW9uLCBpLmUuIGluIHRoZSBmb2xsb3dpbmcgY29tbWl0IHRoYXQgYWRkcyBmbHVzaGluZyBvZiB0aGUgZmllbGQKKwkgIGhpc3RvcnkuCisKKzIwMTAtMTEtMDUgMTc6MTc6NTYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IHdlIHN0aWxsIHJlcXVpcmUgR3RrKyA+PSAyLjE0LjAgd2hlbiBjb21waWxpbmcgYWdhaW5zdCAyLjAKKwkgIFRoZSBjaGVjayBmb3IgdGhlIG1pbm9yIHZlcnNpb24gd2FzIGRyb3BwZWQgaW4gdGhlIHByZXZpb3VzIGNvbW1pdC4KKworMjAxMC0xMS0wNSAxNjoyNDo0MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogYWRkIC0td2l0aC1ndGsgb3B0aW9uIGFuZCBkZWZhdWx0IHRvIEd0aysgMi4wIHdoaWxlIHRoZSAzLjAgQVBJIGlzIHN0aWxsIGluIGZsdXgKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MzQwMTQKKworMjAxMC0xMS0wNCAxNjo0MjowNyArMTAwMCAgSm9uYXRoYW4gTWF0dGhldyA8am9uYXRoYW5AZDE0bi5vcmc+CisKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSAgaWN5ZGVtdXg6IGZpeCB1c2UtYWZ0ZXItZnJlZSBvZiB0YWdsaXN0CisJICBCcm9rZW4gYnkgY29tbWl0IDRjMmY1MzMzIChidWcgIzYzMDIwNSkuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjMzOTcwCisKKzIwMTAtMTEtMDEgMTc6Mjk6MDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjI1LjQgcHJlLXJlbGVhc2UKKworMjAxMC0xMS0wMSAxNzoyODozNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZXMucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zdi5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTAtMTEtMDEgMTY6MDQ6MjAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGZpeCAtLWRpc2FibGUtZXh0ZXJuYWwKKworMjAxMC0xMS0wMSAxNDo1NjoyOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5Lmg6CisJICBydHBoMjY0ZGVwYXk6IG9ubHkgc2V0IGRlbHRhIHVuaXQgb24gYWxsLW5vbi1rZXkgdW5pdHMKKwkgIE9ubHkgc2V0IHRoZSBkZWx0YSBmbGFnIHdoZW4gYWxsIG9mIHRoZSB1bml0cyBpbiB0aGUgcGFja2V0IGFyZSBkZWx0YSB1bml0cy4KKwkgIEJhc2VkIG9uIHBhdGNoIGZyb20gT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCSAgRml4ZXMgIzYzMjk0NQorCisyMDEwLTEwLTI2IDE1OjQ0OjM3IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSAgZ29vbTogUmV0dXJuIG5vdC1uZWdvdGlhdGVkIHdoZW4gYnBzIGlzIHVua25vd24KKwkgIElmIGNhcHMgd2VyZW4ndCBuZWdvdGlhdGVkLCBnb29tIHNob3VsZCByZXR1cm4gbm90LW5lZ290aWF0ZWQKKwkgIGZyb20gaXRzIGNoYWluIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIHVzaW5nIGJwcyB1bml0aWFsaXplZCwgd2hpY2gKKwkgIGxlYWRzIHRvIGEgZGl2aXNpb24gYnkgMAorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzMzIxMgorCisyMDEwLTEwLTI3IDEzOjE2OjU0ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA3YmJkNzA4IHRvIDAxMWJjYzgKKworMjAxMC0xMC0yNiAxNjo1NDoxMSArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICB2aWRlb2ZsaXA6IEZvcndhcmQgc3JjIHBhZCBldmVudHMgdXBzdHJlYW0uCisJICBGaXggcGFzc2luZyBuYXZpZ2F0aW9uIGFuZCBvdGhlciBldmVudHMgdXBzdHJlYW0gYnkgYWN0dWFsbHkgc2VuZGluZyB0aGVtLgorCSAgRml4ZXM6ICM2MzMyMDUKKworMjAxMC0xMC0yNCAxODo1MDozMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBkZWFkbG9jayBpbiBlcnJvciBjb2RlIHBhdGgKKwkgIEdTVF9FTEVNRU5UX0VSUk9SIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIHRoZSBvYmplY3QgbG9jayBoZWxkLAorCSAgc2luY2UgaXQgd2lsbCBjYWxsIGdzdF9vYmplY3RfZ2V0X3BhcmVudCgpIGludGVybmFsbHksIHdoaWNoCisJICB0YWtlcyB0aGUgb2JqZWN0IGxvY2sgYXMgd2VsbC4KKworMjAxMC0xMC0yMCAxMDoyMTo0OCArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBSZW1vdmUgdXNlbGVzcyBjbGVhcmluZyBvZiBzZW5kX3hpcGhfaGVhZGVycyBmb3IgRGlyYWMKKwkgIFRoaXMgbG9va3MgbGlrZSBhIG1pc3Rha2Ugd2hlbiBjb3B5LXBhc3RpbmcgdGhlIFRoZW9yYSBjb2RlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYzMjY4MgorCisyMDEwLTEwLTIwIDEzOjI4OjI4ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGRvbid0IGNyYXNoIGlmIHZvcmJpcy90aGVvcmEgY29kZWMgZGF0YSBpcyBtaXNzaW5nCisJICBFcnJvciBvdXQgcHJvcGVybHkgaW4gdGhpcyBjYXNlIGluc3RlYWQgb2YgY3Jhc2hpbmcuCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjMyNjgyCisKKzIwMTAtMTAtMjIgMTg6MTE6NDYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjI1LjMgcHJlLXJlbGVhc2UKKworMjAxMC0xMC0xOSAxNjo0NTo1MSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGZpeCBkdXJhdGlvbiByZXBvcnRpbmcKKwkgIEluaXQgc2VnbWVudCBwcmlvciB0byBzdG9yaW5nIGR1cmF0aW9uIGluZm8gaW4gaXQuCisJICBGaXhlcyAjNjMyNTQ4LgorCisyMDEwLTEwLTE5IDE0OjIxOjUzICswMTAwICBCYXN0aWVuIE5vY2VyYSA8aGFkZXNzQGhhZGVzcy5uZXQ+CisKKwkqIGdjb25mL01ha2VmaWxlLmFtOgorCSAgZ2NvbmY6IERvbid0IGluc3RhbGwgc2NoZW1hcyB3aGVuIEdDb25mIGlzIGRpc2FibGVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjMyNTUzCisKKzIwMTAtMTAtMTkgMTM6NDM6MTQgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICB2YXJpb3VzIChnc3QpOiBhZGQgbWlzc2luZyBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIGZsYWdzCisJICBDYW5vbmljYWxpemUgcHJvcGVydHkgbmFtZXMgYXMgbmVlZGVkLgorCisyMDEwLTEwLTE5IDEzOjQ0OjI1ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIGR0bWZzcmM6IHJlbW92ZSBERUJVR19GVU5DUFRSIGZyb20gZ29iamVjdCB2bWV0aG9kcworCisyMDEwLTEwLTE2IDE1OjQzOjUzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgd2luMzI6IHNldCBHU1RfUEFDS0FHRV9SRUxFQVNFX0RBVEVUSU1FIGFsc28gaW4gd2luMzIgY29uZmlnLmgKKworMjAxMC0xMC0xNiAwMTozMzo1MiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIDAuMTAuMjUuMiBwcmUtcmVsZWFzZQorCisyMDEwLTEwLTE2IDAxOjI2OjAxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vZWwucG86CisJKiBwby92aS5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTAtMTAtMTUgMTM6MjI6MDMgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBEb24ndCBkaXN0IGdlbmVyYXRlZCBvcmMgZmlsZXMKKworMjAxMC0xMC0xNSAxNDowMjoxOSAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0Lmg6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLWRpc3QuaDoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kb3JjLWRpc3QuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kb3JjLWRpc3QuaDoKKwkgIFVwZGF0ZSBnZW5lcmF0ZWQgb3JjIGNvZGUKKworMjAxMC0xMC0xNSAxODowMDoxMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogYnVtcCBPcmMgcmVxdWlyZW1lbnQgdG8gMC40LjExCisKKzIwMTAtMTAtMTQgMTc6NDE6MzAgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IFVzZSB0aGUgcmlnaHQgY29uc3RhbnQgdG8gZGVmaW5lIHRoZSAidXNlLXBpcGVsaW5lLWNsb2NrIiBwcm9wZXJ0eQorCSAgVGhlIHdyb25nICNkZWZpbmUgd2FzIGJlaW5nIHVzZWQsIG5vdyB1c2UgdGhlIGNvcnJlY3Qgb25lLgorCisyMDEwLTEwLTE0IDEyOjMxOjQ4IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDVhNjY4YmYgdG8gN2JiZDcwOAorCisyMDEwLTEwLTE0IDE3OjI2OjE0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBhYzM6IGRlbXV4ZXJzIHByb3ZpZGUgZnJhbWVkIG91dHB1dAorCisyMDEwLTEwLTE0IDAwOjExOjI3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmg6CisJICBtYXRyb3NrYW11eDogcmVkdWNlIG5ld3NlZ21lbnQgZXZlbnQgc3BhbSBhbmQgc2V0IGRpc2NvbnQgZmxhZyB3aGVyZSBuZWVkZWQKKwkgIE9ubHkgc2VuZCBuZXdzZWdtZW50IGV2ZW50cyB3aXRoIG5ldyBwb3NpdGlvbnMgZG93bnN0cmVhbSB3aGVuIGFjdHVhbGx5CisJICBuZWVkZWQsIGluc3RlYWQgb2Ygc2VuZGluZyBtdWx0aXBsZSBuZXdzZWdtZW50IGV2ZW50cyB3aXRoIG5ldyBzZWVrCisJICBwb3NpdGlvbnMgaW4gYSByb3cuIEFsc28gc2V0IHRoZSBkaXNjb250IGZsYWcgb24gYnVmZmVycyBhZnRlciBhCisJICBkaXNjb250aW51aXR5LgorCisyMDEwLTEwLTEzIDIzOjQ2OjAyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmg6CisJICBtYXRyb3NrYW11eDogc2V0IGNvcnJlY3QgYnVmZmVyIG9mZnNldHMgYWZ0ZXIgc2Vla3MKKwkgIFJlLXVzZSB0aGUgZXhpc3RpbmcgJ3BvcycgZmllbGQgbWFpbnRhaW5lZCBieSBlYm1sIHdyaXRlciB0byBzZXQKKwkgIGJ1ZmZlciBvZmZzZXRzLiBUaGlzIGFsc28gbWFrZXMgc3VyZSB0aGF0IHdlIHNldCB0aGUgcmlnaHQgb2Zmc2V0cworCSAgb24gYnVmZmVycyBhZnRlciBhIHNlZWsgKGUuZy4gd2hlbiB3cml0aW5nIGFuIGluZGV4IGF0IHRoZSBlbmQpLgorCisyMDEwLTEwLTE0IDAwOjIyOjAzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGRvbid0IGZvcndhcmQgdGFnIGV2ZW50cyBkb3duc3RyZWFtCisJICBEb24ndCBmb3J3YXJkIHN0cmVhbS1zcGVjaWZpYyB0YWcgZXZlbnRzIGRvd25zdHJlYW0gKGVzcC4gbm90CisJICBiZWZvcmUgYW55IG5ld3NlZ21lbnQgZXZlbnQpLngKKworMjAxMC0xMC0xMyAxNzoxNToyNSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZm91cmNjLmg6CisJICBxdGRlbXV4OiBoYW5kbGUgYW5vdGhlciBtcDR2IHZhcmlhdGlvbgorCSAgLi4uIGluY2x1ZGluZyB0aGUgZ2xibCBhdG9tIGNvbnRhaW5pbmcgY29kZWMtZGF0YS4KKworMjAxMC0xMC0xMyAxNzoyMToyMyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSogZ3N0L2RlYnVndXRpbHMvYnJlYWtteWRhdGEuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2VmZW5jZS5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2c2Vlay5jOgorCSogZ3N0L2RlYnVndXRpbHMvbmVnb3RpYXRpb24uYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Byb2dyZXNzcmVwb3J0LmM6CisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzoKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21lZGlhbi9nc3RtZWRpYW4uYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW90ZW1wbGF0ZS5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJICB2YXJpb3VzIChnc3QpOiBhZGQgYSBtaXNzaW5nIEdfUEFSQU1fU1RBVElDX1NUUklOR1MgZmxhZ3MKKworMjAxMC0xMC0xMyAxNzoxMzowNCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBzeXMvb3NzL2dzdG9zc21peGVyZWxlbWVudC5jOgorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6CisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOgorCSogc3lzL29zczQvb3NzNC1taXhlci5jOgorCSogc3lzL29zczQvb3NzNC1zaW5rLmM6CisJKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc3JjLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgdmFyaW91cyAoc3lzKTogYWRkIGEgbWlzc2luZyBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIGZsYWdzCisKKzIwMTAtMTAtMTMgMTY6MjU6MTUgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbHRhZy5jOgorCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkqIGV4dC9lc2QvZXNkbW9uLmM6CisJKiBleHQvZXNkL2VzZHNpbmsuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5jOgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzoKKwkqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zaW5rLmM6CisJKiBleHQvaGFsL2dzdGhhbGF1ZGlvc3JjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvanBlZy9nc3RzbW9rZWVuYy5jOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJICB2YXJpb3VzIChleHQpOiBhZGQgYSBtaXNzaW5nIEdfUEFSQU1fU1RBVElDX1NUUklOR1MgZmxhZ3MKKworMjAxMC0xMC0xMyAxNjozNDowOSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJKiBleHQvZXNkL2VzZG1vbi5jOgorCSogZ3N0L21lZGlhbi9nc3RtZWRpYW4uYzoKKwkgIHZhcmlvdXM6IHdyYXAgcHJvcGVydHkgcmVnaXN0cmF0aW9uIGFuZCBhZGQgYSBzaW5nbGUgZml4bWUgZm9yIGxvbmcgZGVzYy4KKworMjAxMC0xMC0xMyAxMTo0Njo1OCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIGgyNjRkZXBheTogYWx3YXlzIG1hcmsgdGhlIGNvZGVjX2RhdGEgYXMga2V5ZnJhbWUKKwkgIFdlIG5lZWQgdG8gbWFyayB0aGUgY29kZWNfZGF0YSBhcyBhIGtleWZyYW1lIG9yIGVsc2UgZG93bnN0cmVhbSBkZWNvZGVycyBtaWdodAorCSAgZGVjaWRlIHRvIHNraXAgaXQsIHdhaXRpbmcgZm9yIGEga2V5ZnJhbWUuCisJICBGaXhlcyAjNjMxOTk2CisKKzIwMTAtMTAtMTMgMDc6MTY6NDcgKzAxMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJICBtYXRyb3NrYW11eDogbWFrZSBidWZmZXIgb2Zmc2V0cyBhIGJ5dGUgY291bnQgcmF0aGVyIHRoYW4gYSBidWZmZXIgY291bnQKKworMjAxMC0xMC0wNyAyMToxMjo0OCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzoKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSogZXh0L2VzZC9lc2Rtb24uYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6CisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2VmZW5jZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBleHQsIGdzdDogY2Fub25pY2FsaXNlIHByb3BlcnR5IG5hbWVzIHdoZXJlIHRoaXMgd2Fzbid0IHRoZSBjYXNlCisJICBpZS4gImZvb19iYXIiIC0+ICJmb28tYmFyIgorCisyMDEwLTEwLTEyIDE1OjAyOjQyICswMjAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSAgcnRwbXB2cGF5OiBmaXggdGltZXN0YW1waW5nIG9mIHJ0cCBidWZmZXJzCisJICBJbmNvbW1pbmcgYnVmZmVyIGlzIG9ubHkgcHVzaGVkIG9uIHRoZSBhZGFwdGVyIGF0IHRoZSBlbmQgb2YgdGhlCisJICBoYW5kbGVfYnVmZmVyIGZ1bmN0aW9uLiBCdXQgZHVyYXRpb24vdGltZXN0YW1wIG9mIHRoaXMgYnVmZmVyIGlzIGFscmVhZHkKKwkgIHRha2VuIGludG8gYWNjb3VudCBmb3IgdGhlIGN1cnJlbnQgZGF0YSBpbiB0aGUgYWRhcHRlci4gVGhpcyBsZWFkcyB0bworCSAgd3JvbmcgcnRwIHRpbWVzdGFtcHMgYW5kIGV4dHJhIGxhdGVuY3kuCisKKzIwMTAtMTAtMTIgMTE6Mzc6NDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tb3Nzc3JjLmM6CisJICBleGFtcGxlczogRml4IGJ1aWxkIHdpdGggR1RLKyAzLjAKKworMjAxMC0xMC0xMSAxNToxMjowMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogbWFyayBhcyBhIHNvdXJjZQorCSAgTWFyayB0aGUgcnRzcHNyYyBlbGVtZW50IGFzIGEgc291cmNlLgorCSAgUmVxdWlyZXMgMC4xMC4zMS4xIG5vdworCisyMDEwLTEwLTExIDE0OjI0OjEzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkgIGF1dG9kZXRlY3Q6IFNldCBHU1RfRUxFTUVOVF9JU19TT1VSQ0UgZmxhZyBvbiBzb3VyY2VzCisKKzIwMTAtMTAtMTEgMTQ6MjE6MDcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2NvbmYvZ3N0c3dpdGNoc3JjLmM6CisJICBzd2l0Y2hzcmM6IFNldCB0aGUgR1NUX0VMRU1FTlRfSVNfU09VUkNFIGZsYWcKKworMjAxMC0xMC0xMSAxNDoxNzozMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogUmVxdWlyZSBjb3JlIDAuMTAuMzAuMQorCisyMDEwLTEwLTEwIDE0OjQzOjU4ICswMTAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuaDoKKwkgIG1hdHJvc2thbXV4OiBzZXQgb2Zmc2V0cyBvbiBvdXRnb2luZyBidWZmZXJzCisKKzIwMTAtMTAtMDkgMTQ6MTQ6MjcgKzAyMDAgIElPaGFubmVzIG0gem3DtmxuaWcgPHptb2VsbmlnQGllbS5hdD4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiBPbmx5IGdldC9zZXQgb3ZlcmxheSBwYXJhbXMgaWYgbmVlZGVkCisJICBpdCdzIHBlcmZlY3RseSBvayBmb3IgYSB2aWRlbyBvdXRwdXQgZGV2aWNlIHRvIG5vdCBoYXZlIG92ZXJsYXkgY2FwYWJpbGl0aWVzLgorCSAgdGhpcyBwYXRjaCByZW1vdmVzIHRoZSBuZWVkIHRvIGdldC9zZXQgdGhlIG92ZXJsYXkgcGFyYW1ldGVycyBpZiB0aGUgdXNlcgorCSAgZG9lcyBub3QgZXhwbGljaXRlbHkgcmVxdWVzdCBvbmUgb2YgdGhlIG92ZXJsYXkgcHJvcGVydGllcworCisyMDEwLTA5LTMwIDE1OjI4OjIzICswMjAwICBJT2hhbm5lcyBtIHptw7ZsbmlnIDx6bW9lbG5pZ0BpZW0uYXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJICB2NGwyc2luazogUHJvdGVjdCBhZ2FpbnN0IE5VTEwtcG9pbnRlciBhY2Nlc3MKKwkgIGdzdF92NGwyc2lua19jaGFuZ2Vfc3RhdGUoKSB3b3VsZCBmcmVlIHRoZSBwb29sIHdpdGhvdXQgY2hlY2tpbmcgd2hldGhlciB0aGVyZQorCSAgd2FzIGEgdmFsaWQgcG9vbC4uLgorCisyMDEwLTEwLTA4IDEyOjQzOjUxIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGM0YThhZGMgdG8gNWE2NjhiZgorCisyMDEwLTEwLTA4IDEyOjUzOjMzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDVlM2M5YmYgdG8gYzRhOGFkYworCisyMDEwLTEwLTA2IDExOjI5OjU1ICswMjAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEZpeCByZXF1aXJlZCBmaWVsZHMgbG9naWMKKwkgIEJvdGggaGlzdG9yeV9jb3VudCBhbmQgZmllbGRzX3JlcXVpcmVkIGNvdW50IGZyb20gMS4gQXMgcGVyIHRoZSB3aGlsZSBsb29wCisJICBjb25kaXRpb24gdGhhdCBmb2xsb3dzIHRoaXMgY29kZSwgdG8gcGVyZm9ybSB0aGUgZGVpbnRlcmxhY2luZyBtZXRob2QsIHdlIG5lZWQKKwkgIGhpc3RvcnlfY291bnQgPj0gZmllbGRzX3JlcXVpcmVkIGZpZWxkcyBpbiB0aGUgaGlzdG9yeS4gVGhlcmVmb3JlIGlmIHdlIGhhdmUKKwkgIGhpc3RvcnlfY291bnQgPCBmaWVsZHNfcmVxdWlyZWQgKG5vdCBmaWVsZHNfcmVxdWlyZWQgKyAxKSwgd2UgbmVlZCBtb3JlIGZpZWxkcy4KKworMjAxMC0wOS0yMCAxOTo0Mzo0NSArMDIwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDxhbW9yYWxlc0BmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguaDoKKwkgIGZsdm11eDogcmVzZW5kIG9uTWV0YWRhIHRhZyB3aGVuIHRhZ3MgY2hhbmdlcyBpbiBzdHJlYW1hYmxlIG1vZGUKKworMjAxMC0xMC0wNSAxOTo0MDo1MCArMDEwMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEFBQyBjb2RlY19kYXRhIGNhbiBiZSA+IDIgYnl0ZXMgbG9uZworCSAgVGhpcyBmaXhlcyB0aGUgYXNzdW1wdGlvbiB0aGF0IERlY29kZXJTcGVjaWZpY0luZm8gbXVzdCBiZSAyIGJ5dGVzIGxvbmcKKwkgIGZvciBBQUMgZmlsZXMuIFRoZSBzcGVjaWZpY2F0aW9uIGFsbG93cyBIRS1BQUMgdG8gYmUgZXhwbGljaXRseQorCSAgc2lnbmFsbGVkIGluIGEgYmFja3dhcmQgY29tcGF0aWJsZSB3YXkuIFRoaXMgaXMgZG9uZSBieSBtZWFucyBvZiBhbgorCSAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhZnRlciB0aGUgcmVndWxhciBBQUMgaGVhZGVyLiBJdCBpcyBleHBlY3RlZCB0aGF0CisJICBkZWNvZGVycyB0aGF0IGNhbiBwbGF5IEFBQyBidXQgbm90IEhFLUFBQyB3aWxsIHBhcnNlIHRoZSBoZWFkZXIgbm9ybWFsbHkKKwkgIGFuZCBpZ25vcmUgZXh0ZW5kZWQgYml0cywgbXVjaCBhcyB0aGV5IGRvIGZvciB0aGUgSEUtQUFDIHNwZWNpZmljIHBheWxvYWQKKwkgIGluIHRoZSBhY3R1YWwgc3RyZWFtLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxMjMxMworCisyMDEwLTEwLTA1IDE2OjAxOjE5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBvbmx5IHVucmVmIGJ1ZmZlciB3aGVuIG5vIGxvbmdlciBuZWVkZWQgZm9yIGNsdXN0ZXIgc2Nhbm5pbmcKKwkgIEZpeGVzICM2MjkwNDcuCisKKzIwMTAtMTAtMDUgMTY6MDA6NDUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGF2b2lkIGluZmluaXRlIGNsdXN0ZXIgc2Nhbm5pbmcKKworMjAxMC0xMC0wNSAxMjoyMDo1MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSAgZ29vbTogdGFrZSBkdXJhdGlvbiBpbnRvIGFjY291bnQgd2hlbiBkb2luZyBRb1MKKwkgIFRha2UgdGhlIGR1cmF0aW9uIG9mIHRoZSBmcmFtZXMgaW50byBhY2NvdW50IHNvIHRoYXQgd2UgZG9uJ3QgZHJvcCBmcmFtZXMgdGhhdAorCSAgYXJlIG9ubHkgcGFydGlhbGx5IHBhc3QgdGhlIFFvUyBkZWFkbGluZS4KKworMjAxMC0xMC0wNSAxMDo0MDoxNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5oOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5oOgorCSAgZ29vbTogdXNlIGFkYXB0ZXIgZm9yIHRpbWVzdGFtcGluZworCSAgVXNlIHRoZSBhZGFwdGVyIHRpbWVzdGFtcCBjb2RlIHRvIGdldCBtb3JlIGFjY3VyYXRlIHRpbWVzdGFtcHMuCisJICBGaXggbGF0ZW5jeSBjYWxjdWxhdGlvbiwgd2UgYWRkIG91ciBvd24gbGF0ZW5jeSBpbiB0aGUgd29yc3QgY2FzZS4KKworMjAxMC0xMC0wNCAyMjozMTozMiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L3JhdzEzOTQvTWFrZWZpbGUuYW06CisJKiBleHQvcmF3MTM5NC9nc3QxMzk0LmM6CisJICByYXcxMzk0OiBEb24ndCBjb21waWxlIGhkdjEzOTRzcmMgaWYgbGliaWVjNjE4ODMgaXNuJ3QgYXZhaWxhYmxlCisJICBGaXhlcyAjNjI5ODk2CisKKzIwMTAtMDktMjAgMTk6NDQ6MDkgKzAyMDAgIEFuZG9uaSBNb3JhbGVzIEFsYXN0cnVleSA8YW1vcmFsZXNAZmx1bW90aW9uLmNvbT4KKworCSogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJICBpY3lkZW11eDogZm9yd2FyZCB0YWcgZXZlbnRzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjMwMjA1CisKKzIwMTAtMTAtMDQgMTk6MDA6NDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uYzoKKwkgIGdvb20yazE6IHJlcG9ydCBvdXIgbGF0ZW5jeSBjb3JyZWN0bHkKKwkgIEZpeGVzICM2MzEzMDMKKworMjAxMC0xMC0wNCAxODo1NjoxNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSAgZ29vbTJrMTogYWRkIGRlZmluZXMgZm9yIGRlZmF1bHQgd2lkdGgvaGVpZ2h0L2ZwcworCSAgQWRkIHNvbWUgZGVmaW5lcyBmb3IgdGhlIGRlZmF1bHQgd2lkdGgvaGVpZ2h0L2ZwcyBpbnN0ZWFkIG9mIHVzaW5nIGRpZmZlcmVudAorCSAgdmFsdWVzIGluIGRpZmZlcmVudCBwbGFjZXMuCisKKzIwMTAtMTAtMDQgMTg6NTI6MTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkgIGdvb206IGFkZCBsYXRlbmN5IGNvbXBlbnNhdGlvbiBjb2RlLgorCSAgSW1wbGVtZW50IGEgbGF0ZW5jeSBxdWVyeSBhbmQgcmVwb3J0IGhvdyBtdWNoIGxhdGVuY3kgd2Ugd2lsbCBhZGQgdG8gdGhlCisJICBzdHJlYW0uCisJICBBbHNlIG1ha2Ugc29tZSBkZWZhdWx0cyBmb3IgdGhlIGRlZmF1bHQgd2lkdGgvaGVpZ2h0L2ZyYW1lcmF0ZQorCSAgRml4ZXMgIzYzMTMwMworCisyMDEwLTEwLTA0IDE3OjU2OjU3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWFsc2FzcmMtUENNQS5weToKKwkgIHRlc3Q6IGFkZCBweXRob24gdmVyc2lvbiBvZiB0aGUgYXVkaW8gc2VuZGVyCisJICBBZGQgYSBweXRob24gdmVyc2lvbiBvZiB0aGUgYXVkaW8gc2VuZGVyIHBpcGVsaW5lLgorCSAgUG9ydGVkIGJ5IFNwNHJjIG9uIElSQy4KKworMjAxMC0xMC0wNCAxNzo1MjoyMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLnB5OgorCSAgdGVzdHM6IEFkZCBweXRob24gUlRQIGNsaWVudCBleGFtcGxlCisJICBBZGQgYSBweXRob24gdmVyc2lvbiBvZiB0aGUgUENNQSBjbGllbnQgYXBwLgorCSAgUG9ydGVkIGJ5IFNwNHJjIG9uIElSQy4KKworMjAxMC0xMC0wNCAwOTozOTo1OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSAgcnRwOiBGaXggdW5pdGlhbGl6ZWQgY29tcGlsZXIgd2FybmluZ3Mgb24gT1MgWCBidWlsZCBib3QKKwkgIFRoZXNlIHdhcm5pbmdzIGFyZSB3cm9uZyB0aG91Z2gsIHRoZSB2YXJpYWJsZXMgYXJlIG9ubHkgdXNlZCBpbgorCSAgdGhlIGNhc2VzIHdoZXJlIHRoZXkgKmFyZSogaW5pdGlhbGl6ZWQgYnkgdGhlIGJpdCByZWFkZXIuCisKKzIwMTAtMTAtMDMgMjM6NDk6MDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJwYXkuYzoKKwkgIHJ0cGc3MjJwYXk6IEZpeCB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGNvbXBpbGVyIHdhcm5pbmcKKwkgIFRoZSBjbG9jayByYXRlIGlzIGFsd2F5cyA4MDAwIEh6IGFjY29yZGluZyB0byB0aGUgUkZDIGFuZAorCSAgdGhlIHNhbXBsaW5nIHJhdGUgbXVzdCBhbHdheXMgYmUgMTYwMDAgSHouCisKKzIwMTAtMTAtMDEgMTM6NTk6MTAgKzA0MDAgIFZsYWRpbWlyIEVyZW1lZXYgPGVyZW1lZXZAYXRsYW50aXMucnU+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBpbXByb3ZlIGFydGljbGUgcmVmZXJlbmNlIGluIGNvbW1lbnQgYmxvY2sKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MzEwODIKKworMjAxMC0wNC0zMCAyMTowMDozMSArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F1aWNrdGltZS5jOgorCSAgcXRkZW11eDogVXNlIHBidXRpbHMgZm9yIEguMjY0IHByb2ZpbGUvbGV2ZWwgZXh0cmFjdGlvbgorCSAgVGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGV4dHJhY3QgdGhpcyBkYXRhIGhhdmUgYmVlbiBtb3ZlZCB0byBnc3RwYnV0aWxzIHRvCisJICBmYWNpbGl0YXRlIHJldXNlLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxNzMxOAorCisyMDEwLTA0LTMwIDIxOjAwOjMxICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EuYzoKKwkgIG1hdHJvc2thZGVtdXg6IFVzZSBwYnV0aWxzIGZvciBILjI2NCBwcm9maWxlL2xldmVsIGV4dHJhY3Rpb24KKwkgIFRoZSBmdW5jdGlvbnMgdXNlZCB0byBleHRyYWN0IHRoaXMgZGF0YSBoYXZlIGJlZW4gbW92ZWQgdG8gZ3N0cGJ1dGlscyB0bworCSAgZmFjaWxpdGF0ZSByZXVzZS4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MTczMTgKKworMjAxMC0wNC0yMiAxOTozOTo0NyArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEV4cG9ydCBNUEVHLTQgdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwgaW4gc3RyZWFtIGNhcHMKKwkgIFRoaXMgdXNlcyBnc3RwYnV0aWxzIHRvIGV4dHJhY3QgdGhlIHByb2ZpbGUgYW5kIGxldmVsIGZyb20gdGhlIHZpZGVvCisJICBvYmplY3Qgc2VxdWVuY2UgYW5kIGFkZHMgdGhpcyB0byBzdHJlYW0gY2Fwcy4gVGhpcyBjYW4gYmUgdXNlZCBhcworCSAgbWV0YWRhdGEgYW5kIGZvciBmaW5lLWdyYWluZWQgZGVjb2RlciBzZWxlY3Rpb24uCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjE2NTIxCisKKzIwMTAtMDktMzAgMTI6NDQ6NTIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggYWFjIGNoYW5uZWwgb3ZlcnJpZGUgYmFzZWQgb24gY29kZWMgZGF0YSBmb3IgNy4xIGNhc2UKKworMjAxMC0wNC0zMCAxNDowNjoyNyArMDUzMCAgQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRXhwb3J0IEFBQyBwcm9maWxlIGFuZCBsZXZlbCBpbiBjYXBzCisJICBUaGlzIGV4cG9ydHMgdGhlIEFBQyBwcm9maWxlIGFuZCBsZXZlbCBpbiBjYXBzIGZvciB1c2UgYXMgbWV0YWRhdGEgYW5kCisJICAoZXZlbnR1YWxseSkgZm9yIG1vcmUgZmluZS1ncmFpbmVkIHNlbGVjdGlvbiBvZiBkZWNvZGVycyBhdAorCSAgY2Fwcy1uZWdvdGlhdGlvbiB0aW1lLiAoRG9lc24ndCB3b3JrIGZvciBIRS1BQUMgeWV0IHRob3VnaC4pCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjEyMzEzCisKKzIwMTAtMDktMzAgMTg6MzQ6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyMnBheS5oOgorCSAgcnRwOiBhZGQgRzcyMiBwYXkgYW5kIGRlcGF5bG9hZGVyCisKKzIwMTAtMDktMzAgMTI6MDg6NDkgKzAyMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiB1cGRhdGUgbGluayB0byBkb2N1bWVudGF0aW9uCisKKzIwMTAtMDktMzAgMTE6MzQ6NTYgKzAyMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC5zaDoKKwkgIGV4YW1wbGVzOiBmaXggaW5kZW50YXRpb24gb24gcnRwIGNsaWVudCBleGFtcGxlCisKKzIwMTAtMDktMzAgMTE6MzM6MjQgKzAyMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC1QQ01BLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LnNoOgorCSAgZXhhbXBsZXM6IGZpeCB0eXBvIGluIHBvcnQgb2YgcnRwIGV4YW1wbGVzCisKKzIwMTAtMDktMjkgMTM6MjA6MjIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSAgd2F2ZW5jOiBtaW5pc2N1bGUgY29kZSBjbGVhbi11cAorCSAgR1NUX0NMT0NLX1RJTUVfTk9ORSBpcyBub3Qgc29tZXRoaW5nIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gY29ubmVjdGlvbiB3aXRoCisJICBHU1RfRk9STUFUX0JZVEVTLgorCisyMDEwLTA5LTI5IDEwOjM0OjM2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHJldmVyc2UgcGxheWJhY2s7IHByZXZlbnQgb3ZlcmxhcCBvZiBzdWJzZXF1ZW50IGZyYWdtZW50cworCisyMDEwLTA5LTI4IDE2OjIxOjQ4ICswMzAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAbm9raWEuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggbWlzc2luZyBudWxsLXRlcm1pbmF0b3IgaW4gcHJvdG9jb2xzIGFycmF5CisJICBGaXhlcyByYW5kb20gY3Jhc2ggcmVncmVzc2lvbiBmcm9tIGNvbW1pdCBhZTg0YWUuCisKKzIwMTAtMDktMjQgMTY6MjY6MjAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRvbid0IGFkZCAvVURQIGluIHRoZSB0cmFuc3BvcnQsIGl0J3MgdGhlIGRlZmF1bHQKKwkgIGRvbid0IGFkZCB0aGUgZGVmYXVsdCBVRFAgbG93ZXItdHJhbnNwb3J0LCBzb21lIHNlcnZlcnMgZG9uJ3Qgc2VlbSB0byBsaWtlIGl0LgorCSAgRml4ZXMgIzYzMDUwMAorCisyMDEwLTA2LTI1IDE3OjA4OjAzICswMjAwICBQYXNjYWwgQnVobGVyIDxwYXNjYWwuYnVobGVyQHRhbmRiZXJnLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBtYW5hZ2VyOiBwYWNrZXQgbG9zdCBzaG91bGQgbm90IGJlIGEgd2FybmluZy4gSXQgaGFwcGVucyBhbGwgdGhlIHRpbWUuLi4KKworMjAxMC0wOS0yNCAxNTozMzo0MCArMDIwMCAgUGFzY2FsIEJ1aGxlciA8cGFzY2FsLmJ1aGxlckB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBydHBiaW46IE1ha2UgY2xlYW5pbmcgdXAgc291cmNlcyBpbiBydHBfc2Vzc2lvbl9vbl90aW1lb3V0IE1UIHNhZmUKKwkgIFVzaW5nIF9mb3JlYWNoX3JlbW92ZSBvbiB0aGUgaGFzaHRhYmxlLCB3aGlsZSByZWxlYXNpbmcgdGhlIGxvY2sgcHJvdGVjdGluZworCSAgdGhhdCB0YWJsZSBpbnNpZGUgdGhlIGNhbGxiYWNrIGlzIG5vdCBhIGdvb2QgaWRlYS4gVGhlIGhhc2h0YWJsZSBtaWdodAorCSAgdGhlbiBjaGFuZ2UgKGEgc291cmNlIHJlbW92ZWQgb3IgYWRkZWQpIHdoaWxlIHNpZ25hbHMgbGlrZSBvbl90aW1lb3V0CisJICBhcmUgYmVpbmcgc2VudC4KKwkgIFRoaXMgc29sdXRpb24gbWFrZXMgYSBjb3B5IG9mIHRoZSB0YWJsZSwgcGVyZm9ybXMgdGhlIF9mb3JlYWNoIHdpdGhvdXQKKwkgIGFjdHVhbGx5IHJlbW92aW5nIGFueSBzb3VyY2VzLCBidXQgbWFya3MgdGhlbSBmb3IgcmVtb3ZhbCBvbiBhIHNlY29uZAorCSAgaXRlcmF0aW9uIHdpdGggdGhlIHJlYWwgbGlzdCwgYnV0IHRoaXMgdGltZSBub3QgbGV0dGluZyBnbyBvZiB0aGUgbG9jay4KKwkgIEZpeGVzICM2MzA0NTIKKworMjAxMC0wOS0yNCAxNToxOToxNSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzoKKwkgIGlkM2RlbXV4OiBTYW5pdGl6ZSBpZDMgZnJhbWUgbmFtZXMKKwkgIFRoaXMgaXMgc2ltaWxhciB0byB3aGF0IGlzIGRvbmUgaW4gcXRkZW11eC4gQXZvaWRzIHByb3ZpZGluZyBpbnZhbGlkCisJICBzdHJ1Y3R1cmUvdGFncyBuYW1lcworCisyMDEwLTA5LTI0IDE0OjU5OjQ1ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6CisJICBhcGVkZW11eDogU2tpcCBlbXB0eSB0YWdzCisJICBBdm9pZCBjcmVhdGluZyBib2d1cyBzdHJpbmcgdGFncy4gQWxzbyBhZGRlZCBsb2dnaW5nIG9mIHRoZSBzdHJpbmcKKwkgIHZhbHVlcyBvZiB0aGUgdGFnIG5hbWUgYW5kIHZhbHVlLgorCisyMDEwLTA5LTI0IDA4OjU2OjM2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXA6IGluaXQgZGVidWcgY2F0ZWdvcnkgYmVmb3JlIHVzaW5nIGl0CisKKzIwMTAtMDQtMTIgMDk6NDk6MTQgKzAyMDAgIFBhc2NhbCBCdWhsZXIgPHBhc2NhbC5idWhsZXJAdGFuZGJlcmcuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogSGFuZGxlIHJ5c25jIG9mIGl0ZXJhdG9yIHdoZW4gbG9va2luZyBmb3IgZnJlZSBwYWQgbmFtZQorCSAgSWYgYSBuZXcgcGFkIHdhcyBhZGRlZCB3aGlsZSBpdGVyYXRpbmcgdGhlbiBhIHBhZCBjb3VsZCBiZQorCSAgcmV0dXJuZWQgdGhhdCB3YXMgYWxyZWFkeSBpbiB1c2UuCisJICBGaXhlcyAjNjMwNDUxCisKKzIwMTAtMDktMjQgMTQ6MDk6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGZpeCBjb21waWxhdGlvbgorCisyMDEwLTA0LTA3IDE1OjMxOjUyICswMjAwICBUcm9uZCBBbmRlcnNlbiA8dHJvbmQuYW5kZXJzZW5AdGFuZGJlcmcuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogVW5sb2NrIGJlZm9yZSBhZGRpbmcgcGFkIGluIG5ld19wYXlsb2FkX2ZvdW5kCisJICBIb2xkaW5nIGludGVybmFsIGxvY2tzIHdoaWxlIHBvdGVudGlhbGx5IGNhbGxpbmcgb3V0IGlzIGEgc291cmNlCisJICBvZiBkZWFkbG9ja3MsIGFuZCBpbiB0aGlzIGNhc2UgdGhlIGFwcGxpY2F0aW9uIG1pZ2h0IHN1YnNjcmliZSB0byB0aGUKKwkgIHBhZC1hZGRlZCBzaWduYWwuCisJICBGaXhlcyAjNjMwNDQ5CisKKzIwMDktMDgtMzEgMTg6Mzc6NDAgKzAyMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQHRhbmRiZXJnLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogcmVsYXggdGhpcmQtcGFydHkgY29sbGlzaW9uIGRldGVjdGlvbgorCSAgSWYgdGhlIHNvdXJjZSBoYXMgYmVlbiBpbmFjdGl2ZSBmb3Igc29tZSB0aW1lLCB3ZSBhc3N1bWUgdGhhdCBpdCBoYXMKKwkgIHNpbXBseSBjaGFuZ2VkIGl0cyB0cmFuc3BvcnQgc291cmNlIGFkZHJlc3MuIEhlbmNlLCB0aGVyZSBpcyBubyB0cnVlCisJICB0aGlyZC1wYXJ0eSBjb2xsaXNpb24gLSBvbmx5IGEgc2ltdWxhdGVkIG9uZS4KKwkgIEZpeGVzICM2MzA0NDcKKworMjAxMC0wOS0yNCAxMzo1MDowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IHdoaXRlc3BhY2UgZml4ZXMKKworMjAxMC0wOS0yNCAxMzo0ODo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJICBydHBzb3VyY2U6IHNpbXBsaWZ5IHRoZSByYXRlIGVzdGltYXRpb24gc29tZSBtb3JlCisKKzIwMDktMDgtMzEgMTg6MzQ6MDggKzAyMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQHRhbmRiZXJnLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIHJ0cG1hbmFnZXI6IHByb3ZpZGUgYWRkaXRpb25hbCBzdGF0aXN0aWNzCisKKzIwMTAtMDktMjQgMDA6MDE6MDUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IHNldCBwbHVnaW4gcmVsZWFzZSBkYXRldGltZQorCisyMDEwLTA5LTIzIDIxOjIxOjI5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmg6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5oOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuaDoKKwkgIGVxdWFsaXplcjogZml4IGNsYXNzIGRlZmluaXRpb25zCisJICBDbGFzcyBzdHJ1Y3R1cmVzIG11c3QgYmUgYmFzZWQgb24gdGhlIHBhcmVudCBjbGFzcyBzdHJ1Y3QsIG5vdCBvbgorCSAgdGhlIHBhcmVudCBpbnN0YW5jZSBzdHJ1Y3QuCisKKzIwMTAtMDktMTUgMjA6MzY6MzMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjI6IHByZS1yZWdpc3RlciBwYWQgY2xhc3MgcHJvcGVybHkgd2l0aCBnX3R5cGVfY2xhc3NfcmVmCisJICBGaXggY29kZSB0byBtYXRjaCB0aGUgY29tbWVudC4gQWxzbywgdGhlcmUncyBubyBuZWVkIHRvIHJlZ2lzdGVyIHRoZQorCSAgYmFja2dyb3VuZCBlbnVtIHR5cGUgYWdhaW4sIHRoaXMgaXMgYWxyZWFkeSBkb25lIHZpYSBpbnN0YWxsX3Byb3BlcnR5LgorCisyMDEwLTA5LTIzIDIxOjU3OjE4ICswMjAwICBEYXZpZCBIb3l0IDxkaG95dEBsbG5sLmdvdj4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkgIHNwZWV4OiBGaXggY3Jhc2hlcyB3aXRoIE1TVkMKKwkgIFVzaW5nIHRoZSBzeW1ib2xzIGZvciB0aGUgZGlmZmVyZW50IFNwZWV4IG1vZGVzIHJlc3VsdHMKKwkgIGluIGNyYXNoZXMgd2hlbiB1c2luZyBNU1ZDLiBVc2UgdGhlIGxpYnJhcnkgZnVuY3Rpb25zIHRvCisJICBnZXQgdGhlIG1vZGVzIGluc3RlYWQuCisJICBGaXhlcyBidWcgIzYzMDM3OC4KKworMjAxMC0wOC0yNCAxMzoyNTowMiArMDIwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAdGFuZGJlcmcuY29tPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGxldmVsOiBhdm9pZCBkaXZpc2lvbiBieSB6ZXJvIG9uIHNpbGVuY2UKKwkgIEZpeGVzIGJ1ZyAjNjMwNDU4LgorCisyMDEwLTA5LTIzIDE2OjQ2OjMxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogcGFyc2UgYW5kIHVzZSBjdHMKKwkgIEZvciBIMjY0LCB0aGVyZSBpcyBhbiBleHRyYSBoZWFkZXIgY29udGFpbmluZyB0aGUgQ1RTLCB3aGljaCBpcyBhIHRpbWVzdGFtcAorCSAgb2Zmc2V0IHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIFBUUy4gUGFyc2UgdGhpcyB2YWx1ZSBhbmQgdXNlIGl0IHRvIGFkanVzdAorCSAgdGhlIHB0cy4KKwkgIEZpeGVzICM2MzAwODgKKworMjAxMC0wOS0yMyAxNjo0NTo0MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IGltcHJvdmUgcHRzIGRlYnVnZ2luZworCisyMDEwLTA5LTIyIDE5OjAxOjQwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB0ZXN0cy9leGFtcGxlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3B1bHNlLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9leGFtcGxlcy9wdWxzZS9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3B1bHNlL3B1bHNlLmM6CisJICBwdWxzZTogYWRkIHRlc3QgYXBwIGZvciBwdWxzZSBkZXZpY2UgcHJvYmUKKworMjAxMC0wOS0yMiAxODo1MDo0NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZTogZml4IGRldmljZV9kZXNjcmlwdGlvbiBpbiBSRUFEWQorCSAgTWFrZSB0aGUgaXNfZGVhZCBjaGVjayBtb3JlIGNsZWFyIGFuZCBhZGQgYW4gb3B0aW9uIHRvIGNoZWNrIGZvciB0aGUgc3RhdHVzIG9mCisJICB0aGUgc3RyZWFtIGluIGFkZGl0aW9uIHRvIHRoZSBjb250ZXh0LgorCSAgV2UgZG9uJ3QgbmVlZCBhIHN0cmVhbSB0byBnZXQgdGhlIGRldmljZV9kZXNjcmlwdGlvbiBzdHJpbmcuCisJICBGaXhlcyAjNjMwMzE3CisKKzIwMTAtMDktMjIgMTI6NTY6MDAgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERvbid0IHBvc3QgdGFncyBpZiB0aGVyZSBhcmUgbm9uZQorCSAgQW5kIG1ha2UgYWxsIGNvZGUgZ28gdGhyb3VnaCBfcG9zdF9nbG9iYWxfdGFncy4KKworMjAxMC0wOS0yMiAxMjozNzozMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5Lmg6CisJICBydHBoMjY0ZGVwYXk6IHJlZmFjdG9yIGFuZCBzaW1wbGlmeSBBVSBtZXJnaW5nCisJICBNb3ZlIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBOQUxVIHRvIGEgc2VwYXJhdGUgbWV0aG9kLgorCSAgU2ltcGxpZnkgdGhlIG1lcmdpbmcgb2YgTkFMVSBpbnRvIEFVIGFuZCB1c2UgY29tbW9uIGNvZGUgd2hlbiBwb3NzaWJsZS4KKworMjAxMC0wOS0yMSAyMzoyMzowNyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkgIHNoYXBld2lwZTogYWRkIG9wdGlvbmFsIGJvcmRlciBwYXJhbWV0ZXIgYW5kIHNsb3dkb3duIGFuaW1hdGlvbgorCSAgQWxsb3cgdG8gcGxheSB3aXRoIHRoZSBib3JkZXIgcHJvcGVydHkgKHNoYXJwL3NvZnQgZWRnZXMpLgorCisyMDEwLTA5LTIxIDE5OjE0OjQwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkgIHNoYXBld2lwZTogRm9yY2UgZm9ybWF0IHRvIEFZVVYgaW4gdGhlIGV4YW1wbGUgcGlwZWxpbmUgZm9yIHRoZSBzYW1lIHJlYXNvbgorCisyMDEwLTA5LTIxIDE5OjEzOjA3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL3NoYXBld2lwZS1leGFtcGxlLmM6CisJICBzaGFwZXdpcGU6IEZvcmNlIHRoZSBpbnB1dCB0byBBWVVWIHRvIHByZXZlbnQgbmVnb3RpYXRpb24gZmFpbHVyZXMgaW4gdmlkZW9taXhlcgorCSAgVGhlIHNlY29uZCB2aWRlb3Rlc3RzcmMgY2hhaW4gbWlnaHQgcHJvZHVjZSBZVVkyIGJlY2F1c2UgZXZlcnl0aGluZyBpcworCSAgYWNjZXB0ZWQgZG93bnN0cmVhbSBiZWZvcmUgdGhlIGZpcnN0IHNoYXBld2lwZSBjaGFpbiBnZXRzIG5lZ290aWF0ZWQuCisKKzIwMTAtMDktMjEgMTk6MTI6NDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSAgc2hhcGV3aXBlOiBJbXByb3ZlIGRlYnVnZ2luZyBhbmQgaW1tZWRpYXRlbHkgcmV0dXJuIGVtcHR5IGNhcHMgZnJvbSB0aGUgZ2V0Y2FwcyBmdW5jdGlvbnMKKworMjAxMC0wOS0yMSAxODozMzo1NSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGFhMGQxZDAgdG8gNWUzYzliZgorCisyMDEwLTA5LTIxIDEyOjQ5OjMxICswMjAwICBQaGlsaXBwZSBOb3JtYW5kIDxwbm9ybWFuZEBpZ2FsaWEuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS5oOgorCSAgdjRsMjogdXNlIHRoZSB4b3ZlcmxheSBBUElzCisKKzIwMTAtMDktMjEgMTI6NDg6MzQgKzAyMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBub3JtYW5kQGlnYWxpYS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogdXNlIHRoZSBuZXcgeG92ZXJsYXkgQVBJcworCSAgQWxzbyBidW1wZWQgLWJhc2UgcmVxdWlyZW1lbnRzLgorCisyMDEwLTA5LTIxIDEyOjMxOjU5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBVc2UgLURHU1RfRElTQUJMRV9ERVBSRUNBVEVEIGFnYWluIGZvciBHSVQgdmVyc2lvbnMKKworMjAxMC0wOS0yMSAxMTo1MjoyMiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBGaXggZGVidWcgc3RhdGVtZW50CisKKzIwMTAtMDktMjAgMjM6MTc6MzUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBQYXJzZSB1dWlkIGF0b21zIGluIHB1c2ggbW9kZQorCSAgUGFyc2VzIHV1aWQgYXRvbXMgaW4gcHVzaCBtb2RlIHdoZW4gdGhleSBhcmUgZm91bmQsIHRoZXkgbWlnaHQKKwkgIGNvbnRhaW4geG1wIHRhZ3MuCisJICBBbHNvIGRvZXMgYSBtaW5vciByZWZhY3RvcmluZyB0byBwdXQgdGhlIGdsb2JhbCB0YWdzIHBvc3RpbmcKKwkgIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gaW5zdGVhZCBvZiByZXBlYXRpbmcgaXQgaW4gMyBkaWZmZXJlbnQKKwkgIHBsYWNlcy4KKwkgIEZpeGVzICM2Mjk4MzkKKworMjAxMC0wOS0xNiAwODowNDowMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERlbGF5IHRhZ3MgcG9zdGluZyBhIGxpdHRsZQorCSAgRGVsYXkgdGFncyBwb3N0aW5nIHVudGlsIHdlJ3ZlIHBhcnNlZCBhbGwgdGhlIGhlYWRlcnMgc28KKwkgIHRoYXQgdGhlIG5hdGl2ZSBhbmQgeG1wIHRhZ3MgZ2V0IG1lcmdlZCBiZWZvcmUgcG9zdGluZworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYyOTgzOQorCisyMDEwLTA5LTE1IDIyOjEzOjQzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IFBhcnNlIHhtcCBwYWNrZXQgaW4gdXVpZCBhdG9tCisJICB4bXAgcGFja2V0IGlzIHBsYWNlZCBpbnRvIGEgdG9wLWxldmVsIHV1aWQgYXRvbSBmb3IKKwkgIGlzb20vbXA0IHZhcmlhbnRzLgorCSAgVGhpcyBwYXRjaCBtYWtlcyBxdGRlbXV4IHBhcnNlIGFsbCB0b3AtbGV2ZWwgYXRvbXMKKwkgIGluIHB1bGwtbW9kZSBiZWZvcmUgc3RhcnRpbmcgdG8gcHVzaCBkYXRhLCBtYWtpbmcKKwkgIGl0IGFibGUgdG8gZmluZCB0aG9zZSB0YWdzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYyOTgzOQorCisyMDEwLTA5LTE3IDExOjA3OjUyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSAgcnRwc3RhdHM6IHByaW50ZiBmb3JtYXQgZml4ZXMKKworMjAxMC0wOS0xNyAxMTowNzowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSAgcnRwcGF5OiBzb21lIHByaW50ZiBmb3JtYXQgZml4ZXMKKworMjAxMC0wOS0xNSAxODoyMToxMSArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZGVjaW5hQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IGxvZ2ljIHdoZW4gcHVzaGluZyBFT1MuCisJICBEb24ndCBjaGVjayBmb3IgcmV0dXJuIHZhbHVlcyB3aGVuIHB1c2hpbmcgRU9TLiBTdGlsbCBwb3N0IGFuIGVycm9yIGlmIEVPUyBpcworCSAgcmVhY2hlZCBhbmQgbm8gc3RyZWFtcyBoYXZlIGJlZW4gZm91bmQuCisKKzIwMTAtMDktMTUgMTc6MDI6NTcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBkb2NzOiBhZGQgZ3RrLWRvYyBjaHVua3Mgd2l0aCBTaW5jZTogbWFya2VycyBmb3IgbmV3IHY0bDJzcmMgcHJvcGVydGllcworCisyMDEwLTA5LTE1IDE4OjQzOjUwICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvY2FtY3RybC5jOgorCSAgY2FtY3RybDogYWRkIGxpY2Vuc2UgaGVhZGVyIHRvIGRlbW8KKworMjAxMC0wOS0xNCAxNzo0MToyOCArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZGVjaW5hQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZG9uJ3Qgc2VuZCBFT1MgdHdpY2Ugb24gdGhlIHNhbWUgcGFkLgorCisyMDEwLTA5LTE0IDEwOjA3OjU4ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkgIHB1bHNlc2luazogbW92ZSB0aGUgc2hhcmVkIG1haW5sb29wIGZyb20gY2xhc3MgdG8gc3RhdGljIHZhcgorCSAgSnVzdCBoYXZlIG9uZSBzdGF0aWMgdmFyIGZvciB0aGUgc2hhcmVkIG1haW5sb29wIGluc3RlYWQgb2Ygb25lIGNsYXNzIHZhcmlhYmxlCisJICBhbmQgY29waWVzIGluIHRoZSBpbnN0YW5jZS4KKworMjAxMC0wOS0xMyAxNzozMTozNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBydHBqcGVncGF5OiBjbGVhbnVwcyBmb3IgRFJJIG1hcmtlcnMKKwkgIFByb3RlY3QgYWdhaW5zdCBpbnZhbGlkIERSSSBtYXJrZXJzLgorCSAgZG8gc29tZSBjbGVhbnVwcworCisyMDEwLTA5LTEwIDExOjM1OjUzIC0wNDAwICBBbWVyaWNhbiBEeW5hbWljcyA8R1N0cmVhbWVyLUJ1Z3NAdHljb3NwLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBnc3RydHBqcGVncGF5OiBBZGRlZCBEZWZpbmUgUmVzdGFydCBJbnRlcnZhbCAoRFJJKSBNYXJrZXIKKwkgIEFkZGVkIGFiaWxpdHkgdG8gZGV0ZWN0IGFuZCByZXNwb25kIHRvIGEgSlBFRy1kZWZpbmVkIERSSSBtYXJrZXIKKworMjAxMC0wNi0xOSAxOToyMDoxOCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBnc3RydHBzZXNzaW9uOiBTcGxpdCBnZXR0aW5nIHRoZSBjYXBzIGludG8gaXRzIG93biBmdW5jdGlvbgorCisyMDEwLTA5LTEzIDE2OjAzOjUwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogc21hbGwgY2xlYW51cC4KKworMjAxMC0wOS0xMyAxNjoyNDoyNiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJICBwdWxzZXNpbms6IHJld29yayBjb250ZXh0IHNoYXJpbmcKKwkgIFdlIGFsc28gbmVlZCB0byBzaGFyZSB0aGUgbWFpbi1sb29wIHRocmVhZHMgYXMgdGhpcyBvd25zIHRoZSBjb250ZXh0LiBUaHVzIGhhdmUKKwkgIGEgY2xhc3Mgd2lkZSBtYWluLWxvb3AgdGhyZWFkLiBGcm9tIHRoaXMgd2UgY3JlYXRlIGEgY29udGV4dCBwZXIgY2xpZW50LW5hbWUuCisJICBJbnN0ZWFkIG9mIGFsd2F5cyBsb29raW5nIHVwIHRoZSBjb250ZXh0LCB3ZSBrZWVwIHRoaXMgd2l0aCB0aGUgaW5zdGFuY2UuIFRoZQorCSAgcmV2ZXJzZSBtYXBwaW5nIGlzIG9ubHkgbmVlZGVkIGluIHB1bHNlIHNpbmdhbCBoYW5kbGVycy4gVGhpcyBzYXZlcyBhIGxvdCBvZgorCSAgbG9ja2luZy4gQWxzbyBvbmUgc2lnbmFsIGhhbmRsZXIgYmVjb21lcyBzaW1wbGVyIGFzIHRoZXIgZWlzIG9ubHkgb25lIG1haW5sb29wCisJICB0byBub3RpZnkuCisJICBOb3cgdmFsZ2luZCBoYXBweSAtIG5vIGxlYWtzLCBubyBiYWQgcmVhZHMvd3JpdGVzLgorCSAgVGhpcyByZXZlcnRzIG1ham9yIHBhcnRzIG9mIGNvbW1pdCA2OWEzOTdjMzJmNGJhZjA3YTdiMjkzN2M2MTBmOWU4ZjM4M2U5YWU5LgorCSAgRml4ZXMgIzYyODk5NgorCisyMDEwLTA5LTEzIDE1OjQ0OjUyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSAgcnRwc2Vzc2lvbjogU21hbGwgY2xlYW51cHMKKwkgIE1ha2UgdGhlIHByb3BlcnR5IGRlc2NyaXB0aW9uIHByZXR0aWVyLgorCSAgQWN0dWFsbHkgbXVsdGlwbGUgdGhlIGJhbmR3aWR0aCB3aXRoIHRoZSBmcmFjdGlvbi4KKworMjAxMC0wNi0wMSAyMTozNTo0MCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIHJ0cHNlc3Npb246IENhbGN1bGF0ZSBSVENQIGJhbmR3aWR0aCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBSVFAgYmFuZHdpZHRoCisJICBDYWxjdWxhdGUgdGhlIFJUQ1AgYmFuZHdpZHRoIHRvIGJlIGEgZnJhY3Rpb24gb2YgdGhlIFJUUCBiYW5kd2lkdGggaWYgaXQgaXMKKwkgIHNwZWNpZmllZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMS4KKworMjAxMC0wOS0xMyAxNToyOTowNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgc2Vzc2lvbjogaW1wcm92ZSBiYW5kd2lkdGggcmVjYWxjdWxhdGlvbgorCSAgQWxzbyByZWNhbGN1bGF0ZSBiYW5kd2lkdGggd2hlbiBvbmUgb2YgdGhlIHNvdXJjZSBiYW5kd2lkdGhzIGNoYW5nZWQuCisJICBVc2UgdGhlIG5ld2x5IGNhbGN1bGF0ZWQgYmFuZHdpZHRoLgorCisyMDEwLTA2LTAxIDIxOjE3OjI2IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IEFkZCB0aGUgb3B0aW9uIHRvIGF1dG8tZGlzY292ZXIgdGhlIFJUUCBiYW5kd2lkdGgKKworMjAxMC0wOS0xMyAxNDozODoxMSArMDIwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IHNldCB1c2UtcGlwZWxpbmUtY2xvY2sgb24gY29ycmVjdCBHT2JqZWN0CisKKzIwMTAtMDYtMDIgMTc6NTE6MTIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogSW5pdGlhbGlzZSB0aGUgYXZlcmFnZSBzY2FsZWQgYnkgMTYKKworMjAxMC0wOS0xMyAxMjo0MToxMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogYWRkIHJ1bm5pbmdfdGltZSBhcmd1bWVudCBkb2NzCisKKzIwMTAtMDYtMjMgMTY6MTM6MDEgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIHJ0cHN0YXRzOiBSZWN0aWZ5IGRlc2NyaXB0aW9uIG9mIGN1cnJlbnRfdGltZSBpbiBSVFBBcnJpdmFsU3RhdHMKKwkgIEl0IGlzIHRoZSBjdXJyZW50IHRpbWUsIGl0IGlzIHVucmVsYXRlZCB0byB3aGVuIHRoZSBwYWNrZXQgd2FzIGFjdHVhbGx5IHJlY2VpdmVkLgorCisyMDEwLTA5LTEzIDEyOjMxOjQwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBjb21wdXRlIHRoZSBhdmVyYWdlIGNvcnJlY3RseSBzY2FsZWQKKworMjAxMC0wNi0wMSAyMDozMToxOCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBDb3VudCBzZW50IFJUQ1AgcGFja2V0cyBhZnRlciB0aGV5IGhhdmUgYmVlbiBmaW5pc2hlZAorCSAgSWYgdGhleSBhcmUgY291bnRlZCBiZWZvcmUgY2FsbGluZyBnc3RfcnRjcF9idWZmZXJfZW5kKCksIHRoZW4gdGhlCisJICBzaXplIGlzIHdheSB0b28gYmlnLgorCisyMDEwLTA2LTAxIDE5OjUxOjM0IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIGdzdHJ0cHNlc3Npb246IERvbid0IHVucmVmICBwYWRzIGluIGZpbmFsaXplCisJICBUaGUgZ3N0cnRwc2Vzc2lvbiBvYmplY3QgaXMgbm90IGhvbGRpbmcgYW55IHJlZmVyZW5jZSB0byB0aGVtIGRpcmVjdGx5CisKKzIwMTAtMDktMTIgMDA6MDk6MDkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBwby9QT1RGSUxFUy5pbjoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9yby5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zIGZvciBuZXcgc291cGh0dHBzcmMgbWVzc2FnZXMKKworMjAxMC0wOS0xMiAwMDowODowNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwOiBob29rIHVwIGkxOG4gYml0cyBmb3IgcGx1Z2luCisJICBDYWxsIGJpbmR0ZXh0ZG9tYWluKCkgZXRjLgorCisyMDEwLTA5LTEyIDAwOjA0OjQyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXA6IGZpeCBlcnJvciBtZXNzYWdlcworCSAgRXJyb3IgbWVzc2FnZXMgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuIFVSSXMgYW5kIGZpbGVuYW1lcyBzaG91bGQgbm90CisJICBiZSBwYXJ0IG9mIHRoZSBlcnJvciBtZXNzYWdlIHN0cmluZyB0aGF0J3Mgc2hvd24gdG8gdGhlIHVzZXIuCisJICBzb3VwX21lc3NhZ2UtPnJlYXNvbl9waHJhc2UgaXMgbm90IHRyYW5zbGF0ZWQgYW5kIG5vdCBzdWl0YWJsZSBhcworCSAgZXJyb3IgbWVzc2FnZSBmb3IgdXNlcnMgKHNlZSBsaWJzb3VwIGRvY3VtZW50YXRpb24pLiBBbHNvIGZpeCB1cAorCSAgZXJyb3IgY29kZXMgYSBiaXQsIGFzIGZhciBhcyBwb3NzaWJsZSB3aXRoIHRoZSBleGlzdGluZyBjb2Rlcy4KKworMjAxMC0wOS0xMCAwOTo0MzoyNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGRvbid0IHBvc3QgYW4gZXJyb3IgbWVzc2FnZSBpZiBidWZmZXIgYWxsb2MgZmFpbHMgd2l0aCBOT1RfTElOS0VEIGZsb3cKKwkgIFRoaXMgaXMgbm90IGZhdGFsLCBsZXQgdXBzdHJlYW0gaGFuZGxlIGl0LgorCisyMDEwLTA5LTEwIDE4OjA2OjQ4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBkb24ndCBjbGVhciBzZHAgd2hlbiBzZXQgYXMgdXJpCisJICB3aGVuIHdlIHNldCB0aGUgU0RQIHdpdGggYW4gdXJpLCBkb24ndCBjbGVhciBpdCB3aGVuIHdlIGdvIHRvIFJFQURZLgorCisyMDEwLTA5LTEwIDE4OjAxOjE4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiB1c2Ugc2RwIHVyaSBwYXJzZSBtZXRob2QKKwkgIFVzZSB0aGUgc2RwIHBhcnNlIG1ldGhvZCB0aGF0IGRvZXMgcHJvcGVyIHVyaSBlc2NhcGluZy4KKworMjAxMC0wOS0xMCAxNjo1OToxMCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy92NGwyLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9leGFtcGxlcy92NGwyL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvdjRsMi9jYW1jdHJsLmM6CisJICBleGFtcGxlOiBhZGQgdjRsMiBleGFtcGxlLCBkZW1vbnN0cmF0aW5nIHRoZSB1c2Ugb2YgZ3N0IGNvbnRyb2xsZXIKKworMjAxMC0wOS0xMCAxNjo1NToyNSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICB2NGwyc3JjOiBkb24ndCBza2lwIGNhbGN1bGF0aW5nIHRoZSBkdXJhdGlvbgorCisyMDEwLTA2LTIyIDE1OjQ4OjA0ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3Y0bDIvZ3N0djRsMi5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSAgdjRsMnNyYzogYWRkIGNvbnRyb2xhYmxlIGNvbG9yYmFsYW5jZSBwYXJhbWV0ZXJzCisJICBFeHBvc2UgY29sb3JiYWxhbmNlIGNvbnRyb2xzIGFzIG9iamVjdCBwcm9wZXJ0aWVzIChsaWtlIHdlIGRvIG9uIHh2aW1hZ2VzaW5rKS4KKwkgIE1ha2UgdGhlbSBjb250cm9sYWJsZS4KKworMjAxMC0wOS0xMCAxMzoyNTozOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYzoKKwkgIHJ0cG1wYXJvYnVzdGRlcGF5OiBmaXggc29tZSBtaXMtaW1wbGVtZW50YXRpb24KKwkgIEFsc28gYWRkIHNvbWUgZGVidWcuCisKKzIwMTAtMDktMTAgMTM6MjQ6MDIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJICBydHBtcGFyb2J1c3RkZXBheTogcHJvcGVybHkgaW5zZXJ0IGR1bW15IGJ1ZmZlcnMKKworMjAxMC0wOS0xMCAxMTo1NToyNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogYWRkIHJ0c3Atc2RwIHByb3RvY29sIHN1cHBvcnQKKwkgIEFsbG93IHNldHRpbmcgYW4gU0RQIHdpdGggdGhlIHJ0c3Atc2RwOi8vIHVybC4KKwkgIEJhc2VkIG9uIHBhdGNoIGZyb20gTWFyY28gQmFsbGVzaW8uCisJICBTZWUgIzYyODIxNAorCisyMDEwLTA5LTEwIDExOjM1OjU4ICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kZWNpbmFAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSAgYWxwaGFjb2xvcjogbWFrZSBwYXNzdGhyb3VnaCB3b3JrLgorCisyMDEwLTA5LTA5IDIxOjQzOjQwICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJICBtcDRhZGVwYXk6IHNtYWxsIGxvZ2dpbmcgY2xlYW51cCBhbmQgYWRkaXRpb24gdG8gZGVidWcgY29uZmlnIHBhcnNpbmcKKworMjAxMC0wOS0wOSAyMTo0Mjo0NiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJICBhYXNpbms6IGZpeCBjb250ZXh0IGluaXRpYWxpc2F0aW9uIGFuZCBmcmVlaW5nIHRvIG5vdCBsZWFrCisKKzIwMTAtMDktMDkgMjE6NDA6NTEgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9nZW5lcmljL3N0YXRlcy5jOgorCSAgdGVzdHM6IGFsbG93IHJ1bm5pbmcgc3RhdGUgdGVzdHMgZm9yIGFsbCBlbGVtZW50cworCSAgTm93IG9uZSBjYW4gdXNlIEdTVF9OT19TVEFURV9JR05PUkVfRUxFTUVOVFM9MSBtYWtlIGdlbmVyaWMvc3RhdGVzLmNoZWNrCisJICB0byB0cnkgZWxlbWVudHMgdGhhdCB3b3VsZCBub3JtYWx5IGJlIHNraXBwZWQuCisKKzIwMTAtMDktMDkgMTg6NDc6NTYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJICB0ZXN0czogZml4IHJ0cGpwZWdwYXkgdGVzdAorCSAgTWFrZSB0aGUgZGF0YSB3ZSBzZW5kIHRvIHRoZSBqcGVnIHBheWxvYWRlciBiZSBhIHZhbGlkIGpwZWcgZmlsZSBiZWNhdXNlIHRoZQorCSAgcGF5bG9hZGVyIG5vdyBleHBlY3RzIHRoaXMuCisKKzIwMTAtMDktMDkgMTg6NDc6MTEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgcnRwanBlZ3BheTogaW1wcm92ZSBkZWJ1Z2dpbmcKKworMjAxMC0wOS0wOSAxNjozMTo1NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYzoKKwkgIHJ0cG1wYXJvYnVzdGRlcGF5OiB1c2UgdmFsaWQgYml0cmF0ZSBmb3IgZHVtbXkgZnJhbWUKKworMjAxMC0wOS0wOCAxNzowNzo1MyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJICBpZDN2Mm11eDogQWRkcyBtYXBwaW5nIGZvciBhbGJ1bSBhcnRpc3QKKwkgIE1hcHMgR1NUX1RBR19BTEJVTV9BUlRJU1QgdG8gVFBFMiBpbiBpZDN2Mm11eAorCisyMDEwLTA5LTA4IDE4OjM1OjA4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBSZXF1aXJlIG9yYyAwLjQuOAorCSAgVGhlIGRlaW50ZXJsYWNlIHBsdWdpbiBhcHBhcmVudGx5IGZhaWxzIHRvIGNvbXBpbGUgd2l0aCBvbGRlciB2ZXJzaW9ucy4KKworMjAxMC0wOS0wOCAxNzo1MDoxMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogUW9TIGhhbmRsaW5nIGxvZ2ljIG9ubHkgYXBwbGllcyB0byBmb3J3YXJkIHBsYXliYWNrCisJICBGaXhlcyAjNjI4ODk0LgorCisyMDEwLTA5LTA4IDE3OjQzOjQ3ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogcmVtb3ZlIHVudXNlZCBjb2RlCisKKzIwMTAtMDktMDggMTQ6MzY6NDggKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBmaXh1cCBsYXN0IGNvbW1pdAorCSAgV2UgbmVlZCB0byBwcmV2ZW50IHRoZSBldmVudHVhbCBsZWFrIGJldHRlci4KKworMjAxMC0wOS0wOCAxNDoxNjo1OCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGNvZGUgY2xlYW51cHMKKwkgIFVzZSBnX3NsaXN0X3ByZXBlbmQgYXMgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgb3JkZXIuIENoZWNrIGZvciBsaXN0ID09IE5VTEwKKwkgIGluc3RlYWQgb2YgaXRlcmF0aW5nIHRoZSBsaXN0IHRvIHNlZSBpZiBpdCBpcyBlbXB0eS4gTW92ZSBjdHggYWxsb2NhdGlvbiBkb3duCisJICB0byBwcmV2ZW50IGxlYWsgaW4gY2FzZSBvZiBmYWlsdXJlLgorCisyMDEwLTA5LTA4IDA3OjEzOjQyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBydHBqcGVncGF5OiBGaXggdW5pbml0aWFsaXplZCB2YXJpYWJsZSBjb21waWxlciB3YXJuaW5nCisJICBGaXhlcyBidWcgIzYyOTAxOC4KKworMjAxMC0wOS0wNyAxOTowMjowMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBzaW1wbGlmeSBjbG9jayBwcm92aWRlIGNvZGUKKwkgIERvbid0IGxlYWsgdGhlIHB1bHNlc2luayBlbGVtZW50IGJ5IGhhdmluZyB0aGUgY2xvY2sga2VlcCBhIHJlZiB0byB0aGUgc2luay4KKwkgIENyZWF0ZSB0aGUgY2xvY2sgb25seSBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgdXNlIHRoZSBiYXNlYXVkaW9zaW5rIGNsb2NrCisJICBjbGVhbnVwIGNvZGUuCisKKzIwMTAtMDktMDcgMTc6NDk6MDUgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBtb3ZlIHRoZSBjb250ZXh0IHRhYmxlIGluaXQgdG8gX2dldF90eXBlIHBoYXNlCisJICBUaGlzIHNlZW1zIHRvIGZpeCB0aGUgaW52YWxpZCByZWFkcyBvbiBjb250ZXh0IHNodXRkb3duIGJldHRlciwgYWx0b3VnaAorCSAgSSBjYW4ndCByZWFsbHkgZXhwbGFpbi4KKworMjAxMC0wOS0wNyAxNzowNjowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdXNlIG9sZGVyIGdfYXJyYXlfZnJlZQorCSAgZ19hcnJheV91bnJlZigpIGlzIG9ubHkgc2luY2UgMi4yMgorCisyMDEwLTA5LTA3IDE2OjQ5OjE2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBhdm9pZCBpbnZhbGlkIGFkYXB0ZXIgZmx1c2ggb24gUW9TCisJICBGaXJzdCBzdG9yZSB0aGUgYXZhaWxhYmxlIGRhdGEgaW4gdGhlIGFkYXB0ZXIgaW4gdGhlIHJlbV9pbWdfbGVuIGluc3RhbmNlIGZpZWxkCisJICBiZWZvcmUgdHJ5aW5nIHRvIGZsdXNoIHRoZSBhZGFwdGVyIHdpdGggdGhhdCB2YWx1ZSBvbiBRb1MuCisKKzIwMTAtMDktMDcgMTY6NDA6MDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgcnRwanBlZ3BheTogZG8gc29tZSBtb3JlIHNhbml0aXR5IGNoZWNrcworCSAgUHJvdGVjdCBzb21lIG1vcmUgYWdhaW5zdCBpbnZhbGlkIGlucHV0LgorCisyMDEwLTA5LTA3IDE1OjIwOjEyICswMjAwICBBbWVyaWNhbiBEeW5hbWljcyA8R1N0cmVhbWVyLUJ1Z3MgYXQgdHljb3NwLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBqcGVncGF5OiBoYW5kbGUgY29ycnVwdGVkIGpwZWcgYmV0dGVyCisJICBQcm90ZWN0IGFnYWluc3QgY29ycnVwdGVkIGpwZWcgaW5wdXQuCisKKzIwMTAtMDktMDcgMTM6NTU6MDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmM6CisJICBydmF3ZGVwYXk6IGNsZWFudXAgdW51c2VkIGZpZWxkcworCisyMDEwLTA5LTA3IDEzOjUxOjM3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSAgdnJhd2RlcGF5OiBoYW5kbGUgaW52YWxpZCBwYXlsb2FkIGJldHRlcgorCSAgTWFrZSBzdXJlIHdlIGRvbid0IHJlYWQgbW9yZSBkYXRhIHRoYW4gYXZhaWxhYmxlIGluIHRoZSBpbnB1dCBidWZmZXIuCisJICBDbGlwIHRoZSBpbnB1dCBkYXRhIGludG8gdGhlIG91dHB1dCBidWZmZXIuCisKKzIwMTAtMDgtMTYgMTU6MzU6NTEgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuaDoKKwkgIHB1bHNlOiBhbGxvdyBzZXR0aW5nIHN0cmVhbSBwcm9wZXJ0aWVzCisJICBBZGQgYSAicHJvcGVydGllcyIgcHJvcGVydHkgdG8gdGhlIGVsZW1lbnRzIHRvIGFsbG93IHNldHRpbmcgZXh0cmEgc3RyZWFtCisJICBwcm9wZXJ0aWVzLgorCSAgRml4ZXMgIzUzNzU0NAorCisyMDEwLTA5LTA3IDEyOjA4OjEwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1ZjMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJICBkb2NzOiByZW1vdmUgaW50cm9zcGVjdGlvbiBpbmZvIGZvciBnZGtwaXhidWYzIHBsdWdpbiBhbmQgdXBkYXRlIHZlcnNpb24gZm9yIG90aGVycworCSAgVGhlIHZlcnNpb25zIGdvdCBhY2NpZGVudGFsbHkgcmV2ZXJ0ZWQgdG8gYSBwcmUtcmVsZWFzZSB2ZXJzaW9uLCBmaXggdGhhdC4KKworMjAxMC0wOS0wNyAxMTo0MjoxMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBjMmUxMGJmIHRvIGFhMGQxZDAKKworMjAxMC0wOS0wNyAwOToyMDowMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuYzoKKwkgIGNtbWxkZWM6IGZpeCBmbG93IHJldHVybiBoYW5kbGluZworCSAgRml4IGJ1Z2d5IEdTVF9GTE9XX0lTX0ZBVEFMIHN1YnN0aXR1dGlvbiwgYW5kICdtYWtlIGNoZWNrJzoKKwkgIC0gIGlmICghR1NUX0ZMT1dfSVNfRkFUQUwgKGRlYy0+Zmxvd19yZXR1cm4pICYmICFkZWMtPnNlbnRfcm9vdCkgeworCSAgKyAgaWYgKGRlYy0+Zmxvd19yZXR1cm4gIT0gR1NUX0ZMT1dfT0sgJiYgIWRlYy0+c2VudF9yb290KSB7CisKKzIwMTAtMDktMDcgMDA6Mjc6MDcgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBkb24ndCBmcmVlIHRoZSBjb250ZXh0IG11bHRpcGxlIHRpbWVzCisJICBBcHBhcmVudGx5IHRoZSBjbG9zZSBmdW5jdGlvbiBvZiB0aGUgcmluZy1idWZmZXIgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KKworMjAxMC0wOC0xMiAxMjozMzowNiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSAgcnRwbXA0YWRlcGF5OiBncmFiIHRoZSBzYW1wbGluZyBhcnRlIGFuZCBwdXQgaW50byBjYXBzCisJICBUaGlzIGlzIG5lZWRlZCB0byBiZSBhYmxlIHRvIG11eCB0aGUgcmVjZWl2ZWQgYXVkaW8gaW50byBtcDQgKGluIHRoZSBjYXNlIG9mCisJICBhYWMpLiBGaXhlcyAjNjI1ODI1LgorCisyMDEwLTA5LTA2IDE0OjQwOjAyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jOgorCSAgcnRwOiBtYXJrIGNvbnN0YW50IHRhYmxlcyBhcyBjb25zdAorCisyMDEwLTA4LTE4IDE0OjQwOjQ4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5Lmg6CisJICBydHBhbXJwYXk6IHByb3Blcmx5IHN1cHBvcnQgcGVyZmVjdC1ydHB0aW1lCisKKzIwMTAtMDgtMTggMTE6NDI6MzMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSAgcnRwYW1ycGF5OiBwcm9wZXIgZHVyYXRpb24gZm9yIG11bHRpcGxlIGZyYW1lIHBheWxvYWQKKworMjAxMC0wOC0xOCAxMTo0MjowNyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJICBydHBhbXIoZGUpcGF5OiBzdXBwb3J0IEFNUi1XQiBTSUQgZnJhbWUKKworMjAxMC0wOC0xOCAxMTozOTowNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5Lmg6CisJICBydHBnNzI5cGF5OiBwcm9wZXJseSBzdXBwb3J0IHBlcmZlY3QtcnRwdGltZQorCisyMDEwLTA4LTE2IDE2OjA4OjA0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogaW1wcm92ZSBmcmFtZXJhdGUgZGV0ZXJtaW5pbmcKKwkgIENvbGxlY3QgYSBsaW1pdGVkIG51bWJlciBvZiBzdGFydGluZyBzYW1wbGUgZHVyYXRpb25zIGFuZCB1c2UgdGhlIG1lZGlhbiBvZgorCSAgdGhvc2UgdG8gZGV0ZXJtaW5lIGNhcHMgZnJhbWVyYXRlLgorCisyMDEwLTA4LTE3IDEyOjA4OjEwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBhdHRlbXB0IG1vcmUgcmVzeW5jIHVwb24gKGNsdXN0ZXIpIHBhcnNlIGVycm9yCisJICBUaGF0IGlzLCBpZiBwYXJzZSBlcnJvciBvY2N1cnMgaW4gc3RhdGUgcmVxdWlyaW5nIHRvIG1vdmUgdG8gbmV4dCBjbHVzdGVyLAorCSAgYW5kIGRvaW5nIHNvIHRvIHRoZSBleHBlY3RlZCBuZXh0IHBvc2l0aW9uIG9mIGNsdXN0ZXIgZmFpbHMsIHRoZW4gc2NhbiBmb3IgYQorCSAgbmV4dCBjbHVzdGVyIGZyb20gcHJlc2VudCBwb3NpdGlvbiBhbmQgcmVzdW1lIGZyb20gdGhlcmUuCisJICBGaXhlcyAjNjIwNzkwLgorCisyMDEwLTA4LTE2IDE2OjA1OjQxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBub3Qgc28gZmF0YWwgZXJyb3IgaGFuZGxpbmcKKwkgIElmIHNvbWUgYml0cyBvdXQgb2YgcGxhY2UgaW4gYmxvY2soZ3JvdXApIHBhcnNpbmcsIGZvcmVnbyBhbmQgbW92ZSB0byBuZXh0LgorCSAgQWxzbyBza2lwIGxhcmdlIGJsb2NrcyBpbiBwdWxsIG1vZGUsIGJ1dCBuZWVkIHRvIGdpdmUgdXAgaW4gcHVzaCBtb2RlLgorCSAgRml4ZXMgIzYyNjQ2My4KKwkgIEltcHJvdmVzICM2MjA3OTAuCisKKzIwMTAtMDctMjYgMTU6NTE6NDkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgbWF0cm9za2FkZW11eDogYWRkaXRpb25hbCBwYXJzZSByZWNvdmVyeQorCSAgSW4gcGFydGljdWxhciwgdXBvbiBwYXJzZSBmYWlsdXJlIGluIG9uZSBjbHVzdGVyLCB3ZSBtYXkgZm9yZWdvIHJlbWFpbmluZworCSAgY29udGVudCBhbmQgdHJ5IHJlc3VtaW5nIGZyb20gbmV4dCBjbHVzdGVyIG9ud2FyZHMuCisJICBGaXhlcyAjNjIwNzkwLgorCisyMDEwLTA4LTI2IDAyOjU0OjU1IC0wNDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJICBkdG1mc3JjOiBNYWtlIHRoZSBkdG1mc3JjIGFjY2VwdCBldmVudHMgc2VudCB3aXRoIGdzdF9lbGVtZW50X3NlbmRfZXZlbnQKKwkgIFRoZSBkb2Mgc2F5cyB0byB1c2UgZ3N0X2VsZW1lbnRfc2VuZF9ldmVudCBvbiB0aGUgcGlwZWxpbmUsIGJ1dCBpZgorCSAgd2UgYXJlIHRvIGNhbGwgaXQgb24gdGhlIGVsZW1lbnQgaXRzZWxmLCBpdCdzIGEgbm9vcC4gVGhpcyBzaG91bGQgbWFrZSBpdAorCSAgaGFuZGxlIHRoZSBldmVudCBwcm9wZXJseSBiZWZvcmUgZGVsZWdhdGluZyBpdCB0byBiYXNlc3JjLgorCisyMDEwLTA5LTA2IDEyOjIyOjExICswMjAwICBBbWVyaWNhbiBEeW5hbWljcyA8R1N0cmVhbWVyLUJ1Z3MgYXQgdHljb3NwLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogQWRkIHByb3BlcnR5IHRvIGNvbmZpZ3VyZSB1ZHBzcmMgYnVmZmVyIHNpemUKKwkgIEFkZCBhIG5ldyB1ZHAtYnVmZmVyLXNpemUgcHJvcGVydHkgdG8gY29uZmlndXJlIHRoZSBidWZmZXItc2l6ZSBvbiB0aGUgdWRwc3JjCisJICBlbGVtZW50cy4KKwkgIEZpeGVzICM2MjgwNTgKKworMjAxMC0wOC0yNyAxNzo1ODo0NyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgIHJ0cGJpbjogYWRkIG50cC1zeW5jIHByb3BlcnR5CisJICBBZGQgYW4gbnRwLXN5bmMgcHJvcGVydHkgdGhhdCB3aWxsIHN5bmMgdGhlIHJlY2VpdmVkIHN0cmVhbXMgdG8gdGhlIHNlcnZlcgorCSAgTlRQIHRpbWUuIFRoaXMgcmVxdWlyZXMgc3luY2hyb25pemVkIE5UUCB0aW1lcyBiZXR3ZWVuIHRoZSBzZW5kZXIgYW5kIHJlY2VpdmVycywKKwkgIGxpa2Ugd2l0aCBudHBkLgorCSAgQmFzZWQgb24gcGF0Y2ggZnJvbSBUaGlqcyBWZXJtZWlyLgorCSAgRml4ZXMgIzYyNzc5NgorCisyMDEwLTA4LTI3IDEyOjE0OjI1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogcmVuYW1lIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW9uCisKKzIwMTAtMDgtMjcgMTE6MDc6MzQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiByZW5hbWUgc29tZSB2YXJpYWJsZXMgZm9yIGxlc3MgY29uZnVzaW9uCisKKzIwMTAtMDgtMjcgMTA6NDE6MDEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBtb3ZlIGNvbW1lbnQgd2hlcmUgaXQgYmVsb25ncworCisyMDEwLTA4LTI2IDE2OjAwOjM4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBzZXNzaW9uOiBtaW5vciBjbGVhbnVwcworCSAgTWFrZSBjbG9jayBzbmFwc2hvdHMgbW9yZSBhY2N1cmF0ZSBieSBvbmx5IHNhbXBsaW5nIHRoZSBzYW1lIGNsb2NrIG9uY2UuCisKKzIwMTAtMDgtMjYgMTA6NTg6MjYgKzAyMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBiaW46IGFkZCB1c2UtcGlwZWxpbmUtY2xvY2sgcHJvcGVydHkKKwkgIFdpdGggdGhpcyBwcm9wZXJ0eSBSVENQIFNSIE5UUCB0aW1lcyBjYW4gYmUgYmFzZWQKKwkgIG9uIHRoZSBzeXN0ZW0gY2xvY2sgKG1heWJlIHN5bmNlZCB3aXRoIG50cGQpIG9yIHRoZQorCSAgY3VycmVudCBwaXBlbGluZSBjbG9jay4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02Mjc3OTYKKworMjAxMC0wOC0yNSAwOTo1ODoyMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcGV4dC5jOgorCSAgcnRzcGV4dDogc3RvcCBjb25maWd1cmF0aW9uIG9uIGZpcnN0IGZhaWx1cmUKKwkgIFN0b3AgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBzdHJlYW0gYXMgc29vbiBhcyBzb21lIG9mIHRoZSBleHRlbnNpb25zIHJldHVybgorCSAgRkFMU0UuCisJICBGaXhlcyAjNTgxMjk0CisKKzIwMTAtMDgtMjAgMTU6MzU6MjcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgbXVsdGlmZHNpbms6IHVzZSByZWZjb3VudCB0byBjb3VudCBob3N0L3BvcnQgZHVwbGljYXRlcworCSAgSW5zdGVhZCBvZiBhZGRpbmcgbXVsdGlwbGUgY2xpZW50IHN0cnVjdHVyZXMgZm9yIHRoZSBzYW1lIGhvc3QvcG9ydCBwYWlyLCB1c2UgYQorCSAgcmVmY291bnQuCisJICBBZGQgYSBzZW5kLWR1cGxpY2F0ZXMgZmVhdHVyZSB0aGF0IGFsbG93cyB5b3UgdG8gZGlzYWJsZSBzZW5kaW5nIG11bHRpcGxlIGNvcGllcworCSAgb2YgdGhlIHNhbWUgcGFja2V0IHRvIHRoZSBzYW1lIGhvc3Qgd2hlbiBpdCB3YXMgYWRkZWQgbXVsdGlwbGUgdGltZXMuIFRoZQorCSAgc2VuZC1kdXBsaWNhdGVzIHByb3BlcnR5IGlzIGJ5IGRlZmF1bHQgc2V0IHRvIFRSVUUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisJICBhbHRob3VnaCBpdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IHRoaXMgaXMgbm90IGRlc2lyZWQgYmVoYXZpb3VyLgorCisyMDEwLTA4LTE5IDE3OjA2OjI2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBpbXBsZW1lbnQgY3VzdG9tIGV2ZW50IGhhbmRsZXIKKwkgIEV4dGVuZCB0aGUgX3B1c2hfZXZlbnQoKSBmdW5jdGlvbiBzbyB0aGF0IGl0IGNhbiBhbHNvIHNlbmQgZXZlbnRzIHRvIHRoZSB1ZHAKKwkgIHNvdXJjZXMgd2hlbiBhc2tlZC4KKwkgIEltcGxlbWVudCBhIGN1c3R1bSBzZW5kX2V2ZW50IGZ1bmN0aW9uIHRoYXQgY29ycmVjdGx5IGRpc3BhdGNoZXMgdGhlIGRvd25zdHJlYW0KKwkgIGV2ZW50cyBpbiBUQ1AgbW9kZS4gVGhpcyBmaXhlcyBzZW5kaW5nIEVPUyB0byBydHNwc3JjIGFuZCBoYXZlIGl0IHB1c2ggdGhlIEVPUworCSAgZG93bnN0cmVhbS4KKworMjAxMC0wOC0xOSAxMTozNzowNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogdXNlIF9nZXRfY2Fwc19yZWZmZWQoKSB3aGVuIHdlIGNhbgorCSAgVXNlIF9nZXRfY2Fwc19yZWZmZWQoKQorCSAgQWRkIHNvbWUgbW9yZSBkZWJ1ZyB3aGVuIG9wZW5pbmcgdGhlIHNlcnZlciBjb25uZWN0aW9uLgorCisyMDEwLTA4LTE2IDExOjI5OjA3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuaDoKKwkgIGpwZWdkZXBheTogaGFuZGxlIERJU0NPTlQgYW5kIHJlc2V0IHN0YXRlCisJICBQdXQgYSBESVNDT05UIGV2ZW50IG9uIHRoZSBuZXh0IG91dHB1dCBidWZmZXIgd2hlbiB0aGUgaW5wdXQgYnVmZmVyIGhhZCBhCisJICBESVNDT05ULgorCSAgTWFrZSBzdXJlIHdlIGNsZWFyIG91ciBhZGFwdGVyIGFuZCByZXNldCBvdXIgc3RhdGUgYmVmb3JlIGdvaW5nIHRvIFBBVVNFRC4KKwkgIEZyZWUgdGhlIHF0YWJsZXMuCisJICBGaXhlcyAjNjI2ODY5CisKKzIwMTAtMDgtMTYgMTE6Mjc6NTMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5oOgorCSAgZzcyOXBheTogZXh0ZW5kIGZyb20gcmlnaHQgcGFyZW50CisKKzIwMTAtMDktMDYgMDk6NTc6MTAgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBhZGQgc2luY2UgZG9jcyBmb3IgbmV3IHByb3BlcnR5LgorCisyMDEwLTA4LTMwIDE2OjQ1OjQ4ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHVzZSBHU1RfQk9JTEVSUExBVEUgbWFjcm8KKworMjAxMC0wOC0xNiAxNzoyMzo1OCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlbWl4ZXI6IGFkZCBhIGV4YW1wbGUgc2hvd2luZyBob3cgdG8gdXNlIHRoZSBjaGlsZCBwcm9wZXJ0aWVzCisJICBTaG93IGhvdyB0byBwb3NpdGlvbiBhbmQgc2V0IHRoZSBhbHBobyBvZiB0aGUgdmlkZW9zIG9uIGdzdC1sYXVuY2guCisKKzIwMTAtMDgtMTYgMTU6MTk6MzggKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogbW92ZSB0aGUgcHJvcGVydHktc2V0dGVyIHRvIHRoZSBnZXR0ZXIuCisKKzIwMTAtMDgtMTEgMTU6NDg6MTggKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBzcGVjdHJ1bSBvbmx5IGFnZ3JlZ2F0ZSBtYWduaXR1ZGUvcGhhc2UgaWYgdXNlciBhc2tzIGZvciBpdAorCisyMDEwLTA4LTExIDE1OjQ1OjU2ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IGltcHJvdmUgcGVyZm9ybWFuY2Ugd2l0aCBsb2NhbCB2YXJzCisJICBVc2UgJ2lucHV0JyBpbnN0ZWFkIG9mICdzcGVjdHJ1bS0+aW5wdXQnIHdoaWNoIHdhcyBpbnRlbmRlIGFscmVhZHkgKHZhcmlhYmxlCisJICBleGlzdHMsIGJ1dCBub3QgdXNlZCBldmVyeXdoZXJlKS4gQWxzbyB1c2UgYSBsb2NhbCB2ZXJzaW9uIG9mCisJICAnc3BlY3RydW0tPmlucHV0X3BvcycuCisKKzIwMTAtMDgtMTEgMTU6NDQ6MDMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBzcGVjdHJ1bTogY29kZSBjbGVhbnVwCisJICBNb3JlIGNvbW1lbnRzIGFuZCBsb2dnaW5nLiBFeHRyYWN0IG9uZSBjb21wbGV4IGNvbmRpdGlvbiB0byBhIHZhcmlhYmxlLiBSZW9yZGVyCisJICBzb21lIGNvZGUgZm9yIHJlYWRhYmlsaXR5LgorCisyMDEwLTA4LTExIDE1OjQwOjA5ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IGltcHJvdmUgcHJvcGVydHkgc2V0dGVyCisJICBjb25zaXN0ZW50bHkgb25seSB1cGRhdGUgaWYgdGhlIHByb3BlcnR5IGFjdHVhbHkgY2hhbmdlZCB0aGUgdmFsdWUuIERvIGl0CisJICB3aXRob3V0IHJlYWRpbmcgdGhlIGd2YWx1ZSB0d2ljZS4gTm8gbmVlZCB0byByZXNldCB0aGUgc3BlY3RydW0gYW5hbHl6ZXIgZm9yCisJICB0aHJlc2hvbGQgY2hhbmdlcy4KKworMjAxMC0wOC0xMSAxNTozODoyNCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIHNwZWN0cnVtOiBhZGQgaGVscGVyIHRvIG9ubHkgZmx1c2ggcmluZ2J1ZmZlciBkYXRhIHdpdGhvdXQgcmVzZXR0aW5nIHRoZSBmZnQKKwkgIFJlZHVjZXMgc29tZSBkdXBsaWNhdGVkIGNvZGUgYXMgd2VsbC4KKworMjAxMC0wOC0xMSAxMjo0NTo1MyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5oOgorCSAgc3BlY3RydW06IG1vcmUgY29tbWVudHMKKworMjAxMC0wOS0wNSAyMjoyMjo0MiAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IERvY3VtZW50IG1ldGhvZHMgd2l0aCBiYWQgcXVhbGl0eQorCisyMDEwLTA5LTA1IDIyOjE5OjU2IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmM6CisJICBkZWludGVybGFjZTogaW5pdGlhbGl6ZSBhbGwgZGVpbnRlcmxhY2UgY2xhc3MgbWVtYmVycworCSAgVGhpcyBmaXhlcyBVWVZZIGRlaW50ZXJsYWNpbmcuCisKKzIwMTAtMDktMDUgMTg6NTg6MTMgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZDNkOWFjZiB0byBjMmUxMGJmCisKKzIwMTAtMDktMDUgMTg6NDU6MjEgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSAgdmlkZW9taXhlcjogb3JjX2luaXQoKSBkb2Vzbid0IG5lZWQgdG8gYmUgY2FsbGVkCisJICBUaGVyZSdzIG5vIG5lZWQgdG8gY2FsbCBvcmNfaW5pdCgpIHVubGVzcyB5b3UncmUgdXNpbmcgdGhlIE9yYworCSAgQVBJIGRpcmVjdGx5LiAgQWxsIGNvZGUgY3JlYXRlZCBieSBvcmNjIGlzIGd1YXJhbnRlZWQgdG8gd29yaworCSAgd2l0aG91dCBjYWxsaW5nIG9yY19pbml0KCkuCisKKzIwMTAtMDktMDUgMTg6NDA6NDggLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLWRpc3QuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUub3JjOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHkuYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXggZ3JlZWR5bCBPcmMgaW1wbGVtZW50YXRpb24KKwkgIFRvIGFncmVlIHdpdGggdGhlIHByZXZpb3VzIEMvYXNtIGNvZGUuCisKKzIwMTAtMDktMDUgMjI6MzE6MzQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jOgorCSAgdmlkZW9taXhlcjI6IEZhaWwgd2hlbiBjYXBzIGFyZSBpbmNvbXBhdGlibGUKKwkgIERvIG5vdCBmb3JnZXQgdG8gcmV0dXJuIGZhbHNlIHdoZW4gY2FwcyBhcmUgaW5jb21wYXRpYmxlLgorCisyMDEwLTA5LTA1IDIwOjU2OjUyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkgIHZpZGVvbWl4ZXI6IE9ubHkgaW5pdCBvcmMgaWYgaXQgaXMgYXZhaWxhYmxlCisJICBQdXQgc29tZSBpZmRlZiBhcm91bmQgb3JjX2luaXQgdG8gcHJldmVudCBidWlsZCBlcnJvcnMKKworMjAxMC0wOS0wNSAxMjoxNzowOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBlYzYwMjE3IHRvIGQzZDlhY2YKKworMjAxMC0wOS0wNCAxMjo0NjozMSAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0Lmg6CisJICBkZWludGVybGFjZTogVXBkYXRlIGRpc3RlZCBPcmMgZmlsZXMKKworMjAwOS0wNi0yOSAxMTo0MzowNyAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgIHY0bDJzcmM6IGFkZCBkZWNpbWF0ZSBwcm9wZXJ0eQorCisyMDEwLTA2LTA0IDEyOjA5OjIzIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2R2L01ha2VmaWxlLmFtOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9kdi9nc3RzbXB0ZXRpbWVjb2RlLmg6CisJICBkdmRlbXV4OiBQYXJzZSBTTVBURSB0aW1lIGNvZGVzCisKKzIwMTAtMDgtMjMgMDI6NTA6MzYgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhci5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXJibGVuZC5jOgorCSAgZGVpbnRlcmxhY2U6IHJlbW92ZSBhc3NlbWJseSBjb2RlIGluIGZhdm9yIG9mIG9yYworCisyMDEwLTA2LTA4IDE0OjU0OjQ5IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS5vcmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeS5jOgorCSAgZGVpbnRlcmxhY2U6IGltcGxlbWVudCBncmVlZHkgaW4gT3JjCisKKzIwMTAtMDktMDQgMTE6NDM6MjEgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLWRpc3QuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5oOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLWRpc3QuYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy1kaXN0Lmg6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0Lmg6CisJICB1cGRhdGUgZGlzdGVkIE9yYyBmaWxlcworCisyMDEwLTA5LTAyIDE0OjM0OjUwICswMjAwICBUaGliYXVsdCBTYXVuaWVyIDx0c2F1bmllckBnbm9tZS5vcmc+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJICBhbHBoYWNvbG9yOiBGaXggY2xhc3NpZmljYXRpb24KKwkgIFRoaXMgaXMgbm8gZWZmZWN0IGJ1dCBhIGNvbnZlcnRlci4gRml4ZXMgYnVnICM2Mjg2MDguCisKKzIwMTAtMDktMDIgMTE6MTk6MDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnR5cGVzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1ZjMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMnBhZC5oOgorCSAgdmlkZW9taXhlcjI6IEFkZCBkb2N1bWVudGF0aW9uIGFuZCBhZGQgdG8gdGhlIGRvY3MKKworMjAxMC0wNy0yNiAxNjowNzoxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvZ3N0Y29sbGVjdHBhZHMyLmM6CisJKiBnc3QvdmlkZW9taXhlci9nc3Rjb2xsZWN0cGFkczIuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5oOgorCSAgdmlkZW9taXhlcjI6IEFkZCB2aWRlb21peGVyMiBlbGVtZW50CisJICBUaGlzIGlzIGJhc2VkIG9uIGNvbGxlY3RwYWRzMiBhbmQgaXMgc3luY2hyb25pemluZworCSAgYWxsIHN0cmVhbXMgYmFzZWQgb24gdGhlIHJ1bm5pbmcgdGltZS4KKwkgIE5ldyBmZWF0dXJlcyBjb21wYXJlZCB0byBvbGQgdmlkZW9taXhlcjoKKwkgICogU3luY2hyb25pemluZyBmcmFtZXMgb24gdGhlIHJ1bm5pbmcgdGltZQorCSAgKiBJbXByb3ZlZCBhbmQgc2ltcGxpZmllZCBuZWdvdGlhdGlvbgorCSAgKiBGdWxsIFFvUyBzdXBwb3J0CisJICAqIFZhcmlhYmxlIGZyYW1lcmF0ZSBzdXBwb3J0CisJICBGaXhlcyBidWcgIzYyNjA0OCwgIzYyNDkwNS4KKworMjAxMC0wOS0wMSAxMToxMTozNCArMDIwMCAgUGF2ZWwgS29zdHl1Y2hlbmtvIDxzaHByb3R4QGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBSZWxheCBwYXJzaW5nIG9mIGRhdGUgdGFncworCSAgQmVmb3JlIHdlIHJlcXVpcmVkIGEgY29tcGxldGUgZGF0ZSBpbiBtYXRyb3NrYWRlbXV4IGJ1dCBpbgorCSAgaWQzZGVtdXggZm9yIGV4YW1wbGUgb25seSB0aGUgeWVhciBvciB5ZWFyIGFuZCBtb250aCB3YXMgcG9zc2libGUgdG9vLgorCSAgRml4ZXMgYnVnICM2Mjg0NTQuCisKKzIwMTAtMDgtMzAgMTk6MDM6NTIgKzAxMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBVc2UgR3N0QmFzZVNyYzo6YmxvY2stc2l6ZSBhcyBmYWxsYmFjayBzaXplCisKKzIwMTAtMDgtMzAgMTg6MzY6NTQgKzAxMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBGaXggdXNpbmcgbXBlZ3RzIHZpYSB0aGUgbW1hcCBpbnRlcmZhY2UKKwkgIE1QRUcgZG9lc24ndCBoYXZlIGEgc3RhdGljIHNpemUgcGVyIGZyYW1lLCBzbyBkb24ndCBwcmV0ZW5kIGl0IGhhcyBvbmUKKwkgIGFuZCBmYWlsIHdoZW4gY2FwdHVyaW5nIGJlY2F1c2UgaXQgZG9lc24ndCBtYXRjaC4gSW5zdGVhZCBtYXJrIHRoZSBzaXplCisJICBhcyB1bmtub3duIGFuZCBsZXQgdGhlIHJlYWQgZnJhbWUgZ3JhYmJpbmcgbWV0aG9kIHVzZSBhIHJlYXNvbmFibGUgZmFsbGJhY2sKKwkgIHZhbHVlIChhc3N1bWluZyB0aGF0J3Mgb25seSBmb3IgYWN0dWFsIHN0cmVhbWluZyBmb3JtYXRzKQorCSAgRml4ZXMgYnVnICM2MjgzNDkuCisKKzIwMTAtMDgtMjcgMTg6MTU6MDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIHdhdnBhY2twYXJzZTogRG9uJ3QgdXNlIEdTVF9GTE9XX0lTX0ZBVEFMKCkKKworMjAxMC0wOC0yNyAxODoxMzoyMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJICBwbmdkZWM6IERvbid0IHVzZSBHU1RfRkxPV19JU19GQVRBTCgpCisJICBBbmQgZG9uJ3QgcG9zdCBhbiBlcnJvciBtZXNzYWdlIGlmIGRvd25zdHJlYW0gcmV0dXJucyBVTkVYUEVDVEVELgorCisyMDEwLTA4LTI3IDE4OjA5OjExICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkgIGR2ZGVtdXg6IERvbid0IHVzZSBHU1RfRkxPV19JU19GQVRBTCgpCisKKzIwMTAtMDgtMjcgMTg6MDU6NTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBEb24ndCB1c2UgR1NUX0ZMT1dfSVNfRkFUQUwoKQorCSAgQW5kIGRvbid0IHBvc3QgYW4gZXJyb3IgbWVzc2FnZSBpZiBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWQgYmVjYXVzZQorCSAgb2YgVU5FWFBFQ1RFRCwgd2hpY2ggb25seSBtZWFucyB0aGF0IGRvd25zdHJlYW0gd2FudHMgdXMgdG8gRU9TIG5vdy4KKworMjAxMC0wOC0yNyAxODowMjo1NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmMvZGVjOiBEb24ndCB1c2UgR1NUX0ZMT1dfSVNfRkFUQUwoKQorCSAgQW5kIHByb3Blcmx5IGhhbmRsZSBVTkVYUEVDVEVEIGFuZCBXUk9OR19TVEFURS4KKworMjAxMC0wOC0yNyAxNzo1MjoxOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxlbmMuYzoKKwkgIGNtbWxkZWMvZW5jOiBEb24ndCB1c2UgR1NUX0ZMT1dfSVNfRkFUQUwoKQorCSAgQW5kIGFzIGEgcmVzdWx0LCBkb24ndCBpZ25vcmUgV1JPTkdfU1RBVEUgYW5kIE5PVF9MSU5LRUQuCisJICBCb3RoIG1lYW4gdGhhdCBpdCdzIGEgZ29vZCBpZGVhIHRvIHBhc3MgdGhlbSB1cHN0cmVhbSBpbnN0ZWFkCisJICBvZiBwcmV0ZW5kaW5nIHRoYXQgZXZlcnl0aGluZyBpcyBnb29kLgorCisyMDEwLTA4LTI3IDE3OjQ3OjIyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogRG9uJ3QgdXNlIEdTVF9GTE9XX0lTX0ZBVEFMKCkKKworMjAxMC0wOC0yNyAxNzo0NTo1MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IERvbid0IHVzZSBHU1RfRkxPV19JU19GQVRBTCgpIGFuZCBHU1RfRkxPV19JU19TVUNDRVNTKCkKKworMjAxMC0wOC0yNyAxNzozOTozMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERvbid0IHVzZSBHU1RfRkxPV19JU19GQVRBTCgpCisKKzIwMTAtMDgtMjcgMTc6Mzc6MzMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IERvbid0IHVzZSBHU1RfRkxPV19JU19GQVRBTCgpCisKKzIwMTAtMDgtMjcgMTc6MzU6NDcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJICBybmRidWZmZXJzaXplOiBEb24ndCB1c2UgR1NUX0ZMT1dfSVNfRkFUQUwoKQorCisyMDEwLTA4LTI3IDE3OjM1OjM4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IERvbid0IHVzZSBHU1RfRkxPV19JU19GQVRBTCgpCisKKzIwMTAtMDgtMjcgMTc6MzI6MDkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogRG9uJ3QgdXNlIEdTVF9GTE9XX0lTX0ZBVEFMKCkKKwkgIEFuZCBkb2N1bWVudCB3aHkgd3Jvbmctc3RhdGUgZG9lc24ndCBuZWVkIGFuIGVycm9yIG1lc3NhZ2UuCisKKzIwMTAtMDgtMjYgMTM6NDQ6NDkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IEZhaWwgZ3JhY2VmdWxseSBpZiBubyB0aHJlYWRlZCBQQSBtYWlubG9vcCBjYW4gYmUgY3JlYXRlZAorCSAgRml4ZXMgYnVnICM2MjgwMjAuCisKKzIwMTAtMDgtMjQgMTU6MTE6MjAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0Lmg6CisJICB2aWRlb21peGVyOiBVcGRhdGUgZGlzdGVkIE9SQyBmaWxlcworCisyMDEwLTA4LTIzIDE1OjQ0OjUwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfbW14Lmg6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy5vcmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBPcHRpbWl6ZSBBUkdCIGJsZW5kaW5nIGFuZCBpbXBsZW1lbnQgQkdSQSBibGVuZGluZyB3aXRoIG9yYworCSAgVGhpcyBub3cgbWVhbnMsIHRoYXQgd2UgaGF2ZSBhYnNvbHV0ZWx5IG5vIGhhbmR3cml0dGVuIGFzc2VtYmx5IGFueW1vcmUKKwkgIGluIHZpZGVvbWl4ZXIgYW5kIGl0J3MgYWxzbyBmYXN0ZXIgbm93IHdoZW4gdXNpbmcgU1NFLgorCisyMDEwLTA4LTIyIDAxOjU4OjA1IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kb3JjLm9yYzoKKwkgIHZpZGVvbWl4ZXI6IEFkZCBvcmMgaW1wbGVtZW50YXRpb24gZm9yIGJsZW5kaW5nCisJICB2aWRlb21peGVyOiBBZGQgb3JjIGltcGxlbWVudGF0aW9uIGZvciBibGVuZGluZworCisyMDEwLTA4LTIyIDAxOjU0OjE2IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogRml4IGV4YW1wbGUgcGlwZWxpbmVzCisJICB2aWRlb21peGVyOiBGaXggZXhhbXBsZSBwaXBlbGluZXMKKworMjAxMC0wOC0yMCAxMTo0MTo1NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogQWRkIHRlc3QgZm9yIGNoZWNraW5nIGlmIGltYWdlZnJlZXplIGNvcnJlY3RseSByZXR1cm5zIFVORVhQRUNURUQgYWZ0ZXIgdGhlIGZpcnN0IGJ1ZmZlcgorCisyMDEwLTA4LTIwIDExOjM4OjA5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW1hZ2VmcmVlemUuYzoKKwkgIGltYWdlZnJlZXplOiBBZGQgdGVzdCBmb3IgYnVmZmVyYWxsb2MgcGFzc3Rocm91Z2gKKworMjAxMC0wOC0yMCAxMDozNToxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogRml4IHJhY2UgY29uZGl0aW9ucyBpbiB0aGUgdW5pdCB0ZXN0CisJICBJZiBzZXR0aW5nIHRoZSBwaXBlbGluZSB0byBQTEFZSU5HIGJlZm9yZSBpc3N1aW5nIHRoZSBzZWVrLCBidWZmZXJzCisJICBhcmUgYWxyZWFkeSBhcnJpdmluZyBhdCB0aGUgc2luayBiZWZvcmUgdGhlIHNlZWsgaXMgaGFuZGxlZCBhbmQKKwkgIHdpbGwgaGF2ZSB0aGUgd3JvbmcgdGltZXN0YW1wcyBhbmQgZXZlcnl0aGluZy4KKwkgIEZpeGVzIGJ1ZyAjNjI1NTQ3LgorCisyMDEwLTA4LTIwIDEwOjM0OjE3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuaDoKKwkgIGltYWdlZnJlZXplOiBGaXggYW5vdGhlciBzdWJ0bGUgcmFjZSBjb25kaXRpb24gcmVsYXRlZCB0byBzdGFydGluZyB0aGUgc3JjcGFkIHRhc2sKKwkgIER1ZSB0byBhIHNlZWsgdGhlIHNyY3BhZCB0YXNrIGNvdWxkIGJlIHN0YXJ0ZWQgaW4gcmFyZSBjaXJjdW1zdGFuY2VzIGFsdGhvdWdoCisJICBpdCBzaG91bGRuJ3QgYmUgc3RhcnRlZCBhbnltb3JlIGJlY2F1c2Ugbm8gdXBzdHJlYW0gYnVmZmVyIGlzIGF2YWlsYWJsZS4KKworMjAxMC0wOC0yMCAxMDoyNDozMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmg6CisJICBpbWFnZWZyZWV6ZTogUHJvdGVjdCB0aGUgZmx1c2hpbmctc2VlayB2YXJpYWJsZSBieSB0aGUgc3JjcGFkJ3Mgc3RyZWFtIGxvY2sKKwkgIFRoaXMgZml4ZXMgYSBzdWJ0bGUgcmFjZSBjb25kaXRpb24sIHRoYXQgY2F1c2VkIGJ1ZmZlcmFsbG9jIHRvIGZhaWwKKwkgIHdpdGggd3Jvbmctc3RhdGUgZHVlIHRvIGEgc2VlayBidXQgY2F1c2VkIGl0IHRvIGJlIG5vdCByZXRyaWVkIGFzCisJICBpdCBzaG91bGQuCisKKzIwMTAtMDgtMjAgMDk6MTQ6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYzoKKwkgIGltYWdlZnJlZXplOiBBbHdheXMgZ2VuZXJhdGUgYSBwZXJmZWN0bHkgdGltZXN0YW1wZWQgc3RyZWFtCisJICBCZWZvcmUgdGhlcmUgY291bGQgYmUgcm91bmRpbmcgZXJyb3JzIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGR1cmF0aW9uLAorCSAgcmVzdWx0aW5nIGluIHRpbWVzdGFtcCArIGR1cmF0aW9uIGJlaW5nIHNtYWxsZXIgdGhhbiB0aGUgbmV4dCBidWZmZXIncworCSAgdGltZXN0YW1wLgorCisyMDEwLTA4LTE5IDE4OjM4OjM5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBPbmx5IGluY2x1ZGUgdGhlIHNlcnZlciBuYW1lIGluIHRoZSBjb250ZXh0IG5hbWUgaWYgaXQncyBub3QgTlVMTAorCisyMDEwLTA4LTE4IDE2OjM3OjQxICswMjAwICBQaGlsaXBwZSBOb3JtYW5kIDxwbm9ybWFuZEBpZ2FsaWEuY29tPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJICBwdWxzZXNpbms6IEFkZCAiY2xpZW50IiBwcm9wZXJ0eSB0byBzZXQgdGhlIFBBIGNsaWVudCBuYW1lCisJICBBbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIG1vZGlmeSB0aGUgY2xpZW50IG5hbWUgdXNlZCB0byBjb25uZWN0IHdoZW4KKwkgIGNvbm5lY3RpbmcgdG8gdGhlIFB1bHNlQXVkaW8gZGFlbW9uLiBOb3RlIGhvd2V2ZXIgdGhhdCB1cGRhdGluZyB0aGUKKwkgIHByb3BlcnR5IGFmdGVyIHRoZSBlbGVtZW50IHJlYWNoZWQgdGhlIFJFQURZIHN0YXRlIHdpbGwgaGF2ZSBubworCSAgZWZmZWN0IHVudGlsIHRoZSBuZXh0IE5VTEwtPlJFQURZIHRyYW5zaXRpb24uCisJICBGaXhlcyBidWcgIzYyNzE3NC4KKworMjAxMC0wOC0xOSAxNzo1OTowOSArMDIwMCAgRGF2aWQgSG95dCA8ZGhveXRAbGxubC5nb3Y+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogSW1wcm92ZSBlcnJvciBtZXNzYWdlcworCSAgQmVmb3JlIHRoZXkgY29udGFpbmVkIHRoZSBVUkwgYmVmb3JlIHRoZSBhY3R1YWwgZmFpbHVyZS4gVGhlIG90aGVyCisJICB3YXkgYXJvdW5kIG1ha2VzIG1vcmUgc2Vuc2UgYW5kIHdlIGRvIHRoZSBzYW1lIGluIG90aGVyIGVsZW1lbnRzCisJICBsaWtlIGZpbGVzcmMuCisJICBGaXhlcyBidWcgIzYyNzI4OS4KKworMjAxMC0wOC0xOSAxMjo0Njo1MCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogRnJlZSB0aGUgY2xvY2sgb24gc3RhdGUgY2hhbmdlIGZhaWx1cmVzIHRvbworCisyMDEwLTA4LTE3IDE2OjI2OjQxICswMjAwICBQaGlsaXBwZSBOb3JtYW5kIDxwbm9ybWFuZEBpZ2FsaWEuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvcHVsc2UvcHVsc2V1dGlsLmM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBwdWxzZXV0aWw6IGluY2x1ZGUgcGlkIHZhbHVlIGluIGdzdF9wdWxzZV9jbGllbnRfbmFtZSgpIGZhbGxiYWNrIHJldHVybiB2YWx1ZQorCSAgRml4ZXMgYnVnICM2MjcxNjIKKworMjAxMC0wOC0xOSAxMjozMjo1OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogRnJlZSB0aGUgR3N0UHVsc2VDb250ZXh0IGFmdGVyIHVzYWdlCisKKzIwMTAtMDgtMTYgMDk6MTI6MDQgKzAyMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBub3JtYW5kQGlnYWxpYS5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogc2hhcmUgdGhlIFBBIGNvbnRleHQgYmV0d2VlbiBhbGwgY2xpZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUKKwkgIEF2b2lkIHRvIGNyZWF0ZSBhIG5ldyBQQSBjb250ZXh0IGZvciBlYWNoIG5ldyBjbGllbnQgYnkgdXNpbmcgYSBoYXNoCisJICB0YWJsZSBjb250YWluaW5nIHRoZSBsaXN0IG9mIHJpbmctYnVmZmVycyBhbmQgdGhlIHNoYXJlZCBQQSBjb250ZXh0CisJICBmb3IgZWFjaCBjbGllbnQuIERvaW5nIHRoaXMgd2lsbCBpbXByb3ZlIGFwcGxpY2F0aW9uIG1lbW9yeSB1c2FnZSBpbgorCSAgdGhlIGNhc2VzIHdoZXJlIG11bHRpcGxlIHBpcGVsaW5lcyBpbnZvbHZpbmcgbXVsdGlwbGUgcHVsc2VzaW5rCisJICBlbGVtZW50cyBhcmUgdXNlZC4KKwkgIEZpeGVzIGJ1ZyAjNjI0MzM4LgorCisyMDEwLTA4LTE3IDEzOjQxOjQ5ICswMjAwICBQaGlsaXBwZSBOb3JtYW5kIDxwaGlsQGJhc2UtYXJ0Lm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBjbGVhciB0aGUgUEEgbWFpbmxvb3AgaWYgYmFzZWF1ZGlvc2luayBmYWlsZWQgdG8gb3BlbiB0aGUgcmluZ19idWZmZXIKKwkgIElmIHRoZSBhcHBsaWNhdGlvbiByZXF1ZXN0cyBhIHN0YXRlLWNoYW5nZSBhbmQgcHVsc2VzaW5rIGZhaWxzIHRvIG9wZW4KKwkgIHRoZSByaW5nX2J1ZmZlciBkZXZpY2UgdGhlIG1haW5sb29wIGF0dHJpYnV0ZSBvZiB0aGUgc2luayBzaG91bGQgYmUKKwkgIGNsZWFuZWQgdXAgdG8gYXZvaWQgZnV0dXJlIHN0YXRlLWNoYW5nZSAoTlVMTC0+UkVBRFkpIGZhaWx1cmVzLgorCisyMDEwLTA4LTE5IDEyOjIzOjE2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogUG9zdCBhbiBlcnJvciBtZXNzYWdlIGlmIEVPUyBoYXBwZW5zIGJlZm9yZSB2YWxpZCBpbnB1dCBpcyBmb3VuZAorCSAgRml4ZXMgYnVnICM2MjczNDEuCisKKzIwMTAtMDgtMTIgMTE6NDk6NDcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogU2VuZCBjbG9zZSBuZXdzZWdtZW50IGV2ZW50IGZyb20gdGhlIHN0cmVhbWluZyB0aHJlYWQKKworMjAxMC0wOC0xMSAxMTozNjozMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmg6CisJICBpbWFnZWZyZWV6ZTogUmV0cnkgYnVmZmVyYWxsb2MgaWYgaXQgd2FzIGFib3J0ZWQgd2l0aCBXUk9OR19TVEFURSBiZWNhdXNlIG9mIGEgZmx1c2hpbmcgc2VlaworCisyMDEwLTA4LTExIDA4OjQ2OjE0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogUmV0dXJuIEdTVF9GTE9XX1VORVhQRUNURUQgd2hlbiBnZXR0aW5nIGEgc2Vjb25kIGJ1ZmZlcgorCSAgVGhpcyBwcmV2ZW50cyB1cHN0cmVhbSBmcm9tIHB1c2hpbmcgbWFueSB1c2VsZXNzIGJ1ZmZlcnMgYW5kIG1ha2VzCisJICBpdCBnbyBpbnRvIEVPUyBzdGF0ZS4KKworMjAxMC0wOC0xMCAyMDoxMToyNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IFBhc3N0aHJvdWdoIGJ1ZmZlciBhbGxvY2F0aW9ucworCisyMDEwLTA5LTA0IDEzOjEwOjMwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisJICBUZW1wb3JhcmlseSBkaXNhYmxlIC1ER1NUX0RJU0FCTEVfREVQUkVDQVRFRCBmb3IgZ2l0IGJ1aWxkcyB1bnRpbAorCSAgdGhlIGNvZGUgaXMgdXBkYXRlZCBmb3IgdGhlIEdTVF9GTE9XX0lTXyogbWFjcm8gZGVwcmVjYXRpb25zLgorCis9PT0gcmVsZWFzZSAwLjEwLjI1ID09PQorCisyMDEwLTA5LTAyIDIzOjQ0OjE5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLWRpc3QuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5oOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLWRpc3QuYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy1kaXN0Lmg6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0Lmg6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTAuMjUKKworMjAxMC0wOS0wMiAyMzoxMjo0OCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJICBkb2NzOiB1cGRhdGUgZG9jcyBmb3IgcmVsZWFzZQorCisyMDEwLTA5LTAyIDIzOjA3OjM2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vTElOR1VBUzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZ2wucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vcm8ucG86CisJKiBwby9zdi5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTAtMDgtMjUgMTk6MDE6NTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zbC5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIDAuMTAuMjQuNSBwcmUtcmVsZWFzZQorCisyMDEwLTA4LTIyIDIxOjE1OjA3IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogdXNlIHNlcGFyYXRlIGJ1ZmZlciBtZXRhZGF0YSBmb3IgZmllbGRzCisJICBDYWxsIGdzdF9idWZmZXJfbWFrZV9tZXRhZGF0YV93cml0YWJsZSgpIG9uIGJ1ZmZlcnMgdGhhdCBhcmUKKwkgIGR1cGxpY2F0ZWQgaW50byBmaWVsZHMuICBGaXhlcyAjNjI3Njg5LgorCisyMDEwLTA4LTIxIDIxOjQxOjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0LmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLWRpc3QuaDoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5oOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRvcmMtZGlzdC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRvcmMtZGlzdC5oOgorCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc2wucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICAwLjEwLjI0LjQgcHJlLXJlbGVhc2UKKworMjAxMC0wOC0xOSAxODozMDowNSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IFByZXZlbnQgY3Jhc2ggd2hlbiByZWFkaW5nIGltYWdlIHdpdGggcHJvYmxlbXMKKwkgIENoZWNrIGlmIHdlIGhhdmUgZGF0YSBvbiB0aGUgYWRhcHRlciBhbmQgZmFpbCBpZiBub3QuCisJICBGaXhlcyAjNjI3NDEzCisKKzIwMTAtMDgtMTMgMTc6MjQ6MDEgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDNlOGRiMWQgdG8gZWM2MDIxNworCisyMDEwLTA4LTExIDIyOjIwOjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogU2VuZCBjbG9zZSBzZWdtZW50cyB3aGVuIHNlZWtpbmcgb25seSBmb3Igbm9uLWZsdXNoaW5nIHNlZWtzIGFuZCBpZiB3ZSBhbHJlYWR5IHNlbnQgYSBuZXdzZWdtZW50IGV2ZW50CisJICBGaXhlcyBidWcgIzYyNjYxOS4KKworMjAxMC0wOC0xMSAxNjo1MDo0MiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSogd2luMzIvY29tbW9uL2dzdHJ0cGJpbi1tYXJzaGFsLmM6CisJKiB3aW4zMi9jb21tb24vZ3N0dWRwLWVudW10eXBlcy5jOgorCSogd2luMzIvY29tbW9uL2dzdHVkcC1lbnVtdHlwZXMuaDoKKwkqIHdpbjMyL2NvbW1vbi9nc3R1ZHAtbWFyc2hhbC5jOgorCSAgMC4xMC4yNC4zIHByZS1yZWxlYXNlCisKKzIwMTAtMDgtMTEgMTE6MTc6MTggKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwcmV2ZW50IHJlYWRpbmcgcGFzdCBhdmMxIGF0b20gd2hlbiBwYXJzaW5nCisJICAuLi4gd2hlbiBvbmUgb2YgdGhlIHN1YmF0b21zIGhhcyBhIGxhcmdlL2ludmFsaWQgc2l6ZS4KKwkgIEZpeGVzICM2MjY2MDkuCisKKzIwMTAtMDgtMTAgMjM6Mzc6MjMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgMC4xMC4yNC4yIHByZS1yZWxlYXNlCisKKzIwMTAtMDgtMTAgMTA6NTc6NDUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gYmQyMDU0YiB0byAzZThkYjFkCisKKzIwMTAtMDgtMDkgMDA6MzY6MzYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZTogZml4IHByaW50ZiBmb3JtYXQgaW4gc29tZSBkZWJ1Z2dpbmcgbWVzc2FnZXMKKworMjAxMC0wOC0wOCAyMzozMTo0MiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBrZ2NvbmZpZy9nc3RyZWFtZXItcGx1Z2lucy1nb29kLXVuaW5zdGFsbGVkLnBjLmluOgorCSAgcGtnY29uZmlnOiBzZXQgcGx1Z2luc2RpciB0byB0b3AtbGV2ZWwgYnVpbGRkaXIgd2l0aG91dCB0aGUgcGtnY29uZmlnLy4uIGJpdHMKKwkgIFJlbW92ZXMgY2x1dHRlciBpbiBwbHVnaW4gZGlyIHBhdGhzLiBUaGlzIGlzIG9ubHkgdXNlZCB0byBmaW5kIHRoZSAtZ29vZAorCSAgcGx1Z2lucyBmb3IgdW5pdCB0ZXN0cyBvZiB1Z2x5L2JhZC9mZm1wZWcvZXRjLiBpbiBhbiB1bmluc3RhbGxlZCBzZXR1cC4KKworMjAxMC0wOC0wNiAyMDowNDo1OSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IGFsc28gbG9nIHBpeGVsIGZvcm1hdHMgaW4gc29ydGVkIG9yZGVyCisKKzIwMTAtMDgtMDYgMTg6MDc6NDYgKzAxMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBzb3J0IGZvcm1hdHMgaW4gdGhlIHJpZ2h0IG9yZGVyIHNvIHRoYXQgbm9uLWVtdWxhdGVkIGZvcm1hdHMgYXJlIHByZWZlcmVkCisJICBUaGUgZm9ybWF0IGxpc3Qgc2hvdWxkIGJlIHNvcnRlZCBmcm9tIGhpZ2ggcmFua3MgdG8gbG93IHJhbmtzLiBJbiB0aGUgR1NMaXN0CisJICBzb3J0aW5nIGZ1bmN0aW9uIHRoaXMgbWVhbnMgdGhlIGNvbXBhcmUgbmVlZHMgdG8gcmV0dXJuIGEgcG9zaXRpdmUgdmFsdWUgaWYKKwkgIGZvcm1hdCBhIGhhcyBhIGxvd2VyIHJhbmsgdGhhbiBmb3JtYXQgYi4KKwkgIEFtb25nIG90aGVyIHRoaW5ncyB0aGlzIGZpeGVzIHY0bDJzcmMgdG8gcHJlZmVyIG5vbi1lbXVsYXRlZCBmb3JtYXRzCisJICB0byBlbXVsYXRlZCBmb3JtYXRzIHdoZW4gYnVpbHQgYWdhaW5zdCBsaWJ2NGwuCisKKzIwMTAtMDgtMDYgMTk6MjQ6MDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBGaXggcGlwZWxpbmUgaW4gdGhlIGRvY3VtZW50YXRpb24KKwkgIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgdGhlIHNhbWUgY29sb3IgZm9ybWF0IG9uIGFsbCBzdHJlYW1zLCBpLmUuIEFZVVYKKwkgIEZpeGVzIGJ1ZyAjNjI1NDUyLgorCisyMDEwLTA4LTA1IDEzOjU2OjQ0ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBhNTE5NTcxIHRvIGJkMjA1NGIKKworMjAxMC0wNi0xNCAxOTo1ODoxMSArMTAwMCAgSm9uYXRoYW4gTWF0dGhldyA8am9uYXRoYW5AZDE0bi5vcmc+CisKKwkqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jOgorCSAgaWQzdjJtdXg6IHdyaXRlIGJlYXRzLXBlci1taW51dGUgdGFnIHVzaW5nIFRCUE0gZnJhbWUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MjE1MjAKKworMjAxMC0wNy0yNSAxMTo0Nzo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmg6CisJICB2aWRlb21peGVyOiBNb3ZlIGRlYnVnIGNhdGVnb3JpZXMgaW50byB0aGUgc291cmNlIGZpbGVzIGFuZCBhZGQgZGVidWcgY2F0ZWdvcnkgZm9yIHRoZSBibGVuZCBmdW5jdGlvbnMKKworMjAxMC0wOC0wNCAxOToyNTozMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogQ2hlY2sgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIElTTyBDODkgb3IgQzk5IGFuZCB3aGljaCBwYXJhbWV0ZXJzIGFyZSByZXF1aXJlZAorCSAgVGhpcyBmaXJzdCBjaGVja3Mgd2hhdCBpcyByZXF1aXJlZCBmb3IgSVNPIEM5OSBzdXBwb3J0IGFuZCBzZXRzIHRoZSByZWxldmFudAorCSAgY29tcGlsZXIgcGFyYW1ldGVycyBhbmQgaWYgbm8gQzk5IGNvbXBpbGVyIGlzIGZvdW5kLCBpdCBjaGVja3MgZm9yIGEKKwkgIEM4OSBjb21waWxlci4gVGhpcyBlbmFibGVzIHVzIHRvIGNoZWNrIGZvciBhbmQgdXNlIEM4OS9DOTkgZnVuY3Rpb25zCisJICB0aGF0IGdjYyBoaWRlcyBmcm9tIHVzIHdpdGhvdXQgdGhlIGNvcnJlY3QgY29tcGlsZXIgcGFyYW1ldGVycy4KKworMjAxMC0wNy0xNSAxMDoxMDozMSArMDIwMCAgUGhpbGlwcGUgTm9ybWFuZCA8cG5vcm1hbmRAaWdhbGlhLmNvbT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiB1c2UgR19UWVBFX0RFRklORSB0byBkZWZpbmUgcmluZyBidWZmZXIgdHlwZQorCSAgVGhlIGV4aXN0aW5nIGdldF90eXBlKCkgaW1wbGVtZW50YXRpb24gaXMgcmFjeSwgYW5kIHRoZQorCSAgZ190eXBlX2NsYXNzX3JlZigpIHdvcmthcm91bmQgZGlkbid0IGFjdHVhbGx5IHdvcmsgYmVjYXVzZQorCSAgaXQgd2FzIGluIHRoZSB3cm9uZyBmdW5jdGlvbi4gU2luY2UgY2xhc3MgY3JlYXRpb24gaW4gR09iamVjdAorCSAgaXMgdGhyZWFkLXNhZmUgdGhlc2UgZGF5cyAoc2luY2UgMi4xNiksIHRoZSBjbGFzc19yZWYgd29ya2Fyb3VuZAorCSAgaXMgbm8gbG9uZ2VyIG5lZWRlZCBhbmQgaXQgaXMgc3VmZmljaWVudCB0byBlbnN1cmUgdGhlIF9nZXRfdHlwZSgpCisJICBmdW5jdGlvbiBpcyB0aHJlYWQtc2FmZSwgd2hpY2ggR19UWVBFX0RFRklORSBkb2VzLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYyNDMzOAorCisyMDEwLTA4LTA0IDE1OjIwOjQyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBQb3N0IENMT0NLLUxPU1QvQ0xPQ0stUFJPVklERSB3aGVuIGdvaW5nIHRvL2Zyb20gUkVBRFkKKwkgIE90aGVyd2lzZSB0aGUgY2xvY2tzIGFyZSByZWRpc3RyaWJ1dGVkIGV2ZXJ5IHRpbWUgdGhlIHBpcGVsaW5lCisJICBnb2VzIHRvIFBBVVNFRCwgd2hpY2ggaXMgcXVpdGUgZXhwZW5zaXZlLgorCisyMDEwLTA3LTEyIDEyOjM1OjE1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5oOgorCSAgcnRwbXA0Z3BheTogaW1wbGVtZW50IHBlcmZlY3QgdGltZXN0YW1wcworCSAgVXNlIGJpdHJlYWRlciBmb3IgcGFyc2luZyB0aGUgY29uZmlnIHN0cmluZworCSAgUmVzZXQgc3RhdGUgdmFyaWFibGVzIHdoZW4gZ29pbmcgdG8gUkVBRFkKKwkgIFBhcnNlIGZyYW1lIGxlbmd0aCBhbmQgdXNlIGl0IHRvIGtlZXAgdHJhY2sgb2YgdGhlIHJ0cHRpbWVzdGFtcHMKKworMjAxMC0wNy0wOSAxNDowNzo0OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJICBydHBoMjYzcGRlcGF5OiBhbGxvdyBtb3JlIGNsb2NrLXJhdGVzIGFzIGlucHV0CisJICBBbHRob3VnaCB0aGUgc3BlYyBzYXlzIHRoYXQgdGhlIGNsb2NrLXJhdGUgc2hvdWxkIGFsd2F5cyBiZSA5MDAwMCwgc29tZSBydHNwCisJICBzZXJ2ZXJzIHNlbmQgZGlmZmVyZW50IGNsb2NrLXJhdGVzIHNvIHdlIG11c3QgYWNjZXB0IHRoZW4gaW4gb3JkZXIgdG8gaGFuZGxlCisJICB0aG9zZSBzdHJlYW1zIHRvby4KKworMjAxMC0wNy0wNiAxOTowMjoxNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSAgTDE2ZGVwYXk6IGRlZmF1bHQgdG8gMSBjaGFubmVsCisJICBXaGVuIHdlIGNhbid0IGZpbmQgYW55IGNoYW5uZWwgb3IgZW5jb2RpbmctcGFyYW1zIG9uIHRoZSBjYXBzIGZvciBkeW5hbWljCisJICBwYXlsb2FkIHR5cGVzLCBzZXQgdGhlIGRlZmF1bHQgbnVtYmVyIG9mIGNoYW5uZWxzIHRvIDEsIGFzIHRoZSBzcGVjIHNheXMgd2UKKwkgIHNob3VsZC4KKwkgIFNlZSAjNjIzMjA5CisKKzIwMTAtMDctMDYgMTg6MjI6MjQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRvbid0IHJldXNlIHVkcCBzb2NrZXRzCisJICBEb24ndCByZXVzZSBzb2NrZXRzIGJ1dCBtYWtlIHRoZSB1ZHBzcmMgZWxlbWVudCBmYWlsIHRoZSBzdGF0ZSBjaGFuZ2Ugd2hlbiB0aGUKKwkgIHNvY2tldCBpcyBhbHJlYWR5IGluIHVzZS4gSWYgd2UgZG9uJ3QgcHJldmVudCByZXVzZSwgd2UgbWlnaHQgZW5kIHVwIHVzaW5nIHRoZSBzYW1lCisJICBwb3J0IGZvciBkaWZmZXJlbnQgc3RyZWFtcyBpbiBzb21lIGNhc2VzLgorCSAgRml4ZXMgIzYyMjAxNworCisyMDEwLTA3LTA2IDE4OjExOjIxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkgIHVkcHNyYzogYWRkIHByb3BlcnR5IHRvIGVuYWJsZSBwb3J0IHJldXNlCisKKzIwMTAtMDctMDUgMTA6MjM6MzcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkgIEwxNmRlcGF5OiB1c2UgZW5jb2RpbmctcGFyYW1zIGZvciB0aGUgY2hhbm5lbHMKKwkgIFdoZW4gcGFyc2luZyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLCB1c2UgdGhlIGVuY29kaW5nLXBhcmFtcyBwcm9wZXJ0eSBmcm9tIHRoZQorCSAgUlRQIGNhcHMgYmVjYXVzZSB0aGF0IGlzIHdoZXJlIHdlIGNhbiBmaW5kIHRoZSBjaGFubmVscyBhY2NvcmRpbmcgdG8gdGhlIHNwZWMuCisJICBGYWxsIGJhY2sgdG8gdGhlIGNoYW5uZWxzIHByb3BlcnR5IGluIHRoZSBjYXBzIHdoZW4gbmVlZGVkLgorCSAgRml4ZXMgIzYyMzIwOQorCisyMDEwLTA2LTI5IDEwOjQ2OjQxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBpbXByb3ZlIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2UKKwkgIEltcHJvdmUgZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZS4KKwkgIEZpeGVzICM2MjI1NzcKKworMjAxMC0wOC0wMiAyMzoxNTo1NiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1vc3NzcmMuYzoKKwkgIGV4YW1wbGVzOiBubyBuZWVkIHRvIHNldCB0aGUgY29sb3IgZm9yIGVhY2ggZnJxLWJhbmQKKworMjAxMC0wOC0wMiAxMjo1NjoyOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5Lmg6CisJICBydHBnNzI5cGF5OiBhdm9pZCBiYXNlcnRwcGF5bG9hZCBwZXJmZWN0LXJ0cHRpbWUgbW9kZQorCSAgRzcyOSBwYWNrZXRzIG1heSBvbmx5IG9jY3VyIGludGVybWl0dGVudGx5IChlLmcuIGNuIHBhY2tldHMpLCBhbmQgYXMgc3VjaAorCSAgZG8gbm90IGFsbG93IGZvciBwZXJmZWN0LXJ0cHRpbWUgY2FsY3VsYXRpbmcgcnRwIHRpbWVzIGJhc2VkIG9uIGZyYW1lIG9yIGJ5dGUKKwkgIGNvdW50LiAgSW4gcGFydGljdWxhciwgZG8gbm90IHVzZSBydHAgYXVkaW8gYmFzZSBwYXlsb2FkZXIgYXMgYmFzZSBjbGFzcywgYnV0CisJICByYXRoZXIgYmFzZSBwYXlsb2FkZXIgZGlyZWN0bHkuCisKKzIwMTAtMDgtMDIgMTI6NDg6MDIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IGZpeCBlbGVtZW50IGxlYWsKKworMjAxMC0wOC0wMiAxMjo0Njo0MSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJICBydHBtcDR2ZGVwYXk6IGZpeCBidWZmZXIgbGVhaworCisyMDEwLTA4LTAyIDEyOjQ2OjIwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHRlc3RzOiBydHAgcGF5bG9hZGluZzogZml4IHBhZCBsZWFrCisKKzIwMTAtMDctMjkgMTc6MTg6MTEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogcHVzaCBtb2RlOyB1c2UgcHJvcGVyIG1vdmkgb2Zmc2V0IGZvciBtb3ZpIGJhc2VkIGluZGV4CisJICBGaXhlcyAjNjIzMzU3LgorCisyMDEwLTA3LTI5IDEwOjAwOjE1IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSAgcXRkZW11eDogQ29ycmVjdGx5IHBhcnNlIG12aGQgYXRvbXMKKwkgIFBhcnNlIG12aGQgZGF0YSBhY2NvcmRpbmcgdG8gaXRzIHZlcnNpb24gdG8gYXZvaWQgZmFpbGluZworCSAgb24gdmFsaWQgZmlsZXMuCisKKzIwMTAtMDctMjggMTI6MjE6NDEgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBGaXggdGhlIG1heC9hdmcgaW4gYnRydCBhdG9tIHJlYWRpbmcKKwkgIEFjY29yZGluZyB0byBJU08gbWVkaWEgYmFzZSBmb3JtYXQsIHRoZSBtYXggYml0cmF0ZSBpcyB0aGUKKwkgIGZpcnN0IG9uZSwgYW5kIHRoZSBhdmcgY29tZXMgbmV4dC4KKworMjAxMC0wNy0yNyAxNTo1ODowMiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogcHJvcGVyIGhhbmRsaW5nIG9mIHN0cmVhbWluZyB1cHN0cmVhbSB3aXRob3V0IGR1cmF0aW9uCisJICBGaXhlcyAjNjI1MzcxLgorCisyMDEwLTA3LTI2IDE4OjMzOjA5ICswMjAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBpbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHRvIGZpeCBjb21waWxlciB3YXJuaW5ncyBvbiBPU1ggYnVpbGQgYm90CisKKzIwMTAtMDctMjYgMTg6MTU6MjUgKzAyMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGNvcnJlY3RseSBjaGVjayB3aGF0IHZlcnNpb24gb2YgZ3N0LXBsdWdpbnMtYmFzZSB3ZSdyZSBjb21waWxpbmcgYWdhaW5zdAorCSAgV2UgbmVlZCB0byBjaGVjayB0aGUgZ3N0LXBsdWdpbnMtYmFzZSB2ZXJzaW9uLCBub3QgdGhlIGNvcmUgdmVyc2lvbgorCSAgKGV2ZW4gaWYgYm90aCBzaG91bGQgYmUgdGhlIHNhbWUgaW4gYW55IHNhbmUgc2V0dXApLgorCisyMDEwLTA3LTI2IDE3OjQ1OjQyICswMjAwICBBcm5hdWQgVnJhYyA8cmF3b3VsIGF0IGdtYWlsLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogYWRkIHBvcnQtcmFuZ2UgcHJvcGVydHkgdG8gcnRzcHNyYworCSAgVG8gc3VwcG9ydCBzZXR1cHMgd2l0aCBmaXJld2FsbC9pcHNlYywgaXQgaXMgdXNlZnVsIGZvciBhbiBydHNwIGNsaWVudCB0byBiZQorCSAgYWJsZSB0byBzZXQgdGhlIHJhbmdlIG9mIHBvcnRzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHJ0cC9ydGNwIHJlY2VwdGlvbi4KKwkgIEFsbG93cyB0aGlzIGJ5IGFkZGluZyBhICJwb3J0LXJhbmdlIiBwcm9wZXJ0eSB0byB0aGUgcnRzcHNyYyBlbGVtZW50LgorCSAgRml4ZXMgIzYyNTE1MworCisyMDEwLTA3LTI2IDEzOjM4OjMxICswMjAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdW1vdGlvbi5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHNldCB0aGUgcGl4ZWwtYXNwZWN0LXJhdGlvIGZpZWxkIGFsc28gZm9yIHBhcj0xLzEKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MjUzMDIKKworMjAxMC0wNy0yNiAxNTozMToxNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IG1lbW9yeSBsZWFrIGluIHNlcnZlciByZXF1ZXN0IHJlcGx5CisJICBUaGUgUlRTUCBzZXJ2ZXIgcnRzcHNyYyBpcyBjb21tdW5pY2F0aW5nIHdpdGgsIHNlbmRzIGEgR0VUX1BBUkFNRVRFUiByZXF1ZXN0CisJICBwZXJpb2RpY2FsbHkgYXMgYSBwaW5nLiAgVGhlIGNvZGUgaW4gZ3N0X3J0c3BzcmNfaGFuZGxlX3JlcXVlc3QgZm9ybXMgYW4gT0sKKwkgIHJlc3BvbnNlIGFuZCBzZW5kcywgYnV0IGRvZXNuJ3QgY2FsbCBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0IHRvIGZyZWUgdGhlIG1lbW9yeQorCSAgYWZ0ZXIgc2VuZGluZyB0aGUgcmVzcG9uc2UuICBUaGlzIHJlc3VsdHMgaW4gYSBjb25zdGFudCBzbG93IG1lbW9yeSBsZWFrLgorCSAgRml4ZXMgIzYyNDc3MAorCisyMDEwLTA3LTI0IDIyOjM5OjU0ICswMTAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBnc3QvZGVidWd1dGlscy9jcHVyZXBvcnQuYzoKKwkgIGNwdXJlcG9ydDogcmVtb3ZlIGJvZ3VzIGRvY3MKKworMjAxMC0wNy0yNCAyMjozNzoxMSArMDEwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogZ3N0L2RlYnVndXRpbHMvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWd1dGlscy9jcHVyZXBvcnQuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2NwdXJlcG9ydC5oOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0ZGVidWcuYzoKKwkgIGRlYnVndXRpbHM6IG5ldyBlbGVtZW50IGNwdXJlcG9ydAorCSAgY3B1cmVwb3J0IHBvc3RzIGJ1cyBtZXNzYWdlcyBhZnRlciBldmVyeSBidWZmZXIgcmVjZWl2ZWQgb2YgY3B1IHVzZWQsIHN5c3RlbQorCSAgY2xvY2sgdGltZSwgYnVmZmVyIHRpbWUKKworMjAxMC0wNy0yNCAxMDoyOTowMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL2VxdWFsaXplci9kZW1vLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1vc3NzcmMuYzoKKwkgIGV4YW1wbGVzOiBEZXN0cm95IHRoZSBjYWlybyBjb250ZXh0IGFmdGVyIHVzYWdlCisKKzIwMTAtMDctMjQgMTA6MjE6MDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvZ2RrX3BpeGJ1Zi9NYWtlZmlsZS5hbToKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5jOgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzoKKwkgIFJldmVydCAiZ2RrcGl4YnVmOiBBZGQgYSBnZGtwaXhidWYzIHBsdWdpbiB0aGF0IHVzZXMgZ2RrcGl4YnVmMyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgYjY3ODgxNTMxNjFiNGUwN2ZiZjNkNDJhMmQ4OTIxZWEwNDkzMDVkMC4KKwkgIFRoZXJlJ3Mgbm8gZ2RrLXBpeGJ1ZjMgYW55bW9yZS4gZ2RrLXBpeGJ1ZiB3YXMgc2VwYXJhdGVkIGZyb20gR1RLKworCSAgYW5kIHdpbGwgc3RheSBhdCB2ZXJzaW9uIDIuMCBmb3IgR1RLKyAzLjAuCisKKzIwMTAtMDctMjQgMTA6MTk6MzcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tb3Nzc3JjLmM6CisJICBleGFtcGxlczogVXNlIGNhaXJvIGluc3RlYWQgb2YgdG8tYmUtZGVwcmVjYXRlZCBHREsgQVBJCisJICBGaXhlcyBidWcgIzYyNTAwMi4KKworMjAxMC0wNy0yMiAxNjoyNDo0MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWNkZWM6IGZpeCBldmVudCBsZWFrCisKKzIwMTAtMDctMjIgMTI6MDU6MjYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgbWF0cm9za2FkZW11eDogcHVsbCBtb2RlIG5vbi1jdWUgc2Vla2luZworCSAgVGhhdCBpcywgaW4gZmlsZXMgdGhhdCBoYXZlIG5vIGluZGV4IChDdWUpLCBwZXJmb3JtIHNlZWsgYnkgc2Nhbm5pbmcgZm9yCisJICBuZWFyZXN0IGNsdXN0ZXIgd2l0aCB0aW1lY29kZSBiZWZvcmUgcmVxdWVzdGVkIHBvc2l0aW9uLiAgU2Nhbm5pbmcgaXMgZG9uZQorCSAgYXMgYSBjb21iaW5hdGlvbiBvZiBpbnRlcnBvbGF0aW9uIGFuZCBzZXF1ZW50aWFsIHNjYW4uCisJICBGaXhlcyAjNjE3MzY4LgorCisyMDEwLTA3LTE2IDEyOjQ2OjUwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHN0cmVhbWFibGUgZmlsZXMgbmVlZCBubyBfZmluaXNoCisJICBGaXhlcyAjNjI0NDU1LgorCisyMDEwLTA3LTIyIDExOjQ2OjM1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHB1c2ggbW9kZTsgaGFuZGxlIDAtc2l6ZSBkYXRhIGNodW5rcworCSAgRml4ZXMgIzYxODUzNS4KKworMjAxMC0wNy0yMSAwODoxMToyMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIHZpZGVvbWl4ZXI6IE9ubHkgcmVzZXQgUW9TIGluZm9ybWF0aW9uIGFuZCBzZW5kIGEgTkVXU0VHTUVOVCBldmVudCBkb3duc3RyZWFtIGZvciBORVdTRUdNRU5UIGV2ZW50cyBvbiB0aGUgbWFzdGVyIHBhZAorCisyMDEwLTA3LTE0IDIwOjMxOjQ0IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlYnVndXRpbHMvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzZGVidWcuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNkZWJ1Zy5oOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0ZGVidWcuYzoKKwkgIGNhcHNkZWJ1ZzogQWRkIG5ldyBlbGVtZW50CisKKzIwMTAtMDctMjAgMTY6MTE6MjUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogZGVtb3RlIFdBUk5JTkcgbWVzc2FnZSB0byBMT0cgbGV2ZWwKKwkgIEl0J3Mgbm90IGEgd2FybmluZy4KKworMjAxMC0wNy0xOSAxNDo0NzozMiAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IEZpeCByZWdyZXNzaW9uIG9uIG1hcmtlcnMgcGFyc2luZworCSAgRml4ZXMgYSByZWdyZXNzaW9uIGludHJvZHVjZWQgd2hlbiBmaXhpbmcgYnVnICM1ODMwNDcgaW4KKwkgIGNvbW1pdCBhMzkxYmY1MmNjM2M1ODBjN2EwYTIzMTZjYTUyZWI2NmRhM2I4NWMxCisJICBTa2lwIHRoZSBkYXRhIHdoZW4gbGlianBlZyBhc2tzIGl0IHRvIGJlIHNraXBwZWQgb24KKwkgIG9uZSBvZiBpdHMgY2FsbGJhY2tzLgorCisyMDEwLTA3LTE2IDE4OjA0OjQ0ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBhZGQgbWlzc2luZyBhcmd1bWVudCBpbiBkZWJ1ZyBtZXNzYWdlCisKKzIwMTAtMDctMTYgMTc6NTM6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VtaXhlcmN0cmwuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzaW5rOiBPbmx5IHVzZSBnc3RfYXVkaW9fY2xvY2tfbmV3KCkgd2hlbiBjb21waWxpbmcgYWdhaW5zdCBuZXdlciBiYXNlCisKKzIwMTAtMDctMDkgMTc6MzM6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkgIGR2MTM5NHNyYzogUG9zdCBjbG9jay1wcm92aWRlIGFuZCBjbG9jay1sb3N0IG1lc3NhZ2VzIHdoZW4gZ29pbmcgZnJvbS90byBQTEFZSU5HCisJICBJbiBQQVVTRUQgYW5kIGJlbG93IHRoZSBjbG9jayBpcyBub3Qgd29ya2luZy4KKworMjAxMC0wNy0wNCAxNjo1Nzo1NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9nY29uZi9nc3Rzd2l0Y2hzaW5rLmM6CisJKiBleHQvZ2NvbmYvZ3N0c3dpdGNoc2luay5oOgorCSogZXh0L2djb25mL2dzdHN3aXRjaHNyYy5jOgorCSogZXh0L2djb25mL2dzdHN3aXRjaHNyYy5oOgorCSAgZ2NvbmY6IEZpeCByZWYgaGFuZGxpbmcgb2YgbmV3IGNoaWxkIGVsZW1lbnRzIGFuZCBtaW5vciBjbGVhbnVwCisKKzIwMTAtMDctMDQgMDk6NDU6NTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NyYy5jOgorCSAgZ2NvbmZ2aWRlb3NyYzogVXNlIGNvcnJlY3QgR0NvbmYga2V5CisKKzIwMTAtMDctMDMgMTQ6MTY6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NyYy5jOgorCSogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuaDoKKwkgIGdjb25mOiBQb3J0IGdjb25mYXVkaW9zcmMgdG8gR3N0U3dpdGNoU3JjCisKKzIwMTAtMDctMDMgMTQ6MTI6MTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NyYy5jOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zcmMuaDoKKwkgIGdjb25mOiBQb3J0IGdjb25mdmlkZW9zcmMgdG8gR3N0U3dpdGNoU3JjCisKKzIwMTAtMDctMDMgMTQ6MTE6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2NvbmYvTWFrZWZpbGUuYW06CisJKiBleHQvZ2NvbmYvZ3N0c3dpdGNoc3JjLmM6CisJKiBleHQvZ2NvbmYvZ3N0c3dpdGNoc3JjLmg6CisJICBnY29uZjogQWRkIEdzdFN3aXRjaFNyYyBiYXNlIGNsYXNzCisKKzIwMTAtMDctMDMgMTM6NTY6MzMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2NvbmYvZ3N0c3dpdGNoc2luay5jOgorCSAgZ2NvbmY6IENyZWF0ZSB0aGUgZ2hvc3RwYWQgb2YgdGhlIHN3aXRjaHNpbmsgZnJvbSB0aGUgdGVtcGxhdGUKKworMjAxMC0wNy0wNyAxMDoxMDo1MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogUG9zdCBjbG9jay1wcm92aWRlL2Nsb2NrLWxvc3Qgd2hlbiBnb2luZyB0by9mcm9tIFBBVVNFRAorCSAgQWxzbyB1c2UgZ3N0X2F1ZGlvX2Nsb2NrX25ld19mdWxsKCkgdG8gcHJldmVudCBjcmFzaGVzIHdoZW4gdGhlCisJICBjbG9jayBpcyB1c2VkIGFmdGVyIHRoZSBlbGVtZW50IHdhcyBkZXN0cm95ZWQuCisKKzIwMTAtMDctMTUgMTE6NDk6MDMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IHJlbW92ZSBib2d1cyBVTkxPQ0sKKworMjAxMC0wNy0xMyAxMjozNDo0NCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFsc28gY2FsY3VsYXRlIFBBUiB1c2luZyB0cmFjayB3aWR0aCBhbmQgaGVpZ2h0IGZvciBRVCBmaWxlcworCSAgKC4uLiBhcyBvcHBvc2VkIHRvIG9ubHkgZm9yIElTTyBzdHlsZSBmaWxlcykuCisJICBGaXhlcyAjNjI0MTczLgorCisyMDEwLTA3LTEyIDE3OjI5OjEyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBoYW5kbGUgYm9ndXMgZmlsZXMgc3RvcmluZyBBRFRTIEFBQyBkYXRhCisKKzIwMTAtMDctMDkgMTY6NTc6MzMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGRvIG5vdCBlcnJvciBvdXQgb24gYSBibG9jayB3aXRoIHVua25vd24gdHJhY2tudW1iZXIKKworMjAxMC0wNy0wOCAxODo1NzoyMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRvIG5vdCBhbGlnbiByZXZlcnNlIHBsYXliYWNrIHJlZmVyZW5jZSBzdHJlYW0gdHdpY2UKKwkgIFRpbWVzdGFtcCByb3VuZGluZyBpc3N1ZXMgY291bGQgbGVhZCB0byBnb2luZyBiYWNrd2FyZHMgMiBrZXlmcmFtZSBwZXJpb2RzCisJICAocmF0aGVyIHRoYW4gb25seSAxKS4gIFdoaWxlIHRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IGEgcHJvYmxlbSwgaXQgbWlnaHQKKwkgIHBvdGVudGlhbGx5IHBsYWNlIGFkZGl0aW9uYWwgKGJ1ZmZlcmluZykgbG9hZCBvbiBkb3duc3RyZWFtIGFuZCBjb3VsZCBiZQorCSAgYXZvaWRlZCAoYmVjYXVzZSBXZSBDYW4pLgorCSAgRml4ZXMgIzYyMzYyOS4KKworMjAxMC0wNy0wOCAxNjowNzoxNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGNvbnZlcnQgc29tZSBtb3JlIG1vdiBmb3JtYXQgdGltZXN0YW1wIHRvIGdzdCB0aW1lCisKKzIwMTAtMDctMDcgMTQ6MTY6NTkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogYWRkaXRpb25hbCB2ZXJpZmljYXRpb24gaGV1cmlzdGljcyBmb3IgVkJSIGF1ZGlvIHN0cmVhbQorCSAgQ2hlY2sgZm9yIGFuZCBvdmVycmlkZSBzb21lIGhlYWRlciBmaWVsZChzKSBmb3IgcmVhc29uYWJsZSB2YWx1ZXMsIGFjY29yZGluZworCSAgdG8gbGF0ZXIgZXhwZWN0ZWQgdXNlIGluIGNhbGN1bGF0aW9ucy4KKworMjAxMC0wNy0xNCAxNToyMToyMSArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZEBnbWFpbC5jb20+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkgIHZpZGVvYmFsYW5jZTogRml4IHdyb25nIGxvY2sgb3JkZXIgdGhhdCBjb3VsZCBsZWFkIHRvIGEgZGVhZGxvY2suIEZpeGVzICM2MjQzMzEuCisKKzIwMTAtMDctMTYgMTE6MzE6MDggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgQmFjayB0byBkZXZlbG9wbWVudAorCis9PT0gcmVsZWFzZSAwLjEwLjI0ID09PQorCisyMDEwLTA3LTE1IDAxOjQ5OjA0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMC4xMC4yNAorCisyMDEwLTA3LTE1IDAxOjM1OjA2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vY3MucG86CisJKiBwby9sdi5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTAtMDctMDcgMDA6NDI6NDYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIDAuMTAuMjMuNCBwcmUtcmVsZWFzZQorCisyMDEwLTA3LTA3IDAwOjMxOjE3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vTElOR1VBUzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vaWQucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3NsLnBvOgorCSogcG8vdHIucG86CisJKiBwby96aF9DTi5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTAtMDYtMjMgMTE6NDc6NDMgKzAyMDAgIE1pY2hhZWwgR3J6ZXNjaGlrIDxtLmdyemVzY2hpa0BwZW5ndXRyb25peC5kZT4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiBkZXN0cm95IGJ1ZmZlciBwb29sIHdoZW4gY2hhbmdpbmcgc3RhdGUgdG8gTlVMTAorCSAgSW4gdGhlIGNhc2Ugd2UgY2hhbmdlIHRoZSBTdGF0ZSBmcm9tIFJFQURZX1RPX05VTEwgdGhlIGJ1ZmZlcnMgaW4gdGhlIHBvb2wKKwkgIHN0aWxsIGhvbGQgYW4gb3BlbiBkdXAgZmlsZSBkZXNjcmlwdG9yIHRvIHRoZSBkZXZpY2UsIHRoZXJlZm9yZSB0aGUgZGV2aWNlCisJICByZWxlYXNlIGZ1bmN0aW9uIHdpbGwgbm90IGJlIGNhbGxlZCBhbmQgdGhlIGRldmljZSB3aWxsIHByb2JhYmx5IGFuc3dlciB3aXRoCisJICAtRUJVU1kgd2hlbiB3ZSByZW9wZW4gaXQgaW4gdGhlIG5leHQgTlVMTF9UT19SRUFEWSB0cmFuc2l0aW9uLgorCSAgU2lnbmVkLW9mZi1ieTogTWljaGFlbCBHcnplc2NoaWsgPG0uZ3J6ZXNjaGlrQHBlbmd1dHJvbml4LmRlPgorCSAgU2VlIGJ1ZyAjNjIyNTAwIGFuZCAjNjEyMjQ0LgorCisyMDEwLTA3LTA2IDEzOjIxOjE5ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IG9yZGVyIG9mIGJpdHJhdGVzIGluICdidHJ0JyBhdG9tCisJICBUaGVyZSBzZWVtcyB0byBiZSBhIGJ1ZyBpbiBsaWJtcDR2MiB0aGF0IGdlbmVyYXRlcyBhIE1QRUc0Qml0UmF0ZUJveCBhcworCSAgKGJ1ZmZlclNpemVEQiwgYXZnQml0cmF0ZSwgbWF4Qml0cmF0ZSkgaW5zdGVhZCBvZiAoYnVmZmVyU2l6ZURCLAorCSAgbWF4Qml0cmF0ZSwgYXZnQml0cmF0ZSksIGFjY29yZGluZyB0byB0aGUgc3BlYy4gSSB1c2VkIHRoZSBtcDRmaWxlCisJICBvdXRwdXQgd2hpbGUgd3JpdGluZyB0aGlzIGNvZGUsIHNvIHRoZSBvcmRlciBpcyB3cm9uZy4gVGhpcyBwYXRjaGVzCisJICBmaXhlcyB0aGF0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYyMzY1NAorCisyMDEwLTA3LTA1IDEyOjA1OjU3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogZml4IHNraXBwaW5nIGV4dHJhIDB4ZmYgbWFya2VycworCSAgRml4ZXMgIzYyMzU4NS4KKworMjAxMC0wNi0yOSAyMzoxODoyMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkgIGpwZWdkZWM6IGZpeCBtZW1vcnkgbGVhaworCSAgRG9uJ3QgbGVhayByZXN1bHQgb2YgZ3N0X2FkYXB0ZXJfdGFrZSgpLiBUaGVyZSBhcmUgbW9zdCBsaWtlbHkKKwkgIHNtYXJ0ZXIgdGhpbmdzIHdlIGNhbiBkbywgYnV0IGxldCdzIGtlZXAgdGhpbmdzIHNpbXBsZSBmb3IgdGhlCisJICByZWxlYXNlLgorCSAgRml4ZXMgIzYyMzE3Mi4KKworMjAxMC0wNy0wMiAxMjozMTozMSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc3RyaXAgb3V0IGJvZ3VzIHRhZ3MgZnJvbSBYTVAgYXRvbQorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYyMzM2NgorCisyMDEwLTA3LTAyIDE0OjI1OjIyICswMjAwICBBbmRyemVqIEsuIEhhY3pld3NraSA8YWhhY3pld3NraUBnbWFpbC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IFdyaXRlIGR1cmF0aW9uIGF0IHRoZSBjb3JyZWN0IHBvc2l0aW9uCisKKzIwMTAtMDYtMzAgMTE6MTI6MDggKzAyMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkgIHJ0cHB0ZGVtdXg6IGZpeCBtZW1sZWFrIG9uIGN1c3RvbSBkb3duc3RyZWFtIGV2ZW50cworCSAgYnkgbm90IHNlbmRpbmcgY3VzdG9tIGRvd25zdHJlYW0gZXZlbnQgdHdpY2UgYW5kIGZpeCBtZW1sZWFrIHdoZW4KKwkgIG5vdCBoYW5kbGluZyB0aGUgZXZlbnQKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MjMxOTYKKworMjAxMC0wNi0yOSAyMDoxODo1MSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjIzLjMgcHJlLXJlbGVhc2UKKworMjAxMC0wNi0yOSAyMDoxNDo1MyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IGZpeCB1bnBvcnRhYmxlIHByaW50ZiBmb3JtYXQgc3BlY2lmaWVycyBpbiBjb21tZW50ZWQgb3V0IGNvZGUKKwkgIFRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlcyB3aGVuIGdyZXBwaW5nIGZvciB1bnBvcnRhYmxlIHNwZWNpZmllcnMuCisKKzIwMTAtMDYtMjkgMTk6MTI6MzYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGZpeCAtLWRpc2FibGUtZXh0ZXJuYWwKKworMjAxMC0wNi0yOCAxNTo0NDowNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGF1dG9nZW4uc2g6CisJKiBjb25maWd1cmUuYWM6CisJICBCdW1wIGF1dG9tYWtlIHJlcXVpcmVtZW50IHRvIDEuMTAgYW5kIGF1dG9jb25mIHRvIDIuNjAKKwkgIEZvciBtYWludGFpbmFiaWxpdHkgcmVhc29ucyBhbmQgJChidWlsZGRpcikuCisJICBTZWUgIzYyMjk0NC4KKworMjAxMC0wNi0yOCAwOTowNzo1OCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9nb29tL3BsdWdpbl9pbmZvLmM6CisJICBnb29tOiBkb24ndCBhbGxvY2F0ZSAyNjBrQiBzdHJ1Y3Qgb24gdGhlIHN0YWNrCisJICBQbHVnaW5JbmZvIGlzIHF1aXRlIGEgc2l6ZWFibGUgc3RydWN0LCBsZXQncyBub3QgYWxsb2NhdGUgaXQgb24gdGhlCisJICBzdGFjaywgZXNwZWNpYWxseSBub3QgaWYgd2UncmUgY29weWluZyBpdCBvdmVyIGludG8gYW5vdGhlciBkeW5hbWljYWxseQorCSAgYWxsb2NhdGVkIGNvcHkgYW55d2F5LgorCSAgRml4ZXMgIzU3MDc2MS4KKworMjAxMC0wNi0yNyAxMDozMToxNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogUmVxdWlyZSBHVEsrID49IDIuMTQgZm9yIHRoZSBleGFtcGxlcworCisyMDEwLTA2LTI2IDIwOjEyOjI1ICswMjAwICBHdWlkbyBHw7xudGhlciA8YWd4QHNpZ3hjcHUub3JnPgorCisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tb3Nzc3JjLmM6CisJICBleGFtcGxlczogTWFrZSBkZW1vcyAtRFNFQUwgc2FmZSB0byBmaXggYnVpbGQgd2l0aCBHVEsrIDMuMAorCisyMDEwLTA2LTI2IDIxOjM5OjM0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvTWFrZWZpbGUuYW06CisJICBqcGVnOiBFeHBsaWNpdGVseSBsaW5rIHdpdGggbGliZ3N0YmFzZQorCisyMDEwLTA2LTI2IDE4OjQyOjI5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgMC4xMC4yMy4yIHByZS1yZWxlYXNlCisKKzIwMTAtMDYtMjYgMTg6NDE6NDkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLWRpc3QuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5oOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLWRpc3QuYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy1kaXN0Lmg6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0LmM6CisJICBnc3Q6IHVwZGF0ZSBvcmMgZmlsZXMKKworMjAxMC0wNi0yNiAxODo0MTozOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTAtMDYtMjUgMTk6NDA6MDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogRml4IGxlYWtpbmcgb2YgdGhlIHN0cmVhbWhlYWRlciBidWZmZXJzCisJICBnc3RfdmFsdWVfc2V0X2J1ZmZlcigpIGluY3JlYXNlcyB0aGUgcmVmY291bnQgYW5kIGRvZXNuJ3QKKwkgIHRha2Ugb3duZXJzaGlwIG9mIHRoZSBidWZmZXIuCisKKzIwMTAtMDYtMjQgMTY6MzI6MjMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIG1hdHJvc2thLCB2aWRlb2JveCwgdmlkZW9maWx0ZXI6IGZpeCBjb21waWxlciB3YXJuaW5ncyB3aGVuIGRlYnVnZ2luZyBpcyBkaXNhYmxlZCBpbiBnc3RyZWFtZXIKKwkgIEZpeGVzIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5ncyB3aGVuIEdTdHJlYW1lcidzIGRlYnVnZ2luZyBzeXN0ZW0gaGFzIGJlZW4gZGlzYWJsZWQuCisKKzIwMTAtMDYtMjQgMTU6MTc6MTEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBhZGQgcGx1Z2luIGxvYWRpbmcgd2hpdGVsaXN0IHRvIHRlc3QgZW52aXJvbm1lbnQKKwkgIE9ubHkgd2FudCB0byBsb2FkIGNvcmUvYmFzZS9nb29kIHBsdWdpbnMgaGVyZS4KKwkgIEZpeGVzICM2MTk3MTcuCisKKzIwMTAtMDYtMjQgMTU6MDk6MTYgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDczZmY5M2EgdG8gYTUxOTU3MQorCisyMDEwLTA2LTI0IDEzOjAyOjA0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJICBnZGtwaXhidWZkZWM6IGJ1bXAgcmFuayB0byBTRUNPTkRBUlkKKwkgIEJ1bXAgZ2RrcGl4YnVmZGVjJ3MgcmFuayB0byBTRUNPTkRBUlkgdG8gZ2l2ZSBpdCBhbiBlZGdlIG92ZXIgbWlzYy4KKwkgIGltYWdlIGRlY29kZXJzIGluIGdzdC1mZm1wZWcgdGhhdCBhbHNvIGhhdmUgYSBNQVJHSU5BTCByYW5rLgorCSAgRml4ZXMgIzYyMDE2Mi4KKworMjAxMC0wNi0yMyAxMjoxNToxMyArMDIwMCAgTWljaGFlbCBHcnplc2NoaWsgPG0uZ3J6ZXNjaGlrQHBlbmd1dHJvbml4LmRlPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICByZXNldCB0aGUgaGF2ZV9pbmRleCBmbGFnIGF0IHRyYW5zaXRpb24gUEFVU0VEX1RPX1JFQURZCisJICBJZiB3ZSByZXN0YXJ0IHRoZSBTdHJlYW0gaW4gdGhlIGNhc2Ugb2YgZG9pbmcgYSB0cmFuc2l0aW9uIGZyb20KKwkgIFBBVVNFRF9UT19SRUFEWSBhbmQgYmFjayB3aXRoIFJFQURZX1RPX1BBVVNFRCBhc28uIHRoZSBkdXJhdGlvbiBvZiB0aGUgdmlkZW8KKwkgIHdpbGwgZ2V0IGNhbGN1bGF0ZWQgZXZlbiBpZiB3ZSBoYXZlIGEgYXZpIGhlYWRlciB3aXRoIHRoYXQgaW5mb3JtYXRpb24uCisJICBTaWduZWQtb2ZmLWJ5OiBNaWNoYWVsIEdyemVzY2hpayA8bS5ncnplc2NoaWtAcGVuZ3V0cm9uaXguZGU+CisKKzIwMTAtMDYtMjMgMjA6Mjk6MTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBGaXggbmVnb3RpYXRpb24gZm9yIEk0MjAvWVYxMgorCSAgV2UgZG9uJ3Qgc3VwcG9ydCBjb252ZXJzaW9uIGludG8gKmFsbCogWVVWCisJICBmb3JtYXRzIGZvciB0aGVtLCBvbmx5IGludG8gSTQyMC9ZVjEyL0FZVVYuCisJICBGaXhlcyBidWcgIzYyMjUwMS4KKworMjAxMC0wNi0yMiAxNToyMjo0NCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IHByb3BlciBjbG9zaW5nIHNlZ21lbnQgY29uc3RydWN0aW9uCisJICBGaXhlcyAjNjE4OTgyLgorCisyMDEwLTA2LTIyIDE1OjQ2OjUxICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDI6IHByZWNhbGN1bGF0ZSBkdXJhdGlvbgorCSAgSGF2ZSBmcmFtZSBkdXJhdGlvbiBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0IGFuZCBjYWxjdWxhdGUgaXQgYWZ0ZXIgY2hhbmdpbmcgdGhlIGNhcHMuCisKKzIwMTAtMDYtMjEgMTI6MTc6MzkgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkgIHY0bDJzaW5rOiB1c2UgZ2xpYiBkZWZpbmVzIGluIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBmb3IgcmVhZGFiaWxpdHkKKworMjAxMC0wNi0yMSAxMjoxNToxNCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogdXNlIEdfUEFSQU1fU1RBVElDX1NUUklOR1MgdG8gc2F2ZSBhIGZldyBieXRlcyBhbmQgc3RyZHVwcworCisyMDEwLTA2LTE4IDIwOjAyOjQ5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggbG9ja2luZyBhZnRlciBtb3ZpbmcgdGhpbmdzIGFyb3VuZAorCisyMDEwLTA2LTE4IDE0OjEzOjU4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3RhZ2xpYi9nc3RhcGV2Mm11eC5jYzoKKwkgIHRhZ2xpYjogVXNlIG5ld2x5IGFkZGVkIGdzdF90YWdfbGlzdF9wZWVrX3N0cmluZ19pbmRleAorCSAgUmVwbGFjZSBjYWxscyB0byBnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZ19pbmRleCB3aXRoCisJICBnc3RfdGFnX2xpc3RfcGVla19zdHJpbmdfaW5kZXggdG8gYXZvaWQgYSBzdHJpbmcgY29weQorCisyMDEwLTA2LTE4IDE2OjU2OjE5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBtYWtlIHNvbWUgZXJyb3JzIGFzIHdhcm5pbmdzCisJICBBdm9pZCBzcGFtbWluZyB0aGUgdGVzdHN1aXRlIHdpdGggdGhlc2UgZXJyb3IgZGVidWcgbGluZXMuCisKKzIwMTAtMDYtMTggMTY6NDk6MDggKzAyMDAgIEtlaXRoIE5pY2hvbHNvbiA8a2VpdGgubmljaG9sc29uIGF0IHVsdHJhLWNjcy5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IGZpeCBtdWx0aWNhc3Qgc3VwcG9ydCBvbiB3aW5kb3dzIGJ1aWxkcworCSAgT24gd2luZG93cyBidWlsZHMsIHNldHMgc291cmNlIGFkZHJlc3MgZm9yIGJpbmQgdG8gSU5BRERSX0FOWSwgd2hpbGUKKwkgIG1haW50YWluaW5nIHRoZSBvcmlnaW5hbCBtdWx0aWNhc3QgZ3JvdXAgYWRkcmVzcyBmb3Igc3Vic2VxdWVudCBqb2luLgorCSAgRml4ZXMgIzU5NTk3OAorCisyMDEwLTA2LTE4IDE2OjE2OjI4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6CisJICB1ZHA6IG1ha2UgdXJsIHBhcnNpbmcgY29tcGF0aWJsZSB3aXRoIFZMQyBzeW50YXgKKwkgIFNraXAgZXZlcnl0aGluZyBiZWZvcmUgdGhlIEAgc2lnbiBpbiB0aGUgdXJsIGxvY2F0aW9uLiBWTEMgdXNlcyB0aGF0IGFzIHRoZQorCSAgcmVtb3RlIGFkZHJlc3MgdG8gY29ubmVjdCB0byAoYnV0IHdlIGlnbm9yZSBpdCBmb3Igbm93KS4gVGhpcyBtYWtlcyBvdXIgdWRwIHVybHMKKwkgIGNvbXBhdGlibGUgd2l0aCB0aGUgb25lcyB1c2VkIGJ5IFZMQy4KKwkgIEZpeGVzICM1OTc2OTUKKworMjAxMC0wNi0xOCAxNTowODoyMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogZmFjdG9yIG91dCB0aGUgY29ubmVjdGlvbnMKKwkgIEtlZXAgYSBnbG9iYWwgY29ubmVjdGlvbiBmb3IgYWdncmVnYXRlIGNvbnRyb2wgYnV0IGFsc28ga2VlcCBzdHJlYW0gY29ubmVjdGlvbnMKKwkgIGZvciBub24tYWdncmVnYXRlIGNvbnRyb2wuCisJICBBZGQgc29tZSBoZWxwZXIgbWV0aG9kcyB0byBjb25uZWN0L2Nsb3NlL2ZsdXNoIHRoZSBjb25uZWN0aW9ucy4KKworMjAxMC0wNi0xNyAxMzowNjo1NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYWRkIG5vbi1hZ2dyZWdhdGUgY29udHJvbAorCSAgQWRkIG5vbi1hZ2dyZWdhdGUgY29udHJvbC4KKwkgIFNlcGFyYXRlIHJldHJpZXZpbmcgdGhyIFNEUCBmcm9tIHBhcnNpbmcgYW5kIHNldHRpbmcgdXAgdGhlIHN0cmVhbWluZyBmcm9tIHRoZQorCSAgU0RQLgorCisyMDEwLTA2LTE3IDIyOjEwOjAzICswMTAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBjb21tb246CisJICBjb21tb246IHVwZGF0ZSBjb21tb24gYmFjayB0byB3aGF0IGl0IHdhcworCisyMDEwLTA2LTE3IDE3OjI0OjIyICswMTAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBjb21tb246CisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBhZGQgZG9jdW1lbnRhdGlvbiBmb3Igc3RyZWFtYWJsZSBwcm9wZXJ0eQorCisyMDEwLTA2LTE3IDE2OjQzOjQ0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzNC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkgIGRvY3M6IHVwZGF0ZSBpbnRyb3NwZWN0ZWQgcGx1Z2luIGRvY3MgZm9yIGdzdGRvYy1zY2FuZ29iaiBhbmQgb3RoZXIgY2hhbmdlcworCSAgVXBkYXRlIGNvbW1vbiBmb3IgbGF0ZXN0IGdzdGRvYy1zY2FuZ29iaiwgYW5kIGluc3BlY3QgeG1sIGZpbGVzIGZvcgorCSAgZXNjYXBpbmcgYW5kIHBhZCB0ZW1wbGF0ZSBvcmRlciBjaGFuZ2VzLgorCisyMDEwLTA2LTE3IDE2OjQxOjU2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svLmdpdGlnbm9yZToKKwkgIHRlc3RzOiBpZ25vcmUgc3ViLWRpcmVjdG9yeSB3aXRoIG9yYyB0ZXN0cworCisyMDEwLTA2LTE3IDEwOjQ0OjMzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBGaXggYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZSBjb21waWxlciB3YXJuaW5nCisKKzIwMTAtMDYtMTYgMjE6MDI6MTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJICBlYm1sLXJlYWQ6IFplcm8tc2l6ZWQgaW50cy91aW50cy9mbG9hdHMgaGF2ZSBhIHZhbHVlIG9mIDAgYWNjb3JkaW5nIHRvIHRoZSBFQk1MIHNwZWMKKworMjAxMC0wNi0xNiAyMDowMjo1OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogRml4IHBvc3NpYmxlIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSBhbmQgYXNzZXJ0aW9uIHRoYXQgY291bGQgYmUgY2F1c2VkIGJ5IGludmFsaWQgZmlsZXMKKworMjAxMC0wNi0xNiAxOTo1MDozNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogQ2xlYW4gdXAvZml4IHNvbWUgbWlub3IgZXJyb3IgaGFuZGxpbmcgYnVncworCisyMDEwLTA2LTE2IDE5OjMwOjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHhpbWFnZXNyYzogRml4IE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSB3aGVuIGFsbG9jYXRpb24gb2YgdGhlIHhpbWFnZSBmYWlscworCisyMDEwLTA2LTE2IDE5OjI4OjA0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOgorCSAgZmxhY3RhZzogRml4IHBvc3NpYmxlIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZQorCisyMDEwLTA2LTE2IDE5OjI0OjU0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9paXJmaWx0ZXIuYzoKKwkgIGF1ZGlvaWlyZmlsdGVyOiBGaXggcG9zc2libGUgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlCisKKzIwMTAtMDYtMTYgMTk6MjA6MDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6CisJICB3YXJwdHY6IERvbid0IHVzZSBmbG9hdHMgYXMgbG9vcCBjb3VudGVycworCisyMDEwLTA2LTE2IDExOjIxOjM1IC0wNDAwICBIYXZvYyBQZW5uaW5ndG9uIDxocEBwb2JveC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IGRvIG5vdCB0cnkgdG8gY2hhbmdlIGRldmljZSBmb3JtYXQgaWYgaXQncyBhbHJlYWR5IGNvcnJlY3QKKwkgIFRoaXMgYWxsb3dzIHNldF9jYXBzIHRvIHN1Y2NlZWQgaWYgY2FwcyBjaGFuZ2UgaW4gYSB3YXkgdGhhdAorCSAgd291bGQgbm90IG1vZGlmeSB0aGUgZm9ybWF0IHdlJ3JlIGdldHRpbmcgZnJvbSB0aGUgaGFyZHdhcmUuCisJICBPdGhlcndpc2UgaWYgbm90IGluIE5VTEwgc3RhdGUsIHNldHRpbmcgY2FwcyB3b3VsZCBmYWlsCisJICB3aXRoIEVCVVNZLgorCSAgV2l0aCB0aGlzIGNoYW5nZSwgaW4gc29tZSBjYXNlcyBpdCdzIE9LIHRvIGdvIFBMQVlJTkctPlJFQURZLT5QTEFZSU5HCisJICByYXRoZXIgdGhhbiBQTEFZSU5HLT5OVUxMLT5QTEFZSU5HIHRvIGF2b2lkIGEgdGltZS1jb25zdW1pbmcgY2xvc2UKKwkgIGFuZCByZW9wZW4gb2YgdGhlIGRldmljZS4KKwkgIEZpeGVzICM2MjE3MjMKKworMjAxMC0wNi0xNiAxMTowOToxNyAtMDQwMCAgSGF2b2MgUGVubmluZ3RvbiA8aHBAcG9ib3guY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBpbiBuZWdvdGlhdGUsIGNoZWNrIGZvciBlcnJvciByZXR1cm4gZnJvbSBzZXRfY2FwcworCSAgRml4ZXMgIzYyMTcyMyAgKHBhcnRpYWxseSkKKwkgIHNldF9jYXBzIGNhbiBmYWlsIGlmIHRoZSB2aWRlbyBkZXZpY2UgaXMgcnVubmluZywgaW4gdGhhdCBjYXNlCisJICBzZXR0aW5nIGl0cyBmb3JtYXQgbGVhZHMgdG8gRUJVU1kuCisJICBJZiBzZXRfY2FwcyBmYWlscyB0aGVuIHdlIHdpbGwgbm90IGhhdmUgc2V0IHVwIHRoZSBidWZmZXIgcG9vbAorCSAgKGl0IHdpbGwgYmUgTlVMTCkgd2hpY2ggbGVhZHMgdG8gYSBjcmFzaCB3aGVuIHdlIHRyeSB0byBwdWxsCisJICBidWZmZXJzLiBJZiB3ZSBmYWlsIHRoZSBuZWdvdGlhdGUgb24gc2V0X2NhcHMgZmFpbHVyZSwgdGhlbiB3ZQorCSAgd29uJ3QgZ28gdG8gcGxheWluZyBzdGF0ZSBhbmQgd29uJ3QgY3Jhc2guCisJICBUaGlzIGlzIGEgc21hbGwgaW1wcm92ZW1lbnQuIE9mIGNvdXJzZSwgYSBuaWNlciBmaXggd291bGQKKwkgIGJlIHRvIG1ha2Ugc2V0X2NhcHMgd29yayBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgZm9ybWF0IGlzCisJICB1bmNoYW5nZWQuIElmIHRoZSBmb3JtYXQgaGFzIGNoYW5nZWQsIGZhaWxpbmcgaXMKKwkgIHByb2JhYmx5IGNvcnJlY3QgYmVjYXVzZSB3ZSBuZWVkIHRvIGNsb3NlIHRoZSBkZXZpY2UKKwkgIChnbyB0byBOVUxMIHN0YXRlKSBpbiBvcmRlciB0byBzZXQgY2Fwcy4KKworMjAxMC0wNi0xNiAxNTo0MDozNCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBpbXByb3ZlIGF1ZGlvIHZiciBkZXRlY3Rpb24KKwkgIFN1YnNlcXVlbnQgZW50cnkgdGltZSBjYWxjdWxhdGlvbnMgdXNlIGJsb2NrYWxpZ24gdmFsdWUgdG8gZGV0ZXJtaW5lCisJICBudW1iZXIgb2YgZnJhbWVzIHBlciBjaHVuaywgYW5kIGJsb2NrYWxpZ24gPT0gMSBpcyB0aGVuIG1vc3QgdW5saWtlbHkgdG8gcmVzdWx0CisJICBpbiByZWFzb25hYmxlIHZhbHVlcyAod2hpY2ggYWxzbyBhbGlnbnMgd2l0aCAic3BlYyIpLgorCisyMDEwLTA2LTE2IDE1OjUyOjU3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIHJ0cGgyNjRkZXBheTogdHdlYWsgREVMVEFfVU5JVCBsYWJlbGluZworCSAgQ29uc2lkZXIgU1BTLCBQUFMgYW5kIElEUiBhcyBrZXlmcmFtZSwgYWxsIG90aGVycyBhcyBERUxUQV9VTklULgorCSAgU2VlICM2MjAxNTQuCisKKzIwMTAtMDYtMTUgMjA6MDY6MTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6CisJICB3YXZwYWNrZGVjOiBJbml0aWFsaXplIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgYW5kIGRvbid0IHVucmVmIGl0IGlmIGl0J3MgTlVMTAorCisyMDEwLTA2LTE1IDIwOjA0OjM1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IEFzc2lnbiB2YXJpYWJsZXMgYmVmb3JlIHByaW50aW5nIHRoZW0KKworMjAxMC0wNi0xNSAyMDowMDoyOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IEluaXRpYWxpemUgdW5pbml0aWFsaXplZCB2YXJpYWJsZQorCisyMDEwLTA2LTE1IDE5OjQ3OjE2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogSW5pdGlhbGl6ZSB2YXJpYWJsZQorCisyMDEwLTA2LTE1IDE5OjQ1OjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogRml4IE5FV1NFR01FTlQgcGFyc2luZyBsb2dpYyBhbmQgZG9uJ3QgdXNlIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCisKKzIwMTAtMDYtMTUgMTc6MjA6MjAgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkgIG1hdHJvc2thOiBGaXggdW5pdGlhbGl6ZWQgdmFyaWFibGUKKworMjAxMC0wNi0xNSAxNjo0OTo0OSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDkzMzljY2MgdG8gMzU2MTdjMgorCisyMDEwLTA2LTE1IDE2OjU0OjA0ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA1YWRiMWNhIHRvIDkzMzljY2MKKworMjAxMC0wNi0xNSAxNjozNToxOCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNTdjODliNyB0byA1YWRiMWNhCisKKzIwMTAtMDYtMTUgMTQ6MDg6MjYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiAuZ2l0aWdub3JlOgorCSAgLmdpdGlnbm9yZTogaWdub3JlIGdlbmVyYXRlZCB0dnRpbWUuaCBmaWxlCisKKzIwMTAtMDYtMTUgMTU6MzY6MzMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGM4MDQ5ODggdG8gNTdjODliNworCisyMDEwLTA1LTE3IDEzOjU0OjAzICswMjAwICBNYXJjLUFuZHLDqSBMdXJlYXUgPG1sdXJlYXVAZmx1bW90aW9uLmNvbT4KKworCSogZXh0L3JhdzEzOTQvZ3N0MTM5NGNsb2NrLmM6CisJKiBleHQvcmF3MTM5NC9nc3QxMzk0Y2xvY2suaDoKKwkgIHJhdzEzOTQ6IHJlbW92ZSB1c2VsZXNzIGxhc3RfdGltZQorCSAgSXQgc2VlbXMgdG8gbWUgdGhpcyBjb2RlIGlzIHVzZWxlc3M6IHJlbW92aW5nIGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxODg3MQorCisyMDEwLTA2LTE0IDE5OjIxOjIyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiByZXNwZWN0IGFnZ3JlZ2F0ZSBjb250cm9sIGF0dHJpYnV0ZXMKKwkgIHdoZW4gdGhlIFNEUCBzcGVjaWZpZXMgYW4gYWdncmVnYXRlIGNvbnRyb2wgdXJsLCB1c2UgdGhhdCBmb3IgcGxheWJhY2sKKwkgIGNvbnRyb2wuCisJICBGaXhlcyAjNjE5NTMxCisKKzIwMTAtMDYtMTQgMTU6MzY6MDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJICBnb29tOiBDYWxsIG9yY19pbml0KCkgYmVmb3JlIHRyeWluZyB0byBnZXQgdGFyZ2V0IGZsYWdzCisKKzIwMTAtMDYtMTQgMTU6MzU6MDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBDYWxsIG9yY19pbml0KCkgYmVmb3JlIHRyeWluZyB0byBnZXQgdGFyZ2V0IGZsYWdzCisKKzIwMTAtMDYtMTQgMTQ6MjY6MjIgKzAxMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJICBtYXRyb3NrYW11eDogcmV2ZXJ0IGNoYW5nZSB0aGF0IHNldCBhIHJlc2VydmVkIGZsYWcgb24gdGhlIEJsb2NrLgorCSAgU28gbWF0cm9za2EncyBCbG9jayBzdHJ1Y3R1cmUgaGFzIG5vIGtleWZyYW1lIGZsYWcsIG9ubHkgdGhlIFNpbXBsZUJsb2NrIGhhcyBpdC4KKwkgIFRvIGRldGVjdCBrZXlmcmFtZXMgaW4gQmxvY2tzLCBpdCBpcyBqdXN0IHRoZSBCbG9ja0dyb3VwIGNvbnRhaW5lciB0aGF0IG5lZWRzCisJICB0byBoYXZlIGEgUmVmZXJlbmNlQmxvY2sgYXR0YWNoZWQgaWYgaXQgaXMgYSBkZWx0YSBmcmFtZSBpbiB2aWRlby4KKworMjAxMC0wNS0zMSAxMjo0NTowMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkgIGpwZWdkZWM6IHVzZSBsaWJqcGVnIHNjYXR0ZXItZ2F0aGVyIG9wZXJhdGlvbiB0byBhdm9pZCBkYXRhIGNvcHlpbmcKKwkgIEZpeGVzICM1ODMwNDcgKG1vcmUpLgorCisyMDEwLTA1LTI3IDE1OjQ1OjIzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAganBlZ2RlYzogb3B0aW1pemUgYnVmZmVyIGhhbmRsaW5nIHdoZW4gcGFyc2luZworCSAgVXNlIGFuIGFkYXB0ZXIgdG8gY29sbGVjdCBpbmNvbWluZyBkYXRhLCBhbmQgdXNlIGFkYXB0ZXIgQVBJIHRvIHNjYW4gYW5kIHBlZWsuCisJICBGaXhlcyAjNTgzMDQ3LgorCisyMDEwLTA2LTE0IDEzOjQ4OjI4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zczQvb3NzNC1taXhlci5jOgorCSAgb3NzNDogVXNlIGdfYXNjaWlfc3RyY2FzZWNtcCgpIGluc3RlYWQgb2YgdGhlIGRlcHJlY2F0ZWQgZ19zdHJjYXNlY21wKCkKKworMjAxMC0wNi0xNCAxMzoyNzozMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogVXNlIEdMSUJfRVhUUkFfQ0ZMQUdTCisKKzIwMTAtMDYtMTQgMTM6MDM6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gN2EwZmRmNSB0byBjODA0OTg4CisKKzIwMTAtMDYtMTQgMTE6NDY6MzIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgcnRwaDI2NGRlcGF5OiBhbHNvIGNvbnNpZGVyIEFVIGFuZCBTRUkgTkFMVXMgYXMgREVMVEFfVU5JVAorCSAgRml4ZXMgIzYyMDE1NC4KKworMjAxMC0wNi0xNCAxMTozMjo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA2ZGEzYmFiIHRvIDdhMGZkZjUKKworMjAxMC0wNi0xMiAyMToyNjoxNiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJICBidWlsZDogaW5jbHVkZSBzdGRpby5oIGZvciBzc2NhbmYKKworMjAxMC0wNi0xMiAxNDoxMjo1MCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IEFkZCBjbGVhbiBydWxlIGZvciB0aGUgb3JjIHRlc3RzCisKKzIwMTAtMDYtMTIgMTQ6MTI6MDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBBZGQgYXV0b2dlbmVyYXRlZCBvcmMgdGVzdHMKKworMjAxMC0wNi0xMiAwODoyNzo0MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA3MzNmY2E5IHRvIDZkYTNiYWIKKworMjAxMC0wNi0xMSAxNjoyMzoyOSAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IEZpeCBlbGVtZW50IGRlc2NyaXB0aW9uCisKKzIwMTAtMDYtMTEgMjE6MTM6NTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJICBydHBtcGFyb2J1c3RkZXBheTogZG9uJ3QgdHJ5IHRvIHVucmVmIE5VTEwgYnVmZmVycworCSAgRml4ZXMgZ2VuZXJpYy9zdGF0ZXMgdW5pdCB0ZXN0LgorCisyMDEwLTA2LTExIDIwOjUwOjIzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogdXNlIHR5cGVmaW5kIGZ1bmN0aW9ucyB0byBjaGVjayBpZiBQQ00gZGF0YSBjb250YWlucyBkdHMgc3RyZWFtCisJICBVc2UgbmV3IGR0cyBhdWRpbyB0eXBlZmluZGVyIGZyb20gLWJhc2UgdG8gY2hlY2sgaWYgdGhlIFBDTSBkYXRhCisJICBjb250YWlucyBhIGR0cyBzdHJlYW0uIFRoaXMgd2F5IHdlIHJlY29nbmlzZSBtb3JlIHZhcmlldGllcyBtb3JlCisJICByZWxpYWJseSBhbmQgYWxzbyBkZXRlY3QgdGhlIGR0cyBzdHJlYW0gaWYgdGhlcmUgaXNuJ3QgYSBmcmFtZQorCSAgc3luYyByaWdodCBhdCB0aGUgc3RhcnQgb2YgdGhlIGRhdGEuCisJICBGaXhlcyAjNDEzOTQyLgorCisyMDEwLTA2LTExIDIwOjQ3OjIyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogc2V0IGJ1ZmZlciBvZmZzZXRzIGJlZm9yZSB1c2luZyB0aGUgYnVmZmVyIGZvciB0aGUgZmlyc3QgdGltZQorCSAgZ3N0X3R5cGVfZmluZF9oZWxwZXJfZm9yX2J1ZmZlcigpIHdpbGwgbmVlZCB0aGUgY29ycmVjdCBvZmZzZXQKKwkgIHNldCBvbiB0aGUgYnVmZmVyIChpZS4gMCkgYW5kIG5vdCB0aGUgYnl0ZSBvZmZzZXQgd2Ugc3RhcnRlZAorCSAgcHVsbGluZyB0aGUgZGF0YSBmcm9tLgorCisyMDEwLTA2LTEwIDE2OjE0OjQzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5Lmg6CisJICBydHA6IGFkZCBtcGEtcm9idXN0IGRlcGF5bG9hZGVyCisJICBGaXhlcyAjNTg5OTk3LgorCisyMDEwLTA2LTExIDEwOjU3OjQxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogZml4IGF2aSBoZWFkZXIgYnl0ZXdyaXRpbmcKKwkgIC4uLiBieSB1c2luZyBwcm9wZXIgb2Zmc2V0cyBmb3IgdGFnIGxpc3Qgd3JpdGluZy4KKwkgIEFsc28gdXNlIF9yZXNldCByYXRoZXIgdGhhbiBfZnJlZSBhbmQgY29uc2lzdGVudGx5IHVzZSBieXRld3JpdGVyIHBvc2l0aW9uLgorCSAgU2VlICM2MTkyOTMuCisKKzIwMTAtMDYtMTAgMjI6NTg6NDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiAuZ2l0aWdub3JlOgorCSAgVXBkYXRlIC5naXRpZ25vcmUKKwkgIEFkZCB0aGUgZ2VuZXJhdGVkIG9yYyBzb3VyY2UgZmlsZXMKKworMjAxMC0wNi0xMCAyMjo1NToxNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJICBtYXRyb3NrYW11eDogRml4IHVuaXQgdGVzdCBmb3IgY2hhbmdlZCBrZXktZnJhbWUgYmVoYXZpb3VyCisJICBBbGwgYXVkaW8gZnJhbWVzIGFyZSBtYXJrZWQgYXMga2V5ZnJhbWUgbm93IGluc3RlYWQgb2YgbWFya2luZworCSAgdGhlbSBhbGwgYXMgZGVsdGEgdW5pdC4uLgorCisyMDEwLTA2LTEwIDIyOjQ1OjEzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfbW14Lmg6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy1kaXN0Lmg6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZG9yYy5vcmM6CisJICB2aWRlb21peGVyOiBQb3J0IG1vc3QgYmxlbmRpbmcgcmVsYXRlZCBmdW5jdGlvbnMgdG8gb3JjCisJICBPbmx5IHJlbWFpbmluZyBNTVggaW1wbGVtZW50YXRpb24gaXMgdGhlIEFSR0IvQkdSQS9BWVVWIGJsZW5kaW5nCisJICBmb3Igd2hpY2ggd2UgZmlyc3QgbmVlZCB0aGUgb3JjIGNvbXBvc2l0aW5nIG9wY29kZXMuCisKKzIwMTAtMDYtMTAgMjA6MTc6MDcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9tbXguaDoKKwkgIHZpZGVvbWl4ZXI6IFJlcGxhY2Ugc29tZSB0YWJzIGJ5IHNwYWNlcworCisyMDEwLTA2LTEwIDExOjA0OjM4ICswMTAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdW1vdGlvbi5jb20+CisKKwkqIGV4dC9yYXcxMzk0L2dzdDEzOTRjbG9jay5jOgorCSAgZHYxMzk0OiBGaXggdGhlIGludGVybmFsIGNsb2NrIGV2ZW4gbW9yZQorCSAgVGhlIGN5Y2xlQ291bnQgcmVnaXN0ZXIgaXMgMTMgYml0cyBsb25nIGFuZCB0aGUgY3ljbGVPZmZzZXQgb25lCisJICBpcyAxMiBiaXRzIGxvbmcuIFRvIHJlYWQgdGhlIGN5Y2xlQ291bnQgcmVnaXN0ZXIgd2UgbmVlZCB0byBzaGlmdAorCSAgMTIgYml0cyBhbmQgbm90IDEzLiBGaXhlcyAjNjE1NDYxCisKKzIwMTAtMDYtMDkgMTg6Mzc6MjkgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IHVzZSBtNCBtYWNybyB0byBjaGVjayBmb3IgT3JjCisKKzIwMTAtMDYtMDkgMjI6NDA6MjMgKzAyMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBzb21lIG5vbi1kZWx0YSBidWZmZXJzIHdlcmUgbm90IG1hcmtlZCBhcyBrZXlmcmFtZXMKKworMjAxMC0wNi0wOSAyMjowMDoxNiArMDIwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgbWF0cm9za2FtdXg6IGNoYW5nZSAyIHNlY29uZCBsaW1pdCBwZXIgY2x1c3RlcgorCSAgU3RhcnQgY2x1c3RlciBhdCBldmVyeSBrZXlmcmFtZSBvciB3aGVuIHdlIHdvdWxkIG92ZXJmbG93IHRoZSBwcmV2aW91cworCSAgY2x1c3RlcidzIHJlbGF0aXZlIHRpbWVzdGFtcCBmaWVsZC4gVGhpcyB3b3VsZCBhdm9pZCBhcyBtdWNoIGFzIHBvc3NpYmxlCisJICBzdGFydGluZyBjbHVzdGVycyBhdCBub24ta2V5ZnJhbWVzLgorCisyMDEwLTA2LTA5IDEyOjQwOjA5IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGZhZDE0NWIgdG8gNzMzZmNhOQorCisyMDEwLTA2LTA5IDEyOjM0OjAxIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDQ3NjgzYzEgdG8gZmFkMTQ1YgorCisyMDEwLTA2LTA5IDIwOjUzOjA2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBEb24ndCByZXF1ZXN0IG1vcmUgc2hhcmVkIG1lbW9yeSB0aGFuIG5lZWRlZAorCisyMDEwLTA2LTA5IDIwOjQ1OjA0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2djb25mL2dzdHN3aXRjaHNpbmsuYzoKKwkgIHN3aXRjaHNpbms6IFNldCB0aGUgR1NUX0VMRU1FTlRfSVNfU0lOSyBmbGFnIG9uIHRoZSBzaW5rCisKKzIwMTAtMDYtMDkgMjA6NDM6NTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NpbmsuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5oOgorCSAgZ2NvbmZ2aWRlb3Npbms6IFVzZSBHc3RTd2l0Y2hTaW5rIGFzIGJhc2UgY2xhc3MKKworMjAxMC0wNi0wOSAyMDozMDozMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOgorCSAgZ2NvbmZhdWRpb3Npbms6IFVzZSBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTCisKKzIwMTAtMDYtMDkgMjA6Mjk6MDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NpbmsuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5oOgorCSAgZ2NvbmZhdWRpb3Npbms6IFJlbmFtZSBpbnN0YW5jZSB2YXJpYWJsZSB0byBiZSBtb3JlIGRlc2NyaXB0aXZlCisKKzIwMTAtMDYtMDkgMjA6MjI6MzAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJICBhdXRve2F1ZGlvLHZpZGVvfXNpbms6IERvbid0IGxvc2UgdGhlIEdTVF9FTEVNRU5UX0lTX1NJTksgZmxhZyBhZnRlciByZW1vdmluZyB0aGUgY2hpbGQKKworMjAxMC0wNi0wOSAyMDowNzowOSArMDIwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQGZsdWVuZG8uY29tPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkaXJlY3Rzb3VuZHNpbms6IFBsdWcgc29tZSBtZW1sZWFrIGFuZCBzdXBwb3J0IDIyMDUwSHogbW9ubyBzb3VuZC4KKwkgIFNlZ21lbnQgc2l6ZSBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIHRoZSBzYW1wbGUgc2l6ZSBpbiBieXRlcy4KKworMjAxMC0wNi0wOSAxNjoyMjoyNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogRmx1c2ggc2htIGJ1ZmZlciBpbW1lZGlhdGVseSBpZiBpdCdzIGZ1bGwKKworMjAxMC0wNi0wOSAxNjoyMTo1NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogRml4IHdyaXRpbmcgb2YgYnVmZmVycyBsYXJnZXIgdGhhbiBzZWdzaXplCisJICBGaXhlcyBidWcgIzYyMDU0MC4KKworMjAxMC0wNi0wOSAxNTo0MjozNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogRml4IHBsYXliYWNrIGlmIFBBIGRvZXNuJ3QgZ2l2ZSB1cyBhIGxhcmdlIGVub3VnaCBzaGFyZWQgbWVtb3J5IGJ1ZmZlcgorCisyMDEwLTA2LTA5IDE1OjQyOjE5ICswMjAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJICBtYXRyb3NrYW11eDogY2hhbmdlIGluZGV4ZWQgcHJvcGVydHkgdG8gc3RyZWFtYWJsZQorCSAgVGhlIHByb3BlcnR5IHN0cmVhbWFibGUgaGFzIHJldmVyc2Ugc2VtYW50aWNzIHRvIGluZGV4ZWQuCisKKzIwMTAtMDYtMDkgMDk6MTM6MDkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguaDoKKwkgIGZsdm11eDogUmVuYW1lIHVucmVsZWFzZWQgcHJvcGVydHkgJ2luZGV4ZWQnIHRvICdzdHJlYW1hYmxlJworCSAgUmVuYW1lICdpbmRleGVkJyB0byAnc3RyZWFtYWJsZScgZm9yIGEgYmV0dGVyIG5hbWUgd2hpbGUgaXQKKwkgIGhhc24ndCBiZWVuIHJlbGVhc2VkCisKKzIwMTAtMDYtMDggMTU6MjM6NTEgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBSRVFVSVJFTUVOVFM6CisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IHJlbW92ZSBsaWJvaWwgY2hlY2sKKworMjAxMC0wNi0wOCAxNDo0NDoxOSAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgbGV2ZWw6IHJlbW92ZSB1bnVzZWQgbGlib2lsIGluY2x1ZGUKKworMjAxMC0wNi0wNCAxODoyMjo0MiAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkgIHZpZGVvbWl4ZXI6IGxpYm9pbCB0byBvcmMgY29udmVyc2lvbgorCisyMDEwLTA2LTA0IDE4OjIxOjIxIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3ZpZGVvYm94L01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLWRpc3QuaDoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy5vcmM6CisJICB2aWRlb2JveDogbGlib2lsIHRvIG9yYyBjb252ZXJzaW9uCisKKzIwMTAtMDYtMDQgMTg6MTY6MjUgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvZ29vbS9NYWtlZmlsZS5hbToKKwkqIGdzdC9nb29tL1JFQURNRToKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkqIGdzdC9nb29tL3BsdWdpbl9pbmZvLmM6CisJICBnb29tOiBsaWJvaWwgdG8gb3JjIGNvbnZlcnNpb24KKworMjAxMC0wNi0wOCAxNjowNDoyMyAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9kZWludGVybGFjZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0Lmg6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLm9yYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhcmJsZW5kLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3ZmaXIuYzoKKwkgIGRlaW50ZXJsYWNlOiBvcmNpZnkgc29tZSBkZWludGVybGFjaW5nIG1ldGhvZHMKKworMjAxMC0wNi0wOCAxNjowMzozNiAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9kZWludGVybGFjZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHkuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvc2NhbGVyYm9iLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdmZpci5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZWJmZi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZXRmZi5jOgorCSAgZGVpbnRlcmxhY2U6IGNvbnZlcnQgZnJvbSBsaWJvaWwgdG8gb3JjCisKKzIwMTAtMDYtMDggMTU6MjM6MjggLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBSRVFVSVJFTUVOVFM6CisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IEFkZCBvcmMgY2hlY2sKKworMjAxMC0wNi0wOCAxNDowOTowMCArMDIwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4Lmg6CisJICBmbHZtdXg6IEFkZCBpbmRleGVkIHByb3BlcnR5IHRvIHJlcGxhY2UgZGlzYWJsZWQgaXMtbGl2ZS4KKwkgIEFkZCBpbmRleGVkIHByb3BlcnR5IHRvIGJlIHRoZSBuZWdhdGlvbiBvZiB3aGF0IHRoZSBkaXNhYmxlZCBpcy1saXZlIHByb3BlcnR5CisJICB3YXMuIEZpeGVzIGJ1ZyAjNjEzMDY2LgorCisyMDEwLTA2LTA4IDA5OjIyOjMwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgcmF3MTM5NDogUmVxdWlyZSBsaWJyYXcxMzk0ID49IDIuMC4wIGZvciByYXcxMzk0X3JlYWRfY3ljbGVfdGltZXIKKwkgIEZpeGVzIGJ1ZyAjNjIwOTI5LgorCisyMDEwLTA2LTA4IDA3OjM1OjAwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOgorCSAgY21tbGVuYzogUmVtb3ZlIGhhY2sgdG8gbGV0IG9nZ211eCBzdGFydCBhIG5ldyBwYWdlIGZvciBldmVyeSBDTU1MIGJ1ZmZlcgorCSAgb2dnbXV4IGRvZXMgdGhpcyBmb3IgQ01NTCBieSBpdHMgb3duIG5vdworCisyMDEwLTA2LTA3IDE4OjMyOjE2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IERvbid0IGhhbmRsZSBub24tVElNRSBzZWVrcworCSAgRG9uJ3Qgc2VuZCB0aGVtIHVwc3RyZWFtIGJlY2F1c2UgZm9yIHVwc3RyZWFtIGEgQllURVMgc2VlaworCSAgbWlnaHQgbWFrZSBzZW5zZSBidXQgaXMgY29tcGxldGVseSB3cm9uZyBiZWNhdXNlIHVwc3RyZWFtCisJICBjYW4ndCBzZWVrIHRvIGEgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgYXVkaW8gb3IgdmlkZW8gc3RyZWFtLgorCSAgQWxzbyBkb24ndCBidWlsZCB0aGUgaW5kZXggaW4gcHVzaCBtb2RlIGZvciBub24tVElNRSBzZWVrcywKKwkgIHRoaW5ncyB3aWxsIGdvIHdyb25nIGhlcmUgb3RoZXJ3aXNlLgorCisyMDEwLTA2LTA3IDExOjE1OjI2IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZmRldGVjdC5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZmRldGVjdC5oOgorCSAgZHRtZmRldGVjdDogT25seSB3b3JrcyB3aXRoIHJhdGU9ODAwMCwgZml4IGluIGNhcHMKKworMjAxMC0wNi0wMiAxOToxNjoyMCArMDEwMCAgU2pvZXJkIFNpbW9ucyA8c2pvZXJkLnNpbW9uc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgQ29wZSB3aXRoIHNob3J0IHN0YXJ0Y29kZXMgaW4gdGhlIGgyNjQgYnl0ZXN0cmVhbQorCisyMDEwLTA2LTA2IDE3OjI1OjE2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2U6IGxvZyBtZXNzYWdlIHByaW50ZiBmb3JtYXQgZml4ZXMKKworMjAxMC0wNi0wNiAxODowMDoyMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJKiBleHQvcHVsc2UvcHVsc2VtaXhlci5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4LmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIGV4dDogRG9uJ3QgdXNlIEdTVF9ERUJVR19GVU5DUFRSIGZvciBHT2JqZWN0IHZmdW5jcworCisyMDEwLTA2LTA2IDE3OjU3OjAzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSogc3lzL29zcy9nc3Rvc3NkbWFidWZmZXIuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkqIHN5cy9vc3M0L29zczQtc2luay5jOgorCSogc3lzL29zczQvb3NzNC1zb3VyY2UuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeHJpbmdidWZmZXIuYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NpbmsuYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOgorCSogc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5jOgorCSAgc3lzOiBEb24ndCB1c2UgR1NUX0RFQlVHX0ZVTkNQVFIgZm9yIEdPYmplY3QgdmZ1bmNzCisKKzIwMTAtMDYtMDYgMTc6NTI6NDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jOgorCSogZ3N0L2RlYnVndXRpbHMvYnJlYWtteWRhdGEuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHRhZ2luamVjdC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jOgorCSogZ3N0L2RlYnVndXRpbHMvdGVzdHBsdWdpbi5jOgorCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIGdzdDogRG9uJ3QgdXNlIEdTVF9ERUJVR19GVU5DUFRSIGZvciBHT2JqZWN0IHZmdW5jcworCisyMDEwLTA2LTA2IDE1OjEyOjE2ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IHJlZmFjdG9yIGRlbHRhIHVuaXQgaGFuZGxpbmcKKwkgIFRoaXMgYWxsb3dzIHVzIHRvIHNraXAgZGVsdGEgdW5pdHMgZWFybGllciBhbmQgaXMgYSBiaXQgY2xlYXJlciBpbiBteQorCSAgb3Bpbmlvbi4gSXQgYWxzbyBtYWtlcyBvbmx5IHZpZGVvIGJ1ZmZlcnMgZXZlciBiZSBkZWx0YSB1bml0cywgbm90CisJICBqdXN0IGZvciBTaW1wbGVCbG9jayBhcyBiZWZvcmUuCisKKzIwMTAtMDYtMDYgMTU6MTc6MDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogQ2xlYXIgYWRhcHRlciBvbiBkaXNjb250aW51aXRpZXMKKworMjAxMC0wNi0wNiAxNDowMzo1MyArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBJZ25vcmUga2V5ZnJhbWUgZmxhZyBmb3Igbm9uLXZpZGVvIHN0cmVhbXMKKwkgIFdoZW4gdGhlIGtleWZyYW1lIGJpdCBvZiBTaW1wbGVCbG9jayBGbGFncyB3YXNuJ3Qgc2V0LCB0aGUgYnVmZmVyIHdhcyBiZWluZworCSAgbWFya2VkIHdpdGggR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQsIGNhdXNpbmcgYWxsIGJ1ZmZlcnMgdG8gYmUgc2tpcHBlZAorCSAgYWZ0ZXIgYSBzZWVrLiBUaGlzIG1heSBiZSBhIHByb2JsZW0gd2l0aCB0aGUgU29yZW5zb24gU3F1aXNoIGVuY29kZXIsIGJ1dAorCSAgYXJndWFibHkgdGhlIGtleWZyYW1lIGJpdCBzaG91bGQgb25seSBiZSBhcHBsaWVkIHRvIHZpZGVvLgorCSAgRml4ZXMgYnVnICM2MjAzNTguCisKKzIwMTAtMDYtMDYgMTQ6NTY6NTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogRmlyc3QgdHJ5IHVwc3RyZWFtIHdoZW4gaGFuZGxpbmcgc2VlayBldmVudHMvcXVlcmllcworCisyMDEwLTA2LTA0IDE0OjU0OjU5IC0wNDAwICBUcmlzdGFuIE1hdHRoZXdzIDx0cmlzdGFuQHNhdC5xYy5jYT4KKworCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmM6CisJICBnc3RydHBjZWx0cGF5OiBkb24ndCBhbHdheXMgZml4YXRlIHNpbmsgY2FwcyB0byAxIGNoYW5uZWwKKwkgIFRoZSBnZXRjYXBzIGZ1bmN0aW9uIHNob3VsZCBub3QgZml4YXRlIHRoZSBjaGFubmVscyBmaWVsZCB1bnRpbCB3ZQorCSAgZ2V0IHRoZSBlbmNvZGluZy1wYXJhbXMgZmllbGQgZnJvbSBvdXIgc3JjcGFkJ3MgY2Fwcy4gRml4ZXMgIzYyMDU5MQorCisyMDEwLTA2LTA0IDEzOjU3OjI4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwOiB0cnkgYWxsIHJhbmdlcyBmcm9tIHRoZSBzZHAKKwkgIFRyeSBhbGwgcmFuZ2VzIGluIHRoZSBTRFAgYmVmb3JlIGdpdmluZyB1cC4KKworMjAxMC0wNi0wNCAxMzo1NjowNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogbWFrZSBwYXJzZV9yYW5nZSByZXR1cm4gcmVzdWx0CisJICBNYWtlIHRoZSBwYXJzZV9yYW5nZSBmdW5jdGlvbiByZXR1cm4gaWYgdGhlIHBhcnNpbmcgc3VjY2VlZGVkIG9yIGZhaWxlZC4KKworMjAxMC0wNi0wNCAxMTo0NDowOSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogaWYgd2UncmUgbm90IGxpbmtlZCBkb3duc3RyZWFtLCB3ZSBjYW4gZG8gYW55IGZvcm1hdAorCSAgU3R1cGlkIG1lLCBhc3N1bWluZyBfZ2V0X2FsbG93ZWRfY2FwcygpIHdvdWxkIGFjdHVhbGx5IHJldHVybiB0aGUKKwkgIHBhZCB0ZW1wbGF0ZXMgaWYgdGhlcmUgd2FzIG5vIHBlZXIuCisKKzIwMTAtMDUtMzEgMTY6MjY6MTkgKzAxMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgS2VlcCBhbm5vdW5jaW5nIHRoZSBkZWxpdmVyeS1tZXRob2QgaW4gdGhlIGNhcGFiaWxpdGllcworCSAgRXZlbiB0aG91Z2ggd2UgZG9uJ3QgdXNlIGRlbGl2ZXJ5LW1ldGhvZCBpbiBvdXIgcGF5bG9hZGVyLCBvbGRlciB2ZXJzaW9ucyBvZgorCSAgdGhlIHRoZW9yYSBwYXlsb2FkZXIgaW4gZ3N0cmVhbWVyIHJlcXVpcmVkIGl0LiBBcyBzdWNoIHdlIG5lZWQgdG8ga2VlcCB0aGlzCisJICBhcm91bmQgaW4gdGhlIGNhcHMgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LgorCSAgVGhpcyByZXZlcnRzIHBhcnQgb2YgNDk0NjNhMzdjYmFhOTUyZTE0MDEyOTFmMGEyNjIzZGU2Y2FiMzg4MAorCSAgRml4ZXMgIzYxODk0MAorCisyMDEwLTA2LTAzIDE3OjUyOjExICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSogc3lzL29zczQvb3NzNC1taXhlci5jOgorCSAgb3NzNDogYWRkIHNvbWUgY29tbWVudHMgZm9yIHRyYW5zbGF0b3JzIHRvIGNsYXJpZnkgbWVhbmluZyBvZiAiTG93IgorCSAgIkxvdyIgZXRjLiBhcmUgcXVhbGl0eSBzZXR0aW5ncyBoZXJlIChlLmcuIGZvciB0aGUgaW50ZXJuYWwgcmVzYW1wbGVyKS4KKwkgIFNvbWUgZGF5IHdoZW4gd2UgdXNlIEdMaWIncyBpMThuIGZ1bmN0aW9ucyB3ZSBtaWdodCB3YW50IHRvIHVzZQorCSAgTkNfKCkgYW5kIGdfZHBnZXR0ZXh0MigpIGhlcmUgaW5zdGVhZCBvZiB0aGUgY29tbWVudHMuCisJICBGaXhlcyAjNTU1OTY3LgorCisyMDEwLTA2LTAzIDE5OjIzOjAxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuaDoKKwkgIG1wNGdkZXBheTogY2FsY3VsYXRlIHRoZSBmcmFtZSBkdXJhdGlvbiBjb3JyZWN0bHkKKwkgIFdoZW4gd2UgY2FsY3VsYXRlIHRoZSBmcmFtZSBkdXJhdGlvbiwgd2UgbmVlZCB0byB1c2UgdGhlIGFtb3VudCBvZgorCSAgZnJhbWVzIGluIHRoZSBfcHJldmlvdXNfIHBhY2tldCwgbm90IHRoZSBjdXJyZW50IHBhY2tldC4gVGhlIGZyYW1lIGR1cmF0aW9uIGlzCisJICBuZWVkZWQgdG8gY29ycmVjdGx5IGRlLWludGVybGVhdmUgaW50ZXJsZWF2ZWQgc3RyZWFtcy4gVGhpcyBmaXhlcyB0aGUgY2FzZSB3aGVyZQorCSAgdGhlcmUgYXJlIGEgdmFyaWFibGUgbnVtYmVyIG9mIGZyYW1lcyBpbiBhIHBhY2tldC4KKwkgIEZpeGVzICM2MjA0OTQKKworMjAxMC0wNi0wMyAxODo1ODo0MiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogRG9uJ3QgcmV0dXJuIGNhcHMgaW4gZ2V0X2NhcHMoKSB0aGF0IHdpbGwgYmUgcmVqZWN0ZWQKKwkgIFRoaXMgY29tbWl0IGJhc2ljYWxseSBwdXRzIF9nZXRfY2FwcygpIGluIHN5bmMgd2l0aCBhY2NlcHRfY2FwcygpLgorCSAgSWYgd2UgZG9uJ3QgaGF2ZSBhIG1hc3RlciBwYWQgT1IgdGhlIG1hc3RlciBwYWQgY2FwcyBhcmVuJ3QgbmVnb3RpYXRlZAorCSAgdGhlbiB3ZSBqdXN0IHJldHVybiB0aGUgZG93bnN0cmVhbSBhbGxvd2VkIGNhcHMuCisJICBJZiB3ZSBoYXZlIGEgbWFzdGVyIHBhZCB3aXRoIG5lZ290aWF0ZWQgY2Fwcywgd2UgcmV0dXJuIHRob3NlIGNhcHMKKwkgIHdpdGggYSBmcmVlIHJhbmdlIG9mIHdpZHRoL2hlaWdodC9mcmFtZXJhdGUKKworMjAxMC0wNi0wMyAxMzo0NTozMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIFJldmVydCAicHVsc2VzaW5rOiBBZGQgY29tbWVudHMgdG8gcmVtb3ZlIHRoZSBwcm92aWRlLWNsb2NrIG1lc3NhZ2UgcG9zdGluZyBvbmNlIHdlIGRlcGVuZCBvbiBiYXNlIDAuMTAuMzAiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDhmMzcwOGYzOGFhMzgzOWE2YTYyNWNhN2QxYzE2NjEwMWM5ZmJiN2YuCisJICBUaGUgYmFzZWF1ZGlvc2luayBjb21taXQgd2FzIHJldmVydGVkCisKKzIwMTAtMDYtMDMgMTA6Mjc6MjUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IEFkZCBjb21tZW50cyB0byByZW1vdmUgdGhlIHByb3ZpZGUtY2xvY2sgbWVzc2FnZSBwb3N0aW5nIG9uY2Ugd2UgZGVwZW5kIG9uIGJhc2UgMC4xMC4zMAorCSAgYmFzZWF1ZGlvc2luayBkb2VzIGFsbCB0aGlzIGZvciB1cyBub3cuCisKKzIwMTAtMDUtMDcgMTg6NDI6MDYgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgZHRtZjogUmVtb3ZlIHJ0cGR0bWZtdXggc3RyZWFtLWxvY2sgY29kZQorCisyMDEwLTA2LTAyIDE2OjM2OjExICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IGRlbGF5ZWQgc2VlayBoYW5kbGluZyBhbHNvIGRlc2VydmVzIFRSVUUgZXZlbnQgcmVzcG9uc2UKKworMjAxMC0wNi0wMiAxNTozMDo0NyArMDIwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IGZpeCBjb21waWxlciB3YXJuaW5nCisJICB1bnVzZWQgdmFyaWFibGUg4oCYZXN0aW1hdGVk4oCZCisKKzIwMTAtMDYtMDIgMTU6MDQ6MDAgKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiBjb21tb246CisJICBjb21tb246IHJldmVydCB0aGUgY2hhbmdlIGkgZGlkIGluIG15IHByZXZpb3VzIGNvbW1pdAorCisyMDEwLTA2LTAyIDEzOjM5OjEwICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogY29tbW9uOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IHN0b3AgYnVmZmVyaW5nIGFuZCBlbWl0IEVPUyBhdCB0aGUgZW5kIG9mIGEgc3RyZWFtCisJICBXaGVuIHVzaW5nIFJUUF9KSVRURVJfQlVGRkVSX01PREVfQlVGRkVSLCBtYWtlIHN1cmUgdGhhdCB0aGUgcmluZ2J1ZmZlciBkb2Vzbid0CisJICBnZXQgc3R1Y2sgYnVmZmVyaW5nIGZvcmV2ZXIgd2hlbiB0aGVyZSBpc24ndCBlbm91Z2ggZGF0YSBsZWZ0IHRvIGZpbGwgdGhlCisJICBidWZmZXIuCisKKzIwMTAtMDYtMDEgMjE6NTI6NTkgKzAyMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZ3N0L2RlYnVndXRpbHMvdGVzdHBsdWdpbi5jOgorCSAgZGVidWd1dGlsczogRG9uJ3QgY29uc3VtZSBwcmVyb2xsIGJ1ZmZlciB0d2ljZQorCisyMDEwLTA2LTAxIDIxOjMyOjExICswMjAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkgIHB1bHNlOiBTdHlsZSBmaXg6IHVzZSBnX3N0cmR1cCgpIGluc3RlYWQgb2YgcHJpbnRmKClpbmcgYSBzaW1wbGUgc3RyaW5nCisKKzIwMTAtMDUtMjcgMTY6MDc6MzEgKzAyMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZ3N0L2RlYnVndXRpbHMvdGVzdHMuYzoKKwkgIGRlYnVndXRpbHM6IFJlcGxhY2UgbWQ1IGltcGxlbWVudGF0aW9uIHdpdGggZ2xpYidzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjE5ODI0CisKKzIwMTAtMDUtMjIgMTE6NTU6MzcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBjbGVhbiB1cCBjb2RlIGZvciBhdmkgaGVhZGVyIHVzaW5nIGEgYnl0ZXdyaXRlcgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxOTI5MworCisyMDEwLTA2LTAxIDE4OjU0OjQxIC0wNTAwICBQaWVycmUtTG91aXMgQm9zc2FydCA8cGllcnJlLWxvdWlzLmJvc3NhcnRAaW50ZWwuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IG9wdGltaXplIGNvbW11bmljYXRpb24gd2l0aCBQdWxzZUF1ZGlvIHVzaW5nIHBhX3N0cmVhbV9iZWdpbl93cml0ZQorCisyMDEwLTA2LTAyIDEwOjUyOjU2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBQb3N0IHByb3ZpZGUtY2xvY2sgbWVzc2FnZSBvbiB0aGUgYnVzIGlmIHRoZSBjbG9jayBhcHBlYXJzL2Rpc2FwcGVhcnMKKwkgIEZpeGVzIGJ1ZyAjNjIwMjc3LgorCisyMDEwLTA2LTAxIDIzOjQ5OjE3IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDE3Zjg5ZTUgdG8gNDc2ODNjMQorCisyMDEwLTA2LTAxIDIyOjU0OjQ5IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGNkZmYwZmIgdG8gMTdmODllNQorCisyMDEwLTA2LTAxIDIwOjQ1OjI5ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBmaWx0ZXIgY2FwcyByZXR1cm5lZCBmcm9tIGRvd25zdHJlYW0gd2l0aCBvdXIgcGFkIHRlbXBsYXRlLgorCisyMDEwLTA2LTAxIDE2OjU2OjMyICswMTAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogUmVtb3ZlIG1vcmUgdW5uZWVkZWQgd2FybmluZ3MKKworMjAxMC0wNi0wMSAxNjo1NDowMyArMDEwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgIG1hdHJvc2thbXV4OiByZW1vdmUgdW5uZWVkZWQgd2FybmluZworCisyMDEwLTA2LTAxIDE2OjQ5OjE0ICswMTAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSAgbWF0cm9za2FtdXg6IHJlbW92ZSB1bm5lZWRlZCBkZWJ1ZyBzdGF0ZW1lbnQKKworMjAxMC0wNi0wMSAxNjoyNDo1MyArMDEwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgbWF0cm9za2FtdXg6IGNoYW5nZSBpcy1saXZlIHByb3BlcnR5IHRvIGluZGV4ZWQKKworMjAxMC0wNS0yMyAxMzo1NjoxNiArMDEwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYTogdXNlIHRoZSB1aW50NjQgc2NhbGluZyBmdW5jdGlvbnMKKwkgIEluIGRlbXV4ZXIgYW5kIG11eGVyIHVzZSB0aGUgZ3N0X3V0aWxfdWludDY0IHNjYWxpbmcgZnVuY3Rpb25zIHJhdGhlciB0aGFuCisJICBzdGFuZGFyZCBpbnRlZ2VyIGRpdmlzaW9uLiBBZGQgd2FybmluZ3MgKHRvIGJlIGNoYW5nZWQgdG8gZGVidWcpIGZvciBkZWJ1Z2dpbmcKKwkgIHRoZSB0aW1lc3RhbXAgYW5kIGR1cmF0aW9uLgorCisyMDEwLTA1LTIxIDE0OjM1OjM0ICswMTAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBzZXQgZGVsdGEgdW5pdCBvbiBhbGwgYnVmZmVycyBleGNlcHQgY2x1c3RlciBzdGFydCBvbmVzCisKKzIwMTAtMDUtMjEgMTM6Mzg6MTEgKzAxMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHN0b3JlIGNhcHMgYW5kIHNldCBvbiBidWZmZXJzIHJhdGhlciB0aGFuIHVzaW5nIHBhZCBjYXBzCisKKzIwMTAtMDUtMjEgMTM6MjU6MjQgKzAxMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBtYWtlIHN1cmUgcGFkcyBjYXBzIGFyZSBzZXQgYmVmb3JlIGFueSBidWZmZXJzIHB1c2hlZC4KKworMjAxMC0wNS0yMSAxMzoxNDowNCArMDEwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogYWRkIHN0cmVhbWhlYWRlcnMKKworMjAxMC0wNS0yMSAxMjoyMzowOCArMDEwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IG5vIG5lZWQgdG8gc2V0IGNhY2hlIHR3aWNlCisKKzIwMTAtMDUtMjEgMDE6NTk6NTMgKzAyMDAgIFhhdmllciBRdWVyYWx0IDx4cXVlcmFsdEBnbWFpbC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIERvIG5vdCBjcmVhdGUgYSBTZWVrSGVhZGVyLCBDdWVzLCAuLiB3aGVuIGRvaW5nIGxpdmUKKworMjAxMC0wNS0yMCAyMzozOTo1OSArMDIwMCAgWGF2aWVyIFF1ZXJhbHQgPHhxdWVyYWx0QGdtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgQWRkIGlzLWxpdmUgcHJvcGVydHkKKworMjAxMC0wNi0wMSAxMzoyMjoyNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGZpeCB2YXJpYWJsZSBpbml0CisKKzIwMTAtMDUtMjggMTY6Mzc6MzIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgbWF0cm9za2FkZW11eDogaW1wcm92ZSByZXZlcnNlIHBsYXliYWNrCisJICBTbGlnaHRseSBtb2RpZnkgYXBwcm9hY2ggdG8gYWxzbyBoYW5kbGUgY2FzZXMgd2hlcmUgY3VlIGVudHJpZXMgZG8gbm90IHJlbGlhYmx5CisJICBsZWFkIHRvIGluaXRpYWwga2V5ZnJhbWVzLgorCSAgRml4ZXMgIzYxOTgxNy4KKworMjAxMC0wNS0yNCAxNjowMjo1OCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvc2NhbGVyYm9iLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdmZpci5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZWJmZi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZXRmZi5jOgorCSAgZGVpbnRlcmxhY2U6IGF2b2lkIGd0ay1kb2MgY29uZnVzaW5nIGNvbW1lbnRzCisKKzIwMTAtMDUtMjEgMTE6MjE6NTggKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJICBtYXRyb3NrYW11eDogYWRqdXN0IHVuaXQgdGVzdCB0byBtb2RpZmllZCBiZWhhdmlvdXIKKworMjAxMC0wNS0yMCAxNDozMzo0MSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHVzZSB3cml0ZSBjYWNoaW5nIGFsc28gd2hlbiB3cml0aW5nIGJ1ZmZlciBkYXRhCisJICBTcGVjaWZpY2FsbHksIHRoaXMgcmVkdWNlcyBwdXNoaW5nIHNldmVyYWwgc21hbGwgYnVmZmVycyBmb3IgZWFjaAorCSAgZGF0YSBidWZmZXIgYW5kIGFsc28gYXZvaWRzIGEgc2VlayBmb3IgZWFjaCBidWZmZXIgYWx0b2dldGhlcgorCSAgKHRob3VnaCBhIHNlZWsgaXMgc3RpbGwgbmVlZGVkIGZvciBlYWNoIGNsdXN0ZXIpLgorCSAgRml4ZXMgIzYxOTI3My4KKworMjAxMC0wNS0yMCAxNDoyMzowNyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGZpeCBlYm1sIHdyaXRlIGNhY2hpbmcgd2l0aCBieXRld3JpdGVyIGltcGxlbWVudGF0aW9uCisJICBBbHNvIGNhY2hlIGEgYml0IG1vcmUgZHVyaW5nIGhlYWRlciB3cml0aW5nLgorCSAgRml4ZXMgIzYxOTI3My4KKworMjAxMC0wNS0yMCAxNDowODo0MiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJICBtYXRyb3NrYW11eDogdXNlIGNvbnNpc3RlbnQgZGVidWcgY2F0ZWdvcnkgbmFtZSBmb3IgZWJtbHdyaXRlCisKKzIwMTAtMDUtMTggMTQ6NDQ6MTUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgbWF0cm9za2FkZW11eDogdXNlIGJ5dGVyZWFkZXIgYmFzZWQgR3N0RWJtbFJlYWQgYXMgYSBoZWxwZXIKKwkgIC4uLiByYXRoZXIgdGhhbiBiYXNpbmcgb24gaXQgYnkgaW5oZXJpdGFuY2UuCisJICBBbHNvIHVzZSBtb3JlIGNvbW1vbiBjb2RlIGZvciBwdXNoIGFuZCBwdWxsIG1vZGUuCisJICBGaXhlcyAjNjE5MTk4LgorCSAgRml4ZXMgIzYxMTExNy4KKworMjAxMC0wNi0wMSAxNTo0NzozMiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBfZ2V0X3BhZF90ZW1wbGF0ZSByZXN1bHQgbmVlZHMgbm8gdW5yZWYKKworMjAxMC0wNS0xOCAxOTo0Mjo1OCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJICBwbmdlbmM6IFN1cHBvcnQgOCBiaXQgZ3JheXNjYWxlCisJICBBZGRzIHN1cHBvcnQgdG8gOCBiaXQgZ3JheXNjYWxlIGlucHV0CisKKzIwMTAtMDUtMTggMTQ6NDY6NTQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBBZGRzIDhiaXQgZ3JheXNjYWxlIHN1cHBvcnQKKwkgIEFkZHMgZGVjb2Rpbmcgc3VwcG9ydCBmb3IganBlZyBpbWFnZXMgaW4gOCBiaXQgZ3JheXNjYWxlIGZvcm1hdC4KKworMjAxMC0wNS0xOCAwMTo1NzoxNCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IEFjY2VwdCBncmF5c2NhbGUgYXMgaW5wdXQKKwkgIEFkZHMgdmlkZW8veC1yYXctZ3JheXNjYWxlICg4IGJpdCkgc3VwcG9ydCB0byBqcGVnZW5jCisKKzIwMTAtMDUtMzEgMTM6MzA6MDUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIHZpZGVvbWl4ZXI6IEltcGxlbWVudCBzaW5rcGFkIEdldENhcHNGdW5jdGlvbi4KKwkgIFRoaXMgYWxsb3dzIHJldHVybmluZyBvbmx5IHRoZSBmb3JtYXRzLCB3aWR0aCwgaGVpZ2h0LCBmcmFtZXJhdGUKKwkgIGFuZCBwaXhlbC1hc3BlY3QtcmF0aW8gdGhhdCBkb3duc3RyZWFtIGNhbiBzdXBwb3J0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYyMDE0OAorCisyMDEwLTA1LTMxIDA3OjQ5OjIxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBEb24ndCBjb21wYXJlIHJ1bm5pbmcgdGltZXMgd2l0aCBzdHJlYW0gdGltZXMgd2hlbiBkb2luZyBRb1MKKworMjAxMC0wNS0yNyAyMTowNjo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJICBkZWludGVybGFjZTogRG9uJ3QgcmVjb25maWd1cmUgdGhlIGNhcHMgd2hlbiBjaGFuZ2luZyBwcm9wZXJ0aWVzCisJICBGaXhlcyBidWcgIzYxOTg0OC4KKworMjAxMC0wNS0yNiAxMzoxMzo0NCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmg6CisJICBhbHBoYTogQWRkIHByb3BlcnR5IHRvIGFsbG93IHBhc3N0aHJvdWdoIG1vZGUKKwkgIFRoaXMgcGFzc3Rocm91Z2ggbW9kZSBpcyB1c2VkIGlmIHRoZSBhbHBoYSBtZXRob2QgaXMgInNldCIKKwkgIGFuZCB0aGUgYWxwaGEgdmFsdWUgaXMgMS4wLgorCSAgRml4ZXMgYnVnICM2MTc1MTIuCisKKzIwMTAtMDUtMjUgMTU6MTY6MDYgKzEwMDAgIEFsZXhhbmRlciBLb2pldm5pa292IDxhbGV4YW5kZXJAa29qZXZuaWtvdi5jb20+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IHN1cHBvcnQgMjQtYml0IHdpZHRoCisJICBGaXhlcyAjNjE5MDQ1CisKKzIwMTAtMDUtMjQgMjE6NTA6NTggKzEwMDAgIEFsZXhhbmRlciBLb2pldm5pa292IDxhbGV4YW5kZXJAa29qZXZuaWtvdi5jb20+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgc3BlY3RydW06IHN1cHBvcnQgYXJiaXRyYXJ5IGJpdCBkZXB0aAorCSAgUGFydGlhbGx5IGZpeGVzICM2MTkwNDUKKworMjAxMC0wNS0yNSAwNTozNjo0NiArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBmaXggZGVhZGxvY2sgaW50cm9kdWNlZCBieSB2aWRlbyBrZXlmcmFtZSBRb1MKKworMjAxMC0wNS0yMyAwOTozMjowOCArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBtYXRyb3NrYWRlbXV4OiBza2lwIGJ1ZmZlcnMgYmVmb3JlIGEgbGF0ZSBrZXlmcmFtZSAoUW9TKQorCSAgQmVmb3JlLCB2cDhkZWMgaGFkIG5vIG9wdGlvbiBidXQgdG8gZGVjb2RlIGFsbCBmcmFtZXMgZXZlbiBpZiBzb21lL2FsbAorCSAgb2YgdGhlbSB3b3VsZCBiZSBsYXRlLiBXaXRoIHRoaXMgY2hhbmdlLCBwZXJmb3JtYW5jZSB3aGVuIGtleWZyYW1lcyBhcmUKKwkgIGZyZXF1ZW50IGlzIGhlbHBlZCBhIGdyZWF0IGRlYWwuIE9uIG15IFRoaW5rcGFkIFg2MHMsIGRlY29kaW5nIGEgMjAgcworCSAgMTA4MHAgc3VuZmxvd2VyIGVuY29kZSB3aXRoIGtleWZyYW1lcyBldmVyeSAxMCBmcmFtZXMgd2VudCBmcm9tIHRha2luZworCSAgNDIgcyB3aXRoIDUgZnJhbWVzIHNob3duIHRvIDIxIHMgd2l0aCAxNSBmcmFtZXMgc2hvd24gKHN0aWxsIHNsb3cKKwkgIGVub3VnaCB0byBjb3VudCBieSBoYW5kKS4gV2hlbiBrZXlmcmFtZXMgYXJlIG1vcmUgc3BhcnNlLCB5b3Ugd2lsbAorCSAgc3RpbGwgYmUgYWJsZSB0byBjYXRjaCB1cCBldmVudHVhbGx5LCBidXQgdGhlIHJlc3VsdHMgd29uJ3QgYmUgYXMKKwkgIG5vdGljYWJsZS4KKworMjAxMC0wNS0xNCAxNzo1Nzo1OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuaDoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJwYWQuaDoKKwkgIHZpZGVvbWl4ZXI6IERvbid0IG1peCBpbnB1dCB3aXRoIGRpZmZlcmVudCBwaXhlbCBhc3BlY3QgcmF0aW9zCisJICBGaXhlcyBidWcgIzYxODUzMC4KKworMjAxMC0wNS0xNyAxOTo1NDoyMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5hc206CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYzoKKwkgIGRlaW50ZXJsYWNlOiBBZGQgTU1YLzNETm93IGltcGxlbWVudGF0aW9ucyBvZiBncmVlZHloIGZvciBVWVZZCisKKzIwMTAtMDUtMTcgMTk6MTY6NDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYzoKKwkgIGRlaW50ZXJsYWNlOiBGaXggVVlWWSBpbXBsZW1lbnRhdGlvbiBvZiBncmVlZHloIHRvIGJlIGFjdHVhbGx5IHVzZWQKKworMjAxMC0wNS0xMSAxMTo0MzowNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkqIGV4dC9nZGtfcGl4YnVmL01ha2VmaWxlLmFtOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOgorCSAgZ2RrcGl4YnVmOiBBZGQgYSBnZGtwaXhidWYzIHBsdWdpbiB0aGF0IHVzZXMgZ2RrcGl4YnVmMworCisyMDEwLTA2LTAxIDEwOjA2OjEwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogTWFrZWZpbGUuYW06CisJKiBjb21tb246CisJKiB3aW4zMi9jb21tb24vZ3N0cnRwYmluLW1hcnNoYWwuYzoKKwkqIHdpbjMyL2NvbW1vbi9nc3RydHBiaW4tbWFyc2hhbC5oOgorCSogd2luMzIvY29tbW9uL2dzdHVkcC1lbnVtdHlwZXMuYzoKKwkqIHdpbjMyL2NvbW1vbi9nc3R1ZHAtbWFyc2hhbC5jOgorCSogd2luMzIvY29tbW9uL2dzdHVkcC1tYXJzaGFsLmg6CisJICB3aW4zMjogYWRkIG1vcmUgZ2VuZXJhdGVkIG1hcnNoYWwgYW5kIGVudW10eXBlIGZpbGVzIHRvIHdpbjMyLXVwZGF0ZQorCisyMDEwLTA2LTAxIDA5OjI3OjAwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLmM6CisJICBSZXZlcnQgIm1hdHJvc2thOiBhZGQgdGVtcG9yYXJ5IHdlYm0gdHlwZWZpbmRlciIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgZDE0OGVjMGFkMjA1M2FiYjBjMzhmYzY4MWE4OTUzMjkyOTg1Mzg4Zi4KKwkgIFdlIGRlcGVuZCBvbiAtYmFzZSBnaXQgbm93LCB3aGljaCBoYXMgYSB3ZWJtIHR5cGVmaW5kZXIgaW4gdGhlIHVzdWFsCisJICBwbGFjZS4KKworMjAxMC0wNi0wMSAwOToyNjoxMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgUmV2ZXJ0ICJhdmltdXgsIGZsdm11eCwgbWF0cm9za2FtdXg6IGRvbid0IGNyYXNoIGlmIHRhZ3MgYXJyaXZlIG9uIG11bHRpcGxlIGlucHV0IHBhZHMgYXQgdGhlIHNhbWUgdGltZSIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgNmE5OTgzY2QyMGM0OGI5NjM5NjIyOWIzZjk0ZDAyNTRhMDVkZGY0OC4KKwkgIFJlbHkgb24gbG9ja2luZyBkb25lIGluIEdzdFRhZ1NldHRlciBpbiBjb3JlIGdpdC4KKworMjAxMC0wNi0wMSAwOToyMzoxOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogcmVxdWlyZSBjb3JlL2Jhc2UgZ2l0CisJICBGb3IgV2ViTSB0eXBlZmluZGluZyBhbmQgR3N0VGFnc2V0dGVyIGZpeGVzLgorCisyMDEwLTA2LTAxIDA5OjE3OjUyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDAuMTAuMjMgPT09CisKKzIwMTAtMDUtMzAgMTQ6MDM6NTMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAwLjEwLjIzCisKKzIwMTAtMDUtMzAgMTQ6MDI6MDQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTAtMDUtMjkgMTA6MjM6NDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogRml4IHBvc2l0aW9uIHF1ZXJ5CisKKzIwMTAtMDUtMjggMTU6MTQ6MDcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2Evd2VibS1tdXguYzoKKwkgIGRvY3M6IHJlbW92ZSB1bm5lY2Vzc2FyeSB2aWRlb3JhdGUgZWxlbWVudCBmcm9tIHdlYm1tdXggZXhhbXBsZSBwaXBlbGluZQorCisyMDEwLTA1LTI4IDEwOjQzOjM2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAganBlZ2VuYzogS2VlcCB2YXJpYWJsZXMgaW4gc2FuZSBzdGF0ZSBhZnRlciBfcmVzZXQKKwkgIFdoZW4gcmVzZXRpbmcsIGtlZXAgJ3JvdycgdmFyaWFibGVzIGF0IGEgc2FuZSBzdGF0ZSBhZnRlcgorCSAgZnJlZWluZyB0byBhdm9pZCBpdCBiZWluZyBmcmVlZCBhZ2FpbiBvbiBfcmVzeW5jIHJlYWxsb2MKKwkgIHdoZW4gdGhlIGVsZW1lbnQgaXMgcmV1c2VkLgorCSAgRml4ZXMgIzYxOTk0MworCisyMDEwLTA1LTI3IDE4OjA4OjE3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogRml4IGZsb2F0aW5nIHBvaW50IHRvIGludGVnZXIgY29udmVyc2lvbiBmb3IgdGhlIGFscGhhIHZhbHVlcworCSAgRml4ZXMgYnVnICM2MTk4MzUuCisKKzIwMTAtMDUtMjYgMDg6NTQ6MzMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjIyLjMgcHJlLXJlbGVhc2UKKworMjAxMC0wNS0yNiAwMDozMzo1OSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTAtMDUtMjUgMTU6MzQ6MTEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBoYW5kbGUgdHJ1bmNhdGVkIGlucHV0IGRhdGEgYXQgRU9TIGluIHB1bGwgbW9kZQorCSAgRml4ZXMgIzYxNzczMy4KKworMjAxMC0wNS0yNiAxMTo1NToxMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSAzNTdiMGRiIHRvIGZkN2NhMDQKKworMjAxMC0wNS0yNSAyMToxNDowNSArMDIwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBSb3VuZCB0aW1lc3RhbXAgdXAgd2hlbiBzY2FsaW5nIHRvIG1vdiBmb3JtYXQKKwkgIEZpeCB0aW1lc3RhbXAgcm91bmRpbmcgdG8gYWxsb3cgdGhlIGNvcnJlY3QgaW5kZXggdG8gYmUgbG9jYXRlZC4KKwkgIFRoZSBpc3N1ZSB3YXMgdGhhdCBzY2FsaW5nIGZyb20gR1N0cmVhbWVyIHRpbWUgZm9ybWF0IHRvIG1vdiB0aW1lIGZvcm1hdCB3YXMKKwkgIHJvdW5kaW5nIGRvd24gY2F1c2luZyB0aGUgdGltZXN0YW1wIG9mIHRoZSBuZXdzZWdtZW50IGV2ZW50IHJlY2VpdmVkIGFmdGVyIGEKKwkgIGZsdXNoaW5nIGtleWZyYW1lIHNlZWsgdG8gZmluZCB0aGUgc2FtcGxlIGluZGV4IGJlZm9yZSB0aGUgb25lIGl0IHNob3VsZAorCSAgY2F1c2luZyBmdXJ0aGVyIGJhY2t3YXJkIHNlZWtpbmcgdG8gdGhlIGtleWZyYW1lIHByaW9yIHVudGlsIG5vIHJvdW5kaW5nIGVycm9yCisJICBvY2N1cnJlZC4KKwkgIFJvdW5kaW5nIHVwIHdoZW4gc2NhbGluZyB0byBtb3YgZm9ybWF0IGhhcyB0aGUgZGVzaXJlZCBlZmZlY3QsIGFuZCBpdCBpcworCSAgbm90IGNsZWFyIHdoZXRoZXIganVzdCB0aGUgX3JvdW5kICgpIHZhcmlhbnQgd291bGQgYmUgc3VmZmljaWVudC4KKwkgIEZpeGVzIGJ1ZyAjNjE5MTA1CisKKzIwMTAtMDUtMjQgMTc6MjY6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIGF2aW11eCwgZmx2bXV4LCBtYXRyb3NrYW11eDogZG9uJ3QgY3Jhc2ggaWYgdGFncyBhcnJpdmUgb24gbXVsdGlwbGUgaW5wdXQgcGFkcyBhdCB0aGUgc2FtZSB0aW1lCisJICBUaGlzIGlzIGEgdGVtcG9yYXJ5IGZpeCBmb3IgdGhlIHJlbGVhc2Ugb25seS4KKwkgIEZpeGVzICM2MTk1MzMuCisKKzIwMTAtMDUtMjUgMTc6MDU6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJICBydHB0aGVvcmE6IHJlbW92ZSBkZWxpdmVyeS1tZXRob2QgZnJvbSBjYXBzCisJICBXZSBjYW4gYWNjZXB0IGFsbCBkZWxpdmVyeSBtZXRob2RzIHNvIGRvbid0IGFkdmVydGlzZSBhbnl0aGluZyBvbiB0aGUgY2FwcyBvcgorCSAgcGFyc2UgYW55dGhpbmcsIHdlIHdpbGwgaGFuZGxlIHdoYXRldmVyIHdlIHJlY2VpdmUuCisJICBGaXhlcyAjNjE4OTQwCisKKzIwMTAtMDUtMjUgMTU6NDA6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EuYzoKKwkgIG1hdHJvc2thOiBhZGQgdGVtcG9yYXJ5IHdlYm0gdHlwZWZpbmRlcgorCSAgQWRkIHdlYm0gdHlwZWZpbmRlciBqdXN0IGZvciB0aGUgcmVsZWFzZSwgc28gd2VibSB3b3JrcyBmb3IKKwkgIHBlb3BsZSB3aG9zZSBkaXN0cm9zIGRvbid0IHBhdGNoIGdzdC1wbHVnaW5zLWJhc2UgYXMgd2VsbC4KKwkgIFdlJ2xsIHJlbW92ZSB0aGlzIGFnYWluIGFmdGVyIHRoZSByZWxlYXNlLgorCisyMDEwLTA1LTIzIDExOjE3OjI3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL3dlYm0tbXV4LmM6CisJICBkb2NzOiBhZGQgc29tZSBwaXBlbGluZSBleGFtcGxlcyB0byB3ZWJtbXV4IGRvY3MKKworMjAxMC0wNS0yMSAxMjoyNzowNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbWFnZWZyZWV6ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSAgZG9jczogYWRkIHdlYm1tdXggdG8gZG9jcworCisyMDEwLTA1LTIxIDEzOjAxOjMwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLmM6CisJKiBnc3QvbWF0cm9za2Evd2VibS1tdXguYzoKKwkgIG1hdHJvc2thOiBmaXggdXAgcGx1Z2luIGFuZCBlbGVtZW50IGRlc2NyaXB0aW9ucyBhIGJpdAorCisyMDEwLTA1LTIxIDEyOjQ3OjAzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLmM6CisJKiBnc3QvbWF0cm9za2Evd2VibS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS93ZWJtLW11eC5oOgorCSAgbWF0cm9za2E6IG1vdmUgd2VibW11eCBpbnRvIG93biBzb3VyY2UgZmlsZXMKKwkgIE1ha2VzIHRoaW5ncyBlYXNpZXIgZm9yIGd0ay1kb2MuCisKKzIwMTAtMDUtMjEgMTI6MjY6MDUgKzA1MDAgIENocmlzdGlhbiBTY2hhbGxlciA8Y2hyaXN0aWFuLnNjaGFsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgVXBkYXRlIHNwZWMgZmlsZSB3aXRoIGxhdGVzdCBjaGFuZ2VzCisKKzIwMTAtMDUtMjAgMjA6MDE6NTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thOiBSZW1vdmUgdGhlIGRvY3R5cGUgZW51bSwgaXQncyBub3QgbmVlZGVkIGFueW1vcmUKKworMjAxMC0wNS0yMCAxOTo1NzoxNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgIHdlYm1tdXg6IEFkZCBuZXcgd2VibW11eCBlbGVtZW50IHRoYXQgb25seSBzdXBwb3J0cyBtdXhpbmcgb2YgV2ViTQorCSAgLi4uYW5kIHJlbW92ZSB0aGUgZG9jdHlwZSBwcm9wZXJ0eSBmcm9tIG1hdHJvc2thbXV4IGFnYWluLgorCisyMDEwLTA1LTIwIDE3OjMxOjU5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FtdXguYzoKKwkgIG1hdHJvc2thbXV4OiB1bml0IHRlc3QgY2hlY2tzIHZlcnNpb24gMSBmaWxlcworCisyMDEwLTA1LTE4IDE1OjI3OjA2IC0wNDAwICBUcmlzdGFuIE1hdHRoZXdzIDx0cmlzdGFuQHNhdC5xYy5jYT4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJICBzcGVleDogZml4IGxhdGVuY3kgcXVlcnkKKwkgIFNwZWV4IHNob3VsZCByZXBvcnQgMzAgbXMgbGF0ZW5jeSBmb3IgbmFycm93YmFuZCBtb2RlLCAzNCBvdGhlcndpc2UuCisJICBGaXhlcyAjNjE5MDE4CisKKzIwMTAtMDUtMTggMjE6MDQ6MzIgKzA4MDAgIFBoaWxpcCA8cGhpbGlwakBvcGVyYS5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkgIGVibWxyZWFkOiBybSBmbG9hdGNhc3QuaCBpbmNsdWRlIChub3QgdXNlZCkKKworMjAxMC0wNS0xNyAwNTozNjowMCArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IGJ1bXAgZGVmYXVsdCBkb2N0eXBlIHZlcnNpb24gdG8gMgorCSAgSW4gdGhpcyBkYXkgYW5kIGFnZSB0aGlzIHNob3VsZCBiZSBzYWZlLiBUaGVyZSdzIG90aGVyd2lzZSBhIHJpc2sgcGVvcGxlCisJICB3aWxsIGJlIGNyZWF0aW5nIHVubmVjY2Vzc2FyaWx5IGJpZyBXZWJNIGZpbGVzIGFzIHRoZXkgY2FuJ3QgdXNlCisJICBTaW1wbGVCbG9jayBpbiB2MS4KKworMjAxMC0wNS0xNyAwNToyNzo0NCArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYTogaGFuZGxlIG1hdHJvc2thIGFuZCB3ZWJtIGRvY3R5cGUgdmVyc2lvbnMgZXF1YWxseQorCSAgVGhlIG9yaWdpbmFsIHBsYW4gd2FzIHRvIGxldCBXZWJNIHYxIGJlIHRoZSBzYW1lIGFzIE1hdHJvc2thIHYyICh3aXRoCisJICBleHRyYSBjb25zdHJhaW50cyksIGJ1dCBmb3Igc2ltcGxpY2l0eSBpdCB3YXMgZGVjaWRlZCB0byBoYW5kbGUgdGhlCisJICB2ZXJzaW9ucyBlcXVhbGx5LCBzdWNoIHRoYXQgZS5nLiBTaW1wbGVCbG9jayBpcyBvbmx5IGFsbG93ZWQgaW4gV2ViTSB2Mi4KKworMjAxMC0wNS0xMyAxMjoxMDo1NCArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBWZXJpZnkgbGFjZSBzaXplIGluIF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrCisJICBGYWlsdXJlIHRvIGRvIHRoaXMgZm9yIGNvcnJ1cHQgaW5wdXQgY2FuIGNhdXNlIGEgc3ViYnVmZmVyIGJpZ2dlcgorCSAgdGhhbiB0aGUgYWN0dWFsIGJ1ZmZlciB0byBiZSBjcmVhdGVkLCBxdWlja2x5IGxlYWRpbmcgdG8gc2VnZmF1bHQuCisJICBUZXN0IGNhc2U6CisJICBidWdfczIyMjAwNTc1MV9yMC4wMDFfX19fbWVtY3B5LndlYm0KKworMjAxMC0wNS0xMyAxMDoyMzoxMCArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBqQG9wZXJhLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBlYm1sOiBjcnVkZSBoYWNrIHRvIGF2b2lkIGNyYXNoaW5nIG9uIHVuZXhwZWN0ZWQgbWV0YWRhdGEKKwkgIFRoZSBjb21tZW50IHNheXMgdGhpcyBjYW5ub3QgaGFwcGVuLCBidXQgaXQgZGlkIGFuZCBJIGRvbid0IGtub3cKKwkgIHdoeS4gVGhpcyBpcyBub3QgdGhlIGNvcnJlY3QgZml4LCBuZWVkcyBpbnZlc3RpZ2F0aW9uLiBUZXN0IGNhc2U6CisJICBidWdfczU1NTAxMDA5NF9yMC4wMDA1OjAuMDA4X19fX0lBX19nX2Fzc2VydGlvbl9tZXNzYWdlX2V4cHIud2VibQorCisyMDEwLTA1LTEzIDA5OjE4OjU2ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJICBlYm1sOiBkb24ndCBtb2RpZnkgb3V0IHN0ciBpZiByZXR1cm5pbmcgYW4gZXJyb3IgaW4gX3JlYWRfYXNjaWkKKwkgIFRoaXMgaXMgYSByZWdyZXNzaW9uIGZyb20gQVNDSUkgdmFsaWRhdGlvbiBjaGFuZ2VzLiBUZXN0IGNhc2U6CisJICBidWdfczY2ODc2MzkwX3IwLjAwMV9fX19tYWxsb2NfcHJpbnRlcnIud2VibQorCisyMDEwLTA1LTEyIDEzOjE2OjI4ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJICBlYm1sOiBWYWxpZGF0ZSA3LWJpdCBBU0NJSSBpbiBnc3RfZWJtbF9yZWFkX2FzY2lpCisJICBUaGlzIHdhcyB0cmlnZ2VyaW5nIGFuIFVURi04IGFzc2VydGlvbiBpbiBnc3RfY2Fwc19zZXRfc2ltcGxlIGZvcgorCSAgY29ycnVwdCBmaWxlcyB3aXRoIGdhcmJhZ2UgYXMgY29kZWMgaWQuIFRlc3QgY2FzZToKKwkgIGdzdHJlYW1lcl9lcnJvcl90cnlpbmdfdG9fc2V0X2ludmFsaWRfdXRmOF9hc19jb2RlY19pZC53ZWJtCisJICBPbGQgZ3N0X2VibWxfcmVhZF9hc2NpaSByZW5hbWVkIHRvIGdzdF9lYm1sX3JlYWRfc3RyaW5nLCBhbHNvIHVzZWQgYnkKKwkgIGdzdF9lYm1sX3JlYWRfdXRmOC4gVW5saWtlIGZvciBVVEYtOCwgZmFpbHVyZSB0byB2YWxpZGF0ZSBpcyBhbiBlcnJvciwKKwkgIGFzIGdzdF9lYm1sX3JlYWRfYXNjaWkgaXMgdXNlZCBmb3IgcmVhZGluZyBkb2N0eXBlIGFuZCBjb2RlYyBpZCBhbmQgd2UKKwkgIG1pZ2h0IGp1c3QgYXMgd2VsbCBnaXZlIHVwIGVhcmx5IGluIHRob3NlIGNhc2VzLgorCisyMDEwLTA1LTEyIDE0OjMwOjE4ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcGpAb3BlcmEuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IElnbm9yZSB1bmV4cGVjdGVkIENvZGVjU3RhdGUKKwkgIEJlY2F1c2UgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKnN0cmVhbSBpcyBzZXQgdXAgaW4gdGhlIGZpcnN0CisJICBTaW1wbGVCbG9jayBvciBCbG9jaywgYSByb2d1ZSBDb2RlY1N0YXRlIG90aGVyd2lzZSBjYXVzZXMgYSBzZWdmYXVsdCBvbgorCSAgZGVyZWZlbmNpbmcgdGhlIE5VTEwgcG9pbnRlci4gVGVzdCBjYXNlOgorCSAgYnVnX3M1NTA2MTY3X3IwLjAwMV9fX19nc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jay53ZWJtCisKKzIwMTAtMDUtMTAgMDY6MDA6NDkgKzAyMDAgIFBoaWxpcCBKw6RnZW5zdGVkdCA8cGhpbGlwakBvcGVyYS5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogQWRkIHZpZGVvL3dlYm0gc2luayBjYXBzCisKKzIwMTAtMDUtMDkgMTk6NDY6NTEgKzAyMDAgIFBoaWxpcCBKw6RnZW5zdGVkdCA8cGhpbGlwQGZvb2xpcC5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBVc2UgU2ltcGxlQmxvY2sgZm9yIFdlYk0gd2hlbiBwb3NzaWJsZQorCisyMDEwLTA1LTA5IDE5OjI4OjU5ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcEBmb29saXAub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFN1cHBvcnQgIndlYm0iIERvY1R5cGUKKworMjAxMC0wNS0wOSAxMjozNToxMCArMDIwMCAgUGhpbGlwIErDpGdlbnN0ZWR0IDxwaGlsaXBAZm9vbGlwLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgbWF0cm9za2FtdXg6IHJlbmFtZSBtYXRyb3NrYV92ZXJzaW9uIHRvIGRvY3R5cGVfdmVyc2lvbgorCisyMDEwLTA1LTA5IDEyOjA5OjU3ICswMjAwICBQaGlsaXAgSsOkZ2Vuc3RlZHQgPHBoaWxpcEBmb29saXAub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJICBtYXRyb3NrYW11eDogU3VwcG9ydCAid2VibSIgRG9jVHlwZQorCisyMDEwLTA1LTEyIDE4OjM4OjQ4IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWRkIFZQOAorCisyMDEwLTA0LTI3IDE1OjI2OjEzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogQWRkIHN1cHBvcnQgZm9yIE9uMiBWUDgKKwkgIC4uLm1hdHJvc2thZGVtdXggYXV0b21hdGljYWxseSBzdXBwb3J0cyBpdCB0aHJvdWdoIGxpYmdzdHJpZmYuCisKKzIwMTAtMDQtMjcgMTU6MjU6MzIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBBZGQgc3VwcG9ydCBmb3IgT24yIFZQOAorCSAgLi4uYXZpZGVtdXggYXV0b21hdGljYWxseSBzdXBwb3J0cyBpdCB0aHJvdWdoIGxpYmdzdHJpZmYuCisKKzIwMTAtMDUtMTcgMTc6MTc6MDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlOiBEb24ndCBsb2NrIHRoZSBtYWlubG9vcCBpbiBOVUxMCisKKzIwMTAtMDUtMTUgMjE6MTU6NTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IFVzZSA9IGluc3RlYWQgb2YgPT0gaW4gc2hlbGwgc2NyaXB0cyBmb3IgZXF1YWxpdHkgY2hlY2tzCisKKzIwMTAtMDUtMTQgMTg6MzM6MzIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjIyLjIgcHJlLXJlbGVhc2UKKworMjAxMC0wNS0xNCAxODoyNDoxNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA0ZDY3YmQ2IHRvIDM1N2IwZGIKKworMjAxMC0wNS0xNCAxODoxNjo0NSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJICB0ZXN0czogZml4IGxlYWsgaW4gc291cGh0dHBzcmMgdW5pdCB0ZXN0CisJICBVbnJlZiBzZXJ2ZXIgb2JqZWN0cyB3aGVuIGRvbmUuIEZpeGVzIGNoZWNrLXZhbGdyaW5kLgorCisyMDEwLTA1LTE0IDE3OjMwOjQwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAganBlZ2VuYzogZml4IHR3byBsZWFrcworCSAgRG9uJ3QgbGVhayBvdGhlcmNhcHMgb3IganBlZ2VuYyByZWYuCisKKzIwMTAtMDUtMTMgMTM6MDE6MjYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBmaXggZG9jcworCSAgRG9jdW1lbnRhdGlvbiBlcnJvciBzcG90dGVkIGJ5IHRvbnkgPGNhaWNhaTAxMTkgYXQgZ21haWwuY29tPgorCSAgRml4ZXMgIzYxODQxOQorCisyMDEwLTA1LTExIDEzOjE4OjQyIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkgIHJ0cHRoZW9yYWRlcGF5OiBtYWtlIGRlbGl2ZXJ5LW1ldGhvZCBwYXJhbWV0ZXIgb3B0aW9uYWwKKwkgIEl0IHByb2JhYmx5IHdpbGwgbm90IGJlIGluIHRoZSBmaW5hbCBSRkMgYXMgaXQgaXMgbm90IGluIFJGQyA1MjE1IGZvciBWb3JiaXMuCisJICBJZiB0aGVyZSBpcyBhIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLCBhc3N1bWUgaXQgaXMgaW4tbGluZSBhbmQgaWYgbm90aGluZyBpcworCSAgc3BlY2lmaWVkLCBhc3N1bWUgaXQgaXMgaW4tYmFuZC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MTgzODYKKworMjAxMC0wNS0xMyAxMjoxNjo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogaW5jcmVhc2UgYWNjZXB0YWJsZSBvdXRwdXQgc2l6ZXMKKwkgIFdlIGNhbiBwZXJmZWN0bHkgZGVjb2RlIDF4MSBpbWFnZXMgc28gbG93ZXIgdGhlIG1pbiB3aWR0aCBhbmQgaGVpZ2h0IHRvIDEuCisJICBGaXhlcyAjNjE4MzkyCisKKzIwMTAtMDUtMTMgMTE6MzA6MjcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdHBheS5jOgorCSAgY2VsdHBheTogZml4IHF1ZXVlIGR1cmF0aW9uIGNhbGN1bGF0aW9ucworCSAgRG9uJ3QgYmxpbmRseSBhZGQgdGhlIGR1cmF0aW9ucyBvZiBpbmNvbW1pbmcgYnVmZmVycyB0byB0aGUgdG90YWwgcXVldWVkCisJICBkdXJhdGlvbiBiZWNhdXNlIGl0IG1pZ2h0IGJlIGludmFsaWQuIE1hcmsgdGhlIHRvdGFsIHF1ZXVlZCBkdXJhdGlvbiBpbnZhbGlkCisJICB3aGVuIHdlIHJlY2VpdmUgYW4gaW52YWxpZCBpbmNvbW1pbmcgdGltZXN0YW1wIGJlY2F1c2UgdGhhdCdzIHdoZW4gd2UgbG9zZSB0cmFjaworCSAgb2YgdGhlIHRvdGFsIHF1ZXVlZCBkdXJhdGlvbi4KKwkgIEZpeGVzICM2MTgzMjQKKworMjAxMC0wNS0xMCAxMToxNDozOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogZXh0cmFjdCBTUFMgYW5kIFBQUyBmcm9tIHByb3BlcnR5IHByb3ZpZGVkIHBhcmFtZXRlciBzZXQKKwkgIC4uLiBzbyBpdCBjYW4gYWxzbyBiZSByZWd1bGFybHkgaW5zZXJ0ZWQgaW50byB0aGUgc3RyZWFtIGlmIHNvIGNvbmZpZ3VyZWQuCisJICBGaXhlcyAjNjE3MTY0LgorCisyMDEwLTA1LTExIDIyOjI4OjA4ICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiBhbGxvdyBzd2l0Y2hpbmcgdmlld3MgYXQgcnVudGltZS4KKworMjAxMC0wNS0xMSAyMDoyNjozNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICBydHA6IGRpc3QgbWlzc2luZyBoZWFkZXIgZmlsZSB0byBmaXggbWFrZSBkaXN0Y2hlY2sKKworMjAxMC0wNS0xMSAxOTowNTowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3M0L29zczQtc2luay5jOgorCSAgb3NzNDogbWlub3IgY2xlYW51cAorCSAgUmVtb3ZlIGZpeGVkIEZJWE1FLCBjaGFuZ2UgZmluYWxpc2UgdG8gZmluYWxpemUgZm9yIGNvbnNpc3RlbmN5LgorCisyMDEwLTA1LTExIDE5OjAxOjUxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sOgorCSAgZG9jczogYWRkIG9zczQgZWxlbWVudHMgdG8gZG9jcworCisyMDEwLTA1LTExIDE2OjA5OjEwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2t5LnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBwbzogbW92ZSBvc3M0IHN0cmluZ3MgZnJvbSAtYmFkIHRvIC1nb29kCisKKzIwMTAtMDUtMTEgMTY6MDg6MjEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJKiBwby9QT1RGSUxFUy5pbjoKKwkqIHN5cy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ljbGVzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgIE1vdmUgb3NzNCBwbHVnaW4gZnJvbSAtYmFkIHRvIC1nb29kCisJICBIb29rIHVwIGJ1aWxkIGluZnJhc3RydWN0dXJlLCBkb2NzIGFuZCB0ZXN0cy4KKwkgIEZpeGVzICM2MTQzMDUuCisKKzIwMTAtMDQtMjkgMTM6MTg6NTggKzAxMDAgIEJyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ab3JhY2xlLmNvbT4KKworCSogc3lzL29zczQvb3NzNC1zaW5rLmM6CisJKiBzeXMvb3NzNC9vc3M0LXNpbmsuaDoKKwkgIG9zczRzaW5rOiBpbXBsZW1lbnQgR3N0U3RyZWFtVm9sdW1lIGludGVyZmFjZSBhbmQgYWRkIG11dGUgYW5kIHZvbHVtZSBwcm9wZXJ0aWVzCisJICBPU1M0IHN1cHBvcnRzIHBlci1zdHJlYW0gdm9sdW1lIGNvbnRyb2wsIHNvIGV4cG9zZSB0aGlzIHVzaW5nIHRoZSByaWdodAorCSAgQVBJLCBzbyB0aGF0IHBsYXliaW4yIGFuZCBhcHBsaWNhdGlvbnMgbGlrZSB0b3RlbSBjYW4gbWFrZSB1c2Ugb2YgaXQKKwkgIChpbnN0ZWFkIG9mIHVzaW5nIGEgdm9sdW1lIGVsZW1lbnQgZm9yIHZvbHVtZSBjb250cm9sKS4KKwkgIEZpeGVzICM2MTQzMDUuCisKKzIwMTAtMDQtMDggMTA6NDU6MzMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvb3NzNC9vc3M0LWF1ZGlvLmM6CisJICBvc3M0OiA4LWJpdCBQQ00gYXVkaW8gY2FwcyBkb24ndCBuZWVkIGFuIGVuZGlhbm5lc3MgZmllbGQKKworMjAxMC0wNC0wOCAxMDo0MDowMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3M0L29zczQtYXVkaW8uYzoKKwkgIG9zczQ6IGRvbid0IGl0ZXJhdGUgdGhlIGZvcm1hdHMgdGFibGUgdHdpY2UgZm9yIGVhY2ggZW50cnkKKwkgIFdoZW4gaXRlcmF0aW5nIHRoZSBmb3JtYXRzIHRhYmxlLCB3ZSBjYW4ganVzdCBwYXNzIHRoZSB3aG9sZQorCSAgZW50cnkgdG8gb3VyIGhlbHBlciBmdW5jdGlvbiwgd2hpY2ggYXZvaWRzIGl0ZXJhdGluZyB0aGUgdGFibGUKKwkgIGFnYWluIHRvIGZpbmQgdGhlIGVudHJ5IHN0cnVjdHVyZSBmcm9tIHRoZSBwYXNzZWQgZm9ybWF0IGlkLgorCisyMDEwLTAzLTMwIDExOjQzOjA0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zczQvb3NzNC1hdWRpby5jOgorCSAgb3NzNDogYWxzbyBhY2NlcHQgZm9ybWF0cyBub3QgbmF0aXZlbHkgc3VwcG9ydGVkCisJICBBbHNvIGFjY2VwdCBmb3JtYXRzIHRoYXQgYXJlIG5vdCBuYXRpdmVseSBzdXBwb3J0ZWQgYnkgdGhlCisJICBoYXJkd2FyZSwgT1NTNCBjYW4gY29udmVydCB0aGVtIGludGVybmFsbHkuIExpc3QgdGhlIG5hdGl2ZQorCSAgZm9ybWF0cyBmaXJzdCBpbiB0aGUgY2FwcyB0aG91Z2gsIHRvIGV4cHJlc3Mgb3VyIHByZWZlcmVuY2UKKwkgIGZvciB0aGUgbmF0aXZlIGZvcm1hdHMuIFdlIG5lZWQgdGhpcyBpbiBvcmRlciB0byBzdXBwb3J0IHRoZQorCSAgY2FzZSBwcm9wZXJseSB3aGVyZSB0aGUgYXVkaW8gaGFyZHdhcmUgc3VwcG9ydHMgb25seSBlLmcuCisJICBsaXR0bGUgZW5kaWFuIFBDTSwgYnV0IHRoZSBob3N0IGlzIGJpZyBlbmRpYW4sIHNpbmNlIG1hbnkKKwkgIGF1ZGlvIGVsZW1lbnRzIG9ubHkgc3VwcG9ydCBuYXRpdmUgZW5kaWFubmVzcyBhbmQgbWFrZSB0aGUKKwkgIHJlYXNvbmFibGUgYXNzdW1wdGlvbiB0aGF0IGFueSBhdWRpb3Npbmsgd2lsbCBiZSBhYmxlIHRvCisJICBoYW5kbGUgYXVkaW8gaW4gbmF0aXZlIGVuZGlhbm5lc3MuCisJICBCYXNlZCBvbiBwYXRjaCBieSBKZXJyeSBUYW4gPGplcnJ5LnRhbkBzdW4uY29tPgorCSAgRml4ZXMgIzYxNDMxNy4KKworMjAxMC0wMy0zMCAwMToxNDo1OCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXIuYzoKKwkgIG9zczQ6IGFkZCBjb21tZW50IGZvciB0cmFuc2xhdG9ycworCSAgTm90IHRoYXQgdGhhdCB3aWxsIG1ha2UgdGhlc2Ugc3RyaW5ncyBtdWNoIGJldHRlci4gQWxzbyByZW1vdmUgaTE4bgorCSAgbWFya2VyIHdoZXJlIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZS4KKworMjAxMC0wMy0yMiAxNjoxMzoxMiArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6CisJICBvc3M0OiBSZWZhY3RvciBjb2RlIHRvIG1ha2UgaXQgbG9vayBtb3JlIG1vZGVybgorCSAgQSBzaWRlIGVmZmVjdCBpcyB0aGF0IGl0IHBhc3NlcyAtV2Zvcm1hdC1ub25saXRlcmFsIGFuZCBkb2Vzbid0IHJlYWQKKwkgIGludmFsaWQgbWVtb3J5IGluIHNvbWUgY2FzZXMsIGxpa2Ugd2hlbiB0aGUgbWl4ZXIgdHJhY2sgY29udGFpbnMKKwkgIGEgJSBzaWduIG9yIHRoZXJlIGlzIGEgbnVtYmVyIGJ1dCBub3QgYSBrbm93biBtaXhlciBuYW1lLgorCisyMDEwLTAzLTIyIDE0OjA5OjI0ICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXIuYzoKKwkgIG9zczQ6IEF2b2lkIGdfcXVhcmtfdG9fc3RyaW5nIChnX3F1YXJrX2Zyb21fc3RyaW5nICgpKSBtYWRuZXNzCisJICBXZSB0byB0aGUgc3RyZHVwIGluc2lkZSBnc3Rfb3NzNF9taXhlcl9jb250cm9sX2dldF90cmFuc2xhdGVkX25hbWUoKQorCSAgaW5zdGVhZCBvZiBpbiB0aGUgb25seSBjYWxsZXIuCisKKzIwMTAtMDMtMjEgMjE6Mzk6MTggKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogc3lzL29zczQvb3NzNC1taXhlci5jOgorCSAgQWRkIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVdtaXNzaW5nLXByb3RvdHlwZXMgdG8gY29uZmlndXJlIGZsYWdzCisJICBBbmQgZml4IGFsbCB3YXJuaW5ncworCisyMDEwLTAxLTIwIDEzOjI5OjUyICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXIuYzoKKwkgIEZpeCBjb21waWxlciB3YXJuaW5nIGFib3V0IHVudXNlZCByZXR1cm4gdmFsdWUKKworMjAwOS0wOC0yMSAwMToxNzoxOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2ljbGVzL3Rlc3Qtb3NzNC5jOgorCSAgdGVzdHM6IGZpeCB0ZXN0LW9zczQgdG8gdHJlYXQgYW4gZW1wdHkgZGV2aWNlIG5hbWUgdGhlIHNhbWUgYXMgYSBOVUxMIG5hbWUKKworMjAwOS0wNy0xNiAxMzo1NToxNCArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6CisJICBvc3M0OiBBdHRlbXB0IHRvIGZpeCBhIGNvbXBpbGVyIHdhcm5pbmcKKwkgIERvbid0IHN0b3JlIGEgY29uc3QgZ2NoYXIgKiBpbiBhIG5vbi1jb25zdCBnY2hhciAqIGxvY2FsIHZhci4KKwkgIEFsc28sIG1ha2UgdGhlIHRyYW5zbGF0aW9uIHN0cmluZyBmdW5jdGlvbiBzdGF0aWMgc2luY2UgaXQncyBvbmx5CisJICB1c2VkIGluIHRoZSBvbmUgZmlsZS4KKworMjAwOS0wNi0xMCAxOToyMToyMSArMDEwMCAgR2FycmV0dCBEJ0Ftb3JlIDxnYXJyZXR0LmRhbW9yZUBzdW4uY29tPgorCisJKiBzeXMvb3NzNC9vc3M0LWF1ZGlvLmM6CisJKiBzeXMvb3NzNC9vc3M0LW1peGVyLXNsaWRlci5jOgorCSogc3lzL29zczQvb3NzNC1taXhlci1zd2l0Y2guYzoKKwkqIHN5cy9vc3M0L29zczQtbWl4ZXIuYzoKKwkgIG9zczQ6IEVuaGFuY2VtZW50cyB0byB0aGUgbWl4ZXIgYW5kIGF1ZGlvIG91dHB1dAorCSAgQ29kZSBjbGVhbnVwcywgZ2VuZXJhbCBpbXByb3ZlbWVudHMsIHN1cHBvcnQgZm9yIHRoZQorCSAgbmV3IG1peGVyIGZsYWdzIGluIGxhdGVzdCBnc3QtcGx1Z2lucy1iYXNlLgorCSAgRml4ZXM6ICM1ODQyNTIKKwkgIFBhdGNoIEJ5OiBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uQHN1bi5jb20+CisJICBQYXRjaCBCeTogR2FycmV0dCBEJ0Ftb3JlIDxnYXJyZXR0LmRhbW9yZUBzdW4uY29tPgorCisyMDA5LTA2LTE5IDE2OjIxOjI4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zczQvb3NzNC1taXhlci5jOgorCSAgTWFrZSBidWlsZCB3aXRob3V0IHdhcm5pbmdzIHdpdGggZGVidWdnaW5nIGRpc2FibGVkCisKKzIwMDgtMTEtMDQgMTI6NDI6MzAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgRG9uJ3QgaW5zdGFsbCBzdGF0aWMgbGlicyBmb3IgcGx1Z2lucy4gRml4ZXMgIzU1MDg1MSBmb3IgLWJhZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYWxzYXNwZGlmL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYW1yd2IvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hcGV4c2luay9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FydHMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hcnRzZC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2F1ZGlvZmlsZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2F1ZGlvcmVzYW1wbGUvTWFrZWZpbGUuYW06CisJICAqIGV4dC9iejIvTWFrZWZpbGUuYW06CisJICAqIGV4dC9jZGF1ZGlvL01ha2VmaWxlLmFtOgorCSAgKiBleHQvY2VsdC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2RjMTM5NC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2RpcmFjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGlyZWN0ZmIvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kaXZ4L01ha2VmaWxlLmFtOgorCSAgKiBleHQvZHRzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZmFhYy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2ZhYWQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9nc20vTWFrZWZpbGUuYW06CisJICAqIGV4dC9oZXJtZXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9pdm9yYmlzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvamFjay9NYWtlZmlsZS5hbToKKwkgICogZXh0L2pwMmsvTWFrZWZpbGUuYW06CisJICAqIGV4dC9sYWRzcGEvTWFrZWZpbGUuYW06CisJICAqIGV4dC9sY3MvTWFrZWZpbGUuYW06CisJICAqIGV4dC9saWJmYW1lL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbGlibW1zL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbWV0YWRhdGEvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tcGVnMmVuYy9NYWtlZmlsZS5hbToKKwkgICogZXh0L21wbGV4L01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXVzZXBhY2svTWFrZWZpbGUuYW06CisJICAqIGV4dC9tdXNpY2JyYWluei9NYWtlZmlsZS5hbToKKwkgICogZXh0L215dGh0di9NYWtlZmlsZS5hbToKKwkgICogZXh0L25hcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L25lb24vTWFrZWZpbGUuYW06CisJICAqIGV4dC9vZmEvTWFrZWZpbGUuYW06CisJICAqIGV4dC9wb2x5cC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3Jlc2luZHZkL01ha2VmaWxlLmFtOgorCSAgKiBleHQvc2RsL01ha2VmaWxlLmFtOgorCSAgKiBleHQvc2hvdXQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zbmFwc2hvdC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NuZGZpbGUvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zb3VuZHRvdWNoL01ha2VmaWxlLmFtOgorCSAgKiBleHQvc3BjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvc3dmZGVjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGFya2luL01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGhlb3JhL01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGltaWRpdHkvTWFrZWZpbGUuYW06CisJICAqIGV4dC90d29sYW1lL01ha2VmaWxlLmFtOgorCSAgKiBleHQveDI2NC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3hpbmUvTWFrZWZpbGUuYW06CisJICAqIGV4dC94dmlkL01ha2VmaWxlLmFtOgorCSAgKiBnc3QtbGlicy9nc3QvYXBwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QtbGlicy9nc3QvZHNob3cvTWFrZWZpbGUuYW06CisJICAqIGdzdC9haWZmcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hcHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb2J1ZmZlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2JheWVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvY2R4YXBhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvY2hhcnQvTWFrZWZpbGUuYW06CisJICAqIGdzdC9jb2xvcnNwYWNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGNjcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlaW50ZXJsYWNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZHZkc3B1L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZmVzdGl2YWwvTWFrZWZpbGUuYW06CisJICAqIGdzdC9maWx0ZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9mbGFjcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9mbHYvTWFrZWZpbGUuYW06CisJICAqIGdzdC9nYW1lcy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2gyNjRwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2xpYnJmYi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21peG1hdHJpeC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21vZHBsdWcvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tcGVnMXN5cy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21wZWc0dmlkZW9wYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21wZWdkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21wZWd0c211eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21wZWd2aWRlb3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXZlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbnNmL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbnV2ZGVtdXgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9vdmVybGF5L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcGFzc3Rocm91Z2gvTWFrZWZpbGUuYW06CisJICAqIGdzdC9wY2FwcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9wbGF5b25kZW1hbmQvTWFrZWZpbGUuYW06CisJICAqIGdzdC9yYXdwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3JlYWwvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydGpwZWcvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc2NhbGV0ZW1wby9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NkcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NlbGVjdG9yL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc21vb3RoL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc21vb3Rod2F2ZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NwZWVkL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3BlZXhyZXNhbXBsZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3N0ZXJlby9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3N1YmVuYy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3R0YS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZiaWRlYy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZpZGVvZHJvcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZpZGVvc2lnbmFsL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlydHVhbGR1Yi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZtbmMvTWFrZWZpbGUuYW06CisJICAqIGdzdC95NG0vTWFrZWZpbGUuYW06CisJICAqIHN5cy9hY21lbmMvTWFrZWZpbGUuYW06CisJICAqIHN5cy9jZHJvbS9NYWtlZmlsZS5hbToKKwkgICogc3lzL2RzaG93ZGVjd3JhcHBlci9NYWtlZmlsZS5hbToKKwkgICogc3lzL2RzaG93c3Jjd3JhcHBlci9NYWtlZmlsZS5hbToKKwkgICogc3lzL2R2Yi9NYWtlZmlsZS5hbToKKwkgICogc3lzL2R4cjMvTWFrZWZpbGUuYW06CisJICAqIHN5cy9mYmRldi9NYWtlZmlsZS5hbToKKwkgICogc3lzL29zczQvTWFrZWZpbGUuYW06CisJICAqIHN5cy9xY2FtL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvcXR3cmFwcGVyL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvdmNkL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvd2luaW5ldC9NYWtlZmlsZS5hbToKKwkgICogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgRG9uJ3QgaW5zdGFsbCBzdGF0aWMgbGlicyBmb3IgcGx1Z2lucy4gRml4ZXMgIzU1MDg1MSBmb3IgLWJhZC4KKworMjAwOC0xMC0xMiAyMTo1MjoyNyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHN5cy9vc3M0LzogQWRkIHNvbWUgc3BhY2VzIGluIHRyYW5zbGF0ZWFibGUgc3RyaW5ncy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6CisJICAqIHN5cy9vc3M0L29zczQtc2luay5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSAgQWRkIHNvbWUgc3BhY2VzIGluIHRyYW5zbGF0ZWFibGUgc3RyaW5ncy4KKwkgIEZpeGVzOiAjNTU1OTY5ICM1NTU5NjggIzU1NTk2NQorCisyMDA4LTA4LTA3IDE2OjIwOjMwICswMDAwICBGcmVkZXJpYyBDcm96YXQgPGZjcm96YXRAbWFuZHJpdmEub3JnPgorCisJICBNYWtlIHN1cmUgZ2V0dGV4dCByZXR1cm5zIHRyYW5zbGF0aW9ucyBpbiBVVEYtOCBlbmNvZGluZyByYXRoZXIgdGhhbiBpbiB0aGUgY3VycmVudCBsb2NhbGUgZW5jb2RpbmcgKCM1NDY4MjIpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogRnJlZGVyaWMgQ3JvemF0IDxmY3JvemF0QG1hbmRyaXZhLm9yZz4KKwkgICogZXh0L3NuZGZpbGUvZ3N0c2YuYzogKHBsdWdpbl9pbml0KToKKwkgICogc3lzL2R2Yi9nc3RkdmJzcmMuYzogKGdzdF9kdmJzcmNfcGx1Z2luX2luaXQpOgorCSAgKiBzeXMvb3NzNC9vc3M0LWF1ZGlvLmM6IChwbHVnaW5faW5pdCk6CisJICBNYWtlIHN1cmUgZ2V0dGV4dCByZXR1cm5zIHRyYW5zbGF0aW9ucyBpbiBVVEYtOCBlbmNvZGluZyByYXRoZXIKKwkgIHRoYW4gaW4gdGhlIGN1cnJlbnQgbG9jYWxlIGVuY29kaW5nICgjNTQ2ODIyKS4KKworMjAwOC0wNi0xNiAwNzozMDozNCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBGaW5hbCByb3VuZCBvZiBkb2MgdXBkYXRlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgICogZ3N0L3NwZWVkL2dzdHNwZWVkLmM6CisJICAqIGdzdC9zcGVleHJlc2FtcGxlL2dzdHNwZWV4cmVzYW1wbGUuYzoKKwkgICogZ3N0L3ZpZGVvc2lnbmFsL2dzdHZpZGVvYW5hbHlzZS5jOgorCSAgKiBnc3QvdmlkZW9zaWduYWwvZ3N0dmlkZW9kZXRlY3QuYzoKKwkgICogZ3N0L3ZpZGVvc2lnbmFsL2dzdHZpZGVvbWFyay5jOgorCSAgKiBzeXMvZHZiL2dzdGR2YnNyYy5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6CisJICAqIHN5cy9vc3M0L29zczQtc2luay5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSAgKiBzeXMvd2luaW5ldC9nc3R3aW5pbmV0c3JjLmM6CisJICBGaW5hbCByb3VuZCBvZiBkb2MgdXBkYXRlcy4KKworMjAwOC0wNi0xMiAxNDo0OToxOCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBEbyBub3QgdXNlIHNob3J0X2Rlc2NyaXB0aW9uIGluIHNlY3Rpb24gZG9jcyBmb3IgZWxlbWVudHMuIFdlIGV4dHJhY3QgdGhlbSBmcm9tIGVsZW1lbnQgZGV0YWlscyBhbmQgdGhlcmUgd2lsbCBiZSB3YXIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZGMxMzk0L2dzdGRjMTM5NC5jOgorCSAgKiBleHQvaXZvcmJpcy92b3JiaXNkZWMuYzoKKwkgICogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOgorCSAgKiBleHQvbWV0YWRhdGEvZ3N0bWV0YWRhdGFkZW11eC5jOgorCSAgKiBleHQvbXl0aHR2L2dzdG15dGh0dnNyYy5jOgorCSAgKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOgorCSAgKiBnc3QtbGlicy9nc3QvYXBwL2dzdGFwcHNpbmsuYzoKKwkgICogZ3N0L2JheWVyL2dzdGJheWVyMnJnYi5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgICogZ3N0L3Jhd3BhcnNlL2dzdGF1ZGlvcGFyc2UuYzoKKwkgICogZ3N0L3Jhd3BhcnNlL2dzdHZpZGVvcGFyc2UuYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGNsaWVudC5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgKiBnc3Qvc2VsZWN0b3IvZ3N0aW5wdXRzZWxlY3Rvci5jOgorCSAgKiBnc3Qvc2VsZWN0b3IvZ3N0b3V0cHV0c2VsZWN0b3IuYzoKKwkgICogZ3N0L3ZpZGVvc2lnbmFsL2dzdHZpZGVvYW5hbHlzZS5jOgorCSAgKiBnc3QvdmlkZW9zaWduYWwvZ3N0dmlkZW9kZXRlY3QuYzoKKwkgICogZ3N0L3ZpZGVvc2lnbmFsL2dzdHZpZGVvbWFyay5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6CisJICAqIHN5cy9vc3M0L29zczQtc2luay5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSAgRG8gbm90IHVzZSBzaG9ydF9kZXNjcmlwdGlvbiBpbiBzZWN0aW9uIGRvY3MgZm9yIGVsZW1lbnRzLiBXZSBleHRyYWN0CisJICB0aGVtIGZyb20gZWxlbWVudCBkZXRhaWxzIGFuZCB0aGVyZSB3aWxsIGJlIHdhcm5pbmdzIGlmIHRoZXkgZGlmZmVyLgorCSAgQWxzbyBmaXhpbmcgdXAgdGhlIENoYW5nZUxvZyBvcmRlci4KKworMjAwOC0wNi0xMiAxMzowNjozNyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICB0ZXN0cy9pY2xlcy90ZXN0LW9zczQuYzogSW5jbHVkZSBzdGRsaWIuaC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9pY2xlcy90ZXN0LW9zczQuYzoKKwkgIEluY2x1ZGUgc3RkbGliLmguCisKKzIwMDgtMDUtMjIgMTY6MzM6MjUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHRlc3RzL2ljbGVzLzogU21hbGwgb3NzNCB0ZXN0IHRoYXQgcHJvYmVzIGZvciBhdmFpbGFibGUgZGV2aWNlcyBhbmQgcmV0cmlldmVzIHRoZWlyIGNhcHMgYW5kIG1peGVyIHRyYWNrcyBhbmQgYWxsIHRoYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2ljbGVzLy5jdnNpZ25vcmU6CisJICAqIHRlc3RzL2ljbGVzL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9pY2xlcy90ZXN0LW9zczQuYzogKG9wdF9zaG93X21peGVyX21lc3NhZ2VzKSwgKFdBSVRfVElNRSksCisJICAoc2hvd19taXhlcl9tZXNzYWdlcyksIChwcm9iZV9taXhlcl90cmFja3MpLCAocHJvYmVfcGFkKSwKKwkgIChwcm9iZV9kZXRhaWxzKSwgKHByb2JlX2VsZW1lbnQpLCAobWFpbik6CisJICBTbWFsbCBvc3M0IHRlc3QgdGhhdCBwcm9iZXMgZm9yIGF2YWlsYWJsZSBkZXZpY2VzIGFuZCByZXRyaWV2ZXMKKwkgIHRoZWlyIGNhcHMgYW5kIG1peGVyIHRyYWNrcyBhbmQgYWxsIHRoYXQuIEFsc28gYWxsb3dzIHRlc3Rpbmcgb2YKKwkgIG1peGVyIGNoYW5nZSBtZXNzYWdlcyBvbiB0aGUgYnVzLgorCisyMDA4LTA1LTIyIDE1OjE0OjI2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvb3NzNC86IE1ha2UgZGV2aWNlLW5hbWUgcHJvYmluZyBpbiBOVUxMIHN0YXRlIHdvcmsgYmV0dGVyIChlLmcuIGZvciB0aGUgZ25vbWUtY29udHJvbC1jZW50ZXIgc291bmQgY2FwcGxldCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zczQvb3NzNC1taXhlci5jOiAoZ3N0X29zczRfbWl4ZXJfb3Blbik6CisJICAqIHN5cy9vc3M0L29zczQtcHJvcGVydHktcHJvYmUuYzoKKwkgIChnc3Rfb3NzNF9wcm9wZXJ0eV9wcm9iZV9maW5kX2RldmljZV9uYW1lKSwKKwkgIChnc3Rfb3NzNF9wcm9wZXJ0eV9wcm9iZV9maW5kX2RldmljZV9uYW1lX25vZmQpOgorCSAgKiBzeXMvb3NzNC9vc3M0LXByb3BlcnR5LXByb2JlLmg6CisJICAqIHN5cy9vc3M0L29zczQtc2luay5jOiAoZ3N0X29zczRfc2lua19nZXRfcHJvcGVydHkpOgorCSAgKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOiAoZ3N0X29zczRfc291cmNlX2dldF9wcm9wZXJ0eSk6CisJICBNYWtlIGRldmljZS1uYW1lIHByb2JpbmcgaW4gTlVMTCBzdGF0ZSB3b3JrIGJldHRlciAoZS5nLiBmb3IgdGhlCisJICBnbm9tZS1jb250cm9sLWNlbnRlciBzb3VuZCBjYXBwbGV0KS4KKworMjAwOC0wNS0wOCAxOToxNjoxNyArMDAwMCAgQ2xpdmUgV3JpZ2h0IDxjbGl2ZV93cmlnaHRAbnRsd29ybGQuY29tPgorCisJICBzeXMvb3NzNC9vc3M0LW1peGVyLXNsaWRlci5jOiBBcHBhcmVudGx5IG1vbm8gc2xpZGVycyBoYXZlIHRoZSBtb25vIHZhbHVlIHJlcGVhdGVkIGluIHRoZSB1cHBlciBiaXRzLCBzbyBtYXNrIHRob3NlIG8uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IENsaXZlIFdyaWdodCA8Y2xpdmVfd3JpZ2h0IG50bHdvcmxkIGNvbT4KKwkgICogc3lzL29zczQvb3NzNC1taXhlci1zbGlkZXIuYzogKGdzdF9vc3M0X21peGVyX3NsaWRlcl91bnBhY2tfdm9sdW1lKToKKwkgIEFwcGFyZW50bHkgbW9ubyBzbGlkZXJzIGhhdmUgdGhlIG1vbm8gdmFsdWUgcmVwZWF0ZWQgaW4gdGhlIHVwcGVyIGJpdHMsCisJICBzbyBtYXNrIHRob3NlIG91dCB3aGVuIHJlYWRpbmcgdGhlbS4gUHJvYmFibHkgbWFrZXMgdGhlIG1peGVyIGFwcGxldAorCSAgd29yayBwcm9wZXJseSBpbiBzb21lIG1vcmUgY2FzZXMuCisKKzIwMDgtMDQtMTEgMDg6MTM6MjIgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBzeXMvb3NzNC86IEZpeCBhcmd1bWVudHMgZm9ybWF0IGluIGRlYnVnIHN0YXRlbWVudHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDgtMDQtMTEgIEp1bGllbiBNb3V0dGUgIDxqdWxpZW5AZmx1ZW5kby5jb20+CisJICAqIHN5cy9vc3M0L29zczQtbWl4ZXItZW51bS5jOgorCSAgKGdzdF9vc3M0X21peGVyX2VudW1fZ2V0X3ZhbHVlc19sb2NrZWQpOgorCSAgKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOiAoZ3N0X29zczRfc291cmNlX2RlbGF5KTogRml4IGFyZ3VtZW50cworCSAgZm9ybWF0IGluIGRlYnVnIHN0YXRlbWVudHMuCisKKzIwMDgtMDQtMDIgMjA6MTg6NTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIE9TU3Y0LiBNaXhlciBzdGlsbCBuZWVkcyBhIGJpdCBtb3JlIGxvdmUsIGJ1dCBldmVuIG1hZ2ljIGhhcyBpdHMgbGltaXRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogc3lzL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3NzNC9NYWtlZmlsZS5hbToKKwkgICogc3lzL29zczQvb3NzNC1hdWRpby5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LWF1ZGlvLmg6CisJICAqIHN5cy9vc3M0L29zczQtbWl4ZXItZW51bS5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LW1peGVyLWVudW0uaDoKKwkgICogc3lzL29zczQvb3NzNC1taXhlci1zbGlkZXIuYzoKKwkgICogc3lzL29zczQvb3NzNC1taXhlci1zbGlkZXIuaDoKKwkgICogc3lzL29zczQvb3NzNC1taXhlci1zd2l0Y2guYzoKKwkgICogc3lzL29zczQvb3NzNC1taXhlci1zd2l0Y2guaDoKKwkgICogc3lzL29zczQvb3NzNC1taXhlci5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LW1peGVyLmg6CisJICAqIHN5cy9vc3M0L29zczQtcHJvcGVydHktcHJvYmUuYzoKKwkgICogc3lzL29zczQvb3NzNC1wcm9wZXJ0eS1wcm9iZS5oOgorCSAgKiBzeXMvb3NzNC9vc3M0LXNpbmsuYzoKKwkgICogc3lzL29zczQvb3NzNC1zaW5rLmg6CisJICAqIHN5cy9vc3M0L29zczQtc291bmRjYXJkLmg6CisJICAqIHN5cy9vc3M0L29zczQtc291cmNlLmM6CisJICAqIHN5cy9vc3M0L29zczQtc291cmNlLmg6CisJICBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBPU1N2NC4gTWl4ZXIgc3RpbGwgbmVlZHMgYSBiaXQgbW9yZSBsb3ZlLAorCSAgYnV0IGV2ZW4gbWFnaWMgaGFzIGl0cyBsaW1pdHMuCisKKzIwMTAtMDUtMTEgMTA6NTI6NTggKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRAZ21haWwuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cuaDoKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5tOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiBpbXBsZW1lbnQgdGhlIHhvdmVybGF5IGludGVyZmFjZS4gRml4ZXMgIzYxODM0OS4KKworMjAxMC0wNS0xMSAxODo0MjozMiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBwdXNoIGJhc2VkIHNlZWtpbmcKKwkgIC4uLiB3aGVyZSBpdCBjb21lcyBkb3duIHRvIHRyYW5zZm9ybWluZyBpbmNvbWluZyBCWVRFIHNlZ21lbnQKKwkgIHRvIGEgY29ycmVzcG9uZGluZyBUSU1FIHNlZ21lbnQuCisJICBBbHNvIGZpeGVzICM2MDk0MDUuCisKKzIwMTAtMDUtMTEgMTQ6MjM6NDcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSAgTW92ZSBpbWFnZWZyZWV6ZSBwbHVnaW4gZnJvbSAtYmFkIHRvIC1nb29kCisJICBIb29rIHVwIGJ1aWxkIGluZnJhc3RydWN0dXJlLCBkb2NzIGFuZCB1bml0IHRlc3QgZm9yIG5ldyBwbHVnaW4uCisJICBGaXhlcyAjNjEzNzg2LgorCisyMDEwLTA1LTA1IDEyOjIzOjU2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogU2V0IGZpeGVkIGNhcHMgb24gdGhlIGNvcnJlY3QgcGFkCisJICBUaGlzIG1ha2VzIHRoZSBzaW5rIGdldGNhcHMgZnVuY3Rpb24gYWN0dWFsbHkgdXNlZCBpbnN0ZWFkIG9mIHVzaW5nCisJICB0aGUgZml4ZWQgY2FwcyBmdW5jdGlvbiBmb3IgaXQuCisKKzIwMTAtMDMtMjEgMjE6Mzk6MTggKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaW1hZ2VmcmVlemUuYzoKKwkgIEFkZCAtV21pc3NpbmctZGVjbGFyYXRpb25zIC1XbWlzc2luZy1wcm90b3R5cGVzIHRvIGNvbmZpZ3VyZSBmbGFncworCSAgQW5kIGZpeCBhbGwgd2FybmluZ3MKKworMjAxMC0wMy0xNSAxMTo1NDowMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IE9ubHkgc3RhcnQgdGhlIHRhc2sgYWZ0ZXIgYSBzZWVrIGlmIGEgYnVmZmVyIHdhcyByZWNlaXZlZCBhbHJlYWR5CisKKzIwMTAtMDItMjggMTY6MDg6MTQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IEFkZCBzb21lIHVuaXQgdGVzdHMKKworMjAxMC0wMi0yOCAxNjowNDozMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jOgorCSAgaW1hZ2VmcmVlemU6IFNldCB1bmRlZmluZWQgZnJhbWVyYXRlIGluIHNpbmsgZ2V0Y2FwcyBmdW5jdGlvbgorCisyMDEwLTAyLTI4IDE1OjAyOjAyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJICBpbWFnZWZyZWV6ZTogSW1wbGVtZW50IHJldmVyc2UgcGxheWJhY2sgYW5kIHNldCBidWZmZXIgb2Zmc2V0cworCisyMDEwLTAyLTI3IDE3OjMzOjA1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2ltYWdlZnJlZXplL01ha2VmaWxlLmFtOgorCSogZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmM6CisJKiBnc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuaDoKKwkgIGltYWdlZnJlZXplOiBBZGQgc3RpbGwgZnJhbWUgc3RyZWFtIGdlbmVyYXRvciBlbGVtZW50CisKKzIwMTAtMDUtMTEgMTM6MDc6MTkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZ3N0L2RlYnVndXRpbHMvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWd1dGlscy9nc3RkZWJ1Zy5jOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSAgTW92ZSBjYXBzZmlsdGVyIGVsZW1lbnQgZnJvbSAtYmFkIHRvIC1nb29kCisJICBIb29rIHVwIG1vdmVkIGZpbGVzIHRvIHRoZSBidWlsZCBpbmZyYXN0cnVjdHVyZSBhbmQgZG9jcy4KKwkgIEZpeGVzICM2MTc3MzkuCisKKzIwMTAtMDUtMDYgMTM6MTI6MzIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmg6CisJICBjYXBzc2V0dGVyOiBTb21lIG1pbm9yIGNsZWFudXAKKworMjAxMC0wMy0yMiAxNjo1NjowMyArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jYXBzc2V0dGVyLmM6CisJICBBZGQgLVdvbGQtc3R5bGUtZGVmaW5pdGlvbgorCSAgYW5kIGZpeCB0aGUgd2FybmluZ3MKKworMjAxMC0wMy0xOCAxNzozMDoyNiArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmM6CisJICBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlscyA9PiBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUKKworMjAwOS0xMC0wOCAxOTo1MTozMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NhcHNzZXR0ZXIuYzoKKwkgIGNhcHNzZXR0ZXI6IGFkZCB1bml0IHRlc3QKKworMjAwOS0wNi0yNSAxNjo0MTo0OSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNzZXR0ZXIuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNzZXR0ZXIuaDoKKwkgIGNhcHNzZXR0ZXI6IGltcG9ydCBlbGVtZW50IGludG8gLWJhZAorCisyMDEwLTA1LTExIDEyOjA2OjEwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogY2hlY2sgdGhhdCBwYWRzIGhhdmUgYmVlbiBuZWdvdGlhdGVkCisJICBBbHNvIHNldCBmY2NfaGFuZGxlciBmaWVsZCBpbiBhdWRpbyBzdHJlYW0gaGVhZGVyLgorCSAgRml4ZXMgIzYxODM1MS4KKworMjAxMC0wNS0xMCAxODozMzowMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBwYXJ0aWFsIHBhcnNpbmcgb2YgY3R0cyB0YWJsZQorCSAgRml4ZXMgIzYxNjUxNi4KKworMjAxMC0wNS0xMCAxODozMjoxNSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGNsZWFudXAgYSBjb21tZW50IGFuZCBhZGQgc29tZSBkZWJ1ZyBhbmQgY29uZGl0aW9uYWwgY29tcGlsYXRpb24KKworMjAxMC0wNS0xMSAxMDowMTo1MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogQ2hlY2sgZm9yIEdUSysgMy4wIGFuZCBpZiBpdCdzIG5vdCBhdmFpbGFibGUgZm9yIEdUSysgMi4wCisKKzIwMTAtMDUtMTAgMjI6MTE6MTAgKzAyMDAgIEphbiBVcmJhxYRza2kgPHd1bGN6ZXJAd3VsY3plci5vcmc+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IG9ubHkgc3RvcmUgdGhlIGxhc3QgYnVmZmVyIHRpbWVzdGFtcCBpZiBpdCdzIHZhbGlkCisJICBGaXhlcyBidWcgIzYxODMwNQorCisyMDEwLTAxLTA4IDIyOjEzOjU5IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogUmUtc2VuZCBTUFMvUFBTIHdoZW4gcmVxdWVzdGVkCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjA2Njg5CisKKzIwMTAtMDUtMDcgMTc6MDk6MTYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IGZpeCB0eXBvIGluIGRlYnVnIG1lc3NhZ2UKKworMjAxMC0wNS0wNyAxNTo0MjoyMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5oOgorCSAgcnRwdGhlb3JhcGF5OiBhZGQgY29uZmlnLWludGVydmFsIHBhcmFtZXRlciB0byByZS1pbnNlcnQgY29uZmlnIGluIHN0cmVhbQorCSAgQWRkIGEgbmV3IGNvbmZpZy1pbnRlcnZhbCBwcm9wZXJ0eSB0byBpbnN0cnVjdCB0aGUgcGF5bG9hZGVyIHRvIGluc2VydAorCSAgY29uZmlndXJhdGlvbiBoZWFkZXJzIGF0IHBlcmlvZGljIGludGVydmFscyBpbiB0aGUgc3RyZWFtCisJICAod2hlbiBhIGtleWZyYW1lIGlzIGNvdW50ZXJlZCkuCisKKzIwMTAtMDUtMDcgMTU6MzE6MDMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJICBydHB0aGVvcmFkZXBheTogZml4IGluLWJhbmQgY29uZmlndXJhdGlvbiBwYXJzaW5nCisJICBBbHNvIG1ha2UgY29uZmlndXJhdGlvbiBoZWFkZXIgcGFyc2luZyBhIGJpdCBtb3JlIHJlbGF4ZWQgd2l0aCByZXNwZWN0CisJICB0byBsZW5ndGggZmllbGQgaW50ZXJwcmV0YXRpb24uCisKKzIwMTAtMDUtMDcgMTU6MzA6MzAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJICBydHB2b3JiaXNkZXBheTogZml4IGluLWxpbmUgY29uZmlndXJhdGlvbiBwYXJzaW5nCisJICBBbHNvIG1ha2UgY29uZmlndXJhdGlvbiBoZWFkZXIgcGFyc2luZyBhIGJpdCBtb3JlIHJlbGF4ZWQgd2l0aCByZXNwZWN0CisJICB0byBsZW5ndGggZmllbGQgaW50ZXJwcmV0YXRpb24uCisKKzIwMTAtMDUtMDQgMTY6NTc6MzUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgcnRwdGhlb3JhcGF5OiBkbyBub3QgZGlzY2FyZCBkb3duc3RyZWFtIGZsb3cgcmV0dXJuCisKKzIwMTAtMDUtMDQgMTY6NTc6MTEgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgcnRwdGhlb3JhcGF5OiByZWZhY3RvciBidWZmZXIgcGF5bG9hZGluZworCisyMDEwLTA1LTA3IDIwOjQxOjA0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHkuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvc2NhbGVyYm9iLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3ZmaXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmUuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmViZmYuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmV0ZmYuYzoKKwkgIGRlaW50ZXJsYWNlOiBBZGQgc3VwcG9ydCBmb3IgVVlWWQorCisyMDEwLTA1LTA3IDE5OjA2OjM1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBmaXggcmV0dXJuIHZhbHVlCisKKzIwMTAtMDUtMDcgMTk6MDI6MjEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRvbid0IGxlYWsgdGhlIHNlc3Npb24KKworMjAxMC0wNS0wNyAxODo1OTo0MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcDogY29uZmlndXJlIGJhbmR3aWR0aCBwcm9wZXJ0aWVzIGluIHRoZSBzZXNzaW9uCisKKzIwMTAtMDUtMDcgMTg6NTg6NTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGFkZCBwcm9wZXJ0aWVzIHRvIGNvbmZpZ3VyZSB0aGUgYmFuZHdpZHRoCisJICBBZGQgcHJvcGVydGllcyB0byBwcm94eSB0aGUgYmFuZHdpZHRoIGNvbmZpZ3VyYXRpb24gdG8gdGhlIHNlc3Npb24gb2JqZWN0LgorCisyMDEwLTA1LTA3IDE4OjU3OjEzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBydHBzZXNzaW9uOiBhZGQgcHJvcGVydGllcyB0byBjb25maWd1cmUgYmFuZHdpZHRocworCSAgQWRkIHByb3BlcnRpZXMgdG8gY29uZmlndXJlIHRoZSBzZW5kZXIgYW5kIHJlY2VpdmVyIGJhbmR3aWR0aHMuCisJICBDb25maWd1cmUgdGhlIGJhbmR3aWR0aHMgYmVmb3JlIGNhbGN1bGF0aW5nIHRoZSBSVENQIHRpbWVvdXQgd2hlbiB3ZSBuZWVkIHRvLgorCisyMDEwLTA1LTA3IDE4OjU2OjMwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOgorCSAgcnRwc3RhdHM6IGFkZCBzb21lIGRlYnVnIGluZm8KKworMjAxMC0wNS0wNyAxODo1NTozNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogc21hbGwgY2xlYW51cHMKKworMjAxMC0wNS0wNyAxNjo1NToxMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmg6CisJICBydHBzdGF0czogbWFrZSBiYW5kd2lkdGhzIG1vcmUgY29uZmlndXJhYmxlCisJICBBZGQgYSBtZXRob2QgdG8gY29uZmlndXJlIHRoZSB2YXJpb3VzIGJhbmR3aWR0aHMgaW4gdGhlIHNlc3Npb24uCisKKzIwMTAtMDUtMDcgMTM6MzI6MzAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGhhbmRsZSBOT05FIFJUQ1AgaW50ZXJ2YWxzCisJICBQcmVwYXJlIGZvciBoYW5kbGluZyBSVENQIHJlcG9ydGluZyBpbnRlcnZhbHMgb2YgR1NUX0NMT0NLX1RJTUVfTk9ORSwgd2hpY2gKKwkgIG1lYW5zIGRvbid0IHNlbmQgUlRDUCBhdCBhbGwuCisKKzIwMTAtMDUtMDcgMTI6NTE6MDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IGZhbGwgYmFjayB0byBTRFAgcG9ydHMgaW5zdGVhZCBvZiBzZXJ2ZXJfcG9ydAorCSAgSW4gbXVsdGljYXN0LCBmYWxsIGJhY2sgdG8gdGhlIHBvcnRzIGluIHRoZSBTRFAgaW5zdGVhZCBvZiB0aGUgc2VydmVyX3BvcnQKKwkgIGF0dHJpYnV0ZSBhcyB0aGlzIGlzIG1vcmUgaW4gbGluZSB3aXRoIHRoZSBSRkMuCisKKzIwMTAtMDUtMDcgMTI6MjQ6NTEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHJlZmFjdG9yIGNvbGxlY3RpbmcgdGhlIHRyYW5zcG9ydCBpbmZvCisJICBNYWtlIGEgbWV0aG9kIHRvIGNvbGxlY3QgdGhlIHBvcnRzIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzLgorCisyMDEwLTA1LTA3IDExOjI4OjM2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBoYW5kbGUgc2VydmVycyB0aGF0IHNlbmQgYnJva2VuIFRyYW5zcG9ydHMKKwkgIEhhbmRsZSBzZXJ2ZXJzIHRoYXQgc2VuZCB0aGVpciBwb3J0IHBhaXJzIHdpdGggdGhlIHdyb25nIG5hbWUuCisJICBGaXhlcyAjNjE3NTM3CisKKzIwMTAtMDUtMDYgMTY6NTI6MjYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IHVzZSB0aGUgU0RQIGNvbm5lY3Rpb24gaW5mbyBpbiBtdWx0aWNhc3QKKwkgIFBhcnNlIHRoZSBjb25uZWN0aW9uIGluZm8gZnJvbSB0aGUgU0RQLgorCSAgV2hlbiB3ZSBuZWVkIHRvIGNvbmZpZ3VyZSB0aGUgbXVsdGljYXN0IGRlc3RpbmF0aW9uLCBmYWxsIGJhY2sgdG8gdGhlIFNEUAorCSAgY29ubmVjdGlvbiBpbmZvIHdoZW4gdGhlIHRyYW5zcG9ydCBkaWQgbm90IHNwZWNpZnkgYSBkZXN0aW5hdGlvbiBhbmQgdHRsLgorCSAgRml4ZXMgIzYxNzUzNworCisyMDEwLTA1LTA2IDE1OjQyOjM4ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkqIGdzdC9nb29tMmsxL2dzdGdvb20uYzoKKwkqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6CisJICBnb29tLG1vbm9zY29wZTogdHJ1bmNhdGUgb3duIGNhcHMsIGluc3RlYWQgb2YgY29weWluZyBhbmQgdXNpbmcgdGhlIGZpcnN0IG9ubHkKKwkgIFdlIGdvdCB0aGUgY2FwcyBmcm9tIGFuIGludGVyc2VjdCwgaXQgaXMgb3VyIG93biwgaGVuY2Ugd2UgY2FuIHRydW5jYXRlIGl0LgorCisyMDEwLTA1LTA2IDE1OjQwOjMzICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzcmM6IHJlZmxvdyB0byB0cnVuY2F0ZSBjYXBzIGp1c3Qgb25jZQorCSAgV2UgZ2V0IHdyaXRhYmxlIGNwYXMgZnJvbSB0aGUgaW50ZXJzZWN0aW9uICh1bmxlc3MgaXQgZmFpbGVkKS4gQXMgd2UgdHJ1bmNhdGUKKwkgIHRob3NlIGFueXdheSwgd2UgZG9uJ3QgbmVlZCB0byBtYW55YWx5IGNvcHkgdGhlIGZpcnN0IHN0cnVjdHVyZS4KKworMjAxMC0wNS0wNiAxNTozOTozMSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzoKKwkgIGdka3BpeGJ1ZjogZG9uJ3QgbGVhayB0ZW1wbGF0ZSBjYXBzCisKKzIwMTAtMDUtMDYgMTU6Mzg6MzUgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkgIGF1dG97YXVkaW8sdmlkZW99e3NyYyxzaW5rfTogdXNlIGNhbl9pbnRlcnNlY3QgdG8gYXZvaWQgYSBjYXBzIGNvcHkKKworMjAxMC0wNC0yNyAxMzozNjozNSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogdGVsbCB3aGF0IHdlIGNhbiBkbworCSAgQW55LWNhcHMgYXJlIGJhZC4gSWYgYXBwcyBzY2FuIHRoZSByZWdpc3RyeSwgdGhleSdkIGxpa2UgdG8ga25vdyB3aGF0IHdlIGNhbgorCSAgb3V0cHV0LgorCisyMDEwLTA0LTI3IDEzOjQzOjI5ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IGFsc28gbGlmdCB0aGUgYXJiaXRyYXJ5IHJlc3RyaWN0aW9ucyBmb3Igd2lkdGggYW5kIGhlaWdodAorCSAgVGhpcyB3YXMgYWxyZWFkeSBkb25lIGZvciBqcGVnZGVjLgorCisyMDEwLTA1LTA2IDE0OjAzOjExICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogQWxsb2NhdGUvZnJlZSBQQSBtYWlubG9vcCBkdXJpbmcgc3RhdGUgY2hhbmdlcworCSAgLi4uYWxzbyBkZXN0cm95IHRoZSBzdHJlYW0gYW5kIGNvbnRleHQgZHVyaW5nIHN0YXRlIGNoYW5nZXMuCisKKzIwMTAtMDUtMDYgMTM6NTc6MDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IEFsbG9jYXRlIGFuZCBmcmVlIHRoZSBjdXN0b20gY2xvY2sgaW4gTlVMTDwtPlJFQURZCisKKzIwMTAtMDUtMDYgMTM6NTE6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IENyZWF0ZSBhbmQgZnJlZSB0aGUgUEEgbWFpbmxvb3AgaW4gTlVMTC0+UkVBRFkvUkVBRFktPk5VTEwKKwkgIFRoaXMgZml4ZXMgYSByYWNlIGNvbmRpdGlvbiwgd2hlbiBzdG9wcGluZyB0aGUgbWFpbmxvb3AgZHVyaW5nIGZpbmFsaXphdGlvbgorCSAgaXMgZG9uZSBmcm9tIGEgbWFpbmxvb3AgY2FsbGJhY2suCisJICBGaXhlcyBidWdzICM2MTQ3NjUgYW5kICM1OTA2NjIuCisKKzIwMTAtMDUtMDUgMTk6MzU6NDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBNYWtlIHNlbGVjdGlvbiBvZiBhIHNpbmtwYWQgbnVtYmVyIHRocmVhZHNhZmUKKworMjAxMC0wNS0wNSAxNzozOTozMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaDoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5LmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhci5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXJibGVuZC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9zY2FsZXJib2IuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdmZpci5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZWJmZi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZXRmZi5jOgorCSAgZGVpbnRlcmxhY2U6IEFkZCBzdXBwb3J0IGZvciBhbGwgY29tbW9uIFJHQiBmb3JtYXRzCisKKzIwMTAtMDUtMDUgMTY6MDY6NTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmg6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmFzbToKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvc2NhbGVyYm9iLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3ZmaXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmUuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmViZmYuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmV0ZmYuYzoKKwkgIGRlaW50ZXJsYWNlOiBBZGQgc3VwcG9ydCBmb3IgQVlVVgorCisyMDEwLTA1LTA0IDE2OjM0OjI3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBtYWtlIHNldHVwIHVybCBpbiBhIHNtYXJ0ZXIgd2F5CisJICBNYWtlIHN1cmUgd2UgYWx3YXlzIHNlcGFyYXRlIHRoZSBiYXNlIGFuZCBjb250cm9sIHVybCBwYXJ0cyB3aXRoIGEgLyB3aGVuCisJICBjcmVhdGluZyB0aGUgc2V0dXAgdXJsLgorCisyMDEwLTA1LTA0IDE2OjA0OjM5ICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogaGFuZGxlIFNFRUtJTkcgcXVlcmllcy4KKworMjAxMC0wNS0wNCAxMToxMzo0NSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lmg6CisJICBydHBtcDR2cGF5OiBhZGQgY29uZmlnLWludGVydmFsIHBhcmFtZXRlciB0byByZS1pbnNlcnQgY29uZmlnIGluIHN0cmVhbQorCSAgQWRkIGEgbmV3IGNvbmZpZy1pbnRlcnZhbCBwcm9wZXJ0eSB0byBpbnN0cnVjdCB0aGUgcGF5bG9hZGVyIHRvIGluc2VydAorCSAgY29uZmlnIChWT1NILCBWT1MsIGV0YykgYXQgcGVyaW9kaWMgaW50ZXJ2YWxzIGluIHRoZSBzdHJlYW0KKwkgICh3aGVuIGEgR09QIG9yIFZPUC1JIGlzIGVuY291bnRlcmVkKS4KKwkgIEJhc2VkIG9uIHBhdGNoIGJ5IDxtYXJjLmxlZW1hbiBhdCBnbWFpbC5jb20+CisJICBGaXhlcyAjNjA3NDUyLgorCisyMDEwLTA1LTAzIDEzOjI2OjMyICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kZWNpbmFAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogbW92ZSBzb21lIGluaXRpYWxpemF0aW9uIGNvZGUgZnJvbSBjaGFuZ2Vfc3RhdGUgdG8gX2luaXQuCisJICBTZXQgLT5hY3RpdmUgdG8gVFJVRSBpbiBfaW5pdCBzbyBpdCBjYW4gYmUgc2V0IHRvIEZBTFNFIGFmdGVyIGNyZWF0aW5nIHRoZQorCSAgaml0dGVyYnVmZmVyIGFuZCBpdCB3b24ndCBiZSBtaXN0YWtlbmx5IHJlc2V0IHRvIFRSVUUgaW4gdGhlIGNoYW5nZV9zdGF0ZQorCSAgZnVuY3Rpb24uCisJICBUaGlzIGlzIG5lZWRlZCB0byBzdGFydCB0aGUgaml0dGVyYnVmZmVyIGFzIGluYWN0aXZlIHdoZW4gcnRwYmluIGlzIGJ1ZmZlcmluZy4KKworMjAxMC0wNS0wMyAxMTo1Njo1OCArMDIwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZGVjaW5hQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IGZpeCBhIGJ1ZyBoYW5kbGluZyBCVUZGRVJJTkcgbWVzc2FnZXMuCisJICBJZiBhIHNlc3Npb24gZXhpc3RzIGJ1dCBoYXMgbm8gc3RyZWFtcywgc2V0IHRoZSBtaW4gYnVmZmVyaW5nIHBlcmNlbnQgdG8gMAorCSAgc2luY2UgaXQgbWVhbnMgdGhhdCB3ZSBoYXZlbid0IHJlY2VpdmVkIGFueXRoaW5nIGZvciB0aGF0IHNlc3Npb24geWV0LgorCisyMDEwLTA1LTAzIDExOjUxOjM3ICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kZWNpbmFAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogd2hlbiBhIHN0cmVhbSBpcyBjcmVhdGVkLCBwYXVzZSB0aGUgaml0dGVyYnVmZmVyIGlmIHJ0cGJpbiBpcyBidWZmZXJpbmcuCisKKzIwMTAtMDUtMDMgMTE6MjM6NTkgKzAyMDAgIEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvLmRlY2luYUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBmaXggYSBidWcgY2FsY3VsYXRpbmcgc3RyZWFtIG9mZnNldHMuCisKKzIwMTAtMDUtMDEgMTQ6MjA6NTkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJICBtYXRyb3NrYW11eDogV3JpdGUgcHJldmlvdXMgY2x1c3RlcidzIHNpemUKKwkgIFRoaXMgaXMgdXNlZnVsIGZvciBiYWNrd2FyZHMgcGxheWJhY2ssIHdoaWNoIHNob3VsZCBiZSBpbXBsZW1lbnRlZAorCSAgaW4gbWF0cm9za2FkZW11eCBhdCBzb21lIHBvaW50LgorCisyMDEwLTA1LTAxIDE0OjE1OjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBTZXQgaW50ZXJsYWNlZCBmbGFnIGluIHRoZSBjYXBzIGlmIHRoZSBmbGFnIGlzIHNldCBpbiB0aGUgTWF0cm9za2EgZmlsZQorCisyMDEwLTA1LTAxIDE0OjEyOjI4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IFdyaXRlIGludGVybGFjZWQgZmxhZyBpZiB0aGUgaW5wdXQgdmlkZW8gY29udGVudCBpcyBpbnRlcmxhY2VkCisJICBVbmZvcnR1bmF0ZWx5IE1hdHJvc2thIGhhcyBubyB3YXkgdG8gc3BlY2lmeSBURkYgYW5kIGZyaWVuZHMuLi4KKworMjAxMC0wNS0wMSAxMToyNToyNiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkgIHJ0cDogZml4IHByaW50ZiBmb3JtYXQgb2Ygc29tZSBkZWJ1ZyBtZXNzYWdlcworCisyMDEwLTA1LTAxIDExOjA2OjUzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYTogaW5pdCB2YXJpYWJsZSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nIG9uIE9TWAorCSAgRml4ZXMgKGJvZ3VzKSAiJ29mZnNldCcgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZCBpbiB0aGlzIGZ1bmN0aW9uIgorCSAgd2FybmluZyBvbiBidWlsZCBib3QgKGFsc28gc3BvdHRlZCBieSBwaGlsbikuCisKKzIwMTAtMDQtMzAgMTc6MTk6NDQgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBVWVZZIGlzIDQ6MjoyLCBub3QgNDoyOjAKKworMjAxMC0wNC0zMCAyMjoyMjoyNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkgIHB1bHNlOiBEb24ndCBjb21wYXJlIHZhbHVlcyBvZiB0d28gZGlmZmVyZW50IGVudW0gdHlwZXMKKworMjAxMC0wNC0zMCAyMjoxMzozMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IE1ha2UgYXV0b21hdGljIGRldGVjdGlvbiBvZiBpbnRlcmxhY2luZyB0aGUgZGVmYXVsdAorCSAgUHJldmlvdXNseSAiZm9yY2UgZGVpbnRlcmxhY2luZyIgd2FzIHRoZSBkZWZhdWx0LCB3aGljaCBpcyBhIG5vdCB2ZXJ5CisJICBzZW5zaWJsZSBkZWZhdWx0IGZvciB0aGUgbm9ybWFsIHVzZSBjYXNlIHdoZXJlIGRlaW50ZXJsYWNlIHNob3VsZCBhY3QKKwkgIGluIHBhc3N0aHJvdWdoIG1vZGUgdW5sZXNzIGludGVybGFjZWQgY29udGVudCBpcyBwcmVzZW50LgorCisyMDEwLTA0LTI5IDE2OjI2OjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAganBlZ2RlYzogb3B0aW1pc2UgYnVmZmVyIHNjYW5uaW5nCisJICBTcGVjaWZpY2FsbHksIHdoZW4gbmVlZGluZyBtb3JlIGRhdGEsIGRvIG5vdCByZXNjYW4gZnJvbSBzdGFydCBuZXh0IHRpbWUKKwkgIGFyb3VuZCwgYnV0IHJlc3VtZSBmcm9tIGxhc3QgcG9zaXRpb24uCisJICBTZWUgYWxzbyAjNTgzMDQ3LgorCisyMDEwLTA0LTI5IDE1OjM4OjQ5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogZGlzcmVnYXJkIHN1cGVyZmx1b3VzIGxpbmVzIHdoZW4gaW5kaXJlY3QgZGVjb2RpbmcKKworMjAxMC0wNC0yNyAxNTo0NDozOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkgIGpwZWdkZWM6IGFkZCBzdXBwb3J0IGZvciBSR0IgYW5kIGdyYXlzY2FsZSBjb2xvciBzcGFjZQorCSAgQWxzbyByZWZhY3RvciBzcmMgY2FwcyBuZWdvdGlhdGlvbiBhbmQgc2V0dGluZy4KKworMjAxMC0wNC0yNyAxMjoxOToyMiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL01ha2VmaWxlLmFtOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5oOgorCSAganBlZ2VuYzogc3VwcG9ydCBtb3JlIGNvbG91ciBzcGFjZXMgYW5kIHNvbWUgY2xlYW51cHMKKworMjAxMC0wNC0zMCAxMjo0NzowMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IG1vcmUgZ2VuZXJpYyBzaW5rIGdldGNhcHMKKworMjAxMC0wNC0zMCAxMjo0Mjo0MiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IG1vcmUgc2FuaXR5IGNoZWNrcyBvbiBpbnB1dAorCSAgU3BlY2lmaWNhbGx5LCB2ZXJpZnkgaW5wdXQgY29tcG9uZW50cyAvIGNvbG91ciBzcGFjZSBpcyBhcyBjb2RlCisJICBzdWJzZXF1ZW50bHkgZXhwZWN0cywgdGhlcmVieSBhdm9pZGluZyBjcmFzaGVzIG9yIG90aGVyd2lzZSBib2d1cyBvdXRwdXQuCisJICBQcmVzZW50bHksIHRoYXQgbWVhbnMgMyBjb21wb25lbnRzIFlDYkNyIGNvbG91ciBzcGFjZSwgYW5kIHNvbWV3aGF0CisJICBsaW1pdGVkIHNhbXBsaW5nIGZhY3RvcnMuCisJICBGaXhlcyAjNjAwNTUzLgorCisyMDEwLTA0LTIyIDEyOjI4OjIyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSAgcnRwdGhlb3JhZGVwYXk6IGFsc28gYWNjZXB0IGluLWJhbmQgY29uZmlndXJhdGlvbgorCSAgRml4ZXMgIzU3NDQxNiAodGhlb3JhKS4KKworMjAxMC0wNC0yMiAxMjoyNzozNSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkgIHJ0cHZvcmJpc2RlcGF5OiBhbHNvIGFjY2VwdCBpbi1saW5lIGNvbmZpZ3VyYXRpb24KKwkgIEZpeGVzICM1NzQ0MTYgKHZvcmJpcykuCisKKzIwMTAtMDQtMDcgMTc6MjE6NTUgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSAgcnRwdGhlb3JhZGVwYXk6IElnbm9yZSBwYWNrZXRzIHdpdGhvdXQgYSBrbm93biBjb2RlYm9vaworCSAgRG9uJ3QgcHJvZHVjZSBhbiBlcnJvciBpZiBhIHBhY2tldCBpcyByZWNlaXZlZCB3aXRob3V0IGEgdmFsaWQgY29kZWJvb2ssCisJICBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIGNvZGVib29rIHdpbGwganVzdCBiZSBjb21pbmcgbGF0ZXIuCisJICBTZWUgIzU3NDQxNi4KKworMjAxMC0wNC0yMCAxMjoxNzoyNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3k0bWVuYy5jOgorCSAgeTRtZW5jOiBhZGp1c3QgdW5pdCB0ZXN0IHRvIGVsZW1lbnQgYmVoYXZpb3VyCisKKzIwMTAtMDItMjMgMjI6MTY6MzkgLTA1MDAgIEJlbmphbWluIE0uIFNjaHdhcnR6IDxiZW5zQGFsdW0ubWl0LmVkdT4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmg6CisJICB5NG1lbmM6IGFkZCA0OjI6MiwgNDoxOjEsIGFuZCA0OjQ6NCBvdXRwdXQgc3VwcG9ydAorCSAgRml4ZXMgIzYxMDkwMi4KKworMjAxMC0wNC0xNSAxMjoyMTo1NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5oOgorCSAgcnRwaDI2NGRlcGF5OiBERUxUQV9VTklUIG1hcmtpbmcgb2Ygb3V0cHV0IGJ1ZmZlcnMKKwkgIC4uLiB3aGljaCBldmlkZW50bHkgbWFrZXMgKG1vc3QpIHNlbnNlIGlmIG91dHB1dCBidWZmZXJzIGFyZQorCSAgYWN0dWFsbHkgZnJhbWVzLgorCSAgUGFydGlhbGx5IGJhc2VkIG9uIGEgcGF0Y2ggYnkKKwkgIE1pZ3VlbCBBbmdlbCBDYWJyZXJhIDxtYWRfYWx1Y2hlIGF0IGhvdG1haWwuY29tPgorCSAgRml4ZXMgIzYwOTY1OC4KKworMjAxMC0wNC0xNiAxNzoyMTo1MCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5oOgorCSAgcnRwaDI2M2RlcGF5OiBleHRyYSBrZXlmcmFtZSBpbmZvIGZyb20gUFRZUEUgaGVhZGVyCisJICAuLi4gYXMgb3Bwb3NlZCB0byB0YWtpbmcgaXQgZnJvbSBoMjYzIHBheWxvYWQgaGVhZGVyLCB3aGljaCBuZWVkIG5vdAorCSAgYmUgc28gcmVsaWFibGUuCisJICBGaXhlcyAjNjEwMTcyLgorCisyMDEwLTA0LTE2IDE3OjA4OjQ3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkgIHJ0cGgyNjNkZXBheTogYWxzbyB1c2UgUGljdHVyZSBTdGFydCBDb2RlIHRvIGRldGVjdCBwYWNrZXQgbG9zcworCSAgVGhpcyBlbnN1cmVzIGEgd2hvbGUgZnJhbWUgaXMgZHJvcHBlZCBpZiBhIChzdGFydCkgcGFja2V0IGlzIGxvc3QsCisJICByYXRoZXIgdGhhbiByZWx5aW5nIG9ubHkgb24gdGhlIERJU0NPTlQgZmxhZy4KKworMjAxMC0wNC0xNiAxNzowNjoxMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJICBydHBoMjYzZGVwYXk6IGRldGVjdCBmcmFtZSBzdGFydCB1c2luZyBQaWN0dXJlIFN0YXJ0IENvZGUKKwkgIFNvIHdlIHN0b3AgZHJvcHBpbmcgZnJhZ21lbnRzIGFzIHNvb24gYXMgdGhlcmUgaXMgYSBwaWN0dXJlIHN0YXJ0IChjb2RlKS4KKwkgIEluIHBhcnRpY3VsYXIsIHRoaXMgcHJldmVudHMgZHJvcHBpbmcgdGhlIGZpcnN0IGZyYW1lIGZvbGxvd2luZworCSAgaW5pdGlhbCBESVNDT05ULgorCisyMDEwLTA0LTE2IDE2OjM0OjA2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkgIHJ0cGgyNjNkZXBheTogaGFuZGxlIGEgZmV3IEZJWE1FcworCisyMDEwLTA0LTE2IDE2OjI3OjI1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkgIHJ0cGgyNjNkZXBheTogc2xpZ2h0bHkgcmVmYWN0b3IgcGF5bG9hZCBkcm9wcGluZworCisyMDEwLTA0LTE2IDExOjUzOjE3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkgIHJ0cGgyNjNwYXk6IHVzZSBmb3VuZCBHT0JzIHRvIGFwcGx5IE1vZGUgQSBwYXlsb2FkaW5nCisJICAuLi4gcmF0aGVyIHRoYW4gZmFsbGluZyBiYWNrIHRvIHNlbmRpbmcgdGhlIHdob2xlIGZyYW1lIGluIG9uZSBwYWNrZXQKKwkgIGlmIG51bWJlciBvZiBHT0Igc3RhcnRjb2RlcyA8IG1heGltdW0uCisJICBPbmUgbWlnaHQgdGFrZSB0aGlzIGZ1cnRoZXIgYW5kIHN0aWxsIHBlcmZvcm0gTW9kZSBCL0MgcGF5bG9hZGluZywKKwkgIGJ1dCBhdCBsZWFzdCB0aGlzIHNob3VsZCBjYXRlciBmb3IgZGVjZW50IGZyYWdtZW50cyBpbiB0eXBpY2FsIGNhc2VzLgorCSAgRml4ZXMgIzU5OTU4NS4KKworMjAxMC0wNC0xNCAxMTo1Mzo0NiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICBtYXRyb3NrYWRlbXV4OiBpbXBsZW1lbnQgcHVzaCBtb2RlIHNlZWtpbmcKKworMjAxMC0wNC0yOSAyMDowODo0MyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5jOgorCSAgZG9jczogdXBkYXRlIGZvciB2aWRlb2ZpbHRlciBwbHVnaW4gbWVyZ2UgYW5kIGFkZCBndGstZG9jIGJsdXJiIGZvciBuZXcgcHJvcGVydHkKKworMjAxMC0wNC0yNiAxODoxMjo0NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEltcHJvdmUgc2VnbWVudCBoYW5kbGluZyBhIGJpdAorCisyMDEwLTA0LTI2IDE4OjA1OjAwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogT3JkZXIgY2FwcyBieSBhbW91bnQgb2YgY29udGFpbmVkIGluZm9ybWF0aW9uCisKKzIwMTAtMDQtMjYgMTc6MjU6MzggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBQcm9wZXJseSBzZXQgaW50ZXJsYWNlZCBmaWVsZCBpbiBnZXRjYXBzCisKKzIwMTAtMDQtMjQgMTY6Mjg6MTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhci5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXJibGVuZC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9zY2FsZXJib2IuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmUuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmViZmYuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmV0ZmYuYzoKKwkgIGRlaW50ZXJsYWNlOiBBZGQgcGxhbmFyIFlVViBzdXBwb3J0IHRvIGFsbCBvdGhlciBzaW1wbGUgbWV0aG9kcworCisyMDEwLTA0LTI0IDE2OjEwOjA2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmFzbToKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5jOgorCSAgZGVpbnRlcmxhY2U6IEFkZCBwbGFuYXIgWVVWIHN1cHBvcnQgdG8gZ3JlZWR5aCBtZXRob2QKKworMjAxMC0wNC0yNCAxNTo0MjowNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5LmM6CisJICBkZWludGVybGFjZTogQWRkIHN1cHBvcnQgZm9yIHBsYW5hciBZVVYgZm9ybWF0cyBpbiBncmVlZHlsIG1ldGhvZAorCisyMDEwLTA0LTI0IDEzOjU4OjAzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS92ZmlyLmM6CisJICBkZWludGVybGFjZTogQWRkIHN1cHBvcnQgZm9yIFk0NDQsIFk0MkIsIEk0MjAsIFlWMTIgYW5kIFk0MUIKKwkgIFRoZSB2ZmlyIG1ldGhvZCBzdXBwb3J0cyB0aGVtIGFuZCB3aWxsIGJlIHVzZWQgdW50aWwgc29tZXRoaW5nIGVsc2UKKwkgIHN1cHBvcnRzIGl0LgorCisyMDEwLTA0LTI0IDA5OjE2OjIyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmM6CisJICBkZWludGVybGFjZTogRGVmaW5lIGRlaW50ZXJsYWNlIG1ldGhvZCBiYXNlIGNsYXNzZXMgYXMgYWJzdHJhY3QgdHlwZXMKKworMjAxMC0wNC0yMyAxNzo0MDoxMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHkuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvc2NhbGVyYm9iLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdmZpci5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZWJmZi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZXRmZi5jOgorCSAgZGVpbnRlcmxhY2U6IE1vdmUgZGVpbnRlcmxhY2luZyBtZXRob2RzIHRvIHRoZWlyIG93biBmaWxlCisKKzIwMTAtMDQtMjMgMTc6MjU6MTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5oOgorCSAgZGVpbnRlcmxhY2U6IFNpbXBsaWZ5IHBhc3N0aHJvdWdoIG1vZGUgZGV0ZWN0aW9uCisKKzIwMTAtMDQtMjMgMTQ6MzU6NDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEZpeCB1bml0IHRlc3QgdGhhdCBjaGVja3MgY2FwcyBoYW5kbGluZworCSAgZGVpbnRlcmxhY2Ugbm93IGFsd2F5cyBhZGRzIHRoZSBpbnRlcmxhY2VkIGZpZWxkIHRvIHRoZSBvdXRwdXQgY2FwcywKKwkgIGlmIGl0IHdhc24ndCBwcmVzZW50IGluIHRoZSBpbnB1dCBjYXBzIHRoZSBvdXRwdXQgY2FwcyB3aWxsIHN0aWxsCisJICBjb250YWluIGludGVybGFjZWQ9ZmFsc2UuCisKKzIwMTAtMDQtMjEgMTc6MDA6MDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHkuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5hc206CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhcmJsZW5kLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3NjYWxlcmJvYi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvVG9tc01vQ29tcEFsbC5pbmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3ZmaXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmUuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmViZmYuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmV0ZmYuYzoKKwkgIGRlaW50ZXJsYWNlOiBSZWZhY3RvciBkZWludGVybGFjaW5nIGFzIHByZXBhcmF0aW9uIGZvciBzdXBwb3J0aW5nIG1vcmUgY29sb3IgZm9ybWF0cworCisyMDEwLTA0LTIyIDE5OjA1OjM3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogQWRkIHN1cHBvcnQgZm9yIFk0NDQsIFk0MkIgYW5kIFk0MUIKKworMjAxMC0wNC0yMiAxNTo1NDoyMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IEFkZCBzdXBwb3J0IGZvciBZVllVIGFuZCByZW9yZGVyIHRlbXBsYXRlIGNhcHMKKworMjAxMC0wNC0xOCAyMToxMToyMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IFRyYW5zbGF0ZSBuYXZpZ2F0aW9uIGV2ZW50cyB0byBtYWtlIHNlbnNlIGFnYWluIHVwc3RyZWFtCisKKzIwMTAtMDQtMTggMjA6NTg6MTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBQcm9wZXJseSBoYW5kbGUgcmFuZ2VzL2xpc3RzIG9mIHdpZHRoIG9yIGhlaWdodCB3aGVuIHRyYW5zZm9ybWluZyBjYXBzCisJICBDb2RlIHBhcnRseSB0YWtlbiBmcm9tIHRoZSB2aWRlb2Nyb3AgZWxlbWVudC4KKworMjAxMC0wNC0yMiAxNTo0NToxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IEZpeCBwbGFuYXIgWVVWLT5SR0IgcHJvY2Vzc2luZworCisyMDEwLTA0LTIyIDE1OjQyOjAzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogQ29ycmVjdGx5IGNsYW1wIGFmdGVyIFlVVi0+UkdCIGNvbnZlcnNpb24KKworMjAxMC0wNC0yMiAxNToyMDoyNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IEFkZCBzdXBwb3J0IGZvciBZVVkyLCBZVllVIGFuZCBVWVZZCisKKzIwMTAtMDQtMTggMTU6MDI6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBTeW5jIHByb3BlcnRpZXMgdG8gdGhlIGNvbnRyb2xsZXIgaW4gYmVmb3JlX3RyYW5zZm9ybQorCisyMDEwLTA0LTE2IDE3OjAwOjAyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogQWRkIHN1cHBvcnQgZm9yIFlVWTIgYW5kIFVZVVYKKworMjAxMC0wNC0yMSAxNzo0MTo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IFJlZmFjdG9yIHByb2Nlc3NpbmcgYW5kIGFkZCBzdXBwb3J0IGZvciBvdGhlciBwbGFuYXIgWVVWIGZvcm1hdHMKKwkgIFRoaXMgcmVkdWNlcyB0aGUgZ2VuZXJhdGVkIGNvZGUgc2l6ZSBieSBhIGZhY3RvciBvZiAyLjUuCisKKzIwMTAtMDQtMjEgMTc6MTU6MzMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgIGFscGhhOiBBZGQgc3VwcG9ydCBmb3IgWVYxMiBpbnB1dAorCisyMDEwLTA0LTIyIDEzOjU2OjU4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBBZGQgc3VwcG9ydCBmb3IgWVVZMiwgWVZZVSwgVVlWWQorCisyMDEwLTA0LTIwIDEyOjE4OjE4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBBZGQgc3VwcG9ydCBmb3IgWTQ0NCwgWTQyQiwgWTQxQiBhbmQgWVYxMgorCisyMDEwLTA0LTIxIDE3OjA3OjEwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICB2aWRlb2ZpbHRlcjogT3JkZXIgY29sb3IgZm9ybWF0cyBieSB0aGVpciBjb250YWluZWQgYW1vdW50IG9mIGluZm9ybWF0aW9uCisKKzIwMTAtMDQtMjAgMTg6MjI6MTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICB2aWRlb2ZsaXA6IERyb3AgWTQxQi9ZNDJCIHN1cHBvcnQKKwkgIFJvdGF0aW5nIDkwwrAvMjcwwrAgd2l0aCBzdWJzYW1wbGVkIFlVViB3aGVyZSBob3Jpem9udGFsCisJICBhbmQgdmVydGljYWwgc3Vic2FtcGxpbmcgYXJlIGRpZmZlcmVudCBkb2Vzbid0IHJlYWxseSB3b3JrLgorCisyMDEwLTA0LTE5IDE0OjM3OjU0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSAgdmlkZW9mbGlwOiBBbHNvIGZsaXAgdGhlIHBpeGVsLWFzcGVjdC1yYXRpbyBpZiB3aWR0aC9oZWlnaHQgYXJlIGV4Y2hhbmdlZAorCisyMDEwLTA0LTE4IDIzOjA4OjE0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2ZpbHRlci5jOgorCSAgdmlkZW9maWx0ZXI6IEV4dGVuZCB0aGUgdW5pdCB0ZXN0IHRvIHRlc3QgZGlmZmVyZW50IGNvbG9yIGZvcm1hdHMKKworMjAxMC0wNC0xOCAyMjo1NTozNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvZmlsdGVyLmM6CisJICB2aWRlb2ZpbHRlcjogQWRkIHNvbWUgbW9yZSB0ZXN0cworCSAgVGhlc2UgY2hlY2sgZGlmZmVyZW50IHByb3BlcnR5IGNvbWJpbmF0aW9ucworCisyMDEwLTA0LTE4IDIyOjU0OjIzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSAgdmlkZW9mbGlwOiBDaGFuZ2UgdGhlIGRlZmF1bHQgbWV0aG9kIHRvIGlkZW50aXR5CisKKzIwMTAtMDQtMTggMjI6NTA6MjAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmg6CisJICB2aWRlb2JhbGFuY2U6IFJlZHVjZSBudW1iZXIgb2YgYWxsb2NhdGlvbnMgcGVyIGluc3RhbmNlCisKKzIwMTAtMDQtMTggMjI6NDU6NTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIHZpZGVvZmlsdGVyOiBVcGRhdGUgbGFzdC1yZXZpZXdlZCBjb21tZW50cworCisyMDEwLTA0LTE4IDIyOjQwOjU1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgdmlkZW9iYWxhbmNlOiBBZGQgc3VwcG9ydCBmb3IgYWxsIFJHQiBmb3JtYXRzCisKKzIwMTAtMDQtMTggMjI6Mjg6MTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJICB2aWRlb2JhbGFuY2U6IEFkZCBzdXBwb3J0IGZvciBZVVkyLCBVWVZZLCBBWVVWIGFuZCBZVllVCisKKzIwMTAtMDQtMTggMjI6MjM6MDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJICB2aWRlb2JhbGFuY2U6IEFkZCBkZWJ1ZyBjYXRlZ29yeQorCisyMDEwLTA0LTE4IDIyOjE5OjU1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgdmlkZW9iYWxhbmNlOiBNYWtlIHByb3BlcnR5IGFjY2VzcyB0aHJlYWRzYWZlCisKKzIwMTAtMDQtMTggMjI6MTg6MjQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJICB2aWRlb2JhbGFuY2U6IEFkZCBzdXBwb3J0IGZvciBZNDFCLCBZNDJCIGFuZCBZNDQ0CisKKzIwMTAtMDQtMTggMjI6MTc6MDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmg6CisJICB2aWRlb2JhbGFuY2U6IFVzZSBsaWJnc3R2aWRlbyBmb3IgZm9ybWF0IHNwZWNpZmljIHRoaW5ncworCisyMDEwLTA0LTE4IDIyOjA5OjA2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgdmlkZW9iYWxhbmNlOiBNYWtlIHByb3BlcnRpZXMgY29udHJvbGxhYmxlCisKKzIwMTAtMDQtMTggMjI6MDY6NDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJICB2aWRlb2JhbGFuY2U6IEVtaXQgInZhbHVlLWNoYW5nZWQiIHNpZ25hbCBvZiBjb2xvciBiYWxhbmNlIGludGVyZmFjZSB3aGVuIHZhbHVlcyBjaGFuZ2UKKworMjAxMC0wNC0xOCAyMTo1ODoxMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuaDoKKwkgIHZpZGVvYmFsYW5jZTogU29tZSByYW5kb20gY2xlYW51cAorCisyMDEwLTA0LTE4IDIxOjM3OjIzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgdmlkZW9iYWxhbmNlOiBTdG9wIHVzaW5nIGxpYm9pbAorCSAgVGhlIHVzZWQgbGlib2lsIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kIGhhcyBubyBvcHRpbWl6ZWQKKwkgIGltcGxlbWVudGF0aW9uIGFueXdheS4KKworMjAxMC0wNC0xOCAyMToxNDoxMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIHZpZGVvZmxpcDogTWFrZSBwcm9wZXJ0eSBhY2Nlc3MgdGhyZWFkc2FmZQorCisyMDEwLTA0LTE4IDE1OjAwOjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJICBnYW1tYTogU3luYyBwcm9wZXJ0aWVzIHRvIHRoZSBjb250cm9sbGVyIGluIGJlZm9yZV90cmFuc2Zvcm0KKworMjAxMC0wNC0xOCAxNDo0NjowOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkgIHZpZGVvZmxpcDogQWRkIHN1cHBvcnQgZm9yIGFsbCBSR0IgZm9ybWF0cyBhbmQgQVlVVgorCisyMDEwLTA0LTE4IDE0OjMxOjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSAgdmlkZW9mbGlwOiBBZGQgc3VwcG9ydCBmb3IgWTQxQiwgWTQyQiBhbmQgWTQ0NAorCisyMDEwLTA0LTE4IDE0OjI5OjMwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5oOgorCSAgdmlkZW9mbGlwOiBNYWtlIHByb2Nlc3NpbmcgbW9yZSBnZW5lcmFsIGFuZCB1c2UgbGliZ3N0dmlkZW8gZm9yIGFsbCBmb3JtYXQgc3BlY2lmaWMgdGhpbmdzCisKKzIwMTAtMDQtMTggMTM6MTI6NDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICB2aWRlb2ZsaXA6IE1ha2UgbWV0aG9kIHByb3BlcnR5IGNvbnRyb2xsYWJsZSBhbmQgaW1wcm92ZSBkZWJ1ZyBvdXRwdXQKKworMjAxMC0wNC0xOCAxMzowMzo0OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaDoKKwkgIHZpZGVvZmxpcDogU29tZSByYW5kb20gY2xlYW51cAorCisyMDEwLTA0LTE4IDEwOjE3OjUyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9wbHVnaW4uYzoKKwkgIHZpZGVvZmlsdGVyOiBNb3ZlIGFsbCBlbGVtZW50cyBpbnRvIGEgc2luZ2xlIHBsdWdpbgorCSAgSGF2aW5nIGFsbCB0aGVzZSBzbWFsbCBlbGVtZW50cyBpbiBhIHNlcGFyYXRlIHBsdWdpbgorCSAgaXMgbm90IHZlcnkgbWVtb3J5IGVmZmVjdGl2ZS4uLgorCisyMDEwLTA0LTE4IDEwOjA3OjI0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuaDoKKwkgIGdhbW1hOiBJbXByb3ZlIGRvY3MgYSBiaXQKKworMjAxMC0wNC0xOCAwOTo1OTo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jOgorCSAgZ2FtbWE6IEFkZCBzdXBwb3J0IGZvciBhbGwgUkdCIGZvcm1hdHMKKworMjAxMC0wNC0xOCAwOTo0NjoxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jOgorCSAgZ2FtbWE6IEFkZCBzdXBwb3J0IGZvciBtYW55IHBhY2tlZCBZVVYgZm9ybWF0cworCSAgVGhhdCBpcyBZVVkyLCBVWVZZLCBBWVVWIGFuZCBZVllVLgorCisyMDEwLTA0LTE4IDA5OjM4OjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJICBnYW1tYTogQWRkIHN1cHBvcnQgZm9yIGFsbCBvdGhlciBwbGFuYXIgWVVWIGZvcm1hdHMKKwkgIFRoYXQgaXMgWTQxQiwgWTQyQiwgWTQ0NCwgTlYxMiBhbmQgTlYyMS4KKworMjAxMC0wNC0xOCAwOTozMzo0OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jOgorCSAgZ2FtbWE6IFN0b3AgdXNpbmcgbGlib2lsCisJICBUaGUgdXNlZCBsaWJvaWwgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCwgb25seSBoYXMgYSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24KKwkgIGFuZCBpcyBtb3JlIGNvbXBsZXggdGhhbiB3aGF0J3MgbmVlZGVkIGhlcmUuCisKKzIwMTAtMDQtMTcgMTg6MTM6NDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5oOgorCSAgZ2FtbWE6IFVzZSBsaWJnc3R2aWRlbyBmb3IgZm9ybWF0IHNwZWNpZmljIHZhbHVlcyBhbmQgbWFrZSBnYW1tYSBwcm9jZXNzaW5nIG1vcmUgZ2VuZXJpYworCSAgQWxsb3dzIHVzIHRvIGVhc2lseSBhZGQgc3VwcG9ydCBmb3IgbmV3IGNvbG9yIGZvcm1hdHMgbGF0ZXIuCisKKzIwMTAtMDQtMTcgMTg6MDE6MDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkgIGdhbW1hOiBNYWtlIGdhbW1hIHByb3BlcnR5IGNvbnRyb2xsYWJsZQorCSAgLi4uYW5kIHByb3Blcmx5IHVzZSBsaWJvaWwuCisKKzIwMTAtMDQtMTcgMTc6NTU6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkgIGdhbW1hOiBTb21lIHJhbmRvbSBjbGVhbnVwCisKKzIwMTAtMDQtMTkgMTQ6NDU6MzMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5jOgorCSAgc21wdGVhbHBoYTogU3luYyBwcm9wZXJ0aWVzIHRvIHRoZSBjb250cm9sbGVyIGluIGJlZm9yZV90cmFuc2Zvcm0KKworMjAxMC0wNC0xNyAxNzo0NzowNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJICBzbXB0ZWFscGhhOiBBZGQgc3VwcG9ydCBmb3IgWVYxMiAoY29udmVydGVkIHRvIEFZVVYpCisKKzIwMTAtMDQtMTcgMTc6NDM6NTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5jOgorCSAgc21wdGVhbHBoYTogQWRkIHN1cHBvcnQgZm9yIGFsbCA0IEFSR0IgZm9ybWF0cworCSAgLi4ud2l0aG91dCBmb3JtYXQgY29udmVyc2lvbi4KKworMjAxMC0wNC0xNiAxNzoyNzowMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5oOgorCSAgc21wdGVhbHBoYTogTWFrZSBjb2xvciBmb3JtYXQgc3VwcG9ydCBtb3JlIGdlbmVyaWMKKwkgIFRoaXMgYWxsb3dzIGVhc2llciBhZGRpdGlvbiBvZiBuZXcgZm9ybWF0cyBsYXRlci4KKworMjAxMC0wNC0xNiAxNzoxODoxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5oOgorCSAgc21wdGVhbHBoYTogU29tZSByYW5kb20gY2xlYW51cAorCisyMDEwLTA0LTE1IDIyOjI4OjU4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NtcHRlL2dzdG1hc2suYzoKKwkqIGdzdC9zbXB0ZS9nc3RtYXNrLmg6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5oOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlYWxwaGEuYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmg6CisJICBzbXB0ZTogQWRkIHByb3BlcnR5IGZvciBpbnZlcnRpbmcgdGhlIHRyYW5zaXRpb24gbWFzaworCSAgVGhpcyBjb252ZXJ0cyBhIGxlZnQtdG8tcmlnaHQgdHJhbnNpdGlvbiB0byByaWdodC10by1sZWZ0IG9yCisJICBjbG9jay13aXNlIHRvIGNvdW50ZXItY2xvY2std2lzZS4KKworMjAxMC0wNC0xNSAyMjoyNzo1NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJICBzbXB0ZWFscGhhOiBDb3JyZWN0bHkgZGV0ZWN0IHByb3BlcnR5IGNoYW5nZXMgYW5kIHVwZGF0ZSBwcm9wZXJ0aWVzCisKKzIwMTAtMDQtMTYgMTk6MzU6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFjZWxwZGVwYXkuaDoKKwkgIHFjZWxwZGVwYXk6IGFkZCBmaXJzdCB2ZXJzaW9uIG9mIGEgUUNFTFAgZGVwYXlsb2FkZXIKKworMjAxMC0wNC0yOSAxNToxODowNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQuCisKKz09PSByZWxlYXNlIDAuMTAuMjIgPT09CisKKzIwMTAtMDQtMjggMDI6NTg6MDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTAuMjIKKworMjAxMC0wNC0yOCAwMjo1NzoyMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAxMC0wNC0yNSAyMzozNjoyOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIDAuMTAuMjEuMyBwcmUtcmVsZWFzZQorCisyMDEwLTA0LTI1IDIxOjE5OjMzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogaGlkZSBpcy1saXZlIHByb3BlcnR5IGZvciByZWxlYXNlCisJICBBdCB0aGUgdmVyeSBsZWFzdCBpdCBuZWVkcyBhIGJldHRlci9sZXNzIHdyb25nIG5hbWUuCisJICBTZWUgIzYxMzA2Ni4KKworMjAxMC0wNC0yNSAxNToxMjoyMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGRvbid0IGNyYXNoIGlmIGpwZWcgaW1hZ2UgY29udGFpbnMgbW9yZSB0aGFuIHRocmVlIGNvbXBvbmVudHMKKwkgIE91ciBjb2RlIGN1cnJlbnRseSBvbmx5IGhhbmRsZXMgYSBtYXhpbXVtIG9mIDMgY29tcG9uZW50cywgc28gZXJyb3IKKwkgIG91dCBmb3Igbm93IGlmIHRoZSBpbWFnZSBoYXMgbW9yZSBjb21wb25lbnRzIHRoYW4gdGhhdC4KKwkgIEZpeGVzICM2MDQxMDYuCisKKzIwMTAtMDQtMjAgMTc6MjE6MjkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJICBkb2FwOiB1cGRhdGUgcmVwb3NpdG9yeSBpbmZvIGZyb20gY3ZzLT5naXQgYW5kIG1haW50YWluZXJzCisKKzIwMTAtMDQtMjMgMTQ6NDA6MjAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZmM4NTg2NyB0byA0ZDY3YmQ2CisKKzIwMTAtMDQtMjIgMTM6MzA6NTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSAgdmlkZW9taXhlcjogRml4IGJ5dGUgb3JkZXIgZm9yIE1NWCBBUkdCL0FZVVYgY29sb3IgZmlsbGluZworCSAgRml4ZXMgYnVnICM2MTY0MDkuCisKKzIwMTAtMDQtMjEgMTc6NTM6NDkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSAgdmlkZW9taXhlcjogRml4IEFZVVYgY2hlY2tlci9jb2xvciBmaWxsaW5nCisKKzIwMTAtMDQtMTkgMTY6NDM6MjggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9tbXguaDoKKwkgIHZpZGVvbWl4ZXI6IEFkZCBpMzg3IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyB0byB0aGUgY2xvYmJlcmVkIHJlZ2lzdGVycyBsaXN0CisJICBUaGV5IGFyZSB0aGUgc2FtZSBhcyB0aGUgbW0wLW1tNyBNTVggcmVnaXN0ZXJzIGFuZCB3aWxsIGJlIG92ZXJ3cml0dGVuCisJICBieSB0aGUgYXNzZW1ibHkgY29kZSBpZiBnY2MgZG9lc24ndCBrbm93IGFib3V0IHRoZSBNTVggcmVnaXN0ZXJzLgorCSAgTm90ZTogVGhleSdyZSBhbGwgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgY2xvYmJlcmVkIHJlZ2lzdGVycyBpbiBhbGwgY2FzZXMKKwkgIGFuZCBub3Qgb25seSB3aGVuIF9fTU1YX18gaXMgbm90IGRlZmluZWQganVzdCB0byBtYWtlIHN1cmUgdGhhdCBubyBvdGhlcgorCSAgYnVncyBoYXBwZW4gd2l0aCB0aGlzIGNvZGUganVzdCBiZWNhdXNlIHNvbWUgY29tcGlsZXIgdmVyc2lvbiBnZXRzIHRoaW5ncworCSAgd3JvbmcuCisJICBGaXhlcyBidWcgIzYxNDQ2Ni4KKworMjAxMC0wNC0xOSAxNDowOTozNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IFVzZSBsaWJnc3R2aWRlbyB0byBnZXQgdGhlIG9yZGVyIG9mIFJHQgorCisyMDEwLTA0LTE3IDEwOjA2OjQxICswMTAwICBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uQG9yYWNsZS5jb20+CisKKwkqIGdzdC9nb29tL3htbXguYzoKKwkgIGdvb206IGFkZCBlZHggdG8gY2xvYmJlciBsaXN0IGluIGlubGluZSBhc3NlbWJseSBjb2RlCisJICBtdWxsIG1vZGlmaWVzICVlZHgsIHNvIHNob3VsZCBiZSBtZW50aW9uZWQgaW4gY2xvYmJlciBsaXN0LgorCSAgRml4ZXMgY3Jhc2ggb24gU29sYXJpcyAoIzYxNTk5OCkuCisKKzIwMTAtMDQtMTUgMTM6Mzk6NDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgIHRlc3RzOiBkb24ndCB1c2UgR1NUX1BMVUdJTl9MREZMQUdTIHdoZW4gYnVpbGRpbmcgdGVzdCBiaW5hcmllcworCisyMDEwLTA0LTE2IDE1OjI3OjEyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogRml4IEk0MjAtPkk0MjAgY29weWluZworCSAgRml4ZXMgYnVnICM2MTUxNDMuCisKKzIwMTAtMDQtMTMgMTg6MTU6NTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBGaXggQVlVVi0+STQyMCBjb3B5aW5nCisKKzIwMTAtMDQtMTYgMTI6MTQ6MjYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgcnRwaDI2NGRlcGF5OiBwcm9maWxlLWxldmVsLWlkIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlcgorCSAgU28sIGlmIG5lZWRlZCwgZXh0cmFjdCB0aGUgY29ycmVzcG9uZGluZyBpbmZvIGZyb20KKwkgIHNwcm9wLXBhcmFtZXRlci1zZXRzLgorCSAgQmFzZWQgb24gcGF0Y2ggcHJvdmlkZWQgYnkgPGR4c3N4IGF0IGdtYWlsLmNvbT4KKwkgIEZpeGVzICM2MTI2NTcuCisKKzIwMTAtMDQtMTUgMDc6MTM6NDYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IERyb3AgLVdjYXN0LWFsaWduCisJICBDb21taXQgbWVzc2FnZSBjb3BpZWQgZnJvbSBjb3JlJ3MgY29tbWl0IGZyb20gQmVuamFtaW4gT3R0ZToKKwkgIDI0NmY1ZGJhOTZhNWI1MGJiNzQ2MjFhZjY3YjMwOTQyY2NhNzJhZjUKKwkgIEFwcGFyZW50bHkgZ2NjIHdhcm5zIHRoYXQgR3N0TWluaU9iamVjdCBpcyBub3QgY2FzdGFibGUgdG8KKwkgIEdzdEV2ZW50L01lc3NhZ2UvQnVmZmVyIGR1ZSB0byB0aGVtIGNvbnRhaW5pbmcgNjRiaXQgdmFyaWFibGVzLCBldmVuCisJICB0aG91Z2ggQVJNIGhhY2tlcnMgY2xhaW0gdGhhdCB0aG9zZSBvbmx5IG5lZWQgNGJ5dGUgYWxpZ25tZW50LiBBbmQgYXMKKwkgIGxvbmcgYXMgZ2NjIGJlaGF2ZXMgdGhhdCB3YXksIHRoaXMgd2FybmluZyBpcyBub3QgdmVyeSB1c2VmdWwuCisJICBTbyB3ZSdsbCByZW1vdmUgdGhlIHdhcm5pbmcgdW50aWwgdGhpcyBwcm9ibGVtIGlzIGZpeGVkLgorCSAgRml4ZXMgIzYxNTY5OAorCisyMDEwLTA0LTE0IDIzOjQ2OjA2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOgorCSAgZmxhY3RhZzogZml4IGFkYXB0ZXIgYXNzZXJ0aW9uIHdoZW4gdXNlZCBkaXJlY3RseSBhZnRlciBmbGFjZW5jCisJICBVbmxpa2UgZmlsZXNyYywgZmxhY2VuYyBvdXRwdXRzIHRoZSBmbGFjIGJsb2NrcyBuZWF0bHkgYWxpZ25lZCBvbmUgaW4KKwkgIGVhY2ggYnVmZmVyLiBUaGlzIG1lYW5zIHRoYXQgd2hlbiB3ZSBzd2l0Y2ggZnJvbSBtZXRhZGF0YSBtb2RlIHRvCisJICBhdWRpbyBkYXRhIHBhc3N0aHJvdWdoIG1vZGUsIHRoZXJlJ3Mgbm8gZGF0YSBsZWZ0IGluIHRoZSBhZGFwdGVyIHRvCisJICBwdXNoIG91dCBhdCB0aGlzIHBvaW50LCBzbyBjaGVjayBpZiB0aGVyZSdzIGRhdGEgaW4gdGhlIGFkYXB0ZXIKKwkgIGJlZm9yZSByZXF1ZXN0aW5nIGJ1ZmZlcnMgZnJvbSBpdCAoYWxzbyBuZWVkZWQgaW4gY2FzZSB3ZSBnZXQgaW5wdXQKKwkgIGJ1ZmZlcnMgb2YgMCBzaXplKS4KKwkgIEZpeGVzICM2MTU3OTMuCisKKzIwMTAtMDQtMTQgMjM6MTg6MjcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjIxLjIgcHJlLXJlbGVhc2UKKworMjAxMC0wNC0xNCAyMDozMTozMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZWwucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiB1cGRhdGUKKworMjAxMC0wNC0xNCAyMDowNjowOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL2VxdWFsaXplci9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3NoYXBld2lwZS9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZXhhbXBsZXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ljbGVzL01ha2VmaWxlLmFtOgorCSAgdGVzdHM6IHVzZSBMREFERCBmb3IgbGlicyB0byBsaW5rIHRvIGluc3RlYWQgb2YgTERGTEFHUworCSAgVXNlIGZvb19MREFERCBpbnN0ZWFkIG9mIGZvb19MREZMQUdTIHRvIHNwZWNpZnkgdGhlIGxpYnJhcmllcyB0byBsaW5rIHRvLgorCSAgVGhpcyBzaG91bGQgbWFrZSBzdXJlIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZSBsaW5rZXIgaW4gdGhlIHJpZ2h0CisJICBvcmRlciwgYW5kIG1ha2VzIExERkxBR1MgdXNhYmxlIGFnYWluLgorCSAgQmFzZWQgb24gcGF0Y2ggYnkgQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbkBvcmFjbGUuY29tPgorCSAgRml4ZXMgIzYxNTY5Ny4KKworMjAxMC0wNC0xNCAxODoxMzo1NiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogdHJhbnNmb3JtX2NhcHMgOiBXZSBjYW4gb25seSBjb252ZXJ0IEFZVVYgdG8geFJHQgorCSAgV2Ugd2VyZSBwcmV2aW91c2x5IHN0YXRpbmcgdGhhdCB3ZSBjb3VsZCBjb252ZXJ0IEFZVVYvSTQyMC9ZVjEyIHRvIHhSR0IuCisKKzIwMTAtMDQtMTMgMDA6MTQ6NDYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGFsc28gcmVtb3ZlIC1XYWdncmVnYXRlLXJldHVybiBmcm9tIHdhcm5pbmcgZmxhZ3MKKwkgIEl0IGNhdXNlcyBwcm9ibGVtcyB3aXRoIE9iamVjdGl2ZS1DIGNvZGUgbGlrZSBpbiBvc3h2aWRlb3NpbmsuCisJICBGaXhlcyAjNjEzNjYzLgorCisyMDEwLTA0LTEyIDE4OjIyOjM5ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIGNoZWNrOiBJZ25vcmUgb3N4IGF1ZGlvL3ZpZGVvIHNyYy9zaW5rcyBpbiBzdGF0ZSBjaGFuZ2UgdGVzdHMKKwkgIEFuZCBtYWtlIHRoZSBsaW5lIHJlYWRhYmxlIGZvciB0aG9zZSBtZXJlIG1vcnRhbHMgdGhhdCBkb24ndCBvd24gYSAzMCIgc2NyZWVuCisKKzIwMTAtMDQtMTIgMTg6MDM6MjAgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxlbmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdsaW1pdGVyLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ3ZvbHVtZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc3BlY3RydW0uYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvZmlsdGVyLmM6CisJICBjaGVjazogRG9uJ3QgcmUtZGVjbGFyZSAnR0xpc3QgKmJ1ZmZlcnMnIGluIHRoZSB0ZXN0cworCSAgSXQncyBhbiBleHRlcm5hbCB3aGljaCBsaXZlcyBpbiBnc3RjaGVjay5jLiBSZWRlY2xhcmluZyBpdCBtYWtlcyBzb21lCisJICBjb21waWxlcnMvYXJjaGl0ZWN0dXJlcyB0aGluayB0aGUgJ2J1ZmZlcnMnIGluIHRoZSBpbmRpdmlkdWFsIHRlc3RzIGFyZQorCSAgYSBkaWZmZXJlbnQgc3ltYm9sLi4uIGFuZCB0aGVyZWZvcmUgd2UgZW5kIHVwIGNvbXBhcmluZyBob2xvZGVja3Mgd2l0aAorCSAgb3Jhbmdlcy4KKworMjAxMC0wNC0xMiAxNDo1MDo0NiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgbWF0cm9za2FkZW11eCwgcXRkZW11eDogbWlub3IgY29kZSBjbGVhbnVwIGluIGF2Y19sZXZlbF9pZGNfdG9fc3RyaW5nKCkKKwkgIERvIHRoZSBzYW1lIHdpdGggc2xpZ2h0bHkgZmV3ZXIgTE9DLgorCisyMDEwLTA0LTEyIDEyOjQwOjExICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IFJlbW92ZSAtV3VuZGVmIGZsYWcKKwkgIEZpeGVzICM2MTUxNjEKKworMjAxMC0wNC0xMiAxMTo0Mzo0OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IEZpeCBJNDIwLT5BWVVWIGNvcHlpbmcKKworMjAxMC0wNC0xMiAxMToyNTo1OSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IENvcnJlY3RseSBjbGFtcCBmcmFtZS9iYWNrZ3JvdW5kIGFscGhhcyB0byBbMCwyNTVdIGJlZm9yZSB3cml0aW5nIHRoZW0KKworMjAxMC0wNC0xMiAxMToxNjo1NiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkgIGNoZWNrOiBJZ25vcmUganBlZ2VuYyB0ZXN0CisKKzIwMTAtMDQtMTEgMTM6MTQ6MzAgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5oOgorCSAgZGVpbnRlcmxhY2U6IE9ubHkgY2hlY2sgaW50ZXJsYWNlZCBmbGFnIGluIHNpbmsgY2FwcworCSAgRml4ZXMgIzYxNTQ2MC4KKworMjAxMC0wNC0wOSAxMToyMTo0NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBiYTMzZDFmIHRvIGZjODU4NjcKKworMjAxMC0wNC0wOCAxODowNTo0NiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIGRvY3M6IGRvIHByb3BlciBlc2NhcGluZyBmb3IgIiUiCisKKzIwMTAtMDQtMDggMTc6NTA6NDkgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcGdvb2dsZS5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcGdvb2dsZS5oOgorCSAgcnRzcDogcmVtb3ZlIG9ic29sZXRlIGdvb2dsZSBleHRlbnNpb24KKwkgIFRoaXMgd2FzIG5vdCBidWlsZCBmb3IgYSB3aGlsZSBhbmQgY2FuIGJlIHJlbW92ZWQuCisKKzIwMTAtMDQtMDggMTc6NDI6NTIgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBkb2NzOiBtb3ZlIHR3byBzeW1ib2xzIHRvIHByaXZhdGUgc2VjdGlvbgorCisyMDEwLTA0LTA4IDE3OjM2OjMwICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBkb2NzOiBhZGQgZmx4ZGVjIGRvY3MKKworMjAxMC0wNC0wOCAxNzoxNzowNiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgZG9jczogZW5hYmxlIHRoZSAyIG9mIDY1IHJ0cCBlbGVtZW50cyBpbiB0aGUgZG9jcworCisyMDEwLTA0LTA4IDExOjU0OjE5ICswMjAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6CisJICBzaG91dDI6IERvbid0IHdhaXQgaWYgd2UncmUgbGF0ZQorCSAgSW4gZmFjdCwgZHVlIHRvIHNpZ25lZG5lc3MgaXNzdWVzLCBhIG5lZ2F0aXZlIGRlbGF5IHdvdWxkIGJlIGNoYW5nZWQgdG8KKwkgIGFuIGFsbW9zdCBpbmZpbml0ZSB3YWl0IGNhdXNpbmcgc2hvdXQyc2VuZCB0byAibG9jayB1cCIuCisJICBSZXBvcnRlZCBieSBDaHJpc3RvcGhlciBNb250Z29tZXJ5LgorCisyMDEwLTA0LTA4IDE2OjU2OjM3ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICBkb2NzOiB1cGQgLT4gdWRwIGFuZCB2b2lsYSBpdCBzaG93cyB1cCBpbiB0aGUgZG9jcworCisyMDEwLTA0LTA4IDE2OjUxOjI3ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5oOgorCSAgZG9jczogZml4IGRvYyBibG9iIHN5bnRheAorCisyMDEwLTA0LTA4IDE2OjUxOjA1ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBkb2NzOiBhZGQgKHNwYXJzZSkgZG9jcyBmb3IgYXVwYXJzZSBlbGVtZW50CisKKzIwMTAtMDQtMDggMTQ6NDA6NDMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBkb2NzOiBhZGQgdmlkZW9ib3ggc3ltYm9scworCisyMDEwLTA0LTA4IDE0OjQwOjE5ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgIGRvY3M6IHJlbW92ZSBkeW51ZHBzaW5rIHVudGlsIHNvbWVvbmUgZG9jdW1lbnRzIGl0CisKKzIwMTAtMDQtMDggMTQ6MzQ6NTkgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IG1ha2UgZGVidWcgY2F0ZWdvcnkgc3RhdGljCisKKzIwMTAtMDQtMDggMTQ6Mjk6MTkgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4Lmg6CisJICBmbHhkZW11eDogcmVuYW1lIEdzdEZMVkRlbXV4IGZvciBHc3RGbHZEZW11eAorCisyMDEwLTA0LTA4IDE0OjIzOjE5ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuaDoKKwkgIGZsdmRlbXV4OiBtZXJnZSBmbHZwYXJzZSBpbnRvIHRoZSBkZW11eGVyIGFuZCBtYWtlIGZ1bmN0aW9uIHN0YXRpYworCSAgTm8gbmVlZCB0byBoaWRlIGNlcnRhaW4gZnVuY3Rpb24gaW4gdGhlIGRvY3MuIEFsbG93cyB0byBkbyBtb3JlIGNsZWFudXBzLgorCisyMDEwLTA0LTA4IDEzOjEzOjM0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmg6CisJICBhbHBoYTogQWRkIGRvY3VtZW50YXRpb24KKworMjAxMC0wNC0wOCAxNDowMDowOCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgIGRvY3M6IHY0bDJidWZmZXIgcG9vbCBpcyBub3cgYSBzZXBhcmF0ZSBvYmplY3QsIHJlbW92ZSB0aGVtIGZyb20gdjRsMnNyYyBkb2NzCisKKzIwMTAtMDQtMDggMTM6NTg6MTEgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBkb2NzOiByZW1vdmUgbm9uIGV4aXN0aW5nIGZsYWdzIGFuZCBhZGQgdHdvIGludGVybmFsIG1ldGhvZHMKKwkgIElmIHNvbWVvbmUgY2FyZXMgZmx2cGFyc2UgY291bGQgYmUgbWVyZ2VkIGludG8gZmx2ZGVtdXguCisKKzIwMTAtMDQtMDggMTM6NTc6MDkgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5oOgorCSAgcnRwc2Vzc2lvbjogcmVtb3ZlIHByb3RvdHlwZSBmb3Igbm9uIGV4aXN0aW5nIGZ1bmN0aW9uCisJICBUaGVyZSBpcyBubyBmdW5jdGlvbiBieSB0aGF0IG5hbWUgYW55d2hlcmUuCisKKzIwMTAtMDQtMDggMTI6NTY6NTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSAgZG9jczogVXBkYXRlIGluc3BlY3RlZCBwbHVnaW4gaW5mb3JtYXRpb24KKworMjAxMC0wNC0wOCAxMjo1NjozMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJICBhbHBoYWNvbG9yOiBJbXByb3ZlIGRvY3MgYSBiaXQKKworMjAxMC0wNC0wOCAxMzo0Nzo0MiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgIGRvY3M6IGFkZCBlZmZlY3R0diBkZWZpbmVzIGFuZCByZW9yZGVyIGxpc3QKKworMjAxMC0wNC0wOCAxMzo0MTo0NyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgIGRvY3M6IHJlbW92ZSB0aHJlZSBlbnRyaWVzIHRoYXQgYXJlIG5vdCBleHBvcnRlZCBmcm9tIHRoZSBoZWFkZXJzIGFueW1vcmUKKworMjAxMC0wNC0wOCAxMzo0MDozNiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmg6CisJICBqcGVnZGVjOiBtb3ZlIG1hY3JvIHRvIGMgc291cmNlCisJICBPbmUgbGVzcyBzZW1pIHB1YmxpYyBzeW1ib2wgd2l0aG91dCBuYW1lc3BhY2UgcHJlZml4IGluIHRoZSBoZWFkZXJzLgorCisyMDEwLTA0LTA4IDEzOjQwOjA5ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5oOgorCSAgc3BlZXhlbmM6IHJlbW92ZSB1bnVzZWQgZGVmaW5lcworCisyMDEwLTA0LTA4IDEzOjIzOjM4ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thLW11eDogZml4IGxhc3QgY29tbWl0CisJICBVc2UgYSBsb2NhbCBkZWZpbmUgZm9yIFdBVkVGT1JNQVRfRVggYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIHN0cnVjdCArIDIgYnl0ZXMKKwkgIGZvciB0aGUgZXh0ZW5zaW9uIHNpemUuCisKKzIwMTAtMDQtMDggMTM6MTY6NTMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmg6CisJICBzcGVleDogcmVtb3ZlIHVudXNlZCBkZWZpbmUKKworMjAxMC0wNC0wOCAxMzowMzo0MyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3Qvd2F2ZW5jL01ha2VmaWxlLmFtOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZlbmMvcmlmZi5oOgorCSAgd2F2ZW5jOiByZW1vdmUgaW50ZXJuYWwgY29weSBvZiByaWZmLmggYW5kIHVzZSByaWZmLWxpYnJhcnkgaW5zdGVhZC4KKwkgIFdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24geWV0LCBqdXN0IHRoZSBzdHJ1Y3R1cmVzIGFuZCBkZWZpbmVzLgorCisyMDEwLTA0LTA4IDEyOjU2OjA5ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgIG1hdHJvc2thbXV4OiB1c2UgcmlmZiBsaWIgbW9yZQorCSAgUmVtb3ZlIEJJVE1BUElORk9IRUFERVIgYW5kIHVzZSB0aGUgb25lIGZyb20gcmlmZi1saWIuIEFsc28gcmVtb3ZlIHRoZQorCSAgV0FWRUZPUk1BVEVYX1NJWkUgZGVmaW5lIGFuZCB1c2UgYSBzaXplb2YgdG9nZXRoZXIgd2l0aCB0aGUgcmVzcGVjdGl2ZSBzdHJ1Y3QuCisJICBCZXNpZGVzIGJldHRlciBjb2RlIHJldXNlIHRoaXMgbGVzc2VucyB0aGUgdW51bnNlZCBzeW1ib2xzIGluIHRoZSBkb2NzLgorCisyMDEwLTA0LTA4IDEyOjE0OjA3ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuaDoKKwkgIGRvY3M6IHRyaW0gc2VjdGlvbnMgZmlsZSBtb3JlCisJICBSZW5hbWUgc29tZSBkZWZpbmVzIGFuZCBtb3ZlIHNvbWUgaXRlc20gdG8gKi5jIGZpbGVzLiBBZGQgbW9yZSBpdGVtcyB0byBpbnRlcm5hbAorCSAgc3Vic2VjdGlvbi4KKworMjAxMC0wNC0wOCAxMToxOTo0MyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgIGRvY3N3OiB0cmltIHRoZSBzZWN0aW9uIGZpbGUKKworMjAxMC0wNC0wOCAxMDoyNjoyNSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgZG9jczogYWRkIHY0bDJzaW5rIHRvIGRvY3MKKworMjAxMC0wNC0wOCAxMDoxNTowOCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgZG9jczogZml4IHhtbAorCSAgVGhlIHRpdGxlIHRhZyBiZWxvbmdzIGludG8gdGhlIHJlZnNlY3QyLgorCisyMDEwLTA0LTA3IDE3OjQzOjU2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogQWRkIHN1cHBvcnQgZm9yIFlWMTIsIGluY2x1ZGluZyBjb252ZXJzaW9uIHN1cHBvcnQgZm9yIEk0MjAvQVlVVgorCisyMDEwLTA0LTA3IDE3OjI3OjEyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogQWRkIHN1cHBvcnQgZm9yIGdyYXlzY2FsZSBpbnB1dC9vdXRwdXQKKwkgIFRoaXMgZG9lc24ndCBkbyBhbnkgY29udmVyc2lvbiBhbmQgaXMgdGhlIG5leHQgc3RlcCB0bworCSAgcmVwbGFjaW5nIHZpZGVvY3JvcCBieSBzdXBwb3J0aW5nIGFsbCByZW1haW5pbmcgZm9ybWF0cworCSAgaW4gcGFzc3Rocm91Z2ggbW9kZS4KKworMjAxMC0wNC0wNyAxNjoyNDozOCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94Lmg6CisJICB2aWRlb2JveDogQWRkIHN1cHBvcnQgZm9yIGZpbGxpbmcgdGhlIGJhY2tncm91bmQgd2l0aCByZWQsIHllbGxvdyBhbmQgd2hpdGUKKworMjAxMC0wNC0wNyAxNjoxMToxMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IEFkZCBzdXBwb3J0IGZvciBkaXJlY3QgUkdCPC0+QVlVViBjb252ZXJzaW9uCisKKzIwMTAtMDQtMDcgMTY6MTE6MDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBGaXggUkdCMjQgZmlsbGluZworCisyMDEwLTA0LTA3IDE2OjA2OjU0ICswMzAwICBNYXJjbyBCYWxsZXNpbyA8bWFyY28uYmFsbGVzaW9Abm9raWEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOgorCSAgaDI2NGRlcGF5OiBoYW5kbGUgcHJvcGVybHkgU1RBUHMKKwkgIGluIHJ0cGgyNjRkZXBheS5jLCBsaW5lcyA1NzctNTc2LCBOQUxVLXR5cGUgMjQgKFNpbmdsZS1UaW1lIEFnZ3JlZ2F0aW9uCisJICBQYWNrZXQpIGlzIGhhbmRsZWQgaW4gZmFsbC10aHJvdWdoIGFzIE5BTFUtdHlwZSAyNiAodW5oYW5kbGVkKS4KKwkgIFRoaXMgbGVhZHMgaGlnaCBxdWFsaXR5IGgyNjQgc3RyZWFtcyBzdWNoIGFzOgorCSAgcnRzcDovL3N0cmVhbS55bGUubW9iaS95bGUvYXJlZW5hL01FRElBX0UwMzQyNjU3X3AzLm1wNAorCSAgdG8gZmFpbCB3aXRoICJOQUwgdW5pdCB0eXBlIDI0IG5vdCBzdXBwb3J0ZWQgeWV0IiAoYnV0IGl0J3MgYWN0dWFsbHkKKwkgIHN1cHBvcnRlZCksIGFuZCB0aHVzIHRvIGNsb3NlIGFueSBzdHJlYW0gd2hpY2ggY29udGFpbnMgU1RBUHMuCisJICBUaGUgcHJvcG9zZWQgb25lLWxpbmVyIHBhdGNoIGZpeGVzIHRoZSBpc3N1ZS4KKwkgIEZpeGVzICM2MTUwNTEuCisKKzIwMTAtMDQtMDcgMTM6NDc6MDIgKzAyMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIGdzdC1saWJzL2dzdC9nc3QtaTE4bi1wbHVnaW4uaDoKKwkqIGdzdC9hdmkvZ3N0YXZpLmM6CisJICBidWlsZDogZml4IGNvbXBpbGVyIHdhcm5pbmdzCisJICBmaXggd2FybmluZ3MgZm9yIGFsbCBwbHVnaW5zIHRoYXQgdXNlOiBzZXRsb2NhbGUgKExDX0FMTC4uLgorCisyMDEwLTA0LTA3IDEzOjMxOjEzICswMjAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aS5jOgorCSAgYXZpOiBmaXggY29tcGlsZXIgd2FybmluZworCisyMDEwLTAzLTMxIDE3OjU0OjIxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiByZXN0cmljdCByZXN5bmNpbmcgdG8gc3VidGl0bGUgdHJhY2tzCisJICBUaGlzIHNob3VsZCBwcmV2ZW50IHNraXBwaW5nIGF1ZGlvIG9yIHZpZGVvIGluIG5vdCBzbyB3ZWxsIGludGVybGVhdmVkCisJICBjYXNlcy4KKwkgIEZpeGVzICM2MTQ0NjAuCisKKzIwMTAtMDQtMDYgMTM6MjE6NTEgKzA1MzAgIEFydW4gUmFnaGF2YW4gPGZvcmRfcHJlZmVjdEBnZW50b28ub3JnPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2ZvdXJjYy5oOgorCSAgcXRkZW11eDogUG9zdCBhdmcuL21heC4gYml0cmF0ZSB0YWdzIGZvciBILjI2NAorCSAgVGhpcyByZWFkcyB0aGUgYXZlcmFnZSBhbmQgbWF4aW11bSBiaXRyYXRlcyBmcm9tIHRoZSAnYnRydCcgYXRvbSBpZgorCSAgYXZhaWxhYmxlLCBhbmQgcHVzaGVzIHRoZXNlIGFzIHRhZ3MsCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjE0OTI3CisKKzIwMTAtMDQtMDMgMjM6Mzk6MjAgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBmaXggcmFjeSBzaHV0ZG93bgorCSAgS2VlcCBhIHJlZiBvZiBwdWxzZXNpbmsgZm9yIGRlZmVycmVkIG1haW5sb29wIGludm9jYXRpb24uIEZpeGVzICM2MTQ3NjUKKworMjAxMC0wNC0wNSAxNTo0ODoxNyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvanBlZ2VuYy5jOgorCSAgdGVzdHM6IGpwZWdlbmM6IEFkZHMgc29tZSBnZXRjYXBzIHRlc3QKKwkgIEFkZHMgdGVzdHMgZm9yIHRoZSBqcGVnZW5jIGdldGNhcHMgZnVuY3Rpb24sIHRvIGF2b2lkCisJICBoYXZpbmcgaXQgcmV0dXJuaW5nIG5vbi1zdWJzZXQgY2FwcworCisyMDEwLTA0LTA1IDE0OjUxOjU4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAganBlZ2VuYzogRml4IGdldGNhcHMgZnVuY3Rpb24KKwkgIFdoZW4gY3JlYXRpbmcgdGhlIGNhcHMgYWxsb3dlZCB0byB1cHN0cmVhbSB1c2luZyBkb3duc3RyZWFtCisJICByZXN0cmljdGlvbnMsIHVzZSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgYXMgdGhhdCBoYXMgdGhlCisJICB1c2FibGUgZm9ybWF0cyBhbmQgcHV0cyBpbnRvIGl0IHRoZSB3aWR0aCwgaGVpZ2h0IGFuZCBmcmFtZXJhdGUKKwkgIGZpZWxkcy4gVGhpcyBhdm9pZHMgZ2V0dGluZyBlcnJvcnMgYWJvdXQgZ2V0Y2FwcyByZXR1cm5pbmcKKwkgIG5vbiBzdWJzZXQgY2FwcyBvZiBpdHMgcGFkIHRlbXBsYXRlLgorCSAgVGhpcyBlcnJvciBzaG93ZWQgdXAgb24gdGhlIG1ldGFkYXRhIHBsdWdpbiB1bml0IHRlc3QgaW4gLWJhZC4KKworMjAxMC0wNC0wNSAxNzozMTozNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IEZpeCBjb252ZXJzaW9uIGZyb20gMyBieXRlIFJHQiB0byBBUkdCCisKKzIwMTAtMDQtMDUgMTc6MDg6MTUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBBZGQgc3VwcG9ydCBmb3IgMyBieXRlIFJHQiBmb3JtYXRzIGFuZCByZWZhY3RvciBSR0IgY29kZSBhIGJpdAorCisyMDEwLTA0LTA1IDE1OjUxOjEzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guaDoKKwkgIHZpZGVvYm94OiBBZGQgc3VwcG9ydCBmb3IgYWxsIDMyIGJpdCBSR0IgZm9ybWF0cworCSAgLi4uaW5jbHVkaW5nIGNvbnZlcnNpb24gYmV0d2VlbiB0aGVtLgorCisyMDEwLTA0LTA1IDE1OjI2OjAzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBhZGQgcHJvcGVydHkgdG8gY29udHJvbCB0aGUgYnVmZmVyaW5nIG1ldGhvZAorCSAgQWRkIGEgcHJvcGVydHkgdG8gY29udHJvbCBob3cgdGhlIGppdHRlcmJ1ZmZlciBwZXJmb3JtcyB0aW1lc3RhbXBpbmcgYW5kCisJICBidWZmZXJpbmcuCisKKzIwMTAtMDQtMDQgMTk6MDI6NDEgLTAzMDAgIEFuZHLDqSBEaWViIE1hcnRpbnMgPGFuZHJlLmRpZWJAZ21haWwuY29tPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSAgYWxwaGFjb2xvcjogUmVtb3ZpbmcgdW51c2VkIHZhcmlhYmxlCisJICBGaXhlcyBidWcgIzYxNDg0My4KKworMjAxMC0wNC0wNCAyMDozMTozOCAtMDMwMCAgQW5kcsOpIERpZWIgTWFydGlucyA8YW5kcmUuZGllYkBnbWFpbC5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IHNob3VsZCBub3QgcmV0dXJuIGNhcHMgQU5ZIGJhc2VkIG9uIGRvd25zdHJlYW0KKwkgIFdoZW4gZG93bnN0cmVhbSBoYXMgYSBzaW5rIHBhZCB3aXRoIEFOWSBjYXBzLCBqcGVnZW5jIHNob3VsZAorCSAgdHJlYXQgaXQgdGhlIHNhbWUgYXMgTlVMTCBhbmQgcmV0dXJuIGl0cyB0ZW1wbGF0ZSBjYXBzLgorCSAgRml4ZXMgIzYxNDg0MgorCisyMDEwLTA0LTA0IDIyOjI4OjMzICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy9vc3MvZ3N0b3NzaGVscGVyLmM6CisJICBvc3M6IGFkZCBmaXhtZSBjb21tZW50CisKKzIwMTAtMDQtMDQgMjI6MjY6NTkgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ2NvbmYvTWFrZWZpbGUuYW06CisJICBidWlsZDogdXNlICQoYnVpbGRkaXIpIGZvciBpbnN0YWxsaW5nIGdlbmVyYXRlZCBmaWxlcworCisyMDEwLTA0LTA0IDIyOjA3OjMzICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIFJldmVydCAiY29uZmlndXJlOiBmaXggb3V0IG9mIHNvdXJjZSBkaXIgYnVpbGRzIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCBjYTBiZDNhOGNlYTMxZjllYTBkZjc5OGE4M2QzMDA3ZTY5Njk1OGJhLgorCisyMDEwLTA0LTA0IDIxOjM2OjM1ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogZml4IG91dCBvZiBzb3VyY2UgZGlyIGJ1aWxkcworCSAgUmVtb3ZlIG5vbi1leGlzdGluZyBnc3QtbGlicyBmcm9tIGluY2x1ZGUgYW5kIGxpYnJhcnktcGF0aHMnLgorCSAgRml4ZXMgIzYxNDM1NCBldmVuIG1vcmUuCisKKzIwMTAtMDQtMDEgMTA6MTk6MDAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2ZvdXJjYy5oOgorCSAgcXRkZW11eDogUmVhZCByZXBsYXlnYWluIHBlYWsvZ2FpbiB0YWdzCisJICBNYWtlIHF0ZGVtdXggcmVhZCB0YWdzIHJlcGxheWdhaW4gdGFncyB0aGF0IGFyZSB3aXRoaW4gJy0tLS0nIGF0b21zLgorCSAgRml4ZXMgIzYxNDQ3MQorCisyMDEwLTA0LTAxIDE4OjQ4OjQzICswNTMwICBBcnVuIFJhZ2hhdmFuIDxmb3JkX3ByZWZlY3RAZ2VudG9vLm9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBtYXRyb3NrYTogRXhwb3J0IGguMjY0IHByb2ZpbGUgYW5kIGxldmVsIGluIGNhcHMKKwkgIFRoaXMgcmVwbGljYXRlcyB0aGUgY29kZSBpbiBxdGRlbXV4IHRvIGV4cG9ydCB0aGUgaC4yNjQgcHJvZmlsZSBhbmQKKwkgIGxldmVsIGluIHRoZSBzdHJlYW0gY2Fwcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MTQ2NTEKKworMjAxMC0wNC0wMiAxODo1MDo0NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBvZmYtYnktb25lIGludHJvZHVjZWQgaW4gbGFzdCBjb21taXQKKworMjAxMC0wNC0wMSAxODozODozOCArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Zm9yZF9wcmVmZWN0QGdlbnRvby5vcmc+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IE1pbm9yIHJlZmFjdG9yIG9mIHRoZSBjb2RlCisJICBUaGlzIHdpbGwgbWFrZSBpdCBlYXNpZXIgdG8gY2x1bXAgdG9nZXRoZXIgY29tbW9uIGNvZGUgd2hlbiBjb3B5aW5nIHRvCisJICBtYXN0cm9za2FkZW11eC4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MTQ2NTEKKworMjAxMC0wNC0wMSAxODoxNzowOSArMDUzMCAgQXJ1biBSYWdoYXZhbiA8Zm9yZF9wcmVmZWN0QGdlbnRvby5vcmc+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEV4cG9ydCBoLjI2NCBsZXZlbCBpbiBjYXBzCisJICBUaGlzIGV4cG9ydHMgdGhlIGguMjY0IGxldmVsIGluIHRoZSBzdHJlYW0gY2FwcyAoYXMgYSBzdHJpbmcpIHdoaWNoIGNhbgorCSAgYmUgdXNlZCB0byBtYXRjaCBhIGRlY29kZXIsIG9yIGFzIG1ldGFkYXRhLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxNDY1MQorCisyMDEwLTA0LTAxIDE2OjU4OjMyICswNTMwICBBcnVuIFJhZ2hhdmFuIDxmb3JkX3ByZWZlY3RAZ2VudG9vLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRXhwb3J0IGguMjY0IHByb2ZpbGUgaW4gY2FwcworCSAgVGhpcyBhZGRzIHRoZSBoLjI2NCBwcm9maWxlIGZvciBhIGdpdmVuIHN0cmVhbSBpbnRvIGNhcHMuIFRoaXMgY2FuCisJICAoZXZlbnR1YWxseSkgYmUgdXNlZCB0byBzZWxlY3QgYW4gYXBwcm9wcmlhdGUgZGVjb2RlciBhbmQgYXMgbWV0YWRhdGEKKwkgIGZvciBjZXJ0YWluIGFwcGxpY2F0aW9ucy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MTQ2NTEKKworMjAxMC0wMy0zMSAxNDo0MzoxNCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiByZW1vdmUgb2Jzb2xldGUgcmV2ZXJzZSBwbGF5YmFjayBjb2RlIHBhdGgKKworMjAxMC0wMy0zMSAxNDo0MDo1MCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdmRlbXV4OiBzdXBwb3J0IChwdWxsIG1vZGUpIG5lZ2F0aXZlIHNlZWsgcmF0ZQorCisyMDEwLTAzLTI5IDE1OjI3OjM3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IGFsc28gY2hlY2sgZm9yIHNlZ21lbnQgc3RvcCBmb3Igbm9uLXNlZ21lbnQtc2VlaworCisyMDEwLTAzLTMwIDE2OjUwOjEwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBwdXNoIGNvcnJlY3RseSBzaXplZCBmbGFjIGhlYWRlciBidWZmZXJzCisJICBGaXhlcyAjNjE0MzUzLgorCisyMDEwLTAzLTMwIDA3OjM0OjA3IC0wNTAwICBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGJ1aWxkOiBmaXggY29tcGlsZXIgd2FybmluZyB3aGVuIHNyY2RpciAhPSBidWlsZGRpcgorCSAgRml4ZXMgJy4uLy4uL2dzdC1saWJzOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5JyB3YXJuaW5nL2Vycm9yIHdoZW4KKwkgIHRoZSBidWlsZCBkaXJlY3RvcnkgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgorCSAgRml4ZXMgIzYxNDM1NC4KKworMjAxMC0wMy0zMCAwMTo1MDozMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOgorCSAgaWQzZGVtdXg6IGZpeCBwYXJzaW5nIG9mIHVuc3luY2VkIGZyYW1lcyB3aXRoIGRhdGEgbGVuZ3RoIGluZGljYXRvcgorCSAgRml4ZXMgYnVnICM2MTQxNTguCisKKzIwMTAtMDMtMjkgMTE6MDA6MDQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBnc3QvTWFrZWZpbGUuYW06CisJKiBzeXMvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9leGFtcGxlcy9NYWtlZmlsZS5hbToKKwkgIGJ1aWxkOiBidWlsZCBwbHVnaW5zIGFuZCBleGFtcGxlcyBpbiBwYXJhbGxlbCB3aGVyZSBwb3NzaWJsZQorCisyMDEwLTAzLTE4IDE4OjQ5OjI0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgZGlyZWN0c291bmRzaW5rOiBmaXggcmVkdW5kYW50IGZ1bmN0aW9uIHJlZGVjbGFyYXRpb24gY29tcGlsZXIgd2FybmluZ3MKKwkgIFJlLWFwcGx5IHRoaXMgYWdhaW4gYXMgd2VsbCwgYXMgaXQgd2FzIHVuZG9uZSBieSB0aGUgcHJldmlvdXMgY29tbWl0Li4KKworMjAxMC0wMy0xOCAxNDozMTozNSArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlscyA9PiBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUKKwkgIEFwcGx5IHRoaXMgYWdhaW4sIGFzIGl0IHdhcyBvdmVyd3JpdHRlbiBieSB0aGUgcHJldmlvdXMgY29tbWl0LiBNZXJnaW5nCisJICBpcyBoYXJkLCBhcHBhcmVudGx5LgorCisyMDEwLTAzLTI2IDIzOjIwOjEwICswMTAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AZmx1ZW5kby5jb20+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuaDoKKwkgIGRpcmVjdHNvdW5kc2luazogSW1wbGVtZW50IFNQRElGIHN1cHBvcnQgZm9yIEFDMy4KKwkgIERldGVjdCBpZiB0aGUgc291bmQgY2FyZCBzdXBwb3J0cyBTUERJRiBwYXNzdGhydSBvZiBBQzMgYW5kIGFkZAorCSAgbmVjZXNzYXJ5IGNvZGUgdG8gc3VwcG9ydCB0aGF0IGxpa2UgYWxzYXNpbmsuCisKKzIwMTAtMDMtMjYgMTc6MDY6NTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBNYWtlZmlsZS5hbToKKwkgIGJ1aWxkOiBhZGQgY3J1ZnQgYWxlcnQgZm9yIGNvbW1vbi9zaGF2ZSoKKworMjAxMC0wMy0yNiAxNjo1MDoyMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9sYW5nLmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2xhbmcuaDoKKwkgIHF0ZGVtdXg6IGV4dHJhY3Qgc3RyZWFtIGxhbmd1YWdlIGluIG1vcmUgY2FzZXMKKwkgIFRoZSAxNi1iaXQgbGFuZ3VhZ2UgY29kZSBjYW4gYmUgZWl0aGVyIGEgcGFja2VkIElTTy02MzktMlQgY29kZQorCSAgb3IgYSAnTWFjaW50b3NoIGxhbmd1YWdlIGNvZGUnLiBIYW5kbGUgdGhlIGxhdHRlciB0eXBlIG9mIGxhbmd1YWdlCisJICBjb2RlcyBhcyB3ZWxsLCBhbmQgbWFwIHRvIHRoZSBtYXRjaGluZyBJU08gY29kZS4gTGFzdGx5LCBmaXgKKwkgIGxhbmd1YWdlIGNvZGUgcG9zdGluZyBmb3IgbGFuZ3VhZ2UgIzAsIHdoaWNoIGlzIHZhbGlkIGFuZCBzdGFuZHMKKwkgIGZvciAnRW5nbGlzaCcuCisJICBGaXhlcyAjNjE0MDAxLgorCisyMDEwLTAzLTI2IDE0OjU1OjUzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogSW1wcm92ZSBkZWJ1Z2dpbmcgYW5kIGFkZCBzb21lIEZJWE1FcworCisyMDEwLTAzLTI2IDE0OjQyOjA2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogU2FtcGxlIHJhdGUgbWFya2VycyAweDAxLCAweDAyIGFuZCAweDAzIGFyZSB2YWxpZAorCSAgVGhleSBhcmUgZm9yIDg4LjJrSHosIDE3Ni40a0h6IGFuZCAxOTJrSHouCisKKzIwMTAtMDMtMjYgMTQ6MTY6MzkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiBUYWtlIHNhbXBsZXJhdGUsIHdpZHRoIGFuZCBudW1iZXIgb2YgY2hhbm5lbHMgZnJvbSB0aGUgU1RSRUFNSU5GTworCSAgLi4uYW5kIHVwZGF0ZSBpdCBmcm9tIHRoZSBmcmFtZSBoZWFkZXJzIGlmIGl0IHNob3VsZCBjaGFuZ2UgZm9yIHNvbWUgcmVhc29uLgorCSAgVGhpcyBhbGxvd3MgcGxheWJhY2sgb2YgZmlsZXMgd2l0aCBvZGQgc2FtcGxlIHJhdGVzLgorCisyMDEwLTAzLTI2IDEzOjQ1OjQ2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogRml4IEFZVVYtPkk0MjAgZnJhbWUgY29weWluZworCisyMDEwLTAzLTI2IDEzOjM0OjE3ICswMTAwICBSYWltbyBKw6RydmkgPHJhaW1vLmphcnZpQGdtYWlsLmNvbT4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAganBlZ2VuYzogU2V0IGNvcnJlY3QgZ2V0Y2Fwcy9zZXRjYXBzIGZ1bmN0aW9ucyBvbiBzcmNwYWRzIGFuZCBzaW1wbGlmeSB0aGVtCisJICBUaGlzIGZpeGVzIGRvd25zdHJlYW0gbmVnb3RpYXRpb24sIHVwc3RyZWFtIG5lZ290aWF0aW9uIGlzbid0IHJlYWxseQorCSAgc3VwcG9ydGVkIGJ5IGpwZWdlbmMgeWV0LgorCSAgRml4ZXMgYnVnICM2MTM3ODkuCisKKzIwMTAtMDMtMjYgMTA6MzE6MjIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5oOgorCSAgdmlkZW9ib3g6IEFsd2F5cyBmaWxsIHRoZSBjb21wbGV0ZSBmcmFtZSBpZiBib3JkZXJzIHNob3VsZCBiZSBhZGRlZAorCSAgVGhpcyBtYWtlcyBzdXJlIHRoYXQgd2UgZG9uJ3QgZ2V0IGFueSBnYXBzIGJldHdlZW4gcmVjdGFuZ2xlcyBiZWNhdXNlCisJICBvZiBjaHJvbWEgc3Vic2FtcGxpbmcgZm9yIGV4YW1wbGUuCisKKzIwMTAtMDMtMTggMjI6MTI6NDAgKzAwMDAgIERhbWllbiBMZXNwaWF1IDxkYW1pZW4ubGVzcGlhdUBpbnRlbC5jb20+CisKKwkqIGF1dG9nZW4uc2g6CisJICBhdXRvZ2VuLnNoOiBEb24ndCBjYWxsIGNvbmZpZ3VyZSB3aXRoIC0tZW5hYmxlLXBsdWdpbi1kb2NzCisJICBjb25maWd1cmUgZ2l2ZXMgYSBuaWNlIHdhcm5pbmc6CisJICBjb25maWd1cmU6IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAtLWVuYWJsZS1wbHVnaW4tZG9jcworCSAgYW5kIGluZGVlZCwgSSBjb3VsZCBub3QgZmluZCBhbnl0aGluZyBpbiB0aGUgY29uZmlndXJlLmFjIG9yIHRoZSBtNAorCSAgbWFjcm9zIHRoYXQgd291bGQgYWxsb3cgZW5hYmxpbmcgdGhhdCBvcHRpb24uIFJlbW92ZSBpdCB0aGVuLgorCisyMDEwLTAzLTIyIDE2OjU4OjI2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guaDoKKwkgIHZpZGVvYm94OiBSZWZhY3RvciBib3hpbmcgdG8gcmVkdWNlIGNvZGUgZHVwbGljYXRpb24KKworMjAxMC0wMy0yMiAxMzoxMzo1OSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IFNpbXBsaWZ5IGNhcHMgdHJhbnNmb3JtYXRpb24KKworMjAxMC0wMy0yMSAyMDoxNDoxOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IEFkZCBjb25zdCBxdWFsaWZpZXIgdG8gdGhlIHNvdXJjZSBmcmFtZSBkYXRhCisKKzIwMTAtMDMtMjMgMTc6NDc6NDggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IG9ubHkgc2VlayB3aGVuIGluIHByb3BlciBzdGF0ZQorCSAgLi4uIGFuZCBkYXRhIHN0cnVjdHVyZXMgY2FuIGJlIHRocmVhZC1zYWZlbHkgYWNjZXNzZWQuCisJICBTZWUgIzYwMTYxNy4KKworMjAxMC0wMy0yMyAxNzozNDo1MCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBtYXRyb3NrYWRlbXV4OiBzdXBwb3J0IChwdWxsIG1vZGUpIG5lZ2F0aXZlIHNlZWsgcmF0ZQorCisyMDEwLTAzLTE4IDE1OjI5OjAwICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkgIG1hdHJvc2thZGVtdXg6IHRyYWNrIGNsaXAgZHVyYXRpb24gaW4gc2VnbWVudAorCisyMDEwLTAzLTE4IDEzOjM5OjA1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBwcmVmZXIgaW5kZXggb2YgdmlkZW8gdHJhY2sgdG8gcGVyZm9ybSBzZWVraW5nCisKKzIwMTAtMDMtMjUgMjI6NTg6NDcgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZmRldGVjdC5jOgorCSAgZHRtZmRldGVjdDogaWYgd2UgdGVsbCB0aGF0IHdlIGhhbmRsZSBnYXAgZmxhZ3MsIHRoZW4gZG8gc28KKworMjAxMC0wMy0yNSAyMjo1NTozMiArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZHRtZi9nc3RkdG1mZGV0ZWN0LmM6CisJICBkdG1mZGV0ZWN0OiB1c2UgZ2xpYiB0eXBlcworCisyMDEwLTAzLTI1IDIyOjU0OjQ5ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZkZXRlY3QuYzoKKwkgIGR0bWZkZXRlY3Q6IGZpeCBjbGFzc2lmaWNhdGlvbgorCisyMDEwLTAzLTI1IDIyOjUzOjIwICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZkZXRlY3QuYzoKKwkgIGR0bWZkZXRlY3Q6IHJlZm9ybWF0IG1lc3NhZ2UgZG9jcworCSAgVXNlIGEgbGlzdCBsaWtlIGluIG90aGVyIGVsZW1lbnQgZG9jcyBhcyBhbiB1bnR3ZWFrZWQgZG9jYm9vayB0YWJsZSBsb29rIHVnbHkuCisKKzIwMTAtMDMtMjQgMTY6MTk6NTMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZml4IHR5cG8gaW4gaGVhZGVyIHZhbGlkYXRpb24gY2hlY2sKKworMjAxMC0wMy0yNCAxODo1MzoyMCArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDU1Y2Q1MTQgdG8gYzFkMDdkZAorCisyMDEwLTAzLTIzIDE5OjQ2OjQzICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzoKKwkqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5oOgorCSAgaWN5ZGVtdXg6IEhhbmRsZSB1cHN0cmVhbSBDb250ZW50LVR5cGUuCisJICBBbGxvd3MgdXMgdG8gaGFuZGxlIFNob3V0Q2FzdCBUViAoTlNWKSBzdHJlYW1zLgorCSAgSWYgdGhlIHVwc3RyZWFtIGNhcHMgaGF2ZSB0aGUgJ2NvbnRlbnQtdHlwZScgZmllbGQgc2V0IHRvIHZpZGVvL25zdiwgdGhlbgorCSAgd2Ugc2hvcnRjdXQgdGhlIHR5cGVmaW5kaW5nIGFuZCBzZXQgdmlkZW8veC1uc3YgZGlyZWN0bHkuCisKKzIwMTAtMDMtMjMgMTk6MzA6NTAgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogU2V0IHRoZSBDb250ZW50LVR5cGUgSFRUUCBoZWFkZXIgb24gdGhlIGNhcHMuCisJICBGaXJzdCBzdGVwIHRvIGZpeGluZyBTaG91dENhc3QgKE5TVikgc3RyZWFtaW5nLgorCisyMDEwLTAzLTIzIDAyOjM4OjQzIC0wNDAwICBUcmlzdGFuIE1hdHRoZXdzIDx0cmlzdGFuQHNhdC5xYy5jYT4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvZWxlbWVudC5jOgorCSogc3lzL29zeHZpZGVvL01ha2VmaWxlLmFtOgorCSAgb3N4OiBmaXggY29tcGlsZXIgd2FybmluZ3MKKwkgIEFkZGVkIHZvaWQgcGFyYW1ldGVyIHRvIGF2b2lkIG9sZC1zdHlsZSBkZWZpbml0aW9uIHdhcm5pbmcuCisJICBBZGRlZCAtV25vLWFnZ3JlZ2F0ZS1yZXR1cm4gZmxhZyB0byBhdm9pZCBlcnJvbmVvdXMgYWdncmVnYXRlIHJldHVybiB3YXJuaW5nLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxMzY2MworCisyMDEwLTAzLTIzIDAwOjE1OjE1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6CisJICB0ZXN0czogdXNlIGxvb3AgdGVzdCBmb3IgbG9uZy1ydW5uaW5nIHZpZGVvY3JvcCBjaGVjaworCSAgVGhpcyBzaG91bGQgYXZvaWQgdGltZW91dHMgb24gc2xvdyBtYWNoaW5lcy4KKwkgIEZpeGVzICM1OTc3MzkuCisKKzIwMTAtMDMtMjIgMTc6MjY6MzcgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhYy5jOgorCSogZXh0L3B1bHNlL3BsdWdpbi5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFjay5jOgorCSogZ3N0LWxpYnMvZ3N0L2dldHRleHQuaDoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oOgorCSAgaTE4bjogYnVpbGQgZml4ZXM6ICNpZiAtPiAjaWZkZWYgZm9yIEVOQUJMRV9OTFMKKworMjAxMC0wMy0yMiAxNzoyNTowOSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QtbGlicy9nc3QvZ3N0LWkxOG4tcGx1Z2luLmg6CisJICBpMThuOiBmaXggdGhlIGJ1aWxkCisJICBEb24ndCBpbmxjdWRlIGxvY2FsZS5oIHdoaWNoIHdlIGluY2x1ZGUgaW4gZ2V0dGV4dC5oIGlmIG5lZWRlZC4gR3VhcmQgdGhlCisJICBpbmxjdWRlIGxpa2Ugd2UgZG8gaW4gdGhlIHNpbWlsbGFyIGhlYWRlcnMgaW4gY29yZS4KKworMjAxMC0wMy0yMiAxMzoxNjozMyArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkgIEFkZCAtV3dyaXRlLXN0cmluZ3MKKwkgIGFuZCBmaXggaXRzIHdhcm5pbmdzCisKKzIwMTAtMDMtMjIgMTI6MDI6MTYgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgQWRkIC1XcmVkdW5kYW50LWRlY2xzIGZsYWcKKwkgIGFuZCBmaXggd2FybmluZ3MgZnJvbSBpdAorCisyMDEwLTAzLTIxIDIxOjM5OjE4ICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5oOgorCSAgQWRkIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVdtaXNzaW5nLXByb3RvdHlwZXMgdG8gY29uZmlndXJlIGZsYWdzCisJICBBbmQgZml4IGFsbCB3YXJuaW5ncworCisyMDEwLTAzLTIxIDE3OjQ2OjA2ICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIC1Xb2xkLXN0eWxlLWRlZmluaXRpb24gaXMgbm90IHZhbGlkIGZvciBDKysKKworMjAxMC0wMy0yMSAxNzozNjoyOCArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZS5jOgorCSAgbXVsdGlmaWxlOiBJbmNsdWRlIGhlYWRlcnMgaW5zdGVhZCBmbyBkZWZpbmluZyBmdW5jdGlvbnMKKworMjAxMC0wMy0yMSAxNzoyNDoxNCArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBBZGQgYSBsYXJnZSBzZXQgb2Ygd2FybmluZyBmbGFncy4KKwkgIE5vbmUgb2YgdGhlbSB0cmlnZ2VyIHdhcm5pbmdzIGFueW1vcmUsIHNvIG5vdGhpbmcgbmVlZGVkIHRvIGJlIGZpeGVkLgorCisyMDEwLTAzLTIxIDE3OjIzOjQzICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGdzdC9nb29tL2NvbmZpZ19wYXJhbS5jOgorCSogZ3N0L2dvb20vY29udm9sdmVfZnguYzoKKwkqIGdzdC9nb29tL2ZpbHRlcnMuYzoKKwkqIGdzdC9nb29tL2ZseWluZ19zdGFyc19meC5jOgorCSogZ3N0L2dvb20vZ29vbV9jb25maWdfcGFyYW0uaDoKKwkqIGdzdC9nb29tL2dvb21fY29yZS5jOgorCSogZ3N0L2dvb20vZ29vbV9maWx0ZXJzLmg6CisJKiBnc3QvZ29vbS9nb29tX2Z4Lmg6CisJKiBnc3QvZ29vbS9pZnMuYzoKKwkqIGdzdC9nb29tL2lmcy5oOgorCSogZ3N0L2dvb20vcGx1Z2luX2luZm8uYzoKKwkqIGdzdC9nb29tL3RlbnRhY2xlM2QuYzoKKwkqIGdzdC9nb29tL3RlbnRhY2xlM2QuaDoKKwkgIE1ha2UgZ29vbSBub3QgdXNlIGFnZ3JlZ2F0ZSByZXR1cm5zCisKKzIwMTAtMDMtMjEgMTU6MTc6NDYgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbHV0aWxzLmM6CisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxlbmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2xpbWl0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzaW5rLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2ZpbHRlci5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja2RlYy5jOgorCSogdGVzdHMvY2hlY2svZ2VuZXJpYy9zdGF0ZXMuYzoKKwkqIHRlc3RzL2ljbGVzL3Y0bDJzcmMtdGVzdC5jOgorCSAgQWRkIC1Xb2xkLXN0eWxlLWRlZmluaXRpb24gZmxhZworCSAgQW5kIGZpeCB0aGUgd2FybmluZ3MKKworMjAxMC0wMy0yMCAwMDo1NDoxNCArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvaGFsL2hhbC5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHB1c2hmaWxlc3JjLmM6CisJKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6CisJKiBnc3QvZ29vbS9jb25maWdfcGFyYW0uYzoKKwkqIGdzdC9nb29tL2dvb21fY29uZmlnX3BhcmFtLmg6CisJKiBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOgorCSogZ3N0L2xhdy9hbGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBzeXMvb3NzL2dzdG9zc21peGVydHJhY2suYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbl9idWZmZXJfbGlzdC5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMuYzoKKwkgIEFkZCAtV3dyaXRlLXN0cmluZ3MgdG8gdGhlIGNvbmZpZ3VyZSBmbGFncworCSAgLi4uIGFuZCBmaXggYWxsIHdhcm5pbmdzCisKKzIwMTAtMDMtMjEgMTE6MTQ6MTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSAgc2hhcGV3aXBlOiBBZGQgc3VwcG9ydCBmb3IgdGhlIHJlbWFpbmluZyBBUkdCIGZvcm1hdHMKKwkgIEFuZCBoYW5kbGUgQVlVViBsaWtlIEFSR0IsIHdlIG5lZWQgbm8gWVVWIHNwZWNpZmljIGhhbmRsaW5nLgorCisyMDEwLTAzLTIwIDIxOjMwOjU4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogQWRkIHN1cHBvcnQgZm9yIFJHQiBhbmQgeFJHQiBpbnB1dAorCisyMDEwLTAzLTIwIDIxOjEzOjIzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogQWRkIHN1cHBvcnQgZm9yIEFSR0IgaW5wdXQKKworMjAxMC0wMy0yMCAyMDo0NjoxOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IEFkZCBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIEFSR0Igb3V0cHV0CisKKzIwMTAtMDMtMjAgMTA6NDc6NDIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuaDoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX21teC5oOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogQWRkIHN1cHBvcnQgZm9yIEFCR1IgYW5kIFJHQkEKKwkgIE5vdyBhbGwgNCBBUkdCIHZhcmlhbnRzIGFyZSBzdXBwb3J0ZWQgYnkgdmlkZW9taXhlci4KKworMjAxMC0wMy0yMCAxMDoyNDo1NiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IE1vdmUgY2hyb21hIGtleWluZyBwYXJhbWV0ZXJzIGludG8gc3RhY2sgdmFyaWFibGVzIHRvIHByZXZlbnQgbXVsdGlwbGUgcG9pbnRlciBkZXJlZmVyZW5jZXMgcGVyIHBpeGVsCisKKzIwMTAtMDMtMjAgMTA6MjA6NTMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgIGFscGhhOiBNb3ZlIGNvbG9yIGNvbnZlcnNpb24gbWF0cml4ZXMgaW50byBzdGFjayB2YXJpYWJsZXMgdG8gc3BlZWQgdXAgcHJvY2Vzc2luZworCisyMDEwLTAzLTIwIDEwOjE4OjA0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogVXNlIGNvcnJlY3QgbWF0cml4ZXMgdG8gY29udmVydCBjaHJvbWEga2V5aW5nIGNvbG9yIHRvIFlVVgorCisyMDEwLTAzLTE5IDE4OjUxOjU5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogQWRkIHN1cHBvcnQgZm9yIGRpZmZlcmVudCBjb2xvciBtYXRyaXhlcworCisyMDEwLTAzLTE5IDE4OjIxOjE5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogUmVuYW1lIGFuZCBtb3ZlIGZ1bmN0aW9ucyBhcyBmdXJ0aGVyIHByZXBhcmF0aW9uIGZvciBzdXBwb3J0aW5nIG1vcmUgY29sb3IgZm9ybWF0cworCisyMDEwLTAzLTE5IDE4OjE4OjA4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuaDoKKwkgIGFscGhhOiBSZW1vdmUgc29tZSB1bm5lZWRlZCBjYWxjdWxhdGlvbnMgYW5kIGluc3RhbmNlIHN0cnVjdCBmaWVsZHMKKwkgIEFuZCBkb2N1bWVudCB0aGUgaW5zdGFuY2Ugc3RydWN0IGZpZWxkcyBhIGJpdCBiZXR0ZXIKKworMjAxMC0wMy0xOSAxODoxMToxMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmg6CisJICBhbHBoYTogU29tZSBwcmVwYXJhdGlvbnMgZm9yIHN1cHBvcnRpbmcgbW9yZSBjb2xvciBmb3JtYXRzCisKKzIwMTAtMDMtMTkgMTc6MDk6MDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgaDI2NHBheTogZml4IGNvbmZpZy1pbnRlcnZhbCBwcm9wZXJ0eQorCSAgVXNlIHRoZSBzYW1lIHVuaXRzIGZvciBjb21wYXJpbmcgdGhlIGVsYXBzZWQgdGltZSBhZ2FpbnN0IHRoZSBpbnRlcnZhbC4KKwkgIEZpeGVzICM2MTMwMTMKKworMjAxMC0wMy0xOSAxNjo0NDowMCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5oOgorCSAgYWxwaGFjb2xvcjogSW1wbGVtZW50IGNvbG9yLW1hdHJpeCBzdXBwb3J0IGFuZCB1c2UgaW50ZWdlciBhcml0aG1ldGljIG9ubHkKKwkgIEFscGhhY29sb3Igbm93IHVzZXMgdGhlIGNvcnJlY3QgbWF0cml4ZXMgZm9yIFNEVFYgYW5kIEhEVFYgYW5kIGNhbgorCSAgY29udmVydCBiZXR3ZWVuIHRoZW0uCisKKzIwMTAtMDMtMTkgMTU6MDM6NDMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3A6IHVzZSBHVHlwZSBmcm9tIC1iYXNlIGFuZCBidW1wIHJlcXVpcmVkIHZlcnNpb24KKwkgIFVzZSB0aGUgdHJhbnNwb3J0IGZsYWdzIEdUeXBlIGZyb20gLWJhc2UgYW5kIGJ1bXAgdGhlIHJlcXVpcmVkIHZlcnNpb24gb2YgLWJhc2UKKwkgIGJlY2F1c2Ugb2YgdGhpcy4KKworMjAxMC0wMy0xOSAwMDowNToxOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hcGV0YWcvTWFrZWZpbGUuYW06CisJICBhcGV0YWc6IG1pbm9yIE1ha2VmaWxlLmFtIHN1cmdlcnkKKwkgIC1JJCh0b3Bfc3JjZGlyKS9nc3QtbGlicy8gaXMgYWxyZWFkeSBpbiAkKEdTVF9DRkxBR1MpCisKKzIwMTAtMDMtMTggMTc6MzA6MjYgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZmRldGVjdC5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlscyA9PiBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUKKworMjAxMC0wMy0wNCAyMjoxMjozNSArMDEwMCAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDx5bGF0dXlhQGdtYWlsLmNvbT4KKworCSogZXh0L3JhdzEzOTQvZ3N0MTM5NGNsb2NrLmM6CisJICBkdjEzOTRzcmM6IEZpeCBpbnRlcm5hbCBjbG9jaworCSAgRml4ZXMgIzU5MzkxMC4KKworMjAxMC0wMy0xOCAyMToxNDoxNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9NYWtlZmlsZS5hbToKKwkqIGV4dC9lc2QvTWFrZWZpbGUuYW06CisJKiBleHQvbGliY2FjYS9NYWtlZmlsZS5hbToKKwkqIGV4dC9wdWxzZS9NYWtlZmlsZS5hbToKKwkqIGV4dC9zaG91dDIvTWFrZWZpbGUuYW06CisJKiBleHQvc3BlZXgvTWFrZWZpbGUuYW06CisJKiBleHQvd2F2cGFjay9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdXBhcnNlL01ha2VmaWxlLmFtOgorCSogZ3N0L2F2aS9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHgvTWFrZWZpbGUuYW06CisJKiBnc3QvaWN5ZGVtdXgvTWFrZWZpbGUuYW06CisJKiBnc3QvaW50ZXJsZWF2ZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9tYXRyb3NrYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9xdGRlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L3JlcGxheWdhaW4vTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3dhdnBhcnNlL01ha2VmaWxlLmFtOgorCSogc3lzL2RpcmVjdHNvdW5kL01ha2VmaWxlLmFtOgorCSogc3lzL29zcy9NYWtlZmlsZS5hbToKKwkqIHN5cy93YXZlZm9ybS9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvTWFrZWZpbGUuYW06CisJICBidWlsZDogTWFrZWZpbGUuYW0gY2xlYW51cHMKKwkgIE1vc3RseSBhZGQgJChHU1RfQkFTRV9DRkxBR1MpIHdoZXJlIGl0IHdhcyBtaXNzaW5nLCBidXQgYWxzbyBmaXggdXAKKwkgIG9yZGVyIG9mIGZsYWdzIGFuZCBsaWJzIGlmIG5lZWRlZCAoc2VlIGRvY3MvcmFuZG9tL21vdmluZy1wbHVnaW5zKS4KKworMjAxMC0wMy0xOCAxODo0OToyNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIGRpcmVjdHNvdW5kc2luazogZml4IHJlZHVuZGFudCBmdW5jdGlvbiByZWRlY2xhcmF0aW9uIGNvbXBpbGVyIHdhcm5pbmdzCisKKzIwMTAtMDMtMTggMTk6MDA6MDkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5oOgorCSAgYWxwaGE6IFJlbW92ZSByZW1haW5pbmcgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyB3aGVuIHByb2Nlc3NpbmcgYSBwaXhlbAorCisyMDEwLTAzLTE4IDE4OjU1OjM0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogUmVmYWN0b3IgY2hyb21hIGtleWluZyBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uCisJICBUaGlzIHJlZHVjZXMgY29kZSBkdXBsaWNhdGlvbiBvbmNlIHdlIGFkZCBzdXBwb3J0IGZvciBtb3JlIGNvbG9yIGZvcm1hdHMuCisKKzIwMTAtMDMtMTggMTQ6MzE6MzUgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOgorCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuYzoKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9lc2QvZXNkbW9uLmM6CisJKiBleHQvZXNkL2VzZHNpbmsuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOgorCSogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5jOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zcmMuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzoKKwkqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zaW5rLmM6CisJKiBleHQvaGFsL2dzdGhhbGF1ZGlvc3JjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvanBlZy9nc3RzbW9rZWRlYy5jOgorCSogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzoKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6CisJKiBleHQvbGlibW5nL2dzdG1uZy5oOgorCSogZXh0L2xpYm1uZy9nc3RtbmdkZWMuYzoKKwkqIGV4dC9saWJtbmcvZ3N0bW5nZW5jLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZy5oOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSogZ3N0L2RlYnVndXRpbHMvYnJlYWtteWRhdGEuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2VmZW5jZS5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2aWdhdGlvbnRlc3QuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdG5hdnNlZWsuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHB1c2hmaWxlc3JjLmM6CisJKiBnc3QvZGVidWd1dGlscy9uZWdvdGlhdGlvbi5jOgorCSogZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Rlc3RwbHVnaW4uYzoKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzoKKwkqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIGdzdC9tZWRpYW4vZ3N0bWVkaWFuLmM6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzoKKwkqIGdzdC9xdGRlbXV4L2dzdHJ0cHhxdGRlcGF5LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmM6CisJKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcWRtZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc2lyZW5kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3Bnb29nbGUuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlYWxwaGEuYzoKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW90ZW1wbGF0ZS5jOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkqIHN5cy9vc3MvZ3N0b3NzbWl4ZXJlbGVtZW50LmM6CisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1zaW5rLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X2RldGFpbHMgPT4gZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X2RldGFpbHNfc2ltcGxlCisKKzIwMTAtMDMtMTggMTQ6MDI6MzAgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZ3N0L29sZGNvcmUvTWFrZWZpbGUuYW06CisJKiBnc3Qvb2xkY29yZS9nc3RhZ2dyZWdhdG9yLmM6CisJKiBnc3Qvb2xkY29yZS9nc3RhZ2dyZWdhdG9yLmg6CisJKiBnc3Qvb2xkY29yZS9nc3RlbGVtZW50cy5jOgorCSogZ3N0L29sZGNvcmUvZ3N0ZmRzaW5rLmM6CisJKiBnc3Qvb2xkY29yZS9nc3RmZHNpbmsuaDoKKwkqIGdzdC9vbGRjb3JlL2dzdG1kNXNpbmsuYzoKKwkqIGdzdC9vbGRjb3JlL2dzdG1kNXNpbmsuaDoKKwkqIGdzdC9vbGRjb3JlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L29sZGNvcmUvZ3N0bXVsdGlmaWxlc3JjLmg6CisJKiBnc3Qvb2xkY29yZS9nc3RwaXBlZmlsdGVyLmM6CisJKiBnc3Qvb2xkY29yZS9nc3RwaXBlZmlsdGVyLmg6CisJKiBnc3Qvb2xkY29yZS9nc3RzaGFwZXIuYzoKKwkqIGdzdC9vbGRjb3JlL2dzdHNoYXBlci5oOgorCSogZ3N0L29sZGNvcmUvZ3N0c3RhdGlzdGljcy5jOgorCSogZ3N0L29sZGNvcmUvZ3N0c3RhdGlzdGljcy5oOgorCSAgUmVtb3ZlIG9sZGNvcmUgZGlyZWN0b3J5CisJICBUaGUgZWxlbWVudHMgaGF2ZSBiZWVuIHVudXNlZCBmb3IgYWdlcyBhbmQgYWxsIGltcG9ydGFudCBvbmVzIGhhdmUgYmVlbgorCSAgcmVwbGFjZWQgb3IgY29waWVkIGVsc2V3aGVyZS4KKworMjAxMC0wMy0xOCAxMzo0NTowOCArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlY29kZXIuYzoKKwkgIGF2aTogUmVtb3ZlIG9sZCBmaWxlCisJICBTZWVtcyB0byBiZSBsZWZ0b3ZlciBmcm9tIHRoZSAwLjQgZGF5cyBvciBzby4KKworMjAxMC0wMy0xOCAxMjo0NDo1MyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSAgcHVsc2U6IHVzZSAjaWZkZWYgcmF0aGVyIHRoYW4gI2lmIGNvbmRpdGlvbmFscworCisyMDEwLTAzLTE4IDEyOjIwOjE3ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIHJ0cGgyNjRkZXBheTogZG8gbm90IGNhbGwgX3B1c2hfdHMgd2l0aCB1bm5lZWRlZCAoYW5kIHdyb25nKSB0aW1lIHBhcmFtZXRlcgorCSAgRml4ZXMgIzYxMzIwNi4KKworMjAxMC0wMy0xOCAxMTozMzo1OSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggdHlwbyBpbiBoZWFkZXIgdmFsaWRhdGlvbiBjaGVjaworCisyMDEwLTAzLTE4IDAxOjUxOjE5ICswMTAwICBKYW4gVXJiYcWEc2tpIDx3dWxjemVyQHd1bGN6ZXIub3JnPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBwdXQgbW9yZSBpbmZvcm1hdGlvbiBpbiB0aGUgbWV0YWRhdGEKKwkgIEFkZGl0aW9uYWwgdGFncyBhcmU6IGF1ZGlvY29kZWNpZCwgdmlkZW9jb2RlY2lkIGZyYW1lcmF0ZSBhbmQgKGluIHRoZQorCSAgbm9uLWxpdmUgY2FzZSkgZmlsZXNpemUuCisJICBXaGlsZSBhdCBpdCwgZml4IGluZGV4IHJld3JpdGluZyB0byB1cGRhdGUgZHVyYXRpb24gYW5kIGZpbGVzaXplCisJICB2YWx1ZXMgZXZlbiBpZiB0aGUgaW5kZXggaXMgZW1wdHkuCisJICBGaXhlcyAjNjEzMDk0LgorCisyMDEwLTAzLTE3IDIxOjMzOjI4ICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5oOgorCSogZ3N0L2dvb20vZ29vbV9jb25maWcuaDoKKwkqIGdzdC9nb29tL21hdGh0b29scy5oOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkgIEFkZCAtV3VuZGVmIHRvIGNvbmZpZ3VyZSBmbGFncworCSAgYW5kIGZpeCB0aGUgcmVzdWx0aW5nIHdhcm5pbmdzCisKKzIwMTAtMDMtMTcgMjA6MDI6MTYgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgLVdtaXNzaW5nLXByb3RvdHlwZXMgaXMgbm90IHZhbGlkIGZvciBDKysKKworMjAxMC0wMy0xNyAxOTozNToxMCArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6CisJKiBleHQvanBlZy9nc3RqcGVnLmg6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6CisJKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICBBZGQgLVdyZWR1bmRhbnQtZGVjbHMgd2FybmluZyBmbGFnCisJICBBbHNvIGZpeCBjb21waWxlIGlzc3VlcworCisyMDEwLTAzLTE3IDE4OjQ5OjExICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmg6CisJICBGaXggd2FybmluZ3MgaW4gZXhwZXJpbWVudGFsIHBsdWdpbnMsIHRvbworCisyMDEwLTAzLTE3IDE4OjIzOjAwICswMTAwICBCZW5qYW1pbiBPdHRlIDxvdHRlQHJlZGhhdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGFubm9kZXguYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuaDoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxlbmMuaDoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWxwYXJzZXIuYzoKKwkqIGV4dC9hbm5vZGV4L2dzdGNtbWx1dGlscy5jOgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmg6CisJKiBleHQvanBlZy9NYWtlZmlsZS5hbToKKwkqIGV4dC9qcGVnL2dzdGpwZWcuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWcuaDoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuaDoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2JyZWFrbXlkYXRhLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZzZWVrLmM6CisJKiBnc3QvZGVidWd1dGlscy9ybmRidWZmZXJzaXplLmM6CisJKiBnc3QvZGVidWd1dGlscy90ZXN0cGx1Z2luLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYXNtOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL21teC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwuaW5jOgorCSogZ3N0L2dvb20vZ29vbV9meC5oOgorCSogZ3N0L2dvb20yazEvZmlsdGVycy5jOgorCSogZ3N0L2dvb20yazEvZmlsdGVycy5oOgorCSogZ3N0L2xhdy9tdWxhdy1jb252ZXJzaW9uLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4Lmg6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguaDoKKwkqIGdzdC9xdGRlbXV4L2dzdHJ0cHhxdGRlcGF5LmM6CisJKiBnc3QvcnRwL2ZudjFoYXNoLmM6CisJKiBnc3QvcnRwL2ZudjFoYXNoLmg6CisJKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5oOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGoya2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuaDoKKwkqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3NtcHRlL2dzdG1hc2suYzoKKwkqIGdzdC9zbXB0ZS9nc3RtYXNrLmg6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guaDoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmg6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuaDoKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydmlkb3JpZW50Lmg6CisJKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FzcGVjdHJhdGlvY3JvcC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9hbXBsaWZ5LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJiYW5kLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJsaW1pdC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9keW5hbWljLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2VjaG8uYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvaW52ZXJ0LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3Bhbm9yYW1hLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jYmFuZC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW93c2luY2xpbWl0LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdmltdXguYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aXN1YnRpdGxlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZGVjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9lcXVhbGl6ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsdGlmaWxlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2xpbWl0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3Jndm9sdW1lLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zaGFwZXdpcGUuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zcGVjdHJ1bS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9maWx0ZXIuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tkZWMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tlbmMuYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2twYXJzZS5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMveTRtZW5jLmM6CisJKiB0ZXN0cy9jaGVjay9nZW5lcmljL3N0YXRlcy5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMuYzoKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZwYWNrLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jOgorCSogdGVzdHMvZXhhbXBsZXMvbGV2ZWwvbGV2ZWwtZXhhbXBsZS5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vc3BlY3RydW0tZXhhbXBsZS5jOgorCSogdGVzdHMvaWNsZXMvdjRsMnNyYy10ZXN0LmM6CisJICBBZGQgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV21pc3NpbmctcHJvdG90eXBlcyB3YXJuaW5nIGZsYWdzCisJICBBbmQgZml4IGFsbCB0aGUgd2FybmluZ3MuCisKKzIwMTAtMDMtMTcgMTY6MjM6MjQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJICBtcDRnZGVwYXk6IGltcHJvdmUgY29uc3RhbnREdXJhdGlvbiBndWVzc2luZworCSAgV2hlbiBubyBjb25zdGFudER1cmF0aW9uIGhhcyBiZWVuIGdpdmVuIGluIHRoZSBjYXBzLCB0cnkgdG8gZGVyaXZlIG9uZSBmcm9tIHRoZQorCSAgdGltZXN0YW1wIGRpZmZlcmVuY2UgYmV0d2VlbiBwYWNrZXRzLiBBbHNvIGtlZXAgZG9pbmcgdGhpcyBmb3IgZWFjaCBwYWNrZXQKKwkgIGJlY2F1c2Ugc29tZSBicm9rZW4gc3RyZWFtcyBtaWdodCBzaW1wbHkgcHJvdmlkZSB3cm9uZyB0aW1lc3RhbXBzLgorCisyMDEwLTAzLTE2IDIzOjQzOjM5ICswMTAwICBKYW4gVXJiYcWEc2tpIDx3dWxjemVyQHd1bGN6ZXIub3JnPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBQdXQgd2lkdGggYW5kIGhlaWdodCBpbiB0aGUgbWV0YWRhdGEKKwkgIFNvbWUgcGxheWVycyB1c2UgdGhhdCBpbmZvIHRvIHNjYWxlIHRoZWlyIGRpc3BsYXkuCisJICBTZWUgIzYxMzA5NC4KKworMjAxMC0wMy0xNiAyMzozMjo0NSArMDEwMCAgSmFuIFVyYmHFhHNraSA8d3VsY3plckB3dWxjemVyLm9yZz4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogZG9uJ3QgcHV0IHRpbWVzdGFtcHMgbGFyZ2VyIHRoYW4gR19NQVhJTlQzMiBpbiB0aGUgRkxWIHRhZ3MKKwkgIEZvciBub24tbGl2ZSBpbnB1dCByZXNwb25kIGJ5IHB1c2hpbmcgRU9TLCBmb3IgbGl2ZSB3cmFwIHRoZQorCSAgdGltZXN0YW1wcyBldmVyeSBHX01BWElOVDMyIG1pbGlzZWNvbmRzLgorCSAgRml4ZXMgIzYxMzAwMy4KKworMjAxMC0wMy0xNiAyMzo0MDoxMiArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cDogYWxzbyB1c2UgZ192YWx1ZV9zZXRfc3RhdGljX3N0cmluZygpIGhlcmUgZm9yIHN0YXRpYyBzdHJpbmdzCisKKzIwMTAtMDMtMTYgMjE6MjM6MTEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSAgYWxwaGFjb2xvcjogRml4IFJHQkE8LT5BWVVWIGNvbnZlcnNpb24KKworMjAxMC0wMy0xNiAyMToxNjoyNiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmg6CisJICBhbHBoYTogUmVtb3ZlIHJlZHVuZGFudCBpbnN0YW5jZSBmaWVsZAorCisyMDEwLTAzLTE2IDIxOjEwOjA4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICBhbHBoYTogUHJvdGVjdCBwcm9wZXJ0eSB2YWx1ZXMgZnJvbSBjaGFuZ2VzIGR1cmluZyBmcmFtZSBwcm9jZXNzaW5nCisKKzIwMTAtMDMtMTUgMjM6Mjk6NTUgKzAzMDAgINCg0YPRgdC70LDQvSDQmNC20LHRg9C70LDRgtC+0LIgPGxybjE5ODZAZ21haWwuY29tPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgcG5nZW5jOiBVc2UgcG5nX2dldF9pb19wdHIoKSBpbnN0ZWFkIG9mIGFjY2Vzc2luZyBpb19wdHIgZGlyZWN0bHkKKwkgIEZpeGVzICM2MTI3MDAgKGZvciB0aGUgbGFzdCB0aW1lISkKKworMjAxMC0wMy0xNSAyMzoyOTowNiArMDMwMCAg0KDRg9GB0LvQsNC9INCY0LbQsdGD0LvQsNGC0L7QsiA8bHJuMTk4NkBnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIHBuZzogQ2hlY2sgZm9yIGxpYnBuZyA+PSAxLjIgaW5zdGVhZCBvZiBsaWJwbmcxMgorCisyMDEwLTAzLTE2IDAxOjI5OjM2ICswMTAwICBKYW4gVXJiYcWEc2tpIDx3dWxjemVyQHd1bGN6ZXIub3JnPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguaDoKKwkgIGZsdm11eDogQWx3YXlzIHB1dCBhIGR1cmF0aW9uIHRhZyBpbiB0aGUgbWV0YWRhdGEKKwkgIFNvbWUgRmxhc2ggcGxheWVycyAoZm9yIGluc3RhbmNlIEpXIFBsYXllcikgYWx3YXlzIGV4cGVjdCBhIGR1cmF0aW9uCisJICB0YWcsIG90aGVyd2lzZSB0aGV5IGRvbid0IHN0YXJ0IHBsYXliYWNrLgorCSAgSWYgZHVyYXRpb24gY2FuIGJlIHF1ZXJpZWQgZnJvbSB0aGUgc2luayBwYWRzIG9yIGlzIHByb3ZpZGVkIGFzIGEgdGFnLAorCSAgdXNlIGl0LiBPdGhlcndpc2UgdHJ5IHRvIGRldGVybWluZSBpdCBmcm9tIHRoZSBsYXN0IHNlZW4gdGltZXN0YW1wIG9mCisJICB0aGUgc2luayBwYWRzIGFmdGVyIEVPUyBhbmQgcmV3cml0ZSBpdCBpbiB0aGUgaGVhZGVyIGJlZm9yZSB3cml0aW5nCisJICB0aGUgaW5kZXguCisKKzIwMTAtMDMtMTYgMDA6MzU6NDYgKzAxMDAgIEphbiBVcmJhxYRza2kgPHd1bGN6ZXJAd3VsY3plci5vcmc+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5oOgorCSAgZmx2bXV4OiBSZW1vdmUgdGhlIHNlbmRfY29kZWNfZGF0YSBmaWVsZCBmcm9tIEdzdEZsdlBhZAorCSAgVGhhdCBmaWVsZCBpcyBub3QgdXNlZCBhbnltb3JlIGFmdGVyIHRoZSBjaGFuZ2VzIGluCisJICA5ZmRlY2JjMWMxMWY0ZTVhZjY1NzhiYmEzMmE5YjMyNzcxMDI5ZDMzLgorCisyMDEwLTAzLTE2IDEzOjUzOjI2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgbXVsdGl1ZHBzaW5rOiBnZXQgZmFtaWx5IG9mIGV4dGVybmFsIHNvY2tldHMgdG9vCisJICBHZXQgdGhlIGZhbWlseSBvZiBleHRlcm5hbGx5IGNvbmZpZ3VyZWQgc29ja2V0cyBzbyB0aGF0IHdlIGNhbiBjb25maWd1cmUgaXQKKwkgIGNvcnJlY3RseS4KKworMjAxMC0wMy0xNSAyMDozNzo1MSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJICBhbHBoYWNvbG9yOiBBZGQgc3VwcG9ydCBmb3IgdGhlIHJlbWFpbmluZyBBUkdCIGZvcm1hdHMKKworMjAxMC0wMy0xNSAxOToxNjoxOCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJICBhbHBoYWNvbG9yOiBTaW1wbGlmeSBBUkdCPC0+QVlVViBjb252ZXJzaW9ucyBieSBjb2RlIGdlbmVyYXRpb24gbWFjcm9zCisKKzIwMTAtMDMtMTUgMTk6MDc6MjggKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBnc3QvYWxwaGEvTWFrZWZpbGUuYW06CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5oOgorCSAgYWxwaGE6IE1pbm9yIGNsZWFudXBzIGFuZCBtb3ZlIGRlY2xhcmF0aW9ucyBpbnRvIGEgc2VwYXJhdGUgaGVhZGVyIGZpbGUKKworMjAxMC0wMy0xNSAxODo1ODo1MSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgYWxwaGE6IFVzZSBHc3RWaWRlb0ZpbHRlciBhcyBiYXNlIGNsYXNzIGZvciBhdXRvbWF0aWMgUW9TIHN1cHBvcnQKKworMjAxMC0wMy0xNSAxODo1MDoxMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5oOgorCSAgYWxwaGFjb2xvcjogQWRkIHN1cHBvcnQgZm9yIGlucGxhY2UgY29udmVyc2lvbnMgZnJvbSBBWVVWIHRvIEFSR0IKKworMjAxMC0wMy0xNSAxODoxNDoxOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5oOgorCSAgYWxwaGFjb2xvcjogVXNlIGxpYmdzdHZpZGVvIGZvciBjYXBzIHBhcnNpbmcKKworMjAxMC0wMy0xNSAxODowOTo1NSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hbHBoYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5oOgorCSAgYWxwaGFjb2xvcjogVXNlIEdzdFZpZGVvRmlsdGVyIGFzIGJhc2UgY2xhc3MgZm9yIGF1dG9tYXRpYyBRb1Mgc3VwcG9ydAorCisyMDEwLTAzLTE1IDE4OjA3OjI5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkgIGFscGhhY29sb3I6IFNvbWUgbWlub3IgY2xlYW51cAorCisyMDEwLTAzLTE1IDE0OjE2OjU4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuaDoKKwkgIHNwZWV4ZGVjOiBVc2Ugc3BlZXhfc3RlcmVvX3N0YXRlX2luaXQoKSBpbnN0ZWFkIG9mIHRoZSBkZXByZWNhdGVkIGluaXRpYWxpemF0aW9uIG1hY3JvCisJICBGaXhlcyBidWcgIzYxMjc3Ny4KKworMjAxMC0wMy0xNSAwMTowOTo0OSArMDEwMCAgSmFuIFVyYmHFhHNraSA8d3VsY3plckB3dWxjemVyLm9yZz4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogQ29ycmVjdGx5IG1hcmsgYnVmZmVycyBhcyBkZWx0YSB1bml0cworCSAgTWFyayB2aWRlbyBpbnRlcmZyYW1lcywgdmlkZW8gY29kZWMgZGF0YSBidWZmZXJzIGFuZCBhdWRpbyBidWZmZXJzIChpZgorCSAgaXQncyBub3QgYW4gYXVkaW8tb25seSBzdHJlYW0pIGFzIGRlbHRhIHVuaXRzLgorCisyMDEwLTAzLTE0IDE5OjMyOjIwICswMTAwICBKYW4gVXJiYcWEc2tpIDx3dWxjemVyQHd1bGN6ZXIub3JnPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBTdXBwb3J0IHN0cmVhbWhlYWRlcnMKKwkgIFB1dCB0aGUgRkxWIGhlYWRlciwgdGhlIG1ldGFkYXRhIHRhZyBhbmQgKGlmIHByZXNlbnQpIGNvZGVjCisJICBpbmZvcm1hdGlvbiBpbiB0aGUgc3RyZWFtaGVhZGVyIHRvIGFsbG93IHRoZSBtdXhlciB0byBiZSB1c2VkIGZvcgorCSAgc3RyZWFtaW5nLgorCisyMDEwLTAzLTE0IDAxOjM4OjIxICswMTAwICBKYW4gVXJiYcWEc2tpIDx3dWxjemVyQHd1bGN6ZXIub3JnPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBQcmVhbGxvY2F0ZSBpbmRleCBzcGFjZSBhbmQgZmlsbCBpdCBhZnRlciBmaW5pc2hpbmcgb3V0cHV0CisJICBNYWtlIHRoZSBpbmRleCBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSwgd2hpY2ggaXMgd2hhdCBtb3N0CisJICBwbGF5ZXJzIGFyZSBleHBlY3RpbmcuCisJICBGaXhlcyAjNjAxMjM2LgorCisyMDEwLTAzLTE1IDEzOjQ3OjEzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogTWlub3IgY29kaW5nIHN0eWxlIGZpeGVzIGFuZCBjbGVhbnVwCisKKzIwMTAtMDMtMTQgMDE6MzQ6MDIgKzAxMDAgIEphbiBVcmJhxYRza2kgPHd1bGN6ZXJAd3VsY3plci5vcmc+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5oOgorCSAgZmx2bXV4OiBBZGQgYSBpcy1saXZlIHByb3BlcnR5CisJICBJZiBpdCBpcyBzZXQsIHRoZSBtdXhlciB3aWxsIG5vdCB3cml0ZSB0aGUgaW5kZXguIERlZmF1bHRzIHRvIGZhbHNlLgorCisyMDEwLTAzLTE0IDAxOjI1OjQyICswMTAwICBKYW4gVXJiYcWEc2tpIDx3dWxjemVyQHd1bGN6ZXIub3JnPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBPbmx5IHB1dCB2YWxpZCBzZWVrIHBvaW50cyBpbiB0aGUgaW5kZXgKKwkgIEZvciBmaWxlcyBjb250YWluaW5nIHZpZGVvIG9ubHkgdmlkZW8ga2V5ZnJhbWVzIGFyZSB2YWxpZCBwb2ludHMgdG8KKwkgIHdoaWNoIGEgcGxheWVyIGNhbiBzZWVrLiBGb3IgYXVkaW8tb25seSBmaWxlcyBhbnkgdGFnIHN0YXJ0IGlzIGEgdmFsaWQKKwkgIHNlZWsgcG9pbnQuCisJICBTZWUgIzYwMTIzNi4KKworMjAxMC0wMy0xNCAwMTowOTozNyArMDEwMCAgSmFuIFVyYmHFhHNraSA8d3VsY3plckB3dWxjemVyLm9yZz4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogRml4IGluZGV4IGJ1aWxkaW5nIHRvIG1ha2UgZW50cmllcyBwb2ludCB0byB0YWcncyBzdGFydCBvZmZzZXQKKwkgIFByZXZpb3VzIGNvZGluZyB3YXMgd3JvbmdseSBpbmNyZW1lbnRpbmcgdGhlIHRvdGFsIGJ5dGUgY291bnQgYmVmb3JlCisJICBhZGRpbmcgYW4gaW5kZXggZW50cnkuCisKKzIwMTAtMDMtMTUgMTM6NDA6MzggKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzoKKwkgIGNhaXJvdGV4dG92ZXJsYXk6IERvbid0IHJlbmRlciB0ZXh0IG91dHNpZGUgdGhlIGZyYW1lIGJvdW5kYXJpZXMKKwkgIEZpeGVzIGJ1ZyAjNjExOTg2LgorCisyMDEwLTAzLTE1IDExOjM4OjIzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBkb24ndCBmb3JnZXQgdG8gc2VuZCBrZWVwYWxpdmUgbWVzc2FnZXMKKwkgIFdoZW4gd2Ugb3BlcmF0ZSBpbiBUQ1AgbW9kZSwgc3RpbGwgc2VuZCBrZWVwYWxpdmUgbWVzc2FnZXMgd2hlbiB3ZQorCSAgbmVlZCB0by4KKwkgIEZpeGVzICM2MTI2OTYKKworMjAxMC0wMy0xMyAyMzoxOTozNSArMDMwMCAg0KDRg9GB0LvQsNC9INCY0LbQsdGD0LvQsNGC0L7QsiA8bHJuMTk4NkBnbWFpbC5jb20+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJICBwbmdlbmM6IENhbGwgcG5nX2ptcGJ1ZigpIGluc3RlYWQgb2YgYWNjZXNzaW5nIHBuZ19zdHJ1Y3RfcHRyIGRpcmVjdGx5CisJICBGaXhlcyAjNjEyNzAwIChhZ2FpbikKKworMjAxMC0wMy0xMiAxNjo0NDozMCArMDMwMCAg0KDRg9GB0LvQsNC9INCY0LbQsdGD0LvQsNGC0L7QsiA8bHJuMTk4NkBnbWFpbC5jb20+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJICBwbmdlbmM6IENhbGwgcG5nX2Vycm9yKCkgaW5zdGVhZCBvZiB1c2luZyBsb25nam1wKCkgZGlyZWN0bHkuCisJICBGaXhlcyAjNjEyNzAwCisKKzIwMTAtMDMtMTIgMTM6NTc6MjggKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBlMjcyZjcxIHRvIDU1Y2Q1MTQKKworMjAxMC0wMy0wNSAxMTowNjo0NyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZm91cmNjLmg6CisJICBxdGRlbXV4OiBhZGQgWE1QIHBhcnNpbmcgc3VwcG9ydAorCSAgVXNlIHhtcCBoZWxwZXJzIHRvIHBhcnNlIFhNUCBtZXRhZGF0YSBpbiB1ZHRhIGF0b20uCisJICBGaXhlcyAjNjA5NTM5CisKKzIwMTAtMDMtMTEgMTI6MzI6NTYgLTA4MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEBzb25nYmlyZG5lc3QuY29tPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5oOgorCSAgdWRwOiBmaXggY29tcGlsYXRpb24gZXJyb3JzIG9uIG5vbi13aW5kb3dzLgorCisyMDEwLTAzLTEwIDIyOjIzOjQzICswMTAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPHlsYXR1eWFAZ21haWwuY29tPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaDoKKwkgIG11bHRpdWRwc2luazogYXZvaWQgZ2V0dGluZyB0aGUgc29ja2V0IGZhbWlseSB1c2luZyBnZXRzb2NrbmFtZSgpCisKKzIwMTAtMDMtMTEgMTc6Mjg6NDcgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBwcmludCBzdGF0ZW1lbnRzIGZvciBwb2ludGVyIGRpZmZlcmVuY2VzLgorCSAgVGhpcyBmaXhlcyBpdCBmb3IgYm90aCAzMiBhbmQgNjQgYml0CisKKzIwMTAtMDMtMTEgMTc6Mjg6MzUgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCB1bml0aWFsaXplZCB2YXJpYWJsZXMKKworMjAxMC0wMy0xMSAxNzowMzo0NyArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IEZpeCBwcmludGYgZm9ybWF0dGluZyBmb3IgbWFjb3N4CisKKzIwMTAtMDMtMTEgMTc6MDM6MDUgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBGaXggdW5pdGlhbGl6ZWQgdmFyaWFibGVzCisKKzIwMTAtMDMtMTEgMTc6MDI6NDQgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBGaXggdW5pdGlhbGl6ZWQgdmFyaWFibGUuCisKKzIwMTAtMDItMTkgMTM6Mzk6MDQgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdnBhcnNlOiBNYWtlIHNjcmlwdCB0YWcgcGFyc2luZyBtb3JlIGZsZXhpYmxlLgorCSAgKiBUaGUgbmJfZWxlbWVudHMgZm9yIGFycmF5cyBpcyBqdXN0IGFuIGluZGljYXRpb24sIHdlIGNhbiB0aGVyZWZvcmUgaWdub3JlCisJICBpdCBhbmQgY2Fycnkgb24gcGFyc2luZyBtZXRhZGF0YSBpdGVtcyB1bnRpbCB3ZSByZWFjaCB0aGUgZW5kIG1hcmtlci4KKwkgICogSWYgdHlwZSA9PSAzLCB0aGVuIHRoZSBzY3JpcHQgdGFnIGNvbnRhaW5zIGEgbGlzdCBvZiBvYmplY3QgZm9sbG93ZWQKKwkgIGJ5IHRoZSBlbmQgbWFya2VyLgorCSAgUmVmYWN0b3IgY29kZSBzbGlnaHRseSB0byBoYW5kbGUgYm90aCBjYXNlcworCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxMDQ0NworCisyMDEwLTAzLTExIDE1OjUxOjQwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZGVpbnRlcmxlYXZlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmM6CisJICB0ZXN0czogZml4IG1ldGFkYXRhIG5vdCB3cml0YWJsZSB3YXJuaW5ncyBpbiBpbnRlcmxlYXZlIGFuZCBkZWludGVybGVhdmUgdGVzdHMKKworMjAxMC0wMy0xMSAxNTozODoxOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FwZXYybXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jOgorCSAgdGVzdHM6IGZpeCBtZXRhZGF0YSBub3Qgd3JpdGFibGUgd2FybmluZ3Mgd2l0aCBhcGV2Mm11eCBhbmQgaWQzdjJtdXggdGVzdHMKKworMjAxMC0wMy0xMSAxNToyNDoyMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogZml4IG1ldGFkYXRhIHdyaXRhYmxlIHdhcm5pbmdzCisJICBTZXQgbWV0YWRhdGEgb24gYnVmZmVyIGZpcnN0LCB3aGVuIHRoZSByZWZjb3VudCBpcyBzdGlsbCAxLCBhbmQgb25seQorCSAgcmVmIGFnYWluIGFmdGVyd2FyZHMuCisKKzIwMTAtMDMtMTEgMTU6MDI6NDggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogaWdub3JlIHN0cmVhbSB3aXRoIGludmFsaWQgaGVhZGVyIHRpbWUgbWV0YWRhdGEKKworMjAxMC0wMy0wOCAxNDo1NzoxNyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFNldCBzdHJlYW0tZm9ybWF0PXJhdyBvbiBBQUMgY2FwcworCSAgU2V0IHN0cmVhbS1mb3JtYXQ9cmF3IGZvciBBQUMgY2FwcywgYXMgdGhhdCBpcyB0aGUKKwkgIGV4cGVjdGVkIEFBQyBmb3JtYXQgdG8gYmUgaW4gdGhpcyBjb250YWluZXIgZmFtaWx5LgorCSAgRml4ZXMgIzU2NjI1MAorCisyMDEwLTAzLTExIDEyOjU2OjExICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBjaGVjayBmb3IgTlVMTCBiZWZvcmUgZG9pbmcgc3RyY21wCisJICBDaGVjayB0aGUgY29ubmVjdGlvbiBhbmQgYWRkcmVzcyB0eXBlIGZvciBOVUxMIGJlZm9yZSBkb2luZyBzdHJjbXAgYW5kCisJICBjcmFzaGluZy4KKwkgIEZpeGVzICM2MTI1NTMKKworMjAxMC0wMy0xMSAxMToyMDo1OSArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZGY4YTdjOCB0byBlMjcyZjcxCisKKzIwMTAtMDMtMTEgMTE6MDk6NTUgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSAgYnVpbGQ6IGluY2x1ZGUgc3RkbGliLmggZm9yIGF0b2koKQorCisyMDEwLTAzLTExIDEwOjMzOjAwICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgIGF1ZGlvcGFub3JhbWE6IG1vdmUgaW52YXJpYW50IGNoZWNrIG91dCBvZiB0aGUgaW5uZXIgbG9vcAorCSAgSW1wcm92ZXMgcGVyZm9ybWFuY2UgZm9yIHNpbXBsZSBtZXRob2QuCisKKzIwMTAtMDMtMTAgMjI6MTU6MDQgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgVXBkYXRlIENYWEZMQUdTLCB0b28sIGp1c3QgbGlrZSBDRkxBR1MKKworMjAxMC0wMy0xMCAyMTowMToyMCArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QvcnRwbWFuYWdlci9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgVXBkYXRlIGZvciByZWNlbnQgY2hhbmdlcyB0byBjb21tb24gc3VibW9kdWxlCisJICBUaGlzIGp1c3QgcmVwbGFjZXMgZXZlcnkgIiRFUlJPUl9DRkxBR1MiIHVzYWdlIHdpdGggYSB1c2FnZSBvZgorCSAgIiRXQVJOSU5HX0NGTEFHUyAkRVJST1JfQ0ZMQUdTIiB0byBnZXQgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcworCSAgcHJldmlvdXNseS4KKwkgIEFjdHVhbGx5IHVzaW5nIHRoYXQgc2VwYXJhdGlvbiB3aWxsIGhhcHBlbiBsYXRlci4KKworMjAxMC0wMy0xMCAyMTo1MjowOSArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gOTcyMGE3ZCB0byBkZjhhN2M4CisKKzIwMTAtMDMtMTAgMjA6NDM6NTcgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDBiNmUwNzIgdG8gOTcyMGE3ZAorCisyMDEwLTAzLTEwIDEwOjUxOjI4IC0wODAwICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdW1vdGlvbi5jb20+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICBtdWx0aXVkcHNpbms6IFJlc2V0IHdpbmRvd3MgZXJyb3IgY29kZSBhZnRlciBnZXR0aW5nIGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZS4KKworMjAxMC0wMy0wOSAxNzozMjoyNyAtMDgwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHNvbmdiaXJkbmVzdC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5oOgorCSAgYXZpbXV4OiBwdXQgdGhlIGNvZGVjX2RhdGEgYmxvYiBpbnRvIHRoZSBhY3R1YWwgZGF0YSBmb3IgTVBFRzQgdmlkZW8sIHRvIG1hdGNoIG90aGVyIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgd2lsZC4KKworMjAxMC0wMy0xMCAxNjowOTo1NiArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gN2NjNWViNCB0byAwYjZlMDcyCisKKzIwMTAtMDItMjMgMjE6MDY6NTUgLTAzMDAgIFRoYWRldSBMaW1hIGRlIFNvdXphIENhc2NhcmRvIDxjYXNjYXJkb0Bob2xvc2NvcGlvLmNvbT4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIHhpbWFnZXNyYzogc2VuZCBuZXdfc2VnbWVudCB3aXRoIEdTVF9GT1JNQVRfVElNRSBmb3JtYXQKKwkgIEluc3RlYWQgb2YgdXNpbmcgQmFzZVNyYyBkZWZhdWx0IGZvcm1hdCBHU1RfRk9STUFUX0JZVEVTLCBzZW5kIGl0IGluCisJICBHU1RfRk9STUFUX1RJTUUuCisJICBTaWduZWQtb2ZmLWJ5OiBUaGFkZXUgTGltYSBkZSBTb3V6YSBDYXNjYXJkbyA8Y2FzY2FyZG9AaG9sb3Njb3Bpby5jb20+CisJICBGaXhlcyAjNjExNjU5CisKKzIwMTAtMDMtMTAgMTE6NDY6MDYgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogcHVzaCBtb2RlOyBhbHNvIHJlcG9ydCBzZWVrYWJsZSB3aXRob3V0IGFuIGVsZW1lbnQgaW5kZXgKKwkgIC4uLiBzaW5jZSByZWNlbnQgY29kZSBhbHNvIHNlZWtzIGFyb3VuZCB0byBvYnRhaW4gcmVxdWlyZWQgZGF0YQorCSAgZnJvbSBhdmkgaW5kZXguCisKKzIwMTAtMDMtMDkgMTg6MDY6NTIgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogYWRkIHNvbWUgY2hlY2sgYW5kIHN0YW5kYXJkaXplZCBzZWVrIGV2ZW50IGhhbmRsaW5nIGluIHB1c2ggbW9kZQorCisyMDEwLTAzLTA5IDE4OjA1OjI5ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGZpeCBvZmZzZXQgaGFuZGxpbmcgaW4gcHVzaCBtb2RlIHNlZWtpbmcKKwkgIFB1c2ggbW9kZSBzZWVraW5nIHVzZXMgc2FtZSBpbmRleCBkYXRhIGFzIHB1bGwgbW9kZSwgYW5kIHN0b3JlcworCSAgb2Zmc2V0IHRvIGRhdGEgaW4gY2h1bmssIHdoZXJlYXMgcHVzaCBtb2RlIG9wZXJhdGVzIGluIGNodW5rcywKKwkgIGFuZCBhcyBzdWNoIG5lZWRzIG9mZnNldCBjb25zaXN0ZW50bHkgY29ycmVzcG9uZGluZyB0byBjaHVuayBoZWFkZXJzLgorCSAgQWxzbyBmaXggZGV0ZXJtaW5pbmcgYmVzdCBtYXRjaGluZyBzdHJlYW0gZm9yIGluY29taW5nIG5ld3NlZ21lbnQgZXZlbnQsCisJICBhcyB3ZWxsIGFzIHNldHRpbmcgc29tZSBzdHJlYW0gc3RhdGUgYWNjb3JkaW5nbHkuCisKKzIwMTAtMDItMjYgMjE6Mjk6NDkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4Lmg6CisJICBmbHZkZW11eDogY29uZHVjdCBpbmRleCBzY2FuIGluIHRhc2sgdGhyZWFkCisJICAuLi4gcmF0aGVyIHRoYW4gaW4gc2Vla2luZyB0aHJlYWQsIHdoaWNoIG1pZ2h0IHRoZW4gb2NjdXB5IG1haW5sb29wCisJICBmb3Igc29tZSB0aW1lIHdpdGggcG9zc2libGUgdW5yZXNwb25zaXZlIHNpZGUtZWZmZWN0cy4KKworMjAxMC0wMi0yNiAyMToyNzozMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdmRlbXV4OiBhdm9pZCBpbmRlZmluaXRlIGluZGV4IGdyb3d0aAorCSAgVGhhdCBpcywgY2hlY2sgZm9yIGFuZCBkbyBub3QgYWRkIGFuIGluZGV4IGVudHJ5IHRoYXQgaGFzIGFscmVhZHkKKwkgIGJlZW4gYWRkZWQuCisKKzIwMTAtMDItMTggMTQ6NTc6MzkgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6CisJICBmbHZkZW11eDogYWxzbyBjb2xsZWN0IGluZGV4IGluZm8gb24tdGhlLWZseSBpbiBwdWxsIG1vZGUKKworMjAxMC0wMi0xOCAxMjo0MjozMSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuaDoKKwkgIGZsdmRlbXV4OiBpbmNyZW1lbnRhbGx5IGJ1aWxkIGluZGV4IGluIHB1bGwgbW9kZQorCSAgU2NhbiBmb3IgbmVlZGVkIHBhcnQgdXBvbiBhIHNlZWsgYXMgb3Bwb3NlZCB0byBkb2luZyBhIGNvbXBsZXRlIHNjYW4KKwkgIGF0IHN0YXJ0dXAsIHdoaWNoIG1heSB0YWtlIHNvbWUgdGltZSBkZXBlbmRpbmcgb24gZmlsZSBhbmQvb3IgcGxhdGZvcm0uCisJICBBbHNvIGFjY2VwdCBpbmRleCBtZXRhZGF0YSBpbiBwdWxsIG1vZGUgYW5kIHBlZWsgZm9yIHNvbWUgbWV0YWRhdGEKKwkgIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgd2hlbiBkZWVtZWQgYXBwcm9wcmlhdGUuCisKKzIwMTAtMDItMTggMTI6MjY6NDYgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogc29tZSBtb3JlIHZhcmlhYmxlIGNsZWFudXAKKworMjAxMC0wMy0wOSAxODoyNToyMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdmRlbXV4OiByZWZhY3RvciBhZGRpbmcgaW5kZXggZW50cnkKKworMjAxMC0wMi0xNyAxMTozNjoxMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdmRlbXV4OiBmaXggc2V0dGluZyBERUxUQV9VTklUIGZsYWcgb24gb3V0Z29pbmcgYnVmZmVycworCSAgLi4uIHdoaWNoIHNob3VsZCBub3QgZGVwZW5kIG9uIGhhdmluZyBpbmRleCBhdmFpbGFibGUgb3Igbm90LgorCSAgQWxzbyByZWZhY3RvciByZXN1bHRpbmcgY29sbGFwc2VkIGNvZGUuCisKKzIwMTAtMDItMTEgMTk6NDM6NDcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhdm9pZCBlcnJvbmVvdXMgY29kZWMtZGF0YSBvdmVycmlkaW5nIG9mIHN0c2QgaW5mb3JtYXRpb24KKworMjAxMC0wMi0wMSAyMjozNzozMCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSAgc3BlZXhkZWM6IGFkYXB0IHRvIG5ldyBvZ2dkZW11eAorCSAgUmVtb3ZlIGFsbCBncmFudWxlcG9zIGhhY2tzIGFuZCBzaW1wbHkgdXNlIHVwc3RyZWFtIHRpbWVzdGFtcHMuCisKKzIwMTAtMDItMDEgMjI6MzY6MDIgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5oOgorCSAgc3BlZXhkZWM6IHJlZmFjdG9yIGdyYW51bGVwb3MgaGFja3MKKworMjAxMC0wMy0xMCAxMToxOTo0NiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcGFyc2UgY29ubmVjdGlvbiBpbmZvcm1hdGlvbgorCSAgUGFyc2UgdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgU0RQIGFuZCB1c2UgaXQgdG8gZmlndXJlIG91dCBpZiB3ZSBhcmUKKwkgIGRlYWxpbmcgd2l0aCBpcHY0IG9yIGlwdjYgY29ubmVjdGlvbnMuCisKKzIwMTAtMDMtMDkgMTc6NTM6MzIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHJlcXVpcmUgYSBkZXN0aW5hdGlvbiBmb3IgbXVsdGljYXN0CisJICBXaGVuIHNldHRpbmcgdXAgdGhlIG11bHRpY2FzdCBzb2NrZXRzLCB3ZSBuZWVkIGEgZGVzdGluYXRpb24gYWRkcmVzcyB0byBsaXN0ZW4KKwkgIG9uIG9yIGVsc2Ugd2UgZXJyb3IuCisKKzIwMTAtMDMtMDkgMTc6NTI6MzUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IGhhbmRsZSBpcHY2IGxpc3RlbmluZyBwb3J0cyB3aGVuIG5lZWRlZAorCSAgQWRkIHNvbWUgY29kZSB0byBtYWtlIHVkcHNyYyBsaXN0ZW4gb24gYW4gaXB2NiBhZGRyZXNzIHdoZW4gbmVlZGVkLiBUaGUKKwkgIGRldGVjdGlvbiBvZiBJUFY2IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisKKzIwMTAtMDMtMDkgMTc6MTU6MTYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmg6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkgIHVkcDogdXNlIHVyaSBwYXJzaW5nIGNvZGUKKwkgIFVzZSB0aGUgdXJpIHBhcnNpbmcgaGVscGVyIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGhvc3QgYW5kIHBvcnQgcGFpcnMuIFRoaXMKKwkgIGFkZHMgc3VwcG9ydCBmb3IgSVBWNi4KKworMjAxMC0wMy0wOSAxNzoxMzozMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5oOgorCSAgdWRwbmV0dXRpbHM6IGFkZCBoZWxwZXIgZnVuY3Rpb25zIGZvciB1ZHAgdXJpIGhhbmRsaW5nCisJICBBZGQgc29tZSBoZWxwZXJzIHRvIHBhcnNlIHVkcCB1cmlzLiBNYWtlIHN1cmUgSVBWNiBpcyBzdXBwb3J0ZWQgdG9vLgorCisyMDEwLTAzLTA1IDE2OjA4OjQ1ICswMTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBydHBzZXNzaW9uOiBNYWtlIGl0IHBvc3NpYmxlIHRvIGZhdm9yIG5ldyBzb3VyY2VzIGluIGNhc2Ugb2YgU1NSQyBjb25mbGljdAorCSAgQWRkIGEgImZhdm9yLW5ldyIgcHJvcGVydHkgdGhhdCB0ZWxscyB0aGUgc2Vzc2lvbiB0byBmYXZvciBuZXcgc291cmNlcyB3aGVuCisJICB0aGVyZSBpcyBhIFNTUkMgY29uZmxpY3QuIFRoaXMgaXMgdXNlZnVsIGZvciBTSVAgY2FsbHMgYW5kIG90aGVyIHN1Y2ggY2FzZXMKKwkgIHdoZXJlIGEgcmVtb3RlIGxvb3AgaXMgZXh0cmVtZWx5IHVubGlrZWx5LgorCSAgRml4ZXMgIzYwNzYxNQorCisyMDEwLTAzLTA1IDE1OjQ2OjQ4ICswMTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBydHBzZXNzaW9uOiBNb3ZlIFNTUkMgY29uZmxpY3RzIGxpc3RzIGludG8gUlRQU291cmNlCisJICBXZSB3aWxsIGFsc28gbmVlZCB0byB0cmFjayBTU1JDIGNvbmZsaWN0cyBpbiByZW1vdGUgc291cmNlcy4KKwkgIFNlZSAjNjA3NjE1CisKKzIwMTAtMDItMjYgMTc6MTM6NDkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHNlbmQga2VlcCBhbGl2ZSB3aGVuIHBhdXNlZAorCSAgV2hlbiB3ZSBhcmUgcGF1c2VkLCBzZW5kIGtlZXAgYWxpdmUgbWVzc2FnZXMgdG8gdGhlIHNlcnZlciBzbyB0aGF0IG91ciBzZXNzaW9uCisJICBkb2Vzbid0IHRpbWUgb3V0IHdoZW4gd2UgZ28gYmFjayB0byBwbGF5aW5nIGxhdGVyLgorCisyMDEwLTAzLTEwIDAxOjEwOjA3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDdhYTY1YjUgdG8gN2NjNWViNAorCisyMDEwLTAyLTIzIDE5OjQ4OjEwIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuaDoKKwkgIG11bHRpZmlsZXNpbms6IEFkZCBrZXktZnJhbWUgb3B0aW9uIHRvIG5leHQtZmlsZQorCSAgVGhpcyBhbGxvd3Mgc2VnbWVudGluZyBvZiBNUEVHLVRTIGZpbGVzIGF0IGtleSBmcmFtZXMsIHdoaWNoIGlzCisJICBleGFjdGx5IHdoYXQgaXMgbmVlZGVkIGZvciBBcHBsZSdzIEhUVFAgc3RyZWFtaW5nLgorCisyMDEwLTAzLTA5IDIxOjMyOjQ3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDQ0ZWNjZTcgdG8gN2FhNjViNQorCisyMDEwLTAzLTA4IDIwOjE3OjU4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICB2aWRlb2JveDogRml4IGF1dG9jcm9wcGluZyBmb3Igb2RkIHdpZHRoL2hlaWdodCBkaWZmZXJlbmNlcworCisyMDEwLTAzLTA4IDIwOjAyOjE5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvYm94L01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guaDoKKwkgIHZpZGVvYm94OiBVc2UgbGliZ3N0dmlkZW8gZm9yIGZvcm1hdCBzcGVjaWZpYyBzdHVmZgorCisyMDEwLTAzLTA4IDE5OjI4OjQ3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlaWlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2ludmVydC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9rYXJhb2tlLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmM6CisJICBhdWRpb2Z4OiBTeW5jIHByb3BlcnRpZXMgdG8gdGhlIHN0cmVhbSB0aW1lCisKKzIwMTAtMDMtMDggMTk6MjA6NTkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBNYWtlIHByb3BlcnRpZXMgY29udHJvbGxhYmxlCisKKzIwMTAtMDMtMDggMTk6MDk6MDEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBTb21lIGNsZWFudXAKKworMjAxMC0wMi0yOCAxNTo0Nzo1MCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzdHJlYWsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkgIGVmZmVjdHY6IFVzZSBjb250cm9sbGVyIHdoZXJlIHBvc3NpYmxlLCBvcHRpbWl6ZSBhIGJpdCBhbmQgbWFrZSBwcm9wZXJ0aWVzIHRocmVhZHNhZmUKKworMjAxMC0wMi0yNiAxNjozNToxNyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBrZ2NvbmZpZy9NYWtlZmlsZS5hbToKKwkgIGJ1aWxkOiBNYWtlIHNvbWUgbW9yZSBydWxlcyBzaWxlbnQgaWYgcmVxdWVzdGVkCisKKzIwMTAtMDItMjYgMTU6NDE6NTIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IFVzZSBhdXRvbWFrZSAxLjExIHNpbGVudCBydWxlcyBpbnN0ZWFkIG9mIHNoYXZlIGlmIGF2YWlsYWJsZQorCSAgVGhpcyBtYWtlcyBzdXJlIHRoYXQgd2UgdXNlIHNvbWV0aGluZyB0aGF0IGlzIHN0aWxsIG1haW50YWluZWQgYW5kCisJICBhbHNvIGJyaW5ncyBiYWNrIGxpYnRvb2wgMS41IHN1cHBvcnQuCisKKzIwMTAtMDMtMDggMjI6NTc6MzQgKzAxMDAgIEJlbmphbWluIE90dGUgPG90dGVAcmVkaGF0LmNvbT4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgIHBuZzogZnJhY3Rpb25zIGRvbid0IGFsbG93IGRvdWJsZXMKKworMjAxMC0wMy0wMSAxMjowMzo1NiArMDEwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUByZWRoYXQuY29tPgorCisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSAgZmx4OiBmaXggZGVzY3JpcHRpb24KKwkgIEl0J3MgdmlkZW8sIG5vdCBhdWRpbworCisyMDEwLTAzLTA5IDE3OjQ1OjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaGFwZXdpcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBCYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDAuMTAuMjEgPT09CisKKzIwMTAtMDMtMDkgMDA6Mjg6MTYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2FtbWEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JhbGFuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAwLjEwLjIxCisKKzIwMTAtMDMtMDkgMDA6MjQ6NDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTAtMDMtMDkgMDA6MDk6MzQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuaDoKKwkgIFJldmVydCAiQWRkIDQ6MjoyLCA0OjE6MSwgYW5kIDQ6NDo0IG91dHB1dCBzdXBwb3J0IgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCA2MzdjMjZmNjFhMmJkOGQ3YjAxZjhiNmQwODFkOTRkYTY1Zjc0NTU3LgorCis9PT0gcmVsZWFzZSAwLjEwLjIwID09PQorCisyMDEwLTAzLTA4IDIzOjQyOjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMC4xMC4yMAorCisyMDEwLTAzLTA4IDIzOjQyOjA2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDEwLTAzLTA4IDE2OjQ3OjA0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogZG9uJ3Qgc2VuZCBzZWNvbmQgbmV3c2VnbWVudCBldmVudCBpbiBmcmFtZWQgbW9kZSwgZml4ZXMgbG9uZyBwbGF5YmFjayBkZWxheQorCSAgRG9uJ3Qgc2VuZCBhbm90aGVyIG5ld3NlZ21lbnQgZXZlbnQgaWYgdGhlIHVwc3RyZWFtIG11eGVyL3BhcnNlciBoYXMgYWxyZWFkeQorCSAgc2VudCBvbmUgKG90aGVyd2lzZSB0aGUgc2luayB3aWxsIHdhaXQgZm9yICRkdXJhdGlvbiBiZWZvcmUgc3RhcnRpbmcgcGxheWJhY2spLgorCSAgRml4ZXMgbG9uZyBkZWxheSB1bnRpbCBwbGF5YmFjayBzdGFydHMgd2l0aCBmbGFjLWluLW9nZyBmaWxlcy4KKwkgIEZpeGVzICM2MTA5NTkuCisKKzIwMTAtMDMtMDUgMTM6NDk6MzEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGNvbmZpZ3VyZSBtdWx0aWNhc3QgY29ycmVjdGx5CisJICBUYWtlIHRoZSB0cmFuc3BvcnQgZGVzdGluYXRpb24gZm9yIG11bHRpY2FzdC4KKwkgIERpc2FibGUgbG9vcCBhbmQgYXV0b2pvaW4gZm9yIG11bHRpY2FzdCBvbiB0aGUgdWRwc2lua3MuCisKKzIwMTAtMDMtMDUgMTM6NDc6MzMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICBtdWx0aWNhc3Q6IGFsd2F5cyBjb25maWd1cmUgbG9vcCBhbmQgdHRsCisJICBBbHNvIGNvbmZpZ3VyZSBUVEwgYW5kIGxvb3AgcGFyYW1ldGVycyB3aGVuIHdlIGFkZCBhIGNsaWVudCBhZnRlciBpbml0aWFsaXppbmcKKwkgIHRoZSBzZW5kZXIuCisKKzIwMTAtMDMtMDggMTI6MTM6MzIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJICBSZXZlcnQgInJ0cGgyNjNkZXBheTogYmFzZWNsYXNzIGhhbmRsZXMgdGltZXN0YW1wcyBmb3IgdXMiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDU2NDU4MWUxYjg4ZWNkNWVjNWRhODJjM2NhZmIwZTdhMmQ1OGIzMDIuCisJICBJZiB3ZSBkb24ndCBjYWxsIHB1c2hfdHMsIHRoZXJlIHdpbGwgYmUgbm8gdGltZXN0YW1wIGF0IGFsbCBvbiB0aGUgb3V0Z29pbmcKKwkgIGJ1ZmZlci4KKwkgIEZpeGVzICM2MTIxNTQKKworMjAxMC0wMi0yMyAyMjoxNjozOSAtMDUwMCAgQmVuamFtaW4gTS4gU2Nod2FydHogPGJlbnNAYWx1bS5taXQuZWR1PgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuaDoKKwkgIEFkZCA0OjI6MiwgNDoxOjEsIGFuZCA0OjQ6NCBvdXRwdXQgc3VwcG9ydAorCisyMDEwLTAzLTAyIDEzOjIxOjI0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cHNvdXJjZTogdXNlIHBheWxvYWQgc2l6ZSB0byBlc3RpbWF0ZSBiaXRyYXRlCisJICBVc2UgdGhlIGxlbmd0aCBvZiB0aGUgcGF5bG9hZCBmb3IgZXN0aW1hdGluZyB0aGUgcmVjZWl2ZXIgYml0cmF0ZSBzbyB0aGF0IGl0CisJICBtYXRjaGVzIHRoZSBjYWxjdWxhdGlvbnMgZG9uZSBvbiB0aGUgc2VuZGVyIHNpZGUuIFRvZ2V0aGVyIHdpdGggdGhlIG51bWJlciBvZgorCSAgcGFja2V0cyBvbmUgY2FuIHNjYWxlIHRoZSBiaXRyYXRlIHdpdGggdGhlIGhlYWRlciBvdmVyaGVhZCBvZiB0aGUgbG93ZXIKKwkgIHRyYW5zcG9ydC4KKworMjAxMC0wMy0wMiAxMjozOToyMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIHJ0cHNvdXJjZTogcmVmYWN0b3IgYml0cmF0ZSBlc3RpbWF0aW9uCisJICBEb24ndCByZXVzZSB0aGUgc2FtZSB2YXJpYWJsZSB3ZSBuZWVkIGZvciBzdGF0cyBmb3IgdGhlIGJpdHJhdGUgZXN0aW1hdGlvbgorCSAgYmVjYXVzZSB3ZSdyZSB1cGRhdGluZyBpdC4KKwkgIFJlZmFjdG9yIHRoZSBiaXRyYXRlIGVzdGltYXRpb24gY29kZSBzbyB0aGF0IGJvdGggc2VuZGVyIGFuZCByZWNlaXZlcnMgdXNlIHRoZQorCSAgc2FtZSBjb2RlIHBhdGguCisKKzIwMTAtMDMtMDEgMTY6NDA6MjcgLTA1MDAgIFRyaXN0YW4gTWF0dGhld3MgPHRyaXN0YW5Ac2F0LnFjLmNhPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIGFkZGVkIGJpdHJhdGUgZXN0aW1hdGlvbiB0byByZWNlaXZlci1zaWRlIHN0YXRzLCBmaXhlcyAjNjExMjEzCisKKzIwMTAtMDMtMDEgMTY6MDE6MjQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgaDI2M3BheTogZml4IHR5cG8gaW4gZGVidWcKKworPT09IHJlbGVhc2UgMC4xMC4xOSA9PT0KKworMjAxMC0wMy0wNiAwMDo0MzowMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnNpZ25hbHM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMC4xMC4xOQorCisyMDEwLTAzLTA2IDAwOjQyOjA5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDEwLTAzLTAzIDIwOjI5OjMwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgMC4xOC40IHByZS1yZWxlYXNlCisKKzIwMTAtMDMtMDIgMTg6Mjk6NDEgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogTWFrZSBzdXJlIHdlIGRvbid0IHNlbmQgaW52YWxpZCBuZXdzZWdtZW50cworCSAgRml4ZXMgIzYxMTUwMQorCisyMDEwLTAzLTAyIDE0OjA5OjE0ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIG1hdHJvc2thZGVtdXg6IE1hcmsgc3RyZWFtcyBhcyBiZWluZyBFT1MgYXQgdGhlIHJpZ2h0IHRpbWUuCisJICBUaGlzIGFsbG93cyB1cyB0byBzdG9wIHN0cmVhbWluZyBvbmx5IHdoZW4gYWxsIHN0cmVhbXMgaGF2ZSBnb25lIHBhc3QgdGhlCisJICBzZWdtZW50LnN0b3AgYW5kIG5vdCBiZWZvcmUuCisJICBGaXhlcyAjNjExNTAxCisKKzIwMTAtMDItMjYgMTg6MTA6MzIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IEFkdmFuY2Ugc3BhcnNlIHN0cmVhbXMgb25seSBhcyBtdWNoIGFzIHJlcXVpcmVkIHRvIGtlZXAgdGhlIGdhcCBzbWFsbGVyIHRoYW4gNTAwbXMKKwkgIENoYW5naW5nIGl0IHRvIHRoZSBuZXdlc3QgdGltZXN0YW1wIHRoYXQgd2FzIGV2ZXIgcHVzaGVkIHdpbGwKKwkgIGluY3JlYXNlIHRoZSBzZWdtZW50IHN0YXJ0IGluIDUwMG1zIGp1bXBzLCB3aGljaCBjb3VsZCBiZSBqdXN0CisJICBhZnRlciB0aGUgbmV4dCBzcGFyc2Ugc3RyZWFtIGJ1ZmZlci4gRS5nLgorCSAgVmlkZW8gYXQgMS4wcywgc3BhcnNlIHN0cmVhbSBhdCAwLjVzIHdvdWxkIGp1bXAgdGhlCisJICBzcGFyc2Ugc3RyZWFtIHRvIDEuMHMuIE5vdyBhIG5ldyBzcGFyc2Ugc3RyZWFtIGJ1ZmZlciBjb3VsZAorCSAgYXBwZWFyIHRoYXQgaGFzIGEgdGltZXN0YW1wIG9mIDAuOXMgYW5kIHRoaXMgd291bGQgYmUKKwkgIGRyb3BwZWQgZm9yIG5vIGdvb2QgcmVhc29uIGJlY2F1c2Ugb2YgYmFkIGx1Y2suCisKKzIwMTAtMDItMjQgMDE6MzY6MDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBwby9lcy5wbzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIDAuMTAuMTguMyBwcmUtcmVsZWFzZQorCisyMDEwLTAyLTI0IDAyOjA1OjQ5ICswMTAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kZWNpbmFAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmg6CisJICBNYWtlIHN1cmUgRkxVU0hfU1RPUCBpcyBzZW50IHNvIG5vdCB0byBsZWF2ZSBkb3duc3RyZWFtIGZsdXNoaW5nLgorCisyMDEwLTAyLTIzIDE3OjI1OjU0ICswMTAwICBWb2xrZXIgR3JhYnNjaCA8YnVnemlsbGEuZ25vbWUub3JnQHYubm90anVzdGhvc3RpbmcuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IFVzZSAkUEtHX0NPTkZJRyBpbnN0ZWFkIG9mIHBrZy1jb25maWcgdG8gZml4IGNyb3NzIGNvbXBpbGF0aW9uCisJICBGaXhlcyBidWcgIzYxMDgzOS4KKworMjAxMC0wMi0yMyAxNzoyNDowMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBSZXNldCBza2V3IGRldGVjdGlvbiBhZnRlciBpbnN0YW50aWF0aW5nIHRoZSBqaXR0ZXJidWZmZXIKKwkgIC4uLm5vdCBvbmx5IHdoZW4gZ29pbmcgdG8gUkVBRFkuIFRoaXMgc2V0cyBoaWdoX2xldmVsIGFuZCBmcmllbmRzIHRvCisJICBhIG1vcmUgdXNlZnVsIHZhbHVlLgorCisyMDEwLTAyLTIzIDE3OjE5OjE0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBydHBqaXR0ZXJidWZmZXI6IFJldHVybiAxMDAgaWYgaGlnaC1sZXZlbCBpcyAwIGluc3RlYWQgb2YgZGl2aWRpbmcgYnkgemVybworCisyMDEwLTAyLTIyIDEyOjI0OjE0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSAgcnRwbXA0Z2RlcGF5OiBhdm9pZCBkaXZpc2lvbiBieSAwCisJICBBdm9pZCBhIGRpdmlzaW9uIGJ5IDAgd2hlbiBubyBjb25zdGFudER1cmF0aW9uIHdhcyBzcGVjaWZpZWQgYW5kIHdoZW4gb3V0IHR3bworCSAgdGltZXN0YW1wcyBhcmUgZXF1YWwuCisJICBGaXhlcyAjNjEwMjY1CisKKzIwMTAtMDItMjIgMTg6MjA6NDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdmRlcGF5Lmg6CisJICBkdmRlcGF5OiBkb24ndCBvdXRwdXQgZnJhbWVzIHVudGlsIHdlIGhhdmUgYSBoZWFkZXIKKwkgIFdhaXQgZm9yIHRoZSBjb21wbGV0ZSBmaXJzdCA2IGhlYWRlciBESUYgcGFja2V0cyBiZWZvcmUgb3V0cHV0dGluZyBhIGZyYW1lLgorCSAgRGVjb2RlcnMgbmVlZCB0aGlzIGluZm8gdG8gY29ycmVjdGx5IGRlY29kZSB0aGUgZGF0YS4KKwkgIEZpeGVzICM2MTA1NTYKKworMjAxMC0wMi0yMiAyMDo1NToyOSArMDEwMCAgRGF2aWQgSG95dCA8ZGhveXRAbGxubC5nb3Y+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IEZpeCBpbnZhbGlkIG1lbW9yeSBhY2Nlc3MgYnkgZmlyc3QgY2hlY2tpbmcgYW5kIHRoZW4gcmVhZGluZworCSAgRml4ZXMgYnVnICM2MTA0ODMuCisKKzIwMTAtMDItMTggMDk6MDU6NTAgKzAxMDAgIFBoaWxpcHBlIE5vcm1hbmQgPHBoaWxAYmFzZS1hcnQubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGdzdF9wdWxzZXNpbmtfZ2V0X211dGU6IHNldCByZXN1bHQgZWFybGllci4KKwkgIEluIHRoZSBjYXNlcyB3aGVyZSBubyBidWZmZXIgd2FzIHByb2Nlc3MgeWV0IG9yIHRoZSBpbmRleCBpcyBub3QKKwkgIGF2YWlsYWJsZSwgZ2V0X3B1bHNlc2lua19nZXRfbXV0ZSgpIHdvdWxkIHVuY29uZGl0aW9uYWxseSByZXR1cm4KKwkgIEZBTFNFLgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTYxMDMzNworCisyMDEwLTAyLTE5IDEyOjM1OjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcGtnY29uZmlnL2dzdHJlYW1lci1wbHVnaW5zLWdvb2QtdW5pbnN0YWxsZWQucGMuaW46CisJICBwa2djb25maWc6IGZpeCBnc3RyZWFtZXItcGx1Z2lucy1nb29kIHVuaW5zdGFsbGVkIC5wYyBmaWxlCisJICBGaXggZ3N0LXBsdWdpbnMtYmFzZSByZWZlcmVuY2UvcmVxdWlyZW1lbnQuIFRoaXMgY2F1c2VkIHNwdXJpb3VzCisJICBwcm9ibGVtcyB3aXRoIHVuaW5zdGFsbGVkIC11Z2x5Ly1iYWQgbm90IGZpbmRpbmcgLWdvb2QgcGx1Z2lucyBpbgorCSAgdGhlaXIgdW5pdCB0ZXN0cyAod2hlbiBkaXN0Y2hlY2tpbmcpLgorCisyMDEwLTAyLTE5IDAxOjAzOjMxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogcG8vbHYucG86CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjE4LjIgcHJlLXJlbGVhc2UKKworMjAxMC0wMi0xOSAwMDo1NDoxMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvLmdpdGlnbm9yZToKKwkgIE1ha2UgZ2l0IGlnbm9yZSBzaGFwZXdpcGUgZXhhbXBsZXMgYW5kIHRlc3RzCisKKzIwMTAtMDItMTkgMDA6NDY6NDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6CisJICBmbHZkZW11eDogbWlub3IgbWljcm8tb3B0aW1pc2F0aW9uCisJICBXZSBrbm93IHRoZXNlIHZhbHVlcyBkb24ndCBjaGFuZ2UgZHVyaW5nIHRoZSBsb29wLCBidXQgdGhlIGNvbXBpbGVyCisJICBkb2Vzbid0IGFuZCBoYXMgdG8gcmUtY2hlY2sgdGhlbSBmb3IgZXZlcnkgaXRlcmF0aW9uLgorCisyMDEwLTAyLTE5IDAwOjM5OjUwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOgorCSAgZmx2ZGVtdXg6IHJlbW92ZSBzdGF0aWMga2V5d29yZCBmcm9tIHZhcmlhYmxlcyB0aGF0IHNob3VsZG4ndCBiZSBzdGF0aWMKKwkgIE11bHRpcGxlIGZsdnBhcnNlL2ZsdmRlbXV4IGluc3RhbmNlcyBzaG91bGQgYmUgYWJsZSB0byBvcGVyYXRlIHdpdGhvdXQKKwkgIHRyYW1wbGluZyBvdmVyIGVhY2ggb3RoZXIgYnkgYWNjaWRlbnRhbGx5IHJlLXVzaW5nIHRoZSBzYW1lIChzdGF0aWMpCisJICB2YXJpYWJsZXMuIChTcG90dGVkIGJ5IE1hcmsgTmF1d2VsYWVydHMpCisKKzIwMTAtMDItMTYgMDI6MDc6MDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGRvY3M6IGFkZCBTaW5jZTogbWFya2VycyBmb3IgbmV3IGppdHRlcmJ1ZmZlciBwcm9wZXJ0aWVzCisKKzIwMTAtMDItMTggMTg6MjA6MjQgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IG9mZi1ieS1vbmUgbG9naWMgZXJyb3IgaW4gZnJhbWUgcmF0ZSBjYXAgcmVncmVzc2lvbiBjb21taXQKKworMjAxMC0wMi0xNyAxNjoyNzozMyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFVzZSB0aGUgY29ycmVjdCBkdXJhdGlvbiB3aGVuIGNvbXBhcmluZyBzZWdtZW50cworCSAgRG8gbm90IGNvbmZ1c2UgUXREZW11eFNlZ21lbnRzIHdpdGggR3N0U2VnbWVudHMgd2hlbgorCSAgY29tcGFyaW5nIHRoZSB0b3RhbCBmaWxlIGR1cmF0aW9uIHdpdGggdGhlIHNlZ21lbnQgZHVyYXRpb24KKwkgIEZpeGVzICM2MTAyOTYKKworMjAxMC0wMi0xNyAxODowNjoyOSArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgZHVyYXRpb25zIG1vZHVsbyAxPDwzMgorCSAgRm9yIGNhbGN1bGF0aW5nIHRoZSBkdXJhdGlvbnMgb2YgZWFjaCBzYW1wbGUsIHdlIGFyZSBzdXBwb3NlZCB0byBhZGQgZWFjaAorCSAgZHVyYXRpb24gbW9kdWxvIDE8PDMyIHNvIG1ha2UgdGhlIGVsYXBzZWQgdGltZSBjb3VudGVyIGEgdWludDMyLgorCSAgRml4ZXMgIzYxMDI4MAorCisyMDEwLTAyLTE2IDIxOjA1OjI0ICswMTAwICBBbmRlcnMgU2thcmdyZW4gPGFuZGVycy5za2FyZ3JlbiBhdCBheGlzLmNvbT4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSAgbXVsdGlwYXJ0ZGVtdXg6IGltcHJvdmUgaGVhZGVyIG1pbWUtdHlwZSBwYXJzaW5nCisJICBNYWtlIHRoZSBoYW5kaW5nIG9mIHRoZSBtaW1lIHR5cGUgd2l0aGluIHRoZSAiYm91bmRhcnkiIGEgYml0IGxlc3MgbmFpdmUuCisJICBUaGUgc3RhbmRhcmQgZm9yIE1JTUUgYWxsb3dzIHBhcmFtZXRlcnMgdG8gZm9sbG93IHRoZSAidHlwZSIgLyAic3VidHlwZSIKKwkgIGNsYXVzZSBzZXBhcmF0ZWQgZnJvbSB0aGUgbWltZSB0eXBlIGJ5ICc7Jy4KKwkgIE1vZGlmaWVzIHRoZSBtdWx0aXBhcnRkZW11eGVyJ3MgaGVhZGVyIHBhcnNpbmcgc28gaXQgZG9lc250IGFzc3VtZQorCSAgdGhlIHdob2xlIGxpbmUgYWZ0ZXIgImNvbnRlbnQtdHlwZToiIGlzIHRoZSBtaW1lIHR5cGUgYW5kIHRodXMgbWFrZXMgaXQgYSBiaXQKKwkgIG1vcmUgcmVzaWxpZW50IHRvIGZpbmRpbmcgYWJzdXJkIG1pbWUgdHlwZXMgaW4gdGhlIGNhc2Ugd2hlcmUgcGFyYW1ldGVycyBhcmUKKwkgIGFkZGVkLgorCSAgRml4ZXMgIzYwNDcxMQorCisyMDEwLTAyLTE2IDE5OjUzOjA5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBhdm9pZCBzdG9wcGluZyBOVUxMIHRhc2tzCisJICBDaGVjayB0aGUgdGFzayBmb3IgTlVMTCwgaXQgY291bGQgYmUgcGF1c2VkIGFuZCBzZXQgdG8gTlVMTCBiZWZvcmUuCisKKzIwMTAtMDItMTYgMTY6MjI6MjggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggQUxBQyBjb2RlYy1kYXRhIGhhbmRsaW5nCisJICBBTEFDIGNvZGVjLWRhdGEgYXBwYXJlbnRseSBjb21lcyBpbiAoYXQgbGVhc3QpIHR3byBmbGF2b3VycyAobW92LCBtcDQpLAorCSAgc28gdXNlIGF0b20gYmFzZWQgcGFyc2luZyB0byByZXRyaWV2ZSByZXF1aXJlZCBkYXRhLCByYXRoZXIgdGhhbgorCSAgYWltaW5nIGZvciBhIHNwZWNpZmljIG9mZnNldC4KKwkgIFNlZSBhbHNvICM1ODA3MzEuCisKKzIwMTAtMDItMTYgMTU6NTA6MjMgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggZGVidWcgbWVzc2FnZQorCisyMDEwLTAyLTExIDE5OjM5OjA0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF90eXBlcy5oOgorCSAgcXRkZW11eDogaGFuZGxlIHNpZ25lZCB2YWx1ZXMgaW4gM0dQUCBsb2NhdGlvbiB0YWcKKworMjAxMC0wMi0wOCAyMTozNTo1MyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGZpeCB0eXBvIGluIGRlYnVnIG1lc3NhZ2UKKworMjAxMC0wMi0xNiAxNTowMDoxMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiByZXNldCBzb21lIG1vcmUgc3RyZWFtIHN0YXRlIGFmdGVyIHNlZWsKKwkgIEluIHBhcnRpY3VsYXIsIGZpeGVzIG5vbi1mbHVzaGluZyBzZWVrLgorCisyMDEwLTAyLTE2IDE0OjQ0OjExICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBmcmFtZSByYXRlIGNhcCByZWdyZXNzaW9uCisJICBMb29rIGZvciBhIG5vbi16ZXJvIG1pbl9kdXJhdGlvbiBkdXJpbmcgaW5pdGlhbGlzYXRpb24gdG8gYXZvaWQKKwkgIGluY29ycmVjdCBmcmFtZSByYXRlIGNhcHMuCisKKzIwMTAtMDItMTYgMTA6MTM6MTcgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkgIHY0bDI6IGxvZyBtb3JlIGRldGFpbHMgaW4gYnVmZmVyIHBvb2wgZmluYWxpemUKKwkgIEhlbHBzIHRvIGFsaWduIHdpdGggdGhlIGxvZ2dpbiBmcm9tIGxpYnY0bC4KKworMjAxMC0wMi0xNiAxMDoxMTo0MCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyOiBpbml0IGRhdGFzdHJ1Y3R1cmVzIGFmdGVyIHByZS1jb25kaXRpb25zIGNoZWNrcworCisyMDEwLTAyLTE2IDEwOjEwOjQ1ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IGFkZCBhIGZpeG1lIGZvciBoYW5kbGluZyBvdGhlciBZVVYgdmFyaWFudHMKKworMjAxMC0wMi0xNiAwMTo0MDoxOSArMDAwMCAgQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbkBzdW4uY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thOiBmaXggR1NUX0VMRU1FTlRfRVJST1IgdXNhZ2UKKwkgIEZpeGVzICM2MTAwNTMuCisKKzIwMTAtMDItMTYgMDA6NTA6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGZpeCB1cCBHU1RfQ1hYRkxBR1MgcHJvcGVybHkKKwkgIFdlIGRvbid0IHdhbnQgQyBzcGVjaWZpYyBmbGFncyBpbiBHU1RfQ1hYRkxBR1MsIHNvIGJhc2UgaXQgb24gdGhlCisJICBHU1RfQ0ZMQUdTIHRoYXQgb25seSBjb250YWlucyB0aGUgcGtnLWNvbmZpZyBDRkxBR1MgYnV0IG5vbmUgb2YKKwkgIHRoZSBHU1RfT1BUSU9OX0NGTEFHUy4gQWxzbywgd2Ugb25seSBuZWVkIHRoZSBsb2NhbCBpbmNsdWRlcyBvbmNlLgorCSAgRml4IHR5cG8gYXMgd2VsbCAoR1NUX0ZMQUdTIC0+IEdTVF9DRkxBR1MpLgorCisyMDEwLTAyLTE1IDIzOjEzOjQ2ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogYmFzZSBHU1RfQ1hYRkxBR1Mgb24gLS1jZmxhZ3MgZnJvbSBwa2ctY29uZmlnCisJICBwa2ctY29uZmlnIHNldHMgR1NUX0NGTEFHUyBhbmQgR1NUX0xJQlMuIFdlIG5lZWQgdG8gdXNlIENGTEFHUyBhcyBhIHN0YXJ0aW5nCisJICBwb2ludCBmb3IgZm9yIGJvdGggQyBhbmQgQ1hYIHNldHRpbmdzLgorCisyMDEwLTAxLTIwIDE4OjUyOjUxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cGJpbjogcmVtb3ZlIHVzZSBvZiBudHBfbnNfYmFzZQorCisyMDEwLTAxLTIwIDE4OjIyOjIwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgcnRwYmluOiByZW1vdmUgbW9yZSBudHBuc3RpbWUgYW5kIGNsZWFudXBzCisJICBSZW1vdmUgc29tZSBjb2RlIHdoZXJlIHdlIHBhc3MgbnRwbnN0aW1lIGFyb3VuZCwgd2UgY2FuIGRvIG1vc3QgdGhpbmdzIHdpdGggdGhlCisJICBydW5uaW5nX3RpbWUganVzdCBmaW5lLgorCSAgUmVuYW1lIGEgdmFyaWFibGUgaW4gdGhlIEFycml2YWxTdGF0cyBzdHJ1Y3Qgc28gdGhhdCBpdCdzIGNsZWFyIHRoYXQgdGhpcyBpcyB0aGUKKwkgIGN1cnJlbnQgc3lzdGVtIHRpbWUuCisKKzIwMTAtMDEtMjAgMTg6MTk6MzQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlOiB1c2UgcnVubmluZ190aW1lIGZvciBqaXR0ZXIKKwkgIFVzZSB0aGUgcnVubmluZ190aW1lIHRvIGNhbGN1bGF0ZSB0aGUgaml0dGVyIGluc3RlYWQgb2YgdGhlIG50cCB0aW1lLiBQYXJ0IG9mCisJICB0aGUgcGxhbiB0byBnZXQgcmlkIG9mIG50cG5zYmFzZS4KKworMjAxMC0wMS0yMCAxNzowNDowMyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIHJ0cGJpbjogY2hhbmdlIGhvdyBOVFAgdGltZSBpcyBjYWxjdWxhdGVkIGluIFJUQ1AKKwkgIERvbid0IGNhbGN1bGF0ZSB0aGUgTlRQIHRpbWUgYmFzZWQgb24gdGhlIHJ1bm5pbmdfdGltZSBvZiB0aGUgcGlwZWxpbmUgYnV0IGZyb20KKwkgIHRoZSBzeXN0ZW1jbG9jay4gVGhpcyBhbGxvd3MgdXMgdG8gZ2VuZXJhdGUgbW9yZSBhY2N1cmF0ZSBOVFAgdGltZXN0YW1wcyBpbiBjYXNlCisJICB0aGUgc3lzdGVtY2xvY2sgaXMgc3luY2hyb25pemVkIHdpdGggTlRQIG9yIHNpbWlsYXIuCisKKzIwMTAtMDItMTUgMTI6MTI6MzYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyOiBwcmludGYgZm9ybWF0IHN0cmluZyBmaXgKKwkgIFRoZSBjb21waWxlciB3YW50cyBhIGNhc3QgaGVyZSBldmVuIHRob3VnaCB0aGUgdHlwZSBpcyBhbHJlYWR5CisJICB0eXBlZGVmZWQgYXMgNjQtYml0IGludGVnZXIgKHByZXN1bWFibHkgYmVjYXVzZSBnbGliIGhhcyB0eXBlZGVmZWQKKwkgIGd1aW50NjQgdG8gdW5zaWduZWQgbG9uZyBoZXJlKS4KKworMjAxMC0wMi0xNSAxMDozMzowMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2E6IGZpeCBwcmludGYgZm9ybWF0IHN0cmluZworCisyMDEwLTAyLTE1IDAwOjUwOjEwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3JhdzEzOTQvZ3N0MTM5NGNsb2NrLmg6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICByYXcxMzk0LCBtYXRyb3NrYSwgcnRwbWFuYWdlcjogcmVtb3ZlIHBhZGRpbmcgZnJvbSBzdHJ1Y3R1cmVzCisJICBOb25lIG9mIHRoZXNlIGVsZW1lbnQgYW5kIGNsYXNzIHN0cnVjdHVyZXMgYXJlIGluIHB1YmxpYyBoZWFkZXJzLAorCSAgc28gZG9uJ3QgbmVlZCBwYWRkaW5nLgorCisyMDEwLTAyLTE1IDAwOjQ3OjExICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbC5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgcG86IHVwZGF0ZSBmb3IgbmV3IHRyYW5zbGF0b3IgY29tbWVudAorCisyMDEwLTAyLTE1IDAwOjQ1OjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBhZGQgY29tbWVudCBmb3IgdHJhbnNsYXRvcnMgZm9yICd4IGJ5IHknIG1lc3NhZ2UKKwkgIEZpeGVzICM2MDk3MjQuCisKKzIwMTAtMDItMTUgMDE6Mjg6NDQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm9yZW5kZXIuYzoKKwkgIGNhaXJvcmVuZGVyOiBGaXggbGVha2luZyBvZiBwYWQgdGVtcGxhdGVzCisKKzIwMTAtMDItMTUgMDA6NTA6MjcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zaGFwZXdpcGUuYzoKKwkgIHNoYXBld2lwZTogRml4IHVuaXQgdGVzdCBmb3IgbGF0ZXN0IGNoYW5nZXMKKwkgIE5vdyB0aGUgYWxwaGEgaXMgbXVsdGlwbGllZCB3aXRoIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGFscGhhCisJICB2YWx1ZSBpbnN0ZWFkIG9mIHNpbXBseSBpZ25vcmluZyBpdCBhbmQgdGhlIGx1bWEvY2hyb21hIHZhbHVlcworCSAgYXJlIGtlcHQsIGV2ZW4gaWYgdGhlIG91dHB1dCBpcyAxMDAlIHRyYW5zcGFyZW50LgorCisyMDEwLTAyLTE1IDAwOjQ3OjA4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc2hhcGV3aXBlLmM6CisJICBzaGFwZXdpcGU6IEltcHJvdmUgdW5pdCB0ZXN0IG91dHB1dCBvbiBlcnJvcnMKKworMjAxMC0wMi0xNCAyMzoxNzoyMCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA5NmRjNzkzIHRvIDQ0ZWNjZTcKKworMjAxMC0wMi0xMyAyMzoyODowNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogYnVtcCAtYmFzZSByZXF1aXJlbWVudCB0byBnaXQKKwkgIEZvciBHU1RfUklGRl9UQUdfSlVOUS4KKworMjAxMC0wMi0xMiAxNjoxMTozMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkgIHY0bDJzaW5rOiBjaGFuZ2UgcmFuayB0byBOT05FIHNvIGl0IGlzIG5ldmVyIGF1dG9wbHVnZ2VkCisKKzIwMTAtMDItMTMgMTg6MTg6NDIgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdmRlbXV4OiBBdWRpbyB0YWdzIHdpdGhvdXQgYW55IGNvbnRlbnQgYXJlIHZhbGlkLgorCSAgV2Ugc2lsZW50bHkgaWdub3JlIHRoZW0gaW5zdGVhZCBvZiBlcnJvcmluZyBvdXQuCisKKzIwMTAtMDItMTMgMTg6MDc6NTAgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdmRlbXV4OiBGaXggR1NUX0NMT0NLX0RJRkYgdXNhZ2UuCisJICBJdCB3YXMgcHJldmlvdXNseSBjaGVja2luZyBmb3IgRElGRihhLCBiID4gNiAqIEdTVF9TRUNPTkQpIGluc3RlYWQgb2YKKwkgIHRoZSBwcm9wZXIgRElGRihhLGIpID4gNiAqIEdTVF9TRUNPTkQKKworMjAxMC0wMi0xMyAxNjoyNzowNyArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgZmx2ZGVtdXg6IERvbid0IGZvcmdldCB0byByZXNldCB0aGUgaW5kZXhlZCB2YXJpYWJsZSB3aGVuIGNsZWFuaW5nIHVwCisKKzIwMTAtMDItMTMgMTE6MDE6NTMgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdmRlbXV4OiBTcGVlZHVwIEdzdEluZGV4IHVzYWdlCisJICBVc2VkIHRoZSBfYWRkX2Fzc29jaWF0aW9udiB2YXJpYW50IG9mIEdzdEluZGV4IHNpbmNlIHdlIGtub3cgaG93IG1hbnkKKwkgIGFzc29jaWF0aW9ucyB3ZSdyZSBhZGRpbmcuIFRyaW1zIHVwIHRvIDUwJSBmcm9tIGluZGV4IGdlbmVyYXRpb24gdGltZS4KKwkgIE5vdGUgOiBJdCB3b3VsZCBiZSBncmVhdCBpZiB0aGUgaW5kZXggY291bGQgYmUgZ2VuZXJhdGVkIG9uIHRoZSBmbHkgb3IKKwkgIG9uIHJlcXVlc3QgYXMgb3Bwb3NlZCB0byBiZWluZyBmdWxseSBjcmVhdGVkIGF0IHN0YXJ0dXAuCisKKzIwMTAtMDItMTIgMTk6MzI6MjcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBkb24ndCByZXN5bmMgdG8gaW52YWxpZCB0aW1lc3RhbXBzCisJICBJZiB3ZSBkZXRlY3QgYmFja3dhcmQgdGltZXN0YW1wcyBvbiB0aGUgc2VydmVyLCBkb24ndCB0cnkgdG8gcmVzeW5jIHdoZW4gd2UKKwkgIGRvbid0IGhhdmUgYW4gaW5wdXQgdGltZXN0YW1wIChzdWNoIGFzIHdoZW4gdXNpbmcgUlRTUCBvdmVyIFRDUCkgaW5zdGVhZCwgZG8KKwkgIG5vdGhpbmcgYnV0IGFzc3VtZSB0aGUgdGltZXN0YW1wIHdhcyBvaywgaXQgd2lsbCBjb3JyZWN0IGl0c2VsZiB3aGVuIHRpbWUgZ29lcworCSAgZm9yd2FyZHMuCisKKzIwMTAtMDItMTIgMTc6MjE6NDMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBmaXggdHlwbworCisyMDEwLTAyLTEyIDE2OjQ3OjI5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogc3RhcnQgb3V0IGFjdGl2ZSBhbmQgbm90IGJ1ZmZlcmluZworCSAgVGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgdGhlIGxhdGVuY3kgaW4gdGhlIGppdHRlYnVmZmVyIGluIF9pbml0LCB3ZSB3aWxsIHNldAorCSAgdGhhdCBsYXRlciB3aGVuIGdvaW5nIHRvIFBBVVNFRC4KKwkgIFNldCB0aGUgaml0dGVyYnVmZmVyIGFjdGl2ZSBhbmQgbm90IGJ1ZmZlcmluZyB3aGVuIHN0YXJ0aW5nLgorCisyMDEwLTAxLTI3IDE3OjU3OjU1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkgIHJ0cGJpbjogbW9yZSBidWZmZXJpbmcgd29yaworCSAgV2hlbiBkZWFjdGl2YXRpbmcgaml0dGVyYnVmZmVycyB3aGVuIHRoZSBidWZmZXJpbmcgc3RhcnRzLCBrZWVwIHRoZSBjdXJyZW50CisJICBwZXJjZW50IG9mIHRoZSBqaXR0ZXJidWZmZXIgYW5kIGFsc28gc2V0IHRoZSBqaXR0ZXJidWZmZXIgaW4gdGhlIGJ1ZmZlcmluZyBzdGF0ZQorCSAgc28gdGhhdCB3ZSBrbm93IHdoZW4gaXQncyBmaWxsZWQgYWdhaW4uCisJICBBZGQgcHJvcGVydHkgdG8gZ2V0IHRoZSBidWZmZXJpbmcgcGVyY2VudGFnZSBvZiB0aGUgaml0dGVyYnVmZmVyLgorCisyMDA5LTEwLTE0IDE2OjI5OjM1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGppdHRlcmJ1ZmZlcjogYWRqdXN0IGxhdGVuY3kgaW4gYnVmZmVyIG1vZGUKKwkgIFdoZW4gd2UgYXJlIGluIGJ1ZmZlciBtb2RlLCBhZGp1c3QgdGhlIGJ1ZmZlcmluZyBsb3cvaGlnaCB0aHJlc2hvbGRzIGJhc2VkIG9uCisJICB0aGUgdG90YWwgY29uZmlndXJlZCBsYXRlbmN5LiBJZiB3ZSBkb24ndCBhbmQgdGhlcmUgaXMgYSBodWdlIHF1ZXVlIG9yIGVsZW1lbnQKKwkgIHdpdGggYSBiaWcgbGF0ZW5jeSBkb3duc3RyZWFtIHdlIG1pZ2h0IGRyYWluIHRoZSBjb21wbGV0ZSBxdWV1ZSBpbW1lZGlhdGVseSBhbmQKKwkgIHN0YXJ0IGJ1ZmZlcmluZyBhZ2Fpbi4KKworMjAwOS0xMC0xMiAxMTo1NDowNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGFkZCB0cy1vZmZzZXQgdG8gdGltZXN0YW1wCisJICBBZGQgdGhlIHRzLW9mZnNldCB0byB0aGUgYnVmZmVyIHRpbWVzdGFtcCB0byBnZXQgdGhlIGZpbmFsIG91dHB1dCB0aW1lc3RhbXAgb2YKKwkgIHRoZSBidWZmZXIuCisKKzIwMDktMTAtMDggMTk6MjM6NTMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi1tYXJzaGFsLmxpc3Q6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIHJ0cGJpbjogZG8gbW9yZSBhY2N1cmF0ZSBidWZmZXIgb2Zmc2V0cworCSAgUmV0dXJuIHRoZSBuZXh0IHRpbWVzdGFtcCBpbiB0aGUgaml0dGVyYnVmZmVyLgorCSAgVXNlIHRoZSBtaW4tdGltZXN0YW1wIG9mIHRoZSBqaXR0ZXJidWZmZXJzIHRvIGNhbGN1bGF0ZSBhbiBvZmZzZXQgc28gdGhhdCB0aGUKKwkgIG5leHQgdGltZXN0YW1wIGlzIHB1c2hlZCB3aXRoIGEgdGltZXN0YW1wIGVxdWFsIHRvIHJ1bm5pbmdfdGltZS4KKwkgIFN0YXJ0IHByb2R1Y2luZyB0aW1lc3RhbXBzIGZyb20gMCBpbiB0aGUgYnVmZmVyaW5nIGNhc2UgdG9vLgorCisyMDA5LTEwLTA4IDE4OjQyOjExICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogb25seSBzdGFydCBidWZmZXJpbmcgd2hlbiA8IDEwMCUKKwkgIE9ubHkgc3RhcnQgYnVmZmVyaW5nIHdoZW4gdGhlIHBlcmNlbnRhZ2UgbWVzc2FnZSBpcyA8IDEwMCAlLgorCisyMDA5LTEwLTA2IDEzOjM0OjM0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgcnRwYmluOiBrZWVwIHRyYWNrIG9mIGVsYXBzZWQgcGF1c2UgdGltZQorCSAgS2VlcCB0cmFjayBvZiB0aGUgdGltZSB3ZSBzcGVuZCBwYXVzaW5nIHRoZSBqaXR0ZXJidWZmZXJzIHdoZW4gdGhleSB3ZXJlCisJICBidWZmZXJpbmcgYW5kIGRpc3RyaWJ1dGUgdGhpcyBlbGFwc2VkIHRpbWUgdG8gdGhlIGppdHRlcmJ1ZmZlcnMuCisJICBBbHNvIGtlZXAgdGhlIGxhdGVuY3kgaW4gbmFub3NlY29uZCBwcmVjaXNpb24uCisKKzIwMDktMTAtMDYgMTM6MzM6MTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICBqaXR0ZXJidWZmZXI6IGtlZXAgdHJhY2sgb2Ygb2Zmc2V0CisJICBLZWVwIHRyYWNrIG9mIGFuIG91dGdvaW5nIG9mZnNldCB0aGF0IHdlIGFkZCB0byBlYWNoIG91dGdvaW5nIGJ1ZmZlciB0bworCSAgY29tcGVuc2F0ZSBmb3IgUEFVU0Ugd2hlbiBidWZmZXJpbmcuCisJICBBZGp1c3QgdGhlIG9mZnNldCB3aGVuIGFjdGl2YXRpbmcuCisKKzIwMDktMTAtMDYgMTM6MzA6NTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiByZXBvcnQgbGV2ZWwgdXNpbmcgaGlnaCB3YXRlcm1hcmsKKworMjAwOS0xMC0wNSAyMTozMTo1OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRwYmluOiBwYXNzIHJ1bm5pbmdfdGltZSB0byBqaXR0ZXJidWZmZXIgcGF1c2UKKwkgIFBhc3MgdGhlIGN1cnJlbnQgcnVubmluZyB0aW1lIHRvIHRoZSBqaXR0ZXJidWZmZXIgd2hlbiBwYXVzaW5nIG9yIHJlc3VtaW5nIHNvCisJICB0aGF0IGl0IGNhbGN1bGF0ZSB0aGUgcmlnaHQgb2Zmc2V0cy4KKwkgIFNtYWxsIGNsZWFudXBzIGFuZCBjb21tZW50cy4KKwkgIFNldCB0aGUgZGVmYXVsdCBydHNwc3JjIGxhdGVuY3kgdG8gMiBzZWNvbmRzLgorCisyMDA5LTEwLTA1IDIwOjA5OjMwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwYmluOiBhZGQgc29tZSBjb21tZW50cworCisyMDA5LTEwLTA1IDE5OjQ1OjM1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4tbWFyc2hhbC5saXN0OgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgcnRwYmluOiBtb3JlIGJ1ZmZlcmluZyB1cGRhdGVzCisJICBBZGQgc2lnbmFsIHRvIHBhdXNlIHRoZSBqaXR0ZXJidWZmZXIuIFRoaXMgd2lsbCBiZSBlbWl0dGVkIGZyb20gZ3N0cnRwYmluIHdoZW4KKwkgIG9uZSBvZiB0aGUgaml0dGVyYnVmZmVycyBpcyBidWZmZXJpbmcuCisJICBNYWtlIHJ0cGJpbiBjb2xsZWN0IHRoZSBidWZmZXJpbmcgbWVzc2FnZXMgYW5kIHBvc3QgYSBuZXcgYnVmZmVyaW5nIG1lc3NhZ2Ugd2l0aAorCSAgdGhlIG1pbiB2YWx1ZS4KKwkgIFJlbW92ZSB0aGUgc3RhdHMgY2FsbGJhY2sgZnJvbSBqaXR0ZXJidWZmZXIgYnV0IHBhc3MgYSBwZXJjZW50IGludGVnZXIgdG8KKwkgIGZ1bmN0aW9ucyB0aGF0IGFmZmVjdCB0aGUgYnVmZmVyaW5nIHN0YXRlIG9mIHRoZSBqaXR0ZXJidWZmZXIuIFRoaXMgYWxsb3dzIHVzCisJICB0aGVuIHRvIHBvc3QgYnVmZmVyaW5nIG1lc3NhZ2VzIGZyb20gb3V0c2lkZSBvZiB0aGUgaml0dGVyYnVmZmVyIGxvY2suCisKKzIwMDktMTAtMDUgMTM6MzI6MTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBydHBiaW46IHByb3BhZ2F0ZSBidWZmZXItbW9kZSBwcm9wZXJ0eQorCSAgUHJvcGFnYXRlIGJ1ZmZlci1tb2RlIHByb3BlcnR5IHRvIHRoZSBqaXR0ZXJidWZmZXJzLgorCSAgSW50ZXJjZXB0IEJVRkZFUklORyBtZXNzYWdlcyBpbiBydHBiaW4KKworMjAwOS0xMC0wMSAxNzoxNDowOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgaml0dGVyYnVmZmVyOiBkbyBtb3JlIGJ1ZmZlcmluZyBpbXBsZW1lbnRhdGlvbgorCSAgQWRkIGNhbGxiYWNrIGZvciBidWZmZXJpbmcgc3RhdHMuCisJICBDb25maWd1cmUgdGhlIGxhdGVuY3kgaW4gdGhlIGppdHRlcmJ1ZmZlciBpbnN0ZWFkIG9mIHBhc3NpbmcgaXQgd2l0aCBfaW5zZXJ0LgorCSAgQ2FsY3VsYXRlIGJ1ZmZlcmluZyBsZXZlbHMgd2hlbiBwdXNoaW5nIGFuZCBwb3BwaW5nCisJICBQb3N0IGJ1ZmZlcmluZyBtZXNzYWdlcy4KKworMjAwOS0xMC0wMSAxMjo0NjoyMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgaml0dGVyYnVmZmVyOiBmbGVzaCBvdXQgYnVmZmVyaW5nIG1vZGUgc29tZSBtb3JlCisJICBBZGQgYSBidWZmZXJpbmcgc3RhdGUgdG8gdGhlIGppdHRlcmJ1ZmZlciBhbmQgd2FpdCB1bnRpbCBidWZmZXJpbmcgZW5kcyBiZWZvcmUKKwkgIHB1c2hpbmcgb3V0IHBhY2tldHMuCisKKzIwMDktMTAtMDEgMTI6MDk6NTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGhvb2sgdXAgdGhlIG1vZGUgcHJvcGVydHkKKwkgIEV4cG9zZSBhIG1vZGUgcHJvcGVydHkgb24gdGhlIGppdHRlcmJ1ZmZlci4KKwkgIEZpeCB0aGUgY2FzZSB3aGVyZSB0aW1lc3RhbXBzIGFyZSAtMSBpbiB0aGUgY2hlY2sgZm9yIG91dGdvaW5nIHRpbWVzdGFtcHMuCisKKzIwMDktMTAtMDEgMTE6MjA6MDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBqaXR0ZXJidWZmZXI6IGFkZCBidWZmZXJpbmcgbW9kZSBvcHRpb25zCisJICBBZGQgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgZGlmZmVyZW50IGJ1ZmZlcmluZyBtb2RlcyB0aGF0IHRoZSBqaXR0ZXJidWZmZXIgd2lsbAorCSAgc3VwcG9ydC4gRGVmYXVsdCB0byB0aGUgY3VycmVudCBzbGF2ZSBtb2RlLgorCisyMDEwLTAyLTEyIDE1OjU0OjM3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMi5jOgorCSAgdjRsc2luazogbG93ZXIgcmFuayB0byBNQVJHSU5BTAorCisyMDEwLTAyLTEyIDE2OjA2OjQ1ICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdmRlbXV4OiBPYnRhaW4gdGhlIGluZGV4IGZyb20gdGhlIGVuZCBvZiBhbiBmbHYgZmlsZSBpbiBwdXNoIG1vZGUKKwkgIEFsbG93cyBmb3IgYmV0dGVyIHN1cHBvcnQgb2Ygc2Vla2luZyBpbiBmbHYgZmlsZXMgd2hlbiBpbiBwdXNoIG1vZGUKKworMjAxMC0wMS0yMSAxMTo1NToxNSArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogRHJvcCB2aWRlbyBmcmFtZXMgdXAgdG8gdGhlIGRlc2lyZWQga2V5ZnJhbWUgYWZ0ZXIgYSBzZWVrCisJICBUaGUgYXVkaW8gcGFja2V0cyBpbiBBVkkgYXJlIGdlbmVyYWxseSBtdXhlZCB+MC41cyBiZWZvcmUgdGhlCisJICBjb3JyZXNwb25kaW5nIHZpZGVvIHBhY2tldC4gVGhpcyBjaGFuZ2VzIGNhdXNlcyBkb3duc3RyZWFtIHRvIG9ubHkKKwkgIHJlY2VpdmUgcGFja2V0cyB3aXRoIHJvdWdobHkgY29ycmVzcG9uZGluZyB0aW1lc3RhbXBzLgorCisyMDEwLTAxLTE5IDE4OjM1OjQ5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogbW9yZSBESVNDT05UIGhhbmRsaW5nCisJICBBZGQgc29tZSBkZWJ1ZyBpbiB0aGUgRElTQ09OVCBoYW5kbGluZyBjb2RlLgorCSAgV2hlbiB3ZSByZWNlaXZlIGEgRElTQ09OVCBpbiBwdXNoIG1vZGUsIG1hcmsgYWxsIHN0cmVhbXMgYXMgRElTQ09OVC4KKworMjAxMC0wMS0xOSAxMDo1MTowOCArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogRml4IF9oYW5kbGVfc2Vla19wdXNoICgpIGFuZCBuZXcgc2VnZW1lbnQgYmVoYXZpb3VyCisKKzIwMTAtMDEtMTggMTc6MTM6MDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBjbGVhbnVwcworCSAgTWFrZSBzdXJlIHdlIHJlc2V0IHRoZSBkZW11eGVyIGNvcnJlY3RseSB3cnQgcGFyc2luZyB0aGUgaW5kZXguCisJICBEb24ndCBsZWFrIHBlbmRpbmcgc2VlayBldmVudHMuCisJICBSZW5hbWUgc29tZSBtZXRob2RzIHRvIHJlZmxlY3Qgd2hhdCB0aGV5IGRvIGFuZCB0byBhdm9pZCBjb25mdXNpb24gd2l0aCBzaW1pbGFyCisJICBtZXRob2QgbmFtZXMuCisJICBUcnkgdG8gbWFrZSB0aGUgc2Vla2luZyB0aHJlYWRzYWZlIGJ5IHByb3RlY3RpbmcgdGhlIHNldHVwIGNvZGUgd2l0aCBhIGxvY2suCisJICBNYWtlIHN1cmUgd2UgcG9zdCBlcnJvcnMgd2hlbiBhIHNlZWsgZmFpbHMuCisKKzIwMTAtMDEtMTggMTE6NDU6MzggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIGF2aWRlbXV4OiByZW5hbWUgc29tZSB2YXJpYWJsZXMKKwkgIHNlZWtfZXZlbnQgLT4gc2VnX2V2ZW50CisJICBldmVudF9zZWVrIC0+IHNlZWtfZXZlbnQKKworMjAxMC0wMS0xNSAxODowMDo0NiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHRha2UgZmFsbGJhY2sgZHVyYXRpb24gZnJvbSBhdmloCisJICBXaGVuIHdlIGhhdmUgbm90IHBhcnNlZCBhbnkgaW5kZXhlcyB5ZXQsIHdlIGRvbid0IGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgc3RyZWFtcworCSAgYW5kIHdlIG11c3QgdGFrZSB0aGUgbGVuZ3RoIGdpdmVuIGluIHRoZSBhdmloIGFzIGEgZmFsbGJhY2suCisJICBBdm9pZCBzb21lIHR5cGVjaGVja2luZy4KKworMjAwOS0xMi0wNCAxNToxMzoxMiArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogUHVzaCBtb2RlIHNlZWtpbmcgc3VwcG9ydAorCisyMDEwLTAyLTAxIDE2OjA0OjQxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBjbGVhbnVwIHByb3BlcnRpZXMKKwkgIFVzZSBtb3JlIGRlZmF1bHQgY29uc3RhbnRzLgorCSAgVXNlIHN0YXRpYyBzdHJpbmdzIHBhcmFtIGZsYWcuCisJICBJbml0IHByb3BlcnRpZXMgZXhwbGljaXRseSBpbnN0ZWFkIG9mIGxldHRpbmcgZ29iamVjdCBkbyB0aGlzLgorCisyMDEwLTAyLTEyIDE1OjM0OjM4ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSAgc3BlZXg6IGFkZCBtaXNzaW5nIGluY2x1ZGUKKworMjAxMC0wMi0wNSAxMzoyODo1MyArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYzoKKwkgIHRhZ2luamVjdDogZml4IG11bHRpLXZhbHVlIHRhZyBleGFtcGxlCisJICBXZSBuZWVkIHRvIHVzZSB7fSB0byBzcGVjaWZ5IGEgbGlzdC4KKworMjAxMC0wMi0wMSAxNDo0MzowNCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIGF2aSx3YXY6IGFsc28gaGFuZGxlIEpVTlEgY2h1bmsgaW4gYWRkaXRpb24gdG8gSlVOSworCisyMDEwLTAyLTA0IDE1OjU5OjI1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGoya3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkgIHJ0cHBheTogZG9uJ3QgaWdub3JlIHJlc3VsdCBmcm9tIHNldF9vdXRjYXBzCisJICBzZXRfb3V0Y2FwcyBjYW4gZmFpbCBhbmQgd2UgbmVlZCB0byBwcm9wYWdhdGUgdGhlIHJlc3VsdCB1cHN0cmVhbS4KKworMjAxMC0wMi0wNCAxNTozNjoyNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOgorCSAgZmx2cGFyc2U6IGZpeCBjb25mdXNpbmcgZGVidWcgbWVzc2FnZXMKKworMjAxMC0wMS0yNyAxMzoyODoxMyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGFkZCBzb21lIG1vcmUgZGVidWcgaW5mbworCisyMDEwLTAxLTI3IDEzOjI2OjQ2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGF2b2lkIHNlZ2ZhdWx0IHdoZW4gc2h1dHRpbmcgZG93bgorCSAgd2hlbiB3ZSBhcmUgc2h1dHRpbmcgZG93biwgd2UgbWlnaHQgc3RpbGwgcmVjZWl2ZSBzdGF0ZSB1cGRhdGVzIGZyb20gcHVsc2VhdWRpbworCSAgYnV0IHNpbmNlIHdlIGFyZSB1bnBhcmVudGVkIHdlIHNob3VsZCBub3QgZG8gYW55dGhpbmcgd2l0aCB0aGUgTlVMTCBwYXJlbnQKKwkgIGFueW1vcmUuCisKKzIwMTAtMDEtMjYgMTg6MzM6MjcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuaDoKKwkgIHZpZGVvbWl4ZXI6IGZpeCB0aW1lc3RhbXAgcHJvYmxlbXMKKwkgIFdoZW4gdGhlIHBhZCB3aXRoIHRoZSBoaWdoZXN0IGZyYW1lcmF0ZSBnb2VzIEVPUywgaW5zdGVhZCBvZiBub3QgdGltZXN0YW1waW5nCisJICBvdXRwdXQgYnVmZmVycywgaW50ZXBvbGxhdGUgdGltZXN0YW1wcyBhbmQgZHVyYXRpb25zIGZyb20gdGhlIGxhc3Qgc2VlbiBvbmVzLgorCSAgRml4ZXMgIzYwODAyNgorCisyMDEwLTAyLTEyIDExOjMyOjQwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkgIGRvY3M6IFVwZGF0ZSBkb2N1bWVudGF0aW9uCisKKzIwMTAtMDItMTIgMTE6MTg6MjYgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWw6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCSAgTW92ZWQgJ3NoYXBld2lwZScgZnJvbSAtYmFkIHRvIC1nb29kCisJICBGaXhlcyBidWcgIzU4NDUzNi4KKworMjAxMC0wMi0xMCAxMDo1Mjo1MyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMjkvMjldIHNoYXBld2lwZTogUHJlc2VydmUgdGhlIGlucHV0IGNvbG9yIHZhbHVlcyBpbiBhbGwgY2FzZXMKKworMjAxMC0wMi0xMCAxMDo1MDo0OSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMjgvMjldIHNoYXBld2lwZTogU2NhbGUgbWFzayBhbHBoYSB2YWx1ZXMgYnkgdGhlIHNvdXJjZSBhbHBoYSB2YWx1ZXMKKworMjAxMC0wMi0xMCAxMDo0MjozMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMjcvMjldIHNoYXBld2lwZTogRml4IEFSR0IgcHJvY2Vzc2luZworCisyMDEwLTAyLTEwIDEwOjM0OjI0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL3NoYXBld2lwZS1leGFtcGxlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMjYvMjldIHNoYXBld2lwZTogUHJpbnQgc29tZSBtb3JlIGRldGFpbHMgb24gZXJyb3Ivd2FybmluZyBtZXNzYWdlcworCisyMDEwLTAyLTA4IDA4OjI2OjMzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAyNS8yOV0gc2hhcGV3aXBlOiBJbXByb3ZlL2FkZCBkZWJ1ZyBvdXRwdXQKKworMjAxMC0wMi0wOCAwODoyMDo0NCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMjQvMjldIHNoYXBld2lwZTogQWx3YXlzIGhvbGQgdGhlIG1hc2sgbXV0ZXggYmVmb3JlIHNpZ25hbGxpbmcgdGhlIEdDb25kCisKKzIwMTAtMDItMDggMDg6MTk6NDggKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSAgW01PVkVEIEZST00gQkFEIDIzLzI5XSBzaGFwZXdpcGU6IE1vdmUgY2hhaW4gZnVuY3Rpb24gZXJyb3IgY2FzZXMgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24gYW5kIGFkZCB1c2VmdWwgZGVidWcgb3V0cHV0CisKKzIwMTAtMDItMDggMDg6MTI6MTEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAyMi8yOV0gc2hhcGV3aXBlOiBGaXggcmFjZSBjb25kaXRpb24gZHVyaW5nIHNodXRkb3duIHRoYXQgY2FuIGxlYWQgdG8gYSBkZWFkbG9jaworCisyMDEwLTAyLTA4IDA4OjExOjMzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAyMS8yOV0gc2hhcGV3aXBlOiBEcm9wIG1hc2sgYnVmZmVyIG9uIEZMVVNIIGV2ZW50cworCisyMDEwLTAyLTA4IDA4OjA5OjU1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmg6CisJICBbTU9WRUQgRlJPTSBCQUQgMjAvMjldIHNoYXBld2lwZTogVXBkYXRlIGNvcHlyaWdodCB5ZWFyCisKKzIwMTAtMDItMDggMDg6MDg6NDQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSAgW01PVkVEIEZST00gQkFEIDE5LzI5XSBzaGFwZXdpcGU6IERvbid0IHJlc2V0IHByb3BlcnRpZXMgd2hlbiBnb2luZyBQQVVTRUQtPlJFQURZCisJICBBbHNvIHVzZSBkZWZpbmVzIGZvciB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgdGhlIHByb3BlcnRpZXMuCisKKzIwMTAtMDEtMTYgMTY6NTI6MTEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSAgW01PVkVEIEZST00gQkFEIDE4LzI5XSBzaGFwZXdpcGU6IFJlcGxhY2UgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyBpbiB0aGUgaW5uZXIgcHJvY2Vzc2luZyBsb29wcyBieSBpbnRlZ2VyIGFyaXRobWV0aWMKKworMjAwOS0xMi0xMCAxMDo0MDoxMCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTcvMjldIHNoYXBld2lwZTogRG9uJ3QgZG8gcG9pbnRlciBkZXJlZmVyZW5jZXMgaW4gdGhlIHByb2Nlc3NpbmcgbG9vcAorCSAgTG93ZXJzIHRoZSB0aW1lIHRha2VuIHRoZXJlIGluIG15IHRlc3RjYXNlIGZyb20gNi45MSUgdG8gNi4yMCUKKwkgIGFzIG1lYXN1cmVkIGJ5IGNhbGxncmluZC4KKworMjAwOS0wNy0wOCAxNzo1OToyOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTYvMjldIHNoYXBld2lwZTogQWRkIEJHUkEgc3VwcG9ydCBmb3IgdmlkZW8gaW4vb3V0cHV0CisKKzIwMDktMDctMDIgMTE6MjQ6NDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxNS8yOV0gc2hhcGV3aXBlOiBBZGQgc3VwcG9ydCBmb3IgQVJHQiB2aWRlbyBpbnB1dC9vdXRwdXQKKworMjAwOS0wNi0yMyAxODoyMzoxMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMTQvMjldIHNoYXBld2lwZTogQ29ycmVjdGx5IGhhbmRsZSAwLzEgZnBzCisKKzIwMDktMDYtMDkgMTk6MTQ6NDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMy8yOV0gc2hhcGV3aXBlOiBJbXBsZW1lbnQgYmFzaWMgUW9TCisJICBUaGlzIGNoYW5nZSBpcyBiYXNlZCBvbiBUaW0ncyBRb1MgaW1wbGVtZW50YXRpb24KKwkgIGZvciBqcGVnZGVjLgorCisyMDA5LTA2LTA5IDE4OjQ1OjE5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMi8yOV0gc2hhcGV3aXBlOiBQcm94eSBxdWVyaWVzIG9uIHRoZSB2aWRlbyBwYWRzIHRvIHRoZSBjb3JyZWN0IHBlZXJzCisKKzIwMDktMDYtMDkgMTg6Mzc6NDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSAgW01PVkVEIEZST00gQkFEIDExLzI5XSBzaGFwZXdpcGU6IFByb3h5IGJ1ZmZlcmFsbG9jIG9uIHRoZSB2aWRlbyBzaW5rcGFkCisKKzIwMDktMDYtMDkgMTg6MjU6MTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSAgW01PVkVEIEZST00gQkFEIDEwLzI5XSBzaGFwZXdpcGU6IFRyeSB0byB3b3JrIGlucGxhY2UgaWYgcG9zc2libGUKKwkgIFRoaXMgc2F2ZXMgb25lIG5ldywgbGFyZ2UgYWxsb2NhdGlvbiBwZXIgZnJhbWUgZm9yIHRoZQorCSAgbW9zdCBjYXNlcy4KKworMjAwOS0wNi0wNCAwODo1NjoxNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NoYXBld2lwZS5jOgorCSAgW01PVkVEIEZST00gQkFEIDA5LzI5XSBzaGFwZXdpcGU6IEluY3JlYXNlIHRpbWVvdXQgb2YgdGhlIHVuaXQgdGVzdAorCisyMDA5LTA2LTAxIDIxOjI0OjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwOC8yOV0gc2hhcGV3aXBlOiBGaXggc29tZSBpc3N1ZXMgdGhhdCB3ZXJlIGV4cG9zZWQgYnkgdGhlIG5ldyB1bml0IHRlc3QKKworMjAwOS0wNi0wMSAyMToyNDoxMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NoYXBld2lwZS5jOgorCSAgW01PVkVEIEZST00gQkFEIDA3LzI5XSBzaGFwZXdpcGU6IEFkZCB1bml0IHRlc3QgZm9yIHNoYXBld2lwZQorCisyMDA5LTA1LTMxIDIxOjMzOjAxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNi8yOV0gc2hhcGV3aXBlOiBBZGQgZG9jdW1lbnRhdGlvbiBhbmQgaW50ZWdyYXRlIGludG8gdGhlIGJ1aWxkIHN5c3RlbQorCisyMDA5LTA1LTI5IDIxOjA3OjI2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNS8yOV0gc2hhcGV3aXBlOiBBZGp1c3QgYm9yZGVyIHRvIHN0aWxsIGhhdmUgZXZlcnl0aGluZyB0cmFuc3BhcmVudCBhdCAxLjAgYW5kIHRoZSBvdGhlciB3YXkgYXJvdW5kCisKKzIwMDktMDUtMjkgMTY6NTU6MjUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL2dzdHNoYXBld2lwZS5jOgorCSogdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL3NoYXBld2lwZS1leGFtcGxlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgMDQvMjldIHNoYXBld2lwZTogRGl2aWRlIHRoZSBib3JkZXIgdmFsdWUgYnkgdHdvLCBvdGhlcndpc2Ugd2UgdXNlIGEgdHdpY2UgYSB3aWRlIGJvcmRlcgorCisyMDA5LTA1LTI5IDE2OjUxOjUwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmg6CisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMy8yOV0gc2hhcGV3aXBlOiBBZGQgYm9yZGVyIHByb3BlcnR5IHRvIGFsbG93IHNtb290aCBib3JkZXJzCisJICAuLi5hbmQgdXNlIGEgYm9yZGVyIG9mIDAuMDEgaW4gdGhlIGV4YW1wbGUgYXBwbGljYXRpb24uCisKKzIwMDktMDUtMjkgMTY6MDA6MTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvTWFrZWZpbGUuYW06CisJICBbTU9WRUQgRlJPTSBCQUQgMDIvMjldIHNoYXBld2lwZTogRml4IE1ha2VmaWxlIG9mIHRoZSBleGFtcGxlIGFwcGxpY2F0aW9uCisKKzIwMDktMDUtMjkgMTU6MzI6MjQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvc2hhcGV3aXBlL01ha2VmaWxlLmFtOgorCSogZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYzoKKwkqIGdzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmg6CisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMS8yOV0gc2hhcGV3aXBlOiBBZGQgYSBzaW1wbGUgc2hhcGV3aXBlIHRyYW5zaXRpb24gZmlsdGVyICYgZXhhbXBsZSBhcHBsaWNhdGlvbgorCisyMDEwLTAyLTA2IDE4OjE5OjI3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogT25seSBmbHVzaCB0aGUgRkxBQyBkZWNvZGVyIGlmIGl0IHdhc24ndCBjcmVhdGVkIHJpZ2h0IGJlZm9yZQorCSAgSWYgdGhlIEZMQUMgZGVjb2RlciBpcyBmbHVzaGVkLCBpdHMgc3RhdGUgd2lsbCBiZSBzZXQgdG8gZnJhbWUtc3luYyBtb2RlLAorCSAgd2hpY2ggd2lsbCBzeW5jIHRvIHRoZSBuZXh0ICphdWRpbyogZnJhbWUgYW5kIG1ha2VzIGl0IGlnbm9yZSBhbGwgaGVhZGVycy4KKwkgIFRoaXMgcHJldmVudGVkIHRhZ3MgYW5kIGV2ZXJ5dGhpbmcgZWxzZSB0byBzaG93IHVwIHdoZW4gdXNpbmcgZmxhY2RlYworCSAgaW4gcHVzaCBtb2RlLgorCSAgRml4ZXMgYnVnICM2MDg4NDMuCisKKzIwMTAtMDItMTEgMDE6MTI6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBNQUlOVEFJTkVSUzoKKwkgIFVwZGF0ZSBNQUlOVEFJTkVSUworCisyMDEwLTAyLTEyIDAwOjAzOjA5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBiYWNrIHRvIGRldmVsb3BtZW50CisJICBTbHVzaHkgZnJlZXplIHJlbWFpbnMgaW4gZWZmZWN0LgorCis9PT0gcmVsZWFzZSAwLjEwLjE4ID09PQorCisyMDEwLTAyLTEwIDIzOjE4OjIyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2FtbWEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JhbGFuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAwLjEwLjE4CisKKzIwMTAtMDItMTAgMjM6MTc6MjEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisKKzIwMTAtMDItMTAgMjA6MzY6NTYgKzAwMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdGVtcG9yYXJ5IHNhZmV0eSBjaGVjayB0byBhdm9pZCBjcmFzaGVzIHdpdGggYSBjZXJ0YWluIGZpbGUKKwkgIEFkZCB0ZW1wb3JhcnkgY2hlY2sgdG8gYXZvaWQgY3Jhc2hlcyB3aXRoIGEgY2VydGFpbiBmaWxlIHdoZW4gc2Vla2luZworCSAgdW50aWwgdGhlIHJlYWwgY2F1c2Ugb2YgdGhpcyBpcyBmaWd1cmVkIG91dC4gU2VlICM2MDk0MDUuCisKKzIwMTAtMDItMDUgMTg6MDU6MzkgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSAgcXRkZW11eDogc2tpcCB1bmtub3duIGF0b21zIHdoZW4gbG9va2luZyBmb3IgbW9vdgorCSAgRml4ZXMgYnVnICM2MDkxMDcKKworMjAxMC0wMi0wNSAwMjoxMzozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIDAuMTAuMTcuMyBwcmUtcmVsZWFzZQorCisyMDEwLTAyLTA0IDE5OjEwOjM2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vYmcucG86CisJKiBwby9odS5wbzoKKwkgIHBvOiB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMTAtMDItMDQgMTQ6NDY6NTYgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSAgcXRkZW11eDogU2V0IHRoZSBzZWdtZW50IHN0YXJ0IHRpbWUgdG8gdGhlIHJlcXVlc3RlZCBzZWVrIHRpbWUgZm9yIG5vbi1rZXlmcmFtZSBzZWVrcworCisyMDEwLTAyLTA0IDEyOjAwOjAzICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCB0aW1lIHJldHVybmVkIGZvciBpbmRleCBhdCBhIGJ5dGUgb2Zmc2V0CisJICBUaGUgbG9naWMgZm9yIHNlYXJjaGluZyBmb3J3YXJkcy9iYWNrd2FyZHMgd2FzIHN3YXBwZWQKKworMjAxMC0wMi0wMSAxOToyMjoyNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSAgc3BlZXhkZWM6IGluaXRpYWxpemUgc3RlcmVvIGRlY29kaW5nIHN0YXRlCisKKzIwMTAtMDEtMjggMTg6NTg6MDggKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGltcHJvdmUgc3RyZWFtIHN5bmNocm9uaXphdGlvbgorCSAgSW4gcGFydGljdWxhciwgZG8gbm90IG1ha2UgaXQgc2VuZCBuZXdzZWdtZW50IHVwZGF0ZXMgdGhhdAorCSAgc29ydC1vZiBjb250cmFkaWN0IHRoZSBpbmRlbnRlZCBwbGF5YmFjayBzZWdtZW50IChlLmcuIHN0YXJ0IHRpbWUpLgorCisyMDEwLTAxLTI4IDE4OjUzOjE4ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBmaXggYnJpZGdpbmcgKHRpbWUpIGdhcHMgaW4gc3RyZWFtcworCSAgQXMgYSBzaWRlIGVmZmVjdCwgYXZvaWQgc2VuZGluZyBuZXdzZWdtZW50IHVwZGF0ZXMgd2l0aCBzdGFydCB0aW1lcworCSAgdGhhdCBnbyBiYWNrIGFuZCBmb3J0aCwgd2hpY2ggbGVhZHMgdG8gYm9ndXMgZG93bnN0cmVhbSBydW5uaW5nX3RpbWUuCisJICBBbHNvIGZpeGVzIHNlZWtpbmcgaW4gYnVnICM2MDY3NDQuCisKKzIwMTAtMDEtMjggMTg6NDk6NTcgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGZpeCBzdHJlYW0gc3luY2hyb25pemF0aW9uCisJICAuLiBieSBpbml0aWFsaXppbmcgc3RyZWFtcyBzdGFydGluZyBhdCAwLCBhcyB0aGF0IGlzIGJhc2ljYWxseQorCSAgd2hlcmUgd2UgJ3NlZWsgdG8nIGF0IHRoZSBzdGFydCBhbmQgYXNzdW1lIHN0cmVhbXMgdG8gc3RhcnQgZWxzZXdoZXJlLgorCSAgQWxzbyBlbmFibGVzIG5ld3NlZ21lbnQgdXBkYXRlIGV2ZW50cyBmb3Igc3VidGl0bGUgc3RyZWFtcy4KKworMjAxMC0wMi0wMiAxMzo0MTowMyArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnOiBkb24ndCBkaXJlY3RseSBhY2Nlc3MgbWVzc2FnZSwgc29tZSBtZXNzYWdlIGhhdmUgYXJncworCSAgVGhpcyBjYXVzZWQgYm9ndXMgbWVzc2FnZXMsIHN1Y2ggYXMgcmVwb3J0ZWQgaW4gYnVnICM2MDc0NzEuCisKKzIwMTAtMDItMDIgMDA6MDI6MzQgKzAwMDAgIERhdmlkIEhveXQgPGRob3l0QGxsbmwuZ292PgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgcG5nOiBmaXggY29tcGlsYXRpb24gd2l0aCBsaWJwbmcgMS40CisJICBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQgZm9yIGEgd2hpbGUgYW5kIHdhcworCSAgZmluYWxseSByZW1vdmVkIGluIGxpYnBuZyAxLjQueC4gVXNlIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCgpCisJICBpbnN0ZWFkLgorCSAgRml4ZXMgIzYwODYyOS4KKworMjAxMC0wMi0wMSAxNjo0NjozNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZnJlZSB0cmFuc3BvcnRzIG9uIGVycm9ycworCSAgU2VlICM2MDg1NjQKKworMjAxMC0wMi0wMSAwOToxODo1MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDI6IGZpeCB1bnBvcnRhYmxlIHByaW50ZiBmb3JtYXQKKworMjAxMC0wMS0zMCAxNToxODo0OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSAxNWQ0N2E2IHRvIDk2ZGM3OTMKKworMjAxMC0wMS0yNyAxNzo1MzowNyArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgZmx2bXV4OiBpbmRleCB0aW1lc3RhbXBzIHNob3VsZCBiZSBpbiBzZWNvbmRzLCBub3QgbWlsbGlzZWNvbmRzCisKKzIwMTAtMDEtMjcgMTU6MjQ6NTIgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkgIHNwZWV4ZGVjOiBmcmVlIHNvbWUgbW9yZSB3aGVuIHJlc2V0dGluZworCSAgRml4ZXMgIzYwODI1NS4KKworMjAxMC0wMS0yNyAxNToyNDoyNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkgIHJ0cHNwZWV4cGF5OiBmaXggb2NjYXNpb25hbCBidWZmZXIgbGVhaworCSAgRml4ZXMgIzYwODI1NS4KKworMjAxMC0wMS0yNyAxNToyMjo0NiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgc3BlZXhlbmM6IHByZXZlbnQgaW52YWxpZCBhcml0aG1ldGljIGlmIG5vdCBzZXR1cCB5ZXQKKwkgIEZpeGVzICM2MDgyNTUuCisKKzIwMTAtMDEtMjcgMTY6MzQ6MjEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9tbXguaDoKKwkgIHZpZGVvbWl4ZXI6IEZpeCBhc3NlbWJseSByZWdpc3RlciBjb25zdHJhaW50cworCSAgRml4ZXMgYnVnICM2MDgyMDkuCisKKzIwMTAtMDEtMjcgMDE6NTY6MDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjE3LjIgcHJlLXJlbGVhc2UKKworMjAxMC0wMS0yNyAwMTo1Mjo1OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHBvL0xJTkdVQVM6CisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VsLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBwbzogdXBkYXRlIHRyYW5zbGF0aW9ucworCisyMDEwLTAxLTI3IDAxOjQ5OjQ5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkgIGNoZWNrczogaWdub3JlIGRlaW50ZXJsYWNlIGNoZWNrIGJpbmFyeQorCisyMDEwLTAxLTI3IDAxOjE4OjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBwdXJnZSBhbGwgbWVudGlvbiBvZiBDVlMKKworMjAxMC0wMS0yNiAxMToxODoyOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGlnbm9yZSBzdHJlYW1zIHRoYXQgZmluaXNoZWQKKwkgIFdoZW4gd2UgcmVjZWl2ZSBhbiBVTkVYUEVDVEVEIGZyb20gYSBzdHJlYW0sIG1vdmUgdG8gdGhlIG5leHQgc3RyZWFtIGFuZCBvbmx5IGdvCisJICBFT1Mgd2hlbiBhbGwgc3RyZWFtcyBhcmUgRU9TLiBXaGVuIHNlbGVjdGluZyBhIHN0cmVhbSB0byBwdXNoLCBpZ25vcmUgc3RyZWFtcworCSAgdGhhdCB3ZW50IEVPUy4KKwkgIEZpeGVzICM2MDc5NDkKKworMjAxMC0wMS0yNSAxNzoyMzo0MyArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICB2NGwyc3JjOiBkb24ndCBkZXJlZiBOVUxMCisJICBFcnJvciBvdXQgd2hlbiB0aGUgcG9vbCBnZXRzIHNodXRkb3duLgorCisyMDEwLTAxLTI1IDE3OjIxOjEzICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgUmV2ZXJ0ICJ2NGwyc3JjOiBkb24ndCBkZXJlZiBOVUxMIgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCAzZDlkMzRiZDYwZmFlYjk0MGIzNmQ5OTJhNDcxNjhmYzg5NTAzNmJhLgorCisyMDEwLTAxLTI1IDE0OjE2OjIyICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgdjRsMnNyYzogZG9uJ3QgZGVyZWYgTlVMTAorCSAgRXJyb3Igb3V0IHdoZW4gdGhlIHBvb2wgZ2V0cyBzaHV0ZG93bi4KKworMjAxMC0wMS0yMyAxNTozMjo0OCAtMDgwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJICBqcGVnZW5jOiB3aGVuIGNyZWF0aW5nIGFuIG92ZXJmbG93IGJ1ZmZlciwgY29weSB0aW1lc3RhbXBzLgorCisyMDEwLTAxLTIzIDE0OjQ3OjU1ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBkbWIxIGlzIGEgdmFsaWQgZm91cmNjIGZvciBNb3Rpb24tSlBFRworCisyMDEwLTAxLTIzIDE0OjIwOjAyICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRldXg6IElWMzIgaXMgYWxzbyB1c2VkIGZvciBJbmRlbyAzIHZpZGVvIHN0cmVhbXMKKworMjAxMC0wMS0yMiAxNjo0ODowMSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9pY2xlcy94aW1hZ2VzcmMtdGVzdC5jOgorCSAgYnVpbGQ6IG5vIHVudXNlZCB2YXJpYWJsZXMgd2hlbiBkaXNhYmxpbmcgYXNzZXJ0cworCisyMDEwLTAxLTIxIDIzOjE3OjQwIC0wMzAwICBSb2xhbmQgS3Jpa2F2YSA8cmtyaWthdmFAZ21haWwuY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBBdm9pZCBuZWdhdGl2ZSBvdmVyZmxvdyBvbiBrZXlmcmFtZSBzZWFyY2gKKwkgIERvIG5vdCBvdmVyZmxvdyBuZWdhdGl2ZWx5IHdoZW4gc2VhcmNoaW5nIGEgcHJldmlvdXMKKwkgICJrZXlmcmFtZSIgb24gYXVkaW8gc3RyZWFtcy4gQ291bGQgY2F1c2UgaW5maW5pdGUgbG9vcHMKKwkgIG9uIGJhY2t3YXJkcyBwbGF5YmFjaworCSAgRml4ZXMgIzYwNzcxOAorCisyMDEwLTAxLTIxIDE3OjIyOjM4IC0wODAwICBQZXRlciB2YW4gSGFyZGVuYmVyZyA8cHZoQHNvbmdiaXJkbmVzdC5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuaDoKKwkgIGpwZWdlbmM6IGVubGFyZ2UgYnVmZmVyIGlmIGxpYmpwZWcgdGVsbHMgdXMgaXQncyBvdXQgb2Ygc3BhY2UuIEZpeGVzIGJ1ZmZlciBvdmVyZmxvdyBvbiBzb21lIGhpZ2gtcXVhbGl0eSwgbG93LXJlc29sdXRpb24ganBlZyBlbmNvZGVzLgorCisyMDEwLTAxLTIxIDE5OjI0OjIyICswMTAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IGNvbXBpbGVyIHdhcm5pbmdzIHVuZGVyIE9TIFguCisKKzIwMTAtMDEtMjEgMTc6NTc6MzYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBkb24ndCBwYXJzZSBOVUxMIGluZGV4ZXMKKwkgIGZvciBzb21lIHN0cmVhbXMgd2UgbWlnaHQgZmFpbCB0byBmZXRjaCB0aGUgaW5kZXggb2Zmc2V0cy4gRG9uJ3QgdHJ5IHRvIHBhcnNlCisJICBOVUxMIGluZGV4ZXMgaW4gdGhvc2UgY2FzZXMuCisKKzIwMTAtMDEtMTggMjE6MTU6NTEgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6CisJICBydHBnNzI5cGF5OiBwdGltZSBzaG91bGQgaXMgaW4gbmFub3NlY29uZHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MDc0MDMKKworMjAxMC0wMS0yMCAxNToxMToxNSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5oOgorCSAgd2F2ZW5jOiBQb3N0IHdhcm5pbmcgaWYgZmlsZSBpc250IGZpbmlzaGVkIHByb3Blcmx5CisJICBXaGVuIHRoZSBwaXBlbGluZSBpcyBzaHV0IGRvd24gYW5kIHRoZSBmaWxlIGlzbid0CisJICBmaW5pc2hlZCBwcm9wZXJseSwgd2F2ZW5jIHNob3VsZCBwb3N0IGEgd2FybmluZy4KKwkgIEZpeGVzICM2MDc0NDAKKworMjAwOS0wNS0yNyAxMzo1MTo0NCArMDIwMCAgQXJub3V0IFZhbmRlY2FwcGVsbGUgPGFybm91dEBtaW5kLmJlPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJICBtYXRyb3NrYW11eDogbWFrZSBpbmRleCBzaXplIGNvbmZpZ3VyYWJsZS4KKwkgIEFkZGVkIHRoZSAnbWluLWluZGV4LWludGVydmFsJyBwcm9wZXJ0eSB0byBtYXRyb3NrYW11eCwKKwkgIHdoaWNoIGRldGVybWluZXMgaG93IG11Y2ggdGltZSAobmFub3NlY29uZHMpIGlzIGxlZnQKKwkgIGJldHdlZW4ga2V5ZnJhbWVzIHN0b3JlZCBpbiB0aGUgaW5kZXguCisJICBGaXhlcyAjNTgzOTg1LgorCisyMDEwLTAxLTIwIDE2OjI4OjMxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IHNjYWxlIHNwc3Bwc19pbnRlcnZhbCB0byBtaWxsaXNlY29uZHMKKwkgIFRoZSBzcHNwcHNfaW50ZXJ2YWwgaXMga2VwdCBpbiBzZWNvbmRzLiBDb252ZXJ0IGl0IHRvIG1pbGxpc2Vjb25kcyBiZWZvcmUKKwkgIGNvbXBhcmluZyBpdCB0byBhbm90aGVyIHZhbHVlIGluIG1pbGxpc2Vjb25kcy4KKworMjAxMC0wMS0yMCAxNToxODo0NyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFsd2F5cyBrZWVwIG1lZGlhIHNlZ21lbnRzIHdpdGhpbiB0b3RhbCBkdXJhdGlvbgorCSAgLi4uIGFzIG9wcG9zZWQgdG8gb25seSBkb2luZyBzbyBmb2xsb3dpbmcgYSBzZWVrLgorCisyMDEwLTAxLTIwIDE1OjQ0OjQwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IHJlbmFtZSBzcHNwcHMtaW50ZXJ2YWwgcHJvcGVydHkKKwkgIFJlbmFtZSB0aGUgc3BzcHBzLWludGVydmFsIHByb3BlcnR5IHRvIGNvbmZpZy1pbnRlcnZhbCBiZWNhdXNlIGl0IGlzIG5pY2VyLgorCisyMDEwLTAxLTE5IDE4OjM3OjMxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogc2tpcCBSSUZGIGFuZCBpbmRleCBpbiBwdXNoIG1vZGUKKwkgIFdoZW4gd2UgYXJlIGluIHB1c2ggbW9kZSwgd2UgY2FuIGVuY291bnRlciBSSUZGIGFuZCBpZHggdGFncyBpbiB0aGUgZGF0YSBjaHVuaworCSAgd2hlbiB3ZSBhcmUgZGVhbGluZyB3aXRoIE9ETUwgZmlsZXMuIEluIHRoZXNlIGNhc2VzLCBzaW1wbHkgc2tpcCB0aGUgY2h1bmtzIGFuZAorCSAgY29udGludWUgc3RyZWFtaW5nIGluc3RlYWQgb2YgZ29pbmcgRU9TLgorCisyMDEwLTAxLTIwIDExOjI3OjIzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogbW9yZSBESVNDT05UIGhhbmRsaW5nCisJICBBZGQgc29tZSBkZWJ1ZyBpbiB0aGUgRElTQ09OVCBoYW5kbGluZyBjb2RlLgorCSAgV2hlbiB3ZSByZWNlaXZlIGEgRElTQ09OVCBpbiBwdXNoIG1vZGUsIG1hcmsgYWxsIHN0cmVhbXMgYXMgRElTQ09OVC4KKworMjAxMC0wMS0yMCAxMToyNjozNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHJlc2V0IG9uIGZsdXNoIGV2ZW50cworCSAgV2hlbiB3ZSByZWNlaXZlIGEgZmx1c2ggZXZlbnQgb24gdGhlIHNpbmtwYWQsIHJlc2V0IHRoZSBFT1Mgc3RhdGUgYW5kIHRoZQorCSAgZmxvd3JldHVybiBvZiBhbGwgc3RyZWFtcy4gQWxzbyBtYXJrIHRoZSBzdHJlYW1zIHdpdGggYSBESVNDT05ULgorCisyMDEwLTAxLTIwIDExOjIyOjA0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogcmVuYW1lIHNvbWUgdmFyaWFibGUKKwkgIFJlbmFtZSB0aGUgc2Vla19ldmVudCB2YXJpYWJsZSB0byBzZWdfZXZlbnQgYmVjYXVzZSBpdCByZWFsbHkgY29udGFpbnMgdGhlCisJICBuZXdzZWdtZW50IGV2ZW50IHRoYXQgbmVlZHMgdG8gYmUgcHVzaGVkLgorCisyMDEwLTAxLTIwIDAwOjU0OjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDE0Y2VjODkgdG8gMTVkNDdhNgorCisyMDEwLTAxLTE4IDE0OjQ5OjI2IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBydHBoMjY0cGF5OiBEb24ndCBzZXQgcHJvZmlsZS1sZXZlbC1pZCBpbiBvdXQgY2FwcworCSAgVGhlIHByb2ZpbGUtbGV2ZWwtaWQgcmVwcmVzZW50cyByZXN0cmljdGlvbnMgb24gd2hhdCBjYW4gYmUgc2VudCwgaXQgZG9lcyBub3QKKwkgIGRlc2NyaWJlIHRoZSBzdHJlYW0uIFNvIGl0IHNob3VsZCBiZSByZWZsZWN0ZWQgaW4gdGhlIHNpbmsgY2FwcyBvZiB0aGUKKwkgIHBheWxvYWRlciwgbm90IHRoZSBzcmMgY2Fwcy4KKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MDczNTMKKworMjAxMC0wMS0xOCAxNDo0MToxMCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIGZyb20gc2V0X291dGNhcHMKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MDczNTMKKworMjAxMC0wMS0xOCAxNzo0Mzo0MSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aG1hY3Jvcy5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZWJmZi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZXRmZi5jOgorCSAgZGVpbnRlcmxhY2U6IEZpeCBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgaGVhZGVycworCisyMDEwLTAxLTE4IDE0OjU3OjQyICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJICB2NGwyOiBtb3ZlIEdfRU5EX0RFQ0xTIHRvIHRoZSBlbmQKKworMjAxMC0wMS0xOCAxNDo1NTozOCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuaDoKKwkgIHY0bDI6IGZpeCBidWZmZXJwb29sIGZpbGUgbmFtZXMgaW4gaGVhZGVyIGNvbW1lbnQKKworMjAxMC0wMS0xNSAxODoxNToxNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGF2b2lkIHNvbWUgdHlwZWNhc3RpbmcKKworMjAxMC0wMS0xNSAxODoxMzoyNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGF2b2lkIHNvbWUgdHlwZSBjaGVja3MKKworMjAxMC0wMS0xNSAxODowOToxNSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgYXZpZGVtdXg6IGZhbGxiYWNrIHRvIGF2aWggZHVyYXRpb24KKwkgIHdoZW4gd2UgaGF2ZSBub3QgeWV0IHBhcnNlZCB0aGUgaW5kZXhlcyAoaW4gcHVzaCBtb2RlLCBmb3IgZXhhbXBsZSkgdXNlCisJICB0aGUgZHVyYXRpb24gYXMgZ2l2ZW4gaW4gdGhlIGF2aWggaGVhZGVyIGluc3RlYWQgb2YgLTEuCisKKzIwMTAtMDEtMTUgMTM6MzI6MzIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBnX2ZyZWUgaXMgTlVMTCBzYWZlCisKKzIwMTAtMDEtMTUgMTM6Mjc6NDAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiB1c2UgREVNVVggZXJyb3JzLCBpbnN0ZWFkIG9mIERFQ09ERQorCSAgcXRkZW11eCBzaG91bGQgdXNlIERFTVVYIGVycm9ycywgYW5kIG5vdCBERUNPREUKKwkgIENvbmZsaWN0czoKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYworCisyMDEwLTAxLTE0IDE5OjE2OjE5IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogTWlub3IgcmVmYWN0b3IKKwkgIFJlcGxhY2UgcmVwZWF0ZWQgY29kZSB3aXRoIGEgZnVuY3Rpb24gY2FsbAorCisyMDEwLTAxLTE0IDE3OjExOjEzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IEhhbmRsZSBhbm90aGVyIGtpbmQgb2YgcmVkaXJlY3QgdHJhaworCSAgU29tZSB0cmFrcyBtaWdodCBjb250YWluIGEgcmVkaXJlY3QgcnRzcCB1cmkgaW5zaWRlCisJICBobmRsIGF0b20gKHdoaWNoIGlzIGEgZHJlZiBhdG9tIGVudHJ5KS4gVGhpcyBjb21taXQgbWFrZXMgcXRkZW11eAorCSAgcG9zdCBhIG1lc3NhZ2Ugd2hlbiBpdCBmaW5kcyBvbmUgb2YgdGhlc2UgdHJha3MgYW5kIHRoZXJlIGFyZQorCSAgbm8gb3RoZXIgdHJha3MuCisJICBGaXhlcyAjNTk3NDk3CisKKzIwMTAtMDEtMTQgMTY6MTM6MDggLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBQb3N0IGVycm9yIHdoZW4gcmVhY2hpbmcgRU9TIHdpdGhvdXQgcGFkcworCSAgUG9zdCBhbiBlcnJvciB3aGVuIEVPUyBpcyByZWFjaGVkIGFuZCB0aGVyZSBhcmUgbm8gc3JjIHBhZHMKKworMjAxMC0wMS0xNCAxNDoxMzo1MCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERvIG5vdCBwb3N0IGVtcHR5IHJlZGlyZWN0IG1lc3NhZ2VzCisJICBTb21lIG1pc2ludGVycHJldGVkIGRhdGEgY291bGQgcmVzdWx0IGluIHBvc3RpbmcgcmVkaXJlY3QgbWVzc2FnZXMKKwkgIHdpdGggZW1wdHkgcmVkaXJlY3Qgc3RyaW5ncy4gSXQgaXMgYmV0dGVyIG5vdCB0byBwb3N0IHRoZW0uCisJICBBbiBleGFtcGxlIGlzIHRoZSBmaWxlIG9uIGJ1ZyAjNTk3NDk3CisKKzIwMTAtMDEtMTQgMTg6MTk6MjUgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IHBvbGlzaCBsYXN0IGJ1ZmZlciBlbmQgdGltZSB1c2FnZQorCSAgVGhhdCBpcywgcmVzZXQgaXQgdXBvbiBzZWVrLCBhbmQgbm90ZSB0aGF0IChyYXJlbHkpIGxhc3QgcHVzaGVkIGJ1ZmZlcgorCSAgdGltZSBtaWdodCBwcmVjZWRlIHNlZ21lbnQgc3RhcnQuCisKKzIwMTAtMDEtMTMgMTY6NDg6NDYgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfbW14Lmg6CisJICB2aWRlb21peGVyOiB1c2UgJ3EnIGNvbnN0cmFpbnQgaW5zdGVhZCBvZiAncicKKwkgIFRoaXMgYXZvaWRzIHRoZSAiYmFkIHJlZ2lzdGVyIG5hbWUgYCVkaWwnIiBjb21waWxhdGlvbiBlcnJvcnMgb24gMzJiaXQgd2hlcmUKKwkgIGJlY2F1c2Ugb2YgJ3InIGdjYyBwdXRzIHRoZSB2YWx1ZSBpbiBhIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBhbmQgdGhlbiB0cmllcworCSAgdG8gYWNjZXNzIHRoZSBsb3dlciBwYXJ0IGFzICVkaWwvJXNpbCB3aGljaCBpcyBub3QgZXhpc3Rpbmcgb24gMzJiaXQuICdxJyByZXF1ZXN0cworCSAgYS1kIHJlZ2lzdGVycworCisyMDEwLTAxLTEzIDE2OjQ0OjU4ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aTogYWRkIG1pc3NpbmcgaW5jbHVkZSBmb3Igc3NjYW5mCisKKzIwMTAtMDEtMTMgMDk6MzY6MDMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkgIGVxdWFsaXplcjogRml4IHByb3BlcnR5IGRlc2NyaXB0aW9uIGZvciB0aGUgM3JkIGJhbmQgb2YgdGhlIDEwYmFuZCBlcXVhbGl6ZXIKKwkgIFRoZSBmcmVxdWVuY3kgaXMgYWN0dWFsbHkgMjM3IEh6LCBub3QgMjI3IEh6LgorCSAgRml4ZXMgYnVnICM2MDY2OTIuCisKKzIwMTAtMDEtMTMgMDk6MjI6MjAgKzAxMDAgIEtpcHAgQ2Fubm9uIDxrY2Fubm9uQGxpZ28uY2FsdGVjaC5lZHU+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOgorCSAgYXVkaW9hbXBsaWZ5OiBBbGxvdyBuZWdhdGl2ZSBhbXBsaWZpY2F0aW9ucworCSAgRml4ZXMgYnVnICM2MDY4MDcuCisKKzIwMTAtMDEtMTMgMDk6MTc6MDUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvdGFnbGliL2dzdGFwZXYybXV4LmNjOgorCSAgYXBldjJtdXg6IERvbid0IGNhbGwgY29uc3RydWN0b3JzIGRpcmVjdGx5LCB0aGlzIGxlYWRzIHRvIGNvbXBpbGVyIGVycm9ycyB3aXRoIGdjYyA0LjUKKworMjAxMC0wMS0xMiAxNzozOTowNSArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdXNlIEdfR1NJWkVfRk9STUFUIGZvciBwbGF0Zm9ybSBpbmRlcGVuZGVudCBnc2l6ZSBxdWFsaWZpZXIKKwkgIEZpeGVzIGJ1aWxkIG9uIG1hY29zeAorCisyMDEwLTAxLTExIDE5OjAyOjM0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiByZWZhY3RvciBlb3Mgc2VuZGluZyB3aGVuIHBhdXNpbmcgbG9vcAorCSAgQWxzbywgcHJldmVudCBoYW5naW5nIGlmIG5vIHBhZHMgeWV0IG9uIHdoaWNoIHRvIHNlbmQgZW9zIGJ5CisJICBwb3N0aW5nIGEgbWVzc2FnZSBpbnN0ZWFkLgorCisyMDEwLTAxLTExIDE3OjUwOjM1ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBzdGFuZGFyZGl6ZSBzZWVrIGhhbmRsaW5nCisJICAuLi4gd2hpY2ggaW1wbGllcyBmaXhpbmcgc29tZSBjb3JuZXIgY2FzZXMuCisKKzIwMTAtMDEtMTEgMTU6MTQ6MDYgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogdXNlIG1vcmUgZ2VuZXJpYyB4aXBoTl9zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIGhlbHBlcgorCisyMDEwLTAxLTExIDE3OjUwOjA0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IHJlZmxvdyBhdWRpbyBhbmQgdmlkZW8gc2V0Y2FwcyBhbmQgaW1wcm92ZSBsb2dnaW5nCisJICBBbHNvIGVuc3VyZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBhdmFpbGFibGUgYXMgdGhleSBhcmUgbWFuZGF0b3J5CisJICBpbiBtYXRyb3NrYSBzcGVjcy4KKworMjAxMC0wMS0xMSAxMTo0Mjo0MyAtMDgwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHNvbmdiaXJkbmVzdC5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBvZmZzZXQgZm9yIHR5cGUgMiBtcDRhIHNvdW5kIHNhbXBsZSBkZXNjcmlwdGlvbnMuCisJICBBbGxvd3MgdXMgdG8gY29ycmVjdGx5IGZpbmQgdGhlIGVzZHMgKGFuZCB0aHVzIHRoZSBjb2RlYyBkYXRhKSBmb3Igc3VjaAorCSAgbXA0YSBmaWxlcy4KKworMjAxMC0wMS0xMSAxNTo0NTo0OSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkgIHJ0cG1wNGcoZGUpcGF5OiBPbmx5IGhhbmRsZSByYXcgYWFjCisJICBydHBtcDRnKGRlKXBheSBzaG91bGQgb25seSBoYW5kbGUgcmF3IEFBQyBzdHJlYW1zCisKKzIwMTAtMDEtMTEgMTg6NTk6NDMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmg6CisJICB2aWRlb21peGVyOiBJbXBsZW1lbnQgYmFzaWMgUW9TCisJICBUaGlzIGRyb3BzIGZyYW1lcyBpZiB0aGV5J3JlIHRvbyBsYXRlIGFueXdheSBiZWZvcmUgYmxlbmRpbmcgYW5kIGFsbAorCSAgdGhhdCBzdGFydHMgYnV0IFFvUyBldmVudHMgYXJlIG5vdCBmb3J3YXJkZWQgdXBzdHJlYW0uIEluIHRoZSBmdXR1cmUKKwkgIHRoZSBRb1MgZXZlbnRzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBzb21laG93IGFuZCBmb3J3YXJkZWQgdXBzdHJlYW0uCisKKzIwMTAtMDEtMTEgMTQ6NDg6MjYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJICBydHBtcDRhKGRlKXBheTogT25seSBhY2NlcHQgcmF3IGFhYworCSAgcnRwbXA0YShkZSlwYXkgc2hvdWxkIG9ubHkgaGFuZGxlIHJhdyBhYWMgdG8gY29uZm9ybSB0byB0aGUgUkZDCisKKzIwMTAtMDEtMTEgMTg6MzU6NDcgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfbW14Lmg6CisJICB2aWRlb21peGVyOiBBZGQgTU1YIGltcGxlbWVudGF0aW9ucyBmb3IgSTQyMCBhbmQgYWxsIG5vbi1hbHBoYSBSR0IgZm9ybWF0cworCisyMDEwLTAxLTA0IDEwOjI0OjQ1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuaDoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2F5dXYuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2JncmEuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2k0MjAuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX21teC5oOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfcmdiLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmg6CisJICB2aWRlb21peGVyOiBSZWZhY3RvciBwcm9jZXNzaW5nIGZ1bmN0aW9ucworCSAgVGhpcyBhbGxvd3MgZWFzaWVyIHBsdWdnaW5nIG9mIG9wdGltaXplZCBwcm9jZXNzaW5nIGZ1bmN0aW9ucworCSAgaW4gdGhlIGZ1dHVyZSwgbGlrZSBmb3IgU1NFIG9yIEFsdGlWZWMuCisKKzIwMTAtMDEtMTEgMTM6MjY6MzIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgYXZpbXV4OiBtYXRyb3NrYW11eDogcmVuYW1lIGFhYydzIHN0cmVhbS1mb3JtYXQgdG8gcmF3CisJICBBQUMncyBub25lIHN0cmVhbS1mb3JtYXQgaGFzIGJlZW4gcmVuYW1lZCB0byByYXcsIHJlbmFtZQorCSAgb24gYXZpbXV4IGFuZCBtYXRyb3NrYW11eCBhcyB3ZWxsCisKKzIwMTAtMDEtMTEgMTI6MDc6MjkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogT25seSBhY2NlcHQgcmF3IGFhYworCSAgbWFrZXMgbWF0cm9za2FtdXggcmVqZWN0IGFhYyBzdHJlYW1zIHRoYXQgYXJlIG5vdAorCSAgaW4gcmF3IGZvcm1hdCAoc3RyZWFtLWZvcm1hdD1ub25lKQorCSAgRml4ZXMgIzU5ODM1MAorCisyMDEwLTAxLTExIDEyOjA4OjU1IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogT25seSBhY2NlcHQgcmF3IGFhYworCSAgbWFrZXMgYXZpbXV4IHJlamVjdCBhYWMgc3RyZWFtcyB0aGF0IGFyZSBub3QKKwkgIGluIHJhdyBmb3JtYXQgKHN0cmVhbS1mb3JtYXQ9bm9uZSkKKwkgIEZpeGVzICM1OTgzNTAKKworMjAxMC0wMS0xMSAxMDozODoxMCArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBPb3BzLiBUaGUgZ3BvaW50ZXIgY2FzdCBpcyBuZWVkZWQgYmVjYXVzZSBvZiB0aGUgY29uc3QgcXVhbGlmaWVycyBvbiB0aGUgZGF0YSBlbGVtZW50cworCisyMDEwLTAxLTExIDEwOjE3OjU0ICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERlYnVnIC0+IGluZm8gbGV2ZWwgZm9yIGEgbWVzc2FnZSBmb3IgYmVuY2htYXJraW5nIGluZGV4IHBhcnNpbmcKKwkgIFRoZSBleHRyYSBtZXNzYWdlIG91dHB1dCBhdCBoaWdoZXIgbGV2ZWxzIGFmZmVjdHMgdGhlIGFjY3VyYWN5IG9mIHRoZQorCSAgYmVuY2htYXJrLgorCisyMDEwLTAxLTExIDEwOjA1OjEwICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IERvbid0IGNoZWNrIGZvciBOVUxMIHBvaW50ZXJzIG9yIGNhc3QgdG8gZ3BvaW50ZXIgYXMgdGhpcyBpcyBub3QgbmVlZGVkCisKKzIwMTAtMDEtMDggMTM6NTU6MDUgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogUmVmYWN0b3Igc3RibCBzdWItYXRvbSBmcmVlaW5nLiBGcmVlIHdoZW4gaW5kZXggaGFzIGJlZW4gY29tcGxldGVseSBwYXJzZWQuCisKKzIwMTAtMDEtMDggMTQ6MzI6MDYgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQXZvaWQgd2hpdGVzcGFjZSBjb21taXRzIGR1ZSB0byBpbmNvbnNpc3RlbnQgR05VIGluZGVudCBiZWhhdmlvdXIKKworMjAxMC0wMS0xMSAwMDoxMDozNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHJlbW92ZSBuZXdsaW5lIGF0IGVuZCBvZiBkZWJ1ZyBzdGF0ZW1lbnQKKworMjAxMC0wMS0wOCAxOToyNjoyMSArMDEwMCAgSGF2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAdGFuZGJlcmcuY29tPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgbXVsdGl1ZHBzaW5rOiBDb21waWxlciB3YXJuaW5nIGZpeGVzIGZvciBXaW5kb3dzCisJICBKdXN0IHNpbXBsZSBtaXNzaW5nIGNhc3RzCisJICBGaXhlcyBidWcgIzYwNjQzOC4KKworMjAxMC0wMS0wOCAxODowNDoxNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IGZpeCBzZWVrcG9pbnRzIHByb3BlcnR5IGNvcHktYW5kLXBhc3RlIGRvY3VtZW50YXRpb24KKworMjAxMC0wMS0wNiAxNzowNjo1MyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuaDoKKwkgIGZsYWNlbmM6IG9wdGlvbmFsbHkgYWRkIGEgc2VlayB0YWJsZQorCSAgQVBJOiBHc3RGbGFjRW5jOnNlZWtwb2ludHMKKwkgIEZpeGVzICMzNTE1OTUuCisKKzIwMTAtMDEtMDggMTE6MzM6MDIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogVXNlIG1vcmUgZ2xpYiBhbmQgYmUgc2FmZXIKKwkgIEJlIHNhZmVyIG9uIHNzY2FuZiBieSBsaW1pdGluZyBzdHJpbmcgZm9ybWF0IHNpemVzLgorCSAgUmVtb3ZlIHVzZWxlc3MgcGFyYW1ldGVyIGFuZCB1c2UgZ19zdHJuZHVwLgorCisyMDEwLTAxLTA4IDEwOjQ0OjQ0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IFNpbXBsaWZ5aW5nIGNvZGUKKwkgIEdyZWF0bHkgc2ltcGxpZnkgdGhlIElESVQgY2h1bmsgaGFuZGxpbmcgYnkgdXNpbmcgc3NjYW5mCisJICBpbnN0ZWFkIG9mICdtYW51YWxseScgcGFyc2luZy4gQWxzbyByZXBsYWNlcyBzdHJuY2FzZWNtcCBhbmQKKwkgIGlzX2FscGhhL2lzX2RpZ2l0IHdpdGggZ2xpYiB2ZXJzaW9ucy4KKworMjAxMC0wMS0wOCAxMDoxODozMCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBpdCdzIGZlYiBmb3IgZmVicnVhcnkKKwkgIEZpeCB0eXBvIGluIGxhc3QgY29tbWl0LgorCisyMDEwLTAxLTA4IDA5OjE3OjIyIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IFBhcnNlIGFuZCBwb3N0IElESVQgZGF0ZXMKKwkgIFBhcnNlcyBhbmQgcG9zdCBkYXRlIHRhZ3MgY29udGFpbmVkIGluIElESVQgY2h1bmtzLgorCSAgRml4ZXMgIzUwMzU4MgorCisyMDEwLTAxLTA3IDE3OjI1OjA1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9maXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5oOgorCSAgYXVkaW9meGJhc2VmaXJmaWx0ZXI6IEFkZCBwcm9wZXJ0eSBmb3Igbm90IGRyYWluaW5nIHRoZSBoaXN0b3J5IG9uIGtlcm5lbCBjaGFuZ2VzCisJICBDdXJyZW50bHkgdGhpcyBvbmx5IHdvcmtzIGlmIHRoZSBrZXJuZWwgc2l6ZSBkb2Vzbid0IGNoYW5nZSwgaW4gdGhlIGZ1dHVyZQorCSAgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIGtlcm5lbCBzaXplIHRvbyB3aXRob3V0IGRyYWluaW5nCisJICB0aGUgY29tcGxldGUgaGlzdG9yeSBhbmQgd2l0aG91dCBsb29zaW5nIGFueXRoaW5nLgorCSAgUGFydGlhbGx5IGJhc2VkIG9uIGEgcGF0Y2ggYnkKKwkgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisyMDEwLTAxLTA3IDE2OjU4OjU1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgIHJ0cGgyNjRwYXk6IHJlbW92ZSB3ZWlyZCBtZW1jbXAgY29kZQorCSAgVXNlIHBsYWluIG1lbWNtcCBmb3IgY29tcGFyaW5nIG1lbW9yeSBpbnN0ZWFkIG9mIHRoZSBjdXN0b20gYnVnZ3kgb25lLgorCSAgRml4ZXMgIzYwNjE5OAorCisyMDEwLTAxLTA3IDE1OjM4OjM2ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGxldmVsOiBmaXggdHlwbyBpbiAnbWVzc2FnZScgcHJvcGVydHkgZGVzY3JpcHRpb24KKworMjAxMC0wMS0wNiAxNDowNjoxNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWNkZWM6IHJlYWxseSB1c2UgdXBzdHJlYW0gdGltZXN0YW1wIGlmIHRoZXJlIGlzIG9uZQorCSAgU2VlL2ZpeGVzICM2MDM0NzEuCisKKzIwMTAtMDEtMDYgMTM6NDU6NTkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSAgcnRwZzcyOHBheTogcmVtb3ZlIHVudXNlZCBhZGFwdGVyIHBlZWsKKworMjAxMC0wMS0wNSAxOTowMDozNSAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogSW1wcm92ZSBwYXNzdGhyb3VnaCB0ZXN0cworCSAgSW1wcm92ZSBwYXNzdGhyb3VnaCB0ZXN0cyBieSBmb3JjaW5nIG1vcmUgc3BlY2lmaWMKKwkgIGludGVybGFjZWQvZGVpbnRlcmxhY2VkIGNhcHMgdG8gYmUgdGVzdGVkCisKKzIwMTAtMDEtMDUgMTg6MjI6NDkgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEFkZHMgc29tZSBkb2NzIHRvIHRoZSBuZXcgdGVzdHMKKwkgIEFkZHMgc29tZSBkb2NzIGV4cGxhaW5pbmcgdGhlIHV0aWxpdHkgZnVuY3Rpb25zIG9mIHRoZSBjaGVjaworCSAgdGVzdHMgb2YgZGVpbnRlcmxhY2UKKworMjAxMC0wMS0wNSAxODoxNDowOCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogQWRkcyB0ZXN0cyBmb3IgcGFzc3Rocm91Z2gKKwkgIEFkZHMgdGVzdHMgZm9yIGNoZWNraW5nIGlmIHRoZSBlbGVtZW50IHJlYWxseSBkb2VzCisJICBwYXNzdGhyb3VnaCBpbiBkaXNhYmxlZCBtb2RlIGFuZCBpbiBhdXRvIChpZiB0aGUgaW5wdXQgaXMKKwkgIG5vdCBpbnRlcmxhY2VkKQorCisyMDEwLTAxLTA1IDA3OjUwOjUxIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEFkZHMgdGVzdHMgZm9yIGNhcHMgYWNjZXB0YW5jZQorCSAgQWRkcyBjaGVjayB1bml0IHRlc3RzIGZvciBkZWludGVybGFjZSBmb3IgdmFsaWRhdGluZworCSAgY2FwcyBhY2NlcHRpbmcgYW5kIHRoZSBleHBlY3RlZCBjYXBzIG91dHB1dCBvbiB0aGUKKwkgIG90aGVyIHBhZAorCisyMDEwLTAxLTA0IDEzOjQzOjAwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IEFkZHMgYmFzaWMgY2hlY2sgdGVzdAorCSAgQWRkcyBhIGJhc2ljIGNoZWNrIHRlc3QgZm9yIGRlaW50ZXJsYWNlIGVsZW1lbnQKKworMjAxMC0wMS0wNCAxNTo0NDoyOCAtMDgwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHNvbmdiaXJkbmVzdC5jb20+CisKKwkqIGdzdC9xdGRlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWRkIHN1cHBvcnQgZm9yIHdhdmUtc3R5bGUgYXVkaW8gaW4gcXQuCisJICBVc2VzIGdzdHJpZmYgdG8gcGFyc2UgdGhlIHdhdmUgaGVhZGVycyBhcHByb3ByaWF0ZWx5LiBUZXN0ZWQgd2l0aCBNUy1BRFBDTQorCSAgY29udGVudC4KKworMjAwOS0xMi0zMSAxNzowOTowMyAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgdGVzdHM6IEFkZCBHLjcyOSBSVFAgcGF5bG9hZGVyL2RlcGF5bG9hZGVyIHRlc3QKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MDYwNTAKKworMjAwOS0xMi0zMSAxNjo1MjozMCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkgIHJ0cGc3MjlwYXk6IFNpbXBsaWZ5IGFkYXB0ZXIgdXNhZ2UKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MDYwNTAKKworMjAwOS0xMi0zMSAxNjoyNzozMCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkgIHJ0cGc3MjlwYXk6IFN1cHBvcnQgcHRpbWUgZnJvbSBjYXBzCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjA2MDUwCisKKzIwMDktMTItMDIgMTk6MzU6MjEgKzA1MzAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9SRUFETUU6CisJICBydHA6IEFkZCBtYXhwdGltZSB0byB0aGUgUkVBRE1FCisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjA2MDUwCisKKzIwMTAtMDEtMDUgMTk6MDM6MDYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM2RlcGF5Lmg6CisJICBydHBnNzIzZGVwYXk6IGFkZCBHNzIzIGRlcGF5bG9hZGVyCisKKzIwMTAtMDEtMDUgMTk6MDI6MzkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5oOgorCSAgcnRwZzcyOWRlcGF5OiByZW1vdmUgdW51c2VkIHZhcmlhYmxlCisKKzIwMTAtMDEtMDUgMTg6MzM6MjUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzcGF5Lmg6CisJICBydHBnNzIzcGF5OiByZXdyaXRlIHBheWxvYWRlcgorCSAgSGFuZGxlIGFsbCAzIHBhY2tldCBzaXplcyBhY2NvcmRpbmcgdG8gUkZDIDM1NTEuCisJICBUb3RhbGx5IHVudGVzdGVkLCB3ZSBkb24ndCBoYXZlIGEgRzcyMyBlbmNvZGVyLgorCSAgRml4ZXMgIzYwNTg4MgorCisyMDEwLTAxLTA1IDExOjQ3OjIwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggY2h1bmsgY291bnRlcgorCisyMDEwLTAxLTA0IDE5OjQ0OjUzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBtb3JlIHdvcmsgYXQgcmVkdWNpbmcgbG9vcCBvdmVyaGVhZAorCSAgVHJ5IHRvIGF2b2lkIGRlcmVmcyB3aGVuIHBhcnNpbmcgdGhlIGluZGV4LiBTYXZlIHRoZSBzdGF0ZSBpbnRvIHRoZSBzdHJ1Y3R1cmVzCisJICB3aGVuIHdlIGV4aXQgdGhlIGxvb3AgaW5zdGVhZCBvZiBmb3IgZWFjaCBpdGVyYXRpb24uCisKKzIwMTAtMDEtMDQgMTY6MzM6MzAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGNsZWFudXBzIGFuZCBtYWtlIGR1cmF0aW9uIG1vcmUgYWNjdXJhdGUKKwkgIE1ha2UgdGhlIFF0RGVtdXhTYW1wbGUgc3RydWN0IHNtYWxsZXIgYnkga2VlcGluZyB0aGUgZHVyYXRpb24gYW5kIHRoZSBwdHNfb2Zmc2V0CisJICBhcyB0aGVpciAzMiBiaXQgdmFsdWVzLgorCSAgTWFrZSBzb21lIG1hY3JvcyB0byBjYWxjdWxhdGUgUFRTLCBEVFMgYW5kIGR1cmF0aW9uIG9mIGEgc2FtcGxlLgorCSAgRGVyZWYgdGhlIHNhbXBsZSBpbmRleCBsZXNzIG9mdGVuIGJ5IGtlZXBpbmcgYSByZWYgdG8gdGhlIHNhbXBsZSB3ZSdyZSBkZWFsaW5nCisJICB3aXRoLgorCisyMDEwLTAxLTA0IDEzOjQxOjE4ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBzaW1wbGlmeSBsb2dpYyB0byBjYWxjdWxhdGUgZHVyYXRpb24KKwkgIFNpbmNlIHdlIG5vIGxvbmdlciBzdG9yZSB0aGUgdGltZXN0YW1wIGFuZCBkdXJhdGlvbiBpbiBuYW5vc2Vjb25kcywgd2UgY2FuIG5vdworCSAgc2ltcGx5IHN0b3JlIHRoZSBkdXJhdGlvbiBhcy1pcy4KKworMjAxMC0wMS0wMSAxNjo0Mjo1NyArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBTdG9yZSB0aW1lc3RhbXBzIGluIG1vdiBmb3JtYXQgaW4gdGhlIGluZGV4CisJICBUaGlzIGFsbG93cyBmYXN0ZXIgYnVpbGRpbmcgb2YgdGhlIGluZGV4IHVwb24gc2Vla3Mgc28gdGhhdCBzY2FsaW5nIG9mCisJICB0aW1lc3RhbXBzIG9ubHkgb2NjdXJzIHdoZW4gYWN0dWFsbHkgbmVlZGVkLgorCisyMDA5LTEyLTE4IDEzOjU0OjQ2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBtYWtlIHNlZWtpbmcgaW4gcHVzaCBtb2RlIHdvcmsKKwkgIE1vdmUgc2FtcGxlIHBvc2l0aW9uIGNoZWNrcyBpbnRvIHF0ZGVtdXhfcGFyc2Vfc2FtcGxlcyB3aGVyZSB3ZSBjYW4gcHJvdGVjdCBpdAorCSAgd2l0aCBhIGxvY2suCisJICBSZWZhY3RvciBhbmQgbWFrZSBhbiBxdGRlbXV4X2Vuc3VyZV9pbmRleCBmdW5jdGlvbi4KKwkgIFJlbmFtZSBxdGRlbXV4X2RvX3B1c2hfc2VlayB0byBxdGRlbXV4X3NlZWtfb2Zmc2V0IGluIG9yZGVyIHRvIGF2b2lkIGNvbmZ1c2lvbgorCSAgd2l0aCBnc3RfcXRkZW11eF9kb19wdXNoX3NlZWsuCisKKzIwMDktMTItMTggMTI6NDQ6MjcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IG1vdmUgZXJyb3IgY29kZSBvdXQgb2Ygbm9ybWFsIGZsb3cKKworMjAwOS0xMS0yNCAxNjoyNzoyNiArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBBZGQgcHVzaCBtb2RlIHNlZWsgc3VwcG9ydCBmb3Igc2Vla2luZyB0byBvYnRhaW4gdGhlIG1vb3YgYXRvbQorCisyMDEwLTAxLTA1IDEyOjIyOjA5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggb24tbnB0LXN0b3Agc2lnbmFsIHdhcm5pbmdzIGZvciBSRFQKKwkgIFRoZSBSRFQgbWFuYWdlciBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBzaWduYWwgc28gd2UgbmVlZCB0byBjaGVjayBmb3IgaXQgYmVmb3JlCisJICB0cnlpbmcgdG8gY29ubmVjdCB0byBpdC4KKworMjAxMC0wMS0wNSAwOTo0NzowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IGZpeCBtZW1vcnkgbGVhayBpbiBuZXcgdXJpIGhhbmRsZXIgY29kZQorCSAgRG9uJ3QgbGVhayBhIHN0cmluZyBldmVyeXRpbWUgZ2V0X3VyaSgpIGlzIGNhbGxlZCBhbmQgYSBkZXZpY2UKKwkgIGhhcyBiZWVuIHNldC4gVGhlcmUncyBhIGxpbWl0ZWQgbnVtYmVyIG9mIGRldmljZXMsIHNvIGp1c3QKKwkgIGludGVybiB0aGUgc3RyaW5nIGluc3RlYWQgb2YgZG9pbmcgbW9yZSBlbGFib3JhdGUgaG91c2VrZWVwaW5nCisJICBhbmQgc3RvcmluZyBpdCBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0IG9yIHNvLgorCisyMDEwLTAxLTAxIDE0OjEwOjQ5ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IGZpeCB0eXBvIGluIHdhcm5pbmcgbWVzc2FnZQorCisyMDEwLTAxLTA0IDA5OjI4OjM2IC0wMzAwICBSb2JlcnQgV2VpZGxpY2ggPGdub21lYnVnemlsbGFAcm9iZXJ0LndlaWRsaWNoLmNjPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuaDoKKwkgIHNob3V0MnNlbmQ6IEFkZCAncHVibGljJyBwcm9wZXJ0eQorCSAgQWRkcyBhIHByb3BlcnR5IHRvIHNldCAncHVibGljJyBmbGFnIG9uIGxpYnNob3V0LCBtYWtpbmcKKwkgIHRoZSBzdHJlYW0gbGlzdGVkIG9uIHRoZSBzZXJ2ZXIncyBzdHJlYW0gZGlyZWN0b3J5LgorCSAgRml4ZXMgIzYwNTI2OQorCisyMDA5LTEyLTMwIDE0OjE0OjU1ICswNTMwICBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWRkIHRhZ3MgZm9yIGF2ZXJhZ2UgYW5kIG1heGltdW0gYml0cmF0ZQorCSAgRml4ZXMgIzU5OTMwMC4KKworMjAwOS0xMi0yNiAxNjo1OToxNCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJICBhdWRpb2Z4YmFzZWZpcmZpbHRlcjogZG8gbm90IHRyeSB0byBhbGxvYyByZWFsbHkgbGFyZ2UgYnVmZmVycworCSAgV2hlbiBuc2FtcGxlc19vdXQgaXMgbGFyZ2VyIHRoYW4gbnNhbXBsZXNfaW4sIHVzaW5nIHVuc2lnbmVkCisJICBpbnRzIGxlYWQgdG8gYSBvdmVyZmxvdyBhbmQgdGhlIHJlc3VsdGluZyB2YWx1ZSBpcyB3cm9uZyBhbmQKKwkgIHdheSB0b28gbGFyZ2UgZm9yIGFsbG9jYXRpbmcgYSBidWZmZXIuIFVzZSBzaWduZWQgaW50ZWdlcnMKKwkgIGFuZCByZXR1cm5pbmcgaW1tZWRpYXRlbGx5IHdoZW4gdGhhdCBoYXBwZW5zLgorCisyMDA5LTEyLTI1IDEyOjM4OjM1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9heXV2LmM6CisJICB2aWRlb21peGVyOiBvcHRpbWl6ZSBibGVuZCBjb2RlIHNvbWUgbW9yZQorCSAgVXNlIG1vcmUgZWZmaWNpZW50IGZvcm11bGEgdGhhdCB1c2VzIGxlc3MgbXVsdGlwbGllcy4KKwkgIFJlZHVjZSB0aGUgYW1vdW50IG9mIHNjYWxhciBjb2RlLCB1c2UgTU1YIHRvIGNhbGN1bGF0ZSB0aGUgZGVzaXJlZAorCSAgYWxwaGEgdmFsdWUuCisJICBVbnJvbGwgYW5kIGhhbmRsZSAyIHBpeGVscyBpbiBvbmUgaXRlcmF0aW9uIGZvciBpbXByb3ZlZCBwYWlyaW5nLgorCisyMDA5LTEyLTI0IDIyOjU5OjA5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9heXV2LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9iZ3JhLmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9pNDIwLmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9yZ2IuYzoKKwkgIHZpZGVvbWl4ZXI6IHNjYWxlIGFuZCBjbGFtcAorCSAgU2NhbGUgYW5kIGNsYW1wIHRvIHRoZSBtYXggYWxwaGEgdmFsdWVzLgorCisyMDA5LTEyLTI0IDIyOjUwOjMxICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgIGFscGhhOiBzY2FsZSBhbmQgY2xhbXAgYWxwaGEgdG8gaXRzIGZ1bGwgZXh0ZW5kCisJICBDb252ZXJ0IHRoZSBhbHBoYSB2YWx1ZSB0byAwLT4yNTUgd2hlbiBzZXR0aW5nIGFuZCB0byAwLT4yNTYgd2hlbiB1c2luZyBhcworCSAgYSBzY2FsaW5nIGZhY3Rvci4gVGhpcyBtYWtlcyBzdXJlIHdlIGNhbiByZWFjaCB0aGUgZnVsbCBvcGFjaXR5IHZhbHVlIG9mIDB4ZmYgaW4KKwkgIGFsbCBjYXNlcy4KKworMjAwOS0xMi0yNCAyMjoyMzowMSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IHNvbWUgY29tbWVudHMsIHJlbW92ZSBwcm9wZXJ0eSBjaGVjaworCSAgRml4IHNvbWUgY29tbWVudHMsIGNsYXJpZnkgc29tZSBGSVhNRXMKKwkgIFJlbW92ZSB0aGUgb24tbnRwLXN0b3Agc2lnbmFsIGNoZWNrIG5vdyB0aGF0IHRoZSBqaXR0ZXJidWZmZXIgaXMgaW4KKwkgIC1nb29kIGFuZCB3ZSBrbm93IHRoYXQgaXQgc3VwcG9ydHMgdGhpcyBzaWduYWwuCisKKzIwMDktMTItMjQgMjA6Mjc6NTcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIHZpZGVvbWl4ZXI6IHNvbWUgdHJpdmlhbCBjbGVhbnVwcworCisyMDA5LTEyLTI0IDE3OjA0OjI4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogUGFyc2UgYWxsIHJ0cGluZm8gZW50cmllcworCSAgRG8gbm90IGZvcmdldCB0byBwYXJzZSBhbGwgcnRwLWluZm8gZW50cmllcywgaW5zdGVhZCBvZgorCSAgcGFyc2luZyB0aGUgZmlyc3Qgb25lIG9ubHkuCisJICBGaXhlcyAjNjA1MjIyCisKKzIwMDktMTItMjIgMTI6NDQ6NTAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBwZXJmIHRhZyBzaG91bGQgbWFwIHRvIEdTVF9UQUdfQVJUSVNUCisKKzIwMDktMTItMjQgMTc6MDM6MDIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkgIGludGVybGVhdmU6IGZpeCB3ZWlyZCBpbmRlbnRhdGlvbgorCisyMDA5LTEyLTI0IDE3OjAxOjU0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJICBydHBoMjYzcHBheTogdXNlIGZhc3RlciBfYWRhcHRlcl9jb3B5KCkgd2hlbSBwb3NzaWJsZQorCisyMDA5LTEyLTI0IDE3OjAxOjE1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L2ZpcmZpbHRlci1leGFtcGxlLmM6CisJICB0ZXN0czogdXNlIHJpZ2h0IHR5cGUgd2hlbiBwYXNzaW5nIHZhcmFyZyB2YWx1ZQorCisyMDA5LTEyLTIzIDE3OjUwOjM0ICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgZmxhY2RlYzogdXNlIGEgc2luZ2xlIGRlY29kZXIgZmllbGQgZm9yIGJvdGggcHVzaCBhbmQgcHVsbCBtb2RlCisKKzIwMDktMTItMjMgMTc6MDM6MzIgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiBmaXggcG9zc2libGUgaGFuZ2luZyBpbiBwdWxsIG1vZGUgc2Vla2luZworCSAgQSBzZWVrIGluIG11bHRpLXNpbmsgcGlwZWxpbmUgdHlwaWNhbGx5IGxlYWRzIHRvIHNldmVyYWwgc2VlayBldmVudHMgaW4gYSByb3csCisJICB3aGljaCBjb3VsZCBsZWFkIHRvIHNlbmRpbmcgc2V2ZXJhbCBuZXdzZWdtZW50cyBpbiBhIHJvdyB3aXRob3V0IGludGVybWVkaWF0ZQorCSAgZmx1c2hpbmcuICBUaGVzZSB3b3VsZCB0aGVuIGFjY3VtdWxhdGUsIGRpc3RvcnQgcmVuZGVyaW5nIHRpbWVzIGFuZCBhcyBzdWNoCisJICBsZWFkIHRvICdoYW5naW5nJy4KKworMjAwOS0xMi0yMyAxOTozOTowNSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwaDI2NHBheTogZml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUKKworMjAwOS0xMi0yMyAxMzowOTo1NCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGJ2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJICBydHA6IHVzZSBib2lsZXJwbGF0ZQorCisyMDA5LTEyLTIzIDAwOjM4OjA1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cEwxNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuaDoKKwkgIHJ0cEwxNnBheTogY29udmVydCB0byBiYXNlYXVkaW9wYXlsb2FkCisJICBVc2UgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZCBhcyB0aGUgYmFzZSBjbGFzcy4gVGhpcyBzYXZlcyBhIGxvdCBvZiBjb2RlIGFuZCBmaXhlcworCSAgYSBidW5jaCBvZiBwcm9ibGVtcyB0aGF0IHdlcmUgYWxyZWFkeSBzb2x2ZWQgaW4gdGhlIGJhc2UgY2xhc3MuCisJICBGaXhlcyAjODUzMzY3CisKKzIwMDktMTItMjMgMDA6MzA6NDkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSAgcnRwcGNtYXBheTogdGhlIGJvaWxlcnBsYXRlIG1hY3JvIHNldHMgcGFyZW50X2NsYXNzCisKKzIwMDktMTItMjIgMjI6Mjc6MjEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBydHBiaW46IGF2b2lkIHNvbWUgc3RydWN0dXJlIGNvcGllcworCSAgRG9uJ3QgbWFrZSBjb3BpZWQgaW4gdGhlIGdldHRlciBhbmQgc2V0dGVyIGZvciBTREVTIGluIHRoZSBSVFBTb3VyY2UuIFRoaXMKKwkgIGF2b2lkcyBhIGNvdXBsZSBvZiBjb3BpZXMgb2YgdGhlIFNERVMgc3RydWN0dXJlIHdoZW4gZ2VuZXJhdGluZyBSVENQCisJICBwYWNrZXRzLgorCisyMDA5LTA4LTMxIDE4OjQyOjI1ICswMjAwICBQYXNjYWwgQnVobGVyIDxwYXNjYWwuYnVobGVyQHRhbmRiZXJnLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIHJ0cG1hbmFnZXI6IGltcHJvdmUgU0RFUyBoYW5kbGluZworCSAgU3RvcmUgU0RFUyBpbnRlcm5hbGx5IGFzIGEgc3RydWN0IHRvIHN1cHBvcnQgbXVsdGlwbGUgUFJJViB2YWx1ZXMuCisJICBJbmNsdWRlIGFsbCB2YWx1ZXMgc2V0IGluIFNERVMgc3RydWN0IHdoZW4gc2VuZGluZyBSVENQIFNERVMuCisKKzIwMDktMTItMjIgMTQ6NDE6MzUgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6CisJICBydHBoMjYzZGVwYXk6IGFkZCBzb21lIGZpeG1lcworCisyMDA5LTEyLTIyIDE0OjM1OjEzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5jOgorCSAgcnRwaDI2M2RlcGF5OiBiYXNlY2xhc3MgaGFuZGxlcyB0aW1lc3RhbXBzIGZvciB1cworCisyMDA5LTEyLTIyIDE0OjI3OjQwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5jOgorCSAgcnRwaDI2M2RlcGF5OiByZXNldCBzdGFydCB2YXJpYWJsZSBwcm9wZXJseQorCisyMDA5LTA1LTI5IDE1OjQ5OjI3ICswMzAwICBNYXJjbyBCYWxsZXNpbyA8bWFyY28uYmFsbGVzaW9Abm9raWEuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuaDoKKwkgIERyb3AgdGhlIHdob2xlIGZyYW1lIGlmIGEgcGFja2V0IGlzIGxvc3QuCisJICBGaXhlcyAjNTgyNTc1CisKKzIwMDktMTItMjEgMjA6Mzk6NTMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBydHBoMjY0cGF5OiBhZGQgb3B0aW9uIHRvIGluc2VydCBQUFMvU1BTIGluIHN0cmVhbXMKKwkgIEFkZCBhIG5ldyBzcHNwcHMtaW50ZXJ2YWwgcHJvcGVydHkgdG8gaW5zdHJ1Y3QgdGhlIHBheWxvYWRlciB0byBpbnNlcnQKKwkgIFNQUyBhbmQgUFBTIGF0IHBlcmlvZGljIGludGVydmFscyBpbiB0aGUgc3RyZWFtLgorCSAgUmV3b3JrIHRoZSBTUFMvUFBTIGhhbmRsaW5nIHNvIHRoYXQgYnl0ZXN0cmVhbSBhbmQgQVZDIHNhbXBsZSBjb2RlIGJvdGggdXNlIHRoZQorCSAgc2FtZSBjb2RlIHBhdGhzIHRvIGhhbmRsZSBzcHJvcC1wYXJhbWV0ZXItc2V0cy4gVGhpcyBhbHNvIGFsbG93cyB0byBoYXZlIHRoZSBBVkMKKwkgIGNvZGUgdG8gaW5zZXJ0IFNQUy9QUFMgbGlrZSB0aGUgYnl0ZXN0cmVhbSBjb2RlLgorCSAgRml4ZXMgIzYwNDkxMworCisyMDA5LTEyLTIxIDE5OjEyOjIyICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDQ3Y2IyM2EgdG8gMTRjZWM4OQorCisyMDA5LTEyLTIxIDEyOjAxOjUzIC0wMzAwICBKb25hdGhhbiBDb25kZXIgPGpAc2t1cnZ5Lm5vLWlwLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfdHlwZXMuYzoKKwkgIHF0ZGVtdXg6IEFkZHMgbmV3IHRhZ3MKKwkgIEFkZHMgc29tZSBuZXcgdGFncyBtYXBwaW5nIHRvIHF0ZGVtdXguCisJICBGaXhlcyAjNTk5NzU5CisKKzIwMDktMTItMjEgMTU6MDU6MDkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBhZGQgcHJvcGVydHkgdG8gcmVtb3ZlIHBhZHMgYXV0b21hdGljYWxseQorCSAgQWRkIGEgcHJvcGVydHkgY2FsbGVkIGF1dG9yZW1vdmUgdG8gYXV0b21hdGljYWxseSByZW1vdmUgdGhlIHBhZHMgb2Ygc291cmNlcworCSAgdGhhdCB0aW1lZCBvdXQuCisJICBGaXhlcyAjNTU0ODM5CisKKzIwMDktMTItMjEgMTQ6NTU6MTYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgc3NyY2RlbXV4OiBmaXggY29tcGFyaXNvbgorCSAgQSBOVUxMIG1lYW5zIG5vIHBhZCB3YXMgZm91bmQuCisKKzIwMDktMTEtMDggMTE6NDk6MTQgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIHY0bDJzcmM6IEFkZCBHc3RVUklIYW5kbGVyIGludGVyZmFjZS4gRml4ZXMgIzYwMTE0MworCSAgVGhpcyBhbGxvd3MgdXNpbmcgdjRsMjovL1s8ZGV2aWNlPl0KKworMjAwOS0xMi0yMCAxNzoyNDo0NyAtMDgwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgbXVsdGl1ZHBzaW5rOiBwYXNzIGxlbmd0aCBwYXJhbWV0ZXIgdG8gZ19jb252ZXJ0CisKKzIwMDktMTItMTggMTI6NDQ6NTAgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2E6IEZpeCB1bml0aWFsaXplZCB2YXJpYWJsZS4KKwkgIFllcywgaXQncyBzdHVwaWQsIGJ1dCBtYWNvc3ggY29tcGlsZXJzIGFyZSBldmVuIG1vcmUgc3R1cGlkLgorCisyMDA5LTEyLTE3IDE2OjAxOjI1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfYXl1di5jOgorCSAgdmlkZW9taXhlcjogRml4IGFzc2VtYmx5IGNvbXBpbGF0aW9uIG9uIHg4NgorCSAgRml4ZXMgYnVnICM2MDQ4MTQuCisKKzIwMDktMTItMTcgMTc6Mzc6MDMgKzAxMDAgIEJyYW5rbyDEjGliZWogPGJyYW5lIGF0IHhiYy5udT4KKworCSogZ3N0L3JlcGxheWdhaW4vcmdhbmFseXNpcy5jOgorCSAgcmdhbmFseXNpczogZml4IHRpbWVzdGFtcCByb3VuZGluZworCSAgVXNlIHNjYWxpbmcgZnVuY3Rpb24gdG8gcm91bmQgYW5kIGF2b2lkIG92ZXJmbG93cy4KKwkgIEZpeGVzICM2MDQzNTIKKworMjAwOS0xMi0xNyAxNzoyNzo0MiArMDEwMCAgVGlhZ28gS2F0Y2lwaXMgPHRpYWdvLmthdGNpcGlzQGRpZ2l0cm8uY29tLmJyPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyM3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzIzcGF5Lmg6CisJICBydHA6IGFkZCBHNzIzIHBheWxvYWRlcgorCSAgRml4ZXMgIzU5NzgyMworCisyMDA5LTEyLTE3IDE2OjIyOjU2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X3R5cGVzLmM6CisJICBxdGRlbXV4OiBGaXggQUxBQyBjb2RlY19kYXRhIHBhcnNpbmcKKwkgIEZpeGVzICM2MDQ2MTEKKworMjAwOS0xMi0xNiAxNzoyODozMCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IFJlbW92ZSBjcHAgc3R5bGUgY29tZW50cworCSAgUmVtb3ZlcyAvLyBjb21tZW50cyBhbmQgcmVwbGFjZSB0aGVtIHdpdGggLyogKi8gY29tbWVudHMKKworMjAwOS0xMi0xNiAxMjo0ODowMiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICBtYXRyb3NrYWRlbXV4OiBhbHNvIGNvbnNpZGVyIEJsb2NrTnVtYmVyIGluZGljYXRlZCBpbiBpbmRleCB3aGVuIHNlZWtpbmcKKworMjAwOS0xMi0xNiAxMjo0MzoyNyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICBtYXRyb3NrYWRlbXV4OiBzdXBwb3J0IHB1c2ggYmFzZWQgbW9kZQorCSAgRml4ZXMgIzU5ODYxMC4KKworMjAwOS0xMi0xNiAxMjo0NDozNiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkgIG1hdHJvc2thZGVtdXg6IGZpeCBlYm1sIHJlYWQgY2FjaGUgdXNhZ2UKKworMjAwOS0xMi0xNiAxMDo1MDozMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2F5dXYuYzoKKwkgIHZpZGVvbWl4ZXI6IFVzZSBtb3Z6YmwgaW5zdGVhZCBvZiBtb3Z6eGIgZm9yIG1vdmluZyBvbmUgYnl0ZSB0byBhIGwgcmVnaXN0ZXIKKwkgIEZvciBzb21lIHJlYXNvbiBsYXRlc3QgZ2NjL2JpbnV0aWxzIGFjY2VwdCBtb3Z6eGIgaGVyZSB3aGlsZQorCSAgbW92emJsIHdvdWxkIGJlIGNvcnJlY3QgYW5kIGlzIHRoZSBvbmx5IHRoaW5nIGFjY2VwdGVkIGJ5IG9sZGVyCisJICBnY2MvYmludXRpbHMuCisJICBGaXhlcyBidWcgIzYwNDY3OS4KKworMjAwOS0xMi0xNiAwNjo1OTowMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2F5dXYuYzoKKwkgIHZpZGVvbWl4ZXI6IHNyYy9kZXN0IGFyZSBpbnB1dCBhbmQgb3V0cHV0IG9mIHRoZSBBWVVWIGJsZW5kaW5nIE1NWCBhc3NlbWJsZXIKKworMjAwOS0xMi0xNSAxODoxODo1NCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmM6CisJICBhdWRpb3dzaW5jYmFuZDogVXNlIHRoZSBzYW1lIHVwcGVyIGxlbmd0aCBsaW1pdCBhcyBhdWRpb3dzaW5jbGltaXQKKworMjAwOS0xMi0xMiAxNzowMDo1MCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYzoKKwkgIGF1ZGlvd3NpbmN7bGltaXQsYmFuZH06IEFsbG93IG11Y2ggbGFyZ2VyIGZpbHRlciBsZW5ndGhzIG5vdworCisyMDA5LTEyLTExIDEyOjI3OjMyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkgIGF1ZGlvZnhiYXNlZmlyZmlsdGVyOiBGaXggZnJlcXVlbmN5IHJlc3BvbnNlIGNhbGN1bGF0aW9uCisKKzIwMDktMTItMDggMTQ6NTc6MDIgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSAgYXVkaW9meGJhc2VmaXJmaWx0ZXI6IFJlbW92ZSBkZWFkIGFzc2lnbm1lbnRzCisKKzIwMDktMTItMDYgMTY6NTg6NTEgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSAgYXVkaW9meGJhc2VmaXJmaWx0ZXI6IEFkZCBzcGVjaWFsIHByb2Nlc3NpbmcgZnVuY3Rpb25zIGZvciBNb25vL1N0ZXJlbworCSAgVGhpcyBwcm92aWRlcyBhbm90aGVyIDclIHNwZWVkdXAgZm9yIHRoZSB0aW1lIGRvbWFpbiBjb252b2x1dGlvbiBhbmQgMS41JQorCSAgc3BlZWR1cCBmb3IgdGhlIEZGVCBjb252b2x1dGlvbiBvbiBNb25vIGlucHV0LgorCSAgVGhpcyBvcHRpbWl6YXRpb24gYXNzdW1lcyB0aGF0IHRoZSBjb21waWxlciBzaW1wbGlmaWVzIGNhbGN1bGF0aW9ucworCSAgYW5kIGNvbmRpdGlvbnMgb24gY29uc3RhbnQgbnVtYmVycyBhbmQgdW5yb2xscyBsb29wcyB3aXRoIGEgY29uc3RhbnQKKwkgIG51bWJlciBvZiByZXBlYXRzLgorCisyMDA5LTEyLTA0IDA5OjI1OjQ5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmg6CisJICBhdWRpb2Z4YmFzZWZpcmZpbHRlcjogQWRkIGEgImxvdy1sYXRlbmN5IiBtb2RlCisJICBUaGlzIHdpbGwgYWx3YXlzIHVzZSB0aW1lLWRvbWFpbiBjb252b2x1dGlvbiwgd2hpY2ggbG93ZXJzIHRoZSBsYXRlbmN5LgorCSAgV2l0aCBGRlQgY29udm9sdXRpb24gaXQncyBhbHdheXMgYSBtdWx0aXBsZSBvZiB0aGUga2VybmVsIGxlbmd0aCwKKwkgIHdpdGggdGltZSBkb21haW4gY29udm9sdXRpb24gaXQncyBvbmx5IHRoZSBwcmUtbGF0ZW5jeSBvZiB0aGUgZmlsdGVyIGtlcm5lbC4KKworMjAwOS0xMi0wNCAwOTowMDoyMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJICBhdWRpb2Z4YmFzZWZpcmZpbHRlcjogUmVtb3ZlIG9ic29sZXRlIFRPRE8gY29tbWVudHMKKworMjAwOS0xMi0wMyAyMDoxMjowMSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJICBhdWRpb2Z4YmFzZWZpcmZpbHRlcjogVXNlIHNhbXBsZXMgZXZlcnl3aGVyZSBpbnN0ZWFkIG9mIHNhbXBsZXMqY2hhbm5lbHMgc29tZXRpbWVzCisKKzIwMDktMTItMDMgMTc6Mjc6MTMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5oOgorCSAgYXVkaW9meGJhc2VmaXJmaWx0ZXI6IEZGVCBjb252b2x1dGlvbiBpbXBsZW1lbnRhdGlvbgorCSAgVGhpcyBwcm92aWRlcyBhIGdyZWF0IHNwZWVkdXAsIGVzcGVjaWFsbHkgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGtlcm5lbAorCSAgbGVuZ3RoIGFuZCBwcm9jZXNzaW5nIHNpemUgaXMgbm93IGxvZ2FyaXRobWljIGluc3RlYWQgb2YgbGluZWFyLiBCZWxvdyBhCisJICBrZXJuZWwgc2l6ZSBvZiAzMiBpdCdzIGEgYml0IHNsb3dlciwgYWZ0ZXJ3YXJkcyBpdCdzIG11Y2ggZmFzdGVyOgorCSAgMTcgICAgIDAuNzg4MDAwIC0+IDAuOTUwMDAwCisJICAzMyAgICAgMS4yMDgwMDAgLT4gMS4xNDYwMDAKKwkgIDY1ICAgICAyLjE2NjAwMCAtPiAxLjE0NjAwMAorCSAgLi4uCisJICA0MDk3IDEwNy40NDQwMDAgLT4gMS41MDgwMDAKKwkgIEZvciBzaXplcyBzbWFsbGVyIDMyIHRoZSBub3JtYWwgdGltZS1kb21haW4gY29udm9sdXRpb24gaXMgY2hvc2VuLAorCSAgZm9yIGxhcmdlciBzaXplcyB0aGUgRkZUIGNvbnZvbHV0aW9uIGlzIGF1dG9tYXRpY2FsbHkgdXNlZC4KKwkgIEZpeGVzIGJ1ZyAjNTk0MzgxLgorCisyMDA5LTExLTI3IDIwOjMzOjE0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmg6CisJICBhdWRpb2Z4YmFzZWZpcmZpbHRlcjogTWFrZSBtb3N0IGNvZGUgcGFydHMgaW5kZXBlbmRlbnQgb2YgdGhlIHByb2Nlc3NpbmcgZnVuY3Rpb25zIGFuZCB1c2VkIGNvbnZvbHV0aW9uIGFsZ29yaXRobQorCSAgT25seSByZW1haW5pbmcgcGFydCBpcyB0aGUgcmVzaWR1ZSBwdXNoaW5nLCB3aGljaCB3aWxsIGJlIGZpeGVkIGxhdGVyLgorCisyMDA5LTExLTI2IDE1OjE3OjI3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkgIGF1ZGlvZnhiYXNlZmlyZmlsdGVyOiBPcHRpbWl6ZSB0aW1lLWRvbWFpbiBjb252b2x1dGlvbgorCSAgUmVtb3ZlIHNvbWUgcmVkdW5kYW50IGNhbGN1bGF0aW9ucywgbW92ZSBjb21wYXJpc2lvbnMgb3V0IG9mCisJICBpbm5lciBsb29wcywgZXRjLgorCSAgVGhpcyBtYWtlcyB0aGUgY29udm9sdXRpb24gYWJvdXQgMyAoISkgdGltZXMgZmFzdGVyIGJ1dAorCSAgcHJvY2Vzc2luZyB0aW1lIGlzIG9mIGNvdXJzZSBzdGlsbCBwcm9wb3J0aW9uYWwgdG8gdGhlCisJICBmaWx0ZXIgc2l6ZS4KKworMjAwOS0xMS0yNiAxMDo0NTozNyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJICBhdWRpb2Z4YmFzZWZpcmZpbHRlcjogVXNlIF9DQVNUIG1hY3JvcyBpbiBzb21lIHBsYWNlcyBhbmQgZG8gc29tZSBjYWxjdWxhdGlvbnMgb25seSBvbmNlCisKKzIwMDktMTEtMjUgMTg6MTI6MDUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuaDoKKwkgIGF1ZGlvZnhiYXNlZmlyZmlsdGVyOiBSZXdyaXRlIHRpbWVzdGFtcCB0cmFja2luZworCSAgSXQncyBtdWNoIHNpbXBsZXIgbm93IGFuZCBkb2Vzbid0IGludHJvZHVjZSBhY2N1bXVsYXRpbmcgcm91bmRpbmcKKwkgIGVycm9ycy4KKworMjAwOS0xMS0yNSAxNzozOTo1MyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5oOgorCSAgYXVkaW9meGJhc2VmaXJmaWx0ZXI6IFJlbmFtZSBzb21lIHZhcmlhYmxlcyBhbmQgY2hhbmdlIGNvbW1lbnRzCisKKzIwMDktMTEtMjQgMjA6MDY6MjUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuaDoKKwkgIGF1ZGlvZnhiYXNlZmlyZmlsdGVyOiBBZGQgY29uc3QgcXVhbGlmaWVyIHRvIHRoZSBzb3VyY2UgZGF0YSBhcnJheQorCisyMDA5LTEyLTE0IDIwOjA4OjA2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9heXV2LmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBBZGQgTU1YIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgQVlVViBibGVuZGluZyBhbmQgY29sb3IgZmlsbGluZyBmdW5jdGlvbnMKKwkgIFRoaXMgcHJvdmlkZXMgYSAyMCUgc3BlZWR1cCBmb3IgYmxlbmRpbmcgYW5kIDEwMCUgZm9yIGNvbG9yIGZpbGxpbmcuCisJICBUaGUgYmxlbmRpbmcgY2FuIHByb2JhYmx5IGJlIG9wdGltaXplZCBldmVuIG1vcmUuCisKKzIwMDktMTItMTMgMTM6MTk6NDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzoKKwkgIGlkM2RlbXV4OiBwcmVmZXIgdHdvIGxldHRlciBJU08gNjM5LTEgY29kZSBmb3IgZXh0ZW5kZWQgY29tbWVudAorCisyMDA5LTEyLTEzIDEzOjEwOjEyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IHVwIGxhbmd1YWdlIGNvZGUgZXh0cmFjdGlvbiBzb21lIG1vcmUKKwkgIFF1aWNrdGltZSB1c2VzIElTTyA2MzktMiBmb3IgbGFuZ3VhZ2UgY29kZXMsIGJ1dCBHU1RfVEFHX0xBTkdVQUdFCisJICBpcyBzdXBwb3NlZCB0byBob2xkIGEgSVNPIDYzOS0xIGNvZGUsIHNvIGNvbnZlcnQgYXMgbmVlZGVkIHVzaW5nCisJICB0aGUgbmV3IEFQSSBmcm9tIC1iYXNlLgorCSAgU2VlICM2MDIxMjYuCisKKzIwMDktMTItMTMgMTI6NDU6MjIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thOiBmaXggbGFuZ3VhZ2UgY29kZSB3cml0aW5nIGFuZCBleHRyYWN0aW9uCisJICBNYXRyb3NrYSB1c2VzIHRocmVlLWxldHRlciBJU08gNjM5LTJCIGNvZGVzLCBidXQgR1NUX1RBR19MQU5HVUFHRSBpcworCSAgc3VwcG9zZWQgdG8gY29udGFpbiB0d28tbGV0dGVyIElTTyA2MzktMSBjb2Rlcywgc28gdXNlIG5ldyBsYW5ndWFnZQorCSAgY29kZSBtYXBwaW5nIGZ1bmN0aW9ucyBpbiAtYmFzZSB0byBjb252ZXJ0IGJldHdlZW4gdGhvc2UgdHdvIGFzCisJICBuZWVkZWQuCisJICBGaXhlcyAjNTA1ODIzLgorCisyMDA5LTEyLTA3IDIwOjU0OjA3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IG1pbm9yIGRlYnVnIG1lc3NhZ2UgY2hhbmdlcworCSAgRml4IHVwIGEgZmV3IGRlYnVnIG1lc3NhZ2VzIHNvIHRoYXQgaXQncyBjbGVhcmVyIHdoYXQgdGhleSBtZWFuLgorCisyMDA5LTEyLTEyIDE3OjQ0OjA0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgUmV2ZXJ0ICJxdGRlbXV4OiBDb3JyZWN0bHkgcGFyc2UgY2xhc3NpZmljYXRpb24gdGFncyIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgY2Q4ODNhYTYwYzExMzMxOTZhNmFlMDUyODg0ZDE1YzI5NWMzN2RkZS4KKwkgIFByZXZpb3VzIGNvZGUgd2FzIGNvcnJlY3QsIDQgaXMgZHVlIHRvIHRhYmxlIGFuZCBsYW5ndWFnZSBjb2RlLAorCSAgbm90IG9ubHkgbGFuZ3VhZ2UgY29kZQorCisyMDA5LTEyLTEyIDE2OjI4OjM2IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQ29ycmVjdGx5IHBhcnNlIGNsYXNzaWZpY2F0aW9uIHRhZ3MKKwkgIEluIGNsc2YgYXRvbXMsIHRoZSBsYW5ndWFnZSBjb2RlIGlzIDIgYnl0ZXMgbG9uZywgbm90IDQuCisKKzIwMDktMTItMTIgMTY6NTU6MTMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBEZXF1ZXVlIGN1cnJlbnQgYnVmZmVyIG9uIEZMVVNIX1NUT1AgYW5kIGRvbid0IHVucmVmIE5VTEwgYnVmZmVycworCSAgLi4uIE5VTEwgYnVmZmVycyBzaG91bGRuJ3QgcmVhbGx5IGhhcHBlbiBhbnltb3JlIHdoZW4gcG9wcGluZyB0aGUKKwkgIGJ1ZmZlciBmcm9tIEdzdENvbGxlY3RQYWRzIGJ1dCBiZXR0ZXIgY2hlY2sgZm9yIHRoaXMgYW5kIHByaW50IGEgd2FybmluZy4KKworMjAwOS0xMi0xMSAxMzoxMToxMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2k0MjAuYzoKKwkgIHZpZGVvbWl4ZXI6IEZpeCBzdHVwaWQgbWlzdGFrZSBpbiBsYXN0IGNvbW1pdAorCisyMDA5LTEyLTExIDEyOjM1OjU5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfaTQyMC5jOgorCSAgdmlkZW9taXhlcjogRG9uJ3QgZG8gZmxvYXRpbmcgcG9pbnQgbWF0aCBpbiB0aGUgaW5uZXIgcHJvY2Vzc2luZyBsb29wIGZvciBJNDIwIGJsZW5kaW5nCisKKzIwMDktMTItMTAgMTg6NDM6NDQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGhhbmRsZSBOVUxMIGFuZCBlbXB0eSB0cmFuc3BvcnQgc3RyaW5ncworCSAgV2hlbiBhbiBSVFNQIGV4dGVuc2lvbiByZXR1cm5zIE5VTEwgb3IgYW4gZW1wdHkgdHJhbnNwb3J0IHN0cmluZywganVzdCBpZ25vcmUgaXQKKwkgIGFuZCB0cnkgdG8gZ2V0IHRoZSBuZXh0IHBvc3NpYmxlIHRyYW5zcG9ydC4gRml4ZXMgcGxheWJhY2sgb2YgUmVhbE1lZGlhIHN0cmVhbXMuCisKKzIwMDktMTItMTAgMTg6NDI6NTEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGluc3RhbGwgZXZlbnQgZnVuY3Rpb24gb24gaW50ZXJuYWwgUlRDUCBwYWQKKwkgIEluc3RhbGwgYSBjdXN0b20gZXZlbnQgZnVuY3Rpb24gb24gdGhlIGludGVybmFsIFJUQ1AgcGFkIHNvIHRoYXQgd2UgY2FuIHJlcGx5CisJICBUUlVFIHRvIGEgbGF0ZW5jeSBldmVudC4KKworMjAwOS0xMi0xMCAxMDo0ODo0OSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2F5dXYuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2JncmEuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX3JnYi5jOgorCSAgdmlkZW9taXhlcjogUmVtb3ZlIHdyb25nIGNvbW1lbnRzLCBjb3BpZWQgZnJvbSB0aGUgSTQyMCBibGVuZCBmdW5jdGlvbgorCisyMDA5LTEyLTA5IDIxOjE1OjA3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogVGhlIHF1ZXVlZCBkdXJhdGlvbiBpcyBhIHNpZ25lZCBpbnRlZ2VyCisJICAuLi5hbmQgaXQgd2lsbCByZWFsbHkgYmUgbmVnYXRpdmUgc29tZXRpbWVzLgorCisyMDA5LTEyLTA5IDIxOjAzOjU3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogT25seSBwb3AgYnVmZmVycyBmcm9tIGNvbGxlY3RwYWRzIGFmdGVyIHRoZXkncmUgZnVsbHkgY29uc3VtZWQKKwkgIFRoaXMgZGVjcmVhc2VzIGxhdGVuY3kgYW5kIG1lbW9yeSB1c2FnZSBiZWNhdXNlIG5ldyBidWZmZXJzIGFyZSBvbmx5CisJICBhY2NlcHRlZCBieSBjb2xsZWN0cGFkcyBpZiB0aGVyZSdzIG5vIHF1ZXVlZCBidWZmZXIuCisKKzIwMDktMTItMDkgMjA6NDI6NDQgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgbWF0cm9za2FkZW11eDogQ2xlYW4gdXAgcG9zaXRpb24vZHVyYXRpb24gaGFuZGxpbmcKKwkgIEFsc28gdXNlIHRoZSBsYXN0IGVuZCB0aW1lIGZvciBjbG9zaW5nIHRoZSBzZWdtZW50LCBub3QgdGhlCisJICBzdGFydCB0aW1lIG9mIHRoZSBsYXN0IGJ1ZmZlci4KKworMjAwOS0xMi0wOSAxNjo1MDowMiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogQ2xvc2UgdGhlIHNlZ21lbnQgb24gRU9TIGlmIHRoZSByZWFsIGR1cmF0aW9uIGlzIGtub3duCisKKzIwMDktMTItMDkgMTY6NDY6MTggKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFVwZGF0ZSBkdXJhdGlvbiBpZiBjdXJyZW50IGJ1ZmZlciBpcyBhbHJlYWR5IGFmdGVyIHRoZSBvbGQgZHVyYXRpb24KKworMjAwOS0xMi0wOSAxNjo0Mzo0MSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogRHJvcCBidWZmZXJzIHRoYXQgYXJlIGFmdGVyIHNlZ21lbnQgc3RvcAorCSAgLi4uYW5kIGlmIHRoaXMgaGFwcGVuZWQgZm9yIGFsbCBzdHJlYW1zIGdvIEVPUy4KKworMjAwOS0xMi0wOSAxNjo0MTowNCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogRml4IHBvc2l0aW9uIHRyYWNraW5nIGFuZCBzZW5kaW5nIG9mIGZpbGxlciBzZWdtZW50cworCisyMDA5LTEyLTA5IDE2OjE1OjA5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogVXNlIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQoKSBmb3IgZnBzIHRvIHNlY29uZHMgcGVyIGZyYW1lIGNhbGN1bGF0aW9ucworCisyMDA5LTEyLTA4IDE3OjM0OjE1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBLZWVwIHRoZSBzZWdtZW50IHN0b3AgcG9zaXRpb24gZm9yIHVwZGF0ZSBuZXdzZWdtZW50IGV2ZW50cworCisyMDA5LTEyLTA0IDE0OjQyOjQ5ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2xhZHNwYS9NYWtlZmlsZS5hbToKKwkqIGV4dC9sYWRzcGEvZ3N0bGFkc3BhLmM6CisJKiBleHQvbGFkc3BhL2dzdGxhZHNwYS5oOgorCSogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYzoKKwkqIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmg6CisJKiBleHQvbGFkc3BhL2xvYWQuYzoKKwkqIGV4dC9sYWRzcGEvc2VhcmNoLmM6CisJKiBleHQvbGFkc3BhL3V0aWxzLmg6CisJICBsYWRzcGE6IFJlbW92ZSB0aGUgc291cmNlcyBmcm9tIGdzdC1wbHVnaW5zLWdvb2QKKwkgIEl0J3MgZGlzYWJsZWQgYW55d2F5IGFuZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgaXQgaXMgaW4KKwkgIGdzdC1wbHVnaW5zLWJhZC4gRml4ZXMgYnVnICM2MDM3NzkuCisKKzIwMDktMTItMDQgMTM6NTA6NTkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBpbml0IGN1cnJlbnRfZW50cnkgaW4gcHVzaCBtb2RlCisJICBTZXQgdGhlIGN1cnJlbnRfZW50cnkgdG8gMCAoaW5zdGVhZCBvZiAtMSkgaW4gcHVzaCBtb2RlIHNvIHRoYXQgd2UgY29ycmVjdGx5CisJICBjYWxjdWxhdGUgdGhlIGN1cnJlbnQgZnJhbWUgbnVtYmVyIGFuZCB0aW1lc3RhbXAuCisJICBBZGQgc29tZSBtb3JlIGRlYnVnIGluZm8gYW5kIGZpYyB0aGUgZHVyYXRpb24gZGVidWcuCisKKzIwMDktMTItMDQgMTE6MTQ6MDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggbWFqb3IgbWVtb3J5IGxlYWsgd2hlbiBwbGF5aW5nIGJhY2sgcnRzcCB2aWRlbyBzdHJlYW1zCisJICBEb24ndCBmb3JnZXQgdG8gdW5yZWYgUW9TLCBuYXZpZ2F0aW9uIGFuZCBsYXRlbmN5IGV2ZW50cyB3aGVuCisJICBkcm9wcGluZyB0aGVtLgorCisyMDA5LTEyLTAzIDA4OjU4OjA4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBvbmx5IHNlbmQgcGVuZGluZyB0YWdzIHdpdGggbmV3c2VnbWVudCBldmVudHMKKwkgIFNlbmQgcGVuZGluZyB0YWdzIG9ubHkgZnJvbSB0aGUgc3RyZWFtaW5nIHRocmVhZCwganVzdCBhZnRlciB3ZSd2ZSBzZW50CisJICB0aGUgbmV3c2VnbWVudCBldmVudCwgbm90IHdpdGggZS5nLiBmbHVzaC1zdGFydC4gVGhpcyBub3Qgb25seSBkb2VzIHRoZQorCSAgcmlnaHQgdGhpbmcsIGJ1dCBhbHNvIG1ha2VzIHN1cmUgd2UncmUgbm90IHRyYW1wbGluZyBvdmVyIHZhcmlhYmxlcyBzZXQKKwkgIHVwIGluIHRoZSBzdHJlYW1pbmcgdGhyZWFkIGZyb20gdGhlIHNlZWtpbmcgdGhyZWFkIGluIGNhc2Ugc29tZW9uZSB0cmllcworCSAgdG8gaXNzdWUgYSBzZWVrIGp1c3QgYXMgdGhlIGRlbXV4ZXIgaXMgcGFyc2luZyB0aGUgaGVhZGVycy4KKwkgIEZpeGVzICM2MDE2MTcuIFNwb3R0ZWQgYnkgT2dueWFuIFRvbmNoZXYuCisKKzIwMDktMTItMDMgMTc6NDk6NTUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggZGVidWcgbWVzc2FnZSBwcmludGYgYXJncworCSAgRml4ZXMgZGVidWcgbWVzc2FnZSBwcmludGYgZm9ybWF0IHRvIG1ha2UgaXQgYnVpbGQgaW4gbWFjJ3MgZ2NjCisKKzIwMDktMTItMDIgMTM6MzM6MjAgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSAgc2hvdXQyOiBDb252ZXJ0IGRlbGF5IGNvcnJlY3RseQorCSAgVXNlIEdTVF9NU0VDT05EIHRvIGNvbnZlcnQgZGVsYXkgaW4gbXNlY3MgdG8gbmFub3NlY3MKKwkgIEZpeGVzICM2MDM1NDcKKworMjAwOS0xMi0wMSAxOToyNDowMiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogcmVzZXQgc2VnbWVudCBpbmZvIGFmdGVyIGZsdXNoCisJICBSZXNldCB0aGUgc2VnbWVudCBpbmZvIGFmdGVyIGEgZmx1c2guIFdlIHVzZSB0aGUgc2VnbWVudCBmb3IgaGFuZGxpbmcgUW9TIGFuZCBpZgorCSAgd2UgZG9uJ3QgcmVzZXQgdGhlIHNlZ21lbnQsIFFvUyBpcyBiYXNpY2FsbHkgZGlzYWJsZWQgYWZ0ZXIgYSBmbHVzaGluZyBzZWVrLgorCisyMDA5LTEyLTAxIDE1OjA3OjA2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDg3YmY0MjggdG8gNDdjYjIzYQorCisyMDA5LTEyLTAxIDE0OjE1OjQ2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGRhNGM3NWMgdG8gODdiZjQyOAorCisyMDA5LTExLTMwIDE1OjU5OjUwICswMTAwICBBdXJlbGllbiBHcmltYXVkIDxnc3RlbHp6IGF0IHlhaG9vIGRvdCBmcj4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogYXZvaWQgYnVmZmVyIHJlZi91bnJlZiBwYWlycyBmb3IgQ1NSQ3MKKwkgIFdlIHJlZiB0aGUgYnVmZmVyIGJlZm9yZSBwdXNoaW5nIGl0IGRvd25zdHJlYW0gaW4gb3JkZXIgdG8gZ2V0IHRoZSBDU1JDcyBvZiBpdAorCSAgYWZ0ZXIgcHVzaGluZy4gVGhpcyBjYXVzZXMgcGVyZm9ybWFuY2UgcHJvYmxlbXMgd2hlbiBkb3duc3RyZWFtIGVsZW1lbnRzIHdhbnQgdG8KKwkgIGNoYW5nZSB0aGUgbWV0YWRhdGEgYmVjYXVzZSB0aGUgYnVmZmVyIG5lZWRzIHRvIGJlIHN1YmJ1ZmZlcmVkLgorCSAgSW5zdGVhZCwgcmVhZCBhbmQgc3RvcmUgdGhlIENTUkNzIG9mIHRoZSBidWZmZXIgaW4gYW4gYXJyYXkgYmVmb3JlIHB1c2hpbmcgaXQKKwkgIGFuZCBwcm9jZXNzIHRoZSBhcnJheSBhZnRlciBwdXNoaW5nIHRoZSBidWZmZXIuIFRoaXMgYWxsb3dzIHVzIHRvIHJlbW92ZSB0aGUKKwkgIHJlZi91bnJlZiBwYWlyLgorCSAgRml4ZXMgIzYwMzM3NgorCisyMDA5LTExLTI4IDE5OjIzOjI2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuaDoKKwkgIHNob3V0MjogdXNlIGdzdHBvbGwgZm9yIHRpbWVvdXRzCisJICBVc2Ugb3VyIG93biBHc3RQb2xsIGJhc2VkIHRpbWVvdXQgaW5zdGVhZCBvZiB0aGUgc2hvdXQgc2xlZXAgc28gdGhhdCB3ZSBjYW4KKwkgIGludGVycnVwdCB3aGVuIGRvaW5nIGEgc3RhdGUgY2hhbmdlIGFuZCBzaHV0dGluZyBkb3duLgorCSAgRml4ZXMgIzYwMjg4NworCisyMDA5LTExLTI4IDEyOjI1OjA2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGNoZWNrOiBmaXggaml0dGVyYnVmZmVyIGNoZWNrCisJICBNYWtlIHN1cmUgd2Ugc2V0IGEgYmFzZV90aW1lIG9uIHRoZSBlbGVtZW50LgorCSAgRml4IHRoZSB0aW1lb3V0IHRvIGF0IGxlYXN0IHR3aWNlIHRoZSBqaXR0ZXJidWZmZXIgbGF0ZW5jeS4KKwkgIEVuYWJsZSBwcmV2aW91c2x5IGZhaWxpbmcgdGVzdHMuCisJICBSZW1vdmUgaW1wb3NzaWJsZSBjaGVja3MuCisKKzIwMDktMTEtMjcgMTg6NTU6MjAgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA1M2EyNDg1IHRvIGRhNGM3NWMKKworMjAwOS0xMS0yNiAxNjoxNDozMCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5oOgorCSAgcnRwaDI2NGRlcGF5OiBvcHRpb25hbGx5IG1lcmdlIE5BTFVzIGludG8gQWNjZXNzIFVuaXRzCisJICAuLi4gd2hpY2ggbWF5IGJlIGV4cGVjdGVkL2Rlc2lyZWQgYnkgc29tZSBkb3duc3RyZWFtIGRlY29kZXJzCisJICAoYW5kIHNwZWMtd2lzZSBoaWdobHkgcmVjb21tZW5kZWQgZm9yIGF0IGxlYXN0IG5vbi1ieXRlc3RyZWFtIG1vZGUpLgorCisyMDA5LTExLTI2IDE3OjI5OjAzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IHRpbWVzdGFtcCBkYXRhdHlwZQorCisyMDA5LTExLTI1IDEwOjM4OjIzIC0wNjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcjogYXZvaWQgdXNpbmcgd3JvbmcgY2xvY2stcmF0ZQorCSAgQ2hlY2sgZm9yIGEgdmFsaWQgY2xvY2stcmF0ZSBiZWZvcmUgYXR0ZW1wdGluZyB0byBlc3RpbWF0ZSB0aGUgbnB0CisJICBzdG9wIHRpbWUuCisKKzIwMDktMTEtMjUgMTA6Mzc6MzAgLTA2MDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBmaXggdHlwbyBpbiBjb21tZW50cworCisyMDA5LTExLTI1IDE2OjA1OjEwICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVydGVzdDogYWRkIG9uZSBtb3JlIHRlc3QgYW5kIGZpbGUgYSBidWcgbm93CisJICBDSGFuZ2UgdGhlIGJhY2t3YXJkcyB0ZXN0IHRvIGFsd2F5cyBzZW5kIGZpcnN0IGJ1ZmZlciBmaXJzdCB0byBoYXZlIGEgZGVmaW5lCisJICBiYXNldGltZS4gQWRkIGFub3RoZXIgdGVzdCB0aGF0IHNlbmRzIGJ1ZmZlcnMgYmFja3dhcmRzIHRvIGFzc2VydCB0aGF0IG9ubHkKKwkgIGZpcnN0IHNlbnQgYnVmZmVyIGlzIGtlZXAgYW5kIHVzZWQgYXMgYmFzZXRpbWUuIERpc2FibGVkIHRob3NlIHRlc3RzIHN0aWxsLAorCSAgYXMgaXRzIG5vdCBwYXNzaW5nL2ZhaWxpbmcgY29uc2l0ZW50bHkgYW5kIGZpbGUgYSBidWcgZm9yIGppdHRlcmJ1ZmZlci4KKworMjAwOS0xMS0yNSAxMDoxNzozNCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIGppdHRlcmJ1ZmZlcnRlc3Q6IGltcHJvdmUgdGhlIHRlc3QKKwkgIHRoZSB0ZXN0cyBhcmUgYSBiaXQgbW9yZSBzb2xpZCBub3cgYnV0IHN0aWxsIG5vdCBwcm9kdWNlIHJlbGlhYmxlIHJlc3VsdHMuCisJICBXb25kZXIgaWYgdGhleSBhcmUgc3RpbGwgZmxhd2t5IG9yIGlmIGl0cyBhIGJ1ZyBpbiBqaXR0ZXJidWZmZXIuCisKKzIwMDktMTEtMjQgMTE6MTM6MDYgLTA4MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEBzb25nYmlyZG5lc3QuY29tPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgbXVsdGl1ZHBzaW5rOiByZXR1cm4gZXJyb3IgbWVzc2FnZSBvbiB3aW5kb3dzIHRvby4KKworMjAwOS0xMS0yNCAxMDo1ODo0OSAtMDgwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHNvbmdiaXJkbmVzdC5jb20+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICBtdWx0aXVkcHNpbms6IGZpcnN0IHBoYXNlIG9mIGZpeGluZyB1cCBlcnJvciByZXBvcnRpbmcgZm9yIHdpbmRvd3MuCisKKzIwMDktMTAtMzAgMDM6MTM6NTQgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBhbHNvIHNldCB0aGUgc3VnZ2VzdGVkIGJ1ZiBzaXplIGZvciBhdWRpbworCSAgV2Ugd2VyZSBvbmx5IHNldHRpbmcgdGhlIHN1Z2dlc3RlZCBidWYgc2l6ZSBmb3IgdmlkZW8sCisJICB3ZSBjYW4gc2V0IGl0IGZvciBhdWRpbyBhcyB3ZWxsLgorCSAgVGhpcyBhbmQgMTk1ZTE0NTI5ZDgwZWYzMThjZTNhNzc4YzE5OTVlZmIxMWYyNjZjZAorCSAgZml4IGFuIGlzc3VlIHRoYXQgcHJldmVudGVkIHNlZWtpbmcgb24gbGFyZ2UgYXZpIGZpbGVzCisJICBvbiBXTVAgKG5vbi1yZWNlbnQgdmVyc2lvbnMpLgorCisyMDA5LTExLTA0IDE2OjEwOjIzIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4Lmg6CisJICBhdmltdXg6IGZpeCBpbmR4IGR1cmF0aW9uIGZvciBQQ00gYXVkaW8KKwkgIEdzdEJ1ZmZlcnMgZm9yIFBDTSBhdWRpbyB1c3VhbGx5IGNvbnRhaW5zIG1vcmUgdGhhbgorCSAgMSBzYW1wbGUsIHdlIG5lZWQgdG8gZ2V0IHRoZSB0b3RhbCBudW1iZXIgb2Ygc2FtcGxlcyB0byBzZXQKKwkgIHRoZSBpbmR4IGR1cmF0aW9uLgorCisyMDA5LTExLTA0IDE2OjA0OjEwIC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIGF2aW11eDogQXVkaW8gYnVmZmVycyBzaG91bGQgYmUgcGlja2VkIGVhcmxpZXIKKwkgIEFkZHMgYSAwLjVzIGFkdmFudGFnZSBmb3IgYXVkaW8gYnVmZmVycyB0byBiZWluZworCSAgcGlja2VkIGVhcmxpZXIgZm9yIG11eGluZy4KKworMjAwOS0xMS0yNCAxNjo0MDoxOSArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBGaXggcHVzaCBtb2RlIGJ5IG1ha2luZyBzdXJlIHN0YmwgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGluIG5leHRfZW50cnlfc2l6ZSAoKQorCisyMDA5LTExLTI0IDE2OjM1OjIwICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCBvcmRlciBvZiBhcmd1bWVudHMgaW4gbG9nIG1lc3NhZ2UKKworMjAwOS0xMS0yNCAxNTo1MToyMSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJICBqcGVnZW5jOiBmaXggc3BlbGxpbmcgaW4gY29tbWVudAorCisyMDA5LTExLTIzIDE3OjU4OjE3ICswMTAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbW1vbjoKKwkgIGJ1aWxkIHN5c3RlbTogRml4IHdyb25nbHkgY29tbWl0dGVkIGNoYW5nZSB0byBjb21tb24vCisKKzIwMDktMTEtMTAgMTA6MjY6MDcgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRWFzZSBkZWJ1Z2dpbmcgYnkgcmVtb3ZpbmcgYSBnb3RvIGZvciBhbiBlcnJvciBtZXNzYWdlCisKKzIwMDktMTEtMTQgMTU6NTI6MDkgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogUGFyc2UgcGVyIHNhbXBsZSByYXRoZXIgdGhhbiBhbGwgYXQgb25jZSBidXQgYnVpbGQgY29tcGxldGUgaW5kZXggd2hlbiBzZWVraW5nCisKKzIwMDktMTEtMDQgMTc6MzE6MTUgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogU2F2ZSBhdG9tIGRhdGEgZm9yIGxhdGVyIHVzZSBzbyBpdCBkb2Vzbid0IGdldCBmcmVlZCBhZnRlciBpbml0aWFsIHBhcnNpbmcKKworMjAwOS0xMS0wNiAxMTowMDowNCArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBQYXJzZSBmcm9tIHRoZSBwcmV2aW91c2x5IHBhcnNlZCBzYW1wbGUgdXAgdG8gc2FtcGxlIG4KKworMjAwOS0xMS0wNCAxNzowNDoyMiArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBNYWtlIHF0ZGVtdXhfcGFyc2Vfc2FtcGxlcyAoKSBwYXJzZSB1cCB0byBuIHNhbXBsZXMKKworMjAwOS0xMC0yOCAxNzo0OTowMiArMDAwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBTZXBhcmF0ZSBvZmYgc3RibCBzdWItYXRvbSBpbml0aWFsaXNhdGlvbgorCisyMDA5LTEwLTI2IDIyOjQyOjM2ICswMDAwICBSb2JlcnQgU3dhaW4gPHJvYmVydC5zd2FpbkBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IE1vdmUgdmFyaWFibGVzIGludG8gY29udGV4dCBpbiBwcmVwYXJhdGlvbiBmb3IgcmVmYWN0b3Jpc2F0aW9uCisKKzIwMDktMTAtMjYgMjA6MzY6MDggKzAwMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IGJ1ZyB3aGVyZSBzdHBzIGlzIG5ldmVyIHBhcnNlZCBkdWUgdG8gbG9naWMgZXJyb3IKKworMjAwOS0xMS0wNCAxNzozMToxNSArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBQb3J0IGN0dHMgZnJvbSBHbm9kZSAqIHRvIEdzdEJ5dGVSZWFkZXIKKworMjAwOS0xMC0yMyAxMzowNjo0NCArMDEwMCAgUm9iZXJ0IFN3YWluIDxyb2JlcnQuc3dhaW5AZ21haWwuY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGF0b21wYXJzZXIuaDoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZHVtcC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmg6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X3R5cGVzLmg6CisJICBxdGRlbXV4OiBTd2l0Y2ggZnJvbSBRdEF0b21QYXJzZXIgdG8gR3N0Qnl0ZVJlYWRlcgorCisyMDA5LTExLTIzIDEyOjUzOjUwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggdHlwbyBhbmQgZ3JhbW1hcgorCisyMDA5LTExLTIyIDE5OjMwOjU4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvTWFrZWZpbGUuYW06CisJICBDbGVhbiB1cCBMREZMQUdTLCBMSUJTLCBDRkxBR1MKKwkgIEZpeCBvcmRlciwgZml4IHZhcmlhYmxlcyB0aGF0IGRvbid0IGV4aXN0LCBsaWtlIEdTVF9MSUJTX0xJQlMsCisJICB1c2UgJChMSUJNKSBpbnN0ZWFkIG9mIC1sbSwgYW5kIG1vdmUgX0xJQlMgZnJvbSBMREZMQUdTIHRvIExJQkFERC4KKwkgIFNwb3R0ZWQgYnkgSGF2YXJkIEdyYWZmLgorCisyMDA5LTExLTIwIDEwOjMxOjQ3IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSogZ3N0L2R0bWYvdG9uZV9kZXRlY3QuaDoKKwkgIGR0bWY6IFVzZSBfc3RkaW50LmggZnJvbSBjb25maWd1cmUKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MDI0NjUKKworMjAwOS0xMS0yMCAxMDozMDowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IGZpeCB0eXBvIGluIG1vZGUgZW51bSBkZXNjcmlwdGlvbgorCisyMDA5LTExLTIwIDExOjI1OjQ5ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgZG9jczogbW9yZSBsaW5rcyBhbmQgYmV0dGVyIHNob3J0IGRlc2NyaXB0aW9uCisJICBGaXggc3BlbGxpbmcgb2YgR3N0UnRwU3NyY0RlbXV4IHRvIGdldCBpdCBsaW5rZWQuIEFkZCBtb3JlIGxpbmtzLiBDaGFuZ2UKKwkgIHRoZSBzaG9ydCBkZXNjcmlwdGlvbiB0byBiZSBtb3JlIG1lYW5pbmdmdWwuCisKKzIwMDktMTEtMjAgMDk6NTg6MjYgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrcGFyc2UuYzoKKwkgIHdhdnBhY2twYXJzZTogRml4IHVuaXQgdGVzdCBmb3IgcmVjZW50IHBvc2l0aW9uIHJlcG9ydGluZyBjaGFuZ2VzCisKKzIwMDktMTEtMTkgMjA6MzM6MDcgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvdG9uZV9kZXRlY3QuYzoKKwkqIGdzdC9kdG1mL3RvbmVfZGV0ZWN0Lmg6CisJICBkdG1mOiBVcGRhdGUgZHRtZmRldGVjdCB0byBtYWtlIGl0IE1TVkMgZnJpZW5kbHkKKwkgIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02MDI0NjUKKworMjAwOS0xMS0xOSAxNjowOTozOCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgd2F2cGFja3BhcnNlOiBBZnRlciBwdXNoaW5nIGEgZnJhbWUsIHVwZGF0ZSBsYXN0X3N0b3AgdG8gdGhlIGVuZCBvZiB0aGUgZnJhbWUKKwkgIFRoaXMgaW1wcm92ZXMgcG9zaXRpb24gcmVwb3J0aW5nLCBlc3BlY2lhbGx5IGJlY2F1c2Ugb2YgdGhlIGZhY3QgdGhhdAorCSAgV2F2UGFjayBmcmFtZXMgYXJlIHVzdWFsbHkgMC41LTEuMCBzZWNvbmRzIGxvbmcuCisKKzIwMDktMTEtMTkgMTY6MDg6MzMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIHdhdnBhY2twYXJzZTogQWxsb3cgcHVsbGluZyB0aGUgbGFzdCBXYXZQYWNrIGZyYW1lIG9mIGEgZmlsZQorCSAgQmVjYXVzZSBvZiBhID49IGluc3RlYWQgb2YgYSA+LCB0aGF0IGxhc3QgZnJhbWUgb2YgYSBXYXZQYWNrIGZpbGUKKwkgIHdvdWxkIG5ldmVyIGJlIHBhcnNlZCBpbiBwdWxsIG1vZGUuCisKKzIwMDktMTEtMTkgMTA6MzA6NDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gMDcwMmZlMSB0byA1M2EyNDg1CisKKzIwMDktMTAtMjkgMDg6Mjk6MzggLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2ZvdXJjYy5oOgorCSAgcXRkZW11eDogQWRkIG1vcmUgZmllbGRzIHRvIFNWUTMgY2FwcworCSAgcXRkZW11eCBvbmx5IGFkZGVkIHRoZSB3aG9sZSBzdHNkIGF0b20gYXMgJ2NvZGVjX2RhdGEnCisJICBpbiBpdHMgb3V0cHV0IGNhcHMgZm9yIFNWUTMuIFRoaXMgcGF0Y2ggbWFrZXMgaXQgYWRkCisJICB0aGUgU0VRSCAoaW5zaWRlIGEgU01JIGF0b20pIGFuZCBhIGdhbW1hIGZpZWxkICh0YWtlbgorCSAgZnJvbSB0aGUgZ2FtYSBhdG9tKSBpZiBhdmFpbGFibGUuCisJICBGaXhlcyAjNTg3OTIyCisKKzIwMDktMTEtMTggMTc6NTU6NDIgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJICB3YXZlbmM6IFJhaXNlIHJhbmsgb2YgbXV4ZXIgdG8gUFJJTUFSWQorCisyMDA5LTExLTE4IDE3OjU0OjE2ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgeTRtOiBSYWlzZSByYW5rIG9mIGVuY29kZXIgdG8gUFJJTUFSWQorCisyMDA5LTExLTE4IDE3OjU0OjAyICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvbGF3L2FsYXcuYzoKKwkqIGdzdC9sYXcvbXVsYXcuYzoKKwkgIGxhdzogUmFpc2UgcmFuayBvZiBlbmNvZGVycyB0byBQUklNQVJZCisKKzIwMDktMTEtMTIgMTk6MTE6MTggKzAwMDAgIEJhc3RpZW4gTm9jZXJhIDxoYWRlc3NAaGFkZXNzLm5ldD4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgQWRkIHVzZXItaWQgYW5kIHVzZXItcHcgcHJvcGVydGllcworCSAgU28gdGhhdCBvbmUgZG9lc24ndCBuZWVkIHRvIG1vZGlmeSB0aGUgVVJMIHRvIGhhdmUgYWNjZXNzCisJICB0byBhdXRoZW50aWNhdGVkIFJUU1Agc3RyZWFtcy4KKwkgIGZpeGVzICM2MDE3MjgKKworMjAwOS0xMS0xOCAxMjoyMjoxMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiB1c2UgYWNxdWlyZWQgZmxhZyB3aGVuIGNoZWNraW5nIHZhbGlkIHN0YXRlCisJICBVc2UgdGhlIGFjcXVpcmVkIGZpZWxkIG9mIHRoZSByaW5nYnVmZmVyIGluIGdldF90aW1lIHRvIGtub3cgd2hlbiB3ZSBhcmUgaW4gYW4KKwkgIGludmFsaWQgc3RhdGUuIFdlIGRvbid0IGNsZWFyIHRoZSByYXRlIGZsYWcgd2hlbiByZWxlYXNpbmcgdGhlIHJpbmdidWZmZXIgc28KKwkgIHRoaXMgdmFsdWVzIGlzIG5vdCB1c2FibGUuCisJICBBdm9pZHMgc29tZSBlcnJvciBtZXNzYWdlcyBiZWluZyBwb3N0ZWQgYmVjYXVzZSB0aGUgcHVsc2VhdWRpbyBjb25uZWN0aW9uIGlzCisJICBkb3duLgorCisyMDA5LTExLTE4IDEwOjE3OjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgY29uZmlndXJlOiBidW1wIGNvcmUgcmVxdWlyZW1lbnQgdG8gMC4xMC4yNS4xIGFzIHdlbGwKKwkgIE1ha2UgaW1wbGljaXQgcmVxdWlyZW1lbnQgZXhwbGljaXQuCisKKzIwMDktMTEtMTggMTI6NTM6NDQgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggYm9ndXMgbWVtb3J5IGNodW5rIHNpemUgY2hlY2sKKworMjAwOS0xMS0xOCAxMjowMTo1MiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBpbXBsZW1lbnQgc29tZSBtb3JlIGNhbGxiYWNrcworCSAgSW1wbGVtZW50IHNvbWUgbW9yZSBjYWxsYmFja3MgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKworMjAwOS0xMS0xMSAxNTo1MDoxOSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHJlbGVhc2UgbG9jayBiZWZvcmUgZW1pdGluZyBzaWduYWxzCisJICBSZWxlYXNlIHRoZSBqYnVmIGxvY2sgYmVmb3JlIGVtaXRpbmcgdGhlIHJlcXVlc3QtcHQtbWFwIHNpZ25hbCB0byBhdm9pZAorCSAgZGVhZGxvY2tzLiBXZSBhbHNvIG5lZWQgdG8gY2F0Y2ggdGhlIHNodXRkb3duIGNhc2Ugd2hlbiBsb2NraW5nIGFnYWluLgorCSAgRml4ZXMgIzU5MzM1NAorCisyMDA5LTExLTExIDExOjU5OjE2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBidmRlcGF5Lmg6CisJICBydHA6IGFkZCBCcm9hZGNvbVZvaWNlIGRlcGF5bG9hZGVyCisKKzIwMDktMTEtMTEgMTE6Mzg6MzYgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkgIHJ0cGJ2cGF5OiBhZGQgcmZjIHJlZmVyZW5jZQorCisyMDA5LTExLTExIDExOjM3OjA3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYnZwYXkuaDoKKwkgIHJ0cDogYWRkIEJyb2FkY29tVm9pY2UgcGF5bG9hZGVyCisKKzIwMDktMTEtMDkgMTI6MTc6MzQgKzAxMDAgIEphbiBVcmJhxYRza2kgPHd1bGN6ZXJAd3VsY3plci5vcmc+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IHByb3Blcmx5IGZpbmlzaCB0aGUgRUNNQSBhcnJheQorCSAgVGhlIEVDTUEgYXJyYXkgd2l0aCB0aGUgZmlsZSBpbmRleCB3YXMgbWlzc2luZyBhIG1hbmRhdG9yeSBlbmQgbWFya2VyLgorCSAgRml4ZXMgYnVnICM2MDEyNDIuCisKKzIwMDktMTEtMTggMDI6MTU6MTUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBVc2UgbmV3IHN0aWxsLWZyYW1lIEFQSSBmcm9tIGdzdC1wbHVnaW5zLWJhc2UKKworMjAwOS0xMS0xOCAwMjoxNDo0NiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJICBCdW1wIGdzdC1wbHVnaW5zLWJhc2UgcmVxdWlyZW1lbnQgdG8gMC4xMC4yNS4xCisKKzIwMDktMTEtMTcgMTc6NTk6MTMgLTA4MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEBzb25nYmlyZG5lc3QuY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBpZGVudGlmeSBJTUEgYWRwY20gaW4gcXQgcHJvcGVybHkuCisKKzIwMDktMTEtMTggMDE6Mjc6MzcgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgQmFjayB0byBkZXZlbG9wbWVudCAtPiAwLjEwLjE3LjEKKworMjAwOS0xMS0xNyAwMTo1MzowOCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJICBBZGQgcmVsZWFzZSAwLjEwLjE3IHRvIHRoZSBkb2FwIGZpbGUKKworPT09IHJlbGVhc2UgMC4xMC4xNyA9PT0KKworMjAwOS0xMS0xNyAwMToyNTozMCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJICBSZWxlYXNlIDAuMTAuMTcKKworMjAwOS0xMS0xNyAwMDoxODoyMiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbHYucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdHIucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA5LTExLTEzIDAyOjA3OjI1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjE2LjMgcHJlLXJlbGVhc2UKKworMjAwOS0xMS0xMCAxMTo1MjoyNCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IE1ha2Ugc3VyZSB0byBpbml0aWFsaXplIHZhcmlhYmxlcyBiZWZvcmUgdXNpbmcgdGhlbQorCisyMDA5LTExLTA5IDIwOjA2OjAzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIENoYW5nZUxvZzoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjE2LjIgcHJlLXJlbGVhc2UKKworMjAwOS0xMS0wOSAxNToyMDowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGZyZWUgdGVtcG9yYXJ5IGJ1ZmZlciB3aGVuIGNoYW5naW5nIHN0YXRlIHRvIE5VTEwKKwkgIEZyZWUgdGVtcG9yYXJ5IGFsbG9jYXRpb25zIGluIHRoZSBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24gYW5kIG5vdAorCSAgb25seSB3aGVuIHRoZSBvYmplY3QgaXMgZmluYWxpc2VkLgorCisyMDA5LTExLTA5IDExOjQwOjI1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAganBlZ2RlYzogb25seSBhbGxvY2F0ZSBhcyBtdWNoIHRlbXBvcmFyeSBtZW1vcnkgYXMgbmVlZGVkIGZvciBpbmRpcmVjdCBkZWNvZGluZworCSAgV2hlbiB3ZSBjYW4ndCBkZWNvZGUgZGlyZWN0bHkgaW50byB0aGUgb3V0cHV0IGJ1ZmZlciwgbWFrZSBvdXIgdGVtcCBidWZmZXJzCisJICBvbmx5IGFzIGJpZyBhcyBuZWVkZWQgaW5zdGVhZCBvZiBhbGxvY2F0aW5nIGZvciB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbyAod2VsbCwKKwkgIHdlIHN0aWxsIGFsbG9jIG1vcmUgdGhhbiBzdHJpY3RseSBuZWVkZWQgZm9yIHNvbWUgY2FzZXMsIGJ1dCBzaWduaWZpY2FudGx5CisJICBsZXNzIHRoYW4gYmVmb3JlKS4KKworMjAwOS0xMS0wNSAyMzo0Njo1OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogcHJpbnRmIGZvcm1hdCBmaXgKKworMjAwOS0xMS0wNSAyMzo0NDoyNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9yYXcxMzk0L2dzdDEzOTRjbG9jay5jOgorCSogZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jOgorCSAgcmF3MTM5NDogcHJpbnRmIGZvcm1hdCBmaXhlcworCisyMDA5LTExLTA1IDIzOjQwOjE1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIGVxdWFsaXplcjogcHJpbnRmIGZvcm1hdCBmaXgKKworMjAwOS0xMS0wNCAyMjoxOTo1OCAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9NYWtlZmlsZS5hbToKKwkqIGdzdC9kdG1mL2dzdGR0bWYuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZkZXRlY3QuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZkZXRlY3QuaDoKKwkqIGdzdC9kdG1mL3RvbmVfZGV0ZWN0LmM6CisJKiBnc3QvZHRtZi90b25lX2RldGVjdC5oOgorCSAgZHRtZmRldGVjdDogQWRkIERUTUYgdG9uZSBkZXRlY3RvcgorCSAgSXQgbG9va3MgYXQgcmF3IGF1ZGlvIGRhdGEgYW5kIGVtaXRzIG1lc3NhZ2VzIHdoZW4gRFRNRiBpcyBkZXRlY3RlZC4KKwkgIFRoZSBkdG1mIGRldGVjdG9yIGlzIHRoZSBzYW1lIEdvZXJ0emVsIGltcGxlbWVudGF0aW9uIHVzZWQgaW4gRnJlZVN3aXRjaAorCSAgYW5kIEFzdGVyaXNrLiBJdCBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4KKworMjAwOS0xMS0wNSAxMjoxMzo0NCAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IGRvIG5vdCB3cml0ZSBlbXB0eSBJTkZPIGxpc3QKKwkgIGF2b2lkIHdyaXRpbmcgYW4gZW1wdHkgSU5GTyBsaXN0IGNodW5rLCBib3RoIGJlY2F1c2UKKwkgIGl0IGlzIHVzZWxlc3MgYW5kIGJlY2F1c2UgdmxjIHJlZnVzZXMgdG8gcGxheSB0aGUKKwkgIHJlc3VsdGluZyBmaWxlLgorCisyMDA5LTExLTA1IDEwOjU0OjEyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIGVxdWFsaXplcjogTm90aWZ5IGFib3V0IGJhbmQgcHJvcGVydHkgY2hhbmdlcyBjYXVzZWQgYnkgY2hhbmdpbmcgbnVtYmVyIG9mIGJhbmRzCisKKzIwMDktMTEtMDUgMTA6NDU6NTkgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuaDoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVybmJhbmRzLmM6CisJICBlcXVhbGl6ZXI6IE1ha2UgY2hhbmdlcyB0byBiYW5kIHByb3BlcnRpZXMgYW5kIHRoZSBudW1iZXIgb2YgYmFuZHMgdGhyZWFkc2FmZQorCisyMDA5LTExLTA1IDEwOjMwOjQ2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIGVxdWFsaXplcjogRml4IHN0dXBpZCBvZmYgYnkgdHdvIGJ1ZworCisyMDA5LTExLTA1IDA4OjE4OjA1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIGVxdWFsaXplcjogQWRkIGJhbmQgcHJvcGVydHkgdG8gc2VsZWN0IHRoZSBiYW5kIGZpbHRlciB0eXBlCisJICBUaGlzIGFsbG93cyBwZXIgYmFuZCBjb25maWd1cmF0aW9uIG9mIGEgcGVhaywgbG93IHNoZWxmIG9yCisJICBoaWdoIHNoZWxmIGZpbHRlciwgd2hpY2ggY2FuIGJlIHZlcnkgdXNlZnVsIGlmIHRoZSBiYW5kIGZyZXF1ZW5jaWVzCisJICBhbmQgd2lkdGhzIGFyZSBtYW51YWxseSBjb25maWd1cmVkLgorCisyMDA5LTExLTA1IDA4OjE3OjUzICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIGVxdWFsaXplcjogRml4IGNvZGUgc3R5bGUKKworMjAwOS0xMS0wNSAwODowMzoxMyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jOgorCSAgZXF1YWxpemVyOiBTb21lIGNsZWFudXAKKworMjAwOS0xMS0wNCAyMjoyMTozNSAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJICBkdG1mc3JjOiBSZWplY3QgZW1wdHkgY2FwcworCisyMDA5LTExLTA0IDIyOjIxOjIyIC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIGR0bWZzcmM6IFVzZSBsb2cgbGV2ZWwgZm9yIHJlcGVhdGVkIGRlYnVnIG1lc3NhZ2VzCisKKzIwMDktMTEtMDQgMjA6MDU6MTcgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgZHRtZnNyYzogQWxsb3cgZm9yIGFueSBzYW1wbGVyYXRlCisKKzIwMDktMTAtMDcgMDk6MzE6MTkgLTA0MDAgIEdhYnJpZWwgTWlsbGFpcmUgPGdhYnJpZWwubWlsbGFpcmVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmM6CisJICBjZWx0cGF5L2RlcGF5IDogY2hhbmdlIEdTVF9ERUJVR19PQkpFQ1QgdG8gR1NUX0xPR19PQkpFQ1QgaW4gcGF5X2hhbmRsZV9idWZmZXIgYW5kIGRlcGF5X3Byb2Nlc3MKKworMjAwOS0xMC0wMiAxNzowNDo0MyAtMDQwMCAgR2FicmllbCBNaWxsYWlyZSA8Z2FicmllbC5taWxsYWlyZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmM6CisJICBjZWx0cGF5L2RlcGF5OiBOZWdvdGlhdGUgcGFyYW1ldGVycyB0aHJvdWdoIGNhcHMKKwkgIGNlbHRkZXBheSA6IGFkZGVkIGRlZmF1bHQgZnJhbWVzaXplKDQ4MCkgY2hhbm5lbHMoMSkgYW5kIGNsb2NrcmF0ZSgzMjAwMCkKKwkgIGRlcGF5X3NldGNhcHMgOiBub3cgZ2V0cyBjaGFubmVscyBhbmQgZnJhbWVzaXplIGZyb20gc3RyaW5nIHdpdGggZGVmYXVsdCB2YWx1ZQorCSAgZGVwYXlfcHJvY2VzcyA6IG5vdyBhZGRzIHRpbWVzdGFtcCB0byBvdXRidWYKKwkgIEFkZGVkIGZyYW1lX3NpemUgdG8gR3N0UnRwQ2VsdERlcGF5CisJICBDaGFuZ2VkIHNvbWUgR1NUX0RFQlVHIHRvIEdTVF9ERUJVR19PQkpFQ1Qgb3IgR1NUX0xPR19PQkpFQ1QKKwkgIGNlbHRwYXkgOiBnZXRjYXBzIDogZ2V0cyBjaGFubmVsIGFuZCBmcmFtZXNpemUgYW5kIHNldHMgY2FwcworCSAgQWRkZWQgZnJhbWUtc2l6ZSB0byBzdGF0aWMgY2FwcyBmb3IgYXVkaW8veC1jZWx0CisKKzIwMDktMTEtMDQgMTU6NTg6MzQgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZ3N0L2RlaW50ZXJsYWNlL01ha2VmaWxlLmFtOgorCSAgZGVpbnRlcmxhY2U6IFB1bGwgaW4gQ0ZMQUdTIGFuZCBMSUJTIGZsYWdzIGZyb20gLWJhc2UgYmVmb3JlIGNvcmUgYmVmb3JlIHN5c3RlbS4KKworMjAwOS0xMC0xNSAxNjozMzoyNCArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBwby9NYWtldmFyczoKKwkgIHBvOiBEb24ndCBjcmVhdGUgYmFja3VwIC5wbyBmaWxlcworCSAgQXMgd2VsbCBhcyBwcmV2ZW50aW5nIGNyZWF0aW9uIG9mIHVzZWxlc3MgYmFja3VwIGZpbGVzLCBpdCB3b3JrcworCSAgYXJvdW5kIGEgYnVnIGluIGdldHRleHQgMC4xNyBvbiBPUy9YCisKKzIwMDktMTEtMDQgMTY6NDc6NDIgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAaWhhdGVzdGV2ZS5sb2NhbD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6CisJICBxdGRlbXV4OiBpbml0IHZhcmlhYmxlcyB0byBtYWtlIGNvbXBpbGVyIG9uIG9zeCBidWlsZCBib3QgaGFwcHkKKworMjAwOS0xMS0wMyAxNjowNDozNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZHVtcC5jOgorCSAgcXRkZW11eDogaW5pdCB2YXJpYWJsZXMgdG8gbWFrZSBjb21waWxlciBvbiBvc3ggYnVpbGQgYm90IGhhcHB5CisKKzIwMDktMTEtMDMgMTc6MzU6MTUgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAganBlZ2RlYzogZG9uJ3QgYWxsb2NhdGUgYmlnIGFycmF5cyBvbiB0aGUgc3RhY2sKKwkgIEFkZCB0aGUgYXJyYXlzIHRvIHRoZSBpbnN0YW5jZSBkYXRhIGFuZCBhbGxvY2F0ZSBvbiBmaXJzdCB1c2UuCisKKzIwMDktMTEtMDEgMTU6NTc6NDQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiByZW1vdmUgcG9pbnRsZXNzIGNhbGwgdG8gZ3N0X2VsZW1lbnRfbm9fbW9yZV9wYWRzKCkKKworMjAwOS0xMS0wMSAwMDoyOTo1NyArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGxldmVsOiBmaXggZGVjYXkgdG8gYmUgc21vb3RoCisJICBUaGUgbGVuZ3RoIG5vdCBoYXZpbmcgYW55IGZyYWN0aW9uYWwgcGFydCBhcyBpdCB3YXMgcHJvbW90ZWQgdG8gZ2RvdWJsZSBhZnRlcgorCSAgZGl2aWRpbmcgdHdvIGd1aW50NjQuCisKKzIwMDktMTEtMDEgMDA6Mjk6MjQgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuaDoKKwkgIGxldmVsOiBjYWxjdWxhdGUgdGhlIG1lc3NhZ2UtaW50ZXJ2YWxsIHdoZW4gaXQgY2hhbmdlcworCisyMDA5LTExLTAxIDAwOjE0OjA4ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgbGV2ZWw6IGNsb2NrdGltZSBpcyBhIGd1aW50NjQsIHVzZSByaWdodCBtYWNybyB0byBpbml0IGZpZWxkcworCisyMDA5LTExLTAxIDAwOjEwOjAxICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgbGV2ZWw6IHVzZSBtb3JlIGctc3R5bGUgdHlwZXMKKworMjAwOS0xMC0zMCAwOToyNzo1OSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogT25seSBzZXQgdGhlIHZvbHVtZSBvbiBzdHJlYW0gY29ubmVjdGlvbiBpZiBwdWxzZSA+PSAwLjkuMjAgaXMgYXZhaWxhYmxlCisJICBJbiBvbGRlciB2ZXJzaW9ucyB0aGUgdm9sdW1lIHNldCBkdXJpbmcgc3RyZWFtIGNvbm5lY3Rpb24gaGFkCisJICBubyBkZWZpbmVkIHNlbWF0aWMgYW5kIHVzdWFsbHkgaXQgd2FzIGEgcmVsYXRpdmUgdm9sdW1lLiBXaGF0CisJICB3YXMgbmVlZGVkIGZvciBvdXIgdXNlIGNhc2UgaXMgYW4gYWJzb2x1dGUgdm9sdW1lIHRob3VnaCwgb3RoZXJ3aXNlCisJICB0aGUgdm9sdW1lIHdpbGwgYmUgYWx3YXlzIGRlY3JlYXNlZCBvbiBzdHJlYW0gY29ubmVjdGlvbiBpZiBpdCdzCisJICBsZXNzIHRoYW4gMTAwJS4KKwkgIFNpbmNlIHB1bHNlIDAuOS4yMCB0aGF0IHZvbHVtZSBpcyBhbHdheXMgYW4gYWJzb2x1dGUgdm9sdW1lIGlmCisJICBmbGF0IHZvbHVtZXMgYXJlIHVzZWQgYW5kIHJlbGF0aXZlIG90aGVyd2lzZSwgd2hpY2ggaXMgdGhlIHNhbWUKKwkgIGFzIGZvciBwYV9jb250ZXh0X3NldF9zaW5rX2lucHV0X3ZvbHVtZSgpLgorCSAgUmVsZXZhbnQgcHVsc2UgY2hhbmdlc2V0czoKKwkgIGh0dHA6Ly9naXQuMHBvaW50ZXIuZGUvP3A9cHVsc2VhdWRpby5naXQ7YT1jb21taXQ7aD1mMjdhNTA2OTFjOGZlNDViYWM3ZGQ2YjIxZmFjOTFhMzU5ZGVmM2ExCisJICBodHRwOi8vZ2l0LjBwb2ludGVyLmRlLz9wPXB1bHNlYXVkaW8uZ2l0O2E9Y29tbWl0O2g9MjUwMTY4NzU3OWUzNTlkNTAzMmE0ZDE2NWIyZmZjOGY1YjFiOGJhNgorCisyMDA5LTEwLTI3IDE4OjA3OjE4ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogdXNlIHNlZ21lbnRfZnVsbCB3aGVuIHdlIGNhbgorCSAgVXNlIHNlZ21lbnRfZnVsbCBzbyB0aGF0IHdlIGNhbiBwYXNzIHRoZSBhcHBsaWVkIHJhdGUgdG8gdGhlIHNlZ21lbnQgdmFsdWVzLiBXZQorCSAgd2lsbCBjaGFuZ2UgdGhlIGFwcGxpZWQgcmF0ZSB3aGVuIHdlIGltcGxlbWVudCBza2lwIG1vZGUuCisKKzIwMDktMTAtMTggMDA6MTY6MDYgKzAxMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGdtYWlsLmNvbT4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkgIHdhdmVuYzogRml4IGJ1ZmZlciBvZmZzZXQgYnkgbW92aW5nIGxlbmd0aCBpbmNyZW1lbnRhdGlvbgorCisyMDA5LTEwLTIzIDE4OjMxOjE0IC0wNzAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiBDcmVhdGUgdGhlIHZpZGVvIE5TVmlldyBpbiBSRUFEWS0+UEFVU0VEIHJhdGhlciB0aGFuIE5VTEwtPlJFQURZCisKKzIwMDktMTAtMjMgMTg6Mjg6MjIgLTA3MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEBzb25nYmlyZG5lc3QuY29tPgorCisJKiBzeXMvb3N4dmlkZW8vTWFrZWZpbGUuYW06CisJICBvc3h2aWRlbzogZXhwbGljaXRseSBsaW5rIHRvIEdTVF9MSUJTCisKKzIwMDktMTAtMjMgMTg6MDk6NDMgLTA3MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEBzb25nYmlyZG5lc3QuY29tPgorCisJKiBnc3QvYXZpL01ha2VmaWxlLmFtOgorCSogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSogZ3N0L3dhdnBhcnNlL01ha2VmaWxlLmFtOgorCSAgQWRkIGRlcGVuZGVuY2llcyBvZiBnc3RyaWZmIHRvIHRoaW5ncyB0aGF0IGxpbmsgdG8gZ3N0cmlmZiwgbmVlZGVkIG9uIFdpbjMyLgorCisyMDA5LTEwLTIzIDE3OjI1OjE3IC0wNzAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLmM6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWFsc2FzcmMtUENNQS5jOgorCSAgcnRwIGV4YW1wbGVzOiByZW1vdmUgZXhlY3V0YWJsZSBiaXRzIGZyb20gQyBmaWxlcy4KKworMjAwOS0xMC0yMyAxMToyMTo0NCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgdGVzdHM6IGRpc2FibGUgYWxsIGppdHRlcmJ1ZmZlciB0ZXN0cyBmb3Igbm93CisJICBTaW5jZSBldmVuIHRoZSBvbmUgZW5hYmxlZCBzZWVtcyB0byBmYWlsLgorCisyMDA5LTEwLTIyIDEzOjM5OjU4ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgdGVzdHM6IGFsc28gaW5jbHVkZSB0aGUgbmV3IHRlc3QgZm9yIHByZXYgY29tbWl0CisKKzIwMDktMTAtMjIgMTM6MTk6MDcgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJICB0ZXN0czogYWRkIGEgaml0dGVyYnVmZmVyIHRlc3QKKwkgIFRlc3RzIHB1c2hpbmcgYSBmZXcgYnVmZmVycyBpbiB2YXJpb3VzIG9yZGVyIGFuZCBhc3NlcnRpbmcgdGhlIG9yZGVyIHNlbnQgYnkgdGhlCisJICBqaXR0ZXJidWZmZXIuIENvbnRhaW5zIHR3byBkaXNhYmxlZCB0ZXN0cyB0aGF0IG5lZWQgbW9yZSB3b3JrLgorCisyMDA5LTEwLTIyIDEyOjMwOjE0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2FtdXg6IERpcmFjICJtdXhpbmciIHVuaXRzIGVuZCBvbiBFT1MgdG9vCisJICBBIERpcmFjIG11eGluZyB1bml0IGFyZSBhbGwgbm9uLXBpY3R1cmUsIG5vbi1lbmQtb2Ytc2VxdWVuY2UKKwkgIHBhY2tldHMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgZmlyc3QgcGljdHVyZSBvciBlb3MgcGFja2V0LgorCSAgU2VlIGh0dHA6Ly93d3cuZGlyYWN2aWRlby5vcmcvd2lraS9pbmRleC5waHAvQ29udGFpbmVyRm9ybWF0TWFwcGluZ0d1aWRlbGluZXMKKworMjAwOS0xMC0yMiAwMjowOTowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggY29tcGlsYXRpb24gd2l0aCBkZWJ1Z2dpbmcgZGlzYWJsZWQKKwkgIHRvdGFsX2lkeCBpcyBhbHdheXMgZXZhbHVhdGVkLgorCisyMDA5LTEwLTE5IDIxOjU5OjQ2ICswMzAwICBQcmlpdCBMYWVzIDxwbGFlc0BwbGFlcy5vcmc+CisKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmg6CisJICBjYWNhc2luazogbWlub3IgY2xlYW51cHMgZm9yIGhlYWRlci4KKwkgIFVzZSBHX0JFR0lOX0RFQ0xTIG1hY3JvcywgcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMgYW5kIGZpeCB0eXBvLgorCSAgU2VlICM1OTkwMTguCisKKzIwMDktMTAtMTkgMjE6NTk6MjMgKzAzMDAgIFByaWl0IExhZXMgPHBsYWVzQHBsYWVzLm9yZz4KKworCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzoKKwkgIGNhY2FzaW5rOiBleGl0IHByb3Blcmx5IHdoZW4gaW52YWxpZCBkcml2ZXIgaGFzIGJlZW4gc2VsZWN0ZWQuCisJICBTZWUgIzU5OTAxOC4KKworMjAwOS0xMC0yMCAxODoyMzoyOCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IFN0b3Agc2Nhbm5pbmcgYXQgdGhlIGxhc3QgZW50cnkuLi4gYW5kIG5vdCB0aGUgb25lIGJlZm9yZSA6KQorCSAgVGhpcyBlbnN1cmVzIHdlIGFjdHVhbGx5IHB1c2ggb3V0IGV2ZXJ5dGhpbmcKKworMjAwOS0xMC0yMCAxNzoyMDo1NSArMDIwMCAgQW5keSBXaW5nbyA8d2luZ29Ab2Jsb25nLm5ldD4KKworCSAgcXRkZW11eDogdW5wYWNrIG1vcmUgaW5mb3JtYXRpb24gaW50byBpbWFnZS94LWoyYyBjYXBzCisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZm91cmNjLmg6IEFkZCBuZXcgZm91cmNjcyBmb3IgdXNlIGJ5IHRoZSBtajIKKwkgIHVucGFja2VyLgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmMgKHF0ZGVtdXhfcGFyc2VfdHJhayk6IFVucGFjayBKUEVHMjAwMCBjb21wb25lbnQKKwkgIG1hcHBpbmcgYW5kIGNoYW5uZWwgZGVmaW5pdGlvbnMgZnJvbSB0aGUganAyaCBoZWFkZXIuIFdpbGwgYWRkCisJICBjb21wb25lbnQtbWFwIGFuZCBjaGFubmVsLWRlZmluaXRpb25zIGVsZW1lbnRzIHRvIHRoZSBjYXBzIGlmIHRoZQorCSAgY29tcG9uZW50IG1hcHMgb3IgY2hhbm5lbCBkZWZpbml0aW9ucyBhcmUgbm9uc3RhbmRhcmQsIHdoZXJlIHN0YW5kYXJkCisJICBvcmRlciBtZWFucyBSR0IsIDQ0NCBwYWNrZWQgWVVWLCBvciBncmV5c2NhbGUsIHdpdGggbm8gYWxwaGEgY2hhbm5lbC4KKwkgIEZpeGVzICM1OTg5MTUuCisKKzIwMDktMTAtMjAgMTc6MzM6NDEgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZGVpbnRlcmxlYXZlLmM6CisJICB0ZXN0czogaW5jbHVkZSBzdGRpby5oIGZvciBzc2NhbmYKKworMjAwOS0xMC0xOSAxNToyMTo1NyArMDEwMCAgQmFzdGllbiBOb2NlcmEgPGhhZGVzc0BoYWRlc3MubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBGaXggdGhlIFN0cmVhbVZvbHVtZSBpbnRlcmZhY2Ugbm90IGJlaW5nIGFkdmVydGlzZWQKKwkgIGdzdF9wdWxzZXNpbmtfaW50ZXJmYWNlX3N1cHBvcnRlZCgpIHdhcyBtaXNzaW5nIGEgY2hlY2sgZm9yIGl0LgorCSAgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU5ODkzMworCisyMDA5LTEwLTE2IDIxOjE0OjE0ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgbGV2ZWw6IGNvZGUgY2xlYW51cAorCSAgVXNlIGdkb3VibGUgaW5zdGVhZCBvZiBkb3VibGUuIENhbGN1bGF0ZSBmYWxsb2ZmX3RpbWUgb25jZSBpbnN0ZWFkIG9mIHR3aWNlLgorCisyMDA5LTEwLTE4IDE1OjUyOjAyICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogTUVNRFVNUCB0aGUganVuayBibG9icworCSAgSXQgd2lsbCBvbmx5IGFjdHVhbGx5IHB1bGwgdGhlIGp1bmsgYmxvYnMgZnJvbSB1cHN0cmVhbSBpZiB0aGUgbWVtZHVtcAorCSAgbGV2ZWwgaXMgYWN0aXZhdGVkCisKKzIwMDktMTAtMTggMTU6NTE6MzQgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBTb21lIGF2aSBmaWxlcyBoYXZlIElORk8gbGlzdHMgaW4gdGhlIGhlYWRlcnMuCisKKzIwMDktMTAtMTggMTY6MDI6MDEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBEb24ndCBzZWVrIG9uIGVtcHR5IHN0cmVhbXMKKworMjAwOS0xMC0xOCAxNTo1MDozOSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IEVuc3VyZSBfY2FsY3VsYXRlX2R1cmF0aW9uc19mcm9tX2luZGV4IG9ubHkgdXNlcyB2YWxpZCBzdHJlYW1zCisKKzIwMDktMTAtMTggMTU6NDk6MjkgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBPbmx5IGNhbGwgY29udmVydCBmdW5jdGlvbiBpZiB3ZSBoYXZlIHN0cmYuYXVkcworCisyMDA5LTEwLTE4IDE1OjQ4OjA2ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogVXNlIGZpcnN0IGluZGV4ZWQgc3RyZWFtIGZvciBzZWVraW5nLgorCSAgSW4gdGhlIGZ1dHVyZSwgbWFpbl9zdHJlYW0gY2FuIGJlIGFkanVzdGVkIHRvIGNvbnRhaW4gdGhlIG9wdGltYWwgc3RyZWFtCisJICBhcyBtZW50aW9ubmVkIGluIHRoZSBGSVhNRSBsaW5lIDM0NDAKKworMjAwOS0xMC0xOCAxNTo0Njo0OCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgYXZpZGVtdXg6IE9ubHkgZXhwb3NlIHN0cmVhbXMgdGhhdCBhY3R1YWxseSBoYXZlIHNvbWV0aGluZyBpbiBpdC4KKwkgIFRoaXMgZ3VhcmFudGVlcyB0aGF0IGluIHB1bGwtbW9kZSwgYWxsIHN0cmVhbXMgaGF2ZSBhIHZhbGlkIGluZGV4IHRvCisJICB3b3JrIHdpdGguCisKKzIwMDktMTAtMTggMTU6NDA6MzcgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBQcm9wZXJseSBtYXJrIHByZXNlbmNlIG9mIGluZGV4LgorCSAgSW5zdGVhZCBvZiBibGluZGx5IHNheWluZyB3ZSBoYXZlIGFuIGluZGV4LCBvbmx5IGRvIHNvIGlmIHdlIGhhdmUgYQorCSAgbm9uLWVtcHR5IGluZGV4LgorCisyMDA5LTEwLTE3IDAyOjE4OjUzICswMjAwICBMZW5uYXJ0IFBvZXR0ZXJpbmcgPGxlbm5hcnRAcG9ldHRlcmluZy5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlOiBuZXZlciBhcHBseSB2b2x1bWUgbW9yZSB0aGFuIG9uY2UKKwkgIEdlbmVyYWxseSBkZWNpc2lvbnMgb24gdGhlIHZvbHVtZSBvZiB0aGUgc3RyZWFtIHNob3VsZCBiZSBkb25lIGluc2lkZSBvZgorCSAgUEEsIG5vdCBpbnNpZGUgb2YgR3N0LiBPbmx5IFBBIGtub3dzIGhvdyB2b2x1bWVzIHRyYW5zbGF0ZSBiZXR3ZWVuCisJICBkZXZpY2VzIGFuZCBzIG9uLgorCSAgVGhpcyBwYXRjaCBtYWtlcyBzdXJlIHRoYXQgYWxsIHZvbHVtZXMgc2V0IHZpYSB0aGUgdm9sdW1lIHByb3BlcnR5IGFyZQorCSAgb25seSBhcHBsaWVkICpvbmNlKiB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uIEFmdGVyIGFwcGx5aW5nIHRoZW0gdGhlCisJICBjbGllbnQgc2lkZSB3aWxsIG5vdCBzdG9yZSB0aGVtIGFueW1vcmUuIFRoaXMgc2hvdWxkIG1ha2Ugc3VyZSB0aGF0CisJICByZWFsbHkgb25seSB1c2VyLXRyaWdnZXJlZCB2b2x1bWUgY2hhbmdlcyBhcmUgZm9yd2FyZGVkIHRvIHNlcnZlciwgYnV0CisJICB0aGUgY2xpZW50IG5ldmVyIHRyaWVzIHRvIHNhdmUvcmVzdG9yZSB0aGUgdm9sdW1lIGludGVybmFsbHkuCisJICBGaXhlcyBidWcgIzU5NTIzMS4KKworMjAwOS0xMC0xNyAwODo1NToxNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wbHVnaW4uYzoKKwkgIHB1bHNlc2luazogSW5pdGlhbGl6ZSBnZXR0ZXh0IGZvciB0aGUgdHJhbnNsYXRlZCBzdHJpbmdzIGluIHBsdWdpbl9pbml0KCkKKworMjAwOS0xMC0xNyAwMDoxMDozMCArMDIwMCAgTGVubmFydCBQb2V0dGVyaW5nIDxsZW5uYXJ0QHBvZXR0ZXJpbmcubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZTogdXNlICdwZXJmb3JtZXInIGFzIGEgZmFsbGJhY2sgZm9yICdhcnRpc3QnIHRhZworCisyMDA5LTEwLTE3IDAwOjA5OjM2ICswMjAwICBMZW5uYXJ0IFBvZXR0ZXJpbmcgPGxlbm5hcnRAcG9ldHRlcmluZy5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIHBvL1BPVEZJTEVTLmluOgorCSAgcHVsc2U6IHdoZW4gY29uc3RydWN0aW5nIGEgc3RyZWFtIHRpdGxlIGZyb20gdGFnIGRhdGEgbWFrZSBzdXJlIGl0IGlzIHRyYW5zbGF0YWJsZQorCisyMDA5LTEwLTE3IDAwOjA2OjE1ICswMjAwICBMZW5uYXJ0IFBvZXR0ZXJpbmcgPGxlbm5hcnRAcG9ldHRlcmluZy5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOgorCSAgcHVsc2U6IGxvb3Agd2hpbGUgY29ubmVjdGluZyB0byBzZXJ2ZXIKKwkgIHB0aHJlYWQgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlcmUgYXJlIG5vIHNwdXJpb3VzIGNvbmRpdGlvbiB2YXJpYWJsZQorCSAgd2FrZXVwcywgbmVpdGhlciBkb2VzIHBhX3RocmVhZGVkX21haW5sb29wX3h4eCgpIHdoaWNoIGlzIGEgd3JhcHBlcgorCSAgYXJvdW5kIGl0LiBTbyB3ZSBuZWVkIHRvIGxvb3AgYXJvdW5kIHRoZSBfd2FpdCgpIGZ1bmN0aW9uIHRvIG1ha2Ugc3VyZQorCSAgd2UgZ2V0IHRoZSByaWdodCB3YWtldXAuCisJICBBbHNvLCB1bmlmeSB0aGUgb3JkZXIgb2YgdGhlIHdhaXQgbG9vcHMgYWNyb3NzIHRoZSBmaWxlLgorCisyMDA5LTEwLTE3IDAwOjA1OjEwICswMjAwICBMZW5uYXJ0IFBvZXR0ZXJpbmcgPGxlbm5hcnRAcG9ldHRlcmluZy5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOgorCSogZXh0L3B1bHNlL3B1bHNlcHJvYmUuYzoKKwkgIHB1bHNlOiBtYWlubG9vcCBjcmVhdGlvbiBjYW4gZmFpbCB0b28sIHNvIGhhbmRsZSB0aGF0CisKKzIwMDktMTAtMTcgMDA6MDM6MDYgKzAyMDAgIExlbm5hcnQgUG9ldHRlcmluZyA8bGVubmFydEBwb2V0dGVyaW5nLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlbWl4ZXJjdHJsLmM6CisJICBwdWxzZTogYWRqdXN0IENIRUNLX0RFQURfR09UTyBtYWNybyB0byBnbGliIHN0eWxlCisKKzIwMDktMTAtMTYgMTc6Mjg6NDIgKzAyMDAgIExlbm5hcnQgUG9ldHRlcmluZyA8bGVubmFydEBwb2V0dGVyaW5nLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlbWl4ZXJjdHJsLmM6CisJKiBleHQvcHVsc2UvcHVsc2VtaXhlcmN0cmwuaDoKKwkqIGV4dC9wdWxzZS9wdWxzZXByb2JlLmM6CisJKiBleHQvcHVsc2UvcHVsc2Vwcm9iZS5oOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmg6CisJICBwdWxzZTogbWFrZSBhIGZldyB0aGluZ3Mgc21hbGxlciBieSBtYWtpbmcgdGhlbSBiaXRmaWVsZHMKKworMjAwOS0xMC0xNiAxNzoyNjo0MSArMDIwMCAgTGVubmFydCBQb2V0dGVyaW5nIDxsZW5uYXJ0QHBvZXR0ZXJpbmcubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJICBwdWxzZTogYnVtcCBtaW5pbXVtIGxpYnB1bHNlIHZlcnNpb24gdG8gMC45LjEwCisJICBPbGRlciB2ZXJzaW9ucyB0aGFuIDAuOS4xMCBhcmUgcmVhbGx5IHJlYWxseSBvbGQgYW5kIGJ1Z2d5LiBEcm9wCisJICBjb21wYXRpYmlsaXR5IHdpdGggdGhlbS4gTm9ib2R5IHNob3VsZCBydW4gYW55dGhpbmcgdGhhdCBvbGQuCisJICBBbHNvIHNlZTogaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTU5NTAyOQorCisyMDA5LTEwLTE2IDE4OjE4OjMxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlYnVndXRpbHMvZ3N0ZGVidWcuYzoKKwkgIGRlYnVndXRpbHM6IHJlZ2lzdGVyIHB1c2hmaWxlc3JjIGVsZW1lbnQKKworMjAwOS0xMC0xNiAxNzoyODowOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5oOgorCSAgYXZpbXV4OiBzdXBwb3J0IChzb21lKSBWQlIgYXVkaW8gbXV4aW5nCisJICBBVkkgZm9ybWF0IGNhbiBoYW5kbGUgVkJSIGF1ZGlvIHByb3ZpZGVkIGF1ZGlvIGNodW5rcyBhcmUgb2YgZml4ZWQgZHVyYXRpb24KKwkgIChjZnIgZml4ZWQgZHVyYXRpb24gdmlkZW8gZnJhbWVzKS4gIEFwcGx5IHRoaXMgYXBwcm9hY2ggdG8gKGFsd2F5cykgcGFyc2VkCisJICByYXcgQUFDIGFuZCAoaWYgcGFyc2VkKSB0byBNUEVHLTEvMiBhdWRpby4KKwkgIFNlZSAjMzY4NjgxLgorCisyMDA5LTEwLTE2IDEzOjQxOjQ1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogZml4IGJyYW5jaCBoaW50cworCSAgUmVtb3ZlIGluYXBwcm9wcmlhdGUgYnJhbmNoaW5nIGhpbnRzIGFuZCBhZGQgc29tZSBuZXcgb25lcy4KKworMjAwOS0xMC0xNiAxMjozMzowNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGZpeCByZWdyZXNzaW9uIGluIGluZGlyZWN0IGRlY29kZSBwYXRoCisJICBSZXZlcnQgdmFyaWFibGUgbmFtZSBiYWNrIHRvIHdoYXQgaXQgd2FzIGJlZm9yZSB0aGUgR19MSUtFTFkgd2FzCisJICBhZGRlZCAoaW4gY29tbWl0IDY5YzI0ZmI5KS4gVGhlIGNvZGUgd29ya3MgYmV0dGVyIHRoYXQgd2F5LgorCisyMDA5LTEwLTE2IDAyOjQ3OjM4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogZml4IHJlZ3Jlc3Npb24gd2l0aCBjZXJ0YWluIGZvcm1hdHMKKwkgIEZpeCByZWdyZXNzaW9uIGludHJvZHVjZWQgYnkgcHJldmlvdXMgY29tbWl0ICgjNTk4NTE3KS4KKworMjAwOS0xMC0xNSAxOTo0OTo1NSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGRvbid0IHVzZSBkZWNvbXByZXNzIHN0cnVjdHVyZSBtZW1iZXJzIHdlIHNob3VsZG4ndCBiZSB1c2luZworCisyMDA5LTEwLTE0IDE3OjUzOjUyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAganBlZ2RlYzogcmVtb3ZlIHNvbWUgdW51c2VkIG1lbWJlcnMgZnJvbSBqcGVnZGVjIGluc3RhbmNlIHN0cnVjdHVyZQorCisyMDA5LTEwLTE2IDExOjUzOjM4ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkgIGJ1aWxkOiB1c2UgZ3N0LWdsaWItZ2VuLm1hayB0byBmaXggdGhlIGdsaWIgYnVpbGQgcnVsZXMuCisJICBUaGUgYnVpbGQgcnVsZXMgaW4gZ2xpYi1nZW4ubWFrIHdlcmUgdXNpbmcgcGF0dGVybiBydWxlcyBpbiBhIG5vbiBzYXZlIHdheS4KKworMjAwOS0xMC0xNiAxMDoxNTozNSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gODVkMTUzMCB0byAwNzAyZmUxCisKKzIwMDktMTAtMTUgMjE6MDQ6MDIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogYWRqdXN0IGZsb3cgcmV0dXJuIGFnZ3JlZ2F0aW9uIHRvIHVwZGF0ZWQgbG9vcF9kYXRhCisJICBJbiBwYXJ0aWN1bGFyLCBlYWNoIHN0cmVhbSBpcyBub3cgdHJlYXRlZCBzZXBhcmF0ZWx5LCBhbmQgb25lIHN0cmVhbSdzCisJICBFT1Mgc2hvdWxkIG5vdCBsZWFkIHRvIG92ZXJhbGwgRU9TLgorCisyMDA5LTEwLTE1IDExOjUyOjM1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogY2hlY2sgc29tZSBtb3JlIGF0b20gc2l6ZXMgcHJpb3IgdG8gcGFyc2luZworCisyMDA5LTEwLTE1IDEzOjE5OjEzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwOiBoYW5kbGUgZXZlbnRzIGluIFRDUCBtb2RlCisJICBXZSBuZWVkIHRvIGhhbmRsZSBldmVudHMgaW4gVENQIG1vZGUgc28gdGhhdCB3ZSBjYW4gcmVwbHkgdG8gdGhlIExBVEVOQ1kgZXZlbnQKKwkgIHdpdGggVFJVRS4KKworMjAwOS0xMC0xNSAxMToyNDo0NSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBhZGQgbWlzc2luZyBhcmd1bWVudCBpbiBkZWJ1ZyBtZXNzYWdlCisKKzIwMDktMTAtMTQgMTg6NTg6MDYgKzAyMDAgIE1hcnZpbiBTY2htaWR0IDxtYXJ2QGV4aGVyYm8ub3JnPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZtdXguYzoKKwkgIGZsdm11eDogVXNlIGxvb3AgdGVzdCB0byBwcmV2ZW50IHRpbWVvdXQgb24gc2xvdyBtYWNoaW5lcworCSAgUGFydGlhbGx5IGZpeGVzIGJ1ZyAjNTk3NzM5LgorCisyMDA5LTEwLTE0IDE2OjE1OjQ4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmb3J3YXJkIGV2ZW50cyBpbnRvIHRoZSBydHBiaW4KKwkgIE9ubHkgY2F0Y2ggdGhlIFNFRUsgZXZlbnQgb24gdGhlIHNyY3BhZCBhbmQgbGV0IG90aGVyIGV2ZW50cyBlbnRlciB0aGUgcnRwYmluLgorCisyMDA5LTEwLTE0IDExOjMzOjI0IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5icj4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBGaXggbGF0ZSB0YWdzIGZpbmRpbmcKKwkgIFVzZSB0aGUgY29ycmVjdCB0YWdsaXN0IHZhcmlhYmxlIHdoZW4gbm90aWZ5aW5nIG9mIGxhdGUgdGFncy4KKworMjAwOS0xMC0xNCAxMzowOTowMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIGF2aWRlbXV4OiB1c2UgR3N0SW5kZXggZm9yIChsaW1pdGVkKSBzZWVraW5nIGluIHB1c2ggbW9kZQorCSAgLi4uIGJ1dCBkaXNhYmxlIHRoaXMgZm9yIG5vdy4gIEFsdGhvdWdoIGl0IGJhc2ljYWxseSB3b3JrcyBmaW5lLAorCSAgdXNlciBleHBlcmllbmNlIG1pZ2h0IGJlIHNoYWt5IChkZXBlbmRpbmcgb24gdGFzdGUpLCBzaW5jZSB0aGVyZQorCSAgaXMgbm8ga2V5ZnJhbWUgaW5mbyBpbiBwdXNoIG1vZGUuCisKKzIwMDktMTAtMTQgMTM6MDg6NDcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogYWRkIEdzdEluZGV4IHN1cHBvcnQKKworMjAwOS0xMC0xNCAxMTo1NTozMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBhbHNvIGRldGVybWluZSBkdXJhdGlvbiBpbiBwdXNoIG1vZGUKKworMjAwOS0xMC0xNCAxMTo1NDo0NCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IGFkZCBHc3RJbmRleCBzdXBwb3J0CisKKzIwMDktMTAtMTQgMDc6Mzg6MjYgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBTZXQgZHVyYXRpb24gb24gYnVmZmVycworCSAgVXNlIGZyYW1lcmF0ZSB0byBlc3RpbWF0ZSBkdXJhdGlvbiBvZiBidWZmZXJzLgorCSAgRml4ZXMgIzU5MDM2MgorCisyMDA5LTEwLTE0IDEyOjI4OjU1ICswMjAwICBIw6V2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmYgYXQgdGFuZGJlcmcuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJICBydHBwdGRlbXV4OiBvbmx5IGZvcndhcmQgdGhlIGxvc3QtZXZlbnQgdG8gdGhlIGxhc3Qgc2VlbiBwdC1udW1iZXIKKwkgIGZvcndhcmQgYWxsIGV2ZW50cyBvbiBhbGwgcGFkcyBleGNlcHQgZm9yIHRoZSBQYWNrZXRMb3N0IGV2ZW50LCB3aGljaCB3ZSB3YW50IHRvCisJICBmb3J3YXJkIHRvIHRoZSBsYXN0IHNlZW4gcHQgcGFkLgorCSAgRml4ZXMgIzU5ODM3NworCisyMDA5LTEwLTA2IDIyOjI4OjUwICswMzAwICBSZW7DqSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IHNldCBkZXNpcmVkIG1pbnJlcSB2YWx1ZSB0byBzZWdzaXplL2xhdGVuY3ktdGltZQorCSAgSWYgd2UgbGV0IHRoZSBkYWVtb24gZGVjaWRlIGZyZWVseSBieSBwYXNzaW5nIC0xLCB3ZSBlbmQgdXAgYWx3YXlzIGdldHRpbmcgMjBtcy4KKwkgIFdlIHdhbnQgdG8gc2V0IHRoaXMgdmFsdWUgYmVjYXVzZSBpbiBzb21lIGNhc2VzIHdlIHdhbnQgdG8gc2VsZWN0IGEgaGlnaGVyCisJICBsYXRlbmN5LXRpbWUgaW4gb3JkZXIgdG8gc2F2ZSBwb3dlci4KKwkgIEZpeGVzICM1OTc2MDEKKworMjAwOS0xMC0xNCAxMDo0MToyMSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGEzZTNjZTQgdG8gODVkMTUzMAorCisyMDA5LTEwLTEzIDE4OjMzOjM0ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy5jOgorCSAgdGVzdHMvcGlwZWxpbmUvZmxhYzogRml4IGJ1aWxkIG9uIG1hY29zeCAxMC41CisKKzIwMDktMTAtMTMgMTg6MTk6MzIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBkZW1vdGUgc29tZSB3YXJuaW5ncyB0byBkZWJ1ZworCisyMDA5LTEwLTEzIDE3OjQ3OjQwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2F2aS1pZHMuaDoKKwkgIGF2aTogYWRkIG5ldyBhdmkgZmxhZyB3ZSBtaWdodCB3YW50IHRvIHVzZQorCisyMDA5LTEwLTEzIDE3OjQ2OjIyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBjYWxjdWxhdGUgc3VnZ2VzdGVkIGJ1ZmZlciBzaXplCisJICBDYWxjdWxhdGUgdGhlIHN1Z2dlc3RlZCBidWZmZXIgc2l6ZSBiYXNlZCBvbiB0aGUgbGFyZ2VzdCBjaHVuayBpbiB0aGUgZmlsZS4KKwkgIFNlZSAjNTk3ODQ3CisKKzIwMDktMTAtMTMgMTc6NDU6MTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhdmltdXg6IGFkZCBqcGVnMjAwMCB0byBhbGxvd2VkIGNhcHMKKworMjAwOS0xMC0xMyAxNzo0MToxMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGFkZCBkZWJ1ZyBmb3IgdGhlIHN1cGVyaW5kZXggb2Zmc2V0cworCisyMDA5LTEwLTEzIDE2OjAyOjM3ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCB1bmluaXRpYWxpemVkIHZhcmlhYmxlIHdhcm5pbmcKKwkgIEZpeCBhbm90aGVyIGJvZ3VzIG1heS1iZS11c2VkLXVuaW5pdGlhbGl6ZWQgd2FybmluZyBpbiBxdGRlbXV4CisKKzIwMDktMTAtMTMgMTM6MDg6MzMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5oOgorCSAgYXZpOiBsb3dlciBtYXggZmlsZSBzaXplCisJICBNYWtlIGEgY29uc3RhbnQgb2YgdGhlIG1heCBmaWxlIHNpemUgYW5kIGxvd2VyIHRoZSB2YWx1ZSB0byB3aGF0IGZmbXBlZyBkb2VzLAorCSAgaG9wZWZ1bGx5IGltcHJvdmluZyBjb21wYXRpYmlsaXR5IHdpdGggd2luZG93cyBtZWRpYSBwbGF5ZXIuCisJICBTZWUgIzU5Nzg0NworCisyMDA5LTEwLTEzIDAxOjAyOjE1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogZml4IGJvZ3VzIHdhcm5pbmcgYWJvdXQgZGlzY29udCBmbGFnIG9uIGZpcnN0IGJ1ZmZlcgorCSAgVGhlIHZlcnkgZmlyc3QgYnVmZmVyIHNob3VsZCBhbHdheXMgaGF2ZSB0aGUgRElTQ09OVCBmbGFnIHNldCwgbm8KKwkgIG5lZWQgdG8gd2FybiBhYm91dCB0aGF0LiBPbmx5IHdhcm4gaWYgd2UgZ2V0IGEgRElTQ09OVCBidWZmZXIgaW4KKwkgIG5vbi1wYWNrZXRpc2VkIG1vZGUgYW5kIHdlIGFscmVhZHkgaGF2ZSBzb21lIGRhdGEuCisKKzIwMDktMTAtMTMgMDA6NDE6NTcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBmaXggY3Jhc2ggZm9yIHVudXN1YWwgdmVydGljYWwgY2hyb21hIHN1YnNhbXBsaW5nIGZhY3RvcnMKKwkgIEZpeGVzICM1OTczNTEuCisKKzIwMDktMTAtMTMgMDA6MTI6NDIgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogRml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgd2FybmluZ3MKKwkgIFRoZSBnY2Mgb24gdGhlIE9TL1ggYnVpbGRib3QgY29tcGxhaW5zIGFib3V0IHRoZXNlIHZhcmlhYmxlcyBub3QgYmVpbmcKKwkgIGluaXRpYWxpemVkLCBldmVuIHRob3VnaCB0aGV5IGNhbid0IHBvc3NpYmx5IGFjdHVhbGx5IGJlIHVzZWQKKwkgIHVuaW5pdGlhbGl6ZWQuCisKKzIwMDktMTAtMTEgMTE6MzU6MjMgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJICBkdG1mOiBmaXggd2FybmluZ3MgaW4gbWFjb3N4IHNub3cgbGVvcGFyZAorCisyMDA5LTEwLTEwIDAwOjM3OjA4ICswMjAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGZpeGVzIHdhcm5pbmcgYnVpbGRpbmcgaW4gc25vdyBsZW9wYXJkCisKKzIwMDktMTAtMDkgMTc6MTI6NDYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhbHNvIGNvbnNpZGVyIFF1aWNrdGltZSB0ZXh0IHN1YnRpdGxlcworCisyMDA5LTEwLTA5IDE3OjAyOjU3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcHJvdmlkZSBsYW5ndWFnZSB0YWcgZm9yIHN0cmVhbQorCisyMDA5LTEwLTA5IDE2OjMwOjU3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVmYWN0b3IgY29tbW9uIHBhcnRzIGluIHRyYWNrIHBhcnNpbmcKKworMjAwOS0xMC0wOSAxNjoyMTowMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguaDoKKwkgIHF0ZGVtdXg6IHJlZmFjdG9yIGJ1ZmZlciBwcm9jZXNzaW5nIGFuZCBzZW5kaW5nCisJICAuLi4gc28gaXQgY2FuIGJlIHVzZWQgaW4gYm90aCBwdWxsIGFuZCBwdXNoIGJhc2VkIG1vZGUuCisKKzIwMDktMTAtMDggMTM6Mzk6MjUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBleHRyYWN0IHBhbGV0dGUgZGF0YSBmb3IgZHZkIHN1YnBpY3R1cmUgc3RyZWFtcworCSAgLi4uIGFuZCBzZW5kIGl0IGRvd25zdHJlYW0gdXNpbmcgY3VzdG9tIGR2ZCBldmVudAorCisyMDA5LTEwLTA3IDE0OjAzOjE3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IHN1cHBvcnQgM0dQUCB0aW1lZCB0ZXh0IHN1YnRpdGxlcworCSAgSW4gcGFydGljdWxhciwgYWxzbyBtYWtlIHN1YnRpdGxlIHN1cHBvcnQgbGVzcyBzdWJwKGljdHVyZSktY2VudHJpYy4KKworMjAwOS0xMC0wNyAxNjoxNTo1NSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IE5VTEwgaXMgbm90IGEgdmFsaWQgdGFnbGlzdAorCisyMDA5LTA5LTIzIDE3OjIwOjI1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IHJlY29nbml6ZSBzb21lIG1vcmUgZW5jeXB0ZWQgdHJhY2sgY2FzZXMKKworMjAwOS0xMC0wOSAxNTo1OToyNSArMDIwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOgorCSAgaWQzOiBmaXhlcyB3YXJuaW5ncyBidWlsZGluZyBvbiBtYWNvc3gKKwkgIEFub3RoZXIgcm91bmQgb24gdGhlIGZvcm1hdGluZyBvZiB0aGF0IGRlYnVnIGxpbmUuCisKKzIwMDktMTAtMDkgMTQ6NDQ6MDIgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzoKKwkgIGlkMzogY2FzdCBwb2ludGVyIG1hdGggcmVzdWx0cyB0byBnbG9uZworCisyMDA5LTEwLTA5IDE0OjM3OjMyICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWM6IGFwcGFyZW50bHkgb24gc29tZSBwbGF0Zm9ybXMgYSBGTEFDX191aW50NjQhPWd1aW50NjQKKworMjAwOS0xMC0wOSAxNDoyMTowOSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSAgYnVpa2Q6IGV4cGxpY2l0ZWx5IGNhc3QsIHRvIHRlbGwgc29tZSBjb21waWxlcnMgdGhhdCB0aGlzIGlzIG5vdCBsb25nIGludAorCisyMDA5LTEwLTA5IDEzOjM4OjE3ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGdzdC9pZDNkZW11eC9pZDN0YWdzLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSAgYnVpbGQ6IGRvbid0IGNhc3QsIGJ1dCB1c2UgdGhlIHJpZ2h0IGZvcm1hdCBzcGVjaWZpZWQgaW5zdGVhZAorCSAgVGhpcyBjb3JyZWN0IHNvbWUgb2YgdGhlIHByZXZpb3VzIG1hY29zIGZpeGVzLgorCisyMDA5LTEwLTA5IDEyOjQwOjQ3ICswMjAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICBkdjogZml4IHdhcm5pbmdzIG9uIG1hY29zeAorCisyMDA5LTEwLTA5IDEyOjI1OjE5ICswMjAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWM6IGZpeCB3YXJuaW5ncyBvbiBtYWNvc3gKKworMjAwOS0xMC0wOSAxMjoxOTozNSArMDIwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBleHQvYW5ub2RleC9nc3RjbW1sZGVjLmM6CisJKiBleHQvYW5ub2RleC9nc3RjbW1sZW5jLmM6CisJICBhbm5vZGV4OiBmaXggd2FybmluZ3MgaW4gbWFjb3N4CisKKzIwMDktMTAtMDkgMTI6MTQ6MjIgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJICBvc3h2aWRlbzogZml4IGEgd2FybmluZyBkb2luZyBhIGNhc3QKKworMjAwOS0xMC0wOSAxMjoxMToxMiArMDIwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4cmluZ2J1ZmZlci5jOgorCSAgb3N4YXVkaW86IGZpeCB3YXJuaW5ncyBvbiBtYWNvc3gKKworMjAwOS0xMC0wOSAxMjowMToxMCArMDIwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkgIHJ0cHZyYXdwYXk6IGZpeCB3YXJuaW5nIG9uIG1hY29zeAorCisyMDA5LTEwLTA5IDExOjU3OjU5ICswMjAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgcnRwaDI2M3BheTogZml4IHdhcm5pbmcgb24gbWFjb3N4CisKKzIwMDktMTAtMDkgMTE6NTQ6MDMgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IHdhcm5pbmdzIGJ1aWxkaW5nIG9uIG1hY29zeAorCisyMDA5LTEwLTA5IDExOjQyOjM2ICswMjAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIGdzdC9pZDNkZW11eC9pZDN0YWdzLmM6CisJICBpZDNkZW11eDogZml4IHByaW50ZiB3YXJuaW5ncyBvbiBtYWNvc3gKKworMjAwOS0xMC0wOSAxMTozMDowMCArMDIwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZml4IHdhcm5pbmcgaW4gbWFjb3N4IG1ha2luZyB0aGUgZm9ybWF0IHBvcnRhYmxlCisKKzIwMDktMTAtMDkgMTA6NTE6MjkgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuYzoKKwkgIGF1ZGlvZng6IHVzZSBHX0dVSU5UNjRfRk9STUFUIHRvIGZpeCB3YXJuaW5ncyBvbiBPU1gKKworMjAwOS0xMC0wOSAxMDoxMTozOCArMDIwMCAgSm9zZXAgVG9ycmEgPG43NzBnYWxheHlAZ21haWwuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4cmluZ2J1ZmZlci5jOgorCSAgb3N4YXVkaW86IEZpeGVzIGJ1aWxkIG9uIG1hY29zeCBzbm93IGxlb3BhcmQuCisKKzIwMDktMTAtMDkgMTE6MzQ6MTYgKzAyMDAgIFBhdSBHYXJjaWEgaSBRdWlsZXMgPHBncXVpbGVzQGVscGF1ZXIub3JnPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICB2NGwyOiBJbmNsdWRlIHN5cy9pb2N0bC5oIGZvciB0aGUgVjRMIGlvY3RsIHJlcXVlc3RzCisJICBPbGQgdmlkZW9kZXZpY2UyLmgga2VybmVsIGhlYWRlcnMgdXNlZCBpb2N0bCBzdHVmZiB3aXRob3V0CisJICBpbmNsdWRpbmcgaW9jdGwuaCwgbWFraW5nIGNvbXBpbGF0aW9uIGZhaWwgb24gb2xkZXIgc3lzdGVtcy4KKwkgIE5vdGU6IEluY2x1ZGluZyBpb2N0bC5oIGhlcmUgaXMgb25seSBhIHdvcmthcm91bmQgZm9yIG9sZCBrZXJuZWwKKwkgIGhlYWRlcnMsIHNob3VsZCBiZSByZW1vdmVkIG9uY2UgZXZlcnlib2R5IGhhcyBuZXcgZW5vdWdoIGhlYWRlcnMuCisJICBGaXhlcyBidWcgIzU5Nzg2Ny4KKworMjAwOS0xMC0wOSAwMDoxNDowNyArMDEwMCAgSmFuIFNjaG1pZHQgPGphbi5zY2htaWR0QHN1bi5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6CisJICBjaGVjazogTWFrZSB0aGUgbGV2ZWwgdW5pdCB0ZXN0IHN1Y2NlZWQgb24gU29sYXJpcyAxMAorCSAgQWRkIGEgY29uZmlndXJlIGNoZWNrIGZvciBmdW5jdGlvbmFsIGlzaW5mKCkgYW5kIGZwY2xhc3MoKSwgYW5kCisJICB1c2UgZnBjbGFzcygpIHdoZXJlIHBvc3NpYmxlIHdoZW4gaXNpbmYoKSBpcyBub3QgYXZhaWxhYmxlLgorCisyMDA5LTA1LTE2IDEzOjUyOjUwICswMzAwICBSZW7DqSBTdGFkbGVyIDxyZW5lLnN0YWRsZXJAbm9raWEuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGZpeCBzdHJzdHIoKSB1c2FnZSBvbiBwb3NzaWJseSB1bnRlcm1pbmF0ZWQgc3RyaW5nCisKKzIwMDktMTAtMDggMTY6MTY6MTQgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgY2hlY2s6IExpbmsgYWdhaW5zdCBMSUJNIGFuZCBpbmNsdWRlIG1hdGguaCBmb3IgaXNpbmYoKQorCisyMDA5LTEwLTA3IDIxOjUxOjM4ICswMTAwICBTam9lcmQgU2ltb25zIDxzam9lcmQuc2ltb25zQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zcy9nc3Rvc3NhdWRpby5jOgorCSAgb3NzOiBEb3duZ3JhZGUgdGhlIHJhbmsgb2Ygb3Nzc3JjIHRvIFNFQ09OREFSWQorCSAgd2hpY2ggaXMgdGhlIHNhbWUgcmFuayBhcyBvc3NzaW5rIGhhcy4KKwkgIEZpeGVzIGJ1ZyAjNTk3NzMwLgorCisyMDA5LTEwLTA4IDEwOjU5OjUzICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSAxOWZhNGYzIHRvIGEzZTNjZTQKKworMjAwOS0xMC0wOCAxMDoyMDowOSArMDEwMCAgSmFuIFNjaG1pZHQgPGphbi5zY2htaWR0QHN1bi5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgYXZpL3dhdjogRml4IHNvbWUgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgaW5jb21wYXRpYmxlIHBvaW50ZXJzLgorCisyMDA5LTEwLTA1IDE3OjM2OjU1ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlLmM6CisJICBtdWx0aWZpbGU6IEZpeCBwbHVnaW4gZGVzY3JpcHRpb24KKworMjAwOS0xMC0wNyAxNDowMzoyMCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvYW5ub2RleC9nc3RjbW1sdXRpbHMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuaDoKKwkqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Rlc3RzLmM6CisJKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tYXVkaW90ZXN0LmM6CisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLW9zc3NyYy5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vc3BlY3RydW0tZXhhbXBsZS5jOgorCSAgYnVpbGQ6IGZwcmludGYsIHNwcmludGYsIHNzY2FuZiBuZWVkIHN0ZGlvLmgKKworMjAwOS0xMC0wNyAwMDozMzo0OSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgZXF1YWxpemVyOiB1c2Ugc2hlbGZpbmcgZmlsdGVycyBmb3IgZmlyc3QgYW5kIGxhc3QgYmFuZAorCSAgUmVmYWN0b3IgdGhlIGZpbHRlciBzZXR1cC4gQWRkIHR3byBuZXcgZmlsdGVycyB3aXRoIHNoZWxmIGNoYXJhY3RlcmlzdGljcyBmb3IKKwkgIGZpcnN0IGFuZCBsYXN0IGJhbmQuIENoYW5nZSBnYWluIGNhbGN1bGF0aW9uIGFzIHJlY29tbWVuZGVkIGluIHRoZSBxdW90ZWQKKwkgIGRvY3VtZW50IChubyBxcnQgbmVlZGVkKS4gUmVuYW1lIHZhcmlhYmxlcyB0byBtYXRjaCB0aGUgZm9ybXVsYXMgaW4gdGhlCisJICBkb2N1bWVudC4KKworMjAwOS0xMC0wMiAyMzo1MToyOSArMDMwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBwdWxzZXNyYzogZ3VhcmQgZnJhZ21lbnQgc2l6ZSB3aXRoIGEgbG93ZXIgbGltaXQgYmFzZWQgb24gbGF0ZW5jeS10aW1lCisJICBJbiBjYXNlIHRoYXQgdGhlIHB1bHNlIGRhZW1vbiBydW5zIHRoZSBzb3VyY2UgZGV2aWNlIGF0IGEgcmVsYXRpdmVseSBsb3cgZml4ZWQKKwkgIGZyYWdtZW50IHNpemUgY29tcGFyZWQgdG8gdGhlIHJlcXVlc3RlZCBsYXRlbmN5LXRpbWUsIGNvbmZpZ3VyZSB0aGUgcmluZyBidWZmZXIKKwkgIHNlZ3NpemUgdG8gdGhlIGxhcmdlc3QgaW50ZWdlciBtdWx0aXBsZSBvZiB0aGUgZnJhZ21lbnQgc2l6ZSB0aGF0IGlzIHN0aWxsCisJICBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJlcXVlc3RlZCBsYXRlbmN5LXRpbWUuCisJICBGaXhlcyBidWcgIzU5NzQ2My4KKworMjAwOS0xMC0wNiAxNzo0MDo0NyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBjb21tZW50L2xvZ2dpbmcgY2xlYW51cHMgYW5kIG1vcmUgYnJhbmNoIGd1aWRlcworCisyMDA5LTEwLTA1IDIyOjQzOjExICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJICBlcXVhbGl6ZXI6IGZpeCBmaWx0ZXIgaGlzdG9yeSB1c2FnZS4gRml4ZXMgIzU5NzM5NworCSAgVGhlIHByb2Nlc3MgZnVuY3Rpb25zIHdoZXJlIG92ZXJ3cml0aW5nIHRoZSBoaXN0b3J5IGZvciBlYWNoIGNoYW5uZWwuIEFsc28gcHVsbAorCSAgc29tZSBzdGF0aWMgdGhpbmdzIG91dCBvZiB0aGUgaW5uZXIgbG9vcC4KKworMjAwOS0xMC0wNSAxNjowNzoyNCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IHVzZSBsb2NraW5nIGFyb3VuZCB0aGUgc2Vzc2lvbnMKKworMjAwOS0xMC0wNSAxMTo0NjowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IG1ha2Ugc3VyZSBjb21wYXRpYmxlIGJyYW5kcyBidWZmZXIgZXhpc3RzIGJlZm9yZSBkZXJlZmVyZW5jaW5nIGl0CisKKzIwMDktMTAtMDQgMjE6NTk6MjQgKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGdtYWlsLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IHByaW50ZiB3YXJuaW5ncyBvbiBPU1gKKwkgIENhc3QgdmFyaWFibGVzIHBhc3NlZCB0byBwcmludGYgdG8gYXZvaWQgd2FybmluZ3MgYWJvdXQgaW5jb3JyZWN0CisJICBmb3JtYXRzIChtb3N0IGxpa2VseSBjYXVzZWQgYnkgc2l6ZW9mIHJldHVybmluZyBhIHNpemVfdCkuCisJICBGaXhlcyAjNTk3MzQ4LgorCisyMDA5LTEwLTAyIDAwOjIzOjM0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcmVtb3ZlIGludGVybmFsIGdlbnJlIHRhYmxlCisJICBObyBuZWVkIHRvIG1haW50YWluIG91ciBvd24gZ2VucmUgdGFibGUgaW4gcXRkZW11eC4gVGhlIGdlbnJlcyBhcmUKKwkgIGlkZW50aWNhbCB0byB0aGUgSUQzIGdlbnJlcywgc28gd2UgY2FuIGp1c3QgdXNlIGxpYmdzdHRhZydzCisJICBnc3RfdGFnX2lkM19nZW5yZV9nZXQoKSB0byBsb29rIHRoZW0gdXAuCisKKzIwMDktMTAtMDMgMTc6MTg6MjggKzAyMDAgIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGdtYWlsLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgRml4IHByaW50ZiBmb3JtYXRzIHRvIGF2b2lkIHdhcm5pbmdzIGluIGF2aWRlbXV4LiBGaXhlcyAjNTk3MjE0CisJICBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTk3MjE0CisKKzIwMDktMTAtMDMgMDk6NTI6NTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IENoYW5nZSBvbmUgR1NUX1dBUk5JTkcgdG8gYSBHU1RfREVCVUcKKworMjAwOS0xMC0wMiAxNDozNzo1NCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIGZsdmRlbXV4OiBJZiB0aGVyZSdzIG5vIGF1ZGlvIHN0cmVhbSBhZnRlciA2IHNlY29uZHMgb2YgdmlkZW8gc2lnbmFsIG5vLW1vcmUtcGFkcworCSAgLi4uYW5kIHRoZSBvdGhlciB3YXkgYXJvdW5kLiBBbHNvIGlnbm9yZSBhbnkgYXVkaW8vdmlkZW8gc3RyZWFtcyB0aGF0IGFwcGVhcgorCSAgYWZ0ZXIgbm8tbW9yZS1wYWRzLgorCSAgRml4ZXMgYnVnICM1OTcwOTEuCisKKzIwMDktMTAtMDIgMTQ6Mzc6NDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4Lmg6CisJKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6CisJICBmbHZkZW11eDogTWFrZSBzdXJlIHRvIG9ubHkgc2lnbmFsIG5vLW1vcmUtcGFkcyBhIHNpbmdsZSB0aW1lCisKKzIwMDktMTAtMDIgMjI6NTU6NDUgKzAzMDAgIFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2U6IHJlbmFtZSBwYV9idWZmZXJfYXR0ciB2YXJpYWJsZXMKKwkgIE1ha2VzIGl0IG11Y2ggZWFzaWVyIHRvIHNlZSB3aGF0IGlzIGdvaW5nIG9uIGFuZCBpcyBhIGxvdCBsZXNzIGVycm9yIHByb25lLgorCisyMDA5LTEwLTAyIDE4OjI1OjE2ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJICBydHA6IGFkZCBtaXNzaW5nIGluY2x1ZGUgdG8gZml4IHRoZSBidWlsZAorCisyMDA5LTEwLTAyIDEzOjE1OjU5ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgdmlkZW9maWx0ZXI6IGFkZCBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgdG8gcHJvcGVydHkgc2V0dGVyCisKKzIwMDktMTAtMDIgMTM6MTA6NDQgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICBsZXZlbDogZG9uJ3QgZ2l2ZSB3cm9uZyBudW1iZXIgb2YgZmllbGRzIGluIHRoZSBtZXNzYWdlIGRvY3MKKworMjAwOS0xMC0wMSAxMjo1Mjo0MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGNhY2hlIGxhdGVuY3kgaW4gbmFub3NlY29uZHMKKwkgIENhY2hlIHRoZSBsYXRlbmN5IGluIG5hbm9zZWNvbmRzIHVuaXRzIHRvIGF2b2lkIGhhdmluZyB0byBjb252ZXJ0IHRoZQorCSAgbWlsbGlzZWNvbmRzIHZhbHVlIHRvIG5hbm9zZWNvbmRzIGFsbCB0aGUgdGltZS4KKworMjAwOS0xMC0wMSAxMjoxMjowOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGhhbmRsZSAtMSBpbnB1dCB0aW1lc3RhbXBzCisJICBEb24ndCB0cnkgdG8gY2hlY2sgYSAtMSB0aW1lc3RhbXAgYWdhaW5zdCB0aGUgbWF4IGRlbGF5LgorCisyMDA5LTEwLTAxIDEwOjU0OjU1ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aTogZG9uJ3QgbWlzdWVzIHBlcmYtY2F0ZWdvcnkgYW5kIHJlbW92ZSB1bnVzZWQgZXh0IGNhdGVnb3J5CisJICBUaGUgcGVyZm9ybWFuY2UgY2F0ZWdvcnkgaXMgbWVhbnQgdG8gYmUgdXNlZCB0byBhdWRpdCBjb2RlcGF0aHMgdGhhdCBsZWFkIHRvIGJhZAorCSAgcGVyZm9ybWFuY2UgKGUuZy4gY29waWVzLCBjb252ZXJzaW9uIHRoYXQgY2FuIGJlIGF2b2lkZWQpLgorCSAgUmVtb3ZlIHRoZSBldmVudCBjYXRlZ29yeSB3aGljaCBpcyBub3QgdXNlZC4KKworMjAwOS0wOS0xNiAxNDoyMzoyNCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6CisJICBydHBnNzI5cGF5L2RlcGF5OiBEZW1vdGUgcGVyLWJ1ZmZlciBkZWJ1ZyBtZXNzYWdlcyB0byBsb2cgbGV2ZWwKKworMjAwOS0wOS0xNiAxNDoxNjoyNyAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkgIHJ0cGc3MjlwYXk6IERvbid0IGxlYWsgaW5jb21pbmcgYnVmZmVycyBhZnRlciBzdWJidWZmZXJpbmcgdGhlbQorCisyMDA5LTA5LTE2IDEzOjU3OjA1IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzoKKwkgIHJ0cGc3MjlwYXkvZGVwYXk6IEFkZCBkZWJ1ZyBjYXRlZ29yaWVzCisKKzIwMDktMDktMTYgMTM6NTU6MTkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6CisJICBydHBnNzI5cGF5OiBSZW1vdmUgbG9uZyB1bm5lZWRlZCBkZWZpbmUgcmVwbGFjZW1lbnQKKworMjAwOS0wOS0zMCAxODowNjowNyArMDEwMCAgQ2hyaXN0aWFuIEYuSy4gU2NoYWxsZXIgPGNocmlzdGlhbi5zY2hhbGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9NYWtlZmlsZS5hbToKKwkgIFVwZGF0ZSBtYWtlZmlsZSB3aXRoIG1pc3NpbmcgaGVhZGVyIGZpbGUKKworMjAwOS0wOS0zMCAxODo0NToxNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3AtQU1SLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC1QQ01BLnNoOgorCSogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuc2g6CisJKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWFsc2FzcmMtUENNQS5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjYzcC1hbHNhc3JjLUFNUi5zaDoKKwkqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjY0LWFsc2FzcmMtUENNQS5zaDoKKwkgIHJ0cDogVXNlIGF1dG9hdWRpb3tzaW5rLHNyY30gaW5zdGVhZCBvZiBhbHNhIGluIHRoZSBleGFtcGxlcworCisyMDA5LTA5LTI5IDE3OjUxOjA0ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGRvbid0IGxlYWsgb3V0cHV0IGJ1ZmZlcnMgb24gZGVjb2RpbmcgZXJyb3JzCisJICBUaGUgc2V0am1wIGhhbmRsZXMgbGlianBlZyBlcnJvci4gRnJlZSB0aGUgb3V0cHV0YmZmZXIgaWYgd2UgZG9uJ3QgbmVlZCBpdC4KKworMjAwOS0wOS0yOSAwMDowMTo1OSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGZpeCAndW51c2VkIHZhcmlhYmxlJyBjb21waWxlciB3YXJuaW5nIHdoZW4gY29tcGlsaW5nIHdpdGggR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisKKzIwMDktMDktMjMgMTQ6MjU6MDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aTogc21hbGwgY2xlYW51cHMKKworMjAwOS0wOS0yMyAxMzo1NzowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpOiBmaXggdGltZXN0YW1waW5nIGluIHNvbWUgYXVkaW8gc3RyZWFtcworCSAgRm9yIHZiciBhdWRpbyBzdHJlYW1zIHdlIG5lZWQgdG8gdXNlIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRvIGNhbGN1bGF0ZSB0aGUKKwkgIHRpbWVzdGFtcHMuCisJICBXaGVuIHRoZSBhbGxvY2F0aW9uIG9mIGFkZGl0aW9uYWwgaW5kZXggbWVtb3J5IGZhaWxzLCBkb24ndCB0aHJvdyBhd2F5IHdoYXQKKwkgIHdlIGhhZCBiZWZvcmUuCisJICBWYXJpb3VzIGNsZWFudXBzLgorCisyMDA5LTA5LTIzIDEyOjU2OjA3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmk6IGFkZCBzdXBwb3J0IGZvciBPRE1MIGluZGV4ZXMgYWdhaW4KKworMjAwOS0wOS0yMiAyMjoxMjo1OCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgYXZpOiBpbXBsZW1lbnQgaW5kZXggc2Nhbm5pbmcKKwkgIEltcGxlbWVudCBzY2FubmluZyBvZiB0aGUgZmlsZSB3aGVuIHdlIGNhbiBwYXJzZSB0aGUgaW5kZXguCisJICBTb21lIHJlZmFjdG9yaW5nIG9mIGNvbW1vbiBjb2RlLgorCSAgQ2xlYW51cHMgYW5kIGNvbW1lbnRzLgorCSAgUmVtb3ZlIHNvbWUgcmVpbXBsZW1lbnRlZCBjb2RlLgorCSAgUmVtb3ZlIGluZGV4IG1hc3NhZ2UgY29kZSBhbmQgcHV0IGEgRklYTUUgd2hlcmUgd2Ugc2hvdWxkIGRvIHNvbWV0aGluZworCSAgZXF1aXZhbGVudCBsYXRlci4KKworMjAwOS0wOS0yMiAxODoxODoyMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpOiBmaXggcmV2ZXJzZSBwbGF5YmFjaworCisyMDA5LTA5LTIyIDE3OjQyOjQ4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmk6IGZpeCBwcmV2IGtleWZyYW1lIHNlYXJjaCBhbmQgY2xlYW51cHMKKworMjAwOS0wOS0yMiAxNDo1MTozMCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpOiByZW1vdmUgY29kZSB0aGF0IGdvdCBjb252ZXJ0ZWQKKworMjAwOS0wOS0yMiAxNDo0NDo0MiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgYXZpOiBtb3JlIGNsZWFudXBzCisJICBSZW1vdmUgc29tZSBkdXBsaWNhdGUgY291bnRlcnMuCisJICBCZSBzbWFydGVyIHdoZW4gdXBkYXRlaW5nIHRoZSBjdXJyZW50IHRoZSB0aW1lc3RhbXAgYW5kIG9mZnNldCBpbiB0aGUgc3RyZWFtCisJICBiZWNhdXNlIHdlIGNhbiByZXVzZSBwcmV2aW91c2x5IGNhbGN1bGF0ZWQgdmFsdWVzIHdoZW4gc2ltcGx5IGdvIGZvcndhcmQgb25lCisJICBzdGVwLgorCSAgQ29ycmVjdGx5IHNldCBtZXRhZGF0YSBvbiBvdXRnb2luZyBidWZmZXJzLgorCisyMDA5LTA5LTIyIDEyOjM1OjMwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogc21hbGwgY2xlYW51cHMKKworMjAwOS0wOS0yMiAwMToyODo1NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpOiBmaXggcmVhZCBvZmZzZXQgYW5kIGNsZWFudXBzCisKKzIwMDktMDktMjEgMTg6MDQ6MjUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIGF2aTogcmV3cml0ZSBpbmRleCBwbGF5YmFjaworCSAgZGlzYWJsZSBjb2RlLCBzdGFydCBvbiByZWltcGxlbWVudGluZyBsb29wIGJhc2VkIG9wZXJhdGlvbi4KKwkgIFJld3JpdGUgdGhlIGluZGV4IGhhbmRsaW5nIHNvIHRoYXQgYWxsIHN0cmVhbXMgdXNlIHRoZWlyIG93biBpbmRleCBmb3IgZGVjb2RpbmcKKwkgIG1lZGlhLgorCisyMDA5LTA5LTIxIDE1OjM1OjU1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogYWRkIG5ldyBpbmRleCBwYXJzaW5nIGNvZGUKKwkgIEFkZCBhIG5ldyBmdW5jdGlvbiBhbmQgZGF0YXN0cnVjdHVyZSB0byBwYXJzZSBhbmQgaG9sZCB0aGUgaW5kZXggZW50cmllcyBvbiBhCisJICBwZXIgc3RyZWFtIGJhc2UuIEFsc28gYXZvaWQgZG9pbmcgdG9vIG11Y2ggd29yayB0cnlpbmcgdG8gZmlndXJlIG91dCB0aGUKKwkgIHRpbWVzdGFtcHMgYW5kIGR1cmF0aW9ucyBhcyB3ZSBjYW4gdHJpdmlhbGx5IGRvIHRoYXQgbGF0ZXIuCisJICBMZXNzIGluZm9ybWF0aW9uIGluIHRoZSBlbnRyaWVzIG1ha2VzIHRoZW0gMiB0aW1lcyBzbWFsbGVyIGFuZCBub3QgZG9pbmcgdG9vCisJICBtdWNoIHdvcmsgbWFrZXMgdGhpcyBjb2RlIGFib3V0IDEyIHRpbWVzIGZhc3RlciB0aGFuIHRoZSByZWd1bGFyIGNhc2UuCisJICBIb29rIGluIHRoZSBuZXcgZnVuY3Rpb24gYWxvbmdzaWRlIHRoZSBleGlzdGluZyBmdW5jdGlvbiBmb3IgY29tcGFyaXNvbiB1bnRpbAorCSAgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgaXMgdXBkYXRlZCB0byBoYW5kbGUgdGhlIG5ldyBpbmRleCBkYXRhc3RydWN0dXJlLgorCisyMDA5LTA5LTI4IDE2OjI5OjQ1ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWc6IGhhbmRsZSBtb3JlIGxpYmpwZWcgcmV0dXJuIHZhbHVlcywgYWRkIHNvbWUgbW9yZSBicmFuY2ggaGludHMKKwkgIEFsc28gcmVtb3ZlIHVudXNlZCBzaXplIHZhcmlhYmxlIGluIF9jaGFpbigpLgorCisyMDA5LTA5LTI1IDE5OjIxOjMyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc29tZSBvcHRpb25hbCBRVCBzcGVjaWZpZWQgc3RzZCBNUEVHLTQgYXRvbXMgYWxzbyBhcHBseSB0byBIMjY0CisJICBGaXhlcyAjNTk2MzE5LgorCisyMDA5LTA5LTI1IDE2OjQwOjMxICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogb25seSBzZW5kIHRhZyBldmVudHMgZG93bnN0cmVhbSBhZnRlciBuZXdzZWdtZW50CisKKzIwMDktMDktMjUgMTQ6MTQ6MDMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBpZiB0cmFuc3BvcnQgcHJvdG9jb2wgdW5zdXBwb3J0ZWQsIHRyeSBhbm90aGVyIG9uZQorCSAgQWxzbyBjaGFuZ2UgZXJyb3IgbWVzc2FnZSB0byBtb3JlIGFjY3VyYXRlbHkgcmVmbGVjdCBjYXNlcyBpbiB3aGljaAorCSAgaXQgY2FuIG9jY3VyLgorCisyMDA5LTA5LTI1IDExOjU0OjA2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgZHVyYXRpb25zIG1vZHVsbyAxPDwzMgorCSAgRm9yIGNhbGN1bGF0aW5nIHRoZSBkdXJhdGlvbnMgb2YgZWFjaCBzYW1wbGUsIHdlIGFyZSBzdXBwb3NlZCB0byBhZGQgZWFjaAorCSAgZHVyYXRpb24gbW9kdWxvIDE8PDMyIHNvIG1ha2UgdGhlIGVsYXBzZWQgdGltZSBjb3VudGVyIGEgdWludDMyLgorCSAgRml4ZXMgIzU5NTk0MgorCisyMDA5LTA5LTI0IDIwOjM4OjU0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBzbWFsbCBjbGVhbnVwCisKKzIwMDktMDktMjQgMTk6MzM6MzkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGF0b21wYXJzZXIuaDoKKwkgIHF0ZGVtdXg6IGRvbid0IHVzZSBjb3JlIEFQSSB0aGF0IGRvZXNuJ3QgZXhpc3QgeWV0CisJICBUaGVyZSdzIG5vIGdzdF9ieXRlX3JlYWRlcl9oYXNfcmVtYWluaW5nKCkgeWV0LiBGaXhlcyBidWlsZC4KKworMjAwOS0wOS0yNCAxMzoyMDo1MCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0YXRvbXBhcnNlci5oOgorCSAgcXRkZW11eDogbWFwIHNvbWUgYXRvbXBhcnNlciBmdW5jdGlvbnMgdG8gdGhlaXIgbmV3IGJ5dGVyZWFkZXIgZXF1aXZhbGVudHMKKwkgIE5vdyB0aGF0IEdzdEJ5dGVSZWFkZXIgaGFzIHVuY2hlY2tlZCBhbmQgaW5saW5lZCB2YXJpYW50cyBhcyB3ZWxsLCBtYXAKKwkgIGF0b21wYXJzZXIgZnVuY3Rpb25zIHRvIHRoZWlyIHJlc3BlY3RpdmUgYnl0ZXJlYWRlciBlcXVpdmFsZW50cy4KKworMjAwOS0wOC0yNSAxMjoxMToyOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0YXRvbXBhcnNlci5oOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6CisJICBxdGRlbXV4OiBhZGQgcXRfYXRvbV9wYXJzZXJfaGFzX2NodW5rcygpIGFuZCBmaXggaW5kZW50YXRpb24KKworMjAwOS0wOC0yMCAxODoyMTo1OSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGJhaWwgb3V0IGluc3RlYWQgb2YgdHJ5aW5nIHRvIGFsbG9jIHNpbGx5IGluZGV4IHNpemVzCisJICBJZiBpdCBsb29rcyBsaWtlIHdlIHdvdWxkIGJlIGFsbG9jYXRpbmcgYSBzaWxseSBzaXplIGZvciBvdXIgc2FtcGxlCisJICBpbmRleCwganVzdCBiYWlsIG91dCBpbnN0ZWFkIG9mIHRyeWluZyB0byBhbGxvY2F0ZSBpdC4gSGVscHMgd2l0aAorCSAgYnJva2VuIG9yIGZ1enplZCBmaWxlcyB3aGVyZSB3ZSBtaWdodCBlbmQgdXAgdHJ5aW5nIHRvIG1hbGxvYyBhCisJICBjb3VwbGUgb2YgaHVuZHJlZCBNQnMgb3RoZXJ3aXNlLgorCisyMDA5LTA4LTIwIDE2OjQ3OjI1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZXJyb3Igb3V0IGNvcnJlY3RseSBpZiB3ZSBkb24ndCBldmVuIGhhdmUgZW5vdWdoIGJ5dGVzIGZvciBhbiBhdG9tIGhlYWRlcgorCisyMDA5LTA4LTIwIDE1OjM5OjAwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogaW5pdCBmb3VyY2MgdG8gMCBhcyB3ZWxsIHRvIGF2b2lkIGludmFsaWQgcmVhZHMgd2hlbiBwcmludGYnaW5nIGVycm9yIG1lc3NhZ2UKKworMjAwOS0wOC0yMCAwMTozOToxNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0YXRvbXBhcnNlci5oOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6CisJICBxdGRlbXV4OiBhZGQgcXRfYXRvbV9wYXJzZV9oYXNfcmVtYWluaW5nKCkgdG8gYXZvaWQgb3ZlcmZsb3dzIHdpdGggX2dldF9yZW1haW5pbmcoKQorCisyMDA5LTA4LTIwIDAxOjIxOjA0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdXNlIEdzdEJ5dGVSZWFkZXIgd2hlbiBwYXJzaW5nIHRraGQgYXRvbQorCisyMDA5LTA4LTE5IDE5OjEzOjM4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdXNlIHVuc2lnbmVkIGludHMgZm9yIG5vZGUgbGVuZ3RoIGFuZCBkbyBtb3JlIHNhbml0eSBjaGVja2luZyBvZiB0aGUgYXRvbSBsZW5ndGgKKworMjAwOS0wOC0xOSAwMTozNjozMyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0YXRvbXBhcnNlci5oOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2R1bXAuaDoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfdHlwZXMuaDoKKwkgIHF0ZGVtdXg6IHVzZSBHc3RCeXRlUmVhZGVyIGZvciBhdG9tIGR1bXBpbmcgYW5kIGZpeCBhIGZldyBidWdzCisKKzIwMDktMDgtMjEgMTQ6MjE6MDggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBtb3ZlIHN0Y28sIHN0dHMsIHN0c3MgYW5kIHN0cHMgYXRvbSBwYXJzaW5nIG92ZXIgdG8gR3N0Qnl0ZVJlYWRlcgorCSAgTWFrZSBzdXJlIHdlIGRvbid0IHJlYWQgYmV5b25kIHRoZSBhdG9tIGJvdW5kYXJ5LiBOb3RlIHRoYXQgdGhlIGNvZGUKKwkgIGJlaGF2ZXMgc2xpZ2h0bHkgZGlmZmVyZW50bHkgaW4gdGhlIGNvcm5lciBjYXNlIHdoZXJlIHRoZXJlIGlzIG5vdAorCSAgZW5vdWdoIGF0b20gZGF0YSBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc2FtcGxlcyAobl9zYW1wbGVzX3RpbWUpCisJICBpbiB0aGUgYXRvbSwgYnV0IHN0aWxsIGVub3VnaCBkYXRhIHRvIGZpbGwgdGhlIHByZS1hbGxvY2F0ZWQgaW5kZXggb2YKKwkgIG5fc2FtcGxlcyBlbnRyaWVzOiBiZWZvcmUgd2Ugd291bGQganVzdCBzdG9wIHBhcnNpbmcgdGhlIHN0dHMgZGF0YQorCSAgYW5kIGNvbnRpbnVlLCB3aGVyZWFzIG5vdyB3ZSB3aWxsIGxpa2VseSBlcnJvciBvdXQuIFRoaXMgc2hvdWxkIG5vdAorCSAgYmUgYSBwcm9ibGVtIGluIHByYWN0aWNlIHRob3VnaC4gV2UgY291bGQgbWFpbnRhaW4gdGhlIG9sZCBiZWhhdmlvdXIKKwkgIGJ5IGRvaW5nIHJlYWRzIHdpdGggYSBzaXplIGNoZWNrIGluc2lkZSB0aGUgbG9vcCBpZiBuZWVkZWQuCisKKzIwMDktMDYtMzAgMTk6NTE6MTUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiB1c2UgYnl0ZXJlYWRlciB0byBwYXJzZSBzdHN6IGFuZCBzdHNjIGF0b21zCisJICBVc2UgR3N0Qnl0ZVJlYWRlciB0byBwYXJzZSBzdHN6IGFuZCBzdHNjIGNodW5rcywgYW5kIGNoZWNrIHNpemUgb2YKKwkgIGF2YWlsYWJsZSBkYXRhIGJlZm9yZSBwYXJzaW5nIGl0LCBpbnN0ZWFkIG9mIGJsaW5kbHkgYXNzdW1pbmcgdGhlcmUKKwkgIHdpbGwgYmUgZW5vdWdoIGRhdGEuIEZpeGVzIGNyYXNoZXMgd2l0aCBzb21lIGZ1enplZC9icm9rZW4gZmlsZXMuCisKKzIwMDktMDgtMTUgMjA6Mzg6NDAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGF0b21wYXJzZXIuaDoKKwkgIHF0ZGVtdXg6IGFkZCBxdF9hdG9tX3BhcnNlcl9nZXRfb2Zmc2V0KCkgYW5kIG9wdGltaXNlIF9wZWVrX3N1YigpCisKKzIwMDktMDctMDEgMTM6NDk6NTcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9NYWtlZmlsZS5hbToKKwkqIGdzdC9xdGRlbXV4L3F0YXRvbXBhcnNlci5oOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogYWRkIFF0QXRvbVBhcnNlciwgYW4gaW5saW5lZCBHc3RCeXRlUmVhZGVyIHZhcmlhbnQKKworMjAwOS0wOS0yMyAxNzoxOTozNCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICBtYXRyb3NrYWRlbXV4OiB1c2UgcHJvcGVyIG9yZGVyIGZvciBuby1tb3JlLXBhZHMgYW5kIG5ld3NlZ21lbnQgYW5kIHRhZyBzZW5kaW5nCisKKzIwMDktMDktMjMgMDk6NTA6MzcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IHNwcmlua2xlIGEgZmV3IGJyYW5jaCBwcmVkaWN0aW9uIG1hY3JvcworCisyMDA5LTA5LTIyIDE1OjAzOjIwICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOgorCSogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6CisJICBGaXggY29tcGlsZSB3YXJuaW5ncyB3aXRoIGdjYyA0LjAuMS4KKworMjAwOS0wOS0yMiAxMTo0ODo1MCArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYW11eDogRG9uJ3QgZ2V0IHN0dWNrIGluIGFuIGluZmluaXRlIGxvb3Agd2l0aCBEaXJhYworCSAgQXQgdGhlIGVuZCwgRGlyYWMgc3RyZWFtcyBoYXZlIGFuIEVPUyBwYWNrZXQgd2l0aCAwIGxlbmd0aC4KKwkgIERvbid0IGV2ZXIgc2l0IGluIGFuIGluZmluaXRlIGxvb3Agd2hlbiBwcm9jZXNzaW5nIG9uZS4gQWxsb3dzCisJICBtdXhpbmcgRGlyYWMgaW50byBta3YgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LgorCisyMDA5LTA5LTIyIDExOjAzOjQ2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogLmdpdGlnbm9yZToKKwkgIFVwZGF0ZSAuZ2l0aWdub3JlCisKKzIwMDktMDktMjIgMTE6MDI6MDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbToKKwkgIHZpZGVvbWl4ZXI6IGZpeCB1cCBNYWtlZmlsZSBzb21lIG1vcmUKKwkgIFJlbW92ZSBDRkxBR1MgZnJvbSBMSUJBREQgYW5kIG1ha2Ugb3JkZXIgb2YgdGhlIHZhcmlvdXMgQ0ZMQUdTIGFuZAorCSAgTElCUyBhdCBsZWFzdCBjb25zaXN0ZW50IHdpdGggZWFjaCBvdGhlci4KKworMjAwOS0wOS0yMiAwODowMjo0OCArMDIwMCAgQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbkBzdW4uY29tPgorCisJKiBnc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbToKKwkgIHZpZGVvbWl4ZXI6IEFkZCAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgdG8gTERGTEFHUyBmb3IgbGlua2luZyBsaWJnc3R2aWRlbworCSAgRml4ZXMgYnVnICM1OTU4OTcuCisKKzIwMDktMDktMjEgMTg6MDk6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aTogZml4IHRpbWVzdGFtcHMgaW4gcHVzaCBtb2RlCisKKzIwMDktMDktMTggMTc6MjY6NDIgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogYWRkIGEgR19VTkxJS0VMWSBhbmQgcHV0IHBlcmYtY2F0IGxvZyB0byBjb2RlIHBhdGggdGhhdCBjb3BpZXMKKworMjAwOS0wOS0yMSAxMjozMjo1MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpOiBhZGQgc29tZSBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMKKwkgIE1lYXN1cmUgdGhlIHBlcmZvcm1hbmNlIG9mIHZhcmlvdXMgaW5kZXggYW5kIGhlYWRlciBwYXJzaW5nIHN0ZXBzIHRvIHRoZQorCSAgUEVSRk9STUFOQ0UgZGVidWcgY2F0ZWdvcnkuCisKKzIwMDktMDktMTggMTE6NTM6MTIgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkgIHNwZWV4ZGVjOiBhbGxvdyBmb3IgdW5rbm93biB2YXJ5aW5nIG51bWJlciBvZiBmcmFtZXMgcGVyIGJ1ZmZlcgorCSAgSW4gcGFydGljdWxhciwgdGhpcyBjYXRlcnMgZm9yIFJUUCBwYXlsb2FkcyB3aXRoIG11bHRpcGxlIGZyYW1lcworCSAgcGVyIHBhY2tldC4KKworMjAwOS0wOS0xOCAxMTo0NTowNiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOgorCSAgc3BlZXhkZWM6IHVzZSBjb3JyZWN0IHNhbXBsZSBzaXplIGluIGNvbnZlcnNpb25zCisKKzIwMDktMDktMTggMTE6NDM6NDYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkgIHNwZWV4ZW5jOiBmaXggYnVmZmVyIHRpbWUgYW5kIGR1cmF0aW9uIGZvciBtdWx0aXBsZSBmcmFtZXMgcGVyIHBhY2tldAorCisyMDA5LTA5LTE4IDE0OjIyOjAyICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBzb21lIGxvZ2dpbmcgY2xlYW51cCB0byBoZWxwIHVuZGVyc3RhbmRpbmcgdGhlIGluZGV4IHBhcnNpbmcgb3ZlcmhlYWQKKworMjAwOS0wOS0xNiAxMzoyODoyNyAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIHN5cy9vc3hhdWRpby9NYWtlZmlsZS5hbToKKwkgIG9zeGF1ZGlvOiBsaW5rIGFnYWluc3QgR1NUX0JBU0VfTElCUworCisyMDA5LTA5LTE1IDE3OjI0OjI0IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSAgcnRwZzcyOXBheTogRml4IGFkYXB0ZXIgbGVhaworCSAgVGhlIGFkYXB0ZXIgd291bGQgYmUgbGVha2VkIGlmIGl0IHdhcyBlbXB0eSBhbmQgdGhlIGRhdGEgY291bGQgYmUgcHVzaGVkIG91dCBkaXJlY3RseS4KKworMjAwOS0wOS0xNSAxMDowNDozMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzcmM6IERvbid0IGRlcmVmZXJlbmNlIE5VTEwgcG9pbnRlcnMKKwkgIHBhX3N0cmVhbV9nZXRfdGltaW5nX2luZm8oKSBjYW4gcmV0dXJuIE5VTEwuCisJICBGaXhlcyBidWcgIzU5NTIyMC4KKworMjAwOS0wOS0xNSAxMDowMTo1NCArMDIwMCAgRGF2aWQgSGVubmluZ3Nzb24gPGdub21lLndlYkBlcG9zdC5kaXdpYy5zZT4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBEb24ndCBkZXJlZmVyZW5jZSBOVUxMIHBvaW50ZXJzCisJICBwYV9zdHJlYW1fZ2V0X3RpbWluZ19pbmZvKCkgY2FuIHJldHVybiBOVUxMLgorCSAgRml4ZXMgYnVnICM1OTUyMjAuCisKKzIwMDktMDktMTQgMTY6MDU6MzAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogaGFuZGxlIHN0cmVhbSBldmVudHMKKwkgIEhhbmRsZSBzdHJlYW0gZXZlbnRzIGFuZCByZXF1ZXN0IGEgUEFVU0UvUExBWSBzdGF0ZSBjaGFuZ2UgZnJvbSB0aGUgYXBwbGljYXRpb24KKwkgIHdoZW4gd2UgcmVjZWl2ZSBhIENPUksvVU5DT1JLIGV2ZW50LgorCisyMDA5LTA5LTEzIDEyOjMwOjM0IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuaDoKKwkgIG11bHRpZmlsZXNpbms6IEFkZCBuZXh0LWZpbGUgcHJvcGVydHkKKwkgIEFkZCBhIHByb3BlcnR5IHRvIGFsbG93IGNvbnRyb2wgb3ZlciB3aGF0IGV2ZW50IGNhdXNlcyBhIGZpbGUKKwkgIHRvIGZpbmlzaCBiZWluZyB3cml0dGVuIGFuZCBhIG5ldyBmaWxlIHN0YXJ0LiAgVGhlIGRlZmF1bHQgaXMKKwkgIHRoZSBzYW1lIGFzIGJlZm9yZSAtLSBlYWNoIGJ1ZmZlciBjYXVzZXMgYSBuZXcgZmlsZSB0byBiZQorCSAgd3JpdHRlbi4gIEFkZGVkIGlzIGEgY2FzZSB3aGVyZSBidWZmZXJzIGFyZSB3cml0dGVuIHRvIHRoZQorCSAgc2FtZSBmaWxlIHVudGlsIGEgZGlzY29udGludWl0eSBpbiB0aGUgc3RyZWFtLgorCisyMDA5LTA5LTEzIDE1OjU1OjAyIC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9kdi9nc3RkdmRlbXV4Lmg6CisJICBkdmRlbXV4OiBVc2UgdmFsdWVzIGZyb20gZGVjb2RlciBzdHJ1Y3R1cmUgZGlyZWN0bHkKKwkgIERvbid0IHN0b3JlIHRoZSBzYW1lIHZhbHVlcyBpbiB0aGUgR3N0RHZEZW11eC4gIFRoaXMKKwkgIGZpeGVzIGEgYnVnIHdoZXJlIGR2ZGVtdXggd291bGQgZGV0ZWN0IGEgc3RyZWFtIGFzIFBBTAorCSAgaW5zdGVhZCBvZiBOVFNDLCBhbmQgc2lsZW50bHkgcGFyc2UgaXQgd3JvbmcuCisKKzIwMDktMDktMTMgMTI6MjA6MjMgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZHYvTWFrZWZpbGUuYW06CisJKiBleHQvZHYvZ3N0c21wdGV0aW1lY29kZS5jOgorCSogZXh0L2R2L2dzdHNtcHRldGltZWNvZGUuaDoKKwkqIGV4dC9kdi9zbXB0ZV90ZXN0LmM6CisJICBkdmRlbXV4OiBBZGQgY29kZSB0byBwYXJzZSBTTVBURSB0aW1lIGNvZGVzCisJICBDb2RlIHRvIGNvbnZlcnQgdGltZSBjb2RlcyB0by9mcm9tIHRpbWVzdGFtcHMgYW5kIGZyYW1lIG51bWJlcnMuCisKKzIwMDktMDktMTMgMTI6MDE6MjcgLTA3MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguaDoKKwkgIGR2ZGVtdXg6IEZpeCBkZXRlY3Rpb24gb2YgbmV3IG1lZGlhCisJICBUaGVyZSBhcmUgNSBvciA2IEFBVVggc291cmNlIGNvbnRyb2wgcGFja3MgaW4gYSBmcmFtZSwgYW5kIGFueQorCSAgb2YgdGhlbSBjb3VsZCBoYXZlIFJFQ19TVCBjbGVhcmVkLCBpbmRpY2F0aW5nIGEgcmVjb3JkaW5nIHN0YXJ0CisJICBwb2ludC4gIGxpYmR2IG9ubHkgY2hlY2tzIHRoZSBmaXJzdC4KKworMjAwOS0wOS0xMiAxOToyNTozNiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkgIGR2ZGVtdXg6IFNldCBESVNDT05UIGZsYWcgb24gYnVmZmVycyB3aGVuIFJFQ19TVCBmbGFnIGlzIHNldC4KKwkgIEFsc28gYWRkIGEgZmV3IGJyYW5jaCBwcmVkaWN0aW9uIG1hY3JvcworCisyMDA5LTA5LTEyIDAwOjEzOjA0ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy95NG1lbmMuYzoKKwkgIGNoZWNrOiBGaXggYSBjb3VwbGUgb2YgdGVzdHMuCisJICBUaGUgc291cGh0dHBzcmMgdGVzdCB3YXNuJ3QgY29tcGlsaW5nLiBUaGUgc291cC1taXNjLmggaGVhZGVyIGlzIG5lZWRlZCBmb3IKKwkgIHNvdXBfc3NsX3N1cHBvcnRlZC4KKwkgIEZpeCB0aGUgeTRtZW5jIHRlc3QgdG8gdXNlIGEgJ3Byb2dyZXNzaXZlJyBoZWFkZXIgZm9yIHRoZSB0ZXN0IGRhdGEgbm93IHRoYXQKKwkgIHRoZSBlbGVtZW50IG91dHB1dHMgY29ycmVjdCBpbnRlcmxhY2luZyBpbmZvLgorCisyMDA5LTA5LTExIDEzOjMyOjM5IC0wNzAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogdHJlYXQgYSB6ZXJvLXNpemVkIGRhdGEgY2h1bmsgYXMgZXh0ZW5kaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUuCisJICBUaGlzIGZpeGVzIHBsYXliYWNrIG9mIHNvbWUgZmlsZXMgdGhhdCBkb24ndCBoYXZlIGEgdmFsaWQgZGF0YSBjaHVuayBsZW5ndGgsCisJICBhcHBhcmVudGx5IHNvbWUgcHJvZ3JhbSBjcmVhdGVzIHRoZXNlLgorCisyMDA5LTA5LTExIDIyOjI0OjQ3ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgIHY0bDJzcmM6IGFkZCBhIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIGdldF9mcmFtZSBmdW5jdGlvbiBhbmQgb3B0aW1pemUgYSBiaXQKKwkgIFVzZSBhIGZ1bmN0aW9uLXBvaW50ZXIgZm9yIG1tYXAvcmVhZCwgYXMgdGhpcyBjYW4ndCBjaGFuZ2UgZHVyaW5nIGNhcHR1cmUuIEFsc28KKwkgIHNwcmlua2xlIGEgZmV3IEdfTElLRUxZL1VOTElLRUxZIHRvIGltcHJvdmUgdGhlIGVycm9yLWxlc3MgY29kZSBwYXRoLgorCisyMDA5LTA5LTExIDIyOjE1OjAxICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDI6IGxvZyBidWZmZXIgY29waWVzIG9uIHF1ZXVlIHVuZGVycnVuIGluIHBlcmYgY2F0ZWdvcnkKKwkgIHY0bDJzcmMgaGFzIGEgc2xvdyBwYXRoIHdoZXJlIGl0IGRvZXMgYnVmZmVyLWNvcGllcyB3aGVuIGl0IHJ1bnMgb3V0IG9mIHF1ZXVlZAorCSAgYnVmZmVycy4gTG9nIHRoaXMgdG8gcGVyZm9ybWFuY2UgY2F0ZWdvcnkgdG8gaGVscCBtb25pdG9yaW5nIGl0LgorCisyMDA5LTA5LTExIDE1OjE0OjE1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBJbXBsZW1lbnQgR3N0U3RyZWFtVm9sdW1lIGludGVyZmFjZQorCisyMDA5LTA5LTExIDE2OjA5OjQwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSAgcHVsc2VzaW5rOiBJbXBsZW1lbnQgbXV0ZSBwcm9wZXJ0eQorCisyMDA5LTA5LTExIDEzOjMzOjMxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmM6CisJICBnZGtwaXhidWZzaW5rOiBmaXggZG9jcyByZWZlcmluZyB0byBzZW5kLW1lc3NhZ2VzCisKKzIwMDktMDktMTEgMTM6Mjg6MzUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICBzcGVjdHJ1bTogYWRkIHBvc3QtbWVzc2FnZXMgcHJvcGVydHkKKwkgIEFkZCBhIHBvc3QtbWVzc2FnZXMgcHJvcGVydHkgYW5kIGRlcHJlY2F0ZSB0aGUgbGVzcyBkZXNjcmlwdGl2ZSBtZXNzYWdlCisJICBwcm9wZXJ0eS4KKworMjAwOS0wOS0xMSAxMzoyMDowNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5oOgorCSAgcGl4YnVmc2luazogYWRkIHBvc3QtbWVzc2FnZXMgcHJvcGVydHkKKwkgIEFkZCBwb3N0LW1lc3NhZ2VzIGFuZCBkZXByZWNhdGUgc2VuZC1tZXNzYWdlcyBhcyB0aGUgZm9ybWVyIGlzIG1vcmUKKwkgIGRlc2NyaXB0aXZlIG9mIHdoYXQgYWN0dWFsbHkgaGFwcGVucy4KKworMjAwOS0wOS0xMSAxMzoxMjo1NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuaDoKKwkgIG11bHRpZmlsZXNpbms6IHJlbmFtZSBzaWxlbnQgdG8gcG9zdC1tZXNzYWdlcworCSAgVXNlIHRoZSBwb3N0LW1lc3NhZ2VzIHByb3BlcnR5IG5hbWUgaW5zdGVhZCBvZiBzaWxlbnQgYXMgaXQgaXMgbW9yZQorCSAgZGVzY3JpcHRpdmUuCisKKzIwMDktMDktMTEgMTI6MTY6MTggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmg6CisJICBtdWx0aWZpbGVzaW5rOiBwb3N0IG1lc3NhZ2VzIGZvciBlYWNoIGJ1ZmZlcgorCSAgQWRkIGEgc2lsZW50IHByb3BlcnR5IHRoYXQgY2FuIGJlIHNldCB0byBGQUxTRSB0byBwb3N0IG1lc3NhZ2VzIG9uIHRoZSBidXMgZm9yCisJICBlYWNoIHdyaXR0ZW4gZmlsZS4KKwkgIERvIHNvbWUgbW9yZSBjbGVhbnVwcy4KKwkgIEFkZCBzb21lIGRvY3MuCisJICBGaXhlcyAjNTk0NjYzCisKKzIwMDktMDktMDkgMTg6MTM6MjkgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJICBydHBoMjYzcGF5OiBBbGxvY2F0ZSBCb3VuZHJ5IHN0cnVjdHMgb24gdGhlIHN0YWNrIGluc3RlYWQgb2YgdGhlIGhlYXAgdG8gYXZvaWQgbGVha3MKKwkgIEZpeGVzIGJ1ZyAjNTk0NjkxLgorCisyMDA5LTA5LTEwIDEwOjI4OjQ4ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSAgZG9jczogZml4IGd0ay1kb2Mgd2FybmluZ3MKKworMjAwOS0wOS0xMCAxMDoyNjoyMyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzaW5rLmg6CisJICBkb2NzOiBmaXggZ3RrLWRvYyB3YXJuaW5ncworCisyMDA5LTA5LTA5IDE3OjUxOjE5IC0wNzAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L3JhdzEzOTQvTWFrZWZpbGUuYW06CisJKiBleHQvcmF3MTM5NC9nc3QxMzk0Y2xvY2suYzoKKwkqIGV4dC9yYXcxMzk0L2dzdDEzOTRjbG9jay5oOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuaDoKKwkgIGR2MTM5NHNyYzogQWRkIGEgY2xvY2sgYmFzZWQgb24gaXNvY2hyb25vdXMgY3ljbGUgY291bnRlcgorCSAgUGFydGlhbCBmaXggZm9yICMxNjkzODMuCisKKzIwMDktMDktMDkgMTY6MDI6MDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBGaXggQVlVVi0+STQyMCBjb252ZXJzaW9uCisJICBGb3IgdGhpcyBmaXggdGhlIGF2ZXJhZ2luZyBvZiB0aGUgY2hyb21hIHZhbHVlcy4gSXQgc2hvdWxkJ3QgYmUgKGEvMiArIGIpLzIKKwkgIGJ1dCBqdXN0IChhICsgYikvMi4KKwkgIEZpeGVzIGJ1ZyAjNTk0NTk5LgorCisyMDA5LTA5LTA5IDE2OjI1OjA2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IHJlbW92ZSByaW5nYnVmZmVyIHJlc2V0IGNvbXBlbnNhdGlvbgorCSAgUmVtb3ZlIHRoZSBjb2RlIHRvIGRlYWwgd2l0aCBhIHJpbmdidWZmZXIgcmVzZXQgYXMgdGhpcyBjb2RlIGlzIG5vdyBpbiB0aGUgYmFzZQorCSAgY2xhc3MuCisJICBCdW1wIHRoZSAtYmFzZSByZXF1aXJlbWVudCBhcyB3ZSBuZWVkIHRoZSBuZXcgYmFzZWF1ZGlvc2luayBjb2RlIHRvIGZ1bmN0aW9uCisJICBwcm9wZXJseS4KKworMjAwOS0wOS0wOSAxNjoyNDo0OSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSAgcHVsc2VzaW5rOiB3aGl0ZXNwYWNlIGZpeGVzCisKKzIwMDktMDktMDkgMTA6Mjc6NTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaDoKKwkgIHdoaXRlc3BhY2UgZml4ZXMKKworMjAwOS0wOS0wOCAxOTozNDowOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlbWl4ZXIuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOgorCSogZXh0L3B1bHNlL3B1bHNlcHJvYmUuYzoKKwkgIHB1bHNlOiBzbWFsbCBjbGVhbnVwcworCSAgQWRkIHNvbWUgZGVidWcgaW5mbworCSAgRml4IHRoZSBzdGF0ZSBjaGFuZ2VzCisKKzIwMDktMDktMDggMTg6Mjk6MzUgKzAyMDAgIE1hcmMtQW5kcsOpIEx1cmVhdSA8bWx1cmVhdUBmbHVtb3Rpb24uY29tPgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSAgbXVsdGlwYXJ0bXV4OiBtYXJrIGRhdGEgYnVmZmVyIGFzIGRlbHRhLXVuaXQKKwkgIFNvIHRoYXQgbXVsdGlmZHNpbmsgYWx3YXlzIHN0YXJ0IHNlbmRpbmcgaGVhZGVyIGJ1ZmZlciBmaXJzdAorCSAgRml4ZXMgIzU5NDUyMAorCisyMDA5LTA5LTA4IDE3OjM3OjE1ICswMjAwICBNYXJjIExlZW1hbiA8bWFyYy5sZWVtYW5AZ21haWwuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgcnRwYmluOiBhZGQgaWdub3JlLXB0IHBhcmFtZXRlcgorCSAgQWRkIGEgcGFyYW1ldGVyICdpZ25vcmUtcHQnIHRoYXQgZGlzYWJsZXMgY3JlYXRpbmcgYSBnc3RydHBwdGRlbXV4IG1vZHVsZSBhbmQKKwkgIGdob3N0cyB0aGUgcGFkcyBvZiBnc3RydHBqaXR0ZXJidWZmZXIgaW5zdGVhZCBvZiB0aGUgb25lcyBvZiBnc3RydHBwdGRlbXV4LgorCSAgRml4ZXMgIzU5NDQ5MAorCisyMDA5LTA5LTA0IDEzOjUxOjM3ICswMjAwICBNYXJ2aW4gU2NobWlkdCA8bWFydmluX3NjaG1pZHRAZ214Lm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkgIGNoZWNrczogb25seSBydW4gSFRUUFMgdGVzdCBpZiBsaWJzb3VwIGhhcyBTU0wgc3VwcG9ydAorCisyMDA5LTA5LTA4IDEzOjU5OjU2ICswMjAwICBIw6V2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAdGFuZGJlcmcuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgcnRwYmluOiBwcm9wYWdhdGUgcGF5bG9hZC10eXBlLWNoYW5nZSBzaWduYWwgZnJvbSBkZW11eGVyCisJICBmaXhlcyAjNTk0MjU0CisKKzIwMDktMDgtMzEgMTg6NDY6MjUgKzAyMDAgIEhhdmFyZCBHcmFmZiA8aGF2YXJkLmdyYWZmQHRhbmRiZXJnLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGNoYW5nZSBzZXZlcml0eSBvZiBjbG9jay1yYXRlIGNoYW5nZSBkZWJ1ZworCSAgTWFrZSBsb2cgR1NUX0RFQlVHIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCBHU1RfV0FSTklORyBvdGhlcndpc2UuCisJICBGaXhlcyAjNTk0MjUzCisKKzIwMDktMDktMDggMTM6Mzk6MzEgKzAyMDAgIEjDpXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBhdm9pZCB0aHJvd2luZyByZW9yZGVyZWQgYnVmZmVycyB3aXRoIHNhbWUgdGltZXN0YW1wcworCSAgV2hlbiB3ZSByZWNlaXZlIGEgcmVvcmRlcmVkIHBhY2tldCB3aXRoIHRoZSBzYW1lIHRpbWVzdGFtcCBhcyB0aGUgcHJldmlvdXMgb25lCisJICAod2hpY2ggY2FuIGhhcHBlbiBmb3IgZnJhZ21lbnRlZCBwYWNrZXRzKSBkb24ndCBjb25zaWRlciB0aGUgcGFja2V0IGFzIGxvc3QgYnV0CisJICBpbnN0ZWFkIHdhaXQgZm9yIHRoZSByZW9yZGVyZWQgcGFja2V0IHRvIGFycml2ZS4KKwkgIFN3aXRjaCB0aGUgd2FybmluZy1sZXZlbCwgc28gdGhhdCBhIHJlb3JkZXJpbmcgZG9lcyBub3QgZ2V0IGEgd2FybmluZywgb25seQorCSAgYW4gYWN0dWFsIHByb2R1Y2VkIGxvc3QtcGFja2V0LgorCSAgRml4ZXMgIzU5NDI1MQorCisyMDA5LTA4LTMxIDIxOjE2OjU0ICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6CisJICBydHBqcGVnZGVwYXk6IGFkZCBtaXNzaW5nIG1hdGguaCBpbmNsdWRlCisJICBGaXhlcyAjNTk0MjQ3CisKKzIwMDktMDktMDggMTM6MzA6MjkgKzAyMDAgIEFybm91dCBWYW5kZWNhcHBlbGxlIDxhcm5vdXRAbWluZC5iZT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IG1lbW9yeSBsZWFrCisJICBJbiBnc3RfcnRzcHNyY19wYXJzZV9kaWdlc3RfY2hhbGxlbmdlKCksIHJ0c3BzcmMgZG9lcyBhIGdfc3RybmR1cCBvZiB0aGUgYXV0aAorCSAgaGVhZGVyIGl0ZW1zIGFuZCB0aGVuIHBhc3NlcyB0aGVtIHRvIGdzdF9ydHNwX2Nvbm5lY3Rpb25fc2V0X2F1dGhfcGFyYW0oKQorCSAgd2l0aG91dCBmcmVlaW5nLgorCSAgRml4ZXMgIzU5NDEzMworCisyMDA5LTA5LTA4IDEzOjE4OjI5ICswMjAwICBTdGlnIFNhbmRuZXMgPHN0aWcuc2FuZG5lc0B0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBtYWtlIGZyZWVfc2Vzc2lvbigpIHJlbW92ZSBzdHJlYW0gcmVmZXJlbmNlcworCSAgV2hlbiByZWNlaXZpbmcgYSBzeW5jLXBhY2tldCwgYWxsIHNlc3Npb25zIHdpdGggdGhlIHNhbWUgY25hbWUgd2lsbCBiZSBjb21wYXJlZAorCSAgYW5kIHN5bmNlZCB0b2dldGhlci4gSW4gdGhpcyBwcm9jZXNzLCB0aGVyZSBjb3VsZCBzdGlsbCBiZSByZWZlcmVuY2VzIHRvIGEKKwkgIHNlc3Npb24gdGhhdCBoYXMgYmVlbiBzaHV0IGRvd24gaW4gdGhlIG1lYW53aGlsZS4KKwkgIFRoaXMgcGF0Y2ggbWFrZXMgc3VyZSB0aGF0IHRoZXNlIHJlZmVyZW5jZXMgYXJlIHJlbW92ZWQgd2hlbiBzaHV0dGluZyBkb3duIGEKKwkgIHNlc3Npb24sIHNvIHRoYXQgdGhlIHN5bmNpbmcgY2FuIGJlIGRvbmUgc2FmZWx5LgorCSAgRml4ZXMgIzU5NDI4MworCisyMDA5LTA4LTMxIDE4OjQ2OjUxICswMjAwICBIYXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiB1c2UgbG9ja2VkIHN0YXRlIG9uIGludGVybmFsIGJpbnMKKwkgIFNldCB0aGUgbG9ja2VkIHN0YXRlIG9uIGludGVybmFsIGVsZW1lbnRzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXkgZG9uJ3QgY2hhbmdlCisJICBiYWNrIHRvIGFub3RoZXIgc3RhdGUgd2hlbiBzaHV0dGluZyBkb3duLgorCSAgRml4ZXMgIzU5NDI0OAorCisyMDA5LTA5LTA3IDE4OjI4OjUxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICB2NGwyc3JjOiBhZGQgc3VwcG9ydCBmb3IgbXBlZyBmb3JtYXRzCisKKzIwMDktMDktMDUgMjA6NTE6MTQgLTA3MDAgIFphaGVlciBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5oOgorCSAgeTRtZW5jOiBBZGQgaW50ZXJsYWNlZCBzdXBwb3J0CisJICBGaXhlcyAjNTkxNzEzCisJICBTaWduZWQtb2ZmLWJ5OiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworMjAwOS0wOC0yNCAxMzo0Mjo0MiAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOgorCSogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5jOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zcmMuYzoKKwkqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc3JjLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBSZW1vdmUgUm9uYWxkIEJ1bHRqZSBmcm9tIEF1dGhvcnMgZmllbGQKKwkgIFJlcGxhY2VkIHdpdGggIkdTdHJlYW1lciBtYWludGFpbmVycworCSAgPGdzdHJlYW1lci1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+IiBvciBqdXN0IHJlbW92ZWQsCisJICBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBvdGhlciBhdXRob3JzLgorCisyMDA5LTA5LTA1IDEwOjIxOjMxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDAwYTg1OWUgdG8gMTlmYTRmMworCisyMDA5LTA5LTA0IDEzOjQyOjQzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcHJldmVudCBhIHNwdXJpb3VzIGRlYnVnIHdhcm5pbmcKKworMjAwOS0wOS0wNCAwOTozMjo0MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IERlZmluZSBWNEwyX0ZNVF9GTEFHX0VNVUxBVEVEIGlmIGl0J3Mgbm90IGRlZmluZWQgeWV0CisJICBsaWJ2NGwyIGFscmVhZHkgdXNlcyB0aGlzIGZsYWcsIGV2ZW4gb24gTGludXgga2VybmVsIHZlcnNpb25zCisJICBiZWZvcmUgMi42LjMyLgorCisyMDA5LTA5LTA0IDA3OjEwOjAzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBDb3JyZWN0bHkgaGFuZGxlIE5VTEwgR3N0SW5kZXgKKworMjAwOS0wOS0wMyAyMDo0MDoxNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDI6IEZpeCBzdHVwaWQgdHlwbyBpbiBsYXN0IGNvbW1pdAorCisyMDA5LTA5LTAzIDIwOjM4OjUwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgdjRsMjogUHV0IGVtdWxhdGVkIGZvcm1hdHMgYmVoaW5kIG5hdGl2ZSBmb3JtYXRzCisJICBGaXhlcyBidWcgIzU5Mzc2NC4KKworMjAwOS0wOS0wMyAxOTozNzoxMCArMDIwMCAgTGF1cmVudCBHbGF5YWwgPHNwZ2xlZ2xlIGF0IHlhaG9vLmZyPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cHNvdXJjZTogZml4IG1lbWxlYWsKKwkgIERvbid0IGxlYWsgdGhlIGlucHV0IGJ1ZmZlciB3aGVuIHRoZSByZWNlaXZlZCBhbmQgZXhwZWN0ZWQgc2VxbnVtIGFyZSBkaWZmZXJlbnQgd2hlbgorCSAgaW4gcHJvYmF0aW9uLgorCSAgZml4ZXMgIzU5NDAzOQorCisyMDA5LTA5LTAyIDE1OjIxOjAyIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgcnRwaml0dGVyYnVmZmVyOiBMb2NrIGNsb2NrX3JhdGUgdmFyaWFibGUKKwkgIFRoZSBwcml2LT5jbG9ja19yYXRlIHZhcmlhYmxlIGNvdWxkIGJlY29tZSAtMSBiZXR3ZWVuIHdoZW4gaXRzIGNoZWNrZWQgdG8gbm90CisJICBiZSAtMSBhbmQgd2hlbiBpdHMgdXNlZCwgY2F1c2luZyBhbiBhc3NlcnRpb24uIEZpeGVkIGJ5IHRha2luZyB0aGUgbXV0ZXgKKwkgIGVhcmxpZXIgaW4gdGhlIGNoYWluKCkgZnVuY3Rpb24uCisJICBGaXhlcyAjNTkzOTU1CisKKzIwMDktMDktMDMgMTk6MTI6MzkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlOiB3aGl0ZXNwYWNlIGZpeGVzCisKKzIwMDktMDktMDMgMTk6MDk6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJICBydHBtcGFwYXk6IHdoaXRlc3BhY2UgZml4ZXMKKworMjAwOS0wOS0wMyAxOTowODo1MyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogd2hpdGVzcGFjZSBmaXhlcworCisyMDA5LTA5LTAzIDE3OjMzOjI4ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJICBqcGVnZGVjOiBBdm9pZCB1bm5lY2Vzc2FyeSBwcm9jZXNzaW5nIHVudGlsIHdlIGhhdmUgYSBmdWxsIHBpY3R1cmUuCisJICBUaGlzIGlzIGZvciBub24tcGFja2V0aXplZCBtb2RlLCB3aGVuIHdlIGtub3cgdGhlIHVwc3RyZWFtIHNpemUgaW4gYnl0ZXMuCisKKzIwMDktMDktMDMgMTQ6NDA6MjAgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogZnVsbHkgdXNlIHRhZ3NldHRlciB0byBtYW5hZ2UgdGhlIHRhZ3MuIEZpeGVzICM1NjMyMjEKKwkgIFRoZXJlIGlzIG5vIG5lZWQgdG8gbWFuYWdlIGEgc2VwYXJhdGUgdGFnbGlzdC4KKworMjAwOS0wOS0wMyAxNDoxMzo0MyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkgIHNwZWV4ZW5jOiBzbWFsbCB0YWdsaXN0IGhhbmRsaW5nIGNsZWFudXAKKwkgIERvbid0IGV2ZW50dWFseSBsZWFrIHRoZSBsaXN0IGFuZCBpbnN0ZWFkIGFzc2VydCAobGlrZSBpbiBvdGhlciBlbGVtZW50cykuCisKKzIwMDktMDktMDIgMjM6MTI6NDEgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBhbHNvIGd1YXJkIHJlc2V0aW5nIHN1YnNjcmliZSBjYWxsYmFjayB3aXRoIGlmZGVmcworCSAgSXQgaXMgY29uZGl0aW9uYWx5IHNldCwgc28gZG8gdGhlIHNhbWUgd2hlbiB1bnNldHRpbmcuCisKKzIwMDktMDktMDEgMTU6MDY6NDYgKzAyMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBtYW5hZ2VyOiBGaXhlZCBhIGNvcHkgJiBwYXN0ZSBlcnJvcgorCisyMDA5LTA5LTAxIDEzOjIxOjIzICswMjAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwbWFuYWdlcjogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUgcHJpdgorCSAgVGhlIHZhcmlhYmxlIHByaXYgd2FzIGluaXRpYWxpemVkIGluIGEgbG90IG9mIGZ1bmN0aW9ucyBidXQgdGhlbiBuZXZlcgorCSAgdXNlZCBmb3IgYW55dGhpbmcuCisKKzIwMDktMDktMDEgMTM6MDM6NTcgKzAyMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBtYW5hZ2VyOiBBIGxpdHRsZSBjbGVhbiB1cAorCSAgTWFrZSB0aGUgY29kZSBmbG93IG9mIGdzdF9ydHBfc2Vzc2lvbl9zZW5kX3J0Y3AoKSBhbmQKKwkgIGdzdF9ydHBfc2Vzc2lvbl9zeW5jX3J0Y3AoKSBpZGVudGljYWwuCisKKzIwMDktMDktMDEgMTI6NDc6NTEgKzAyMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBtYW5hZ2VyOiBNYWtlIHN1cmUgdGhhdCB1c2VkIGNhcHMgYXJlIG5vdCBmcmVlZCBhbHJlYWR5ICh0YWtlIDIpCisJICBUaGlzIHJlaW50cm9kdWNlcyB0aGUgZml4IGZvciBidWcgIzU5MzM5MS4gSXQgYWxzbyBhcHBsaWVzIGl0IGluCisJICBnc3RfcnRwX3Nlc3Npb25fc3luY19ydGNwKCkgd2hpY2ggaGFzIHZlcnkgc2ltaWxhciBjb2RlIHRvCisJICBnc3RfcnRwX3Nlc3Npb25fc2VuZF9ydGNwKCkuCisKKzIwMDktMDktMDEgMTI6NDE6MzYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkgIGppdHRlcmJ1ZmZlcjogbWFrZSBzdXJlIHRpbWUgZG9lcyBub3QgZ28gYmFja3dhcmRzCisJICBXaGVuIHdlIGNvbnN0cnVjdCBhIHRpbWVzdGFtcCB0aGF0IHdvdWxkIHJlc3VsdCBpbiBhIHRpbWVzdGFtcCB0aGF0IGlzIGVhcmxpZXIKKwkgIHRoYW4gd2hlbiB0aGUgcGFja2V0IHdhcyByZWNlaXZlZCwgcmVzZXQgdGhlIHNrZXcgY2FsY3VsYXRpb24gYXMgdGhpcyBpcworCSAgcHJvYmFibHkgYSBzaWduIHRoYXQgdGhlIHNlbmRlciByZXN0YXJ0ZWQgb3IgcGF1c2VkLgorCSAgRml4ZXMgIzU5MzM1NAorCisyMDA5LTA5LTAxIDExOjMyOjQxICswMjAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwbWFuYWdlcjogU2V0IGNhcHMgaW4gZ3N0X3J0cF9zZXNzaW9uX3NlbmRfcnRjcCgpIGNvcnJlY3RseSBhZ2FpbgorCSAgVGhlIHRlc3QgZm9yIHdoZW4gdG8gc2V0IGFuIFJUQ1AgY2FwcyBvbiB0aGUgb3V0cHV0IHBhZCBpbgorCSAgZ3N0X3J0cF9zZXNzaW9uX3NlbmRfcnRjcCgpIGFjY2lkZW50YWxseSBnb3QgaW52ZXJ0ZWQgaW4gdGhlIGxhc3QgY29tbWl0LgorCisyMDA5LTA5LTAxIDEwOjI2OjQ2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWRkIHN1cHBvcnQgZm9yIFFDRUxQIGF1ZGlvCisJICBGaXhlcyBidWcgIzU5Mzc1Ny4KKworMjAwOS0wOC0zMSAxODoxMDoxMSArMDIwMCAgUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2pAYXhpcy5jb20+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmM6CisJKiBnc3QvZWZmZWN0di9nc3R2ZXJ0aWdvLmM6CisJICBlZmZlY3R2OiBGaXggY29tcGlsYXRpb24gd2l0aCBnY2MgMworCSAgUmVjZW50IGNoYW5nZXMgaW4gZ3N0LXBsdWdpbnMtZ29vZC9nc3QvZWZmZWN0diBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIGNvbXBpbGVkCisJICB3aXRoIGdjYyAzLiBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZSBuZXcgY29kZSB1c2VzIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMKKwkgIHdpdGhpbiBhIG1hY3JvIGNhbGwgd2hpY2ggZG9lcyBub3Qgd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIGdjYy4KKwkgIEZpeGVzIGJ1ZyAjNTkzNjg4LgorCisyMDA5LTA4LTMxIDE2OjIwOjU5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBkb2NzOiBzbWFsbCBjbGVhbi11cHMgaW4gLXNlY3Rpb25zLnR4dAorCSAgUmVtb3ZlIGR1cGxpY2F0ZSBlbnRyeSBmb3Igd2FycHR2OyB0aGVyZSBpcyBubyB0YWdsaWJtdXggZWxlbWVudC4KKworMjAwOS0wOC0yNyAxNTo0Njo1MiArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJICBydHBtcDRnZGVwYXk6IGNvbnNpZGVyIChvcHRpb25hbCkgYXV4aWxpYXJ5IGRhdGEgd2hlbiBwYXJzaW5nCisKKzIwMDktMDgtMjcgMTU6NDY6MTUgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuaDoKKwkgIHJ0cG1wNGdkZXBheTogaGFuZGxlIGJyb2tlbiBBVS1JbmRleCBpbiBub24taW50ZXJsZWF2ZWQgc3RyZWFtcworCSAgSW4gY2FzZSBvZiBub24taW50ZXJsZWF2ZWQgKD0gc2VxdWVudGlhbGx5IHBheWxvYWRlZCkgc3RyZWFtcywKKwkgIHRoZSBBVS1JbmRleCBzZXJ2ZXMgbGl0dGxlIHB1cnBvc2UgKHRoYXQgaXMgbm90IGFscmVhZHkgY292ZXJlZCBieQorCSAgUlRQIGZpZWxkcykuICAoQnJva2VuKSBQYXlsb2FkZXJzIG1pZ2h0IGNvbnNpZGVyIHRoaXMgZmllbGQgdGhlbgorCSAgdG8gYmUgZGlzcmVnYXJkZWQgYW5kIGhhdmUgbm9uIHNwZWMgY29tcGxpYW50IHZhbHVlcywgZS5nLiBlYWNoCisJICBSVFAgcGFja2V0IGhhdmluZyBBVS1JbmRleCAyIChyYXRoZXIgdGhhbiAwKS4gIEFzIHN1Y2gsIGVuc3VyZS9mb3JjZQorCSAgc2ltcGxlIHNlcXVlbnRpYWwgc2VuZGluZyBvZiBub24taW50ZXJsZWF2ZWQgc3RyZWFtcy4KKworMjAwOS0wOC0xOCAxNzoxNzoyOCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFsc28gZXh0cmFjdCBmdHlwIGluZm8gaW4gcHVzaCBtb2RlCisKKzIwMDktMDgtMTMgMTY6MTE6NTkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICBxdGRlbXV4OiBjb25zaWRlciAzZ3BwIHN0eWxlIHRhZyBwYXJzaW5nIGluIHNvbWUgbW9yZSBjYXNlcworCSAgM0dQUCBzcGVjcyBkZWZpbmUgYSBudW1iZXIgb2YgdGFncyBhbG9uZyB3aXRoIHByZWNpc2UgbGF5b3V0LiBXaGlsZSB0aGVzZQorCSAgYXJlIG5vcm1hbGx5IGV4cGVjdGVkIHRvIGJlIGZvdW5kIGluIGEgY29udGFpbmVyIHdob3NlIG1ham9yIGJyYW5kIGlzIGEKKwkgIDNHUFAgYnJhbmQsIHRoaXMgbWF5IGFsc28gaGFwcGVuIHdoZW4gYSAzR1BQIGJyYW5kIGlzIG9ubHkgbWVudGlvbmVkIGFzIGEKKwkgIGNvbXBhdGlibGUgYnJhbmQuICBBcHBseSBzb21lIGNoZWNrcywgaGV1cmlzdGljIGFuZCBmYWxsYmFja3MgdG8gZXh0cmFjdAorCSAgc3VjaCB0YWdzIGFzIHdlbGwuCisKKzIwMDktMDgtMTEgMTM6NTY6NDMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiByZWZsb3cgZXhpdCwgYW5kIGZpeCBzb21lIGxlYWtzCisKKzIwMDktMDgtMTEgMTM6NTQ6NTYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBwdXNoIG1vZGU7IGFkZCBwYWQgaWYgbmVlZGVkIHNvIGRvd25zdHJlYW0gZ2V0cyBFT1MKKworMjAwOS0wOC0xMCAxNjoxOTowMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICB3YXZwYXJzZTogcHVzaCBtb2RlOyBmaXgvaW1wcm92ZSBjaHVuayBoYW5kbGluZworCSAgSGFuZGxlIGxhcmdlLCBpbnZhbGlkIG9yIG90aGVyd2lzZSB1bnVzdWFsIGNodW5rIHNpemVzLgorCSAgVmVyaWZ5IHNvbWUgY2h1bmsgc2l6ZXMgdG8gYmUgYXQgbGVhc3QgdGhlIHNpemUgdGhleSBhcmUKKwkgIGV4cGVjdGVkIHRvIGJlIGFuZCByb3VuZCB1cCBzb21lIHNpemVzIHRvIGV2ZW4gbnVtYmVyIGZvcgorCSAgZS5nLiBvZmZzZXQgYWRtaW5pc3RyYXRpb24sIHdoaWNoIG11c3QgYWxzbyBiZSBwcm9wZXJseQorCSAgdHJhY2tlZCBpbiBwdXNoIG1vZGUuCisKKzIwMDktMDgtMDggMjE6NTQ6MDAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBhdmlkZW11eDogcHVzaCBtb2RlOyBjYXRlciBmb3IgdW51c3VhbCBjaHVuayBzaXplcworCisyMDA5LTA4LTMxIDE2OjM0OjE0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiB1c2UgcHJvcGVyIGxvY2tpbmcgZm9yIHBhZHMgYW5kIGNhcHMKKwkgIFVzZSB0aGUgc2VzaW9uIGxvY2sgYW5kIHNob3Rkb3duIHZhcmlhYmxlIHRvIHByb3RlY3QgYW5kIHJlZiB0aGUgcGFkcyB3ZSBhcmUKKwkgIGdvaW5nIHRvIHB1c2ggb24uCisJICBmaXhlcyAjNTYxODI1CisKKzIwMDktMDgtMzEgMTY6MzM6MjYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiB3aGl0ZXNwYWNlIGZpeGVzCisKKzIwMDktMDgtMzEgMTM6Mzg6MDggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBjbGVhbiB1cCBhZGFwdGVyIHByb3Blcmx5CisJICBSZWZsb3cgY29kZSBzbyB3ZSBkb24ndCB0cnkgdG8gY2xlYXIgb3IgcmUtdXNlIGFuIGFscmVhZHktZnJlZWQgYWRhcHRlci4KKworMjAwOS0wOC0zMSAxMzowNzo1MyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgZmxhY3RhZywgd2F2cGFyc2U6IEdzdEFkYXB0ZXIgaXMgbm90IGEgR3N0T2JqZWN0CisKKzIwMDktMDgtMzEgMTI6Mjg6NTIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdHJ0cG1hbmFnZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkgIGRvY3M6IHVwZGF0ZSBwbHVnaW4gZG9jcyB0byBnaXQgdmVyc2lvbgorCisyMDA5LTA4LTMxIDExOjMyOjM5ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgIGZsdmRlbXV4OiBGaXggdGVzdHMgd2FybmluZyBmcm9tIHNldHRpbmcgYSBOVUxMIGluZGV4CisJICBTZXR0aW5nIGEgbnVsbCBpbmRleCBpbiB0aGUgdGVzdHMgd2FzIGNhdXNpbmcgd2FybmluZ3MgYnkgdW5yZWZmaW5nCisJICBOVUxMIHBvaW50ZXJzLiBUaGlzIGlzIGEgYnVnIGV4cG9zZWQgYnkgYSByZWNlbnQgY2hhbmdlIGluIGNvcmUsIGl0CisJICBzZWVtcy4KKworMjAwOS0wOC0zMSAxMzowMjoxNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IGFkZCBzbG9wZSBlc3RpbWF0aW9uIGNvZGUgYW5kIGRlYnVnCisJICBBZGQgc29tZSBjb2RlIHRvIG1lYXN1cmUgdGhlIHNlbmRlciBzcGVlZCB2cyB0aGUgcmVjZWl2ZXIgc3BlZWQuIFRoaXMgY2FuIGJlCisJICB1c2VkIHRvIGRldGVjdCBidXJzdHMuCisKKzIwMDktMDgtMzEgMTI6NTc6MzIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiByZXNldCBza2V3IHdoZW4gdGltZXN0YW1wcyBjaGFuZ2UKKwkgIFJlZmFjdG9yIHRoZSBqaXR0ZXJidWZmZXIgcmVzeW5jIGNvZGUuCisJICBSZXNldCB0aGUgc2tldyBjb3JyZWN0aW9uIHdoZW4gd2UgZGV0ZWN0IGEgYmlnIHRpbWVzdGFtcCBkaXNjb250LgorCSAgU2VlICM1OTMzNTQKKworMjAwOS0wOC0zMSAxMjo0NzoxNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IG1ha2Ugc3VyZSB0aW1lIG5ldmVyIGdvZXMgaW52YWxpZAorCSAgU2luY2UgdGhlIHNrZXcgY2FuIGJlIG5lZ2F0aXZlLCB3ZSBtaWdodCBlbmQgdXAgd2l0aCBpbnZhbGlkIHRpbWVzdGFtcHMuIENoZWNrCisJICBmb3IgbmVnYXRpdmUgcmVzdWx0cyBhbmQgY2xhbXAgdG8gMC4KKwkgIFNlZSAjNTkzMzU0CisKKzIwMDktMDgtMzEgMTI6MTY6MDEgKzAyMDAgIEphcmtrbyBQYWx2aWFpbmVuIDxqYXJra28ucGFsdmlhaW5lbiBhdCBzZXNjYS5jb20+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSAgdWRwc2luazogQWRkIHR0bCBtdWx0aWNhc3QgcHJvcGVydHkKKwkgIEFkZCBhIG5ldyB0dGwtbWMgcHJvcGVydHkgdG8gY29udHJvbCB0aGUgVFRMIG9uIG11bHRpY2FzdCBhZGRyZXNzZXMuCisJICBGaXhlcyAjNTg4MjQ1CisKKzIwMDktMDgtMzEgMTI6MTM6MDcgKzAyMDAgIEphcmtrbyBQYWx2aWFpbmVuIDxqYXJra28ucGFsdmlhaW5lbiBhdCBzZXNjYS5jb20+CisKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6CisJKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmg6CisJICB1ZHA6IHNwbGl0IG91dCBUVEwgYW5kIGxvb3Agb3B0aW9ucworCSAgU3BsaXQgc2V0dGluZyB0aGUgVFRMIGFuZCBsb29wIHBhcmFtZXRlcnMgaW4gMiBtZXRob2RzIGFzIHRoZXkgYXJlIG5vdCByZWxhdGVkLgorCSAgRml4IHNldHRpbmcgdGhlIFRUTCBjb3JyZWN0bHkgZm9yIG11bHRpY2FzdCBzdHJlYW1zLgorCSAgU2VlICM1ODgyNDUKKworMjAwOS0wOC0yNyAxMjozNjozNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkgIHJ0cDogd2hpdGVzcGFjZSBmaXhlcworCisyMDA5LTA4LTE0IDEzOjQ1OjIyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgdmlkZW9ib3g6IENvcnJlY3RseSBhZGQgdG8gdGhlIGRvY3MKKworMjAwOS0wOC0xNCAxMzo0MDoyMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94Lmg6CisJICB2aWRlb2JveDogU3BsaXQgZGVjbGFyYXRpb25zIGludG8gYSBoZWFkZXIgZmlsZSBhbmQgYWRkIGF1dG9jcm9wIHN0dWZmIHRvIHRoZSBkb2NzCisKKzIwMDktMDgtMTQgMTM6MjY6MzYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVvYm94OiBSZWNvbmZpZ3VyZSBiYXNldHJhbnNmb3JtIGlmIHNvbWV0aGluZyBjaGFuZ2VzIGFnYWluCisJICBGb3IgdGhpcyBpbnZlbnQgYSBuZXcgbG9jayBhbmQgZG9uJ3QgYWJ1c2UgdGhlIGJhc2V0cmFuc2Zvcm0gbG9jaywKKwkgIG90aGVyd2lzZSB3ZSdsbCBlbmQgdXAgaW4gZGVhZGxvY2tzLgorCisyMDA5LTA4LTE0IDEzOjE1OjU3ICswMjAwICBTdGVwaGVuIEp1bmdlbHMgPHN0ZXBoZW5AanVuZ2Vscy5uZXQ+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IEFkZCBzdXBwb3J0IGZvciBhdXRvY3JvcHBpbmcgYWNjb3JkaW5nIHRvIHRoZSBjYXBzCisJICBGaXhlcyBidWcgIzU4MjIzOC4KKworMjAwOS0wOC0zMCAyMTo1Nzo1NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IE1ha2Ugc3VyZSB0aGF0IHVzZWQgY2FwcyBhcmUgbm90IGZyZWVkIGFscmVhZHkKKwkgIEZpeGVzIGJ1ZyAjNTkzMzkxLgorCisyMDA5LTA4LTI2IDE3OjAyOjQ1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmM6CisJICBydHA6IFVzZSBuZXcgZ3N0X2l0ZXJhdG9yX25ld19zaW5nbGUoKSBmb3IgdGhlIGludGVybmFsIGxpbmtlZCBwYWRzIGl0ZXJhdGlvbgorCisyMDA5LTA4LTE5IDE2OjU3OjA1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwc2Vzc2lvbjogVXNlIGl0ZXJhdGUgaW50ZXJuYWwgbGlua3MgaW5zdGVhZCBvZiBkZXByZWNhdGVkIGdldCBpbnRlcm5hbCBsaW5rcworCisyMDA5LTA4LTE5IDE2OjQ4OjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IFVzZSBpdGVyYXRlIGludGVybmFsIGxpbmtzIGluc3RlYWQgb2YgZGVwcmVjYXRlZCBnZXQgaW50ZXJuYWwgbGlua3MKKworMjAwOS0wOC0xOSAxNjozNzoxMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgcnRwc3NyY2RlbXV4OiBVc2UgaXRlcmF0ZSBpbnRlcm5hbCBsaW5rcyBpbnN0ZWFkIG9mIGRlcHJlY2F0ZWQgZ2V0IGludGVybmFsIGxpbmtzCisKKzIwMDktMDgtMzAgMjM6Mjc6MDkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJICBVcGRhdGUgY29tbW9uCisKKzIwMDktMDgtMzAgMjM6MjY6NDggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBCYWNrIHRvIGhhY2tpbmcgLT4gMC4xMC4xNi4xCisKKz09PSByZWxlYXNlIDAuMTAuMTYgPT09CisKKzIwMDktMDgtMjkgMTI6MDU6NDAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWludGVybGFjZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2FtbWEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2RlLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9sdi5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBSZWxlYXNlIDAuMTAuMTYKKworMjAwOS0wOC0yNiAwMDo1ODo0NSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIDAuMTAuMTUuNSBwcmUtcmVsZWFzZQorCisyMDA5LTA4LTI1IDE2OjUzOjI5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGRvbid0IHVzZSByZWxhdGl2ZSBzZWVrcworCSAgRG9uJ3QgdXNlIHJlbGF0aXZlIHNlZWtzLCBpdCdzIHRvbyBoYXJkIHRvIHRyYWNrIHdoZXJlIHdlIGFyZSBhZnRlciBhIGZsdXNoCisJICBldGMuCisJICBmaXhlcyAjNTkzMDE1CisKKzIwMDktMDgtMjQgMTc6NTA6MjkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBwby9MSU5HVUFTOgorCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL2x2LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIDAuMTAuMTUuNCBwcmUtcmVsZWFzZQorCisyMDA5LTA4LTI0IDE2OjIyOjQ3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBkb24ndCBkaXNjYXJkIHRoZSByZXN1bHQgb2YgX3NldF9jYXBzKCkKKwkgIFVzZSB0aGUgcmVzdWx0IG9mIGdzdF9wYWRfc2V0X2NhcHMoKSBpbnN0ZWFkIG9mIGFzc3VtaW5nIHN1Y2Nlc3MuCisJICBTZWUgIzU5MDY3OAorCisyMDA5LTA4LTIxIDExOjQ0OjQzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2ZvdXJjYy5oOgorCSAgcXRkZW11eDogYWRkIHN1cHBvcnQgZm9yIGFnc20KKwkgIEZpeGVzICM1OTI1MzAKKworMjAwOS0wOC0xOCAxNzoxNjoxMSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBxdCBzdHlsZSBzdHJpbmcgdGFnIGV4dHJhY3Rpb24KKwkgIFFUIHN0eWxlIHRhZ3MgYXJlIHRlc3RlZCBvbiBzdGFydGluZyB3aXRoIChDKSBzeW1ib2wgdXNpbmcgPj4sCisJICBhbmQgKHVuc2lnbmVkKSBpbnQgKG1heSkgaGF2ZSBkaWZmZXJlbnQgPj4gYmVoYXZpb3VyLgorCSAgRml4ZXMgIzU5MjIzMi4KKworMjAwOS0wOC0xNyAxNTo0ODoyMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL3Ntb2tlY29kZWMuYzoKKwkgIHNtb2tlZW5jOiBkb24ndCBjcmFzaCB3aGVuIGNvbXBpbGVkIGFnYWluc3QgbGlianBlZzcKKwkgIFNldCBwYXJhbWV0ZXJzIHNvIHRoYXQgd2UgZG9uJ3QgY3Jhc2ggd2l0aCBsaWJqcGVnNy4gQmFzZWQgb24KKwkgIFN0ZWZhbiBLb3N0J3MgZml4IGZvciBqcGVnZW5jLiBGaXhlcyAjNTkxOTUxLgorCisyMDA5LTA4LTE0IDIwOjE4OjA0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZGUucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby90ci5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICAwLjEwLjE1LjMgcHJlLXJlbGVhc2UKKworMjAwOS0wOC0xNCAxMzo0NTowOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jOgorCSAgY2hlY2tzOiBhZGQgdGVzdCBmb3IgbGVhayB0byBydHBiaW4gdW5pdCB0ZXN0CisJICBTZWUgIzU5MTQ3Ni4KKworMjAwOS0wOC0xMSAxNDo0NzoxMiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogRml4IHJlZmVyZW5jZSBsZWFrCisJICBGaXhlcyAjNTkxNDc2LgorCisyMDA5LTA4LTE0IDEzOjM0OjUzICswMTAwICBaYWhlZXIgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkgIGR2ZGVjOiBzZXQgYm90dG9tIGZpZWxkIGZpcnN0IG9uIFBBTCBpbnRlcmxhY2VkIGNvbnRlbnQsIG5vdCB0b3AgZmllbGQgZmlyc3QKKwkgIERWIGludGVybGFjZWQgY29udGVudCBpcyBhbHdheXMgYm90dG9tIGZpZWxkIGZpcnN0LiBGaXhlcyAjNTkxNzEyLgorCisyMDA5LTA4LTE0IDEyOjQ0OjA2ICswMTAwICBIYW5zIGRlIEdvZWRlIDxqd3JkZWdvZWRlQGZlZG9yYXByb2plY3Qub3JnPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBmaXggJ2hhbmcnIHdpdGggc29tZSBjYW1lcmFzIGNhdXNlZCBieSBiYWQgdGltZXN0YW1waW5nIGlmIG5vIGZyYW1lcmF0ZSBpcyBhdmFpbGFibGUKKwkgIEZvciBjYW1lcmFzL2RyaXZlcnMgdGhhdCBkb24ndCBzdXBwb3J0IGUuZy4gVklESU9DX0dfUEFSTSB3ZSdkIGVuZCB1cCB3aXRob3V0CisJICBhIGZyYW1lcmF0ZSBhbmQgd291bGQgdHJ5IHRvIGRpdmlkZSBieSAwLCBjYXVzaW5nIHJ1bi10aW1lIHdhcm5pbmdzIGFuZCBhbGwKKwkgIGZyYW1lcyB0byBiZSB0aW1lc3RhbXBlZCB3aXRoIDAsIHdoaWNoIG1ha2VzIHNpbmtzIHRoYXQgc3luYyBhZ2FpbnN0IHRoZSBjbG9jaworCSAgZHJvcCB0aGVtLCBjYXVzaW5nICdoYW5ncycgKG9ic2VydmVkIHdpdGggdGhlIHB3YyBkcml2ZXIgYW5kIGEgTG9naXRlY2ggUXVpY2tDYW0KKwkgIFBybyA0MDAwKS4gU28gaWYgd2UgZG8gbm90IGtub3cgdGhlIGZyYW1lcmF0ZSwgc2ltcGx5IGRvbid0IGFkanVzdCB0aGUKKwkgIHRpbWVzdGFtcHMuIEZpeGVzICM1OTE0NTEuCisKKzIwMDktMDgtMTQgMTA6MTE6MjUgKzAyMDAgIEZpbGlwcG8gQXJnaW9sYXMgPGZpbGlwcG8uYXJnaW9sYXNAZ21haWwuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICB2NGwyc3JjOiBjbGVhciBmb3JtYXQgbGlzdCBpbiBSRUFEWS0+TlVMTAorCSAgQ2xlYXIgZm9ybWF0IGxpc3QgYW5kIHByb2JlZCBjYXBzIHdoZW4gZ29pbmcgdG8gTlVMTCBzbyBpZiBhIG5ldyBkZXZpY2UKKwkgIGlzIHNldCB3ZSdsbCBwcm9iZSB0aGUgZm9ybWF0cyBhZ2FpbiBpbnN0ZWFkIG9mIHVzaW5nIHByZXZpb3VzbHkKKwkgIGRldGVjdGVkIG9uZXMuIEZpeGVzIGJ1ZyAjNTkxNzQ3LgorCisyMDA5LTA4LTExIDE2OjQyOjUxIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIGR0bWZzcmM6IEVtcHR5IGV2ZW50IHF1ZXVlIG9uIGZpbmFsaXplCisKKzIwMDktMDgtMTEgMTY6Mzk6NDIgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgZHRtZjogVXNlIEdTbGljZSBmb3IgaW50ZXJuYWwgZXZlbnQgc3RydWN0dXJlcworCisyMDA5LTA4LTExIDE2OjIzOjIwIC0wNDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgcnRwZHRtZnNyYzogQ2xlYW51cCBldmVudHMgb24gZmluYWxpemUKKwkgIFByb2JsZW0gZm91bmQgYnkgTGF1cmVudCBHbGF5YWwKKwkgIEZpeGVzIGJ1ZyAjNTkxNDQwCisKKzIwMDktMDgtMTEgMTY6MjM6MjAgLTA0MDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBydHBkdG1mc3JjOiBDbGVhbnVwIGV2ZW50cyBvbiBmaW5hbGl6ZQorCSAgUHJvYmxlbSBmb3VuZCBieSBMYXVyZW50IEdsYXlhbAorCSAgRml4ZXMgYnVnICM1OTE0NDAKKworMjAwOS0wOC0xMSAxNzozMDo0MSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHBvL0xJTkdVQVM6CisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9kZS5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3RyLnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIDAuMTAuMTUuMiBwcmUtcmVsZWFzZQorCisyMDA5LTA4LTExIDE1OjI1OjM5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogTUFJTlRBSU5FUlM6CisJICBBZGQgbXlzZWxmIHRvIE1BSU5UQUlORVJTIGZpbGUgYW5kIHVwZGF0ZSBXaW0ncyBlLW1haWwuCisKKzIwMDktMDgtMTEgMDM6MDg6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkgIHY0bDI6IGZpeCBtYWtlIGRpc3RjaGVjayBieSBkaXN0aW5nIHNvbWUgbW9yZSBoZWFkZXJzCisKKzIwMDktMDgtMTEgMDI6NDI6MTYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFsczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkgIGRvY3M6IHVwZGF0ZQorCisyMDA5LTA4LTExIDAyOjMxOjQ0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy8uZ2l0aWdub3JlOgorCSAgTW92ZSBydHBtYW5hZ2VyIGZyb20gLWJhZCB0byAtZ29vZC4KKwkgIEhvb2sgdXAgYnVpbGQgaW5mcmFzdHJ1Y3R1cmUgKGF1dG90b29scywgZG9jcywgdW5pdCB0ZXN0KS4KKworMjAwOS0wOC0wNiAxOToyNjoyMSArMDIwMCAgcmljIDxjc3huanUgYXQgc29nb3UuY29tPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cHNvdXJjZTogYXZvaWQgYnVmZmVyIGxlYWsgb24gYmFkIHNlcW51bQorCSAgRml4ZXMgIzU5MDc5NworCisyMDA5LTA3LTI4IDE4OjE4OjIwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cHNvdXJjZTogYWxsb3cgZm9yIE5VTEwgY2FwcyBvbiBidWZmZXJzCisJICBBZGQgdGhlIE5VTEwgY2FwcyBjaGVjayB3aGVyZSBpdCBtYXR0ZXJzIGFuZCBhbHNvIGNvdmVyIGFub3RoZXIgY2FzZSBvZgorCSAgcG90ZW50aWFsIE5VTEwgY2Fwcy4KKwkgIEZpeGVzICM1OTAwMzAKKworMjAwOS0wNy0yOCAxMTo1OTo1NiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cHNvdXJjZTogSW5jb21pbmcgYnVmZmVycyBkbyBub3QgYWx3YXlzIGhhdmUgY2FwcworCisyMDA5LTA3LTI3IDE1OjQ2OjIzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBhdm9pZCBkb2luZyBsaXAtc3luYyBpbiBCWUUKKwkgIFdoZW4gd2UgZ2V0IGEgQllFIHBhY2tldCwgZG9uJ3QgZG8gbGlwLXN5bmMgd2l0aCB0aGUgU1IgaW5zaWRlIGJlY2F1c2Ugc29tZQorCSAgc2VuZGVycyBoYXZlIHRyb3VibGUgY29uc3RydWN0aW5nIHZhbGlkIFNSIHBhY2tldHMgYWZ0ZXIgQllFLgorCisyMDA5LTA3LTI3IDEzOjE3OjIwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBiaW46IGRvbid0IGRvIGxpcC1zeW5jIGFmdGVyIGEgQllFCisJICBBZnRlciBhIEJZRSBwYWNrZXQgZnJvbSBhIHNvdXJjZSwgc3RvcCBmb3J3YXJkaW5nIHRoZSBTUiBwYWNrZXRzIGZvciBsaXAtc3luYworCSAgdG8gcnRwYmluLiBTb21lIHNlbmRlcnMgZG9uJ3QgdXBkYXRlIHRoZWlyIFNSIHBhY2tldHMgY29ycmVjdGx5IGFmdGVyIHNlbmRpbmcgYQorCSAgQllFIGFuZCB0aGVuIHdlIGJyZWFrIGxpcC1zeW5jLiBXZSBwcmVmZXIgdG8gbGV0IHRoZSBqaXR0ZXJidWZmZXJzIGRyYWluIHdpdGgKKwkgIHRoZSBjdXJyZW50IGxpcC1zeW5jIGluc3RlYWQuCisKKzIwMDktMDctMjcgMTI6NDM6MDIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cGJpbjogb25seSByZWNvbnNpZGVyIG9uY2UgZm9yIEJZRQorCSAgV2hlbiBpdGVyYXRpbmcgdGhlIHNvdXJjZXMgb2YgYSBCWUUgcGFja2V0LCBkb24ndCBzaWduYWwgYSByZWNvbnNpZGVyYXRpb24gZm9yCisJICBlYWNoIG9mIHRoZW0gYnV0IHNpZ25hbCBhZnRlciB3ZSBoYW5kbGVkIGFsbCBzb3VyY2VzLgorCisyMDA5LTA3LTIxIDE1OjMzOjQxIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IEZyZWUgY29uZmxpY3RpbmcgYWRkcmVzc2VzIG9uIGZpbmFsaXplCisKKzIwMDktMDctMDEgMTI6NTU6MDMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwYmluOiB1c2UgbmV3IG1ldGhvZCBmb3IgbmV0YWRkcmVzcyB0byBzdHJpbmcKKworMjAwOS0wNi0yOSAxODo0ODozMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW4uYzoKKwkgIHJ0cGJpbjogZG8gYmV0dGVyIGNsZWFudXAgb2YgdGhlIHNyYyBnaG9zdHBhZHMKKwkgIENvbm5lY3QgdG8gdGhlIHBhZC1yZW1vdmVkIHNpZ25hbCBvZiB0aGUgcHRkZW11eCBlbGVtZW50cyBzbyB0aGF0IHdlIHJlbW92ZSB0aGUKKwkgIGdob3N0cGFkcyBmb3IgdGhlbS4gRml4ZXMgY2xlYW51cCB3aGVuIGdvaW5nIHRvIE5VTEwgYXMgd2VsbCBhcyB3aGVuIHJlbGVhc2luZworCSAgdGhlIHNpbmtwYWRzLgorCSAgRml4ZXMgIzU2MTc1MgorCisyMDA5LTA1LTI4IDE5OjA4OjQwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBhZGQgYSBjb21tZW50CisKKzIwMDktMDYtMjkgMTY6Mzc6NTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBydHBiaW46IGFkZCBTREVTIHByb3BlcnR5CisJICBSZW1vdmUgYWxsIGluZGl2aWR1YWwgU0RFUyBwcm9wZXJ0aWVzIGFuZCB1c2Ugb25lIHNkZXMgcHJvcGVydHkgdGhhdCB0YWtlcyBhCisJICBHc3RTdHJ1Y3R1cmUgaW5zdGVhZC4gVGhpcyB3aWxsIGFsbG93IHVzIHRvIGFkZCBtb3JlIGN1c3RvbSBzdHVmZiB0byB0aGUgU0RFUworCSAgbWVzc2FnZXMgbGF0ZXIuCisKKzIwMDktMDYtMjkgMTY6MjE6MDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBydHBiaW46IGFkZCBTREVTIHByb3BlcnR5IHRoYXQgdGFrZXMgR3N0U3RydWN0dXJlCisJICBSZW1vdmUgYWxsIGluZGl2aWR1YWwgU0RFUyBwcm9wZXJ0aWVzIGFuZCB1c2Ugb25lIHNkZXMgcHJvcGVydHkgdGhhdCB0YWtlcyBhCisJICBHc3RTdHJ1Y3R1cmUgaW5zdGVhZC4gVGhpcyB3aWxsIGFsbG93IHVzIHRvIGFkZCBtb3JlIGN1c3RvbSBzdHVmZiB0byB0aGUgU0RFUworCSAgbWVzc2FnZXMgbGF0ZXIuCisKKzIwMDktMDYtMDIgMTc6NDY6MDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwY2xpZW50LmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBjbGllbnQuaDoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG1hbmFnZXIuYzoKKwkgIHJ0cGJpbjogcmVtb3ZlZCBvbGQgZ3N0cnRwY2xpZW50CisKKzIwMDktMDYtMTkgMTk6MDk6MTkgKzAyMDAgIEJyYW5rbyBTdWJhc2ljIDxicmFua28uc3ViYXNpYyBhdCBheGlzLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6CisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbl9idWZmZXJfbGlzdC5jOgorCSAgcnRwYmluOiBhZGQgc3VwcG9ydCBmb3IgYnVmZmVyLWxpc3QKKwkgIEFkZCBzdXBwb3J0IGZvciBzZW5kaW5nIGJ1ZmZlci1saXN0cy4KKwkgIEFkZCB1bml0IHRlc3QgZm9yIHRlc3RpbmcgdGhhdCB0aGUgYnVmZmVyLWxpc3QgcGFzc2VkIHRocm91Z2ggcnRwYmluLgorCSAgZml4ZXMgIzU4NTgzOQorCisyMDA5LTA2LTE5IDE2OjIxOjI4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBNYWtlIGJ1aWxkIHdpdGhvdXQgd2FybmluZ3Mgd2l0aCBkZWJ1Z2dpbmcgZGlzYWJsZWQKKworMjAwOS0wNS0yOCAxNzozNzo0NCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogVHJhbnNmb3JtIHRoZSByaWdodCBzZXNzaW9uIHNkZXMgbWVzc2FnZQorCSAgRml4ZXMgIzU4NDE2NQorCisyMDA5LTA1LTI4IDE3OjMzOjEwIC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgQWRkIHNzcmMgdG8gYXBwbGljYXRpb24veC1ydHAtc291cmNlLXNkZXMgc3RydWN0dXJlCisKKzIwMDktMDUtMjcgMTE6MDM6MTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291Y2U6IHRoZSBuZXR3b3JrIGFkZHJlc3MgaXMgaW4gbmV0d29yayBvcmRlcgorCSAgQnJpbmcgdGhlIG5ldHdvcmsgYWRkcmVzcyBpbiBuZXRvd2tyIGJ5dGUgb3JkZXIgdG8gdGhlIGhvc3Qgb3JkZXIuCisKKzIwMDktMDUtMjYgMTU6NDA6NTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlOiBieXRlc3dhcCB0aGUgcG9ydCBmcm9tIEdzdE5ldEFkZHJlc3MKKwkgIFNpbmNlIHRoZSBwb3J0IGluIEdzdE5ldEFkZHJlc3MgaXMgaW4gbmV0d29yayBvcmRlciB3ZSBtaWdodCBuZWVkIHRvIGJ5dGVzd2FwIGl0CisJICBiZWZvcmUgYWRkaW5nIGl0IHRvIHRoZSBzb3VyY2Ugc3RhdGlzdGljcy4KKworMjAwOS0wNS0yNSAxMzo0NjoyOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IHJlbW92ZSBwdGRlbXV4IGdob3N0cGFkcworCisyMDA5LTA1LTI1IDEzOjMzOjIwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW4uYzoKKwkgIHRlc3RzOiBhZGQgcmVjZWl2ZSBydHBiaW4gdW5pdCB0ZXN0CisKKzIwMDktMDUtMjIgMTY6NDE6MTkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBhZGQgdG8gbmV3IHNpZ25hbCB0byByZW1vdmUgU1NSQyBwYWRzCisKKzIwMDktMDUtMjIgMTY6MzU6MjAgKzAyMDAgIEFsaSBTYWJpbCA8YWxpLnNhYmlsIGF0IGdtYWlsLmNvbT4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLW1hcnNoYWwubGlzdDoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4Lmg6CisJICBzc3JjZGVtdXg6IGVtaXQgc2lnbmFsIHdoZW4gcGFkcyBhcmUgcmVtb3ZlZAorCSAgQWRkIGFjdGlvbiBzaWduYWwgdG8gY2xlYXIgYW4gU1NSQyBpbiB0aGUgc3NyYyBkZW11eGVyLgorCSAgQWRkIHNpZ25hbCB0byBub3RpZnkgb2YgcmVtb3ZlZCBzc3JjLgorCSAgU2VlICM1NTQ4MzkKKworMjAwOS0wNS0yMiAxNTo0NToxOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IHVzZSBvdXIgZ2hvc3RwYWRzIGluc3RlYWQgb2YgaXRzIHRhcmdldAorCSAgU2luY2Ugd2Uga2VlcCBhIHJlZmVyZW5jZSB0byBvdXIgZ2hvc3RwYWRzLCB3ZSBjYW4gdXNlIHRoZW0gdG8gdHJhY2sgc2Vzc2lvbnMuCisJICBUaGlzIGF2b2lkIHVzIGhhdmluZyB0byBtZXNzIHdpdGggdGhlIHRhcmdldCBvZiB0aGUgZ2hvc3RwYWQuCisKKzIwMDktMDUtMjIgMTU6Mzc6MjkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jOgorCSAgdGVzdHM6IG1vcmUgcnRwYmluIGNoZWNrcworCisyMDA5LTA1LTIyIDE1OjM2OjE3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogZG9uJ3Qgd2FybiB3aGVuIGdldHRpbmcgcmVxdWVzdCBwYWRzIHR3aWNlCisJICBBbGxvdyBnZXR0aW5nIHRoZSByZXF1ZXN0IHBhZHMgbXVsdGlwbGUgdGltZXMsIGp1c3QgcmV0dXJuIHRoZSBwcmV2aW91c2x5CisJICBjcmVhdGVkIHBhZHMuCisKKzIwMDktMDUtMjIgMTM6NDc6MzAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgcnRwc291cmNlOiBhZGQgUlRQIGFuZCBSVENQIHNvdXJjZSBhZGRyZXNzCisJICBBZGQgdGhlIFJUUCBhbmQgUlRDUCBzZW5kZXIgYWRkcmVzc2VzIGluIHRoZSBzdGF0cyBzdHJ1Y3R1cmUuCisKKzIwMDktMDUtMjIgMTM6NDU6MTUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IHJldXNlIHNvdXJjZSBjb2RlIGZvciBTREVTCisJICBSZXVzZSB0aGUgUlRQU291cmNlIG9iamVjdCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIGNvZGUuCisKKzIwMDktMDUtMjIgMTM6NDQ6MTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jOgorCSAgdGVzdHM6IGFkZCBtb3JlIHJ0cGJpbiB0ZXN0cworCisyMDA5LTA1LTIyIDEyOjIzOjI3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW4uYzoKKwkgIHRlc3RzOiBhZGQgcnRwYmluIHVuaXQgdGVzdAorCSAgQWRkIHRoZSBiZWdpbm5pbmdzIG9mIGFuIHJ0cGJpbiB1bml0IHRlc3QKKwkgIEFkZCBzb21lIG1vcmUgc3R1ZmYgdG8gLmdpdGlnbm9yZQorCisyMDA5LTA1LTIyIDEyOjIwOjEzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogc2V0IHRhcmdldCBzdGF0ZSBvbiBuZXcgZWxlbWVudHMKKwkgIFNldCB0aGUgc3RhdGUgb24gbmV3bHkgYWRkZWQgZWxlbWVudHMgdG8gdGhlIHN0YXRlIG9mIHRoZSBwYXJlbnQuCisJICBBZGQgc29tZSBkZWJ1ZyBpbmZvIGFuZCBkbyBzb21lIGNsZWFudXBzCisKKzIwMDktMDUtMjIgMTE6NTk6MTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiB1bnJlZiByZXF1ZXN0cyBwYWRzIGFmdGVyIHJlbGVhc2luZworCisyMDA5LTA1LTIyIDAxOjQzOjUwICswMjAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBJbXBsZW1lbnQgcmVsZWFzaW5nIHRoZSBzdHJlYW1zCisJICBTZWUgIzU2MTc1MgorCisyMDA5LTA1LTIyIDAxOjE2OjExICswMjAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBLZWVwIGpiIHNpZ25hbHMgaGFuZGxlcgorCSAgS2VlcCB0aGUgc2lnbmFsIGhhbmRsZXJzIHNvIHRoZXkgY2FuIGJlIGRpc2Nvbm5lY3RlZCBhdCByZWxlYXNlIHRpbWUKKwkgIFNlZSAjNTYxNzUyCisKKzIwMDktMDUtMjIgMDE6MTI6NTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiB1c2UgdGhlIHJpZ2h0IGxvY2sgZm9yIHRoZSBzZXNzaW9ucworCSAgVXNlIHRoZSByaWdodCBsb2NrIHdoZW4gaXRlcmF0aW5nIHRoZSBzZXNzaW9ucy4KKworMjAwOS0wNS0yMiAwMTowMzo1NSArMDIwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogRnJlZSBzZXNzaW9uIGlmIHJlcXVlc3QgcGFkcyBhcmUgcmVsZWFzZWQKKwkgIEZyZWUgdGhlIHNlc3Npb24gd2hlbiBhbGwgdGhlIHJlcXVlc3QgcGFkcyBhcmUgcmVsZWFzZWQuCisJICBEb24ndCBtZXNzIHdpdGggdGhlIHNlc3Npb24gbGlzdCBpbiBmcmVlX3Nlc3Npb24gYXMgaXQgaXMgY2FsbGVkIGZyb20gYSBmb3JlYWNoCisJICBvbiB0aGF0IGxpc3QuCisJICBTZXQgdGhlIHN0YXRlIG9mIHRoZSB1cHN0cmVhbSBlbGVtZW50IHRvIE5VTEwgZmlyc3QuCisJICBTZWUgIzU2MTc1MgorCisyMDA5LTA1LTIyIDAwOjUxOjUzICswMjAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBJbXBsZW1lbnQgcmVsYXNpbmcgb2YgdGhlIHJ0cCByZWN2IHBhZAorCisyMDA5LTA1LTIyIDAwOjQ0OjUxICswMjAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgcnRwYmluOiBJbXBsZW1lbnQgcmVsZWFzaW5nIG9mIHJ0cCBzZW5kIHBhZHMKKworMjAwOS0wNS0yMiAwMDozNDozNiArMDIwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIHJ0cGJpbjogSW1wbGVtZW50IHJlbGVhc2Ugb2YgdGhlIHJlY3YgcnRjcCBwYWQKKwkgIFNlZSAjNTYxNzUyCisKKzIwMDktMDUtMjIgMDA6MTY6MTkgKzAyMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBydHBiaW46IEltcGxlbWVudCByZWxlYXNpbmcgb2YgcnRjcCBzcmMgcGFkCisJICBTZWUgIzU2MTc1MgorCisyMDA5LTA1LTA1IDE2OjQ4OjM3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIHJ0cHNzcmNkZW11eDogZHJvcCB1bmV4cGVjdGVkIFJUQ1AgcGFja2V0cworCSAgV2UgdXN1YWxseSBvbmx5IGdldCBTUiBwYWNrZXRzIGluIG91ciBjaGFpbiBmdW5jdGlvbiBidXQgaWYgYW4gaW52YWxpZCBwYWNrZXQKKwkgIGNvbnRhaW5zIHRoZSBTUiBwYWNrZXQgYWZ0ZXIgdGhlIFJSIHBhY2tldCwgd2UgbXVzdCBub3QgZmFpbCBidXQgc2ltcGx5IGlnbm9yZQorCSAgdGhlIG1hbGZvcm1lZCBwYWNrZXQuCisJICBGaXhlcyAjNTgxMzc1CisKKzIwMDktMDQtMjcgMTE6MDk6MDggKzAyMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIHJ0cHNvdWNlOiBtYWtlIFdBUk5JTkcgaW50byBMT0cKKwkgIFNpbmNlIG5laXRoZXIgcnRwbWFuYWdlciBub3IgYW55IG9mIHRoZSBwYXlsb2FkZXJzIHByb3Blcmx5IGltcGxlbWVudAorCSAgcGFkIGFsbG9jYXRpb24sIHRoZXJlIGlzIG5vIHdheSBmb3IgdGhlIHJ0cG1hbmFnZXIgdG8gaW5mb3JtIGRvd25zdHJlYW0gZWxlbWVudHMKKwkgIG9mIHRoZSBuZXcgU1NSQyBpZiB0aGVyZSBpcyBhbiBTU1JDIGNvbGxpc2lvbi4gU28gdGhlIHdhcm5pbmcgaXMgZW1pdHRlZCBhbGwgdGhlCisJICB0aW1lIGFuZCBpdCBpcyBjb25mdXNpbmcuCisJICBGaXhlcyAjNTgwMTQ0CisKKzIwMDktMDQtMjcgMTE6MDY6MDEgKzAyMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6CisJICBydHBzZXNzaW9uOiBub3RpZnkgd2hlbiBTU1JDIGNoYW5nZXMKKwkgIEVtaXQgYSBnX29iamVjdF9ub3RpZnkgd2hlbiB0aGUgU1NSYyBjaGFuZ2VzIGJlY2F1c2Ugb2YgYSBjb2xsaXNpb24uCisJICBGaXhlcyAjNTgwMTQ0CisKKzIwMDktMDQtMTcgMTY6MTY6MjkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIHJ0cHNlc3Npb246IGpvaW4gdGhlIFJUQ1AgdGhyZWFkCisJICBBdm9pZCBhIGNhc2Ugd2hlcmUgYSBqb2luYWJsZSB0aHJlYWQgd291bGQgYmUgbGVmdCB1bmpvaW5lZCwgd2hpY2ggbGVha2VkIHRoZQorCSAgdGhyZWFkIHN0cnVjdHVyZS4KKwkgIEZpeGVzICM1NzczMTguCisKKzIwMDktMDQtMTUgMTg6MTQ6NDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgaml0dGVyYnVmZmVyOiBwcmV2ZW50IG92ZXJmbG93IGluIEVPUyBlc3RpbWF0aW9uCisJICBVc2UgYSBndWludDY0IGluc3RlYWQgb2YgYSBndWludCB0byBob2xkIGEgNjRiaXQgdmFsdWUgdG8gcHJldmVudCBjb21wbGV0ZWx5CisJICBib2d1ZXMgRU9TIGVzdGltYXRpb24gdmFsdWVzIGR1ZSB0byBvdmVyZmxvd3MuCisKKzIwMDktMDQtMTUgMTc6NDQ6MTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICBydHBiaW46IHdlIHNob3VsZCBub3QgcHJvdmlkZSBhIGNsb2NrCisJICBUaGVyZSBpcyBubyBuZWVkIHRvIHByb3ZpZGUgYSBjbG9jay4KKworMjAwOS0wNC0xNSAxNzoyODo1NiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IG1vcmUgZXN0aW1hdGVkIEVPUyBmaXhlcworCSAgRG8gbW9yZSBhY2N1cmF0ZSBFT1MgZXN0aW1hdGUgYW5kIGd1YXJkIGFnYWluc3QgYmFja3dhcmQgdGltZXN0YW1wcy4KKworMjAwOS0wNC0xNSAxNzoyNTowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICBqaXR0ZXJidWZmZXI6IHJlbGVhc2UgbG9jayBiZWZvcmUgcHVzaGluZyBFT1MKKwkgIE1ha2Ugc3VyZSB3ZSByZWxlYXNlIHRoZSBqaXR0ZXJidWZmZXIgbG9jayBiZWZvcmUgd2Ugc3RhcnQgcHVzaGluZyBvdXQgZGF0YQorCSAgYmVjYXVzZSBlbHNlIHdlIG1pZ2h0IGRlYWRsb2NrLgorCisyMDA5LTAzLTI3IDE3OjQ0OjU3ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuaDoKKwkgIHJ0cGJpbjogYWRkIG9uX25wdF9zdG9wIHNpZ25hbAorCSAgQWRkIHRoZSBvbl9ucHRfc3RvcCBzaWduYWwgdG8gcnRwYmluIGFuZCBydHBqaXR0ZXJidWZmZXIgdG8gbm90aWZ5IHRoZQorCSAgYXBwbGljYXRpb24gdGhhdCB0aGUgTlBUIHN0b3AgcG9zaXRpb24gaGFzIGJlZW4gcmVhY2hlZC4KKworMjAwOS0wMy0xMyAxNTo1OTozNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgcnRwYmluOiBkb24ndCByZXR1cm4gRkFMU0Ugb24gc2VlayBldmVudHMKKwkgIFNpbGVudGx5IGlnbm9yZSB0aGUgc2VlayBldmVudCBpbnN0ZWFkIG9mIHJldHVybmluZyBGQUxTRS4KKworMjAwOS0wMi0yNiAxMzoxMDoyOSArMDEwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICBnc3RydHBiaW46IERvbid0IGZvcndhcmQgcmV2YyBldmVudHMgdG8gc2VuZGVyCisJICBEb24ndCBzZW5kIGV2ZW50cyBmcm9tIHRoZSByZWNlaXZlciB0byB0aGUgc2VuZGVyIHNpZGUuCisJICBGaXhlcyAjNTcyOTAwLgorCisyMDA5LTAyLTI1IDExOjQ1OjA1ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOgorCSAgZG9jczogdmFyaW91cyBkb2MgZml4ZXMKKwkgIE5vIHNob3J0LWRlc2MgYXMgd2UgaGF2ZSB0aGVtIGluIHRoZSBlbGVtZW50IGRldGFpbHMuCisJICBBbHNvIGtlZXAgdGhpbmdzIChNYWtlZmlsZS5hbSBhbmQgc2VjdGlvbnMudHh0KSBzb3J0ZWQuCisJICBSZXdvcmQgYW1iaWdvdXMgcmV0dXJucy4gTm8gdGV4dCBhZnRlciBzaW5jZSBwbGVhc2UuCisKKzIwMDktMDEtMjMgMTI6MTM6MDAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmM6CisJICBTZW5kIEJZRSBwYWNrZXRzIGltbWVkaWF0bHkgZm9yIHNtYWxsIHNlc3Npb25zCisJICBXaGVuIHRoZSBudW1iZXIgb2YgcGFydGljaXBhbnRzIGlzIGxlc3MgdGhhbiA1MCwgdGhlIFJGQyBhbGxvd3MgZm9yIHNlbmRpbmcgdGhlCisJICBCWUUgcGFja2V0IGltbWVkaWF0bHkgaW5zdGVhZCBvZiB1c2luZyB0aGUgcmVndWxhciBCWUUgdGltZW91dC4KKwkgIEZpeGVzICM1Njc4MjguCisKKzIwMDktMDEtMjIgMTM6MzM6MTQgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgVW5sb2NrIHRoZSBqaXR0ZXJidWZmZXIgYmVmb3JlIHB1c2hpbmcgb3V0IHRoZSBwYWNrZXQtbG9zdCBldmVudHMuIE1vdmUgc29tZSBjb2RlIGJlZm9yZSB3ZSBkbyB0aGUgdW5sb2NrIHRvIG1ha2UgdGhlIGppdHRlcmJ1ZmZlciBzdGF0ZSBjb25zaXN0ZW50IHdoaWxlIHdlIGFyZSB1bmxvY2tlZC4KKworMjAwOS0wMS0wMiAxNzo0MDowNiArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvOiBXaGVuIGFuIFNTUkMgaXMgZm91bmQgb24gdGhlIGNhcHMgb2YgdGhlIHNlbmRlciBSVFAsIHVzZSB0aGlzIGFzIHRoZSBpbnRlcm5hbCBTU1JDLiBGaXhlcyAjNTY1OTEwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyIGF0IHRlc3RlciBkb3QgY2E+CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIChnc3RfcnRwX3Nlc3Npb25fc2V0Y2Fwc19zZW5kX3J0cCksIChjcmVhdGVfc2VuZF9ydHBfc2luayk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX3NldF9pbnRlcm5hbF9zc3JjKToKKwkgIFdoZW4gYW4gU1NSQyBpcyBmb3VuZCBvbiB0aGUgY2FwcyBvZiB0aGUgc2VuZGVyIFJUUCwgdXNlIHRoaXMgYXMgdGhlCisJICBpbnRlcm5hbCBTU1JDLiBGaXhlcyAjNTY1OTEwLgorCisyMDA5LTAxLTAyIDE2OjUwOjUzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci86IFJlbmFtZSBhIG1ldGhvZCB0byBiZXR0ZXIgcmVmbGVjdCB3aGF0IGl0IHJlYWxseSBkb2VzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIChnc3RfcnRwX3Nlc3Npb25fZXZlbnRfc2VuZF9ydHBfc2luayksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2dldGNhcHNfc2VuZF9ydHApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChjaGVja19jb2xsaXNpb24pLAorCSAgKHJ0cF9zZXNzaW9uX3NjaGVkdWxlX2J5ZV9sb2NrZWQpLCAocnRwX3Nlc3Npb25fc2NoZWR1bGVfYnllKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgUmVuYW1lIGEgbWV0aG9kIHRvIGJldHRlciByZWZsZWN0IHdoYXQgaXQgcmVhbGx5IGRvZXMuCisKKzIwMDgtMTItMjkgMTU6NDk6MzcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogVXNlIG1ldGhvZCB0byBnZXQgdGhlIGludGVybmFsIFNTUkMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgKGdzdF9ydHBfc2Vzc2lvbl9nZXRjYXBzX3NlbmRfcnRwKToKKwkgIFVzZSBtZXRob2QgdG8gZ2V0IHRoZSBpbnRlcm5hbCBTU1JDLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChydHBfc2Vzc2lvbl9jbGFzc19pbml0KSwKKwkgIChydHBfc2Vzc2lvbl9zZXRfcHJvcGVydHkpLCAocnRwX3Nlc3Npb25fZ2V0X3Byb3BlcnR5KToKKwkgIEFkZCBwcm9wZXJ0eSB0byBjb25naXVyZSB0aGUgaW50ZXJuYWwgU1NSQyBvZiB0aGUgc2Vzc2lvbi4KKwkgIEZpeGVzICM1NjU5MTAuCisKKzIwMDgtMTItMjkgMTU6MjE6NTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogT25seSBjaGFuZ2UgdGhlIFNTUkMgb2YgdGhlIHNlc3Npb24gYW5kIHJlc2V0IHRoZSBpbnRlcm5hbCBzb3VyY2Ugd2hlbiB0aGUgU1NSQyBhY3R1YWxseS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX3NldF9pbnRlcm5hbF9zc3JjKToKKwkgIE9ubHkgY2hhbmdlIHRoZSBTU1JDIG9mIHRoZSBzZXNzaW9uIGFuZCByZXNldCB0aGUgaW50ZXJuYWwgc291cmNlIHdoZW4KKwkgIHRoZSBTU1JDIGFjdHVhbGx5IGNoYW5nZWQuIFNlZSAjNTY1OTEwLgorCisyMDA4LTEyLTI5IDE0OjIxOjQ3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuKjogV2hlbiBubyBwYXlsb2FkIHdhcyBzcGVjaWZpZWQgb24gdGhlIGNhcHMgYnV0IHRoZXJlIHdhcyBhIGNsb2NrLXJhdGUsIGFzc3VtZSB0aGUgY2xvY2stcmEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzogKHJ0cF9zb3VyY2VfaW5pdCksCisJICAocnRwX3NvdXJjZV91cGRhdGVfY2FwcyksIChnZXRfY2xvY2tfcmF0ZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSAgV2hlbiBubyBwYXlsb2FkIHdhcyBzcGVjaWZpZWQgb24gdGhlIGNhcHMgYnV0IHRoZXJlIHdhcyBhIGNsb2NrLXJhdGUsCisJICBhc3N1bWUgdGhlIGNsb2NrLXJhdGUgY29ycmVzcG9uZHMgdG8gdGhlIGZpcnN0IHBheWxvYWQgdHlwZSBmb3VuZCBpbiB0aGUKKwkgIFJUUCBwYWNrZXRzLiBGaXhlcyAjNTY1NTA5LgorCisyMDA4LTEyLTIzIDExOjM5OjU5ICswMDAwICBBcm5vdXQgVmFuZGVjYXBwZWxsZSA8YXJub3V0QG1pbmQuYmU+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci4qOiBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IG91dGdvaW5nIHRpbWVzdGFtcCBhbmQgb2YgdGhlIGxhc3Qgc2VuZGVyLXNpZGUgdGltZS4gIFRpbWVzdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQXJub3V0IFZhbmRlY2FwcGVsbGUgPGFybm91dCBhdCBtaW5kIGRvdCBiZT4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChydHBfaml0dGVyX2J1ZmZlcl9yZXNldF9za2V3KSwKKwkgIChjYWxjdWxhdGVfc2tldyk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgS2VlcCB0cmFjayBvZiB0aGUgbGFzdCBvdXRnb2luZyB0aW1lc3RhbXAgYW5kIG9mIHRoZSBsYXN0IHNlbmRlci1zaWRlCisJICB0aW1lLiAgVGltZXN0YW1wcyBjYW4gb25seSBnbyBmb3J3YXJkIGlmIHRoZXkgZG8gYXQgdGhlIHNlbmRlcgorCSAgc2lkZSwgY2FuIG9ubHkgZ28gYmFjayBpZiB0aGV5IGRvIGF0IHRoZSBzZW5kZXIgc2lkZSwgYW5kIHJlbWFpbiB0aGUKKwkgIHNhbWUgaWYgdGhleSByZW1haW4gdGhlIHNhbWUgYXQgdGhlIHNlbmRlciBzaWRlLiBGaXhlcyAjNTY1MzE5LgorCisyMDA4LTExLTI2IDEyOjQwOjE4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IE1ha2Ugb2J0YWluX3NvdXJjZSByZXR1cm4gYW4gYWRpdGlvbmFsIHJlZiBzbyB0aGF0IHdlIGRvbid0IGxvc2Ugb3VyIHJlZiB0byBpdCB3aGVuIGEgc2UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChvYnRhaW5fc291cmNlKSwKKwkgIChydHBfc2Vzc2lvbl9jcmVhdGVfc291cmNlKSwgKHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnRwKSwKKwkgIChydHBfc2Vzc2lvbl9wcm9jZXNzX3NyKSwgKHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnIpLAorCSAgKHJ0cF9zZXNzaW9uX3Byb2Nlc3Nfc2RlcyksIChydHBfc2Vzc2lvbl9wcm9jZXNzX2J5ZSk6CisJICBNYWtlIG9idGFpbl9zb3VyY2UgcmV0dXJuIGFuIGFkaXRpb25hbCByZWYgc28gdGhhdCB3ZSBkb24ndCBsb3NlIG91ciByZWYKKwkgIHRvIGl0IHdoZW4gYSBzZXNzaW9uIGNsZWFudXAgb2NjdXJzIHdoZW4gd2UgYXJlIGVtaXRpbmcgYSBzaWduYWwuCisJICBFbWl0IHRoZSBvbl9uZXdfc3NyYyBzaWduYWwgZm9yIHRoZSBDU1JDLCBub3QgdGhlIFNTUkMuCisJICBGaXhlcyAjNTYyMzE5LgorCisyMDA4LTExLTI2IDEyOjAyOjIxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogUmVzZXQgdGhlIHN5bmMgcGFyYW1ldGVycyB3aGVuIGNsZWFyaW5nIHRoZSBwYXlsb2FkIHR5cGUgbWFwIHRvby4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdzdF9ydHBfYmluX3Jlc2V0X3N5bmMpLAorCSAgKGdzdF9ydHBfYmluX2NsZWFyX3B0X21hcCk6CisJICBSZXNldCB0aGUgc3luYyBwYXJhbWV0ZXJzIHdoZW4gY2xlYXJpbmcgdGhlIHBheWxvYWQgdHlwZSBtYXAgdG9vLgorCSAgRml4ZXMgIzU2MjMxMi4KKworMjAwOC0xMS0yNiAxMTo0NDozNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLio6IFJlbW92ZSBhIGxvdCBvZiBwZXIgc3RyZWFtIHN0YXRlIHRoYXQgaXMgbm90IG5lZWRlZCBhbmQgcGFzcyBuZXcgaW5mbyBpbiB0aGUgbWV0aG9kIGNhbGwuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnZXRfY2xpZW50KSwKKwkgIChnc3RfcnRwX2Jpbl9yZXNldF9zeW5jKSwgKGdzdF9ydHBfYmluX2Fzc29jaWF0ZSksCisJICAoZ3N0X3J0cF9iaW5faGFuZGxlX3N5bmMpLCAoY3JlYXRlX3N0cmVhbSksCisJICAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCksIChuZXdfc3NyY19wYWRfZm91bmQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgIFJlbW92ZSBhIGxvdCBvZiBwZXIgc3RyZWFtIHN0YXRlIHRoYXQgaXMgbm90IG5lZWRlZCBhbmQgcGFzcyBuZXcgaW5mbyBpbgorCSAgdGhlIG1ldGhvZCBjYWxsLgorCSAgQWRkIHNpZ25hbCB0byByZXNldCBzeW5jIHBhcmFtZXRlcnMuCisJICBBdm9pZCBwYXJzaW5nIHRoZSBjYXBzIHRvIGdldCBhIGNsb2NrX2Jhc2UsIHdlIGdldCB0aGlzIGZyb20gdGhlIHN5bmMKKwkgIHNpZ25hbCBub3cuCisKKzIwMDgtMTEtMjUgMTU6MTI6MDYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogRml4IGV2ZW50IGxlYWsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgKGdzdF9ydHBfc2Vzc2lvbl9ldmVudF9zZW5kX3J0Y3Bfc3JjKToKKwkgIEZpeCBldmVudCBsZWFrLgorCisyMDA4LTExLTIyIDE1OjMxOjM2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IEFkZCBwcm9wZXJ0eSB0byBjb25maWd1cmUgdGhlIFJUQ1AgTVRVLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX2NsYXNzX2luaXQpLAorCSAgKHJ0cF9zZXNzaW9uX2luaXQpLCAocnRwX3Nlc3Npb25fc2V0X3Byb3BlcnR5KSwKKwkgIChydHBfc2Vzc2lvbl9nZXRfcHJvcGVydHkpOgorCSAgQWRkIHByb3BlcnR5IHRvIGNvbmZpZ3VyZSB0aGUgUlRDUCBNVFUuCisKKzIwMDgtMTEtMjIgMTU6MjQ6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogQWRkIEdfUEFSQU1fU1RBVElDX1NUUklOR1MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAocnRwX3Nlc3Npb25fY2xhc3NfaW5pdCksCisJICAoY29weV9zb3VyY2UpLCAocnRwX3Nlc3Npb25fY3JlYXRlX3NvdXJjZXMpLAorCSAgKHJ0cF9zZXNzaW9uX2dldF9wcm9wZXJ0eSk6CisJICBBZGQgR19QQVJBTV9TVEFUSUNfU1RSSU5HUy4KKwkgIEFkZCBwcm9wZXJ0eSB0byByZXR1cm4gYSBHVmFsdWVBcnJheSBvZiBhbGwga25vd24gUlRQU291cmNlcyBpbiB0aGUKKwkgIHNlc3Npb24uCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAocnRwX3NvdXJjZV9jbGFzc19pbml0KSwKKwkgIChydHBfc291cmNlX2NyZWF0ZV9zZGVzKSwgKHJ0cF9zb3VyY2Vfc2V0X3Byb3BlcnR5KSwKKwkgIChydHBfc291cmNlX2dldF9wcm9wZXJ0eSk6CisJICBSZW1vdmUgcHJvcGVydGllcyB0byBzZXQgdGhlIHZhcmlvdXMgU0RFUyBpdGVtcywgYW4gYXBwbGljYXRpb24gaXMgbmV2ZXIKKwkgIHN1cHBvc2VkIHRvIGNoYW5nZSB0aGUgUlRQU291cmNlIGRhdGEuCisJICBDaGFuZ2UgdGhlIFNERVMgZ2V0dGVyIHByb3BlcnRpZXMgdG8gb25lIFNERVMgcHJvcGVydHkgdGhhdCByZXR1cm5zIGFsbAorCSAgU0RFUyBpdGVtcyBpbiBhIEdzdFN0cnVjdHVyZS4KKworMjAwOC0xMS0yMiAxMzoxNzoyNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IEFsc28gdW5yZWYgdGhlIHRhcmdldCBwYWQgZm9yIHVua25vd24gcGFkcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdzdF9ydHBfYmluX3JlbGVhc2VfcGFkKToKKwkgIEFsc28gdW5yZWYgdGhlIHRhcmdldCBwYWQgZm9yIHVua25vd24gcGFkcy4KKworMjAwOC0xMS0yMSAxNjoxNzoyMiArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IFJlbGVhc2UgdGhlIHJpZ2h0IHBhZHMgb24gcnRwYmluLiBGaXhlcyAjNTYxNzUyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyIGF0IHRlc3RlciBkb3QgY2E+CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoZ3N0X3J0cF9iaW5fcmVsZWFzZV9wYWQpOgorCSAgUmVsZWFzZSB0aGUgcmlnaHQgcGFkcyBvbiBydHBiaW4uIEZpeGVzICM1NjE3NTIuCisKKzIwMDgtMTEtMjAgMTg6NDE6MzQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogUGFzcyB0aGUgcnVubmluZyB0aW1lIHRvIHRoZSBzZXNzaW9uIHdoZW4gcHJvY2Vzc2luZyBSVFAgcGFja2V0cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnZXRfY3VycmVudF90aW1lcyksCisJICAocnRjcF90aHJlYWQpLCAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3JlY3ZfcnRwKToKKwkgIFBhc3MgdGhlIHJ1bm5pbmcgdGltZSB0byB0aGUgc2Vzc2lvbiB3aGVuIHByb2Nlc3NpbmcgUlRQIHBhY2tldHMuCisJICBJbXByb3ZlIHRoZSB0aW1lIGZ1bmN0aW9uIHRvIHByb3ZpZGUgbW9yZSBpbmZvLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChydHBfc2Vzc2lvbl9jbGFzc19pbml0KSwKKwkgIChydHBfc2Vzc2lvbl9pbml0KSwgKHVwZGF0ZV9hcnJpdmFsX3N0YXRzKSwKKwkgIChydHBfc2Vzc2lvbl9wcm9jZXNzX3J0cCksIChydHBfc2Vzc2lvbl9wcm9jZXNzX3NkZXMpLAorCSAgKHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnRjcCksIChzZXNzaW9uX3N0YXJ0X3J0Y3ApLAorCSAgKHJ0cF9zZXNzaW9uX29uX3RpbWVvdXQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBNYXJrIHRoZSBpbnRlcm5hbCBzb3VyY2Ugd2l0aCBhIGZsYWcuCisJICBVc2UgcnVubmluZ190aW1lIGluc3RlYWQgb2YgdGhlIG1vcmUgdXNlbGVzcyB0aW1lc3RhbXAuCisJICBWYWxpZGF0ZSBhIHNvdXJjZSB3aGVuIGEgdmFsaWQgU0RFUyBoYXMgYmVlbiByZWNlaXZlZC4KKwkgIFBhc3MgdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUgd2hlbiBwcm9jZXNzaW5nIFNSIHBhY2tldHMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAocnRwX3NvdXJjZV9jbGFzc19pbml0KSwKKwkgIChydHBfc291cmNlX2luaXQpLCAocnRwX3NvdXJjZV9jcmVhdGVfc3RhdHMpLAorCSAgKHJ0cF9zb3VyY2VfZ2V0X3Byb3BlcnR5KSwgKHJ0cF9zb3VyY2Vfc2VuZF9ydHApLAorCSAgKHJ0cF9zb3VyY2VfcHJvY2Vzc19yYiksIChydHBfc291cmNlX2dldF9uZXdfcmIpLAorCSAgKHJ0cF9zb3VyY2VfZ2V0X2xhc3RfcmIpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIEFkZCBwcm9wZXJ0eSB0byBnZXQgc291cmNlIHN0YXRzLgorCSAgTWFyayBwYXJhbXMgYXMgU1RBVElDX1NUUklOR1MuCisJICBDYWxjdWxhdGUgdGhlIGJpdHJhdGUgYXQgdGhlIHNlbmRlciBTU1JDLgorCSAgQXZvaWQgbmVnYXRpdmUgdmFsdWVzIGluIHRoZSByb3VuZCB0cmlwIHRpbWUgY2FsY3VsYXRpb25zLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgVXBkYXRlIHNvbWUgZG9jcyBhbmQgY2hhbmdlIHNvbWUgdmFyaWFibGUgbmFtZSB0byBtb3JlIGNsb3NlbHkgcmVmbGVjdAorCSAgd2hhdCBpdCBjb250YWlucy4KKworMjAwOC0xMS0yMCAwODoxOToxNSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogSW5pdGlhbGl6ZSByZXR1cm4gdmFsdWUgdG8gZml4IGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdW5pbml0aWFsaXplZCB2YXJpYWJsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW5fcnRjcCk6CisJICBJbml0aWFsaXplIHJldHVybiB2YWx1ZSB0byBmaXggY29tcGlsZXIgd2FybmluZyBhYm91dCB1bmluaXRpYWxpemVkCisJICB2YXJpYWJsZS4KKworMjAwOC0xMS0xOSAxNjo0ODozOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IE1hcmsgc2lnbmFsIGFyZyBhcyBzdGF0aWMgc2NvcGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NsYXNzX2luaXQpOgorCSAgTWFyayBzaWduYWwgYXJnIGFzIHN0YXRpYyBzY29wZS4KKworMjAwOC0xMS0xOSAwOTowNjoyOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IFJlbW92ZSBpbnRlcm5hbCBzeW5jIHBhZCwgdXNlIHNpZ25hbHMgaW5zdGVhZCB0byBnZXQgbGlwLXN5bmMgbm90aWZpY2F0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdzdF9ydHBfYmluX2Fzc29jaWF0ZSksCisJICAoZ3N0X3J0cF9iaW5faGFuZGxlX3N5bmMpLCAoY3JlYXRlX3N0cmVhbSksIChmcmVlX3N0cmVhbSksCisJICAobmV3X3NzcmNfcGFkX2ZvdW5kKToKKwkgIFJlbW92ZSBpbnRlcm5hbCBzeW5jIHBhZCwgdXNlIHNpZ25hbHMgaW5zdGVhZCB0byBnZXQgbGlwLXN5bmMKKwkgIG5vdGlmaWNhdGlvbnMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfaW50ZXJuYWxfbGlua3MpLCAoY3JlYXRlX3J0Y3Bfc2luayksCisJICAocmVtb3ZlX3J0Y3Bfc2luayksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfcmVxdWVzdF9uZXdfcGFkKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfcmVsZWFzZV9wYWQpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaW5rX3J0Y3BfZXZlbnQpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbl9ydGNwKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICBNYWtlIGl0IHBvc3NpYmxlIHRvIHNlbmQgU1IgcGFja2V0cyB0byB0aGUgaml0dGVyYnVmZmVyLgorCSAgQ2hlY2sgaWYgdGhlIFNSIHRpbWVzdGFtcHMgYXJlIHZhbGlkIGJ5IGNvbXBhcmluZyB0aGVtIHRvIHRoZSBSVFAKKwkgIHRpbWVzdGFtcHMuCisJICBTaWduYWwgdGhlIFNSIHBhY2tldCBhbmQgdGhlIHRpbWluZyBpbmZvcm1hdGlvbiB0byBsaXN0ZW5lcnMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOiAoY3JlYXRlX2RlbXV4X3BhZF9mb3Jfc3NyYyksCisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X3J0Y3BfY2hhaW4pLCAoZ3N0X3J0cF9zc3JjX2RlbXV4X3NyY19xdWVyeSk6CisJICBSZW1vdmUgc29tZSB1bnVzZWQgY29kZS4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChydHBfaml0dGVyX2J1ZmZlcl9yZXNldF9za2V3KSwKKwkgIChjYWxjdWxhdGVfc2tldyksIChydHBfaml0dGVyX2J1ZmZlcl9nZXRfc3luYyk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgS2VlcCB0cmFjayBvZiB0aGUgbGFzdCBzZWVuIFJUUCB0aW1lc3RhbXAgc28gdGhhdCB3ZSBjYW4gZmlsdGVyIG91dAorCSAgaW52YWxpZCBTUiBwYWNrZXRzLgorCisyMDA4LTExLTE3IDE5OjQ3OjMyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiBGaXggR1NUX0RFQlVHIGNhbGwgdG8gb25seSBoYXZlIGFzIG1hbnkgYXJndW1lbnRzIGFzIHJlcXVpcmVkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nLiBGaXhlcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAoZ2V0X2Nsb2NrX3JhdGUpOgorCSAgRml4IEdTVF9ERUJVRyBjYWxsIHRvIG9ubHkgaGF2ZSBhcyBtYW55IGFyZ3VtZW50cyBhcyByZXF1aXJlZAorCSAgYnkgdGhlIGZvcm1hdCBzdHJpbmcuIEZpeGVzIGEgY29tcGlsZXIgd2FybmluZy4KKworMjAwOC0xMS0xNyAxNToxNzo1MiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IERvIG5vdCB0cnkgdG8ga2VlcCB0cmFjayBvZiB0aGUgY2xvY2stcmF0ZSBvdXJzZWx2ZXMgYnV0IHNpbXBseSBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIGppLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnc3RfcnRwX2Jpbl9hc3NvY2lhdGUpLAorCSAgKGdzdF9ydHBfYmluX3N5bmNfY2hhaW4pLCAoY3JlYXRlX3N0cmVhbSksIChuZXdfc3NyY19wYWRfZm91bmQpOgorCSAgRG8gbm90IHRyeSB0byBrZWVwIHRyYWNrIG9mIHRoZSBjbG9jay1yYXRlIG91cnNlbHZlcyBidXQgc2ltcGx5IGdldCB0aGUKKwkgIHZhbHVlIGZyb20gdGhlIGppdHRlcmJ1ZmZlci4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X2ppdHRlcl9idWZmZXJfc2lua19wYXJzZV9jYXBzKSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbiksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2dldF9zeW5jKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICBBZGQgc29tZSBkZWJ1ZyBpbmZvLgorCSAgUGFzcyB0aGUgY2xvY2stcmF0ZSB0byB0aGUgaml0dGVyYnVmZmVyLgorCSAgQWxzbyBwYXNzIHRoZSBjbG9jay1yYXRlIGFsb25nIHdpdGggdGhlIHJ0cCB0aW1lc3RhbXAgd2hlbiBnZXR0aW5nIHRoZQorCSAgc3luYyBwYXJhbWV0ZXJzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6IChnc3RfcnRwX3B0X2RlbXV4X2NoYWluKToKKwkgIEZpeCBzb21lIGRlYnVnLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzogKHJ0cF9qaXR0ZXJfYnVmZmVyX3Jlc2V0X3NrZXcpLAorCSAgKGNhbGN1bGF0ZV9za2V3KSwgKHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF9zeW5jKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBLZWVwIHRyYWNrIG9mIGNsb2NrLXJhdGUgY2hhbmdlcyBhbmQgcmV0dXJuIHRoZSBjbG9jay1yYXRlIHRvZ2V0aGVyIHdpdGgKKwkgIHRoZSBydHAgdGltZXN0YW1wcyB1c2VkIGZvciBzeW5jLgorCSAgRG9uJ3QgdHJ5IHRvIGNvbnN0cnVjdCB0aW1lc3RhbXBzIHdoZW4gd2UgaGF2ZSBubyBiYXNlX3RpbWUuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAoZ2V0X2Nsb2NrX3JhdGUpOgorCSAgUmVxdWVzdCBhIG5ldyBjbG9jay1yYXRlIHdoZW4gdGhlIHBheWxvYWQgdHlwZSBjaGFuZ2VzLgorCSAgUmVzZXQgdGhlIGppdHRlciBjYWxjdWxhdGlvbiB3aGVuIHRoZSBjbG9jay1yYXRlIGNoYW5nZXMuCisKKzIwMDgtMTEtMTMgMTU6NDg6NTQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyLzogU21hbGwgY2xlYW51cHMgYW5kIHNvbWUgbW9yZSBkZWJ1ZyBpbmZvLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9qaXR0ZXJfYnVmZmVyX3NpbmtfcGFyc2VfY2FwcyksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoX3N0b3ApLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYWluKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChydHBfaml0dGVyX2J1ZmZlcl9yZXNldF9za2V3KSwKKwkgIChjYWxjdWxhdGVfc2tldyk6CisJICBTbWFsbCBjbGVhbnVwcyBhbmQgc29tZSBtb3JlIGRlYnVnIGluZm8uCisKKzIwMDgtMTEtMTAgMTU6MjY6NDAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiBBbHNvIGNvbmZpZ3VyZSB0aGUgbmV4dCBleHBlY3RlZCBvdXRwdXQgc2VxbnVtIHdoZW4gd2UgZ2V0IGEgc2VxbnVtLWJhc2Ugb24gdGhlIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9qaXR0ZXJfYnVmZmVyX3NpbmtfcGFyc2VfY2FwcyksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pOgorCSAgQWxzbyBjb25maWd1cmUgdGhlIG5leHQgZXhwZWN0ZWQgb3V0cHV0IHNlcW51bSB3aGVuIHdlIGdldCBhIHNlcW51bS1iYXNlCisJICBvbiB0aGUgY2Fwcy4KKworMjAwOC0xMS0wNCAxMjo0MjozMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBEb24ndCBpbnN0YWxsIHN0YXRpYyBsaWJzIGZvciBwbHVnaW5zLiBGaXhlcyAjNTUwODUxIGZvciAtYmFkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9hbHNhc3BkaWYvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hbXJ3Yi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FwZXhzaW5rL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXJ0cy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FydHNkL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXVkaW9maWxlL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXVkaW9yZXNhbXBsZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2J6Mi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2NkYXVkaW8vTWFrZWZpbGUuYW06CisJICAqIGV4dC9jZWx0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGMxMzk0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGlyYWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kaXJlY3RmYi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2RpdngvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kdHMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9mYWFjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZmFhZC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2dzbS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2hlcm1lcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2l2b3JiaXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9qYWNrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvanAyay9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xhZHNwYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xjcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xpYmZhbWUvTWFrZWZpbGUuYW06CisJICAqIGV4dC9saWJtbXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tZXRhZGF0YS9NYWtlZmlsZS5hbToKKwkgICogZXh0L21wZWcyZW5jL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXBsZXgvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tdXNlcGFjay9NYWtlZmlsZS5hbToKKwkgICogZXh0L211c2ljYnJhaW56L01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXl0aHR2L01ha2VmaWxlLmFtOgorCSAgKiBleHQvbmFzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbmVvbi9NYWtlZmlsZS5hbToKKwkgICogZXh0L29mYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3BvbHlwL01ha2VmaWxlLmFtOgorCSAgKiBleHQvcmVzaW5kdmQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zZGwvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zaG91dC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NuYXBzaG90L01ha2VmaWxlLmFtOgorCSAgKiBleHQvc25kZmlsZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NvdW5kdG91Y2gvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zcGMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zd2ZkZWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC90YXJraW4vTWFrZWZpbGUuYW06CisJICAqIGV4dC90aGVvcmEvTWFrZWZpbGUuYW06CisJICAqIGV4dC90aW1pZGl0eS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3R3b2xhbWUvTWFrZWZpbGUuYW06CisJICAqIGV4dC94MjY0L01ha2VmaWxlLmFtOgorCSAgKiBleHQveGluZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3h2aWQvTWFrZWZpbGUuYW06CisJICAqIGdzdC1saWJzL2dzdC9hcHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC1saWJzL2dzdC9kc2hvdy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FpZmZwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FwcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvYnVmZmVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYmF5ZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9jZHhhcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9jaGFydC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2NvbG9yc3BhY2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kY2NwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWludGVybGFjZTIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kdmRzcHUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9mZXN0aXZhbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ZpbHRlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ZsYWNwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2dhbWVzL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvaDI2NHBhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbGlicmZiL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWl4bWF0cml4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbW9kcGx1Zy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21wZWcxc3lzL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZzR2aWRlb3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ2RlbXV4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ3RzbXV4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ3ZpZGVvcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tdmUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9uc2YvTWFrZWZpbGUuYW06CisJICAqIGdzdC9udXZkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L292ZXJsYXkvTWFrZWZpbGUuYW06CisJICAqIGdzdC9wYXNzdGhyb3VnaC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3BjYXBwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3BsYXlvbmRlbWFuZC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3Jhd3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcmVhbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0anBlZy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zY2FsZXRlbXBvL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc2RwL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc2VsZWN0b3IvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zbW9vdGgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zbW9vdGh3YXZlL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3BlZWQvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zcGVleHJlc2FtcGxlL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3RlcmVvL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3ViZW5jL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdHRhL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmJpZGVjL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9kcm9wL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9zaWduYWwvTWFrZWZpbGUuYW06CisJICAqIGdzdC92aXJ0dWFsZHViL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvdm1uYy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3k0bS9NYWtlZmlsZS5hbToKKwkgICogc3lzL2FjbWVuYy9NYWtlZmlsZS5hbToKKwkgICogc3lzL2Nkcm9tL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHNob3dkZWN3cmFwcGVyL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHNob3dzcmN3cmFwcGVyL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHZiL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHhyMy9NYWtlZmlsZS5hbToKKwkgICogc3lzL2ZiZGV2L01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3NzNC9NYWtlZmlsZS5hbToKKwkgICogc3lzL3FjYW0vTWFrZWZpbGUuYW06CisJICAqIHN5cy9xdHdyYXBwZXIvTWFrZWZpbGUuYW06CisJICAqIHN5cy92Y2QvTWFrZWZpbGUuYW06CisJICAqIHN5cy93aW5pbmV0L01ha2VmaWxlLmFtOgorCSAgKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBEb24ndCBpbnN0YWxsIHN0YXRpYyBsaWJzIGZvciBwbHVnaW5zLiBGaXhlcyAjNTUwODUxIGZvciAtYmFkLgorCisyMDA4LTEwLTE2IDEzOjA1OjM3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogRml4IHByb2JsZW0gd2l0aCB1c2luZyB0aGUgb3V0cHV0IHNlcW51bSBjb3VudGVyIHRvIGNoZWNrIGZvciBpbnB1dCBzZXFudW0gZGlzY28uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3Rfaml0dGVyX2J1ZmZlcl9zaW5rX3BhcnNlX2NhcHMpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9mbHVzaF9zdGFydCksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoX3N0b3ApLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYWluKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCk6CisJICBGaXggcHJvYmxlbSB3aXRoIHVzaW5nIHRoZSBvdXRwdXQgc2VxbnVtIGNvdW50ZXIgdG8gY2hlY2sgZm9yIGlucHV0CisJICBzZXFudW0gZGlzY29udGludWl0aWVzLgorCSAgSW1wcm92ZSBnYXAgZGV0ZWN0aW9uIGFuZCByZWNvdmVyeSwgcmVzZXQgYW5kIGZsdXNoIHRoZSBqaXR0ZXJidWZmZXIgb24KKwkgIHNlcW51bSByZXN0YXJ0LiBGaXhlcyAjNTU2NTIwLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzogKHJ0cF9qaXR0ZXJfYnVmZmVyX2luc2VydCk6CisJICBGaXggd3JvbmcgR19MSUtFTFkuCisKKzIwMDgtMTAtMTYgMDk6NTE6MjggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogSW5zdGFsbCBldmVudCBoYW5kbGVyIG9uIHRoZSBydGNwX3NyYyBwYWQsIG1ha2UgTEFURU5DWSBldmVudCByZXR1cm4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRjcF9zcmMpLCAoY3JlYXRlX3NlbmRfcnRjcF9zcmMpOgorCSAgSW5zdGFsbCBldmVudCBoYW5kbGVyIG9uIHRoZSBydGNwX3NyYyBwYWQsIG1ha2UgTEFURU5DWSBldmVudCByZXR1cm4KKwkgIFRSVUUuCisKKzIwMDgtMTAtMDcgMTg6NTQ6NDEgKzAwMDAgIEjDpXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi1tYXJzaGFsLmxpc3Q6IEFkZCBtYXJzaGFsbGVyIGZvciBuZXcgYWN0aW9uIHNpZ25hbC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEjDpXZhcmQgR3JhZmYgPGhhdmFyZCBkb3QgZ3JhZmYgYXQgdGFuZGJlcmcgZG90IGNvbT4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLW1hcnNoYWwubGlzdDoKKwkgIEFkZCBtYXJzaGFsbGVyIGZvciBuZXcgYWN0aW9uIHNpZ25hbC4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnc3RfcnRwX2Jpbl9nZXRfaW50ZXJuYWxfc2Vzc2lvbiksCisJICAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgQWRkIGFjdGlvbiBzaWduYWwgdG8gcmV0cmlldmUgdGhlIGludGVybmFsIFJUUFNlc3Npb24gb2JqZWN0LgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2dldF9wcm9wZXJ0eSksIChnc3RfcnRwX3Nlc3Npb25fcmVsZWFzZV9wYWQpOgorCSAgQWRkIHByb3BlcnR5IHRvIGFjY2VzcyB0aGUgaW50ZXJuYWwgUlRQU2Vzc2lvbiBvYmplY3QuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX2NsYXNzX2luaXQpLAorCSAgKGNoZWNrX2NvbGxpc2lvbik6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIEFkZCBhY3Rpb24gc2lnbmFsIHRvIHJldHJpZXZlIGFuIFJUUFNvdXJjZSBvYmplY3QgYnkgU1NSQy4KKwkgIFNlZSAjNTU1Mzk2LgorCisyMDA4LTEwLTA3IDExOjMzOjEwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogUmVsZWFzZSBwYWRzIG9mIHRoZSBzZXNzaW9uIG1hbmFnZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChmaW5kX3Nlc3Npb25fYnlfcGFkKSwKKwkgIChmcmVlX3Nlc3Npb24pLCAoZ3N0X3J0cF9iaW5fZGlzcG9zZSksIChyZW1vdmVfcmVjdl9ydHApLAorCSAgKHJlbW92ZV9yZWN2X3J0Y3ApLCAocmVtb3ZlX3NlbmRfcnRwKSwgKHJlbW92ZV9ydGNwKSwKKwkgIChnc3RfcnRwX2Jpbl9yZWxlYXNlX3BhZCk6CisJICBSZWxlYXNlIHBhZHMgb2YgdGhlIHNlc3Npb24gbWFuYWdlci4KKwkgIFN0YXJ0IGltcGxlbWVudGluZyByZWxlYXNpbmcgcGFkcyBvZiBnc3RydHBiaW4uCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogKHJlbW92ZV9yZWN2X3J0cF9zaW5rKSwKKwkgIChyZW1vdmVfcmVjdl9ydGNwX3NpbmspLCAocmVtb3ZlX3NlbmRfcnRwX3NpbmspLAorCSAgKHJlbW92ZV9zZW5kX3J0Y3Bfc3JjKSwgKGdzdF9ydHBfc2Vzc2lvbl9yZWxlYXNlX3BhZCk6CisJICBJbXBsZW1lbnQgcmVsZWFzaW5nIHBhZHMgaW4gZ3N0cnRwc2Vzc2lvbi4KKworMjAwOC0xMC0wNyAxMDowMjoyMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IE9ubHkgdXBkYXRlIHRoZSBzZXFudW0tYmFzZSB3aGVuIGl0IHdhcyBub3QgYWxyZWFkeSBjb25maWd1cmVkIGZvciB0aGUgc3RyZWFtcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3Rfaml0dGVyX2J1ZmZlcl9zaW5rX3BhcnNlX2NhcHMpOgorCSAgT25seSB1cGRhdGUgdGhlIHNlcW51bS1iYXNlIHdoZW4gaXQgd2FzIG5vdCBhbHJlYWR5IGNvbmZpZ3VyZWQgZm9yIHRoZQorCSAgc3RyZWFtcy4KKworMjAwOC0wOS0zMCAxNTowODo1MiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiBSZWYgdGhlIHJ0cHNvdXJjZSBvYmplY3QgYmVmb3JlIHdlIHJlbGVhc2UgdGhlIHNlc3Npb24gbG9jayB3aGVuIHdlIGVtaXQgdGhlIHNpZ25hbHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAob25fbmV3X3NzcmMpLCAob25fc3NyY19jb2xsaXNpb24pLAorCSAgKG9uX3NzcmNfdmFsaWRhdGVkKSwgKG9uX3NzcmNfYWN0aXZlKSwgKG9uX3NzcmNfc2RlcyksCisJICAob25fYnllX3NzcmMpLCAob25fYnllX3RpbWVvdXQpLCAob25fdGltZW91dCksIChvbl9zZW5kZXJfdGltZW91dCk6CisJICBSZWYgdGhlIHJ0cHNvdXJjZSBvYmplY3QgYmVmb3JlIHdlIHJlbGVhc2UgdGhlIHNlc3Npb24gbG9jayB3aGVuIHdlIGVtaXQKKwkgIHRoZSBzaWduYWxzLgorCisyMDA4LTA5LTIzIDE4OjEzOjMxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci86IEZpeCBzb21lIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChydHBfaml0dGVyX2J1ZmZlcl9pbnNlcnQpLAorCSAgKHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF9zeW5jKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAob25fc2VuZGVyX3RpbWVvdXQpLAorCSAgKHNlc3Npb25fY2xlYW51cCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOgorCSAgRml4IHNvbWUgZG9jcy4KKworMjAwOC0wOS0xNyAxMzo1OToyMSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIEZpeCBjb21waWxlciB3YXJuaW5ncyBvbiBPUy9YCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jOiAoamFja19wcm9jZXNzX2NiKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChjYWxjdWxhdGVfc2tldyk6CisJICBGaXggY29tcGlsZXIgd2FybmluZ3Mgb24gT1MvWAorCisyMDA4LTA5LTEzIDAxOjM3OjUwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogRG8gbm90IHRyeSB0byBhZGp1c3QgdGhlIG9mZnNldCBvZiBzdHJlYW1zIGZvciB3aGljaCB3ZSBoYXZlIG5vdCB5ZXQgc2VlbiBhbiBTUiBwYWNrZXQuIEEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGNyZWF0ZV9zZXNzaW9uKSwKKwkgIChnc3RfcnRwX2Jpbl9hc3NvY2lhdGUpLCAoZ3N0X3J0cF9iaW5fc3luY19jaGFpbik6CisJICBEbyBub3QgdHJ5IHRvIGFkanVzdCB0aGUgb2Zmc2V0IG9mIHN0cmVhbXMgZm9yIHdoaWNoIHdlIGhhdmUgbm90IHlldAorCSAgc2VlbiBhbiBTUiBwYWNrZXQuIEF2b2lkcyBsYXJnZSB0cy1vZmZzZXRzIGluIHNvbWUgY2FzZXMuCisKKzIwMDgtMDktMDUgMTM6NTI6MzQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi4qOiBBZGQgc2lnbmFsIHRvIG5vdGlmeSBsaXN0ZW5lcnMgd2hlbiBhIHNlbmRlciBiZWNvbWVzIGEgcmVjZWl2ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChvbl9zZW5kZXJfdGltZW91dCksCisJICAoY3JlYXRlX3Nlc3Npb24pLCAoZ3N0X3J0cF9iaW5fYXNzb2NpYXRlKSwKKwkgIChnc3RfcnRwX2Jpbl9zeW5jX2NoYWluKSwgKGdzdF9ydHBfYmluX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfYmluX3JlcXVlc3RfbmV3X3BhZCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgQWRkIHNpZ25hbCB0byBub3RpZnkgbGlzdGVuZXJzIHdoZW4gYSBzZW5kZXIgYmVjb21lcyBhIHJlY2VpdmVyLgorCSAgVHdlYWsgbGlwLXN5bmMgY29kZSwgZG9uJ3Qgc3RvcmUgb3VyIG93biBjb3B5IG9mIHRoZSB0cy1vZmZzZXQgb2YgdGhlCisJICBqaXR0ZXJidWZmZXIsIGRvbid0IGFkanVzdCBzeW5jIGlmIHRoZSBjaGFuZ2UgaXMgbGVzcyB0aGFuIDRtc2VjLgorCSAgR2V0IHRoZSBSVFAgdGltZXN0YW1wIDwtPiBHU3RyZWFtZXIgdGltZXN0YW1wIHJlbGF0aW9uIGRpcmVjdGx5IGZyb20KKwkgIHRoZSBqaXR0ZXJidWZmZXIgaW5zdGVhZCBvZiBvdXIgaW5hY2N1cmF0ZSB2ZXJzaW9uIGZyb20gdGhlIHNvdXJjZS4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYWluKSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3N5bmMpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuaDoKKwkgIEFkZCBHX0xJS0VMWSBtYWNyb3MsIHVzZSBnbG9iYWwgZGVmaW5lcyBmb3IgbWF4IHBhY2tldCByZW9yZGVyIGFuZAorCSAgZHJvcG91dHMuCisJICBSZXNldCB0aGUgaml0dGVyYnVmZmVyIGNsb2NrIHNrZXcgZGV0ZWN0aW9uIHdoZW4gcGFja2V0cyBzZXFudW1zIGFyZQorCSAgY2hhbmdlZCB1bmV4cGVjdGVkbHkuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogKG9uX3NlbmRlcl90aW1lb3V0KSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fY2xhc3NfaW5pdCksIChnc3RfcnRwX3Nlc3Npb25faW5pdCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uaDoKKwkgIEFkZCBzZW5kZXIgdGltZW91dCBzaWduYWwuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOiAocnRwX2ppdHRlcl9idWZmZXJfcmVzZXRfc2tldyksCisJICAoY2FsY3VsYXRlX3NrZXcpLCAocnRwX2ppdHRlcl9idWZmZXJfaW5zZXJ0KSwKKwkgIChydHBfaml0dGVyX2J1ZmZlcl9nZXRfc3luYyk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgQWRkIHNvbWUgR19MSUtFTFkgbWFjcm9zLgorCSAgS2VlcCB0cmFjayBvZiB0aGUgZXh0ZW5kZWQgUlRQIHRpbWVzdGFtcCBzbyB0aGF0IHdlIGNhbiByZXBvcnQgdGhlIFJUUAorCSAgdGltZXN0YW1wIDwtPiBHU3RyZWFtZXIgdGltZXN0YW1wIHJlbGF0aW9uIGZvciBsaXAtc3luYy4KKwkgIFJlbW92ZSBzZXJ2ZXIgdGltZXN0YW1wIGdhcCBkZXRlY3Rpb24gY29kZSwgdGhlIHNlcnZlciBjYW4gc29tZXRpbWVzCisJICBtYWtlIGEgaHVnZSBnYXAgaW4gdGltZXN0YW1wcyAodGFsayBzcHVydHMsLi4uKSBzZWUgIzU0OTc3NC4KKwkgIERldGVjdCB0aW1ldGFtcCB3ZWlyZG5lc3MgaW5zdGVhZCBieSBvYnNlcnZpbmcgdGhlIHNlbmRlci9yZWNlaXZlcgorCSAgdGltZXN0YW1wIHJlbGF0aW9uIGFuZCByZXN5bmMgaWYgaXQgY2hhbmdlcyBtb3JlIHRoYW4gMSBzZWNvbmQuCisJICBBZGQgbWV0aG9kIHRvIHJlcG9ydCBhYm91dCB0aGUgY3VycmVudCBydHAgPC0+IGdzdCB0aW1lc3RhbXAgcmVsYXRpb24KKwkgIHdoaWNoIGlzIG5lZWRlZCBmb3IgbGlwLXN5bmMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX2NsYXNzX2luaXQpLAorCSAgKG9uX3NlbmRlcl90aW1lb3V0KSwgKGNoZWNrX2NvbGxpc2lvbiksIChydHBfc2Vzc2lvbl9wcm9jZXNzX3NyKSwKKwkgIChzZXNzaW9uX2NsZWFudXApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBBZGQgc2VuZGVyIHRpbWVvdXQgc2lnbmFsLgorCSAgUmVtb3ZlIGluYWNjdXJhdGUgcnRwIDwtPiBnc3QgdGltZXN0YW1wIHJlbGF0aW9uIGNvZGUsIHRoZQorCSAgaml0dGVyYnVmZmVyIGNhbiBub3cgZG8gYW4gYWNjdXJhdGUgcmVwb3J0aW5nIGFib3V0IHRoaXMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAocnRwX3NvdXJjZV9pbml0KSwKKwkgIChydHBfc291cmNlX3VwZGF0ZV9jYXBzKSwgKGNhbGN1bGF0ZV9qaXR0ZXIpLAorCSAgKHJ0cF9zb3VyY2VfcHJvY2Vzc19ydHApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIFJlbW92ZSBpbmFjY3VyYXRlIHJ0cCA8LT4gZ3N0IHRpbWVzdGFtcCByZWxhdGlvbiBjb2RlLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgRGVmaW5lIGdsb2JhbCBtYXgtcmVvcmRlciBhbmQgbWF4LWRyb3BvdXQgY29uc3RhbnRzIGZvciB1c2UgaW4gdmFyaW91cworCSAgc3Vic3lzdGVtcy4KKworMjAwOC0wOC0yOCAxNToyMTo0NSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiBTZW5kIEVPUyB3aGVuIHRoZSBzZXNzaW9uIG9iamVjdCBpbnN0cnVjdHMgdXMgdG8uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoZ3N0X3J0cF9zZXNzaW9uX3NlbmRfcnRjcCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRwX3NpbmspOgorCSAgU2VuZCBFT1Mgd2hlbiB0aGUgc2Vzc2lvbiBvYmplY3QgaW5zdHJ1Y3RzIHVzIHRvLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChydHBfc2Vzc2lvbl9vbl90aW1lb3V0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgTWFrZSBpdCBwb3NzaWJsZSBmb3IgdGhlIHNlc3Npb24gbWFuYWdlciB0byBpbnN0cnVjdCB1cyB0byBzZW5kIEVPUy4gV2UKKwkgIGN1cnJlbnRseSB3aWxsIEVPUyB3aGVuIHRoZSBzZXNzaW9uIGlzIGEgc2VuZGVyIGFuZCB3aGVuIHRoZSBzZW5kZXIgcGFydAorCSAgZ29lcyBFT1MuIFRoaXMgaXMgbm90IGVudGlyZWx5IGNvcnJlY3QgYmVoYXZpb3VyIGJlY2F1c2UgdGhlIHNlc3Npb24KKwkgIGNvdWxkIHN0aWxsIHBhcnRpY2lwYXRlIGFzIGEgcmVjZWl2ZXIuCisJICBGaXhlcyAjNTQ5NDA5LgorCisyMDA4LTA4LTEzIDE0OjMxOjAyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogUmVzZXQgcnRwIHRpbWVzdGFtcCBpbnRlcnBvbGxhdGlvbiB3aGVuIHdlIGRldGVjdCBhIGdhcCB3aGVuIHRoZSBjbG9ja19iYXNlIGNoYW5nZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnc3RfcnRwX2Jpbl9hc3NvY2lhdGUpLAorCSAgKGdzdF9ydHBfYmluX3N5bmNfY2hhaW4pLCAobmV3X3NzcmNfcGFkX2ZvdW5kKToKKwkgIFJlc2V0IHJ0cCB0aW1lc3RhbXAgaW50ZXJwb2xsYXRpb24gd2hlbiB3ZSBkZXRlY3QgYSBnYXAgd2hlbiB0aGUKKwkgIGNsb2NrX2Jhc2UgY2hhbmdlZC4KKwkgIERvbid0IHRyeSB0byBhZGp1c3QgdGhlIHRzLW9mZnNldCB3aGVuIGl0J3MgdG9vIGJpZyAoPiAzc2Vjb25kcykKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoZ3N0X3J0cF9zZXNzaW9uX3NldF9zc3JjKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5oOgorCSAgQWRkIG1ldGhvZCB0byBzZXQgc2Vzc2lvbiBTU1JDLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChjaGVja19jb2xsaXNpb24pLAorCSAgKHJ0cF9zZXNzaW9uX3NldF9pbnRlcm5hbF9zc3JjKSwgKHJ0cF9zZXNzaW9uX2dldF9pbnRlcm5hbF9zc3JjKSwKKwkgIChydHBfc2Vzc2lvbl9vbl90aW1lb3V0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgQWRkZWQgZGVidWdnaW5nIGZvciB0aGUgY29sbGlzaW9uIGNoZWNrcy4KKwkgIEFkZCBtZXRob2QgdG8gY2hhbmdlIHRoZSBpbnRlcm5hbCBTU1JDIG9mIHRoZSBzZXNzaW9uLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzogKHJ0cF9zb3VyY2VfcHJvY2Vzc19ydHApOgorCSAgUmVzZXQgdGhlIGNsb2NrIGJhc2Ugd2hlbiB3ZSBkZXRlY3QgbGFyZ2UganVtcHMgaW4gdGhlIHNlcW51bXMuCisKKzIwMDgtMDgtMTEgMDc6MjA6MTUgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IFByaW50IHRoZSBwYWQtbmFtZSBpbiBkZWJ1ZyBsb2cuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBQcmludCB0aGUgcGFkLW5hbWUgaW4gZGVidWcgbG9nLgorCSAgKiBzeXMvZHNob3dzcmN3cmFwcGVyL2dzdGRzaG93YXVkaW9zcmMuYzoKKwkgICogc3lzL2RzaG93c3Jjd3JhcHBlci9nc3Rkc2hvd3ZpZGVvc3JjLmM6CisJICBVc2UgIi0iIGluc3RlYWQgb2YgIl8iIGluIHByb3BlcnR5IG5hbWVzLiBDYW4gd2UgY2FsbCB0aGVtIGp1c3QKKwkgICJkZXZpY2UiIGxpa2UgZXZlcnl3aGVyZSBlbHNlPworCisyMDA4LTA4LTA1IDA5OjQyOjUzICswMDAwICBPbGl2aWVyIENyZXRlIDx0ZXN0ZXJAdGVzdGVyLmNhPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogTWFrZSB0aGUgYnVmZmVyIG1ldGFkYXRhIHdyaXRhYmxlIGJlZm9yZSBpbnNlcnRpbmcgaXQgaW4gdGhlIGppdHRlcmJ1ZmZlciBiZWNhdXMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlciBhdCB0ZXN0ZXIgZG90IGNhPgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApOgorCSAgTWFrZSB0aGUgYnVmZmVyIG1ldGFkYXRhIHdyaXRhYmxlIGJlZm9yZSBpbnNlcnRpbmcgaXQgaW4gdGhlCisJICBqaXR0ZXJidWZmZXIgYmVjYXVzZSB0aGUgaml0dGVyYnVmZmVyIHdpbGwgbW9kaWZ5IHRoZSB0aW1lc3RhbXBzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIFVwZGF0ZSBtZXRob2QgY29tbWVudCBhYm91dCByZXF1aXJpbmcgd3JpdGFibGUgbWV0YWRhdGEgb24gYnVmZmVycy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAocnRwX3Nlc3Npb25fcHJvY2Vzc19zciksCisJICAocnRwX3Nlc3Npb25fcHJvY2Vzc19ydGNwKToKKwkgIE1ha2UgdGhlIFJUQ1AgYnVmZmVyIG1ldGFkYXRhIHdyaXRhYmxlIGJlY2F1c2Ugd2Ugd2FudCB0byBtb2RpZnkgdGhlCisJICBtZXRhZGF0YS4KKwkgIEZpeGVzICM1NDYzMTIuCisKKzIwMDgtMDgtMDUgMDk6MDA6NTAgKzAwMDAgIEjDpXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiBGaXggZGVidWcgYnkgbG9nZ2luZyB0aGUgcmlnaHQgc2VxbnVtLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSMOldmFyZCBHcmFmZiA8aGF2YXJkIGRvdCBncmFmZiBhdCB0YW5kYmVyZyBkb3QgY29tPgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pOgorCSAgRml4IGRlYnVnIGJ5IGxvZ2dpbmcgdGhlIHJpZ2h0IHNlcW51bS4KKworMjAwOC0wOC0wNSAwODo1ODoyNyArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IFJlbGVhc2UgbG9jayBiZWZvcmUgZW1pdHRpbmcgdGhlIHJlcXVlc3QtcHQtbWFwIHNpZ25hbC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlciBhdCB0ZXN0ZXIgZG90IGNhPgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdldF9wdF9tYXApOgorCSAgUmVsZWFzZSBsb2NrIGJlZm9yZSBlbWl0dGluZyB0aGUgcmVxdWVzdC1wdC1tYXAgc2lnbmFsLgorCSAgRml4ZXMgIzU0MzQ4MC4KKworMjAwOC0wNy0wMyAxNDo0NDo1MSArMDAwMCAgUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2pAYXhpcy5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyLzogQ29ycmVjdGVkIGEgdHlwbyAoaW50ZXJwb2xsYXRlIC0+IGludGVycG9sYXRlKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBDaGFuZ2VMb2c6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzogKHJ0cF9zb3VyY2VfZ2V0X25ld19zcik6CisJICBDb3JyZWN0ZWQgYSB0eXBvIChpbnRlcnBvbGxhdGUgLT4gaW50ZXJwb2xhdGUpLgorCisyMDA4LTA3LTAzIDE0OjMxOjEwICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvOiBDaGFuZ2VkIHNvbWUgR1NUX0RFQlVHKCkgdG8gR1NUX0xPRygpIHRvIHJlZHVjZSB0aGUgc3BhbSB3aGVuIGEgcGlwZWxpbmUgaXMgcnVubmluZyBub3JtYWxseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fcHJvY2Vzc19ydHApLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9zZW5kX3J0cCksIChnc3RfcnRwX3Nlc3Npb25fc2VuZF9ydGNwKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fc3luY19ydGNwKSwgKGdzdF9ydHBfc2Vzc2lvbl9jaGFpbl9yZWN2X3J0cCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3JlY3ZfcnRjcCksIChnc3RfcnRwX3Nlc3Npb25fY2hhaW5fc2VuZF9ydHApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChzb3VyY2VfcHVzaF9ydHApLAorCSAgKHJ0cF9zZXNzaW9uX3NlbmRfcnRwKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChwdXNoX3BhY2tldCksIChjYWxjdWxhdGVfaml0dGVyKSwKKwkgIChydHBfc291cmNlX3Byb2Nlc3NfcnRwKSwgKHJ0cF9zb3VyY2Vfc2VuZF9ydHApOgorCSAgQ2hhbmdlZCBzb21lIEdTVF9ERUJVRygpIHRvIEdTVF9MT0coKSB0byByZWR1Y2UgdGhlIHNwYW0gd2hlbiBhCisJICBwaXBlbGluZSBpcyBydW5uaW5nIG5vcm1hbGx5LgorCisyMDA4LTA3LTAzIDEzOjQ3OjE5ICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvOiBEbyBub3QgbWl4IHRoZSB1c2Ugb2YgZ19nZXRfY3VycmVudF90aW1lKCkgd2l0aCBnc3RfY2xvY2tfZ2V0X3RpbWUoKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25faW5pdCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2ZpbmFsaXplKSwgKHJ0Y3BfdGhyZWFkKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fY2hhaW5fcmVjdl9ydHApLCAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3JlY3ZfcnRjcCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRwX3NpbmspLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9jaGFpbl9zZW5kX3J0cCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKGNoZWNrX2NvbGxpc2lvbiksCisJICAodXBkYXRlX2Fycml2YWxfc3RhdHMpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19ydHApLAorCSAgKHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnRjcCksIChydHBfc2Vzc2lvbl9zZW5kX3J0cCksCisJICAocnRwX3Nlc3Npb25fc2VuZF9ieWVfbG9ja2VkKSwgKHJ0cF9zZXNzaW9uX3NlbmRfYnllKSwKKwkgIChydHBfc2Vzc2lvbl9uZXh0X3RpbWVvdXQpLCAoc2Vzc2lvbl9yZXBvcnRfYmxvY2tzKSwgKHNlc3Npb25fY2xlYW51cCksCisJICAoaXNfcnRjcF90aW1lKSwgKHJ0cF9zZXNzaW9uX29uX3RpbWVvdXQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBEbyBub3QgbWl4IHRoZSB1c2Ugb2YgZ19nZXRfY3VycmVudF90aW1lKCkgd2l0aCBnc3RfY2xvY2tfZ2V0X3RpbWUoKS4KKworMjAwOC0wNi0xNiAwNzozMDozNCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBGaW5hbCByb3VuZCBvZiBkb2MgdXBkYXRlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgICogZ3N0L3NwZWVkL2dzdHNwZWVkLmM6CisJICAqIGdzdC9zcGVleHJlc2FtcGxlL2dzdHNwZWV4cmVzYW1wbGUuYzoKKwkgICogZ3N0L3ZpZGVvc2lnbmFsL2dzdHZpZGVvYW5hbHlzZS5jOgorCSAgKiBnc3QvdmlkZW9zaWduYWwvZ3N0dmlkZW9kZXRlY3QuYzoKKwkgICogZ3N0L3ZpZGVvc2lnbmFsL2dzdHZpZGVvbWFyay5jOgorCSAgKiBzeXMvZHZiL2dzdGR2YnNyYy5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6CisJICAqIHN5cy9vc3M0L29zczQtc2luay5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOgorCSAgKiBzeXMvd2luaW5ldC9nc3R3aW5pbmV0c3JjLmM6CisJICBGaW5hbCByb3VuZCBvZiBkb2MgdXBkYXRlcy4KKworMjAwOC0wNi0xNiAwNzowMzo1OCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvOiBNb3JlIGRvYyB1cGRhdGVzLiBNb3JlIHhyZWZzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwY2xpZW50LmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICAqIGdzdC9zZHAvZ3N0c2RwZGVtdXguYzoKKwkgIE1vcmUgZG9jIHVwZGF0ZXMuIE1vcmUgeHJlZnMuCisKKzIwMDgtMDYtMTIgMTQ6NDk6MTggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgRG8gbm90IHVzZSBzaG9ydF9kZXNjcmlwdGlvbiBpbiBzZWN0aW9uIGRvY3MgZm9yIGVsZW1lbnRzLiBXZSBleHRyYWN0IHRoZW0gZnJvbSBlbGVtZW50IGRldGFpbHMgYW5kIHRoZXJlIHdpbGwgYmUgd2FyLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2RjMTM5NC9nc3RkYzEzOTQuYzoKKwkgICogZXh0L2l2b3JiaXMvdm9yYmlzZGVjLmM6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkgICogZXh0L21ldGFkYXRhL2dzdG1ldGFkYXRhZGVtdXguYzoKKwkgICogZXh0L215dGh0di9nc3RteXRodHZzcmMuYzoKKwkgICogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzoKKwkgICogZ3N0LWxpYnMvZ3N0L2FwcC9nc3RhcHBzaW5rLmM6CisJICAqIGdzdC9iYXllci9nc3RiYXllcjJyZ2IuYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICAqIGdzdC9yYXdwYXJzZS9nc3RhdWRpb3BhcnNlLmM6CisJICAqIGdzdC9yYXdwYXJzZS9nc3R2aWRlb3BhcnNlLmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBjbGllbnQuYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgICogZ3N0L3NlbGVjdG9yL2dzdGlucHV0c2VsZWN0b3IuYzoKKwkgICogZ3N0L3NlbGVjdG9yL2dzdG91dHB1dHNlbGVjdG9yLmM6CisJICAqIGdzdC92aWRlb3NpZ25hbC9nc3R2aWRlb2FuYWx5c2UuYzoKKwkgICogZ3N0L3ZpZGVvc2lnbmFsL2dzdHZpZGVvZGV0ZWN0LmM6CisJICAqIGdzdC92aWRlb3NpZ25hbC9nc3R2aWRlb21hcmsuYzoKKwkgICogc3lzL29zczQvb3NzNC1taXhlci5jOgorCSAgKiBzeXMvb3NzNC9vc3M0LXNpbmsuYzoKKwkgICogc3lzL29zczQvb3NzNC1zb3VyY2UuYzoKKwkgIERvIG5vdCB1c2Ugc2hvcnRfZGVzY3JpcHRpb24gaW4gc2VjdGlvbiBkb2NzIGZvciBlbGVtZW50cy4gV2UgZXh0cmFjdAorCSAgdGhlbSBmcm9tIGVsZW1lbnQgZGV0YWlscyBhbmQgdGhlcmUgd2lsbCBiZSB3YXJuaW5ncyBpZiB0aGV5IGRpZmZlci4KKwkgIEFsc28gZml4aW5nIHVwIHRoZSBDaGFuZ2VMb2cgb3JkZXIuCisKKzIwMDgtMDYtMDYgMTM6MDE6MDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiBGaXggZGVhZGxvY2sgd2hlbiBzaHV0dGluZyBkb3duLCB1c2UgYSBuZXcgbG9jayBpbnN0ZWFkIHRvIHByb3Blcmx5IHNodXRkb3duLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoZ3N0X3J0cF9iaW5faW5pdCksCisJICAoZ3N0X3J0cF9iaW5fZmluYWxpemUpLCAoZ3N0X3J0cF9iaW5fY2hhbmdlX3N0YXRlKToKKwkgIEZpeCBkZWFkbG9jayB3aGVuIHNodXR0aW5nIGRvd24sIHVzZSBhIG5ldyBsb2NrIGluc3RlYWQgdG8gcHJvcGVybHkKKwkgIHNodXRkb3duLgorCisyMDA4LTA1LTI3IDE2OjQ4OjEwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogQnJlYWsgb3V0IG9mIGNhbGxiYWNrcyB3aGVuIHdlIGFyZSBzaHV0dGluZyBkb3duLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgKGdzdF9ydHBfYmluX3Byb3BhZ2F0ZV9wcm9wZXJ0eV90b19qaXR0ZXJidWZmZXIpLAorCSAgKGdzdF9ydHBfYmluX2NoYW5nZV9zdGF0ZSksIChuZXdfcGF5bG9hZF9mb3VuZCksCisJICAobmV3X3NzcmNfcGFkX2ZvdW5kKToKKwkgIEJyZWFrIG91dCBvZiBjYWxsYmFja3Mgd2hlbiB3ZSBhcmUgc2h1dHRpbmcgZG93bi4KKwkgIE1ha2Ugc3VyZSBubyBzdGF0ZSBjaGFuZ2VzIGNhbiBoYXBwZW4gd2hlbiB3ZSByZWNvbmZpZ3VyZS4KKworMjAwOC0wNS0yNiAxMDowOToyOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IFdoZW4gY2hlY2tpbmcgdGhlIHNlcW51bSwgcmVzZXQgdGhlIGppdHRlcmJ1ZmZlciBpZiB0aGUgZ2FwIGlzIHRvbyBiaWcsIHdlIG5lZWQgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYWluKSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKToKKwkgIFdoZW4gY2hlY2tpbmcgdGhlIHNlcW51bSwgcmVzZXQgdGhlIGppdHRlcmJ1ZmZlciBpZiB0aGUgZ2FwIGlzIHRvbyBiaWcsCisJICB3ZSBuZWVkIHRvIGRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gYmV0dGVyIGhhbmRsZSBhIHJlc3RhcnRlZCBzb3VyY2UuCisJICBGaXggc29tZSBjb21tZW50cy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChjYWxjdWxhdGVfc2tldyksCisJICAocnRwX2ppdHRlcl9idWZmZXJfaW5zZXJ0KToKKwkgIFR3ZWFrIHRoZSBza2V3IHJlc3luYyBkaWZmLgorCSAgVXNlIG91ciB3b3JraW5nIHNlcW51bSBjb21wYXJlIGZ1bmN0aW9uIGluIC1iYXNlLgorCSAgUmV3b3JrIHRoZSBqaXR0ZXJidWZmZXIgaW5zZXJ0IGNvZGUgdG8gbWFrZSBpdCBjbGVhcmVyIGFuZCBtb3JlCisJICBwZXJmb3JtYW50IGJ5IG9ubHkgcmV0cmlldmluZyB0aGUgc2VxbnVtIG9mIHRoZSBpbnB1dCBidWZmZXIgb25jZSBhbmQgYnkKKwkgIGFkZGluZyBzb21lIEdfTElLRUxZIGNvbXBpbGVyIGhpbnRzLgorCSAgSW1wcm92ZSBkZWJ1Z2dpbmcgZm9yIGR1cGxpY2F0ZSBwYWNrZXRzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzogKHJ0cF9zb3VyY2VfcHJvY2Vzc19ydHApOgorCSAgRml4IGEgY29tbWVudCwgd2UgZG9uJ3QgZG8gc2tldyBjb3JyZWN0aW9uIGhlcmUuLgorCisyMDA4LTA1LTI2IDEwOjAwOjI0ICswMDAwICBIw6V2YXJkIEdyYWZmIDxoYXZhcmQuZ3JhZmZAdGFuZGJlcmcuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogUHJvcGFnYXRlIHRoZSBkby1sb3N0IGFuZCBsYXRlbmN5IHByb3BlcnRpZXMgdG8gdGhlIGppdHRlcmJ1ZmZlcnMgd2hlbiB0aGV5IGFyZSBjaGFuZ2VkIG8uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEjDpXZhcmQgR3JhZmYgPGhhdmFyZCBkb3QgZ3JhZmYgYXQgdGFuZGJlcmcgZG90IGNvbT4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICAoZ3N0X3J0cF9iaW5fcHJvcGFnYXRlX3Byb3BlcnR5X3RvX2ppdHRlcmJ1ZmZlciksCisJICAoZ3N0X3J0cF9iaW5fc2V0X3Byb3BlcnR5KToKKwkgIFByb3BhZ2F0ZSB0aGUgZG8tbG9zdCBhbmQgbGF0ZW5jeSBwcm9wZXJ0aWVzIHRvIHRoZSBqaXR0ZXJidWZmZXJzIHdoZW4KKwkgIHRoZXkgYXJlIGNoYW5nZWQgb24gcnRwYmluLgorCisyMDA4LTA1LTI2IDA5OjU3OjQwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBEb24ndCB1c2UgX2dzdF9wYWQoKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleGFtcGxlcy9zd2l0Y2gvc3dpdGNoZXIuYzogKHN3aXRjaF90aW1lcik6CisJICAqIGdzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmM6IChnc3Rfcmdfdm9sdW1lX2luaXQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBjbGllbnQuYzogKGNyZWF0ZV9zdHJlYW0pOgorCSAgKiBnc3Qvc2RwL2dzdHNkcGRlbXV4LmM6IChnc3Rfc2RwX2RlbXV4X3N0cmVhbV9jb25maWd1cmVfdWRwKSwKKwkgIChnc3Rfc2RwX2RlbXV4X3N0cmVhbV9jb25maWd1cmVfdWRwX3NpbmspOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGVhdmUuYzogKEdTVF9TVEFSVF9URVNUKSwKKwkgIChwYWRfYWRkZWRfc2V0dXBfZGF0YV9jaGVja19mbG9hdDMyXzhjaF9jYik6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzogKHNlbmRfZW9zX2V2ZW50KSwKKwkgIChzZW5kX3RhZ19ldmVudCk6CisJICBEb24ndCB1c2UgX2dzdF9wYWQoKS4KKworMjAwOC0wNS0xNiAxOTo1NjozMCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGRvY3MvTWFrZWZpbGUuYW06IERvbid0IGF0dGVtcHQgdG8gYnVpbGQgcGx1Z2luIGRvY3Mgd2hlbiB0aGV5J3JlIGRpc2FibGVkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvTWFrZWZpbGUuYW06CisJICBEb24ndCBhdHRlbXB0IHRvIGJ1aWxkIHBsdWdpbiBkb2NzIHdoZW4gdGhleSdyZSBkaXNhYmxlZC4KKwkgICogZ3N0L2JheWVyL01ha2VmaWxlLmFtOgorCSAgQWRkIGxpYmdzdHZpZGVvIHRvIHRoZSBsaW5rLgorCSAgKiBnc3QvcnRwbWFuYWdlci9NYWtlZmlsZS5hbToKKwkgIEZpeCBsaW5rIG9yZGVyLCBhbmQgbW92ZSBMSUJTIHRoaW5ncyB0byBfTElCUworCisyMDA4LTA1LTE0IDIxOjAyOjE5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogU2ltcGx5IGRyb3AgYmFkIFJUUCBwYWNrZXRzIHdpdGggYSB3YXJuaW5nIGluc3RlYWQgb2YganVzdCBwb3N0aW5nIGFuIGVycm9yIGFuZCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pOgorCSAgU2ltcGx5IGRyb3AgYmFkIFJUUCBwYWNrZXRzIHdpdGggYSB3YXJuaW5nIGluc3RlYWQgb2YganVzdCBwb3N0aW5nIGFuCisJICBlcnJvciBhbmQgc3RvcHBpbmcuIFRoaXMgaXMgYSBwZXJmZWN0bHkgcmVjb3ZlcmFibGUgZXZlbnQgYW5kIHdlIGRvbid0CisJICBmb3JjZSBwZW9wbGUgdG8gdXNlIGFuIHJ0cGJpbiB0byBmaWx0ZXIgb3V0IGJhZCBwYWNrZXRzIGZpcnN0LgorCisyMDA4LTA1LTEzIDA5OjA2OjUxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogQWN0dWFsbHkgYWRkIHRoZSBkby1sb3N0IHByb3BlcnR5IHRvIHRoZSBvYmplY3QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnc3RfcnRwX2Jpbl9jbGFzc19pbml0KToKKwkgIEFjdHVhbGx5IGFkZCB0aGUgZG8tbG9zdCBwcm9wZXJ0eSB0byB0aGUgb2JqZWN0LgorCisyMDA4LTA1LTEyIDE4OjQzOjQxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogQXZvaWQgd2FpdGluZyBmb3IgYSBuZWdhdGl2ZSAoaHVnZSkgZHVyYXRpb24gd2hlbiB0aGUgbGFzdCBwYWNrZXQgaGFzIGEgbG93ZXIgdGkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCk6CisJICBBdm9pZCB3YWl0aW5nIGZvciBhIG5lZ2F0aXZlIChodWdlKSBkdXJhdGlvbiB3aGVuIHRoZSBsYXN0IHBhY2tldCBoYXMgYQorCSAgbG93ZXIgdGltZXN0YW1wIHRoYW4gdGhlIGN1cnJlbnQgcGFja2V0LgorCisyMDA4LTA1LTEyIDE0OjI4OjA5ICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiBNYWtlIHN1cmUgdG8gdW5yZWYgdGhlIHJ0cHNlc3Npb24gcmV0dXJuZWQgYnkgZ3N0X3BhZF9nZXRfcGFyZW50KCkgdG8gcHJldmVudCBhIG1lbW9yLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoZ3N0X3J0cF9zZXNzaW9uX3F1ZXJ5X3NlbmRfcnRjcF9zcmMpOgorCSAgTWFrZSBzdXJlIHRvIHVucmVmIHRoZSBydHBzZXNzaW9uIHJldHVybmVkIGJ5IGdzdF9wYWRfZ2V0X3BhcmVudCgpIHRvCisJICBwcmV2ZW50IGEgbWVtb3J5IGxlYWsuCisKKzIwMDgtMDUtMTIgMTQ6MTI6MDggKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogSW5pdGlhbGlzZSB3aXRoIEdTVF9DTE9DS19USU1FX05PTkUgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCk6CisJICBJbml0aWFsaXNlIHdpdGggR1NUX0NMT0NLX1RJTUVfTk9ORSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nLgorCisyMDA4LTA1LTA5IDA3OjQxOjU4ICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IE1ha2Ugc3VyZSB0byB1bnJlZiB0aGUgY2FwcyB1c2VkIGJ5IFJUUFNvdXJjZSB0byBwcmV2ZW50IGEgbWVtb3J5IGxlYWsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChydHBfc291cmNlX2ZpbmFsaXplKToKKwkgIE1ha2Ugc3VyZSB0byB1bnJlZiB0aGUgY2FwcyB1c2VkIGJ5IFJUUFNvdXJjZSB0byBwcmV2ZW50IGEgbWVtb3J5IGxlYWsuCisKKzIwMDgtMDUtMDggMDk6NDM6MzMgKzAwMDAgIE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogVW5sb2NrIHRoZSBzZXNzaW9uIGxvY2sgd2hlbiBjYWxsaW5nIG9uZSBvZiBvdXIgY2FsbGJhY2tzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyIGF0IHRlc3RlciBkb3QgY2E+CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHNvdXJjZV9jbG9ja19yYXRlKSwKKwkgIChydHBfc2Vzc2lvbl9wcm9jZXNzX2J5ZSksIChydHBfc2Vzc2lvbl9zZW5kX2J5ZV9sb2NrZWQpOgorCSAgVW5sb2NrIHRoZSBzZXNzaW9uIGxvY2sgd2hlbiBjYWxsaW5nIG9uZSBvZiBvdXIgY2FsbGJhY2tzLgorCSAgRml4ZXMgIzUzMjAxMS4KKworMjAwOC0wNS0wOCAwNjoyMzozOSArMDAwMCAgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IFNlbmQgUlRQIEJZRSBjb21tYW5kIG9uIEVPUy4gRml4ZXMgYnVnICM1MzE5NTUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTam9lcmQgU2ltb25zIDxzam9lcmQgYXQgbHVvbiBkb3QgbmV0PgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRwX3NpbmspOgorCSAgU2VuZCBSVFAgQllFIGNvbW1hbmQgb24gRU9TLiBGaXhlcyBidWcgIzUzMTk1NS4KKworMjAwOC0wNC0yNSAxMTozMjowOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLio6IEV4cG9zZSBuZXcgaml0dGVyYnVmZmVyIHByb3BlcnR5IGluIHJ0cGJpbiB0b28uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChjcmVhdGVfc3RyZWFtKSwgKGdzdF9ydHBfYmluX2luaXQpLAorCSAgKGdzdF9ydHBfYmluX3NldF9wcm9wZXJ0eSksIChnc3RfcnRwX2Jpbl9nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgIEV4cG9zZSBuZXcgaml0dGVyYnVmZmVyIHByb3BlcnR5IGluIHJ0cGJpbiB0b28uCisKKzIwMDgtMDQtMjUgMTE6MjI6MTMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiBEaXNhYmxlIHNlbmRpbmcgb3V0IHJ0cCBwYWNrZXQgbG9zdCBldmVudHMgYnkgZGVmYXVsdCBhbmQgbWFrZSBhIHByb3BlcnR5IHRvIGVuYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jbGFzc19pbml0KSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9pbml0KSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3Byb3BlcnR5KToKKwkgIERpc2FibGUgc2VuZGluZyBvdXQgcnRwIHBhY2tldCBsb3N0IGV2ZW50cyBieSBkZWZhdWx0IGFuZCBtYWtlIGEKKwkgIHByb3BlcnR5IHRvIGVuYWJlIGl0LiBXZSB3aWxsIGxpa2VseSBlbmFibGUgaXQgYnkgZGVmYXVsdCB3aGVuIHRoZSBiYXNlCisJICBkZXBheWxvYWRlcnMgaGF2ZSBhIGRlZmF1bHQgaGFuZGxlciBmb3IgdGhlbSBzbyB0aGF0IHdlIGRvbid0IHNlbmQgdGhlc2UKKwkgIGV2ZW50cyBhbGwgdGhyb3VnaCB0aGUgcGlwZWxpbmUgZm9yIG5vdy4KKworMjAwOC0wNC0yNSAwOTozNTo0MyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IFJlbW92ZSBwcml2YXRlIHZlcnNpb24gb2YgYSBmdW5jdGlvbiB0aGF0IGlzIGluIC1iYXNlIG5vdy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfaW5pdCksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZmx1c2hfc3RvcCksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NyY19ldmVudCksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKToKKwkgIFJlbW92ZSBwcml2YXRlIHZlcnNpb24gb2YgYSBmdW5jdGlvbiB0aGF0IGlzIGluIC1iYXNlIG5vdy4KKwkgIEFkZCBzcmMgZXZlbnQgaGFuZGxlci4KKwkgIFJld29yayB0aGUgaml0dGVyYnVmZmVyIHB1c2hpbmcgbG9vcCBzbyB0aGF0IGl0IGNhbiBxdWlja2x5IHJlYWN0IHRvCisJICBsb3N0IHBhY2tldHMgYW5kIGluc3RydWN0IHRoZSBkZXBheWxvYWRlciBvZiB0aGVtLiBUaGlzIGNhbiB0aGVuIGJlIHVzZWQKKwkgIHRvIGltcGxlbWVudCBlcnJvciBjb25jZWFsbWVudCBkYXRhLgorCisyMDA4LTA0LTI1IDA4OjIxOjA2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IFNldCB1cCBzb21lIGludGVybmFsIGxpbmtzIGZ1bmN0aW9ucyBmb3IgdGhlIFJUQ1AgYW5kIHN5bmMgcGFkcyBiZWNhdXNlIHRoZSBkZWZhdWx0cyAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICAoZ3N0X3J0cF9zZXNzaW9uX3F1ZXJ5X3NlbmRfcnRjcF9zcmMpLCAoY3JlYXRlX3JlY3ZfcnRjcF9zaW5rKSwKKwkgIChjcmVhdGVfc2VuZF9ydGNwX3NyYyk6CisJICBTZXQgdXAgc29tZSBpbnRlcm5hbCBsaW5rcyBmdW5jdGlvbnMgZm9yIHRoZSBSVENQIGFuZCBzeW5jIHBhZHMgYmVjYXVzZQorCSAgdGhlIGRlZmF1bHRzIGFyZSByZWFsbHkgbm90IGNvcnJlY3QuCisJICBJbXBsZW1lbnQgYSBxdWVyeSBoYW5kbGVyIGZvciB0aGUgUlRDUCBzcmMgcGFkLCBtb3N0bHkgdG8gY29ycmVjdGx5CisJICByZXBvcnQgYWJvdXQgdGhlIGxhdGVuY3kuCisKKzIwMDgtMDQtMjUgMDg6MTU6NTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyLzogQWxzbyBrZWVwIHRyYWNrIG9mIHRoZSBmaXJzdCBidWZmZXIgdGltZXN0YW1wIHRvZ2V0aGVyIHdpdGggdGhlIGZpcnN0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnc3RfcnRwX2Jpbl9hc3NvY2lhdGUpLAorCSAgKGdzdF9ydHBfYmluX3N5bmNfY2hhaW4pOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6ICh1cGRhdGVfYXJyaXZhbF9zdGF0cyksCisJICAocnRwX3Nlc3Npb25fcHJvY2Vzc19zciksIChydHBfc2Vzc2lvbl9vbl90aW1lb3V0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChydHBfc291cmNlX2luaXQpLAorCSAgKGNhbGN1bGF0ZV9qaXR0ZXIpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIEFsc28ga2VlcCB0cmFjayBvZiB0aGUgZmlyc3QgYnVmZmVyIHRpbWVzdGFtcCB0b2dldGhlciB3aXRoIHRoZSBmaXJzdAorCSAgUlRQIHRpbWVzdGFtcCBhcyB0aGV5IGJvdGggYXJlIG5lZWRlZCB0byBjb25zdHJ1Y3QgdGhlIHRpbWluZyBvZgorCSAgb3V0Z29pbmcgcGFja2V0cyBpbiB0aGUgaml0dGVyYnVmZmVyIGFuZCBhcmUgdGhlcmVmb3JlIGFsc28gbmVlZGVkIHRvCisJICBtYW5hZ2UgbGlwLXN5bmMuIFRoaXMgZml4ZXMgbGlwLXN5bmMgaWYgdGhlIGZpcnN0IFJUUCBwYWNrZXRzIGFycml2ZQorCSAgd2l0aCBhIHdpbGRseSBkaWZmZXJlbnQgZ2FwLgorCisyMDA4LTA0LTIxIDA4OjI2OjM3ICswMDAwICBPbGl2aWVyIENyZXRlIDx0ZXN0ZXJAdGVzdGVyLmNhPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogUmVmIGNhcHMgd2hlbiBpbnNlcnRpbmcgaW50byB0aGUgY2FjaGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBPbGl2aWVyIENyZXRlIDx0ZXN0ZXIgYXQgdGVzdGVyIGRvdCBjYT4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChjcmVhdGVfc2Vzc2lvbiksIChnZXRfcHRfbWFwKSwKKwkgIChuZXdfc3NyY19wYWRfZm91bmQpOgorCSAgUmVmIGNhcHMgd2hlbiBpbnNlcnRpbmcgaW50byB0aGUgY2FjaGUuCisJICBEb24ndCBsZWFrIHBhZHMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9nZXRfY2xvY2tfcmF0ZSksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3F1ZXJ5KToKKwkgIEF2b2lkIGEgY2FwcyBsZWFrLgorCSAgRG9uJ3QgbGVhayByZWZjb3VudCBpbiBxdWVyeS4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOiAoZ3N0X3J0cF9wdF9kZW11eF9nZXRfY2FwcyksCisJICAoZ3N0X3J0cF9wdF9kZW11eF9jaGFpbik6CisJICBBdm9pZCBjYXBzIGxlYWtzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChzb3VyY2VfZ2V0X3NkZXNfc3RydWN0dXJlKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25faW5pdCksIChyZXR1cm5fdHJ1ZSksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NsZWFyX3B0X21hcCksIChnc3RfcnRwX3Nlc3Npb25fY2FjaGVfY2FwcyksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2Nsb2NrX3JhdGUpOgorCSAgUmVmIGNhcHMgd2hlbiBpbnNlcnRpbmcgaW50byB0aGUgY2FjaGUuCisJICBGaXggc29tZSBtb3JlIGNhcHMgbGVha3MuIEZpeGVzICM1MjgyNDUuCisKKzIwMDgtMDQtMTcgMDc6MzE6NDQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyLzogVW5zZXQgR1ZhbHVlcyBhZnRlciBnX3NpZ25hbF9lbWl0diBzbyB0aGF0IHdlIGF2b2lkIGEgcmVmY291bnQgbGVhay4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdldF9wdF9tYXApLCAoZnJlZV9jbGllbnQpLAorCSAgKGdzdF9ydHBfYmluX2Fzc29jaWF0ZSksIChnc3RfcnRwX2Jpbl9nZXRfZnJlZV9wYWRfbmFtZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9nZXRfY2xvY2tfcmF0ZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzogKGdzdF9ydHBfcHRfZGVtdXhfZ2V0X2NhcHMpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fY2xvY2tfcmF0ZSk6CisJICBVbnNldCBHVmFsdWVzIGFmdGVyIGdfc2lnbmFsX2VtaXR2IHNvIHRoYXQgd2UgYXZvaWQgYSByZWZjb3VudCBsZWFrLgorCSAgRG9uJ3QgbGVhayBhIHBhZG5hbWUuCisJICBEb24ndCBsZWFrIGNsaWVudCBzdHJlYW1zIGxpc3QuCisJICBMb2NrIHJ0cGJpbiB3aGVuIGFzc29jaWF0aW5nIHN0cmVhbXMuIEZpeGVzICM1MjgyNDUuCisKKzIwMDgtMDQtMDkgMjI6Mjc6NTAgKzAwMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci86IEF2b2lkIGxlYWtpbmcgcGFkcyBpbiB0aGUgUlRQIG1hbmFnZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChmcmVlX3Nlc3Npb24pOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fZmluYWxpemUpOgorCSAgQXZvaWQgbGVha2luZyBwYWRzIGluIHRoZSBSVFAgbWFuYWdlci4KKworMjAwOC0wMy0xMSAxMjo0MDo1OCArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi4qOiBJbXBsZW1lbnQgY29sbGlzaW9uIGFuZCBsb29wIGRldGVjdGlvbiBpbiBydHBtYW5hZ2VyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyIGF0IHRlc3RlciBkb3QgY2E+CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKGZpbmRfYWRkX2NvbmZsaWN0aW5nX2FkZHJlc3NlcyksCisJICAoY2hlY2tfY29sbGlzaW9uKSwgKG9idGFpbl9zb3VyY2UpLCAocnRwX3Nlc3Npb25fY3JlYXRlX25ld19zc3JjKSwKKwkgIChydHBfc2Vzc2lvbl9jcmVhdGVfc291cmNlKSwgKHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnRwKSwKKwkgIChydHBfc2Vzc2lvbl9wcm9jZXNzX3NyKSwgKHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnIpLAorCSAgKHJ0cF9zZXNzaW9uX3Byb2Nlc3Nfc2RlcyksIChydHBfc2Vzc2lvbl9wcm9jZXNzX2J5ZSksCisJICAocnRwX3Nlc3Npb25fc2VuZF9ieWVfbG9ja2VkKSwgKHJ0cF9zZXNzaW9uX3NlbmRfYnllKSwKKwkgIChydHBfc2Vzc2lvbl9vbl90aW1lb3V0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgSW1wbGVtZW50IGNvbGxpc2lvbiBhbmQgbG9vcCBkZXRlY3Rpb24gaW4gcnRwbWFuYWdlci4KKwkgIEZpeGVzICM1MjA2MjYuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAocnRwX3NvdXJjZV9yZXNldCksCisJICAocnRwX3NvdXJjZV9pbml0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBBZGQgbWV0aG9kIHRvIHJlc2V0IHN0YXRzLgorCisyMDA4LTAzLTExIDExOjM2OjAzICswMDAwICBPbGUgQW5kcsOpIFZhZGxhIFJhdm7DpXMgPG9sZS5hbmRyZS5yYXZuYXNAdGFuZGJlcmcuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IEF2b2lkIGEgZGVhZGxvY2sgd2hlbiBqb2luaW5nIHRoZSBSVENQIHRocmVhZCBpbiBQQVVTRUQgYmVjYXVzZSBpdCBtaWdodCBiZSBibG9ja2VkIGQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcyAgPG9sZS5hbmRyZS5yYXZuYXNAdGFuZGJlcmcuY29tPgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25faW5pdCksCisJICAocnRjcF90aHJlYWQpLCAoc3RhcnRfcnRjcF90aHJlYWQpLCAoc3RvcF9ydGNwX3RocmVhZCksCisJICAoam9pbl9ydGNwX3RocmVhZCksIChnc3RfcnRwX3Nlc3Npb25fY2hhbmdlX3N0YXRlKToKKwkgIEF2b2lkIGEgZGVhZGxvY2sgd2hlbiBqb2luaW5nIHRoZSBSVENQIHRocmVhZCBpbiBQQVVTRUQgYmVjYXVzZSBpdCBtaWdodAorCSAgYmUgYmxvY2tlZCBkb3duc3RyZWFtLiBBbHNvIGF2b2lkIHNwYXduaW5nIG11bHRpcGxlIHJ0Y3AgdGhyZWFkcy4KKwkgIEZpeGVzICM1MjA4OTQuCisKKzIwMDgtMDMtMTEgMTA6NDM6MzIgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSAgZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IERvbid0IHRyeSB0byByZXNldCB0aGUgY2xvY2sgc2tldyB3aGVuIHdlIGhhdmUgbm8gdGltZXN0YW1wcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChjYWxjdWxhdGVfc2tldyk6CisJICBEb24ndCB0cnkgdG8gcmVzZXQgdGhlIGNsb2NrIHNrZXcgd2hlbiB3ZSBoYXZlIG5vIHRpbWVzdGFtcHMuCisJICBGaXhlcyAjNTE5MDA1LgorCisyMDA4LTAyLTIwIDA5OjMzOjI1ICswMDAwICBPbGl2aWVyIENyZXRlIDx0ZXN0ZXJAdGVzdGVyLmNhPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogRml4IHNtYWxsIG1lbW9yeSBsZWFrLCBsZWFraW5nIGNhcHMuIEZpeGVzICNidWcgNTE3NTcxLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyIGF0IHRlc3RlciBkb3QgY2E+CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAobmV3X3NzcmNfcGFkX2ZvdW5kKToKKwkgIEZpeCBzbWFsbCBtZW1vcnkgbGVhaywgbGVha2luZyBjYXBzLiBGaXhlcyAjYnVnIDUxNzU3MS4KKworMjAwOC0wMi0xNCAxNjoyNTo1MSArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IElnbm9yZSBzdHJlYW1zIHRoYXQgZGlkIG5vdCByZWNlaXZlIGFuIFNSIHBhY2tldCB3aGVuIGRvaW5nIHN5bmNocm9uaXNhdGlvbi4gRml4ZXMgIzUxNjE2MC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoZ3N0X3J0cF9iaW5fYXNzb2NpYXRlKToKKwkgIElnbm9yZSBzdHJlYW1zIHRoYXQgZGlkIG5vdCByZWNlaXZlIGFuIFNSIHBhY2tldCB3aGVuIGRvaW5nCisJICBzeW5jaHJvbmlzYXRpb24uIEZpeGVzICM1MTYxNjAuCisKKzIwMDgtMDEtMjkgMTg6NTc6MjcgKzAwMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiBUcnkgdG8gZ2V0IHRoZSBuZXcgY2xvY2stcmF0ZSBmcm9tIHRoZSBidWZmZXIgY2FwcyB3aGVuIHdlIHJlY2VpdmUgYSBuZXcgcGF5bG9hZC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVGhpanMgVmVybWVpciAgPHRoaWpzdmVybWVpciBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pOgorCSAgVHJ5IHRvIGdldCB0aGUgbmV3IGNsb2NrLXJhdGUgZnJvbSB0aGUgYnVmZmVyIGNhcHMgd2hlbiB3ZSByZWNlaXZlIGEgbmV3CisJICBwYXlsb2FkIHR5cGUgaW5zdGVhZCBvZiBhbHdheXMgZmlyaW5nIHRoZSBzaWduYWwuIEZpeGVzICM1MTI3NzQuCisKKzIwMDgtMDEtMjUgMTY6NTg6MDAgKzAwMDAgIE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiBBbHNvIGhhbmRsZSBsaXAtc3luYyB3aGVuIHRoZSBjbG9jay1yYXRlIGlzIG5vdCBwcm92aWRlZCB3aXRoIGNhcHMgYnV0IHdpdGggYSBzaWduYWwuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBPbGl2aWVyIENyZXRlIDx0ZXN0ZXJAdGVzdGVyLmNhPgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdzdF9ydHBfYmluX2Fzc29jaWF0ZSksCisJICAoY3JlYXRlX3N0cmVhbSksIChwYXlsb2FkX3R5cGVfY2hhbmdlKSwgKG5ld19zc3JjX3BhZF9mb3VuZCk6CisJICBBbHNvIGhhbmRsZSBsaXAtc3luYyB3aGVuIHRoZSBjbG9jay1yYXRlIGlzIG5vdCBwcm92aWRlZCB3aXRoIGNhcHMgYnV0CisJICB3aXRoIGEgc2lnbmFsLgorCisyMDA4LTAxLTI1IDE2OjAwOjUyICswMDAwICBPbGl2aWVyIENyZXRlIDx0ZXN0ZXJAdGVzdGVyLmNhPgorCisJICBnc3QvcnRwbWFuYWdlci86IFJlbW92ZSB0aGUgZml4ZWQgY2xvY2stcmF0ZSBmcm9tIHRoZSBqaXR0ZXJidWZmZXIgYW5kIGV4dGVuZCBpdCBzbyB0aGF0IGEgY2xvY2stcmF0ZSBjYW4gYmUgcHJvdmlkZWQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9qaXR0ZXJfYnVmZmVyX3NpbmtfcGFyc2VfY2FwcyksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzogKGNhbGN1bGF0ZV9za2V3KSwKKwkgIChydHBfaml0dGVyX2J1ZmZlcl9pbnNlcnQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkgIFJlbW92ZSB0aGUgZml4ZWQgY2xvY2stcmF0ZSBmcm9tIHRoZSBqaXR0ZXJidWZmZXIgYW5kIGV4dGVuZCBpdCBzbyB0aGF0CisJICBhIGNsb2NrLXJhdGUgY2FuIGJlIHByb3ZpZGVkIHdpdGggZWFjaCBidWZmZXIgaW5zdGVhZC4gRml4ZXMgIzUxMTY4Ni4KKworMjAwOC0wMS0yNSAxNTo0OTo1NSArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IFJlbW92ZSBvbGQgdW51c2VkIHZhcmlhYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2luaXQpLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYWluKSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKToKKwkgIFJlbW92ZSBvbGQgdW51c2VkIHZhcmlhYmxlLgorCSAgVHJhY2sgcHQgb24gaW5wdXQgYnVmZmVycyBhbmQgZ2V0IHRoZSBjbG9jay1yYXRlIHdoZW4gaXQgY2hhbmdlcy4KKwkgIElnbm9yZSBwYWNrZXRzIHdpdGggdW5rbm93biBjbG9jay1yYXRlLiBTZWUgIzUxMTY4Ni4KKworMjAwOC0wMS0yNSAwMTo0NDoyNyArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IEZpeCB1bnJlZiBvZiBidWZmZXIgdXNpbmcgdGhlIHdyb25nIGZ1bmN0aW9uLiAgRml4ZXMgIzUxMTkyMAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IEZpeCB1bnJlZiBvZiBidWZmZXIgdXNpbmcgdGhlCisJICB3cm9uZyBmdW5jdGlvbi4gIEZpeGVzICM1MTE5MjAKKworMjAwOC0wMS0xMSAxNzowMjozMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiBJZiB3ZSBmaW5kIHRoZSBjYXBzIGluIHRoZSBjYWNoZSwgdXNlIGl0IHRvIHBhcnNlIHRoZSBjbG9jay1yYXRlIGluc3RlYWQgb2YgcmV0dXJuaW5nLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoZ3N0X3J0cF9zZXNzaW9uX2Nsb2NrX3JhdGUpOgorCSAgSWYgd2UgZmluZCB0aGUgY2FwcyBpbiB0aGUgY2FjaGUsIHVzZSBpdCB0byBwYXJzZSB0aGUgY2xvY2stcmF0ZSBpbnN0ZWFkCisJICBvZiByZXR1cm5pbmcgYW4gZXJyb3IuIEZpeGVzIGEgVE9ETyBhcyBmb3VuZCBieSBZb3VuZXNzIEFsYW91aS4KKworMjAwOC0wMS0xMSAxNjo0NTo1NyArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3J0cG1hbmFnZXIvOiBNYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSBkaWZmZXJlbnQgdXNlcl9kYXRhIGZvciBlYWNoIG9mIHRoZSBjYWxsYmFja3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBZb3VuZXNzIEFsYW91aSA8eW91bmVzcyBkb3QgYWxhb3VpIGF0IGNvbGxhYm9yYSBkb3QgY28gZG90IHVrPgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fY2xvY2tfcmF0ZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX3NldF9jYWxsYmFja3MpLAorCSAgKHJ0cF9zZXNzaW9uX3NldF9wcm9jZXNzX3J0cF9jYWxsYmFjayksCisJICAocnRwX3Nlc3Npb25fc2V0X3NlbmRfcnRwX2NhbGxiYWNrKSwKKwkgIChydHBfc2Vzc2lvbl9zZXRfc2VuZF9ydGNwX2NhbGxiYWNrKSwKKwkgIChydHBfc2Vzc2lvbl9zZXRfc3luY19ydGNwX2NhbGxiYWNrKSwKKwkgIChydHBfc2Vzc2lvbl9zZXRfY2xvY2tfcmF0ZV9jYWxsYmFjayksCisJICAocnRwX3Nlc3Npb25fc2V0X3JlY29uc2lkZXJfY2FsbGJhY2spLCAoc291cmNlX3B1c2hfcnRwKSwKKwkgIChzb3VyY2VfY2xvY2tfcmF0ZSksIChydHBfc2Vzc2lvbl9wcm9jZXNzX2J5ZSksCisJICAocnRwX3Nlc3Npb25fcHJvY2Vzc19ydGNwKSwgKHJ0cF9zZXNzaW9uX3NlbmRfYnllKSwKKwkgIChydHBfc2Vzc2lvbl9vbl90aW1lb3V0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgTWFrZSBpdCBwb3NzaWJsZSB0byB1c2UgZGlmZmVyZW50IHVzZXJfZGF0YSBmb3IgZWFjaCBvZiB0aGUgY2FsbGJhY2tzLgorCSAgRml4ZXMgIzUwODU4Ny4KKworMjAwOC0wMS0xMCAyMDo1NzoxNyArMDAwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IEZpeCBkb2N1bWVudGF0aW9uIGZvciBsYXRlc3QgcGF0Y2gKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIEZpeCBkb2N1bWVudGF0aW9uIGZvciBsYXRlc3QgcGF0Y2gKKworMjAwOC0wMS0xMCAxNDozNDozMCArMDAwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IEFsbG93IHJlcXVlc3RfbmV3X3BhZCB3aXRoIG5hbWUgTlVMTCAoYnVnICM1MDg1MTUpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6CisJICBBbGxvdyByZXF1ZXN0X25ld19wYWQgd2l0aCBuYW1lIE5VTEwgKGJ1ZyAjNTA4NTE1KQorCisyMDA4LTAxLTA5IDE0OjM5OjQ0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IERvbid0IHNldCBmaXhlZCBjYXBzLCB3ZSBjYW4gYmFzaWNhbGx5IGRvIGV2ZXJ5dGhpbmcgdGhlIHVwc3RlYW0gcGVlciBwYWQgY2FuIHJlbmVnb3QuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChjcmVhdGVfc2VuZF9ydHBfc2luayk6CisJICBEb24ndCBzZXQgZml4ZWQgY2Fwcywgd2UgY2FuIGJhc2ljYWxseSBkbyBldmVyeXRoaW5nIHRoZSB1cHN0ZWFtIHBlZXIKKwkgIHBhZCBjYW4gcmVuZWdvdGlhdGUgdG8uIEZpeGVzICM1MDc5NDAuCisKKzIwMDgtMDEtMDQgMTg6NDc6NTcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiBEb24ndCB1bnJlZiB0aGUgcG9wcGVkIGJ1ZmZlciB3aGVuIHdlIGRvbid0IGhhdmUgb3duZXJzaGlwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKToKKwkgIERvbid0IHVucmVmIHRoZSBwb3BwZWQgYnVmZmVyIHdoZW4gd2UgZG9uJ3QgaGF2ZSBvd25lcnNoaXAuCisJICBGaXhlcyAjNTA3MDIwLgorCisyMDA3LTEyLTMxIDEzOjEyOjA2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzogRG9uJ3QgY2xlYW4gdXAgcGFkcyB3aGVuIGdvaW5nIHRvIFBBVVNFRC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIChnc3RfcnRwX3NzcmNfZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgIERvbid0IGNsZWFuIHVwIHBhZHMgd2hlbiBnb2luZyB0byBQQVVTRUQuCisKKzIwMDctMTItMTIgMTY6NTk6MDMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyLzogQ2xlYW4gdXAgdGhlIGR5bmFtaWMgcGFkcyB3aGVuIGdvaW5nIHRvIFJFQURZLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzogKGdzdF9ydHBfcHRfZGVtdXhfZmluYWxpemUpLAorCSAgKGdzdF9ydHBfcHRfZGVtdXhfc2V0dXApLCAoZ3N0X3J0cF9wdF9kZW11eF9yZWxlYXNlKSwKKwkgIChnc3RfcnRwX3B0X2RlbXV4X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOiAoZ3N0X3J0cF9zc3JjX2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfcnRwX3NzcmNfZGVtdXhfZGlzcG9zZSksIChnc3RfcnRwX3NzcmNfZGVtdXhfc3JjX3F1ZXJ5KSwKKwkgIChnc3RfcnRwX3NzcmNfZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgIENsZWFuIHVwIHRoZSBkeW5hbWljIHBhZHMgd2hlbiBnb2luZyB0byBSRUFEWS4KKworMjAwNy0xMi0xMiAxMjoxMTo1MyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvOiBGaXggc29tZSBsZWFrcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdzdF9ydHBfYmluX2ZpbmFsaXplKSwKKwkgIChnc3RfcnRwX2Jpbl9zZXRfc2Rlc19zdHJpbmcpLCAoZ3N0X3J0cF9iaW5fZ2V0X3NkZXNfc3RyaW5nKSwKKwkgIChnc3RfcnRwX2Jpbl9oYW5kbGVfbWVzc2FnZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX2ZpbmFsaXplKSwKKwkgIChydHBfc2Vzc2lvbl9zZW5kX2J5ZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAocnRwX3NvdXJjZV9maW5hbGl6ZSk6CisJICBGaXggc29tZSBsZWFrcy4KKworMjAwNy0xMi0xMCAxODozNjowNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvOiBQb3N0IGEgbWVzc2FnZSB3aGVuIHRoZSBTREVTIGluZm9yIGNoYW5nZXMgZm9yIGEgc291cmNlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9iaW5faGFuZGxlX21lc3NhZ2UpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChzb3VyY2VfZ2V0X3NkZXNfc3RydWN0dXJlKSwKKwkgIChvbl9zc3JjX3NkZXMpOgorCSAgUG9zdCBhIG1lc3NhZ2Ugd2hlbiB0aGUgU0RFUyBpbmZvciBjaGFuZ2VzIGZvciBhIHNvdXJjZS4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgIFVwZGF0ZSBzb21lIGNvbW1lbnRzLgorCisyMDA3LTEyLTEwIDE1OjM0OjE5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci86IEFkZCBzaWduYWwgdG8gbm90aWZ5IG9mIGFuIFNERVMgY2hhbmdlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAob25fc3NyY19zZGVzKSwgKGNyZWF0ZV9zZXNzaW9uKSwKKwkgIChnc3RfcnRwX2Jpbl9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGNsaWVudC5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBjbGllbnQuaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG1hbmFnZXIuYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4Lmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogKG9uX3NzcmNfc2RlcyksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9zZXNzaW9uX2luaXQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChydHBfc2Vzc2lvbl9jbGFzc19pbml0KSwKKwkgIChvbl9zc3JjX3NkZXMpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19zZGVzKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmg6CisJICBBZGQgc2lnbmFsIHRvIG5vdGlmeSBvZiBhbiBTREVTIGNoYW5nZS4KKwkgIEZpeCBvYmplY3QgdHlwZSBpbiB0aGUgc2lnbmFsIGNhbGxiYWNrcy4KKworMjAwNy0xMi0xMCAxNDowMzozMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLio6IEV4cG9zZSBTREVTIGl0ZW1zIGFzIHByb3BlcnRpZXMgYW5kIGNvbmZpZ3VyZSB0aGUgc2Vzc2lvbiBtYW5hZ2VycyB3aXRoIHRoZW0uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChjcmVhdGVfc2Vzc2lvbiksCisJICAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCksIChnc3RfcnRwX2Jpbl9pbml0KSwgKHNkZXNfdHlwZV90b19uYW1lKSwKKwkgIChnc3RfcnRwX2Jpbl9zZXRfc2Rlc19zdHJpbmcpLCAoZ3N0X3J0cF9iaW5fZ2V0X3NkZXNfc3RyaW5nKSwKKwkgIChnc3RfcnRwX2Jpbl9zZXRfcHJvcGVydHkpLCAoZ3N0X3J0cF9iaW5fZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICBFeHBvc2UgU0RFUyBpdGVtcyBhcyBwcm9wZXJ0aWVzIGFuZCBjb25maWd1cmUgdGhlIHNlc3Npb24gbWFuYWdlcnMgd2l0aAorCSAgdGhlbS4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChydHBfc291cmNlX2NsYXNzX2luaXQpLAorCSAgKHJ0cF9zb3VyY2Vfc2V0X3Byb3BlcnR5KToKKwkgIEZpeCBTU1JDIHByb3BlcnR5LgorCisyMDA3LTEyLTEwIDExOjA4OjExICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci86IFVwZGF0ZSBjb21tZW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoY3JlYXRlX3Nlc3Npb24pOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzoKKwkgIFVwZGF0ZSBjb21tZW50LgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX3NldF9wcm9wZXJ0eSksIChnc3RfcnRwX3Nlc3Npb25fZ2V0X3Byb3BlcnR5KToKKwkgIERlZmluZSBzb21lIEdPYmplY3QgcHJvcGVydGllcyB0byBzZXQgU0RFUyBhbmQgb3RoZXIgY29uZmlndXJhdGlvbi4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAocnRwX3Nlc3Npb25fY2xhc3NfaW5pdCksCisJICAocnRwX3Nlc3Npb25faW5pdCksIChydHBfc2Vzc2lvbl9maW5hbGl6ZSksCisJICAocnRwX3Nlc3Npb25fc2V0X3Byb3BlcnR5KSwgKHJ0cF9zZXNzaW9uX2dldF9wcm9wZXJ0eSksCisJICAob25fc3NyY19zZGVzKSwgKHJ0cF9zZXNzaW9uX3NldF9iYW5kd2lkdGgpLAorCSAgKHJ0cF9zZXNzaW9uX2dldF9iYW5kd2lkdGgpLCAocnRwX3Nlc3Npb25fc2V0X3J0Y3BfZnJhY3Rpb24pLAorCSAgKHJ0cF9zZXNzaW9uX2dldF9ydGNwX2ZyYWN0aW9uKSwgKHJ0cF9zZXNzaW9uX3NldF9zZGVzX3N0cmluZyksCisJICAocnRwX3Nlc3Npb25fZ2V0X3NkZXNfc3RyaW5nKSwgKG9idGFpbl9zb3VyY2UpLAorCSAgKHJ0cF9zZXNzaW9uX2dldF9pbnRlcm5hbF9zb3VyY2UpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19zZGVzKSwKKwkgIChydHBfc2Vzc2lvbl9zZW5kX3J0cCksIChydHBfc2Vzc2lvbl9uZXh0X3RpbWVvdXQpLCAoc2Vzc2lvbl9zZGVzKSwKKwkgIChpc19ydGNwX3RpbWUpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBBZGQgc2lnbmFsIHdoZW4gbmV3IFNERVMgaW5mb3IgaGFzIGJlZW4gZm91bmQgZm9yIGEgc291cmNlLgorCSAgQ3JlYXRlIHByb3BlcnRpZXMgZm9yIFNERVMgYW5kIG90aGVyIGluZm8uCisJICBTaW1wbGlmeSB0aGUgU0RFUyBBUEkuCisJICBBZGQgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBpbnRlcm5hbCBzb3VyY2Ugb2JqZWN0IG9mIHRoZSBzZXNzaW9uLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzogKHJ0cF9zb3VyY2VfY2xhc3NfaW5pdCksCisJICAocnRwX3NvdXJjZV9maW5hbGl6ZSksIChydHBfc291cmNlX3NldF9wcm9wZXJ0eSksCisJICAocnRwX3NvdXJjZV9nZXRfcHJvcGVydHkpLCAocnRwX3NvdXJjZV9zZXRfY2FsbGJhY2tzKSwKKwkgIChydHBfc291cmNlX2dldF9zc3JjKSwgKHJ0cF9zb3VyY2Vfc2V0X2FzX2NzcmMpLAorCSAgKHJ0cF9zb3VyY2VfaXNfYXNfY3NyYyksIChydHBfc291cmNlX2lzX2FjdGl2ZSksCisJICAocnRwX3NvdXJjZV9pc192YWxpZGF0ZWQpLCAocnRwX3NvdXJjZV9pc19zZW5kZXIpLAorCSAgKHJ0cF9zb3VyY2VfcmVjZWl2ZWRfYnllKSwgKHJ0cF9zb3VyY2VfZ2V0X2J5ZV9yZWFzb24pLAorCSAgKHJ0cF9zb3VyY2Vfc2V0X3NkZXMpLCAocnRwX3NvdXJjZV9zZXRfc2Rlc19zdHJpbmcpLAorCSAgKHJ0cF9zb3VyY2VfZ2V0X3NkZXMpLCAocnRwX3NvdXJjZV9nZXRfc2Rlc19zdHJpbmcpLAorCSAgKHJ0cF9zb3VyY2VfZ2V0X25ld19zciksIChydHBfc291cmNlX2dldF9uZXdfcmIpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgIEFkZCBHT2JqZWN0IHByb3BlcnRpZXMgZm9yIHZhcmlvdXMgdGhpbmdzLgorCSAgRG9uJ3QgbGVhayB0aGUgYnllIHJlYXNvbi4KKworMjAwNy0xMS0yMiAwOTowODoyNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IGppdHRlcmJ1ZmZlciBjYW4gYnVmZmVyIGFuIHVubGltaXRlZCBhbW91bnQgb2YgdGltZSBhbmQgdGh1cyBoYXMgbm8gbWF4X2xhdGVuY3kgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3F1ZXJ5KToKKwkgIGppdHRlcmJ1ZmZlciBjYW4gYnVmZmVyIGFuIHVubGltaXRlZCBhbW91bnQgb2YgdGltZSBhbmQgdGh1cyBoYXMgbm8KKwkgIG1heF9sYXRlbmN5IHJlcXVpcmVtZW50cy4KKworMjAwNy0xMS0wMiAyMTo0NTozOCArMDAwMCAgT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiBGaXggYmFkIGZ1bmN0aW9uIHNpZ25hdHVyZXMgKCM0OTI3OTgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzICA8b2xlLmFuZHJlLnJhdm5hc0B0YW5kYmVyZy5jb20+CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIEZpeCBiYWQgZnVuY3Rpb24gc2lnbmF0dXJlcyAoIzQ5Mjc5OCkuCisKKzIwMDctMTAtMDkgMTA6MDE6MzkgKzAwMDAgIExhdXJlbnQgR2xheWFsIDxzcGdsZWdsZUB5YWhvby5mcj4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IEZpeCBtZW1sZWFrLiBGaXhlcyAjNDg0OTkwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTGF1cmVudCBHbGF5YWwgPHNwZ2xlZ2xlIGF0IHlhaG9vIGRvdCBmcj4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChjcmVhdGVfc3RyZWFtKSwKKwkgIChnc3RfcnRwX2Jpbl9jbGFzc19pbml0KToKKwkgIEZpeCBtZW1sZWFrLiBGaXhlcyAjNDg0OTkwLgorCisyMDA3LTEwLTA4IDE3OjQ2OjQ1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0LzogRml4IGNvbXBpbGVyIHdhcm5pbmdzIHNob3duIGJ5IEZvcnRlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9saWJyZmIvcmZiYnVmZmVyLmM6IChyZmJfYnVmZmVyX25ld19hbmRfYWxsb2MpOgorCSAgKiBnc3QvbGlicmZiL3JmYmJ1ZmZlci5oOgorCSAgKiBnc3QvbGlicmZiL3JmYmRlY29kZXIuYzogKHJmYl9zb2NrZXRfZ2V0X2J1ZmZlcik6CisJICAqIGdzdC9tcGVndmlkZW9wYXJzZS9tcGVndmlkZW9wYXJzZS5jOiAoZ3N0X21wZWd2aWRlb3BhcnNlX2NoYWluKToKKwkgICogZ3N0L25zZi9uZXM2NTAyLmM6IChuZXM2NTAyX2V4ZWN1dGUpOgorCSAgKiBnc3QvcmVhbC9nc3RyZWFsYXVkaW9kZWMuYzogKGdzdF9yZWFsX2F1ZGlvX2RlY19zZXRjYXBzKToKKwkgICogZ3N0L3JlYWwvZ3N0cmVhbHZpZGVvZGVjLmM6IChvcGVuX2xpYnJhcnkpOgorCSAgKiBnc3QvcmVhbC9nc3RyZWFsdmlkZW9kZWMuaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoY3JlYXRlX3JlY3ZfcnRwX3NpbmspLAorCSAgKGNyZWF0ZV9yZWN2X3J0Y3Bfc2luayksIChjcmVhdGVfc2VuZF9ydHBfc2luayk6CisJICBGaXggY29tcGlsZXIgd2FybmluZ3Mgc2hvd24gYnkgRm9ydGUuCisKKzIwMDctMTAtMDggMTA6Mzk6MzUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiBGaXggY2FwcyByZWZjb3VudGluZyBmb3IgcGF5bG9hZCBtYXBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoZ2V0X3B0X21hcCksCisJICAoZ3N0X3J0cF9iaW5fY2xlYXJfcHRfbWFwKSwgKGdzdF9ydHBfYmluX2NsYXNzX2luaXQpOgorCSAgRml4IGNhcHMgcmVmY291bnRpbmcgZm9yIHBheWxvYWQgbWFwcy4KKwkgIFdoZW4gY2xlYXJpbmcgcGF5bG9hZCBtYXBzLCBhbHNvIGNsZWFyIHNlc3Npb25zIGFuZCBzdHJlYW1zIHBheWxvYWQKKwkgIG1hcHMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzogKGdzdF9ydHBfcHRfZGVtdXhfZ2V0X2NhcHMpLAorCSAgKGdzdF9ydHBfcHRfZGVtdXhfY2xlYXJfcHRfbWFwKSwgKGdzdF9ydHBfcHRfZGVtdXhfY2hhaW4pLAorCSAgKGZpbmRfcGFkX2Zvcl9wdCk6CisJICBJbXBsZW1lbnQgY2xlYXJpbmcgdGhlIHBheWxvYWQgbWFwLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRwX3NpbmspOgorCSAgRm9yd2FyZCBmbHVzaCBldmVudHMgaW5zdGVhZCBvZiBsZWFraW5nIHRoZW0uCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgKGdzdF9ydHBfc3NyY19kZW11eF9ydGNwX3NpbmtfZXZlbnQpOgorCSAgQ29ycmVjdGx5IHJlZmNvdW50IGV2ZW50cyBiZWZvcmUgcHVzaGluZyB0aGVtLgorCisyMDA3LTEwLTA1IDE3OjI2OjE0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IFdoZW4gcmVjb25zaWRlcmluZyBSVENQIHRpbWVvdXRzLCBzZXQgdGhlIG5leHQgdGltZW91dCBhZ2FpbnN0IHRoZSBsYXN0IHJlcG9ydCB0aW1lIGluc3QuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChydHBfc2Vzc2lvbl9uZXh0X3RpbWVvdXQpLAorCSAgV2hlbiByZWNvbnNpZGVyaW5nIFJUQ1AgdGltZW91dHMsIHNldCB0aGUgbmV4dCB0aW1lb3V0IGFnYWluc3QgdGhlIGxhc3QKKwkgIHJlcG9ydCB0aW1lIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgY2xvY2sgdGltZSBzbyB0aGF0IHdlIGRvbid0IGVuZCB1cAorCSAgcmVjb25zaWRlcmluZyBmb3JldmVyLgorCisyMDA3LTEwLTA1IDEyOjA3OjM3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogT25seSBwZWVrIGF0IHRoZSB0YWlsIGVsZW1lbnQgaW5zdGVhZCBvZiBwb3BwaW5nIGl0IG9mZiwgd2hpY2ggYWxsb3dzIHVzIHRvIGdyZWEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApOgorCSAgT25seSBwZWVrIGF0IHRoZSB0YWlsIGVsZW1lbnQgaW5zdGVhZCBvZiBwb3BwaW5nIGl0IG9mZiwgd2hpY2ggYWxsb3dzCisJICB1cyB0byBncmVhdGx5IHNpbXBsaWZ5IHRoaW5ncyB3aGVuIHRoZSB0YWlsIGVsZW1lbnQgY2hhbmdlcy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgKGdzdF9ydHBfc2Vzc2lvbl9ldmVudF9yZWN2X3J0cF9zaW5rKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X3NpbmtfZXZlbnQpOgorCSAgRm9yd2FyZCBGTFVTSCBldmVudHMgaW5zdGVhZCBvZiBsZWFraW5nIHRoZW0uCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOiAocnRwX2ppdHRlcl9idWZmZXJfcmVzZXRfc2tldyksCisJICAoY2FsY3VsYXRlX3NrZXcpLCAocnRwX2ppdHRlcl9idWZmZXJfaW5zZXJ0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBSZW1vdmUgdGhlIHRhaWwtY2hhbmdlZCBjYWxsYmFjayBpbiBmYXZvdXIgb2YgYSBzaW1wbGUgYm9vbGVhbiB3aGVuIHdlCisJICBpbnNlcnQgYSBidWZmZXIgaW4gdGhlIHF1ZXVlLgorCSAgQWRkIG1ldGhvZCB0byBwZWVrIHRoZSB0YWlsIG9mIHRoZSBidWZmZXIuCisKKzIwMDctMTAtMDIgMTA6Mjc6NDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiBSZW1vdmUgc29tZSBvbGQgdW51c2VkIHZhcmlhYmxlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZmx1c2hfc3RhcnQpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9mbHVzaF9zdG9wKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhbmdlX3N0YXRlKSwgKGFwcGx5X29mZnNldCksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApOgorCSAgUmVtb3ZlIHNvbWUgb2xkIHVudXNlZCB2YXJpYWJsZXMuCisJICBEb24ndCBhZGQgdGhlIGxhdGVuY3kgdG8gdGhlIHNrZXcgY29ycmVjdGVkIHRpbWVzdGFtcCwgbGF0ZW5jeSBpcyBvbmx5CisJICB1c2VkIHRvIHN5bmMgYWdhaW5zdCB0aGUgY2xvY2suCisJICBJbXByb3ZlIGRlYnVnZ2luZy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChydHBfaml0dGVyX2J1ZmZlcl9pbml0KSwKKwkgIChydHBfaml0dGVyX2J1ZmZlcl9yZXNldF9za2V3KSwgKGNhbGN1bGF0ZV9za2V3KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBIYW5kbGUgY2FzZSB3aGVyZSBzZXJ2ZXIgdGltZXN0YW1wIGdvZXMgYmFja3dhcmRzIG9yIHdpbGRseSBqdW1wcyBieQorCSAgdGVtcG9yYXJpbHkgcGF1c2luZyB0aGUgc2tldyBjb3JyZWN0aW9uLgorCSAgSW1wcm92ZSBkZWJ1Z2dpbmcuCisKKzIwMDctMDktMjggMTQ6NTE6NTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiBGaXggY3Jhc2hlciBpbiBkaXNwb3NlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoZnJlZV9jbGllbnQpOgorCSAgRml4IGNyYXNoZXIgaW4gZGlzcG9zZS4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChjYWxjdWxhdGVfc2tldyk6CisJICBIYW5kbGUgY2FzZXMgd2hlcmUgaW5wdXQgYnVmZmVycyBoYXZlIG5vIHRpbWVzdGFtcHMgc28gdGhhdCBubyBjbG9jaworCSAgc2tldyBjYW4gYmUgY2FsY3VsYXRlZCwgaW4gdGhpcyBjYXNlIGludGVycG9sbGF0ZSB0aW1lc3RhbXBzIGJhc2VkIG9uCisJICBydHAgdGltZXN0YW1wIGFuZCBhc3N1bWUgYSAwIGNsb2NrIHNrZXcuCisKKzIwMDctMDktMjggMTE6MTc6MzUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiBSZW1vdmUgaml0dGVyIGNvcnJlY3Rpb24gY29kZSwgaXQncyBub3cgaW4gdGhlIGxvd2VyIGxldmVsIG9iamVjdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogKGFwcGx5X2xhdGVuY3kpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9xdWVyeSk6CisJICBSZW1vdmUgaml0dGVyIGNvcnJlY3Rpb24gY29kZSwgaXQncyBub3cgaW4gdGhlIGxvd2VyIGxldmVsIG9iamVjdC4KKwkgIFVzZSBuZXcgLWNvcmUgbWV0aG9kIGZvciBkb2luZyBhIHBlZXIgcXVlcnkuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jOiAocnRwX2ppdHRlcl9idWZmZXJfaW5pdCksCisJICAoY2FsY3VsYXRlX3NrZXcpLCAocnRwX2ppdHRlcl9idWZmZXJfaW5zZXJ0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBNb3ZlIGppdHRlciBjb3JyZWN0aW9uIHRvIHRoZSBsb3dsZXZlbCBqaXR0ZXJidWZmZXIuCisJICBJbmNyZWFzZSB0aGUgbWF4IHdpbmRvdyBzaXplLgorCSAgV2hlbiBmaWxsaW5nIHRoZSB3aW5kb3csIGFscmVhZHkgc3RhcnQgZXN0aW1hdGluZyB0aGUgc2tldyB1c2luZyBhCisJICBwYXJhYm9saWMgd2VpZ2h0aW5nIGZhY3RvciBzbyB0aGF0IHdlIGhhdmUgYSBtdWNoIGJldHRlciBzdGFydHVwCisJICBiZWhhdmlvdXIgdGhhdCBnZXRzIG1vcmUgYWNjdXJhdGUgd2l0aCB0aGUgbW9yZSBzYW1wbGVzIHdlIGhhdmUuCisJICBJbmNyZWFzZSB0aGUgZGVmYXVsdCB3ZWlnaHRpbmcgZmFjdG9yIGZvciB0aGUgc3RlYWR5IHN0YXRlIHRvIGdldAorCSAgc21vb3RoZXIgdGltZXN0YW1wcy4KKworMjAwNy0wOS0yNiAyMDowODoyOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IEZpeCBjbGVhbnVwIGNyYXNoZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnc3RfcnRwX2Jpbl9kaXNwb3NlKSwKKwkgIChnc3RfcnRwX2Jpbl9maW5hbGl6ZSk6CisJICBGaXggY2xlYW51cCBjcmFzaGVyLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzogKHJ0cF9qaXR0ZXJfYnVmZmVyX2luaXQpLAorCSAgKGNhbGN1bGF0ZV9za2V3KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmg6CisJICBEeW5hbWljYWxseSBhZGp1c3QgdGhlIHNrZXcgY2FsY3VsYXRpb24gd2luZG93IHNvIHRoYXQgd2UgY2FsY3VsYXRlIGl0CisJICBvdmVyIGEgcGVyaW9kIG9mIGFyb3VuZCAyIHNlY29uZHMuCisKKzIwMDctMDktMjAgMTQ6MzQ6NTcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyLzogQWRkIG5vdGlmaWNhdGlvbiBvZiBhY3RpdmUgU1NSQ3MgdG8gdmFyaW91cyBSVFAgZWxlbWVudHMuIEZpeGVzICM0Nzg1NjYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChvbl9zc3JjX2FjdGl2ZSksIChjcmVhdGVfc2Vzc2lvbiksCisJICAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChvbl9zc3JjX2FjdGl2ZSksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9zZXNzaW9uX2luaXQpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9ldmVudF9zZW5kX3J0cF9zaW5rKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChydHBfc2Vzc2lvbl9jbGFzc19pbml0KSwKKwkgIChvbl9zc3JjX2FjdGl2ZSksIChydHBfc2Vzc2lvbl9wcm9jZXNzX3JiKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgQWRkIG5vdGlmaWNhdGlvbiBvZiBhY3RpdmUgU1NSQ3MgdG8gdmFyaW91cyBSVFAgZWxlbWVudHMuIEZpeGVzICM0Nzg1NjYuCisKKzIwMDctMDktMTcgMDI6MDE6NDEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiBMaW5rIHRvIHRoZSByaWdodCBwYWRzIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggb25lIHdhcyBjcmVhdGVkIGZpcnN0IGluIHRoZSBzc3JjIGRlbXV4ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChuZXdfc3NyY19wYWRfZm91bmQpOgorCSAgTGluayB0byB0aGUgcmlnaHQgcGFkcyByZWdhcmRsZXNzIG9mIHdoaWNoIG9uZSB3YXMgY3JlYXRlZCBmaXJzdCBpbiB0aGUKKwkgIHNzcmMgZGVtdXhlci4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYWluKSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoZ3N0X3J0cF9zZXNzaW9uX3Byb2Nlc3NfcnRwKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fY2hhaW5fcmVjdl9ydHApLCAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3NlbmRfcnRwKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChjYWxjdWxhdGVfaml0dGVyKToKKwkgIEltcHJvdmUgZGVidWdnaW5nLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzogKGNyZWF0ZV9kZW11eF9wYWRfZm9yX3NzcmMpLAorCSAgKGdzdF9ydHBfc3NyY19kZW11eF9pbml0KSwgKGdzdF9ydHBfc3NyY19kZW11eF9maW5hbGl6ZSksCisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X3NpbmtfZXZlbnQpLAorCSAgKGdzdF9ydHBfc3NyY19kZW11eF9ydGNwX3NpbmtfZXZlbnQpLCAoZ3N0X3J0cF9zc3JjX2RlbXV4X2NoYWluKSwKKwkgIChnc3RfcnRwX3NzcmNfZGVtdXhfcnRjcF9jaGFpbiksCisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X2ludGVybmFsX2xpbmtzKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4Lmg6CisJICBGaXggcmFjZSBpbiBjcmVhdGluZyB0aGUgUlRQIGFuZCBSVENQIHBhZHMgd2hlbiBhIG5ldyBTU1JDIGlzIGRldGVjdGVkLgorCisyMDA3LTA5LTE2IDE5OjQwOjMxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogVXNlIGxvY2sgdG8gcHJvdGVjdCB2YXJpYWJsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdzdF9ydHBfYmluX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9iaW5fZ2V0X3Byb3BlcnR5KToKKwkgIFVzZSBsb2NrIHRvIHByb3RlY3QgdmFyaWFibGUuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jbGFzc19pbml0KSwKKwkgIChnc3Rfaml0dGVyX2J1ZmZlcl9zaW5rX3BhcnNlX2NhcHMpLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYWluKSwKKwkgIChjb252ZXJ0X3J0cHRpbWVfdG9fZ3N0dGltZSksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCk6CisJICBSZWNvbnN0cnVjdCBHU1QgdGltZXN0YW1wIGZyb20gUlRQIHRpbWVzdGFtcHMgYmFzZWQgb24gbWVhc3VyZWQgY2xvY2sKKwkgIHNrZXcgYW5kIHN5bmMgb2Zmc2V0LgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzogKHJ0cF9qaXR0ZXJfYnVmZmVyX2luaXQpLAorCSAgKHJ0cF9qaXR0ZXJfYnVmZmVyX3NldF90YWlsX2NoYW5nZWQpLAorCSAgKHJ0cF9qaXR0ZXJfYnVmZmVyX3NldF9jbG9ja19yYXRlKSwKKwkgIChydHBfaml0dGVyX2J1ZmZlcl9nZXRfY2xvY2tfcmF0ZSksIChjYWxjdWxhdGVfc2tldyksCisJICAocnRwX2ppdHRlcl9idWZmZXJfaW5zZXJ0KSwgKHJ0cF9qaXR0ZXJfYnVmZmVyX3BlZWspOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkgIE1lYXN1cmUgY2xvY2sgc2tldy4KKwkgIEFkZCBjYWxsYmFjayB0byBiZSBub3RmaWVkIHdoZW4gYSBuZXcgcGFja2V0IHdhcyBpbnNlcnRlZCBhdCB0aGUgdGFpbC4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChydHBfc291cmNlX2luaXQpLAorCSAgKGNhbGN1bGF0ZV9qaXR0ZXIpLCAocnRwX3NvdXJjZV9zZW5kX3J0cCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSAgUmVtb3ZlIGNsb2NrIHNrZXcgZGV0ZWN0aW9uLCBpdCdzIG1vdmUgdG8gdGhlIGppdHRlcmJ1ZmZlciBub3cuCisKKzIwMDctMDktMTUgMTg6NDg6MDMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiBBbHNvIHNldCBOVFAgYmFzZSB0aW1lIG9uIG5ldyBzZXNzaW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGNyZWF0ZV9zZXNzaW9uKToKKwkgIEFsc28gc2V0IE5UUCBiYXNlIHRpbWUgb24gbmV3IHNlc3Npb25zLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfcXVlcnkpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9nZXRfcHJvcGVydHkpOgorCSAgVXNlIHRoZSByaWdodCBsb2NrIHRvIHByb3RlY3Qgb3VyIHZhcmlhYmxlcy4KKwkgIEZpeCBzb21lIGNvbW1lbnQuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzoKKwkgIChnc3RfcnRwX3Nlc3Npb25fZ2V0Y2Fwc19zZW5kX3J0cCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3NlbmRfcnRwKSwgKGNyZWF0ZV9zZW5kX3J0cF9zaW5rKToKKwkgIEltcGxlbWVudCBnZXRjYXBzIG9uIHRoZSBzZW5kZXIgc2lua3BhZCBzbyB0aGF0IHBheWxvYWRlcnMgY2FuIG5lZ290aWF0ZQorCSAgdGhlIHJpZ2h0IFNTUkMuCisKKzIwMDctMDktMTIgMjE6MjM6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyLzogVmFyaW91cyBsZWFrIGZpeGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoY3JlYXRlX3Nlc3Npb24pLCAoZnJlZV9zZXNzaW9uKSwKKwkgIChnZXRfY2xpZW50KSwgKGZyZWVfY2xpZW50KSwgKGdzdF9ydHBfYmluX2Fzc29jaWF0ZSksCisJICAoZnJlZV9zdHJlYW0pLCAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCksIChnc3RfcnRwX2Jpbl9kaXNwb3NlKSwKKwkgIChnc3RfcnRwX2Jpbl9maW5hbGl6ZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZmluYWxpemUpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6IChnc3RfcnRwX3B0X2RlbXV4X3JlbGVhc2UpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fZmluYWxpemUpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9zZXRfcHJvcGVydHkpLCAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3JlY3ZfcnRwKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fY2hhaW5fc2VuZF9ydHApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIChnc3RfcnRwX3NzcmNfZGVtdXhfY2xhc3NfaW5pdCksIChnc3RfcnRwX3NzcmNfZGVtdXhfZGlzcG9zZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX2ZpbmFsaXplKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgVmFyaW91cyBsZWFrIGZpeGVzLgorCisyMDA3LTA5LTEyIDE4OjA0OjMyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogQ2FsY3VsYXRlIGFuZCBjb25maWd1cmUgdGhlIE5UUCBiYXNlIHRpbWUgc28gdGhhdCB3ZSBjYW4gZ2VuZXJhdGUgYmV0dGVyCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChjYWxjX250cF9uc19iYXNlKSwKKwkgIChnc3RfcnRwX2Jpbl9jaGFuZ2Vfc3RhdGUpLCAobmV3X3BheWxvYWRfZm91bmQpLCAoY3JlYXRlX3NlbmRfcnRwKToKKwkgIENhbGN1bGF0ZSBhbmQgY29uZmlndXJlIHRoZSBOVFAgYmFzZSB0aW1lIHNvIHRoYXQgd2UgY2FuIGdlbmVyYXRlIGJldHRlcgorCSAgTlRQIHRpbWVzIGluIFNSIHBhY2tldHMuCisJICBTZXQgY2FwcyBvbiBuZXcgZ2hvc3RwYWQuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKToKKwkgIENsZWFuIGRlYnVnIHN0YXRlbWVudC4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoZ3N0X3J0cF9zZXNzaW9uX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9pbml0KSwgKGdzdF9ydHBfc2Vzc2lvbl9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9nZXRfcHJvcGVydHkpLCAoZ2V0X2N1cnJlbnRfbnRwX25zX3RpbWUpLAorCSAgKHJ0Y3BfdGhyZWFkKSwgKGdzdF9ydHBfc2Vzc2lvbl9ldmVudF9yZWN2X3J0cF9zaW5rKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25faW50ZXJuYWxfbGlua3MpLCAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3JlY3ZfcnRwKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fZXZlbnRfc2VuZF9ydHBfc2luayksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3NlbmRfcnRwKSwgKGNyZWF0ZV9yZWN2X3J0cF9zaW5rKSwKKwkgIChjcmVhdGVfc2VuZF9ydHBfc2luayk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uaDoKKwkgIEFkZCBudHAtbnMtYmFzZSBwcm9wZXJ0eSB0byBjb252ZXJ0IHJ1bm5pbmdfdGltZSB0byBOVFAgdGltZS4KKwkgIEhhbmRsZSBORVdTRUdNRU5UIGV2ZW50cyBvbiBzZW5kIGFuZCByZWN2IFJUUCBwYWRzIHNvIHRoYXQgd2UgY2FuCisJICBjYWxjdWxhdGUgdGhlIHJ1bm5pbmcgdGltZSBhbmQgdGh1cyBOVFAgdGltZSBvZiB0aGUgcGFja2V0cy4KKwkgIFNpbXBsaWZ5IGdldHRpbmcgdGhlIGN1cnJlbnQgTlRQIHRpbWUgdXNpbmcgdGhlIHBpcGVsaW5lIGNsb2NrLgorCSAgSW1wbGVtZW50IGludGVybmFsIGxpbmtzIGZ1bmN0aW9ucy4KKwkgIFVzZSB0aGUgYnVmZmVyIHRpbWVzdGFtcCB0byBjYWxjdWxhdGUgdGhlIE5UUCB0aW1lIGluc3RlYWQgb2YgdGhlIGNsb2NrLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzogKGNyZWF0ZV9kZW11eF9wYWRfZm9yX3NzcmMpLAorCSAgKGdzdF9ydHBfc3NyY19kZW11eF9pbml0KSwgKGdzdF9ydHBfc3NyY19kZW11eF9zaW5rX2V2ZW50KSwKKwkgIChnc3RfcnRwX3NzcmNfZGVtdXhfY2hhaW4pLCAoZ3N0X3J0cF9zc3JjX2RlbXV4X3J0Y3BfY2hhaW4pLAorCSAgKGdzdF9ydHBfc3NyY19kZW11eF9pbnRlcm5hbF9saW5rcyksCisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X3NyY19xdWVyeSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5oOgorCSAgSW1wbGVtZW50IGludGVybmFsIGxpbmtzIGZ1bmN0aW9uLgorCSAgQ2FsY3VsYXRlIHRoZSBkaWZmIGJldHdlZW4gZGlmZmVyZW50IHN0cmVhbXMsIHRoaXMgbWlnaHQgYmUgdXNlZCBsYXRlcgorCSAgdG8gZ2V0IHRoZSBpbnRlciBzdHJlYW0gbGF0ZW5jeS4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAocnRwX3Nlc3Npb25fc2VuZF9ydHApOgorCSAgU2ltcGxlIGNsZWFudXAuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAocnRwX3NvdXJjZV9pbml0KSwKKwkgIChjYWxjdWxhdGVfaml0dGVyKSwgKHJ0cF9zb3VyY2Vfc2VuZF9ydHApLCAocnRwX3NvdXJjZV9nZXRfbmV3X3NyKToKKwkgIE1ha2UgdGhlIGNsb2NrIHNrZXcgd2luZG93IGEgbGl0dGxlIGJpZ2dlci4KKwkgIEFwcGx5IHRoZSBjbG9jayBza2V3IHRvIGFsbCBidWZmZXJzLCBub3QganVzdCBvbmUgd2l0aCBhIG5ldyB0aW1lc3RhbXAuCisJICBDYWxjdWxhdGUgYW5kIGRlYnVnIHNlbmRlciBjbG9jayBkcmlmdC4KKwkgIFVzZSBleHRlbmRlZCBsYXN0IHRpbWVzdGFtcCB0byBpbnRlcnBvbGxhdGUgZm9yIFNSIHJlcG9ydHMuCisKKzIwMDctMDktMDQgMTU6MjM6MzQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogTWFrZSBjb21waWxlciBoYXBweTogZml4IGNvbXBpbGF0aW9uIHdpdGggLVdhbGwgLVdlcnJvciAoIzQ3MzU2MikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOgorCSAgTWFrZSBjb21waWxlciBoYXBweTogZml4IGNvbXBpbGF0aW9uIHdpdGggLVdhbGwgLVdlcnJvcgorCSAgKCM0NzM1NjIpLgorCisyMDA3LTA5LTAzIDIxOjE5OjM0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci86IFVwZGF0ZWQgZXhhbXBsZSBwaXBlbGluZXMgaW4gZG9jcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4tbWFyc2hhbC5saXN0OgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdzdF9ydHBfYmluX2dldF9jbGllbnQpLAorCSAgKGdzdF9ydHBfYmluX2Fzc29jaWF0ZSksIChnc3RfcnRwX2Jpbl9zeW5jX2NoYWluKSwgKGNyZWF0ZV9zdHJlYW0pLAorCSAgKGdzdF9ydHBfYmluX2luaXQpLCAoY2Fwc19jaGFuZ2VkKSwgKG5ld19zc3JjX3BhZF9mb3VuZCksCisJICAoY3JlYXRlX3JlY3ZfcnRwKSwgKGNyZWF0ZV9yZWN2X3J0Y3ApLCAoY3JlYXRlX3NlbmRfcnRwKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICBVcGRhdGVkIGV4YW1wbGUgcGlwZWxpbmVzIGluIGRvY3MuCisJICBIYW5kbGUgc3luY19ydGNwIGJ1ZmZlcnMgZnJvbSB0aGUgU1NSQyBkZW11eGVyIHRvIHBlcmZvcm0gbGlwLXN5bmMuCisJICBTZXQgdGhlIGRlZmF1bHQgbGF0ZW5jeSBjb3JyZWN0bHkuCisJICBBZGQgc29tZSBtb3JlIHBvaW50cyB3aGVyZSB3ZSBjYW4gZ2V0IGNhcHMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jbGFzc19pbml0KSwKKwkgIChnc3Rfaml0dGVyX2J1ZmZlcl9zaW5rX3BhcnNlX2NhcHMpLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9xdWVyeSksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2dldF9wcm9wZXJ0eSk6CisJICBBZGQgdHMtb2Zmc2V0IHByb3BlcnR5IHRvIGNvbnRyb2wgdGltZXN0YW1waW5nLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2luaXQpLCAoZ3N0X3J0cF9zZXNzaW9uX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2dldF9wcm9wZXJ0eSksIChnZXRfY3VycmVudF9udHBfbnNfdGltZSksCisJICAocnRjcF90aHJlYWQpLCAoc3RvcF9ydGNwX3RocmVhZCksIChnc3RfcnRwX3Nlc3Npb25fY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fc2VuZF9ydGNwKSwgKGdzdF9ydHBfc2Vzc2lvbl9zeW5jX3J0Y3ApLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9jYWNoZV9jYXBzKSwgKGdzdF9ydHBfc2Vzc2lvbl9jbG9ja19yYXRlKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fc2lua19zZXRjYXBzKSwgKGdzdF9ydHBfc2Vzc2lvbl9jaGFpbl9yZWN2X3J0cCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRwX3NpbmspLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9jaGFpbl9zZW5kX3J0cCksIChjcmVhdGVfcmVjdl9ydHBfc2luayksCisJICAoY3JlYXRlX3JlY3ZfcnRjcF9zaW5rKSwgKGNyZWF0ZV9zZW5kX3J0cF9zaW5rKSwKKwkgIChjcmVhdGVfc2VuZF9ydGNwX3NyYyk6CisJICBWYXJpb3VzIGNsZWFudXBzLgorCSAgRmVlZCBydHBzZXNzaW9uIG1hbmFnZXIgd2l0aCBOVFAgdGltZSBiYXNlZCBvbiBwaXBlbGluZSBjbG9jayB3aGVuCisJICBoYW5kbGluZyBSVFAgcGFja2V0cyBhbmQgUlRDUCB0aW1lb3V0cy4KKwkgIFBlcmZvcm0gYWxsIFJUQ1Agd2l0aCB0aGUgc3lzdGVtIGNsb2NrLgorCSAgU2V0IGNhcHMgb24gUlRDUCBvdXRnb2luZyBidWZmZXJzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzogKGZpbmRfZGVtdXhfcGFkX2Zvcl9zc3JjKSwKKwkgIChjcmVhdGVfZGVtdXhfcGFkX2Zvcl9zc3JjKSwgKGdzdF9ydHBfc3NyY19kZW11eF9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfc3NyY19kZW11eF9pbml0KSwgKGdzdF9ydHBfc3NyY19kZW11eF9zaW5rX2V2ZW50KSwKKwkgIChnc3RfcnRwX3NzcmNfZGVtdXhfcnRjcF9zaW5rX2V2ZW50KSwgKGdzdF9ydHBfc3NyY19kZW11eF9jaGFpbiksCisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X3J0Y3BfY2hhaW4pOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguaDoKKwkgIEFsc28gZGVtdXggUlRDUCBtZXNzYWdlcy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAocnRwX3Nlc3Npb25fc2V0X2NhbGxiYWNrcyksCisJICAodXBkYXRlX2Fycml2YWxfc3RhdHMpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19ydHApLAorCSAgKHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcmIpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19zciksCisJICAocnRwX3Nlc3Npb25fcHJvY2Vzc19yciksIChydHBfc2Vzc2lvbl9wcm9jZXNzX3J0Y3ApLAorCSAgKHJ0cF9zZXNzaW9uX3NlbmRfcnRwKSwgKHJ0cF9zZXNzaW9uX3NlbmRfYnllKSwKKwkgIChzZXNzaW9uX3N0YXJ0X3J0Y3ApLCAoc2Vzc2lvbl9yZXBvcnRfYmxvY2tzKSwgKHNlc3Npb25fY2xlYW51cCksCisJICAocnRwX3Nlc3Npb25fb25fdGltZW91dCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaDoKKwkgIFJlbW92ZSB0aGUgZ2V0X3RpbWUgY2FsbGJhY2ssIHRoZSBHU3RyZWFtZXIgcGFydCB3aWxsIGZlZWQgdXMgd2l0aAorCSAgZW5vdWdoIHRpbWluZyBpbmZvcm1hdGlvbi4KKwkgIFNwbGl0IHN5bmMgdGltaW5nIGFuZCBSVENQIHRpbWluZyBpbmZvcm1hdGlvbi4KKwkgIEZhY3RvciBvdXQgY29tbW9uIFJCIGhhbmRsaW5nIGZvciBTUiBhbmQgUlIuCisJICBTZW5kIG91dCBTUiBSVENQIHBhY2tldHMgZm9yIGxpcC1zeW5jLgorCSAgTW92ZSBTUiBhbmQgUlIgcGFja2V0IGluZm8gZ2VuZXJhdGlvbiB0byB0aGUgc291cmNlLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzogKHJ0cF9zb3VyY2VfaW5pdCksCisJICAocnRwX3NvdXJjZV91cGRhdGVfY2FwcyksIChnZXRfY2xvY2tfcmF0ZSksIChjYWxjdWxhdGVfaml0dGVyKSwKKwkgIChydHBfc291cmNlX3Byb2Nlc3NfcnRwKSwgKHJ0cF9zb3VyY2Vfc2VuZF9ydHApLAorCSAgKHJ0cF9zb3VyY2VfcHJvY2Vzc19zciksIChydHBfc291cmNlX3Byb2Nlc3NfcmIpLAorCSAgKHJ0cF9zb3VyY2VfZ2V0X25ld19zciksIChydHBfc291cmNlX2dldF9uZXdfcmIpLAorCSAgKHJ0cF9zb3VyY2VfZ2V0X2xhc3Rfc3IpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIFVzZSBjYXBzIG9uIGluY29tbWluZyBidWZmZXJzIHRvIGdldCB0aW1pbmcgaW5mb3JtYXRpb24gd2hlbiB0aGV5IGFyZQorCSAgdGhlcmUuCisJICBDYWxjdWxhdGUgY2xvY2sgc2NldyBvZiB0aGUgcmVjZWl2ZXIgY29tcGFyZWQgdG8gdGhlIHNlbmRlciBhbmQgYWRqdXN0CisJICB0aGUgcnRwIHRpbWVzdGFtcHMuCisJICBDYWxjdWxhdGUgdGhlIHJvdW5kIHRyaXAgaW4gc291cmNlcy4KKwkgIERvIFNSIGFuZCBSUiBjYWxjdWxhdGlvbnMgaW4gdGhlIHNvdXJjZS4KKworMjAwNy0wOC0zMSAxNToyNjoxNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IFVzZSBleHRlbmRlZCB0aW1lc3RhbXAgdG8gcmVsZWFzZSBidWZmZXJzIGZyb20gdGhlIGppdHRlcmJ1ZmZlciBzbyB0aGF0IHdlIGNhbiBoLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoX3N0b3ApLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApOgorCSAgVXNlIGV4dGVuZGVkIHRpbWVzdGFtcCB0byByZWxlYXNlIGJ1ZmZlcnMgZnJvbSB0aGUgaml0dGVyYnVmZmVyIHNvIHRoYXQKKwkgIHdlIGNhbiBoYW5kbGUgdGhlIHJ0cCB3cmFwYXJvdW5kIGNvcnJlY3RseS4KKworMjAwNy0wOC0yOSAxNjo1NjoyNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IEltcHJvdmUgQ29tbWVudHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApOgorCSAgSW1wcm92ZSBDb21tZW50cy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoc3RvcF9ydGNwX3RocmVhZCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NoYW5nZV9zdGF0ZSksIChnc3RfcnRwX3Nlc3Npb25fcGFyc2VfY2FwcyksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2Nsb2NrX3JhdGUpLCAoZ3N0X3J0cF9zZXNzaW9uX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRwX3NpbmspLCAoY3JlYXRlX3JlY3ZfcnRwX3NpbmspLAorCSAgKGNyZWF0ZV9zZW5kX3J0cF9zaW5rKToKKwkgIEFsc28gcGFyc2UgdGhlIHNpbmsgY2FwcyBmb3IgY2xvY2stcmF0ZSBpbnN0ZWFkIG9mIG9ubHkgcmVseWluZyBvbiB0aGUKKwkgIHJlc3VsdCBvZiB0aGUgc2lnbmFsLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzogKHJ0cF9zb3VyY2Vfc2VuZF9ydHApOgorCSAgTWFrZSBzdXJlIHdlIGZldGNoIHRoZSBjbG9jayByYXRlIGZvciBwYXlsb2FkcyB3ZSBhcmUgc2VuZGluZyBvdXQgc28KKwkgIHRoYXQgd2UgY2FuIHVzZSBpdCBmb3IgU1IgcmVwb3J0cy4KKworMjAwNy0wOC0yOSAwMToyMjo0MyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi4qOiBEaXN0cmlidXRlIHN5bmNocm9uaXNhdGlvbiBwYXJhbWV0ZXJzIHRvIHRoZSBzZXNzaW9uIG1hbmFnZXIgc28gdGhhdCBpdCBjYW4gZ2VuZXJhdGUgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoc3RvcF9ydGNwX3RocmVhZCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRwX3NpbmspOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmg6CisJICBEaXN0cmlidXRlIHN5bmNocm9uaXNhdGlvbiBwYXJhbWV0ZXJzIHRvIHRoZSBzZXNzaW9uIG1hbmFnZXIgc28gdGhhdCBpdAorCSAgY2FuIGdlbmVyYXRlIGNvcnJlY3QgU1IgcGFja2V0cyBmb3IgbGlwLXN5bmMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX3NldF9iYXNlX3RpbWUpLAorCSAgKHJ0cF9zZXNzaW9uX3NldF90aW1lc3RhbXBfc3luYyksIChzZXNzaW9uX3N0YXJ0X3J0Y3ApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBBZGQgbWV0aG9kcyBmb3Igc2V0dGluZyBzeW5jIHBhcmFtZXRlcnMuCisJICBTZXQgY29ycmVjdCBSVFAgdGltZSBpbiBTUiBwYWNrZXRzIHVzaW5nIHRoZSBzeW5jIHBhcmFtcy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChydHBfc291cmNlX3NlbmRfcnRwKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBSZWNvcmQgbGFzdCBSVFAgPC0+IEdTVCB0aW1lc3RhbXAgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZW0gdG8gY29udmVydCBOVFAKKwkgIHRvIFJUUCB0aW1lc3RhbXBzIGluIFNSIHBhY2tldHMuCisKKzIwMDctMDgtMjggMjA6MzA6MTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiBBZGQgc29tZSBtb3JlIGFkdmFuY2VkIGV4YW1wbGUgcGlwZWxpbmVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoZ3N0X3J0cF9iaW5fY2xlYXJfcHRfbWFwKToKKwkgIEFkZCBzb21lIG1vcmUgYWR2YW5jZWQgZXhhbXBsZSBwaXBlbGluZXMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogKHJ0Y3BfdGhyZWFkKSwKKwkgIChzdG9wX3J0Y3BfdGhyZWFkKSwgKGdzdF9ydHBfc2Vzc2lvbl9zZW5kX3J0Y3ApOgorCSAgQWRkIHNvbWUgZGVidWcgYW5kIEZJWE1FLgorCSAgUmVsZWFzZSBMT0NLIHdoZW4gcGVyZm9ybWluZyBzZXNzaW9uIGNsZWFudXAuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHNlc3Npb25fcmVwb3J0X2Jsb2Nrcyk6CisJICBBZGQgc29tZSBkZWJ1Zy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChjYWxjdWxhdGVfaml0dGVyKSwKKwkgIChydHBfc291cmNlX3NlbmRfcnRwKToKKwkgIE1ha2Ugc3VyZSB3ZSBhbHdheXMgc2VuZCBSVFAgcGFja2V0cyB3aXRoIHRoZSBzZXNzaW9uIFNTUkMuCisKKzIwMDctMDgtMjcgMjE6MTc6MjEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiBXaGVuIHN5bmNocm9uaXppbmcgYnVmZmVycywgdGFrZSBwZWVyIGxhdGVuY3kgaW50byBhY2NvdW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9xdWVyeSk6CisJICBXaGVuIHN5bmNocm9uaXppbmcgYnVmZmVycywgdGFrZSBwZWVyIGxhdGVuY3kgaW50byBhY2NvdW50LgorCSAgRG9uJ3QgdHJ5IHRvIGFkZCBvdXIgbGF0ZW5jeSB0byBpbnZhbGlkIHBlZXIgbWF4IGxhdGVuY3kgdmFsdWVzLgorCisyMDA3LTA4LTIzIDIxOjM5OjU4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBSZW5hbWUgYWxsIEdzdFJUUEZvbyBzdHJ1Y3RzIHRvIEdzdFJ0cEZvbyBzbyB0aGF0IEdTVF9CT0lMRVJQTEFURSByZWdpc3RlcnMgYSBHVHlwZSB0aGF0J3MgZGlmZmVyZW50IHRoYW4gdGhlIEdzdFJUUEYuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLnNpZ25hbHM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwY2xpZW50LmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGNsaWVudC5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5oOgorCSAgUmVuYW1lIGFsbCBHc3RSVFBGb28gc3RydWN0cyB0byBHc3RSdHBGb28gc28gdGhhdCBHU1RfQk9JTEVSUExBVEUKKwkgIHJlZ2lzdGVycyBhIEdUeXBlIHRoYXQncyBkaWZmZXJlbnQgdGhhbiB0aGUgR3N0UlRQRm9vIHR5cGVzIHRoYXQKKwkgIGZhcnNpZ2h0IHJlZ2lzdGVycyAobHVja2lseSBHVHlwZSBuYW1lcyBhcmUgY2FzZSBzZW5zaXRpdmUpLiBTaG91bGQKKwkgIGZpbmFsbHkgZml4ICM0MzA2NjQuCisKKzIwMDctMDgtMjEgMTc6MTg6MjkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOiBXaGVuIGRyb3Atb24tbGF0ZW5jeSBpcyBzZXQgYnV0IHdlIGhhdmUgbm8gbGF0ZW5jeSBjb25maWd1cmVkLCBqdXN0IHB1c2ggdGhlIGJ1Zi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbiksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NldF9wcm9wZXJ0eSk6CisJICBXaGVuIGRyb3Atb24tbGF0ZW5jeSBpcyBzZXQgYnV0IHdlIGhhdmUgbm8gbGF0ZW5jeSBjb25maWd1cmVkLCBqdXN0IHB1c2gKKwkgIHRoZSBidWZmZXIgYXMgZmFzdCBhcyBwb3NzaWJsZS4KKwkgIEZpeCB0eXBvIGluIGNvbW1lbnQuCisKKzIwMDctMDgtMjEgMTY6MDQ6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci4qOiBGaXggdW5kZWZpbmVkIG92ZXJmbG93IHByb25lIHRzX2RpZmYgaGFuZGxpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICAocnRwX2ppdHRlcl9idWZmZXJfZ2V0X3RzX2RpZmYpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaDoKKwkgIEZpeCB1bmRlZmluZWQgb3ZlcmZsb3cgcHJvbmUgdHNfZGlmZiBoYW5kbGluZy4KKworMjAwNy0wOC0xNiAxMTo0MDoxNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IEZpeCBFT1MgaGFuZGxpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpbmtfZXZlbnQpLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYWluKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCk6CisJICBGaXggRU9TIGhhbmRsaW5nLgorCSAgQ29udmVydCBzb21lIERFQlVHIGludG8gV0FSTklOR3MuCisJICBQYXVzZSB0YXNrIHdoZW4gZmx1c2hpbmcuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogKGdzdF9ydHBfc2Vzc2lvbl9jbGFzc19pbml0KSwKKwkgIChydGNwX3RocmVhZCksIChnc3RfcnRwX3Nlc3Npb25fZXZlbnRfcmVjdl9ydGNwX3NpbmspOgorCSAgVXNlIHN5c3RlbSBjbG9jayBmb3IgUlRDUCBzZXNzaW9uIG1hbmFnZW1lbnQgdGltZW91dHMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKG9uX25ld19zc3JjKSwgKG9uX3NzcmNfY29sbGlzaW9uKSwKKwkgIChvbl9zc3JjX3ZhbGlkYXRlZCksIChvbl9ieWVfc3NyYyksIChvbl9ieWVfdGltZW91dCksIChvbl90aW1lb3V0KToKKwkgIFJlbGVhc2UgdGhlIHNlc3Npb24gbG9jayB3aGVuIGVtaXRpbmcgc2lnbmFscy4KKworMjAwNy0wOC0xMyAwNjoxNjo0MCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYzogSW5jbHVkZSBzdGRsaWIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6CisJICBJbmNsdWRlIHN0ZGxpYi4KKworMjAwNy0wOC0xMCAxNzoxNjo1MyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvOiBSZW1vdmUgY29tcGxpY2F0ZWQgYXN5bmMgcXVldWUgYW5kIHJlcGxhY2Ugd2l0aCBtb3JlIHNpbXBsZSBqaXR0ZXJidWZmZXIgY29kZSB3aGlsZSBhbHNvIGZpeGluZyBzb21lLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHBtYW5hZ2VyL2FzeW5jX2ppdHRlcl9xdWV1ZS5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9hc3luY19qaXR0ZXJfcXVldWUuaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwaml0dGVyYnVmZmVyLmM6IChydHBfaml0dGVyX2J1ZmZlcl9jbGFzc19pbml0KSwKKwkgIChydHBfaml0dGVyX2J1ZmZlcl9pbml0KSwgKHJ0cF9qaXR0ZXJfYnVmZmVyX2ZpbmFsaXplKSwKKwkgIChydHBfaml0dGVyX2J1ZmZlcl9uZXcpLCAoY29tcGFyZV9zZXFudW0pLAorCSAgKHJ0cF9qaXR0ZXJfYnVmZmVyX2luc2VydCksIChydHBfaml0dGVyX2J1ZmZlcl9wb3ApLAorCSAgKHJ0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoKSwgKHJ0cF9qaXR0ZXJfYnVmZmVyX251bV9wYWNrZXRzKSwKKwkgIChydHBfaml0dGVyX2J1ZmZlcl9nZXRfdHNfZGlmZik6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oOgorCSAgUmVtb3ZlIGNvbXBsaWNhdGVkIGFzeW5jIHF1ZXVlIGFuZCByZXBsYWNlIHdpdGggbW9yZSBzaW1wbGUgaml0dGVyYnVmZmVyCisJICBjb2RlIHdoaWxlIGFsc28gZml4aW5nIHNvbWUgYnVncy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLW1hcnNoYWwubGlzdDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChvbl9uZXdfc3NyYyksIChvbl9zc3JjX2NvbGxpc2lvbiksCisJICAob25fc3NyY192YWxpZGF0ZWQpLCAob25fYnllX3NzcmMpLCAob25fYnllX3RpbWVvdXQpLCAob25fdGltZW91dCksCisJICAoY3JlYXRlX3Nlc3Npb24pLCAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCksIChjcmVhdGVfcmVjdl9ydHApLAorCSAgKGNyZWF0ZV9zZW5kX3J0cCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfaW5pdCksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZGlzcG9zZSksCisJICAoZ3N0X2ppdHRlcl9idWZmZXJfc2lua19wYXJzZV9jYXBzKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZmx1c2hfc3RhcnQpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9mbHVzaF9zdG9wKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2lua19ldmVudCksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChvbl9uZXdfc3NyYyksCisJICAob25fc3NyY19jb2xsaXNpb24pLCAob25fc3NyY192YWxpZGF0ZWQpLCAob25fYnllX3NzcmMpLAorCSAgKG9uX2J5ZV90aW1lb3V0KSwgKG9uX3RpbWVvdXQpLCAoZ3N0X3J0cF9zZXNzaW9uX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9pbml0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChvbl9ieWVfc3NyYyksIChzZXNzaW9uX2NsZWFudXApOgorCSAgVXNlIG5ldyBqaXR0ZXJidWZmZXIgY29kZS4KKwkgIEV4cG9zZSBzb21lIG5ldyBzaWduYWxzIGluIHByZXBhcmF0aW9uIGZvciBoYW5kbGluZyBFT1MuCisKKzIwMDctMDctMTggMDc6MzU6MzIgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgQWRkIHN0ZGxpYiBpbmNsdWRlIChmcmVlLCBhdG9pLCBleGl0KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleGFtcGxlcy9hcHAvYXBwc3JjX2V4LmM6CisJICAqIGV4YW1wbGVzL3N3aXRjaC9zd2l0Y2hlci5jOgorCSAgKiBleHQvbmVvbi9nc3RuZW9uaHR0cHNyYy5jOgorCSAgKiBleHQvdGltaWRpdHkvZ3N0d2lsZG1pZGkuYzoKKwkgICogZXh0L3gyNjQvZ3N0eDI2NGVuYy5jOgorCSAgKiBnc3QvbXZlL212ZWF1ZGlvZW5jLmM6IChtdmVfY29tcHJlc3NfYXVkaW8pOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBjbGllbnQuYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAqIGdzdC9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1vc3NzcmMuYzoKKwkgICogc3lzL2R2Yi9nc3RkdmJzcmMuYzoKKwkgIEFkZCBzdGRsaWIgaW5jbHVkZSAoZnJlZSwgYXRvaSwgZXhpdCkuCisKKzIwMDctMDYtMjIgMjA6MjM6MTggKzAwMDAgIEplbnMgR3JhbnNldWVyIDxqZW5zZ3JAZ214Lm5ldD4KKworCSAgZ3N0LzogQnVpbGQgZml4ZXMgZm9yIGdjYy0yLjl4IChubyBtaWQtYmxvY2sgdmFyaWFibGUgZGVjbGFyYXRpb25zIGV0Yy4pLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSmVucyBHcmFuc2V1ZXIgIDxqZW5zZ3IgYXQgZ214IG5ldD4KKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmM6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmM6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVybmJhbmRzLmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2FzeW5jX2ppdHRlcl9xdWV1ZS5jOgorCSAgKGFzeW5jX2ppdHRlcl9xdWV1ZV9wdXNoX3NvcnRlZCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbik6CisJICAqIGdzdC9zd2l0Y2gvZ3N0c3dpdGNoLmM6IChnc3Rfc3dpdGNoX2NoYWluKToKKwkgIEJ1aWxkIGZpeGVzIGZvciBnY2MtMi45eCAobm8gbWlkLWJsb2NrIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBldGMuKS4KKwkgIEZpeGVzICM0NTAxODUuCisKKzIwMDctMDUtMjggMTY6Mzc6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIFJlbmFtZSBlbGVtZW50cyB0byBhdm9pZCBjb25mbGljdCB3aXRoIGZhcnNpZ2h0IGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgbmFtZS4gRml4ZXMgIzQzMDY2NC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGNyZWF0ZV9zZXNzaW9uKSwgKGNyZWF0ZV9zdHJlYW0pLAorCSAgKGdzdF9ydHBfYmluX2NsYXNzX2luaXQpLCAoY3JlYXRlX3JlY3ZfcnRwKSwgKGNyZWF0ZV9yZWN2X3J0Y3ApLAorCSAgKGNyZWF0ZV9zZW5kX3J0cCksIChjcmVhdGVfcnRjcCksIChnc3RfcnRwX2Jpbl9yZXF1ZXN0X25ld19wYWQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBjbGllbnQuYzogKGNyZWF0ZV9zdHJlYW0pLAorCSAgKGdzdF9ydHBfY2xpZW50X3JlcXVlc3RfbmV3X3BhZCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jbGVhcl9wdF9tYXApLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtYW5hZ2VyLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoZ3N0X3J0cF9zZXNzaW9uX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9yZXF1ZXN0X25ld19wYWQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzoKKwkgIFJlbmFtZSBlbGVtZW50cyB0byBhdm9pZCBjb25mbGljdCB3aXRoIGZhcnNpZ2h0IGVsZW1lbnRzIHdpdGggdGhlIHNhbWUKKwkgIG5hbWUuIEZpeGVzICM0MzA2NjQuCisKKzIwMDctMDUtMjMgMTM6MDg6NTIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIERvY3VtZW50IHN0dWZmLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnc3RfcnRwX2Jpbl9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGNsaWVudC5jOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NsZWFyX3B0X21hcCksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6IChnc3RfcnRwX3B0X2RlbXV4X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfcHRfZGVtdXhfY2xlYXJfcHRfbWFwKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fY2xhc3NfaW5pdCksCisJICAocnRjcF90aHJlYWQpLCAoZ3N0X3J0cF9zZXNzaW9uX2NsZWFyX3B0X21hcCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6CisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X2NsYXNzX2luaXQpOgorCSAgRG9jdW1lbnQgc3R1ZmYuCisJICBBZGQgY2xlYXItcHQtbWFwIGFjdGlvbiBzaWduYWwgd2hlcmUgbmVlZGVkLgorCisyMDA3LTA1LTE1IDEzOjI5OjUzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6IFdlIGFsd2F5cyB1c2UgZml4ZWQgY2Fwcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmM6IChnc3RfcnRwX3B0X2RlbXV4X2NoYWluKToKKwkgIFdlIGFsd2F5cyB1c2UgZml4ZWQgY2Fwcy4KKworMjAwNy0wNS0xNSAwMzo0NTo0NSArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiBnX2hhc2hfdGFibGVfcmVtb3ZlX2FsbCgpIG9ubHkgZXhpc3RzIGluIDIuMTIuICBXb3JrIGFyb3VuZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzoKKwkgIGdfaGFzaF90YWJsZV9yZW1vdmVfYWxsKCkgb25seSBleGlzdHMgaW4gMi4xMi4gIFdvcmsgYXJvdW5kLgorCisyMDA3LTA1LTE0IDE1OjI4OjM2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9hc3luY19qaXR0ZXJfcXVldWUuYzogRml4IGxlYWsgd2hlbiBmbHVzaGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9hc3luY19qaXR0ZXJfcXVldWUuYzoKKwkgIChhc3luY19qaXR0ZXJfcXVldWVfc2V0X2ZsdXNoaW5nX3VubG9ja2VkKToKKwkgIEZpeCBsZWFrIHdoZW4gZmx1c2hpbmcuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoZ3N0X3J0cF9iaW5fY2xlYXJfcHRfbWFwKSwKKwkgIChnc3RfcnRwX2Jpbl9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICBBZGQgY2xlYXItcHQtbWFwIHNpZ25hbC4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoX3N0b3ApLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaW5rX2V2ZW50KSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKToKKwkgIEluaXQgY2xvY2stcmF0ZSB0byAtMSB0byBtYXJrIHVua25vdyBjbG9jayByYXRlLgorCSAgRml4IGZsdXNoaW5nLgorCisyMDA3LTA1LTEwIDE0OjAyOjA3ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYyAoZ3N0X3F0ZGVtdXhfbW92ZV9zdHJlYW0sIGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfaGVhZGVyLCBnc3RfcXRkZW11eF9hY3RpdmF0ZV9zZWdtZW50LCBnc3RfcXRkZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYyAoZ3N0X3F0ZGVtdXhfbW92ZV9zdHJlYW0sCisJICBnc3RfcXRkZW11eF9sb29wX3N0YXRlX2hlYWRlciwgZ3N0X3F0ZGVtdXhfYWN0aXZhdGVfc2VnbWVudCwKKwkgIGdzdF9xdGRlbXV4X3ByZXBhcmVfY3VycmVudF9zYW1wbGUsIGdzdF9xdGRlbXV4X2NvbWJpbmVfZmxvd3MsCisJICBnc3RfcXRkZW11eF9sb29wX3N0YXRlX21vdmllLCBnc3RfcXRkZW11eF9sb29wLAorCSAgcXRkZW11eF9wYXJzZV9zZWdtZW50cywgcXRkZW11eF9wYXJzZV90cmFrKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jIChydHBfc2Vzc2lvbl9nZXRfYmFuZHdpZHRoLAorCSAgcnRwX3Nlc3Npb25fZ2V0X3J0Y3BfYmFuZHdpZHRoLCBydHBfc2Vzc2lvbl9nZXRfY25hbWUsCisJICBydHBfc2Vzc2lvbl9nZXRfbmFtZSwgcnRwX3Nlc3Npb25fZ2V0X2VtYWlsLCBydHBfc2Vzc2lvbl9nZXRfcGhvbmUsCisJICBydHBfc2Vzc2lvbl9nZXRfbG9jYXRpb24sIHJ0cF9zZXNzaW9uX2dldF90b29sLAorCSAgcnRwX3Nlc3Npb25fcHJvY2Vzc19ieWUsIHNlc3Npb25fcmVwb3J0X2Jsb2Nrcyk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jIChydHBfc291cmNlX3Byb2Nlc3NfcnRwLAorCSAgcnRwX3NvdXJjZV9zZW5kX3J0cCwgcnRwX3NvdXJjZV9wcm9jZXNzX3NyLCBydHBfc291cmNlX3Byb2Nlc3NfcmIpOgorCSAgTW9yZSBmb3JtYXQgYXJnIGZpeGluZyAoc3BvdHRlZCBieSBBbGkgU2FiaWwgPGFsaS5zYWJpbEBnbWFpbC5jb20+KS4KKwkgICogZ3N0L3N3aXRjaC9NYWtlZmlsZS5hbToKKwkgIEFkZCByZXF1aXJlIGxpYnJhcmllcyhzcG90dGVkIGJ5IEFsaSBTYWJpbCA8YWxpLnNhYmlsQGdtYWlsLmNvbT4pLgorCisyMDA3LTA1LTEwIDEyOjM4OjQ5ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC9ydHBtYW5hZ2VyL2FzeW5jX2ppdHRlcl9xdWV1ZS5jOgorCSAgZ3N0L3J0cG1hbmFnZXIvYXN5bmNfaml0dGVyX3F1ZXVlLmMgKHRhaWxfYnVmZmVyX2R1cmF0aW9uLCBhc3luY19qaXR0ZXJfcXVldWVfcmVmLCBhc3luY19qaXR0ZXJfcXVldWVfcmVmX3VubG9ja2VkLCBhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvYXN5bmNfaml0dGVyX3F1ZXVlLmMgKHRhaWxfYnVmZmVyX2R1cmF0aW9uLAorCSAgYXN5bmNfaml0dGVyX3F1ZXVlX3JlZiwgYXN5bmNfaml0dGVyX3F1ZXVlX3JlZl91bmxvY2tlZCwKKwkgIGFzeW5jX2ppdHRlcl9xdWV1ZV9zZXRfbG93X3RocmVzaG9sZCwKKwkgIGFzeW5jX2ppdHRlcl9xdWV1ZV9sZW5ndGhfdHNfdW5pdHNfdW5sb2NrZWQsCisJICBhc3luY19qaXR0ZXJfcXVldWVfdW5yZWZfYW5kX3VubG9jaywgYXN5bmNfaml0dGVyX3F1ZXVlX3VucmVmLAorCSAgYXN5bmNfaml0dGVyX3F1ZXVlX2xvY2ssIGFzeW5jX2ppdHRlcl9xdWV1ZV9wdXNoLAorCSAgYXN5bmNfaml0dGVyX3F1ZXVlX3B1c2hfdW5sb2NrZWQsIGFzeW5jX2ppdHRlcl9xdWV1ZV9wdXNoX3NvcnRlZCwKKwkgIGFzeW5jX2ppdHRlcl9xdWV1ZV9wb3BfaW50ZXJuX3VubG9ja2VkLCBhc3luY19qaXR0ZXJfcXVldWVfcG9wLAorCSAgYXN5bmNfaml0dGVyX3F1ZXVlX3BvcF91bmxvY2tlZCwgYXN5bmNfaml0dGVyX3F1ZXVlX2xlbmd0aF91bmxvY2tlZCwKKwkgIGFzeW5jX2ppdHRlcl9xdWV1ZV9zZXRfZmx1c2hpbmdfdW5sb2NrZWQsCisJICBhc3luY19qaXR0ZXJfcXVldWVfdW5zZXRfZmx1c2hpbmdfdW5sb2NrZWQpOgorCSAgRm9ybWF0IGFyZyBmaXggKHNwb3R0ZWQgYnkgQWxpIFNhYmlsIDxhbGkuc2FiaWxAZ21haWwuY29tPikKKworMjAwNy0wNS0wOSAxMToyNDoyMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6IFBhc3MgcXVlcmllcyB1cHN0cmVhbS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfcXVlcnkpOgorCSAgUGFzcyBxdWVyaWVzIHVwc3RyZWFtLgorCisyMDA3LTA1LTA0IDEyOjMyOjI3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogQWRkIHNvbWUgZGVidWcgaW5mby4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfcXVlcnkpOgorCSAgQWRkIHNvbWUgZGVidWcgaW5mby4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAocnRwX3Nlc3Npb25faW5pdCksCisJICAocnRwX3Nlc3Npb25fc2VuZF9ydHApOgorCSAgU3RvcmUgcmVhbCB1c2VyIG5hbWUgaW4gdGhlIHNlc3Npb24uCisKKzIwMDctMDQtMzAgMTM6NDE6MzAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2FzeW5jX2ppdHRlcl9xdWV1ZS5jOiBGaXggdGhlIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciB1bmRlcnJ1bnMgYW5kIGRvZXMgbm90IGJsb2NrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2FzeW5jX2ppdHRlcl9xdWV1ZS5jOiAoc2lnbmFsX3dhaXRpbmdfdGhyZWFkcyksCisJICAoYXN5bmNfaml0dGVyX3F1ZXVlX3BvcF9pbnRlcm5fdW5sb2NrZWQpOgorCSAgRml4IHRoZSBjYXNlIHdoZXJlIHRoZSBidWZmZXIgdW5kZXJydW5zIGFuZCBkb2VzIG5vdCBibG9jay4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnc3RfcnRwX2Jpbl9iYXNlX2luaXQpLAorCSAgKGNyZWF0ZV9yZWN2X3J0Y3ApLCAoY3JlYXRlX3NlbmRfcnRwKSwgKGNyZWF0ZV9ydGNwKSwKKwkgIChnc3RfcnRwX2Jpbl9yZXF1ZXN0X25ld19wYWQpOgorCSAgUmVuYW1lIFJUQ1Agc2VuZCBwYWQsIGxpa2UgaW4gdGhlIHNlc3Npb24gbWFuYWdlci4KKwkgIEFsbG93IGdldHRpbmcgYW4gUlRDUCBwYWQgZm9yIHJlY2VpdmluZyBldmVuIGlmIHdlIGRvbid0IHJlY2VpdmUgUlRQLgorCSAgZml4IGhhbmRsaW5nIG9mIHNlbmRfcnRwX3NyYyBwYWQuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzogKGdzdF9ydHBfcHRfZGVtdXhfY2hhaW4pOgorCSAgV2hlbiBubyBwdCBtYXAgY291bGQgYmUgZm91bmQsIGZhbGwgYmFjayB0byB0aGUgc2lua3BhZCBjYXBzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fcHJvY2Vzc19ydHApLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9zZW5kX3J0cCksIChjcmVhdGVfcmVjdl9ydHBfc2luayksCisJICAoY3JlYXRlX3JlY3ZfcnRjcF9zaW5rKSwgKGNyZWF0ZV9zZW5kX3J0cF9zaW5rKSwKKwkgIChjcmVhdGVfc2VuZF9ydGNwX3NyYyk6CisJICBGaXggcGFkIG5hbWVzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChzb3VyY2VfcHVzaF9ydHApLAorCSAgKHJ0cF9zZXNzaW9uX2NyZWF0ZV9zb3VyY2UpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19zciksCisJICAocnRwX3Nlc3Npb25fc2VuZF9ydHApLCAoc2Vzc2lvbl9zdGFydF9ydGNwKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgVW5sb2NrIHNlc3Npb24gd2hlbiBwZXJmb3JtaW5nIGEgY2FsbGJhY2suCisJICBBZGQgY2FsbGJhY2tzIGZvciB0aGUgaW50ZXJuYWwgc2Vzc2lvbiBvYmplY3QuCisJICBGaXggc2VuZGluZyBvZiBSVFAgcGFja2V0cy4KKwkgIGZpcnN0IGF0dGVtcHQgYXQgYWRkaW5nIE5UUCB0aW1lcyBpbiB0aGUgU1IgcGFja2V0cy4KKwkgIFNtYWxsIGRlYnVnIGFuZCBkb2MgaW1wcm92ZW1lbnRzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYzogKHJ0cF9zb3VyY2Vfc2VuZF9ydHApOgorCSAgVXBkYXRlIHN0YXRzIGZvciBTUiByZXBvcnRzLgorCisyMDA3LTA0LTI5IDE0OjQ2OjI3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IFJlbW92ZSBkZWJ1Zy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fc2VuZF9ydGNwKToKKwkgIFJlbW92ZSBkZWJ1Zy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAocnRwX3Nlc3Npb25fcHJvY2Vzc19zciksCisJICAocnRwX3Nlc3Npb25fcHJvY2Vzc19zZGVzKSwgKGNhbGN1bGF0ZV9ydGNwX2ludGVydmFsKSwKKwkgIChydHBfc2Vzc2lvbl9uZXh0X3RpbWVvdXQpLCAoc2Vzc2lvbl9yZXBvcnRfYmxvY2tzKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuYzogKHJ0cF9zdGF0c19jYWxjdWxhdGVfcnRjcF9pbnRlcnZhbCk6CisJICBJbXByb3ZlIGRlYnVnZ2luZworCSAgRml4IGludGVydmFsIGZvciBCWUUvUlRDUCBwYWNrZXRzLgorCisyMDA3LTA0LTI3IDE1OjA5OjEyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IE1vdmUgcmVjb25zaWRlcmF0aW9uIGNvZGUgdG8gdGhlIHJ0cHNlc3Npb24gb2JqZWN0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogKHJ0Y3BfdGhyZWFkKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fc2VuZF9ydGNwKSwgKGdzdF9ydHBfc2Vzc2lvbl9yZWNvbnNpZGVyKToKKwkgIE1vdmUgcmVjb25zaWRlcmF0aW9uIGNvZGUgdG8gdGhlIHJ0cHNlc3Npb24gb2JqZWN0LgorCSAgU2ltcGxpZnkgdGltb3V0IGhhbmRsaW5nIGFuZCBhZGQgcmVjb25zaWRlcmF0aW9uLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChydHBfc2Vzc2lvbl9jbGFzc19pbml0KSwKKwkgIChydHBfc2Vzc2lvbl9pbml0KSwgKHJ0cF9zZXNzaW9uX2ZpbmFsaXplKSwgKG9uX2J5ZV9zc3JjKSwKKwkgIChvbl9ieWVfdGltZW91dCksIChvbl90aW1lb3V0KSwgKHJ0cF9zZXNzaW9uX3NldF9jYWxsYmFja3MpLAorCSAgKG9idGFpbl9zb3VyY2UpLCAocnRwX3Nlc3Npb25fY3JlYXRlX3NvdXJjZSksCisJICAodXBkYXRlX2Fycml2YWxfc3RhdHMpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19ydHApLAorCSAgKHJ0cF9zZXNzaW9uX3Byb2Nlc3Nfc3IpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19yciksCisJICAocnRwX3Nlc3Npb25fcHJvY2Vzc19ieWUpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19ydGNwKSwKKwkgIChjYWxjdWxhdGVfcnRjcF9pbnRlcnZhbCksIChydHBfc2Vzc2lvbl9zZW5kX2J5ZSksCisJICAocnRwX3Nlc3Npb25fbmV4dF90aW1lb3V0KSwgKHNlc3Npb25fc3RhcnRfcnRjcCksCisJICAoc2Vzc2lvbl9yZXBvcnRfYmxvY2tzKSwgKHNlc3Npb25fY2xlYW51cCksIChzZXNzaW9uX3NkZXMpLAorCSAgKHNlc3Npb25fYnllKSwgKGlzX3J0Y3BfdGltZSksIChydHBfc2Vzc2lvbl9vbl90aW1lb3V0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgSGFuZGxlIHRpbWVvdXQgb2YgaW5hY3RpdmUgc291cmNlcyBhbmQgc2VuZGVycy4KKwkgIEltcGxlbWVudCBCWUUgc2NoZWR1bGluZy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChjYWxjdWxhdGVfaml0dGVyKSwKKwkgIChydHBfc291cmNlX3Byb2Nlc3Nfc3IpLCAocnRwX3NvdXJjZV9nZXRfbGFzdF9zciksCisJICAocnRwX3NvdXJjZV9nZXRfbGFzdF9yYik6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oOgorCSAgQWRkIG1lbWJlcnMgdG8gY2hlY2sgZm9yIHRpbWVvdXRzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOiAocnRwX3N0YXRzX2luaXRfZGVmYXVsdHMpLAorCSAgKHJ0cF9zdGF0c19jYWxjdWxhdGVfcnRjcF9pbnRlcnZhbCksIChydHBfc3RhdHNfYWRkX3J0Y3Bfaml0dGVyKSwKKwkgIChydHBfc3RhdHNfY2FsY3VsYXRlX2J5ZV9pbnRlcnZhbCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmg6CisJICBVc2UgUkZDIGFsZ29yaXRobSBmb3IgY2FsY3VsYXRpbmcgdGhlIHJlcG9ydGluZyBpbnRlcnZhbC4KKworMjAwNy0wNC0yNSAxNjozODowMyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiBJbXBsZW1lbnQgZm9yd2FyZCBhbmQgcmV2ZXJzZSByZWNvbnNpZGVyYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAocnRjcF90aHJlYWQpOgorCSAgSW1wbGVtZW50IGZvcndhcmQgYW5kIHJldmVyc2UgcmVjb25zaWRlcmF0aW9uLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChydHBfc2Vzc2lvbl9nZXRfbnVtX3NvdXJjZXMpLAorCSAgKHJ0cF9zZXNzaW9uX2dldF9udW1fYWN0aXZlX3NvdXJjZXMpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19zciksCisJICAoc2Vzc2lvbl9yZXBvcnRfYmxvY2tzKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgU21hbGwgY2xlYW51cHMuCisKKzIwMDctMDQtMjUgMTU6NDg6NDYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi4qOiBNYWtlIGRlZmF1bHQgaml0dGVyYnVmZmVyIGxhdGVuY3kgY29uZmlndXJhYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZXZpZXdlZCBieTogPGRlbGV0ZSBpZiBub3QgdXNpbmcgYSBidWRkeT4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChjcmVhdGVfc3RyZWFtKSwKKwkgIChnc3RfcnRwX2Jpbl9jbGFzc19pbml0KSwgKGdzdF9ydHBfYmluX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9iaW5fZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICBNYWtlIGRlZmF1bHQgaml0dGVyYnVmZmVyIGxhdGVuY3kgY29uZmlndXJhYmxlLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2xhc3NfaW5pdCksCisJICAoZ3N0X2ppdHRlcl9idWZmZXJfc2lua19wYXJzZV9jYXBzKSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3Byb3BlcnR5KToKKwkgIERlYnVnaW5nIGNsZWFudXBzLgorCisyMDA3LTA0LTI1IDEzOjE5OjM2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogUmVwb3J0IE5PX1BSRVJPTEwgd2hlbiBnb2luZyB0byBQQVVTRUQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYW5nZV9zdGF0ZSk6CisJICBSZXBvcnQgTk9fUFJFUk9MTCB3aGVuIGdvaW5nIHRvIFBBVVNFRC4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAocnRjcF90aHJlYWQpOgorCSAgRG9uJ3Qgc2VuZCBSVENQIHJpZ2h0IGJlZm9yZSB3ZSBhcmUgc2h1dHRpbmcgZG93bi4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAocnRwX3Nlc3Npb25fcHJvY2Vzc19ydHApLAorCSAgKHJ0cF9zZXNzaW9uX3Byb2Nlc3Nfc3IpLCAoc2Vzc2lvbl9yZXBvcnRfYmxvY2tzKSwKKwkgIChydHBfc2Vzc2lvbl9wZXJmb3JtX3JlcG9ydGluZyk6CisJICBJbXByb3ZlIHJlcG9ydCBibG9ja3MuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAoY2FsY3VsYXRlX2ppdHRlciksIChpbml0X3NlcSksCisJICAocnRwX3NvdXJjZV9wcm9jZXNzX3J0cCksIChydHBfc291cmNlX3Byb2Nlc3Nfc3IpLAorCSAgKHJ0cF9zb3VyY2VfcHJvY2Vzc19yYiksIChydHBfc291cmNlX2dldF9sYXN0X3NyKSwKKwkgIChydHBfc291cmNlX2dldF9sYXN0X3JiKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmg6CisJICBDbGVhbnVwcywgYWRkIG1ldGhvZHMgdG8gYWNjZXNzIHN0YXRzLgorCisyMDA3LTA0LTI1IDA4OjMwOjQ4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogZml4IGZvciBwYWQgbmFtZSBjaGFuZ2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGNyZWF0ZV9ydGNwKToKKwkgIGZpeCBmb3IgcGFkIG5hbWUgY2hhbmdlCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYzogKHJ0Y3BfdGhyZWFkKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fc2VuZF9ydGNwKSwgKGdzdF9ydHBfc2Vzc2lvbl9jbG9ja19yYXRlKToKKwkgIEZpeCBmb3IgcmVuYW1lZCBtZXRob2RzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmM6IChydHBfc2Vzc2lvbl9pbml0KSwKKwkgIChydHBfc2Vzc2lvbl9maW5hbGl6ZSksIChydHBfc2Vzc2lvbl9zZXRfY25hbWUpLAorCSAgKHJ0cF9zZXNzaW9uX2dldF9jbmFtZSksIChydHBfc2Vzc2lvbl9zZXRfbmFtZSksCisJICAocnRwX3Nlc3Npb25fZ2V0X25hbWUpLCAocnRwX3Nlc3Npb25fc2V0X2VtYWlsKSwKKwkgIChydHBfc2Vzc2lvbl9nZXRfZW1haWwpLCAocnRwX3Nlc3Npb25fc2V0X3Bob25lKSwKKwkgIChydHBfc2Vzc2lvbl9nZXRfcGhvbmUpLCAocnRwX3Nlc3Npb25fc2V0X2xvY2F0aW9uKSwKKwkgIChydHBfc2Vzc2lvbl9nZXRfbG9jYXRpb24pLCAocnRwX3Nlc3Npb25fc2V0X3Rvb2wpLAorCSAgKHJ0cF9zZXNzaW9uX2dldF90b29sKSwgKHJ0cF9zZXNzaW9uX3NldF9ub3RlKSwKKwkgIChydHBfc2Vzc2lvbl9nZXRfbm90ZSksIChzb3VyY2VfcHVzaF9ydHApLCAob2J0YWluX3NvdXJjZSksCisJICAocnRwX3Nlc3Npb25fYWRkX3NvdXJjZSksIChydHBfc2Vzc2lvbl9nZXRfc291cmNlX2J5X3NzcmMpLAorCSAgKHJ0cF9zZXNzaW9uX2NyZWF0ZV9zb3VyY2UpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19ydHApLAorCSAgKHJ0cF9zZXNzaW9uX3Byb2Nlc3Nfc3IpLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19zZGVzKSwKKwkgIChydHBfc2Vzc2lvbl9wcm9jZXNzX3J0Y3ApLCAocnRwX3Nlc3Npb25fc2VuZF9ydHApLAorCSAgKHJ0cF9zZXNzaW9uX2dldF9yZXBvcnRpbmdfaW50ZXJ2YWwpLCAoc2Vzc2lvbl9yZXBvcnRfYmxvY2tzKSwKKwkgIChzZXNzaW9uX3NkZXMpLCAocnRwX3Nlc3Npb25fcGVyZm9ybV9yZXBvcnRpbmcpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmg6CisJICBQcmVwYXJlIGZvciBpbXBsZW1lbnRpbmcgU1NSQyBzYW1wbGluZy4KKwkgIENyZWF0ZSBTU1JDIGZvciB0aGUgc2Vzc2lvbi4KKwkgIEFkZCBtZXRob2RzIHRvIHNldCB0aGUgU0RFUyBlbnRyaWVzLgorCSAgZml4IGFjY291bnRpbmcgb2Ygc2VuZGVycy9yZWNlaXZlcnMuCisJICBJbXBsZW1lbnQgU1IvUlIvU0RFUyBSVENQIHJlcG9ydGluZy4KKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmM6IChydHBfc291cmNlX2luaXQpLCAoaW5pdF9zZXEpLAorCSAgKHJ0cF9zb3VyY2VfcHJvY2Vzc19ydHApLCAocnRwX3NvdXJjZV9wcm9jZXNzX3NyKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBJbXBsZW1lbnQgZXh0ZW5kZWQgc2VxdWVuY2UgbnVtYmVyLgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jOiAocnRwX3N0YXRzX2NhbGN1bGF0ZV9ydGNwX2ludGVydmFsKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaDoKKwkgIFJlbmFtZSBzb21lIGZpZWxkcy4KKworMjAwNy0wNC0yMSAxOToyMTo0OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiBEb24ndCB1c2UgR0xpYi0yLjEwIEFQSSwgd2Ugb25seSByZXF1aXJlIEdMaWIgMi44IGF0IHRoZSBtb21lbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jOiAocnRwX3Nlc3Npb25fZmluYWxpemUpOgorCSAgRG9uJ3QgdXNlIEdMaWItMi4xMCBBUEksIHdlIG9ubHkgcmVxdWlyZSBHTGliIDIuOCBhdCB0aGUgbW9tZW50LgorCisyMDA3LTA0LTE4IDE4OjU4OjUzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBjb25maWd1cmUuYWM6IERpc2FibGUgcnRwbWFuYWdlciBmb3Igbm93IGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBDVlMgLWJhc2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgRGlzYWJsZSBydHBtYW5hZ2VyIGZvciBub3cgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIENWUyAtYmFzZS4KKwkgICogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJICBBZGRlZCBuZXcgZmlsZXMgZm9yIHNlc3Npb24gbWFuYWdlci4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoY3JlYXRlX3Nlc3Npb24pLCAoZ2V0X3B0X21hcCksCisJICAoY3JlYXRlX3N0cmVhbSksIChwdF9tYXBfcmVxdWVzdGVkKSwgKG5ld19zc3JjX3BhZF9mb3VuZCk6CisJICBTb21lIGNsZWFudXBzLgorCSAgdGhlIHNlc3Npb24gbWFuYWdlciBjYW4gbm93IGFsc28gcmVxdWVzdCBhIHB0LW1hcC4KKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoZ3N0X3J0cF9zZXNzaW9uX2Jhc2VfaW5pdCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9zZXNzaW9uX2luaXQpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9maW5hbGl6ZSksIChydGNwX3RocmVhZCksIChzdGFydF9ydGNwX3RocmVhZCksCisJICAoc3RvcF9ydGNwX3RocmVhZCksIChnc3RfcnRwX3Nlc3Npb25fY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fcHJvY2Vzc19ydHApLCAoZ3N0X3J0cF9zZXNzaW9uX3NlbmRfcnRwKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fc2VuZF9ydGNwKSwgKGdzdF9ydHBfc2Vzc2lvbl9jbG9ja19yYXRlKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fZ2V0X3RpbWUpLCAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3JlY3ZfcnRwX3NpbmspLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9jaGFpbl9yZWN2X3J0cCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3JlY3ZfcnRjcF9zaW5rKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fY2hhaW5fcmVjdl9ydGNwKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fZXZlbnRfc2VuZF9ydHBfc2luayksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3NlbmRfcnRwKSwgKGNyZWF0ZV9zZW5kX3J0Y3Bfc3JjKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fcmVxdWVzdF9uZXdfcGFkKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5oOgorCSAgV2UgY2FuIGFzayBmb3IgcHQtbWFwIG5vdyB0b28gd2hlbiB0aGUgc2Vzc2lvbiBtYW5hZ2VyIG5lZWRzIGl0LgorCSAgSG9vayB1cCB0byB0aGUgbmV3IHNlc3Npb24gbWFuYWdlciwgaW1wbGVtZW50IHRoZSBuZWVkZWQgY2FsbGJhY2tzIGZvcgorCSAgcHVzaGluZyBkYXRhLCBnZXR0aW5nIGNsb2NrIHRpbWUgYW5kIHJlcXVlc3RpbmcgY2xvY2stcmF0ZXMuCisJICBSZW5hbWUgcnRjcF9zcmMgdG8gc2VuZF9ydGNwX3NyYyB0byBtYWtlIGl0IGNsZWFyIHRoYXQgdGhpcyBSVENQIGlzIHRvCisJICBiZSBzZW5kIHRvIGNsaWVudHMuCisJICBBZGQgY29kZSB0byBzdGFydCBhbmQgc3RvcCB0aGUgdGhyZWFkIHRoYXQgd2lsbCBzY2hlZHVsZSBSVENQIHRocm91Z2gKKwkgIHRoZSBzZXNzaW9uIG1hbmFnZXIuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uYzogKHJ0cF9zZXNzaW9uX2NsYXNzX2luaXQpLAorCSAgKHJ0cF9zZXNzaW9uX2luaXQpLCAocnRwX3Nlc3Npb25fZmluYWxpemUpLAorCSAgKHJ0cF9zZXNzaW9uX3NldF9wcm9wZXJ0eSksIChydHBfc2Vzc2lvbl9nZXRfcHJvcGVydHkpLAorCSAgKG9uX25ld19zc3JjKSwgKG9uX3NzcmNfY29sbGlzaW9uKSwgKG9uX3NzcmNfdmFsaWRhdGVkKSwKKwkgIChvbl9ieWVfc3NyYyksIChydHBfc2Vzc2lvbl9uZXcpLCAocnRwX3Nlc3Npb25fc2V0X2NhbGxiYWNrcyksCisJICAocnRwX3Nlc3Npb25fc2V0X2JhbmR3aWR0aCksIChydHBfc2Vzc2lvbl9nZXRfYmFuZHdpZHRoKSwKKwkgIChydHBfc2Vzc2lvbl9zZXRfcnRjcF9iYW5kd2lkdGgpLCAocnRwX3Nlc3Npb25fZ2V0X3J0Y3BfYmFuZHdpZHRoKSwKKwkgIChzb3VyY2VfcHVzaF9ydHApLCAoc291cmNlX2Nsb2NrX3JhdGUpLCAoY2hlY2tfY29sbGlzaW9uKSwKKwkgIChvYnRhaW5fc291cmNlKSwgKHJ0cF9zZXNzaW9uX2FkZF9zb3VyY2UpLAorCSAgKHJ0cF9zZXNzaW9uX2dldF9udW1fc291cmNlcyksCisJICAocnRwX3Nlc3Npb25fZ2V0X251bV9hY3RpdmVfc291cmNlcyksCisJICAocnRwX3Nlc3Npb25fZ2V0X3NvdXJjZV9ieV9zc3JjKSwKKwkgIChydHBfc2Vzc2lvbl9nZXRfc291cmNlX2J5X2NuYW1lKSwgKHJ0cF9zZXNzaW9uX2NyZWF0ZV9zb3VyY2UpLAorCSAgKHVwZGF0ZV9hcnJpdmFsX3N0YXRzKSwgKHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnRwKSwKKwkgIChydHBfc2Vzc2lvbl9wcm9jZXNzX3NyKSwgKHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnIpLAorCSAgKHJ0cF9zZXNzaW9uX3Byb2Nlc3Nfc2RlcyksIChydHBfc2Vzc2lvbl9wcm9jZXNzX2J5ZSksCisJICAocnRwX3Nlc3Npb25fcHJvY2Vzc19hcHApLCAocnRwX3Nlc3Npb25fcHJvY2Vzc19ydGNwKSwKKwkgIChydHBfc2Vzc2lvbl9zZW5kX3J0cCksIChydHBfc2Vzc2lvbl9nZXRfcnRjcF9pbnRlcnZhbCksCisJICAocnRwX3Nlc3Npb25fcHJvZHVjZV9ydGNwKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5oOgorCSAgVGhlIGFkdmFuY2VkIGJlZ2lubmluZ3Mgb2YgdGhlIG1haW4gc2Vzc2lvbiBtYW5hZ2VyIHRoYXQgaGFuZGxlcyB0aGUKKwkgIHBhcnRpY2lwYW50IGRhdGFiYXNlIG9mIFJUUFNvdXJjZXMsIFNTUkMgcHJvYmF0aW9uLCBTU1JDIGNvbGxpc2lvbnMsCisJICBwYXJzZSBSVENQIHRvIHVwZGF0ZSBzb3VyY2Ugc3RhdHMuIGV0Yy4uCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5jOiAocnRwX3NvdXJjZV9jbGFzc19pbml0KSwKKwkgIChydHBfc291cmNlX2luaXQpLCAocnRwX3NvdXJjZV9maW5hbGl6ZSksIChydHBfc291cmNlX25ldyksCisJICAocnRwX3NvdXJjZV9zZXRfY2FsbGJhY2tzKSwgKHJ0cF9zb3VyY2Vfc2V0X2FzX2NzcmMpLAorCSAgKHJ0cF9zb3VyY2Vfc2V0X3J0cF9mcm9tKSwgKHJ0cF9zb3VyY2Vfc2V0X3J0Y3BfZnJvbSksCisJICAocHVzaF9wYWNrZXQpLCAoZ2V0X2Nsb2NrX3JhdGUpLCAoY2FsY3VsYXRlX2ppdHRlciksCisJICAocnRwX3NvdXJjZV9wcm9jZXNzX3J0cCksIChydHBfc291cmNlX3Byb2Nlc3NfYnllKSwKKwkgIChydHBfc291cmNlX3NlbmRfcnRwKSwgKHJ0cF9zb3VyY2VfcHJvY2Vzc19zciksCisJICAocnRwX3NvdXJjZV9wcm9jZXNzX3JiKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmg6CisJICBPYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgYW4gU1NSQyBhbmQgaXRzIHN0YXRlIGluIHRoZSBkYXRhYmFzZS4KKwkgIENhbGN1bGF0ZXMgdGhlIGppdHRlciBhbmQgdHJhbnNpdCB0aW1lcyBvZiBkYXRhIHBhY2tldHMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL3J0cHN0YXRzLmM6IChydHBfc3RhdHNfaW5pdF9kZWZhdWx0cyksCisJICAocnRwX3N0YXRzX2NhbGN1bGF0ZV9ydGNwX2ludGVydmFsKSwgKHJ0cF9zdGF0c19hZGRfcnRjcF9qaXR0ZXIpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oOgorCSAgVmFyaW91cyBzdGF0cyByZWdhcmRpbmcgdGhlIHNlc3Npb24gYW5kIHNvdXJjZXMuCisJICBVc2VkIHRvIGNhbGN1bGF0ZSB0aGUgUlRDUCBpbnRlcnZhbC4KKworMjAwNy0wNC0xMyAwOToyMDo1NSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvOiBQcm90ZWN0IGxpc3RzIGFuZCBzdHJ1Y3R1cmVzIHdpdGggbG9ja3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChjcmVhdGVfc2Vzc2lvbiksIChnZXRfcHRfbWFwKSwKKwkgIChnc3RfcnRwX2Jpbl9pbml0KSwgKGdzdF9ydHBfYmluX2ZpbmFsaXplKSwgKG5ld19zc3JjX3BhZF9mb3VuZCksCisJICAoY3JlYXRlX3JlY3ZfcnRwKSwgKGdzdF9ydHBfYmluX3JlcXVlc3RfbmV3X3BhZCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBjbGllbnQuYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5jOiAoZ3N0X3J0cF9zZXNzaW9uX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9pbml0KSwgKGdzdF9ydHBfc2Vzc2lvbl9maW5hbGl6ZSksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3JlY3ZfcnRwX3NpbmspLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9ldmVudF9yZWN2X3J0Y3Bfc2luayksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3JlY3ZfcnRjcCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX3JlcXVlc3RfbmV3X3BhZCk6CisJICBQcm90ZWN0IGxpc3RzIGFuZCBzdHJ1Y3R1cmVzIHdpdGggbG9ja3MuCisJICBSZXR1cm4gRkxPV19PSyBmcm9tIFJUQ1AgbWVzc2FnZXMgZm9yIG5vdy4KKworMjAwNy0wNC0xMiAwODoxODozMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IEVtaXQgcHQgbWFwIHJlcXVlc3RzIGFuZCBjYWNoZSByZXN1bHRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoY3JlYXRlX3Nlc3Npb24pLCAoZ2V0X3B0X21hcCksCisJICAoY3JlYXRlX3N0cmVhbSksIChnc3RfcnRwX2Jpbl9jbGFzc19pbml0KSwgKHB0X21hcF9yZXF1ZXN0ZWQpOgorCSAgRW1pdCBwdCBtYXAgcmVxdWVzdHMgYW5kIGNhY2hlIHJlc3VsdHMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jbGFzc19pbml0KSwKKwkgIChnc3Rfaml0dGVyX2J1ZmZlcl9zaW5rX3BhcnNlX2NhcHMpLAorCSAgKGdzdF9qaXR0ZXJfYnVmZmVyX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2dldF9jbG9ja19yYXRlKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3ApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOiAoZ3N0X3J0cF9wdF9kZW11eF9jaGFpbik6CisJICBFbWl0IHJlcXVlc3QtcHQtbWFwIHNpZ25hbHMuCisKKzIwMDctMDQtMTEgMTM6NDk6NTQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi1tYXJzaGFsLmxpc3Q6IFNvbWUgbW9yZSBjdXN0b20gbWFyc2hhbGxlcnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLW1hcnNoYWwubGlzdDoKKwkgIFNvbWUgbW9yZSBjdXN0b20gbWFyc2hhbGxlcnMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoY3JlYXRlX3Nlc3Npb24pLCAoZ2V0X3B0X21hcCksCisJICAoY2xvY2tfcmF0ZV9yZXF1ZXN0KSwgKGNyZWF0ZV9zdHJlYW0pLCAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCksCisJICAocHRfbWFwX3JlcXVlc3RlZCksIChuZXdfc3NyY19wYWRfZm91bmQpLCAoY3JlYXRlX3JlY3ZfcnRwKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICBQcmVwYXJlIGZvciBjYWNoaW5nIHB0IG1hcHMuCisJICBDb25uZWN0IHRvIHNpZ25hbHMgdG8gY29sbGVjdCBwdCBtYXBzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzoKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2xhc3NfaW5pdCksCisJICAoZ3N0X2ppdHRlcl9idWZmZXJfc2lua19zZXRjYXBzKSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICBBZGQgcmVxdWVzdF9jbG9ja19yYXRlIHNpZ25hbC4KKwkgIFVzZSBzY2FsZSBpbnN0ZWF0IG9mIHNjYWxlX2ludCBiZWNhdXNlIHRoZSBsYXRlciBkb2VzIG5vdCBkZWFsIHdpdGgKKwkgIG5lZ2F0aXZlIG51bWJlcnMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzogKGdzdF9ydHBfcHRfZGVtdXhfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9wdF9kZW11eF9jaGFpbik6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguaDoKKwkgIEltcGxlbWVudCByZXF1ZXN0LXB0LW1hcCBzaWduYWwuCisKKzIwMDctMDQtMTAgMDk6MTQ6MDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyLzogQWRkZWQgY3VzdG9tIG1hcnNoYWxsZXJzIGZvciBzaWduYWxzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyLy5jdnNpZ25vcmU6CisJICAqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4tbWFyc2hhbC5saXN0OgorCSAgQWRkZWQgY3VzdG9tIG1hcnNoYWxsZXJzIGZvciBzaWduYWxzLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGdzdF9ydHBfYmluX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgIFByZXBhcmUgZm9yIGVtaXRpbmcgcHQgbWFwIHNpZ25hbHMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzogKGdzdF9ydHBfcHRfZGVtdXhfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jOgorCSAgKGdzdF9ydHBfc3NyY19kZW11eF9jbGFzc19pbml0KToKKwkgIEZpeCBzaWduYWxzLgorCisyMDA3LTA0LTA2IDEyOjI4OjI5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uKjogUHJvdmlkZSBhIGNsb2NrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9iaW5faW5pdCksIChnc3RfcnRwX2Jpbl9wcm92aWRlX2Nsb2NrKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmg6CisJICBQcm92aWRlIGEgY2xvY2suCisKKzIwMDctMDQtMDYgMTI6MDc6MzAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGJpbi5jOiBGaXggcGFkIHRlbXBsYXRlIG5hbWUgcGFyc2luZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYzogKGNyZWF0ZV9ydGNwKToKKwkgIEZpeCBwYWQgdGVtcGxhdGUgbmFtZSBwYXJzaW5nLgorCisyMDA3LTA0LTA1IDE2OjEwOjI0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci9nc3RydHBqaXR0ZXJidWZmZXIuYzogQWRkIHNvbWUgZGVidWcgYW5kIGNvbW1lbnRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9qaXR0ZXJfYnVmZmVyX3Npbmtfc2V0Y2FwcyksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4pLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9sb29wKToKKwkgIEFkZCBzb21lIGRlYnVnIGFuZCBjb21tZW50cy4KKwkgIEZpeCBkb3VibGUgdW5yZWYoKSBpbiBlcnJvciBjYXNlcy4KKworMjAwNy0wNC0wNSAxMzo1NDoyMyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLio6IEFkZCBkZWJ1Z2dpbmcgY2F0ZWdvcnkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChmaW5kX3Nlc3Npb25fYnlfaWQpLAorCSAgKGNyZWF0ZV9zZXNzaW9uKSwgKGZpbmRfc3RyZWFtX2J5X3NzcmMpLCAoY3JlYXRlX3N0cmVhbSksCisJICAoZ3N0X3J0cF9iaW5fY2xhc3NfaW5pdCksIChuZXdfcGF5bG9hZF9mb3VuZCksCisJICAobmV3X3NzcmNfcGFkX2ZvdW5kKSwgKGNyZWF0ZV9yZWN2X3J0cCksIChjcmVhdGVfcmVjdl9ydGNwKSwKKwkgIChjcmVhdGVfc2VuZF9ydHApLCAoY3JlYXRlX3J0Y3ApOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgIEFkZCBkZWJ1Z2dpbmcgY2F0ZWdvcnkuCisJICBBZGRlZCBSVFBTdHJlYW0gdG8gbWFuYWdlIHN0cmVhbSBwZXIgU1NSQywgZWFjaCB3aXRoIGl0cyBvd24KKwkgIGppdHRlcmJ1ZmZlciBhbmQgcHRkZW11eC4KKwkgIEFkZGVkIFNTUkNEZW11eC4KKwkgIENvbm5lY3QgdG8gdmFyaW91cyBTU1JDIGFuZCBQVCBzaWduYWxzIGFuZCBjcmVhdGUgZ2hvc3RwYWRzLCBsaW5rIHN0dWZmLgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBtYW5hZ2VyLmM6IChwbHVnaW5faW5pdCk6CisJICBBZGRlZCBydHBiaW4gdG8gZWxlbWVudHMuCisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYzogKGdzdF9ydHBfcHRfZGVtdXhfY2hhaW4pOgorCSAgRml4IGNhcHMgYW5kIGZvcndhcmQgR3N0Rmxvd1JldHVybgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3JlY3ZfcnRwX3NpbmspLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9jaGFpbl9yZWN2X3J0cCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3JlY3ZfcnRjcF9zaW5rKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fY2hhaW5fcmVjdl9ydGNwKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fZXZlbnRfc2VuZF9ydHBfc2luayksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3NlbmRfcnRwKSwgKGNyZWF0ZV9yZWN2X3J0cF9zaW5rKSwKKwkgIChjcmVhdGVfcmVjdl9ydGNwX3NpbmspLCAoY3JlYXRlX3NlbmRfcnRwX3NpbmspLCAoY3JlYXRlX3J0Y3Bfc3JjKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fcmVxdWVzdF9uZXdfcGFkKToKKwkgIEFkZCBkZWJ1ZyBjYXRlZ29yeS4KKwkgIEFkZCBldmVudCBoYW5kbGluZworCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYzogKGZpbmRfcnRwX3BhZF9mb3Jfc3NyYyksCisJICAoY3JlYXRlX3J0cF9wYWRfZm9yX3NzcmMpLCAoZ3N0X3J0cF9zc3JjX2RlbXV4X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfc3NyY19kZW11eF9pbml0KSwgKGdzdF9ydHBfc3NyY19kZW11eF9jaGFpbiksCisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5oOgorCSAgQWRkIGRlYnVnIGNhdGVnb3J5LgorCSAgQWRkIG5ldy1wdC1wYWQgc2lnbmFsLgorCisyMDA3LTA0LTA0IDEwOjIzOjE1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwbWFuYWdlci86IEFkZGVkIHNpbXBsZSBTU1JDIGRlbXV4ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG1hbmFnZXIuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc3NyY2RlbXV4LmM6IChmaW5kX3BhZF9mb3Jfc3NyYyksCisJICAoY3JlYXRlX3BhZF9mb3Jfc3NyYyksIChnc3RfcnRwX3NzcmNfZGVtdXhfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX3NzcmNfZGVtdXhfY2xhc3NfaW5pdCksIChnc3RfcnRwX3NzcmNfZGVtdXhfaW5pdCksCisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X2ZpbmFsaXplKSwgKGdzdF9ydHBfc3NyY19kZW11eF9zaW5rX2V2ZW50KSwKKwkgIChnc3RfcnRwX3NzcmNfZGVtdXhfY2hhaW4pLCAoZ3N0X3J0cF9zc3JjX2RlbXV4X3NyY19ldmVudCksCisJICAoZ3N0X3J0cF9zc3JjX2RlbXV4X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5oOgorCSAgQWRkZWQgc2ltcGxlIFNTUkMgZGVtdXhlci4KKworMjAwNy0wNC0wMyAxMTozNTozOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cG1hbmFnZXIvOiBTb21lIG1vcmUgZ2hvc3RwYWQgbWFnaWMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChmaW5kX3Nlc3Npb25fYnlfaWQpLAorCSAgKGNyZWF0ZV9zZXNzaW9uKSwgKGdzdF9ydHBfYmluX2Jhc2VfaW5pdCksIChjcmVhdGVfcmVjdl9ydHApLAorCSAgKGNyZWF0ZV9yZWN2X3J0Y3ApLCAoY3JlYXRlX3NlbmRfcnRwKSwgKGNyZWF0ZV9ydGNwKSwKKwkgIChnc3RfcnRwX2Jpbl9yZXF1ZXN0X25ld19wYWQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwY2xpZW50LmM6CisJICBTb21lIG1vcmUgZ2hvc3RwYWQgbWFnaWMuCisKKzIwMDctMDQtMDMgMDk6NTE6MTMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOiBBZGQgLmggZmlsZSBzbyBpdCBjYW4gYmUgZGlzdGVkIHByb3Blcmx5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL01ha2VmaWxlLmFtOgorCSAgQWRkIC5oIGZpbGUgc28gaXQgY2FuIGJlIGRpc3RlZCBwcm9wZXJseS4KKworMjAwNy0wNC0wMyAwOToxMzoxNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgQWRkIFJUUCBzZXNzaW9uIG1hbmFnZW1lbnQgZWxlbWVudHMuIFN0aWxsIGluIHByb2dyZXNzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHBtYW5hZ2VyL2FzeW5jX2ppdHRlcl9xdWV1ZS5jOiAoYXN5bmNfaml0dGVyX3F1ZXVlX25ldyksCisJICAoc2lnbmFsX3dhaXRpbmdfdGhyZWFkcyksIChhc3luY19qaXR0ZXJfcXVldWVfcmVmKSwKKwkgIChhc3luY19qaXR0ZXJfcXVldWVfcmVmX3VubG9ja2VkKSwKKwkgIChhc3luY19qaXR0ZXJfcXVldWVfc2V0X2xvd190aHJlc2hvbGQpLAorCSAgKGFzeW5jX2ppdHRlcl9xdWV1ZV9zZXRfaGlnaF90aHJlc2hvbGQpLAorCSAgKGFzeW5jX2ppdHRlcl9xdWV1ZV9zZXRfbWF4X3F1ZXVlX2xlbmd0aCksCisJICAoYXN5bmNfaml0dGVyX3F1ZXVlX2dldF9nX3F1ZXVlKSwgKGNhbGN1bGF0ZV90c19kaWZmKSwKKwkgIChhc3luY19qaXR0ZXJfcXVldWVfbGVuZ3RoX3RzX3VuaXRzX3VubG9ja2VkKSwKKwkgIChhc3luY19qaXR0ZXJfcXVldWVfdW5yZWZfYW5kX3VubG9jayksIChhc3luY19qaXR0ZXJfcXVldWVfdW5yZWYpLAorCSAgKGFzeW5jX2ppdHRlcl9xdWV1ZV9sb2NrKSwgKGFzeW5jX2ppdHRlcl9xdWV1ZV91bmxvY2spLAorCSAgKGFzeW5jX2ppdHRlcl9xdWV1ZV9wdXNoKSwgKGFzeW5jX2ppdHRlcl9xdWV1ZV9wdXNoX3VubG9ja2VkKSwKKwkgIChhc3luY19qaXR0ZXJfcXVldWVfcHVzaF9zb3J0ZWQpLAorCSAgKGFzeW5jX2ppdHRlcl9xdWV1ZV9wdXNoX3NvcnRlZF91bmxvY2tlZCksCisJICAoYXN5bmNfaml0dGVyX3F1ZXVlX2luc2VydF9hZnRlcl91bmxvY2tlZCksCisJICAoYXN5bmNfaml0dGVyX3F1ZXVlX3BvcF9pbnRlcm5fdW5sb2NrZWQpLCAoYXN5bmNfaml0dGVyX3F1ZXVlX3BvcCksCisJICAoYXN5bmNfaml0dGVyX3F1ZXVlX3BvcF91bmxvY2tlZCksIChhc3luY19qaXR0ZXJfcXVldWVfbGVuZ3RoKSwKKwkgIChhc3luY19qaXR0ZXJfcXVldWVfbGVuZ3RoX3VubG9ja2VkKSwKKwkgIChhc3luY19qaXR0ZXJfcXVldWVfc2V0X2ZsdXNoaW5nX3VubG9ja2VkKSwKKwkgIChhc3luY19qaXR0ZXJfcXVldWVfdW5zZXRfZmx1c2hpbmdfdW5sb2NrZWQpLAorCSAgKGFzeW5jX2ppdHRlcl9xdWV1ZV9zZXRfYmxvY2tpbmdfdW5sb2NrZWQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9hc3luY19qaXR0ZXJfcXVldWUuaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmM6IChnc3RfcnRwX2Jpbl9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfYmluX2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9iaW5faW5pdCksCisJICAoZ3N0X3J0cF9iaW5fZmluYWxpemUpLCAoZ3N0X3J0cF9iaW5fc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2Jpbl9nZXRfcHJvcGVydHkpLCAoZ3N0X3J0cF9iaW5fY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcnRwX2Jpbl9yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X3J0cF9iaW5fcmVsZWFzZV9wYWQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaDoKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwY2xpZW50LmM6IChuZXdfcGFkKSwgKGNyZWF0ZV9zdHJlYW0pLAorCSAgKGZyZWVfc3RyZWFtKSwgKGZpbmRfc3RyZWFtX2J5X3NzcmMpLCAoZ3N0X3J0cF9jbGllbnRfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX2NsaWVudF9jbGFzc19pbml0KSwgKGdzdF9ydHBfY2xpZW50X2luaXQpLAorCSAgKGdzdF9ydHBfY2xpZW50X2ZpbmFsaXplKSwgKGdzdF9ydHBfY2xpZW50X3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9jbGllbnRfZ2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBfY2xpZW50X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0cF9jbGllbnRfcmVxdWVzdF9uZXdfcGFkKSwgKGdzdF9ydHBfY2xpZW50X3JlbGVhc2VfcGFkKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwY2xpZW50Lmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jbGFzc19pbml0KSwgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9pbml0KSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZGlzcG9zZSksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0Y2FwcyksCisJICAoZ3N0X2ppdHRlcl9idWZmZXJfc2lua19zZXRjYXBzKSwgKGZyZWVfZnVuYyksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoX3N0YXJ0KSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZmx1c2hfc3RvcCksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NyY19hY3RpdmF0ZV9wdXNoKSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhbmdlX3N0YXRlKSwgKHByaXZfY29tcGFyZV9ydHBfc2VxX2x0KSwKKwkgIChjb21wYXJlX3J0cF9idWZmZXJzX3NlcV9udW0pLCAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpbmtfZXZlbnQpLAorCSAgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbiksIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCksCisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3F1ZXJ5KSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmg6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cG1hbmFnZXIuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5jOiAoZ3N0X3J0cF9wdF9kZW11eF9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfcHRfZGVtdXhfY2xhc3NfaW5pdCksIChnc3RfcnRwX3B0X2RlbXV4X2luaXQpLAorCSAgKGdzdF9ydHBfcHRfZGVtdXhfZmluYWxpemUpLCAoZ3N0X3J0cF9wdF9kZW11eF9jaGFpbiksCisJICAoZ3N0X3J0cF9wdF9kZW11eF9nZXRjYXBzKSwgKGZpbmRfcGFkX2Zvcl9wdCksCisJICAoZ3N0X3J0cF9wdF9kZW11eF9zZXR1cCksIChnc3RfcnRwX3B0X2RlbXV4X3JlbGVhc2UpLAorCSAgKGdzdF9ydHBfcHRfZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5oOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmM6IChnc3RfcnRwX3Nlc3Npb25fYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fY2xhc3NfaW5pdCksIChnc3RfcnRwX3Nlc3Npb25faW5pdCksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2ZpbmFsaXplKSwgKGdzdF9ydHBfc2Vzc2lvbl9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9nZXRfcHJvcGVydHkpLCAoZ3N0X3J0cF9zZXNzaW9uX2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3JlY3ZfcnRwKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fY2hhaW5fcmVjdl9ydGNwKSwKKwkgIChnc3RfcnRwX3Nlc3Npb25fY2hhaW5fc2VuZF9ydHApLCAoY3JlYXRlX3JlY3ZfcnRwX3NpbmspLAorCSAgKGNyZWF0ZV9yZWN2X3J0Y3Bfc2luayksIChjcmVhdGVfc2VuZF9ydHBfc2luayksIChjcmVhdGVfcnRjcF9zcmMpLAorCSAgKGdzdF9ydHBfc2Vzc2lvbl9yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X3J0cF9zZXNzaW9uX3JlbGVhc2VfcGFkKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwc2Vzc2lvbi5oOgorCSAgQWRkIFJUUCBzZXNzaW9uIG1hbmFnZW1lbnQgZWxlbWVudHMuIFN0aWxsIGluIHByb2dyZXNzLgorCisyMDA5LTA4LTEwIDEzOjMwOjIzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHB1c2ggbW9kZTsgY2F0ZXIgZm9yIGNodW5rIHBhZGRpbmcKKworMjAwOS0wOC0wNCAxOTo0NTo0MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBvbmx5IHVzZSBzdHJlYW0ncyBwYWQgYWZ0ZXIgaGF2aW5nIGNoZWNrZWQgaXQgZXhpc3RzCisKKzIwMDktMDgtMDQgMTM6Mzg6MDkgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogc3ByaW5rbGUgc29tZSBtb3JlIEdTVF9ERUJVR19GVU5DUFRSCisKKzIwMDktMDgtMDQgMTM6MzY6MzYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogcG9zdCBlcnJvciBtZXNzYWdlIGlmIG5vIHBhZHMgdG8gcHVzaCBFT1MgZXZlbnQgb24KKworMjAwOS0wOC0wNCAxMTozOTo1OSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggdHlwbyBpbiB3YXJuaW5nIG1lc3NhZ2UKKworMjAwOS0wOC0wNCAxMTozOTozOSArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggc29tZSBidWZmZXIgcmVmIGhhbmRsaW5nCisKKzIwMDktMDgtMDQgMTE6Mzc6MTYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZG8gbm90IGV4Y2VlZCBtYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgc3RyZWFtcworCisyMDA5LTA4LTA0IDExOjM1OjE4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHByZXZlbnQgZG91YmxlIHVucmVmOyBnc3RfYXZpX2RlbXV4X3BhcnNlX2F2aWggYWxyZWFkeSB1bnJlZnMKKworMjAwOS0wOC0wNCAxMTozMjoyNyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiB2ZXJpZnkgc2l6ZSBvZiBJTkZPIExJU1QgdG8gc2F0aXNmeSBzdWJzZXF1ZW50IGV4cGVjdGF0aW9ucworCisyMDA5LTA3LTI5IDE1OjI1OjM4ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGNoZWNrIHZpZGVvIHN0cmVhbSBmcmFtZXJhdGUgYWdhaW5zdCBhdmkgaGVhZGVyIGZyYW1lIGR1cmF0aW9uCisJICBUaGUgZm9ybWVyIG1pZ2h0IGJlIGJvZ3VzIGluIHNpbGx5IGNhc2VzLCBhbmQgdGhlIGxhdHRlciBzZWVtcyB0bworCSAgY2FycnkgbW9yZSB3ZWlnaHQuCisKKzIwMDktMDgtMDQgMTI6MTY6MTMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogc3RyZWFtbGluZSBzdHJlYW0gZHVyYXRpb24gY2FsY3VsYXRpb24KKworMjAwOS0wNy0wMyAxNDowNDoxMyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJICBkdjEzOTRzcmM6IEZpeCBlbGVtZW50IGZvciBsaXZlIHVzYWdlLi4uIHdoaWNoIGhhcyBiZWVuIGJyb2tlbiBmb3IgMiB5ZWFycyA6KAorCSAgVGhpcyBpcyBhIGxpdmUgc291cmNlLCB0aGVyZWZvcmU6CisJICAqIFVzZSBHU1RfRk9STUFUX1RJTUUgYXMgdGhlIGRlZmF1bHQgZm9ybWF0CisJICAqIHNldF90aW1lc3RhbXAgdG8gVHJ1ZQorCSAgKiBwcm9wZXJseSBpbXBsZW1lbnQgcXVlcnkgbGF0ZW5jeS4KKwkgIFRoaXMgYWxsb3dzIGV4cGVjdGVkIGxpdmUgdXNhZ2UgbGlrZSA6IHBsYXliaW4yIHVyaT1kdjovLworCisyMDA5LTA4LTA5IDA5OjQzOjQxICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkgIHJhdzEzOTQ6IFJlbW92ZSB1bm5lZWRlZCB2YXJpYWJsZQorCisyMDA5LTA4LTA5IDA5OjQzOjI5ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thOiByZW1vdmUgZGVhZCBhc3NpZ25tZW50cworCisyMDA5LTA4LTA5IDA5OjQzOjAwICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkgIHJ0cDogUmVtb3ZlIGRlYWQgYXNzaWdubWVudHMgYW5kIHJlc3VsdGluZyB1bm5lZWRlZCB2YXJpYWJsZXMuCisKKzIwMDktMDgtMTAgMDk6NTM6MjggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvd2F2cGFjay9NYWtlZmlsZS5hbToKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaDoKKwkqIGV4dC93YXZwYWNrL21kNS5jOgorCSogZXh0L3dhdnBhY2svbWQ1Lmg6CisJICB3YXZwYWNrOiBVc2UgR0xpYiBHQ2hlY2tzdW0gaW5zdGVhZCBvZiBvdXIgb3duIE1ENSBpbXBsZW1lbnRhdGlvbgorCSAgVGhpcyByZXF1aXJlcyBHTGliIDIuMTYgYnV0IHRoYXQgdmVyc2lvbiBpcyBhbHJlYWR5IHJlcXVpcmVkIGJ5IGNvcmUgYW55d2F5LgorCisyMDA5LTA4LTA4IDAwOjQ3OjQ4IC0wMzAwICBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5icj4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJICBtYXRyb3NrYTogQWRkcyBzdXBwb3J0IHRvIG11eGluZy9kZW11eGluZyBXTUEKKwkgIEFkZHMgc3VwcG9ydCBmb3IgbXV4aW5nIHdtYSBhdWRpbyBmYW1pbHkgYW5kIGZpeGVzCisJICBkZW11eGluZyBvZiB3bWEgZmFtaWx5IGluIG1hdHJvc2thZGVtdXguIG1hdHJvc2thZGVtdXgKKwkgIHdhcyBicm9rZW4gYmVjYXVzZSBpdCBtaXNzZWQgY29kZWNfZGF0YS4KKworMjAwOS0wOC0wNiAyMDoxNToxNyAtMDMwMCAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thbXV4OiBhZGRzIHN1cHBvcnQgZm9yIHdtdiBmYW1pbHkKKwkgIEFkZHMgc3VwcG9ydCB0byBXTVYxLCBXTVYyLCBXTVYzIGFuZCBvdGhlciBmYW1pbHkgZm9ybWF0cyB0aGF0CisJICBhcmUgc2lnbmFsZWQgYnkgdGhlICdmb3JtYXQnIGZpZWxkIGluIHRoZSBjYXBzIChpLmUuIFdWQzEpLgorCSAgUGFydGlhbGx5IGZpeGVzICM1NzYzNzgKKworMjAwOS0wOC0wOSAxNDoxOTo0MiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgIHY0bDJzcmM6IGlmIG1heCA9PSBtaW4gd2lkdGgvaGVpZ2h0IHB1dCBhbiBpbnQgaW4gdGhlIHByb2JlZCBjYXBzLCBub3QgYW4gaW50IHJhbmdlCisJICBGaXhlcyAjNTYwMDMzLgorCisyMDA5LTA4LTA5IDEzOjU4OjA3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJICBvc3hhdWRpb3NyYzogaWYgbWF4X2NoYW5uZWxzID09IG1pbl9jaGFubmVscywgdXNlIGFuIGludCBpbnN0ZWFkIG9mIGFuIGludCByYW5nZSBpbiB0aGUgY2FwcworCisyMDA5LTA4LTA5IDEyOjUyOjE3ICswMjAwICBMb25lU3RhciA8bG9uZUBhdXZ0ZWNoLmNvbT4KKworCSogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6CisJICBpZDNkZW11eDogVHJ5IEdTVF8qX1RBR19FTkNPRElORyBhbmQgbG9jYWxlIGVuY29kaW5nIGlmIHRhZ3MgYXJlIG5vdCBVVEY4CisJICBGaXhlcyBidWcgIzQ5OTI0Mi4KKworMjAwOS0wOC0wOSAwMToyOTo1MCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGNvbmZpZ3VyZTogYnVtcCBjb3JlL2Jhc2UgcmVxdWlyZW1lbnRzIHRvIGxhdGVzdCByZWxlYXNlCisJICBUbyBhdm9pZCBjb25mdXNpb24uCisKKzIwMDktMDgtMDkgMDE6Mjc6MDEgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZtdXguYzoKKwkgIGNoZWNrOiBmaXggZmx2bXV4IHVuaXQgdGVzdCBvbiBiaWcgZW5kaWFuIG1hY2hpbmVzCisJICBmbHZtdXggb25seSBhY2NlcHRzIHJhdyBhdWRpbyBpbiBsaXR0bGUgZW5kaWFuLCBidXQgYXVkaW90ZXN0c3JjCisJICBwcm9kdWNlcyBhdWRpbyBpbiB0aGUgbmF0aXZlIGVuZGlhbm5lc3MsIHdoaWNoIG1ha2VzIGxpbmtpbmcKKwkgIGJldHdlZW4gYXVkaW90ZXN0c3JjIGFuZCBmbHZtdXggZmFpbCBvbiBiaWcgZW5kaWFuIG1hY2hpbmVzLiBBZGQKKwkgIGFuIGF1ZGlvY29udmVydCBlbGVtZW50IGluIGJldHdlZW4gdGhlIHR3byB0byBmaXggdGhpcy4KKworMjAwOS0wMi0xNSAxODo0OTo0NCArMDAwMCAgVmluY2VudCBQZW5xdWVyYydoIDxvZ2cuay5vZ2cua0Bnb29nbGVtYWlsLmNvbT4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBtYXRyb3NrYTogYWRkIGthdGUgc3VidGl0bGUgc3VwcG9ydCB0byBtYXRyb3NrYSBtdXhlciBhbmQgZGVtdXhlcgorCSAgU2VlICM1MjU3NDMuCisKKzIwMDktMDgtMDcgMTY6NTE6NDUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaWQzZGVtdXgvaWQzdjIuMy4wLmh0bWw6CisJICBpZDNkZW11eDogYWRkIElEMyB2Mi4zIHNwZWMgYXMgd2VsbAorCisyMDA5LTA4LTA3IDE2OjQyOjM5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6CisJICBpZDNkZW11eDogc2l6ZXMgaW4gSUQzIHYyLjMgYXJlIHVubGlrZWx5IHRvIGJlIHN5bmMtc2FmZSBpbnRlZ2VycworCSAgSW4gSUQzIHYyLjMgY29tcHJlc3NlZCBmcmFtZXMgd2lsbCBoYXZlIGEgNC1ieXRlIGRhdGEgbGVuZ3RoIGluZGljYXRvcgorCSAgYWZ0ZXIgdGhlIGZyYW1lIGhlYWRlciB0byBpbmRpY2F0ZSB0aGUgc2l6ZSBvZiB0aGUgZGVjb21wcmVzc2VkIGRhdGEuCisJICBUaGlzIGludGVnZXIgaXMgdW5saWtlbHkgdG8gYmUgYSBzeW5jLXNhZmUgaW50ZWdlciBmb3IgdjIuMyB0YWdzLAorCSAgb25seSBpbiB2Mi40IGl0J3Mgc3luYy1zYWZlLgorCisyMDA5LTA4LTA3IDE2OjM2OjU1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzoKKwkgIGlkM2RlbXV4OiBmaXggdHlwbyBpbiBkZWJ1ZyBtZXNzYWdlCisKKzIwMDktMDgtMDcgMTY6MDI6MjMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOgorCSogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuaDoKKwkqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzZGVtdXguYzoKKwkqIHRlc3RzL2ZpbGVzL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZmlsZXMvaWQzLTU4ODE0OC11bnN5bmNlZC12MjQudGFnOgorCSAgaWQzZGVtdXg6IGZpeCBwYXJzaW5nIG9mIHVuc3luYydlZCBJRDMgdjIuNCB0YWdzIGFuZCBmcmFtZXMKKwkgIFJldmVyc2luZyB0aGUgdW5zeW5jaHJvbmlzYXRpb24gc2VlbXMgdG8gd29yayBzbGlnaHRseSBkaWZmZXJlbnRseQorCSAgZm9yIElEMyB2Mi4zIHRhZ3MgYW5kIHYyLjQgdGFnczogdjIuMyB0YWdzIGRvbid0IGhhdmUgc3luY3NhZmUgZnJhbWUKKwkgIHNpemVzIGluIHRoZSBmcmFtZSBoZWFkZXIsIHNvIHRoZSB1bnN5bmNocm9uaXNhdGlvbiBpcyBhcHBsaWVkIHRvCisJICB0aGUgd2hvbGUgZnJhbWUgZGF0YSBpbmNsdWRpbmcgYWxsIHRoZSBmcmFtZSBoZWFkZXJzLiB2Mi40IGZyYW1lcworCSAgaGF2ZSBzeW5jLXNhZmUgc2l6ZXMsIGhvd2V2ZXIsIHNvIHRoZSB1bnN5bmNocm9uaXNhdGlvbiBvbmx5IG5lZWRzCisJICB0byBiZSBhcHBsaWVkIHRvIHRoZSBhY3R1YWwgZnJhbWUgZGF0YSwgYW5kIGl0IHNlZW1zIHRoYXQncyB3aGF0J3MKKwkgIGJlaW5nIGRvbmUgYXMgd2VsbC4gU28gd2UgbmVlZCB0byB1bmRvIHRoZSB1bnN5bmNocm9uaXNhdGlvbiBvbiBhCisJICBwZXItZnJhbWUgYmFzaXMgZm9yIHYyLjQgdGFncyBmb3IgdGhpbmdzIHRvIHdvcmsgcHJvcGVybHkuCisJICBGaXhlcyBleHRyYWN0aW9uIG9mIGNvdmVyYXJ0L2ltYWdlcyBmcm9tIEFQSUMgZnJhbWVzIGluIElEMyB2Mi40CisJICB0YWdzICgjNTg4MTQ4KS4KKwkgIEFkZCB1bml0IHRlc3QgZm9yIHRoaXMgYXMgd2VsbC4KKworMjAwOS0wOC0wNiAyMToyNDoxNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBzb3VwaHR0cHNyYzogVXNlIFNPVVBfTUVUSE9EX0dFVCBpbnN0ZWFkIG9mICJHRVQiIHN0cmluZworCSAgRml4ZXMgYnVnICM1OTA5NzAuCisKKzIwMDktMDgtMDYgMTM6MDA6NTkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzcmM6IHNldCB0aGUgZGVmYXVsdCBzbGF2ZSBtZXRob2QgdG8gc2tldworCSAgU2V0IHRoZSBkZWZhdWx0IHNsYXZlIG1ldGhvZCB0byB0aGUgbXVjaCBiZXR0ZXIgc2tldyBhbGdvcml0aG0uIFRoaXMgaXMgdGhlCisJICBkZWZhdWx0IGluIHRoZSBuZXcgYmFzZSBjbGFzcyBidXQgd2Ugb3ZlcnJpZGUgdGhpcyBoZXJlIGFzIHdlbGwgZm9yIHRoZQorCSAgdXBjb21taW5nIHJlbGVhc2UuCisKKzIwMDktMDgtMDYgMTA6MjA6MzQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBmaXggY29tcGlsYXRpb24gd2l0aCAtLWRpc2FibGUtZ3N0LWRlYnVnCisKKzIwMDktMDgtMDMgMTg6NTk6MzIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBydHBoMjY0cGF5OiB1c2UgYXJyYXkgaW5zdGVhZCBvZiBxdWV1ZQorCisyMDA5LTA4LTAzIDE4OjU1OjE5ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuaDoKKwkgIHJ0cGgyNjRwYXk6IHB1c2ggTkFMcyBvbmx5IGFmdGVyIFNQUy9QUFMKKwkgIHBhcnNlIGNvbXBsZXRlIChieXRlc3RyZWFtKSBidWZmZXIgZm9yIFNQUy9QUFMgYmVmb3JlIHB1c2hpbmcgTkFMcy4KKwkgIEZpeGVzICM1NjQ1MDEuCisKKzIwMDktMDgtMDQgMTQ6NDQ6MzYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJICB2NGwyOiBEaXJlY3RseSB1c2UgR1NUX1BUUl9GT1JNQVQgZm9yIHByaW50aW5nIGNhcHMgd2l0aCB0aGUgTE9HX0NBUFMgbWFjcm8KKworMjAwOS0wOC0wNCAxMToxNzoxNyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSAgcnRwcWRtMmRlcGF5OiBGaXggZGVidWcgc3RhdGVtZW50LgorCisyMDA5LTA4LTA0IDA5OjMyOjA3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuaDoKKwkgIHY0bDI6IFJlbW92ZSBzb21lIE9NQVAgc3BlY2lmaWMgaGFja3MKKwkgIFRoZXkgcmVxdWlyZSBzcGVjaWFsIGJ1aWxkIGZsYWdzIGFuZCBhcmUgbm90IHVzZWZ1bCBpbiBnZW5lcmFsLgorCisyMDA5LTA4LTA0IDA5OjIyOjI5ICswMjAwICBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDJzaW5rOiBjaGFuZ2Ugd2hlcmUgYnVmZmVycyBnZXQgZGVxdWV1ZWQKKwkgIEl0IHNlZW1zIHRvIGNhdXNlIHN0cmFuZ2Ugb2NjYXNpb25hbCBoaWdoIGxhdGVuY2llcyAoYWxtb3N0IDIwMG1zKSB3aGVuIGRlcXVldWluZyBidWZmZXJzIGZyb20gX2J1ZmZlcl9hbGxvYygpLiAgSXQgaXMgc2ltcGxlciBhbmQgc2VlbXMgdG8gd29yayBtdWNoIGJldHRlciB0byBkcWJ1ZiBmcm9tIHRoZSBzYW1lIHRocmVhZCB0aGF0IGlzIHF1ZXVpbmcgdGhlIG5leHQgYnVmZmVyLgorCisyMDA5LTA4LTA0IDA5OjE0OjIwICswMjAwICBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3Y0bDIvZ3N0djRsMi5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc2luay5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNpbmsuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuaDoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuaDoKKwkgIHY0bDI6IEFkZCB2NGwyc2luayBlbGVtZW50CisJICBUaGlzIGFsc28gZG9lcyB0aGUgZm9sbG93aW5nIGNoYW5nZXM6CisJICAoMSkgcHVsbCB0aGUgYnVmZmVycG9vbCBjb2RlIG91dCBpbnRvIGdzdHY0bDJidWZmZXJwb29sLmMsIGFuZCBtYWtlIGEKKwkgIGJpdCBtb3JlIGdlbmVyaWMgc28gaXQgY2FuIGJlIHVzZWQgYm90aCBmb3IgdjRsMnNyYyBhbmQgdjRsMnNpbmsKKwkgICgyKSBtb3ZlIHNvbWUgb2YgdGhlIGRldmljZSBwcm9iaW5nL2NvbmZpZ3VyYXRpb24vY2FwcyBzdHVmZiBpbnRvCisJICBnc3R2NGwyb2JqZWN0LmMgc28gaXQgZG9lcyBub3QgaGF2ZSB0byBiZSBkdXBsaWNhdGVkIGJldHdlZW4KKwkgIHY0bDJzcmMgYW5kIHY0bDJzaW5rCisJICBGaXhlcyBidWcgIzU5MDI4MC4KKworMjAwOS0wOC0wNCAwNzowNzo0NSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgZmx2bXV4OiBFbmFibGUgdW5pdCB0ZXN0IG5vdyB0aGF0IGl0IHBhc3NlcworCisyMDA5LTA4LTAzIDIxOjIxOjM5ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSAgcnRwcWRtMmRlcGF5LHJ0cHN2M3ZkZXBheTogQWRkIGRlYnVnZ2luZyBjYXRlZ29yeS4KKworMjAwOS0wOC0wMyAyMToyMjo0OCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5oOgorCSAgcnRwcWRtMmRlcGF5OiBIYW5kbGUgZ2FwcyBpbiBpbmNvbWluZyBwYWNrZXRzLgorCSAgV2hlbmV2ZXIgd2Ugc2VlIGEgZ2FwLCB3ZSBmbHVzaCB0aGUgdGVtcG9yYXJ5IHBhY2tldHMgKGJ1dCBub3QgdGhlIGFkYXB0ZXIpLiBJZiB3ZQorCSAgaGFkIHNvbWUgZGF0YSB0ZW1wb3JhcmlseSBzdG9yZWQgaXQgd2lsbCBiZSBvdXRwdXR0ZWQgKHRoZSBzb3VuZCB3aWxsIHNvdW5kIGEgYml0CisJICBnYXJibGVkLi4uIGJ1dCB0aGF0J3MgaG93IGl0IHNvdW5kcyBvbiBNYWNPU1ggOikKKworMjAwOS0wOC0wMyAxOTowMTowNyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jOgorCSAgcnRwcWRtZGVwYXk6IEZpeCBDUkMgY2FsY3VsYXRpb24gYW5kIHJlbW92ZSBjb21tZW50ZWQgY29kZS4KKworMjAwOS0wOC0wMiAxMzo0MjoxMiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHFkbWRlcGF5Lmg6CisJICBydHA6IE5ldyBRRE0yIHJ0cCBkZXBheWxvYWRlci4KKwkgIFJldmVyc2UtZW5naW5lZXJlZCBieSBjb21wYXJpbmc6CisJICAqIEEgcnRwIGhpbnRlZCBmaWxlIHByb3ZpZGVkIGJ5IERhcndpblN0cmVhbWluZ1NlcnZlcgorCSAgKiBUaGUgb3V0cHV0IHByb2N1ZWQgYnkgRFNTIGZvciB0aGF0IHNhbWUgZmlsZQorCSAgQWxzbyB1c2VkIHZhcmlvdXMgc3RyZWFtaW5nIHNvdXJjZXMgYXZhaWxhYmxlIG9uIHRoZSBpbnRlcm5ldCB0byBmaW5lLXR1bmUKKwkgIHRoZSBjb2RlLgorCSAgVGhlIGhlYWRlci9jb2RlY19kYXRhIGV4dHJhY3Rpb24gbWV0aG9kcyBhcmUgZnJvbSBGRk1wZWcgKExHUEwpLgorCisyMDA5LTA4LTAzIDIxOjI0OjQ0ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSAgcnRwc3YzdmRlcGF5OiBQcm9wZXJseSBmaWxsIGNvZGVjX2RhdGEgYW5kIGNsZWFudXAgY29kZSBhIGJpdGUgbW9yZS4KKworMjAwOS0wOC0wMyAxOTowMjoxNyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5Lmg6CisJICBydHBzdjN2ZGVwYXk6IE9ubHkgb3V0cHV0IGJ1ZmZlcnMgb25jZSB3ZSdyZSBjb25maWd1cmVkLgorCisyMDA5LTA4LTAzIDE5OjAyOjAwICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSAgcnRwc3YzdmRlcGF5OiBBZGQgbW9yZSBlbmNvZGluZy1uYW1lIHZhcmlhbnRzCisKKzIwMDktMDgtMDMgMjA6MDg6MzMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZtdXguYzoKKwkgIGZsdm11eDogRml4IHVuaXQgdGVzdCB0byBjb3JyZWN0bHkgaGFuZGxlIHJlcXVlc3QgcGFkcworCSAgUmVxdWVzdCBwYWRzIGFyZSByZW1vdmVkIGJ5IHRoZSBlbGVtZW50IGluc3RhbmNlIGluIFBBVVNFRC0+UkVBRFkKKwkgIHNvIHdlIG5lZWQgdG8gcmUtcmVxdWVzdCBwYWRzIGZvciBldmVyeSBydW4gYW5kIGxpbmsgdGhlbSBhZ2Fpbi4KKwkgIExhc3QgZml4IGZvciBidWcgIzU5MDQ0Ny4KKworMjAwOS0wOC0wMyAyMDowODowMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJICBmbHZtdXg6IEZpeCB3cml0aW5nIG9mIHRoZSBpbmRleCBmb3IgPCAxMjggYnVmZmVycworCSAgUGFydGlhbGx5IGZpeGVzIGJ1ZyAjNTkwNDQ3LgorCisyMDA5LTA4LTAzIDIwOjA3OjAwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogRml4IHJlc2V0dGluZyBvZiB0aGUgZWxlbWVudAorCSAgUmVzZXQgdGhlIGhhdmVfdmlkZW8vaGF2ZV9hdWRpbyBmbGFncyBhbmQgbWFrZSBzdXJlIHRvCisJICBwcm9wZXJseSByZWxlYXNlIHRoZSByZXF1ZXN0IHBhZHMuCisJICBQYXJ0aWFsbHkgZml4ZXMgYnVnICM1OTA0NDcuCisKKzIwMDktMDgtMDMgMTg6MTM6NDYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRvbid0IGFkZCBub24tdXRmOCBjaGFycyB0byBzdHJ1Y3R1cmVzCisKKzIwMDktMDgtMDMgMTg6MDI6MzEgKzAyMDAgIEx1YyBEZXNjaGVuYXV4IDxsdWMuZGVzY2hlbmF1eCBhdCBmcmVlc3VyZi5jaD4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5Lmg6CisJICBqcGVnZGVwYXk6IHVzZSBhdHRyaWJ1dGVzIGZvciBleHRyYSBwcm9wZXJ0aWVzCisJICBVc2Ugc29tZSBvZiB0aGUgU0RQIGF0dHJpYnV0ZXMgd2hlbiB0aGV5IGFyZSBwcmVzZW50IHRvIHNwZWNpZnkgdGhlIG91dHB1dAorCSAgZGltZW5zaW9uIGFuZCBmcmFtZXJhdGUuIFRoaXMgYWxsb3dzIHVzIHRvIHJlY2VpdmUganBlZyBmcmFtZXMgbGFyZ2VyIHRoYW4KKwkgIDIwNDAgd2lkdGgvaGVpZ2h0LgorCSAgRml4ZXMgIzU2NDQzNworCisyMDA5LTA4LTAzIDE4OjAxOjI3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL1JFQURNRToKKwkgIFJUUCBkb2NzOiB1cGRhdGUgd2l0aCBhdHRyaWJ1dGVzIGluIGNhcHMKKworMjAwOS0wOC0wMyAxNzoyMTo0NCArMDIwMCAgTHVjIERlc2NoZW5hdXggPGx1Yy5kZXNjaGVuYXV4IGF0IGZyZWVzdXJmLmNoPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBwdXQgYWxsIFNEUCBhdHRyaWJ1dGVzIG9uIGNhcHMKKwkgIFB1dCB0aGUgU0RQIGF0dHJpYnV0ZXMgb24gdGhlIGNhcHMgdG9vIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBieQorCSAgZGVwYXlsb2FkZXJzLgorCSAgU2VlICM1NjQ0MzcKKworMjAwOS0wOC0wMyAxMzozMjoxMiArMDIwMCAgSm9uYXRoYW4gVGVsbGllciA8am9uYXRoYW4udGVsbGllciBhdCBnbWFpbC5jb20+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2VzcmM6IGluaXRpYWxpemUgdGhlIHByb2JlIHdpdGggdGhlIHNlcnZlcgorCSAgV2hlbiBjcmVhdGluZyBhIG5ldyBwcm9iZSwgcGFzcyB0aGUgc2VydmVyIGluc3RlYWQgb2YgdGhlIGRldmljZSBzdHJpbmcuCisJICBmaXhlcyAjNTkwNDAxCisKKzIwMDktMDgtMDIgMTE6NDQ6MDMgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgbXVsdGl1ZHBzaW5rOiBkb24ndCBkbyB0aGluZ3Mgd2l0aCBzaWRlLWVmZmVjdHMgaW5zaWRlIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKCkKKwkgIFNvbWVvbmUgbWlnaHQgY29tcGlsZSB0aGlzIGNvZGUgd2l0aCAtREdfRElTQUJMRV9BU1NFUlQgc29tZSBkYXkuCisKKzIwMDktMDgtMDEgMjE6Mzk6MzAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGRvbid0IGRvIGxvZ2ljIHdpdGhpbiBnX2Fzc2VydCgpIHN0YXRlbWVudHMKKwkgIE90aGVyd2lzZSB0aGF0IGNvZGUgd2lsbCBqdXN0IGJlIGV4cGFuZGVkIHRvIG5vdGhpbmcgd2hlbiBjb21waWxlZAorCSAgLURHX0RJU0FCTEVfQVNTRVJUIChQUzogd2h5IGlzIG1haW5sb29wX3N0YXJ0KCkgY2FsbGVkIGluIHRoZSBpbml0CisJICBmdW5jdGlvbiBhbmQgbm90IHdoZW4gY2hhbmdpbmcgc3RhdGUgdG8gUkVBRFk/KQorCisyMDA5LTA4LTAxIDE3OjA3OjQyICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogc2VuZCBuZXdzZWdtZW50IGV2ZW50IHdoZW4gb3BlcmF0aW5nIHB1c2gtYmFzZWQgYW5kIHVuZnJhbWVkCisJICBGb3Igc29tZSByZWFzb24gZmxhYyBkb2Vzbid0IGNhbGwgb3VyIG1ldGFkYXRhIGNhbGxiYWNrIHdoZW4gd2Ugb3BlcmF0ZQorCSAgaW4gcHVzaCBtb2RlIHdpdGggdW5mcmFtZWQgaW5wdXQsIGJ1dCB0aGF0J3Mgd2hlcmUgd2Ugc2V0IHVwIHRoZQorCSAgbmV3c2VnbWVudCBldmVudCAoc2luY2UgdGhhdCdzIHdoZXJlIHdlJ2QgZ2V0IHRoZSBkdXJhdGlvbiBmcm9tIHRoZQorCSAgc3RyZWFtIGluZm8gaGVhZGVyKSwgc28gd2UgZGlkbid0IHNlbmQgYSBuZXdzZWdtZW50IGV2ZW50IGF0IGFsbCBpbiB0aGlzCisJICBjYXNlLiBIYWNrIGFyb3VuZCB0aGlzIGJ5IHN0b3JpbmcgYSBnZW5lcmljIG5ld3NlZ21lbnQgZXZlbnQgZm9yIG5vdworCSAgd2hpY2ggd2lsbCBiZSB1c2VkIGlmIHdlIGRvbid0IHJlcGxhY2UgaXQgd2l0aCBhIGJldHRlciBvbmUgdGhhdAorCSAgaW5jbHVkZXMgdGhlIGR1cmF0aW9uLgorCisyMDA5LTA4LTAxIDE2OjQ4OjM2ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogc21hbGwgY2xlYW51cHMKKwkgIFJlbW92ZSBzb21lIGNhbGxiYWNrIGluZGlyZWN0aW9ucyB3aGljaCBhcmUgbm8gbG9uZ2VyIG5lZWRlZCBiZWNhdXNlCisJICB0aGVyZSdzIG9ubHkgb25lIGRlY29kZXIgb2JqZWN0IHR5cGUgbm93LiBBbHNvIHJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCisKKzIwMDktMDgtMDEgMTU6MjI6NDkgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBmbGFjZGVjOiB1c2UgZ3N0X2FkYXB0ZXJfY29weSgpIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGJ1ZmZlciBtZXJnZXMKKwkgIGdzdF9hZGFwdGVyX3BlZWsoKSB3aWxsIG1lcmdlIGJ1ZmZlcnMgYXMgbmVlZGVkLCB3aGljaCB3ZSBjYW4gYXZvaWQKKwkgIGhlcmUgc2luY2Ugd2UncmUgZG9pbmcgYSBtZW1jcHkgYW55d2F5IGFuZCB0aGVuIGZsdXNoIHRoZSBjb3BpZWQKKwkgIGRhdGEgZnJvbSB0aGUgYWRhcHRlciByaWdodCBhd2F5LgorCisyMDA5LTA4LTAxIDAwOjAwOjQxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogcmVwYWlyIHNvbWUgYnJva2VuIGluZGVudGluZworCisyMDA5LTA4LTAxIDEyOjE5OjQxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2bXV4LmM6CisJICBjaGVja3M6IGFkZCBiYXNpYyB1bml0IHRlc3QgZm9yIGZsdm11eCwgYnV0IGRpc2FibGUgaXQgZm9yIG5vdworCSAgQmFzaWMgdW5pdCB0ZXN0IGZvciBmbHZtdXguIEZhaWxzIG1pc2VyYWJseSwgaGVuY2UgZGlzYWJsZWQgZm9yIG5vdy4KKworMjAwOS0wNy0zMSAyMzoyODoxMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsdmRlbXV4LmM6CisJKiB0ZXN0cy9maWxlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ZpbGVzL3BjbTE2c2luZS5mbHY6CisJICBjaGVjazogYWRkIGJhc2ljIHVuaXQgdGVzdCBmb3IgZmx2ZGVtdXgKKwkgIEluIHBhcnRpY3VsYXIsIHRlc3QgcmUtdXNlIG9mIGZsdmRlbXV4IGluIGJvdGggcHVsbCBhbmQgcHVzaCBtb2RlCisJICAoc2VlICM1ODMwMzApLgorCisyMDA5LTA3LTMxIDIwOjI1OjE3ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogZml4IGludmFsaWQgd3JpdGUgY2F1c2VkIGJ5IHVzaW5nIHNpemVvZigic3RyaW5nIikgYXMgbGVuZ3RoCisJICBzaXplb2YoImZvbyIpIGluY2x1ZGVzIHRoZSBzdHJpbmcncyBOVUwtdGVybWluYXRvciBpbiB0aGUgc2l6ZSByZXR1cm5lZCwKKwkgIGJ1dCB3ZSdyZSB3cml0aW5nIHN0cmluZ3MgaGVyZSB3aXRoIGFuIGV4cGxpY2l0IHNpemUgYXQgdGhlIGJlZ2lubmluZworCSAgYW5kIG5vIE5VTC10ZXJtaW5hdG9yLiBJbiBtb3N0IGNhc2VzIHVzaW5nIHNpemVvZigiZm9vIikgYXMgbGVuZ3RoIGluCisJICBtZW1jcHkgaXMgbm90IGhhcm1mdWwsIGJ1dCBpdCBpcyB3aGVyZSB0aGUgc3RyaW5nIGdvZXMgcmlnaHQgYXQgdGhlCisJICBlbmQgb2Ygb3VyIGJ1ZmZlciB0byB3cml0ZSwgc2luY2Ugd2UgZG9uJ3QgYWxsb2NhdGUgc3BhY2UgZm9yIHRoYXQKKwkgIE5VTCB0ZXJtaW5hdG9yLgorCisyMDA5LTA3LTI3IDE4OjQ0OjQ1ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cDogVXNlICJHRVQiIGluc3RlYWQgb2YgU09VUF9NRVRIT0RfR0VULiBGaXhlcyBidWlsZCB3aXRoIGxpYnNvdXAtMi43LioKKwkgIFRoaXMgaXMgZHVlIHRvIGEgcXVhbGl0eSBBUEkgY2hhbmdlIGluIGxpYnNvdXAgMi43LiBTT1VQX01FVEhPRF8qIGFyZSBub3cKKwkgIGludGVnZXJzIGFuZCBub3Qgc3RyaW5ncy4uLiB0aGV5IGNvdWxkIGhhdmUgY2hhbmdlZCB0aGUgbmFtZXMuCisKKzIwMDktMDctMzAgMTc6NTc6NTMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAganBlZzogdXNlIGxvbmdlciBtYWNybyBuYW1lcyB0byBub3QgY2xhc2ggd2l0aCBzb21lIHN0dXBpZCB3aW5kb3dzIGRlZmluZXMKKwkgIGxpYmpwZWcgaGVhZGVycyBwdWxsIHNvbWUgd2luZG93cyBzeXN0ZW0gaW5sY3VkZXMgKG9uIHdpbmRvd3MpIHRoYXQgY29udGFpbiBhCisJICBkZWZpbmUgZm9yIERFRkFVTFRfUVVBTElUWS4KKworMjAwOS0wNy0yOSAxNDozMTo0OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBGaXggbGFzdCBjb21taXQgYW5kIGltcHJvdmUgcmVhZGFiaWxpdHkKKworMjAwOS0wNy0yNCAxOTowNDozMSArMDQwMCAg0KDRg9GB0LvQsNC9INCY0LbQsdGD0LvQsNGC0L7QsiA8bHJuMTk4NkBnbWFpbC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIEZpeGVkIHRoZSBmaXggZm9yIFRJTUUtPkRFRkFVTFQgY29udmVyc2lvbi4KKwkgIEZpeGVzIGJ1ZyAjNTc4MDUyIGFnYWluLgorCisyMDA5LTA3LTI5IDEzOjM4OjAzICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSAgcnRwc3YzZGVwYXk6IEZpeCB3aWR0aC9oZWlnaHQgY2FsY3VsYXRpb24sIGJyaW5nIHVwIHRvIG1hcmdpbmFsIHJhbmsuCisJICBCYXNlZCBvbiBkb2N1bWVudGF0aW9uIGZvdW5kIG9uIGh0dHA6Ly93aWtpLm11bHRpbWVkaWEuY3gvCisKKzIwMDktMDctMjkgMTI6MTM6MjAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSAgcHVsc2U6IGNvbmRpdGlvbmFsbHkgY29tcGlsZSBuZXdlciBzdHVmZgorCSAgY29uZmlndXJlZF9zaW5rL3NvdXJjZV91c2VjIGluIHRoZSB0aW1pbmdfaW5mbyBpcyBvbmx5IHNpbmNlIDAuOS4xMSBzbworCSAgY29uZGl0aW9uYWxseSBjb21waWxlIHRoaXMgaW5mb3JtYXRpb24uCisJICBmaXhlcyAjNTkwMDM4CisKKzIwMDktMDctMjggMTg6Mjk6MDcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlc3JjLmg6CisJICBwdWxzZXNyYzogY2xlYW51cHMKKwkgIEtlZXAgdHJhY2sgb2YgdGhlIHBhdXNlZCBzdGF0ZSBvZiB0aGUgc291cmNlIGFuZCBsZWF2ZSB0aGUgcmVhZCBmdW5jdGlvbiB3aGVuCisJICBwYXVzZWQuCisJICBkb24ndCB3YWl0IGZvciBhIGxhdGVuY3kgdXBkYXRlIHdoZW4gdGhlIGRlbGF5IGlzIG5vdCB5ZXQga25vd24gYnV0IHNpbXBseQorCSAgcmV0dXJuIDAgaW5zdGVhZCBvZiBibG9ja2luZy4KKwkgIEtlZXAgdHJhY2sgb2YgdGhlIGNvcmtlZCBzdGF0ZSBvZiB0aGUgc3RyZWFtLgorCSAgRml4IHRoZSBzdGF0ZSBjaGFuZ2VzLgorCisyMDA5LTA3LTI4IDE2OjExOjE4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlc3JjOiBzZXQgbWF4bGVuZ3RoIGFsd2F5cyB0byAtMQorCisyMDA5LTA3LTI4IDE1OjUzOjU3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5oOgorCSAgcHVsc2VzcmM7IGNsZWFudXBzLCByZXBvcnQgcmVhbCBsYXRlbmN5CisJICBBZGQgc29tZSBtb3JlIGRlYnVnIGluZm8KKwkgIEF2b2lkIHNvbWUgdHlwZSBjYXN0cworCSAgUmVwb3J0IHRoZSByZWFsIGxhdGVuY3kgdG8gdGhlIGFwcGxpY2F0aW9uLgorCisyMDA5LTA3LTI4IDE2OjExOjM2ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogd2hlbiBzY2FubmluZyBmb3IgMHhmZiBtYXJrZXIgZW5kcywgZW5zdXJlIGRlc2lyZWQgcmVzdWx0CisJICBPdGhlcndpc2UsIGFueSBub24gMHhmZiBieXRlIGF0IGVuZCBvZiBkYXRhIHdvdWxkIGJlIG1pc3Rha2VuIGZvcgorCSAgYSB0YWcgYnl0ZSwgYW5kIGluIGNhc2Ugb2YgYSBmcmFtZV9sZW4gMCB0YWcgc3Vic2VxdWVudGx5IGxlYWQgdG8gYW4KKwkgIGluZmluaXRlIGxvb3AuCisKKzIwMDktMDctMjggMDA6MzA6NDMgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBhZGRzIHN1cHBvcnQgdG8gd21hCisKKzIwMDktMDctMjggMDA6MDc6MTUgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyPgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgYXZpbXV4OiBhZGRzIHN1cHBvcnQgdG8gd212CisKKzIwMDktMDctMjcgMjE6MzQ6MjIgLTAzMDAgIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBEb3duZ3JhZGUgd2FybmluZyBtZXNzYWdlIHRvIGRlYnVnCisKKzIwMDktMDctMjcgMTE6NTE6MzkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogYXZvaWQgdXNpbmcgaXZhbGlkIHN0cmVhbSBpbmRleGVzCisJICB3aGVuIHdlIGdldCBhbiBpbnZhbGlkIHN0cmVhbSBpbmRleCBmcm9tIHB1bHNlIGJlY2F1c2Ugd2Ugd2VyZSBqdXN0IHN0YXJ0aW5nLAorCSAgYXZvaWQgdXNpbmcgaXQgZm9yIGdldHRpbmcgYW5kIHNldHRpbmcgdGhlIHZvbHVtZS4KKwkgIEZpeGVzICM1ODkzNjUKKworMjAwOS0wNy0yNCAxOTozODowNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmM6CisJKiBnc3QvZWZmZWN0di9nc3RzdHJlYWsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkgIGVmZmVjdHY6IERvbid0IGFsbG93IGNhcHMgY2hhbmdlcyBmb3Igc29tZSBlZmZlY3R2IGZpbHRlcnMKKwkgIFRoZXNlIGZpbHRlcnMgdXNlIGluZm9ybWF0aW9uIGZyb20gcHJldmlvdXMgZnJhbWVzIHRvCisJICBnZW5lcmF0ZSB0aGUgY3VycmVudCBmcmFtZSBhbmQgYSBjYXBzIGNoYW5nZSB3aWxsIG1ha2UKKwkgIHRoZSBlZmZlY3Qgc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIGFnYWluLgorCisyMDA5LTA3LTI0IDE5OjM3OjA5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5oOgorCSAgd2FycHR2OiBNYWtlIHRoZSBzaW5lIHRhYmxlIGdsb2JhbCBpbnN0ZWFkIG9mIGhhdmluZyBpdCBpbiBldmVyeSBpbnN0YW5jZQorCisyMDA5LTA3LTI0IDEwOjQ3OjQ0ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWc6IG1ha2UgZW5jb2RlciB3b3JrIHdpdGggbGlianBlZyB2NworCSAgV2UgaGF2ZSB0byBzcGVjaWZ5IGRvX2ZhbmN5X2Rvd25zYW1wbGluZyA9IEZBTFNFIGluIHRoZSBlbmNvZGVyIHdpdGggZGlkIG5vdCBleGlzdCBiZWZvcmUuCisKKzIwMDktMDctMjQgMDA6NDI6MzMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGZlZGFhZWUgdG8gOTRmOTVlMworCisyMDA5LTA3LTIzIDEyOjA2OjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogSW1wbGVtZW50IFNFRUtJTkcgcXVlcnkKKwkgIEZpeGVzIGJ1ZyAjNTg5NDIzLgorCisyMDA5LTA3LTIyIDExOjE2OjA2ICswMTAwICBDb2xpbiBHdXRocmllIDxjZ3V0aHJpZUBtYW5kcml2YS5vcmc+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogRml4IGEgY291cGxlIGVycm9yIG1lc3NhZ2VzIHRoYXQgbWVudGlvbmVkIGluY29ycmVjdCBmdW5jdGlvbiBuYW1lcy4KKwkgIEZpeGVzICM1ODk0NTkuCisKKzIwMDktMDctMjMgMTE6NTA6MTYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6CisJICBmbHZkZW11eDogSW1wbGVtZW50IFNFRUtJTkcgcXVlcnkKKwkgIEFsc28gYWRkIHNvbWUgbW9yZSBxdWVyeSB0eXBlcyB0byB0aGUgYW5zd2VyIG9mIHRoZSBxdWVyeSB0eXBlIGZ1bmN0aW9uLgorCSAgRml4ZXMgYnVnICM1ODk0MjQuCisKKzIwMDktMDctMjEgMTk6NDY6NTUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmg6CisJICBmbGFjZGVjOiBmaXggaW50ZXJtaXR0ZW50IEZMQUNfX1NUUkVBTV9ERUNPREVSX0FCT1JURUQgZXJyb3JzIHdoZW4gc2Vla2luZworCSAgV2hlbiBzZWVraW5nIGluIGEgbG9jYWwgZmxhYyBmaWxlIChpZS4gb3BlcmF0aW5nIHB1bGwtYmFzZWQpLCB0aGUgZGVjb2RlcgorCSAgd291bGQgb2Z0ZW4ganVzdCBlcnJvciBvdXQgYWZ0ZXIgdGhlIGxvb3AgZnVuY3Rpb24gc2VlcyBhIERFQ09ERVJfQUJPUlRFRAorCSAgc3RhdHVzLiBUaGlzLCBob3dldmVyLCBpcyB0aGUgcmVhZCBjYWxsYmFjaydzIHdheSBvZiB0ZWxsaW5nIG91ciBsb29wCisJICBmdW5jdGlvbiB0aGF0IHB1bGxfcmFuZ2UgZmFpbGVkIGFuZCBzdHJlYW1pbmcgc2hvdWxkIHN0b3AsIGluIHRoaXMgY2FzZQorCSAgYmVjYXVzZSBvZiB0aGUgZmx1c2gtc3RhcnQgZXZlbnQgdGhhdCB0aGUgc2VlayBoYW5kbGVyIHB1c2hlZCB1cHN0cmVhbQorCSAgZnJvbSB0aGUgc2Vla2luZyB0aHJlYWQuIEhhbmRsZSB0aGlzIHNsaWdodGx5IGJldHRlciBieSBzdG9yaW5nIHRoZSBsYXN0CisJICBmbG93IHJldHVybiBmcm9tIHB1bGxfcmFuZ2UsIHNvIHRoZSBsb29wIGZ1bmN0aW9uIGNhbiBldmFsdWF0ZSBpdCBwcm9wZXJseQorCSAgd2hlbiBpdCBlbmNvdW50ZXJzIGEgREVDT0RFUl9BQk9SVEVEIGFuZCB0YWtlIHRoZSByaWdodCBhY3Rpb24uCisJICBGaXhlcyAjNTc4NjEyLgorCisyMDA5LTA3LTIxIDEwOjA3OjAwICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkgIGludGVybGVhdmU6IGZpeCBpbmRlbnRpbmcgYW5kIHVwZ3JhZGUgdHdvIGRlYnVncyB0byB3YXJuaW5ncy4KKwkgIEZpeCBuZXdsaW5lcyBpbiB2YXJpYWJsZSBkZWNscy4gQ2hhbmdlIHR3byBkZWJ1Z3MgdG8gYmVjb21lIHdhcm5pbmdzIGFzIHRoZXkKKwkgIGluZGljYXRlIHRoYXQgdGhpbmdzIHdpbGwgbm90IHdvcmsuCisKKzIwMDktMDctMjEgMTA6MDQ6MzYgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L2pwZWcvZ3N0anBlZy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5oOgorCSAganBlZzogY29kZSBjbGVhbnVwcyBmb3IgZW5jb2RlcgorCSAgUmVtb3ZlIHNvbWUgZGlzYWJsZWQgY29kZSBpbiBlbmNvZGVyLiBUcnkgI2lmIDAnZWQgY29kZSBhbmQgYWRkIGNvbW1lbnRzIGFib3V0CisJICB3aHkgaXQgaXMgZGlzYWJsZWQuIE1vdmUgaWRjdC1tZXRob2QgZW51bSB0byBqcGVnLmMgYW5kIHVzZSBpbiBib3RoIGVuY29kZXIgYW5kCisJICBkZWNvZGVyLiBBZGQgaWRjdC1tZXRob2QgcHJvcGVydHkgdG8gZW5jb2Rlci4KKworMjAwOS0wNy0yMSAwNzo1MDo0NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogQW5zd2VyIFNFRUtJTkcgcXVlcmllcyBpbiB0aGUgb3JpZ2luYWwgZm9ybWF0CisKKzIwMDktMDctMjEgMDE6MTI6NDQgKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSAgdWRwdXRpbHM6IGluaXRpYWxpemUgc3RydWN0IGNvbnRlbnQgd2l0aCAwLgorCSAgRml4ZXMgc29tZSByYW5kb20gY3Jhc2hlcy4KKworMjAwOS0wNy0yMCAxOTowOToxOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBzZXQgc29tZSB2YWx1ZXMgdG8gdGhlaXIgZGVmYXVsdHMKKwkgIFNldCB0aGUgbWlucmVxIGFuZCBtYXhsZW5ndGggYnVmZmVyIGF0dHJpYnV0ZXMgdG8gLTEgdG8gbGV0IHB1bGVzZWF1ZGlvIHNlbGVjdCBhCisJICBzZW5zaWJsZSB2YWx1ZS4KKworMjAwOS0wNy0yMCAxOTowNDowOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBkb24ndCB3YWl0IGZvciBwb3N0ZWQgbWVzc2FnZQorCSAgV2UgY2FuJ3Qgd2FpdCBmb3IgdGhlIEVOVEVSL0xFQVZFIG1lc3NhZ2VzIHRvIGJlIGJlIHBvc3RlZCBiZWNhdXNlIHRoZSBiYXNlCisJICBjbGFzcyBzb21ldGltZXMgY2FsbHMgdGhlIHN0YXJ0IG1ldGhvZCB3aXRoIHRoZSBvYmplY3QgbG9jaywgd2hpY2ggd291bGQgYmxvY2sKKwkgIHRoZSBtZXNzYWdlIHBvc3RpbmcuCisJICBJbnN0ZWFkLCBqdXN0IGFzc3VtZSB0aGF0IHRoZSBtZXNzYWdlIHdpbGwgYmUgcG9zdGVkIHNvb24gYW5kIGNvbnRpbnVlLiBXZSdsbAorCSAgaGF2ZSB0byBmaXggdGhpcyBpbiB0aGUgYmFzZSBjbGFzcy4KKworMjAwOS0wNy0yMCAxODoxMTozMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiB1c2UgcmVsYXRpdmUgc2Vla3MKKwkgIFVzZSByZWxhdGl2ZSBzZWVrcyBiZWNhdXNlIEkgd2FzIHRvbGQgdGhhdCBhYnNvbHV0ZSBzZWVrcyBkb24ndCB3b3JrLgorCisyMDA5LTA3LTIwIDE2OjUyOjE5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBJbXBsZW1lbnQgU0VFS0lORyBxdWVyeQorCisyMDA5LTA3LTIwIDA4OjA3OjEzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmM6CisJICBjYWlyb3JlbmRlcjogQWRkIHN1cHBvcnQgZm9yIEFSR0IvQkdSQSBpbnB1dAorCSAgTm90ZSB0aGF0IHZpZGVvdGVzdHNyYyBvdXRwdXRzIDEwMCUgdHJhbnNwYXJlbnQgdmlkZW8KKwkgIHdoaWNoIHdpbGwgcmVzdWx0IGluIHdoaXRlIG91dHB1dCBmcm9tIGNhaXJvcmVuZGVyLgorCisyMDA5LTA3LTE3IDEzOjIyOjU3ICswMTAwICBFbGFpbmUgWGlvbmcgPEVsYWluZS5YaW9uZ0BTdW4uQ09NPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICB2NGwyOiBGaXggdjRsMnNyYyBvbiBPcGVuU29sYXJpcworCSAgVGhlIHY0bDIgZHJpdmVyIGZvciBVU0Igd2ViY2FtcyBvbiBPcGVuU29sYXJpcyBkb2VzIG5vdCBzdXBwb3J0IHNlbGVjdCgpCisJICBjYWxscy4gRGV0ZWN0IHdoZW4gc2VsZWN0KCkgZmFpbHMsIGFuZCBza2lwIHBvbGxpbmcgdGhlIGRldmljZSBhZnRlcndhcmQsCisJICB3aGljaCByZXN0b3JlcyB0aGUgcHJlIDAuMTAuMTQgYmVoYXZpb3VyIG9uIE9wZW5Tb2xhcmlzLgorCSAgU2lnbmVkLW9mZi1ieTogSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisyMDA5LTA3LTE3IDExOjIyOjA2ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9leGFtcGxlcy92NGwyLy5naXRpZ25vcmU6CisJICBnaXRpZ25vcmU6IElnbm9yZSBzb21lIG5ldyBiaW5hcmllcworCisyMDA5LTA3LTE3IDEzOjQ5OjIxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGV4dC9jYWlyby9nc3RjYWlyb3JlbmRlci5jOgorCSAgY2Fpcm9yZW5kZXI6IEFkZCB0byB0aGUgZG9jdW1lbnRhdGlvbgorCisyMDA5LTA3LTE3IDEzOjQyOjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmM6CisJICBjYWlyb3JlbmRlcjogUmV0dXJuIG5vdC1uZWdvdGlhdGVkIGlmIHdlIGhhdmUgbm8gY2FwcworCisyMDA5LTA3LTE3IDEzOjQxOjE5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmM6CisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm9yZW5kZXIuaDoKKwkgIGNhaXJvcmVuZGVyOiBGaXggY2FwcyBhbmQgY29sb3JzcGFjZSBoYW5kbGluZworCisyMDA5LTA3LTE3IDEzOjMwOjAyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmM6CisJICBjYWlyb3JlbmRlcjogVXNlIGNvcnJlY3QgbWltZXR5cGVzIGZvciBQREYgYW5kIFNWRworCisyMDA5LTA3LTE3IDEzOjI0OjI4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmM6CisJICBjYWlyb3JlbmRlcjogUmVtb3ZlIHB1bGwgbW9kZSwgaXQgb25seSBhZGRzIGNvbXBsZXhpdHkgYnV0IG5vdCBhZHZhbnRhZ2VzCisKKzIwMDktMDctMTYgMjE6NTU6MzEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm9yZW5kZXIuYzoKKwkgIGNhaXJvcmVuZGVyOiBGaXggY2FwcyBuZWdvdGlhdGlvbiBhbmQgY2Fpcm8gc3VyZmFjZSBjcmVhdGlvbgorCisyMDA5LTA3LTE2IDIxOjQyOjIxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmM6CisJICBjYWlyb3JlbmRlcjogQ29ycmVjdGx5IHNldCBzcmNjYXBzCisKKzIwMDktMDctMTYgMjE6MzE6NDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm9yZW5kZXIuYzoKKwkqIGV4dC9jYWlyby9nc3RjYWlyb3JlbmRlci5oOgorCSAgY2Fpcm9yZW5kZXI6IE1vdmUgaW5zdGFuY2UvY2xhc3Mgc3RydWN0IGRlZmluaXRpb25zIHRvIHRoZSBoZWFkZXIKKworMjAwOS0wNy0xNiAyMTozMDowMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9jYWlyby9nc3RjYWlyb3JlbmRlci5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmg6CisJICBjYWlyb3JlbmRlcjogQWRkIEx1dHonIGNvcHlyaWdodCB0byB0aGUgZmlsZSBoZWFkZXIKKworMjAwOS0wNy0xNiAyMToyNzo0NSArMDIwMCAgTHV0eiBNdWVsbGVyIDxsdXR6QHRvcGZyb3NlLmRlPgorCisJKiBleHQvY2Fpcm8vTWFrZWZpbGUuYW06CisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm8uYzoKKwkqIGV4dC9jYWlyby9nc3RjYWlyb3JlbmRlci5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvcmVuZGVyLmg6CisJICBjYWlybzogQWRkIGNhaXJvLWJhc2VkIFBERi9QUy9TVkcgZW5jb2RlciBlbGVtZW50CisJICBGaXhlcyBidWcgIzMzMTQyMC4KKworMjAwOS0wNy0xNiAyMDo0NDo0MCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuaDoKKwkgIGZsYWNlbmM6IE9wdGlvbmFsbHkgd3JpdGUgYSBQQURESU5HIGJsb2NrCisJICBUaGUgc2l6ZSBvZiB0aGUgUEFERElORyBibG9jayBpcyBzcGVjaWZpZWQgYnkgYSBuZXcKKwkgICJwYWRkaW5nIiBwcm9wZXJ0eS4KKwkgIEZpeGVzIGJ1ZyAjNTg4NDgzLgorCisyMDA5LTA3LTE2IDE5OjM1OjQ0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBPbmx5IGFzc3VtZSBzZWVrYWJpbGl0eSBpZiB0aGUgc2VydmVyIHByb3ZpZGVzIENvbnRlbnQtTGVuZ3RoCisJICBQcmV2aW91c2x5IHNlZWthYmlsaXR5IHdheSBhbHdheXMgYXNzdW1lZCB1bnRpbCB0aGUgZmlyc3Qgc2VlayBhY3R1YWxseQorCSAgZmFpbGVkLiBOb3cgd2UgYXNzdW1lIHRoYXQgYWxsIHNlcnZlcnMgYXJlIG5vdCBzZWVrYWJsZSB1bmxlc3MgdGhleSBwcm92aWRlCisJICBhIENvbnRlbnQtTGVuZ3RoIGhlYWRlci4gSWYgYSBzZWVrIGZhaWxzIGFmdGVyIHRoYXQgd2UgY29udGludWUgdG8KKwkgIGFzc3VtZSBubyBzZWVrYWJpbGl0eS4gRml4ZXMgYnVnICM1ODU1NzYuCisKKzIwMDktMDctMTYgMTU6MTQ6NDMgKzAyMDAgIEFybm91dCBWYW5kZWNhcHBlbGxlIDxhcm5vdXRAbWluZC5iZT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBkb24ndCB0cnkgdG8gYXV0aGVudGljYXRlIGlmIG5vIHVzZXJuYW1lL3Bhc3N3b3JkIGlzIHNldC4KKworMjAwOS0wNy0xNiAxNzoxMDoyMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkgIGVmZmVjdHY6IENoYWluIHVwIGZpbmFsaXplIHRvIHRoZSBwYXJlbnQgY2xhc3MgaW4gd2FycHR2CisJICBGaXhlcyBhIG1lbW9yeSBsZWFrLgorCisyMDA5LTA3LTE2IDEyOjU1OjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZWZmZWN0di5jOgorCSAgZWZmZWN0djogQWRkIHVuaXQgdGVzdCBmb3IgYWxsIGVmZmVjdHYgZWxlbWVudHMKKworMjAwOS0wNy0xNiAxMjoxNzozMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJICBlZmZlY3R2OiBBZGQgbmV3IGVmZmVjdHYgZWxlbWVudHMgdG8gdGhlIGRvY3MKKworMjAwOS0wNy0xNSAxNDozNzoxOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L01ha2VmaWxlLmFtOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWZmZWN0di5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmlwcGxlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RyaXBwbGUuaDoKKwkgIGVmZmVjdHY6IEFkZCByaXBwbGV0diBlbGVtZW50CisJICBUaGlzIHByb2R1Y2VzIGEgd2F0ZXIgcmlwcGxlIGVmZmVjdCBvbiB0aGUgdmlkZW8gaW5wdXQsCisJICBiYXNlZCBvbiBtb3Rpb24gb3IgYSByYWluIGRyb3AgYWxnb3JpdGhtLgorCSAgS2luZGx5IHJlbGljZW5zZWQgdG8gTEdQTDIrIGJ5IEtlbnRhcm8gRnVrdWNoaSA8ZnVrdWNoaUBtZWdhdWkubmV0Pi4KKwkgIEZpeGVzIGJ1ZyAjNTg4Njk1LgorCisyMDA5LTA3LTEyIDE1OjQyOjM1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvTWFrZWZpbGUuYW06CisJKiBnc3QvZWZmZWN0di9nc3RlZmZlY3R2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RzdHJlYWsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHN0cmVhay5oOgorCSAgZWZmZWN0djogQWRkIHN0cmVha3R2IGVmZmVjdCBmaWx0ZXIgZWxlbWVudAorCSAgVGhpcyBjb21iaW5lcyB0aGUgU3RyZWFrVFYgYW5kIEJhbHRhblRWIGZpbHRlcnMgZnJvbSB0aGUKKwkgIGVmZmVjdHYgcHJvamVjdC4KKwkgIEtpbmRseSByZWxpY2Vuc2VkIHRvIExHUEwyKyBieSBLZW50YXJvIEZ1a3VjaGkgPGZ1a3VjaGlAbWVnYXVpLm5ldD4uCisJICBGaXhlcyBidWcgIzU4ODM2OC4KKworMjAwOS0wNy0xMiAxMjozMToxNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jOgorCSAgZWZmZWN0djogRml4IHByb2Nlc3Npbmcgb24gYmlnIGVuZGlhbiBhcmNoaXRlY3R1cmVzCisKKzIwMDktMDctMTIgMTE6NTI6MDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbToKKwkqIGdzdC9lZmZlY3R2L2dzdGVmZmVjdHYuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJhZGlvYWMuaDoKKwkgIGVmZmVjdHY6IEFkZCByYWRpb2FjdHYgZWZmZWN0IGZpbHRlcgorCSAgVGhpcyBmaWx0ZXIgYWRkcyBhIHJhZGlhdGlvbi1saWtlIG1vdGlvbiBibHVyIGVmZmVjdAorCSAgdG8gdGhlIHZpZGVvIHN0cmVhbS4KKwkgIEtpbmRseSByZWxpY2Vuc2VkIHRvIExHUEwyKyBieSBLZW50YXJvIEZ1a3VjaGkgPGZ1a3VjaGlAbWVnYXVpLm5ldD4uCisJICBGaXhlcyBidWcgIzU4ODM1OS4KKworMjAwOS0wNy0xMiAxMToyNjo1NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdG9wLmM6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5oOgorCSAgZWZmZWN0djogTWFrZSB0aGUgb3B0diB0aHJlc2hvbGQgcHJvcGVydHkgYW4gdWludAorCisyMDA5LTA3LTEyIDEwOjM5OjAyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvTWFrZWZpbGUuYW06CisJKiBnc3QvZWZmZWN0di9nc3RlZmZlY3R2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RvcC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0b3AuaDoKKwkgIGVmZmVjdDogQWRkIG9wdHYgZWZmZWN0IGZpbHRlciBmcm9tIHRoZSBlZmZlY3R2IHByb2plY3QKKwkgIFRoaXMgZmlsdGVyIGJpbmFyaXplcyBpbnB1dCBmcmFtZXMgYW5kIGNvbWJpbmVzIHRoZW0gd2l0aCB2YXJpb3VzCisJICBvcHRpY2FsIHBhdHRlcm4uCisJICBLaW5kbHkgcmVsaWNlbnNlZCB0byBMR1BMMisgYnkgS2VudGFybyBGdWt1Y2hpIDxmdWt1Y2hpQG1lZ2F1aS5uZXQ+LgorCSAgRml4ZXMgYnVnICM1ODgzNDkuCisKKzIwMDktMDctMDMgMDU6MTE6MjYgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBFbWl0IHN0cmVhbS1zdGF0dXMgbGVhdmUgbWVzc2FnZQorCSAgRml4ZXMgIzU4NzY5NQorCisyMDA5LTA3LTAzIDA1OjA2OjQ1IC0wNDAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkgIHB1bHNlc2luazogRW1pdCBzdHJlYW0tc3RhdHVzIGVudGVyIG1lc3NhZ2UKKwkgIEVtaXQgc3RyZWFtLXN0YXR1cyBtZXNzYWdlcyBmb3IgdGhlIHB1bHNlIHRocmVhZC4KKwkgIERvbid0IHVzZSBvdXIgb3duIEdDb25kIGZvciBzaWduYWxpbmcgYnV0IHNpbXBseSB1c2UgdGhlIHB1bHNlIG1haW5sb29wCisJICBtZWNoYW5pc21zIGZvciBzeW5jaHJvbmlzYXRpb24uCisJICBTZWUgIzU4NzY5NQorCisyMDA5LTA3LTE0IDE4OjE1OjU5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGRlYnVnIHRoZSBsYXRlbmN5IHVwZGF0ZSB2YWx1ZXMKKworMjAwOS0wNy0xNCAxNjoxMjo1NSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSAgcHVsc2VzaW5rOiBhZGQgMjRiaXQgc2FtcGxlIGZvcm1hdHMKKwkgIEFkZCBjaGVjayBmb3IgcHVsc2VhdWRpbyAwLjkuMTUgYW5kIGVuYWJsZSAyNGJpdHMgc2FtcGxlcyBpbiB0aGF0IGNhc2UuCisKKzIwMDktMDctMTMgMTI6MjM6MzcgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDU4NDViNjMgdG8gZmVkYWFlZQorCisyMDA5LTA3LTEzIDE3OjUzOjI1ICswMjAwICBNYXJjIExlZW1hbiA8bWFyYy5sZWVtYW4gYXQgZ21haWwuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSAgbXB2cGF5OiBSZXdvcmsgdGhlIHRpbWVzdGFtcGluZworCSAgUmV3b3JrIHRoZSB0aW1lc3RhbXBpbmcgaW4gdGhlIG1wdiBwYXlsb2FkZXIgc28gdGhhdCB0aGUgdGltZXN0YW1wcyBhcmUgbW9yZQorCSAgYWNjdXJhdGUuCisJICBGaXhlcyAjNTg3NjgwCisKKzIwMDktMDctMDMgMDg6NDc6MTIgKzAyMDAgIEZpbGlwcG8gQXJnaW9sYXMgPGZpbGlwcG8uYXJnaW9sYXNAZ21haWwuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiB0ZXN0cy9leGFtcGxlcy9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2V4YW1wbGVzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9leGFtcGxlcy92NGwyL3Byb2JlLmM6CisJICB2NGwyc3JjOiBhZGQgYSBzaW1wbGUgdGVzdCBjYXNlIGZvciBkZXZpY2UgcHJvYmluZworCisyMDA5LTA3LTAzIDA4OjM4OjQzICswMjAwICBGaWxpcHBvIEFyZ2lvbGFzIDxmaWxpcHBvLmFyZ2lvbGFzQGdtYWlsLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogc3lzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICB2NGwyc3JjOiBvcHRpb25hbCBzdXBwb3J0IGZvciBkZXZpY2UgcHJvYmluZyB3aXRoIGd1ZGV2CisJICBFbnVtZXJhdGUgdjRsMiBkZXZpY2VzIHVzaW5nIGd1ZGV2IGlmIGF2YWlsYWJsZS4KKwkgIEZpeGVzIGJ1ZyAjNTgzNjQwLgorCisyMDA5LTA3LTEwIDE5OjU0OjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogUmFuZG9tIGNsZWFudXAKKworMjAwOS0wNy0xMCAxOTo1NDoxMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIHZpZGVvbWl4ZXI6IFNlbmQgcXVlcmllcyB0byB0aGUgbWFzdGVyIHBhZCBieSBkZWZhdWx0IGluc3RlYWQgb2YgYWxsIHBhZHMKKworMjAwOS0wNy0xMCAxOTozNDo0MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfcmdiLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBBZGQgUkdCLCBCR1IsIHhSR0IsIFJHQngsIHhCR1IsIEJHUnggc3VwcG9ydAorCisyMDA5LTA3LTEwIDE3OjQzOjA3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogQ2xlYW4gdXAgZGVidWdnaW5nIGEgYml0CisKKzIwMDktMDctMTAgMTc6MjU6NDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICB2aWRlb21peGVyOiBSZW1vdmUgc29tZSByZWR1bmRhbnQgY2hlY2tzIGFuZCBlcnJvciBvdXQgaW1tZWRpYXRlbHkgaWYgbm90IG5lZ290aWF0ZWQKKwkgIEFsc28gc3RvcCBsZWFraW5nIHRoZSBvdXRwdXQgYnVmZmVyIGluIHNvbWUgZXJyb3IgY2FzZXMuCisKKzIwMDktMDctMTAgMTc6MjM6MDMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9heXV2LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9iZ3JhLmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9pNDIwLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmg6CisJICB2aWRlb21peGVyOiBSZW1vdmUgdGhlIGNhbGN1bGF0ZV9mcmFtZV9zaXplKCkgZnVuY3Rpb24gYW5kIHVzZSBsaWJnc3R2aWRlbyBpbnN0ZWFkCisKKzIwMDktMDYtMzAgMTU6MTM6NDQgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIHZpZGVvbWl4ZXI6IFJlbW92ZSB1bnVzZWQgbGluay91bmxpbmsgcGFkIG1ldGhvZHMKKworMjAwOS0wNi0zMCAxMjo0MzowNCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfaTQyMC5jOgorCSAgdmlkZW9taXhlcjogSTQyMCBtb2RlOiBBZGQgZmFzdCBwYXRoIGZvciAwLjAgYW5kIDEuMCBhbHBoYQorCSAgSWYgdGhlIHNvdXJjZSBhbHBoYSBpcyAwLjAsIHdlIHRha2Ugbm90aGluZy4KKwkgIElmIHRoZSBzb3VyY2UgYWxwaGEgaXMgMS4wLCB3ZSBvdmVyd3JpdGUgZXZlcnl0aGluZy4KKworMjAwOS0wNi0zMCAxMjo0MDowMiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfaTQyMC5jOgorCSAgdmlkZW9taXhlcjogSTQyMCBibGVuZGluZyA6IEZpeCBtYWluIGFsZ29yaXRobS4KKwkgIFdoZW4gYmxlbmRpbmcgYSBzb3VyY2UgbGF5ZXIgd2l0aCBhbiBhbHBoYSBvZiAnYScgb24gdG9wIG9mIGFub3RoZXIKKwkgIGRlc3RpbmF0aW9uIGxheWVyIHdlIHRha2UgdGhlIHN1bSBvZjoKKwkgICogJ2EnIHBlcmNlbnQgb2YgdGhlIHNvdXJjZSBsYXllcgorCSAgKiAoMTAwIC0gJ2EnKSBwZXJjZW50IG9mIHRoZSBkZXN0aW5hdGlvbiBsYXllciAodGhlIHJlbWFpbmRlcikKKworMjAwOS0wNi0zMCAxMjozOToxOSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfaTQyMC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5oOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcnBhZC5oOgorCSAgdmlkZW9taXhlcjogTWFrZSBkZWJ1Z2dpbmcgY2F0ZWdvcnkgZ2xvYmFsIHRvIGFsbCB0aGUgY29kZS4KKworMjAwOS0wNi0yOSAxOToyMzo0MSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogaW1wcm92ZSByZWFkYWJpbGl0eSBvZiBkZWJ1Z2dpbmcgc3RhdGVtZW50cy4KKworMjAwOS0wNy0wOCAxMzozODo1MyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRvIG5vdCBsZWFrIHRpbWVvdXQgbWVzc2FnZQorCisyMDA5LTA3LTA5IDA3OjE0OjIzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpOiBEb24ndCBmb3J3YXJkIE5FV1NFR01FTlQgZXZlbnRzIGZyb20gdXBzdHJlYW0KKwkgIE5ldyBvbmVzIGFyZSBnZW5lcmF0ZWQgbGF0ZXIgYW5kIHNpbXBseSBmb3J3YXJkaW5nIHRoZW0gY2FuCisJICByZXN1bHQgaW4gTkVXU0VHTUVOVCBldmVudHMgb2YgZGlmZmVyZW50IGZvcm1hdCBnb2luZyBkb3duc3RyZWFtLgorCSAgRml4ZXMgYnVnICM1ODc5ODMuCisKKzIwMDktMDctMDggMTg6MTk6NDUgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9heXV2LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9pNDIwLmM6CisJICB2aWRlb21peGVyOiBNYWtlIGNoZWNrZXIgcGF0dGVybiBsb29rdXAgdGFibGUgY29uc3RhbnQKKworMjAwOS0wNy0wOCAxODoxNzo0OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfYmdyYS5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogQWRkIHN1cHBvcnQgZm9yIEFSR0IKKwkgIEFuZCBjbGVhbiB1cCB0aGUgY2FwcyBwYXJzaW5nLgorCisyMDA5LTA3LTA4IDE1OjE3OjQxICswMjAwICBCZW5qYW1pbiBHYWlnbmFyZCA8YmVuamFtaW5AZ2FpZ25hcmQubmV0PgorCisJKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6CisJICB1ZHA6IEluaXRpYWxpemUgcG9pbnRlciB0byBOVUxMCisJICBPdGhlcndpc2Ugd2UncmUgY2FsbGluZyBmcmVlKCkgd2l0aCBzb21lIHJhbmRvbQorCSAgbWVtb3J5IGFkZHJlc3MgaW4gZXJyb3IgY2FzZXMuCisJICBGaXhlcyBidWcgIzU4Nzk4Mi4KKworMjAwOS0wNy0wNyAxNjozNToyNCArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHNwcmlua2xlIHNvbWUgbW9yZSBjb25zdAorCisyMDA5LTA3LTA3IDE1OjU3OjU1ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcGVyZm9ybSBzb21lIG1vcmUgKGNhcmVmdWwpIGRhdGEgYnVmZmVyaW5nCisJICBPbmNlIGJ1ZmZlcmluZyBoYXMgc3RhcnRlZCAod2l0aCBhbiBtZGF0IGF0b20pLCBjb250aW51ZSBidWZmZXJpbmcKKwkgIHVudGlsIG1vb3YgYXRvbSBpcyByZWFjaGVkLCB3aGljaCBoYW5kbGVzIGNhc2VzIHdpdGggbXVsdGlwbGUKKwkgIG1kYXQgYXRvbXMuICBBbHNvIGtlZXAgYWRhcHRlci9vZmZzZXQgYmV0dGVyIGluIHN5bmMgd2l0aCB1cHN0cmVhbQorCSAgYW5kIGZpeCBzb21lIGRlYnVnIHN0YXRlbWVudHMuICBGaXhlcyAjNTg3NDI2LgorCisyMDA5LTA3LTA2IDEwOjQwOjMxICswMjAwICBQaGlsaXAgSuRnZW5zdGVkdCA8cGhpbGlwakBvcGVyYS5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBSZXBsYWNlIGRlcHJlY2F0ZWQgR1NUX0RJU0FCTEVfREVCVUcgd2l0aCBjb3JyZWN0IG1hY3JvLiBGaXhlcyAjNTg3ODI2CisKKzIwMDktMDctMDEgMTM6MDc6NDggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBlcnJvciBvdXQgaW5zdGVhZCBvZiBkaXZpZGluZyBieSAwCisJICBFcnJvciBvdXQgaWYgdGltZXNjYWxlIGlzIDAuCisKKzIwMDktMDctMDEgMDk6MzI6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBSZXZlcnQgInF0ZGVtdXg6IE1ha2Ugc3VyZSB3ZSBkb24ndCBibGFja2xpc3Qgc3RyZWFtcyBieSB3cm9uZ2x5IGNvbXBhcmluZyB0aGVpciIKKwkgIFRoaXMgcmV2ZXJ0cyBjb21taXQgNTUwM2E1OWE1Nzc5YjY3NDUxZDhhMjcxMDAwMTgxNzkwZWU3NmJjNy4KKwkgIFJldmVydGluZyB0aGlzIHNpbmNlIGl0IGNhdXNlcyByZWdyZXNzaW9ucyB3aXRoIGEgbG90IG9mIHNhbXBsZSBmaWxlcworCSAgSSBoYXZlLCBhbGwgb2Ygd2hpY2ggd29ya2VkIGZpbmUgd2l0aCB0aGUgbGFzdCAtZ29vZCByZWxlYXNlICgjNTg2ODkxKS4KKworMjAwOS0wNi0zMCAxNTo1NDo0NyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGNvbW1lbnQgb3V0IHVudXNlZCBzdHJ1Y3R1cmUKKworMjAwOS0wNi0zMCAxMzoxMjowOSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IG1vcmUgc2l6ZSBjaGVja3MsIGFuZCB1c2UgZ190cnlfbmV3MCgpIGluc3RlYWQgb2YgZ19uZXcwKCkKKwkgIFdoZW5ldmVyIHdlIGFsbG9jIHNvbWV0aGluZyBiYXNlZCBvbiBhIHVzZXItc3VwcGxpZWQgc2l6ZSwgd2Ugc2hvdWxkCisJICByZWFsbHkgdXNlIGdfdHJ5X25ldygpLCBvdGhlcndpc2Ugd2UgY2FuIGVhc2lseSBiZSBtYWRlIHRvIGFib3J0IGJ5CisJICBwYXNzaW5nIGEgcmlkaWN1bG91c2x5IGxhcmdlIG51bWJlciB0byB1cyBmb3IgYWxsb2NpbmcuIEZpeGVzCisJICBwcm9ibGVtcyB3aXRoIHNvbWUgZnV6emVkIGZpbGVzLgorCisyMDA5LTA2LTI5IDE4OjU4OjMzICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZ3VhcmQgYWdhaW5zdCBib2d1cyBhdG9tIHNpemVzIGFuZCBzaG9ydCByZWFkcworCSAgQ2hlY2sgdGhlIHBvc3NpYmx5IDY0LWJpdCBhdG9tIHNpemUgbW9yZSBjYXJlZnVsbHkgYmVmb3JlIGNhc3RpbmcgaXQKKwkgIHRvIGFuIGludCBhbmQgcGFzc2luZyBpdCB0byBnc3RfcGFkX3B1bGxfcmFuZ2UoKSwgb3RoZXJ3aXNlIHdlIG1pZ2h0CisJICBlbmQgdXAgcHVsbGluZyAwIGJ5dGVzLCBnZXR0aW5nIGFuIGVtcHR5IGJ1ZmZlciBhcyByZXF1ZXN0ZWQgYW5kCisJICBkZXJlZmVyZW5jaW5nIG5vdCBhdmFpbGFibGUgZGF0YSB3aGlsc3QgdGhpbmtpbmcgd2UgYWN0dWFsbHkgYXNrZWQKKwkgIGZvciBhbmQgZ290IDB4MTAwMDAwMDAwMDAwMCBieXRlcy4gU2ltaWxhciBmaXggZm9yIHB1c2ggbW9kZSBvcGVyYXRpb24KKwkgIHdoZXJlIG5lZWRlZGJ5dGVzIGVuZHMgdXAgYmVpbmcgMCBieXRlcywgd2hpY2ggbWFrZXMgdXMgYXNzZXJ0LiBGaXhlcworCSAgY3Jhc2ggd2l0aCBicm9rZW4gb3IgZnV6emVkIGZpbGUgKE5CICMxMjIzNzgpLgorCisyMDA5LTA2LTI5IDE2OjUyOjQxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogdXNlIDB4IHByZWZpeCB3aGVuIGxvZ2dpbmcgbnVtYmVycyBpbiBoZXgKKworMjAwOS0wNy0wMSAwODo0MDo0MCArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogRG9uJ3Qgc2VuZCBlbXB0eSBzdHJpbmcgdGFncworCisyMDA5LTA2LTMwIDIxOjM1OjM3ICswNDAwICBMUk4gPGxybjE5ODYgYXQgZ21haWwuY29tPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgRG9uJ3QgdXNlIHNlbmRtc2coKS1kZXBlbmRlbnQgY29kZSBvbiBXaW5kb3dzCisJICBGaXhlcyAjNTg1ODQyCisKKzIwMDktMDYtMzAgMTU6NTk6MjAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzoKKwkqIGdzdC9sYXcvYWxhdy5jOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LmM6CisJICBsYXc6IGZpeCBjYXBzIGFuZCBuZWdvdGlhdGlvbgorCSAgRml4IHRoZSBjYXBzIHRvIGluY2x1ZGUgdGhlIGRlcHRoIChpbnN0ZWFkIG9mIHdpZHRoIHR3aWNlKSBpbiB0aGUgY2FwcyBvZgorCSAgYXVkaW8veC1yYXctaW50LgorCSAgRml4IG5lZ290aWF0aW9uIHRvIG5vdCBvbmx5IGNvcHkgdGhlIHJhdGUvY2hhbm5lbHMgb2YgdGhlIGZpcnN0IHN0cnVjdHVyZS4KKworMjAwOS0wNi0zMCAxNDo0ODowOSArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGluY2x1ZGUgIjEuMD0xMDAlIiBpbiB2b2x1bWUgYW5kIGNoYW5nZSB1cHBlciBsaW1pdAorCSAgVXBwZXIgdm9sdW1lIGxpbW1pdCB3YXMgMTAwMC4gVGhhdCBhcHBlYXIgdW5uZWNlYXNyaWx5IGhpZ2guIEl0IHdvdWxkIGFsc28gY2F1c2UKKwkgIHNldmVyIGRpc3RvcnRpb24gaWYgYWNjaWRlbnRpYWx5IHVzZWQuIE5vdyBpdHMgMTAgKH4gKzE1ZGIpIHdoaWNoIGlzIGFsc28gaW4KKwkgIHN5bmMgd2l0aCB2b2x1bWUgYW5kIHBsYXliaW4yLgorCisyMDA5LTA2LTI5IDE1OjM5OjQzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkgIHB1bHNlOiBzb21lIG1vcmUgdHJpdmlhbCBjbGVhbnVwcworCisyMDA5LTA2LTI5IDE1OjM4OjQ5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VtaXhlci5jOgorCSAgcHVsc2U6IHRyaXZpYWwgY2xlYW51cHMKKworMjAwOS0wNi0yOSAxNToyMDozMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBjbGVhciByaW5nYnVmZmVyIHdoZW4gYXNrZWQgdG8KKwkgIFNpbmNlIHdlIG1hcCB0aGUgcmluZ2J1ZmZlciB0byB0aGUgcHVsc2VhdWRpbyBpbnRlcm5hbCByaW5nYnVmZmVyLCBmbHVzaCB0aGUKKwkgIHB1bHNlYXVkaW8gYnVmZmVyIHdoZW4gd2UgYXJlIGFza2VkIHRvIGNsZWFyIHRoZSByaW5nYnVmZmVyLgorCSAgVGhpcyBhdm9pZHMgc29tZSBsZWZ0b3ZlciBhdWRpbyBhZnRlciBhIHNlZWsuCisKKzIwMDktMDYtMjYgMTU6MDA6MTQgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogYXV0b2dlbi5zaDoKKwkgIGF1dG9nZW4uc2g6IEFjdHVhbGx5IGRvIHRoZSAnZWNobyAtbicgLT4gcHJpbnRmIGNoYW5nZS4KKworMjAwOS0wNi0yNiAxNDo0MDoxNCArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBhdXRvZ2VuLnNoOgorCSAgYXV0b2dlbi5zaDogVXNlIHByaW50ZiBpbnN0ZWFkIG9mICdlY2hvIC1uJy4gQ2hlY2sgZm9yIGF1dG9tYWtlLTEuMVswMV0KKwkgIENoZWNrIGZvciBtb3JlIGF1dG9tYWtlIGNvbW1hbmQgdmFyaWFudHMuIFVzZSBwcmludGYgaW5zdGVhZCBvZiAnZWNobyAtbicKKwkgIGZvciBwb3J0YWJpbGl0eQorCisyMDA5LTA2LTI2IDEzOjQyOjA5ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBmODEwMDMwIHRvIDU4NDViNjMKKworMjAwOS0wNi0yNiAxMzoxOTowNCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRvbid0IHByb2Nlc3MgdHJhY2tfbnVtL3RyYWNrX2NvdW50IHRhZ3Mgd2l0aCBhIDAgdmFsdWUKKwkgIE51bWJlci9jb3VudCB2YWx1ZXMgb2YgMCBtZWFuIHRoZXkncmUgbm90IHNldC4gRG9uJ3QgcHV0IHRob3NlIGluIHRoZQorCSAgdGFnbGlzdC4KKworMjAwOS0wNi0yNSAxODo1MToxMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXNpbmsuYzoKKwkgIHdhdmVmb3Jtc2luazogdXNlICdndWludDgnIGluc3RlYWQgb2YgJ2J5dGUnIHRvIGZpeCBjb21waWxhdGlvbiB3aXRoIE1TVkM4CisJICBXZSBuZWVkIGEgY2FzdCBoZXJlIGZvciBwb2ludGVyIGFyaXRobWV0aWMgdG8gd29yayBjb3JyZWN0bHksIGJ1dCBzb21lCisJICBNU1ZDIHZlcnNpb25zIGRvbid0IHNlZW0gdG8gbGlrZSAnYnl0ZScsIHNvIHVzZSBndWludDggaGVyZS4gSG9wZWZ1bGx5CisJICBmaXhlcyAjNTg1MzYxLgorCisyMDA5LTA2LTI1IDE5OjM5OjM3ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgIHY0bDJzcmM6IHNldCBzdHJ1Y3RzIHRvIHplcm8gYmVmb3JlIHVzaW5nIHRoZW0gaW4gaW9jdGxzCisJICBUaGlzIGZpeGVzIHZhbGdyaW5kIHdhcm5pbmdzLgorCisyMDA5LTA2LTI1IDEzOjIzOjQwICswMjAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IE1ha2Ugc3VyZSB3ZSBkb24ndCBibGFja2xpc3Qgc3RyZWFtcyBieSB3cm9uZ2x5IGNvbXBhcmluZyB0aGVpciBkdXJhdGlvbiB3aXRoIGVudGlyZSBjbGlwIGR1cmF0aW9uLgorCisyMDA5LTA2LTI1IDEzOjE4OjE0ICswMjAwICBLcnp5c3p0b2YgQsWCYXN6a293c2tpIDxrYiBhdCBzeXNtaWtyby5jb20ucGw+CisKKwkqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOgorCSAgcnRwZGVjOiBmaXggc29tZSBidWZmZXIgbGVha3MKKworMjAwOS0wNi0yNSAwODoxMTowOSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOgorCSAgZmx2cGFyc2U6IEFkZCBtaXNzaW5nIGJyZWFrIGluIHN3aXRjaC9jYXNlLgorCisyMDA5LTA2LTI1IDA4OjEwOjM4ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6CisJICBmbHZkZW11eDogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSwgaGludCBicmFuY2ggbGlrZWxpbmVzcywgYWRkIGNvbW1lbnRzLgorCisyMDA5LTA2LTI1IDA4OjA5OjU3ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUKKworMjAwOS0wNi0yNSAwNzo0MTowNyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogUmVtb3ZlIGRlYWQgYXNzaWdubWVudHMgYW5kIHVudXNlZCB2YXJpYWJsZXMuCisJICBBbHNvIGFkZCBicmFuY2ggbGlrZWxpbmVzcyBtYWNyb3MuCisKKzIwMDktMDYtMjUgMDc6NDA6MjYgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IEZpeCB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4gRml4ZXMgYnVpbGQgb24gbWFjb3N4CisKKzIwMDktMDYtMjQgMTc6NDM6MjUgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBmcmVlIG1lbW9yeSBpbiBmaW5hbGl6ZQorCSAgZmluYWxpemUgaXMgY2FsbGVkIG9ubHkgb25jZS4gbm8gbmVlZCB0byBjbGVhciBwb2ludGVycyB0aGVyZS4gZGlzcG9zZSBpcyBmb3IKKwkgIHVucmVmZmluZy4KKworMjAwOS0wNi0yNCAxNToxNDoxNCArMDEwMCAgSmFuIFNjaG1pZHQgPGphbi5zY2htaWR0QHN1bi5jb20+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA2YWIxMWQxIHRvIGY4MTAwMzAKKworMjAwOS0wNi0wOCAxNDo0Njo0OCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBzaG9ydC1jaXJjdWl0IGdzdF9hdmlfZGVtdXhfc3JjX2NvbnZlcnQoKSB3aGVuIHBhcnNpbmcgdGhlIGluZGV4CisJICBEb24ndCBjYWxsIGdzdF9hdmlfZGVtdXhfc3JjX2NvbnZlcnQoKSBmb3IgZWFjaCBzaW5nbGUgaW5kZXggZW50cnkuIE5vdAorCSAgb25seSBkbyB3ZSBhbHJlYWR5IGhhdmUgdGhlIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBjb250ZXh0LCB3ZSBhbHNvIGtub3cKKwkgIHRoZSBmb3JtYXRzIHdlIHdhbnQgdG8gY29udmVydCBmcm9tIGFuZCB0byBhbHJlYWR5LCBzbyB3ZSBtYXkganVzdCBhcworCSAgd2VsbCB1c2Ugb3B0aW1pc2VkIGNvbnZlcnNpb24gcm91dGluZXMgdGhhdCBieXBhc3Mgc29tZSBvZiB0aGUgY2hlY2tzCisJICBhbmQgbG9va3VwcyBtYWRlIGluIGdzdF9hdmlfZGVtdXhfc3JjX2NvbnZlcnQoKS4KKworMjAwOS0wNi0xNyAxNjozOTozNiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQW5vdGhlciByb3VuZCBvZiBHXypMSUtFTFkgbWljcm8tb3B0aW1pc2F0aW9ucy4KKworMjAwOS0wNi0xNyAxNjoyMDoyNSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogVGFrZSBsYXN0IHNhbXBsZSBkdXJhdGlvbiBmb3IgZHVtbXkgc2VnbWVudCBjYWxjdWxhdGlvbi4KKwkgIFRoaXMgZml4ZXMgdGhlIGNhc2VzIHdoZXJlIGZpbGVzIHdpdGhvdXQgRURMIHdvdWxkbid0IG91dHB1dCB0aGVpcgorCSAgbGFzdCBidWZmZXIuCisKKzIwMDktMDYtMjQgMTI6MzY6MzEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBTcHJpbmtsZSBicmFuY2ggbGlrZWxpbmVzcyBtYWNyb3Mgb3ZlciB0aGUgY29kZS4KKworMjAwOS0wNi0yMyAxNjo1NDozMiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJICByYXcxMzk0OiBzcHJpbmtsZSBicmFuY2ggbGlrZWxpbmVzcyBtYWNyb3MgYWNjcm9zcyB0aGUgY29kZS4KKworMjAwOS0wNi0xNCAxMDozNjoxNyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogQWRkIEdTVF9NRU1EVU1QIHN0YXRlbWVudHMgZm9yIHVua25vd24gYXRvbXMuCisJICBUaGlzIGlzIHRvIGhlbHAgZGV2ZWxvcGVycyB0cmFjayBkb3duIGFuZCBpbXBsZW1lbnQgdW5oYW5kbGVkIGF0b21zIGZhc3Rlci4KKworMjAwOS0wNi0yMyAxNzo1MTozMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgZGVpbnRlcmxhY2U6IFJlbW92ZSB0aGUgaW50ZXJsYWNlZCBmaWVsZCBmcm9tIHRoZSBvdXRwdXQgY2FwcyBpZiBkZWludGVybGFjaW5nIGlzIGVuYWJsZWQKKworMjAwOS0wNi0yMyAxNzo0ODo0NyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5jOgorCSAgZGVpbnRlcmxhY2U6IENvcHkgdGhlIGNvcnJlY3QgbGluZSBmcm9tIGNvcnJlY3QgcGxhY2UgaW4gdGhlIGhpc3RvcnkKKworMjAwOS0wNi0yMyAxNjozNTozNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogdXNlIHNhbWUgcHJvdG9jb2xzIGFmdGVyIHJlZGlyZWN0CisJICBBZnRlciBhIHJlZGlyZWN0IHdlIHdhbnQgdG8gdXNlIHRoZSBzYW1lIHByb3RvY29scyB0aGF0IHdlIHdlcmUgdXNpbmcgZm9yIHRoZQorCSAgY3VycmVudCB1cmwuCisKKzIwMDktMDYtMjMgMTU6MzU6MzcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBkb24ndCBsZWFrIGNvdmVyIGFydAorCisyMDA5LTA2LTIzIDE0OjEwOjEwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSAgdWRwOiBmaXggY29tcGlsZXIgd2FybmluZyBhYm91dCBFQUlfQUREUkZBTUlMWSBnZXR0aW5nIHJlZGVmaW5lZCBpbiBzb21lIGNhc2VzCisJICBJbmNsdWRlIHRoZSBoZWFkZXIgZnJvbSB3aGVyZSB3ZSBpbmNsdWRlIGFsbCB0aGUgc3lzdGVtIGhlYWRlcnMgd2l0aCB0aGUKKwkgIHNvY2tldCBzdHVmZiBiZWZvcmUgd2UgdHJ5IHRvIGRlZmluZSBFQUlfQUREUkZBTUlMWSBvdXJzZWx2ZXMsIG90aGVyd2lzZQorCSAgd2UgZGVmaW5lIGl0IG91cnNlbHZlcyBhbmQgdGhlbiBnZXQgYSBjb21waWxlciB3YXJuaW5nIGlmIGEgc3lzdGVtIGhlYWRlcgorCSAgZGVmaW5lcyBpdCBhcyB3ZWxsIHdpdGhvdXQgZ3VhcmRpbmcgYWdhaW5zdCBpdCBiZWluZyBkZWZpbmVkIGFscmVhZHkuCisKKzIwMDktMDYtMjMgMTQ6Mzk6NTYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIG1hdHJvc2thOiBhbmQgdGhlIG5ldyBoZWFkZXJzIHRvbworCisyMDA5LTA2LTIzIDE0OjMyOjQzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2tlOiBmaXggY29tcGlsZXIgZXJyb3IKKwkgIGNoYW5nZSBncG9pbnRlciB0byBndWludDggKiBmb3IgY29kZWNfc3RhdGUgYW5kIGNvZGVjX3ByaXYgYXMgc29tZQorCSAgZnVuY3Rpb25zIG9wZXJhdGUgb24gdGhvc2UgdHlwZXMgYW5kIGl0IGF2b2lkcyBicmVha2luZyBzdHJpY3QtYWxpYXNpbmcKKwkgIHJ1bGVzLgorCisyMDA5LTA2LTIzIDEyOjQyOjMzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGF2b2lkIGxlYWtpbmcgYnVmZmVycworCSAgRG9uJ3QgbGVhayBidWZmZXJzIHdoZW4gcmVzeW5jaW5nIHRvIGEga2V5ZnJhbWUuCisJICBBdm9pZCBsZWFraW5nIGJ1ZmZlcnMgd2hlbiBleGl0aW5nIHRoZSBsb29wIG9uIGVycm9yIGNvbmRpdGlvbnMuCisJICBBZGQgc29tZSBtb3JlIGRlYnVnIGluZm8uCisJICBGaXhlcyAjNTg1OTExCisKKzIwMDktMDYtMjIgMTU6NTY6NTggKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgdjRsMjogb3Blbi9jbG9zZSB0aGUgZGV2aWNlIGluIFJFQURZCisJICBUaGlzIGFsbG93cyB0byBxdWVyeSB0aGUgZGV2aWNlIGluIFJFQURZLiBCZWZvcmUgb25lIG5lZWQgdG8gc3dpdGNoIGl0IHRvIFBBVVNFRAorCSAgYW5kIHRoYXQgYWxzbyBzdGFydHMgc3RyZWFtaW5nLgorCisyMDA5LTA2LTIwIDE1OjQxOjQ0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6CisJICBxdGRlbXV4OiB1c2UgR1NUX01FTURVTVAKKworMjAwOS0wNi0xOSAwMDoxNjo0MSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hcGV0YWcvTWFrZWZpbGUuYW06CisJKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6CisJICBhcGVkZW11eDogYWRkIGNvbnRhaW5lci1mb3JtYXQgdGFnCisJICBVc2UgcGJ1dGlscyBoZXJlIGJlY2F1c2UgdGhlIHN0cmluZyBpcyB0cmFuc2xhdGVkLgorCisyMDA5LTA2LTE5IDAwOjE1OjUxICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2lkM2RlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6CisJICBpZDNkZW11eDogYWRkIGNvbnRhaW5lci1mb3JtYXQgdGFnCisJICBVc2luZyBwYnV0aWxzIGhlcmUgYmVjYXVzZSB0aGUgc3RyaW5nIGlzIHRyYW5zbGF0ZWQuCisKKzIwMDktMDYtMTggMjM6NTE6NTIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSAgZHZkZW11eDogcG9zdCBjb250YWluZXItZm9ybWF0IHRhZworCSAgQWxzbyBtZXJnZSB0aGUgdHdvIGFsbW9zdCBpZGVudGljYWwgX2FkZF8qX3BhZCgpIGZ1bmN0aW9ucyBpbnRvIG9uZS4KKworMjAwOS0wNi0xOCAyMzo0Mzo0OSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICBkdmRlbXV4OiBkb24ndCBzY3JldyB1cCBmaXJzdCBhdWRpbyBidWZmZXIKKwkgIFF1ZXJ5IHRoZSBhdWRpbyBmb3JtYXQsIGVzcC4gZHZkZW11eC0+bnVtX2NoYW5uZWxzLCBiZWZvcmUgd2UgdXNlIHRoYXQKKwkgIHZhcmlhYmxlIHRvIGFsbG9jYXRlIHRoZSBpbml0aWFsIGJ1ZmZlci4gVGhhdCB3YXkgd2UgZG9uJ3QgYWNjaWRlbnRhbGx5CisJICBwdXNoIGEgemVyby1zaXplZCBidWZmZXIgYXMgZmlyc3QgYXVkaW8gYnVmZmVyLgorCisyMDA5LTA2LTE4IDIzOjM4OjMwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSAgbXVsdGlwYXJ0ZGVtdXg6IHBvc3QgY29udGFpbmVyLWZvcm1hdCB0YWcKKworMjAwOS0wNi0xOCAyMzozNzoxMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2EtZGVtdXg6IHBvc3QgY29udGFpbmVyLWZvcm1hdCB0YWdzCisKKzIwMDktMDYtMTggMjM6MzY6MjggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogcG9zdCBjb250YWluZXItZm9ybWF0IHRhZworCisyMDA5LTA2LTE4IDIzOjM1OjI5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogcG9zdCBjb250YWluZXItZm9ybWF0IHRhZ3MKKworMjAwOS0wNi0yMSAxNzoxMzo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOgorCSAgYXVkaW9hbXBsaWZ5OiBGaXggaW50ZWdlciBvdmVyZmxvd3Mgb24gMzIgYml0IGFyY2hpdGVjdHVyZXMKKworMjAwOS0wNi0yMSAwOTo1MDo1NCArMDIwMCAgS2lwcCBDYW5ub24gPGtjYW5ub25AbGlnby5jYWx0ZWNoLmVkdT4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5LmM6CisJICBhdWRpb2FtcGxpZnk6IERvbid0IGRlY2xhcmUgYSBsb29wIGluZGV4IHN0YXRpYworCSAgVGhlIHByZXZpb3VzIHBhdGNoIHRvIGFkZCBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIHNhbXBsZSBmb3JtYXRzIHBvc3NpYmx5CisJICBpbnRyb2R1Y2VkIGEgcmVlbnRyYW5jeSBidWc6ICBhIHZhcmlhYmxlIHVzZWQgZm9yIGEgbG9vcCBpbmRleCB3YXMgZGVjbGFyZWQKKwkgIHN0YXRpYy4gIFRoaXMgcGF0Y2ggZml4ZXMgdGhhdCwgYW5kIGFsc28gYWRkcyBhICIvKiAqSU5ERU5ULU9OKiAqLyIgYW5ub3RhdGlvbgorCSAgZm9sbG93aW5nIHRoZSBtYWNybyBibG9jay4gIChJIGRvbid0IGtub3cgd2hhdCB0aGUgYW5ub3RhdGlvbiBpcyBmb3IsIGJ1dCB0aGUKKwkgIGFkZGVyLCB3aGVyZSBJIGNvcGllZCB0aGlzIGZyb20sIGhhcyBpdCkuCisKKzIwMDktMDYtMTkgMjI6Mzc6MjcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzoKKwkgIGF1ZGlvYW1wbGlmeTogRml4IG9mZi1ieS1vbmUgaW4gd3JhcC1wb3NpdGl2ZSBtb2RlCisKKzIwMDktMDYtMTkgMjI6MjA6NDUgKzAyMDAgIEtpcHAgQ2Fubm9uIDxrY2Fubm9uQGxpZ28uY2FsdGVjaC5lZHU+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5Lmg6CisJICBhdWRpb2FtcGxpZnk6IEFkZCBub2NsaXAgbWV0aG9kIGFuZCBzdXBwb3J0IGZvciBtb3JlIGZvcm1hdHMKKwkgIEZpeGVzIGJ1ZyAjNTg1ODI4IGFuZCAjNTg1ODMxLgorCisyMDA5LTA2LTE5IDIxOjQ2OjQxICswMjAwICBLb29wIE1hc3QgPGt3bUBmcmVlYnNkLm9yZz4KKworCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5oOgorCSAgdWRwOiBGaXggYnVpbGQgb24gRnJlZUJTRAorCSAgRml4ZXMgYnVnICM1ODYzOTcuCisKKzIwMDktMDYtMTkgMTg6MTI6MjcgKzAyMDAgIE9nbnlhbiBUb25jaGV2IDxvZ255YW4udG9uY2hldiBhdCBheGlzLmNvbT4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIHRlc3RzOiBhZGQgdW5pdCB0ZXN0cyBmb3IgYnVmZmVyLWxpc3QgcGF5bG9hZGVycworCSAgU2VlICM1ODU1NTkKKworMjAwOS0wNi0xOSAxODowMDozNSArMDIwMCAgT2dueWFuIFRvbmNoZXYgPG9nbnlhbi50b25jaGV2IGF0IGF4aXMuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5oOgorCSAgcnRwbXA0dnBheTogYWRkIHN1cHBvcnQgZm9yIGJ1ZmZlci1saXN0CisJICBTZWUgIzU4NTU1OQorCisyMDA5LTA2LTE5IDE3OjU3OjEyICswMjAwICBPZ255YW4gVG9uY2hldiA8b2dueWFuLnRvbmNoZXYgYXQgYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5Lmg6CisJICBydHBqcGVncGF5OiBhZGQgc3VwcG9ydCBmb3IgYnVmZmVyLWxpc3RzCisJICBTZWUgIzU4NTU1OQorCisyMDA5LTA2LTE5IDE3OjUzOjMyICswMjAwICBPZ255YW4gVG9uY2hldiA8b2dueWFuLnRvbmNoZXYgYXQgYXhpcy5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBydHBoMjY0cGF5OiBhZGQgc3VwcG9ydCBmb3IgYnVmZmVyLWxpc3RzCisJICBTZWUgIzU4NTU1OQorCisyMDA5LTA2LTE4IDExOjU0OjIyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6CisJICB1ZHB1dGlsczogZG9uJ3QgZnJlZSBpbnZhbGlkIG1lbW9yeQorCSAgQXMgc3BvdHRlZCBieSBiZW5qaUcgaW4gSVJDLgorCSAgZG9uJ3QgZnJlZSBpbnZhbGlkIG1lbW9yeSB3aGVuIGdldGFkZHJpbmZvIGZhaWxlZC4KKworMjAwOS0wNi0xNyAxNzo0ODozMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2Vpbms6IGRvbid0IGxlYWsgZGV2aWNlX2Rlc2NyaXB0aW9uCisJICBkb24ndCBsZWFrIHRoZSBkZXZpY2VfZGVzY3JpcHRpb24uCisJICBzb21lIGNsZWFudXBzLgorCisyMDA5LTA2LTE5IDE0OjQ0OjQwICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiB1cGRhdGUgLnBvIGZpbGVzIGZvciBzdW5hdWRpb21peGVyIHN0cmluZyBjaGFuZ2VzCisKKzIwMDktMDYtMTggMTY6NTg6MjYgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogc3RyZWFtaW5nOyBhZGp1c3Qgc2l6ZXMgdG8gY2F0ZXIgZm9yIHBhZGRpbmcgaW4gY2h1bmtzCisKKzIwMDktMDYtMTcgMTE6NTQ6NTMgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogc3RyZWFtaW5nIG1vZGU7IGhhbmRsZSBkYXRhIGNodW5rcyBncm91cGVkIGluIHJlYyBsaXN0cy4KKwkgIEZpeGVzICM1Njc5ODMuCisKKzIwMDktMDYtMTAgMTI6MzY6NTAgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBtYXAgc29tZSB0YWdzIHRvIENPTVBPU0VSIHJhdGhlciB0aGFuIEFSVElTVAorCisyMDA5LTA2LTEwIDEyOjM0OjQzICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZml4IHNvbWUgM0dQIHRhZyBleHRyYWN0aW9uIChrZXl3b3JkcywgZ2VucmUsIGxvY2F0aW9uKQorCisyMDA5LTA2LTA5IDE1OjM2OjUwICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IGV4dHJhY3QgcGl4ZWwtYXNwZWN0LXJhdGlvIGluZm9ybWF0aW9uCisKKzIwMDktMDYtMTcgMDc6MTQ6MDkgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IEZpeCBsZWFraW5nIG9mIHRoZSBNYXRyb3NrYSBUSVRMRSBlbGVtZW50CisKKzIwMDktMDYtMTYgMjA6Mzg6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmg6CisJKiBnc3QvZWZmZWN0di9nc3RyZXYuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5oOgorCSAgZWZmZWN0djogQWRkIGJhc2ljIGRvY3VtZW50YXRpb24gZm9yIHRoZSBlZmZlY3R2IGVsZW1lbnRzCisKKzIwMDktMDYtMTYgMjA6MTY6MTMgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWZmZWN0di5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzoKKwkgIGVmZmVjdHY6IERlZmluZSB0aGUgZmFzdCBQUk5HIGZ1bmN0aW9uIGF0IGEgY2VudHJhbCBwbGFjZQorCisyMDA5LTA2LTE2IDIwOjEzOjM1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvTWFrZWZpbGUuYW06CisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdGRpY2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGRpY2UuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdGVmZmVjdHYuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGVmZmVjdHYuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RyZXYuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuaDoKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uaDoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuaDoKKwkgIGVmZmVjdHY6IE1vdmUgdHlwZSBkZWZpbml0aW9ucyBpbnRvIHNlcGFyYXRlIGhlYWRlcnMKKwkgIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgZG9jcyBsYXRlci4KKworMjAwOS0wNi0xNiAxOTo0MTowMiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmM6CisJKiBnc3QvZWZmZWN0di9nc3R2ZXJ0aWdvLmM6CisJKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6CisJICBlZmZlY3R2OiBSZW1vdmUgZ2V0X3VuaXRfc2l6ZSBpbXBsZW1lbnRhdGlvbnMKKwkgIFRoZSBkZWZhdWx0IG9uIGZyb20gR3N0VmlkZW9GaWx0ZXIgaGFuZGxlcyB0aGlzIGFscmVhZHkuCisKKzIwMDktMDYtMTYgMTQ6NTQ6MzQgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGJ1bXAgY29yZS9iYXNlIHJlcXVpcmVtZW50cyB0byBnaXQKKwkgIE5lZWQgZ2l0IGNvcmUgZm9yIGJhc2VzaW5rIGJ1ZmZlcmxpc3QgYWRkaXRpb25zOyAtYmFzZSByZXF1aXJlbWVudAorCSAgYnVtcGVkIGdyYXR1aXRvdXNseS4KKworMjAwOS0wNi0xNiAxNToyNTo1NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc2luay5jOgorCSAgdGVzdHM6IGFkZCBzb21lIGRlYnVnLCBzZW5kIG5ld3NlZ21lbnQKKworMjAwOS0wNi0xNiAxNTowNjo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogYWRkIGRlYnVnIGxpbmUgZm9yIHRoZSBzb2NrZXQKKworMjAwOS0wNi0xNiAxNTowNjoyNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL2ZsYWNkZWMuYzoKKwkgIHRlc3RzOiB0dXJuIGdfcHJpbnQgaW50byBkZWJ1ZworCisyMDA5LTA2LTE2IDE1OjA0OjE1ICswMjAwICBPZ255YW4gVG9uY2hldiA8b2dueWFuQGF4aXMuY29tPgorCisJKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzaW5rLmM6CisJICBtdWx0aXVkcHNpbms6IGFkZCBzdXBwb3J0IGZvciBidWZmZXIgbGlzdHMKKwkgIEFkZCBzdXBwb3J0IGZvciBCdWZmZXJMaXN0IGFuZCBhZGQgYSB1bml0IHRlc3QuCisJICBGaXhlcyAjNTg1ODQyCisKKzIwMDktMDYtMTYgMDA6MDI6NDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IHJlc2V0IHNlc3Npb24gc3RhdGUgd2hlbiBzdG9wcGluZworCSAgSW5jcmVhc2VzIHRoZSBjaGFuY2VzIHRoYXQgdGhlIGVsZW1lbnQgaXMgYWN0dWFsbHkgcmV1c2FibGUuCisKKzIwMDktMDYtMTUgMjM6NDk6NDggKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IGxvZyByZXNwb25zZSBhbmQgcmVxdWVzdCBoZWFkZXJzIGFuZCBmaXggc29tZSBicm9rZW4gaW5kZW50aW5nCisKKzIwMDktMDYtMTUgMjI6NDA6MzUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJICBtcDRnZGVwYXk6IGd1ZXNzIGNvbnN0YW50RHVyYXRpb24gYmV0dGVyCisJICBEbyBhIGJldHRlciBqb2IgYXQgZ3Vlc3NpbmcgdGhlIGNvbnN0YW50RHVyYXRpb24gcGFyYW1ldGVyIHdoZW4gaXQgaXMgbm90CisJICBwcmVzZW50IGluIHRoZSBjYXBzLgorCSAgRml4ZXMgIzU4NTIwNQorCisyMDA5LTA2LTE1IDIxOjA5OjQ3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSAgd2FycHR2OiBDbGVhbiB1cCB3YXJwdHYgZWxlbWVudCBhbmQgZml4IHNvbWUgbWlub3IgYnVncyBhbmQgbGVha3MKKworMjAwOS0wNi0xNSAyMDo1MzoyMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkgIHZlcnRpZ290djogQ2xlYW4gdXAgdmVydGlnb3R2IGVsZW1lbnQgYW5kIGZpeCBzb21lIG1pbm9yIGJ1Z3MgYW5kIGxlYWtzCisKKzIwMDktMDYtMTUgMjA6Mzg6MDEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJICBkaWNldHY6IFVzZSBndWludDggaW5zdGVhZCBvZiBjaGFyICh3aGljaCBjYW4gYmUgc2lnbmVkIG9yIHVuc2lnbmVkKQorCisyMDA5LTA2LTE1IDIwOjM2OjM5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOgorCSAgc2hhZ2FkZWxpY3R2OiBVc2UgZ3VpbnQ4L2dpbnQ4IGluc3RlYWQgb2YgY2hhciAod2hpY2ggY2FuIGJlIHNpZ25lZCBvciB1bnNpZ25lZCkKKworMjAwOS0wNi0xNSAyMDozMTozMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzoKKwkgIHNoYWdhZGVsaWN0djogQ2xlYW4gdXAgZWxlbWVudCBhbmQgZnJlZSBhbGwgbWVtb3J5IGluIGZpbmFsaXplCisKKzIwMDktMDYtMTUgMjA6MjE6NTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RyZXYuYzoKKwkgIHJldnR2OiBDbGVhbiB1cCByZXZ0diBlbGVtZW50CisKKzIwMDktMDYtMTUgMjA6MDc6NDIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOgorCSAgcXVhcmt0djogU2ltcGxpZnkgc29tZSBjb2RlCisKKzIwMDktMDYtMTUgMjA6MDc6MTAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOgorCSAgcXVhcmt0djogVXNlIHRoZSBpbnB1dCBkYXRhIGlmIGEgTlVMTCBidWZmZXIgaXMgY2hvc2VuIGluc3RlYWQgb2YgdGhlIHZhbHVlIDAKKworMjAwOS0wNi0xNSAyMDowMDo0MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJICBxdWFya3R2OiBGaXggc2V0dGluZyB0aGUgcGxhbmVzIHByb3BlcnR5IG9mIHF1YXJrdHYKKwkgIFNldHRpbmcgaXQgdG8gYSB2YWx1ZTwxNiB3b3VsZCBjYXVzZSBjcmFzaGVzIGJlZm9yZSBiZWNhdXNlCisJICBjdXJyZW50X3BsYW5lIHdhcyBzZXQgdG8gdGhlIG9sZCBudW1iZXIgb2YgcGxhbmVzLTEuIEFsc28KKwkgIGZpeCBjYWxjdWxhdGlvbnMgZm9yIG5vbi0yXm4gcGxhbmVzIHZhbHVlcy4KKworMjAwOS0wNi0xNSAxNzo1MDo0MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJICBxdWFya3R2OiBDbGVhbiB1cCB0aGUgcXVhcmt0diBlbGVtZW50CisKKzIwMDktMDYtMTUgMTc6Mzk6MjAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RlZmZlY3R2LmM6CisJICBlZmZlY3R2OiBNYWtlIGVsZW1lbnRzIGxpc3QgY29uc3RhbnQKKworMjAwOS0wNi0xNSAxNzozNzo1MyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzoKKwkgIGVkZ2V0djogQ2xlYW4gdXAgZWRnZXR2IGVsZW1lbnQgYW5kIGZpeCBtZW1vcnkgbGVhaworCisyMDA5LTA2LTE1IDE3OjIxOjU4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOgorCSAgZGljZXR2OiBDbGVhbiB1cCBkaWNldHYgZWxlbWVudCBhbmQgZml4IHNvbWUgc21hbGxlciBpc3N1ZXMKKwkgIFRoaXMgZml4ZXMgYSBtZW1vcnkgbGVhayAodGhlIGRpY2UgbWFwKSBhbmQgYSBjcmFzaCB3aGVuCisJICBzZXR0aW5nIHRoZSBzcXVhcmUtYml0cyBwcm9wZXJ0eSBiZWZvcmUgY2FwcyBhcmUgc2V0LgorCisyMDA5LTA2LTE1IDE3OjIwOjIxICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvTWFrZWZpbGUuYW06CisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSAgYWdpbmd0djogQWN0dWFsbHkgdXNlIEdzdENvbnRyb2xsZXIgZm9yIHN5bmNpbmcgdGhlIHByb3BlcnRpZXMgdG8gdGltZXN0YW1wcworCisyMDA5LTA2LTE1IDE3OjAzOjM4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuYzoKKwkgIGFnaW5ndHY6IEV4cG9ydCBzb21lIG1vcmUgYWdpbmd0diBwcm9wZXJ0aWVzIHZpYSBHT2JqZWN0IHByb3BlcnRpZXMKKworMjAwOS0wNi0xNSAxNTowNjo1NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJICBhZ2luZ3R2OiBHZW5lcmFsIGNsZWFudXAgYW5kIHVwZGF0aW5nIG9mIGNvcHlyaWdodAorCSAgQWxzbyBtYWtlIHRoZSBzY3JhdGNoLWxpbmVzIHByb3BlcnR5IGV4cG9ydGVkIHZpYSBhIEdPYmplY3QKKwkgIHByb3BlcnR5IGFuZCBpbml0aWFsaXplL3Jlc2V0IHRoZSBpbnRlcm5hbCBzdGF0ZSBjb3JyZWN0bHkuCisKKzIwMDktMDYtMTUgMTU6MDU6NTggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSAgYWdpbmd0djogU3RvcmUgYW5kIHVwZGF0ZSBzdGF0ZSBpbnNpZGUgdGhlIGluc3RhbmNlIHN0cnVjdAorCSAgVGhpcyBtYWtlcyB0aGUgY29sb3JhZ2luZyBlZmZlY3QgYW5kIHBpdHMgZWZmZWN0IHZpc2libGUuCisKKzIwMDktMDYtMTUgMTU6NTE6MzIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IHJlZiBjdXN0b20gcmluZyBidWZmZXIgY2xhc3MgYW5kIHR5cGUgaW4gY2xhc3NfaW5pdAorCSAgSGFjayBhcm91bmQgdGhyZWFkLXNhZmV0eSBpc3N1ZXMgaW4gR09iamVjdCBhbmQgb3VyIHJhY3kgX2dldF90eXBlKCkKKwkgIGZ1bmN0aW9ucyAod2UgY291bGQgZWFzaWx5IGZpeCB0aGUgX2dldF90eXBlKCkgZnVuY3Rpb25zLCBidXQgd2Ugc3RpbGwKKwkgIG5lZWQgdG8gaGFjayBhcm91bmQgdGhlIEdPYmplY3QgY2xhc3MgcmFjZXMgdW50aWwgd2UgcmVxdWlyZSBhIG5ld2VyCisJICBHTGliIHZlcnNpb24sIEkgdGhpbmspLgorCisyMDA5LTA2LTE0IDE5OjE5OjE5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2R2L2RlbW8tcGxheS5jOgorCSogdGVzdHMvb2xkL2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCSogdGVzdHMvb2xkL2V4YW1wbGVzL2xldmVsL01ha2VmaWxlLmFtOgorCSogdGVzdHMvb2xkL2V4YW1wbGVzL2xldmVsL1JFQURNRToKKwkqIHRlc3RzL29sZC9leGFtcGxlcy9sZXZlbC9kZW1vLmM6CisJKiB0ZXN0cy9vbGQvZXhhbXBsZXMvbGV2ZWwvcGxvdC5jOgorCSogdGVzdHMvb2xkL2V4YW1wbGVzL3N3aXRjaC8uZ2l0aWdub3JlOgorCSogdGVzdHMvb2xkL2V4YW1wbGVzL3N3aXRjaC9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL29sZC9leGFtcGxlcy9zd2l0Y2gvc3dpdGNoZXIuYzoKKwkgIFJlbW92ZSBhIGZldyBvbGQgZXhhbXBsZSBhcHBzIGZyb20gdGhlIDAuOCBkYXlzCisJICBTb21lIGhhdmUgYmVlbiByZXBsYWNlZCBieSBuZXdlciBvbmVzLCBvdGhlcnMgYXJlIGRlbW9pbmcgZWxlbWVudHMgdGhhdAorCSAgZG9uJ3QgZXhpc3QgYW55IGxvbmdlciAobm90IGluIC1nb29kIGFueXdheSksIGFuZCBvdGhlcnMgaGF2ZSBub3QgYmVlbgorCSAgdG91Y2hlZCBpbiBtYW55IHllYXJzIGFuZCBpdCBzZWVtIHBvaW50bGVzcyB0byBrZWVwIHRoZW0gYXJvdW5kLgorCSAgUmVtb3ZpbmcgdGhlc2UgZmlsZXMgbWFrZXMgc3VyZSB3ZSBkb24ndCBoYXZlIGFueSBjb2RlIGluIG91ciByZXBvc2l0b3J5CisJICB0aGF0IHVzZXMgR3RrKyBzeW1ib2xzIHdoaWNoIGFyZSB0byBiZSByZW1vdmVkIGZvciBHTk9NRTMsIGFuZCBhcyBzdWNoCisJICB3aWxsIG1ha2Ugc29tZSBzY3JpcHQgdGhhdCBncmVwcyBmb3IgdGhpcyBraW5kIG9mIHN0dWZmIGdpdmUgdXMgYSBjbGVhbgorCSAgYmlsbCBvZiBjb2RlIGhlYWx0aC4gRml4ZXMgIzU4NTc1Ny4KKworMjAwOS0wNi0xMyAyMTowMjo0NSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkqIGNvbW1vbjoKKwkqIGdzdC9ydHAvZ3N0cnRwc2lyZW5wYXkuYzoKKwkgIHJ0cHNpcmVucGF5OiBSZW1vdmUgZGVwcmVjYXRlZCBzeW1ib2wKKwkgIFBhdGNoIGJ5OiBMdWlzIE1lbmluYQorCisyMDA5LTA2LTEzIDEwOjQzOjU1ICswMjAwICBNYXJ2aW4gU2NobWlkdCA8bWFydmluX3NjaG1pZHRAZ214Lm5ldD4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICB0ZXN0czogRG9uJ3QgcnVuIHRoZSBmbGFjZGVjIHRlc3QgaWYgdGhlIHBsdWdpbiBpc24ndCBidWlsdC4gRml4ZXMgIzU4NTYzMAorCisyMDA5LTA2LTEyIDE2OjA2OjI4ICswMjAwICBQYXRyaWNrIFJhZGl6aSA8cGF0cmljay5yYWRpemkgYXQgYXhpcy5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IEFkZCBSVFAgYmxvY2tzaXplIGZ1bmN0aW9uYWxpdHkKKwkgIEFkZCBwcm9wZXJ0eSB0byBtYWtlIHRoZSBjbGllbnQgc3VnZ2VzdCBhIGJsb2Nrc2l6ZSB0byB0aGUgc2VydmVyLgorCSAgRml4ZXMgIzU4NTU0OQorCisyMDA5LTA2LTExIDIyOjMwOjA2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL1JFQURNRToKKwkgIHJ0cDogdXBkYXRlIFJFQURNRSwgZml4IHNvbWUgdHlwb3MsIG1lbnRpb24gZ3N0cnRwYmluCisKKzIwMDktMDYtMTEgMTk6MTA6NTMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogaGFuZGxlIGJvcmRlciBjYXNlcyBpbiByZXNhbXBsZXIKKworMjAwOS0wNi0xMSAxMzozMjoyMiArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBjb21tb246CisJKiBkb2NzL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy91cGxvYWQubWFrOgorCSAgZG9jczogQnVtcCBjb21tb24uIFVzZSB1cGxvYWQtZG9jLm1hayBpbnN0ZWFkIG9mIHVwbG9hZC5tYWsKKwkgIFJlbW92ZSB0aGUgbG9jYWwgY29weSBvZiB1cGxvYWQubWFrIGluIGZhdm91ciBvZiB1c2luZyB0aGUgc2hhcmVkCisJICB1cGxvYWQtZG9jLm1ha2UgaW4gY29tbW9uLworCisyMDA5LTA2LTExIDExOjM5OjI1ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9nb29tL2dvb21fY29uZmlnX3BhcmFtLmg6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICBkb2NzOiBRdWlldGVuIGEgY291cGxlIG1vcmUgZG9jcyB3YXJuaW5ncworCisyMDA5LTA2LTExIDExOjI3OjI2ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9sem8uYzoKKwkgIGRvY3M6IFJlbW92ZSBndGstZG9jIGNvbW1lbnQgbWFya2VyCisJICBUaGVzZSBjb21tZW50IGJsb2NrcyBhcmVuJ3QgZ3RrLWRvYyBjb21tZW50cyBhbmQgY2F1c2UgYW5ub3lpbmcgbm9pc2UgaW4KKwkgIHRoZSBkb2NzIGJ1aWxkLgorCisyMDA5LTA2LTExIDEwOjA1OjMyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuaDoKKwkgIGRlaW50ZXJsYWNlOiBJbXBsZW1lbnQgdXBzdHJlYW0gbmVnb3RhdGlvbgorCisyMDA5LTA2LTEwIDIxOjQ3OjQwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogSW1wcm92ZSBkZWJ1Z2dpbmcgYW5kIGNsZWFuIHVwIHNvbWUgY29kZQorCisyMDA5LTA2LTEwIDE0OjU1OjE4ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogQ2xpcCBidWZmZXJzIHRvIHRoZSBjdXJyZW50IHNlZ21lbnQgaWYgcG9zc2libGUKKworMjAwOS0wNi0xMCAxNDo0NTowNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmg6CisJICBkZWludGVybGFjZTogQ2xlYW4gdXAgaW5jbHVkZXMgYW5kIGNsZWFuIHVwIG9yZGVyIG9mIGluc3RhbmNlIHN0cnVjdCBmaWVsZHMKKworMjAwOS0wNi0xMCAxNjowOTo1NiAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkgIHJ0cGgyNjNwYXk6IERlZmF1bHQgdG8gZG9pbmcgQSwgQiBhbmQgQyBtb2Rlcywgbm90IG9ubHkgQQorCisyMDA5LTA2LTEwIDA5OjU2OjExICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICBkZWludGVybGFjZTogRml4IFFvUyBjYWxjdWxhdGlvbnMKKwkgIFRoZSBkaWZmIGlzIGEgc2lnbmVkIGludGVnZXIsIG5vdCBhbiB1bnNpZ25lZCBvbmUgb2YgY291cnNlLgorCSAgSW4gbW9kZXMgb3RoZXIgdGhhbiBHU1RfREVJTlRFUkxBQ0VfQUxMIGV2ZXJ5IGZyYW1lIGhhcyB0d2ljZSB0aGUKKwkgIGR1cmF0aW9uIG9mIHRoZSBmaWVsZCBkdXJhdGlvbi4KKworMjAwOS0wNi0wOSAxNDoxMzozMSAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJICBydHBzaXJlbnBheTogUHV0IHRoZSBiaXRyYXRlIGluIHRoZSBSVFAgY2FwcworCSAgVGhlIE1TIGNvZGUgc2VlbXMgdG8gcmVxdWlyZSB0aGUgYml0cmF0ZSB0byBpbnRlcm9wZXJhdGUgYW5kCisJICBkcmFmdC1pZXRmLWF2dC1ydHAtZzcyMjEtMDAgYWxzbyBoYXMgaXQuCisKKzIwMDktMDYtMDkgMTk6NTU6MzYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5oOgorCSAgZGVpbnRlcmxhY2U6IEltcGxlbWVudCBiYXNpYyBRb1MKKwkgIFRoaXMgY2hhbmdlIGlzIGJhc2VkIG9uIFRpbSdzIFFvUyBpbXBsZW1lbnRhdGlvbgorCSAgZm9yIGpwZWdkZWMuCisKKzIwMDktMDYtMDkgMTk6Mjk6NTEgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBEaXJlY3RseSBwcm94eSBldmVudHMvcXVlcmllcyB0byB0aGUgcGVlciBwYWRzCisJICBUaGlzIHJlbW92ZXMgc29tZSBvdmVyaGVhZCBpbnRyb2R1Y2VkIGJ5IHRoZSBkZWZhdWx0IGhhbmRsZXJzCisJICB0aGF0IG5lZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZSBvdGhlciBwYWRzLgorCisyMDA5LTA2LTA5IDEwOjM4OjUyICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogZGVidWdfbWVtZHVtcCgpIHVua25vd24gdGFncy4gUmVmYWN0b3IganVuayBwYXJzaW5nIGNvZGUuCisJICBUaGlzIG1ha2VzIGxpZmUgc2xpZ2h0bHkgZWFzaWVyIHdoZW4gZGVidWdnaW5nIGF2aSBmaWxlcy4KKworMjAwOS0wNi0wOCAwODoyMTo0MyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgIHJ0cDogRG9uJ3QgZm9yZ2V0IHRvIGRpc3QgdGhlIGhlYWRlcnMgZm9yIHRoZSBDRUxUIChkZSlwYXlsb2FkZXJzLgorCisyMDA5LTA2LTA3IDIwOjU0OjA2ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBSZXZlcnQgIlJldmVydCAicXRkZW11eDogZmlsbCB0aW1lc3RhbXAgdGFibGUgY29tcGxldGVseSIiCisJICBUaGlzIHJldmVydHMgY29tbWl0IDlmMDIyYzhhODUwM2MyY2UwZmE2MTdmZGI1MGU0MTcwNmRkNDEyZjUuCisJICBTb3JyeSwgSSB3YXMgdGhpbmtpbmcgYWJvdXQgdGhlIHdyb25nIG1vZHVsZS4KKworMjAwOS0wNi0wNyAyMDo0OTo1MCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgUmV2ZXJ0ICJxdGRlbXV4OiBmaWxsIHRpbWVzdGFtcCB0YWJsZSBjb21wbGV0ZWx5IgorCSAgVGhpcyByZXZlcnRzIGNvbW1pdCA3OTBiMDUwZmM1MzAyY2FlODljZGRjZDIzYjI1ODA5Mzk2N2QwNWE5LgorCSAgSSBmb3Jnb3Qgd2Ugd2VyZSBmcm96ZW4uCisKKzIwMDktMDYtMDcgMjA6NDY6NDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpbGwgdGltZXN0YW1wIHRhYmxlIGNvbXBsZXRlbHkKKwkgIFdoZW4gdGhlcmUgYXJlIGxlc3MgdGltZXN0YW1wcyB0aGF0IHRoZXJlIGFyZSBzYW1wbGVzLCBmaWxsIHVwIHRoZSBzYW1wbGUgdGFibGUKKwkgIHdpdGggdGhlIGxhc3Qga25vdyB0aW1lc3RhbXAuIFRoaXMgc2l0dWF0aW9uIGNhbiBoYXBwZW4gd2hlbiB0aGUgbGFzdCBzYW1wbGUKKwkgIGRvZXMgbm90IGRlY29kZSBhbmQgZG9lc24ndCBuZWVkIGEgdGltZXN0YW1wLiBXZSBob3dldmVyIGNhbGN1bGF0ZSB0aGUgdG90YWwKKwkgIHRyYWNrIGxlbmd0aCB1c2luZyB0aGUgbGFzdCBzYW1wbGUgdGltZXN0YW1wIHNvIHdlIG5lZWQgdG8gaGF2ZSBzb21ldGhpbmcKKwkgIHNlbnNpYmxlIGluIHRoZXJlLgorCSAgRml4ZXMgIzU4NTA1NgorCisyMDA5LTA2LTA3IDEzOjM3OjA0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBoYW5kbGUgTElTVCBJTkZPIG9mIDAgc2l6ZQorCSAgSGFuZGxlIExJU1QgSU5GTyBjaHVua3Mgb2YgMCBzaXplIGluc3RlYWQgb2YgY2F1c2luZyBlcnJvcnMuCisJICBGaXhlcyAjNTg0OTgxCisKKzIwMDktMDYtMDcgMTM6MjQ6NDUgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgUmV2ZXJ0ICJ3YXZwYXJzZTogUmVtb3ZlIGRlYWQgYXNzaWdubWVudHMsIG1vdmUgdmFyaWFibGUgdG8gd2hlcmUgaXQncyBuZWVkZWQuIgorCSAgUmV2ZXJ0cyBjb21taXQgNDQyNTZhNzhmOGRkNzlhOTFmM2JiMmFiN2MzYWE2MjNjMDk3YmI4YSBhbmQgdXNlIHRoZSByZXN1bHQgaW4KKwkgIGVycm9yIHJlcG9ydGluZyBzbyB0aGF0IHdlIGNhbiBzZWUgd2hhdCdzIGdvaW5nIG9uLgorCisyMDA5LTA2LTA1IDE4OjU1OjAyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5oOgorCSAgY2VsdGRlcGF5OiBhZGQgQ0VMVCBkZXBheWxvYWRlcgorCisyMDA5LTA2LTA1IDE1OjMwOjUxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwY2VsdHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBjZWx0cGF5Lmg6CisJICBydHBjZWx0cGF5OiBhZGQgQ0VMVCBSVFAgcGF5bG9hZGVyCisKKzIwMDktMDYtMDUgMTY6NTQ6NDggKzAxMDAgIEphbiBTY2htaWR0IDxqYW4uc2NobWlkdEBzdW4uY29tPgorCisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyb3B0aW9ucy5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJ0cmFjay5jOgorCSAgc3VuYXVkaW86IEZpeCBzd2l0Y2ggc2V0dGluZyBvbiBzb21lIGRldmljZXMuIEFkZCBkZWJ1Zy4gRml4IGEgRklYTUUuCisJICBGaXggdGhlIHNldHRpbmcgb2YgdG9nZ2xlIHN3aXRjaGVzIG9uIHNvbWUgYnJva2VuIGF1ZGlvIGRyaXZlcnMgd2hpY2gKKwkgIHJlcG9ydCB0aGF0IG5vIGF1ZGlvIHBvcnRzIGFyZSBzZXR0YWJsZSBieSBpZ25vcmluZyB0aGUgbW9kX3BvcnQgZmllbGQKKwkgIHRoZXJlLgorCSAgQWRkIHNvbWUgZGVidWcgc3RhdGVtZW50cy4KKwkgIEZpeCBhIEZJWE1FIG5vdyB0aGF0IEdvb2QgcmVsaWVzIG9uIGEgbmV3IGVub3VnaCBnc3QtcGx1Z2lucy1iYXNlLgorCisyMDA5LTA2LTA0IDEyOjI3OjE5ICswMTAwICBKYW4gU2NobWlkdCA8amFuLnNjaG1pZHRAc3VuLmNvbT4KKworCSogc3lzL3N1bmF1ZGlvL01ha2VmaWxlLmFtOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuaDoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyb3B0aW9ucy5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJvcHRpb25zLmg6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcnRyYWNrLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcnRyYWNrLmg6CisJICBzdW5hdWRpbzogU3VwcG9ydCBuZXcgZmxhZ3MgZm9yIG9wdGlvbnMgYW5kIGFjdGlvbnMKKwkgIFVzZSBuZXcgYXVkaW8gbWl4ZXIgZmxhZ3MgYWRkZWQgaW4gQmFzZSAwLjEwLjIzIHRvIGV4cG9zZSBmbGFncyBhbmQgb3B0aW9ucworCSAgb24gdGhlIFN1bkF1ZGlvIGRldmljZXMuCisJICBGaXhlczogIzU4MzU5MworCSAgUGF0Y2ggQnk6IEJyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ac3VuLmNvbT4KKwkgIFBhdGNoIEJ5OiBHYXJyZXR0IEQnQW1vcmUgPGdhcnJldHQuZGFtb3JlQHN1bi5jb20+CisKKzIwMDktMDUtMTUgMTE6NTA6MzggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5oOgorCSAgZGVpbnRlcmxhY2U6IEZpcnN0IHRyeSB0byBoYW5kbGUgRFZEIHN0aWxsIGZyYW1lcyBjb3JyZWN0bHkKKwkgIFRoaXMgaGVscHMgYSBiaXQgd2l0aCBidWcgIzU4Mjc0MCBidXQgc3RpbGwgZG9lc24ndCBtYWtlIGl0IHdvcmsuCisKKzIwMDktMDYtMDQgMTc6Mzc6MDMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBvbmx5IG5vdGlmeSBpZiBhbGwgY2hlY2tzIHBhc3NlZAorCSAgUmVwbGFjZSBnb3RvIGRvbmU6IHdpdGggcmV0dXJuLCBhcyB0aG9zZSBhcmUgY2hlY2tzIHdoZW4gd2UgZG9uJ3Qgd2FudCB0byBmbGFnIGEKKwkgIHBlbmRpbmcgbm90aWZ5LgorCisyMDA5LTA2LTA0IDE1OjE5OjA1ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBzZXQgdGhlIHJpZ2h0IHN0YXRlIG9uIHJ0cGJpbgorCSAgV2UgbmVlZCB0byBzZXQgdGhlIHN0YXRlIG9mIGdzdHJ0cGJpbiB0byB0aGUgc2FtZSBzdGF0ZSBhcyBvdXIgc291cmNlIGVsZW1lbnRzLgorCSAgVGhpcyBmaXhlcyBmYWxsYmFjayB0byBUQ1AgYWdhaW4uCisKKzIwMDktMDYtMDMgMTg6MjM6NTMgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBjaGVjayBwb2ludGVyIGJlZm9yZSBhY2Nlc3NpbmcKKwkgIE1vdmUgZXhpc3RpbmcgY2hlY2sgYSBmZXcgbGluZXMgdXAsIHNvIHRoYXQgd2UgY2hlY2sgYmVmb3JlIGFjY2Vzc2luZyBmaWVsZHMuCisKKzIwMDktMDYtMDMgMTg6MjE6MTIgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiByZW5hbWUgZ3N0X3B1bHNlX3NpbmtfZ2V0X3RpbWUgdG8gZ3N0X3B1bHNlc2lua19nZXRfdGltZQorCSAgUmVuYW1lIGludGVybmFsIG1ldGhvZCBmb3IgY29uc2lzdGVuY3kuCisKKzIwMDktMDYtMDMgMTg6MTk6MjIgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiB1c2UgdmFsdWVzIGZyb20gcGFfc3RyZWFtX2dldF9idWZmZXJfYXR0cigpCisJICBXZSB3ZXJlIHB1dHRpbmcgdGhlIHJlcXVlc3RlZCB2YWx1ZXMgYmFjayBpbnRvIHJpbmdidWZmZXIgc3BlYywgaW5zdGVhZCBvZgorCSAgdXNpbmcgdGhlIHF1ZXJpZWQgdmFsdWVzLgorCisyMDA5LTA2LTAyIDE5OjMyOjIxICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdwYXkuYzoKKwkgIHZyYXdwYXk6IHRyaW0gb3V0cHV0IGJ1ZmZlcnMKKwkgIFJlbW92ZSB0aGUgbGVmdG92ZXIgdW51c2VkIGJ5dGVzIGluIHRoZSBvdXRwdXQgYnVmZmVyLgorCSAgRml4ZXMgIzU4NDYxMworCisyMDA5LTA2LTAyIDE5OjMwOjMwICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSAgdnJhd2RlcGF5OiBmaXggcGFyc2luZyBvZiBzYW1wbGluZyBmaWVsZAorCSAgY29tbWl0IGExMmQ5YTgwZjIyNWJlOTdiMzY3NGIxYTA1MDZhYzY2NTQ0ZGJmNDkgYnJva2UgdGhlIHBhcnNpbmcgb2YgdGhlCisJICBzYW1wbGluZy4KKworMjAwOS0wNS0yNyAxNzowNjozNCArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgcG5nZGVjOiBBdm9pZCBwb3NzaWJsZSBvdmVyZmxvdyBpbiBjYWxjdWxhdGlvbnMKKwkgIEEgbWFsZm9ybWVkIChvciBzaW1wbHkgaHVnZSkgUE5HIGZpbGUgY2FuIGxlYWQgdG8gaW50ZWdlciBvdmVyZmxvdyBpbgorCSAgY2FsY3VsYXRpbmcgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIsIGxlYWRpbmcgdG8gY3Jhc2hlcyBvciBidWZmZXIKKwkgIG92ZXJmbG93cyBsYXRlci4gRml4ZXMgU0EzNTIwNSBzZWN1cml0eSBhZHZpc29yeS4KKworMjAwOS0wNi0wMiAwMDo0ODowMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIGZsYWNlbmM6IHNvbWUgbW9yZSBsb2dnaW5nIC0gZHVtcCBoZWFkZXIgcGFja2V0cworCSAgQWxzbywgdGhlIGZpbmFsIGZpeGluZyB1cCBvZiB0aGUgaGVhZGVycyBpcyBleHBlY3RlZCBhbmQgbm90IHNvbWV0aGluZworCSAgd2Ugc2hvdWxkIHdhcm4gYWJvdXQuCisKKzIwMDktMDYtMDIgMDA6Mzc6MTUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBmbGFjZW5jOiBuZXZlciBldmVyIHBhc3MgdmFsdWVzID4zNmJpdHMgdG8gX3NldF90b3RhbF9zYW1wbGVzX2VzdGltYXRlKCkKKwkgIExldCdzIGJlIHBhcmFub2lkIGFuZCBtYWtlIHN1cmUgd2UgbmV2ZXIgcGFzcyBhIG51bWJlciB0aGF0IHRha2VzIHVwCisJICBtb3JlIHRoYW4gMzYgYml0cyB0byBfc2V0X3RvdGFsX3NhbXBsZXNfZXN0aW1hdGUoKSwgc2luY2UgbGliRkxBQworCSAgZXhwZWN0cyBhbGwgdGhlIG90aGVyIGJpdHMgdG8gYmUgemVybywgYW5kIGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlCisJICBuZWlnaGJvdXJpbmcgZmllbGRzIGluIHRoZSBnbG9iYWwgc3RyZWFtIGluZm8gaGVhZGVyIG1heSBnZXQgbWVzc2VkCisJICB1cCBpbmFkdmVydGVudGx5LCBzbyB0aGF0IGZsYWMgLWQgcmVmdXNlcyB0byBkZWNvZGUgdGhlIHN0cmVhbS4KKwkgIFNlZSAjNTg0NDU1LgorCisyMDA5LTA2LTAxIDIyOjMzOjAyICswMjAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgKGF0KSBhcGVzdGFhcnQgKGRvdCkgb3JnPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBBZGRyZXNzIGJhZCBGTEFDIHNhbXBsZSBsZW5ndGggZW5jb2Rpbmcgb2YgIzU4NDQ0NTUKKwkgIENvbW1pdCBkZjcwN2M2NjY0MzNhNzhkMzg3OGFmNmYwNTU2OThkNTc1NjIyNmM0CisJICBpbnRyb2R1Y2VkIGFuIG9idmlvdXMgYnVnIGluIHRoZSBzYW1wbGUgbGVuZ3RoIGNhbGN1bGF0aW9uLAorCSAgdXNpbmcgdGhlIHdyb25nIG1hY3JvIGZvciBjb252ZXJzaW9uLgorCisyMDA5LTA2LTAxIDExOjU4OjIxIC0wNzAwICBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uQHN1bi5jb20+CisKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbW14Lmg6CisJICBkZWludGVybGFjZTogRml4IHNwdXJpb3VzIGNvbG9ucyBpbiBhc20gY29kZQorCSAgRml4ZXMgIzU4NDE3NC4KKwkgIFNpZ25lZC1vZmYtYnk6IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisyMDA5LTA2LTAxIDAwOjQwOjU1ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IHNraXAgSlVOSyBjaHVua3MgaW4gZGF0YSBzZWN0aW9uIGluIHN0cmVhbWluZyBtb2RlCisJICBTa2lwIEpVTksgdGFncyBpbiBzdHJlYW1pbmcgbW9kZSBhcyB3ZWxsIGluc3RlYWQgb2YgRU9TaW5nCisJICBwcmVtYXR1cmVseS4gRml4ZXMgIzU2NDEwMC4KKworMjAwOS0wNS0yOCAxNDowMToxNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2JncmEuYzoKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2k0MjAuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIHZpZGVvbWl4ZXI6IERvbid0IHVzZSAvLyBjb21tZW50cworCisyMDA5LTA1LTI4IDEzOjU2OjE1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfYmdyYS5jOgorCSAgdmlkZW9taXhlcjogRml4IGJhY2tncm91bmQgYmxpdHRpbmcgd2hlbiBhIGNvbG9yIG1vZGUgaXMgc2VsZWN0ZWQgd2l0aCBCR1JBCisKKzIwMDktMDUtMjggMTM6NTQ6MTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9heXV2LmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9iZ3JhLmM6CisJKiBnc3QvdmlkZW9taXhlci9ibGVuZF9pNDIwLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmg6CisJICB2aWRlb21peGVyOiBTb21lIGNsZWFudXAgYW5kIGZpeCB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGZyYW1lIHNpemUgaW4gYnl0ZXMKKworMjAwOS0wNS0yOCAxMzozNTo1MiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2k0MjAuYzoKKwkgIHZpZGVvbWl4ZXI6IEZpeCBJNDIwIGJsZW5kaW5nIHRvIGFjdHVhbGx5IGRvIHNvbWV0aGluZworCSAgRm9yIHRoaXMgd2UgYSkgaW1wbGVtZW50IHRoZSBjaGVja2VycyBmaWxsaW5nIGFuZCBiKQorCSAgYWN0dWFsbHkgYmxlbmQgdGhlIHNyYy9kZXN0IGJ5IHVzaW5nIHRoZSBzcmMgYWxwaGEgdmFsdWUKKwkgIGZyb20gdGhlIHBhZC4KKworMjAwOS0wNS0yOCAxMzoxNDoxMyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL2JsZW5kX2JncmEuYzoKKwkgIHZpZGVvbWl4ZXI6IEZpeCBBUkdCIGJsZW5kaW5nIHRvIGFjdHVhbGx5IHdvcmsKKworMjAwOS0wNS0yOCAxMzowNDo1MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfYmdyYS5jOgorCSAgdmlkZW9taXhlcjogQmxlbmQgQkdSQSBvdXJzZWx2ZXMgaW5zdGVhZCBvZiB1c2luZyBDYWlybworCisyMDA5LTA1LTI4IDEyOjU1OjE2ICswMjAwICBBbGV4IFVnYXJ0ZSA8YWxleHVnYXJ0ZUBnbWFpbC5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfYXl1di5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfYmdyYS5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvYmxlbmRfaTQyMC5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5oOgorCSAgdmlkZW9taXhlcjogQWRkIHN1cHBvcnQgZm9yIGJsZW5kaW5nIEJHUkEgYW5kIEFZVVYKKwkgIEZpeGVzIGJ1ZyAjNTc3MDE3LgorCisyMDA5LTA1LTI4IDEyOjM5OjQ2ICswMjAwICBHaGlzbGFpbiAnQXVzJyBMYWNyb2l4IDxhdXNAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIGVxdWFsaXplcjogVXNlIGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMgaW50ZXJuYWxseSBmb3IgdGhlIGludDE2IG1vZGUKKwkgIEJ5IHVzaW5nIGludDMyIGFyaXRobWV0aWMgd2Ugd2lsbCBpbnRyb2R1Y2UgZGlzdG9ydGlvbnMgYXMgdGhlCisJICBJSVIgZmlsdGVyIGlzIHZlcnkgc2Vuc2l0aXZlIHRvIHJvdW5kaW5nIGVycm9ycy4gRml4ZXMgYnVnICM1ODAyMTQuCisKKzIwMDktMDUtMjggMTA6NTU6MTYgKzAxMDAgIENocmlzdGlhbiBTY2hhbGxlciA8Y2hyaXN0aWFuLnNjaGFsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgVXBkYXRlIHNwZWMgZmlsZSB3aXRoIGxhdGVzdCBwbHVnaW5zCisKKzIwMDktMDUtMjYgMTc6MTk6MDggKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDg4OGUwYTIgdG8gYzU3MjcyMQorCisyMDA5LTA1LTI2IDE2OjIwOjM1ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgIHY0bDI6IGNsZWFudXAgYW5kIGNvbW1lbnRpbmcKKwkgIFJlbW92ZSBuZXdsaW5lcyBpbnNlcnRlZCBieSBnc3QtaW5kZW50IG9uY2UuIFJlbW92ZSB1bnVzZWQgdmFyIGZyb20gaW5zdGFuY2UKKwkgIHN0cnVjdC4gQWRkIGNvbW1lbnRzLiBBZGQgYW5vdGhlciAjZGVmaW5lIGZvciBkZWZhdWx0IHByb3BlcnR5IHZhbHVlLgorCisyMDA5LTA1LTA2IDEyOjQzOjM1ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgbWFrZWZpbGU6IGlkZWEgYWJvdXQgbWFrZWluZyBtb3JlIHNvdXJjZXMvc2lua3MgdGVzdGFibGUgYWdhaW4KKworMjAwOS0wNS0yNSAxNjozMzozNSArMDIwMCAgSm9obiBLZWVwaW5nIDxqb2huLmtlZXBpbmcgYXQgbGluZW9uZS5uZXQ+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJICBwbmdkZWM6IG1hdGNoIGdfbWFsbG9jKCkgd2l0aCBnX2ZyZWUoKQorCSAgTWF0Y2hpbmcgZ19tYWxsb2MoKSB3aXRoIGEgZ19mcmVlKCkgaXMgaW1wb3J0YW50IHdoZW4gYSBjdXN0b20gYWxsb2NhdG9yIGlzCisJICBpbnN0YWxsZWQuCisJICBGaXhlcyAjNTgzODAzCisKKzIwMDktMDUtMTIgMTg6Mzk6MjggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lmg6CisJICBydHBtcDR2cGF5OiBkb24ndCBsb29rIGZvciBoZWFkZXJzIGluIHNvbWUgY2FzZXMKKwkgIEluIHNvbWUgc3RyZWFtcyAoc3RhcnRpbmcgd2l0aCAwMDAwMDEwMCkgZG9uJ3QgbG9vayBmb3IgdGhlIGhlYWRlcnMgYnV0IHB1c2gKKwkgIGRhdGEgYXMgaXQgaXMuCisJICBGaXhlcyAjNTgyMTUzCisKKzIwMDktMDUtMTMgMTE6NTA6MjIgKzAyMDAgIFBhdHJpY2sgUmFkaXppIDxwYXRyaWNrLnJhZGl6aSBhdCBheGlzLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IG1lbW9yeSBsZWFrIG9mIG1lc3NhZ2VzCisJICBGcmVlIG1lc3NhZ2VzIGNvcnJlY3RseS4KKwkgIEZpeGVzICM1NzczMTgKKworMjAwOS0wNS0yNCAxOTozMjoxNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogbWFrZSBmYWtlc3JjIHNpbGVudAorCSAgTWFrZSB0aGUgZmFrZXNyYyB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIGR1bW15IHBhY2tldHMgc2lsZW50LgorCisyMDA5LTA1LTI0IDE2OjMzOjQyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBkb24ndCBzZW5kIHRlYXJkb3duIGJlZm9yZSBzZXR1cAorCSAgRG9uJ3Qgc2VuZCBhIFRFQVJET1dOIHJlcXVlc3Qgd2hlbiB3ZSBkaWQgbm90IG1hbmFnZSB0byBzdWNjZXNzZnVsbHkgc2V0dXAgYQorCSAgc3RyZWFtLgorCisyMDA5LTA1LTE0IDE0OjQ2OjE0ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIG1hdHJvc2thZGVtdXg6IFBvcHVsYXRlIGEgR3N0SW5kZXggdGhhdCBpcyBzZXQgb24gbWF0cm9za2FkZW11eAorCisyMDA5LTA1LTE0IDEwOjM1OjIyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIGZsdm11eDogR2V0IHRoZSBtYXggZHVyYXRpb24gZnJvbSB1cHN0cmVhbSBpZiB0aGVyZSdzIG5vIGR1cmF0aW9uIHRhZworCisyMDA5LTA1LTE0IDEwOjI5OjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4Lmg6CisJICBmbHZtdXg6IFdyaXRlIGFuIGluZGV4IHRhYmxlIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUKKworMjAwOS0wNS0yMiAwMToxMjozNSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGF1dG9nZW4uc2g6CisJKiBjb25maWd1cmUuYWM6CisJICBhdXRvdG9vbHM6IG1vdmUgdGhlIC1Xbm8tcG9ydGFiaWxpdHkgZnJvbSBhdXRvZ2VuLnNoIHRvIGNvbmZpZ3VyZS5hYworCSAgSWYgd2UncmUgbHVja3kgaXQnbGwgZ2V0IHVzZWQgb24gYXV0b21hdGljIHJlYnVpbGRzIGFzIHdlbGwgdGhhdCB3YXkuCisKKzIwMDktMDUtMjIgMDE6MTA6MTIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb21tb246CisJKiBjb25maWd1cmUuYWM6CisJKiBtNC9nc3QtZmlvbnJlYWQubTQ6CisJICBtNDogZml4ICdzdXNwaWNpb3VzIGNhY2hlIGlkJyB3YXJuaW5ncworCSAgYW5kIHVwZGF0ZSBjb21tb24gdG8gcHVsbCBpbiBhIHNpbWlsYXIgZml4LiBBbHNvIGNoZWNrIGluIGNvbmZpZ3VyZQorCSAgd2hldGhlciB0aGUgY29tcGlsZXIgc3VwcG9ydHMgZG8gd2hpbGUgbWFjcm9zIChHTGliIHdhbnRzIHRoaXMKKwkgIGRlZmluZWQgYW5kIGl0IGlzIG5lZWRlZCB0byBhdm9pZCB3YXJuaW5ncyB3aXRoIHNvbWUgYysrIGNvbXBpbGVycworCSAgYXBwYXJlbnRseSkuCisKKzIwMDktMDUtMjIgMDE6Mzk6MzMgKzAzMDAgIFplZXNoYW4gQWxpIChLaGF0dGFrKSA8emVlc2hhbmFrQGdub21lLm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgc291cGh0dHBzcmM6IEJ1bXAtdXAgbGlic291cC0yLjI0IGRlcCB0byA+PSAyLjI2CisJICBUaGUgaGVscGVyIGZ1bmN0aW9uIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2dldF9jb250ZW50X3R5cGUgdGhhdCB3ZSBub3cgdXNlCisJICB3YXMgYWRkZWQgaW4gMi4yNi4KKworMjAwOS0wNS0yMCAxNzo1Nzo1OSArMDMwMCAgWmVlc2hhbiBBbGkgKEtoYXR0YWspIDx6ZWVzaGFuYWtAZ25vbWUub3JnPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgc291cGh0dHBzcmM6IFNldCBjYXBzIGZvciBhdWRpby9MMTYgY29udGVudC10eXBlCisJICBXaGVuICJDb250ZW50LVR5cGUiIGhlYWRlciBpcyAiYXVkaW8vTDE2Iiwgd2UgbmVlZCB0byBzZXQgdGhlIGNhcHMgb24gdGhlCisJICBvdXRnb2luZyBidWZmZXJzIHNvIHRoYXQgZG93bnN0cmVhbSBlbGVtZW50cyBjYW4gaGF2ZSBtZWFucyB0byBkZXRlY3QgdGhlCisJICBzdHJlYW0gdHlwZSBhbmQgaGFuZGxlIGl0IGFwcHJvcHJpYXRlbHkuIFRlc3RlZCB3aXRoIEhUVFAgc3RyZWFtIHByb3ZpZGVkCisJICBieSBwdWxzZS1hdWRpbydzIGh0dHAgbW9kdWxlIChnaXQgbWFzdGVyKS4KKworMjAwOS0wNS0yMCAxNTowNjoyNSArMDMwMCAgWmVlc2hhbiBBbGkgKEtoYXR0YWspIDx6ZWVzaGFuYWtAZ25vbWUub3JnPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaDoKKwkgIHNvdXBodHRwc3JjOiBSZW5hbWUgaWN5X2NhcHMgdG8gc3JjX2NhcHMKKworMjAwOS0wNS0yMSAyMzozOToxMyArMDIwMCAgUGhpbGlwcGUgTm9ybWFuZCA8cGhpbGlwcGUgYXQgZmx1ZW5kby5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGJ1bXAgbWF4IHNpemUgdG8gNjU1MzV4NjU1MzUKKwkgIFJlbW92ZSBhcnRpZmljaWFsIGpwZWcgaW1hZ2UgbGltaXRzLgorCSAgRml4ZXMgIzU4MzA0OC4KKworMjAwOS0wNS0yMSAyMTozNjowMiArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICB3aW4zMjogVXBkYXRlIHRoZSB3aW4zMiBjb25maWcuaAorCisyMDA5LTA1LTE5IDE1OjEyOjA5ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgbWF0cm9za2FkZW11eDogUmVjb2duaXNlIFBHUyBzdWJwaWN0dXJlIHN0cmVhbXMgLSB0aGUgYmx1cmF5IGZvcm1hdC4KKwkgIFJlY29nbmlzZSBhbmQgYXBwbHkgYXBwcm9wcmlhdGUgY2FwcyB0byBQR1MgKFByZXNlbnRhdGlvbiBHcmFwaGljIFN0cmVhbSkKKwkgIHN1YnBpY3R1cmUgc3RyZWFtcy4KKworMjAwOS0wNS0xNSAxMDo0MjoxOSArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IENvbnZlcnQgYW4gZXJyb25lb3VzIGFzc2VydGlvbgorCSAgT2NjYXNpb25hbGx5LCB3ZSBnZXQgYSBjaGFuZ2UgY2FsbGJhY2sgZm9yIGFuIG9sZCBzdHJlYW0sIHRyaWdnZXJpbmcKKwkgIHRoZSBhc3NlcnRpb24gdW5uZWNlc3NhcmlseS4gSnVzdCBpZ25vcmUgc3VjaCBjYWxsYmFja3MuCisKKzIwMDktMDUtMjAgMTY6MTQ6NDAgLTA0MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2U6IFByaW50IGEgd2FybmluZyBvbiB1bmRlci9vdmVyZmxvd3MKKworMjAwOS0wNS0yMCAxODo0NTo0NSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IHBhcnNlIGluMjQgYm94ZXMgdG8gZ2V0IGVuZGlhbm5lc3MKKwkgIGluMjQgc2FtcGxlcyBhcmUgbm9ybWFsbHkgYmlnLWVuZGlhbiBidXQgYW4gZW5kYSBib3ggY2FuIGNoYW5nZSB0aGlzIHRvCisJICBsaXR0bGUtZW5kaWFuLiBSZWN1cnNlIGludG8gdGhlIGluMjQgYm94IGFuZCBmaW5kIHRoZSBlbmRhIGJveCBzbyB0aGF0IHdlIGdldAorCSAgdGhlIGVuZGlhbm5lc3MgcmlnaHQuCisJICBGaXhlcyAjNTgyNTE1CisKKzIwMDktMDUtMjAgMTQ6MTQ6MzEgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkgIG11bHRpcGFydGRlbXV4OiBhZGQgcHJvcGVyIHBhZHRlbXBsYXRlCisKKzIwMDktMDUtMjAgMTQ6MDI6NDMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkgIG11bHRpcGFydGRlbXV4OiBhZGQgbW9yZSBtaW1lIHR5cGVzCisJICBBZGQgbWltZS10eXBlIGZvciBQYW5hc29uaWMgZzcyNiBhbmQgYWRkIG1vcmUgcmVxdWlyZWQgY2FwcyBwcm9wZXJ0aWVzIGZvciBvdGhlcgorCSAgRzcyNiBtaW1lLXR5cGVzLgorCSAgTWFrZSBtaW1lLXR5cGVzIGNhc2UgaW5zZW5zaXRpdmUuCisJICBTZWUgIzU4MjE2OQorCisyMDA5LTA1LTIwIDEzOjQ3OjUyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4Lmg6CisJICBtdWx0aXBhcnRkZW11eDogYWRkIGZsb3cgYWdncmVnYXRpb24KKworMjAwOS0wNS0yMCAxMzoyOTowMiArMDIwMCAgQXJub3V0IFZhbmRlY2FwcGVsbGUgPGFybm91dEBtaW5kLmJlPgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJICBtdWx0aXBhcnRkZW11eDogYWxsb3cgY29udGVudCB0byBiZSBlbXB0eS4KKwkgIGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIGRvZXNuJ3QgYWxsb3cgYnVmZmVyIHRvIGJlIGVtcHR5LgorCSAgU2ltcGx5IHNraXAgYW55IHBhcnQgd2hlcmUgdGhlIGNvbnRlbnQgaXMgZW1wdHkuICBEb24ndAorCSAgY3JlYXRlIGEgcGFkIGZvciBpdCBlaXRoZXIuCisJICBTZWUgIzU4MjE2OQorCisyMDA5LTA1LTE4IDIyOjE5OjM5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGNoYW5uZWxzLmg6CisJICBydHA6IGZpeCBjaGFubmVsIHBvc2l0aW9ucyBmb3IgbW9ubworCisyMDA5LTA1LTIxIDIxOjAyOjExICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gaGFja2luZyAtPiAwLjEwLjE1LjEKKworPT09IHJlbGVhc2UgMC4xMC4xNSA9PT0KKworMjAwOS0wNS0yMCAyMjozNDoxOCArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTAuMTUKKworMjAwOS0wNS0yMCAyMjowMzoyMSArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL210LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vcGwucG86CisJKiBwby9wdF9CUi5wbzoKKwkqIHBvL3J1LnBvOgorCSogcG8vc2sucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSogcG8vemhfQ04ucG86CisJKiBwby96aF9ISy5wbzoKKwkqIHBvL3poX1RXLnBvOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA5LTA1LTE2IDAyOjU5OjE0ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIENoYW5nZUxvZzoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9iZy5wbzoKKwkqIHBvL2NhLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2lkLnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL2x0LnBvOgorCSogcG8vbXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3B0X0JSLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjE0LjMgcHJlLXJlbGVhc2UKKworMjAwOS0wNS0xNiAwMjozNzowNiArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy5jOgorCSAgY2hlY2s6IERvbid0IGNoYW5nZSBkaXJlY3RvcnkgaW4gdGhlIHRlc3QKKwkgIENoYW5naW5nIGRpcmVjdG9yeSBpbnZhbGlkYXRlcyB0aGUgcGF0aHMgdGhlIHJlZ2lzdHJ5IGhhcyBwaWNrZWQKKwkgIHVwIGZvciBvdXIgcGx1Z2lucywgYmVjYXVzZSB0aGUgdGVzdCBlbnZpcm9ubWVudCBzcGVjaWZpZXMgcmVsYXRpdmUKKwkgIHBhdGhzLiBGaXhpbmcgdGhhdCBpcyBhIHNlcGFyYXRlIHByb2JsZW0sIGluIHRoZSBtZWFudGltZSwgYnVpbGQgYQorCSAgcGF0aCB0byB0aGUgdGVzdCBmaWxlcyBpbnN0ZWFkIG9mIGNoYW5naW5nIGRpcmVjdG9yeS4gRml4ZXMgdGhlCisJICBkaXN0Y2hlY2suCisKKzIwMDktMDUtMTYgMDE6NTM6NDYgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogd2luMzIvTUFOSUZFU1Q6CisJICB3aW4zMjogUmVtb3ZlIGRpcmVjdGRyYXcgcHJvamVjdCBmaWxlcyBmcm9tIHRoZSB3aW4zMiBtYW5pZmVzdAorCisyMDA5LTA1LTE2IDAxOjIxOjM0ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzoKKwkgIGNoZWNrOiBSZW1vdmUgYXNzZXJ0aW9uIHRoYXQgYnJlYWtzIGNoZWNrIGFnYWluIGdpdCBtYXN0ZXIKKwkgIFJlbW92ZSB0aGUgYXNzZXJ0aW9uIHRoYXQgdGhlIHNlbmRlciBvZiB0aGUgdGFncyBtZXNzYWdlIGlzIHRoZQorCSAgZWxlbWVudCB1bnRpbCB3ZSBkZWNpZGUgd2hldGhlciB0aGF0J3MgZ29pbmcgdG8gYmUgdHJ1ZSBvciBub3QuCisKKzIwMDktMDUtMTYgMDE6MTE6MzMgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kaXJlY3RkcmF3LnhtbDoKKwkqIHN5cy9NYWtlZmlsZS5hbToKKwkqIHN5cy9kaXJlY3RkcmF3L01ha2VmaWxlLmFtOgorCSogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3BsdWdpbi5jOgorCSogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmg6CisJKiB3aW4zMi92czYvbGliZ3N0ZGlyZWN0ZHJhdy5kc3A6CisJKiB3aW4zMi92czcvbGliZ3N0ZGlyZWN0ZHJhdy52Y3Byb2o6CisJKiB3aW4zMi92czgvbGliZ3N0ZGlyZWN0ZHJhdy52Y3Byb2o6CisJICBNb3ZlZCAnZGlyZWN0ZHJhdycgZnJvbSAtZ29vZCB0byAtYmFkCisKKzIwMDktMDUtMTYgMDA6MTg6MzQgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzLy5naXRpZ25vcmU6CisJICBpZ25vcmVzOiBJZ25vcmUgdGhlIGZsYWNkZWMgY2hlY2sgYmluYXJ5CisKKzIwMDktMDUtMTYgMDA6MTc6NTcgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJICBkb2NzOiBVcGRhdGUgaW5zcGVjdGlvbiBkZXRhaWxzIGZvciB0aGUgYXZpIHBsdWdpbgorCisyMDA5LTA1LTE2IDAwOjAwOjA3ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3k0bWVuYy5jOgorCSAgTW92ZWQgJ3k0bWVuYycgZnJvbSAtYmFkIHRvIC1nb29kCisKKzIwMDktMDUtMTMgMTc6NTU6NDYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICBbTU9WRUQgRlJPTSBCQURdIHk0bWVuYzogY2hhbmdlIG15IGVtYWlsCisJICBjaGFuZ2UgbXkgZW1haWwgdG8gc29tZXRoaW5nIG1vcmUgY3VycmVudAorCSAgU2VlICM1ODA3ODMKKworMjAwOS0wNS0xMyAxNzo1NDo0NyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRF0geTRtZW5jOiBkb24ndCBzdHJpcCB0aW1lc3RhbXBzCisJICBGaXhlcyAjNTgyNDgzCisKKzIwMDgtMTEtMDQgMTI6NDI6MzAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgW01PVkVEIEZST00gQkFEXSBEb24ndCBpbnN0YWxsIHN0YXRpYyBsaWJzIGZvciBwbHVnaW5zLiBGaXhlcyAjNTUwODUxIGZvciAtYmFkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9hbHNhc3BkaWYvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hbXJ3Yi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FwZXhzaW5rL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXJ0cy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FydHNkL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXVkaW9maWxlL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXVkaW9yZXNhbXBsZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2J6Mi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2NkYXVkaW8vTWFrZWZpbGUuYW06CisJICAqIGV4dC9jZWx0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGMxMzk0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGlyYWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kaXJlY3RmYi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2RpdngvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kdHMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9mYWFjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZmFhZC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2dzbS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2hlcm1lcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2l2b3JiaXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9qYWNrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvanAyay9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xhZHNwYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xjcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xpYmZhbWUvTWFrZWZpbGUuYW06CisJICAqIGV4dC9saWJtbXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tZXRhZGF0YS9NYWtlZmlsZS5hbToKKwkgICogZXh0L21wZWcyZW5jL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXBsZXgvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tdXNlcGFjay9NYWtlZmlsZS5hbToKKwkgICogZXh0L211c2ljYnJhaW56L01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXl0aHR2L01ha2VmaWxlLmFtOgorCSAgKiBleHQvbmFzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbmVvbi9NYWtlZmlsZS5hbToKKwkgICogZXh0L29mYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3BvbHlwL01ha2VmaWxlLmFtOgorCSAgKiBleHQvcmVzaW5kdmQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zZGwvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zaG91dC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NuYXBzaG90L01ha2VmaWxlLmFtOgorCSAgKiBleHQvc25kZmlsZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NvdW5kdG91Y2gvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zcGMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zd2ZkZWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC90YXJraW4vTWFrZWZpbGUuYW06CisJICAqIGV4dC90aGVvcmEvTWFrZWZpbGUuYW06CisJICAqIGV4dC90aW1pZGl0eS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3R3b2xhbWUvTWFrZWZpbGUuYW06CisJICAqIGV4dC94MjY0L01ha2VmaWxlLmFtOgorCSAgKiBleHQveGluZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3h2aWQvTWFrZWZpbGUuYW06CisJICAqIGdzdC1saWJzL2dzdC9hcHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC1saWJzL2dzdC9kc2hvdy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FpZmZwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FwcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvYnVmZmVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYmF5ZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9jZHhhcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9jaGFydC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2NvbG9yc3BhY2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kY2NwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWludGVybGFjZTIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kdmRzcHUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9mZXN0aXZhbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ZpbHRlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ZsYWNwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2dhbWVzL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvaDI2NHBhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbGlicmZiL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWl4bWF0cml4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbW9kcGx1Zy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21wZWcxc3lzL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZzR2aWRlb3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ2RlbXV4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ3RzbXV4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ3ZpZGVvcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tdmUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9uc2YvTWFrZWZpbGUuYW06CisJICAqIGdzdC9udXZkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L292ZXJsYXkvTWFrZWZpbGUuYW06CisJICAqIGdzdC9wYXNzdGhyb3VnaC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3BjYXBwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3BsYXlvbmRlbWFuZC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3Jhd3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcmVhbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0anBlZy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zY2FsZXRlbXBvL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc2RwL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc2VsZWN0b3IvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zbW9vdGgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zbW9vdGh3YXZlL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3BlZWQvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zcGVleHJlc2FtcGxlL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3RlcmVvL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3ViZW5jL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdHRhL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmJpZGVjL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9kcm9wL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9zaWduYWwvTWFrZWZpbGUuYW06CisJICAqIGdzdC92aXJ0dWFsZHViL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvdm1uYy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3k0bS9NYWtlZmlsZS5hbToKKwkgICogc3lzL2FjbWVuYy9NYWtlZmlsZS5hbToKKwkgICogc3lzL2Nkcm9tL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHNob3dkZWN3cmFwcGVyL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHNob3dzcmN3cmFwcGVyL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHZiL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHhyMy9NYWtlZmlsZS5hbToKKwkgICogc3lzL2ZiZGV2L01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3NzNC9NYWtlZmlsZS5hbToKKwkgICogc3lzL3FjYW0vTWFrZWZpbGUuYW06CisJICAqIHN5cy9xdHdyYXBwZXIvTWFrZWZpbGUuYW06CisJICAqIHN5cy92Y2QvTWFrZWZpbGUuYW06CisJICAqIHN5cy93aW5pbmV0L01ha2VmaWxlLmFtOgorCSAgKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBEb24ndCBpbnN0YWxsIHN0YXRpYyBsaWJzIGZvciBwbHVnaW5zLiBGaXhlcyAjNTUwODUxIGZvciAtYmFkLgorCisyMDA4LTA2LTI2IDE1OjUyOjQwICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgW01PVkVEIEZST00gQkFEXSBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgWVVWNE1QRUcyIGVuY29kZXIgZWxlbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgWVVWNE1QRUcyIGVuY29kZXIgZWxlbWVudC4KKworMjAwNy0wNC0yNCAxNTo0OToxOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgW01PVkVEIEZST00gQkFEXSBQbHVnIHNvbWUgbGVha3M7IHRyeSB0byBtYWtlIGJ1aWxkIGJvdCBoYXBweSBhZ2Fpbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOiAoZ3N0X3k0bV9lbmNvZGVfaW5pdCksCisJICAoZ3N0X3k0bV9lbmNvZGVfc2V0Y2Fwcyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3k0bWVuYy5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgUGx1ZyBzb21lIGxlYWtzOyB0cnkgdG8gbWFrZSBidWlsZCBib3QgaGFwcHkgYWdhaW4uCisKKzIwMDYtMTEtMTMgMTg6NTU6NTcgKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hbmF1d0Bza3luZXQuYmU+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gY29uZmlndXJlLmFjOiBFbmFibGUgY2RhdWRpbyBhbmQgeTRtLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3IGF0IHNreW5ldCBiZT4KKwkgICogY29uZmlndXJlLmFjOgorCSAgRW5hYmxlIGNkYXVkaW8gYW5kIHk0bS4KKwkgICogZ3N0L3k0bS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzogKGdzdF95NG1fZW5jb2RlX2Jhc2VfaW5pdCksCisJICAoZ3N0X3k0bV9lbmNvZGVfY2xhc3NfaW5pdCksIChnc3RfeTRtX2VuY29kZV9pbml0KSwKKwkgIChnc3RfeTRtX2VuY29kZV9yZXNldCksIChnc3RfeTRtX2VuY29kZV9zZXRjYXBzKSwKKwkgIChnc3RfeTRtX2VuY29kZV9nZXRfc3RyZWFtX2hlYWRlciksCisJICAoZ3N0X3k0bV9lbmNvZGVfZ2V0X2ZyYW1lX2hlYWRlciksIChnc3RfeTRtX2VuY29kZV9jaGFpbiksCisJICAoZ3N0X3k0bV9lbmNvZGVfc2V0X3Byb3BlcnR5KSwgKGdzdF95NG1fZW5jb2RlX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3k0bV9lbmNvZGVfY2hhbmdlX3N0YXRlKSwgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuaDoKKwkgIFBvcnQgb2YgeTRtZW5jb2RlIHRvIDAuMTAuCisKKzIwMDYtMDQtMjUgMjE6NTY6MzggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgW01PVkVEIEZST00gQkFEXSBEZWZpbmUgR3N0RWxlbWVudERldGFpbHMgYXMgY29uc3QgYW5kIGFsc28gc3RhdGljICh3aGVuIGRlZmluZWQgYXMgZ2xvYmFsKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YmRlYy5jOgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JlbmMuYzoKKwkgICogZXh0L2FtcndiL2dzdGFtcndicGFyc2UuYzoKKwkgICogZXh0L2FydHMvZ3N0X2FydHMuYzoKKwkgICogZXh0L2FydHNkL2dzdGFydHNkc2luay5jOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmcGFyc2UuYzoKKwkgICogZXh0L2F1ZGlvZmlsZS9nc3RhZnNpbmsuYzoKKwkgICogZXh0L2F1ZGlvZmlsZS9nc3RhZnNyYy5jOgorCSAgKiBleHQvYXVkaW9yZXNhbXBsZS9nc3RhdWRpb3Jlc2FtcGxlLmM6CisJICAqIGV4dC9iejIvZ3N0YnoyZGVjLmM6CisJICAqIGV4dC9iejIvZ3N0YnoyZW5jLmM6CisJICAqIGV4dC9jZGF1ZGlvL2dzdGNkYXVkaW8uYzoKKwkgICogZXh0L2RpcmVjdGZiL2RmYnZpZGVvc2luay5jOgorCSAgKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6CisJICAqIGV4dC9kaXZ4L2dzdGRpdnhlbmMuYzoKKwkgICogZXh0L2R0cy9nc3RkdHNkZWMuYzogKGdzdF9kdHNkZWNfYmFzZV9pbml0KToKKwkgICogZXh0L2ZhYWMvZ3N0ZmFhYy5jOiAoZ3N0X2ZhYWNfYmFzZV9pbml0KToKKwkgICogZXh0L2ZhYWQvZ3N0ZmFhZC5jOgorCSAgKiBleHQvZ3NtL2dzdGdzbWRlYy5jOgorCSAgKiBleHQvZ3NtL2dzdGdzbWVuYy5jOgorCSAgKiBleHQvaGVybWVzL2dzdGhlcm1lc2NvbG9yc3BhY2UuYzoKKwkgICogZXh0L2l2b3JiaXMvdm9yYmlzZmlsZS5jOgorCSAgKiBleHQvbGNzL2dzdGNvbG9yc3BhY2UuYzoKKwkgICogZXh0L2xpYmZhbWUvZ3N0bGliZmFtZS5jOgorCSAgKiBleHQvbGlibW1zL2dzdG1tcy5jOiAoZ3N0X21tc19iYXNlX2luaXQpOgorCSAgKiBleHQvbXVzZXBhY2svZ3N0bXVzZXBhY2tkZWMuYzogKGdzdF9tdXNlcGFja2RlY19iYXNlX2luaXQpOgorCSAgKiBleHQvbXVzaWNicmFpbnovZ3N0dHJtLmM6IChnc3RfbXVzaWNicmFpbnpfYmFzZV9pbml0KToKKwkgICogZXh0L25hcy9uYXNzaW5rLmM6IChnc3RfbmFzc2lua19iYXNlX2luaXQpOgorCSAgKiBleHQvbmVvbi9nc3RuZW9uaHR0cHNyYy5jOgorCSAgKiBleHQvc2RsL3NkbGF1ZGlvc2luay5jOgorCSAgKiBleHQvc2RsL3NkbHZpZGVvc2luay5jOgorCSAgKiBleHQvc2hvdXQvZ3N0c2hvdXQuYzoKKwkgICogZXh0L3NuYXBzaG90L2dzdHNuYXBzaG90LmM6CisJICAqIGV4dC9zbmRmaWxlL2dzdHNmLmM6CisJICAqIGV4dC9zd2ZkZWMvZ3N0c3dmZGVjLmM6CisJICAqIGV4dC90YXJraW4vZ3N0dGFya2luZGVjLmM6CisJICAqIGV4dC90YXJraW4vZ3N0dGFya2luZW5jLmM6CisJICAqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogKGdzdF93YXZwYWNrX2RlY19iYXNlX2luaXQpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogKGdzdF93YXZwYWNrX3BhcnNlX2Jhc2VfaW5pdCk6CisJICAqIGV4dC94dmlkL2dzdHh2aWRkZWMuYzoKKwkgICogZXh0L3h2aWQvZ3N0eHZpZGVuYy5jOgorCSAgKiBnc3QvY2R4YXBhcnNlL2dzdGNkeGFwYXJzZS5jOiAoZ3N0X2NkeGFfcGFyc2VfYmFzZV9pbml0KToKKwkgICogZ3N0L2NkeGFwYXJzZS9nc3RjZHhhc3RyaXAuYzogKGdzdF9jZHhhc3RyaXBfYmFzZV9pbml0KToKKwkgICogZ3N0L2NoYXJ0L2dzdGNoYXJ0LmM6CisJICAqIGdzdC9jb2xvcnNwYWNlL2dzdGNvbG9yc3BhY2UuYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6IChnc3RfaWlyX2VxdWFsaXplcl9iYXNlX2luaXQpOgorCSAgKiBnc3QvZmVzdGl2YWwvZ3N0ZmVzdGl2YWwuYzoKKwkgICogZ3N0L2ZpbHRlci9nc3RicHdzaW5jLmM6CisJICAqIGdzdC9maWx0ZXIvZ3N0aWlyLmM6CisJICAqIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy5jOgorCSAgKiBnc3QvZnJlZXplL2dzdGZyZWV6ZS5jOgorCSAgKiBnc3QvZ2FtZXMvZ3N0cHV6emxlLmM6IChnc3RfcHV6emxlX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9saWJyZmIvZ3N0cmZic3JjLmM6CisJICAqIGdzdC9taXhtYXRyaXgvbWl4bWF0cml4LmM6CisJICAqIGdzdC9tcGVnMXN5cy9nc3RtcGVnMXN5c3RlbWVuY29kZS5jOgorCSAgKiBnc3QvbXBlZzF2aWRlb3BhcnNlL2dzdG1wMXZpZGVvcGFyc2UuYzoKKwkgICogZ3N0L21wZWcyc3ViL2dzdG1wZWcyc3VidC5jOgorCSAgKiBnc3QvbXBlZ2F1ZGlvcGFyc2UvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgICogZ3N0L211bHRpZmlsZXNpbmsvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgKiBnc3Qvb3ZlcmxheS9nc3RvdmVybGF5LmM6CisJICAqIGdzdC9wYXNzdGhyb3VnaC9nc3RwYXNzdGhyb3VnaC5jOgorCSAgKiBnc3QvcGxheW9uZGVtYW5kL2dzdHBsYXlvbmRlbWFuZC5jOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICAqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZGVjLmM6CisJICAqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZW5jLmM6CisJICAqIGdzdC9zbW9vdGgvZ3N0c21vb3RoLmM6CisJICAqIGdzdC9zbW9vdGh3YXZlL2dzdHNtb290aHdhdmUuYzoKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICAqIGdzdC9zcGVlZC9nc3RzcGVlZC5jOgorCSAgKiBnc3Qvc3RlcmVvL2dzdHN0ZXJlby5jOgorCSAgKiBnc3Qvc3dpdGNoL2dzdHN3aXRjaC5jOgorCSAgKiBnc3QvdHRhL2dzdHR0YWRlYy5jOiAoZ3N0X3R0YV9kZWNfYmFzZV9pbml0KToKKwkgICogZ3N0L3R0YS9nc3R0dGFwYXJzZS5jOiAoZ3N0X3R0YV9wYXJzZV9iYXNlX2luaXQpOgorCSAgKiBnc3QvdmJpZGVjL2dzdHZiaWRlYy5jOgorCSAgKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSAgKiBnc3QvdmlkZW9kcm9wL2dzdHZpZGVvZHJvcC5jOgorCSAgKiBnc3QvdmlydHVhbGR1Yi9nc3R4c2hhcnBlbi5jOgorCSAgKiBnc3QveGluZ2hlYWRlci9nc3R4aW5nbXV4LmM6IChnc3RfeGluZ19tdXhfYmFzZV9pbml0KToKKwkgICogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgICogc3lzL2Nkcm9tL2dzdGNkcGxheWVyLmM6CisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6CisJICAqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgICogc3lzL2dsc2luay9nbGltYWdlc2luay5jOgorCSAgKiBzeXMvcWNhbS9nc3RxY2Ftc3JjLmM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgICogc3lzL3ZjZC92Y2RzcmMuYzogKGdzdF92Y2RzcmNfYmFzZV9pbml0KToKKwkgICogc3lzL3hpbWFnZXNyYy94aW1hZ2VzcmMuYzoKKwkgIERlZmluZSBHc3RFbGVtZW50RGV0YWlscyBhcyBjb25zdCBhbmQgYWxzbyBzdGF0aWMgKHdoZW4gZGVmaW5lZCBhcworCSAgZ2xvYmFsKQorCisyMDA2LTA0LTA4IDIxOjQ4OjAxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gRml4ICMzMzczNjUgKGdfdHlwZV9jbGFzc19yZWYgPC0+IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JkZWMuYzogKGdzdF9hbXJ3YmRlY19jbGFzc19pbml0KToKKwkgICogZXh0L2FtcndiL2dzdGFtcndiZW5jLmM6IChnc3RfYW1yd2JlbmNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YnBhcnNlLmM6IChnc3RfYW1yd2JwYXJzZV9jbGFzc19pbml0KToKKwkgICogZXh0L2FydHMvZ3N0X2FydHMuYzogKGdzdF9hcnRzX2NsYXNzX2luaXQpOgorCSAgKiBleHQvYXJ0c2QvZ3N0YXJ0c2RzaW5rLmM6IChnc3RfYXJ0c2RzaW5rX2NsYXNzX2luaXQpOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc2luay5jOiAoZ3N0X2Fmc2lua19jbGFzc19pbml0KToKKwkgICogZXh0L2F1ZGlvZmlsZS9nc3RhZnNyYy5jOiAoZ3N0X2Fmc3JjX2NsYXNzX2luaXQpOgorCSAgKiBleHQvYXVkaW9yZXNhbXBsZS9nc3RhdWRpb3Jlc2FtcGxlLmM6CisJICAqIGV4dC9jZGF1ZGlvL2dzdGNkYXVkaW8uYzogKGdzdF9jZGF1ZGlvX2NsYXNzX2luaXQpOgorCSAgKiBleHQvZGlyZWN0ZmIvZGZidmlkZW9zaW5rLmM6IChnc3RfZGZidmlkZW9zaW5rX2NsYXNzX2luaXQpOgorCSAgKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6IChnc3RfZGl2eGRlY19jbGFzc19pbml0KToKKwkgICogZXh0L2hlcm1lcy9nc3RoZXJtZXNjb2xvcnNwYWNlLmM6CisJICAoZ3N0X2hlcm1lc19jb2xvcnNwYWNlX2NsYXNzX2luaXQpOgorCSAgKiBleHQvaXZvcmJpcy92b3JiaXNmaWxlLmM6IChnc3RfaXZvcmJpc2ZpbGVfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9qYWNrL2dzdGphY2suYzogKGdzdF9qYWNrX2NsYXNzX2luaXQpOgorCSAgKiBleHQvamFjay9nc3RqYWNrYmluLmM6IChnc3RfamFja19iaW5fY2xhc3NfaW5pdCk6CisJICAqIGV4dC9sY3MvZ3N0Y29sb3JzcGFjZS5jOiAoZ3N0X2NvbG9yc3BhY2VfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9saWJmYW1lL2dzdGxpYmZhbWUuYzogKGdzdF9mYW1lZW5jX2NsYXNzX2luaXQpOgorCSAgKiBleHQvbXVzaWNicmFpbnovZ3N0dHJtLmM6IChnc3RfbXVzaWNicmFpbnpfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9uYXMvbmFzc2luay5jOiAoZ3N0X25hc3NpbmtfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9zaG91dC9nc3RzaG91dC5jOiAoZ3N0X2ljZWNhc3RzZW5kX2NsYXNzX2luaXQpOgorCSAgKiBleHQvc25hcHNob3QvZ3N0c25hcHNob3QuYzogKGdzdF9zbmFwc2hvdF9jbGFzc19pbml0KToKKwkgICogZXh0L3NuZGZpbGUvZ3N0c2YuYzogKGdzdF9zZl9jbGFzc19pbml0KToKKwkgICogZXh0L3N3ZmRlYy9nc3Rzd2ZkZWMuYzogKGdzdF9zd2ZkZWNidWZmZXJfY2xhc3NfaW5pdCksCisJICAoZ3N0X3N3ZmRlY19jbGFzc19pbml0KToKKwkgICogZXh0L3Rhcmtpbi9nc3R0YXJraW5kZWMuYzogKGdzdF90YXJraW5kZWNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC90YXJraW4vZ3N0dGFya2luZW5jLmM6IChnc3RfdGFya2luZW5jX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvY2R4YXBhcnNlL2dzdGNkeGFzdHJpcC5jOiAoZ3N0X2NkeGFzdHJpcF9jbGFzc19pbml0KToKKwkgICogZ3N0L2NoYXJ0L2dzdGNoYXJ0LmM6IChnc3RfY2hhcnRfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9jb2xvcnNwYWNlL2dzdGNvbG9yc3BhY2UuYzogKGdzdF9jb2xvcnNwYWNlX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzogKGdzdF9kZWludGVybGFjZV9jbGFzc19pbml0KToKKwkgICogZ3N0L2Zlc3RpdmFsL2dzdGZlc3RpdmFsLmM6IChnc3RfZmVzdGl2YWxfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5jOiAoZ3N0X2Jwd3NpbmNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9maWx0ZXIvZ3N0aWlyLmM6IChnc3RfaWlyX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGdzdF9scHdzaW5jX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbGlicmZiL2dzdHJmYnNyYy5jOiAoZ3N0X3JmYnNyY19jbGFzc19pbml0KToKKwkgICogZ3N0L21peG1hdHJpeC9taXhtYXRyaXguYzogKGdzdF9taXhtYXRyaXhfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9tcGVnMXN5cy9nc3RtcGVnMXN5c3RlbWVuY29kZS5jOgorCSAgKGdzdF9zeXN0ZW1fZW5jb2RlX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbXBlZzF2aWRlb3BhcnNlL2dzdG1wMXZpZGVvcGFyc2UuYzoKKwkgIChnc3RfbXAxdmlkZW9wYXJzZV9jbGFzc19pbml0KToKKwkgICogZ3N0L21wZWcyc3ViL2dzdG1wZWcyc3VidC5jOiAoZ3N0X21wZWcyc3VidF9jbGFzc19pbml0KToKKwkgICogZ3N0L21wZWdhdWRpb3BhcnNlL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJICAoZ3N0X21wM3BhcnNlX2NsYXNzX2luaXQpOgorCSAgKiBnc3Qvb3ZlcmxheS9nc3RvdmVybGF5LmM6IChnc3Rfb3ZlcmxheV9jbGFzc19pbml0KToKKwkgICogZ3N0L3Bhc3N0aHJvdWdoL2dzdHBhc3N0aHJvdWdoLmM6IChwYXNzdGhyb3VnaF9jbGFzc19pbml0KToKKwkgICogZ3N0L3BsYXlvbmRlbWFuZC9nc3RwbGF5b25kZW1hbmQuYzogKHBsYXlfb25fZGVtYW5kX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRqcGVnL2dzdHJ0anBlZ2RlYy5jOiAoZ3N0X3J0anBlZ2RlY19jbGFzc19pbml0KToKKwkgICogZ3N0L3J0anBlZy9nc3RydGpwZWdlbmMuYzogKGdzdF9ydGpwZWdlbmNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9zbW9vdGgvZ3N0c21vb3RoLmM6IChnc3Rfc21vb3RoX2NsYXNzX2luaXQpOgorCSAgKiBnc3Qvc21vb3Rod2F2ZS9nc3RzbW9vdGh3YXZlLmM6IChnc3Rfc21vb3Rod2F2ZV9jbGFzc19pbml0KToKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IChnc3Rfc3BlY3RydW1fY2xhc3NfaW5pdCk6CisJICAqIGdzdC9zdGVyZW8vZ3N0c3RlcmVvLmM6IChnc3Rfc3RlcmVvX2NsYXNzX2luaXQpOgorCSAgKiBnc3Qvc3dpdGNoL2dzdHN3aXRjaC5jOiAoZ3N0X3N3aXRjaF9jbGFzc19pbml0KToKKwkgICogZ3N0L3R0YS9nc3R0dGFkZWMuYzogKGdzdF90dGFfZGVjX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvdHRhL2dzdHR0YXBhcnNlLmM6IChnc3RfdHRhX3BhcnNlX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvdmJpZGVjL2dzdHZiaWRlYy5jOiAoZ3N0X3ZiaWRlY19jbGFzc19pbml0KToKKwkgICogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzogKGdzdF92aWRlb19jcm9wX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvdmlydHVhbGR1Yi9nc3R4c2hhcnBlbi5jOiAoZ3N0X3hzaGFycGVuX2NsYXNzX2luaXQpOgorCSAgKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOiAoZ3N0X3k0bWVuY29kZV9jbGFzc19pbml0KToKKwkgICogc3lzL2Nkcm9tL2dzdGNkcGxheWVyLmM6IChjZHBsYXllcl9jbGFzc19pbml0KToKKwkgICogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgKGdzdF9kaXJlY3Rzb3VuZHNpbmtfY2xhc3NfaW5pdCk6CisJICAqIHN5cy9keHIzL2R4cjNhdWRpb3NpbmsuYzogKGR4cjNhdWRpb3NpbmtfY2xhc3NfaW5pdCk6CisJICAqIHN5cy9keHIzL2R4cjNzcHVzaW5rLmM6IChkeHIzc3B1c2lua19jbGFzc19pbml0KToKKwkgICogc3lzL2R4cjMvZHhyM3ZpZGVvc2luay5jOiAoZHhyM3ZpZGVvc2lua19jbGFzc19pbml0KToKKwkgICogc3lzL3FjYW0vZ3N0cWNhbXNyYy5jOiAoZ3N0X3FjYW1zcmNfY2xhc3NfaW5pdCk6CisJICAqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuYzoKKwkgIChnc3RfdjRsMl9jb2xvcl9iYWxhbmNlX2NoYW5uZWxfY2xhc3NfaW5pdCk6CisJICAqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOiAoZ3N0X3Y0bDJfdHVuZXJfY2hhbm5lbF9jbGFzc19pbml0KSwKKwkgIChnc3RfdjRsMl90dW5lcl9ub3JtX2NsYXNzX2luaXQpOgorCSAgKiBzeXMveGltYWdlc3JjL3hpbWFnZXNyYy5jOiAoZ3N0X3hpbWFnZXNyY19jbGFzc19pbml0KToKKwkgIEZpeCAjMzM3MzY1IChnX3R5cGVfY2xhc3NfcmVmIDwtPiBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQpCisKKzIwMDYtMDQtMDggMTk6MDQ6MDEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgW01PVkVEIEZST00gQkFEXSBnc3QvOiBGaXggbW9yZSBicm9rZW4gR09iamVjdCBtYWNyb3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvY29sb3JzcGFjZS9nc3Rjb2xvcnNwYWNlLmg6CisJICAqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5oOgorCSAgKiBnc3QvcGFzc3Rocm91Z2gvZ3N0cGFzc3Rocm91Z2guaDoKKwkgICogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuaDoKKwkgIEZpeCBtb3JlIGJyb2tlbiBHT2JqZWN0IG1hY3JvcworCisyMDA2LTA0LTA2IDExOjM1OjI2ICswMDAwICBqQGJvb3RsYWIub3JnIDxqQGJvb3RsYWIub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQURdIFVuaWZ5IHRoZSBsb25nIGRlc2NyaXB0aW9ucyBpbiB0aGUgcGx1Z2luIGRldGFpbHMgKCMzMzcyNjMpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogal4gIDxqIGF0IGJvb3RsYWIgZG90IG9yZz4KKwkgICogZXh0L2FtcndiL2dzdGFtcndiZGVjLmM6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YmVuYy5jOgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JwYXJzZS5jOgorCSAgKiBleHQvYXJ0cy9nc3RfYXJ0cy5jOgorCSAgKiBleHQvYXJ0c2QvZ3N0YXJ0c2RzaW5rLmM6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZwYXJzZS5jOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc2luay5jOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc3JjLmM6CisJICAqIGV4dC9jZGF1ZGlvL2dzdGNkYXVkaW8uYzoKKwkgICogZXh0L2RpcmVjdGZiL2RmYnZpZGVvc2luay5jOgorCSAgKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6CisJICAqIGV4dC9kaXZ4L2dzdGRpdnhlbmMuYzoKKwkgICogZXh0L2R0cy9nc3RkdHNkZWMuYzogKGdzdF9kdHNkZWNfYmFzZV9pbml0KToKKwkgICogZXh0L2ZhYWMvZ3N0ZmFhYy5jOiAoZ3N0X2ZhYWNfYmFzZV9pbml0KToKKwkgICogZXh0L2ZhYWQvZ3N0ZmFhZC5jOgorCSAgKiBleHQvZ3NtL2dzdGdzbWRlYy5jOgorCSAgKiBleHQvZ3NtL2dzdGdzbWVuYy5jOgorCSAgKiBleHQvaGVybWVzL2dzdGhlcm1lc2NvbG9yc3BhY2UuYzoKKwkgICogZXh0L2l2b3JiaXMvdm9yYmlzZmlsZS5jOgorCSAgKiBleHQvbGNzL2dzdGNvbG9yc3BhY2UuYzoKKwkgICogZXh0L2xpYmZhbWUvZ3N0bGliZmFtZS5jOgorCSAgKiBleHQvbGlibW1zL2dzdG1tcy5jOiAoZ3N0X21tc19iYXNlX2luaXQpOgorCSAgKiBleHQvbXVzaWNicmFpbnovZ3N0dHJtLmM6IChnc3RfbXVzaWNicmFpbnpfYmFzZV9pbml0KToKKwkgICogZXh0L25hcy9uYXNzaW5rLmM6IChnc3RfbmFzc2lua19iYXNlX2luaXQpOgorCSAgKiBleHQvbmVvbi9nc3RuZW9uaHR0cHNyYy5jOgorCSAgKiBleHQvcG9seXAvcG9seXBzaW5rLmM6IChnc3RfcG9seXBzaW5rX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9zZGwvc2RsYXVkaW9zaW5rLmM6CisJICAqIGV4dC9zZGwvc2RsdmlkZW9zaW5rLmM6CisJICAqIGV4dC9zaG91dC9nc3RzaG91dC5jOgorCSAgKiBleHQvc25hcHNob3QvZ3N0c25hcHNob3QuYzoKKwkgICogZXh0L3NuZGZpbGUvZ3N0c2YuYzoKKwkgICogZXh0L3Rhcmtpbi9nc3R0YXJraW5kZWMuYzoKKwkgICogZXh0L3Rhcmtpbi9nc3R0YXJraW5lbmMuYzoKKwkgICogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX2Jhc2VfaW5pdCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiAoZ3N0X3dhdnBhY2tfcGFyc2VfYmFzZV9pbml0KToKKwkgICogZXh0L3h2aWQvZ3N0eHZpZGRlYy5jOgorCSAgKiBleHQveHZpZC9nc3R4dmlkZW5jLmM6CisJICAqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXBhcnNlLmM6IChnc3RfY2R4YV9wYXJzZV9iYXNlX2luaXQpOgorCSAgKiBnc3QvY2R4YXBhcnNlL2dzdGNkeGFzdHJpcC5jOiAoZ3N0X2NkeGFzdHJpcF9iYXNlX2luaXQpOgorCSAgKiBnc3QvY2hhcnQvZ3N0Y2hhcnQuYzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzogKGdzdF9paXJfZXF1YWxpemVyX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9mZXN0aXZhbC9nc3RmZXN0aXZhbC5jOgorCSAgKiBnc3QvZmlsdGVyL2dzdGlpci5jOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzoKKwkgICogZ3N0L2ZyZWV6ZS9nc3RmcmVlemUuYzoKKwkgICogZ3N0L2dhbWVzL2dzdHB1enpsZS5jOiAoZ3N0X3B1enpsZV9iYXNlX2luaXQpOgorCSAgKiBnc3QvbWl4bWF0cml4L21peG1hdHJpeC5jOgorCSAgKiBnc3QvbXBlZzFzeXMvZ3N0bXBlZzFzeXN0ZW1lbmNvZGUuYzoKKwkgICogZ3N0L21wZWcxdmlkZW9wYXJzZS9nc3RtcDF2aWRlb3BhcnNlLmM6CisJICAqIGdzdC9tcGVnMnN1Yi9nc3RtcGVnMnN1YnQuYzoKKwkgICogZ3N0L21wZWdhdWRpb3BhcnNlL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJICAqIGdzdC9tdWx0aWZpbGVzaW5rL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgICogZ3N0L292ZXJsYXkvZ3N0b3ZlcmxheS5jOgorCSAgKiBnc3QvcGFzc3Rocm91Z2gvZ3N0cGFzc3Rocm91Z2guYzoKKwkgICogZ3N0L3BsYXlvbmRlbWFuZC9nc3RwbGF5b25kZW1hbmQuYzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgKiBnc3QvcnRqcGVnL2dzdHJ0anBlZ2RlYy5jOgorCSAgKiBnc3QvcnRqcGVnL2dzdHJ0anBlZ2VuYy5jOgorCSAgKiBnc3Qvc21vb3RoL2dzdHNtb290aC5jOgorCSAgKiBnc3QvdHRhL2dzdHR0YWRlYy5jOiAoZ3N0X3R0YV9kZWNfYmFzZV9pbml0KToKKwkgICogZ3N0L3R0YS9nc3R0dGFwYXJzZS5jOiAoZ3N0X3R0YV9wYXJzZV9iYXNlX2luaXQpOgorCSAgKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSAgKiBnc3QvdmlkZW9kcm9wL2dzdHZpZGVvZHJvcC5jOgorCSAgKiBnc3QvdmlydHVhbGR1Yi9nc3R4c2hhcnBlbi5jOgorCSAgKiBnc3QveGluZ2hlYWRlci9nc3R4aW5nbXV4LmM6IChnc3RfeGluZ19tdXhfYmFzZV9pbml0KToKKwkgICogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIFVuaWZ5IHRoZSBsb25nIGRlc2NyaXB0aW9ucyBpbiB0aGUgcGx1Z2luIGRldGFpbHMgKCMzMzcyNjMpLgorCisyMDA2LTA0LTAxIDEwOjA5OjExICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gcmV3b3JrIGJ1aWxkOyBhZGQgdHJhbnNsYXRpb25zIGZvciB2NGwyCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJld29yayBidWlsZDsgYWRkIHRyYW5zbGF0aW9ucyBmb3IgdjRsMgorCisyMDA1LTA5LTA1IDE3OjIwOjI5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gRml4IHVwIGFsbCB0aGUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4IHVwIGFsbCB0aGUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9ucy4KKworMjAwNS0wNy0wNSAxMDo1MTo0OSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBbTU9WRUQgRlJPTSBCQURdIFdheSwgd2F5LCB3YXkgdG9vIG1hbnkgZmlsZXM6IFJlbW92ZSBjcmFjayBjb21tZW50IGZyb20gdGhlIDIwMDAgZXJhLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTA3LTA1ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBXYXksIHdheSwgd2F5IHRvbyBtYW55IGZpbGVzOgorCSAgUmVtb3ZlIGNyYWNrIGNvbW1lbnQgZnJvbSB0aGUgMjAwMCBlcmEuCisKKzIwMDUtMDEtMTQgMTg6MzY6NDIgKzAwMDAgIFN0w6lwaGFuZSBMb2V1aWxsZXQgPGdzdHJlYW1lckBsZXJvdXRpZXIubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQURdIEknbSBhIGJhZCBib3kuIHVzaW5nIC8xMDAxLiB0byBmb3JjZSBDIHRvIGRvIGZsb2F0IGRpdmlzaW9uIGFuZCBub3QgaW50ZWdlciBkaXZpc2lvbiAoYXMgaXQgZGlkIGluIG15IGxhc3QgY29tbWl0KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSAgKiBnc3Qvc3VicGFyc2UvZ3N0c3VicGFyc2UuYzogKHBhcnNlX21kdmRzdWIpOgorCSAgKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOiAoZ3N0X3k0bWVuY29kZV9zaW5rY29ubmVjdCk6CisJICBJJ20gYSBiYWQgYm95LiB1c2luZyAvMTAwMS4gdG8gZm9yY2UgQyB0byBkbyBmbG9hdCBkaXZpc2lvbgorCSAgYW5kIG5vdCBpbnRlZ2VyIGRpdmlzaW9uIChhcyBpdCBkaWQgaW4gbXkgbGFzdCBjb21taXQpCisJICBUaGFua3MgdG8gRGF2aWQgSS4gTGVobiBmb3IgcG9pbnRpbmcgdGhpcyBtaXN0YWtlLgorCisyMDA1LTAxLTE0IDEyOjI3OjIyICswMDAwICBTdMOpcGhhbmUgTG9ldWlsbGV0IDxnc3RyZWFtZXJAbGVyb3V0aWVyLm5ldD4KKworCSAgW01PVkVEIEZST00gQkFEXSByZXBsYWNlIGZyYW1lcmF0ZSBhcHJveGltYXRpb25zIGJ5IHRoZWlyIHJlYWwgdmFsdWUgKDI0MDAwLzEwMDEsIDMwMDAwLzEwMDEsIDYwMDAwLzEwMDEpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVjLmM6CisJICAqIGV4dC9saWJmYW1lL2dzdGxpYmZhbWUuYzoKKwkgICogZ3N0L3N1YnBhcnNlL2dzdHN1YnBhcnNlLmM6IChwYXJzZV9tZHZkc3ViKToKKwkgICogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzogKGdzdF95NG1lbmNvZGVfc2lua2Nvbm5lY3QpOgorCSAgcmVwbGFjZSBmcmFtZXJhdGUgYXByb3hpbWF0aW9ucyBieSB0aGVpciByZWFsIHZhbHVlCisJICAoMjQwMDAvMTAwMSwgMzAwMDAvMTAwMSwgNjAwMDAvMTAwMSkKKwkgIEZpbmlzaCBmaXhpbmcgYnVnICMxNjQwNDkKKworMjAwNC0wNy0yNyAyMTo0MTozMCArMDAwMCAgU3RldmUgTGhvbW1lIDxzdGV2ZS5saG9tbWVAZnJlZS5mcj4KKworCSogZ3N0L3k0bS95NG1lbmMudmNwcm9qOgorCSAgW01PVkVEIEZST00gQkFEXSBtb3JlIHdvcmtpbmcgcGx1Z2lucworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBtb3JlIHdvcmtpbmcgcGx1Z2lucworCisyMDA0LTA3LTI3IDA5OjU3OjMzICswMDAwICBTdGV2ZSBMaG9tbWUgPHN0ZXZlLmxob21tZUBmcmVlLmZyPgorCisJKiBnc3QveTRtL3k0bWVuYy52Y3Byb2o6CisJICBbTU9WRUQgRlJPTSBCQURdIHJlbmFtZSBHU3RyZWFtZXItMC44LmxpYiB0byBsaWJnc3RyZWFtZXIubGliCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbmFtZSBHU3RyZWFtZXItMC44LmxpYiB0byBsaWJnc3RyZWFtZXIubGliCisKKzIwMDQtMDctMjcgMDk6NDg6NTEgKzAwMDAgIFN0ZXZlIExob21tZSA8c3RldmUubGhvbW1lQGZyZWUuZnI+CisKKwkqIGdzdC95NG0veTRtZW5jLnZjcHJvajoKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gYXZvaWQgcHJvYmxlbXMgd2l0aCBtYXRoLmgsIGZpeCByZWxlYXNlIGRlcGVuZGFuY3kKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYXZvaWQgcHJvYmxlbXMgd2l0aCBtYXRoLmgsIGZpeCByZWxlYXNlIGRlcGVuZGFuY3kKKworMjAwNC0wNy0yNiAxMzoyMDoxMSArMDAwMCAgU3RldmUgTGhvbW1lIDxzdGV2ZS5saG9tbWVAZnJlZS5mcj4KKworCSogZ3N0L3k0bS95NG1lbmMudmNwcm9qOgorCSAgW01PVkVEIEZST00gQkFEXSBtb3JlIHBsdWdpbnMgc3VwcG9ydGVkIHVuZGVyIHdpbmRvd3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgbW9yZSBwbHVnaW5zIHN1cHBvcnRlZCB1bmRlciB3aW5kb3dzCisKKzIwMDQtMDQtMDEgMTE6NDg6MjcgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgW01PVkVEIEZST00gQkFEXSBhNTJkZWM6ICAgVXNlIGEgZGVidWcgY2F0ZWdvcnksIE91dHB1dCB0aW1lc3RhbXBzIGNvcnJlY3RseQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhNTJkZWM6ICAgVXNlIGEgZGVidWcgY2F0ZWdvcnksIE91dHB1dCB0aW1lc3RhbXBzIGNvcnJlY3RseQorCSAgRW1pdCB0YWcgaW5mbywgSGFuZGxlIGV2ZW50cywgdGVsbCBsaWJhNTJkZWMgYWJvdXQgY3B1CisJICBjYXBhYmlsaXRpZXMgc28gaXQgY2FuIHVzZSBNTVggZXRjLgorCSAgZHZkZWM6ICAgIEZpeCBhIGNyYXNoZXIgYWNjZXNzaW5nIGludmFsaWQgbWVtb3J5CisJICBkdmRuYXZzcmM6U29tZSBzdXBwb3J0IGZvciBieXRlLWZvcm1hdCBzZWVraW5nLgorCSAgU21hbGwgZml4ZXMgZm9yIHN0aWxsIGZyYW1lcyBhbmQgbWVudSBidXR0b24gb3ZlcmxheXMKKwkgIG1wZWcyZGVjOiBVc2UgYSBkZWJ1ZyBjYXRlZ29yeS4gQWRqdXN0IHRoZSByZXBvcnQgbGV2ZWwgb2Ygc2V2ZXJhbCBpdGVtcyB0bworCSAgTE9HLiBDYWxsIG1wZWcyX2N1c3RvbV9mYnVmIHRvIG1hcmsgb3VyIGJ1ZmZlcnMgYXMgJ2N1c3RvbSBidWZmZXJzJworCSAgc28gaXQgZG9lc24ndCBsb3NlIHRoZSBHc3RCdWZmZXIgcG9pbnRlcgorCSAgbmF2c2VlazogIEFkZCB0aGUgbmF2c2VlayBkZWJ1ZyBlbGVtZW50IGZvciBzZWVraW5nIGJhY2sgYW5kIGZvcnRoIGluIGEKKwkgIHZpZGVvIHN0cmVhbSB1c2luZyBhcnJvdyBrZXlzLgorCSAgbXBlZzJzdWJ0OlByZXR0eSBtdWNoIGEgY29tcGxldGUgcmV3cml0ZS4gTm93IGEgbG9vcGJhc2VkIGVsZW1lbnQuIE1heSBzdGlsbAorCSAgcmVxdWlyZSB3b3JrIHRvIHByb3Blcmx5IHN5bmNocm9uaXNlIHN1YnRpdGxlIGJ1ZmZlcnMuCisJICBtcGVnZGVtdXg6CisJICBkdmRkZW11eDogRG9uJ3QgYXR0ZW1wdCB0byBjcmVhdGUgc3ViYnVmZmVycyBvZiBzaXplIDAKKwkgIFJlZHVjZSBhIGNvdXBsZSBvZiBlcnJvciBvdXRwdXRzIHRvIHdhcm5pbmdzLgorCSAgeTRtZW5jb2RlOk91dHB1dCB0aGUgeTRtIGZyYW1lIGhlYWRlciBjb3JyZWN0bHkKKworMjAwNC0wMy0xNSAxOTozMjoyNyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICBbTU9WRUQgRlJPTSBCQURdIGRvbid0IG1peCB0YWJzIGFuZCBzcGFjZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZG9uJ3QgbWl4IHRhYnMgYW5kIHNwYWNlcworCisyMDA0LTAzLTE1IDE2OjMyOjU0ICswMDAwICBKb2hhbiBEYWhsaW4gPGpvaGFuQGdub21lLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEXSAqLmg6IFJldmVydCBpbmRlbnRpbmcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiAqLmg6IFJldmVydCBpbmRlbnRpbmcKKworMjAwNC0wMy0xNCAyMjozNDozMyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5oOgorCSAgW01PVkVEIEZST00gQkFEXSBnc3QtaW5kZW50CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGdzdC1pbmRlbnQKKworMjAwNC0wMS0xMiAwMjowMTo1MiArMDAwMCAgQmVuamFtaW4gT3R0ZSA8b3R0ZUBnbm9tZS5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gZ3N0LWxpYnMvZ3N0L3ZpZGVvL3ZpZGVvLmg6IEZpeCBjYXBzIHRlbXBsYXRlIG5hbWVzIHRvIGJlIHVuZGVyc3RhbmRhYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA0LTAxLTEyICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisJICAqIGdzdC1saWJzL2dzdC92aWRlby92aWRlby5oOgorCSAgRml4IGNhcHMgdGVtcGxhdGUgbmFtZXMgdG8gYmUgdW5kZXJzdGFuZGFibGUuCisJICBQcmVmaXggZXZlcnl0aGluZyB3aXRoIEdTVF9WSURFTy4KKwkgICogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSAgKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6CisJICAqIGV4dC9kaXZ4L2dzdGRpdnhlbmMuYzoKKwkgICogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJICAqIGV4dC9oZXJtZXMvZ3N0Y29sb3JzcGFjZS5jOiAoZ3N0X2NvbG9yc3BhY2VfYmFzZV9pbml0KToKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAocmF3X2NhcHNfZmFjdG9yeSk6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzogKHJhd19jYXBzX2ZhY3RvcnkpOgorCSAgKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiAocmF3X2NhcHNfZmFjdG9yeSk6CisJICAqIGV4dC9zbmFwc2hvdC9nc3RzbmFwc2hvdC5jOgorCSAgKiBleHQvc3dmZGVjL2dzdHN3ZmRlYy5jOgorCSAgKiBleHQveHZpZC9nc3R4dmlkZGVjLmM6CisJICAqIGV4dC94dmlkL2dzdHh2aWRlbmMuYzoKKwkgICogZ3N0L2NoYXJ0L2dzdGNoYXJ0LmM6CisJICAqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOgorCSAgKiBnc3QvZWZmZWN0di9nc3RlZmZlY3R2LmM6CisJICAqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IChnc3RfZmx4ZGVjX2xvb3ApOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJICAqIGdzdC9tZWRpYW4vZ3N0bWVkaWFuLmM6CisJICAqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6IChnc3RfbW9ub3Njb3BlX2luaXQpLAorCSAgKGdzdF9tb25vc2NvcGVfc3JjY29ubmVjdCksIChnc3RfbW9ub3Njb3BlX2NoYWluKToKKwkgICogZ3N0L292ZXJsYXkvZ3N0b3ZlcmxheS5jOgorCSAgKiBnc3Qvc21vb3RoL2dzdHNtb290aC5jOgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkgICogZ3N0L3N5bmFlc3RoZXNpYS9nc3RzeW5hZXN0aGVzaWEuYzoKKwkgICogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkgICogZ3N0L3ZpZGVvZHJvcC9nc3R2aWRlb2Ryb3AuYzoKKwkgICogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgICogc3lzL3FjYW0vZ3N0cWNhbXNyYy5jOgorCSAgKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19wYWxldHRlX3RvX2NhcHMpOgorCSAgTWFrZSB0aGVtIHdvcmsgd2l0aCBuZXcgdmlkZW8uaCBmaWxlLgorCSAgKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2NoYWluKSwKKwkgIChnc3RfeGltYWdlc2lua19idWZmZXJfZnJlZSksIChnc3RfeGltYWdlc2lua19idWZmZXJfYWxsb2MpOgorCSAgKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2NoYWluKSwKKwkgIChnc3RfeHZpbWFnZXNpbmtfYnVmZmVyX2ZyZWUpLCAoZ3N0X3h2aW1hZ2VzaW5rX2J1ZmZlcl9hbGxvYyk6CisJICBNYWtlIGl0IHdvcmsgd2l0aCBuZXcgYnVmZmVyIGFsbG9jYXRpb24gc3lzdGVtLgorCisyMDAzLTEyLTIyIDAxOjQ3OjA5ICswMDAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gTWVyZ2UgQ0FQUyBicmFuY2gKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgTWVyZ2UgQ0FQUyBicmFuY2gKKworMjAwMy0xMi0wNCAxMDozNzozOCArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgW01PVkVEIEZST00gQkFEXSByZW1vdmUgY29weXJpZ2h0IGZpZWxkIGZyb20gcGx1Z2lucworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZW1vdmUgY29weXJpZ2h0IGZpZWxkIGZyb20gcGx1Z2lucworCisyMDAzLTExLTE2IDIyOjAyOjIzICswMDAwICBMZWlmIEpvaG5zb24gPGxlaWZAYW1iaWVudC4yeS5uZXQ+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICBbTU9WRUQgRlJPTSBCQURdICsgY2hlY2tpbmcgaW4gcGx1Z2luIGNhdGVnb3J5IGNoYW5nZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKyBjaGVja2luZyBpbiBwbHVnaW4gY2F0ZWdvcnkgY2hhbmdlcworCisyMDAzLTExLTA3IDEyOjQ3OjAyICswMDAwICBSb25hbGQgUy4gQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmg6CisJICBbTU9WRUQgRlJPTSBCQURdIFJlbW92ZSBhbGwgY29uZmlnLmggaW5jbHVkZXMgZnJvbSBoZWFkZXIgZmlsZXMsIGFkZCBpdCB0byBlYWNoIHNvdXJjZSBmaWxlIGFuZCByZW1vdmUgZHVwbGljYXRlIGNvbmZpZy5oIGluY2x1ZGVzIGZyby4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBSZW1vdmUgYWxsIGNvbmZpZy5oIGluY2x1ZGVzIGZyb20gaGVhZGVyIGZpbGVzLCBhZGQgaXQgdG8gZWFjaCBzb3VyY2UgZmlsZSBhbmQgcmVtb3ZlIGR1cGxpY2F0ZSBjb25maWcuaCBpbmNsdWRlcyBmcm9tIHNldmVyYWwgc291cmNlIGZpbGVzCisKKzIwMDMtMTEtMDIgMTk6MTc6MjcgKzAwMDAgIEJlbmphbWluIE90dGUgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgW01PVkVEIEZST00gQkFEXSBmaXggdG8gbmV3IHBsdWdpbiBzeXN0ZW0KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZml4IHRvIG5ldyBwbHVnaW4gc3lzdGVtCisKKzIwMDMtMTAtMDggMTY6MDg6MTkgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gL0dzdEJ1ZmZlci9Hc3REYXRhLyBpbiB0aGUgQVBJIHdoZXJlIHlvdSBjYW4gcGFzcyBldmVudHMuIEZpeCB0aGUgcGx1Z2lucyB0byBkZWFsIHdpdGggdGhhdC4gRml4ZXMgIzExMzQ4OC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgL0dzdEJ1ZmZlci9Hc3REYXRhLyBpbiB0aGUgQVBJIHdoZXJlIHlvdSBjYW4gcGFzcyBldmVudHMuIEZpeCB0aGUgcGx1Z2lucyB0byBkZWFsIHdpdGggdGhhdC4gRml4ZXMgIzExMzQ4OC4KKworMjAwMy0wOC0xMCAwMDowMTo1OCArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC95NG0vTWFrZWZpbGUuYW06CisJICBbTU9WRUQgRlJPTSBCQURdIFJlbW92ZSByZWR1bmRhbnQgcGx1Z2luZGlyIGRlZmluaXRpb24KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmVtb3ZlIHJlZHVuZGFudCBwbHVnaW5kaXIgZGVmaW5pdGlvbgorCisyMDAzLTA3LTA2IDIwOjQ5OjUyICswMDAwICBSb25hbGQgUy4gQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5oOgorCSAgW01PVkVEIEZST00gQkFEXSBOZXcgbWltZXR5cGVzIGdvbmUgaW50byBlZmZlY3QgdG9kYXkgLSB0aGlzIGNvbW1pdCBjaGFuZ2VzIGFsbCBvbGQgbWltZXR5cGVzIG92ZXIgdG8gdGhlIG5ldyBtaW1ldHlwZXMgc3BlYyBhcyBkZXNjcmkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgTmV3IG1pbWV0eXBlcyBnb25lIGludG8gZWZmZWN0IHRvZGF5IC0gdGhpcyBjb21taXQgY2hhbmdlcyBhbGwgb2xkIG1pbWV0eXBlcyBvdmVyIHRvIHRoZSBuZXcgbWltZXR5cGVzIHNwZWMgYXMgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBjb21taXQncyBkb2N1bWVudC4gTm90ZTogc29tZSBwbHVnaW5zIHdpbGwgYnJlYWssIHNvbWUgcGlwZWxpbmVzIHdpbGwgYnJlYWssIGV4cGVjdCBIRUFEIHRvIGJlIGJyb2tlbiBvciBhdCBsZWFzdCBub3QgMTAwJSB3b3JraW5nIGZvciBhIGZldyBkYXlzLCBidXQgZG9uJ3QgZm9yZ2V0IHRvIHJlcG9ydCBidWdzCisKKzIwMDMtMDYtMjkgMTk6NDY6MTMgKzAwMDAgIEJlbmphbWluIE90dGUgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgW01PVkVEIEZST00gQkFEXSBjb21wYXRpYmlsaXR5IGZpeCBmb3IgbmV3IEdTVF9ERUJVRyBzdHVmZi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgY29tcGF0aWJpbGl0eSBmaXggZm9yIG5ldyBHU1RfREVCVUcgc3R1ZmYuCisJICBJbmNsdWRlcyBmaXhlcyBmb3IgbWlzc2luZyBpbmNsdWRlcyBmb3IgY29uZmlnLmggYW5kIHVuaXN0ZC5oCisJICBJIG9ubHkgZW5zdXJlZCBmb3IgcGx1Z2lucyBJIGNhbiBidWlsZCB0aGF0IHRoZXkgd29yaywgc28gaWYgc29tZSBvZiB0aGVtIGFyZSBzdGlsbCBicm9rZW4sIHlvdSBnb3R0YSBmaXggdGhlbSB5b3Vyc2VsdmVzIHVuZm9ydHVuYXRlbHkuCisKKzIwMDMtMDEtMTAgMTM6Mzg6MzIgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgW01PVkVEIEZST00gQkFEXSBQYWRDb25uZWN0IC0+IFBhZExpbmsKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGFkQ29ubmVjdCAtPiBQYWRMaW5rCisKKzIwMDMtMDEtMTAgMTA6MjI6MjUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgW01PVkVEIEZST00gQkFEXSBhbm90aGVyIGJhdGNoIG9mIGNvbm5lY3QtPmxpbmsgZml4ZXMgcGxlYXNlIGxldCBtZSBrbm93IGFib3V0IGlzc3VlcyBhbmQgcGxlYXNlIHJlZnJhaW4gb2YgbWFraW5nIHRoZW0geW91cnNlbGYsIHNvIHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYW5vdGhlciBiYXRjaCBvZiBjb25uZWN0LT5saW5rIGZpeGVzCisJICBwbGVhc2UgbGV0IG1lIGtub3cgYWJvdXQgaXNzdWVzCisJICBhbmQgcGxlYXNlIHJlZnJhaW4gb2YgbWFraW5nIHRoZW0geW91cnNlbGYsIHNvIHRoYXQgSSBkb24ndCBzcGVuZCBkb3VibGUKKwkgIHRoZSB0aW1lIHJlc29sdmluZyBjb25mbGljdHMKKworMjAwMi0xMi0wOCAxNDo1MDoxMCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC95NG0vTWFrZWZpbGUuYW06CisJICBbTU9WRUQgRlJPTSBCQURdIHBhcmFsbGVsIGluc3RhbGwgZml4ZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcGFyYWxsZWwgaW5zdGFsbCBmaXhlcworCisyMDAyLTA5LTE4IDE5OjAyOjUyICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICBbTU9WRUQgRlJPTSBCQURdIHBsdWdpbnMgcGFydCBvZiBsaWNlbnNlIGZpZWxkIHBhdGNoCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHBsdWdpbnMgcGFydCBvZiBsaWNlbnNlIGZpZWxkIHBhdGNoCisKKzIwMDItMDYtMTcgMTA6Mjk6MzAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3QveTRtL01ha2VmaWxlLmFtOgorCSAgW01PVkVEIEZST00gQkFEXSBjb3NtZXRpYyBjaGFuZ2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgY29zbWV0aWMgY2hhbmdlCisKKzIwMDItMDUtMDMgMDk6NTk6MTAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgW01PVkVEIEZST00gQkFEXSB2YXJpb3VzIG5hbWUgZml4ZXMgYW5kIHN1bmRyeQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICB2YXJpb3VzIG5hbWUgZml4ZXMgYW5kIHN1bmRyeQorCisyMDAyLTA0LTIwIDIxOjQyOjUxICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICBbTU9WRUQgRlJPTSBCQURdIGEgaGFjayB0byB3b3JrIGFyb3VuZCBpbnRsdG9vbCdzIGJyb2tlbm5lc3MgYSBjdXJyZW50IGNoZWNrIGZvciBtcGVnMmRlYyBkZXRhaWxzLT5rbGFzcyByZW9yZ2FuaXphdGlvbnMgYW4gZWxlbWVudCBici4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGEgaGFjayB0byB3b3JrIGFyb3VuZCBpbnRsdG9vbCdzIGJyb2tlbm5lc3MKKwkgICogYSBjdXJyZW50IGNoZWNrIGZvciBtcGVnMmRlYworCSAgKiBkZXRhaWxzLT5rbGFzcyByZW9yZ2FuaXphdGlvbnMKKwkgICogYW4gZWxlbWVudCBicm93c2VyIHRoYXQgdXNlcyBkZXRhaWxzLT5rbGFzcworCSAgKiBzZXBhcmF0ZWQgY2R4YSBwYXJzZSBvdXQgZnJvbSB0aGUgYXZpIGRpcmVjdG9yeQorCisyMDAyLTA0LTExIDIwOjQyOjI2ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6CisJICBbTU9WRUQgRlJPTSBCQURdIEdzdFBhZFRlbXBsYXRlIDwtPiBnc3RfcGFkX3RlbXBsYXRlIDwtPiBHU1RfUEFEX1RFTVBMQVRFIHNhbWUgd2l0aCAqZmFjdG9yeSBhbmQgdHlwZWZpbmQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEdzdFBhZFRlbXBsYXRlIDwtPiBnc3RfcGFkX3RlbXBsYXRlIDwtPiBHU1RfUEFEX1RFTVBMQVRFCisJICBzYW1lIHdpdGggKmZhY3RvcnkgYW5kIHR5cGVmaW5kLgorCSAgYWxzbywgc29tZSAtV2Vycm9yIGZpeGVzLgorCisyMDAyLTAzLTMwIDE3OjA2OjI2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgW01PVkVEIEZST00gQkFEXSBDaGFuZ2VkIHRvIHRoZSBuZXcgcHJvcHMgQVBJCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIENoYW5nZWQgdG8gdGhlIG5ldyBwcm9wcyBBUEkKKwkgIE90aGVyIHNtYWxsIHR1ZmYuCisKKzIwMDItMDMtMjAgMjE6NDU6MDQgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmg6CisJICBbTU9WRUQgRlJPTSBCQURdIHMvR25vbWUtU3RyZWFtZXIvR1N0cmVhbWVyLworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBzL0dub21lLVN0cmVhbWVyL0dTdHJlYW1lci8KKworMjAwMi0wMy0xOSAwNDoxMDowNiArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBnc3QveTRtL01ha2VmaWxlLmFtOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmg6CisJICBbTU9WRUQgRlJPTSBCQURdIHJlbW92YWwgb2YgLy8tc3R5bGUgY29tbWVudHMgZG9uJ3QgbGluayBwbHVnaW5zIHRvIGNvcmUgbGlicyAtLSB0aGUgdmVyc2lvbmluZyBpcyBkb25lIGludGVybmFsbHkgdG8gdGhlIHBsdWdpbnMgd2l0aC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHJlbW92YWwgb2YgLy8tc3R5bGUgY29tbWVudHMKKwkgICogZG9uJ3QgbGluayBwbHVnaW5zIHRvIGNvcmUgbGlicyAtLSB0aGUgdmVyc2lvbmluZyBpcyBkb25lIGludGVybmFsbHkgdG8gdGhlIHBsdWdpbnMgd2l0aCB0aGUgcGx1Z2luX2luZm8gc3RydWN0LAorCSAgYW5kIHN5bWJvbCByZXNvbHV0aW9uIGlzIGxhenksIHNvIHdlIGNhbiBhbHdheXMga25vdyBpZiBhIHBsdWdpbiBjYW4gYmUgbG9hZGVkIGJ5IHRoZSBwbHVnaW5faW5mbyBkYXRhLiBpbiB0aGVvcnkuCisKKzIwMDItMDMtMTkgMDE6Mzk6NDMgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZ3N0L3k0bS9NYWtlZmlsZS5hbToKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gcy9AR1NUX1BMVUdJTl9MREZMQUdTQC8kKEdTVF9QTFVHSU5fTERGTEFHUykvIEAtc3Vic3RpdHVlZCB2YXJpYWJsZXMgdmFyaWFibGVzIGFyZSBkZWZpbmVkIGFzIG1ha2UgdmFyaWFibGVzIGF1dG9tYWdpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHMvQEdTVF9QTFVHSU5fTERGTEFHU0AvJChHU1RfUExVR0lOX0xERkxBR1MpLworCSAgQC1zdWJzdGl0dWVkIHZhcmlhYmxlcyB2YXJpYWJsZXMgYXJlIGRlZmluZWQgYXMgbWFrZSB2YXJpYWJsZXMgYXV0b21hZ2ljYWxseSwKKwkgIGFuZCB0aGlzIGdpdmVzIHRoZSB1c2VyIHRoZSBmcmVlZG9tIHRvIHNheSBtYWtlIEdTVF9QTFVHSU5fTERGTEFHUz0tbXlmbGFnCisKKzIwMDItMDEtMTggMTE6Mzc6MTkgKzAwMDAgIFdyb2JlbGwgPHdyb2JlbGxAaXRlLnBsPgorCisJKiBnc3QveTRtL01ha2VmaWxlLmFtOgorCSAgW01PVkVEIEZST00gQkFEXSAtIHBsdWdpbnMgYXJlIGJ1aWx0IHdpdGhvdXQgdmVyc2lvbmluZyBpbmZvCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIC0gcGx1Z2lucyBhcmUgYnVpbHQgd2l0aG91dCB2ZXJzaW9uaW5nIGluZm8KKworMjAwMi0wMS0xMyAyMjoyNzoyNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gQnJpbmcgdGhlIHBsdWdpbnMgaW4gc3luYyB3aXRoIHRoZSBuZXcgY29yZSBjYXBzbmVnbyBzeXN0ZW0uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJyaW5nIHRoZSBwbHVnaW5zIGluIHN5bmMgd2l0aCB0aGUgbmV3IGNvcmUgY2Fwc25lZ28gc3lzdGVtLgorCSAgQWRkZWQgc29tZSBmZWF0dXJlcywgZW5oYW5jZW1lbnRzLi4uCisKKzIwMDItMDEtMTIgMDM6MzQ6MjcgKzAwMDAgIERhdmlkIEkuIExlaG4gPGRsZWhuQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L3k0bS9NYWtlZmlsZS5hbToKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gcy9maWx0ZXIvcGx1Z2luLyBsaW5rIHBsdWdpbnMgdG8gR1NUX0xJQlMgcmVhcnJhbmdlIHJ1bGVzIHRvIGEgY29tbW9uIGZvcm1hdAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHMvZmlsdGVyL3BsdWdpbi8KKwkgICogbGluayBwbHVnaW5zIHRvIEdTVF9MSUJTCisJICAqIHJlYXJyYW5nZSBydWxlcyB0byBhIGNvbW1vbiBmb3JtYXQKKworMjAwMS0xMi0yMyAyMDoyMToyMCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC95NG0vTWFrZWZpbGUuYW06CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgW01PVkVEIEZST00gQkFEXSBtb3JlIGZpeGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIG1vcmUgZml4ZXMKKworMjAwMS0xMi0yMyAxMzoxNzozNiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC95NG0vTWFrZWZpbGUuYW06CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRF0gQkJCIGFza2VkIG1lIHRvIHJlbmFtZSBsYXYgdG8geTRtIGNhbiBzb21lb25lIHdobyBrbm93cyB0aGUgcGx1Z2luIGRvIHRoaXMgaW4gdGhlIHNvdXJjZSBhcyB3ZWxsID8KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQkJCIGFza2VkIG1lIHRvIHJlbmFtZSBsYXYgdG8geTRtCisJICBjYW4gc29tZW9uZSB3aG8ga25vd3MgdGhlIHBsdWdpbiBkbyB0aGlzIGluIHRoZSBzb3VyY2UgYXMgd2VsbCA/CisKKzIwMDktMDUtMTUgMTg6MTc6MzUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBwby9NYWtldmFyczoKKwkgIHBvOiBhZGQgTWFrZXZhcnMgbWFnaWMgc28gd2UgZG9uJ3QgZ2V0IGxpbmUgbnVtYmVycyBpbiAqLnBvIGZpbGVzCisJICBUaGlzIGF2b2lkcyB0aGUgbnVtYmVyIG9uZSByZWFzb24gZm9yIGxvY2FsIG1vZGlmaWNhdGlvbnMgaW4gKi5wbworCSAgZmlsZXMgYW5kIGFuZCBtYWtlcyB0aGluZ3MgbGVzcyBhbm5veWluZyB3aGVuIHdvcmtpbmcgd2l0aCBnaXQgKG9yCisJICBhbnkgb3RoZXIgVkNTIGZvciB0aGF0IG1hdHRlcikuCisKKzIwMDktMDUtMTUgMTc6MTE6MjcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM2RlbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOgorCSogdGVzdHMvY2hlY2svcGlwZWxpbmVzL2ZsYWNkZWMuYzoKKwkqIHRlc3RzL2ZpbGVzL01ha2VmaWxlLmFtOgorCSogdGVzdHMvZmlsZXMvYXVkaW90ZXN0c3JjLmZsYWM6CisJKiB0ZXN0cy9maWxlcy90ZXN0LWNlcnQucGVtOgorCSogdGVzdHMvZmlsZXMvdGVzdC1rZXkucGVtOgorCSAgY2hlY2tzOiBtb3ZlIGZpbGVzIHJlcXVpcmVkIGJ5IHVuaXQgdGVzdHMgaW50byB0ZXN0cy9maWxlcyBhbmQgbWFrZSBzdXJlIHRoZXkncmUgZGlzdGVkCisJICBNb3ZlIHVuaXQgdGVzdCBkYXRhIGludG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBpdCBiZWxvbmdzIGFuZCBtYWtlIGluIHBhcnRpY3VsYXIKKwkgIHRoZSBmbGFjZGVjIHVuaXQgdGVzdCBjZCBpbnRvIHRoZSBkaXJlY3Rvcnkgd2l0aCB0aGUgdGVzdCBmaWxlcyBpbnN0ZWFkIG9mIG1ha2luZworCSAgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaW4gdGhhdCB1bml0IHRlc3QuIEFzIGEgc2lkZSBlZmZlY3QKKwkgIG9mIG1vdm5nIHRob3NlIGZpbGVzLCB0aGVyZSdzIG9ubHkgb25lIEVYVFJBX0RJU1QgaW4gdGVzdHMvY2hlY2svTWFrZWZpbGUuYW0gbm93LAorCSAgd2hpY2ggaXMgbGlrZWx5IHRvIHdvcmsgYmV0dGVyIHRoYW4gaGF2aW5nIHR3by4gSG9wZWZ1bGx5IGZpeGVzICM1ODI3NTMuCisKKzIwMDktMDUtMTQgMjE6NDM6MTQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgIGRlaW50ZXJsYWNlOiBJZiB0aGUgdXBzdHJlYW0gbWF4IGxhdGVuY3kgaXMgdW5ib3VuZCByZXR1cm4gdW5ib3VuZCBtYXggbGF0ZW5jeQorCSAgRml4ZXMgYnVnICM1ODI2NjEuCisKKzIwMDktMDUtMTUgMDg6NDQ6MzkgKzAyMDAgIEphbWVzIEFuZHJld2FydGhhIDx0cnM4MEB1Y2MuZ3UudXdhLmVkdS5hdT4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyY3RybC5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJ0cmFjay5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICBGaXggY29tcGlsZXIgd2FybmluZ3MKKwkgIEZpeGVzIGJ1ZyAjNTgyNzE1LgorCisyMDA5LTA1LTEzIDIyOjQ2OjQ0ICswMjAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIFJlY292ZXJlZCBkZWJ1Z3V0aWxzIGxpbmUgYWNjaWRlbnRhbGx5IHJlbW92ZWQgaW4gZGVpbnRlcmxhY2UyIG1vdmUuCisKKzIwMDktMDUtMTMgMTA6NDY6NDAgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sOgorCSogZ3N0L2RlaW50ZXJsYWNlL01ha2VmaWxlLmFtOgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuaDoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5LmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYXNtOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWhtYWNyb3MuaDoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhcmJsZW5kLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL21teC5oOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9wbHVnaW5zLmg6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3NjYWxlcmJvYi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9zc2UuaDoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3AwQS5pbmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEJvdHRvbS5pbmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEVkZ2VBLmluYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wRWRnZUE4LmluYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wT2RkQS5pbmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEEyLmluYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wT2RkQTYuaW5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBSC5pbmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEFIMi5pbmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFRvcC5pbmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFZBLmluYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wVkFILmluYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TdHJhbmdlQm9iLmluYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsLmluYzoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsMi5pbmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvV2llcmRCb2IuaW5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL3RvbXNtb2NvbXBtYWNyb3MuaDoKKwkqIGdzdC9kZWludGVybGFjZS90dnRpbWUvdmZpci5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZWJmZi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS93ZWF2ZXRmZi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS94ODYtNjRfbWFjcm9zLmluYzoKKwkgIE1vdmVkICdkZWludGVybGFjZTInIGZyb20gLWJhZCB0byAtZ29vZAorCSAgQW5kIHJlbmFtZSBpdCB0byBkZWludGVybGFjZS4KKworMjAwOS0wNS0wOCAxNTozOToyNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5oOgorCSAgW01PVkVEIEZST00gQkFEIDU2LzU2XSBkZWludGVybGFjZTI6IEFkZCBhIGRpc2FibGVkIG1vZGUgZm9yIHBhc3N0aHJvdWdoIG9wZXJhdGlvbgorCSAgQWxzbyBhbGxvdyB0byBjaGFuZ2UgdGhlIG1vZGUgaW4gUEFVU0VEIGFuZCBQTEFZSU5HIGJ5IHVwZGF0aW5nCisJICB0aGUgY2FwcyBpZiBuZWNlc3NhcnkuCisKKzIwMDktMDQtMjIgMTk6NDM6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1NS81Nl0gZGVpbnRlcmxhY2UyOiBBZGQgZG9jdW1lbnRhdGlvbiBhbmQgaW50ZWdyYXRlIGludG8gdGhlIGJ1aWxkIHN5c3RlbQorCisyMDA5LTA0LTE5IDE3OjE4OjM1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1NC81Nl0gZGVpbnRlcmxhY2UyOiBNYWtlIGl0IHBvc3NpYmxlIHRvIHNlbGVjdCBpbnRlcmxhY2luZyBhdXRvZGV0ZWN0aW9uIG9yIHRvIGVuZm9yZSBkZWludGVybGFjaW5nCisJICBGb3IgdGhpcyBhZGQgYSAibW9kZSIgcHJvcGVydHkgdGhhdCBkZWZhdWx0cyB0byAiaW50ZXJsYWNlZCIgZm9yIG5vdyBhcworCSAgbW9zdCBkZWNvZGVycy9kZW11eGVycyBkb24ndCBwcm9wZXJseSBzZXQgdGhlICJpbnRlcmxhY2VkIiBmaWVsZCBvbiB0aGUKKwkgIGNhcHMgeWV0LgorCSAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gImF1dG8iIHRoZSBlbGVtZW50IHdpbGwgd29yayBpbiBwYXNzdGhyb3VnaAorCSAgbW9kZSB1bmxlc3MgdGhlIGNhcHMgY29udGFpbiB0aGUgImludGVybGFjZWQiIGZpZWxkLgorCisyMDA5LTA0LTE3IDE1OjM5OjU5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1My81Nl0gZGVpbnRlcmxhY2UyOiBVc2UgR1NUXyhERUJVR3xXQVJOSU5HfEVSUk9SKV9PQkpFQ1QgaW5zdGVhZCBvZiB0aGUgbm9uLU9CSkVDVCBvbmVzCisKKzIwMDktMDQtMTcgMTU6Mzk6MzYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOgorCSAgW01PVkVEIEZST00gQkFEIDUyLzU2XSBkZWludGVybGFjZTI6IFJlc2V0IGhpc3RvcnkgaWYgRElTQ09OVCBpcyBzZXQgb24gdGhlIGluY29taW5nIGJ1ZmZlcgorCisyMDA5LTA0LTE3IDE1OjM5OjEwICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1MS81Nl0gZGVpbnRlcmxhY2UyOiBGaXggdGltZXN0YW1wcyBmb3IgYnVmZmVycyB3aXRoIFJGRiBmbGFnIHNldAorCisyMDA5LTA0LTE2IDE3OjQxOjM3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkqIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmg6CisJKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHkuYzoKKwkqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWguYzoKKwkqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3NjYWxlcmJvYi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsLmluYzoKKwkqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3dlYXZlLmM6CisJKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS93ZWF2ZWJmZi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvd2VhdmV0ZmYuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1MC81Nl0gZGVpbnRlcmxhY2UyOiBSZW5hbWUgbGluZV9sZW5ndGggdG8gcm93X3N0cmlkZSBhbmQgcmVtb3ZlIG91dHB1dF9zdHJpZGUKKworMjAwOS0wNC0xNiAxNTo1MjozOSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgNDkvNTZdIGRlaW50ZXJsYWNlMjogSW1wbGVtZW50IHN1cHBvcnQgZm9yIFJGRiBhbmQgT05FRklFTEQgYnVmZmVyIGZsYWdzCisKKzIwMDktMDQtMTUgMTU6NDY6NDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuaDoKKwkqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeS5jOgorCSogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5jOgorCSogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsLmluYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA0OC81Nl0gZGVpbnRlcmxhY2UyOiBNb3ZlIG91dHB1dCBidWZmZXIgZnJvbSB0aGUgaW5zdGFuY2Ugc3RydWN0IHRvIGEgZnVuY3Rpb24gcGFyYW1ldGVyCisKKzIwMDktMDQtMTUgMTU6MzM6MTcgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOgorCSogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA0Ny81Nl0gZGVpbnRlcmxhY2UyOiBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBhdXRvbWF0aWMgZGV0ZWN0aW9uIG9mIHRoZSBmaWVsZCBvcmRlcgorCisyMDA5LTA0LTE1IDE0OjQ3OjQ5ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA0Ni81Nl0gZGVpbnRlcmxhY2UyOiBBZGQgc3VwcG9ydCBmb3IgWVZZVSBjb2xvcnNwYWNlCisJICBUaGlzIGlzIHRoZSBzYW1lIGFzIFlVWTIgd2l0aCBqdXN0IENyIGFuZCBDYiBzd2FwcGVkLiBBcworCSAgd2UgZG9uJ3QgbWFrZSBhIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVtIHdoZW4gZGVpbnRlcmxhY2luZworCSAgdGhpcyB3b3Jrcy4KKworMjAwOC0xMS0wNiAxNDowNTo1NSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgW01PVkVEIEZST00gQkFEIDQ1LzU2XSBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOiBCcmluZyBwcm9wZXJ0aWVzIGludG8gdGhpcyBjZW50dXJ5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmM6CisJICAoZ3N0X2RlaW50ZXJsYWNlMl9jbGFzc19pbml0KSwgKGdzdF9kZWludGVybGFjZTJfaW5pdCksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9zZXRfcHJvcGVydHkpLCAoZ3N0X2RlaW50ZXJsYWNlMl9nZXRfcHJvcGVydHkpOgorCSAgQnJpbmcgcHJvcGVydGllcyBpbnRvIHRoaXMgY2VudHVyeS4KKworMjAwOC0xMS0wNCAxMjo0MjozMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgNDQvNTZdIERvbid0IGluc3RhbGwgc3RhdGljIGxpYnMgZm9yIHBsdWdpbnMuIEZpeGVzICM1NTA4NTEgZm9yIC1iYWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2Fsc2FzcGRpZi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FtcndiL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXBleHNpbmsvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hcnRzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXJ0c2QvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hdWRpb2ZpbGUvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hdWRpb3Jlc2FtcGxlL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYnoyL01ha2VmaWxlLmFtOgorCSAgKiBleHQvY2RhdWRpby9NYWtlZmlsZS5hbToKKwkgICogZXh0L2NlbHQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kYzEzOTQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kaXJhYy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2RpcmVjdGZiL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGl2eC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2R0cy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2ZhYWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9mYWFkL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZ3NtL01ha2VmaWxlLmFtOgorCSAgKiBleHQvaGVybWVzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvaXZvcmJpcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2phY2svTWFrZWZpbGUuYW06CisJICAqIGV4dC9qcDJrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbGFkc3BhL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbGNzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbGliZmFtZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xpYm1tcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L21ldGFkYXRhL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXBlZzJlbmMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tcGxleC9NYWtlZmlsZS5hbToKKwkgICogZXh0L211c2VwYWNrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXVzaWNicmFpbnovTWFrZWZpbGUuYW06CisJICAqIGV4dC9teXRodHYvTWFrZWZpbGUuYW06CisJICAqIGV4dC9uYXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9uZW9uL01ha2VmaWxlLmFtOgorCSAgKiBleHQvb2ZhL01ha2VmaWxlLmFtOgorCSAgKiBleHQvcG9seXAvTWFrZWZpbGUuYW06CisJICAqIGV4dC9yZXNpbmR2ZC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NkbC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3Nob3V0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvc25hcHNob3QvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zbmRmaWxlL01ha2VmaWxlLmFtOgorCSAgKiBleHQvc291bmR0b3VjaC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NwYy9NYWtlZmlsZS5hbToKKwkgICogZXh0L3N3ZmRlYy9NYWtlZmlsZS5hbToKKwkgICogZXh0L3Rhcmtpbi9NYWtlZmlsZS5hbToKKwkgICogZXh0L3RoZW9yYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3RpbWlkaXR5L01ha2VmaWxlLmFtOgorCSAgKiBleHQvdHdvbGFtZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3gyNjQvTWFrZWZpbGUuYW06CisJICAqIGV4dC94aW5lL01ha2VmaWxlLmFtOgorCSAgKiBleHQveHZpZC9NYWtlZmlsZS5hbToKKwkgICogZ3N0LWxpYnMvZ3N0L2FwcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0LWxpYnMvZ3N0L2RzaG93L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYWlmZnBhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXBwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXVkaW9idWZmZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9iYXllci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2NkeGFwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2NoYXJ0L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvY29sb3JzcGFjZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RjY3AvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWludGVybGFjZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2R2ZHNwdS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2Zlc3RpdmFsL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZmlsdGVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZmxhY3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZmx2L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZ2FtZXMvTWFrZWZpbGUuYW06CisJICAqIGdzdC9oMjY0cGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9saWJyZmIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9taXhtYXRyaXgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tb2RwbHVnL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZzFzeXMvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tcGVnNHZpZGVvcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tcGVnZGVtdXgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tcGVndHNtdXgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tcGVndmlkZW9wYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L212ZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L25zZi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L251dmRlbXV4L01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvb3ZlcmxheS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3Bhc3N0aHJvdWdoL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcGNhcHBhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcGxheW9uZGVtYW5kL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcmF3cGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9yZWFsL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRqcGVnL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwbWFuYWdlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NjYWxldGVtcG8vTWFrZWZpbGUuYW06CisJICAqIGdzdC9zZHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zZWxlY3Rvci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3Ntb290aC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3Ntb290aHdhdmUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zcGVlZC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NwZWV4cmVzYW1wbGUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zdGVyZW8vTWFrZWZpbGUuYW06CisJICAqIGdzdC9zdWJlbmMvTWFrZWZpbGUuYW06CisJICAqIGdzdC90dGEvTWFrZWZpbGUuYW06CisJICAqIGdzdC92YmlkZWMvTWFrZWZpbGUuYW06CisJICAqIGdzdC92aWRlb2Ryb3AvTWFrZWZpbGUuYW06CisJICAqIGdzdC92aWRlb3NpZ25hbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZpcnR1YWxkdWIvTWFrZWZpbGUuYW06CisJICAqIGdzdC92bW5jL01ha2VmaWxlLmFtOgorCSAgKiBnc3QveTRtL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvYWNtZW5jL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvY2Ryb20vTWFrZWZpbGUuYW06CisJICAqIHN5cy9kc2hvd2RlY3dyYXBwZXIvTWFrZWZpbGUuYW06CisJICAqIHN5cy9kc2hvd3NyY3dyYXBwZXIvTWFrZWZpbGUuYW06CisJICAqIHN5cy9kdmIvTWFrZWZpbGUuYW06CisJICAqIHN5cy9keHIzL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZmJkZXYvTWFrZWZpbGUuYW06CisJICAqIHN5cy9vc3M0L01ha2VmaWxlLmFtOgorCSAgKiBzeXMvcWNhbS9NYWtlZmlsZS5hbToKKwkgICogc3lzL3F0d3JhcHBlci9NYWtlZmlsZS5hbToKKwkgICogc3lzL3ZjZC9NYWtlZmlsZS5hbToKKwkgICogc3lzL3dpbmluZXQvTWFrZWZpbGUuYW06CisJICAqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIERvbid0IGluc3RhbGwgc3RhdGljIGxpYnMgZm9yIHBsdWdpbnMuIEZpeGVzICM1NTA4NTEgZm9yIC1iYWQuCisKKzIwMDgtMTAtMDkgMTk6Mzg6NTIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDQzLzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wLmM6IEZpeCB1bnVzZWQgdmFyaWFibGUgY29tcGlsZXIgd2FybmluZyB3aGVuIG5vdCBidWlsZGluZworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3RvbXNtb2NvbXBfY2xhc3NfaW5pdCk6CisJICBGaXggdW51c2VkIHZhcmlhYmxlIGNvbXBpbGVyIHdhcm5pbmcgd2hlbiBub3QgYnVpbGRpbmcKKwkgIFg4NiBhc3NlbWJseS4KKworMjAwOC0wOC0yOCAxNzoxNjo1MSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCA0Mi81Nl0gZ3N0L2RjY3AvOiBGaXggY29tcGlsYXRpb24gb24gU29sYXJpcyBieSBpbmNsdWRpbmcgZmlsaW8uaCBhcyBuZWVkZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RjY3AvZ3N0ZGNjcC5jOgorCSAgKiBnc3QvZGNjcC9nc3RkY2NwY2xpZW50c3JjLmM6CisJICBGaXggY29tcGlsYXRpb24gb24gU29sYXJpcyBieSBpbmNsdWRpbmcgZmlsaW8uaCBhcyBuZWVkZWQuCisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvVG9tc01vQ29tcEFsbC5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvVG9tc01vQ29tcEFsbDIuaW5jOgorCSAgRml4IGNvbXBpbGF0aW9uIHdpdGggRm9ydGUgLSBhcHBhcmVudGx5IGl0IGhhdGVzIGNvbmNhdGVuYXRpbmcgYQorCSAgbWFjcm8gYXJndW1lbnQgdGhhdCBzdGFydHMgd2l0aCBhbiB1bmRlcnNjb3JlPz8KKworMjAwOC0wOC0yNiAxMjozMzoxNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgNDEvNTZdIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvOiBVbnJvbGwgdGhlIGxvb3AgdG8gaGFuZGxlIHR3byBieXRlcyBhdCBvbmNlLiBUaGlzIHNob3VsZCBnaXZlIGEgc21hbGwgc3BlZWR1cCBhbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEJvdHRvbS5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFRvcC5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU3RyYW5nZUJvYi5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvV2llcmRCb2IuaW5jOgorCSAgVW5yb2xsIHRoZSBsb29wIHRvIGhhbmRsZSB0d28gYnl0ZXMgYXQgb25jZS4gVGhpcyBzaG91bGQgZ2l2ZQorCSAgYSBzbWFsbCBzcGVlZHVwIGFuZCBtYWtlcyBpdCBwb3NzaWJsZSB0byBoYW5kbGUgY2hyb21hIGFuZCBsdW1hCisJICBkaWZmZXJlbnQgd2hpY2ggaXMgbmVlZGVkIGxhdGVyLgorCisyMDA4LTA4LTI1IDE0OjM3OjQ1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCA0MC81Nl0gZ3N0L2RlaW50ZXJsYWNlMi86IEZpcnN0IHBhcnQgb2YgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRvbXNtb2NvbXAgZGVpbnRlcmxhY2luZyBhbGdvcml0aG0uIFRoaXMgb25seSBzdXBwb3J0cyBzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5oOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wLmM6CisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF90b21zbW9jb21wX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BCb3R0b20uaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BUb3AuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1N0cmFuZ2VCb2IuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwyLmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9XaWVyZEJvYi5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvdG9tc21vY29tcG1hY3Jvcy5oOgorCSAgRmlyc3QgcGFydCBvZiB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdG9tc21vY29tcCBkZWludGVybGFjaW5nCisJICBhbGdvcml0aG0uIFRoaXMgb25seSBzdXBwb3J0cyBzZWFyY2gtZWZmb3J0PTAgY3VycmVudGx5LCBpcyBwYWluZnVsbHkKKwkgIHNsb3cgYW5kIG5lZWRzIHNvbWUgY2xlYW51cCBsYXRlciB3aGVuIGFsbCBzZWFyY2gtZWZmb3J0IHNldHRpbmdzCisJICBhcmUgaW1wbGVtZW50ZWQgaW4gQy4KKworMjAwOC0wOC0wMiAxODo0ODoxNyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMzkvNTZdIGdzdC9kZWludGVybGFjZTIvOiBVc2Ugb2lsX21lbWNweSgpIGluc3RlYWQgb2YgbWVtY3B5KCkgYXMgaXQncyBmYXN0ZXIgZm9yIHRoZSBzaXplcyB0aGF0IGFyZSB1c3VhbGx5IHVzZWQgaGVyZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOgorCSAgKGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2ludGVycG9sYXRlX3NjYW5saW5lKSwKKwkgIChnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9jb3B5X3NjYW5saW5lKSwKKwkgIChnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZSk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeS5jOiAoZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5jOgorCSAgKGRlaW50ZXJsYWNlX2ZyYW1lX2RpX2dyZWVkeWgpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9zY2FsZXJib2IuYzoKKwkgIChkZWludGVybGFjZV9zY2FubGluZV9zY2FsZXJfYm9iKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC5jOiAoRmllbGRjb3B5KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvd2VhdmUuYzogKGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlKSwKKwkgIChjb3B5X3NjYW5saW5lKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvd2VhdmViZmYuYzogKGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlKSwKKwkgIChjb3B5X3NjYW5saW5lKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvd2VhdmV0ZmYuYzogKGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlKSwKKwkgIChjb3B5X3NjYW5saW5lKToKKwkgIFVzZSBvaWxfbWVtY3B5KCkgaW5zdGVhZCBvZiBtZW1jcHkoKSBhcyBpdCdzIGZhc3RlciBmb3IgdGhlIHNpemVzIHRoYXQKKwkgIGFyZSB1c3VhbGx5IHVzZWQgaGVyZS4KKworMjAwOC0wOC0wMiAxODozNjoxMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMzgvNTZdIGdzdC9kZWludGVybGFjZTIvOiBBZGQgdGhlIHJlbWFpbmluZyB0dnRpbWUgZGVpbnRlcmxhY2luZyBtZXRob2RzIGFuZCBmaXggdGhlIGRlaW50ZXJsYWNlX2ZyYW1lKCkgaW1wbGVtZW50YXRpb24gb2YgRy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmM6CisJICAoZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWUpLAorCSAgKGdzdF9kZWludGVybGFjZTJfbWV0aG9kc19nZXRfdHlwZSksIChnc3RfZGVpbnRlcmxhY2UyX3NldF9tZXRob2QpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5oOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9saW5lYXIuYzoKKwkgIChkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYyksIChkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfbW14KSwKKwkgIChkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfbW14ZXh0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9jbGFzc19pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9pbml0KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvbGluZWFyYmxlbmQuYzoKKwkgIChkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmRfYyksCisJICAoZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kMl9jKSwKKwkgIChkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmRfbW14KSwKKwkgIChkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX21teCksCisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9saW5lYXJfYmxlbmRfY2xhc3NfaW5pdCksCisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9saW5lYXJfYmxlbmRfaW5pdCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3BsdWdpbnMuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvc2NhbGVyYm9iLmM6CisJICAoZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYiksCisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9zY2FsZXJfYm9iX2NsYXNzX2luaXQpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2Rfc2NhbGVyX2JvYl9pbml0KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvd2VhdmUuYzogKGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlKSwKKwkgIChjb3B5X3NjYW5saW5lKSwgKGdzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfY2xhc3NfaW5pdCksCisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF93ZWF2ZV9pbml0KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvd2VhdmViZmYuYzogKGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlKSwKKwkgIChjb3B5X3NjYW5saW5lKSwgKGdzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfYmZmX2NsYXNzX2luaXQpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfYmZmX2luaXQpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS93ZWF2ZXRmZi5jOiAoZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmUpLAorCSAgKGNvcHlfc2NhbmxpbmUpLCAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF93ZWF2ZV90ZmZfY2xhc3NfaW5pdCksCisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF93ZWF2ZV90ZmZfaW5pdCk6CisJICBBZGQgdGhlIHJlbWFpbmluZyB0dnRpbWUgZGVpbnRlcmxhY2luZyBtZXRob2RzIGFuZCBmaXggdGhlCisJICBkZWludGVybGFjZV9mcmFtZSgpIGltcGxlbWVudGF0aW9uIG9mIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kLgorCisyMDA4LTA4LTAyIDE4OjMwOjU2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzNy81Nl0gZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdmZpci5jOiBJbXBsZW1lbnQgdGhlIFZGSVIgZGVpbnRlcmxhY2luZyBtZXRob2QgYXMgc2ltcGxlIG1ldGhvZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS92ZmlyLmM6IChkZWludGVybGFjZV9saW5lX2MpLAorCSAgKGRlaW50ZXJsYWNlX2xpbmVfbW14KSwgKGdzdF9kZWludGVybGFjZV9tZXRob2RfdmZpcl9jbGFzc19pbml0KToKKwkgIEltcGxlbWVudCB0aGUgVkZJUiBkZWludGVybGFjaW5nIG1ldGhvZCBhcyBzaW1wbGUgbWV0aG9kLgorCisyMDA4LTA4LTAyIDE4OjE4OjU0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzNi81Nl0gZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuKjogQWRkIGEgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2Qgc3ViY2xhc3Mgb2YgR3N0RGVpbnRlcmxhY2VNZXRob2QgdGhhdCBjYW4gYmUgdXNlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9pbnRlcnBvbGF0ZV9zY2FubGluZSksCisJICAoZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfY29weV9zY2FubGluZSksCisJICAoZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWUpLAorCSAgKGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2NsYXNzX2luaXQpLAorCSAgKGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2luaXQpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5oOgorCSAgQWRkIGEgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2Qgc3ViY2xhc3Mgb2YgR3N0RGVpbnRlcmxhY2VNZXRob2QgdGhhdAorCSAgY2FuIGJlIHVzZWQgYnkgc2ltcGxlIGRlaW50ZXJsYWNpbmcgbWV0aG9kcy4gVGhleSBvbmx5IGhhdmUgdG8gcHJvdmlkZQorCSAgYSBmdW5jdGlvbiBmb3IgaW50ZXJwb2xhdGluZyBhIHNjYW5saW5lIG9yIGNvcHlpbmcgYSBzY2FubGluZS4KKworMjAwOC0wOC0wMiAxODoxNTo0OSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMzUvNTZdIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmM6IFJlc3BlY3QgdGhlIGxhdGVuY3kgb2YgdGhlIGRlaW50ZXJsYWNpbmcgYWxnb3JpdGhtIGZvciB0aGUgdGltZXN0YW1wcyBvZiBldmVyeSBidS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmM6IChnc3RfZGVpbnRlcmxhY2UyX2NoYWluKToKKwkgIFJlc3BlY3QgdGhlIGxhdGVuY3kgb2YgdGhlIGRlaW50ZXJsYWNpbmcgYWxnb3JpdGhtIGZvciB0aGUgdGltZXN0YW1wcworCSAgb2YgZXZlcnkgYnVmZmVyLgorCisyMDA4LTA4LTAyIDE4OjEzOjIwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzNC81Nl0gZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvOiBBZGQgdGhlIE1NWCByZWdpc3RlcnMgdG8gdGhlIGNsb2JiZXJlZCByZWdpc3RlcnMgb25seSBpZiBfX01NWF9fIGlzIGRlZmluZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5hc206CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEJvdHRvbS5pbmM6CisJICBBZGQgdGhlIE1NWCByZWdpc3RlcnMgdG8gdGhlIGNsb2JiZXJlZCByZWdpc3RlcnMgb25seSBpZiBfX01NWF9fIGlzCisJICBkZWZpbmVkLgorCisyMDA4LTA4LTAyIDE4OjA5OjU2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzMy81Nl0gZ3N0L2RlaW50ZXJsYWNlMi86IEVuYWJsZSB0b21zbW9jb21wIGFnYWluIGFzIHRoZSBDIHBvcnQgd2lsbCBiZSByZWFkeSBmb3IgdGhlIG5leHQgcmVsZWFzZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOgorCSAgKGdzdF9kZWludGVybGFjZTJfbWV0aG9kc19nZXRfdHlwZSksIChnc3RfZGVpbnRlcmxhY2UyX3NldF9tZXRob2QpLAorCSAgKGdzdF9kZWludGVybGFjZTJfY2xhc3NfaW5pdCk6CisJICBFbmFibGUgdG9tc21vY29tcCBhZ2FpbiBhcyB0aGUgQyBwb3J0IHdpbGwgYmUgcmVhZHkgZm9yIHRoZSBuZXh0CisJICByZWxlYXNlLgorCisyMDA4LTA4LTAyIDE4OjAyOjQ0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzMi81Nl0gZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzogRG9uJ3QgdXNlIHByb3h5X2dldGNhcHMoKSBidXQgaW1wbGVtZW50IG91ciBvd24gZ2V0Y2FwcygpIGZ1bmN0aW9uIHRoYXQgZG91Ymxlcy9oLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzogKGdzdF9kZWludGVybGFjZTJfaW5pdCksCisJICAoZ3N0X2dyZWF0ZXN0X2NvbW1vbl9kaXZpc29yKSwgKGdzdF9mcmFjdGlvbl9kb3VibGUpLAorCSAgKGdzdF9kZWludGVybGFjZTJfZ2V0Y2FwcyksIChnc3RfZGVpbnRlcmxhY2UyX3NldGNhcHMpOgorCSAgRG9uJ3QgdXNlIHByb3h5X2dldGNhcHMoKSBidXQgaW1wbGVtZW50IG91ciBvd24gZ2V0Y2FwcygpIGZ1bmN0aW9uCisJICB0aGF0IGRvdWJsZXMvaGFsZnMgdGhlIGZyYW1lcmF0ZSBpZiBhbGwgZmllbGRzIHNob3VsZCBiZSBzZW50IG91dC4KKworMjAwOC0wNy0xOCAwODozNDowNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMzEvNTZdIERpc2FibGUgdGhlIHRvbXNtb2NvbXAgYWxnb3JpdGhtIGZvciB0aGlzIHJlbGVhc2UgYXMgaXQncyBidWdneSBhbmQgaGFzIG5vIEMgaW1wbGVtZW50YXRpb24geWV0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2UyX21ldGhvZHNfZ2V0X3R5cGUpLCAoZ3N0X2RlaW50ZXJsYWNlMl9zZXRfbWV0aG9kKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2NsYXNzX2luaXQpLCAoZ3N0X2RlaW50ZXJsYWNlMl9pbml0KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5LmM6CisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfbF9jbGFzc19pbml0KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5jOgorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2hfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3ZmaXIuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3ZmaXJfY2xhc3NfaW5pdCk6CisJICBEaXNhYmxlIHRoZSB0b21zbW9jb21wIGFsZ29yaXRobSBmb3IgdGhpcyByZWxlYXNlIGFzIGl0J3MgYnVnZ3kKKwkgIGFuZCBoYXMgbm8gQyBpbXBsZW1lbnRhdGlvbiB5ZXQuCisJICBCdWlsZCB0aGUgZGVpbnRlcmxhY2UyIHBsdWdpbiBvbiBhbGwgYXJjaGl0ZWN0dXJlcyBidXQgc3RpbGwgbWFyayBpdAorCSAgYXMgZXhwZXJpbWVudGFsLgorCSAgQnVpbGQgdGhlIHg4NiBpbmxpbmUgYXNzZW1ibHkgb25seSBpZiBHQ0MgaW5saW5lIGFzc2VtYmx5IGlzIHN1cHBvcnRlZAorCSAgYW5kIG9ubHkgb24geDg2IG9yIGFtZDY0LiBGaXhlcyBidWcgIzU0MzI4Ni4KKworMjAwOC0wNy0xNCAxNDoxMzo1NCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgW01PVkVEIEZST00gQkFEIDMwLzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS86IEZpeCBidWlsZCBvbiB4ODZfNjQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHkuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dyZWVkeV9sX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmM6CisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfaF9jbGFzc19pbml0KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdmZpci5jOgorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfdmZpcl9jbGFzc19pbml0KToKKwkgIEZpeCBidWlsZCBvbiB4ODZfNjQKKworMjAwOC0wNy0xMyAxMDo1Njo0NSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjkvNTZdIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWguYXNtOiBBbHdheXMgdXNlIHRoZSBDIGltcGxlbWVudGF0aW9uIGlmIHdpZHRoIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIFRoZSBhc3NlbWJseSBvcC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWguYXNtOgorCSAgQWx3YXlzIHVzZSB0aGUgQyBpbXBsZW1lbnRhdGlvbiBpZiB3aWR0aCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiBUaGUKKwkgIGFzc2VtYmx5IG9wdGltaXplZCB2ZXJzaW9uIG9ubHkgaGFuZGxlIHRoaXMgYW5kIGNhbGxpbmcgdGhlIEMKKwkgIGltcGxlbWVudGF0aW9uIGZvciB0aGUgcmVtYWluaW5nIHBhcnQgZG9lc24ndCB3b3JrIGJlY2F1c2UgaXQgbmVlZHMKKwkgIHByZXZpb3VzIGNhbGN1bGF0aW9ucy4KKworMjAwOC0wNy0xMyAxMDo1MjowMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjgvNTZdIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lLzogU29tZSBjbGVhbnVwLCB1c2UgM0ROT1cgaW5zdGVhZCBvZiBURE5PVyBpbiBtYWNyb3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5hc206CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWguYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aG1hY3Jvcy5oOgorCSAgU29tZSBjbGVhbnVwLCB1c2UgM0ROT1cgaW5zdGVhZCBvZiBURE5PVyBpbiBtYWNyb3MuCisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3RvbXNtb2NvbXBfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvVG9tc01vQ29tcEFsbC5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvdG9tc21vY29tcG1hY3Jvcy5oOgorCSAgVGhlIFNTRSBtZXRob2QgaW4gZmFjdCBvbmx5IG5lZWRzIE1NWEVYVCwgZGVjbGFyZSBpdCBhcyBzdWNoLgorCisyMDA4LTA3LTA4IDEzOjMxOjM3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAyNy81Nl0gRG9uJ3QgdXNlIGRlY2xhcmF0aW9ucyBhZnRlciBzdGF0ZW1lbnRzIGluIHRoZSByZW1haW5pbmcgY29kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc3BjL2dzdHNwYy5jOiAoc3BjX3NldHVwKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wVG9wLmluYzoKKwkgIERvbid0IHVzZSBkZWNsYXJhdGlvbnMgYWZ0ZXIgc3RhdGVtZW50cyBpbiB0aGUgcmVtYWluaW5nIGNvZGUuCisKKzIwMDgtMDctMDYgMjA6NDM6NTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDI2LzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwyLmluYzogTWFyayBpbnRlcm5hbCBwcm9jZXNzaW5nIGZ1bmN0aW9ucyBhcyBzdGF0aWMgaW5saW5lIGZvciBxdWl0ZSAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwyLmluYzoKKwkgIE1hcmsgaW50ZXJuYWwgcHJvY2Vzc2luZyBmdW5jdGlvbnMgYXMgc3RhdGljIGlubGluZSBmb3IgcXVpdGUgc29tZQorCSAgc3BlZWR1cCBhcyB0aGV5J3JlIHVzZWQgb25seSBvbmNlIGFuZCBuZWVkIHRvIGdldCBtYW55IGxvY2FsIHZhcmlhYmxlcworCSAgcGFzc2VkIGFzIHBhcmFtZXRlci4KKworMjAwOC0wNy0wNSAxOToyMDozMCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjUvNTZdIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLio6IENhbGwgdGhlIGN1cnJlbnQgaW5zdGFuY2UgInNlbGYiIGluc3RlYWQgb2YgIm9iamVjdCIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3NldF9tZXRob2QpLCAoZ3N0X2RlaW50ZXJsYWNlMl9pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3Jlc2V0X2hpc3RvcnkpLCAoZ3N0X2RlaW50ZXJsYWNlMl9yZXNldCksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9zZXRfcHJvcGVydHkpLCAoZ3N0X2RlaW50ZXJsYWNlMl9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9kZWludGVybGFjZTJfcG9wX2hpc3RvcnkpLCAoZ3N0X2RlaW50ZXJsYWNlMl9oZWFkX2hpc3RvcnkpLAorCSAgKGdzdF9kZWludGVybGFjZTJfcHVzaF9oaXN0b3J5KSwgKGdzdF9kZWludGVybGFjZTJfY2hhaW4pLAorCSAgKGdzdF9kZWludGVybGFjZTJfc2V0Y2FwcyksIChnc3RfZGVpbnRlcmxhY2UyX3NpbmtfZXZlbnQpLAorCSAgKGdzdF9kZWludGVybGFjZTJfY2hhbmdlX3N0YXRlKSwgKGdzdF9kZWludGVybGFjZTJfc3JjX2V2ZW50KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3NyY19xdWVyeSk6CisJICAqIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmg6CisJICBDYWxsIHRoZSBjdXJyZW50IGluc3RhbmNlICJzZWxmIiBpbnN0ZWFkIG9mICJvYmplY3QiLgorCisyMDA4LTA3LTA1IDE5OjExOjU2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAyNC81Nl0gZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuKjogSW5jbHVkZSBsYXRlbmN5IG9mIHRoZSBtZXRob2QgaW4gdGhlIHJldHVybmVkIGxhdGVuY3kuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dldF9sYXRlbmN5KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3NldF9tZXRob2QpLCAoZ3N0X2RlaW50ZXJsYWNlMl9jbGFzc19pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3B1c2hfaGlzdG9yeSksIChnc3RfZGVpbnRlcmxhY2UyX2NoYWluKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3NldGNhcHMpLCAoZ3N0X2RlaW50ZXJsYWNlMl9zcmNfcXVlcnkpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5oOgorCSAgSW5jbHVkZSBsYXRlbmN5IG9mIHRoZSBtZXRob2QgaW4gdGhlIHJldHVybmVkIGxhdGVuY3kuCisJICBGaXggb3V0cHV0dGluZyBvZiBhbGwgZmllbGRzLCBpLmUuIGRvdWJsaW5nIG9mIHRoZSBmcmFtZXJhdGUuCisKKzIwMDgtMDctMDUgMTY6NDc6MzIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDIzLzU2XSBnc3QvZGVpbnRlcmxhY2UyLzogVXNlIGEgR3N0T2JqZWN0IHN1YnR5cGUgZm9yIHRoZSBkZWludGVybGFjaW5nIG1ldGhvZHMgYW5kIGV4cG9ydCB0aGUgZGlmZmVyZW50IHNldHRpbmdzIGZvciBlYWNoIGQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOgorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfY2xhc3NfaW5pdCksIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2luaXQpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWUpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X2ZpZWxkc19yZXF1aXJlZCksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9tZXRob2RzX2dldF90eXBlKSwgKF9kb19pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3NldF9tZXRob2QpLCAoZ3N0X2RlaW50ZXJsYWNlMl9jbGFzc19pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2NoaWxkX3Byb3h5X2dldF9jaGlsZF9ieV9pbmRleCksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9jaGlsZF9wcm94eV9nZXRfY2hpbGRyZW5fY291bnQpLAorCSAgKGdzdF9kZWludGVybGFjZTJfY2hpbGRfcHJveHlfaW50ZXJmYWNlX2luaXQpLAorCSAgKGdzdF9kZWludGVybGFjZTJfaW5pdCksIChnc3RfZGVpbnRlcmxhY2UyX2ZpbmFsaXplKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2NoYWluKSwgKGdzdF9kZWludGVybGFjZTJfc3JjX3F1ZXJ5KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5LmM6CisJICAoZGVpbnRlcmxhY2VfZ3JlZWR5X3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChkZWludGVybGFjZV9ncmVlZHlfcGFja2VkNDIyX3NjYW5saW5lX21teCksCisJICAoZGVpbnRlcmxhY2VfZ3JlZWR5X3BhY2tlZDQyMl9zY2FubGluZV9tbXhleHQpLAorCSAgKGRlaW50ZXJsYWNlX2ZyYW1lX2RpX2dyZWVkeSksCisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfbF9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2xfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dyZWVkeV9sX2NsYXNzX2luaXQpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2xfaW5pdCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWguYXNtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmM6IChncmVlZHlEU2NhbGVyX0MpLAorCSAgKGRlaW50ZXJsYWNlX2ZyYW1lX2RpX2dyZWVkeWgpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2hfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dyZWVkeV9oX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfaF9jbGFzc19pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dyZWVkeV9oX2luaXQpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmg6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3BsdWdpbnMuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC5jOgorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfdG9tc21vY29tcF9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfdG9tc21vY29tcF9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfdG9tc21vY29tcF9jbGFzc19pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3RvbXNtb2NvbXBfaW5pdCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsLmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdmZpci5jOiAoZGVpbnRlcmxhY2VfZnJhbWVfdmZpciksCisJICAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF92ZmlyX2NsYXNzX2luaXQpLAorCSAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfdmZpcl9pbml0KToKKwkgIFVzZSBhIEdzdE9iamVjdCBzdWJ0eXBlIGZvciB0aGUgZGVpbnRlcmxhY2luZyBtZXRob2RzIGFuZCBleHBvcnQKKwkgIHRoZSBkaWZmZXJlbnQgc2V0dGluZ3MgZm9yIGVhY2ggZGVpbnRlcmxhY2luZyBtZXRob2QgdmlhIEdPYmplY3QKKwkgIHByb3BlcnRpZXMuCisJICBJbXBsZW1lbnQgR3N0Q2hpbGRQcm94eSBpbnRlcmZhY2UgdG8gYWxsb3cgYWNjZXNzIHRvIHRoZSB1c2VkCisJICBkZWludGVybGFjaW5nIG1ldGhvZCBhbmQgdG8gYWxsb3cgYWRqdXN0aW5nIHRoZSBkaWZmZXJlbnQgc2V0dGluZ3MuCisJICBNb3ZlIGdsb2JhbCB2YXJpYWJsZXMgb2YgdGhlIHRvbXNtb2NvbXAgZGVpbnRlcmxhY2luZyBtZXRob2QgaW50bworCSAgZnVuY3Rpb24gbG9jYWwgdmFyaWFibGVzIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gdXNlIHRoaXMgZGVpbnRlcmxhY2luZworCSAgbWV0aG9kIGZyb20gZGlmZmVyZW50IGluc3RhbmNlcy4KKworMjAwOC0wNy0wNSAxMjoyMjozNyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjIvNTZdIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWguYXNtOiBTdXBwb3J0IHdpZHRocyB0aGF0IGFyZSBub3QgYSBtdWx0aXBseSBvZiA0IHdoZW4gdXNpbmcgdGhlIGFzc2VtYmx5IG9wdGltaXplZCBnci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWguYXNtOgorCSAgU3VwcG9ydCB3aWR0aHMgdGhhdCBhcmUgbm90IGEgbXVsdGlwbHkgb2YgNCB3aGVuIHVzaW5nIHRoZSBhc3NlbWJseQorCSAgb3B0aW1pemVkIGdyZWVkeWggaW1wbGVtZW50YXRpb25zLgorCisyMDA4LTA3LTA0IDE4OjU0OjE1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAyMS81Nl0gZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5jOiBPbmx5IGJ1aWxkIHRoZSBhc3NlbWJseSBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb25zIG9uIHg4Ni4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmM6CisJICAoZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5aCk6CisJICBPbmx5IGJ1aWxkIHRoZSBhc3NlbWJseSBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb25zIG9uIHg4Ni4KKworMjAwOC0wNi0zMCAwNzo1MTowNyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjAvNTZdIGdzdC9kZWludGVybGFjZTIvOiBSZW1vdmUgdXNlbGVzcyBmaWxlIGFuZCBtYXJrIGV2ZXJ5dGhpbmcgcG9zc2libGUgYXMgc3RhdGljLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAuYzogKHRvbXNtb2NvbXBfaW5pdCksCisJICAodG9tc21vY29tcF9maWx0ZXJfbW14KSwgKHRvbXNtb2NvbXBfZmlsdGVyXzNkbm93KSwKKwkgICh0b21zbW9jb21wX2ZpbHRlcl9zc2UpLCAoZGVpbnRlcmxhY2VfZnJhbWVfZGlfdG9tc21vY29tcCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAuaDoKKwkgIFJlbW92ZSB1c2VsZXNzIGZpbGUgYW5kIG1hcmsgZXZlcnl0aGluZyBwb3NzaWJsZSBhcyBzdGF0aWMuCisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeS5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmM6CisJICBVc2UgIl9zdGRpbnQuaCIgaW5zdGVhZCBvZiA8c3RkaW50Lmg+LgorCisyMDA4LTA2LTI5IDEwOjU2OjQ3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxOS81Nl0gZ3N0L2RlaW50ZXJsYWNlMi86IEdldCByaWQgb2Ygc3BlZWR5LltjaF0gYXMgd2UgZG9uJ3QgdXNlIG1vc3Qgb2YgaXQncyBjb2RlIGFueXdheSBhbmQgaXQgZG9lc24ndCBzZWVtIHRvIGJlIHJlbGljZW5zLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzogKGdzdF9kZWludGVybGFjZTJfaW5pdCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeS5jOiAoZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5jOgorCSAgKGRlaW50ZXJsYWNlX2ZyYW1lX2RpX2dyZWVkeWgpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9zcGVlZHRvb2xzLmg6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3NwZWVkeS5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9zcGVlZHkuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC5jOiAoRmllbGRjb3B5KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsLmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdmZpci5jOiAoZGVpbnRlcmxhY2VfZnJhbWVfdmZpcik6CisJICBHZXQgcmlkIG9mIHNwZWVkeS5bY2hdIGFzIHdlIGRvbid0IHVzZSBtb3N0IG9mIGl0J3MgY29kZSBhbnl3YXkKKwkgIGFuZCBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgcmVsaWNlbnNlZCB0byBMR1BMLiBVc2UgbWVtY3B5KCkgaW5zdGVhZAorCSAgb2YgdGhlIHNwZWVkeSBtZW1jcHkgZXZlcnl3aGVyZSBpbnN0ZWFkLgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5oOgorCSAgUmVtb3ZlIG1hbnkgdW51c2VkIGRlY2xhcmF0aW9ucy4KKworMjAwOC0wNi0yOCAxODoxMzowOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMTgvNTZdIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmM6IERpdmlkZSBsYXRlbmN5IGJlIDIgdG8gY29udmVydCBmcm9tIGZpZWxkcyB0byBmcmFtZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzogKGdzdF9kZWludGVybGFjZTJfc3JjX3F1ZXJ5KToKKwkgIERpdmlkZSBsYXRlbmN5IGJlIDIgdG8gY29udmVydCBmcm9tIGZpZWxkcyB0byBmcmFtZXMuCisKKzIwMDgtMDYtMjggMTg6MTA6NTIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDE3LzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHkuYzogRG9uJ3QgdXNlIHNjYW5saW5lcyBmdW5jdGlvbiBmcm9tIGdzdGRlaW50ZXJsYWNlMiBhcyBpdCdzIG5vdCBhcHByb3BpYXRlIGZvciB0aGlzIG0uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHkuYzoKKwkgIChkZWludGVybGFjZV9ncmVlZHlfcGFja2VkNDIyX3NjYW5saW5lX2MpLAorCSAgKGRlaW50ZXJsYWNlX2dyZWVkeV9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14KSwKKwkgIChkZWludGVybGFjZV9ncmVlZHlfcGFja2VkNDIyX3NjYW5saW5lX21teGV4dCksCisJICAoZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5KToKKwkgIERvbid0IHVzZSBzY2FubGluZXMgZnVuY3Rpb24gZnJvbSBnc3RkZWludGVybGFjZTIgYXMgaXQncworCSAgbm90IGFwcHJvcGlhdGUgZm9yIHRoaXMgbWV0aG9kLiBJbnN0ZWFkIGltcGxlbWVudCBkZWludGVybGFjZV9mcmFtZQorCSAgZnVuY3Rpb24gYnkgdGFraW5nIHRoZSBvbmUgZnJvbSBncmVlZHloLgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmM6IChncmVlZHlEU2NhbGVyX0MpOgorCSAgU21hbGwgZml4IGZvciB0aGUgQyBpbXBsZW1lbnRhdGlvbi4KKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdmZpci5jOiAoZGVpbnRlcmxhY2VfZnJhbWVfdmZpcik6CisJICBEb24ndCB1c2UgdGhlIHNjYW5saW5lcyBmdW5jdGlvbiBmcm9tIGdzdGRlaW50ZXJsYWNlMiBhcyBpdCdzIG9ubHkKKwkgIHVzZWQgZm9yIHRoaXMgbWV0aG9kIGFuZCB3aWxsIGJlIHJlbW92ZWQuIEluc3RlYWQgaW1wbGVtZW50CisJICBkZWludGVybGFjZV9mcmFtZSBmdW5jdGlvbiBhbmQgbWFrZSBpdCBhIGJpdCBtb3JlIGVmZmljaWVudC4KKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2NsYXNzX2luaXQpLCAoZ3N0X2RlaW50ZXJsYWNlMl9zZXRfbWV0aG9kKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3B1c2hfaGlzdG9yeSksIChnc3RfZGVpbnRlcmxhY2UyX2NoYWluKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3NldGNhcHMpLCAoZ3N0X2RlaW50ZXJsYWNlMl9zaW5rX2V2ZW50KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2NoYW5nZV9zdGF0ZSksIChnc3RfZGVpbnRlcmxhY2UyX3NyY19ldmVudCksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9zcmNfcXVlcnkpOgorCSAgRml4IGNvZGluZyBzdHlsZSBhbmQgcmVtb3ZlIHNjYW5saW5lcyBmdW5jdGlvbiBhcyBpdCdzIHVudXNlZCBub3cuCisKKzIwMDgtMDYtMjggMTc6MjU6NTYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDE2LzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS86IEFkZCBhIEMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBncmVlZHloIGRlaW50ZXJsYWNpbmcgbWV0aG9kLCBjbGVhbiB1cCB0aGUgY29kZSBhIGJpdCBhbmQgbWEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmFzbToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5jOiAoZ3JlZWR5RFNjYWxlcl9DKSwKKwkgIChkZWludGVybGFjZV9mcmFtZV9kaV9ncmVlZHloKSwgKGRzY2FsZXJfZ3JlZWR5aF9nZXRfbWV0aG9kKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aG1hY3Jvcy5oOgorCSAgQWRkIGEgQyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGdyZWVkeWggZGVpbnRlcmxhY2luZyBtZXRob2QsIGNsZWFuCisJICB1cCB0aGUgY29kZSBhIGJpdCBhbmQgbWFyayB0aGUgU1NFIHZlcnNpb24gYXMgTU1YRVhUIGFzIGl0IGRvZXNuJ3QKKwkgIHJlcXVpcmUgYW55IFNTRSBpbnN0cnVjdGlvbnMuCisKKzIwMDgtMDYtMjcgMTM6MjI6MzQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDE1LzU2XSBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOiBJZiB3ZSdyZSBvdXRwdXR0aW5nIGFsbCBmaWVsZHMgdGhlIGZyYW1lcmF0ZSBoYXMgdG8gYmUgZG91YmxlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOgorCSAgKGdzdF9kZWludGVybGFjZTJfc2V0X3Byb3BlcnR5KSwgKGdzdF9kZWludGVybGFjZTJfY2hhaW4pLAorCSAgKGdzdF9kZWludGVybGFjZTJfc2V0Y2Fwcyk6CisJICBJZiB3ZSdyZSBvdXRwdXR0aW5nIGFsbCBmaWVsZHMgdGhlIGZyYW1lcmF0ZSBoYXMgdG8gYmUgZG91YmxlZC4KKwkgIFNldCBkdXJhdGlvbiBvbiB0aGUgb3V0Z29pbmcgYnVmZmVycy4KKworMjAwOC0wNi0yNSAxNjowNTowOCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgW01PVkVEIEZST00gQkFEIDE0LzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL3RvbXNtb2NvbXBtYWNyb3MuaDogUmVtb3ZlIHVubmVlZGVkIG1hY3JvcyB0aGF0IGJyZWFrIGJ1aWxkIG9uIG1hY29zeC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL3RvbXNtb2NvbXBtYWNyb3MuaDoKKwkgIFJlbW92ZSB1bm5lZWRlZCBtYWNyb3MgdGhhdCBicmVhayBidWlsZCBvbiBtYWNvc3guCisKKzIwMDgtMDYtMjQgMTI6MDg6NDcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDEzLzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHkuYzogT3B0aW1pemUgTU1YL01NWEVYVCBpbXBsZW1lbnRhdGlvbnMgYSBiaXQgYnkgcmVxdWlyaW5nIHR3byBsZXNzIG1lbW9yeSBhY2Nlc3NlcyBhbmQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHkuYzoKKwkgIChkZWludGVybGFjZV9ncmVlZHlfcGFja2VkNDIyX3NjYW5saW5lX21teCksCisJICAoZGVpbnRlcmxhY2VfZ3JlZWR5X3BhY2tlZDQyMl9zY2FubGluZV9tbXhleHQpOgorCSAgT3B0aW1pemUgTU1YL01NWEVYVCBpbXBsZW1lbnRhdGlvbnMgYSBiaXQgYnkgcmVxdWlyaW5nIHR3byBsZXNzCisJICBtZW1vcnkgYWNjZXNzZXMgYW5kIGZpeCB0aGUgd29ya2Fyb3VuZCBmb3IgdGhlIG1pc3NpbmcgcmlnaHQgc2hpZnQKKwkgIG9uIGJ5dGVzIHRvIHVuc2V0IHRoZSBoaWdoZXN0IGJpdCBvZiBldmVyeSBieXRlLgorCisyMDA4LTA2LTI0IDEwOjE1OjQxICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxMi81Nl0gZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5LmM6IFJlbW92ZSBzZmVuY2UgaW5zdHJ1Y3Rpb24gYXMgaXQncyBub3QgbmVlZGVkIGFuZCBhY3R1YWxseSBpcyBhbiBTU0UgaW5zdHJ1Y3Rpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5LmM6CisJICAoZGVpbnRlcmxhY2VfZ3JlZWR5X3BhY2tlZDQyMl9zY2FubGluZV9tbXhleHQpOgorCSAgUmVtb3ZlIHNmZW5jZSBpbnN0cnVjdGlvbiBhcyBpdCdzIG5vdCBuZWVkZWQgYW5kIGFjdHVhbGx5IGlzIGFuIFNTRQorCSAgaW5zdHJ1Y3Rpb24uCisKKzIwMDgtMDYtMjQgMTA6MTI6MDggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDExLzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHkuYzogQWRkIHBsYWluIE1NWCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGdyZWVkeWwgbWV0aG9kLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeS5jOgorCSAgKGRlaW50ZXJsYWNlX2dyZWVkeV9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14KSwKKwkgIChkZWludGVybGFjZV9ncmVlZHlfcGFja2VkNDIyX3NjYW5saW5lKToKKwkgIEFkZCBwbGFpbiBNTVggaW1wbGVtZW50YXRpb24gZm9yIHRoZSBncmVlZHlsIG1ldGhvZC4KKworMjAwOC0wNi0yNCAwOTo0MDowMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMTAvNTZdIGdzdC9kZWludGVybGFjZTIvTWFrZWZpbGUuYW06IE1vdmUgdGhlIGFzc2VtYmx5IGluY2x1ZGVzIHRvIG5vaW5zdF9IRUFERVJTIHdoZXJlIHRoZXkgYmVsb25nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvTWFrZWZpbGUuYW06CisJICBNb3ZlIHRoZSBhc3NlbWJseSBpbmNsdWRlcyB0byBub2luc3RfSEVBREVSUyB3aGVyZSB0aGV5IGJlbG9uZy4KKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdmZpci5jOiAoZGVpbnRlcmxhY2VfbGluZV9jKSwKKwkgIChkZWludGVybGFjZV9saW5lX21teCk6CisJICBGaXggQyBhbmQgTU1YIGltcGxlbWVudGF0aW9ucyBhIGJpdCBtb3JlLgorCisyMDA4LTA2LTI0IDA5OjEwOjQ2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwOS81Nl0gZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5LmM6IEZpeCB0aGUgQyBpbXBsZW1lbnRhdGlvbiB0byBwcm9kdWNlIGNvcnJlY3QgcmVzdWx0cyBhbmQgb3B0aW1pemUgdGhlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5LmM6CisJICAoZGVpbnRlcmxhY2VfZ3JlZWR5X3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChkZWludGVybGFjZV9ncmVlZHlfcGFja2VkNDIyX3NjYW5saW5lX21teGV4dCksCisJICAoZGVpbnRlcmxhY2VfZ3JlZWR5X3BhY2tlZDQyMl9zY2FubGluZSk6CisJICBGaXggdGhlIEMgaW1wbGVtZW50YXRpb24gdG8gcHJvZHVjZSBjb3JyZWN0IHJlc3VsdHMgYW5kIG9wdGltaXplIHRoZQorCSAgTU1YRVhUIGltcGxlbWVudGF0aW9uLgorCSAgSGFuZGxlIG9kZCB3aWR0aHMgYW5kIGRvbid0IHJlYWQgb3ZlciBhcnJheSBib3VuZGFyaWVzIGluIHRoZSBNTVhFWFQKKwkgIGltcGxlbWVudGF0aW9uLgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS92ZmlyLmM6IChkZWludGVybGFjZV9saW5lX2MpLAorCSAgKGRlaW50ZXJsYWNlX2xpbmVfbW14KSwgKGRlaW50ZXJsYWNlX3NjYW5saW5lX3ZmaXIpOgorCSAgRml4IGEgc21hbGwgcm91bmRpbmcgYnVnIGluIHRoZSBNTVggaW1wbGVtZW50YXRpb24sIHRoZSBNTVgKKwkgIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgYWN0dWFsbHkgbmVlZCBNTVhFWFQgaW5zdHJ1Y3Rpb25zIHNvIGRvbid0IG1hcmsKKwkgIGl0IGFzIHN1Y2guCisJICBIYW5kbGUgb2RkIHdpZHRocyBpbiBib3RoIGltcGxlbWVudGF0aW9ucy4KKworMjAwOC0wNi0yMSAwOTowNTowMCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMDgvNTZdIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeS5jOiBJbXBsZW1lbnQgYSBDIHZlcnNpb24gb2YgdGhlIGdyZWVkeSBsb3cgbW90aW9uIGFsZ29yaXRobSBhbmQgbWFyayB0aGUgYXNzZW1ibHkgb3B0aS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeS5jOgorCSAgKGRlaW50ZXJsYWNlX2dyZWVkeV9wYWNrZWQ0MjJfc2NhbmxpbmVfc3NlKSwKKwkgIChkZWludGVybGFjZV9ncmVlZHlfcGFja2VkNDIyX3NjYW5saW5lX2MpLAorCSAgKGRlaW50ZXJsYWNlX2dyZWVkeV9wYWNrZWQ0MjJfc2NhbmxpbmUpOgorCSAgSW1wbGVtZW50IGEgQyB2ZXJzaW9uIG9mIHRoZSBncmVlZHkgbG93IG1vdGlvbiBhbGdvcml0aG0gYW5kIG1hcmsgdGhlCisJICBhc3NlbWJseSBvcHRpbWl6ZWQgdmVyc2lvbiBhcyBTU0UgYXMgaXQgdXNlcyBTU0UgaW5zdHJ1Y3Rpb25zCisJICBhZGRpdGlvbmFsIHRvIE1NWCBpbnN0cnVjdGlvbnMuCisKKzIwMDgtMDYtMjAgMTQ6NDg6NDAgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDA3LzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS92ZmlyLmM6IE1ha2UgaXQgcG9zc2libGUgdG8gdXNlIHRoZSB2ZmlyIG1ldGhvZCBvbiBYODYgQ1BVcyB3aXRob3V0IE1NWEVYVCB0b28gYnV0IHVzZSB0aGUgTU0uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS92ZmlyLmM6IChkZWludGVybGFjZV9saW5lX21teGV4dCksCisJICAoZGVpbnRlcmxhY2VfbGluZV9jKSwgKGRlaW50ZXJsYWNlX3NjYW5saW5lX3ZmaXIpOgorCSAgTWFrZSBpdCBwb3NzaWJsZSB0byB1c2UgdGhlIHZmaXIgbWV0aG9kIG9uIFg4NiBDUFVzIHdpdGhvdXQgTU1YRVhUIHRvbworCSAgYnV0IHVzZSB0aGUgTU1YRVhUIG9wdGltaXplZCBjb2RlIHdoZW5ldmVyIHBvc3NpYmxlLgorCisyMDA4LTA2LTIwIDE0OjM1OjI1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNi81Nl0gZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuKjogUmVzZXQgZWxlbWVudCBzdGF0ZSBvbiBQQVVTRUQtPlJFQURZIHByb3Blcmx5LCBkb24ndCBsZWFrIGFueSBidWZmZXJzIHdoZW4gZmluYWxpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuYzoKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2NsYXNzX2luaXQpLCAoZ3N0X2RlaW50ZXJsYWNlMl9pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3Jlc2V0X2hpc3RvcnkpLCAoZ3N0X2RlaW50ZXJsYWNlMl9yZXNldCksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9maW5hbGl6ZSksIChnc3RfZGVpbnRlcmxhY2UyX2NoYWluKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3NpbmtfZXZlbnQpLCAoZ3N0X2RlaW50ZXJsYWNlMl9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9kZWludGVybGFjZTJfc3JjX3F1ZXJ5KToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuaDoKKwkgIFJlc2V0IGVsZW1lbnQgc3RhdGUgb24gUEFVU0VELT5SRUFEWSBwcm9wZXJseSwgZG9uJ3QgbGVhayBhbnkgYnVmZmVycworCSAgd2hlbiBmaW5hbGl6aW5nLCBhbGxvY2F0ZSBidWZmZXJzIHdpdGggZ3N0X3BhZF9hbGxvY19idWZmZXIoKSBhbmQKKwkgIHByb3Blcmx5IHJldHVybiBmbG93IHJldHVybnMgZnJvbSBnc3RfcGFkX3B1c2goKSBpbnN0ZWFkIG9mIGlnbm9yaW5nIHRoZW0uCisKKzIwMDgtMDYtMjAgMTM6NDU6MDggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDA1LzU2XSBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL3RvbXNtb2NvbXBtYWNyb3MuaDogQWRkIG1pc3NpbmcgaGVhZGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvdG9tc21vY29tcG1hY3Jvcy5oOgorCSAgQWRkIG1pc3NpbmcgaGVhZGVyLgorCisyMDA4LTA2LTIwIDEzOjI0OjI5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwNC81Nl0gRml4IGNvbXBpbGF0aW9uIG9uIGdlbmVyaWMgeDg2L2FtZDY0IGFuZCBpbmNsdWRlIGRlaW50ZXJsYWNlMiBpbiB0aGUgYnVpbGQgc3lzdGVtLiBCZWNhdXNlIG9mIHNldmVyYWwgYnVncyBpdCdzIHN0aWxsLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmFzbToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wQm90dG9tLmluYzoKKwkgIEZpeCBjb21waWxhdGlvbiBvbiBnZW5lcmljIHg4Ni9hbWQ2NCBhbmQgaW5jbHVkZSBkZWludGVybGFjZTIgaW4gdGhlCisJICBidWlsZCBzeXN0ZW0uIEJlY2F1c2Ugb2Ygc2V2ZXJhbCBidWdzIGl0J3Mgc3RpbGwgZW5hYmxlZCBvbmx5CisJICBieSAtLWVuYWJsZS1leHBlcmltZW50YWwuCisKKzIwMDgtMDYtMTggMDY6MzE6MTMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgW01PVkVEIEZST00gQkFEIDAzLzU2XSBGaXggZ3RrLWRvYyB3YXJuaW5ncy4gQWxzbyBkb24ndCBtaXN1c2UgYXBpLWRvYyBjb21tZW50cyBmb3Igbm9ybWFsIGNvbW1lbnRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGV4YW1wbGVzL2FwcC9hcHBzcmMtcmEuYzoKKwkgICogZXhhbXBsZXMvYXBwL2FwcHNyYy1zZWVrYWJsZS5jOgorCSAgKiBleGFtcGxlcy9hcHAvYXBwc3JjLXN0cmVhbS5jOgorCSAgKiBleGFtcGxlcy9hcHAvYXBwc3JjLXN0cmVhbTIuYzoKKwkgICogZXh0L2RpcmVjdGZiL2RmYnZpZGVvc2luay5oOgorCSAgKiBleHQvbWV0YWRhdGEvZ3N0YmFzZW1ldGFkYXRhLmM6CisJICAqIGV4dC9tZXRhZGF0YS9nc3RiYXNlbWV0YWRhdGEuaDoKKwkgICogZXh0L21ldGFkYXRhL21ldGFkYXRhLmM6CisJICAqIGV4dC9tZXRhZGF0YS9tZXRhZGF0YWV4aWYuYzoKKwkgICogZXh0L3RoZW9yYS90aGVvcmFkZWMuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi9nc3RkZWludGVybGFjZTIuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvc3BlZWR5LmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3NwZWVkeS5oOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS92ZmlyLmM6CisJICBGaXggZ3RrLWRvYyB3YXJuaW5ncy4gQWxzbyBkb24ndCBtaXN1c2UgYXBpLWRvYyBjb21tZW50cyBmb3Igbm9ybWFsCisJICBjb21tZW50cy4KKworMjAwOC0wNi0xMSAxMToxMjo0OSArMDAwMCAgTWFydGluIEVpa2VybWFubiA8bWVpa2VyQHVwYi5kZT4KKworCSAgW01PVkVEIEZST00gQkFEIDAyLzU2XSBnc3QvZGVpbnRlcmxhY2UyLzogQWRkIGEgZGVpbnRlcmxhY2VyIHBsdWdpbiBiYXNlZCBvbiB0aGUgdHZ0aW1lL0RTY2FsZXIgZGVpbnRlcmxhY2VyLCB3aGljaCB3YXMgcmVsaWNlbnNlZCB0byBMR1BMIGYuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gYSBwYXRjaCBieTogTWFydGluIEVpa2VybWFubiA8bWVpa2VyIGF0IHVwYiBkb3QgZGU+CisJICAqIGdzdC9kZWludGVybGFjZTIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmM6CisJICAoZ3N0X2RlaW50ZXJsYWNlMl9tZXRob2RfZ2V0X3R5cGUpLAorCSAgKGdzdF9kZWludGVybGFjZTJfZmllbGRzX2dldF90eXBlKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2ZpZWxkX2xheW91dF9nZXRfdHlwZSksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9iYXNlX2luaXQpLCAoZ3N0X2RlaW50ZXJsYWNlMl9jbGFzc19pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2luaXQpLCAoZ3N0X2RlaW50ZXJsYWNlMl9zZXRfbWV0aG9kKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3NldF9wcm9wZXJ0eSksIChnc3RfZGVpbnRlcmxhY2UyX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9maW5hbGl6ZSksIChnc3RfZGVpbnRlcmxhY2UyX3BvcF9oaXN0b3J5KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2hlYWRfaGlzdG9yeSksIChnc3RfZGVpbnRlcmxhY2UyX3B1c2hfaGlzdG9yeSksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9kZWludGVybGFjZV9zY2FubGluZXMpLCAoZ3N0X2RlaW50ZXJsYWNlMl9jaGFpbiksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9zZXRjYXBzKSwgKGdzdF9kZWludGVybGFjZTJfc2lua19ldmVudCksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X2RlaW50ZXJsYWNlMl9zcmNfZXZlbnQpLAorCSAgKGdzdF9kZWludGVybGFjZTJfc3JjX3F1ZXJ5KSwgKGdzdF9kZWludGVybGFjZTJfc3JjX3F1ZXJ5X3R5cGVzKSwKKwkgIChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvZ3N0ZGVpbnRlcmxhY2UyLmg6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeS5jOiAoY29weV9zY2FubGluZSksCisJICAoZGVpbnRlcmxhY2VfZ3JlZWR5X3BhY2tlZDQyMl9zY2FubGluZV9tbXhleHQpLAorCSAgKGRzY2FsZXJfZ3JlZWR5bF9nZXRfbWV0aG9kKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5hc206CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWguYzoKKwkgIChkZWludGVybGFjZV9mcmFtZV9kaV9ncmVlZHloKSwgKGRzY2FsZXJfZ3JlZWR5aF9nZXRfbWV0aG9kKSwKKwkgIChncmVlZHloX2luaXQpLCAoZ3JlZWR5aF9maWx0ZXJfbW14KSwgKGdyZWVkeWhfZmlsdGVyXzNkbm93KSwKKwkgIChncmVlZHloX2ZpbHRlcl9zc2UpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmg6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWhtYWNyb3MuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvbW14Lmg6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3BsdWdpbnMuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvc3BlZWR0b29scy5oOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9zcGVlZHkuYzogKG11bHRpcGx5X2FscGhhKSwgKGNsaXAyNTUpLAorCSAgKGNvbWJfZmFjdG9yX3BhY2tlZDQyMl9zY2FubGluZV9tbXgpLAorCSAgKGRpZmZfZmFjdG9yX3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChkaWZmX2ZhY3Rvcl9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14KSwKKwkgIChkaWZmX3BhY2tlZDQyMl9ibG9jazh4OF9tbXgpLCAoZGlmZl9wYWNrZWQ0MjJfYmxvY2s4eDhfYyksCisJICAocGFja2VkNDQ0X3RvX3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChwYWNrZWQ0MjJfdG9fcGFja2VkNDQ0X3NjYW5saW5lX2MpLAorCSAgKHBhY2tlZDQyMl90b19wYWNrZWQ0NDRfcmVjNjAxX3NjYW5saW5lX2MpLAorCSAgKHZmaWx0ZXJfY2hyb21hXzEyMV9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14KSwKKwkgICh2ZmlsdGVyX2Nocm9tYV8xMjFfcGFja2VkNDIyX3NjYW5saW5lX2MpLAorCSAgKHZmaWx0ZXJfY2hyb21hXzMzMl9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14KSwKKwkgICh2ZmlsdGVyX2Nocm9tYV8zMzJfcGFja2VkNDIyX3NjYW5saW5lX2MpLAorCSAgKGtpbGxfY2hyb21hX3BhY2tlZDQyMl9pbnBsYWNlX3NjYW5saW5lX21teCksCisJICAoa2lsbF9jaHJvbWFfcGFja2VkNDIyX2lucGxhY2Vfc2NhbmxpbmVfYyksCisJICAoaW52ZXJ0X2NvbG91cl9wYWNrZWQ0MjJfaW5wbGFjZV9zY2FubGluZV9tbXgpLAorCSAgKGludmVydF9jb2xvdXJfcGFja2VkNDIyX2lucGxhY2Vfc2NhbmxpbmVfYyksCisJICAobWlycm9yX3BhY2tlZDQyMl9pbnBsYWNlX3NjYW5saW5lX2MpLAorCSAgKGludGVycG9sYXRlX3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChjb252ZXJ0X3V5dnlfdG9feXV5dl9zY2FubGluZV9tbXgpLAorCSAgKGNvbnZlcnRfdXl2eV90b195dXl2X3NjYW5saW5lX2MpLAorCSAgKGludGVycG9sYXRlX3BhY2tlZDQyMl9zY2FubGluZV9tbXgpLAorCSAgKGludGVycG9sYXRlX3BhY2tlZDQyMl9zY2FubGluZV9tbXhleHQpLAorCSAgKGJsaXRfY29sb3VyX3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChibGl0X2NvbG91cl9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14KSwKKwkgIChibGl0X2NvbG91cl9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14ZXh0KSwKKwkgIChibGl0X2NvbG91cl9wYWNrZWQ0NDQ0X3NjYW5saW5lX2MpLAorCSAgKGJsaXRfY29sb3VyX3BhY2tlZDQ0NDRfc2NhbmxpbmVfbW14KSwKKwkgIChibGl0X2NvbG91cl9wYWNrZWQ0NDQ0X3NjYW5saW5lX21teGV4dCksIChzbWFsbF9tZW1jcHkpLAorCSAgKHNwZWVkeV9tZW1jcHlfYyksIChzcGVlZHlfbWVtY3B5X21teCksIChzcGVlZHlfbWVtY3B5X21teGV4dCksCisJICAoYmxpdF9wYWNrZWQ0MjJfc2NhbmxpbmVfYyksIChibGl0X3BhY2tlZDQyMl9zY2FubGluZV9tbXgpLAorCSAgKGJsaXRfcGFja2VkNDIyX3NjYW5saW5lX21teGV4dCksCisJICAoY29tcG9zaXRlX2NvbG91cjQ0NDRfYWxwaGFfdG9fcGFja2VkNDIyX3NjYW5saW5lX2MpLAorCSAgKGNvbXBvc2l0ZV9jb2xvdXI0NDQ0X2FscGhhX3RvX3BhY2tlZDQyMl9zY2FubGluZV9tbXhleHQpLAorCSAgKGNvbXBvc2l0ZV9wYWNrZWQ0NDQ0X2FscGhhX3RvX3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChjb21wb3NpdGVfcGFja2VkNDQ0NF9hbHBoYV90b19wYWNrZWQ0MjJfc2NhbmxpbmVfbW14ZXh0KSwKKwkgIChjb21wb3NpdGVfcGFja2VkNDQ0NF90b19wYWNrZWQ0MjJfc2NhbmxpbmVfYyksCisJICAoY29tcG9zaXRlX3BhY2tlZDQ0NDRfdG9fcGFja2VkNDIyX3NjYW5saW5lX21teGV4dCksCisJICAoY29tcG9zaXRlX2FscGhhbWFza190b19wYWNrZWQ0NDQ0X3NjYW5saW5lX2MpLAorCSAgKGNvbXBvc2l0ZV9hbHBoYW1hc2tfdG9fcGFja2VkNDQ0NF9zY2FubGluZV9tbXhleHQpLAorCSAgKGNvbXBvc2l0ZV9hbHBoYW1hc2tfYWxwaGFfdG9fcGFja2VkNDQ0NF9zY2FubGluZV9jKSwKKwkgIChwcmVtdWx0aXBseV9wYWNrZWQ0NDQ0X3NjYW5saW5lX2MpLAorCSAgKHByZW11bHRpcGx5X3BhY2tlZDQ0NDRfc2NhbmxpbmVfbW14ZXh0KSwKKwkgIChibGVuZF9wYWNrZWQ0MjJfc2NhbmxpbmVfYyksIChibGVuZF9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14ZXh0KSwKKwkgIChxdWFydGVyX2JsaXRfdmVydGljYWxfcGFja2VkNDIyX3NjYW5saW5lX21teGV4dCksCisJICAocXVhcnRlcl9ibGl0X3ZlcnRpY2FsX3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChzdWJwaXhfYmxpdF92ZXJ0aWNhbF9wYWNrZWQ0MjJfc2NhbmxpbmVfYyksCisJICAoYThfc3VicGl4X2JsaXRfc2NhbmxpbmVfYyksIChteXJvdW5kKSwgKGluaXRfUkdCX3RvX1lDYkNyX3RhYmxlcyksCisJICAoaW5pdF9ZQ2JDcl90b19SR0JfdGFibGVzKSwgKHJnYjI0X3RvX3BhY2tlZDQ0NF9yZWM2MDFfc2NhbmxpbmVfYyksCisJICAocmdiYTMyX3RvX3BhY2tlZDQ0NDRfcmVjNjAxX3NjYW5saW5lX2MpLAorCSAgKHBhY2tlZDQ0NF90b19yZ2IyNF9yZWM2MDFfc2NhbmxpbmVfYyksCisJICAocGFja2VkNDQ0X3RvX25vbnByZW11bHRpcGxpZWRfcGFja2VkNDQ0NF9zY2FubGluZV9jKSwKKwkgIChhc3BlY3RfYWRqdXN0X3BhY2tlZDQ0NDRfc2NhbmxpbmVfYyksIChzZXR1cF9zcGVlZHlfY2FsbHMpLAorCSAgKHNwZWVkeV9nZXRfYWNjZWwpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9zcGVlZHkuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvc3NlLmg6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAuYzogKEZpZWxkY29weSksCisJICAoZGVpbnRlcmxhY2VfZnJhbWVfZGlfdG9tc21vY29tcCksIChkc2NhbGVyX3RvbXNtb2NvbXBfZ2V0X21ldGhvZCksCisJICAodG9tc21vY29tcF9pbml0KSwgKHRvbXNtb2NvbXBfZmlsdGVyX21teCksCisJICAodG9tc21vY29tcF9maWx0ZXJfM2Rub3cpLCAodG9tc21vY29tcF9maWx0ZXJfc3NlKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC5oOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3AwQS5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEJvdHRvbS5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEVkZ2VBLmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wRWRnZUE4LmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wT2RkQS5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEEyLmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wT2RkQTYuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBSC5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEFIMi5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFRvcC5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFZBLmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wVkFILmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9TdHJhbmdlQm9iLmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsLmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsMi5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvV2llcmRCb2IuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS92ZmlyLmM6IChkZWludGVybGFjZV9saW5lKSwKKwkgIChkZWludGVybGFjZV9zY2FubGluZV92ZmlyKSwgKGNvcHlfc2NhbmxpbmUpLAorCSAgKGRzY2FsZXJfdmZpcl9nZXRfbWV0aG9kKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUveDg2LTY0X21hY3Jvcy5pbmM6CisJICBBZGQgYSBkZWludGVybGFjZXIgcGx1Z2luIGJhc2VkIG9uIHRoZSB0dnRpbWUvRFNjYWxlciBkZWludGVybGFjZXIsCisJICB3aGljaCB3YXMgcmVsaWNlbnNlZCB0byBMR1BMIGZvciBHU3RyZWFtZXIgYW5kIGluIHRoZW9yeSBwcm92aWRlcworCSAgYmV0dGVyIGFuZCBmYXN0ZXIgcmVzdWx0cyB0aGFuIHRoZSBzaW1wbGUgZGVpbnRlcmxhY2UgZWxlbWVudC4KKwkgIEZpeGVzIGJ1ZyAjMTYzNTc4LgorCSAgUG9ydGVkIHRvIEdTdHJlYW1lciAwLjEwIGJ1dCBzdGlsbCBub3QgZW5hYmxlZCBvciBpbmNsdWRlZCBpbiB0aGUKKwkgIGJ1aWxkIHN5c3RlbSBieSBkZWZhdWx0IGJlY2F1c2Ugb2YgYmFkIGFydGVmYWN0cyBjYXVzZWQgYnkgYSBidWcKKwkgIHNvbWV3aGVyZSBhbmQgYXMgaXQgY2FuIGJlIG9ubHkgYnVpbGQgb24geDg2L2FtZDY0IEFUTSBhbmQgcmVxdWlyZXMKKwkgIHNwZWNpYWwgQ0ZMQUdTLiBXaWxsIGJlIGZpeGVkIHNvb24uCisKKzIwMDgtMDYtMTEgMTE6MTI6MTQgKzAwMDAgIE1hcnRpbiBFaWtlcm1hbm4gPG1laWtlckB1cGIuZGU+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMS81Nl0gZ3N0L2RlaW50ZXJsYWNlMi86IEFkZCBhIGRlaW50ZXJsYWNlciBwbHVnaW4gYmFzZWQgb24gdGhlIHR2dGltZS9EU2NhbGVyIGRlaW50ZXJsYWNlciwgd2hpY2ggd2FzIHJlbGljZW5zZWQgdG8gTEdQTCBmLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJhc2VkIG9uIGEgcGF0Y2ggYnk6IE1hcnRpbiBFaWtlcm1hbm4gPG1laWtlciBhdCB1cGIgZG90IGRlPgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5jOgorCSAgKGdzdF9kZWludGVybGFjZTJfbWV0aG9kX2dldF90eXBlKSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX2ZpZWxkc19nZXRfdHlwZSksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9maWVsZF9sYXlvdXRfZ2V0X3R5cGUpLAorCSAgKGdzdF9kZWludGVybGFjZTJfYmFzZV9pbml0KSwgKGdzdF9kZWludGVybGFjZTJfY2xhc3NfaW5pdCksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9pbml0KSwgKGdzdF9kZWludGVybGFjZTJfc2V0X21ldGhvZCksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9zZXRfcHJvcGVydHkpLCAoZ3N0X2RlaW50ZXJsYWNlMl9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9kZWludGVybGFjZTJfZmluYWxpemUpLCAoZ3N0X2RlaW50ZXJsYWNlMl9wb3BfaGlzdG9yeSksCisJICAoZ3N0X2RlaW50ZXJsYWNlMl9oZWFkX2hpc3RvcnkpLCAoZ3N0X2RlaW50ZXJsYWNlMl9wdXNoX2hpc3RvcnkpLAorCSAgKGdzdF9kZWludGVybGFjZTJfZGVpbnRlcmxhY2Vfc2NhbmxpbmVzKSwgKGdzdF9kZWludGVybGFjZTJfY2hhaW4pLAorCSAgKGdzdF9kZWludGVybGFjZTJfc2V0Y2FwcyksIChnc3RfZGVpbnRlcmxhY2UyX3NpbmtfZXZlbnQpLAorCSAgKGdzdF9kZWludGVybGFjZTJfY2hhbmdlX3N0YXRlKSwgKGdzdF9kZWludGVybGFjZTJfc3JjX2V2ZW50KSwKKwkgIChnc3RfZGVpbnRlcmxhY2UyX3NyY19xdWVyeSksIChnc3RfZGVpbnRlcmxhY2UyX3NyY19xdWVyeV90eXBlcyksCisJICAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL2dzdGRlaW50ZXJsYWNlMi5oOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHkuYzogKGNvcHlfc2NhbmxpbmUpLAorCSAgKGRlaW50ZXJsYWNlX2dyZWVkeV9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14ZXh0KSwKKwkgIChkc2NhbGVyX2dyZWVkeWxfZ2V0X21ldGhvZCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL2dyZWVkeWguYXNtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHloLmM6CisJICAoZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5aCksIChkc2NhbGVyX2dyZWVkeWhfZ2V0X21ldGhvZCksCisJICAoZ3JlZWR5aF9pbml0KSwgKGdyZWVkeWhfZmlsdGVyX21teCksIChncmVlZHloX2ZpbHRlcl8zZG5vdyksCisJICAoZ3JlZWR5aF9maWx0ZXJfc3NlKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvZ3JlZWR5aC5oOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9ncmVlZHlobWFjcm9zLmg6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL21teC5oOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS9wbHVnaW5zLmg6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3NwZWVkdG9vbHMuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvc3BlZWR5LmM6IChtdWx0aXBseV9hbHBoYSksIChjbGlwMjU1KSwKKwkgIChjb21iX2ZhY3Rvcl9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14KSwKKwkgIChkaWZmX2ZhY3Rvcl9wYWNrZWQ0MjJfc2NhbmxpbmVfYyksCisJICAoZGlmZl9mYWN0b3JfcGFja2VkNDIyX3NjYW5saW5lX21teCksCisJICAoZGlmZl9wYWNrZWQ0MjJfYmxvY2s4eDhfbW14KSwgKGRpZmZfcGFja2VkNDIyX2Jsb2NrOHg4X2MpLAorCSAgKHBhY2tlZDQ0NF90b19wYWNrZWQ0MjJfc2NhbmxpbmVfYyksCisJICAocGFja2VkNDIyX3RvX3BhY2tlZDQ0NF9zY2FubGluZV9jKSwKKwkgIChwYWNrZWQ0MjJfdG9fcGFja2VkNDQ0X3JlYzYwMV9zY2FubGluZV9jKSwKKwkgICh2ZmlsdGVyX2Nocm9tYV8xMjFfcGFja2VkNDIyX3NjYW5saW5lX21teCksCisJICAodmZpbHRlcl9jaHJvbWFfMTIxX3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgICh2ZmlsdGVyX2Nocm9tYV8zMzJfcGFja2VkNDIyX3NjYW5saW5lX21teCksCisJICAodmZpbHRlcl9jaHJvbWFfMzMyX3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChraWxsX2Nocm9tYV9wYWNrZWQ0MjJfaW5wbGFjZV9zY2FubGluZV9tbXgpLAorCSAgKGtpbGxfY2hyb21hX3BhY2tlZDQyMl9pbnBsYWNlX3NjYW5saW5lX2MpLAorCSAgKGludmVydF9jb2xvdXJfcGFja2VkNDIyX2lucGxhY2Vfc2NhbmxpbmVfbW14KSwKKwkgIChpbnZlcnRfY29sb3VyX3BhY2tlZDQyMl9pbnBsYWNlX3NjYW5saW5lX2MpLAorCSAgKG1pcnJvcl9wYWNrZWQ0MjJfaW5wbGFjZV9zY2FubGluZV9jKSwKKwkgIChpbnRlcnBvbGF0ZV9wYWNrZWQ0MjJfc2NhbmxpbmVfYyksCisJICAoY29udmVydF91eXZ5X3RvX3l1eXZfc2NhbmxpbmVfbW14KSwKKwkgIChjb252ZXJ0X3V5dnlfdG9feXV5dl9zY2FubGluZV9jKSwKKwkgIChpbnRlcnBvbGF0ZV9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14KSwKKwkgIChpbnRlcnBvbGF0ZV9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14ZXh0KSwKKwkgIChibGl0X2NvbG91cl9wYWNrZWQ0MjJfc2NhbmxpbmVfYyksCisJICAoYmxpdF9jb2xvdXJfcGFja2VkNDIyX3NjYW5saW5lX21teCksCisJICAoYmxpdF9jb2xvdXJfcGFja2VkNDIyX3NjYW5saW5lX21teGV4dCksCisJICAoYmxpdF9jb2xvdXJfcGFja2VkNDQ0NF9zY2FubGluZV9jKSwKKwkgIChibGl0X2NvbG91cl9wYWNrZWQ0NDQ0X3NjYW5saW5lX21teCksCisJICAoYmxpdF9jb2xvdXJfcGFja2VkNDQ0NF9zY2FubGluZV9tbXhleHQpLCAoc21hbGxfbWVtY3B5KSwKKwkgIChzcGVlZHlfbWVtY3B5X2MpLCAoc3BlZWR5X21lbWNweV9tbXgpLCAoc3BlZWR5X21lbWNweV9tbXhleHQpLAorCSAgKGJsaXRfcGFja2VkNDIyX3NjYW5saW5lX2MpLCAoYmxpdF9wYWNrZWQ0MjJfc2NhbmxpbmVfbW14KSwKKwkgIChibGl0X3BhY2tlZDQyMl9zY2FubGluZV9tbXhleHQpLAorCSAgKGNvbXBvc2l0ZV9jb2xvdXI0NDQ0X2FscGhhX3RvX3BhY2tlZDQyMl9zY2FubGluZV9jKSwKKwkgIChjb21wb3NpdGVfY29sb3VyNDQ0NF9hbHBoYV90b19wYWNrZWQ0MjJfc2NhbmxpbmVfbW14ZXh0KSwKKwkgIChjb21wb3NpdGVfcGFja2VkNDQ0NF9hbHBoYV90b19wYWNrZWQ0MjJfc2NhbmxpbmVfYyksCisJICAoY29tcG9zaXRlX3BhY2tlZDQ0NDRfYWxwaGFfdG9fcGFja2VkNDIyX3NjYW5saW5lX21teGV4dCksCisJICAoY29tcG9zaXRlX3BhY2tlZDQ0NDRfdG9fcGFja2VkNDIyX3NjYW5saW5lX2MpLAorCSAgKGNvbXBvc2l0ZV9wYWNrZWQ0NDQ0X3RvX3BhY2tlZDQyMl9zY2FubGluZV9tbXhleHQpLAorCSAgKGNvbXBvc2l0ZV9hbHBoYW1hc2tfdG9fcGFja2VkNDQ0NF9zY2FubGluZV9jKSwKKwkgIChjb21wb3NpdGVfYWxwaGFtYXNrX3RvX3BhY2tlZDQ0NDRfc2NhbmxpbmVfbW14ZXh0KSwKKwkgIChjb21wb3NpdGVfYWxwaGFtYXNrX2FscGhhX3RvX3BhY2tlZDQ0NDRfc2NhbmxpbmVfYyksCisJICAocHJlbXVsdGlwbHlfcGFja2VkNDQ0NF9zY2FubGluZV9jKSwKKwkgIChwcmVtdWx0aXBseV9wYWNrZWQ0NDQ0X3NjYW5saW5lX21teGV4dCksCisJICAoYmxlbmRfcGFja2VkNDIyX3NjYW5saW5lX2MpLCAoYmxlbmRfcGFja2VkNDIyX3NjYW5saW5lX21teGV4dCksCisJICAocXVhcnRlcl9ibGl0X3ZlcnRpY2FsX3BhY2tlZDQyMl9zY2FubGluZV9tbXhleHQpLAorCSAgKHF1YXJ0ZXJfYmxpdF92ZXJ0aWNhbF9wYWNrZWQ0MjJfc2NhbmxpbmVfYyksCisJICAoc3VicGl4X2JsaXRfdmVydGljYWxfcGFja2VkNDIyX3NjYW5saW5lX2MpLAorCSAgKGE4X3N1YnBpeF9ibGl0X3NjYW5saW5lX2MpLCAobXlyb3VuZCksIChpbml0X1JHQl90b19ZQ2JDcl90YWJsZXMpLAorCSAgKGluaXRfWUNiQ3JfdG9fUkdCX3RhYmxlcyksIChyZ2IyNF90b19wYWNrZWQ0NDRfcmVjNjAxX3NjYW5saW5lX2MpLAorCSAgKHJnYmEzMl90b19wYWNrZWQ0NDQ0X3JlYzYwMV9zY2FubGluZV9jKSwKKwkgIChwYWNrZWQ0NDRfdG9fcmdiMjRfcmVjNjAxX3NjYW5saW5lX2MpLAorCSAgKHBhY2tlZDQ0NF90b19ub25wcmVtdWx0aXBsaWVkX3BhY2tlZDQ0NDRfc2NhbmxpbmVfYyksCisJICAoYXNwZWN0X2FkanVzdF9wYWNrZWQ0NDQ0X3NjYW5saW5lX2MpLCAoc2V0dXBfc3BlZWR5X2NhbGxzKSwKKwkgIChzcGVlZHlfZ2V0X2FjY2VsKToKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvc3BlZWR5Lmg6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3NzZS5oOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wLmM6IChGaWVsZGNvcHkpLAorCSAgKGRlaW50ZXJsYWNlX2ZyYW1lX2RpX3RvbXNtb2NvbXApLCAoZHNjYWxlcl90b21zbW9jb21wX2dldF9tZXRob2QpLAorCSAgKHRvbXNtb2NvbXBfaW5pdCksICh0b21zbW9jb21wX2ZpbHRlcl9tbXgpLAorCSAgKHRvbXNtb2NvbXBfZmlsdGVyXzNkbm93KSwgKHRvbXNtb2NvbXBfZmlsdGVyX3NzZSk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAuaDoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wMEEuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BCb3R0b20uaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BFZGdlQS5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEVkZ2VBOC5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEEuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBMi5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEE2LmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wT2RkQUguaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBSDIuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BUb3AuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BWQS5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFZBSC5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvU3RyYW5nZUJvYi5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvVG9tc01vQ29tcEFsbC5pbmM6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3RvbXNtb2NvbXAvVG9tc01vQ29tcEFsbDIuaW5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UyL3R2dGltZS90b21zbW9jb21wL1dpZXJkQm9iLmluYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlMi90dnRpbWUvdmZpci5jOiAoZGVpbnRlcmxhY2VfbGluZSksCisJICAoZGVpbnRlcmxhY2Vfc2NhbmxpbmVfdmZpciksIChjb3B5X3NjYW5saW5lKSwKKwkgIChkc2NhbGVyX3ZmaXJfZ2V0X21ldGhvZCk6CisJICAqIGdzdC9kZWludGVybGFjZTIvdHZ0aW1lL3g4Ni02NF9tYWNyb3MuaW5jOgorCSAgQWRkIGEgZGVpbnRlcmxhY2VyIHBsdWdpbiBiYXNlZCBvbiB0aGUgdHZ0aW1lL0RTY2FsZXIgZGVpbnRlcmxhY2VyLAorCSAgd2hpY2ggd2FzIHJlbGljZW5zZWQgdG8gTEdQTCBmb3IgR1N0cmVhbWVyIGFuZCBpbiB0aGVvcnkgcHJvdmlkZXMKKwkgIGJldHRlciBhbmQgZmFzdGVyIHJlc3VsdHMgdGhhbiB0aGUgc2ltcGxlIGRlaW50ZXJsYWNlIGVsZW1lbnQuCisJICBGaXhlcyBidWcgIzE2MzU3OC4KKwkgIFBvcnRlZCB0byBHU3RyZWFtZXIgMC4xMCBidXQgc3RpbGwgbm90IGVuYWJsZWQgb3IgaW5jbHVkZWQgaW4gdGhlCisJICBidWlsZCBzeXN0ZW0gYnkgZGVmYXVsdCBiZWNhdXNlIG9mIGJhZCBhcnRlZmFjdHMgY2F1c2VkIGJ5IGEgYnVnCisJICBzb21ld2hlcmUgYW5kIGFzIGl0IGNhbiBiZSBvbmx5IGJ1aWxkIG9uIHg4Ni9hbWQ2NCBBVE0gYW5kIHJlcXVpcmVzCisJICBzcGVjaWFsIENGTEFHUy4gV2lsbCBiZSBmaXhlZCBzb29uLgorCisyMDA5LTA1LTEzIDEwOjMwOjM1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgZmx2OiBBY3R1YWxseSBhZGQgdGhlIGZsdiBwbHVnaW4gdG8gY29uZmlndXJlLmFjCisKKzIwMDktMDUtMTMgMDk6MjQ6MjYgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy5jOgorCSAgY2hlY2tzOiBmaXggZmxhY2RlYyB1bml0IHRlc3RzIG9uIGJpZy1lbmRpYW4gbWFjaGluZXMgYW5kIHVuZGVyIHZhbGdyaW5kCisJICBGbGFjZGVjIG91dHB1dHMgMTYtYml0IHNhbXBsZXMsIHNvIGxldCdzIGNoZWNrIGlmIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QKKwkgIHNhbXBsZSBpcyB3aGF0IHdlIGV4cGVjdCByYXRoZXIgdGhhbiBqdXN0IHRoZSBmaXJzdCBieXRlLCB3aGljaCBtYXkgYmUKKwkgIGRpZmZlcmVudCBmcm9tIHdoYXQgd2UgZXhwZWN0IGRlcGVuZGluZyBvbiB0aGUgaG9zdCdzIGVuZGlhbm5lc3MuIEZpeGVzCisJICB0aGUgZmxhY2RlYyB1bml0IHRlc3RzIG9uIFBQQy4gQWxzbyBmaXggYSBidW5jaCBvZiBsZWFrcyBpbiB0aGUgdW5pdAorCSAgdGVzdHMgdG8gbWFrZSB2YWxncmluZCBoYXBweS4gRml4ZXMgIzU4MjQyMC4KKworMjAwOS0wNS0xMyAwOToxODowNyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWNkZWM6IGZpeCBidWZmZXIgbGVhaworCSAgZ3N0X2J1ZmZlcl9yZXBsYWNlKCkgd2lsbCB0YWtlIGl0cyBvd24gcmVmLCBzbyB3ZSBzdGlsbCBoYXZlCisJICB0byB1bnJlZiB0aGUgYnVmZmVyIGlmIHdlIGRvbid0IG5lZWQgaXQgYW55IGxvbmdlci4KKworMjAwOS0wNS0xMiAyMToyMDowNCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBGaXggcG9pbnRlciBhcml0aG1ldGljCisJICBUaGlzIGZpeGVzIGEgc2Vla2luZyByZWdyZXNzaW9uLCBidWcgIzEzNDUyMi4KKworMjAwOS0wNS0xMiAyMTozNjozMSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSAgTW92ZWQgJ2ZsdicgZnJvbSAtYmFkIHRvIC1nb29kCisKKzIwMDktMDUtMDcgMTc6NTM6NDIgKzAxMDAgIENocmlzdGlhbiBTY2hhbGxlciA8Y2hyaXN0aWFuLnNjaGFsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgW01PVkVEIEZST00gQkFEIDU3LzU3XSBBZGQgcmFua3MgdG8gdmFyaW91cyBtdXhlcnMgYW5kIGVuY29kZXJzIGluIC1iYWQKKworMjAwOS0wNC0yOSAxODo1MjoyMCArMDEwMCAgVHJpc3RhbiBNYXR0aGV3cyA8bGUuYnVzaW5lc3NtYW5AZ21haWwuY29tPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSAgW01PVkVEIEZST00gQkFEIDU2LzU3XSBmbHZtdXg6IGluaXQgdmFyaWFibGUgdG8gTlVMTCB0byBmaXggY29tcGlsZXIgd2FybmluZworCSAgRml4ZXMgIzU4MDc4Ni4KKworMjAwOS0wNC0yOSAxMzo1NjowNyArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6CisJICBbTU9WRUQgRlJPTSBCQUQgNTUvNTddIGZsdjogU2V0L3JlcXVpcmUgdGhlIGZyYW1lZC9wYXJzZWQgZmllbGRzIG9mIHRoZSBhdWRpby9tcGVnIGNhcHMgdG8gVFJVRQorCisyMDA5LTA0LTI5IDEzOjE2OjI1ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZtdXguYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1NC81N10gZmx2OiBBbHdheXMgd3JpdGUgYXQgbGVhc3QgdGhlIG1pbmltYWwgdGFncyBhbmQgd3JpdGUgdGhlIFBBUiBhcyB0YWdzCisKKzIwMDktMDQtMjkgMTM6MDM6NDYgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZmx2L2dzdGZsdm11eC5jOgorCSogZ3N0L2Zsdi9nc3RmbHZtdXguaDoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1My81N10gZmx2OiBBZGQgc3VwcG9ydCBmb3IgbXV4aW5nIHNvbWUgdGFncworCisyMDA5LTA0LTI5IDEzOjAzOjI3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOgorCSAgW01PVkVEIEZST00gQkFEIDUyLzU3XSBmbHY6IEFkZCBzdXBwb3J0IGZvciB0aXRsZSB0YWcKKworMjAwOS0wNC0yOSAwOTo0MDo0MSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzoKKwkgIFtNT1ZFRCBGUk9NIEJBRCA1MS81N10gZmx2OiBGaXggcGFyc2luZyBvZiB0YWdzIGFuZCBhZGQgbmV3IG1hcHBpbmdzCisJICBXZSBzaG91bGRuJ3QgcmVnaXN0ZXIgYSBuZXcgR3N0VGFnIGZvciBldmVyeSB1bmtub3duIHRhZworCSAgd2UgZmluZCBhcyB0aGlzIG1pZ2h0IGxlYWQgdG8gY29uZmxpY3RzIGFuZCBhbHNvIHRob3NlCisJICB0YWdzIGFyZSBlc3NlbnRpYWxseSB1bmtub3duLgorCSAgQWRkIG1hcHBpbmdzIGZvciBzb21lIGtub3duIHRhZ3MgYW5kIGFsc28gY29udmVydCBzdHJpbmcKKwkgIGRhdGVzIHRvIEdEYXRlLCBhcyBmb3VuZCBpbiBtYW55IEZMViBmaWxlcy4KKworMjAwOS0wNC0yMiAxOTo1MjowNSArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6CisJKiBnc3QvZmx2L2dzdGZsdm11eC5oOgorCSAgW01PVkVEIEZST00gQkFEIDUwLzU3XSBmbHY6IEFkZCBkb2N1bWVudGF0aW9uIHRvIGZsdm11eCBhbmQgZmx2ZGVtdXgKKwkgIFBhcnRpYWxseSBmaXhlcyBidWcgIzU3MzczNy4KKworMjAwOS0wMS0yMiAxMzozOTozNCArMDEwMCAgSmFuIFVyYmFuc2tpIDxqLnVyYmFuc2tpQHN0dWRlbnRzLm1pbXV3LmVkdS5wbD4KKworCSogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOgorCSAgW01PVkVEIEZST00gQkFEIDQ5LzU3XSBBZGQgc3VwcG9ydCBmb3IgRUNNQSBhcnJheXMgaW4gc2NyaXB0IHRhZ3MuIEZpeGVzIGJ1ZyAjNTY3OTY1LgorCSAgQWRkIHN1cHBvcnQgZm9yIEVDTUEgYXJyYXlzIGluIHNjcmlwdCB0YWdzLiBUaGlzIGZpeGVzCisJICBzZWVraW5nIG9uIHNvbWUgZmlsZXMgdGhhdCBoYXZlIHRoZSBzZWVrIHRhYmxlIHN0b3JlZAorCSAgaW5zaWRlIGFuIEVDTUEgYXJyYXkgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIGFycmF5LgorCisyMDA4LTEyLTAzIDExOjQzOjAwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCA0OC81N10gZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiBDaGVjayBpZiBzdHJpbmdzIGFyZSB2YWxpZCBVVEY4IGJlZm9yZSB1c2luZyB0aGVtLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKEZMVl9HRVRfU1RSSU5HKToKKwkgIENoZWNrIGlmIHN0cmluZ3MgYXJlIHZhbGlkIFVURjggYmVmb3JlIHVzaW5nIHRoZW0uCisKKzIwMDgtMTEtMjQgMTE6MTc6MTkgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgNDcvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogRml4IG5vbiBrZXkgdW5pdCBzZWVraW5nIGJ5IGFsd2F5cyBnb2luZyB0byB0aGUgcHJldmlvdXMga2V5ZnJhbWUuIE1hcmsgdGhlIGRpc2NvbnQgZmxhZyB3aGVuIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA4LTExLTI0ICBKdWxpZW4gTW91dHRlICA8anVsaWVuQGZsdWVuZG8uY29tPgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X2ZpbmRfb2Zmc2V0KSwKKwkgIChnc3RfZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1c2gpLAorCSAgKGdzdF9mbHZfZGVtdXhfaGFuZGxlX3NlZWtfcHVsbCk6CisJICBGaXggbm9uIGtleSB1bml0IHNlZWtpbmcgYnkgYWx3YXlzIGdvaW5nIHRvIHRoZSBwcmV2aW91cworCSAga2V5ZnJhbWUuIE1hcmsKKwkgIHRoZSBkaXNjb250IGZsYWcgd2hlbiB3ZSd2ZSBtb3ZlZCBpbiB0aGUgZmlsZS4KKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV9hdWRpb19uZWdvdGlhdGUpOiBNUDMKKwkgIHN0cmVhbXMKKwkgIGFyZSBwYXJzZWQgYWxyZWFkeSwgbWFrZXMgYXV0b3BsdWdnZWQgcGlwZWxpbmVzIHNob3J0ZXIuCisKKzIwMDgtMTEtMDQgMTI6NDI6MzAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgW01PVkVEIEZST00gQkFEIDQ2LzU3XSBEb24ndCBpbnN0YWxsIHN0YXRpYyBsaWJzIGZvciBwbHVnaW5zLiBGaXhlcyAjNTUwODUxIGZvciAtYmFkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9hbHNhc3BkaWYvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hbXJ3Yi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FwZXhzaW5rL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXJ0cy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2FydHNkL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXVkaW9maWxlL01ha2VmaWxlLmFtOgorCSAgKiBleHQvYXVkaW9yZXNhbXBsZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2J6Mi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2NkYXVkaW8vTWFrZWZpbGUuYW06CisJICAqIGV4dC9jZWx0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGMxMzk0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvZGlyYWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kaXJlY3RmYi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2RpdngvTWFrZWZpbGUuYW06CisJICAqIGV4dC9kdHMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9mYWFjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZmFhZC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2dzbS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2hlcm1lcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2l2b3JiaXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9qYWNrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvanAyay9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xhZHNwYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xjcy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xpYmZhbWUvTWFrZWZpbGUuYW06CisJICAqIGV4dC9saWJtbXMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tZXRhZGF0YS9NYWtlZmlsZS5hbToKKwkgICogZXh0L21wZWcyZW5jL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXBsZXgvTWFrZWZpbGUuYW06CisJICAqIGV4dC9tdXNlcGFjay9NYWtlZmlsZS5hbToKKwkgICogZXh0L211c2ljYnJhaW56L01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXl0aHR2L01ha2VmaWxlLmFtOgorCSAgKiBleHQvbmFzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbmVvbi9NYWtlZmlsZS5hbToKKwkgICogZXh0L29mYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3BvbHlwL01ha2VmaWxlLmFtOgorCSAgKiBleHQvcmVzaW5kdmQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zZGwvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zaG91dC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NuYXBzaG90L01ha2VmaWxlLmFtOgorCSAgKiBleHQvc25kZmlsZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NvdW5kdG91Y2gvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zcGMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zd2ZkZWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC90YXJraW4vTWFrZWZpbGUuYW06CisJICAqIGV4dC90aGVvcmEvTWFrZWZpbGUuYW06CisJICAqIGV4dC90aW1pZGl0eS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3R3b2xhbWUvTWFrZWZpbGUuYW06CisJICAqIGV4dC94MjY0L01ha2VmaWxlLmFtOgorCSAgKiBleHQveGluZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3h2aWQvTWFrZWZpbGUuYW06CisJICAqIGdzdC1saWJzL2dzdC9hcHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC1saWJzL2dzdC9kc2hvdy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FpZmZwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FwcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvYnVmZmVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYmF5ZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9jZHhhcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9jaGFydC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2NvbG9yc3BhY2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kY2NwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWludGVybGFjZTIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kdmRzcHUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9mZXN0aXZhbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ZpbHRlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ZsYWNwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2dhbWVzL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvaDI2NHBhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbGlicmZiL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWl4bWF0cml4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbW9kcGx1Zy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21wZWcxc3lzL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZzR2aWRlb3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ2RlbXV4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ3RzbXV4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXBlZ3ZpZGVvcGFyc2UvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tdmUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9uc2YvTWFrZWZpbGUuYW06CisJICAqIGdzdC9udXZkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L292ZXJsYXkvTWFrZWZpbGUuYW06CisJICAqIGdzdC9wYXNzdGhyb3VnaC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3BjYXBwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3BsYXlvbmRlbWFuZC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3Jhd3BhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcmVhbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0anBlZy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zY2FsZXRlbXBvL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc2RwL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc2VsZWN0b3IvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zbW9vdGgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zbW9vdGh3YXZlL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3BlZWQvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zcGVleHJlc2FtcGxlL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3RlcmVvL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3ViZW5jL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdHRhL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmJpZGVjL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9kcm9wL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9zaWduYWwvTWFrZWZpbGUuYW06CisJICAqIGdzdC92aXJ0dWFsZHViL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvdm1uYy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3k0bS9NYWtlZmlsZS5hbToKKwkgICogc3lzL2FjbWVuYy9NYWtlZmlsZS5hbToKKwkgICogc3lzL2Nkcm9tL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHNob3dkZWN3cmFwcGVyL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHNob3dzcmN3cmFwcGVyL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHZiL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZHhyMy9NYWtlZmlsZS5hbToKKwkgICogc3lzL2ZiZGV2L01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3NzNC9NYWtlZmlsZS5hbToKKwkgICogc3lzL3FjYW0vTWFrZWZpbGUuYW06CisJICAqIHN5cy9xdHdyYXBwZXIvTWFrZWZpbGUuYW06CisJICAqIHN5cy92Y2QvTWFrZWZpbGUuYW06CisJICAqIHN5cy93aW5pbmV0L01ha2VmaWxlLmFtOgorCSAgKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBEb24ndCBpbnN0YWxsIHN0YXRpYyBsaWJzIGZvciBwbHVnaW5zLiBGaXhlcyAjNTUwODUxIGZvciAtYmFkLgorCisyMDA4LTEwLTI4IDE4OjQ0OjQ0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCA0NS81N10gZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiBJbXBsZW1lbnQgcG9zaXRpb24gcXVlcnkgaW4gdGltZSBmb3JtYXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiAoZ3N0X2Zsdl9kZW11eF9xdWVyeSk6CisJICBJbXBsZW1lbnQgcG9zaXRpb24gcXVlcnkgaW4gdGltZSBmb3JtYXQuCisKKzIwMDgtMTAtMjggMTg6NDE6MTkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDQ0LzU3XSBnc3QvZmx2LzogUHV0IHRoZSBHc3RTZWdtZW50IGRpcmVjdGx5IGludG8gdGhlIGluc3RhbmNlIHN0cnVjdCBpbnN0ZWFkIG9mIGFsbG9jYXRpbmcgYW5kIGZyZWUnaW5nIGl0IGFnYWluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogKGdzdF9mbHZfZGVtdXhfY2xlYW51cCksCisJICAoZ3N0X2Zsdl9kZW11eF9sb29wKSwgKGdzdF9mbHZfZGVtdXhfaGFuZGxlX3NlZWtfcHVzaCksCisJICAoZ3N0X2Zsdl9kZW11eF9oYW5kbGVfc2Vla19wdWxsKSwgKGdzdF9mbHZfZGVtdXhfc2lua19ldmVudCksCisJICAoZ3N0X2Zsdl9kZW11eF9kaXNwb3NlKSwgKGdzdF9mbHZfZGVtdXhfaW5pdCk6CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV90YWdfYXVkaW8pLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX3ZpZGVvKSwgKGdzdF9mbHZfcGFyc2VfdGFnX3RpbWVzdGFtcCk6CisJICBQdXQgdGhlIEdzdFNlZ21lbnQgZGlyZWN0bHkgaW50byB0aGUgaW5zdGFuY2Ugc3RydWN0IGluc3RlYWQgb2YKKwkgIGFsbG9jYXRpbmcgYW5kIGZyZWUnaW5nIGl0IGFnYWluLgorCSAgUHVzaCB0YWdzIGFscmVhZHkgaWYgb25seSBvbmUgcGFkIHdhcyBhZGRlZCwgbm8gbmVlZCB0byB3YWl0IGZvcgorCSAgdGhlIHNlY29uZCBvbmUuCisJICBXaGVuIGdlbmVyYXRpbmcgb3VyIGluZGV4IHNldCBoYXNfdmlkZW8gYW5kIGhhc19hdWRpbyBpZiB3ZSBmaW5kCisJICB2aWRlbyBvciBhdWRpbyBpbiBjYXNlIHRoZSBGTFYgaGVhZGVyIGhhcyBpbmNvcnJlY3QgZGF0YS4KKworMjAwOC0xMC0yNyAwOTo0NTowNCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgNDMvNTddIGdzdC9mbHYvOiBEb24ndCBtZW1jcHkoKSBhbGwgZGF0YSB3ZSB3YW50IHRvIHB1c2ggZG93bnN0cmVhbSwgaW5zdGVhZCBqdXN0IGNyZWF0ZSBzdWJidWZmZXJzIGFuZCBwdXNoIHRoZW0gZG93bnN0cmVhbS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X2NoYWluKSwKKwkgIChnc3RfZmx2X2RlbXV4X3B1bGxfdGFnKSwgKGdzdF9mbHZfZGVtdXhfcHVsbF9oZWFkZXIpLAorCSAgKGdzdF9mbHZfZGVtdXhfY3JlYXRlX2luZGV4KToKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV90YWdfc2NyaXB0KSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ19hdWRpbyksIChnc3RfZmx2X3BhcnNlX3RhZ192aWRlbyksCisJICAoZ3N0X2Zsdl9wYXJzZV90YWdfdGltZXN0YW1wKSwgKGdzdF9mbHZfcGFyc2VfdGFnX3R5cGUpLAorCSAgKGdzdF9mbHZfcGFyc2VfaGVhZGVyKToKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5oOgorCSAgRG9uJ3QgbWVtY3B5KCkgYWxsIGRhdGEgd2Ugd2FudCB0byBwdXNoIGRvd25zdHJlYW0sIGluc3RlYWQganVzdAorCSAgY3JlYXRlIHN1YmJ1ZmZlcnMgYW5kIHB1c2ggdGhlbSBkb3duc3RyZWFtLgorCSAgRml4IHNvbWUgbWlub3IgbWVtb3J5IGxlYWtzLgorCisyMDA4LTEwLTI3IDA5OjQxOjE4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCA0Mi81N10gZ3N0L2Zsdi9NYWtlZmlsZS5hbTogRml4IChub24tY3JpdGljYWwpIHN5bnRheCBlcnJvciBhbmQgYWRkIGFsbCByZXF1aXJlZCBDRkxBR1MgYW5kIExJQlMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9NYWtlZmlsZS5hbToKKwkgIEZpeCAobm9uLWNyaXRpY2FsKSBzeW50YXggZXJyb3IgYW5kIGFkZCBhbGwgcmVxdWlyZWQgQ0ZMQUdTIGFuZCBMSUJTLgorCSAgKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IChGTFZfR0VUX1NUUklORyksCisJICAoZ3N0X2Zsdl9wYXJzZV9tZXRhZGF0YV9pdGVtKSwgKGdzdF9mbHZfcGFyc2VfdGFnX3NjcmlwdCksCisJICAoZ3N0X2Zsdl9wYXJzZV90YWdfYXVkaW8pLCAoZ3N0X2Zsdl9wYXJzZV90YWdfdmlkZW8pLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX3RpbWVzdGFtcCksIChnc3RfZmx2X3BhcnNlX3RhZ190eXBlKToKKwkgIFJld3JpdGUgdGhlIHNjcmlwdCB0YWcgcGFyc2luZyB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgdHJ5IHRvIHJlYWQKKwkgIG1vcmUgZGF0YSB0aGFuIHdlIGhhdmUuIEFsc28gdXNlIEdTVF9SRUFEX1VJTlQyNF9CRSBkaXJlY3RseSBhbmQKKwkgIGZpeCBzb21lIG1pbm9yIG1lbW9yeSBsZWFrcy4KKwkgIFRoaXMgc2hvdWxkIG1ha2UgYWxsIGNyYXNoZXMgb24gZnV6emVkIEZMViBmaWxlcyBkaXNhcHBlYXIuCisKKzIwMDgtMTAtMjcgMDk6Mzc6MjEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDQxLzU3XSBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IFByb3Blcmx5IGNoZWNrIGV2ZXJ5d2hlcmUgdGhhdCB3ZSBoYXZlIGVub3VnaCBkYXRhIHRvIHBhcnNlIGFuZCBkb24ndCByZWFkIG91dHNpZGUgdGhlIGFsbG9jYXQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IChGTFZfR0VUX1NUUklORyksCisJICAoZ3N0X2Zsdl9wYXJzZV90YWdfYXVkaW8pLCAoZ3N0X2Zsdl9wYXJzZV90YWdfdmlkZW8pLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX3R5cGUpLCAoZ3N0X2Zsdl9wYXJzZV9oZWFkZXIpOgorCSAgUHJvcGVybHkgY2hlY2sgZXZlcnl3aGVyZSB0aGF0IHdlIGhhdmUgZW5vdWdoIGRhdGEgdG8gcGFyc2UgYW5kCisJICBkb24ndCByZWFkIG91dHNpZGUgdGhlIGFsbG9jYXRlZCBtZW1vcnkgcmVnaW9uLgorCisyMDA4LTEwLTI3IDA5OjM1OjM0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCA0MC81N10gZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiBJZiB0aGUgY2FwcyBjaGFuZ2UgZHVyaW5nIHBsYXliYWNrIGFuZCBuZWdvdGlhdGlvbiBmYWlscyBlcnJvciBvdXQgaW5zdGVhZCBvZiB0cnlpbmcgdG8gY29udGludWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV90YWdfYXVkaW8pLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX3ZpZGVvKToKKwkgIElmIHRoZSBjYXBzIGNoYW5nZSBkdXJpbmcgcGxheWJhY2sgYW5kIG5lZ290aWF0aW9uIGZhaWxzIGVycm9yIG91dAorCSAgaW5zdGVhZCBvZiB0cnlpbmcgdG8gY29udGludWUuCisKKzIwMDgtMTAtMjcgMDk6MzM6NDAgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDM5LzU3XSBnc3QvZmx2LzogQWRkIHN1cHBvcnQgZm9yIFNwZWV4IGF1ZGlvIGFuZCBhbGxvdyBidWZmZXJzIHdpdGhvdXQgdmFsaWQgdGltZXN0YW1wIGluIHRoZSBtdXhlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdm11eC5jOiAoZ3N0X2Zsdl9tdXhfYXVkaW9fcGFkX3NldGNhcHMpLAorCSAgKGdzdF9mbHZfbXV4X3JlcXVlc3RfbmV3X3BhZCksIChnc3RfZmx2X211eF93cml0ZV9idWZmZXIpLAorCSAgKGdzdF9mbHZfbXV4X2NvbGxlY3RlZCk6CisJICAqIGdzdC9mbHYvZ3N0Zmx2bXV4Lmg6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKGdzdF9mbHZfcGFyc2VfYXVkaW9fbmVnb3RpYXRlKToKKwkgIEFkZCBzdXBwb3J0IGZvciBTcGVleCBhdWRpbyBhbmQgYWxsb3cgYnVmZmVycyB3aXRob3V0IHZhbGlkCisJICB0aW1lc3RhbXAgaW4gdGhlIG11eGVyLgorCisyMDA4LTEwLTI3IDA5OjMyOjAzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzOC81N10gZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiBEb24ndCBwb3N0IGFuIGVycm9yIG1lc3NhZ2Ugb24gdGhlIGJ1cyBpZiBzZW5kaW5nIEVPUyBkb3duc3RyZWFtIGRpZG4ndCB3b3JrLiBGaXhlcyBidWcgIzU1MDQ1NC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X2xvb3ApLAorCSAgKGdzdF9mbHZfZGVtdXhfZmluZF9vZmZzZXQpLCAoZ3N0X2Zsdl9kZW11eF9oYW5kbGVfc2Vla19wdXNoKSwKKwkgIChnc3RfZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1bGwpOgorCSAgRG9uJ3QgcG9zdCBhbiBlcnJvciBtZXNzYWdlIG9uIHRoZSBidXMgaWYgc2VuZGluZyBFT1MgZG93bnN0cmVhbQorCSAgZGlkbid0IHdvcmsuIEZpeGVzIGJ1ZyAjNTUwNDU0LgorCSAgRml4IHNlZWsgZXZlbnQgaGFuZGxpbmcgdG8gbG9vayBhdCB0aGUgZmxhZ3Mgb2YgdGhlIHNlZWsgZXZlbnQKKwkgIGluc3RlYWQgb2YgYXNzdW1pbmcgc29tZSByYW5kb20gZmxhZ3MsIGRvbid0IHNlbmQgc2VnbWVudC1zdGFydAorCSAgbWVzc2FnZXMgd2hlbiBvcGVyYXRpbmcgaW4gcHVzaCBtb2RlIGFuZCBwdXNoIHNlZWsgZXZlbnRzIHVwc3RyZWFtCisJICBpZiB3ZSBjb3VsZG4ndCBoYW5kbGUgdGhlbS4KKworMjAwOC0xMC0yNyAwOToyNzoxOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMzcvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogRXJyb3Igb3V0IGVhcmx5IGlmIHB1bGxpbmcgYSB0YWcgZmFpbGVkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogKGdzdF9mbHZfZGVtdXhfcHVsbF90YWcpOgorCSAgRXJyb3Igb3V0IGVhcmx5IGlmIHB1bGxpbmcgYSB0YWcgZmFpbGVkLgorCisyMDA4LTEwLTI3IDA5OjI1OjExICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzNi81N10gZ3N0L2Zsdi86IEluIHB1bGwgbW9kZSB3ZSBjcmVhdGUgb3VyIG93biBpbmRleCBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZSBhbmQgZG9uJ3QgdXNlIHRoZSBpbmRleCBwcm92aWRlZCBieSBzb21lIGZpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiAoZ3N0X2Zsdl9kZW11eF9jcmVhdGVfaW5kZXgpLAorCSAgKGdzdF9mbHZfZGVtdXhfbG9vcCk6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKGdzdF9mbHZfcGFyc2VfdGFnX3NjcmlwdCksCisJICAoZ3N0X2Zsdl9wYXJzZV90YWdfYXVkaW8pLCAoZ3N0X2Zsdl9wYXJzZV90YWdfdmlkZW8pLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX3RpbWVzdGFtcCk6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuaDoKKwkgIEluIHB1bGwgbW9kZSB3ZSBjcmVhdGUgb3VyIG93biBpbmRleCBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZQorCSAgYW5kIGRvbid0IHVzZSB0aGUgaW5kZXggcHJvdmlkZWQgYnkgc29tZSBmaWxlcyAod2hpY2ggYXJlIG1vcmUgdGhhbgorCSAgb2Z0ZW4gaW5jb3JyZWN0IGFuZCBjYXVzZSBmYWlsZWQgc2Vla3MpLgorCSAgRm9yIHB1c2ggbW9kZSB3ZSBzdGlsbCB1c2UgdGhlIGluZGV4IHByb3ZpZGVkIGJ5IHRoZSBmaWxlIGFuZCBleHRlbmQgaXQKKwkgIHdoaWxlIGRvaW5nIHRoZSBwbGF5YmFjay4KKworMjAwOC0xMC0yNyAwOToyMDowMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMzUvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogSW5zdGVhZCBvZiB1c2luZyBnc3RfcGFkX2V2ZW50X2RlZmF1bHQoKSB1c2UgYSBzbWFsbCBnc3RfcGFkX3B1c2hfZXZlbnQoKSB3cmFwcGVyIHRoYXQgb25seSBkby4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogKGdzdF9mbHZfZGVtdXhfcHVzaF9zcmNfZXZlbnQpLAorCSAgKGdzdF9mbHZfZGVtdXhfbG9vcCksIChnc3RfZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1bGwpLAorCSAgKGdzdF9mbHZfZGVtdXhfc2lua19ldmVudCk6CisJICBJbnN0ZWFkIG9mIHVzaW5nIGdzdF9wYWRfZXZlbnRfZGVmYXVsdCgpIHVzZSBhIHNtYWxsCisJICBnc3RfcGFkX3B1c2hfZXZlbnQoKSB3cmFwcGVyIHRoYXQgb25seSBkb2VzIHdoYXQgd2Ugd2FudCBhbmQgaXMgbXVjaAorCSAgbW9yZSBzaW1wbGUuCisKKzIwMDgtMTAtMjcgMDk6MTQ6NDUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDM0LzU3XSBnc3QvZmx2L2dzdGZsdmRlbXV4Lio6IElmIG91ciBpbmRleCB3YXMgY3JlYXRlZCBieSB0aGUgZWxlbWVudCBhbmQgbm90IHByb3ZpZGVkIGZyb20gdGhlIG91dHNpZGUgd2Ugc2hvdWxkIGRlc3Ryb3kgaXQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X2Zsdl9kZW11eF9zZXRfaW5kZXgpLCAoZ3N0X2Zsdl9kZW11eF9pbml0KToKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5oOgorCSAgSWYgb3VyIGluZGV4IHdhcyBjcmVhdGVkIGJ5IHRoZSBlbGVtZW50IGFuZCBub3QgcHJvdmlkZWQgZnJvbSB0aGUKKwkgIG91dHNpZGUgd2Ugc2hvdWxkIGRlc3Ryb3kgaXQgd2hlbiBzdGFydGluZyBhIG5ldyBzdHJlYW0gdG8gZ2V0CisJICBhbGwgb2xkIGVudHJpZXMgcmVtb3ZlZC4KKworMjAwOC0xMC0yNyAwOToxMjozMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMzMvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogSW1wcm92ZSBkZWJ1Z2dpbmcgYSBiaXQgd2hlbiBwdWxsaW5nIGEgYnVmZmVyIGZyb20gdXBzdHJlYW0gZmFpbHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiAoZ3N0X2Zsdl9kZW11eF9wdWxsX3JhbmdlKToKKwkgIEltcHJvdmUgZGVidWdnaW5nIGEgYml0IHdoZW4gcHVsbGluZyBhIGJ1ZmZlciBmcm9tIHVwc3RyZWFtIGZhaWxzLgorCisyMDA4LTEwLTI3IDA5OjEwOjU0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAzMi81N10gZ3N0L2Zsdi86IENsb3NlIHRoZSBjdXJyZW50bHkgcGxheWluZyBzZWdtZW50IGZyb20gdGhlIHN0cmVhbWluZyB0aHJlYWQgaW5zdGVhZCBvZiB0aGUgdGhyZWFkIHdoZXJlIHRoZSBzZWVrIGV2ZW50IGlzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiAoZ3N0X2Zsdl9kZW11eF9jbGVhbnVwKSwKKwkgIChnc3RfZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1bGwpLCAoZ3N0X2Zsdl9kZW11eF9kaXNwb3NlKToKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5oOgorCSAgKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IChnc3RfZmx2X3BhcnNlX3RhZ19hdWRpbyksCisJICAoZ3N0X2Zsdl9wYXJzZV90YWdfdmlkZW8pOgorCSAgQ2xvc2UgdGhlIGN1cnJlbnRseSBwbGF5aW5nIHNlZ21lbnQgZnJvbSB0aGUgc3RyZWFtaW5nIHRocmVhZAorCSAgaW5zdGVhZCBvZiB0aGUgdGhyZWFkIHdoZXJlIHRoZSBzZWVrIGV2ZW50IGlzIGhhbmRsZWQuCisKKzIwMDgtMTAtMTYgMTU6MjE6MTUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDMxLzU3XSBnc3QvZmx2L2dzdGZsdm11eC5jOiBEb24ndCBzZXQgdmlkZW9fY29kZWMgdG8gdGhlIHZhbHVlIHRoYXQgYWN0dWFsbHkgc2hvdWxkIGdvIGludG8gYXVkaW8gY29kZWMsIG90aGVyd2lzZSB3ZSBjcmVhdGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdm11eC5jOiAoZ3N0X2Zsdl9tdXhfYXVkaW9fcGFkX3NldGNhcHMpLAorCSAgKGdzdF9mbHZfbXV4X3dyaXRlX2J1ZmZlcik6CisJICBEb24ndCBzZXQgdmlkZW9fY29kZWMgdG8gdGhlIHZhbHVlIHRoYXQgYWN0dWFsbHkgc2hvdWxkIGdvCisJICBpbnRvIGF1ZGlvIGNvZGVjLCBvdGhlcndpc2Ugd2UgY3JlYXRlIGludmFsaWQgZmlsZXMuCisJICBGaXhlcyBidWcgIzU1NjU2NC4KKworMjAwOC0xMC0xMiAxNzowODoxMCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMzAvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogRml4IHJlZ3Jlc3Npb24gb2YgaGFuZGxpbmcgZmxvdyByZXR1cm5zIGluIHB1bGwgbW9kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X3B1bGxfdGFnKSwKKwkgIChnc3RfZmx2X2RlbXV4X3B1bGxfaGVhZGVyKToKKwkgIEZpeCByZWdyZXNzaW9uIG9mIGhhbmRsaW5nIGZsb3cgcmV0dXJucyBpbiBwdWxsIG1vZGUuCisJICBGaXhlcyBidWcgIzU1NjAwMy4KKworMjAwOC0xMC0xMCAxNjozMzozNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjkvNTddIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogVXNlIGdzdF9wYWRfYWxsb2NfYnVmZmVyX2FuZF9zZXRfY2FwcygpIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgYSBidWZmZXIgd2l0aCBjYXBzIHRoYXQgd2UgY2FuIHdvci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKGdzdF9mbHZfcGFyc2VfdGFnX2F1ZGlvKSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ192aWRlbyk6CisJICBVc2UgZ3N0X3BhZF9hbGxvY19idWZmZXJfYW5kX3NldF9jYXBzKCkgdG8gbWFrZSBzdXJlIHdlIGdldAorCSAgYSBidWZmZXIgd2l0aCBjYXBzIHRoYXQgd2UgY2FuIHdvcmsgd2l0aCAoaS5lLiB0aGUgcGFkJ3MgY2FwcykuCisJICBBZGQgbm9uLWtleWZyYW1lIHZpZGVvIGZyYW1lcyB0byB0aGUgaW5kZXggdG9vIGJ1dCB3aXRob3V0IHRoZQorCSAga2V5ZnJhbWUgZmxhZy4KKwkgIEFkZCBhdWRpbyBmcmFtZXMgdG8gdGhlIGluZGV4IG9ubHkgaWYgd2UgaGF2ZSBubyB2aWRlbyBzdHJlYW0uCisKKzIwMDgtMTAtMTAgMTY6MTU6MDkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDI4LzU3XSBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IENyZWF0ZSBwYWRzIGZyb20gdGhlIHBhZCB0ZW1wbGF0ZXMsIHVzZSBmaXhlZCBjYXBzIG9uIHRoZW0gYW5kIG9ubHkgYWN0aXZhdGUgdGhlbSBhZnRlciB0aGUgY2EuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IChnc3RfZmx2X3BhcnNlX3RhZ19hdWRpbyksCisJICAoZ3N0X2Zsdl9wYXJzZV90YWdfdmlkZW8pOgorCSAgQ3JlYXRlIHBhZHMgZnJvbSB0aGUgcGFkIHRlbXBsYXRlcywgdXNlIGZpeGVkIGNhcHMgb24gdGhlbQorCSAgYW5kIG9ubHkgYWN0aXZhdGUgdGhlbSBhZnRlciB0aGUgY2FwcyBhcmUgc2V0LgorCisyMDA4LTEwLTA5IDE2OjIwOjI2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAyNy81N10gZ3N0L2Zsdi86IEdldCBhbiBhcHByb3hpbWF0ZSBkdXJhdGlvbiBvZiB0aGUgZmlsZSBieSBsb29raW5nIGF0IHRoZSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgdGFnIGluIHB1bGwgbW9kZS4gSWYgd2UgZ2V0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiAoZ3N0X2Zsdl9kZW11eF9sb29wKToKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV90YWdfdGltZXN0YW1wKToKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5oOgorCSAgR2V0IGFuIGFwcHJveGltYXRlIGR1cmF0aW9uIG9mIHRoZSBmaWxlIGJ5IGxvb2tpbmcgYXQgdGhlIHRpbWVzdGFtcAorCSAgb2YgdGhlIGxhc3QgdGFnIGluIHB1bGwgbW9kZS4gSWYgd2UgZ2V0IChtYXliZSBiZXR0ZXIpIGR1cmF0aW9uIGZyb20KKwkgIG1ldGFkYXRhIGxhdGVyIHdlJ2xsIHVzZSB0aGF0IGluc3RlYWQuCisKKzIwMDgtMTAtMDkgMTU6NDM6MDIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDI2LzU3XSBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IFJlZmFjdG9yIF9wdWxsX3JhbmdlKCkgbG9naWMgd2l0aCBjaGVja3MgaW50byBhIHNlcGVyYXRlIGZ1bmN0aW9uIHRvIG1ha2UgdGhpbmdzIGEgYml0IG1vcmUgcmUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X3B1bGxfcmFuZ2UpLAorCSAgKGdzdF9mbHZfZGVtdXhfcHVsbF90YWcpLCAoZ3N0X2Zsdl9kZW11eF9wdWxsX2hlYWRlcik6CisJICBSZWZhY3RvciBfcHVsbF9yYW5nZSgpIGxvZ2ljIHdpdGggY2hlY2tzIGludG8gYSBzZXBlcmF0ZSBmdW5jdGlvbgorCSAgdG8gbWFrZSB0aGluZ3MgYSBiaXQgbW9yZSByZWFkYWJsZS4KKworMjAwOC0xMC0wOSAxNToyNjo1NiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjUvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogVXNlIGdzdF9lbGVtZW50X2NsYXNzX3NldF9kZXRhaWxzX3NpbXBsZSgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogKGdzdF9mbHZfZGVtdXhfY2hhaW4pLAorCSAgKGdzdF9mbHZfZGVtdXhfYmFzZV9pbml0KToKKwkgIFVzZSBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUoKS4KKwkgIElmIHdlIGdldCBHU1RfRkxPV19OT1RfTElOS0VEIGluIHRoZSBwYXJzZSBsb29wIGJ1dCBhdCBsZWFzdAorCSAgb25lIG9mIHRoZSBwYWRzIGlzIGxpbmtlZCBjb250aW51ZSB0aGUgbG9vcC4KKworMjAwOC0xMC0wOSAxMDowMDo1MSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjQvNTddIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogQ29ycmVjdCBjYXBzIGZvciB2aWRlbyBjb2RlYyBpZCA1OiBJdCdzIE9uMiBWUDYgd2l0aCBhbHBoYSBjaGFubmVsIHdoaWNoIG5lZWRzIGEgZGlmZmVyZW50IGRlYy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKGdzdF9mbHZfcGFyc2VfYXVkaW9fbmVnb3RpYXRlKSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ19hdWRpbyksIChnc3RfZmx2X3BhcnNlX3ZpZGVvX25lZ290aWF0ZSk6CisJICBDb3JyZWN0IGNhcHMgZm9yIHZpZGVvIGNvZGVjIGlkIDU6IEl0J3MgT24yIFZQNiB3aXRoIGFscGhhIGNoYW5uZWwKKwkgIHdoaWNoIG5lZWRzIGEgZGlmZmVyZW50IGRlY29kZXIgYW5kIGhhcyBkaWZmZXJlbnQgY2Fwcy4KKwkgIEFkZCBzdXBwb3J0IGZvciBhdWRpbyBjb2RlYyBpZCAxNCwgd2hpY2ggaXMgTVAzIHdpdGggOGtIeiBzYW1wbGluZworCSAgcmF0ZS4KKwkgIEZpeCBlbmRpYW5uZXNzIGFuZCBzaWduZWRuZXNzIGZvciByYXcgYXVkaW8gY29kZWMgaWRzLgorCSAgQWRkIHN1cHBvcnQgZm9yIGFsYXcgYW5kIG11bGF3IGF1ZGlvLgorCisyMDA4LTEwLTA5IDA5OjQ4OjQ2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAyMy81N10gZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiBHbyBvdXQgb2YgdGhlIHBhcnNlIGxvb3AgYXMgc29vbiBhcyB3ZSBnZXQgYW4gZXJyb3IgaW5zdGVhZCBvZiBwYXJzaW5nIHVudGlsIHRoZSBHc3RBZGFwdGVyIGlzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiAoZ3N0X2Zsdl9kZW11eF9jaGFpbik6CisJICBHbyBvdXQgb2YgdGhlIHBhcnNlIGxvb3AgYXMgc29vbiBhcyB3ZSBnZXQgYW4gZXJyb3IgaW5zdGVhZAorCSAgb2YgcGFyc2luZyB1bnRpbCB0aGUgR3N0QWRhcHRlciBpcyBlbXB0eS4KKwkgIEFkZCBzb21lIGV4cGxhbmF0aW9ucyBhYm91dCB0aGUgaGVhZGVyIGFuZCB0YWcgc2l6ZS4KKwkgIERvbid0IHByaW50IHN5bmNocm9uaXppbmcgbWVzc2FnZSBpZiBldmVyeXRoaW5nIGlzIGZpbmUuCisKKzIwMDgtMTAtMDkgMDk6MjY6NTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgW01PVkVEIEZST00gQkFEIDIyLzU3XSBnc3QvZmx2LzogQWRkIGZpcnN0IHZlcnNpb24gb2YgYSBGTFYgbXV4ZXIuIFRoZSBvbmx5IG1pc3NpbmcgZmVhdHVyZSBpcyB3cml0aW5nIG9mIHN0cmVhbSBtZXRhZGF0YS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9mbHYvZ3N0Zmx2bXV4LmM6IChnc3RfZmx2X211eF9iYXNlX2luaXQpLAorCSAgKGdzdF9mbHZfbXV4X2NsYXNzX2luaXQpLCAoZ3N0X2Zsdl9tdXhfaW5pdCksCisJICAoZ3N0X2Zsdl9tdXhfZmluYWxpemUpLCAoZ3N0X2Zsdl9tdXhfcmVzZXQpLAorCSAgKGdzdF9mbHZfbXV4X2hhbmRsZV9zcmNfZXZlbnQpLCAoZ3N0X2Zsdl9tdXhfaGFuZGxlX3NpbmtfZXZlbnQpLAorCSAgKGdzdF9mbHZfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzKSwgKGdzdF9mbHZfbXV4X2F1ZGlvX3BhZF9zZXRjYXBzKSwKKwkgIChnc3RfZmx2X211eF9yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X2Zsdl9tdXhfcmVsZWFzZV9wYWQpLAorCSAgKGdzdF9mbHZfbXV4X3dyaXRlX2hlYWRlciksIChnc3RfZmx2X211eF93cml0ZV9idWZmZXIpLAorCSAgKGdzdF9mbHZfbXV4X2NvbGxlY3RlZCksIChnc3RfZmx2X211eF9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvZmx2L2dzdGZsdm11eC5oOgorCSAgQWRkIGZpcnN0IHZlcnNpb24gb2YgYSBGTFYgbXV4ZXIuIFRoZSBvbmx5IG1pc3NpbmcgZmVhdHVyZSBpcyB3cml0aW5nCisJICBvZiBzdHJlYW0gbWV0YWRhdGEuCisKKzIwMDgtMDYtMTMgMjI6NDY6NDMgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjEvNTddIGdzdC9mbHYvOiBJbnRyb2R1Y2UgZGVtdXhpbmcgc3VwcG9ydCBmb3IgQUFDIGFuZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA4LTA2LTE0ICBKdWxpZW4gTW91dHRlICA8anVsaWVuQGZsdWVuZG8uY29tPgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X2NsZWFudXApLAorCSAgKGdzdF9mbHZfZGVtdXhfZGlzcG9zZSk6CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV9hdWRpb19uZWdvdGlhdGUpLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX2F1ZGlvKSwgKGdzdF9mbHZfcGFyc2VfdmlkZW9fbmVnb3RpYXRlKSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ192aWRlbyk6IEludHJvZHVjZSBkZW11eGluZyBzdXBwb3J0IGZvciBBQUMKKwkgIGFuZAorCSAgSC4yNjQvQVZDIGluc2lkZSBGTFYuCisJICAqIHN5cy9kc2hvd2RlY3dyYXBwZXIvZ3N0ZHNob3dhdWRpb2RlYy5jOgorCSAgKGdzdF9kc2hvd2F1ZGlvZGVjX2luaXQpLAorCSAgKGdzdF9kc2hvd2F1ZGlvZGVjX2NoYWluKSwgKGdzdF9kc2hvd2F1ZGlvZGVjX3B1c2hfYnVmZmVyKSwKKwkgIChnc3RfZHNob3dhdWRpb2RlY19zaW5rX2V2ZW50KSwgKGdzdF9kc2hvd2F1ZGlvZGVjX3NldHVwX2dyYXBoKToKKwkgICogc3lzL2RzaG93ZGVjd3JhcHBlci9nc3Rkc2hvd2F1ZGlvZGVjLmg6CisJICAqIHN5cy9kc2hvd2RlY3dyYXBwZXIvZ3N0ZHNob3d2aWRlb2RlYy5jOgorCSAgKGdzdF9kc2hvd3ZpZGVvZGVjX2luaXQpLAorCSAgKGdzdF9kc2hvd3ZpZGVvZGVjX3NpbmtfZXZlbnQpLCAoZ3N0X2RzaG93dmlkZW9kZWNfY2hhaW4pLAorCSAgKGdzdF9kc2hvd3ZpZGVvZGVjX3B1c2hfYnVmZmVyKSwKKwkgIChnc3RfZHNob3d2aWRlb2RlY19zcmNfZ2V0Y2Fwcyk6CisJICAqIHN5cy9kc2hvd2RlY3dyYXBwZXIvZ3N0ZHNob3d2aWRlb2RlYy5oOiBMb3Qgb2YgcmFuZG9tIGZpeGVzCisJICB0byBpbXByb3ZlIHN0YWJpbGl0eSAocmVmIGNvdW50aW5nLCBzYWZldHkgY2hlY2tzLi4uKQorCisyMDA4LTA0LTI1IDA4OjA3OjM2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMjAvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogRm9yd2FyZCB1bmtub3duIHF1ZXJpZXMgdXBzdHJlYW0gaW5zdGVhZCBvZiByZXR1cm5pbmcgRkFMU0Ugb24gdGhlbS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X3F1ZXJ5KToKKwkgIEZvcndhcmQgdW5rbm93biBxdWVyaWVzIHVwc3RyZWFtIGluc3RlYWQgb2YgcmV0dXJuaW5nIEZBTFNFIG9uIHRoZW0uCisKKzIwMDgtMDQtMTEgMjM6MTk6MjEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxOS81N10gZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiBIYW5kbGUgTlVMTCByZXR1cm5zIGZyb20gRkxWX0dFVF9TVFJJTkcoKSBtb3JlIGdyYWNlZnVsbHkuIEZpeGVzIGNyYXNoIGNhdXNlZCBieSBhIHN0cmxlbiBvbiBhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV9tZXRhZGF0YV9pdGVtKSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ19zY3JpcHQpOgorCSAgSGFuZGxlIE5VTEwgcmV0dXJucyBmcm9tIEZMVl9HRVRfU1RSSU5HKCkgbW9yZSBncmFjZWZ1bGx5LiBGaXhlcworCSAgY3Jhc2ggY2F1c2VkIGJ5IGEgc3RybGVuIG9uIGEgTlVMTCBzdHJpbmcgKCM1Mjc2MjIpLgorCisyMDA3LTEyLTExIDExOjU0OjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMTgvNTddIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogRG9uJ3Qgc3RyZHVwIChhbmQgdGh1cyBsZWFrKSBjb2RlYyBuYW1lIHN0cmluZ3Mgd2hlbiBwYXNzaW5nIHRoZW0gdG8gZ3N0X3RhZ19saXN0X2FkZCgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKGdzdF9mbHZfcGFyc2VfdGFnX2F1ZGlvKSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ192aWRlbyk6CisJICBEb24ndCBzdHJkdXAgKGFuZCB0aHVzIGxlYWspIGNvZGVjIG5hbWUgc3RyaW5ncyB3aGVuIHBhc3NpbmcKKwkgIHRoZW0gdG8gZ3N0X3RhZ19saXN0X2FkZCgpLgorCisyMDA3LTEyLTA5IDE5OjM3OjUzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMTcvNTddIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogRml4IGxpc3Qgb2Ygc3VwcG9ydGVkIGFuZCBrbm93biBjb2RlY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV90YWdfYXVkaW8pLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX3ZpZGVvKToKKwkgIEZpeCBsaXN0IG9mIHN1cHBvcnRlZCBhbmQga25vd24gY29kZWNzLgorCSAgRW1pdCB0YWcgd2l0aCB0aGUgY29kZWMgbmFtZSBzbyBpdCBnZXRzIHByb3Blcmx5IHJlcG9ydGVkIGluIHRvdGVtIGFuZAorCSAgb3RoZXIgYXBwbGljYXRpb25zLgorCisyMDA3LTExLTI1IDEwOjQ1OjA5ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMTYvNTddIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogT3V0cHV0IHNlZ21lbnQgd2l0aCBwcm9wZXIgJ3N0b3AnIHZhbHVlLCBtYWtlcyBmbHZkZW11eCAxMDAlIGNvbXBhdGlibGUgd2l0aCBnbm9ubGluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKGdzdF9mbHZfcGFyc2VfdGFnX2F1ZGlvKSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ192aWRlbyk6CisJICBPdXRwdXQgc2VnbWVudCB3aXRoIHByb3BlciAnc3RvcCcgdmFsdWUsIG1ha2VzIGZsdmRlbXV4IDEwMCUgY29tcGF0aWJsZQorCSAgd2l0aCBnbm9ubGluLgorCisyMDA3LTExLTEyIDE5OjIyOjI0ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMTUvNTddIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogQWRkIG1hcHBpbmcgZm9yIE5lbGx5bW9zZXIgQVNBTyBhdWRpbyBjb2RlYy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6CisJICBBZGQgbWFwcGluZyBmb3IgTmVsbHltb3NlciBBU0FPIGF1ZGlvIGNvZGVjLgorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX2F1ZGlvKSwgKGdzdF9mbHZfcGFyc2VfdGFnX3ZpZGVvKTogTWFrZSBzdXJlIHdlCisJICBhY3R1YWxseSBoYXZlIGRhdGEgdG8gcmVhZCBhdCB0aGUgZW5kIG9mIHRoZSB0YWcuIFRoaXMgYXZvaWRzIHRyeWluZworCSAgdG8gYWxsb2NhdGUgbmVnYXRpdmUgYnVmZmVycy4KKworMjAwNy0xMC0yMiAxNTo0NTo0OSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAxNC81N10gZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiBEb24ndCBlbWl0IG5vLW1vcmUtcGFkcyBmb3Igc2luZ2xlIHBhZCBzY2VuYXJpb3MgYXMgdGhlIGhlYWRlciBpcyBkZWZpbml0ZWx5IG5vdCByZWxpYWJsZS4gV2UgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDctMTAtMjIgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV90YWdfYXVkaW8pLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX3ZpZGVvKSwgKGdzdF9mbHZfcGFyc2VfdGFnX3R5cGUpOiBEb24ndAorCSAgZW1pdCBuby1tb3JlLXBhZHMgZm9yIHNpbmdsZSBwYWQgc2NlbmFyaW9zIGFzIHRoZSBoZWFkZXIKKwkgIGlzIGRlZmluaXRlbHkgbm90IHJlbGlhYmxlLiBXZSBlbWl0IHRoZW0gZm9yIDIgcGFkcyBzY2VuYXJpb3MKKwkgIHRob3VnaCB0byBzcGVlZCB1cCBtZWRpYSBkaXNjb3ZlcnkuCisKKzIwMDctMDktMjcgMTA6MDY6MjMgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMTMvNTddIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogSSBnb3QgaXQgd3JvbmcgYWdhaW4sIGF1ZGlvIHJhdGUgd2FzIG5vdCBkZXRlY3RlZCBjb3JyZWN0bHkgaW4gYWxsIGNhc2VzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA3LTA5LTI3ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKGdzdF9mbHZfcGFyc2VfdGFnX2F1ZGlvKSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ192aWRlbyk6IEkgZ290IGl0IHdyb25nIGFnYWluLCBhdWRpbyByYXRlCisJICB3YXMgbm90IGRldGVjdGVkIGNvcnJlY3RseSBpbiBhbGwgY2FzZXMuCisKKzIwMDctMDktMjYgMTY6MzA6NTAgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMTIvNTddIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogY29kZWNfZGF0YSBpcyBuZWVkZWQgZm9yIGV2ZXJ5IHRhZyBub3QganVzdCB0aGUgZmlyc3Qgb25lLiAoRml4IGEgc3R1cGlkIGJ1ZyBpIGludHJvZHVjZWQgd2l0aC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA3LTA5LTI2ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKGdzdF9mbHZfcGFyc2VfdGFnX2F1ZGlvKSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ192aWRlbyk6IGNvZGVjX2RhdGEgaXMgbmVlZGVkIGZvciBldmVyeSB0YWcKKwkgIG5vdCBqdXN0IHRoZSBmaXJzdCBvbmUuIChGaXggYSBzdHVwaWQgYnVnIGkgaW50cm9kdWNlZCB3aXRob3V0CisJICB0ZXN0aW5nKQorCisyMDA3LTA5LTI2IDExOjE3OjA4ICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgW01PVkVEIEZST00gQkFEIDExLzU3XSBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IEZpeCBiaXQgbWFza3Mgb3BlcmF0aW9ucyB0byBiZSBzdXJlIHdlIGRldGVjdCB0aGUgY29kZWNfdGFncyBhbmQgc2FtcGxlIHJhdGVzIGNvcnJlY3RseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNy0wOS0yNiAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IChnc3RfZmx2X3BhcnNlX3RhZ19hdWRpbyksCisJICAoZ3N0X2Zsdl9wYXJzZV90YWdfdmlkZW8pOiBGaXggYml0IG1hc2tzIG9wZXJhdGlvbnMgdG8gYmUKKwkgIHN1cmUgd2UgZGV0ZWN0IHRoZSBjb2RlY190YWdzIGFuZCBzYW1wbGUgcmF0ZXMgY29ycmVjdGx5LgorCSAgRml4IHJhdyBhdWRpbyBjYXBzIGdlbmVyYXRpb24uCisKKzIwMDctMDktMTIgMDg6Mzg6MjIgKzAwMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMTAvNTddIGdzdC86IFByaW50ZiBmb3JtYXQgZml4ZXMgKCM0NzYxMjgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUGV0ZXIgS2plbGxlcnN0ZWR0ICA8cGtqIGF0IGF4aXMgY29tPgorCSAgKiBnc3QtbGlicy9nc3QvYXBwL2dzdGFwcHNpbmsuYzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOgorCSAgKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6CisJICAqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOgorCSAgKiBnc3Qvc3dpdGNoL2dzdHN3aXRjaC5jOgorCSAgUHJpbnRmIGZvcm1hdCBmaXhlcyAoIzQ3NjEyOCkuCisKKzIwMDctMDgtMjcgMTQ6NTY6MDUgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMDkvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogTWFrZSBzdXJlIHdlIGluaXRpYWxpemUgdGhlIHNlZWsgcmVzdWx0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA3LTA4LTI3ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogKGdzdF9mbHZfZGVtdXhfaGFuZGxlX3NlZWtfcHVsbCk6CisJICBNYWtlIHN1cmUgd2UgaW5pdGlhbGl6ZSB0aGUgc2VlayByZXN1bHQuCisKKzIwMDctMDgtMjQgMTc6MDM6MTUgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMDgvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogUmVtb3ZlIHNvbWUgdXNlbGVzcyBpZmRlZi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNy0wOC0yNCAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X2ZsdXNoKSwKKwkgIChnc3RfZmx2X2RlbXV4X2NoYWluKSwgKGdzdF9mbHZfZGVtdXhfcHVsbF90YWcpLAorCSAgKGdzdF9mbHZfZGVtdXhfZmluZF9vZmZzZXQpLCAoZ3N0X2Zsdl9kZW11eF9oYW5kbGVfc2Vla19wdXNoKSwKKwkgIChnc3RfZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1bGwpLCAoZ3N0X2Zsdl9kZW11eF9zaW5rX2V2ZW50KSwKKwkgIChnc3RfZmx2X2RlbXV4X3NyY19ldmVudCk6IFJlbW92ZSBzb21lIHVzZWxlc3MgaWZkZWYuCisKKzIwMDctMDgtMjQgMTU6MzE6MjYgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMDcvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogSW1wbGVtZW50IHNlZWtpbmcgaW4gcHVzaCBtb2RlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA3LTA4LTI0ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogKGdzdF9mbHZfZGVtdXhfZmx1c2gpLAorCSAgKGdzdF9mbHZfZGVtdXhfY2xlYW51cCksIChnc3RfZmx2X2RlbXV4X2NoYWluKSwKKwkgIChnc3RfZmx2X2RlbXV4X3B1bGxfdGFnKSwgKGdzdF9mbHZfZGVtdXhfZmluZF9vZmZzZXQpLAorCSAgKGdzdF9mbHZfZGVtdXhfaGFuZGxlX3NlZWtfcHVzaCksCisJICAoZ3N0X2Zsdl9kZW11eF9oYW5kbGVfc2Vla19wdWxsKSwKKwkgIChnc3RfZmx2X2RlbXV4X3NpbmtfZXZlbnQpLCAoZ3N0X2Zsdl9kZW11eF9zcmNfZXZlbnQpOiBJbXBsZW1lbnQKKwkgIHNlZWtpbmcgaW4gcHVzaCBtb2RlLgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4Lmg6CisKKzIwMDctMDgtMjIgMTQ6NTA6NTEgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMDYvNTddIGdzdC9mbHYvOiBIYW5kbGUgcGl4ZWwgYXNwZWN0IHJhdGlvIHRocm91Z2ggbWV0YWRhdGEgdGFncyBsaWtlIEFTRiBkb2VzLiBGbHVlbmRvIG11eGVyIHN1cHBvcnRzIHRoaXMgYW5kCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDctMDgtMjIgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiAoZ3N0X2Zsdl9kZW11eF9jbGVhbnVwKSwKKwkgIChnc3RfZmx2X2RlbXV4X3B1bGxfdGFnKToKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5oOgorCSAgKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IChnc3RfZmx2X3BhcnNlX21ldGFkYXRhX2l0ZW0pLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX3NjcmlwdCksIChnc3RfZmx2X3BhcnNlX3RhZ19hdWRpbyksCisJICAoZ3N0X2Zsdl9wYXJzZV90YWdfdmlkZW8pOiBIYW5kbGUgcGl4ZWwgYXNwZWN0IHJhdGlvIHRocm91Z2gKKwkgIG1ldGFkYXRhIHRhZ3MgbGlrZSBBU0YgZG9lcy4gRmx1ZW5kbyBtdXhlciBzdXBwb3J0cyB0aGlzIGFuZAorCSAgRmxhc2ggcGxheWVycyBjYW4gc3VwcG9ydCBpdCBhcyB3ZWxsIHRoaXMgd2F5LgorCisyMDA3LTA4LTIyIDE0OjAzOjQyICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgW01PVkVEIEZST00gQkFEIDA1LzU3XSBnc3QvZmx2LzogTWFrZSBzdXJlIHdlIGRvbid0IHRyeSBmaWxsaW5nIHVwIHRoZSBpbmRleCBpZiBubyB0aW1lcyBvYmplY3Qgd2FzIHBhcnNlZC4gRml4IHRoZSB3YXkgd2UgZGVjaWRlIHRvIHB1c2ggdGEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNy0wOC0yMiAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X3B1bGxfdGFnKToKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoZ3N0X2Zsdl9wYXJzZV9tZXRhZGF0YV9pdGVtKSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ19zY3JpcHQpLCAoZ3N0X2Zsdl9wYXJzZV90YWdfYXVkaW8pLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX3ZpZGVvKTogTWFrZSBzdXJlIHdlIGRvbid0IHRyeSBmaWxsaW5nIHVwIHRoZQorCSAgaW5kZXggaWYgbm8gdGltZXMgb2JqZWN0IHdhcyBwYXJzZWQuIEZpeCB0aGUgd2F5IHdlIGRlY2lkZSB0bworCSAgcHVzaAorCSAgdGFncyBhbmQgZW1pdCBuby1tb3JlLXBhZHMuIEZpeCBzb21lIHByaW50ZiB0eXBpbmcgaW4gZGVidWdnaW5nLgorCisyMDA3LTA4LTE0IDE0OjU2OjIwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBbTU9WRUQgRlJPTSBCQUQgMDQvNTddIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogRml4IGxvY2tpbmcgYW5kIHJlZmNvdW50aW5nIG9uIHRoZSBpbmRleC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4LmM6IChnc3RfZmx2X2RlbXV4X3NldF9pbmRleCksCisJICAoZ3N0X2Zsdl9kZW11eF9nZXRfaW5kZXgpOgorCSAgRml4IGxvY2tpbmcgYW5kIHJlZmNvdW50aW5nIG9uIHRoZSBpbmRleC4KKworMjAwNy0wOC0xNCAxNDoyMjowOSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIFtNT1ZFRCBGUk9NIEJBRCAwMy81N10gZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiBGaXJzdCBtZXRob2QgZm9yIHNlZWtpbmcgaW4gcHVsbCBtb2RlIHVzaW5nIHRoZSBpbmRleCBidWlsdCBzdGVwIGJ5IHN0ZXAgb3IgY29taW5nIGZyb20gbWV0YWRhdGEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDctMDgtMTQgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5jOiAoZ3N0X2Zsdl9kZW11eF9jbGVhbnVwKSwKKwkgIChnc3RfZmx2X2RlbXV4X2FkYXB0ZXJfZmx1c2gpLCAoZ3N0X2Zsdl9kZW11eF9jaGFpbiksCisJICAoZ3N0X2Zsdl9kZW11eF9wdWxsX3RhZyksIChnc3RfZmx2X2RlbXV4X2RvX3NlZWspLAorCSAgKGdzdF9mbHZfZGVtdXhfaGFuZGxlX3NlZWspLCAoZ3N0X2Zsdl9kZW11eF9zaW5rX2V2ZW50KSwKKwkgIChnc3RfZmx2X2RlbXV4X3NyY19ldmVudCksIChnc3RfZmx2X2RlbXV4X3F1ZXJ5KSwKKwkgIChnc3RfZmx2X2RlbXV4X2NoYW5nZV9zdGF0ZSksIChnc3RfZmx2X2RlbXV4X3NldF9pbmRleCksCisJICAoZ3N0X2Zsdl9kZW11eF9nZXRfaW5kZXgpLCAoZ3N0X2Zsdl9kZW11eF9kaXNwb3NlKSwKKwkgIChnc3RfZmx2X2RlbXV4X2NsYXNzX2luaXQpOiBGaXJzdCBtZXRob2QgZm9yIHNlZWtpbmcgaW4gcHVsbAorCSAgbW9kZSB1c2luZyB0aGUgaW5kZXggYnVpbHQgc3RlcCBieSBzdGVwIG9yIGNvbWluZyBmcm9tIG1ldGFkYXRhLgorCSAgKiBnc3QvZmx2L2dzdGZsdmRlbXV4Lmg6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuYzogKEZMVl9HRVRfU1RSSU5HKSwKKwkgIChnc3RfZmx2X3BhcnNlX21ldGFkYXRhX2l0ZW0pLCAoZ3N0X2Zsdl9wYXJzZV90YWdfc2NyaXB0KSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ19hdWRpbyksIChnc3RfZmx2X3BhcnNlX3RhZ192aWRlbyk6IFBhcnNlCisJICBtb3JlIG1ldGFkYXRhIHR5cGVzIGFuZCBrZXlmcmFtZXMgaW5kZXguCisKKzIwMDctMDctMjUgMTM6Mjk6MDQgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMDIvNTddIGdzdC9mbHYvOiBIYW5kbGUgbm90IGxpbmtlZCBwYWRzLCB0cnkgdG8gbWFrZSBpdCByZXVzYWJsZSwgbW9yZSBzYWZldHkgY2hlY2tzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA3LTA3LTI1ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAoZ3N0X2Zsdl9kZW11eF9jaGFpbiksIChnc3RfZmx2X2RlbXV4X3B1bGxfdGFnKSwKKwkgIChnc3RfZmx2X2RlbXV4X2NoYW5nZV9zdGF0ZSksIChnc3RfZmx2X2RlbXV4X2Rpc3Bvc2UpLAorCSAgKGdzdF9mbHZfZGVtdXhfaW5pdCk6CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguaDoKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOiAoRkxWX0dFVF9TVFJJTkcpLAorCSAgKGdzdF9mbHZfcGFyc2VfbWV0YWRhdGFfaXRlbSksIChnc3RfZmx2X3BhcnNlX3RhZ19zY3JpcHQpLAorCSAgKGdzdF9mbHZfcGFyc2VfdGFnX2F1ZGlvKSwgKGdzdF9mbHZfcGFyc2VfdGFnX3ZpZGVvKSwKKwkgIChnc3RfZmx2X3BhcnNlX2hlYWRlcik6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuaDogSGFuZGxlIG5vdCBsaW5rZWQgcGFkcywgdHJ5IHRvIG1ha2UgaXQKKwkgIHJldXNhYmxlLCBtb3JlIHNhZmV0eSBjaGVja3MuCisKKzIwMDctMDctMTkgMTU6MDU6MzAgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBbTU9WRUQgRlJPTSBCQUQgMDEvNTddIEFkZHMgYSBmaXJzdCBkcmFmdCBvZiBhbiBGTFYgZGVtdXhlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNy0wNy0xOSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9mbHYvTWFrZWZpbGUuYW06CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzogKGdzdF9mbHZfZGVtdXhfZmx1c2gpLAorCSAgKGdzdF9mbHZfZGVtdXhfY2xlYW51cCksIChnc3RfZmx2X2RlbXV4X2NoYWluKSwKKwkgIChnc3RfZmx2X2RlbXV4X3B1bGxfdGFnKSwgKGdzdF9mbHZfZGVtdXhfcHVsbF9oZWFkZXIpLAorCSAgKGdzdF9mbHZfZGVtdXhfc2Vla190b19wcmV2X2tleWZyYW1lKSwgKGdzdF9mbHZfZGVtdXhfbG9vcCksCisJICAoZ3N0X2Zsdl9kZW11eF9zaW5rX2FjdGl2YXRlKSwKKwkgIChnc3RfZmx2X2RlbXV4X3NpbmtfYWN0aXZhdGVfcHVzaCksCisJICAoZ3N0X2Zsdl9kZW11eF9zaW5rX2FjdGl2YXRlX3B1bGwpLCAoZ3N0X2Zsdl9kZW11eF9zaW5rX2V2ZW50KSwKKwkgIChnc3RfZmx2X2RlbXV4X2NoYW5nZV9zdGF0ZSksIChnc3RfZmx2X2RlbXV4X2Rpc3Bvc2UpLAorCSAgKGdzdF9mbHZfZGVtdXhfYmFzZV9pbml0KSwgKGdzdF9mbHZfZGVtdXhfY2xhc3NfaW5pdCksCisJICAoZ3N0X2Zsdl9kZW11eF9pbml0KSwgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2Zsdi9nc3RmbHZkZW11eC5oOgorCSAgKiBnc3QvZmx2L2dzdGZsdnBhcnNlLmM6IChGTFZfR0VUX0JFVUkyNCksIChGTFZfR0VUX1NUUklORyksCisJICAoZ3N0X2Zsdl9kZW11eF9xdWVyeV90eXBlcyksIChnc3RfZmx2X2RlbXV4X3F1ZXJ5KSwKKwkgIChnc3RfZmx2X3BhcnNlX21ldGFkYXRhX2l0ZW0pLCAoZ3N0X2Zsdl9wYXJzZV90YWdfc2NyaXB0KSwKKwkgIChnc3RfZmx2X3BhcnNlX3RhZ19hdWRpbyksIChnc3RfZmx2X3BhcnNlX3RhZ192aWRlbyksCisJICAoZ3N0X2Zsdl9wYXJzZV90YWdfdHlwZSksIChnc3RfZmx2X3BhcnNlX2hlYWRlcik6CisJICAqIGdzdC9mbHYvZ3N0Zmx2cGFyc2UuaDogQWRkcyBhIGZpcnN0IGRyYWZ0IG9mIGFuIEZMViBkZW11eGVyLgorCSAgSXQgZG9lcyBub3QgZG8gc2Vla2luZyB5ZXQsIGl0IHN1cHBvcnRzIHB1bGwgYW5kIHB1c2ggbW9kZSBzbworCSAgWUVTCisJICB5b3UgY2FuIHVzZSBpdCB0byBwbGF5IHlvdXR1YmUgdmlkZW9zIGRpcmVjdGx5IGZyb20gYW4gSFRUUCB1cmkuCisJICBOb3Qgc28gbXVjaCB0ZXN0aW5nIGRvbmUgeWV0IGJ1dCBpdCBwYXJzZXMgbWV0YWRhdGEsIHJlcGx5IHRvCisJICBkdXJhdGlvbiBxdWVyaWVzLCBldGMuLi4KKworMjAwOS0wNS0xMiAxMzowMDo0NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICBydHA6IExpbmsgdG8gLWxtCisJICBGaXhlcyBidWcgIzU4MjI4MS4KKworMjAwOS0wNS0xMiAxMToxNjo0OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzoKKwkgIHJnYW5hbHlzaXM6IFJlbW92ZSBpbnZhbGlkIHVuaXQgdGVzdAorCSAgVGhlIHRlc3QgY3JlYXRlcyBidWZmZXJzIHdpdGggbm9uLXNpbGVuY2UsIHNldHMgdGhlIEdBUAorCSAgZmxhZyBvbiBpdCBhbmQgZXhwZWN0cyByZ2FuYWx5c2lzIHRvIGlnbm9yZSB0aGUgY29udGVudCBhbmQgYXNzdW1lIHNpbGVuY2UuCisJICBUaGF0J3Mgbm90IHRoZSB3YXkgaG93IEdBUCBidWZmZXJzIHNob3VsZCBiZSB1c2VkLCBpZiB0aGUgR0FQIGZsYWcgaXMgc2V0CisJICBlbGVtZW50cyAqY2FuKiBhc3N1bWUgdGhhdCB0aGV5IG9ubHkgY29udGFpbiBzaWxlbmNlIGJ1dCB0aGV5J3JlIG5vdCAqcmVxdWlyZWQqCisJICB0byBhc3N1bWUgdGhhdC4gVGhlIEdBUCBmbGFnIG11c3Qgb25seSBiZSBzZXQgb24gc2lsZW5jZSBidWZmZXJzLgorCSAgRml4ZXMgYnVnICM1ODIyNTIuCisKKzIwMDktMDUtMTIgMDA6NDg6NDkgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogQ2hhbmdlTG9nOgorCSogY29uZmlndXJlLmFjOgorCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIDAuMTAuMTQuMiBwcmUtcmVsZWFzZQorCisyMDA5LTA1LTExIDIzOjEzOjIwICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIHRlc3RzL2ZpbGVzL01ha2VmaWxlLmFtOgorCSAgY2hlY2tzOiBkaXN0IGlkMy01Nzc0NjgtdW5zeW5jZWQtdGFnLnRhZyB0ZXN0IGZpbGUKKworMjAwOS0wNS0xMSAyMTowMjoyNyArMDIwMCAgVHJpc3RhbiBNYXR0aGV3cyA8bGUuYnVzaW5lc3NtYW4gYXQgZ21haWwuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogaW5pdGlhbGl6ZSB2YXJpYWJsZSB0byAwCisJICBGaXhlcyAjNTgyMjE4LgorCisyMDA5LTA1LTExIDE4OjIxOjEzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBtYXRyb3NrYWRlbXV4OiBPbmx5IHNlYXJjaCBmb3IgdGhlIGluZGV4IGVudHJ5IG9uY2UKKworMjAwOS0wNS0xMSAxODoxODozNiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogVXNlIHRoZSBmaXJzdCBpbmRleCBlbnRyeSBpZiBpdCdzIGFmdGVyIHRoZSBzZWVrIHBvc2l0aW9uCisKKzIwMDktMDUtMTEgMTg6MTU6MjIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogVXNlIHRoZSBmaXJzdCBlbnRyeSBmb3IgYSBnaXZlbiBzdHJlYW0gaWYgdGhlIGZpcnN0IGVudHJ5IGlzIGFmdGVyIHRoZSBzZWVrIHBvc2l0aW9uCisKKzIwMDktMDUtMTEgMTY6NTA6NDggKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogVXNlIGJpbmFyeSBzZWFyY2ggZm9yIGZpbmRpbmcgdGhlIHJlcXVlc3RlZCBpbmRleCBlbnRyeSB3aGVuIHNlZWtpbmcKKworMjAwOS0wNS0xMSAxNTozNjo0NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgbWF0cm9za2FkZW11eDogSW1wcm92ZS9vcHRpbWl6ZSBzZWVraW5nCisJICBGaXJzdCBvZiBhbGwgYSBrZXlmcmFtZSBzZWVrIHNob3VsZCBiZSBkb25lIHRvIHRoZQorCSAga2V5ZnJhbWUgcmlnaHQgYmVmb3JlIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gYW5kIG5vdAorCSAgdG8gdGhlIGtleWZyYW1lIHRoYXQgaXMgbmVhcmVzdCB0byB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uLgorCSAgVXNlIHBlciB0cmFjayBpbmRleCBhcnJheXMgYW5kIHVzZSBvdXIgbmV3IGJpbmFyeSBzZWFyY2ggZnVuY3Rpb24KKwkgIGZyb20gY29yZSB0byBzcGVlZCB1cCB0aGUgc2VhcmNoLgorCisyMDA5LTA1LTExIDE1OjM2OjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29uZmlndXJlLmFjOgorCSAgUmVxdWlyZSByZWxlYXNlZCB2ZXJzaW9ucyBvZiBjb3JlL2Jhc2UKKworMjAwOS0wNS0xMSAxMDoxNTowMCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgZ2RrcGl4YnVmOiBVc2UgdGhlIGxpYnMgYW5kIGNmbGFncyBvZiBnZGsgcGl4YnVmIGluc3RlYWQgb2YgZ3RrCisJICBUaGlzIGZpeGVzIHRoZSBidWlsZCBpZiBnZGstcGl4YnVmIGlzIGZvdW5kIGJ1dCBndGsgaXNuJ3QKKworMjAwOS0wNS0xMSAwOTo1ODo0OCArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEFsd2F5cyBkZWZpbmUgdGhlIGNvbmRpdGlvbmFsIEhBVkVfR1RLIHRvIGZpeCBjb25maWd1cmUgaW4gc29tZSBjYXNlcworCisyMDA5LTA1LTEwIDExOjE3OjIzICswMjAwICBNYXJjLUFuZHJlIEx1cmVhdSA8bWFyY2FuZHJlLmx1cmVhdUBnbWFpbC5jb20+CisKKwkqIGF1dG9nZW4uc2g6CisJICBSdW4gbGlidG9vbGl6ZSBiZWZvcmUgYWNsb2NhbAorCSAgVGhpcyB1bmJyZWFrcyB0aGUgYnVpbGQgaW4gc29tZSBjYXNlcy4gRml4ZXMgYnVnICM1ODIwMjEKKworMjAwOS0wNS0wOSAxMDo1MDo0NSAtMDcwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2E6IGZpeCBwcmludGYgZm9ybWF0IHRvIGFncmVlIHdpdGggYXJndW1lbnQKKworMjAwOS0wNS0wOCAxOTo0MjoxMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jOgorCSAgcmF3MTM5NDogaW5jbHVkZSBzdGRsaWIuaCBmb3Igc3RydG9sKCkKKwkgIEZpeGVzIGNvbXBpbGVyIHdhcm5pbmcgd2hlbiBjb21waWxpbmcgd2l0aCB4bWwgc3R1ZmYgaW4gY29yZSBkaXNhYmxlZC4KKworMjAwOS0wNS0wOCAxNjo0MDo1NyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogQWN0dWFsbHkgb3V0cHV0IHRoZSBwZW5kaW5nIGJ1ZmZlci4uIGFuZCBub3QgYSBibGFuayBvbmUuCisJICBJdCB3YXMgcHJldmlvdXNseSBzZW5kaW5nIHRoZSBib2d1cyBidWZmZXIgd2hpY2ggd2FzIHJldHVybmVkIGZyb20KKwkgIHRoZSBidWZmZXJhbGxvYyAocmVxdWlyZWQgZm9yIHJldmVyc2UgbmVnb3RpYXRpb24gYXBwYXJlbnRseSkgaW5zdGVhZAorCSAgb2YgdGhlIHBlbmRpbmcgYnVmZmVyLgorCisyMDA5LTA1LTA4IDEyOjAwOjU3ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIHNvdXBodHRwc3JjOiBBbGxvdyBub24tc3RyaW5nIGZpZWxkcyBpbiB0aGUgZXh0cmEtaGVhZGVycyBwcm9wZXJ0eQorCisyMDA5LTA1LTA4IDExOjM1OjAyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrZGVwYXkuaDoKKwkgIHJ0ajJrZGVwYXk6IGFkZCBiYXNpYyBKUEVHIDIwMDAgZGVwYXlsb2FkZXIKKworMjAwOS0wNS0wOCAxMTozMTowMiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkgIHJ0cGoya3BheTogc2V0IG1hcmtlciBiaXQgY29ycmVjdGx5CisKKzIwMDktMDUtMDggMTE6Mjk6MDQgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaDoKKwkgIHNvdXBodHRwc3JjOiBBZGQgc3VwcG9ydCBmb3IgZXh0cmEtaGVhZGVycyBhcHBlbmRlZCB0byB0aGUgSFRUUCByZXF1ZXN0CisJICBUaGlzIGFsbG93cyB0byBzZXQgdGhlIFJlZmVyZXIgaGVhZGVyIGFtb25nIG90aGVyIHRoaW5ncyBieQorCSAgYWRkaW5nIGEgImV4dHJhLWhlYWRlcnMiIHByb3BlcnR5IHRoYXQgdGFrZXMgYSBHc3RTdHJ1Y3R1cmUKKwkgIHdpdGggZmllbGQ9c3RyaW5nIHBhaXJzLgorCSAgRml4ZXMgYnVnICM1ODE4MDYuCisKKzIwMDktMDUtMDggMTA6Mzg6NDIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHBqMmtwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwajJrcGF5Lmg6CisJICBydHBqMmtwYXk6IGFkZCBhIHNpbXBsZSBKUEVHIDIwMDAgcGF5bG9hZGVyCisKKzIwMDktMDUtMDggMTA6MzE6MTIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgcnRwanBlZ3BheTogd2Ugb25seSBuZWVkIHRvIHN3YXAgYml0cyBvbiBMRQorCisyMDA5LTA1LTA3IDE4OjEwOjA4ICswMTAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPGNocmlzdGlhbi5zY2hhbGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWcuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXguYzoKKwkqIGdzdC9hdmkvZ3N0YXZpLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBBZGQgUkFOS1MgZm9yIHZhcmlvdXMgZW5jb2RlcnMgYW5kIG11eGVycworCisyMDA5LTA1LTA3IDE3OjA5OjQ0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IGFkZCBzb21lIGRlYnVnZ2luZworCisyMDA5LTA1LTA3IDE1OjU4OjQzICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IHBhcnNlIHhpcGggaGVhZGVycyBsZW5ndGggY29ycmVjdGx5CisJICBTZWUgIzU4MDk4MAorCisyMDA5LTA1LTA3IDE2OjI1OjQxICswMjAwICBHYWJyaWVsIEJvdXZpZ25lIDxib3V2aWduZUBtcDMtdGVjaC5vcmc+CisKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuYzoKKwkqIGdzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuaDoKKwkqIGdzdC9yZXBsYXlnYWluL3JnYW5hbHlzaXMuYzoKKwkqIGdzdC9yZXBsYXlnYWluL3JnYW5hbHlzaXMuaDoKKwkgIHJnYW5hbHlzaXM6IEFkZCBhYmlsaXR5IHRvIHBvc3QgbGV2ZWwgbWVzc2FnZXMKKwkgIEZpeGVzIGJ1ZyAjNTgxNTY4LgorCisyMDA5LTA1LTA2IDIzOjU2OjQ0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYzoKKwkgIHJ0cGpwZWdwYXk6IHJlZnVzZSBzb21lIHVuc3VwcG9ydGVkIGpwZWcgZm9ybWF0cworCisyMDA5LTA1LTA2IDE4OjA2OjQ5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgcnRwdGhlb3JhcGF5OiBmaXggZGVzY3JpcHRpb24KKworMjAwOS0wNS0wNiAxNjowOToxMyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJICBydHBqcGVncGF5OiByZXdyaXRlIHF1YW50IHRhYmxlIGhhbmRsaW5nCisJICBSZXdyaXRlIHRoZSBxdWFudCB0YWJsZSBwYXJzaW5nIHRvIGFsc28gaGFuZGxlIG11bHRpcGxlIHRhYmxlcyBpbiBvbmUgSlBFRyBIRFEKKwkgIHNlZ21lbnQuCisJICBIYW5kbGUgbW9yZSBqcGVnIHR5cGVzIGJ5IGtlZXBpbmcgdHJhY2sgb2YgdGhlIHRhYmxlcyB1c2VkIHBlciBjb21wb25lbnQgYW5kCisJICBwdXR0aW5nIHRoZSB1c2VkIG9uZXMgaW4gdGhlIHF1YW50IGhlYWRlcnMuCisKKzIwMDktMDQtMTggMTc6MjM6NTEgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzdjJtdXguYzoKKwkgIGlkM3YybXV4OiBNYWtlIHRoZSB0ZXN0IGZhaWx1cmUgc2xpZ2h0bHkgbW9yZSBpbmZvcm1hdGl2ZQorCisyMDA5LTA0LTIwIDE4OjMzOjA5ICswMTAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWM6IE1ha2UgYnVmZmVycyBjcmVhdGVkIGR1cmluZyBzZWVrIGFjdCBsaWtlIG5vcm1hbCBidWZmZXJzLgorCSAgU3RvcmUgdGhlIG9mZnNldCBhbmQgY2FwcyB3aGVuIGFsbG9jYXRpbmcgYSBidWZmZXIgZHVyaW5nIHNlZWtpbmcsIGFuZCB0aGVuCisJICBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgd2l0aCBidWZmZXJfYWxsb2MgYmVmb3JlIHdlIHB1c2ggaXQgb3V0LiBUaGlzIGVuc3VyZXMKKwkgIHRoYXQgaW4gYWxsIHJlc3BlY3RzIHRoZSBmaXJzdCBidWZmZXIgZGVjb2RlZCBkdXJpbmcgc2Vla2luZyBiZWhhdmVzIGxpa2UKKwkgIGFsbCBvdGhlciBidWZmZXJzLCBpbmNsdWRpbmcgYWxsb3dpbmcgZG93bnN0cmVhbSByZS1uZWdvdGlhdGlvbi4KKworMjAwOS0wNC0xOCAxODowMDo1NCArMDIwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGZsYWNkZWM6IGRvbid0IHVzZSBwYWRfYWxsb2Mgd2hlbiBkZWNvZGluZyB3aGlsZSBzZWVraW5nLiBGaXhlcyAjNTc5NDIyCisKKzIwMDktMDUtMDYgMTM6MjI6NTEgKzAyMDAgIEFybm91dCBWYW5kZWNhcHBlbGxlIDxhcm5vdXRAbWluZC5iZT4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAganBlZ2RlYzogcmVmYWN0b3JlZCBnc3RfanBlZ19kZWNfcGFyc2VfaW1hZ2VfZGF0YQorCSAgRml4ZXMgIzU3OTgwOAorCisyMDA5LTA1LTA2IDEzOjExOjUzICswMjAwICBBcm5vdXQgVmFuZGVjYXBwZWxsZSA8YXJub3V0QG1pbmQuYmU+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IHN1cHBvcnQgYWRkaXRpb25hbCAweGZmIGJlZm9yZSBlbmQgbWFya2VyLgorCSAgSlBFRyBtYXJrZXJzIG1heSBiZSBwcmVjZWRlZCBieSBhZGRpdGlvbmFsIDB4ZmYuICBqcGVnZGVjIHNob3VsZAorCSAgc2tpcCBvdmVyIHRoZXNlLCBldmVuIGJlZm9yZSB0aGUgZW5kIG1hcmtlci4KKwkgIFNlZSAjNTc5ODA4CisKKzIwMDktMDUtMDYgMTI6NTQ6MjIgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgcnRwanBlZ3BheTogaGFuZGxlIGlucHV0IHdpdGggMSBxdWFudCB0YWJsZQorCSAgQWxzbyBoYW5kbGUgaW5wdXQgd2l0aCBqdXN0IG9uZSBxdWFudCB0YWJsZSwgc2ltcGx5IGR1cGxpY2F0ZSB0aGUgcXVhbnQgdGFibGUuCisJICBIYW5kbGUgaW52YWxpZCBTT0YgY29ycmVjdGx5IGFuZCBzb21lIHNtYWxsIGNsZWFudXBzLgorCSAgRml4ZXMgIzU3ODI1NworCisyMDA5LTA0LTI5IDE1OjU4OjEwICswMzAwICBNYXJjbyBCYWxsZXNpbyA8bWFyY28uYmFsbGVzaW9Abm9raWEuY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBmaXggYnl0ZSBvcmRlciBzd2FwcGluZyBpbiAzR1BQIGNsYXNzaWZpY2F0aW9uIGVudGl0eSB0YWcKKwkgIEZpeGVzICM1ODA3NDYuCisKKzIwMDktMDUtMDUgMTc6MDc6MTMgKzAyMDAgIEFybm91dCBWYW5kZWNhcHBlbGxlIDxhcm5vdXRAbWluZC5iZT4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSAgbXVsdGlwYXJ0ZGVtdXg6IGF2b2lkIHJlYWRpbmcgZnJvbSBpbmF2bGlkIG1lbW9yeQorCSAgUmVhZCB0aGUgdGltZXN0YW1wIG9mIHRoZSBpbmNvbW1pbmcgYnVmZmVyIGJlZm9yZSB3ZSBwdXNoIGl0IGluIHRoZSBhZGFwdGVyIGFuZAorCSAgZmx1c2ggaXQgb3V0IGFnYWluIGFzIHRoZSBidWZmZXIgbWlnaHQgYmUgdW5yZWZmZWQgdGhlbiBhbmQgd2UgcmVhZCBmcm9tIGludmFsaWQKKwkgIG1lbW9yeS4KKwkgIEZpeGVzICM1ODE0NDQuCisKKzIwMDktMDUtMDUgMTc6MDM6MjkgKzAyMDAgIEFybm91dCBWYW5kZWNhcHBlbGxlIDxhcm5vdXRAbWluZC5iZT4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSAgbXVsdGlwYXJ0ZGVtdXg6IGRvbid0IGxlYWsgZHluYW1pYyBwYWRzCisJICBGcmVlIHRoZSBkeW5hbWljIHBhZHMgZGF0YSBpbiBmaW5hbGl6ZS4KKwkgIEZpeGVzICM1ODE0MzIKKworMjAwOS0wNS0wNSAxNjozMjoxNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdwYXkuaDoKKwkgIHJ0cGpwZWdwYXk6IGNvcnJlY3RseSBzZXQgdGhlIHR5cGUgaGVhZGVyCisJICBEb24ndCByZXF1aXJlIHdpZHRoL2hlaWdodCBvbiB0aGUgY2Fwcy4gVXNlIHRoZSBTT0YgaGVhZGVyIHRvIGZpbmQgd2lkdGgvaGVpZ2h0CisJICBhbmQgZmFsbCBiYWNrIHRvIHRoZSBjYXBzIGlmIHRoZXJlIGlzIG5vIFNPRi4gQWxzbyB1c2UgdGhlIFNPRiBpbmZvIHRvIGZpbmQgdGhlCisJICBzdWJzYW1wbGluZyBhbmQgcXVhbnRpemF0aW9uIHRhYmxlcyB1c2VkLiBUaGlzIGFsbG93cyB1cyB0byBzZXQgdGhlIHJpZ2h0IHR5cGUKKwkgIHZhbHVlIGluIHRoZSBKUEVHIHJ0cCBoZWFkZXIuCisJICBEZXByZWNhdGUgdGhlIHF1YWxpdHkgcHJvcGVydHksIGl0J3MgdW51c2VkIG5vdyBhbmQgaXQgd2FzIHVzZWQgd3JvbmdseSBiZWZvcmUuCisJICBBbHdheXMgc2VuZCBmdWxsIHF1YW50IHRhYmxlcyBmb3Igbm93IHVudGlsIHdlIGhhdmUgc29tZSBjb2RlIHRvIGRldGVjdCBkZWZhdWx0CisJICBvbmVzLgorCSAgRml4ZXMgIzU4MDg4MAorCisyMDA5LTA1LTA1IDE2OjI4OjQ0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuaDoKKwkgIHJ0cGpwZWdkZXBheTogdXNlIHdpZHRoL2hlaWdodCBmcm9tIHBheWxvYWQKKwkgIFVzZSB0aGUgd2lkdGggYW5kIHRoZSBoZWlnaHQgZnJvbSB0aGUgcGF5bG9hZCBoZWFkZXJzIGFuZCBzZXQgdGhlbSBvbiB0aGUKKwkgIG91dHB1dCBjYXBzIGZvciBhZGRlZCBhd2Vzb21lbmVzcy4KKwkgIEZpeCBxdWFudCBwYXJzaW5nLCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSB0eXBlIGluIHRoZSBsb3dlciA2IGJpdHMuCisJICBBZGQgZmlyc3QgYml0cyBvZiBjYWNoaW5nIHF1YW50aXphdGlvbiB0YWJsZXMuCisKKzIwMDktMDUtMDUgMTY6MjQ6MTYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IHNldCBjb2xvcnNwYWNlIGJlZm9yZSBfc2V0X2RlZmF1bHRzKCkKKwkgIFRoZSBsaWJqcGVnIGFwaSBzYXlzIHRoYXQgd2UgbmVlZCB0byBzZXQgdGhlIGNvbG9yc3BhY2UgYmVmb3JlIHdlIGNhbGwKKwkgIF9zZXRfZGVmYXVsdHMoKS4gSW5kZWVkLCBpZiB3ZSBkb24ndCBkbyB0aGF0IHdlIGVuZCB1cCB3aXRoIHNvbWUgdmVyeSBmcmVha3kKKwkgIG5vbi1zdGFuZGFyZCBxdWFudCB0YWJsZSBhbmQgaHVmZm1hbiB0YWJsZSBpbmRleGVzLgorCisyMDA5LTA1LTA1IDEzOjE5OjE5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvTWFrZWZpbGUuYW06CisJICB0ZXN0czogZG9uJ3QgYnVpbGQgZXhhbXBsZXMgaWYgLS1kaXNhYmxlLWV4YW1wbGVzIHdhcyBwYXNzZWQgdG8gY29uZmlndXJlCisKKzIwMDktMDUtMDUgMTI6MzM6NTcgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmU6IGNsZWFuIHVwIG1lc3MgYXJvdW5kIGd0aysgY2hlY2tpbmcKKwkgIEFuZCBkb24ndCBjaGVjayBmb3IgZ3RrKyB3aGVuIGl0J3Mgbm90IG5lZWRlZCAoaWUuIGlmIGV4YW1wbGVzIGFyZSBkaXNhYmxlZCkKKworMjAwOS0wNS0wNSAxMjoyNzoyMSArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9nZGtfcGl4YnVmL01ha2VmaWxlLmFtOgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuaDoKKwkgIGNvbmZpZ3VyZTogbWFrZSBnZGstcGl4YnVmIHBsdWdpbiBkZXBlbmQgb25seSBvbiBnZGstcGl4YnVmLCBub3QgZ3RrKworCisyMDA5LTA1LTA0IDE4OjU1OjEyICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBGaXggZmluZF9zdHJlYW1fYnlfKiBmdW5jdGlvbnMKKwkgIEZpeCB2YXJpb3VzIHZlcnNpb24gb2YgZmluZF9zdHJlYW1fYnlfKiBieSBub3QgdHJ5aW5nIHRvIGNvbnZlcnQgYW4gaW50IHRvIGEKKwkgIHBvaW50ZXIgYW5kIHZpY2UgdmVyc2EsIGZvciBwb3J0YWJpbGl0eSByZWFzb25zLgorCSAgRml4ZXMgIzU4MTMzMworCisyMDA5LTA1LTA0IDE4OjMyOjA1ICswMjAwICBDaHJpcyBXaW50ZXIgPGVsd2ludHJvIGF0IGdtYWlsLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IGR1bW15IG5hdCBwYWNrZXQgbG9naWMKKwkgIEZpeCBhIHR5cG8gaW4gdGhlIGR1bW15IE5BVCBwYWNrZXQgc2VuZGluZyBjb2RlLgorCSAgRml4ZXMgIzU4MTMyOQorCisyMDA5LTA0LTMwIDEwOjI0OjI3ICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYXZvaWQgZXJyb3JzIGFmdGVyIHNlcnZlciBlb2YKKwkgIFNlcnZlciBlb2YgKGUuZy4gY29ubmVjdGlvbiBjbG9zZWQpIGlzIGFubm91bmNlZCBhcyBjb25uZWN0aW9uIGNsb3NlZCwKKwkgIHNvIGJldHRlciByZWNvcmQgc3RhdGUgYW5kIGFjdCBhY2NvcmRpbmdseSB0byBwcmV2ZW50IChyZWFkL3dyaXRlKQorCSAgZXJyb3JzIGR1cmluZyBzdWJzZXF1ZW50IHRlYXJkb3duL2NsZWFudXAgc2VxdWVuY2VzLiAgI0ZpeGVzIDU4MDg1MS4oYykuCisKKzIwMDktMDQtMzAgMTA6MTk6MjcgKzAyMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBhbHNvIHNldCBiYXNlX3RpbWUgb24gc3JjIGFmdGVyIGZsdXNoCisJICB0aW1lc3RhbXBzIGZvbGxvd2luZyBmbHVzaC9zZWVrIHNob3VsZCBiZSBjb25zaXN0ZW50IGJldHdlZW4KKwkgIFVEUCBhbmQgVENQIGludGVybGVhdmVkIGNhc2UuICBGaXhlcyAjNTgwODUxLihiKS4KKworMjAwOS0wNC0zMCAxMDoxNzoyMyArMDIwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IHNhbml0eSBjaGVja3Mgb24gcmFuZ2UgaW5mbworCSAgQSBtYXggcmFuZ2UgdGhhdCBvdmVyZmxvd3Mgc2hvdWxkIG5vdCBiZSB0cnVzdGVkLAorCSAgbm9yIHNob3VsZCBhIG1heCByYW5nZSB0aGF0IGVxdWFscyB0aGUgbWluIHJhbmdlLgorCSAgRml4ZXMgIzU4MDg1MS4oYSkuCisKKzIwMDktMDUtMDQgMTY6MTY6NTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IHVzZSBTS0lQIGZsYWcgdG8gdXNlIFNDQUxFIGhlYWRlcnMKKwkgIFdlIGNhbiB1c2UgdGhlIFNLSVAgc2VlayBmbGFnIHRvIGluc3RydWN0IHRoZSBzZXJ2ZXIgdG8gc2VuZCBkYXRhIGZhc3RlciB0aGVuCisJICBub3JtYWwgYnV0IHdpdGggdGhlIHNhbWUgYmFuZHdpZHRoLgorCSAgRml4ZXMgIzUzNzYwOQorCisyMDA5LTA1LTA0IDE0OjE5OjIyICswMjAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyby5kQGdtYWlsLmNvbT4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJICBzcGVleGRlYzogbWFrZSBzcGVleF9kZWNfY29udmVydCB3b3JrIHdpdGggc2FtZS1mb3JtYXQgdmFsdWVzIHdoZW4gbm8gZGF0YSBoYXMgYmVlbiBkZWNvZGVkLgorCisyMDA5LTA1LTA0IDEyOjQzOjQyICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhYzogSW1wbGVtZW50IHByZXNldCBpbnRlcmZhY2UKKworMjAwOS0wNS0wNCAxMjo0MTo1NiArMDIwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgc3BlZXg6IEltcGxlbWVudCBwcmVzZXQgaW50ZXJmYWNlCisKKzIwMDktMDUtMDQgMTI6NDA6MTIgKzAyMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6CisJICB3YXZwYWNrOiBJbXBsZW1lbnQgcHJlc2V0IGludGVyZmFjZQorCisyMDA5LTA1LTA0IDEyOjM1OjE5ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiB1c2UgYmluYXJ5IHNlYXJjaCBmb3IgaW5kZXgKKwkgIFVzZSB0aGUgbmV3IGJpbmFyeSBzZWFyY2ggbWV0aG9kIGZvciBmaW5kaW5nIHRoZSByaWdodCBpbmRleCBlbnRyeSBmYXN0ZXIuCisKKzIwMDktMDUtMDQgMTE6MjY6NTYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgdmlkZW9ib3g6IGRyYXcgdGhlIGNvbXBsZXRlIFUgYW5kIFYgcGxhbmVzCisJICBSb3VuZCB1cCB0aGUgc2NhbGVkIFUgYW5kIFYgd2lkdGggYW5kIGhlaWdodCBzbyB0aGF0IHdlIGFsd2F5cyBkcmF3IHRoZSBjb3JyZWN0CisJICBhbW91bnQgb2YgcGl4ZWxzIHRvIGZpbGwgdGhlIGNvbXBsZXRlIGltYWdlLgorCSAgRml4ZXMgIzU2OTYxMQorCisyMDA5LTA1LTAxIDE5OjM1OjExICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBhZGQgc29tZSBtb3JlIG1pY3JvIG9wdGltaXNhdGlvbnMKKworMjAwOS0wNC0zMCAxODo0MTo0NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X3R5cGVzLmM6CisJICBxdGRlbXV4OiBtaWNybyBvcHRpbWl6ZSBxdGRlbXV4IGEgbGl0dGxlCisJICBTcHJpbmtsZSBzb21lIEdfTElLRUxZIGFyb3VuZC4KKwkgIEF2b2lkIHRyYXZlcnNpbmcgYW5kIGR1bXBpbmcgdGhlIHRyZWUgd2hlbiBkZWJ1Z2dpbmcgaXMgbm90IGFjdGl2YXRlZC4KKworMjAwOS0wNC0zMCAxNDoyMjoyNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkgIHF0ZGVtdXg6IGFkZCBzdXBwb3J0IGZvciBzdWJ0aXRsZSBwaWN0dXJlcworCSAgQWRkIHN1cHBvcnQgZm9yIHN1YnRpdGxlIHBpY3R1cmVzLgorCSAgRml4ZXMgIzU2ODI3OC4KKworMjAwOS0wNC0zMCAxMDozMjozOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBtYWtlIHN1cmUgd2UgYWx3YXlzIHNpZ25hbCB3YWl0ZXJzCisJICBBbHdheXMgc2lnbmFsIHRoZSB3YWl0ZXJzIGluIHRoZSBhc3luYyBjYWxsYmFja3MuIEVzcGVjaWFsbHkgZm9yIHRoZSB2b2x1bWUKKwkgIGNhbGxiYWNrcyBzaW5jZSB0aGlzIG1pZ2h0IGNhdXNlIGRlYWRsb2Nrcy4KKworMjAwOS0wNC0yOSAxODowOTowNyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcmVsZWFzZSBzdGF0ZSBsb2NrIGJlZm9yZSBzdG9wcGluZyB0YXNrCisJICBXZSBuZWVkIHRvIHJlbGVhc2UgdGhlIHN0YXRlIGxvY2sgYmVmb3JlIHRyeWluZyB0byB3YWl0IGZvciB0aGUgdGFzayB0byBlbmQKKwkgIGJlY2F1c2UgdGhlIHRhc2sgbWlnaHQgYWxzbyB0YWtlIHRoZSBsb2NrLgorCSAgRml4ZXMgIzU3NzY3MQorCisyMDA5LTA0LTI5IDEyOjE5OjI3ICswMjAwICBIYW5zIGRlIEdvZWRlIDxqd3JkZWdvZWRlIGF0IGZlZG9yYXByb2plY3Qub3JnPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBoYW5kbGUgYWMtMyBhdWRpbworCSAgZml4IGRlbXV4aW5nIG9mIG00diBzdHJlYW1zIHdpdGggYWMtMyBhdWRpbworCSAgRml4ZXMgIzU4MDU1NAorCisyMDA5LTA0LTI5IDExOjEyOjM2ICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgZmxhY2VuYzogVXNlIHRoZSB0YWcgbWVyZ2UgbW9kZSB0aGF0IHdhcyBzZXQgb24gdGhlIGludGVyZmFjZSBmb3IgbWVyZ2luZyB0YWcgZXZlbnRzCisKKzIwMDktMDQtMjUgMDk6NDM6MzggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHBzcmM6IGZpeCBnZXRhZGRyaW5mbyBlcnJvciByZXBvcnRpbmcKKwkgIGdldGFkZHJpbmZvIGVycm9ycyBzaG91bGQgYmUgcmVwb3J0ZWQgd2l0aCBnYWlfc3RyZXJyb3IgaW5zdGVhZCBvZiBlcnJubyBhcworCSAgc3BvdHRlZCBieSBNaWtlUy4KKworMjAwOS0wNC0yNyAxMDowODozOSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJICBnNzI2cGF5OiBmaXggY29tcGlsYXRpb24KKworMjAwOS0wNC0yNyAxMDowMjowNiArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZwYXkuaDoKKwkgIGc3MjZwYXk6IGFkZCBSRkMgY29tcGxpYW50IHBhY2tldGl6aW5nCisJICBTaHVmZmxlIHRoZSBpbnB1dCBiaXRzIGFjY29yZGluZyB0byBSRkMgMzU1MSBmb3IgRzcyNiBwYXlsb2Fkcy4KKwkgIEFkZCBvcHRpb24gdG8gZm9yY2UgdGhlIHByZXZpb3VzIGJlaGF2aW91ci4KKwkgIEZpeGVzICM1NjcxNDAKKworMjAwOS0wNC0yNyAwOTo1OTo1NCArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkgIGc3MjZkZXBheTogYWRkIGRlYnVnIGNhdGVnb3J5CisJICBBZGQgYSBkZWJ1Z2dpbmcgY2F0ZWdvcnksIGFkZCBzb21lIGNvbW1lbnRzIGFuZCByZW1vdmUgX3BlZWtfcGFyZW50KCkuCisKKzIwMDktMDQtMjYgMTU6NTk6NTAgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBpZDN2Mm11eDogd2UgbmVlZCB0YWdsaWIgMS41IGZvciBJRDN2Mjo6UmVsYXRpdmVWb2x1bWVGcmFtZTo6c2V0SWRlbnRpZmljYXRpb24KKwkgIEJ1bXAgdGFnbGliIHJlcXVpcmVtZW50LgorCisyMDA5LTA0LTI0IDAyOjExOjI4ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzZGVtdXguYzoKKwkqIHRlc3RzL2ZpbGVzL2lkMy01Nzc0NjgtdW5zeW5jZWQtdGFnLnRhZzoKKwkgIGlkM2RlbXV4OiBhZGQgdW5pdCB0ZXN0IGZpbGUgZm9yIHVuc3luY2VkIGlkMyB0YWdzCisKKzIwMDktMDQtMjQgMDE6NTE6MzUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOgorCSAgaWQzZGVtdXg6IHBhcnNlIHVuc3luY2hyb25pc2VkIHRhZ3MgcHJvcGVybHkKKwkgIFdlIGRpZG4ndCBoYW5kbGUgdW5zeW5jaHJvbml6YXRpb24gYXQgYWxsIHVwIHRvIG5vdywgd2hpY2ggbWlnaHQgaGF2ZQorCSAgY2F1c2VkIGZyYW1lcyB0byBub3QgYmUgZXh0cmFjdGVkIC0gZXNwLiBmcmFtZXMgYWZ0ZXIgYW4gQVBJQyBwaWN0dXJlCisJICBmcmFtZS4gRml4ZXMgIzU3NzQ2OC4KKworMjAwOS0wNC0yNCAwMTowMTo1MyArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9pZDNkZW11eC9pZDN0YWdzLmM6CisJICBpZDNkZW11eDogcGFzcyB0aGUgcmlnaHQgc2l6ZSB2YWx1ZSBmb3Igc2l6ZSBvZiBhbGwgZnJhbWVzIHRvIHRoZSBwYXJzZXIKKwkgIEZyYW1lIGRhdGEgc2l6ZSBpcyB0YWcgc2l6ZSBhZGp1c3RlZCBmb3Igc2l6ZSBvZiB0aGUgdGFnIGhlYWRlciBhbmQKKwkgIGZvb3Rlciwgbm90IHRhZyBzaXplIGluY2x1ZGluZyBoZWFkZXIgYW5kIGZvb3Rlci4KKworMjAwOS0wNC0yMiAxNToyNDo1NSArMDIwMCAgUGF0cmljayBSYWRpemkgPHBhdHJpY2sucmFkaXppIGF0IGF4aXMuY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBmaXggc29tZSBtb3JlIHBhZCBsZWFrcworCSAgRml4IHNvbWUgcGFkIGxlYWtzLgorCSAgU2VlICM1NzczMTguCisKKzIwMDktMDQtMjEgMjI6MTI6NDUgKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGIzOTQxZWEgdG8gNmFiMTFkMQorCisyMDA5LTA0LTIxIDE0OjAyOjAxIC0wNzAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogb3ZlcnJpZGUgY2FwcyBiYXNlZCBvbiBkYXRhIGZyb20gRVNEUyBhdG9tcyBpbiBtcGVnNC4KKwkgIElmIHRoZSBjb2RlYyBpcyBhY3R1YWxseSBzb21ldGhpbmcgZWxzZSAoZS5nLiBtanBlZykgY2hhbmdlIHRoZSBjYXBzIHRvCisJICBtYXRjaCB3aGVuIHBhcnNpbmcgdGhlIEVTRFMgYXRvbS4KKwkgIEFsc28sIGZvciBBQUMsIG92ZXJyaWRlIHJhdGUgYW5kIGNoYW5uZWxzIHdpdGggY29ycmVjdCB2YWx1ZXMgcmVhZCBmcm9tCisJICBFU0RTLCBzaW5jZSB0aGUgcmF0ZS9jaGFubmVscyB2YWx1ZXMgZWxzZXdoZXJlIGFyZSBvZnRlbiB3cm9uZy4KKworMjAwOS0wNC0yMCAxOTozMjowMCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIGpwZWdkZWM6IGZpeCB3YXJuaW5nIGZvciBzdGlsbCBpbWFnZXMgYnkgbm90IHRyeWluZyB0byBkaXZpZGUgYnkgMAorCSAgRG9uJ3QgcGFzcyBhIDAgZGl2aXNvciB0byBnc3RfdXRpbF91aW50NjRfc2NhbGUoKSwgb3IgaXQgd2lsbCBjb21wbGFpbgorCSAgaW4gdGhlIHNpbmdsZSBpbWFnZSBjYXNlIHdoZXJlIGZwcz0wLzEgKGFyZSB3ZSBzdXBwb3NlZCB0byBkaWZmZXJlbnRpYXRlCisJICBiZXR3ZWVuIG5vIGZwcz1zdGlsbCBpbWFnZSBhbmQgZnBzPTAvMT12YXJpYWJsZSByYXRlIGhlcmUgYnR3PykKKworMjAwOS0wNC0yMCAxNzoyNTozNCArMDEwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6CisJICB1ZHA6IEZpeCBhIHNpbXBsZSB0eXBvIGluIHRoZSBwcmV2aW91cyBjb21taXQKKwkgIFVzZSAjaWZkZWYgaW5zdGVhZCBvZiAjaWYsIHRvIGZpeCB0aGUgYnVpbGQKKworMjAwOS0wNC0yMCAxNTo0ODoyMSArMDIwMCAgQW5keSBXaW5nbyA8d2luZ29Ad2luZ29tYWMuYmNuLm9ibG9uZy5uZXQ+CisKKwkgIGZpeCBmb3JtYXQgc3RyaW5nIGluIHBuZ2RlYworCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiBGaXggc2l6ZV90IHZzIHVuc2lnbmVkIGludCBmb3JtYXQgaW4gZXJyb3IgbWVzc2FnZS4KKworMjAwOS0wNC0yMCAxNTo0NjowMyArMDIwMCAgQW5keSBXaW5nbyA8d2luZ29Ad2luZ29tYWMuYmNuLm9ibG9uZy5uZXQ+CisKKwkgIG9ubHkgdXNlIHN0cnVjdCBpcF9tcmVxbiBpZiBpdCBpcyBkZXRlY3RlZAorCSAgKiBjb25maWd1cmUuYWM6IE1ha2UgYW4gZXhwbGljaXQgY2hlY2sgZm9yIHN0cnVjdCBpcF9tcmVxbi4KKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOiBVc2UgSEFWRV9JUF9NUkVRTiBpbnN0ZWFkIG9mIHRoZSBhZC1ob2MgY2hlY2tzLgorCisyMDA5LTA0LTIwIDEzOjQ1OjMyICswMjAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgRml4IHB1c2ggbW9kZSBidWZmZXJpbmcgc2FuaXR5IGNoZWNrIHRvIGFjdHVhbGx5IGZpdCB0aGUgZGVzY3JpcHRpb24uCisKKzIwMDktMDQtMTggMTk6MTE6MDYgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgcnRwaDI2M3BheTogQW5kIGxldCdzIG5vdCBmb3JnZXQgdG8gcmVtb3ZlIHRoZSB1bnVzZWQgdmFyaWFibGUuCisKKzIwMDktMDQtMTggMTg6NTA6MzIgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgcnRwaDI2M3BheTogUmVtb3ZlIGRlYWQgYXNzaWdubWVudHMsIHRoZSB2YXJpYWJsZXMgYXJlIG5ldmVyIHJlYWQgYWZ0ZXIuCisKKzIwMDktMDQtMTggMTg6NDk6NDkgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSAgcnRwbXA0dnBheTogUmVtb3ZlIGRlYWQgYXNzaWdubWVudC4gVGhlIHZhbHVlIGlzIG5ldmVyIHJlYWQgYWZ0ZXIuCisKKzIwMDktMDQtMTggMTg6NDg6NTUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IFJlbW92ZSBkZWFkIGFzc2lnbm1lbnQuCisJICB0IGlzIGJlaW5nIG92ZXJ3cml0dGVuIGFmdGVyLCBiZWZvcmUgaXQncyB1c2VkLgorCisyMDA5LTA0LTE4IDE4OjQ4OjA2ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJICBydHBhbXJkZXBheTogUmVtb3ZlIHVubmVlZGVkIHZhcmlhYmxlLCB0aGUgdmFsdWUgaXMgb25seSByZWFkIG9uY2UuCisKKzIwMDktMDQtMTggMTg6NDc6MDUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJICBydHBhbXJwYXk6IFJlbW92ZSB1bm5lZWRlZCB2YXJpYWJsZSwgdGhlIHZhbHVlIGlzIG9ubHkgcmVhZCBvbmNlLgorCisyMDA5LTA0LTE4IDE4OjQ2OjEyICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvZ29vbS9maWx0ZXJzLmM6CisJICBnb29tL2ZpbHRlcnM6IFJlbW92ZSBkZWFkIGFzc2lnbm1lbnQuIFZhbHVlIG92ZXJ3cml0dGVuIGp1c3QgYWZ0ZXIuCisKKzIwMDktMDQtMTggMTg6NDU6MzIgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJICBydHB2b3JiaXNwYXk6IFJlbW92ZSBkZWFkIGFzc2lnbm1lbnQuIFZhbHVlIG5ldmVyIHJlYWQgYWZ0ZXIuCisKKzIwMDktMDQtMTggMTg6NDU6MDcgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJICBydHB0aGVvcmFwYXk6IFJlbW92ZSBkZWFkIGFzc2lnbm1lbnQuIFZhbHVlIG5ldmVyIHJlYWQgYWZ0ZXIuCisKKzIwMDktMDQtMTggMTg6NDM6MzEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkgIHJ0cHRoZW9yYWRlcGF5OiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLCBpdCdzIG5ldmVyIGJlaW5nIHJlYWQuCisKKzIwMDktMDQtMTggMTg6NDI6NDUgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IFJlbW92ZSBkZWFkIGFzc2lnbm1lbnQuICdyZXMnIGlzbid0IHJlYWQgYWZ0ZXIuCisKKzIwMDktMDQtMTggMTg6NDE6NTggKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUuICdyZXMnIGlzIG5ldmVyIHJlYWQuCisKKzIwMDktMDQtMTggMTg6NDA6NDggKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IFJlbW92ZSBkZWFkIHZhcmlhYmxlLiAnc3RyZWFtJyBpcyBuZXZlciByZWFkIGFmdGVyLgorCisyMDA5LTA0LTE4IDE4OjM5OjQ4ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgIHZpZGVib3g6IFJlbW92ZSBkZWFkIGFzc2lnbm1lbnRzLgorCSAgVGhlc2UgdmFyaWFibGVzIGFyZSBuZXZlciByZWFkIGFmdGVyIHRoaXMgcG9pbnQuCisKKzIwMDktMDQtMTggMTg6Mzg6MjkgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9nb29tL2NvbnZvbHZlX2Z4LmM6CisJICBnb29tOiBmZiBhbmQgaWZmIGFyZSBvbmx5IHVzZWQgaW4gYSAnI2lmZGVmIERSQVdfTU9USUYnIGJsb2NrLgorCisyMDA5LTA0LTE4IDE4OjM0OjExICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIHdhdnBhcnNlOiBSZW1vdmUgZGVhZCBhc3NpZ25tZW50LgorCSAgcmVzIGlzbid0IHJlYWQgYWZ0ZXIgdGhpcy4KKworMjAwOS0wNC0xOCAxODozMjowMyArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogUmVtb3ZlIGRlYWQgYXNzaWdubWVudHMsIG1vdmUgdmFyaWFibGUgdG8gd2hlcmUgaXQncyBuZWVkZWQuCisJICBUaGUgaGVhZGVyX3JlYWRfZXJyb3IgbGFiZWwgd2lsbCByZXR1cm4gR1NUX0ZMT1dfRVJST1IKKworMjAwOS0wNC0xOCAxODoyMToyMiArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIHJ0cHZyYXdkZXBheTogUmVtb3ZlIGRlYWQgYXNzaWdubWVudC4KKwkgIFRoZSB2YWx1ZSBvZiAnc3RyJyB3aWxsIG5ldmVyIGJlIHVzZWQgaW4gdGhlc2UgY2FzZXMuCisKKzIwMDktMDQtMTggMTg6MTk6MTIgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogUmVtb3ZlIHVzZWxlc3MgdmFyaWFibGUuCisJICBpcmV0IHdhcyBuZXZlciByZWFkIG91dHNpZGUgb2YgdGhhdCBsb29wLCBhbmQgaXMgYWx3YXlzIGJlaW5nIGV4aXRlZCBpZgorCSAgaXJldCB3YXMgIT0gR1NUX0ZMT1dfT0sgYW55d2F5LgorCisyMDA5LTA0LTE4IDE4OjE3OjM1ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBhdmlkZW11eDogTW92ZSAncmVzJyB0byB3aGVyZSBpdCdzIGFjdHVhbGx5IGJlaW5nIHVzZWQuCisJICByZXMgd2FzIG5ldmVyIHVzZWQgb3V0c2lkZSBvZiB0aGF0IGJsb2NrIGV4Y2VwdCBmb3IgYSBkZWFkIGFzc2lnbm1lbnQuCisKKzIwMDktMDQtMTggMTg6MTY6MzMgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmJhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0LmM6CisJICBhdWRpb2Z4OiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgorCSAgcnogaXMgbmV2ZXIgdXNlZCBpbiB0aGVzZSBtZXRob2RzLgorCisyMDA5LTA0LTE4IDE4OjE1OjM5ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4cmluZ2J1ZmZlci5jOgorCSAgb3N4cmluZ2J1ZmZlcjogUnVuIGdzdC1pbmRlbnQuCisKKzIwMDktMDQtMTggMTg6MTQ6NDkgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICB4aW1hZ2U6IFJlbW92ZSBkZWFkIGFzc2lnbm1lbnRzLgorCSAgVGhvc2UgdmFyaWFibGVzIGFyZSBub3QgcmVhZCBhZnRlciB0aGF0IHBvaW50LgorCisyMDA5LTA0LTE4IDE4OjExOjAwICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkqIGV4dC9yYXcxMzk0L2dzdGhkdjEzOTRzcmMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzoKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkqIGdzdC9xdGRlbXV4L2dzdHJ0cHhxdGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOgorCSogZ3N0L3J0c3AvZ3N0cnRwZGVjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5jOgorCSogZ3N0L3NtcHRlL3BhaW50LmM6CisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIFJlbW92ZSB0cml2aWFsIHVudXNlZCB2YXJpYWJsZXMgZGV0ZWN0ZWQgYnkgQ0xhbmcgc3RhdGljIGFuYWx5emVyLgorCisyMDA5LTA0LTE4IDE3OjUyOjAwICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBleHQvZ2NvbmYvZ3N0c3dpdGNoc2luay5jOgorCSogZ3N0L3F0ZGVtdXgvZ3N0cnRweHF0ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYWMzZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdnJhd3BheS5jOgorCSAgUmVtb3ZlIGJsYW5rIHtzZXR8Z2V0fV9wcm9wZXJ0eS9jaGFuZ2Vfc3RhdGUvZmluYWxpemUgbWV0aG9kcy4KKworMjAwOS0wNC0xOCAxNzo0Mjo1NSArMDIwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6CisJKiBleHQvZXNkL2VzZHNpbmsuYzoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJKiBnc3QvZGVidWd1dGlscy9lZmVuY2UuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdG5hdmlnYXRpb250ZXN0LmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6CisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJKiBnc3QvZWZmZWN0di9nc3RyZXYuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkdmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkgIFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIGluIF9jbGFzc19pbml0CisJICBEZXRlY3RlZCBieSBMTFZNJ3MgQ0xhbmcgc3RhdGljIGFuYWx5emVyCisKKzIwMDktMDQtMTggMTM6NTQ6MDggKzAxMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkgIGNoZWNrOiBDaGVjayB3aGV0aGVyIHRocmVhZHMgYXJlIGFscmVhZHkgaW5pdGlhbGlzZWQgYmVmb3JlIGdfdGhyZWFkX2luaXQoKQorCisyMDA5LTA0LTE4IDE0OjMyOjQwICswMjAwICBKb3NlcCBUb3JyYSA8bjc3MGdhbGF4eUBnbWFpbC5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IG1hcmsgZGlzY29udCBvbiB0aGUgc3RyZWFtcyBhcyB3YXMgc2FpZCB0aGUgZGVidWcgbGluZQorCSAgQWZ0ZXIgYSBzZWVrIG1hcmsgYWxsIHN0cmVhbXMgd2l0aCBkaXNjb250IGFzIGl0IHdhcyBzYWlkIGluIHRoZSBkZWJ1ZyBsaW5lLgorCSAgRml4ZXMgdGhhdCBidWZmZXJzIGFmdGVyIGEgc2VlayBhcmUgZ2VuZXJhdGVkIHdpdGhvdXQgYSB2YWxpZCB0aW1lc3RhbXAuCisKKzIwMDktMDQtMTggMDg6NDU6MTggKzAyMDAgIEpvc2VwIFRvcnJhIDxuNzcwZ2FsYXh5QGdtYWlsLmNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogbWFwIEdTVF9SVFNQX0VFT0YgdG8gRU9TIG9uIHNlcnZlciByZXF1ZXN0cworCSAgUGVybWl0IHByb3Blcmx5IGhhbmRsZSB0aGUgRU9TIGNvbmRpdGlvbiB3aGVuIHNlcnZlciByZXBvcnQgaXQgaW4gYSByZXF1ZXN0LgorCisyMDA5LTA0LTE4IDA4OjM5OjU3ICswMjAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJICBydHB0aGVvcmFkZXBheTogRml4IGJ1aWxkIG9uIG1hY29zeC4KKwkgIFVzZSBHX0dTSVpFX0ZPUk1BVCBpbnN0ZWFkIG9mIHUuCisKKzIwMDktMDQtMTYgMjI6NTA6NTkgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogZml4IHNhbXBsZSBvZmZzZXQgY2FsY3VsYXRpb24gYWdhaW4KKworMjAwOS0wNC0xNSAxOTozMjoxOCArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyY3RybC5jOgorCSAgc3VuYXVkaW86IGZpeCBicm9rZW4gaW5kZW50YXRpb24gb2YgdmFyaWFibGUgZGVjbGFyYXRpb25zCisKKzIwMDktMDQtMTUgMTk6Mjg6NTMgKzAxMDAgIEphbWVzIEFuZHJld2FydGhhIDx0cnM4MEB1Y2MuZ3UudXdhLmVkdS5hdT4KKworCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmM6CisJICBzdW5hdWRpbzogcmVtb3ZlIHNvbWUgdW51c2VkIHZhcmlhYmxlcyBhbmQgZ290byBsYWJlbHMKKwkgIEZpeGVzICM1NzkwNzAuCisKKzIwMDktMDQtMTUgMTk6MjQ6NDkgKzAyMDAgIEphbWVzIEFuZHJld2FydGhhIDx0cnM4MCBhdCB1Y2MuZ3UudXdhLmVkdS5hdT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkgIHJ0cGgyNjNwYXk6IGZpeCBjb21waWxhdGlvbiBvbiBiaWctZW5kaWFuCisJICBTb21lIHNlbWljb2xvbnMgd2VyZSBtaXNzaW5nIGZyb20gdGhlIGJpZy1lbmRpYW4gc3RydWN0cyBpbiBnc3RydHBoMjYzcGF5LmguCisJICBBIEdTVF9ERUJVRyBjYWxsIHdhcyBtaXNzaW5nIGEgZm9ybWF0IHNwZWNpZmllci4KKwkgIEZpeGVzICM1NzkwNjkKKworMjAwOS0wNC0xNSAyMDoxMDowNCArMDMwMCAgTWFyY28gQmFsbGVzaW8gPG1hcmNvLmJhbGxlc2lvQG5va2lhLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfdHlwZXMuYzoKKwkqIGdzdC9xdGRlbXV4L3F1aWNrdGltZS5jOgorCSAgcXRkZW11eDogaW1wbGVtZW50IDNHUFAgKFRTIDI2LjI0NCBWOC4wLjApIEFzc2V0IG1ldGFkYXRhIGhhbmRsaW5nLCBGaXhlcyAjMTMyMTkzCisJICBJbXBsZW1lbnRzIDNncHAgaXNvIG1ldGFkYXRhIHRhZ3Mgd2hpY2ggYXJlIGRpZmZlcmVudCBmcm9tIG1vdiB1ZHRhIGF0b21zLgorCisyMDA5LTA0LTE1IDE1OjUxOjI0ICswMjAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSogZ3N0L2RlYnVndXRpbHMvZWZlbmNlLmg6CisJICBkZWJ1Z3V0aWxzOiBVc2UgR19CRUdJTl9ERUNMUy9HX0VORF9ERUNMUy4KKwkgIFVzZSBHX0JFR0lOX0RFQ0xTL0dfRU5EX0RFQ0xTIHRvIGF2b2lkIGdzdC1pbmRlbnQgbWVzc2luZyB1cCB0aGUKKwkgIGluZGVudGF0aW9uIGR1ZSB0byBleHRlcm4gIkMiIHsgfS4KKworMjAwOS0wNC0xNSAxNjowMzoyNyArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWd1dGlscy9NYWtlZmlsZS5hbToKKwkqIGdzdC9kZWJ1Z3V0aWxzL2JyZWFrbXlkYXRhLmM6CisJKiBnc3QvZGVidWd1dGlscy9kZWJ1Zy52Y3Byb2o6CisJKiBnc3QvZGVidWd1dGlscy9lZmVuY2UuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2VmZW5jZS5oOgorCSogZ3N0L2RlYnVndXRpbHMvZWZlbmNlLnZjcHJvajoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdGRlYnVnLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0bmF2aWdhdGlvbnRlc3QuaDoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdG5hdnNlZWsuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdG5hdnNlZWsuaDoKKwkqIGdzdC9kZWJ1Z3V0aWxzL2dzdHB1c2hmaWxlc3JjLmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3RwdXNoZmlsZXNyYy5oOgorCSogZ3N0L2RlYnVndXRpbHMvZ3N0dGFnaW5qZWN0LmM6CisJKiBnc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuaDoKKwkqIGdzdC9kZWJ1Z3V0aWxzL25hdmlnYXRpb250ZXN0LnZjcHJvajoKKwkqIGdzdC9kZWJ1Z3V0aWxzL25lZ290aWF0aW9uLmM6CisJKiBnc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5jOgorCSogZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuaDoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Rlc3RwbHVnaW4uYzoKKwkqIGdzdC9kZWJ1Z3V0aWxzL3Rlc3RzLmM6CisJKiBnc3QvZGVidWd1dGlscy90ZXN0cy5oOgorCSAgZGVidWc6IHJlbmFtZSBkZWJ1ZyB0byBkZWJ1Z3V0aWxzIHRvIGF2b2lkIGNsYXNoIHdpdGggLS1kaXNhYmxlLWRlYnVnLiBGaXhlcyAjNTYyMTY4CisKKzIwMDktMDQtMTUgMTU6NDM6MDQgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2RlYnVnL2VmZW5jZS5jOgorCSogZ3N0L2RlYnVnL2VmZW5jZS5oOgorCSogZ3N0L2RlYnVnL2dzdG5hdmlnYXRpb250ZXN0Lmg6CisJKiBnc3QvZGVidWcvZ3N0bmF2c2Vlay5oOgorCSogZ3N0L2RlYnVnL2dzdHB1c2hmaWxlc3JjLmg6CisJKiBnc3QvZGVidWcvZ3N0dGFnaW5qZWN0Lmg6CisJKiBnc3QvZGVidWcvcHJvZ3Jlc3NyZXBvcnQuaDoKKwkqIGdzdC9kZWJ1Zy90ZXN0cy5oOgorCSAgZGVidWc6IGluZGVudCBiZWZvcmUgcmVuYW1pbmcKKworMjAwOS0wNC0xNSAxNDowNzo1NyArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkgIGc3MjZkZXBheTogYWRkIHByb3BlcnR5IGZvciBhYWwyIGZvcmNlCisKKzIwMDktMDQtMTUgMTM6NTY6MTcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZzcyNmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5oOgorCSAgZzcyNmRlcGF5OiBpbXBsZW1lbnQgUkZDMzU1MSBwYWNraW5nCisJICBXZSBpbXBsZW1lbnRlZCB0aGUgQUFMMiBwYWNraW5nLCBhZGQgdGhlIGVuY29kaW5nLW5hbWUgZm9yIHRob3NlIHRvIHRoZSBjYXBzIGFuZAorCSAgYSBwcm9wZXJ0eSB0byBmb3JjZSBBQUwyIGRlY29kaW5nIChhbHdheXMgVFJVRSBmb3Igbm93KS4KKwkgIEltcGxlbWVudCBSRkMzNTUxIHVucGFja2luZyBmb3IgcmVndWxhciBHNzI2LgorCSAgU2VlICM1NjcxNDAuCisKKzIwMDktMDQtMTUgMDA6MjI6NDMgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5oOgorCSAgcnRwaDI2M3BheTogZml4IGJ1aWxkCisKKzIwMDktMDQtMTQgMTg6NTI6NDggKzAyMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aSBhdCBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgaDI2M3BheTogdmFyaW91cyBmaXhlcworCSAgUmUtZW5hYmxlIG1vZGUgQSBzdXBwb3J0IGFuZCBhIHByb3BlcnR5IHRvIGNvbnRyb2wgaXQuCisJICBGaXggbWVtb3J5IGxlYWsgb2YgR3N0UnRwSDI2M1BheUJvdW5kcnkgb2JqZWN0cy4KKwkgIEZpeCBtYXJrZXIuCisJICBGaXhlcyAjNTA5MzExCisKKzIwMDktMDQtMTQgMTg6NDQ6NTEgKzAyMDAgIEphbmluIEtvbGVuYyA8amFuaW4ua29sZW5jIGF0IG1hcmFuZC5zaT4KKworCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkgIGgyNjNwYXk6IEZpeCB0aGUgcGF5bG9hZGVyCisJICBGaXggdGhlIEgyNjMgcGF5bG9hZGVyIHRvIGJlIG1vcmUgUkZDIDIxOTAgY29tcGxpYW50LgorCSAgU2VlICM1MDkzMTEKKworMjAwOS0wNC0xNCAxNzoyNzowNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGRvbid0IHB1c2ggRU9TIGluIHN0cmVhbWluZyBtb2RlCisJICBJbiBzdHJlYW1pbmcgbW9kZSwgYXZpZGVtdXggaXMgbm90IHN1cHBvc2VkIHRvIHNlbmQgYW4gRU9TIGV2ZW50IGRvd25zdHJlYW0gYnV0CisJICBpdCBpcyBzdXBwb3NlZCB0byByZXR1cm4gVU5FWFBFQ1RFRCBmcm9tIHRoZSBjaGFpbiBmdW5jdGlvbiBpbnN0ZWFkIHNvIHRoYXQKKwkgIHVwc3RyZWFtIGNhbiBkbyB0aGUgcmlnaHQgRU9TIGhhbmRsaW5nLgorCisyMDA5LTA0LTEzIDE0OjAzOjAzICswMjAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBtdXhpbmcvZGVtdXhpbmcgU3BlZXggYXVkaW8KKwkgIE5vdGU6IFRoaXMgaXMgbm90IGluIHRoZSBNYXRyb3NrYSBzcGVjIHlldAorCSAgRml4ZXMgYnVnICM1NzgzMTAuCisKKzIwMDktMDQtMTAgMjE6MzE6MDYgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogaGFuZGxlIE5VTEwgdGltaW5nIGluZm8KKwkgIERvbid0IGNyYXNoIHdoZW4gdGhlIHRpbWluZyBpbmZvIGlzIG5vdCB5ZXQgYXZhaWxhYmxlLgorCisyMDA5LTA0LTEwIDIxOjQyOjEzICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkgIHB1bHNlOiBtYWtlIGl0IHdvcmsgb24gMC45LjEyCisJICBGaXJzdCB3ZSBpZ25vcmUgcmVxdWVzdCB0byBmaWxsIHRoZSByaW5nYnVmZmVyIHdoaWNoIGFyZSBsZXNzIHRoZW4gYSBzZWdtZW50LgorCSAgVGhlIHNtYWxsIHJlcXVlc3Qgd2hlcmUgY2F1c2luZyBzdHV0dGVyLgorCSAgVGhlbiB3ZSBkaXNhYmxlIGZsdXNoaW5nIHRoZSBzdHJlYW0gd2hlbiBydW5uaW5nIGFnYWluc3QgcGEgMC45LjEyIGFzIHRoaXMKKwkgIHRyaWdnZXJzIGFuIGFzc2VydGlvbmcgaW4gdGhlIHNvdW5kIHNlcnZlciBhbmQgdGVybWluYXRlcyBpdC4gSXQgZG9lcyBub3QgaGFwcGVuCisJICB3aXRoIDAuOS4xMCBhbmQgMC45LjE0LgorCisyMDA5LTA0LTEwIDE0OjE4OjQ4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGhhbmRsZSBzZXJ2ZXIgZGlzY29ubmVjdCBpbiBnZXRfdGltZQorCSAgV2hlbiB0aGUgc2VydmVyIGlzIGRpc2Nvbm5lY3RlZCBvciB3aGVuIHdlIGFyZSBzaHV0IGRvd24sIG1ha2Ugb3VyIGNsb2NrIHJldHVybgorCSAgYW4gaW52YWxpZCB0aW1lIGluc3RlYWQgb2YgZXJyb3Jpbmcgb3V0LgorCisyMDA5LTA0LTEwIDEyOjAxOjI3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGJwcyBpcyBzaWduZWQgaW50IHRvIGF2b2lkIG92ZXJmbG93CisJICBLZWVwIGJwcyBhcyBnaW50IGluc3RlYWQgb2YgZ3VpbnQgYmVjYXVzZSB3ZSB3aWxsIGJlIGRvaW5nIHNpZ25lZCBtYXRoIHdpdGggaXQKKwkgIGxhdGVyIG9uIGFuZCB3ZSBkb24ndCB3YW50IHdlaXJkIHJlc3VsdHMuCisKKzIwMDktMDQtMTAgMDA6MjY6NDQgKzAyMDAgIExSTiA8bHJuMTk4NiBhdCBnbWFpbC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBhZGQgY29udmVydCBxdWVyeSwgZml4IGR1cmF0aW9uIHF1ZXJ5CisJICBGaXggdGhlIGR1cmF0aW9uIHF1ZXJ5IHNvIHRoYXQgaXQgYWxzbyB3b3JrcyB3aXRoIGZvcm1hdHMgb3RoZXIgdGhhbgorCSAgVElNRSwgc3VjaCBhcyBERUZBVUxUIHRvIGdldCB0aGUgbnVtYmVyIG9mIGZyYW1lcy4KKwkgIEFkZCBhIGNvbnZlcnQgZnVuY3Rpb24uCisJICBGaXhlcyAjNTc4MDUyLgorCisyMDA5LTA0LTA5IDIzOjQzOjU4ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGNoZWNrIGZvciBhIHN0cmVhbQorCSAgRG9uJ3QgdHJ5IHRvIGNoYW5nZSB0aGUgc3RyZWFtIHZvbHVtZSAoYW5kIG90aGVyIHRoaW5ncykgd2hlbiB3ZSBkb24ndCBoYXZlIGEKKwkgIHN0cmVhbSB5ZXQuIEp1c3Qgc3RvcmUgdGhlIHZhbHVlcyBmb3IgbGF0ZXIuCisKKzIwMDktMDQtMDkgMTg6MDc6MzggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogZml4IGNvbXBpbGF0aW9uIGZvciBuZXdlciBwdWxzZWF1ZGlvCisKKzIwMDktMDQtMDkgMTc6MTg6NTQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogdW5jb3JrIGZpeGVzIGFuZCB1c2UgcHJlYnVmID0gMAorCSAgV2UgY2FuIHVzZSBwcmVidWYgPSAwIHRvIGluc3RydWN0IHB1bHNlIHRvIG5vdCBwYXVzZSB0aGUgc3RyZWFtIG9uIHVuZGVyZmxvd3MuCisJICBUaGlzIHdheSB3ZSBjYW4gcmVtb3ZlIHRoZSB1bmRlcmZsb3cgY2FsbGJhY2suIFdlIGhvd2V2ZXIgaGF2ZSB0byBtYW51YWxseQorCSAgdW5jb3JrIHRoZSBzdHJlYW0gbm93IHdoZW4gd2UgaGF2ZSBubyBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIGJ1ZmZlciBvciB3aGVuIHdlCisJICBhcmUgd3JpdGluZyB0b28gZmFyIGF3YXkgZnJvbSB0aGUgY3VycmVudCByZWFkX2luZGV4LgorCisyMDA5LTA0LTA5IDE0OjM4OjE3ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGhhbmRsZSB3cml0ZSBlcnJvcnMKKworMjAwOS0wNC0wOSAxNDoxNjozNSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiB3cml0ZSBzaWxlbmNlIG9uIHVuZGVyZmxvdworCSAgU3RhcnQgZmlsbGluZyB1cCB0aGUgYnVmZmVyIHdpdGggZW1wdHkgc2FtcGxlcyB3aGVuIGFuIHVuZGVyZmxvdyBoYXBwZW5zLiBXZQorCSAgbmVlZCB0byBkbyB0aGlzIHRvIGtlZXAgcHVsc2VhdWRpbyByZXBvcnRpbmcgdGhlIHJpZ2h0IHRpbWUgZm9yIHVzLgorCisyMDA5LTA0LTA5IDEzOjE0OjE0ICswMjAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBwdWxzZXNpbms6IGhhbmRsZSBwdWxsLWJhc2VkIHNjaGVkdWxpbmcKKwkgIFVzZSB0aGUgZGVmYXVsdCBiYXNlc2luayBtZXRob2RzIGZvciBpbXBsZW1lbnRpbmcgcHVsbCBiYXNlZCBzY2hlZHVsaW5nLCBpdAorCSAgd29ya3MgZmluZSBmb3IgdXMuCisKKzIwMDktMDQtMDkgMTI6MTM6NDQgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogYWRkIGJlZ2lubmluZ3Mgb2YgcHVsbC1iYXNlZCBzY2hlZHVsaW5nCisKKzIwMDktMDQtMDggMTg6MTc6MTAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazoga2VlcCB0cmFjayBvZiBjbG9jayByZXNldAorCSAgd2hlbiB3ZSBzd2l0Y2ggc3RyZWFtcywgdGhlIGNsb2NrIHdpbGwgcmVzZXQgdG8gMC4gTWFrZSBzdXJlIHRoYXQgdGhlIHByb3ZpZGVkCisJICBjbG9jayBkb2Vzbid0IGdldCBzdHVjayB3aGVuIHRoaXMgaGFwcGVucyBieSBrZWVwaW5nIGFuIGluaXRpYWwgb2Zmc2V0LiBXZSBhbHNvCisJICBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHN1YnRyYWN0IHRoaXMgb2Zmc2V0IGluIHNhbXBsZXMgd2hlbiB3cml0aW5nIHRvIHRoZQorCSAgcmluZ2J1ZmZlci4KKworMjAwOS0wNC0wOCAxMzo1Mjo0MSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSAgcHVsc2VzaW5rOiByZXdyaXRlIHB1bHNlc2luaworCSAgRGVyaXZlIGZyb20gQmFzZUF1ZGlvU2luayBhbmQgaW1wbGVtZW50IG91ciBjdXN0b20gcmluZ2J1ZmZlciB0aGF0IG1hcHMgdG8gdGhlCisJICBpbnRlcm5hbCBwdWxzZWF1ZGlvIHJpbmdidWZmZXIuCisKKzIwMDktMDQtMDggMTM6NTI6MDAgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzoKKwkgIHB1bHNlOiByZW1vdmUgc29tZSBzdHJheSBkZWJ1ZyBsaW5lcworCisyMDA5LTA0LTA5IDExOjMwOjU5ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAganBlZ2RlYzogdXNlIHNsaWdodGx5IG1vcmUgYWRhcHRpdmUgZm9ybXVsYSBmb3IgUW9TCisJICBTaG91bGQgd29yayBhdCBsZWFzdCBhIHRhZCBiZXR0ZXIgaWYgdGhlIGRlY29kZXIgY2FuJ3Qga2VlcCB1cCwgYW5kCisJICBzaG91bGQgYWxzbyBzcHJlYWQgZHJvcHBlZCBmcmFtZXMgYSBiaXQgbW9yZSBldmVubHkgb3ZlciB0aW1lLgorCisyMDA5LTA0LTA3IDIyOjM1OjMxICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgd2F2cGFyc2U6IGRvbid0IGxlYWsgcGFkLXRlbXBsYXRlCisJICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlKCkgZG9lcyBub3QgdGFrZSBvd25lcnNoaXAuCisKKzIwMDktMDQtMDQgMjE6MTg6NTUgKzAzMDAgIEZlbGlwZSBDb250cmVyYXMgPGZlbGlwZS5jb250cmVyYXNAZ21haWwuY29tPgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gZDBlYTg5ZSB0byBiMzk0MWVhCisKKzIwMDktMDQtMDEgMDE6MTU6MzEgKzAyMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkgIGFkZCBwZW5kaW5nX3NhbXBsZXMgc28gdGhhdCB3ZSBvbmx5IHVwZGF0ZSBzZWdtZW50J3MgbGFzdCBzdG9wIGFmdGVyIHJlYWxseSBzZW5kaW5nIHRoZSBzYW1wbGVzCisKKzIwMDktMDMtMTUgMjE6MzE6NDkgKzAxMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy9mbGFjZGVjLmM6CisJICBhZGQgZGVidWcgYW5kIGFuIGFzc2VydAorCisyMDA5LTAzLTE1IDIxOjMwOjMyICswMTAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgKGF0KSBhcGVzdGFhcnQgKGRvdCkgb3JnPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBhZGQgZGVidWdnaW5nCisKKzIwMDktMDMtMDMgMTA6MTQ6MDIgKzAxMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svYXVkaW90ZXN0c3JjLmZsYWM6CisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy5jOgorCSAgYWRkIGEgdGVzdCB0byBjaGVjayB0aGF0IHdlIGdldCBhbGwgZGVjb2RlZCBieXRlcyBmcm9tIGEgMTAtYnVmZmVyIGF1ZGlvdGVzdHNyYyBmbGFjLCBpbiB0aGUgY2FzZSBvZjogIC0gYSBmdWxsIGRlY29kZSAgLSBhIGRlY29kZSBvZiBhIHNlZWsgZm9yIHRoZSBmdWxsIGZpbGUgIC0gYSBkZWNvZGUgb2YgYSBzZWVrIGZvciBhIHNtYWxsIHBhcnQsIHNtYWxsZXIgdGhhbiB0aGUgZmlyc3QgYnVmZmVyCisJICBUaGUgdGVzdCBmYWlscyBiZWNhdXNlIGZsYWNkZWMgZHJvcHMgdGhlIGZpcnN0IG91dGdvaW5nIGJ1ZmZlciBvbiBhIHNlZWsKKworMjAwOS0wMy0wMyAxMDowNjo1MiArMDEwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgY2xpcHBpbmcgc2hvdWxkIGFsc28gd29yayBpZiBpdCdzIGRvbmUgb24gdGhlIGZpcnN0IGJ1ZmZlciBzdGFydGluZyBhdCAwCisKKzIwMDktMDQtMDQgMTQ6NTQ6MDEgKzAyMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSBmOGIzZDkxIHRvIGQwZWE4OWUKKworMjAwOS0wNC0wMyAwOTo1NzoxNSArMDEwMCAgWmFoZWVyIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvTEVHQUw6CisJICBGaXggZ3JhbW1hci4KKworMjAwOS0wNC0wMiAyMjo0MTowMSArMDIwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYWxsb3cgaHR0cDovLyBvbiB0aGUgcHJveHkgc2V0dGluZworCSAgQWxsb3cgYW5kIGlnbm9yZSBodHRwOi8vIGF0IHRoZSBzdGFydCBvZiB0aGUgcHJveHkgc2V0dGluZywgbGlrZQorCSAgc291cGh0dHBzcmMuCisJICBGaXhlcyAjNTczMTczCisKKzIwMDktMDQtMDIgMjE6MDg6NDggKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRvbid0IGxlYWsgdGhlIHVkcHNyYyBwYWQKKwkgIEZpeCBtZW1vcnkgbGVhayBpbiBydHNwc3JjIGJlY2F1c2Ugd2UgZGlkbid0IHVucmVmIHRoZSB1ZHBzcmMgcGFkLgorCSAgU2VlICM1NzczMTgKKworMjAwOS0wNC0wMSAxNzozMToxOCAtMDcwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHNvbmdiaXJkbmVzdC5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJICBydHB0aGVvcmFwYXk6IGZpeCBsZW5ndGggZW5jb2RpbmcgaW4gcGFja2VkIGhlYWRlcnMuCisJICBBcyBmb3Igdm9yYmlzIHBheWxvYWRlcjsgdGhpcyBieSBpbnNwZWN0aW9uIGhhZCB0aGUgc2FtZSBidWcuCisKKzIwMDktMDQtMDEgMTc6MjM6MzMgLTA3MDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEBzb25nYmlyZG5lc3QuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSAgcnRwdm9yYmlzcGF5OiBpbiBwYWNrZWQgaGVhZGVycywgcHJvcGVybHkgZmxhZyBtdWx0aWJ5dGUgbGVuZ3Rocy4KKwkgIEluIHRoZSBzZXF1ZW5jZSBvZiBoZWFkZXIgbGVuZ3RocywgZm9yIGhlYWRlcnMgPjEyNyBieXRlcywgd2UgdXNlCisJICBtdWx0aXBsZSBieXRlcyB0byBlbmNvZGUgdGhlIGxlbmd0aC4gQnl0ZXMgb3RoZXIgdGhhbiB0aGUgbGFzdCBtdXN0IGhhdmUKKwkgIHRoZSB0b3AgKGZsYWcpIGJpdCBzZXQuCisKKzIwMDktMDQtMDIgMDA6MjA6MDIgKzAxMDAgIEpvbmF0aGFuIE1hdHRoZXcgPGpvbmF0aGFuQGQxNG4ub3JnPgorCisJKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzdjJtdXguYzoKKwkgIGlkM3YybXV4OiB3cml0ZSBSVkEyIGZyYW1lcyBjb250YWluaW5nIHBlYWsvZ2FpbiB2b2x1bWUgZGF0YQorCisyMDA5LTA0LTAyIDAwOjA1OjE0ICswMTAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAganBlZ2RlYzogZGVtb3RlIHNvbWUgbG9nIG1lc3NhZ2UgZnJvbSBERUJVRyB0byBMT0cKKwkgIEFuZCBsb2cgZGVjb2RlciBvYmplY3QuCisKKzIwMDktMDQtMDEgMjE6MTU6MDIgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmg6CisJICBqcGVnZGVjOiBpbXBsZW1lbnQgYmFzaWMgUW9TCisJICBEb24ndCBkZWNvZGUgZnJhbWVzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIHRvbyBsYXRlIGFueXdheS4KKworMjAwOS0wNC0wMSAxMjoyNjoxMiArMDEwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRvbid0IGVtaXQgdWdseSB3YXJuaW5ncyB3aXRoIG9sZGVyIHJ0cGppdHRlcmJ1ZmZlciB2ZXJzaW9ucworCSAgVGhlIG9uLW5wdC1zdG9wIHNpZ25hbHMgd2FzIGFkZGVkIG9ubHkgcmVjZW50bHkgdG8gcnRwaml0dGVyYnVmZmVyIGluCisJICAtYmFkLCBzbyBjaGVjayBpZiB0aGUgc2lnbmFsIGV4aXN0cyBiZWZvcmUgZ19zaWduYWxfY29ubmVjdCgpaW5nIHRvCisJICBpdCwgdG8gYXZvaWQgd2FybmluZ3MuCisKKzIwMDktMDMtMzEgMTk6MDg6MzcgKzAyMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIHJ0c3BzcmM6IGFkZCBwcm94eSBzdXBwb3J0CisKKzIwMDktMDMtMzEgMTc6MTY6MDQgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgbWF0cm9za2E6IGRvbid0IGxlYWsgc2VyaWFsaXplZCB2YWx1ZXMgd2hlbiB3cml0aW5nIHRhZ3MKKworMjAwOS0wMy0zMSAxNzowNjo1MCArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thOiBkb24ndCBhbHRlciBwYXNzZWQgZGF0YSBhbmQgZXNwZWNpYWx5IGRvbid0IGxlYWsuCisJICBJZiB3ZSBuZWVkIGRpZmZlcmVudCBzaXplLCBNYWtlIGEgY29weSwgd29yayB3aXRoIHRoYXQgYW5kIGZyZWUgaXQuCisKKzIwMDktMDMtMzEgMTY6NDI6MTUgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2dvb20vcGx1Z2luX2luZm8uYzoKKwkgIGdvb206IHRoZSBzdHJ1Y3R1cmUgaXMgbm90IGZ1bGx5IGluaXRpYWxpemVkLCBidXQgdGhlIGNvcGllZC4KKwkgIFNldCB0byBmdWxseSB0byAwIHRvIGF2b2lkIGNyZWVwIG9mIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLgorCisyMDA5LTAzLTMxIDE2OjI1OjU4ICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIG1hdHJvc2thOiBpbml0IGVuZGlhbmVzcyBhcyBzdWNoIGFuZCBzaWduZWRuZXNzIGFzIGJvb2xlYW4uCisKKzIwMDktMDMtMzEgMTY6MjI6NDIgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogZG9uJ3QgdXNlIGluaW5pdGlhbGl6ZWQgdmFyIGluIGRlYnVnIGxvZyBzdGF0ZW1lbnQKKwkgIEFsc28gbWFrZSB0aGUgbG9nIHN0YXRlbWVudCB1c2VmdWwgYnkgcHJpbnRpbmcgdGhlIGh1bWFuIHJlYWRhYmxlIGZvcm1hdCBuYW1lLgorCisyMDA5LTAzLTMxIDEyOjAxOjIxICswMzAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGRvbid0IGxlYWsgYXRvbSBkYXRhIGluIGNhc2Ugb2YgYSB3cm9uZyBmb3VyY2MKKworMjAwOS0wMy0zMSAxMTo1NzozNiArMDMwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thOiBkb24ndCBsZWFrIHJlYWQgZGF0YSBpbiBkZW11eGVyCisKKzIwMDktMDMtMzEgMTE6NTA6NDEgKzAzMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwOiBkb24ndCB1c2UgcHJvdG9jb2wgaW4gZGVidWcgbWVzc2FnZSBhZnRlciBmcmVlaW5nCisKKzIwMDktMDMtMzAgMTQ6MTA6MTUgKzAxMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSAgcnRwbXA0YWRlcGF5OiBvdXRwdXQgc2hvdWxkIGJlIGZyYW1lZCBhbHJlYWR5CisKKzIwMDktMDMtMjcgMjE6MTc6MDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuaDoKKwkgIGZsYWM6IHJlcXVpcmUgYSAnbmV3ZXInIGZsYWMgYW5kIHJlbW92ZSBzdXBwb3J0IGZvciB0aGUgbGVnYWN5IGZsYWMgQVBJCisKKzIwMDktMDMtMjcgMTc6NDg6MTMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGxpbmsgdG8gdGhlIG9uX25wdF9zdG9wIHNpZ25hbCB0byBFT1MKKwkgIENvbm5lY3QgdG8gdGhlIG9uX25wdF9zdG9wIHNpZ25hbCBvZiB0aGUgc2Vzc2lvbiBtYW5hZ2VyIHRvIHNjaGVkdWxlIHRoZSBFT1MKKwkgIGFjdGlvbnMuCisKKzIwMDktMDMtMjYgMTQ6Mzk6MDYgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBzb21lIHN0cmVhbSBzeW5jaHJvbml6YXRpb24gdG8gYWlkIHNlZWtpbmcgaW4gdW5iYWxhbmNlZCBjbGlwcworCSAgU29tZSBjbGlwcyAodHJhaWxlcnMpIG1heSBoYXZlIChsZW5ndGgtd2lzZSkgdW5iYWxhbmNlZCBzdHJlYW1zLAorCSAgd2hpY2ggc3RhbGxzIHRoZSBwaXBlbGluZSBpZiBzZWVraW5nIGludG8gdGhhdCByZWdpb24uCisJICBBZGRpdGlvbmFsIHN0cmVhbSBzeW5jaHJvbml6YXRpb24gY2FuIGhhbmRsZSB0aGlzLCBhcyB3ZWxsIGFzCisJICBzcGFyc2UgKHN1YnRpdGxlKSBzdHJlYW1zIChhdCBzb21lIGxhdGVyIHRpbWUgPykKKworMjAwOS0wMy0yNiAxMDozMToxOCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFkZGl0aW9uYWwgc2FmZXR5IGFuZCBzYW5pdHkgY2hlY2tzIChwdXNoIGJhc2VkIG1vZGUpCisKKzIwMDktMDMtMjYgMTA6MTg6MzEgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIHZpZGVvbWl4ZXI6IHNvbWUgbW9yZSBpbmRlbnQgZml4ZXMKKworMjAwOS0wMy0yNCAxNjowMDo1OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgdmlkZW9taXhlcjogZml4IGdzdC1pbmRlbnQgc2NyZXd1cAorCisyMDA5LTAzLTI1IDE3OjU0OjM1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcC5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSogcG8vUE9URklMRVMuaW46CisJICBydHNwc3JjOiBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZSBSVFNQIGV4dGVuc2lvbiBmb3IgUmVhbCBzdHJlYW1zIGlzIG1pc3NpbmcKKwkgIFRyeSB0byBwb3N0IGEgZGVjZW50IGVycm9yIG1lc3NhZ2Ugd2hlbiBpdCBsb29rcyBsaWtlIHdlJ3JlIGZhaWxpbmcKKwkgIGJlY2F1c2UgdGhlIFJlYWwgUlRTUCBleHRlbnNpb24gcGx1Z2luIGlzIG1pc3NpbmcuIEFsc28gYWRkIGkxOG4KKwkgIGJpdHMgZm9yIHJ0c3BzcmMgc28gb3VyIGVycm9yIG1lc3NhZ2VzIGdldCB0cmFuc2xhdGVkLgorCisyMDA5LTAzLTI1IDE1OjQyOjE1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmkuYzoKKwkqIGdzdC9xdGRlbXV4L3F1aWNrdGltZS5jOgorCSAgaTE4bjogbWFrZSBzdXJlIGdldHRleHQgZ2l2ZXMgdXMgVVRGLTggYXQgYWxsIHRpbWVzCisKKzIwMDktMDMtMjUgMDE6Mjg6MzggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJICBydHBtcDRhcGF5LHJ0cG1wNGRlcGF5OiBmaXggYnVmZmVyIGxlYWtzIGluIEFBQyBwYXlsb2FkZXIgYW5kIGRlcGF5bG9hZGVyCisKKzIwMDktMDMtMjUgMDE6MjI6MTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNGFwYXkuYzoKKwkgIHJ0cG1wNGFwYXk6IHdhcm4gaWYgaW5wdXQgaXMgdW5mcmFtZWQKKworMjAwOS0wMy0yMiAyMToyMDo1NyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkgIGpwZWdkZWM6IHB1dCBHc3RTZWdtZW50IGluc2lkZSB0aGUgZWxlbWVudCBzdHJ1Y3QgaW5zdGVhZCBvZiBhbGxvY2F0aW5nIGl0IHNlcGFyYXRlbHkKKworMjAwOS0wMy0yNSAxMDowODo0MSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICB2NGwyc3JjOiBtb3ZlIGR1cGxpY2F0ZWQgdGltZXN0YW1waW5nIGFuZCBidWZmZXIgbWV0YWRhdGEgY29kZSB0byBfY3JlYXRlKCkKKwkgIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSBsYXRlbmN5IGNoYW5nZXMgYWxzbyBpbiB0aGUgbW1hcCBjYXNlLgorCisyMDA5LTAzLTI1IDEwOjA2OjQ4ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDJzcmM6IHJlbW92ZSB3aW4zMiBpZmRlZnMgaW50cm9kdWNlZCBieSBjb21taXQgY2ZmM2Y0Njc2MGVhYzc0YzliYmQ3YTM2YWNhNDRmZWRmMzI3NDI0YgorCSAgVjRsMnNyYyBpcyB1bmRlciBzeXMgYW5kIGRvZXMgbm90IGV4aXN0cy9ydW4gdW5kZXIgd2luZG93cyBhbnl3YXkuCisKKzIwMDktMDMtMjQgMTU6NDQ6NDIgKzAxMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBxdGRlbXV4OiBoYW5kbGUgRkxVU0hfU1RPUCBldmVudAorCSAgQ2xlYW4gdXAgc29tZSBzdGF0ZSAobW9zdCBub3RhYmx5IHBhZCBmbG93IHJldHVybnMpIHRvIHJlc3VtZQorCSAgcHJvcGVyIHN0cmVhbWluZyBmb2xsb3dpbmcgZmx1c2hpbmcgc2Vlay4KKworMjAwOS0wMy0yNCAxMjo0MjoxMyArMDEwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8uZGVjaW5hQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IGRvbid0IHBvc3QgYW4gZXJyb3IgaWYgRU9TIGNhbid0IGJlIHB1c2hlZCBkb3duc3RyZWFtLgorCSAgVGhpcyBhbGlnbnMgYXZpZGVtdXggd2l0aCBvdGhlciBkZW11eGVycyBhbmQgZml4ZXMgYSBidWcgdXNpbmcgYXZpZGVtdXgKKwkgIHdpdGggYSByZWNlbnQgZ25vbmxpbi4KKworMjAwOS0wMy0yMyAxMToyMjowOCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2VzaW5rOiBjbGVhbiB1cCB0aGUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uCisJICBNYWtlIHRoZSBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24gYSBiaXQgbW9yZSByZWFkYWJsZSBhbmQgb25seSBwYXVzZSBhZnRlciB0aGUKKwkgIHBhcmVudCBoYWQgYSBjaGFuZ2UgdG8gcGF1c2UgZmlyc3QuCisKKzIwMDktMDMtMDkgMjM6NDM6NTUgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogZ3N0L2R0bWYvTWFrZWZpbGUuYW06CisJICBNYWtlZmlsZS5hbTogbm8gc3RhdGljIGxpYnMgZm9yIHBsdWdpbnMKKworMjAwOS0wMy0yMCAxNzoyMjozMiArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IHN1cHBvcnQgc2Vla2luZyBpbiBwdXNoIGJhc2VkIG1vZGUKKworMjAwOS0wMy0yMCAxNzoxMTozOSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGFsaWduIHB1c2ggYmFzZWQgYmVoYXZpb3VyIG1vcmUgd2l0aCBwdWxsIGJhc2VkCisJICBDYXRlciBmb3IgREVMVEFfVU5JVCBmbGFnIG9uIGJ1ZmZlcnMsIGtlZXAgdHJhY2sgb2YgY3VycmVudAorCSAgcG9zaXRpb24sIHJlbW92ZSBhbmQgd2FybiBhYm91dCBlZGl0IGxpc3RzIGlmIGFueSAoYXMgdGhvc2UKKwkgIGFzIGFyZSBkZSBmYWN0byBkaXNjYXJkZWQgYW55d2F5KSwgYWRkIHNvbWUgZGVidWcgc3RhdGVtZW50cworCSAgYW5kIGluZGVudCBmaXhlcy4KKworMjAwOS0wMy0yMCAxNzowMzowMyArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIHF0ZGVtdXg6IGZpeCBtZW0gbGVha3MgYW5kIHByZXZlbnQgZXhjZXNzaXZlIGJ1ZmZlcmluZyBpbiBwdXNoIGJhc2VkIG1vZGUKKworMjAwOS0wMy0yMCAxMzoyNzo1OSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJICBwdWxzZXNpbms6IFRyYWNrIHRoZSBjb3JrZWQvdW5jb3JrZWQgc3RhdGUgb3Vyc2VsdmVzCisJICBVc2UgYW4gaW5zdGFuY2UgdmFyaWFibGUgdG8gdHJhY2sgd2hldGhlciB0aGUgc3RyZWFtIGlzIGNvcmtlZCBvciBub3QsCisJICBpbnN0ZWFkIG9mIHVzaW5nIFBBIEFQSSB0aGF0IHdhcyBvbmx5IGludHJvZHVjZWQgaW4gMC45LjExCisKKzIwMDktMDMtMTkgMTg6Mzk6MDQgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgcHVsc2U6IE1ha2Ugc3VyZSB0aGUgc3RyZWFtIGlzIHVuY29ya2VkIGluIHRoZSB3cml0ZSBmdW5jdGlvbgorCSAgSWYgdGhlIGNhcHMgY2hhbmdlcywgdGhlIHNpbmsgaXMgcmVzZXQgd2l0aG91dCB0cmFuc2l0aW9uaW5nIHRocm91Z2gKKwkgIGEgUEFVU0VELT5QTEFZSU5HIHN0YXRlIGNoYW5nZSwgcmVzdWx0aW5nIGluIGEgY29ya2VkIHN0cmVhbS4gVGhpcyBhdm9pZHMKKwkgIHRoZSBwcm9ibGVtIGJ5IGNoZWNraW5nIHRoYXQgdGhlIHN0cmVhbSBpcyB1bmNvcmtlZCB3aGVuIHdyaXRpbmcgc2FtcGxlcworCSAgdG8gaXQuCisKKzIwMDktMDMtMjAgMDE6MDI6MjYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkgIHNwZWV4ZW5jOiBmaXggZGlyZWN0aW9uIG9mIGxhdGVuY3kgcXVlcnkgYW5kIG90aGVyIHVwc3RyZWFtIHF1ZXJpZXMKKwkgIERvbid0IHNlbmQgcXVlcmllcyBiYWNrIHRvIHRoZSBlbGVtZW50IHRoZXkganVzdCBjYW1lIGZyb20gYnkgc2VuZGluZworCSAgdGhlbSB0byB0aGUgcGVlciBvZiB0aGUgd3JvbmcgcGFkLgorCisyMDA5LTAzLTE5IDExOjEwOjQwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogLmdpdGlnbm9yZToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJICAuZ2l0aWdub3JlOiBpZ25vcmUgbW9yZQorCisyMDA5LTAzLTE4IDE2OjU1OjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzoKKwkgIHJ0cG1wNGFkZXBheTogZG9uJ3QgYXBwZW5kIGFuIGV4dHJhIDAgYnl0ZSB0byB0aGUgY29kZWMgZGF0YQorCSAgVGhlIGF1ZGlvTXV4VmVyc2lvbiBzdHJ1Y3R1cmUgaXMgcGFja2VkIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgY29kZWMKKwkgIGRhdGEgZG9lcyBub3Qgc3RhcnQgYnl0ZS1hbGlnbmVkLCB3aGljaCBtZWFucyB0aGVyZSdzIGFuIGV4dHJhIGJpdCBvZgorCSAgcGFkZGluZyBhdCB0aGUgZW5kLiBXZSBkb24ndCB3YW50IHRoYXQgYml0IGluIHRoZSBjb2RlYyBkYXRhLCBzaW5jZQorCSAgc29tZSBkZWNvZGVycyBzZWVtIGdldCBjb25mdXNlZCB3aGVuIHRoZXkncmUgZmVkIHdpdGggYW4gZXh0cmEgY29kZWMKKwkgIGRhdGEgYnl0ZSAoYWxzbyBpdCdzIGp1c3Qgbm90IHJpZ2h0IG9mIGNvdXJzZSkuCisKKzIwMDktMDMtMTkgMTM6MjU6NTcgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICBydHBoMjY0ZGVwYXk6IGZpeCBiYXNlNjQgZGVjb2RpbmcKKwkgIFdlIGNhbid0IHBhc3MgLTEgdG8gX2RlY29kZV9zdGVwLCB0aGF0IGZ1bmN0aW9ucyByZXR1cm5zIDAgcmlnaHQgYXdheSBpbnN0ZWFkIG9mCisJICBkZWNvZGluZyB1cCB0byB0aGUgc3RyaW5nIGVuZC4KKworMjAwOS0wMy0xOSAxMzoyNDowMiArMDEwMCAgRGF2aWQgQWRhbSA8emFuY2hleSBhdCB1Y2MuZ3UudXdhLmVkdS5hdT4KKworCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSAgdWRwOiBGaXggYnVpbGQgaWYgb24gU29sYXJpcworCSAgVGhpcyBwYXRjaCBjaGVja3MgZm9yIFNvbGFyaXMgYW5kIHVzZXMgaXBfbXJlcSBpbnN0ZWFkIG9mIGlwX21yZXFuIGlmIG9uIHRoaXMKKwkgIHBsYXRmb3JtLgorCSAgRml4ZXMgIzU3NTkzNy4KKworMjAwOS0wMy0xOCAxNDo1MDoxNyArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSAgcnRwOiBVc2UgR0xpYiBmdW5jdGlvbnMgZm9yIGVuY29kaW5nL2RlY29kaW5nIGJhc2U2NAorCisyMDA5LTAzLTE2IDE5OjE3OjI0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBhZGQgc29tZSBkZWJ1ZyBmb3IgdGhlIHRpbWVzdGFtcHMKKwkgIFdoZW4gdGltZXN0YW1waW5nIGluIFRDUCBtb2RlLCBsb2cgdGhlIGZpcnN0IHRpbWVzdGFtcCB3ZSBwdXQgb24gdGhlIGJ1ZmZlcnMuCisKKzIwMDktMDMtMTUgMjM6MjY6NTYgKzAyMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKworCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSAgdjRsMnNyYzogbG9nIGRldGFpbHMgaWYgd2UgaGF2ZSB0aGVtLCBuZWVkZWQgZm9yICM1NzUzOTEKKworMjAwOS0wMy0xMyAxODozMjo0NyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIHVkcHNyYzogY29udmVydCBfIGluIHByb3BlcnRpZXMgdG8gLQorCSAgLS0KKworMjAwOS0wMy0xMyAxODoyODo1OSArMDEwMCAgRWRnYXIgRS4gSWdsZXNpYXMgPGVkZ2FyLmlnbGVzaWFzQGdtYWlsLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgdWRwc3JjOiBBZGQgbmV0d29yayBpbnRlcmZhY2Ugc2VsZWN0aW9uCisJICBBZGQgbmV0d29yayBpbnRlcmZhY2Ugc2VsZWN0aW9uIHdoZW4gam9pbmluZyBtdWx0aWNhc3QgZ3JvdXBzLgorCSAgVXNlZnVsIHdoZW4gdXNpbmcgdGhlIHVkcHNyYyBvbiBtdWx0aWhvbWVkIGhvc3RzLgorCSAgRml4ZXMgIzU3NTIzNC4KKwkgIEFQSTogR3N0VURQU3JjOjptdWx0aWNhc3QtaWZhY2UKKworMjAwOS0wMy0xMyAxNTo0Mzo1MiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICB2NGwyc3JjOiBQcmVwZW5kIHRvIGxpc3RzIGFuZCByZXZlcnNlIHRoZW0gYXQgdGhlIGVuZC4KKwkgIEdyYXR1aXRvdXMgbWljcm8tb3B0aW1pc2F0aW9uIC0gcHJlcGVuZCB0byBsaXN0cyBhbmQgcmV2ZXJzZSB0aGVtLCByYXRoZXIKKwkgIHRoYW4gYXBwZW5kaW5nIHRvIHRoZW0gZWFjaCB0aW1lLgorCisyMDA5LTAzLTEzIDE1OjQwOjUwICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgIHB1bHNlc2luazogV2FpdCB1bnRpbCB0aGVyZSBpcyBlbm91Z2ggcm9vbSB0byB3cml0ZSBhbiBlbnRpcmUgc2VnbWVudAorCSAgV2hlbiB0cnlpbmcgdG8gd3JpdGUgb3V0IGEgc2VnbWVudCwgd2FpdCB1bnRpbCB0aGVyZSBpcyBlbm91Z2ggZnJlZSBzcGFjZQorCSAgZm9yIHRoZSBlbnRpcmUgc2VnbWVudC4gVGhpcyBoZWxwcyB0byByZWR1Y2UgcmlwcGxlIGluIHRoZSBjbG9jayByZXBvcnRpbmcsCisJICB3aGVyZSB0aGUgYXBwIG1pZ2h0IHF1ZXJ5IHRoZSBwbGF5YmFjayBwb3NpdGlvbiB3aGlsZSBvbmx5IGhhbGYgYSBzZWdtZW50CisJICBoYXMgYmVlbiB3cml0dGVuIChhbmQgaXMgdGhlcmVmb3JlIHJlcG9ydGVkIGJ5IF9kZWxheSgpLCBldmVuIHRob3VnaAorCSAgdGhlIHJpbmcgYnVmZmVyIGhhcyBub3QgeWV0IGJlZW4gYWR2YW5jZWQpCisKKzIwMDktMDMtMTIgMjA6Mzg6NDIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGRvbid0IHNlbmQgUEFVU0Ugd2hlbiBub3QgY29ubmVjdGVkCisJICBkb24ndCBzZW5kIGEgUEFVU0UgcmVxdWVzdCB3aGVuIHdlIGFyZSBubyBsb25nZXIgY29ubmVjdGVkLgorCisyMDA5LTAzLTEyIDE2OjEwOjI1ICswMTAwICBMYXN6bG8gUGFuZHkgPGxhc3psb2syQGdtYWlsLmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgRG9uJ3QgY2FsbCBGTEFDX18gbWV0aG9kcyBiZWZvcmUgaXQncyBpbml0aWFsaXplZC4gRml4ZXMgIzUxNjAzMQorCSAgSW4gdGhlIGV2ZW50IGhhbmRsZXIsIGdzdF9mbGFjX2RlY19zaW5rX2V2ZW50KCksIHR3byBmdW5jdGlvbnMgYXJlIGNhbGxlZCBvbgorCSAgdGhlIEZMQUMgc3RyZWFtIHdpdGhvdXQgY2hlY2tpbmcgaWYgaXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQ6CisJICBGTEFDX19zdHJlYW1fZGVjb2Rlcl9mbHVzaCgpCisJICBGTEFDX19zdHJlYW1fZGVjb2Rlcl9wcm9jZXNzX3VudGlsX2VuZF9vZl9zdHJlYW0oKQorCSAgQm90aCB0aGVzZSBGTEFDX18qKCkgZnVuY3Rpb25zIG1vZGlmeSB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIEZMQUMgc3RyZWFtLgorCSAgTGF0ZXIsIHdoZW4gdGhlIGJ1ZmZlcnMgc3RhcnQgZmxvd2luZywgZ3N0X2ZsYWNfZGVjX2NoYWluKCkgdHJpZXMgdG8gaW5pdGlhbGl6ZQorCSAgdGhlIHN0cmVhbS4gdGhlIEZMQUNfX3N0cmVhbV9kZWNvZGVyX2luaXRfc3RyZWFtKCkgY2FsbCB3aWxsIGZhaWwgYmVjYXVzZSB0aGUKKwkgIHByZXZpb3VzIGNhbGxzIHRvIEZMQUNfXyooKSBjaGFuZ2VkIHRoZSBzdHJlYW0gc3RhdGUgc28gaXQgaXMgbm8gbG9uZ2VyIGluIHRoZQorCSAgaW5pdGlhbGl6ZWQgc3RhdGUuCisKKzIwMDktMDMtMTEgMTc6NTk6MDAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIHJ0c3BzcmM6IGZpeCB0aW1lb3V0IGNoZWNrCisJICAtLS0KKworMjAwOS0wMy0xMSAxMjo0ODowMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIHdpbjMyL01BTklGRVNUOgorCSAgd2luMzI6IHVwZGF0ZSBNQU5JRkVTVCwgZml4aW5nICdtYWtlIGRpc3QnCisJICBjb25maWcuaC5pbiBubyBsb25nZXIgZXhpc3RzLgorCisyMDA5LTAzLTEwIDIxOjE0OjQzICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGdzdC9tdWx0aXBhcnQvTWFrZWZpbGUuYW06CisJICBtYWtlZmlsZTogZml4IHR5cG8gaW4gbm8tc3RhdGljIHBsdWdpbnMgcnVsZQorCisyMDA5LTAzLTEwIDExOjAxOjE2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgcG5nZGVjOiB2YXJpb3VzIGNsZWFudXBzLgorCSAgTWFrZSBzb21lIGNvZGUgbW9yZSByZWFkYWJsZS4KKwkgIEZpeCBhIGxlYWsgd2hlbiBwdWxsIHJhbmdlIHJldHVybnMgYSBzaG90IGJ1ZmZlci4KKwkgIFB1c2ggRU9TIGFmdGVyIHBvc3RpbmcgdGhlIGVycm9yLgorCisyMDA5LTAzLTEwIDEwOjE2OjI3ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJICBnc3RydHB2b3JiaXNkZXBheTogRml4IGJ1aWxkIG9uIG1hY29zeAorCisyMDA5LTAzLTAxIDE3OjM3OjU2ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiAuZ2l0aWdub3JlOgorCSAgLmdpdGlnbm9yZTogSWdub3JlIG00IGRpcmVjdG9yeQorCisyMDA5LTAzLTA5IDIzOjEyOjMzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEF1dG9tYXRpYyB1cGRhdGUgb2YgY29tbW9uIHN1Ym1vZHVsZQorCSAgRnJvbSA3MDMyMTYzIHRvIGY4YjNkOTEKKworMjAwOS0wMy0wOSAxODowNzoyMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOgorCSAgdm9yYmlzZGVwYXk6IGZpeCBzb21lIGxlYWtzCisJICBBbmQgbGVhayB0aGUgY29kZWJvb2tzLgorCSAgVXNlIGdsaWIgYmFzZTY0IGRlY29kZXJzLgorCSAgVXNlIHN1YmJ1ZmZlcnMgdG8gYXZvaWQgYSBtZW1jcHkgb2YgdGhlIGhlYWRlcnMuCisKKzIwMDktMDMtMDkgMTc6MTQ6MTIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkgIGZsYWNkZWM6IGRvbid0IGxvc2UgdGhlIGZpcnN0IGJ1ZmZlciBhZnRlciBhIHNlZWsKKwkgIFRoZSBmbGFjZGVjIEFQSSBjYWxscyB0aGUgd3JpdGUgY2FsbGJhY2sgd2hlbiBwZXJmb3JtaW5nIGEgc2Vlay4gV2UgY2Fubm90IHlldAorCSAgcHVzaCBvdXQgYSBidWZmZXIgYXQgdGhhdCB0aW1lIHNvIHdlIG11c3Qga2VlcCBpdCBhbmQgcHVzaCBpdCBvdXQgbGF0ZXIuCisJICBGbHVzaCBvdXQgdGhlIHVwc3RyZWFtIHBhcnQgb2YgdGhlIHBpcGVsaW5lIHdoZW4gZG9pbmcgYSBzZWVrLgorCSAgRml4ZXMgIzU3NDI3NS4KKworMjAwOS0wMy0wOSAxNToyMDowNSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcXRkZW11eDogc2FuaXRpemUgdGFnIG5hbWVzCisJICBTYW5pdGl6ZSB0aGUgdGFnIG5hbWVzIGJlZm9yZSB0dXJuaW5nIHRoZW0gaW50byBhIHN0cnVjdHVyZSBuYW1lLiBXZSBjYW4gb25seQorCSAgYWRkIGFscGhhbnVtZXJpYyB2YWx1ZXMgYXMgdGhlIHN0cnVjdHVyZSBuYW1lLgorCisyMDA5LTAzLTA4IDEyOjA0OjIyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIGZmYTczOGQgdG8gNzAzMjE2MworCisyMDA5LTAzLTA4IDExOjE5OjU2ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDNmMTNlNGUgdG8gZmZhNzM4ZAorCisyMDA5LTAzLTA3IDExOjQ1OjM1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDNjNzQ1NmIgdG8gM2YxM2U0ZQorCisyMDA5LTAzLTA3IDEwOjQ1OjQwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDU3YzgzZjIgdG8gM2M3NDU2YgorCisyMDA5LTAzLTA2IDIxOjU2OjI2ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDJzcmM6IGZpeCBwYWRzLCBzbyB0aGF0IHRoZXkgYXJlIHN1YnNldCBvZiB0ZW1wbGF0ZSBjYXBzCisJICBEbyBub3QgYWRkIHc9MCB8IGg9MC4gV2hlbiB3ZSBjYW4ndCBnZXQgYSBmcmFtZXJhdGUgYWRkIGZyYWN0aW9uIHJhbmdlLgorCisyMDA5LTAzLTA1IDE0OjA4OjE0ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBmaXggcmFuZ2UgcGFyc2luZworCSAgRml4IHBhcnNpbmcgb2YgdGhlIHJhbmdlIGhlYWRlcnMuCisKKzIwMDktMDItMTAgMTc6MjA6NTcgKzAwMDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNpcmVuZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc2lyZW5kZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzaXJlbnBheS5oOgorCSAgTW92ZSBzaXJlbiBydHAgcGF5L2RlcGF5IGZyb20gZ3N0LXBsdWdpbnMtZmFyc2lnaHQKKworMjAwOS0wMy0wNCAxNjoyNTozNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IG1lbW9yeSBsZWFrIGluIGNsb3NlCisJICBDbG9zZSB0aGUgY29ubmVjdGlvbiBldmVuIHdoZW4gd2UgZmFpbCB0byBzZW5kIHRoZSB0ZWFyZG93biBtZXNzYWdlLgorCSAgVXNlIHRoZSBjb25uZWN0aW9uIHVybCAod2hpY2ggaXMgYSBjb3B5IG9mIHRoZSBzcmMgdXJsKS4KKworMjAwOS0wMy0wNCAxNjoxNTowNSArMDEwMCAgUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2pAYXhpcy5jb20+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgY2hlY2s6IGdzdC1wbHVnaW5zLWdvb2Quc3VwcCBuZWVkcyB0byBiZSBkaXN0cmlidXRlZC4KKworMjAwOS0wMy0wNCAxMjoyOTo1MCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogZml4IGRvLXJ0Y3AgcHJvcGVydHkgZGVzY3JpcHRpb24KKwkgIC0tLQorCisyMDA5LTAzLTAzIDEyOjIwOjI3ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaDoKKwkgIHNvdXBodHRwc3JjOiBFeHBvc2UgdGhlIFNvdXBTZXNzaW9uICd0aW1lb3V0JyBwcm9wZXJ0eS4KKworMjAwOS0wMy0wMiAxNTowNzoyNCArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogLmdpdGlnbm9yZToKKwkgIC5naXRpZ25vcmU6IElnbm9yZSB0aGUgbTQvIGRpcmVjdG9yeQorCisyMDA5LTAzLTAyIDE3OjE4OjU1ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkgIHJ0cG1wNHZwYXk6IEFkZCBzdXBwb3J0IGZvciBtb3JlIGZvcm1hdHMKKwkgIEhhY2sgYXJvdW5kIHNob3J0IGhlYWRlciBtcGVnNCB2aWRlbyBmaWxlcyBhbmQgcHV0IHRoZSBzaG9ydCBoZWFkZXIgYXMgdGhlCisJICBjb25maWcgc3RyaW5nLgorCSAgRml4ZXMgIzU3MjU1MS4KKworMjAwOS0wMy0wMiAxNjowODoyMyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogYWRkIHN1cHBvcnQgZm9yIGh0dHAgdHVubmVsaW5nCisJICBBZGQgc3VwcG9ydCBmb3IgaHR0cCB0dW5uZWxpbmcgYW5kIGEgbmV3IHJ0c3BoOi8vIHVyaSBmb3IgaXQuCisJICBTZWUgIzU3MzE3My4KKworMjAwOS0wMy0wMiAwOTo0MzozMCArMDEwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIG9mIHNzaDovL3Rob21hc3ZzQGdpdC5mcmVlZGVza3RvcC5vcmcvZ2l0L2dzdHJlYW1lci9nc3QtcGx1Z2lucy1nb29kCisKKzIwMDktMDMtMDIgMDg6NDE6MTUgKzAxMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIEFkZC9jbGFyaWZ5L2ZpeCBzb21lIGxvZ2dpbmcuCisKKzIwMDktMDMtMDEgMTI6NDc6MzcgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQGh1dGNoLTIubG9jYWw+CisKKwkqIHN5cy9vc3h2aWRlby9NYWtlZmlsZS5hbToKKwkgIFJlbW92ZSBoYXJkY29kZWQgZGVmaW5pdGlvbiBvZiBPQkpDCisKKzIwMDktMDMtMDEgMTk6NTU6MjYgKzAxMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICBXYWl0IGZvciBhIGZyYW1lIHRvIGJlY29tZSBhdmFpbGFibGUgYmVmb3JlIGNhcHR1cmluZyBpdAorCSAgVXNlIEdzdFBvbGwgdG8gd2FpdCBmb3IgdGhlIGZkIG9mIHRoZSB2aWRlbyBkZXZpY2UgdG8gYmVjb21lIHJlYWRhYmxlIGJlZm9yZQorCSAgdHJ5aW5nIHRvIGNhcHR1cmUgYSBmcmFtZS4gVGhpcyBzcGVlZHMgdXAgc3RvcHBpbmcgdjRsMnNyYyBhIGxvdCBhcyBpdCBubworCSAgbG9uZ2VyIGhhcyB0byB3YWl0IGZvciB0aGUgbmV4dCBmcmFtZSwgZXNwZWNpYWxseSB3aGVuIGNhcHR1cmluZyB3aXRoIGxvdworCSAgZnJhbWVyYXRlcyBvciB3aGVuIHRoZSB2aWRlbyBkZXZpY2UganVzdCBuZXZlciBnZW5lcmF0ZXMgYSBmcmFtZSAod2hpY2ggc2VlbXMgYQorCSAgY29tbW9uIGlzc3VlIGZvciB1dmN2aWRlbyBkZXZpY2VzKQorCSAgRml4ZXMgYnVnICM1NjM1NzQuCisKKzIwMDktMDItMTQgMTc6NTY6MDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOgorCSAgYWxhd2RlYywgbXVsYXdkZWM6IGRlbW90ZSBzb21lIGRlYnVnIG1lc3NhZ2VzIGZyb20gRVJST1IgdG8gV0FSTklORyBvciBERUJVRworCSAgTm9uLW9rIGZsb3cgcmV0dXJucyBtYXkgaGFwcGVuIGZvciBhIHZhcmlldHkgb2YgcGVyZmVjdGx5IGxlZ2l0aW1hdGUgYW5kIGV4cGVjdGVkIHJlYXNvbnMKKwkgICh0ZW1wb3JhcmlseSBub3QgbGlua2VkLCBzZWVraW5nLCBwaXBlbGluZSBzaHV0ZG93biksIHNvIHdlIHJlYWxseSBzaG91bGRuJ3Qgc3BldyBFUlJPUgorCSAgZGVidWcgbWVzc2FnZXMgdG8gc3RkZXJyIGluIHRob3NlIGNhc2VzLiBGaXhlcyAjNTcwNzgxLiAoU2VlbXMgbGlrZSBzb21lb25lIGFscmVhZHkgdG9vaworCSAgY2FyZSBvZiBzb21lIG9mIHRoZXNlLikKKworMjAwOS0wMi0yOCAxNToyNjowMCArMDIwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYzoKKwkgIHJndm9sdW1lOiBJbXByb3ZlIGxvZyBtZXNzYWdlIGZvciBwZWFrIHZhbHVlcyA+MS4wIGJ5IGNsYW1waW5nIGV4cGxpY2l0bHkuCisKKzIwMDktMDItMjcgMjM6MjU6MzIgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkgIEZpeCB0aGUgZmllbGQgZG9taW5hbmNlCisJICBQQUwgaXMgVEZGLCBOVFNDIGlzIEJGRi4gIFNvbWUgZGF5IEkgd2lsbCBsZWFybiB0byBrZWVwIHRoaXMKKwkgIHN0cmFpZ2h0LgorCisyMDA5LTAyLTI3IDIwOjQwOjMxICswMTAwICBMUk4gPGxybjE5ODZAZ21haWwuY29tPgorCisJKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jOgorCSAgZGlyZWN0ZHJhd3Npbms6IEZpeCB0eXBlIG1pc21hdGNoZXMKKwkgIEZpeGVzIGJ1ZyAjNTczMzQzLgorCisyMDA5LTAyLTI3IDIwOjI4OjI3ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIG9mIHNzaDovL2dpdC5mcmVlZGVza3RvcC5vcmcvZ2l0L2dzdHJlYW1lci9nc3QtcGx1Z2lucy1nb29kCisKKzIwMDktMDItMjcgMjA6MjQ6NTMgKzAxMDAgIExSTiA8bHJuMTk4NkBnbWFpbC5jb20+CisKKwkqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuYzoKKwkgIHVkcDogRG9uJ3Qgc2V0IGVycm5vIHRvIEVBRk5PU1VQUE9SVCB1bmNvbmRpdGlvbmFsbHkKKwkgIEZpeGVzIGJ1ZyAjNTczMzQyLgorCisyMDA5LTAyLTI3IDExOjE3OjUwIC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYzoKKwkgIHJndm9sdW1lOiBpZ25vcmUgb3V0LW9mLXJhbmdlIHBlYWsgdmFsdWVzCisJICBJZiB0aGUgcGVhayB2YWx1ZSBpcyA+IDEgKGFuZCB0aHVzIG5vbnNlbnNpY2FsKSBpZ25vcmUgaXQuIFByZXZlbnRzCisJICByZ3ZvbHVtZSByZWR1Y2luZyB2b2x1bWUgdG8gZWZmZWN0aXZlbHkgc2lsZW50IG9uIGZpbGVzIHdpdGggYm9ndXMgcGVhaworCSAgdmFsdWVzLgorCisyMDA5LTAyLTI3IDEzOjI5OjQxICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICB3YXZwYXJzZTogRml4IFNFRUsgZXZlbnQgaGFuZGxpbmcgaW4gcHVzaCBtb2RlLCBhbmQgU0VFS0FCTFkgcXVlcnkgaGFuZGxpbmcKKwkgIFN0YW5kYXJkIHB1bGwgbW9kZSBsb29wIGJhc2VkIFNFRUsgaGFuZGxpbmcgZmFpbHMgaW4gcHVzaCBtb2RlLAorCSAgc28gY29udmVydCB0aGUgU0VFSyBldmVudCBhcHByb3ByaWF0ZWx5IGFuZCBkaXNwYXRjaCB0byB1cHN0cmVhbS4KKwkgIEFsc28gY2F0ZXIgZm9yIE5FV1NFR01FTlQgZXZlbnQgaGFuZGxpbmcsIGFuZCBwcm9wZXJseSBpbmZvcm0KKwkgIGRvd25zdHJlYW0gYW5kIGFwcGxpY2F0aW9uIG9mIFNFRUtBQkxFIGNhcGFiaWxpdGllcywgZGVwZW5kaW5nCisJICBvbiBzY2hlZHVsaW5nIG1vZGUgYW5kIHVwc3RyZWFtLgorCisyMDA5LTAyLTI3IDExOjA0OjA4ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIG1hdHJvc2thZGVtdXg6IFJlbW92ZSBnc3RfdXRpbF9kdW1wX21lbSgpIGNhbGxzLgorCisyMDA5LTAyLTI2IDE5OjA3OjM1ICswMTAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBmaXggU0VFSyBldmVudCBoYW5kbGluZyBpbiBwdXNoIG1vZGUKKwkgIFdoZW4gaW4gcHVzaCBtb2RlIHdlIHNob3VsZCBub3QgdHJ5IHRvIGhhbmRsZSB0aGUgU0VFSyBldmVudCBhcyB0aGVyZSdzCisJICBubyBjb2RlIHRvIGhhbmRsZSBpdCBwcm9wZXJseS4gUHJvcGFnYXRlIHVwc3RyZWFtLgorCisyMDA5LTAyLTI2IDE5OjA1OjA2ICswMTAwICBQYXRyaWNrIFJhZGl6aSA8cGF0cmljayBkb3QgcmFkaXppIGF0IGF4aXMgZG90IGNvbT4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgcnRzcHNyYzogYWRkIHRoZSAuaCBmaWxlIGNoYW5nZSB0b28KKwkgIEFkZCB0aGUgLmggZmlsZSBjaGFuZ2UgZm9yIHRoZSBuZXcgcHJvcGVydHkuCisKKzIwMDktMDItMjYgMTk6MDM6NTIgKzAxMDAgIFBhdHJpY2sgUmFkaXppIDxwYXRyaWNrIGRvdCByYWRpemkgYXQgYXhpcyBkb3QgY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBydHNwc3JjOiBhZGQgcHJvcGVydHkgdG8gZGlzYWJsZSBSVENQCisJICBTb21lIG9sZCBzZXJ2ZXJzIGRvbid0IGxpa2UgdXMgZG9pbmcgUlRDUCBhbmQgdGh1cyB3ZSBuZWVkIGEgcHJvcGVydHkgdG8gZGlzYWJsZQorCSAgaXQuIFNlZSAjNTczMTczLgorCisyMDA5LTAyLTI2IDEzOjE5OjMxICswMTAwICBKYW4gU21vdXQgPGphbiBkb3Qgc21vdXQgYXQgZ21haWwgZG90IGNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSAgdWRwOiBmaXggZ3N0X3VkcF9zZXRfbG9vcF90dGwoKSBhZ2FpbgorCSAgRml4IHRoZSBnc3RfdWRwX3NldF9sb29wX3R0bCgpIGZ1bmN0aW9uIHRoYXQgd2FzIGNvbW1lbnRlZCBvdXQgaW4gYQorCSAgcHJldmlvdXMgY29tbWl0LiBTZWUgIzU3MzExNS4KKworMjAwOS0wMi0yNiAxMzowNjoxNyArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIHJ0cHZyYXdkZXBheTogZmFpbCBvbiBpbnRlcmxhY2VkIHZpZGVvCisJICBGYWlsIG9uIGludGVybGFjZWQgdmlkZW8gdW50aWwgd2Ugc3VwcG9ydCBpdC4KKworMjAwOS0wMi0yNiAxMzowMDo1OCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJICBydHB2cmF3cGF5OiBmYWlsIG9uIGludGVybGFjZWQgdmlkZW8KKwkgIERldGVjdCBhbmQgZmFpbCB3aGVuIHRyeWluZyB0byBwYXlsb2FkIGludGVybGFjZWQgdmlkZW8uCisKKzIwMDktMDItMjUgMjA6NDc6MTUgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBNYWtlZmlsZS5hbToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaC5pbjoKKwkgIENoYW5nZSBob3cgd2luMzIvY29tbW9uL2NvbmZpZy5oIGlzIHVwZGF0ZWQKKwkgIEdlbmVyYXRlIHdpbjMyL2NvbW1vbi9jb25maWcuaC1uZXcgZGlyZWN0bHkgZnJvbSBjb25maWcuaC5pbiwKKwkgIHVzaW5nIHNoZWxsIHZhcmlhYmxlcyBpbiBjb25maWd1cmUgYW5kIHNvbWUgaGFyZC1jb2RlZCBpbmZvcm1hdGlvbi4KKwkgIENoYW5nZSB0b3AtbGV2ZWwgbWFrZWZpbGUgc28gdGhhdCAnbWFrZSB3aW4zMi11cGRhdGUnIGNvcGllcyB0aGUKKwkgIGdlbmVyYXRlZCBmaWxlIHRvIHdpbjMyL2NvbW1vbi9jb25maWcuaCwgd2hpY2ggd2Uga2VlcCBpbiBzb3VyY2UKKwkgIGNvbnRyb2wuICBJdCdzIGtlcHQgaW4gc291cmNlIGNvbnRyb2wgc28gdGhhdCB0aGUgZ2l0IHRyZWUgaXMKKwkgIGJ1aWxkYWJsZSBmcm9tIFZTLgorCSAgVGhpcyBjaGFuZ2UgaXMgc2ltaWxhciB0byB0aGUgb25lIHJlY2VudGx5IGFwcGxpZWQgdG8gR1N0cmVhbWVyCisJICBhbmQgZ3N0LXBsdWdpbnMtZ29vZC4gIFRoZSBwcmV2aW91cyBjb25maWcuaCBmaWxlIGluIC1nb29kIHdhcyBpbgorCSAgcHJldHR5IGJhZCBzaGFwZSwgc28gdW5saWtlIGNvcmUgYW5kIGJhc2UsIEkgZGlkbid0IGF0dGVtcHQgdG8KKwkgIGxlYXZlIGl0IHN0cmljdGx5IHRoZSBzYW1lLCBidXQgZml4ZWQgaXQgYXMgbmVjZXNzYXJ5LiAgTmVlZHMKKwkgIHRlc3RpbmcgSSBjYW5ub3QgZG8gbXlzZWxmLgorCisyMDA5LTAyLTI1IDE5OjU4OjI5IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZHYvZ3N0ZHZkZWMuaDoKKwkgIGR2ZGVjOiBBZGQgaW50ZXJsYWNpbmcgaW5mbyB0byBjYXBzIGFuZCBidWZmZXJzCisKKzIwMDktMDItMjUgMTQ6NTc6MzMgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogY29tbW9uOgorCSogY29uZmlndXJlLmFjOgorCSAgYnVpbGQ6IFVwZGF0ZSBzaGF2ZSBpbml0IHN0YXRlbWVudCBmb3IgY2hhbmdlcyBpbiBjb21tb24uIEJ1bXAgY29tbW9uLgorCisyMDA5LTAyLTI1IDE0OjAxOjI2ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBmaXggY29tcGlsYXRpb24KKwkgIEZpeCBjb21waWxhdGlvbiBvbiBzeXN0ZW1zIE1TR19FUlJRVUVVRSBhbmQgSVBfUkVDVkVSUi4KKworMjAwOS0wMi0xOSAyMDoxNDoxMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIGpwZWdlbmM6IGVycm9yIG91dCBpbnN0ZWFkIG9mIGNyYXNoaW5nIGlmIG5vIGNhcHMgaGF2ZSBiZWVuIHNldAorCSAgRG9uJ3QgY3Jhc2ggaWYgd2UgcmVjZWl2ZSBhIGJ1ZmZlciB3aXRob3V0IGNhcHMuIEZpeGVzICM1NzI0MTMuCisKKzIwMDktMDItMjUgMTE6MzU6MzEgKzAxMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBNYWtlIHN1cmUgdGhlIHNvY2thZGRyIGxlbmd0aCB1c2VkIGZvciByZWN2ZnJvbSgpIGlzIGJpZyBlbm91Z2guCisJICBQcmV2aW91c2x5IHRoZSBzb2NrYWRkciBsZW5ndGggdXNlZCBmb3IgcmVjdmZyb20oKSB3YXMgY2FsY3VsYXRlZCBhcworCSAgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHIpLiBIb3dldmVyLCB0aGlzIGlzIHRvbyBsaXR0bGUgdG8gaG9sZCBhbiBJUHY2CisJICBhZGRyZXNzLCBzbyB0aGUgZnVsbCBzaXplIG9mIHRoZSBnc3Rfc29ja2FkZHIgdW5pb24gc2hvdWxkIGJlIHVzZWQKKwkgIGluc3RlYWQuCisKKzIwMDktMDItMjUgMTE6MzI6MjggKzAxMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdWRwc3JjOiBVbmlmeSB0aGUgdXNlIG9mIHVuaW9uIGdzdF9zb2NrYWRkci4KKworMjAwOS0wMi0yNSAxMTozMjowNyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gOWNmOGM5YiB0byBhNmNlNWM2CisKKzIwMDktMDItMjUgMTI6MDU6MjIgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGF2aWRlbXV4OiBhdm9pZCBjcmFzaGluZyBvbiBzdWJ0aXRsZXMKKwkgIEF2b2lkIGEgY3Jhc2ggaW4gYXZpIHdpdGggc3VidGl0bGVzIGJ5IG9ubHkgZGVyZWZlcmVuY2luZyB0aGUgdmlkZW8gZGVzY3JpcHRpb24KKwkgIHdoZW4gd2UgYWN0dWFsbHkgYXJlIGRlYWxpbmcgd2l0aCB2aWRlbyBpbiB0aGUgX2ludmVydCBmdW5jdGlvbi4KKworMjAwOS0wMi0yNSAxMTo0NTowNSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmg6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIGRvY3M6IHZhcmlvdXMgZG9jIGZpeGVzCisJICBObyBzaG9ydC1kZXNjIGFzIHdlIGhhdmUgdGhlbSBpbiB0aGUgZWxlbWVudCBkZXRhaWxzLgorCSAgQWxzbyBrZWVwIHRoaW5ncyAoTWFrZWZpbGUuYW0gYW5kIHNlY3Rpb25zLnR4dCkgc29ydGVkLgorCSAgUmV3b3JkIGFtYmlnb3VzIHJldHVybnMuIE5vIHRleHQgYWZ0ZXIgc2luY2UgcGxlYXNlLgorCisyMDA5LTAyLTI0IDE3OjU4OjMyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICB1ZHA6IEZpeCBzdHJpY3QtYWxpYXNpbmcgd2FybmluZ3MgZnJvbSBnY2MgNC40LjAKKwkgIEZpeCBzdHJpY3QgYWxpYXNpbmcgd2FybmluZ3MgYnkgZGVmaW5pbmcgYSB1bmlvbiBvbiB0aGUgZGlmZmVyZW50CisJICBzb2NrYWRkciBzdHJ1Y3RzIHRoYXQgd2UgbmVlZC4KKworMjAwOS0wMi0yNCAxNzozNTo0NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgcnRwOiBGaXggY29tcGlsZXIgd2FybmluZyBpbiBoMjY0IHBheWxvYWRlcgorCSAgRml4IGFuIHVuZGVmaW5lZCBiZWhhdmlvdXIgd2FybmluZyBmcm9tIGdjYyA0LjQuMAorCSAgUGF0Y2ggQnk6IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCSAgRml4ZXM6ICM1NzA5OTUKKwkgIFNpZ25lZC1PZmYtQnk6IEphbiBTY2htaWR0IDxqYW4uc2NobWlkdEBzdW4uY29tPgorCisyMDA5LTAyLTIyIDE3OjIzOjA5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgIFVzZSBzaGF2ZSBmb3IgdGhlIGJ1aWxkIG91dHB1dAorCisyMDA5LTAyLTI0IDE0OjU1OjI4ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2djb25mL01ha2VmaWxlLmFtOgorCSogZXh0L2djb25mL2dzdGdjb25mLmM6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmYuaDoKKwkqIGV4dC9nY29uZi9nc3RnY29uZmVsZW1lbnRzLmg6CisJICBnY29uZjogUmVuYW1lIGdjb25mLltjaF0gdG8gZ3N0Z2NvbmYuW2NoXSB0byBwcmV2ZW50IG5hbWUgY29uZmxpY3RzCisKKzIwMDktMDItMjQgMTQ6NDE6MjYgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZm91cmNjLmg6CisJICBxdGRlbXV4OiBBbHNvIHVzZSAiKGMpaW5mIiB0byBmaWxsIHRoZSBjb21tZW50IHRhZworCisyMDA5LTAxLTI2IDExOjA2OjEzICswMTAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgcnRzcHNyYzogcGVyZm9ybSBVRFAgU0VUVVAgYWNjb3JkaW5nIHRvIE1TIFJUU1Agc3BlYworCSAgTVMgUlRTUCBzcGVjIHN0YXRlcyB0aGF0IHRoZSBVRFAgcG9ydCBwYWlyIHVzZWQgaW4gc3Vic2VxdWVudCBTRVRVUAorCSAgcmVxdWVzdHMgZm9yIHZhcmlvdXMgc3RyZWFtcyBtdXN0IGJlIGlkZW50aWNhbCAoc2luY2UgdGhlcmUgd2lsbCBhY3R1YWxseQorCSAgYmUgb25seSAxIHN0cmVhbSBvZiBtdXhlZCBhc2YgcGFja2V0cykuICBGb2xsb3dpbmcgdHJhZGl0aW9uYWwgc3BlY3MgYW5kCisJICB1c2luZyBkaWZmZXJlbnQgcG9ydCBwYWlycyBpbiB0aGUgU0VUVVBzIGZvciBzZXBhcmF0ZSBzdHJlYW1zIHdpbGwgcmVzdWx0CisJICBpbiBhbGwgYnV0IHRoZSBmaXJzdCBvbmUgZmFpbGluZyBhbmQgb25seSBvbmUgc3RyZWFtIGJlaW5nIHN0cmVhbWVkLgorCSAgU28sIGluIGFwcHJvcHJpYXRlIGNpcmN1bXN0YW5jZXMsIHJldHJ5IFVEUCBTRVRVUCB1c2luZyBwcmV2aW91c2x5IHVzZWQKKwkgIHBvcnQgcGFpci4gIEZpeGVzICM1NTI2NTAuCisKKzIwMDktMDItMjMgMjA6NDk6MzcgKzAxMDAgIEF1cmVsaWVuIEdyaW1hdWQgPGdzdGVsenogYXQgeWFob28gZG90IGZyPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgUmVhZCBJQ01QIGVycm9yIG1lc3NhZ2VzIGluc3RlYWQgb2YgbG9vcGluZworCSAgV2hlbiB3ZSBhcmUgZGVhbGluZyB3aXRoIGNvbm5lY3RlZCBzb2NrZXRzIHNoYXJlZCBiZXR3ZWVuIGEgdWRwc3JjIGFuZCBhIHVkcHNpbmsKKwkgIHdlIG1pZ2h0IHJlY2VpdmUgSUNNUCBjb25uZWN0aW9uIHJlZnVzZWQgZXJyb3IgbWVzc2FnZXMgaW4gdWRwc3JjIHRoYXQgd2lsbAorCSAgY2F1c2UgaXQgdG8gZ28gaW50byBhIGJ1cnN0eSBsb29wIGJlY2F1c2UgdGhlIHBvbGwgcmV0dXJucyByaWdodCBhd2F5IHdpdGhvdXQgYQorCSAgbWVzc2FnZSB0byByZWFkLgorCSAgSW5zdGVhZCBvZiBsb29waW5nLCByZWFkIHRoZSBlcnJvciBtZXNzYWdlIGZyb20gdGhlIGVycm9yIHF1ZXVlIGluIHVkcHNyYy4KKwkgIEZpeGVzICM1Njc4NTcuCisKKzIwMDktMDItMjMgMTk6NTM6NTggKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIENvbmRpdGlvbmFsbHkgY29tcGlsZSBjb2RlIGZvciBZVllVCisJICBPbmx5IGNvbXBpbGUgdGhlIGNvZGUgZm9yIHRoZSBZVllVIGZvcm1hdCB3aGVuIHRoZSBmb3JtYXQgaXMgYWN0dWFsbHkgZGVmaW5lZC4KKwkgIFNwb3R0ZWQgYnkgdG1hdHRoIG9uIElSQy4KKworMjAwOS0wMi0xNyAxMTowMTo0NyAtMDgwMCAgTGV2ZW50ZSBGYXJrYXMgPGxmYXJrYXNAbGZhcmthcy5vcmc+CisKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHY0bDJzcmM6IE1ha2Ugc29ydF9ieV9mcmFtZV9zaXplIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQKKwkgIHNvcnRfYnlfZnJhbWVfc2l6ZSBpcyBkZWNsYXJlZCBzdGF0aWMgYW5kIG9ubHkgdXNlZCBpbnNpZGUKKwkgIGFuIGlmZGVmLCBzbyB1c2UgdGhlIHNhbWUgaWZkZWYgdG8gZGVmaW5lIHRoZSBmdW5jdGlvbi4gIEZpeGVzICM1NzIxODUKKwkgIFNpZ25lZC1vZmYtYnk6IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisyMDA5LTAyLTIzIDE3OjA1OjQzICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBBZGQgWVZZVSBmb3JtYXQgdG8gY2FwcworCSAgQWRkIFlWWVUgZm9ybWF0IHRvIHRoZSBjYXBzLiBXZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIGhhbmRsZSB0aGVzZSBjYXBzIHlldCwKKwkgIHRob3VnaC4KKworMjAwOS0wMi0yMyAxNTo0ODo0MSArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5oOgorCSAgU29tZSBjbGVhbnVwcworCSAgUmVtb3ZlIHNvbWUgdW51c2VkIHZhcmlhYmxlcy4KKwkgIEF2b2lkIGEgdXNlbGVzcyBfcmVzeW5jIGNhbGwuCisJICBDb3JyZWN0bHkgdXNlIGEgZ2Jvb2xlYW4uCisKKzIwMDktMDItMjMgMTU6NDM6NTEgKzAxMDAgIFdhaS1NaW5nIEhvIDx3YWltaW5nIGF0IGFpbHVyb3BvZGEgZG90IG5ldD4KKworCSogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICBBbHdheXMgYWRkIFBQUyB0byB0aGUgc3Byb3AtcGFyYW1ldGVycy1zZXQKKwkgIFJld29yayB0aGUgcGFyc2luZyBjb2RlIHRoYXQgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzIGRyb3BwZWQgdGhlIFBQUyBmcm9tCisJICB0aGUgc3Byb3AtcGFyYW1ldGVycy1zZXQuCisJICBGaXhlcyAjNTcyODU0LgorCisyMDA5LTAyLTIzIDEyOjE0OjIzICswMTAwICBBcm5vdXQgVmFuZGVjYXBwZWxsZSA8YXJub3V0IGF0IG1pbmQgZG90IGJlPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBEb24ndCBkbyBjcmF6eSB0aGluZ3Mgd2l0aCAwLzEgZnJhbWVyYXRlcworCSAgV2UgdXNlIDAvMSBmcmFtZXJhdGVzIHRvIG1hcmsgdmFyaWFibGUgZnJhbWVyYXRlcyBhbmQgbWF0cm9za2FtdXggc2hvdWxkIG5vdCB0cnkKKwkgIHRvIGNhbGN1bGF0ZSBhIGZyYW1lIGR1cmF0aW9uIGZvciBpdC4KKwkgIEZpeGVzICM1NzEyOTQuCisKKzIwMDktMDItMjMgMTE6NDU6NTAgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIFJlcXVpcmUgbmV3ZXIgZ3N0LXAtYiBmb3IgdGhlIFJUU1AgZXh0ZW5zaW9ucy4KKwkgIC0tCisKKzIwMDktMDItMjMgMTE6NDI6NTMgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgIENhbGwgbmV3IHJlY2VpdmVfcmVxdWVzdCBtZXRob2QKKwkgIENhbGwgdGhlIHJlY2VpdmVfcmVxdWVzdCBleHRlbnNpb24gbWV0aG9kcyBzbyB0aGF0IGV4dGVuc2lvbnMgY2FuIGhhbmRsZSB0aGUKKwkgIHNlcnZlciByZXF1ZXN0IGlmIHRoZXkgd2FudC4KKworMjAwOS0wMi0yMyAxMToxMzozMCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L3J0c3AvZ3N0cnRzcGV4dC5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcGV4dC5oOgorCSAgQWRkIG1ldGhvZCBmb3IgaGFkbGluZyBzZXJ2ZXIgcmVxdWVzdHMKKwkgIEFkZCBtZXRob2QgdG8gaGFuZGxlIHNlcnZlciByZXF1ZXN0cyBvbiB0aGUgbGlzdCBvZiBSVFNQIGV4dGVuc2lvbnMuCisKKzIwMDktMDItMTMgMTQ6Mzk6MjkgKzAxMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJICBEb24ndCB1c2UgR1NUX0VSUk9SIGZvciBub24tZXJyb3IgY2FzZXMuCisJICBUdXJuIGEgR1NUX0VSUk9SIGxpbmUgaW50byBhIEdTVF9ERUJVRyBsaW5lIHNvIHRoYXQgd2UgZG9uJ3Qgc3BhbSB0aGUgbG9nIHdpdGgKKwkgIGVycm9ycy4gRml4ZXMgIzU3MDc4MS4KKworMjAwOS0wMi0yMiAxOTozMDozMiArMDEwMCAgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorCisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NpbmsuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5oOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zcmMuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc3JjLmg6CisJICBnY29uZnZpZGVvKHNyY3xzaW5rKTogRGlzY29ubmVjdCBHQ29uZiBub3RpZmljYXRpb25zCisJICBGaXhlcyBidWcgIzU3MTMyMS4KKworMjAwOS0wMi0yMiAxOToyNTozOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgbWF0cm9za2FkZW11eDogVW5yZWYgdGhlIGJ1ZmZlciBhbmQgbm90IHRoZSBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgYnVmZmVyCisKKzIwMDktMDItMjIgMTg6NDc6MzUgKzAxMDAgIE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6CisJICBhbGF3L211bGF3OiBJbXBsZW1lbnQgX2dldGNhcHMgZnVuY3Rpb24gZm9yIGFsYXcvbXVsYXcgZGVjb2RlcnMKKwkgIEZpeGVzIGJ1ZyAjNTcyMzU4LgorCisyMDA5LTAyLTIyIDE4OjQ2OjAzICswMTAwICBPbGl2aWVyIENyZXRlIDx0ZXN0ZXJAdGVzdGVyLmNhPgorCisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOgorCSAgYWxhdy9tdWxhdzogRG9uJ3QgcmVxdWlyZSBib3RoLCByYXRlIGFuZCBjaGFubmVsLCB0byBiZSBzZXQgaW4gX2dldGNhcHMKKwkgIEZpeGVzIGJ1ZyAjNTcyMzU4LgorCisyMDA5LTAyLTIyIDE4OjMyOjAyICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgYXZpZGVtdXg6IEZpeCBhbGlnbm1lbnQgaXNzdWVzIGJ5IHVzaW5nIEdTVF9SRUFEXyoKKwkgIFJlYWRpbmcgaW50ZWdlcnMgZnJvbSByYW5kb20gbWVtb3J5IGFkZHJlc3NlcyB3aWxsIHJlc3VsdAorCSAgaW4gU0lHQlVTIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcyBpZiB0aGUgbWVtb3J5IGFkZHJlc3MKKwkgIGlzIG5vdCBjb3JyZWN0bHkgYWxpZ25lZC4gVGhpcyBjYW4gaGFwcGVuIGF0IHR3bworCSAgcGxhY2VzIGluIGF2aWRlbXV4IHNvIHdlIHNob3VsZCB1c2UgR1NUX1JFQURfVUlOVDMyX0xFCisJICBhbmQgZnJpZW5kcyBoZXJlLiBGaXhlcyBidWcgIzU3MjI1Ni4KKworMjAwOS0wMi0yMiAxODowODo1OSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOgorCSAgcHVsc2VtaXhlcjogRG9uJ3QgdXNlIGdfYXRvbWljX2ludF8oZ2V0fHNldCkgZm9yIGFjY2Vzc2luZyB0aGUgbWl4ZXIgdHJhY2sgZmxhZ3MKKwkgIGdfYXRvbWljX2ludF8oZ2V0fHNldCkgb25seSB3b3JrIG9uIGludHMgYW5kIHRoZSBmbGFncyBhcmUKKwkgIGFuIGVudW0gKHdoaWNoIG9uIG1vc3QgYXJjaGl0ZWN0dXJlcyBpcyBzdG9yZWQgYXMgYW4gaW50KS4KKwkgIEFsc28gdGhlIHdheSB0aGUgZmxhZ3Mgd2VyZSBhY2Nlc3NlZCBhdG9taWNhbGx5IHdvdWxkIHN0aWxsCisJICBsZWF2ZSBhIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIGFuZCB3ZSBkb24ndCBkbyBpdCBpbiBhbnkKKwkgIG90aGVyIG1peGVyIHRyYWNrIGltcGxlbWVudGF0aW9uLCBsZXQgYWxvbmUgYXQgYW55IG90aGVyCisJICBwbGFjZSB3aGVyZSBhbiBpbnRlZ2VyIGNvdWxkIGJlIGNoYW5nZWQgZnJvbSBkaWZmZXJlbnQKKwkgIHRocmVhZHMuIFJlbW92aW5nIHRoZSBnX2F0b21pY19pbnRfKGdldHxzZXQpIHdpbGwgb25seQorCSAgaW50cm9kdWNlIGEgbmV3IHJhY2UgY29uZGl0aW9uIG9uIGFyY2hpdGVjdHVyZXMgd2hlcmUKKwkgIGludGVnZXJzIGNvdWxkIGJlIGhhbGYtd3JpdHRlbiB3aGlsZSByZWFkaW5nIHRoZW0KKwkgIHdoaWNoIHNob3VsZG4ndCBiZSB0aGUgY2FzZSBmb3IgYW55IG1vZGVybiBhcmNoaXRlY3R1cmUKKwkgIGFuZCBpZiB3ZSByZWFsbHkgY2FyZSBhYm91dCB0aGlzIHdlIG5lZWQgdG8gdXNlCisJICBnX2F0b21pY19pbnRfKGdldHxzZXQpIGF0IG1hbnkgb3RoZXIgcGxhY2VzIHRvby4KKwkgIEFwYXJ0IGZyb20gdGhhdCBnX2F0b21pY19pbnRfKHNldHxnZXQpIHdpbGwgcmVzdWx0IGluCisJICBhbGlhc2luZyB3YXJuaW5ncyBpZiB0aGVpciBhcmd1bWVudCBpcyBleHBsaWNpdGVseQorCSAgY2FzdGVkIHRvIGFuIGludCAqLiBGaXhlcyBidWcgIzU3MTE1My4KKworMjAwOS0wMi0yMiAxNTo1MjowNiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBjb21tb246CisJICBBdXRvbWF0aWMgdXBkYXRlIG9mIGNvbW1vbiBzdWJtb2R1bGUKKwkgIEZyb20gNWQ3YzljYyB0byA5Y2Y4YzliCisKKzIwMDktMDItMjIgMTI6NDE6NTMgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJICBoZHYxMzk0c3JjOiBEb24ndCB1c2Ugdm9pZCAqIHBvaW50ZXIgYXJpdGhtZXRpYworCisyMDA5LTAyLTIxIDExOjEzOjQzIC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29tbW9uOgorCSAgQXV0b21hdGljIHVwZGF0ZSBvZiBjb21tb24gc3VibW9kdWxlCisJICBGcm9tIDgwYzYyN2QgdG8gNWQ3YzljYworCisyMDA5LTAyLTIxIDE4OjQyOjQ2ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQgLT4gMC4xMC4xNC4xCisKKzIwMDktMDItMjAgMTg6MTY6MDIgLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBEb2N1bWVudCBydHBkdG1mZGVwYXkgYSBiaXQKKworMjAwOS0wMi0yMCAxNzo0MTozNyAtMDUwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mLmM6CisJICBNb3ZlZCBkdG1mIGVsZW1lbnRzIGZyb20gZ3N0LXBsdWdpbnMtZmFyc2lnaHQgdG8gLWJhZAorCisyMDA5LTAyLTIwIDE3OjQwOjU3IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuaDoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5oOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5oOgorCSAgRml4IHVwIGRvY3VtZW50YXRpb24gYmxvYnMgU0dNTAorCisyMDA5LTAyLTIwIDE3OjM3OjQzIC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWYuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuaDoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZjb21tb24uaDoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5Lmg6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmg6CisJICBSZS1pbmRlbnQgdG8gR3N0IHN0eWxlCisKKzIwMDktMDItMTggMTM6MzA6NDQgLTA1MDAgIExhdXJlbnQgR2xheWFsIDxzcGdsZWdsZUB5YWhvby5mcj4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIE1pc3NpbmcgZm9ybWF0IGRpcmVjdGl2ZQorCisyMDA4LTEyLTA0IDIxOjIxOjQ0IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5Lmg6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQWxsb3cgc2V0dGluZyBhIG1heGltdW0gZHVyYXRpb24gdG8gYSBSVFAgRFRNRiBldmVudAorCisyMDA4LTEyLTA0IDIxOjExOjE3IC0wNTAwICBPbGl2aWVyIENyw6p0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIEltcHJvdmUgdGhlIG1pbmltdW0gcXVhbnRhIHRvIG1ha2UgaXQgaW1wb3NzaWJsZSBmb3IgdGhlIGR1cmF0aW9uIHRvIGZhbGwgZG93biB0byAwCisKKzIwMDgtMTItMDEgMTg6MzE6NDggLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuaDoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBBbGxvdyBzZXR0aW5nIGEgbWluaW11bSBzaXplIG9mIGEgc291bmQgcXVhbnRhIGluIHRoZSBkdG1mIGRlcGF5bG9hZGVyCisKKzIwMDgtMTItMTEgMTc6NTQ6MTggLTA1MDAgIE9saXZpZXIgQ3LDqnRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvLmdpdC1kYXJjcy1kaXI6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gUmVtb3ZlIC5naXQtZGFyY3MtZGlyIGZpbGVzCisKKzIwMDgtMTItMDEgMTc6Mzc6MTAgLTA1MDAgIEjDpXZhcmQgR3JhZmYgPGhhdmFyZC5ncmFmZkB0YW5kYmVyZy5jb20+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIERvIHdpZXJkIGNhc3Rpbmcgb2YgdGhlIHZvbHVtZSB0byBtYWtlIE1TVkMgaGFwcHkKKworMjAwOC0xMC0xNSAxNjoyMTo1MCAtMDQwMCAgT2xpdmllciBDcsOqdGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQ2xhcmlmeSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgImV2ZW50LXR5cGUiIGZpZWxkIHdoZW4gc3BlY2lmeWluZyBkdG1mIGV2ZW50cworCisyMDA4LTA3LTIyIDIxOjM5OjM4ICswMDAwICBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIFJlbW92ZSBnX2RlYnVncworCSAgMjAwODA3MjIyMTM5MzgtM2UyZGMtNDRhODJkMDE3ZmU2NmYzMTEyMzAxYzQxMGFhMGI1NDNkZTYxNTZhZC5negorCisyMDA4LTA2LTEzIDIzOjU3OjIzICswMDAwICBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIFRha2UgcmF0ZSBmcm9tIHRoZSBwZWVycyBjYXBzIGlmIHBvc3NpYmxlCisJICAyMDA4MDYxMzIzNTcyMy0zZTJkYy0xNTY5MGVlNDI3MDhjNTM5ZTFiZTEyZTIwZTA3NmE1NjEzZmFlYTk2Lmd6CisKKzIwMDgtMDYtMTMgMjM6NDE6NDQgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmg6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gUHV0IHRoZSBzYW1wbGUgcmF0ZSBpbiBkdG1mc3JjIGludG8gYSB2YXJpYWJsZQorCSAgMjAwODA2MTMyMzQxNDQtM2UyZGMtZTYwMDcwOTQzYmVjODI5YjcwM2I4ODIxYzdhYTQzNTFhMDJkZWViZS5negorCisyMDA4LTA2LTEzIDIzOjMwOjA2ICswMDAwICBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIFRha2UgdGhlIGNsb2NrLXJhdGUgZnJvbSB0aGUgY2FwcyBpbiBydHBkdG1mc3JjCisJICAyMDA4MDYxMzIzMzAwNi0zZTJkYy1hN2Q0ZTkxODY0M2Y0ZjhjMWJiMmNjMjY3ODU1OGM2NTQwMjU5MjBlLmd6CisKKzIwMDgtMDQtMjggMjI6MjI6MzcgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9NYWtlZmlsZS5hbToKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBMaW5rIG1vZHVsZXMgd2l0aCBsaWJtIHdoZXJlIHJlcXVpcmVkCisJICAyMDA4MDQyODIyMjIzNy0zZTJkYy1iMWU5MTIwYzFlOWNhMWE1MTBiZmQ3YzI3ZTJkNDVmMGQ0YTEyNTA0Lmd6CisKKzIwMDgtMDQtMTIgMjM6NDQ6MTggKzAwMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIEZpeCBieXRlIG9yZGVyaW5nIGlzc3VlcyB3aXRoIGR0bWZzcmMgYW5kIHJ0cGR0bWZkZXBheS4uIHVzZSBvZiBHX1NUUklOR0lGWSB0byBhdm9pZCBlcnJvciBvbiBNU1ZDCisJICAyMDA4MDQxMjIzNDQxOC00ZjBmNi00ODI4ZDE2MTNkZmNkNTY0YWZkMjM2ZGZjOGZiNTdhMjk5MDkyZjgzLmd6CisKKzIwMDgtMDMtMjAgMTk6MTQ6MzggKzAwMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5Lmg6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gRml4IGNvcHlyaWdodHMgYWdhaW4sIHBlciBzbWN2J3MgYWR2aWNlLi4KKwkgIDIwMDgwMzIwMTkxNDM4LTRmMGY2LTY3MWM5ZGI1ZDk5NmE0NjAxZGYwMTdjZWFiNGFmNmQxNjQ2OWM5NjYuZ3oKKworMjAwOC0wMy0xOSAyMToxNzozMSArMDAwMCAgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBNYWtlIGl0IGNsZWFyIHRoYXQgZHRtZnNyYyBhbHNvIHRha2VzIG5hbWVkIGV2ZW50cyBhcyBpbnB1dAorCSAgMjAwODAzMTkyMTE3MzEtM2UyZGMtMjZjNzI5ZjZkYzhkYjI3ZTcxY2Y2YjIyNjQ2YTgxNTMwZGJmODYyZi5negorCisyMDA4LTAzLTIwIDE4OjQ4OjQxICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBkZWJ1ZyBtZXNzYWdlIG1hZGUgaW50byBlcnJvcnMgYmVjYXVzZSB0aGF0J3Mgd2hhdCB0aGV5IGFyZS4uLgorCSAgMjAwODAzMjAxODQ4NDEtNGYwZjYtOGEyZDI4MzI5N2IwMjcxM2RhZGUwYWU0YWNhYTVmNmUwZjY3ZWFjZS5negorCisyMDA4LTAzLTIwIDE4OjM5OjM3ICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBDbGVhbiB1bnVzZWQgc3R1ZmYuLi4KKwkgIDIwMDgwMzIwMTgzOTM3LTRmMGY2LWJjYjg0MWNkYzA3ZjllOTY3NzUxMmY0YjUwYjRiNjU5YTU4YzY3ODMuZ3oKKworMjAwOC0wMy0yMCAxODozOToxMiArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuaDoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBGaXggY29weXJpZ2h0cworCSAgMjAwODAzMjAxODM5MTItNGYwZjYtNjg5MzY1ZDVhNDA2NjMyZTNkMDg4ZmFjNzRlNGZiNmY4YTRlYjBlYS5negorCisyMDA4LTAzLTIwIDAxOjEzOjAxICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9NYWtlZmlsZS5hbToKKwkqIGdzdC9kdG1mL2dzdGR0bWYuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuaDoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBBZGRpbmcgc3VwcG9ydCBmb3IgcnRwZHRtZmRlcGF5CisJICAyMDA4MDMyMDAxMTMwMS00ZjBmNi1kMzZhNWQyNGJlMjAzMzZlMzZjNDc5NmQ3NTQ3NmM5YjVlZTFhN2UxLmd6CisKKzIwMDgtMDMtMTkgMTk6MzI6NTEgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gZW5jb2RpbmcgbmFtZSBoYXMgdG8gYmUgdXBwZXItY2FzZQorCSAgMjAwODAzMTkxOTMyNTEtM2UyZGMtMTU4MWIzM2JlOWI0ODZlMzVlYzQ5NDgwMDk2NzdjY2Q1ZmZkYzA5OC5negorCisyMDA4LTAzLTIwIDAwOjUxOjQ3ICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mY29tbW9uLmg6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5oOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIEFkZGluZyBuZWNlc3NhcnkgZmlsZXMgZm9yIHJ0cGR0bWZkZXBheQorCSAgMjAwODAzMjAwMDUxNDctNGYwZjYtNTUwZmUyMmY3MDE1MmYzYWFiM2RjZDdhNmIwMmNiZjgxZTg5MjMyZC5negorCisyMDA4LTAzLTIwIDAwOjUwOjQxICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gRml4IHR5cG9zCisJICAyMDA4MDMyMDAwNTA0MS00ZjBmNi05ZDIyZmE1ZDE1NWUzNWI2MDVlYTg1YjFmZDllNzE5N2E4ODJhMWYwLmd6CisKKzIwMDgtMDItMTYgMTM6NDE6NDAgKzAwMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIGR0bWZzcmM6IENvcnJlY3RseSBzZXQgdGhlIGVuZGlhbmVzcyBpbiB0aGUgY2FwcyB0byB0aGUgbWFjaGluZXMgZW5kaWFuZXNzCisJICAyMDA4MDIxNjEzNDE0MC05M2I5YS00MGEzYTlkN2FjMTY3OWM1ZTBkZmQyNGE2YjkxZTRhYmE2Y2M2NDk2Lmd6CisKKzIwMDctMDktMTcgMTc6NTI6MzMgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gU2VhcmNoJlJlcGxhY2Ugb29wcworCSAgMjAwNzA5MTcxNzUyMzMtM2UyZGMtNTdmNTc5YzRiODkwOTkzZjQ5ZmE4ZTllNjQ3MGEzZWI3OWQyYjkyMi5negorCisyMDA3LTA5LTE3IDE3OjUxOjMzICswMDAwICBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIGV2ZW50cyBkb250IHlldCBiZWxvbmcgaW4gdGhlIGNhcHMKKwkgIDIwMDcwOTE3MTc1MTMzLTNlMmRjLWZkMWQ4M2I3ODI2Yjg5ODExMGZjNTcxYWU3YzM0NDBmMTg4NzQzNGQuZ3oKKworMjAwNy0wOS0xNyAxNjowODoyMCArMDAwMCAgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBBZGQgcGF0Y2ggdG8gbWFrZSBpdCB3b3JrIHdpdGggbWFlbW8gZHNwIHNvdXJjZXMgdGhhdCBwYXlsb2FkIGluY29ycmVjdGx5CisJICAyMDA3MDkxNzE2MDgyMC0zZTJkYy0wNmIxYjFkMWIwOTE4YjMwZGFiZWE1YTA3MTRjYjczMmIzYjhkOGRkLmd6CisKKzIwMDctMDktMTcgMDQ6MjY6NDkgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gT29wcywgc2V0IHRvIG5vIHByZXJvbGwgd2hlbiBwbGF5aW5nLT5wYXVzZWQgdG9vCisJICAyMDA3MDkxNzA0MjY0OS0zZTJkYy05NGFkYjZhYTA2MTdlODE1YTZlMjMzMjMyZGFiYjRiYmM0OGRjODJjLmd6CisKKzIwMDctMDktMTcgMDA6MzY6NTQgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmg6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQ29tcGxldGUgcG9ydCB0byBiYXNlc3JjCisJICAyMDA3MDkxNzAwMzY1NC0zZTJkYy1kYjBmODRkYWJkOWRkMWFjOTI5YTA0NjE4NjViOGFhYThlZjkxYTc3Lmd6CisKKzIwMDctMDktMTcgMDA6MjQ6MTIgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmg6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQWRkIGNhcHMgbmVnb3RpYXRpb24gZnVuY3Rpb24KKwkgIDIwMDcwOTE3MDAyNDEyLTNlMmRjLWNhMjY2ODE2ZTk2Mjk3NDZlOTA4M2M1YmI4YjdmNzNiOTRhOWIyYjAuZ3oKKworMjAwNy0wOS0xNyAwMDoxNjo1OSArMDAwMCAgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBQcm9wZXJseSBmcmVlIG5vbi1zdGFydCBldmVudHMKKwkgIDIwMDcwOTE3MDAxNjU5LTNlMmRjLWE1NzE3NzdlM2VjZmI5MDk4OWY4NzQxMmY1NTRhYTEwYTMxY2MyY2EuZ3oKKworMjAwNy0wOS0xNyAwMDoxNTo1MiArMDAwMCAgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBNYWtlIGludGVydmFsIGFuZCBwYWNrZXRfcmVkdW5kYW5jeSBpbnRvIHVpbnQKKwkgIDIwMDcwOTE3MDAxNTUyLTNlMmRjLTYwMDMyZTU0N2IzNjY5Yjg3MzE3Yzk4MWQ5ODVjMTU2YWFiOTFiNDAuZ3oKKworMjAwNy0wOS0xNiAxOTo0NDowOCArMDAwMCAgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuaDoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBNYWtlIHRoZSBydHAgZHRtZiBzcmMgdXNlIGJhc2VzcmMKKwkgIDIwMDcwOTE2MTk0NDA4LTNlMmRjLTczNDAwMDEzMGRjZTI0MzRhMDE0YWNmODQzZDY0MWZmMGU2MGFhNWEuZ3oKKworMjAwNy0wOS0xNiAxOTo0MTowMSArMDAwMCAgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBNYWtlIGR0bWYgc3JjIGNvZGUgbmljZXIKKwkgIDIwMDcwOTE2MTk0MTAxLTNlMmRjLWE4YmU4YzUwOWM2NTQwMGQxZDM5NjJkYTAyZTY3ZDE1ZDIwNTQzMTYuZ3oKKworMjAwNy0wOS0xNCAwNDoyMDo0MiArMDAwMCAgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuaDoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBJbXBsZW1lbnQgc3RvcHBpbmcgaW4gYSBuaWNlIHRocmVhZCBzYWZlIHdheQorCSAgMjAwNzA5MTQwNDIwNDItM2UyZGMtMWZlMjU3ZmY0YjcyYWNhNGIwZWI1ZjI4NWExNDY1MGI4ZGYyNjhjMy5negorCisyMDA3LTA5LTE0IDA0OjE4OjM0ICswMDAwICBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIFJlbW92ZSBnZXRfdGltZXMgKFdpbSBzYXlzIGl0cyBvbmx5IGdvb2QgZm9yIHJlYWxseSBmYWtlIHNvdXJjZXMpCisJICAyMDA3MDkxNDA0MTgzNC0zZTJkYy1mZmY0ZDVkYTJhMTQ1ZjE5ZTdiNjEwYTEwMjdkMmM0ZDRiYzVlYWUwLmd6CisKKzIwMDctMDktMTMgMjE6MjE6NDUgKzAwMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSB1c2luZyB0aGUgdW5sb2NrIG1ldGhvZCBvZiBiYXNlc3JjCisJICAyMDA3MDkxMzIxMjE0NS00ZjBmNi0wZTQzOGE2ODFiZjE2NTFjMGNjMGQ4ZmEzMjY5YWVkM2YxNjY4YjZiLmd6CisKKzIwMDctMDktMTMgMjE6MTI6MjYgKzAwMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBtb3JlIGRlYnVnCisJICAyMDA3MDkxMzIxMTIyNi00ZjBmNi1iYzMyYjU4MjhmYzhlMDMyM2M4YTZlZWU3NzlhMzgxNDVhYWNkNTkzLmd6CisKKzIwMDctMDktMTMgMjA6NDY6MTQgKzAwMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBhZGRlZCBkZWJ1Z3MKKwkgIDIwMDcwOTEzMjA0NjE0LTRmMGY2LTY4YzJhNjlhZTdhMWVmY2E2ZTEzYzExNmRiYWQ3ZjliNjg2ZjAyNDIuZ3oKKworMjAwNy0wOS0xMyAxOToyMDo1MyArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIE1ha2Ugc3VyZSB0byB1bmxvY2sgdGhlIHRocmVhZCB3aGVuIGdvaW5nIHRvIHJlYWR5IGFuZCB0byBmbHVzaCB0aGUgcXVldWUgd2hlbiBtb3ZpbmcgdG8gcGF1c2VkIG9yIHBsYXlpbmcKKwkgIDIwMDcwOTEzMTkyMDUzLTRmMGY2LTc2YzM5MjUzODBkMWEzMDk4ODI4NjE3MDUzNWE2NWRlYTY0YTU1ODMuZ3oKKworMjAwNy0wOS0xMyAxNzo1NToyMCArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5oOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIENoYW5nZWQgZHRtZnNyYyBpbnRvIGEgc3ViY2xhc3Mgb2YgR3N0QmFzZVNyYworCSAgMjAwNzA5MTMxNzU1MjAtNGYwZjYtMTZjYTRiZjkzNjkwMDcyZjNlODM2ZDFjOGE1YjUyY2Y3YTQyMTkxNi5negorCisyMDA3LTA5LTA0IDIyOjU3OjUzICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmg6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmg6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQWRkIGFub3RoZXIgZml4IGZvciBhIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uCisJICAyMDA3MDkwNDIyNTc1My00ZjBmNi01YmE4YzQyNjBjMDAyYmIyN2ViOThlOWZhYmEzYzE1Nzk5MzU3YjU3Lmd6CisKKzIwMDctMDktMDQgMjE6NTI6MjQgKzAwMDAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQWRkIGNvbW1lbnQgdG8gZXhwbGFpbiBwdXNoIGJhY2sKKwkgIDIwMDcwOTA0MjE1MjI0LTNlMmRjLWQ5MmFjMWY0MDNkY2Y1NzE1NDZhN2M1M2YxODgwOWY4NDBlZWE1MWQuZ3oKKworMjAwNy0wOS0wNCAyMDo1NTowOSArMDAwMCAgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBQcm9wZXJseSBkbyB0aGUgbG9ja2luZyB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgd2l0aCBjbG9jayB1bnNjaGVkdWxpbmcKKwkgIDIwMDcwOTA0MjA1NTA5LTNlMmRjLWRhMTk5MDBiNTFhZjZhZWRiNjU0N2Y0ZjM5MmJlZjRkMTA2MWRlYzIuZ3oKKworMjAwNy0wOS0wMSAwMDowMzoyNCArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIG91cHMsIEkgZGlkIGl0IGFnYWluLi4uCisJICAyMDA3MDkwMTAwMDMyNC00ZjBmNi0zZDhiNDY2OTFlZTUyMDUzN2IwNmM1MTFhNWU3MzJmNWI4MTJiODQ0Lmd6CisKKzIwMDctMDgtMzEgMjM6NTQ6MjggKzAwMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBvdXBzLCBzb3JyeS4uIERUTUYsIG5vdCBSVFBfRFRNRiBmb3IgdGhpcyBmaWxlLi4uCisJICAyMDA3MDgzMTIzNTQyOC00ZjBmNi0wMGI2MDZiZmI0ODkyZTRmMjE3YzQ0MGI2MTFjYzc5NGFiMGRlNTVhLmd6CisKKzIwMDctMDgtMzEgMjM6NDQ6MTMgKzAwMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuaDoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuaDoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBGaXhlcyB0aGUgZGVhZGxvY2sgd2hlbiBwYXVzaW5nIHRoZSBkdG1mc3JjIGFuZCBydHBkdG1mc3JjLiBIYWQgdG8gcHVzaCBzb21ldGhpbmcgb24gdGhlIGFzeW5jIHF1ZXVlIHRvIHJlbGVhc2UgdGhlIGJsb2NraW5nIGFzeW5jX3F1ZXVlX3BvcCgpLiBUaGFua3MgdG8gT2xpdmllciBmb3IgdGhlIHNvbHV0aW9uLgorCSAgMjAwNzA4MzEyMzQ0MTMtNGYwZjYtNzkzY2YzNWZjNDM2MzZlNzI3NTI1OGNjNzA2M2ZjMDY4ZjVlZmEwYS5negorCisyMDA3LTA4LTI4IDIyOjE1OjM0ICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmg6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmg6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQ2xvY2tJRCB3aGVuIHdhaXRpbmcgZm9yIGJ1ZmZlciBpcyBub3cgdW5zY2hlZHVsZWQgd2hlbiBzdG9wcGluZyB0aGUgdGFzay4gVmFyaW91cyBmaXhlcyB0byBhdm9pZCBidWdzICh0aGFua3MgdG8gLVdhbGwgLVdlcnJvcikuIEZpeGVzIHRvIGFsbG93IHRoZSBtZXJnZSBvZiB0aGUgYnJhbmNoLgorCSAgMjAwNzA4MjgyMjE1MzQtNGYwZjYtYjBkNmE0ZmU0OGM0ZTJhMTZiOWZmNjljYjMxMDA4N2M5NzBjZTQ4ZS5negorCisyMDA3LTA4LTI4IDE3OjE1OjQ2ICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQ2xlYW5lZCB1cCB0aGUgY29kZSBhIGJpdCwgbm8gdXNlIG9mIEdTVF8qIGFuZCByZXR1cm4gdmFsdWUgdmVyaWZpY2F0aW9uIGZyb20gZ3N0XyoKKwkgIDIwMDcwODI4MTcxNTQ2LTRmMGY2LWJkZWI0YjFiN2Y5OWY5NDY0YWFiZTVjNDNiZDRhNGQyMDI1MjYyYjYuZ3oKKworMjAwNy0wOC0yNyAxOTo1NjoxMCArMDAwMCAgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuYzoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBGaXggb3Zlcmx5IGxvbmcgbGluZXMgYW5kIHRhYnMKKwkgIDIwMDcwODI3MTk1NjEwLTNlMmRjLTM5NmEzZmEwMWUxNmYxODRlNDEwOWM3MWZlMmRlYjZlNTE2YmRmMGQuZ3oKKworMjAwNy0wOC0yNyAxOToyNjoxOCArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5oOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIHVudGFiYmlmaWVkIGR0bWZzcmMKKwkgIDIwMDcwODI3MTkyNjE4LTRmMGY2LTc3ZDY4MDcwNDY0ZjFiNWY5YTQ2Y2I2ZWVjMmQ5MjIzNDAxNDNjMDQuZ3oKKworMjAwNy0wOC0yNyAxNzoyNDoyNCArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIEZpeCBSVFAgdGltZXN0YW1wcyBieSBzZW5kaW5nIGEgbmV3X3NlZ21lbnQgZXZlbnQgdG8gdGhlIHBheWxvYWRlcgorCSAgMjAwNzA4MjcxNzI0MjQtNGYwZjYtZDIwOTA3ZTNkNDM2ZDUwYmZlNzRlYjRmYzNkMmQ2ZDdiNmI2ZGJjNS5negorCisyMDA3LTA4LTI3IDE3OjIzOjM5ICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQmV0dGVyIGhhbmRsaW5nIG9mIHBhY2tldHMsIHdlIHNlbmQgdGhlIHNhbWUgZHVyYXRpb24gZm9yIGFsbCBwYWNrZXRzIHRvIGF2b2lkIGh1Z2UgcGFja2V0cyB3aGVuIG1pbiBkdXJhdGlvbiBkZWZpbmVzIGFyZSBtb2RpZmllZC4KKwkgIDIwMDcwODI3MTcyMzM5LTRmMGY2LWNjOTMzMDQ0MzdlYTM3NmZmZjY0NThjNzRjNDZjMTlmNjkyMGQzMjkuZ3oKKworMjAwNy0wOC0yNyAxNzoyMzoyMiArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIENoYW5naW5nIG1pbmltdW0gdmFsdWVzIHRvIHdvcmsgYmV0dGVyIG9uIHNvbWUgZ2F0ZXdheXMKKwkgIDIwMDcwODI3MTcyMzIyLTRmMGY2LTViZjJiZmZhNTlhODI0NDUzOGRjZWQ3OTVmYTdkNzY0OTQ1MmNhOTEuZ3oKKworMjAwNy0wOC0yMiAyMDoxNjo1MyArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIFRoZSBEVE1GIHRvbmUgZ2VuZXJhdG9yIG5vdyByZXNwZWN0cyB0aGUgdm9sdW1lIGFyZ3VtZW50IHBhc3NlZCBpbiB0aGUgZXZlbnQKKwkgIDIwMDcwODIyMjAxNjUzLTRmMGY2LThiN2ZmODc0MDA2ZTExZjVhNzRkMGZkOTFlNWE5YTQzY2QwODJhZGEuZ3oKKworMjAwNy0wOC0yMiAxODowMTozMyArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5oOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIGRvbid0IGtub3cgd2h5IEkgZGlkIHRoYXQuLi4KKwkgIDIwMDcwODIyMTgwMTMzLTRmMGY2LTZhNzM4MmY2YzdkMzYzMGY5MWRhMzg0ZTE5MDQ3NjNjN2VhNmZhMWEuZ3oKKworMjAwNy0wOC0yMiAxNzo1NTozMyArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5oOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIFBvcnRlZCB0aGUgZXZlbnQgcXVldWUgd29yayBmcm9tIGR0bWZzcmMgdG8gcnRwZHRtZnNyYworCSAgQWRkZWQgYSBxdWV1ZSBiYXNlZCBzeXN0ZW0gZm9yIHRoZSBydHBkdG1mc3JjLiBOb3cgaXQgd2FpdHMgZm9yIHN0YXJ0L3N0b3AgbWVzc2FnZXMgb24gdGhlIHF1ZXVlLCBhbmQgbWFrZXMgc3VyZSB0aGF0IHRoZSBtaW5pbXVtIGR1dHkgY3ljbGUgKDEyMG1zKSBpcyByZXNwZWN0ZWQgYmV0d2VlbiBlYWNoCisJICB0b25lLCBpbmNsdWRpbmcgaW50ZXItZGlnaXQgc2lsZW5jZS4KKwkgIDIwMDcwODIyMTc1NTMzLTRmMGY2LWYyNzQxNGM0MDZmMWY3YjAwYzlhOTA4NGE5ODhjZjNhNzkzMGZlNWMuZ3oKKworMjAwNy0wOC0yMiAxNzo1NDo0NCArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIG91Y2gsIHByaW50aW5nIHdpdGggYXJndW1lbnRzIGJ1dCB3aXRob3V0ICVzLi4gdGhhdCBtYWRlIGl0IHNlZ2ZhdWx0IGEgZmV3IHRpbWVzLi4uCisJICAyMDA3MDgyMjE3NTQ0NC00ZjBmNi00NDVlYTZjZTdhOTY2OGQwNGNmOTk5YWY3NzJhNTA0ZWM3NGZiNjdhLmd6CisKKzIwMDctMDgtMjIgMTc6NTE6MjYgKzAwMDAgIFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuYzoKKwkqIGdzdC9kdG1mL2dzdGR0bWZzcmMuaDoKKwkgIFtNT1ZFRCBGUk9NIEdTVC1QLUZBUlNJR0hUXSBNb3ZlZCB0aGUgdGltZXN0YW1wIGZyb20gdGhlIGV2ZW50IHRvIGR0bWZzcmMgc3RydWN0dXJlIHNpbmNlIHdlIGhhdmUgb25seSBvbmUgZXZlbnQgYXQgYSB0aW1lLCBzbyBsZXQncyBrZWVwIGl0IHN0b3JlZCBpbiB0aGUgZHRtZnNyYyBzdHJ1Y3QKKwkgIDIwMDcwODIyMTc1MTI2LTRmMGY2LTUzYmNkYTJiZDhhZThjNTZkMjllNjJlNjlhYzE5YTMwZTA4YWQzNTAuZ3oKKworMjAwNy0wOC0yMCAyMDozODoyNiArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5oOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIEFkZGVkIGEgcXVldWUgYmFzZWQgc3lzdGVtIGZvciB0aGUgZHRtZnNyYy4gTm93IGl0IHdhaXRzIGZvciBzdGFydC9zdG9wIG1lc3NhZ2VzIG9uIHRoZSBxdWV1ZSwgYW5kIG1ha2VzIHN1cmUgdGhhdCB0aGUgbWluaW11bSBkdXR5IGN5Y2xlICgxMjBtcykgaXMgcmVzcGVjdGVkIGJldHdlZW4gZWFjaCB0b25lLCBpbmNsdWRpbmcgaW50ZXItZGlnaXQgc2lsZW5jZS4KKwkgIDIwMDcwODIwMjAzODI2LTRmMGY2LTc1MGEyMmI2MTJhNWU0OTVlNzY3NjY2OTM0NDY1YzM0ZmUzMjA3NGIuZ3oKKworMjAwNy0wOC0yMCAxODo0ODo1MiArMDAwMCAgWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2R0bWYvTWFrZWZpbGUuYW06CisJKiBnc3QvZHRtZi9nc3RkdG1mLmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RkdG1mc3JjLmg6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmM6CisJKiBnc3QvZHRtZi9nc3RydHBkdG1mc3JjLmg6CisJICBbTU9WRUQgRlJPTSBHU1QtUC1GQVJTSUdIVF0gQWRkZWQgZHRtZnNyYywgYSBEVE1GIFRvbmUgR2VuZXJhdG9yLCBhbmQgbWFkZSBpdCBwYXJ0IG9mIHRoZSAnZHRtZicgcGx1Z2luLgorCSAgMjAwNzA4MjAxODQ4NTItNGYwZjYtYTBkODVlNjc3MDgyOTBhZWJhZmE4OWFiNzlkM2NlZGQ1ODE1YjYyMC5negorCisyMDA3LTA4LTIwIDE4OjQ4OjAwICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvZHRtZi8uZ2l0LWRhcmNzLWRpcjoKKwkqIGdzdC9kdG1mL01ha2VmaWxlLmFtOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jOgorCSogZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5oOgorCSAgW01PVkVEIEZST00gR1NULVAtRkFSU0lHSFRdIE1vdmVkIHJ0cGR0bWYgdG8gZHRtZiBkaXJlY3RvcnkKKwkgIDIwMDcwODIwMTg0ODAwLTRmMGY2LWZhMzNlYTk3NDUxMDE2MWRlOGM5OTUxYzM5MDg3YWYzNjEzYjY1YTQuZ3oKKworMjAwOS0wMi0yMSAxMjo0NzowMCArMDEwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgcmVzcGVjdCBERUZBVUxUIHNlZ21lbnQgYnkgY2xpcHBpbmcgdGhlIGxhc3QgYnVmZmVyIHRvIGJlIHNlbnQKKworPT09IHJlbGVhc2UgMC4xMC4xNCA9PT0KKworMjAwOS0wMi0xOSAyMDowOTowNyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgUmVsZWFzZSAwLjEwLjE0CisKKzIwMDktMDItMTkgMjA6MDc6NDEgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAwOS0wMi0xOSAxMzoxNjozOSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc3JjLmM6CisJICBVcGRhdGUgU2luY2U6IHRhZ3MgaW4gYXV0b2RldGVjdCBzcmNzIGFuZCBhdWRpb2VjaG8KKworMjAwOS0wMi0xOSAxMToxMjo1OCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBDaGFuZ2VMb2c6CisJICBVcGRhdGUgQ2hhbmdlTG9nIGZvciAwLjEwLjEzLjMKKworMjAwOS0wMi0xOSAxMTowOTowMyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICAwLjEwLjEzLjMgcHJlLXJlbGVhc2UKKworMjAwOS0wMi0xMCAxMToyNTo0OSArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOgorCSAgcHVsc2VtaXhlcjogRml4IGNvbXBpbGVyIHdhcm5pbmdzLgorCSAgQ2FzdCAoZW51bSAqKSB0byAoaW50ICopLCBub3QgbmVjZXNzYXJpbHkgdGVjaG5pY2FsbHkgcmlnaHQsCisJICBidXQgcGx1Z3MgIzU3MTE1My4KKworMjAwOS0wMi0xMyAxODowMzoxNCArMDEwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkgIHB1bHNlc2luazogSXNzdWUgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbiBpbiBzdHJlYW1pbmcgdGhyZWFkLCByYXRoZXIgdGhhbiBQQSB0aHJlYWQuCisJICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKCkgKGEuby4pIGFuZCBieSBleHRlbnNpb24gZ2V0X3Byb3BlcnR5IHNob3VsZAorCSAgbm90IGJlIGRvbmUgZnJvbSBhIFBBIHRocmVhZCwgYnV0IHRoZSBsYXR0ZXIgbWF5IG9jY3VyIGFzIGEgcmVzdWx0IG9mIGEKKwkgIHByb3BlcnR5IGNoYW5nZSBub3RpZmljYXRpb24uICBGaXhlcyAjNTcxMjA0ICh0aG91Z2ggY3VycmVudCBzaXR1YXRpb24KKwkgIG5vdCBpZGVhbCwgZS5nLiBwb3N0IG1lc3NhZ2UgcmF0aGVyIHRoYW4gc2lnbmFsKS4KKworMjAwOS0wMi0xMCAxMToyNzo1MSArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkgIGFzcGVjdHJhdGlvY3JvcDogRG9uJ3QgZm9yZ2V0IHRvIGNhbGwgcGFyZW50IGZpbmFsaXplIGltcGxlbWVudGF0aW9uLgorCSAgVGhpcyBmaXhlcyBhIG1lbW9yeSBsZWFrIChsZWFraW5nIHRoZSBjb250YWluZWQgZWxlbWVudHMgb2YgdGhlIGJpbikuCisKKzIwMDktMDItMTAgMDg6NDM6NTkgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIG9zeHZpZGVvc2luazogRml4IGJ1aWxkLiBGaXhlcyAjNTcxMDM4CisKKzIwMDktMDItMDkgMTI6MTg6MzYgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGNvbW1vbjoKKwkgIEJ1bXAgcmV2aXNpb24gdG8gdXNlIGZvciBjb21tb24gc3VibW9kdWxlLgorCisyMDA5LTAyLTA3IDE2OjAwOjQ5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIENoYW5nZUxvZzoKKwkgIENoYW5nZUxvZzogVXBkYXRlIENoYW5nZUxvZyBmb3IgMC4xMC4xMy4yCisKKzIwMDktMDItMDcgMTU6NTg6NTUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaWQucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL2phLnBvOgorCSogcG8vbHQucG86CisJKiBwby9tdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIHBvOiBVcGRhdGUgdHJhbnNsYXRpb25zIGZvciAwLjEwLjEzLjIKKworMjAwOS0wMi0wNyAxNTo0NjowNyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTAuMTMuMgorCisyMDA5LTAyLTA3IDE1OjQwOjUzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIHBvL0xJTkdVQVM6CisJKiBwby9tdC5wbzoKKwkgIHBvOiBBZGQgTWFsdGVzZSB0cmFuc2xhdGlvbgorCisyMDA5LTAyLTA2IDE2OjE2OjA1IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2R1bXAuaDoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZm91cmNjLmg6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X3R5cGVzLmM6CisJICBxdGRlbXV4OiBBZGQgaGFuZGxpbmcgZm9yIHN0cHMgYXRvbXMKKwkgIHN0cHMgYXRvbXMgY29udGFpbiAicGFydGlhbCBzeW5jIiBpbmZvcm1hdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCBpdCdzCisJICBhIHN5bmMgcG9pbnQgd2hlcmUgcHRzICE9IGR0cy4gIFRoaXMgaXMgbmVlZGVkIHRvIHByb3Blcmx5IGhhbmRsZQorCSAgTVBFRzIsIEguMjY0LCBEaXJhYywgZXRjLiwgaW4gcXVpY2t0aW1lLgorCisyMDA5LTAyLTA1IDE1OjUxOjQyIC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgZmxhY2RlYzogaWYgd2UgYWJvcnRlZCByZWFkaW5nLCBkb24ndCBkbyBpbnRvIGFuIGluZmluaXRlIGxvb3AuCisJICBJZiBvdXIgcmVhZCBjYWxsYmFjayByYW4gb3V0IG9mIGRhdGEsIHNvIGhhZCB0byBhYm9ydCByZWFkaW5nLCB3ZSByZXR1cm4KKwkgIEdTVF9GTE9XX0VSUk9SIGluc3RlYWQgb2YgZ29pbmcgaW50byBhbiBpbmZpbml0ZSBsb29wLgorCisyMDA5LTAyLTA1IDEwOjE5OjM3IC0wODAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKworCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgb3N4dmlkZW9zaW5rOiByZW1vdmUgbm9uLWVtYmVkZGVkIG1vZGUgYW5kIGZpeCBtZW1vcnkgbWFuYWdlbWVudC4KKwkgIFJlbW92ZSBub24tZW1iZWRkZWQgbW9kZS4gRW1iZWQgbW9kZSBiZWNvbWVzIGRlZmF1bHQgYW5kIG9ubHkgbW9kZS4KKwkgIGVtYmVkIHByb3BlcnR5IGlzIHJldGFpbmVkIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eS4KKwkgIEFkZGVkIGF1dG9yZWxlYXNlIHBvb2xzIGFyb3VuZCBhbGwgb2JqYyBmdW5jdGlvbnMgdGhhdCBtaWdodCBiZSBjYWxsZWQKKwkgIGZyb20gYSBub24tbWFpbiB0aHJlYWQuCisKKzIwMDktMDItMDUgMjA6MDI6MDEgKzAxMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgIGRlYnVnIG9uIHRoZSBvYmplY3QKKworMjAwOS0wMi0wNCAxNjo0MDoxMyAtMDgwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHNvbmdiaXJkbmVzdC5jb20+CisKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hyaW5nYnVmZmVyLmM6CisJICBvc3hhdWRpbyBmaXhlczogbXVsdGljaGFubmVsIGFuZCBjaGFuZ2luZyBjYXBzLgorCSAgRW5zdXJlIHdlIGNyZWF0ZSB0aGUgcmluZ2J1ZmZlciBzZWdtZW50IHNpemUgYXMgYSBtdWx0aXBsZSBvZiB0aGUKKwkgIGJ5dGVzIHBlciBzYW1wbGUgKGZpeGVzIDYtY2hhbm5lbCBvdXRwdXQpLgorCSAgUmVzZXQgdGhlIHNlZ29mZnNldCB3aGVuIGFjcXVpcmluZyB0aGUgcmluZ2J1ZmZlciwgc28gd2UgZG9uJ3QgcmV0YWluCisJICBhIGJvZ3VzIG9mZnNldCB3aGVuIGNhcHMgY2hhbmdlLgorCisyMDA5LTAyLTA0IDExOjM4OjMwICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBydHNwc3JjOiBLZWVwIHRyYWNrIG9mIGNvbm5lY3RlZCBzdGF0ZQorCSAgS2VlcCB0cmFjayBvZiB0aGUgc3RhdGUgb2YgdGhlIGNvbm5lY3Rpb24gYW5kIGRvbid0IHRyeSB0byBzZW5kIFRFQVJET1dOIHdoZW4KKwkgIHRoZSBzZXJ2ZXIgaGFzIGNsb3NlZCB0aGUgY29ubmVjdGlvbi4KKworMjAwOS0wMi0wNCAwOToyMDoyOCArMDEwMCAgUm9iaW4gU3RvY2tlciA8cm9iaW5Abmlib3Iub3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIFJlYWQgTWF0cm9za2EgVGl0bGUgZWxlbWVudCBmb3IgdGhlIFRJVExFIHRhZworCSAgTm90IGFsbCBNYXRyb3NrYSBmaWxlcyBoYXZlIGEgVGFncyBlbGVtZW50IHdoaWNoIGNvbnRhaW5zCisJICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGl0bGUgYW1vbmcgb3RoZXIgdGhpbmdzLiBNb3N0IHZpZGVvCisJICBNYXRyb3NrYSBmaWxlcyBvbmx5IGNvbnRhaW4gdGhlIFRpdGxlIGVsZW1lbnQgc28gd2UKKwkgIHNob3VsZCBwYXJzZSB0aGlzIHRvby4gRml4ZXMgYnVnICM1NzA0MzUuCisKKzIwMDktMDItMDMgMjI6MzQ6MzggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorCisJKiBjb25maWd1cmUuYWM6CisJICBjb25maWd1cmUuYWM6IGJ1bXAgY29yZS9iYXNlIHJlcXVpcmVtZW50cyB0byByZWxlYXNlZCB2ZXJzaW9ucworCisyMDA5LTAyLTAzIDE3OjEwOjMwICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9lY2hvLmM6CisJICBGaXggYXVkaW9lY2hvIHVuaXQgdGVzdCBvbiAzMiBiaXQgc3lzdGVtcworCSAgQ2FzdCB0aGUgbmV3IHZhbHVlIGZvciB0aGUgImRlbGF5IiBwcm9wZXJ0eSB0byBHc3RDbG9ja1RpbWUuCisJICBJbnRlZ2VycyB3aXRob3V0IHR5cGUgYXJlIHBhc3NlZCB0byB2YXJhcmcgZnVuY3Rpb25zIHdpdGgKKwkgIGFuIGludGVnZXIgdHlwZSB0aGF0IGNhbiBob2xkIGEgcG9pbnRlci4KKworMjAwOS0wMi0wMyAxNDowOToyNiArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgZXF1YWxpemVyOiBEb24ndCByZXNldCBmcmVxdWVuY3kgYmFuZHMgZnJvbSB1c2VyIHNldHRpbmdzLiBGaXhlcyAjNTcwMzQzLgorCSAgTW92ZSByZWFsbG9jYXRpbmcgdGhlIGhpc3RvcnkgYnVmZmVyIG91dCBvZiBfY29tcHV0ZV9mcmVxdWVuY2llcygpIGFuZCBjYWxsIHRoZQorCSAgcmlnaHQgZnVuY3Rpb24gYXMgbmVlZGVkLiBBZGQgc29tZSBsb2dnaW5nIGFuZCB0d2VhayB0aGUgZm9ybWF0dGluZyBvZiBleGlzdGluZworCSAgbG9nZ2luZy4gU2ltcGxpZnkgc2V0dGluZyBuZWVkX25ld19jb2VmZmljaWVudHMgd2hlbiBjaGFuZ2luZyBwcm9wZXJ0aWVzLgorCisyMDA5LTAyLTAzIDExOjUyOjE1ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKworCSogZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmM6CisJICBVc2UgZ3VpbnQ2NCBpbnN0ZWFkIG9mIGd1aW50IGZvciBzdG9yaW5nIGd1aW50NjQKKworMjAwOS0wMi0wMiAxODozNzozNSArMDEwMCAgSm9uYXRoYW4gTWF0dGhldyA8bm90dmVyeXNtYXJ0QGdtYWlsLmNvbT4KKworCSogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIFVzZSBjb3JyZWN0IGZsYWcgZm9yIHRoZSBHTk9NRSBwcm94eSBjb25maWd1cmF0aW9uCisJICBGaXhlcyBidWcgIzU1MjE0MC4KKworMjAwOS0wMi0wMiAxMzowODoxNCArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvaWNsZXMvdjRsMnNyYy10ZXN0LmM6CisJICBGaXggY29tcGlsZXIgd2FybmluZ3MKKwkgIGZpeCBjb21waWxlciB3YXJuaW5ncyBkdWUgdG8gdW51c2VkIHJldHVybiB2YWx1ZXMgb2Ygc2NhbmYuCisKKzIwMDktMDEtMzEgMTE6MDg6MzAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiB0ZXN0cy9pY2xlcy92NGwyc3JjLXRlc3QuYzoKKwkgIEZpeCBmb3JtYXQgc3RyaW5nIGNvbXBpbGVyIHdhcm5pbmcKKworMjAwOS0wMS0zMCAyMjoyNDoxNCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgIEFkZCByZWxlYXNlaW5mbyB3aXRoIG9ubGluZSB1cmwuCisKKzIwMDktMDEtMzAgMTg6MDQ6MTEgKzAwMDAgIEphbiBTY2htaWR0IDxqYW4uc2NobWlkdEBzdW4uY29tPgorCisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2ljbGVzL01ha2VmaWxlLmFtOgorCSAgRml4IHVwIHNvbWUgY29tcGlsZSBmbGFncworCisyMDA5LTAxLTMwIDE3OjM1OjQ5ICswMDAwICBKYW4gU2NobWlkdCA8amFuLnNjaG1pZHRAc3VuLmNvbT4KKworCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkgIERvbid0IHVzZSBHbGliIDIuMTYgZnVuY3Rpb24gZ19zdHJjbXAwLgorCisyMDA5LTAxLTMwIDE3OjM0OjQ1ICswMDAwICBKYW4gU2NobWlkdCA8amFuLnNjaG1pZHRAc3VuLmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgRG9uJ3QgZG8gdm9pZCBwb2ludGVyIGFyaXRobWV0aWMKKworMjAwOS0wMS0zMCAxNzoyNjoxOSArMDAwMCAgSmFuIFNjaG1pZHQgPGphbi5zY2htaWR0QHN1bi5jb20+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgRml4IEZvcnRlIGNvbXBpbGVyIHdhcm5pbmdzLgorCSAgRG9uJ3QgZG8gdm9pZCBwb2ludGVyIGFyaXRobWV0aWMuIERvbid0IGhhdmUgYW4gdW5yZWFjaGFibGUgc3RhdGVtZW50LgorCisyMDA5LTAxLTMwIDE3OjI5OjQ1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbW1vbjoKKwkgIEJ1bXAgY29tbW9uCisKKzIwMDktMDEtMjYgMTA6MzM6NTUgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIFJlbW92ZSB1c2VsZXNzIHByb2Nlc3NpbmcgZm9yIG5vbi1yYXcgZm9ybWF0cworCisyMDA5LTAxLTMwIDE1OjM0OjMxICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4X2ZvdXJjYy5oOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eF90eXBlcy5jOgorCSAgQWRkIHN1cHBvcnQgZm9yIHRoZSAnUmVxdWlyZW1lbnQnIGFuZCAnRW5jb2RlcicgdGFncworCisyMDA5LTAxLTMwIDE1OjMzOjE5ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBNb2RpZnkgcHJpdmF0ZS10YWcgbmFtZSBmb3JtYXR0ZXIgc28gdGhhdCBpdCBkb2Vzbid0IGdvIG1hZCBhdCBmb3VyY2Mgc3RhcnRpbmcgd2l0aCAnKGMpJy4KKworMjAwOS0wMS0zMCAxNDo0MDo1MSArMDEwMCAgQnJpamVzaCBTaW5naCA8YnJpamVzaC5rc2luZ2hAZ21haWwuY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuYzoKKwkgIEZpeCBjb21wYXJpc29uIG9mIHRoZSB0dW5lciBub3JtcworCSAgVGhlIFY0TDIgdHVuZXIgbm9ybXMgdGhhdCBhIGRldmljZSBzdXBwb3J0cyBjb3VsZAorCSAgYmUgYSBzdWJzZXQgb2Ygc29tZSBub3JtIChlLmcuIE5UU0MgaW5zdGVhZCBvZiBOVFNDX00pLgorCSAgVGhlIGNvbXBhcmlzb24gc2hvdWxkIGJlIGRvbmUgYnkgJiBpbnN0ZWFkIG9mID09LgorCSAgU2VlIGh0dHA6Ly93d3cubGludXh0di5vcmcvZG93bmxvYWRzL3ZpZGVvNGxpbnV4L0FQSS9WNEwyX0FQSS9zcGVjLXNpbmdsZS92NGwyLmh0bWwjU1RBTkRBUkQKKwkgIEZpeGVzIGJ1ZyAjNTY5ODIwLgorCisyMDA5LTAxLTMwIDA4OjUzOjA2ICswMTAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiBhdXRvZ2VuLnNoOgorCSogY29tbW9uOgorCSAgVXNlIGEgc3ltYm9saWMgbGluayBmb3IgdGhlIHByZS1jb21taXQgY2xpZW50LXNpZGUgaG9vaworCisyMDA5LTAxLTI5IDE0OjA4OjU2ICswMTAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBnc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5jOgorCSAgT25seSB1bnJlZiB0aGUgcGVlciB3aGVuIHRoZXJlIGlzIG9uZS4KKworMjAwOS0wMS0yOSAxMTowNzo1OSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5jOgorCSAgUmVtb3ZlIHZlcnNpb24gbnVtYmVycyBmcm9tIGEgZmV3IGdzdC1sYXVuY2ggZXhhbXBsZXMuCisJICBUaGUgbWFqb3JpdHkgb2YgdGhlIGV4YW1wbGVzIGRvZSBub3QgdXNlIC0wLjEwIGFuZCB0aGlzIHdpbGwgYWxzbyBoZWxwIHVzIHRvIG1haW50YWluIHRoZSBkb2NzLgorCisyMDA5LTAxLTI5IDEwOjEwOjA4ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6CisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJKiBzeXMvb3NzL2dzdG9zc21peGVyZWxlbWVudC5jOgorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6CisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXNpbmsuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICBVcGRhdGUgYW5kIGFkZCBkb2N1bWVudGF0aW9uIGZvciBwbGF0Zm9ybSBzcGVjaWZpYyBwbHVnaW5zIChzeXMpLgorCSAgTGluayB0byBwcm9wZXJ0aWVzLiBDb3JyZWN0IHRpdGxlcyBmb3IgZXhhbXBsZXMuIEZpeCBleGFtcGxlcy4KKworMjAwOS0wMS0yOSAwOTo0NToyNSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSAgQWRkICcgdG8gZnJhbWVyYXRlIGFyZ3VtZW50IGFuZCByZW1vdmUgdGhlIHdvcmQgJ3NpbXBsZScgYXMgYWxsIG91ciBwaXBlbGluZXMgYXJlIGFwcGFyZW50bHkgc2ltcGxlLgorCisyMDA5LTAxLTI5IDA5OjQyOjU2ICswMjAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgIEFkZCBleGFtcGxlcyBmb3IgdGhlIGpwZWcgZWxlbWVudHMuCisKKzIwMDktMDEtMjggMjE6NDA6MTEgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgRml4IGNvbXBpbGUgZXJyb3IgaW4gdGhlIGxhc3QgY29tbWl0CisKKzIwMDktMDEtMjggMjA6MzQ6NDAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L3B1bHNlL3B1bHNlcHJvYmUuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXByb2JlLmg6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJKiBleHQvcHVsc2UvcHVsc2VzaW5rLmg6CisJKiBleHQvcHVsc2UvcHVsc2VzcmMuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5oOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5jOgorCSogZXh0L3B1bHNlL3B1bHNldXRpbC5oOgorCSAgUmV3cml0ZSB0aGUgcHVsc2UgcGx1Z2luLCBjb25kaXRpb25hbGx5IGVuYWJsaW5nIG5ldyBiZWhhdmlvdXIgd2l0aCBuZXdlciBwdWxzZWF1ZGlvLgorCSAgRml4ZXM6ICM1Njc3OTQKKwkgICogSG9vayBwdWxzZXNpbmsncyB2b2x1bWUgcHJvcGVydHkgdXAgd2l0aCB0aGUgc3RyZWFtIHZvbHVtZSAtLSBub3QgdGhlCisJICBzaW5rIHZvbHVtZSBpbiBQQS4KKwkgICogUmVhZCB0aGUgZGV2aWNlIGRlc2NyaXB0aW9uIGRpcmVjdGx5IGZyb20gdGhlIHNpbmsgaW5zdGVhZCBvZiBnb2luZworCSAgdmlhIHRoZSBtaXhlci4KKwkgICogUHJvcGVybHkgaW1wbGVtZW50IF9yZXNldCgpIG1ldGhvZHMgZm9yIGJvdGggc2luayBhbmQgc291cmNlIHRvIGF2b2lkCisJICBkZWFkbG9ja3Mgd2hlbiBzaHV0dGluZyBkb3duIGEgcGlwZWxpbmUuCisJICAqIFJlcGxhY2UgYWxsIHNpbXBsZSBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0KCkgYnkgcHJvcGVyIGxvb3BzIHRvCisJICBndWFyYW50ZWUgdGhhdCB3ZSB3YWl0IGZvciB0aGUgcmlnaHQgZXZlbnQgaW4gY2FzZSBtdWx0aXBsZSBldmVudHMgYXJlCisJICBmaXJlZC4gIFdoaWxlIHRoaXMgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSBpbiBtYW55IGNhc2VzIGl0CisJICBjZXJ0YWlubHkgaXMgbW9yZSBjb3JyZWN0IGFuZCBtYWtlcyBtZSBzbGVlcCBiZXR0ZXIgYXQgbmlnaHQuCisJICAqIFJlcGxhY2UgQ0hFQ0tfREVBRF9HT1RPIG1hY3JvcyB3aXRoIHByb3BlciBmdW5jdGlvbnMKKwkgICogRXh0ZW5kIHRoZSBudW1iZXIgb2Ygc3VwcG9ydGVkIGNoYW5uZWxzIHRvIDMyIHNpbmNlIHRoYXQgaXMgdGhlIGFjdHVhbAorCSAgbGltaXQgaW4gUEEuCisJICAqIEdldCByaWQgb2YgX2Rpc3Bvc2UoKSBtZXRob2RzIHNpbmNlIHdlIGRvbid0IG5lZWQgdGhlbS4KKwkgICogSW5jcmVhc2UgdGhlIHZvbHVtZSBwcm9wZXJ0eSB1cHBlciBsaW1pdCBvZiB0aGUgc2luayB0byAxMDAwLgorCSAgKiBSZXNldCBmdW5jdGlvbiBwb2ludGVycyBhZnRlciB3ZSBkaXNjb25uZWN0IGEgc3RyZWFtL2NvbnRleHQuIEJldHRlcgorCSAgZml4IGZvciBidWcgNTU2OTg2LgorCSAgKiBSZXNldCB0aGUgc3RhdGUgb2YgdGhlIGVsZW1lbnQgcHJvcGVybHkgaWYgb3Blbi9wcmVwYXJlIGZhaWxzCisJICAqIENvcmsgdGhlIFBBIHN0cmVhbSB3aGVuIHRoZSBwaXBlbGluZSBpcyBwYXVzZWQuIFRoaXMgYWxsb3dzIHRoZSBQQQorCSAgKiBkYWVtb24gdG8KKwkgIGNsb3NlIGF1ZGlvIGRldmljZSBvbiBwYXVzZSBhbmQgdGh1cyBzYXZlIGEgYml0IG9mIHBvd2VyLgorCSAgKiBTZXQgUEEgc3RyZWFtIHByb3BlcnRpZXMgYmFzZWQgb24gR1NUIHRhZ3Mgc3VjaCBhcyBHU1RfVEFHX1RJVExFLAorCSAgR1NUX1RBR19BUlRJU1QsIGFuZCBzbyBvbi4KKwkgIFNpZ25lZC1vZmYtYnk6IExlbm5hcnQgUG9ldHRlcmluZyA8bGVubmFydEBwb2V0dGVyaW5nLm5ldD4KKworMjAwOS0wMS0yOCAxNzo0NjowNiArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOgorCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuYzoKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9lc2QvZXNkbW9uLmM6CisJKiBleHQvZXNkL2VzZHNpbmsuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOgorCSogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5jOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zcmMuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZnNpbmsuYzoKKwkqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zaW5rLmM6CisJKiBleHQvaGFsL2dzdGhhbGF1ZGlvc3JjLmM6CisJKiBleHQvaGFsL2hhbC5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L2pwZWcvZ3N0c21va2VkZWMuYzoKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6CisJKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuaDoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSogZXh0L3B1bHNlL3B1bHNlbWl4ZXIuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6CisJKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkqIGV4dC90YWdsaWIvZ3N0YXBldjJtdXguY2M6CisJKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgVXBkYXRlIGFuZCBhZGQgZG9jdW1lbnRhdGlvbiBmb3IgcGx1Z2lucyB3aXRoIGRlcHMgKGV4dCkuCisJICBMaW5rIHRvIHByb3BlcnRpZXMuIENvcnJlY3QgdGl0bGVzIGZvciBleGFtcGxlcy4gRG9jdW1lbnQgYSBmZXcgdHJpdmlhbCBjYXNlcy4gS2VlcCBsaXN0cyBpbiBzZWN0aW9uIGZpbGUgYW5kIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbSBhbHBoYWJldGljYWxseSBvcmRlcmVkLiBGaXggd2FybmluZ3MgdGhhdCBndGstZG9jIHBvaW50cyBvdXQuCisKKzIwMDktMDEtMjggMTU6NTc6MjAgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5oOgorCSAgTGltaXQgdGhlIGRlbGF5IGJ5IGEgbmV3IG1heC1kZWxheSBwcm9wZXJ0eQorCSAgSW50cm9kdWNlIGEgbmV3IG1heC1kZWxheSBwcm9wZXJ0eSB0aGF0IGNhbiBvbmx5CisJICBiZSBzZXQgYmVmb3JlIGdvaW5nIHRvIFBMQVlJTkcgb3IgUEFVU0VELiBUaGlzCisJICBpcyB1c2VkIHRvIGxpbWl0IHRoZSBtYXhpbXVtIGRlbGF5IGFuZCBpcyBzZXQKKwkgIHRvIHRoZSBjdXJyZW50IGRlbGF5IGJ5IGRlZmF1bHQuCisJICBVc2luZyB0aGlzIHdpbGwgbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBlbm91Z2ggZGF0YQorCSAgaW4gb3VyIGludGVybmFsIHJpbmdidWZmZXIgZm9yIHRoZSBlY2hvLiBXaXRoIGR5bmFtaWMKKwkgIHJlYWxsb2NhdGlvbiBvZiB0aGUgcmluZ2J1ZmZlciBhcyB1c2VkIGJlZm9yZSBzaWxlbmNlCisJICBjb3VsZCd2ZSBiZWVuIHVzZWQgYXMgdGhlIGVjaG8gZGlyZWN0bHkgYWZ0ZXIgc2V0dGluZworCSAgYSBuZXcgZGVsYXkuCisKKzIwMDktMDEtMjggMTE6NTg6NDIgKzAxMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJldmVydCBwcmV2aW91cyBib2d1cyBjb21taXQKKworMjAwOS0wMS0yOCAxMjoyOTo0MiArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5LmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmM6CisJKiBnc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOgorCSogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJKiBnc3QvZGVidWcvZ3N0cHVzaGZpbGVzcmMuYzoKKwkqIGdzdC9kZWJ1Zy9nc3R0YWdpbmplY3QuYzoKKwkqIGdzdC9kZWJ1Zy9wcm9ncmVzc3JlcG9ydC5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmM6CisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5jOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuYzoKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvZ29vbTJrMS9nc3Rnb29tLmM6CisJKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzoKKwkqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOgorCSogZ3N0L2xhdy9hbGF3LWRlY29kZS5jOgorCSogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzoKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L211bGF3LmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6CisJKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6CisJKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlYWxwaGEuYzoKKwkqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFVwZGF0ZSBhbmQgYWRkIGRvY3VtZW50YXRpb24gZm9yIHBsdWdpbnMgd2l0aCBubyBkZXBzIChnc3QpLgorCSAgTGluayB0byBwcm9wZXJ0aWVzLiBDb3JyZWN0IHRpdGxlcyBmb3IgZXhhbXBsZXMuIERvY3VtZW50IGEgZmV3IHRyaXZpYWwgY2FzZXMuIEtlZXAgbGlzdHMgaW4gc2VjdGlvbiBmaWxlIGFuZCBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW0gYWxwaGFiZXRpY2FsbHkgb3JkZXJlZC4KKworMjAwOS0wMS0yNyAyMzowOTowNSArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOgorCSogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1vc3NzcmMuYzoKKwkgIEZpeCBleGFtcGxlIGFwcHMgYnkgZHJhd2luZyBpbiB0aGUgbWFpbi1sb29wLgorCisyMDA5LTAxLTI3IDIwOjMzOjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICB0ZXN0czogZml4IGJ1aWxkIG9mIGFzcGVjdHJhdGlvIGNyb3AgdW5pdCB0ZXN0IGluIHVuaW5zdGFsbGVkIGVudmlyb25tZW50LgorCisyMDA5LTAxLTI3IDIwOjMwOjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKworCSogLmdpdGlnbm9yZToKKwkgIE1ha2UgZ2l0IGlnbm9yZSBiYWNrdXAgZmlsZXMKKworMjAwOS0wMS0yNiAxNjoxNDo0NyArMDEwMCAgUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2pAYXhpcy5jb20+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkgIFBsdWcgYSBtZW1vcnkgbGVhayBpbiBhIGRlYnVnIG1lc3NhZ2UuCisKKzIwMDktMDEtMjIgMTU6NTk6NDAgKzAxMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6CisJICBDb3JyZWN0IHJldHVybiB2YWx1ZSBmcm9tIGdzdF91ZHBfZ2V0X2FkZHIoKSB3aGVuIG5vIGtub3duIGZhbWlseSBpcyBmb3VuZC4KKworMjAwOS0wMS0yNiAwOTo1MTozNiArMDEwMCAgSm9uYXRoYW4gTWF0dGhldyA8am9uYXRoYW5AZDE0bi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBVc2UgbGlic291cC1nbm9tZSBmb3IgcHJveHkgY29uZmlndXJhdGlvbiBpZiBhdmFpbGFibGUKKwkgIElmIGxpYnNvdXAtZ25vbWUgaXMgZm91bmQgdXNlIHRoaXMgYXMgaXQgd2lsbCBnaXZlIHVzCisJICB0aGUgR05PTUUgcHJveHkgY29uZmlndXJhdGlvbi4gT3RoZXJ3aXNlIHVzZSBub3JtYWwKKwkgIGxpYnNvdXAuCisJICBUaGUgR05PTUUgcHJveHkgY29uZmlndXJhdGlvbiB3aWxsIG9ubHkgYmUgdXNlZCBpZgorCSAgdGhlIHByb3h5IHByb3BlcnRpZXMgYXJlIG5vdCBzZXQgb24gc291cGh0dHBzcmMKKwkgIGFuZCBpZiB0aGUgaHR0cF9wcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QKKwkgIHNldC4KKwkgIEZpeGVzIGJ1ZyAjNTUyMTQwLgorCisyMDA5LTAxLTI1IDE5OjI2OjQ2IC0wODAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgQWRkIGEgZmV3IG1vcmUgdmlkZW8gZm91cmNjJ3MKKworMjAwOS0wMS0yNCAxNDo0ODowMCArMDEwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvYXNwZWN0cmF0aW9jcm9wLmM6CisJICBBZGQgdW5pdCB0ZXN0IGZvciBhc3BlY3RyYXRpb2Nyb3AgRml4ZXMgYnVnICM1Mjc5NTEKKwkgIEFkZCB1bml0IHRlc3QgZm9yIGFzcGVjdHJhdGlvY3JvcCBhbmQgcmVmYWN0b3IgdGhpcyBlbGVtZW50LiBBZGRlZAorCSAgZmluYWxpemUgZnVuY3Rpb24gdG8gY2xlYW51cCBsZWFraW5nIG11dGV4LgorCisyMDA5LTAxLTI1IDE0OjM0OjA5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJICBJZ25vcmUgY2hlY2sgYmluYXJpZXMKKworMjAwOS0wMS0yNCAxODoyODowNiArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSAgU2F2ZSBzb21lIGFsbG9jYXRpb25zIGlmIHRoZSBlY2hvIGRlbGF5IGlzIGluY3JlYXNlZCBvZnRlbgorCSAgU2F2ZSBzb21lIGFsbG9jYXRpb25zIGlmIHRoZSBlY2hvIGRlbGF5IGlzIGluY3JlYXNlZCBvZnRlbgorCSAgZHVyaW5nIHBsYXliYWNrIGJ5IGFsd2F5cyBhbGxvY2F0aW5nIGVub3VnaCBtZW1vcnkgdG8gaG9sZAorCSAgZGF0YSB1cCB0byB0aGUgbmV4dCBjb21wbGV0ZSBzZWNvbmQsIGkuZS4gaW4gdGhlIHdvcnN0IGNhc2UKKwkgIGFsbG9jYXRlIG1lbW9yeSBmb3Igb25lIGFkZGl0aW9uYWwgc2Vjb25kLgorCisyMDA5LTAxLTI0IDE0OjI1OjA4ICswMTAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkgIFVwZGF0ZSBwbHVnaW4gdmVyc2lvbiBpbiBkb2N1bWVudGF0aW9uCisKKzIwMDktMDEtMjMgMjE6NDc6NDAgKzAxMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJICBGaXggbGluayBpbiBkb2N1bWVudGF0aW9uIG9mIHZpZGVvY3JvcCBlbGVtZW50CisKKzIwMDktMDEtMjMgMjE6NDY6MTMgKzAxMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkgIEFkZCBkb2N1bWVudGF0aW9uIGZvciBhc3BlY3RyYXRpb2Nyb3AKKworMjAwOS0wMS0yNCAxMzoyMTozOSArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFVwZGF0ZSB3aW4zMi9jb21tb24vY29uZmlnLmggZm9yIHRoZSBuZXcgZGV2ZWxvcG1lbnQgY3ljbGUKKworMjAwOS0wMS0yNCAxMTo1Mzo0MCArMDEwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5jOgorCSAgQWRkIG5vdGUgdGhhdCBhdWRpb2VjaG8ncyByZXZlcmIgc291bmRzIG1ldGFsbGljCisJICBBZGQgYSBub3RlIHRvIHRoZSBkb2NzIHRoYXQgYXVkaW9lY2hvJ3MgcmV2ZXJiIHdpbGwKKwkgIHNvdW5kIG1ldGFsbGljLiBUaGlzIGhhcHBlbnMgYmVjYXVzZSBmb3IgYSByZWFsCisJICByZXZlcmIgZmlsdGVyIGFkZGl0aW9uYWwgZmlsdGVyaW5nIGlzIG5lY2Vzc2FyeS4KKwkgIEFsc28gbm90ZSB3aGljaCB2YWx1ZXMgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBkZWxheQorCSAgcHJvcGVydHkgdG8gZ2V0IGFuIGVjaG8gZWZmZWN0LgorCisyMDA5LTAxLTIzIDIzOjM4OjEwICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIC5naXRpZ25vcmU6CisJKiBkb2NzL3BsdWdpbnMvLmdpdGlnbm9yZToKKwkqIHBvLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9leGFtcGxlcy9hdWRpb2Z4Ly5naXRpZ25vcmU6CisJICBNb3JlIGVudHJpZXMgZm9yIHRoZSBnaXRpZ25vcmVzCisKKzIwMDktMDEtMjMgMjA6MzY6MjcgKzAxMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOgorCSAgc2tpcCB2aWRlby94LXJhdy1ncmF5IGluIHZpZGVvY3JvcCB1bml0IHRlc3QKKwkgIEEgcmVjZW50IGNvbW1pdCBhZGRlZCB2aWRlby94LXJhdy1ncmF5IHN1cHBvcnQgdG8gdmlkZW9jcm9wLiBIb3dldmVyCisJICB0aGlzIGxldHMgdGhlIHZpZGVvY3JvcCB1bml0IHRlc3QgZmFpbC4gQmVjYXVzZSB2aWRlb3Rlc3RzcmMgY2FuJ3QKKwkgIGdlbmVyYXRlIHRoaXMgZm9ybWF0LgorCisyMDA5LTAxLTIzIDE1OjM5OjQ2ICswMTAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJKiBnc3QvdmlkZW9jcm9wL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmg6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSAgQWRkIGFzcGVjdHJhdGlvY3JvcCBlbGVtZW50LiBGaXhlcyBidWcgIzUyNzk1MQorCSAgQWRkIG5ldyBhc3BlY3RyYXRpb2Nyb3AgZWxlbWVudCB0aGF0IGNyb3BzIHRoZSB2aWRlbworCSAgdG8gYSBzcGVjaWZpZWQgYXNwZWN0IHJhdGlvIHVzaW5nIHZpZGVvY3JvcC4KKworMjAwOS0wMS0yMyAxMDo0OToyOCArMDEwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkgIEZpeCBuYXZpZ2F0aW9uIGV2ZW50IGZvcndhcmRpbmcgd2hpbGUgY3JvcHBpbmcuIEZpeGVzIGJ1ZyAjNTY3OTkyLgorCSAgRml4IHRoZSBuYXZpZ2F0aW9uIGV2ZW50IGZvcndhcmRpbmcgd2hpbGUgY3JvcHBpbmcgYnkgYWRqdXN0aW5nCisJICB0aGUgbW91c2UgcG9zaXRpb24gYnkgdGhlIGFtb3VudCBvZiBjcm9wcGVkIHBpeGVscy4KKworMjAwOS0wMS0yMyAxMDowNDozOSArMDEwMCAgQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbkBzdW4uY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJICBGaXggbGlua2luZyBvbiBTb2xhcmlzLiBGaXhlcyBidWcgIzU2ODgwOS4KKwkgIENoZWNrIGZvciB0aGUgc29ja2V0IGxpYnJhcnkgd2hpY2ggaXMgbmVlZGVkCisJICBmb3Igc29ja2V0KCkgb24gU29sYXJpcy4KKworMjAwOS0wMS0yMiAyMjo0MTo0MyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJICBCdW1wIHZlcnNpb24gbnVtYmVyIGFnYWluIC0+IDAuMTAuMTMuMQorCisyMDA5LTAxLTIyIDIyOjQxOjAxICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkgIEFkZCByZWxlYXNlcyAwLjEwLjEyIGFuZCAwLjEwLjEzIHRvIHRoZSBkb2FwIGZpbGUKKworMjAwOS0wMS0yMiAxODowODo1MCArMDIwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBjb21tb246CisJICBVcGRhdGUgY29tbW9uIHNuYXBzaG90LgorCisyMDA5LTAxLTIyIDE0OjI1OjA3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIEJhY2sgdG8gZGV2ZWwgLT4gMC4xMC4xMi4xCisKKzIwMDktMDEtMjIgMDE6Mjk6NDAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSAgUmVsZWFzZSAwLjEwLjEyCisKKzIwMDktMDEtMjEgMTc6MjI6MzkgLTA4MDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBGaXggZm9yIHNlY3VyaXR5IGFkdmlzb3J5IFRLQURWMjAwOS0weHgKKwkgIEZpeCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93cyB3aGlsZSByZWFkaW5nIHF1aWNrdGltZSBoZWFkZXJzLgorCSAgU2VjdXJpdHkgaXNzdWUgbm90aWNlZCBieSBUb2JpYXMgS2xlaW4uCisKKzIwMDktMDEtMjEgMTI6NTY6NTUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgRml4IHR5cG8gYW5kIHNtYWxsIGZsYXcgaW4gZmxhYyBkZWNvZGVyCisKKzIwMDktMDEtMjIgMTM6NDk6MzUgKzAxMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogY29tbW9uOgorCSAgRml4IHByZS1jb21taXQgaG9vaworCisyMDA5LTAxLTIyIDEwOjQwOjM0ICswMTAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9meC9hdWRpb2VjaG8uYzoKKwkqIGdzdC9hdWRpb2Z4L2F1ZGlvZWNoby5oOgorCSogZ3N0L2F1ZGlvZngvYXVkaW9meC5jOgorCSogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2VjaG8uYzoKKwkgIFJlbmFtZSBhdWRpb3JldmVyYiB0byBhdWRpb2VjaG8uIEZpeGVzIGJ1ZyAjNTY4Mzk1LgorCSAgVGhlIGVsZW1lbnQgY2FuIGFkZCBhbiBlY2hvIGFuZCBhIHNpbXBsZSByZXZlcmIgZWZmZWN0IHRvCisJICBhbiBhdWRpbyBzdHJlYW0gYnV0IGZvciBhIHJlYWwgcmV2ZXJiIGZpbHRlciBpdCB3b3VsZCBuZWVkCisJICBzb21lIGFkZGl0aW9uYWwgZmlsdGVyaW5nIHRvIHByZXZlbnQgYSBtZXRhbGxpYy1zb3VuZGluZworCSAgcmVzdWx0LgorCisyMDA5LTAxLTIyIDEyOjIxOjI5ICswMTAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBGcmVlIGxlZnRvdmVyIHVkcCBwb3J0cyAoaWYgYW55KSB3aGVuIGEgc2V0dXAgcmVxdWVzdCBmYWlscy4KKworMjAwOS0wMS0yMiAwNjowNToyNiArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogYXV0b2dlbi5zaDoKKwkqIGNvbW1vbjoKKwkgIEluc3RhbGwgYW5kIHVzZSBwcmUtY29tbWl0IGluZGVudGF0aW9uIGhvb2sgZnJvbSBjb21tb24KKworMjAwOS0wMS0yMSAxMzoyNTowNiArMDEwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgV2hpdGVzcGFjZSBmaXhlcyBhbmQgc29tZSBpbXByb3ZlZCBkZWJ1ZyBsaW5lcy4KKworMjAwOS0wMS0yMSAwNDozMTo1OCArMDEwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSogYXV0b2dlbi5zaDoKKwkgIGF1dG9nZW4uc2ggOiBVc2UgZ2l0IHN1Ym1vZHVsZQorCisyMDA5LTAxLTIwIDE1OjMzOjA1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IEZpeCBlcnJvciBjb2RlICh0aGUgbWVzc2FnZSBzdHJpbmcgYWxzbyBuZWVkcyBsb3ZlLCBidXQgbm90IHRvZGF5KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19nZXRfcmVhZCk6CisJICBGaXggZXJyb3IgY29kZSAodGhlIG1lc3NhZ2Ugc3RyaW5nIGFsc28gbmVlZHMgbG92ZSwgYnV0IG5vdCB0b2RheSkuCisKKzIwMDktMDEtMTkgMTE6NDQ6MzYgKzAwMDAgIEx1b3RhbyBGdSA8bC5mdUBwZW5ndXRyb25peC5kZT4KKworCSAgZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzogQWRkIDhiaXQgZ3JheXNjYWxlIHN1cHBvcnQgdG8gdmlkZW9jcm9wIHBsdWdpbi4gRml4ZXMgIzU2Nzk1Mi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEx1b3RhbyBGdSA8bCBkb3QgZnUgYXQgcGVuZ3V0cm9uaXggZG90IGRlPgorCSAgKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSAgKGdzdF92aWRlb19jcm9wX2dldF9pbWFnZV9kZXRhaWxzX2Zyb21fY2Fwcyk6CisJICBBZGQgOGJpdCBncmF5c2NhbGUgc3VwcG9ydCB0byB2aWRlb2Nyb3AgcGx1Z2luLiBGaXhlcyAjNTY3OTUyLgorCisyMDA5LTAxLTE5IDExOjIyOjA2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9hdWRpb2Z4L2F1ZGlvcmV2ZXJiLmM6IFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgaW5zdGFuY2UgaW5pdCBmdW5jdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3JldmVyYi5jOiAoZ3N0X2F1ZGlvX3JldmVyYl9pbml0KToKKwkgIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgaW5zdGFuY2UgaW5pdCBmdW5jdGlvbi4KKworMjAwOS0wMS0xOSAxMToxOTowOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBBZGQgYW4gZWNoby9yZXZlcmIgZmlsdGVyIHRvIHRoZSBhdWRpb2Z4IHBsdWdpbiwgd2l0aCBjb25maWd1cmFibGUgZWNobyBkZWxheSwgaW50ZW5zaXR5IGFuZCBmZWVkYmFjay4gRml4ZXMgYnVnICM1NjcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSAgKiBnc3QvYXVkaW9meC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9meC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3JldmVyYi5jOiAoZ3N0X2F1ZGlvX3JldmVyYl9iYXNlX2luaXQpLAorCSAgKGdzdF9hdWRpb19yZXZlcmJfY2xhc3NfaW5pdCksIChnc3RfYXVkaW9fcmV2ZXJiX2luaXQpLAorCSAgKGdzdF9hdWRpb19yZXZlcmJfZmluYWxpemUpLCAoZ3N0X2F1ZGlvX3JldmVyYl9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdWRpb19yZXZlcmJfZ2V0X3Byb3BlcnR5KSwgKGdzdF9hdWRpb19yZXZlcmJfc2V0dXApLAorCSAgKGdzdF9hdWRpb19yZXZlcmJfc3RvcCksIChnc3RfYXVkaW9fcmV2ZXJiX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvcmV2ZXJiLmg6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3JldmVyYi5jOiAoc2V0dXBfcmV2ZXJiKSwKKwkgIChjbGVhbnVwX3JldmVyYiksIChHU1RfU1RBUlRfVEVTVCksIChhdWRpb3JldmVyYl9zdWl0ZSk6CisJICBBZGQgYW4gZWNoby9yZXZlcmIgZmlsdGVyIHRvIHRoZSBhdWRpb2Z4IHBsdWdpbiwgd2l0aCBjb25maWd1cmFibGUKKwkgIGVjaG8gZGVsYXksIGludGVuc2l0eSBhbmQgZmVlZGJhY2suIEZpeGVzIGJ1ZyAjNTY3ODc0LgorCisyMDA5LTAxLTE5IDEwOjEzOjUzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS4qOiBJbXBsZW1lbnQgYSBzaW1wbGUgY29tcGVuc2F0aW9uIGFsZ29yaXRobSBmb3Igcm91bmRpbmcgZXJyb3JzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX3Jlc2V0X3N0YXRlKSwKKwkgIChnc3Rfc3BlY3RydW1fdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICBJbXBsZW1lbnQgYSBzaW1wbGUgY29tcGVuc2F0aW9uIGFsZ29yaXRobSBmb3Igcm91bmRpbmcgZXJyb3JzLgorCSAgVGhpcyBtYWtlcyBzdXJlIHRoYXQgYSBzcGVjdHJ1bSBtZXNzYWdlIGlzIHBvc3RlZCBvbiB0aGUgYnVzCisJICBldmVyeSBpbnRlcnZhbCBuYW5vc2Vjb25kcy4gRml4ZXMgYnVnICM1Njc5NTUuCisKKzIwMDktMDEtMTUgMjE6MTY6NDUgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtOiBMaW5rIGFnYWluc3QgQ29yZVNlcnZpY2VzIChuZWVkZWQgZm9yIG9zeCAxMC40KSBhbmQgZml4IHVwIHRoZSBsaW5rZXIgZmxhZ3MuIEZpeGVzICM1Njc4NTMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtOgorCSAgTGluayBhZ2FpbnN0IENvcmVTZXJ2aWNlcyAobmVlZGVkIGZvciBvc3ggMTAuNCkgYW5kIGZpeCB1cCB0aGUgbGlua2VyCisJICBmbGFncy4gRml4ZXMgIzU2Nzg1My4KKworMjAwOS0wMS0xNSAxNDo1MzoxOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBDYXRjaCBpbnZhbGlkIGFuZCBjb21tb25seSB3cm9uZyBwbGF5YmFjayByYXRlcyBpbiB0aGUgZWxzdCBhdG9tcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlX3NlZ21lbnRzKToKKwkgIENhdGNoIGludmFsaWQgYW5kIGNvbW1vbmx5IHdyb25nIHBsYXliYWNrIHJhdGVzIGluIHRoZSBlbHN0IGF0b21zLgorCSAgRml4ZXMgIzU2NzgwMC4KKworMjAwOS0wMS0xNSAxMTo0MDoyMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogRG9uJ3QgY2FsbCBnc3RfZmZ0X2YzMl9mcmVlKCkgd2l0aCBOVUxMIHRvIHByZXZlbnQgYSBjcmFzaC4gRml4ZXMgYnVnICM1Njc2NDIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IChnc3Rfc3BlY3RydW1fcmVzZXRfc3RhdGUpOgorCSAgRG9uJ3QgY2FsbCBnc3RfZmZ0X2YzMl9mcmVlKCkgd2l0aCBOVUxMIHRvIHByZXZlbnQgYQorCSAgY3Jhc2guIEZpeGVzIGJ1ZyAjNTY3NjQyLgorCisyMDA5LTAxLTE0IDE1OjQ0OjE4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS4qOiBVc2UgY29ycmVjdCB0eXBlcyBmb3IgZnJhbWUvZmZ0IGNvdW50ZXJzIGFuZCBzb21lIG1pbm9yIGNsZWFudXAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IChnc3Rfc3BlY3RydW1fdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICBVc2UgY29ycmVjdCB0eXBlcyBmb3IgZnJhbWUvZmZ0IGNvdW50ZXJzIGFuZCBzb21lIG1pbm9yCisJICBjbGVhbnVwLgorCisyMDA5LTAxLTE0IDE1OjM3OjA3ICswMDAwICBMZW5uYXJ0IFBvZXR0ZXJpbmcgPGxlbm5hcnRAcG9ldHRlcmluZy5uZXQ+CisKKwkgIGV4dC9wdWxzZS9wdWxzZXByb2JlLmM6IEZpeCByZWZjb3VudCBsb29wLCByZXN1bHRpbmcgaW4gYSB0aHJlYWQgbGVhay4gRml4ZXMgYnVnICM1Njc3NDYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBMZW5uYXJ0IFBvZXR0ZXJpbmcgPGxlbm5hcnQgYXQgcG9ldHRlcmluZyBkb3QgbmV0PgorCSAgKiBleHQvcHVsc2UvcHVsc2Vwcm9iZS5jOiAoZ3N0X3B1bHNlcHJvYmVfbmV3KSwKKwkgIChnc3RfcHVsc2Vwcm9iZV9mcmVlKToKKwkgIEZpeCByZWZjb3VudCBsb29wLCByZXN1bHRpbmcgaW4gYSB0aHJlYWQgbGVhay4gRml4ZXMgYnVnICM1Njc3NDYuCisKKzIwMDktMDEtMTQgMTA6NDY6NTQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L3NwZWN0cnVtLzogUG9zdCBhIHNwZWN0cnVtIG1lc3NhZ2Ugb24gdGhlIGJ1cyBmb3IgZXZlcnkgaW50ZXJ2YWwsIGV2ZW4gaWYgdGhlIGludGVydmFsIGlzIHNtYWxsIHRoYW4gdGhlIGxlbmd0aCBvLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3NwZWN0cnVtL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3BlY3RydW0vUkVBRE1FOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogKGdzdF9zcGVjdHJ1bV9iYXNlX2luaXQpLAorCSAgKGdzdF9zcGVjdHJ1bV9jbGFzc19pbml0KSwgKGdzdF9zcGVjdHJ1bV9pbml0KSwKKwkgIChnc3Rfc3BlY3RydW1fcmVzZXRfc3RhdGUpLCAoZ3N0X3NwZWN0cnVtX2ZpbmFsaXplKSwKKwkgIChnc3Rfc3BlY3RydW1fc2V0X3Byb3BlcnR5KSwgKGdzdF9zcGVjdHJ1bV9zdGFydCksCisJICAoZ3N0X3NwZWN0cnVtX3N0b3ApLCAoZ3N0X3NwZWN0cnVtX3NldHVwKSwKKwkgIChnc3Rfc3BlY3RydW1fdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICBQb3N0IGEgc3BlY3RydW0gbWVzc2FnZSBvbiB0aGUgYnVzIGZvciBldmVyeSBpbnRlcnZhbCwgZXZlbgorCSAgaWYgdGhlIGludGVydmFsIGlzIHNtYWxsIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgRkZULgorCSAgRml4ZXMgYnVnICM1Njc2NDIuCisJICBNYWpvciBjbGVhbnVwIG9mIHRoZSBzcGVjdHJ1bSBlbGVtZW50LgorCisyMDA5LTAxLTEzIDE5OjIzOjU3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIEFkZCBhdWRpb2lpcmZpbHRlciBhbmQgYXVkaW9maXJmaWx0ZXIgZWxlbWVudHMgd2hpY2ggYWxsb3cgZ2VuZXJpYyBJSVIvRklSIGZpbHRlcnMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgcHJvdmlkaW5nIHRoZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmM6IChnc3RfYXVkaW9fZmlyX2ZpbHRlcl9iYXNlX2luaXQpLAorCSAgKGdzdF9hdWRpb19maXJfZmlsdGVyX2NsYXNzX2luaXQpLAorCSAgKGdzdF9hdWRpb19maXJfZmlsdGVyX3VwZGF0ZV9rZXJuZWwpLCAoZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfc2V0dXApLCAoZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfZmluYWxpemUpLAorCSAgKGdzdF9hdWRpb19maXJfZmlsdGVyX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9maXJmaWx0ZXIuaDoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9meC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5jOiAoZ3N0X2F1ZGlvX2lpcl9maWx0ZXJfYmFzZV9pbml0KSwKKwkgIChnc3RfYXVkaW9faWlyX2ZpbHRlcl9jbGFzc19pbml0KSwKKwkgIChnc3RfYXVkaW9faWlyX2ZpbHRlcl91cGRhdGVfY29lZmZpY2llbnRzKSwKKwkgIChnc3RfYXVkaW9faWlyX2ZpbHRlcl9pbml0KSwgKGdzdF9hdWRpb19paXJfZmlsdGVyX3NldHVwKSwKKwkgIChnc3RfYXVkaW9faWlyX2ZpbHRlcl9maW5hbGl6ZSksCisJICAoZ3N0X2F1ZGlvX2lpcl9maWx0ZXJfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfYXVkaW9faWlyX2ZpbHRlcl9nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5oOgorCSAgQWRkIGF1ZGlvaWlyZmlsdGVyIGFuZCBhdWRpb2ZpcmZpbHRlciBlbGVtZW50cyB3aGljaCBhbGxvdworCSAgZ2VuZXJpYyBJSVIvRklSIGZpbHRlcnMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgcHJvdmlkaW5nIHRoZQorCSAgZmlsdGVyIGNvZWZmaWNpZW50cy4gRml4ZXMgYnVnICM1Njc1NzcuCisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnNpZ25hbHM6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkgIEFkZCBkb2N1bWVudGF0aW9uIGZvciB0aGUgYXVkaW9paXJmaWx0ZXIgYW5kIGF1ZGlvZmlyZmlsdGVyCisJICBlbGVtZW50cy4KKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZmlyZmlsdGVyLmM6IChvbl9tZXNzYWdlKSwKKwkgIChvbl9yYXRlX2NoYW5nZWQpLCAob25faGFuZG9mZiksIChHU1RfU1RBUlRfVEVTVCksCisJICAoYXVkaW9maXJmaWx0ZXJfc3VpdGUpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2lpcmZpbHRlci5jOiAob25fbWVzc2FnZSksCisJICAob25fcmF0ZV9jaGFuZ2VkKSwgKG9uX2hhbmRvZmYpLCAoR1NUX1NUQVJUX1RFU1QpLAorCSAgKGF1ZGlvaWlyZmlsdGVyX3N1aXRlKToKKwkgICogdGVzdHMvZXhhbXBsZXMvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2V4YW1wbGVzL2F1ZGlvZngvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2V4YW1wbGVzL2F1ZGlvZngvZmlyZmlsdGVyLWV4YW1wbGUuYzogKG9uX21lc3NhZ2UpLAorCSAgKG9uX3JhdGVfY2hhbmdlZCksIChtYWluKToKKwkgICogdGVzdHMvZXhhbXBsZXMvYXVkaW9meC9paXJmaWx0ZXItZXhhbXBsZS5jOiAob25fbWVzc2FnZSksCisJICAob25fcmF0ZV9jaGFuZ2VkKSwgKG1haW4pOgorCSAgQWRkIHVuaXQgdGVzdHMgYW5kIGV4YW1wbGUgYXBwbGljYXRpb25zIGZvciB0aGUgdHdvIGZpbHRlcgorCSAgZWxlbWVudHMuCisKKzIwMDktMDEtMTMgMTk6MDk6MTkgKzAwMDAgIFRoaWFnbyBTb3VzYSBTYW50b3MgPHRoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEZpeCBmb3JtYXQgc3RyaW5nIGZvciBndWludDY0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVGhpYWdvIFNvdXNhIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIEZpeCBmb3JtYXQgc3RyaW5nIGZvciBndWludDY0LgorCisyMDA5LTAxLTEzIDE5OjA0OjA5ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIHN5cy9vc3hhdWRpby9NYWtlZmlsZS5hbTogb3N4YXVkaW8gcGx1Z2luIG5vdyByZXF1aXJlcyBBdWRpb1VuaXQgZnJhbWV3b3JrLCBzbyBsaW5rIGFnYWluc3QgdGhhdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3N4YXVkaW8vTWFrZWZpbGUuYW06CisJICBvc3hhdWRpbyBwbHVnaW4gbm93IHJlcXVpcmVzIEF1ZGlvVW5pdCBmcmFtZXdvcmssIHNvIGxpbmsgYWdhaW5zdCB0aGF0LgorCSAgQ2xlYW4gdXAgdGFicyB2IHNwYWNlcyB3aGlsZSBJJ20gdGhlcmUuCisKKzIwMDktMDEtMTMgMTc6NDk6MDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLmM6IEFkZCBzb21lIGV4YW1wbGUgY29kZSBmb3IgcHJpbnRpbmcgdGhlIFJUUCBtYW5hZ2VyIHN0YXRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLmM6IChwcmludF9zb3VyY2Vfc3RhdHMpLAorCSAgKHByaW50X3N0YXRzKSwgKG1haW4pOgorCSAgQWRkIHNvbWUgZXhhbXBsZSBjb2RlIGZvciBwcmludGluZyB0aGUgUlRQIG1hbmFnZXIgc3RhdHMuCisKKzIwMDktMDEtMTMgMDg6MjQ6MjUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2F1ZGlvZngvOiBVc2UgYSBjdXN0b20gbXV0ZXggZm9yIHByb3RlY3RpbmcgdGhlIGluc3RhbmNlIGZpZWxkcyBpbnN0ZWFkIG9mIHRoZSBHc3RPYmplY3QgbG9jay4gVXNpbmcgdGhlIGxhdHRlciBjLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOiAoZ3N0X2F1ZGlvX2NoZWJfYmFuZF9jbGFzc19pbml0KSwKKwkgIChnc3RfYXVkaW9fY2hlYl9iYW5kX2luaXQpLCAoZ3N0X2F1ZGlvX2NoZWJfYmFuZF9maW5hbGl6ZSksCisJICAoZ3N0X2F1ZGlvX2NoZWJfYmFuZF9zZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmg6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0LmM6IChnc3RfYXVkaW9fY2hlYl9saW1pdF9jbGFzc19pbml0KSwKKwkgIChnc3RfYXVkaW9fY2hlYl9saW1pdF9pbml0KSwgKGdzdF9hdWRpb19jaGViX2xpbWl0X2ZpbmFsaXplKSwKKwkgIChnc3RfYXVkaW9fY2hlYl9saW1pdF9zZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5oOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5jOiAoZ3N0X2F1ZGlvX3dzaW5jYmFuZF9jbGFzc19pbml0KSwKKwkgIChnc3RfYXVkaW9fd3NpbmNiYW5kX2luaXQpLCAoZ3N0X2F1ZGlvX3dzaW5jYmFuZF9maW5hbGl6ZSksCisJICAoZ3N0X2F1ZGlvX3dzaW5jYmFuZF9zZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5oOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYzogKGdzdF9hdWRpb193c2luY2xpbWl0X2NsYXNzX2luaXQpLAorCSAgKGdzdF9hdWRpb193c2luY2xpbWl0X2luaXQpLCAoZ3N0X2F1ZGlvX3dzaW5jbGltaXRfZmluYWxpemUpLAorCSAgKGdzdF9hdWRpb193c2luY2xpbWl0X3NldF9wcm9wZXJ0eSk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5oOgorCSAgVXNlIGEgY3VzdG9tIG11dGV4IGZvciBwcm90ZWN0aW5nIHRoZSBpbnN0YW5jZSBmaWVsZHMgaW5zdGVhZCBvZgorCSAgdGhlIEdzdE9iamVjdCBsb2NrLiBVc2luZyB0aGUgbGF0dGVyIGNhbiBsZWFkIHRvIGRlYWRsb2NrcywgZXNwZWNpYWxseQorCSAgd2l0aCB0aGUgRklSIGZpbHRlcnMgd2hlbiB1cGRhdGluZyB0aGUgbGF0ZW5jeS4KKworMjAwOS0wMS0xMSAxOTowMzozOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvYXVkaW9meC86IEltcGxlbWVudCBhIGJhc2UgY2xhc3MgZm9yIGdlbmVyaWMgYXVkaW8gRklSIGZpbHRlcnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmM6CisJICAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9kaXNwb3NlKSwKKwkgIChnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX2Jhc2VfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9jbGFzc19pbml0KSwKKwkgIChnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX2luaXQpLAorCSAgKGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfcHVzaF9yZXNpZHVlKSwKKwkgIChnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3NldHVwKSwKKwkgIChnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3RyYW5zZm9ybSksCisJICAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9zdGFydCksCisJICAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9zdG9wKSwKKwkgIChnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3F1ZXJ5KSwKKwkgIChnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3F1ZXJ5X3R5cGUpLAorCSAgKGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfZXZlbnQpLAorCSAgKGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc2V0X2tlcm5lbCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmg6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlaWlyZmlsdGVyLmM6CisJICBJbXBsZW1lbnQgYSBiYXNlIGNsYXNzIGZvciBnZW5lcmljIGF1ZGlvIEZJUiBmaWx0ZXJzLgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5jOgorCSAgKGdzdF9nc3RfYXVkaW9fd3NpbmNiYW5kX21vZGVfZ2V0X3R5cGUpLAorCSAgKGdzdF9nc3RfYXVkaW9fd3NpbmNiYW5kX3dpbmRvd19nZXRfdHlwZSksCisJICAoZ3N0X2F1ZGlvX3dzaW5jYmFuZF9iYXNlX2luaXQpLCAoZ3N0X2F1ZGlvX3dzaW5jYmFuZF9jbGFzc19pbml0KSwKKwkgIChnc3RfYXVkaW9fd3NpbmNiYW5kX2luaXQpLCAoZ3N0X2F1ZGlvX3dzaW5jYmFuZF9idWlsZF9rZXJuZWwpLAorCSAgKGdzdF9hdWRpb193c2luY2JhbmRfc2V0dXApLCAoZ3N0X2F1ZGlvX3dzaW5jYmFuZF9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdWRpb193c2luY2JhbmRfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuaDoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmM6CisJICAoZ3N0X2F1ZGlvX3dzaW5jbGltaXRfbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X2F1ZGlvX3dzaW5jbGltaXRfd2luZG93X2dldF90eXBlKSwKKwkgIChnc3RfYXVkaW9fd3NpbmNsaW1pdF9iYXNlX2luaXQpLAorCSAgKGdzdF9hdWRpb193c2luY2xpbWl0X2NsYXNzX2luaXQpLCAoZ3N0X2F1ZGlvX3dzaW5jbGltaXRfaW5pdCksCisJICAoZ3N0X2F1ZGlvX3dzaW5jbGltaXRfYnVpbGRfa2VybmVsKSwgKGdzdF9hdWRpb193c2luY2xpbWl0X3NldHVwKSwKKwkgIChnc3RfYXVkaW9fd3NpbmNsaW1pdF9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdWRpb193c2luY2xpbWl0X2dldF9wcm9wZXJ0eSk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5oOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jYmFuZC5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jbGltaXQuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIFVzZSB0aGlzIG5ldyBiYXNlIGNsYXNzIGZvciBhdWRpb3dzaW5jYmFuZCBhbmQgYXVkaW93c2luY2xpbWl0LgorCSAgQWxzbyBjbGVhbnVwIGJvdGggZWxlbWVudHMuCisKKzIwMDktMDEtMDggMTg6MTc6MTMgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBJbiBwdXNoIG1vZGUsIGVycm9yIG91dCBpZiB3ZSBnZXQgRU9TIGJlZm9yZSB3ZSd2ZSBjcmVhdGVkIGFueSBzcmNwYWRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIEluIHB1c2ggbW9kZSwgZXJyb3Igb3V0IGlmIHdlIGdldCBFT1MgYmVmb3JlIHdlJ3ZlIGNyZWF0ZWQgYW55IHNyY3BhZHMuCisJICBIYW5kbGUgKGluIHB1bGwgbW9kZSkgc29tZSBmaWxlcyB0aGF0IGhhdmUgYSB0cnVuY2F0ZWQgbW9vdiBhdG9tIHdoZXJlCisJICB0aGUgZmluYWwgc3ViLWF0b20gaXMgYSAnZnJlZScgYXRvbSBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoYXQgYXJlIG5vdAorCSAgcHJlc2VudCBpbiB0aGUgZmlsZS4KKworMjAwOS0wMS0wOCAxNTo1Njo0NiArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGdzdC9tYXRyb3NrYS86IFNvbWUgY2xlYW51cHMsIHJlZmFjdG9yaW5nIGFuZCBtaW5vciBlbmhhbmNlbWVudHMgaW4gY2FwcyBoYW5kbGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF92aWRlb19jYXBzKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF92aWRlb19wYWRfc2V0Y2Fwcyk6CisJICBTb21lIGNsZWFudXBzLCByZWZhY3RvcmluZyBhbmQgbWlub3IgZW5oYW5jZW1lbnRzIGluIGNhcHMgaGFuZGxpbmcuCisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfY2xhc3NfaW5pdCksCisJICAoZ3N0X21hdHJvc2thX211eF9pbml0KSwgKGdzdF9tYXRyb3NrYV9wYWRfcmVzZXQpLAorCSAgKGdzdF9tYXRyb3NrYV9wYWRfZnJlZSksIChnc3RfbWF0cm9za2FfbXV4X3Jlc2V0KSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3JlcXVlc3RfbmV3X3BhZCk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6ICh0ZWFyZG93bl9zcmNfcGFkKToKKwkgIE9ubHkgcmVtb3ZlLCByZWxlYXNlIG9yIHJlc2V0IHdoYXQgaXMgYXBwcm9wcmlhdGUgdXBvbiBzdGF0ZSBjaGFuZ2UuCisKKzIwMDktMDEtMDcgMjA6Mzg6NTAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBleHQvcHVsc2UvcHVsc2VzaW5rLio6IFVzZSBhIG11dGV4IHRvIHByb3RlY3QgdGhlIGN1cnJlbnQgc3RyZWFtIHBvaW50ZXIsIGFuZCBpZ25vcmUgY2FsbGJhY2tzIGZvciBzdHJlYW0gb2JqZWN0cyB0aGEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkgIFVzZSBhIG11dGV4IHRvIHByb3RlY3QgdGhlIGN1cnJlbnQgc3RyZWFtIHBvaW50ZXIsIGFuZCBpZ25vcmUKKwkgIGNhbGxiYWNrcyBmb3Igc3RyZWFtIG9iamVjdHMgdGhhdCBoYXZlIGJlZW4gZGVzdHJveWVkIGFscmVhZHkuCisJICBGaXhlcyBwcm9ibGVtcyB3aXRoIHVucHJlcGFyZS9wcmVwYXJlIGN5Y2xlcyBjYXVzZWQgYnkgdGhlIGlucHV0CisJICBjYXBzIGNoYW5naW5nLCB3aXRob3V0IHJlaW50cm9kdWNpbmcgYnVnICM1NTY5ODYuCisKKzIwMDktMDEtMDcgMTY6MDk6NDcgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IFJlbW92ZSAoKSBmcm9tIHRyYW5zbGF0ZWFibGUgc3RyaW5nLCBzbyB0aGF0IGl0IG1ha2VzIG1vcmUgc2Vuc2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgUmVtb3ZlICgpIGZyb20gdHJhbnNsYXRlYWJsZSBzdHJpbmcsIHNvIHRoYXQgaXQgbWFrZXMgbW9yZSBzZW5zZS4KKworMjAwOS0wMS0wNyAwOTo0MzoxMyArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IE1pbm9yIGZpeC9jbGVhbnVwIGluIGhlYWRlciBmaWVsZCBjYWxjdWxhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aV9tdXhfYXVkc2lua19zZXRfY2Fwcyk6CisJICBNaW5vciBmaXgvY2xlYW51cCBpbiBoZWFkZXIgZmllbGQgY2FsY3VsYXRpb24uCisKKzIwMDktMDEtMDYgMTc6NDg6MTAgKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lio6IFJlbW92ZSBpbnRlcm5hbCB0YWdsaXN0IGFuZCBmdWxseSB1c2UgdGFnc2V0dGVyIGludGVyZmFjZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X3Jlc2V0KSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X2hhbmRsZV9zaW5rX2V2ZW50KSwgKGdzdF9tYXRyb3NrYV9tdXhfZmluaXNoKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgUmVtb3ZlIGludGVybmFsIHRhZ2xpc3QgYW5kIGZ1bGx5IHVzZSB0YWdzZXR0ZXIgaW50ZXJmYWNlLgorCisyMDA5LTAxLTA2IDE0OjUwOjI5ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguKjogRW5zdXJlIGhlYWRlciBzaXplIGludmFyaWFuY2UgZHVyaW5nIHN1YnNlcXVlbnQgcmV3cml0ZSBieSB1c2luZyB0YWdzIHNuYXBzaG90LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpX211eF9yZXNldCksCisJICAoZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpX2hlYWRlcik6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4Lmg6CisJICBFbnN1cmUgaGVhZGVyIHNpemUgaW52YXJpYW5jZSBkdXJpbmcgc3Vic2VxdWVudCByZXdyaXRlIGJ5IHVzaW5nCisJICB0YWdzIHNuYXBzaG90LgorCisyMDA5LTAxLTA1IDE3OjMxOjEzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzogRG9uJ3Qgd2FpdCBmb3IgdGhlIHB1bHNlIG1haW5sb29wIHdoZW4gZGVzdHJveWluZyB0aGUgc3RyZWFtLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzogKGdzdF9wdWxzZXNpbmtfZGVzdHJveV9zdHJlYW0pOgorCSAgRG9uJ3Qgd2FpdCBmb3IgdGhlIHB1bHNlIG1haW5sb29wIHdoZW4gZGVzdHJveWluZyB0aGUgc3RyZWFtLgorCSAgRml4ZXMgYSBkZWFkbG9jayB3aGVuIHRoZSBwdWxzZWRhZW1vbiBnb2VzIGF3YXkgd2hpbGUgcHVsc2VzaW5rCisJICBpcyBQTEFZSU5HLiBGaXhlcyBidWcgIzU1Njk4Ni4KKworMjAwOS0wMS0wNSAxMjozMDo0MCArMDAwMCAgU2FzY2hhIEhhdWVyIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPgorCisJICBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IEFkZCBzdXBwb3J0IGZvciBncmF5c2NhbGUgdjRsMiBkZXZpY2VzLiBGaXhlcyBidWcgIzU2NjYxNi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFNhc2NoYSBIYXVlciA8cyBkb3QgaGF1ZXIgYXQgcGVuZ3V0cm9uaXggZG90IGRlPgorCSAgTHVvdGFvIEZ1IDxsIGRvdCBmdSBhdCBwZW5ndXRyb25peCBkb3QgZGU+CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX3Y0bDJmb3VyY2NfdG9fc3RydWN0dXJlKSwKKwkgIChnc3RfdjRsMl9nZXRfY2Fwc19pbmZvKToKKwkgIEFkZCBzdXBwb3J0IGZvciBncmF5c2NhbGUgdjRsMiBkZXZpY2VzLiBGaXhlcyBidWcgIzU2NjYxNi4KKworMjAwOS0wMS0wNSAxMTo0MjowOSArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGdzdC9xdGRlbXV4LzogU3RyZWFtbGluZSB0YWcgaGFuZGxpbmcgYW5kIHBhc3MgdW5wYXJzZWQgdGFncyBhcyBiaW5hcnkgYmxvYiBpbiBwcml2YXRlIHRhZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3RhZ19hZGRfc3RyKSwKKwkgIChxdGRlbXV4X3RhZ19hZGRfdG1wbyksIChxdGRlbXV4X3RhZ19hZGRfY292ciksCisJICAocXRkZW11eF90YWdfYWRkX2RhdGUpLCAocXRkZW11eF90YWdfYWRkX2ducmUpLAorCSAgKHF0ZGVtdXhfdGFnX2FkZF9ibG9iKSwgKHF0ZGVtdXhfcGFyc2VfdWR0YSk6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguaDoKKwkgICogZ3N0L3F0ZGVtdXgvcXVpY2t0aW1lLmM6IChwbHVnaW5faW5pdCk6CisJICBTdHJlYW1saW5lIHRhZyBoYW5kbGluZyBhbmQgcGFzcyB1bnBhcnNlZCB0YWdzIGFzIGJpbmFyeSBibG9iCisJICBpbiBwcml2YXRlIHRhZy4KKworMjAwOS0wMS0wNSAxMDoxMzoyOSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvYXVkaW9meC86IEltcGxlbWVudCBhIGJhc2UgY2xhc3MgZm9yIElJUiBmaWx0ZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdWRpb2Z4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWlpcmZpbHRlci5jOgorCSAgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfYmFzZV9pbml0KSwKKwkgIChnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2Rpc3Bvc2UpLAorCSAgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfY2xhc3NfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9pbml0KSwKKwkgIChnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2NhbGN1bGF0ZV9nYWluKSwKKwkgIChnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX3NldF9jb2VmZmljaWVudHMpLAorCSAgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfc2V0dXApLCAocHJvY2VzcyksCisJICAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl90cmFuc2Zvcm1faXApLAorCSAgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfc3RvcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlaWlyZmlsdGVyLmg6CisJICBJbXBsZW1lbnQgYSBiYXNlIGNsYXNzIGZvciBJSVIgZmlsdGVycy4KKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOiAoZ3N0X2F1ZGlvX2NoZWJfYmFuZF9iYXNlX2luaXQpLAorCSAgKGdzdF9hdWRpb19jaGViX2JhbmRfY2xhc3NfaW5pdCksIChnc3RfYXVkaW9fY2hlYl9iYW5kX2luaXQpLAorCSAgKGdlbmVyYXRlX2NvZWZmaWNpZW50cyksIChnc3RfYXVkaW9fY2hlYl9iYW5kX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2F1ZGlvX2NoZWJfYmFuZF9zZXR1cCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmJhbmQuaDoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzogKGdzdF9hdWRpb19jaGViX2xpbWl0X2Jhc2VfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2NoZWJfbGltaXRfY2xhc3NfaW5pdCksIChnc3RfYXVkaW9fY2hlYl9saW1pdF9pbml0KSwKKwkgIChnZW5lcmF0ZV9jb2VmZmljaWVudHMpLCAoZ3N0X2F1ZGlvX2NoZWJfbGltaXRfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfYXVkaW9fY2hlYl9saW1pdF9zZXR1cCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0Lmg6CisJICBVc2UgdGhlIElJUiBmaWx0ZXIgYmFzZSBjbGFzcyBmb3IgdGhlIGNoZWJ5c2hldiBmaWx0ZXJzLgorCisyMDA5LTAxLTAyIDIwOjM5OjM0ICswMDAwICBKdXN0aW4gS2FybmVnYXMgPGp1c3RpbkBhZmZpbml4LmNvbT4KKworCSAgc3lzL29zeGF1ZGlvLzogUmV3cml0ZSBvc3hhdWRpbyB0byB3b3JrIG1vcmUgZmxleGlibHkgYW5kIG1vcmUgcmVsaWFibHksIHVzaW5nIGEgZGlmZmVyZW50IGFic3RyYWN0aW9uIGxheWVyIG9mIGNvcmVhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBKdXN0aW4gS2FybmVnYXMgPGp1c3RpbkBhZmZpbml4LmNvbT4gYW5kCisJICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAc29uZ2JpcmRuZXN0LmNvbT4KKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvLmM6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuYzoKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvZWxlbWVudC5oOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuaDoKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5oOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4cmluZ2J1ZmZlci5jOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4cmluZ2J1ZmZlci5oOgorCSAgUmV3cml0ZSBvc3hhdWRpbyB0byB3b3JrIG1vcmUgZmxleGlibHkgYW5kIG1vcmUgcmVsaWFibHksIHVzaW5nIGEKKwkgIGRpZmZlcmVudCBhYnN0cmFjdGlvbiBsYXllciBvZiBjb3JlYXVkaW8gdGhhdCBpcyB0aGUgcmVjb21tZW5kZWQgd2F5IG9mCisJICBkb2luZyBsb3ctbGV2ZWwgYXVkaW8gSS9PIG9uIE9TWC4KKwkgIEZpeGVzIGJ5ZyAjNTY0OTQ4LgorCisyMDA5LTAxLTAyIDE2OjMxOjEzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWRlY29kZWJpbi1IMjYzcC1BTVIuc2g6IEFkZCBleGFtcGxlIFJUUCB0cmFuc2NvZGluZyBwaXBlbGluZSBmcm9tIGFueSBmaWxlIGRlY29kZWRhYmxlIHdpdGguLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWRlY29kZWJpbi1IMjYzcC1BTVIuc2g6CisJICBBZGQgZXhhbXBsZSBSVFAgdHJhbnNjb2RpbmcgcGlwZWxpbmUgZnJvbSBhbnkgZmlsZSBkZWNvZGVkYWJsZSB3aXRoCisJICB1cmlkZWNvZGViaW4uCisKKzIwMDktMDEtMDIgMTU6MjA6NDggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHRlc3RzL2V4YW1wbGVzL3J0cC86IEFkZCB0d28gQyBleGFtcGxlcyBvZiB1c2luZyBnc3RydHBiaW4gYXMgYSBzZW5kZXIgYW5kIGEgcmVjZWl2ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvZXhhbXBsZXMvcnRwLy5jdnNpZ25vcmU6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLmM6IChwYWRfYWRkZWRfY2IpLCAobWFpbik6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLmM6IChtYWluKToKKwkgIEFkZCB0d28gQyBleGFtcGxlcyBvZiB1c2luZyBnc3RydHBiaW4gYXMgYSBzZW5kZXIgYW5kIGEgcmVjZWl2ZXIuCisKKzIwMDgtMTItMzEgMTE6MjA6NTUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBDaGFuZ2VMb2c6IFJlbW92ZSBjb25mbGljdCBtYXJrZXIgZnJvbSBDaGFuZ2VMb2cKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBDaGFuZ2VMb2c6CisJICBSZW1vdmUgY29uZmxpY3QgbWFya2VyIGZyb20gQ2hhbmdlTG9nCisKKzIwMDgtMTItMjggMDk6NTA6MzEgKzAwMDAgIGpeIDxqQG9pbDIxLm9yZz4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgY29kZWMgbWFwcGluZyBmb3IgeHZpZCwgZm1wNCBhbmQgYWMzIHRyYWNrcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IGpeIDxqIGF0IG9pbDIxLm9yZz4KKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF92aWRlb19jYXBzKSwKKwkgIChxdGRlbXV4X2F1ZGlvX2NhcHMpOgorCSAgQWRkIGNvZGVjIG1hcHBpbmcgZm9yIHh2aWQsIGZtcDQgYW5kIGFjMyB0cmFja3MuCisJICBGaXhlcyAjNTY1ODUwCisKKzIwMDgtMTItMjMgMTI6MTA6NDEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9qcGVnL2dzdHNtb2tlZW5jLio6IEltcGxlbWVudCBnZXRjYXBzIGZ1bmN0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6IChnc3Rfc21va2VlbmNfaW5pdCksCisJICAoZ3N0X3Ntb2tlZW5jX2dldGNhcHMpLCAoZ3N0X3Ntb2tlZW5jX3NldGNhcHMpLAorCSAgKGdzdF9zbW9rZWVuY19jaGFpbiksIChnc3Rfc21va2VlbmNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2pwZWcvZ3N0c21va2VlbmMuaDoKKwkgIEltcGxlbWVudCBnZXRjYXBzIGZ1bmN0aW9uLgorCSAgU2V0IGNhcHMgb24gdGhlIHBhZCBhbmQgb24gYWxsIG91dGdvaW5nIGJ1ZmZlcnMuCisJICBGaXhlcyAjNTY1NDQxLgorCisyMDA4LTEyLTE5IDA5OjM2OjQ1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOiBBbmQgcmVtb3ZlIHRlbXBvcmFyeSBjb21tZW50IHBvaW50aW5nIHRvIHRoZSBidWcgdGlja2V0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOgorCSAgQW5kIHJlbW92ZSB0ZW1wb3JhcnkgY29tbWVudCBwb2ludGluZyB0byB0aGUgYnVnIHRpY2tldC4KKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIE1vdmUgcmVvY2N1cmluZyBsb2dnaW5nIHRvIExPRyBhbmQgbG9nIGluc3RhbmNlIHRvby4KKworMjAwOC0xMi0xNyAxNzoyODozOSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBleHQvcHVsc2UvcHVsc2VtaXhlcmN0cmwuYzogRG9uJ3QgbGVhayB0aGUgcGFfb3BlcmF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOgorCSAgRG9uJ3QgbGVhayB0aGUgcGFfb3BlcmF0aW9uLgorCisyMDA4LTEyLTE2IDE2OjE5OjI2ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogUmVxdWlyZSBjb3JlIGN2cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBSZXF1aXJlIGNvcmUgY3ZzLgorCisyMDA4LTEyLTE2IDE2OjA3OjQ4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IFJlbmFtZSBhcGkgZnJvbSBfZmx1c2ggdG8gX3Jlc2V0X3RhZ3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIFJlbmFtZSBhcGkgZnJvbSBfZmx1c2ggdG8gX3Jlc2V0X3RhZ3MuCisKKzIwMDgtMTItMTYgMTQ6MjI6NTEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguYzogVXNlIG5ldyB0YWdzZXR0ZXIgYXBpIHRvIGZsdXNoIHRhZ3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIFVzZSBuZXcgdGFnc2V0dGVyIGFwaSB0byBmbHVzaCB0YWdzLgorCisyMDA4LTEyLTE2IDEzOjE0OjM5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOiBJbmNyZWFzZSB0aW1lb3V0IHRvIDMgbWludXRlcyB0byBwcmV2ZW50IHRpbWVvdXRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOiAoZGVpbnRlcmxlYXZlX3N1aXRlKToKKwkgIEluY3JlYXNlIHRpbWVvdXQgdG8gMyBtaW51dGVzIHRvIHByZXZlbnQgdGltZW91dHMuCisKKzIwMDgtMTItMTYgMTI6NTI6MjQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvaW50ZXJsZWF2ZS5jOiBJbmNyZWFzZSB0aW1lb3V0IHRvIDMgbWludXRlcyB0byBwcmV2ZW50IHRpbWVvdXRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ludGVybGVhdmUuYzogKGludGVybGVhdmVfc3VpdGUpOgorCSAgSW5jcmVhc2UgdGltZW91dCB0byAzIG1pbnV0ZXMgdG8gcHJldmVudCB0aW1lb3V0cy4KKworMjAwOC0xMi0xNiAxMTo1NzowMSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aW11eC4qOiBUb3RhbGx5IHJlbW92ZSB0aGUgaW50ZXJuYWwgdGFnbGlzdHMgYW5kIGZ1bGx5IHVzZSB0YWdzZXR0ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguaDoKKwkgIFRvdGFsbHkgcmVtb3ZlIHRoZSBpbnRlcm5hbCB0YWdsaXN0cyBhbmQgZnVsbHkgdXNlIHRhZ3NldHRlci4KKworMjAwOC0xMi0xNSAxNTo1OTo1MyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aW11eC5jOiBJbnN0ZWFkIG9mIGZpbHRlcmluZyB3cm9uZ2x5IGp1c3QgdXNlIHRoZSBtZXJnZW1vZGUuIEFwcGxpY2F0aW9ucyBpcyB1c2UgS0VFUF9BTEwgaWYgdGhleSB3YW50IHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgSW5zdGVhZCBvZiBmaWx0ZXJpbmcgd3JvbmdseSBqdXN0IHVzZSB0aGUgbWVyZ2Vtb2RlLiBBcHBsaWNhdGlvbnMgaXMKKwkgIHVzZSBLRUVQX0FMTCBpZiB0aGV5IHdhbnQgdG8gc3VwcmVzcyB0YWctZXZlbnRzLiBGaXhlcyAjNTYzMjIxIGZvcgorCSAgYXZpIGZvciByZWFsIChJIGhvcGUpLiBFdmVyeW9uZSBjaGltZSBpbiwgYmVmb3JlIEkgZml4IHRoZSBvdGhlcnMuCisKKzIwMDgtMTItMTUgMTI6NDU6MzUgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZXh0L3B1bHNlL3B1bHNlbWl4ZXJjdHJsLmM6IEFkZCBub3RlIGFib3V0IG1lbWxlYWsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3B1bHNlL3B1bHNlbWl4ZXJjdHJsLmM6CisJICBBZGQgbm90ZSBhYm91dCBtZW1sZWFrLgorCisyMDA4LTEyLTEzIDE2OjIzOjA5ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBtNC9NYWtlZmlsZS5hbTogQSBjb3VwbGUgbW9yZSAubTQgdGhhdCBhcmVuJ3Qgc2hpcHBlZCBhbnltb3JlIHdpdGggZ2V0dGV4dCAwLjE3LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIG00L01ha2VmaWxlLmFtOgorCSAgQSBjb3VwbGUgbW9yZSAubTQgdGhhdCBhcmVuJ3Qgc2hpcHBlZCBhbnltb3JlIHdpdGggZ2V0dGV4dCAwLjE3LgorCisyMDA4LTEyLTEzIDE1OjM0OjAxICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBTd2l0Y2ggdG8gdXNpbmcgR3N0U3RhdGljUGFkVGVtcGxhdGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX2Jhc2VfaW5pdCksCisJICAoZ3N0X2ZsYWNfZGVjX2luaXQpOgorCSAgKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6IChnc3RfYWxhd19kZWNfYmFzZV9pbml0KSwKKwkgIChnc3RfYWxhd19kZWNfaW5pdCk6CisJICAqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzogKGdzdF9hbGF3X2VuY19iYXNlX2luaXQpLAorCSAgKGdzdF9hbGF3X2VuY19pbml0KToKKwkgICogZ3N0L2xhdy9hbGF3LmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6IChnc3RfbXVsYXdkZWNfYmFzZV9pbml0KSwKKwkgIChnc3RfbXVsYXdkZWNfaW5pdCk6CisJICAqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6IChnc3RfbXVsYXdlbmNfYmFzZV9pbml0KSwKKwkgIChnc3RfbXVsYXdlbmNfaW5pdCk6CisJICAqIGdzdC9sYXcvbXVsYXcuYzogKHBsdWdpbl9pbml0KToKKwkgIFN3aXRjaCB0byB1c2luZyBHc3RTdGF0aWNQYWRUZW1wbGF0ZS4KKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOiAoZ3N0X3VkcF9nZXRfYWRkcik6CisJICBEb24ndCBmb3JnZXQgdG8gZnJlZSB0aGUgYWRkcmluZm8gc3RydWN0dXJlLgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9yZXNldCksCisJICAoZ3N0X3dhdnBhcnNlX3NpbmtfYWN0aXZhdGUpOgorCSAgRG9uJ3QgZm9yZ2V0IHRvIHVucmVmIHRoZSBHc3RBZGFwdGVyLgorCisyMDA4LTEyLTEzIDEyOjU4OjI0ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBtNC9NYWtlZmlsZS5hbTogaW50dHlwZXMubTQgaGFzbid0IGJlZW4gYXZhaWxhYmxlIHNpbmNlIGdldHRleHQtMC4xNSwgYW5kIHNpbmNlIHdlIG5vdyByZXF1aXJlIGdldHRleHQgPj0gMC4xNyAuLi4gd2UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBtNC9NYWtlZmlsZS5hbToKKwkgIGludHR5cGVzLm00IGhhc24ndCBiZWVuIGF2YWlsYWJsZSBzaW5jZSBnZXR0ZXh0LTAuMTUsIGFuZCBzaW5jZSB3ZSBub3cKKwkgIHJlcXVpcmUgZ2V0dGV4dCA+PSAwLjE3IC4uLiB3ZSBjYW4gcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3Qgb2YgZmlsZXMgdG8KKwkgIGRpc3QuCisKKzIwMDgtMTItMTAgMTU6MDM6MjMgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgc21hbGxlciBzcGVjIGZpbGUgdXBkYXRlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBzbWFsbGVyIHNwZWMgZmlsZSB1cGRhdGVzCisKKzIwMDgtMTItMDkgMTc6NTU6MjIgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBNb3JlIGxvZ2dpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgTW9yZSBsb2dnaW5nLgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgSGFuZGxlIG1vcmUgbWV0YWRhdGEgZmllbGRzLiBCZXR0ZXIgZXN0aW1hdGUgb2YgbWV0YWRhdGEgc2l6ZS4gRG9uJ3QKKwkgIG1lcmdlIHJlY2VpdmVkIHRhZ3MsIGlmIGFwcGxpY2F0aW9uIGhhcyBzcGVjaWZpZWQgdGFncyB1c2luZworCSAgR1NUX1RBR19NRVJHRV9SRVBMQUNFX0FMTC4gRml4ZXMgIzU2MzIyMSBmb3IgYXZpLgorCisyMDA4LTEyLTA5IDE0OjMwOjAzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOiBBbHNvIGlnbm9yZSBwdWxzZW1peGVyIGZvciB0aGUgc3RhdGVzIHVuaXQgdGVzdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIEFsc28gaWdub3JlIHB1bHNlbWl4ZXIgZm9yIHRoZSBzdGF0ZXMgdW5pdCB0ZXN0LgorCisyMDA4LTEyLTA5IDE0OjE5OjE2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jOiBBZGQgYW4gRU9JIG1hcmtlciBhdCB0aGUgZW5kIG9mIHRoZSBqcGVnIGZyYW1lIHdoZW4gaXQncyBtaXNzaW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6IChnc3RfcnRwX2pwZWdfZGVwYXlfcHJvY2Vzcyk6CisJICBBZGQgYW4gRU9JIG1hcmtlciBhdCB0aGUgZW5kIG9mIHRoZSBqcGVnIGZyYW1lIHdoZW4gaXQncyBtaXNzaW5nLgorCSAgRml4ZXMgIzU2MzA1Ni4KKworMjAwOC0xMi0wOSAxMDo0NzoxNCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2Nyb3AuYzogVXBkYXRlIHRoZSB1bml0IHRlc3QgZm9yIHRoZSBuZXcgY29sb3IgdmFsdWVzIGZvciBCVC42MDEgcmVkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOiAoY2hlY2tfMXgxX2J1ZmZlcik6CisJICBVcGRhdGUgdGhlIHVuaXQgdGVzdCBmb3IgdGhlIG5ldyBjb2xvciB2YWx1ZXMgZm9yIEJULjYwMSByZWQuCisJICBGaXhlcyBidWcgIzU2MzUxMC4KKworMjAwOC0xMi0wOSAxMDoyODoxMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2R2L2dzdGR2ZGVtdXguYzogUmVzdG9yZSBwcmV2aW91cyBiZWhhdmlvdXIgb2Ygbm90IHBhc3NpbmcgUW9TIGFuZCBuYXZpZ2F0aW9uIGV2ZW50cyB1cHN0cmVhbSwgd2hpY2ggcHJlc3VtYWJseSB3Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2hhbmRsZV9zcmNfZXZlbnQpOgorCSAgUmVzdG9yZSBwcmV2aW91cyBiZWhhdmlvdXIgb2Ygbm90IHBhc3NpbmcgUW9TIGFuZCBuYXZpZ2F0aW9uCisJICBldmVudHMgdXBzdHJlYW0sIHdoaWNoIHByZXN1bWFibHkgd2Fzbid0IG1lYW50IHRvIGJlIGNoYW5nZWQuCisKKzIwMDgtMTItMDkgMDk6Mzk6NTMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2R2L2dzdGR2ZGVtdXguYzogQWRkIHNyY3BhZHMgb25seSB3aGVuIG5lZWRlZCBhbmQgcmVtb3ZlIHRoZW0gYWdhaW4gd2hlbiBnb2luZyBiYWNrIHRvIFJFQURZLiBUaGlzIHByZXZlbnRzIHN0YWxsLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2FkZF92aWRlb19wYWQpLAorCSAgKGdzdF9kdmRlbXV4X2FkZF9hdWRpb19wYWQpLCAoZ3N0X2R2ZGVtdXhfcmVtb3ZlX3BhZHMpLAorCSAgKGdzdF9kdmRlbXV4X2RlbXV4X2F1ZGlvKSwgKGdzdF9kdmRlbXV4X2RlbXV4X3ZpZGVvKSwKKwkgIChnc3RfZHZkZW11eF9jaGFpbiksIChnc3RfZHZkZW11eF9sb29wKSwKKwkgIChnc3RfZHZkZW11eF9jaGFuZ2Vfc3RhdGUpOgorCSAgQWRkIHNyY3BhZHMgb25seSB3aGVuIG5lZWRlZCBhbmQgcmVtb3ZlIHRoZW0gYWdhaW4gd2hlbiBnb2luZworCSAgYmFjayB0byBSRUFEWS4gVGhpcyBwcmV2ZW50cyBzdGFsbGVkIHBpcGVsaW5lcyBpZiB0aGVyZSdzIG5vCisJICBhdWRpbyBpbnNpZGUgdGhlIERWIHN0cmVhbSwgd2hpY2ggaGFwcGVucyBmb3IgbWFueSBNWEYgZmlsZXMuCisKKzIwMDgtMTItMDkgMDk6MDk6MjUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzogVGhlIHBvcnRzIGluIGxpYnNvdXAgYXJlIHVuc2lnbmVkIGludGVnZXJzIGFuZCBub3Qgc2lnbmVkIGludGVnZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6IChHU1RfU1RBUlRfVEVTVCksCisJICAocnVuX3NlcnZlcik6CisJICBUaGUgcG9ydHMgaW4gbGlic291cCBhcmUgdW5zaWduZWQgaW50ZWdlcnMgYW5kIG5vdCBzaWduZWQKKwkgIGludGVnZXJzLgorCisyMDA4LTEyLTA4IDE4OjMxOjAwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9kdi9nc3RkdmRlbXV4LmM6IEZvcndhcmQgYWxsIGV2ZW50cyB1cHN0cmVhbSB1bmxlc3MgaXQncyBzb21ldGhpbmcgd2UgcmVhbGx5IGRvbid0IGhhbmRsZS4gVGhpcyBmaXhlcyBsYXRlbmN5IGNvbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kdi9nc3RkdmRlbXV4LmM6IChnc3RfZHZkZW11eF9oYW5kbGVfc3JjX2V2ZW50KToKKwkgIEZvcndhcmQgYWxsIGV2ZW50cyB1cHN0cmVhbSB1bmxlc3MgaXQncyBzb21ldGhpbmcgd2UgcmVhbGx5CisJICBkb24ndCBoYW5kbGUuIFRoaXMgZml4ZXMgbGF0ZW5jeSBjb25maWd1cmF0aW9uIG9mIHBpcGVsaW5lcy4KKworMjAwOC0xMi0wOCAxODoyNDoyMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvZHYvOiBSZWFsbHkgY2FsbCBkdl9pbml0KCkgZXhhY3RseSBvbmUgdGltZSwgbm90IG9uZSB0aW1lIGZvciB0aGUgZGVtdXhlciBhbmQgb25lIHRpbWUgZm9yIHRoZSBkZWNvZGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kdi9nc3Rkdi5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19jbGFzc19pbml0KToKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2NsYXNzX2luaXQpOgorCSAgUmVhbGx5IGNhbGwgZHZfaW5pdCgpIGV4YWN0bHkgb25lIHRpbWUsIG5vdCBvbmUgdGltZSBmb3IKKwkgIHRoZSBkZW11eGVyIGFuZCBvbmUgdGltZSBmb3IgdGhlIGRlY29kZXIuCisKKzIwMDgtMTItMDggMTI6Mzc6NDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5jOiBDb3B5IGluY29tbWluZyB0aW1lc3RhbXAgdG8gb3V0Z29pbmcgcGFja2V0cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGFwYXkuYzogKGdzdF9ydHBfbXA0YV9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICBDb3B5IGluY29tbWluZyB0aW1lc3RhbXAgdG8gb3V0Z29pbmcgcGFja2V0cy4KKworMjAwOC0xMi0wOCAxMjozNjoyMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6IERvbid0IHRyeSB0byBwdXNoIHBhY2tldHMgYmVmb3JlIHdlIGNvdWxkIGZpbmQgYSB2YWxpZCBjb25maWcgc3RhcnRjb2RlLiBGaXhlcyAjNTYzNTA5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOiAoZ3N0X3J0cF9tcDR2X3BheV9mbHVzaCksCisJICAoZ3N0X3J0cF9tcDR2X3BheV9ldmVudCk6CisJICBEb24ndCB0cnkgdG8gcHVzaCBwYWNrZXRzIGJlZm9yZSB3ZSBjb3VsZCBmaW5kIGEgdmFsaWQgY29uZmlnCisJICBzdGFydGNvZGUuIEZpeGVzICM1NjM1MDkuCisKKzIwMDgtMTItMDcgMTk6MjI6NDggKzAwMDAgIEJyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ac3VuLmNvbT4KKworCSAgc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6IFNldCB0aGUgbWl4ZXIgZmQgYmVmb3JlIGNhbGxpbmcgaW9jdGwoKSBvbiBpdC4gRml4ZXMgYnVnICM1NjM0MTQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uIGF0IHN1biBkb3QgY29tPgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuYzoKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX29wZW4pOgorCSAgU2V0IHRoZSBtaXhlciBmZCBiZWZvcmUgY2FsbGluZyBpb2N0bCgpIG9uIGl0LiBGaXhlcyBidWcgIzU2MzQxNC4KKworMjAwOC0xMi0wNyAxOTowMTozNSArMDAwMCAgQWxleGFuZHJlIFJvc3RvdnRzZXYgPHRldHJvbWlub0BnbWFpbC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogTWFrZSB1c2FnZSBvZiBsaWJ2NGwgb3B0aW9uYWwgYnkgYSBjb25maWd1cmUgcGFyYW1ldGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQWxleGFuZHJlIFJvc3RvdnRzZXYgPHRldHJvbWlubyBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBjb25maWd1cmUuYWM6CisJICBNYWtlIHVzYWdlIG9mIGxpYnY0bCBvcHRpb25hbCBieSBhIGNvbmZpZ3VyZSBwYXJhbWV0ZXIuCisJICBGaXhlcyBidWcgIzU2MzUwNC4KKworMjAwOC0xMi0wNSAwOToyNDoxOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgbWF0cm9za2FtdXggYW5kIG1hdHJvc2thZGVtdXggYW5kIHVwZGF0ZSB0aGUgaW5zcGVjdGlvbiB4bWwgZmlsZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgIEFkZCBkb2N1bWVudGF0aW9uIGZvciBtYXRyb3NrYW11eCBhbmQgbWF0cm9za2FkZW11eCBhbmQKKwkgIHVwZGF0ZSB0aGUgaW5zcGVjdGlvbiB4bWwgZmlsZXMuCisKKzIwMDgtMTItMDQgMjA6MTA6NTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgY29uZmlndXJlLmFjOiBBcHBhcmVudGx5IEFDX0NPTkZJR19NQUNST19ESVIgYnJlYWtzIHdoZW4gdXNpbmcgbW9yZSB0aGFuIG9uZSBtYWNybyBkaXJlY3RvcnksIHJldmVydGluZyBsYXN0IGNoYW5nZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBBcHBhcmVudGx5IEFDX0NPTkZJR19NQUNST19ESVIgYnJlYWtzIHdoZW4gdXNpbmcgbW9yZQorCSAgdGhhbiBvbmUgbWFjcm8gZGlyZWN0b3J5LCByZXZlcnRpbmcgbGFzdCBjaGFuZ2UuCisKKzIwMDgtMTItMDQgMTk6NDc6MjEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgY29uZmlndXJlLmFjOiBTZXQgQUNfQ09ORklHX01BQ1JPX0RJUiB0byBjb21tb24vbTQgdG8gcG9pbnQgYXV0b2NvbmYgdG8gb3VyIE00IG1hY3Jvcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBTZXQgQUNfQ09ORklHX01BQ1JPX0RJUiB0byBjb21tb24vbTQgdG8gcG9pbnQgYXV0b2NvbmYgdG8KKwkgIG91ciBNNCBtYWNyb3MuCisKKzIwMDgtMTEtMzAgMTY6MjQ6NDUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogUHJvdmlkZSB0aGUgcGFyYW1ldGVycyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgdGhlIGZvcm1hdCBzdHJpbmcgdG8gZml4IGEgY29tcGlsZXIgd2FybmluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19yZW5kZXIpOgorCSAgUHJvdmlkZSB0aGUgcGFyYW1ldGVycyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgdGhlIGZvcm1hdCBzdHJpbmcKKwkgIHRvIGZpeCBhIGNvbXBpbGVyIHdhcm5pbmcuCisKKzIwMDgtMTEtMjkgMjA6MDU6NDEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmM6IEZpeCBjbGFzc2lmaWNhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYzoKKwkgIEZpeCBjbGFzc2lmaWNhdGlvbi4KKworMjAwOC0xMS0yOSAxMzozMTo1NSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBSZXF1aXJlIGdldHRleHQgMC4xNyBiZWNhdXNlIG9sZGVyIHZlcnNpb25zIGRvbid0IG1peCB3aXRoIGxpYnRvb2wgMi4yLiBBdCBidWlsZCB0aW1lIGFuIG9sZGVyIGdldHRleHQgdmVyc2lvbiB3aWxsIHMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEN5Z3dpbiBQb3J0cyBtYWludGFpbmVyCisJICA8eXNlbGtvd2l0eiBhdCB1c2VycyBkb3Qgc291cmNlZm9yZ2UgZG90IG5ldD4KKwkgICogYXV0b2dlbi5zaDoKKwkgICogY29uZmlndXJlLmFjOgorCSAgUmVxdWlyZSBnZXR0ZXh0IDAuMTcgYmVjYXVzZSBvbGRlciB2ZXJzaW9ucyBkb24ndCBtaXggd2l0aCBsaWJ0b29sCisJICAyLjIuIEF0IGJ1aWxkIHRpbWUgYW4gb2xkZXIgZ2V0dGV4dCB2ZXJzaW9uIHdpbGwgc3RpbGwgd29yay4KKwkgIEZpeGVzIGJ1ZyAjNTU2MDkxLgorCisyMDA4LTExLTI4IDE1OjEwOjUwICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogTWFrZSBnc3RfbXVsdGl1ZHBzaW5rX3JlbmRlcigpIGlnbm9yZSBlcnJvcnMgZnJvbSBzZW5kdG8oKSBpbnN0ZWFkIG9mIGJyZWFraW5nIHN0cmVhbWluZy4gLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBQZXRlciBLamVsbGVyc3RlZHQgPHBraiBhdCBheGlzIGNvbT4KKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogKGdzdF9tdWx0aXVkcHNpbmtfcmVuZGVyKToKKwkgIE1ha2UgZ3N0X211bHRpdWRwc2lua19yZW5kZXIoKSBpZ25vcmUgZXJyb3JzIGZyb20gc2VuZHRvKCkgaW5zdGVhZCBvZgorCSAgYnJlYWtpbmcgc3RyZWFtaW5nLiBFbWl0IGEgd2FybmluZyBpbnN0ZWFkLiBGaXhlcyAjNTYyNTcyLgorCisyMDA4LTExLTI3IDE2OjQzOjI0ICswMDAwICBSb24gTWNPdWF0IDxybWNvdWF0QHNtYXJ0dC5jb20+CisKKwkgIEFkZCBzdXBwb3J0IGZvciBiYXNpYyBhbmQgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIGluIHNvdXBodHRwc3JjLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUm9uIE1jT3VhdCA8cm1jb3VhdCBhdCBzbWFydHQgZG90IGNvbT4KKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKGdzdF9zb3VwX2h0dHBfc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX2luaXQpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfZGlzcG9zZSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9zb3VwX2h0dHBfc3JjX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfYXV0aGVudGljYXRlX2NiKSwgKGdzdF9zb3VwX2h0dHBfc3JjX3N0YXJ0KToKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaDoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzogKGJhc2ljX2F1dGhfY2IpLAorCSAgKGRpZ2VzdF9hdXRoX2NiKSwgKHJ1bl90ZXN0KSwgKEdTVF9TVEFSVF9URVNUKSwKKwkgIChzb3VwaHR0cHNyY19zdWl0ZSksIChydW5fc2VydmVyKToKKwkgIEFkZCBzdXBwb3J0IGZvciBiYXNpYyBhbmQgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIGluIHNvdXBodHRwc3JjLgorCSAgRml4ZXMgYnVnICM1NjE3NzUuCisKKzIwMDgtMTEtMjcgMTI6MTM6MzkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L3dhdmVuYy86IEFkZCBzdXBwb3J0IGZvciBhLWxhdyBhbmQgbXUtbGF3IGVuY29kZWQgd2F2IGZpbGVzLiBGaXhlcyBidWcgIzU2MjQzNC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFBlcGlqbiBWYW4gRWVja2hvdWR0CisJICA8cGVwaWpuIGRvdCB2YW5lZWNraG91ZHQgYXQgbHVjaWFkIGRvdCBjb20+CisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX2NyZWF0ZV9oZWFkZXJfYnVmKSwKKwkgIChnc3Rfd2F2ZW5jX3Npbmtfc2V0Y2FwcyksIChnc3Rfd2F2ZW5jX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmg6CisJICAqIGdzdC93YXZlbmMvcmlmZi5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIGEtbGF3IGFuZCBtdS1sYXcgZW5jb2RlZCB3YXYgZmlsZXMuIEZpeGVzIGJ1ZyAjNTYyNDM0LgorCisyMDA4LTExLTI3IDExOjIyOjU2ICswMDAwICDsnbTrrLjtmJUgPGl3aW5nc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogUHJldmVudCBmdXJ0aGVyIHJlYWQvd3JpdGUgYWN0aW9ucyB0YWtlbiB0byB0aGUgY29ubmVjdC1mYWlsZWQgc29ja2V0IGJ5IGVycm9yaW5nIG91dCBxdWlja2x5Li4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTog7J2066y47ZiVIDxpd2luZ3MgYXQgZ21haWwgZG90IGNvbT4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfbG9vcF91ZHApOgorCSAgUHJldmVudCBmdXJ0aGVyIHJlYWQvd3JpdGUgYWN0aW9ucyB0YWtlbiB0byB0aGUgY29ubmVjdC1mYWlsZWQgc29ja2V0IGJ5CisJICBlcnJvcmluZyBvdXQgcXVpY2tseS4gU2VlICM1NjIyNTguCisKKzIwMDgtMTEtMjYgMjE6MTk6NDcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvZXhhbXBsZXMvbGV2ZWwvbGV2ZWwtZXhhbXBsZS5jOiBTZXQgZmFrZXNpbmsgdG8gc3luYy4gT3RoZXJ3aXNlIHBlb3BsZSBtaWdodCBxdWVzdGlvbiB0aGUgbWVzc2FnZSBpbnRlcnZhbC4gTmV2Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvZXhhbXBsZXMvbGV2ZWwvbGV2ZWwtZXhhbXBsZS5jOgorCSAgU2V0IGZha2VzaW5rIHRvIHN5bmMuIE90aGVyd2lzZSBwZW9wbGUgbWlnaHQgcXVlc3Rpb24gdGhlIG1lc3NhZ2UKKwkgIGludGVydmFsLiBOZXZlcnRoZWxlc3MgdGhlIHRpbWVzdGFtcCBpbiB0aGUgbWVzc2FnZSBpcyB3aGF0IG1hdHRlcnMuCisKKzIwMDgtMTEtMjUgMTg6MTM6MjUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHRlc3RzL2ljbGVzLy5jdnNpZ25vcmU6IGN2c2lnbm9yZSBuZXdseSBnZW5lcmF0ZWQgZmlsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9pY2xlcy8uY3ZzaWdub3JlOgorCSAgY3ZzaWdub3JlIG5ld2x5IGdlbmVyYXRlZCBmaWxlLgorCisyMDA4LTExLTI1IDE4OjAzOjAyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogRml4IHRoZSBkZXNjcmlwdGlvbnMgYW5kIGZpeCBzb21lIGVtYWlsIGFkZHJlc3Nlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOgorCSAgKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmM6IChnc3RfcnRwX0wxNl9kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNnBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNnBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6IChnc3RfcnRwX2FjM19kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwZHZkZXBheS5jOiAoZ3N0X3J0cF9kdl9kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6IChnc3RfcnRwX2dzbV9wYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6IChnc3RfcnRwX2gyNjNfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6IChnc3RfcnRwX2gyNjNwX2RlcGF5X3NldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmM6IChnc3RfcnRwX21wMXNfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6IChnc3RfcnRwX21wMnRfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydHBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzogKGdzdF9ydHBfbXA0YV9kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOiAoZ3N0X3J0cF9tcDRnX2RlcGF5X3NldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRncGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6IChnc3RfcnRwX21wNHZfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOiAoZ3N0X3J0cF9tcDR2X3BheV9ldmVudCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wdmRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6IChnc3RfcnRwX3BjbWFfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOiAoZ3N0X3J0cF92b3JiaXNfcGF5X2ZpbmlzaF9oZWFkZXJzKToKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzogKGdzdF9ydHBfdnJhd19kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6CisJICBGaXggdGhlIGRlc2NyaXB0aW9ucyBhbmQgZml4IHNvbWUgZW1haWwgYWRkcmVzc2VzLgorCisyMDA4LTExLTI1IDE3OjQ3OjI0ICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgTVBHMSBhbmQgTVBHMiBmb3VyY2MgdG8gc3VwcG9ydGVkIHF0ZGVtdXggdmlkZW8gY29kZWNzIGFzIEkgZm91bmQgc29tZSB2aWRlbyBjbGlwcyB1c2luZyB0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDgtMTEtMjUgIEp1bGllbiBNb3V0dGUgIDxqdWxpZW5AZmx1ZW5kby5jb20+CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6IEFkZCBNUEcxIGFuZCBNUEcyCisJICBmb3VyY2MKKwkgIHRvIHN1cHBvcnRlZCBxdGRlbXV4IHZpZGVvIGNvZGVjcyBhcyBJIGZvdW5kIHNvbWUgdmlkZW8gY2xpcHMKKwkgIHVzaW5nCisJICB0aG9zZS4KKworMjAwOC0xMS0yNSAxNjoyNjoxNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F1dG9kZXRlY3QvOiBQb3N0IGFuIGVycm9yIHdoZW4gd2UgY2FuJ3Qgc2V0IHRoZSBpbnRlcm5hbCBnaG9zdHBhZCB0YXJnZXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOiAoZ3N0X2F1dG9fYXVkaW9fc2lua19kZXRlY3QpOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYzogKGdzdF9hdXRvX2F1ZGlvX3NyY19kZXRlY3QpOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6IChnc3RfYXV0b192aWRlb19zaW5rX3Jlc2V0KSwKKwkgIChnc3RfYXV0b192aWRlb19zaW5rX2RldGVjdCk6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jOiAoZ3N0X2F1dG9fdmlkZW9fc3JjX2RldGVjdCk6CisJICBQb3N0IGFuIGVycm9yIHdoZW4gd2UgY2FuJ3Qgc2V0IHRoZSBpbnRlcm5hbCBnaG9zdHBhZCB0YXJnZXQuCisKKzIwMDgtMTEtMjUgMTY6MDY6MjIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLio6IEZpeCByZW5lZ290aWF0aW9uIHdoZW4gY2hhbmdpbmcgcHJvcGVydGllcyB1c2luZyB0aGUgbmV3IGJhc2V0cmFuc2Zvcm0gZmVhdHVyZXMuIEZpeGVzIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6IChnc3RfdmlkZW9fY3JvcF9pbml0KSwKKwkgIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm0pLCAoZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX2NhcHMpLAorCSAgKGdzdF92aWRlb19jcm9wX3NldF9jYXBzKSwgKGdzdF92aWRlb19jcm9wX3NldF9wcm9wZXJ0eSk6CisJICAqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmg6CisJICBGaXggcmVuZWdvdGlhdGlvbiB3aGVuIGNoYW5naW5nIHByb3BlcnRpZXMgdXNpbmcgdGhlIG5ldyBiYXNldHJhbnNmb3JtCisJICBmZWF0dXJlcy4gRml4ZXMgIzU2MTUwMi4KKwkgICogdGVzdHMvaWNsZXMvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcDItdGVzdC5jOiAobWFrZV9waXBlbGluZSksIChtYWluKToKKwkgIEFkZCBjcmF6eSBpbnRlcmFjdGl2ZSB0ZXN0IHVuaXQgZm9yIGR5bmFtaWNhbGx5IGNoYW5naW5nIHByb3BlcnRpZXMuCisKKzIwMDgtMTEtMjQgMTI6MjA6MjkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogQWRkIHNvbWUgbW9yZSBkZWJ1Z2dpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAobmV3X3Nlc3Npb25fcGFkKSwKKwkgIChnc3RfcnRzcHNyY19wYXJzZV9yYW5nZSk6CisJICBBZGQgc29tZSBtb3JlIGRlYnVnZ2luZy4KKwkgIFVzZSB0aGUgcmVhbmdlcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIgdW5jb25kaXRpb25hbGx5LgorCSAgRml4ZXMgIzU2MTYyNS4KKworMjAwOC0xMS0yMyAxNTowODo0NSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBleHQvcHVsc2UvcHVsc2VzaW5rLmM6IENoYW5nZSAjaWYgMCB0byBzb21ldGhpbmcgbW9yZSBleHByZXNpdmUgYW5kIGFkZCBwb2ludGVyIHRvIHJlbGF0ZWQgYnVnIHRpY2tldC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6CisJICBDaGFuZ2UgI2lmIDAgdG8gc29tZXRoaW5nIG1vcmUgZXhwcmVzaXZlIGFuZCBhZGQgcG9pbnRlciB0byByZWxhdGVkCisJICBidWcgdGlja2V0LgorCisyMDA4LTExLTIzIDExOjE3OjAxICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5CisKKzIwMDgtMTEtMjMgMTE6MTQ6NDIgKzAwMDAgIFRhbCBTaGFsaWYgPHRzaGFsaWZAbmFyZ2lsYS5vcmc+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogVXNlIEdfe0JJRyxMSVRUTEV9X0VORElBTiBpbnN0ZWFkIG9mIHRoZSBub24tR0xpYiB2YXJpYW50cyBhcyB0aGUgbGF0dGVyIGRvbid0IGV4aXN0IG9uIHNvbWUgcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVGFsIFNoYWxpZiA8dHNoYWxpZiBhdCBuYXJnaWxhIGRvdCBvcmc+CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfYXVkaW9fY2Fwcyk6CisJICBVc2UgR197QklHLExJVFRMRX1fRU5ESUFOIGluc3RlYWQgb2YgdGhlIG5vbi1HTGliIHZhcmlhbnRzIGFzCisJICB0aGUgbGF0dGVyIGRvbid0IGV4aXN0IG9uIHNvbWUgc3lzdGVtcyAobWluZ3cpLiBGaXhlcyBidWcgIzU2MTk5Mi4KKworMjAwOC0xMS0yMSAxMzo0MzoyOSArMDAwMCAgWmVlc2hhbiBBbGkgPHplZXNoYW5ha0Bnbm9tZS5vcmc+CisKKwkgIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IEFkZCB0cmFuc2Zlck1vZGUuZG5sYS5vcmcgaGVhZGVyIHRvIEhUVFAgcmVxdWVzdHMgYXMgdGhpcyBpcyByZXF1aXJlZCBieSB0aGUgRExOQSBzcGVjcyBhbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogWmVlc2hhbiBBbGkgPHplZXNoYW5hayBhdCBnbm9tZSBkb3Qgb3JnPgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOiAoZ3N0X3NvdXBfaHR0cF9zcmNfYnVpbGRfbWVzc2FnZSk6CisJICBBZGQgdHJhbnNmZXJNb2RlLmRubGEub3JnIGhlYWRlciB0byBIVFRQIHJlcXVlc3RzIGFzIHRoaXMgaXMKKwkgIHJlcXVpcmVkIGJ5IHRoZSBETE5BIHNwZWNzIGFuZCBkb2Vzbid0IGh1cnQgaW4gb3RoZXIgc2l0dWF0aW9ucy4KKwkgIEZpeGVzIGJ1ZyAjNTYxODAyLgorCisyMDA4LTExLTIwIDIzOjU5OjA3ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuKjogSGFuZGxlIHZpZGVvIHdpbmRvdyByZXNpemluZyBtb3JlIGNvcnJlY3RseSwgYXZvaWRpbmcgY3Jhc2hlcyB3aGVuIGVtYmVkZGluZyB0aGUgd2luZG93IC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgSGFuZGxlIHZpZGVvIHdpbmRvdyByZXNpemluZyBtb3JlIGNvcnJlY3RseSwgYXZvaWRpbmcgY3Jhc2hlcyB3aGVuCisJICBlbWJlZGRpbmcgdGhlIHdpbmRvdyBhbmQgcmVzaXppbmcgaXQuCisKKzIwMDgtMTEtMjAgMjI6NTY6NTggKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZ3N0L3VkcC86IEZpeCBtdWx0aXVkcHNpbmsgb24gT1NYIGJ5IHBhc3NpbmcgdGhlIHNwZWNpZmljIGxlbmd0aCBvZiB0aGUgc29ja2V0LCByZWZhY3RvciB0aGF0IGludG8gYSBmdW5jdGlvbiBzaGFyZWQgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSAgKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmg6CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICBGaXggbXVsdGl1ZHBzaW5rIG9uIE9TWCBieSBwYXNzaW5nIHRoZSBzcGVjaWZpYyBsZW5ndGggb2YgdGhlIHNvY2tldCwKKwkgIHJlZmFjdG9yIHRoYXQgaW50byBhIGZ1bmN0aW9uIHNoYXJlZCB3aXRoIHRoZSBzYW1lIHRoaW5nIGluIHVkcHNyYy4KKworMjAwOC0xMS0yMCAyMDowNzoyNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IEZpeCB0aGUgc2NhbGluZyBjb2RlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAodWludDY0X2NlaWxpbmdfc2NhbGVfaW50KSwKKwkgICh1aW50NjRfY2VpbGluZ19zY2FsZSksIChnc3Rfd2F2cGFyc2VfY2FsY3VsYXRlX2R1cmF0aW9uKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpOgorCSAgRml4IHRoZSBzY2FsaW5nIGNvZGUuCisJICBGaXggcGFyc2luZyBvZiB0aGUgSU5GTyBjaHVua3MsIHdlIHdlcmUgcmVhZGluZyB0aGUgd3JvbmcgbnVtYmVyIG9mCisJICBieXRlcy4gIEZpeGVzICM1NjE1ODAuCisKKzIwMDgtMTEtMjAgMTQ6MzA6NDAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IEZpeCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2Ugb2YgYW4gdW5zZXQgY29kZWNfaWQgaW4gdGhlIHJlY2VudGx5IGFkZGVkIERpcmFjIHBhdGhzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgRml4IE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSBvZiBhbiB1bnNldCBjb2RlY19pZCBpbiB0aGUgcmVjZW50bHkKKwkgIGFkZGVkIERpcmFjIHBhdGhzCisKKzIwMDgtMTEtMjAgMTM6NTg6NDMgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogSnVzdCBrZWVwIGRpc2FibGluZyBlbGVtZW50cyB0aGF0IGhhbmcgdGhlIHN0YXRlcyB0ZXN0IHVudGlsIGl0IHdvcmtzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgSnVzdCBrZWVwIGRpc2FibGluZyBlbGVtZW50cyB0aGF0IGhhbmcgdGhlIHN0YXRlcyB0ZXN0IHVudGlsIGl0CisJICB3b3Jrcy4KKworMjAwOC0xMS0yMCAxMzo0Njo0NyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6IERvbid0IGZsdXNoIGRvd25zdHJlYW0gYWZ0ZXIgZXZlcnkgYnVmZmVyIC0gdGhhdCdzIG5vdCB3aGF0IHRoaXMgbGlicG5nIGNhbGxiYWNrIGlzIGZvciBhdCBhbGwhCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgIERvbid0IGZsdXNoIGRvd25zdHJlYW0gYWZ0ZXIgZXZlcnkgYnVmZmVyIC0gdGhhdCdzIG5vdCB3aGF0CisJICB0aGlzIGxpYnBuZyBjYWxsYmFjayBpcyBmb3IgYXQgYWxsIQorCisyMDA4LTExLTE3IDE0OjA0OjIwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IFR1cm5zIG91dCB3ZSBkb24ndCBhbHdheXMgZ2V0IHRoZSBmcmFtZSBzaXplcyBpbiBhIHByZWRlZmluZWQgb3JkZXIgZnJvbSBsb3dlc3QgdG8gaGlnaGVzdCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICAoZ3N0X3Y0bDJzcmNfcHJvYmVfY2Fwc19mb3JfZm9ybWF0X2FuZF9zaXplKSwgKHNvcnRfYnlfZnJhbWVfc2l6ZSksCisJICAoZ3N0X3Y0bDJzcmNfcHJvYmVfY2Fwc19mb3JfZm9ybWF0KToKKwkgIFR1cm5zIG91dCB3ZSBkb24ndCBhbHdheXMgZ2V0IHRoZSBmcmFtZSBzaXplcyBpbiBhIHByZWRlZmluZWQKKwkgIG9yZGVyIGZyb20gbG93ZXN0IHRvIGhpZ2hlc3QgcmVzb2x1dGlvbiwgc28gbGV0J3MganVzdCBzb3J0IHRoZQorCSAgbGlzdCBieSBmcmFtZSBzaXplIG9uY2Ugd2UndmUgcXVlcmllZCB0aGUgcG9zc2libGUgcmVzb2x1dGlvbnMKKwkgIHJhdGhlciB0aGFuIGFzc3VtZSBhbnkgcGFydGljdWxhciBvcmRlci4gRml4ZXMgcHJvYmVkIGNhcHMgZm9yCisJICB0aGUgY2FtZXJhIGluIG15IEhQMjEzMyBtaW5pIG5vdGVib29rIGFuZCBtYWtlcyB2NGwyc3JjIGRlZmF1bHQKKwkgIHRvIGEgZGVjZW50IHNpemUuCisKKzIwMDgtMTEtMTYgMTQ6NDE6MzIgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9tYXRyb3NrYS86IE1ha2UgbWt2ZGVtdXggYXdhcmUgb2YgRS1BQzMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYXVkaW9fY2Fwcyk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIE1ha2UgbWt2ZGVtdXggYXdhcmUgb2YgRS1BQzMuCisKKzIwMDgtMTEtMTQgMTg6NDE6MjkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBBZGQgYSBqcGVnIGRlcGF5bG9hZGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHAvZ3N0cnRwLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmM6IChnc3RfcnRwX2pwZWdfZGVwYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX2pwZWdfZGVwYXlfY2xhc3NfaW5pdCksIChnc3RfcnRwX2pwZWdfZGVwYXlfaW5pdCksCisJICAoZ3N0X3J0cF9qcGVnX2RlcGF5X2ZpbmFsaXplKSwgKE1ha2VUYWJsZXMpLCAoTWFrZVF1YW50SGVhZGVyKSwKKwkgIChNYWtlSHVmZm1hbkhlYWRlciksIChNYWtlRFJJSGVhZGVyKSwgKE1ha2VIZWFkZXJzKSwKKwkgIChnc3RfcnRwX2pwZWdfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX2pwZWdfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF9qcGVnX2RlcGF5X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0cF9qcGVnX2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuaDoKKwkgIEFkZCBhIGpwZWcgZGVwYXlsb2FkZXIuCisJICAqIGdzdC9ydHAvZ3N0cnRwanBlZ3BheS5jOgorCSAgU2V0IHRoZSBkZWZhdWx0IHByb3BlcnRpZXMgb24gdGhlIHBheWxvYWRlciB0byBiZXR0ZXIgZGVmYXVsdHMuCisKKzIwMDgtMTEtMTQgMTU6NDI6MzIgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMi5jOiBHaXZlIGl0IGEgcHJpbWFyeSByYW5rIGZvciBhdXRvdmlkZW9zcmMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMi5jOgorCSAgR2l2ZSBpdCBhIHByaW1hcnkgcmFuayBmb3IgYXV0b3ZpZGVvc3JjLgorCisyMDA4LTExLTE0IDExOjQxOjU1ICswMDAwICBCam9ybiBPc3RieSA8Ympvcm5vc0BheGlzLmNvbT4KKworCSAgZ3N0L3J0cC86IEFkZCBKUEVHIHBheWxvYWRlci4gRml4ZXMgIzU2MDc1Ni4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEJqb3JuIE9zdGJ5IDxiam9ybm9zIGF0IGF4aXMgZG90IGNvbT4KKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBqcGVncGF5LmM6IChnc3RfcnRwX2pwZWdfcGF5X2Jhc2VfaW5pdCksCisJICAoZ3N0X3J0cF9qcGVnX3BheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfanBlZ19wYXlfaW5pdCksCisJICAoZ3N0X3J0cF9qcGVnX3BheV9zZXRjYXBzKSwgKGdzdF9ydHBfanBlZ19wYXlfaGVhZGVyX3NpemUpLAorCSAgKGdzdF9ydHBfanBlZ19wYXlfcmVhZF9xdWFudF90YWJsZSksCisJICAoZ3N0X3J0cF9qcGVnX3BheV9zY2FuX21hcmtlciksIChnc3RfcnRwX2pwZWdfcGF5X2hhbmRsZV9idWZmZXIpLAorCSAgKGdzdF9ydHBfanBlZ19wYXlfc2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBfanBlZ19wYXlfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2pwZWdfcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBqcGVncGF5Lmg6CisJICBBZGQgSlBFRyBwYXlsb2FkZXIuIEZpeGVzICM1NjA3NTYuCisKKzIwMDgtMTEtMTMgMTc6NDU6NTkgKzAwMDAgIEZhYnJpY2lvIEdvZG95IDxza2FybGxvdEBnbWFpbC5jb20+CisKKwkgIHN5cy86IEZpeCBzb21lIHNwZWxsaW5nIG1pc3Rha2VzLiBGaXhlcyAjNTU2ODAyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogRmFicmljaW8gR29kb3kgPHNrYXJsbG90IGF0IGdtYWlsIGRvdCBjb20+CisJICAqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc19zaW5rX29wZW4pOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NyYy5jOiAoZ3N0X29zc19zcmNfb3Blbik6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX2dldF9tbWFwKToKKwkgICogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOiAoZ3N0X3Y0bDJfZmlsbF9saXN0cyk6CisJICBGaXggc29tZSBzcGVsbGluZyBtaXN0YWtlcy4gRml4ZXMgIzU1NjgwMi4KKworMjAwOC0xMS0xMyAxNjoyNDo1OSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvZXF1YWxpemVyLzogQWRkIHByZXNldHMgZm9yIGVxdWFsaXplci4gRml4ZXMgIzUyMjE4My4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL0dzdElpckVxdWFsaXplcjEwQmFuZHMucHJzOgorCSAgKiBnc3QvZXF1YWxpemVyL0dzdElpckVxdWFsaXplcjNCYW5kcy5wcnM6CisJICAqIGdzdC9lcXVhbGl6ZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5jOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5jOgorCSAgQWRkIHByZXNldHMgZm9yIGVxdWFsaXplci4gRml4ZXMgIzUyMjE4My4KKworMjAwOC0xMS0xMyAxNjoxNzozOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvOiBSZW1vdmUgZ29vZ2xlIGV4dGVuc2lvbiBhZ2FpbiwgaXQncyBub3QgbmVlZGVkIGFueW1vcmUgYmVjYXVzZSB3ZSBuZXZlciBzZW5kIG11bHRpcGxlIHRyYW5zcG9ydHMgYW55bW9yZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwZ29vZ2xlLmM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3Bnb29nbGUuaDoKKwkgIFJlbW92ZSBnb29nbGUgZXh0ZW5zaW9uIGFnYWluLCBpdCdzIG5vdCBuZWVkZWQgYW55bW9yZSBiZWNhdXNlIHdlIG5ldmVyCisJICBzZW5kIG11bHRpcGxlIHRyYW5zcG9ydHMgYW55bW9yZS4KKworMjAwOC0xMS0xMyAxNjoxMToxNiArMDAwMCAgRXJpYyBaaGFuZyA8Y2hhby56aGFuZ0BhY2Nlc3MtY29tcGFueS5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuKjogQWRkIHByb3BlcnR5IHRvIGNvbmZpZ3VyZSBOQVQgdHJhdmVyc2FsIG1ldGhvZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IEVyaWMgWmhhbmcgPGNoYW8uemhhbmcgYXQgYWNjZXNzLWNvbXBhbnkgZG90IGNvbT4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BfbmF0X21ldGhvZF9nZXRfdHlwZSksCisJICAoZ3N0X3J0c3BzcmNfY2xhc3NfaW5pdCksIChnc3RfcnRzcHNyY19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHNwc3JjX2dldF9wcm9wZXJ0eSksIChnc3RfcnRzcHNyY19jcmVhdGVfc3RyZWFtKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fZnJlZSksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV91ZHBfc2lua3MpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwKKwkgIChnc3RfcnRzcHNyY19zZW5kX2R1bW15X3BhY2tldHMpLAorCSAgKGdzdF9ydHNwc3JjX2NyZWF0ZV90cmFuc3BvcnRzX3N0cmluZyksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX21lc3NhZ2UpLCAoZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgQWRkIHByb3BlcnR5IHRvIGNvbmZpZ3VyZSBOQVQgdHJhdmVyc2FsIG1ldGhvZC4KKwkgIElnbm9yZSBFT1MgZnJvbSB0aGUgaW50ZXJuYWwgc2lua3MuCisJICBJbXBsZW1lbnQgc2VuZGluZyBkdW1teSBwYWNrZXRzIGFzIGEgKHNpbXBsZSkgbWV0aG9kIHRvIG9wZW4gdXAKKwkgIHNvbWUgZmlyZXdhbGxzLgorCSAgU2VuZCBQTEFZIHJlcXVlc3QgdG8gdGhlIHNlcnZlciBhZnRlciB3ZSBzdGFydGVkIHRoZSB1ZHAgc291cmNlcy4KKwkgIEZpeGVzICM1NTk1NDUuCisKKzIwMDgtMTEtMTMgMTQ6MDQ6NDAgKzAwMDAgIFlvdGFtIDxzaC55b3RhbUBnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOiBGbHVzaCB0aGUgcmVtYWluaW5nIGZyYW1lcyBvbiBFT1MuIEZpeGVzICM1NjA2NDEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBZb3RhbSA8c2ggZG90IHlvdGFtIGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOiAoZ3N0X3J0cF9tcDR2X3BheV9ldmVudCk6CisJICBGbHVzaCB0aGUgcmVtYWluaW5nIGZyYW1lcyBvbiBFT1MuIEZpeGVzICM1NjA2NDEuCisKKzIwMDgtMTEtMTIgMTY6Mzc6MDYgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzogRml4IGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgcHJpbnRmIGZvcm1hdHRpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6IChnc3RfcnRwX2c3MjlfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgRml4IGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgcHJpbnRmIGZvcm1hdHRpbmcuCisKKzIwMDgtMTEtMTIgMTE6NTU6MTQgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC4qOiBRdWV1ZSB1cCBuZXcgc2VnbWVudCBldmVudHMgaW5zdGVhZCBvZiBzZW5kaW5nIHRoZW0gZnJvbSB0aGUgc2Vla2luZyB0aHJlYWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oIChzdHJ1Y3QgX0dzdFFURGVtdXgpOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmMgKGdzdF9xdGRlbXV4X2RvX3NlZWspOiBRdWV1ZSB1cCBuZXcKKwkgIHNlZ21lbnQgZXZlbnRzIGluc3RlYWQgb2Ygc2VuZGluZyB0aGVtIGZyb20gdGhlIHNlZWtpbmcgdGhyZWFkLgorCSAgRml4ZXMgIzU1OTI4OC4KKwkgIChnc3RfcXRkZW11eF9wdXNoX3BlbmRpbmdfbmV3c2VnbWVudCk6IE5ldyBoZWxwZXIsIHNlbmRzIG91dAorCSAgcXVldWVkIG5ld3NlZ21lbnQgZXZlbnRzLgorCSAgKGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfbW92aWUpOiBWb2lsw6AsIGNhbGwgaXQgaGVyZS4gT25seSBuZWVkIHRvCisJICBjYWxsIGl0IGhlcmUsIGFzIHdlIG9ubHkgc2VlayB3aGVuIGxvb3BpbmcsIGFuZCBvbmx5IHB1c2ggaW4gdGhlCisJICBtb3ZpZSBzdGF0ZS4KKworMjAwOC0xMS0xMSAxOTo1MjowNSArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGdzdC9xdGRlbXV4LzogQWRkIGNvdmVyIGFuZCBhbHRlcm5hdGl2ZSBjb3B5cmlnaHQgdGFnLCBhbmQgZW5oYW5jZSBzb21lIGV4aXN0aW5nIG9uZXMgYnkgbWFya2luZyB0aGVtIGFzIGNvbnRhaW5lciBhdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfdGFnX2FkZF90bXBvKSwKKwkgIChxdGRlbXV4X3RhZ19hZGRfY292ciksIChxdGRlbXV4X3BhcnNlX3VkdGEpOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4X2ZvdXJjYy5oOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4X3R5cGVzLmM6CisJICBBZGQgY292ZXIgYW5kIGFsdGVybmF0aXZlIGNvcHlyaWdodCB0YWcsIGFuZCBlbmhhbmNlIHNvbWUgZXhpc3RpbmcKKwkgIG9uZXMgYnkgbWFya2luZyB0aGVtIGFzIGNvbnRhaW5lciBhdG9tcy4KKworMjAwOC0xMS0xMSAxNzozMzowMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6IERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldGNhcHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6IChnc3RfcnRwX2c3MjlfcGF5X3NldF9jYXBzKToKKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldGNhcHMuCisKKzIwMDgtMTEtMTEgMTc6Mjk6MDMgKzAwMDAgIE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkgIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS4qOiBSZXBsYWNlIEc3MjkgcGF5bG9hZGVyIHdpdGggYW4gaW1wcm92ZWQgdmVyc2lvbi4gRml4ZXMgIzUzMjQwOS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlciBhdCB0ZXN0ZXIgZG90IGNhPgorCSAgKiBnc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYzogKGdzdF9ydHBfZzcyOV9wYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX2c3MjlfcGF5X2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9nNzI5X3BheV9pbml0KSwKKwkgIChnc3RfcnRwX2c3MjlfcGF5X3NldF9jYXBzKSwgKGdzdF9ydHBfZzcyOV9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICAqIGdzdC9ydHAvZ3N0cnRwZzcyOXBheS5oOgorCSAgUmVwbGFjZSBHNzI5IHBheWxvYWRlciB3aXRoIGFuIGltcHJvdmVkIHZlcnNpb24uIEZpeGVzICM1MzI0MDkuCisKKzIwMDgtMTEtMTEgMTY6MDA6NDggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogT25seSBzZW5kIG9uZSB0cmFuc3BvcnQgYXQgYSB0aW1lIGZvciBpbXByb3ZlZCBjb21wYXRpYmlsaXR5IHdpdGggc29tZSBicm9rZW4gc2VydmVycy4gU2VlICM1My4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2NyZWF0ZV90cmFuc3BvcnRzX3N0cmluZyksCisJICAoZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlKToKKwkgIE9ubHkgc2VuZCBvbmUgdHJhbnNwb3J0IGF0IGEgdGltZSBmb3IgaW1wcm92ZWQgY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUKKwkgIGJyb2tlbiBzZXJ2ZXJzLiBTZWUgIzUzNzgzMi4KKworMjAwOC0xMS0xMSAxNToxNjozMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBPbmx5IHBhdXNlL3BsYXkgaW4gdGhlIHNlZWsgaGFuZGxlciB3aGVuIHRoZSBzb3VyY2Ugd2FzIHBsYXlpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfZG9fc2VlayksCisJICAoZ3N0X3J0c3BzcmNfcGVyZm9ybV9zZWVrKToKKwkgIE9ubHkgcGF1c2UvcGxheSBpbiB0aGUgc2VlayBoYW5kbGVyIHdoZW4gdGhlIHNvdXJjZSB3YXMgcGxheWluZy4KKwkgIEZpeGVzICM1MjkzNzkuCisKKzIwMDgtMTEtMTEgMTI6MTg6MjMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBGaXggbXV4aW5nIG9mIERpcmFjIHN0cmVhbXMgaWYgdGhlIGlucHV0IGFscmVhZHkgaGFzIHRoZSBmb3JtYXQgd2UgbmVlZCwgaS5lLiBpcyB0aGUgb3V0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9tdXhfaGFuZGxlX2RpcmFjX3BhY2tldCk6CisJICBGaXggbXV4aW5nIG9mIERpcmFjIHN0cmVhbXMgaWYgdGhlIGlucHV0IGFscmVhZHkgaGFzIHRoZSBmb3JtYXQKKwkgIHdlIG5lZWQsIGkuZS4gaXMgdGhlIG91dHB1dCBvZiBtYXRyb3NrYWRlbXV4LgorCisyMDA4LTExLTExIDEwOjA2OjAxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IERvbid0IHNlZ2ZhdWx0IG9uIHN0cmluZyB0eXBlZCB0YWdzIGJlaW5nIE5VTEwuIEZpeGVzICM1NjAxNTUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIERvbid0IHNlZ2ZhdWx0IG9uIHN0cmluZyB0eXBlZCB0YWdzIGJlaW5nIE5VTEwuIEZpeGVzICM1NjAxNTUuCisKKzIwMDgtMTEtMTAgMTY6NDQ6NDUgKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IEZpeCBtYXBwaW5nIEFBQyBwcm9maWxlIHRvIE1hdHJvc2thIGNvZGVjIGlkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGFhY19jb2RlY19kYXRhX3RvX2NvZGVjX2lkKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X2F1ZGlvX3BhZF9zZXRjYXBzKToKKwkgIEZpeCBtYXBwaW5nIEFBQyBwcm9maWxlIHRvIE1hdHJvc2thIGNvZGVjIGlkLgorCisyMDA4LTExLTEwIDE2OjM2OjA5ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBSZWZhY3RvciBzb21lIHJhdyBhdWRpbyBjYXBzIGJ1aWxkaW5nLCBhbmQgaGFuZGxlID4xNi1iaXQgY2FzZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKSwKKwkgIChxdGRlbXV4X3ZpZGVvX2NhcHMpLCAocXRkZW11eF9hdWRpb19jYXBzKToKKwkgIFJlZmFjdG9yIHNvbWUgcmF3IGF1ZGlvIGNhcHMgYnVpbGRpbmcsIGFuZCBoYW5kbGUgPjE2LWJpdCBjYXNlcy4KKwkgIEZpeC9yZXBsYWNlIGJ1aWxkaW5nIGNhcHMgZnJvbSBhIHN0cmluZyBkZXNjcmlwdGlvbi4KKworMjAwOC0xMS0xMCAxMzo1OToyNyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGdzdC86IE1ha2UgYXV0aG9yIG5hbWUgY29uc2lzdGVudCB3aXRoIG90aGVycy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5jOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYzoKKwkgICogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzoKKwkgIE1ha2UgYXV0aG9yIG5hbWUgY29uc2lzdGVudCB3aXRoIG90aGVycy4KKworMjAwOC0xMS0xMCAxMjoxMzoyMSArMDAwMCAgRXJpYyBaaGFuZyA8Y2hhby56aGFuZ0BhY2Nlc3MtY29tcGFueS5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogUGF1c2UgdGhlIFJUU1Agc3RyZWFtIGJlZm9yZSBkb2luZyBhIG5ldyBwbGF5IHJlcXVlc3QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5OiBFcmljIFpoYW5nIDxjaGFvLnpoYW5nIGF0IGFjY2Vzcy1jb21wYW55IGRvdCBjb20+CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3BlcmZvcm1fc2VlayksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV91ZHBfc2luayk6CisJICBQYXVzZSB0aGUgUlRTUCBzdHJlYW0gYmVmb3JlIGRvaW5nIGEgbmV3IHBsYXkgcmVxdWVzdC4KKwkgIE1ha2Ugc3VyZSB0aGF0IGFkZGluZyB0aGUgdWRwc2lua3MgZG9lcyBub3QgY2F1c2UgdGhlIHJ0c3BzcmMgdG8gYmVjb21lCisJICBhIHNpbmsuIEZpeGVzICM1NTk1NDcuCisKKzIwMDgtMTEtMDUgMTQ6NDI6MzUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thLzogSW1wbGVtZW50IERpcmFjIG11eGluZyBpbnRvIE1hdHJvc2thIGNvbWZvcm1pbmcgdG8gdGhlIHNwZWMsIGkuZS4gcHV0IGFsbCBEaXJhYyBwYWNrYWdlcyB1cCB0byBhIHBpY3R1Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfcGFkX2ZyZWUpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfaGFuZGxlX2RpcmFjX3BhY2tldCksCisJICAoZ3N0X21hdHJvc2thX211eF93cml0ZV9kYXRhKToKKwkgIEltcGxlbWVudCBEaXJhYyBtdXhpbmcgaW50byBNYXRyb3NrYSBjb21mb3JtaW5nIHRvIHRoZSBzcGVjLCBpLmUuCisJICBwdXQgYWxsIERpcmFjIHBhY2thZ2VzIHVwIHRvIGEgcGljdHVyZSBpbnRvIGEgTWF0cm9za2EgYmxvY2suCisJICBUT0RPOiBJbXBsZW1lbnQgd3JpdGluZyBvZiB0aGUgUmVmZXJlbmNlQmxvY2sgTWF0cm9za2EgZWxlbWVudHMsCisJICBjdXJyZW50bHkgdGhlIERpcmFjIG11eGluZyBpcyBvbmx5IDEwMCUgY29ycmVjdCBpZiBNYXRyb3NrYSB2ZXJzaW9uIDIKKwkgIGlzIHNlbGVjdGVkIGZvciBtdXhpbmcuCisKKzIwMDgtMTEtMDQgMTI6MzI6NDggKzAwMDAgIEJhc3RpZW4gTm9jZXJhIDxoYWRlc3NAaGFkZXNzLm5ldD4KKworCSAgT3B0aW9uYWxseSB1c2UgbGlidjRsIHRvIGFjY2VzcyB2NGwyIGRldmljZXMuIEZpeGVzIGJ1ZyAjNTQ1MDMzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQmFzdGllbiBOb2NlcmEgPGhhZGVzcyBhdCBoYWRlc3MgZG90IG5ldD4sCisJICBIYW5zIGRlIEdvZWRlIDxqd3JkZWdvZWRlIGF0IGZlZG9yYXByb2plY3QgZG90IG9yZz4KKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfZ2V0X3JlYWQpOgorCSAgKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6IChnc3RfdjRsMl9nZXRfY2FwYWJpbGl0aWVzKSwKKwkgIChnc3RfdjRsMl9maWxsX2xpc3RzKSwgKGdzdF92NGwyX29wZW4pLCAoZ3N0X3Y0bDJfY2xvc2UpLAorCSAgKGdzdF92NGwyX2dldF9ub3JtKSwgKGdzdF92NGwyX3NldF9ub3JtKSwgKGdzdF92NGwyX2dldF9mcmVxdWVuY3kpLAorCSAgKGdzdF92NGwyX3NldF9mcmVxdWVuY3kpLCAoZ3N0X3Y0bDJfc2lnbmFsX3N0cmVuZ3RoKSwKKwkgIChnc3RfdjRsMl9nZXRfYXR0cmlidXRlKSwgKGdzdF92NGwyX3NldF9hdHRyaWJ1dGUpLAorCSAgKGdzdF92NGwyX2dldF9pbnB1dCksIChnc3RfdjRsMl9zZXRfaW5wdXQpOgorCSAgKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyX2J1ZmZlcl9maW5hbGl6ZSksCisJICAoZ3N0X3Y0bDJfYnVmZmVyX25ldyksIChnc3RfdjRsMl9idWZmZXJfcG9vbF9maW5hbGl6ZSksCisJICAoZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfbmV3KSwgKGdzdF92NGwyX2J1ZmZlcl9wb29sX2FjdGl2YXRlKSwKKwkgIChnc3RfdjRsMnNyY19maWxsX2Zvcm1hdF9saXN0KSwKKwkgIChnc3RfdjRsMnNyY19wcm9iZV9jYXBzX2Zvcl9mb3JtYXRfYW5kX3NpemUpLAorCSAgKGdzdF92NGwyc3JjX3Byb2JlX2NhcHNfZm9yX2Zvcm1hdCksIChnc3RfdjRsMnNyY19ncmFiX2ZyYW1lKSwKKwkgIChnc3RfdjRsMnNyY19zZXRfY2FwdHVyZSksIChnc3RfdjRsMnNyY19jYXB0dXJlX2luaXQpLAorCSAgKGdzdF92NGwyc3JjX2NhcHR1cmVfc3RhcnQpLCAoZ3N0X3Y0bDJzcmNfY2FwdHVyZV9zdG9wKSwKKwkgIChnc3RfdjRsMnNyY19nZXRfbmVhcmVzdF9zaXplKToKKwkgIE9wdGlvbmFsbHkgdXNlIGxpYnY0bCB0byBhY2Nlc3MgdjRsMiBkZXZpY2VzLiBGaXhlcyBidWcgIzU0NTAzMy4KKworMjAwOC0xMS0wNCAxMjoyODozNCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBEb24ndCBpbnN0YWxsIHN0YXRpYyBsaWJzIGZvciBwbHVnaW5zLiBGaXhlcyAjNTUwODUxIGZvciAtZ29vZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYWFsaWIvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hbm5vZGV4L01ha2VmaWxlLmFtOgorCSAgKiBleHQvY2Fpcm8vTWFrZWZpbGUuYW06CisJICAqIGV4dC9kdi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2VzZC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2ZsYWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9nY29uZi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2dka19waXhidWYvTWFrZWZpbGUuYW06CisJICAqIGV4dC9oYWwvTWFrZWZpbGUuYW06CisJICAqIGV4dC9qcGVnL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbGFkc3BhL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbGliY2FjYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xpYm1uZy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xpYnBuZy9NYWtlZmlsZS5hbToKKwkgICogZXh0L21pa21vZC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3B1bHNlL01ha2VmaWxlLmFtOgorCSAgKiBleHQvcmF3MTM5NC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3Nob3V0Mi9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NvdXAvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zcGVleC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3RhZ2xpYi9NYWtlZmlsZS5hbToKKwkgICogZXh0L3dhdnBhY2svTWFrZWZpbGUuYW06CisJICAqIGdzdC9hbHBoYS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FwZXRhZy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdXBhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXV0b2RldGVjdC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F2aS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2N1dHRlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlYnVnL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2VxdWFsaXplci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ZseC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2dvb20vTWFrZWZpbGUuYW06CisJICAqIGdzdC9nb29tMmsxL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvaWN5ZGVtdXgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9pZDNkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ludGVybGVhdmUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9sYXcvTWFrZWZpbGUuYW06CisJICAqIGdzdC9sZXZlbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWVkaWFuL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbW9ub3Njb3BlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXVsdGlmaWxlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXVsdGlwYXJ0L01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvb2xkY29yZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3F0ZGVtdXgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9yZXBsYXlnYWluL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRzcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NtcHRlL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3BlY3RydW0vTWFrZWZpbGUuYW06CisJICAqIGdzdC91ZHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC92aWRlb2JveC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZpZGVvY3JvcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3dhdmVuYy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3dhdnBhcnNlL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9NYWtlZmlsZS5hbToKKwkgICogc3lzL2RpcmVjdHNvdW5kL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3NzL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3N4YXVkaW8vTWFrZWZpbGUuYW06CisJICAqIHN5cy9vc3h2aWRlby9NYWtlZmlsZS5hbToKKwkgICogc3lzL3N1bmF1ZGlvL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkgICogc3lzL3dhdmVmb3JtL01ha2VmaWxlLmFtOgorCSAgKiBzeXMveGltYWdlL01ha2VmaWxlLmFtOgorCSAgRG9uJ3QgaW5zdGFsbCBzdGF0aWMgbGlicyBmb3IgcGx1Z2lucy4gRml4ZXMgIzU1MDg1MSBmb3IgLWdvb2QuCisKKzIwMDgtMTAtMzEgMTg6MTc6NTAgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2ZsYWMvTWFrZWZpbGUuYW06IEluY2x1ZGUgJChGTEFDX0NGTEFHUykgaW4gQ0ZMQUdTIHRvIG1ha2Ugc3VyZSB0byBmaW5kIHRoZSBGTEFDIGhlYWRlcnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvTWFrZWZpbGUuYW06CisJICBJbmNsdWRlICQoRkxBQ19DRkxBR1MpIGluIENGTEFHUyB0byBtYWtlIHN1cmUgdG8gZmluZCB0aGUgRkxBQyBoZWFkZXJzLgorCSAgVGhpcyBmaXhlcyBjb21waWxhdGlvbiBpZiBGTEFDIGlzIGluc3RhbGxlZCBpbiBhbiB1bmNvbW1vbiBsb2NhdGlvbgorCSAgdGhhdCBpcyBub3QgYWxyZWFkeSBoYW5kbGVkIGJ5IG90aGVyIENGTEFHUy4gRml4ZXMgYnVnICM1NTg3MTEuCisKKzIwMDgtMTAtMzEgMTA6MDg6NTAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogR3VhcmQgbW9yZSB1bmNvbW1vbiBmb3JtYXRzIHdpdGggaWZkZWZzIHNvIHRoYXQgd2UgY2FuIGNvbXBpbGUgb24gb2xkZXIgdmVyc2lvbnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfZm9ybWF0X2dldF9yYW5rKToKKwkgIEd1YXJkIG1vcmUgdW5jb21tb24gZm9ybWF0cyB3aXRoIGlmZGVmcyBzbyB0aGF0IHdlIGNhbiBjb21waWxlIG9uIG9sZGVyCisJICB2ZXJzaW9ucy4KKworMjAwOC0xMC0zMSAxMDowMDoxOCArMDAwMCAgTmljayBIYWRkYWQgPG5pY2tAaGFkZGFkcy5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogSW52ZXJ0IG90aGVyIHVuY29tcHJlc3NlZCBSR0IgZm9ybWF0cy4gRml4ZXMgIzU1ODU1NC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE5pY2sgSGFkZGFkIDxuaWNrIGF0IGhhZGRhZHMgZG90IG5ldD4KKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9pc191bmNvbXByZXNzZWQpLAorCSAgKGdzdF9hdmlfZGVtdXhfaW52ZXJ0KSwgKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKToKKwkgIEludmVydCBvdGhlciB1bmNvbXByZXNzZWQgUkdCIGZvcm1hdHMuIEZpeGVzICM1NTg1NTQuCisKKzIwMDgtMTAtMzAgMTU6MDg6NDkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L3dhdmVuYy9nc3R3YXZlbmMuKjogQWRkIHN1cHBvcnQgZm9yIGZsb2F0L2RvdWJsZSBhcyBpbnB1dCBhbmQgcmVtb3ZlIHRoZSAobm93YWRheXMpIHVzZWxlc3MgcGFyc2luZyBvZiB0aGUgZGVwdGggLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzogKGdzdF93YXZlbmNfY3JlYXRlX2hlYWRlcl9idWYpLAorCSAgKGdzdF93YXZlbmNfc2lua19zZXRjYXBzKSwgKGdzdF93YXZlbmNfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuaDoKKwkgIEFkZCBzdXBwb3J0IGZvciBmbG9hdC9kb3VibGUgYXMgaW5wdXQgYW5kIHJlbW92ZSB0aGUgKG5vd2FkYXlzKQorCSAgdXNlbGVzcyBwYXJzaW5nIG9mIHRoZSBkZXB0aCBhcyB3ZSByZXF1aXJlIHdpZHRoPT1kZXB0aC4KKworMjAwOC0xMC0zMCAxMDozMTozNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IE5hcnJvdyBkb3duIHRoZSBjYXBzIG9mIHRoZSBtcGVnIGF1ZGlvIHBheS9kZXBheWxvYWRlcnMgdG8gb25seSBhY2NlcHQgbXBlZyB2ZXJzaW9uIDEuIEZpeGVzICM1NTg0MjcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOiAoZ3N0X3J0cF9tcGFfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJICBOYXJyb3cgZG93biB0aGUgY2FwcyBvZiB0aGUgbXBlZyBhdWRpbyBwYXkvZGVwYXlsb2FkZXJzIHRvIG9ubHkgYWNjZXB0CisJICBtcGVnIHZlcnNpb24gMS4gRml4ZXMgIzU1ODQyNy4KKworMjAwOC0xMC0yOSAxODoyODoyNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzogT25seSBwdXQgYW4gaW50ZWdyYWwgYW1vdW50IG9mIHNhbXBsZXMgaW4gdGhlIFJUUCBwYWNrZXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzogKGdzdF9ydHBfTDE2X3BheV9mbHVzaCksCisJICAoZ3N0X3J0cF9MMTZfcGF5X2dldGNhcHMpOgorCSAgT25seSBwdXQgYW4gaW50ZWdyYWwgYW1vdW50IG9mIHNhbXBsZXMgaW4gdGhlIFJUUCBwYWNrZXQuCisJICBGaXhlcyAjNTU2NjQxLgorCisyMDA4LTEwLTI4IDE3OjQyOjAyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGNoYW5uZWxzLio6IEFkZCBtZXRob2QgdG8gZ2V0IHBvc3NpYmxlIGNoYW5uZWwgcG9zaXRpb25zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwY2hhbm5lbHMuYzogKGdzdF9ydHBfY2hhbm5lbHNfZ2V0X2J5X2luZGV4KToKKwkgICogZ3N0L3J0cC9nc3RydHBjaGFubmVscy5oOgorCSAgQWRkIG1ldGhvZCB0byBnZXQgcG9zc2libGUgY2hhbm5lbCBwb3NpdGlvbnMuCisKKzIwMDgtMTAtMjggMTc6Mzk6NDggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvTWFrZWZpbGUuYW06IEFsc28gY29tbWl0IHVwZGF0ZWQgbWFrZWZpbGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgQWxzbyBjb21taXQgdXBkYXRlZCBtYWtlZmlsZQorCisyMDA4LTEwLTI4IDE0OjU2OjA4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IERvbid0IGFsbG93IHdpZHRoPTMyLGRlcHRoPTI0IGFzIGlucHV0LiBXQVYgcmVxdWlyZXMgdGhhdCB0aGUgd2lkdGggaXMgdGhlIG5leHQgaW50ZWdlciBtdWx0aS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX2NoYWluKToKKwkgIERvbid0IGFsbG93IHdpZHRoPTMyLGRlcHRoPTI0IGFzIGlucHV0LiBXQVYgcmVxdWlyZXMgdGhhdCB0aGUgd2lkdGgKKwkgIGlzIHRoZSBuZXh0IGludGVnZXIgbXVsdGlwbHkgb2YgOCBmcm9tIHRoZSBkZXB0aC4KKworMjAwOC0xMC0yOCAxMDowMTo0OSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEFkZCBtYXBwaW5ncyBmb3IgbXVsdGljaGFubmVsIHN1cHBvcnQuIERvZXMgbm90IGNvbXBsZXRlbHkganVzdCB3b3JrIGJlY2F1c2UgdGhlIGdldGNhcHMgZnVuY3Rpb24gZG9lcyBub3QgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOiAoZ3N0X3J0cF9MMTZfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6IChnc3RfcnRwX0wxNl9wYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9MMTZfcGF5X2dldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGNoYW5uZWxzLmM6IChjaGVja19jaGFubmVscyksCisJICAoZ3N0X3J0cF9jaGFubmVsc19nZXRfYnlfcG9zKSwgKGdzdF9ydHBfY2hhbm5lbHNfZ2V0X2J5X29yZGVyKSwKKwkgIChnc3RfcnRwX2NoYW5uZWxzX2NyZWF0ZV9kZWZhdWx0KToKKwkgICogZ3N0L3J0cC9nc3RydHBjaGFubmVscy5oOgorCSAgQWRkIG1hcHBpbmdzIGZvciBtdWx0aWNoYW5uZWwgc3VwcG9ydC4gRG9lcyBub3QgY29tcGxldGVseSBqdXN0IHdvcmsKKwkgIGJlY2F1c2UgdGhlIGdldGNhcHMgZnVuY3Rpb24gZG9lcyBub3QgeWV0IHJldHVybiB0aGUgYWxsb3dlZCBjaGFubmVsCisJICBtYXBwaW5ncy4gU2VlICM1NTY2NDEuCisKKzIwMDgtMTAtMjggMDY6NTA6NTcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2dvb20vOiBBZGQgbGljZW5zZSBoZWFkZXJzIGluIGFsbCBzb3VyY2UgZmlsZXMuIFJlbW92ZSBmaWx0ZXIuYyBmcm9tCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vTWFrZWZpbGUuYW06CisJICAqIGdzdC9nb29tL1JFQURNRToKKwkgICogZ3N0L2dvb20vY29uZmlnX3BhcmFtLmM6CisJICAqIGdzdC9nb29tL2NvbnZvbHZlX2Z4LmM6CisJICAqIGdzdC9nb29tL2RyYXdtZXRob2RzLmM6CisJICAqIGdzdC9nb29tL2RyYXdtZXRob2RzLmg6CisJICAqIGdzdC9nb29tL2ZpbHRlcnMuYzoKKwkgICogZ3N0L2dvb20vZmlsdGVyc19tbXguczoKKwkgICogZ3N0L2dvb20vZmx5aW5nX3N0YXJzX2Z4LmM6CisJICAqIGdzdC9nb29tL2dvb20uaDoKKwkgICogZ3N0L2dvb20vZ29vbV9jb25maWcuaDoKKwkgICogZ3N0L2dvb20vZ29vbV9jb25maWdfcGFyYW0uaDoKKwkgICogZ3N0L2dvb20vZ29vbV9jb3JlLmM6CisJICAqIGdzdC9nb29tL2dvb21fZmlsdGVycy5oOgorCSAgKiBnc3QvZ29vbS9nb29tX2Z4Lmg6CisJICAqIGdzdC9nb29tL2dvb21fZ3JhcGhpYy5oOgorCSAgKiBnc3QvZ29vbS9nb29tX3BsdWdpbl9pbmZvLmg6CisJICAqIGdzdC9nb29tL2dvb21fdG9vbHMuYzoKKwkgICogZ3N0L2dvb20vZ29vbV90b29scy5oOgorCSAgKiBnc3QvZ29vbS9nb29tX3R5cGVkZWZzLmg6CisJICAqIGdzdC9nb29tL2dvb21fdmlzdWFsX2Z4Lmg6CisJICAqIGdzdC9nb29tL2dyYXBoaWMuYzoKKwkgICogZ3N0L2dvb20vaWZzLmM6CisJICAqIGdzdC9nb29tL2lmcy5oOgorCSAgKiBnc3QvZ29vbS9saW5lcy5jOgorCSAgKiBnc3QvZ29vbS9saW5lcy5oOgorCSAgKiBnc3QvZ29vbS9tYXRodG9vbHMuYzoKKwkgICogZ3N0L2dvb20vbWF0aHRvb2xzLmg6CisJICAqIGdzdC9nb29tL21teC5jOgorCSAgKiBnc3QvZ29vbS9tb3RpZl9nb29tMS5oOgorCSAgKiBnc3QvZ29vbS9tb3RpZl9nb29tMi5oOgorCSAgKiBnc3QvZ29vbS9wbHVnaW5faW5mby5jOgorCSAgKiBnc3QvZ29vbS9wcGNfZHJhd2luZ3MuaDoKKwkgICogZ3N0L2dvb20vcHBjX3pvb21fdWx0aW1hdGUuaDoKKwkgICogZ3N0L2dvb20vc291bmRfdGVzdGVyLmM6CisJICAqIGdzdC9nb29tL3NvdW5kX3Rlc3Rlci5oOgorCSAgKiBnc3QvZ29vbS9zdXJmM2QuYzoKKwkgICogZ3N0L2dvb20vc3VyZjNkLmg6CisJICAqIGdzdC9nb29tL3RlbnRhY2xlM2QuYzoKKwkgICogZ3N0L2dvb20vdGVudGFjbGUzZC5oOgorCSAgKiBnc3QvZ29vbS92M2QuYzoKKwkgICogZ3N0L2dvb20vdjNkLmg6CisJICAqIGdzdC9nb29tL3htbXguYzoKKwkgIEFkZCBsaWNlbnNlIGhlYWRlcnMgaW4gYWxsIHNvdXJjZSBmaWxlcy4gUmVtb3ZlIGZpbHRlci5jIGZyb20KKwkgIEVYVFJBX0RJU1QsIGFzIGl0cyBpbiBTT1VSQ0VTIGFscmVhZHkuIE1lbnRpb24gdGhlIGZpbGVzIGluIHRoZSBSRURNRQorCSAgd2hpY2ggYXJlIG5vdCB1c2VkIHJpZ2h0IG5vdy4gRml4ZXMgIzU1NzcwOS4KKworMjAwOC0xMC0yNyAxMToyODozMCArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzogSW1wbGVtZW50IGdldGNhcHMgaW4gcnRwTDE2cGF5LiBGaXhlcyAjNTU2NDg0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyIGF0IHRlc3RlciBkb3QgY2E+CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6IChnc3RfcnRwX0wxNl9wYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9MMTZfcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9MMTZfcGF5X2dldGNhcHMpOgorCSAgSW1wbGVtZW50IGdldGNhcHMgaW4gcnRwTDE2cGF5LiBGaXhlcyAjNTU2NDg0LgorCisyMDA4LTEwLTI3IDExOjAzOjUzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmM6IENoZWNrIGlmIGNsb2NrLXJhdGUgYW5kIGNoYW5uZWxzIGFyZSB2YWxpZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmM6IChnc3RfcnRwX0wxNl9kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX0wxNl9kZXBheV9wcm9jZXNzKToKKwkgIENoZWNrIGlmIGNsb2NrLXJhdGUgYW5kIGNoYW5uZWxzIGFyZSB2YWxpZC4KKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldGNhcHMuCisJICBObyBuZWVkIHRvIHZhbGlkYXRlIHRoZSBidWZmZXIsIHRoZSBiYXNlIGNsYXNzIGRvZXMgdGhhdCBmb3IgdXMuCisJICBVc2UgdGhlIG1hcmtlciBiaXQgdG8gc2V0IHRoZSBESVNDT05UIGZsYWcgb24gb3V0Z29pbmcgYnVmZmVycy4KKwkgICogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzogKGdzdF9ydHBfTDE2X3BheV9zZXRjYXBzKToKKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldF9vdXRjYXBzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmM6IChnc3RfcnRwX2FjM19kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX2FjM19kZXBheV9wcm9jZXNzKToKKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldF9jYXBzLgorCSAgTm8gbmVlZCB0byB2YWxpZGF0ZSB0aGUgYnVmZmVyLCB0aGUgYmFzZSBjbGFzcyBkb2VzIHRoYXQgZm9yIHVzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6IChnc3RfcnRwX2Ftcl9kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX2Ftcl9kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5oOgorCSAgRG9uJ3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2Ygc2V0Y2Fwcy4KKwkgIE5vIG5lZWQgdG8gdmFsaWRhdGUgdGhlIGJ1ZmZlciwgdGhlIGJhc2UgY2xhc3MgZG9lcyB0aGF0IGZvciB1cy4KKwkgIE5vIG5lZWQgdG8gc2V0IG91dHB1dCBjYXBzIG9uIHRoZSBidWZmZXJzLCB0aGUgYmFzZSBjbGFzcyBkb2VzIHRoYXQgZm9yCisJICB1cy4KKwkgIFRoZSBzdWJjbGFzcyB3aWxsIG1ha2Ugc3VyZSB3ZSBhcmUgbmVnb3RpYXRlZC4KKwkgICogZ3N0L3J0cC9nc3RydHBkdmRlcGF5LmM6IChnc3RfcnRwX2R2X2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfZHZfZGVwYXlfcHJvY2VzcyksIChnc3RfcnRwX2R2X2RlcGF5X3Jlc2V0KToKKwkgICogZ3N0L3J0cC9nc3RydHBkdmRlcGF5Lmg6CisJICBDbGVhbiB1cCBjYXBzIG5lZ290aWF0aW9uLgorCSAgVGhlIHN1YmNsYXNzIHdpbGwgbWFrZSBzdXJlIHdlIGFyZSBuZWdvdGlhdGVkLgorCSAgKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOiAoZ3N0X3J0cF9nNzI2X2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfZzcyNl9kZXBheV9wcm9jZXNzKToKKwkgIENsZWFuIHVwIGNhcHMgbmVnb3RpYXRpb24uCisJICBVc2UgdGhlIG1hcmtlciBiaXQgdG8gc2V0IHRoZSBESVNDT05UIGZsYWcgb24gb3V0Z29pbmcgYnVmZmVycy4KKwkgICogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuYzogKGdzdF9ydHBfZzcyOV9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX2c3MjlfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX2c3MjlfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5Lmg6CisJICBUaGUgc3ViY2xhc3Mgd2lsbCBtYWtlIHN1cmUgd2UgYXJlIG5lZ290aWF0ZWQuCisJICBVc2UgdGhlIG1hcmtlciBiaXQgdG8gc2V0IHRoZSBESVNDT05UIGZsYWcgb24gb3V0Z29pbmcgYnVmZmVycy4KKwkgICogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOiAoZ3N0X3J0cF9nc21fZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9nc21fZGVwYXlfcHJvY2Vzcyk6CisJICBDbGVhbiB1cCBjYXBzIG5lZ290aWF0aW9uLgorCSAgVXNlIHRoZSBtYXJrZXIgYml0IHRvIHNldCB0aGUgRElTQ09OVCBmbGFnIG9uIG91dGdvaW5nIGJ1ZmZlcnMuCisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6IChnc3RfcnRwX2dzbV9wYXlfc2V0Y2Fwcyk6CisJICBDbGVhbiB1cCBjYXBzIG5lZ290aWF0aW9uLgorCSAgRG9uJ3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2Ygc2V0X291dGNhcHMuCisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6IChnc3RfcnRwX2gyNjNfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9oMjYzX2RlcGF5X3Byb2Nlc3MpOgorCSAgQ2xlYW4gdXAgY2FwcyBuZWdvdGlhdGlvbi4KKwkgIE5vIG5lZWQgdG8gdmFsaWRhdGUgdGhlIGJ1ZmZlciwgdGhlIGJhc2UgY2xhc3MgZG9lcyB0aGF0IGZvciB1cy4KKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6IChnc3RfcnRwX2gyNjNfcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfaDI2M19wYXlfZmx1c2gpLCAoZ3N0X3J0cF9oMjYzX3BheV9oYW5kbGVfYnVmZmVyKToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGF5Lmg6CisJICBEb24ndCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBzZXRfb3V0Y2Fwcy4KKwkgIERvIHNvbWUgbW9yZSB0aW1lc3RhbXBzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzogKGdzdF9ydHBfaDI2M3BfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9oMjYzcF9kZXBheV9wcm9jZXNzKToKKwkgIENsZWFuIHVwIGNhcHMgbmVnb3RpYXRpb24uCisJICBEb24ndCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBzZXRjYXBzLgorCSAgTm8gbmVlZCB0byB2YWxpZGF0ZSB0aGUgYnVmZmVyLCB0aGUgYmFzZSBjbGFzcyBkb2VzIHRoYXQgZm9yIHVzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6IChnc3RfcnRwX2gyNjNwX3BheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX2gyNjNwX3BheV9zZXRjYXBzKSwgKGdzdF9ydHBfaDI2M3BfcGF5X2ZsdXNoKSwKKwkgIChnc3RfcnRwX2gyNjNwX3BheV9oYW5kbGVfYnVmZmVyKToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5oOgorCSAgRG9uJ3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2Ygc2V0X291dGNhcHMuCisJICBEbyBzb21lIG1vcmUgdGltZXN0YW1wcy4KKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzogKGdzdF9ydHBfaDI2NF9kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX2gyNjRfZGVwYXlfcHJvY2Vzcyk6CisJICBDbGVhbiB1cCBjYXBzIG5lZ290aWF0aW9uLgorCSAgRG9uJ3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2Ygc2V0Y2Fwcy4KKwkgIEZpeCBwb3NzaWJsZSBjYXBzIGxlYWsuCisJICBObyBuZWVkIHRvIHZhbGlkYXRlIHRoZSBidWZmZXIsIHRoZSBiYXNlIGNsYXNzIGRvZXMgdGhhdCBmb3IgdXMuCisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOiAoZ3N0X3J0cF9oMjY0X3BheV9zZXRjYXBzKToKKwkgIEFkZCBzb21lIG1vcmUgZGVidWcgaW5mby4KKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzogKGdzdF9ydHBfaWxiY19kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX2lsYmNfZGVwYXlfcHJvY2Vzcyk6CisJICBDbGVhbiB1cCBjYXBzIG5lZ290aWF0aW9uLgorCSAgVXNlIHRoZSBtYXJrZXIgYml0IHRvIHNldCB0aGUgRElTQ09OVCBmbGFnIG9uIG91dGdvaW5nIGJ1ZmZlcnMuCisJICAqIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOiAoZ3N0X3J0cGlsYmNwYXlfc2lua19zZXRjYXBzKToKKwkgIENsZWFuIHVwIGNhcHMgbmVnb3RpYXRpb24uCisJICAqIGdzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmM6IChnc3RfcnRwX21wMXNfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9tcDFzX2RlcGF5X3Byb2Nlc3MpOgorCSAgQ2xlYW4gdXAgY2FwcyBuZWdvdGlhdGlvbi4KKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldGNhcHMuCisJICBObyBuZWVkIHRvIHZhbGlkYXRlIHRoZSBidWZmZXIsIHRoZSBiYXNlIGNsYXNzIGRvZXMgdGhhdCBmb3IgdXMuCisJICBObyBuZWVkIHRvIHNldCBjYXBzIG9uIGJ1ZmZlcnMsIHN1YmNsYXNzIGRvZXMgdGhhdCBmb3IgdXMuCisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6IChnc3RfcnRwX21wMnRfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9tcDJ0X2RlcGF5X3Byb2Nlc3MpOgorCSAgQ2xlYW4gdXAgY2FwcyBuZWdvdGlhdGlvbi4KKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldGNhcHMuCisJICBObyBuZWVkIHRvIHZhbGlkYXRlIHRoZSBidWZmZXIsIHRoZSBiYXNlIGNsYXNzIGRvZXMgdGhhdCBmb3IgdXMuCisJICBObyBuZWVkIHRvIHNldCBjYXBzIG9uIGJ1ZmZlcnMsIHN1YmNsYXNzIGRvZXMgdGhhdCBmb3IgdXMuCisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6IChnc3RfcnRwX21wNGFfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9tcDRhX2RlcGF5X3Byb2Nlc3MpOgorCSAgQ2xlYW4gdXAgY2FwcyBuZWdvdGlhdGlvbi4KKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldGNhcHMuCisJICBObyBuZWVkIHRvIHZhbGlkYXRlIHRoZSBidWZmZXIsIHRoZSBiYXNlIGNsYXNzIGRvZXMgdGhhdCBmb3IgdXMuCisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5jOiAoZ3N0X3J0cF9tcDRhX3BheV9uZXdfY2FwcyksCisJICAoZ3N0X3J0cF9tcDRhX3BheV9zZXRjYXBzKToKKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldF9vdXRjYXBzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOiAoZ3N0X3J0cF9tcDRnX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfbXA0Z19kZXBheV9wcm9jZXNzKToKKwkgIENsZWFuIHVwIGNhcHMgbmVnb3RpYXRpb24uCisJICBEb24ndCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBzZXRjYXBzLgorCSAgTm8gbmVlZCB0byB2YWxpZGF0ZSB0aGUgYnVmZmVyLCB0aGUgYmFzZSBjbGFzcyBkb2VzIHRoYXQgZm9yIHVzLgorCSAgTm8gbmVlZCB0byBzZXQgY2FwcyBvbiBidWZmZXJzLCBzdWJjbGFzcyBkb2VzIHRoYXQgZm9yIHVzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzogKGdzdF9ydHBfbXA0Z19wYXlfZmluYWxpemUpLAorCSAgKGdzdF9ydHBfbXA0Z19wYXlfbmV3X2NhcHMpLCAoZ3N0X3J0cF9tcDRnX3BheV9zZXRjYXBzKToKKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldF9vdXRjYXBzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOiAoZ3N0X3J0cF9tcDR2X2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfbXA0dl9kZXBheV9wcm9jZXNzKToKKwkgIENsZWFuIHVwIGNhcHMgbmVnb3RpYXRpb24uCisJICBEb24ndCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBzZXRjYXBzLgorCSAgTm8gbmVlZCB0byB2YWxpZGF0ZSB0aGUgYnVmZmVyLCB0aGUgYmFzZSBjbGFzcyBkb2VzIHRoYXQgZm9yIHVzLgorCSAgTm8gbmVlZCB0byBzZXQgY2FwcyBvbiBidWZmZXJzLCBzdWJjbGFzcyBkb2VzIHRoYXQgZm9yIHVzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzogKGdzdF9ydHBfbXA0dl9wYXlfbmV3X2NhcHMpLAorCSAgKGdzdF9ydHBfbXA0dl9wYXlfc2V0Y2Fwcyk6CisJICBEb24ndCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBzZXRfb3V0Y2Fwcy4KKwkgICogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOiAoZ3N0X3J0cF9tcGFfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9tcGFfZGVwYXlfcHJvY2Vzcyk6CisJICBDbGVhbiB1cCBjYXBzIG5lZ290aWF0aW9uLgorCSAgRG9uJ3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2Ygc2V0Y2Fwcy4KKwkgIE5vIG5lZWQgdG8gdmFsaWRhdGUgdGhlIGJ1ZmZlciwgdGhlIGJhc2UgY2xhc3MgZG9lcyB0aGF0IGZvciB1cy4KKwkgIFVzZSB0aGUgbWFya2VyIGJpdCB0byBzZXQgdGhlIERJU0NPTlQgZmxhZyBvbiBvdXRnb2luZyBidWZmZXJzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOiAoZ3N0X3J0cF9tcGFfcGF5X3NldGNhcHMpOgorCSAgRG9uJ3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2Ygc2V0X291dGNhcHMuCisJICAqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzogKGdzdF9ydHBfbXB2X2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfbXB2X2RlcGF5X3Byb2Nlc3MpOgorCSAgQ2xlYW4gdXAgY2FwcyBuZWdvdGlhdGlvbi4KKwkgIEFjdHVhbGx5IHNldCBvdXRwdXQgY2Fwcy4KKwkgIE5vIG5lZWQgdG8gdmFsaWRhdGUgdGhlIGJ1ZmZlciwgdGhlIGJhc2UgY2xhc3MgZG9lcyB0aGF0IGZvciB1cy4KKwkgICogZ3N0L3J0cC9nc3RydHBtcHZwYXkuYzogKGdzdF9ydHBfbXB2X3BheV9zZXRjYXBzKToKKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldF9vdXRjYXBzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jOiAoZ3N0X3J0cF9wY21hX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfcGNtYV9kZXBheV9wcm9jZXNzKToKKwkgIENsZWFuIHVwIGNhcHMgbmVnb3RpYXRpb24uCisJICBTZXQgb3V0cHV0IGJ1ZmZlciBkdXJhdGlvbiBiZWNhdXNlIHdlIGNhbi4KKwkgIFVzZSB0aGUgbWFya2VyIGJpdCB0byBzZXQgdGhlIERJU0NPTlQgZmxhZyBvbiBvdXRnb2luZyBidWZmZXJzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYzogKGdzdF9ydHBfcGNtYV9wYXlfc2V0Y2Fwcyk6CisJICBEb24ndCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBzZXRfb3V0Y2Fwcy4KKwkgICogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzogKGdzdF9ydHBfcGNtdV9kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX3BjbXVfZGVwYXlfcHJvY2Vzcyk6CisJICBDbGVhbiB1cCBjYXBzIG5lZ290aWF0aW9uLgorCSAgVXNlIHRoZSBtYXJrZXIgYml0IHRvIHNldCB0aGUgRElTQ09OVCBmbGFnIG9uIG91dGdvaW5nIGJ1ZmZlcnMuCisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOiAoZ3N0X3J0cF9wY211X3BheV9zZXRjYXBzKToKKwkgIERvbid0IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHNldF9vdXRjYXBzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzogKGdzdF9ydHBfc3BlZXhfZGVwYXlfaW5pdCksCisJICAoZ3N0X3J0cF9zcGVleF9kZXBheV9zZXRjYXBzKSwgKGdzdF9ydHBfc3BlZXhfZGVwYXlfcHJvY2Vzcyk6CisJICBDbGVhbiB1cCBjYXBzIG5lZ290aWF0aW9uLgorCSAgU2V0IG91dHB1dCBjYXBzIG9uIHRoZSBwYWQgYW5kIGhlYWRlciBidWZmZXJzLgorCSAgU2V0IGR1cmF0aW9uIG9uIG91dHB1dCBidWZmZXJzIGJlY2F1c2Ugd2UgY2FuLgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6IChnc3RfcnRwX3NwZWV4X3BheV9wYXJzZV9pZGVudCk6CisJICBEb24ndCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBzZXRfb3V0Y2Fwcy4KKwkgICogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzogKGdzdF9ydHBfc3Yzdl9kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX3N2M3ZfZGVwYXlfcHJvY2Vzcyk6CisJICBDbGVhbiB1cCBjYXBzIG5lZ290aWF0aW9uLgorCSAgTm8gbmVlZCB0byB2YWxpZGF0ZSB0aGUgYnVmZmVyLCB0aGUgYmFzZSBjbGFzcyBkb2VzIHRoYXQgZm9yIHVzLgorCSAgTm8gbmVlZCB0byBzZXQgY2FwcyBvdXQgb3V0cHV0IGJ1ZmZlcnMsIHN1YmNsYXNzIGRvZXMgdGhhdC4KKwkgICogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOiAoZ3N0X3J0cF90aGVvcmFfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF90aGVvcmFfZGVwYXlfcHJvY2Vzcyk6CisJICBEb24ndCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBzZXRjYXBzLgorCSAgTm8gbmVlZCB0byB2YWxpZGF0ZSB0aGUgYnVmZmVyLCB0aGUgYmFzZSBjbGFzcyBkb2VzIHRoYXQgZm9yIHVzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOiAoZ3N0X3J0cF90aGVvcmFfcGF5X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfdGhlb3JhX3BheV9mbHVzaF9wYWNrZXQpLCAoZW5jb2RlX2Jhc2U2NCksCisJICAoZ3N0X3J0cF90aGVvcmFfcGF5X2ZpbmlzaF9oZWFkZXJzKSwgKGdzdF9ydHBfdGhlb3JhX3BheV9wYXJzZV9pZCksCisJICAoZ3N0X3J0cF90aGVvcmFfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgRG9uJ3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2Ygc2V0X291dGNhcHMuCisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzogKGdzdF9ydHBfdm9yYmlzX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfdm9yYmlzX2RlcGF5X3Byb2Nlc3MpOgorCSAgRG9uJ3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2Ygc2V0Y2Fwcy4KKwkgIE5vIG5lZWQgdG8gdmFsaWRhdGUgdGhlIGJ1ZmZlciwgdGhlIGJhc2UgY2xhc3MgZG9lcyB0aGF0IGZvciB1cy4KKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzogKGdzdF9ydHBfdm9yYmlzX3BheV9maW5pc2hfaGVhZGVycyk6CisJICBEb24ndCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBzZXRfb3V0Y2Fwcy4KKwkgICogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzogKGdzdF9ydHBfdnJhd19kZXBheV9zZXRjYXBzKToKKwkgIENsZWFuIHVwIGNhcHMgbmVnb3RpYXRpb24sIGRvbid0IGlnbm9yZSBzZXRjYXBzIHJldHVybi4KKwkgICogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6IChnc3RfcnRwX3ZyYXdfcGF5X3NldGNhcHMpOgorCSAgRG9uJ3QgaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2Ygc2V0X291dGNhcHMuCisKKzIwMDgtMTAtMjcgMTA6MzU6MDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBGb3J3YXJkIHVua25vd24gZXZlbnRzIHVwc3RyZWFtLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc3JjX2V2ZW50KToKKwkgIEZvcndhcmQgdW5rbm93biBldmVudHMgdXBzdHJlYW0uCisKKzIwMDgtMTAtMjcgMTA6MzM6MjAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ljeWRlbXV4LmM6IEFkZCBzb21lIHJlZmNvdW50IGNoZWNrCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYzogKGljeWRlbXV4X2ZvdW5kX3BhZCk6CisJICBBZGQgc29tZSByZWZjb3VudCBjaGVjaworCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOiAocnRwX3BpcGVsaW5lX3J1bik6CisJICBEb24ndCBpZ25vcmUgdGhlIHJlc3VsdCBvZiB3cml0ZSgpLCBmaXhlcyBhICBjb21waWxlciB3YXJuaW5nIGZvciBtZS4KKwkgICogdGVzdHMvaWNsZXMvdmlkZW9ib3gtdGVzdC5jOiAobWFpbik6CisJICBNYWtlIHRoZSBvdXRwdXQgYSBsaXR0bGUgbW9yZSBwcmV0dHkuCisKKzIwMDgtMTAtMjcgMDk6MjY6MTkgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZXh0L2VzZC9lc2Rtb24uYzogQWRkIGRvYyBibG9iLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkbW9uLmM6CisJICBBZGQgZG9jIGJsb2IuCisKKzIwMDgtMTAtMjcgMDk6MjE6NDQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogQWRkIHRoZSBkb2NzIG9mIHRoZSBuZXcgZWxlbWVudHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSAgQWRkIHRoZSBkb2NzIG9mIHRoZSBuZXcgZWxlbWVudHMuCisKKzIwMDgtMTAtMjcgMDk6MDQ6MzcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2F1dG9kZXRlY3QvOiBGaXggIlNpbmNlIiB0YWdzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5jOgorCSAgKGdzdF9hdXRvX2F1ZGlvX3NyY19jbGFzc19pbml0KToKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc3JjLmM6CisJICAoZ3N0X2F1dG9fdmlkZW9fc3JjX2NsYXNzX2luaXQpOgorCSAgRml4ICJTaW5jZSIgdGFncyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworMjAwOC0xMC0yNyAwOTowMDoyOSArMDAwMCAgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorCisJICBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOiBBZGQgc3VwcG9ydCBmb3Igc291cGh0dHBzcmMgdG8gYWN0IGFzIGEgbGl2ZSBzb3VyY2UuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gZ2V0IHRpbWVzdGEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFNqb2VyZCBTaW1vbnMgPHNqb2VyZCBhdCBsdW9uIGRvdCBuZXQ+CisJICAqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IChnc3Rfc291cF9odHRwX3NyY19jbGFzc19pbml0KSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfZ2V0X3Byb3BlcnR5KToKKwkgIEFkZCBzdXBwb3J0IGZvciBzb3VwaHR0cHNyYyB0byBhY3QgYXMgYSBsaXZlIHNvdXJjZS4gVGhpcyBtYWtlcyBpdAorCSAgcG9zc2libGUgdG8gZ2V0IHRpbWVzdGFtcGVkIGJ1ZmZlcnMgaW4gY29tYmluYXRpb24gd2l0aCB0aGUKKwkgICJkby10aW1lc3RhbXAiIHByb3BlcnR5LiBGaXhlcyBidWcgIzU1NjAxOS4KKworMjAwOC0xMC0yNyAwODo1NDozMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXV0b2RldGVjdC86IEltcGxlbWVudCBzcmMgcGx1Z2lucy4gTGl0dGxlIGNvZGUvc3RyaW5nIGNsZWFudXAgaW4gdGhlIHNpbmtzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5jOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuaDoKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2RldGVjdC5jOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuaDoKKwkgIEltcGxlbWVudCBzcmMgcGx1Z2lucy4gTGl0dGxlIGNvZGUvc3RyaW5nIGNsZWFudXAgaW4gdGhlIHNpbmtzLgorCSAgRml4ZXMgIzUyMzgxMy4KKworMjAwOC0xMC0yNyAwODo0NToxMSArMDAwMCAgUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2pAYXhpcy5jb20+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogRml4IGEgbWVtb3J5IGxlYWsgd2hlbiBwYWRzIGFyZSByZXF1ZXN0ZWQgYnV0IHRoZSBwaXBlbGluZSBuZXZlciBnb2VzIGludG8gUExBWUlORy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqIGF0IGF4aXMgY29tPgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X3Jlc2V0KSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3JlcXVlc3RfbmV3X3BhZCksIChnc3RfbWF0cm9za2FfbXV4X3JlbGVhc2VfcGFkKToKKwkgIEZpeCBhIG1lbW9yeSBsZWFrIHdoZW4gcGFkcyBhcmUgcmVxdWVzdGVkIGJ1dCB0aGUgcGlwZWxpbmUgbmV2ZXIKKwkgIGdvZXMgaW50byBQTEFZSU5HLgorCSAgQ29ycmVjdGx5IHJlbW92ZSByZXF1ZXN0IHBhZHMsIG5vIG1hdHRlciBpZiB0aGV5IGhhdmUgY29sbGVjdGVkCisJICBkYXRhIG9yIG5vdC4KKwkgIEZpeGVzIGJ1ZyAjNTU3NzEwLgorCisyMDA4LTEwLTI3IDA4OjQwOjAyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaDogRGVmaW5lIHRoZSBjb3JyZWN0IFdJTlZFUiBzbyBnZXRhZGRpbmZvKCkgY2FuIGJlIHVzZWQgd2hlbiB1c2luZyBtaW5ndzMyLiBGaXhlcyBidWcgIzU1NzI5NC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IDxscm4xOTg2IGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaDoKKwkgIERlZmluZSB0aGUgY29ycmVjdCBXSU5WRVIgc28gZ2V0YWRkaW5mbygpIGNhbiBiZSB1c2VkIHdoZW4gdXNpbmcKKwkgIG1pbmd3MzIuIEZpeGVzIGJ1ZyAjNTU3Mjk0LgorCisyMDA4LTEwLTI3IDA4OjM2OjQzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC91ZHAvOiBGaXggImFyZ3VtZW50IHR5cGUgbWlzbWF0Y2giIGNvbXBpbGVyIHdhcm5pbmdzIG9uIFdpbmRvd3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiA8bHJuMTk4NiBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzogKGdzdF9keW51ZHBzaW5rX3JlbmRlcik6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChnc3RfbXVsdGl1ZHBzaW5rX3JlbmRlcik6CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2NyZWF0ZSk6CisJICBGaXggImFyZ3VtZW50IHR5cGUgbWlzbWF0Y2giIGNvbXBpbGVyIHdhcm5pbmdzIG9uIFdpbmRvd3MuCisJICBGaXhlcyBidWcgIzU1NzI5My4KKworMjAwOC0xMC0yNyAwODozMDo1MSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiBEb24ndCBjYWxjdWxhdGUgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgZm9yIGV2ZXJ5IHNpbmdsZSBidWZmZXIgYnV0IG9ubHkgd2hlbiBpdCdzIG4uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiAodXBkYXRlX2NvZWZmaWNpZW50cyk6CisJICBEb24ndCBjYWxjdWxhdGUgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgZm9yIGV2ZXJ5IHNpbmdsZSBidWZmZXIKKwkgIGJ1dCBvbmx5IHdoZW4gaXQncyBuZWVkZWQuIEZpeGVzIGJ1ZyAjNTU3MjYwLgorCisyMDA4LTEwLTI2IDIwOjA1OjQzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBCYWNrIHRvIGRldmVsb3BtZW50IC0+IDAuMTAuMTEuMQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQgLT4gMC4xMC4xMS4xCisKKzIwMDgtMTAtMjYgMjA6MDQ6MjEgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QtcGx1Z2lucy1nb29kLmRvYXA6IEZpeCB2ZXJzaW9uIG51bWJlciBvZiAwLjEwLjExIHJlbGVhc2UgaW4gZG9hcCBmaWxlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSAgRml4IHZlcnNpb24gbnVtYmVyIG9mIDAuMTAuMTEgcmVsZWFzZSBpbiBkb2FwIGZpbGUKKworPT09IHJlbGVhc2UgMC4xMC4xMSA9PT0KKworMjAwOC0xMC0yNCAyMjo0MToxOCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTAuMTEKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmVsZWFzZSAwLjEwLjExCisKKzIwMDgtMTAtMjQgMjI6MjA6NDcgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jYS5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZGEucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2VzLnBvOgorCSogcG8vZXUucG86CisJKiBwby9maS5wbzoKKwkqIHBvL2ZyLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pZC5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA4LTEwLTI0IDE2OjMwOjUzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBDb21taXQgMC4xMC4xMC40IHByZS1yZWxlYXNlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQ29tbWl0IDAuMTAuMTAuNCBwcmUtcmVsZWFzZQorCisyMDA4LTEwLTIxIDEyOjQyOjQ1ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguYzogRml4IFZQUlAgY2h1bmsgc2V0dXAgaW4gYXZpbXV4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBGaXggVlBSUCBjaHVuayBzZXR1cCBpbiBhdmltdXguCisJICBGaXhlczogIzU1NjAxMAorCSAgUGF0Y2ggQnk6IE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisyMDA4LTEwLTIxIDEyOjM4OjM1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorCisJICBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogc3VwcG9ydCBkeW5hbWljYWxseSBjaGFuZ2luZyBwcm9wZXJ0aWVzIGluIHZpZGVvYm94CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICBzdXBwb3J0IGR5bmFtaWNhbGx5IGNoYW5naW5nIHByb3BlcnRpZXMgaW4gdmlkZW9ib3gKKwkgIEZpeGVkOiAjNTU3MDg1CisJICBQYXRjaCBCeTogV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNvbGxhYm9yYS5jby51az4KKworMjAwOC0xMC0xNiAxNzoxMDo0MiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogMC4xMC4xMC4zIHByZS1yZWxlYXNlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgMC4xMC4xMC4zIHByZS1yZWxlYXNlCisKKzIwMDgtMTAtMTYgMTU6MzA6MjIgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogRG9uJ3QgcnVuIHRoZSBzdGF0ZXMgdGVzdCBvbiBwdWxzZXNyYyBhbmQgcHVsc2VzaW5rCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBEb24ndCBydW4gdGhlIHN0YXRlcyB0ZXN0IG9uIHB1bHNlc3JjIGFuZCBwdWxzZXNpbmsKKworMjAwOC0xMC0xNiAxMTo1Mjo0NCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogQ29tbWl0IDAuMTAuMTAuMiBwcmUtcmVsZWFzZSBidW1wIHRoYXQgYWN0dWFsbHkgd2VudCBvdXQgb24gMjAwOC0xMC0xMQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIENvbW1pdCAwLjEwLjEwLjIgcHJlLXJlbGVhc2UgYnVtcCB0aGF0IGFjdHVhbGx5IHdlbnQKKwkgIG91dCBvbiAyMDA4LTEwLTExCisKKzIwMDgtMTAtMTUgMTU6NDI6MjkgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogU2tpcCBlbnRyaWVzIGZvciBzdHJlYW1zIHRoYXQgZG9uJ3QgaGF2ZSBhIG91dHB1dCBwYWQgeWV0LCB0aGVyZWJ5IGF2b2lkaW5nIGNhbGxpbmcgcGFkIGZ1bmN0aS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3RyZWFtX3NjYW4pOgorCSAgU2tpcCBlbnRyaWVzIGZvciBzdHJlYW1zIHRoYXQgZG9uJ3QgaGF2ZSBhIG91dHB1dCBwYWQgeWV0LCB0aGVyZWJ5CisJICBhdm9pZGluZyBjYWxsaW5nIHBhZCBmdW5jdGlvbnMgd2l0aCBhIE5VTEwgcGFkLgorCSAgRml4ZXMgIzU1NjQyNAorCisyMDA4LTEwLTE1IDA5OjM5OjI3ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFJlbW92ZSBwcmV2aW91cyB3cm9uZyBjb21taXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFJlbW92ZSBwcmV2aW91cyB3cm9uZyBjb21taXQKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYzogKGljeWRlbXV4X2ZvdW5kX3BhZCk6CisJICBSZW1vdmUgcHJvYmxlbWF0aWMgYW5kIHVzZWxlc3MgcmVmY291bnQgY2hlY2suCisJICBGaXhlcyAjNTU2MzgxCisKKzIwMDgtMTAtMTUgMDk6Mjc6MjcgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogUmVtb3ZlIHByb2JsZW1hdGljIGFuZCB1c2VsZXNzIHJlZmNvdW50IGNoZWNrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2Vfbm9kZSk6CisJICBSZW1vdmUgcHJvYmxlbWF0aWMgYW5kIHVzZWxlc3MgcmVmY291bnQgY2hlY2suCisJICBGaXhlcyAjNTU2MzgxCisKKzIwMDgtMTAtMTAgMTI6Mjg6MzQgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBleHQvZmxhYy86IENhc3Qgc29tZSBzaXplX3QgYXJndW1lbnRzIHRvIGd1aW50IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzIG9uIDY0LWJpdCBzeXN0ZW1zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYyAoZ3N0X2ZsYWNfZGVjX3JlYWRfc3RyZWFtKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jIChnc3RfZmxhY19lbmNfd3JpdGVfY2FsbGJhY2spOgorCSAgQ2FzdCBzb21lIHNpemVfdCBhcmd1bWVudHMgdG8gZ3VpbnQgdG8gYXZvaWQgY29tcGlsZXIKKwkgIHdhcm5pbmdzIG9uIDY0LWJpdCBzeXN0ZW1zLgorCisyMDA4LTEwLTA5IDE0OjI3OjEyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IFJldHVybiBUUlVFIGluc3RlYWQgb2YgRkFMU0UgZnJvbSB0aGUgZXZlbnQgaGFuZGxlciB3aGVuIHdlIHN3YWxsb3dlZCB0aGUgZXZlbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfaGFuZGxlX3NyY19ldmVudCk6CisJICBSZXR1cm4gVFJVRSBpbnN0ZWFkIG9mIEZBTFNFIGZyb20gdGhlIGV2ZW50IGhhbmRsZXIgd2hlbiB3ZSBzd2FsbG93ZWQgdGhlCisJICBldmVudC4KKworMjAwOC0xMC0wOCAxNTo1OTo1NiArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICByZW1vdmUgb2xkIENESU8gcGx1Z2luIG5vdyBpbiB1Z2x5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbW92ZSBvbGQgQ0RJTyBwbHVnaW4gbm93IGluIHVnbHkKKworMjAwOC0xMC0wOCAxNDo0NzoxNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBSZXNldCBoZWFkZXIgc3RhdGUuIEZpeGVzICM1NTUzMjEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9yZXNldCksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdWJpbmRleCksIChnc3RfYXZpX2RlbXV4X3BhcnNlX2luZGV4KToKKwkgIFJlc2V0IGhlYWRlciBzdGF0ZS4gRml4ZXMgIzU1NTMyMS4KKworMjAwOC0xMC0wOCAxMzozMTo0NCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC4qOiBGb3IgdGltZXN0YW1waW5nIGF1ZGlvIHBhY2tldHMgd2UgbmVlZCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgYW1vdW50IG9mIGJsb2NrcyBpbiBvbmUgZW50cnkgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdWJpbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0pLCAoZ3N0X2F2aV9kZW11eF9wYXJzZV9pbmRleCk6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIEZvciB0aW1lc3RhbXBpbmcgYXVkaW8gcGFja2V0cyB3ZSBuZWVkIHRvIHRha2UgaW50byBhY2NvdW50IHRoZQorCSAgYW1vdW50IG9mIGJsb2NrcyBpbiBvbmUgZW50cnkgdXNpbmcgdGhlIGJsb2NrYWxpZ24uIEZpeGVzIHNvbWUgc3luYworCSAgaXNzdWVzIHdpdGggemVyby1wYWRkZWQgYXVkaW8gYmxvY2tzIGluIHRoZSBiZWdpbm5pbmcgb2YgYXZpIGZpbGVzLgorCisyMDA4LTEwLTA4IDEwOjQyOjI2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOiBJbXBsZW1lbnQgREVGQVVMVCBhbmQgQlVGRkVSIHBvc2l0aW9uIHF1ZXJpZXMuIFNlZSAjNTU1MjYwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6IChnc3RfbXVsdGlfZmlsZV9zcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X211bHRpX2ZpbGVfc3JjX3F1ZXJ5KToKKwkgIEltcGxlbWVudCBERUZBVUxUIGFuZCBCVUZGRVIgcG9zaXRpb24gcXVlcmllcy4gU2VlICM1NTUyNjAuCisKKzIwMDgtMTAtMDggMDk6Mjk6MDAgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6IEZpeCBidWlsZCBmb3Igc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgWERhbWFnZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiAoZ3N0X3hpbWFnZV9zcmNfc3RvcCk6CisJICBGaXggYnVpbGQgZm9yIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIFhEYW1hZ2UuCisKKzIwMDgtMTAtMDcgMDk6NTg6MTMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHRlc3RzL2V4YW1wbGVzL3J0cC86IEFkZCBzb21lIG1vcmUgSDI2M3Agc2VydmVyIGFuZCBjbGllbnQgZXhhbXBsZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC5zZHA6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3Auc2g6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItVlRTLUgyNjNwLnNoOgorCSAgQWRkIHNvbWUgbW9yZSBIMjYzcCBzZXJ2ZXIgYW5kIGNsaWVudCBleGFtcGxlcy4KKworMjAwOC0xMC0wMyAxNzowMzowNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBEZXBlbmQgb24gcmVsZWFzZWQgdmVyc2lvbnMgb2YgY29yZSBhbmQgYmFzZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6OgorCSAgRGVwZW5kIG9uIHJlbGVhc2VkIHZlcnNpb25zIG9mIGNvcmUgYW5kIGJhc2UuCisKKzIwMDgtMTAtMDMgMTY6MTM6MzIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9wdWxzZS86IFJldHVybiAtMSBpbnN0ZWFkIG9mIDAgaW4gZXJyb3IgY2FzZXMuIEZpeGVzICM1NTQ3NzEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3B1bHNlL3B1bHNlc2luay5jOiAoZ3N0X3B1bHNlc2lua193cml0ZSk6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOiAoZ3N0X3B1bHNlc3JjX3JlYWQpOgorCSAgUmV0dXJuIC0xIGluc3RlYWQgb2YgMCBpbiBlcnJvciBjYXNlcy4gRml4ZXMgIzU1NDc3MS4KKworMjAwOC0xMC0wMyAxNTo1NDowNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzogU3RvcCBsZWFraW5nIHRoZSBjdXJzb3IgaW1hZ2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzogKGdzdF94aW1hZ2Vfc3JjX3N0YXJ0KSwKKwkgIChnc3RfeGltYWdlX3NyY19zdG9wKSwgKGdzdF94aW1hZ2Vfc3JjX3hpbWFnZV9nZXQpOgorCSAgU3RvcCBsZWFraW5nIHRoZSBjdXJzb3IgaW1hZ2UuCisJICBVbnJlZiB0aGUgbGFzdF94aW1hZ2UgYW5kIHRoZSBjYWNoZWQgY3Vyc29yIGltYWdlIG9uIHNodXRkb3duLgorCSAgRml4ZXMgIzU1MTU3MC4KKworMjAwOC0xMC0wMyAxMTozMjo0NyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOiBHZXR0aW5nIHRoZSBDbGFzcyBmcm9tIGFuIGluc3RhbmNlIGlzIG5vdCBqdXN0IGEgbWF0dGVyIG9mIGNhc3RpbmcgaXQgdG8gdGhlIGNsYXNzIHN0cnVjdCBiLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgR2V0dGluZyB0aGUgQ2xhc3MgZnJvbSBhbiBpbnN0YW5jZSBpcyBub3QganVzdCBhIG1hdHRlciBvZiBjYXN0aW5nIGl0IHRvCisJICB0aGUgY2xhc3Mgc3RydWN0IGJ1dCBpdCBpbnZvbHZlcyBjYWxsaW5nIEdfT0JKRUNUX0dFVF9DTEFTUyBvbiB0aGUKKwkgIGluc3RhbmNlLiBGaXhlcyAjNTQ5Nzg0LgorCisyMDA4LTEwLTAxIDIxOjIyOjI2ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIGNvbmZpZ3VyZS5hYzogRml4IGxpYnMgZm9yIGxpbmtpbmcgZGlyZWN0c291bmQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgRml4IGxpYnMgZm9yIGxpbmtpbmcgZGlyZWN0c291bmQuCisJICAqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIEZpeCBidWZmZXIgc2l6aW5nIHRvIHByZXZlbnQgcmFjaW5nIHRoZSByaW5nYnVmZmVyIGF0IHN0YXJ0dXAuCisJICBBZGQgdm9sdW1lIHByb3BlcnR5LgorCisyMDA4LTA5LTI3IDAwOjQzOjA3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZXh0L3B1bHNlL3B1bHNlc2luay5jOiBGaXggcHJvYmxlbXMgd2l0aCBwdWxzZXNpbmsgcmFuZG9tbHkgZXJyb3Jpbmcgd2l0aCBjb2RlICdPSycgYWZ0ZXIgYSBmb3JtYXQgY2hhbmdlIG9uIHRoZSBzdHJlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3B1bHNlL3B1bHNlc2luay5jOgorCSAgRml4IHByb2JsZW1zIHdpdGggcHVsc2VzaW5rIHJhbmRvbWx5IGVycm9yaW5nIHdpdGggY29kZSAnT0snIGFmdGVyIGEKKwkgIGZvcm1hdCBjaGFuZ2Ugb24gdGhlIHN0cmVhbSBieSB3YWl0aW5nIHdoZW4gZGlzY29ubmVjdGluZyB0aGUgc3RyZWFtLgorCisyMDA4LTA5LTI2IDE0OjQ0OjQ5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6IE1hcmsgRElTQ09OVCBvbiBvdXRwdXQgYnVmZmVycyB3aGVuIHRoZSBtYXJrZXIgYml0IHNpZ25hbHMgYSBuZXcgdGFsayBzcHVydC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6IChnc3RfcnRwX2Ftcl9kZXBheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX2Ftcl9kZXBheV9wcm9jZXNzKToKKwkgIE1hcmsgRElTQ09OVCBvbiBvdXRwdXQgYnVmZmVycyB3aGVuIHRoZSBtYXJrZXIgYml0IHNpZ25hbHMgYSBuZXcgdGFsaworCSAgc3B1cnQuCisJICAqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6IChnc3RfcnRwX2Ftcl9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICBTZXQgdGhlIG1hcmtlciBiaXQgZm9yIGJ1ZmZlcnMgd2l0aCBhIERJU0NPTlQgZmxhZyB0byBzaWduYWwgYSB0YWxrCisJICBzcHVydC4KKworMjAwOC0wOS0yNiAxMzo1NTo0OCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEFkZGVkIE1QNEEtTEFUTSBwYXlsb2FkZXIgdG8gbWF0Y2ggdGhlIGRlcGF5bG9hZGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHAvZ3N0cnRwLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5jOiAoZ3N0X3J0cF9tcDRhX3BheV9nZXRfdHlwZSksCisJICAoZ3N0X3J0cF9tcDRhX3BheV9iYXNlX2luaXQpLCAoZ3N0X3J0cF9tcDRhX3BheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX21wNGFfcGF5X2luaXQpLCAoZ3N0X3J0cF9tcDRhX3BheV9maW5hbGl6ZSksCisJICAoZ3N0X3J0cF9tcDRhX3BheV9wYXJzZV9hdWRpb19jb25maWcpLCAoZ3N0X3J0cF9tcDRhX3BheV9uZXdfY2FwcyksCisJICAoZ3N0X3J0cF9tcDRhX3BheV9zZXRjYXBzKSwgKGdzdF9ydHBfbXA0YV9wYXlfaGFuZGxlX2J1ZmZlciksCisJICAoZ3N0X3J0cF9tcDRhX3BheV9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3J0cF9tcDRhX3BheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YXBheS5oOgorCSAgQWRkZWQgTVA0QS1MQVRNIHBheWxvYWRlciB0byBtYXRjaCB0aGUgZGVwYXlsb2FkZXIuCisKKzIwMDgtMDktMjUgMTU6MTE6MTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogSGFuZGxlIHNlZ21lbnRzIGEgbGl0dGxlIGJldHRlci4gRml4ZXMgIzUzNzM2MS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IChnc3RfdmlkZW9taXhlcl9maWxsX3F1ZXVlcyksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfc2lua19ldmVudCk6CisJICBIYW5kbGUgc2VnbWVudHMgYSBsaXR0bGUgYmV0dGVyLiBGaXhlcyAjNTM3MzYxLgorCisyMDA4LTA5LTI1IDEyOjA3OjQ2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IERvbid0IGFzc3VtZSB0aGUgc2VydmVyIHN1cHBvcnRzIFBBVVNFIGJ5IGRlZmF1bHQuIEZpeGVzICM1NTEwNDguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfcGFyc2VfbWV0aG9kcyk6CisJICBEb24ndCBhc3N1bWUgdGhlIHNlcnZlciBzdXBwb3J0cyBQQVVTRSBieSBkZWZhdWx0LiBGaXhlcyAjNTUxMDQ4LgorCisyMDA4LTA5LTI1IDExOjMwOjM1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy5jOiBTd2l0Y2ggb24gdGhlIHNvY2tldCBmYW1pbHkgdG8gZ2V0IHRoZSBhZGRybGVuIHNpemUgcmlnaHQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3VkcHNyY19zZXRfdXJpKSwgKGdzdF91ZHBzcmNfc3RhcnQpOgorCSAgU3dpdGNoIG9uIHRoZSBzb2NrZXQgZmFtaWx5IHRvIGdldCB0aGUgYWRkcmxlbiBzaXplIHJpZ2h0LgorCisyMDA4LTA5LTI1IDEwOjM0OjM5ICswMDAwICBEYW5pZWwgRnJhbmtlIDxkZkBkZnJhbmtlLnVzPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy5jOiBPUyBYJ3MgYmluZCgpIGltcGxlbWVudGF0aW9uIGlzIHBpY2t5IGFib3V0IGl0cyBhZGRybGVuIHBhcmFtZXRlciBhbmQgZmFpbHMgd2l0aCBFSU5WQUwgaWYgaXQgaXMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IERhbmllbCBGcmFua2UgPGRmIGF0IGRmcmFua2UgZG90IHVzPgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jcmVhdGUpLCAoZ3N0X3VkcHNyY19zdGFydCk6CisJICBPUyBYJ3MgYmluZCgpIGltcGxlbWVudGF0aW9uIGlzIHBpY2t5IGFib3V0IGl0cyBhZGRybGVuIHBhcmFtZXRlciBhbmQKKwkgIGZhaWxzIHdpdGggRUlOVkFMIGlmIGl0IGlzIGxhcmdlciB0aGFuIGV4cGVjdGVkIGZvciB0aGUgc29ja2V0J3MgYWRkcmVzcworCSAgZmFtaWx5LiBTZXQgdGhlIGxlbmd0aCB0byB0aGUgZXhwZWN0ZWQgbGVuZ3RoIGluc3RlYWQuIEZpeGVzICM1NTMxOTEuCisKKzIwMDgtMDktMjMgMTg6MDg6NTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGNhbm5vdCBkbyBkZXNyaWJlIG9yIHdoZW4gdGhlIGRlc2NyaWJlIHJlc3VsdCBkb2VzIG5vdCBjb250YWluIGEgdmFsaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX29wZW4pOgorCSAgSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGNhbm5vdCBkbyBkZXNyaWJlIG9yIHdoZW4gdGhlIGRlc2NyaWJlIHJlc3VsdAorCSAgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIFNEUCBtZXNzYWdlLgorCisyMDA4LTA5LTIzIDE3OjMxOjIyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiBGaXggc2V0dGluZyB0aGUgcW9zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChnc3RfbXVsdGl1ZHBzaW5rX3NldF9wcm9wZXJ0eSk6CisJICBGaXggc2V0dGluZyB0aGUgcW9zLgorCisyMDA4LTA5LTE3IDE0OjUwOjQyICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFNvbWUgJ2Jyb2tlbicgZmlsZXMgb3V0IHRoZXJlIGhhdmUgYXRvbSBsZW5ndGhzIG9mIHplcm8uLi4gd2hpY2ggYmFzaWNhbGx5IHJlc3VsdHMgaW4gcXRkZW11eCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX3N0YXRlX2hlYWRlciksCisJICAoZ3N0X3F0ZGVtdXhfY2hhaW4pOgorCSAgU29tZSAnYnJva2VuJyBmaWxlcyBvdXQgdGhlcmUgaGF2ZSBhdG9tIGxlbmd0aHMgb2YgemVyby4uLgorCSAgd2hpY2ggYmFzaWNhbGx5IHJlc3VsdHMgaW4gcXRkZW11eCBjb25zdW1pbmcgdGhhdCBhdG9tIGFnYWluIGFuZCBhZ2FpbgorCSAgdW50aWwgdGhlICplbmQgb2YgbmlnaHQqICEKKwkgIERldGVjdCB0aGF0IGFuZCBlbWl0cyBhbiBhZGVxdWF0ZSBlbGVtZW50IGVycm9yIG1lc3NhZ2UuCisKKzIwMDgtMDktMTcgMTM6NDk6MDQgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvOiBGaXggYnVpbGQgZmxhZ3Mgb3JkZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ludGVybGVhdmUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tYXRyb3NrYS9NYWtlZmlsZS5hbToKKwkgIEZpeCBidWlsZCBmbGFncyBvcmRlci4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9hbXBsaWZ5LmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZHluYW1pYy5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2ludmVydC5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3Bhbm9yYW1hLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBGb3JtYXQgZml4ZXMuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOgorCSAgUHVsbCBpbiB1bmlzdGQuaAorCisyMDA4LTA5LTE1IDIxOjEwOjIzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS4qOiBIYW5kbGUgaW50ZXJsZWF2ZWQgc3RyZWFtcyBieSByZW9yZGVyaW5nIEFVIGluIGEgcXVldWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzogKGdzdF9ydHBfbXA0Z19kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX21wNGdfZGVwYXlfZmluYWxpemUpLCAoZ3N0X3J0cF9tcDRnX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfbXA0Z19kZXBheV9jbGVhcl9xdWV1ZSksIChnc3RfcnRwX21wNGdfZGVwYXlfZmx1c2hfcXVldWUpLAorCSAgKGdzdF9ydHBfbXA0Z19kZXBheV9xdWV1ZSksIChnc3RfcnRwX21wNGdfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF9tcDRnX2RlcGF5X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5Lmg6CisJICBIYW5kbGUgaW50ZXJsZWF2ZWQgc3RyZWFtcyBieSByZW9yZGVyaW5nIEFVIGluIGEgcXVldWUuCisKKzIwMDgtMDktMTUgMTY6MDQ6MjYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6IENoYW5nZSBzb21lIG9mIHRoZSByYW5nZXMgaW4gdGhlIGNhcHMsIG1vc3RseSBmb3IgdGhlIGFtb3VudCBvZiBiaXRzIHdlIGNhbiB1c2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzogKGdzdF9ic19wYXJzZV9pbml0KSwKKwkgIChnc3RfYnNfcGFyc2VfcmVhZCksIChnc3RfcnRwX21wNGdfZGVwYXlfcHJvY2Vzcyk6CisJICBDaGFuZ2Ugc29tZSBvZiB0aGUgcmFuZ2VzIGluIHRoZSBjYXBzLCBtb3N0bHkgZm9yIHRoZSBhbW91bnQgb2YgYml0cyB3ZQorCSAgY2FuIHVzZS4KKwkgIEFkZGVkIGEgbGl0dGxlIGJpdHN0cmVhbSBwYXJzZSBhbmQgdXNlIGl0IHRvIHBhcnNlIHRoZSBBVSBoZWFkZXIgZmllbGRzLgorCSAgQ2hlY2sgZm9yIG1hbGZvcm1lZCBhbmQgd3JvbmdseSBzaXplZCBwYWNrZXRzIGJldHRlci4KKwkgIEltcGxlbWVudCBtb3JlIGhlYWRlciBmaWVsZCBwYXJzaW5nLgorCSAgSGFuZGxlIHRoZSBzaXplIG9mIGZyYWdtZW50ZWQgcGFja2V0cyBjb3JyZWN0bHkuCisKKzIwMDgtMDktMTQgMTE6MzI6MTUgKzAwMDAgIEpvbmF0aGFuIE1hdHRoZXcgPG5vdHZlcnlzbWFydEBnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQWRkIG1hcHBpbmcgZm9yICd0aWZmJyA9PiBpbWFnZS90aWZmCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBKb25hdGhhbiBNYXR0aGV3IDxub3R2ZXJ5c21hcnRAZ21haWwuY29tPgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3ZpZGVvX2NhcHMpOgorCSAgQWRkIG1hcHBpbmcgZm9yICd0aWZmJyA9PiBpbWFnZS90aWZmCisJICBGaXhlcyAjNTUyMjEzCisKKzIwMDgtMDktMTEgMTE6MjY6MDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9yYXcxMzk0LzogUHJldGVuZCB0byBjYXJlIGFib3V0IHRoZSByZXN1bHQgb2Ygd3JpdGUoKSB3aGljaCB3b3JrcyBhcm91bmQgY29tcGlsZXIgd2FybmluZ3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IChTRU5EX0NPTU1BTkQpOgorCSAgKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6IChTRU5EX0NPTU1BTkQpOgorCSAgUHJldGVuZCB0byBjYXJlIGFib3V0IHRoZSByZXN1bHQgb2Ygd3JpdGUoKSB3aGljaCB3b3JrcyBhcm91bmQKKwkgIGNvbXBpbGVyIHdhcm5pbmdzLgorCisyMDA4LTA5LTA0IDA5OjI1OjU5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IE1ha2Ugc3VyZSB0aGUgZGVzaXJlZCBkZWZhdWx0IHZhbHVlcyBhcmUgYWN0dWFsbHkgc2V0LCBub3Qgb25seSByZWdpc3RlcmVkIGFzIGRlZmF1bHRzIChhY3R1YWwuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY19lbmNfY2xhc3NfaW5pdCk6CisJICBNYWtlIHN1cmUgdGhlIGRlc2lyZWQgZGVmYXVsdCB2YWx1ZXMgYXJlIGFjdHVhbGx5IHNldCwgbm90IG9ubHkKKwkgIHJlZ2lzdGVyZWQgYXMgZGVmYXVsdHMgKGFjdHVhbCBwcm9ibGVtIGlzIHRoYXQgdGhlIHN0ZXJlby1zcGVjaWZpYworCSAgdmFsdWVzIGFyZSBvbmx5IHVwZGF0ZWQgaWYgY2hhbm5lbHM9PTIsIHdoaWNoIGlzIG5vdCB0aGUgY2FzZSB5ZXQKKwkgIHdoZW4gdGhlIG9iamVjdCBpcyBjcmVhdGVkLCBzbyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZQorCSAgbWlkLXNpZGUtc3RlcmVvIGFuZCBsb29zZS1taWQtc2lkZS1zdGVyZW8gc2V0dGluZ3MgYXJlIG5ldmVyCisJICBzZXQgaW4gX3VwZGF0ZV9xdWFsaXR5KCkpLiBNYWtlcyBmbGFjZW5jIGNyZWF0ZSBzbWFsbGVyIGZpbGVzIGJ5CisJICBkZWZhdWx0IChmb3Igc3RlcmVvIGlucHV0KSwgYW5kIGZpeGVzICM1NTA3OTEuCisKKzIwMDgtMDktMDMgMTI6Mzk6MzUgKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJICBnc3QvcXRkZW11eC86IEFkZCBzdXBwb3J0IGZvciB2aWRlby9tajIgbWltZS10eXBlIGFuZCBpdHMgYWRkaXRpb25hbCBhdG9tcy9ib3hlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfaGVhZGVyKSwgKHF0ZGVtdXhfcGFyc2Vfbm9kZSksCisJICAocXRkZW11eF9wYXJzZV90cmFrKSwgKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguaDoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eF90eXBlcy5jOgorCSAgQWRkIHN1cHBvcnQgZm9yIHZpZGVvL21qMiBtaW1lLXR5cGUgYW5kIGl0cyBhZGRpdGlvbmFsIGF0b21zL2JveGVzLgorCSAgRml4ZXMgIzU1MDY0Ni4KKworMjAwOC0wOS0wMyAxMToxMDoyNSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvZGVidWcvZ3N0dGFnaW5qZWN0LmM6IEFkZCB3YXJuaW5nIHdoZW4gdGFncyBwYXJhbWV0ZXIgaXMgdW5wYXJzYWJsZSBhbmQgZ2l2ZSBleGFtcGxlIGZvciBxdW90aW5nIGluIHRoZSBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWJ1Zy9nc3R0YWdpbmplY3QuYzoKKwkgIEFkZCB3YXJuaW5nIHdoZW4gdGFncyBwYXJhbWV0ZXIgaXMgdW5wYXJzYWJsZSBhbmQgZ2l2ZSBleGFtcGxlIGZvcgorCSAgcXVvdGluZyBpbiB0aGUgZG9jcy4KKworMjAwOC0wOS0wMiAxNToyNzo0OSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgbWFwcGluZyBmb3IgSU1BIExva2kgU0RMIE1KUEVHIEFEUENNIGNvZGVjLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfYXVkaW9fY2Fwcyk6CisJICBBZGQgbWFwcGluZyBmb3IgSU1BIExva2kgU0RMIE1KUEVHIEFEUENNIGNvZGVjLgorCSAgQWRkIHNvbWUgYWx0ZXJuYXRpdmUgYnl0ZXN3YXBwZWQgbWFwcGluZ3MgdGhhdCBzZWVtIHRvIHBvcCB1cCBzb21ldGltZXMuCisJICBGaXhlcyAjNTUwMjg4LgorCisyMDA4LTA5LTAyIDA5OjQwOjM4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBwby86IEFkZCAnY2EnIHRvIExJTkdVQVM7IGFkZCBzb21lIG1vcmUgZmlsZXMgd2l0aCB0cmFuc2xhdGlvbnMgYW5kIHNvbWUgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQgYnkgdHJhbnNsYXRpb24uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBwby9MSU5HVUFTOgorCSAgKiBwby9QT1RGSUxFUy5pbjoKKwkgICogcG8vUE9URklMRVMuc2tpcDoKKwkgIEFkZCAnY2EnIHRvIExJTkdVQVM7IGFkZCBzb21lIG1vcmUgZmlsZXMgd2l0aCB0cmFuc2xhdGlvbnMgYW5kIHNvbWUKKwkgIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkIGJ5IHRyYW5zbGF0aW9uIHRvb2xzLgorCisyMDA4LTA5LTAyIDA4OjUxOjA0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9zcGVleC86IFVzZSBpbnRlZ2VyIGVuY29kaW5nIGFuZCBkZWNvZGluZyBmdW5jdGlvbnMgaW5zdGVhZCBvZiBjb252ZXJ0aW5nIHRoZSBpbnRlZ2VyIGlucHV0IHRvIGZsb2F0IGluIHRoZSBlbGVtZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiAoc3BlZXhfZGVjX2NoYWluX3BhcnNlX2RhdGEpOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuaDoKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IChnc3Rfc3BlZXhfZW5jX2VuY29kZSk6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5oOgorCSAgVXNlIGludGVnZXIgZW5jb2RpbmcgYW5kIGRlY29kaW5nIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIGNvbnZlcnRpbmcKKwkgIHRoZSBpbnRlZ2VyIGlucHV0IHRvIGZsb2F0IGluIHRoZSBlbGVtZW50LiBUaGUgbGlic3BlZXggaW50ZWdlcgorCSAgZnVuY3Rpb25zIGFyZSBkb2luZyB0aGlzIGZvciB1cyBhbHJlYWR5IG9yLCBpZiBsaWJzcGVleCB3YXMgY29tcGlsZWQKKwkgIGluIGludGVnZXIgbW9kZSwgdGhleSdyZSBkb2luZyBldmVyeXRoaW5nIHVzaW5nIGludGVnZXIgYXJpdGhtZXRpY3MuCisJICBBbHNvIHNhdmVzIHNvbWUgY29weWluZyBhcm91bmQuCisKKzIwMDgtMDktMDEgMTM6Mjk6MjkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogRml4IC0tZGlzYWJsZS1leHRlcm5hbAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEZpeCAtLWRpc2FibGUtZXh0ZXJuYWwKKworMjAwOC0wOC0zMSAxNzowOToxOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLio6IEhhbmRsZSBub24temVybyBzdGFydCB0aW1lc3RhbXBzIGFuZCBzdHJlYW0gZGlzY29udGludWl0aWVzIGNvcnJlY3RseS4gVGhpcyBvbmx5IGhhcyBhbiAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfcmVzZXQpLAorCSAgKGdzdF93YXZwYWNrX2VuY19wdXNoX2Jsb2NrKSwgKGdzdF93YXZwYWNrX2VuY19jaGFpbik6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaDoKKwkgIEhhbmRsZSBub24temVybyBzdGFydCB0aW1lc3RhbXBzIGFuZCBzdHJlYW0gZGlzY29udGludWl0aWVzCisJICBjb3JyZWN0bHkuIFRoaXMgb25seSBoYXMgYW4gZWZmZWN0IGlmIHdlJ3JlIG11eGluZyBpbnRvCisJICBhIGNvbnRhaW5lciBmb3JtYXQgYXMgdGhlIHJhdyBXYXZQYWNrIHN0cmVhbSBtdXN0IGNvbnRhaW4KKwkgIGNvbnRpbm91cyBzYW1wbGUgbnVtYmVycy4KKworMjAwOC0wOC0zMSAxNTowMjowOSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogQ29ycmVjdCB0aGUgdGltZXN0YW1wIGFuZCBncmFudWxlcG9zIGNhbGN1bGF0aW9uIGJ5IG9uZSBTcGVleCBmcmFtZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleF9lbmNfZW5jb2RlKToKKwkgIENvcnJlY3QgdGhlIHRpbWVzdGFtcCBhbmQgZ3JhbnVsZXBvcyBjYWxjdWxhdGlvbiBieSBvbmUgU3BlZXgKKwkgIGZyYW1lLgorCisyMDA4LTA4LTMxIDE0OjM5OjU3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiBDb3JyZWN0bHkgdGFrZSB0aGUgZ3JhbnVsZXBvcyBmcm9tIHVwc3RyZWFtIGlmIHBvc3NpYmxlIGFuZCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBncmFudWxlcG9zIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiAoc3BlZXhfZGVjX2NoYWluX3BhcnNlX2RhdGEpOgorCSAgQ29ycmVjdGx5IHRha2UgdGhlIGdyYW51bGVwb3MgZnJvbSB1cHN0cmVhbSBpZiBwb3NzaWJsZSBhbmQKKwkgIGNvcnJlY3RseSBoYW5kbGUgdGhlIGdyYW51bGVwb3MgaW4gdmFyaW91cyBjYWxjdWxhdGlvbnM6IHRoZQorCSAgZ3JhbnVsZXBvcyBpcyB0aGUgc2FtcGxlIG51bWJlciBvZiB0aGUgX2xhc3RfIHNhbXBsZSBpbiBhIGZyYW1lLCBub3QKKwkgIHRoZSBmaXJzdC4KKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IChnc3Rfc3BlZXhfZW5jX3NpbmtldmVudCksCisJICAoZ3N0X3NwZWV4X2VuY19lbmNvZGUpLCAoZ3N0X3NwZWV4X2VuY19jaGFpbiksCisJICAoZ3N0X3NwZWV4X2VuY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuaDoKKwkgIEhhbmRsZSBub24temVybyBzdGFydCB0aW1lc3RhbXBzIGluIHRoZSBlbmNvZGVyIGFuZCBkZXRlY3QvaGFuZGxlCisJICBzdHJlYW0gZGlzY29udGludWl0aWVzLiBGaXhlcyBidWcgIzU0NzA3NS4KKworMjAwOC0wOC0zMSAwODozMjo0NSArMDAwMCAgQ3JhaWcgS2VvZ2ggPGNza2VvZ2hAYWRhbS5jb20uYXU+CisKKwkgIGV4dC9hbm5vZGV4L2dzdGNtbWxwYXJzZXIuYzogRml4IGNvbXBpbGVyIHdhcm5pbmdzIGNhdXNlZCBieSBwYXNzaW5nIGEgc3RyaW5nIGFzIGZvcm1hdCBzdHJpbmcgaW5zdGVhZCBvZiAiJXMiIGFuZCB0aC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQ3JhaWcgS2VvZ2ggPGNza2VvZ2ggYXQgYWRhbSBkb3QgY29tIGRvdCBhdT4KKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbHBhcnNlci5jOiAoZ3N0X2NtbWxfcGFyc2VyX3BhcnNlX2NodW5rKToKKwkgIEZpeCBjb21waWxlciB3YXJuaW5ncyBjYXVzZWQgYnkgcGFzc2luZyBhIHN0cmluZyBhcyBmb3JtYXQgc3RyaW5nCisJICBpbnN0ZWFkIG9mICIlcyIgYW5kIHRoZW4gdGhlIHN0cmluZy4gVGhpcyBpcyBvbmx5IGV4cG9zZWQgYnkgLVdmb3JtYXQ9MgorCSAgYXMgdXNlZCBieSBkZWZhdWx0IG9uIFVidW50dS4gRml4ZXMgYnVnICM1NTAwMTUuCisKKzIwMDgtMDgtMzAgMTQ6MTU6MDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIE1ha2Ugc3R1ZmYgY29tcGlsZSB3aXRoIEdTVF9ESVNBQkxFX0dTVF9ERUJVRy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmM6IChnc3RfaGR2MTM5NHNyY19jcmVhdGUpOgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogKGdzdF9hbHBoYV9nZXRfdW5pdF9zaXplKToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzogKGdlbmVyYXRlX2NvZWZmaWNpZW50cyk6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3JjX2NvbnZlcnQpOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9yZWFkX2VsZW1lbnRfaWQpLAorCSAgKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9sZW5ndGgpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfY2hlY2tfc3VidGl0bGVfYnVmZmVyKToKKwkgIE1ha2Ugc3R1ZmYgY29tcGlsZSB3aXRoIEdTVF9ESVNBQkxFX0dTVF9ERUJVRy4KKworMjAwOC0wOC0yOSAwMDoyODo1NSArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBnc3QvbGF3LzogUmVmIGNhcHMgYmVmb3JlIHBhc3NpbmcgdG8gZ3N0X3BhZF90ZW1wbGF0ZV9uZXcoKSwgc2luY2UgdGhhdCB0YWtlcyBvd25lcnNoaXAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xhdy9hbGF3LmM6CisJICAqIGdzdC9sYXcvbXVsYXcuYzoKKwkgIFJlZiBjYXBzIGJlZm9yZSBwYXNzaW5nIHRvIGdzdF9wYWRfdGVtcGxhdGVfbmV3KCksIHNpbmNlIHRoYXQgdGFrZXMKKwkgIG93bmVyc2hpcC4KKworMjAwOC0wOC0yOCAxMDowOToxNiArMDAwMCAgTWVyc2FkIEplbGFjaWMgPG1lcnNhZEBheGlzLmNvbT4KKworCSAgZ3N0L211bHRpcGFydC86IENvbnZlcnQgYXVkaW8veC1hZHBjbSB0byBhbmQgZnJvbSB0aGUgYXVkaW8vRzcyNi1YIGluIHRoZSBtdXhlciBhbmQgZGVtdXhlci4gRml4ZXMgIzU0OTU1MS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE1lcnNhZCBKZWxhY2ljIDxtZXJzYWQgYXQgYXhpcyBkb3QgY29tPgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IChnc3RfbXVsdGlwYXJ0X211eF9nZXRfbWltZSk6CisJICBDb252ZXJ0IGF1ZGlvL3gtYWRwY20gdG8gYW5kIGZyb20gdGhlIGF1ZGlvL0c3MjYtWCBpbiB0aGUgbXV4ZXIgYW5kCisJICBkZW11eGVyLiBGaXhlcyAjNTQ5NTUxLgorCisyMDA4LTA4LTI3IDE2OjEyOjM5ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBzeXMvb3N4YXVkaW8vOiBGaXggdGhlIGJ1aWxkIG9uIG1hY29zeC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJICAoZ3N0X29zeF9hdWRpb19zaW5rX3NlbGVjdF9kZXZpY2UpOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkgIChnc3Rfb3N4X2F1ZGlvX3NyY19jcmVhdGVfcmluZ2J1ZmZlciksCisJICAoZ3N0X29zeF9hdWRpb19zcmNfc2VsZWN0X2RldmljZSk6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hyaW5nYnVmZmVyLmM6IChnc3Rfb3N4X3JpbmdfYnVmZmVyX2FjcXVpcmUpOgorCSAgRml4IHRoZSBidWlsZCBvbiBtYWNvc3guCisKKzIwMDgtMDgtMjcgMTU6NDI6MTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOiBTbWFsbCBkb2NzIGZpeDogaW4gdGhlIGV4YW1wbGUgcGlwZWxpbmUsIHdlIG5lZWQgdG8gcGFzcyBpcmFkaW8tbW9kZT10cnVlIHRvIHRoZSBzb3VyY2UsIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOgorCSAgU21hbGwgZG9jcyBmaXg6IGluIHRoZSBleGFtcGxlIHBpcGVsaW5lLCB3ZSBuZWVkIHRvIHBhc3MKKwkgIGlyYWRpby1tb2RlPXRydWUgdG8gdGhlIHNvdXJjZSwgc28gdGhlIHNlcnZlciBhY3R1YWxseSBzZW5kcworCSAgYW4gSUNZIHN0cmVhbS4KKworMjAwOC0wOC0yNyAwMDowODoyMCArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW8uYzogT29wcy4gUmV2ZXJ0IG1vcmUgY29tcGxldGVseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW8uYzoKKwkgIE9vcHMuIFJldmVydCBtb3JlIGNvbXBsZXRlbHkuCisKKzIwMDgtMDgtMjYgMjM6NTc6MDUgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvLmM6IFJldmVydCBhY2NpZGVudGFsIGVsZW1lbnQgcmVuYW1lIGZyb20gdGVzdGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW8uYzoKKwkgIFJldmVydCBhY2NpZGVudGFsIGVsZW1lbnQgcmVuYW1lIGZyb20gdGVzdGluZy4KKworMjAwOC0wOC0yNiAyMzo1Mzo0MCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDogUHVsbCBpbiAwLjEwLjEwIGRvYXAgZW50cnkgZnJvbSByZWxlYXNlIGJyYW5jaAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkgIFB1bGwgaW4gMC4xMC4xMCBkb2FwIGVudHJ5IGZyb20gcmVsZWFzZSBicmFuY2gKKworMjAwOC0wOC0yNiAyMzowNTo1NyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogVXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIHJlZmxlY3QgMC4xMC4xMCByZWxlYXNlIGZyb20gYnJhbmNoLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIFVwZGF0ZSB2ZXJzaW9uIG51bWJlciB0byByZWZsZWN0IDAuMTAuMTAgcmVsZWFzZSBmcm9tCisJICBicmFuY2guCisKKzIwMDgtMDgtMjYgMjE6MTM6MDggKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgc3lzL29zeGF1ZGlvLzogUmV3cml0ZSBjYXBzIHNldHRpbmcgYW5kIHJpbmcgYnVmZmVyIGluaXRpYWxpc2F0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3hhdWRpby9NYWtlZmlsZS5hbToKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvLmM6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5oOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmg6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hyaW5nYnVmZmVyLmM6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hyaW5nYnVmZmVyLmg6CisJICBSZXdyaXRlIGNhcHMgc2V0dGluZyBhbmQgcmluZyBidWZmZXIgaW5pdGlhbGlzYXRpb24uCisJICBQcmV2aW91c2x5IHdlIG5ldmVyIHRvbGQgQ29yZUF1ZGlvIHdoYXQgZm9ybWF0IHdlIHdlcmUgZ29pbmcgdG8gc2VuZCBpdCwKKwkgIHNvIGl0IG9ubHkgd29ya2VkIGR1ZSB0byBsdWNrLCBhbmQgbm90IGF0IGFsbCBvbiBzb21lIGhhcmR3YXJlLgorCSAgTm93IHdlIGV4cGxpY2l0bHkgYWR2ZXJ0aXNlIHdoYXQgZm9ybWF0cyB0aGUgaGFyZHdhcmUgc3VwcG9ydHMsIGFuZCB0aGVuCisJICBjb25maWd1cmUgdGhlIHNlbGVjdGVkIG9uZSBjb3JyZWN0bHkuCisKKzIwMDgtMDgtMjYgMTI6Mjc6MTEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgc3lzL3Y0bDIvOiBGaXggbWVtb3J5IGxlYWtzLiBTbWFsbCBjb2RlIGNsZWFudXBzIDogTm8gbmVlZCBmb3IgZW1wdHkgX2luaXQoKS4gTm8gbmVlZCB0byBtZW1zZXQgaW5zdGFuY2Ugc3RydWN0dXJlcy4gLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgICogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICBGaXggbWVtb3J5IGxlYWtzLiBTbWFsbCBjb2RlIGNsZWFudXBzIDogTm8gbmVlZCBmb3IgZW1wdHkgX2luaXQoKS4gTm8KKwkgIG5lZWQgdG8gbWVtc2V0IGluc3RhbmNlIHN0cnVjdHVyZXMuIFNvbWUgbW9yZSBGSVhNRSdzLgorCisyMDA4LTA4LTI2IDA4OjExOjI2ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHRlc3RzL2ljbGVzLy5jdnNpZ25vcmU6IElnbm9yZSBtb3JlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2ljbGVzLy5jdnNpZ25vcmU6CisJICBJZ25vcmUgbW9yZS4KKworMjAwOC0wOC0yNiAwODowMDo1NyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvOiBJZ25vcmUgZmlsZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vLmN2c2lnbm9yZToKKwkgICogZ3N0L2dvb20yazEvLmN2c2lnbm9yZToKKwkgIElnbm9yZSBmaWxlcy4KKworMjAwOC0wOC0yNiAwNzo1MTo0MiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzogRml4IGNvbXBpbGVyIHdhcm5pbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJICBGaXggY29tcGlsZXIgd2FybmluZy4KKworMjAwOC0wOC0yNiAwNTo0MjoxNSArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkgIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOiBGaXggb2J2aW91cyBtZW1sZWFrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOiBGaXggb2J2aW91cyBtZW1sZWFrLgorCisyMDA4LTA4LTI1IDE0OjE1OjQzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvbWF0cm9za2EvOiBBZGQgUmVhbFtBdWRpb3xWaWRlb10gc3VwcG9ydCB0byBNYXRyb3NrYSBjb250YWluZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF92aWRlb19jYXBzKSwgKGdzdF9tYXRyb3NrYV9kZW11eF9hdWRpb19jYXBzKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9tdXhfdmlkZW9fcGFkX3NldGNhcHMpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX3NldGNhcHMpLCAoZ3N0X21hdHJvc2thX211eF9maW5pc2gpOgorCSAgQWRkIFJlYWxbQXVkaW98VmlkZW9dIHN1cHBvcnQgdG8gTWF0cm9za2EgY29udGFpbmVycy4KKwkgIEl0IHdvcmtzIGZpbmUgZm9yOgorCSAgKiBkZWNvZGluZyByZWFsIGF1ZGlvL3ZpZGVvIHN0cmVhbXMgY29udGFpbmVkIGluIG1rdgorCSAgKiAndHJhbnNtdXhpbmcnIHJlYWwgKC5ybSkgZmlsZXMgaW50byAubWt2IGZpbGVzCisJICBJdCB3aWxsIG5vdCB3b3JrIHRob3VnaCBmb3IgZW5jb2RpbmcgcmVhbFthdWRpby92aWRlb10gc3RyZWFtcyB0aGF0CisJICBkb24ndCBjb250YWluIHRoZSAnbWRwcl9kYXRhJyBleHRyYSBkYXRhIG9uIHRoZSBjYXBzLgorCSAgVGhlIHJlYXNvbiB3aHkgdGhpcyB3aWxsIG5vdCB3b3JrIGlzIGJlY2F1c2UgSSBuZXZlciBpbnRlbmRlZCB0bworCSAgZHVwbGljYXRlIHZpcnR1YWxseSBhbGwgdGhlICdtZHByJyBibG9jayBjcmVhdGlvbiBpbnRvIG1rdm11eC4KKwkgIEZpeGVzICM1MzYwNjcKKworMjAwOC0wOC0yNSAwOTo0ODowNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2xhdy86IFRoZSBlbmNvZGVyIGNhbid0IHJlYWxseSByZW5lZ290aWF0ZSBhdCB0aGUgdGltZSB0aGV5IHBlcmZvcm0gYSBwYWQtYWxsb2Mgc28gbWFrZSB0aGUgc3JjcGFkcyB1c2UgZml4ZWQgY2Fwcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6IChnc3RfYWxhd19lbmNfaW5pdCksIChnc3RfYWxhd19lbmNfY2hhaW4pOgorCSAgKiBnc3QvbGF3L211bGF3LWNvbnZlcnNpb24uYzoKKwkgICogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzogKGdzdF9tdWxhd2VuY19pbml0KSwKKwkgIChnc3RfbXVsYXdlbmNfY2hhaW4pOgorCSAgVGhlIGVuY29kZXIgY2FuJ3QgcmVhbGx5IHJlbmVnb3RpYXRlIGF0IHRoZSB0aW1lIHRoZXkgcGVyZm9ybSBhCisJICBwYWQtYWxsb2Mgc28gbWFrZSB0aGUgc3JjcGFkcyB1c2UgZml4ZWQgY2Fwcy4KKwkgIENoZWNrIHRoZSBidWZmZXIgc2l6ZSBhZnRlciBhIHBhZC1hbGxvYyBiZWNhdXNlIHRoZSByZXR1cm5lZCBzaXplIG1pZ2h0CisJICBub3QgYmUgcmlnaHQgd2hlbiB0aGUgZG93bnN0cmVhbSBlbGVtZW50IGRvZXMgbm90IGtub3cgdGhlIHNpemUgb2YgdGhlCisJICBuZXcgYnVmZmVyIChjYXBzZmlsdGVyKS4gRml4ZXMgIzU0OTA3My4KKworMjAwOC0wOC0yMyAxNTo0Mzo0OSArMDAwMCAgRmlsaXBwbyBBcmdpb2xhcyA8ZmlsaXBwby5hcmdpb2xhc0BnbWFpbC5jb20+CisKKwkgIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOiB2NGwyc3JjIGRvZXNuJ3QgaGF2ZSBhIHByb3BlcnR5IG5hbWVkICJub3JtIiBzbyBkb24ndCB0cnkgdG8gbm90aWZ5IGFib3V0IGNoYW5nZXMgdG8gdGhhdCBwci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogRmlsaXBwbyBBcmdpb2xhcyA8ZmlsaXBwbyBkb3QgYXJnaW9sYXMgYXQgZ21haWwgZG90IGNvbT4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmM6IChnc3RfdjRsMl90dW5lcl9zZXRfbm9ybV9hbmRfbm90aWZ5KToKKwkgIHY0bDJzcmMgZG9lc24ndCBoYXZlIGEgcHJvcGVydHkgbmFtZWQgIm5vcm0iIHNvIGRvbid0IHRyeSB0byBub3RpZnkKKwkgIGFib3V0IGNoYW5nZXMgdG8gdGhhdCBwcm9wZXJ0eS4gVGhlICJub3JtIiBwcm9wZXJ0eSBhbmQgcmVsYXRlZAorCSAgY29kZSBhcmUgY29tbWVudGVkIG91dCBjdXJyZW50bHkuIEZpeGVzIGJ1ZyAjNTQ5MDkwLgorCisyMDA4LTA4LTIzIDE1OjMzOjQ5ICswMDAwICBNaWtlIFJ1cHJlY2h0IDxjbWFpa3VAZ21haWwuY29tPgorCisJICBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6IFJlcHJvYmUgZGV2aWNlcyBhZ2FpbiBpbnN0ZWFkIG9mIHRha2luZyBhIGNhY2hlZCBsaXN0IGFzIG5ldyBkZXZpY2VzIGNvdWxkJ3ZlIGJlZW4gcGx1Z2dlZCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE1pa2UgUnVwcmVjaHQgPGNtYWlrdSBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6IChnc3RfdjRsMl9jbGFzc19wcm9iZV9kZXZpY2VzKToKKwkgIFJlcHJvYmUgZGV2aWNlcyBhZ2FpbiBpbnN0ZWFkIG9mIHRha2luZyBhIGNhY2hlZCBsaXN0IGFzIG5ldworCSAgZGV2aWNlcyBjb3VsZCd2ZSBiZWVuIHBsdWdnZWQgaW4uIEZpeGVzIGJ1ZyAjNTQ5MDYyLgorCisyMDA4LTA4LTIyIDE2OjA0OjAyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9hdXRvZGV0ZWN0L01ha2VmaWxlLmFtOiBEb24ndCBsaW5rIHRoZSBhdXRvZGV0ZWN0IHBsdWdpbiB3aXRoIEdDb25mIGFzIGl0IGRvZXNuJ3QgdXNlIEdDb25mLiBGaXhlcyBidWcgIzU0NTQ2My4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXV0b2RldGVjdC9NYWtlZmlsZS5hbToKKwkgIERvbid0IGxpbmsgdGhlIGF1dG9kZXRlY3QgcGx1Z2luIHdpdGggR0NvbmYgYXMgaXQgZG9lc24ndAorCSAgdXNlIEdDb25mLiBGaXhlcyBidWcgIzU0NTQ2My4KKworMjAwOC0wOC0yMiAxMjoyNDoyMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IENoYW5nZSBzb21lIEdTVF9FTEVNRU5UX0VSUk9ScyB0byBHU1RfRVJST1JfT0JKRUNUIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gaWdub3JlIGVycm9ycyBhbmQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9yZWFkX2VsZW1lbnRfaWQpLAorCSAgKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9sZW5ndGgpLCAoZ3N0X2VibWxfcmVhZF91aW50KSwKKwkgIChnc3RfZWJtbF9yZWFkX3NpbnQpLCAoZ3N0X2VibWxfcmVhZF9mbG9hdCksCisJICAoZ3N0X2VibWxfcmVhZF9oZWFkZXIpOgorCSAgQ2hhbmdlIHNvbWUgR1NUX0VMRU1FTlRfRVJST1JzIHRvIEdTVF9FUlJPUl9PQkpFQ1QgdG8gbWFrZSBpdAorCSAgcG9zc2libGUgdG8gaWdub3JlIGVycm9ycyBhbmQgbm90IHBvc3QgYW55IEVSUk9SIG1lc3NhZ2VzIG9uCisJICB0aGUgYnVzLgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfY29udGVudHMpOgorCSAgSWdub3JlIGFueSBlcnJvcnMgYW5kIG5vdCBqdXN0IEVPUyB3aGVuIHBhcnNpbmcgdGhlIGNvbnRlbnRzIG9mCisJICBhIFNlZWtIZWFkLiBFcnJvcnMgaGVyZSBhcmUgdXN1YWxseSBjYXVzZWQgYnkgdHJ1bmNhdGVkIGZpbGVzCisJICBhbmQgcGxheWJhY2sgb2YgdGhlIGZpbGUgd29ya3MgZmluZS4gRml4ZXMgcGxheWJhY2sgb2YgdGhlCisJICBhdWRpb19vbmx5X2NoYXB0ZXJfc2Vla2Jyb2tlbi5ta2EgZmlsZSBmcm9tIHRoZSBNUGxheWVyIHNhbXBsZXMKKwkgIGFyY2hpdmUuCisKKzIwMDgtMDgtMjIgMTE6Mjk6MjYgKzAwMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkgIGdzdC9tdWx0aXBhcnQvOiBDb25mb3JtIHRvIFJGQzIwNDYuIGF1ZGlvL2Jhc2ljIGlzIG11bGF3IDgwMDBIeiBtb25vLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzoKKwkgIENvbmZvcm0gdG8gUkZDMjA0Ni4gYXVkaW8vYmFzaWMgaXMgbXVsYXcgODAwMEh6IG1vbm8uCisKKzIwMDgtMDgtMjEgMjE6NTY6MTkgKzAwMDAgIE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcyA8b2xlLmFuZHJlLnJhdm5hc0B0YW5kYmVyZy5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6CisJICBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jIChnc3RfZGlyZWN0ZHJhd19zaW5rX2J1ZmZlcl9hbGxvYywgZ3N0X2RpcmVjdGRyYXdfc2lua19idWZmZXJwb29sX2NsZWFyKToKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jIChnc3RfZGlyZWN0ZHJhd19zaW5rX2J1ZmZlcl9hbGxvYywKKwkgIGdzdF9kaXJlY3RkcmF3X3NpbmtfYnVmZmVycG9vbF9jbGVhcik6CisJICBGaXggdHdvIG1vcmUgYnVmZmVyIHJlZiBsZWFrcy4KKworMjAwOC0wOC0yMSAxNToyODowOSArMDAwMCAgT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KKworCSAgc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzogRml4IGJ1ZmZlciByZWYgbGVhay4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcyAgPG9sZS5hbmRyZS5yYXZuYXMgYXQgdGFuZGJlcmcgY29tPgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jOgorCSAgKGdzdF9kaXJlY3RkcmF3X3Npbmtfc2hvd19mcmFtZSk6CisJICBGaXggYnVmZmVyIHJlZiBsZWFrLgorCisyMDA4LTA4LTIxIDEzOjI3OjEyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IFJldmVydCB0aGUgbGFzdCBjb21taXQuIHdhdmVuYyBzdGlsbCBzdXBwb3J0cyB3aWR0aCE9ZGVwdGggZm9yIDMyIGJpdCB3aWR0aC4gVGhhbmtzIFRpbS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiAoZ3N0X3dhdmVuY19jaGFpbik6CisJICBSZXZlcnQgdGhlIGxhc3QgY29tbWl0LiB3YXZlbmMgc3RpbGwgc3VwcG9ydHMgd2lkdGghPWRlcHRoIGZvciAzMiBiaXQKKwkgIHdpZHRoLiBUaGFua3MgVGltLgorCisyMDA4LTA4LTIxIDEzOjIyOjA2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBJZiB0aGUgZHVyYXRpb24gb2YgYSBibG9jayBpcyB1bmtub3duIG9ubHkgdXNlIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBmaXJzdCBsYWNlIGFuZCB1cy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrKToKKwkgIElmIHRoZSBkdXJhdGlvbiBvZiBhIGJsb2NrIGlzIHVua25vd24gb25seSB1c2UgdGhlIHRpbWVzdGFtcCBmb3IgdGhlCisJICBmaXJzdCBsYWNlIGFuZCB1c2UgR1NUX0NMT0NLX1RJTUVfTk9ORSBhcyBkdXJhdGlvbiBmb3IgdGhlIGZvbGxvd2luZworCSAgbGFjZXMuIE90aGVyd2lzZSBldmVyeSBsYWNlIGhhcyB0aGUgc2FtZSB0aW1lc3RhbXAgd2hpY2ggbGVhZHMgdG8KKwkgIHZhcmlvdXMgcHJvYmxlbXMuIFJlYWxseSBmaXhlcyBidWcgIzU0ODgzMS4KKworMjAwOC0wOC0yMSAxMjo1NjowMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiBJZiB3ZSdyZSBub3QgYWxsb3dpbmcgd2lkdGghPWRlcHRoIGluIHdhdmVuYyB3ZSBzaG91bGQgYWxzbyBkaXNhYmxlIHRoZSBjb2RlIHRoYXQgd2FzIGFkZGVkIHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiAoZ3N0X3dhdmVuY19jaGFpbik6CisJICBJZiB3ZSdyZSBub3QgYWxsb3dpbmcgd2lkdGghPWRlcHRoIGluIHdhdmVuYyB3ZSBzaG91bGQgYWxzbyBkaXNhYmxlCisJICB0aGUgY29kZSB0aGF0IHdhcyBhZGRlZCB0byBzdXBwb3J0IHdpZHRoIT1kZXB0aC4KKworMjAwOC0wOC0yMSAxMjo1Mjo0NyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogRG9uJ3QgY2FsY3VsYXRlIHRoZSBkZWZhdWx0IGR1cmF0aW9uIG9mIGEgZnJhbWUgZnJvbSB0aGUgYXVkaW8gc2FtcGxpbmcgcmF0ZS4gVGhpcyBvbmwuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKToKKwkgIERvbid0IGNhbGN1bGF0ZSB0aGUgZGVmYXVsdCBkdXJhdGlvbiBvZiBhIGZyYW1lIGZyb20gdGhlIGF1ZGlvIHNhbXBsaW5nCisJICByYXRlLiBUaGlzIG9ubHkgd29ya3MgZm9yIHJhdyBhdWRpbyBpZiBldmVyeSBmcmFtZSBjb250YWlucyBhIHNpbmdsZQorCSAgc2FtcGxlIGFuZCByZXN1bHRzIGluIGJyb2tlbiBidWZmZXIgZHVyYXRpb25zIGZvciBvdGhlciBmb3JtYXRzCisJICBpZiBubyBzcGVjaWZpZWQgZGVmYXVsdCBkdXJhdGlvbiBpcyBnaXZlbiBvciB0aGUgYmxvY2tzIGhhdmUgbm8KKwkgIGR1cmF0aW9uLiBGaXhlcyBidWcgIzU0ODgzMS4KKworMjAwOC0wOC0yMSAxMjozNDozMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogQWxsb3cgemVybyBzaXplZCBibG9ja3MgaW5zdGVhZCBvZiByZXR1cm5pbmcgR1NUX0ZMT1dfT0suIFN1Y2ggYmxvY2tzIGFyZSB1c2VkIGZvciB0ZXguLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayk6CisJICBBbGxvdyB6ZXJvIHNpemVkIGJsb2NrcyBpbnN0ZWFkIG9mIHJldHVybmluZyBHU1RfRkxPV19PSy4gU3VjaCBibG9ja3MKKwkgIGFyZSB1c2VkIGZvciB0ZXh0L3BsYWluIHN1YnRpdGxlcyBhcyBhIGdhcC1maWxsZXIgaW4gc29tZSBmaWxlcy4KKworMjAwOC0wOC0yMSAxMjoxMjowMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiBBZGQgUzkxMCBhbmQgUFdDIGZvcm1hdHMgd2l0aCBhIGxvdyBwcmlvcml0eS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY192NGwyZm91cmNjX3RvX3N0cnVjdHVyZSksCisJICAoZ3N0X3Y0bDJfZ2V0X2NhcHNfaW5mbyk6CisJICBBZGQgUzkxMCBhbmQgUFdDIGZvcm1hdHMgd2l0aCBhIGxvdyBwcmlvcml0eS4KKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfZm9ybWF0X2dldF9yYW5rKSwKKwkgIChnc3RfdjRsMnNyY19wcm9iZV9jYXBzX2Zvcl9mb3JtYXQpOgorCSAgQWRkIG1vcmUgZGVidWdnaW5nLgorCisyMDA4LTA4LTIwIDIxOjU0OjM1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IEZpeCBjb21waWxhdGlvbiBhZ2FpbnN0IG9sZGVyIGxpYmZsYWMgdmVyc2lvbnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgRml4IGNvbXBpbGF0aW9uIGFnYWluc3Qgb2xkZXIgbGliZmxhYyB2ZXJzaW9ucy4KKworMjAwOC0wOC0yMCAxNzo0Njo0OCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvcHVsc2UvOiBVc2UgR1NUX0JPSUxFUlBMQVRFIGV2ZXJ5d2hlcmUgYW5kIGZpeCBjb2Rpbmcgc3R5bGUgYXQgc29tZSBwbGFjZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3B1bHNlL3B1bHNlbWl4ZXIuYzogKGdzdF9wdWxzZW1peGVyX2NsYXNzX2luaXQpLAorCSAgKGdzdF9wdWxzZW1peGVyX3NldF9wcm9wZXJ0eSksIChnc3RfcHVsc2VtaXhlcl9nZXRfcHJvcGVydHkpOgorCSAgKiBleHQvcHVsc2UvcHVsc2VtaXhlcmN0cmwuYzogKGdzdF9wdWxzZW1peGVyX2N0cmxfc3Vic2NyaWJlX2NiKSwKKwkgIChnc3RfcHVsc2VtaXhlcl9jdHJsX29wZW4pLCAoZ3N0X3B1bHNlbWl4ZXJfY3RybF90aW1lb3V0X2V2ZW50KSwKKwkgIChnc3RfcHVsc2VtaXhlcl9jdHJsX3NldF92b2x1bWUpOgorCSAgKiBleHQvcHVsc2UvcHVsc2VtaXhlcnRyYWNrLmM6IChnc3RfcHVsc2VtaXhlcl90cmFja19uZXcpOgorCSAgKiBleHQvcHVsc2UvcHVsc2Vwcm9iZS5jOiAoZ3N0X3B1bHNlcHJvYmVfb3Blbik6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzogKGdzdF9wdWxzZXNpbmtfY2xhc3NfaW5pdCksCisJICAoZ3N0X3B1bHNlc2lua19pbml0KSwgKGdzdF9wdWxzZXNpbmtfb3BlbiksCisJICAoZ3N0X3B1bHNlc2lua19wcmVwYXJlKSwgKGdzdF9wdWxzZXNpbmtfd3JpdGUpLAorCSAgKGdzdF9wdWxzZXNpbmtfZGVsYXkpLCAoZ3N0X3B1bHNlc2lua19yZXNldCk6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOiAoZ3N0X3B1bHNlc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9wdWxzZXNyY19pbml0KToKKwkgIFVzZSBHU1RfQk9JTEVSUExBVEUgZXZlcnl3aGVyZSBhbmQgZml4IGNvZGluZyBzdHlsZSBhdCBzb21lIHBsYWNlcy4KKwkgIEZpeCBhIGxvY2tpbmcgaXNzdWUgaW4gcHVsc2VzaW5rJ3MgcHJlcGFyZSBmdW5jdGlvbi4KKwkgICogZXh0L3B1bHNlL3B1bHNldXRpbC5jOiAoZ3N0X3B1bHNlX2NoYW5uZWxfbWFwX3RvX2dzdCk6CisJICBDaGVjayBpZiB0aGUgY3JlYXRlZCBjaGFubmVsIGxheW91dCBpcyB2YWxpZCBmb3IgR1N0cmVhbWVyLgorCisyMDA4LTA4LTIwIDE3OjQyOjIxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwZ29vZ2xlLmM6IFRoaW5ncyB0aGF0IGNhbiBoYXBwZW4gd2hlbiB5b3VyIGJyYWluIGlzIGluIGdvb2dsZSBtb2RlIHRyeWluZyB0byBkZWFsIHdpdGggdGhlaXIgZ29vZ2xlIHIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwZ29vZ2xlLmM6CisJICBUaGluZ3MgdGhhdCBjYW4gaGFwcGVuIHdoZW4geW91ciBicmFpbiBpcyBpbiBnb29nbGUgbW9kZSB0cnlpbmcgdG8KKwkgIGRlYWwgd2l0aCB0aGVpciBnb29nbGUgcnRzcCBzZXJ2ZXIgZXh0ZW5zaW9ucyBhbmQgdHJ5aW5nIHRvIHR5cGUgeW91cgorCSAgZ29vZ2xlIG1haWwgYWNjb3VudC4KKworMjAwOC0wOC0yMCAxNzozMDoxOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvOiBBZGQgZ29vZ2xlIFJUU1AgZXh0ZW5zaW9uLCBpdCBjYW4gb25seSBoYW5kbGUgdWRwIGFuZCByZXNwb25kcyB3aXRoIHVuc3VwcG9ydGVkIGlmIHdlIGRvIGFueXRoaW5nIGVsc2UuIEZpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHNwL2dzdHJ0c3AuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcGdvb2dsZS5jOiAoZ3N0X3J0c3BfZ29vZ2xlX2JlZm9yZV9zZW5kKSwKKwkgIChnc3RfcnRzcF9nb29nbGVfYWZ0ZXJfc2VuZCksIChnc3RfcnRzcF9nb29nbGVfZ2V0X3RyYW5zcG9ydHMpLAorCSAgKF9kb19pbml0KSwgKGdzdF9ydHNwX2dvb2dsZV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHNwX2dvb2dsZV9jbGFzc19pbml0KSwgKGdzdF9ydHNwX2dvb2dsZV9pbml0KSwKKwkgIChnc3RfcnRzcF9nb29nbGVfZmluYWxpemUpLCAoZ3N0X3J0c3BfZ29vZ2xlX2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0c3BfZ29vZ2xlX2V4dGVuc2lvbl9pbml0KToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcGdvb2dsZS5oOgorCSAgQWRkIGdvb2dsZSBSVFNQIGV4dGVuc2lvbiwgaXQgY2FuIG9ubHkgaGFuZGxlIHVkcCBhbmQgcmVzcG9uZHMgd2l0aAorCSAgdW5zdXBwb3J0ZWQgaWYgd2UgZG8gYW55dGhpbmcgZWxzZS4gRml4ZXMgIzU0NjQ2NS4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfY29ubmVjdGlvbl9zZW5kKSwKKwkgIChnc3RfcnRzcHNyY19jb25uZWN0aW9uX3JlY2VpdmUpLCAoZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCksCisJICAoZ3N0X3J0c3BzcmNfY3JlYXRlX3RyYW5zcG9ydHNfc3RyaW5nKSwKKwkgIChnc3RfcnRzcHNyY19zZXR1cF9zdHJlYW1zKSwgKGdzdF9ydHNwc3JjX29wZW4pLAorCSAgKGdzdF9ydHNwc3JjX2Nsb3NlKSwgKGdzdF9ydHNwc3JjX3BhdXNlKToKKwkgIE1ha2UgdHJhbnNwb3J0IHNldHVwIGNvZGUgYSBiaXQgYmV0dGVyIHVzaW5nIEdTdHJpbmcuCisJICBBZGQgc29tZSBtb3JlIGRlYnVnLgorCSAgQ2hlY2sgZm9yIGNsb3NlZCBjb25uZWN0aW9ucyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgb24gdGhlbS4KKworMjAwOC0wOC0yMCAxNzoxNzo1NSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvcHVsc2UvOiBJZiBkb3duc3RyZWFtIHByb3ZpZGVzIG5vIGNoYW5uZWwgbGF5b3V0IGFuZCA+MiBjaGFubmVscyBzaG91bGQgYmUgdXNlZCB1c2UgdGhlIGRlZmF1bHQgbGF5b3V0IHRoYXQgcHVsc2UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvcHVsc2UvcHVsc2VzcmMuYzogKGdzdF9wdWxzZXNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfcHVsc2VzcmNfY3JlYXRlX3N0cmVhbSksIChnc3RfcHVsc2VzcmNfbmVnb3RpYXRlKSwKKwkgIChnc3RfcHVsc2VzcmNfcHJlcGFyZSk6CisJICAqIGV4dC9wdWxzZS9wdWxzZXV0aWwuYzogKGdzdF9wdWxzZV9nc3RfdG9fY2hhbm5lbF9tYXApLAorCSAgKGdzdF9wdWxzZV9jaGFubmVsX21hcF90b19nc3QpOgorCSAgKiBleHQvcHVsc2UvcHVsc2V1dGlsLmg6CisJICBJZiBkb3duc3RyZWFtIHByb3ZpZGVzIG5vIGNoYW5uZWwgbGF5b3V0IGFuZCA+MiBjaGFubmVscyBzaG91bGQgYmUKKwkgIHVzZWQgdXNlIHRoZSBkZWZhdWx0IGxheW91dCB0aGF0IHB1bHNlYXVkaW8gY2hvb3NlcyBhbmQgYWxzbworCSAgYWRkIHRoaXMgbGF5b3V0IHRvIHRoZSBjYXBzLiBGaXhlcyBidWcgIzU0NzI1OC4KKworMjAwOC0wOC0yMCAxMTo1MTozOCArMDAwMCAgUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2pAYXhpcy5jb20+CisKKwkgIGdzdC91ZHAvOiBBdm9pZCBsZWFraW5nIGludGVybmFsbHkgYWxsb2NhdGVkIGZpbGUgZGVzY3JpcHRvcnMgd2hlbiBzZXR0aW5nIGN1c3RvbSBmaWxlIGRlc2NyaXB0b3JzLiBGaXhlcyAjNTQzMTAxLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2ogYXQgYXhpcyBjb20+CisJICAqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOiAoZ3N0X2R5bnVkcHNpbmtfaW5pdCksCisJICAoZ3N0X2R5bnVkcHNpbmtfZmluYWxpemUpLCAoZ3N0X2R5bnVkcHNpbmtfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfZHludWRwc2lua19pbml0X3NlbmQpLCAoZ3N0X2R5bnVkcHNpbmtfY2xvc2UpOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19pbml0KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX2ZpbmFsaXplKSwgKGdzdF9tdWx0aXVkcHNpbmtfc2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfZmluYWxpemUpLAorCSAgKGdzdF91ZHBzcmNfc2V0X3Byb3BlcnR5KToKKwkgIEF2b2lkIGxlYWtpbmcgaW50ZXJuYWxseSBhbGxvY2F0ZWQgZmlsZSBkZXNjcmlwdG9ycyB3aGVuIHNldHRpbmcKKwkgIGN1c3RvbSBmaWxlIGRlc2NyaXB0b3JzLiBGaXhlcyAjNTQzMTAxLgorCisyMDA4LTA4LTIwIDExOjQ4OjQ2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IERvbid0IHRyeSB0byBjb25maWd1cmUgUlRDUCBiYWNrIHRvIHRoZSBzZXJ2ZXIgd2hlbiB0aGUgc2VydmVyIGRpZCBub3QgZ2l2ZSB1cyBhIHZhbGlkIHBvcnQgbnUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3VkcF9zaW5rKToKKwkgIERvbid0IHRyeSB0byBjb25maWd1cmUgUlRDUCBiYWNrIHRvIHRoZSBzZXJ2ZXIgd2hlbiB0aGUgc2VydmVyIGRpZCBub3QKKwkgIGdpdmUgdXMgYSB2YWxpZCBwb3J0IG51bWJlci4KKworMjAwOC0wOC0yMCAxMDo1OTo1MiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IFVzZSBuZXcgYmFzZXRyYW5zZm9ybSBtZXRob2QgdG8gcmVuZWdvdGlhdGUuIEZpeGVzICM1NDQ5NTYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X3NldF9wcm9wZXJ0eSk6CisJICBVc2UgbmV3IGJhc2V0cmFuc2Zvcm0gbWV0aG9kIHRvIHJlbmVnb3RpYXRlLiBGaXhlcyAjNTQ0OTU2LgorCSAgKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvaWNsZXMvdmlkZW9ib3gtdGVzdC5jOiAobWFrZV9waXBlbGluZSksIChtYWluKToKKwkgIEFkZCB2aWRlb2JveCByZW5lZ290aWF0aW9uIGV4YW1wbGUuCisKKzIwMDgtMDgtMTkgMjE6MDM6MjIgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiBSZW1vdmUgZGVwdGggcmFuZ2VzIGFuZCByZXBsYWNlIHdpdGggc2FuZSB2YWx1ZXMuICBGaXhlcyAjNTQ4NTMwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IFJlbW92ZSBkZXB0aCByYW5nZXMgYW5kIHJlcGxhY2UKKwkgIHdpdGggc2FuZSB2YWx1ZXMuICBGaXhlcyAjNTQ4NTMwLgorCisyMDA4LTA4LTE4IDE1OjA1OjMyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9wdWxzZS86IFRoZSBieXRlc19wZXJfc2FtcGxlIGFuZCBzaWxlbmNlX3NhbXBsZSBmaWVsZHMgb2YgdGhlIEdzdFJpbmdCdWZmZXJTcGVjIGFyZSBhbHJlYWR5IGZpbGxlZCB3aXRoIHRoZSBjb3JyZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzogKGdzdF9wdWxzZXNpbmtfcHJlcGFyZSk6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOiAoZ3N0X3B1bHNlc3JjX3ByZXBhcmUpOgorCSAgVGhlIGJ5dGVzX3Blcl9zYW1wbGUgYW5kIHNpbGVuY2Vfc2FtcGxlIGZpZWxkcyBvZiB0aGUgR3N0UmluZ0J1ZmZlclNwZWMKKwkgIGFyZSBhbHJlYWR5IGZpbGxlZCB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlcyBieQorCSAgZ3N0X3JpbmdfYnVmZmVyX3BhcnNlX2NhcHMoKSBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gc2V0IHRoZW0gYWdhaW4KKwkgIHdpdGggd3JvbmcgdmFsdWVzLgorCisyMDA4LTA4LTE2IDE0OjU0OjU2ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IFNvbWUgQVZJIDIuMCAoT0RNTCkgZmlsZXMgZG9uJ3QgcmVzcGVjdCB0aGUgJ3NwZWNpZmljYXRpb25zJyBjb21wbGV0ZWx5IGFuZCBpbnN0ZWFkIG9mIHVzaW5nIHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3JlYWRfc3ViaW5kZXhlc19wdWxsKSwKKwkgIChnc3RfYXZpX2RlbXV4X3JlYWRfc3ViaW5kZXhlc19wdXNoKToKKwkgIFNvbWUgQVZJIDIuMCAoT0RNTCkgZmlsZXMgZG9uJ3QgcmVzcGVjdCB0aGUgJ3NwZWNpZmljYXRpb25zJyBjb21wbGV0ZWx5CisJICBhbmQgaW5zdGVhZCBvZiB1c2luZyB0aGUgJ2l4IyMnIG5vbWVuY2xhdHVyZSwgdXNlICcjI2l4Jy4KKwkgIFRoZXkncmUgc3RpbGwgdmFsaWQgdGhvdWdoLCB0aGlzIGZpeGVzIHRoZSBkdXJhdGlvbiBhbmQgaW5kZXhlcyBmb3IKKwkgIHZpcnR1YWxseSBhbGwgdGhlIE9ETUwgZmlsZXMgSSBoYXZlLgorCisyMDA4LTA4LTE1IDE3OjI2OjE4ICswMDAwICBPbGl2aWVyIENyZXRlIDx0ZXN0ZXJAdGVzdGVyLmNhPgorCisJICBnc3QvcnRwLzogVXBkYXRlIHRoZSB2b3JiaXMgUlRQIHBheS9kZXBheSB0byBSRkMgNTIxNS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlciBhdCB0ZXN0ZXIgZG90IGNhPgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6IChnc3RfcnRwX3ZvcmJpc19kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX3ZvcmJpc19kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzogKGdzdF9ydHBfdm9yYmlzX3BheV9maW5pc2hfaGVhZGVycyk6CisJICBVcGRhdGUgdGhlIHZvcmJpcyBSVFAgcGF5L2RlcGF5IHRvIFJGQyA1MjE1LgorCSAgRml4ZXMgIzU0Nzg0Mi4KKworMjAwOC0wOC0xNCAyMjowNzowMiArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQWRkICdoZHY2JyBhcyBhIEhEViBmb3JtYXQgZm9yIDEwODBpLzYwIHdpdGggMzoyIHB1bGxkb3duLCBpLmUuLCAyNHAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgJ2hkdjYnIGFzIGEgSERWIGZvcm1hdCBmb3IgMTA4MGkvNjAKKwkgIHdpdGggMzoyIHB1bGxkb3duLCBpLmUuLCAyNHAuCisKKzIwMDgtMDgtMTQgMTI6NDc6MDkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6IEZpeCBjb21waWxhdGlvbiBzb21lIG1vcmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIEZpeCBjb21waWxhdGlvbiBzb21lIG1vcmUuCisKKzIwMDgtMDgtMTQgMTE6NDQ6NTkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogUmVxdWlyZSAtYmFzZSBDVlMgZm9yIHdhdnBhcnNlIGFjaWQgY2h1bmsgcGFyc2luZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6OgorCSAgUmVxdWlyZSAtYmFzZSBDVlMgZm9yIHdhdnBhcnNlIGFjaWQgY2h1bmsgcGFyc2luZy4KKworMjAwOC0wOC0xMyAxMzo1NzowMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvcHVsc2UvcHVsc2VzaW5rLio6IEFkZCAiZGV2aWNlLW5hbWUiIHByb3BlcnR5IHRvIHB1bHNlc2luayB0b28gYW5kIGN1cnJlbnRseSBjb21tZW50ZWQgb3V0IGFuZCBub3Qgd29ya2luZyBzdXBwb3IuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvcHVsc2UvcHVsc2VzaW5rLmM6IChnc3RfcHVsc2VzaW5rX2NsYXNzX2luaXQpLAorCSAgKGdzdF9wdWxzZXNpbmtfaW5pdCksIChnc3RfcHVsc2VzaW5rX2ZpbmFsaXplKSwKKwkgIChnc3RfcHVsc2VzaW5rX3NldF92b2x1bWUpLCAoZ3N0X3B1bHNlc2lua19nZXRfdm9sdW1lKSwKKwkgIChnc3RfcHVsc2VzaW5rX3NldF9wcm9wZXJ0eSksIChnc3RfcHVsc2VzaW5rX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3B1bHNlc2lua19wcmVwYXJlKSwgKGdzdF9wdWxzZXNpbmtfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSAgQWRkICJkZXZpY2UtbmFtZSIgcHJvcGVydHkgdG8gcHVsc2VzaW5rIHRvbyBhbmQgY3VycmVudGx5IGNvbW1lbnRlZAorCSAgb3V0IGFuZCBub3Qgd29ya2luZyBzdXBwb3J0IGZvciBhICJ2b2x1bWUiIHByb3BlcnR5LgorCisyMDA4LTA4LTEzIDEzOjE3OjE1ICswMDAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJICBjb25maWd1cmUuYWM6IFJlbW92ZSBtb3JlIGNkaW8gc3R1ZmYgKG1vdmVkIHRvIHVnbHkpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgUmVtb3ZlIG1vcmUgY2RpbyBzdHVmZiAobW92ZWQgdG8gdWdseSkKKworMjAwOC0wOC0xMyAxMjozNzoyNiArMDAwMCAgTGFzemxvIFBhbmR5IDxsYXN6bG9rMkBnbWFpbC5jb20+CisKKwkgIGV4dC9wdWxzZS9wdWxzZXNyYy5jOiBBZGQgImRldmljZS1uYW1lIiBwcm9wZXJ0eSwgd2hpY2ggcHJvdmlkZXMgYSBodW1hbiByZWFkYWJsZSBzdHJpbmcgZm9yIHRoZSBhdWRpbyBkZXZpY2UsIHRvIG1hay4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTGFzemxvIFBhbmR5IDxsYXN6bG9rMiBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBleHQvcHVsc2UvcHVsc2VzcmMuYzogKGdzdF9wdWxzZXNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfcHVsc2VzcmNfZ2V0X3Byb3BlcnR5KToKKwkgIEFkZCAiZGV2aWNlLW5hbWUiIHByb3BlcnR5LCB3aGljaCBwcm92aWRlcyBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZworCSAgZm9yIHRoZSBhdWRpbyBkZXZpY2UsIHRvIG1ha2UgaXQgbW9yZSBjb25zaXN0ZW4gd2l0aCBvdGhlciBhdWRpbworCSAgc291cmNlcy4gRml4ZXMgYnVnICM1NDc1MTkuCisKKzIwMDgtMDgtMTMgMTI6MzQ6MTMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3B1bHNlLzogSW1wcm92ZSBkZWJ1Z2dpbmcgYSBiaXQgYnkgaW5jbHVkaW5nIHRoZSBwYXJlbnQgb2JqZWN0IGluIHB1bHNlbWl4ZXJjdHJsIGFuZCBwdWxzZXByb2JlIG9iamVjdHMgYW5kIHVzaW5nLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3B1bHNlL3B1bHNlbWl4ZXIuYzogKGdzdF9wdWxzZW1peGVyX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOiAoZ3N0X3B1bHNlbWl4ZXJfY3RybF9zdWJzY3JpYmVfY2IpLAorCSAgKGdzdF9wdWxzZW1peGVyX2N0cmxfb3BlbiksIChnc3RfcHVsc2VtaXhlcl9jdHJsX25ldyksCisJICAoZ3N0X3B1bHNlbWl4ZXJfY3RybF9mcmVlKSwgKGdzdF9wdWxzZW1peGVyX2N0cmxfdGltZW91dF9ldmVudCk6CisJICAqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5oOgorCSAgKiBleHQvcHVsc2UvcHVsc2Vwcm9iZS5jOiAoZ3N0X3B1bHNlcHJvYmVfb3BlbiksCisJICAoZ3N0X3B1bHNlcHJvYmVfZW51bWVyYXRlKSwgKGdzdF9wdWxzZXByb2JlX25ldyksCisJICAoZ3N0X3B1bHNlcHJvYmVfZnJlZSksIChnc3RfcHVsc2Vwcm9iZV9uZWVkc19wcm9iZSksCisJICAoZ3N0X3B1bHNlcHJvYmVfcHJvYmVfcHJvcGVydHkpLCAoZ3N0X3B1bHNlcHJvYmVfZ2V0X3ZhbHVlcyk6CisJICAqIGV4dC9wdWxzZS9wdWxzZXByb2JlLmg6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzogKGdzdF9wdWxzZXNpbmtfaW5pdCk6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNyYy5jOiAoZ3N0X3B1bHNlc3JjX2luaXQpLCAoZ3N0X3B1bHNlc3JjX2RlbGF5KSwKKwkgIChnc3RfcHVsc2VzcmNfY2hhbmdlX3N0YXRlKToKKwkgIEltcHJvdmUgZGVidWdnaW5nIGEgYml0IGJ5IGluY2x1ZGluZyB0aGUgcGFyZW50IG9iamVjdCBpbiBwdWxzZW1peGVyY3RybAorCSAgYW5kIHB1bHNlcHJvYmUgb2JqZWN0cyBhbmQgdXNpbmcgR1NUX1dBUk5JTkdfT0JKRUNUIGluc3RlYWQgb2YKKwkgIEdTVF9XQVJOSU5HLgorCSAgVXNlIHRoZSBwYXJlbnQgR09iamVjdCBzdWJjbGFzcyBpbnN0ZWFkIG9mIGEgcmFuZG9tIHN0cnVjdCBhcyBHT2JqZWN0CisJICBwYXJhbWV0ZXIgZm9yIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRC4gVGhpcyBmaXhlcyBhIGNyYXNoCisJICB3aGVuIHByb2JpbmcgZm9yIGFub3RoZXIgcHJvcGVydHkgdGhhbiAiZGV2aWNlIi4KKworMjAwOC0wOC0xMyAxMjoyMToyMiArMDAwMCAgTGFzemxvIFBhbmR5IDxsYXN6bG9rMkBnbWFpbC5jb20+CisKKwkgIGV4dC9wdWxzZS9wdWxzZW1peGVyLmM6IEZpeCBwcm9wZXJ0eSBwcm9iaW5nIGFmdGVyIHRoZSBkZXZpY2UgcHJvcGVydHkgaXMgc2V0IGJ5IGNhbGxpbmcgc2V0X3NlcnZlciB3aGVuIHRoZSBzZXJ2ZXIgcC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTGFzemxvIFBhbmR5IDxsYXN6bG9rMiBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBleHQvcHVsc2UvcHVsc2VtaXhlci5jOiAoZ3N0X3B1bHNlbWl4ZXJfc2V0X3Byb3BlcnR5KToKKwkgIEZpeCBwcm9wZXJ0eSBwcm9iaW5nIGFmdGVyIHRoZSBkZXZpY2UgcHJvcGVydHkgaXMgc2V0IGJ5IGNhbGxpbmcKKwkgIHNldF9zZXJ2ZXIgd2hlbiB0aGUgc2VydmVyIHByb3BlcnR5IGNoYW5nZXMuIEZpeGVzIGJ1ZyAjNTQ3NTE4LgorCisyMDA4LTA4LTEzIDEyOjExOjM0ICswMDAwICBMYXN6bG8gUGFuZHkgPGxhc3psb2syQGdtYWlsLmNvbT4KKworCSAgZXh0L3B1bHNlL3B1bHNlbWl4ZXIuYzogRml4IHByb3BlcnR5IHByb2JpbmcgYWZ0ZXIgdGhlIGRldmljZSBwcm9wZXJ0eSBpcyBzZXQgYnkgY2FsbGluZyBzZXRfc2VydmVyIHdoZW4gdGhlIHNlcnZlciBwLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBMYXN6bG8gUGFuZHkgPGxhc3psb2syIGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGV4dC9wdWxzZS9wdWxzZW1peGVyLmM6IChnc3RfcHVsc2VtaXhlcl9zZXRfcHJvcGVydHkpOgorCSAgRml4IHByb3BlcnR5IHByb2JpbmcgYWZ0ZXIgdGhlIGRldmljZSBwcm9wZXJ0eSBpcyBzZXQgYnkgY2FsbGluZworCSAgc2V0X3NlcnZlciB3aGVuIHRoZSBzZXJ2ZXIgcHJvcGVydHkgY2hhbmdlcy4gRml4ZXMgYnVnICM1NDc1MTguCisKKzIwMDgtMDgtMTMgMTI6MDE6MDEgKzAwMDAgIExhc3psbyBQYW5keSA8bGFzemxvazJAZ21haWwuY29tPgorCisJICBleHQvcHVsc2UvOiBJbXBsZW1lbnQgR3N0UHJvcGVydHlQcm9iZSBpbnRlcmZhY2Ugb24gcHVsc2VzaW5rIGZvciBkZXRlY3Rpbmcgc2luayBkZXZpY2VzIGFuZCBvbiBwdWxzZXNyYyBmb3IgZGV0ZWN0aW4uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IExhc3psbyBQYW5keSA8bGFzemxvazIgYXQgZ21haWwgZG90IGNvbT4KKwkgICogZXh0L3B1bHNlL3B1bHNlc2luay5jOiAoZ3N0X3B1bHNlc2lua19pbnRlcmZhY2Vfc3VwcG9ydGVkKSwKKwkgIChnc3RfcHVsc2VzaW5rX2ltcGxlbWVudHNfaW50ZXJmYWNlX2luaXQpLAorCSAgKGdzdF9wdWxzZXNpbmtfaW5pdF9pbnRlcmZhY2VzKSwgKGdzdF9wdWxzZXNpbmtfaW5pdCksCisJICAoZ3N0X3B1bHNlc2lua19maW5hbGl6ZSksIChnc3RfcHVsc2VzaW5rX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3B1bHNlc2lua19nZXRfdHlwZSk6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNpbmsuaDoKKwkgICogZXh0L3B1bHNlL3B1bHNlc3JjLmM6IChnc3RfcHVsc2VzcmNfaW50ZXJmYWNlX3N1cHBvcnRlZCksCisJICAoZ3N0X3B1bHNlc3JjX2luaXRfaW50ZXJmYWNlcyksIChnc3RfcHVsc2VzcmNfaW5pdCksCisJICAoZ3N0X3B1bHNlc3JjX2ZpbmFsaXplKSwgKGdzdF9wdWxzZXNyY19zZXRfcHJvcGVydHkpOgorCSAgKiBleHQvcHVsc2UvcHVsc2VzcmMuaDoKKwkgIEltcGxlbWVudCBHc3RQcm9wZXJ0eVByb2JlIGludGVyZmFjZSBvbiBwdWxzZXNpbmsgZm9yIGRldGVjdGluZworCSAgc2luayBkZXZpY2VzIGFuZCBvbiBwdWxzZXNyYyBmb3IgZGV0ZWN0aW5nIHNvdXJjZSBkZXZpY2VzLgorCSAgRml4ZXMgYnVncyAjNTQ3MjI3IGFuZCAjNTQ3MjE3LgorCisyMDA4LTA4LTEzIDA5OjE3OjIwICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiBEb24ndCB0ZXJtaW5hdGUgb24gZmFicyhpbik+MS4wLiBJbml0IGRvdWJsZXMgYXMgZG91Ymxlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIERvbid0IHRlcm1pbmF0ZSBvbiBmYWJzKGluKT4xLjAuIEluaXQgZG91YmxlcyBhcyBkb3VibGVzLgorCisyMDA4LTA4LTEzIDA4OjMzOjU3ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IFByb3Blcmx5IHNldCB0aGUgbWF4aW11bSBsYXRlbmN5IHZhbHVlLCBpbiB0aGUgc2FtZSB3YXkgaXQgaXMgZG9uZSBpbiB2NGxzcmMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfcXVlcnkpOgorCSAgUHJvcGVybHkgc2V0IHRoZSBtYXhpbXVtIGxhdGVuY3kgdmFsdWUsIGluIHRoZSBzYW1lIHdheSBpdCBpcyBkb25lIGluCisJICB2NGxzcmMuCisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIFNpbXBsaWZ5IGZyYWN0aW9uIGVxdWFsaXR5IGNoZWNrLCBubyBuZWVkIHRvIHVzZSBHVmFsdWVzIGZvciB0aGlzLgorCisyMDA4LTA4LTEyIDEyOjA0OjI0ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IEFkZCB3YXJuaW5nIG1lc3NhZ2VzIHN0YXRpbmcgZXhhY3RseSB3aHkgdGhlIGxhdGVuY3kgcXVlcnkgZmFpbGVkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX3F1ZXJ5KToKKwkgIEFkZCB3YXJuaW5nIG1lc3NhZ2VzIHN0YXRpbmcgZXhhY3RseSB3aHkgdGhlIGxhdGVuY3kgcXVlcnkgZmFpbGVkLgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19zZXRfY2FwdHVyZSk6CisJICBJbiBzb21lIGNhc2VzLCB0aGUgbmVnb3RpYXRlZCBmcmFtZXJhdGUgbWlnaHQgYmUgdGhlIGRlZmF1bHQgb25lIHdoaWNoCisJICBpcyBhbHJlYWR5IHNldCBpbnRlcm5hbGx5LiBCdXQgd2Ugc3RpbGwgbmVlZCB0byBtYXJrIGl0IGRvd24gaW4gZnBzX24KKwkgIGFuZCBmcHNfZCBzbyB0aGF0IHRoZSBsYXRlbmN5IHF1ZXJ5IGNhbiBoYXBwZW4gcHJvcGVybHkuCisKKzIwMDgtMDgtMTIgMTE6Mjg6NDcgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDogV2hvb3BzLCBmb3Jnb3Qgb25lIGRvYyBmaWxlIGZvciBwZW9wbGUgd2hvIGNhbid0L2Rvbid0IGJ1aWxkIHRoZSByYXcxMzk0IHBsdWdpbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJICBXaG9vcHMsIGZvcmdvdCBvbmUgZG9jIGZpbGUgZm9yIHBlb3BsZSB3aG8gY2FuJ3QvZG9uJ3QgYnVpbGQgdGhlCisJICByYXcxMzk0IHBsdWdpbi4KKworMjAwOC0wOC0xMiAwOToyMjoyOSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIFB1bGwgY2hhbmdlcyBmcm9tIDAuMTAuOS4yIHByZS1yZWxlYXNlIGJyYW5jaCBtb3ZpbmcgdGhlIGxpYmNkaW8KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkaW8ueG1sOgorCSAgKiBleHQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9jZGlvL01ha2VmaWxlLmFtOgorCSAgKiBleHQvY2Rpby9nc3RjZGlvLmM6CisJICAqIGV4dC9jZGlvL2dzdGNkaW8uaDoKKwkgICogZXh0L2NkaW8vZ3N0Y2Rpb2NkZGFzcmMuYzoKKwkgICogZXh0L2NkaW8vZ3N0Y2Rpb2NkZGFzcmMuaDoKKwkgIFB1bGwgY2hhbmdlcyBmcm9tIDAuMTAuOS4yIHByZS1yZWxlYXNlIGJyYW5jaCBtb3ZpbmcgdGhlIGxpYmNkaW8KKwkgIENEREEgc291cmNlIHRvIC11Z2x5LgorCSAgKiBwby9MSU5HVUFTOgorCSAgKiBwby9QT1RGSUxFUy5pbjoKKwkgICogcG8vaWQucG86CisJICBQdWxsIGluIG5ldyB0cmFuc2xhdGlvbiBmcm9tIDAuMTAuOS4yIHJlbGVhc2UgYnJhbmNoLgorCisyMDA4LTA4LTExIDE1OjA1OjEzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBkb2NzL3BsdWdpbnMvOiBJbnRlZ3JhdGUgZG9jdW1lbnRhdGlvbiBmb3IgbmV3IGhkdjEzOTRzcmMgZWxlbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSAgSW50ZWdyYXRlIGRvY3VtZW50YXRpb24gZm9yIG5ldyBoZHYxMzk0c3JjIGVsZW1lbnQuCisKKzIwMDgtMDgtMTEgMTQ6MzY6MTMgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGV4dC9yYXcxMzk0LzogbXBlZzItdHMgKEhEVikgdmFyaWFudCBvZiBmaXJld2lyZSBjYXB0dXJlIGVsZW1lbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3JhdzEzOTQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9yYXcxMzk0L2dzdDEzOTQuYzogKHBsdWdpbl9pbml0KToKKwkgICogZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jOiAoX2RvX2luaXQpLAorCSAgKGdzdF9oZHYxMzk0c3JjX2Jhc2VfaW5pdCksIChnc3RfaGR2MTM5NHNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfaGR2MTM5NHNyY19pbml0KSwgKGdzdF9oZHYxMzk0c3JjX2Rpc3Bvc2UpLAorCSAgKGdzdF9oZHYxMzk0c3JjX3NldF9wcm9wZXJ0eSksIChnc3RfaGR2MTM5NHNyY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9oZHYxMzk0c3JjX2Zyb21fcmF3MTM5NGhhbmRsZSksCisJICAoZ3N0X2hkdjEzOTRzcmNfaWVjNjE4ODNfcmVjZWl2ZSksIChnc3RfaGR2MTM5NHNyY19idXNfcmVzZXQpLAorCSAgKGdzdF9oZHYxMzk0c3JjX2NyZWF0ZSksIChnc3RfaGR2MTM5NHNyY19kaXNjb3Zlcl9hdmNfbm9kZSksCisJICAoZ3N0X2hkdjEzOTRzcmNfc3RhcnQpLCAoZ3N0X2hkdjEzOTRzcmNfc3RvcCksCisJICAoZ3N0X2hkdjEzOTRzcmNfdW5sb2NrKSwgKGdzdF9oZHYxMzk0c3JjX3VwZGF0ZV9kZXZpY2VfbmFtZSksCisJICAoZ3N0X2hkdjEzOTRzcmNfdXJpX2dldF90eXBlKSwgKGdzdF9oZHYxMzk0c3JjX3VyaV9nZXRfcHJvdG9jb2xzKSwKKwkgIChnc3RfaGR2MTM5NHNyY191cmlfZ2V0X3VyaSksIChnc3RfaGR2MTM5NHNyY191cmlfc2V0X3VyaSksCisJICAoZ3N0X2hkdjEzOTRzcmNfdXJpX2hhbmRsZXJfaW5pdCk6CisJICAqIGV4dC9yYXcxMzk0L2dzdGhkdjEzOTRzcmMuaDoKKwkgIG1wZWcyLXRzIChIRFYpIHZhcmlhbnQgb2YgZmlyZXdpcmUgY2FwdHVyZSBlbGVtZW50LgorCSAgRml4ZXMgIzM1MDgzMAorCisyMDA4LTA4LTExIDEwOjUzOjA2ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogRml4IGNvbXBpbGF0aW9uIChhbHNvIGtub3duIGFzIHRoZSBjbGFzc2ljICdmaXggY29kZSB0aGF0IHNvbWVvbmUgY29tbWl0dGVkIHdpdGhvdXQgY29tcGlsaW5nIGkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogKGdzdF9sZXZlbF9tZXNzYWdlX25ldyk6CisJICBGaXggY29tcGlsYXRpb24gKGFsc28ga25vd24gYXMgdGhlIGNsYXNzaWMgJ2ZpeCBjb2RlIHRoYXQgc29tZW9uZQorCSAgY29tbWl0dGVkIHdpdGhvdXQgY29tcGlsaW5nIGl0IGZpcnN0JykuCisKKzIwMDgtMDgtMTAgMTk6NDA6MjcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzogQWRkIGEgdGVzdCBmb3IgbGV2ZWwgaW4gc3RlcmVvIG1vZGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzoKKwkgIEFkZCBhIHRlc3QgZm9yIGxldmVsIGluIHN0ZXJlbyBtb2RlLgorCisyMDA4LTA4LTEwIDE5OjM1OjA1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtLzogRGVtbyBob3cgdG8gZHJhdyBhbmFseXplciByZXN1bHRzIHN5bmNlZCB0byB0aGUgY2xvY2suCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzoKKwkgICogdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1vc3NzcmMuYzoKKwkgIERlbW8gaG93IHRvIGRyYXcgYW5hbHl6ZXIgcmVzdWx0cyBzeW5jZWQgdG8gdGhlIGNsb2NrLgorCisyMDA4LTA4LTEwIDE1OjUyOjQyICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiBMaXR0bGUgcmVuYW1pbmcgKGwgLT4gbGV2ZWwpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgTGl0dGxlIHJlbmFtaW5nIChsIC0+IGxldmVsKS4KKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5oOgorCSAgQWxzbyBzZW5kIGZ1bGwgdGltZXN0YW1wL2R1cmF0aW9uIGRldGFpbHMgaGVyZS4KKworMjAwOC0wOC0xMCAxMTozMjowMyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvbGV2ZWwvZ3N0bGV2ZWwuKjogU2VuZCBzYW1lIHRpbWVzdGFtcC9kdXJhdGlvbiBkZXRhaWxzIGFzIHZpZGVvYW5hbHlzaXMuIFRoaXMgZ2l2ZXMgYXBwbGljYXRpb25zIGJldHRlciBjaGFuY2UgdG8uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmg6CisJICBTZW5kIHNhbWUgdGltZXN0YW1wL2R1cmF0aW9uIGRldGFpbHMgYXMgdmlkZW9hbmFseXNpcy4gVGhpcyBnaXZlcworCSAgYXBwbGljYXRpb25zIGJldHRlciBjaGFuY2UgdG8gc3luYyBhbmFseXNpcyByZXN1bHRzIHdpdGggcGxheWJhY2suCisKKzIwMDgtMDgtMDkgMTQ6MDI6MjcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBXZSBuZWVkIHRvIGRyb3Agb25lIGFkZGl0aW9uYWwgYnVmZmVyIGZvciBGTEFDIGFzIHRoZSBmTGFDIG1hcmtlciBhbmQgU1RSRUFNSU5GTyBibG9jayBhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9tdXhfaGFuZGxlX3NpbmtfZXZlbnQpLAorCSAgKGZsYWNfc3RyZWFtaGVhZGVyX3RvX2NvZGVjZGF0YSk6CisJICBXZSBuZWVkIHRvIGRyb3Agb25lIGFkZGl0aW9uYWwgYnVmZmVyIGZvciBGTEFDIGFzIHRoZSBmTGFDCisJICBtYXJrZXIgYW5kIFNUUkVBTUlORk8gYmxvY2sgYXJlIG1lcmdlZCBpbnRvIG9uZSBidWZmZXIgaW4gdGhlIGNhcHMuCisJICBBbHNvIGRvbid0IHByZXRlbmQgdG8gc3VwcG9ydCBORVdTRUdNRU5UIGV2ZW50cywgb3RoZXJ3aXNlIHdlCisJICB3aWxsIG1vc3QgcHJvYmFibHkgd3JpdGUgc29tZSBpbnZhbGlkIGRhdGEuCisKKzIwMDgtMDgtMDkgMTM6NDg6MjIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBBZGQgc3VwcG9ydCBmb3IgbXV4aW5nIEZMQUMgaW50byBNYXRyb3NrYSBjb250YWluZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGZsYWNfc3RyZWFtaGVhZGVyX3RvX2NvZGVjZGF0YSksCisJICAoZ3N0X21hdHJvc2thX211eF9hdWRpb19wYWRfc2V0Y2Fwcyk6CisJICBBZGQgc3VwcG9ydCBmb3IgbXV4aW5nIEZMQUMgaW50byBNYXRyb3NrYSBjb250YWluZXJzLgorCSAgRml4ZXMgYnVnICMzMTE1ODYuCisKKzIwMDgtMDgtMDkgMDg6NTg6MjYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOiBBY3R1YWxseSBwcm92aWRlIHRoZSB2YXJpYWJsZXMgcmVxdWlyZWQgZm9yIHRoZSBmb3JtYXQgc3RyaW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzogKGdzdF9mbGFjX2VuY19jaGVja19kaXNjb250KToKKwkgIEFjdHVhbGx5IHByb3ZpZGUgdGhlIHZhcmlhYmxlcyByZXF1aXJlZCBmb3IgdGhlIGZvcm1hdCBzdHJpbmcuCisKKzIwMDgtMDgtMDggMTY6MjA6MjYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lio6IENsb3NlIHRoZSBjdXJyZW50IHNlZ21lbnQgaWYgd2UncmUgZG9pbmcgYSBub24tZmx1c2hpbmcgc2VlayBhbmQgc2VuZCB0aGUgY2xvc2Utc2VnbWVuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfcmVzZXQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9lbGVtZW50X3NlbmRfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc2Vla19ldmVudCksIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcCk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgQ2xvc2UgdGhlIGN1cnJlbnQgc2VnbWVudCBpZiB3ZSdyZSBkb2luZyBhIG5vbi1mbHVzaGluZyBzZWVrIGFuZCBzZW5kCisJICB0aGUgY2xvc2Utc2VnbWVudCBhbmQgdGhlIG5ldyBzZWdtZW50IG9mIHRoZSBzZWVrIGZyb20gdGhlIHN0cmVhbWluZworCSAgdGhyZWFkLgorCisyMDA4LTA4LTA4IDE1OjIwOjI0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9mbGFjL2dzdGZsYWNlbmMuKjogSGFuZGxlIG5vbi16ZXJvIHN0YXJ0IHRpbWVzdGFtcHMgY29ycmVjdGx5LCBtYXJrIGhlYWRlciBwYWNrZXRzIGFzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOiAoZ3N0X2ZsYWNfZW5jX3dyaXRlX2NhbGxiYWNrKSwKKwkgIChnc3RfZmxhY19lbmNfY2hlY2tfZGlzY29udCksIChnc3RfZmxhY19lbmNfY2hhaW4pLAorCSAgKGdzdF9mbGFjX2VuY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmg6CisJICBIYW5kbGUgbm9uLXplcm8gc3RhcnQgdGltZXN0YW1wcyBjb3JyZWN0bHksIG1hcmsgaGVhZGVyIHBhY2tldHMgYXMKKwkgIElOX0NBUFMgYW5kIHByaW50IGEgd2FybmluZyBhbmQgc3VnZ2VzdCB1c2luZyBhdWRpb3JhdGUgaWYgc3RyZWFtCisJICBkaXNjb250aW51aXRpZXMgYXJlIGRldGVjdGVkLiBXaGVuIEZMQUMgc3VwcG9ydHMgZmx1c2hpbmcgdGhlIGVuY29kZXIKKwkgIHNvbWVob3cgdGhpcyBzaG91bGQgYmUgZG9uZSBmb3IgZGlzY29udGludWl0aWVzIGluc3RlYWQuCisJICBSZW1vdmUgc29tZSB1bnVzZWQgdmFyaWFibGVzIGZyb20gdGhlIGluc3RhbmNlIHN0cnVjdC4KKworMjAwOC0wOC0wNyAxNzoxNDozOSArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBhZGQgcHVsc2VhdWRpbyB0byBwbHVnaW5zIGxpc3QgaW4gc3BlYyBmaWxlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCBwdWxzZWF1ZGlvIHRvIHBsdWdpbnMgbGlzdCBpbiBzcGVjIGZpbGUKKworMjAwOC0wOC0wNyAxNjoxMzo0MSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IElmIHNlZWtpbmcgZmFpbGVkIHJldHVybiB0aGUgYXBwcm9waWF0ZSByZXR1cm4gdmFsdWUgdG8gRkxBQy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY19lbmNfc2Vla19jYWxsYmFjayk6CisJICBJZiBzZWVraW5nIGZhaWxlZCByZXR1cm4gdGhlIGFwcHJvcGlhdGUgcmV0dXJuIHZhbHVlIHRvIEZMQUMuCisJICBPdGhlcndpc2UgaXQgdGhpbmtzIHNlZWtpbmcgd2FzIHN1Y2Nlc3NmdWxsIGFuZCB0cmllcyB0byByZXdyaXRlCisJICBwYXJ0cyBvZiB0aGUgaGVhZGVycyB3aGljaCB0aGVuIGdldCBhcHBlbmRlZCB0byB0aGUgb3V0cHV0LgorCisyMDA4LTA4LTA3IDE2OjExOjAwICswMDAwICBGcmVkZXJpYyBDcm96YXQgPGZjcm96YXRAbWFuZHJpdmEub3JnPgorCisJICBNYWtlIHN1cmUgZ2V0dGV4dCByZXR1cm5zIHRyYW5zbGF0aW9ucyBpbiBVVEYtOCBlbmNvZGluZyByYXRoZXIgdGhhbiBpbiB0aGUgY3VycmVudCBsb2NhbGUgZW5jb2RpbmcgKCM1NDY4MjIpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogRnJlZGVyaWMgQ3JvemF0IDxmY3JvemF0QG1hbmRyaXZhLm9yZz4KKwkgICogZXh0L2VzZC9nc3Rlc2QuYzogKHBsdWdpbl9pbml0KToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhYy5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrLmM6IChwbHVnaW5faW5pdCk6CisJICAqIHN5cy9vc3MvZ3N0b3NzYXVkaW8uYzogKHBsdWdpbl9pbml0KToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMi5jOiAocGx1Z2luX2luaXQpOgorCSAgTWFrZSBzdXJlIGdldHRleHQgcmV0dXJucyB0cmFuc2xhdGlvbnMgaW4gVVRGLTggZW5jb2RpbmcgcmF0aGVyCisJICB0aGFuIGluIHRoZSBjdXJyZW50IGxvY2FsZSBlbmNvZGluZyAoIzU0NjgyMikuCisKKzIwMDgtMDgtMDcgMTQ6NDA6MTMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiBBZGQgRklYTUUgZm9yIDAuMTEgdG8gc2ltcGx5IG91dHB1dCBldmVyeXRoaW5nIHdpdGggd2lkdGg9MzIgYXMgZ2l2ZW4gYnkgRkxBQyBhbmQgbGV0IGF1ZGlvY29uLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgQWRkIEZJWE1FIGZvciAwLjExIHRvIHNpbXBseSBvdXRwdXQgZXZlcnl0aGluZyB3aXRoIHdpZHRoPTMyIGFzIGdpdmVuCisJICBieSBGTEFDIGFuZCBsZXQgYXVkaW9jb252ZXJ0IGhhbmRsZSB0aGUgY29udmVyc2lvbnMgaW5zdGVhZCBvZiBkb2luZworCSAgdGhlbSBpbiBmbGFjZGVjLgorCisyMDA4LTA4LTA3IDEwOjIyOjMyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiBXaGVuIG91dHB1dHRpbmcgYSBwYWQgdGVtcGxhdGUgcmFuZ2UgZm9yIHRoZSBzaXplLCBpbmNsdWRlIGEgZnJhbWVyYXRlIHJhbmdlIHRvbywgdG8gYXZvaWQgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfcHJvYmVfY2Fwc19mb3JfZm9ybWF0KToKKwkgIFdoZW4gb3V0cHV0dGluZyBhIHBhZCB0ZW1wbGF0ZSByYW5nZSBmb3IgdGhlIHNpemUsIGluY2x1ZGUgYSBmcmFtZXJhdGUKKwkgIHJhbmdlIHRvbywgdG8gYXZvaWQgJ25vdCBhIHJlYWwgc3Vic2V0IG9mIHRlbXBsYXRlIGNhcHMnIGVycm9ycy4KKworMjAwOC0wOC0wNiAxNTozNDo1NSArMDAwMCAgSm9uYXRoYW4gTWF0dGhldyA8bm90dmVyeXNtYXJ0QGdtYWlsLmNvbT4KKworCSAgZXh0L2ZsYWMvOiBQb3J0IGZsYWN0YWcgdG8gMC4xMCwgYWRkIGRvY3VtZW50YXRpb24gZm9yIGl0IGFuZCBjbGVhbiBpdCB1cCBhIGJpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gYSBwYXRjaCBieTogSm9uYXRoYW4gTWF0dGhldyA8bm90dmVyeXNtYXJ0IGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGV4dC9mbGFjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzogKGdzdF9mbGFjX3RhZ19zZXR1cF9pbnRlcmZhY2VzKSwKKwkgIChnc3RfZmxhY190YWdfYmFzZV9pbml0KSwgKGdzdF9mbGFjX3RhZ19jbGFzc19pbml0KSwKKwkgIChnc3RfZmxhY190YWdfZGlzcG9zZSksIChnc3RfZmxhY190YWdfaW5pdCksCisJICAoZ3N0X2ZsYWNfdGFnX3Npbmtfc2V0Y2FwcyksIChnc3RfZmxhY190YWdfY2hhaW4pLAorCSAgKGdzdF9mbGFjX3RhZ19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjdGFnLmg6CisJICBQb3J0IGZsYWN0YWcgdG8gMC4xMCwgYWRkIGRvY3VtZW50YXRpb24gZm9yIGl0IGFuZCBjbGVhbiBpdCB1cCBhIGJpdC4KKwkgIEZpeGVzIGJ1ZyAjNDEzODQxLgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjX2RlY19iYXNlX2luaXQpOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmg6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzogKGdzdF9mbGFjX2VuY19iYXNlX2luaXQpOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmg6CisJICBBZGQgZmxhY3RhZyBhbmQgZmxhY2VuYyB0byB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgbWFyaworCSAgdGhlIHByaXZhdGUgcGFydHMgb2YgdGhlIGZsYWNkZWMgaW5zdGFuY2Ugc3RydWN0dXJlIGFzIHByaXZhdGUuCisJICBBbHNvIHVzZSBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUoKSBpbiBmbGFjZGVjIGFuZAorCSAgZmxhY2VuYy4KKworMjAwOC0wOC0wNiAxMzoxMjowNyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFVzZSBhdWRpby94LXFkbSBmb3IgY2Fwcy4gQ29sbGVjdCBzb21lIGluZm8gLSBtcGxheWVyIGhhcyBhIGRlY29kZXIgZm9yIGl0IGJ1dCBmZm1wZWcgZG9lcyBub3QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgVXNlIGF1ZGlvL3gtcWRtIGZvciBjYXBzLiBDb2xsZWN0IHNvbWUgaW5mbyAtIG1wbGF5ZXIgaGFzIGEgZGVjb2RlcgorCSAgZm9yIGl0IGJ1dCBmZm1wZWcgZG9lcyBub3QuCisKKzIwMDgtMDgtMDUgMTU6MDU6NDQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IEhhbmRsZSB0aGUgbGlzdCBjaHVuayBhbmQgdXNlIGdzdF9yaWZmX3BhcnNlX2luZm8oKSB0byBwYXJzZSB0aGUgaW5mbyBzdWItY2h1bmsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBIYW5kbGUgdGhlIGxpc3QgY2h1bmsgYW5kIHVzZSBnc3RfcmlmZl9wYXJzZV9pbmZvKCkgdG8gcGFyc2UgdGhlIGluZm8KKwkgIHN1Yi1jaHVuay4KKworMjAwOC0wOC0wNSAxNDoyMjoxMiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogSGFuZGxlIHRoZSBhY2lkIGNodW5rIGFuZCBzZW5kIHRlbXBvIGFzIHBhcnQgb2YgdGFncy4gT3RoZXIgZmllbGRzIGFyZSBpbnRlcmVzdGluZyB0b28sIGIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIEhhbmRsZSB0aGUgYWNpZCBjaHVuayBhbmQgc2VuZCB0ZW1wbyBhcyBwYXJ0IG9mIHRhZ3MuIE90aGVyIGZpZWxkcyBhcmUKKwkgIGludGVyZXN0aW5nIHRvbywgYnV0IG5lZWQgbW9yZSB0YWctZGVmaW5pdGlvbnMuIEZpeGVzICM1NDU0MzMuCisKKzIwMDgtMDgtMDUgMTQ6MTY6MzIgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IFJlZmFjdG9yIHdhdnBhcnNlLiBDYWxsIF9yZXNldCgpIGZyb20gZGlzcG9zZSgpIGFuZCBtb3ZlIG9sZCBjb2RlIGZyb20gZGlzcG9zZSBpbnRvIHJlc2V0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBSZWZhY3RvciB3YXZwYXJzZS4gQ2FsbCBfcmVzZXQoKSBmcm9tIGRpc3Bvc2UoKSBhbmQgbW92ZSBvbGQgY29kZSBmcm9tCisJICBkaXNwb3NlIGludG8gcmVzZXQuIFRoaXMgd2F5IHdlIGRvbid0IGxlYWsgdGFnbGlzdHMgd2hlbiB3ZSBhYm9ydAorCSAgcGFyc2luZy4gRml4IHNvbWUgY29tbWVudHMuIE1vdmUgY29kZSBmb3Igc2tpcHBpbmcgYSBjaHVuayBpbnRvIGV4dHJhCisJICBmdW5jdGlvbi4gUmVwbGFjZSBjaHVuayBzaXplcyB3aXRoIGEgY29uc3QgdG8gZWFzZSByZWFkYWJpbGl0eS4KKworMjAwOC0wOC0wNSAxMzo1Nzo1NyArMDAwMCAgQXVyZWxpZW4gR3JpbWF1ZCA8Z3N0ZWx6ekB5YWhvby5mcj4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBJbXByb3ZlIHVkcCBwb3J0IHNldHVwLiBGaXhlcyAjNTQ1NzEwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQXVyZWxpZW4gR3JpbWF1ZCA8Z3N0ZWx6eiBhdCB5YWhvbyBkb3QgZnI+CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2FsbG9jX3VkcF9wb3J0cyk6CisJICBJbXByb3ZlIHVkcCBwb3J0IHNldHVwLiBGaXhlcyAjNTQ1NzEwLgorCisyMDA4LTA4LTA1IDEzOjU0OjE4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogQWRkIE1QMVMgZGVwYXlsb2FkZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuYzogKGdzdF9ydHBfbXAxc19kZXBheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfbXAxc19kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfbXAxc19kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX21wMXNfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX21wMXNfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF9tcDFzX2RlcGF5X3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9tcDFzX2RlcGF5X2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9tcDFzX2RlcGF5X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0cF9tcDFzX2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDFzZGVwYXkuaDoKKwkgIEFkZCBNUDFTIGRlcGF5bG9hZGVyLgorCSAgKiBnc3QvcnRzcC9VUkxTOgorCSAgU29tZSBtb3JlIHNhbXBsZSBydHNwIHN0cmVhbXMuCisKKzIwMDgtMDgtMDUgMDg6NDM6NDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL1VSTFM6IEFkZCBhbm90aGVyIFVSTC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9VUkxTOgorCSAgQWRkIGFub3RoZXIgVVJMLgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jOiAodGVzdF90YWdsaWJfaWQzbXV4X3dpdGhfdGFncyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnbGltaXRlci5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgQWRkIHNvbWUgbW9yZSBkZWJ1ZyBpbmZvLgorCisyMDA4LTA4LTA0IDA5OjE2OjQwICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguYzogUHJvdmlkZSBjYlNpemUgZmllbGQgZm9yIGF1ZGlvIGV4dHJhX2RhdGEgc2l6ZSwgYW5kIHRha2UgY2FyZSB0byBwYWQgZXh0cmFfZGF0YS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpX2hlYWRlcik6CisJICBQcm92aWRlIGNiU2l6ZSBmaWVsZCBmb3IgYXVkaW8gZXh0cmFfZGF0YSBzaXplLCBhbmQgdGFrZSBjYXJlIHRvCisJICBwYWQgZXh0cmFfZGF0YS4KKworMjAwOC0wOC0wNCAwNzoyMzowNyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFJldHVybiB0aGUgcmVzdWx0IG9mIGdzdF9wYWRfe3N0YXJ0LHN0b3B9X3Rhc2sgaW5zdGVhZCBvZiBoYXJkLWNvZGVkCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgUmV0dXJuIHRoZSByZXN1bHQgb2YgZ3N0X3BhZF97c3RhcnQsc3RvcH1fdGFzayBpbnN0ZWFkIG9mIGhhcmQtY29kZWQKKwkgIFRSVUUuCisKKzIwMDgtMDgtMDQgMDc6MTc6MzggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvOiBBZGQga2V5d29yZCB0YWcgc3VwcG9ydC4gRml4ZXMgIzUyMDY5NCBmb3IgcXRkZW11eC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZm91cmNjLmg6CisJICBBZGQga2V5d29yZCB0YWcgc3VwcG9ydC4gRml4ZXMgIzUyMDY5NCBmb3IgcXRkZW11eC4KKworMjAwOC0wOC0wNCAwNzowNTozMyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEFkZCBzdXBwb3J0IGZvciB0bXBvIHRhZyAoQlBNKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBBZGQgc3VwcG9ydCBmb3IgdG1wbyB0YWcgKEJQTSkuCisKKzIwMDgtMDgtMDMgMTI6MjM6NDkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOiBTZXQgYW4gZXN0aW1hdGUgZm9yIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2FtcGxlcyB0aGF0IHdpbGwgYmUgZW5jb2RlZCBpZiBwb3NzaWJsZSB0byBoZWxwIGRlY29kLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOiAoZ3N0X2ZsYWNfZW5jX3F1ZXJ5X3BlZXJfdG90YWxfc2FtcGxlcyksCisJICAoZ3N0X2ZsYWNfZW5jX3Npbmtfc2V0Y2FwcyksIChnc3RfZmxhY19lbmNfd3JpdGVfY2FsbGJhY2spOgorCSAgU2V0IGFuIGVzdGltYXRlIGZvciB0aGUgdG90YWwgbnVtYmVyIG9mIHNhbXBsZXMgdGhhdCB3aWxsIGJlIGVuY29kZWQKKwkgIGlmIHBvc3NpYmxlIHRvIGhlbHAgZGVjb2RlcnMgaWYgdGhlIHN0cmVhbWluZm8gY2FuJ3QgYmUgcmV3cml0dGVuCisJICBsYXRlciAobGlrZSB3aGVuIG11eGluZyBpbnRvIE9nZyBjb250YWluZXJzKS4KKwkgIEFkZCBhIHdhcm5pbmcgaWYgd2UgZ2V0IGhlYWRlciBwYWNrZXRzIGFmdGVyIGRhdGEgcGFja2V0cyBhcyB0aG9zZQorCSAgd2lsbCBnZXQgbG9zdCB3aGVuIG11eGluZyBpbnRvIE9nZywgaS5lLiByZXdyaXRpbmcgdGhlIGhlYWRlcnMgZG9lc24ndAorCSAgd29yay4KKworMjAwOC0wOC0wMyAxMTozODoyMiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IFN1cHBvcnQgZGVjb2Rpbmcgb2YgYWxsIGRlcHRocyBiZXR3ZWVuIDQgYW5kIDMyIGJpdHMgYW5kIHJlYWQgdGhlIGRlcHRoIGZyb20gdGhlIHN0cmVhbWluZm8gaGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfbWV0YWRhdGFfY2FsbGJhY2spLAorCSAgKGdzdF9mbGFjX2RlY193cml0ZSk6CisJICBTdXBwb3J0IGRlY29kaW5nIG9mIGFsbCBkZXB0aHMgYmV0d2VlbiA0IGFuZCAzMiBiaXRzIGFuZCByZWFkIHRoZQorCSAgZGVwdGggZnJvbSB0aGUgc3RyZWFtaW5mbyBoZWFkZXIgaWYgbmVlZGVkLiBBbHNvIHN1cHBvcnQgYWxsIHNhbXBsaW5nCisJICByYXRlcyBiZXR3ZWVuIDEgYW5kIDY1NTM1MCBIei4KKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgKGdzdF9mbGFjX2VuY19jYXBzX2FwcGVuZF9zdHJ1Y3R1cmVfd2l0aF93aWR0aHMpLAorCSAgKGdzdF9mbGFjX2VuY19zaW5rX2dldGNhcHMpLCAoZ3N0X2ZsYWNfZW5jX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X2ZsYWNfZW5jX2NoYWluKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5oOgorCSAgU3VwcG9ydCBlbmNvZGluZyBpbiBhbGwgYml0IGRlcHRocyBzdXBwb3J0ZWQgYnkgdGhlIHN0cmVhbWFibGUKKwkgIHN1YmZvcm1hdCAoaS5lLiA4LCAxMiwgMTYsIDIwIGFuZCAyNCBiaXRzKSBhbmQgYWxsIHNhbXBsaW5nIHJhdGVzCisJICBiZXR3ZWVuIDEgSHogYW5kIDY1NTM1MCBIei4KKworMjAwOC0wOC0wMyAwOToyMzoxNCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IFN1cHBvcnQgZW5jb2Rpbmcgb2YgdXAgdG8gOCBjaGFubmVscy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY19lbmNfaW5pdCksCisJICAoZ3N0X2ZsYWNfZW5jX3NpbmtfZ2V0Y2Fwcyk6CisJICBTdXBwb3J0IGVuY29kaW5nIG9mIHVwIHRvIDggY2hhbm5lbHMuCisKKzIwMDgtMDgtMDIgMjE6Mzk6MDEgKzAwMDAgIFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisKKwkgIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLio6IEZpeCBzZWVraW5nIHJhY2UgY29uZGl0aW9uIGluICM1NDAzMDAKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgRml4IHNlZWtpbmcgcmFjZSBjb25kaXRpb24gaW4gIzU0MDMwMAorCSAgUGF0Y2ggQnk6IFdvdXRlciBDbG9ldGVucyAgPHdvdXRlciBhdCBtaW5kIGJlPgorCisyMDA4LTA4LTAyIDE4OjM1OjIxICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBXaGVuIHJlY2VpdmluZyBhIFNFRUsgZXZlbnQgb24gYSBzcGVjaWZpYyBwYWQgZmlyc3Qgc2VhcmNoIGZvciBhIHNlZWsgdGFibGUgZW50cnkgZm9yIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thZGVtdXhfZG9faW5kZXhfc2VlayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2VsZW1lbnRfc2VuZF9ldmVudCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NyY19ldmVudCk6CisJICBXaGVuIHJlY2VpdmluZyBhIFNFRUsgZXZlbnQgb24gYSBzcGVjaWZpYyBwYWQgZmlyc3Qgc2VhcmNoIGZvciBhIHNlZWsKKwkgIHRhYmxlIGVudHJ5IGZvciB0aGUgc3RyZWFtIG9mIHRoZSBwYWQgYW5kIHRoZW4gZmFsbCBiYWNrIHRvIGFuIGVudHJ5CisJICBmb3IgYSBkaWZmZXJlbnQgc3RyZWFtLgorCisyMDA4LTA4LTAyIDE4OjIwOjQ0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIEJ1aWxkIGRlcGVuZCBvbiBjb3JlIENWUyBmb3IgdGhlIGF0dGFjaG1lbnQgdGFnLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5jOiAoZ3N0X21hdHJvc2thX3JlZ2lzdGVyX3RhZ3MpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBCdWlsZCBkZXBlbmQgb24gY29yZSBDVlMgZm9yIHRoZSBhdHRhY2htZW50IHRhZy4KKworMjAwOC0wOC0wMiAxODoxODowNSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBEZWNvZGUgdGhlIGNvZGVjIHByaXZhdGUgZGF0YSBhbmQgZm9sbG93aW5nIENvbnRlbnRFbmNvZGluZyBpZiBuZWNlc3NhcnkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvbWF0cm9za2EvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tYXRyb3NrYS9sem8uYzogKGdldF9ieXRlKSwgKGdldF9sZW4pLCAoY29weSksCisJICAoY29weV9iYWNrcHRyKSwgKGx6bzF4X2RlY29kZSksIChtYWluKToKKwkgICogZ3N0L21hdHJvc2thL2x6by5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcmVhZF90cmFja19lbmNvZGluZyksCisJICAoZ3N0X21hdHJvc2thX2RlY29tcHJlc3NfZGF0YSksIChnc3RfbWF0cm9za2FfZGVjb2RlX2RhdGEpLAorCSAgKGdzdF9tYXRyb3NrYV9kZWNvZGVfYnVmZmVyKSwKKwkgIChnc3RfbWF0cm9za2FfZGVjb2RlX2NvbnRlbnRfZW5jb2RpbmdzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcmVhZF90cmFja19lbmNvZGluZ3MpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIERlY29kZSB0aGUgY29kZWMgcHJpdmF0ZSBkYXRhIGFuZCBmb2xsb3dpbmcgQ29udGVudEVuY29kaW5nIGlmCisJICBuZWNlc3NhcnkuCisJICBTdXBwb3J0IGJ6aXAyLCBsem8gYW5kIGhlYWRlciBzdHJpcHBlZCBjb21wcmVzc2lvbi4gRm9yIGx6byB1c2UgdGhlCisJICBmZm1wZWcgbHpvIGltcGxlbWVudGF0aW9uIGFzIGxpYmx6byBpcyBHUEwgbGljZW5zZWQuCisJICBGaXggemxpYiBkZWNvbXByZXNzaW9uLgorCisyMDA4LTA4LTAyIDE4OjExOjMyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogRml4IG11eGluZyBvZiBNUDMvTVAyIHdpdGggZGlmZmVyZW50IE1QRUcgdmVyc2lvbnMgYnkgY2FsY3VsYXRpbmcgdGhlIGR1cmF0aW9uIG9mIGEgZnJhbS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIChnc3RfbWF0cm9za2FfbXV4X2F1ZGlvX3BhZF9zZXRjYXBzKToKKwkgIEZpeCBtdXhpbmcgb2YgTVAzL01QMiB3aXRoIGRpZmZlcmVudCBNUEVHIHZlcnNpb25zIGJ5IGNhbGN1bGF0aW5nIHRoZQorCSAgZHVyYXRpb24gb2YgYSBmcmFtZSB3aXRoIHRoZSBuZXcgbXBlZ2F1ZGlvdmVyc2lvbiBjYXBzIGZpZWxkLgorCisyMDA4LTA4LTAyIDE4OjA2OjIwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC4qOiBBbGxvdyBhbiBpbmZpbml0ZSBudW1iZXIgb2Ygc3RyZWFtIGluc2lkZSBNYXRyb3NrYSBjb250YWluZXJzIGFuZCB1c2UgYSBHUHRyQXJyYXkgZm9yIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X2ZpbmFsaXplKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfY2xhc3NfaW5pdCksIChnc3RfbWF0cm9za2FfZGVtdXhfaW5pdCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2NvbWJpbmVfZmxvd3MpLCAoZ3N0X21hdHJvc2thX2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3RyZWFtX2Zyb21fbnVtKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfdHJhY2tudW1iZXJfdW5pcXVlKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSksIChnc3RfbWF0cm9za2FfZGVtdXhfc2VuZF9ldmVudCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3luY19zdHJlYW1zKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3ApOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkgIEFsbG93IGFuIGluZmluaXRlIG51bWJlciBvZiBzdHJlYW0gaW5zaWRlIE1hdHJvc2thIGNvbnRhaW5lcnMgYW5kIHVzZQorCSAgYSBHUHRyQXJyYXkgZm9yIHN0b3JpbmcgdGhlbSBpbnN0ZWFkIG9mIGFsbG93aW5nICJvbmx5IiAxMjcgc3RyZWFtcy4KKworMjAwOC0wOC0wMiAxODowMTozNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvOiBGaXggaW5kZW50aW9uIGV2ZXJ5d2hlcmUuIEEgYnJva2VuIGluZGVudCB2ZXJzaW9uIGhhcyBhZGRlZCBuZXdsaW5lcyBhZnRlciBldmVyeSBzaW5nbGUgZGVjbGFyYXRpb24gc28uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9yZWFkX2NsYXNzX2luaXQpLAorCSAgKGdzdF9lYm1sX3JlYWRfY2hhbmdlX3N0YXRlKSwgKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9sZXZlbF91cCksCisJICAoZ3N0X2VibWxfcmVhZF9wZWVrX2J5dGVzKSwgKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9pZCksCisJICAoZ3N0X2VibWxfcmVhZF9lbGVtZW50X2xlbmd0aCksIChnc3RfZWJtbF9wZWVrX2lkKSwKKwkgIChnc3RfZWJtbF9yZWFkX2dldF9sZW5ndGgpLCAoZ3N0X2VibWxfcmVhZF9za2lwKSwKKwkgIChnc3RfZWJtbF9yZWFkX2J1ZmZlciksIChnc3RfZWJtbF9yZWFkX2J5dGVzKSwKKwkgIChnc3RfZWJtbF9yZWFkX3VpbnQpLCAoZ3N0X2VibWxfcmVhZF9zaW50KSwgKF9leHQyZGJsKSwKKwkgIChnc3RfZWJtbF9yZWFkX2Zsb2F0KSwgKGdzdF9lYm1sX3JlYWRfYXNjaWkpLCAoZ3N0X2VibWxfcmVhZF9kYXRlKSwKKwkgIChnc3RfZWJtbF9yZWFkX21hc3RlciksIChnc3RfZWJtbF9yZWFkX2JpbmFyeSksCisJICAoZ3N0X2VibWxfcmVhZF9oZWFkZXIpOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOiAoZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9pZCksCisJICAoZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9zaXplKSwgKGdzdF9lYm1sX3dyaXRlX3VpbnQpLAorCSAgKGdzdF9lYm1sX3dyaXRlX3NpbnQpLCAoZ3N0X2VibWxfd3JpdGVfYXNjaWkpLAorCSAgKGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCksIChnc3RfZWJtbF93cml0ZV9tYXN0ZXJfZmluaXNoKSwKKwkgIChnc3RfZWJtbF9yZXBsYWNlX3VpbnQpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9yZXNldCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3JlYWRfdHJhY2tfZW5jb2RpbmcpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9yZWFkX3RyYWNrX2VuY29kaW5ncyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9zdHJlYW0pLCAoZ3N0X21hdHJvc2thZGVtdXhfZG9faW5kZXhfc2VlayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9lbGVtZW50X3NlbmRfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc2Vla19ldmVudCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9pbml0X3N0cmVhbSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX3RyYWNrcyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZGV4X2N1ZXRyYWNrKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfaW5kZXhfcG9pbnRlbnRyeSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZGV4KSwgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmZvKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfbWV0YWRhdGFfaWRfc2ltcGxlX3RhZyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX21ldGFkYXRhX2lkX3RhZyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX21ldGFkYXRhKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYXR0YWNoZWRfZmlsZSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2F0dGFjaG1lbnRzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfY2hhcHRlcnMpLCAoZ3N0X21hdHJvc2thX2VibWxudW1fdWludCksCisJICAoZ3N0X21hdHJvc2thX2VibWxudW1fc2ludCksIChnc3RfbWF0cm9za2FfZGVtdXhfcHVzaF9oZHJfYnVmKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcHVzaF9mbGFjX2NvZGVjX3ByaXZfZGF0YSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3B1c2hfeGlwaF9jb2RlY19wcml2X2RhdGEpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wdXNoX2R2ZF9jbHV0X2NoYW5nZV9ldmVudCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9tcGVnX3NlcV9oZWFkZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfd3Zwa19oZWFkZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9jaGVja19zdWJ0aXRsZV9idWZmZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZWNvZGVfYnVmZmVyKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NsdXN0ZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9jb250ZW50c19zZWVrZW50cnkpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9jb250ZW50cyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3Bfc3RyZWFtX3BhcnNlX2lkKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcF9zdHJlYW0pLCAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3ApLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF92aWRlb19jYXBzKSwgKGdzdF9tYXRyb3NrYV9kZW11eF9hdWRpb19jYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3VidGl0bGVfY2FwcyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuYzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9jbGFzc19pbml0KSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3Jlc2V0KSwgKGdzdF9tYXRyb3NrYV9tdXhfaGFuZGxlX3NpbmtfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfdmlkZW9fcGFkX3NldGNhcHMpLAorCSAgKHhpcGgzX3N0cmVhbWhlYWRlcl90b19jb2RlY2RhdGEpLAorCSAgKHZvcmJpc19zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhKSwKKwkgICh0aGVvcmFfc3RyZWFtaGVhZGVyX3RvX2NvZGVjZGF0YSksCisJICAoZ3N0X21hdHJvc2thX211eF9hdWRpb19wYWRfc2V0Y2FwcyksCisJICAoZ3N0X21hdHJvc2thX211eF9yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X21hdHJvc2thX211eF9yZWxlYXNlX3BhZCksCisJICAoZ3N0X21hdHJvc2thX211eF90cmFja19oZWFkZXIpLCAoZ3N0X21hdHJvc2thX211eF9zdGFydCksCisJICAoZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnKSwgKGdzdF9tYXRyb3NrYV9tdXhfZmluaXNoKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X2Jlc3RfcGFkKSwgKGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfZGF0YSksCisJICAoZ3N0X21hdHJvc2thX211eF9jb2xsZWN0ZWQpLCAoZ3N0X21hdHJvc2thX211eF9jaGFuZ2Vfc3RhdGUpOgorCSAgRml4IGluZGVudGlvbiBldmVyeXdoZXJlLiBBIGJyb2tlbiBpbmRlbnQgdmVyc2lvbiBoYXMgYWRkZWQgbmV3bGluZXMKKwkgIGFmdGVyIGV2ZXJ5IHNpbmdsZSBkZWNsYXJhdGlvbiBzb21lIHRpbWUgYWdvLgorCisyMDA4LTA4LTAyIDE3OjU5OjA1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBJZiBubyBUcmFja3MgYXJlIGZvdW5kIGVycm9yIG91dCBpbnN0ZWFkIG9mIHRyeWluZyBpdCBhZ2FpbiB1bnRpbCB0aGUgZW5kIG9mIHRpbWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3Bfc3RyZWFtX3BhcnNlX2lkKToKKwkgIElmIG5vIFRyYWNrcyBhcmUgZm91bmQgZXJyb3Igb3V0IGluc3RlYWQgb2YgdHJ5aW5nIGl0IGFnYWluIHVudGlsIHRoZQorCSAgZW5kIG9mIHRpbWUuCisKKzIwMDgtMDgtMDIgMTc6NTc6MzEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IEZpeCBkZW11eGluZyBvZiByYXcgaW50ZWdlciBhdWRpby4gVGhlIHNhbXBsZXMgYXJlIHVuc2lnbmVkIG9ubHkgZm9yIDggYml0IGFuZCBzaWduZWQgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYXVkaW9fY2Fwcyk6CisJICBGaXggZGVtdXhpbmcgb2YgcmF3IGludGVnZXIgYXVkaW8uIFRoZSBzYW1wbGVzIGFyZSB1bnNpZ25lZCBvbmx5IGZvciA4CisJICBiaXQgYW5kIHNpZ25lZCBvdGhlcndpc2UsIG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKworMjAwOC0wOC0wMiAxNzo1NDowNCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IEFkZCBtb3JlIHJhdyBZVVYgZm9ybWF0cyB0byB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgZm9ybWF0cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBBZGQgbW9yZSByYXcgWVVWIGZvcm1hdHMgdG8gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGZvcm1hdHMuCisKKzIwMDgtMDgtMDIgMTc6NTI6MTYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBBZGQgc3VwcG9ydCBmb3IgbXV4aW5nIHJhdyBmbG9hdCBhdWRpbyBub3cgdGhhdCB0aGUgc3BlYyBkZWZpbmVzIHRoZSBlbmRpYW5uZXNzIGFuZCBhZGQgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX3NldGNhcHMpOgorCSAgQWRkIHN1cHBvcnQgZm9yIG11eGluZyByYXcgZmxvYXQgYXVkaW8gbm93IHRoYXQgdGhlIHNwZWMgZGVmaW5lcyB0aGUKKwkgIGVuZGlhbm5lc3MgYW5kIGFkZCBzdXBwb3J0IGZvciBtdXhpbmcgcmF3IGludGVnZXIgYXVkaW8gd2l0aCAyNCBhbmQKKwkgIDMyIGJpdHMuCisJICBBbGxvdyBtdXhpbmcgb2YgbW9yZSB0aGFuIDggYXVkaW8gY2hhbm5lbHMuCisKKzIwMDgtMDgtMDIgMTc6NDc6MzIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBBZGQgbG9ja2luZyB0byB0aGUgZ2xvYmFsIGFycmF5IG9mIHVzZWQgdHJhY2sgVUlEcyB0byBwcmV2ZW50IHJhbmRvbSBjcmFzaGVzIGlmIG1vcmUgdGhhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9jcmVhdGVfdWlkKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3Jlc2V0KSwgKGdzdF9tYXRyb3NrYV9tdXhfc3RhcnQpOgorCSAgQWRkIGxvY2tpbmcgdG8gdGhlIGdsb2JhbCBhcnJheSBvZiB1c2VkIHRyYWNrIFVJRHMgdG8gcHJldmVudCByYW5kb20KKwkgIGNyYXNoZXMgaWYgbW9yZSB0aGFuIGEgc2luZ2xlIG1hdHJvc211eCBpbnN0YW5jZSBpcyB1c2VkLgorCSAgVXNlIDY0IGJpdCB2YWx1ZXMgZm9yIHRoZSB0cmFjayBVSURzLgorCSAgVXNlIHRoZSBnbG9iYWwgR1JhbmRvbSBvZiBHTGliIGluc3RlYWQgb2YgY3JlYXRpbmcgb3VyIG93biBvbmUKKwkgIGZvciB0aGUgZmV3IHJhbmRvbSBudW1iZXJzIHdlIG5lZWQgZXZlcnkgc2luZ2xlIHRpbWUuCisKKzIwMDgtMDgtMDIgMTc6MTg6NDcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiBBbHdheXMgcG9zdCB0aGUgYXVkaW8tY29kZWMgdGFnLCBub3Qgb25seSBpZiBvdGhlciB0YWdzIGFyZSBwcmVzZW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjX2RlY19zZXR1cF9zZWVrYWJsZV9kZWNvZGVyKSwKKwkgIChnc3RfZmxhY19kZWNfc2V0dXBfc3RyZWFtX2RlY29kZXIpLAorCSAgKGdzdF9mbGFjX2RlY191cGRhdGVfbWV0YWRhdGEpOgorCSAgQWx3YXlzIHBvc3QgdGhlIGF1ZGlvLWNvZGVjIHRhZywgbm90IG9ubHkgaWYgb3RoZXIgdGFncyBhcmUgcHJlc2VudC4KKworMjAwOC0wOC0wMSAyMzoyNjo1MCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogQmFjayB0byBkZXZlbG9wbWVudCAtPiAwLjEwLjkuMQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gZGV2ZWxvcG1lbnQgLT4gMC4xMC45LjEKKworMjAwOC0wOC0wMSAxNTo1ODo0NyArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBhZGQgbWlzc2luZyBnc3RyZWFtZXIgcGx1Z2lucyB0byBzcGVjIGZpbGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkIG1pc3NpbmcgZ3N0cmVhbWVyIHBsdWdpbnMgdG8gc3BlYyBmaWxlCisKKz09PSByZWxlYXNlIDAuMTAuOSA9PT0KKworMjAwOC0wNy0zMSAyMjoxMDoxNyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Rpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wdWxzZWF1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiBnc3QtcGx1Z2lucy1nb29kLmRvYXA6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTAuOQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBSZWxlYXNlIDAuMTAuOQorCisyMDA4LTA3LTMxIDIxOjUwOjQ0ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY3MucG86CisJKiBwby9kYS5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vZXMucG86CisJKiBwby9ldS5wbzoKKwkqIHBvL2ZpLnBvOgorCSogcG8vZnIucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9sdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcHRfQlIucG86CisJKiBwby9ydS5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA4LTA3LTMxIDIxOjI2OjQ4ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogRG9uJ3QgdGhyb3cgYW4gZXJyb3Igd2hlbiBzb3VwIGNvbXBsZXRlcyBhIG1zZyB3aXRoIHN0YXR1cyAnY2FuY2VsbGVkJywgYXMgdGhhdCBpbmRpY2F0ZXMgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzoKKwkgIERvbid0IHRocm93IGFuIGVycm9yIHdoZW4gc291cCBjb21wbGV0ZXMgYSBtc2cgd2l0aCBzdGF0dXMKKwkgICdjYW5jZWxsZWQnLCBhcyB0aGF0IGluZGljYXRlcyB3ZSBjYW5jZWxsZWQgYSByZXF1ZXN0IHdoaWxlCisJICBzaHV0dGluZyBkb3duIG9yIHNlZWtpbmcsIGFuZCBpdCdzIG5vdCBhbiBlcnJvci4KKwkgIEZpeGVzOiAjNTQwMzAwIGFnYWluLgorCisyMDA4LTA3LTI4IDIwOjE3OjQ2ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgY29uZmlndXJlLmFjOiAwLjEwLjguNCBwcmUtcmVsZWFzZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIDAuMTAuOC40IHByZS1yZWxlYXNlCisKKzIwMDgtMDctMjUgMTQ6NTA6MDMgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRml4IHNlZ21lbnQtc3RvcCByZWdyZXNzaW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2FjdGl2YXRlX3NlZ21lbnQpOgorCSAgRml4IHNlZ21lbnQtc3RvcCByZWdyZXNzaW9uLgorCSAgQWRkIGRvY3VtZW50YXRpb24gcmVnYXJkaW5nIHNlZ21lbnRzIGluIHF1aWNrdGltZSBmaWxlcyBieSBXaW0gVGF5bWFucy4KKwkgIEZpeGVzICM1NDQ1MDkKKworMjAwOC0wNy0yNCAyMzo1NTo1OCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogMC4xMC44LjMgcHJlLXJlbGVhc2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAwLjEwLjguMyBwcmUtcmVsZWFzZQorCSAgKiBwby9MSU5HVUFTOgorCSAgKiBwby9wdF9CUi5wbzoKKwkgIEFkZCBwdF9CUiB0cmFuc2xhdGlvbgorCisyMDA4LTA3LTIzIDIyOjAxOjIwICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIGdzdC9nb29tLzogRml4IGJ1aWxkIHdpdGggTVNWQzogaW5jbHVkZSBnbGliLmggdG8gZGVmaW5lIGlubGluZSBhcHByb3ByaWF0ZWx5LCB1c2UgaGVhZGVyIGd1YXJkcyB3aGVyZSBuZWVkZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vY29udm9sdmVfZnguYzoKKwkgICogZ3N0L2dvb20vZmlsdGVycy5jOgorCSAgKiBnc3QvZ29vbS9nb29tX2NvbmZpZy5oOgorCSAgKiBnc3QvZ29vbS9nb29tX2NvcmUuYzoKKwkgICogZ3N0L2dvb20vZ29vbV90b29scy5oOgorCSAgRml4IGJ1aWxkIHdpdGggTVNWQzogaW5jbHVkZSBnbGliLmggdG8gZGVmaW5lIGlubGluZSBhcHByb3ByaWF0ZWx5LAorCSAgdXNlIGhlYWRlciBndWFyZHMgd2hlcmUgbmVlZGVkLgorCSAgKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICBGaXggYnVpbGQgd2l0aCBNU1ZDOiB1c2UgV1NBKiBjb25zdGFudHMvZnVuY3Rpb25zIHdoZXJlIGFwcHJvcHJpYXRlLCB1c2UKKwkgIGdfc25wcmludGYgcmF0aGVyIHRoYW4gc25wcmludGYuCisJICBGaXhlcyAjNTQ0NDMzLgorCisyMDA4LTA3LTIyIDA2OjMyOjAzICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9kZWJ1Zy9nc3R0YWdpbmplY3QuKjogU2VudCB0YWdzIGluIF90cmFuc2Zvcm1faXAoKSBpbnN0ZWFkIG9mIF9zdGFydCgpLiBGaXhlcyAjNTQzNDA0IHBhcnRpYWxseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVidWcvZ3N0dGFnaW5qZWN0LmM6CisJICAqIGdzdC9kZWJ1Zy9nc3R0YWdpbmplY3QuaDoKKwkgIFNlbnQgdGFncyBpbiBfdHJhbnNmb3JtX2lwKCkgaW5zdGVhZCBvZiBfc3RhcnQoKS4gRml4ZXMgIzU0MzQwNAorCSAgcGFydGlhbGx5LgorCisyMDA4LTA3LTE5IDE0OjEyOjM5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgY29uZmlndXJlLmFjOiAwLjEwLjguMiBwcmUtcmVsZWFzZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIDAuMTAuOC4yIHByZS1yZWxlYXNlCisKKzIwMDgtMDctMTkgMTM6NTA6NTMgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBleHQvTWFrZWZpbGUuYW06IEZpbmlzaCBob29raW5nIHVwIHB1bHNlYXVkaW8gcGx1Z2luIHRvIHRoZSBidWlsZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvTWFrZWZpbGUuYW06CisJICBGaW5pc2ggaG9va2luZyB1cCBwdWxzZWF1ZGlvIHBsdWdpbiB0byB0aGUgYnVpbGQuCisJICAqIGV4dC9wdWxzZS9wdWxzZW1peGVyY3RybC5jOgorCSAgRml4IGNvbXBpbGF0aW9uIGVycm9yLgorCisyMDA4LTA3LTE5IDEzOjIzOjI5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgcG8vOiBBZGQgbmV3IGxpdGh1bmlhbiB0cmFuc2xhdGlvbiwgYW5kIGFkZCBmcmVuY2ggdG8gdGhlIExJTkdVQVMgZmlsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBwby9MSU5HVUFTOgorCSAgKiBwby9sdC5wbzoKKwkgIEFkZCBuZXcgbGl0aHVuaWFuIHRyYW5zbGF0aW9uLCBhbmQgYWRkIGZyZW5jaCB0byB0aGUgTElOR1VBUworCSAgZmlsZS4KKworMjAwOC0wNy0xOSAxMzowODo0MiArMDAwMCAgV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogRml4IFNvdXAgSFRUUCBzb3VyY2Ugc2Vla2luZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgRml4IFNvdXAgSFRUUCBzb3VyY2Ugc2Vla2luZy4KKwkgIFBhdGNoIEJ5OiBXb3V0ZXIgQ2xvZXRlbnMgIDx3b3V0ZXIgYXQgbWluZCBiZT4KKwkgIEZpeGVzOiAjNTQwMzAwCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6CisJICBJZ25vcmUgbmV3IGNoZWNrIHByb2dyYW1zLgorCisyMDA4LTA3LTE5IDAxOjAxOjEzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgTW92ZSByZXBsYXlnYWluIGFuZCBpbnRlcmxlYXZlIHBsdWdpbnMgZnJvbSAtYmFkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBNb3ZlIHJlcGxheWdhaW4gYW5kIGludGVybGVhdmUgcGx1Z2lucyBmcm9tIC1iYWQuCisJICBGaXhlczogIzU0MzQwNgorCSAgRml4ZXM6ICM1MzYyMjgKKworMjAwOC0wNy0xOCAyMDowMzowNyArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogUmV2ZXJ0IElTTyBiYXNlIG1lZGlhIHNwZWMgYmFzZWQgcGl4ZWwtYXNwZWN0LXJhdGlvIGNhbGN1bGF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pLAorCSAgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBSZXZlcnQgSVNPIGJhc2UgbWVkaWEgc3BlYyBiYXNlZCBwaXhlbC1hc3BlY3QtcmF0aW8gY2FsY3VsYXRpb24uCisJICBGaXhlcyAjNTQzMzAwLgorCisyMDA4LTA3LTE3IDE2OjQyOjUzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06IEZpeCBtaW5vciBidWlsZCBpc3N1ZXMgb24gbWFjb3N4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIEZpeCBtaW5vciBidWlsZCBpc3N1ZXMgb24gbWFjb3N4LgorCSAgRml4ZXMgIzU0MzA1NAorCisyMDA4LTA3LTE3IDE0OjQwOjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBPbmx5IHVzZSAtV25vLWF0dHJpYnV0ZXMgKHdoaWNoIGlzIHRoZXJlIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIHRoZSB0YWdsaWIgMS41IGhlYWRlcnMpIGlmIHRoZSBjKysgY29tcGlsZXIgYWN0dWFsbHkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6OgorCSAgKiBleHQvdGFnbGliL01ha2VmaWxlLmFtOjoKKwkgIE9ubHkgdXNlIC1Xbm8tYXR0cmlidXRlcyAod2hpY2ggaXMgdGhlcmUgdG8gd29yayBhcm91bmQgYQorCSAgYnVnIGluIHRoZSB0YWdsaWIgMS41IGhlYWRlcnMpIGlmIHRoZSBjKysgY29tcGlsZXIgYWN0dWFsbHkKKwkgIHN1cHBvcnRzIGl0ICgjNTQzMjU1KS4KKworMjAwOC0wNy0xNyAxMzo1NDozOCArMDAwMCAgQmVub2l0IEZvdWV0IDxiZW5vaXQuZm91ZXRAcHVycGxlbGFicy5jb20+CisKKwkgIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogQXZvaWQgY29tcGlsZXIgd2FybmluZyBieSBpbml0aWFsaXNpbmcgdmFyaWFibGUgdG8gTlVMTCAoIzU0MzI1OSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBCZW5vaXQgRm91ZXQgPGJlbm9pdC5mb3VldCBwdXJwbGVsYWJzIGNvbT4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfbmVnb3RpYXRlKToKKwkgIEF2b2lkIGNvbXBpbGVyIHdhcm5pbmcgYnkgaW5pdGlhbGlzaW5nIHZhcmlhYmxlIHRvIE5VTEwgKCM1NDMyNTkpLgorCisyMDA4LTA3LTE0IDE3OjE3OjQ3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9kZWJ1Zy9nc3R0YWdpbmplY3QuYzogRG9uJ3QgcGFzcyBOVUxMIHRhZ2xpc3RzIHRvIGdzdF90YWdfbGlzdF9pc19lbXB0eSgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWJ1Zy9nc3R0YWdpbmplY3QuYzogKGdzdF90YWdfaW5qZWN0X3N0YXJ0KToKKwkgIERvbid0IHBhc3MgTlVMTCB0YWdsaXN0cyB0byBnc3RfdGFnX2xpc3RfaXNfZW1wdHkoKS4KKworMjAwOC0wNy0xNCAxNzoxNTo0MiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy86IERvbid0IHVzZSBkZWNsYXJhdGlvbnMgYWZ0ZXIgc3RhdGVtZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZGVjLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nLmM6IChydHBfcGlwZWxpbmVfY3JlYXRlKSwKKwkgIChydHBfcGlwZWxpbmVfcnVuKToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzogKHNvdXBodHRwc3JjX3N1aXRlKToKKwkgIERvbid0IHVzZSBkZWNsYXJhdGlvbnMgYWZ0ZXIgc3RhdGVtZW50cy4KKworMjAwOC0wNy0xNCAxNjoyODoyNSArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogQWxpZ24gZG9jdW1lbnRhdGlvbiB3aXRoIHJlYWxpdHkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAgQWxpZ24gZG9jdW1lbnRhdGlvbiB3aXRoIHJlYWxpdHkuCisKKzIwMDgtMDctMTQgMTM6MTE6MTQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOiBFQUlfQUREUkZBTUlMWSB3YXMgb2Jzb2xldGVkIGluIEJTRCBhdCBzb21lIHBvaW50LiBEZWZpbmUgaXQgdG8gdGhlIG9sZCB2YWx1ZSAoMSkgaWYgaXQncyBuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOgorCSAgRUFJX0FERFJGQU1JTFkgd2FzIG9ic29sZXRlZCBpbiBCU0QgYXQgc29tZSBwb2ludC4gRGVmaW5lIGl0IHRvIHRoZQorCSAgb2xkIHZhbHVlICgxKSBpZiBpdCdzIG5vdCBkZWZpbmVkIHdoaWNoIHNob3VsZCBub3QgY2F1c2UgYW55IHByb2JsZW1zCisJICBhcyB3ZSdyZSB1c2luZyBpdCBpbnRlcm5hbCBvbmx5IGFueXdheS4KKworMjAwOC0wNy0xNCAxMzowMjo0OCArMDAwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm9Abm52YS5vcmc+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogRml4IGJ1aWxkIG9mIGF2aWRlbXV4IG9uIGJpZyBlbmRpYW4gYXJjaGl0ZWN0dXJlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEFsZXNzYW5kcm8gRGVjaW5hIDxhbGVzc2FuZHJvIGF0IG5udmEgZG90IG9yZz4KKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9yaWZmX3BhcnNlX3ZwcnApOgorCSAgRml4IGJ1aWxkIG9mIGF2aWRlbXV4IG9uIGJpZyBlbmRpYW4gYXJjaGl0ZWN0dXJlcy4KKworMjAwOC0wNy0xMCAyMDo0Nzo1NiArMDAwMCAgVGhpYWdvIFNvdXNhIFNhbnRvcyA8dGhpYWdvc3NAbGNjLnVmY2cuZWR1LmJyPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IENvcnJlY3RseSBkaXN0aW5ndWlzaCA4Yml0IHZzIDE2Yml0IHJhdyBhdWRpby4gIEZpeGVzICM1NDI0MTAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBUaGlhZ28gU291c2EgU2FudG9zIDx0aGlhZ29zcyBhdCBsY2MgZG90IHVmY2cgZG90IGVkdSBkb3QgYnI+CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfYXVkaW9fY2Fwcyk6CisJICBDb3JyZWN0bHkgZGlzdGluZ3Vpc2ggOGJpdCB2cyAxNmJpdCByYXcgYXVkaW8uICBGaXhlcyAjNTQyNDEwLgorCisyMDA4LTA3LTA4IDIxOjA1OjE4ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBTZXQgcGl4ZWwtYXNwZWN0LXJhdGlvIGluIGNhcHMgdXNpbmcgZGlzcGxheSB3aWR0aCBhbmQgaGVpZ2h0IHByb3ZpZGVkIGluIHRyYWNrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pLAorCSAgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBTZXQgcGl4ZWwtYXNwZWN0LXJhdGlvIGluIGNhcHMgdXNpbmcgZGlzcGxheSB3aWR0aCBhbmQgaGVpZ2h0CisJICBwcm92aWRlZCBpbiB0cmFjay4KKworMjAwOC0wNy0wOCAxMzo1OTo1MSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBjb25maWd1cmUuYWM6IERvbid0IGluY2x1ZGUgRVJST1JfQ0ZMQUdTIGluIEdTVF9DWFhGTEFHUyBhcyBpdCBtaWdodCBpbmNsdWRlIGZsYWdzIHRoYXQgYXJlIGludmFsaWQgZm9yIEMrKy4gRml4ZXMgYnUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBEb24ndCBpbmNsdWRlIEVSUk9SX0NGTEFHUyBpbiBHU1RfQ1hYRkxBR1MgYXMgaXQgbWlnaHQgaW5jbHVkZQorCSAgZmxhZ3MgdGhhdCBhcmUgaW52YWxpZCBmb3IgQysrLiBGaXhlcyBidWcgIzUxNjUwOS4KKworMjAwOC0wNy0wOCAxMjo1MTozNCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBEb24ndCB1c2UgZGVjbGFyYXRpb25zIGFmdGVyIHN0YXRlbWVudHMgYW5kIHZhcmlhYmxlIGxlbmd0aCBhcnJheXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IChnc3RfZHYxMzk0c3JjX3VyaV9zZXRfdXJpKToKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IChnc3Rfc3BlZXhfZW5jX3NpbmtfZ2V0Y2Fwcyk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogKGdzdF93YXZwYWNrX2VuY19zZXRfd3BfY29uZmlnKToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfZml4YXRlKToKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfcHJvYmVfY2Fwc19mb3JfZm9ybWF0KToKKwkgICogdGVzdHMvZXhhbXBsZXMvZXF1YWxpemVyL2RlbW8uYzogKG1lc3NhZ2VfaGFuZGxlcik6CisJICAqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tYXVkaW90ZXN0LmM6IChtZXNzYWdlX2hhbmRsZXIpOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLW9zc3NyYy5jOiAobWVzc2FnZV9oYW5kbGVyKToKKwkgIERvbid0IHVzZSBkZWNsYXJhdGlvbnMgYWZ0ZXIgc3RhdGVtZW50cyBhbmQgdmFyaWFibGUgbGVuZ3RoIGFycmF5cy4KKworMjAwOC0wNy0wNyAyMToyODo1OCArMDAwMCAgRGFuaWVsIERyYWtlIDxkc2RAZ2VudG9vLm9yZz4KKworCSAgc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiBUcnkgcHJvZ3Jlc3NpdmUgdmlkZW8gaWYgaW50ZXJsYWNlZCBmYWlscy4gRml4ZXMgYnVnICM1NDE5NTYgYW5kIHRoZSB1c2FnZSBvZiB2NGwyc3JjIG9uIE9MUEMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBEYW5pZWwgRHJha2UgPGRzZCBhdCBnZW50b28gZG90IG9yZz4KKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfc2V0X2NhcHR1cmUpLAorCSAgKGdzdF92NGwyc3JjX2dldF9uZWFyZXN0X3NpemUpOgorCSAgVHJ5IHByb2dyZXNzaXZlIHZpZGVvIGlmIGludGVybGFjZWQgZmFpbHMuIEZpeGVzIGJ1ZyAjNTQxOTU2CisJICBhbmQgdGhlIHVzYWdlIG9mIHY0bDJzcmMgb24gT0xQQy4KKworMjAwOC0wNy0wNyAxNTozNDoxMiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuKjogUmV2ZXJ0IGxhc3QgY2hhbmdlOiBPbmx5IHRoZSBqaXR0ZXJidWZmZXIgaXMgYWJsZSB0byBjb252ZXJ0IFJUUCB0bworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOiAoZ3N0X3J0cF9zcGVleF9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX3NwZWV4X2RlcGF5X3Byb2Nlc3MpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuaDoKKwkgIFJldmVydCBsYXN0IGNoYW5nZTogT25seSB0aGUgaml0dGVyYnVmZmVyIGlzIGFibGUgdG8gY29udmVydCBSVFAgdG8KKwkgIEdzdHJlYW1lciB0aW1lc3RhbXBzIGFuZCBub3JtYWwgKGRlKXBheWxvYWRlcnMgc2hvdWxkIHNpbXBseSBjb3B5IGl0LgorCSAgUmVvcGVucyBidWcgIzU0MTc4Ny4KKworMjAwOC0wNy0wNyAxMDozMDo1MSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jOiBJbmNsdWRlIHN0ZGxpYi5oIGZvciBhdG9pKCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzoKKwkgIEluY2x1ZGUgc3RkbGliLmggZm9yIGF0b2koKS4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgVXNlIGZsb2F0aW5nIHBvaW50IG1hdGggZm9yIGxhdGVuY2llcyA8IDAgc2VjIGluIGxvZyBvdXRwdXQuCisKKzIwMDgtMDctMDcgMTA6MTY6MDcgKzAwMDAgIFRvbWFzeiBHcm9iZWxueSA8dG9tYXN6QGdyb2JlbG55Lm9zd2llY2VuaWEubmV0PgorCisJICBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuKjogVGFrZSB0aW1lc3RhbXAgZnJvbSB0aGUgUlRQIHBhY2tldCBhcyBhIGZpcnN0IHN0ZXAgdG8gZml4IHByb2JsZW1zIHdpdGggdHJhbnNtaXNzaW9uIG92ZXIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFRvbWFzeiBHcm9iZWxueSA8dG9tYXN6IGF0IGdyb2JlbG55IGRvdCBvc3dpZWNlbmlhIGRvdCBuZXQ+CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOiAoZ3N0X3J0cF9zcGVleF9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX3NwZWV4X2RlcGF5X3Byb2Nlc3MpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuaDoKKwkgIFRha2UgdGltZXN0YW1wIGZyb20gdGhlIFJUUCBwYWNrZXQgYXMgYSBmaXJzdCBzdGVwIHRvIGZpeCBwcm9ibGVtcworCSAgd2l0aCB0cmFuc21pc3Npb24gb3ZlciBSVFAgd2hlbiB0aGUgbmV0d29yayBpcyBub3QgcmVsaWFibGUuCisJICBGaXhlcyBidWcgIzU0MTc4Ny4KKworMjAwOC0wNy0wNSAxOTowMToyOCArMDAwMCAgVGVybyBTYWFybmkgPHRlcm8uc2Fhcm5pQGdtYWlsLmNvbT4KKworCSAgZ3N0L3VkcC9nc3R1ZHBzcmMuYzogRml4IHBhcnNpbmcgb2YgdWRwOi8vIFVSSXMgY29udGFpbmluZyBJUHY2IGFkZHJlc3Nlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFRlcm8gU2Fhcm5pIDx0ZXJvIGRvdCBzYWFybmkgYXQgZ21haWwgZG90IGNvbT4KKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfc2V0X3VyaSk6CisJICBGaXggcGFyc2luZyBvZiB1ZHA6Ly8gVVJJcyBjb250YWluaW5nIElQdjYgYWRkcmVzc2VzLgorCSAgRml4ZXMgYnVnICM1NDE2NTAuCisKKzIwMDgtMDctMDQgMjA6NDM6MDcgKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJICBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogRG8gbm90IGxlYWsgaW5jb21pbmcgYnVmZmVycy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKGdzdF9nZGtfcGl4YnVmX2NoYWluKToKKwkgIERvIG5vdCBsZWFrIGluY29taW5nIGJ1ZmZlcnMuCisKKzIwMDgtMDctMDMgMTk6Mjc6NTMgKzAwMDAgIERhbWllbiBMZXNwaWF1IDxkYW1pZW4ubGVzcGlhdUBnbWFpbC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogRml4IGJ1aWxkIG9mIHRoZSBSVFAgcGx1Z2luIHdpdGggbWluZ3czMiBieSBsaW5raW5nIHRvIHdzMl8zMiBmb3IgaHRvbnMoKSBhbmQgaHRvbmwoKS4gRml4ZXMgYnVnICM1NDE0MTIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBEYW1pZW4gTGVzcGlhdSA8ZGFtaWVuIGRvdCBsZXNwaWF1IGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEZpeCBidWlsZCBvZiB0aGUgUlRQIHBsdWdpbiB3aXRoIG1pbmd3MzIgYnkgbGlua2luZyB0byB3czJfMzIKKwkgIGZvciBodG9ucygpIGFuZCBodG9ubCgpLiBGaXhlcyBidWcgIzU0MTQxMi4KKworMjAwOC0wNy0wMiAwOTo1MToxNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogSGFuZGxlIHBvc2l0aW9uIGFuZCBkdXJhdGlvbiBxdWVyeSBpbiBERUZBVUxUIGZvcm1hdCBpZiB0aGUgcGFkJ3MgdHJhY2sgaGFzIGEgZGVmYXVsdCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9jbGFzc19pbml0KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSksIChnc3RfbWF0cm9za2FfZGVtdXhfcXVlcnkpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9lbGVtZW50X3F1ZXJ5KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50KToKKwkgIEhhbmRsZSBwb3NpdGlvbiBhbmQgZHVyYXRpb24gcXVlcnkgaW4gREVGQVVMVCBmb3JtYXQgaWYgdGhlCisJICBwYWQncyB0cmFjayBoYXMgYSBkZWZhdWx0IGZyYW1lIGR1cmF0aW9uIHNldC4KKwkgIEZpeCBzZWVraW5nIG5vdyB0aGF0IHRoZSBzZWdtZW50J3MgZHVyYXRpb24gZG9lc24ndCBjb250YWluIHRoZQorCSAgKHBvc3NpYmx5IHdyb25nIG9yIGluYWNjdXJhdGUpIGR1cmF0aW9uIG9mIHRoZSBNYXRyb3NrYSBmaWxlLgorCisyMDA4LTA3LTAyIDA5OjA0OjUwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogVXNlIE5BTiBjb25zdGFudCBpbnN0ZWFkIG9mIDAuMC8wLjAgaWYgcG9zc2libGUuIE5BTiBpcyBkZWZpbmVkIGluIG1hdGguaCBleGNlcHQgb24gTVNWQyB3aC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogKF9leHQyZGJsKToKKwkgIFVzZSBOQU4gY29uc3RhbnQgaW5zdGVhZCBvZiAwLjAvMC4wIGlmIHBvc3NpYmxlLiBOQU4gaXMgZGVmaW5lZAorCSAgaW4gbWF0aC5oIGV4Y2VwdCBvbiBNU1ZDIHdoZXJlIGl0IGlzIGRlZmluZWQgaW4geG1hdGguaC4KKwkgIEZpeGVzIGNvbXBpbGF0aW9uIHdpdGggTVNWQy4KKworMjAwOC0wNy0wMiAwODo1NzowNCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguKjogRG9uJ3Qgc2V0IHRoZSBzZWdtZW50IGR1cmF0aW9uIHRvIHRoZSBkdXJhdGlvbiBmcm9tIHRoZSBNYXRyb3NrYSBoZWFkZXIgYXMgdGhpcyB2YWx1ZSAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9yZXNldCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmZvKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcF9zdHJlYW1fcGFyc2VfaWQpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkgIERvbid0IHNldCB0aGUgc2VnbWVudCBkdXJhdGlvbiB0byB0aGUgZHVyYXRpb24gZnJvbSB0aGUgTWF0cm9za2EKKwkgIGhlYWRlciBhcyB0aGlzIHZhbHVlIGNvdWxkIGJlIHdyb25nIGFuZCBpcyBqdXN0IGluZm9ybWF0aW9uYWwuCisKKzIwMDgtMDctMDIgMDg6NDc6MDAgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IElmIG5vIFRyYWNrcyBlbGVtZW50IGlzIGZvdW5kIHVudGlsIHRoZSBmaXJzdCBDbHVzdGVyIGlzIGZvdW5kIHNlYXJjaCBpdCBhbmQgZXJyb3Igb3V0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3Bfc3RyZWFtX3BhcnNlX2lkKToKKwkgIElmIG5vIFRyYWNrcyBlbGVtZW50IGlzIGZvdW5kIHVudGlsIHRoZSBmaXJzdCBDbHVzdGVyIGlzIGZvdW5kCisJICBzZWFyY2ggaXQgYW5kIGVycm9yIG91dCBpZiBub25lIGlzIGZvdW5kIGluIHRoZSBjb21wbGV0ZSBmaWxlLgorCisyMDA4LTA3LTAyIDA4OjE0OjM1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBSZXN5bmMgbm9uLXN1YnRpdGxlIHRyYWNrcyB0b28gaWYgYSB0b28gbGFyZ2UgZ2FwIGNvbXBhcmVkIHRvIG90aGVyIHRyYWNrcyBpcyBkZXRlY3RlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9zeW5jX3N0cmVhbXMpOgorCSAgUmVzeW5jIG5vbi1zdWJ0aXRsZSB0cmFja3MgdG9vIGlmIGEgdG9vIGxhcmdlIGdhcCBjb21wYXJlZCB0byBvdGhlcgorCSAgdHJhY2tzIGlzIGRldGVjdGVkLgorCisyMDA4LTA3LTAxIDEzOjI4OjAyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogQWRkIHJhdyB2aWRlbyBwYXkgYW5kIGRlcGF5bG9hZGVycywgc2VlIFJGQzQxNzUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYzogKGdzdF9ydHBfdnJhd19kZXBheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfdnJhd19kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfdnJhd19kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX3ZyYXdfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX3ZyYXdfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF92cmF3X2RlcGF5X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0cF92cmF3X2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmM6IChnc3RfcnRwX3ZyYXdfcGF5X2dldF90eXBlKSwKKwkgIChnc3RfcnRwX3ZyYXdfcGF5X2Jhc2VfaW5pdCksIChnc3RfcnRwX3ZyYXdfcGF5X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfdnJhd19wYXlfaW5pdCksIChnc3RfcnRwX3ZyYXdfcGF5X2ZpbmFsaXplKSwKKwkgIChnc3RfcnRwX3ZyYXdfcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF92cmF3X3BheV9oYW5kbGVfYnVmZmVyKSwKKwkgIChnc3RfcnRwX3ZyYXdfcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHB2cmF3cGF5Lmg6CisJICBBZGQgcmF3IHZpZGVvIHBheSBhbmQgZGVwYXlsb2FkZXJzLCBzZWUgUkZDNDE3NS4KKworMjAwOC0wNi0zMCAyMjo1MzozOSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IERvbid0IHJldHVybiBHU1RfRkxPV19FUlJPUiB3aGVuIGJ1ZmZlcl9hbGxvYyBmYWlscyAtIHJldHVybiB3aGF0ZXZlciBpdCByZXR1cm5lZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgRG9uJ3QgcmV0dXJuIEdTVF9GTE9XX0VSUk9SIHdoZW4gYnVmZmVyX2FsbG9jIGZhaWxzIC0gcmV0dXJuCisJICB3aGF0ZXZlciBpdCByZXR1cm5lZC4KKworMjAwOC0wNi0yOSAxOTo1Mjo1MSArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGdzdC9hdmkvYXZpLWlkcy5oOiBBZGQgdnBycCBjaHVuayByZWxhdGVkIHN0cnVjdHVyZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9hdmktaWRzLmg6CisJICBBZGQgdnBycCBjaHVuayByZWxhdGVkIHN0cnVjdHVyZXMuCisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcmlmZl9wYXJzZV92cHJwKSwKKwkgIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSk6CisJICBQYXJzZSBvcHRpb25hbCB2cHJwIGNodW5rIGFuZCBhZGQgY2FsY3VsYXRlZCBwaXhlbC1hc3BlY3QtcmF0aW8KKwkgIHRvIGNhcHMuICBGaXhlcyAjNTM5NDgyLgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5oOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aV9tdXhfcGFkX3Jlc2V0KSwKKwkgIChnc3RfYXZpX211eF92aWRzaW5rX3NldF9jYXBzKSwgKGdzdF9hdmlfbXV4X3JpZmZfZ2V0X2F2aV9oZWFkZXIpOgorCSAgQWRkIGEgdnBycCBjaHVuayBpZiBub24tdHJpdmFsIHBpeGVsLWFzcGVjdC1yYXRpbyBwcm92aWRlZCBpbiBjYXBzLgorCisyMDA4LTA2LTI4IDE5OjMxOjQ2ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpbXV4LmM6IEFkanVzdCBhdmltdXggdW5pdCB0ZXN0IGFjY29yZGluZyB0byBpbmNyZWFzZWQgc3RyZWFtaGVhZGVyIHNpemUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpbXV4LmM6IChjaGVja19hdmltdXhfcGFkKToKKwkgIEFkanVzdCBhdmltdXggdW5pdCB0ZXN0IGFjY29yZGluZyB0byBpbmNyZWFzZWQgc3RyZWFtaGVhZGVyIHNpemUuCisKKzIwMDgtMDYtMjcgMTg6MTE6MDEgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEFkZCBEaXJhYyBzdHJlYW0gdHlwZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQWRkIERpcmFjIHN0cmVhbSB0eXBlCisKKzIwMDgtMDYtMjcgMTU6MjU6MDAgKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorCisJICBnc3QvYXZpL2dzdGF2aW11eC4qOiBBZGQgOCBieXRlcyB0byBjdXJyZW50IHN0cmVhbWhlYWRlciB0byBtYWtlIGZvciBhIGNvbXBsZXRlIG9uZSBhbmQgdG8gbWFrZSBtb3JlIHBsYXllcnMgaGFwcHkuICAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpX2hlYWRlcik6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4Lmg6CisJICBBZGQgOCBieXRlcyB0byBjdXJyZW50IHN0cmVhbWhlYWRlciB0byBtYWtlIGZvciBhIGNvbXBsZXRlIG9uZQorCSAgYW5kIHRvIG1ha2UgbW9yZSBwbGF5ZXJzIGhhcHB5LiAgRml4ZXMgIzUxOTQ2MC4KKworMjAwOC0wNi0yNiAxNjozNjo0NyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL3Y0bDIvdjRsMl9jYWxscy5jOiBEb24ndCBpbmNsdWRlIHVudXNlZCBnc3R2NGwyeG92ZXJsYXkuaC4gRml4ZXMgYnVpbGQgaW4gY2FzZSB3aGVyZSBYMTEgaGVhZGVycyBhcmUgbm90IGluc3RhbGxlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6OgorCSAgRG9uJ3QgaW5jbHVkZSB1bnVzZWQgZ3N0djRsMnhvdmVybGF5LmguIEZpeGVzIGJ1aWxkCisJICBpbiBjYXNlIHdoZXJlIFgxMSBoZWFkZXJzIGFyZSBub3QgaW5zdGFsbGVkLgorCisyMDA4LTA2LTI2IDEwOjA3OjQ2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvZHYvZ3N0ZHYuYzogRml4IGNvbXBpbGF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kdi9nc3Rkdi5jOiAocGx1Z2luX2luaXQpOgorCSAgRml4IGNvbXBpbGF0aW9uLgorCisyMDA4LTA2LTI2IDA5OjM3OjIzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBleHQvZHYvZ3N0ZHYuYzogTWFya2luZyByYW5rIG9mIGR2ZGVjIGFzIEdTVF9SQU5LX01BUkdJTkFMIHNpbmNlIGl0J3MgdGhlIHNsb3dlc3QKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHYuYzogKHBsdWdpbl9pbml0KToKKwkgIE1hcmtpbmcgcmFuayBvZiBkdmRlYyBhcyBHU1RfUkFOS19NQVJHSU5BTCBzaW5jZSBpdCdzIHRoZSBzbG93ZXN0CisJICBEViBkZWNvZGVyIGF2YWlsYWJsZS4KKwkgIEZpeGVzICM1MzIzOTMKKworMjAwOC0wNi0yNSAwODoxMjoxOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy5jOiBDYWxsIGdldHNvY2tuYW1lKCkgYWZ0ZXIgdGhlIGNhbGwgdG8gYmluZCgpIHRvIGdldCB1cGRhdGVkIHZhbHVlcyBmb3IgdGhlIHBvcnQsIGV0Yy4gVGhpcyBmaXhlcyAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19zdGFydCk6CisJICBDYWxsIGdldHNvY2tuYW1lKCkgYWZ0ZXIgdGhlIGNhbGwgdG8gYmluZCgpIHRvIGdldCB1cGRhdGVkIHZhbHVlcworCSAgZm9yIHRoZSBwb3J0LCBldGMuIFRoaXMgZml4ZXMgdGhlIHVzYWdlIG9mIHVkcHNyYyBvbiBhbm9ueW1vdXMKKwkgIGJpbmRpbmcgYW5kIGl0J3MgdXNhZ2UgYnkgcnRzcHNyYy4gRml4ZXMgYnVncyAjNTM5MzcyLCAjNTM5NTQ4LgorCSAgVGhhbmtzIHRvIEF1cmVsaWVuIEdyaW1hdWQgZm9yIHBvaW50aW5nIG91dCB0aGUgb2J2aW91cyBmaXguCisKKzIwMDgtMDYtMjUgMDc6NTc6MjYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svcGlwZWxpbmVzL3dhdnBhY2suYzogUmVtb3ZlIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIGlkZW50aXR5IHRoYXQgaXMgZml4ZWQgaW4gMC4xMC4yMC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvd2F2cGFjay5jOiAoYnVzX2hhbmRsZXIpOgorCSAgUmVtb3ZlIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIGlkZW50aXR5IHRoYXQgaXMgZml4ZWQgaW4gMC4xMC4yMC4KKworMjAwOC0wNi0yNSAwNjozNjo1OCArMDAwMCAgSmFzb24gRG9uZW5mZWxkIDxCdWdaaWxsYUB6eDJjNC5jb20+CisKKwkgIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IEZpeCBIVFRQIGF1dGggc3VwcG9ydCB3aXRoIHVzZXIvcGFzc3dvcmQgcGFzc2VkIHZpYSB0aGUgVVJJLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSmFzb24gRG9uZW5mZWxkIDxCdWdaaWxsYSBhdCB6eDJjNCBkb3QgY29tPgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOiAoZ3N0X3NvdXBfaHR0cF9zcmNfZ290X2hlYWRlcnNfY2IpOgorCSAgRml4IEhUVFAgYXV0aCBzdXBwb3J0IHdpdGggdXNlci9wYXNzd29yZCBwYXNzZWQgdmlhIHRoZSBVUkkuCisJICBGaXhlcyBidWcgIzU0MDA2Ny4KKworMjAwOC0wNi0yNCAxNTo0MjozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBEZXBlbmQgb24gcmVsZWFzZWQgdmVyc2lvbnMgb2YgY29yZSBhbmQgLWJhc2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgRGVwZW5kIG9uIHJlbGVhc2VkIHZlcnNpb25zIG9mIGNvcmUgYW5kIC1iYXNlLgorCisyMDA4LTA2LTIzIDE2OjEzOjQwICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IEZpeCBidWdneSBmb3JtYXQgc3RyaW5ncyBpbiBtYWNyb3MuIChtYWtlcyBpdCBidWlsZCBvbiBPUyBYIGFnYWluLi4uKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA4LTA2LTIzICBKdWxpZW4gTW91dHRlICA8anVsaWVuQGZsdWVuZG8uY29tPgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcmVhZF90cmFja19lbmNvZGluZyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2Jsb2NrZ3JvdXBfb3Jfc2ltcGxlYmxvY2spOiBGaXggYnVnZ3kKKwkgIGZvcm1hdCBzdHJpbmdzIGluIG1hY3Jvcy4gKG1ha2VzIGl0IGJ1aWxkIG9uIE9TIFggYWdhaW4uLi4pCisKKzIwMDgtMDYtMjAgMTY6MjQ6MTEgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBnc3QvOiBBZGRlZCBkZWJ1Zy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgQWRkZWQgZGVidWcuCisKKzIwMDgtMDYtMjAgMTU6MjE6NTkgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogY29tbW9uOgorCSogY29uZmlndXJlLmFjOgorCSAgc3dpdGNoIHY0bDJzcmMgZnJvbSBleHBlcmltZW50YWwgdG8gbm9ybWFsIGJ1aWxkLiBGaXhlcyAjNTM2ODMxCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHN3aXRjaCB2NGwyc3JjIGZyb20gZXhwZXJpbWVudGFsIHRvIG5vcm1hbCBidWlsZC4gRml4ZXMgIzUzNjgzMQorCisyMDA4LTA2LTE5IDExOjI0OjU0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGc3MjZwYXkuYzogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBzbyB0aGF0IHdlIGNhbiBjb21waWxlIGFnYWluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOiAoZ3N0X3J0cF9nNzI2X3BheV9zZXRjYXBzKToKKwkgIFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgc28gdGhhdCB3ZSBjYW4gY29tcGlsZSBhZ2Fpbi4KKworMjAwOC0wNi0xOSAxMTowNjoyOSArMDAwMCAgUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2pAYXhpcy5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOiBObyBuZWVkIHRvIGNoZWNrIGZvciBhdWRpby9HNzIzIGFuZCBhdWRpby8zMktBRFBDTSBoZXJlIGFzIHRoZXkgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6IChnc3RfcnRwX2c3MjZfcGF5X3NldGNhcHMpOgorCSAgTm8gbmVlZCB0byBjaGVjayBmb3IgYXVkaW8vRzcyMyBhbmQgYXVkaW8vMzJLQURQQ00gaGVyZSBhcyB0aGV5IGFyZQorCSAgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KKworMjAwOC0wNi0xOSAxMDo1ODo1NyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogVXNlIEdfR0lOVDY0X0NPTlNUQU5ULCB0aGlzIGZpeGVzIHRoZSBkdXJhdGlvbiBxdWVyeSBvbiBmaWxlcyB3aXRob3V0IGtub3duIGxlbmd0aC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogKGdzdF93YXZwYWNrX3BhcnNlX3Jlc2V0KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9zcmNfcXVlcnkpLCAoZ3N0X3dhdnBhY2tfcGFyc2VfY3JlYXRlX3NyY19wYWQpOgorCSAgVXNlIEdfR0lOVDY0X0NPTlNUQU5ULCB0aGlzIGZpeGVzIHRoZSBkdXJhdGlvbiBxdWVyeSBvbiBmaWxlcyB3aXRob3V0CisJICBrbm93biBsZW5ndGguCisKKzIwMDgtMDYtMTkgMTA6NDg6NTcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thLzogRml4IGRlbXV4aW5nIG9mIFdhdlBhY2sgZmlsZXMuIE11eGluZyBpcyBzdGlsbCBicm9rZW4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF93dnBrX2hlYWRlciksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2F1ZGlvX2NhcHMpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBGaXggZGVtdXhpbmcgb2YgV2F2UGFjayBmaWxlcy4gTXV4aW5nIGlzIHN0aWxsIGJyb2tlbi4KKworMjAwOC0wNi0xOSAwOToxMjo1NSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvOiBBZGQgYSAidmZ1bmMiIHRvIHRoZSB0cmFjayBjb250ZXh0IGZvciBwb3N0cHJvY2Vzc2luZyBmcmFtZXMgYW5kIGNvbnZlcnQgdGhlIHdhdnBhY2sgYW5kIHN1YnRpdGxlIHBvc3QuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV90cmFja19mcmVlKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX21wZWdfc2VxX2hlYWRlciksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF93dnBrX2hlYWRlciksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2NoZWNrX3N1YnRpdGxlX2J1ZmZlciksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2Jsb2NrZ3JvdXBfb3Jfc2ltcGxlYmxvY2spLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF92aWRlb19jYXBzKSwgKGdzdF9tYXRyb3NrYV9kZW11eF9hdWRpb19jYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3VidGl0bGVfY2Fwcyk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIEFkZCBhICJ2ZnVuYyIgdG8gdGhlIHRyYWNrIGNvbnRleHQgZm9yIHBvc3Rwcm9jZXNzaW5nIGZyYW1lcyBhbmQKKwkgIGNvbnZlcnQgdGhlIHdhdnBhY2sgYW5kIHN1YnRpdGxlIHBvc3Rwcm9jZXNzaW5nIHRvIHRoaXMgdmZ1bmMuCisJICBDb3B5IGJ1ZmZlciBmbGFncyBpbiB0aG9zZSBmdW5jdGlvbnMgdG8gdGhlIG5ldyBidWZmZXJzIHRvby4KKwkgIFBhcnNlIENvZGVjU3RhdGUgZWxlbWVudHMgb2YgQmxvY2tzLgorCSAgQWRkIGEgcG9zdHByb2Nlc3NpbmcgZnVuY3Rpb24gZm9yIE1QRUcgdmlkZW8gdGhhdCBhZGRzIHRoZSBzZXF1ZW5jZQorCSAgaGVhZGVyIGZyb20gdGhlIGNvZGVjIHByaXZhdGUgZGF0YSBvciBjb2RlYyBzdGF0ZSB0byB0aGUgZnJhbWVzIGlmCisJICBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlLgorCisyMDA4LTA2LTE5IDA4OjIyOjE2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBJZiBhIGdhcCBvZiBtb3JlIHRoYW4gMS8yIHNlY29uZCBpcyBmb3VuZCBpbiBvbmUgc3RyZWFtIHNlbmQgYQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrKToKKwkgIElmIGEgZ2FwIG9mIG1vcmUgdGhhbiAxLzIgc2Vjb25kIGlzIGZvdW5kIGluIG9uZSBzdHJlYW0gc2VuZCBhCisJICBORVdTRUdNRU5UIGV2ZW50IHRvIG5vdCBzdGFsbCB0aGUgcGlwZWxpbmUgaWYgdGhlIGdhcCBpcyB0b28gbGFyZ2UuCisJICBUaGlzIGFsc28gZml4ZXMgTWF0cm9za2EgZmlsZXMgd2hlcmUgdGhlIGZpcnN0IGJ1ZmZlciBkb2Vzbid0IHN0YXJ0CisJICBhdCB0aW1lc3RhbXAgMC4gRml4ZXMgYnVnICM0MjkzMjIuCisJICBUaGUgZHVyYXRpb24gb2YgYSBibG9jayBpcyB0aGUgZGVmYXVsdCBkdXJhdGlvbiBtdWx0aXBsaWVkIHdpdGggdGhlCisJICBudW1iZXIgb2YgbGFjZXMuIEV2ZXJ5IGxhY2UgaXMgb25lIGZyYW1lIGFuZCB0aGUgZGVmYXVsdCBkdXJhdGlvbgorCSAgaXMgdGhlIGR1cmF0aW9uIG9mIG9uZSBmcmFtZS4gVGhpcyBmaXhlcyBwbGF5YmFjayBvZiBmaWxlcyB0aGF0IHVzZQorCSAgbGFjaW5nIGZvciBzb21lIHRyYWNrcy4KKworMjAwOC0wNi0xOCAyMDowOToyOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogVXBkYXRlIEZJWE1FL1RPRE9zIGFuZCBvbmx5IGlnbm9yZSBFT1MgYXQgdGhlIGNlbnRyYWwsIGltcG9ydGFudCBwbGFjZSBpbnN0ZWFkIG9mIHNldmUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfY29udGVudHNfc2Vla2VudHJ5KToKKwkgIFVwZGF0ZSBGSVhNRS9UT0RPcyBhbmQgb25seSBpZ25vcmUgRU9TIGF0IHRoZSBjZW50cmFsLCBpbXBvcnRhbnQgcGxhY2UKKwkgIGluc3RlYWQgb2Ygc2V2ZXJhbCBwbGFjZXMuCisKKzIwMDgtMDYtMTggMTY6NTU6MDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5jOiBGaXggY2FwcywgU2VlICM1Mzg4OTEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmM6CisJICBGaXggY2FwcywgU2VlICM1Mzg4OTEuCisKKzIwMDgtMDYtMTggMTA6Mjg6MjAgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IEltcHJvdmUgZGVidWcgb3V0cHV0IGV2ZXJ5d2hlcmUgYW5kIGZpeCB0aGUgRU9TIGxvZ2ljLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3RyZWFtX2Zyb21fbnVtKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfZW5jb2RpbmdfY21wKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfZW5jb2Rpbmdfb3JkZXJfdW5pcXVlKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcmVhZF90cmFja19lbmNvZGluZyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3JlYWRfdHJhY2tfZW5jb2RpbmdzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfdHJhY2tudW1iZXJfdW5pcXVlKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSksIChnc3RfbWF0cm9za2FfZGVtdXhfaW5pdF9zdHJlYW0pLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV90cmFja3MpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmRleF9jdWV0cmFjayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZGV4X3BvaW50ZW50cnkpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmRleCksIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfaW5mbyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX21ldGFkYXRhX2lkX3NpbXBsZV90YWcpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9tZXRhZGF0YV9pZF90YWcpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9tZXRhZGF0YSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2F0dGFjaGVkX2ZpbGUpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9hdHRhY2htZW50cyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NoYXB0ZXJzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3luY19zdHJlYW1zKSwgKGdzdF9tYXRyb3NrYV9kZWNvZGVfYnVmZmVyKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NsdXN0ZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9jb250ZW50c19zZWVrZW50cnkpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9jb250ZW50cyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3Bfc3RyZWFtX3BhcnNlX2lkKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcCk6CisJICBJbXByb3ZlIGRlYnVnIG91dHB1dCBldmVyeXdoZXJlIGFuZCBmaXggdGhlIEVPUyBsb2dpYy4KKwkgIENoZWNrIHRoZSB2YWx1ZXMgb2YgdGhlIENvbnRlbnRFbmNvZGluZyBlbGVtZW50cyBtb3JlIHN0cmljdGx5IGFuZAorCSAgZG9uJ3QgdXNlIHRyYWNrcyBmb3Igd2hpY2ggaXQncyBpbnZhbGlkLgorCSAgQ2hlY2sgdGhhdCB0aGUgdHJhY2sgbnVtYmVyIGlzIHVuaXF1ZSBmb3IgdGhpcyBzdHJlYW0uCisJICBDaGVjayB0aGF0IHNlZWsgcG9zaXRpb25zIGFyZSBiZWxvdyBHX01BWElOVDY0IGFzIG91ciBzZWVrcyBhcmUKKwkgIGludDY0LWJhc2VkIGFuZCBvdmVyZmxvd3Mgd2lsbCBmYWlsIGJhZGx5LgorCSAgQWZ0ZXIgc2Vla3MgYWxzbyBkb24ndCBwdXNoIFNpbXBsZUJsb2NrcyB1bnRpbCB0aGUgZmlyc3Qgb25lCisJICBjb250YWluaW5nIGEga2V5ZnJhbWUgaXMgZm91bmQuIEJlZm9yZSB0aGlzIHdhcyBkb25lIG9ubHkgZm9yIG5vcm1hbAorCSAgQmxvY2tzLgorCSAgVXBkYXRlIHNvbWUgRklYTUUvVE9ET3MuCisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogKGdzdF9lYm1sX3JlYWRfcGVla19ieXRlcyksCisJICAoZ3N0X2VibWxfcmVhZF91dGY4KSwgKGdzdF9lYm1sX3JlYWRfaGVhZGVyKToKKwkgIEltcHJvdmUgZGVidWcgb3V0cHV0LgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJICAoZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfdmlkZW9fY29udGV4dCk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9tdXhfdmlkZW9fcGFkX3NldGNhcHMpOgorCSAgUmVtb3ZlIGV5ZSBtb2RlIGFuZCBkb24ndCBwYXJzZSBpdCBhbnltb3JlLiBXZSBjYW4ndCB1c2UgdGhhdAorCSAgaW5mb3JtYXRpb24gaW4gR1N0cmVhbWVyIHlldCBzbyBpdCdzIHVzZWxlc3MuCisKKzIwMDgtMDYtMTggMTA6MTI6NTcgKzAwMDAgIG1lcnNhZCA8bWVyc2FkQGF4aXMuY29tPgorCisJICBnc3QvcnRwLzogQWRkZWQgRzcyNiBwYXkvZGVwYXlsb2FkZXJzLiBGaXhlcyAjNTM4ODkxLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogbWVyc2FkIDxtZXJzYWQgYXQgYXhpcyBkb3QgY29tPgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwL2dzdHJ0cC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jOiAoZ3N0X3J0cF9nNzI2X2RlcGF5X2Jhc2VfaW5pdCksCisJICAoZ3N0X3J0cF9nNzI2X2RlcGF5X2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9nNzI2X2RlcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfZzcyNl9kZXBheV9zZXRjYXBzKSwgKGdzdF9ydHBfZzcyNl9kZXBheV9wcm9jZXNzKSwKKwkgIChnc3RfcnRwX2c3MjZfZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGc3MjZwYXkuYzogKGdzdF9ydHBfZzcyNl9wYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX2c3MjZfcGF5X2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9nNzI2X3BheV9pbml0KSwKKwkgIChnc3RfcnRwX2c3MjZfcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9nNzI2X3BheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwZzcyNnBheS5oOgorCSAgQWRkZWQgRzcyNiBwYXkvZGVwYXlsb2FkZXJzLiBGaXhlcyAjNTM4ODkxLgorCisyMDA4LTA2LTE3IDEwOjE0OjQ3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9VUkxTOiBTb21lIG1vcmUgdXJscy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9VUkxTOgorCSAgU29tZSBtb3JlIHVybHMuCisJICAqIGdzdC9zbXB0ZS9iYXJib3h3aXBlcy5jOgorCSAgQWRkIGEgY29tbWVudAorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2NC1hbHNhc3JjLVBDTUEuc2g6CisJICBGaXggdHlwbywgYWRkIGF1ZGlvcmVzYW1wbGUgdG8gdGhlIHBpcGVsaW5lLgorCisyMDA4LTA2LTE3IDEwOjA1OjU1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvbGlibW5nLzogU29tZXdoYXQgcG9ydCBtbmdlbmMgYW5kIG1uZ2RlYyB0byAwLjEwLiBEb2VzIG5vdCB3b3JrIHlldCBhbmQgaGFzIG1hbnkgYml0cyBpZmRlZmZlZCBvdXQgc3RpbGwuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2xpYm1uZy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xpYm1uZy9nc3RtbmcuYzogKHBsdWdpbl9pbml0KToKKwkgICogZXh0L2xpYm1uZy9nc3RtbmdkZWMuYzogKGdzdF9tbmdfZGVjX2Jhc2VfaW5pdCksCisJICAoZ3N0X21uZ19kZWNfY2xhc3NfaW5pdCksIChnc3RfbW5nX2RlY19zaW5rX3NldGNhcHMpLAorCSAgKGdzdF9tbmdfZGVjX2luaXQpLCAoZ3N0X21uZ19kZWNfc3JjX2dldGNhcHMpLCAoZ3N0X21uZ19kZWNfbG9vcCksCisJICAoZ3N0X21uZ19kZWNfZ2V0X3Byb3BlcnR5KSwgKGdzdF9tbmdfZGVjX3NldF9wcm9wZXJ0eSksCisJICAobW5nZGVjX2Vycm9yKSwgKG1uZ2RlY19vcGVuc3RyZWFtKSwgKG1uZ2RlY19jbG9zZXN0cmVhbSksCisJICAoZ3N0X21uZ19kZWNfc2lua19ldmVudCksIChtbmdkZWNfcmVhZGRhdGEpLCAobW5nZGVjX3NldHRpbWVyKSwKKwkgIChtbmdkZWNfcHJvY2Vzc2hlYWRlciksIChtbmdkZWNfZ2V0Y2FudmFzbGluZSksIChtbmdkZWNfcmVmcmVzaCksCisJICAoZ3N0X21uZ19kZWNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2xpYm1uZy9nc3RtbmdkZWMuaDoKKwkgICogZXh0L2xpYm1uZy9nc3RtbmdlbmMuYzogKGdzdF9tbmdfZW5jX2Jhc2VfaW5pdCksCisJICAoZ3N0X21uZ19lbmNfY2xhc3NfaW5pdCksIChnc3RfbW5nX2VuY19zaW5rX3NldGNhcHMpLAorCSAgKGdzdF9tbmdfZW5jX2luaXQpLCAoZ3N0X21uZ19lbmNfY2hhaW4pLAorCSAgKGdzdF9tbmdfZW5jX2dldF9wcm9wZXJ0eSksIChnc3RfbW5nX2VuY19zZXRfcHJvcGVydHkpOgorCSAgKiBleHQvbGlibW5nL2dzdG1uZ2VuYy5oOgorCSAgU29tZXdoYXQgcG9ydCBtbmdlbmMgYW5kIG1uZ2RlYyB0byAwLjEwLiBEb2VzIG5vdCB3b3JrIHlldCBhbmQgaGFzIG1hbnkKKwkgIGJpdHMgaWZkZWZmZWQgb3V0IHN0aWxsLgorCisyMDA4LTA2LTE2IDExOjM0OjU0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBXaGVuIGNvbXBhcmluZyBpbmRleCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIHRpbWUgY29tcGFyZSB0aGVpciBibG9jayBudW1iZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfaW5kZXhfY29tcGFyZSk6CisJICBXaGVuIGNvbXBhcmluZyBpbmRleCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIHRpbWUgY29tcGFyZSB0aGVpcgorCSAgYmxvY2sgbnVtYmVyLgorCisyMDA4LTA2LTE2IDExOjMxOjA2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9hdHRhY2hlZF9maWxlKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9hdHRhY2hlZF9maWxlKQorCSAgSW5pdCB2YXJpYWJsZSB0byBOVUxMIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuCisKKzIwMDgtMDYtMTYgMTA6NTk6MzkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thLzogUGFyc2UgQXR0YWNobWVudHMgYW5kIHBvc3QgdGhlbSBhcyBHU1RfVEFHX0lNQUdFIGlmIHdlIGRldGVjdCBpdCBhcyBpbWFnZSBhbmQgb3RoZXJ3aXNlIGFzIEdTVF9UQUdfQVRULi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9yZXNldCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2F0dGFjaGVkX2ZpbGUpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9hdHRhY2htZW50cyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NvbnRlbnRzX3NlZWtlbnRyeSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3Bfc3RyZWFtX3BhcnNlX2lkKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuYzogKGdzdF9tYXRyb3NrYV9yZWdpc3Rlcl90YWdzKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EuYzogKHBsdWdpbl9pbml0KToKKwkgIFBhcnNlIEF0dGFjaG1lbnRzIGFuZCBwb3N0IHRoZW0gYXMgR1NUX1RBR19JTUFHRSBpZiB3ZSBkZXRlY3QKKwkgIGl0IGFzIGltYWdlIGFuZCBvdGhlcndpc2UgYXMgR1NUX1RBR19BVFRBQ0hNRU5ULiBJbmNsdWRlIGZpbGVuYW1lCisJICBhbmQgZGVzY3JpcHRpb24gb2YgdGhlIGF0dGFjaG1lbnRzIGluIHRoZSBjYXBzLiBGaXhlcyBidWcgIzUzNzYyMi4KKworMjAwOC0wNi0xNiAxMDowOTowMyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IEFkZCBtb2RlIHByb3BlcnR5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiAoZ3N0X3NwZWV4X2VuY19tb2RlX2dldF90eXBlKSwKKwkgIChnc3Rfc3BlZXhfZW5jX2NsYXNzX2luaXQpLCAoZ3N0X3NwZWV4X2VuY19zaW5rX2dldGNhcHMpLAorCSAgKGdzdF9zcGVleF9lbmNfZ2V0X2xhdGVuY3kpLCAoZ3N0X3NwZWV4X2VuY19nZXRfcXVlcnlfdHlwZXMpLAorCSAgKGdzdF9zcGVleF9lbmNfc3JjX3F1ZXJ5KSwgKGdzdF9zcGVleF9lbmNfaW5pdCksCisJICAoZ3N0X3NwZWV4X2VuY19zZXR1cCksIChnc3Rfc3BlZXhfZW5jX3B1c2hfYnVmZmVyKSwKKwkgIChnc3Rfc3BlZXhfZW5jX2NoYWluKSwgKGdzdF9zcGVleF9lbmNfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfc3BlZXhfZW5jX3NldF9wcm9wZXJ0eSk6CisJICBBZGQgbW9kZSBwcm9wZXJ0eS4KKwkgIFNvbWUgY2xlYW51cHMsIGFkZCBtb3JlIGRlYnVnIGluZm8uCisJICBBZGQgbGF0ZW5jeSBxdWVyeS4KKworMjAwOC0wNi0xNiAwOTo1NDoyNyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IFJldHVybiBHU1RfRkxPV19VTkVYUEVDVEVEIGluc3RlYWQgb2YgR1NUX0ZMT1dfRVJST1Igb24gc2hvcnQgcmVhZHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOiAoZ3N0X2VibWxfcmVhZF9wZWVrX2J5dGVzKToKKwkgIFJldHVybiBHU1RfRkxPV19VTkVYUEVDVEVEIGluc3RlYWQgb2YgR1NUX0ZMT1dfRVJST1Igb24gc2hvcnQgcmVhZHMuCisJICBJZiB3ZSBnZXQgbGVzcyBieXRlcyB0aGFuIHJlcXVlc3RlZCB3ZSBjYW4ndCBkbyBhbnl0aGluZyBleGNlcHQgZG9pbmcKKwkgIG91ciBFT1MgbG9naWMuCisKKzIwMDgtMDYtMTUgMTk6MDk6NTQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thLzogVXNlIGEgR0FycmF5IGZvciBzdG9yaW5nIHRoZSBDdWUgKGkuZS4gc2VlaykgaW5mb3JtYXRpb24sIHN0b3JlIHRoZSBDdWVUcmFja1Bvc2l0aW9ucyBmb3IgZXZlcnkgdHJhY2ssLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfcmVzZXQpLAorCSAgKGdzdF9tYXRyb3NrYWRlbXV4X2RvX2luZGV4X3NlZWspLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmRleF9jdWV0cmFjayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZGV4X3BvaW50ZW50cnkpLAorCSAgKGdzdF9tYXRyb3NrYV9pbmRleF9jb21wYXJlKSwgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmRleCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX21ldGFkYXRhKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIFVzZSBhIEdBcnJheSBmb3Igc3RvcmluZyB0aGUgQ3VlIChpLmUuIHNlZWspIGluZm9ybWF0aW9uLCBzdG9yZQorCSAgdGhlIEN1ZVRyYWNrUG9zaXRpb25zIGZvciBldmVyeSB0cmFjaywgc3RvcmUgdGhlIGJsb2NrIG51bWJlcgorCSAgYW5kIG9wdGltaXplIHNlYXJjaGluZyBpbiB0aGUgYXJyYXkgYnkgc29ydGluZyBpdCBhZnRlciB0aGUgbGFzdAorCSAgZWxlbWVudCB3YXMgYWRkZWQuCisJICBGaXggYSBzbWFsbCBtZW1vcnkgbGVhayB3aGVuIHRyeWluZyB0byBwYXJzZSBhIHRhZ3MgZWxlbWVudCB0aGF0IHdhcworCSAgYWxyZWFkeSBwYXJzZWQuCisKKzIwMDgtMDYtMTUgMTU6Mjk6MjkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC4qOiBEb24ndCB3cml0ZSBhbm90aGVyIFNlZWtIZWFkIHdoaWNoIGluZGV4ZXMgYWxsIENsdXN0ZXJzIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUuIFRoaXMgaXNuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9yZXNldCksCisJICAoZ3N0X21hdHJvc2thX211eF9zdGFydCksIChnc3RfbWF0cm9za2FfbXV4X2ZpbmlzaCksCisJICAoZ3N0X21hdHJvc2thX211eF93cml0ZV9kYXRhKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgRG9uJ3Qgd3JpdGUgYW5vdGhlciBTZWVrSGVhZCB3aGljaCBpbmRleGVzIGFsbCBDbHVzdGVycyB0byB0aGUgZW5kIG9mCisJICB0aGUgZmlsZS4gVGhpcyBpc24ndCB1c2VmdWwgZm9yIGFueXRoaW5nIGFuZCBqdXN0IGluY3JlYXNlcyBmaWxlc2l6ZS4KKworMjAwOC0wNi0xNSAxNTowMTozMCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IFByZXZlbnQgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3Mgd2hlbiByZWFkaW5nIGZsb2F0cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChfZXh0MmRibCksIChnc3RfZWJtbF9yZWFkX2Zsb2F0KToKKwkgIFByZXZlbnQgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3Mgd2hlbiByZWFkaW5nIGZsb2F0cy4KKworMjAwOC0wNi0xNSAxNDowODo0MSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvOiBNYWtlIHN1cmUgdGhhdCBldmVyeSBUYWdzIGVsZW1lbnQgaXMgb25seSBwYXJzZWQgb25jZSBhbmQgaXQncyBjb250YWluaW5nIHRhZ3MgYXJlIG9ubHkgcG9zdGVkIG9uY2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmg6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfbWV0YWRhdGEpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkgIE1ha2Ugc3VyZSB0aGF0IGV2ZXJ5IFRhZ3MgZWxlbWVudCBpcyBvbmx5IHBhcnNlZCBvbmNlIGFuZCBpdCdzCisJICBjb250YWluaW5nIHRhZ3MgYXJlIG9ubHkgcG9zdGVkIG9uY2UuCisKKzIwMDgtMDYtMTUgMDk6NDM6MjUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thLzogSGFuZGxlIEVCTUwgZWxlbWVudHMgbGlrZSBWb2lkIG9yIENSQzMyIGluIHRoZSBFYm1sUmVhZCBiYXNlIGNsYXNzIGFscmVhZHkuIFRoZXkncmUgbm90IHVzZWZ1bCBpbiB0aGUgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOiAoZ3N0X2VibWxfcGVla19pZCksCisJICAoZ3N0X2VibWxfcmVhZF9oZWFkZXIpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfdHJhY2tzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfaW5kZXhfY3VldHJhY2spLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmRleF9wb2ludGVudHJ5KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfaW5kZXgpLCAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZm8pLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9tZXRhZGF0YV9pZF9zaW1wbGVfdGFnKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfbWV0YWRhdGFfaWRfdGFnKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfbWV0YWRhdGEpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9hdHRhY2htZW50cyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NoYXB0ZXJzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NsdXN0ZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9jb250ZW50c19zZWVrZW50cnkpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9jb250ZW50cyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3Bfc3RyZWFtX3BhcnNlX2lkKToKKwkgIEhhbmRsZSBFQk1MIGVsZW1lbnRzIGxpa2UgVm9pZCBvciBDUkMzMiBpbiB0aGUgRWJtbFJlYWQgYmFzZSBjbGFzcworCSAgYWxyZWFkeS4gVGhleSdyZSBub3QgdXNlZnVsIGluIHRoZSBtYXRyb3NrYSBwYXJzZXIgYW5kIG9ubHkgY2F1c2UKKwkgIGFkZGl0aW9uYWwgY29kZS4KKworMjAwOC0wNi0xNCAxNTo1MToyNSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvOiBSZXZlcnNlIHRoZSBsZXZlbCBsaXN0IGFzIHdlIHVzdWFsbHkgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgZmlyc3QgZWxlbWVudCBvciB3YW50IHRvIGFkZCBhIG5ldyBmaXIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9sZXZlbF9mcmVlKSwKKwkgIChnc3RfZWJtbF9maW5hbGl6ZSksIChnc3RfZWJtbF9yZWFkX2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X2VibWxfcmVhZF9lbGVtZW50X2xldmVsX3VwKSwgKGdzdF9lYm1sX3JlYWRfbWFzdGVyKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NvbnRlbnRzX3NlZWtlbnRyeSk6CisJICBSZXZlcnNlIHRoZSBsZXZlbCBsaXN0IGFzIHdlIHVzdWFsbHkgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUKKwkgIGZpcnN0IGVsZW1lbnQgb3Igd2FudCB0byBhZGQgYSBuZXcgZmlyc3QgZWxlbWVudC4gSGF2aW5nIHRoZQorCSAgZmlyc3QgZWxlbWVudCBzdG9yZWQgYXQgdGhlIGVuZCBhbmQgY2FsbGluZyBnX2xpc3RfbGFzdCgpIGFuZAorCSAgZ19saXN0X2FwcGVuZCgpIGlzIG1vcmUgZXhwZW5zaXZlLgorCSAgQWxzbyB1c2UgR1NsaWNlIGZvciBhbGxvY2F0aW5nIHRoZSBHc3RFYm1sTGV2ZWwgc3RydWN0cy4KKworMjAwOC0wNi0xMyAyMToxMzo0NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2RlYnVnL2dzdHRhZ2luamVjdC5jOiBEb24ndCB1bnJlZiBOVUxMIHRhZ2xpc3QgaW4gZmluYWxpemUuIERvbid0IHVzZSBjKysgc3R5bGUgY29tbWVudHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlYnVnL2dzdHRhZ2luamVjdC5jOiAoZ3N0X3RhZ19pbmplY3RfZmluYWxpemUpLAorCSAgKGdzdF90YWdfaW5qZWN0X2NsYXNzX2luaXQpLCAoZ3N0X3RhZ19pbmplY3RfaW5pdCk6CisJICBEb24ndCB1bnJlZiBOVUxMIHRhZ2xpc3QgaW4gZmluYWxpemUuIERvbid0IHVzZSBjKysgc3R5bGUKKwkgIGNvbW1lbnRzLgorCisyMDA4LTA2LTEzIDE5OjE0OjQxICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS86IFVzZSBnc3RfdmFsdWVfc2VyaWFsaXplKCkgYW5kIGdzdF92YWx1ZV9kZXNlcmlhbGl6ZSgpIGZvciB0cmFuc2Zvcm1pbmcgdGFncyBmcm9tIHNvbWUgR1R5cGUgdG8gYSBzdHJpbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9tZXRhZGF0YV9pZF9zaW1wbGVfdGFnKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3dyaXRlX2RhdGEpOgorCSAgVXNlIGdzdF92YWx1ZV9zZXJpYWxpemUoKSBhbmQgZ3N0X3ZhbHVlX2Rlc2VyaWFsaXplKCkgZm9yIHRyYW5zZm9ybWluZworCSAgdGFncyBmcm9tIHNvbWUgR1R5cGUgdG8gYSBzdHJpbmcgYW5kIHRoZSBvdGhlciB3YXkgYXJvdW5kLiBUaGUgZGVmYXVsdAorCSAgdHJhbnNmb3JtYXRpb25zIGluIEdMaWIgZG9uJ3QgaW5jbHVkZSB0cmFuc2Zvcm1hdGlvbnMgZnJvbSBzdHJpbmcgdG8KKwkgIG51bWJlciB0eXBlcy4KKworMjAwOC0wNi0xMyAxOTowNzowMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguKjogT25seSBwYXJzZSBUcmFja3MsIFNlZWtIZWFkIGFuZCBTZWdtZW50SW5mbyBlbGVtZW50cyBvbmNlIGJ1dCBhbGxvdworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfdHJhY2tzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfaW5kZXgpLCAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZm8pLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9hdHRhY2htZW50cyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NoYXB0ZXJzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfY29udGVudHNfc2Vla2VudHJ5KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcF9zdHJlYW1fcGFyc2VfaWQpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkgIE9ubHkgcGFyc2UgVHJhY2tzLCBTZWVrSGVhZCBhbmQgU2VnbWVudEluZm8gZWxlbWVudHMgb25jZSBidXQgYWxsb3cKKwkgIFRhZ3MgbXVsdGlwbGUgdGltZXMuIFRoZSBmaXJzdCBvbmVzIGNhbiBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgYnV0IG11c3QKKwkgIGNvbnRhaW4gdGhlIHNhbWUgY29udGVudCBhcyB0aGUgZmlyc3QgZm9yIGJhY2t1cCBwdXJwb3NlcyBzbyB3ZSBpZ25vcmUKKwkgIGFsbCBidXQgdGhlIGZpcnN0IG9uZS4gVGFncyBjYW4gYXBwZWFyIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50CisJICBjb250ZW50LgorCSAgSnVtcCB0byBhbGwgZWxlbWVudHMgZXhjZXB0IENsdXN0ZXJzIHRoYXQgYXJlIGF2YWlsYWJsZSBmcm9tIGEKKwkgIFNlZWtIZWFkIHRvIG1ha2UgaXQgbW9yZSBsaWtlbHkgdG8gaGF2ZSBhbGwgcmVxdWlyZWQgaW5mb3JtYXRpb25zCisJICBiZWZvcmUgZ2V0dGluZyB0byB0aGUgZmlyc3QgQ2x1c3RlcnMuCisJICBBZGQgZHVtbXkgZnVuY3Rpb25zIGZvciBwYXJzaW5nIEF0dGFjaG1lbnRzIGFuZCBDaGFwdGVycy4KKworMjAwOC0wNi0xMyAxNDozMzo1MiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvcmVwbGF5Z2Fpbi86IE1vcmUgZG9jIHVwZGF0ZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3JlcGxheWdhaW4vZ3N0cmdhbmFseXNpcy5jOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYzoKKwkgICogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYzoKKwkgIE1vcmUgZG9jIHVwZGF0ZXMuCisKKzIwMDgtMDYtMTMgMTE6NTk6MjMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW15dGh0di54bWwKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5zaWduYWxzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxzYXNwZGlmLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFtcndiLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1iYXllci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1iejIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2RhdWRpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jZHhhcGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRzZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2Yi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdmRzcHUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmFhYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mYWFkLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZiZGV2c2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mZXN0aXZhbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1maWx0ZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2ZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZnJlZXplLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzbS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RpbnRlcmxhY2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oMjY0cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW50ZXJsZWF2ZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxhZHNwYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tZXRhZGF0YS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tbXMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9kcGx1Zy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGVnMmVuYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGVnNHZpZGVvcGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXBlZ3RzcGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXBlZ3ZpZGVvcGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVzZXBhY2sueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVzaWNicmFpbnoueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXZlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW15dGh0di54bWwKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hcy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uZW9uLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5zZmRlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1udXZkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbAorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmF3cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVhbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJmYnNyYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zZGwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2RwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNlbGVjdG9yLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNuZGZpbGUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291bmR0b3VjaC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGNkZWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZWQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXhyZXNhbXBsZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zdGVyZW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3ViZW5jLnhtbAorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGltaWRpdHkueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdHRhLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZjZHNyYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb3NpZ25hbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12bW5jLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdpbGRtaWRpLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXgyNjQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teHZpZC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JkZWMuYzoKKwkgICogZXh0L2FtcndiL2dzdGFtcndiZW5jLmM6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YnBhcnNlLmM6CisJICAqIGV4dC9kYzEzOTQvZ3N0ZGMxMzk0LmM6CisJICAqIGV4dC9kaXJlY3RmYi9kZmJ2aWRlb3NpbmsuYzoKKwkgICogZXh0L2l2b3JiaXMvdm9yYmlzZGVjLmM6CisJICAqIGV4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYzoKKwkgICogZXh0L21wZWcyZW5jL2dzdG1wZWcyZW5jLmNjOgorCSAgKiBleHQvbXBsZXgvZ3N0bXBsZXguY2M6CisJICAqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uYzoKKwkgICogZXh0L215dGh0di9nc3RteXRodHZzcmMuYzoKKwkgICogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzoKKwkgICogZXh0L3RpbWlkaXR5L2dzdHRpbWlkaXR5LmM6CisJICAqIGV4dC90aW1pZGl0eS9nc3R3aWxkbWlkaS5jOgorCSAgKiBnc3QtbGlicy9nc3QvYXBwL2dzdGFwcHNpbmsuYzoKKwkgICogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6CisJICAqIGdzdC9kdmRzcHUvZ3N0ZHZkc3B1LmM6CisJICAqIGdzdC9mZXN0aXZhbC9nc3RmZXN0aXZhbC5jOgorCSAgKiBnc3QvZnJlZXplL2dzdGZyZWV6ZS5jOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgICogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSAgKiBnc3QvbW9kcGx1Zy9nc3Rtb2RwbHVnLmNjOgorCSAgKiBnc3QvbnV2ZGVtdXgvZ3N0bnV2ZGVtdXguYzoKKwkgIEFkZCBtaXNzaW5nIGVsZW1lbnRzIHRvIGRvY3MuIEZpeCBkb2MtbWFya3VwOiB1c2UgY29udmluaWVuY2Ugc3ludGF4CisJICBmb3IgZXhhbXBsZXMgKHByb2R1Y2VzIHZhbGlkIGRvY2Jvb2spLCBhZGQgc2V2ZXJhbCByZWZzZWMyIHdoZW4gd2UKKwkgIGhhdmUgc2V2ZXJhbCB0aXRsZXMuIEZpeCBzb21lIHR5cGVzLgorCisyMDA4LTA2LTEzIDExOjU0OjA1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy4qOiBBZGQgcHJvcGVydHkgdG8gY29udHJvbCBhdXRvbWF0aWMgam9pbi9sZWF2ZSBvZiBtdWx0aWNhc3QgZ3JvdXBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3VkcHNyY19pbml0KSwKKwkgIChnc3RfdWRwc3JjX2NyZWF0ZSksIChnc3RfdWRwc3JjX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3VkcHNyY19nZXRfcHJvcGVydHkpLCAoZ3N0X3VkcHNyY19zdGFydCksIChnc3RfdWRwc3JjX3N0b3ApOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgQWRkIHByb3BlcnR5IHRvIGNvbnRyb2wgYXV0b21hdGljIGpvaW4vbGVhdmUgb2YgbXVsdGljYXN0IGdyb3Vwcy4KKwkgIEFkZCBHX0xJS0VMWS4KKwkgIFJlbW92ZSBzZXR0aW5nIGNhcHMgb24gYnVmZmVycyBleHBsaWNpdGx5LCBiYXNlc3JjIGRvZXMgdGhhdCBmb3IgdXMgbm93LgorCSAgSW1wcm92ZSBkZWJ1ZyBpbmZvLgorCSAgQ29udmVydCBzb21lIG5vbi1mYXRhbCBlcnJvciBpbnRvIHdhcm5pbmdzLgorCSAgVXNlIGdfbnRvaHMgZm9yIGJldHRlciBwb3J0YWJpbGl0eS4KKwkgIExlYXZlIG11bHRpY2FzdCBncm91cHMgd2hlbiBzdG9wcGluZy4KKwkgIFdoZW4gdXNpbmcgZXh0ZXJuYWwgc29ja2V0cywgdXNlIGdldHNvY2tuYW1lKCkgb24gdGhlbSB0byBmaWxsIHVwIHRoZQorCSAgYWRkciBzdHJ1Y3R1cmUgYmVmb3JlIGNhbGxpbmcgbWV0aG9kcyB0aGF0IHVzZSB0aGUgc3RydWN0dXJlLgorCSAgU2hvdWxkIGFsbCBmaXggIzUzNjkwMy4KKwkgIEFQSTogR3N0VURQU3JjOjphdXRvLW11bHRpY2FzdCBwcm9wZXJ0eQorCisyMDA4LTA2LTEzIDExOjQ3OjI4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6IFVzZSBnX250b2hsIGZvciBiZXR0ZXIgcG9ydGFiaWxpdHkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOiAoZ3N0X3VkcF9pc19tdWx0aWNhc3QpOgorCSAgVXNlIGdfbnRvaGwgZm9yIGJldHRlciBwb3J0YWJpbGl0eS4KKworMjAwOC0wNi0xMyAxMTo0NTo1NCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogRml4IGEgdHlwbyBhbmQgZG8gc29tZSBzbWFsbCBjbGVhbnVwcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19pbml0X3NlbmQpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfcmVtb3ZlKToKKwkgIEZpeCBhIHR5cG8gYW5kIGRvIHNvbWUgc21hbGwgY2xlYW51cHMuCisKKzIwMDgtMDYtMTMgMDk6Mzk6NDEgKzAwMDAgIE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkgIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzogTWFrZSB0aGUgZGVsaXZlcnktbWV0aG9kIG1hbmRhdG9yeSBvbiB0aGUgY2FwcyBhbmQgb25seSBhY2NlcHQgaW5saW5lIGZvciBub3cuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBPbGl2aWVyIENyZXRlIDx0ZXN0ZXIgYXQgdGVzdGVyIGRvdCBjYT4KKwkgICogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOiAoZ3N0X3J0cF90aGVvcmFfZGVwYXlfc2V0Y2Fwcyk6CisJICBNYWtlIHRoZSBkZWxpdmVyeS1tZXRob2QgbWFuZGF0b3J5IG9uIHRoZSBjYXBzIGFuZCBvbmx5IGFjY2VwdCBpbmxpbmUKKwkgIGZvciBub3cuCisJICBSZXZlcnNlIHN0cmNtcCBjaGVja3MgZm9yIGRlbGl2ZXJ5LW1ldGhvZC4KKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOiAoZ3N0X3J0cF92b3JiaXNfZGVwYXlfc2V0Y2Fwcyk6CisJICBNYWtlIGRlbGl2ZXJ5IG1ldGhvZCBvcHRpb25hbCB3aGVuIHBhcnNpbmcgY2FwcyBhbmQgbm90ZSB0aGlzIGluIHRoZQorCSAgY2Fwcy4KKwkgIFJldmVyc2Ugc3RyY21wIGNoZWNrcyBmb3IgZGVsaXZlcnktbWV0aG9kLgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSAgVXBkYXRlIGEgY29tbWVudCB0byBub3RlIHRoYXQgdGhlIGRlbGl2ZXJ5LW1ldGhvZCBpcyBvcHRpb25hbCwKKwkgIEZpeGVzICM1Mzc2NzUuCisKKzIwMDgtMDYtMTIgMTc6MzA6MDYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogU2V0IHVkcHNyYyBmb3IgcmVjZWl2aW5nIGRhdGEgZnJvbSBtdWx0aWNhc3QgZ3JvdXBzIHRvIFBBVVNFRCBpbnN0ZWFkIG9mIGxlYXZpbmcgdGhlbSBpbiBSRUFEWS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfbWNhc3QpOgorCSAgU2V0IHVkcHNyYyBmb3IgcmVjZWl2aW5nIGRhdGEgZnJvbSBtdWx0aWNhc3QgZ3JvdXBzIHRvIFBBVVNFRCBpbnN0ZWFkIG9mCisJICBsZWF2aW5nIHRoZW0gaW4gUkVBRFkuIEZpeGVzICM1Mzc4MzIuCisKKzIwMDgtMDYtMTIgMTI6MTQ6MzggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguYzogU2ltcGxpZnkgY29kZS4gZ3N0X3RhZ19saXN0X21lcmdlKCkgZG9lcyB0aGUgTlVMTCBjaGVja3MuIEFkZCBhIEZJWE1FIGZvciBhIHJhbmRvbSBjb25zdGFudCBpbiB0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIFNpbXBsaWZ5IGNvZGUuIGdzdF90YWdfbGlzdF9tZXJnZSgpIGRvZXMgdGhlIE5VTEwgY2hlY2tzLiBBZGQgYSBGSVhNRQorCSAgZm9yIGEgcmFuZG9tIGNvbnN0YW50IGluIHRhZ211eGluZyBjb2RlLgorCisyMDA4LTA2LTExIDE0OjI4OjQ0ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9kZWJ1Zy9nc3R0YWdpbmplY3QuKjogTm93IGFjdHVhbGx5IGFkZGluZyB0aGUgbmV3IGVsZW1lbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlYnVnL2dzdHRhZ2luamVjdC5jOgorCSAgKiBnc3QvZGVidWcvZ3N0dGFnaW5qZWN0Lmg6CisJICBOb3cgYWN0dWFsbHkgYWRkaW5nIHRoZSBuZXcgZWxlbWVudC4KKworMjAwOC0wNi0xMSAxNDoxMToxNiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBSZW1vdmUgZHVtbXkgcGx1Z2luX2luaXQuIFJlbW92ZSBzb21lIHVuZGVmaW5lZCBlbnRyaWVzIGZyb20gZG9jLSBzZWN0aW9uIGZpbGUuIEFkZCB0YWdpbmplY3QgZWxlbWVudCBhbmQgcmVidWlsZCBkb2MuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jZGlvLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSAgKiBnc3QvZGVidWcvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWJ1Zy9icmVha215ZGF0YS5jOgorCSAgKiBnc3QvZGVidWcvZWZlbmNlLmM6CisJICAqIGdzdC9kZWJ1Zy9nc3RkZWJ1Zy5jOgorCSAgKiBnc3QvZGVidWcvZ3N0bmF2c2Vlay5jOgorCSAgKiBnc3QvZGVidWcvZ3N0cHVzaGZpbGVzcmMuYzoKKwkgICogZ3N0L2RlYnVnL2dzdHB1c2hmaWxlc3JjLmg6CisJICAqIGdzdC9kZWJ1Zy9uZWdvdGlhdGlvbi5jOgorCSAgKiBnc3QvZGVidWcvcHJvZ3Jlc3NyZXBvcnQuYzoKKwkgICogZ3N0L2RlYnVnL3Byb2dyZXNzcmVwb3J0Lmg6CisJICAqIGdzdC9kZWJ1Zy9ybmRidWZmZXJzaXplLmM6CisJICAqIGdzdC9kZWJ1Zy90ZXN0cGx1Z2luLmM6CisJICBSZW1vdmUgZHVtbXkgcGx1Z2luX2luaXQuIFJlbW92ZSBzb21lIHVuZGVmaW5lZCBlbnRyaWVzIGZyb20gZG9jLQorCSAgc2VjdGlvbiBmaWxlLiBBZGQgdGFnaW5qZWN0IGVsZW1lbnQgYW5kIHJlYnVpbGQgZG9jcyBmb3IgaXQuCisKKzIwMDgtMDYtMTEgMTE6Mjc6NDYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBVcGRhdGUgdGhlIGNvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2Ygc3RyZWFtcyB3aGVuIHBhZHMgYXJlIGFkZGVkIG9yIHJlbW92ZWQuIFRoaXMgd2lsbCBtLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9yZXF1ZXN0X25ld19wYWQpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfcmVsZWFzZV9wYWQpLCAoZ3N0X21hdHJvc2thX211eF93cml0ZV9kYXRhKToKKwkgIFVwZGF0ZSB0aGUgY291bnRlciBmb3IgdGhlIG51bWJlciBvZiBzdHJlYW1zIHdoZW4gcGFkcyBhcmUgYWRkZWQgb3IKKwkgIHJlbW92ZWQuIFRoaXMgd2lsbCBtYWtlIHN1cmUgdGhhdCBhIHNlZWsgdGFibGUgaXMgZ2VuZXJhdGVkIGZvcgorCSAgZmlsZXMgd2l0aCBqdXN0IG9uZSBhdWRpbyBzdHJlYW0uCisKKzIwMDgtMDYtMTEgMTE6MTg6MjMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thLzogQWRkIHNvbWUgbW9yZSB0YWdzLCBpbXByb3ZlIGRlYnVnZ2luZyBhIGJpdCBhbmQgbWFrZSBzdXJlIHRoYXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfbWV0YWRhdGFfaWRfc2ltcGxlX3RhZyk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnKToKKwkgIEFkZCBzb21lIG1vcmUgdGFncywgaW1wcm92ZSBkZWJ1Z2dpbmcgYSBiaXQgYW5kIG1ha2Ugc3VyZSB0aGF0CisJICBHVmFsdWUgdHJhbnNmb3JtYXRpb24gaGFzIHN1Y2NlZWRlZCBiZWZvcmUgdXNpbmcgdGhlIHJlc3VsdAorCSAgYXMgYSB0YWcuCisKKzIwMDgtMDYtMTEgMDg6NTY6MTYgKzAwMDAgIE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkgIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6IFRoZSBUaGVvcmEgUlRQIHBheWxvYWRlciBvbmx5IHN1cHBvcnRzIHRoZSAiaW5saW5lIiBkZWxpZXZlcnkgbWV0aG9kIHNvIGxldCdzIGRlY2xhcmUgdGhpcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyIGF0IHRlc3RlciBkb3QgY2E+CisJICAqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJICBUaGUgVGhlb3JhIFJUUCBwYXlsb2FkZXIgb25seSBzdXBwb3J0cyB0aGUgImlubGluZSIgZGVsaWV2ZXJ5IG1ldGhvZAorCSAgc28gbGV0J3MgZGVjbGFyZSB0aGlzIG9uIHRoZSBjYXBzIG9mIHRoZSBzdGF0aWMgcGFkIHRlbXBsYXRlLgorCSAgRml4ZXMgYnVnICM1Mzc2NzUuCisKKzIwMDgtMDYtMTAgMTc6MjA6NDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogUmVtb3ZlIGJvZ3VzIGNoZWNrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogKGdzdF92aWRlb21peGVyX2ZpbGxfcXVldWVzKSwKKwkgIChnc3RfdmlkZW9taXhlcl9ibGVuZF9idWZmZXJzKSwgKGdzdF92aWRlb21peGVyX3VwZGF0ZV9xdWV1ZXMpOgorCSAgUmVtb3ZlIGJvZ3VzIGNoZWNrLgorCisyMDA4LTA2LTEwIDE2OjI1OjI0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IFVzZSBzdHJlYW1fdGltZSB0byBzeW5jaHJvbml6ZSB0aGUgb2JqZWN0IHByb3BlcnRpZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9xdWV1ZXMpLAorCSAgKGdzdF92aWRlb21peGVyX2JsZW5kX2J1ZmZlcnMpOgorCSAgVXNlIHN0cmVhbV90aW1lIHRvIHN5bmNocm9uaXplIHRoZSBvYmplY3QgcHJvcGVydGllcy4KKwkgIFVzZSBydW5uaW5nX3RpbWUgb2YgdGhlIG1hc3RlciBwYWQgdG8gdGltZXN0YW1wIG91dGdvaW5nIGJ1ZmZlcnMuCisJICBGaXggdGhlIGluaXRpYWwgc2VnbWVudCBldmVudCB0byBleHRlbmQgYW4gdW5rbm93biBhbW91bnQgb2YgdGltZS4KKwkgIEZpeGVzICM1MzczNjEuCisKKzIwMDgtMDYtMTAgMTE6MDU6MzAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogVHJ5IHRvIGlnbm9yZSB1bnBhcnNhYmxlL3Vua25vd24gc3RyZWFtcyBhbmQgZ2l2ZSBhIHdhcm5pbmcgaW5zdGVhZCBvZiBlcnJvcmluZyBvdXQuIEZpeGVzICM1My4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwKKwkgIChnc3RfYXZpX2RlbXV4X3BhcnNlX2luZGV4KSwgKGdzdF9hdmlfZGVtdXhfbWFzc2FnZV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9jYWxjdWxhdGVfZHVyYXRpb25zX2Zyb21faW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlcl9wdXNoKSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVsbCk6CisJICBUcnkgdG8gaWdub3JlIHVucGFyc2FibGUvdW5rbm93biBzdHJlYW1zIGFuZCBnaXZlIGEgd2FybmluZyBpbnN0ZWFkIG9mCisJICBlcnJvcmluZyBvdXQuIEZpeGVzICM1MzczNzcuCisKKzIwMDgtMDYtMTAgMTA6NDQ6NTMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzogVXNlIEdET1VCTEVfVE9fQkUoKSBpbnN0ZWFkIG9mIChwcm9iYWJseSBzbG93ZXIpIGN1c3RvbSBjb2RlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6IChnc3RfZWJtbF93cml0ZV9mbG9hdCk6CisJICBVc2UgR0RPVUJMRV9UT19CRSgpIGluc3RlYWQgb2YgKHByb2JhYmx5IHNsb3dlcikgY3VzdG9tIGNvZGUuCisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X2Jhc2VfaW5pdCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2NsYXNzX2luaXQpLCAoZ3N0X21hdHJvc2thX2RlbXV4X2luaXQpLAorCSAgKGdzdF9tYXRyb3NrYV90cmFja19mcmVlKSwgKGdzdF9tYXRyb3NrYV9kZW11eF9lbmNvZGluZ19jbXApLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9yZWFkX3RyYWNrX2VuY29kaW5ncyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9zdHJlYW0pLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfaW5pdF9zdHJlYW0pLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmRleF9jdWV0cmFjayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZGV4X3BvaW50ZW50cnkpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmZvKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfbWV0YWRhdGFfaWRfc2ltcGxlX3RhZyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX21ldGFkYXRhKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3d2cGtfaGVhZGVyKSwgKGdzdF9tYXRyb3NrYV9kZWNvZGVfYnVmZmVyKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NsdXN0ZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9jb250ZW50c19zZWVrZW50cnkpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9sb29wX3N0cmVhbV9wYXJzZV9pZCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3ApLCAoZ3N0X21hdHJvc2thX2RlbXV4X3ZpZGVvX2NhcHMpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9hdWRpb19jYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3VidGl0bGVfY2Fwcyk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJICAoZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfc3VidGl0bGVfY29udGV4dCk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9iYXNlX2luaXQpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfY2xhc3NfaW5pdCksIChnc3RfbWF0cm9za2FfbXV4X2luaXQpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfY3JlYXRlX3VpZCksIChnc3RfbWF0cm9za2FfbXV4X3Jlc2V0KSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X2F1ZGlvX3BhZF9zZXRjYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3N1YnRpdGxlX3BhZF9zZXRjYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3JlcXVlc3RfbmV3X3BhZCksCisJICAoZ3N0X21hdHJvc2thX211eF90cmFja19oZWFkZXIpLCAoZ3N0X21hdHJvc2thX211eF9zdGFydCksCisJICAoZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnKSwgKGdzdF9tYXRyb3NrYV9tdXhfZmluaXNoKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3dyaXRlX2RhdGEpLCAoZ3N0X21hdHJvc2thX211eF9jb2xsZWN0ZWQpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfc2V0X3Byb3BlcnR5KToKKwkgIEFkZCBtYW55IEZJWE1Fcy9UT0RPcyBhbGwgb3ZlciB0aGUgbWF0cm9za2EgbXV4ZXIgYW5kIGRlbXV4ZXIKKwkgIGVsZW1lbnRzLCBkbyBzb21lIGNoZWNrcyBmb3IgdmFsaWQgdmFsdWVzIGluIHRoZSBkZW11eGVyLCBoYW5kbGUKKwkgIHRyYWNrdGltZWNvZGVzY2FsZSBpbiB0aGUgZGVtdXhlciwgc2V0IGNvcnJlY3QgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbAorCSAgc2V0dGluZ3MgaW4gdGhlIGRlbXV4ZXIsIHJldmlldyBhbmQgYWRkIGFsbCBtaXNzaW5nIG1hdHJvc2thCisJICBJRHMgYW5kIHNvbWUgbW9yZSByYXcgWVVWIGZvcm1hdHMsIGFuZCBzb21lIHRyaXZpYWwgY2xlYW51cC4KKworMjAwOC0wNi0xMCAwODo1OToxNyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvcHVsc2UvOiBTb21lIHNtYWxsZXIgY2xlYW51cC4gVXNlIEdfUEFSQU1fU1RBVElDX1NUUklOR1MsIGdzdF9lbGVtZW50X2NsYXNzX3NldF9kZXRhaWxzX3NpbXBsZSgpIGFuZCBmaXggY29kaW5nIHMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvcHVsc2UvcHVsc2VtaXhlci5jOiAoZ3N0X3B1bHNlbWl4ZXJfYmFzZV9pbml0KSwKKwkgIChnc3RfcHVsc2VtaXhlcl9jbGFzc19pbml0KToKKwkgICogZXh0L3B1bHNlL3B1bHNlc2luay5jOiAoZ3N0X3B1bHNlc2lua19iYXNlX2luaXQpLAorCSAgKGdzdF9wdWxzZXNpbmtfY2xhc3NfaW5pdCksIChnc3RfcHVsc2VzaW5rX3ByZXBhcmUpOgorCSAgKiBleHQvcHVsc2UvcHVsc2VzcmMuYzogKGdzdF9wdWxzZXNyY19pbnRlcmZhY2Vfc3VwcG9ydGVkKSwKKwkgIChnc3RfcHVsc2VzcmNfYmFzZV9pbml0KSwgKGdzdF9wdWxzZXNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfcHVsc2VzcmNfcHJlcGFyZSk6CisJICBTb21lIHNtYWxsZXIgY2xlYW51cC4gVXNlIEdfUEFSQU1fU1RBVElDX1NUUklOR1MsCisJICBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUoKSBhbmQgZml4IGNvZGluZyBzdHlsZSBhIGJpdAorCSAgbW9yZS4KKworMjAwOC0wNi0xMCAwODoyMjoxNyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBBZGQgZG9jdW1lbnRhdGlvbiB0byB0aGUgcHVsc2VhdWRpbyBwbHVnaW4gYW5kIHJ1biBtYWtlIHVwZGF0ZSBpbiBkb2NzL3BsdWdpbnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Rpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2FtbWEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9ub3Njb3BlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSAgKiBleHQvcHVsc2UvcGx1Z2luLmM6CisJICAqIGV4dC9wdWxzZS9wdWxzZW1peGVyLmM6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNpbmsuYzoKKwkgICogZXh0L3B1bHNlL3B1bHNlc3JjLmM6CisJICBBZGQgZG9jdW1lbnRhdGlvbiB0byB0aGUgcHVsc2VhdWRpbyBwbHVnaW4gYW5kIHJ1biBtYWtlIHVwZGF0ZQorCSAgaW4gZG9jcy9wbHVnaW5zLgorCisyMDA4LTA2LTEwIDA2OjUyOjQ0ICswMDAwICBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uQHN1bi5jb20+CisKKwkgIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyY3RybC5jOiBJbXByb3ZlbWVudHMgZm9yIHRoZSBTdW5BdWRpbyBtaXhlciBieSBoYW5kbGluZyBtdXRlIGFzIG5vIGdhaW4gZm9yIHRyYWNrcyB0aGF0IC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbiBhdCBzdW4gZG90IGNvbT4KKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJICAoZ3N0X3N1bmF1ZGlvbWl4ZXJfY3RybF9nZXRfdm9sdW1lKSwKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX3NldF92b2x1bWUpOgorCSAgSW1wcm92ZW1lbnRzIGZvciB0aGUgU3VuQXVkaW8gbWl4ZXIgYnkgaGFuZGxpbmcgbXV0ZSBhcyBubyBnYWluCisJICBmb3IgdHJhY2tzIHRoYXQgaGF2ZSBhIGdhaW4gcHJvcGVydHkgYnV0IG5vIG11dGUgcHJvcGVydHkuCisJICBGaXhlcyBidWcgIzUzNjA2Ny4KKworMjAwOC0wNi0xMCAwNjo0NTozMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBBZGQgcHVsc2VhdWRpbyBHU3RyZWFtZXIgZWxlbWVudCBmcm9tIGdzdC1wdWxzZS4gRGV2ZWxvcG1lbnQgd2lsbCBjb250aW51ZSBoZXJlIGluc3RlYWQgb2YgcHVsc2VhdWRpbyBTVk4uIEZpeGVzIGJ1ZyAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGV4dC9wdWxzZS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3B1bHNlL3BsdWdpbi5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvcHVsc2UvcHVsc2VtaXhlci5jOiAoZ3N0X3B1bHNlbWl4ZXJfaW50ZXJmYWNlX3N1cHBvcnRlZCksCisJICAoZ3N0X3B1bHNlbWl4ZXJfaW1wbGVtZW50c19pbnRlcmZhY2VfaW5pdCksCisJICAoZ3N0X3B1bHNlbWl4ZXJfaW5pdF9pbnRlcmZhY2VzKSwgKGdzdF9wdWxzZW1peGVyX2Jhc2VfaW5pdCksCisJICAoZ3N0X3B1bHNlbWl4ZXJfY2xhc3NfaW5pdCksIChnc3RfcHVsc2VtaXhlcl9pbml0KSwKKwkgIChnc3RfcHVsc2VtaXhlcl9maW5hbGl6ZSksIChnc3RfcHVsc2VtaXhlcl9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9wdWxzZW1peGVyX2dldF9wcm9wZXJ0eSksIChnc3RfcHVsc2VtaXhlcl9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvcHVsc2UvcHVsc2VtaXhlci5oOgorCSAgKiBleHQvcHVsc2UvcHVsc2VtaXhlcmN0cmwuYzoKKwkgIChnc3RfcHVsc2VtaXhlcl9jdHJsX2NvbnRleHRfc3RhdGVfY2IpLAorCSAgKGdzdF9wdWxzZW1peGVyX2N0cmxfc2lua19pbmZvX2NiKSwKKwkgIChnc3RfcHVsc2VtaXhlcl9jdHJsX3NvdXJjZV9pbmZvX2NiKSwKKwkgIChnc3RfcHVsc2VtaXhlcl9jdHJsX3N1YnNjcmliZV9jYiksCisJICAoZ3N0X3B1bHNlbWl4ZXJfY3RybF9zdWNjZXNzX2NiKSwgKGdzdF9wdWxzZW1peGVyX2N0cmxfb3BlbiksCisJICAoZ3N0X3B1bHNlbWl4ZXJfY3RybF9jbG9zZSksIChnc3RfcHVsc2VtaXhlcl9jdHJsX25ldyksCisJICAoZ3N0X3B1bHNlbWl4ZXJfY3RybF9mcmVlKSwgKGdzdF9wdWxzZW1peGVyX2N0cmxfbGlzdF90cmFja3MpLAorCSAgKGdzdF9wdWxzZW1peGVyX2N0cmxfdGltZW91dF9ldmVudCksIChyZXN0YXJ0X3RpbWVfZXZlbnQpLAorCSAgKGdzdF9wdWxzZW1peGVyX2N0cmxfc2V0X3ZvbHVtZSksIChnc3RfcHVsc2VtaXhlcl9jdHJsX2dldF92b2x1bWUpLAorCSAgKGdzdF9wdWxzZW1peGVyX2N0cmxfc2V0X3JlY29yZCksIChnc3RfcHVsc2VtaXhlcl9jdHJsX3NldF9tdXRlKToKKwkgICogZXh0L3B1bHNlL3B1bHNlbWl4ZXJjdHJsLmg6CisJICAqIGV4dC9wdWxzZS9wdWxzZW1peGVydHJhY2suYzogKGdzdF9wdWxzZW1peGVyX3RyYWNrX2NsYXNzX2luaXQpLAorCSAgKGdzdF9wdWxzZW1peGVyX3RyYWNrX2luaXQpLCAoZ3N0X3B1bHNlbWl4ZXJfdHJhY2tfbmV3KToKKwkgICogZXh0L3B1bHNlL3B1bHNlbWl4ZXJ0cmFjay5oOgorCSAgKiBleHQvcHVsc2UvcHVsc2Vwcm9iZS5jOiAoZ3N0X3B1bHNlcHJvYmVfY29udGV4dF9zdGF0ZV9jYiksCisJICAoZ3N0X3B1bHNlcHJvYmVfc2lua19pbmZvX2NiKSwgKGdzdF9wdWxzZXByb2JlX3NvdXJjZV9pbmZvX2NiKSwKKwkgIChnc3RfcHVsc2Vwcm9iZV9pbnZhbGlkYXRlKSwgKGdzdF9wdWxzZXByb2JlX29wZW4pLAorCSAgKGdzdF9wdWxzZXByb2JlX2VudW1lcmF0ZSksIChnc3RfcHVsc2Vwcm9iZV9jbG9zZSksCisJICAoZ3N0X3B1bHNlcHJvYmVfbmV3KSwgKGdzdF9wdWxzZXByb2JlX2ZyZWUpLAorCSAgKGdzdF9wdWxzZXByb2JlX2dldF9wcm9wZXJ0aWVzKSwgKGdzdF9wdWxzZXByb2JlX25lZWRzX3Byb2JlKSwKKwkgIChnc3RfcHVsc2Vwcm9iZV9wcm9iZV9wcm9wZXJ0eSksIChnc3RfcHVsc2Vwcm9iZV9nZXRfdmFsdWVzKSwKKwkgIChnc3RfcHVsc2Vwcm9iZV9zZXRfc2VydmVyKToKKwkgICogZXh0L3B1bHNlL3B1bHNlcHJvYmUuaDoKKwkgICogZXh0L3B1bHNlL3B1bHNlc2luay5jOiAoZ3N0X3B1bHNlc2lua19iYXNlX2luaXQpLAorCSAgKGdzdF9wdWxzZXNpbmtfY2xhc3NfaW5pdCksIChnc3RfcHVsc2VzaW5rX2luaXQpLAorCSAgKGdzdF9wdWxzZXNpbmtfZGVzdHJveV9zdHJlYW0pLCAoZ3N0X3B1bHNlc2lua19kZXN0cm95X2NvbnRleHQpLAorCSAgKGdzdF9wdWxzZXNpbmtfZmluYWxpemUpLCAoZ3N0X3B1bHNlc2lua19kaXNwb3NlKSwKKwkgIChnc3RfcHVsc2VzaW5rX3NldF9wcm9wZXJ0eSksIChnc3RfcHVsc2VzaW5rX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3B1bHNlc2lua19jb250ZXh0X3N0YXRlX2NiKSwgKGdzdF9wdWxzZXNpbmtfc3RyZWFtX3N0YXRlX2NiKSwKKwkgIChnc3RfcHVsc2VzaW5rX3N0cmVhbV9yZXF1ZXN0X2NiKSwKKwkgIChnc3RfcHVsc2VzaW5rX3N0cmVhbV9sYXRlbmN5X3VwZGF0ZV9jYiksIChnc3RfcHVsc2VzaW5rX29wZW4pLAorCSAgKGdzdF9wdWxzZXNpbmtfY2xvc2UpLCAoZ3N0X3B1bHNlc2lua19wcmVwYXJlKSwKKwkgIChnc3RfcHVsc2VzaW5rX3VucHJlcGFyZSksIChnc3RfcHVsc2VzaW5rX3dyaXRlKSwKKwkgIChnc3RfcHVsc2VzaW5rX2RlbGF5KSwgKGdzdF9wdWxzZXNpbmtfc3VjY2Vzc19jYiksCisJICAoZ3N0X3B1bHNlc2lua19yZXNldCksIChnc3RfcHVsc2VzaW5rX2NoYW5nZV90aXRsZSksCisJICAoZ3N0X3B1bHNlc2lua19ldmVudCksIChnc3RfcHVsc2VzaW5rX2dldF90eXBlKToKKwkgICogZXh0L3B1bHNlL3B1bHNlc2luay5oOgorCSAgKiBleHQvcHVsc2UvcHVsc2VzcmMuYzogKGdzdF9wdWxzZXNyY19pbnRlcmZhY2Vfc3VwcG9ydGVkKSwKKwkgIChnc3RfcHVsc2VzcmNfaW1wbGVtZW50c19pbnRlcmZhY2VfaW5pdCksCisJICAoZ3N0X3B1bHNlc3JjX2luaXRfaW50ZXJmYWNlcyksIChnc3RfcHVsc2VzcmNfYmFzZV9pbml0KSwKKwkgIChnc3RfcHVsc2VzcmNfY2xhc3NfaW5pdCksIChnc3RfcHVsc2VzcmNfaW5pdCksCisJICAoZ3N0X3B1bHNlc3JjX2Rlc3Ryb3lfc3RyZWFtKSwgKGdzdF9wdWxzZXNyY19kZXN0cm95X2NvbnRleHQpLAorCSAgKGdzdF9wdWxzZXNyY19maW5hbGl6ZSksIChnc3RfcHVsc2VzcmNfZGlzcG9zZSksCisJICAoZ3N0X3B1bHNlc3JjX3NldF9wcm9wZXJ0eSksIChnc3RfcHVsc2VzcmNfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcHVsc2VzcmNfY29udGV4dF9zdGF0ZV9jYiksIChnc3RfcHVsc2VzcmNfc3RyZWFtX3N0YXRlX2NiKSwKKwkgIChnc3RfcHVsc2VzcmNfc3RyZWFtX3JlcXVlc3RfY2IpLCAoZ3N0X3B1bHNlc3JjX29wZW4pLAorCSAgKGdzdF9wdWxzZXNyY19jbG9zZSksIChnc3RfcHVsc2VzcmNfcHJlcGFyZSksCisJICAoZ3N0X3B1bHNlc3JjX3VucHJlcGFyZSksIChnc3RfcHVsc2VzcmNfcmVhZCksCisJICAoZ3N0X3B1bHNlc3JjX2RlbGF5KSwgKGdzdF9wdWxzZXNyY19jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9wdWxzZXNyY19nZXRfdHlwZSk6CisJICAqIGV4dC9wdWxzZS9wdWxzZXNyYy5oOgorCSAgKiBleHQvcHVsc2UvcHVsc2V1dGlsLmM6IChnc3RfcHVsc2VfZmlsbF9zYW1wbGVfc3BlYyksCisJICAoZ3N0X3B1bHNlX2NsaWVudF9uYW1lKSwgKGdzdF9wdWxzZV9nc3RfdG9fY2hhbm5lbF9tYXApOgorCSAgKiBleHQvcHVsc2UvcHVsc2V1dGlsLmg6CisJICBBZGQgcHVsc2VhdWRpbyBHU3RyZWFtZXIgZWxlbWVudCBmcm9tIGdzdC1wdWxzZS4gRGV2ZWxvcG1lbnQgd2lsbAorCSAgY29udGludWUgaGVyZSBpbnN0ZWFkIG9mIHB1bHNlYXVkaW8gU1ZOLiBGaXhlcyBidWcgIzQwMDY3OS4KKwkgIE9ubHkgY2hhbmdlcyBvdmVyIGdzdC1wdWxzZSBTVk4gYXJlIGFkZGVkIGNvcHlyaWdodCB0byB0aGUgdG9wIG9mCisJICBmaWxlcyBhbmQgY29kaW5nIHN0eWxlIGNoYW5nZXMuCisKKzIwMDgtMDYtMDkgMjA6MDI6MDUgKzAwMDAgIEJlbmphbWluIEthbXBtYW5uIDxiZW5qYW1pbkBmbHVlbmRvLmNvbT4KKworCSAgZXh0L2NkaW8vOiBBbHNvIGV4dHJhY3QgYWxidW0gdGl0bGUgYW5kIGFsYnVtIGdlbnJlIGZyb20gQ0QtVEVYVCBpZiBhdmFpbGFibGUgKCM1MzcwMjEpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQmVuamFtaW4gS2FtcG1hbm4gIDxiZW5qYW1pbiBhdCBmbHVlbmRvIGRvdCBjb20+CisJICAqIGV4dC9jZGlvL2dzdGNkaW8uYzogKGdzdF9jZGlvX2dldF9jZHRleHQpLAorCSAgKGdzdF9jZGlvX2FkZF9jZHRleHRfYWxidW1fdGFncyk6CisJICAqIGV4dC9jZGlvL2dzdGNkaW8uaDoKKwkgICogZXh0L2NkaW8vZ3N0Y2Rpb2NkZGFzcmMuYzogKGdzdF9jZGlvX2NkZGFfc3JjX29wZW4pOgorCSAgQWxzbyBleHRyYWN0IGFsYnVtIHRpdGxlIGFuZCBhbGJ1bSBnZW5yZSBmcm9tIENELVRFWFQgaWYKKwkgIGF2YWlsYWJsZSAoIzUzNzAyMSkuCisKKzIwMDgtMDYtMDkgMDg6NTI6MDQgKzAwMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiBJbXByb3ZlIG5lZ290aWF0aW9uIGEgYml0IG1vcmUgYnkgcGlja2luZyB0aGUgc21hbGxlc3QgcG9zc2libGUgcmVzb2x1dGlvbiB0aGF0IGlzIGxhcmdlciB0aGFuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTam9lcmQgU2ltb25zIDxzam9lcmQgYXQgbHVvbiBkb3QgbmV0PgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19uZWdvdGlhdGUpOgorCSAgSW1wcm92ZSBuZWdvdGlhdGlvbiBhIGJpdCBtb3JlIGJ5IHBpY2tpbmcgdGhlIHNtYWxsZXN0IHBvc3NpYmxlCisJICByZXNvbHV0aW9uIHRoYXQgaXMgbGFyZ2VyIHRoYW4gdGhlIHJlc29sdXRpb24gc3BlY2lmaWVkIGluIHRoZQorCSAgZmlyc3QgY2FwcyBlbnRyeSBvZiB0aGUgcGVlciBjYXBzLiBGaXhlcyBidWcgIzUzNjk5NC4KKworMjAwOC0wNi0wOSAwODo0Mjo0OSArMDAwMCAgQmFzdGllbiBOb2NlcmEgPGhhZGVzc0BoYWRlc3MubmV0PgorCisJICBzeXMvdjRsMi86IEZpeCBjb21waWxhdGlvbiB3aXRoIG5ld2VyIEdJVCBrZXJuZWxzIHRoYXQgZGVwcmVjYXRlZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQmFzdGllbiBOb2NlcmEgPGhhZGVzcyBhdCBoYWRlc3MgZG90IG5ldD4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5jOgorCSAgKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6IChnc3RfdjRsMl9maWxsX2xpc3RzKToKKwkgIEZpeCBjb21waWxhdGlvbiB3aXRoIG5ld2VyIEdJVCBrZXJuZWxzIHRoYXQgZGVwcmVjYXRlZAorCSAgVjRMMl9DSURfSENFTlRFUiBhbmQgVjRMMl9DSURfVkNFTlRFUi4gRml4ZXMgYnVnICM1MzYzMTcuCisKKzIwMDgtMDYtMDcgMTg6NDg6NTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFJlcXVpcmUgbGliY2RpbyA+PSAwLjc2LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZXh0L2NkaW8vZ3N0Y2Rpby5jOgorCSAgKiBleHQvY2Rpby9nc3RjZGlvLmg6CisJICAqIGV4dC9jZGlvL2dzdGNkaW9jZGRhc3JjLmM6IChnc3RfY2Rpb19jZGRhX3NyY19vcGVuKToKKwkgIFJlcXVpcmUgbGliY2RpbyA+PSAwLjc2LgorCisyMDA4LTA2LTA1IDExOjA3OjE3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9pbnRlcmxlYXZlLzogUHJvcGVybHkgaW1wbGVtZW50IGR1cmF0aW9uIGFuZCBwb3NpdGlvbiBxdWVyaWVzIGluIGJ5dGVzIGZvcm1hdC4gV2UgaGF2ZSB0byB0YWtlIHRoZSB1cHN0cmVhbSByZXBseS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiAoZ3N0X2RlaW50ZXJsZWF2ZV9hZGRfbmV3X3BhZHMpLAorCSAgKGdzdF9kZWludGVybGVhdmVfc3JjX3F1ZXJ5KToKKwkgICogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOiAoZ3N0X2ludGVybGVhdmVfc3JjX3F1ZXJ5X2R1cmF0aW9uKSwKKwkgIChnc3RfaW50ZXJsZWF2ZV9zcmNfcXVlcnkpOgorCSAgUHJvcGVybHkgaW1wbGVtZW50IGR1cmF0aW9uIGFuZCBwb3NpdGlvbiBxdWVyaWVzIGluIGJ5dGVzIGZvcm1hdC4gV2UKKwkgIGhhdmUgdG8gdGFrZSB0aGUgdXBzdHJlYW0gcmVwbHkgYW5kIGRpdmlkZS9tdWx0aXBseSBpdCBieSB0aGUgbnVtYmVyCisJICBvZiBjaGFubmVscyB0byBnZXQgdGhlIGNvcnJlY3QgcmVzdWx0LgorCisyMDA4LTA2LTA1IDA5OjQ1OjAwICswMDAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IENhdGNoIFVORVhQRUNURUQgd2hlbiBkb3duc3RyZWFtIGhhcyByZWFjaGVkIGVuZCBvZiBzZWdtZW50IGluIHJldmVyc2UgbW9kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBDYXRjaCBVTkVYUEVDVEVEIHdoZW4gZG93bnN0cmVhbSBoYXMgcmVhY2hlZCBlbmQgb2YKKwkgIHNlZ21lbnQgaW4gcmV2ZXJzZSBtb2RlLgorCisyMDA4LTA2LTA0IDE4OjA4OjM1ICswMDAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IEZpeCB0eXBvIGluIGNvbW1lbnQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBGaXggdHlwbyBpbiBjb21tZW50CisKKzIwMDgtMDYtMDQgMTg6MDM6MjQgKzAwMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogQmVjYXVzZSB3ZSBkb24ndCBrbm93IHRoZSBmcmFtZSBvcmRlciB3ZSBuZWVkIHRvIHB1c2ggdGlsbCB0aGUgbmV4dCBrZXlmcmFtZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIEJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgZnJhbWUgb3JkZXIgd2UgbmVlZCB0byBwdXNoIHRpbGwKKwkgIHRoZSBuZXh0IGtleWZyYW1lCisKKzIwMDgtMDYtMDQgMTc6Mzk6MzEgKzAwMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiBQcm92aWRlIGEgY3VzdG9tIG5lZ290aWF0aW9uIGZ1bmN0aW9uIHRvIG1ha2Ugc3VyZSB0byBwaWNrIHRoZSBoaWdoZXN0IHBvc3NpYmxlIGZyYW1lcmF0ZSBhbmQgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTam9lcmQgU2ltb25zIDxzam9lcmQgYXQgbHVvbiBkb3QgbmV0PgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfdjRsMnNyY19maXhhdGUpLCAoZ3N0X3Y0bDJzcmNfbmVnb3RpYXRlKToKKwkgIFByb3ZpZGUgYSBjdXN0b20gbmVnb3RpYXRpb24gZnVuY3Rpb24gdG8gbWFrZSBzdXJlIHRvIHBpY2sgdGhlIGhpZ2hlc3QKKwkgIHBvc3NpYmxlIGZyYW1lcmF0ZSBhbmQgcmVzb2x1dGlvbi4gRml4ZXMgYnVnICM1MzY2NDYuCisKKzIwMDgtMDYtMDQgMTY6NDk6MjYgKzAwMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogU2V0IEVPUyB3aGVuIGdvaW5nIG91dCBvZiB0aGUgc2VnbWVudCBpbiByZXZlcnNlIHBsYXliYWNrCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgU2V0IEVPUyB3aGVuIGdvaW5nIG91dCBvZiB0aGUgc2VnbWVudCBpbiByZXZlcnNlIHBsYXliYWNrCisKKzIwMDgtMDYtMDQgMTU6MTk6NDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC90YWdsaWIvTWFrZWZpbGUuYW06IEFkZCAtV25vLWF0dHJpYnV0ZXMgdG8gQ1hYRkxBR1MgdG8gc3VwcHJlc3Mgd2FybmluZyBjYXVzZWQgYnkgdGFnbGliIGhlYWRlcnMgKHdpdGggZ2NjIDQuMy4xKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL01ha2VmaWxlLmFtOjoKKwkgIEFkZCAtV25vLWF0dHJpYnV0ZXMgdG8gQ1hYRkxBR1MgdG8gc3VwcHJlc3Mgd2FybmluZyBjYXVzZWQgYnkKKwkgIHRhZ2xpYiBoZWFkZXJzICh3aXRoIGdjYyA0LjMuMSkuCisKKzIwMDgtMDYtMDQgMTE6NTk6MTggKzAwMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IFVzZSB0aGUgbmV3IGdzdF9ydHNwX2Nvbm5lY3Rpb25fZ2V0X2lwKCkgdG8gYWNjZXNzIHRoZSBJUCBhZGRyZXNzIG9mIGEgR3N0UlRTUENvbm5lY3Rpb24gc2luY2UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3VkcF9zaW5rKToKKwkgIFVzZSB0aGUgbmV3IGdzdF9ydHNwX2Nvbm5lY3Rpb25fZ2V0X2lwKCkgdG8gYWNjZXNzIHRoZSBJUCBhZGRyZXNzCisJICBvZiBhIEdzdFJUU1BDb25uZWN0aW9uIHNpbmNlIGl0IGlzIGEgcHJpdmF0ZSBtZW1iZXIuCisKKzIwMDgtMDYtMDQgMTA6NDI6NDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFVzZSBuZXcgdXRpbGl0eSBmdW5jdGlvbnMgaW4gbGliZ3N0dGFnIHRvIHByb2Nlc3MgY292ZXJhcnQgKCM1MTIzMzMpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjX2V4dHJhY3RfcGljdHVyZV9idWZmZXIpOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKHBhcnNlX3BpY3R1cmVfZnJhbWUpOgorCSAgVXNlIG5ldyB1dGlsaXR5IGZ1bmN0aW9ucyBpbiBsaWJnc3R0YWcgdG8gcHJvY2VzcyBjb3ZlcmFydCAoIzUxMjMzMykuCisKKzIwMDgtMDYtMDQgMDg6NTQ6MDkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiBXZSBhY3R1YWxseSBzdXBwb3J0IGxlZnQvc2lkZSwgcmlnaHQvc2lkZSBhbmQgbWlkL3NpZGUgZmlsZXMuIFRoZSBjb252ZXJzaW9uIHRvIG5vcm1hbCwgaW50ZXJsLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX3dyaXRlKToKKwkgIFdlIGFjdHVhbGx5IHN1cHBvcnQgbGVmdC9zaWRlLCByaWdodC9zaWRlIGFuZCBtaWQvc2lkZSBmaWxlcy4gVGhlCisJICBjb252ZXJzaW9uIHRvIG5vcm1hbCwgaW50ZXJsZWF2ZWQgc3RlcmVvIGlzIGRvbmUgYnkgbGliZmxhYy4KKworMjAwOC0wNi0wNCAwNzozNjowNyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOiBVbnJlZiB0aGUgd3JpdGUgY2FjaGUgaW4gZmluYWxpemUgaWYgaXQgd2FzIHNldCBhbmQgYWRkIGFkZCAiRklYTUUiIHRvIGEgY29tbWVudCB0aGF0IG5lZWQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOiAoZ3N0X2VibWxfd3JpdGVfZmluYWxpemUpLAorCSAgKGdzdF9lYm1sX3dyaXRlX3NldF9jYWNoZSk6CisJICBVbnJlZiB0aGUgd3JpdGUgY2FjaGUgaW4gZmluYWxpemUgaWYgaXQgd2FzIHNldCBhbmQgYWRkIGFkZCAiRklYTUUiCisJICB0byBhIGNvbW1lbnQgdGhhdCBuZWVkcyBpdC4KKworMjAwOC0wNi0wNCAwNjo0ODo0NiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLio6IFVzZSBhbiBhbHdheXMgaW5jcmVhc2luZyBpbnRlZ2VyIGZvciB0aGUgbnVtYmVyIGluIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgc2luayBwYWRzIHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6IChnc3RfaW50ZXJsZWF2ZV9wYWRfZ2V0X3R5cGUpLAorCSAgKGdzdF9pbnRlcmxlYXZlX3BhZF9nZXRfcHJvcGVydHkpLCAoZ3N0X2ludGVybGVhdmVfcGFkX2NsYXNzX2luaXQpLAorCSAgKGdzdF9pbnRlcmxlYXZlX3JlcXVlc3RfbmV3X3BhZCksIChnc3RfaW50ZXJsZWF2ZV9yZWxlYXNlX3BhZCk6CisJICAqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuaDoKKwkgIFVzZSBhbiBhbHdheXMgaW5jcmVhc2luZyBpbnRlZ2VyIGZvciB0aGUgbnVtYmVyIGluIHRoZSBuYW1lIG9mIHRoZQorCSAgcmVxdWVzdGVkIHNpbmsgcGFkcyB0byBndWFyYW50dWVlIGEgdW5pcXVlIG5hbWUuIEFkZCBhICJjaGFubmVsIgorCSAgcHJvcGVydHkgdG8gR3N0SW50ZXJsZWF2ZVBhZCB0byBtYWtlIGl0IHBvc3NpYmxlIGZvciBhcHBsaWNhdGlvbnMKKwkgIHRvIHJldHJpZXZlIHRoZSBjaGFubmVsIG51bWJlciBpbiB0aGUgb3V0cHV0IGZvciBldmVyeSBwYWQuCisJICBVc2UgZ190eXBlX3JlZ2lzdGVyX3N0YXRpY19zaW1wbGUoKSBpbnN0ZWFkIG9mCisJICBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljKCkgdG8gc2F2ZSBzb21lIHJlbG9jYXRpb25zLgorCisyMDA4LTA2LTAzIDE0OjM1OjU5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzogU3RvcCBHc3RDb2xsZWN0UGFkcyBiZWZvcmUgY2FsbGluZyB0aGUgcGFyZW50J3Mgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uIHdoZW4gZ29pbmcgZnJvbSBQQS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzogKGdzdF9pbnRlcmxlYXZlX3BhZF9nZXRfdHlwZSksCisJICAoZ3N0X2ludGVybGVhdmVfY2hhbmdlX3N0YXRlKToKKwkgIFN0b3AgR3N0Q29sbGVjdFBhZHMgYmVmb3JlIGNhbGxpbmcgdGhlIHBhcmVudCdzIHN0YXRlIGNoYW5nZSBmdW5jdGlvbgorCSAgd2hlbiBnb2luZyBmcm9tIFBBVVNFRCB0byBSRUFEWSBhcyB3ZSBvdGhlcndpc2UgZGVhZGxvY2suCisJICBGaXhlcyBidWcgIzUzNjI1OC4KKworMjAwOC0wNi0wMyAwOTowMzoxOSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6IFVzZSBuZXcgZ3N0X2F1ZGlvX2NoZWNrX2NoYW5uZWxfcG9zaXRpb25zKCkgZnVuY3Rpb24gYW5kIHJlZ2lzdGVyIHRoZSBHc3RJbnRlcmxlYXZlUGFkIHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJICAoZ3N0X2ludGVybGVhdmVfY2hlY2tfY2hhbm5lbF9wb3NpdGlvbnMpLAorCSAgKGdzdF9pbnRlcmxlYXZlX3NldF9jaGFubmVsX3Bvc2l0aW9ucyksCisJICAoZ3N0X2ludGVybGVhdmVfY2xhc3NfaW5pdCk6CisJICBVc2UgbmV3IGdzdF9hdWRpb19jaGVja19jaGFubmVsX3Bvc2l0aW9ucygpIGZ1bmN0aW9uIGFuZCByZWdpc3RlcgorCSAgdGhlIEdzdEludGVybGVhdmVQYWQgdHlwZSBmcm9tIGEgdGhyZWFkc2FmZSBjb250ZXh0LgorCisyMDA4LTA2LTAyIDE2OjEwOjAwICswMDAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4Lio6IEltcGxlbWVudCByZXZlcnNlIHBsYXliYWNrLiBGaXhlcyAjNTM1MzAwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyIGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaW5kZXhfbmV4dCksCisJICAoZ3N0X2F2aV9kZW11eF9pbmRleF9wcmV2KSwgKGdzdF9hdmlfZGVtdXhfaW5kZXhfZW50cnlfZm9yX3RpbWUpLAorCSAgKGdzdF9hdmlfZGVtdXhfZG9fc2VlayksIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrKSwKKwkgIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSk6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIEltcGxlbWVudCByZXZlcnNlIHBsYXliYWNrLiBGaXhlcyAjNTM1MzAwLgorCSAgU21hbGwgY2xlYW51cHMuCisKKzIwMDgtMDYtMDIgMTI6NDI6MTQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS4qOiBBbGxvdyBzZXR0aW5nIGNoYW5uZWwgcG9zaXRpb25zIHZpYSBhIHByb3BlcnR5IGFuZCBhbGxvdyB1c2luZyB0aGUgY2hhbm5lbCBwb3NpdGlvbnMgb24gLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOiAoZ3N0X2ludGVybGVhdmVfcGFkX2dldF90eXBlKSwKKwkgIChnc3RfaW50ZXJsZWF2ZV9maW5hbGl6ZSksIChnc3RfYXVkaW9fY2hlY2tfY2hhbm5lbF9wb3NpdGlvbnMpLAorCSAgKGdzdF9pbnRlcmxlYXZlX3NldF9jaGFubmVsX3Bvc2l0aW9ucyksCisJICAoZ3N0X2ludGVybGVhdmVfY2xhc3NfaW5pdCksIChnc3RfaW50ZXJsZWF2ZV9pbml0KSwKKwkgIChnc3RfaW50ZXJsZWF2ZV9zZXRfcHJvcGVydHkpLCAoZ3N0X2ludGVybGVhdmVfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfaW50ZXJsZWF2ZV9yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X2ludGVybGVhdmVfcmVsZWFzZV9wYWQpLAorCSAgKGdzdF9pbnRlcmxlYXZlX3Npbmtfc2V0Y2FwcyksIChnc3RfaW50ZXJsZWF2ZV9zcmNfcXVlcnlfZHVyYXRpb24pLAorCSAgKGdzdF9pbnRlcmxlYXZlX3NyY19xdWVyeV9sYXRlbmN5KSwgKGdzdF9pbnRlcmxlYXZlX2NvbGxlY3RlZCk6CisJICAqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuaDoKKwkgIEFsbG93IHNldHRpbmcgY2hhbm5lbCBwb3NpdGlvbnMgdmlhIGEgcHJvcGVydHkgYW5kIGFsbG93IHVzaW5nIHRoZQorCSAgY2hhbm5lbCBwb3NpdGlvbnMgb24gdGhlIGlucHV0IGFzIHRoZSBjaGFubmVsIHBvc2l0aW9ucyBvZiB0aGUgb3V0cHV0LgorCSAgRml4IHNvbWUgYnJva2VuIGxvZ2ljIGFuZCBtZW1vcnkgbGVha3MuCisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmM6IChzcmNfaGFuZG9mZl9mbG9hdDMyKSwKKwkgIChzaW5rX2hhbmRvZmZfZmxvYXQzMiksIChHU1RfU1RBUlRfVEVTVCksIChpbnRlcmxlYXZlX3N1aXRlKToKKwkgIEFkZCB1bml0IHRlc3RzIGZvciBjaGVja2luZyBjb3JyZWN0IGhhbmRsaW5nIG9mIGNoYW5uZWwgcG9zaXRpb25zLgorCisyMDA4LTA2LTAyIDEyOjIyOjU2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogV2hlbiB1c2luZyBnc3RfZWxlbWVudF9pdGVyYXRlX3BhZHMoKSBvbmUgaGFzIHRvIHVucmVmIGV2ZXJ5IHBhZCBhZnRlciB1c2FnZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IChnc3RfdmlkZW9taXhlcl9xdWVyeV9kdXJhdGlvbiksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfcXVlcnlfbGF0ZW5jeSk6CisJICBXaGVuIHVzaW5nIGdzdF9lbGVtZW50X2l0ZXJhdGVfcGFkcygpIG9uZSBoYXMgdG8gdW5yZWYgZXZlcnkgcGFkCisJICBhZnRlciB1c2FnZS4KKworMjAwOC0wNS0zMSAxNjo1MzoyMyArMDAwMCAgQmFzdGllbiBOb2NlcmEgPGhhZGVzc0BoYWRlc3MubmV0PgorCisJICBnc3QvcXRkZW11eC86IEltcHJvdmUgbWV0YS1kYXRhIGhhbmRsaW5nLCBhZGQgJ2NvbW1lbnQnLCAnZGVzY3JpcHRpb24nIGFuZCAnY29weXJpZ2h0JyB0YWcgaGFuZGxpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBCYXN0aWVuIE5vY2VyYSA8aGFkZXNzIGF0IGhhZGVzcyBkb3QgbmV0PgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3RhZ19hZGRfc3RyKSwKKwkgIChxdGRlbXV4X3BhcnNlX3VkdGEpOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4X2ZvdXJjYy5oOgorCSAgSW1wcm92ZSBtZXRhLWRhdGEgaGFuZGxpbmcsIGFkZCAnY29tbWVudCcsICdkZXNjcmlwdGlvbicgYW5kCisJICAnY29weXJpZ2h0JyB0YWcgaGFuZGxpbmcuCisJICBGaXhlcyAjNTM1OTM1CisKKzIwMDgtMDUtMzEgMTU6MzA6NDEgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IE1ha2Ugc3VyZSB3ZSB3ZSBkb24ndCBjbGlwIHRoZSBzZWdtZW50J3Mgc3RvcCB1c2luZyB0aGUgbWFpbiBzZWdtZW50IGR1cmF0aW9uIGFzIHRoYXQgY291bGQgY3IuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwOC0wNS0zMSAgSnVsaWVuIE1vdXR0ZSAgPGp1bGllbkBmbHVlbmRvLmNvbT4KKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfZmluZF9rZXlmcmFtZSksCisJICAoZ3N0X3F0ZGVtdXhfZmluZF9zZWdtZW50KSwgKGdzdF9xdGRlbXV4X3BlcmZvcm1fc2VlayksCisJICAoZ3N0X3F0ZGVtdXhfc2Vla190b19wcmV2aW91c19rZXlmcmFtZSksCisJICAoZ3N0X3F0ZGVtdXhfYWN0aXZhdGVfc2VnbWVudCksIChnc3RfcXRkZW11eF9sb29wKTogTWFrZSBzdXJlIHdlCisJICB3ZSBkb24ndCBjbGlwIHRoZSBzZWdtZW50J3Mgc3RvcCB1c2luZyB0aGUgbWFpbiBzZWdtZW50IGR1cmF0aW9uCisJICBhcworCSAgdGhhdCBjb3VsZCBjcm9wIHF1aXRlIHNvbWUgdmlkZW8gZnJhbWVzLiBNYWtlIHJldmVyc2UgcGxheWJhY2sKKwkgIHN1cHBvcnQKKwkgIG1vcmUgcm9idXN0IGFuZCBzdXBwb3J0IGVkaXQgbGlzdHMuIFN1cHBvcnQgc2Vla2luZyB0byB0aGUgbGFzdAorCSAgZnJhbWUsCisJICBhbmQgZml4IHJldmVyc2UgbG9vcGluZyBwbGF5YmFjay4gQWRkIHNvbWUgZGVidWdnaW5nLgorCSAgKiB3aW4zMi9jb21tb24vY29uZmlnLmg6IFVwZGF0ZWQuCisKKzIwMDgtMDUtMzEgMDg6Mzc6MDAgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzogRG9uJ3QgY2xpcCBmbG9hdC9kb3VibGUgc2FtcGxlcywgY29ycmVjdGx5IHVuc2V0IHBhc3N0aHJvdWdoIG1vZGUgYW5kIHVzZSBiZXR0ZXIgcm91Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIChnc3RfaWlyX2VxdWFsaXplcl90cmFuc2Zvcm1faXApOgorCSAgRG9uJ3QgY2xpcCBmbG9hdC9kb3VibGUgc2FtcGxlcywgY29ycmVjdGx5IHVuc2V0IHBhc3N0aHJvdWdoIG1vZGUKKwkgIGFuZCB1c2UgYmV0dGVyIHJvdW5kaW5nIGZvciBpbnRlZ2VyIHNhbXBsZXMuCisKKzIwMDgtMDUtMzAgMTE6MDM6NTcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuKjogVXBkYXRlIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIG9ubHkgd2hlbiBuZWVkZWQgaW4gdGhlIHRyYW5zZm9ybV9pcCBmdW5jdGlvbiBhbmQgY29yLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9iYW5kX3NldF9wcm9wZXJ0eSksIChnc3RfaWlyX2VxdWFsaXplcl9pbml0KSwKKwkgIChzZXR1cF9maWx0ZXIpLCAoc2V0X3Bhc3N0aHJvdWdoKSwgKHVwZGF0ZV9jb2VmZmljaWVudHMpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2NvbXB1dGVfZnJlcXVlbmNpZXMpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmg6CisJICBVcGRhdGUgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgb25seSB3aGVuIG5lZWRlZCBpbiB0aGUgdHJhbnNmb3JtX2lwCisJICBmdW5jdGlvbiBhbmQgY29ycmVjdGx5IHNldCB0aGUgZWxlbWVudCBpbnRvIHBhc3N0aHJvdWdoIG1vZGUgaWYgdGhlCisJICBnYWluIG9mIGFsbCBiYW5kcyBpcyAwLgorCisyMDA4LTA1LTI5IDExOjMwOjE2ICswMDAwICBTZWJhc3RpYW4gS2VsbGVyIDxzZWJhc3RpYW4ta2VsbGVyQGdteC5kZT4KKworCSAgZ3N0L2FscGhhL2dzdGFscGhhLmM6IFRyeSB0byBza2lwIHBpeGVscyBvciBhcmVhcyB0aGF0IGFyZSB0b28gZGFyayBvciB0b28gYnJpZ2h0IGZvciB1cyB0byBkbyBtZWFuaW5nZnVsbCBjb2xvciBkZXRlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5OiBTZWJhc3RpYW4gS2VsbGVyIDxzZWJhc3RpYW4ta2VsbGVyIGF0IGdteCBkb3QgZGU+CisJICAqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOiAoZ3N0X2FscGhhX2NsYXNzX2luaXQpLCAoZ3N0X2FscGhhX2luaXQpLAorCSAgKGdzdF9hbHBoYV9zZXRfcHJvcGVydHkpLCAoZ3N0X2FscGhhX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X2FscGhhX2Nocm9tYV9rZXlfYXl1diksIChnc3RfYWxwaGFfY2hyb21ha2V5X3Jvd19pNDIwKToKKwkgIFRyeSB0byBza2lwIHBpeGVscyBvciBhcmVhcyB0aGF0IGFyZSB0b28gZGFyayBvciB0b28gYnJpZ2h0IGZvciB1cyB0byBkbworCSAgbWVhbmluZ2Z1bGwgY29sb3IgZGV0ZWN0aW9uLgorCSAgQWRkZWQgcHJvcGVydGllcyB0byBjb250cm9sIHRoZSBzZW5zaXRpdml0eSB0byBsaWdodCBhbmQgZGFya25lc3MuCisJICBBZGRlZCBzb21lIHNtYWxsIGNsZWFudXBzLiBGaXhlcyAjNTEyMzQ1LgorCisyMDA4LTA1LTI4IDIwOjAxOjMyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgSWdub3JlIHNvbWUgbW9yZSBnZW5lcmF0ZWQgdGhpbmdzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zLy5jdnNpZ25vcmU6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6CisJICBJZ25vcmUgc29tZSBtb3JlIGdlbmVyYXRlZCB0aGluZ3MKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBJZ25vcmUgT1NTIGVsZW1lbnRzIGluIHRoZSBzdGF0ZSBjaGFuZ2VzIHRlc3QgdG9vLgorCisyMDA4LTA1LTI4IDE2OjIyOjM2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBkb2NzL3BsdWdpbnMvOiBBZGQgU01QVEUgZWZmZWN0IGVsZW1lbnRzIHRvIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBBZGQgU01QVEUgZWZmZWN0IGVsZW1lbnRzIHRvIGRvY3MuCisKKzIwMDgtMDUtMjggMTQ6MzE6MDUgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgRG9jdW1lbnQgd2hhdHMgZmlyc3Qgc2hvd24gb24gdGhlIGZkbyBwbHVnaW4gZG9jcyBwYWdlIDopCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOgorCSAgRG9jdW1lbnQgd2hhdHMgZmlyc3Qgc2hvd24gb24gdGhlIGZkbyBwbHVnaW4gZG9jcyBwYWdlIDopCisKKzIwMDgtMDUtMjggMTQ6MDc6MjEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgUmVuYW1lIGF1ZGlvdm9pY2UgdG8gYXVkaW9rYXJhb2tlIGFuZCBhZGQgaXQgdG8gdGhlIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkgICogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZnguYzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9rYXJhb2tlLmM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5oOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3ZvaWNlLmM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvdm9pY2UuaDoKKwkgIFJlbmFtZSBhdWRpb3ZvaWNlIHRvIGF1ZGlva2FyYW9rZSBhbmQgYWRkIGl0IHRvIHRoZSBkb2NzLgorCisyMDA4LTA1LTI4IDEzOjI4OjIwICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIERvY3VtZW50IGFhc2luayBhbmQgY2FjYXNpbmsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogUkVRVUlSRU1FTlRTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jZGlvLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSAgKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJICAqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6CisJICBEb2N1bWVudCBhYXNpbmsgYW5kIGNhY2FzaW5rLgorCisyMDA4LTA1LTI4IDA4OjM2OjQ0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuKjogZHVyYXRpb24gYW5kIGxhdGVuY3kgcXVlcmllcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IChnc3RfdmlkZW9taXhlcl9yZXNldCksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfaW5pdCksIChnc3RfdmlkZW9taXhlcl9xdWVyeV9kdXJhdGlvbiksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfcXVlcnlfbGF0ZW5jeSksIChnc3RfdmlkZW9taXhlcl9xdWVyeSksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfYmxlbmRfYnVmZmVycyk6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuaDoKKwkgIEltcGxlbWVudCBwb3NpdGlvbiAoaW4gdGltZSksIGR1cmF0aW9uIGFuZCBsYXRlbmN5IHF1ZXJpZXMuCisKKzIwMDgtMDUtMjggMDg6MTQ6MTYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOiBJbXBsZW1lbnQgbGF0ZW5jeSBxdWVyeS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6IChnc3RfaW50ZXJsZWF2ZV9zcmNfcXVlcnlfZHVyYXRpb24pLAorCSAgKGdzdF9pbnRlcmxlYXZlX3NyY19xdWVyeV9sYXRlbmN5KSwgKGdzdF9pbnRlcmxlYXZlX3NyY19xdWVyeSk6CisJICBJbXBsZW1lbnQgbGF0ZW5jeSBxdWVyeS4KKworMjAwOC0wNS0yNyAxNzo1NTozMCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci4qOiBJbXBsZW1lbnQgcHJvcGVyIHNlZWsvbmV3c2VnbWVudCBoYW5kbGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IChnc3RfdmlkZW9taXhlcl9yZXNldCksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfaW5pdCksIChnc3RfdmlkZW9taXhlcl9yZXF1ZXN0X25ld19wYWQpLAorCSAgKGdzdF92aWRlb21peGVyX2ZpbGxfcXVldWVzKSwgKGZvcndhcmRfZXZlbnRfZnVuYyksCisJICAoZm9yd2FyZF9ldmVudCksIChnc3RfdmlkZW9taXhlcl9zcmNfZXZlbnQpLAorCSAgKGdzdF92aWRlb21peGVyX3NpbmtfZXZlbnQpOgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmg6CisJICBJbXBsZW1lbnQgcHJvcGVyIHNlZWsvbmV3c2VnbWVudCBoYW5kbGluZy4KKwkgIEJhc2VkIG9uIGFkZGVyJ3MgaW1wbGVtZW50YXRpb24uCisJICBGaXhlcyAjNTM1MTIxCisKKzIwMDgtMDUtMjYgMTY6MjU6MTUgKzAwMDAgIGpeIDxqQG9pbDIxLm9yZz4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgY2FwcyBmb3IgRFZDUFJPNTAgYW5kIERWQ1BSTyBIRCBQQUwvTlRTQy4gU2VlICM1MjY0ODEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBqXiA8aiBhdCBvaWwyMSBkb3Qgb3JnPgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3ZpZGVvX2NhcHMpOgorCSAgQWRkIGNhcHMgZm9yIERWQ1BSTzUwIGFuZCBEVkNQUk8gSEQgUEFML05UU0MuIFNlZSAjNTI2NDgxLgorCisyMDA4LTA1LTI2IDE1OjUxOjQxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvYXVkaW9meC86IEFkZCBzaW1wbGUgdm9pY2UgcmVtb3ZhbCBlbGVtZW50LiBZYXkga2FyYW9rZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9meC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3ZvaWNlLmM6IChnc3RfYXVkaW9fdm9pY2VfYmFzZV9pbml0KSwKKwkgIChnc3RfYXVkaW9fdm9pY2VfY2xhc3NfaW5pdCksIChnc3RfYXVkaW9fdm9pY2VfaW5pdCksCisJICAodXBkYXRlX2ZpbHRlciksIChnc3RfYXVkaW9fdm9pY2Vfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfYXVkaW9fdm9pY2VfZ2V0X3Byb3BlcnR5KSwgKGdzdF9hdWRpb192b2ljZV9zZXR1cCksCisJICAoZ3N0X2F1ZGlvX3ZvaWNlX3RyYW5zZm9ybV9pbnQpLCAoZ3N0X2F1ZGlvX3ZvaWNlX3RyYW5zZm9ybV9mbG9hdCksCisJICAoZ3N0X2F1ZGlvX3ZvaWNlX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvdm9pY2UuaDoKKwkgIEFkZCBzaW1wbGUgdm9pY2UgcmVtb3ZhbCBlbGVtZW50LiBZYXkga2FyYW9rZS4KKworMjAwOC0wNS0yNiAxNTozOToyNiArMDAwMCAgV2lsbGlhbSBNLiBCcmFjayA8d2JyYWNrQG1tbS5jb20uaGs+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogRml4IHBvdGVudGlhbCBjYXBzIGxlYWsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBXaWxsaWFtIE0uIEJyYWNrIDx3YnJhY2sgYXQgbW1tIGRvdCBjb20gZG90IGhrPgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19wcm9iZV9jYXBzX2Zvcl9mb3JtYXQpOgorCSAgRml4IHBvdGVudGlhbCBjYXBzIGxlYWsuCisJICBJZiB3ZSBjYW4ndCBnZXQgdGhlIGZyYW1lcmF0ZSB3aXRoIGFuIGlvY3RsLCB0cnkgdG8gZ2V0IGl0IHdpdGggdGhlCisJICBjdXJyZW50IG5vcm0uIEZpeGVzICM1MjAwOTIuCisKKzIwMDgtMDUtMjYgMTU6MTQ6NTUgKzAwMDAgIFdpbGxpYW0gTS4gQnJhY2sgPHdicmFja0BtbW0uY29tLmhrPgorCisJICBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IElmIHdlIGZhaWwgdG8gZ2V0IHRoZSBmcmFtZSBpbnRlcnZhbHMsIHNpbXBseSBkb24ndCB0b3VjaCB0aGUgZnJhbWVyYXRlcyBvbiB0aGUgdGVtcGxhdGUgY2EuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFdpbGxpYW0gTS4gQnJhY2sgPHdicmFjayBhdCBtbW0gZG90IGNvbSBkb3QgaGs+CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIChnc3RfdjRsMnNyY19wcm9iZV9jYXBzX2Zvcl9mb3JtYXRfYW5kX3NpemUpOgorCSAgSWYgd2UgZmFpbCB0byBnZXQgdGhlIGZyYW1lIGludGVydmFscywgc2ltcGx5IGRvbid0IHRvdWNoIHRoZSBmcmFtZXJhdGVzCisJICBvbiB0aGUgdGVtcGxhdGUgY2FwcyBpbnN0ZWFkIG9mIGRpc2NhcmRpbmcgdGhlIGZvcm1hdC4gU2VlICM1MjAwOTIuCisKKzIwMDgtMDUtMjYgMTQ6NTI6NTEgKzAwMDAgIFdpbGxpYW0gTS4gQnJhY2sgPHdicmFja0BtbW0uY29tLmhrPgorCisJICBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IEFkZCBOVjEyLCBOVjIxIGFuZCBiYXllciBzdXBwb3J0LiBTZWUgIzUyMDA5Mi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFdpbGxpYW0gTS4gQnJhY2sgPHdicmFjayBhdCBtbW0gZG90IGNvbSBkb3QgaGs+CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX3Y0bDJmb3VyY2NfdG9fc3RydWN0dXJlKSwKKwkgIChnc3RfdjRsMl9nZXRfY2Fwc19pbmZvKToKKwkgIEFkZCBOVjEyLCBOVjIxIGFuZCBiYXllciBzdXBwb3J0LiBTZWUgIzUyMDA5Mi4KKworMjAwOC0wNS0yNiAxMzo1MTozOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBVbmJyZWFrIHNlZ21lbnQgYWN0aXZhdGlvbiBhZ2Fpbi4gRml4ZXMgIzUzMTY3Mi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9maW5kX3NlZ21lbnQpLAorCSAgKGdzdF9xdGRlbXV4X2FjdGl2YXRlX3NlZ21lbnQpOgorCSAgVW5icmVhayBzZWdtZW50IGFjdGl2YXRpb24gYWdhaW4uIEZpeGVzICM1MzE2NzIuCisKKzIwMDgtMDUtMjYgMTA6Mjg6NDcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6IEFkZCBhbm90aGVyIGV4YW1wbGUgbGF1bmNoIGxpbmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJICBBZGQgYW5vdGhlciBleGFtcGxlIGxhdW5jaCBsaW5lLgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6IChpbnRlcmxlYXZlXzI0KSwKKwkgIChnc3RfaW50ZXJsZWF2ZV9maW5hbGl6ZSksIChnc3RfaW50ZXJsZWF2ZV9iYXNlX2luaXQpLAorCSAgKGdzdF9pbnRlcmxlYXZlX2NsYXNzX2luaXQpLCAoZ3N0X2ludGVybGVhdmVfaW5pdCksCisJICAoZ3N0X2ludGVybGVhdmVfcmVxdWVzdF9uZXdfcGFkKSwgKGdzdF9pbnRlcmxlYXZlX3JlbGVhc2VfcGFkKSwKKwkgIChnc3RfaW50ZXJsZWF2ZV9jaGFuZ2Vfc3RhdGUpLCAoX19yZW1vdmVfY2hhbm5lbHMpLAorCSAgKF9fc2V0X2NoYW5uZWxzKSwgKGdzdF9pbnRlcmxlYXZlX3NpbmtfZ2V0Y2FwcyksCisJICAoZ3N0X2ludGVybGVhdmVfc2V0X3Byb2Nlc3NfZnVuY3Rpb24pLAorCSAgKGdzdF9pbnRlcmxlYXZlX3Npbmtfc2V0Y2FwcyksIChnc3RfaW50ZXJsZWF2ZV9zaW5rX2V2ZW50KSwKKwkgIChnc3RfaW50ZXJsZWF2ZV9zcmNfcXVlcnlfZHVyYXRpb24pLCAoZ3N0X2ludGVybGVhdmVfc3JjX3F1ZXJ5KSwKKwkgIChmb3J3YXJkX2V2ZW50X2Z1bmMpLCAoZm9yd2FyZF9ldmVudCksIChnc3RfaW50ZXJsZWF2ZV9zcmNfZXZlbnQpLAorCSAgKGdzdF9pbnRlcmxlYXZlX2NvbGxlY3RlZCk6CisJICAqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuaDoKKwkgIE1ham9yIHJld3JpdGUgb2YgaW50ZXJsZWF2ZSB1c2luZyBHc3RDb2xsZWN0cGFkcy4gVGhpcyBuZXcgdmVyc2lvbgorCSAgYWxzbyBzdXBwb3J0cyBhbG1vc3QgYWxsIHJhdyBhdWRpbyBmb3JtYXRzIGFuZCBoYXMgYmV0dGVyIGNhcHMKKwkgIG5lZ290aWF0aW9uLiBGaXhlcyBidWcgIzUwNjU5NC4KKwkgIEFsc28gdXBkYXRlIGRvY3MgYW5kIGFkZCBzb21lIG1vcmUgZXhhbXBsZXMuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ludGVybGVhdmUuYzogKGludGVybGVhdmVfY2hhaW5fZnVuYyksCisJICAoR1NUX1NUQVJUX1RFU1QpLCAoc3JjX2hhbmRvZmZfZmxvYXQzMiksIChzaW5rX2hhbmRvZmZfZmxvYXQzMiksCisJICAoaW50ZXJsZWF2ZV9zdWl0ZSk6CisJICBBZGQgc29tZSBtb3JlIGV4dGVuc2l2ZSB1bml0IHRlc3RzIGZvciBpbnRlcmxlYXZlLgorCisyMDA4LTA1LTI2IDA5OjU3OjQwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBEb24ndCB1c2UgX2dzdF9wYWQoKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleGFtcGxlcy9zd2l0Y2gvc3dpdGNoZXIuYzogKHN3aXRjaF90aW1lcik6CisJICAqIGdzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmM6IChnc3Rfcmdfdm9sdW1lX2luaXQpOgorCSAgKiBnc3QvcnRwbWFuYWdlci9nc3RydHBjbGllbnQuYzogKGNyZWF0ZV9zdHJlYW0pOgorCSAgKiBnc3Qvc2RwL2dzdHNkcGRlbXV4LmM6IChnc3Rfc2RwX2RlbXV4X3N0cmVhbV9jb25maWd1cmVfdWRwKSwKKwkgIChnc3Rfc2RwX2RlbXV4X3N0cmVhbV9jb25maWd1cmVfdWRwX3NpbmspOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGVhdmUuYzogKEdTVF9TVEFSVF9URVNUKSwKKwkgIChwYWRfYWRkZWRfc2V0dXBfZGF0YV9jaGVja19mbG9hdDMyXzhjaF9jYik6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzogKHNlbmRfZW9zX2V2ZW50KSwKKwkgIChzZW5kX3RhZ19ldmVudCk6CisJICBEb24ndCB1c2UgX2dzdF9wYWQoKS4KKworMjAwOC0wNS0yNSAxNjowOTozOSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvZmxhYy86IFNldCB0aGUgY2hhbm5lbCBsYXlvdXQgd2hlbiBkZWNvZGluZyBGTEFDIGZpbGVzIHdpdGggbW9yZSB0aGFuIDIgY2hhbm5lbHMgYXMgZGVmaW5lZCBieSB0aGUgRkxBQyBzcGVjLiBGaXguLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX3dyaXRlKToKKwkgIFNldCB0aGUgY2hhbm5lbCBsYXlvdXQgd2hlbiBkZWNvZGluZyBGTEFDIGZpbGVzIHdpdGggbW9yZSB0aGFuIDIKKwkgIGNoYW5uZWxzIGFzIGRlZmluZWQgYnkgdGhlIEZMQUMgc3BlYy4gRml4ZXMgYnVnICM1MzQ1NzAuCisJICBBbHNvIGRvbid0IHRyeSB0byBkZWNvZGUgbGVmdC9zaWRlLCByaWdodC9zaWRlIGFuZCBtaWQvc2lkZSBmaWxlcworCSAgYXMgd2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIGF0IGFsbC4KKworMjAwOC0wNS0yNCAxMjo1NTozOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBXZSBuZWVkIC1iYXNlIENWUyAocnRzcCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgV2UgbmVlZCAtYmFzZSBDVlMgKHJ0c3ApLgorCisyMDA4LTA1LTIyIDE5OjQ3OjUzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGRvY3MvcGx1Z2lucy86IEFkZCBpbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZSB0byB0aGUgZG9jcyBhbmQgd2hpbGUgYXQgdGhhdCBydW4gbWFrZSB1cGRhdGUgaW4gZG9jcy9wbHVnaW5zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLnNpZ25hbHM6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHNhc3BkaWYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW1yd2IueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWJheWVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWJ6Mi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jZGF1ZGlvLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkeGFwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZmJ2aWRlb3NpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRzZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2Yi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdmRzcHUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmFhYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mYWFkLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZiZGV2c2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mZXN0aXZhbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1maWx0ZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx2ZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZnJlZXplLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzbS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWgyNjRwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGFkc3BhLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1ldGFkYXRhLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1tcy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb2RwbHVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1wZWcyZW5jLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1wZWc0dmlkZW9wYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGVndHNwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGVndmlkZW9wYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdXNlcGFjay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdXNpY2JyYWluei54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdmUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmFzLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5lb24ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbnNmZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW51dmRlbXV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJhd3BhcnNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlYWwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZmJzcmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2RsLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNkcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zZWxlY3Rvci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbmRmaWxlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdW5kdG91Y2gueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BjZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWVkLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4cmVzYW1wbGUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3RlcmVvLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXR0YS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12Y2RzcmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9zaWduYWwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdm1uYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13aWxkbWlkaS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14MjY0LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXh2aWQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbDoKKwkgIEFkZCBpbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZSB0byB0aGUgZG9jcyBhbmQgd2hpbGUgYXQgdGhhdAorCSAgcnVuIG1ha2UgdXBkYXRlIGluIGRvY3MvcGx1Z2lucy4KKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6CisJICBBZGQgYSBwYXJhcHJhcGggYWJvdXQgdXNpbmcgYSBxdWV1ZSBhbmQgYXVkaW9jb252ZXJ0IGFmdGVyIHRoZSBzb3VyY2UKKwkgIHBhZHMgdG8gdGhlIGRvY3MuCisKKzIwMDgtMDUtMjIgMTg6NTU6MDkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLio6IERvbid0IHNldCBhIGdldGNhcHMoKSBmdW5jdGlvbiBvbiB0aGUgc3JjIHBhZHMgYXMgaXQncyBub3QgcmVxdWlyZWQgYW5kIHRoZSBkZWZhdWx0IGdlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6IChnc3RfZGVpbnRlcmxlYXZlX2Jhc2VfaW5pdCksCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9jbGFzc19pbml0KSwgKGdzdF9kZWludGVybGVhdmVfaW5pdCksCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9hZGRfbmV3X3BhZHMpLCAoZ3N0X2RlaW50ZXJsZWF2ZV9zaW5rX2dldGNhcHMpOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuaDoKKwkgIERvbid0IHNldCBhIGdldGNhcHMoKSBmdW5jdGlvbiBvbiB0aGUgc3JjIHBhZHMgYXMgaXQncyBub3QgcmVxdWlyZWQKKwkgIGFuZCB0aGUgZGVmYXVsdCBnZXRjYXBzKCkgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29ycmVjdCByZXN1bHRzIGZvcgorCSAgb3VyIHNyYyBwYWRzLgorCSAgQ29tcGxldGUgZG9jdW1lbnRhdGlvbiBhbmQgYWRkIG15c2VsZiB0byB0aGUgYXV0aG9ycyBvZiB0aGUgZWxlbWVudC4KKworMjAwOC0wNS0yMiAxNDo0OTowOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3VkcC9NYWtlZmlsZS5hbTogQWRkIC1EX0dOVV9TT1VSQ0UgdG8gQ0ZMQUdTIHNvIHdlIGdldCB0aGluZ3MgbGlrZSBFQUlfQUREUkZBTUlMWSB3aGVuIGluY2x1ZGluZyBuZXRkYi5oIHdoZW4gYnVpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkgIEFkZCAtRF9HTlVfU09VUkNFIHRvIENGTEFHUyBzbyB3ZSBnZXQgdGhpbmdzIGxpa2UgRUFJX0FERFJGQU1JTFkKKwkgIHdoZW4gaW5jbHVkaW5nIG5ldGRiLmggd2hlbiBidWlsZGluZyBhZ2FpbnN0IGdsaWJjID49IDIuOC4KKworMjAwOC0wNS0yMiAxMToxOTowMyArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6IEZpeCBkZWJ1ZyBzdGF0ZW1lbnQgYXJndW1lbnRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA4LTA1LTIyICBKdWxpZW4gTW91dHRlICA8anVsaWVuQGZsdWVuZG8uY29tPgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5jOiAoZ3N0X3NtcHRlX2FscGhhX3NldGNhcHMpOiBGaXgKKwkgIGRlYnVnIHN0YXRlbWVudCBhcmd1bWVudHMuCisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChnc3RfbXVsdGl1ZHBzaW5rX3NldHVwX3Fvc19kc2NwKToKKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOiAoZ3N0X3VkcF9qb2luX2dyb3VwKSwKKwkgIChnc3RfdWRwX2xlYXZlX2dyb3VwKTogRml4IElQIGFuZCBJUFY2IG9wdGlvbnMgdG8gbWFrZSBpdCB3b3JrCisJICBvbiBtb3JlIHBsYXRmb3Jtcy4KKworMjAwOC0wNS0yMSAxNzo1MTowOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvOiBEb24ndCB1c2UgZ3N0X2VsZW1lbnRfZ2V0X3BhZCgpLCBpdCdzIGEgYmFkLCBiYWQgbWV0aG9kLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOiAoc2V0dXBfc3JjX3BhZCksCisJICAodGVhcmRvd25fc3JjX3BhZCk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ljeWRlbXV4LmM6IChpY3lkZW11eF9mb3VuZF9wYWQpLAorCSAgKEdTVF9TVEFSVF9URVNUKToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FtdXguYzogKHNldHVwX3NyY19wYWQpLAorCSAgKHRlYXJkb3duX3NyY19wYWQpLCAoc2V0dXBfc2lua19wYWQpLCAodGVhcmRvd25fc2lua19wYWQpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2Nyb3AuYzogKHZpZGVvX2Nyb3BfZ2V0X3Rlc3RfY2FwcyksCisJICAoR1NUX1NUQVJUX1RFU1QpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrcGFyc2UuYzogKHdhdnBhY2twYXJzZV9mb3VuZF9wYWQpLAorCSAgKHNldHVwX3dhdnBhY2twYXJzZSksIChjbGVhbnVwX3dhdnBhY2twYXJzZSk6CisJICBEb24ndCB1c2UgZ3N0X2VsZW1lbnRfZ2V0X3BhZCgpLCBpdCdzIGEgYmFkLCBiYWQgbWV0aG9kLgorCisyMDA4LTA1LTIxIDE3OjM5OjM4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBEb24ndCB1c2UgZ3N0X2VsZW1lbnRfZ2V0X3BhZCgpLCBpdCdzIGEgYmFkIG1ldGhvZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NyYy5jOiAoZ3N0X2djb25mX2F1ZGlvX3NyY19yZXNldCksCisJICAoZG9fdG9nZ2xlX2VsZW1lbnQpOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NpbmsuYzogKGdzdF9nY29uZl92aWRlb19zaW5rX3Jlc2V0KSwKKwkgIChkb190b2dnbGVfZWxlbWVudCk6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc3JjLmM6IChnc3RfZ2NvbmZfdmlkZW9fc3JjX3Jlc2V0KSwKKwkgIChkb190b2dnbGVfZWxlbWVudCk6CisJICAqIGV4dC9nY29uZi9nc3Rzd2l0Y2hzaW5rLmM6IChnc3Rfc3dpdGNoX2NvbW1pdF9uZXdfa2lkKToKKwkgICogZXh0L2hhbC9nc3RoYWxhdWRpb3NpbmsuYzogKGdzdF9oYWxfYXVkaW9fc2lua19yZXNldCksCisJICAoZG9fdG9nZ2xlX2VsZW1lbnQpOgorCSAgKiBleHQvaGFsL2dzdGhhbGF1ZGlvc3JjLmM6IChnc3RfaGFsX2F1ZGlvX3NyY19yZXNldCksCisJICAoZG9fdG9nZ2xlX2VsZW1lbnQpOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6IChnc3RfYXV0b19hdWRpb19zaW5rX3Jlc2V0KSwKKwkgIChnc3RfYXV0b19hdWRpb19zaW5rX2RldGVjdCk6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzogKGdzdF9hdXRvX3ZpZGVvX3NpbmtfcmVzZXQpLAorCSAgKGdzdF9hdXRvX3ZpZGVvX3NpbmtfZGV0ZWN0KToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfaW5pdCksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWUpLCAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV91ZHApLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdWRwX3NpbmspLCAoZ3N0X3J0c3BzcmNfc2tpcF9sd3MpLAorCSAgKGdzdF9ydHNwc3JjX3Vuc2tpcF9sd3MpLCAoZ3N0X3J0c3BzcmNfc2tpcF9jb21tYXMpLAorCSAgKGdzdF9ydHNwc3JjX3NraXBfaXRlbSksIChnc3RfcnRzcF9kZWNvZGVfcXVvdGVkX3N0cmluZyksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfZGlnZXN0X2NoYWxsZW5nZSksIChnc3RfcnRzcHNyY19wYXJzZV9hdXRoX2hkcik6CisJICAqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6ICh0ZXN0X3dpdGhfY2FwcyksCisJICAodmlkZW9fY3JvcF9nZXRfdGVzdF9jYXBzKToKKwkgIERvbid0IHVzZSBnc3RfZWxlbWVudF9nZXRfcGFkKCksIGl0J3MgYSBiYWQgbWV0aG9kLgorCisyMDA4LTA1LTIxIDE3OjM1OjUwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwLzogSm9pbmluZyBhIG11bHRpY2FzdCBncm91cCBhbmQgc2V0dGluZyB0aGUgbG9vcC90dGwgcHJvcGVydGllcyBhcmUgdG90YWxseSB1bnJlbGF0ZWQgdGFza3MgYXJlIG11c3QgYmUgc2VwYXIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19pbml0X3NlbmQpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfYWRkX2ludGVybmFsKToKKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOiAoZ3N0X3VkcF9zZXRfbG9vcF90dGwpLAorCSAgKGdzdF91ZHBfam9pbl9ncm91cCk6CisJICAqIGdzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaDoKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfc3RhcnQpOgorCSAgSm9pbmluZyBhIG11bHRpY2FzdCBncm91cCBhbmQgc2V0dGluZyB0aGUgbG9vcC90dGwgcHJvcGVydGllcyBhcmUKKwkgIHRvdGFsbHkgdW5yZWxhdGVkIHRhc2tzIGFyZSBtdXN0IGJlIHNlcGFyYXRlZC4KKworMjAwOC0wNS0yMSAxNDowOTo0MSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aW11eC5jOiBBbHNvIHN1cHBvcnQgYWxhdy9tdWxhdy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgQWxzbyBzdXBwb3J0IGFsYXcvbXVsYXcuCisKKzIwMDgtMDUtMjEgMTM6NDc6NDMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLio6IEFkZCBhIGZpeG1lIGZvciB0aGUgYXV0by1tdWx0aWNhc3QgcHJvcGVydHkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogKGdzdF9tdWx0aXVkcHNpbmtfY2xhc3NfaW5pdCksCisJICAoZ3N0X211bHRpdWRwc2lua19zZXR1cF9xb3NfZHNjcCksIChnc3RfbXVsdGl1ZHBzaW5rX2FkZF9pbnRlcm5hbCk6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICBBZGQgYSBmaXhtZSBmb3IgdGhlIGF1dG8tbXVsdGljYXN0IHByb3BlcnR5LgorCSAgRml4IHNvbWUgY29uZnVzaW5nIGRlYnVnIG1lc3NhZ2VzLgorCSAgRGlzYWJsZSBzZXR0aW5nIGEgcW9zIHZhbHVlIGJ5IGRlZmF1bHQuCisKKzIwMDgtMDUtMjEgMTE6Mzg6MTcgKzAwMDAgIEd1c3RhZiBSw6RudGlsw6QgPGcucmFudGlsYUBnbWFpbC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IElnbm9yZSBFUEVSTSBlcnJvcnMgZnJvbSBzZW5kdG8uIEZpeGVzICM1MzM2MTkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBHdXN0YWYgUsOkbnRpbMOkIDxnIGRvdCByYW50aWxhIGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChnc3RfbXVsdGl1ZHBzaW5rX3JlbmRlcik6CisJICBJZ25vcmUgRVBFUk0gZXJyb3JzIGZyb20gc2VuZHRvLiBGaXhlcyAjNTMzNjE5LgorCisyMDA4LTA1LTIxIDEwOjUxOjUyICswMDAwICBIZW5yaWsgRXJpa3Nzb24gPGhlbnJpa2VuQGF4aXMuY29tPgorCisJICBnc3QvdWRwL2dzdG11bHRpdWRwc2luay4qOiBBZGQgcW9zLWRzY3AgcHJvcGVydHkgdG8gbWFuYWdlIHRoZSBRdWFsaXR5IG9mIHNlcnZpY2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBIZW5yaWsgRXJpa3Nzb24gPGhlbnJpa2VuIGF0IGF4aXMgZG90IGNvbT4KKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogKGdzdF9tdWx0aXVkcHNpbmtfY2xhc3NfaW5pdCksCisJICAoZ3N0X211bHRpdWRwc2lua19pbml0KSwgKGdzdF9tdWx0aXVkcHNpbmtfc2V0dXBfcW9zX2RzY3ApLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX2luaXRfc2VuZCksIChnc3RfbXVsdGl1ZHBzaW5rX2FkZF9pbnRlcm5hbCk6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICBBZGQgcW9zLWRzY3AgcHJvcGVydHkgdG8gbWFuYWdlIHRoZSBRdWFsaXR5IG9mIHNlcnZpY2UuCisKKzIwMDgtMDUtMjEgMTA6MDk6MjMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzogSW1wcm92ZSBkZWJ1Z2dpbmcgb2YgdGhlIGlkZW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzogKGdzdF9ydHBfdGhlb3JhX2RlcGF5X3Byb2Nlc3MpOgorCSAgSW1wcm92ZSBkZWJ1Z2dpbmcgb2YgdGhlIGlkZW50LgorCisyMDA4LTA1LTIxIDA5OjU2OjAyICswMDAwICBCcnVubyBTYW50b3MgPGJydW5vZkB1YS5wdD4KKworCSAgZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy4qOiBQcm92aWRlIGEgYnVuY2ggb2YgaGVscGVyIG1ldGhvZHMgdG8gZGVhbCB3aXRoIElQdjQgYW5kIElQdjYgdHJhbnNwYXJlbnRseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEJydW5vIFNhbnRvcyA8YnJ1bm9mIGF0IHVhIGRvdCBwdD4KKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jOiAoZ3N0X3VkcF9nZXRfYWRkciksCisJICAoZ3N0X3VkcF9qb2luX2dyb3VwKSwgKGdzdF91ZHBfbGVhdmVfZ3JvdXApLAorCSAgKGdzdF91ZHBfaXNfbXVsdGljYXN0KToKKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5oOgorCSAgUHJvdmlkZSBhIGJ1bmNoIG9mIGhlbHBlciBtZXRob2RzIHRvIGRlYWwgd2l0aCBJUHY0IGFuZCBJUHY2CisJICB0cmFuc3BhcmVudGx5LgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19jbGFzc19pbml0KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX2luaXQpLCAoZ3N0X211bHRpdWRwc2lua19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3Byb3BlcnR5KSwgKGpvaW5fbXVsdGljYXN0KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX2luaXRfc2VuZCksIChnc3RfbXVsdGl1ZHBzaW5rX2FkZF9pbnRlcm5hbCksCisJICAoZ3N0X211bHRpdWRwc2lua19yZW1vdmUpOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgQWRkIG11bHRpY2FzdCBUVEwgYW5kIGxvb3BiYWNrIHByb3BlcnRpZXMuCisJICBVc2UgdGhlIGhlbHBlciBtZXRob2RzIHRvIGltcGxlbWVudCBpcDQgYW5kIGlwNi4KKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfY3JlYXRlKSwgKGdzdF91ZHBzcmNfc3RhcnQpOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgVXNlIHRoZSBoZWxwZXIgbWV0aG9kcyB0byBpbXBsZW1lbnQgaXA0IGFuZCBpcDYuCisJICBGaXhlcyAjNTE1OTYyLgorCisyMDA4LTA1LTIxIDA5OjM4OjQ4ICswMDAwICBQYXRyaWNrIFJhZGl6aSA8cGF0cmljay5yYWRpemlAYXhpcy5jb20+CisKKwkgIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguKjogRG9uJ3QgYmxpbmRseSBjb3B5IHRoZSBtaW1lLXR5cGUgYXMgdGhlIGNhcHMgbmFtZSBiZWNhdXNlIHRoZXkgbm90IGFsd2F5cyBtYXAgZGlyZWN0bC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUGF0cmljayBSYWRpemkgPHBhdHJpY2sgZG90IHJhZGl6aSBhdCBheGlzIGRvdCBjb20+CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzogKGdzdF9tdWx0aXBhcnRfZGVtdXhfY2xhc3NfaW5pdCksCisJICAoZ3N0X211bHRpcGFydF9kZW11eF9nZXRfZ3N0bmFtZSksCisJICAoZ3N0X211bHRpcGFydF9maW5kX3BhZF9ieV9taW1lKSwgKGdzdF9tdWx0aXBhcnRfZGVtdXhfY2hhaW4pOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4Lmg6CisJICBEb24ndCBibGluZGx5IGNvcHkgdGhlIG1pbWUtdHlwZSBhcyB0aGUgY2FwcyBuYW1lIGJlY2F1c2UgdGhleSBub3QKKwkgIGFsd2F5cyBtYXAgZGlyZWN0bHkuIEluc3RlYWQgdXNlIGEgaGFzaHRhYmxlIHdpdGggY29tbW9uIG1hcHBpbmdzLgorCSAgRml4ZXMgIzUzMzI4Ny4KKworMjAwOC0wNS0yMCAxNzoyNzozNSArMDAwMCAgTWljaGFlbCBNZWVrcyA8bW1lZWtzQHhpbWlhbi5vcmc+CisKKwkgIGV4dC9lc2QvZXNkc2luay5jOiBXaGVuIHdlIHBvc3QgYW4gZXJyb3IsIHdlIG11c3QgcmV0dXJuIC0xIHRvIGxldCB0aGUgcGFyZW50IGtub3cgdGhhdCB3ZSBjYW5ub3Qgd3JpdGUgdGhlIHNlZ21lbnQgZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfd3JpdGUpOgorCSAgV2hlbiB3ZSBwb3N0IGFuIGVycm9yLCB3ZSBtdXN0IHJldHVybiAtMSB0byBsZXQgdGhlIHBhcmVudCBrbm93IHRoYXQgd2UKKwkgIGNhbm5vdCB3cml0ZSB0aGUgc2VnbWVudCBlbHNlIGl0IHdpbGwgbG9vcCBhbmQgY29udGludWUgdG8gY2FsbCB1cyBhZ2FpbgorCSAgZm9yZXZlci4gUGF0Y2ggYnkgTWljaGFlbCBNZWVrcy4KKworMjAwOC0wNS0yMCAxNDoyNDoyMSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IEFkZCBtaXNzaW5nIGluY3VkZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgQWRkIG1pc3NpbmcgaW5jdWRlcy4KKworMjAwOC0wNS0yMCAxMzo1Nzo0NCArMDAwMCAgUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2pAYXhpcy5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS4qOiBDb3JyZWN0IGEgdHlwbyAoc2lubGUgLT4gc2luZ2xlKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzogKGdzdF9oMjY0X3NjYW5fbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X3J0cF9oMjY0X3BheV9oYW5kbGVfYnVmZmVyKToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBDb3JyZWN0IGEgdHlwbyAoc2lubGUgLT4gc2luZ2xlKS4KKworMjAwOC0wNS0yMCAxMTozMzowNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuKjogQWRkIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBvdXRwdXR0aW5nIHF1aWNrdGltZS1saWtlIEFWQyBvdXRwdXQgaW4gYWRkaXRpb24gdG8gdGhlIGV4aXN0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzogKGdzdF9ydHBfaDI2NF9kZXBheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX2gyNjRfZGVwYXlfaW5pdCksIChnc3RfcnRwX2gyNjRfZGVwYXlfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2gyNjRfZGVwYXlfZ2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBfaDI2NF9kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX2gyNjRfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5Lmg6CisJICBBZGQgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIG91dHB1dHRpbmcgcXVpY2t0aW1lLWxpa2UgQVZDIG91dHB1dCBpbgorCSAgYWRkaXRpb24gdG8gdGhlIGV4aXN0aW5nIGJ5dGVzdHJlYW0gb3V0cHV0LgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzogKGdzdF9oMjY0X3NjYW5fbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X3J0cF9oMjY0X3BheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfaDI2NF9wYXlfaW5pdCksCisJICAoZ3N0X3J0cF9oMjY0X3BheV9zZXRjYXBzKSwgKGdzdF9ydHBfaDI2NF9wYXlfcGF5bG9hZF9uYWwpLAorCSAgKGdzdF9ydHBfaDI2NF9wYXlfaGFuZGxlX2J1ZmZlciksIChnc3RfcnRwX2gyNjRfcGF5X3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9oMjY0X3BheV9nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuaDoKKwkgIE1ha2UgdGhlIHBhcnNpbmcgbW9kZSBjb25maWd1cmFibGUsIGZvciBzb21lIGlucHV0cyB3ZSBkb24ndCBuZWVkIHRvCisJICBzY2FuIGV2ZXJ5IGJ5dGUgZm9yIHN0YXJ0IGNvZGVzLgorCSAgT25seSBzZXQgdGhlIG1hcmtlciBiaXQgb24gQUNDRVNTIHVuaXRzLgorCisyMDA4LTA1LTIwIDEwOjQ3OjEwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6IFVzZSBhIGJpZ2dlciB0eXBlIGluIGludGVnZXIgbW9kZSBmb3IgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzIHRvIHByZXZlbnQgb3ZlcmZsb3dzLi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJICBVc2UgYSBiaWdnZXIgdHlwZSBpbiBpbnRlZ2VyIG1vZGUgZm9yIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyB0bworCSAgcHJldmVudCBvdmVyZmxvd3MuIFRoaXMgZml4ZXMgdGhlIGNyaXBwbGVkIHNvdW5kIHdoZW4gdXNpbmcgdGhlCisJICBlcXVhbGl6ZXIgaW4gaW50ZWdlciBtb2RlLiBGaXhlcyBidWcgIzUxMDg2NS4KKworMjAwOC0wNS0yMCAxMDo0MjozMyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuKjogSW5zdGVhZCBvZiBhIHJhbmRvbSBudW1iZXIgZm9yIHRoZSByZXF1ZXN0IHBhZCBpZCdzLCB1c2UgYSBjb3VudGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5oOgorCSAgSW5zdGVhZCBvZiBhIHJhbmRvbSBudW1iZXIgZm9yIHRoZSByZXF1ZXN0IHBhZCBpZCdzLAorCSAgdXNlIGEgY291bnRlci4KKwkgIFJlZ2lzdGVyIHRoZSB2aWRlb21peGVycGFkIGNsYXNzIGZyb20gdGhlIGVsZW1lbnQncyBjbGFzc19pbml0CisJICB3aGVyZSBpdCdzIHNhZmVyLCBhbmQgYWxsb3dzIHRoZSBkb2NzIGdlbmVyYXRvciB0byBzY2FuIGl0LgorCisyMDA4LTA1LTIwIDA5OjI5OjI4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3Qvc21wdGUvOiBBZGQgbmV3IHBsdWdpbiB0aGF0IGFkZHMgdGhlIFNNUFRFIHRyYW5zaXRpb24gaW4gdGhlIGFscGhhIGNoYW5uZWwgb2YKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc21wdGUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiAoZ3N0X3NtcHRlX3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3NtcHRlL2dzdHNtcHRlLmg6CisJICAqIGdzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmM6CisJICAoZ3N0X3NtcHRlX2FscGhhX3RyYW5zaXRpb25fdHlwZV9nZXRfdHlwZSksCisJICAoZ3N0X3NtcHRlX2FscGhhX2dldF90eXBlKSwgKGdzdF9zbXB0ZV9hbHBoYV9iYXNlX2luaXQpLAorCSAgKGdzdF9zbXB0ZV9hbHBoYV9jbGFzc19pbml0KSwgKGdzdF9zbXB0ZV9hbHBoYV91cGRhdGVfbWFzayksCisJICAoZ3N0X3NtcHRlX2FscGhhX3NldGNhcHMpLCAoZ3N0X3NtcHRlX2FscGhhX2dldF91bml0X3NpemUpLAorCSAgKGdzdF9zbXB0ZV9hbHBoYV9pbml0KSwgKGdzdF9zbXB0ZV9hbHBoYV9maW5hbGl6ZSksCisJICAoZ3N0X3NtcHRlX2FscGhhX2RvX2F5dXYpLCAoZ3N0X3NtcHRlX2FscGhhX2RvX2k0MjApLAorCSAgKGdzdF9zbXB0ZV9hbHBoYV90cmFuc2Zvcm0pLCAoZ3N0X3NtcHRlX2FscGhhX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3NtcHRlX2FscGhhX2dldF9wcm9wZXJ0eSksIChnc3Rfc21wdGVfYWxwaGFfcGx1Z2luX2luaXQpOgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5oOgorCSAgKiBnc3Qvc21wdGUvcGx1Z2luLmM6IChwbHVnaW5faW5pdCk6CisJICBBZGQgbmV3IHBsdWdpbiB0aGF0IGFkZHMgdGhlIFNNUFRFIHRyYW5zaXRpb24gaW4gdGhlIGFscGhhIGNoYW5uZWwgb2YKKwkgIEk0MjAgYW5kIEFZVVYgZnJhbWVzIHNvIHRoYXQgdGhleSBjYW4gYmUgYmxlbmRlZCB3aXRoIHZpZGVvbWl4ZXIgbGF0ZXIKKwkgIG9uLiBVc2VzIGFsbCBuaWNldGllcyBzdWNoIGFzIHVzaW5nIGJhc2UgdHJhbnNmb3JtIGZvciBlZmZpY2llbnQgYWxsb2MKKwkgIGFuZCBuZWdvdGlhdGlvbi4gSXQgY3VycmVudGx5IHJlcXVpcmVzIEdzdENvbnRyb2xsZXIgdG8gY29udHJvbCB0aGUKKwkgIHBvc2l0aW9uIGluIHRoZSB0cmFuc2l0aW9uIGVmZmVjdC4KKworMjAwOC0wNS0xOSAyMTowNTowMyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBUcnkgdXNpbmcgdGhheXRhbnMgbmV3IG1lY2hhbmlzbSB0byBnZXQgZXh0cmEgY2xhc3NlcyBpbnRvIHBsdWdpbiBkb2NzLiBBcGFyZW50bHkgd29ya3MgZm9yIHRoZSBFcS4gRm9yIFZpZGVvTWl4ZXIgdGguLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy50eXBlczoKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgVHJ5IHVzaW5nIHRoYXl0YW5zIG5ldyBtZWNoYW5pc20gdG8gZ2V0IGV4dHJhIGNsYXNzZXMgaW50byBwbHVnaW4KKwkgIGRvY3MuIEFwYXJlbnRseSB3b3JrcyBmb3IgdGhlIEVxLiBGb3IgVmlkZW9NaXhlciB0aGUgR09iamVjdCBzdHVmZiBpcworCSAgbWlzc2luZyBzdGlsbC4KKworMjAwOC0wNS0xOSAxMjozMjowNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGVhdmUuYzogU2V0IGtlZXAtcG9zaXRpb25zIHByb3BlcnR5IHRvIFRSVUUgZm9yIHRoZSA4IGNoYW5uZWwgdGVzdCB0byBlbnN1cmUgdGhhdCB0aGUgb3IuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9kZWludGVybGVhdmUuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIFNldCBrZWVwLXBvc2l0aW9ucyBwcm9wZXJ0eSB0byBUUlVFIGZvciB0aGUgOCBjaGFubmVsIHRlc3QgdG8gZW5zdXJlCisJICB0aGF0IHRoZSBvcmlnaW5hbCBjaGFubmVsIHBvc2l0aW9uIGlzIHNldCBvbiB0aGUgb3V0cHV0LgorCisyMDA4LTA1LTE5IDA3OjQ2OjA1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS4qOiBBZGQgYSBwcm9wZXJ0eSB0byBzZWxlY3Qgd2hldGhlciBjaGFubmVsIHBvc2l0aW9ucyBzaG91bGQgYmUga2VwdCBvbiB0aGUgbW9ubyBvdXRwdXQgYi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiAoZ3N0X2RlaW50ZXJsZWF2ZV9jbGFzc19pbml0KSwKKwkgIChnc3RfZGVpbnRlcmxlYXZlX2luaXQpLCAoZ3N0X2RlaW50ZXJsZWF2ZV9hZGRfbmV3X3BhZHMpLAorCSAgKGdzdF9kZWludGVybGVhdmVfc2V0X3BhZHNfY2FwcyksIChnc3RfZGVpbnRlcmxlYXZlX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuaDoKKwkgIEFkZCBhIHByb3BlcnR5IHRvIHNlbGVjdCB3aGV0aGVyIGNoYW5uZWwgcG9zaXRpb25zIHNob3VsZCBiZSBrZXB0IG9uCisJICB0aGUgbW9ubyBvdXRwdXQgYnVmZmVycyBvciBzaG91bGQgYmUgZHJvcHBlZC4KKworMjAwOC0wNS0xOCAxOToyNzo1OSArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IFNldCBwcm9wZXIgcmF0ZSBpbiBhdmkgc3RyZWFtIGhlYWRlciBmb3IgUENNIGF1ZGlvLCBhbmQgYWxzbyBkbyBzb21lIG1vcmUgc2FuaXR5IGNoZWNrcyBvbiBjYXBzIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpX211eF9hdWRzaW5rX3NldF9jYXBzKToKKwkgIFNldCBwcm9wZXIgcmF0ZSBpbiBhdmkgc3RyZWFtIGhlYWRlciBmb3IgUENNIGF1ZGlvLCBhbmQgYWxzbyBkbyBzb21lCisJICBtb3JlIHNhbml0eSBjaGVja3Mgb24gY2FwcyBpbiB0aGlzIGNhc2UuICBGaXhlcyAjNTExNDg5LgorCisyMDA4LTA1LTE3IDE5OjM5OjUzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS4qOiBRdWV1ZSBldmVudHMgdW50aWwgc3JjIHBhZHMgd2VyZSBhZGRlZCBhbmQgdGhleSBjYW4gYmUgc2VudC4gT3RoZXJ3aXNlIGRvd25zdHJlYW0gd2lsbC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiAoZ3N0X2RlaW50ZXJsZWF2ZV9maW5hbGl6ZSksCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9pbml0KSwgKGdzdF9kZWludGVybGVhdmVfc2lua19ldmVudCksCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9wcm9jZXNzKSwgKGdzdF9kZWludGVybGVhdmVfc2lua19hY3RpdmF0ZV9wdXNoKToKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmg6CisJICBRdWV1ZSBldmVudHMgdW50aWwgc3JjIHBhZHMgd2VyZSBhZGRlZCBhbmQgdGhleSBjYW4gYmUgc2VudC4gT3RoZXJ3aXNlCisJICBkb3duc3RyZWFtIHdpbGwgbmV2ZXIgZ2V0IHRoZSBmaXJzdCBuZXdzZWdtZW50IGV2ZW50LgorCisyMDA4LTA1LTE3IDE0OjA1OjAzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiBBbHdheXMgc2V0IHRoZSBjaGFubmVsIHBvc2l0aW9ucyB3aGVuIGdzdF9hdWRpb19nZXRfY2hhbm5lbF9wb3NpdGlvbnMoKSByZXR1cm5zIHNvbWV0aC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiAoZ3N0X2RlaW50ZXJsZWF2ZV9zaW5rX3NldGNhcHMpLAorCSAgKGdzdF9kZWludGVybGVhdmVfZ2V0Y2Fwcyk6CisJICBBbHdheXMgc2V0IHRoZSBjaGFubmVsIHBvc2l0aW9ucyB3aGVuIGdzdF9hdWRpb19nZXRfY2hhbm5lbF9wb3NpdGlvbnMoKQorCSAgcmV0dXJucyBzb21ldGhpbmcsIGV2ZW4gaWYgdGhleSdyZSBub3Qgc2V0IGluIHRoZSBjYXBzLiBUaGlzIG1ha2VzCisJICBzdXJlIHRoYXQgdGhlIG91dHB1dCBjaGFubmVscyBjYW4gYmUgaW50ZXJsZWF2ZWQgYWdhaW4gY29ycmVjdGx5CisJICBpbiB0aGUgbW9uby9zdGVyZW8gY2FzZXMgdG9vLgorCSAgRG9uJ3QgYXNrIGZvciB0aGUgcGVlcmNhcHMgb2YgdGhlIGN1cnJlbnQgcGFkIGluIGdldGNhcHMoKSBhcyB0aGlzCisJICBtaWdodCBjYWxsIGdldGNhcHMoKSBhZ2FpbiBhbmQgZGVhZGxvY2suCisKKzIwMDgtMDUtMTcgMTA6Mzg6MTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiBEb24ndCBpbmNsdWRlIHRoZSBnc3R2NGwyeG92ZXJsYXkuaCBoZWFkZXIgYXMgdGhlIFhPdmVybGF5IHN1cHBvcnQgaXNuJ3QgaW1wbGVtZW50ZWQgYXQgYWxsIHllLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgRG9uJ3QgaW5jbHVkZSB0aGUgZ3N0djRsMnhvdmVybGF5LmggaGVhZGVyIGFzIHRoZSBYT3ZlcmxheSBzdXBwb3J0CisJICBpc24ndCBpbXBsZW1lbnRlZCBhdCBhbGwgeWV0IGFuZCB0aGlzIHJlcXVpcmVzIFggaGVhZGVycyB0byBiZQorCSAgaW5zdGFsbGVkLiBGaXhlcyBidWcgIzUzMzI2NC4KKworMjAwOC0wNS0xNiAyMTo1NjoyNCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvaW50ZXJsZWF2ZS86IEFkZCBzdXBwb3J0IGZvciBhbGwgcmF3IGF1ZGlvIGZvcm1hdHMgYW5kIHByb3ZpZGUgYmV0dGVyIG5lZ290aWF0aW9uIGlmIHRoZSBjYXBzIGFyZSBjaGFuZ2luZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6IChkZWludGVybGVhdmVfMjQpLAorCSAgKGdzdF9kZWludGVybGVhdmVfZmluYWxpemUpLCAoZ3N0X2RlaW50ZXJsZWF2ZV9iYXNlX2luaXQpLAorCSAgKGdzdF9kZWludGVybGVhdmVfY2xhc3NfaW5pdCksIChnc3RfZGVpbnRlcmxlYXZlX2luaXQpLAorCSAgKGdzdF9kZWludGVybGVhdmVfYWRkX25ld19wYWRzKSwgKGdzdF9kZWludGVybGVhdmVfc2V0X3BhZHNfY2FwcyksCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9zZXRfcHJvY2Vzc19mdW5jdGlvbiksCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9zaW5rX3NldGNhcHMpLCAoX19yZW1vdmVfY2hhbm5lbHMpLAorCSAgKF9fc2V0X2NoYW5uZWxzKSwgKGdzdF9kZWludGVybGVhdmVfZ2V0Y2FwcyksCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9wcm9jZXNzKSwgKGdzdF9kZWludGVybGVhdmVfY2hhaW4pLAorCSAgKGdzdF9kZWludGVybGVhdmVfc2lua19hY3RpdmF0ZV9wdXNoKToKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmg6CisJICBBZGQgc3VwcG9ydCBmb3IgYWxsIHJhdyBhdWRpbyBmb3JtYXRzIGFuZCBwcm92aWRlIGJldHRlciBuZWdvdGlhdGlvbgorCSAgaWYgdGhlIGNhcHMgYXJlIGNoYW5naW5nLgorCSAgRG9uJ3QgYWxsb3cgY2hhbmdlcyBvZiB0aGUgY2hhbm5lbCBwb3NpdGlvbnMgYW5kIHNldCB0aGUgcG9zaXRpb24gb2YKKwkgIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgb24gdGhlIHNyYyBwYWQgY2Fwcy4KKwkgIEdlbmVyYWwgY2xlYW51cCBhbmQgc21hbGxlciBidWdmaXhlcy4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvZGVpbnRlcmxlYXZlLmM6IChmbG9hdF9idWZmZXJfY2hlY2tfcHJvYmUpOgorCSAgQ2hlY2sgdGhlIGNoYW5uZWwgcG9zaXRpb25zIG9uIHRoZSBvdXRwdXQgYnVmZmVyIGNhcHMuCisKKzIwMDgtMDUtMTYgMTc6NTA6MjAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBGaXggc29tZSBjb21waWxlciB3YXJuaW5ncy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrc3RyZWFtcmVhZGVyLmM6CisJICAqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tYXVkaW90ZXN0LmM6CisJICAqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tb3Nzc3JjLmM6CisJICBGaXggc29tZSBjb21waWxlciB3YXJuaW5ncy4KKworMjAwOC0wNS0xNCAxODoyODo0NiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzogU21hbGwgY29tbWVudCBhZGRlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOiAoZ3N0X3J0cF9oMjY0X2RlcGF5X3Byb2Nlc3MpOgorCSAgU21hbGwgY29tbWVudCBhZGRlZC4KKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6IChnc3RfcnRwX2gyNjRfcGF5X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfaDI2NF9wYXlfZGVjb2RlX25hbCksIChnc3RfcnRwX2gyNjRfcGF5X3BhcnNlX3Nwc19wcHMpLAorCSAgKGdzdF9ydHBfaDI2NF9wYXlfcGF5bG9hZF9uYWwpLCAoZ3N0X3J0cF9oMjY0X3BheV9oYW5kbGVfYnVmZmVyKToKKwkgIERlYnVnIHN0cmluZyBjbGVhbnVwcyAocmVtb3ZlIHRyYWlsaW5nIFxuKQorCSAgUmVmYWN0b3IgYW5kIGNsZWFuIHVwIHRoZSBwYXlsb2FkZXIgYSBiaXQgYW5kIG1ha2Ugc3VyZSB0aGF0IHdlIG9ubHkKKwkgIHB1dCBvbmUgTkFMIHVuaXQgaW4gYW4gUlRQIHBhY2tldCBldmVuIGlmIHRoZSBpbnB1dCBidWZmZXIgY29udGFpbnMKKwkgIG11bHRpcGxlIE5BTCB1bml0cy4KKwkgIEFkZCBzdXBvcnQgZm9yIEFWQyBmb3JtYXQgaW5wdXQuCisKKzIwMDgtMDUtMTQgMTc6NTg6NTAgKzAwMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuKjogTWFrZSBpdCBwb3NzaWJsZSB0byBzcGVjaWZ5IHByb2ZpbGUtbGV2ZWwtaWQgYW5kIHNwcm9wLXBhcmFtZXRlci1zZXRzIHVzaW5nIHByb3BlcnRpZXMgaW4gY2EuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzogKGdzdF9ydHBfaDI2NF9wYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9oMjY0X3BheV9maW5hbGl6ZSksIChnc3RfcnRwX2gyNjRfcGF5X2hhbmRsZV9idWZmZXIpLAorCSAgKGdzdF9ydHBfaDI2NF9wYXlfc2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBfaDI2NF9wYXlfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBNYWtlIGl0IHBvc3NpYmxlIHRvIHNwZWNpZnkgcHJvZmlsZS1sZXZlbC1pZCBhbmQgc3Byb3AtcGFyYW1ldGVyLXNldHMKKwkgIHVzaW5nIHByb3BlcnRpZXMgaW4gY2FzZSB0aGV5IGFyZSBub3QgYXZhaWxhYmxlIGluLXN0cmVhbS4KKworMjAwOC0wNS0xNCAxNDoxOTo0NyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06IEFkZCBkZWludGVybGVhdmUgdW5pdCB0ZXN0IHRvIFZBTEdSSU5EX1RPX0ZJWCwgc2luY2UgaXQgY2F1c2VzIHdlaXJkIGludmFsaWQgZnJlZSBlcnJvcnMgaW4gLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBBZGQgZGVpbnRlcmxlYXZlIHVuaXQgdGVzdCB0byBWQUxHUklORF9UT19GSVgsIHNpbmNlIGl0IGNhdXNlcworCSAgd2VpcmQgaW52YWxpZCBmcmVlIGVycm9ycyBpbiB2YWxncmluZC9saWJjIGFmdGVyIF9leGl0IGZvciBzb21lCisJICByZWFzb24uCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOiAocGFkc19jcmVhdGVkKSwKKwkgIChzZXRfY2hhbm5lbF9wb3NpdGlvbnMpLCAoc3JjX2hhbmRvZmZfZmxvYXQzMl84Y2gpLAorCSAgKGZsb2F0X2J1ZmZlcl9jaGVja19wcm9iZSksCisJICAocGFkX2FkZGVkX3NldHVwX2RhdGFfY2hlY2tfZmxvYXQzMl84Y2hfY2IpLAorCSAgKG1ha2VfZmFrZV9zcmNfOGNoYW5zX2Zsb2F0MzIpLCAoR1NUX1NUQVJUX1RFU1QpLAorCSAgKGRlaW50ZXJsZWF2ZV9zdWl0ZSk6CisJICBBZGQgc29tZSBtb3JlIGRlaW50ZXJsZWF2ZSB1bml0IHRlc3QgYml0cyBJIGhhZCBsb2NhbGx5LgorCisyMDA4LTA1LTE0IDEyOjUyOjE1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGRvY3MvcGx1Z2lucy86IFJlbW92ZSBsYWRzcGEgZnJvIHBsdWdpbi1kb2NzLCBpdHMgaW4gZ3N0LXBsdWdpbnMtYmFkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sYWRzcGEueG1sOgorCSAgUmVtb3ZlIGxhZHNwYSBmcm8gcGx1Z2luLWRvY3MsIGl0cyBpbiBnc3QtcGx1Z2lucy1iYWQuCisKKzIwMDgtMDUtMTQgMDc6MzI6NDQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ludGVybGVhdmUvOiBTcGxpdCBkZWZpbml0aW9ucyBpbnRvIHNlcGFyYXRlIGhlYWRlciBmaWxlcyBmb3IgYmV0dGVyIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmg6CisJICAqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuaDoKKwkgICogZ3N0L2ludGVybGVhdmUvcGx1Z2luLmg6CisJICBTcGxpdCBkZWZpbml0aW9ucyBpbnRvIHNlcGFyYXRlIGhlYWRlciBmaWxlcyBmb3IgYmV0dGVyIGRvY3VtZW50YXRpb24KKwkgIGdlbmVyYXRpb24uCisJICAqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiAoZ3N0X2RlaW50ZXJsZWF2ZV9iYXNlX2luaXQpLAorCSAgKGdzdF9kZWludGVybGVhdmVfY2xhc3NfaW5pdCksIChnc3RfZGVpbnRlcmxlYXZlX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9wcm9jZXNzKToKKwkgIERvbid0IHVzZSBhbGxvY2EsIGFsbG93IGNhcHMgY2hhbmdlcyBhcyBsb25nIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKwkgIGRvZXMgbm90IGNoYW5nZSwgZG9uJ3QgdXNlIGdfd2FybmluZywgcmV0dXJuIE5PVF9ORUdPVElBVEVEIGFzIGVhcmx5CisJICBhcyBwb3NzaWJsZSBhbmQgc29tZSBvdGhlciBjbGVhbnVwLgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6IChnc3RfaW50ZXJsZWF2ZV9iYXNlX2luaXQpLAorCSAgKGdzdF9pbnRlcmxlYXZlX2NsYXNzX2luaXQpOgorCSAgRG8gc29tZSByYW5kb20gY2xlYW51cC4KKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jOiAoR1NUX1NUQVJUX1RFU1QpLAorCSAgKGRlaW50ZXJsZWF2ZV9jaGFpbl9mdW5jKSwgKGRlaW50ZXJsZWF2ZV9wYWRfYWRkZWQpLAorCSAgKGRlaW50ZXJsZWF2ZV9zdWl0ZSk6CisJICBBZGQgdW5pdCB0ZXN0cyBmb3IgdGhlIGRlaW50ZXJsZWF2ZSBlbGVtZW50LgorCisyMDA4LTA1LTEzIDIwOjI1OjIwICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguYzogU2VuZCBhbiBpbml0aWFsIEJZVEUgc2VnbWVudCB0byBpbmZvcm0gZG93bnN0cmVhbSBvZiBsYXRlciBzZWVraW5nLCBhbmQgdG8gZm9yZWdvIHN5bmMgYXR0ZW1wdHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmlfbXV4X3N0YXJ0X2ZpbGUpOgorCSAgU2VuZCBhbiBpbml0aWFsIEJZVEUgc2VnbWVudCB0byBpbmZvcm0gZG93bnN0cmVhbSBvZiBsYXRlciBzZWVraW5nLAorCSAgYW5kIHRvIGZvcmVnbyBzeW5jIGF0dGVtcHRzLgorCisyMDA4LTA1LTEzIDA4OjU5OjQxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jOiBGaXggd3JvbmcgY2FwcyBzdHJpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuYzogKGdzdF9ydHBfZzcyOV9kZXBheV9zZXRjYXBzKToKKwkgIEZpeCB3cm9uZyBjYXBzIHN0cmluZy4KKworMjAwOC0wNS0xMyAwODozNTo1NSArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cC86IEFkZGVkIEc3MjkgcGF5IGFuZCBkZXBheWxvYWRlcnMuIEZpeGVzICM1MzI0MDkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5OiBPbGl2aWVyIENyZXRlIDx0ZXN0ZXIgYXQgdGVzdGVyIGRvdCBjYT4KKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuYzogKGdzdF9ydHBfZzcyOV9kZXBheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfZzcyOV9kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfZzcyOV9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX2c3MjlfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX2c3MjlfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF9nNzI5X2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmM6IChnc3RfcnRwZzcyOXBheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBnNzI5cGF5X2NsYXNzX2luaXQpLCAoZ3N0X3J0cGc3MjlwYXlfaW5pdCksCisJICAoZ3N0X3J0cGc3MjlwYXlfc2V0Y2FwcyksIChnc3RfcnRwX2c3MjlfcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBnNzI5cGF5Lmg6CisJICBBZGRlZCBHNzI5IHBheSBhbmQgZGVwYXlsb2FkZXJzLiBGaXhlcyAjNTMyNDA5LgorCisyMDA4LTA1LTEzIDA4OjIxOjI2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogRml4IHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgZHVyYXRpb24gb2YgdGhlIGNvbmNlYWxtZW50IHBhY2tldHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IChzcGVleF9kZWNfc2lua19ldmVudCk6CisJICBGaXggdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29uY2VhbG1lbnQgcGFja2V0cy4KKworMjAwOC0wNS0xMiAxODoyNzoyNCArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cC86IEFkZCBEViBwYXkgYW5kIGRlcGF5bG9hZGVycy4gRml4ZXMgIzUzMjQyMy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlciBhdCB0ZXN0ZXIgZG90IGNhPgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwL2dzdHJ0cC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuYzogKGdzdF9ydHBfZHZfZGVwYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX2R2X2RlcGF5X2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9kdl9kZXBheV9pbml0KSwKKwkgIChwYXJzZV9lbmNvZGUpLCAoZ3N0X3J0cF9kdl9kZXBheV9zZXRjYXBzKSwKKwkgIChjYWxjdWxhdGVfZGlmYmxvY2tfbG9jYXRpb24pLCAoZ3N0X3J0cF9kdl9kZXBheV9wcm9jZXNzKSwKKwkgIChnc3RfcnRwX2R2X2RlcGF5X3Jlc2V0KSwgKGdzdF9ydHBfZHZfZGVwYXlfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcnRwX2R2X2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBkdmRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwZHZwYXkuYzogKGdzdF9kdl9wYXlfbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X3J0cF9kdl9wYXlfYmFzZV9pbml0KSwgKGdzdF9ydHBfZHZfcGF5X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfZHZfcGF5X2luaXQpLCAoZ3N0X2R2X3BheV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9kdl9wYXlfZ2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBfZHZfcGF5X3NldGNhcHMpLAorCSAgKGdzdF9kdl9wYXlfbmVnb3RpYXRlKSwgKGluY2x1ZGVfZGlmKSwKKwkgIChnc3RfcnRwX2R2X3BheV9oYW5kbGVfYnVmZmVyKSwgKGdzdF9ydHBfZHZfcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBkdnBheS5oOgorCSAgQWRkIERWIHBheSBhbmQgZGVwYXlsb2FkZXJzLiBGaXhlcyAjNTMyNDIzLgorCisyMDA4LTA1LTEyIDE2OjM1OjM5ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IENvbnZlcnQgc3VidGl0bGUgcGFsZXR0ZSBpbmZvIGluIFZvYlN1YiBwcml2YXRlIGRhdGEgZnJvbSBWb2JTdWIncyAoYnVnZ3kpIFJHQiB0byBZVVYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3B1c2hfZHZkX2NsdXRfY2hhbmdlX2V2ZW50KToKKwkgIENvbnZlcnQgc3VidGl0bGUgcGFsZXR0ZSBpbmZvIGluIFZvYlN1YiBwcml2YXRlIGRhdGEgZnJvbSBWb2JTdWIncworCSAgKGJ1Z2d5KSBSR0IgdG8gWVVWLgorCisyMDA4LTA1LTEyIDE1OjI2OjAxICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguYzogRG8gbm90IGxlYXZlIGZvdXJjYyBzdHJlYW0gaGVhZGVyIGZpZWxkIGVtcHR5IHVwb24gcmVzZXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmlfbXV4X3BhZF9yZXNldCk6CisJICBEbyBub3QgbGVhdmUgZm91cmNjIHN0cmVhbSBoZWFkZXIgZmllbGQgZW1wdHkgdXBvbiByZXNldC4KKwkgIEZpeGVzICM1MTkzMDEuCisKKzIwMDgtMDUtMTEgMTQ6NDM6MjYgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBBZGQgZ29vbTJrMSBpbnRvIHRoZSBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbTJrMS54bWw6CisJICAqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkgICogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSAgQWRkIGdvb20yazEgaW50byB0aGUgZG9jcy4KKworMjAwOC0wNS0wOCAxNjo1ODowMiArMDAwMCAgV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBTdXBwb3J0IERpZ2VzdCBhdXRoZW50aWNhdGlvbi4gRml4ZXMgIzUzMjA2NS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IFdvdXRlciBDbG9ldGVucyAgPHdvdXRlciBhdCBtaW5kIGJlPgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19pbml0KSwKKwkgIChnc3RfcnRzcHNyY19za2lwX2x3cyksIChnc3RfcnRzcHNyY191bnNraXBfbHdzKSwKKwkgIChnc3RfcnRzcHNyY19za2lwX2NvbW1hcyksIChnc3RfcnRzcHNyY19za2lwX2l0ZW0pLAorCSAgKGdzdF9ydHNwX2RlY29kZV9xdW90ZWRfc3RyaW5nKSwKKwkgIChnc3RfcnRzcHNyY19wYXJzZV9kaWdlc3RfY2hhbGxlbmdlKSwgKGdzdF9ydHNwc3JjX3BhcnNlX2F1dGhfaGRyKSwKKwkgIChnc3RfcnRzcHNyY19zZXR1cF9hdXRoKToKKwkgIFN1cHBvcnQgRGlnZXN0IGF1dGhlbnRpY2F0aW9uLiBGaXhlcyAjNTMyMDY1LgorCisyMDA4LTA1LTA4IDEwOjIwOjUyICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiBBbHNvIHN1cHBvcnQgMzJiaXQgKGUuZy4gd2hlIGhhdmluZyBpdCBhZnRlciAnbWFkJykuIEFkZCBtb3JlIG5vdGVzIGFib3V0IHdoYXRzIG5lZWRlZCBmb3IgbGliby4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgQWxzbyBzdXBwb3J0IDMyYml0IChlLmcuIHdoZSBoYXZpbmcgaXQgYWZ0ZXIgJ21hZCcpLiBBZGQgbW9yZSBub3RlcworCSAgYWJvdXQgd2hhdHMgbmVlZGVkIGZvciBsaWJvaWwgYWNjZWxlcmF0aW9uLiBTaW1wbGlmeSBkb2NzIGEgYml0LgorCisyMDA4LTA1LTA4IDA4OjE1OjM0ICswMDAwICBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogVXBkYXRlIHRoZSB0cmFjayBkdXJhdGlvbiBpZiB0aGUgb2xkIG9uZSB3YXMgaW52YWxpZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFNqb2VyZCBTaW1vbnMgPHNqb2VyZCBhdCBsdW9uIGRvdCBuZXQ+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfY29sbGVjdGVkKToKKwkgIFVwZGF0ZSB0aGUgdHJhY2sgZHVyYXRpb24gaWYgdGhlIG9sZCBvbmUgd2FzIGludmFsaWQuCisJICBGaXhlcyBidWcgIzUzMjExNy4KKworMjAwOC0wNS0wNyAxNjozNjowNCArMDAwMCAgT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmMgKGdzdF9ydHBfaDI2NF9wYXlfcGFyc2Vfc3BzX3Bwcyk6IFVzZSBHU1RfU1RSX05VTEwgd2hlbiB0cnlpbmcgdG8gcHJpbnQgc3BzIGFuZCBwcHMgc3RyaW5ncyB0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmMgKGdzdF9ydHBfaDI2NF9wYXlfcGFyc2Vfc3BzX3Bwcyk6CisJICBVc2UgR1NUX1NUUl9OVUxMIHdoZW4gdHJ5aW5nIHRvIHByaW50IHNwcyBhbmQgcHBzIHN0cmluZ3MgdGhhdCBjb3VsZAorCSAgYmUgTlVMTCwgYXMgdGhpcyBtaWdodCBjcmFzaCBvbiBzb21lIHBsYXRmb3Jtcy4KKworMjAwOC0wNS0wNyAxNTozMzo1MiArMDAwMCAgSGFha29uIFNwb3JzaGVpbSA8aGFha29uLnNwb3JzaGVpbUB0YW5kYmVyZy5jb20+CisKKwkgIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmMgKGdzdF9kaXJlY3RkcmF3X3Npbmtfc2V0dXBfZGRyYXcpOiBEbyBJRGlyZWN0RHJhd0NsaXBwZXJfU2V0SFduZCgpIGlmIHRoZSB3aW5kb3cgSS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBwYXRjaCBieTogSGFha29uIFNwb3JzaGVpbSA8aGFha29uLnNwb3JzaGVpbSBhdCB0YW5kYmVyZyBjb20+CisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmMgKGdzdF9kaXJlY3RkcmF3X3Npbmtfc2V0dXBfZGRyYXcpOgorCSAgRG8gSURpcmVjdERyYXdDbGlwcGVyX1NldEhXbmQoKSBpZiB0aGUgd2luZG93IElEIGhhcyBhbHJlYWR5IGJlZW4KKwkgIHNldCBhZnRlciBjcmVhdGluZyB0aGUgY2xpcHBlci4KKworMjAwOC0wNS0wNyAxNToyODowNiArMDAwMCAgSGFha29uIFNwb3JzaGVpbSA8aGFha29uLnNwb3JzaGVpbUB0YW5kYmVyZy5jb20+CisKKwkgIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmMgKGdzdF9kaXJlY3RkcmF3X3Npbmtfc2hvd19mcmFtZSk6IEFkZGVkIGNoZWNraW5nIG9mIHN1cmZhY2UgbG9zdCBjYXNlIGFmdGVyIGFuIHVucy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBwYXRjaCBieTogSGFha29uIFNwb3JzaGVpbSA8aGFha29uLnNwb3JzaGVpbSBhdCB0YW5kYmVyZyBjb20+CisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmMgKGdzdF9kaXJlY3RkcmF3X3Npbmtfc2hvd19mcmFtZSk6CisJICBBZGRlZCBjaGVja2luZyBvZiBzdXJmYWNlIGxvc3QgY2FzZSBhZnRlciBhbiB1bnN1Y2Nlc3NmdWwKKwkgIElEaXJlY3REcmF3U3VyZmFjZTdfTG9jaygpIGNhbGwuCisJICBJZiBzdXJmYWNlIGlzIGxvc3QsIHJldHVybiBHU1RfRkxPV19PSy4KKworMjAwOC0wNS0wNyAxNToxOTo0NyArMDAwMCAgSGFha29uIFNwb3JzaGVpbSA8aGFha29uLnNwb3JzaGVpbUB0YW5kYmVyZy5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6CisJICBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jIChnc3RfZGlyZWN0ZHJhd19zaW5rX3Nob3dfZnJhbWUsCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHBhdGNoIGJ5OiBIYWFrb24gU3BvcnNoZWltIDxoYWFrb24uc3BvcnNoZWltIGF0IHRhbmRiZXJnIGNvbT4KKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYyAoZ3N0X2RpcmVjdGRyYXdfc2lua19zaG93X2ZyYW1lLAorCSAgV25kUHJvYywgZ3N0X2RpcmVjdGRyYXdfc2lua193aW5kb3dfdGhyZWFkKToKKwkgIEltcHJvdmVkIFdpbmRvd3MgbWVzc2FnZSBsb29wIGFuZCBmaXhlZCB3aW5kb3cgZGVzdHJ1Y3Rpb24gaXNzdWUuCisJICBXaGVuIHRoZSB3aW5kb3cgd2hpY2ggRGlyZWN0RHJhdyBpcyByZW5kZXJpbmcgdG8gaXMgZGVzdHJveWVkLCB0aGUKKwkgIHJlbmRlci9zaG93X2ZyYW1lIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIEdTVF9GTE9XX0VSUk9SLgorCSAgUGFydGlhbGx5IGZpeGVzICM1MjA4ODUuCisKKzIwMDgtMDUtMDcgMTU6MDk6MTAgKzAwMDAgIEhhYWtvbiBTcG9yc2hlaW0gPGhhYWtvbi5zcG9yc2hlaW1AdGFuZGJlcmcuY29tPgorCisJICBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jIChnc3RfZGlyZWN0ZHJhd19zaW5rX3NldF9jYXBzKTogRml4ZWQgbWlkIHN0cmVhbSByZXNvbHV0aW9uIGNoYW5nZSBidWcsIHRoZSBvZmZzY3IuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcGF0Y2ggYnk6IEhhYWtvbiBTcG9yc2hlaW0gPGhhYWtvbi5zcG9yc2hlaW0gYXQgdGFuZGJlcmcgY29tPgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jIChnc3RfZGlyZWN0ZHJhd19zaW5rX3NldF9jYXBzKToKKwkgIEZpeGVkIG1pZCBzdHJlYW0gcmVzb2x1dGlvbiBjaGFuZ2UgYnVnLCB0aGUgb2Zmc2NyZWVuIHN1cmZhY2UgaXMgbm93CisJICByZWxlYXNlZCB3aGVuIHNldF9jYXBzIGlzIGNhbGxlZC4KKwkgIFBhcnRpYWxseSBmaXhlcyAjNTIwODg1LgorCisyMDA4LTA1LTA3IDE0OjU2OjIyICswMDAwICBPbGUgQW5kcsOpIFZhZGxhIFJhdm7DpXMgPG9sZS5hbmRyZS5yYXZuYXNAdGFuZGJlcmcuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jOgorCSAgc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmMKKwkgIChnc3RfZGlyZWN0ZHJhd19zaW5rX2J1ZmZlcl9hbGxvYyk6CisJICBNYWtlIGl0IHNvIHRoYXQgZ3N0X2RpcmVjdGRyYXdfc2lua19idWZmZXJfYWxsb2MgdXNlcyB0aGUgcmlnaHQKKwkgIHdpZHRoL2hlaWdodC4KKwkgIEVzcGVjaWFsbHkgd2hlbiBsb29raW5nIHRocm91Z2ggdGhlIHBvb2wgb2YgYnVmZmVycywgbWFrZSBzdXJlIHRoYXQKKwkgIHRoZSB3aWR0aC9oZWlnaHQgb2YgY2FwcyBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIGFscmVhZHkgbmVnb3RpYXRlZAorCSAgZGltZW5zaW9ucy4KKwkgIEZvciBleGFtcGxlIGlmIGEgYnVmZmVyIHdpdGggZGlmZmVyZW50IGNhcHMgaXMgcmVxdWVzdGVkLCBpLmUuCisJICBoaWdoZXIgcmVzb2x1dGlvbiwgdGhlIGNhbGxlciB3b3VsZCBnZXQgYSBidWZmZXIgd2l0aCB0aGUgb2xkCisJICBkaW1lbnNpb25zIGFuZCB0aHVzIGNvcnJ1cHQgdGhlIGhlYXAuCisKKzIwMDgtMDUtMDcgMTQ6NDM6MzkgKzAwMDAgIE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcyA8b2xlLmFuZHJlLnJhdm5hc0B0YW5kYmVyZy5jb20+CisKKwkqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6CisJICBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYworCSAgKGdzdF9kaXJlY3RkcmF3X3NpbmtfYnVmZmVyX2FsbG9jKToKKwkgIENsZWFyIHRoZSBmbGFncyBvbiByZWN5Y2xlZCBidWZmZXJzIGZyb20gYnVmZmVyX2FsbG9jLgorCSAgUGFydGlhbGx5IGZpeGVzICM1MjA4ODUuCisJICBUaGUgcmlnaHQgZml4IHRoaXMgdGltZS4KKworMjAwOC0wNS0wNyAxNDozOTo0NSArMDAwMCAgT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KKworCSogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkgIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jCisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua19idWZmZXJfYWxsb2MpOgorCSAgUmV2ZXJ0aW5nIHByZXZpb3VzIGNvbW1pdCwgaXQgaGFkIGl0IGFsbCBtaXhlZCB1cCwgd2FzIGZvciBhIGRpZmZlcmVudAorCSAgcGF0Y2ggKG1ham9yIGF1dG9tYXRpb24gc2NyZXctdXApLiBTb3JyeSEKKworMjAwOC0wNS0wNyAxMzo0ODoyOCArMDAwMCAgT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkgIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jCisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua19idWZmZXJfYWxsb2MpOgorCSAgQ2xlYXIgdGhlIGZsYWdzIG9uIHJlY3ljbGVkIGJ1ZmZlcnMgZnJvbSBidWZmZXJfYWxsb2MuCisJICBQYXJ0aWFsbHkgZml4ZXMgIzUyMDg4NS4KKworMjAwOC0wNS0wNyAxMToyMjo1MSArMDAwMCAgT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6IEFkZGVkIG1pc3Npbmcgc3RkbGliLmggaW5jbHVkZSBmb3Igc3RydG9sKCksIGFuZCBtYWRlIGluY2x1ZGUgb3JkZXJpbmcgYW5kIHN0eWxlIGNvbnNpc3RlbnQgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJICBBZGRlZCBtaXNzaW5nIHN0ZGxpYi5oIGluY2x1ZGUgZm9yIHN0cnRvbCgpLCBhbmQgbWFkZSBpbmNsdWRlIG9yZGVyaW5nIGFuZAorCSAgc3R5bGUgY29uc2lzdGVudCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGRlcGF5bG9hZGVyLgorCisyMDA4LTA1LTA3IDA5OjUyOjM0ICswMDAwICBPbGUgQW5kcsOpIFZhZGxhIFJhdm7DpXMgPG9sZS5hbmRyZS5yYXZuYXNAdGFuZGJlcmcuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzogQWRkZWQgbWlzc2luZyBzdGRsaWIuaCBpbmNsdWRlIGZvciBzdHJ0b2woKSwgYW5kIG1hZGUgaW5jbHVkZSBvcmRlcmluZyBhbmQgc3R5bGUgY29uc2lzdGVudCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzoKKwkgIEFkZGVkIG1pc3Npbmcgc3RkbGliLmggaW5jbHVkZSBmb3Igc3RydG9sKCksIGFuZCBtYWRlIGluY2x1ZGUgb3JkZXJpbmcgYW5kCisJICBzdHlsZSBjb25zaXN0ZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZGVwYXlsb2FkZXIuCisKKzIwMDgtMDUtMDcgMDg6MDM6NTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogRXJyb3Igb3V0IGlmIHdlIGRvbid0IGhhdmUgdGhlIHJlcXVpcmVkIGNvcmUvYmFzZSB2ZXJzaW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBFcnJvciBvdXQgaWYgd2UgZG9uJ3QgaGF2ZSB0aGUgcmVxdWlyZWQgY29yZS9iYXNlIHZlcnNpb25zLgorCisyMDA4LTA1LTA2IDA5OjMzOjQ2ICswMDAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJICBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cubTogRml4IGNvbXBpbGVyIHdhcm5pbmdzIG9uIFBQQzY0LiBGaXhlcyBidWcgIzQ5OTMxOC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpciBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cubToKKwkgIEZpeCBjb21waWxlciB3YXJuaW5ncyBvbiBQUEM2NC4gRml4ZXMgYnVnICM0OTkzMTguCisKKzIwMDgtMDUtMDUgMTE6MTk6MTMgKzAwMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBEb24ndCBsZWFrIGZpbGUgZGVzY3JpcHRvcnMgb24gZXJyb3IuIEZpeGVzICM1MzE1MzIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTam9lcmQgU2ltb25zIDxzam9lcmQgYXQgbHVvbiBkb3QgbmV0PgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19pbml0KSwgKGdzdF9ydHNwc3JjX29wZW4pOgorCSAgRG9uJ3QgbGVhayBmaWxlIGRlc2NyaXB0b3JzIG9uIGVycm9yLiBGaXhlcyAjNTMxNTMyLgorCisyMDA4LTA1LTAzIDA5OjE4OjIyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9nY29uZi86IFdoZW4gd2UgY2FuJ3QgY3JlYXRlIGEgZmFrZXNpbmsvZmFrZXNyYyBjb21wbGFpbiBpbnN0ZWFkIG9mIHVucmVmZmluZworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc3JjLmM6IChnc3RfZ2NvbmZfYXVkaW9fc3JjX3Jlc2V0KSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc3JjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5jOiAoZ3N0X2djb25mX3ZpZGVvX3NpbmtfcmVzZXQpLAorCSAgKGdzdF9nY29uZl92aWRlb19zaW5rX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc3JjLmM6IChnc3RfZ2NvbmZfdmlkZW9fc3JjX3Jlc2V0KSwKKwkgIChnc3RfZ2NvbmZfdmlkZW9fc3JjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9nY29uZi9nc3Rzd2l0Y2hzaW5rLmM6IChnc3Rfc3dpdGNoX3NpbmtfcmVzZXQpLAorCSAgKGdzdF9zd2l0Y2hfY29tbWl0X25ld19raWQpLCAoZ3N0X3N3aXRjaF9zaW5rX2NoYW5nZV9zdGF0ZSk6CisJICBXaGVuIHdlIGNhbid0IGNyZWF0ZSBhIGZha2VzaW5rL2Zha2VzcmMgY29tcGxhaW4gaW5zdGVhZCBvZiB1bnJlZmZpbmcKKwkgIE5VTEwgcG9pbnRlcnMgYW5kIGNyYXNoaW5nIGxhdGVyLiBTZWUgYnVnICM1MzA1MzUuCisKKzIwMDgtMDUtMDIgMTI6NDQ6MTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOiBBZGQgc29tZSBtb3JlIGRlYnVnIGluZm8gYW5kIGd1YXJkIGFnYWluc3Qgc21hbGwgcGF5bG9hZHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6IChnc3RfcnRwX2gyNjNwX2RlcGF5X3Byb2Nlc3MpOgorCSAgQWRkIHNvbWUgbW9yZSBkZWJ1ZyBpbmZvIGFuZCBndWFyZCBhZ2FpbnN0IHNtYWxsIHBheWxvYWRzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5jOiAoZ3N0X3J0cF9wY211X2RlcGF5X3Byb2Nlc3MpOgorCSAgU2V0IGR1cmF0aW9uIG9uIG91dGdvaW5nIGJ1ZmZlcnMgYmVjYXVzZSB3ZSBjYW4uCisKKzIwMDgtMDUtMDIgMTI6Mzk6MDMgKzAwMDAgIE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkgIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiBBZGQgbmVnb3RpYXRpb24gZm9yIHRoZSBzcGVleCBjaGFubmVscyBhbmQgcmF0ZS4gRml4ZXMgIzQ2NTE0Ni4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlciBhdCB0ZXN0ZXIgZG90IGNhPgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleF9lbmNfc2lua19nZXRjYXBzKSwKKwkgIChnc3Rfc3BlZXhfZW5jX2luaXQpLCAoZ3N0X3NwZWV4X2VuY19jaGFpbik6CisJICBBZGQgbmVnb3RpYXRpb24gZm9yIHRoZSBzcGVleCBjaGFubmVscyBhbmQgcmF0ZS4gRml4ZXMgIzQ2NTE0Ni4KKworMjAwOC0wNS0wMiAxMjozNDoyMiArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOiBBZGQgbmVnb3RpYXRpb24gZm9yIHRoZSBzcGVlYyBjaGFubmVscyBhbmQgcmF0ZS4gU2VlICM0NjUxNDYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBPbGl2aWVyIENyZXRlIDx0ZXN0ZXIgYXQgdGVzdGVyIGRvdCBjYT4KKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOiAoZ3N0X3J0cF9zcGVleF9wYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9zcGVleF9wYXlfZ2V0Y2Fwcyk6CisJICBBZGQgbmVnb3RpYXRpb24gZm9yIHRoZSBzcGVlYyBjaGFubmVscyBhbmQgcmF0ZS4gU2VlICM0NjUxNDYuCisKKzIwMDgtMDUtMDIgMTI6MjQ6NTUgKzAwMDAgIE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkgIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOiBBZGQgbmVnb3RpYXRpb24gZm9yIHRoZSBJTEJDIG1vZGUuIFNlZSAjNDY1MTQ2LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyIGF0IHRlc3RlciBkb3QgY2E+CisJICAqIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOiAoZ3N0X3J0cGlsYmNwYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cGlsYmNwYXlfc2lua19zZXRjYXBzKSwgKGdzdF9ydHBpbGJjcGF5X3NpbmtfZ2V0Y2Fwcyk6CisJICBBZGQgbmVnb3RpYXRpb24gZm9yIHRoZSBJTEJDIG1vZGUuIFNlZSAjNDY1MTQ2LgorCisyMDA4LTA1LTAyIDExOjMyOjMxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IEluY2x1ZGUgc3RkbGliIHRvIGZpeCB0aGUgYnVpbGQuIFVzZSBnX2ZyZWUgaW5zdGVhZCBvZiBmcmVlLCBsaWJzb3VwIHVzZXMgZ2xpYi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOgorCSAgSW5jbHVkZSBzdGRsaWIgdG8gZml4IHRoZSBidWlsZC4gVXNlIGdfZnJlZSBpbnN0ZWFkIG9mIGZyZWUsIGxpYnNvdXAKKwkgIHVzZXMgZ2xpYi4KKworMjAwOC0wNS0wMiAwOTowOTo1OCArMDAwMCAgal4gPGpAYm9vdGxhYi5vcmc+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQWRkIG1vcmUgbXBlZzIgdmFyaWFudHMuIEZpeGVzICM1MzA4ODYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBqXiA8akBib290bGFiLm9yZz4KKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF92aWRlb19jYXBzKToKKwkgIEFkZCBtb3JlIG1wZWcyIHZhcmlhbnRzLiBGaXhlcyAjNTMwODg2LgorCisyMDA4LTA1LTAxIDEwOjUyOjExICswMDAwICBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy5jOiBEb24ndCBlcnJvciBvdXQgaWYgd2UgZ2V0IGFuIElDTVAgZGVzdGluYXRpb24tdW5yZWFjaGFibGUgbWVzc2FnZSB3aGVuIHRyeWluZyB0byByZWFkIHBhY2tldHMgb24uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aSBhdCBjb2xsYWJvcmEgY28gdWs+CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2NyZWF0ZSk6CisJICBEb24ndCBlcnJvciBvdXQgaWYgd2UgZ2V0IGFuIElDTVAgZGVzdGluYXRpb24tdW5yZWFjaGFibGUKKwkgIG1lc3NhZ2Ugd2hlbiB0cnlpbmcgdG8gcmVhZCBwYWNrZXRzIG9uIHdpbjMyICgjNTI5NDU0KS4KKworMjAwOC0wNC0zMCAxMjoxODo0MSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgVXNlIG5ldyBlcnJvciBjb2RlIGZvciBlbmNyeXB0ZWQgc3RyZWFtcyAod2hpY2ggcmVxdWlyZXMgY29yZSBDVlMpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIFVzZSBuZXcgZXJyb3IgY29kZSBmb3IgZW5jcnlwdGVkIHN0cmVhbXMgKHdoaWNoIHJlcXVpcmVzIGNvcmUgQ1ZTKS4KKworMjAwOC0wNC0zMCAxMjoxMDowMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBGaXggc3dhcHBlZCBwYWQgdGVtcGxhdGUgbmFtZXMsIHNwb3R0ZWQgYnkgVGhpYWdvIFNvdXNhIFNhbnRvcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF92aWRlb3NyY190ZW1wbGF0ZSksCisJICAoZ3N0X3F0ZGVtdXhfYXVkaW9zcmNfdGVtcGxhdGUpOgorCSAgRml4IHN3YXBwZWQgcGFkIHRlbXBsYXRlIG5hbWVzLCBzcG90dGVkIGJ5IFRoaWFnbyBTb3VzYSBTYW50b3MuCisKKzIwMDgtMDQtMzAgMDk6NDg6MTEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiBQcm9kdWNlIGNvbmNlYWxtZW50IGRhdGEgd2hlbiB0aW1lIHByb2dyZXNzZXMgaW4gYSBzZWdtZW50IHVwZGF0ZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogKHNwZWV4X2RlY19zaW5rX2V2ZW50KSwKKwkgIChzcGVleF9kZWNfY2hhaW5fcGFyc2VfZGF0YSk6CisJICBQcm9kdWNlIGNvbmNlYWxtZW50IGRhdGEgd2hlbiB0aW1lIHByb2dyZXNzZXMgaW4gYSBzZWdtZW50IHVwZGF0ZS4KKworMjAwOC0wNC0yOSAxNDoxMTo0NSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IFRyeSB0byBwcmVzZXJ2ZSBpbnB1dCB0aW1lc3RhbXBzIHdoZW4gd2UgY2FuLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiAoc3BlZXhfZGVjX2NoYWluX3BhcnNlX2RhdGEpLAorCSAgKHNwZWV4X2RlY19jaGFpbik6CisJICBUcnkgdG8gcHJlc2VydmUgaW5wdXQgdGltZXN0YW1wcyB3aGVuIHdlIGNhbi4KKwkgIERvIGJlZ2lubmluZ3Mgb2YgZXJyb3IgY29uY2VhbG1lbnQuCisKKzIwMDgtMDQtMjggMjI6Mzg6MTEgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZ3N0L2RlYnVnL2dzdG5hdmlnYXRpb250ZXN0LmM6IE1TVkMgZG9lc24ndCBwcm92aWRlIHJpbnQoKSwgZGVmaW5lIGFuIGFkZXF1YXRlIHJlcGxhY2VtZW50IGxvY2FsbHkgYXMgZWxzZXdoZXJlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWJ1Zy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSAgTVNWQyBkb2Vzbid0IHByb3ZpZGUgcmludCgpLCBkZWZpbmUgYW4gYWRlcXVhdGUgcmVwbGFjZW1lbnQgbG9jYWxseSBhcworCSAgZWxzZXdoZXJlLgorCisyMDA4LTA0LTI4IDExOjE2OjMyICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZ3N0L2RlYnVnL3JuZGJ1ZmZlcnNpemUuYzogRml4IHByaW50ZiBmb3JtYXQgdG8gcGFjaWZ5IE1hYyBPU1gncyBnY2MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDgtMDQtMjggIEp1bGllbiBNb3V0dGUgIDxqdWxpZW5AZmx1ZW5kby5jb20+CisJICAqIGdzdC9kZWJ1Zy9ybmRidWZmZXJzaXplLmM6IChnc3Rfcm5kX2J1ZmZlcl9zaXplX2xvb3ApOiBGaXggcHJpbnRmCisJICBmb3JtYXQgdG8gcGFjaWZ5IE1hYyBPU1gncyBnY2MuCisKKzIwMDgtMDQtMjUgMTk6MzQ6MzEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9kZWJ1Zy9ybmRidWZmZXJzaXplLmM6IEJyaW5nIHJuZGJ1ZmZlcnNpemUgZWxlbWVudCBpbnRvIGEgc3RhdGUgdGhhdCBkb2Vzbid0IHJlcXVpcmUgdXMgdG8gbW92ZSBpdCB0byAtYmFkIGltbWVkaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWJ1Zy9ybmRidWZmZXJzaXplLmM6IChERUZBVUxUX1NFRUQpLCAoREVGQVVMVF9NSU4pLAorCSAgKERFRkFVTFRfTUFYKSwgKHNyY190ZW1wbGF0ZSksIChzaW5rX3RlbXBsYXRlKSwKKwkgIChnc3Rfcm5kX2J1ZmZlcl9zaXplX2Jhc2VfaW5pdCksIChnc3Rfcm5kX2J1ZmZlcl9zaXplX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ybmRfYnVmZmVyX3NpemVfaW5pdCksIChnc3Rfcm5kX2J1ZmZlcl9zaXplX2FjdGl2YXRlKSwKKwkgIChnc3Rfcm5kX2J1ZmZlcl9zaXplX2xvb3ApLCAoZ3N0X3JuZF9idWZmZXJfc2l6ZV9wbHVnaW5faW5pdCk6CisJICBCcmluZyBybmRidWZmZXJzaXplIGVsZW1lbnQgaW50byBhIHN0YXRlIHRoYXQgZG9lc24ndCByZXF1aXJlIHVzCisJICB0byBtb3ZlIGl0IHRvIC1iYWQgaW1tZWRpYXRlbHkuIEZvciBvbmUsIGZpeCB1cCBkZWZhdWx0IG1pbi9tYXgKKwkgIHZhbHVlcyBzbyB0aGF0IHRoZSBlbGVtZW50IGFjdHVhbGwgd29ya3MgdXNpbmcgdGhlIGRlZmF1bHQgdmFsdWVzLgorCSAgQWxzbywgZG9uJ3QgaWdub3JlIGZsb3cgcmV0dXJuIHZhbHVlcyBhbmQgZG8gc29tZSBraW5kIG9mIG1pbmltYWwKKwkgIGVvcyBsb2dpYy4gQWxsb3cgbWluPW1heCB0byBwdWxsIGZpeGVkLXNpemVkIGJ1ZmZlcnMuIEJ1bmNoIG9mCisJICBvdGhlciBncmF0dWl0aW91cyBjbGVhbi11cHMuCisKKzIwMDgtMDQtMjUgMTk6MjQ6MDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGRvY3MvcGx1Z2lucy86IEFkZCBkb2NzIGZvciBnZGtwaXhidWZzaW5rOyB1cGRhdGUgZG9jcyB0byBDVlMgdmVyc2lvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXM6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkaW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSAgQWRkIGRvY3MgZm9yIGdka3BpeGJ1ZnNpbms7IHVwZGF0ZSBkb2NzIHRvIENWUyB2ZXJzaW9uLgorCisyMDA4LTA0LTI1IDE4OjQ1OjMzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2NC1hbHNhc3JjLVBDTUEuc2g6IFJlbW92ZSB0ZXN0IHN5bmMtb2Zmc2V0IGJ5IGRlZmF1bHQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci12NGwyLUgyNjQtYWxzYXNyYy1QQ01BLnNoOgorCSAgUmVtb3ZlIHRlc3Qgc3luYy1vZmZzZXQgYnkgZGVmYXVsdC4KKworMjAwOC0wNC0yNSAxMzozMTo0OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0LzogVXNlIEdMaWIgdmVyc2lvbnMgb2YgaHRvbmwsIGh0b25zLCBudG9obCBhbmQgbnRvaHMgaW4gb3JkZXIgdG8gYXZvaWQgcHJvYmxlbXMgb24gd2luMzIgKCM1Mjk3MDcpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmM6IChnc3RfYXN0ZXJpc2toMjYzX2NoYWluKToKKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogKGdzdF9tdWx0aXVkcHNpbmtfYWRkX2ludGVybmFsKToKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfc3RhcnQpOgorCSAgVXNlIEdMaWIgdmVyc2lvbnMgb2YgaHRvbmwsIGh0b25zLCBudG9obCBhbmQgbnRvaHMgaW4gb3JkZXIKKwkgIHRvIGF2b2lkIHByb2JsZW1zIG9uIHdpbjMyICgjNTI5NzA3KS4KKworMjAwOC0wNC0yNSAxMjo1Mjo0NCArMDAwMCAgSmVzw7pzIENvcnJpdXMgPGplc3VzQHNvZnRjYXRhbGEub3JnPgorCisJICBnc3QvZ29vbS86IEZpeCBidWlsZCB3aXRoIG1pbmd3MzI6IHVzZSByYW5kKCkgaW5zdGVhZCBvZiByYW5kb20oKSBhbmQgcmVwbGFjZSBiemVybygpIHdpdGggbWVtc2V0KCkuIEZpeGVzICM1Mjk2OTIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBKZXPDunMgQ29ycml1cyA8amVzdXMgYXQgc29mdGNhdGFsYSBvcmc+CisJICAqIGdzdC9nb29tL2ZpbHRlcnMuYzogKHpvb21WZWN0b3IpOgorCSAgKiBnc3QvZ29vbS9nb29tX2NvcmUuYzogKGluaXRfYnVmZmVycyk6CisJICBGaXggYnVpbGQgd2l0aCBtaW5ndzMyOiB1c2UgcmFuZCgpIGluc3RlYWQgb2YgcmFuZG9tKCkgYW5kCisJICByZXBsYWNlIGJ6ZXJvKCkgd2l0aCBtZW1zZXQoKS4gRml4ZXMgIzUyOTY5Mi4KKworMjAwOC0wNC0yNSAwNzo1NjoxMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBGaXggdHlwbyBpbiBjb21tZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2NvbWJpbmVfZmxvd3MpOgorCSAgRml4IHR5cG8gaW4gY29tbWVudHMuCisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3AtUENNQS5zZHA6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3AtUENNQS5zaDoKKwkgICogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LVBDTUEuc2RwOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQtUENNQS5zaDoKKwkgICogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LnNkcDoKKwkgICogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LnNoOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuc2RwOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuc2g6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLnNoOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2M3AtYWxzYXNyYy1BTVIuc2g6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjY0LWFsc2FzcmMtUENNQS5zaDoKKwkgIEFkZCBzb21lIG1vcmUgZG9jcyBhbmQgZml4IGV4YW1wbGVzLgorCisyMDA4LTA0LTI0IDIyOjA0OjU3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOiBJbmNsdWRlIHN0ZGxpYi5oIGFuZCB1bmlzdGQuaCBmb3IgbWtkdGVtcC4gU29tZSBwbGF0Zm9ybXMgaGF2ZSBpdCBkZWNsYXJlZCBpbiB0aGUgZi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jOgorCSAgSW5jbHVkZSBzdGRsaWIuaCBhbmQgdW5pc3RkLmggZm9yIG1rZHRlbXAuIFNvbWUgcGxhdGZvcm1zIGhhdmUgaXQKKwkgIGRlY2xhcmVkIGluIHRoZSBmb3JtZXIsIHNvbWUgaGF2ZSBpdCBkZWNsYXJlZCBpbiB0aGUgbGF0dGVyLgorCisyMDA4LTA0LTI0IDIyOjAxOjUyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFN0b3AgdXNpbmcgZGVwcmVjYXRlZCBHTGliIGZ1bmN0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzogKGdzdF90ZXh0X292ZXJsYXlfc2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2RlYnVnL3Rlc3RzLmM6IChtZDVfZ2V0X3ZhbHVlKToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6IChnc3RfcnRwX2gyNjNwX2RlcGF5X3NldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzogKGdzdF9ydHBpbGJjcGF5X3NldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6IChnc3RfcnRwX3RoZW9yYV9kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOiAoZ3N0X3J0cF92b3JiaXNfZGVwYXlfc2V0Y2Fwcyk6CisJICBTdG9wIHVzaW5nIGRlcHJlY2F0ZWQgR0xpYiBmdW5jdGlvbnMuCisKKzIwMDgtMDQtMjQgMjE6MTc6NDIgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBjb25maWd1cmUuYWM6IEJhY2sgdG8gZGV2ZWxvcG1lbnQgLT4gMC4xMC44LjEKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBCYWNrIHRvIGRldmVsb3BtZW50IC0+IDAuMTAuOC4xCisJICA9PT0gcmVsZWFzZSAwLjEwLjggPT09CisKKz09PSByZWxlYXNlIDAuMTAuOCA9PT0KKworMjAwOC0wNC0yMyAyMzo0MDo0OCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSAgUmVsZWFzZSAwLjEwLjggYSBsaXR0bGUgaGFyZGVyIChlZGl0ZWQgdGhlIHJlbGVhc2Ugbm90ZXMpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJlbGVhc2UgMC4xMC44IGEgbGl0dGxlIGhhcmRlciAoZWRpdGVkIHRoZSByZWxlYXNlIG5vdGVzKQorCisyMDA4LTA0LTIzIDIzOjI2OjI0ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2FtbWEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlmaWxlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogcG8vTElOR1VBUzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMC4xMC44CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJlbGVhc2UgMC4xMC44CisKKzIwMDgtMDQtMjMgMjM6MTg6NDQgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBjb21tb246CisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vYmcucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9mci5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3BsLnBvOgorCSogcG8vcnUucG86CisJKiBwby9zay5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBwby96aF9DTi5wbzoKKwkqIHBvL3poX0hLLnBvOgorCSogcG8vemhfVFcucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAwOC0wNC0yMiAwMDoyOTowMCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogMC4xMC43LjQgcHJlLXJlbGVhc2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAwLjEwLjcuNCBwcmUtcmVsZWFzZQorCisyMDA4LTA0LTIyIDAwOjE4OjUyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2dvb20vOiBGcmVlIGEgYnVuY2ggb2Ygc3R1ZmYsIGFuZCBpbml0aWFsaXNlIHRoaW5ncyB0byBmaXggbGVha3MgYW5kIHZhbGdyaW5kIHdhcm5pbmdzIGluIHRoZSB0ZXN0c3VpdGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vY29uZmlnX3BhcmFtLmM6IChnb29tX3BsdWdpbl9wYXJhbWV0ZXJzX2ZyZWUpOgorCSAgKiBnc3QvZ29vbS9jb252b2x2ZV9meC5jOiAoY29udm9sdmVfaW5pdCksIChjb252b2x2ZV9mcmVlKToKKwkgICogZ3N0L2dvb20vZmlsdGVycy5jOiAoem9vbUZpbHRlclZpc3VhbEZYV3JhcHBlcl9mcmVlKToKKwkgICogZ3N0L2dvb20vZmx5aW5nX3N0YXJzX2Z4LmM6IChmc19mcmVlKToKKwkgICogZ3N0L2dvb20vZ29vbV9jb25maWdfcGFyYW0uaDoKKwkgICogZ3N0L2dvb20vZ29vbV9jb3JlLmM6IChnb29tX2luaXQpLCAoZ29vbV9jbG9zZSk6CisJICAqIGdzdC9nb29tL2dvb21fcGx1Z2luX2luZm8uaDoKKwkgICogZ3N0L2dvb20vZ3N0Z29vbS5jOiAoZ3N0X2dvb21fZmluYWxpemUpOgorCSAgKiBnc3QvZ29vbS9saW5lcy5jOiAoZ29vbV9saW5lc19mcmVlKToKKwkgICogZ3N0L2dvb20vcGx1Z2luX2luZm8uYzogKHBsdWdpbl9pbmZvX2luaXQpLCAocGx1Z2luX2luZm9fZnJlZSk6CisJICAqIGdzdC9nb29tL3N1cmYzZC5jOiAoZ3JpZDNkX2ZyZWUpOgorCSAgKiBnc3QvZ29vbS9zdXJmM2QuaDoKKwkgICogZ3N0L2dvb20vdGVudGFjbGUzZC5jOiAodGVudGFjbGVfZnJlZSk6CisJICBGcmVlIGEgYnVuY2ggb2Ygc3R1ZmYsIGFuZCBpbml0aWFsaXNlIHRoaW5ncyB0byBmaXggbGVha3MKKwkgIGFuZCB2YWxncmluZCB3YXJuaW5ncyBpbiB0aGUgdGVzdHN1aXRlLgorCSAgRml4ZXM6ICM1MjkyNjgKKworMjAwOC0wNC0yMSAyMTo1NDoxMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6IERvbid0IGxlYWsgYSB0YWcgbGlzdC4gRml4ZXMgYnVnICM1MjkyODUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgRG9uJ3QgbGVhayBhIHRhZyBsaXN0LiBGaXhlcyBidWcgIzUyOTI4NS4KKworMjAwOC0wNC0yMSAwODoyMToxNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBSZWYgY2FwcyBhcyB0aGUgcmV0dXJuIHZhbHVlIGZvciB0aGUgcmVxdWVzdF9wdF9tYXAgc2lnbmFsLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2luaXQpLCAocmVxdWVzdF9wdF9tYXApLAorCSAgKGdzdF9ydHNwc3JjX2NvbmZpZ3VyZV9jYXBzKToKKwkgIFJlZiBjYXBzIGFzIHRoZSByZXR1cm4gdmFsdWUgZm9yIHRoZSByZXF1ZXN0X3B0X21hcCBzaWduYWwuCisJICBSZW1vdmUgc29tZSBjYXBzIHdlaXJkbmVzcyB3aGVuIGNvbmZpZ3VyaW5nIGEgc3RyZWFtLiBTZWUgIzUyODI0NS4KKworMjAwOC0wNC0xOCAxODo0Nzo0MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgdGVzdHMvaWNsZXMvZ2RrcGl4YnVmc2luay10ZXN0LmM6IEFkZCBjYXN0IHRvIHBsYWNhdGUgZ2NjIDQuMS4yLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2ljbGVzL2dka3BpeGJ1ZnNpbmstdGVzdC5jOgorCSAgQWRkIGNhc3QgdG8gcGxhY2F0ZSBnY2MgNC4xLjIuCisKKzIwMDgtMDQtMTcgMjM6MDA6MjkgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBjb25maWd1cmUuYWM6IDAuMTAuNy4zIHByZS1yZWxlYXNlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgMC4xMC43LjMgcHJlLXJlbGVhc2UKKworMjAwOC0wNC0xNyAyMjozMjoxNiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOiBEaXNhYmxlIHNvbWUgbW9yZSBlbGVtZW50cyBpbiB0aGUgc3RhdGUgdGVzdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIERpc2FibGUgc29tZSBtb3JlIGVsZW1lbnRzIGluIHRoZSBzdGF0ZSB0ZXN0LgorCSAgQWRkIGEgZGVmaW5lIHNvIHRoZSBzb3VwIHRlc3QgY2FuIGZpbmQgdGhlIHRlc3QgZmlsZXMKKwkgIGl0IG5lZWRzIGF0IHJ1bnRpbWUuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6IChydW5fc2VydmVyKToKKwkgIEFkZCBhIGRlZmluZSBzbyB0aGUgc291cCB0ZXN0IGNhbiBmaW5kIHRoZSB0ZXN0IGZpbGVzCisJICBpdCBuZWVkcyBhdCBydW50aW1lLgorCisyMDA4LTA0LTE3IDE4OjA4OjUzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2dvb20vY29udm9sdmVfZnguYzogRG9uJ3QgZXZlciBkcmF3IHRoZSBHT09NIGxvZ28uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vY29udm9sdmVfZnguYzogKGNvbnZvbHZlX2FwcGx5KToKKwkgIERvbid0IGV2ZXIgZHJhdyB0aGUgR09PTSBsb2dvLgorCSAgRml4ZXM6ICM1Mjg2MTUKKworMjAwOC0wNC0xNyAxMDoyNDozMiArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZXh0LzogZ3N0X2F0b21pY19pbnRfc2V0ID09PiBnX2F0b21pY19pbnRfc2V0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2NkaW8vZ3N0Y2Rpb2NkZGFzcmMuYzoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkgIGdzdF9hdG9taWNfaW50X3NldCA9PT4gZ19hdG9taWNfaW50X3NldAorCisyMDA4LTA0LTE2IDEwOjMxOjE3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBTdHJpcCBvdXQgdGhlIGNvbmZpZy9zY3JpcHQgcGFyc2luZyBzdHVmZiwgd2UgZG9uJ3QgbmVlZCBpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9nb29tL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZ29vbS9jb252b2x2ZV9meC5jOgorCSAgKiBnc3QvZ29vbS9kZWZhdWx0X3NjcmlwdHMuaDoKKwkgICogZ3N0L2dvb20vZ29vbS5oOgorCSAgKiBnc3QvZ29vbS9nb29tX2NvcmUuYzogKGNob29zZV9hX2dvb21fbGluZSk6CisJICAqIGdzdC9nb29tL2dvb21fcGx1Z2luX2luZm8uaDoKKwkgICogZ3N0L2dvb20vZ29vbXNsLmM6CisJICAqIGdzdC9nb29tL2dvb21zbC5oOgorCSAgKiBnc3QvZ29vbS9nb29tc2xfaGFzaC5jOgorCSAgKiBnc3QvZ29vbS9nb29tc2xfaGFzaC5oOgorCSAgKiBnc3QvZ29vbS9nb29tc2xfaGVhcC5jOgorCSAgKiBnc3QvZ29vbS9nb29tc2xfaGVhcC5oOgorCSAgKiBnc3QvZ29vbS9nb29tc2xfcHJpdmF0ZS5oOgorCSAgKiBnc3QvZ29vbS9wbHVnaW5faW5mby5jOgorCSAgU3RyaXAgb3V0IHRoZSBjb25maWcvc2NyaXB0IHBhcnNpbmcgc3R1ZmYsIHdlIGRvbid0IG5lZWQgaXQuCisJICBGaXhlcyAjNTI3OTk5LgorCisyMDA4LTA0LTE1IDE2OjU4OjM2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvZ29vbS9wbHVnaW5faW5mby5jOiBEaXNhYmxlIGFsdGl2ZWMgb3B0aW1pc2F0aW9ucyBmb3IgMzItYml0IFBQQyBhcyB3ZWxsIHRvIG1ha2UgdGhpbmdzIGJ1aWxkIHByb3Blcmx5IG9uIGFsbCBQUEMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS9wbHVnaW5faW5mby5jOiAoc2V0T3B0aW1pemVkTWV0aG9kcyk6CisJICBEaXNhYmxlIGFsdGl2ZWMgb3B0aW1pc2F0aW9ucyBmb3IgMzItYml0IFBQQyBhcyB3ZWxsIHRvIG1ha2UKKwkgIHRoaW5ncyBidWlsZCBwcm9wZXJseSBvbiBhbGwgUFBDIHN5c3RlbXMuIEZpeGVzICM1MjgxNDMKKworMjAwOC0wNC0xNCAyMDowMTo0NCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOiBVcGRhdGUgZm9yIHNvdXBodHRwc3JjIHBsdWdpbiB3aGljaCBoYXMgbW92ZWQgdG8gLWdvb2QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgVXBkYXRlIGZvciBzb3VwaHR0cHNyYyBwbHVnaW4gd2hpY2ggaGFzIG1vdmVkIHRvIC1nb29kLgorCisyMDA4LTA0LTE0IDEzOjM4OjMyICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogRml4IG9wZW4tZW5kZWQgc2Vla3MgaW4gbWF0cm9za2FkZW11eAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc2Vla19ldmVudCk6CisJICBGaXggb3Blbi1lbmRlZCBzZWVrcyBpbiBtYXRyb3NrYWRlbXV4CisJICBQYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3IHNreW5ldCBiZT4KKwkgIEZpeGVzOiAjNTI2NTU3CisKKzIwMDgtMDQtMTMgMjM6MTM6MzIgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogQWRkIHNvdXAgdGVzdCBjZXJ0aWZpY2F0ZXMgdG8gdGhlIGRpc3QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBBZGQgc291cCB0ZXN0IGNlcnRpZmljYXRlcyB0byB0aGUgZGlzdC4KKworMjAwOC0wNC0xMyAxNzo0Mzo1MiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGV4dC9NYWtlZmlsZS5hbTogUmVtb3ZlIExBRFNQQSByZWZlcmVuY2UgSSBtaXNzZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L01ha2VmaWxlLmFtOgorCSAgUmVtb3ZlIExBRFNQQSByZWZlcmVuY2UgSSBtaXNzZWQuCisKKzIwMDgtMDQtMTMgMTM6MDY6MzkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogR2l2ZSBzb3VwaHR0cHNyYyBHU1RfUkFOS19QUklNQVJZIHRvIG1ha2UgaXQgdGhlIGRlZmF1bHQgSFRUUCBzb3VyY2Ugb3ZlciBnbm9tZS12ZnMgYW5kIGV2Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKHBsdWdpbl9pbml0KToKKwkgIEdpdmUgc291cGh0dHBzcmMgR1NUX1JBTktfUFJJTUFSWSB0byBtYWtlIGl0IHRoZSBkZWZhdWx0IEhUVFAgc291cmNlCisJICBvdmVyIGdub21lLXZmcyBhbmQgZXZlcnl0aGluZyBlbHNlLiBGaXhlcyBidWcgIzUyNzg0OC4KKworMjAwOC0wNC0xMiAyMzo0NzoyMyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIFJlbW92ZSBMQURTUEEgcGx1Z2luLiBGaXhlczogIzUxNTk3OAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZXh0L01ha2VmaWxlLmFtOgorCSAgUmVtb3ZlIExBRFNQQSBwbHVnaW4uIEZpeGVzOiAjNTE1OTc4CisKKzIwMDgtMDQtMTIgMjM6MzA6NTQgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBNb3ZlIHNvdXAgcGx1Z2luIGZyb20gLWJhZCAoRml4ZXM6ICM1MjMxMjQpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWw6CisJICAqIGV4dC9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBNb3ZlIHNvdXAgcGx1Z2luIGZyb20gLWJhZCAoRml4ZXM6ICM1MjMxMjQpCisKKzIwMDgtMDQtMTEgMTE6MDg6MzUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJICBGaXggdGhlIENoYW5nZWxvZyAtIGFjdHVhbGx5IHNwZWV4IDw9IDEuMS4xMiBhcmUgdnVsbmVyYWJsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4IHRoZSBDaGFuZ2Vsb2cgLSBhY3R1YWxseSBzcGVleCA8PSAxLjEuMTIgYXJlIHZ1bG5lcmFibGUuCisKKzIwMDgtMDQtMTEgMTA6MzI6MjAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogRml4IGJvdW5kcyBjaGVja2luZyBvZiBtb2RlIGluIFNwZWV4IGhlYWRlciwgd2hpY2ggbWF5IHByb2R1Y2UgbmVnYXRpdmUgbnVtYmVycyBpbiBzcGVleCA8IDEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogKHNwZWV4X2RlY19jaGFpbl9wYXJzZV9oZWFkZXIpOgorCSAgRml4IGJvdW5kcyBjaGVja2luZyBvZiBtb2RlIGluIFNwZWV4IGhlYWRlciwgd2hpY2ggbWF5CisJICBwcm9kdWNlIG5lZ2F0aXZlIG51bWJlcnMgaW4gc3BlZXggPCAxLjEuMTIKKworMjAwOC0wNC0xMCAwNzoxMTo1MSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOiBJbmNyZWFzZSB0aGUgdGltZW91dCBmb3IgdGhlIGludGVybmV0IHRlc3RzIHRvIDI1MCBzZWNvbmRzIGFuZCBjaGVjayBmb3IgTlVMTCBjYXAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOiAoZ290X2J1ZmZlciksCisJICAoc291cGh0dHBzcmNfc3VpdGUpOgorCSAgSW5jcmVhc2UgdGhlIHRpbWVvdXQgZm9yIHRoZSBpbnRlcm5ldCB0ZXN0cyB0byAyNTAgc2Vjb25kcworCSAgYW5kIGNoZWNrIGZvciBOVUxMIGNhcHMgaW5zdGVhZCBvZiBqdXN0IGNyYXNoaW5nLgorCSAgVGhlIHJlYWwgZml4IHdvdWxkIGJlIHRvIGltcGxlbWVudCBhbiBzaG91dGNhc3Qgc2VydmVyIGZvciB0aGUgdW5pdCB0ZXN0CisJICBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gYSB3b3JraW5nIGludGVybmV0IGNvbm5lY3Rpb24uCisJICBGaXhlcyBidWcgIzUyMTc0OS4KKworMjAwOC0wNC0wOSAxNjoxMTo0MCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2dvb20vOiBSZW1vdmUgYSBidW5jaCBvZiBmb250L3RleHQgcmVsYXRlZCBjb2RlIHRoYXQgd2UgZG9uJ3QgbmVlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2dvb20vZ2ZvbnRsaWIuYzoKKwkgICogZ3N0L2dvb20vZ2ZvbnRsaWIuaDoKKwkgICogZ3N0L2dvb20vZ2ZvbnRybGUuYzoKKwkgICogZ3N0L2dvb20vZ2ZvbnRybGUuaDoKKwkgICogZ3N0L2dvb20vZ29vbS5oOgorCSAgKiBnc3QvZ29vbS9nb29tX2NvcmUuYzogKGdvb21fdXBkYXRlKToKKwkgICogZ3N0L2dvb20vZ29vbV9wbHVnaW5faW5mby5oOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9jaGFpbik6CisJICAqIGdzdC9nb29tL3BsdWdpbl9pbmZvLmM6CisJICBSZW1vdmUgYSBidW5jaCBvZiBmb250L3RleHQgcmVsYXRlZCBjb2RlIHRoYXQgd2UgZG9uJ3QgbmVlZC4KKworMjAwOC0wNC0wOSAxNDowMjozNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2dvb20vOiBDaGFuZ2UgbGljZW5zZSBvZiB0aGVzZSBmaWxlcyB0byBMR1BMLCBhcyBwZXJtaXR0ZWQgYnkgdGhlIGF1dGhvciwgR3VpbGxhdW1lIEJvcmlvcy4gU2VlICM1MTUwNzMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vcHBjX2RyYXdpbmdzLnM6CisJICAqIGdzdC9nb29tL3BwY196b29tX3VsdGltYXRlLnM6CisJICBDaGFuZ2UgbGljZW5zZSBvZiB0aGVzZSBmaWxlcyB0byBMR1BMLCBhcyBwZXJtaXR0ZWQgYnkgdGhlCisJICBhdXRob3IsIEd1aWxsYXVtZSBCb3Jpb3MuIFNlZSAjNTE1MDczLgorCisyMDA4LTA0LTA5IDEzOjMxOjIyICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9nb29tLzogQXMgaGludGVkIGluIEJ1ZyAjNTE4MjEzLCByZXZlcnQgb25lIGNoYW5nZSBhbmQgZml4IHdhcm5pbmdzIHByb3Blcmx5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9nb29tL2NvbnZvbHZlX2Z4LmM6CisJICAqIGdzdC9nb29tL21vdGlmX2dvb20xLmg6CisJICAqIGdzdC9nb29tL21vdGlmX2dvb20yLmg6CisJICBBcyBoaW50ZWQgaW4gQnVnICM1MTgyMTMsIHJldmVydCBvbmUgY2hhbmdlIGFuZCBmaXggd2FybmluZ3MgcHJvcGVybHkuCisJICBUaGlzIGZpeGVzIGJvdGggIzUxODIxMyBhbmQgIzUyMDA3MyBmb3IgbWUuCisKKzIwMDgtMDQtMDkgMTI6MDI6NTUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvbWF0cm9za2EvOiBGaXggdGhlIEZvcnRlIGJ1aWxkIGJ5IG1ha2luZyBmdW5jdGlvbiBkZWNsYXJhdGlvbiBzaWduYXR1cmVzIG1hdGNoIHRoZSBpbXBsZW1lbnRhdGlvbnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOiAoZ3N0X2VibWxfcmVhZF9zZWVrKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfY29udGVudHNfc2Vla2VudHJ5KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcCk6CisJICBGaXggdGhlIEZvcnRlIGJ1aWxkIGJ5IG1ha2luZyBmdW5jdGlvbiBkZWNsYXJhdGlvbiBzaWduYXR1cmVzCisJICBtYXRjaCB0aGUgaW1wbGVtZW50YXRpb25zLgorCisyMDA4LTA0LTA4IDE5OjQ5OjM0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvb3NzLzogTW9yZSBsb2dnaW5nIHdoZW4gcHJvYmluZyAoc2VlICM1MTg0NzQpLCBzb21lIGNvbW1lbnRzIGluIF9yZXNldCgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3MvZ3N0b3NzaGVscGVyLmM6IChnc3Rfb3NzX2hlbHBlcl9yYXRlX2NoZWNrX3JhdGUpOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3Nfc2lua19yZXNldCk6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6IChnc3Rfb3NzX3NyY19yZXNldCk6CisJICBNb3JlIGxvZ2dpbmcgd2hlbiBwcm9iaW5nIChzZWUgIzUxODQ3NCksIHNvbWUgY29tbWVudHMgaW4gX3Jlc2V0KCkuCisKKzIwMDgtMDQtMDcgMTc6MTg6NDggKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzogRml4IGJ1aWxkIGJlY2F1c2Ugb2YgYSBiYWQgYXJndW1lbnQgbnVtYmVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA4LTA0LTA3ICBKdWxpZW4gTW91dHRlICA8anVsaWVuQGZsdWVuZG8uY29tPgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzogKGdzdF9ydHBfaDI2NF9wYXlfc2V0Y2Fwcyk6IEZpeCBidWlsZAorCSAgYmVjYXVzZSBvZiBhIGJhZCBhcmd1bWVudCBudW1iZXIuCisKKzIwMDgtMDQtMDYgMTg6Mjg6MDkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHRlc3RzL2ljbGVzLzogSW50ZXJhY3RpdmUgdGVzdCBhcHAgZm9yIGdka3BpeGJ1ZnNpbmsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvaWNsZXMvLmN2c2lnbm9yZToKKwkgICogdGVzdHMvaWNsZXMvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2ljbGVzL2dka3BpeGJ1ZnNpbmstdGVzdC5jOgorCSAgSW50ZXJhY3RpdmUgdGVzdCBhcHAgZm9yIGdka3BpeGJ1ZnNpbmsuCisKKzIwMDgtMDQtMDYgMDk6MDE6NDIgKzAwMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogT25seSBpZ25vcmUgYWN0dWFsIHJlZGlyZWN0cyBub3QgYWxsIHJlc3BvbnNlcyB3aGVuIGluIHN0YXRlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTam9lcmQgU2ltb25zIDxzam9lcmQgYXQgbHVvbiBkb3QgbmV0PgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOiAoZ3N0X3NvdXBfaHR0cF9zcmNfcmVzcG9uc2VfY2IpOgorCSAgT25seSBpZ25vcmUgYWN0dWFsIHJlZGlyZWN0cyBub3QgYWxsIHJlc3BvbnNlcyB3aGVuIGluIHN0YXRlCisJICBHU1RfU09VUF9IVFRQX1NSQ19TRVNTSU9OX0lPX1NUQVRVU19SVU5OSU5HLiBGaXhlcyBidWcgIzUyNjMzNy4KKworMjAwOC0wNC0wNiAwODo1Nzo1OSArMDAwMCAgRGFtaWVuIExlc3BpYXUgPGRhbWllbi5sZXNwaWF1QGdtYWlsLmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBBY3R1YWxseSBidWlsZCBkbGxzIHdoZW4gY3Jvc3MtY29tcGlsaW5nIHdpdGggbWluZ3czMi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IERhbWllbiBMZXNwaWF1IDxkYW1pZW4gZG90IGxlc3BpYXUgYXQgZ21haWwgZG90IGNvbT4KKwkgICogY29uZmlndXJlLmFjOgorCSAgQWN0dWFsbHkgYnVpbGQgZGxscyB3aGVuIGNyb3NzLWNvbXBpbGluZyB3aXRoIG1pbmd3MzIuCisJICBGaXhlcyBidWcgIzUyNjI0Ny4KKworMjAwOC0wNC0wNSAxMjowMDo0NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2hhbC9oYWwuYzogRG9uJ3QgbXVuZ2UgZGV2aWNlIHN0cmluZyB0byAnZGVmYXVsdDp4JyBmb3IgY2FwdHVyZSBkZXZpY2VzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9oYWwvaGFsLmM6IChnc3RfaGFsX2dldF9hbHNhX2VsZW1lbnQpOgorCSAgRG9uJ3QgbXVuZ2UgZGV2aWNlIHN0cmluZyB0byAnZGVmYXVsdDp4JyBmb3IgY2FwdHVyZSBkZXZpY2VzLgorCSAgRml4ZXMgIzUyNTgzMy4KKworMjAwOC0wNC0wNCAxOTowMDoxOSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogQWx3YXlzIHVzZSBHU2xpY2UgYXMgd2UgYWN0dWFsbHkgZGVwZW5kIG9uIEdMaWIgMi4xMiBhbHJlYWR5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2luZGV4X2VudHJ5X2ZyZWUpOgorCSAgQWx3YXlzIHVzZSBHU2xpY2UgYXMgd2UgYWN0dWFsbHkgZGVwZW5kIG9uIEdMaWIgMi4xMiBhbHJlYWR5LgorCisyMDA4LTA0LTA0IDExOjI2OjQwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IFJlcXVpcmUgY29yZS9iYXNlIDAuMTAuMTggZm9yIEFSR0IgY2FwcyBwYXJzaW5nIGZpeGVzIGluIGxpYmdzdHZpZGVvLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIFJlcXVpcmUgY29yZS9iYXNlIDAuMTAuMTggZm9yIEFSR0IgY2FwcyBwYXJzaW5nIGZpeGVzIGluIGxpYmdzdHZpZGVvLgorCSAgQWxzbyBidW1wIHRoZSBHTGliIHJlcXVpcmVtZW50IHRvIHRoZSBjdXJyZW50IGRlLWZhY3RvIHJlcXVpcmVtZW50CisJICAoaWUuIDIuMTIpLgorCisyMDA4LTA0LTA0IDEwOjMyOjIxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuKjogUGFyc2UgY29kZWNfZGF0YSBmb3IgZnV0dXJlIEFWQyBjb21wYXRpYmlsaXR5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOiAoZW5jb2RlX2Jhc2U2NCksCisJICAoZ3N0X3J0cF9oMjY0X3BheV9zZXRjYXBzKSwgKGdzdF9ydHBfaDI2NF9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5oOgorCSAgUGFyc2UgY29kZWNfZGF0YSBmb3IgZnV0dXJlIEFWQyBjb21wYXRpYmlsaXR5LgorCSAgRmFpbCB3aGVuIHdlIGVuY291bnRlciBBVkMgZGF0YSBmb3Igbm93LgorCisyMDA4LTA0LTA0IDA5OjUwOjEwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogUmVuYW1lIHByb3BlcnR5IGVudW1zIGFuZCBkZWZhdWx0IGRlZmluZXMgZm9yIHRoZSBwcm9wZXJ0aWVzIHRvIG1hdGNoIHRoZSBwcm9wZXJ0eSBuYW1lcyAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogKGdzdF9zcGVjdHJ1bV9jbGFzc19pbml0KSwKKwkgIChnc3Rfc3BlY3RydW1faW5pdCksIChnc3Rfc3BlY3RydW1fc2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfc3BlY3RydW1fZ2V0X3Byb3BlcnR5KSwgKGdzdF9zcGVjdHJ1bV9tZXNzYWdlX25ldyk6CisJICBSZW5hbWUgcHJvcGVydHkgZW51bXMgYW5kIGRlZmF1bHQgZGVmaW5lcyBmb3IgdGhlIHByb3BlcnRpZXMgdG8gbWF0Y2gKKwkgIHRoZSBwcm9wZXJ0eSBuYW1lcyBhbmQgcmVwaHJhc2UgcHJvcGVydHkgZGVzY3JpcHRpb25zIHRvIG1ha2UgdGhlbSBhCisJICBiaXQgY2xlYXJlciAoaG9wZWZ1bGx5KS4gU2VlICM1MTgxODguCisKKzIwMDgtMDQtMDMgMjI6NTk6NDQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHRlc3RzL2NoZWNrLzogQWRkIHVuaXQgdGVzdCBmb3IgZ2RrcGl4YnVmc2luayBlbGVtZW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9nZGtwaXhidWZzaW5rLmM6CisJICBBZGQgdW5pdCB0ZXN0IGZvciBnZGtwaXhidWZzaW5rIGVsZW1lbnQuCisKKzIwMDgtMDQtMDMgMjI6NTA6NDggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9nZGtfcGl4YnVmLzogQWRkIGdka3BpeGJ1ZnNpbmsgZWxlbWVudCBmb3IgZWFzeSBzbmFwc2hvdHRpbmcgKCM1MjU5NDYpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nZGtfcGl4YnVmL01ha2VmaWxlLmFtOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKHBsdWdpbl9pbml0KToKKwkgICogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5jOgorCSAgKGdzdF9nZGtfcGl4YnVmX3NpbmtfYmFzZV9pbml0KSwKKwkgIChnc3RfZ2RrX3BpeGJ1Zl9zaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2dka19waXhidWZfc2lua19pbml0KSwKKwkgIChnc3RfZ2RrX3BpeGJ1Zl9zaW5rX3N0YXJ0KSwgKGdzdF9nZGtfcGl4YnVmX3Npbmtfc3RvcCksCisJICAoZ3N0X2dka19waXhidWZfc2lua19zZXRfY2FwcyksCisJICAoZ3N0X2dka19waXhidWZfc2lua19waXhidWZfZGVzdHJveV9ub3RpZnkpLAorCSAgKGdzdF9nZGtfcGl4YnVmX3NpbmtfZ2V0X3BpeGJ1Zl9mcm9tX2J1ZmZlciksCisJICAoZ3N0X2dka19waXhidWZfc2lua19oYW5kbGVfYnVmZmVyKSwgKGdzdF9nZGtfcGl4YnVmX3NpbmtfcHJlcm9sbCksCisJICAoZ3N0X2dka19waXhidWZfc2lua19yZW5kZXIpLCAoZ3N0X2dka19waXhidWZfc2lua19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9nZGtfcGl4YnVmX3NpbmtfZ2V0X3Byb3BlcnR5KToKKwkgICogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmc2luay5oOgorCSAgQWRkIGdka3BpeGJ1ZnNpbmsgZWxlbWVudCBmb3IgZWFzeSBzbmFwc2hvdHRpbmcgKCM1MjU5NDYpLgorCisyMDA4LTA0LTAzIDIwOjI1OjM0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy93YXZwYWNrLmM6IEJ1bXAgdGltZW91dCBmcm9tIDMgdG8gNjAgc2Vjb25kcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvd2F2cGFjay5jOiAod2F2cGFja19zdWl0ZSk6CisJICBCdW1wIHRpbWVvdXQgZnJvbSAzIHRvIDYwIHNlY29uZHMuCisKKzIwMDgtMDQtMDMgMjA6MjE6MTUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svcGlwZWxpbmVzLy5jdmlnbm9yZTogUmVtb3ZlIHVzZWxlc3MgZmlsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvLmN2aWdub3JlOgorCSAgUmVtb3ZlIHVzZWxlc3MgZmlsZS4KKwkgICogdGVzdHMvY2hlY2svcGlwZWxpbmVzLy5jdnNpZ25vcmU6CisJICBBZGQgbmV3IHRlc3QgdG8gLmN2c2lnbm9yZS4KKworMjAwOC0wNC0wMyAyMDowNTozMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICB0ZXN0cy9jaGVjay86IEFkZCB1bml0IHRlc3QgdGhhdCBlbmNvZGVzIGFuZCBkZWNvZGVzIHNvbWUgZGF0YSwgY2hlY2tzIHRoYXQgaXQgaXMgc3RpbGwgdGhlIHNhbWUgYW5kIHRoYXQgYWxsIHRpbWVzdGEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3dhdnBhY2suYzogKGJ1c19oYW5kbGVyKSwKKwkgIChpZGVudGl0eV9oYW5kb2ZmKSwgKGZha2VzaW5rX2hhbmRvZmYpLCAoR1NUX1NUQVJUX1RFU1QpLAorCSAgKHdhdnBhY2tfc3VpdGUpLCAobWFpbik6CisJICBBZGQgdW5pdCB0ZXN0IHRoYXQgZW5jb2RlcyBhbmQgZGVjb2RlcyBzb21lIGRhdGEsIGNoZWNrcyB0aGF0IGl0CisJICBpcyBzdGlsbCB0aGUgc2FtZSBhbmQgdGhhdCBhbGwgdGltZXN0YW1wcy9vZmZzZXRzIGFyZSBwZXJmZWN0LgorCisyMDA4LTA0LTAzIDE4OjI4OjI4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrLzogVXNlIEdTbGljZSBmb3IgYWxsb2NhdGluZyBpbmRleCBlbnRyaWVzIGFuZCB1c2UgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X2RldGFpbHNfc2ltcGxlKCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX2Jhc2VfaW5pdCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogKGdzdF93YXZwYWNrX2VuY19iYXNlX2luaXQpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9pbmRleF9lbnRyeV9uZXcpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2luZGV4X2VudHJ5X2ZyZWUpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2Jhc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfaW5kZXhfYXBwZW5kX2VudHJ5KSwgKGdzdF93YXZwYWNrX3BhcnNlX3Jlc2V0KToKKwkgIFVzZSBHU2xpY2UgZm9yIGFsbG9jYXRpbmcgaW5kZXggZW50cmllcyBhbmQgdXNlCisJICBnc3RfZWxlbWVudF9jbGFzc19zZXRfZGV0YWlsc19zaW1wbGUoKS4KKworMjAwOC0wNC0wMiAyMjozNzoyOSArMDAwMCAgQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbkBzdW4uY29tPgorCisJICBzeXMvc3VuYXVkaW8vOiBGaXggdXAgY29weXJpZ2h0cyAoIzUyNTg2MCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uIGF0IHN1biBkb3QgY29tPgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW8uYzoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXIuYzoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXIuaDoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyY3RybC5oOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcnRyYWNrLmM6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVydHJhY2suaDoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmg6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuaDoKKwkgIEZpeCB1cCBjb3B5cmlnaHRzICgjNTI1ODYwKS4KKworMjAwOC0wNC0wMiAxNjoxMDozMyArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBhZGQgbmV3IGdvb20gcGx1Z2luIHRvIHNwZWMgZmlsZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgbmV3IGdvb20gcGx1Z2luIHRvIHNwZWMgZmlsZQorCisyMDA4LTA0LTAyIDE1OjQyOjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvZ29vbS9nb29tc2wuYzogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGZyZWFkKCkgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vZ29vbXNsLmM6IChnc2xfcmVhZF9maWxlKToKKwkgIENoZWNrIHJldHVybiB2YWx1ZSBvZiBmcmVhZCgpIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgorCisyMDA4LTA0LTAxIDExOjAwOjQzICswMDAwICBtZXJzYWQgPG1lcnNhZEBheGlzLmNvbT4KKworCSAgZ3N0L2xhdy86IE1ha2UgbmVnb3RpYXRpb24gYSBiaXQgbW9kZXJuLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBCYXNlZCBvbiBwYXRjaCBieTogbWVyc2FkIDxtZXJzYWQgYXQgYXhpcyBkb3QgY29tPgorCSAgKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6IChnc3RfYWxhd19kZWNfc2lua19zZXRjYXBzKSwKKwkgIChnc3RfYWxhd19kZWNfY2hhaW4pLCAoZ3N0X2FsYXdfZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9sYXcvYWxhdy1kZWNvZGUuaDoKKwkgICogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOiAoZ3N0X2FsYXdfZW5jX2NoYWluKToKKwkgICogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzogKG11bGF3ZGVjX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X211bGF3ZGVjX2NoYWluKSwgKGdzdF9tdWxhd2RlY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvbGF3L211bGF3LWRlY29kZS5oOgorCSAgKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOiAoZ3N0X211bGF3ZW5jX2NoYWluKToKKwkgIE1ha2UgbmVnb3RpYXRpb24gYSBiaXQgbW9kZXJuLgorCSAgVXNlIHBhZF9hbGxvYy4gRml4ZXMgIzUyNTM1OS4KKworMjAwOC0wMy0zMSAyMjowNjoxNCArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkgIGdzdC9nb29tL3htbXguYzogRml4IGNvbnN0cmFpbnRzIG9uIGFzbSBjb2RlIHNvIHRoYXQgaXQgY29tcGlsZXMgY29uc2lzdGVudGx5LiAgRml4ZXMgIzUyMjI3OC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS94bW14LmM6IEZpeCBjb25zdHJhaW50cyBvbiBhc20gY29kZSBzbyB0aGF0IGl0CisJICBjb21waWxlcyBjb25zaXN0ZW50bHkuICBGaXhlcyAjNTIyMjc4LgorCisyMDA4LTAzLTI3IDA5OjM2OjU4ICswMDAwICBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uQHN1bi5jb20+CisKKwkgIHN5cy9zdW5hdWRpby86IEZpeCB1cCB0aGUgbWl4ZXIgdHJhY2tzIHRvIHVzZSBhIHZvbHVtZSByYW5nZSBvZiAwLTI1NSwgd2hpY2ggaXMgd2hhdCB0aGUgc3VuIGF1ZGlvIEFQSSB1c2VzLiBUaGlzIHNpbS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbiBhdCBzdW4gZG90IGNvbT4KKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJICAoZ3N0X3N1bmF1ZGlvbWl4ZXJfY3RybF9nZXRfdm9sdW1lKSwKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX3NldF92b2x1bWUpOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcnRyYWNrLmM6IChnc3Rfc3VuYXVkaW9taXhlcl90cmFja19uZXcpOgorCSAgRml4IHVwIHRoZSBtaXhlciB0cmFja3MgdG8gdXNlIGEgdm9sdW1lIHJhbmdlIG9mIDAtMjU1LCB3aGljaCBpcyB3aGF0CisJICB0aGUgc3VuIGF1ZGlvIEFQSSB1c2VzLiBUaGlzIHNpbXBsaWZpZXMgdGhlIGNvZGUgYW5kIGF2b2lkcyByb3VuZGluZworCSAgZXJyb3JzLiBGaXhlcyAjNTI0NTkzLgorCisyMDA4LTAzLTI2IDE1OjEwOjA4ICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIENoYW5nZUxvZzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgIEFkZCBkZXZpY2UtZmQgcHJvcGVydHkgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBhcHBzIHRvIGNhbGwgaW9jdGwncy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQWRkIGRldmljZS1mZCBwcm9wZXJ0eSB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGFwcHMgdG8gY2FsbCBpb2N0bCdzLgorCisyMDA4LTAzLTI1IDE2OjQ0OjIwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFVuYnJlYWsgc3RyZWFtaW5nIG1vZGUgYWdhaW4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAobmV4dF9lbnRyeV9zaXplKToKKwkgIFVuYnJlYWsgc3RyZWFtaW5nIG1vZGUgYWdhaW4uCisKKzIwMDgtMDMtMjUgMTI6Mzk6MjIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogUmVtb3ZlIHN1cGVyZmx1b3VzIERFQlVHIG1hY3JvLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX3NldF9jYXB0dXJlKToKKwkgIFJlbW92ZSBzdXBlcmZsdW91cyBERUJVRyBtYWNyby4KKworMjAwOC0wMy0yNSAxMjozMzowOSArMDAwMCAgV2lsbGlhbSBNLiBCcmFjayA8d2JyYWNrQG1tbS5jb20uaGs+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogQ2hlY2sgd2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIHNldHRpbmcgdGhlIGZyYW1lcmF0ZSBiZWZvcmUgdHJ5aW5nIHRvIHNldCBpdCBhbmQgdGhlbiBwby4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBCYXNlZCBvbiBwYXRjaCBieTogV2lsbGlhbSBNLiBCcmFjayA8d2JyYWNrIGF0IG1tbSBjb20gaGs+CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGZyYWN0aW9uc19hcmVfZXF1YWwpLAorCSAgKGdzdF92NGwyc3JjX3NldF9jYXB0dXJlKToKKwkgIENoZWNrIHdoZXRoZXIgdGhlIGRldmljZSBzdXBwb3J0cyBzZXR0aW5nIHRoZSBmcmFtZXJhdGUgYmVmb3JlCisJICB0cnlpbmcgdG8gc2V0IGl0IGFuZCB0aGVuIHBvc3RpbmcgYSB3YXJuaW5nIG9yIGVycm9yIGlmIGl0IGRvZXNuJ3QKKwkgIHdvcmsgKCM1MTY2NDksICM1MjAwOTIpLiBBbHNvIGNvbXBhcmUgZnJhY3Rpb25zIG1vcmUgY29ycmVjdGx5LgorCisyMDA4LTAzLTI0IDEyOjMyOjU5ICswMDAwICBSZW5lIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkgIE1ha2UgcmdhbmFseXNpcyBhbmQgcmdsaW1pdGVyIGVsZW1lbnRzIEdBUC1mbGFnIGF3YXJlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuYyAoZ3N0X3JnX2FuYWx5c2lzX2luaXQpLAorCSAgKGdzdF9yZ19hbmFseXNpc190cmFuc2Zvcm1faXApOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYyAoZ3N0X3JnX2xpbWl0ZXJfaW5pdCksCisJICAoZ3N0X3JnX2xpbWl0ZXJfdHJhbnNmb3JtX2lwKToKKwkgIE1ha2UgcmdhbmFseXNpcyBhbmQgcmdsaW1pdGVyIGVsZW1lbnRzIEdBUC1mbGFnIGF3YXJlLgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6ICh0ZXN0X2dhcF9idWZmZXJzKSwKKwkgIChyZ2FuYWx5c2lzX3N1aXRlKToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdsaW1pdGVyLmMgKHRlc3RfZ2FwKSwgKHJnbGltaXRlcl9zdWl0ZSk6CisJICBBZGQgdGVzdHMgdG8gdmVyaWZ5IGdhcC1hd2FyZW5lc3MuCisKKzIwMDgtMDMtMjMgMTM6MzE6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9nb29tL01ha2VmaWxlLmFtOiBSZW1vdmUgcHBjIGFzc2VtYmxlciBvcHRpbWlzYXRpb25zIGZyb20gdGhlIGJ1aWxkIHVudGlsIHRoZXkgYWN0dWFsbHkgYnVpbGQgKHRoZXkgYWxzbyBzZWVtIHRvIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9nb29tL01ha2VmaWxlLmFtOgorCSAgUmVtb3ZlIHBwYyBhc3NlbWJsZXIgb3B0aW1pc2F0aW9ucyBmcm9tIHRoZSBidWlsZCB1bnRpbCB0aGV5CisJICBhY3R1YWxseSBidWlsZCAodGhleSBhbHNvIHNlZW0gdG8gaGF2ZSBHUEwgaGVhZGVycykuCisKKzIwMDgtMDMtMjMgMTI6NDg6NDQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIG00L01ha2VmaWxlLmFtOiBCZXR0ZXIgbm90IGRpc3QgZmlsZXMgdGhhdCBkb24ndCBleGlzdCBhbnkgbG9uZ2VyIChscmludCptNCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogbTQvTWFrZWZpbGUuYW06CisJICBCZXR0ZXIgbm90IGRpc3QgZmlsZXMgdGhhdCBkb24ndCBleGlzdCBhbnkgbG9uZ2VyIChscmludCptNCkuCisKKzIwMDgtMDMtMjIgMTk6MjY6MDQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogRG9uJ3QgYXV0b3BsdWcgc291cGh0dHBzcmMgZm9yIGRhdi9kYXZzLiBUaGlzIGlzIGJldHRlciBoYW5kbGVkIGJ5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKGdzdF9zb3VwX2h0dHBfc3JjX2dvdF9oZWFkZXJzX2NiKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19jaHVua19hbGxvY2F0b3IpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX2dvdF9jaHVua19jYiksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfdXJpX2dldF9wcm90b2NvbHMpOgorCSAgRG9uJ3QgYXV0b3BsdWcgc291cGh0dHBzcmMgZm9yIGRhdi9kYXZzLiBUaGlzIGlzIGJldHRlciBoYW5kbGVkIGJ5CisJICBHSU8gYW5kIEdub21lVkZTIGFzIHRoZXkgcHJvdmlkZSBhdXRoZW50aWNhdGlvbi4KKwkgIERvbid0IGxlYWsgdGhlIGljeSBjYXBzIGlmIHdlIGFscmVhZHkgc2V0IHRoZW0gYW5kIGdldCBhIG5ldworCSAgaWN5LW1ldGFpbnQgaGVhZGVyLgorCSAgVHJ5IGhhcmRlciB0byBzZXQgdGhlIGljeSBjYXBzIG9uIHRoZSBvdXRwdXQgYnVmZmVyIHRvIGhhdmUgY29ycmVjdAorCSAgY2FwcyBmb3IgdGhlIGZpcnN0IGJ1ZmZlciBhbHJlYWR5LgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOiAoZ290X2J1ZmZlciksCisJICAoR1NUX1NUQVJUX1RFU1QpOgorCSAgQ2hlY2sgdGhhdCB3ZSBnZXQgYSBidWZmZXIgd2l0aCBhcHBsaWNhdGlvbi94LWljeSBjYXBzIGlmIGlyYWRpby1tb2RlCisJICBpcyBlbmFibGVkIGFuZCB3ZSBoYXZlIGFuIGljZWNhc3QgVVJMLgorCisyMDA4LTAzLTIyIDE4OjE4OjQ2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IEFjdHVhbGx5IHNldCB0aGUgaWN5IGNhcHMgb24gb3VyIHNyYyBwYWQgaWYgd2UgaGF2ZSBpY2VjYXN0IGRhdGEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKGdzdF9zb3VwX2h0dHBfc3JjX2NodW5rX2FsbG9jYXRvcik6CisJICBBY3R1YWxseSBzZXQgdGhlIGljeSBjYXBzIG9uIG91ciBzcmMgcGFkIGlmIHdlIGhhdmUgaWNlY2FzdCBkYXRhLgorCSAgRml4ZXMgYnVnICM1MjM4NTQuCisKKzIwMDgtMDMtMjEgMTM6MzY6MjcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgUmVtb3ZlIGxyaW50L2xyaW50ZiBjaGVja3MuIFdlIGRvbid0IHVzZSBpdCBhbnl3aGVyZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIG00L2xyaW50Lm00OgorCSAgKiBtNC9scmludGYubTQ6CisJICBSZW1vdmUgbHJpbnQvbHJpbnRmIGNoZWNrcy4gV2UgZG9uJ3QgdXNlIGl0IGFueXdoZXJlLgorCisyMDA4LTAzLTE5IDE5OjU2OjU5ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9mcmVlemUvOiBBZGQgZXhhbXBsZSB0byBzb3VyY2UgY29kZSBkb2N1bWVudGF0aW9uIGJsb2IgYW5kIHJlbW92ZSB0aGUgMyBsaW5lCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ZyZWV6ZS9GQVE6CisJICAqIGdzdC9mcmVlemUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9mcmVlemUvZ3N0ZnJlZXplLmM6CisJICBBZGQgZXhhbXBsZSB0byBzb3VyY2UgY29kZSBkb2N1bWVudGF0aW9uIGJsb2IgYW5kIHJlbW92ZSB0aGUgMyBsaW5lCisJICBGQVEuCisJICAqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzoKKwkgIEFkZCBhIHNvdXJjZSBjb2RlIGRvY3VtZW50YXRpb24gYmxvYi4KKworMjAwOC0wMy0xOCAxNTowMzowNiArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm0gKGdzdF9vc3hfdmlkZW9fc2lua19vc3h3aW5kb3dfZGVzdHJveSkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwOC0wMy0xOCAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tCisJICAoZ3N0X29zeF92aWRlb19zaW5rX29zeHdpbmRvd19kZXN0cm95KQorCSAgKGdzdF9vc3hfdmlkZW9fc2lua19vc3h3aW5kb3dfbmV3KTogQWN0dWFsbHkgc2V0IGEgbG9jayBvbiB0aGUKKwkgIHRhc2ssIHdob29wZGVlLgorCSAgKGNvY29hX2V2ZW50X2xvb3ApOiBQYWNpZnkgdGhlIHRheW1hbnMgYnkgdXBwaW5nIHRoZSB1c2xlZXBhZ2UgdG8KKwkgIDIgbXMuCisKKzIwMDgtMDMtMTggMTE6NTA6MDggKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSAgc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tIChnc3Rfb3N4X3ZpZGVvX3Npbmtfb3N4d2luZG93X2Rlc3Ryb3kpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDgtMDMtMTggIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubSAoZ3N0X29zeF92aWRlb19zaW5rX29zeHdpbmRvd19kZXN0cm95KQorCSAgKGdzdF9vc3hfdmlkZW9fc2lua19vc3h3aW5kb3dfbmV3LCBjb2NvYV9ldmVudF9sb29wKToKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oIChzdHJ1Y3QgX0dzdE9TWFZpZGVvU2luayk6IElmIHdlCisJICBuZWVkIHRvIHJ1biBhbiBldmVudCBsb29wLCBkbyBzbyBpbiBhIHRhc2sgaW5zdGVhZCBvZiBhc3N1bWluZworCSAgdGhhdCB0aGVyZSB3aWxsIGJlIGEgR01haW5Mb29wLiBGaXhlcyAjNTIzMTM0LgorCisyMDA4LTAzLTE3IDE5OjUwOjU4ICswMDAwICBXaWxsaWFtIE0uIEJyYWNrIDx3YnJhY2tAbW1tLmNvbS5oaz4KKworCSAgc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiBNYWtlIHN1cmUgdGhlIHByb2JlZCBmcmFtZSBzaXplcyBhcmUgcmV2ZXJzZWQgaW4gdGhlIHJlc3VsdGluZyBjYXBzIGFsc28gd2hlbiB1c2luZyBWNEwyX0ZSLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBXaWxsaWFtIE0uIEJyYWNrIDx3YnJhY2sgYXQgbW1tIGNvbSBoaz4KKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSAgKGdzdF92NGwyc3JjX3Byb2JlX2NhcHNfZm9yX2Zvcm1hdF9hbmRfc2l6ZSksCisJICAoZ3N0X3Y0bDJzcmNfcHJvYmVfY2Fwc19mb3JfZm9ybWF0KToKKwkgIE1ha2Ugc3VyZSB0aGUgcHJvYmVkIGZyYW1lIHNpemVzIGFyZSByZXZlcnNlZCBpbiB0aGUgcmVzdWx0aW5nCisJICBjYXBzIGFsc28gd2hlbiB1c2luZyBWNEwyX0ZSTVNJWkVfU1RFUFdJU0UgKHNvIHRoZXkgZW5kIHVwCisJICBoaWdoZXN0IHJlc29sdXRpb24gZmlyc3QpOyBhbHNvIHJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCisJICAoUGFydGx5IGZpeGVzICM1MjAwOTIpCisKKzIwMDgtMDMtMTcgMTU6NTY6MDEgKzAwMDAgIE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcyA8b2xlLmFuZHJlLnJhdm5hc0B0YW5kYmVyZy5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogQ2FsbCBXU0FTdGFydHVwKCkgYW5kIFdTQUNsZWFudXAgYmVmb3JlIHVzaW5nIHRoZSBXaW5zb2NrIEFQSS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcyAgPG9sZS5hbmRyZS5yYXZuYXNAdGFuZGJlcmcuY29tPgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19pbml0KSwKKwkgIChnc3RfcnRzcHNyY19maW5hbGl6ZSk6CisJICBDYWxsIFdTQVN0YXJ0dXAoKSBhbmQgV1NBQ2xlYW51cCBiZWZvcmUgdXNpbmcgdGhlIFdpbnNvY2sgQVBJLgorCSAgU2VlICM1MjA4MDguCisKKzIwMDgtMDMtMTYgMTU6MDE6MDcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBFcm0sIHRoZSBidWZmZXItc2l6ZSBpcyBqdXN0IGd1aW50LCBubyBuZWVkIGZvciB0aGUgc3BlY2lhbCBmb3JtYXQgc3BlY2lmaWVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIEVybSwgdGhlIGJ1ZmZlci1zaXplIGlzIGp1c3QgZ3VpbnQsIG5vIG5lZWQgZm9yIHRoZSBzcGVjaWFsIGZvcm1hdAorCSAgc3BlY2lmaWVyLgorCisyMDA4LTAzLTE2IDE0OjM0OjQ1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvZ29vbS86IFNtYWxsIGZpeGVzIHRvIGJ1aWxkIG1vcmUgb24gUFBDOiBpZmRlZiBvdXQgY29kZSB0aGF0IHVzZXMgdW5rbm93biBkZWZpbmU7IGFkZCBuZXdsaW5lIGF0IGVuZCBvZiBoZWFkZXIgZmkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS9wbHVnaW5faW5mby5jOgorCSAgKiBnc3QvZ29vbS9wcGNfem9vbV91bHRpbWF0ZS5oOgorCSAgU21hbGwgZml4ZXMgdG8gYnVpbGQgbW9yZSBvbiBQUEM6IGlmZGVmIG91dCBjb2RlIHRoYXQgdXNlcyB1bmtub3duCisJICBkZWZpbmU7IGFkZCBuZXdsaW5lIGF0IGVuZCBvZiBoZWFkZXIgZmlsZSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nLgorCSAgQXNzZW1ibGVyIGNvZGUgc3RpbGwgZG9lc24ndCBidWlsZCB0aG91Z2guCisKKzIwMDgtMDMtMTYgMTQ6MDQ6MTYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBGaXggdXAgbXkgbGFzdCBjb21taXQuIFVzZSBHX0dVSU5UMzJfRk9STUFUIGZvciB0aGUgZ3VpbnQzMiBkZWJ1ZyBsb2cuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgRml4IHVwIG15IGxhc3QgY29tbWl0LiBVc2UgR19HVUlOVDMyX0ZPUk1BVCBmb3IgdGhlIGd1aW50MzIgZGVidWcgbG9nLgorCSAgQWxzbyBkb3duZ3JhZGUgYSBHU1RfV0FSTklORyB0byBHU1RfREVCVUcgYW5kIGFkZCBhIGNvbW1lbnQuCisKKzIwMDgtMDMtMTUgMjI6MTA6MzggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBDaHVua3NpemUgaXMgdWludDMyLiBGaXggZm9ybWF0IHNwZWNpZmllci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICBDaHVua3NpemUgaXMgdWludDMyLiBGaXggZm9ybWF0IHNwZWNpZmllci4KKworMjAwOC0wMy0xNCAxNTo1MzowMSArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvcnRzcC9DT1BZSU5HLk1JVDoKKwkgIGZpeCBsaWNlbnNlIGZpbGUsIHJlbW92ZSBleHRyYSBsaW5lIGNvcGllZCBvdmVyIGJ5IG1pc3Rha2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZml4IGxpY2Vuc2UgZmlsZSwgcmVtb3ZlIGV4dHJhIGxpbmUgY29waWVkIG92ZXIgYnkgbWlzdGFrZQorCisyMDA4LTAzLTEzIDE0OjMwOjQ1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9hdWRpb2Z4L2F1ZGlvZnguYzogVXNlIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FIGFuZCBHU1RfUEFDS0FHRV9PUklHSU4gaW5zdGVhZCBvZiBoYXJkY29kaW5nIHZhbHVlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2Z4LmM6CisJICBVc2UgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUgYW5kIEdTVF9QQUNLQUdFX09SSUdJTiBpbnN0ZWFkCisJICBvZiBoYXJkY29kaW5nIHZhbHVlcy4KKworMjAwOC0wMy0xMyAwOTo0NTowOSArMDAwMCAgV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuKjogVHJ5IHRvIHJlc3VtZSBvbiBzZXJ2ZXIgZGlzY29ubmVjdC4gRml4ZXMgYnVnICM1MjIxMzQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBXb3V0ZXIgQ2xvZXRlbnMgPHdvdXRlciBhdCBtaW5kIGRvdCBiZT4KKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKGdzdF9zb3VwX2h0dHBfc3JjX2luaXQpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX2ZpbmlzaGVkX2NiKSwgKGdzdF9zb3VwX2h0dHBfc3JjX3Jlc3BvbnNlX2NiKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19idWlsZF9tZXNzYWdlKSwgKGdzdF9zb3VwX2h0dHBfc3JjX2NyZWF0ZSk6CisJICAqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJICBUcnkgdG8gcmVzdW1lIG9uIHNlcnZlciBkaXNjb25uZWN0LiBGaXhlcyBidWcgIzUyMjEzNC4KKworMjAwOC0wMy0xMSAyMzoxMjowNCArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3QHNreW5ldC5iZT4KKworCSAgc3lzL29zcy9nc3Rvc3NzcmMuKjogQ2FjaGUgcHJvYmVkIGNhcHMsIHNvIF9nZXRfY2FwcygpIGR1cmluZyByZWNvcmRpbmcgZG9lc24ndCBjYXVzZSBpb2N0bCBjYWxscyB3aGljaCBtYXkgZGlzcnVwdCB0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXcgc2t5bmV0IGJlPgorCSAgKiBzeXMvb3NzL2dzdG9zc3NyYy5jOiAoZ3N0X29zc19zcmNfaW5pdCksIChnc3Rfb3NzX3NyY19nZXRjYXBzKSwKKwkgIChnc3Rfb3NzX3NyY19jbG9zZSk6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc3JjLmg6CisJICBDYWNoZSBwcm9iZWQgY2Fwcywgc28gX2dldF9jYXBzKCkgZHVyaW5nIHJlY29yZGluZyBkb2Vzbid0IGNhdXNlCisJICBpb2N0bCBjYWxscyB3aGljaCBtYXkgZGlzcnVwdCB0aGUgcmVjb3JkaW5nIChmaXhlcyAjNTIxODc1KS4KKworMjAwOC0wMy0xMSAxNjoyMzowNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBNYWtlIHN1cmUgd2UgYWx3YXlzIHNlbmQgYSBESVNDT05UIGFmdGVyIGEgc2VlayBieSBzZXR0aW5nIHRoZSBzYW1wbGUgaW5kZXggdG8gYW4gdW5kZWZpbmVkIHZhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfcGVyZm9ybV9zZWVrKSwKKwkgIChnc3RfcXRkZW11eF9hY3RpdmF0ZV9zZWdtZW50KSwKKwkgIChnc3RfcXRkZW11eF9wcmVwYXJlX2N1cnJlbnRfc2FtcGxlKSwKKwkgIChnc3RfcXRkZW11eF9sb29wX3N0YXRlX21vdmllKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBNYWtlIHN1cmUgd2UgYWx3YXlzIHNlbmQgYSBESVNDT05UIGFmdGVyIGEgc2VlayBieSBzZXR0aW5nIHRoZSBzYW1wbGUKKwkgIGluZGV4IHRvIGFuIHVuZGVmaW5lZCB2YWx1ZSBhZnRlciBhIHNlZWsuCisKKzIwMDgtMDMtMTEgMTU6MTg6NDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuaDogRml4IHVwIElTX0ZPTyBtYWNyb3MsIHdoaWNoIG1ha2VzIGd0ay1kb2MgbXVjaCBoYXBwaWVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuaDogKEdTVF9JU19BVklfU1VCVElUTEUpLAorCSAgKEdTVF9JU19BVklfU1VCVElUTEVfQ0xBU1MpOgorCSAgRml4IHVwIElTX0ZPTyBtYWNyb3MsIHdoaWNoIG1ha2VzIGd0ay1kb2MgbXVjaCBoYXBwaWVyLgorCisyMDA4LTAzLTA4IDE5OjI5OjIwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbTogTW92ZSB0aGUgLWxnc3Rmb28gd2hlcmUgaXQgYmVsb25ncy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgIE1vdmUgdGhlIC1sZ3N0Zm9vIHdoZXJlIGl0IGJlbG9uZ3MuCisKKzIwMDgtMDMtMDggMTk6MTQ6MjIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIENoYW5nZUxvZzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5CisKKzIwMDgtMDMtMDggMDQ6NDA6MzIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L21hdHJvc2thL2VibWwtaWRzLmg6IEFkZCBJRCBmb3IgRUJNTCBDUkMzMiBlbGVtZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1pZHMuaDoKKwkgIEFkZCBJRCBmb3IgRUJNTCBDUkMzMiBlbGVtZW50cy4KKwkgICogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9maW5hbGl6ZSksCisJICAoZ3N0X2VibWxfcmVhZF9jbGFzc19pbml0KSwgKGdzdF9lYm1sX3JlYWRfcGVla19ieXRlcyksCisJICAoZ3N0X2VibWxfcmVhZF9nZXRfbGVuZ3RoKSwgKF9leHQyZGJsKSwgKGdzdF9lYm1sX3JlYWRfZmxvYXQpLAorCSAgKGdzdF9lYm1sX3JlYWRfaGVhZGVyKToKKwkgIFN1cHBvcnQgcmVhZGluZyA4MGJpdCBmbG9hdHMsIGFkZCBmaW5hbGl6ZSBtZXRob2QgdG8gY2xlYW4gdXAKKwkgIGluIGFueSBjYXNlLCBzdXBwb3J0IHJlYWRpbmcgbGVuZ3RoL2lkIGVsZW1lbnRzIHdpdGggYW55IGxlbmd0aAorCSAgYXMgbG9uZyBhcyBpdCdzIHNtYWxsZXIgdGhhbiBvdXIgc3VwcG9ydGVkIG1heGltdW0sIGRvbid0IGxlYWsKKwkgIGJ1ZmZlcnMgaWYgcmVhZGluZyBhcyBtdWNoIGRhdGEgYXMgd2Ugd2FudGVkIGZhaWxlZCBhbmQgc29tZQorCSAgc21hbGxlciBjbGVhbnVwLgorCisyMDA4LTAzLTA4IDA0OjIxOjM0ICswMDAwICBPbGl2aWVyIENyZXRlIDx0ZXN0ZXJAdGVzdGVyLmNhPgorCisJICBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzogQ2hlY2sgdGhhdCBhIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggYmVmb3JlIHJlYWRpbmcgZnJvbSBpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlciBhdCB0ZXN0ZXIgZG90IGNhPgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzogKGdzdF9ydHBfaDI2M3BfZGVwYXlfcHJvY2Vzcyk6CisJICBDaGVjayB0aGF0IGEgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCBiZWZvcmUgcmVhZGluZyBmcm9tIGl0LgorCSAgRml4ZXMgYnVnICM1MjExMDIuCisKKzIwMDgtMDMtMDcgMTU6NTQ6MDkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IEZpeCBjb21waWxhdGlvbiBhZnRlciByZW1vdmluZyB0aGUgR3N0UG9sbE1vZGUgZnJvbSB0aGUgY29uc3RydWN0b3IuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfc3RhcnQpOgorCSAgRml4IGNvbXBpbGF0aW9uIGFmdGVyIHJlbW92aW5nIHRoZSBHc3RQb2xsTW9kZSBmcm9tIHRoZQorCSAgY29uc3RydWN0b3IuCisKKzIwMDgtMDMtMDcgMTM6MDg6NDIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgQ2hlY2sgZm9yIHNpbmgoKSwgY29zaCgpIGFuZCBhc2luaCgpIGFuZCBkZWZpbmUgb3VyIG93biBpbXBsZW1lbnRhdGlvbnMgaWYgdGhleSdyZSBub3QgYXZhaWxhYmxlLiBGaXhlcyBidWcgIzUyMDg4MC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9hdWRpb2Z4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0LmM6CisJICAqIGdzdC9hdWRpb2Z4L21hdGhfY29tcGF0Lmg6CisJICBDaGVjayBmb3Igc2luaCgpLCBjb3NoKCkgYW5kIGFzaW5oKCkgYW5kIGRlZmluZSBvdXIgb3duCisJICBpbXBsZW1lbnRhdGlvbnMgaWYgdGhleSdyZSBub3QgYXZhaWxhYmxlLiBGaXhlcyBidWcgIzUyMDg4MC4KKworMjAwOC0wMy0wNyAxMjo0MDoxOCArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IFVucmVmIHRoZSBidWZmZXJzIG9ubHkgb25jZSB3aGVuIGhhbmRsaW5nIG5vdC1uZWdvdGlhdGVkIGVycm9ycy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9saXZpZXIgQ3JldGUgPHRlc3RlciBhdCB0ZXN0ZXIgZG90IGNhPgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleF9lbmNfY2hhaW4pOgorCSAgVW5yZWYgdGhlIGJ1ZmZlcnMgb25seSBvbmNlIHdoZW4gaGFuZGxpbmcgbm90LW5lZ290aWF0ZWQgZXJyb3JzLgorCSAgRml4ZXMgYnVnICM1MjA3NjQuCisKKzIwMDgtMDMtMDcgMTA6MDE6NDAgKzAwMDAgIE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcyA8b2xlLmFuZHJlLnJhdm5hc0B0YW5kYmVyZy5jb20+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IFByb3Blcmx5IGJhbGFuY2UgV1NBX0NsZWFudXAgd2l0aCBXU0FfU3RhcnR1cC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcyAgPG9sZS5hbmRyZS5yYXZuYXNAdGFuZGJlcmcuY29tPgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19maW5hbGl6ZSksIChnc3RfdWRwc3JjX3N0YXJ0KSwKKwkgIChnc3RfdWRwc3JjX3N0b3ApOgorCSAgUHJvcGVybHkgYmFsYW5jZSBXU0FfQ2xlYW51cCB3aXRoIFdTQV9TdGFydHVwLgorCSAgQWxzbyBtYWtlIHRoZSBwb2xsIGNvbnRyb2xsYWJsZSBvbiB3aW5kb3dzLiBGaXhlcyAjNTIwODg4LgorCisyMDA4LTAzLTA2IDE5OjQ3OjQ4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvbWF0cm9za2EvOiBIYW5kbGUgcmV0dXJuIHZhbHVlcyBmcm9tIHB1bGxfcmFuZ2UgaW4gYSBtb3JlIGdyYW51bGFyIHdheSB0byBwcm9wZXJseSBzaHV0IGRvd24gb24gc2Vla3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOiAoZ3N0X2VibWxfcmVhZF9wZWVrX2J5dGVzKSwKKwkgIChnc3RfZWJtbF9yZWFkX3B1bGxfYnl0ZXMpLCAoZ3N0X2VibWxfcmVhZF9lbGVtZW50X2lkKSwKKwkgIChnc3RfZWJtbF9yZWFkX2VsZW1lbnRfbGVuZ3RoKSwgKGdzdF9lYm1sX3BlZWtfaWQpLAorCSAgKGdzdF9lYm1sX3JlYWRfc2tpcCksIChnc3RfZWJtbF9yZWFkX2J1ZmZlciksCisJICAoZ3N0X2VibWxfcmVhZF9ieXRlcyksIChnc3RfZWJtbF9yZWFkX3VpbnQpLCAoZ3N0X2VibWxfcmVhZF9zaW50KSwKKwkgIChnc3RfZWJtbF9yZWFkX2Zsb2F0KSwgKGdzdF9lYm1sX3JlYWRfYXNjaWkpLCAoZ3N0X2VibWxfcmVhZF91dGY4KSwKKwkgIChnc3RfZWJtbF9yZWFkX2RhdGUpLCAoZ3N0X2VibWxfcmVhZF9tYXN0ZXIpLAorCSAgKGdzdF9lYm1sX3JlYWRfYmluYXJ5KSwgKGdzdF9lYm1sX3JlYWRfaGVhZGVyKToKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfY29tYmluZV9mbG93cyksIChnc3RfbWF0cm9za2FfZGVtdXhfcmVzZXQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9yZWFkX3RyYWNrX2VuY29kaW5ncyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9zdHJlYW0pLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NlZWtfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9pbml0X3N0cmVhbSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX3RyYWNrcyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZGV4X2N1ZXRyYWNrKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfaW5kZXhfcG9pbnRlbnRyeSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZGV4KSwgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmZvKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfbWV0YWRhdGFfaWRfc2ltcGxlX3RhZyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX21ldGFkYXRhX2lkX3RhZyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX21ldGFkYXRhKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3luY19zdHJlYW1zKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcHVzaF9oZHJfYnVmKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcHVzaF9mbGFjX2NvZGVjX3ByaXZfZGF0YSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3B1c2hfeGlwaF9jb2RlY19wcml2X2RhdGEpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfd3Zwa19oZWFkZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9jaGVja19zdWJ0aXRsZV9idWZmZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfY2x1c3RlciksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NvbnRlbnRzX3NlZWtlbnRyeSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NvbnRlbnRzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcF9zdHJlYW1fcGFyc2VfaWQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9sb29wX3N0cmVhbSksIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcCk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBIYW5kbGUgcmV0dXJuIHZhbHVlcyBmcm9tIHB1bGxfcmFuZ2UgaW4gYSBtb3JlIGdyYW51bGFyIHdheSB0byBwcm9wZXJseQorCSAgc2h1dCBkb3duIG9uIHNlZWtzLgorCSAgQ29tYmluZSByZXR1cm4gdmFsdWVzIGZyb20gcHVzaC4KKwkgIEltcGxlbWVudCBwcm9wZXIgZXJyb3IgaGFuZGxpbmcuCisJICBQcmVwYXJlIGZvciBoYW5kbGluZyBzZWVraW5nIGNvcnJlY3RseS4KKworMjAwOC0wMy0wMyAyMjowMTo1NiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogVXNlIEdJTlQ2NCBmb3JtYXR0aW5nIGNvbnN0YW50cyBmcm9tIEdMSUIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOgorCSAgVXNlIEdJTlQ2NCBmb3JtYXR0aW5nIGNvbnN0YW50cyBmcm9tIEdMSUIuCisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgQWRkIHNvbWUgZ3VhcmRzIHRvIGF2b2lkIGEgcG9zc2libGUgZGl2aXNpb24gYnkgMCBhbmQgY3Jhc2hpbmcKKwkgIHdpdGggTlVMTCBldmVudHMgb24gc29tZSBzeXN0ZW1zLgorCSAgVXNlIGdzdF9nZG91YmxlX3RvX2d1aW50NjQgc29tZXdoZXJlIGluc3RlYWQgb2YgYW4gaW1wbGljaXQKKwkgIGNvbnZlcnNpb24uCisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIENoZWNrIGZvciBpbnZhbGlkIHRpbWVzdGFtcHMgaW4gYSBidW5jaCBvZiBwbGFjZXMgdG8gYXZvaWQKKwkgIHdyaXRpbmcgYm9ndXMgZHVyYXRpb25zIGludG8gdGhlIG91dHB1dCBmaWxlLgorCSAgRml4IHNvbWUgZG91YmxlPC0+Z2ludDY0IGNvbnZlcnNpb25zIHRoYXQgd2VyZW4ndCB1c2luZworCSAgZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZQorCisyMDA4LTAzLTAzIDEzOjAzOjQzICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBNb3ZlIHRoZSBjaGVja3MgZm9yIGJpc29uLCBmbGV4IGFuZCBhcyB0byB0aGUgcHJvZ3JhbSBzZWN0aW9uIGFuZCB0aGUgY2hlY2sgZm9yIGdjYyBpbmxpbmUgYXNtIHRvIHRoZSBjLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgTW92ZSB0aGUgY2hlY2tzIGZvciBiaXNvbiwgZmxleCBhbmQgYXMgdG8gdGhlIHByb2dyYW0gc2VjdGlvbiBhbmQgdGhlCisJICBjaGVjayBmb3IgZ2NjIGlubGluZSBhc20gdG8gdGhlIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcyBzZWN0aW9uLgorCisyMDA4LTAzLTAzIDEyOjEwOjU1ICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBVc2UgQUdfR1NUX0NIRUNLX1BMVUdJTiBhbmQgQUdfR1NUX0RJU0FCTEVfUExVR0lOIHRvIHNpbXBsaWZ5IHdoaWNoIHBsdWctaW5zIGFyZSBpbmNsdWRlZC9leGNsdWRlZC4gKCM0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgVXNlIEFHX0dTVF9DSEVDS19QTFVHSU4gYW5kIEFHX0dTVF9ESVNBQkxFX1BMVUdJTiB0byBzaW1wbGlmeSB3aGljaAorCSAgcGx1Zy1pbnMgYXJlIGluY2x1ZGVkL2V4Y2x1ZGVkLiAoIzQ5ODIyMikKKworMjAwOC0wMi0yOSAxMjozNToyNCArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IERvbid0IGNhbGwgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcygpIHVubGVzcyB3ZSBoYXZlIGEgdmFsaWQgdGltZXN0YW1wLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogKGdzdF92aWRlb21peGVyX2JsZW5kX2J1ZmZlcnMpOgorCSAgRG9uJ3QgY2FsbCBnc3Rfb2JqZWN0X3N5bmNfdmFsdWVzKCkgdW5sZXNzIHdlIGhhdmUgYSB2YWxpZCB0aW1lc3RhbXAuCisKKzIwMDgtMDItMjkgMDY6MTg6NTUgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBnc3QvbWF0cm9za2EvOiBGaXggRGlyYWMgbWFwcGluZy4gIEkgaGFkIHByZXZpb3VzbHkgYWRkZWQgYSBWZlctdHlwZSBtYXBwaW5nLCBidXQgaXQgbG9va3MgbGlrZSBEaXJhYyB3aWxsIGdldCBhIG5hdGkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICBGaXggRGlyYWMgbWFwcGluZy4gIEkgaGFkIHByZXZpb3VzbHkgYWRkZWQgYSBWZlctdHlwZQorCSAgbWFwcGluZywgYnV0IGl0IGxvb2tzIGxpa2UgRGlyYWMgd2lsbCBnZXQgYSBuYXRpdmUgTWF0cm9za2EKKwkgIG1hcHBpbmcsIGFuZCB0aGlzIGlzIHRoZSBtb3N0IGxpa2VseSBtZXRob2QuCisKKzIwMDgtMDItMjggMjM6NTY6MzAgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBnc3QvYXZpL2dzdGF2aW11eC5jOiBBZGQgRGlyYWMgZW5jb2RpbmcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiBBZGQgRGlyYWMgZW5jb2RpbmcKKworMjAwOC0wMi0yOCAxMTo1MToyNCArMDAwMCAgUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2pAYXhpcy5jb20+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLio6IFBvcnQgdG8gR3N0UG9sbC4gU2VlICM1MDU0MTcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBQZXRlciBLamVsbGVyc3RlZHQgPHBraiBhdCBheGlzIGNvbT4KKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfaW5pdCksIChnc3RfdWRwc3JjX2NyZWF0ZSksCisJICAoZ3N0X3VkcHNyY19nZXRfcHJvcGVydHkpLCAoZ3N0X3VkcHNyY19zdGFydCksIChnc3RfdWRwc3JjX3VubG9jayksCisJICAoZ3N0X3VkcHNyY191bmxvY2tfc3RvcCksIChnc3RfdWRwc3JjX3N0b3ApOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgUG9ydCB0byBHc3RQb2xsLiBTZWUgIzUwNTQxNy4KKworMjAwOC0wMi0yOCAwODozNzo0NCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvbGF3L211bGF3LWRlY29kZS5jOiBSZXR1cm4gR1NUX0ZMT1dfTk9UX05FR09USUFURUQgd2hlbiB0aGUgY2FwcyBhcmUgbm90IHNldCB5ZXQgb24gdGhlIHNyY3BhZC4gV2UgbmVlZCByYXRlIGFuZCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOiAoZ3N0X211bGF3ZGVjX2NoYWluKToKKwkgIFJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRCB3aGVuIHRoZSBjYXBzIGFyZSBub3Qgc2V0CisJICB5ZXQgb24gdGhlIHNyY3BhZC4gV2UgbmVlZCByYXRlIGFuZCBjaGFubmVscyBiZWZvcmUgd2UKKwkgIGNhbiBkbyBhbnkgcHJvY2Vzc2luZy4gRml4ZXMgYnVnICM1MTkwODguCisKKzIwMDgtMDItMjYgMTA6MDk6MzggKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBjb25maWd1cmUuYWM6IERldGVjdCBhbmQgaW5kaWNhdGUgaWYgR0NDIGlubGluZSBhc3NlbWJseSBzeW50YXggaXMgYXZhaWxhYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIERldGVjdCBhbmQgaW5kaWNhdGUgaWYgR0NDIGlubGluZSBhc3NlbWJseSBzeW50YXggaXMKKwkgIGF2YWlsYWJsZS4KKwkgICogZ3N0L2dvb20vTWFrZWZpbGUuYW06CisJICAqIGdzdC9nb29tL2NvbnZvbHZlX2Z4LmM6CisJICAqIGdzdC9nb29tL2ZseWluZ19zdGFyc19meC5jOgorCSAgKiBnc3QvZ29vbS9nb29tX2NvbmZpZy5oOgorCSAgKiBnc3QvZ29vbS9nb29tX2NvcmUuYzoKKwkgICogZ3N0L2dvb20vZ29vbXNsLmM6CisJICAqIGdzdC9nb29tL2lmcy5jOgorCSAgKiBnc3QvZ29vbS9tbXguYzoKKwkgICogZ3N0L2dvb20vcGx1Z2luX2luZm8uYzoKKwkgICogZ3N0L2dvb20veG1teC5jOgorCSAgRml4IHZhcmlvdXMgR0NDLWlzbXMsIGFuZCBvbmx5IGJ1aWxkIHRoZSBpbmxpbmUgYXNzZW1ibHkKKwkgIHdpdGggY29tcGlsZXJzIHRoYXQgc3VwcG9ydCBHQ0MgaW5saW5lIGFzc2VtYmx5LgorCSAgRml4IGEgY291cGxlIG9mIG90aGVyIHdhcm5pbmdzIHNob3duIHdpdGggRm9ydGUuCisKKzIwMDgtMDItMjYgMDU6MzY6MTcgKzAwMDAgIFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisKKwkgIEFkZCBzdXBwb3J0IGZvciBzcGVjaWZ5aW5nIGEgbGlzdCBvZiBjb29raWVzIHRvIGJlIHBhc3NlZCBpbiB0aGUgSFRUUCByZXF1ZXN0LiBGaXhlcyBidWcgIzUxODcyMi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFdvdXRlciBDbG9ldGVucyA8d291dGVyIGF0IG1pbmQgZG90IGJlPgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOiAoZ3N0X3NvdXBfaHR0cF9zcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfaW5pdCksIChnc3Rfc291cF9odHRwX3NyY19kaXNwb3NlKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19jcmVhdGUpOgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9zb3VwaHR0cHNyYy5jOiAocnVuX3Rlc3QpLCAoR1NUX1NUQVJUX1RFU1QpLAorCSAgKHNvdXBodHRwc3JjX3N1aXRlKToKKwkgIEFkZCBzdXBwb3J0IGZvciBzcGVjaWZ5aW5nIGEgbGlzdCBvZiBjb29raWVzIHRvIGJlIHBhc3NlZCBpbgorCSAgdGhlIEhUVFAgcmVxdWVzdC4gRml4ZXMgYnVnICM1MTg3MjIuCisKKzIwMDgtMDItMjUgMTI6MDM6NDYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2dvb20veG1teC5jOiBVc2UgJ2VtbXMnIGluc3RlYWQgb2YgJ2ZlbW1zJyB0byBub3QgY3Jhc2ggb24gY3B1cyB0aGF0IGRvIG5vdCBpbXBsZW1lbnQgdGhpcyAzZG5vdyBzcGVjaWZpYyBpbnN0cnVjLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20veG1teC5jOgorCSAgVXNlICdlbW1zJyBpbnN0ZWFkIG9mICdmZW1tcycgdG8gbm90IGNyYXNoIG9uIGNwdXMgdGhhdCBkbyBub3QKKwkgIGltcGxlbWVudCB0aGlzIDNkbm93IHNwZWNpZmljIGluc3RydWN0aW9uLgorCisyMDA4LTAyLTI1IDEwOjMyOjM1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9nb29tL3BsdWdpbl9pbmZvLmM6IFVzZSBleHRlbmRlZCBNTVggZm9yIGRyYXdfbGluZSgpIHRvbyBpZiBhdmFpbGFibGUsIG5vdCBvbmx5IG5vcm1hbCBNTVguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vcGx1Z2luX2luZm8uYzogKHNldE9wdGltaXplZE1ldGhvZHMpOgorCSAgVXNlIGV4dGVuZGVkIE1NWCBmb3IgZHJhd19saW5lKCkgdG9vIGlmIGF2YWlsYWJsZSwgbm90IG9ubHkKKwkgIG5vcm1hbCBNTVguCisKKzIwMDgtMDItMjUgMDY6NTA6MzEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2pwZWcvZ3N0anBlZy5jOiBSZW1vdmUgKGNvbW1lbnRlZCBvdXQpIHNtb2tlIHR5cGVmaW5kZXIuIFRoaXMgaXMgaW4gYmFzZSBub3cuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2pwZWcvZ3N0anBlZy5jOiAocGx1Z2luX2luaXQpOgorCSAgUmVtb3ZlIChjb21tZW50ZWQgb3V0KSBzbW9rZSB0eXBlZmluZGVyLiBUaGlzIGlzIGluIGJhc2Ugbm93LgorCisyMDA4LTAyLTIzIDE1OjAyOjE1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2dvb20yazEvOiBSZW5hbWUgdGhlIGluc3RhbGxlZCBsaWJyYXJ5LCBhbmQgZG9uJ3QgcmVnaXN0ZXIgdGhlIHNhbWUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbTJrMS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2dvb20yazEvZ3N0Z29vbS5jOgorCSAgUmVuYW1lIHRoZSBpbnN0YWxsZWQgbGlicmFyeSwgYW5kIGRvbid0IHJlZ2lzdGVyIHRoZSBzYW1lCisJICBHVHlwZSBuYW1lIGFzIHRoZSBuZXcgZ29vbS4KKworMjAwOC0wMi0yMyAxMjoyMzozOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgQ2hlY2sgZm9yIGFuZCBkZWZpbmUgRVJST1JfQ1hYRkxBR1MgYW5kIHVzZSB0aGVtIHdoZW4gYnVpbGRpbmcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGV4dC90YWdsaWIvTWFrZWZpbGUuYW06CisJICBDaGVjayBmb3IgYW5kIGRlZmluZSBFUlJPUl9DWFhGTEFHUyBhbmQgdXNlIHRoZW0gd2hlbiBidWlsZGluZworCSAgQysrIGNvZGUgKCM1MTY1MDkpLgorCisyMDA4LTAyLTIzIDEyOjEwOjE2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvZ29vbS86IENhbGwgb2lsX2luaXQoKSwgb3RoZXJ3aXNlIG9pbF9nZXRfY3B1X2ZsYWdzKCkgd29uJ3QgcmV0dXJuIGFueXRoaW5nIHVzZWZ1bC4gRXhwb3J0IGdvb20gZGVidWcgY2F0ZWdvcnkgc28uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnb29tX2RlYnVnKSwgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2dvb20vcGx1Z2luX2luZm8uYzogKGdvb21fZGVidWcpLCAoR1NUX0NBVF9ERUZBVUxUKSwKKwkgIChzZXRPcHRpbWl6ZWRNZXRob2RzKToKKwkgIENhbGwgb2lsX2luaXQoKSwgb3RoZXJ3aXNlIG9pbF9nZXRfY3B1X2ZsYWdzKCkgd29uJ3QgcmV0dXJuCisJICBhbnl0aGluZyB1c2VmdWwuIEV4cG9ydCBnb29tIGRlYnVnIGNhdGVnb3J5IHNvIHdlIGNhbiBnZXQKKwkgIHJpZCBvZiB0aGUgVkVSQk9TRSBkZWZpbmUgYW5kIHRoZSBwcmludGZzLgorCisyMDA4LTAyLTIzIDExOjUzOjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvZ29vbS86IENvbXBpbGUgZml4ZXMgZm9yIHg4Ni02NC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS9nb29tc2xfaGVhcC5jOiAoYWxpZ25faXQpOgorCSAgKiBnc3QvZ29vbS9wbHVnaW5faW5mby5jOiAoc2V0T3B0aW1pemVkTWV0aG9kcyk6CisJICBDb21waWxlIGZpeGVzIGZvciB4ODYtNjQuCisKKzIwMDgtMDItMjMgMDM6MTA6NTUgKzAwMDAgIEJhc3RpZW4gTm9jZXJhIDxoYWRlc3NAaGFkZXNzLm5ldD4KKworCSAgZ3N0L2dvb20vTWFrZWZpbGUuYW06IERvbid0IGNvbXBpbGUgbGV4IG9yIHlhY2Mgb3V0cHV0cyB3aXRoIHdhcm5pbmdzLCBidXQgYWRkIG90aGVyIENGTEFHUworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9nb29tL01ha2VmaWxlLmFtOiBEb24ndCBjb21waWxlIGxleCBvciB5YWNjIG91dHB1dHMKKwkgIHdpdGggd2FybmluZ3MsIGJ1dCBhZGQgb3RoZXIgQ0ZMQUdTCisJICAqIGdzdC9nb29tL2dvb21zbC5jIChnc2xfaW5zdHJfc2V0X25hbWVzcGFjZSksCisJICAoZ3NsX2luc3RyX2FkZF9wYXJhbSksIChpZmxvd19leGVjdXRlKSwgKGdzbF9lbnRlcm5hbWVzcGFjZSksCisJICAoY2FsY3VsYXRlX2xhYmVscyksIChnc2xfcmVhZF9maWxlKToKKwkgICogZ3N0L2dvb20vZ29vbXNsX2xleC5sOgorCSAgKiBnc3QvZ29vbS9nb29tc2xfeWFjYy55OgorCSAgKiBnc3QvZ29vbS9wbHVnaW5faW5mby5jOiBSZW1vdmUgYSBmZXcgbGl2ZSBwcmludGYsIGFuZAorCSAgZnByaW50ZiwgcmVwbGFjZSBleGl0KCkgY2FsbHMgd2l0aCBnX2Fzc2VydF9ub3RfcmVhY2hlZCgpCisJICBpZiBpdCBub3Qgb3B0aW1hbCBmb3IgYSBsaWJyYXJ5CisKKzIwMDgtMDItMjMgMDI6Mzg6MDMgKzAwMDAgIEJhc3RpZW4gTm9jZXJhIDxoYWRlc3NAaGFkZXNzLm5ldD4KKworCSAgZ3N0L2dvb20vTWFrZWZpbGUuYW06IFJlbW92ZSB0aGUgd2FybmluZ3MgYmVpbmcgZGlzYWJsZWQsIGZpeCBsaW5rYWdlIG9uIHg4Niwgc3BvdHRlZCBieSBTZWJhc3RpYW4gRHLDtmdlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vTWFrZWZpbGUuYW06IFJlbW92ZSB0aGUgd2FybmluZ3MgYmVpbmcgZGlzYWJsZWQsCisJICBmaXggbGlua2FnZSBvbiB4ODYsIHNwb3R0ZWQgYnkgU2ViYXN0aWFuIERyw7ZnZQorCSAgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKwkgICogZ3N0L2dvb20vY29udm9sdmVfZnguYyAoY29udm9sdmVfaW5pdCksCisJICAoY3JlYXRlX291dHB1dF93aXRoX2JyaWdodG5lc3MpLCAoY29udm9sdmVfYXBwbHkpOgorCSAgKiBnc3QvZ29vbS9maWx0ZXJzLmMgKHpvb21GaWx0ZXJWaXN1YWxGWFdyYXBwZXJfY3JlYXRlKToKKwkgICogZ3N0L2dvb20vZ29vbXNsLmM6CisJICAqIGdzdC9nb29tL2lmcy5jIChpZnNfdXBkYXRlKSwgKGlmc192aXN1YWxmeF9jcmVhdGUpOgorCSAgKiBnc3QvZ29vbS9wbHVnaW5faW5mby5jOgorCSAgKiBnc3QvZ29vbS90ZW50YWNsZTNkLmMgKHRlbnRhY2xlX2Z4X2NyZWF0ZSk6CisJICBGaXggd2FybmluZ3MsIGFuZCBkaXNhYmxlIHRoZSBtb3RpZnMgaW4gdGhlIGNvbnZvbHZlX2Z4CisJICBwbHVnaW4gKHRoZXkgd2VyZSBjYXVzaW5nIHdhcm5pbmdzLCBhbmQgdGhleSB3ZXJlIGp1c3QKKwkgICJHb29tIiBpbiBmdW5ueSBsZXR0ZXJyaW5nKQorCisyMDA4LTAyLTIzIDAxOjUxOjM3ICswMDAwICBCYXN0aWVuIE5vY2VyYSA8aGFkZXNzQGhhZGVzcy5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogQWRkIGNoZWNrcyBmb3IgRmxleC9ZYWNjL0Jpc29uIGFuZCBvdGhlciBmdXJyeSBhbmltYWxzLCBmb3IgdGhlIG5ldyBnb29tIDJrNCBiYXNlZCBwbHVnaW4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwOC0wMi0yMyAgQmFzdGllbiBOb2NlcmEgIDxoYWRlc3NAaGFkZXNzLm5ldD4KKwkgICogY29uZmlndXJlLmFjOiBBZGQgY2hlY2tzIGZvciBGbGV4L1lhY2MvQmlzb24gYW5kIG90aGVyCisJICBmdXJyeSBhbmltYWxzLCBmb3IgdGhlIG5ldyBnb29tIDJrNCBiYXNlZCBwbHVnaW4KKwkgICogZ3N0L2dvb20vKjogVXBkYXRlIHRvIHVzZSBnb29tIDJrNCwgdXNlcyBsaWJvaWwgdG8gZGV0ZWN0CisJICBDUFUgb3B0aW1pc2F0aW9ucyAobm90IHdvcmtpbmcgeWV0KSwgbW92ZSB0aGUgb2xkIHBsdWdpbiB0by4uLgorCSAgKiBnc3QvZ29vbTJrMS8qOiAuLi4gaGVyZSwgaW4gY2FzZSBzb21lYm9keSBpcyBzaWNrIGVub3VnaAorCSAgRml4ZXMgIzUxNTA3MworCisyMDA4LTAyLTIyIDA5OjU2OjAzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IFBvc3QgdGhlIHNlcnZlciByZXNwb25zZSBjb2RlIGluIGFuIGVycm9yIG1lc3NhZ2UgaW5zdGVhZCBvZiBhIGdlbmVyaWMgJ2Vycm9yJyBtZXNzYWdlLiBGaXhlcyAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zZXR1cF9zdHJlYW1zKToKKwkgIFBvc3QgdGhlIHNlcnZlciByZXNwb25zZSBjb2RlIGluIGFuIGVycm9yIG1lc3NhZ2UgaW5zdGVhZCBvZiBhIGdlbmVyaWMKKwkgICdlcnJvcicgbWVzc2FnZS4gRml4ZXMgIzUxNzIzNy4KKworMjAwOC0wMi0yMiAwNzoyMDowMyArMDAwMCAgV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKworCSAgSW1wbGVtZW50IHplcm8tY29weSBhbmQgbWFrZSB0aGUgYnVmZmVyIHNpemUgY29uZmlndXJhYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogV291dGVyIENsb2V0ZW5zIDx3b3V0ZXIgYXQgbWluZCBkb3QgYmU+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKGdzdF9zb3VwX2h0dHBfc3JjX2NhbmNlbF9tZXNzYWdlKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19maW5pc2hlZF9jYiksIChnc3Rfc291cF9odHRwX3NyY19jaHVua19mcmVlKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19jaHVua19hbGxvY2F0b3IpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX2dvdF9jaHVua19jYiksIChnc3Rfc291cF9odHRwX3NyY19jcmVhdGUpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3N0YXJ0KSwgKGdzdF9zb3VwX2h0dHBfc3JjX3NldF9wcm94eSk6CisJICAqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmg6CisJICBJbXBsZW1lbnQgemVyby1jb3B5IGFuZCBtYWtlIHRoZSBidWZmZXIgc2l6ZSBjb25maWd1cmFibGUuCisJICBQcmVmaXggcHJveHkgVVJJcyB3aXRoICJodHRwOi8vIiBpZiB0aGV5IGRvbid0IHN0YXJ0IHdpdGggaXQKKwkgIGFscmVhZHkgYW5kIGNhdGNoIGVycm9ycyBlYXJsaWVyLCBmaXhlcyBoYW5naW5nIGluIHNvbWUgc2l0dWF0aW9ucy4KKwkgIEZpeGVzIGJ1ZyAjNTE0OTQ4LgorCisyMDA4LTAyLTIyIDA2OjIyOjM5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOiBJZ25vcmUgZ2NvbmZhdWRpb3NyYyBmb3IgdGhlIHN0YXRlcyB1bml0IHRlc3QgdG9vLiBJdCB3aWxsIGZhbGxiYWNrIHRvIGFsc2FzcmMgaWYgdGhlIGdjb25mIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgSWdub3JlIGdjb25mYXVkaW9zcmMgZm9yIHRoZSBzdGF0ZXMgdW5pdCB0ZXN0IHRvby4gSXQgd2lsbCBmYWxsYmFjaworCSAgdG8gYWxzYXNyYyBpZiB0aGUgZ2NvbmYgc2V0dGluZ3MgY2FuJ3QgYmUgcmVhZCBhbmQgbm90IGV2ZXJ5Ym9keSBoYXMKKwkgIGFsc2EuCisKKzIwMDgtMDItMjIgMDY6MDY6MDYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLio6IEFsd2F5cyByZXBvcnQgdGhlIGR1cmF0aW9uIGlmIHdlIGtub3cgaXQgaW4gcHVzaCBtb2RlIGFuZCBkb24ndCByZXR1cm4gMCBqdXN0IHRvIG1ha2UgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9zcmNfcXVlcnkpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2NyZWF0ZV9zcmNfcGFkKToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmg6CisJICBBbHdheXMgcmVwb3J0IHRoZSBkdXJhdGlvbiBpZiB3ZSBrbm93IGl0IGluIHB1c2ggbW9kZSBhbmQgZG9uJ3QKKwkgIHJldHVybiAwIGp1c3QgdG8gbWFrZSB0b3RlbSBiZWxpZXZlIHdlIGNhbid0IHNlZWsgaW4gcHVzaCBtb2RlLgorCSAgTmV3ZXIgdG90ZW0gdmVyc2lvbiB1c2UgdGhlIFNFRUtJTkcgcXVlcnkgd2hpY2ggcHJvcGVybHkgcmVwb3J0cworCSAgaWYgd2UgY2FuIHNlZWsgb3Igbm90LgorCisyMDA4LTAyLTIyIDA1OjM5OjAxICswMDAwICBKZW5zIEdyYW5zZXVlciA8amVuc2dyQGdteC5uZXQ+CisKKwkgIHRlc3RzL2V4YW1wbGVzL2VxdWFsaXplci9kZW1vLmM6IEM4OSBmaXgsIG1vdmluZyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2suIEZpeGVzIGJ1ZyAjNTE3OTMzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSmVucyBHcmFuc2V1ZXIgPGplbnNnciBhdCBnbXggZG90IG5ldD4KKwkgICogdGVzdHMvZXhhbXBsZXMvZXF1YWxpemVyL2RlbW8uYzogKG1haW4pOgorCSAgQzg5IGZpeCwgbW92aW5nIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyB0byB0aGUgYmVnaW5uaW5nIG9mCisJICB0aGUgYmxvY2suIEZpeGVzIGJ1ZyAjNTE3OTMzLgorCisyMDA4LTAyLTIxIDIzOjQ3OjM3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBCYWNrIHRvIGRldmVsb3BtZW50Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBkZXZlbG9wbWVudC4uLgorCis9PT0gcmVsZWFzZSAwLjEwLjcgPT09CisKKzIwMDgtMDItMjEgMDA6MDk6MDcgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5wcmVyZXF1aXNpdGVzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nYW1tYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSogcG8vTElOR1VBUzoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMC4xMC43IC0gUmVkIERvb3IgQmxhY2sKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmVsZWFzZSAwLjEwLjcgLSBSZWQgRG9vciBCbGFjaworCisyMDA4LTAyLTIwIDIyOjUxOjA4ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2JnLnBvOgorCSogcG8vY2EucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2RhLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9lcy5wbzoKKwkqIHBvL2V1LnBvOgorCSogcG8vZmkucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vamEucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9wbC5wbzoKKwkqIHBvL3NrLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkqIHBvL3poX0NOLnBvOgorCSogcG8vemhfSEsucG86CisJKiBwby96aF9UVy5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA4LTAyLTE5IDEwOjQ3OjIwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9hbHBoYS9NYWtlZmlsZS5hbTogTGluayBhbHBoYSBwbHVnaW4gd2l0aCBsaWJnc3RiYXNlLiBGaXhlcyBidWcgIzUxNzM4Ni4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYWxwaGEvTWFrZWZpbGUuYW06CisJICBMaW5rIGFscGhhIHBsdWdpbiB3aXRoIGxpYmdzdGJhc2UuIEZpeGVzIGJ1ZyAjNTE3Mzg2LgorCisyMDA4LTAyLTE4IDExOjEzOjM1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IEluaXQgdmFsdWVzIHRvIC0xIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgMCB2YWx1ZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19jcmVhdGVfc3RyZWFtKToKKwkgIEluaXQgdmFsdWVzIHRvIC0xIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgMCB2YWx1ZS4KKwkgIEZpeGVzICM1MTY1MjQuCisKKzIwMDgtMDItMTQgMTQ6NTA6MzAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vc3BlY3RydW0tZXhhbXBsZS5jOiBBZGQgbWlzc2luZyBpbmNsdWRlIHRvIGZpeCBjb21waWxhdGlvbiB3aGVuIGxpYnhtbCB1c2FnZSBpcyBkaXNhYmxlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9zcGVjdHJ1bS1leGFtcGxlLmM6CisJICBBZGQgbWlzc2luZyBpbmNsdWRlIHRvIGZpeCBjb21waWxhdGlvbiB3aGVuIGxpYnhtbCB1c2FnZSBpcyBkaXNhYmxlZC4KKwkgIEZpeGVzOiAjNTE2MzcxCisKKzIwMDgtMDItMTIgMjM6Mzg6MTkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisKKwkgIGZpeGVzOiAjNTE0ODg5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHBhdGNoIGJ5OiAgV2ltIFRheW1hbnMgIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisJICBmaXhlczogIzUxNDg4OQorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOgorCSAgRml4IHZhcmlvdXMgbGVha3Mgc2hvd24gdXAgaW4gdmFsZ3JpbmQKKwkgIC0gZnJlZSBzcHJvcHMgYW5kIGJ1ZmZlciBpbiBlcnJvciBjYXNlcyBpbiBIMjY0IHBheWxvYWRlcgorCSAgLSBmaXggbGVhayBpbiBtcDRnIGRlcGF5bG9hZGVyIHdoZW4gY29uc3RydWN0aW9uIHRoZSBjYXBzCisJICAtIGRvbid0IGxlYWsgY29uZmlnIHN0cmluZyBpbiB0aGUgbXA0ZyBwYXlsb2FkZXIKKwkgIC0gZG9uJ3QgbGVhayBidWZmZXJzIGFuZCBoZWFkZXJzIGluIHRoZW9yYSBhbmQgdm9yYmlzIHBheWxvYWRlcnMKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIEZpeCB0aGUgUlRQIGRhdGEgdGVzdAorCSAgLSBBY3R1YWxseSBzZW5kIHZhbGlkIGFtciBkYXRhIHRvIHRoZSBwYXlsb2FkZXIgaW5zdGVhZCBvZiAyMAorCSAgemVyby1ieXRlcworCSAgLSBUaGUgbXA0ZyBwYXlsb2FkZXIgZXhwZWN0cyBjb2RlY19kYXRhIG9uIHRoZSBjYXBzCisKKzIwMDgtMDItMTIgMjE6MzY6NDAgKzAwMDAgIFPDqWJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4KKworCSAgd2luMzIvTUFOSUZFU1Q6IEFkZCBsaWJnc3RwbmcuZHNwIHRvIE1BTklGRVNULgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHdpbjMyL01BTklGRVNUOgorCSAgQWRkIGxpYmdzdHBuZy5kc3AgdG8gTUFOSUZFU1QuCisJICAqIHdpbjMyL3ZzNi9saWJnc3RhdWRpb2Z4LmRzcDoKKwkgIEFkZCBuZXcgc291cmNlIGZpbGVzIHRvIFZTIHByb2plY3QgZmlsZS4KKworMjAwOC0wMi0xMiAxMzozNDo1MiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6IEluaXRpYWxpc2UgdmFyaWFibGVzIHdoZW4gb3BlbmluZyB0aGUgWCBkaXNwbGF5IHJhdGhlciB0aGFuIGluIF9zdGFydCgpLCBhcyB0aGUgZGlzcGxheSBjYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICBJbml0aWFsaXNlIHZhcmlhYmxlcyB3aGVuIG9wZW5pbmcgdGhlIFggZGlzcGxheSByYXRoZXIKKwkgIHRoYW4gaW4gX3N0YXJ0KCksIGFzIHRoZSBkaXNwbGF5IGNhbiBiZSBvcGVuZWQgYmVmb3JlIHRoYXQuCisJICBGaXhlczogIzUxNTk4NQorCisyMDA4LTAyLTEyIDEyOjIyOjQ4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6IFByb3Blcmx5IGNoYWluIHVwIGZpbmFsaXplIGZ1bmN0aW9ucy4gRml4ZXMgYnVnICM1MTU5ODAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkgIChnc3RfZGRyYXdzdXJmYWNlX2NsYXNzX2luaXQpLCAoZ3N0X2RkcmF3c3VyZmFjZV9maW5hbGl6ZSksCisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua19maW5hbGl6ZSk6CisJICBQcm9wZXJseSBjaGFpbiB1cCBmaW5hbGl6ZSBmdW5jdGlvbnMuIEZpeGVzIGJ1ZyAjNTE1OTgwLgorCisyMDA4LTAyLTEyIDExOjM4OjU0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogQ2hhaW4gdXAgdGhlIGZpbmFsaXplIGZ1bmN0aW9ucy4gRml4ZXMgYnVnICM1MTU5ODQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJfYnVmZmVyX2ZpbmFsaXplKSwKKwkgIChnc3RfdjRsMl9idWZmZXJfY2xhc3NfaW5pdCksIChnc3RfdjRsMl9idWZmZXJfcG9vbF9maW5hbGl6ZSksCisJICAoZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfY2xhc3NfaW5pdCk6CisJICBDaGFpbiB1cCB0aGUgZmluYWxpemUgZnVuY3Rpb25zLiBGaXhlcyBidWcgIzUxNTk4NC4KKworMjAwOC0wMi0xMiAxMToxNDozNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzogQ2hhaW4gdXAgaW4gdGhlIGZpbmFsaXplIGZ1bmN0aW9uIGZvciBvdXIgY3VzdG9tIGJ1ZmZlciBzdWItY2xhc3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6CisJICBDaGFpbiB1cCBpbiB0aGUgZmluYWxpemUgZnVuY3Rpb24gZm9yIG91ciBjdXN0b20KKwkgIGJ1ZmZlciBzdWItY2xhc3MuCisJICBQYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSAgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKwkgIEZpeGVzOiAjNTE1NzA2CisKKzIwMDgtMDItMTIgMTE6MTI6NDMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2RlYnVnL2VmZW5jZS5jOiBQcm9wZXJseSBjaGFpbiB1cCBmaW5hbGl6ZSBtZXRob2QuIEZpeGVzIGJ1ZyAjNTE1OTc5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWJ1Zy9lZmVuY2UuYzogKGdzdF9mZW5jZWRfYnVmZmVyX2ZpbmFsaXplKSwKKwkgIChnc3RfZmVuY2VkX2J1ZmZlcl9jbGFzc19pbml0KToKKwkgIFByb3Blcmx5IGNoYWluIHVwIGZpbmFsaXplIG1ldGhvZC4gRml4ZXMgYnVnICM1MTU5NzkuCisKKzIwMDgtMDItMTIgMTE6MDk6MDggKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiBGcmVlIGFsbG9jYXRlZCBEYW1hZ2UgbWVtb3J5IGJlZm9yZSBjbG9zaW5nIG91ciBjb25uZWN0aW9uIHRvIHRoZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICBGcmVlIGFsbG9jYXRlZCBEYW1hZ2UgbWVtb3J5IGJlZm9yZSBjbG9zaW5nIG91ciBjb25uZWN0aW9uIHRvIHRoZQorCSAgWCBzZXJ2ZXIuIEZpeGVzOiAjNTE1NzA2CisKKzIwMDgtMDItMTIgMDU6MjE6NDYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzogSW5jbHVkZSBnbGliL2dwcmludGYuaCBmb3IgZ192YXNwcmludGYoKS4gRml4ZXMgYnVnICM1MTU1NjQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYzoKKwkgIEluY2x1ZGUgZ2xpYi9ncHJpbnRmLmggZm9yIGdfdmFzcHJpbnRmKCkuIEZpeGVzIGJ1ZyAjNTE1NTY0LgorCisyMDA4LTAyLTEyIDA1OjE0OjE2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIEFkZCBhIGZldyBsaWJqcGVnIHN1cHByZXNzaW9ucyBhbmQgaW5pdGlhbGl6ZSBhIHZhcmlhYmxlIHRvIG1ha2Ugc21va2VlbmMgdmFsZ3JpbmQgY2xlYW4uIEZpeGVzIGJ1ZyAjNTE1NzAxLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6IChnc3Rfc21va2VlbmNfY2hhaW4pOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZ3N0LXBsdWdpbnMtZ29vZC5zdXBwOgorCSAgQWRkIGEgZmV3IGxpYmpwZWcgc3VwcHJlc3Npb25zIGFuZCBpbml0aWFsaXplIGEgdmFyaWFibGUgdG8KKwkgIG1ha2Ugc21va2VlbmMgdmFsZ3JpbmQgY2xlYW4uIEZpeGVzIGJ1ZyAjNTE1NzAxLgorCisyMDA4LTAyLTExIDIxOjI0OjMwICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBSZXZlcnQgcGF0Y2ggd2hpY2ggc2VuZHMgdGltZXN0YW1wcyBvbmx5IG9uIGtleWZyYW1lcywgYXMgaXQgYnJlYWtzIHBsYXliYWNrIHdpdGggY3VycmVudCBnc3QtLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgUmV2ZXJ0IHBhdGNoIHdoaWNoIHNlbmRzIHRpbWVzdGFtcHMgb25seSBvbiBrZXlmcmFtZXMsIGFzIGl0CisJICBicmVha3MgcGxheWJhY2sgd2l0aCBjdXJyZW50IGdzdC1mZm1wZWcuCisJICBGaXhlczogIzUxNTU2MgorCisyMDA4LTAyLTExIDE0OjAxOjUyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIENsb3NlIHNvbWUgbWVtb3J5IGxlYWtzIHNwb3R0ZWQgYnkgdGhlIHVuaXQgdGVzdC4gRml4ZXMgYnVnICM1MTU2OTcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzogKGdzdF9tdWx0aV9maWxlX3NyY19jcmVhdGUpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWx0aWZpbGUuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIENsb3NlIHNvbWUgbWVtb3J5IGxlYWtzIHNwb3R0ZWQgYnkgdGhlIHVuaXQgdGVzdC4gRml4ZXMgYnVnICM1MTU2OTcuCisKKzIwMDgtMDItMTEgMTM6NDg6MDMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2djb25mL2djb25mLmM6IFVzZSBhbmQgdW5zZXQgdGhlIEdFcnJvciB3aGVuIHBpcGVsaW5lIGNyZWF0aW9uIGZhaWxzIGluc3RlYWQgb2Ygc2ltcGx5IGxlYWtpbmcgaXQuIEZpeGVzIGJ1ZyAjNTE1Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2djb25mL2djb25mLmM6IChnc3RfZ2NvbmZfcmVuZGVyX2Jpbl93aXRoX2RlZmF1bHQpOgorCSAgVXNlIGFuZCB1bnNldCB0aGUgR0Vycm9yIHdoZW4gcGlwZWxpbmUgY3JlYXRpb24gZmFpbHMgaW5zdGVhZCBvZgorCSAgc2ltcGx5IGxlYWtpbmcgaXQuIEZpeGVzIGJ1ZyAjNTE1NzA0LgorCisyMDA4LTAyLTEwIDEwOjQ2OjEzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9hdWRpb2Z4LzogRml4IGxvbmcgZGVzY3JpcHRpb24gb2YgYXVkaW9meCBlbGVtZW50cy4gRml4ZXMgYnVnICM1MTU0NTcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5LmM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmJhbmQuYzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0LmM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmM6CisJICBGaXggbG9uZyBkZXNjcmlwdGlvbiBvZiBhdWRpb2Z4IGVsZW1lbnRzLiBGaXhlcyBidWcgIzUxNTQ1Ny4KKworMjAwOC0wMi0wOSAwMTo0NTozMiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIEFkZCBhIHNpbXBsZSBleGFtcGxlIGFwcGxpY2F0aW9uIGZvciB0aGUgc3BlY3RydW0gZWxlbWVudCwgaW5jbHVkZSBpdCBpbiB0aGUgZG9jcywgYW5kIGZpeCBzb21lIGRvY3VtZW50YXRpb24gYW1iaWd1aS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICAqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtLy5jdnNpZ25vcmU6CisJICAqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9zcGVjdHJ1bS1leGFtcGxlLmM6CisJICBBZGQgYSBzaW1wbGUgZXhhbXBsZSBhcHBsaWNhdGlvbiBmb3IgdGhlIHNwZWN0cnVtIGVsZW1lbnQsIGluY2x1ZGUgaXQKKwkgIGluIHRoZSBkb2NzLCBhbmQgZml4IHNvbWUgZG9jdW1lbnRhdGlvbiBhbWJpZ3VpdGllcy4KKwkgIEZpeGVzOiAjMzQ4MDg1CisKKzIwMDgtMDItMDkgMDA6MTU6MjUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvOiBGaXggaW5jbHVkZXMgb3JkZXIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3Qvc3BlY3RydW0vTWFrZWZpbGUuYW06CisJICBGaXggaW5jbHVkZXMgb3JkZXIKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBFeGNsdWRlIHY0bDJzcmMgZnJvbSB0aGUgc3RhdGVzIHRlc3QgLSBpdCB0YWtlcyB0b28gbG9uZyB0byBzdGFydC4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvc3BlY3RydW0uYzoKKwkgIE1ha2UgdGhlIHRlc3QgcnVuIHByb3Blcmx5IHdpdGggQ0tfRk9SSz1ubworCisyMDA4LTAyLTA4IDE1OjMyOjM2ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIGFkZCAzIG5ldyBwbHVnaW5zIHRvIHNwZWMgZmlsZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgMyBuZXcgcGx1Z2lucyB0byBzcGVjIGZpbGUKKworMjAwOC0wMi0wOCAxNToyNzo1MSArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvYXVkaW9meC9NYWtlZmlsZS5hbToKKwkgIGFkZCBtaXNzaW5nIGhlYWRlciBmaWxlcyBmb3IgZGlzdGluZworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgbWlzc2luZyBoZWFkZXIgZmlsZXMgZm9yIGRpc3RpbmcKKworMjAwOC0wMi0wOCAxNToyMDozMSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBGbGFnIGtleWZyYW1lIGFuZCBkZWx0YSB1bml0cyBjb3JyZWN0bHkgd2hlbiBkZWFsaWduIHdpdGggYQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA4LTAyLTA4ICBKdWxpZW4gTW91dHRlICA8anVsaWVuQGZsdWVuZG8uY29tPgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayk6IEZsYWcKKwkgIGtleWZyYW1lIGFuZCBkZWx0YSB1bml0cyBjb3JyZWN0bHkgd2hlbiBkZWFsaWduIHdpdGggYQorCSAgQmxvY2tHcm91cC4KKwkgIEZpeGVzOiAjNTE0Mzk3CisKKzIwMDgtMDItMDggMTA6MTk6MzMgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOiBTcGVsbCB0aGUgbmV3IHRlc3RzIGNvcnJlY3RseSBpbiAuY3ZzaWdub3JlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgIFNwZWxsIHRoZSBuZXcgdGVzdHMgY29ycmVjdGx5IGluIC5jdnNpZ25vcmUKKworMjAwOC0wMi0wOCAxMDowOTozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzogTmVlZCB0byB1c2UgZ3NpemUgaGVyZSBmb3IgdGhlIHNpemUsIGZpeGVzIGNvbXBpbGVyIHdhcm5pbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzogKGdzdF9tdWx0aV9maWxlX3NyY19jcmVhdGUpOgorCSAgTmVlZCB0byB1c2UgZ3NpemUgaGVyZSBmb3IgdGhlIHNpemUsIGZpeGVzIGNvbXBpbGVyIHdhcm5pbmcuCisJICAqIHRlc3RzL2V4YW1wbGVzL2VxdWFsaXplci8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtLy5jdnNpZ25vcmU6CisJICAqIHRlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL01ha2VmaWxlLmFtOgorCSAgQWRkIG1pc3NpbmcgZmlsZXMgdG8gZml4IHRoZSBidWlsZC4KKworMjAwOC0wMi0wOCAwNDoyNTozMiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIE1vdmUgbXVsdGlmaWxlIHBsdWdpbiBmcm9tIC1iYWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWw6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgTW92ZSBtdWx0aWZpbGUgcGx1Z2luIGZyb20gLWJhZC4KKwkgIEZpeGVzOiAjNDkwMjgzCisKKzIwMDgtMDItMDggMDM6NDQ6MTIgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBnc3QvbXVsdGlmaWxlLzogVXNlIGdfZmlsZV9bc2ddZXRfY29udGVudHMoKSBpbnN0ZWFkIG9mIHVzaW5nIHN0ZGlvIGZ1bmN0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgICogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkgIFVzZSBnX2ZpbGVfW3NnXWV0X2NvbnRlbnRzKCkgaW5zdGVhZCBvZiB1c2luZyBzdGRpbyBmdW5jdGlvbnMuCisJICBTaG91bGQgYmUgbGVzcyBlcnJvciBwcm9uZS4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsdGlmaWxlLmM6CisJICBDcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHVzaW5nIHN0YW5kYXJkIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mCisJICBjcmVhdGluZyBhIGRpcmVjdG9yeSBpbiB0aGUgY3VycmVudCBkaXIuCisKKzIwMDgtMDItMDggMDM6Mjg6NTcgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBNb3ZlIHNwZWN0cnVtIHBsdWdpbiBmcm9tIC1iYWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkgICogZ3N0L3NwZWN0cnVtL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgICogdGVzdHMvZXhhbXBsZXMvTWFrZWZpbGUuYW06CisJICBNb3ZlIHNwZWN0cnVtIHBsdWdpbiBmcm9tIC1iYWQuCisJICBNb3ZlIGV4YW1wbGVzIGludG8gdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0uCisKKzIwMDgtMDItMDggMDI6NTY6MTIgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJICBNZW50aW9uIGJ1ZyA0MTU2MjcgZml4ZWQgd2l0aCBwcmV2aW91cyBjb21taXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgTWVudGlvbiBidWcgNDE1NjI3IGZpeGVkIHdpdGggcHJldmlvdXMgY29tbWl0CisKKzIwMDgtMDItMDggMDI6NDk6MjAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBNb3ZlIHRoZSBlcXVhbGl6ZXIgcGx1Z2luIGFjcm9zcyBmcm9tIC1iYWQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lcXVhbGl6ZXIueG1sOgorCSAgKiBnc3QvZXF1YWxpemVyL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvZXhhbXBsZXMvTWFrZWZpbGUuYW06CisJICBNb3ZlIHRoZSBlcXVhbGl6ZXIgcGx1Z2luIGFjcm9zcyBmcm9tIC1iYWQKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgIEFkZCBlcXVhbGl6ZXIsIGF1ZGlvc2luY3diYW5kIGFuZCBhdWRpb3NpbmN3bGltaXQKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvZXF1YWxpemVyLmM6CisJICBGaXggY29tcGlsZXIgd2FybmluZ3MKKworMjAwOC0wMi0wOCAwMjo0ODo1NCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy4qOiBSZW1vdmUgZXF1YWxpemVyIHBsdWdpbiBkb2NzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSAgUmVtb3ZlIGVxdWFsaXplciBwbHVnaW4gZG9jcworCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIEFkZCBHU1RfT1BUSU9OX0NGTEFHUywgdG8gZ2V0IC1XZXJyb3IgLVdhbGwgaW50byB0aGUgdGVzdHMgYXMgZm9yCisJICBvdGhlciBtb2R1bGVzLgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWx0aWZpbGUuYzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2xpbWl0ZXIuYzoKKwkgIEZpeCBjb21waWxlciB3YXJuaW5ncyBmcm9tIC1XYWxsIC1XZXJyb3IKKworMjAwOC0wMi0wOCAwMTowNzowMiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogT25seSBidWlsZCB3aXRoIERJU0FCTEVfREVQUkVDQVRFRCBkdXJpbmcgdGhlIENWUyBjeWNsZS4gUHJlLXJlbGVhc2VzIGFyZSB0cmVhdGVkIGxpa2UgcmVsZWFzZXMgYW5kIGJ1aS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIE9ubHkgYnVpbGQgd2l0aCBESVNBQkxFX0RFUFJFQ0FURUQgZHVyaW5nIHRoZSBDVlMgY3ljbGUuIFByZS1yZWxlYXNlcworCSAgYXJlIHRyZWF0ZWQgbGlrZSByZWxlYXNlcyBhbmQgYnVpbGQgd2l0aG91dCBpdC4KKworMjAwOC0wMi0wNyAyMTo1Nzo1NCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIE1vdmUgdGhlIGxwd3NpbmMgYW5kIGJwd3NpbmMgZWxlbWVudHMgZnJvbSBnc3QtcGx1Z2lucy1iYWQgaW50byB0aGUgYXVkaW9meCBwbHVnaW4sIGFuZCByZW5hbWUgdG8gYXVkaW93c2luY2xpbWl0IGFuZC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkgICogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZnguYzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuaDoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5oOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW93c2luY2JhbmQuYzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW93c2luY2xpbWl0LmM6CisJICBNb3ZlIHRoZSBscHdzaW5jIGFuZCBicHdzaW5jIGVsZW1lbnRzIGZyb20gZ3N0LXBsdWdpbnMtYmFkIGludG8KKwkgIHRoZSBhdWRpb2Z4IHBsdWdpbiwgYW5kIHJlbmFtZSB0byBhdWRpb3dzaW5jbGltaXQgYW5kIGF1ZGlvd3NpbmNiYW5kCisJICByZXNwZWN0aXZlbHkuCisJICBGaXhlczogIzQ2NzY2NgorCisyMDA4LTAyLTA3IDIxOjE3OjM2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBSZXR1cm4gR1NUX0ZMT1dfTk9UX05FR09USUFURUQgaWYgd2UgZ2V0IGEgYnVmZmVyIHdpdGhvdXQgY2FwcywgYW5kIGFkZCBhIHNvbWV3aGF0IHVzZWZ1bCBkZWJ1ZyBtZXNzYWdlLiBQbHVzIHRlc3QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6IChnc3RfaWN5ZGVtdXhfY2hhaW4pOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pY3lkZW11eC5jOgorCSAgUmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEIGlmIHdlIGdldCBhIGJ1ZmZlciB3aXRob3V0CisJICBjYXBzLCBhbmQgYWRkIGEgc29tZXdoYXQgdXNlZnVsIGRlYnVnIG1lc3NhZ2UuIFBsdXMgdGVzdC4KKworMjAwOC0wMi0wNyAxOToxMzo1NiArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IEluY2x1ZGUgdW5pc3RkLmggb25seSBpZiBIQVZFX1VOSVNURF9IIGlzIGRlZmluZWQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBJbmNsdWRlIHVuaXN0ZC5oIG9ubHkgaWYgSEFWRV9VTklTVERfSCBpcyBkZWZpbmVkCisJICAqIHdpbjMyL2NvbW1vbi9jb25maWcuaC5pbjoKKwkgICogd2luMzIvY29tbW9uL2NvbmZpZy5oOgorCSAgRGVmaW5lIHNvY2tsZW5fdCBhcyBpdCBzZWVtcyBpdCdzIG5vdCBkZWZpbmVkIGluIGRlZmF1bHQKKwkgIFZpc3VhbCBTdHVkaW8gaGVhZGVycy4KKwkgICogd2luMzIvdnM2L2xpYmdzdGFscGhhLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdGFwZXRhZy5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RhdmkuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0cnRwLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHJ0c3AuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0dmlkZW9taXhlci5kc3A6CisJICBVcGRhdGUgcHJvamVjdCBmaWxlIGRlcGVuZGVuY2llcyBhbmQgYWRkIG5ldyBzb3VyY2UgZmlsZXMKKworMjAwOC0wMi0wNyAxNjozODo1NSArMDAwMCAgQmphcm5lIFJvc2VuZ3JlbiA8Ymphcm5lQGF4aXMuY29tPgorCisJICBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOiBEb24ndCBsZWFrIGJ1ZmZlcnMgd2hlbiB3ZSBkb24ndCBwdXNoIHRoZW0gZG93bnN0cmVhbS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEJqYXJuZSBSb3NlbmdyZW4gPGJqYXJuZSBhdCBheGlzIGRvdCBjb20+CisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6IChnc3RfZWJtbF93cml0ZV9lbGVtZW50X3B1c2gpOgorCSAgRG9uJ3QgbGVhayBidWZmZXJzIHdoZW4gd2UgZG9uJ3QgcHVzaCB0aGVtIGRvd25zdHJlYW0uCisJICBGaXhlcyBidWcgIzUxNDk2NS4KKworMjAwOC0wMi0wNyAxMzo0ODoyMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzogQWRkIGEgZml4bWUgY29tbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIEFkZCBhIGZpeG1lIGNvbW1lbnQuCisJICAqIGdzdC9zZWxlY3Rvci9nc3RvdXRwdXRzZWxlY3Rvci5jOgorCSAgRml4IHNhbWUgbGVhayBhcyBpbiBpbnB1dC1zZWxlY3Rvci4KKwkgICogdGVzdHMvaWNsZXMvb3V0cHV0LXNlbGVjdG9yLXRlc3QuYzoKKwkgIEltcHJvdmUgdGhlIHRlc3QuCisKKzIwMDgtMDItMDcgMTM6NDE6MTEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IEltcHJvdmUgdGhlIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBJbXByb3ZlIHRoZSBkb2NzLgorCisyMDA4LTAyLTA3IDEwOjE3OjE0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IEJ1bXAgcmVxdWlyZW1lbnRzIHRvIChnb29kKSByZWxlYXNlZCB2ZXJzaW9ucyB0byBhdm9pZCBjb25mdXNpb24gYW5kIG1ha2UgaW1wbGljaXQgY29yZSByZXF1aXJlbWVudCBleHAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBCdW1wIHJlcXVpcmVtZW50cyB0byAoZ29vZCkgcmVsZWFzZWQgdmVyc2lvbnMgdG8gYXZvaWQKKwkgIGNvbmZ1c2lvbiBhbmQgbWFrZSBpbXBsaWNpdCBjb3JlIHJlcXVpcmVtZW50IGV4cGxpY2l0LgorCisyMDA4LTAyLTA3IDEwOjA0OjAxICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy5jOiBGaXggdHlwbyBpbiB0aGUgbG9uZyBkZXNjcmlwdGlvbiBvZiB0aGUgZWxlbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzoKKwkgIEZpeCB0eXBvIGluIHRoZSBsb25nIGRlc2NyaXB0aW9uIG9mIHRoZSBlbGVtZW50LgorCisyMDA4LTAyLTA2IDIzOjQ0OjQzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgUmVuYW1lIGF1ZGlvY2hlYnlzaGV2ZnJlcWJhbmQgLT4gYXVkaW9jaGViYmFuZCBhbmQgYXVkaW9jaGVieXNoZXZmcmVxbGltaXQgLT4gYXVkaW9jaGVibGltaXQgYW5kIGRvIHRoZSByZXF1aXNpdGUgQ1ZTLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSAgKiBnc3QvYXVkaW9meC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmg6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0LmM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYmxpbWl0Lmg6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYnlzaGV2ZnJlcWJhbmQuYzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGVieXNoZXZmcmVxYmFuZC5oOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJ5c2hldmZyZXFsaW1pdC5jOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJ5c2hldmZyZXFsaW1pdC5oOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2Z4LmM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJiYW5kLmM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmxpbWl0LmM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYnlzaGV2ZnJlcWJhbmQuYzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9jaGVieXNoZXZmcmVxbGltaXQuYzoKKwkgIFJlbmFtZSBhdWRpb2NoZWJ5c2hldmZyZXFiYW5kIC0+IGF1ZGlvY2hlYmJhbmQgYW5kCisJICBhdWRpb2NoZWJ5c2hldmZyZXFsaW1pdCAtPiBhdWRpb2NoZWJsaW1pdCBhbmQgZG8gdGhlIHJlcXVpc2l0ZSBDVlMKKwkgIHN1cmdlcnkuCisJICBDbG9zZXM6ICM0OTE4MTEKKworMjAwOC0wMi0wNiAxMTowNzo0NyArMDAwMCAgV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogRml4IG1lbW9yeSBsZWFrIGFuZCBpbXByb3ZlIGRlYnVnZ2luZyBhIGJpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFdvdXRlciBDbG9ldGVucyA8d291dGVyIGF0IG1pbmQgZG90IGJlPgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOiAoZ3N0X3NvdXBfaHR0cF9zcmNfZ290X2NodW5rX2NiKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19jcmVhdGUpOgorCSAgRml4IG1lbW9yeSBsZWFrIGFuZCBpbXByb3ZlIGRlYnVnZ2luZyBhIGJpdC4KKworMjAwOC0wMi0wNSAxNzo1OToyNCArMDAwMCAgb3JqYW4gPG9yamFuZkBheGlzLmNvbT4KKworCSAgZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogRml4IGNhcHMgbWVtb3J5IGxlYWsuIEZpeGVzICM1MTQ1NzMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBvcmphbiA8b3JqYW5mIGF0IGF4aXMgZG90IGNvbT4KKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogKGdzdF9tdWx0aXBhcnRfbXV4X2NvbGxlY3RlZCk6CisJICBGaXggY2FwcyBtZW1vcnkgbGVhay4gRml4ZXMgIzUxNDU3My4KKworMjAwOC0wMi0wNCAxMjowNzoxNCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBJZiB0aGVyZSdzIG5vIGVudHJpZXMgaW4gdGhlIHN1YmluZGV4LCBkb24ndCB0cnkgdG8gZG8gYW55dGhpbmcgc3R1cGlkLCBqdXN0IHJldHVybi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3BhcnNlX3N1YmluZGV4KToKKwkgIElmIHRoZXJlJ3Mgbm8gZW50cmllcyBpbiB0aGUgc3ViaW5kZXgsIGRvbid0IHRyeSB0byBkbyBhbnl0aGluZyBzdHVwaWQsCisJICBqdXN0IHJldHVybi4KKworMjAwOC0wMi0wMiAxOTo0Nzo1MCArMDAwMCAgSm9obiBNaWxsaWtpbiA8am1pbGxpa2luQGdtYWlsLmNvbT4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiBGaXggZXh0cmFjdGlvbiBvZiBwaWN0dXJlIGJsb2NrcyB3aXRoIG5ld2VyIGxpYmZsYWMgdmVyc2lvbnMgYWdhaW46CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBKb2huIE1pbGxpa2luIDxqbWlsbGlraW4gYXQgZ21haWwgZG90IGNvbT4KKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX3NjYW5fZm9yX2xhc3RfYmxvY2spLAorCSAgKGdzdF9mbGFjX2V4dHJhY3RfcGljdHVyZV9idWZmZXIpLCAoZ3N0X2ZsYWNfZGVjX21ldGFkYXRhX2NhbGxiYWNrKToKKwkgIEZpeCBleHRyYWN0aW9uIG9mIHBpY3R1cmUgYmxvY2tzIHdpdGggbmV3ZXIgbGliZmxhYyB2ZXJzaW9ucyBhZ2FpbjoKKwkgIEZMQUNfX01FVEFEQVRBX1RZUEVfUElDVFVSRSBpcyBhbiBlbnVtLCBub3QgYSBkZWZpbmUgKCM1MTM2MjgpLgorCisyMDA4LTAyLTAyIDE4OjA2OjE5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogQWRkIHJ0cC1wYXlsb2FkaW5nIHRlc3QgdG8gVkFMR1JJTkRfVE9fRklYLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgQWRkIHJ0cC1wYXlsb2FkaW5nIHRlc3QgdG8gVkFMR1JJTkRfVE9fRklYLgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jOgorCSAgQWRkIHNlbWljb2xvbnMgYWZ0ZXIgR1NUX1RFU1RfRU5EIHNvIGdzdC1pbmRlbnQgZ2V0cyB0aGUKKwkgIGZvcm1hdHRpbmcgcmlnaHQ7IG1ha2UgdGVzdCBsZXNzIHZlcmJvc2UgaW4gZ2VuZXJhbCwgYnV0CisJICBtb3JlIHZlcmJvc2UgaW4gdGhlIGVycm9yIGNhc2UgKHdoaWNoIHNob3VsZCBwcm9iYWJseQorCSAgbWFrZSB0aGUgdGVzdCBmYWlsIGFueXdheSkuCisKKzIwMDgtMDItMDEgMTg6Mjk6MjEgKzAwMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkgIEFkZCBkb2N1bWVudGF0aW9uIGZvciBhdmlzdWJ0aXRsZSBhbmQgY2hhbmdlIGNsYXNzIHRvCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkgIEFkZCBkb2N1bWVudGF0aW9uIGZvciBhdmlzdWJ0aXRsZSBhbmQgY2hhbmdlIGNsYXNzIHRvCisJICBDb2RlYy9QYXJzZXIvU3VidGl0bGUKKworMjAwOC0wMS0zMSAxNjoxMjoyOCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogVHJlYXQgRU5PVFRZIChkcml2ZXIgZG9lcyBub3QgaW1wbGVtZW50IGlvY3RsKSB0aGUgc2FtZSBhcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogKGdzdF92NGwyX2ZpbGxfbGlzdHMpOgorCSAgVHJlYXQgRU5PVFRZIChkcml2ZXIgZG9lcyBub3QgaW1wbGVtZW50IGlvY3RsKSB0aGUgc2FtZSBhcworCSAgRUlOVkFMIHNpbmNlIGl0IGltcGxpZXMgdGhlcmUgYXJlIG5vIGF2YWlsYWJsZSBzdGFuZGFyZHMuCisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX3Byb2JlX2NhcHNfZm9yX2Zvcm1hdCksCisJICAoZ3N0X3Y0bDJzcmNfZ2V0X25lYXJlc3Rfc2l6ZSk6CisJICBSZXBsYWNlIGdzdF92NGwyc3JjX2dldF9zaXplX2xpbWl0cyB3aXRoIDIgY2FsbHMgdG8gbmV3IGZ1bmN0aW9uCisJICBnc3RfdjRsMnNyY19nZXRfbmVhcmVzdF9zaXplLCBhbmQgZ2V0IGl0IHRvIHVzZSBWSURJT0NfU19GTVQgdG8KKwkgIHByb2JlIGlmIHRoZSBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBWSURJT0NfVFJZX0ZNVCBmb3Igd2hhdGV2ZXIKKwkgIHJlYXNvbiwgYW5kIGlmIHdlIGFyZW4ndCB5ZXQgYWN0aXZlbHkgY2FwdHVyaW5nLgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmg6CisJICBSZW1vdmUgcmVwbGFjZWQgZnVuY3Rpb24gZGVjbGFyYXRpb24uCisKKzIwMDgtMDEtMzEgMTY6MDM6NDggKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBjb25maWd1cmUuYWM6IEJ1bXAgcGx1Z2lucy1iYXNlIHJlcXVpcmVtZW50IHRvIDAuMTAuMTYgZm9yIHRoZSBnc3RfdmlkZW9fZm9ybWF0XyoKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBCdW1wIHBsdWdpbnMtYmFzZSByZXF1aXJlbWVudCB0byAwLjEwLjE2IGZvciB0aGUgZ3N0X3ZpZGVvX2Zvcm1hdF8qCisJICBBUEkuCisKKzIwMDgtMDEtMzEgMDk6NTA6MzEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogQWRkIGNoYW5nZXMgdG8gZ3N0c291cGh0dHBzcmMuYyB0aGF0IHdlcmUgbWlzc2luZyBmcm9tIGxhc3QgY29tbWl0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IChfZG9faW5pdCksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfYmFzZV9pbml0KSwgKGdzdF9zb3VwX2h0dHBfc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX2luaXQpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfZGlzcG9zZSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9zb3VwX2h0dHBfc3JjX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfdW5pY29kaWZ5KSwgKGdzdF9zb3VwX2h0dHBfc3JjX2NhbmNlbF9tZXNzYWdlKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19xdWV1ZV9tZXNzYWdlKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19hZGRfcmFuZ2VfaGVhZGVyKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19zZXNzaW9uX3VucGF1c2VfbWVzc2FnZSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfc2Vzc2lvbl9wYXVzZV9tZXNzYWdlKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19zZXNzaW9uX2Nsb3NlKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19nb3RfaGVhZGVyc19jYiksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfZ290X2JvZHlfY2IpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfZmluaXNoZWRfY2IpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX2dvdF9jaHVua19jYiksIChnc3Rfc291cF9odHRwX3NyY19yZXNwb25zZV9jYiksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfcGFyc2Vfc3RhdHVzKSwgKGdzdF9zb3VwX2h0dHBfc3JjX2NyZWF0ZSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfc3RhcnQpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfc3RvcCksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfdW5sb2NrKSwgKGdzdF9zb3VwX2h0dHBfc3JjX3VubG9ja19zdG9wKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19nZXRfc2l6ZSksIChnc3Rfc291cF9odHRwX3NyY19pc19zZWVrYWJsZSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfZG9fc2VlayksIChnc3Rfc291cF9odHRwX3NyY19zZXRfbG9jYXRpb24pLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3NldF9wcm94eSksIChnc3Rfc291cF9odHRwX3NyY191cmlfZ2V0X3R5cGUpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3VyaV9nZXRfcHJvdG9jb2xzKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY191cmlfZ2V0X3VyaSksIChnc3Rfc291cF9odHRwX3NyY191cmlfc2V0X3VyaSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfdXJpX2hhbmRsZXJfaW5pdCksIChwbHVnaW5faW5pdCk6CisJICBBZGQgY2hhbmdlcyB0byBnc3Rzb3VwaHR0cHNyYy5jIHRoYXQgd2VyZSBtaXNzaW5nIGZyb20gbGFzdCBjb21taXQuCisKKzIwMDgtMDEtMzEgMDg6NTc6MTYgKzAwMDAgIFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisKKwkgIE1ha2UgY29kaW5nIHN0eWxlIG1vcmUgY29uc2lzdGVudCwgaW5jbHVkaW5nIGNsYXNzIHJlbmFtaW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogV291dGVyIENsb2V0ZW5zIDx3b3V0ZXIgYXQgbWluZCBkb3QgYmU+CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX2Jhc2VfaW5pdCksIChnc3Rfc291cF9odHRwX3NyY19jbGFzc19pbml0KSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19pbml0KSwgKGdzdF9zb3VwX2h0dHBfc3JjX2Rpc3Bvc2UpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3NldF9wcm9wZXJ0eSksIChnc3Rfc291cF9odHRwX3NyY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3VuaWNvZGlmeSksIChnc3Rfc291cF9odHRwX3NyY19jYW5jZWxfbWVzc2FnZSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfcXVldWVfbWVzc2FnZSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfYWRkX3JhbmdlX2hlYWRlciksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfc2Vzc2lvbl91bnBhdXNlX21lc3NhZ2UpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3Nlc3Npb25fcGF1c2VfbWVzc2FnZSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfc2Vzc2lvbl9jbG9zZSksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfZ290X2hlYWRlcnNfY2IpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX2dvdF9ib2R5X2NiKSwgKGdzdF9zb3VwX2h0dHBfc3JjX2ZpbmlzaGVkX2NiKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19nb3RfY2h1bmtfY2IpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfcmVzcG9uc2VfY2IpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3BhcnNlX3N0YXR1cyksIChnc3Rfc291cF9odHRwX3NyY19jcmVhdGUpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3N0YXJ0KSwgKGdzdF9zb3VwX2h0dHBfc3JjX3N0b3ApLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3VubG9jayksIChnc3Rfc291cF9odHRwX3NyY191bmxvY2tfc3RvcCksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfZ2V0X3NpemUpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfaXNfc2Vla2FibGUpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX2RvX3NlZWspLCAoZ3N0X3NvdXBfaHR0cF9zcmNfc2V0X2xvY2F0aW9uKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY19zZXRfcHJveHkpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfdXJpX2dldF90eXBlKSwKKwkgIChnc3Rfc291cF9odHRwX3NyY191cmlfZ2V0X3Byb3RvY29scyksCisJICAoZ3N0X3NvdXBfaHR0cF9zcmNfdXJpX2dldF91cmkpLCAoZ3N0X3NvdXBfaHR0cF9zcmNfdXJpX3NldF91cmkpLAorCSAgKGdzdF9zb3VwX2h0dHBfc3JjX3VyaV9oYW5kbGVyX2luaXQpLCAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgTWFrZSBjb2Rpbmcgc3R5bGUgbW9yZSBjb25zaXN0ZW50LCBpbmNsdWRpbmcgY2xhc3MgcmVuYW1pbmcuCisKKzIwMDgtMDEtMzEgMDA6MDM6MjYgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBjb25maWd1cmUuYWM6IEZpeCB0eXBvLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEZpeCB0eXBvLgorCisyMDA4LTAxLTMxIDAwOjAwOjIzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2FscGhhLzogUmUtd3JpdGUgdGhlICdhbHBoYScgcGx1Z2luIHRvIGJlIEJhc2VUcmFuc2Zvcm0gYmFzZWQsIHNpbXBsaWZ5aW5nIHNvbWUgc3R1ZmYsIGFuZCBtYWtpbmcgYnVmZmVyLWFsbG9jIGFuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FscGhhL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgIFJlLXdyaXRlIHRoZSAnYWxwaGEnIHBsdWdpbiB0byBiZSBCYXNlVHJhbnNmb3JtIGJhc2VkLCBzaW1wbGlmeWluZworCSAgc29tZSBzdHVmZiwgYW5kIG1ha2luZyBidWZmZXItYWxsb2MgYW5kIHJlc2l6aW5nIHdvcmsgYXV0b21hdGljYWxseS4KKwkgIE5vIGxvbmdlciBjcmFzaGVzIG9uIG9kZCBmcmFtZSB3aWR0aHMgYW5kIGhlaWdodHMsIGFsdGhvdWdoIHRoZXJlCisJICBzZWVtcyB0byBiZSBhIGRpc2FncmVlbWVudCB3aXRoIGZmbXBlZ2NvbG9yc3BhY2UgYWJvdXQgd2hhdCBzaXplCisJICBhbiBBWVVWIGZyYW1lIHdpdGggb2RkIGhlaWdodCBzaG91bGQgYmUuCisKKzIwMDgtMDEtMzAgMTU6NDA6MzYgKzAwMDAgIFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisKKwkgIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IFVwZGF0ZSBkb2N1bWVudGF0aW9uIGEgYml0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogV291dGVyIENsb2V0ZW5zIDx3b3V0ZXIgYXQgbWluZCBkb3QgYmU+CisJICAqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6CisJICBVcGRhdGUgZG9jdW1lbnRhdGlvbiBhIGJpdC4KKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsc2FzcGRpZi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdmIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmlsdGVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdsaW1hZ2VzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1wZWd2aWRlb3BhcnNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yYXdwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNkbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VuZHRvdWNoLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BjZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWVkLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4cmVzYW1wbGUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3dpdGNoLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJICBSZWdlbmVyYXRlIGV2ZXJ5dGhpbmcgZm9yIHRoZSBkb2N1bWVudGF0aW9uIGNoYW5nZXMgd2UgaGFkLgorCisyMDA4LTAxLTMwIDEzOjI5OjE1ICswMDAwICBXb3V0ZXIgQ2xvZXRlbnMgPHdvdXRlckBtaW5kLmJlPgorCisJICBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOiBMZXQgdGhlIHByb3h5IHByb3BlcnR5IGRlZmF1bHQgdG8gdGhlIGNvbnRlbnQgb2YgdGhlICRodHRwX3Byb3h5IGVudmlyb25tZW50IHZhcmlhYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogV291dGVyIENsb2V0ZW5zIDx3b3V0ZXIgYXQgbWluZCBkb3QgYmU+CisJICAqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IChnc3Rfc291cGh0dHBfc3JjX2luaXQpOgorCSAgTGV0IHRoZSBwcm94eSBwcm9wZXJ0eSBkZWZhdWx0IHRvIHRoZSBjb250ZW50IG9mIHRoZSAkaHR0cF9wcm94eQorCSAgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKzIwMDgtMDEtMzAgMTM6MDg6NDUgKzAwMDAgIFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisKKwkgIHRlc3RzL2NoZWNrLzogQWRkIG1pc3NpbmcgZmlsZXMgZm9yIHRoZSB1bml0IHRlc3QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBXb3V0ZXIgQ2xvZXRlbnMgPHdvdXRlciBhdCBtaW5kIGRvdCBiZT4KKwkgICogdGVzdHMvY2hlY2svdGVzdC1jZXJ0LnBlbToKKwkgICogdGVzdHMvY2hlY2svdGVzdC1rZXkucGVtOgorCSAgQWRkIG1pc3NpbmcgZmlsZXMgZm9yIHRoZSB1bml0IHRlc3QuCisKKzIwMDgtMDEtMzAgMTM6MDY6MDEgKzAwMDAgIFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisKKwkgIGRvY3MvcGx1Z2lucy86IEFkZCBzb3VwaHR0cHNyYyB0byB0aGUgZG9jcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFdvdXRlciBDbG9ldGVucyA8d291dGVyIGF0IG1pbmQgZG90IGJlPgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBBZGQgc291cGh0dHBzcmMgdG8gdGhlIGRvY3MuCisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKGdzdF9zb3VwaHR0cF9zcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3NvdXBodHRwX3NyY19pbml0KSwgKGdzdF9zb3VwaHR0cF9zcmNfZGlzcG9zZSksCisJICAoZ3N0X3NvdXBodHRwX3NyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3NvdXBodHRwX3NyY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfY2FuY2VsX21lc3NhZ2UpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfcXVldWVfbWVzc2FnZSksCisJICAoZ3N0X3NvdXBodHRwX3NyY19hZGRfcmFuZ2VfaGVhZGVyKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX3Nlc3Npb25fdW5wYXVzZV9tZXNzYWdlKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX3Nlc3Npb25fcGF1c2VfbWVzc2FnZSksCisJICAoZ3N0X3NvdXBodHRwX3NyY19zZXNzaW9uX2Nsb3NlKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX2dvdF9oZWFkZXJzX2NiKSwgKGdzdF9zb3VwaHR0cF9zcmNfZ290X2JvZHlfY2IpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfZmluaXNoZWRfY2IpLCAoZ3N0X3NvdXBodHRwX3NyY19nb3RfY2h1bmtfY2IpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfcmVzcG9uc2VfY2IpLCAoZ3N0X3NvdXBodHRwX3NyY19wYXJzZV9zdGF0dXMpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfY3JlYXRlKSwgKGdzdF9zb3VwaHR0cF9zcmNfc3RhcnQpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfc3RvcCksIChnc3Rfc291cGh0dHBfc3JjX3VubG9jayksCisJICAoZ3N0X3NvdXBodHRwX3NyY191bmxvY2tfc3RvcCksIChnc3Rfc291cGh0dHBfc3JjX2dldF9zaXplKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX2lzX3NlZWthYmxlKSwgKGdzdF9zb3VwaHR0cF9zcmNfZG9fc2VlayksCisJICAoZ3N0X3NvdXBodHRwX3NyY19zZXRfbG9jYXRpb24pLCAoZ3N0X3NvdXBodHRwX3NyY19zZXRfcHJveHkpLAorCSAgKHBsdWdpbl9pbml0KToKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaDoKKwkgIEFkZCBzdXBwb3J0IGZvciBsaWJzb3VwMi40IGFuZCByZXF1aXJlIGl0LiBBbHNvIGltcGxlbWVudCByZWRpcmVjdGlvbgorCSAgYW5kIG1hbnVhbCBwcm94eSBzcGVjaWZpY2F0aW9uLiBGaXhlcyBidWcgIzUxMDcwOC4KKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmM6CisJICBBZGQgdW5pdCB0ZXN0IGZvciBzb3VwaHR0cHNyYy4KKworMjAwOC0wMS0yOSAxODo0MzozMiArMDAwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm9Abm52YS5vcmc+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZW5jLio6IFByZWFsbG9jYXRlIHRoZSBvdXRwdXQgYnVmZmVyIHNvIHRoYXQgZ19tZW1kdXAoKSBhbmQgZ3N0X2J1ZmZlcl9tZXJnZSgpIGFyZW4ndCBuZWVkZWQgYW55bW9yZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8gYXQgbm52YSBkb3Qgb3JnPgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiAodXNlcl93cml0ZV9kYXRhKSwgKGdzdF9wbmdlbmNfY2hhaW4pOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5oOgorCSAgUHJlYWxsb2NhdGUgdGhlIG91dHB1dCBidWZmZXIgc28gdGhhdCBnX21lbWR1cCgpIGFuZAorCSAgZ3N0X2J1ZmZlcl9tZXJnZSgpIGFyZW4ndCBuZWVkZWQgYW55bW9yZS4gVGhpcyBncmVhdGx5IGltcHJvdmVzCisJICBwZXJmb3JtYW5jZXMgYW5kIGZpeGVzICM1MTI1NDQuCisKKzIwMDgtMDEtMjkgMTg6MjQ6MjggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogR1N0cmVhbWVyIHRpbWVzdGFtcHMgYXJlIFBUUyB2YWx1ZXMgd2hpbGUgQVZJIG9ubHkga25vd3MgYWJvdXQgRFRTIHRpbWVzdGFtcHMuIE1ha2Ugc3VyZSB3ZSBvbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKToKKwkgIEdTdHJlYW1lciB0aW1lc3RhbXBzIGFyZSBQVFMgdmFsdWVzIHdoaWxlIEFWSSBvbmx5IGtub3dzIGFib3V0IERUUworCSAgdGltZXN0YW1wcy4gTWFrZSBzdXJlIHdlIG9ubHkgY29weSB0aGUgRFRTIGFzIHRoZSBidWZmZXIgdGltZXN0YW1wIHdoZW4KKwkgIHdlIGFyZSBkZWFsaW5nIHdpdGggYSBrZXkgZnJhbWUuCisKKzIwMDgtMDEtMjkgMTU6NDU6NDggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvY2hlY2svOiBBZGQgYWRkIHRlc3RzdWl0ZSBmb3IgdGhlIHJ0cC1wYXlsb2FkZXIgdGhhdCB0cmllcyBzaW11bGF0aW5nIGRhdGFmbG93LiBOZWVkcyBtb3JlIHRlc3QgZGF0YS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYzoKKwkgIEFkZCBhZGQgdGVzdHN1aXRlIGZvciB0aGUgcnRwLXBheWxvYWRlciB0aGF0IHRyaWVzIHNpbXVsYXRpbmcKKwkgIGRhdGFmbG93LiBOZWVkcyBtb3JlIHRlc3QgZGF0YS4KKworMjAwOC0wMS0yOSAxNToyNzowMiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9hbHBoYWNvbG9yLmM6IFJlbW92ZSB0d28gdW51c2VkIHZhcmlhYmxlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hbHBoYWNvbG9yLmM6CisJICBSZW1vdmUgdHdvIHVudXNlZCB2YXJpYWJsZXMuCisKKzIwMDgtMDEtMjggMTI6MTc6MDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogVXNlIGdfYXNjaWlfc3RydG9sbCgpIGluc3RlYWQgb2YgYXRvbGwsIHdoaWNoIGlzIG9ubHkgYXZhaWxhYmxlIGluIEM5OS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19wYXJzZV9ydHBpbmZvKToKKwkgIFVzZSBnX2FzY2lpX3N0cnRvbGwoKSBpbnN0ZWFkIG9mIGF0b2xsLCB3aGljaCBpcyBvbmx5CisJICBhdmFpbGFibGUgaW4gQzk5LgorCisyMDA4LTAxLTI2IDE2OjE5OjI2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9maWx0ZXIvOiBEb24ndCBpbXBsZW1lbnQgZ2V0X3VuaXRfc2l6ZSgpIG91cnNlbHZlcywgdGhlIEdzdEF1ZGlvRmlsdGVyIGJhc2UgY2xhc3MgYWxyZWFkeSBkb2VzIHRoaXMgZm9yIHVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5jOiAoZ3N0X2Jwd3NpbmNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy5jOiAoZ3N0X2xwd3NpbmNfY2xhc3NfaW5pdCk6CisJICBEb24ndCBpbXBsZW1lbnQgZ2V0X3VuaXRfc2l6ZSgpIG91cnNlbHZlcywgdGhlIEdzdEF1ZGlvRmlsdGVyIGJhc2UKKwkgIGNsYXNzIGFscmVhZHkgZG9lcyB0aGlzIGZvciB1cy4KKworMjAwOC0wMS0yNSAxMDo1MzoxNyArMDAwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEFkZCBNUEVHMiB2aWRlbyBwYXlsb2FkZXIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wdnBheS5oOgorCSAgQWRkIE1QRUcyIHZpZGVvIHBheWxvYWRlcgorCisyMDA4LTAxLTIzIDE3OjA1OjMyICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiBVc2UgI2luY2x1ZGUgPG1hdGguaD4gaW5zdGVhZCBvZiAjaW5jbHVkZSAibWF0aC5oIi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIFVzZSAjaW5jbHVkZSA8bWF0aC5oPiBpbnN0ZWFkIG9mICNpbmNsdWRlICJtYXRoLmgiLgorCisyMDA4LTAxLTIxIDE5OjQxOjQ1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06IEZpeCB1cCBzb21lIENGTEFHUyBzZXRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgRml4IHVwIHNvbWUgQ0ZMQUdTIHNldHMuCisJICBEb24ndCBpbmNsdWRlIGdjb25mdmlkZW9zcmMgaW4gdGhlIHN0YXRlcyB0ZXN0LgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdXRvZGV0ZWN0LmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBBZGQgc29tZSBlcnJvciBzdHJpbmdzIHRvIGZhaWxfdW5sZXNzIGFyZ3VtZW50cyB0byBmaXggc29tZSB3ZWlyZAorCSAgY29tcGlsZXIgZXJyb3JzIG9uIFNvbGFyaXMuCisKKzIwMDgtMDEtMjEgMTk6MzU6NTggKzAwMDAgIEJyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ac3VuLmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBEZXRlY3QgdmlkZW80bGludXggaGVhZGVycyBvbiBTb2xhcmlzIHRvby4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBEZXRlY3QgdmlkZW80bGludXggaGVhZGVycyBvbiBTb2xhcmlzIHRvby4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMmNvbG9yYmFsYW5jZS5oOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJfYnVmZmVyX2ZpbmFsaXplKSwKKwkgIChnc3RfdjRsMl9idWZmZXJfbmV3KToKKwkgIE1ha2UgdjRsMiBidWlsZCBvbiBTb2xhcmlzLgorCSAgUGF0Y2ggYnk6IEJyaWFuIENhbWVyb24gIDxicmlhbi5jYW1lcm9uIGF0IHN1biBkb3QgY29tPgorCSAgRml4ZXM6ICM1MTA1MDUKKworMjAwOC0wMS0yMSAxMTo0NjoxOSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDogVXBkYXRlIGxpc3QgZnJvbSAoc3RpbGwgbG9jYWwpIHNjYW5uaW5nIHNjcmlwdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgIFVwZGF0ZSBsaXN0IGZyb20gKHN0aWxsIGxvY2FsKSBzY2FubmluZyBzY3JpcHQuCisKKzIwMDgtMDEtMjEgMDk6NTc6MDcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogQWRkIHN5bWJvbHMgZnJvbSAtdW51c2VkLnR4dCB0byB0aGUgcmlnaHQgcGxhY2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgQWRkIHN5bWJvbHMgZnJvbSAtdW51c2VkLnR4dCB0byB0aGUgcmlnaHQgcGxhY2UuCisJICAqIGdzdC9kdmRzcHUvZ3N0ZHZkc3B1LmM6CisJICAqIGdzdC9kdmRzcHUvZ3N0ZHZkc3B1Lmg6CisJICBDb2hlcmVudCBuYW1lc3BhY2UgdXNhZ2UuCisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgRml4IGJyb2tlbiBYTUwgZnJhZ21lbnQgaW4gZG9jIHNuaXBwZXQgZXZlbiBtb3JlLgorCisyMDA4LTAxLTIxIDA3OjU0OjAyICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbTogVXBkYXRlIGluY2x1ZGUgbGlzdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICBVcGRhdGUgaW5jbHVkZSBsaXN0LgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgVXBkYXRlIHhtbCBpbmNsdWRlcy4KKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsc2FzcGRpZi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbXJ3Yi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1iYXllci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1iejIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2R4YXBhcnNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0c2RlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdmJzcmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHZkc3B1LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mYWFjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZhYWQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmJkZXZzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZlc3RpdmFsLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZpbHRlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHZkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mcmVlemUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3NtLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdzdGludGVybGFjZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWgyNjRwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxhZHNwYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tZXRhZGF0YS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb2RwbHVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1wZWc0dmlkZW9wYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGVndHNwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGVndmlkZW9wYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdXNpY2JyYWluei54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdmUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbnNmZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW51dmRlbXV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF0ZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlYWwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zZGwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2RwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWVkLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4cmVzYW1wbGUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3RlcmVvLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXN3aXRjaC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10aW1pZGl0eS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10dGEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9jcm9wLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvcGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9zaWduYWwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdm1uYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13aWxkbWlkaS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14MjY0LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbmdoZWFkZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teHZpZC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi15NG1lbmMueG1sOgorCSAgUmVnZW5lcmF0ZSBmaWxlcy4KKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBGaXggYnJva2VuIFhNTCBmcmFnbWVudCBpbiBkb2Mgc25pcHBldC4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgIEFkZCB0ZXN0IGJpbmFyeSB0byBpZ25vcmVzLgorCisyMDA4LTAxLTIwIDA1OjA3OjUyICswMDAwICBXb3V0ZXIgQ2xvZXRlbnMgPHdvdXRlckBtaW5kLmJlPgorCisJICBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOiBSZXBvcnQgdGhlIHNpemUgb2YgdGhlIHN0cmVhbSBhcyB0aGUgdG90YWwgc2l6ZSBpbnN0ZWFkIG9mIHRoZSByZW1haW5pbmcgQ29udGVudC1MZW5ndGgsIHcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFdvdXRlciBDbG9ldGVucyA8d291dGVyIGF0IG1pbmQgZG90IGJlPgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jOiAoc291cF9nb3RfaGVhZGVycyk6CisJICBSZXBvcnQgdGhlIHNpemUgb2YgdGhlIHN0cmVhbSBhcyB0aGUgdG90YWwgc2l6ZSBpbnN0ZWFkIG9mCisJICB0aGUgcmVtYWluaW5nIENvbnRlbnQtTGVuZ3RoLCB3aGljaCBpcyB3cm9uZyBhZnRlciBhIHNlZWsuCisKKzIwMDgtMDEtMTkgMTQ6NTk6MDggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSAgQWRkIGJ1ZyBudW1iZXIgdG8gdGhlIGxhdGVzdCBlbnRyeQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBBZGQgYnVnIG51bWJlciB0byB0aGUgbGF0ZXN0IGVudHJ5CisKKzIwMDgtMDEtMTkgMTQ6NTM6NTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IFNldCB2YXJpYWJsZSB0byBOVUxMIGFmdGVyIGZyZWVpbmcgaXQgdG8gcHJldmVudCBkb3VibGUgZnJlZXMgb3IgbWFrZSBmYWlsdXJlcyBieSBhbm90aGVyLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJhc2VkIG9uIGEgcGF0Y2ggYnk6CisJICBWaWN0b3IgU1RJTk5FUiA8dmljdG9yIGRvdCBzdGlubmVyIGF0IGhheXBvY2FsYyBkb3QgY29tPgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyk6CisJICBTZXQgdmFyaWFibGUgdG8gTlVMTCBhZnRlciBmcmVlaW5nIGl0IHRvIHByZXZlbnQgZG91YmxlIGZyZWVzCisJICBvciBtYWtlIGZhaWx1cmVzIGJ5IGFub3RoZXIgdXNlIG9mIGl0IGFmdGVyd2FyZHMgbW9yZSBvYnZpb3VzCisJICBhbmQgZml4IHVzZSBvZiBpdCBhZnRlciB0aGUgZnJlZWluZy4KKworMjAwOC0wMS0xOSAxNDozNDo1MCArMDAwMCAgV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogQ29ycmVjdGx5IHNldCBkdXJhdGlvbiBvbiB0aGUgR3N0QmFzZVNyYyBzZWdtZW50IHdoZW4gd2Uga25vdyBpdCB0byBmaXggZmFpbGluZyB0aGUgZHVyYXRpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBXb3V0ZXIgQ2xvZXRlbnMgPHdvdXRlciBhdCBtaW5kIGRvdCBiZT4KKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKHNvdXBfZ290X2hlYWRlcnMpOgorCSAgQ29ycmVjdGx5IHNldCBkdXJhdGlvbiBvbiB0aGUgR3N0QmFzZVNyYyBzZWdtZW50IHdoZW4gd2Uga25vdyBpdAorCSAgdG8gZml4IGZhaWxpbmcgdGhlIGR1cmF0aW9uIHF1ZXJ5LgorCisyMDA4LTAxLTE4IDEzOjQwOjM4ICswMDAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiB1c2UgR1NUX1dBUk5JTkcgZm9yIGxvZ2dpbmcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOgorCSAgdXNlIEdTVF9XQVJOSU5HIGZvciBsb2dnaW5nCisKKzIwMDgtMDEtMTggMTA6MDU6NTMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzogRml4IG1lbW9yeSBsZWFrIHNwb3R0ZWQgYnkgdGhlIHVuaXQgdGVzdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOiAoZ3N0X211bHRpX2ZpbGVfc3JjX2NyZWF0ZSk6CisJICBGaXggbWVtb3J5IGxlYWsgc3BvdHRlZCBieSB0aGUgdW5pdCB0ZXN0LgorCisyMDA4LTAxLTE4IDEwOjA0OjI1ICswMDAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiBEb24ndCB0cnkgdG8gbGVhdmUgYSBtdWx0aWNhc3QgZ3JvdXAgd2l0aCBhbiBpbnZhbGlkIHNvY2tldAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICBEb24ndCB0cnkgdG8gbGVhdmUgYSBtdWx0aWNhc3QgZ3JvdXAgd2l0aCBhbiBpbnZhbGlkIHNvY2tldAorCisyMDA4LTAxLTE4IDA4OjQ5OjU5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHRlc3RzL2NoZWNrLzogQWRkIHNvbWUgbWluaW1hbCB0ZXN0cyBmb3IgdGhlIGVxdWFsaXplciBwbHVnaW4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2VxdWFsaXplci5jOiAoc2V0dXBfZXF1YWxpemVyKSwKKwkgIChjbGVhbnVwX2VxdWFsaXplciksIChHU1RfU1RBUlRfVEVTVCksIChlcXVhbGl6ZXJfc3VpdGUpLCAobWFpbik6CisJICBBZGQgc29tZSBtaW5pbWFsIHRlc3RzIGZvciB0aGUgZXF1YWxpemVyIHBsdWdpbi4KKworMjAwOC0wMS0xOCAwNzowMzoyMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiBVbnBhcmVudCBhbGwgYmFuZHMgZnJvbSB0aGUgZXF1YWxpemVyIHdoZW4gZmluYWxpemluZyB0byBzdG9wIGxlYWtpbmcJdGhlbS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiAoZ3N0X2lpcl9lcXVhbGl6ZXJfZmluYWxpemUpOgorCSAgVW5wYXJlbnQgYWxsIGJhbmRzIGZyb20gdGhlIGVxdWFsaXplciB3aGVuIGZpbmFsaXppbmcgdG8gc3RvcAorCSAgbGVha2luZwl0aGVtLgorCisyMDA4LTAxLTE4IDA1OjMyOjI2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IEFkZCBzdXBwb3J0IGZvciBXZWJEQVYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKGdzdF9zb3VwaHR0cF9zcmNfdXJpX2dldF9wcm90b2NvbHMpOgorCSAgQWRkIHN1cHBvcnQgZm9yIFdlYkRBVi4KKworMjAwOC0wMS0xOCAwNToyNDozOSArMDAwMCAgV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuKjogQWRkIHN1cHBvcnQgZm9yIHNlZWtpbmcgdG8gc291cGh0dHBzcmMuIEZpeGVzIGJ1ZyAjNTAyMzM1LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogV291dGVyIENsb2V0ZW5zIDx3b3V0ZXIgYXQgbWluZCBkb3QgYmU+CisJICAqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IChnc3Rfc291cGh0dHBfc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfaW5pdCksIChnc3Rfc291cGh0dHBfc3JjX2NyZWF0ZSksCisJICAoZ3N0X3NvdXBodHRwX3NyY19pc19zZWVrYWJsZSksIChnc3Rfc291cGh0dHBfc3JjX2RvX3NlZWspLAorCSAgKHNvdXBfYWRkX3JhbmdlX2hlYWRlciksIChzb3VwX2dvdF9oZWFkZXJzKSwgKHNvdXBfZ290X2NodW5rKToKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaDoKKwkgIEFkZCBzdXBwb3J0IGZvciBzZWVraW5nIHRvIHNvdXBodHRwc3JjLiBGaXhlcyBidWcgIzUwMjMzNS4KKworMjAwOC0wMS0xNyAyMToyMzozMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiB3aGVyZSB0aGUgcGljdHVyZSBtZXRhZGF0YSBkZWZpbmVzIGFuZCBzdHJ1Y3RzIGRvbid0IGV4aXN0IHlldC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBGaXggY29tcGlsYXRpb24gYWdhaW5zdCBmbGFjIDEuMS4yIChhcyBvbiBkZWJpYW4gc3RhYmxlKSwgd2hlcmUKKwkgIHRoZSBwaWN0dXJlIG1ldGFkYXRhIGRlZmluZXMgYW5kIHN0cnVjdHMgZG9uJ3QgZXhpc3QgeWV0LgorCSAgRml4ZXMgIzUwOTMwMS4KKworMjAwOC0wMS0xNyAxMToxMzoxNiArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuKjogQWRkIHByb3BlcnR5IHRvIGF1dG9tYXRpY2FsbHkgam9pbiBhIG11bHRpY2FzdCBncm91cCBvciBub3QuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHNoYXJpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBPbGl2aWVyIENyZXRlIDx0ZXN0ZXIgYXQgdGVzdGVyIGRvdCBjYT4KKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogKGdzdF9tdWx0aXVkcHNpbmtfY2xhc3NfaW5pdCksCisJICAoZ3N0X211bHRpdWRwc2lua19pbml0KSwgKGdzdF9tdWx0aXVkcHNpbmtfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX2dldF9wcm9wZXJ0eSksIChnc3RfbXVsdGl1ZHBzaW5rX2luaXRfc2VuZCksCisJICAoZ3N0X211bHRpdWRwc2lua19hZGRfaW50ZXJuYWwpLCAoZ3N0X211bHRpdWRwc2lua19yZW1vdmUpOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgQWRkIHByb3BlcnR5IHRvIGF1dG9tYXRpY2FsbHkgam9pbiBhIG11bHRpY2FzdCBncm91cCBvciBub3QuIFRoaXMgY2FuIGJlCisJICB1c2VmdWwgd2hlbiBzaGFyaW5nIGEgc29ja2V0IGJldHdlZW4gbXVsdGlwbGUgZWxlbWVudHMuCisJICBGaXhlcyAjNTA5NTMxLgorCisyMDA4LTAxLTE2IDIxOjUzOjQxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOiBBZGQgY29udHJvbGxlciBmbGFncy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbToKKwkgIEFkZCBjb250cm9sbGVyIGZsYWdzLgorCisyMDA4LTAxLTE2IDIwOjE3OjA4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogQWxzbyBjb21taXQgdGhlIG1pc3NpbmcgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcygpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIEFsc28gY29tbWl0IHRoZSBtaXNzaW5nIGdzdF9vYmplY3Rfc3luY192YWx1ZXMoKS4KKworMjAwOC0wMS0xNiAwODoxMTo0NiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06IFJlbW92ZSBkdXBsaWNhdGUgZW50cnkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgUmVtb3ZlIGR1cGxpY2F0ZSBlbnRyeS4KKworMjAwOC0wMS0xNSAxNjo1MjoxMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBkb2NzL3BsdWdpbnMvOiBBZGQgMyBtb3JlIHBsdWdpbnMgdG8gZG9jcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdhbW1hLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlbzRsaW51eDIueG1sOgorCSAgQWRkIDMgbW9yZSBwbHVnaW5zIHRvIGRvY3MuCisKKzIwMDgtMDEtMTUgMTY6MDQ6NDQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgUmV2ZXJ0IHByZXZpb3VzIGNoYW5nZSBjYXVzZWQgYnkgYSBmaWxlIHRoYXQgZ290IHN0dWNrIG9uIGFuIG9sZCByZXZpc2lvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSAgUmV2ZXJ0IHByZXZpb3VzIGNoYW5nZSBjYXVzZWQgYnkgYSBmaWxlIHRoYXQgZ290IHN0dWNrIG9uIGFuIG9sZAorCSAgcmV2aXNpb24uCisKKzIwMDgtMDEtMTUgMTU6NDA6NTggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgUmUtYWRkIG11bHRpcGFydGRlbXV4IHRvIHRoZSBkb2NzLiBMYXN0IHJvdW5kIG9mIHNlY3Rpb24gY2xlYW51cC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZ3N0L211bHRpcGFydC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4Lmg6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4Lmg6CisJICBSZS1hZGQgbXVsdGlwYXJ0ZGVtdXggdG8gdGhlIGRvY3MuIExhc3Qgcm91bmQgb2Ygc2VjdGlvbiBjbGVhbnVwLgorCisyMDA4LTAxLTE1IDE1OjIyOjQxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIE1hbmFnZWQgdG8gcmVzb2x2ZSBtb3N0IHVudXNlZCBkZWNsYXJhdGlvbnMuIEZpbGVkIGEgYnVnIGZvciBvbmUgbGVmdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmg6CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkgIE1hbmFnZWQgdG8gcmVzb2x2ZSBtb3N0IHVudXNlZCBkZWNsYXJhdGlvbnMuIEZpbGVkIGEgYnVnIGZvciBvbmUgbGVmdC4KKworMjAwOC0wMS0xNSAwODowMzo0OSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDogQ2xlYW51cCBzZWN0aW9uIGZpbGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBDbGVhbnVwIHNlY3Rpb24gZmlsZS4KKworMjAwOC0wMS0xNSAwNzo0Mjo1MSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBkb2NzL3BsdWdpbnMvOiBVcGRhdGUgcGx1Z2luIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFsczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Rpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxhZHNwYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICBVcGRhdGUgcGx1Z2luIGRvY3MuCisJICAqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuaDoKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcnBhZC5oOgorCSAgU3BsaXQgb3V0IGhlYWRlciB0byBmaXggd2FybmluZ3MgZnJvbSB0aGUgZG9jLWJ1aWxkLgorCisyMDA4LTAxLTE0IDEyOjM1OjIzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBBcyBmb3VuZCBieTogVG9tbWkgTXnDtmjDpG5lbiA8ZXh0LXRvbW1pLm15b2hhbmVuIG5va2lhIGNvbT4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQXMgZm91bmQgYnk6IFRvbW1pIE15w7Zow6RuZW4gPGV4dC10b21taS5teW9oYW5lbiBub2tpYSBjb20+CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3BhcnNlX3J0cGluZm8pOgorCSAgVXNlIGF0b2xsIHRvIHBhcnNlIHRoZSBydHB0aW1lIHdpdGggZW5vdWdoIHByZWNpc2lvbi4gRml4ZXMgIzUwOTMyOS4KKworMjAwOC0wMS0xNCAxMjoxMTo0MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0LzogSW5pdGlhbGlzZSB2YXJpYWJsZXMgdG8gd29yayBhcm91bmQgKGZhbHNlKSAnZm9vIG1pZ2h0IGJlIHVzZWQgdW5pbml0aWFsaXplZCBpbiB0aGlzIGZ1bmN0aW9uJyB3YXJuaW5ncyBieSBnY2MtLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlzdWJ0aXRsZS5jOiAoZ3N0X2F2aV9zdWJ0aXRsZV9leHRyYWN0X2ZpbGUpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zZW5kKToKKwkgIEluaXRpYWxpc2UgdmFyaWFibGVzIHRvIHdvcmsgYXJvdW5kIChmYWxzZSkgJ2ZvbyBtaWdodCBiZSB1c2VkCisJICB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24nIHdhcm5pbmdzIGJ5IGdjYy0zLjMuMyAoIzUwOTI5OCkuCisKKzIwMDgtMDEtMTIgMDI6MzI6MzUgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBJZ25vcmUgbW9yZSBmaWxlcyBmb3IgdGhlIGJ1aWxkYm90LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvLmN2c2lnbm9yZToKKwkgIElnbm9yZSBtb3JlIGZpbGVzIGZvciB0aGUgYnVpbGRib3QuCisKKzIwMDgtMDEtMTEgMjE6MDg6NTkgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBHZW5lcmF0ZSB0aGUgaW1hZ2UtdHlwZSB2YWx1ZXMgY29ycmVjdGx5LiBMZWF2ZSB0aGVtIG91dCBvZiB0aGUgY2FwcyB3aGVuIG91dHB1dHRpbmcgYSAicHJldmlldyBpbWFnZSIgdGFnLCBzaW5jZSBpdCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19leHRyYWN0X3BpY3R1cmVfYnVmZmVyKToKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChwYXJzZV9waWN0dXJlX2ZyYW1lKToKKwkgIEdlbmVyYXRlIHRoZSBpbWFnZS10eXBlIHZhbHVlcyBjb3JyZWN0bHkuIExlYXZlIHRoZW0gb3V0IG9mIHRoZSBjYXBzCisJICB3aGVuIG91dHB1dHRpbmcgYSAicHJldmlldyBpbWFnZSIgdGFnLCBzaW5jZSBpdCBvbmx5IG1ha2VzIHNlbnNlCisJICB0byBoYXZlIG9uZSBvZiB0aG9zZSAtIHRoZSB0eXBlIGlzIGlycmVsZXZhbnQuCisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyY3RybC5jOgorCSAgKGdzdF9zdW5hdWRpb21peGVyX2N0cmxfb3Blbik6CisJICBJZiB3ZSBjYW4sIG1hcmsgdGhlIG1peGVyIG11bHRpcGxlIG9wZW4gd2hlbiB3ZSB1c2UgaXQsIGluIGNhc2UKKwkgIChmb3Igc29tZSByZWFzb24pIHRoZSBwcm9jZXNzIHdhbnRzIHRvIG9wZW4gaXQgYWdhaW4gZWxzZXdoZXJlLgorCisyMDA4LTAxLTExIDE5OjE2OjUzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy86IEl0J3MgImVuZGlhbm5lc3MiLCBub3QgImVuZGlhbmVzcyIuIEZpeGVzIHVuaXQgdGVzdHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOiAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfbW9ubyksCisJICAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvKSwgKHRlc3RfYnVmZmVyX2NvbnN0X2ludDE2X21vbm8pLAorCSAgKHRlc3RfYnVmZmVyX2NvbnN0X2ludDE2X3N0ZXJlbyksICh0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfbW9ubyksCisJICAodGVzdF9idWZmZXJfc3F1YXJlX2Zsb2F0X3N0ZXJlbyksICh0ZXN0X2J1ZmZlcl9zcXVhcmVfaW50MTZfbW9ubyksCisJICAodGVzdF9idWZmZXJfc3F1YXJlX2ludDE2X3N0ZXJlbyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnbGltaXRlci5jOiAoY3JlYXRlX3Rlc3RfYnVmZmVyKToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvcmd2b2x1bWUuYzogKHRlc3RfYnVmZmVyX25ldyk6CisJICBJdCdzICJlbmRpYW5uZXNzIiwgbm90ICJlbmRpYW5lc3MiLiBGaXhlcyB1bml0IHRlc3RzLgorCisyMDA4LTAxLTExIDE4OjU2OjA2ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvLmN2aWdub3JlOgorCSAgaWdub3JlIHNvbWUgbW9yZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBpZ25vcmUgc29tZSBtb3JlCisKKzIwMDgtMDEtMTEgMTg6NTQ6MzEgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJICBpZ25vcmUgc29tZSBtb3JlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGlnbm9yZSBzb21lIG1vcmUKKworMjAwOC0wMS0xMSAxNzoyMTozMCArMDAwMCAgT2xpdmllciBDcmV0ZSA8dGVzdGVyQHRlc3Rlci5jYT4KKworCSAgZ3N0L3J0cC86IEZpeCB0aGUgY2xvY2sgcmF0ZSB0byA5MDAwMCBhcyByZXF1aXJlZCBieSB0aGUgUkZDLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogT2xpdmllciBDcmV0ZSA8dGVzdGVyIGF0IHRlc3RlciBkb3QgY2E+CisJICAqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzogKGdzdF9ydHBfdGhlb3JhX2RlcGF5X3NldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgRml4IHRoZSBjbG9jayByYXRlIHRvIDkwMDAwIGFzIHJlcXVpcmVkIGJ5IHRoZSBSRkMuCisJICBGaXhlcyAjNTA4NjQ0LgorCisyMDA4LTAxLTExIDE3OjEyOjM3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9pY3lkZW11eC5jOiBEb24ndCB1c2UgZGVwcmVjYXRlZCBHU1RfUExVR0lOX0RFRklORV9TVEFUSUMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYzogKEdTVF9TVEFSVF9URVNUKSwgKGljeWRlbXV4X3N1aXRlKToKKwkgIERvbid0IHVzZSBkZXByZWNhdGVkIEdTVF9QTFVHSU5fREVGSU5FX1NUQVRJQy4KKworMjAwOC0wMS0xMCAxMjoyNTo0NCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBhdXRvZ2VuLnNoOiBBZGQgLVduby1wb3J0YWJpbGl0eSB0byB0aGUgYXV0b21ha2UgcGFyYW1ldGVycyB0byBzdG9wIHdhcm5pbmdzIGFib3V0IEdOVSBtYWtlIGV4dGVuc2lvbnMgYmVpbmcgdXNlZC4gV2UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBhdXRvZ2VuLnNoOgorCSAgQWRkIC1Xbm8tcG9ydGFiaWxpdHkgdG8gdGhlIGF1dG9tYWtlIHBhcmFtZXRlcnMgdG8gc3RvcCB3YXJuaW5ncworCSAgYWJvdXQgR05VIG1ha2UgZXh0ZW5zaW9ucyBiZWluZyB1c2VkLiBXZSByZXF1aXJlIEdOVSBtYWtlIGluIGFsbW9zdAorCSAgZXZlcnkgTWFrZWZpbGUgYW55d2F5LgorCSAgKiBjb25maWd1cmUuYWM6CisJICBVc2UgQU1fUFJPR19DQ19DX08gYXMgYSBjb21waWxlciB0aGF0IGFjY2VwdHMgYm90aCAtYyBhbmQgLW8KKwkgIGF0IHRoZSBzYW1lIHRpbWUgaXMgcmVxdWlyZWQgZm9yIHBlciB0YXJnZXQgZmxhZ3MuCisKKzIwMDgtMDEtMDkgMTU6Mjg6MjkgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogRml4IGVycm9yIGZyb20gbXkgbGFzdCBjb21taXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfaW5pdCk6CisJICBGaXggZXJyb3IgZnJvbSBteSBsYXN0IGNvbW1pdC4KKworMjAwOC0wMS0wOSAxNToyMDoxOSArMDAwMCAgVG9tbWkgTXnDtmjDpG5lbiA8ZXh0LXRvbW1pLm15b2hhbmVuQG5va2lhLmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IE1ha2Ugc3VyZSB0aGUgSVNPIDYzOS1YIGxhbmd1YWdlIGNvZGUgaW4gSUQzdjIgQ09NTSBmcmFtZXMgc28gd2UgZG9uJ3QgZW5kIHVwIHdpdGggbm9uLVVULi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5OiBUb21taSBNecO2aMOkbmVuIDxleHQtdG9tbWkubXlvaGFuZW4gbm9raWEgY29tPgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKHBhcnNlX2NvbW1lbnRfZnJhbWUpOgorCSAgTWFrZSBzdXJlIHRoZSBJU08gNjM5LVggbGFuZ3VhZ2UgY29kZSBpbiBJRDN2MiBDT01NIGZyYW1lcworCSAgaXMgYWN0dWFsbHkgdmFsaWQgVVRGLTggKG9yIHJhdGhlcjogQVNDSUkpLCBzbyB3ZSBkb24ndCBlbmQKKwkgIHVwIHdpdGggbm9uLVVURjggc3RyaW5ncyBpbiB0YWdzIGlmIHRoZXJlJ3MgZ2FyYmFnZSBpbiB0aGUKKwkgIGxhbmd1YWdlIGZpZWxkLiBBbHNvIG1ha2Ugc3VyZSB0aGUgbGFuZ3VhZ2UgY29kZSBpcyBhbHdheXMKKwkgIGxvd2VyIGNhc2UuIEZpeGVzOiAjNTA4MjkxLgorCisyMDA4LTAxLTA5IDEzOjU1OjI4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIENoYW5nZUxvZzogRml4IENoYW5nZUxvZyB0eXBvLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIENoYW5nZUxvZzoKKwkgIEZpeCBDaGFuZ2VMb2cgdHlwby4KKworMjAwOC0wMS0wOSAxMzo1MDowOSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBNYWtlZmlsZS5hbTogSW5jbHVkZSBsY292Lm1hayB0byBhbGxvdyBidWlsZ2luZyBjb3ZlcmFnZSByZXBvcnRzLiBHdWFyZCBjaGVjay10b3J0dXJlIHRhcmdldCBsaWtlIGluIHRoZSBvdGhlciBwYWNrYWdlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBNYWtlZmlsZS5hbToKKwkgIEluY2x1ZGUgbGNvdi5tYWsgdG8gYWxsb3cgYnVpbGdpbmcgY292ZXJhZ2UgcmVwb3J0cy4gR3VhcmQKKwkgIGNoZWNrLXRvcnR1cmUgdGFyZ2V0IGxpa2UgaW4gdGhlIG90aGVyIHBhY2thZ2VzLgorCisyMDA4LTAxLTA5IDEyOjMzOjU4ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IEltcGxlbWVudCBHc3RDaGlsZFByb3h5IGludGVyZmFjZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmV2aWV3ZWQgYnk6IEVkd2FyZCBIZXJ2ZXkgIDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgKGdzdF92aWRlb21peGVyX3NldF9tYXN0ZXJfZ2VvbWV0cnkpLCAoX2RvX2luaXQpLAorCSAgKGdzdF92aWRlb21peGVyX2NoaWxkX3Byb3h5X2dldF9jaGlsZF9ieV9pbmRleCksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfY2hpbGRfcHJveHlfZ2V0X2NoaWxkcmVuX2NvdW50KSwKKwkgIChnc3RfdmlkZW9taXhlcl9jaGlsZF9wcm94eV9pbml0KSwgKGdzdF92aWRlb21peGVyX3Jlc2V0KSwKKwkgIChnc3RfdmlkZW9taXhlcl9pbml0KSwgKGdzdF92aWRlb21peGVyX3JlcXVlc3RfbmV3X3BhZCksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfcmVsZWFzZV9wYWQpLCAoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9xdWV1ZXMpOgorCSAgSW1wbGVtZW50IEdzdENoaWxkUHJveHkgaW50ZXJmYWNlLgorCSAgU2VuZCBuZXdzZWdtZW50IGF0IHRoZSByaWdodCBtb21lbnQKKwkgIEZpeGVzICM0ODg4NzkKKworMjAwOC0wMS0wOSAxMjowMToxNCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2FscGhhLzogTWFrZSB0aGUgdmFyaW91cyBwcm9wZXJ0aWVzIG9mICdhbHBoYScgY29udHJvbGxhYmxlLiBUaGlzIGFsbG93cyBkb2luZyBuaWNldGllcyBsaWtlIGZhZGUtaW4vZmFkZS1vdXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FscGhhL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogKGdzdF9hbHBoYV9jbGFzc19pbml0KSwgKGdzdF9hbHBoYV9pbml0KSwKKwkgIChnc3RfYWxwaGFfc2lua19ldmVudCksIChnc3RfYWxwaGFfY2hhaW4pLAorCSAgKGdzdF9hbHBoYV9jaGFuZ2Vfc3RhdGUpLCAocGx1Z2luX2luaXQpOgorCSAgTWFrZSB0aGUgdmFyaW91cyBwcm9wZXJ0aWVzIG9mICdhbHBoYScgY29udHJvbGxhYmxlLiBUaGlzIGFsbG93cyBkb2luZworCSAgbmljZXRpZXMgbGlrZSBmYWRlLWluL2ZhZGUtb3V0LgorCisyMDA4LTAxLTA5IDExOjExOjAxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9ydHAvOiBSZW1vdmUgY29weS9wYXN0ZSB1bnVzZWQgY29kZSAocHJvcGVydHkgc2V0dGVycyBhbmQgZ2V0dGVyKSBmb3VuZCBieSB0aGUgY292ZXJhZ2Ugc3VpdGUgKHlheSwgc2F2ZXMgfjIwayBvbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJICBSZW1vdmUgY29weS9wYXN0ZSB1bnVzZWQgY29kZSAocHJvcGVydHkgc2V0dGVycyBhbmQgZ2V0dGVyKSBmb3VuZCBieQorCSAgdGhlIGNvdmVyYWdlIHN1aXRlICh5YXksIHNhdmVzIH4yMGsgb24gZGlzaykuCisKKzIwMDgtMDEtMDggMjA6MDM6MzAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogQWxzbyBmaXggdXAgcGFkIHRlbXBsYXRlcyB0byBpbmRpY2F0ZSB0aGF0IGltYWdlL2pwZWcgZG9lc24ndCBhYnNvbHV0ZWx5IHJlcXVpcmUgdGhlIGZyYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKENPTU1PTl9WSURFT19DQVBTX05PX0ZSQU1FUkFURSksCisJICAodmlkZW9zaW5rX3RlbXBsKToKKwkgIEFsc28gZml4IHVwIHBhZCB0ZW1wbGF0ZXMgdG8gaW5kaWNhdGUgdGhhdCBpbWFnZS9qcGVnIGRvZXNuJ3QKKwkgIGFic29sdXRlbHkgcmVxdWlyZSB0aGUgZnJhbWVyYXRlIHByb3BlcnR5IHRvIGJlIHNldCAoIzUwNDA4MSkuCisKKzIwMDgtMDEtMDggMTk6NTc6MjMgKzAwMDAgIFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguKjogS2VlcCB0cmFjayBvZiBmaXJzdCBhbmQgbGFzdCB0aW1lc3RhbXBzIGZvciBlYWNoIGluY29taW5nIHN0cmVhbSwgc28gd2UgY2FuIGNhbGN1bGF0ZSB0aC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBCYXNlZCBvbiBwYXRjaCBieTogV291dGVyIENsb2V0ZW5zICA8d291dGVyIGF0IG1pbmQgYmU+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfdmlkZW9fcGFkX3NldGNhcHMpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfcmVxdWVzdF9uZXdfcGFkKSwgKGdzdF9tYXRyb3NrYV9tdXhfcmVsZWFzZV9wYWQpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfZmluaXNoKSwgKGdzdF9tYXRyb3NrYV9tdXhfY29sbGVjdGVkKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgS2VlcCB0cmFjayBvZiBmaXJzdCBhbmQgbGFzdCB0aW1lc3RhbXBzIGZvciBlYWNoIGluY29taW5nIHN0cmVhbSwKKwkgIHNvIHdlIGNhbiBjYWxjdWxhdGUgdGhlIHRvdGFsIGR1cmF0aW9uIGZvciBsaXZlIHNvdXJjZXMgYW5kIG90aGVyCisJICBpbnB1dCB3aGVyZSB3ZSBjYW4ndCBxdWVyeSB0aGUgZHVyYXRpb24gZnJvbSB0aGUgc3RhcnQgb3Igd2hlcmUKKwkgIHRoZXJlJ3Mgbm8gY29uc3RhbnQgZnJhbWVyYXRlIGZyb20gd2hpY2ggd2UgY2FuIGRlZHVjZSB0aGUKKwkgIGR1cmF0aW9uOyBhbHNvIHVzZSBjYWxjdWxhdGVkL29ic2VydmVkIGR1cmF0aW9uIGlmIGl0IGlzIGJpZ2dlcgorCSAgdGhhbiB0aGUgcHJldmlvdXNseSBxdWVyaWVkIGR1cmF0aW9uLiBGdXJ0aGVybW9yZSwgdXNlCisJICBnc3RfcGFkX3F1ZXJ5X3BlZXJfZHVyYXRpb24oKSBhbmQgdGFrZSBpbnRvIGFjY291bnQgdGhhdCBpdCBtYXkKKwkgIHJldHVybiBUUlVFIGJ1dCBzdGlsbCBhIGR1cmF0aW9uIG9mIENMT0NLX1RJTUVfTk9ORSwgd2hpY2ggZWFzaWx5CisJICBzY3Jld3MgdXAgY29tcGFyaXNvbnMgd2hlbiB1c2luZyB1bnNpZ25lZCBpbnRlZ2Vycy4gRml4ZXMgIzUwNDA4MS4KKworMjAwOC0wMS0wOCAxNDo1ODoxOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBNYWtlIGVsZW1lbnRzIEdTVF9CVUZGRVJfRkxBR19HQVAgYXdhcmUgYW5kIGNhbGwgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9nYXBfYXdhcmUgZm9yIHRoaXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzoKKwkgIChnc3RfYXVkaW9fYW1wbGlmeV9jbGlwcGluZ19tZXRob2RfZ2V0X3R5cGUpLAorCSAgKGdzdF9hdWRpb19hbXBsaWZ5X2luaXQpLCAoZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6IChnc3RfYXVkaW9fZHluYW1pY19pbml0KSwKKwkgIChnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1faXApOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2ludmVydC5jOiAoZ3N0X2F1ZGlvX2ludmVydF9pbml0KSwKKwkgIChnc3RfYXVkaW9faW52ZXJ0X3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzogKGdzdF9hdWRpb19wYW5vcmFtYV9pbml0KSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtKToKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfaW5pdCk6CisJICBNYWtlIGVsZW1lbnRzIEdTVF9CVUZGRVJfRkxBR19HQVAgYXdhcmUgYW5kIGNhbGwKKwkgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfZ2FwX2F3YXJlIGZvciB0aGlzLgorCSAgQnVtcCBjb3JlIHJlcXVpcmVtZW50IHRvIENWUy4KKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGVieXNoZXZmcmVxYmFuZC5jOgorCSAgKGdzdF9hdWRpb19jaGVieXNoZXZfZnJlcV9iYW5kX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYnlzaGV2ZnJlcWxpbWl0LmM6CisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2xpbWl0X3RyYW5zZm9ybV9pcCk6CisJICBBbHNvIHN5bmMgR09iamVjdCBwcm9wZXJ0aWVzIHRvIHRoZSBjb250cm9sbGVyIGlmIG9wZXJhdGluZworCSAgaW4gcGFzc3Rocm91Z2ggbW9kZS4KKworMjAwOC0wMS0wNyAxNjo0MTowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzogRkFMU0UgaXMgbm90IGEgZ3BvaW50ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkgIChnc3RfZGlyZWN0ZHJhd19zaW5rX3dpbmRvd190aHJlYWQpOgorCSAgRkFMU0UgaXMgbm90IGEgZ3BvaW50ZXIuCisKKzIwMDgtMDEtMDUgMjE6MjA6MDggKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jOiBNYWtlIHN1cmUgd2UgY3JlYXRlIG91ciBpbnRlcm5hbCB3aW5kb3cgb25seSB3aGVuIHdlIG5lZWQgaXQuIFRoYXQgd2lsbCBnaXZlIGEgY2guLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwOC0wMS0wNSAgSnVsaWVuIE1vdXR0ZSAgPGp1bGllbkBmbHVlbmRvLmNvbT4KKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkgIChnc3RfZGlyZWN0ZHJhd19zaW5rX3NldF93aW5kb3dfaWQpLAorCSAgKGdzdF9kaXJlY3RkcmF3X3Npbmtfc2V0X2NhcHMpLAorCSAgKGdzdF9kaXJlY3RkcmF3X3NpbmtfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfZGlyZWN0ZHJhd19zaW5rX2J1ZmZlcl9hbGxvYyksCisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua19kcmF3X2JvcmRlcnMpLAorCSAgKGdzdF9kaXJlY3RkcmF3X3Npbmtfc2hvd19mcmFtZSksCisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua19zZXR1cF9kZHJhdyksCisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua193aW5kb3dfdGhyZWFkKSwKKwkgIChnc3RfZGlyZWN0ZHJhd19zaW5rX2dldF9kZHJhd2NhcHMpLAorCSAgKGdzdF9kaXJlY3RkcmF3X3Npbmtfc3VyZmFjZV9jcmVhdGUpOiBNYWtlIHN1cmUgd2UgY3JlYXRlIG91cgorCSAgaW50ZXJuYWwgd2luZG93IG9ubHkgd2hlbiB3ZSBuZWVkIGl0LiBUaGF0IHdpbGwgZ2l2ZSBhIGNoYW5jZSB0bworCSAgdGhlIGFwcGxpY2F0aW9uIHRvIGdldCB0aGUgcHJlcGFyZS14d2luZG93LWlkIGJ1cyBtZXNzYWdlLiBEcmF3CisJICBibGFjayBib3JkZXJzIHdoZW4ga2VlcGluZyBhc3BlY3QgcmF0aW8uIEhhbmRsZSB0aGUgY2FzZSB3aGVyZQorCSAgb3VyCisJICByZW5kZXJpbmcgd2luZG93IGRpc2FwcGVhcnMgKGNsb3NlZCBvciBlcnJvcnMpIGxpa2Ugb3RoZXIgc2lua3MKKwkgIGRvLiBWYXJpb3VzIDgwIGNvbHVtbnMgZml4ZXMsIGltcHJvdmUgc3RhdGUgY2hhbmdlIG9yZGVyLiBUaGF0CisJICBlbGVtZW50IGNvdWxkIG5lZWQgc29tZSBtb3JlIGxvdmUuCisKKzIwMDgtMDEtMDQgMTg6MzA6MjEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3RhZ2xpYi86IFJlbW92ZSB1c2VsZXNzIHR5cGVkZWZzIHdpdGhvdXQgbmV3IHR5cGUgbmFtZS4gRml4ZXMgYSB3YXJuaW5nIHdpdGggZ2NjIDQuMy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL2dzdGFwZXYybXV4Lmg6CisJICAqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguaDoKKwkgIFJlbW92ZSB1c2VsZXNzIHR5cGVkZWZzIHdpdGhvdXQgbmV3IHR5cGUgbmFtZS4gRml4ZXMgYSB3YXJuaW5nIHdpdGgKKwkgIGdjYyA0LjMuCisKKzIwMDgtMDEtMDMgMTI6MjY6MDMgKzAwMDAgIEpvaG4gTWlsbGlraW4gPGptaWxsaWtpbkBnbWFpbC5jb20+CisKKwkgIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogRW1pdCBtZXRhZGF0YSBtZXNzYWdlcyB3aGVuIGEgUElDVFVSRSBibG9jayBpcyBlbmNvdW50ZXJlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEpvaG4gTWlsbGlraW4gPGptaWxsaWtpbiBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfc2V0dXBfc2Vla2FibGVfZGVjb2RlciksCisJICAoZ3N0X2ZsYWNfZGVjX3NldHVwX3N0cmVhbV9kZWNvZGVyKSwKKwkgIChnc3RfZmxhY19ub3JtYWxpemVfcGljdHVyZV9taW1lX3R5cGUpLAorCSAgKGdzdF9mbGFjX2V4dHJhY3RfcGljdHVyZV9idWZmZXIpLAorCSAgKGdzdF9mbGFjX2RlY19tZXRhZGF0YV9jYWxsYmFjayk6CisJICBFbWl0IG1ldGFkYXRhIG1lc3NhZ2VzIHdoZW4gYSBQSUNUVVJFIGJsb2NrIGlzIGVuY291bnRlcmVkLgorCSAgRml4ZXMgIzUwNjcxNS4KKworMjAwOC0wMS0wMiAxMzo1NDoxMCArMDAwMCAgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmkuYzogaW5jcmVhc2UgcmFuayBiZWNhdXNlIG5vIGtub3duIGlzc3VlcyBhbnltb3JlIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpLmM6CisJICBpbmNyZWFzZSByYW5rIGJlY2F1c2Ugbm8ga25vd24gaXNzdWVzIGFueW1vcmUgLi4uCisJICAqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkgIHNlbmQgc3VidGl0bGUgbmFtZSB0byB0aGUgc3JjcGFkCisKKzIwMDctMTItMzEgMTM6Mjc6MzIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuKjogSW1wbGVtZW50IHJlZGlyZWN0IGZvciB0aGUgREVTQ1JJQkUgcmVwbHkuIEZpeGVzICM1MDYwMjUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc2VuZCksIChnc3RfcnRzcHNyY19vcGVuKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgSW1wbGVtZW50IHJlZGlyZWN0IGZvciB0aGUgREVTQ1JJQkUgcmVwbHkuIEZpeGVzICM1MDYwMjUuCisKKzIwMDctMTItMjkgMTY6NDg6MzMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiBGaXggJ3h5eiBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkJyBjb21waWxlciB3YXJuaW5ncyBjYXVzZWQgYnkgYnJva2VuIGdfYXNzZXJ0X25vdF9yZWFjaGVkKCkgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX3dyaXRlKToKKwkgIEZpeCAneHl6IG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQnIGNvbXBpbGVyIHdhcm5pbmdzIGNhdXNlZAorCSAgYnkgYnJva2VuIGdfYXNzZXJ0X25vdF9yZWFjaGVkKCkgbWFjcm8gaW4gR0xpYi0yLjE1LnggYW5kIGRvbid0CisJICBhYm9ydCgpIGluIGFueSBjYXNlIGJ1dCBwcm9wZXJseSByZXBvcnQgdGhlIGVycm9yLgorCisyMDA3LTEyLTI4IDExOjQ0OjI4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvc291cC86IFVzZSBnc3RfdGFnX2ZyZWVmb3JtX3N0cmluZ190b191dGY4KCkgYW5kIHBvc3QgcmFkaW8gc3RhdGlvbiBpbmZvIGFzIHRhZ3Mgb24gdGhlIGJ1cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc291cC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKGdzdF9zb3VwaHR0cF9zcmNfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX3VuaWNvZGlmeSksIChzb3VwX2dvdF9oZWFkZXJzKToKKwkgIFVzZSBnc3RfdGFnX2ZyZWVmb3JtX3N0cmluZ190b191dGY4KCkgYW5kIHBvc3QgcmFkaW8gc3RhdGlvbgorCSAgaW5mbyBhcyB0YWdzIG9uIHRoZSBidXMuCisKKzIwMDctMTItMjYgMTY6MDM6NTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIEZpeCAneHl6IG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQnIGNvbXBpbGVyIHdhcm5pbmdzIGNhdXNlZCBieSBicm9rZW4gZ19hc3NlcnRfbm90X3JlYWNoZWQoKSBtYWNybyBpbiBHTGliLTIuMTUueCAoaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfbG9vcCk6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2NoYWluKToKKwkgICogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzogKGNvbXBvc2l0ZV9waXhlbCk6CisJICBGaXggJ3h5eiBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkJyBjb21waWxlciB3YXJuaW5ncyBjYXVzZWQKKwkgIGJ5IGJyb2tlbiBnX2Fzc2VydF9ub3RfcmVhY2hlZCgpIG1hY3JvIGluIEdMaWItMi4xNS54IChpdCdzCisJICBub3QgcmVhbGx5IG5pY2UgdG8gYWJvcnQgaW4gYW55IGNhc2UpLiBGaXhlcyAjNTA1NzQ1LgorCisyMDA3LTEyLTIwIDE3OjA3OjIyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvOiBJZ25vcmUgbW9yZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyLy5jdnNpZ25vcmU6CisJICAqIGdzdC9zd2l0Y2gvLmN2c2lnbm9yZToKKwkgIElnbm9yZSBtb3JlLgorCisyMDA3LTEyLTE4IDIzOjE3OjE0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdmlzdWJ0aXRsZS5jOiBTbWFsbCB1bml0IHRlc3QgZml4IChoYXMgbm8gcHJhY3RpY2FsIGltcGFjdCBhdCB0aGUgbW9tZW50LCBzaW5jZSB3ZSdyZSBvbmx5IGZlZWQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdmlzdWJ0aXRsZS5jOiAoY2hlY2tfY29ycmVjdF9idWZmZXIpOgorCSAgU21hbGwgdW5pdCB0ZXN0IGZpeCAoaGFzIG5vIHByYWN0aWNhbCBpbXBhY3QgYXQgdGhlIG1vbWVudCwKKwkgIHNpbmNlIHdlJ3JlIG9ubHkgZmVlZGluZyB1dGY4IGFuZCBoZW5jZSBqdXN0IGNyZWF0ZSBhIHN1Yi0KKwkgIGJ1ZmZlciBmb3IgdGhlIG91dHB1dCkuCisKKzIwMDctMTItMTggMjE6MTM6MDUgKzAwMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkgIEFkZCBzZWVraW5nIHN1cHBvcnQgZm9yIGF2aSBzdWJ0aXRsZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpc3VidGl0bGUuYzoKKwkgIEFkZCBzZWVraW5nIHN1cHBvcnQgZm9yIGF2aSBzdWJ0aXRsZQorCisyMDA3LTEyLTE4IDE3OjQwOjM0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLio6IFJlbW92ZSBzb21lIHVudXNlZCB2YXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjX2RlY19yZXNldF9kZWNvZGVycyksCisJICAoZ3N0X2ZsYWNfZGVjX3VwZGF0ZV9tZXRhZGF0YSksIChnc3RfZmxhY19kZWNfbWV0YWRhdGFfY2FsbGJhY2spLAorCSAgKGdzdF9mbGFjX2RlY193cml0ZSk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkgIFJlbW92ZSBzb21lIHVudXNlZCB2YXJzLgorCSAgRG8gbW9yZSBjbGVhbnVwIG9mIGxlZnRvdmVyIGV2ZW50cyBhbmQgdGFncy4KKwkgIE91dHB1dCB0YWdzIGFmdGVyIHRoZSBzZWdtZW50IGV2ZW50LiBGaXhlcyAjNTA0MDE4LgorCisyMDA3LTEyLTE4IDE0OjMxOjM2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmM6IERldGVjdCBvdGhlciBVVEYgYnl0ZSBvcmRlciBtYXJrZXJzIGFuZCBjb252ZXJ0IHRvIFVURi04IGFzIGFwcHJvcHJpYXRlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzogKElTX0JPTV9VVEY4KSwgKElTX0JPTV9VVEYxNl9CRSksCisJICAoSVNfQk9NX1VURjE2X0xFKSwgKElTX0JPTV9VVEYzMl9CRSksIChJU19CT01fVVRGMzJfTEUpLAorCSAgKGdzdF9hdmlfc3VidGl0bGVfZXh0cmFjdF9maWxlKSwgKGdzdF9hdmlfc3VidGl0bGVfcGFyc2VfZ2FiMl9jaHVuayk6CisJICBEZXRlY3Qgb3RoZXIgVVRGIGJ5dGUgb3JkZXIgbWFya2VycyBhbmQgY29udmVydCB0byBVVEYtOCBhcworCSAgYXBwcm9wcmlhdGUuCisKKzIwMDctMTItMTggMTM6MzA6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuKjogUmVmYWN0b3IgYSBiaXQ7IGZpeCBuYW1lIGV4dHJhY3Rpb247IGRvbid0IGFzc3VtZSBhbGwgdGhlIGRhdGEgaW4gdGhlIGNodW5rIGlzIGFjdHVhbGx5IHN1Yi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYzogKHNyY190ZW1wbGF0ZSksCisJICAoZ3N0X2F2aV9zdWJ0aXRsZV9leHRyYWN0X3V0ZjhfZmlsZSksCisJICAoZ3N0X2F2aV9zdWJ0aXRsZV9wYXJzZV9nYWIyX2NodW5rKSwgKGdzdF9hdmlfc3VidGl0bGVfY2hhaW4pLAorCSAgKGdzdF9hdmlfc3VidGl0bGVfYmFzZV9pbml0KSwgKGdzdF9hdmlfc3VidGl0bGVfY2xhc3NfaW5pdCksCisJICAoZ3N0X2F2aV9zdWJ0aXRsZV9pbml0KSwgKGdzdF9hdmlfc3VidGl0bGVfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L2F2aS9nc3RhdmlzdWJ0aXRsZS5oOgorCSAgUmVmYWN0b3IgYSBiaXQ7IGZpeCBuYW1lIGV4dHJhY3Rpb247IGRvbid0IGFzc3VtZSBhbGwgdGhlIGRhdGEKKwkgIGluIHRoZSBjaHVuayBpcyBhY3R1YWxseSBzdWJ0aXRsZSBkYXRhLCB0aGVyZSBtYXkgYmUgcGFkZGluZyBhdAorCSAgdGhlIGVuZDsgZml4IEdTVF9FTEVNRU5UX0VSUk9SIHVzYWdlOyBzdG9yZSBleHRyYWN0ZWQgc3VidGl0bGUKKwkgIGZpbGUgc28gaXQncyB0aGVyZSB0byBzZW5kIGFnYWluIGFmdGVyIGEgc2VlayAoZm9yIGZ1dHVyZSB1c2UpLgorCisyMDA3LTEyLTE4IDA5OjEzOjEyICswMDAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJICBBZGQgYXZpIHN1YnRpdGxlIGVsZW1lbnQgZm9yIGJ1ZyAjNDQyMDM0LiBOZWVkIHNlZWtpbmcgc3VwcG9ydCBhbmQgbW9yZSBzdXBwb3J0IGZvciBjaGFyYWN0ZXIgY29udmVyc2lvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXZpL2dzdGF2aS5jOgorCSAgKiBnc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmM6CisJICAqIGdzdC9hdmkvZ3N0YXZpc3VidGl0bGUuaDoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aXN1YnRpdGxlLmM6CisJICAqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIEFkZCBhdmkgc3VidGl0bGUgZWxlbWVudCBmb3IgYnVnICM0NDIwMzQuIE5lZWQgc2Vla2luZyBzdXBwb3J0CisJICBhbmQgbW9yZSBzdXBwb3J0IGZvciBjaGFyYWN0ZXIgY29udmVyc2lvbi4KKworMjAwNy0xMi0xOCAwOTowNzoxNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgTWFrZWZpbGUuYW06IEluY2x1ZGUgY29tbW9uL3dpbjMyLm1hayBmb3IgQ1JMRiBjaGVjayBvZiB3aW4zMiBwcm9qZWN0IGZpbGVzIChzZWUgIzM5MzYyNikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogTWFrZWZpbGUuYW06CisJICBJbmNsdWRlIGNvbW1vbi93aW4zMi5tYWsgZm9yIENSTEYgY2hlY2sgb2Ygd2luMzIgcHJvamVjdAorCSAgZmlsZXMgKHNlZSAjMzkzNjI2KS4KKwkgICogd2luMzIvdnM2L2xpYmdzdHBuZy5kc3A6CisJICBGaXggbGluZSBlbmRpbmdzIGFuZCBkbyBjdnMgYWRtaW4gLWtiLgorCisyMDA3LTEyLTE3IDIxOjEyOjI4ICswMDAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSAgZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuKjogV2hlbiBzdWJzZXF1ZW50IGZpbGVzIGFyZSByZWFkLCBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LCBzZW5kIGFuIEVPUyBpbnN0ZWFkIG9mIGNhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkgICogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuaDoKKwkgIFdoZW4gc3Vic2VxdWVudCBmaWxlcyBhcmUgcmVhZCwgaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCwgc2VuZAorCSAgYW4gRU9TIGluc3RlYWQgb2YgY2F1c2luZyBhbiBlcnJvci4KKworMjAwNy0xMi0xNiAyMzo0Mzo0NiArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiBBY3R1YWxseSBkcm9wIHRoZSBidWZmZXJzIHdoaWNoIGFyZSBvdXRzaWRlIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBzZWdtZW50IGluc3RlYWQgb2YganVzdCBlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdfZGVjX2NoYWluKToKKwkgIEFjdHVhbGx5IGRyb3AgdGhlIGJ1ZmZlcnMgd2hpY2ggYXJlIG91dHNpZGUgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkCisJICBzZWdtZW50IGluc3RlYWQgb2YganVzdCBlbWl0dGluZyBhIFdBUk5JTkcuCisKKzIwMDctMTItMTQgMTg6NDk6MzQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9mbGFjL2dzdGZsYWNkZWMuKjogU2VuZCBzZWdtZW50cyBmcm9tIHRoZSBzdHJlYW1pbmcgdGhyZWFkLiBGaXhlcyAjNTAyMTg3LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjX2RlY19tZXRhZGF0YV9jYWxsYmFjayksCisJICAoZ3N0X2ZsYWNfZGVjX3dyaXRlKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgU2VuZCBzZWdtZW50cyBmcm9tIHRoZSBzdHJlYW1pbmcgdGhyZWFkLiBGaXhlcyAjNTAyMTg3LgorCSAgRml4IHNlZ21lbnQgc2Vla2luZyBhbmQgYSBidW5jaCBvZiBvdGhlciBzZWVraW5nIGNhc2VzLgorCisyMDA3LTEyLTE0IDEwOjE3OjEwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogUGFyc2UgV09BRiBmcmFtZXMgYW5kIHB1dCB0aGUgcmVzdWx0IGludG8gR1NUX1RBR19DT05UQUNULCB3aGljaCBpcyB3aGVyZSBpdCB3b3VsZCBlbmQgdXAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKHBhcnNlX3VybF9saW5rX2ZyYW1lKToKKwkgIFBhcnNlIFdPQUYgZnJhbWVzIGFuZCBwdXQgdGhlIHJlc3VsdCBpbnRvIEdTVF9UQUdfQ09OVEFDVCwKKwkgIHdoaWNoIGlzIHdoZXJlIGl0IHdvdWxkIGVuZCB1cCBpZiB0aGUgc2FtZSBpbmZvcm1hdGlvbiB3YXMKKwkgIHB1dCBpbiBhIHZvcmJpcyBjb21tZW50IChkb24ndCB0aGluayBpdCdzIHdvcnRoIGFkZGluZyBhCisJICBuZXcgVVJJIHRhZyBmb3IgdGhpcykuIEZpeGVzICM0ODgxMTIuCisKKzIwMDctMTItMTEgMjI6Mjk6MTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogV2UgbmVlZCBjb3JlL2Jhc2UgMC4xMC4xNSBvciBsYXRlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBXZSBuZWVkIGNvcmUvYmFzZSAwLjEwLjE1IG9yIGxhdGVyLgorCisyMDA3LTEyLTExIDE2OjQ3OjEyICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorCisJICBnc3QvYXZpL2dzdGF2aW11eC5jOiBGaXggcmVncmVzc2lvbiBpbiBzdHJlYW0gbnVtYmVyaW5nLiBGaXhlcyAjNTAyNjU1LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3IHNreW5ldCBiZT4KKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmlfbXV4X3N0YXJ0X2ZpbGUpOgorCSAgRml4IHJlZ3Jlc3Npb24gaW4gc3RyZWFtIG51bWJlcmluZy4gRml4ZXMgIzUwMjY1NS4KKworMjAwNy0xMi0xMSAxNjozOTozOSArMDAwMCAgV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKworCSAgZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuKjogRG8gbm90IHRyeSB0byB1bnBhdXNlIEkvTyBpbiB0aGUgInF1ZXVlZCIgc3RhdGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBXb3V0ZXIgQ2xvZXRlbnMgPHdvdXRlciBhdCBtaW5kIGRvdCBiZT4KKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKF9kb19pbml0KSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3NvdXBodHRwX3NyY19pbml0KSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX2Rpc3Bvc2UpLCAoZ3N0X3NvdXBodHRwX3NyY19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfZ2V0X3Byb3BlcnR5KSwgKHVuaWNvZGlmeSksCisJICAoZ3N0X3NvdXBodHRwX3NyY191bmljb2RpZnkpLCAoZ3N0X3NvdXBodHRwX3NyY19jcmVhdGUpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfc3RhcnQpLCAoZ3N0X3NvdXBodHRwX3NyY19zdG9wKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX3VubG9jayksIChnc3Rfc291cGh0dHBfc3JjX3VubG9ja19zdG9wKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX2dldF9zaXplKSwgKGdzdF9zb3VwaHR0cF9zcmNfaXNfc2Vla2FibGUpLAorCSAgKHNvdXBfZ290X2hlYWRlcnMpLCAoc291cF9nb3RfYm9keSksIChzb3VwX2ZpbmlzaGVkKSwKKwkgIChzb3VwX2dvdF9jaHVuayksIChzb3VwX3Jlc3BvbnNlKSwgKHNvdXBfcGFyc2Vfc3RhdHVzKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX3VyaV9nZXRfdHlwZSksCisJICAoZ3N0X3NvdXBodHRwX3NyY191cmlfZ2V0X3Byb3RvY29scyksCisJICAoZ3N0X3NvdXBodHRwX3NyY191cmlfZ2V0X3VyaSksIChnc3Rfc291cGh0dHBfc3JjX3VyaV9zZXRfdXJpKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX3VyaV9oYW5kbGVyX2luaXQpOgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgRG8gbm90IHRyeSB0byB1bnBhdXNlIEkvTyBpbiB0aGUgInF1ZXVlZCIgc3RhdGUuCisJICBSZW9yZ2FuaXNlIGEgYnVuY2ggb2YgdGhpbmdzIGFuZCBjbGVhbnVwcy4KKwkgIFVzZXMgR19HVUlOVDY0X0ZPUk1BVCBpbnN0ZWFkIG9mIGhhcmQtY29kaW5nICVsbHUuCisJICBTZWUgIzUwMjMzNS4KKworMjAwNy0xMi0xMSAxNjozMTo0OSArMDAwMCAgV2FpLU1pbmcgSG8gPHdlYnJlZ2JveEB5YWhvby5jby51az4KKworCSAgZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lio6IFVzZSBoaWdoZXIgcGVyZm9ybWFuY2Ugc3RhcnQtY29kZSBzZWFyY2hpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBXYWktTWluZyBIbyA8d2VicmVnYm94IGF0IHlhaG9vIGRvdCBjbyBkb3QgdWs+CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOiAoZ3N0X3J0cF9oMjY0X3BheV9pbml0KSwKKwkgIChnc3RfcnRwX2gyNjRfcGF5X2ZpbmFsaXplKSwgKGdzdF9ydHBfaDI2NF9wYXlfc2V0Y2FwcyksCisJICAobmV4dF9zdGFydF9jb2RlKSwgKGlzX25hbF9lcXVhbCksIChnc3RfcnRwX2gyNjRfcGF5X2RlY29kZV9uYWwpLAorCSAgKGVuY29kZV9iYXNlNjQpLCAoZ3N0X3J0cF9oMjY0X3BheV9wYXJzZV9zcHNfcHBzKSwKKwkgIChnc3RfcnRwX2gyNjRfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRwYXkuaDoKKwkgIFVzZSBoaWdoZXIgcGVyZm9ybWFuY2Ugc3RhcnQtY29kZSBzZWFyY2hpbmcuCisJICBQYXJzZSBOQUxzIGFuZCBzdG9yZSBTUFMsIFBQUyBhbmQgcHJvZmlsZSBpbiB0aGUgY2FwcyBzbyB0aGF0IHRoZXkgY2FuCisJICBiZSB1c2VkIGluIHRoZSBTRFAuIEZpeGVzICM1MDI4MTQuCisKKzIwMDctMTItMTEgMTE6NTA6NTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHN5cy92NGwyLzogSW5pdCBzb21lIHN0cnVjdHMgdG8gemVybyBiZWZvcmUgd2UgcGFzcyB0aGVtIHRvIGlvY3RsLCB3aGljaCBhdm9pZHMgdmFsZ3JpbmQgd2FybmluZ3MuICBBbHNvIGZpeCBhIHNtYWxsIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogKGdzdF92NGwyX2ZpbGxfbGlzdHMpOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19maWxsX2Zvcm1hdF9saXN0KToKKwkgIEluaXQgc29tZSBzdHJ1Y3RzIHRvIHplcm8gYmVmb3JlIHdlIHBhc3MgdGhlbSB0byBpb2N0bCwgd2hpY2gKKwkgIGF2b2lkcyB2YWxncmluZCB3YXJuaW5ncy4gIEFsc28gZml4IGEgc21hbGwgbWVtb3J5IGxlYWsuCisKKzIwMDctMTItMTEgMTE6MDU6NTcgKzAwMDAgIFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisKKwkgIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzogQ29weSB0aW1lc3RhbXAgZnJvbSBpbnB1dCB0byBvdXRwdXQuIE5vdCB2ZXJ5IHBlcmZlY3QgeWV0IGJ1dCBiZXR0ZXIgdGhhbiBub3RoaW5nLiBGaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogV291dGVyIENsb2V0ZW5zIDx3b3V0ZXIgYXQgbWluZCBkb3QgYmU+CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzogKGdzdF9tdWx0aXBhcnRfZGVtdXhfY2hhaW4pOgorCSAgQ29weSB0aW1lc3RhbXAgZnJvbSBpbnB1dCB0byBvdXRwdXQuIE5vdCB2ZXJ5IHBlcmZlY3QgeWV0IGJ1dCBiZXR0ZXIKKwkgIHRoYW4gbm90aGluZy4gRml4ZXMgIzUwMzAyMy4KKworMjAwNy0xMi0wOSAxNjo0OTowOSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IEFsc28gcHJpbnQgYSB1c2VmdWwgZXJyb3IgbWVzc2FnZSB3aXRoIHRoZSBvbGQgV2F2cGFjayBBUEkgaWYgcG9zc2libGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX2NoYWluKToKKwkgIEFsc28gcHJpbnQgYSB1c2VmdWwgZXJyb3IgbWVzc2FnZSB3aXRoIHRoZSBvbGQgV2F2cGFjayBBUEkKKwkgIGlmIHBvc3NpYmxlLgorCisyMDA3LTEyLTA5IDE2OjM0OjA4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IE1vcmUgYnVpbGQgZml4ZXMgZm9yIG9sZCBsaWJ3YXZwYWNrIHZlcnNpb25zOiBpbmNsdWRlIGNvbmZpZy5oIHNvIHRoYXQgV0FWUEFDS19PTERfQVBJIGkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6CisJICBNb3JlIGJ1aWxkIGZpeGVzIGZvciBvbGQgbGlid2F2cGFjayB2ZXJzaW9uczogaW5jbHVkZSBjb25maWcuaCBzbworCSAgdGhhdCBXQVZQQUNLX09MRF9BUEkgaXMgYWN0dWFsbHkgZGVmaW5lZCBhcyBkZXRlY3RlZDsgb25seSB1c2UKKwkgIFdhdnBhY2tHZXRFcnJvck1lc3NhZ2UgaWYgaXQgaXMgYXZhaWxhYmxlLiBUaGlzIGZpeGVzIHRoZSBidWlsZAorCSAgb24gZGViaWFuIHN0YWJsZSBmb3IgbWUuCisKKzIwMDctMTItMDkgMTY6MjE6MDIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svOiBXb3JrYXJvdW5kIHRoZSBub24tZXhpc3RhbmNlIG9mIFdhdnBhY2tHZXRDaGFubmVsTWFzayBpbiBXYXZwYWNrIHZlcnNpb25zIGJlbG93IDQuNDAuMC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfY2hhaW4pOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9jcmVhdGVfc3JjX3BhZCk6CisJICBXb3JrYXJvdW5kIHRoZSBub24tZXhpc3RhbmNlIG9mIFdhdnBhY2tHZXRDaGFubmVsTWFzayBpbiBXYXZwYWNrCisJICB2ZXJzaW9ucyBiZWxvdyA0LjQwLjAuCisKKzIwMDctMTItMDkgMDU6MTM6NTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgY29uZmlndXJlLmFjOiBBbmQgbm93IGRvIGl0IHJpZ2h0IGZvciByZWFsLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQW5kIG5vdyBkbyBpdCByaWdodCBmb3IgcmVhbC4uLgorCisyMDA3LTEyLTA5IDA1OjA5OjU3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGNvbmZpZ3VyZS5hYzogQ29ycmVjdGx5IHJlc2V0ICRMSUJTIHRvIG5vdCBjb250YWluIC1sbS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBDb3JyZWN0bHkgcmVzZXQgJExJQlMgdG8gbm90IGNvbnRhaW4gLWxtLgorCisyMDA3LTEyLTA5IDA1OjAyOjE3ICswMDAwICBLd2FuZyBZdWwgU2VvIDxrd2FuZ3l1bC5zZW9AZ21haWwuY29tPgorCisJICBGaXggY29tcGlsYXRpb24gd2l0aCBNU1ZDIGJ5IHVzaW5nIGdzdF91dGlsX2d1aW50NjRfdG9fZ2RvdWJsZSgpIGFuZCBjaGVja2luZyBmb3IgcmludCgpIGFuZCBpbXBsZW1lbnRpbmcgaXQgb3Vyc2VsZiAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gYSBwYXRjaCBieTogS3dhbmcgWXVsIFNlbyA8a3dhbmd5dWwgZG90IHNlbyBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGV4dC9jYWlyby9nc3R0aW1lb3ZlcmxheS5jOgorCSAgKGdzdF9jYWlyb190aW1lX292ZXJsYXlfcHJpbnRfc21wdGVfdGltZSk6CisJICBGaXggY29tcGlsYXRpb24gd2l0aCBNU1ZDIGJ5IHVzaW5nIGdzdF91dGlsX2d1aW50NjRfdG9fZ2RvdWJsZSgpCisJICBhbmQgY2hlY2tpbmcgZm9yIHJpbnQoKSBhbmQgaW1wbGVtZW50aW5nIGl0IG91cnNlbGYgaWYgaXQgZG9lc24ndAorCSAgZXhpc3QuCisKKzIwMDctMTItMDkgMDQ6Mjk6MDggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgY29uZmlndXJlLmFjOiBEb24ndCBkZWZpbmUgR1NUX0RJU0FCTEVfREVQUkVDQVRFRCBmb3IgcmVsZWFzZXMuIEZpeGVzICM0OTgxODEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgRG9uJ3QgZGVmaW5lIEdTVF9ESVNBQkxFX0RFUFJFQ0FURUQgZm9yIHJlbGVhc2VzLiBGaXhlcyAjNDk4MTgxLgorCisyMDA3LTEyLTA4IDE2OjQ3OjMzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgc3lzL29zcy9nc3Rvc3NoZWxwZXIuYzogVmVyaWZ5IHRoYXQgdGhlIGZvcm1hdCByZXR1cm5lZCBhZnRlciB0aGUgaW9jdGwgaXMgdGhlIG9uZSB3ZSByZXF1ZXN0ZWQuIEl0IGlzIHZhbGlkIGZvciB0aGUgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zcy9nc3Rvc3NoZWxwZXIuYzoKKwkgIFZlcmlmeSB0aGF0IHRoZSBmb3JtYXQgcmV0dXJuZWQgYWZ0ZXIgdGhlIGlvY3RsIGlzIHRoZSBvbmUKKwkgIHdlIHJlcXVlc3RlZC4gSXQgaXMgdmFsaWQgZm9yIHRoZSBpb2N0bCB0byBzdWNjZWVkIHdoaWxlCisJICBzdWJzdGl0dXRpbmcgYW4gYWx0ZXJuYXRlICdzdXBwb3J0ZWQnIHNhbXBsZSBmb3JtYXQuCisKKzIwMDctMTItMDcgMjA6MDc6NDkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHN5cy9vc3MvOiBQb3N0IGRlY2VudCAoYW5kIHRyYW5zbGF0ZWQpIGVycm9yIG1lc3NhZ2Ugd2hlbiB3ZSBjYW4ndCBvcGVuIHRoZSBhdWRpbyBkZXZpY2UgZm9yIHNvbWUgcmVhc29uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3MvZ3N0b3NzYXVkaW8uYzogKHBsdWdpbl9pbml0KToKKwkgICogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3NzX3Npbmtfb3Blbik6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6IChnc3Rfb3NzX3NyY19vcGVuKToKKwkgIFBvc3QgZGVjZW50IChhbmQgdHJhbnNsYXRlZCkgZXJyb3IgbWVzc2FnZSB3aGVuIHdlIGNhbid0CisJICBvcGVuIHRoZSBhdWRpbyBkZXZpY2UgZm9yIHNvbWUgcmVhc29uLgorCisyMDA3LTEyLTA3IDE5OjI5OjM5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgc3lzL29zcy86IEFsbG93IHRoZSBBVURJT0RFViBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byByZWRpcmVjdCB1cyB0byBhIGRpZmZlcmVudCBkZWZhdWx0IE9TUyBkZXZpY2UsIGxpa2Ugc3VuYXVkaW9zaW5rLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zcy9nc3Rvc3NzaW5rLmM6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6CisJICBBbGxvdyB0aGUgQVVESU9ERVYgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcmVkaXJlY3QgdXMKKwkgIHRvIGEgZGlmZmVyZW50IGRlZmF1bHQgT1NTIGRldmljZSwgbGlrZSBzdW5hdWRpb3NpbmsgZG9lcworCSAgb24gU29sYXJpcyAobWFrZXMgYXVkaW8gcGxheSBhdXRvbWF0aWNhbGx5IG9uIFN1blJheXMpLgorCisyMDA3LTEyLTA2IDEyOjQ1OjUwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6IEZpeCBjb21waWxhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgKGdzdF9paXJfZXF1YWxpemVyX3RyYW5zZm9ybV9pcCk6CisJICBGaXggY29tcGlsYXRpb24uCisKKzIwMDctMTItMDYgMTI6NDI6MTEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzogRG9uJ3QgcHJvY2VzcyBidWZmZXJzIGluIHBhc3N0aHJvdWdoIG1vZGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIChnc3RfaWlyX2VxdWFsaXplcl90cmFuc2Zvcm1faXApOgorCSAgRG9uJ3QgcHJvY2VzcyBidWZmZXJzIGluIHBhc3N0aHJvdWdoIG1vZGUuCisKKzIwMDctMTItMDYgMTI6Mzc6NDMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ZpbHRlci86IFRoZSB0cmFuc2Zvcm0oKSBtZXRob2RzIGFyZSBub3QgY2FsbGVkIGluIHBhc3N0aHJvdWdoIG1vZGUgc28gdGhlcmUncyBubyBuZWVkIGZvciBjaGVja2luZyBpZiB0aGUgZWxlbWVuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ZpbHRlci9nc3RicHdzaW5jLmM6IChicHdzaW5jX3RyYW5zZm9ybSk6CisJICAqIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy5jOiAobHB3c2luY190cmFuc2Zvcm0pOgorCSAgVGhlIHRyYW5zZm9ybSgpIG1ldGhvZHMgYXJlIG5vdCBjYWxsZWQgaW4gcGFzc3Rocm91Z2ggbW9kZSBzbworCSAgdGhlcmUncyBubyBuZWVkIGZvciBjaGVja2luZyBpZiB0aGUgZWxlbWVudCBpcyBpbiBwYXNzdGhyb3VnaCBtb2RlLgorCisyMDA3LTEyLTA2IDEyOjI5OjI2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9maWx0ZXIvOiBTeW5jIHRoZSBHT2JqZWN0IHByb3BlcnRpZXMgd2l0aCB0aGUgY29udHJvbGxlciBldmVuIGluIHBhc3N0aHJvdWdoIG1vZGUgdG8gZ2V0IGNvbnNpc3RlbnQgcHJvcGVydHkgdmFsdWVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5jOiAoYnB3c2luY190cmFuc2Zvcm0pOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGxwd3NpbmNfdHJhbnNmb3JtKToKKwkgIFN5bmMgdGhlIEdPYmplY3QgcHJvcGVydGllcyB3aXRoIHRoZSBjb250cm9sbGVyIGV2ZW4gaW4gcGFzc3Rocm91Z2gKKwkgIG1vZGUgdG8gZ2V0IGNvbnNpc3RlbnQgcHJvcGVydHkgdmFsdWVzLgorCisyMDA3LTEyLTA2IDEyOjExOjI5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9hdWRpb2Z4LzogVGhlIHRyYW5zZm9ybV9pcCgpIG1ldGhvZHMgc2hvdWxkIGRvIG5vdGhpbmcgaWYgaW4gcGFzc3Rocm91Z2ggbW9kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzogKGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYnlzaGV2ZnJlcWJhbmQuYzoKKwkgIChnc3RfYXVkaW9fY2hlYnlzaGV2X2ZyZXFfYmFuZF90cmFuc2Zvcm1faXApOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJ5c2hldmZyZXFsaW1pdC5jOgorCSAgKGdzdF9hdWRpb19jaGVieXNoZXZfZnJlcV9saW1pdF90cmFuc2Zvcm1faXApOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuYzogKGdzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0LmM6IChnc3RfYXVkaW9faW52ZXJ0X3RyYW5zZm9ybV9pcCk6CisJICBUaGUgdHJhbnNmb3JtX2lwKCkgbWV0aG9kcyBzaG91bGQgZG8gbm90aGluZyBpZiBpbiBwYXNzdGhyb3VnaCBtb2RlLgorCSAgSXQgbWlnaHQgZ2V0IG5vbi13cml0YWJsZSBidWZmZXJzIGluIHRoYXQgY2FzZSBidXQgdGhlIGJ1ZmZlciBtaWdodAorCSAgYXMgd2VsbCBiZSB3cml0YWJsZS4KKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOiAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybSk6CisJICBUaGUgdHJhbnNmb3JtKCkgbWV0aG9kcyB3b24ndCBiZSBjYWxsZWQgaW4gcGFzc3Rocm91Z2ggbW9kZSBhbmQKKwkgIG90aGVyd2lzZSB0aGUgYnVmZmVyIGlzIGFsd2F5cyB3cml0YWJsZSBzbyBkb24ndCBjaGVjayBoZXJlLgorCisyMDA3LTEyLTA2IDExOjQ2OjIyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogRml4IHNlZWtpbmcgaW4gLndhdiBmaWxlcyBhZ2FpbiAoIzUwMTc3NSkuICBTb21lIHBlb3BsZSBzZWVtIHRvIHRoaW5rIHRoZXkgZG9uJ3QgbmVlZCB0byAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQpOgorCSAgRml4IHNlZWtpbmcgaW4gLndhdiBmaWxlcyBhZ2FpbiAoIzUwMTc3NSkuICBTb21lIHBlb3BsZSBzZWVtIHRvIHRoaW5rCisJICB0aGV5IGRvbid0IG5lZWQgdG8gdGVzdCB0aGVpciBjaGFuZ2VzIHdoZW4gdGhleSdyZSBqdXN0ICdyZWZsb3dpbmcnCisJICBzb21lIGNvZGUuCisKKzIwMDctMTItMDUgMTY6MDQ6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuKjogRml4IGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jOgorCSAgKGdzdF9hdXRvX3ZpZGVvX3NpbmtfY2xhc3NfaW5pdCksIChnc3RfYXV0b192aWRlb19zaW5rX2Rpc3Bvc2UpLAorCSAgKGdzdF9hdXRvX3ZpZGVvX3NpbmtfaW5pdCksCisJICAoZ3N0X2F1dG9fdmlkZW9fc2lua19jcmVhdGVfZWxlbWVudF93aXRoX3ByZXR0eV9uYW1lKSwKKwkgIChnc3RfYXV0b192aWRlb19zaW5rX2ZpbmRfYmVzdCksCisJICAoZ3N0X2F1dG9fdmlkZW9fc2lua19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdXRvX3ZpZGVvX3NpbmtfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5oOgorCSAgRml4IGRvY3MuCisJICBVc2Ugc2FtZSBlcnJvciByZXBvcnRpbmcgY29kZSBhcyBhdXRvYXVkaW9zaW5rLgorCSAgQWRkIHByb3BlcnR5IHRvIGZpbHRlciBzaW5rcyBiYXNlZCBvbiBjYXBzLiBPbmx5IHNlbGVjdCByYXcgdmlkZW8gc2lua3MKKwkgIGJ5IGRlZmF1bHQgZm9yIGJhY2t3YXJkcyBjb21wYXQuCisJICBBUEk6IEdzdEF1dG9WaWRlb1Npbms6OmZpbHRlci1jYXBzCisKKzIwMDctMTItMDUgMTY6MDI6MTUgKzAwMDAgIFRvbW1pIE15w7Zow6RuZW4gPGV4dC10b21taS5teW9oYW5lbkBub2tpYS5jb20+CisKKwkgIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuKjogQWRkIHByb3BlcnR5IHRvIGZpbHRlciBzaW5rcyBiYXNlZCBvbiBjYXBzLiBPbmx5IHNlbGVjdCByYXcgYXVkaW8gc2lua3MgYnkgZGVmYXVsdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVG9tbWkgTXnDtmjDpG5lbiAgPGV4dC10b21taSBkb3QgbXlvaGFuZW4gYXQgbm9raWEgZG90IGNvbT4KKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfY2xhc3NfaW5pdCksIChnc3RfYXV0b19hdWRpb19zaW5rX2Rpc3Bvc2UpLAorCSAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfaW5pdCksIChnc3RfYXV0b19hdWRpb19zaW5rX2ZpbmRfYmVzdCksCisJICAoZ3N0X2F1dG9fYXVkaW9fc2lua19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5oOgorCSAgQWRkIHByb3BlcnR5IHRvIGZpbHRlciBzaW5rcyBiYXNlZCBvbiBjYXBzLiBPbmx5IHNlbGVjdCByYXcgYXVkaW8gc2lua3MKKwkgIGJ5IGRlZmF1bHQgZm9yIGJhY2t3YXJkcyBjb21wYXQuICBGaXhlcyAjNDE3NDIwLgorCSAgQVBJOiBHc3RBdXRvQXVkaW9TaW5rOjpmaWx0ZXItY2FwcworCisyMDA3LTExLTI5IDExOjQwOjE1ICswMDAwICBBcmVrIEtvcmJpayA8YXJrYWRpbmlAZ21haWwuY29tPgorCisJICBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogSW5pdGlhbGlzZSBsaWJvaWwgaW4gcGx1Z2luX2luaXQoKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQXJlayBLb3JiaWsgPGFya2FkaW5pQGdtYWlsLmNvbT4KKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChwbHVnaW5faW5pdCk6CisJICBJbml0aWFsaXNlIGxpYm9pbCBpbiBwbHVnaW5faW5pdCgpCisKKzIwMDctMTEtMjkgMTA6NDk6MTggKzAwMDAgIFdvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+CisKKwkgIGNvbmZpZ3VyZS5hYzogQnVtcCBsaWJzb3VwIHJlcXVpcmVtZW50IGFzIGxpYnNvdXAgZG9lcyBub3Qgc3VwcG9ydCBhc3luYyBjbGllbnQgb3BlcmF0aW9uIHByaW9yIHRvIHZlcnNpb24gMi4yLjEwNCBhbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogV291dGVyIENsb2V0ZW5zIDx3b3V0ZXIgYXQgbWluZCBkb3QgYmU+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEJ1bXAgbGlic291cCByZXF1aXJlbWVudCBhcyBsaWJzb3VwIGRvZXMgbm90IHN1cHBvcnQgYXN5bmMgY2xpZW50CisJICBvcGVyYXRpb24gcHJpb3IgdG8gdmVyc2lvbiAyLjIuMTA0IGFuZCBpdCBoYXMgc29tZSBsZWFrcy4KKwkgICogZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuYzogKGdzdF9zb3VwaHR0cF9zcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3NvdXBodHRwX3NyY19pbml0KSwgKGdzdF9zb3VwaHR0cF9zcmNfZGlzcG9zZSksCisJICAoZ3N0X3NvdXBodHRwX3NyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3NvdXBodHRwX3NyY19jcmVhdGUpLAorCSAgKGdzdF9zb3VwaHR0cF9zcmNfc3RhcnQpLCAoZ3N0X3NvdXBodHRwX3NyY19zdG9wKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX3VubG9jayksIChnc3Rfc291cGh0dHBfc3JjX3VubG9ja19zdG9wKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX2dldF9zaXplKSwgKHNvdXBfZ290X2hlYWRlcnMpLCAoc291cF9nb3RfYm9keSksCisJICAoc291cF9maW5pc2hlZCksIChzb3VwX2dvdF9jaHVuayksIChzb3VwX3Jlc3BvbnNlKSwKKwkgIChzb3VwX3Nlc3Npb25fY2xvc2UpOgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgSW1wbGVtZW50IHVubG9jaygpLgorCSAgUGlja3MgdXAgdGhlIHNpemUgZnJvbSB0aGUgQ29udGVudC1MZW5ndGggaGVhZGVyIGFuZCBlbWl0IGEgZHVyYXRpb24KKwkgIG1lc3NhZ2UuCisJICBEb24ndCBsZWFrIHRoZSBHTWFpbkNvbnRleHQgb2JqZWN0LgorCSAgRml4ZXMgIzUwMDA5OS4KKworMjAwNy0xMS0yOSAxMDozNDoxOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogUG9zdCBlcnJvciBiZWZvcmUgc2VuZGluZyBFT1MuIEZpeGVzICM0OTkxNzguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKGdzdF9wbmdkZWNfdGFzayk6CisJICBQb3N0IGVycm9yIGJlZm9yZSBzZW5kaW5nIEVPUy4gRml4ZXMgIzQ5OTE3OC4KKworMjAwNy0xMS0yOCAyMTo1NDo1MCArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICB3aW4zMi92czYvOiBBZGQgYSBwcm9qZWN0IGZpbGUgZm9yIGxpYmdzdHBuZworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHdpbjMyL3ZzNi9nc3RfcGx1Z2luc19nb29kLmRzdzoKKwkgICogd2luMzIvdnM2L2xpYmdzdHBuZy5kc3A6CisJICBBZGQgYSBwcm9qZWN0IGZpbGUgZm9yIGxpYmdzdHBuZworCisyMDA3LTExLTI4IDE3OjQ4OjQ1ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5jOiBDb2RlIGJlYXV0aWZpY2F0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6IChnc3RfcnRwX2gyNjNfZGVwYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9oMjYzX2RlcGF5X3Byb2Nlc3MpOgorCSAgQ29kZSBiZWF1dGlmaWNhdGlvbi4KKwkgIEFkZGVkIGRlYnVnIHN0YXRlbWVudHMuCisJICBEb24ndCBiaXQtc2hpZnQgZXZlcnl0aGluZywganVzdCBkbyBvcGVyYXRpb25zIG9uIGxhc3QvZmlyc3QgYnl0ZQorCSAgaW5zdGVhZC4KKworMjAwNy0xMS0yNyAxMToxMTowOCArMDAwMCAgSmF5YXJhbWEgUy4gU2FudGFuYSA8c3VuZGFyc2FudGFuYUBnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6IEZpeCB3cm9uZyBjb21wYXJpc29uIGluIG92ZXJydW4gY2hlY2suIEZpeGVzICM0OTkyMzkgc29tZSBtb3JlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSmF5YXJhbWEgUy4gU2FudGFuYSA8c3VuZGFyc2FudGFuYSBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOiAoZ3N0X3J0cF9tcDRhX2RlcGF5X3Byb2Nlc3MpOgorCSAgRml4IHdyb25nIGNvbXBhcmlzb24gaW4gb3ZlcnJ1biBjaGVjay4gRml4ZXMgIzQ5OTIzOSBzb21lIG1vcmUuCisKKzIwMDctMTEtMjcgMDA6MDE6NDEgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5Lio6IEZpeCBoMjYzIGRlcGF5bG9hZGVyIHNvIHRoYXQgQU5ZIGgyNjMgZGVjb2RlciBjYW4gaGFuZGxlIHRoZSBvdXRnb2luZyBzdHJlYW0uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzogKGdzdF9ydHBfaDI2M19kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX2gyNjNfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5Lmg6CisJICBGaXggaDI2MyBkZXBheWxvYWRlciBzbyB0aGF0IEFOWSBoMjYzIGRlY29kZXIgY2FuIGhhbmRsZSB0aGUgb3V0Z29pbmcKKwkgIHN0cmVhbS4KKworMjAwNy0xMS0yNiAxOToxNzoxMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuKjogRml4IGRlcGF5bG9hZGluZyB3aGVuIG11bHRpcGxlIGZyYW1lcyBhcmUgaW5zaWRlIG9uZSBSVFAgcGFja2V0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBCYXNlZCBvbiBQYXRoIGJ5OiBKYXlhcmFtYSBTLiBTYW50YW5hIDxzdW5kYXJzYW50YW5hIGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6IChnc3RfcnRwX21wNGFfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9tcDRhX2RlcGF5X3Byb2Nlc3MpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5oOgorCSAgRml4IGRlcGF5bG9hZGluZyB3aGVuIG11bHRpcGxlIGZyYW1lcyBhcmUgaW5zaWRlIG9uZSBSVFAgcGFja2V0LgorCSAgRml4ZXMgIzQ5OTIzOS4KKworMjAwNy0xMS0yNiAxMjoyNjoyMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogQWRkIEdBUC1mbGFnIHN1cHBvcnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICBBZGQgR0FQLWZsYWcgc3VwcG9ydC4KKworMjAwNy0xMS0yNiAxMjowMToxMSArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzogUmVhZCB0aGUgSSBmbGFnIGZvciBNb2RlIEEgaDI2MyBydHAgc3RyZWFtIGFuZCBzZXQgdGhlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuYzogKGdzdF9ydHBfaDI2M19kZXBheV9wcm9jZXNzKToKKwkgIFJlYWQgdGhlIEkgZmxhZyBmb3IgTW9kZSBBIGgyNjMgcnRwIHN0cmVhbSBhbmQgc2V0IHRoZQorCSAgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQgYWNjb3JkaW5nbHkuCisJICBGaXhlcyAjNDk5MzgzCisKKzIwMDctMTEtMjYgMTA6MDg6MjAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IFVzZSBkaXNwb3NlIGFuZCBmaW5hbGl6ZS4gRGlzcG9zZSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgVXNlIGRpc3Bvc2UgYW5kIGZpbmFsaXplLiBEaXNwb3NlIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCisKKzIwMDctMTEtMjYgMTA6MDQ6NDkgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2xldmVsL2dzdGxldmVsLmM6IFJlbW92ZSBzb21lIGRlYWQgY29kZSBhbmQgZG8gY2xlYW51cHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICBSZW1vdmUgc29tZSBkZWFkIGNvZGUgYW5kIGRvIGNsZWFudXBzLgorCisyMDA3LTExLTI2IDA5OjEzOjQ4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy9zaW1wbGUtbGF1bmNoLWxpbmVzLmM6IEltcHJvdmUgdGhlIHRlc3RzIGJ5IGFsbG93aW5nIHRvIHNldCBhIHRhcmdldCBzdGF0ZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvc2ltcGxlLWxhdW5jaC1saW5lcy5jOgorCSAgSW1wcm92ZSB0aGUgdGVzdHMgYnkgYWxsb3dpbmcgdG8gc2V0IGEgdGFyZ2V0IHN0YXRlLgorCisyMDA3LTExLTI2IDA5OjA0OjE3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tlbmMuYzogRG9uJ3QgY2hlY2sgdGhlIGNhcHMgb2YgdGhlIG91dHB1dCBidWZmZXIgaWYgdGhleSdyZSBlcXVhbCBzb21lIG90aGVyIGNhcHMuIFRoZSBjYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tlbmMuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIERvbid0IGNoZWNrIHRoZSBjYXBzIG9mIHRoZSBvdXRwdXQgYnVmZmVyIGlmIHRoZXkncmUgZXF1YWwgc29tZQorCSAgb3RoZXIgY2Fwcy4gVGhlIGNhcHMgY2FuIGNoYW5nZSBpbiBhIGJhY2t3YXJkIGNvbXBhdGlibGUgd2F5CisJICBhbmQgZGlkIGF0IHRoaXMgcG9pbnQuCisKKzIwMDctMTEtMjQgMTQ6NTU6MDQgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEltcGxlbWVudCByZXZlcnNlIHBsYXliYWNrIHN1cHBvcnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDctMTEtMjQgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfZmluZF9zZWdtZW50KSwKKwkgIChnc3RfcXRkZW11eF9tb3ZlX3N0cmVhbSksIChnc3RfcXRkZW11eF9kb19zZWVrKSwKKwkgIChnc3RfcXRkZW11eF9zZWVrX3RvX3ByZXZpb3VzX2tleWZyYW1lKSwKKwkgIChnc3RfcXRkZW11eF9hY3RpdmF0ZV9zZWdtZW50KSwgKGdzdF9xdGRlbXV4X2FkdmFuY2Vfc2FtcGxlKSwKKwkgIChnc3RfcXRkZW11eF9sb29wX3N0YXRlX21vdmllKSwgKGdzdF9xdGRlbXV4X2xvb3ApOiBJbXBsZW1lbnQKKwkgIHJldmVyc2UgcGxheWJhY2sgc3VwcG9ydC4KKworMjAwNy0xMS0yMSAwOTo1Njo1NCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZmlsdGVyLzogUG9zdCBhIEdTVF9NRVNTQUdFX0xBVEVOQ1kgaWYgdGhlIGxhdGVuY3kgY2hhbmdlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzogKGJwd3NpbmNfc2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6IChscHdzaW5jX3NldF9wcm9wZXJ0eSk6CisJICBQb3N0IGEgR1NUX01FU1NBR0VfTEFURU5DWSBpZiB0aGUgbGF0ZW5jeSBjaGFuZ2VzLgorCisyMDA3LTExLTIxIDA4OjIxOjEwICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9lcXVhbGl6ZXIvOiBSZW1vdmUgcHJlc2V0IGlmYWNlIGFnYWluLiBXZSdsbCByZS1hZGQgdGhpcyBhZnRlciBpdHMgYmVlbiByZWxlYXNlZCBpbiAtZ29vZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIzYmFuZHMuYzoKKwkgIFJlbW92ZSBwcmVzZXQgaWZhY2UgYWdhaW4uIFdlJ2xsIHJlLWFkZCB0aGlzIGFmdGVyIGl0cyBiZWVuIHJlbGVhc2VkCisJICBpbiAtZ29vZC4KKworMjAwNy0xMS0yMCAxMzoxNDo0MCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrY29tbW9uLmM6IEFsc28gc2V0IHRoZSBjaGFubmVsIGxheW91dCBvbiB0aGUgV2F2cGFjayBjYXBzIGlmIHdlJ3JlIGhhdmluZyBhIG1vbm8gbGF5b3V0LiBPZiBjb3UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrY29tbW9uLmM6IChnc3Rfd2F2cGFja19zZXRfY2hhbm5lbF9sYXlvdXQpOgorCSAgQWxzbyBzZXQgdGhlIGNoYW5uZWwgbGF5b3V0IG9uIHRoZSBXYXZwYWNrIGNhcHMgaWYgd2UncmUgaGF2aW5nCisJICBhIG1vbm8gbGF5b3V0LiBPZiBjb3Vyc2Ugb25seSBkbyBpdCBmb3IgImF1ZGlvL3gtd2F2cGFjayIuCisKKzIwMDctMTEtMjAgMTM6MDg6NDUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svOiBBZGQgc3VwcG9ydCBmb3IgZW5jb2RpbmcsIHBhcnNpbmcgYW5kIGRlY29kaW5nIG11bHRpY2hhbm5lbCBmaWxlcyB3aXRoIHVwIHRvIDggY2hhbm5lbHMuIFRoaXMgYWxzbyBpbXByLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5jOgorCSAgKGdzdF93YXZwYWNrX2dldF9kZWZhdWx0X2NoYW5uZWxfbWFzayksCisJICAoZ3N0X3dhdnBhY2tfc2V0X2NoYW5uZWxfbGF5b3V0KSwKKwkgIChnc3Rfd2F2cGFja19nZXRfZGVmYXVsdF9jaGFubmVsX3Bvc2l0aW9ucyksCisJICAoZ3N0X3dhdnBhY2tfZ2V0X2NoYW5uZWxfbWFza19mcm9tX3Bvc2l0aW9ucyksCisJICAoZ3N0X3dhdnBhY2tfc2V0X2NoYW5uZWxfbWFwcGluZyk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tjb21tb24uaDoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX3Jlc2V0KSwKKwkgIChnc3Rfd2F2cGFja19kZWNfc2lua19zZXRfY2FwcyksIChnc3Rfd2F2cGFja19kZWNfY2hhaW4pOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmg6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogKGdzdF93YXZwYWNrX2VuY19yZXNldCksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2luaXQpLCAoZ3N0X3dhdnBhY2tfZW5jX3Npbmtfc2V0X2NhcHMpLAorCSAgKGdzdF93YXZwYWNrX2VuY19zZXRfd3BfY29uZmlnKSwgKGdzdF93YXZwYWNrX2VuY19wdXNoX2Jsb2NrKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfZml4X2NoYW5uZWxfb3JkZXIpLCAoZ3N0X3dhdnBhY2tfZW5jX2NoYWluKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfcmV3cml0ZV9maXJzdF9ibG9jayksCisJICAoZ3N0X3dhdnBhY2tfZW5jX3NpbmtfZXZlbnQpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmg6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2luZGV4X2FwcGVuZF9lbnRyeSksIChnc3Rfd2F2cGFja19wYXJzZV9yZXNldCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2Vfc2Nhbl90b19maW5kX3NhbXBsZSksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2Vfc2lua19ldmVudCksIChnc3Rfd2F2cGFja19wYXJzZV9jcmVhdGVfc3JjX3BhZCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfcHVzaF9idWZmZXIpLCAoZ3N0X3dhdnBhY2tfcGFyc2VfbG9vcCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIGVuY29kaW5nLCBwYXJzaW5nIGFuZCBkZWNvZGluZyBtdWx0aWNoYW5uZWwKKwkgIGZpbGVzIHdpdGggdXAgdG8gOCBjaGFubmVscy4gVGhpcyBhbHNvIGltcHJvdmVzIHRoZSByb2J1c3RuZXNzCisJICBvZiBwYXJzaW5nIHF1aXRlIGEgYml0LgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrc3RyZWFtcmVhZGVyLmM6CisJICAoZ3N0X3dhdnBhY2tfc3RyZWFtX3JlYWRlcl9yZWFkX2J5dGVzKSwKKwkgIChnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX2dldF9wb3MpLAorCSAgKGdzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfc2V0X3Bvc19hYnMpLAorCSAgKGdzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfc2V0X3Bvc19yZWwpLAorCSAgKGdzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfcHVzaF9iYWNrX2J5dGUpLAorCSAgKGdzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfZ2V0X2xlbmd0aCksCisJICAoZ3N0X3dhdnBhY2tfc3RyZWFtX3JlYWRlcl9jYW5fc2VlayksCisJICAoZ3N0X3dhdnBhY2tfc3RyZWFtX3JlYWRlcl93cml0ZV9ieXRlcyk6CisJICBJbXByb3ZlIGRlYnVnZ2luZy4KKworMjAwNy0xMS0yMCAxMjoyMDozOCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBleHQvbGlicG5nL2dzdHBuZ2RlYy4qOiBEb24ndCByZWxlYXNlIHRoZSBwbmctbWVtb3J5IGZyb20gd2l0aGluIHRoZSBjYWxsYmFjay4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5oOgorCSAgRG9uJ3QgcmVsZWFzZSB0aGUgcG5nLW1lbW9yeSBmcm9tIHdpdGhpbiB0aGUgY2FsbGJhY2suCisKKzIwMDctMTEtMjAgMTI6MTE6MTMgKzAwMDAgIFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6IERvbid0IGxlYWsgYnVmZmVyIGRhdGEgbWVtb3J5LiBGaXhlcyAjNDk4Mzk1LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUmVuw6kgU3RhZGxlciA8bWFpbCBhdCByZW5lc3RhZGxlciBkb3QgZGU+CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJICBEb24ndCBsZWFrIGJ1ZmZlciBkYXRhIG1lbW9yeS4gRml4ZXMgIzQ5ODM5NS4KKworMjAwNy0xMS0yMCAxMTo0NjoyOCArMDAwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSAgdGVzdHMvY2hlY2svcGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMuYzogVGVzdHMgZm9yICM0OTgzOTUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBSZW7DqSBTdGFkbGVyIDxtYWlsIGF0IHJlbmVzdGFkbGVyIGRvdCBkZT4KKwkgICogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMuYzoKKwkgIFRlc3RzIGZvciAjNDk4Mzk1LgorCisyMDA3LTExLTIwIDExOjQxOjEzICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgRml4IGJ1aWxkIG9uIE1hYyBPUyBYIDEwLjUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNy0xMS0yMCAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBleHQvdGFnbGliL2dzdHRhZ2xpYm11eC5jOiAoZ3N0X3RhZ19saWJfbXV4X3JlbmRlcl90YWcpLAorCSAgKGdzdF90YWdfbGliX211eF9hZGp1c3RfZXZlbnRfb2Zmc2V0cyk6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdGhlb3JhX2V4dGVuc2lvbik6CisJICAqIHN5cy9vc3hhdWRpby9NYWtlZmlsZS5hbToKKwkgICogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lmg6CisJICAqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5tOiBGaXggYnVpbGQgb24gTWFjIE9TIFggMTAuNQorCisyMDA3LTExLTE5IDIwOjMwOjE5ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9lcXVhbGl6ZXIvOiBBY3RpdmF0ZSBwcmVzZXQgaWZhY2UgYW5kIHVwbG9hZCB0d28gcHJlc2V0cyBoZXJlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5jOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5jOgorCSAgQWN0aXZhdGUgcHJlc2V0IGlmYWNlIGFuZCB1cGxvYWQgdHdvIHByZXNldHMgaGVyZS4KKworMjAwNy0xMS0xNiAwNTo1Mjo1NSArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkgIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOiBDaGFuZ2Ugc3RyY2FzZWNtcCgpIHRvIGdfc3RyY2FzZWNtcCgpLiAgRml4ZXMgIzQ5NzI5Mi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzoKKwkgIENoYW5nZSBzdHJjYXNlY21wKCkgdG8gZ19zdHJjYXNlY21wKCkuICBGaXhlcyAjNDk3MjkyLgorCisyMDA3LTExLTE1IDE4OjE5OjE5ICswMDAwICBKb3JkaSBKYWVuIFBhbGxhcmVzIDxqb3JkaWpwQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDJ0cGF5Lio6IEZpbGwgdGhlIE1UVSB3aXRoIGFzIG1hbnkgcGFja2V0cyBhcyBwb3NzaWJsZS4gRml4ZXMgIzQ5MTMyMy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEpvcmRpIEphZW4gUGFsbGFyZXMgPGpvcmRpanAgYXQgZ21haWwgZG90IGNvbT4KKwkgICogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmM6IChnc3RfcnRwX21wMnRfcGF5X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfbXAydF9wYXlfaW5pdCksIChnc3RfcnRwX21wMnRfcGF5X2ZpbmFsaXplKSwKKwkgIChnc3RfcnRwX21wMnRfcGF5X2ZsdXNoKSwgKGdzdF9ydHBfbXAydF9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydHBheS5oOgorCSAgRmlsbCB0aGUgTVRVIHdpdGggYXMgbWFueSBwYWNrZXRzIGFzIHBvc3NpYmxlLiBGaXhlcyAjNDkxMzIzLgorCisyMDA3LTExLTE1IDE3OjQ3OjQzICswMDAwICBUb21taSBNecO2aMOkbmVuIDxleHQtdG9tbWkubXlvaGFuZW5Abm9raWEuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IEZpeCBzb21lIG1vcmUgbGVha3MuIEZpeGVzICM0OTcwMDcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBUb21taSBNecO2aMOkbmVuICA8ZXh0LXRvbW1pIGRvdCBteW9oYW5lbiBhdCBub2tpYSBkb3QgY29tPgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zZXR1cF9zdHJlYW1zKToKKwkgIEZpeCBzb21lIG1vcmUgbGVha3MuIEZpeGVzICM0OTcwMDcuCisKKzIwMDctMTEtMTUgMTc6MzU6MTggKzAwMDAgIFRvbW1pIE15w7Zow6RuZW4gPGV4dC10b21taS5teW9oYW5lbkBub2tpYS5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogRml4IDMgcGFkIGxlYWtzLiBGaXhlcyAjNDk2OTgzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVG9tbWkgTXnDtmjDpG5lbiAgPGV4dC10b21taSBkb3QgbXlvaGFuZW4gYXQgbm9raWEgZG90IGNvbT4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWUpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdGNwKToKKwkgIEZpeCAzIHBhZCBsZWFrcy4gRml4ZXMgIzQ5Njk4My4KKworMjAwNy0xMS0xNSAxNzoyNjoyNSArMDAwMCAgV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKworCSAgQWRkZWQgSFRUUCBzb3VyY2UgYmFzZWQgb24gbGlic291cC4gRml4ZXMgIzQ5NzAyMC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFdvdXRlciBDbG9ldGVucyA8d291dGVyIGF0IG1pbmQgZG90IGJlPgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGV4dC9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NvdXAvTWFrZWZpbGUuYW06CisJICAqIGV4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmM6IChfZG9faW5pdCksCisJICAoZ3N0X3NvdXBodHRwX3NyY19iYXNlX2luaXQpLCAoZ3N0X3NvdXBodHRwX3NyY19jbGFzc19pbml0KSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX2luaXQpLCAoZ3N0X3NvdXBodHRwX3NyY19kaXNwb3NlKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX3NldF9wcm9wZXJ0eSksIChnc3Rfc291cGh0dHBfc3JjX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3NvdXBodHRwX3NyY19jcmVhdGUpLCAoZ3N0X3NvdXBodHRwX3NyY19zdGFydCksCisJICAoZ3N0X3NvdXBodHRwX3NyY19zdG9wKSwgKGdzdF9zb3VwaHR0cF9zcmNfdW5sb2NrKSwKKwkgIChnc3Rfc291cGh0dHBfc3JjX3NldF9sb2NhdGlvbiksIChzb3VwX2dvdF9jaHVuayksIChzb3VwX3Jlc3BvbnNlKSwKKwkgIChzb3VwX3Nlc3Npb25fY2xvc2UpLCAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5oOgorCSAgQWRkZWQgSFRUUCBzb3VyY2UgYmFzZWQgb24gbGlic291cC4gRml4ZXMgIzQ5NzAyMC4KKworMjAwNy0xMS0xNSAxNzowMTozMiArMDAwMCAgVG9tbWkgTXnDtmjDpG5lbiA8ZXh0LXRvbW1pLm15b2hhbmVuQG5va2lhLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzogRml4IHNtYWxsIGxlYWsuIEZpeGVzICM0OTcwMTcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBUb21taSBNecO2aMOkbmVuICA8ZXh0LXRvbW1pIGRvdCBteW9oYW5lbiBhdCBub2tpYSBkb3QgY29tPgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOiAoZ3N0X3J0cF9oMjY0X2RlcGF5X3NldGNhcHMpOgorCSAgRml4IHNtYWxsIGxlYWsuIEZpeGVzICM0OTcwMTcuCisKKzIwMDctMTEtMTUgMTY6MzE6MzIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4LzogQWRkIHN1cHBwb3J0IGZvciB0aGVvcmEgaW4gcXVpY2t0aW1lIGFjY29yZGluZyB0byBYaXBoUVQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcXRkZW11eF9wcmVwYXJlX2N1cnJlbnRfc2FtcGxlKSwKKwkgIChnc3RfcXRkZW11eF9sb29wX3N0YXRlX21vdmllKSwgKHF0ZGVtdXhfcGFyc2VfdGhlb3JhX2V4dGVuc2lvbiksCisJICAocXRkZW11eF9wYXJzZV9ub2RlKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayksIChxdGRlbXV4X3ZpZGVvX2NhcHMpOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4X2ZvdXJjYy5oOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4X3R5cGVzLmM6CisJICBBZGQgc3VwcHBvcnQgZm9yIHRoZW9yYSBpbiBxdWlja3RpbWUgYWNjb3JkaW5nIHRvIFhpcGhRVC4KKworMjAwNy0xMS0xNSAxMjoyMjoxMCArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBDaGFuZ2VMb2c6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmg6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICBBbHdheXMgY29weSBidWZmZXJzIGJ5IGRlZmF1bHQgKGhhbmRsZSBzYWZlciB3aXRoIGJ1Z2dlZCBkcml2ZXJzKSBhbmQgYWRkZWQgYSBwcm9wZXJ0eSB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSBtbWEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQWx3YXlzIGNvcHkgYnVmZmVycyBieSBkZWZhdWx0IChoYW5kbGUgc2FmZXIgd2l0aCBidWdnZWQgZHJpdmVycykgYW5kIGFkZGVkIGEgcHJvcGVydHkgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byB1c2UgbW1hcCBlZmZlY3RpdmVseSAobm8gY29weSBpZiBwb3NzaWJsZSkgd2hlbiBhcHBsaWNhdGlvbiB3YW50cyB0by4gRml4ZXM6ICM0ODA1NTcuCisKKzIwMDctMTEtMTQgMjE6Mzk6NDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pZDNkZW11eC86IFdlIGRvbid0IHdhbnQgdGhlIHNhbWUgc3RyaW5nIG11bHRpcGxlIHRpbWVzIGluIGEgdGFnIGxpc3QgZm9yIHRoZSBzYW1lIHRhZyBldmVyLCBmb3IgYW55IHRhZywgbm90IGp1cy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9pZDN0YWdzLmM6CisJICAqIGdzdC9pZDNkZW11eC9pZDN0YWdzLmg6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAoaWQzdjJfdGFnX3RvX3RhZ2xpc3QpOgorCSAgV2UgZG9uJ3Qgd2FudCB0aGUgc2FtZSBzdHJpbmcgbXVsdGlwbGUgdGltZXMgaW4gYSB0YWcgbGlzdCBmb3IgdGhlCisJICBzYW1lIHRhZyBldmVyLCBmb3IgYW55IHRhZywgbm90IGp1c3QgZm9yIEdTVF9UQUdfR0VOUkUsIHNvIG1ha2Ugc3VyZQorCSAgdGhpcyBkb2Vzbid0IGhhcHBlbiBhbmQgcmVtb3ZlIHNwZWNpYWwtY2FzZSBjb2RlIGZvciBHU1RfVEFHX0dFTlJFLgorCisyMDA3LTExLTE0IDIxOjA0OjEyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOiBXcml0ZSBHU1RfVEFHX01VU0lDQlJBSU5aX0RJU0NJRCBhbmQgR1NUX1RBR19DRERBX0NEREJfRElTQ0lEIGludG8gSUQzdjIgVFhYWCBmcmFtZXMgKGZpeGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOiAoYWRkX211c2ljYnJhaW56X3RhZyksIChhZGRfZnVuY3MpOgorCSAgV3JpdGUgR1NUX1RBR19NVVNJQ0JSQUlOWl9ESVNDSUQgYW5kIEdTVF9UQUdfQ0REQV9DRERCX0RJU0NJRAorCSAgaW50byBJRDN2MiBUWFhYIGZyYW1lcyAoZml4ZXMgIzM0Nzg0OCkuCisKKzIwMDctMTEtMTQgMjA6MzQ6MjQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogRG9uJ3QgbGVhayBzZHAgbWVzc2FnZSBjb250ZW50cyAoZml4ZXMgIzQ5Njc3MykuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfb3Blbik6CisJICBEb24ndCBsZWFrIHNkcCBtZXNzYWdlIGNvbnRlbnRzIChmaXhlcyAjNDk2NzczKS4KKwkgICogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6IChnc3RfdWRwc2lua19maW5hbGl6ZSk6CisJICBEb24ndCBsZWFrIFVSSSBzdHJpbmcuCisKKzIwMDctMTEtMTQgMTk6MTA6MzcgKzAwMDAgIEp1bGllbiBQdXlkdCA8anVsaWVuLnB1eWR0QGxhcG9zdGUubmV0PgorCisJICBleHQvcmF3MTM5NC86IEltcGxlbWVudCBHc3RQcm9wZXJ0eVByb2JlIGludGVyZmFjZSBhbmQgYWRkICJkZXZpY2UtbmFtZSIgcHJvcGVydHksIHNvIGFwcGxpY2F0aW9ucyBjYW4gdXNlIHRoaXMgdG8gcHIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEp1bGllbiBQdXlkdCA8anVsaWVuIGRvdCBwdXlkdCBhdCBsYXBvc3RlIG5ldD4KKwkgICogZXh0L3JhdzEzOTQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9yYXcxMzk0L2dzdDEzOTRwcm9iZS5jOiAoZ3N0XzEzOTRfZ2V0X2d1aWRfYXJyYXkpLAorCSAgKGdzdF8xMzk0X3Byb3BlcnR5X3Byb2JlX2dldF9wcm9wZXJ0aWVzKSwKKwkgIChnc3RfMTM5NF9wcm9wZXJ0eV9wcm9iZV9wcm9iZV9wcm9wZXJ0eSksCisJICAoZ3N0XzEzOTRfcHJvcGVydHlfcHJvYmVfbmVlZHNfcHJvYmUpLAorCSAgKGdzdF8xMzk0X3Byb3BlcnR5X3Byb2JlX2dldF92YWx1ZXMpLAorCSAgKGdzdF8xMzk0X3Byb3BlcnR5X3Byb2JlX2ludGVyZmFjZV9pbml0KSwKKwkgIChnc3RfMTM5NF90eXBlX2FkZF9wcm9wZXJ0eV9wcm9iZV9pbnRlcmZhY2UpOgorCSAgKiBleHQvcmF3MTM5NC9nc3QxMzk0cHJvYmUuaDogKEdTVF8xMzk0X1BST0JFX0gpOgorCSAgKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzogKF9kb19pbml0KSwgKGdzdF9kdjEzOTRzcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X2R2MTM5NHNyY19pbml0KSwgKGdzdF9kdjEzOTRzcmNfZGlzcG9zZSksCisJICAoZ3N0X2R2MTM5NHNyY19zZXRfcHJvcGVydHkpLCAoZ3N0X2R2MTM5NHNyY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9kdjEzOTRzcmNfZGlzY292ZXJfYXZjX25vZGUpLCAoZ3N0X2R2MTM5NHNyY19xdWVyeSksCisJICAoZ3N0X2R2MTM5NHNyY191cGRhdGVfZGV2aWNlX25hbWUpOgorCSAgKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuaDoKKwkgIEltcGxlbWVudCBHc3RQcm9wZXJ0eVByb2JlIGludGVyZmFjZSBhbmQgYWRkICJkZXZpY2UtbmFtZSIgcHJvcGVydHksCisJICBzbyBhcHBsaWNhdGlvbnMgY2FuIHVzZSB0aGlzIHRvIHByb2JlIGZvciBhdmFpbGFibGUgZGV2aWNlcyBpbiB0aGUKKwkgIHNhbWUgd2F5IHRoZXkgY2FuIGFscmVhZHkgd2l0aCB2NGxzcmMgYW5kIHY0bDJzcmMgKGhvd2V2ZXIgaG9ycmlibGUKKwkgIHRoaXMgcHJvcGVydHkgcHJvYmUgaW50ZXJmYWNlIG1heSBiZSkuIEZpeGVzICMzNTg4NDEuCisKKzIwMDctMTEtMTQgMTc6MDM6MTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvc3BlY3RydW0uYzogRml4IHNwZWN0cnVtIHVuaXQgdGVzdCBmb3IgdGhlIGxhdGVzdCBzcGVjdHJ1bSBjaGFuZ2VzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwZWN0cnVtLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBGaXggc3BlY3RydW0gdW5pdCB0ZXN0IGZvciB0aGUgbGF0ZXN0IHNwZWN0cnVtIGNoYW5nZXMuCisKKzIwMDctMTEtMTQgMTU6Mjk6MDUgKzAwMDAgIFRvbW1pIE15w7Zow6RuZW4gPGV4dC10b21taS5teW9oYW5lbkBub2tpYS5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogRG9uJ3QgbGVhayBldmVudCwgZG9uJ3QgbGVhayByYW5nZSAoZml4ZXMgIzQ5Njc1MikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBUb21taSBNecO2aMOkbmVuICA8ZXh0LXRvbW1pIGRvdCBteW9oYW5lbiBhdCBub2tpYSBkb3QgY29tPgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19oYW5kbGVfc3JjX2V2ZW50KSwKKwkgIChnc3RfcnRzcHNyY19wYXJzZV9yYW5nZSk6CisJICBEb24ndCBsZWFrIGV2ZW50LCBkb24ndCBsZWFrIHJhbmdlIChmaXhlcyAjNDk2NzUyKS4KKworMjAwNy0xMS0xNCAxMDoyMjo0MSArMDAwMCAgQXJlayBLb3JiaWsgPGFya2FkaW5pQGdtYWlsLmNvbT4KKworCSAgZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzogRGV0ZWN0IFJHQkEvQkdSQSBjb3JyZWN0bHkgb24gbGl0dGxlIGVuZGlhbiBzeXN0ZW1zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQXJlayBLb3JiaWsgPGFya2FkaW5pQGdtYWlsLmNvbT4KKwkgICogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzogKGdzdF9hbHBoYV9jb2xvcl9zZXRfY2Fwcyk6CisJICBEZXRlY3QgUkdCQS9CR1JBIGNvcnJlY3RseSBvbiBsaXR0bGUgZW5kaWFuIHN5c3RlbXMuCisKKzIwMDctMTEtMTMgMTc6MTk6MTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogYnV0IHRoZSBjb3JyZXNwb25kaW5nIGlvY3RsKCkgY2FsbCBmYWlscyBldmVuIHRob3VnaCB0aGUgZHJpdmVyIGNsYWltcyB0byBzdXBwb3J0IHRoaXMgZm9ybS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX3Byb2JlX2NhcHNfZm9yX2Zvcm1hdCk6CisJICBJZiBWSURJT0NfRU5VTV9GUkFNRVNJWkVTIGlzIGRlZmluZWQgKD0gcmVjZW50IGtlcm5lbCksIGJ1dCB0aGUKKwkgIGNvcnJlc3BvbmRpbmcgaW9jdGwoKSBjYWxsIGZhaWxzIGV2ZW4gdGhvdWdoIHRoZSBkcml2ZXIgY2xhaW1zIHRvCisJICBzdXBwb3J0IHRoaXMgZm9ybWF0LCBqdXN0IGZhbGwgYmFjayB0byB0aGUgcHJlLTIuNi4xOSBrZXJuZWwKKwkgIHJvdXRpbmUgdGhhdCBjcmVhdGVzIGNhcHMgd2l0aCBzdWl0YWJsZSBoZWlnaHQgYW5kIHdpZHRoIHJhbmdlcworCSAgKHNlZSAjNDQ4Mjc4KS4KKworMjAwNy0xMS0xMyAxNzowMTowNyArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3QHNreW5ldC5iZT4KKworCSAgZ3N0L21hdHJvc2thLzogRXh0cmFjdCBwYWxldHRlIGRhdGEgZm9yIGR2ZCBzdWJwaWN0dXJlIHN0cmVhbXMgYW5kIHNlbmQgaXQgZG93bnN0cmVhbSBhcyBjdXN0b20gZ3N0cmVhbWVyIGR2ZCBldmVudCAoLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXcgc2t5bmV0IGJlPgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcHVzaF9kdmRfY2x1dF9jaGFuZ2VfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3VidGl0bGVfY2Fwcyk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIEV4dHJhY3QgcGFsZXR0ZSBkYXRhIGZvciBkdmQgc3VicGljdHVyZSBzdHJlYW1zIGFuZCBzZW5kIGl0CisJICBkb3duc3RyZWFtIGFzIGN1c3RvbSBnc3RyZWFtZXIgZHZkIGV2ZW50IChmaXhlcyAjNDUzNDE3KS4KKworMjAwNy0xMS0xMyAxNDo1MTozMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6IEltcGxlbWVudCBtaW5pbWFsIHBhcnNpbmcgb2YgdGhlIHBhc3NlZCBwYW5nbyBmb250IGRlc2NyaXB0aW9uIHN0cmluZywgc28gcGFzc2luZyBhIGZvbnQgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6IChnc3RfdGV4dF9vdmVybGF5X2ZvbnRfaW5pdCk6CisJICBJbXBsZW1lbnQgbWluaW1hbCBwYXJzaW5nIG9mIHRoZSBwYXNzZWQgcGFuZ28gZm9udCBkZXNjcmlwdGlvbgorCSAgc3RyaW5nLCBzbyBwYXNzaW5nIGEgZm9udCBzaXplIHdvcmtzIHRoZSBzYW1lIGFzIHdpdGggdGhlCisJICBwYW5nbyB0ZXh0b3ZlcmxheSBwbHVnaW47IGZpeGVzICM0NTUwODYuCisJICAoTWF5YmUgd2UgY291bGQganVzdCB1c2UgcGFuZ29jYWlybyBoZXJlIGF0IHNvbWUgcG9pbnQpLgorCisyMDA3LTExLTEzIDA2OjU1OjI4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC86IFJldHVybiB0aGUgcmVzdWx0IGluIF9hY3RpdmF0ZV9wdWxsKCkuIERvbid0IHJlZiBlbGVtZW50IHRoZXJlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBSZXR1cm4gdGhlIHJlc3VsdCBpbiBfYWN0aXZhdGVfcHVsbCgpLiBEb24ndCByZWYgZWxlbWVudCB0aGVyZS4KKworMjAwNy0xMS0xMyAwNjoyMzo1MSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogUmVmIHRoZSBlbGVtZW50IHdoZW4gd2Ugc2hvdWxkLCBidXQgbm90IHdoZW4gd2UgaXRzIG5vdCBuZWVkZWQuIFJlZmxvdyB0aGUgZXZlbnRfaGFuZGxpbmcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksCisJICAoZ3N0X3dhdnBhcnNlX3BhZF9jb252ZXJ0KSwgKGdzdF93YXZwYXJzZV9wYWRfcXVlcnkpLAorCSAgKGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQpOgorCSAgUmVmIHRoZSBlbGVtZW50IHdoZW4gd2Ugc2hvdWxkLCBidXQgbm90IHdoZW4gd2UgaXRzIG5vdCBuZWVkZWQuIFJlZmxvdworCSAgdGhlIGV2ZW50X2hhbmRsaW5nIHRvIG5vdCBsZWFrIHRoZSBldmVudC4KKworMjAwNy0xMS0xMiAyMTowNzozMSArMDAwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSAgZ3N0L3JlcGxheWdhaW4vcmdhbmFseXNpcy5jOiBBdm9pZCBzbG93ZG93biBmcm9tIGRlbm9ybWFscyB3aGVuIHByb2Nlc3NpbmcgbmVhci1zaWxlbmNlIGlucHV0IGRhdGEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBSZW7DqSBTdGFkbGVyIDxtYWlsIGF0IHJlbmVzdGFkbGVyIGRvdCBkZT4KKwkgICogZ3N0L3JlcGxheWdhaW4vcmdhbmFseXNpcy5jOiAoeXVsZV9maWx0ZXIpOgorCSAgQXZvaWQgc2xvd2Rvd24gZnJvbSBkZW5vcm1hbHMgd2hlbiBwcm9jZXNzaW5nIG5lYXItc2lsZW5jZSBpbnB1dCBkYXRhLgorCSAgU3BvdHRlZCBieSBHYWJyaWVsIEJvdXZpZ25lLiBGaXhlcyAjNDk0NDk5LgorCisyMDA3LTExLTEyIDE3OjU5OjQwICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFByb3Blcmx5IGZyZWUgUVREZW11eFNhbXBsZXMgYXJyYXkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlKSwKKwkgIChxdGRlbXV4X3BhcnNlX3NhbXBsZXMpOgorCSAgUHJvcGVybHkgZnJlZSBRVERlbXV4U2FtcGxlcyBhcnJheS4KKwkgIFByb3RlY3QgdGFibGUgd3JpdGUgd2l0aCBhIHNlbnNpYmxlIGNoZWNrLCBzb21lIGZpbGVzIGFwcGFyZW50bHkgRE8gY29udGFpbgorCSAgc3R0cyB2YWx1ZXMgc3RhcnRpbmcgd2l0aCAwIDooCisKKzIwMDctMTEtMTIgMTc6MjE6NTkgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0LzogRHJvcCBFT1MgaW4gX2hhbmRsZV9zcmNfZXZlbnQoKS4gRml4IHRoZSByZWZjb3VudCBpbiBxdGRlbXV4IHRoYXQgcHJldmlvdXMgY29tbWl0IG1lc3NlZCB1cC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIERyb3AgRU9TIGluIF9oYW5kbGVfc3JjX2V2ZW50KCkuIEZpeCB0aGUgcmVmY291bnQgaW4gcXRkZW11eCB0aGF0CisJICBwcmV2aW91cyBjb21taXQgbWVzc2VkIHVwLgorCisyMDA3LTExLTEyIDE3OjA2OjMyICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC86IFN5bmMgX2hhbmRsZV9zcmNfZXZlbnQoKSB3aXRoIG9nZ2RlbXV4LiBJbiBhdmlkZW11eCBhbHNvIHJlZiB0aGUgZWxlbWVudCB3aGVuIHdlIHNob3VsZCwgYnV0IG5vdCB3aGVuIHdlIGl0cyBuby4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgU3luYyBfaGFuZGxlX3NyY19ldmVudCgpIHdpdGggb2dnZGVtdXguIEluIGF2aWRlbXV4IGFsc28gcmVmIHRoZQorCSAgZWxlbWVudCB3aGVuIHdlIHNob3VsZCwgYnV0IG5vdCB3aGVuIHdlIGl0cyBub3QgbmVlZGVkLgorCisyMDA3LTExLTExIDIxOjEyOjEwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC86IENoYW5nZSB0aGUgbWVhbmluZyBvZiB0aGUgbWFnbml0dWRlIHZhbHVlcyBnaXZlbiBpbiB0aGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2RlbW8uYzogKGRyYXdfc3BlY3RydW0pOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzogKGRyYXdfc3BlY3RydW0pOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1vc3NzcmMuYzogKGRyYXdfc3BlY3RydW0pOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogKGdzdF9zcGVjdHJ1bV9jbGFzc19pbml0KToKKwkgIENoYW5nZSB0aGUgbWVhbmluZyBvZiB0aGUgbWFnbml0dWRlIHZhbHVlcyBnaXZlbiBpbiB0aGUKKwkgIEdzdE1lc3NhZ2VzIGJ5IHNwZWN0cnVtIHRvIGRlY2liZWwgaW5zdGVhZCBvZgorCSAgZGVjaWJlbCt0aHJlc2hvbGQuCisKKzIwMDctMTEtMTEgMTM6NTU6MjcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2VxdWFsaXplci86IEFuZCBjb250aW51ZSB0byB1cGRhdGUgZG9jcy4gQWxzbyBpbmNsdWRlIHNvbWUgc2FtcGxlIGNvZGUgZm9yIHRoZSBuLWJhbmQgZXF1YWxpemVyIGluIHRoZSBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5jOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5jOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jOgorCSAgQW5kIGNvbnRpbnVlIHRvIHVwZGF0ZSBkb2NzLiBBbHNvIGluY2x1ZGUgc29tZSBzYW1wbGUgY29kZQorCSAgZm9yIHRoZSBuLWJhbmQgZXF1YWxpemVyIGluIHRoZSBkb2NzLgorCisyMDA3LTExLTExIDEyOjU0OjMxICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9lcXVhbGl6ZXIvOiBVcGRhdGUgZG9jcyBhbmQgcHJvcGVydHkgcmFuZ2VzIHRvIHRoZSByZWFsIHZhbHVlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkgIChnc3RfaWlyX2VxdWFsaXplcl8xMGJhbmRzX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5jOgorCSAgKGdzdF9paXJfZXF1YWxpemVyXzNiYW5kc19jbGFzc19pbml0KToKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuYzoKKwkgIFVwZGF0ZSBkb2NzIGFuZCBwcm9wZXJ0eSByYW5nZXMgdG8gdGhlIHJlYWwgdmFsdWVzLgorCisyMDA3LTExLTA5IDE3OjI3OjAwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiBOb3cgZG8gdGhlIHNjYWxpbmcgcmlnaHQgZm9yIHJlYWwuIEFsc28gaW5pdGlhbGl6ZSBhIHByZXZpb3VzbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgIE5vdyBkbyB0aGUgc2NhbGluZyByaWdodCBmb3IgcmVhbC4gQWxzbyBpbml0aWFsaXplIGEgcHJldmlvdXNseQorCSAgdW5pbml0aWFsaXplZCB2YXJpYWJsZS4KKworMjAwNy0xMS0wOCAxNTo1Njo0NiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvZXF1YWxpemVyL2RlbW8uYzogTWFrZSBkZWZhdWx0IHZvbHVtZSBhIGJpdCBsZXNzLiBJbXByb3ZlIGxheW91dCBieSBnaXZpbmcgbW9yZSBzcGFjZSB0byB0aGUgc2xpZGVyIHdpdGggYmlnLW51bWIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2RlbW8uYzoKKwkgIE1ha2UgZGVmYXVsdCB2b2x1bWUgYSBiaXQgbGVzcy4gSW1wcm92ZSBsYXlvdXQgYnkgZ2l2aW5nIG1vcmUgc3BhY2UgdG8KKwkgIHRoZSBzbGlkZXIgd2l0aCBiaWctbnVtYmVycyBhbmQgZW5hYmxlIGZpbGwuCisKKzIwMDctMTEtMDggMTU6MDA6NDAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IFJldHVybiBGQUxTRSBpZiB3ZSBjYW4ndCBoYW5kbGUgYSBxdWVyeSBpbnN0ZWFkIG9mIGNoYW5naW5nIHRoZSBmb3JtYXQuIElnbm9yZSBmYWN0IHdoZW4gLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBSZXR1cm4gRkFMU0UgaWYgd2UgY2FuJ3QgaGFuZGxlIGEgcXVlcnkgaW5zdGVhZCBvZiBjaGFuZ2luZyB0aGUKKwkgIGZvcm1hdC4gSWdub3JlIGZhY3Qgd2hlbiBkZWFsaW5nIHdpdGggbXBlZyBhdWRpby4KKworMjAwNy0xMS0wNiAxMjoyMzozNSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3Qvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzogVXNlIGF1dG9hdWRpb3NpbmsgaW5zdGVhZCBvZiBhbHNhc2luayBhbmQgdXNlIGEgc2luZSB3YXZlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOiAobWFpbik6CisJICBVc2UgYXV0b2F1ZGlvc2luayBpbnN0ZWFkIG9mIGFsc2FzaW5rIGFuZCB1c2UgYSBzaW5lIHdhdmUuCisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgRml4IHRoZSBtYWduaXR1ZGUgY2FsY3VsYXRpb24uCisKKzIwMDctMTEtMDMgMTk6NTA6MTEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2VxdWFsaXplci86IEFsbG93IHNldHRpbmcgMCBhcyBiYW5kd2lkdGggYW5kIGhhbmRsZSB0aGlzIGNvcnJlY3RseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2RlbW8uYzogKG1haW4pOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgKGdzdF9paXJfZXF1YWxpemVyX2JhbmRfY2xhc3NfaW5pdCksIChzZXR1cF9maWx0ZXIpOgorCSAgQWxsb3cgc2V0dGluZyAwIGFzIGJhbmR3aWR0aCBhbmQgaGFuZGxlIHRoaXMgY29ycmVjdGx5LgorCSAgQWxzbyBoYW5kbGUgYSBiYW5kd2lkdGggb2YgcmF0ZS8yIHByb3Blcmx5LgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jOgorCSAgKGdzdF9paXJfZXF1YWxpemVyX25iYW5kc19jbGFzc19pbml0KToKKwkgIE1ha2UgaXQgcG9zc2libGUgdG8gZ2VuZXJhdGUgYSBOLWJhbmQgZXF1YWxpemVyIHdpdGggMSBiYW5kcy4gVGhlCisJICBwcmV2aW91cyBsaW1pdCBvZiAyIHdhcyBjYXVzZWQgYnkgYSBub3dhZGF5cyByZXBsYWNlZCBjYWxjdWxhdGlvbgorCSAgZG9pbmcgYSBkaXZpc2lvbiBieSB6ZXJvIGlmIG51bWJlciBvZiBiYW5kcyB3YXMgMS4KKworMjAwNy0xMS0wMiAyMToxNjowOSArMDAwMCAgT2xlIEFuZHLDqSBWYWRsYSBSYXZuw6VzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KKworCSAgRml4IGluY2x1ZGVzIGZvciBNU1ZDIGFuZCBHTGliLTIuMTQuMCAoIzQ5MjM4OCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBPbGUgQW5kcsOpIFZhZGxhIFJhdm7DpXMgIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkgICogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmg6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICAqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNpbmsuaDoKKwkgIEZpeCBpbmNsdWRlcyBmb3IgTVNWQyBhbmQgR0xpYi0yLjE0LjAgKCM0OTIzODgpLgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19zdGFydCk6CisJICBObyBtb3JlIHBpcGUgZGVmaW5lIHNpbmNlIEdMaWItMi4xNC4wLCBuZWVkIHRvIHVzZSBfcGlwZSgpIGRpcmVjdGx5LgorCisyMDA3LTExLTAyIDE3OjIzOjQzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvbGF3L211bGF3LWRlY29kZS4qOiBDYWxjdWxhdGUgb3V0Z29pbmcgYnVmZmVyIGR1cmF0aW9uIGlmIGluY29taW5nIGJ1ZmZlciBkaWRuJ3QgaGF2ZSBhIHZhbGlkIGR1cmF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6IChtdWxhd2RlY19zaW5rX3NldGNhcHMpLAorCSAgKGdzdF9tdWxhd2RlY19jaGFpbik6CisJICAqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmg6CisJICBDYWxjdWxhdGUgb3V0Z29pbmcgYnVmZmVyIGR1cmF0aW9uIGlmIGluY29taW5nIGJ1ZmZlciBkaWRuJ3QgaGF2ZSBhCisJICB2YWxpZCBkdXJhdGlvbi4KKworMjAwNy0xMC0zMCAyMTozNzo0OSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZXF1YWxpemVyLzogQWRkIHNtYWxsIGRlbW8gYXBwbGljYXRpb24gYmFzZWQgb24gdGhlIHNwZWN0cnVtIGRlbW8gYXBwbGljYXRpb25zIHRoYXQgZ2V0cyB3aGl0ZSBub2lzZSBhcyBpbnB1dCwgcHUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZXF1YWxpemVyL2RlbW8uYzogKG9uX3dpbmRvd19kZXN0cm95KSwgKG9uX2NvbmZpZ3VyZV9ldmVudCksCisJICAob25fZ2Fpbl9jaGFuZ2VkKSwgKG9uX2JhbmR3aWR0aF9jaGFuZ2VkKSwgKG9uX2ZyZXFfY2hhbmdlZCksCisJICAoZHJhd19zcGVjdHJ1bSksIChtZXNzYWdlX2hhbmRsZXIpLCAobWFpbik6CisJICBBZGQgc21hbGwgZGVtbyBhcHBsaWNhdGlvbiBiYXNlZCBvbiB0aGUgc3BlY3RydW0gZGVtbyBhcHBsaWNhdGlvbnMKKwkgIHRoYXQgZ2V0cyB3aGl0ZSBub2lzZSBhcyBpbnB1dCwgcHVzaGVzIGl0IHRocm91Z2ggYW4gZXF1YWxpemVyIGFuZAorCSAgcGFpbnRzIHRoZSBzcGVjdHJ1bS4gRm9yIGV2ZXJ5IGVxdWFsaXplciBiYW5kIGl0J3MgcG9zc2libGUgdG8gc2V0CisJICBnYWluLCBiYW5kd2lkdGggYW5kIGZyZXF1ZW5jeS4KKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzogKHNldHVwX2ZpbHRlcik6CisJICBBZGQgc29tZSBndWFyZGluZyBhZ2FpbnN0IHRvbyBsYXJnZSBvciB0b28gc21hbGwgZnJlcXVlbmNpZXMgYW5kCisJICBiYW5kd2lkdGhzLiBBbHNvIGltcHJvdmUgZGVidWdnaW5nIGEgYml0LgorCisyMDA3LTEwLTMwIDIxOjE4OjQ1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6IFJlcGxhY2UgZmlsdGVycyB3aXRoIGEgYml0IGJldHRlciBmaWx0ZXJzIGZvciB3aGljaCB3ZSBjYW4gYWN0dWFsbHkgZmluZCBkb2N1bWVudGF0aS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2JhbmRfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9iYW5kX2NsYXNzX2luaXQpLCAoYXJnX3RvX3NjYWxlKSwKKwkgIChzZXR1cF9maWx0ZXIpLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfY29tcHV0ZV9mcmVxdWVuY2llcyk6CisJICBSZXBsYWNlIGZpbHRlcnMgd2l0aCBhIGJpdCBiZXR0ZXIgZmlsdGVycyBmb3Igd2hpY2ggd2UgY2FuIGFjdHVhbGx5CisJICBmaW5kIGRvY3VtZW50YXRpb24sIHdoaWNoIGRvbid0IGNoYW5nZSBhbnl0aGluZyBvbiB6ZXJvIGdhaW4sIGV0Yy4KKwkgIE1ha2UgdGhlIGZyZXF1ZW5jeSBwcm9wZXJ0eSBvZiB0aGUgYmFuZHMgd3JpdGFibGUsIHJlbmFtZSB0aGUKKwkgIGJhbmQtd2lkdGggcHJvcGVydHkgdG8gYmFuZHdpZHRoIGFuZCBjaGFuZ2UgdGhlCW1lYW5pbmcgdG8gdGhlCisJICBmcmVxdWVuY3kgZGlmZmVyZW5jZSBiZXR3ZWVuIGJhbmRlZGdlcywgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZQorCSAgZ2FpbiBwcm9wZXJ0eSB0byBkQiBpbnN0ZWFkIG9mIGEgd2VpcmQgc2NhbGUgYmV0d2VlbiAtMQlhbmQgMSB0aGF0CisJICBoYXMgbm8gcmVhbCBtZWFuaW5nLgorCisyMDA3LTEwLTMwIDEyOjI5OjQ2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFNtYXJ0ZXIgY29tYmluZV9mbG93IGNvZGUgdGhhdCBhbHNvIGRlYWxzIHdpdGggZG93bnN0cmVhbSBlbGVtZW50cyByZXR1cm5pbmcgVU5FWFBFQ1RFRCB3aGVuIHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9hY3RpdmF0ZV9zZWdtZW50KSwKKwkgIChnc3RfcXRkZW11eF9jb21iaW5lX2Zsb3dzKSwgKGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfbW92aWUpOgorCSAgU21hcnRlciBjb21iaW5lX2Zsb3cgY29kZSB0aGF0IGFsc28gZGVhbHMgd2l0aCBkb3duc3RyZWFtIGVsZW1lbnRzCisJICByZXR1cm5pbmcgVU5FWFBFQ1RFRCB3aGVuIHRoZXkgcmVjZWl2ZSBkYXRhIG91dCBvZiB0aGUgc2VnbWVudAorCSAgYm91bmRhcmllcy4gRml4ZXMgIzQ5MTMwNS4KKworMjAwNy0xMC0yNyAxNjowNDo0OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOiBMZXQncyBub3QgY2FsbCBldmVyeSByZXF1ZXN0IHBhZCB3ZSBjcmVhdGUgInNpbmslZCIsIHRoYXQnbGwgY3JlYXRlIHByb2JsZW1zIGlmIHRoZXJlJ3MgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOiAoZ3N0X2ludGVybGVhdmVfcmVxdWVzdF9uZXdfcGFkKToKKwkgIExldCdzIG5vdCBjYWxsIGV2ZXJ5IHJlcXVlc3QgcGFkIHdlIGNyZWF0ZSAic2luayVkIiwgdGhhdCdsbAorCSAgY3JlYXRlIHByb2JsZW1zIGlmIHRoZXJlJ3MgdG8gYmUgbW9yZSB0aGFuIG9uZSBwYWQuIEZpeGVzICM0OTA2ODIuCisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmM6CisJICBBZGQgdW5pdCB0ZXN0IGZvciB0aGUgYWJvdmUuCisKKzIwMDctMTAtMjYgMTU6MDM6MDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogRml4ICd1bnVzZWQgdmFyaWFibGUnIGNvbXBpbGVyIHdhcm5pbmcgd2hlbiBjb21waWxpbmcgYWdhaW5zdCBvbGRlciBrZXJuZWwgaGVhZGVycy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICBGaXggJ3VudXNlZCB2YXJpYWJsZScgY29tcGlsZXIgd2FybmluZyB3aGVuIGNvbXBpbGluZyBhZ2FpbnN0CisJICBvbGRlciBrZXJuZWwgaGVhZGVycy4KKworMjAwNy0xMC0yNiAxMjoxMDo0MyArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICB1cGRhdGUgc3BlYyBmaWxlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHVwZGF0ZSBzcGVjIGZpbGUKKworMjAwNy0xMC0yNSAyMzo0Mjo1MiArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkgIEltcHJvdmUgZG9jdW1lbnRhdGlvbiwgd3JpdGUgc29tZSB0ZXN0cyBmb3IgbXVsdGlmaWxlc3JjL3NpbmsgZm9yIHVwY29taW5nIC0+Z29vZCByZXZpZXcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L211bHRpZmlsZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICAqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tdWx0aWZpbGUuYzoKKwkgIEltcHJvdmUgZG9jdW1lbnRhdGlvbiwgd3JpdGUgc29tZSB0ZXN0cyBmb3IgbXVsdGlmaWxlc3JjL3NpbmsKKwkgIGZvciB1cGNvbWluZyAtPmdvb2QgcmV2aWV3LgorCisyMDA3LTEwLTI1IDE1OjAwOjE1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjIChhZGRfZnVuY3MpOiBNYXAgbmV3IFNPUlROQU1FIHRhZ3MgdG8gSUQzdjIgVFNPUCwgVFNPQSBhbmQgVFNPVCBmcmFtZXMgKCM0MTQ1MzkpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2MgKGFkZF9mdW5jcyk6CisJICBNYXAgbmV3IFNPUlROQU1FIHRhZ3MgdG8gSUQzdjIgVFNPUCwgVFNPQSBhbmQgVFNPVCBmcmFtZXMgKCM0MTQ1MzkpLgorCisyMDA3LTEwLTI0IDA3OjAxOjQ3ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHRlc3RzL2NoZWNrL3BpcGVsaW5lcy9zaW1wbGUtbGF1bmNoLWxpbmVzLmM6IEltcHJvdmUgdGhlIHRlc3RzIGEgbGl0dGxlIG1vcmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svcGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMuYzoKKwkgIEltcHJvdmUgdGhlIHRlc3RzIGEgbGl0dGxlIG1vcmUuCisKKzIwMDctMTAtMjMgMDg6Mzg6NTAgKzAwMDAgIFl1biBaaGVuZyBIdSA8eXVuemhlbmcuaHVAZ21haWwuY29tPgorCisJICBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzogVXNlIGRlZmF1bHQgaW5wdXQgZGV2aWNlIGluc3RlYWQgb2YgZGVmYXVsdCBvdXRwdXQgZGV2aWNlIGFuZCBvbmx5IG1lbWNweSBhY3R1YWwgYXZhaWwuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcGF0Y2ggYnk6IFl1biBaaGVuZyBIdQorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkgIFVzZSBkZWZhdWx0IGlucHV0IGRldmljZSBpbnN0ZWFkIG9mIGRlZmF1bHQgb3V0cHV0IGRldmljZSBhbmQKKwkgIG9ubHkgbWVtY3B5IGFjdHVhbCBhdmFpbGFibGUgYnl0ZXMuCisKKzIwMDctMTAtMjIgMTk6MTQ6MDggKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSAgc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiBGaXhlcyAidjRsMnNyYyAhIHF1ZXVlICEgeHZpbWFnZXNpbmsiLiBUaGUgcXVldWUgYXNrIGZvciBidWZmZXIgdG9vIGVhcmx5LiBJdCBpcyB0ZW1wb3JhcnkgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfZ3JhYl9mcmFtZSk6CisJICBGaXhlcyAidjRsMnNyYyAhIHF1ZXVlICEgeHZpbWFnZXNpbmsiLiBUaGUgcXVldWUgYXNrIGZvciBidWZmZXIgdG9vCisJICBlYXJseS4gSXQgaXMgdGVtcG9yYXJ5IHVudGlsIHdlIGZpbmQgc29tZXRoaW5nIGJldHRlci4KKworMjAwNy0xMC0yMiAxNjo0NDo0OCArMDAwMCAgVG9tbWkgTXnDtmjDpG5lbiA8ZXh0LXRvbW1pLm15b2hhbmVuQG5va2lhLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBGaXggcmFjZSB3aGVuIHBhdXNpbmcgYSBSVFNQIHN0cmVhbSBpbiBpbnRlcmxlYXZlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFRvbW1pIE15w7Zow6RuZW4gIDxleHQtdG9tbWkgZG90IG15b2hhbmVuIGF0IG5va2lhIGRvdCBjb20+CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2xvb3BfaW50ZXJsZWF2ZWQpOgorCSAgRml4IHJhY2Ugd2hlbiBwYXVzaW5nIGEgUlRTUCBzdHJlYW0gaW4gaW50ZXJsZWF2ZWQuCisJICBGaXhlcyAjNDc1Nzg0LgorCisyMDA3LTEwLTIyIDA5OjUzOjE2ICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6IFVzZSBjb3JyZWN0IHVucmVmIGZ1bmN0aW9uIGZvciBidWZmZXJzLiAjNDg4ODQ0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUGV0ZXIgS2plbGxlcnN0ZWR0IDxwa2ogYXQgYXhpcyBjb20+CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOiAoZ3N0X3J0cF9tcDR2X3BheV9maW5hbGl6ZSk6CisJICBVc2UgY29ycmVjdCB1bnJlZiBmdW5jdGlvbiBmb3IgYnVmZmVycy4gIzQ4ODg0NC4KKworMjAwNy0xMC0xOSAxOTozMzoxNiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBBZGQgc29tZSBkZWJ1ZyBhbmQgc3luYyB0ZXN0cyB3aXRoIHRoZSBmaXguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpbXV4LmM6CisJICBBZGQgc29tZSBkZWJ1ZyBhbmQgc3luYyB0ZXN0cyB3aXRoIHRoZSBmaXguCisKKzIwMDctMTAtMTggMTc6MDQ6MTQgKzAwMDAgIExhdXJlbnQgR2xheWFsIDxzcGdsZWdsZUB5YWhvby5mcj4KKworCSAgZ3N0L3VkcC9nc3R1ZHBzcmMuYzogV2hlbiB0aGUgc29ja2V0IGlzIHVzZWQgYnkgdGhlIGFwcCBmb3Igb3RoZXIgcHVycG9zZXMsIGRvbid0IGdlbmVyYXRlIGFuIGVycm9yIGlmIHRoZXJlIGlzIGFjdGl2Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5OiBMYXVyZW50IEdsYXlhbCAgPHNwZ2xlZ2xlIHlhaG9vIGZyPgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jcmVhdGUpOgorCSAgV2hlbiB0aGUgc29ja2V0IGlzIHVzZWQgYnkgdGhlIGFwcCBmb3Igb3RoZXIgcHVycG9zZXMsIGRvbid0IGdlbmVyYXRlIGFuCisJICBlcnJvciBpZiB0aGVyZSBpcyBhY3RpdmF0eSBvbiB0aGUgc29ja2V0IHRoYXQgaXMgbm90IGRhdGEgcmVsYXRlZC4KKwkgIEZpeGVzICM0ODc0ODguCisKKzIwMDctMTAtMTggMTQ6NTU6MzggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogQWRkIHNvbWUgbW9yZSBkZWJ1ZyBpbmZvLiBHZW5lcmF0ZSBhbiBlcnJvciB3aGVuIHdlIHJ1biBvdXQgb2YgYnVmZmVycyBmb3Igc29tZSByZWFzb24uIFNlZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyX2J1ZmZlcl9maW5hbGl6ZSksCisJICAoZ3N0X3Y0bDJzcmNfZ3JhYl9mcmFtZSk6CisJICBBZGQgc29tZSBtb3JlIGRlYnVnIGluZm8uIEdlbmVyYXRlIGFuIGVycm9yIHdoZW4gd2UgcnVuIG91dCBvZiBidWZmZXJzCisJICBmb3Igc29tZSByZWFzb24uIFNlZSAjNDgwNTU3LgorCisyMDA3LTEwLTE4IDA4OjI3OjU2ICswMDAwICBBbmRlcnMgU2thcmdyZW4gPGFuZGVycy5za2FyZ3JlbkBheGlzLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6IFNldCBtYXJrZXIgYml0IGNvcnJlY3RseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEFuZGVycyBTa2FyZ3JlbiA8YW5kZXJzIGRvdCBza2FyZ3JlbiBhdCBheGlzIGRvdCBjb20+CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOiAoZ3N0X3J0cF9oMjY0X3BheV9oYW5kbGVfYnVmZmVyKToKKwkgIFNldCBtYXJrZXIgYml0IGNvcnJlY3RseS4KKworMjAwNy0xMC0xOCAwNjoyMDoyMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiBBZGQgYSBtaXNzaW5nIGJyZWFrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9zZXRfcHJvcGVydHkpOgorCSAgQWRkIGEgbWlzc2luZyBicmVhay4KKworMjAwNy0xMC0xOCAwNjoxNDo0MiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci4qOiBNb3ZlIGJhbmR3aWR0aCBwcm9wZXJ0eSB0byB0aGUgc2VwYXJhdGUgYmFuZHMgYW5kIGFkZCBmbG9hdDY0IHN1cHBvcnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzoKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9iYW5kX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2JhbmRfY2xhc3NfaW5pdCksIChnc3RfaWlyX2VxdWFsaXplcl9iYW5kX2luaXQpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2JhbmRfZ2V0X3R5cGUpLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfY2xhc3NfaW5pdCksCisJICAoc2V0dXBfZmlsdGVyKSwgKGdzdF9paXJfZXF1YWxpemVyX3NldHVwKToKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuaDoKKwkgIE1vdmUgYmFuZHdpZHRoIHByb3BlcnR5IHRvIHRoZSBzZXBhcmF0ZSBiYW5kcyBhbmQgYWRkIGZsb2F0NjQgc3VwcG9ydC4KKworMjAwNy0xMC0xNyAxNTowODowMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBVc2UgYWxsb3dlZCBuYW1lIGZvciB0aGUgR3N0U3RydWN0dXJlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX29wZW4pOgorCSAgVXNlIGFsbG93ZWQgbmFtZSBmb3IgdGhlIEdzdFN0cnVjdHVyZS4KKworMjAwNy0xMC0xNyAxMTo0NzoyMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgVXNlIG5ldyBnc3RfYnVzX3BvcF9maWx0ZXJlZCgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nY29uZi9nc3Rzd2l0Y2hzaW5rLmM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkgIFVzZSBuZXcgZ3N0X2J1c19wb3BfZmlsdGVyZWQoKS4KKworMjAwNy0xMC0xMyAxMjowMzo0NCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL3Y0bDIvOiBXaGVuIHByb2JpbmcgdGhlIGZvcm1hdHMgYW5kIHNpemVzIGEgY2FtZXJhIHN1cHBvcnRzLCBtYWtlIHN1cmUgdGhlIGJlc3Qgb25lcyAoaGlnaGVzdCByZXNvbHV0aW9uLCBwcmVmZXJlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICBXaGVuIHByb2JpbmcgdGhlIGZvcm1hdHMgYW5kIHNpemVzIGEgY2FtZXJhIHN1cHBvcnRzLCBtYWtlCisJICBzdXJlIHRoZSBiZXN0IG9uZXMgKGhpZ2hlc3QgcmVzb2x1dGlvbiwgcHJlZmVyZWQgZm9ybWF0KQorCSAgZW5kIHVwIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb2JlZCBjYXBzIGFuZCB0aGUgbGVzcworCSAgZGVzaXJhYmxlIG9uZXMgYXQgdGhlIGVuZC4gIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgdGhlCisJICBvcmRlciB3aXRoaW4gdGhlIGNhcHMgbWF0dGVycyBmb3IgdGhpbmdzIGxpa2UgZml4YXRpb24gYW5kCisJICBuZWdvdGlhdGlvbiwgaWUuIHdoYXQgZm9ybWF0IGlzIGNob3NlbiBpbiB0aGUgZW5kLgorCSAgV2l0aCByZWNlbnQga2VybmVscywgdGhlIGN1cnJlbnQgcHJvYmluZyBjb2RlIHdpbGwgZW5kIHVwCisJICBxdWVyeWluZyB0aGUgc3VwcG9ydGVkIHNpemVzIGZyb20gbG93ZXN0IHJlc29sdXRpb24gdG8KKwkgIGhpZ2hlc3QgcmVzb2x1dGlvbiwgYWRkaW5nIHRoZW0gdG8gdGhlIHByb2JlZCBjYXBzIGluIHRoYXQKKwkgIG9yZGVyLCByZXN1bHRpbmcgdG8gdjRsMnNyYyBmaXhhdGluZyB0byB0aGUgbG93ZXN0IHBvc3NpYmxlCisJICByZXNvbHV0aW9uIGlmIGRvd25zdHJlYW0gZG9lcyBub3QgZXhwcmVzcyBhIHNpemUgcHJlZmVyZW5jZS4KKwkgIEFsc28gbWFrZSB1cCBhIHNvbWV3aGF0IHJhbmRvbSByYW5raW5nIG9mIHByZWZlcmVkIG91dHB1dAorCSAgZm9ybWF0cyBmb3IgdGhlIHNhbWUgcmVhc29uLiBGaXhlcyAjNDg1ODI4LgorCisyMDA3LTEwLTExIDE3OjU1OjI5ICswMDAwICBKYXNvbiBLaXZsaWdobiA8amtpdmxpZ2huQGdtYWlsLmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IEV4dHJhY3QgbGljZW5zZS9jb3B5cmlnaHQgVVJJcyBmcm9tIElEM3YyIFdDT1AgZnJhbWVzIChGaXhlcyAjNDQ3MDAwKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IEphc29uIEtpdmxpZ2huICA8amtpdmxpZ2huIGdtYWlsIGNvbT4KKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6CisJICBFeHRyYWN0IGxpY2Vuc2UvY29weXJpZ2h0IFVSSXMgZnJvbSBJRDN2MiBXQ09QIGZyYW1lcworCSAgKEZpeGVzICM0NDcwMDApLgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDNkZW11eC5jOgorCSAgKiB0ZXN0cy9maWxlcy9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvZmlsZXMvaWQzLTQ0NzAwMC13Y29wLnRhZzoKKwkgIEFkZCBzaW1wbGUgdW5pdCB0ZXN0LgorCisyMDA3LTEwLTExIDE2OjQxOjQ0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOiBBZGQgc3VwcG9ydCBmb3IgbGljZW5zZS9jb3B5cmlnaHQgVVJJIHRhZ3MgKElEM3YyIFdDT1AgZnJhbWUpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJICBBZGQgc3VwcG9ydCBmb3IgbGljZW5zZS9jb3B5cmlnaHQgVVJJIHRhZ3MgKElEM3YyIFdDT1AgZnJhbWUpLgorCSAgUHJlcmVxdWlzaXRlIGZvciAjNDQ3MDAwLgorCisyMDA3LTEwLTA4IDE3OjQ0OjQyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBGaXggY29tcGlsZXIgd2FybmluZyBieSB1c2luZyBHU1RfQ0xPQ0tfVElNRV9OT05FIHRvIGluaXRpYWxpc2UgYSBHc3RDbG9ja1RpbWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfZmx1c2gpOgorCSAgRml4IGNvbXBpbGVyIHdhcm5pbmcgYnkgdXNpbmcgR1NUX0NMT0NLX1RJTUVfTk9ORSB0byBpbml0aWFsaXNlCisJICBhIEdzdENsb2NrVGltZS4KKworMjAwNy0xMC0wOCAxMTo1ODo1MSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBNb3JlIHNlZWtpbmcgZml4ZXMsIG1vc3RseSBwYXNzaW5nIGFyb3VuZCB0aGUgbmV3IHBsYXliYWNrIHNlZ21lbnQgaW4gb3JkZXIgdG8gY29uZmlndXJlIGl0IHByLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfZmx1c2gpLAorCSAgKGdzdF9ydHNwc3JjX2RvX3NlZWspLCAoZ3N0X3J0c3BzcmNfcGVyZm9ybV9zZWVrKSwKKwkgIChnc3RfcnRzcHNyY19jb25maWd1cmVfY2FwcyksIChnc3RfcnRzcHNyY19sb29wX3VkcCksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfcmFuZ2UpLCAoZ3N0X3J0c3BzcmNfb3BlbiksIChnc3RfcnRzcHNyY19wbGF5KSwKKwkgIChnc3RfcnRzcHNyY19jaGFuZ2Vfc3RhdGUpOgorCSAgTW9yZSBzZWVraW5nIGZpeGVzLCBtb3N0bHkgcGFzc2luZyBhcm91bmQgdGhlIG5ldyBwbGF5YmFjayBzZWdtZW50IGluCisJICBvcmRlciB0byBjb25maWd1cmUgaXQgcHJvcGVybHkuCisJICBBbHNvIHJlc2V0IGJhc2VfdGltZSBvZiB1ZHAgc291cmNlcyB3aGVuIHNldHRpbmcgdGhlbSBiYWNrIHRvIFBMQVlJTkcgYXMKKwkgIGEgdGVtcG9yYXJ5IGhhY2sgdW50aWwgY29yZSBzdXBwb3J0cyBzZWVrIGluIGxpdmUgc291cmNlcyBwcm9wZXJseS4KKworMjAwNy0xMC0wOCAxMDozNDowMyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzogRml4IGNhcHMgYXMgdG8gbm90IGNvbmZ1c2UgYXV0b3BsdWdnZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6CisJICBGaXggY2FwcyBhcyB0byBub3QgY29uZnVzZSBhdXRvcGx1Z2dlcnMuCisKKzIwMDctMTAtMDYgMTY6MTM6MTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pZDNkZW11eC86IFBvcnQgSUQzIHRhZyBkZW11eGVyIG92ZXIgdG8gdGhlIG5ldyBHc3RUYWdEZW11eCBpbiAtYmFzZSAobm93IHdvdWxkIGJlIGEgZ29vZCB0aW1lIHRvIHRlc3QgcmUtaW1wb3J0aS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguaDoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuaDoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6CisJICBQb3J0IElEMyB0YWcgZGVtdXhlciBvdmVyIHRvIHRoZSBuZXcgR3N0VGFnRGVtdXggaW4gLWJhc2UKKwkgIChub3cgd291bGQgYmUgYSBnb29kIHRpbWUgdG8gdGVzdCByZS1pbXBvcnRpbmcgeW91ciBtdXNpYworCSAgY29sbGVjdGlvbikuCisKKzIwMDctMTAtMDYgMTU6MTM6MDkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hcGV0YWcvOiBQb3J0IEFQRSB0YWcgZGVtdXhlciBvdmVyIHRvIHRoZSBuZXcgR3N0VGFnRGVtdXggaW4gLWJhc2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FwZXRhZy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOgorCSAgKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4Lmg6CisJICAqIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzoKKwkgICogZ3N0L2FwZXRhZy9nc3R0YWdkZW11eC5oOgorCSAgUG9ydCBBUEUgdGFnIGRlbXV4ZXIgb3ZlciB0byB0aGUgbmV3IEdzdFRhZ0RlbXV4IGluIC1iYXNlLgorCisyMDA3LTEwLTA1IDEzOjE4OjE5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IEltcHJvdmUgZmx1c2hpbmcgYmVoYXZpb3VyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2ZsdXNoKSwKKwkgIChnc3RfcnRzcHNyY19wZXJmb3JtX3NlZWspLCAoZ3N0X3J0c3BzcmNfaGFuZGxlX3NyY19ldmVudCksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX2ludGVybmFsX3NyY19xdWVyeSksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX3NyY19xdWVyeSksIChuZXdfc2Vzc2lvbl9wYWQpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdGNwKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksCisJICAoZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCk6CisJICBJbXByb3ZlIGZsdXNoaW5nIGJlaGF2aW91ci4KKwkgIFNldCBzdGF0ZSBvZiB0aGUgdWRwIHNvdXJjZXMgdG8gUEFVU0UvUExBWUlORyBjb3JyZWN0bHkuCisJICBIYW5kbGUgZXZlbnRzIGFuZCBxdWVyaWVzIGZvciBVRFAgYW5kIFRDUCB0cmFuc3BvcnQgbm93LgorCisyMDA3LTEwLTA0IDA3OjI5OjQ4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9ydHAvOiBBZGQgbG9nIGNhdGVnb3J5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkgIEFkZCBsb2cgY2F0ZWdvcnkuCisKKzIwMDctMTAtMDQgMDc6MjQ6MDIgKzAwMDAgIFRpbW8gSG90dGkgPFRpbW8uSG90dGlAc3lzb3BlbmRpZ2lhLmNvbT4KKworCSAgdGVzdHMvY2hlY2svOiBBZGQgdW5pdCB0ZXN0cyBmb3IgcGF5bG9hZGVycy9kZXBheWxvYWRlcnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBUaW1vIEhvdHRpIDxUaW1vLkhvdHRpQHN5c29wZW5kaWdpYS5jb20+CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9waXBlbGluZXMvc2ltcGxlLWxhdW5jaC1saW5lcy5jOgorCSAgQWRkIHVuaXQgdGVzdHMgZm9yIHBheWxvYWRlcnMvZGVwYXlsb2FkZXJzLgorCisyMDA3LTEwLTAyIDEwOjQ5OjAzICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpbXV4Lio6IEFsc28gc2F2ZSBjb2RlYyBkYXRhIGZvciBhdWRpbyBzdHJlYW1zLiBGaXhlcyAjNDgyNDk1LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4Lmg6CisJICBBbHNvIHNhdmUgY29kZWMgZGF0YSBmb3IgYXVkaW8gc3RyZWFtcy4gRml4ZXMgIzQ4MjQ5NS4KKworMjAwNy0xMC0wMiAxMDoyMzowNCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aW11eC5jOiBGaXggIkluZGV4IGVudHJ5IGhhcyBpbnZhbGlkIHN0cmVhbSBuciAxIi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgRml4ICJJbmRleCBlbnRyeSBoYXMgaW52YWxpZCBzdHJlYW0gbnIgMSIuCisJICBBZGQgc3VwcG9ydCBmb3IgbXV4aW5nIGFhYyAtIHdvcmsgaW4gcHJvZ3Jlc3MgKHNlZSAjNDgyNDk1KS4KKworMjAwNy0xMC0wMSAxNjozNDo1NiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy4qOiBQYXJzZSBiYW5kd2lkdGggbW9kaWZpZXJzLCB0aGV5IGFyZSBub3QgeWV0IGNvbmZpZ3VyZWQgaW4gdGhlIHNlc3Npb24gbWFuYWdlciBiZWNhdXNlIHdlIGRvbid0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfZ2V0X2JhbmR3aWR0aCksCisJICAoZ3N0X3J0c3BzcmNfY29sbGVjdF9iYW5kd2lkdGgpLCAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksCisJICAoZ3N0X3J0c3BzcmNfbWVkaWFfdG9fY2FwcyksIChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgUGFyc2UgYmFuZHdpZHRoIG1vZGlmaWVycywgdGhleSBhcmUgbm90IHlldCBjb25maWd1cmVkIGluIHRoZSBzZXNzaW9uCisJICBtYW5hZ2VyIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhbiBBUEkgZm9yIHRoYXQgeWV0LgorCisyMDA3LTEwLTAxIDEzOjU3OjI4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IFVzZSBzaGlueSBuZXcgZnVuY3Rpb24gaW4gLWJhc2UgdG8gZ2V0IHRoZSBkZWZhdWx0IGNsb2NrLXJhdGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfcGFyc2VfcnRwbWFwKSwKKwkgIChnc3RfcnRzcHNyY19tZWRpYV90b19jYXBzKSwgKGdzdF9ydHNwc3JjX2xvb3BfaW50ZXJsZWF2ZWQpOgorCSAgVXNlIHNoaW55IG5ldyBmdW5jdGlvbiBpbiAtYmFzZSB0byBnZXQgdGhlIGRlZmF1bHQgY2xvY2stcmF0ZS4KKwkgIFVwZGF0ZSBzb21lIGRvY3MuCisKKzIwMDctMDktMjkgMTI6NTA6MzYgKzAwMDAgIFPDqWJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4KKworCSAgd2luMzIvTUFOSUZFU1Q6IEFkZCBmaWxlcyB0byB3aW4zMiBtYW5pZmVzdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB3aW4zMi9NQU5JRkVTVDoKKwkgIEFkZCBmaWxlcyB0byB3aW4zMiBtYW5pZmVzdC4KKwkgICogd2luMzIvdnM2L2xpYmdzdGF1ZGlvZnguZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0cXRkZW11eC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RydHAuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0cnRzcC5kc3A6CisJICBVcGRhdGUgcHJvamVjdCBmaWxlcy4KKworMjAwNy0wOS0yOCAxNDo1NjoxOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy4qOiBJbiBUQ1AgbW9kZSwgb25seSB0aW1lc3RhbXAgdGhlIGZpcnN0IGJ1ZmZlci4gVENQIGlzIG5vdCByZWFsIHRpbWUgYW5kIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfbG9vcF9pbnRlcmxlYXZlZCksCisJICAoZ3N0X3J0c3BzcmNfcGxheSk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIEluIFRDUCBtb2RlLCBvbmx5IHRpbWVzdGFtcCB0aGUgZmlyc3QgYnVmZmVyLiBUQ1AgaXMgbm90IHJlYWwgdGltZSBhbmQKKwkgIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gdHJ5IHRvIHNrZXcgY29tcGVuc2F0ZSwgYWxzbyBzb21lIHNlcnZlcnMgc2VuZAorCSAgdGhlIGZpcnN0IGJhdGNoIG9mIGRhdGEgaW4gYSBidXJzdC4KKworMjAwNy0wOS0yNyAxNTowMDozMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IEZpeCBzZXR0aW5nIHRoZSBkaXNjb250IGZsYWcgb24gdGhlIGZpcnN0IGJ1ZmZlciBwdXNoZWQgZG93bnN0cmVhbSBmb3IgZm9ybWF0cyB3aXRoIHByLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICBGaXggc2V0dGluZyB0aGUgZGlzY29udCBmbGFnIG9uIHRoZSBmaXJzdCBidWZmZXIKKwkgIHB1c2hlZCBkb3duc3RyZWFtIGZvciBmb3JtYXRzIHdpdGggcHJpdmF0ZSBjb2RlYworCSAgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIGRlc2VyaWFsaXNlZCBpbnRvIGJ1ZmZlcnMKKwkgIChzdWNoIGFzIHZvcmJpcyBhbmQgRkxBQyB3aGVuIGluIGEgbWF0cm9za2EgY29udGFpbmVyKS4KKworMjAwNy0wOS0yNyAxMToxMDoxMiArMDAwMCAgQW50b2luZSBUcmVtYmxheSA8aGV4YTAwQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lio6IEZyZWUgdGhlIGNvbmZpZyBzdHJpbmcuIEZpeGVzICM0ODA3MDcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBBbnRvaW5lIFRyZW1ibGF5IDxoZXhhMDAgYXQgZ21haWwgZG90IGNvbT4KKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6IChnc3RfcnRwX21wNHZfcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfbXA0dl9wYXlfZmluYWxpemUpLCAoZ3N0X3J0cF9tcDR2X3BheV9mbHVzaCksCisJICAoZ3N0X3J0cF9tcDR2X3BheV9oYW5kbGVfYnVmZmVyKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lmg6CisJICBGcmVlIHRoZSBjb25maWcgc3RyaW5nLiBGaXhlcyAjNDgwNzA3LgorCSAgQ2xlYW4gdXAgdGhlIHRpbWVzdGFtcCBjb2RlIGEgbGl0dGxlLgorCisyMDA3LTA5LTI2IDIwOjEyOjUyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLio6IFNldCB0aW1lc3RhbXBzIG9uIFJUUCBidWZmZXJzIGluIGludGVybGVhdmVkIG1vZGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX3NyY19xdWVyeSksIChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKSwKKwkgIChnc3RfcnRzcHNyY19sb29wX3VkcCksIChnc3RfcnRzcHNyY19jbG9zZSk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIFNldCB0aW1lc3RhbXBzIG9uIFJUUCBidWZmZXJzIGluIGludGVybGVhdmVkIG1vZGUuCisJICBNYXJrIGZpcnN0IGJ1ZmZlcnMgd2l0aCBhIERJU0NPTlQuCisJICBSZW1vdmUgZmx1c2ggaGFjayBub3cgdGhhdCBzeW5jIGZvciBsaXZlIHNvdXJjZXMgaGFzIGJlZW4gZmlndXJlZCBvdXQuCisKKzIwMDctMDktMjYgMTQ6Mjg6MjAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IFVwZGF0ZSBkb2N1bWVudGF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2NyZWF0ZSk6CisJICBVcGRhdGUgZG9jdW1lbnRhdGlvbi4KKworMjAwNy0wOS0yNiAxNDoyNjozOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvZ3N0cnRweHF0ZGVwYXkuKjogRmFpbCBpZiB3ZSBkb24ndCBrbm93IHRoZSBxdWlja3RpbWUgZm9ybWF0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L2dzdHJ0cHhxdGRlcGF5LmM6IChnc3RfcnRwX3hxdF9kZXBheV9wcm9jZXNzKSwKKwkgIChnc3RfcnRwX3hxdF9kZXBheV9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvcXRkZW11eC9nc3RydHB4cXRkZXBheS5oOgorCSAgRmFpbCBpZiB3ZSBkb24ndCBrbm93IHRoZSBxdWlja3RpbWUgZm9ybWF0LgorCisyMDA3LTA5LTI2IDEzOjE5OjE3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZW5jLio6IFNhdmUgdGhlIGZsb3cgcmV0dXJuIGZyb20gdGhlIGxhc3QgZ3N0X3BhZF9wdXNoKCkgYW5kIG1ha2Ugc3VyZSB3ZSBwYXNzIHRoZSByaWdodCBmbG93IHJldHVybiAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuaDoKKwkgIFNhdmUgdGhlIGZsb3cgcmV0dXJuIGZyb20gdGhlIGxhc3QgZ3N0X3BhZF9wdXNoKCkgYW5kCisJICBtYWtlIHN1cmUgd2UgcGFzcyB0aGUgcmlnaHQgZmxvdyByZXR1cm4gdmFsdWUgdXBzdHJlYW0KKwkgIGluIHRoZSBjYXNlIG9mIGZhaWx1cmU7IG1pbm9yIGNsZWFuLXVwcy4KKworMjAwNy0wOS0yNSAxOTowOTozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgQWRkIHN1cHBvcnQgZm9yIHRoZSBuZXcgR1NUX1RBR19DT01QT1NFUiAoIzQ1OTgwOSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3RhZ2xpYi9nc3RhcGV2Mm11eC5jYzoKKwkgICogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkgICogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOgorCSAgQWRkIHN1cHBvcnQgZm9yIHRoZSBuZXcgR1NUX1RBR19DT01QT1NFUiAoIzQ1OTgwOSkuCisKKzIwMDctMDktMjUgMTc6MTg6MzQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9sYXcvOiBDb21wdWxzaXZlIGNsZWFuLXVwczogdXNlIGJvaWxlcnBsYXRlIG1hY3JvcywgYWRkIGRlYnVnIGNhdGVnb3JpZXMsIGZpeCB1cCB0aGluZ3MgdG8gY29uZm9ybSB0byBzeW1ib2wgbm9tZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkgICogZ3N0L2xhdy9hbGF3LWRlY29kZS5oOgorCSAgKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6CisJICAqIGdzdC9sYXcvYWxhdy1lbmNvZGUuaDoKKwkgICogZ3N0L2xhdy9hbGF3LmM6CisJICAqIGdzdC9sYXcvbXVsYXctY29udmVyc2lvbi5oOgorCSAgQ29tcHVsc2l2ZSBjbGVhbi11cHM6IHVzZSBib2lsZXJwbGF0ZSBtYWNyb3MsIGFkZCBkZWJ1ZworCSAgY2F0ZWdvcmllcywgZml4IHVwIHRoaW5ncyB0byBjb25mb3JtIHRvIHN5bWJvbCBub21lbmtsYXR1cmEsCisJICBldGMuCisKKzIwMDctMDktMjUgMTY6MDU6MjkgKzAwMDAgIExhdXJlbnQgR2xheWFsIDxzcGdsZWdsZUB5YWhvby5mcj4KKworCSAgZ3N0L2xhdy86IFVzZSBzdGF0aWMgdGFibGVzIGZvciBBLUxhdyBkZWNvZGluZyBhbmQgZW5jb2Rpbmc7IHRoaXMgbWFrZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IExhdXJlbnQgR2xheWFsICA8c3BnbGVnbGUgeWFob28gZnI+CisJICAqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzoKKwkgICogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOgorCSAgVXNlIHN0YXRpYyB0YWJsZXMgZm9yIEEtTGF3IGRlY29kaW5nIGFuZCBlbmNvZGluZzsgdGhpcyBtYWtlcworCSAgQS1MYXcgZGVjb2RpbmcgYW5kIGVuY29kaW5nIGxlc3MgQ1BVLWludGVuc2l2ZSwgYnV0IGluY3JlYXNlcworCSAgdGhlIGJpbmFyeSBzaXplIGEgYml0LiBMZWF2aW5nIG9sZCBjb2RlIGFyb3VuZCBmb3Igbm93LAorCSAgc2VsZWN0YWJsZSBieSBhIGRlZmluZSBpbiB0aGUgY29kZS4gRml4ZXMgIzQzNTQzNS4KKworMjAwNy0wOS0yNSAwODo1MTozNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBjb25maWd1cmUuYWM6IFVzZSBBR19HU1RfQVJHX1dJVEhfUExVR0lOUywgQUdfR1NUX0FSR19FTkFCTEVfRVhURVJOQUwgYW5kCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgVXNlIEFHX0dTVF9BUkdfV0lUSF9QTFVHSU5TLCBBR19HU1RfQVJHX0VOQUJMRV9FWFRFUk5BTCBhbmQKKwkgIEFHX0dTVF9BUkdfRU5BQkxFX0VYUEVSSU1FTlRBTCBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIHRob3NlIG1hY3JvcworCSAgaW4gY29uZmlndXJlLmFjLgorCisyMDA3LTA5LTI1IDA1OjAzOjU4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQWRkIGZvdXJjY3MgZm9yIE1QRUcyIEhEViBzdHJlYW1zLiBGaXhlcyAjNDc5OTYwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogPGogYXQgYm9vdGxhYiBkb3Qgb3JnPgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3ZpZGVvX2NhcHMpOgorCSAgQWRkIGZvdXJjY3MgZm9yIE1QRUcyIEhEViBzdHJlYW1zLiBGaXhlcyAjNDc5OTYwLgorCisyMDA3LTA5LTI0IDEwOjUzOjM2ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIE1hc3NpdmUgbGVhayBmaXhpbmcsIHBsdXMgY29kZSBjbGVhbnVwcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYXVkaW9yZXNhbXBsZS9nc3RhdWRpb3Jlc2FtcGxlLmM6CisJICAqIGV4dC94MjY0L2dzdHgyNjRlbmMuYzoKKwkgICogZ3N0L2R2ZHNwdS9nc3RkdmRzcHUuYzoKKwkgICogZ3N0L2R2ZHNwdS9nc3RkdmRzcHUuaDoKKwkgICogZ3N0L2Zlc3RpdmFsL2dzdGZlc3RpdmFsLmM6CisJICAqIGdzdC9oMjY0cGFyc2UvZ3N0aDI2NHBhcnNlLmM6CisJICAqIGdzdC9tcGVndHNwYXJzZS9tcGVndHNwYWNrZXRpemVyLmM6CisJICAqIGdzdC9tcGVndHNwYXJzZS9tcGVndHNwYXJzZS5jOgorCSAgKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgICogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkgICogZ3N0L251dmRlbXV4L2dzdG51dmRlbXV4LmM6CisJICAqIHN5cy9kc2hvd3NyY3dyYXBwZXIvZ3N0ZHNob3dhdWRpb3NyYy5jOgorCSAgKiBzeXMvZHNob3dzcmN3cmFwcGVyL2dzdGRzaG93dmlkZW9zcmMuYzoKKwkgICogc3lzL3ZjZC92Y2RzcmMuYzoKKwkgIE1hc3NpdmUgbGVhayBmaXhpbmcsIHBsdXMgY29kZSBjbGVhbnVwcy4KKworMjAwNy0wOS0yMyAxODo1NzoxNCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBzeXMvb3NzL2dzdG9zc2hlbHBlci5jOiBVc2UgR1NUX1dBUk5JTkcgaW5zdGVhZCBvZiBhIGdfY3JpdGljYWwuIFRoaXMgc2l0dWF0aW9uIGlzIG5vdCBjYXVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3MvZ3N0b3NzaGVscGVyLmM6CisJICBVc2UgR1NUX1dBUk5JTkcgaW5zdGVhZCBvZiBhIGdfY3JpdGljYWwuIFRoaXMgc2l0dWF0aW9uIGlzIG5vdCBjYXVzZWQKKwkgIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKworMjAwNy0wOS0yMiAxODoxNToxMiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIHBvLzogVXBkYXRlZCB0cmFuc2xhdGlvbnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogcG8vTElOR1VBUzoKKwkgICogcG8vbmwucG86CisJICBVcGRhdGVkIHRyYW5zbGF0aW9ucy4KKworMjAwNy0wOS0yMiAxODoxMzo1OCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIHBvL2V1LnBvOiBBZGRlZCBCYXNxdWUgdHJhbnNsYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHRyYW5zbGF0ZWQgYnk6IE1pa2VsIE9sYXNhZ2FzdGkgPGhleV9uZWtlbkBtdW5kdXJhdC5uZXQ+CisJICAqIHBvL2V1LnBvOgorCSAgQWRkZWQgQmFzcXVlIHRyYW5zbGF0aW9uLgorCisyMDA3LTA5LTIyIDE4OjEzOjEwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgcG8vOiBBZGRlZCBDaGluZXNlICh0cmFkaXRpb25hbCBhbmQgSG9uZyBLb25nKSB0cmFuc2xhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdHJhbnNsYXRlZCBieTogQWJlbCBDaGV1bmcgPGFiZWxjaGV1bmdAZ21haWwuY29tPgorCSAgKiBwby96aF9ISy5wbzoKKwkgICogcG8vemhfVFcucG86CisJICBBZGRlZCBDaGluZXNlICh0cmFkaXRpb25hbCBhbmQgSG9uZyBLb25nKSB0cmFuc2xhdGlvbi4KKworMjAwNy0wOS0yMiAxODoxMDo0MiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIHBvL3BsLnBvOiBBZGRlZCBQb2xpc2ggdHJhbnNsYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHRyYW5zbGF0ZWQgYnk6IEpha3ViIEJvZ3VzeiA8cWJvb3NoQHBsZC1saW51eC5vcmc+CisJICAqIHBvL3BsLnBvOgorCSAgQWRkZWQgUG9saXNoIHRyYW5zbGF0aW9uLgorCisyMDA3LTA5LTIyIDE4OjA5OjU5ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgcG8vZmkucG86IEFkZGVkIEZpbm5pc2ggdHJhbnNsYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHRyYW5zbGF0ZWQgYnk6IElsa2thIFR1b2hlbGEgPGhpbGVAaWtpLmZpPgorCSAgKiBwby9maS5wbzoKKwkgIEFkZGVkIEZpbm5pc2ggdHJhbnNsYXRpb24uCisKKzIwMDctMDktMjIgMTg6MDk6MDkgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBwby9lcy5wbzogQWRkZWQgU3BhbmlzaCB0cmFuc2xhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdHJhbnNsYXRlZCBieTogSm9yZ2UgR29uesOhbGV6IEdvbnrDoWxleiA8YWxvcmllbEBnbWFpbC5jb20+CisJICAqIHBvL2VzLnBvOgorCSAgQWRkZWQgU3BhbmlzaCB0cmFuc2xhdGlvbi4KKworMjAwNy0wOS0yMiAxODowODoxMyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIHBvL2RhLnBvOiBBZGRlZCBEYW5pc2ggdHJhbnNsYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHRyYW5zbGF0ZWQgYnk6IE1vZ2VucyBKYWVnZXIgPG1vZ2Vuc0BqYWVnZXIudGY+CisJICAqIHBvL2RhLnBvOgorCSAgQWRkZWQgRGFuaXNoIHRyYW5zbGF0aW9uLgorCisyMDA3LTA5LTIyIDE4OjA2OjU1ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgcG8vemhfQ04ucG86IEFkZGVkIENoaW5lc2UgKHNpbXBsaWZpZWQpIHRyYW5zbGF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICB0cmFuc2xhdGVkIGJ5OiBGdW5kYSBXYW5nIDxmdW5kYXdhbmdAbGludXgubmV0LmNuPgorCSAgKiBwby96aF9DTi5wbzoKKwkgIEFkZGVkIENoaW5lc2UgKHNpbXBsaWZpZWQpIHRyYW5zbGF0aW9uLgorCisyMDA3LTA5LTIyIDE4OjA1OjM3ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgcG8vYmcucG86IEFkZGVkIEJ1bGdhcmlhbiB0cmFuc2xhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdHJhbnNsYXRlZCBieTogQWxleGFuZGVyIFNob3BvdiA8YXNoQGNvbnRhY3QuYmc+CisJICAqIHBvL2JnLnBvOgorCSAgQWRkZWQgQnVsZ2FyaWFuIHRyYW5zbGF0aW9uLgorCisyMDA3LTA5LTIyIDA4OjEyOjU3ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogY29tbW9uOgorCSogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmg6CisJICBmaXggaGVhZGVyIGFuZCBjb21tZW50cworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggaGVhZGVyIGFuZCBjb21tZW50cworCisyMDA3LTA5LTIxIDExOjM0OjM0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6IFNldCBvdXRnb2luZyBwYWNrZXQgZHVyYXRpb24gYmVjYXVzZSB3ZSBjYW4uIEZpeGVzICM0NzgyNDQgc29tZSBtb3JlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzogKGdzdF9ydHBfYW1yX2RlcGF5X3Byb2Nlc3MpOgorCSAgU2V0IG91dGdvaW5nIHBhY2tldCBkdXJhdGlvbiBiZWNhdXNlIHdlIGNhbi4gRml4ZXMgIzQ3ODI0NCBzb21lIG1vcmUuCisKKzIwMDctMDktMjAgMTM6MzU6MzQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6IEFkZCBpbmZvIGFib3V0IHN0YXRpYyBsZWFrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOgorCSAgQWRkIGluZm8gYWJvdXQgc3RhdGljIGxlYWsuCisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9nZW5lcmljL3N0YXRlcy5jOgorCSAgSW1wcm92ZWQgc3RhdGUgY2hhbmdlIHVuaXQgdGVzdC4KKworMjAwNy0wOS0xOSAxODoxOTo0OSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBJZ25vcmUgcmVnaXN0cmllcyBpbiBhbnkgZm9ybWF0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9jaGVjay8uY3ZzaWdub3JlOgorCSAgSWdub3JlIHJlZ2lzdHJpZXMgaW4gYW55IGZvcm1hdC4KKworMjAwNy0wOS0xOSAxNjoyNDowOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzogUmVtb3ZlZCBzb21lIHVudXNlZCBjb2RlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6IChnc3RfcnRwX0wxNl9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICBSZW1vdmVkIHNvbWUgdW51c2VkIGNvZGUuCisJICAqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6IChnc3RfcnRwX2Ftcl9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6IChnc3RfcnRwX2dzbV9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydHBheS5jOiAoZ3N0X3J0cF9tcDJ0X3BheV9oYW5kbGVfYnVmZmVyKToKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOiAoZ3N0X3J0cF9zcGVleF9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICAqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6IChnc3RfcnRwX3RoZW9yYV9wYXlfaW5pdF9wYWNrZXQpLAorCSAgKGdzdF9ydHBfdGhlb3JhX3BheV9mbHVzaF9wYWNrZXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOiAoZ3N0X3J0cF92b3JiaXNfcGF5X2ZsdXNoX3BhY2tldCk6CisJICBUcnkgdG8gcHJlc2VydmUgdGhlIGluY29tbWluZyBidWZmZXIgZHVyYXRpb24gb24gdGhlIG91dGdvaW5nCisJICBwYWNrZXRzLiBGaXhlcyAjNDc4MjQ0LgorCisyMDA3LTA5LTE5IDEwOjIyOjQwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvdGFnbGliLzogV29yayBhcm91bmQgY29tcGlsZXIgd2FybmluZ3Mgd2l0aCBnKystNC4yIHdoZW4gYXNzaWduaW5nIGEgc3RyaW5nIGNvbnN0YW50IHRvIGEgZ2NoYXIgKiAocGFydGlhbGx5IGZpeGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL2dzdGFwZXYybXV4LmNjOgorCSAgKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSAgV29yayBhcm91bmQgY29tcGlsZXIgd2FybmluZ3Mgd2l0aCBnKystNC4yIHdoZW4gYXNzaWduaW5nIGEKKwkgIHN0cmluZyBjb25zdGFudCB0byBhIGdjaGFyICogKHBhcnRpYWxseSBmaXhlcyAjNDc4MDkyKS4KKworMjAwNy0wOS0xOCAxNjo0NDo0NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBXZSByZXF1aXJlIGNvcmUgQ1ZTIG5vdyBmb3IgZ3N0X2Jhc2Vfc3JjX3NldF9kb190aW1lc3RhbXAoKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBXZSByZXF1aXJlIGNvcmUgQ1ZTIG5vdyBmb3IgZ3N0X2Jhc2Vfc3JjX3NldF9kb190aW1lc3RhbXAoKS4KKworMjAwNy0wOS0xOCAxMzo1NTowNiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3Qvc3BlY3RydW0vOiBIYW5kbGluZyB3aW5kb3cgcmVzaXplLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1vc3NzcmMuYzoKKwkgIEhhbmRsaW5nIHdpbmRvdyByZXNpemUuCisKKzIwMDctMDktMTggMTE6NDU6MDYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgQ2hhbmdlTG9nOiBBZGQgbWlzc2luZyBuZXdsaW5lLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIENoYW5nZUxvZzoKKwkgIEFkZCBtaXNzaW5nIG5ld2xpbmUuCisJICAqIGdzdC9saWJyZmIvcmZiZGVjb2Rlci5jOgorCSAgRml4IHRoZSBidWlsZCAobWlzc2luZyBzdGRsaWIuaCkuCisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uaDoKKwkgIFVzZSBiYXNldHJhbnNmb3JtIHNlZ21lbnQgc28gdGhhdCBpdCBpcyBjb3JyZWN0bHkgbWFuYWdlZCBvbiBmbHVzaGVzCisJICBhbmQgc3RhcnQvc3RvcC4gUmVwb3J0IG1lc3NhZ2UgdGltZXN0YW1wIGFzIHN0cmVhbSB0aW1lLCB3aGljaCBpcyB3aGF0CisJICBhbiBhcHBsaWNhdGlvbiBjYW4gdW5kZXJzdGFuZC4gKFllcyB0aGVzZSBhcmUgYWRhcHRlZCBmcm9tIHdpbSByZWNlbnQKKwkgIGxldmVsIGVsZW1lbnQgY2hhbmdlcykKKworMjAwNy0wOS0xNyAxNzozNToxMyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC86IEZpeCBjb21waWxlciB3YXJuaW5ncyBzaG93biB3aXRoIEZvcnRlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jOiAoZ3N0X2F1ZGlvX2R5bmFtaWNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2NyZWF0ZV9zdHJlYW0pLAorCSAgKG5ld19zZXNzaW9uX3BhZCksIChyZXF1ZXN0X3B0X21hcCksIChnc3RfcnRzcHNyY19kb19zdHJlYW1fZW9zKSwKKwkgIChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKSwgKGdzdF9ydHNwc3JjX3BhcnNlX3J0cGluZm8pLAorCSAgKGdzdF9ydHNwc3JjX2hhbmRsZV9tZXNzYWdlKToKKwkgIEZpeCBjb21waWxlciB3YXJuaW5ncyBzaG93biB3aXRoIEZvcnRlLgorCisyMDA3LTA5LTE3IDAyOjA1OjE0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IEdpdmUgbWVhbmluZ2Z1bGwgZXJyb3Igd2hlbiBhbGwgc3RyZWFtcyBmYWlsZWQgdG8gY29uZmlndXJlIGZvciBzb21lIHJlYXNvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zZXR1cF9zdHJlYW1zKSwKKwkgIChnc3RfcnRzcHNyY19kdXBfcHJpbnRmKToKKwkgIEdpdmUgbWVhbmluZ2Z1bGwgZXJyb3Igd2hlbiBhbGwgc3RyZWFtcyBmYWlsZWQgdG8gY29uZmlndXJlIGZvciBzb21lCisJICByZWFzb24uCisKKzIwMDctMDktMTYgMTk6MTM6NTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvUkVBRE1FOiBVcGRhdGUgUkVBRE1FIHdpdGggdGhlIGRlc2lnbiBmb3Igc3luY2hyb25pc2F0aW9uIHJ1bGVzIG9mIFJUUCBvbiBzZW5kZXIgYW5kIHJlY2VpdmVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvUkVBRE1FOgorCSAgVXBkYXRlIFJFQURNRSB3aXRoIHRoZSBkZXNpZ24gZm9yIHN5bmNocm9uaXNhdGlvbiBydWxlcyBvZiBSVFAgb24KKwkgIHNlbmRlciBhbmQgcmVjZWl2ZXIuCisKKzIwMDctMDktMTQgMDk6NDA6NDkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IERvbid0IHB1c2ggRU9TIGZyb20gdGhlIGNoYWluIGZ1bmN0aW9uLCB0aGUgZWxlbWVudCBkcml2aW5nIHRoZSBwaXBlbGluZSBpcyByZXNwb25zaWJsZSBmLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfbG9vcCksCisJICAoZ3N0X3dhdnBhcnNlX2NoYWluKToKKwkgIERvbid0IHB1c2ggRU9TIGZyb20gdGhlIGNoYWluIGZ1bmN0aW9uLCB0aGUgZWxlbWVudAorCSAgZHJpdmluZyB0aGUgcGlwZWxpbmUgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMuIFRoZSBidWcKKwkgIHRoaXMgd2FzIG1lYW50IHRvIGZpeCBzZWVtcyB0byBiZSBxdWV1ZSBub3QgZm9yd2FyZGluZworCSAgRU9TIGluIGFsbCBjYXNlcyAoc2VlICM0NzY1MTQpLgorCisyMDA3LTA5LTEzIDE3OjMxOjE2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvbGV2ZWwvZ3N0bGV2ZWwuKjogVXNlIGJhc2V0cmFuc2Zvcm0gc2VnbWVudCBzbyB0aGF0IGl0IGlzIGNvcnJlY3RseSBtYW5hZ2VkIG9uIGZsdXNoZXMgYW5kIHN0YXJ0L3N0b3AuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfY2xhc3NfaW5pdCksIChnc3RfbGV2ZWxfc3RhcnQpLAorCSAgKGdzdF9sZXZlbF90cmFuc2Zvcm1faXApOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuaDoKKwkgIFVzZSBiYXNldHJhbnNmb3JtIHNlZ21lbnQgc28gdGhhdCBpdCBpcyBjb3JyZWN0bHkgbWFuYWdlZCBvbiBmbHVzaGVzIGFuZAorCSAgc3RhcnQvc3RvcC4KKwkgIFJlcG9ydCBtZXNzYWdlIHRpbWVzdGFtcCBhcyBzdHJlYW0gdGltZSwgd2hpY2ggaXMgd2hhdCBhbiBhcHBsaWNhdGlvbgorCSAgY2FuIHVuZGVyc3RhbmQuCisKKzIwMDctMDktMTMgMTU6MDQ6MTUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgVXBkYXRlIG15IG1haWwgYWRkcmVzcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL2dzdGFwZXYybXV4LmNjOgorCSAgKiBleHQvdGFnbGliL2dzdGFwZXYybXV4Lmg6CisJICAqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4LmM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2FwZXYybXV4LmM6CisJICBVcGRhdGUgbXkgbWFpbCBhZGRyZXNzLgorCisyMDA3LTA5LTEzIDEyOjM3OjU2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBBZGQgRU9TIGxvZ2ljIGZvciB0aGUgcHVzaC1iYXNlZCBtb2RlIHRvby4gRml4ZXMgIzQ3NjUxNC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9wZXJmb3JtX2VvcyksCisJICAoZ3N0X3dhdnBhcnNlX2xvb3ApLCAoZ3N0X3dhdnBhcnNlX2NoYWluKToKKwkgIEFkZCBFT1MgbG9naWMgZm9yIHRoZSBwdXNoLWJhc2VkIG1vZGUgdG9vLiBGaXhlcyAjNDc2NTE0LgorCisyMDA3LTA5LTEyIDIyOjAxOjU5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvbGF3LzogRml4IGxhdyBlbmNvZGVyIHRpbWVzdGFtcHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOiAoZ3N0X2FsYXdlbmNfaW5pdCksIChnc3RfYWxhd2VuY19jaGFpbik6CisJICAqIGdzdC9sYXcvYWxhdy1lbmNvZGUuaDoKKwkgICogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzogKGdzdF9tdWxhd2VuY19pbml0KSwKKwkgIChnc3RfbXVsYXdlbmNfY2hhaW4pOgorCSAgKiBnc3QvbGF3L211bGF3LWVuY29kZS5oOgorCSAgRml4IGxhdyBlbmNvZGVyIHRpbWVzdGFtcHMuCisKKzIwMDctMDktMTIgMDk6MTM6MzkgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmM6IEZpeCB3YXJuaW5nIHdoZW4gYnVpbGRpbmcgd2l0aG91dCBkZWJ1Zy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NpbmsuYzoKKwkgIEZpeCB3YXJuaW5nIHdoZW4gYnVpbGRpbmcgd2l0aG91dCBkZWJ1Zy4KKwkgICogc3lzL29zcy9nc3Rvc3NtaXhlcnRyYWNrLmM6CisJICBVc2UgY29uc3QgbGlrZSBpbiBhbHNhbWl4ZXJ0cmFjay5jIChmaXhlcyB3YXJuaW5ncykuCisKKzIwMDctMDktMTIgMDg6Mzg6MjEgKzAwMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJICBnc3QvOiBQcmludGYgZm9ybWF0IGZpeGVzICgjNDc2MTI4KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFBldGVyIEtqZWxsZXJzdGVkdCAgPHBraiBhdCBheGlzIGNvbT4KKwkgICogZ3N0LWxpYnMvZ3N0L2FwcC9nc3RhcHBzaW5rLmM6CisJICAqIGdzdC9mbHYvZ3N0Zmx2ZGVtdXguYzoKKwkgICogZ3N0L2Zsdi9nc3RmbHZwYXJzZS5jOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgICogZ3N0L3N3aXRjaC9nc3Rzd2l0Y2guYzoKKwkgIFByaW50ZiBmb3JtYXQgZml4ZXMgKCM0NzYxMjgpLgorCisyMDA3LTA5LTExIDE1OjM3OjU1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IEZpeCBmcmFtZXJhdGUgZGV0ZWN0aW9uIGNvZGUgc29tZSBtb3JlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIChnc3RfdjRsMnNyY19wcm9iZV9jYXBzX2Zvcl9mb3JtYXRfYW5kX3NpemUpOgorCSAgRml4IGZyYW1lcmF0ZSBkZXRlY3Rpb24gY29kZSBzb21lIG1vcmUuCisJICBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgYSB3ZWlyZCBzdGVwIGluIHRoZSBzdGVwd2lzZSBmcmFtZXJhdGVzLgorCSAgRG9uJ3Qgb3ZlcndyaXRlIHRoZSBtaW4gaW50ZXJ2YWwgd2l0aCB0aGUgZnJhbWVyYXRlLCB1c2UgYSB0ZW1wIHZhcmlhYmxlCisJICBpbnN0ZWFkLgorCSAgVXNlIG1heCBpbiB0aGUgQ29udGludW91cyBmcmFtZXJhdGUgaW50ZXJ2YWxzIGluc3RlYWQgb2Ygc3RlcCwgd2hpY2ggaXMKKwkgIDEgYWNjb3JkaW5nIHRvIHRoZSBkb2NzLiBGaXhlcyAjNDc1NDI0LgorCisyMDA3LTA5LTEwIDE5OjUzOjI4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy5jOiBNYWtlIHVkcHNyYyB0aW1lc3RhbXAgb3V0Z29pbmcgYnVmZmVycyBiYXNlZCBvbiB3aGVuIHRoZXkgd2VyZSByZWNlaXZlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19pbml0KSwgKGdzdF91ZHBzcmNfY3JlYXRlKToKKwkgIE1ha2UgdWRwc3JjIHRpbWVzdGFtcCBvdXRnb2luZyBidWZmZXJzIGJhc2VkIG9uIHdoZW4gdGhleSB3ZXJlIHJlY2VpdmVkLgorCSAgQWxzbyBtYWtlIGl0IG91dHB1dCBhIHNlZ21lbnQgaW4gdGltZS4KKworMjAwNy0wOS0xMCAwNjo0OTozMiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IFBsdWcgYSBsaXR0bGUgbGVhay4gTGl0dGxlIGNvZGUgY2xlYW51cHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgUGx1ZyBhIGxpdHRsZSBsZWFrLiBMaXR0bGUgY29kZSBjbGVhbnVwcy4KKworMjAwNy0wOS0wOSAxODowODozNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBVc2UgQUNfVFJZX0NPTVBJTEUgaW5zdGVhZCBvZiBBQ19UUllfUlVOIHRvIGNoZWNrIGZvciBvbGQgZmxhYyB2ZXJzaW9ucywgJ3MgZ29vZCBmb3IgY3Jvc3MtY29tcGlsYXRpb24gLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgVXNlIEFDX1RSWV9DT01QSUxFIGluc3RlYWQgb2YgQUNfVFJZX1JVTiB0byBjaGVjayBmb3Igb2xkCisJICBmbGFjIHZlcnNpb25zLCAncyBnb29kIGZvciBjcm9zcy1jb21waWxhdGlvbiBrYXJtYS4KKworMjAwNy0wOS0wNyAxODowNDo0MSArMDAwMCAgSGFha29uIFNwb3JzaGVpbSA8aGFha29uLnNwb3JzaGVpbUB0YW5kYmVyZy5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOiBGaXggdXAgaGVhZGVyIHN0cnVjdHVyZSBzbyB0aGF0IGNvbXBpbGVycyBkb24ndCBhZGQgcGFkZGluZyBiZXR3ZWVuIHRoZSBzdHJ1Y3R1cmUgZmllbGRzLCBzaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSGFha29uIFNwb3JzaGVpbSAgPGhhYWtvbi5zcG9yc2hlaW0gYXQgdGFuZGJlcmcgY29tPgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgIEZpeCB1cCBoZWFkZXIgc3RydWN0dXJlIHNvIHRoYXQgY29tcGlsZXJzIGRvbid0IGFkZCBwYWRkaW5nCisJICBiZXR3ZWVuIHRoZSBzdHJ1Y3R1cmUgZmllbGRzLCBzaW5jZSB0aGF0IHdvdWxkIGxlYWQgdG8gdXMKKwkgIHNlbmRpbmcgUlRQIHBhY2tldHMgd2l0aCBicm9rZW4gaGVhZGVycyAoYXMgaXMgY3VycmVudGx5IHRoZQorCSAgY2FzZSB3aGVuIGNvbXBpbGluZyB3aXRoIE1TVkMpLiBBbHNvIHNlZSBzaW1pbGFyIGZpeGVzIGluCisJICBsaWJnc3RydHAgaW4gZ3N0LXBsdWdpbnMtYmFzZS4gKCM0NzQ2MTY7ICM0NzExOTQpCisKKzIwMDctMDktMDcgMTY6MDQ6MTQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogRG9uJ3Qgb3ZlcndyaXRlIG91ciBHVmFsdWUgd2l0aCAwIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgcHJldmlvdXNseSBjb21wdXRlZCB2YWx1ZS4gRml4ZXMgIzQ3MS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIChnc3RfdjRsMnNyY19wcm9iZV9jYXBzX2Zvcl9mb3JtYXRfYW5kX3NpemUpOgorCSAgRG9uJ3Qgb3ZlcndyaXRlIG91ciBHVmFsdWUgd2l0aCAwIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgcHJldmlvdXNseQorCSAgY29tcHV0ZWQgdmFsdWUuIEZpeGVzICM0NzE4MjMgc29tZSBtb3JlLgorCisyMDA3LTA5LTA3IDE1OjU0OjM4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiBVc2UgdGhlIGNvcnJlY3QgcGFyYW1ldGVyIG9yZGVyIGZvciB0aGUgbWVtc2V0IGNhbGxzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX3N0YXJ0KSwKKwkgIChnc3Rfc3BlY3RydW1fdHJhbnNmb3JtX2lwKToKKwkgIFVzZSB0aGUgY29ycmVjdCBwYXJhbWV0ZXIgb3JkZXIgZm9yIHRoZSBtZW1zZXQgY2FsbHMuCisJICBUaGFua3MgdG8gQ2hyaXN0aWFuIFNjaGFsbGVyIGZvciBub3RpY2luZy4KKworMjAwNy0wOS0wNiAxMjowMDozNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6IE5vIHRhYnMgaW4gdGhpcyBmaWxlIHBsZWFzZSwgb3IgZ3RrLWRvYyB3aWxsIGVuZCB1cCBkb2N1bWVudGluZyByYXRoLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICBObyB0YWJzIGluIHRoaXMgZmlsZSBwbGVhc2UsIG9yIGd0ay1kb2Mgd2lsbCBlbmQgdXAgZG9jdW1lbnRpbmcKKwkgIHJhdGhlciBhYnN1cmQgY2xhc3MgaGllcmFyY2hpZXMuCisKKzIwMDctMDktMDYgMTA6NDg6NTYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9nY29uZi9nc3Rzd2l0Y2hzaW5rLmM6IElmIHRoZSBuZXcga2lkIGVsZW1lbnQgZmFpbHMgdG8gY2hhbmdlIHN0YXRlIGZvciBzb21lIHJlYXNvbiBmb3J3YXJkIHRoZSBlcnJvciBtZXNzYWdlIGl0IC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nY29uZi9nc3Rzd2l0Y2hzaW5rLmM6CisJICBJZiB0aGUgbmV3IGtpZCBlbGVtZW50IGZhaWxzIHRvIGNoYW5nZSBzdGF0ZSBmb3Igc29tZSByZWFzb24KKwkgIChlLmcuIGVzZHNpbmsgbm90IGJlaW5nIGFibGUgdG8gY29ubmVjdCB0byB0aGUgc291bmQgc2VydmVyKSwKKwkgIGZvcndhcmQgdGhlIGVycm9yIG1lc3NhZ2UgaXQgcG9zdGVkIG9uIHRoZSBidXMgaW5zdGVhZCBvZiBqdXN0CisJICBwb3N0aW5nIGEgZ2VuZXJpYyAnSW50ZXJuYWwgc3RhdGUgY2hhbmdlIGVycm9yOiBwbGVhc2UgZmlsZSBhCisJICBidWcnIGVycm9yIG1lc3NhZ2UuIEZpeGVzICM0NzEzNjQuCisKKzIwMDctMDktMDYgMDc6MjE6MjIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgUG9ydCBHc3RTcGVjdHJ1bSB0byBHc3RBdWRpb0ZpbHRlciBhbmQgbGliZ3N0ZmZ0LCBhZGQgc3VwcG9ydCBmb3IgaW50MzIsIGZsb2F0IGFuZCBkb3VibGUsIHVzZSBmbG9hdHMgZm9yIHRoZSBtZXNzYWdlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3Qvc3BlY3RydW0vTWFrZWZpbGUuYW06CisJICAqIGdzdC9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOiAoZHJhd19zcGVjdHJ1bSksCisJICAobWVzc2FnZV9oYW5kbGVyKSwgKG1haW4pOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1vc3NzcmMuYzogKGRyYXdfc3BlY3RydW0pLCAobWVzc2FnZV9oYW5kbGVyKToKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IChnc3Rfc3BlY3RydW1fYmFzZV9pbml0KSwKKwkgIChnc3Rfc3BlY3RydW1fY2xhc3NfaW5pdCksIChnc3Rfc3BlY3RydW1faW5pdCksCisJICAoZ3N0X3NwZWN0cnVtX2Rpc3Bvc2UpLCAoZ3N0X3NwZWN0cnVtX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3NwZWN0cnVtX2dldF9wcm9wZXJ0eSksIChnc3Rfc3BlY3RydW1fc3RhcnQpLAorCSAgKGdzdF9zcGVjdHJ1bV9zZXR1cCksIChnc3Rfc3BlY3RydW1fbWVzc2FnZV9uZXcpLAorCSAgKGdzdF9zcGVjdHJ1bV90cmFuc2Zvcm1faXApOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uaDoKKwkgIFBvcnQgR3N0U3BlY3RydW0gdG8gR3N0QXVkaW9GaWx0ZXIgYW5kIGxpYmdzdGZmdCwgYWRkIHN1cHBvcnQKKwkgIGZvciBpbnQzMiwgZmxvYXQgYW5kIGRvdWJsZSwgdXNlIGZsb2F0cyBmb3IgdGhlIG1lc3NhZ2UgY29udGVudHMsCisJICBhdmVyYWdlIGFsbCBGRlRzIGRvbmUgaW4gb25lIGludGVydmFsIGZvciBiZXR0ZXIgcmVzdWx0cywgdXNlCisJICBhIGJldHRlciB3aW5kb3dpbmcgZnVuY3Rpb24sIGFsbG93IHBvc3RpbmcgdGhlIHBoYXNlIGluIHRoZSBtZXNzYWdlCisJICBhbmQgYWN0dWFsbHkgZG8gYW4gRkZUIHdpdGggdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYmFuZHMgaW5zdGVhZAorCSAgb2YgaW50ZXJwb2xhdGluZy4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvc3BlY3RydW0uYzogKEdTVF9TVEFSVF9URVNUKSwKKwkgIChzcGVjdHJ1bV9zdWl0ZSk6CisJICBJbXByb3ZlIHRoZSB1bml0cyB0ZXN0cyBieSBjaGVja2luZyBmb3IgYSAxMTAyNUh6IHNpbmUgd2F2ZQorCSAgYW5kIGFkZCB1bml0IHRlc3RzIGZvciBhbGwgNCBzdXBwb3J0ZWQgc2FtcGxlIHR5cGVzLgorCisyMDA3LTA5LTA1IDE2OjIzOjIxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvcXRkZW11eC86IERvbid0IGFzc3VtZSB0YWdzIGFyZSBlbmNvZGVkIGFzIFVURi04ICgjNDczNjcwKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgRG9uJ3QgYXNzdW1lIHRhZ3MgYXJlIGVuY29kZWQgYXMgVVRGLTggKCM0NzM2NzApLgorCisyMDA3LTA5LTA1IDE0OjQzOjE2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvdjRsMi86IEltcGxlbWVudCBMQVRFTkNZIHF1ZXJpZXMgaW4gdGhlIGNydWRlc3Qgd2F5IHBvc3NpYmxlIHNvIEkgZG9uJ3QgaGF2ZSB0byB1c2Ugc3luYz1mYWxzZSBhbnkgbG9uZ2VyIHdoZW4gdGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSAgSW1wbGVtZW50IExBVEVOQ1kgcXVlcmllcyBpbiB0aGUgY3J1ZGVzdCB3YXkgcG9zc2libGUgc28gSSBkb24ndAorCSAgaGF2ZSB0byB1c2Ugc3luYz1mYWxzZSBhbnkgbG9uZ2VyIHdoZW4gdGVzdGluZyB3aXRoIHZpZGVvc2lua3MuCisKKzIwMDctMDktMDUgMDk6MjU6MjMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogRml4IGJ1aWxkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEZpeCBidWlsZC4KKworMjAwNy0wOS0wNSAwMDoxMjo0NiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiBBZGQgc29tZSBtb3JlIGRlYnVnZ2luZyBpbiB0aGUgZnJhbWVyYXRlIGZ1bmN0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIChnc3RfdjRsMnNyY19wcm9iZV9jYXBzX2Zvcl9mb3JtYXRfYW5kX3NpemUpOgorCSAgQWRkIHNvbWUgbW9yZSBkZWJ1Z2dpbmcgaW4gdGhlIGZyYW1lcmF0ZSBmdW5jdGlvbi4KKwkgIEl0ZXJhdGUgc3RlcHdpc2UgZnJhbWVyYXRlIHVwIHRvIGFuZCBfaW5jbHVkaW5nXyB0aGUgbWF4IGFuZCBpZiBub3RoaW5nCisJICB3YXMgYWRkZWQgdG8gdGhlIGxpc3QsIGFkZCBhIGR1bW15IDAvMSB0byAxMDAvMSBmcmFtZXJhdGUgc28gdGhhdCB3ZQorCSAgZG9uJ3QgZW5kIHVwIHdpdGggYW4gZW1wdHkgbGlzdC4KKworMjAwNy0wOS0wNCAyMjo0MjoyMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogQWRkIHByb3BlcnR5IGRvIGNvbmZpZ3VyZSBkZXN0aW5hdGlvbiBhZGRyZXNzL3BvcnQgcGFpcnMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19jbGFzc19pbml0KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX3NldF9jbGllbnRzX3N0cmluZyksCisJICAoZ3N0X211bHRpdWRwc2lua19nZXRfY2xpZW50c19zdHJpbmcpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX2luaXRfc2VuZCksIChnc3RfbXVsdGl1ZHBzaW5rX2FkZF9pbnRlcm5hbCksCisJICAoZ3N0X211bHRpdWRwc2lua19hZGQpLCAoZ3N0X211bHRpdWRwc2lua19jbGVhcl9pbnRlcm5hbCksCisJICAoZ3N0X211bHRpdWRwc2lua19jbGVhcik6CisJICBBZGQgcHJvcGVydHkgZG8gY29uZmlndXJlIGRlc3RpbmF0aW9uIGFkZHJlc3MvcG9ydCBwYWlycworCSAgQVBJOkdzdE11bHRpVURQU2luazo6Y2xpZW50cworCisyMDA3LTA5LTA0IDE4OjMwOjIyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICB0ZXN0cy9leGFtcGxlcy86IEFkZGVkIHNvbWUgUlRQIGV4YW1wbGUgc2NyaXB0cyBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nIFJUUCBzdHJlYW1zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2V4YW1wbGVzL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3AtQU1SLnNoOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLVBDTUEuc2RwOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLVBDTUEuc2g6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC1QQ01BLnNkcDoKKwkgICogdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LVBDTUEuc2g6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtUENNQS5zaDoKKwkgICogdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtSDI2M3AtQVRTLVBDTUEuc2g6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLnNoOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2M3AtYWxzYXNyYy1BTVIuc2g6CisJICAqIHRlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjY0LWFsc2FzcmMtUENNQS5zaDoKKwkgIEFkZGVkIHNvbWUgUlRQIGV4YW1wbGUgc2NyaXB0cyBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nIFJUUCBzdHJlYW1zLgorCisyMDA3LTA5LTA0IDE2OjQwOjA1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IFJlc3RydWN0dXJlIHRoZSBzZXRjYXBzIGZ1bmN0aW9uIHNvIHRoYXQgd2UgY2FuIGFsc28gY29tcHV0ZSB0aGUgZXhwZWN0ZWQgR1N0cmVhbWVyIG91dHB1dCBzaXouLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMl9nZXRfY2Fwc19pbmZvKSwKKwkgIChnc3RfdjRsMnNyY19zZXRfY2FwcyksIChnc3RfdjRsMnNyY19nZXRfbW1hcCk6CisJICBSZXN0cnVjdHVyZSB0aGUgc2V0Y2FwcyBmdW5jdGlvbiBzbyB0aGF0IHdlIGNhbiBhbHNvIGNvbXB1dGUgdGhlCisJICBleHBlY3RlZCBHU3RyZWFtZXIgb3V0cHV0IHNpemUgb2YgdGhlIHZpZGVvIGZyYW1lcy4KKwkgIFNldCBmcmFtZV9ieXRlX3NpemUgY29ycmVjdGx5IHNvIHRoYXQgcmVhZC1iYXNlZCBkZXZpY2VzIGhhdmUgYSBjaGFuY2UKKwkgIG9mIHdvcmtpbmcgY29ycmVjdGx5LgorCSAgV2hlbiBncmFiYmluZyBhIGZyYW1lLCBkaXNjYXJkIGZyYW1lcyB0aGF0IGFyZSBub3Qgb2YgdGhlIGV4cGVjdGVkIHNpemUuCisJICBTb21lIGNhbWVyYXMgZG9uJ3Qgb3V0cHV0IHRoZSByaWdodCBmcmFtZXNpemUgZm9yIHRoZSBmaXJzdCBidWZmZXIuCisJICBUcnkgb25seSBhIGNvdXBsZSBvZiB0aW1lcyB0byBnZXQgYSB2YWxpZCBmcmFtZSwgZWxzZSBlcnJvciBvdXQuCisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogKGdzdF92NGwyX2dldF9jYXBhYmlsaXRpZXMpLAorCSAgKGdzdF92NGwyX2ZpbGxfbGlzdHMpLCAoZ3N0X3Y0bDJfZ2V0X2lucHV0KToKKwkgIEFkZCBzb21lIG1vcmUgZGVidWcgaW5mbyB3aGVuIHNjYW5uaW5nIHRoZSBkZXZpY2UuCisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyX2J1ZmZlcl9uZXcpLAorCSAgKGdzdF92NGwyX2J1ZmZlcl9wb29sX25ldyksIChnc3RfdjRsMl9idWZmZXJfcG9vbF9hY3RpdmF0ZSksCisJICAoZ3N0X3Y0bDJzcmNfZmlsbF9mb3JtYXRfbGlzdCksIChnc3RfdjRsMnNyY19ncmFiX2ZyYW1lKSwKKwkgIChnc3RfdjRsMnNyY19zZXRfY2FwdHVyZSksIChnc3RfdjRsMnNyY19jYXB0dXJlX2luaXQpOgorCSAgQWRkIHNvbWUgbW9yZSBkZWJ1ZyBpbmZvIHdoZW4gZGVxdWVpbmcgYSBmcmFtZS4KKworMjAwNy0wOS0wNCAxNDozNzoyMiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogTW9yZSBjb2RlIGNsZWFudXBzLiBBZGQgc29tZSBtb3JlIGNvbW1lbnQgYW5kIGltcHJvdmUgZGVidWdzIGxvZ3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBNb3JlIGNvZGUgY2xlYW51cHMuIEFkZCBzb21lIG1vcmUgY29tbWVudCBhbmQgaW1wcm92ZSBkZWJ1Z3MgbG9ncy4KKworMjAwNy0wOS0wNCAwNzo1ODozNiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuKjogSW1wbGVtZW50IHNlZWstcXVlcnkuIFJlZmFjdG9yIGR1cmF0aW9uIGNhbGN1bGF0aW9ucy4gQXBwcm9wcmlhdGUgdXNlIG9mIHVpbnQ2NF9zY2FsZV9pbnQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICBJbXBsZW1lbnQgc2Vlay1xdWVyeS4gUmVmYWN0b3IgZHVyYXRpb24gY2FsY3VsYXRpb25zLiBBcHByb3ByaWF0ZSB1c2UKKwkgIG9mIHVpbnQ2NF9zY2FsZV9pbnQgYW5kIHVpbnQ2NF9zY2FsZS4gTW92ZSByZXBlYWRlZGx5IGNhbGN1bGF0ZWQgc3R1ZmYKKwkgIG91dCBvZiBsb29wcy4KKworMjAwNy0wOS0wMyAwNzo0NDozNCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IEltcGxlbWVudCBzZWVrLXF1ZXJ5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIEltcGxlbWVudCBzZWVrLXF1ZXJ5LgorCisyMDA3LTA4LTI5IDIxOjQzOjA4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IFVzZSBuZXcgYmFzZXNpbmsgYXN5bmMgcHJvcGVydHkgdG8gbWFrZSBzcGFyc2UgUlRDUCBwYWNrZXQgbm90IHdhaXQgZm9yIHByZXJvbGwuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV91ZHBfc2luayksCisJICAoZ3N0X3J0c3BzcmNfZHVwX3ByaW50Zik6CisJICBVc2UgbmV3IGJhc2VzaW5rIGFzeW5jIHByb3BlcnR5IHRvIG1ha2Ugc3BhcnNlIFJUQ1AgcGFja2V0IG5vdCB3YWl0IGZvcgorCSAgcHJlcm9sbC4KKworMjAwNy0wOC0yNyAxNDo0NDoxOSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9hdWRpb2Z4L01ha2VmaWxlLmFtOiBEaXN0IHRoZSByaWdodCBmaWxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdWRpb2Z4L01ha2VmaWxlLmFtOgorCSAgRGlzdCB0aGUgcmlnaHQgZmlsZS4KKworMjAwNy0wOC0yMyAxNjoyNzozNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBNYWtlIHN1cmUgd2UgZ2VuZXJhdGUgYW5kIHBhcnNlIGZsb2F0aW5nIHBvaW50IHZhbHVlcyBpbiB0aGUgUE9TSVggbG9jYWxlIGluc3RlYWQgb2YgdGhlIGN1cnJlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfZHVwX3ByaW50ZiksCisJICAoZ3N0X3J0c3BzcmNfZ2V0X2Zsb2F0KSwgKGdzdF9ydHNwc3JjX3BsYXkpOgorCSAgTWFrZSBzdXJlIHdlIGdlbmVyYXRlIGFuZCBwYXJzZSBmbG9hdGluZyBwb2ludCB2YWx1ZXMgaW4gdGhlIFBPU0lYCisJICBsb2NhbGUgaW5zdGVhZCBvZiB0aGUgY3VycmVudCBsb2NhbGUuCisKKzIwMDctMDgtMjIgMTU6MDE6MjkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuKjogRml4IG1ldGhvZCBkZXRlY3Rpb24gYWdhaW4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfZG9fc2VlayksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfbWV0aG9kcyksIChnc3RfcnRzcHNyY19vcGVuKSwKKwkgIChnc3RfcnRzcHNyY19wbGF5KToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgRml4IG1ldGhvZCBkZXRlY3Rpb24gYWdhaW4uCisJICBLZWVwIHRyYWNrIG9mIHdoZW4gd2UgbXVzdCBzZW5kIGEgUmFuZ2UgaGVhZGVyLgorCSAgVXNlIHNlZ21lbnQgdmFsdWVzIGZvciBSYW5nZSwgU3BlZWQgYW5kIFNjYWxlIGhlYWRlcnMuCisJICBQYXJzZSBTcGVlZCBhbmQgU2NhbGUgaGVhZGVycyB0byB1cGRhdGUgdGhlIHNlZ21lbnQgdmFsdWVzLgorCisyMDA3LTA4LTIyIDA4OjIyOjUwICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorCisJICBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IEhhbmRsZSBvcHRpb25hbCB2NGwyIGlvY3RscyBncmFjZWZ1bGx5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBwYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3QHNreW5ldC5iZT4KKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSAgSGFuZGxlIG9wdGlvbmFsIHY0bDIgaW9jdGxzIGdyYWNlZnVsbHkuCisKKzIwMDctMDgtMjAgMTY6NTI6MDMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBBZGRlZCBhbiBIMjYzIGRlcGF5bG9hZGVyLiBGaXhlcyAjMzY5MzkyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHAvZ3N0cnRwLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmM6IChnc3RfcnRwX2gyNjNfZGVwYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX2gyNjNfZGVwYXlfY2xhc3NfaW5pdCksIChnc3RfcnRwX2gyNjNfZGVwYXlfaW5pdCksCisJICAoZ3N0X3J0cF9oMjYzX2RlcGF5X2ZpbmFsaXplKSwgKGdzdF9ydHBfaDI2M19kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX2gyNjNfZGVwYXlfcHJvY2VzcyksIChnc3RfcnRwX2gyNjNfZGVwYXlfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2gyNjNfZGVwYXlfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2gyNjNfZGVwYXlfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcnRwX2gyNjNfZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5oOgorCSAgQWRkZWQgYW4gSDI2MyBkZXBheWxvYWRlci4gRml4ZXMgIzM2OTM5Mi4KKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6IChnc3RfcnRwX2gyNjNwX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfaDI2M3BfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzogKGdzdF9mcmFnbWVudGF0aW9uX21vZGVfZ2V0X3R5cGUpLAorCSAgKGdzdF9ydHBfaDI2M3BfcGF5X2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9oMjYzcF9wYXlfZmx1c2gpOgorCSAgTWFrZSB0aGUgSDI2MysgcGF5L2RlcGF5bG9hZGVyIHN1cHBvcnQgSDI2My0xOTk4IGFuZCBIMjYzLTIwMDAKKwkgIHBheWxvYWRzLgorCSAgQWxzbyBhbG93IHBsYWluIEgyNjMgb24gdGhlIGgyNjNwIHBheWxvYWRlcnMuIEZpeGVzICM0NjUwNDAuCisKKzIwMDctMDgtMTkgMTk6MTY6MzMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ZpbHRlci86IEFkZCBzbWFsbCBjb21wYXJpc2lvbiB3aXRoIHRoZSBjaGVieXNoZXYgZmlsdGVycyBpbiB0aGUgZG9jcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzoKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6CisJICBBZGQgc21hbGwgY29tcGFyaXNpb24gd2l0aCB0aGUgY2hlYnlzaGV2IGZpbHRlcnMgaW4gdGhlIGRvY3MuCisKKzIwMDctMDgtMTkgMTk6MTE6MDQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2F1ZGlvZngvOiBBZGQgc21hbGwgY29tcGFyaXNpb24gd2l0aCB0aGUgd2luZG93ZWQgc2luYyBmaWx0ZXJzIGluIHRoZSBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYnlzaGV2ZnJlcWJhbmQuYzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGVieXNoZXZmcmVxbGltaXQuYzoKKwkgIEFkZCBzbWFsbCBjb21wYXJpc2lvbiB3aXRoIHRoZSB3aW5kb3dlZCBzaW5jIGZpbHRlcnMgaW4gdGhlIGRvY3MuCisKKzIwMDctMDgtMTkgMTk6MDE6NDUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvOiBBbHNvIHRlc3QgZXZlcnl0aGluZyBpbiAzMiBiaXQgZmxvYXQgbW9kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9icHdzaW5jLmM6IChHU1RfU1RBUlRfVEVTVCksCisJICAoYnB3c2luY19zdWl0ZSk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xwd3NpbmMuYzogKEdTVF9TVEFSVF9URVNUKSwKKwkgIChscHdzaW5jX3N1aXRlKToKKwkgIEFsc28gdGVzdCBldmVyeXRoaW5nIGluIDMyIGJpdCBmbG9hdCBtb2RlLgorCisyMDA3LTA4LTE5IDE4OjQ3OjE5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHRlc3RzL2NoZWNrL2VsZW1lbnRzLzogQWxzbyB0ZXN0IDMyIGJpdCBmbG9hdCBtb2RlIGFuZCB0aGUgdHlwZSAyIHZhcmlhbnRzIG9mIHRoZSBmaWx0ZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYnlzaGV2ZnJlcWJhbmQuYzogKEdTVF9TVEFSVF9URVNUKSwKKwkgIChhdWRpb2NoZWJ5c2hldmZyZXFiYW5kX3N1aXRlKToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9jaGVieXNoZXZmcmVxbGltaXQuYzogKEdTVF9TVEFSVF9URVNUKSwKKwkgIChhdWRpb2NoZWJ5c2hldmZyZXFsaW1pdF9zdWl0ZSk6CisJICBBbHNvIHRlc3QgMzIgYml0IGZsb2F0IG1vZGUgYW5kIHRoZSB0eXBlIDIgdmFyaWFudHMgb2YgdGhlIGZpbHRlcnMuCisKKzIwMDctMDgtMTggMTk6NDQ6NTUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogUmVmYWN0b3IgdGhlIHVkcCBhbmQgaW50ZXJsZWF2ZWQgbG9vcCBmdW5jdGlvbiBhIGJpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKSwKKwkgIChnc3RfcnRzcHNyY19sb29wX3VkcCksIChnc3RfcnRzcHNyY19sb29wX3NlbmRfY21kKSwKKwkgIChnc3RfcnRzcHNyY19sb29wKToKKwkgIFJlZmFjdG9yIHRoZSB1ZHAgYW5kIGludGVybGVhdmVkIGxvb3AgZnVuY3Rpb24gYSBiaXQuCisKKzIwMDctMDgtMTcgMTc6MDg6MTEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuKjogUHJvdGVjdCBjb25uZWN0aW9uIGFjdGl2aXR5IHdpdGggYSBuZXcgbG9jaywgYXZvaWRzIGRlYWRsb2NrcyB3aGVuIGdvaW5nIHRvIFBBVVNFRC4gRml4ZXMgIzQ1NS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2luaXQpLAorCSAgKGdzdF9ydHNwc3JjX2ZpbmFsaXplKSwgKGdzdF9ydHNwc3JjX2Nvbm5lY3Rpb25fc2VuZCksCisJICAoZ3N0X3J0c3BzcmNfY29ubmVjdGlvbl9yZWNlaXZlKSwgKGdzdF9ydHNwc3JjX3NpbmtfY2hhaW4pLAorCSAgKGdzdF9ydHNwc3JjX2hhbmRsZV9yZXF1ZXN0KSwgKGdzdF9ydHNwc3JjX3NlbmRfa2VlcF9hbGl2ZSksCisJICAoZ3N0X3J0c3BzcmNfbG9vcF9pbnRlcmxlYXZlZCksIChnc3RfcnRzcHNyY19sb29wX3VkcCksCisJICAoZ3N0X3J0c3BzcmNfdHJ5X3NlbmQpLCAoZ3N0X3J0c3BzcmNfcGF1c2UpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBQcm90ZWN0IGNvbm5lY3Rpb24gYWN0aXZpdHkgd2l0aCBhIG5ldyBsb2NrLCBhdm9pZHMgZGVhZGxvY2tzIHdoZW4gZ29pbmcKKwkgIHRvIFBBVVNFRC4gRml4ZXMgIzQ1NTgwOC4KKworMjAwNy0wOC0xNyAxNTozMDozOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2RlYnVnL3JuZGJ1ZmZlcnNpemUuYzogRml4IGRlYnVnIHN0YXRlbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVidWcvcm5kYnVmZmVyc2l6ZS5jOiAoZ3N0X3JuZF9idWZmZXJfc2l6ZV9sb29wKToKKwkgIEZpeCBkZWJ1ZyBzdGF0ZW1lbnQuCisKKzIwMDctMDgtMTcgMTU6Mjg6NDAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogRml4IHN0cmF5ICV1IGluIGRlYnVnIGxpbmUgYXMgc3BvdHRlZCBieSBTYXVyIG9uIElSQy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19kb19zdHJlYW1fZW9zKToKKwkgIEZpeCBzdHJheSAldSBpbiBkZWJ1ZyBsaW5lIGFzIHNwb3R0ZWQgYnkgU2F1ciBvbiBJUkMuCisKKzIwMDctMDgtMTcgMTU6MDU6MTcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgVXNlIGdlbmVyYXRvciBtYWNyb3MgZm9yIHRoZSBwcm9jZXNzIGZ1bmN0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCBzYW1wbGUgdHlwZXMsIGFkZCBsb3dlciB1cHBlciBib3VuZGFyaWVzIGZvciB0aGUgR09iLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ZpbHRlci9nc3RicHdzaW5jLmM6IChnc3RfYnB3c2luY19jbGFzc19pbml0KSwKKwkgIChicHdzaW5jX3NldF9wcm9wZXJ0eSksIChicHdzaW5jX2dldF9wcm9wZXJ0eSk6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5oOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGdzdF9scHdzaW5jX2NsYXNzX2luaXQpLAorCSAgKGdzdF9scHdzaW5jX2luaXQpLCAobHB3c2luY19idWlsZF9rZXJuZWwpLCAobHB3c2luY19zZXRfcHJvcGVydHkpLAorCSAgKGxwd3NpbmNfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmg6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xwd3NpbmMuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIFVzZSBnZW5lcmF0b3IgbWFjcm9zIGZvciB0aGUgcHJvY2VzcyBmdW5jdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQKKwkgIHNhbXBsZSB0eXBlcywgYWRkIGxvd2VyIHVwcGVyIGJvdW5kYXJpZXMgZm9yIHRoZSBHT2JqZWN0IHByb3BlcnRpZXMKKwkgIHNvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIFVJcyBjYW4gdXNlIHNsaWRlcnMgYW5kIGNoYW5nZSBmcmVxdWVuY3kKKwkgIHByb3BlcnRpZXMgdG8gZmxvYXRzIHRvIHNhdmUgYSBiaXQgb2YgbWVtb3J5LCBldmVuIGludHMgd291bGQgaW4KKwkgIHRoZW9yeSBiZSBlbm91Z2guIEFsc28gcmVuYW1lIGZyZXF1ZW5jeSB0byBjdXRvZmYgZm9yIGNvbnNpc3RlbmN5CisJICByZWFzb25zLgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLnNpZ25hbHM6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc3RydHBtYW5hZ2VyLnhtbDoKKwkgIFJlZ2VuZXJhdGVkIGZvciB0aGUgYWJvdmUgY2hhbmdlcy4KKworMjAwNy0wOC0xNyAxNDo0MzozMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvYXVkaW9meC86IFVzZSBnZW5lcmF0b3IgbWFjcm9zIGZvciB0aGUgcHJvY2VzcyBmdW5jdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQgc2FtcGxlIHR5cGVzLCBhZGQgbG93ZXIgdXBwZXIgYm91bmRhcmkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJ5c2hldmZyZXFiYW5kLmM6CisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2JhbmRfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYnlzaGV2ZnJlcWxpbWl0LmM6CisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2xpbWl0X2NsYXNzX2luaXQpOgorCSAgVXNlIGdlbmVyYXRvciBtYWNyb3MgZm9yIHRoZSBwcm9jZXNzIGZ1bmN0aW9ucyBmb3IgdGhlIGRpZmZlcmVudAorCSAgc2FtcGxlIHR5cGVzLCBhZGQgbG93ZXIgdXBwZXIgYm91bmRhcmllcyBmb3IgdGhlIEdPYmplY3QgcHJvcGVydGllcworCSAgc28gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgVUlzIGNhbiB1c2Ugc2xpZGVycyBhbmQgYWRkIGEgbm90ZSBhYm91dAorCSAgdGhlIG51bWJlciBvZiBwb2xlcyBhcyBhIHRvbyBoaWdoIG51bWJlciBvZiBwb2xlcyBjb21iaW5lZCB3aXRoCisJICB2ZXJ5IGxvdyBvciB2ZXJ5IGhpZ2ggZnJlcXVlbmNpZXMgd2lsbCBwcm9kdWNlIG9ubHkgbm9pc2UuCisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgIFJlZ2VuZXJhdGVkIGZvciB0aGUgcHJvcGVydHkgY2hhbmdlcy4KKworMjAwNy0wOC0xNyAxNDoxNToxOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy4qOiBJbXByb3ZlIHRpbWVvdXQgaGFuZGxpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRzcHNyY19mbHVzaCksIChnc3RfcnRzcHNyY19zaW5rX2NoYWluKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3VkcF9zaW5rKSwKKwkgIChnc3RfcnRzcHNyY19zZW5kX2tlZXBfYWxpdmUpLCAoZ3N0X3J0c3BzcmNfbG9vcF9pbnRlcmxlYXZlZCksCisJICAoZ3N0X3J0c3BzcmNfbG9vcF91ZHApLCAoZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCksCisJICAoZ3N0X3J0c3BzcmNfdHJ5X3NlbmQpLCAoZ3N0X3J0c3BzcmNfc2VuZCksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfbWV0aG9kcyksIChnc3RfcnRzcHNyY19wYXJzZV9yYW5nZSksCisJICAoZ3N0X3J0c3BzcmNfb3BlbiksIChnc3RfcnRzcHNyY19jbG9zZSksIChnc3RfcnRzcHNyY19wYXVzZSksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX21lc3NhZ2UpLCAoZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgSW1wcm92ZSB0aW1lb3V0IGhhbmRsaW5nLgorCSAgVXNlIHRoZSBzYW1lIHNvY2tldCBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nIFJUQ1AgcGFja2V0cyBzbyB0aGF0IHNvbWUKKwkgIHNlcnZlcnMgY2FuIHRyYWNrIGNsaWVudHMgYmV0dGVyLgorCSAgSW1wcm92ZSBjb25uZWN0aW9uIGNsb3NlZCBoYW5kbGluZy4gVHJ5IHRvIHJlY29ubmVjdC4KKwkgIERvbid0IG92ZXJ3cml0ZSBvdXIgY29udGVudCBiYXNlIHdpdGggTlVMTC4KKwkgIEltcHJvdmUgZGVidWdnaW5nLgorCSAgSW1wcm92ZSByYW5nZSBwYXJzaW5nIGFuZCBoYW5kbGluZy4KKwkgIFJlbW92ZSBmbHVzaGluZyBoYWNrIG5vdyB0aGF0IGNvcmUgZG9lcyB0aGUgcmlnaHQgdGhpbmcuCisKKzIwMDctMDgtMTcgMTM6NTk6MTUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLio6IEFkZCBzdXBwb3J0IGZvciBnZXR0aW5nIGFuZCBzZXR0aW5nIHRoZSBzb2NrZXQgdG8gdXNlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChnc3RfbXVsdGl1ZHBzaW5rX2NsYXNzX2luaXQpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfaW5pdCksIChnc3RfbXVsdGl1ZHBzaW5rX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X211bHRpdWRwc2lua19nZXRfcHJvcGVydHkpLCAoZ3N0X211bHRpdWRwc2lua19pbml0X3NlbmQpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfY2xvc2UpLCAoZ3N0X211bHRpdWRwc2lua19hZGQpOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIGdldHRpbmcgYW5kIHNldHRpbmcgdGhlIHNvY2tldCB0byB1c2UuCisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3VkcHNyY19pbml0KSwKKwkgIChnc3RfdWRwc3JjX2NyZWF0ZSksIChnc3RfdWRwc3JjX2dldF9wcm9wZXJ0eSk6CisJICBBZGQgc3VwcG9ydCBmb3IgZ2V0dGluZyB0aGUgY3VycmVudGx5IHVzZWQgc29ja2V0LgorCisyMDA3LTA4LTE2IDE5OjIyOjQ4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy4qOiBJbXBsZW1lbnQgbGF0ZW5jeSBxdWVyeSBhbmQgb25seSBmb3J3YXJkIHRob3NlIHNhbXBsZXMgZG93bnN0cmVhbSB0aGF0IGFjdHVhbGx5IGNvbnRhaW4gdGhlIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5jOiAoZ3N0X2Jwd3NpbmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X2Jwd3NpbmNfaW5pdCksIChwcm9jZXNzXzMyKSwgKHByb2Nlc3NfNjQpLAorCSAgKGJwd3NpbmNfYnVpbGRfa2VybmVsKSwgKGJwd3NpbmNfcHVzaF9yZXNpZHVlKSwKKwkgIChicHdzaW5jX3RyYW5zZm9ybSksIChicHdzaW5jX3N0YXJ0KSwgKGJwd3NpbmNfcXVlcnkpLAorCSAgKGJwd3NpbmNfcXVlcnlfdHlwZSksIChicHdzaW5jX2V2ZW50KSwgKGJwd3NpbmNfc2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2ZpbHRlci9nc3RicHdzaW5jLmg6CisJICBJbXBsZW1lbnQgbGF0ZW5jeSBxdWVyeSBhbmQgb25seSBmb3J3YXJkIHRob3NlIHNhbXBsZXMgZG93bnN0cmVhbQorCSAgdGhhdCBhY3R1YWxseSBjb250YWluIHRoZSBkYXRhIHdlIHdhbnQsIGkuZS4gZHJvcCBrZXJuZWxfbGVuZ3RoLzIKKwkgIGluIHRoZSBiZWdpbm5pbmcgYW5kIGFwcGVuZCBrZXJuZWxfbGVuZ3RoLzIgKGNyZWF0ZWQgYnkgY29udm9sdmluZworCSAgdGhlIGZpbHRlciBrZXJuZWwgd2l0aCB6ZXJvZXMpIHRvIHRoZSBlbmQuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2Jwd3NpbmMuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIEFkanVzdCB0aGUgdW5pdCB0ZXN0IGZvciB0aGlzIHNsaWdodGx5IGNoYW5nZWQgYmVoYXZpb3VyLgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGxwd3NpbmNfYnVpbGRfa2VybmVsKToKKwkgIFJlc2V0IHJlc2lkdWUgbGVuZ3RoIG9ubHkgd2hlbiBhY3R1YWxseSBjcmVhdGluZyBhIHJlc2lkdWUuCisKKzIwMDctMDgtMTYgMTc6MDI6MDcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2F1ZGlvZngvOiBBZGQgQ2hlYnlzaGV2IGxvd3Bhc3MvaGlnaHBhc3MgYW5kIGJhbmRwYXNzL2JhbmRyZWplY3QgZWxlbWVudHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJldmlld2VkIGJ5OiBTdGVmYW4gS29zdCAgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCSAgKiBnc3QvYXVkaW9meC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9jaGVieXNoZXZmcmVxYmFuZC5jOgorCSAgKGdzdF9hdWRpb19jaGVieXNoZXZfZnJlcV9iYW5kX21vZGVfZ2V0X3R5cGUpLAorCSAgKGdzdF9hdWRpb19jaGVieXNoZXZfZnJlcV9iYW5kX2Jhc2VfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2JhbmRfZGlzcG9zZSksCisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2JhbmRfY2xhc3NfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2JhbmRfaW5pdCksCisJICAoZ2VuZXJhdGVfYmlxdWFkX2NvZWZmaWNpZW50cyksIChjYWxjdWxhdGVfZ2FpbiksCisJICAoZ2VuZXJhdGVfY29lZmZpY2llbnRzKSwKKwkgIChnc3RfYXVkaW9fY2hlYnlzaGV2X2ZyZXFfYmFuZF9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdWRpb19jaGVieXNoZXZfZnJlcV9iYW5kX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2JhbmRfc2V0dXApLCAocHJvY2VzcyksIChwcm9jZXNzXzY0KSwKKwkgIChwcm9jZXNzXzMyKSwgKGdzdF9hdWRpb19jaGVieXNoZXZfZnJlcV9iYW5kX3RyYW5zZm9ybV9pcCksCisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2JhbmRfc3RhcnQpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJ5c2hldmZyZXFiYW5kLmg6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvY2hlYnlzaGV2ZnJlcWxpbWl0LmM6CisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2xpbWl0X21vZGVfZ2V0X3R5cGUpLAorCSAgKGdzdF9hdWRpb19jaGVieXNoZXZfZnJlcV9saW1pdF9iYXNlX2luaXQpLAorCSAgKGdzdF9hdWRpb19jaGVieXNoZXZfZnJlcV9saW1pdF9kaXNwb3NlKSwKKwkgIChnc3RfYXVkaW9fY2hlYnlzaGV2X2ZyZXFfbGltaXRfY2xhc3NfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2xpbWl0X2luaXQpLAorCSAgKGdlbmVyYXRlX2JpcXVhZF9jb2VmZmljaWVudHMpLCAoY2FsY3VsYXRlX2dhaW4pLAorCSAgKGdlbmVyYXRlX2NvZWZmaWNpZW50cyksCisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2xpbWl0X3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2xpbWl0X2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X2F1ZGlvX2NoZWJ5c2hldl9mcmVxX2xpbWl0X3NldHVwKSwgKHByb2Nlc3MpLCAocHJvY2Vzc182NCksCisJICAocHJvY2Vzc18zMiksIChnc3RfYXVkaW9fY2hlYnlzaGV2X2ZyZXFfbGltaXRfdHJhbnNmb3JtX2lwKSwKKwkgIChnc3RfYXVkaW9fY2hlYnlzaGV2X2ZyZXFfbGltaXRfc3RhcnQpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2NoZWJ5c2hldmZyZXFsaW1pdC5oOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2Z4LmM6IChwbHVnaW5faW5pdCk6CisJICBBZGQgQ2hlYnlzaGV2IGxvd3Bhc3MvaGlnaHBhc3MgYW5kIGJhbmRwYXNzL2JhbmRyZWplY3QgZWxlbWVudHMuCisJICBGaXhlcyAjNDY0ODAwLgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9jaGVieXNoZXZmcmVxYmFuZC5jOgorCSAgKHNldHVwX2F1ZGlvY2hlYnlzaGV2ZnJlcWJhbmQpLCAoY2xlYW51cF9hdWRpb2NoZWJ5c2hldmZyZXFiYW5kKSwKKwkgIChHU1RfU1RBUlRfVEVTVCksIChhdWRpb2NoZWJ5c2hldmZyZXFiYW5kX3N1aXRlKSwgKG1haW4pOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJ5c2hldmZyZXFsaW1pdC5jOgorCSAgKHNldHVwX2F1ZGlvY2hlYnlzaGV2ZnJlcWxpbWl0KSwgKGNsZWFudXBfYXVkaW9jaGVieXNoZXZmcmVxbGltaXQpLAorCSAgKEdTVF9TVEFSVF9URVNUKSwgKGF1ZGlvY2hlYnlzaGV2ZnJlcWxpbWl0X3N1aXRlKSwgKG1haW4pOgorCSAgQWRkIHVuaXQgdGVzdHMgZm9yIHRoZSBjaGVieXNoZXYgZmlsdGVycy4KKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sOgorCSAgQW5kIGFkZCBkb2NzIGZvciB0aGUgY2hlYnlzaGV2IGZpbHRlcnMuIFdoaWxlIGRvaW5nCisJICB0aGF0IGFsc28gcnVuIG1ha2UgdXBkYXRlIGluIGRvY3MvcGx1Z2lucy4KKworMjAwNy0wOC0xNiAxMjoxNTowNiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBNYWtlIHJvIG1lbW9yeSB0byBzaGFyZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sdGFnLmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJICBNYWtlIHJvIG1lbW9yeSB0byBzaGFyZS4KKworMjAwNy0wOC0xNiAxMTo0OTowMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3VkcC9nc3R1ZHBzcmMuYzogSW1wcm92ZSBVRFAgcGVyZm9ybWFuY2UgYnkgYXZvaWRpbmcgYSBzZWxlY3QoKSB3aGVuIHdlIGhhdmUgZGF0YSBhdmFpbGFibGUgaW1tZWRpYXRseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jcmVhdGUpOgorCSAgSW1wcm92ZSBVRFAgcGVyZm9ybWFuY2UgYnkgYXZvaWRpbmcgYSBzZWxlY3QoKSB3aGVuIHdlIGhhdmUgZGF0YQorCSAgYXZhaWxhYmxlIGltbWVkaWF0bHkuCisKKzIwMDctMDgtMTYgMTE6NDc6MTkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0cGRlYy4qOiBBZGQgKGR1bW15KSBTU1JDIG1hbmFnZW1lbnQgc2lnbmFscy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuYzogKGdzdF9ydHBfZGVjX21hcnNoYWxfVk9JRF9fVUlOVF9VSU5UKSwKKwkgIChnc3RfcnRwX2RlY19jbGFzc19pbml0KToKKwkgICogZ3N0L3J0c3AvZ3N0cnRwZGVjLmg6CisJICBBZGQgKGR1bW15KSBTU1JDIG1hbmFnZW1lbnQgc2lnbmFscy4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0c3BzcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9ydHNwc3JjX2dldF9wcm9wZXJ0eSksCisJICAoZmluZF9zdHJlYW0pLCAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksIChuZXdfc2Vzc2lvbl9wYWQpLAorCSAgKHJlcXVlc3RfcHRfbWFwKSwgKGdzdF9ydHNwc3JjX2RvX3N0cmVhbV9lb3MpLCAob25fYnllX3NzcmMpLAorCSAgKG9uX3RpbWVvdXQpLCAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV9tYW5hZ2VyKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fcHVzaF9ldmVudCksIChnc3RfcnRzcHNyY19wdXNoX2V2ZW50KSwKKwkgIChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKSwgKGdzdF9ydHNwc3JjX3BhcnNlX3J0cGluZm8pLAorCSAgKGdzdF9ydHNwc3JjX2hhbmRsZV9tZXNzYWdlKSwgKGdzdF9ydHNwc3JjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIEFkZCBjb25uZWN0aW9uLXNwZWVkIHByb3BlcnR5LgorCSAgQWRkIGZpbmRfc3RyZWFtIGhlbHBlciBmdW5jdGlvbnMuCisJICBIYW5kbGUgc3RyZWFtIEVPUyBiYXNlZCBvbiBCWUUgbWVzc2FnZXMgb3IgU1NSQyB0aW1lb3V0LgorCSAgUmV0dXJucyBTVUNDRVNTIGZyb20gdGhlIHN0YXRlIGNoYW5nZSBmdW5jdGlvbiBhcyB3ZSBoaWRlIG91ciBhc3luYworCSAgZWxlbWVudHMgZnJvbSB0aGUgcGFyZW50LgorCisyMDA3LTA4LTE2IDA5OjQ4OjI3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy4qOiBJbXBsZW1lbnQgbGF0ZW5jeSBxdWVyeSBhbmQgb25seSBmb3J3YXJkIHRob3NlIHNhbXBsZXMgZG93bnN0cmVhbSB0aGF0IGFjdHVhbGx5IGNvbnRhaW4gdGhlIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy5jOiAoZ3N0X2xwd3NpbmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X2xwd3NpbmNfaW5pdCksIChwcm9jZXNzXzMyKSwgKHByb2Nlc3NfNjQpLAorCSAgKGxwd3NpbmNfYnVpbGRfa2VybmVsKSwgKGxwd3NpbmNfcHVzaF9yZXNpZHVlKSwKKwkgIChscHdzaW5jX3RyYW5zZm9ybSksIChscHdzaW5jX3N0YXJ0KSwgKGxwd3NpbmNfcXVlcnkpLAorCSAgKGxwd3NpbmNfcXVlcnlfdHlwZSksIChscHdzaW5jX2V2ZW50KSwgKGxwd3NpbmNfc2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmg6CisJICBJbXBsZW1lbnQgbGF0ZW5jeSBxdWVyeSBhbmQgb25seSBmb3J3YXJkIHRob3NlIHNhbXBsZXMgZG93bnN0cmVhbQorCSAgdGhhdCBhY3R1YWxseSBjb250YWluIHRoZSBkYXRhIHdlIHdhbnQsIGkuZS4gZHJvcCBrZXJuZWxfbGVuZ3RoLzIKKwkgIGluIHRoZSBiZWdpbm5pbmcgYW5kIGFwcGVuZCBrZXJuZWxfbGVuZ3RoLzIgKGNyZWF0ZWQgYnkgY29udm9sdmluZworCSAgdGhlIGZpbHRlciBrZXJuZWwgd2l0aCB6ZXJvZXMpIHRvIHRoZSBlbmQuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xwd3NpbmMuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIEFkanVzdCB0aGUgdW5pdCB0ZXN0IGZvciB0aGlzIHNsaWdodGx5IGNoYW5nZWQgYmVoYXZpb3VyLgorCisyMDA3LTA4LTE2IDA3OjQwOjQ4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9kZWJ1Zy9ybmRidWZmZXJzaXplLmM6IEZpeCBkYSBsZWFrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWJ1Zy9ybmRidWZmZXJzaXplLmM6CisJICBGaXggZGEgbGVhay4KKworMjAwNy0wOC0xNCAxMzo1MDo0MyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvZGVidWcvOiBBZGQgbmV3IHRlc3QgZWxlbWVudCBhbmQgY2xlYW4tdXAgdGhlIG90aGVycyBhIGxpdHRsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVidWcvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWJ1Zy9icmVha215ZGF0YS5jOgorCSAgKiBnc3QvZGVidWcvZ3N0ZGVidWcuYzoKKwkgICogZ3N0L2RlYnVnL25lZ290aWF0aW9uLmM6CisJICAqIGdzdC9kZWJ1Zy9wcm9ncmVzc3JlcG9ydC5jOgorCSAgKiBnc3QvZGVidWcvcm5kYnVmZmVyc2l6ZS5jOgorCSAgKiBnc3QvZGVidWcvdGVzdHBsdWdpbi5jOgorCSAgQWRkIG5ldyB0ZXN0IGVsZW1lbnQgYW5kIGNsZWFuLXVwIHRoZSBvdGhlcnMgYSBsaXR0bGUuCisKKzIwMDctMDgtMTMgMTM6NTA6MzkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgQWRkIGRvY3MgZm9yIGxwd3NpbmMgYW5kIGJwd3NpbmMgYW5kIGludGVncmF0ZSB0aGVtIGludG8gdGhlIGJ1aWxkIHN5c3RlbS4gV2hpbGUgZG9pbmcgdGhhdCBhbHNvIHVwZGF0ZSBhbGwgb3RoZXIgZG9jLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLnNpZ25hbHM6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1iejIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2R4YXBhcnNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0c2RlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mYWFjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZhYWQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmlsdGVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZyZWV6ZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nc20ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3N0cnRwbWFuYWdlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oMjY0cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbW9kcGx1Zy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGVnMmVuYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdXNlcGFjay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdXNpY2JyYWluei54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uc2ZkZWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcmVwbGF5Z2Fpbi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VuZHRvdWNoLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwY2RlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVjdHJ1bS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVlZC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10dGEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9zaWduYWwueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGluZ2hlYWRlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14dmlkLnhtbDoKKwkgICogZ3N0L2ZpbHRlci9nc3RicHdzaW5jLmM6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5oOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzoKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmg6CisJICBBZGQgZG9jcyBmb3IgbHB3c2luYyBhbmQgYnB3c2luYyBhbmQgaW50ZWdyYXRlIHRoZW0KKwkgIGludG8gdGhlIGJ1aWxkIHN5c3RlbS4gV2hpbGUgZG9pbmcgdGhhdCBhbHNvIHVwZGF0ZQorCSAgYWxsIG90aGVyIGRvY3MgdmlhIG1ha2UgdXBkYXRlIGluIGRvY3MvcGx1Z2lucy4KKworMjAwNy0wOC0xMiAyMDo1NTowMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9icHdzaW5jLmM6IE1ha2Ugb25lIHRlc3QgY29uc3RyYWludCBhIGJpdCBzdHJpY3Rlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9icHdzaW5jLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBNYWtlIG9uZSB0ZXN0IGNvbnN0cmFpbnQgYSBiaXQgc3RyaWN0ZXIuCisKKzIwMDctMDgtMTIgMjA6NTM6MTEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svOiBBZGQgdW5pdCB0ZXN0cyBmb3IgYnB3c2luYywgdGVzdGluZyBmdW5kYW1lbnRhbCBmdW5jdGlvbmFsaXR5IGFnYWluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9icHdzaW5jLmM6IChzZXR1cF9icHdzaW5jKSwKKwkgIChjbGVhbnVwX2Jwd3NpbmMpLCAoR1NUX1NUQVJUX1RFU1QpLCAoYnB3c2luY19zdWl0ZSksIChtYWluKToKKwkgIEFkZCB1bml0IHRlc3RzIGZvciBicHdzaW5jLCB0ZXN0aW5nIGZ1bmRhbWVudGFsIGZ1bmN0aW9uYWxpdHkgYWdhaW4uCisKKzIwMDctMDgtMTIgMjA6MTk6MzcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svOiBBZGQgdW5pdCB0ZXN0cyBmb3IgbHB3c2luYywgdGVzdGluZyBmdW5kYW1lbnRhbCBmdW5jdGlvbmFsaXR5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9scHdzaW5jLmM6IChzZXR1cF9scHdzaW5jKSwKKwkgIChjbGVhbnVwX2xwd3NpbmMpLCAoR1NUX1NUQVJUX1RFU1QpLCAobHB3c2luY19zdWl0ZSksIChtYWluKToKKwkgIEFkZCB1bml0IHRlc3RzIGZvciBscHdzaW5jLCB0ZXN0aW5nIGZ1bmRhbWVudGFsIGZ1bmN0aW9uYWxpdHkuCisKKzIwMDctMDgtMTIgMTU6NDE6NTcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ZpbHRlci86IEltcHJvdmUgZGVidWdnaW5nIGEgYml0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5jOiAoYnB3c2luY19idWlsZF9rZXJuZWwpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGxwd3NpbmNfYnVpbGRfa2VybmVsKToKKwkgIEltcHJvdmUgZGVidWdnaW5nIGEgYml0LgorCisyMDA3LTA4LTEyIDE0OjM1OjQxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEZpeCBwYXJzaW5nIG9mIG1wNGEgdmVyc2lvbiAwIGF0b21zLiBGaXhlcyAjNDY1Nzc0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2Vfbm9kZSk6CisJICBGaXggcGFyc2luZyBvZiBtcDRhIHZlcnNpb24gMCBhdG9tcy4gRml4ZXMgIzQ2NTc3NC4KKworMjAwNy0wOC0xMiAxMjo0NjoyMCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZmlsdGVyLzogUmVzZXQgdGhlIHJlc2lkdWUgaW4gQmFzZVRyYW5zZm9ybTo6c3RhcnQgdG8gZ2V0IGEgY2xlYW4gcmVzaWR1ZSBvbiBzdHJlYW0gY2hhbmdlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzogKGdzdF9icHdzaW5jX2NsYXNzX2luaXQpLAorCSAgKGJwd3NpbmNfc3RhcnQpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGdzdF9scHdzaW5jX2NsYXNzX2luaXQpLAorCSAgKGxwd3NpbmNfc3RhcnQpOgorCSAgUmVzZXQgdGhlIHJlc2lkdWUgaW4gQmFzZVRyYW5zZm9ybTo6c3RhcnQgdG8gZ2V0IGEgY2xlYW4gcmVzaWR1ZQorCSAgb24gc3RyZWFtIGNoYW5nZXMuCisKKzIwMDctMDgtMTEgMTU6NTg6MzAgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ZpbHRlci86IEZpeCBwcm9jZXNzaW5nIHdpdGggYnVmZmVyIHNpemVzIHRoYXQgYXJlIGxhcmdlciB0aGFuIHRoZSBmaWx0ZXIga2VybmVsIHNpemUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ZpbHRlci9nc3RicHdzaW5jLmM6IChwcm9jZXNzXzMyKSwgKHByb2Nlc3NfNjQpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKHByb2Nlc3NfMzIpLCAocHJvY2Vzc182NCk6CisJICBGaXggcHJvY2Vzc2luZyB3aXRoIGJ1ZmZlciBzaXplcyB0aGF0IGFyZSBsYXJnZXIgdGhhbiB0aGUgZmlsdGVyCisJICBrZXJuZWwgc2l6ZS4KKworMjAwNy0wOC0xMCAxNzowODowMSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOiBJbmNsdWRlIHN0ZGxpYi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOgorCSAgSW5jbHVkZSBzdGRsaWIuCisKKzIwMDctMDgtMTAgMTY6MTA6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzogU2V0IHRoZSBtcGVndmVyc2lvbiBpbiB0aGUgY2FwcyBzbyB0aGF0IGF1dG9wbHVnZ2luZyBkb2VzIG5vdCBnZXQgY29uZnVzZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jOgorCSAgU2V0IHRoZSBtcGVndmVyc2lvbiBpbiB0aGUgY2FwcyBzbyB0aGF0IGF1dG9wbHVnZ2luZyBkb2VzIG5vdCBnZXQKKwkgIGNvbmZ1c2VkLgorCisyMDA3LTA4LTEwIDA1OjUxOjQwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5jOiBGaXggYSBzZWdmYXVsdCB3aXRoIG1vcmUgdGhhbiBvbmUgY2hhbm5lbCBhbmQgZG9uJ3QgcmVidWlsZCB0aGUga2VybmVsICYgcmVzaWR1ZSB3aXRoIGV2ZXJ5IC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5jOiAoYnB3c2luY19idWlsZF9rZXJuZWwpOgorCSAgRml4IGEgc2VnZmF1bHQgd2l0aCBtb3JlIHRoYW4gb25lIGNoYW5uZWwgYW5kIGRvbid0IHJlYnVpbGQKKwkgIHRoZSBrZXJuZWwgJiByZXNpZHVlIHdpdGggZXZlcnkgYnVmZmVyLgorCisyMDA3LTA4LTEwIDA1OjM1OjI1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy4qOiBBZGQgc3VwcG9ydCBmb3IgYSBiYW5kcmVqZWN0IG1vZGUgYW5kIGFsbG93IHNwZWNpZnlpbmcgdGhlIHdpbmRvdyBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSB1c2VkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5jOiAoZ3N0X2Jwd3NpbmNfbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X2Jwd3NpbmNfd2luZG93X2dldF90eXBlKSwgKGdzdF9icHdzaW5jX2NsYXNzX2luaXQpLAorCSAgKGdzdF9icHdzaW5jX2luaXQpLCAoYnB3c2luY19idWlsZF9rZXJuZWwpLCAoYnB3c2luY19zZXRfcHJvcGVydHkpLAorCSAgKGJwd3NpbmNfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2ZpbHRlci9nc3RicHdzaW5jLmg6CisJICBBZGQgc3VwcG9ydCBmb3IgYSBiYW5kcmVqZWN0IG1vZGUgYW5kIGFsbG93IHNwZWNpZnlpbmcgdGhlIHdpbmRvdworCSAgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgdXNlZC4KKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6CisJICBBbmQgYW5vdGhlciBzbWFsbCBmb3JtYXR0aW5nIGZpeC4KKworMjAwNy0wOC0xMCAwNToyMDowNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuKjogQXBwbHkgdGhlIHNhbWUgY2hhbmdlcyB0byB0aGUgYmFuZHBhc3MgZmlsdGVyOgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9maWx0ZXIvZ3N0YnB3c2luYy5jOiAoZ3N0X2Jwd3NpbmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X2Jwd3NpbmNfaW5pdCksIChwcm9jZXNzXzMyKSwgKHByb2Nlc3NfNjQpLAorCSAgKGJwd3NpbmNfYnVpbGRfa2VybmVsKSwgKGJwd3NpbmNfc2V0dXApLCAoYnB3c2luY19nZXRfdW5pdF9zaXplKSwKKwkgIChicHdzaW5jX3RyYW5zZm9ybSksIChicHdzaW5jX3NldF9wcm9wZXJ0eSksCisJICAoYnB3c2luY19nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuaDoKKwkgIEFwcGx5IHRoZSBzYW1lIGNoYW5nZXMgdG8gdGhlIGJhbmRwYXNzIGZpbHRlcjoKKwkgIC0gU3VwcG9ydCBkb3VibGUgaW5wdXQKKwkgIC0gRml4IHByb2Nlc3NpbmcgZm9yIGlucHV0IHdpdGggPjEgY2hhbm5lbHMKKwkgIC0gU3BlY2lmeSBmcmVxdWVuY3kgaW4gSHoKKwkgIC0gU3BlY2lmeSBhY3R1YWwgZmlsdGVyIGtlcm5lbCBsZW5ndGgKKwkgIC0gVXNlIHRyYW5zZm9ybSBpbnN0ZWFkIG9mIHRyYW5zZm9ybV9pcCBhcyB3ZSdyZSB3b3JraW5nCisJICBvdXQgb2YgcGxhY2UgYW55d2F5CisJICAtIEZhY3RvciBvdXQgZmlsdGVyIGtlcm5lbCBnZW5lcmF0aW9uIGFuZCB1cGRhdGUgdGhlIGZpbHRlcgorCSAga2VybmVsIHdoZW4gdGhlIHByb3BlcnRpZXMgYXJlIHNldAorCSAgRml4IGJhbmRwYXNzIGZpbHRlciBrZXJuZWwgZ2VuZXJhdGlvbiB0byBhY3R1YWxseSBnZW5lcmF0ZQorCSAgYSBiYW5kcGFzcyBmaWx0ZXIgYnkgY3JlYXRpbmcgYSBoaWdocGFzcyBpbnN0ZWFkIG9mIGEgc2Vjb25kCisJICBsb3dwYXNzLgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGdzdF9scHdzaW5jX2NsYXNzX2luaXQpOgorCSAgU21hbGwgZm9ybWF0dGluZyBmaXguCisKKzIwMDctMDgtMTAgMDQ6NDQ6NDMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ZpbHRlci9nc3RscHdzaW5jLio6IFNwZWNpZnkgdGhlIGFjdHVhbCBmaWx0ZXIgbGVuZ3RoIGluc3RlYWQgb2YgYSB3ZWlyZCAyTisxLiBTZXR0aW5nIHRoZSBwcm9wZXJ0eSB3aWxsIHJvdW5kIHRvLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6IChnc3RfbHB3c2luY19jbGFzc19pbml0KSwKKwkgIChnc3RfbHB3c2luY19pbml0KSwgKHByb2Nlc3NfMzIpLCAocHJvY2Vzc182NCksCisJICAobHB3c2luY19idWlsZF9rZXJuZWwpLCAobHB3c2luY19zZXRfcHJvcGVydHkpLAorCSAgKGxwd3NpbmNfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmg6CisJICBTcGVjaWZ5IHRoZSBhY3R1YWwgZmlsdGVyIGxlbmd0aCBpbnN0ZWFkIG9mIGEgd2VpcmQKKwkgIDJOKzEuIFNldHRpbmcgdGhlIHByb3BlcnR5IHdpbGwgcm91bmQgdG8gdGhlIG5leHQgb2RkIG51bWJlci4KKwkgIEFsc28gcmVtb3ZlIG5vdyBvYnNvbGV0ZSBGSVhNRXMuCisKKzIwMDctMDgtMTAgMDQ6MzI6NDcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ZpbHRlci9nc3RscHdzaW5jLio6IEFsbG93IGNob29zaW5nIGJldHdlZW4gaGFtbWluZyBhbmQgYmxhY2ttYW4gd2luZG93LiBUaGUgYmxhY2ttYW4gd2luZG93IHByb3ZpZGVzIGEgYmV0dGVyIHN0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6IChnc3RfbHB3c2luY193aW5kb3dfZ2V0X3R5cGUpLAorCSAgKGdzdF9scHdzaW5jX2NsYXNzX2luaXQpLCAoZ3N0X2xwd3NpbmNfaW5pdCksCisJICAobHB3c2luY19idWlsZF9rZXJuZWwpLCAobHB3c2luY19zZXRfcHJvcGVydHkpLAorCSAgKGxwd3NpbmNfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmg6CisJICBBbGxvdyBjaG9vc2luZyBiZXR3ZWVuIGhhbW1pbmcgYW5kIGJsYWNrbWFuIHdpbmRvdy4gVGhlIGJsYWNrbWFuCisJICB3aW5kb3cgcHJvdmlkZXMgYSBiZXR0ZXIgc3RvcGJhbmQgYXR0ZW51YXRpb24gYnV0IGEgYml0IHNsb3dlcgorCSAgcm9sbG9mZi4KKworMjAwNy0wOC0xMCAwNDoyMTozOSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuKjogQWRkIGEgaGlnaHBhc3MgbW9kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGdzdF9scHdzaW5jX21vZGVfZ2V0X3R5cGUpLAorCSAgKGdzdF9scHdzaW5jX2NsYXNzX2luaXQpLCAocHJvY2Vzc18zMiksIChwcm9jZXNzXzY0KSwKKwkgIChscHdzaW5jX2J1aWxkX2tlcm5lbCksIChscHdzaW5jX3NldF9wcm9wZXJ0eSksCisJICAobHB3c2luY19nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuaDoKKwkgIEFkZCBhIGhpZ2hwYXNzIG1vZGUuCisKKzIwMDctMDgtMTAgMDQ6MDY6NTMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6IEZpeCBwcm9jZXNzaW5nIGlmIHRoZSBpbnB1dCBoYXMgbW9yZSB0aGFuIG9uZSBjaGFubmVsLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy5jOiAocHJvY2Vzc18zMiksIChwcm9jZXNzXzY0KSwKKwkgIChscHdzaW5jX2J1aWxkX2tlcm5lbCk6CisJICBGaXggcHJvY2Vzc2luZyBpZiB0aGUgaW5wdXQgaGFzIG1vcmUgdGhhbiBvbmUgY2hhbm5lbC4KKworMjAwNy0wOC0wOSAxOToyMzozMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzogInRoaXMiIGlzIGEgQysrIGtleXdvcmQsIHVzZSAic2VsZiIgaW5zdGVhZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzogKGdzdF9icHdzaW5jX2Rpc3Bvc2UpLAorCSAgKGdzdF9icHdzaW5jX2luaXQpLCAoYnB3c2luY19zZXR1cCksIChicHdzaW5jX3RyYW5zZm9ybV9pcCksCisJICAoYnB3c2luY19zZXRfcHJvcGVydHkpLCAoYnB3c2luY19nZXRfcHJvcGVydHkpOgorCSAgInRoaXMiIGlzIGEgQysrIGtleXdvcmQsIHVzZSAic2VsZiIgaW5zdGVhZC4KKwkgIEFkZCBUT0RPcyBhbmQgRklYTUVzIGFuZCByZW1vdmUgdHdvIHdyb25nIEZJWE1Fcy4KKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6CisJICBBZGQgRklYTUVzIGFuZCBhIG5ldyBUT0RPLgorCisyMDA3LTA4LTA5IDE4OjA4OjA1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy4qOiBBZGQgZG91YmxlIHN1cHBvcnQsIHJlcGxhY2UgInRoaXMiIHdpdGggInNlbGYiIGFzIHRoZSBmb3JtZXIgaXMgYSBDKysga2V5d29yZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGdzdF9scHdzaW5jX2Rpc3Bvc2UpLAorCSAgKGdzdF9scHdzaW5jX2NsYXNzX2luaXQpLCAoZ3N0X2xwd3NpbmNfaW5pdCksIChwcm9jZXNzXzMyKSwKKwkgIChwcm9jZXNzXzY0KSwgKGxwd3NpbmNfYnVpbGRfa2VybmVsKSwgKGxwd3NpbmNfc2V0dXApLAorCSAgKGxwd3NpbmNfZ2V0X3VuaXRfc2l6ZSksIChscHdzaW5jX3RyYW5zZm9ybSksCisJICAobHB3c2luY19zZXRfcHJvcGVydHkpLCAobHB3c2luY19nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuaDoKKwkgIEFkZCBkb3VibGUgc3VwcG9ydCwgcmVwbGFjZSAidGhpcyIgd2l0aCAic2VsZiIgYXMgdGhlIGZvcm1lcgorCSAgaXMgYSBDKysga2V5d29yZC4KKwkgIEltcGxlbWVudCB0aGUgZnJlcXVlbmN5IHByb3BlcnR5IGluIEh6IGluc3RlYWQgb2YgZnJhY3Rpb24KKwkgIG9mIHNhbXBsaW5nIGZyZXF1ZW5jeS4KKwkgIFJlbW92ZSBzb21lIHVuZWNlc3NhcnkgRklYTUVzIGFuZCBhZGQgc29tZSBUT0RPcywgYWRkIHNvbWUKKwkgIHJlcXVpcmVkIGxvY2tpbmcgYW5kIHJlZmFjdG9yIHRoZSBrZXJuZWwgZ2VuZXJhdGlvbiBpbnRvIGEKKwkgIHNlcGFyYXRlIGZ1bmN0aW9uIHRoYXQgaXMgYWxzbyBjYWxsZWQgd2hlbiB0aGUgcHJvcGVydGllcworCSAgY2hhbmdlIG5vdy4KKwkgIEFuZCB1c2UgQmFzZVRyYW5zZm9ybTo6dHJhbnNmb3JtIGluc3RlYWQgb2YgdHJhbnNmb3JtX2lwCisJICBhcyB0aGUgY29udm9sdXRpb24gaXMgZG9uZSBvdXQgb2YgcGxhY2UgYW55d2F5LiBTaG91bGQKKwkgIGJlIGRvbmUgaW4gcGxhY2UgbGF0ZXIuCisKKzIwMDctMDgtMDkgMTA6NTQ6MDUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBwby86IFVwZGF0ZWQgdHJhbnNsYXRpb25zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHBvL2h1LnBvOgorCSAgKiBwby91ay5wbzoKKwkgICogcG8vdmkucG86CisJICBVcGRhdGVkIHRyYW5zbGF0aW9ucy4KKworMjAwNy0wOC0wOCAyMDo0NzozMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvZmlsdGVyLzogVXNlIEdzdEF1ZGlvRmlsdGVyIGFzIGJhc2UgY2xhc3MgYW5kIGRvbid0IGxlYWsgdGhlIG1lbW9yeSBvZiB0aGUgZmlsdGVyIGtlcm5lbCBhbmQgcmVzaWR1ZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmlsdGVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzogKGdzdF9icHdzaW5jX2Rpc3Bvc2UpLAorCSAgKGdzdF9icHdzaW5jX2Jhc2VfaW5pdCksIChnc3RfYnB3c2luY19jbGFzc19pbml0KSwKKwkgIChnc3RfYnB3c2luY19pbml0KSwgKGJwd3NpbmNfc2V0dXApOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuaDoKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6IChnc3RfbHB3c2luY19kaXNwb3NlKSwKKwkgIChnc3RfbHB3c2luY19iYXNlX2luaXQpLCAoZ3N0X2xwd3NpbmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X2xwd3NpbmNfaW5pdCksIChscHdzaW5jX3NldHVwKToKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmg6CisJICBVc2UgR3N0QXVkaW9GaWx0ZXIgYXMgYmFzZSBjbGFzcyBhbmQgZG9uJ3QgbGVhayB0aGUgbWVtb3J5CisJICBvZiB0aGUgZmlsdGVyIGtlcm5lbCBhbmQgcmVzaWR1ZS4KKworMjAwNy0wOC0wOCAxNzo0NzowNSArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogUmVuZGVyIHJpZ2h0IGJvcmRlciBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogKGdzdF92aWRlb19ib3hfYXl1dl9pNDIwKToKKwkgIFJlbmRlciByaWdodCBib3JkZXIgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCisKKzIwMDctMDgtMDggMTA6NTQ6NTAgKzAwMDAgIE9saXZpZXIgQ3JldGUgPHRlc3RlckB0ZXN0ZXIuY2E+CisKKwkgIGdzdC9ydHAvOiBNYWtlIG1vZGUgcHJvcGVydHkgYSBzdHJpbmcuIEZpeGVzICM0NjQ0NzUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBPbGl2aWVyIENyZXRlIDx0ZXN0ZXIgYXQgdGVzdGVyIGRvdCBjYT4KKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzogKGdzdF9ydHBfaWxiY19kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6IChnc3RfcnRwaWxiY3BheV9zZXRjYXBzKToKKwkgIE1ha2UgbW9kZSBwcm9wZXJ0eSBhIHN0cmluZy4gRml4ZXMgIzQ2NDQ3NS4KKworMjAwNy0wOC0wNSAxNDo1ODoyMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IFdpZGVuIGNhcHMgdG8gbWF0Y2ggZGVjb2RlciBhIGJpdCBhbmQgYWRkIG1vcmUgRklYTUVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIFdpZGVuIGNhcHMgdG8gbWF0Y2ggZGVjb2RlciBhIGJpdCBhbmQgYWRkIG1vcmUgRklYTUVzLgorCisyMDA3LTA4LTA1IDE0OjUzOjM2ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorCisJICBnc3QvYXZpL2dzdGF2aW11eC5jOiBGaXggT0RNTCBpbmRleCB0YWcgbnVtYmVyaW5nLiBGaXhlcyAjNDYzNjI0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBwYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3QHNreW5ldC5iZT4KKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIEZpeCBPRE1MIGluZGV4IHRhZyBudW1iZXJpbmcuIEZpeGVzICM0NjM2MjQuCisKKzIwMDctMDgtMDMgMTY6MDg6NTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogRml4IGRlZmF1bHQgY2xvY2stcmF0ZSBmb3IgcmVhbG1lZGlhLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdldF9kZWZhdWx0X3JhdGVfZm9yX3B0KSwKKwkgIChnc3RfcnRzcHNyY19wYXJzZV9ydHBtYXApLCAoZ3N0X3J0c3BzcmNfbWVkaWFfdG9fY2FwcyksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90Y3ApLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdWRwX3NpbmspOgorCSAgRml4IGRlZmF1bHQgY2xvY2stcmF0ZSBmb3IgcmVhbG1lZGlhLgorCSAgRml4IHBhcnNpbmcgb2YgdHJhbnNwb3J0LgorCSAgRG9uJ3QgdHJ5IHRvIGxpbmsgTlVMTCBwYWRzLgorCisyMDA3LTA3LTMwIDE3OjE3OjA0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBwby9QT1RGSUxFUy5za2lwOiBBZGQgUE9URklMRVMuc2tpcCB3aXRoIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHRoYXQgYXJlbid0IGRpc3RlZCBhdCB0aGUgbW9tZW50IGJ1dCBjb250YWluIHRyYW5zbGF0YWIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBwby9QT1RGSUxFUy5za2lwOgorCSAgQWRkIFBPVEZJTEVTLnNraXAgd2l0aCBsaXN0IG9mIHNvdXJjZSBmaWxlcyB0aGF0IGFyZW4ndCBkaXN0ZWQgYXQgdGhlCisJICBtb21lbnQgYnV0IGNvbnRhaW4gdHJhbnNsYXRhYmxlIHN0cmluZ3MuIFNob3VsZCBob3BlZnVsbHkgcGFjaWZ5CisJICBicm9rZW4gdG9vbHMgYW5kIG1ha2UgaXQgY2xlYXJlciB0aGF0IHRoZXNlIGZpbGVzIGFyZSBsZWZ0IG91dAorCSAgaW50ZW50aW9uYWxseSAoIzQ2MTYwMCkuCisKKzIwMDctMDctMzAgMTI6NDE6NTggKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogSWYgdGhlIGJ1ZmZlciB3YXMgZW50aXJlbHkgY2xpcHBlZCAuLi4gZG9uJ3QgdHJ5IHNlbmRpbmcgaXQgOikKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX3N0YXRlX21vdmllKToKKwkgIElmIHRoZSBidWZmZXIgd2FzIGVudGlyZWx5IGNsaXBwZWQgLi4uIGRvbid0IHRyeSBzZW5kaW5nIGl0IDopCisKKzIwMDctMDctMjcgMTY6NTY6NDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogSWYgd2UgZG9uJ3QgaGF2IGEgc2Vzc2lvbiBtYW5hZ2VyLCBzZXQgdGhlIGNhcHMgb24gb3V0Z29pbmcgYnVmZmVycyBvdXJzZWx2ZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfYWN0aXZhdGVfc3RyZWFtcyksCisJICAoZ3N0X3J0c3BzcmNfbG9vcF9pbnRlcmxlYXZlZCksIChnc3RfcnRzcHNyY19wYXJzZV9tZXRob2RzKSwKKwkgIChnc3RfcnRzcHNyY19jcmVhdGVfdHJhbnNwb3J0c19zdHJpbmcpLAorCSAgKGdzdF9ydHNwc3JjX3ByZXBhcmVfdHJhbnNwb3J0cyk6CisJICBJZiB3ZSBkb24ndCBoYXYgYSBzZXNzaW9uIG1hbmFnZXIsIHNldCB0aGUgY2FwcyBvbiBvdXRnb2luZyBidWZmZXJzCisJICBvdXJzZWx2ZXMuCisJICBGb3JjZSBQQVVTRS9QTEFZIG1ldGhvZHMgZm9yIG5vdyB1bnRpbCB0aGUgZXh0ZW5zaW9ucyBjYW4gb3ZlcndyaXRlLgorCSAgQXBwZW5kIGZpbmFsIGJpdCBvZiB0aGUgdHJhbnNwb3J0IHN0cmluZyBldmVuIHdoZW4gaXQgZG9lcyBub3QgY29udGFpbiBhCisJICBwbGFjZWhvbGRlci4KKworMjAwNy0wNy0yNyAxMToyMToyMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvOiBDbGVhbiB1cCB0aGUgaW50ZXJmYWNlIGxpc3QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcGV4dC5jOiAoZ3N0X3J0c3BfZXh0X2xpc3RfZnJlZSksCisJICAoZ3N0X3J0c3BfZXh0X2xpc3RfY29ubmVjdCk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BleHQuaDoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfaW5pdCksCisJICAoZ3N0X3J0c3BzcmNfZmluYWxpemUpLCAoZ3N0X3J0c3BzcmNfc2VuZF9jYik6CisJICBDbGVhbiB1cCB0aGUgaW50ZXJmYWNlIGxpc3QuCisJICBBbGxvdyBjb25uZWN0aW5nIHRvIGludGVyZmFjZSBzaWduYWxzIGZvciB0aGUgZXh0ZW5zaW9ucy4KKwkgIFJlbW92ZSBvbGQgZXh0ZW5zaW9uIGNvZGUuCisJICBGcmVlIGxpc3Qgb24gY2xlYW51cC4KKwkgIEFsbG93IGV4dGVuc2lvbnMgdG8gc2VuZCBhZGRpdGlvbmFsIFJUU1AgbWVzc2FnZXMuCisKKzIwMDctMDctMjcgMTA6Mzg6MzQgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBleHQvZ2NvbmYvZ2NvbmYuYzogSGFuZGxlIGEgTlVMTCBnY29uZiBrZXkgZ3JhY2VmdWxseSBieSByZW5kZXJpbmcgdGhlIGRlZmF1bHQgZWxlbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2NvbmYvZ2NvbmYuYzogKGdzdF9nY29uZl9yZW5kZXJfYmluX3dpdGhfZGVmYXVsdCk6CisJICBIYW5kbGUgYSBOVUxMIGdjb25mIGtleSBncmFjZWZ1bGx5IGJ5IHJlbmRlcmluZyB0aGUgZGVmYXVsdCBlbGVtZW50LgorCisyMDA3LTA3LTI3IDEwOjExOjE4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwZXh0Lmg6IEZpeCBpbmNsdWRlIHBhdGggZm9yIGV4dGVuc2lvbiBpbnRlcmZhY2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcGV4dC5oOgorCSAgRml4IGluY2x1ZGUgcGF0aCBmb3IgZXh0ZW5zaW9uIGludGVyZmFjZS4KKworMjAwNy0wNy0yNiAxOTo0NTozMCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuaDogQWxzbyByZW1vdmUgYSBub3cgdW5lY2Vzc2FyeSB2YXJpYWJsZSBoZXJlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5oOgorCSAgQWxzbyByZW1vdmUgYSBub3cgdW5lY2Vzc2FyeSB2YXJpYWJsZSBoZXJlLgorCisyMDA3LTA3LTI2IDE5OjQxOjA3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9hdWRpb2Z4LzogRG9uJ3Qgc2F2ZSBmb3JtYXQgaW5mb3JtYXRpb24gb3Vyc2VsdmVzLCB0aGlzIGlzIGFscmVhZHkgc2F2ZWQgaW4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzogKGdzdF9hdWRpb19hbXBsaWZ5X2luaXQpLAorCSAgKGdzdF9hdWRpb19hbXBsaWZ5X3NldHVwKSwgKGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jOgorCSAgKGdzdF9hdWRpb19keW5hbWljX3NldF9wcm9jZXNzX2Z1bmN0aW9uKSwgKGdzdF9hdWRpb19keW5hbWljX2luaXQpLAorCSAgKGdzdF9hdWRpb19keW5hbWljX3NldHVwKSwgKGdzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5oOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2ludmVydC5jOiAoZ3N0X2F1ZGlvX2ludmVydF9pbml0KSwKKwkgIChnc3RfYXVkaW9faW52ZXJ0X3NldHVwKSwgKGdzdF9hdWRpb19pbnZlcnRfdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuaDoKKwkgIERvbid0IHNhdmUgZm9ybWF0IGluZm9ybWF0aW9uIG91cnNlbHZlcywgdGhpcyBpcyBhbHJlYWR5IHNhdmVkIGluCisJICBHc3RBdWRpb0ZpbHRlci4KKworMjAwNy0wNy0yNiAxNTo0ODo0NyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvOiBVc2UgcmFuayB0byBmaWx0ZXIgb3V0IGV4dGVuc2lvbnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcGV4dC5jOiAoZ3N0X3J0c3BfZXh0X2xpc3RfZmlsdGVyKSwKKwkgIChnc3RfcnRzcF9leHRfbGlzdF9zdHJlYW1fc2VsZWN0KToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcGV4dC5oOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zZXR1cF9zdHJlYW1zKToKKwkgIFVzZSByYW5rIHRvIGZpbHRlciBvdXQgZXh0ZW5zaW9ucy4KKwkgIEFkZCB1cmwgdG8gc3RyZWFtX3NlbGVjdCBpbnRlcmZhY2UgY2FsbC4KKworMjAwNy0wNy0yNSAxODo1MDowOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvOiBVc2Ugc2hpbnkgbmV3IFJUU1AgYW5kIFNEUCBsaWJyYXJ5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRzcC9iYXNlNjQuYzoKKwkgICogZ3N0L3J0c3AvYmFzZTY0Lmg6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BleHQuYzogKGdzdF9ydHNwX2V4dF9saXN0X2ZpbHRlciksCisJICAoZ3N0X3J0c3BfZXh0X2xpc3RfaW5pdCksIChnc3RfcnRzcF9leHRfbGlzdF9nZXQpLAorCSAgKGdzdF9ydHNwX2V4dF9saXN0X2RldGVjdF9zZXJ2ZXIpLCAoZ3N0X3J0c3BfZXh0X2xpc3RfYmVmb3JlX3NlbmQpLAorCSAgKGdzdF9ydHNwX2V4dF9saXN0X2FmdGVyX3NlbmQpLCAoZ3N0X3J0c3BfZXh0X2xpc3RfcGFyc2Vfc2RwKSwKKwkgIChnc3RfcnRzcF9leHRfbGlzdF9zZXR1cF9tZWRpYSksCisJICAoZ3N0X3J0c3BfZXh0X2xpc3RfY29uZmlndXJlX3N0cmVhbSksCisJICAoZ3N0X3J0c3BfZXh0X2xpc3RfZ2V0X3RyYW5zcG9ydHMpLAorCSAgKGdzdF9ydHNwX2V4dF9saXN0X3N0cmVhbV9zZWxlY3QpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwZXh0Lmg6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwX2xvd2VyX3RyYW5zX2dldF90eXBlKSwKKwkgIChnc3RfcnRzcHNyY19jbGFzc19pbml0KSwgKGdzdF9ydHNwc3JjX2luaXQpLAorCSAgKGdzdF9ydHNwc3JjX2ZpbmFsaXplKSwgKGdzdF9ydHNwc3JjX2NyZWF0ZV9zdHJlYW0pLAorCSAgKGdzdF9ydHNwc3JjX3BhcnNlX3J0cG1hcCksIChnc3RfcnRzcHNyY19tZWRpYV90b19jYXBzKSwKKwkgIChnc3RfcnRzcHNyY19mbHVzaCksIChnc3RfcnRzcHNyY19kb19zZWVrKSwKKwkgIChnc3RfcnRzcHNyY19zaW5rX2NoYWluKSwgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfbWFuYWdlciksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90Y3ApLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfbWNhc3QpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdWRwKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3VkcF9zaW5rKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX3JlcXVlc3QpLCAoZ3N0X3J0c3BzcmNfc2VuZF9rZWVwX2FsaXZlKSwKKwkgIChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKSwgKGdzdF9ydHNwc3JjX2xvb3BfdWRwKSwKKwkgIChnc3RfcnRzcHNyY19sb29wX3NlbmRfY21kKSwgKGdzdF9ydHNwX2F1dGhfbWV0aG9kX3RvX3N0cmluZyksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfYXV0aF9oZHIpLCAoZ3N0X3J0c3BzcmNfc2V0dXBfYXV0aCksCisJICAoZ3N0X3J0c3BzcmNfdHJ5X3NlbmQpLCAoZ3N0X3J0c3BzcmNfc2VuZCksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfbWV0aG9kcyksCisJICAoZ3N0X3J0c3BzcmNfY3JlYXRlX3RyYW5zcG9ydHNfc3RyaW5nKSwKKwkgIChnc3RfcnRzcHNyY19wcmVwYXJlX3RyYW5zcG9ydHMpLCAoZ3N0X3J0c3BzcmNfc2V0dXBfc3RyZWFtcyksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfcmFuZ2UpLCAoZ3N0X3J0c3BzcmNfb3BlbiksIChnc3RfcnRzcHNyY19jbG9zZSksCisJICAoZ3N0X3J0c3BzcmNfcGxheSksIChnc3RfcnRzcHNyY19wYXVzZSksCisJICAoZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlKSwgKGdzdF9ydHNwc3JjX3VyaV9zZXRfdXJpKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgKiBnc3QvcnRzcC9ydHNwLmg6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmg6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmM6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmg6CisJICAqIGdzdC9ydHNwL3J0c3BleHQuaDoKKwkgICogZ3N0L3J0c3AvcnRzcGV4dHdtcy5jOgorCSAgKiBnc3QvcnRzcC9ydHNwZXh0d21zLmg6CisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmM6CisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmg6CisJICAqIGdzdC9ydHNwL3J0c3ByYW5nZS5jOgorCSAgKiBnc3QvcnRzcC9ydHNwcmFuZ2UuaDoKKwkgICogZ3N0L3J0c3AvcnRzcHRyYW5zcG9ydC5jOgorCSAgKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0Lmg6CisJICAqIGdzdC9ydHNwL3J0c3B1cmwuYzoKKwkgICogZ3N0L3J0c3AvcnRzcHVybC5oOgorCSAgKiBnc3QvcnRzcC9zZHAuaDoKKwkgICogZ3N0L3J0c3Avc2RwbWVzc2FnZS5jOgorCSAgKiBnc3QvcnRzcC9zZHBtZXNzYWdlLmg6CisJICAqIGdzdC9ydHNwL3Rlc3QuYzoKKwkgIFVzZSBzaGlueSBuZXcgUlRTUCBhbmQgU0RQIGxpYnJhcnkuCisJICBJbXBsZW1lbnQgUlRTUCBleHRlbnNpb25zIHVzaW5nIHRoZSBuZXcgaW50ZXJmYWNlLgorCSAgUmVtb3ZlIGEgbG90IG9mIG9sZCBjb2RlLgorCisyMDA3LTA3LTI0IDE0OjMxOjU2ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEFkZCBjb2RlYyBtYXBwaW5nIGZvciAnMnZ1eScgKFJhdyBZVVYgcHJvZHVjZWQgYnkgRkNQKSBhbmQgJ2RpdngnLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBBZGQgY29kZWMgbWFwcGluZyBmb3IgJzJ2dXknIChSYXcgWVVWIHByb2R1Y2VkIGJ5IEZDUCkgYW5kICdkaXZ4Jy4KKworMjAwNy0wNy0yNCAwNTowNzo1OSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IERvbid0IHVucmVmIHRoZSBvdXRnb2luZyBidWZmZXIgdHdpY2Ugd2hlbiBkcm9wcGluZyBpdCBiZWNhdXNlIGl0J3Mgb3V0c2lkZSBvZiB0aGUgc2VnbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfY2hhaW4pOgorCSAgRG9uJ3QgdW5yZWYgdGhlIG91dGdvaW5nIGJ1ZmZlciB0d2ljZSB3aGVuIGRyb3BwaW5nIGl0IGJlY2F1c2UgaXQncworCSAgb3V0c2lkZSBvZiB0aGUgc2VnbWVudC4KKworMjAwNy0wNy0yNCAwNDo1NzoyMCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBVc2UgdGhlIG5ldyBidWZmZXIgY2xpcHBpbmcgZnVuY3Rpb24gZnJvbSBnc3RhdWRpbyBoZXJlIGFuZCByZXF1aXJlIGdzdC1wbHVnaW5zLWJhc2UgQ1ZTLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX3Jlc2V0KSwKKwkgIChnc3Rfd2F2cGFja19kZWNfY2hhaW4pLCAoZ3N0X3dhdnBhY2tfZGVjX3NpbmtfZXZlbnQpOgorCSAgVXNlIHRoZSBuZXcgYnVmZmVyIGNsaXBwaW5nIGZ1bmN0aW9uIGZyb20gZ3N0YXVkaW8gaGVyZSBhbmQKKwkgIHJlcXVpcmUgZ3N0LXBsdWdpbnMtYmFzZSBDVlMuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tkZWMuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIEZvciBmcmFtZWQgV2F2cGFjayBidWZmZXJzIHdlIHJlcXVpcmUgYSB2YWxpZCB0aW1lc3RhbXAuCisKKzIwMDctMDctMjMgMTg6MDM6NTQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQ2xpcCByYXcgYXVkaW8gYW5kIHZpZGVvIHdoZW4gd2UgY2FuLCBrZWVwIHRyYWNrIG9mIGN1cnJlbnQgb3V0cHV0IHNlZ21lbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfYWN0aXZhdGVfc2VnbWVudCksCisJICAoZ3N0X3F0ZGVtdXhfY2xpcF9idWZmZXIpLCAoZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9tb3ZpZSksCisJICAocXRkZW11eF9wYXJzZV90cmFrKSwgKHF0ZGVtdXhfdmlkZW9fY2FwcyksIChxdGRlbXV4X2F1ZGlvX2NhcHMpOgorCSAgQ2xpcCByYXcgYXVkaW8gYW5kIHZpZGVvIHdoZW4gd2UgY2FuLCBrZWVwIHRyYWNrIG9mIGN1cnJlbnQgb3V0cHV0CisJICBzZWdtZW50LgorCSAgRG9uJ3QgbGVhayBidWZmZXJzIGFuZCBldmVudHMgd2hlbiB0aGVyZSBpcyBubyBvdXRwdXQgcGFkLgorCSAgSW1wcm92ZSBkZWJ1Z2dpbmcgaGVyZSBhbmQgdGhlcmUuCisKKzIwMDctMDctMjMgMDk6MDI6MDcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBTeW5jIGxpYm9pbCBjaGVjayB3aXRoIHBsdWdpbnMtYmFzZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBTeW5jIGxpYm9pbCBjaGVjayB3aXRoIHBsdWdpbnMtYmFzZS4KKworMjAwNy0wNy0yMCAxMTozNzozNyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvZXF1YWxpemVyLzogQmV0dGVyIGFsZ29yaXRoIGZvciB0aGUgY2VudGVyIGZyZXF1ZW5jaWVzLiBTdWJ0cmFjdCBiYW5kIGZpbHRlcnMgZnJvbSBpbnB1dCBmb3IgbmVnYXRpdmUgZ2FpbnMuIFJld28uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgKGdzdF9paXJfZXF1YWxpemVyX2JhbmRfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9nZXRfY2hpbGRfYnlfaW5kZXgpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2dldF9jaGlsZHJlbl9jb3VudCksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfY2hpbGRfcHJveHlfaW50ZXJmYWNlX2luaXQpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2NsYXNzX2luaXQpLCAoYXJnX3RvX3NjYWxlKSwgKHNldHVwX2ZpbHRlciksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfY29tcHV0ZV9mcmVxdWVuY2llcyk6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5jOgorCSAgKGdzdF9paXJfZXF1YWxpemVyXzEwYmFuZHNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmM6CisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfM2JhbmRzX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jOgorCSAgQmV0dGVyIGFsZ29yaXRoIGZvciB0aGUgY2VudGVyIGZyZXF1ZW5jaWVzLiBTdWJ0cmFjdCBiYW5kIGZpbHRlcnMgZnJvbQorCSAgaW5wdXQgZm9yIG5lZ2F0aXZlIGdhaW5zLiBSZXdvcmsgdGhlIGdhaW4gbWFwcGluZy4KKworMjAwNy0wNy0yMCAwNzo0MTo1OCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBleHQvYW5ub2RleC9NYWtlZmlsZS5hbTogRml4IENGTEFHUy9MSUJTLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9hbm5vZGV4L01ha2VmaWxlLmFtOgorCSAgRml4IENGTEFHUy9MSUJTLgorCSAgKiBleHQvY2Rpby9nc3RjZGlvY2RkYXNyYy5jOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiAoZ3N0X3BuZ2RlY190YXNrKToKKwkgIEluY2x1ZGUgc3RkbGliCisJICAqIGV4dC9jYWlyby9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9sZXZlbC9NYWtlZmlsZS5hbToKKwkgIFVzZSAkKExJQk0pIGluc3RlYWQgb2YgLWxtCisKKzIwMDctMDctMTggMTE6NTU6MTMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiBBZGQgYW5vdGhlciBleGFtcGxlIHBpcGVsaW5lLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIEFkZCBhbm90aGVyIGV4YW1wbGUgcGlwZWxpbmUuCisKKzIwMDctMDctMTggMTE6NDI6MzMgKzAwMDAgIEFsZXhhbmRlciBFaWNobmVyIDxhbGV4ZWljaGlAeWFob28uZGU+CisKKwkgIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogVXNlIGRlZmluZSBoZXJlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQWxleGFuZGVyIEVpY2huZXIgPGFsZXhlaWNoaUB5YWhvby5kZT4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfaW5pdCk6CisJICBVc2UgZGVmaW5lIGhlcmUuCisJICAqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOgorCSAgKGdzdF92NGwyX3R1bmVyX3NldF9mcmVxdWVuY3lfYW5kX25vdGlmeSk6CisJICBEb24ndCB0b3VjaCB0aGUgcHJvcGVydHkgLSBpdHMgc3RpbGwgZGlzYWJsZWQuCisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX3Byb2JlX2NhcHNfZm9yX2Zvcm1hdCksCisJICAoZ3N0X3Y0bDJzcmNfZ3JhYl9mcmFtZSksIChnc3RfdjRsMnNyY19nZXRfc2l6ZV9saW1pdHMpOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmg6CisJICBJbXByb3ZlIGZhbGxiYWNrIGZvcm1hdCBuZWdvdGlvbmF0aW9uLiBGaXhlcyAjNDUxMzg4CisKKzIwMDctMDctMTggMTA6MzM6MzkgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6IEZpeCB0aGUgdGVzdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2Nyb3AuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIEZpeCB0aGUgdGVzdC4KKworMjAwNy0wNy0xOCAwOToyMToyMyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBNb3JlIGRvY3MuIE1vcmUgbG9ncyBpbiBwbmdkZWMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKGdzdF9wbmdkZWNfdGFzayksCisJICAoZ3N0X3BuZ2RlY19zaW5rX3NldGNhcHMpOgorCSAgTW9yZSBkb2NzLiBNb3JlIGxvZ3MgaW4gcG5nZGVjLgorCisyMDA3LTA3LTE4IDA3OjUxOjExICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6IEFkZCBleGFtcGxlIHRvIHRoZSBkb2NzLiBGaXggYnVmZmVyLW9mZnNldC1lbmQgYW5kIGFkZCBzb21lIGRlYnVnLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc3JjLmM6IChnc3RfbXVsdGlfZmlsZV9zcmNfY3JlYXRlKToKKwkgIEFkZCBleGFtcGxlIHRvIHRoZSBkb2NzLiBGaXggYnVmZmVyLW9mZnNldC1lbmQgYW5kIGFkZCBzb21lIGRlYnVnLgorCisyMDA3LTA3LTE4IDA3OjM1OjMyICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIEFkZCBzdGRsaWIgaW5jbHVkZSAoZnJlZSwgYXRvaSwgZXhpdCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXhhbXBsZXMvYXBwL2FwcHNyY19leC5jOgorCSAgKiBleGFtcGxlcy9zd2l0Y2gvc3dpdGNoZXIuYzoKKwkgICogZXh0L25lb24vZ3N0bmVvbmh0dHBzcmMuYzoKKwkgICogZXh0L3RpbWlkaXR5L2dzdHdpbGRtaWRpLmM6CisJICAqIGV4dC94MjY0L2dzdHgyNjRlbmMuYzoKKwkgICogZ3N0L212ZS9tdmVhdWRpb2VuYy5jOiAobXZlX2NvbXByZXNzX2F1ZGlvKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwY2xpZW50LmM6CisJICAqIGdzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzoKKwkgICogZ3N0L3NwZWN0cnVtL2RlbW8tb3Nzc3JjLmM6CisJICAqIHN5cy9kdmIvZ3N0ZHZic3JjLmM6CisJICBBZGQgc3RkbGliIGluY2x1ZGUgKGZyZWUsIGF0b2ksIGV4aXQpLgorCisyMDA3LTA3LTE3IDExOjM1OjI5ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogSW5pdGlhbGl6ZSBudW1fYnVmZmVycyB3aXRoIG1pbmltdW0gdmFsdWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfaW5pdCk6CisJICBJbml0aWFsaXplIG51bV9idWZmZXJzIHdpdGggbWluaW11bSB2YWx1ZS4KKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfZmlsbF9mb3JtYXRfbGlzdCksCisJICAoZ3N0X3Y0bDJzcmNfcHJvYmVfY2Fwc19mb3JfZm9ybWF0KSwgKGdzdF92NGwyc3JjX2dyYWJfZnJhbWUpOgorCSAgSGFuZGxlIGZyYW1lLXNpemUgcXVlcnkgZmFpbHVyZSBncmFjZWZ1bGx5LgorCisyMDA3LTA3LTE2IDEyOjExOjM2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEZpeCBwYXJzaW5nIG9mIGVzZHMgYXRvbXMgaW5zaWRlIG1wNGEgYXRvbXMgc28gdGhhdCB3ZSBjYW4gc2V0IGNvcnJlY3QgY29kZWNfaW5mbyBmb3IgQUFDIGF1ZGkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlX25vZGUpOgorCSAgRml4IHBhcnNpbmcgb2YgZXNkcyBhdG9tcyBpbnNpZGUgbXA0YSBhdG9tcyBzbyB0aGF0IHdlIGNhbiBzZXQgY29ycmVjdAorCSAgY29kZWNfaW5mbyBmb3IgQUFDIGF1ZGlvLiBGaXhlcyAjNDU3MDk3IGFsb25nIHdpdGggYSB3aG9sZSBvdGhlciBidW5jaAorCSAgb2YgcXQvYWFjIGZpbGVzLgorCisyMDA3LTA3LTE2IDA5OjE2OjAzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogRml4IGJ1ZmZlciBjbGlwcGluZyB0byBjb3JyZWN0bHkgY2xpcCB0byB0aGUgc2VnbWVudCBzdG9wLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkgIChnc3Rfd2F2cGFja19kZWNfY2xpcF9vdXRnb2luZ19idWZmZXIpOgorCSAgRml4IGJ1ZmZlciBjbGlwcGluZyB0byBjb3JyZWN0bHkgY2xpcCB0byB0aGUgc2VnbWVudCBzdG9wLgorCisyMDA3LTA3LTEzIDE2OjMxOjI3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgUmVtb3ZlIGJvZ3VzIGNoZWNrIGZvciBsaWJjaGVjaywgc2luY2Ugd2UgY2hlY2sgZm9yIGdzdHJlYW1lci1jaGVjayBhbmQgaXQgcHVsbHMgaW4gdGhlIHJlcXVpcmVkIGluZm8gZnJvbSB0aGVyZSwgYW5kLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiB0ZXN0cy9NYWtlZmlsZS5hbToKKwkgIFJlbW92ZSBib2d1cyBjaGVjayBmb3IgbGliY2hlY2ssIHNpbmNlIHdlIGNoZWNrIGZvcgorCSAgZ3N0cmVhbWVyLWNoZWNrIGFuZCBpdCBwdWxscyBpbiB0aGUgcmVxdWlyZWQgaW5mbyBmcm9tIHRoZXJlLAorCSAgYW5kIHdlIHdlcmVuJ3QgYWN0dWFsbHkgX3VzaW5nXyB0aGUgaW5mb3JtYXRpb24gZm9yIGxpYmNoZWNrCisJICBvdXJzZWx2ZXMgYW55d2F5LgorCisyMDA3LTA3LTEyIDExOjIxOjAxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogVXNlIHBrZy1jb25maWcgdG8gbG9jYXRlIGNoZWNrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIFVzZSBwa2ctY29uZmlnIHRvIGxvY2F0ZSBjaGVjay4KKworMjAwNy0wNy0xMSAyMzo0MzoyNSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0LzogRml4IGJ1aWxkIGFnYWluc3QgY29yZSBDVlMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6IChnc3RfZGVpbnRlcmxlYXZlX3Byb2Nlc3MpOgorCSAgKiBnc3Qvdm1uYy92bW5jZGVjLmM6ICh2bW5jX21ha2VfYnVmZmVyKToKKwkgIEZpeCBidWlsZCBhZ2FpbnN0IGNvcmUgQ1ZTLgorCisyMDA3LTA3LTExIDIyOjMxOjA2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBGaXggYnVpbGQgYWdhaW5zdCBjb3JlIENWUy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuYzogKGdzdF9jYWlyb190aW1lX292ZXJsYXlfdHJhbnNmb3JtKToKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOiAoZ3N0X2pwZWdlbmNfY2hhaW4pOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiAoZ3N0X3BuZ2VuY19jaGFpbik6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogKGdzdF93YXZwYWNrX2RlY19jaGFpbik6CisJICAqIGdzdC9kZWJ1Zy9nc3RuYXZpZ2F0aW9udGVzdC5jOiAoZ3N0X25hdmlnYXRpb250ZXN0X3RyYW5zZm9ybSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6IChnc3RfYWdpbmd0dl90cmFuc2Zvcm0pOgorCSAgKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6IChnc3RfZGljZXR2X3RyYW5zZm9ybSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzogKGdzdF9lZGdldHZfdHJhbnNmb3JtKToKKwkgICogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzogKGdzdF9xdWFya3R2X3RyYW5zZm9ybSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdHJldi5jOiAoZ3N0X3JldnR2X3RyYW5zZm9ybSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzogKGdzdF9zaGFnYWRlbGljdHZfdHJhbnNmb3JtKToKKwkgICogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jOiAoZ3N0X3ZlcnRpZ290dl90cmFuc2Zvcm0pOgorCSAgKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6IChnc3Rfd2FycHR2X3RyYW5zZm9ybSk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfd3Zwa19oZWFkZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9jaGVja19zdWJ0aXRsZV9idWZmZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9kZWNvZGVfYnVmZmVyKToKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOiAoZ3N0X3ZpZGVvX2ZsaXBfdHJhbnNmb3JtKToKKwkgIEZpeCBidWlsZCBhZ2FpbnN0IGNvcmUgQ1ZTLgorCisyMDA3LTA3LTEwIDEwOjE2OjM4ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogRG9uJ3QgcmV0dXJuIEdTVF9GTE9XX0VSUk9SIHdoZW4gcHVzaGluZyBhbiBldmVudCByZXR1cm5zIEZBTFNFLiBXZSBkb24ndCBoYXZlIGVub3VnaCBncmEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogKGdzdF9pZDNkZW11eF9jaGFpbik6CisJICBEb24ndCByZXR1cm4gR1NUX0ZMT1dfRVJST1Igd2hlbiBwdXNoaW5nIGFuIGV2ZW50IHJldHVybnMgRkFMU0UuIFdlCisJICBkb24ndCBoYXZlIGVub3VnaCBncmFudWxhcml0eSB0byBjb252ZXJ0IHRoYXQgYm9vbGVhbiBpbnRvIGEKKwkgIEdzdEZsb3dSZXR1cm4uCisKKzIwMDctMDctMDYgMTU6MDA6NDcgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZ3N0L2xhdy86IEZpeCBjYXBzbmVnbyBib2dvc2l0eSBpbiAqbGF3IGRlY29kZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzogKGFsYXdkZWNfc2lua19zZXRjYXBzKSwKKwkgIChnc3RfYWxhd2RlY19jbGFzc19pbml0KSwgKGdzdF9hbGF3ZGVjX2luaXQpLCAoZ3N0X2FsYXdkZWNfY2hhaW4pLAorCSAgKGdzdF9hbGF3ZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9sYXcvYWxhdy1kZWNvZGUuaDoKKwkgICogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzogKG11bGF3ZGVjX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X211bGF3ZGVjX2NsYXNzX2luaXQpLCAoZ3N0X211bGF3ZGVjX2luaXQpLAorCSAgKGdzdF9tdWxhd2RlY19jaGFpbiksIChnc3RfbXVsYXdkZWNfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuaDoKKwkgIEZpeCBjYXBzbmVnbyBib2dvc2l0eSBpbiAqbGF3IGRlY29kZXJzLgorCisyMDA3LTA3LTA2IDE0OjM1OjU5ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIGV4dC9qcGVnL2dzdHNtb2tlZW5jLio6IFJlbW92ZSBzdHVwaWRpdHkgaW4gZ2V0L3NldCBjYXBzIGZ1bmN0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvanBlZy9nc3RzbW9rZWVuYy5jOiAoZ3N0X3Ntb2tlZW5jX2luaXQpLAorCSAgKGdzdF9zbW9rZWVuY19zZXRjYXBzKSwgKGdzdF9zbW9rZWVuY19jaGFpbiksCisJICAoZ3N0X3Ntb2tlZW5jX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmg6CisJICBSZW1vdmUgc3R1cGlkaXR5IGluIGdldC9zZXQgY2FwcyBmdW5jdGlvbnMuCisJICBGaXggc29tZSByZWZjb3VudGluZyBwcm9ibGVtcy4KKworMjAwNy0wNy0wNiAxMTo0Mjo1MyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IFJlbW92ZSBlbmRpYW5uZXNzLWZsaXBwaW5nIGhhY2sgdGhhdCBzZWVtcyB0byBoYXZlIGJlZW4gcmVxdWlyZWQgb25seSBiZWNhdXNlIG9mIGEgYnVnIGluIGZmbS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IChnc3RfcG5nZGVjX2NhcHNfY3JlYXRlX2FuZF9zZXQpOgorCSAgUmVtb3ZlIGVuZGlhbm5lc3MtZmxpcHBpbmcgaGFjayB0aGF0IHNlZW1zIHRvIGhhdmUgYmVlbiByZXF1aXJlZAorCSAgb25seSBiZWNhdXNlIG9mIGEgYnVnIGluIGZmbXBlZ2NvbG9yc3BhY2UuCisJICBQYXJ0aWFsbHkgRml4ZXM6ICM0NTE5MDgKKworMjAwNy0wNy0wNSAwODo0NDoxMSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06IFNpbXBsaWZ5IC0tZXh0cmEtZGlyIGFzIGd0a2RvYyBzY2FucyByZWN1cnNpdmVseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICBTaW1wbGlmeSAtLWV4dHJhLWRpciBhcyBndGtkb2Mgc2NhbnMgcmVjdXJzaXZlbHkuCisKKzIwMDctMDctMDMgMDk6NTk6NDYgKzAwMDAgIFRvbW1pIE15w7Zow6RuZW4gPGV4dC10b21taS5teW9oYW5lbkBub2tpYS5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOiBTZXQgdGhlIGVuY29kaW5nLW5hbWUgaW4gdGhlIHJ0cCBjYXBzIHRvIGFsbCB1cHBlcmNhc2UsIGFzIHJlcXVpcmVkIGJ5IHRoZSBjYXBzIHNwZWMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBUb21taSBNecO2aMOkbmVuICA8ZXh0LXRvbW1pIGRvdCBteW9oYW5lbiBhdCBub2tpYSBkb3QgY29tPgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzogKGdzdF9ydHBpbGJjcGF5X3NldGNhcHMpOgorCSAgU2V0IHRoZSBlbmNvZGluZy1uYW1lIGluIHRoZSBydHAgY2FwcyB0byBhbGwgdXBwZXJjYXNlLCBhcyByZXF1aXJlZCBieQorCSAgdGhlIGNhcHMgc3BlYy4KKwkgIFNvbWUgc21hbGwgY2xlYW51cHMgaW4gdGhlIGVycm9yIHBhdGhzLiBGaXhlcyAjNDUzMDM3LgorCisyMDA3LTA3LTAzIDA4OjAxOjE4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9tdWx0aWZpbGUvOiBBZGQgLmggZmlsZXMgdG8gYmUgYWJsZSB0byBhZGQgaXQgdG8gdGhlIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L211bHRpZmlsZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGUuYzoKKwkgICogZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICAqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oOgorCSAgKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSAgKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5oOgorCSAgQWRkIC5oIGZpbGVzIHRvIGJlIGFibGUgdG8gYWRkIGl0IHRvIHRoZSBkb2NzLgorCisyMDA3LTA3LTAzIDA3OjE2OjI2ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmg6IEZpeCBHT2JqZWN0IG1hY3Jvcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ3ZvbHVtZS5oOgorCSAgRml4IEdPYmplY3QgbWFjcm9zLgorCisyMDA3LTA2LTI4IDE5OjAwOjQzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS4qOiBVc2UgYSBHU0xpc3QgZm9yIHRoZSBHQXJyYXkgdGhhdCBpcyB1c2VkIGxpa2UgYSBsaXN0IGFueXdheS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9pbmRleF9nZXRfbGFzdF9lbnRyeSksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfaW5kZXhfZ2V0X2VudHJ5X2Zyb21fc2FtcGxlKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9pbmRleF9hcHBlbmRfZW50cnkpLCAoZ3N0X3dhdnBhY2tfcGFyc2VfcmVzZXQpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX3NjYW5fdG9fZmluZF9zYW1wbGUpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuaDoKKwkgIFVzZSBhIEdTTGlzdCBmb3IgdGhlIEdBcnJheSB0aGF0IGlzIHVzZWQgbGlrZSBhIGxpc3QgYW55d2F5LgorCisyMDA3LTA2LTI4IDEzOjI1OjA1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogQWRkIHN0YXRlIGNoYW5nZSBmdW5jdGlvbiB3aGVyZSB3ZSBzZXQgMC8xIGFzIGRlZmF1bHQgZnJhbWVyYXRlIGluIGNhc2Ugb3VyIHNldGNhcHMgZnUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKGdzdF9nZGtfcGl4YnVmX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X2dka19waXhidWZfY2xhc3NfaW5pdCksIChnc3RfZ2RrX3BpeGJ1Zl9mbHVzaCksCisJICAoZ3N0X2dka19waXhidWZfc2lua19ldmVudCksIChnc3RfZ2RrX3BpeGJ1Zl9jaGFuZ2Vfc3RhdGUpOgorCSAgQWRkIHN0YXRlIGNoYW5nZSBmdW5jdGlvbiB3aGVyZSB3ZSBzZXQgMC8xIGFzIGRlZmF1bHQgZnJhbWVyYXRlIGluCisJICBjYXNlIG91ciBzZXRjYXBzIGZ1bmN0aW9uIGlzbid0IGNhbGxlZCwgbGlrZSBpdCBtaWdodCBub3QgaW4gYQorCSAgZmlsZXNyYyAhIGdka3BpeGJ1ZmRlYyBzY2VuYXJpby4gRml4ZXMgYXNzZXJ0aW9uIHRyaWdnZXJlZCBieQorCSAgZ2RrcGl4YnVmZGVjIHRyeWluZyB0byBjcmVhdGUgY2FwcyB3aXRoIGEgMC8wIGZyYW1lcmF0ZS4KKwkgIEFsc28gcG9zdCBhbiBlcnJvciBtZXNzYWdlIG9uIHRoZSBidXMgaWYgZ3N0X3BhZF9wdXNoKCkgZmFpbHMgd2hlbgorCSAgY2FsbGVkIGZyb20gb3VyIHNpbmsgZXZlbnQgaGFuZGxlciAoKzEgZm9yIGZsb3cgcmV0dXJucyBmb3IgZXZlbnQKKwkgIGZ1bmN0aW9ucyBpbiAwLjExKSBpbnN0ZWFkIG9mIGZhaWxpbmcgc2lsZW50bHkuCisKKzIwMDctMDYtMjcgMTE6MzY6MjQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogQ2FzdCBzdGFjayBhcmdzIHRvIHRoZSBwcm9wZXIgdHlwZXMuIEZpeGVzICM0NTEyNDkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfY29uZmlndXJlX2NhcHMpOgorCSAgQ2FzdCBzdGFjayBhcmdzIHRvIHRoZSBwcm9wZXIgdHlwZXMuIEZpeGVzICM0NTEyNDkuCisKKzIwMDctMDYtMjcgMTE6MDQ6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuKjogRm9yIGNvbnRhaW5lciBmb3JtYXRzIHdlIG9ubHkgbmVlZCB0byBhY3RpdmF0ZSBvbmUgb2YgdGhlIHN0cmVhbXMgc28gdGhhdCB3ZSBjb3JyZWN0bHkgc2lnbmFsIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2NyZWF0ZV9zdHJlYW0pLAorCSAgKG5ld19zZXNzaW9uX3BhZCksIChnc3RfcnRzcHNyY19zZXR1cF9zdHJlYW1zKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgRm9yIGNvbnRhaW5lciBmb3JtYXRzIHdlIG9ubHkgbmVlZCB0byBhY3RpdmF0ZSBvbmUgb2YgdGhlIHN0cmVhbXMgc28KKwkgIHRoYXQgd2UgY29ycmVjdGx5IHNpZ25hbCBuby1tb3JlLXBhZHMuIEZpeGVzICM0NTEwMTUuCisKKzIwMDctMDYtMjUgMTI6NDY6MDggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogVXBkYXRlIGRvY3Mgd2l0aCBjYXBzIGluZm8uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Rpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGFkc3BhLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXVpY2t0aW1lLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkgIFVwZGF0ZSBkb2NzIHdpdGggY2FwcyBpbmZvLgorCisyMDA3LTA2LTI1IDEyOjEzOjA5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBwby9QT1RGSUxFUy5pbjogQWRkIG1vcmUgZmlsZXMgd2l0aCB0cmFuc2xhdGFibGUgc3RyaW5ncyAoIzQ1MDg3OCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogcG8vUE9URklMRVMuaW46CisJICBBZGQgbW9yZSBmaWxlcyB3aXRoIHRyYW5zbGF0YWJsZSBzdHJpbmdzICgjNDUwODc4KS4KKworMjAwNy0wNi0yMiAyMDoyMzoxOCArMDAwMCAgSmVucyBHcmFuc2V1ZXIgPGplbnNnckBnbXgubmV0PgorCisJICBnc3QvOiBCdWlsZCBmaXhlcyBmb3IgZ2NjLTIuOXggKG5vIG1pZC1ibG9jayB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgZXRjLikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBKZW5zIEdyYW5zZXVlciAgPGplbnNnciBhdCBnbXggbmV0PgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIzYmFuZHMuYzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuYzoKKwkgICogZ3N0L3J0cG1hbmFnZXIvYXN5bmNfaml0dGVyX3F1ZXVlLmM6CisJICAoYXN5bmNfaml0dGVyX3F1ZXVlX3B1c2hfc29ydGVkKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmM6CisJICAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NoYWluKToKKwkgICogZ3N0L3N3aXRjaC9nc3Rzd2l0Y2guYzogKGdzdF9zd2l0Y2hfY2hhaW4pOgorCSAgQnVpbGQgZml4ZXMgZm9yIGdjYy0yLjl4IChubyBtaWQtYmxvY2sgdmFyaWFibGUgZGVjbGFyYXRpb25zIGV0Yy4pLgorCSAgRml4ZXMgIzQ1MDE4NS4KKworMjAwNy0wNi0yMiAxNDoyNjozNiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIE1BSU5UQUlORVJTOiBVcGRhdGluZyBhbGwgdGhlIG1haW50YWluZXJzIGZpbGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogTUFJTlRBSU5FUlM6CisJICBVcGRhdGluZyBhbGwgdGhlIG1haW50YWluZXJzIGZpbGVzCisKKzIwMDctMDYtMjIgMTA6MTI6MTUgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIEZpeCBtZW1vcnkgbGVha3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOiAoZ3N0X2ZsYWNfdGFnX2luaXQpOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzogKGRlaW50ZXJsZWF2ZV9pbml0KSwKKwkgIChkZWludGVybGVhdmVfc2lua19saW5rKToKKwkgICogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOiAoaW50ZXJsZWF2ZV9pbml0KToKKwkgICogZ3N0L21lZGlhbi9nc3RtZWRpYW4uYzogKGdzdF9tZWRpYW5faW5pdCk6CisJICAqIGdzdC9vbGRjb3JlL2dzdG11bHRpZmlsZXNyYy5jOiAoZ3N0X211bHRpZmlsZXNyY19pbml0KToKKwkgIEZpeCBtZW1vcnkgbGVha3MuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM2RlbXV4LmM6IChwYWRfYWRkZWRfY2IpOgorCSAgUmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KKworMjAwNy0wNi0yMSAxMDo0ODoxMCArMDAwMCAgRGFtaWVuIENhcmJlcnkgPGRhbWllbi5jYXJiZXJ5QHN1bi5jb20+CisKKwkgIGV4dC9nY29uZi9nY29uZi5oOiBNYWtlIHRoZSBwcm90b3R5cGUgb2YgZ3N0X2djb25mX2dldF9rZXlfZm9yX3NpbmtfcHJvZmlsZSBtYXRjaCB0aGUgaW1wbGVtZW50YXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2djb25mL2djb25mLmg6CisJICBNYWtlIHRoZSBwcm90b3R5cGUgb2YgZ3N0X2djb25mX2dldF9rZXlfZm9yX3NpbmtfcHJvZmlsZQorCSAgbWF0Y2ggdGhlIGltcGxlbWVudGF0aW9uLgorCSAgUGF0Y2ggYnk6IERhbWllbiBDYXJiZXJ5IDxkYW1pZW4gZG90IGNhcmJlcnkgYXQgc3VuIGRvdCBjb20+CisJICBGaXhlczogIzQ0OTc0NworCisyMDA3LTA2LTIwIDEyOjU2OjEyICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzogRml4IGRlc2NyaXB0aW9uIC0gcnRwZGVwYXkgaXMgbm90IGEgcGF5bG9hZGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzoKKwkgIEZpeCBkZXNjcmlwdGlvbiAtIHJ0cGRlcGF5IGlzIG5vdCBhIHBheWxvYWRlci4KKworMjAwNy0wNi0yMCAxMDoxNTowMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiBEb2N1bWVudCBwYXJhbWV0ZXIgbWFwcGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSAgRG9jdW1lbnQgcGFyYW1ldGVyIG1hcHBpbmcuCisKKzIwMDctMDYtMjAgMDg6NTY6MTcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IEZpeCBsZWFraW5nIGJ1ZmZlcnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IChnc3Rfc3BlY3RydW1fZXZlbnQpLAorCSAgKGdzdF9zcGVjdHJ1bV90cmFuc2Zvcm1faXApOgorCSAgRml4IGxlYWtpbmcgYnVmZmVycy4KKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NwZWN0cnVtLmM6IChzZXR1cF9zcGVjdHJ1bSksCisJICAoY2xlYW51cF9zcGVjdHJ1bSksIChHU1RfU1RBUlRfVEVTVCksIChzcGVjdHJ1bV9zdWl0ZSksIChtYWluKToKKwkgIEFkZCBzaW1wbGUgdGVzdCBmb3Igc3BlY3RydW0gZWxlbWVudC4KKworMjAwNy0wNi0yMCAwODoyNjoyMSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvcXRkZW11eC86IEFkZCBNSlBHIHRvIHRoZSB2YXJpYW50cyBvZiBtb3Rpb24ganBlZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlX3NhbXBsZXMpLAorCSAgKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZm91cmNjLmg6CisJICBBZGQgTUpQRyB0byB0aGUgdmFyaWFudHMgb2YgbW90aW9uIGpwZWcuCisKKzIwMDctMDYtMTkgMTY6NDA6NDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHRlc3RzL2NoZWNrLzogQWRkIEdTVF9PUFRJT05fQ0ZMQUdTIHRvIENGTEFHUyB3aGVuIGJ1aWxkaW5nIHVuaXQgdGVzdHMsIHNvIHRoZSBlcnJvciBmbGFncyBhcmUgaW5jbHVkZWQgYW5kIGl0IGVycm9ycy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3Bhbm9yYW1hLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2ZpbHRlci5jOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZGVjLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2twYXJzZS5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgQWRkIEdTVF9PUFRJT05fQ0ZMQUdTIHRvIENGTEFHUyB3aGVuIGJ1aWxkaW5nIHVuaXQgdGVzdHMsIHNvIHRoZQorCSAgZXJyb3IgZmxhZ3MgYXJlIGluY2x1ZGVkIGFuZCBpdCBlcnJvcnMgb3V0IG9uIGNvbXBpbGVyIHdhcm5pbmdzCisJICBmb3IgQ1ZTIGJ1aWxkczsgcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMgaW4gdmFyaW91cyB1bml0IHRlc3RzLgorCisyMDA3LTA2LTE5IDE0OjQ4OjAzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiBVc2UgdGhyZWFkc2FmZSBpbmV0X250b3AgdG8gY29udmVydCBhbiBpcCBudW1iZXIgdG8gYSBzdHJpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJ0c3BfY29ubmVjdGlvbl9jb25uZWN0KSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fY2xvc2UpLCAocnRzcF9jb25uZWN0aW9uX2ZyZWUpOgorCSAgVXNlIHRocmVhZHNhZmUgaW5ldF9udG9wIHRvIGNvbnZlcnQgYW4gaXAgbnVtYmVyIHRvIGEgc3RyaW5nLgorCSAgRml4ZXMgIzQ0Nzk2MS4KKwkgIERvbid0IGxlYWsgZmQgKGFuZCBpcCkgd2hlbiBmcmVlaW5nIGEgY29ubmVjdGlvbiB3aXRob3V0IGZpcnN0IGNsb3NpbmcKKwkgIGl0LgorCisyMDA3LTA2LTE5IDE0OjExOjQ5ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC9xdGRlbXV4L0xFR0FMOgorCSAgYWRkICdMRUdBTCcgZmlsZSBkZXNjcmliaW5nIHdoeSB0aGlzIGlzIGluIC1nb29kIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgaXQgbWlnaHQgbmVlZCB0byBtb3ZlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgJ0xFR0FMJyBmaWxlIGRlc2NyaWJpbmcgd2h5IHRoaXMgaXMgaW4gLWdvb2QgYW5kIHVuZGVyIHdoYXQKKwkgIGNpcmN1bXN0YW5jZXMgaXQgbWlnaHQgbmVlZCB0byBtb3ZlLgorCisyMDA3LTA2LTE5IDEwOjQxOjQ5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBCYWNrIHRvIENWUworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEJhY2sgdG8gQ1ZTCisJICAqIGdzdC1wbHVnaW5zLWdvb2QuZG9hcDoKKwkgIEFkZCAwLjEwLjYgdG8gdGhlIGRvYXAgZmlsZS4KKworPT09IHJlbGVhc2UgMC4xMC42ID09PQorCisyMDA3LTA2LTE5IDEwOjI0OjU1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Rpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF1aWNrdGltZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JhbGFuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlbGVhc2UgMC4xMC42CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJlbGVhc2UgMC4xMC42CisKKzIwMDctMDYtMTggMTc6NTM6MjAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vY3MucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaXQucG86CisJKiBwby9qYS5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAwNy0wNi0xNyAxMjozNTowMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogUmV2ZXJ0IHByZXZpb3VzIGNvbW1pdCBhZ2Fpbiwgc2luY2Ugd2UgYXJlIGZyb3plbiAoc29ycnkpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fY29ubmVjdCksCisJICAocnRzcF9jb25uZWN0aW9uX2ZyZWUpOgorCSAgUmV2ZXJ0IHByZXZpb3VzIGNvbW1pdCBhZ2Fpbiwgc2luY2Ugd2UgYXJlIGZyb3plbiAoc29ycnkpLgorCisyMDA3LTA2LTE3IDEyOjI0OjU4ICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogaW5ldF9udG9hKCkgdXNlcyBhIHN0YXRpYyBidWZmZXIgaW50ZXJuYWxseSwgc28gd2UgbmVlZCB0byBjb3B5IHRoZSByZXR1cm5lZCBzdHJpbmcgaWYgd2UgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBQZXRlciBLamVsbGVyc3RlZHQgPHBraiBhdCBheGlzIGNvbT4KKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJ0c3BfY29ubmVjdGlvbl9jb25uZWN0KSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fZnJlZSk6CisJICBpbmV0X250b2EoKSB1c2VzIGEgc3RhdGljIGJ1ZmZlciBpbnRlcm5hbGx5LCBzbyB3ZSBuZWVkIHRvIGNvcHkgdGhlCisJICByZXR1cm5lZCBzdHJpbmcgaWYgd2Ugd2FudCB0byBzdG9yZSBpdCBmb3IgbGF0ZXIgKCM0NDc5NjEpLgorCisyMDA3LTA2LTE1IDA5OjEzOjU1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgd2luMzIvdnM2LzogTWFyayAqLmRzcCAmICouZHN3IGFzIGJpbmFyeSBmaWxlcyBhbmQgY29udmVydCB0byBET1MgbGluZSBlbmRpbmdzLCBhcyB0aGV5IGRvbid0IGxvYWQgaW50byBWUzYgY29ycmVjdGx5Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogd2luMzIvdnM2L2F1dG9nZW4uZHNwOgorCSAgKiB3aW4zMi92czYvZ3N0X3BsdWdpbnNfZ29vZC5kc3c6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RhbGF3LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdGFscGhhLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdGFscGhhY29sb3IuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0YXBldGFnLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdGF1ZGlvZnguZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0YXVwYXJzZS5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RhdXRvZGV0ZWN0LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdGF2aS5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RjdXR0ZXIuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0ZGlyZWN0ZHJhdy5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RkaXJlY3Rzb3VuZC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RlZmZlY3R2LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdGZseC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3Rnb29tLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdGljeWRlbXV4LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdGlkM2RlbXV4LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdGludGVybGVhdmUuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0anBlZy5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RsZXZlbC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RtYXRyb3NrYS5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RtZWRpYW4uZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0bW9ub3Njb3BlLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdG11bGF3LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdG11bHRpcGFydC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RxdGRlbXV4LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHJ0cC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RydHNwLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHNtcHRlLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHNwZWV4LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHVkcC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3R2aWRlb2JhbGFuY2UuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0dmlkZW9ib3guZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0dmlkZW9jcm9wLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHZpZGVvZmxpcC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3R2aWRlb21peGVyLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHdhdmVmb3JtLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHdhdmVuYy5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3R3YXZwYXJzZS5kc3A6CisJICBNYXJrICouZHNwICYgKi5kc3cgYXMgYmluYXJ5IGZpbGVzIGFuZCBjb252ZXJ0IHRvIERPUyBsaW5lCisJICBlbmRpbmdzLCBhcyB0aGV5IGRvbid0IGxvYWQgaW50byBWUzYgY29ycmVjdGx5IG90aGVyd2lzZS4KKworMjAwNy0wNi0xNSAwODozMjo1MiArMDAwMCAgVmluY2VudCBUb3JyaSA8dnRvcnJpQHVuaXYtZXZyeS5mcj4KKworCSAgZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogRml4IHRoZSBNaW5nVyBidWlsZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiAocnRzcF9jb25uZWN0aW9uX2NyZWF0ZSksCisJICAocnRzcF9jb25uZWN0aW9uX2Nvbm5lY3QpOgorCSAgRml4IHRoZSBNaW5nVyBidWlsZC4KKwkgIFBhdGNoIEJ5OiBWaW5jZW50IFRvcnJpIDx2dG9ycmkgYXQgdW5pdi1ldnJ5IGRvdCBmcj4KKwkgIEZpeGVzOiAjNDQ2OTgxCisKKzIwMDctMDYtMTQgMTQ6MDM6NDEgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICB0ZXN0cy86IEh1c2ggdGhlIGJ1aWxkYm90cyB1cAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6CisJICAqIHRlc3RzL2ljbGVzLy5jdnNpZ25vcmU6CisJICBIdXNoIHRoZSBidWlsZGJvdHMgdXAKKworMjAwNy0wNi0xNCAxMjoxNDoyNCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIE1ha2Ugc3VyZSB0byBkaXN0IGV2ZXJ5dGhpbmcgbmVlZGVkIGZvciB3aW4zMiBidWlsZHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBzeXMvTWFrZWZpbGUuYW06CisJICAqIHN5cy9kaXJlY3RkcmF3L01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZGlyZWN0c291bmQvTWFrZWZpbGUuYW06CisJICAqIHN5cy93YXZlZm9ybS9NYWtlZmlsZS5hbToKKwkgIE1ha2Ugc3VyZSB0byBkaXN0IGV2ZXJ5dGhpbmcgbmVlZGVkIGZvciB3aW4zMiBidWlsZHMuCisKKzIwMDctMDYtMTQgMTA6MjM6MjAgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRm9yIEFNUi1OQiBzdHJlYW1zLCBleHBvcnQgdGhlIEFNUlNwZWNpZmljQm94IGFzIGNvZGVjX2RhdGEgb24gdGhlIGNhcHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIEZvciBBTVItTkIgc3RyZWFtcywgZXhwb3J0IHRoZSBBTVJTcGVjaWZpY0JveCBhcyBjb2RlY19kYXRhIG9uIHRoZQorCSAgY2Fwcy4KKwkgIEZpeGVzICM0NDc0NTgKKworMjAwNy0wNi0xMyAxNzoxMToyNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzogTWFrZSBzdXJlIHdlIGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIHRoZSBjb2RlY19kYXRhLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6IChnc3RfcnRwX2gyNjRfZGVwYXlfc2V0Y2Fwcyk6CisJICBNYWtlIHN1cmUgd2UgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIGNvZGVjX2RhdGEuCisJICBGaXhlcyAjNDQ3MjEwLgorCisyMDA3LTA2LTEyIDIxOjA1OjIyICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkgIHdpbjMyL01BTklGRVNUOiBBZGQgdmlkZW9jcm9wIHByb2plY3QgZmlsZSB0byB0aGUgd2luMzIgbWFuaWZlc3QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogd2luMzIvTUFOSUZFU1Q6CisJICBBZGQgdmlkZW9jcm9wIHByb2plY3QgZmlsZSB0byB0aGUgd2luMzIgbWFuaWZlc3QuCisJICAqIHdpbjMyL3ZzNi9nc3RfcGx1Z2luc19nb29kLmRzdzoKKwkgIEFkZCBxdGRlbXV4LHZpZGVvY3JvcCBhbmQgd2F2ZWZvcm0gcHJvamVjdHMgdG8gdGhlIHdvcmtzcGFjZS4KKwkgICogd2luMzIvdnM2L2xpYmdzdHF0ZGVtdXguZHNwOgorCSAgQWRkIHpsaWIgdG8gdGhlIGxpbmsgbGlzdCBvZiBxdGRlbXV4LgorCSAgKiB3aW4zMi92czYvbGliZ3N0dmlkZW9jcm9wLmRzcDoKKwkgIEFkZCBhIHByb2plY3QgZmlsZSBmb3IgdmlkZW9jcm9wLgorCisyMDA3LTA2LTEyIDIwOjIyOjI2ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgcG8vUE9URklMRVMuaW46IEFkZCBxdGRlbXV4IGZvciB0cmFuc2xhdGlvbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHBvL1BPVEZJTEVTLmluOgorCSAgQWRkIHF0ZGVtdXggZm9yIHRyYW5zbGF0aW9uCisKKzIwMDctMDYtMTIgMjA6MTU6MjkgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBNb3ZlIHZpZGVvY3JvcCBhbmQgb3N4dmlkZW8gZnJvbSAtYmFkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSAgKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICAqIHN5cy9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2ljbGVzL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9pY2xlcy92aWRlb2Nyb3AtdGVzdC5jOgorCSAgTW92ZSB2aWRlb2Nyb3AgYW5kIG9zeHZpZGVvIGZyb20gLWJhZC4KKworMjAwNy0wNi0xMiAxOTozNTowOCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIE1vdmUgcXRkZW11eCBmcm9tIC1iYWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXRkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdWlja3RpbWUueG1sOgorCSAgKiB3aW4zMi9NQU5JRkVTVDoKKwkgIE1vdmUgcXRkZW11eCBmcm9tIC1iYWQuCisJICAqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIFVwZGF0ZSBzcGVjIGZpbGUgdG8gcmVmbGVjdCBtb3Zpbmcgb2YgcXRkZW11eCBhbmQgd2F2cGFjaworCisyMDA3LTA2LTEyIDE5OjAxOjQxICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogd2luMzIvTUFOSUZFU1Q6CisJICBGaXggdHlwbyBpbiB0aGUgY2hhbmdlbG9nIGFuZCBjb21taXQgdGhlIG1hbmlmZXN0IHRvbworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGaXggdHlwbyBpbiB0aGUgY2hhbmdlbG9nIGFuZCBjb21taXQgdGhlIG1hbmlmZXN0IHRvbworCisyMDA3LTA2LTEyIDE4OjUyOjMzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgd2luMzIvTUFOSUZFU1QKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB3aW4zMi9NQU5JRkVTVAorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRpcmVjdGRyYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGlyZWN0c291bmQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZWZvcm0ueG1sOgorCSAgTW92ZSB0aGUgd2F2ZWZvcm0gcGx1Z2luIGZyb20gLWJhZCB0b28uIFVwZGF0ZSB0aGUgaW5zcGVjdCB4bWwKKwkgIGZpbGVzIHRvIG1lbnRpb24gUGx1Z2lucyBHb29kIGluc3RlYWQgb2YgUGx1Z2lucyBCYWQuCisKKzIwMDctMDYtMTIgMTM6MzM6NTYgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSAgUmV0dXJuIGEgY29weSBvZiB0aGUgcG9vbCBidWZmZXIgaWYgYWxsIG1tYXAgYnVmZmVycyBoYXZlIGJlZW4gZGVxdWV1ZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIChnc3RfdjRsMnNyY19ncmFiX2ZyYW1lKTogUmV0dXJuIGEgY29weSBvZiB0aGUgcG9vbCBidWZmZXIgaWYgYWxsCisJICBtbWFwIGJ1ZmZlcnMgaGF2ZSBiZWVuIGRlcXVldWVkLgorCisyMDA3LTA2LTEyIDExOjIzOjAxICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYyAoZ3N0X3Y0bDJfYnVmZmVyX2ZpbmFsaXplKSAoZ3N0X3Y0bDJfYnVmZmVyX2NsYXNzX2luaXQsIGdzdF92NGwyX2J1ZmZlcl9nZXRfdHlwZSkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNy0wNi0xMiAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jIChnc3RfdjRsMl9idWZmZXJfZmluYWxpemUpCisJICAoZ3N0X3Y0bDJfYnVmZmVyX2NsYXNzX2luaXQsIGdzdF92NGwyX2J1ZmZlcl9nZXRfdHlwZSkKKwkgIChnc3RfdjRsMl9idWZmZXJfbmV3KTogQmVoYXZlIG1vcmUgbGlrZSB4aW1hZ2VzaW5rJ3MgYnVmZmVycywgd2l0aAorCSAgZmluYWxpemF0aW9uIGFuZCByZXN1c2NpdGF0aW9uLiBObyBsb25nZXIgcHVibGljLgorCSAgKGdzdF92NGwyX2J1ZmZlcl9wb29sX2ZpbmFsaXplLCBnc3RfdjRsMl9idWZmZXJfcG9vbF9pbml0KQorCSAgKGdzdF92NGwyX2J1ZmZlcl9wb29sX2NsYXNzX2luaXQsIGdzdF92NGwyX2J1ZmZlcl9wb29sX2dldF90eXBlKQorCSAgKGdzdF92NGwyX2J1ZmZlcl9wb29sX25ldywgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfYWN0aXZhdGUpCisJICAoZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfZGVzdHJveSk6IE1ha2UgdGhlIHBvb2wgZm9sbG93IGNvbW1vbgorCSAgbWluaW9iamVjdCBzZW1hbnRpY3MsIGFuZCBiZSB0aHJlYWRzYWZlLgorCSAgKGdzdF92NGwyc3JjX3F1ZXVlX2ZyYW1lKTogUmVtb3ZlIHRoaXMgZnVuY3Rpb24sIGFzIHdlIGp1c3QgY2FsbAorCSAgdGhlIGlvY3RscyBkaXJlY3RseSBpbiB0aGUgdHdvIHBsYWNlcyB3aGVyZSB3ZSBxdWV1ZSBidWZmZXJzLgorCSAgKGdzdF92NGwyc3JjX2dyYWJfZnJhbWUpOiBSZXR1cm4gYSBmbG93cmV0dXJuIGFuZCBmaWxsIHRoZSBidWZmZXIKKwkgIGRpcmVjdGx5LgorCSAgKGdzdF92NGwyc3JjX2NhcHR1cmVfaW5pdCk6IFVzZSB0aGUgbmV3IGJ1ZmZlcl9wb29sX25ldyBmdW5jdGlvbgorCSAgdG8gYWxsb2NhdGUgdGhlIHBvb2wsIHdoaWNoIGFsc28gcHJlYWxsb2NhdGVzIHRoZSBHc3RCdWZmZXJzLgorCSAgKGdzdF92NGwyc3JjX2NhcHR1cmVfc3RhcnQpOiBDYWxsIGJ1ZmZlcl9wb29sX2FjdGl2YXRlIGluc3RlYWQgb2YKKwkgIHF1ZXVlaW5nIHRoZSBmcmFtZXMgZGlyZWN0bHkuCisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuaCAoc3RydWN0IF9Hc3RWNGwyQnVmZmVyUG9vbCk6IE1ha2UgdGhpcyBhCisJICByZWFsIE1pbmlPYmplY3QgaW5zdGVhZCBvZiByb2xsaW5nIG91ciBvd24gcmVmY291bnRpbmcgYW5kCisJICBmaW5hbGl6aW5nLiBHaXZlIGl0IGEgbG9jay4KKwkgIChzdHJ1Y3QgX0dzdFY0bDJCdWZmZXIpOiBSZW1vdmUgb25lIGludGVybWVkaWFyeSBvYmplY3QsIGhhdmluZworCSAgdGhlIGJ1ZmZlcnMgaG9sZCB0aGUgc3RydWN0IHY0bDJfYnVmZmVyIGRpcmVjdGx5LgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmMgKGdzdF92NGwyc3JjX3NldF9jYXBzKTogUGFzcyB0aGUgY2FwcyB0bworCSAgY2FwdHVyZV9pbml0IHNvIHRoYXQgaXQgY2FuIHNldCB0aGVtIG9uIHRoZSBidWZmZXJzIHRoYXQgaXQgd2lsbAorCSAgY3JlYXRlLgorCSAgKGdzdF92NGwyc3JjX2dldF9yZWFkKTogRm9yIGJldHRlciBvciBmb3Igd29yc2UsIGluY2x1ZGUgdGhlCisJICB0aW1lc3RhbXBpbmcgYW5kIG9mZnNldHRpbmcgY29kZSBoZXJlOyByZWFsbHkgd2Ugc2hvdWxkIGJlIHVzaW5nCisJICBidWZmZXJhbGxvYyB0aG91Z2guCisJICAoZ3N0X3Y0bDJzcmNfZ2V0X21tYXApOiBKdXN0IG1ha2UgZ3JhYl9mcmFtZSByZXR1cm4gb25lIG9mIG91cgorCSAgcHJlYWxsb2NhdGVkLCBtbWFwJ2QgYnVmZmVycy4KKworMjAwNy0wNi0xMSAxMTo0MTo1NiArMDAwMCAgZGFuaWVsIGZpc2NoZXIgPGRhbkBmM2MuY29tPgorCisJICBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiBBY3R1YWxseSB1c2UgdGhlIGRpc3BsYXlfbmFtZSBwcm9wZXJ0eSBzbyB0aGF0IHdlIGNhbiBkdW1wIGFueSBhdmFpbGFibGUgWCBkaXNwbGF5LiBGaXhlcyAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IGRhbmllbCBmaXNjaGVyIDxkYW4gYXQgZjNjIGRvdCBjb20+CisJICAqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6IChnc3RfeGltYWdlX3NyY19zdGFydCksCisJICAoZ3N0X3hpbWFnZV9zcmNfZ2V0X2NhcHMpOgorCSAgQWN0dWFsbHkgdXNlIHRoZSBkaXNwbGF5X25hbWUgcHJvcGVydHkgc28gdGhhdCB3ZSBjYW4gZHVtcCBhbnkKKwkgIGF2YWlsYWJsZSBYIGRpc3BsYXkuIEZpeGVzICM0NDU5MDUuCisKKzIwMDctMDYtMTEgMTA6MjE6MTMgKzAwMDAgIFRvbW1pIE15w7Zow6RuZW4gPGV4dC10b21taS5teW9oYW5lbkBub2tpYS5jb20+CisKKwkgIGdzdC9ydHAvOiBBZGQgbWlzc2luZyByYXRlIGZpZWxkcyB0byBjYXBzLiBGaXhlcyAjNDQxMTE4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVG9tbWkgTXnDtmjDpG5lbiAgPGV4dC10b21taSBkb3QgbXlvaGFuZW4gYXQgbm9raWEgZG90IGNvbT4KKwkgICogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzogKGdzdF9ydHBfcGNtYV9kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzogKGdzdF9ydHBfcGNtdV9kZXBheV9zZXRjYXBzKToKKwkgIEFkZCBtaXNzaW5nIHJhdGUgZmllbGRzIHRvIGNhcHMuIEZpeGVzICM0NDExMTguCisKKzIwMDctMDYtMTAgMjE6MTQ6MTEgKzAwMDAgIFPDqWJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4KKworCSAgd2luMzIvOiBBZGQgRGlyZWN0U291bmQgYW5kIERpcmVjdERyYXcgc2lua3MgcHJvamVjdCBmaWxlcyB0byB3b3Jrc3BhY2UgYW5kIHNvbHV0aW9uIGZpbGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHdpbjMyL3ZzNi9nc3RfcGx1Z2luc19nb29kLmRzdzoKKwkgICogd2luMzIvdnM4L2dzdC1wbHVnaW5zLWdvb2Quc2xuOgorCSAgQWRkIERpcmVjdFNvdW5kIGFuZCBEaXJlY3REcmF3IHNpbmtzIHByb2plY3QgZmlsZXMgdG8KKwkgIHdvcmtzcGFjZSBhbmQgc29sdXRpb24gZmlsZXMuCisKKzIwMDctMDYtMTAgMTA6NTM6MjYgKzAwMDAgIEpvc2ggQ29hbHNvbiA8eGZsYWNAeWFob28uY29tPgorCisJICBBZGQgc3VwcG9ydCBmb3IgZmxhYyA+PSAxLjEuMyB3aGljaCBjaGFuZ2VkIHRoZSBBUEkuIEZpeGVzIGJ1ZyAjMzg1ODg3LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSm9zaCBDb2Fsc29uIDx4ZmxhYyBhdCB5YWhvbyBkb3QgY29tPiwKKwkgIHVwZGF0ZWQgYnkgQWxleGlzIEJhbGxpZXIgPGFiYWxsaWVyIGF0IGdlbnRvbyBkb3Qgb3JnPjoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfcmVzZXRfZGVjb2RlcnMpLAorCSAgKGdzdF9mbGFjX2RlY19zZXR1cF9zZWVrYWJsZV9kZWNvZGVyKSwKKwkgIChnc3RfZmxhY19kZWNfc2V0dXBfc3RyZWFtX2RlY29kZXIpLCAoZ3N0X2ZsYWNfZGVjX3NlZWspLAorCSAgKGdzdF9mbGFjX2RlY190ZWxsKSwgKGdzdF9mbGFjX2RlY19sZW5ndGgpLCAoZ3N0X2ZsYWNfZGVjX2VvZiksCisJICAoZ3N0X2ZsYWNfZGVjX3JlYWRfc2Vla2FibGUpLCAoZ3N0X2ZsYWNfZGVjX3JlYWRfc3RyZWFtKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY19lbmNfaW5pdCksCisJICAoZ3N0X2ZsYWNfZW5jX2ZpbmFsaXplKSwgKGdzdF9mbGFjX2VuY19zZXRfbWV0YWRhdGEpLAorCSAgKGdzdF9mbGFjX2VuY19zaW5rX3NldGNhcHMpLCAoZ3N0X2ZsYWNfZW5jX3VwZGF0ZV9xdWFsaXR5KSwKKwkgIChnc3RfZmxhY19lbmNfc2Vla19jYWxsYmFjayksIChnc3RfZmxhY19lbmNfd3JpdGVfY2FsbGJhY2spLAorCSAgKGdzdF9mbGFjX2VuY190ZWxsX2NhbGxiYWNrKSwgKGdzdF9mbGFjX2VuY19zaW5rX2V2ZW50KSwKKwkgIChnc3RfZmxhY19lbmNfY2hhaW4pLCAoZ3N0X2ZsYWNfZW5jX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2ZsYWNfZW5jX2dldF9wcm9wZXJ0eSksIChnc3RfZmxhY19lbmNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIGZsYWMgPj0gMS4xLjMgd2hpY2ggY2hhbmdlZCB0aGUgQVBJLiBGaXhlcyBidWcgIzM4NTg4Ny4KKworMjAwNy0wNi0wOSAxNTo0MTo1MiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IFJlbW92ZSB3b3JrYXJvdW5kIGZvciBidWcgIzQyMTU0My4gVGhpcyBpcyBmaXhlZCBpbiBjb3JlIDAuMTAuMTMgYW5kIG5vdCBuZWNlc3NhcnkgYW55bW8uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfc2lua19zZXRfY2Fwcyk6CisJICBSZW1vdmUgd29ya2Fyb3VuZCBmb3IgYnVnICM0MjE1NDMuIFRoaXMgaXMgZml4ZWQgaW4gY29yZSAwLjEwLjEzIGFuZAorCSAgbm90IG5lY2Vzc2FyeSBhbnltb3JlIGFzIHdlIG5lZWQgYXQgbGVhc3QgdGhhdCBjb3JlIHZlcnNpb24uCisKKzIwMDctMDYtMDkgMTU6MzM6MzIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svOiBJbXByb3ZlIGRpc2NvbnQgaGFuZGxpbmcgYnkgY2hlY2tpbmcgaWYgdGhlIG5leHQgV2F2cGFjayBibG9jayBoYXMgdGhlIGV4cGVjdGVkLCBmb2xsb3dpbmcgYmxvY2sgaW5kZXguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX3Jlc2V0KSwKKwkgIChnc3Rfd2F2cGFja19kZWNfY2hhaW4pOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmg6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiAoZ3N0X3dhdnBhY2tfcGFyc2VfcmVzZXQpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX3B1c2hfYnVmZmVyKToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmg6CisJICBJbXByb3ZlIGRpc2NvbnQgaGFuZGxpbmcgYnkgY2hlY2tpbmcgaWYgdGhlIG5leHQgV2F2cGFjayBibG9jayBoYXMKKwkgIHRoZSBleHBlY3RlZCwgZm9sbG93aW5nIGJsb2NrIGluZGV4LgorCisyMDA3LTA2LTA4IDIwOjIzOjA3ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkgIG1vYXAgaWdub3JlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIG1vYXAgaWdub3JlCisKKzIwMDctMDYtMDggMjA6MjA6NTYgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYyAoZ3N0X3J0cF9tcDR2cGF5X2RldGFpbHMpOiBGaXggZWxlbWVudCBkZXNjcmlwdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYyAoZ3N0X3J0cF9tcDR2cGF5X2RldGFpbHMpOgorCSAgRml4IGVsZW1lbnQgZGVzY3JpcHRpb24uCisKKzIwMDctMDYtMDggMjA6MTk6NTUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBtb3ZlIHdhdnBhY2sgcGx1Z2luLiAgU2VlICMzNTI2MDUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxhZHNwYS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJICAqIGV4dC9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBtb3ZlIHdhdnBhY2sgcGx1Z2luLiAgU2VlICMzNTI2MDUuCisKKzIwMDctMDYtMDggMTk6NDU6NDMgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICB0aGUgYWxwaGFiZXQgdHJpcHBpbmcgdXAgcGVvcGxlIHNpbmNlIDEwOTI5QkMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdGhlIGFscGhhYmV0CisJICB0cmlwcGluZyB1cCBwZW9wbGUgc2luY2UgMTA5MjlCQworCisyMDA3LTA2LTA4IDE3OjM3OjAyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgQWRkIERpcmVjdERyYXcgJiBEaXJlY3RTb3VuZCBwbHVnaW5zIHRvIHRoZSBidWlsZCBhbmQgZG9jcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIHN5cy9NYWtlZmlsZS5hbToKKwkgICogd2luMzIvTUFOSUZFU1Q6CisJICBBZGQgRGlyZWN0RHJhdyAmIERpcmVjdFNvdW5kIHBsdWdpbnMgdG8gdGhlIGJ1aWxkIGFuZCBkb2NzLgorCisyMDA3LTA2LTA4IDE2OjMxOjE1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgUmVuYW1lIHRoZSBrZWVwLWFzcGVjdC1yYXRpbyBwcm9wZXJ0eSB0byBmb3JjZS1hc3BlY3QtcmF0aW8gdG8gbWFrZSBpdCBjb25zaXN0ZW50IHdpdGggeHZpbWFnZXNpbmsgYW5kIHhpbWFnZXNpbmsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLmFyZ3M6CisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6CisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua19jbGFzc19pbml0KToKKwkgIFJlbmFtZSB0aGUga2VlcC1hc3BlY3QtcmF0aW8gcHJvcGVydHkgdG8gZm9yY2UtYXNwZWN0LXJhdGlvIHRvIG1ha2UKKwkgIGl0IGNvbnNpc3RlbnQgd2l0aCB4dmltYWdlc2luayBhbmQgeGltYWdlc2luay4KKworMjAwNy0wNi0wOCAxMDo0MzoyNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0LzogV2hlbiBvcGVyYXRpbmcgaW4gcHVsbCBtb2RlLCBlcnJvciBvdXQgY29ycmVjdCBvbiBub3QtbGlua2VkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kdi9nc3RkdmRlbXV4LmM6IChnc3RfZHZkZW11eF9sb29wKToKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKHVzZXJfcmVhZF9kYXRhKSwgKGdzdF9wbmdkZWNfdGFzayk6CisJICBXaGVuIG9wZXJhdGluZyBpbiBwdWxsIG1vZGUsIGVycm9yIG91dCBjb3JyZWN0IG9uIG5vdC1saW5rZWQuCisKKzIwMDctMDYtMDggMDg6MTI6NDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6IERlZmF1bHQgdG8geHZpbWFnZXNpbmsgaW5zdGVhZCBvZiBhdXRvdmlkZW9zaW5rIHdoaWxlIGF1dG92aWRlb3NpbmsvZ2hvc3RwYWRzL3doYXRldmVyIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6IChtYWluKToKKwkgIERlZmF1bHQgdG8geHZpbWFnZXNpbmsgaW5zdGVhZCBvZiBhdXRvdmlkZW9zaW5rIHdoaWxlCisJICBhdXRvdmlkZW9zaW5rL2dob3N0cGFkcy93aGF0ZXZlciBkb24ndCBoYW5kbGUgdGhlIHdheSB3ZSB1c2UgaXQgaW4KKwkgIHRoZSB3YXkgd2UgZXhwZWN0IGl0IHRvLgorCisyMDA3LTA2LTA2IDEwOjE5OjE3ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYyAoZ3N0X3Y0bDJzcmNfcHJvYmVfY2Fwc19mb3JfZm9ybWF0KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA3LTA2LTA2ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmMgKGdzdF92NGwyc3JjX3Byb2JlX2NhcHNfZm9yX2Zvcm1hdCkKKwkgIChnc3RfdjRsMnNyY19wcm9iZV9jYXBzX2Zvcl9mb3JtYXRfYW5kX3NpemUpOiBPbmx5IHByb2JlIGZvcgorCSAgZm9ybWF0IGFuZCBzaXplIGlmIHRoZSBpb2N0bHMgYXJlIGRlZmluZWQ7IHNob3VsZCBmaXggY29tcGlsYXRpb24KKwkgIG9uIExpbnV4IDwgMi4xNi4xOS4KKworMjAwNy0wNi0wNiAwODo1MzoxMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IFByaW50ZiBmaXhlcyBpbiBkZWJ1ZyBzdGF0ZW1lbnRzOyB1c2UgTE9HIGxldmVsIGZvciBkZWJ1ZyBzdGF0ZW1lbnRzIHRoYXQgYXJlIHByaW50ZWQgZm9yLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2F5dXZfaTQyMCk6CisJICBQcmludGYgZml4ZXMgaW4gZGVidWcgc3RhdGVtZW50czsgdXNlIExPRyBsZXZlbCBmb3IgZGVidWcgc3RhdGVtZW50cworCSAgdGhhdCBhcmUgcHJpbnRlZCBmb3IgZWFjaCBhbmQgZXZlcnkgZnJhbWU7IGNvbnZlcnQgYysrIGNvbW1lbnRzIHRvCisJICBDLXN0eWxlIGNvbW1lbnRzOyBub3QgbXVjaCBwb2ludCB1c2luZyBnX3RyeV9tYWxsb2MoKSBpZiB3ZSB0aGVuIG5vdAorCSAgZXZlbiBjaGVjayB0aGUgcmV0dXJuIHZhbHVlLgorCisyMDA3LTA2LTA1IDE2OjMyOjE5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IEJ1bXAgcmVxdWlyZW1lbnRzIHRvIHJlbGVhc2VkIHZlcnNpb25zIChjb3JlIGFuZCBiYXNlIDAuMTAuMTMpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEJ1bXAgcmVxdWlyZW1lbnRzIHRvIHJlbGVhc2VkIHZlcnNpb25zIChjb3JlIGFuZCBiYXNlIDAuMTAuMTMpLgorCSAgKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzogKGdzdF9pY3lkZW11eF91bmljb2RpZnkpOgorCSAgVXNlIGdzdF90YWdfdXRmOF9mcm9tX2ZyZWVmb3JtX3N0cmluZygpIGZyb20gbGliZ3N0dGFnIGluc3RlYWQgb2YKKwkgIG93biBpbXBsZW1lbnRhdGlvbi4KKworMjAwNy0wNi0wNSAxNDoxNzoyNSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBzeXMvdjRsMi9nc3R2NGwyc3JjLmMgKGdzdF92NGwyc3JjX3N0YXJ0LCBnc3RfdjRsMnNyY19zdG9wKTogQWRkIHNvbWUgdXNlbGVzcyBjb21tZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNy0wNi0wNSAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jIChnc3RfdjRsMnNyY19zdGFydCwgZ3N0X3Y0bDJzcmNfc3RvcCk6IEFkZAorCSAgc29tZSB1c2VsZXNzIGNvbW1lbnRzLgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmMgKGdzdF92NGwyc3JjX2NhcHR1cmVfaW5pdCk6IERvbid0IHF1ZXVlCisJICBmcmFtZXMgYmVmb3JlIGNhbGxpbmcgU1RSRUFNT04sIHRoYXQgbWlnaHQgbGVhdmUgdGhlbSBpbiBhIHN0YXRlCisJICB3aGVyZSB0aGV5IGNhbid0IGJlIGRlcXVldWVkIGlmIHdlIGdvIGJhY2sgdG8gTlVMTCB3aXRob3V0IGNhbGxpbmcKKwkgIFNUUkVBTU9OLCBhY2NvcmRpbmcgdG8gdGhlIGRvY3MuCisJICAoZ3N0X3Y0bDJzcmNfY2FwdHVyZV9zdGFydCk6IEVucXVldWUgYnVmZmVycyBoZXJlIGluc3RlYWQsIHJpZ2h0CisJICBiZWZvcmUgd2UgY2FsbCBTVFJFQU1PTi4KKwkgIChnc3RfdjRsMnNyY19jYXB0dXJlX2RlaW5pdCk6IFJlbW92ZSBjcmFjayB0byB3b3JrIGFyb3VuZCBkZXF1ZXVlCisJICBmYWlsdXJlcy4gKEZvciBtZSB0aGlzIGNvZGUgaHVuZy4pIFRoZSBwb29sIHJlZmNvdW50aW5nIGlzIHN0aWxsCisJICBjcmFjazsgYWRkZWQgYSBub3RlIHRvIHRoYXQgZWZmZWN0LgorCisyMDA3LTA2LTA1IDA5OjExOjQxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOiBBZGQgc3VwcG9ydCBmb3IgbWFwcGluZyBnc3Qgc3RydWN0dXJlIG5hbWVzIHRvIHRoZSBNSU1FIHR5cGUgZXF1aXZhbGVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOiAoZ3N0X211bHRpcGFydF9tdXhfY2xhc3NfaW5pdCksCisJICAoZ3N0X211bHRpcGFydF9tdXhfZ2V0X21pbWUpLCAoZ3N0X211bHRpcGFydF9tdXhfY29sbGVjdGVkKToKKwkgIEFkZCBzdXBwb3J0IGZvciBtYXBwaW5nIGdzdCBzdHJ1Y3R1cmUgbmFtZXMgdG8gdGhlIE1JTUUgdHlwZSBlcXVpdmFsZW50LgorCSAgSW1wbGVtZW50ZWQgZm9yIGF1ZGlvL3gtbXVsYXctPmF1ZGlvL2Jhc2ljLiBGaXhlcyAjNDQyODc0LgorCisyMDA3LTA2LTAzIDExOjIxOjQ0ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLio6IFByb3Blcmx5IHdyaXRlIHdhdiBmaWxlcyB3aXRoIHdpZHRoIT1kZXB0aCBieSBoYXZpbmcgdGhlIGRlcHRoIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZXMgc2V0IGFuZC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX2NyZWF0ZV9oZWFkZXJfYnVmKSwKKwkgIChnc3Rfd2F2ZW5jX3Npbmtfc2V0Y2FwcyksIChnc3Rfd2F2ZW5jX2Zvcm1hdF9zYW1wbGVzKSwKKwkgIChnc3Rfd2F2ZW5jX2NoYWluKSwgKGdzdF93YXZlbmNfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuaDoKKwkgIFByb3Blcmx5IHdyaXRlIHdhdiBmaWxlcyB3aXRoIHdpZHRoIT1kZXB0aCBieSBoYXZpbmcgdGhlIGRlcHRoIG1vc3QKKwkgIHNpZ25pZmljYW50IGJ5dGVzIHNldCBhbmQgYWxsIG90aGVycyB6ZXJvLiBGaXhlcyAjNDQyNTM1LgorCisyMDA3LTA2LTAxIDEzOjUyOjE3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiBBZGQgaW5jbHVkZSB0byBtYWtlIGJ1aWxkYm90IGhhcHB5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6CisJICBBZGQgaW5jbHVkZSB0byBtYWtlIGJ1aWxkYm90IGhhcHB5LgorCisyMDA3LTA2LTAxIDEzOjA3OjExICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0c3AvOiBJbXByb3ZlcyB2ZXJzaW9uIGNoZWNraW5nLCBhbGxvd2luZyBhbiBSVFNQIHNlcnZlciB0byByZXBseSB3aXRoICI1MDUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFBldGVyIEtqZWxsZXJzdGVkdCAgPHBraiBhdCBheGlzIGNvbT4KKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJ0c3BfY29ubmVjdGlvbl9jcmVhdGUpLAorCSAgKHJ0c3BfY29ubmVjdGlvbl9jb25uZWN0KSwgKGFkZF9kYXRlX2hlYWRlciksCisJICAocnRzcF9jb25uZWN0aW9uX3NlbmQpLCAocGFyc2VfcmVzcG9uc2Vfc3RhdHVzKSwKKwkgIChwYXJzZV9yZXF1ZXN0X2xpbmUpLCAocGFyc2VfbGluZSksIChydHNwX2Nvbm5lY3Rpb25fcmVjZWl2ZSk6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmM6IChydHNwX3ZlcnNpb25fYXNfdGV4dCk6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmg6CisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmM6IChrZXlfdmFsdWVfZm9yZWFjaCksCisJICAocnRzcF9tZXNzYWdlX2luaXRfcmVxdWVzdCksIChydHNwX21lc3NhZ2VfaW5pdF9yZXNwb25zZSksCisJICAocnRzcF9tZXNzYWdlX3JlbW92ZV9oZWFkZXIpLCAocnRzcF9tZXNzYWdlX2FwcGVuZF9oZWFkZXJzKSwKKwkgIChydHNwX21lc3NhZ2VfZHVtcCk6CisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmg6CisJICBJbXByb3ZlcyB2ZXJzaW9uIGNoZWNraW5nLCBhbGxvd2luZyBhbiBSVFNQIHNlcnZlciB0byByZXBseSB3aXRoICI1MDUKKwkgIFJUU1AgVmVyc2lvbiBub3Qgc3VwcG9ydGVkLgorCSAgQWRkcyBhIERhdGUgaGVhZGVyIHRvIGFsbCBtZXNzYWdlcy4KKwkgIFJlcGxpZXMgd2l0aCBSVFNQX0VQQVJTRSByYXRoZXIgdGhhbiBSVFNQX0VJTlZBTElEIGluIGNhc2VzIHdoZXJlIHdlCisJICB3YW50IHRvIGJlIGFibGUgdG8gc2VuZCBhIHJlc3BvbnNlIGV2ZW4gaWYgc29tZXRoaW5nIGluIHRoZSByZXF1ZXN0IHdhcworCSAgaW52YWxpZC4gRUlOVkFMIGlzIG9ubHkgdXNlZCB3aGVuIHBhc3Npbmcgd3JvbmcgYXJndW1lbnRzIHRvIGZ1bmN0aW9ucy4KKwkgIERvIG5vdCBoYW5kbGUgYW4gaW52YWxpZCBtZXRob2QgaW4gcGFyc2VfcmVxdWVzdF9saW5lKCkuIERlZmVyIHRoaXMgdG8KKwkgIHRoZSBjYWxsZXIgc28gaXQgY2FuIHJlc3BvbmQgd2l0aCAiNDA1IE1ldGhvZCBOb3QgQWxsb3dlZCIuCisJICBJbXByb3ZlcyBwYXJzaW5nIG9mIHRoZSB0aW1lb3V0IHBhcmFtZXRlciB0byB0aGUgU2Vzc2lvbiBoZWFkZXIsCisJICBhbGxvd2luZyB3aGl0ZXNwYWNlIGFmdGVyIHRoZSBzZW1pY29sb24uCisJICBBdm9pZHMgYSBjb21waWxlciB3YXJuaW5nIGR1ZSB0byB2YXJpYWJsZXMgc2hhZG93aW5nIGEgZnVuY3Rpb24gYXJndW1lbnQuCisKKzIwMDctMDYtMDEgMTE6MTY6MTcgKzAwMDAgIERhbmllbCBDaGFybGVzIDxkY2hhcmxlc0B0aS5jb20+CisKKwkgIGdzdC9ydHAvOiBBZGQgc3VwcG9ydCBmb3IgQU1SLVdCLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBCYXNlZCBvbiBQYXRjaCBieTogRGFuaWVsIENoYXJsZXMgPGRjaGFybGVzIGF0IHRpIGRvdCBjb20+CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzogKGdzdF9ydHBfYW1yX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfYW1yX2RlcGF5X3Byb2Nlc3MpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6IChnc3RfcnRwX2Ftcl9wYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX2Ftcl9wYXlfY2xhc3NfaW5pdCksIChnc3RfcnRwX2Ftcl9wYXlfaW5pdCksCisJICAoZ3N0X3J0cF9hbXJfcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9hbXJfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIEFNUi1XQi4KKwkgIFNtYWxsIGNsZWFudXBzIHN1Y2ggYXMgdXNpbmcgQk9JTEVSUExBVEUuCisKKzIwMDctMDUtMzEgMTU6NTc6MDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL3J0c3BleHR3bXMuYzogRml4IGNvbXBpbGUgd2FybmluZyB3aGVuIGRlYnVnIGlzIGRpc2FibGVkIGFzIHNwb3R0ZWQgYnUgU2F1ciBvbiBJUkMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvcnRzcGV4dHdtcy5jOiAocnRzcF9leHRfd21zX2NvbmZpZ3VyZV9zdHJlYW0pOgorCSAgRml4IGNvbXBpbGUgd2FybmluZyB3aGVuIGRlYnVnIGlzIGRpc2FibGVkIGFzIHNwb3R0ZWQgYnUgU2F1ciBvbiBJUkMuCisKKzIwMDctMDUtMzAgMTQ6NTc6NDQgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC4qOiBSZXZlcnQgc29tZSB1bmludGVuZGVkIGNoYW5nZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDctMDUtMzAgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jIChnc3RfdjRsMl9vYmplY3RfbmV3KTogUmV2ZXJ0IHNvbWUKKwkgIHVuaW50ZW5kZWQgY2hhbmdlcy4KKworMjAwNy0wNS0zMCAxNDo0MDo1MyArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLio6IFN0b3JlIHRoZSBmb3JtYXQgbGlzdCBpbiB0aGUgb3JkZXIgdGhhdCB0aGUgZHJpdmVyIGdpdmVzIGl0IHRvIHVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA3LTA1LTMwICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmg6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYyAoZ3N0X3Y0bDJzcmNfZmlsbF9mb3JtYXRfbGlzdCk6IFN0b3JlCisJICB0aGUgZm9ybWF0IGxpc3QgaW4gdGhlIG9yZGVyIHRoYXQgdGhlIGRyaXZlciBnaXZlcyBpdCB0byB1cy4KKwkgIChnc3RfdjRsMnNyY19wcm9iZV9jYXBzX2Zvcl9mb3JtYXRfYW5kX3NpemUpCisJICAoZ3N0X3Y0bDJzcmNfcHJvYmVfY2Fwc19mb3JfZm9ybWF0KTogTmV3IGZ1bmN0aW9ucywgZmlsbCBHc3RDYXBzCisJICBiYXNlZCBvbiB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBkZXZpY2UuCisJICAoZ3N0X3Y0bDJzcmNfZ3JhYl9mcmFtZSk6IFVwZGF0ZSBmb3Igb2JqZWN0IHZhcmlhYmxlIHJlbmFtaW5nLgorCSAgKGdzdF92NGwyc3JjX3NldF9jYXB0dXJlKTogVXBkYXRlIHRvIGJlIHN0cmljdCBpbiBpdHMgcGFyYW1ldGVycywKKwkgIGFzIGluIHRoZSBzZXRfY2FwcyBiZWxvdy4KKwkgIChnc3RfdjRsMnNyY19jYXB0dXJlX2luaXQpOiBVcGRhdGUgZm9yIG9iamVjdCB2YXJpYWJsZSByZW5hbWluZywKKwkgIGFuZCByZWZsb3cuCisJICAoZ3N0X3Y0bDJzcmNfY2FwdHVyZV9zdGFydCwgZ3N0X3Y0bDJzcmNfY2FwdHVyZV9zdG9wKQorCSAgKGdzdF92NGwyc3JjX2NhcHR1cmVfZGVpbml0KTogVXBkYXRlIGZvciBvYmplY3QgdmFyaWFibGUgcmVuYW1pbmcuCisJICAoZ3N0X3Y0bDJzcmNfdXBkYXRlX2ZwcywgZ3N0X3Y0bDJzcmNfc2V0X2ZwcykKKwkgIChnc3RfdjRsMnNyY19nZXRfZnBzKTogUmVtb3ZlOyB0aGVzZSBmdW5jdGlvbnMgZG9uJ3QgaGF2ZSBtdWNoCisJICBtZWFuaW5nIG91dHNpZGUgb2YgYW4gYXRvbWljIHNldF9jYXBzIG1ldGhvZC4KKwkgIChnc3RfdjRsMnNyY19idWZmZXJfbmV3KTogRG9uJ3Qgc2V0IGJ1ZmZlciBkdXJhdGlvbiwgaXQgaXMgbm90CisJICBrbm93bi4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmMgKGdzdF92NGwyX3R1bmVyX3NldF9jaGFubmVsKTogUmVtb3ZlCisJICBjYWxsIHRvIHVwZGF0ZV9mcHM7IG5vdCBzdXJlIGFib3V0IHRoaXMgY2hhbmdlLgorCSAgKGdzdF92NGwyX3R1bmVyX3NldF9ub3JtKTogV29yayBhcm91bmQgdGhlIGZhY3QgdGhhdCBmb3IgdGhlCisJICBtb21lbnQgd2UgZG9uJ3QgaGF2ZSBhbiB1cGRhdGVfZnBzX2Z1bmMuCisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuaCAoc3RydWN0IF9Hc3RWNGwyU3JjKTogRG9uJ3QgcHV0IHY0bDIKKwkgIHN0cnVjdHVyZXMgaW4gdGhlIG9iamVjdCwganVzdCBzdG9yZSB3aGF0IHdlIG5lZWQuIERvIHN0b3JlIHRoZQorCSAgcHJvYmVkIGNhcHMgb2YgdGhlIGRldmljZS4gRG9uJ3Qgc3RvcmUgdGhlIGN1cnJlbnQgZnJhbWUgcmF0ZS4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jIChnc3RfdjRsMnNyY19pbml0KTogUmVtb3ZlIHRoZQorCSAgdXBkYXRlX2Zwc19mdW5jdGlvbiwgZm9yIG5vdy4gVXBkYXRlIGZvciBuZXcgb2JqZWN0IHZhcmlhYmxlCisJICBuYW1pbmcuCisJICAoZ3N0X3Y0bDJzcmNfc2V0X3Byb3BlcnR5LCBnc3RfdjRsMnNyY19nZXRfcHJvcGVydHkpOiBVcGRhdGUgZm9yCisJICBuZXcgb2JqZWN0IHZhcmlhYmxlIG5hbWluZy4KKwkgIChnc3RfdjRsMnNyY192NGwyZm91cmNjX3RvX3N0cnVjdHVyZSk6IFJlbmFtZSBmcm9tIC4uLl90b19jYXBzLgorCSAgKGdzdF92NGwyX3N0cnVjdHVyZV90b192NGwyZm91cmNjKTogUmVuYW1lIGZyb20gLi4uY2Fwc190b18uLi4uCisJICAoZ3N0X3Y0bDJzcmNfZ2V0X2NhcHMpOiBSZXdvcmsgdG8gcHJvYmUgdGhlIGRldmljZSBmb3Igc3VwcG9ydGVkCisJICBmcmFtZSBzaXplcyBhbmQgZnJhbWUgcmF0ZXMuCisJICAoZ3N0X3Y0bDJzcmNfc2V0X2NhcHMpOiBSZXdvcmsgdG8gYmUgc3RyaWN0IGluIHRoZSBnaXZlbgorCSAgcGFyYW1ldGVyczogaWYgc29tZW9uZSBhc2tzIHVzIHRvIGhhdmUgYSBjZXJ0YWluIHNpemUgYW5kIHJhdGUsCisJICB0aGF0IGlzIHdoYXQgd2UgY29uZmlndXJlLgorCSAgKGdzdF92NGwyc3JjX2dldF9yZWFkKTogVXBkYXRlIGZvciBvYmplY3QgdmFyaWFibGUgbmFtaW5nLiBEb24ndAorCSAgbGVhayBidWZmZXJzIG9uIHNob3J0IHJlYWRzLgorCSAgKGdzdF92NGwyc3JjX2dldF9tbWFwKTogVXBkYXRlIGZvciBvYmplY3QgdmFyaWFibGUgbmFtaW5nLCBhbmQgYWRkCisJICBjb21tZW50cy4KKwkgIChnc3RfdjRsMnNyY19jcmVhdGUpOiBVcGRhdGUgZm9yIG9iamVjdCB2YXJpYWJsZSBuYW1pbmcuCisKKzIwMDctMDUtMzAgMTQ6Mzg6NTkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguKjogUGFyc2Ugc3VidGl0bGUgdGV4dCBzdHJlYW1zIGluc3RlYWQgb2YgZXJyb3Jpbmcgb3V0ICgjNDQyMDM0KS4gU3RpbGwgbmVlZHMgYSBwYXJzZXIgZm9yIHRoZSBzdS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfYmFzZV9pbml0KSwKKwkgIChnc3RfYXZpX2RlbXV4X3Jlc2V0KSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgUGFyc2Ugc3VidGl0bGUgdGV4dCBzdHJlYW1zIGluc3RlYWQgb2YgZXJyb3Jpbmcgb3V0ICgjNDQyMDM0KS4gU3RpbGwKKwkgIG5lZWRzIGEgcGFyc2VyIGZvciB0aGUgc3VidGl0bGVzIHRvIGFjdHVhbGx5IHNob3cgdXAuCisKKzIwMDctMDUtMzAgMTI6NDY6MzIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogTWFrZSBfcHVzaF9ldmVudCgpIHJldHVybiBUUlVFIGlmIHRoZSBldmVudCBjb3VsZCBiZSBwdXNoZWQgb24gYXQgbGVhc3Qgb25lIHBhZCBhbmQgbm90IG9ubHkgaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcHVzaF9ldmVudCksCisJICAoZ3N0X2F2aV9kZW11eF9sb29wKToKKwkgIE1ha2UgX3B1c2hfZXZlbnQoKSByZXR1cm4gVFJVRSBpZiB0aGUgZXZlbnQgY291bGQgYmUgcHVzaGVkIG9uIGF0CisJICBsZWFzdCBvbmUgcGFkIGFuZCBub3Qgb25seSBpZiBpdCBjb3VsZCBiZSBwdXNoZWQgb24gYWxsIHBhZHMsCisJICBvdGhlcndpc2Ugd2UnbGwgZW5kIHVwIHBvc3RpbmcgYW4gZXJyb3IgbWVzc2FnZSBvbiBFT1MgaWYgb25lIG9yCisJICBtb3JlIHNvdXJjZSBwYWRzIGFyZSBub3QgY29ubmVjdGVkLgorCisyMDA3LTA1LTI4IDE2OjM5OjA5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0LmM6IFVzZSByZW5hbWVkIFJUUCBiaW4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvcnRzcHRyYW5zcG9ydC5jOgorCSAgVXNlIHJlbmFtZWQgUlRQIGJpbi4KKworMjAwNy0wNS0yOCAxNTowMTozMyArMDAwMCAgRGVqYW4gU2FrZWzFoWFrIDxzYWtkZWFuQGdtYWlsLmNvbT4KKworCSAgZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IEFkZCBBWVVWLT5BWVVWIGFuZCBBWVVWLT5JNDIwIGZvcm1hdHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5OiBEZWphbiBTYWtlbMWhYWsgPHNha2RlYW4gYXQgZ21haWwgZG90IGNvbT4KKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2NsYXNzX2luaXQpLAorCSAgKGdzdF92aWRlb19ib3hfc2V0X3Byb3BlcnR5KSwgKGdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2NhcHMpLAorCSAgKHZpZGVvX2JveF9yZWNhbGNfdHJhbnNmb3JtKSwgKGdzdF92aWRlb19ib3hfc2V0X2NhcHMpLAorCSAgKGdzdF92aWRlb19ib3hfZ2V0X3VuaXRfc2l6ZSksIChnc3RfdmlkZW9fYm94X2FwcGx5X2FscGhhKSwKKwkgIChnc3RfdmlkZW9fYm94X2F5dXZfYXl1diksIChnc3RfdmlkZW9fYm94X2NsZWFyKSwgKFVWZmxvb3IpLAorCSAgKFVWY2VpbCksIChnc3RfdmlkZW9fYm94X2F5dXZfaTQyMCksIChnc3RfdmlkZW9fYm94X2k0MjBfYXl1diksCisJICAoZ3N0X3ZpZGVvX2JveF9pNDIwX2k0MjApLCAoZ3N0X3ZpZGVvX2JveF90cmFuc2Zvcm0pLAorCSAgKHBsdWdpbl9pbml0KToKKwkgIEFkZCBBWVVWLT5BWVVWIGFuZCBBWVVWLT5JNDIwIGZvcm1hdHMuCisJICBGaXggbmVnb3RpYXRpb24gYW5kIEk0MjAtPkFZVVYgY29udmVyc2lvbi4KKwkgIEZpeGVzICM0MjkzMjkuCisKKzIwMDctMDUtMjYgMTU6MjU6MTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiBVc2UgZGlmZmVyZW50IHZhcmlhYmxlcyBmb3IgbmVzdGVkIGZvciBsb29wcyBzbyB0aGF0IHRoZSBvdXRlciBsb29wIGZ1bmN0aW9ucyBwcm9wZXJseSBhbmQgcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiAoc3BlZXhfZGVjX2NoYWluX3BhcnNlX2RhdGEpOgorCSAgVXNlIGRpZmZlcmVudCB2YXJpYWJsZXMgZm9yIG5lc3RlZCBmb3IgbG9vcHMgc28gdGhhdCB0aGUgb3V0ZXIgbG9vcAorCSAgZnVuY3Rpb25zIHByb3Blcmx5IGFuZCBzcGVleCBmaWxlcyB3aXRoIG11bHRpcGxlIGZyYW1lcyBwZXIgYnVmZmVyIHdvcmsKKwkgIHByb3Blcmx5LgorCSAgRml4ZXMgIzQ0MTQwOC4KKworMjAwNy0wNS0yNSAyMDo1MTozNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IERvbid0IGxlYWsgbmV3c2VnbWVudCBldmVudHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfc2lua19ldmVudCk6CisJICBEb24ndCBsZWFrIG5ld3NlZ21lbnQgZXZlbnRzLgorCisyMDA3LTA1LTI1IDIwOjMzOjEwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvTWFrZWZpbGUuYW06IEFkZCAnLWxtJyB0byBMSUJTIGZvciBjZWlsKCksIGRvbid0IGFzc3VtZSBvbmUgb2Ygb3VyIGRlcGVuZGVuY2llcyBkcmFncyBpdCBpbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvTWFrZWZpbGUuYW06CisJICBBZGQgJy1sbScgdG8gTElCUyBmb3IgY2VpbCgpLCBkb24ndCBhc3N1bWUgb25lIG9mIG91ciBkZXBlbmRlbmNpZXMKKwkgIGRyYWdzIGl0IGluLgorCisyMDA3LTA1LTI1IDE2OjAyOjUxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZW5jLio6IENvbGxlY3QgaGVhZGVycywgYWRkICJzdHJlYW1oZWFkZXIiIGZpZWxkIHRvIG91dHB1dCBjYXBzIGFuZCBzZXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY19lbmNfaW5pdCksCisJICAobm90Z3N0X3ZhbHVlX2FycmF5X2FwcGVuZF9idWZmZXIpLAorCSAgKGdzdF9mbGFjX2VuY19wcm9jZXNzX3N0cmVhbV9oZWFkZXJzKSwKKwkgIChnc3RfZmxhY19lbmNfd3JpdGVfY2FsbGJhY2spLCAoZ3N0X2ZsYWNfZW5jX2NoYWluKSwKKwkgIChnc3RfZmxhY19lbmNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5oOgorCSAgQ29sbGVjdCBoZWFkZXJzLCBhZGQgInN0cmVhbWhlYWRlciIgZmllbGQgdG8gb3V0cHV0IGNhcHMgYW5kIHNldAorCSAgQlVGRkVSX0lOX0NBUFMgZmxhZyBvbiBwdXNoZWQgaGVhZGVyIGJ1ZmZlcnMuIFRoYXQgd2F5IG9nZ211eAorCSAgcHJvZHVjZXMgb3V0cHV0IGFjY29yZGluZyB0byB0aGUgb2ZmaWNpYWwgRkxBQy10by1PZ2cgbWFwcGluZworCSAgaW5zdGVhZCBvZiBjb21wbGV0ZWx5IGJyb2tlbiBmaWxlcy4gRml4ZXMgIzQyNjA0NC4KKworMjAwNy0wNS0yNSAxMDo0NDoxMiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC86IEhhbmRsZSBhbmQgYWRqdXN0IG5ldy1zZWdtZW50IGV2ZW50cyBzbyB0aGF0IGRvd25zdHJlYW0gcmVhbGx5IHNlZXMgYSBzdHJlYW0gd2l0aCB0aGUgdGFnIHBpZWNlcyBzdHJpcHBlZCBvZmYgdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoZ3N0X2lkM2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfaWQzZGVtdXhfc2VuZF9uZXdfc2VnbWVudCksIChnc3RfaWQzZGVtdXhfY2hhaW4pLAorCSAgKGdzdF9pZDNkZW11eF9zaW5rX2V2ZW50KToKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4Lmg6CisJICAqIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzogKGdzdF90YWdfZGVtdXhfcmVzZXQpLAorCSAgKGdzdF90YWdfZGVtdXhfY2hhaW4pLCAoZ3N0X3RhZ19kZW11eF9zaW5rX2V2ZW50KSwKKwkgIChnc3RfdGFnX2RlbXV4X3NlbmRfbmV3X3NlZ21lbnQpOgorCSAgSGFuZGxlIGFuZCBhZGp1c3QgbmV3LXNlZ21lbnQgZXZlbnRzIHNvIHRoYXQgZG93bnN0cmVhbSByZWFsbHkKKwkgIHNlZXMgYSBzdHJlYW0gd2l0aCB0aGUgdGFnIHBpZWNlcyBzdHJpcHBlZCBvZmYgdGhlIGZyb250IGFuZCBiYWNrLgorCSAgRml4ZXMgc3RyYW5nZW5lc3MgaW4gc2Vla2luZyB3aGVuIG1wMyBkZWNvZGVycyB1c2UgdGhlIG5ldy1zZWdtZW50CisJICBieXRlIHBvc2l0aW9uIHRvIGVzdGltYXRlIHRoZWlyIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gdGltZXN0YW1wCisJICBhbmQgdGhlbiB0aGUgYXJyaXZpbmcgYnVmZmVycyBkb24ndCBtYXRjaCB1cC4KKworMjAwNy0wNS0yNSAxMDoyMzo0OSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzogRG9uJ3QgdW5uZWNlc3NhcmlseSBwZXJmb3JtIGEgUkVBRFktPk5VTEwtPlJFQURZIHRyYW5zaXRpb24gb24gdGhlIGRldGVjdGVkIGF1ZGlvIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzogKGdzdF9hdXRvX2F1ZGlvX3NpbmtfZGV0ZWN0KToKKwkgIERvbid0IHVubmVjZXNzYXJpbHkgcGVyZm9ybSBhIFJFQURZLT5OVUxMLT5SRUFEWSB0cmFuc2l0aW9uIG9uIHRoZQorCSAgZGV0ZWN0ZWQgYXVkaW8gc2luayB3aGVuIHN0YXJ0aW5nIHVwLiBGaXhlczogIzQ0MDEyNworCisyMDA3LTA1LTI0IDE3OjAwOjIxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IERvbid0IGNyYXNoIGluIGNoYWluIGZ1bmN0aW9uIGlmIHNldGNhcHMgaGFzbid0IGJlZW4gY2FsbGVkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzogKGdzdF9mbGFjX2VuY19zaW5rX3NldGNhcHMpLAorCSAgKGdzdF9mbGFjX2VuY19jaGFpbik6CisJICBEb24ndCBjcmFzaCBpbiBjaGFpbiBmdW5jdGlvbiBpZiBzZXRjYXBzIGhhc24ndCBiZWVuIGNhbGxlZC4KKworMjAwNy0wNS0yNCAwODozNToyMyArMDAwMCAgVmluY2VudCBUb3JyaSA8dnRvcnJpQHVuaXYtZXZyeS5mcj4KKworCSAgc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuKjogRml4IG1vcmUgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCBNaW5nVyAoIzQzOTkxNCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBWaW5jZW50IFRvcnJpICA8dnRvcnJpIGF0IHVuaXYtZXZyeSBmcj4KKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkgIChnc3RfZGlyZWN0ZHJhd19zaW5rX2J1ZmZlcl9hbGxvYyksCisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua19zaG93X2ZyYW1lKSwKKwkgIChnc3RfZGlyZWN0ZHJhd19zaW5rX2NoZWNrX3ByaW1hcnlfc3VyZmFjZSksCisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua19jaGVja19vZmZzY3JlZW5fc3VyZmFjZSksCisJICAoRW51bU1vZGVzQ2FsbGJhY2syKSwgKGdzdF9kaXJlY3RkcmF3X3NpbmtfZ2V0X2RkcmF3Y2FwcyksCisJICAoZ3N0X2RpcmVjdGRyYXdfc2lua19zdXJmYWNlX2NyZWF0ZSk6CisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmg6CisJICBGaXggbW9yZSB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyB3aXRoIE1pbmdXICgjNDM5OTE0KS4KKworMjAwNy0wNS0yNCAwODoxNDowMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBJbml0IHZhbHVlIHRvIGF2b2lkIGluZmludGUgbG9vcHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfcGFyc2VfbWV0aG9kcyk6CisJICBJbml0IHZhbHVlIHRvIGF2b2lkIGluZmludGUgbG9vcHMuCisKKzIwMDctMDUtMjQgMDg6MTA6NDIgKzAwMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJICBnc3QvcnRzcC86IEZpeCBmb3IgbmV3IEFQSS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFBldGVyIEtqZWxsZXJzdGVkdCAgPHBraiBhdCBheGlzIGNvbT4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc2V0dXBfYXV0aCksCisJICAoZ3N0X3J0c3BzcmNfdHJ5X3NlbmQpLCAoZ3N0X3J0c3BzcmNfcGFyc2VfbWV0aG9kcyksCisJICAoZ3N0X3J0c3BzcmNfc2V0dXBfc3RyZWFtcyksIChnc3RfcnRzcHNyY19vcGVuKSwKKwkgIChnc3RfcnRzcHNyY19wbGF5KToKKwkgIChydHNwX2Nvbm5lY3Rpb25fc2VuZCksIChydHNwX2Nvbm5lY3Rpb25fcmVjZWl2ZSk6CisJICAqIGdzdC9ydHNwL3J0c3BleHR3bXMuYzogKHJ0c3BfZXh0X3dtc19hZnRlcl9zZW5kKToKKwkgIEZpeCBmb3IgbmV3IEFQSS4KKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKGFkZF9hdXRoX2hlYWRlciksCisJICBPbmx5IGFkZCBhdXRob3Jpc2F0aW9uIGFuZCBzZXNzaW9uIGhlYWRlcnMgd2hlbiBzZW5kaW5nIG1lc3NhZ2VzLgorCSAgKiBnc3QvcnRzcC9ydHNwbWVzc2FnZS5jOiAoa2V5X3ZhbHVlX2ZvcmVhY2gpLCAocnRzcF9tZXNzYWdlX2luaXQpLAorCSAgKHJ0c3BfbWVzc2FnZV9pbml0X3JlcXVlc3QpLCAocnRzcF9tZXNzYWdlX2luaXRfcmVzcG9uc2UpLAorCSAgKHJ0c3BfbWVzc2FnZV91bnNldCksIChydHNwX21lc3NhZ2VfYWRkX2hlYWRlciksCisJICAocnRzcF9tZXNzYWdlX3JlbW92ZV9oZWFkZXIpLCAocnRzcF9tZXNzYWdlX2dldF9oZWFkZXIpLAorCSAgKHJ0c3BfbWVzc2FnZV9hcHBlbmRfaGVhZGVycyksIChkdW1wX2tleV92YWx1ZSksCisJICAocnRzcF9tZXNzYWdlX2R1bXApOgorCSAgKiBnc3QvcnRzcC9ydHNwbWVzc2FnZS5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGhlYWRlcnMgb2YgdGhlIHNhbWUgdHlwZSBieSBzdG9yaW5nIHRoZSBwYXJzZWQKKwkgIGhlYWRlcnMgaW4gYSBHQXJyYXkgaW5zdGFlZCBvZiBhIGhhc2h0YWJsZS4KKworMjAwNy0wNS0yMyAyMjo0NDoxMiArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuYXJnczogUmVtb3ZlIGRpcmVjdHNvdW5kc2luayBwcm9wZXJ0eSBkb2MgYXMgdGhpcyBzaW5rIHVzZSB0aGUgbWl4ZXIgaW50ZXJmYWNlIG5vdy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuYXJnczoKKwkgIFJlbW92ZSBkaXJlY3Rzb3VuZHNpbmsgcHJvcGVydHkgZG9jIGFzIHRoaXMgc2luayB1c2UgdGhlIG1peGVyCisJICBpbnRlcmZhY2Ugbm93LgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaW50ZXJmYWNlczoKKwkgIEFkZCBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IFdpbmRvd3Mgc2lua3MuCisJICAqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgICogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oOgorCSAgUmVtb3ZlIGRpcmVjdHNvdW5kc2luayBwcm9wZXJ0eSAgYW5kIGltcGxlbWVudCB0aGUgbWl4ZXIgaW50ZXJmYWNlLgorCSAgKiB3aW4zMi92czYvZ3N0X3BsdWdpbnNfYmFkLmRzdzoKKwkgICogd2luMzIvdnM2L2xpYmdzdGRpcmVjdHNvdW5kLmRzcDoKKwkgIFVwZGF0ZSBwcm9qZWN0IGZpbGVzLgorCSAgKiBnc3QtbGlicy9nc3QvZHNob3cvZ3N0ZHNob3cuY3BwOgorCSAgKiBnc3QtbGlicy9nc3QvZHNob3cvZ3N0ZHNob3cuaDoKKwkgICogZ3N0LWxpYnMvZ3N0L2RzaG93L2dzdGRzaG93ZmFrZXNpbmsuY3BwOgorCSAgKiBnc3QtbGlicy9nc3QvZHNob3cvZ3N0ZHNob3dmYWtlc2luay5oOgorCSAgKiBnc3QtbGlicy9nc3QvZHNob3cvZ3N0ZHNob3dmYWtlc3JjLmNwcDoKKwkgICogZ3N0LWxpYnMvZ3N0L2RzaG93L2dzdGRzaG93ZmFrZXNyYy5oOgorCSAgKiBnc3QtbGlicy9nc3QvZHNob3cvZ3N0ZHNob3dpbnRlcmZhY2UuY3BwOgorCSAgKiBnc3QtbGlicy9nc3QvZHNob3cvZ3N0ZHNob3dpbnRlcmZhY2UuaDoKKwkgICogd2luMzIvY29tbW9uL2xpYmdzdGRzaG93LmRlZjoKKwkgICogd2luMzIvdnM2L2xpYmdzdGRzaG93LmRzcDoKKwkgIEFkZCBhIG5ldyBnc3QgbGlicmFyeSB3aGljaCBhbGxvdyB0byBjcmVhdGUgaW50ZXJuYWwgRGlyZWN0IFNob3cKKwkgIGdyYXBoIChwaXBlbGluZXMpIHRvIHdyYXAgV2luZG93cyBzb3VyY2VzLCBkZWNvZGVycyBvciBlbmNvZGVycy4KKwkgIEl0IGluY2x1ZGVzIGEgRGlyZWN0U2hvdyBmYWtlIHNvdXJjZSBhbmQgc2luayBhbmQgdXRpbGl0eSBmdW5jdGlvbnMuCisJICAqIHN5cy9kc2hvd3NyY3dyYXBwZXIvZ3N0ZHNob3dhdWRpb3NyYy5jOgorCSAgKiBzeXMvZHNob3dzcmN3cmFwcGVyL2dzdGRzaG93YXVkaW9zcmMuaDoKKwkgICogc3lzL2RzaG93c3Jjd3JhcHBlci9nc3Rkc2hvd3NyY3dyYXBwZXIuYzoKKwkgICogc3lzL2RzaG93c3Jjd3JhcHBlci9nc3Rkc2hvd3NyY3dyYXBwZXIuaDoKKwkgICogc3lzL2RzaG93c3Jjd3JhcHBlci9nc3Rkc2hvd3ZpZGVvc3JjLmM6CisJICAqIHN5cy9kc2hvd3NyY3dyYXBwZXIvZ3N0ZHNob3d2aWRlb3NyYy5oOgorCSAgKiB3aW4zMi92czYvbGliZHNob3dzcmN3cmFwcGVyLmRzcDoKKwkgIEFkZCBhIG5ldyBwbHVnaW4gdG8gd3JhcCBEaXJlY3RTaG93IHNvdXJjZXMgb24gV2luZG93cy4KKwkgIEl0IGdldHMgZGF0YSBmcm9tIGFueSB3ZWJjYW0sIGR2IGNhbSwgbWljcm8uIFdlIGNvdWxkIGFkZAorCSAgdHYgdHVubmVyIGNhcmQgbGF0ZXIuCisKKzIwMDctMDUtMjIgMTE6MTQ6MTMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBEZXBlbmQgb24gZ3N0cmVhbWVyLTAuMTAuMTIuMS4gZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYyAoQVJHX0JBTkRfV0lEVEgsIF9kb19pbml0LCBBUkdfR0FJTiwgX0dzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgRGVwZW5kIG9uIGdzdHJlYW1lci0wLjEwLjEyLjEuCisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmMgKEFSR19CQU5EX1dJRFRILCBfZG9faW5pdCwgQVJHX0dBSU4sCisJICBfR3N0SWlyRXF1YWxpemVyQmFuZCwgb2JqZWN0LCBfR3N0SWlyRXF1YWxpemVyQmFuZENsYXNzLAorCSAgcGFyZW50X2NsYXNzLCBnc3RfaWlyX2VxdWFsaXplcl9iYW5kX3NldF9wcm9wZXJ0eSwKKwkgIGdzdF9paXJfZXF1YWxpemVyX2JhbmRfY2xhc3NfaW5pdCwgZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9nZXRfdHlwZSwKKwkgIGdzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2dldF9jaGlsZF9ieV9pbmRleCwKKwkgIGdzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2dldF9jaGlsZHJlbl9jb3VudCwKKwkgIGdzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2ludGVyZmFjZV9pbml0LCBzZXR1cF9maWx0ZXIsCisJICBnc3RfaWlyX2VxdWFsaXplcl9jb21wdXRlX2ZyZXF1ZW5jaWVzLAorCSAgZ3N0X2lpcl9lcXVhbGl6ZXJfc2V0X3Byb3BlcnR5LCBnc3RfaWlyX2VxdWFsaXplcl9nZXRfcHJvcGVydHksCisJICBwbHVnaW5faW5pdCk6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmggKGF1ZGlvZmlsdGVyKToKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuYyAoQVJHX05VTV9CQU5EUywKKwkgIGdzdF9paXJfZXF1YWxpemVyX25iYW5kc19iYXNlX2luaXQsIGdzdF9paXJfZXF1YWxpemVyX25iYW5kc19pbml0LAorCSAgZ3N0X2lpcl9lcXVhbGl6ZXJfbmJhbmRzX3NldF9wcm9wZXJ0eSk6CisJICBVc2UgbmV3IGxvY2tpbmcgbWFjcm9zLgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYyAoYnB3c2luY19zZXRfY2Fwcyk6CisJICBBZGQgZml4bWUuCisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jIChTUEVDVFJVTV9XSU5ET1dfQkFTRSwKKwkgIFNQRUNUUlVNX1dJTkRPV19MRU4sIGdzdF9zcGVjdHJ1bV9pbml0LCBnc3Rfc3BlY3RydW1fc2V0X3Byb3BlcnR5LAorCSAgZ3N0X3NwZWN0cnVtX2V2ZW50LCBnc3Rfc3BlY3RydW1fdHJhbnNmb3JtX2lwKToKKwkgIFVzZSBuZXcgbG9ja2luZyBtYWNyb3MuIFR1cm4gdHdvIGZpeGVkIHZhbHVlcyBpbnRvICNkZWZpbmVzLgorCisyMDA3LTA1LTIyIDExOjAzOjMwICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06IEFsc28gbG9vayBmb3IgLm0gKG9iamVjdGl2ZWMpIGZpbGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgIEFsc28gbG9vayBmb3IgLm0gKG9iamVjdGl2ZWMpIGZpbGVzLgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuYXJnczoKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgQWRkIGRvY3VtZW50YXRpb24gZm9yIGVsZW1lbnQgYW5kIHByb3BlcnRpZXMuCisKKzIwMDctMDUtMjEgMTQ6MDE6MTYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgQ2hhbmdlTG9nOiBDaGFuZ2VMb2cgc3VyZ2VyeS4gZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYyAoQVJHX0JBTkRfV0lEVEgsIF9kb19pbml0LCBBUkdfR0FJTiwgX0dzdElpckVxdWFsaXplckJhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogQ2hhbmdlTG9nOgorCSAgQ2hhbmdlTG9nIHN1cmdlcnkuCisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmMgKEFSR19CQU5EX1dJRFRILCBfZG9faW5pdCwgQVJHX0dBSU4sCisJICBfR3N0SWlyRXF1YWxpemVyQmFuZCwgb2JqZWN0LCBfR3N0SWlyRXF1YWxpemVyQmFuZENsYXNzLAorCSAgcGFyZW50X2NsYXNzLCBnc3RfaWlyX2VxdWFsaXplcl9iYW5kX3NldF9wcm9wZXJ0eSwKKwkgIGdzdF9paXJfZXF1YWxpemVyX2JhbmRfY2xhc3NfaW5pdCwgZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9nZXRfdHlwZSwKKwkgIGdzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2dldF9jaGlsZF9ieV9pbmRleCwKKwkgIGdzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2dldF9jaGlsZHJlbl9jb3VudCwKKwkgIGdzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2ludGVyZmFjZV9pbml0LCBzZXR1cF9maWx0ZXIsCisJICBnc3RfaWlyX2VxdWFsaXplcl9jb21wdXRlX2ZyZXF1ZW5jaWVzLCBwbHVnaW5faW5pdCk6CisJICAqIHRlc3RzL2ljbGVzL2VxdWFsaXplci10ZXN0LmM6CisJICBBZGQgZml4bWUgYW5kIGNvbW1lbnQgZm9yIGV4YW1wbGUuCisKKzIwMDctMDUtMjEgMTI6NDM6MzcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJICBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYyAoZ3N0X3NwZWN0cnVtX3NldF9wcm9wZXJ0eSwgZ3N0X3NwZWN0cnVtX2V2ZW50LCBnc3Rfc3BlY3RydW1fdHJhbnNmb3JtX2lwKToKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYyAoZ3N0X3NwZWN0cnVtX3NldF9wcm9wZXJ0eSwKKwkgIGdzdF9zcGVjdHJ1bV9ldmVudCwgZ3N0X3NwZWN0cnVtX3RyYW5zZm9ybV9pcCk6CisJICBVc2UgbG9jayB0byBwcm90ZWN0IGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisKKzIwMDctMDUtMjEgMTE6Mzc6MTYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOiBTcGVjaWZ5IGFuZCB1c2UgcHJvcGVydGllcyBhcyB1bnNpZ25lZCBpbnQgdGhhdCBhcmUgYW4gdW5zaWduZWQgaW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogKGdzdF93YXZwYWNrX2VuY19jbGFzc19pbml0KSwKKwkgIChnc3Rfd2F2cGFja19lbmNfc2V0X3Byb3BlcnR5KSwgKGdzdF93YXZwYWNrX2VuY19nZXRfcHJvcGVydHkpOgorCSAgU3BlY2lmeSBhbmQgdXNlIHByb3BlcnRpZXMgYXMgdW5zaWduZWQgaW50IHRoYXQgYXJlIGFuIHVuc2lnbmVkIGludC4KKworMjAwNy0wNS0yMSAxMToxNzoyMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLio6IEZpeHVwIGRvY3MsIG1ha2UgdGhlIGJpdHJhdGUgcHJvcGVydHkgYW4gaW50IGFzIGl0IHNob3VsZCBiZSBhbmQgYWxsb3cgdG8gc2V0IHRoZSBkaWZmZXIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2luaXQpLCAoZ3N0X3dhdnBhY2tfZW5jX3NldF93cF9jb25maWcpLAorCSAgKGdzdF93YXZwYWNrX2VuY19zZXRfcHJvcGVydHkpLCAoZ3N0X3dhdnBhY2tfZW5jX2dldF9wcm9wZXJ0eSk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaDoKKwkgIEZpeHVwIGRvY3MsIG1ha2UgdGhlIGJpdHJhdGUgcHJvcGVydHkgYW4gaW50IGFzIGl0IHNob3VsZCBiZSBhbmQKKwkgIGFsbG93IHRvIHNldCB0aGUgZGlmZmVyZW50IGV4dHJhIHByb2Nlc3NpbmcgbW9kZXMgaW5zdGVhZCBvZiBvbmx5CisJICBhbGxvd2luZyBub25lIGFuZCB0aGUgZGVmYXVsdCBvbmUuCisKKzIwMDctMDUtMjEgMTA6MDc6MDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IFNpbmNlIHdlIGRlcGVuZCBvbiAwLjEwLjEzIC1jb3JlLCBvdmVycmlkZSB0aGUgdW5sb2NrX3N0b3Agdm1ldGhvZCBmb3Igc2FmZXIgc2h1dGRvd24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3VkcHNyY19jcmVhdGUpLCAoZ3N0X3VkcHNyY191bmxvY2spLCAoZ3N0X3VkcHNyY191bmxvY2tfc3RvcCk6CisJICBTaW5jZSB3ZSBkZXBlbmQgb24gMC4xMC4xMyAtY29yZSwgb3ZlcnJpZGUgdGhlIHVubG9ja19zdG9wIHZtZXRob2QgZm9yCisJICBzYWZlciBzaHV0ZG93bi4KKworMjAwNy0wNS0yMSAxMDowMzo0MiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRwZGVjLio6IEFkZGVkIHNpZ25hbCBmb3IgYmFja3dhcmRzIGNvbXBhdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuYzogKGdzdF9ydHBfZGVjX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuaDoKKwkgIEFkZGVkIHNpZ25hbCBmb3IgYmFja3dhcmRzIGNvbXBhdC4KKworMjAwNy0wNS0yMSAwOTozMjoyNiArMDAwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSAgVXNlIGF1ZGlvY29udmVydCBmb3IgY29udmVydGluZyBmcm9tIG5vbi1uYXRpdmUgZW5kaWFubmVzcyBmbG9hdHMgaW4gYXVwYXJzZSBpbnN0ZWFkIG9mIGRvaW5nIGl0IG91cnNlbGYuIEZpeGVzICM0MjQ1MjcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBSZW7DqSBTdGFkbGVyIDxtYWlsIGF0IHJlbmVzdGFkbGVyIGRvdCBkZT4KKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6IChnc3RfYXVfcGFyc2VfcmVzZXQpLAorCSAgKGdzdF9hdV9wYXJzZV9wYXJzZV9oZWFkZXIpLCAoZ3N0X2F1X3BhcnNlX2NoYWluKToKKwkgICogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5oOgorCSAgVXNlIGF1ZGlvY29udmVydCBmb3IgY29udmVydGluZyBmcm9tIG5vbi1uYXRpdmUgZW5kaWFubmVzcyBmbG9hdHMKKwkgIGluIGF1cGFyc2UgaW5zdGVhZCBvZiBkb2luZyBpdCBvdXJzZWxmLiBGaXhlcyAjNDI0NTI3LgorCSAgVGhpcyBuZWVkcyB0aGUgYXVkaW9jb252ZXJ0IGZyb20gcGx1Z2lucy1iYXNlIENWUy4KKworMjAwNy0wNS0yMSAwOToyOTozMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOiBGaXggZW51bSByZWdpc3RyYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOiAoZ3N0X2ZyYWdtZW50YXRpb25fbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X3J0cF9oMjYzcF9wYXlfZmx1c2gpOgorCSAgRml4IGVudW0gcmVnaXN0cmF0aW9uLgorCisyMDA3LTA1LTIxIDA4OjU3OjE4ICswMDAwICBBbnRvaW5lIFRyZW1ibGF5IDxoZXhhMDBAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5Lio6IEFkZCBuZXcgZnJhZ21lbnRhdGlvbiBtb2RlIGJhc2Ugb24gR09CIGhlYWRlcnMuIEZpeGVzICM0Mzg5NDAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBBbnRvaW5lIFRyZW1ibGF5IDxoZXhhMDAgYXQgZ21haWwgZG90IGNvbT4KKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOiAoZ3N0X2ZyYWdtZW50YXRpb25fbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X3J0cF9oMjYzcF9wYXlfY2xhc3NfaW5pdCksIChnc3RfcnRwX2gyNjNwX3BheV9pbml0KSwKKwkgIChnc3RfcnRwX2gyNjNwX3BheV9zZXRfcHJvcGVydHkpLCAoZ3N0X3J0cF9oMjYzcF9wYXlfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2gyNjNwX3BheV9mbHVzaCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuaDoKKwkgIEFkZCBuZXcgZnJhZ21lbnRhdGlvbiBtb2RlIGJhc2Ugb24gR09CIGhlYWRlcnMuIEZpeGVzICM0Mzg5NDAuCisKKzIwMDctMDUtMjAgMjE6MzE6NTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOiBBZGQgbWlzc2luZyBhdWRpb2NvbnZlcnRzIGluIHRoZSBleGFtcGxlIHBpcGVsaW5lcyBvZiB3YXZwYWNrZW5jLiBBcyB0aGUgd2F2cGFjayBzdHVmZiBuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOgorCSAgQWRkIG1pc3NpbmcgYXVkaW9jb252ZXJ0cyBpbiB0aGUgZXhhbXBsZSBwaXBlbGluZXMgb2Ygd2F2cGFja2VuYy4gQXMKKwkgIHRoZSB3YXZwYWNrIHN0dWZmIG5vdyBuZWVkcyBpbnB1dCB3aXRoIDMyIGJpdCB3aWR0aCAoYW5kIHJhbmRvbSBkZXB0aCkKKwkgIHRoaXMgaXMgbmVlZGVkIG5vdy4gVGhlIGV4YW1wbGUgcGlwZWxpbmVzIGZvciB0aGUgcGFyc2VyIGFuZCBkZWNvZGVyCisJICBhcmUgc3RpbGwgZmluZS4KKworMjAwNy0wNS0yMCAxNDo1OTo0NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzogQnVuY2ggb2Ygc21hbGwgZml4ZXM6IHJlbW92ZSBzdGF0aWMgZnVuY3Rpb24gdGhhdCBkb2Vzbid0IGV4aXN0OyBkZWNsYXJlIGFub3RoZXIgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzogKGdzdF9kZHJhd3N1cmZhY2VfZmluYWxpemUpLAorCSAgKGdzdF9kaXJlY3RkcmF3X3NpbmtfYnVmZmVyX2FsbG9jKSwKKwkgIChnc3RfZGlyZWN0ZHJhd19zaW5rX2dldF9kZHJhd2NhcHMpLAorCSAgKGdzdF9kaXJlY3RkcmF3X3Npbmtfc3VyZmFjZV9jcmVhdGUpOgorCSAgQnVuY2ggb2Ygc21hbGwgZml4ZXM6IHJlbW92ZSBzdGF0aWMgZnVuY3Rpb24gdGhhdCBkb2Vzbid0IGV4aXN0OworCSAgZGVjbGFyZSBhbm90aGVyIG9uZSB0aGF0IGRvZXM7IHByaW50ZiBmb3JtYXQgZml4OyB1c2UgcmlnaHQgbWFjcm8KKwkgIHdoZW4gc3BlY2lmeWluZyBkZWJ1ZyBjYXRlZ29yeTsgcmVtb3ZlIGEgYnVuY2ggb2YgdW51c2VkIHZhcmlhYmxlczsKKwkgICNpZiAwIG91dCBhbiB1bnVzZWQgY2h1bmsgb2YgY29kZSAocGFydGlhbGx5IGZpeGVzICM0Mzk5MTQpLgorCisyMDA3LTA1LTIwIDE0OjE0OjQ5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvOiBQcmludGYgZm9ybWF0IGZpeGVzICgjNDM5OTEwLCAjNDM5OTExKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9wcmVwYXJlX2N1cnJlbnRfc2FtcGxlKToKKwkgICogZ3N0L3N3aXRjaC9nc3Rzd2l0Y2guYzogKGdzdF9zd2l0Y2hfY2hhaW4pOgorCSAgUHJpbnRmIGZvcm1hdCBmaXhlcyAoIzQzOTkxMCwgIzQzOTkxMSkuCisKKzIwMDctMDUtMjAgMTQ6MDU6NDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogUHJpbnRmIGZvcm1hdCBmaXguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfbG9vcF91ZHApOgorCSAgUHJpbnRmIGZvcm1hdCBmaXguCisKKzIwMDctMDUtMTkgMTA6MDE6NDUgKzAwMDAgIFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkgIEFkZCByZXBsYXlnYWluIHBsYXliYWNrIGVsZW1lbnRzICgjNDEyNzEwKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFJlbsOpIFN0YWRsZXIgPG1haWwgYXQgcmVuZXN0YWRsZXIgZGU+CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3JlcGxheWdhaW4vZ3N0cmdhbmFseXNpcy5jOiAoZ3N0X3JnX2FuYWx5c2lzX2NsYXNzX2luaXQpLAorCSAgKGdzdF9yZ19hbmFseXNpc19zdGFydCksIChnc3RfcmdfYW5hbHlzaXNfc2V0X2NhcHMpLAorCSAgKGdzdF9yZ19hbmFseXNpc190cmFuc2Zvcm1faXApLCAoZ3N0X3JnX2FuYWx5c2lzX2V2ZW50KSwKKwkgIChnc3RfcmdfYW5hbHlzaXNfc3RvcCksIChnc3RfcmdfYW5hbHlzaXNfaGFuZGxlX3RhZ3MpLAorCSAgKGdzdF9yZ19hbmFseXNpc19oYW5kbGVfZW9zKSwgKGdzdF9yZ19hbmFseXNpc190cmFja19yZXN1bHQpLAorCSAgKGdzdF9yZ19hbmFseXNpc19hbGJ1bV9yZXN1bHQpOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmg6CisJICAqIGdzdC9yZXBsYXlnYWluL2dzdHJnbGltaXRlci5jOiAoZ3N0X3JnX2xpbWl0ZXJfYmFzZV9pbml0KSwKKwkgIChnc3RfcmdfbGltaXRlcl9jbGFzc19pbml0KSwgKGdzdF9yZ19saW1pdGVyX2luaXQpLAorCSAgKGdzdF9yZ19saW1pdGVyX3NldF9wcm9wZXJ0eSksIChnc3RfcmdfbGltaXRlcl9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9yZ19saW1pdGVyX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9yZXBsYXlnYWluL2dzdHJnbGltaXRlci5oOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ3ZvbHVtZS5jOiAoZ3N0X3JnX3ZvbHVtZV9iYXNlX2luaXQpLAorCSAgKGdzdF9yZ192b2x1bWVfY2xhc3NfaW5pdCksIChnc3Rfcmdfdm9sdW1lX2luaXQpLAorCSAgKGdzdF9yZ192b2x1bWVfc2V0X3Byb3BlcnR5KSwgKGdzdF9yZ192b2x1bWVfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfcmdfdm9sdW1lX2Rpc3Bvc2UpLCAoZ3N0X3JnX3ZvbHVtZV9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9yZ192b2x1bWVfc2lua19ldmVudCksIChnc3Rfcmdfdm9sdW1lX3RhZ19ldmVudCksCisJICAoZ3N0X3JnX3ZvbHVtZV9yZXNldCksIChnc3Rfcmdfdm9sdW1lX3VwZGF0ZV9nYWluKSwKKwkgIChnc3Rfcmdfdm9sdW1lX2RldGVybWluZV9nYWluKToKKwkgICogZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuaDoKKwkgICogZ3N0L3JlcGxheWdhaW4vcmVwbGF5Z2Fpbi5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9yZXBsYXlnYWluLmg6CisJICAqIGdzdC9yZXBsYXlnYWluL3JnYW5hbHlzaXMuaDoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzogKHNlbmRfZW9zX2V2ZW50KSwKKwkgIChHU1RfU1RBUlRfVEVTVCk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnbGltaXRlci5jOiAoc2V0dXBfcmdsaW1pdGVyKSwKKwkgIChjbGVhbnVwX3JnbGltaXRlciksIChzZXRfcGxheWluZ19zdGF0ZSksIChjcmVhdGVfdGVzdF9idWZmZXIpLAorCSAgKHZlcmlmeV90ZXN0X2J1ZmZlciksIChHU1RfU1RBUlRfVEVTVCksIChyZ2xpbWl0ZXJfc3VpdGUpLCAobWFpbik6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3Jndm9sdW1lLmM6IChldmVudF9mdW5jKSwgKHNldHVwX3Jndm9sdW1lKSwKKwkgIChjbGVhbnVwX3Jndm9sdW1lKSwgKHNldF9wbGF5aW5nX3N0YXRlKSwgKHNldF9udWxsX3N0YXRlKSwKKwkgIChzZW5kX2Vvc19ldmVudCksIChzZW5kX3RhZ19ldmVudCksICh0ZXN0X2J1ZmZlcl9uZXcpLAorCSAgKGZhaWxfdW5sZXNzX3RhcmdldF9nYWluKSwgKGZhaWxfdW5sZXNzX3Jlc3VsdF9nYWluKSwKKwkgIChmYWlsX3VubGVzc19nYWluKSwgKEdTVF9TVEFSVF9URVNUKSwgKHJndm9sdW1lX3N1aXRlKSwgKG1haW4pOgorCSAgQWRkIHJlcGxheWdhaW4gcGxheWJhY2sgZWxlbWVudHMgKCM0MTI3MTApLgorCisyMDA3LTA1LTE4IDEzOjI3OjM5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IERvbid0IGNyYXNoIHdoZW4gYW4gdW5zdXBwb3J0ZWQgdHJhbnNwb3J0IGVycm9yIHdhcyByZXR1cm5lZCBieSB0aGUgc2VydmVyLCBqdXN0IHRyeSB0byBjb25maWcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zZXR1cF9zdHJlYW1zKToKKwkgIERvbid0IGNyYXNoIHdoZW4gYW4gdW5zdXBwb3J0ZWQgdHJhbnNwb3J0IGVycm9yIHdhcyByZXR1cm5lZCBieSB0aGUKKwkgIHNlcnZlciwganVzdCB0cnkgdG8gY29uZmlndXJlIHRoZSBuZXh0IHN0cmVhbS4gRml4ZXMgIzQzOTI1NS4KKworMjAwNy0wNS0xOCAxMTozOToxMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy4qOiBBZGQgVENQIHRpbWVvdXQgcHJvcGVydHkgYW5kIHVzZSBpdCBmb3IgYWxsIFRDUCBjb25uZWN0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHNwc3JjX3NldF9wcm9wZXJ0eSksIChnc3RfcnRzcHNyY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdWRwKSwgKGdzdF9ydHNwc3JjX2xvb3BfaW50ZXJsZWF2ZWQpLAorCSAgKGdzdF9ydHNwc3JjX2xvb3BfdWRwKSwgKGdzdF9ydHNwc3JjX3RyeV9zZW5kKSwgKGdzdF9ydHNwc3JjX3NlbmQpLAorCSAgKGdzdF9ydHNwc3JjX3NldHVwX3N0cmVhbXMpLCAoZ3N0X3J0c3BzcmNfb3Blbik6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIEFkZCBUQ1AgdGltZW91dCBwcm9wZXJ0eSBhbmQgdXNlIGl0IGZvciBhbGwgVENQIGNvbm5lY3Rpb24uCisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fY29ubmVjdCksCisJICAocnRzcF9jb25uZWN0aW9uX3dyaXRlKSwgKHJ0c3BfY29ubmVjdGlvbl9uZXh0X3RpbWVvdXQpLAorCSAgKHJ0c3BfY29ubmVjdGlvbl9yZXNldF90aW1lb3V0KToKKwkgIE1ha2UgY29ubmVjdCBhbmQgd3JpdGVzIGNhbmNlbGFibGUgYW5kIG1ha2UgdGhlbSB1c2UgdGhlIHRpbWVvdXQuCisKKzIwMDctMDUtMTggMTA6MzY6MTIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogUmVmYWN0b3IgdGltZW91dCBoYW5kbGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zZW5kX2tlZXBfYWxpdmUpLAorCSAgKGdzdF9ydHNwc3JjX2xvb3BfaW50ZXJsZWF2ZWQpLCAoZ3N0X3J0c3BzcmNfbG9vcF91ZHApLAorCSAgKGdzdF9ydHNwc3JjX3RyeV9zZW5kKSwgKGdzdF9ydHNwc3JjX3NlbmQpLAorCSAgKGdzdF9ydHNwc3JjX3NldHVwX3N0cmVhbXMpOgorCSAgUmVmYWN0b3IgdGltZW91dCBoYW5kbGluZy4KKwkgIEFsc28gc2VuZCBrZWVwLWFsaXZlIHdoZW4gZGVhbGluZyB3aXRoIFRDUCB0cmFuc3BvcnQuCisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fY3JlYXRlKSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fZnJlZSksIChydHNwX2Nvbm5lY3Rpb25fbmV4dF90aW1lb3V0KSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fcmVzZXRfdGltZW91dCk6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmg6CisJICBVc2UgYSB0aW1lciB0byBoYW5kbGUgdGhlIHNlc3Npb24gdGltZW91dHMsIGFkZCBzb21lIG1ldGhvZHMgdG8gZGVhbAorCSAgd2l0aCB0aW1lb3V0cy4KKworMjAwNy0wNS0xNyAxNDo1NjozOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBJZ25vcmUgc3RyZWFtcyB0aGF0IGZhaWwgdGhlIHNldHVwIGNvbW1hbmQsIHdlIHdpbGwgcmV0cnkgd2l0aCBhIGRpZmZlcmVudCB0cmFuc3BvcnQgbGF0ZXIgb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc2VuZCksCisJICAoZ3N0X3J0c3BzcmNfc2V0dXBfc3RyZWFtcyk6CisJICBJZ25vcmUgc3RyZWFtcyB0aGF0IGZhaWwgdGhlIHNldHVwIGNvbW1hbmQsIHdlIHdpbGwgcmV0cnkgd2l0aCBhCisJICBkaWZmZXJlbnQgdHJhbnNwb3J0IGxhdGVyIG9uLgorCSAgKiBnc3QvcnRzcC9ydHNwZXh0d21zLmM6IChydHNwX2V4dF93bXNfcGFyc2Vfc2RwKSwKKwkgIChydHNwX2V4dF93bXNfY29uZmlndXJlX3N0cmVhbSk6CisJICBGaXggZW5jb2RpbmcgbmFtZSBjYXNlLgorCisyMDA3LTA1LTE3IDEwOjU5OjAwICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLio6IFJlbW92ZSB0aGUgZXZlbnQtbG9vcC1pbi1zZXBhcmF0ZS10aHJlYWQgbW9kaWZpY2F0aW9ucywgYmVjYXVzZSBNYWNPU1ggaXMgJCNAKColJCMgISBGb3IuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIFJlbW92ZSB0aGUgZXZlbnQtbG9vcC1pbi1zZXBhcmF0ZS10aHJlYWQgbW9kaWZpY2F0aW9ucywgYmVjYXVzZSBNYWNPU1gKKwkgIGlzICQjQCgqJSQjICEgRm9yIHRob3NlIHdvbmRlcmluZywgdGhlIGV2ZW50IGhhbmRsaW5nIG5lZWRzIHRvIGJlIGRvbmUKKwkgIGluIHRoZSBtYWluIHRocmVhZCBhZnRlciBhbGwuLgorCisyMDA3LTA1LTE3IDA5OjQxOjQ4ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLio6IEZpeCBhIHN0dXBpZCAjaWYgdnMgI2lmZGVmIGJ1Zy4gU2hvdWxkIHVzZSB0aGUgcHJvcGVyIGNvbG9yc3BhY2Ugbm93LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgRml4IGEgc3R1cGlkICNpZiB2cyAjaWZkZWYgYnVnLiBTaG91bGQgdXNlIHRoZSBwcm9wZXIgY29sb3JzcGFjZSBub3cuCisJICBVc2UgYSBzZXBhcmF0ZSB0aHJlYWQvdGFzayBmb3IgdGhlIGNvY29hIGV2ZW50X2xvb3AsIGVsc2UgaXQgd291bGRuJ3QKKwkgIHN0b3AuCisKKzIwMDctMDUtMTYgMTY6NTA6MjMgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IEZpeCBidWlsZCBvbiBtYWNvc3guCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKHVzZXJfZW5kcm93X2NhbGxiYWNrKSwgKHVzZXJfcmVhZF9kYXRhKToKKwkgIEZpeCBidWlsZCBvbiBtYWNvc3guCisKKzIwMDctMDUtMTYgMTY6MzA6MDMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IFJlcGxhY2UgZGlyZWN0IGNvbXBhcmlzb24gb2YgYSBzdHJpbmcgd2l0aCB0aGUgc3RyaW5nIGxpdGVyYWwgIiIgd2l0aCBhIGNvbXBhcmlzb24gb2YgdGhlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IChnc3RfZHYxMzk0c3JjX3VyaV9zZXRfdXJpKToKKwkgIFJlcGxhY2UgZGlyZWN0IGNvbXBhcmlzb24gb2YgYSBzdHJpbmcgd2l0aCB0aGUgc3RyaW5nIGxpdGVyYWwgIiIgd2l0aAorCSAgYSBjb21wYXJpc29uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgd2l0aCAnXDAnLiBGaXhlcyAjNDM4OTI2LgorCisyMDA3LTA1LTE1IDE3OjIyOjU4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBBZGQgRElSRUNURFJBV19DRkxBR1MgYW5kIERJUkVDVFNPVU5EX0NGTEFHUyB0byBNYWtlZmlsZS5hbTsgc2F2ZSBhbmQgcmVzdG9yZSB0aGUgdmFyaW91cyBmbGFncyBpbiB0aGUgZGlyZWN0ZHJhdy9kaXIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIHN5cy9kaXJlY3RkcmF3L01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZGlyZWN0c291bmQvTWFrZWZpbGUuYW06CisJICBBZGQgRElSRUNURFJBV19DRkxBR1MgYW5kIERJUkVDVFNPVU5EX0NGTEFHUyB0byBNYWtlZmlsZS5hbTsgc2F2ZQorCSAgYW5kIHJlc3RvcmUgdGhlIHZhcmlvdXMgZmxhZ3MgaW4gdGhlIGRpcmVjdGRyYXcvZGlyZWN0c291bmQKKwkgIGRldGVjdGlvbiBzZWN0aW9uLiBBcHBhcmVudGx5IGltcHJvdmVzIGNyb3NzLWNvbXBpbGluZyBmb3Igd2luMzIKKwkgIHdpdGggbWluZ3czMiB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMgKCM0Mzc1MzkpLgorCisyMDA3LTA1LTE1IDExOjE4OjMzICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9kZWJ1Zy9icmVha215ZGF0YS5jIChnc3RfYnJlYWtfbXlfZGF0YV9pbml0KTogT25lIG1vcmUgdHJ5LiBUaGlzIHNob3VsZCBiZSB0aGUgcHJvcGVyIGZpeCBub3cuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlYnVnL2JyZWFrbXlkYXRhLmMgKGdzdF9icmVha19teV9kYXRhX2luaXQpOgorCSAgT25lIG1vcmUgdHJ5LiBUaGlzIHNob3VsZCBiZSB0aGUgcHJvcGVyIGZpeCBub3cuCisKKzIwMDctMDUtMTUgMDY6NDE6NTggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2RlYnVnL2JyZWFrbXlkYXRhLmM6IE9vb3BzLCBubyAvLyBjb21tZW50cyBwbGVhc2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlYnVnL2JyZWFrbXlkYXRhLmM6CisJICBPb29wcywgbm8gLy8gY29tbWVudHMgcGxlYXNlLgorCisyMDA3LTA1LTE1IDA2OjM0OjQ4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9kZWJ1Zy9icmVha215ZGF0YS5jOiBGaXggZ3N0X2J1ZmZlcl9pc193cml0YWJsZSgpIGFzc2VydGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVidWcvYnJlYWtteWRhdGEuYzogKGdzdF9icmVha19teV9kYXRhX2NsYXNzX2luaXQpLAorCSAgKGdzdF9icmVha19teV9kYXRhX2luaXQpOgorCSAgRml4IGdzdF9idWZmZXJfaXNfd3JpdGFibGUoKSBhc3NlcnRpb24uCisKKzIwMDctMDUtMTUgMDI6NTY6MjMgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IEFkZCBzdXBwb3J0IGZvciBCYXllciBpbWFnZXMgYXMgdmlkZW8veC1yYXctYmF5ZXIuICBGaXhlcyAjMzE0MTYwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogQWRkIHN1cHBvcnQgZm9yIEJheWVyIGltYWdlcyBhcworCSAgdmlkZW8veC1yYXctYmF5ZXIuICBGaXhlcyAjMzE0MTYwLgorCisyMDA3LTA1LTE0IDE3OjEwOjEyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogVXBkYXRlIHRoZW9yYSBwYXkvZGVwYXlsb2FkZXIgaW4gYSBzaW1pbGFyIHRvIHZvcmJpcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6IChkZWNvZGVfYmFzZTY0KSwKKwkgIChnc3RfcnRwX3RoZW9yYV9kZXBheV9wYXJzZV9jb25maWd1cmF0aW9uKToKKwkgICogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzogKGVuY29kZV9iYXNlNjQpLAorCSAgKGdzdF9ydHBfdGhlb3JhX3BheV9maW5pc2hfaGVhZGVycyksCisJICAoZ3N0X3J0cF90aGVvcmFfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgVXBkYXRlIHRoZW9yYSBwYXkvZGVwYXlsb2FkZXIgaW4gYSBzaW1pbGFyIHRvIHZvcmJpcy4KKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOgorCSAgKGdzdF9ydHBfdm9yYmlzX2RlcGF5X3BhcnNlX2NvbmZpZ3VyYXRpb24pOgorCSAgVXBkYXRlIGRvY3MuCisKKzIwMDctMDUtMTQgMTY6MTk6NTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogV2hlbiB3ZSB0cnkgdG8gZXhlY3V0ZSBhIG1ldGhvZCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlciwgZG9uJ3QgZXJyb3Igb3V0IGJ1dCByZW1vdi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3NlbmQpOgorCSAgV2hlbiB3ZSB0cnkgdG8gZXhlY3V0ZSBhIG1ldGhvZCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlciwKKwkgIGRvbid0IGVycm9yIG91dCBidXQgcmVtb3ZlIHRoZSBtZXRob2QgZnJvbSB0aGUgYWNjZXB0ZWQgbWV0aG9kcyBzbyB0aGF0CisJICB3ZSBuZXZlciB0cnkgdG8gcGVyZm9ybSB0aGlzIG1ldGhvZCBhZ2Fpbi4KKworMjAwNy0wNS0xNCAxNDo0NzoyNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOiBSZW1vdmUgYW5ub3lpbmcgX2R1bXBfbWVtLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzogKGdzdF9ydHBfdm9yYmlzX2RlcGF5X3Byb2Nlc3MpOgorCSAgUmVtb3ZlIGFubm95aW5nIF9kdW1wX21lbS4KKworMjAwNy0wNS0xNCAxMToxMTo0MiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiBQYXJzZSByYW5nZSBjb3JyZWN0bHkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfcGFyc2VfcmFuZ2UpOgorCSAgUGFyc2UgcmFuZ2UgY29ycmVjdGx5LgorCSAgKiBnc3QvcnRzcC9ydHNwdXJsLmM6IChydHNwX3VybF9nZXRfcmVxdWVzdF91cmkpOgorCSAgVGhlIGJhc2V1cmwgbm93IGFsd2F5cyBoYXMgYSAnLycgYXQgdGhlIHN0YXJ0LgorCisyMDA3LTA1LTE0IDA5OjAxOjA1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IEZhY3RvciBvdXQgY2FwcyBjb25maWd1cmF0aW9uIGFuZCBjb25maWd1cmUgbW9yZSBzdHVmZiBzdWNoIGFzIHRoZSB0aW1lIHJhbmdlcyBhbmQgc3BlZWQvc2NhbGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19jb25maWd1cmVfY2FwcyksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfcmFuZ2UpLCAoZ3N0X3J0c3BzcmNfb3BlbiksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfcnRwaW5mbyksIChnc3RfcnRzcHNyY19wbGF5KToKKwkgIEZhY3RvciBvdXQgY2FwcyBjb25maWd1cmF0aW9uIGFuZCBjb25maWd1cmUgbW9yZSBzdHVmZiBzdWNoIGFzIHRoZSB0aW1lCisJICByYW5nZXMgYW5kIHNwZWVkL3NjYWxlIHZhbHVlcy4KKwkgICogZ3N0L3J0c3AvcnRzcHRyYW5zcG9ydC5jOgorCSAgQWRkIENvcHlyaWdodCBhZnRlciBub24tdHJpdmFsIGZpeGVzLgorCisyMDA3LTA1LTEzIDE5OjU3OjQ1ICswMDAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSAgZ3N0L3JlcGxheWdhaW4vcmdhbmFseXNpcy5jOiBGaXggd3JvbmcgaWZkZWYgZm9yIHZpc3VhbCBDKysuICBGaXhlczogIzQzNzQwMy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9yZ2FuYWx5c2lzLmM6CisJICBGaXggd3JvbmcgaWZkZWYgZm9yIHZpc3VhbCBDKysuICBGaXhlczogIzQzNzQwMy4KKwkgIEJ5IEFsaSBTYWJpbCA8YWxpLnNhYmlsQGdtYWlsLmNvbT4uCisKKzIwMDctMDUtMTMgMTU6NDc6MTMgKzAwMDAgIFPDqWJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4KKworCSAgZ3N0L2xldmVsL2dzdGxldmVsLmM6IFVzZSBndWludDggKiBpbnN0ZWFkIG9mIGdwb2ludGVyIHRoZW4gdnM2IGNhbiBidWlsZCBpbl9kYXRhICs9IChmaWx0ZXItPndpZHRoIC8gOCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfdHJhbnNmb3JtX2lwKToKKwkgIFVzZSBndWludDggKiBpbnN0ZWFkIG9mIGdwb2ludGVyIHRoZW4gdnM2IGNhbiBidWlsZAorCSAgaW5fZGF0YSArPSAoZmlsdGVyLT53aWR0aCAvIDgpLgorCisyMDA3LTA1LTEyIDE2OjM3OjUwICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0c3AvOiBNYWtlIGNoYW5uZWwgZ3VpbnQ4IHdoZXJlIHBvc3NpYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUGV0ZXIgS2plbGxlcnN0ZWR0ICA8cGtqIGF0IGF4aXMgY29tPgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fcmVjZWl2ZSk6CisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmM6IChydHNwX21lc3NhZ2VfaW5pdF9kYXRhKSwKKwkgIChydHNwX21lc3NhZ2VfZ2V0X2hlYWRlcik6CisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmg6CisJICBNYWtlIGNoYW5uZWwgZ3VpbnQ4IHdoZXJlIHBvc3NpYmxlLgorCSAgTWFrZSBydHNwX21lc3NhZ2VfaW5pdF9kYXRhKCkgdGFrZSB0aGUgY2hhbm5lbCBhcyBhIGd1aW50OC4KKwkgICogZ3N0L3J0c3AvcnRzcGRlZnMuYzoKKwkgIEZpeGVkIGEgdHlwbzogVGltb3V0IC0+IFRpbWVvdXQKKwkgICogZ3N0L3J0c3AvcnRzcGRlZnMuaDoKKwkgIE1ha2UgUlRTUF9DSEVDSygpIGJlaGF2ZSBhcyBhIHN0YXRlbWVudC4KKwkgICogZ3N0L3J0c3Avc2RwbWVzc2FnZS5jOgorCSAgQXZvaWQgYSBjb21waWxlciB3YXJuaW5nIGluIElOSVRfQVJSQVkoKS4KKwkgIEZpeGVzICM0Mzc2OTIuCisKKzIwMDctMDUtMTIgMTY6Mjc6NTEgKzAwMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJICBnc3QvcnRzcC9ydHNwdXJsLio6IEFkZCBzdXBwb3J0IGZvciBxdWVyeSBwYXJhbWV0ZXJzIHRvIFJUU1AgVVJMcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFBldGVyIEtqZWxsZXJzdGVkdCAgPHBraiBhdCBheGlzIGNvbT4KKwkgICogZ3N0L3J0c3AvcnRzcHVybC5jOiAocnRzcF91cmxfcGFyc2UpLCAocnRzcF91cmxfZnJlZSksCisJICAocnRzcF91cmxfZ2V0X3JlcXVlc3RfdXJpKToKKwkgICogZ3N0L3J0c3AvcnRzcHVybC5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gUlRTUCBVUkxzLgorCisyMDA3LTA1LTEyIDE2OjI2OjA2ICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0c3AvcnRzcHRyYW5zcG9ydC4qOiBBZGQgdmFsaWRhdGlvbiB0byBydHNwX3RyYW5zcG9ydF9wYXJzZSgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUGV0ZXIgS2plbGxlcnN0ZWR0ICA8cGtqIGF0IGF4aXMgY29tPgorCSAgKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0LmM6IChydHNwX3RyYW5zcG9ydF9pbml0KSwgKHBhcnNlX21vZGUpLAorCSAgKHBhcnNlX3JhbmdlKSwgKHJhbmdlX2FzX3RleHQpLCAocnRzcF90cmFuc3BvcnRfbW9kZV9hc190ZXh0KSwKKwkgIChydHNwX3RyYW5zcG9ydF9wcm9maWxlX2FzX3RleHQpLCAocnRzcF90cmFuc3BvcnRfbHRyYW5zX2FzX3RleHQpLAorCSAgKHJ0c3BfdHJhbnNwb3J0X3BhcnNlKSwgKHJ0c3BfdHJhbnNwb3J0X2FzX3RleHQpOgorCSAgKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0Lmg6CisJICBBZGQgdmFsaWRhdGlvbiB0byBydHNwX3RyYW5zcG9ydF9wYXJzZSgpLgorCSAgQWRkIHJ0c3BfdHJhbnNwb3J0X2FzX3RleHQoKSB0byBnZW5lcmF0ZSBhbiBSVFNQIGhlYWRlciBmcm9tIGFuCisJICBSVFNQVHJhbnNwb3J0LgorCSAgQ2hhbmdlIHNzcmMgdG8gZ3VpbnQgKHdhcyBhIHN0cmluZykgc2luY2UgdGhhdCBpcyB3aGF0IGl0IGlzLCBldmVuCisJICB0aG91Z2ggaXQgaXMgc2VudCBhcyBhIGhleCBzdHJpbmcuCisJICBDb3JyZWN0bHkgaWRlbnRpZnkgUExBWXxSRUNPUkQgbW9kZSBwYXJhbWV0ZXJzICh0aGUgc3ludGF4IGluIHRoZSBSRkMgaXMKKwkgIGluY29ycmVjdCwgd2hpY2ggY2FuIGJlIHNlZW4gd2hlbiBsb29raW5nIGF0IHRoZSBleGFtcGxlcyBpbiB0aGUgUkZDKS4KKwkgIEZpeGVzICM0Mzc2NzAuCisKKzIwMDctMDUtMTEgMTY6MTE6MDQgKzAwMDAgIEVyaWMgQW5ob2x0IDxhbmhvbHRAZnJlZWJzZC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jIChnc3RfeGltYWdlX3NyY19vcGVuX2Rpc3BsYXksIGdzdF94aW1hZ2Vfc3JjX3hpbWFnZV9nZXQpOgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogRXJpYyBBbmhvbHQKKwkgICogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYyAoZ3N0X3hpbWFnZV9zcmNfb3Blbl9kaXNwbGF5LAorCSAgZ3N0X3hpbWFnZV9zcmNfeGltYWdlX2dldCk6CisJICBVc2UgdW5pb24gb2YgYWxsIGRhbWFnZSBiZXR3ZWVuIGZyYW1lcyB0byBtYWtlIGl0IGZhc3Rlci4KKwkgIEZpeGVzIGJ1ZyAjMzQyNDYzLgorCSAgQWxzbyBmaXggY3Jhc2hlciB3aGVuIGN1cnNvciBpcyBhdCBib3R0b20gcmlnaHQgb2Ygd2luZG93LgorCisyMDA3LTA1LTExIDE2OjAxOjQ1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogU2tpcCBMSVNUIGNodW5rcyBiZWZvcmUgdGhlIGZtdCBjaHVuayAoZml4ZXMgIzQzNzQ5OSkuIEFsc28gZml4IHN0cmVhbWluZyBtb2RlIHJlZ3Jlc3Npb24uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyk6CisJICBTa2lwIExJU1QgY2h1bmtzIGJlZm9yZSB0aGUgZm10IGNodW5rIChmaXhlcyAjNDM3NDk5KS4gQWxzbyBmaXgKKwkgIHN0cmVhbWluZyBtb2RlIHJlZ3Jlc3Npb24gZm9yIGZpbGUgZnJvbSAjMzQzODM3IHdpdGggJ2JleHQnIGNodW5rCisJICBiZWZvcmUgdGhlICdmbXQnIGNodW5rLgorCisyMDA3LTA1LTExIDE1OjA5OjM5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC86IFByZWxpbWluYXJ5IHNlZWsgc3VwcG9ydC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19mbHVzaCksCisJICAoZ3N0X3J0c3BzcmNfZG9fc2VlayksIChnc3RfcnRzcHNyY19wZXJmb3JtX3NlZWspLAorCSAgKGdzdF9ydHNwc3JjX2hhbmRsZV9zcmNfZXZlbnQpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfbWFuYWdlciksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90Y3ApLCAoZ3N0X3J0c3BzcmNfbG9vcF9pbnRlcmxlYXZlZCksCisJICAoZ3N0X3J0c3BzcmNfc2VuZF9rZWVwX2FsaXZlKSwgKGdzdF9ydHNwc3JjX29wZW4pLAorCSAgKGdzdF9ydHNwc3JjX3BhcnNlX3J0cGluZm8pLCAoZ3N0X3J0c3BzcmNfcGxheSk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgICogZ3N0L3J0c3AvcnRzcGRlZnMuaDoKKwkgIFByZWxpbWluYXJ5IHNlZWsgc3VwcG9ydC4KKwkgIEFjdGl2YXRlIGludGVybmFsIHBhZHMgc28gdGhhdCB3ZSBjYW4gcmVjZWl2ZSBldmVudHMgb24gdGhlbS4KKwkgIERvbid0IHRyeSB0byBwYXJzZSBhIHJhbmdlIHN0cmluZyB3aGVuIGl0J3MgTlVMTC4KKworMjAwNy0wNS0xMSAxNTowNDozOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9SRUFETUU6IFVwZGF0ZSBSRUFETUUgd2l0aCBuZXcgUlRQIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgdXNlZCBmb3Igc3luY2hyb25pc2F0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvUkVBRE1FOgorCSAgVXBkYXRlIFJFQURNRSB3aXRoIG5ldyBSVFAgdmFyaWFibGVzIHRoYXQgd2lsbCBiZSB1c2VkIGZvcgorCSAgc3luY2hyb25pc2F0aW9uLgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6IChkZWNvZGVfYmFzZTY0KSwKKwkgIChnc3RfcnRwX3ZvcmJpc19kZXBheV9wYXJzZV9jb25maWd1cmF0aW9uKSwKKwkgIChnc3RfcnRwX3ZvcmJpc19kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzogKGVuY29kZV9iYXNlNjQpLAorCSAgKGdzdF9ydHBfdm9yYmlzX3BheV9maW5pc2hfaGVhZGVycyksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgVXBkYXRlIHZvcmJpcyBwYXkgYW5kIGRlcGF5bG9hZGVyIHRvIGRyYWZ0LTA0LgorCisyMDA3LTA1LTExIDExOjI0OjEzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0LmM6IFVEUCBNQ0FTVCBpcyBhY3R1YWxseSB0aGUgZGVmYXVsdCBmb3IgUlRQL0FWUC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0LmM6CisJICBVRFAgTUNBU1QgaXMgYWN0dWFsbHkgdGhlIGRlZmF1bHQgZm9yIFJUUC9BVlAuCisKKzIwMDctMDUtMTEgMTA6MzE6MjcgKzAwMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkgIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmMgKGdzdF94aW1hZ2Vfc3JjX3N0YXJ0LCBnc3RfeGltYWdlX3NyY194aW1hZ2VfZ2V0KToKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jIChnc3RfeGltYWdlX3NyY19zdGFydCwKKwkgIGdzdF94aW1hZ2Vfc3JjX3hpbWFnZV9nZXQpOgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5oIChsYXN0X3hpbWFnZSk6CisJICBXaGVuIHVzaW5nIERhbWFnZSBhY3R1YWxseSBrZWVwIHRoZSBsYXN0IGZyYW1lLCBhbmQgbm90IGFzc3VtZQorCSAgdGhhdCB0aGUgYnVmZmVyIHdlIGdldCBhbHJlYWR5IGhhcyB0aGUgbGFzdCBmcmFtZSBvbiBpdC4KKwkgIENvcHkgdGhlIGN1cnNvciBvdmVyIGlmIHdlIHNwZWNpZnkgYSBub24temVybyBzdGFydCB4IGFuZAorCSAgc3RhcnQgeS4KKworMjAwNy0wNS0xMSAwOToxMjo1NSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvcnRzcHRyYW5zcG9ydC5jOiBNYWtlIFVEUCB0aGUgZGVmYXVsdCB0cmFuc3BvcnQgd2hlbiBub3Qgc3BlY2lmaWVkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL3J0c3B0cmFuc3BvcnQuYzoKKwkgIE1ha2UgVURQIHRoZSBkZWZhdWx0IHRyYW5zcG9ydCB3aGVuIG5vdCBzcGVjaWZpZWQuCisKKzIwMDctMDUtMTAgMTQ6MDI6MDcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jIChnc3RfcXRkZW11eF9tb3ZlX3N0cmVhbSwgZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9oZWFkZXIsIGdzdF9xdGRlbXV4X2FjdGl2YXRlX3NlZ21lbnQsIGdzdF9xdGRlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jIChnc3RfcXRkZW11eF9tb3ZlX3N0cmVhbSwKKwkgIGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfaGVhZGVyLCBnc3RfcXRkZW11eF9hY3RpdmF0ZV9zZWdtZW50LAorCSAgZ3N0X3F0ZGVtdXhfcHJlcGFyZV9jdXJyZW50X3NhbXBsZSwgZ3N0X3F0ZGVtdXhfY29tYmluZV9mbG93cywKKwkgIGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfbW92aWUsIGdzdF9xdGRlbXV4X2xvb3AsCisJICBxdGRlbXV4X3BhcnNlX3NlZ21lbnRzLCBxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgKiBnc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmMgKHJ0cF9zZXNzaW9uX2dldF9iYW5kd2lkdGgsCisJICBydHBfc2Vzc2lvbl9nZXRfcnRjcF9iYW5kd2lkdGgsIHJ0cF9zZXNzaW9uX2dldF9jbmFtZSwKKwkgIHJ0cF9zZXNzaW9uX2dldF9uYW1lLCBydHBfc2Vzc2lvbl9nZXRfZW1haWwsIHJ0cF9zZXNzaW9uX2dldF9waG9uZSwKKwkgIHJ0cF9zZXNzaW9uX2dldF9sb2NhdGlvbiwgcnRwX3Nlc3Npb25fZ2V0X3Rvb2wsCisJICBydHBfc2Vzc2lvbl9wcm9jZXNzX2J5ZSwgc2Vzc2lvbl9yZXBvcnRfYmxvY2tzKToKKwkgICogZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmMgKHJ0cF9zb3VyY2VfcHJvY2Vzc19ydHAsCisJICBydHBfc291cmNlX3NlbmRfcnRwLCBydHBfc291cmNlX3Byb2Nlc3Nfc3IsIHJ0cF9zb3VyY2VfcHJvY2Vzc19yYik6CisJICBNb3JlIGZvcm1hdCBhcmcgZml4aW5nIChzcG90dGVkIGJ5IEFsaSBTYWJpbCA8YWxpLnNhYmlsQGdtYWlsLmNvbT4pLgorCSAgKiBnc3Qvc3dpdGNoL01ha2VmaWxlLmFtOgorCSAgQWRkIHJlcXVpcmUgbGlicmFyaWVzKHNwb3R0ZWQgYnkgQWxpIFNhYmlsIDxhbGkuc2FiaWxAZ21haWwuY29tPikuCisKKzIwMDctMDUtMTAgMDE6MjE6MTkgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogUmV2ZXJ0IGxhc3QgY2hhbmdlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgUmV2ZXJ0IGxhc3QgY2hhbmdlLgorCisyMDA3LTA1LTA5IDIxOjMwOjUzICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiBVc2UgZ3VpbnQ4ICogaW5zdGVhZCBvZiBncG9pbnRlciB0aGVuIHZzNiBrbm93IHRoZSBzaXplIG9mIGRhdGEgcG9pbnRlZCB3aGVuIG1vdmluZyB0aGUgcG9pbnRlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogKGdzdF9sZXZlbF9jYWxjdWxhdGVfIyNUWVBFKSwKKwkgIChnc3RfbGV2ZWxfdHJhbnNmb3JtX2lwKToKKwkgIFVzZSBndWludDggKiBpbnN0ZWFkIG9mIGdwb2ludGVyIHRoZW4gdnM2IGtub3cgdGhlIHNpemUgb2YgZGF0YQorCSAgcG9pbnRlZCB3aGVuIG1vdmluZyB0aGUgcG9pbnRlci4KKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmM6IChnc3RfcnRwX2gyNjRfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgTW92ZSBpbnN0cnVjdGlvbnMgYWZ0ZXIgdmFyaWFibGVzIGRlY2xhcmF0aW9uLgorCSAgKiB3aW4zMi92czYvYXV0b2dlbi5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RydHAuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0cnRzcC5kc3A6CisJICBVcGRhdGUgdnM2IHByb2plY3QgZmlsZXMuCisKKzIwMDctMDUtMDkgMTE6MjM6MzkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwLzogQWRkIGNvZGUgdG8gcGFyc2UgdGltZSByYW5nZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2hhbmRsZV9zcmNfcXVlcnkpLAorCSAgKGdzdF9ydHNwc3JjX3NlbmRfa2VlcF9hbGl2ZSksIChnc3RfcnRzcHNyY19vcGVuKToKKwkgICogZ3N0L3J0c3AvcnRzcHJhbmdlLmM6IChwYXJzZV9ucHRfdGltZSksIChwYXJzZV9ucHRfcmFuZ2UpLAorCSAgKHBhcnNlX2Nsb2NrX3JhbmdlKSwgKHBhcnNlX3NtcHRlX3JhbmdlKSwgKHJ0c3BfcmFuZ2VfcGFyc2UpLAorCSAgKHJ0c3BfcmFuZ2VfZnJlZSk6CisJICAqIGdzdC9ydHNwL3J0c3ByYW5nZS5oOgorCSAgQWRkIGNvZGUgdG8gcGFyc2UgdGltZSByYW5nZXMuCisJICBSZXBvcnQgRFVSQVRJT04gb24gdGhlIHN0cmVhbSB3aGVuIHBvc3NpYmxlLgorCisyMDA3LTA1LTA4IDE1OjQ5OjAxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IEZpeCBzdHJpZGVzIGNhbGN1bGF0aW9uIGZvciBBWVVWIChpdCdzIGp1c3Qgd2lkdGgqNCkgKCM0MzY5MTApLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogKGdzdF92aWRlb21peGVyX2JsZW5kX2F5dXZfYXl1diksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9jaGVja2VyKSwgKGdzdF92aWRlb21peGVyX2ZpbGxfY29sb3IpLAorCSAgKGdzdF92aWRlb21peGVyX2NvbGxlY3RlZCk6CisJICBGaXggc3RyaWRlcyBjYWxjdWxhdGlvbiBmb3IgQVlVViAoaXQncyBqdXN0IHdpZHRoKjQpICgjNDM2OTEwKS4KKworMjAwNy0wNS0wNiAyMTozMjo0MCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvYXVkaW9meC86IFN5bmMgdGhlIEdPYmplY3QgcHJvcGVydGllcyBiZWZvcmUgZWFjaCBwcm9jZXNzaW5nIHN0ZXAgdG8gcHJvcGVybHkgd29yayB3aXRoIHRoZSBjb250cm9sbGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jOiAoZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmM6IChnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1faXApOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2ludmVydC5jOiAoZ3N0X2F1ZGlvX2ludmVydF90cmFuc2Zvcm1faXApOgorCSAgU3luYyB0aGUgR09iamVjdCBwcm9wZXJ0aWVzIGJlZm9yZSBlYWNoIHByb2Nlc3Npbmcgc3RlcCB0byBwcm9wZXJseQorCSAgd29yayB3aXRoIHRoZSBjb250cm9sbGVyLgorCisyMDA3LTA1LTA0IDE1OjE3OjE0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IExldCBtb3JlIGVycm9yIHN0YXRlIHRyaWNrbGUgZG93biBzbyB0aGF0IHdlIGNhbiBjYXRjaCBtb3JlIGVycm9yIGNhc2VzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3NlbmRfa2VlcF9hbGl2ZSksCisJICAoZ3N0X3J0c3BzcmNfbG9vcF91ZHApLCAoZ3N0X3J0c3BzcmNfdHJ5X3NlbmQpLCAoZ3N0X3J0c3BzcmNfc2VuZCksCisJICAoZ3N0X3J0c3BzcmNfc2V0dXBfc3RyZWFtcyksIChnc3RfcnRzcHNyY19vcGVuKSwKKwkgIChnc3RfcnRzcHNyY19jbG9zZSksIChnc3RfcnRzcHNyY19wbGF5KSwgKGdzdF9ydHNwc3JjX3BhdXNlKSwKKwkgIChnc3RfcnRzcHNyY19jaGFuZ2Vfc3RhdGUpOgorCSAgTGV0IG1vcmUgZXJyb3Igc3RhdGUgdHJpY2tsZSBkb3duIHNvIHRoYXQgd2UgY2FuIGNhdGNoIG1vcmUgZXJyb3IKKwkgIGNhc2VzLgorCSAgSGFuZGxlIGtlZXAtYWxpdmUgYSBsaXR0bGUgc21hcnRlciBieSBzZWxlY3RpbmcgYSBtZXRob2QgdGhlIHNlcnZlcgorCSAgYWN0dWFsbHkgc3VwcG9ydHMuCisJICBGaXggYSByYWNlIGluIFVEUCBzdHJlYW1pbmcgc2h1dGRvd24uCisKKzIwMDctMDUtMDQgMTM6MDQ6MzEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogSWdub3JlIGVycm9ycyB3aGVuIHRyeWluZyB0byB1c2UgdGhlIGtlZXAtYWxpdmUgbWVzc2FnZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc2VuZF9rZWVwX2FsaXZlKToKKwkgIElnbm9yZSBlcnJvcnMgd2hlbiB0cnlpbmcgdG8gdXNlIHRoZSBrZWVwLWFsaXZlIG1lc3NhZ2VzLgorCisyMDA3LTA1LTA0IDEyOjMxOjMyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IFNlbmQgUlRDUCBtZXNzYWdlcyBiYWNrIHRvIHRoZSBzZXJ2ZXIgb3ZlciB0aGUgVENQIGNvbm5lY3Rpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfaGFuZGxlX3NyY19ldmVudCksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX3NyY19xdWVyeSksIChnc3RfcnRzcHNyY19zaW5rX2NoYWluKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX21hbmFnZXIpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9mcmVlX3VkcCksIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RjcCksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV9tY2FzdCksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV91ZHApLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdWRwX3NpbmspLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KToKKwkgIFNlbmQgUlRDUCBtZXNzYWdlcyBiYWNrIHRvIHRoZSBzZXJ2ZXIgb3ZlciB0aGUgVENQIGNvbm5lY3Rpb24uCisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fd3JpdGUpLAorCSAgKHJ0c3BfY29ubmVjdGlvbl9zZW5kKSwgKHJ0c3BfY29ubmVjdGlvbl9yZWFkKSwgKHJlYWRfYm9keSksCisJICAocnRzcF9jb25uZWN0aW9uX3JlY2VpdmUpOgorCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5oOgorCSAgRmFjdG9yIG91dCBhbmQgZXhwb3NlIGxvd2xldmVsIF93cml0ZSBhbmQgX3JlYWQgbWV0aG9kcy4KKwkgIEltcGxlbWVudCBzZW5kaW5nIGRhdGEgbWVzc2FnZXMgdG8gdGhlIHNlcnZlci4KKworMjAwNy0wNS0wMyAxNTo1NTowNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogRml4IHRpbWVzdGFtcHMgb24gb3V0Z29pbmcgYnVmZmVycy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOiAoZ3N0X211bHRpcGFydF9tdXhfcXVldWVfcGFkcyksCisJICAoZ3N0X211bHRpcGFydF9tdXhfY29sbGVjdGVkKToKKwkgIEZpeCB0aW1lc3RhbXBzIG9uIG91dGdvaW5nIGJ1ZmZlcnMuCisKKzIwMDctMDUtMDMgMTQ6Mzk6MDkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IEVtaXQgTkVXU0VHTUVOVCBldmVudHMgYmVmb3JlIHB1c2hpbmcgdGhlIGZpcnN0IGJ1ZmZlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSAgKGdzdF9tdWx0aXBhcnRfbXV4X3JlcXVlc3RfbmV3X3BhZCksIChnc3RfbXVsdGlwYXJ0X211eF9jb2xsZWN0ZWQpLAorCSAgKGdzdF9tdWx0aXBhcnRfbXV4X2NoYW5nZV9zdGF0ZSk6CisJICBFbWl0IE5FV1NFR01FTlQgZXZlbnRzIGJlZm9yZSBwdXNoaW5nIHRoZSBmaXJzdCBidWZmZXIuCisKKzIwMDctMDUtMDMgMTM6NDg6NTQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogUmVmYWN0b3IgdHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24gY29kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19maW5hbGl6ZSksCisJICAoZ3N0X3J0c3BzcmNfYWxsb2NfdWRwX3BvcnRzKSwgKGdzdF9ydHNwc3JjX2hhbmRsZV9zcmNfZXZlbnQpLAorCSAgKGdzdF9ydHNwc3JjX2hhbmRsZV9zcmNfcXVlcnkpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfbWFuYWdlciksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWVfdWRwKSwgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdGNwKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX21jYXN0KSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3VkcCksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV91ZHBfc2luayksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90cmFuc3BvcnQpLCAoZ3N0X3J0c3BzcmNfcHVzaF9ldmVudCksCisJICAoZ3N0X3J0c3BzcmNfbG9vcF91ZHApLCAoZ3N0X3J0c3BzcmNfb3BlbiksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfcnRwaW5mbyksIChnc3RfcnRzcHNyY19wbGF5KSwKKwkgIChnc3RfcnRzcHNyY19wYXVzZSk6CisJICBSZWZhY3RvciB0cmFuc3BvcnQgY29uZmlndXJhdGlvbiBjb2RlLgorCSAgQ3JlYXRlIGludGVybmFsIHBhZHMgZm9yIFRDUCB0cmFuc3BvcnQgc28gdGhhdCB3ZSBjYW4gaW1wbGVtZW50IGV2ZW50cworCSAgYW5kIHF1ZXJpZXMuCisJICBIYW5kbGUgZXZlbnRzIGFuZCBxdWVyaWVzLgorCSAgUGFyc2UgcmFuZ2UgZnJvbSB0aGUgU0RQLgorCSAgRml4IHJhY2UgaW4gcGF1c2UgaGFuZGxlciB3aGVyZSB0aGUgY29ubmVjdGlvbiBjb3VsZCBzdGlsbCBiZSBmbHVzaGluZy4KKworMjAwNy0wNS0wMiAxOTozMjo1OCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy4qOiBGaXggcmFjZSB3aGVuIG11bHRpcGxlIHVkcCBzb3VyY2VzIHBvc3QgdGltZW91dHMsIGp1c3QgYWN0IG9uIHRoZSBmaXJzdCByZWNlaXZlZCB0aW1lb3V0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2luaXQpLAorCSAgKGdzdF9ydHNwc3JjX2ZpbmFsaXplKSwgKG5ld19zZXNzaW9uX3BhZCksIChyZXF1ZXN0X3B0X21hcCksCisJICAoZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCksIChnc3RfcnRzcHNyY190cnlfc2VuZCksCisJICAoZ3N0X3J0c3BzcmNfc2VuZCksIChnc3RfcnRzcHNyY19hc3luY19vcGVuKSwgKGdzdF9ydHNwc3JjX2Nsb3NlKSwKKwkgIChnc3RfcnRzcHNyY19wbGF5KSwgKGdzdF9ydHNwc3JjX2hhbmRsZV9tZXNzYWdlKSwKKwkgIChnc3RfcnRzcHNyY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBGaXggcmFjZSB3aGVuIG11bHRpcGxlIHVkcCBzb3VyY2VzIHBvc3QgdGltZW91dHMsIGp1c3QgYWN0IG9uIHRoZSBmaXJzdAorCSAgcmVjZWl2ZWQgdGltZW91dC4KKwkgIFByb3RlY3Qgc3RyZWFtIGxpc3Qgd2l0aCBhIHJlY3Vyc2l2ZSBsb2NrIHRvIGZpeCBzb21lIHJhY2VzLgorCSAgRmx1c2ggY29ubmVjdGlvbiB3aGVuIHdlIG5lZWQgdG8gZG8gYSByZWNvbm5lY3Qgb3Igc3RvcC4KKwkgIE1ha2Ugc3RhdGUgbG9jayByZWN1cnNpdmUuCisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fY29ubmVjdCksCisJICAocnRzcF9jb25uZWN0aW9uX2Nsb3NlKToKKwkgIFNvbWUgc21hbGwgY2xlYW51cHMuCisKKzIwMDctMDUtMDIgMTg6MzE6MTYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFjay5jOiBDYWxsIGJpbmR0ZXh0ZG9tYWluKCkgdG8gZ2V0IGxvY2FsaXplZCBzdHJpbmdzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2suYzogKHBsdWdpbl9pbml0KToKKwkgIENhbGwgYmluZHRleHRkb21haW4oKSB0byBnZXQgbG9jYWxpemVkIHN0cmluZ3MuCisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogKGdzdF93YXZwYWNrX2RlY19jaGFpbik6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiAoZ3N0X3dhdnBhY2tfcGFyc2VfcmVzZXQpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2hhbmRsZV9zZWVrX2V2ZW50KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9wdXNoX2J1ZmZlciksIChnc3Rfd2F2cGFja19wYXJzZV9jaGFpbik6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5oOgorCSAgSGFuZGxlIERJU0NPTlQgYnVmZmVycyBieSBjb3JyZWN0bHkgc2V0dGluZyB0aGUgRElTQ09OVCBmbGFnCisJICBvbiBvdXRnb2luZyBidWZmZXJzIHdoZW4gbmVjZXNzYXJ5LgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogKGdzdF93YXZwYWNrX3BhcnNlX2hhbmRsZV9zZWVrX2V2ZW50KQorCSAgU2VuZCBuZXdzZWdtZW50IGZyb20gdGhlIHN0cmVhbWluZyB0aHJlYWQuCisKKzIwMDctMDUtMDIgMTg6MjU6MDkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBPbmx5IHNldCBESVNDT05UIHdoZW4gdGhlcmUgYWN0dWFsbHkgaXMgYSBkaXNjb250IG9yIHdoZW4gd2UganVzdCBzdGFydGVkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSk6CisJICBPbmx5IHNldCBESVNDT05UIHdoZW4gdGhlcmUgYWN0dWFsbHkgaXMgYSBkaXNjb250IG9yIHdoZW4gd2UganVzdAorCSAgc3RhcnRlZC4KKworMjAwNy0wNS0wMiAxODowMTo1MiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvZmxhYy9nc3RmbGFjLmM6IENhbGwgYmluZHRleHRkb21haW4oKSB0byBnZXQgbG9jYWxpemVkIHN0cmluZ3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhYy5jOiAocGx1Z2luX2luaXQpOgorCSAgQ2FsbCBiaW5kdGV4dGRvbWFpbigpIHRvIGdldCBsb2NhbGl6ZWQgc3RyaW5ncy4KKworMjAwNy0wNS0wMiAxNzoxOTozNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLio6IEJlIGEgYml0IG1vcmUgY2xldmVyIHdoZW4gZGVhbGluZyB3aXRoIFZCUiBmaWxlcyB3aXRoIEZBQ1QgdGFncywgd2UgZG9uJ3Qgd2FudCB0byB0aW1lc3RhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpLCAoZ3N0X3dhdnBhcnNlX2FkZF9zcmNfcGFkKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwkgIEJlIGEgYml0IG1vcmUgY2xldmVyIHdoZW4gZGVhbGluZyB3aXRoIFZCUiBmaWxlcyB3aXRoIEZBQ1QgdGFncywgd2UKKwkgIGRvbid0IHdhbnQgdG8gdGltZXN0YW1wIGJ1ZmZlcnMgaW4gdGhhdCBjYXNlIGJ1dCB0aGUgZXN0aW1hdGVkIEJQUyBjYW4KKwkgIGJlIHVzZWQgZm9yIHNlZWtpbmcuCisJICBPbmx5IHNlbmQgY2xvc2Ugc2VnbWVudCBpbiB0aGUgc3RyZWFtaW5nIHRocmVhZC4KKworMjAwNy0wNS0wMiAxNzowODowOSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IENvcnJlY3RseSBwb3N0IGFuIGVycm9yIG9uIHRoZSBidXMgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcgaW4gdGhlIGxvb3AgZnVuY3Rpb24uIFRoaXMgZml4ZXMgYSAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfbG9vcCk6CisJICBDb3JyZWN0bHkgcG9zdCBhbiBlcnJvciBvbiB0aGUgYnVzIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nIGluIHRoZSBsb29wCisJICBmdW5jdGlvbi4gVGhpcyBmaXhlcyBhIGZldyBjYXNlcyB3aGVyZSB0aGUgdGFzayB3YXMgcGF1c2VkIGFuZCBub3RoaW5nCisJICBoYXBwZW5lZCBhbnltb3JlLgorCisyMDA3LTA1LTAyIDE2OjU4OjA2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiBSZW1vdmUgb2xkIHdvcmthcm91bmQgdGhhdCB3YXMgbmVlZGVkIHdoZW4gc2Vla2luZyBhZnRlciB0aGUgbGFzdCBzYW1wbGUuIFdpdGggdGhlIGZpeC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2hhbmRsZV9zZWVrX2V2ZW50KToKKwkgIFJlbW92ZSBvbGQgd29ya2Fyb3VuZCB0aGF0IHdhcyBuZWVkZWQgd2hlbiBzZWVraW5nIGFmdGVyIHRoZSBsYXN0CisJICBzYW1wbGUuIFdpdGggdGhlIGZpeGVkIGVycm9yIGhhbmRsaW5nIHRoaXMgd29ya3Mgbm93IGFzIGV4cGVjdGVkCisJICB3aXRob3V0IHB1c2hpbmcgdGhlIGxhc3Qgc2FtcGxlIGFsdGhvdWdoIGl0IHdhc24ndCByZXF1ZXN0ZWQuCisKKzIwMDctMDUtMDIgMTY6NDU6NDMgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IEhhbmRsZSBzZWdtZW50IHNlZWtzIGluIHRoZSBzZWVrIGV2ZW50IGhhbmRsZXIsIGNvcnJlY3RseSB3b3JrIHdpdGggc3RvcCBwb3NpdGlvbiA9PSAtLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6CisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfaGFuZGxlX3NlZWtfZXZlbnQpOgorCSAgSGFuZGxlIHNlZ21lbnQgc2Vla3MgaW4gdGhlIHNlZWsgZXZlbnQgaGFuZGxlciwgY29ycmVjdGx5IHdvcmsgd2l0aAorCSAgc3RvcCBwb3NpdGlvbiA9PSAtMSBhbmQgaW5zdGVhZCBvZiBzdG9wcGluZyB0aGUgdGFzayBvbiBzZWVrIGp1c3QKKwkgIHBhdXNlIGl0LgorCisyMDA3LTA1LTAyIDE2OjE5OjU4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiBBZGQgaGFuZGxpbmcgZm9yIHNlZ21lbnQgc2Vla3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9sb29wKToKKwkgIEFkZCBoYW5kbGluZyBmb3Igc2VnbWVudCBzZWVrcy4KKworMjAwNy0wNS0wMiAxNToxMzowNCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogQ29ycmVjdGx5IGhhbmRsZSBlcnJvcnMsIGVzcGVjaWFsbHkgaW4gdGhlIGxvb3AgZnVuY3Rpb24uIEJlZm9yZSBpdCB3YXMgZWFzeSB0byBnZXQgdGguLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogKGdzdF93YXZwYWNrX3BhcnNlX3B1bGxfYnVmZmVyKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9jcmVhdGVfc3JjX3BhZCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfcmVzeW5jX2xvb3ApLCAoZ3N0X3dhdnBhY2tfcGFyc2VfbG9vcCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfY2hhaW4pOgorCSAgQ29ycmVjdGx5IGhhbmRsZSBlcnJvcnMsIGVzcGVjaWFsbHkgaW4gdGhlIGxvb3AgZnVuY3Rpb24uIEJlZm9yZSBpdAorCSAgd2FzIGVhc3kgdG8gZ2V0IHRoZSB0YXNrIHBhdXNlZCBidXQgbm8gZXJyb3IgYmVpbmcgcG9zdGVkIG9uIHRoZSBidXMuCisKKzIwMDctMDUtMDIgMTQ6Mjc6MjggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL3Rlc3QuYzogRml4IGNvbXBpbGF0aW9uIG9mIGRlcHJlY2F0ZWQgdGVzdCBqdXN0IGJlY2F1c2UgSSdtIHRvbyBsYXp5IHRvIGRlbGV0ZSBpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC90ZXN0LmM6IChtYWluKToKKwkgIEZpeCBjb21waWxhdGlvbiBvZiBkZXByZWNhdGVkIHRlc3QganVzdCBiZWNhdXNlIEknbSB0b28gbGF6eSB0byBkZWxldGUKKwkgIGl0LgorCisyMDA3LTA1LTAyIDEzOjMyOjU3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLio6IEZpeCBzZW5kaW5nIFJUQ1AgdG8gdGhlIHJpZ2h0IHBsYWNlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2luaXQpLAorCSAgKGdzdF9ydHNwc3JjX2ZpbmFsaXplKSwgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwKKwkgIChnc3RfcnRzcHNyY19oYW5kbGVfcmVxdWVzdCksIChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKSwKKwkgIChnc3RfcnRzcHNyY19zZW5kX2tlZXBfYWxpdmUpLCAoZ3N0X3J0c3BzcmNfbG9vcF91ZHApLAorCSAgKGdzdF9ydHNwc3JjX2xvb3Bfc2VuZF9jbWQpLCAoZ3N0X3J0c3BzcmNfdHJ5X3NlbmQpLAorCSAgKGdzdF9ydHNwc3JjX29wZW4pLCAoZ3N0X3J0c3BzcmNfaGFuZGxlX21lc3NhZ2UpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBGaXggc2VuZGluZyBSVENQIHRvIHRoZSByaWdodCBwbGFjZS4KKwkgIEZpeCBidWcgaW4gcmVmZmluZyB0aGUgd3JvbmcgVURQIGVsZW1lbnQuCisJICBVc2UgbmV3IHBhZCBuYW1lcyBmb3IgdGhlIHNlc3Npb24gbWFuYWdlci4KKwkgIEltcGxlbWVudCBoYW5kbGluZyBzZXJ2ZXIgcmVxdWVzdHMgaW4gaW50ZXJsZWF2ZWQgYW5kIFVEUCBtb2Rlcy4KKwkgIEhhbmRsZSBzZXNzaW9uIGtlZXAtYWxpdmUgaW4gVURQIG1vZGVzLgorCSAgUmVtb3ZlIEdDb25kIGZvciBoYW5kbGluZyBVRFAgdGltZW91dHMuCisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fY29ubmVjdCksCisJICAocnRzcF9jb25uZWN0aW9uX3NlbmQpLCAocnRzcF9jb25uZWN0aW9uX3JlYWQpLCAocmVhZF9ib2R5KSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fcmVjZWl2ZSksIChydHNwX2Nvbm5lY3Rpb25fY2xvc2UpOgorCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5oOgorCSAgU3RvcmUgY29ubmVjdGlvbiBJUCBhZGRyZXNzIGZvciBsYXRlci4KKwkgIEFkZCB0aW1lb3V0IGFyZ3MgdG8gYWxsIG9wZXJhdGlvbnMgdGhhdCBtaWdodCBibG9jayBmb3JldmVyLgorCSAgUGFyc2Ugc2Vzc2lvbiB0aW1lb3V0LgorCSAgT25seSBjbG9zZSBzb2NrZXRzIHdoZW4gbm90IGFscmVhZHkgY2xvc2VkLgorCSAgKiBnc3QvcnRzcC9ydHNwZGVmcy5jOgorCSAgKiBnc3QvcnRzcC9ydHNwZGVmcy5oOgorCSAgQWRkIHRpbWVvdXQgcmV0dXJuIHZhbHVlIGFuZCBlcnJvciBzdHJpbmcuCisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmM6IChydHNwX21lc3NhZ2VfaW5pdF9yZXNwb25zZSk6CisJICBBZGQgc21hbGwgY29tbWVudC4KKworMjAwNy0wNS0wMSAxNjoxMzo1OCArMDAwMCAgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorCisJICBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuKjogSGFuZGxlIE5FV1NFR01FTlQgYW5kIEZMVVNIIGV2ZW50cy4gRml4ZXMgIzQzNDgyNC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFNqb2VyZCBTaW1vbnMgPHNqb2VyZCBhdCBsdW9uIGRvdCBuZXQ+CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOiAoZ3N0X3J0cF9tcDR2X3BheV9pbml0KSwKKwkgIChnc3RfcnRwX21wNHZfcGF5X2VtcHR5KSwgKGdzdF9ydHBfbXA0dl9wYXlfZXZlbnQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuaDoKKwkgIEhhbmRsZSBORVdTRUdNRU5UIGFuZCBGTFVTSCBldmVudHMuIEZpeGVzICM0MzQ4MjQuCisKKzIwMDctMDQtMzAgMTE6MTU6NTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOiBSZW1vdmUgdjRsMnNyYyBmcm9tIGRvY3MsIHNpbmNlIGl0IGJyZWFrcyB0aGUgZG9jcyBidWlsZCwgYW5kIHRoZSBwbC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgUmVtb3ZlIHY0bDJzcmMgZnJvbSBkb2NzLCBzaW5jZSBpdCBicmVha3MgdGhlIGRvY3MgYnVpbGQsIGFuZCB0aGUKKwkgIHBsdWdpbiBpcyBvbmx5IGJ1aWx0IGlmIC0tZW5hYmxlLWV4cGVyaW1lbnRhbCBpcyB1c2VkIGFueXdheS4KKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgU3BhY2VzID0+IHRhYi4KKworMjAwNy0wNC0yOSAxNDo0MzozNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogQWRkIGNvZGUgdG8gZHJvcCBtZW1iZXJzaGlwIG9mIGEgbXVsdGljYXN0IGdyb3VwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChsZWF2ZV9tdWx0aWNhc3QpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfYWRkKSwgKGdzdF9tdWx0aXVkcHNpbmtfcmVtb3ZlKToKKwkgIEFkZCBjb2RlIHRvIGRyb3AgbWVtYmVyc2hpcCBvZiBhIG11bHRpY2FzdCBncm91cC4KKwkgICogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6IChnc3RfdWRwc2lua191cGRhdGVfdXJpKSwKKwkgIChnc3RfdWRwc2lua19zZXRfdXJpKToKKwkgIEltcGxlbWVudCBVUkkgaGFuZGxlci4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90cmFuc3BvcnQpLAorCSAgKGdzdF9ydHNwc3JjX3BhcnNlX3J0cGluZm8pOgorCSAgVXNlIFVSSSBoYW5kbGVyIHRvIG1ha2UgdWRwc2luayBpbnN0YWNlLgorCSAgSW1wcm92ZSBjb2RlIHRvIGNvbmZpZ3VyZSBwb3J0IGFuZCBkZXN0aW5hdGlvbi4KKworMjAwNy0wNC0yOSAxMzo1NjoxOCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICA4MCBjaGFyIHBvbGljZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICA4MCBjaGFyIHBvbGljZQorCisyMDA3LTA0LTI5IDEzOjUzOjE2ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgYXV0b2dlbi5zaDogUmVxdWlyZSBhdXRvbWFrZSAxLjcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBhdXRvZ2VuLnNoOgorCSAgUmVxdWlyZSBhdXRvbWFrZSAxLjcKKwkgICogZXh0L2Fsc2FzcGRpZi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2RpdngvTWFrZWZpbGUuYW06CisJICAqIGV4dC9pdm9yYmlzL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbXVzaWNicmFpbnovTWFrZWZpbGUuYW06CisJICAqIGV4dC9uZW9uL01ha2VmaWxlLmFtOgorCSAgKiBleHQvc2RsL01ha2VmaWxlLmFtOgorCSAgKiBleHQvc3dmZGVjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGhlb3JhL01ha2VmaWxlLmFtOgorCSAgKiBleHQvd2F2cGFjay9NYWtlZmlsZS5hbToKKwkgICogZXh0L3h2aWQvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tb2RwbHVnL01ha2VmaWxlLmFtOgorCSAgRml4IHVwIE1ha2VmaWxlLmFtIGFjY29yZGluZ2x5LgorCisyMDA3LTA0LTI5IDEzOjQ5OjAyICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgZG9jcy9wbHVnaW5zL2luc3BlY3QvOiBBZGQgamFjayBhbmQgdXBkYXRlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHNhc3BkaWYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYnoyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkeGFwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZmJ2aWRlb3NpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmFhYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mYWFkLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZpbHRlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mcmVlemUueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2xpbWFnZXNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ3NtLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWgyNjRwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qYWNrLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1tcy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb2RwbHVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11c2VwYWNrLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11c2ljYnJhaW56LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5lb24ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbnNmZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2RsLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdW5kdG91Y2gueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZWQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdHRhLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbmdoZWFkZXIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teHZpZC54bWw6CisJICBBZGQgamFjayBhbmQgdXBkYXRlLgorCisyMDA3LTA0LTI5IDEyOjE5OjIxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiBGaXggbXVsdGljYXN0IGRldGVjdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19hZGQpOgorCSAgRml4IG11bHRpY2FzdCBkZXRlY3Rpb24uCisJICBEb24ndCB0cnkgdG8gam9pbiBhIG11bHRpY2FzdCBncm91cCBpZiB0aGUgYWRkcmVzcyBpcyBub3QgbXVsdGljYXN0LgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY191cGRhdGVfdXJpKToKKwkgIFNtYWxsIGRlYnVnIGltcHJvdmVtZW50LgorCisyMDA3LTA0LTI3IDE2OjQ0OjE3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IElnbm9yZSBBU1lOQyBzdGF0ZSBtZXNzYWdlcyBmcm9tIHRoZSB1ZHBzaW5rLCBpdCdzIGlycmVsZXZhbnQgZm9yIHRoZSBwYXJlbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90cmFuc3BvcnQpLAorCSAgKGdzdF9ydHNwc3JjX3BhcnNlX3J0cGluZm8pLCAoZ3N0X3J0c3BzcmNfcGxheSksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX21lc3NhZ2UpOgorCSAgSWdub3JlIEFTWU5DIHN0YXRlIG1lc3NhZ2VzIGZyb20gdGhlIHVkcHNpbmssIGl0J3MgaXJyZWxldmFudCBmb3IgdGhlCisJICBwYXJlbnQuCisKKzIwMDctMDQtMjcgMTU6MzA6MzkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5Lmg6IEZpeCBtb2RlIHByb3BlcnR5IHdoZW4gc3BlY2lmaWVkIGFzIGFuIGFyZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5oOgorCSAgRml4IG1vZGUgcHJvcGVydHkgd2hlbiBzcGVjaWZpZWQgYXMgYW4gYXJnLgorCisyMDA3LTA0LTI2IDE1OjA4OjIwICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBkb2NzL3BsdWdpbnMvOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3Igb3N4YXVkaW8gcGx1Z2luLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3hhdWRpby54bWw6CisJICBBZGQgZG9jdW1lbnRhdGlvbiBmb3Igb3N4YXVkaW8gcGx1Z2luLgorCisyMDA3LTA0LTI2IDE0OjMxOjMyICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBkb2NzL3BsdWdpbnMvOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3Igb3N4dmlkZW8KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3N4dmlkZW8ueG1sOgorCSAgQWRkIGRvY3VtZW50YXRpb24gZm9yIG9zeHZpZGVvCisKKzIwMDctMDQtMjYgMTA6MDg6MjcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuKjogUHJvdGVjdCBzdGF0ZSBjaGFuZ2VzIHdpdGggYSBsb2NrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2luaXQpLAorCSAgKGdzdF9ydHNwc3JjX2ZpbmFsaXplKSwgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwKKwkgIChnc3RfcnRzcHNyY19vcGVuKSwgKGdzdF9ydHNwc3JjX2Nsb3NlKSwKKwkgIChnc3RfcnRzcHNyY19wYXJzZV9ydHBpbmZvKSwgKGdzdF9ydHNwc3JjX3BsYXkpLAorCSAgKGdzdF9ydHNwc3JjX3BhdXNlKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgUHJvdGVjdCBzdGF0ZSBjaGFuZ2VzIHdpdGggYSBsb2NrLgorCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiAocnRzcF9jb25uZWN0aW9uX2NyZWF0ZSksCisJICAocGFyc2VfbGluZSk6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmg6CisJICBSZW1vdmUgc29tZSB1bnVzZWQgc3R1ZmYuCisKKzIwMDctMDQtMjYgMDg6NDg6MzAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGVyZSBhcmUgZXhhY3RseSAwIGJ5dGVzIHRvIHJlYWQgYW5kIHRoZSBpb2N0bCBkaWQgbm90IHJlcG9ydCBhbiBlcnJvci4gRi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2NyZWF0ZSk6CisJICBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgYXJlIGV4YWN0bHkgMCBieXRlcyB0byByZWFkIGFuZCB0aGUgaW9jdGwKKwkgIGRpZCBub3QgcmVwb3J0IGFuIGVycm9yLiBGaXhlcyAjNDMzNTMwLgorCisyMDA3LTA0LTI2IDA4OjM5OjQ5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuKjogQXBwbHkgRElTQ09OVCB0byBidWZmZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSk6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oOgorCSAgQXBwbHkgRElTQ09OVCB0byBidWZmZXJzLgorCSAgT25seSBhcHBseSB0aW1lc3RhbXAgdG8gdGhlIGZpcnN0IHNhbXBsZSBhZnRlciBhIERJU0NPTlQsIHRvbyBtYW55IFZCUgorCSAgZmlsZXMgY2F1c2UgcmFuZG9tIGppdHRlciBpbiB0aGUgdGltZXN0YW1wcy4gRml4ZXMgIzQzMzExOS4KKworMjAwNy0wNC0yNSAxNTo1NTozMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRwZGVjLio6IEFkZCBkdW1teSBsYXRlbmN5IHByb3BlcnR5IHRvIGJlIGJhY2t3YXJkcyBjb21wYXQgd2l0aCBydHBiaW4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRwZGVjLmM6IChnc3RfcnRwX2RlY19jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX2RlY19pbml0KSwgKGdzdF9ydHBfZGVjX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9kZWNfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3J0c3AvZ3N0cnRwZGVjLmg6CisJICBBZGQgZHVtbXkgbGF0ZW5jeSBwcm9wZXJ0eSB0byBiZSBiYWNrd2FyZHMgY29tcGF0IHdpdGggcnRwYmluLgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfcnRzcHNyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3J0c3BzcmNfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfcnRwaW5mbyk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIEFkZCBsYXRlbmN5IHByb3BlcnR5IGFuZCBjb25maWd1cmUgaW4gdGhlIHNlc3Npb24gbWFuYWdlci4KKwkgIERvbid0IHNldCBpbnZhbGlkIGNsb2NrLWJhc2UgYW5kIHNlcW51bS1iYXNlIG9uIGNhcHMsIHNvbWUgc2VydmVycworCSAgc29tZXRpbWVzIGRvbid0IHNlbmQgdGhlbS4KKworMjAwNy0wNC0yNSAxNTozMTo1MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzogRG91YmxlLWNoZWNrIHRoYXQgUkdCIGlucHV0IGNhcHMgYXJlIHJlYWxseSBSR0JBIGNhcHMgKGFwcGFyZW50bHkgdGhlIGNvcmUgZG9lc24ndCBhbHdheXMgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzogKGdzdF9hbHBoYV9jb2xvcl9iYXNlX2luaXQpLAorCSAgKGdzdF9hbHBoYV9jb2xvcl90cmFuc2Zvcm1fY2FwcyksIChnc3RfYWxwaGFfY29sb3Jfc2V0X2NhcHMpOgorCSAgRG91YmxlLWNoZWNrIHRoYXQgUkdCIGlucHV0IGNhcHMgYXJlIHJlYWxseSBSR0JBIGNhcHMgKGFwcGFyZW50bHkKKwkgIHRoZSBjb3JlIGRvZXNuJ3QgYWx3YXlzIGNhdGNoIGl0IGlmIHRob3NlIGNhcHMgYXJlbid0IGEgc3Vic2V0IG9mCisJICBvdXIgdGVtcGxhdGUgY2FwcywgYWxzbyBzZWUgIzQyMTU0MykuIEZpeGVzICM0MjkzMTkgaW4gYSB3YXkuCisJICBBbHNvLCBkb24ndCBsZWFrIHRoZSBwYWQgdGVtcGxhdGUgaW4gdGhlIHRyYW5zZm9ybV9jYXBzIGZ1bmN0aW9uLgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYWxwaGFjb2xvci5jOiAoc2V0dXBfYWxwaGFjb2xvciksCisJICAoY2xlYW51cF9hbHBoYWNvbG9yKSwgKGNyZWF0ZV9jYXBzX3JnYjI0KSwgKGNyZWF0ZV9jYXBzX3JnYmEzMiksCisJICAoY3JlYXRlX2J1ZmZlcl9yZ2IyNF8zeDQpLCAoY3JlYXRlX2J1ZmZlcl9yZ2JhMzJfM3g0KSwKKwkgIChHU1RfU1RBUlRfVEVTVCksIChhbHBoYWNvbG9yX3N1aXRlKToKKwkgIEFkZCBzb21lIGJhc2ljIHVuaXQgdGVzdHMgZm9yIGFscGhhY29sb3IuCisKKzIwMDctMDQtMjUgMTU6MDg6MjIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IElmIHdlIGdldCBhIGZhdGFsIGZsb3cgcmV0dXJuIGluIHRoZSBsb29wIGZ1bmN0aW9uLCBmaXJzdCBwb3N0IHRoZSBlcnJvciBtZXNzYWdlIGFuZCBvbmx5IHRoZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IChnc3RfcG5nZGVjX3Rhc2spOgorCSAgSWYgd2UgZ2V0IGEgZmF0YWwgZmxvdyByZXR1cm4gaW4gdGhlIGxvb3AgZnVuY3Rpb24sIGZpcnN0IHBvc3QgdGhlCisJICBlcnJvciBtZXNzYWdlIGFuZCBvbmx5IHRoZW4gc2VuZCB0aGUgRU9TIGV2ZW50IGRvd25zdHJlYW0sIG90aGVyd2lzZQorCSAgYXBwbGljYXRpb25zIG1pZ2h0IGdldCBhbiBlb3MgbWVzc2FnZSBiZWZvcmUgdGhlIGVycm9yIG1lc3NhZ2UgYW5kCisJICB0aGluayBldmVyeXRoaW5nIHdhcyBvayAocmVsYXRlZCB0byAjNDI5MzE5KS4KKworMjAwNy0wNC0yNSAxMDowNzoxMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogUmVhZCB0aGUgY2hhbm5lbCBieXRlIGFzIGFuIHVuc2lnbmVkIGJ5dGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJ0c3BfY29ubmVjdGlvbl9yZWNlaXZlKToKKwkgIFJlYWQgdGhlIGNoYW5uZWwgYnl0ZSBhcyBhbiB1bnNpZ25lZCBieXRlLgorCisyMDA3LTA0LTI1IDA5OjQ3OjQ4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogTWFrZSBzdXJlIHdlIGNvbmZpZ3VyZSB0aGUgY2xvY2tfcmF0ZSBpbiB0aGUgYmFzZWNsYXNzIGluIHRoZSBzZXRjYXBzIGZ1bmN0aW9uLiBGaXhlcyAjNDMxMjgyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzogKGdzdF9ydHBfTDE2X2RlcGF5X3NldF9wcm9wZXJ0eSk6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzogKGdzdF9ydHBfYW1yX2RlcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfYW1yX2RlcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9hbXJfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuYzogKGdzdF9ydHBfZ3NtX2RlcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfZ3NtX2RlcGF5X3NldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzogKGdzdF9ydHBfaDI2M3BfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6IChnc3RfcnRwX2gyNjRfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6IChnc3RfcnRwX2lsYmNfZGVwYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9pbGJjX2RlcGF5X2luaXQpLCAoZ3N0X3J0cF9pbGJjX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfaWxiY19kZXBheV9wcm9jZXNzKSwgKGdzdF9pbGJjX2RlcGF5X3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2lsYmNfZGVwYXlfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYzogKGdzdF9ydHBfbXAydF9kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzogKGdzdF9ydHBfcGNtYV9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX3BjbWFfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmM6IChnc3RfcnRwX3BjbXVfZGVwYXlfaW5pdCksCisJICAoZ3N0X3J0cF9wY211X2RlcGF5X3NldGNhcHMpOgorCSAgTWFrZSBzdXJlIHdlIGNvbmZpZ3VyZSB0aGUgY2xvY2tfcmF0ZSBpbiB0aGUgYmFzZWNsYXNzIGluIHRoZSBzZXRjYXBzCisJICBmdW5jdGlvbi4gRml4ZXMgIzQzMTI4Mi4KKworMjAwNy0wNC0yNSAwODozNjo0NiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy4qOiBQYXJzZSBzZXJ2ZXIgYWRkcmVzcyBmcm9tIFNEUC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19maW5hbGl6ZSksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWUpLCAocmVxdWVzdF9wdF9tYXApLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwgKGdzdF9ydHNwc3JjX29wZW4pOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBQYXJzZSBzZXJ2ZXIgYWRkcmVzcyBmcm9tIFNEUC4KKwkgIEhvb2sgdXAgYSB1ZHBzaW5rIHRvIHNlbmQgUlRDUCBiYWNrIHRvIHRoZSBzZXJ2ZXIuCisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0Lmg6CisJICBBZGQgc29tZSBkb2NzLgorCisyMDA3LTA0LTI1IDA2OjUyOjA5ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBNYWtlIGhlYWRlciBmaWVsZCBjaGVjayBjb25kaXRpb25hbC4gRml4ZXMgIzQzMzEzNQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKToKKwkgIE1ha2UgaGVhZGVyIGZpZWxkIGNoZWNrIGNvbmRpdGlvbmFsLiBGaXhlcyAjNDMzMTM1CisKKzIwMDctMDQtMjQgMDk6MTI6NDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIEFkZCBtaW5pbWFsIGRvY3MgYmx1cmIgdG8gYWxwaGFjb2xvcjsgc3BsaXQgb3V0IGhlYWRlcnMgaW50byBzZXBhcmF0ZSBoZWFkZXIgZmlsZSBmb3IgZ3RrLWRvYy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSAgKiBnc3QvYWxwaGEvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJICAqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmg6CisJICBBZGQgbWluaW1hbCBkb2NzIGJsdXJiIHRvIGFscGhhY29sb3I7IHNwbGl0IG91dCBoZWFkZXJzIGludG8KKwkgIHNlcGFyYXRlIGhlYWRlciBmaWxlIGZvciBndGstZG9jLgorCisyMDA3LTA0LTIwIDE3OjI1OjUwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvZGVidWcvcHJvZ3Jlc3NyZXBvcnQuYzogRG9uJ3QgdHJ5IHRvIHBvc3QgTlVMTCBtZXNzYWdlIChpbiBjYXNlIHdlIGNhbid0IHF1ZXJ5IHVwc3RyZWFtIHBvc2l0aW9uIG9yIGR1cmF0aW9uKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVidWcvcHJvZ3Jlc3NyZXBvcnQuYzogKGdzdF9wcm9ncmVzc19yZXBvcnRfcmVwb3J0KToKKwkgIERvbid0IHRyeSB0byBwb3N0IE5VTEwgbWVzc2FnZSAoaW4gY2FzZSB3ZSBjYW4ndCBxdWVyeSB1cHN0cmVhbQorCSAgcG9zaXRpb24gb3IgZHVyYXRpb24pLgorCisyMDA3LTA0LTE4IDEyOjM2OjM3ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLio6IEZpeCBzb21lIG9mIHRoZSBtb3N0IG9idmlvdXMgYnVncyBpbiBjdXR0ZXIuIE5vdyBkb2Vzbid0IGxlYWsgZXZlcnl0aGluZyBpZiBpbnB1dCBpcyBzaWxlbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzogKGdzdF9jdXR0ZXJfaW5pdCksIChnc3RfY3V0dGVyX2NoYWluKSwKKwkgIChnc3RfY3V0dGVyX2dldF9jYXBzKToKKwkgICogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuaDoKKwkgIEZpeCBzb21lIG9mIHRoZSBtb3N0IG9idmlvdXMgYnVncyBpbiBjdXR0ZXIuIE5vdyBkb2Vzbid0IGxlYWsKKwkgIGV2ZXJ5dGhpbmcgaWYgaW5wdXQgaXMgc2lsZW50LgorCisyMDA3LTA0LTE4IDA5OjQ4OjI1ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLio6IGV2ZXJ5dGhpbmcgZWxzZSByZXN1bHRzIGluIGEgaW52YWxpZCBibG9jayBhbGlnbiBhbmQgaW52YWxpZCBmaWxlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiAoZ3N0X3dhdmVuY19jcmVhdGVfaGVhZGVyX2J1ZiksCisJICAoZ3N0X3dhdmVuY19zaW5rX3NldGNhcHMpLCAoZ3N0X3dhdmVuY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5oOgorCSAgV2F2IGFwcGFyZW50bHkgb25seSBzdXBwb3J0cyB3aWR0aD09R1NUX1JPVU5EX1VQKGRlcHRoKSwgZXZlcnl0aGluZworCSAgZWxzZSByZXN1bHRzIGluIGEgaW52YWxpZCBibG9jayBhbGlnbiBhbmQgaW52YWxpZCBmaWxlcy4KKworMjAwNy0wNC0xNyAxNjozOTowMiArMDAwMCAgU25haWsgPHNuYWlrMzJAZ21haWwuY29tPgorCisJICBnc3Qvc21wdGUvYmFyYm94d2lwZXMuYzogQWRkIG1pc3NpbmcgYnJlYWsgc3RhdGVtZW50IGZvciBCT1hfSE9SSVpPTlRBTCBjYXNlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU25haWsgPHNuYWlrMzIgZ21haWwgY29tPgorCSAgKiBnc3Qvc21wdGUvYmFyYm94d2lwZXMuYzogKGdzdF93aXBlX2JveGVzX2RyYXcpOgorCSAgQWRkIG1pc3NpbmcgYnJlYWsgc3RhdGVtZW50IGZvciBCT1hfSE9SSVpPTlRBTCBjYXNlLgorCisyMDA3LTA0LTE3IDEwOjE0OjQzICswMDAwICBWaW5jZW50IFRvcnJpIDx2dG9ycmlAdW5pdi1ldnJ5LmZyPgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogVXNlIGNvcnJlY3QgZm9ybWF0IHN0cmluZ3MgZm9yIGludGVnZXIgdHlwZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBWaW5jZW50IFRvcnJpIDx2dG9ycmkgYXQgdW5pdi1ldnJ5IGRvdCBmcj4KKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpOgorCSAgVXNlIGNvcnJlY3QgZm9ybWF0IHN0cmluZ3MgZm9yIGludGVnZXIgdHlwZXMuCisKKzIwMDctMDQtMTcgMDI6NTE6MDIgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IFVzZSBnc3RfcmlmZl9jcmVhdGVfYXVkaW9fdGVtcGxhdGVfY2FwcyAoKSBpbnN0ZWFkIG9mIHRoZSBsb2NhbCBjYXBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2Jhc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhcnNlX2NyZWF0ZV9zb3VyY2VwYWQpOgorCSAgVXNlIGdzdF9yaWZmX2NyZWF0ZV9hdWRpb190ZW1wbGF0ZV9jYXBzICgpIGluc3RlYWQgb2YgdGhlIGxvY2FsIGNhcHMuCisJICBUaGlzIG1ha2VzIHVwZGF0ZXMgb2YgdGhlIGxvY2FsIGNhcHMgdW5lY2Vzc2FyeSB3aGVuZXZlciBsaWJnc3RyaWZmCisJICBnZXRzIHN1cHBvcnQgZm9yIG5ldyBmb3JtYXRzLgorCisyMDA3LTA0LTE2IDIxOjI5OjQwICswMDAwICBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uQHN1bi5jb20+CisKKwkgIHN5cy9zdW5hdWRpby86IEZpeCBhbmQvb3IgdXBkYXRlIGNvcHlyaWdodCBhdHRyaWJ1dGlvbnMgKCM0MzAyMjgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQnJpYW4gQ2FtZXJvbiAgPGJyaWFuLmNhbWVyb24gYXQgc3VuIGRvdCBjb20+CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpby5jOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlci5jOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlci5oOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuYzoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmg6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVydHJhY2suaDoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmg6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuaDoKKwkgIEZpeCBhbmQvb3IgdXBkYXRlIGNvcHlyaWdodCBhdHRyaWJ1dGlvbnMgKCM0MzAyMjgpLgorCisyMDA3LTA0LTE0IDE3OjE4OjE0ICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0LzogQWRkIHhtbCBkb2MgZmlsZXMgZm9yIFdpbmRvd3Mgc2lua3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGlyZWN0ZHJhdy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kaXJlY3Rzb3VuZC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlZm9ybS54bWw6CisJICBBZGQgeG1sIGRvYyBmaWxlcyBmb3IgV2luZG93cyBzaW5rcworCSAgKiB3aW4zMi92czYvbGliZ3N0cXRkZW11eC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RtcGVndmlkZW9wYXJzZS5kc3A6CisJICAqIHdpbjMyL3ZzNi9nc3RfcGx1Z2luc19iYWQuZHN3OgorCSAgVXBkYXRlIHByb2plY3RzIGZpbGVzLgorCisyMDA3LTA0LTEzIDA5OjMyOjIxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDogRml4IGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBGaXggZG9jcy4KKwkgICogZ3N0L3J0c3AvVVJMUzoKKwkgIEFkZCBzb21lIG1vcmUgZXhhbXBsZSB1cmxzLgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuYzogKGdzdF9ydHBfZGVjX21hcnNoYWxfQk9YRURfX1VJTlRfVUlOVCksCisJICAoZ3N0X3J0cF9kZWNfY2hhaW5fcnRwKToKKwkgIEJldHRlciBkZWJ1Z2dpbmcuCisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKHJlcXVlc3RfcHRfbWFwKSwKKwkgIChnc3RfcnRzcHNyY19hY3RpdmF0ZV9zdHJlYW1zKSwgKGdzdF9ydHNwc3JjX2xvb3BfaW50ZXJsZWF2ZWQpLAorCSAgKGdzdF9ydHNwc3JjX3BhcnNlX3J0cGluZm8pOgorCSAgUmVtb3ZlIHVudXNlZCBjb2RlLgorCisyMDA3LTA0LTEzIDA4OjE5OjM1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBSZWxheCB0aGUgYXVkaW8vbXBlZyBjYXBzIGFnYWluIGFuZCBhZGQgRklYTUU6IGNvbW1lbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6ICh1aW50NjRfY2VpbGluZ19zY2FsZV9pbnQpLAorCSAgKGdzdF93YXZwYXJzZV9wZXJmb3JtX3NlZWspLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpOgorCSAgUmVsYXggdGhlIGF1ZGlvL21wZWcgY2FwcyBhZ2FpbiBhbmQgYWRkIEZJWE1FOiBjb21tZW50LgorCisyMDA3LTA0LTEzIDA2OjIwOjI4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS4qOiBNb3JlIHNhbml0eSBjaGVjayBmb3IgdGhlIGhlYWRlciBmaWVsZHMuIEZpeCB0eXBlIGZvciAncmF0ZScgaGVhZGVyIGZpZWxkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAodWludDY0X2NlaWxpbmdfc2NhbGVfaW50KSwKKwkgIChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKToKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICBNb3JlIHNhbml0eSBjaGVjayBmb3IgdGhlIGhlYWRlciBmaWVsZHMuIEZpeCB0eXBlIGZvciAncmF0ZScgaGVhZGVyCisJICBmaWVsZC4KKworMjAwNy0wNC0xMiAxNjowNjozMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6IElmIHRoZSBtZXRhZGF0YSBzdHJpbmdzIHdlIGdldCBpbiB0aGUgc3RyZWFtIGFyZSBub3QgVVRGLTgsIHRyeSB0byBpbnRlcnByZXQgdGhlbSBhY2NvcmRpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6IChub3Rnc3RfdGFnX2ZyZWVmb3JtX3N0cmluZ190b191dGY4KSwKKwkgIChnc3RfaWN5ZGVtdXhfdW5pY29kaWZ5KToKKwkgIElmIHRoZSBtZXRhZGF0YSBzdHJpbmdzIHdlIGdldCBpbiB0aGUgc3RyZWFtIGFyZSBub3QgVVRGLTgsIHRyeSB0bworCSAgaW50ZXJwcmV0IHRoZW0gYWNjb3JkaW5nIHRvIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmdzIHNwZWNpZmllZCBpbiB0aGUKKwkgIEdTVF9JQ1lfVEFHX0VOQ09ESU5HIGFuZCBHU1RfVEFHX0VOQ09ESU5HIGVudmlyb25tZW50IHZhcmlhYmxlcywgYW5kCisJICBvbmx5IGZhbGwgYmFjayB0byBsb2NhbGUvSVNPLTg4NTktMSBpZiB0aG9zZSBhcmVuJ3Qgc2V0IG9yIGRvbid0CisJICB3b3JrLiBTaG91bGQgZml4ICM0Mjg5MDEuCisKKzIwMDctMDQtMTIgMTQ6MjA6NTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6IFVzZSB0aGUgcHJvcGVyIHN5bmMgd29yZCBmb3IgU1BTIGFuZCBQUFMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgIFVzZSB0aGUgcHJvcGVyIHN5bmMgd29yZCBmb3IgU1BTIGFuZCBQUFMuCisKKzIwMDctMDQtMTIgMTE6NDE6MTEgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBnc3QvcnRwL01ha2VmaWxlLmFtOiBnc3QvcnRwL2ZudjFoYXNoLmMgKE1BU0tfMjQsIEZOVjFfSEFTSF8zMl9JTklULCBGTlYxX0hBU0hfMzJfUFJJTUUsIGZudjFfaGFzaF8zMl9uZXcsIGZudjFfaGFzaF8uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwL2ZudjFoYXNoLmMgKE1BU0tfMjQsIEZOVjFfSEFTSF8zMl9JTklULCBGTlYxX0hBU0hfMzJfUFJJTUUsCisJICBmbnYxX2hhc2hfMzJfbmV3LCBmbnYxX2hhc2hfMzJfdXBkYXRlLCBmbnYxX2hhc2hfMzJfdG9fMjQpOgorCSAgKiBnc3QvcnRwL2ZudjFoYXNoLmggKF9fR1NUX0ZOVjFfSEFTSF9IX18pOgorCSAgQWRkIGEgc2ltcGxlIGhhc2hpbmcgaW1wbGVtZW50YXRpb24gdGhhdCB3ZSBjYW4gdXNlIHRvIGdlbmVyYXRlCisJICBhIDI0LWJpdCBpZGVudCB2YWx1ZSBiYXNlZCBvbiB0aGUgY29kZWJvb2tzIGZvciB2b3JiaXMgYW5kIHRoZW9yYS4KKwkgICogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYyAoZ3N0X3J0cF90aGVvcmFfcGF5X2ZpbmlzaF9oZWFkZXJzLAorCSAgZ3N0X3J0cF90aGVvcmFfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmMKKwkgIChnc3RfcnRwX3ZvcmJpc19kZXBheV9wYXJzZV9jb25maWd1cmF0aW9uLAorCSAgZ3N0X3J0cF92b3JiaXNfZGVwYXlfc3dpdGNoX2NvZGVib29rLCBnc3RfcnRwX3ZvcmJpc19kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYyAoZ3N0X3J0cF92b3JiaXNfcGF5X3Jlc2V0X3BhY2tldCwKKwkgIGdzdF9ydHBfdm9yYmlzX3BheV9pbml0X3BhY2tldCwgZ3N0X3J0cF92b3JiaXNfcGF5X2ZsdXNoX3BhY2tldCwKKwkgIGdzdF9ydHBfdm9yYmlzX3BheV9maW5pc2hfaGVhZGVycywgZ3N0X3J0cF92b3JiaXNfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgVXNlIHRoZSBoYXNoaW5nIGZ1bmN0aW9uLCBlbnN1cmluZyB0aGF0IHRoZSBzYW1lIGNvZGVib29rcyByZXN1bHQKKwkgIGluIHRoZSBzYW1lIGlkZW50IGFuZCB0aHVzIHRoZSBzYW1lIFNEUCBkZXNjcmlwdGlvbi4KKwkgIFZhcmlvdXMgbG9nIGZpeGVzL2NoYW5nZXMuCisKKzIwMDctMDQtMTIgMTE6Mzc6NTAgKzAwMDAgIGplcnJ5IHRhbiA8amVycnkudGFuQHN1bi5jb20+CisKKwkgIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOiBpdCBpcyB0aGUgYXBwbGljYXRpb24ncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgaXQgb3BlbiB0aGUgZGV2aWNlIG9uY2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBqZXJyeSB0YW4gPGplcnJ5IGRvdCB0YW4gYXQgc3VuIGRvdCBjb20+CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOiAoZ3N0X3N1bmF1ZGlvc3JjX29wZW4pOgorCSAgcmVtb3ZlIHRoZSBjYWxsIG9mICBpb2N0bCAoZmQsIEFVRElPX01JWEVSX01VTFRJUExFX09QRU4pLCBpdCBpcyB0aGUKKwkgIGFwcGxpY2F0aW9uJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIGl0IG9wZW4gdGhlIGRldmljZSBvbmNlLgorCSAgUmVtb3ZlIGEgY2FyZWxlc3MgZXJyb3IgaWYgQVVESU9ERVYgaXMgc2V0LiBGaXhlcyAjMzkyNjIwLgorCisyMDA3LTA0LTEyIDEwOjUyOjAyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IE1ha2UgdGltZXNjYWxlIDMyIGJpdHMgYWdhaW4gc28gd2UgZG9uJ3Qgc2NyZXcgdXAgdGhlIHB0c19vZmZzZXQgY2FsY3VsYXRpb25zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIE1ha2UgdGltZXNjYWxlIDMyIGJpdHMgYWdhaW4gc28gd2UgZG9uJ3Qgc2NyZXcgdXAgdGhlIHB0c19vZmZzZXQKKwkgIGNhbGN1bGF0aW9ucy4KKworMjAwNy0wNC0xMiAwODoyMToyOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRwZGVjLio6IE1ha2UgYmFja3dhcmQgY29tcGF0IHdpdGggcnRwYmluIGJ5IGFkZGluZyB0aGUgcmVxdWVzdC1wdC1tYXAgc2lnbmFscy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuYzogKGdzdF9ydHBfZGVjX21hcnNoYWxfQk9YRURfX1VJTlRfVUlOVCksCisJICAoZ3N0X3J0cF9kZWNfY2xhc3NfaW5pdCksIChnc3RfcnRwX2RlY19jaGFpbl9ydHApOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuaDoKKwkgIE1ha2UgYmFja3dhcmQgY29tcGF0IHdpdGggcnRwYmluIGJ5IGFkZGluZyB0aGUgcmVxdWVzdC1wdC1tYXAgc2lnbmFscy4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksCisJICAobmV3X3Nlc3Npb25fcGFkKSwgKHJlcXVlc3RfcHRfbWFwKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV9jYXBzKSwKKwkgIChnc3RfcnRzcHNyY19hY3RpdmF0ZV9zdHJlYW1zKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgSW1wbGVtZW50IHJlcXVlc3QtcHQtbWFwIHNpZ25hbHMgaW5zdGVhZCBvZiBzZXR0aW5nIGNhcHMgb24gdGhlIGJ1ZmZlcnMKKwkgIGZvciB0aGUgc2Vzc2lvbiBtYW5hZ2VyLgorCisyMDA3LTA0LTExIDEwOjI1OjI1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdHVkcC5jOiBSZWdpc3RlciBHc3ROZXRCdWZmZXIgaW4gcGx1Z2luX2luaXQgc28gdGhhdCB0aGUgdHlwZSBjYW4gYmUgdXNlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMgd2l0aG91dCByYWNlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdHVkcC5jOiAocGx1Z2luX2luaXQpOgorCSAgUmVnaXN0ZXIgR3N0TmV0QnVmZmVyIGluIHBsdWdpbl9pbml0IHNvIHRoYXQgdGhlIHR5cGUgY2FuIGJlIHVzZWQgZnJvbQorCSAgbXVsdGlwbGUgdGhyZWFkcyB3aXRob3V0IHJhY2VzLgorCisyMDA3LTA0LTExIDEwOjE5OjA2ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIHVwZGF0ZSB0byBzcGVjIGZpbGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdXBkYXRlIHRvIHNwZWMgZmlsZQorCisyMDA3LTA0LTExIDA5OjUzOjM4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC86IEhhbmRsZSB2ZXJzaW9uIDEgbWRoZCBhdG9tcyB0byBnZXQgZXh0ZW5kZWQgcHJlY2lzaW9uIGR1cmF0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9nZXRfZHVyYXRpb24pLAorCSAgKHF0ZGVtdXhfcGFyc2Vfc2FtcGxlcyksIChxdGRlbXV4X3BhcnNlX3NlZ21lbnRzKSwKKwkgIChxdGRlbXV4X3BhcnNlX3RyYWspLCAocXRkZW11eF9wYXJzZV90cmVlKToKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6IChxdGRlbXV4X2R1bXBfbWRoZCk6CisJICBIYW5kbGUgdmVyc2lvbiAxIG1kaGQgYXRvbXMgdG8gZ2V0IGV4dGVuZGVkIHByZWNpc2lvbiBkdXJhdGlvbnMuCisJICBGaXhlcyAjNDI2OTcyLgorCisyMDA3LTA0LTEwIDE3OjA2OjA1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6IEZpeCBkZXBheWxvYWRlciBjbG9ja19yYXRlIGFuZCBzb21lIGNsZWFudXBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzogKGdzdF9ydHBfYW1yX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfYW1yX2RlcGF5X3Byb2Nlc3MpOgorCSAgRml4IGRlcGF5bG9hZGVyIGNsb2NrX3JhdGUgYW5kIHNvbWUgY2xlYW51cHMuCisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6IChnc3RfcnRwX2gyNjRfZGVwYXlfZmluYWxpemUpLAorCSAgKGdzdF9ydHBfaDI2NF9kZXBheV9zZXRjYXBzKSwgKGdzdF9ydHBfaDI2NF9kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuaDoKKwkgIERvbid0IHB1c2ggY29kZWNfZGF0YSBpbiB0aGUgYWRhcHRlciBiZWNhdXNlIGl0IG1pZ2h0IGdldCBmbHVzaGVkIHdoZW4KKwkgIHdlIGdldCBhIGRpc2NvbnQuCisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6IChnc3RfcnRwX21wNGdfZGVwYXlfcHJvY2Vzcyk6CisJICBIYW5kbGUgbXVsdGlwbGUgQVUgcGVyIHBhY2tldC4KKwkgICogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzogKGdzdF9ydHBfc3Yzdl9kZXBheV9wcm9jZXNzKSwKKwkgIChnc3RfcnRwX3N2M3ZfZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgRGlzYWJsZSByYW5rLCB0aGlzIG9uZSBkb2VzIG5vdCB3b3JrLgorCSAgUmVtb3ZlIHRpbWVzdGFtcGluZywgYmFzZSBjbGFzcyBkb2VzIHRoYXQuCisKKzIwMDctMDQtMTAgMTI6MDE6MzMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiBsaW1pdCBjYXBzIHRvIHRoZSBmb3JtYXRzIHdlIGFubm91bmNlIGluIHRoZSB0ZW1wbGF0ZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzogKGdzdF9hdV9wYXJzZV9wYXJzZV9oZWFkZXIpOgorCSAgbGltaXQgY2FwcyB0byB0aGUgZm9ybWF0cyB3ZSBhbm5vdW5jZSBpbiB0aGUgdGVtcGxhdGUKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6ICh1aW50NjRfY2VpbGluZ19zY2FsZV9pbnQpLAorCSAgKGdzdF93YXZwYXJzZV9wZXJmb3JtX3NlZWspLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwKKwkgIChnc3Rfd2F2cGFyc2VfYWRkX3NyY19wYWQpLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKToKKwkgIGZpeCBzb21lIGNyYXNoZXJzL2Fzc2VydHMgd2hlbiBkZWFsaW5nIHdpdGggYnJva2VuIGZpbGVzCisKKzIwMDctMDQtMTAgMTA6MDE6MTQgKzAwMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJICBnc3QvOiBGaXggc29tZSBjb21waWxlciB3YXJuaW5ncy4gRml4ZXMgIzQyODE4Mi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFBldGVyIEtqZWxsZXJzdGVkdCAgPHBraiBhdCBheGlzIGNvbT4KKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9tYXNzYWdlX2luZGV4KToKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOiAoZ3N0X3J0cF9tcDRnX2RlcGF5X3Byb2Nlc3MpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzogKGdzdF9ydHBfc3BlZXhfZGVwYXlfZ2V0X21vZGUpLAorCSAgKGdzdF9ydHBfc3BlZXhfZGVwYXlfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX21lZGlhX3RvX2NhcHMpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwgKGdzdF9ydHNwc3JjX2xvb3BfdWRwKToKKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogKGdzdF9tdWx0aXVkcHNpbmtfaW5pdF9zZW5kKToKKwkgIEZpeCBzb21lIGNvbXBpbGVyIHdhcm5pbmdzLiBGaXhlcyAjNDI4MTgyLgorCisyMDA3LTA0LTA2IDEyOjU0OjE2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC86IE1vcnBoIFJUUERlYyBpbnRvIHNvbWV0aGluZyBjb21wYXRpYmxlIHdpdGggUlRQQmluIGFzIGEgZmFsbGJhY2suCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOiAoZmluZF9zZXNzaW9uX2J5X2lkKSwgKGNyZWF0ZV9zZXNzaW9uKSwKKwkgIChmcmVlX3Nlc3Npb24pLCAoZ3N0X3J0cF9kZWNfYmFzZV9pbml0KSwgKGdzdF9ydHBfZGVjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfZGVjX2luaXQpLCAoZ3N0X3J0cF9kZWNfZmluYWxpemUpLAorCSAgKGdzdF9ydHBfZGVjX3F1ZXJ5X3NyYyksIChnc3RfcnRwX2RlY19jaGFpbl9ydHApLAorCSAgKGdzdF9ydHBfZGVjX2NoYWluX3J0Y3ApLCAoZ3N0X3J0cF9kZWNfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX2RlY19nZXRfcHJvcGVydHkpLCAoZ3N0X3J0cF9kZWNfcHJvdmlkZV9jbG9jayksCisJICAoZ3N0X3J0cF9kZWNfY2hhbmdlX3N0YXRlKSwgKGNyZWF0ZV9yZWN2X3J0cCksIChjcmVhdGVfcmVjdl9ydGNwKSwKKwkgIChjcmVhdGVfcnRjcCksIChnc3RfcnRwX2RlY19yZXF1ZXN0X25ld19wYWQpLAorCSAgKGdzdF9ydHBfZGVjX3JlbGVhc2VfcGFkKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRwZGVjLmg6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3AuYzogKHBsdWdpbl9pbml0KToKKwkgIE1vcnBoIFJUUERlYyBpbnRvIHNvbWV0aGluZyBjb21wYXRpYmxlIHdpdGggUlRQQmluIGFzIGEgZmFsbGJhY2suCisJICBWYXJpb3VzIG90aGVyIHN0eWxlIGZpeGVzLgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChmaW5kX3N0cmVhbV9ieV9pZCksCisJICAoZmluZF9zdHJlYW1fYnlfdWRwc3JjKSwgKGdzdF9ydHNwc3JjX3N0cmVhbV9mcmVlKSwKKwkgIChnc3RfcnRzcHNyY19jbGVhbnVwKSwgKGdzdF9ydHNwc3JjX21lZGlhX3RvX2NhcHMpLAorCSAgKG5ld19zZXNzaW9uX3BhZCksIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksCisJICAoZ3N0X3J0c3BzcmNfYWN0aXZhdGVfc3RyZWFtcyksIChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKSwKKwkgIChnc3RfcnRzcHNyY19sb29wX3VkcCksIChnc3RfcnRzcHNyY19zZXR1cF9hdXRoKSwKKwkgIChnc3RfcnRzcHNyY19oYW5kbGVfbWVzc2FnZSksIChnc3RfcnRzcHNyY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBJbXBsZW1lbnQgUlRQQmluIHNlc3Npb24gbWFuYWdlciBoYW5kbGluZy4KKwkgIERvbid0IHRyeSB0byBhZGQgZW1wdHkgcHJvcGVydGllcyB0byBjYXBzLgorCSAgSW1wbGVtZW50IGZhbGxiYWNrIHNlc3Npb24gbWFuYWdlciwgaGFuZGxpbmcuCisJICBEb24ndCBjb21iaW5lIGVycm9ycyBmcm9tIFJUQ1Agc3RyZWFtcywganVzdCBpZ25vcmUgdGhlbS4KKwkgICogZ3N0L3J0c3AvcnRzcHRyYW5zcG9ydC5jOiAocnRzcF90cmFuc3BvcnRfZ2V0X21hbmFnZXIpOgorCSAgKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0Lmg6CisJICBJbXBsZW1lbnQgZmFsbGJhY2sgc2Vzc2lvbiBtYW5hZ2VyLgorCSAgTWFrZSBSVFBCaW4gdGhlIGRlZmF1bHQgb25lIHdoZW4gYXZhaWxhYmxlLgorCisyMDA3LTA0LTA1IDE1OjA1OjI0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9nc3RydHB4cXRkZXBheS4qOiBUcnkgdG8gcmVjb3ZlciBmcm9tIHBhY2tldCBsb3NzIGEgbGl0dGxlIGJldHRlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9nc3RydHB4cXRkZXBheS5jOiAoZ3N0X3J0cF94cXRfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF94cXRfZGVwYXlfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3F0ZGVtdXgvZ3N0cnRweHF0ZGVwYXkuaDoKKwkgIFRyeSB0byByZWNvdmVyIGZyb20gcGFja2V0IGxvc3MgYSBsaXR0bGUgYmV0dGVyLgorCisyMDA3LTA0LTA1IDEzOjU2OjQ0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5jOiBUaGlzIGVsZW1lbnQgaXMgcmVhZHkgdG8gYmUgYXV0b3BsdWdnZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzogKGdzdF9ydHBfbXA0YV9kZXBheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX21wNGFfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX21wNGFfZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgVGhpcyBlbGVtZW50IGlzIHJlYWR5IHRvIGJlIGF1dG9wbHVnZ2VkLgorCisyMDA3LTA0LTA1IDExOjI2OjI1ICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBEb24ndCBsZWF2ZSB0aGUgb2Zmc2V0cyBkZWZpbmVkIGJ5IHVwc3RyZWFtIGVsZW1lbnQgb24gdGhlIGNvbXByZXNzZWQgZGF0YSBidWZmZXIgd2UgYXJlIHB1c2hpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDctMDQtMDUgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpOgorCSAgRG9uJ3QgbGVhdmUgdGhlIG9mZnNldHMgZGVmaW5lZCBieSB1cHN0cmVhbSBlbGVtZW50IG9uIHRoZQorCSAgY29tcHJlc3NlZCBkYXRhIGJ1ZmZlciB3ZSBhcmUgcHVzaGluZyBkb3duc3RyZWFtLiBNYWtlIHRoZW0KKwkgIEdTVF9CVUZGRVJfT0ZGU0VUX05PTkUuCisKKzIwMDctMDQtMDQgMTI6Mzk6NDEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS86IERvbid0IGFib3J0IG9uIG91dC1vZi1tZW1vcnkuIFVzZSBzdHJlYW0tbnIgYXMgdW5zaWduZWQgaW50ZWdlciBvbmx5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvUkVBRE1FOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLAorCSAgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwgKGdzdF9hdmlfZGVtdXhfcGFyc2VfaW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4KSwgKGdzdF9hdmlfZGVtdXhfc3luYyksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fc2NhbiksIChnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfY2FsY3VsYXRlX2R1cmF0aW9uc19mcm9tX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVzaCksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyX3B1bGwpLCAoZ3N0X2F2aV9kZW11eF9jb21iaW5lX2Zsb3dzKSwKKwkgIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKToKKwkgIERvbid0IGFib3J0IG9uIG91dC1vZi1tZW1vcnkuIFVzZSBzdHJlYW0tbnIgYXMgdW5zaWduZWQgaW50ZWdlciBvbmx5LgorCisyMDA3LTA0LTAzIDA5OjU1OjQ1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3Qvc21wdGUvYmFyYm94d2lwZXMuYzoKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc21wdGUvYmFyYm94d2lwZXMuYzoKKwkgIEZpeCBlcnJvciBhcyBzcG90dGVkIGJ5IFNuYWlrIDxzbmFpazMyIGF0IGdtYWlsIGRvdCBjb20+CisKKzIwMDctMDMtMzAgMTc6MTk6MzQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IFN1cHBvcnQgYXVkaW8veC1yYXctZmxvYXQgaW4gd2F2IGZpbGVzLiBUaGlzIG9ubHkgd29ya3Mgd2l0aCBwbHVnaW5zLWJhc2UgQ1ZTLCB1c2luZyBhbiBvLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBTdXBwb3J0IGF1ZGlvL3gtcmF3LWZsb2F0IGluIHdhdiBmaWxlcy4gVGhpcyBvbmx5IHdvcmtzIHdpdGgKKwkgIHBsdWdpbnMtYmFzZSBDVlMsIHVzaW5nIGFuIG9sZGVyIHZlcnNpb24gZG9lc24ndCBoYXZlIGFueQorCSAgZGlzYWR2YW50YWdlcyB0aG91Z2guCisKKzIwMDctMDMtMzAgMTU6NTk6MjcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgUmV2ZXJ0IGxhc3QgY2hhbmdlIGFzIHdlIGRvbid0IHdhbnQgcGx1Z2lucy1nb29kIHRvIGRlcGVuZCBvbiBwbHVnaW5zLWJhc2UgQ1ZTIG5vdy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzogKGdzdF9hdV9wYXJzZV9yZXNldCksCisJICAoZ3N0X2F1X3BhcnNlX3BhcnNlX2hlYWRlciksIChnc3RfYXVfcGFyc2VfY2hhaW4pOgorCSAgKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmg6CisJICBSZXZlcnQgbGFzdCBjaGFuZ2UgYXMgd2UgZG9uJ3Qgd2FudCBwbHVnaW5zLWdvb2QgdG8gZGVwZW5kIG9uCisJICBwbHVnaW5zLWJhc2UgQ1ZTIG5vdy4KKworMjAwNy0wMy0zMCAwNDo1MDoxMSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay86IERvbid0IHBsYXkgYXVkaW9jb252ZXJ0LiBBcyB3YXZwYWNrIHdhbnRzL291dHB1dHMgYWxsIHNhbXBsZXMgd2l0aCB3aWR0aD09MzIgYW5kIGRlcHRoPVsxLDMyXSBhY2NlcHQgdGguLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfcmVzZXQpLAorCSAgKGdzdF93YXZwYWNrX2RlY19pbml0KSwgKGdzdF93YXZwYWNrX2RlY19zaW5rX3NldF9jYXBzKSwKKwkgIChnc3Rfd2F2cGFja19kZWNfY2xpcF9vdXRnb2luZ19idWZmZXIpLAorCSAgKGdzdF93YXZwYWNrX2RlY19wb3N0X3RhZ3MpLCAoZ3N0X3dhdnBhY2tfZGVjX2NoYWluKToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5oOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfcmVzZXQpLAorCSAgKGdzdF93YXZwYWNrX2VuY19zaW5rX3NldF9jYXBzKSwgKGdzdF93YXZwYWNrX2VuY19zZXRfd3BfY29uZmlnKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfY2hhaW4pOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmg6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOgorCSAgRG9uJ3QgcGxheSBhdWRpb2NvbnZlcnQuIEFzIHdhdnBhY2sgd2FudHMvb3V0cHV0cyBhbGwgc2FtcGxlcyB3aXRoCisJICB3aWR0aD09MzIgYW5kIGRlcHRoPVsxLDMyXSBhY2NlcHQgdGhpcyBhbmQgbGV0IGF1ZGlvY29udmVydCBjb252ZXJ0CisJICB0byBhY2NlcHRlZCBmb3JtYXRzIGluc3RlYWQgb2YgZG9pbmcgaXQgaW4gdGhlIGVsZW1lbnQgZm9yIG4qOCBkZXB0aHMuCisJICBUaGlzIGFsc28gYWRkcyBzdXBwb3J0IGZvciBub24tbio4IGRlcHRocyBhbmQgcHJldmVudHMgc29tZSB1c2VsZXNzCisJICBtZW1vcnkgYWxsb2NhdGlvbnMuIEZpeGVzICM0MjE1OTgKKwkgIEFsc28gYWRkIGEgd29ya2Fyb3VuZCBmb3IgYnVnICM0MjE1NDIgaW4gd2F2cGFja2VuYyBmb3Igbm93Li4uCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tkZWMuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja2VuYy5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrcGFyc2UuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIENvbnNpZGVyIHRoZSBjaGFuZ2UgYWJvdmUgaW4gdGhlIHVuaXQgdGVzdHMgYW5kIHRlc3QgaWYgdGhlIGNvcnJlY3QKKwkgIGNhcHMgYXJlIGFjY2VwdGVkIGFuZCBzZXQuIEFsc28gY2hlY2sgZm9yIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCBpbgorCSAgdGhlIHdhdnBhY2twYXJzZSB1bml0IHRlc3QuCisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogKGdzdF93YXZwYWNrX2RlY19pbml0KSwKKwkgIChnc3Rfd2F2cGFja19kZWNfc2lua19zZXRfY2Fwcyk6CisJICBTZXQgY2FwcyBvbiB0aGUgc3JjIHBhZCBhcyBzb29uIGFzIHBvc3NpYmxlLgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmg6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tjb21tb24uaDoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5oOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuaDoKKwkgIEZpeCBpbmRlbnRpb24uIGdzdC1pbmRlbnQgaXMgbm93IGNhbGxlZCBieSBjaWNsLgorCisyMDA3LTAzLTI5IDE4OjUxOjMzICswMDAwICBSZW7DqSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorCisJICBjb25maWd1cmUuYWM6IFJlcXVpcmUgZ3N0LXBsdWdpbnMtYmFzZSBDVlMgZm9yIGF1ZGlvY29udmVydCB3aXRoIG5vbi1uYXRpdmUgZmxvYXQgc3VwcG9ydCBhbmQgd2lkdGgvZGVwdGggZml4IGluIGxpYmcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBSZXF1aXJlIGdzdC1wbHVnaW5zLWJhc2UgQ1ZTIGZvciBhdWRpb2NvbnZlcnQgd2l0aCBub24tbmF0aXZlCisJICBmbG9hdCBzdXBwb3J0IGFuZCB3aWR0aC9kZXB0aCBmaXggaW4gbGliZ3N0cmlmZi4KKwkgIFBhdGNoIGJ5OiBSZW7DqSBTdGFkbGVyIDxtYWlsIGF0IHJlbmVzdGFkbGVyIGRvdCBkZT4KKwkgICogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiAoZ3N0X2F1X3BhcnNlX3Jlc2V0KSwKKwkgIChnc3RfYXVfcGFyc2VfcGFyc2VfaGVhZGVyKSwgKGdzdF9hdV9wYXJzZV9jaGFpbik6CisJICAqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuaDoKKwkgIERvbid0IHN3YXAgdGhlIGZsb2F0cyBvdXJzZWxmIGlmIHRoZXkncmUgbm90IGluIG5hdGl2ZSBlbmRpYW5uZXNzLgorCSAgSW5zdGVhZCBsZXQgYXVkaW9jb252ZXJ0IGhhbmRsZSB0aGlzLiBGaXhlcyAjMzM5ODM4LgorCisyMDA3LTAzLTI5IDE0OjQwOjM1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogRmx1c2ggYWRhcHRlciBvbiBkaXNjb250cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzogKGdzdF9ydHBfaDI2M3BfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF9oMjYzcF9kZXBheV9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzogKGdzdF9ydHBfaDI2NF9kZXBheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX2gyNjRfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX2gyNjRfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF9oMjY0X2RlcGF5X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmM6IChnc3RfcnRwX21wNGFfZGVwYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9tcDRhX2RlcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9tcDRhX2RlcGF5X3Byb2Nlc3MpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOiAoZ3N0X3J0cF9tcDRnX2RlcGF5X3Byb2Nlc3MpOgorCSAgRmx1c2ggYWRhcHRlciBvbiBkaXNjb250cy4KKworMjAwNy0wMy0yOSAxNDowMzoyMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IFVzZSBtb3JlIGVmZmljaWVudCBhZGFwdGVyIGFuZCBydHBidWZmZXIgbWV0aG9kcyB3aGVuIHBvc3NpYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzogKGdzdF9ydHBfTDE2X2RlcGF5X3Byb2Nlc3MpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6IChnc3RfcnRwX2dzbV9kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzogKGdzdF9ydHBfaWxiY19kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYzogKGdzdF9ydHBfbXAydF9kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzogKGdzdF9ydHBfbXA0Z19kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6IChnc3RfcnRwX21wNGdfcGF5X2ZsdXNoKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzogKGdzdF9ydHBfbXA0dl9kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX21wNHZfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOiAoZ3N0X3J0cF9tcDR2X3BheV9mbHVzaCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzogKGdzdF9ydHBfbXBhX2RlcGF5X3Byb2Nlc3MpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOiAoZ3N0X3J0cF9tcGFfcGF5X2ZsdXNoKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jOiAoZ3N0X3J0cF9tcHZfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6IChnc3RfcnRwX3BjbWFfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmM6IChnc3RfcnRwX3BjbXVfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5LmM6IChnc3RfcnRwX3N2M3ZfZGVwYXlfcHJvY2Vzcyk6CisJICBVc2UgbW9yZSBlZmZpY2llbnQgYWRhcHRlciBhbmQgcnRwYnVmZmVyIG1ldGhvZHMgd2hlbiBwb3NzaWJsZS4KKworMjAwNy0wMy0yOSAxMjoxNDoyMiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiBDb3JyZWN0bHkgaGFuZGxlIHdpZHRoIT1kZXB0aCBpbnB1dC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiAoZ3N0X3dhdmVuY19jcmVhdGVfaGVhZGVyX2J1ZiksCisJICAoZ3N0X3dhdmVuY19zaW5rX3NldGNhcHMpOgorCSAgQ29ycmVjdGx5IGhhbmRsZSB3aWR0aCE9ZGVwdGggaW5wdXQuCisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgQWxyZWFkeSBleHBvcnQgaW4gdGhlIGNhcHMgdGhhdCB3aWR0aD09OCB1c2VzIHVuc2lnbmVkIHNhbXBsZXMgYW5kCisJICBldmVyeXRoaW5nIGVsc2UgdXNlcyBzaWduZWQgc2FtcGxlcy4KKworMjAwNy0wMy0yOSAwOTo1OToyMyArMDAwMCAgTGF1cmVudCBHbGF5YWwgPHNwZ2xlZ2xlQHlhaG9vLmZyPgorCisJICBnc3QvdWRwLzogUmV3b3JrIHRoZSBzb2NrZXQgYWxsb2NhdGlvbiBhIGJpdCBiYXNlZCBvbiB0aGUgc29ja2ZkIGFyZ3VtZW50IHNvIHRoYXQgaXQgYmVjb21lcyB1c2FibGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBMYXVyZW50IEdsYXlhbCA8c3BnbGVnbGUgYXQgeWFob28gZG90IGZyPgorCSAgKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzogKGdzdF9keW51ZHBzaW5rX2NsYXNzX2luaXQpLAorCSAgKGdzdF9keW51ZHBzaW5rX2luaXQpLCAoZ3N0X2R5bnVkcHNpbmtfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfZHludWRwc2lua19nZXRfcHJvcGVydHkpLCAoZ3N0X2R5bnVkcHNpbmtfaW5pdF9zZW5kKSwKKwkgIChnc3RfZHludWRwc2lua19jbG9zZSk6CisJICAqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5oOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwgKGdzdF91ZHBzcmNfaW5pdCksCisJICAoZ3N0X3VkcHNyY19jcmVhdGUpLCAoZ3N0X3VkcHNyY19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF91ZHBzcmNfZ2V0X3Byb3BlcnR5KSwgKGdzdF91ZHBzcmNfc3RhcnQpLCAoZ3N0X3VkcHNyY19zdG9wKToKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkgIFJld29yayB0aGUgc29ja2V0IGFsbG9jYXRpb24gYSBiaXQgYmFzZWQgb24gdGhlIHNvY2tmZCBhcmd1bWVudCBzbyB0aGF0CisJICBpdCBiZWNvbWVzIHVzYWJsZS4KKwkgIEFkZCBhIGNsb3NlZmQgcHJvcGVydHkgdG8gaW5zdHJ1Y3QgdGhlIHVkcCBlbGVtZW50cyB0byBjbG9zZSB0aGUgY3VzdG9tCisJICBmaWxlIGRlc2NyaXB0b3JzIHdoZW4gZ29pbmcgdG8gUkVBRFkuIEZpeGVzICM0MjMzMDQuCisJICBBUEk6R3N0VURQU3JjOjpjbG9zZWZkIHByb3BlcnR5CisJICBBUEk6R3N0RHluVURQU2luazo6Y2xvc2VmZCBwcm9wZXJ0eQorCisyMDA3LTAzLTI5IDA4OjA4OjQ5ICswMDAwICBMYXVyZW50IEdsYXlhbCA8c3BnbGVnbGVAeWFob28uZnI+CisKKwkgIGdzdC9ydHAvOiBBZGRlZCBIMjY0IHBheWxvYWRlci4gRml4ZXMgIzQyMzc4Mi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IExhdXJlbnQgR2xheWFsIDxzcGdsZWdsZSBhdCB5YWhvbyBkb3QgZnI+CisJICAqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHAvZ3N0cnRwLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NHBheS5jOiAoZ3N0X3J0cF9oMjY0X3BheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfaDI2NF9wYXlfY2xhc3NfaW5pdCksIChnc3RfcnRwX2gyNjRfcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfaDI2NF9wYXlfZmluYWxpemUpLCAoZ3N0X3J0cF9oMjY0X3BheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX2gyNjRfcGF5X2hhbmRsZV9idWZmZXIpLCAoZ3N0X3J0cF9oMjY0X3BheV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfaDI2NF9wYXlfZ2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBfaDI2NF9wYXlfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcnRwX2gyNjRfcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0cGF5Lmg6CisJICBBZGRlZCBIMjY0IHBheWxvYWRlci4gRml4ZXMgIzQyMzc4Mi4KKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzogKGdzdF9ydHBfaDI2NF9kZXBheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX2gyNjRfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX2gyNjRfZGVwYXlfcHJvY2Vzcyk6CisJICBTbWFsbCBmaXhlcy4KKworMjAwNy0wMy0yOCAyMjoyNzozNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogQWN0dWFsbHkgc3VwcG9ydCBkZXB0aHMgZnJvbSAxIHRvIDMyLCBub3Qgb25seSA4IHRvIDMyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgQWN0dWFsbHkgc3VwcG9ydCBkZXB0aHMgZnJvbSAxIHRvIDMyLCBub3Qgb25seSA4IHRvIDMyLgorCisyMDA3LTAzLTI4IDIyOjIzOjQzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBBZGQgc3VwcG9ydCBmb3Igd2F2IGZpbGVzIGNvbnRhaW5pbmcgYXVkaW8veC1yYXctaW50IHdpdGggcmFuZG9tIGRlcHRocyBiZXR3ZWVuIDEgYW5kIDMyIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgQWRkIHN1cHBvcnQgZm9yIHdhdiBmaWxlcyBjb250YWluaW5nIGF1ZGlvL3gtcmF3LWludCB3aXRoIHJhbmRvbQorCSAgZGVwdGhzIGJldHdlZW4gMSBhbmQgMzIgYml0cy4KKworMjAwNy0wMy0yOCAxODo0MDoxMiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJICBnc3QvcnRwLzogQWRkZWQgTVA0QS1MQVRNIGRlcGF5bG9hZGVyLiBGaXhlcyAjNDE3NzkyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBCYXNlZCBvbiBwYXRjaCBieTogU3RlZmFuIEtvc3QgIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYzogKGdzdF9ydHBfbXA0YV9kZXBheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfbXA0YV9kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfbXA0YV9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX21wNGFfZGVwYXlfZmluYWxpemUpLCAoZ3N0X3J0cF9tcDRhX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfbXA0YV9kZXBheV9wcm9jZXNzKSwgKGdzdF9ydHBfbXA0YV9kZXBheV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfbXA0YV9kZXBheV9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfbXA0YV9kZXBheV9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9ydHBfbXA0YV9kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5Lmg6CisJICBBZGRlZCBNUDRBLUxBVE0gZGVwYXlsb2FkZXIuIEZpeGVzICM0MTc3OTIuCisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6IChnc3RfcnRwX21wNHZfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9tcDR2X2RlcGF5X3Byb2Nlc3MpOgorCSAgRml4dXAgZGVwYXlsb2FkZXIsIHNldHRpbmcgY29kZWNfZGF0YSwgdXNpbmcgbW9yZSBlZmZpY2llbnQgYWRhcHRvciBhbmQKKwkgIHJ0cGJ1ZmZlciBoYW5kbGluZy4KKwkgICogZ3N0L3J0c3AvVVJMUzoKKwkgIEFkZCB1cmwgdG8gdGVzdCBhYm92ZS4KKworMjAwNy0wMy0yOCAxNToxNzoyNyArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvOiBQcm9jZXNzICdjdHRzJyBhdG9tcywgd2hpY2ggYXJlIHByZXNlbnQgaW4gQVZDIElTTyBmaWxlcyAoLm1vdiBmaWxlcyB3aXRoIGgyNjQgdmlkZW8pLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X3ByZXBhcmVfY3VycmVudF9zYW1wbGUpLAorCSAgKGdzdF9xdGRlbXV4X2NoYWluKSwgKHF0ZGVtdXhfcGFyc2Vfc2FtcGxlcyk6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZHVtcC5jOiAocXRkZW11eF9kdW1wX2N0dHMpOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4X2R1bXAuaDoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eF9mb3VyY2MuaDoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eF90eXBlcy5jOgorCSAgUHJvY2VzcyAnY3R0cycgYXRvbXMsIHdoaWNoIGFyZSBwcmVzZW50IGluIEFWQyBJU08gZmlsZXMgKC5tb3YgZmlsZXMKKwkgIHdpdGggaDI2NCB2aWRlbykuCisJICBVc2UgdGhlIG9mZnNldCBwcmVzZW50IGluICdjdHRzJyB0byBjYWxjdWxhdGUgdGhlIFBUUyBmb3IgZWFjaCBwYWNrZXQKKwkgIGFuZCBzZXQgdGhlIFBUUyBvbiBvdXRnb2luZyBidWZmZXJzLgorCSAgRml4ZXMgIzQyMzI4MworCisyMDA3LTAzLTI1IDE1OjM0OjQyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLio6IEhhbmRsZSBkZWZhdWx0IGNsb2NrLXJhdGVzIGZvciBzdGF0aWMgcGF5bG9hZCB0eXBlcywgcmVhcnJhbmdlIHN0dWZmIHNvIHRoYXQgdGhlIHJ0cG1hcCBmaWVsZCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChmaW5kX3N0cmVhbV9ieV9zZXR1cCksCisJICAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksIChnc3RfcnRzcHNyY19zdHJlYW1fZnJlZSksCisJICAoZ2V0X2RlZmF1bHRfcmF0ZV9mb3JfcHQpLCAoZ3N0X3J0c3BzcmNfcGFyc2VfcnRwbWFwKSwKKwkgIChnc3RfcnRzcHNyY19tZWRpYV90b19jYXBzKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV9jYXBzKSwKKwkgIChnc3RfcnRzcHNyY19hY3RpdmF0ZV9zdHJlYW1zKSwgKGdzdF9ydHNwc3JjX3BhcnNlX3J0cGluZm8pOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBIYW5kbGUgZGVmYXVsdCBjbG9jay1yYXRlcyBmb3Igc3RhdGljIHBheWxvYWQgdHlwZXMsIHJlYXJyYW5nZSBzdHVmZiBzbworCSAgdGhhdCB0aGUgcnRwbWFwIGZpZWxkIGluIHRoZSBzZHAgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy4KKwkgIFBhcnNlIFJUUC1JbmZvIGZpZWxkIHRvIGdldCB0aGUgc2VxbnVtIGFuZCB0aW1lYmFzZSBmaWVsZHMgdGhhdCBzaG91bGQKKwkgIGdvIGluIHRoZSBjYXBzLgorCSAgRGVsYXkgY29uZmlndXJpbmcgY2FwcyBhZnRlciB3ZSBnb3QgdGhlIFJUUC1JbmZvIGZyb20gdGhlIFBMQVkgcmVwbHkgZnJvbQorCSAgdGhlIHNlcnZlci4KKworMjAwNy0wMy0yNCAxOTo0Njo1OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6IFJlbW92ZSAnY2hhbm5lbC1wb3NpdGlvbnMnIGZpZWxkIHdoZW4gbXVuZ2luZyBpbnB1dCBjYXBzIGludG8gMS1jaGFubmVsIG91dHB1dCBjYXBzIChJLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6IChnc3RfZGVpbnRlcmxlYXZlX3Npbmtfc2V0Y2Fwcyk6CisJICBSZW1vdmUgJ2NoYW5uZWwtcG9zaXRpb25zJyBmaWVsZCB3aGVuIG11bmdpbmcgaW5wdXQgY2FwcyBpbnRvCisJICAxLWNoYW5uZWwgb3V0cHV0IGNhcHMgKEkgZ3Vlc3MgdGVjaG5pY2FsbHkgd2Ugc2hvdWxkIHNldCB0aGUKKwkgIHBvc2l0aW9uIGZvciBlYWNoIGNoYW5uZWwgb24gdGhlIG91dHB1dCBjYXBzIGlmIGl0J3Mgbm9uLU5PTkUsCisJICBidXQgSSdsbCBzYXZlIHRoYXQgYXMgYSB0YXNrIGZvciBhbm90aGVyIGRheSkuCisKKzIwMDctMDMtMjIgMjI6MTQ6MjkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiBEb24ndCBsZWFrIGlucHV0IGJ1ZmZlciBpbiBjaGFpbiBmdW5jdGlvbjsgbWFpbnRhaW4gb3VyIG93biBsaXN0IG9mIHNvdXJjZSBwYWRzIC0gdGhlci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiAoZ3N0X2RlaW50ZXJsZWF2ZV9hZGRfbmV3X3BhZHMpLAorCSAgKGdzdF9kZWludGVybGVhdmVfcmVtb3ZlX3BhZHMpLCAoZ3N0X2RlaW50ZXJsZWF2ZV9wcm9jZXNzKSwKKwkgIChnc3RfZGVpbnRlcmxlYXZlX2NoYWluKToKKwkgIERvbid0IGxlYWsgaW5wdXQgYnVmZmVyIGluIGNoYWluIGZ1bmN0aW9uOyBtYWludGFpbiBvdXIgb3duIGxpc3Qgb2YKKwkgIHNvdXJjZSBwYWRzIC0gdGhlcmUgYXJlIG5vIGd1YXJhbnRlZXMgYWJvdXQgdGhlIG9yZGVyIG9mIHRoZSBsaXN0CisJICBpbiB0aGUgR3N0RWxlbWVudCBzdHJ1Y3QsIGFuZCB3ZSB3YW50IGEgdmVyeSBzcGVjaWZpYyBvcmRlcjsgbGFzdGx5LAorCSAgc29tZSBtb3JlIGRlYnVnZ2luZy4KKworMjAwNy0wMy0yMiAxNjoyNTo1NiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogUmV2ZXJ0IGxhc3QgY29tbWl0LCBwcmV2ZW50aW5nIGluZmluaXRlIHBsdWdnaW5nIGxvb3BzIHdpdGggcmFua3MgaXMgbm8gY2xlYW4gc29sdXRpb24uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogKGdzdF93YXZwYWNrX3BhcnNlX3BsdWdpbl9pbml0KToKKwkgIFJldmVydCBsYXN0IGNvbW1pdCwgcHJldmVudGluZyBpbmZpbml0ZSBwbHVnZ2luZyBsb29wcyB3aXRoIHJhbmtzCisJICBpcyBubyBjbGVhbiBzb2x1dGlvbiBhbmQgaW4gZ2VuZXJhbCB0aGVyZSdzIG5vIHJlYXNvbiB3aHkgb25lIHdhbnRzCisJICB0byBwYXJzZSBmcmFtZWQgd2F2cGFjayBkYXRhIGFnYWluLgorCisyMDA3LTAzLTIyIDE1OjUyOjUxICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogU2VuZCB0aGUgbmV3IHNlZ21lbnQgZXZlbnQgaW4gdGltZSBmb3JtYXQgaW5zdGVhZCBvZiBieXRlcy4gVGhpcyBhbGxvd3MgIndhdnBhY2tlbmMgISB3YS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogKGdzdF93YXZwYWNrX2VuY19wdXNoX2Jsb2NrKToKKwkgIFNlbmQgdGhlIG5ldyBzZWdtZW50IGV2ZW50IGluIHRpbWUgZm9ybWF0IGluc3RlYWQgb2YgYnl0ZXMuIFRoaXMKKwkgIGFsbG93cyAid2F2cGFja2VuYyAhIHdhdnBhY2tkZWMgISBzb21lYXVkaW9zaW5rIiBwaXBlbGluZXMuCisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiAoZ3N0X3dhdnBhY2tfcGFyc2VfcGx1Z2luX2luaXQpOgorCSAgQWNjZXB0IGZyYW1lZCBhbmQgbm9uLWZyYW1lZCBpbnB1dCwgd2F2cGFja3BhcnNlIGRvZXNuJ3QgY2FyZS4gVG8KKwkgIHByZXZlbnQgIndhdnBhY2twYXJzZSAhIHdhdnBhY2twYXJzZSAhIC4uLiIgcGlwZWxpbmVzIGxvd2VyIHRoZQorCSAgcmFuayBvZiB3YXZwYWNrcGFyc2UgYnkgb25lLiBUaGlzIGFsbG93cyAid2F2cGFja2VuYyAhIHdhdnBhY2twYXJzZSAhCisJICAuLi4iIHBpcGVsaW5lcy4KKworMjAwNy0wMy0yMiAxMTowODowMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IFJldmVydCB0byB1c2UgZ3N0X3BhZF9hbGxvY19idWZmZXIoKSBoZXJlLiBXZSBjYW4gYW5kIHNob3VsZCB1c2UgaXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX2NoYWluKToKKwkgIFJldmVydCB0byB1c2UgZ3N0X3BhZF9hbGxvY19idWZmZXIoKSBoZXJlLiBXZSBjYW4gYW5kIHNob3VsZCB1c2UgaXQuCisJICBUaGFua3MgdG8gSmFuIGFuZCBNaWtlIGZvciBub3RpY2luZyBteSBtaXN0YWtlLgorCisyMDA3LTAzLTIyIDA5OjQ0OjE3ICswMDAwICBDaHJpc3RvcGhlIERlaGFpcyA8Y2hyaXN0b3BoZS5kZWhhaXNAZ21haWwuY29tPgorCisJICBleHQvZ2NvbmYvZ2NvbmYuYzogQWNjZXB0IGNvbXBsZXggcGlwZWxpbmUgZGVzY3JpcHRpb25zIGFzIGFuIGF1ZGlvIHByb2ZpbGUgaW5zdGVhZCBvZiBqdXN0IGEgc2luZ2xlIGVsZW1lbnQuIEZpeGVzICMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IENocmlzdG9waGUgRGVoYWlzIDxjaHJpc3RvcGhlIGRvdCBkZWhhaXMgYXQgZ21haWwgZG90IGNvbT4KKwkgICogZXh0L2djb25mL2djb25mLmM6IChnc3RfZ2NvbmZfcmVuZGVyX2Jpbl93aXRoX2RlZmF1bHQpOgorCSAgQWNjZXB0IGNvbXBsZXggcGlwZWxpbmUgZGVzY3JpcHRpb25zIGFzIGFuIGF1ZGlvIHByb2ZpbGUgaW5zdGVhZCBvZiBqdXN0CisJICBhIHNpbmdsZSBlbGVtZW50LiBGaXhlcyAjNDIwNjU4LgorCisyMDA3LTAzLTIyIDAwOjE3OjQxICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuKjogUHV0IHRoZSB3cml0ZSBoZWxwZXJzIGludG8gdGhlIEdzdFdhdnBhY2tFbmMgc3RydWN0IGRpcmVjdGx5IGFuZCBub3QgYXMgYSBwb2ludGVyIHRvIHNhdi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogKGdzdF93YXZwYWNrX2VuY19jbGFzc19pbml0KSwKKwkgIChnc3Rfd2F2cGFja19lbmNfaW5pdCksIChnc3Rfd2F2cGFja19lbmNfY2hhaW4pLAorCSAgKGdzdF93YXZwYWNrX2VuY19yZXdyaXRlX2ZpcnN0X2Jsb2NrKToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5oOgorCSAgUHV0IHRoZSB3cml0ZSBoZWxwZXJzIGludG8gdGhlIEdzdFdhdnBhY2tFbmMgc3RydWN0IGRpcmVjdGx5IGFuZCBub3QKKwkgIGFzIGEgcG9pbnRlciB0byBzYXZlIHR3byBzbWFsbCwgYnV0IHVzZWxlc3MgbWFsbG9jcy4gVGhpcyBhbHNvIG1ha2VzCisJICBpdCBwb3NzaWJsZSB0byBkcm9wIHRoZSBmaW5hbGl6ZSBtZXRob2QuCisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiAoZ3N0X3dhdnBhY2tfcGFyc2VfcHVzaF9idWZmZXIpOgorCSAgRm9yIGNvbnNpc3RlbmN5IHJlYXNvbnMgYWxzbyBzZXQgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIG9uIHRoZSBvdXRnb2luZworCSAgYnVmZmVycyB0aGUgc2FtZSB3YXkgd2F2cGFja2VuYyBkb2VzIGl0LgorCisyMDA3LTAzLTIxIDIzOjUwOjA5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogRG9uJ3QgdXNlIGdzdF9wYWRfYWxsb2NfYnVmZmVyKCkgYXMgd2UgbWlnaHQgY2xpcCB0aGUgYnVmZmVyIGxhdGVyIGFuZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogKGdzdF93YXZwYWNrX2RlY19jaGFpbik6CisJICBEb24ndCB1c2UgZ3N0X3BhZF9hbGxvY19idWZmZXIoKSBhcyB3ZSBtaWdodCBjbGlwIHRoZSBidWZmZXIgbGF0ZXIgYW5kCisJICBCYXNlVHJhbnNmb3JtLWJhc2VkIGVsZW1lbnRzIHdpbGwgbGlrZWx5IGJyZWFrIGJlY2F1c2Ugb2Ygd3JvbmcKKwkgIHVuaXQtc2l6ZS4gQWxzbyBwbHVnIGEgcG9zc2libGUgbWVtbGVhayB0aGF0IGhhcHBlbnMgd2hlbiBkZWNvZGluZworCSAgZmFpbHMgZm9yIHNvbWUgcmVhc29uLgorCisyMDA3LTAzLTIxIDExOjQ5OjMyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvYXBldGFnL2dzdHRhZ2RlbXV4LmM6IFJlbmFtZSByZWdpc3RlcmVkIHR5cGUgaW4gcHJlcGFyYXRpb24gb2YgR3N0VGFnRGVtdXggbW92aW5nIHRvCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FwZXRhZy9nc3R0YWdkZW11eC5jOiAoZ3N0X3RhZ19kZW11eF9nZXRfdHlwZSk6CisJICBSZW5hbWUgcmVnaXN0ZXJlZCB0eXBlIGluIHByZXBhcmF0aW9uIG9mIEdzdFRhZ0RlbXV4IG1vdmluZyB0bworCSAgLWJhc2UgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLgorCisyMDA3LTAzLTE5IDEwOjI5OjE5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogU3RyZWFtaW5nIG1vZGUgZml4ZXM6IGRvbid0IHVucmVmIGJ1ZmZlciB3ZSBkb24ndCBvd24gYW55IGxvbmdlcjsgcmVtb3ZlIGJvZ3VzIGFkYXB0ZXIgZmwuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyk6CisJICBTdHJlYW1pbmcgbW9kZSBmaXhlczogZG9uJ3QgdW5yZWYgYnVmZmVyIHdlIGRvbid0IG93biBhbnkgbG9uZ2VyOworCSAgcmVtb3ZlIGJvZ3VzIGFkYXB0ZXIgZmx1c2guIEZpeGVzICM0MTkzMzguCisKKzIwMDctMDMtMTggMDQ6MjE6MjggKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBSRVFVSVJFTUVOVFM6IENoYW5nZSB0aGUgZm9ybWF0IHRvIGtleS92YWx1ZSwgYWRkIGEgYnVuY2ggb2YgaW5mb3JtYXRpb24sIHJlbW92ZSBhIGJ1bmNoIG9mIHJlcXVpcmVtZW50cyB0aGF0IGFyZSBmb3IuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBSRVFVSVJFTUVOVFM6IENoYW5nZSB0aGUgZm9ybWF0IHRvIGtleS92YWx1ZSwgYWRkIGEgYnVuY2ggb2YKKwkgIGluZm9ybWF0aW9uLCByZW1vdmUgYSBidW5jaCBvZiByZXF1aXJlbWVudHMgdGhhdCBhcmUgZm9yCisJICBvdGhlciBHU3RyZWFtZXIgcGFja2FnZXMuCisKKzIwMDctMDMtMTggMDI6MDA6NTQgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBSRVFVSVJFTUVOVFM6IEZpeCBhIGZldyB0aGluZ3MuICBUaGlzIGZpbGUgcmVhbGx5IG5lZWRzIGEgZ29vZCBvbmNlLW92ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogUkVRVUlSRU1FTlRTOiBGaXggYSBmZXcgdGhpbmdzLiAgVGhpcyBmaWxlIHJlYWxseSBuZWVkcyBhCisJICBnb29kIG9uY2Utb3Zlci4KKworMjAwNy0wMy0xNiAxODozODoxOCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOiBGaXggcHJldmlvdXMgY29tbWl0LCB3ZSB3YW50IHRvIHBhc3MgdGhlIE5TVmlldyBpbiB0aGUgbWVzc2FnZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBGaXggcHJldmlvdXMgY29tbWl0LCB3ZSB3YW50IHRvIHBhc3MgdGhlIE5TVmlldyBpbiB0aGUgbWVzc2FnZS4KKworMjAwNy0wMy0xNiAxNjoyNzoyMCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOiBFbWl0ICdoYXZlLW5zLXZpZXcnIG1lc3NhZ2Ugd2hlbiB3b3JraW5nIGluIGVtYmVkZGVkIG1vZGUuIFRoZSBtZXNzYWdlIHdpbGwgY29udGFpbiBhIHBvLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgRW1pdCAnaGF2ZS1ucy12aWV3JyBtZXNzYWdlIHdoZW4gd29ya2luZyBpbiBlbWJlZGRlZCBtb2RlLiBUaGUgbWVzc2FnZQorCSAgd2lsbCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgbmV3bHkgY3JlYXRlZCBOU1ZpZXcuCisKKzIwMDctMDMtMTYgMDk6NTc6NDAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmM6IEEgMTAgYmFuZCBFUSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gMSBiYW5kcyBhbmQgbm90IHRvIDMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmM6CisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfMTBiYW5kc19pbml0KToKKwkgIEEgMTAgYmFuZCBFUSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gMSBiYW5kcyBhbmQgbm90IHRvIDMuCisKKzIwMDctMDMtMTUgMTI6MDU6MDEgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIHN5cy9NYWtlZmlsZS5hbTogRG9uJ3QgZm9yZ2V0IHRvIGRpc3RyaWJ1dGUgdGhlIHN5cy9vc3hhdWRpby8gZGlyZWN0b3J5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9NYWtlZmlsZS5hbToKKwkgIERvbid0IGZvcmdldCB0byBkaXN0cmlidXRlIHRoZSBzeXMvb3N4YXVkaW8vIGRpcmVjdG9yeS4KKworMjAwNy0wMy0xNSAxMTozOTo1MyArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgQWN0aXZhdGUgb3N4YXVkaW8gaW4gZ3N0LXBsdWdpbnMtZ29vZCB3aXRoIHByb3BlciBidWlsZCBzZXR1cC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIHN5cy9NYWtlZmlsZS5hbToKKwkgICogc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW8uYzoKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSAgKGdzdF9vc3hfYXVkaW9fc2lua19vc3hlbGVtZW50X2RvX2luaXQpLCAoZ3N0X29zeF9hdWRpb19zaW5rX2luaXQpLAorCSAgKGdzdF9vc3hfYXVkaW9fc2lua19nZXRjYXBzKSwKKwkgIChnc3Rfb3N4X2F1ZGlvX3NpbmtfY3JlYXRlX3JpbmdidWZmZXIpLCAocGx1Z2luX2luaXQpOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkgIChnc3Rfb3N4X2F1ZGlvX3NyY19vc3hlbGVtZW50X2RvX2luaXQpLCAoZ3N0X29zeF9hdWRpb19zcmNfaW5pdCksCisJICAoZ3N0X29zeF9hdWRpb19zcmNfY3JlYXRlX3JpbmdidWZmZXIpOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4cmluZ2J1ZmZlci5jOiAoZ3N0X29zeF9yaW5nX2J1ZmZlcl9nZXRfdHlwZSksCisJICAoZ3N0X29zeF9yaW5nX2J1ZmZlcl9jbGFzc19pbml0KSwgKGdzdF9vc3hfcmluZ19idWZmZXJfaW5pdCksCisJICAoZ3N0X29zeF9yaW5nX2J1ZmZlcl9hY3F1aXJlKSwgKGdzdF9vc3hfcmluZ19idWZmZXJfc3RhcnQpLAorCSAgKGdzdF9vc3hfcmluZ19idWZmZXJfcGF1c2UpLCAoZ3N0X29zeF9yaW5nX2J1ZmZlcl9zdG9wKToKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeHJpbmdidWZmZXIuaDoKKwkgIEFjdGl2YXRlIG9zeGF1ZGlvIGluIGdzdC1wbHVnaW5zLWdvb2Qgd2l0aCBwcm9wZXIgYnVpbGQgc2V0dXAuCisJICBBZGQgaW5saW5lZCBkb2N1bWVudGF0aW9uLgorCSAgRml4IGRlYnVnIHN0YXRlbWVudHMKKwkgIEZpeCByaW5nYnVmZmVyIHdoZW4gcGF1c2luZy4KKwkgIEZpeGVzICMzMjM0NzEKKworMjAwNy0wMy0xNCAyMjoyMToyNiArMDAwMCAgUGhpbGlwcGUgS2FsYWYgPHBoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0L3J0cC86IFBvcnRlZCBtdWxhdyBhbmQgYWxhdyBwYXlsb2FkZXJzIHRvIHVzZSBuZXcgYmFzZSBjbGFzcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBwY211cGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5oOgorCSAgUG9ydGVkIG11bGF3IGFuZCBhbGF3IHBheWxvYWRlcnMgdG8gdXNlIG5ldyBiYXNlIGNsYXNzCisKKzIwMDctMDMtMTQgMTY6MzA6MTkgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIHN5cy9vc3h2aWRlby86IEZpeCBsZWFrcyB3aGVuIHJ1bm5pbmcgYSBOU0FwcC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cuaDoKKwkgICogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgRml4IGxlYWtzIHdoZW4gcnVubmluZyBhIE5TQXBwLgorCSAgQWNjZXB0IGFueSBraW5kIG9mIHJlc29sdXRpb25zLgorCSAgV29ya3MgaW4gZnVsbHNjcmVlbi4gQ2FuIG1heGltaXplLgorCSAgT25seSB0aGluZyBsZWZ0IGJlZm9yZSBiZWluZyBhYmxlIHRvIG1vdmUgdGhpcyB0byAtZ29vZCBpcyBkb2N1bWVudGF0aW9uCisJICBhbmQgZW1iZWRkZWQgd2luZG93IHN1cHBvcnQuCisKKzIwMDctMDMtMTQgMTU6MjU6MTAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBwby86IFVwZGF0ZSB0cmFuc2xhdGlvbnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogcG8vYWYucG86CisJICAqIHBvL2F6LnBvOgorCSAgKiBwby9jcy5wbzoKKwkgICogcG8vZW5fR0IucG86CisJICAqIHBvL2l0LnBvOgorCSAgKiBwby9ubC5wbzoKKwkgICogcG8vb3IucG86CisJICAqIHBvL3NxLnBvOgorCSAgKiBwby9zci5wbzoKKwkgICogcG8vc3YucG86CisJICAqIHBvL3VrLnBvOgorCSAgKiBwby92aS5wbzoKKwkgIFVwZGF0ZSB0cmFuc2xhdGlvbnMuCisKKzIwMDctMDMtMTQgMTQ6NDk6NDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogRml4IHN0cmluZyByZXBsYWNlIGVycm9yIChBR19BR19HU1RfKiA9PiBBR19HU1RfKikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgRml4IHN0cmluZyByZXBsYWNlIGVycm9yIChBR19BR19HU1RfKiA9PiBBR19HU1RfKikuCisKKzIwMDctMDMtMTQgMTQ6NDg6MDggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2VxdWFsaXplci86IEFkZCAzIGFuZCAxMCBiYW5kIHZlcnNpb24gYW5kIGFkZCBtaXNzaW5nIGdzdF9vYmplY3Rfc3luY192YWx1ZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2VxdWFsaXplci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzogKF9kb19pbml0KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9iYW5kX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9jbGFzc19pbml0KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9iYW5kX2dldF90eXBlKSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9nZXRfY2hpbGRfYnlfaW5kZXgpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2dldF9jaGlsZHJlbl9jb3VudCksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfY2hpbGRfcHJveHlfaW50ZXJmYWNlX2luaXQpLCAoc2V0dXBfZmlsdGVyKSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9jb21wdXRlX2ZyZXF1ZW5jaWVzKSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl90cmFuc2Zvcm1faXApLCAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuYzoKKwkgIChnc3RfaWlyX2VxdWFsaXplcl8xMGJhbmRzX2Jhc2VfaW5pdCksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfMTBiYW5kc19jbGFzc19pbml0KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl8xMGJhbmRzX2luaXQpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyXzEwYmFuZHNfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl8xMGJhbmRzX2dldF9wcm9wZXJ0eSk6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5oOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5jOgorCSAgKGdzdF9paXJfZXF1YWxpemVyXzNiYW5kc19iYXNlX2luaXQpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyXzNiYW5kc19jbGFzc19pbml0KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl8zYmFuZHNfaW5pdCksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfM2JhbmRzX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfM2JhbmRzX2dldF9wcm9wZXJ0eSk6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmg6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVybmJhbmRzLmM6CisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfbmJhbmRzX2Jhc2VfaW5pdCksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfbmJhbmRzX2luaXQpOgorCSAgQWRkIDMgYW5kIDEwIGJhbmQgdmVyc2lvbiBhbmQgYWRkIG1pc3NpbmcgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcy4KKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IChnc3Rfc3BlY3RydW1fZXZlbnQpLAorCSAgKGdzdF9zcGVjdHJ1bV90cmFuc2Zvcm1faXApOgorCSAgQWRkIHNvbWUgY29tbWVudHMgYWJvdXQgZmxvYXQgc3VwcG9ydC4KKworMjAwNy0wMy0xMiAxNzo1Njo1NCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2FwZXRhZy9nc3R0YWdkZW11eC5jOiBGaXggaGFuZGxpbmcgb2YgLTEgdmFsdWVzIGZvciBzdGFydCBhbmQgc3RvcCB2YWx1ZXMgd2hlbiBzZWVraW5nLCBhbmQgU0VFS19DVVIrU0VFS19FTkQgaGVyLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FwZXRhZy9nc3R0YWdkZW11eC5jOiAoZ3N0X3RhZ19kZW11eF9zcmNwYWRfZXZlbnQpOgorCSAgRml4IGhhbmRsaW5nIG9mIC0xIHZhbHVlcyBmb3Igc3RhcnQgYW5kIHN0b3AgdmFsdWVzIHdoZW4gc2Vla2luZywKKwkgIGFuZCBTRUVLX0NVUitTRUVLX0VORCBoZXJlIGFzIHdlbGwuCisKKzIwMDctMDMtMTIgMTc6MjQ6MjMgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogRml4IGhhbmRsaW5nIG9mIC0xIHZhbHVlcyBmb3Igc3RhcnQgYW5kIHN0b3AgdmFsdWVzIHdoZW4gc2Vla2luZywgYW5kIFNFRUtfQ1VSK1NFRUtfRU5ELgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoZ3N0X2lkM2RlbXV4X3NyY3BhZF9ldmVudCk6CisJICBGaXggaGFuZGxpbmcgb2YgLTEgdmFsdWVzIGZvciBzdGFydCBhbmQgc3RvcCB2YWx1ZXMgd2hlbiBzZWVraW5nLAorCSAgYW5kIFNFRUtfQ1VSK1NFRUtfRU5ELgorCisyMDA3LTAzLTEyIDE1OjQ5OjAyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSAgSSdtIHRvbyBsYXp5IHRvIGNvbW1lbnQgdGhpcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBBZGQgUGF0Y2ggYnk6IGxpbmUgZm9yIHdpbSwgc2luY2UgaGUncyBhd2F5CisKKzIwMDctMDMtMTIgMTM6Mjg6MjkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiBGaXggcGFyc2luZyBvZiBJRDMgdjIuMi4wIFBJQyBmcmFtZXMuIE9ubHkgaW4gdmVyc2lvbiA+PSAyLjMuMCBpcyB0aGUgaW1hZ2UgZm9ybWF0IGEgdmFyaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAocGFyc2VfcGljdHVyZV9mcmFtZSk6CisJICBGaXggcGFyc2luZyBvZiBJRDMgdjIuMi4wIFBJQyBmcmFtZXMuIE9ubHkgaW4gdmVyc2lvbiA+PSAyLjMuMCBpcworCSAgdGhlIGltYWdlIGZvcm1hdCBhIHZhcmlhYmxlLWxlbmd0aCBOVUwtdGVybWluYXRlZCBzdHJpbmc7IGluCisJICB2ZXJzaW9ucyBiZWZvcmUgdGhhdCB0aGUgaW1hZ2UgZm9ybWF0IGlzIGEgZml4ZWQtbGVuZ3RoIHN0cmluZyBvZgorCSAgMyBjaGFyYWN0ZXJzIChzZWUgIzM0ODY0NCBmb3IgYSBzYW1wbGUgdGFnKS4KKwkgIEFsc28gbWFrZSBzdXBwbGllZCBtaW1lIHR5cGUgbG93ZXItY2FzZSBhbmQgZml4IHVwICdqcGcnIHRvICdqcGVnJy4KKworMjAwNy0wMy0xMSAyMjoyMzowNCArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay4qOiBIYW5kbGUgZGlzcGxheSBtb2RlIGNoYW5nZXMgZHVyaW5nIHBsYXliYWNrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6CisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmg6CisJICBIYW5kbGUgZGlzcGxheSBtb2RlIGNoYW5nZXMgZHVyaW5nIHBsYXliYWNrLgorCisyMDA3LTAzLTEwIDE2OjA3OjMxICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkgIHdpbjMyL01BTklGRVNUOiBBZGQgbmV3IHByb2plY3QgZmlsZXMgdG8gTUFOSUZFU1QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogd2luMzIvTUFOSUZFU1Q6CisJICBBZGQgbmV3IHByb2plY3QgZmlsZXMgdG8gTUFOSUZFU1QuCisJICAqIHdpbjMyL3ZzNi9saWJnc3RhdWRpb2Z4LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHJ0cC5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RydHNwLmRzcDoKKwkgIFVwZGF0ZSBwcm9qZWN0IGZpbGVzLgorCisyMDA3LTAzLTEwIDEyOjMwOjQ4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBQcmludGYgZm9ybWF0IGZpeGVzOyBhbHNvIGFkZCBzb21lIG1pc3NpbmcgcXVvdGVzIGluIHRyYW5zbGF0ZWQgc3RyaW5ncy4gRml4ZXMgIzQxNjcyOCBhbmQgIzQxNjcyNy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3BhcnNlX3N1YmluZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3BhcnNlX2luZGV4KToKKwkgICogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOiAoZ3N0X3Y0bDJfZmlsbF9saXN0cyk6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX2dyYWJfZnJhbWUpOgorCSAgUHJpbnRmIGZvcm1hdCBmaXhlczsgYWxzbyBhZGQgc29tZSBtaXNzaW5nIHF1b3RlcyBpbiB0cmFuc2xhdGVkCisJICBzdHJpbmdzLiBGaXhlcyAjNDE2NzI4IGFuZCAjNDE2NzI3LgorCisyMDA3LTAzLTA5IDIwOjEyOjA4ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOiBUaW0gYW5kIEkgY2FuJ3QgdGhpbmsgb2YgYW55IHJlYXNvbiB0aGUgY2hpbGQgYXVkaW8gc2luayBuZWVkcyB0byBiZSBzZXQgYmFjayB0byBOLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOiAoZ3N0X2F1dG9fYXVkaW9fc2lua19maW5kX2Jlc3QpOgorCSAgVGltIGFuZCBJIGNhbid0IHRoaW5rIG9mIGFueSByZWFzb24gdGhlIGNoaWxkIGF1ZGlvIHNpbmsgbmVlZHMgdG8KKwkgIGJlIHNldCBiYWNrIHRvIE5VTEwgYWZ0ZXIgc3VjY2Vzc2Z1bGx5IGRldGVybWluaW5nIHRoYXQgaXQgY2FuCisJICByZWFjaCBSRUFEWSAtIGl0IGdldHMgaW1tZWRpYXRlbHkgc2V0IGJhY2sgdG8gUkVBRFkgYnkgdGhlIGNhbGxlcgorCSAgYW55d2F5LCBjYXVzaW5nIGFuIHVubmVjZXNzYXJ5IGNsb3NlL29wZW4gb2YgYW55IGF1ZGlvIGRldmljZXMKKwkgIGludm9sdmVkLgorCisyMDA3LTAzLTA5IDE5OjUxOjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBwby86IEFkZCBqYS5wbyBmaWxlIGZyb20gIzM3NzMwNi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBwby9MSU5HVUFTOgorCSAgKiBwby9qYS5wbzoKKwkgIEFkZCBqYS5wbyBmaWxlIGZyb20gIzM3NzMwNi4KKworMjAwNy0wMy0wOSAxOTo0NDozMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL3N1bmF1ZGlvLzogQWN0dWFsbHkgdHJhbnNsYXRlIHN1bmF1ZGlvIG1peGVyIHRyYWNrIGxhYmVscyBpbnN0ZWFkIG9mIGp1c3QgbWFya2luZyB0aGUgc3RyaW5ncyBhcyB0cmFuc2xhdGFibGUgKCMzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvLmM6IChwbHVnaW5faW5pdCk6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVydHJhY2suYzoKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl90cmFja19uZXcpOgorCSAgQWN0dWFsbHkgdHJhbnNsYXRlIHN1bmF1ZGlvIG1peGVyIHRyYWNrIGxhYmVscyBpbnN0ZWFkIG9mIGp1c3QKKwkgIG1hcmtpbmcgdGhlIHN0cmluZ3MgYXMgdHJhbnNsYXRhYmxlICgjMzc3MzA2KTsgY2xlYW4gdXAgd2VpcmQKKwkgIGxhYmVsIHN0cmluZyBtYXBwaW5nIGNvZGUgdGhhdCBzZXJ2ZXMgbm8gYXBwYXJlbnQgcHVycG9zZS4gQWxzbworCSAgc2V0IHRoZSAndW50cmFuc2xhdGVkLWxhYmVsJyBwcm9wZXJ0eSB3aGVuIGNyZWF0aW5nIG1peGVyIHRyYWNrcworCSAgaWYgdGhlIEdzdE1peGVyVHJhY2sgYmFzZSBjbGFzcyBzdXBwb3J0cyB0aGlzLgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvc3VuYXVkaW8uYzogKEdTVF9TVEFSVF9URVNUKSwKKwkgIChzdW5hdWRpb19zdWl0ZSk6CisJICBWZXJ5IG1pbmltYWxpc3RpYyB1bml0IHRlc3QgZm9yIHN1bmF1ZGlvbWl4ZXIgZWxlbWVudCAoY29tcGlsZXMsIGJ1dCBub3QKKwkgIGFjdHVhbGx5IHRlc3RlZCBvbiBhIHN5c3RlbSB3aGVyZSBzdW5hdWRpb21peGVyIGlzIGF2YWlsYWJsZSkuCisKKzIwMDctMDMtMDkgMTg6NDk6MzcgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogUmUtZW5hYmxlIHRoZSBzdGF0ZXMgdGVzdCBhbmQgc2VlIGlmIGl0IHdvcmtzIG9uIHRoZSBidWlsZGJvdHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBSZS1lbmFibGUgdGhlIHN0YXRlcyB0ZXN0IGFuZCBzZWUgaWYgaXQgd29ya3Mgb24gdGhlIGJ1aWxkYm90cy4KKworMjAwNy0wMy0wOSAxNzozMjozMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKworCSAgZXh0L2R2L2dzdGR2ZGVjLio6IEluZmVyIHBpeGVsLWFzcGVjdC1yYXRpbyBmcm9tIHRoZSB2aWRlbyBmcmFtZSBmb3JtYXQgaWYgaXQgaXNuJ3QgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lciwgYXMgaGFwLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfaW5pdCksIChnc3RfZHZkZWNfc2lua19zZXRjYXBzKSwKKwkgIChnc3RfZHZkZWNfc3JjX25lZ290aWF0ZSksIChnc3RfZHZkZWNfY2hhaW4pLAorCSAgKGdzdF9kdmRlY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuaDoKKwkgIEluZmVyIHBpeGVsLWFzcGVjdC1yYXRpbyBmcm9tIHRoZSB2aWRlbyBmcmFtZSBmb3JtYXQgaWYgaXQgaXNuJ3QKKwkgIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIsIGFzIGhhcHBlbnMgd2hlbiBwbGF5aW5nIERWIGZyb20gQVZJCisJICBvciBRdWlja3RpbWUgY29udGFpbmVycy4KKwkgIFBhdGNoIGJ5OiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorCSAgRml4ZXMgIzM4MDk0NAorCisyMDA3LTAzLTA5IDE3OjA1OjE3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IFdoZW4gYWN0aXZhdGVkLCByZW1vdmUgdGhlIHVkcHNyYyB0aW1lb3V0LCB3ZSBoYXZlIGRhdGFmbG93IGFuZCB0aW1lb3V0cyB3aWxsIGxhdGVyIGJlIGhhbmRsZWQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19hY3RpdmF0ZV9zdHJlYW1zKToKKwkgIFdoZW4gYWN0aXZhdGVkLCByZW1vdmUgdGhlIHVkcHNyYyB0aW1lb3V0LCB3ZSBoYXZlIGRhdGFmbG93IGFuZCB0aW1lb3V0cworCSAgd2lsbCBsYXRlciBiZSBoYW5kbGVkIGJ5IHRoZSBqaXR0ZXJidWZmZXIuCisKKzIwMDctMDMtMDkgMTY6NTM6MzkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6IEFkZCB3cml0ZSBzdXBwb3J0IGZvciBHU1RfVEFHX01VU0lDQlJBSU5aX1NPUlROQU1FIChUU09QKSB0YWcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkgIEFkZCB3cml0ZSBzdXBwb3J0IGZvciBHU1RfVEFHX01VU0lDQlJBSU5aX1NPUlROQU1FIChUU09QKSB0YWcuCisJICBGaXhlcyAjNDE0NDk2LgorCisyMDA3LTAzLTA5IDE1OjA0OjQ1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IEZpeCBzdHJlYW0gcG9zaXRpb24gcmVwb3J0aW5nIGFmdGVyIGEgc2Vlay4gRml4ZXMgIzQxNjQ0NS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksCisJICAoZ3N0X2F2aV9kZW11eF9wdXNoX2V2ZW50KSwgKGdzdF9hdmlfZGVtdXhfZG9fc2VlayksCisJICAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSksCisJICAoZ3N0X2F2aV9kZW11eF9jaGFpbik6CisJICBGaXggc3RyZWFtIHBvc2l0aW9uIHJlcG9ydGluZyBhZnRlciBhIHNlZWsuIEZpeGVzICM0MTY0NDUuCisKKzIwMDctMDMtMDkgMDg6NTg6MjYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2VxdWFsaXplci86IFJlZmFjdG9yIHBsdWdpbiBpbnRvIGEgYmFzZSBjbGFzcyBhbmQgYSBmaXJzdCBzdWJjbGFzcyAobmJhbmQgZXEpLiBUaGUgbmJhbmQgZXEgdXNlcyBHc3RDaGlsZFByb3h5IGFuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2VxdWFsaXplci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzogKF9kb19pbml0KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9iYW5kX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2JhbmRfY2xhc3NfaW5pdCksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9nZXRfdHlwZSksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfY2hpbGRfcHJveHlfZ2V0X2NoaWxkX2J5X2luZGV4KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9nZXRfY2hpbGRyZW5fY291bnQpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2ludGVyZmFjZV9pbml0KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9iYXNlX2luaXQpLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfY2xhc3NfaW5pdCksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfZmluYWxpemUpLCAoc2V0dXBfZmlsdGVyKSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9jb21wdXRlX2ZyZXF1ZW5jaWVzKSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9zZXRfcHJvcGVydHkpLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9zZXR1cCksIChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmg6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVybmJhbmRzLmM6CisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfbmJhbmRzX2Jhc2VfaW5pdCksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfbmJhbmRzX2NsYXNzX2luaXQpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX25iYW5kc19pbml0KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9uYmFuZHNfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9uYmFuZHNfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuaDoKKwkgIFJlZmFjdG9yIHBsdWdpbiBpbnRvIGEgYmFzZSBjbGFzcyBhbmQgYSBmaXJzdCBzdWJjbGFzcyAobmJhbmQgZXEpLiBUaGUKKwkgIG5iYW5kIGVxIHVzZXMgR3N0Q2hpbGRQcm94eSBhbmQgaXMgY29udHJvbGFibGUuIE1vcmUgc3ViY2xhc3NlcyB3aWxsCisJICBmb2xsb3cuCisKKzIwMDctMDMtMDggMTY6MDE6NDIgKzAwMDAgIFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogTWFrZSBhdmlkZW11eCBhY2NlcHQgb3B0aW9uYWwgaGVhZGVyIGNodW5rcyBpbiBhbnkgb3JkZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBSZW7DqSBTdGFkbGVyIDxtYWlsIGF0IHJlbmVzdGFkbGVyIGRvdCBkZT4KKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0pLAorCSAgKGdzdF9hdmlfZGVtdXhfcHVzaF9ldmVudCksIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSksIChnc3RfYXZpX2RlbXV4X2NoYWluKToKKwkgIE1ha2UgYXZpZGVtdXggYWNjZXB0IG9wdGlvbmFsIGhlYWRlciBjaHVua3MgaW4gYW55IG9yZGVyLgorCSAgRml4ZXMgIzQxNTQ0Ni4KKworMjAwNy0wMy0wOCAxMjoyMzo1NyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOiBEaXNhYmxlIHRoZSBzdGF0ZXMgY2hlY2sgdW50aWwgdGhlIHJlbWFpbmluZyBWYWxncmluZCBlcnJvcnMgYXJlIGZpeGVkIG9yIHN1cHByZXNzZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBEaXNhYmxlIHRoZSBzdGF0ZXMgY2hlY2sgdW50aWwgdGhlIHJlbWFpbmluZyBWYWxncmluZCBlcnJvcnMKKwkgIGFyZSBmaXhlZCBvciBzdXBwcmVzc2VkLgorCisyMDA3LTAzLTA4IDEwOjI0OjQzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6IEFkZCBhdWRpb2R5bmFtaWMgY2hlY2sgdG8gLmN2c2lnbm9yZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6CisJICBBZGQgYXVkaW9keW5hbWljIGNoZWNrIHRvIC5jdnNpZ25vcmUKKworMjAwNy0wMy0wOCAxMDowMjoxMiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvYXVkaW9meC86IEFkZCBuZXcgYXVkaW9keW5hbWljIGVsZW1lbnQgd2hpY2ggY2FuIGFjdCBhcyBhIGNvbXByZXNzb3Igb3IgZXhwYW5kZXIuIFN1cHBvcnRlZCBhcmUgaGFyZC1rbmVlIGFuZCBzb2YuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmV2aWV3ZWQgYnk6IFN0ZWZhbiBLb3N0ICA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisJICAqIGdzdC9hdWRpb2Z4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuYzoKKwkgIChnc3RfYXVkaW9fZHluYW1pY19jaGFyYWN0ZXJpc3RpY3NfZ2V0X3R5cGUpLAorCSAgKGdzdF9hdWRpb19keW5hbWljX21vZGVfZ2V0X3R5cGUpLAorCSAgKGdzdF9hdWRpb19keW5hbWljX3NldF9wcm9jZXNzX2Z1bmN0aW9uKSwKKwkgIChnc3RfYXVkaW9fZHluYW1pY19iYXNlX2luaXQpLCAoZ3N0X2F1ZGlvX2R5bmFtaWNfY2xhc3NfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2R5bmFtaWNfaW5pdCksIChnc3RfYXVkaW9fZHluYW1pY19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdWRpb19keW5hbWljX2dldF9wcm9wZXJ0eSksIChnc3RfYXVkaW9fZHluYW1pY19zZXR1cCksCisJICAoZ3N0X2F1ZGlvX2R5bmFtaWNfdHJhbnNmb3JtX2hhcmRfa25lZV9jb21wcmVzc29yX2ludCksCisJICAoZ3N0X2F1ZGlvX2R5bmFtaWNfdHJhbnNmb3JtX2hhcmRfa25lZV9jb21wcmVzc29yX2Zsb2F0KSwKKwkgIChnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2NvbXByZXNzb3JfaW50KSwKKwkgIChnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2NvbXByZXNzb3JfZmxvYXQpLAorCSAgKGdzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9oYXJkX2tuZWVfZXhwYW5kZXJfaW50KSwKKwkgIChnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1faGFyZF9rbmVlX2V4cGFuZGVyX2Zsb2F0KSwKKwkgIChnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2V4cGFuZGVyX2ludCksCisJICAoZ3N0X2F1ZGlvX2R5bmFtaWNfdHJhbnNmb3JtX3NvZnRfa25lZV9leHBhbmRlcl9mbG9hdCksCisJICAoZ3N0X2F1ZGlvX2R5bmFtaWNfdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmg6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZnguYzogKHBsdWdpbl9pbml0KToKKwkgIEFkZCBuZXcgYXVkaW9keW5hbWljIGVsZW1lbnQgd2hpY2ggY2FuIGFjdCBhcyBhIGNvbXByZXNzb3Igb3IKKwkgIGV4cGFuZGVyLiBTdXBwb3J0ZWQgYXJlIGhhcmQta25lZSBhbmQgc29mdC1rbmVlIG9wZXJhdGlvbiBtb2RlcyB3aXRoCisJICB1c2VyLXNwZWNpZmllZCByYXRpbyBhbmQgdGhyZXNob2xkLgorCSAgQXR0YWNrIGFuZCByZWxlYXNlIHBhcmFtZXRlcnMgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQgYnV0IHdpbGwgZm9sbG93LgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJICBJbnRlZ3JhdGUgYXVkaW9keW5hbWljIGludG8gdGhlIGRvY3MuCisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2R5bmFtaWMuYzogKHNldHVwX2R5bmFtaWMpLAorCSAgKGNsZWFudXBfZHluYW1pYyksIChHU1RfU1RBUlRfVEVTVCksIChkeW5hbWljX3N1aXRlKSwgKG1haW4pOgorCSAgQWRkIHVuaXQgdGVzdCBmb3IgYXVkaW9keW5hbWljLgorCisyMDA3LTAzLTA3IDE5OjQ4OjAzICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IEZyZWUgaGFuZGxlcyB0aGF0IHdlIGFsbG9jYXRlZCB3aGVuIGV4aXRpbmcgdmlhIHRoZSBlcnJvciBwYXRocy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzogKGdzdF9kdjEzOTRzcmNfc3RhcnQpOgorCSAgRnJlZSBoYW5kbGVzIHRoYXQgd2UgYWxsb2NhdGVkIHdoZW4gZXhpdGluZyB2aWEgdGhlIGVycm9yIHBhdGhzLgorCisyMDA3LTAzLTA3IDEyOjA3OjA3ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrLzogVXNlIGEgZ2VuZXJhbCB3YXZwYWNrIGRlYnVnIGNhdGVnb3J5IGZvciBjb21tb24gY29kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tjb21tb24uYzoKKwkgIFVzZSBhIGdlbmVyYWwgd2F2cGFjayBkZWJ1ZyBjYXRlZ29yeSBmb3IgY29tbW9uIGNvZGUuCisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuYzoKKwkgIChnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX3NldF9wb3NfYWJzKSwKKwkgIChnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX3NldF9wb3NfcmVsKSwKKwkgIChnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX3dyaXRlX2J5dGVzKToKKwkgIFVzZSB0aGUgZ2VuZXJhbCB3YXZwYWNrIGRlYnVnIGNhdGVnb3J5IGhlcmUgdG9vIGFuZCBhZGQgZGVidWcKKwkgIG91dHB1dCB0byB0aGUgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYXQgYWxsIGJ5CisJICB0aGUgd2F2cGFjayBsaWJyYXJ5LgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfcGx1Z2luX2luaXQpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfcGx1Z2luX2luaXQpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogKGdzdF93YXZwYWNrX3BhcnNlX3BsdWdpbl9pbml0KToKKwkgIENoYW5nZSBkZWJ1Z2dpbmcgY2F0ZWdvcnkgbmFtZXMgdG8gY29uZm9ybSB0byB0aGUgY29udmVudGlvbnMuCisKKzIwMDctMDMtMDcgMTE6Mzc6MjMgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguKjogU2hhcmUgcXRkZW11eCBkZWJ1ZyBjYXRlZ29yeSBhY3Jvc3MgYWxsIGZpbGVzLCBvdGhlcndpc2UgYWxsIGRlYnVnZ2luZyBpbiBmaWxlcyBvdGhlciB0aGFuIHF0ZC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSAgU2hhcmUgcXRkZW11eCBkZWJ1ZyBjYXRlZ29yeSBhY3Jvc3MgYWxsIGZpbGVzLCBvdGhlcndpc2UgYWxsIGRlYnVnZ2luZworCSAgaW4gZmlsZXMgb3RoZXIgdGhhbiBxdGRlbXV4LmMgd291bGQgZW5kIHVwIGluIHRoZSBkZWZhdWx0IGNhdGVnb3J5LgorCisyMDA3LTAzLTA3IDExOjI0OjA1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9sZXZlbC9nc3RsZXZlbC4qOiBSZXNvbHZlIG1lc3NhZ2UgdGltZXN0YW1wcyBhZ2FpbnN0IHRoZSBwbGF5YmFjayBzZWdtZW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiAoZ3N0X2xldmVsX2NsYXNzX2luaXQpLAorCSAgKGdzdF9sZXZlbF9zZXRfY2FwcyksIChnc3RfbGV2ZWxfc3RhcnQpLCAoZ3N0X2xldmVsX2V2ZW50KSwKKwkgIChnc3RfbGV2ZWxfdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmg6CisJICBSZXNvbHZlIG1lc3NhZ2UgdGltZXN0YW1wcyBhZ2FpbnN0IHRoZSBwbGF5YmFjayBzZWdtZW50LgorCisyMDA3LTAzLTA3IDExOjIzOjIwICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS4qOiBPbmUgRklYTUUgbGVzcywgYnkgcmVzb2x2aW5nIG1lc3NhZ2UgdGltZXN0YW1wcyBhZ2FpbnN0IHRoZSBwbGF5YmFjayBzZWdtZW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX3N0YXJ0KSwKKwkgIChnc3Rfc3BlY3RydW1fZXZlbnQpLCAoZ3N0X3NwZWN0cnVtX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5oOgorCSAgT25lIEZJWE1FIGxlc3MsIGJ5IHJlc29sdmluZyBtZXNzYWdlIHRpbWVzdGFtcHMgYWdhaW5zdCB0aGUgcGxheWJhY2sKKwkgIHNlZ21lbnQuCisKKzIwMDctMDMtMDYgMjM6MjE6NDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIENoYW5nZUxvZzoKKwkgIEZpeCBDaGFuZ2VMb2cgbWVzc2FnZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGaXggQ2hhbmdlTG9nIG1lc3NhZ2UKKworMjAwNy0wMy0wNiAyMzoxOTozMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IERvbid0IGxlYWsgY2FwczogbWFrZSBnc3RfaWQzZGVtdXhfYWRkX3NyY3BhZCgpIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgY2FwcyBwYXNzZWQgdG8gLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfYWRkX3NyY3BhZCksCisJICAoZ3N0X2lkM2RlbXV4X3NpbmtfYWN0aXZhdGUpOgorCSAgRG9uJ3QgbGVhayBjYXBzOiBtYWtlIGdzdF9pZDNkZW11eF9hZGRfc3JjcGFkKCkgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZQorCSAgY2FwcyBwYXNzZWQgdG8gaXQgKHByZXZpb3VzbGx5IG9uZSBjb2RlIHBhdGggYXNzdW1lcyBpdCB0YWtlcyBvd25lcnNoaXAKKwkgIHdoaWxlIGFub3RoZXIgb25lIGFzc3VtZXMgaXQgZG9lc24ndCkuCisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogdGVzdHMvZmlsZXMvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2ZpbGVzL2lkMy00MDczNDktMS50YWc6CisJICAqIHRlc3RzL2ZpbGVzL2lkMy00MDczNDktMi50YWc6CisJICBBZGQgZGlyZWN0b3J5IHdoZXJlIGRhdGEgZm9yIHVuaXQgdGVzdHMgY2FuIGJlIHN0b3JlZC4KKwkgICogdGVzdHMvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDNkZW11eC5jOiAocGFkX2FkZGVkX2NiKSwgKGVycm9yX2NiKSwKKwkgIChyZWFkX3RhZ3NfZnJvbV9maWxlKSwgKHJ1bl9jaGVja19mb3JfZmlsZSksCisJICAoY2hlY2tfZGF0ZV8xOTc3XzA2XzIzKSwgKEdTVF9TVEFSVF9URVNUKSwgKGlkM2RlbXV4X3N1aXRlKToKKwkgIEFkZCB1bml0IHRlc3QgZm9yIGlkM2RlbXV4LCBhbmQgaW4gcGFydGljdWxhciBmb3IgYnVnICM0MDczNDkuIE9ubHkKKwkgIHRlc3RpbmcgcHVsbC1tb2RlIGZvciBub3c7IHB1c2ggbW9kZSBkb2Vzbid0IHdvcmsgeWV0IGJlY2F1c2UgdGhlIHRlc3QKKwkgIGZpbGVzIGFyZSBzbWFsbGVyIHRoYW4gSUQzX1RZUEVfRklORF9NSU5fU0laRS4KKworMjAwNy0wMy0wNiAyMjoxNDo1OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06IEFkZCBtaXNzaW5nIGJhY2tzbGFzaCBhdCBlbmQgb2YgbGluZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIEFkZCBtaXNzaW5nIGJhY2tzbGFzaCBhdCBlbmQgb2YgbGluZS4KKworMjAwNy0wMy0wNiAxODozNjowOSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIGNvbW1vbjoKKwkgIFRyaWdnZXIgcmVidWlsZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgVHJpZ2dlciByZWJ1aWxkLgorCisyMDA3LTAzLTA2IDE4OjE2OjQ5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvaWQzZGVtdXgvOiBEbyBub3QgY29udmVydCBvYnNvbGV0ZSBUREEvVERBVCBmcmFtZXMgdG8gVERSQyBmcmFtZXMsIG90aGVyd2lzZSB0aGUgZm91ci1kaWdpdCBudW1iZXIgd2lsbCBiZSBpbnRlcnAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOiAoaWQzZGVtdXhfaWQzdjJfZnJhbWVzX3RvX3RhZ19saXN0KToKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuaDoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChpZDNkZW11eF9pZDN2Ml9wYXJzZV9mcmFtZSksCisJICAocGFyc2Vfb2Jzb2xldGVfdGRhdF9mcmFtZSk6CisJICBEbyBub3QgY29udmVydCBvYnNvbGV0ZSBUREEvVERBVCBmcmFtZXMgdG8gVERSQyBmcmFtZXMsIG90aGVyd2lzZQorCSAgdGhlIGZvdXItZGlnaXQgbnVtYmVyIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYSB5ZWFyLCB3aGVyZWFzIGl0IGlzCisJICBtb250aCBhbmQgZGF5IGluIERETU0gZm9ybWF0LiBJbnN0ZWFkLCBwYXJzZSBUREFUIGZyYW1lcyBhbmQgZml4IHVwCisJICB0aGUgZGF0ZSBpbiB0aGUgR1NUX1RBR19EQVRFIHRhZyBsYXRlciBpZiB3ZSBhbHNvIGV4dHJhY3RlZCBhIHllYXIuCisJICBGaXhlcyAjNDA3MzQ5LgorCisyMDA3LTAzLTA2IDE0OjUzOjA0ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZXh0L2djb25mL2dzdHN3aXRjaHNpbmsuYzogRml4IHVwIHRoZSBkaXNwb3NlIGxvZ2ljIHNvIGl0IGRvZXNuJ3QgbGVhaywgYW5kIGZpeCBzZXR0aW5nIG9mIHRoZSBjaGlsZCBzdGF0ZSBzbyB0aGF0IHdlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2djb25mL2dzdHN3aXRjaHNpbmsuYzogKGdzdF9zd2l0Y2hfc2lua19kaXNwb3NlKSwKKwkgIChnc3Rfc3dpdGNoX2NvbW1pdF9uZXdfa2lkKToKKwkgIEZpeCB1cCB0aGUgZGlzcG9zZSBsb2dpYyBzbyBpdCBkb2Vzbid0IGxlYWssIGFuZCBmaXggc2V0dGluZyBvZgorCSAgdGhlIGNoaWxkIHN0YXRlIHNvIHRoYXQgd2UgZG9uJ3Qgc2V0IGEgY2hpbGQgdG8gb3VyIGN1cnJlbnQgc3RhdGUKKwkgIGp1c3QgYXMgd2UgYXJlIGNoYW5naW5nIGl0IHRvIHNvbWV0aGluZyBlbHNlLgorCisyMDA3LTAzLTA2IDEzOjU3OjU1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogRml4IGFuZCBjbGVhbnVwIGRlZmF1bHQgcHJvcGVydHkgdmFsdWVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zcGVjdHJ1bV9pbml0KSwgKGdzdF9zcGVjdHJ1bV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9zcGVjdHJ1bV90cmFuc2Zvcm1faXApOgorCSAgRml4IGFuZCBjbGVhbnVwIGRlZmF1bHQgcHJvcGVydHkgdmFsdWVzLgorCSAgQWRkIEZJWE1FcyBmb3Igc3R1ZmYgdGhhdCBsb29rcyByYXRoZXIgd3JvbmcuCisKKzIwMDctMDMtMDYgMTM6MjE6MjMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9nb29tL2dzdGdvb20uKjogRG9jdW1lbnQsIGZpeCBhbmQgaW1wcm92ZSBnb29tIGFkYXB0ZXIgYmVoYXZpb3VyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9nb29tL2dzdGdvb20uYzogKGdzdF9nb29tX3NyY19zZXRjYXBzKSwgKGdldF9idWZmZXIpLAorCSAgKGdzdF9nb29tX2NoYWluKToKKwkgICogZ3N0L2dvb20vZ3N0Z29vbS5oOgorCSAgRG9jdW1lbnQsIGZpeCBhbmQgaW1wcm92ZSBnb29tIGFkYXB0ZXIgYmVoYXZpb3VyLgorCSAgRml4ZXMgIzQwNzAwNi4KKworMjAwNy0wMy0wNSAxODo0MzoyOSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGV4dC9lc2QvZXNkc2luay5jOiBVbnJlZiBzdGF0aWMgcGFkIHRlbXBsYXRlIGFmdGVyIHVzaW5nIGl0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfb3Blbik6CisJICBVbnJlZiBzdGF0aWMgcGFkIHRlbXBsYXRlIGFmdGVyIHVzaW5nIGl0LgorCisyMDA3LTAzLTA1IDE3OjE3OjA0ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZXh0L2djb25mL2dzdHN3aXRjaHNpbmsuYzogRml4IHVwIHRoZSByZWZlcmVuY2UgY291bnRpbmcgb2YgdGhlIGNoaWxkIGVsZW1lbnRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nY29uZi9nc3Rzd2l0Y2hzaW5rLmM6IChnc3Rfc3dpdGNoX3NpbmtfZGlzcG9zZSksCisJICAoZ3N0X3N3aXRjaF9jb21taXRfbmV3X2tpZCk6CisJICBGaXggdXAgdGhlIHJlZmVyZW5jZSBjb3VudGluZyBvZiB0aGUgY2hpbGQgZWxlbWVudHMuCisKKzIwMDctMDMtMDUgMTc6MDg6MzIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBGaXggZW5jb2RpbmctbmFtZSBjYXNlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOiAoZ3N0X3J0cF9tcDRnX3BheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzogKGdzdF9ydHBfdGhlb3JhX3BheV9maW5pc2hfaGVhZGVycyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6IChnc3RfcnRwX3ZvcmJpc19wYXlfZmluaXNoX2hlYWRlcnMpOgorCSAgRml4IGVuY29kaW5nLW5hbWUgY2FzZS4KKworMjAwNy0wMy0wNSAxNjozOToyOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEZpeCBzcGVleCAoZGUpcGF5bG9hZGVyLiBGaXhlcyAjMzU4MDQwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOiAoZ3N0X3J0cF9zcGVleF9kZXBheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX3NwZWV4X2RlcGF5X2dldF9tb2RlKSwgKGdzdF9ydHBfc3BlZXhfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9zcGVleF9kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOiAoZ3N0X3J0cF9zcGVleF9wYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX3NwZWV4X3BheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfc3BlZXhfcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfc3BlZXhfcGF5X3BhcnNlX2lkZW50KSwgKGdzdF9ydHBfc3BlZXhfcGF5X2hhbmRsZV9idWZmZXIpLAorCSAgKGdzdF9ydHBfc3BlZXhfcGF5X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuaDoKKwkgIEZpeCBzcGVleCAoZGUpcGF5bG9hZGVyLiBGaXhlcyAjMzU4MDQwLgorCisyMDA3LTAzLTA1IDE1OjQyOjU4ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZXh0L2djb25mL2dzdHN3aXRjaHNpbmsuYzogSW5zdGFsbCBmYWtlc2luayBpbiBOVUxMIGJ5IGZpeGluZyBzb21lIGJyb2tlbiBsb2dpYy4gVGhpcyBvYnZpYXRlcyB0aGUgbmVlZCB0byBtYW51YWxseSBzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2djb25mL2dzdHN3aXRjaHNpbmsuYzogKGdzdF9zd2l0Y2hfc2lua19yZXNldCksCisJICAoZ3N0X3N3aXRjaF9jb21taXRfbmV3X2tpZCksIChnc3Rfc3dpdGNoX3Npbmtfc2V0X2NoaWxkKToKKwkgIEluc3RhbGwgZmFrZXNpbmsgaW4gTlVMTCBieSBmaXhpbmcgc29tZSBicm9rZW4gbG9naWMuIFRoaXMgb2J2aWF0ZXMKKwkgIHRoZSBuZWVkIHRvIG1hbnVhbGx5IHNldCBfSVNfU0lOSy4KKwkgIEFkZCBzb21lIGNvbW1lbnRzIGFuZCByZW1vdmUgYSBsaXR0bGUgY3J1ZnQgd2hpbGUgSSdtIGF0IGl0LgorCisyMDA3LTAzLTA1IDE0OjQ2OjQzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvZ2NvbmYvZ3N0c3dpdGNoc2luay5jOiBNYXJrIHVzIGFzIGEgc2luayB3aGVuIHdlIGhhdmUgbm8gZmFrZXNpbmsgaW4gTlVMTC4gRml4ZXMgIzQxNDg4Ny4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2NvbmYvZ3N0c3dpdGNoc2luay5jOiAoZ3N0X3N3aXRjaF9zaW5rX3Jlc2V0KToKKwkgIE1hcmsgdXMgYXMgYSBzaW5rIHdoZW4gd2UgaGF2ZSBubyBmYWtlc2luayBpbiBOVUxMLiBGaXhlcyAjNDE0ODg3LgorCisyMDA3LTAzLTA1IDA4OjMwOjUyICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9zcGVjdHJ1bS86IFJlbW92ZSB0d28gb2Jzb2xldGUgYW5kIGNvbmZ1c2luZyBjb21tZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYzogKG1lc3NhZ2VfaGFuZGxlcik6CisJICAqIGdzdC9zcGVjdHJ1bS9kZW1vLW9zc3NyYy5jOiAobWVzc2FnZV9oYW5kbGVyKToKKwkgIFJlbW92ZSB0d28gb2Jzb2xldGUgYW5kIGNvbmZ1c2luZyBjb21tZW50cy4KKworMjAwNy0wMy0wNCAxODo1MjoxMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgcG8vUE9URklMRVMuaW46IFVwZGF0ZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBwby9QT1RGSUxFUy5pbjoKKwkgIFVwZGF0ZS4KKworMjAwNy0wMy0wNCAxNzozMzozNCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOiBHYWghIEFsc28gZGlzYWJsZSBnY29uZnZpZGVvc2luayBmcm9tIHRoZSB0ZXN0cywgb3RoZXJ3aXNlIGl0IHdpbGwgaW5zdGFudGlhdGUgYXV0b3ZpZGVvc2luay4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgR2FoISBBbHNvIGRpc2FibGUgZ2NvbmZ2aWRlb3NpbmsgZnJvbSB0aGUgdGVzdHMsIG90aGVyd2lzZQorCSAgaXQgd2lsbCBpbnN0YW50aWF0ZSBhdXRvdmlkZW9zaW5rLCBhbmQgZGZidmlkZW9zaW5rIGFuZAorCSAgbGVhayBvbiB0aGUgYnVpbGRib3RzLgorCisyMDA3LTAzLTA0IDE3OjEzOjE5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZXh0L2NkaW8vZ3N0Y2Rpb2NkZGFzcmMuYzogTWFrZSBzdXJlIHdlIGFsd2F5cyBkZXN0cm95IG91ciBsaWJjZGlvIGhhbmRsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Rpby9nc3RjZGlvY2RkYXNyYy5jOiAoZ3N0X2NkaW9fY2RkYV9zcmNfb3BlbiksCisJICAoZ3N0X2NkaW9fY2RkYV9zcmNfZmluYWxpemUpOgorCSAgTWFrZSBzdXJlIHdlIGFsd2F5cyBkZXN0cm95IG91ciBsaWJjZGlvIGhhbmRsZS4KKworMjAwNy0wMy0wNCAxNzowNTo1OCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOiBEaXNhYmxlIGF1dG92aWRlb3Npbmsgc28gdGhlIGJ1aWxkYm90cyBkb24ndCBiYXJmIG92ZXIgbWVtb3J5IGxlYWtlZCBpbiB0aGUgZGlyZWN0ZmIgc2luay4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIERpc2FibGUgYXV0b3ZpZGVvc2luayBzbyB0aGUgYnVpbGRib3RzIGRvbid0IGJhcmYgb3ZlciBtZW1vcnkKKwkgIGxlYWtlZCBpbiB0aGUgZGlyZWN0ZmIgc2luay4KKworMjAwNy0wMy0wNCAxNToyODozMCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6IENoYWluIHVwIGluIGRpc3Bvc2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiAoZ3N0X3hpbWFnZV9zcmNfZGlzcG9zZSk6CisJICBDaGFpbiB1cCBpbiBkaXNwb3NlCisKKzIwMDctMDMtMDQgMTU6MDc6MTUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6IFVzZSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSBpbnN0ZWFkIG9mIHN0YXRpY19wYWRfdGVtcGxhdGVfZ2V0K3BhZF9uZXcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOiAoZ3N0X211bHRpcGFydF9kZW11eF9pbml0KSwKKwkgIChnc3RfbXVsdGlwYXJ0X2ZpbmRfcGFkX2J5X21pbWUpOgorCSAgVXNlIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlIGluc3RlYWQgb2YKKwkgIHN0YXRpY19wYWRfdGVtcGxhdGVfZ2V0K3BhZF9uZXcuCisKKzIwMDctMDMtMDQgMTQ6NTY6NTMgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiBDYXRjaCB0aGUgY2FzZSB3aGVyZSBubyBjbG9jayBoYXMgYmVlbiBzZXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzogKGdzdF94aW1hZ2Vfc3JjX2NyZWF0ZSk6CisJICBDYXRjaCB0aGUgY2FzZSB3aGVyZSBubyBjbG9jayBoYXMgYmVlbiBzZXQuCisKKzIwMDctMDMtMDQgMTM6NTI6MDMgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBGaXggYSBidW5jaCBvZiBsZWFrcyBzaG93biBieSB0aGUgbmV3bHktYWRkZWQgc3RhdGVzIHRlc3QuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOiAoZ3N0X2ZsYWNfZW5jX2ZpbmFsaXplKToKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmM6IChnc3RfZ2NvbmZfYXVkaW9fc2lua19jbGFzc19pbml0KSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc2lua19kaXNwb3NlKSwgKGdzdF9nY29uZl9hdWRpb19zaW5rX2ZpbmFsaXplKToKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuYzogKGdzdF9nY29uZl9hdWRpb19zcmNfYmFzZV9pbml0KSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc3JjX2NsYXNzX2luaXQpLCAoZ3N0X2djb25mX2F1ZGlvX3NyY19kaXNwb3NlKSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc3JjX2ZpbmFsaXplKSwgKGRvX3RvZ2dsZV9lbGVtZW50KToKKwkgICogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zaW5rLmM6IChnc3RfZ2NvbmZfdmlkZW9fc2lua19iYXNlX2luaXQpLAorCSAgKGdzdF9nY29uZl92aWRlb19zaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2djb25mX3ZpZGVvX3NpbmtfZmluYWxpemUpLAorCSAgKGRvX3RvZ2dsZV9lbGVtZW50KToKKwkgICogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zcmMuYzogKGdzdF9nY29uZl92aWRlb19zcmNfYmFzZV9pbml0KSwKKwkgIChnc3RfZ2NvbmZfdmlkZW9fc3JjX2NsYXNzX2luaXQpLCAoZ3N0X2djb25mX3ZpZGVvX3NyY19kaXNwb3NlKSwKKwkgIChnc3RfZ2NvbmZfdmlkZW9fc3JjX2ZpbmFsaXplKSwgKGRvX3RvZ2dsZV9lbGVtZW50KToKKwkgICogZXh0L2djb25mL2dzdHN3aXRjaHNpbmsuYzogKGdzdF9zd2l0Y2hfc2lua19jbGFzc19pbml0KSwKKwkgIChnc3Rfc3dpdGNoX3NpbmtfcmVzZXQpLCAoZ3N0X3N3aXRjaF9zaW5rX3NldF9jaGlsZCk6CisJICAqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zaW5rLmM6IChnc3RfaGFsX2F1ZGlvX3NpbmtfYmFzZV9pbml0KToKKwkgICogZXh0L2hhbC9nc3RoYWxhdWRpb3NyYy5jOiAoZ3N0X2hhbF9hdWRpb19zcmNfYmFzZV9pbml0KToKKwkgICogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzogKGdzdF9zaG91dDJzZW5kX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zaG91dDJzZW5kX2luaXQpLCAoZ3N0X3Nob3V0MnNlbmRfZmluYWxpemUpOgorCSAgKiBnc3QvZGVidWcvdGVzdHBsdWdpbi5jOiAoZ3N0X3Rlc3RfY2xhc3NfaW5pdCksCisJICAoZ3N0X3Rlc3RfZmluYWxpemUpOgorCSAgKiBnc3QvZmx4L2dzdGZseGRlYy5jOiAoZ3N0X2ZseGRlY19jbGFzc19pbml0KSwKKwkgIChnc3RfZmx4ZGVjX2Rpc3Bvc2UpOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOiAoZ3N0X211bHRpcGFydF9tdXhfZmluYWxpemUpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzogKGdzdF9ydHBfbXA0Z19wYXlfZmluYWxpemUpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19pbml0KSwKKwkgIChnc3RfcnRzcHNyY19maW5hbGl6ZSk6CisJICAqIGdzdC9ydHNwL3J0c3BleHR3bXMuYzogKHJ0c3BfZXh0X3dtc19mcmVlX2NvbnRleHQpOgorCSAgKiBnc3QvcnRzcC9ydHNwZXh0d21zLmg6CisJICAqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiAoZ3N0X3NtcHRlX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zbXB0ZV9maW5hbGl6ZSk6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChnc3RfbXVsdGl1ZHBzaW5rX2ZpbmFsaXplKToKKwkgICogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6IChnc3RfdWRwc2lua19jbGFzc19pbml0KSwKKwkgIChnc3RfdWRwc2lua19maW5hbGl6ZSk6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2Rpc3Bvc2UpLAorCSAgKGdzdF93YXZwYXJzZV9zaW5rX2FjdGl2YXRlKToKKwkgICogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3NzX3NpbmtfZmluYWxpc2UpOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NyYy5jOiAoZ3N0X29zc19zcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X29zc19zcmNfZmluYWxpemUpOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6IChnc3RfdjRsMl9vYmplY3RfZGVzdHJveSk6CisJICAqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3Y0bDJzcmNfZmluYWxpemUpOgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiAoZ3N0X3hpbWFnZV9zcmNfeGltYWdlX2dldCk6CisJICBGaXggYSBidW5jaCBvZiBsZWFrcyBzaG93biBieSB0aGUgbmV3bHktYWRkZWQgc3RhdGVzIHRlc3QuCisKKzIwMDctMDMtMDQgMTM6NDE6MDAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBleHQvZHYvZ3N0ZHZkZWMuYzogVXNlIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlIGluc3RlYWQgb2Ygc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXQrcGFkX25ldy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19pbml0KToKKwkgIFVzZSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSBpbnN0ZWFkIG9mCisJICBzdGF0aWNfcGFkX3RlbXBsYXRlX2dldCtwYWRfbmV3LgorCisyMDA3LTAzLTAzIDEzOjA2OjIxICswMDAwICBMb8OvYyBNaW5pZXIgPGxvb2wrZ25vbWVAdmlhLmVjcC5mcj4KKworCSAgRG9uJ3QgbWl4IHRhYnMgYW5kIHNwYWNlcyAoIzQxNDE2OCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBMb8OvYyBNaW5pZXIgPGxvb2wrZ25vbWUgYXQgdmlhIGVjcCBmcj4KKwkgICogZXh0L2xpYmNhY2EvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWJ1Zy9NYWtlZmlsZS5hbToKKwkgIERvbid0IG1peCB0YWJzIGFuZCBzcGFjZXMgKCM0MTQxNjgpLgorCisyMDA3LTAzLTAyIDIxOjM1OjExICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHRlc3RzL2NoZWNrL2dlbmVyaWMvLmN2c2lnbm9yZTogSWdub3JlIGZpbGVzIHRvIHBsZWFzZSBidWlsZGJvdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9nZW5lcmljLy5jdnNpZ25vcmU6CisJICBJZ25vcmUgZmlsZXMgdG8gcGxlYXNlIGJ1aWxkYm90LgorCisyMDA3LTAzLTAyIDIxOjAxOjE5ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBVbmJyZWFrIG15IHByZXZpb3VzIGNvbW1pdCAoc3dhcHBlZCBub21pbmF0b3IgJiBkZW5vbWluYXRvcikuIFRpbSwgdGhhbmtzIGZvciBzcG90dGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKToKKwkgIFVuYnJlYWsgbXkgcHJldmlvdXMgY29tbWl0IChzd2FwcGVkIG5vbWluYXRvciAmIGRlbm9taW5hdG9yKS4gVGltLAorCSAgdGhhbmtzIGZvciBzcG90dGluZy4KKworMjAwNy0wMy0wMiAxNjowODoxNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2NkaW8vZ3N0Y2Rpb2NkZGFzcmMuYzogU21hbGwgY29kZSBjbGVhbnVwcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Rpby9nc3RjZGlvY2RkYXNyYy5jOiAoZ3N0X2NkaW9fY2RkYV9zcmNfcHJvYmVfZGV2aWNlcyksCisJICAoZ3N0X2NkaW9fY2RkYV9zcmNfcmVhZF9zZWN0b3IpLCAoZ3N0X2NkaW9fY2RkYV9zcmNfb3BlbiksCisJICAoZ3N0X2NkaW9fY2RkYV9zcmNfZmluYWxpemUpOgorCSAgU21hbGwgY29kZSBjbGVhbnVwcy4KKwkgIERvbid0IHVzZSBwYWRfYWxsb2MgYXMgdGhlIGJhc2UgY2xhc3MgY2Fubm90IGRlYWwgd2l0aCB0aGUgZXJyb3IgY29kZXMuCisKKzIwMDctMDMtMDIgMTM6NDA6MDYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IEZpeCBkb2MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3VkcHNyY19jcmVhdGUpOgorCSAgRml4IGRvYy4KKworMjAwNy0wMy0wMiAxMzoyOToyNSArMDAwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IEhhbmRsZSByb3VuZGluZyBiZXR0ZXIgdG8gbm90IGRyb3AgbGFzdCBzYW1wbGUgZnJhbWUuIEZpeGVzICMzNTY2OTIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAodWludDY0X2NlaWxpbmdfc2NhbGVfaW50KSwKKwkgIChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKToKKwkgIEhhbmRsZSByb3VuZGluZyBiZXR0ZXIgdG8gbm90IGRyb3AgbGFzdCBzYW1wbGUgZnJhbWUuIEZpeGVzICMzNTY2OTIKKworMjAwNy0wMy0wMiAxMzoxOTo1NyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOiBEaXNhYmxlIGNhY2FzaW5rIGZyb20gdGhlIHN0YXRlcyBjaGVjayB0b28gLSBpdCBhbHNvIGNhbGxzIGV4aXQoMSkgb24gdXMgd2hlbiBpdCBjYW4ndCBmaW5kIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgRGlzYWJsZSBjYWNhc2luayBmcm9tIHRoZSBzdGF0ZXMgY2hlY2sgdG9vIC0gaXQgYWxzbyBjYWxscyBleGl0KDEpCisJICBvbiB1cyB3aGVuIGl0IGNhbid0IGZpbmQgYSB0ZXJtaW5hbCB0byB0YWxrIHRvLgorCisyMDA3LTAzLTAyIDEyOjU2OjEzICswMDAwICBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy4qOiBBZGQgc3VwcG9ydCB0byBzdHJpcCBwcm9wcmlldGFyeSBoZWFkZXJzLiBGaXhlcyAjMzUwMjk2LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyIGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3VkcHNyY19pbml0KSwKKwkgIChnc3RfdWRwc3JjX2NyZWF0ZSksIChnc3RfdWRwc3JjX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3VkcHNyY19nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgQWRkIHN1cHBvcnQgdG8gc3RyaXAgcHJvcHJpZXRhcnkgaGVhZGVycy4gRml4ZXMgIzM1MDI5Ni4KKworMjAwNy0wMy0wMiAxMjo1Mjo1NiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYzogRml4IGNvbXBpbGF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6IChnc3RfcnRwX21wMnRfZGVwYXlfcHJvY2Vzcyk6CisJICBGaXggY29tcGlsYXRpb24uCisKKzIwMDctMDMtMDIgMTI6MTY6MTYgKzAwMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5Lio6IEFkZCBzdXBwb3J0IHRvIHN0cmlwIG9mZiBwcm9wcmlldGFyeSBoZWFkZXJzLiBGaXhlcyAjMzUwMjc4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyIGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6IChnc3RfcnRwX21wMnRfZGVwYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9tcDJ0X2RlcGF5X2luaXQpLCAoZ3N0X3J0cF9tcDJ0X2RlcGF5X3Byb2Nlc3MpLAorCSAgKGdzdF9ydHBfbXAydF9kZXBheV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfbXAydF9kZXBheV9nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5oOgorCSAgQWRkIHN1cHBvcnQgdG8gc3RyaXAgb2ZmIHByb3ByaWV0YXJ5IGhlYWRlcnMuIEZpeGVzICMzNTAyNzguCisKKzIwMDctMDMtMDIgMTE6MjI6MzUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9oYWwvaGFsLmM6IEZpeCBjb21waWxhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvaGFsL2hhbC5jOgorCSAgRml4IGNvbXBpbGF0aW9uLgorCisyMDA3LTAzLTAyIDEwOjU0OjQ5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuKjogUmVtb3ZlIGRldmljZS1uYW1lIGZyb20gR3N0U3VuQXVkaW9TcmMuIEZpeGVzICM0MTI1OTcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc3JjLmM6IChnc3Rfc3VuYXVkaW9zcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3N1bmF1ZGlvc3JjX2luaXQpLCAoZ3N0X3N1bmF1ZGlvc3JjX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3N1bmF1ZGlvc3JjX29wZW4pOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuaDoKKwkgIFJlbW92ZSBkZXZpY2UtbmFtZSBmcm9tIEdzdFN1bkF1ZGlvU3JjLiBGaXhlcyAjNDEyNTk3LgorCisyMDA3LTAzLTAxIDIxOjUwOjM2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC9oYWwvOiBIYXZpbmcgTlVMTCBhcyBVREkgcHJldmlvdXNseSBzZWxlY3RlZCB0aGUgZGVmYXVsdCBzaW5rL3NyYy4gQ2hhbmdlIHRoaXMgYmFjayBidXQgbWVudGlvbiBpdCBpbiB0aGUgZGVidWcgby4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zaW5rLmM6IChkb190b2dnbGVfZWxlbWVudCk6CisJICAqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zcmMuYzogKGRvX3RvZ2dsZV9lbGVtZW50KToKKwkgIEhhdmluZyBOVUxMIGFzIFVESSBwcmV2aW91c2x5IHNlbGVjdGVkIHRoZSBkZWZhdWx0IHNpbmsvc3JjLiBDaGFuZ2UKKwkgIHRoaXMgYmFjayBidXQgbWVudGlvbiBpdCBpbiB0aGUgZGVidWcgb3V0cHV0LgorCSAgKiBleHQvaGFsL2hhbC5jOiAoZ3N0X2hhbF9nZXRfYWxzYV9lbGVtZW50KSwKKwkgIChnc3RfaGFsX2dldF9vc3NfZWxlbWVudCksIChnc3RfaGFsX2dldF9zdHJpbmcpLAorCSAgKGdzdF9oYWxfcmVuZGVyX2Jpbl9mcm9tX3VkaSksIChnc3RfaGFsX2dldF9hdWRpb19zaW5rKSwKKwkgIChnc3RfaGFsX2dldF9hdWRpb19zcmMpOgorCSAgKiBleHQvaGFsL2hhbC5oOgorCSAgUmVmYWN0b3IgYSBiaXQsIGNoZWNrIGFsbCBlcnJvciBjb25kaXRpb25zLCBncmVhdGx5IGltcHJvdmUgZGVidWdnaW5nCisJICBhbmQgZml4IHNvbWUgcG9zc2libGUgbWVtb3J5IGxlYWtzLiBBbHNvIGltcGxlbWVudCBPU1Mgc3VwcG9ydAorCSAgYW5kIGFsbG93IHNwZWNpZnlpbmcgYW4gVURJIHRoYXQgcG9pbnRzIHRvIGEgcmVhbCBkZXZpY2UuIEZvciB0aGlzIHRoZQorCSAgY2hpbGQgZGV2aWNlIHdoaWNoIHN1cHBvcnRzIEFMU0EgKHByZWZlcnJlZCkgb3IgT1NTIGlzIHVzZWQuCisJICBBcyBhIHNpZGUgZWZmZWN0IHRoaXMgbWFrZXMgaXQgaW1wb3NzaWJsZSBub3cgdG8gZ2V0IGEgYWxzYXNpbmsgaW4KKwkgIGhhbGF1ZGlvc3JjIGFuZCBhIGFsc2FzcmMgaW4gaGFsYXVkaW9zaW5rLgorCisyMDA3LTAzLTAxIDE4OjQ3OjI4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IEVycm9ycyBmcm9tIHRoZSB1ZHAgc291cmNlcyBhcmUgbm90IGZhdGFsIHVubGVzcyBhbGwgb2YgdGhlbSBhcmUgaW4gZXJyb3IuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZmluZF9zdHJlYW1fYnlfY2hhbm5lbCksCisJICAoZmluZF9zdHJlYW1fYnlfdWRwc3JjKSwgKGdzdF9ydHNwc3JjX2hhbmRsZV9tZXNzYWdlKToKKwkgIEVycm9ycyBmcm9tIHRoZSB1ZHAgc291cmNlcyBhcmUgbm90IGZhdGFsIHVubGVzcyBhbGwgb2YgdGhlbSBhcmUgaW4KKwkgIGVycm9yLgorCisyMDA3LTAzLTAxIDE4OjE0OjQyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06IERpc2FibGUgYWFzaW5rIGluIHRoZSBzdGF0ZXMgdGVzdC4gSSBzdXNwZWN0IHRoaXMgaXMgdGhlIGVsZW1lbnQgdGhhdCBpcyBjYWxsaW5nIGV4aXQoMSkgd2hlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICBEaXNhYmxlIGFhc2luayBpbiB0aGUgc3RhdGVzIHRlc3QuIEkgc3VzcGVjdCB0aGlzIGlzIHRoZSBlbGVtZW50IHRoYXQKKwkgIGlzIGNhbGxpbmcgZXhpdCgxKSB3aGVuIGl0IGNhbid0IHByb2NlZWQuCisKKzIwMDctMDMtMDEgMTc6MjY6MzAgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogRHJhdyBwbHVnaW5zIGluIGZyb20gdGhlIGJ1aWxkIHRyZWUgc3lzLyBkaXIsIHJhdGhlciB0aGFuIHBpY2tpbmcgdXAgdGhlIGFscmVhZHkgaW5zdGFsbGVkIHYuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIERyYXcgcGx1Z2lucyBpbiBmcm9tIHRoZSBidWlsZCB0cmVlIHN5cy8gZGlyLCByYXRoZXIgdGhhbiBwaWNraW5nCisJICB1cCB0aGUgYWxyZWFkeSBpbnN0YWxsZWQgdmVyc2lvbnMuCisKKzIwMDctMDMtMDEgMTA6NDQ6MzYgKzAwMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkgIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6IEVycm9yIG91dCBjb3JyZWN0bHkgd2hlbiBnZXR0aW5nIHhjb250ZXh0IGZhaWxzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA3LTAzLTAxICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisJICAqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6IChnc3RfeGltYWdlX3NyY19vcGVuX2Rpc3BsYXkpOgorCSAgRXJyb3Igb3V0IGNvcnJlY3RseSB3aGVuIGdldHRpbmcgeGNvbnRleHQgZmFpbHMuCisKKzIwMDctMDMtMDEgMDk6Mjk6MzQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOiBNYWtlIHN0YXRlIGNoYW5nZSB0byBQQVVTRUQgTk9fUFJFUk9MTCBiZWNhdXNlIHRoYXQncyB3aGF0IGl0IHdpbGwgYmUgaW4gdGhlIGZ1dHVyZSBhbmQgcnRzcHNyYy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOiAoZ3N0X3J0cGRlY19jaGFuZ2Vfc3RhdGUpOgorCSAgTWFrZSBzdGF0ZSBjaGFuZ2UgdG8gUEFVU0VEIE5PX1BSRVJPTEwgYmVjYXVzZSB0aGF0J3Mgd2hhdCBpdCB3aWxsIGJlIGluCisJICB0aGUgZnV0dXJlIGFuZCBydHNwc3JjIHJlbGllcyBvbiBpdC4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90cmFuc3BvcnQpLAorCSAgKGdzdF9ydHNwc3JjX2NoYW5nZV9zdGF0ZSk6CisJICBEb24ndCBlcnJvciBvdXQgd2hlbiB3ZSBkb24ndCBnZXQgYW4gZXJyb3IgZnJvbSB0aGUgc3RhdGUgY2hhbmdlCisJICBmdW5jdGlvbi4KKworMjAwNy0wMy0wMSAwMTo0ODo1OSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvaGFsLzogQ2hlY2sgaWYgdGhlIGRldmljZSBVREkgaXMgc2V0IGJlZm9yZSB0cnlpbmcgdG8gcXVlcnkgSEFMIGFib3V0IGl0IGFuZCBnaXZlIGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UgaWYgaXQgd2EuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvaGFsL2dzdGhhbGF1ZGlvc2luay5jOiAoZG9fdG9nZ2xlX2VsZW1lbnQpOgorCSAgKiBleHQvaGFsL2dzdGhhbGF1ZGlvc3JjLmM6IChkb190b2dnbGVfZWxlbWVudCk6CisJICBDaGVjayBpZiB0aGUgZGV2aWNlIFVESSBpcyBzZXQgYmVmb3JlIHRyeWluZyB0byBxdWVyeSBIQUwKKwkgIGFib3V0IGl0IGFuZCBnaXZlIGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UgaWYgaXQgd2Fzbid0IHNldC4KKwkgICogZXh0L2hhbC9oYWwuYzogKGdzdF9oYWxfZ2V0X3N0cmluZyk6CisJICBEb24ndCBxdWVyeSBIQUwgZm9yIE5VTEwgVURJcy4gUGFzc2luZyBOVUxMIGFzIFVESSB0byBIQUwKKwkgIGdpdmVzIGFuIGFzc2VydGlvbiBmYWlsdXJlIGluIEQtQnVzIHdoZW4gcnVubmluZyB3aXRoCisJICBEQlVTX0ZBVEFMX1dBUk5JTkdTPTEuCisKKzIwMDctMDItMjggMTk6Mjk6NDIgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICB1cGRhdGUgY29uZmlnIHRvIHRydW5rCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHVwZGF0ZSBjb25maWcgdG8gdHJ1bmsKKworMjAwNy0wMi0yOCAxOToyOToyNSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGNvbmZpZ3VyZS5hYzogQ29udmVydCB0byBuZXcgQUdfR1NUIHN0eWxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIENvbnZlcnQgdG8gbmV3IEFHX0dTVCBzdHlsZS4KKworMjAwNy0wMi0yOCAxMjo1OTo0MyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIHRlc3RzL2NoZWNrLzogYWRkIHRlc3QgZm9yIHN0YXRlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9nZW5lcmljL3N0YXRlcy5jOiAoR1NUX1NUQVJUX1RFU1QpLCAoc3RhdGVzX3N1aXRlKToKKwkgIGFkZCB0ZXN0IGZvciBzdGF0ZXMKKworMjAwNy0wMi0yOCAxMDo1ODoxMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZTogQWRkIG5ldyB2aWRlb2ZpbHRlciBjaGVjayB0byAuY3ZzaWdub3JlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6CisJICBBZGQgbmV3IHZpZGVvZmlsdGVyIGNoZWNrIHRvIC5jdnNpZ25vcmUuCisKKzIwMDctMDItMjggMTA6NTQ6NTUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogRml4IGNvbWJpbmVkIGZsb3cgcmV0dXJuLiBGaXhlcyAjNDEyNjA4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfY29tYmluZV9mbG93cyksCisJICAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSksCisJICAoZ3N0X2F2aV9kZW11eF9sb29wKSwgKGdzdF9hdmlfZGVtdXhfY2hhaW4pOgorCSAgRml4IGNvbWJpbmVkIGZsb3cgcmV0dXJuLiBGaXhlcyAjNDEyNjA4LgorCisyMDA3LTAyLTI4IDEwOjQxOjE0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06IERpc3QgaGVhZGVyLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJICBEaXN0IGhlYWRlci4uCisKKzIwMDctMDItMjggMTA6Mjk6MDggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5oOiBBZGQgaGVhZGVyIHRvby4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuaDoKKwkgIEFkZCBoZWFkZXIgdG9vLgorCisyMDA3LTAyLTI4IDEwOjE3OjE1ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorCisJICBnc3QvdmlkZW9maWx0ZXIvOiBQb3J0IGdhbW1hIGZpbHRlciB0byAwLjEwLiBGaXhlcyAjNDEyNzA0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3IGF0IHNreW5ldCBiZT4KKwkgICogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzogKGdzdF9nYW1tYV9iYXNlX2luaXQpLAorCSAgKGdzdF9nYW1tYV9jbGFzc19pbml0KSwgKGdzdF9nYW1tYV9pbml0KSwgKGdzdF9nYW1tYV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9nYW1tYV9nZXRfcHJvcGVydHkpLCAoZ3N0X2dhbW1hX2NhbGN1bGF0ZV90YWJsZXMpLAorCSAgKG9pbF90YWJsZWxvb2t1cF91OCksIChnc3RfZ2FtbWFfc2V0X2NhcHMpLAorCSAgKGdzdF9nYW1tYV9wbGFuYXI0MTFfaXApLCAoZ3N0X2dhbW1hX3RyYW5zZm9ybV9pcCksIChwbHVnaW5faW5pdCk6CisJICBQb3J0IGdhbW1hIGZpbHRlciB0byAwLjEwLiBGaXhlcyAjNDEyNzA0LgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9maWx0ZXIuYzogKHNldHVwX2ZpbHRlciksCisJICAoY2xlYW51cF9maWx0ZXIpLCAoY2hlY2tfZmlsdGVyKSwgKEdTVF9TVEFSVF9URVNUKSwKKwkgICh2aWRlb2JhbGFuY2Vfc3VpdGUpLCAodmlkZW9mbGlwX3N1aXRlKSwgKGdhbW1hX3N1aXRlKSwgKG1haW4pOgorCSAgQWRkIHVuaXQgdGVzdHMgZm9yIHZpZGVvZmlsdGVycy4KKworMjAwNy0wMi0yOCAxMDowNjoyNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvVVJMUzogQWRkIGFub3RoZXIgaW50ZXJlc3RpbmcgdGVzdCB1cmwuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvVVJMUzoKKwkgIEFkZCBhbm90aGVyIGludGVyZXN0aW5nIHRlc3QgdXJsLgorCSAgKiBnc3QvcnRzcC9ydHNwbWVzc2FnZS5jOiAocnRzcF9tZXNzYWdlX2dldF9oZWFkZXIpOgorCSAgRG9uJ3QgYWxsb3cgZ2V0dGluZyBoZWFkZXIgZmllbGRzIGZyb20gZGF0YSBwYWNrZXRzLgorCisyMDA3LTAyLTI3IDIzOjQzOjA4ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIGV4dC9zaG91dDIvZ3N0c2hvdXQyLio6IEFkZCBhIHByb3BlcnR5IGZvciB1c2VybmFtZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOiAoZ3N0X3Nob3V0MnNlbmRfY2xhc3NfaW5pdCksCisJICAoZ3N0X3Nob3V0MnNlbmRfaW5pdCksIChnc3Rfc2hvdXQyc2VuZF9zdGFydCksCisJICAoZ3N0X3Nob3V0MnNlbmRfc2V0X3Byb3BlcnR5KSwgKGdzdF9zaG91dDJzZW5kX2dldF9wcm9wZXJ0eSk6CisJICAqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmg6CisJICBBZGQgYSBwcm9wZXJ0eSBmb3IgdXNlcm5hbWUuCisKKzIwMDctMDItMjcgMTI6MDI6MDMgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3BsdWdpbi5jOgorCSogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmg6CisJKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRwbHVnaW4uYzoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuaDoKKwkqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICB1cGRhdGUgY29weXJpZ2h0IHN0YXRlbWVudHMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdXBkYXRlIGNvcHlyaWdodCBzdGF0ZW1lbnRzCisKKzIwMDctMDItMjcgMTE6NTk6MjEgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50LmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50Lmg6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmg6CisJICB1cGRhdGUgY29weXJpZ2h0IHN0YXRlbWVudAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICB1cGRhdGUgY29weXJpZ2h0IHN0YXRlbWVudAorCisyMDA3LTAyLTI3IDExOjMwOjE5ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBzeXMvb3N4dmlkZW8vOiBEaXNhYmxlIHRoZSBjb2NvYSBldmVudCBsb29wIHNpbmNlIGl0J3MgYSBodWdlIG1lbW9yeSBsZWFrLiBTaG91bGQgb25seSBtYXR0ZXIgaWYgdGhlIHNpbmsgaXNuJ3QgdXNlZCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cuaDoKKwkgICogc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm06CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgRGlzYWJsZSB0aGUgY29jb2EgZXZlbnQgbG9vcCBzaW5jZSBpdCdzIGEgaHVnZSBtZW1vcnkgbGVhay4gU2hvdWxkIG9ubHkKKwkgIG1hdHRlciBpZiB0aGUgc2luayBpc24ndCB1c2VkIHdpdGhpbiBhbiBOU0FwcCAod2hpY2ggaGFzIGFscmVhZHkgZ290CisJICBhIGNvY2EgZXZlbnQgbG9vcCkuCisJICBSZW1vdmUgYWxsIHVudXNlZCBjb2RlLgorCisyMDA3LTAyLTI2IDEyOjA3OjE0ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L3J0c3AvTWFrZWZpbGUuYW06IEZpeCBtYWtlIGNoZWNrIHRvby4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9NYWtlZmlsZS5hbToKKwkgIEZpeCBtYWtlIGNoZWNrIHRvby4KKworMjAwNy0wMi0yNiAxMDowMDoyOCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9ydHNwL2Jhc2U2NC4qOiBDb21taXQgbWlzc2luZyBmaWxlcyBmb3IgYmFzZTY0IGVuY29kaW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2Jhc2U2NC5jOiAodXRpbF9iYXNlNjRfZW5jb2RlKToKKwkgICogZ3N0L3J0c3AvYmFzZTY0Lmg6CisJICBDb21taXQgbWlzc2luZyBmaWxlcyBmb3IgYmFzZTY0IGVuY29kaW5nLgorCisyMDA3LTAyLTI0IDIyOjU3OjQ5ICswMDAwICBMb8OvYyBNaW5pZXIgPGxvb2wrZ25vbWVAdmlhLmVjcC5mcj4KKworCSAgRml4IGJ1aWxkIHdpdGggTERGTEFHUz0nLVdsLC16LGRlZnMnICgjNDEwOTk3KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTG/Dr2MgTWluaWVyIDxsb29sK2dub21lIGF0IHZpYSBlY3AgZnI+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZXh0L2Fubm9kZXgvTWFrZWZpbGUuYW06CisJICAqIGV4dC9qcGVnL01ha2VmaWxlLmFtOgorCSAgKiBleHQvc3BlZXgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hbHBoYS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2N1dHRlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlYnVnL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2dvb20vTWFrZWZpbGUuYW06CisJICAqIGdzdC9sZXZlbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NtcHRlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJICBGaXggYnVpbGQgd2l0aCBMREZMQUdTPSctV2wsLXosZGVmcycgKCM0MTA5OTcpCisKKzIwMDctMDItMjQgMjI6NTI6NDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIEZpeCBidWlsZCB3aXRoIExERkxBR1M9Jy1XbCwteixkZWZzJy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGV4dC9nc20vTWFrZWZpbGUuYW06CisJICAqIGV4dC9sYWRzcGEvTWFrZWZpbGUuYW06CisJICAqIGV4dC93YXZwYWNrL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZXF1YWxpemVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZmlsdGVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXZlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbnNmL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NwZWVkL01ha2VmaWxlLmFtOgorCSAgRml4IGJ1aWxkIHdpdGggTERGTEFHUz0nLVdsLC16LGRlZnMnLgorCisyMDA3LTAyLTIzIDE5OjEyOjUyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L3J0c3AvOiBnX2Jhc2U2NF9lbmNvZGUgaXMgYSBHTGliIDIuMTIgZnVuY3Rpb24uIFVzZSBhbiBlcXVpdmFsZW50IHRha2VuIGZyb20gaWNlY2FzdCB0byByZXBsYWNlIGl0LiBSZWxpY2Vuc2VkIGZyLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChhcHBlbmRfYXV0aF9oZWFkZXIpLAorCSAgKHJ0c3BfY29ubmVjdGlvbl9zZW5kKSwgKHJ0c3BfY29ubmVjdGlvbl9zZXRfYXV0aCk6CisJICBnX2Jhc2U2NF9lbmNvZGUgaXMgYSBHTGliIDIuMTIgZnVuY3Rpb24uIFVzZSBhbiBlcXVpdmFsZW50IHRha2VuCisJICBmcm9tIGljZWNhc3QgdG8gcmVwbGFjZSBpdC4gUmVsaWNlbnNlZCBmcm9tIEdQTCBjb3VydGVzeSBvZiBNaWtlCisJICBTbWl0aC4KKworMjAwNy0wMi0yMyAxODoxMjoyNyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9ydHNwLzogSW1wbGVtZW50IHNpbXBsZSBCYXNpYyBBdXRoZW50aWNhdGlvbiBzdXBwb3J0IHNvIHRoYXQgdXJscyBsaWtlIHJ0c3A6Ly91c2VyOnBhc3NAaG9zdG5hbWUvcnRzcHN0cmVhbSB3b3JrIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2ZpbmFsaXplKSwKKwkgIChnc3RfcnRzcHNyY19jcmVhdGVfc3RyZWFtKSwgKHJ0c3BfYXV0aF9tZXRob2RfdG9fc3RyaW5nKSwKKwkgIChnc3RfcnRzcHNyY19wYXJzZV9hdXRoX2hkciksIChnc3RfcnRzcHNyY19zZXR1cF9hdXRoKSwKKwkgIChnc3RfcnRzcHNyY19zZW5kKSwgKGdzdF9ydHNwc3JjX3RyeV9zZW5kKSwgKGdzdF9ydHNwc3JjX29wZW4pLAorCSAgKGdzdF9ydHNwc3JjX2Nsb3NlKSwgKGdzdF9ydHNwc3JjX3BsYXkpLCAoZ3N0X3J0c3BzcmNfcGF1c2UpLAorCSAgKGdzdF9ydHNwc3JjX3VyaV9zZXRfdXJpKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiAocnRzcF9jb25uZWN0aW9uX2NyZWF0ZSksCisJICAoYXBwZW5kX2F1dGhfaGVhZGVyKSwgKHJ0c3BfY29ubmVjdGlvbl9zZW5kKSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fZnJlZSksIChydHNwX2Nvbm5lY3Rpb25fc2V0X2F1dGgpOgorCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5oOgorCSAgKiBnc3QvcnRzcC9ydHNwZGVmcy5oOgorCSAgKiBnc3QvcnRzcC9ydHNwdXJsLmM6IChydHNwX3VybF9nZXRfcmVxdWVzdF91cmkpOgorCSAgKiBnc3QvcnRzcC9ydHNwdXJsLmg6CisJICBJbXBsZW1lbnQgc2ltcGxlIEJhc2ljIEF1dGhlbnRpY2F0aW9uIHN1cHBvcnQgc28gdGhhdCB1cmxzIGxpa2UKKwkgIHJ0c3A6Ly91c2VyOnBhc3NAaG9zdG5hbWUvcnRzcHN0cmVhbSB3b3JrIG9uIGhvc3RzIHRoYXQgcmVxdWlyZQorCSAgYXV0aGVudGljYXRpb24uCisKKzIwMDctMDItMjIgMTc6NTM6MjYgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogQ2hhbmdlTG9nOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICBGaXggc2VnZmF1bHQgd2hlbiBvcHBlbmluZyBhIHJhZGlvIGRldmljZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4IHNlZ2ZhdWx0IHdoZW4gb3BwZW5pbmcgYSByYWRpbyBkZXZpY2UuCisKKzIwMDctMDItMjIgMTQ6MzU6MjggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgRml4IGxldmVsIGZvciBtdWx0aS1jaGFubmVsIGNhc2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfc2V0X2NhcHMpLAorCSAgKGdzdF9sZXZlbF90cmFuc2Zvcm1faXApOgorCSAgKiBzeXMvdjRsMi9SRUFETUU6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBGaXggbGV2ZWwgZm9yIG11bHRpLWNoYW5uZWwgY2FzZS4KKworMjAwNy0wMi0yMSAxMDoxODoxMiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvbGV2ZWwvZ3N0bGV2ZWwuKjogVXNlIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIHByb2Nlc3MgZnVuY3Rpb24gYW5kIGFkZCBwcm9jZXNzIGZ1bmN0aW9ucyBmb3IgZmxvYXQgYXVkaW8uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfaW5pdCksIChnc3RfbGV2ZWxfc2V0X2NhcHMpLAorCSAgKGdzdF9sZXZlbF90cmFuc2Zvcm1faXApOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuaDoKKwkgIFVzZSBmdW5jdGlvbiBwb2ludGVyIGZvciBwcm9jZXNzIGZ1bmN0aW9uIGFuZCBhZGQgcHJvY2VzcyBmdW5jdGlvbnMKKwkgIGZvciBmbG9hdCBhdWRpby4KKworMjAwNy0wMi0yMCAyMTozNDowMCArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLio6IFJlbW92ZSBpbmNsdWRlIG9mIHVudXNlZCBoZWFkZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgICogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oOgorCSAgUmVtb3ZlIGluY2x1ZGUgb2YgdW51c2VkIGhlYWRlcnMuCisJICAqIHN5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXBsdWdpbi5jOgorCSAgKiBzeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1zaW5rLmM6CisJICAqIHN5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXNpbmsuaDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHdhdmVmb3JtLmRzcDoKKwkgIEFkZCBhIG5ldyB3YXZlZm9ybSBwbHVnaW4gd2hpY2ggaW5jbHVkZXMgYW4gYXVkaW8gc2luaworCSAgZWxlbWVudCB1c2luZyB0aGUgV2F2ZUZvcm0gd2luMzIgQVBJLgorCSAgKiB3aW4zMi9NQU5JRkVTVDoKKwkgIEFkZCB0aGUgbmV3IHByb2plY3QgZmlsZSBmb3JtIHdhdmVmb3JtIHBsdWdpbi4KKworMjAwNy0wMi0xOSAxMjoyMjo0MyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IFJlYWRkIEdTVF9FTEVNRU5UX0VSUk9SIGlmIHdlIGNhbid0IHJlZW5xdWUgYnVmZmVycyBhZnRlciBFSU8sIGZpeGVzICM0MDczNjkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19maWxsX2Zvcm1hdF9saXN0KSwKKwkgIChnc3RfdjRsMnNyY19ncmFiX2ZyYW1lKSwgKGdzdF92NGwyc3JjX3NldF9jYXB0dXJlKSwKKwkgIChnc3RfdjRsMnNyY19jYXB0dXJlX2luaXQpOgorCSAgUmVhZGQgR1NUX0VMRU1FTlRfRVJST1IgaWYgd2UgY2FuJ3QgcmVlbnF1ZSBidWZmZXJzIGFmdGVyIEVJTywKKwkgIGZpeGVzICM0MDczNjkKKworMjAwNy0wMi0xOCAxODowMDo1MSArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBzeXMvZGlyZWN0ZHJhdy86IFByZXBhcmUgdGhlIHBsdWdpbiB0byBtb3ZlIHRvIGdvb2Q6CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3BsdWdpbi5jOgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jOgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5oOgorCSAgUHJlcGFyZSB0aGUgcGx1Z2luIHRvIG1vdmUgdG8gZ29vZDoKKwkgIFJlbW92ZSB1bnVzZWQvdW50ZXN0ZWQgY29kZSAocmVuZGVyaW5nIHRvIGFuIGV4dGVybiBzdXJmYWNlLAorCSAgeXV2IGZvcm1hdCByZW5kZXJpbmcpLlVzZSBHU1RfKERFQlVHLyopX09CSkVDVCBtYWNyb3MKKwkgIFJlbmFtZSBhbGwgZnVuY3Rpb25zIGZyb20gZ3N0X2RpcmVjdGRyYXdzaW5rIHRvIGdzdF9kaXJlY3RkcmF3X3NpbmsuCisJICBBZGQgZ3RrIGRvYyBzZWN0aW9uCisJICBGaXggYSBidWcgaW4gZ3N0X2RpcmVjdGRyYXdfc2lua19zaG93X2ZyYW1lLCBtZW1jcHkgbGluZSBieSBsaW5lCisJICByZXNwZWN0aW5nIGRlc3RpbmF0aW9uIHN1cmZhY2Ugc3RyaWRlLgorCSAgKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRwbHVnaW4uYzoKKwkgICogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmg6CisJICBQcmVwYXJlIHRoZSBwbHVnaW4gdG8gbW92ZSB0byBnb29kOgorCSAgUmVuYW1lIGFsbCBmdW5jdGlvbnMgZnJvbSBnc3RfZGlyZWN0c291bmRzaW5rIHRvIGdzdF9kaXJlY3Rzb3VuZF9zaW5rLgorCSAgQWRkIGd0ayBkb2Mgc2VjdGlvbgorCSAgKiB3aW4zMi9jb21tb24vY29uZmlnLmguaW46CisJICAqIHdpbjMyL01BTklGRVNUOgorCSAgQWRkIGNvbmZpZy5oLmluCisKKzIwMDctMDItMTggMTM6MjQ6MjYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBBZGRlZCBzaW1wbGUgbXBlZyB0cmFuc3BvcnQgc3RyZWFtIHBheWxvYWRlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwL2dzdHJ0cC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYzogKGdzdF9ydHBfbXAydF9wYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX21wMnRfcGF5X2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9tcDJ0X3BheV9pbml0KSwKKwkgIChnc3RfcnRwX21wMnRfcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9tcDJ0X3BheV9oYW5kbGVfYnVmZmVyKSwKKwkgIChnc3RfcnRwX21wMnRfcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDJ0cGF5Lmg6CisJICBBZGRlZCBzaW1wbGUgbXBlZyB0cmFuc3BvcnQgc3RyZWFtIHBheWxvYWRlci4KKworMjAwNy0wMi0xNiAxMjozMjowMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvVVJMUzogQWRkIGV4YW1wbGUgSDI2NCBydHNwIHVybC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9VUkxTOgorCSAgQWRkIGV4YW1wbGUgSDI2NCBydHNwIHVybC4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfbWVkaWFfdG9fY2FwcyksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX21lc3NhZ2UpLCAoZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlKToKKwkgIERvbid0IGNvbnZlcnQgdmFsdWVzIHRvIGxvd2VyY2FzZSBvciB3ZSBtaWdodCBtZXNzIHVwIGJhc2U2NCBlbmNvZGVkCisJICBwcm9wZXJ0aWVzLgorCisyMDA3LTAyLTE2IDEyOjMwOjIyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL1JFQURNRTogRml4IGNhc2Ugb2Ygc3RyaW5nIHBhcmFtcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL1JFQURNRToKKwkgIEZpeCBjYXNlIG9mIHN0cmluZyBwYXJhbXMuCisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6IChnc3RfcnRwX2gyNjRfZGVwYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9oMjY0X2RlcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9oMjY0X2RlcGF5X3Byb2Nlc3MpOgorCSAgRml4IGRlcGF5bG9hZGVyLCBzdXBwb3J0IG1vcmUgcGFja2V0IHR5cGVzLgorCSAgQWRkIHN5bmMgY29kZXMgdG8gbWFrZSBzdXJlIHRoZSBwYWNrZXRpemVyIGNhbiBkbyBpdHMgam9iLgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jOiAoZ3N0X3J0cF9tcHZfZGVwYXlfcHJvY2Vzcyk6CisJICBGaXggY2FwcyBjYXNlIGFnYWluLgorCisyMDA3LTAyLTE1IDEyOjI2OjI4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOiBTZXQgcmlnaHQgY2FwcyBvbiBvdXRwdXQgYnVmZmVycy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOiAoZ3N0X3J0cF9oMjY0X2RlcGF5X3Byb2Nlc3MpOgorCSAgU2V0IHJpZ2h0IGNhcHMgb24gb3V0cHV0IGJ1ZmZlcnMuCisKKzIwMDctMDItMTQgMTc6MDQ6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL3NkcG1lc3NhZ2UuYzogQ2xlYXIgc3RhY2sgYWxsb2NhdGVkIFNEUE1lZGlhIHN0cnVjdCBiZWZvcmUgY2FsbGluZyBfaW5pdCgpIG9uIGl0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL3NkcG1lc3NhZ2UuYzogKHNkcF9wYXJzZV9saW5lKToKKwkgIEFzIHNwb3R0ZWQgYnk6IFBldGVyIEtqZWxsZXJzdGVkdCAgPHBraiBhdCBheGlzIGNvbT46CisJICBDbGVhciBzdGFjayBhbGxvY2F0ZWQgU0RQTWVkaWEgc3RydWN0IGJlZm9yZSBjYWxsaW5nIF9pbml0KCkgb24gaXQuCisJICBDbGFyaWZ5IHRoaXMgaW4gdGhlIGRvY3MgYXMgd2VsbC4KKworMjAwNy0wMi0xNCAxNzowMToyNSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOiBEb24ndCByZXNldCB0aGUgcHJvZmlsZSB3aGVuIGdvaW5nIHN3aXRjaGluZyBzdGF0ZXMsIGFzIGl0IG1ha2VzIHRoZSBlbGVtZW50IG5vbi1yZXVzYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOiAoZ3N0X2djb25mX2F1ZGlvX3NpbmtfcmVzZXQpLAorCSAgKGRvX2NoYW5nZV9jaGlsZCk6CisJICBEb24ndCByZXNldCB0aGUgcHJvZmlsZSB3aGVuIGdvaW5nIHN3aXRjaGluZyBzdGF0ZXMsIGFzIGl0IG1ha2VzCisJICB0aGUgZWxlbWVudCBub24tcmV1c2FibGUuCisKKzIwMDctMDItMTQgMTU6MjQ6NTAgKzAwMDAgIGpwLmxpdSA8anBfbGl1QGFzdHJvY29tLmNuPgorCisJICBnc3QvcnRzcC9zZHBtZXNzYWdlLio6IEZpeCBtZW1vcnkgbWFuYWdlbWVudCBvZiBTRFAgbWVzc2FnZXMuIEZpeGVzICM0MDc3OTMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3Avc2RwbWVzc2FnZS5jOiAoc2RwX29yaWdpbl9pbml0KSwgKHNkcF9jb25uZWN0aW9uX2luaXQpLAorCSAgKHNkcF9iYW5kd2lkdGhfaW5pdCksIChzZHBfdGltZV9pbml0KSwgKHNkcF96b25lX2luaXQpLAorCSAgKHNkcF9rZXlfaW5pdCksIChzZHBfYXR0cmlidXRlX2luaXQpLCAoc2RwX21lc3NhZ2VfaW5pdCksCisJICAoc2RwX21lc3NhZ2VfdW5pbml0KSwgKHNkcF9tZXNzYWdlX2ZyZWUpLCAoc2RwX21lZGlhX2luaXQpLAorCSAgKHNkcF9tZWRpYV91bmluaXQpLCAoc2RwX21lZGlhX2ZyZWUpLCAoc2RwX21lc3NhZ2VfYWRkX21lZGlhKSwKKwkgIChzZHBfcGFyc2VfbGluZSk6CisJICAqIGdzdC9ydHNwL3NkcG1lc3NhZ2UuaDoKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5OiBqcC5saXUgPGpwX2xpdSBhdCBhc3Ryb2NvbSBkb3QgY24+CisJICBGaXggbWVtb3J5IG1hbmFnZW1lbnQgb2YgU0RQIG1lc3NhZ2VzLiBGaXhlcyAjNDA3NzkzLgorCisyMDA3LTAyLTE0IDEyOjA3OjAxICswMDAwICB6aGFuZ2ZlaSBnYW8gPGdhb3poYW5nZmVpQHlhaG9vLmNvbS5jbj4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguYzogQWxsb3cgbXV4aW5nIHZpZGVvL3gtaDI2NCAod2FzIGFscmVhZHkgaW4gdGhlIGNhcHMpLiBGaXhlcyAjNDA3NzgwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogemhhbmdmZWkgZ2FvIDxnYW96aGFuZ2ZlaUB5YWhvby5jb20uY24+CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpX211eF92aWRzaW5rX3NldF9jYXBzKToKKwkgIEFsbG93IG11eGluZyB2aWRlby94LWgyNjQgKHdhcyBhbHJlYWR5IGluIHRoZSBjYXBzKS4gRml4ZXMgIzQwNzc4MC4KKworMjAwNy0wMi0xNCAxMDowOToxMiArMDAwMCAganAubGl1IDxqcF9saXVAYXN0cm9jb20uY24+CisKKwkgIGdzdC9ydHNwL3J0c3B1cmwuYzogRml4IHBhcnNpbmcgb2YgcGFzc3dvcmQgZmllbGQgaW4gdXJsLiBGaXhlcyAjNDA3Nzk3LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieToganAubGl1IDxqcF9saXUgYXQgYXN0cm9jb20gZG90IGNuPgorCSAgKiBnc3QvcnRzcC9ydHNwdXJsLmM6IChydHNwX3VybF9wYXJzZSk6CisJICBGaXggcGFyc2luZyBvZiBwYXNzd29yZCBmaWVsZCBpbiB1cmwuIEZpeGVzICM0MDc3OTcuCisKKzIwMDctMDItMTQgMDk6NTU6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS4qOiBVcGRhdGUgZG9jcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9jbGFzc19pbml0KSwKKwkgIChnc3Rfd2F2cGFyc2VfcmVzZXQpLCAoZ3N0X3dhdnBhcnNlX2luaXQpLAorCSAgKGdzdF93YXZwYXJzZV9kZXN0cm95X3NvdXJjZXBhZCksIChnc3Rfd2F2cGFyc2VfZm10KSwKKwkgIChnc3Rfd2F2cGFyc2VfcGFyc2VfZmlsZV9oZWFkZXIpLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9pbml0KSwKKwkgIChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKSwgKGdzdF93YXZwYXJzZV9wZWVrX2NodW5rX2luZm8pLAorCSAgKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksIChnc3Rfd2F2cGFyc2VfcGFyc2Vfc3RyZWFtX2luaXQpLAorCSAgKGdzdF93YXZwYXJzZV9hZGRfc3JjX3BhZCksIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpLAorCSAgKGdzdF93YXZwYXJzZV9sb29wKSwgKGdzdF93YXZwYXJzZV9jaGFpbiksCisJICAoZ3N0X3dhdnBhcnNlX3BhZF9jb252ZXJ0KSwgKGdzdF93YXZwYXJzZV9wYWRfcXVlcnkpLAorCSAgKGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQpLCAoZ3N0X3dhdnBhcnNlX2NoYW5nZV9zdGF0ZSksCisJICAocGx1Z2luX2luaXQpOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwkgIFVwZGF0ZSBkb2NzLgorCSAgVXNlIGJvaWxlcnBsYXRlLgorCSAgVmFyaW91cyBjb2RlIGNsZWFudXBzLgorCSAgV2hlbiB0aGUgYml0cmF0ZSBpcyBub3Qga25vd24gKGJwcyA9PSAwIG9yIGNvbXByZXNzZWQgZm9ybWF0cykgbGV0CisJICBkb3duc3RyZWFtIGVsZW1lbnQgZ3Vlc3RpbWF0ZSB0aGUgZHVyYXRpb24gYW5kIHBvc2l0aW9uIGFuZCBkb24ndAorCSAgZ2VuZXJhdGUgdGltZXN0YW1wcyBvciBkdXJhdGlvbnMuIEZpeGVzICM0MDUyMTMuCisJICBGaXggRU9TIGFuZCBFUlJPUiBjb25kaXRpb25zIGluIGNoYWluIG1vZGUsIHdlIGp1c3QgbmVlZCB0byBmb3J3YXJkIHRoZQorCSAgZXJyb3IgZmxvd3JldHVybiB1cHN0cmVhbS4KKworMjAwNy0wMi0xMyAxNjowMToyOSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIFJlLWZhY3RvciB0aGUgZ2NvbmZhdWRpb3NpbmsgaW50byBhICJHc3RTd2l0Y2hTaW5rIiBiYXNlIGNsYXNzIGFuZCBhIGNoaWxkIHRoYXQgaW1wbGVtZW50cyB0aGUgR0NvbmYga2V5IG1vbml0b3JpbmcuIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nY29uZi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2djb25mL2djb25mLmM6IChnc3RfZ2NvbmZfZ2V0X3N0cmluZyksCisJICAoZ3N0X2djb25mX2dldF9rZXlfZm9yX3NpbmtfcHJvZmlsZSksIChnc3RfZ2NvbmZfc2V0X3N0cmluZyksCisJICAoZ3N0X2djb25mX3JlbmRlcl9iaW5fd2l0aF9kZWZhdWx0KToKKwkgICogZXh0L2djb25mL2djb25mLmg6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOiAoZ3N0X2djb25mX2F1ZGlvX3NpbmtfYmFzZV9pbml0KSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc2lua19yZXNldCksIChnc3RfZ2NvbmZfYXVkaW9fc2lua19pbml0KSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc2lua19kaXNwb3NlKSwgKGRvX2NoYW5nZV9jaGlsZCksCisJICAoZ3N0X2djb25mX3N3aXRjaF9wcm9maWxlKSwgKGdzdF9nY29uZl9hdWRpb19zaW5rX3NldF9wcm9wZXJ0eSksCisJICAoY2JfY2hhbmdlX2NoaWxkKSwgKGdzdF9nY29uZl9hdWRpb19zaW5rX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5oOgorCSAgKiBleHQvZ2NvbmYvZ3N0c3dpdGNoc2luay5jOiAoZ3N0X3N3aXRjaF9zaW5rX2Jhc2VfaW5pdCksCisJICAoZ3N0X3N3aXRjaF9zaW5rX2NsYXNzX2luaXQpLCAoZ3N0X3N3aXRjaF9zaW5rX3Jlc2V0KSwKKwkgIChnc3Rfc3dpdGNoX3NpbmtfaW5pdCksIChnc3Rfc3dpdGNoX3NpbmtfZGlzcG9zZSksCisJICAoZ3N0X3N3aXRjaF9jb21taXRfbmV3X2tpZCksIChnc3Rfc3dpdGNoX3Npbmtfc2V0X2NoaWxkKSwKKwkgIChnc3Rfc3dpdGNoX3Npbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF9zd2l0Y2hfc2lua19oYW5kbGVfZXZlbnQpLAorCSAgKGdzdF9zd2l0Y2hfc2lua19nZXRfcHJvcGVydHkpLCAoZ3N0X3N3aXRjaF9zaW5rX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9nY29uZi9nc3Rzd2l0Y2hzaW5rLmg6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkgIChnc3RfYXV0b19hdWRpb19zaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2F1dG9fYXVkaW9fc2lua19kaXNwb3NlKSwKKwkgIChnc3RfYXV0b19hdWRpb19zaW5rX2NsZWFyX2tpZCksIChnc3RfYXV0b19hdWRpb19zaW5rX3Jlc2V0KSwKKwkgIChnc3RfYXV0b19hdWRpb19zaW5rX2RldGVjdCk6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkgIChnc3RfYXV0b192aWRlb19zaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2F1dG9fdmlkZW9fc2lua19kaXNwb3NlKSwKKwkgIChnc3RfYXV0b192aWRlb19zaW5rX2NsZWFyX2tpZCksIChnc3RfYXV0b192aWRlb19zaW5rX3Jlc2V0KSwKKwkgIChnc3RfYXV0b192aWRlb19zaW5rX2RldGVjdCk6CisJICBSZS1mYWN0b3IgdGhlIGdjb25mYXVkaW9zaW5rIGludG8gYSAiR3N0U3dpdGNoU2luayIgYmFzZSBjbGFzcworCSAgYW5kIGEgY2hpbGQgdGhhdCBpbXBsZW1lbnRzIHRoZSBHQ29uZiBrZXkgbW9uaXRvcmluZy4gVGhlIGVuZCBnb2FsIG9mCisJICB0aGlzIGlzIGFuIGF1ZGlvIHNpbmsgdGhhdCBjYW4gYmUgY2hhbmdlZCBvbiB0aGUgZmx5LCBidXQgYXQgdGhlCisJICBtb21lbnQgaXQgc3RpbGwgb25seSBjaGFuZ2VzIG9uIHRoZSBuZXh0IFJFQURZIHRyYW5zaXRpb24uCisKKzIwMDctMDItMTMgMTE6NTc6MTggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBQdXQgZGVidWcgc3R1ZmYgaW50byAjaWZuZGVmIEdTVF9ESVNBQkxFX0RFQlVHICNlbmRpZgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9pbmRleCksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9zeW5jKSwgKGdzdF9hdmlfZGVtdXhfbWFzc2FnZV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9jYWxjdWxhdGVfZHVyYXRpb25zX2Zyb21faW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfcHVzaF9ldmVudCksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVsbCksCisJICAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSksCisJICAoZ3N0X2F2aV9kZW11eF9sb29wKToKKwkgIFB1dCBkZWJ1ZyBzdHVmZiBpbnRvICNpZm5kZWYgR1NUX0RJU0FCTEVfREVCVUcgI2VuZGlmCisKKzIwMDctMDItMTMgMDk6NDY6MjYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgQWRkIGNyb3NzcmVmZXJlbmNlcyB0byBnbGliL2dvYmplY3QvZ3N0cmVhbSBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgQWRkIGNyb3NzcmVmZXJlbmNlcyB0byBnbGliL2dvYmplY3QvZ3N0cmVhbSBkb2NzLgorCisyMDA3LTAyLTEyIDIzOjM1OjE2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbW9ub3Njb3BlLzogRml4IGNvcHknbidwYXN0ZS1vIGluIGRvY3MgY2h1bmsuIEFsc28gYWRkIHNvbWUgbWlzc2luZyBDRkxBR1MgKGJ1dCBubyBMSUJTLCBzaW5jZSB3ZSBvbmx5IHVzZSBkZWZpbmUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbW9ub3Njb3BlL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSAgRml4IGNvcHknbidwYXN0ZS1vIGluIGRvY3MgY2h1bmsuIEFsc28gYWRkIHNvbWUgbWlzc2luZyBDRkxBR1MKKwkgIChidXQgbm8gTElCUywgc2luY2Ugd2Ugb25seSB1c2UgZGVmaW5lcyBmcm9tIHRoZSBoZWFkZXJzKS4KKworMjAwNy0wMi0xMiAyMzoyNzozMSArMDAwMCAgSm9uYXRoYW4gTWF0dGhldyA8am9uYXRoYW5Aa2FvbGluLndoOS5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBGaXggbWFzc2l2ZSBtZW1vcnkgbGVhayB3aGVuIG9wZXJhdGluZyBpbiBzdHJlYW1pbmcgbW9kZSBkdWUgdG8KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IEpvbmF0aGFuIE1hdHRoZXcgIDxqb25hdGhhbiBhdCBrYW9saW4gd2g5IG5ldD4KKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGFyc2Vfc3RyZWFtX2luaXQpLAorCSAgKGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSk6CisJICBGaXggbWFzc2l2ZSBtZW1vcnkgbGVhayB3aGVuIG9wZXJhdGluZyBpbiBzdHJlYW1pbmcgbW9kZSBkdWUgdG8KKwkgIEdTVF9CVUZGRVJfTUFMTE9DREFUQSgpIG5vdCBiZWluZyBzZXQgb24gbmV3bHktY3JlYXRlZCBidWZmZXJzLgorCSAgRml4ZXMgIzQwNzA1Ny4KKworMjAwNy0wMi0xMiAxNToyOTo0NCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4Lio6IFNhdmUgc29tZSBtZW1vcnkgKDglKSBieSByZXBhY2tpbmcgdGhlIGluZGV4IGVudHJ5IHN0cnVjdHVyZSAobW9yZSB0byBjb21lKS4gQWRkIG1vcmUgRklYTUVzIHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2NsYXNzX2luaXQpLAorCSAgKGdzdF9hdmlfZGVtdXhfcmVzZXQpLCAoZ3N0X2F2aV9kZW11eF9pbmRleF9lbnRyeV9mb3JfdGltZSksCisJICAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3VwZXJpbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdWJpbmRleCksIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9pbmRleCksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9zeW5jKSwgKGdzdF9hdmlfZGVtdXhfbmV4dF9kYXRhX2J1ZmZlciksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fc2NhbiksIChnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfY2FsY3VsYXRlX2R1cmF0aW9uc19mcm9tX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3B1c2hfZXZlbnQpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyX3B1bGwpLAorCSAgKGdzdF9hdmlfZGVtdXhfZG9fc2VlayksIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSksIChnc3RfYXZpX2RlbXV4X2xvb3ApOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBTYXZlIHNvbWUgbWVtb3J5ICg4JSkgYnkgcmVwYWNraW5nIHRoZSBpbmRleCBlbnRyeSBzdHJ1Y3R1cmUgKG1vcmUgdG8KKwkgIGNvbWUpLiBBZGQgbW9yZSBGSVhNRXMgdG8gcXVlc3Rpb25hYmxlIHBhcnRzLgorCisyMDA3LTAyLTEyIDEyOjU3OjIyICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHN5cy92NGwyLzogTW9yZSBGSVhNRSBjb21tZW50cyBhbmQgbWVzc2FnaW5nIGNoYW5nZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfdjRsMmZvdXJjY190b19jYXBzKSwKKwkgIChnc3RfdjRsMnNyY19nZXRfY2Fwcyk6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX2ZpbGxfZm9ybWF0X2xpc3QpLAorCSAgKGdzdF92NGwyc3JjX2dyYWJfZnJhbWUpLCAoZ3N0X3Y0bDJzcmNfc2V0X2NhcHR1cmUpLAorCSAgKGdzdF92NGwyc3JjX2NhcHR1cmVfaW5pdCk6CisJICBNb3JlIEZJWE1FIGNvbW1lbnRzIGFuZCBtZXNzYWdpbmcgY2hhbmdlcy4KKworMjAwNy0wMi0xMiAxMjo0MzowMCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvZ29vbS9nc3Rnb29tLio6IEltcHJvdmVkIGRvY3MgYW5kIHVzZSBHU1RfREVCVUdfRlVOQ1BUUi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9jbGFzc19pbml0KSwgKGdzdF9nb29tX2luaXQpLAorCSAgKGdzdF9nb29tX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9nb29tL2dzdGdvb20uaDoKKwkgIEltcHJvdmVkIGRvY3MgYW5kIHVzZSBHU1RfREVCVUdfRlVOQ1BUUi4KKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfY2xhc3NfaW5pdCk6CisJICBVc2UgR1NUX0RFQlVHX0ZVTkNQVFIuCisJICAqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6IChnc3RfbW9ub3Njb3BlX2luaXQpLAorCSAgKGdzdF9tb25vc2NvcGVfY2hhaW4pLCAoZ3N0X21vbm9zY29wZV9jaGFuZ2Vfc3RhdGUpOgorCSAgSW1wcm92ZWQgZG9jcyBzb3VyY2UgY2xlYW51cHMuCisKKzIwMDctMDItMTIgMTA6Mjk6NTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9kZWJ1Zy86IEFkZCBjb2RlIGZvciBhIHB1c2hmaWxlc3JjIGVsZW1lbnQgdGhhdCBpbXBsZW1lbnRzIGEgcHVzaGZpbGU6Ly8gVVJJIGhhbmRsZXIsIHRvIG1ha2UgZGVidWdnaW5nIHB1c2gtbW9kZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWJ1Zy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlYnVnL2dzdGRlYnVnLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9kZWJ1Zy9nc3RwdXNoZmlsZXNyYy5jOgorCSAgKiBnc3QvZGVidWcvZ3N0cHVzaGZpbGVzcmMuaDoKKwkgIEFkZCBjb2RlIGZvciBhIHB1c2hmaWxlc3JjIGVsZW1lbnQgdGhhdCBpbXBsZW1lbnRzIGEgcHVzaGZpbGU6Ly8gVVJJCisJICBoYW5kbGVyLCB0byBtYWtlIGRlYnVnZ2luZyBwdXNoLW1vZGUgb3BlcmF0aW9uIG9mIGRlbXV4ZXIvZGVjb2RlcnMKKwkgIHRoYXQgc3VwcG9ydCBib3RoIGVhc2llciBpbiBjb25uZWN0aW9uIHdpdGggc2Vlay9wbGF5YmluL2V0Yy4KKwkgIFRoZSBlbGVtZW50IGlzbid0IHJlZ2lzdGVyZWQgYXQgdGhlIG1vbWVudC4KKworMjAwNy0wMi0xMSAxNToyNjo0OSArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBNYWtlZmlsZS5hbTogQWRkIHdpbjMyIE1BTklGRVNUCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogTWFrZWZpbGUuYW06CisJICBBZGQgd2luMzIgTUFOSUZFU1QKKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuaDoKKwkgIENsZWFyIHVudXNlZCBjb2RlIGFuZCBhZGQgY29tbWVudHMuCisJICBSZW1vdmUgeXV2IGZyb20gdGVtcGxhdGUgY2FwcywgaXQgb25seSBzdXBwb3J0cyBSR0IKKwkgIGFjdHVhbGx5LgorCSAgSW1wbGVtZW50IFhPdmVybGF5IGludGVyZmFjZSBhbmQgcmVtb3ZlIHdpbmRvdyBhbmQgZnVsbHNjcmVlbgorCSAgcHJvcGVydGllcy4KKwkgIEFkZCBkZWJ1ZyBsb2dzLgorCSAgVGVzdCBmb3IgYmxpdCBjYXBhYmlsaXRpZXMgdG8gcmV0dXJuIG9ubHkgdGhlIGN1cnJlbnQgY29sb3JzcGFjZSBpZgorCSAgdGhlIGhhcmR3YXJlIGNhbid0IGJsaXQgZm9yIG9uZSBjb2xvcnNwYWNlIHRvIGFub3RoZXIuCisJICAqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIEFkZCBzb21lIGRlYnVncy4KKwkgICogd2luMzIvTUFOSUZFU1Q6CisJICBBZGQgVlM3IHByb2plY3QgZmlsZXMgYW5kIHNvbHV0aW9uLgorCSAgKiB3aW4zMi92czYvZ3N0X3BsdWdpbnNfYmFkLmRzdzoKKwkgICogd2luMzIvdnM2L2xpYmdzdGRpcmVjdGRyYXcuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0ZGlyZWN0c291bmQuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0cXRkZW11eC5kc3A6CisJICBVcGRhdGUgcHJvamVjdCBmaWxlcy4KKworMjAwNy0wMi0xMSAxMjo1Nzo0NyArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aW11eC5jOiBDb21tZW50IGEgI2lmIDAgaW4gY2FwcyB0ZW1wbGF0ZSBkZWZpbml0aW9uIGFzIFZTNiBzZWVtcyB0byBkbyBub3Qgc3VwcG9ydCBpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgQ29tbWVudCBhICNpZiAwIGluIGNhcHMgdGVtcGxhdGUgZGVmaW5pdGlvbiBhcyBWUzYgc2VlbXMgdG8KKwkgIGRvIG5vdCBzdXBwb3J0IGl0LgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6KGdzdF9ydHNwc3JjX2xvb3BfdWRwKToKKwkgIFVzZSBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIGZvciBjb252ZXJzaW9uLgorCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOihydHNwX2Nvbm5lY3Rpb25fc2VuZCk6CisJICBNb3ZlIHZhcmlhYmxlcyBkZWNsYXJhdGlvbiBiZWZvcmUgdGhlIGZpcnN0IGluc3RydWN0aW9uLgorCSAgKiBnc3QvcnRzcC9ydHNwZGVmcy5jOihydHNwX3N0cnJlc3VsdCk6CisJICBEb24ndCB1c2UgaHN0cmVycm9yIGZvciBlcnJvciBsb2cgb24gR19PU19XSU4zMiBidWlsZCBhcyBpdCdzIG5vdCBzdXBwb3J0ZWQuCisJICBBbmQgZG9uJ3QgaW5jbHVkZSBuZXRkYi5oIGZvciBHX09TX1dJTjMyCisJICAqIGdzdC9ydHNwL3NkcG1lc3NhZ2UuYzooc2RwX3BhcnNlX2xpbmUpOgorCSAgVGhpcyBpbml0aWFsaXphdGlvbiBTRFBNZWRpYSBubWVkaWEgPSB7Lm1lZGlhID0gTlVMTCB9OyBpcyBub3Qgc3VwcG9ydGVkCisJICBieSBWUzYgdGhlbiB1c2UgYW4gb3RoZXIgd2F5IHRvIGluaXRpYWxpemUgU0RQTWVkaWEgc3RydWN0dXJlLgorCSAgKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuaDoKKwkgICogZ3N0L3VkcC9nc3RkeW51ZHBuZXR1dGlscy5oOgorCSAgRG8gbm90IGluY2x1ZGUgPHN5cy90aW1lLmg+IGZvciBHX09TX1dJTjMyCisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICBEZWZpbmUgc29ja2xlbl90IGFzIGludCBmb3IgR19PU19XSU4zMgorCSAgKiB3aW4vY29tbW9uL2NvbmZpZy5oLmluOgorCSAgVW5kZWYgSEFWRV9ORVRJTkVUX0lOX0gKKwkgICogd2luMzIvdnM2L2dzdF9wbHVnaW5zX2dvb2QuZHN3OgorCSAgKiB3aW4zMi92czYvbGliZ3N0cnRwLmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHJ0c3AuZHNwOgorCSAgKiB3aW4zMi92czYvbGliZ3N0YXV0b2dlbi5kc3A6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RhdWRpb2Z4LmRzcDoKKwkgICogd2luMzIvdnM2L2xpYmdzdHVkcC5kc3A6CisJICBBZGQgYW5kIHVwZGF0ZSBwcm9qZWN0IGZpbGVzLgorCSAgKiB3aW4zMi9jb21tb24vZ3N0dWRwLWVudW10eXBlcy5jOgorCSAgKiB3aW4zMi9jb21tb24vZ3N0dWRwLWVudW10eXBlcy5oOgorCSAgQWRkIGEgY29weSBvZiB1ZHAgZW51bXR5cGVzIHRvIHdpbjMyL2NvbW1vbiBhcyBpbiBjb3JlCisJICBhbmQgYmFzZS4KKworMjAwNy0wMi0xMSAxMDo1MzoyMSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBjb25maWd1cmUuYWM6IEFjdGl2YXRlIG1vbm9zY29wZSB3aGVuIGJ1aWxkaW5nIHdpdGggLS1lbmFibGUtZXhwZXJpbWVudGFsLiBGaXgKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBBY3RpdmF0ZSBtb25vc2NvcGUgd2hlbiBidWlsZGluZyB3aXRoIC0tZW5hYmxlLWV4cGVyaW1lbnRhbC4gRml4CisJICAtLWVuYWJsZS1leHRlcm5hbCBjb25maWd1cmUgc3dpdGNoIGRlc2NyaXB0aW9uLgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlci5jOiAoZ3N0X3N1bmF1ZGlvbWl4ZXJfYmFzZV9pbml0KToKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc3JjLmM6IChnc3Rfc3VuYXVkaW9zcmNfZGlzcG9zZSk6CisJICBIZWxwIGdzdC1pbmRlbnQuCisKKzIwMDctMDItMDkgMDk6MjQ6NTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IEV4cGxpY2l0bHkgY2FzdCByZXN1bHQgb2YgcG9pbnRlciBhcml0aG1ldGljIHRvIGludGVnZXIgaW4gb3JkZXIgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3Mgb24gcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpX211eF9yaWZmX2dldF9hdmlfaGVhZGVyKToKKwkgIEV4cGxpY2l0bHkgY2FzdCByZXN1bHQgb2YgcG9pbnRlciBhcml0aG1ldGljIHRvIGludGVnZXIgaW4gb3JkZXIgdG8KKwkgIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzIG9uIHNvbWUgNjQtYml0IHN5c3RlbXMuIFNob3VsZCBmaXggIzQwNjAxOC4KKworMjAwNy0wMi0wOCAxMTowOToxNSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2RlYnVnL3Byb2dyZXNzcmVwb3J0LmM6IFNvbWUgbW9yZSBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWJ1Zy9wcm9ncmVzc3JlcG9ydC5jOgorCSAgU29tZSBtb3JlIGRvY3MuCisKKzIwMDctMDItMDcgMjE6MDk6NDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOiBVcGRhdGUgZm9yIG5ldyBlbGVtZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkgIFVwZGF0ZSBmb3IgbmV3IGVsZW1lbnRzLgorCSAgKiBnc3QvZGVidWcvcHJvZ3Jlc3NyZXBvcnQuaDoKKwkgIENvbW1pdCBuZXdseS1jcmVhdGVkIGhlYWRlciBmaWxlIGFzIHdlbGwuCisKKzIwMDctMDItMDcgMjA6Mzk6MTYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIE1ha2UgcHJvZ3Jlc3NyZXBvcnQgZWxlbWVudCBwb3N0IG1lc3NhZ2VzIHdpdGggdGhlIGN1cnJlbnQgcHJvZ3Jlc3Mgb24gdGhlIGJ1cy4gQWxzbyBhZGQgc29tZSBiYXNpYyBkb2NzIGZvciBpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGdzdC9kZWJ1Zy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlYnVnL3Byb2dyZXNzcmVwb3J0LmM6IChnc3RfcHJvZ3Jlc3NfcmVwb3J0X3Bvc3RfcHJvZ3Jlc3MpLAorCSAgKGdzdF9wcm9ncmVzc19yZXBvcnRfZG9fcXVlcnkpLCAoZ3N0X3Byb2dyZXNzX3JlcG9ydF9yZXBvcnQpOgorCSAgTWFrZSBwcm9ncmVzc3JlcG9ydCBlbGVtZW50IHBvc3QgbWVzc2FnZXMgd2l0aCB0aGUgY3VycmVudCBwcm9ncmVzcworCSAgb24gdGhlIGJ1cy4gQWxzbyBhZGQgc29tZSBiYXNpYyBkb2NzIGZvciBpdC4KKworMjAwNy0wMi0wNyAxMzowODozNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2hhbC9oYWwuKjogU29tZSBzbWFsbCBjbGVhbnVwczsgZGVhbCB3aXRoIGVycm9ycyB3aGVuIHBhcnNpbmcgdGhlIEhBTCBBTFNBIGNhcGFiaWxpdGllcyBhIGJpdCBiZXR0ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2hhbC9oYWwuYzogKGdzdF9oYWxfZ2V0X3N0cmluZyk6CisJICAqIGV4dC9oYWwvaGFsLmg6CisJICBTb21lIHNtYWxsIGNsZWFudXBzOyBkZWFsIHdpdGggZXJyb3JzIHdoZW4gcGFyc2luZyB0aGUgSEFMIEFMU0EKKwkgIGNhcGFiaWxpdGllcyBhIGJpdCBiZXR0ZXIuCisKKzIwMDctMDItMDYgMTY6Mjk6MzAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiBMZXQncyB0cnkgdGhpcyBhZ2FpbiBhbmQgdXNlIHRoZSByaWdodCBjYXN0IHRoaXMgdGltZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzogKGdzdF9zbXB0ZV90cmFuc2l0aW9uX3R5cGVfZ2V0X3R5cGUpOgorCSAgTGV0J3MgdHJ5IHRoaXMgYWdhaW4gYW5kIHVzZSB0aGUgcmlnaHQgY2FzdCB0aGlzIHRpbWUuCisKKzIwMDctMDItMDYgMTY6MjQ6NTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiBBZGQgY2FzdCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncyB3aXRoIG9sZGVyIEdMaWIgdmVyc2lvbnMgd2hlcmUgdGhlIG5pY2svbmFtZSBtZW1iZXJzIGluIEdFbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiAoZ3N0X3NtcHRlX3RyYW5zaXRpb25fdHlwZV9nZXRfdHlwZSk6CisJICBBZGQgY2FzdCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncyB3aXRoIG9sZGVyIEdMaWIgdmVyc2lvbnMKKwkgIHdoZXJlIHRoZSBuaWNrL25hbWUgbWVtYmVycyBpbiBHRW51bVZhbHVlIGFyZSBub3QgZGVjbGFyZWQgYXMKKwkgIGNvbnN0YW50IHN0cmluZ3MuCisKKzIwMDctMDItMDYgMTU6NTY6MTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9nY29uZi86IEluIGdjb25mYXVkaW9zaW5rLCBnZXQgdGhlIHJpZ2h0IGtleSBhcyB0aGUgb2xkIGtleSBpbiBkb190b2dnbGUgKGllLiBvbmUgZGVwZW5kZW50IG9uIHRoZSBwcm9maWxlIHNlbGVjdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nY29uZi9nY29uZi5jOiAoZ3N0X2djb25mX2dldF9rZXlfZm9yX3NpbmtfcHJvZmlsZSksCisJICAoZ3N0X2djb25mX3JlbmRlcl9iaW5fZnJvbV9rZXkpLAorCSAgKGdzdF9nY29uZl9nZXRfZGVmYXVsdF9hdWRpb19zaW5rKToKKwkgICogZXh0L2djb25mL2djb25mLmg6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOiAoZ2V0X2djb25mX2tleV9mb3JfcHJvZmlsZSksCisJICAoZG9fdG9nZ2xlX2VsZW1lbnQpLCAoZ3N0X2djb25mX2F1ZGlvX3Npbmtfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc2lua19nZXRfcHJvcGVydHkpOgorCSAgSW4gZ2NvbmZhdWRpb3NpbmssIGdldCB0aGUgcmlnaHQga2V5IGFzIHRoZSBvbGQga2V5IGluIGRvX3RvZ2dsZQorCSAgKGllLiBvbmUgZGVwZW5kZW50IG9uIHRoZSBwcm9maWxlIHNlbGVjdGVkKS4gTG9nIHNvbWUgbW9yZSBzdHVmZiBzbworCSAgd2UgY2FuIHNlZSB3aGF0J3MgYWN0dWFsbHkgZ29pbmcgb24uCisKKzIwMDctMDItMDYgMTE6MTY6NDkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2F1ZGlvZngvOiBTb21lIHNtYWxsIGNsZWFudXBzIGFuZCBwb3J0IGJvdGggZWxlbWVudHMgdG8gdGhlIG5ldyBHc3RBdWRpb0ZpbHRlciBiYXNlIGNsYXNzIHRvIHNhdmUgYSBmZXcgbGluZXMgb2YgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5LmM6IChnc3RfYXVkaW9fYW1wbGlmeV9iYXNlX2luaXQpLAorCSAgKGdzdF9hdWRpb19hbXBsaWZ5X2NsYXNzX2luaXQpLCAoZ3N0X2F1ZGlvX2FtcGxpZnlfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2FtcGxpZnlfc2V0X3Byb2Nlc3NfZnVuY3Rpb24pLAorCSAgKGdzdF9hdWRpb19hbXBsaWZ5X3NldHVwKToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5Lmg6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0LmM6IChnc3RfYXVkaW9faW52ZXJ0X2Jhc2VfaW5pdCksCisJICAoZ3N0X2F1ZGlvX2ludmVydF9jbGFzc19pbml0KSwgKGdzdF9hdWRpb19pbnZlcnRfc2V0dXApOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2ludmVydC5oOgorCSAgU29tZSBzbWFsbCBjbGVhbnVwcyBhbmQgcG9ydCBib3RoIGVsZW1lbnRzIHRvIHRoZSBuZXcgR3N0QXVkaW9GaWx0ZXIKKwkgIGJhc2UgY2xhc3MgdG8gc2F2ZSBhIGZldyBsaW5lcyBvZiBjb21tb24gY29kZS4KKwkgICogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJICBMaW5rIGFnYWluc3QgbGliZ3N0YXVkaW8gZm9yIHRoZSBhYm92ZSBjaGFuZ2VzCisKKzIwMDctMDItMDMgMjM6MzU6MjYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIEZpeCB1cCB0byB1c2UgdGhlIG5ld2x5IHBvcnRlZCAoYWN0dWFsbHkgd29ya2luZykgR3N0QXVkaW9GaWx0ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvZXF1YWxpemVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFzZV9pbml0KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9jbGFzc19pbml0KSwgKGdzdF9paXJfZXF1YWxpemVyX2luaXQpLAorCSAgKHNldHVwX2ZpbHRlciksIChnc3RfaWlyX2VxdWFsaXplcl9jb21wdXRlX2ZyZXF1ZW5jaWVzKSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl9zZXRfcHJvcGVydHkpLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfaWlyX2VxdWFsaXplcl90cmFuc2Zvcm1faXApLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfc2V0dXApLAorCSAgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuaDoKKwkgIEZpeCB1cCB0byB1c2UgdGhlIG5ld2x5IHBvcnRlZCAoYWN0dWFsbHkgd29ya2luZykgR3N0QXVkaW9GaWx0ZXIuCisJICBCdW1wIGNvcmUvYmFzZSByZXF1aXJlbWVudHMgdG8gQ1ZTIGZvciB0aGlzLgorCSAgKiB0ZXN0cy9pY2xlcy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYzogKGNoZWNrX2J1cyksCisJICAoZXF1YWxpemVyX3NldF9iYW5kX3ZhbHVlKSwgKGVxdWFsaXplcl9zZXRfYWxsX2JhbmRfdmFsdWVzKSwKKwkgIChlcXVhbGl6ZXJfc2V0X2JhbmRfdmFsdWVfYW5kX3dhaXQpLAorCSAgKGVxdWFsaXplcl9zZXRfYWxsX2JhbmRfdmFsdWVzX2FuZF93YWl0KSwgKGRvX3NsaWRlcl9maWRkbGluZyksCisJICAobWFpbik6CisJICBBZGQgYnJhaW4tZGVhZCBpbnRlcmFjdGl2ZSB0ZXN0IGZvciBlcXVhbGl6ZXIuCisKKzIwMDctMDItMDIgMTg6MzY6MjggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6IFJlbmFtZSAidmFsdWVzIiBwcm9wZXJ0eSB0byAiYmFuZC12YWx1ZXMiIGFuZCBjaGFuZ2UgdHlwZSBpbnRvIGEKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiAoZ3N0X2lpcl9lcXVhbGl6ZXJfY2xhc3NfaW5pdCksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfc2V0X3Byb3BlcnR5KSwgKGdzdF9paXJfZXF1YWxpemVyX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfZmlsdGVyX2lucGxhY2UpOgorCSAgUmVuYW1lICJ2YWx1ZXMiIHByb3BlcnR5IHRvICJiYW5kLXZhbHVlcyIgYW5kIGNoYW5nZSB0eXBlIGludG8gYQorCSAgR1ZhbHVlQXJyYXksIHNvIGl0J3MgbW9yZSBlYXNpbHkgYmluZGFibGUgYW5kIHRoZSByYW5nZSBvZiB0aGUKKwkgIHZhbHVlcyBwYXNzZWQgaW4gaXMgZGVmaW5lZCBhbmQgY2hlY2tlZCBldGMuOyBhbHNvIGRvIHNvbWUKKwkgIGxvY2tpbmcuCisKKzIwMDctMDItMDIgMTc6Mzk6MjEgKzAwMDAgIEphbWVzIERvYyBMaXZpbmdzdG9uIDxkb2NsaXZpbmdzdG9uQGdtYWlsLmNvbT4KKworCSAgUG9ydCBlcXVhbGl6ZXIgcGx1Z2luIHRvIDAuMTAgKCM0MDM1NzIpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSmFtZXMgIkRvYyIgTGl2aW5nc3RvbiAgPGRvY2xpdmluZ3N0b24gYXQgZ21haWwgY29tPgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9lcXVhbGl6ZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6IChnc3RfaWlyX2VxdWFsaXplcl9nZXRfdHlwZSksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFzZV9pbml0KSwgKGdzdF9paXJfZXF1YWxpemVyX2NsYXNzX2luaXQpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX2NvbXB1dGVfZnJlcXVlbmNpZXMpLAorCSAgKGdzdF9paXJfZXF1YWxpemVyX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2lpcl9lcXVhbGl6ZXJfZmlsdGVyX2lucGxhY2UpLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfc2V0dXApLAorCSAgKHBsdWdpbl9pbml0KToKKwkgIFBvcnQgZXF1YWxpemVyIHBsdWdpbiB0byAwLjEwICgjNDAzNTcyKS4KKworMjAwNy0wMS0zMSAwODozMjo1OSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogRml4IGEgb2ZmIGJ5IG9uZSB0aGF0IGxlYWRzIHRvIHRoZSBkdXJhdGlvbiByZXBvcnRlZCBhcyBvbmUgc2FtcGxlIGxlc3MgdGhhbiBpdCBpcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiAoZ3N0X3dhdnBhY2tfcGFyc2Vfc3JjX3F1ZXJ5KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9oYW5kbGVfc2Vla19ldmVudCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfY3JlYXRlX3NyY19wYWQpOgorCSAgRml4IGEgb2ZmIGJ5IG9uZSB0aGF0IGxlYWRzIHRvIHRoZSBkdXJhdGlvbiByZXBvcnRlZCBhcyBvbmUKKwkgIHNhbXBsZSBsZXNzIHRoYW4gaXQgaXMKKworMjAwNy0wMS0zMCAxNzoxOTozMyArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBDaGVjayBmb3IgYW4gT2JqZWN0aXZlIEMgY29tcGlsZXIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBDaGVjayBmb3IgYW4gT2JqZWN0aXZlIEMgY29tcGlsZXIKKwkgICogc3lzL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3N4dmlkZW8vTWFrZWZpbGUuYW06CisJICAqIHN5cy9vc3h2aWRlby9jb2NvYXdpbmRvdy5oOgorCSAgKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cubToKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorCSAgKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm06CisJICBQb3J0IG9mIG9zeHZpZGVvIHBsdWdpbiB0byAwLjEwLiBEbyBOT1QgY29uc2lkZXIgMTAwJSBzdGFibGUgIQorCSAgRml4ZXMgIzQwMjQ3MAorCisyMDA3LTAxLTI5IDEwOjU5OjQ4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOiBTb21lIG1vcmUgaWdub3Jlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgU29tZSBtb3JlIGlnbm9yZXMuCisKKzIwMDctMDEtMjggMTg6Mjg6MzMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6IEZpeCBjcm9wcGluZyBmb3IgcGFja2VkIDQ6MjoyIGZvcm1hdHMgWVVZVi9ZVVkyIGFuZCBVWVZZLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJICAoZ3N0X3ZpZGVvX2Nyb3BfZ2V0X2ltYWdlX2RldGFpbHNfZnJvbV9jYXBzKSwKKwkgIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fcGFja2VkX2NvbXBsZXgpOgorCSAgRml4IGNyb3BwaW5nIGZvciBwYWNrZWQgNDoyOjIgZm9ybWF0cyBZVVlWL1lVWTIgYW5kIFVZVlkuCisJICAqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6IChjaGVja19idXNfZm9yX2Vycm9ycyksCisJICAodGVzdF93aXRoX2NhcHMpLCAobWFpbik6CisJICBCbG9jayBzdHJlYW1pbmcgdGhyZWFkIGJlZm9yZSBjaGFuZ2luZyBmaWx0ZXIgY2FwcyB3aGlsZSB0aGUKKwkgIHBpcGVsaW5lIGlzIHJ1bm5pbmcgc28gdGhhdCB3ZSBkb24ndCBnZXQgcmFuZG9tIG5vdC1uZWdvdGlhdGVkCisJICBlcnJvcnMganVzdCBiZWNhdXNlIEdTdHJlYW1lciBjYW4ndCBoYW5kbGUgdGhhdCB5ZXQuCisKKzIwMDctMDEtMjcgMTY6MDg6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6IENhdGNoIGVycm9ycyB3aGlsZSB0aGUgdGVzdCBpcyBydW5uaW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6ICh0ZXN0X3dpdGhfY2Fwcyk6CisJICBDYXRjaCBlcnJvcnMgd2hpbGUgdGhlIHRlc3QgaXMgcnVubmluZy4KKworMjAwNy0wMS0yNiAxMjoyMTo0MSArMDAwMCAgY2hhcmxlcyA8Y2hhcmxlc2czQGdtYWlsLmNvbT4KKworCSAgZXh0L3Nob3V0Mi9nc3RzaG91dDIuKjogUHJvcGVybHkgaGFuZGxlIHRhZ3MgaW4gc2hvdXQyc2VuZC4gRml4ZXMgIzM5OTgyNS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IGNoYXJsZXMgPGNoYXJsZXNnMyBhdCBnbWFpbCBkb3QgY29tPgorCSAgKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOiAoZ3N0X3Nob3V0MnNlbmRfaW5pdCksCisJICAoc2V0X3Nob3V0X21ldGFkYXRhKSwgKGdzdF9zaG91dDJzZW5kX2V2ZW50KToKKwkgICogZXh0L3Nob3V0Mi9nc3RzaG91dDIuaDoKKwkgIFByb3Blcmx5IGhhbmRsZSB0YWdzIGluIHNob3V0MnNlbmQuIEZpeGVzICMzOTk4MjUuCisKKzIwMDctMDEtMjUgMjM6Mjc6NTkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IEZpeCB0aGUgU0VFS0lORyBxdWVyeS4gV2UgY2FuIHNlZWsgaWYgd2UgYXJlIGluIHB1bGwgbW9kZSwgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5kLiBBLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9zcmNfcXVlcnkpOgorCSAgRml4IHRoZSBTRUVLSU5HIHF1ZXJ5LiBXZSBjYW4gc2VlayBpZiB3ZSBhcmUgaW4gcHVsbCBtb2RlLCBub3QgdGhlCisJICBvdGhlciB3YXkgYXJvdW5kLiBBbHNvIHNldCB0aGUgY29ycmVjdCBmb3JtYXQgaW4gdGhlIHNlZWtpbmcgcXVlcnkgYW5kCisJICBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGhlYWRlcnMgYXJlIG5vdCByZWFkIHlldCBhbmQgd2UgY2FuJ3Qgc2F5CisJICBhbnl0aGluZyBhYm91dCBvdXIgc2Vla2luZyBjYXBhYmlsaXRpZXMuCisKKzIwMDctMDEtMjUgMjE6NTU6NDkgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svOiBGaXggc3BlbGxpbmcgaW4gMiBwbGFjZXM6IEl0J3MgY2FsbGVkIFdhdnBhY2ssIG5vdCBXYXZlUGFjay4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfYmFzZV9pbml0KToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9iYXNlX2luaXQpOgorCSAgRml4IHNwZWxsaW5nIGluIDIgcGxhY2VzOiBJdCdzIGNhbGxlZCBXYXZwYWNrLCBub3QgV2F2ZVBhY2suCisKKzIwMDctMDEtMjUgMTQ6NDA6MTUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogQ29udmVydCBTRFAgZmllbGRzIHRvIHVwcGVyL2xvd2VyY2FzZSBmb2xsb3dpbmcgdGhlIHJ1bGVzIGluIHRoZSBTRFAgdG8gY2FwcyBkb2N1bWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19tZWRpYV90b19jYXBzKSwKKwkgIChnc3RfcnRzcHNyY19hY3RpdmF0ZV9zdHJlYW1zKToKKwkgIENvbnZlcnQgU0RQIGZpZWxkcyB0byB1cHBlci9sb3dlcmNhc2UgZm9sbG93aW5nIHRoZSBydWxlcyBpbiB0aGUgU0RQIHRvCisJICBjYXBzIGRvY3VtZW50LgorCisyMDA3LTAxLTI1IDE0OjIyOjUzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogRml4IGNhc2Ugb2YgZW5jb2RpbmctbmFtZSBhbmQga2V5L3ZhbHVlIHBhaXJzIHRvIG1hdGNoIHRoZSBkb2N1bWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL1JFQURNRToKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzoKKwkgIEZpeCBjYXNlIG9mIGVuY29kaW5nLW5hbWUgYW5kIGtleS92YWx1ZSBwYWlycyB0byBtYXRjaCB0aGUgZG9jdW1lbnQuCisJICBUaGlzIGlzIHRvIG1ha2UgaW50ZXJvcGVyYXRpb24gd2l0aCBTRFAgY2FzZS1pbnNlbnNpdGl2ZSBhcyByZXF1aXJlZCBieQorCSAgdGhlIHJlbGV2YW50IFJGQ3MuCisKKzIwMDctMDEtMjUgMTI6MDU6MTEgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC86IFVzZSBwcm9wZXIgcHJpbnQgc3RhdGVtZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkgIChnc3RfbXVsdGlfZmlsZV9zaW5rX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOiAoZ3N0X211bHRpX2ZpbGVfc3JjX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbXZlL2dzdG12ZWRlbXV4LmM6IChnc3RfbXZlX3ZpZGVvX2NyZWF0ZV9idWZmZXIpLAorCSAgKGdzdF9tdmVfdmlkZW9fcGFsZXR0ZSksIChnc3RfbXZlX3ZpZGVvX2NvZGVfbWFwKSwKKwkgIChnc3RfbXZlX2F1ZGlvX2luaXQpLCAoZ3N0X212ZV9hdWRpb19kYXRhKSwgKGdzdF9tdmVfdGltZXJfY3JlYXRlKSwKKwkgIChnc3RfbXZlX2RlbXV4X2NoYWluKToKKwkgICogZ3N0L212ZS9nc3RtdmVtdXguYzogKGdzdF9tdmVfbXV4X3B1c2hfY2h1bmspOgorCSAgKiBnc3QvbXZlL212ZWF1ZGlvZW5jLmM6IChtdmVfY29tcHJlc3NfYXVkaW8pOgorCSAgKiBnc3QvbXZlL212ZXZpZGVvZGVjMTYuYzogKGlwdmlkZW9fY29weV9ibG9jayk6CisJICAqIGdzdC9tdmUvbXZldmlkZW9kZWM4LmM6IChpcHZpZGVvX2NvcHlfYmxvY2spOgorCSAgKiBnc3QvbXZlL212ZXZpZGVvZW5jMTYuYzogKG12ZV9lbmNvZGVfZnJhbWUxNik6CisJICAqIGdzdC9tdmUvbXZldmlkZW9lbmM4LmM6IChtdmVfZW5jb2RlX2ZyYW1lOCk6CisJICBVc2UgcHJvcGVyIHByaW50IHN0YXRlbWVudHMuCisJICBGaXhlcyBidWlsZCBvbiBtYWMgb3MgeC4KKwkgIDx3aW5nbz4gb28gbG9vayBhdCBtZSBteSBuYW1lIGlzIGVkd2FyZCBpJ20gaGFja2luZyBvbiBtYWNvcyB3b29vCisKKzIwMDctMDEtMjUgMTE6MDI6MDEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogQnVtcCByZXF1aXJlZCAtY29yZS8tYmFzZSB0byBDVlMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBCdW1wIHJlcXVpcmVkIC1jb3JlLy1iYXNlIHRvIENWUworCisyMDA3LTAxLTI1IDEwOjU0OjE5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cEwxNnBheS4qOiBGaWxsIHVwIHRvIE1UVSB1c2luZyBhZGFwdGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6IChnc3RfcnRwX0wxNl9wYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9MMTZfcGF5X2ZsdXNoKSwgKGdzdF9ydHBfTDE2X3BheV9oYW5kbGVfYnVmZmVyKToKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZwYXkuaDoKKwkgIEZpbGwgdXAgdG8gTVRVIHVzaW5nIGFkYXB0ZXIuCisJICBUaW1lc3RhbXAgcnRwIHBhY2tldHMuCisKKzIwMDctMDEtMjUgMTA6MzY6MzUgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIFVzZSBHX0dTSVpFX0ZPUk1BVCBpbiBwcmludCBzdGF0ZW1lbnRzIGZvciBwb3J0YWJpbGl0eS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOiAoZ3N0X211bHRpcGFydF9tdXhfY29sbGVjdGVkKToKKwkgICogc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmM6ICh4aW1hZ2V1dGlsX2NoZWNrX3hzaG1fY2FsbHMpOgorCSAgVXNlIEdfR1NJWkVfRk9STUFUIGluIHByaW50IHN0YXRlbWVudHMgZm9yIHBvcnRhYmlsaXR5LgorCSAgRml4ZXMgYnVpbGQgb24gbWFjb3N4LgorCisyMDA3LTAxLTI0IDE4OjIwOjE0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogUG9ydCBhbmQgZW5hYmxlIHJhdyBhdWRpbyBwYXlsb2FkZXIvZGVwYXlsb2FkZXIuIE5lZWRzIGEgYml0IG1vcmUgd29yayBvbiB0aGUgcGF5bG9hZGVyIHNpZGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOiAoZ3N0X3J0cF9MMTZfZGVwYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX0wxNl9kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfTDE2X2RlcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfTDE2X2RlcGF5X3BhcnNlX2ludCksIChnc3RfcnRwX0wxNl9kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX0wxNl9kZXBheV9wcm9jZXNzKSwgKGdzdF9ydHBfTDE2X2RlcGF5X3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9MMTZfZGVwYXlfZ2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBfTDE2X2RlcGF5X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0cF9MMTZfZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6IChnc3RfcnRwX0wxNl9wYXlfZ2V0X3R5cGUpLAorCSAgKGdzdF9ydHBfTDE2X3BheV9iYXNlX2luaXQpLCAoZ3N0X3J0cF9MMTZfcGF5X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfTDE2X3BheV9pbml0KSwgKGdzdF9ydHBfTDE2X3BheV9maW5hbGl6ZSksCisJICAoZ3N0X3J0cF9MMTZfcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9MMTZfcGF5X2hhbmRsZV9idWZmZXIpLAorCSAgKGdzdF9ydHBfTDE2X3BheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5Lmg6CisJICBQb3J0IGFuZCBlbmFibGUgcmF3IGF1ZGlvIHBheWxvYWRlci9kZXBheWxvYWRlci4gTmVlZHMgYSBiaXQgbW9yZSB3b3JrCisJICBvbiB0aGUgcGF5bG9hZGVyIHNpZGUuCisKKzIwMDctMDEtMjQgMTY6MjU6NTUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuKjogT25seSB1bmJsb2NrIHRoZSB1ZHAgcGFkcyB3aGVuIHdlIGxpbmtlZCBhbmQgYWN0aXZhdGVkIHRoZW0gYWxsLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKHBhZF9ibG9ja2VkKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksCisJICAoZ3N0X3J0c3BzcmNfYWN0aXZhdGVfc3RyZWFtcyksIChnc3RfcnRzcHNyY19sb29wX3VkcCk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIE9ubHkgdW5ibG9jayB0aGUgdWRwIHBhZHMgd2hlbiB3ZSBsaW5rZWQgYW5kIGFjdGl2YXRlZCB0aGVtIGFsbC4KKwkgIEZpeGVzICMzOTU2ODguCisKKzIwMDctMDEtMjQgMTU6MTg6MzQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBBZGRlZCBzaW1wbGUgQUMzIGRlcGF5bG9hZGVyIChSRkMgNDE4NCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5jOiAoZ3N0X3J0cF9hYzNfZGVwYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX2FjM19kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfYWMzX2RlcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfYWMzX2RlcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9hYzNfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF9hYzNfZGVwYXlfc2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBfYWMzX2RlcGF5X2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9hYzNfZGVwYXlfY2hhbmdlX3N0YXRlKSwgKGdzdF9ydHBfYWMzX2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5oOgorCSAgQWRkZWQgc2ltcGxlIEFDMyBkZXBheWxvYWRlciAoUkZDIDQxODQpLgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jOiAoZ3N0X3J0cF9tcDJ0X2RlcGF5X3NldGNhcHMpOgorCSAgRml4IGEgbGVhay4KKworMjAwNy0wMS0yNCAxMjo0MTowMyArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBnc3QvYXVkaW9meC86IEFkZCBuZXcgZWxlbWVudCAiYXVkaW9hbXBsaWZ5Ii4gVGhpcyBhbGxvd3Mgc2NhbGluZyBvZiByYXcgYXVkaW8gc2FtcGxlcywgc2ltaWxhciB0byB0aGUgInZvbHVtZSIgZWxlbWUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmV2aWV3ZWQgYnk6IFN0ZWZhbiBLb3N0ICA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisJICAqIGdzdC9hdWRpb2Z4L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYzoKKwkgIChnc3RfYXVkaW9fYW1wbGlmeV9jbGlwcGluZ19tZXRob2RfZ2V0X3R5cGUpLAorCSAgKGdzdF9hdWRpb19hbXBsaWZ5X2Jhc2VfaW5pdCksIChnc3RfYXVkaW9fYW1wbGlmeV9jbGFzc19pbml0KSwKKwkgIChnc3RfYXVkaW9fYW1wbGlmeV9pbml0KSwgKGdzdF9hdWRpb19hbXBsaWZ5X3NldF9wcm9jZXNzX2Z1bmN0aW9uKSwKKwkgIChnc3RfYXVkaW9fYW1wbGlmeV9zZXRfcHJvcGVydHkpLCAoZ3N0X2F1ZGlvX2FtcGxpZnlfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfYXVkaW9fYW1wbGlmeV9zZXRfY2FwcyksCisJICAoZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2ludF9jbGlwKSwKKwkgIChnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1faW50X3dyYXBfbmVnYXRpdmUpLAorCSAgKGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9pbnRfd3JhcF9wb3NpdGl2ZSksCisJICAoZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2Zsb2F0X2NsaXApLAorCSAgKGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9mbG9hdF93cmFwX25lZ2F0aXZlKSwKKwkgIChnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fZmxvYXRfd3JhcF9wb3NpdGl2ZSksCisJICAoZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5Lmg6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZnguYzogKHBsdWdpbl9pbml0KToKKwkgIEFkZCBuZXcgZWxlbWVudCAiYXVkaW9hbXBsaWZ5Ii4gVGhpcyBhbGxvd3Mgc2NhbGluZyBvZiByYXcgYXVkaW8KKwkgIHNhbXBsZXMsIHNpbWlsYXIgdG8gdGhlICJ2b2x1bWUiIGVsZW1lbnQsIGJ1dCBwcm92aWRlcyBkaWZmZXJlbnQgbW9kZXMKKwkgIGZvciBjbGlwcGluZyBhbmQgYWxsb3dzIHVubGltaXRlZCBhbXBsaWZpY2F0aW9uLiBJdCdzIG1haW5seSB0YXJnZXRlZAorCSAgZm9yIGNyZWF0aXZlIHNvdW5kIGRlc2lnbiBhbmQgbm90IGFzIGEgcmVwbGFjZW1lbnQgb2YgdGhlICJ2b2x1bWUiCisJICBlbGVtZW50LiBGaXhlcyAjMzk3MTYyCisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkgIEFkZCBkb2NzIGZvciBhdWRpb2FtcGxpZnkgYW5kIGludGVncmF0ZSB0aGVtIGludG8gdGhlIGJ1aWxkIHN5c3RlbQorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9hbXBsaWZ5LmM6IChzZXR1cF9hbXBsaWZ5KSwKKwkgIChjbGVhbnVwX2FtcGxpZnkpLCAoR1NUX1NUQVJUX1RFU1QpLCAoYW1wbGlmeV9zdWl0ZSksIChtYWluKToKKwkgIEFkZCBmYWlybHkgZXh0ZW5zaXZlIHVuaXQgdGVzdCBzdWl0ZSBmb3IgYXVkaW9hbXBsaWZ5CisKKzIwMDctMDEtMjQgMTI6MjY6NDEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogVW5ibG9jayBwYWRzIGFmdGVyIGFkZGluZyB0aGUgcGFkcyB0byB0aGUgZWxlbWVudCBzbyB0aGF0IGF1dG9wbHVnZ2VycyBnZXQgYSBjaGFuZ2UgdG8gbGluayBzby4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKHBhZF91bmJsb2NrZWQpLCAocGFkX2Jsb2NrZWQpOgorCSAgVW5ibG9jayBwYWRzIGFmdGVyIGFkZGluZyB0aGUgcGFkcyB0byB0aGUgZWxlbWVudCBzbyB0aGF0IGF1dG9wbHVnZ2VycworCSAgZ2V0IGEgY2hhbmdlIHRvIGxpbmsgc29tZXRoaW5nLiBQb3NzaWJseSBmaXhlcyAjMzk1Njg4LgorCisyMDA3LTAxLTI0IDEyOjIyOjUxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogRml4IGNhcHMgd2l0aCBwYXlsb2FkIG51bWJlcnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOiAoZ3N0X3J0cF9tcDR2X2RlcGF5X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOiAoZ3N0X3J0cF9tcGFfZGVwYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9tcGFfZGVwYXlfaW5pdCksIChnc3RfcnRwX21wYV9kZXBheV9zZXRjYXBzKSwKKwkgIChnc3RfcnRwX21wYV9kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jOiAoZ3N0X3J0cF9tcHZfZGVwYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9tcHZfZGVwYXlfaW5pdCksIChnc3RfcnRwX21wdl9kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6CisJICBGaXggY2FwcyB3aXRoIHBheWxvYWQgbnVtYmVycy4KKwkgIEFkZCBzb21lIGZpeGVkIHBheWxvYWQgbnVtYmVycyB0byBjYXBzIHdoZW4gcG9zc2libGUuCisKKzIwMDctMDEtMjQgMTE6Mjk6MDAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L2dzdHJ0cHhxdGRlcGF5LmM6IEZpeCBjYXBzIG9uIHRoZSBkZXBheWxvYWRlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9nc3RydHB4cXRkZXBheS5jOgorCSAgRml4IGNhcHMgb24gdGhlIGRlcGF5bG9hZGVyLgorCisyMDA3LTAxLTIzIDE4OjE2OjA5ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGdzdC9hdWRpb2Z4LzogQWRkIG5ldyBhdWRpb2Z4IGVsZW1lbnQgImF1ZGlvaW52ZXJ0Ii4gVGhpcyBlbGVtZW50IHN3YXBzIHRoZSB1cHBlciBhbmQgbG93ZXIgaGFsZiBvZiBzYW1wbGVzIGFuZCBjYW4gYi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZXZpZXdlZCBieTogU3RlZmFuIEtvc3QgIDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKwkgICogZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvZnguYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuYzogKGdzdF9hdWRpb19pbnZlcnRfYmFzZV9pbml0KSwKKwkgIChnc3RfYXVkaW9faW52ZXJ0X2NsYXNzX2luaXQpLCAoZ3N0X2F1ZGlvX2ludmVydF9pbml0KSwKKwkgIChnc3RfYXVkaW9faW52ZXJ0X3NldF9wcm9wZXJ0eSksIChnc3RfYXVkaW9faW52ZXJ0X2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X2F1ZGlvX2ludmVydF9zZXRfY2FwcyksIChnc3RfYXVkaW9faW52ZXJ0X3RyYW5zZm9ybV9pbnQpLAorCSAgKGdzdF9hdWRpb19pbnZlcnRfdHJhbnNmb3JtX2Zsb2F0KSwKKwkgIChnc3RfYXVkaW9faW52ZXJ0X3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0Lmg6CisJICBBZGQgbmV3IGF1ZGlvZnggZWxlbWVudCAiYXVkaW9pbnZlcnQiLiBUaGlzIGVsZW1lbnQgc3dhcHMgdGhlIHVwcGVyCisJICBhbmQgbG93ZXIgaGFsZiBvZiBzYW1wbGVzIGFuZCBjYW4gYmUgdXNlZCBmb3IgZXhhbXBsZSBmb3IgYQorCSAgd2lkZS1zdGVyZW8gZWZmZWN0LiBGaXhlcyAjMzk2MDU3CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbDoKKwkgIEFkZCBkb2NzIGZvciB0aGUgYXVkaW9pbnZlcnQgZWxlbWVudCBhbmQgYWRkIHRoZW0gdG8gdGhlIGJ1aWxkIHN5c3RlbS4KKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvaW52ZXJ0LmM6IChzZXR1cF9pbnZlcnQpLAorCSAgKGNsZWFudXBfaW52ZXJ0KSwgKEdTVF9TVEFSVF9URVNUKSwgKGludmVydF9zdWl0ZSksIChtYWluKToKKwkgIEFkZCB1bml0IHRlc3Qgc3VpdGUgZm9yIHRoZSBhdWRpb2ludmVydCBlbGVtZW50LgorCisyMDA3LTAxLTIzIDE3OjM2OjMyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOiBQYXJzZSBjb25maWcgcGFyYW1zIGFzIHN0cmluZyBhbmQgaW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6IChnc3RfcnRwX21wNGdfZGVwYXlfcGFyc2VfaW50KSwKKwkgIChnc3RfcnRwX21wNGdfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX21wNGdfZGVwYXlfcHJvY2Vzcyk6CisJICBQYXJzZSBjb25maWcgcGFyYW1zIGFzIHN0cmluZyBhbmQgaW50LgorCSAgUGFyc2UgYW5kIHVzZSBBVSBoZWFkZXIgbGVuZ3RoCisKKzIwMDctMDEtMjMgMTc6Mjc6MzkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9zbXB0ZS86IGNvbnN0aWZ5IHNvbWUgc3RhdGljIHN0cnVjdHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3NtcHRlL2JhcmJveHdpcGVzLmM6IChnc3Rfd2lwZV9ib3hlc19kcmF3KSwKKwkgIChnc3Rfd2lwZV90cmlhbmdsZXNfY2xvY2tfZHJhdyksIChnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdyk6CisJICAqIGdzdC9zbXB0ZS9nc3RtYXNrLmM6IChfZ3N0X21hc2tfcmVnaXN0ZXIpOgorCSAgKiBnc3Qvc21wdGUvZ3N0bWFzay5oOgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzogKGdzdF9zbXB0ZV91cGRhdGVfbWFzayk6CisJICAqIGdzdC9zbXB0ZS9wYWludC5jOiAoZ3N0X3NtcHRlX3BhaW50X2hib3gpLCAoZHJhd19icmVzZW5oYW1fbGluZSksCisJICAoZ3N0X3NtcHRlX3BhaW50X3RyaWFuZ2xlX2Nsb2NrKToKKwkgIGNvbnN0aWZ5IHNvbWUgc3RhdGljIHN0cnVjdHMuCisJICBEb24ndCB1cGRhdGUgdGhlIG1hc2sgaWYgbm90aGluZyBjaGFuZ2VkIHRvIHRoZSBwYXJhbXMuCisJICBNYWtlIHN1cmUgd2UgbmV2ZXIgZHJhdyBvdXRzaWRlIG9mIHRoZSBwaWN0dXJlLiBGaXhlcyAjMzk4MzI1LgorCisyMDA3LTAxLTIyIDEzOjA2OjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IEVycm9yIG91dCBwcm9wZXJseSB3aGVuIHB1bGxfcmFuZ2UgZmFpbHMgd2hpbGUgd2UncmUgcmVhZGluZyB0aGUgaGVhZGVycywgaW5zdGVhZCBvZiBqdXN0IHBhdXMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVsbCk6CisJICBFcnJvciBvdXQgcHJvcGVybHkgd2hlbiBwdWxsX3JhbmdlIGZhaWxzIHdoaWxlIHdlJ3JlIHJlYWRpbmcgdGhlCisJICBoZWFkZXJzLCBpbnN0ZWFkIG9mIGp1c3QgcGF1c2luZyB0aGUgdGFzayBzaWxlbnRseS4gRml4ZXMgIzM5OTMzOC4KKworMjAwNy0wMS0xOSAxMzowNjowNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3NtcHRlL2dzdHNtcHRlLmM6IFNvbWUgbW9yZSBzYW5pdHkgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgaW5wdXQgZm9ybWF0cyBtYXRjaCBhbmQgdGhlIGlucHV0IHBhZHMgYXJlIGFjdHVhbGx5IG5lLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6IChnc3Rfc21wdGVfY29sbGVjdGVkKToKKwkgIFNvbWUgbW9yZSBzYW5pdHkgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgaW5wdXQgZm9ybWF0cyBtYXRjaCBhbmQgdGhlCisJICBpbnB1dCBwYWRzIGFyZSBhY3R1YWxseSBuZWdvdGlhdGVkLCBpbiBjYXNlIHNvbWVvbmUgdHJpZXMgdG8gZmVlZAorCSAgYnVmZmVycyBmcm9tIGZha2VzcmMgb3IgZmlsZXNyYy4gRml4ZXMgIzM5ODI5OS4KKwkgIEFsc28gY29uc3QtaWZ5IGFuIGFycmF5LCBqdXN0IGJlY2F1c2Ugd2UgY2FuLgorCisyMDA3LTAxLTE5IDEwOjM1OjEzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3Qvc21wdGUvZ3N0c21wdGUuYzogSWdub3JlIHByZXZpb3VzIGNvbW1pdCwgdGhhdCB3YXMgb25seSB2YWxpZCBmb3Igd2lkdGhzIGFuZCBoZWlnaHRzIHRoYXQgYXJlIG11bHRpcGxlcyBvZiA0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiAoZmlsbF9pNDIwKSwgKGdzdF9zbXB0ZV9jb2xsZWN0ZWQpOgorCSAgSWdub3JlIHByZXZpb3VzIGNvbW1pdCwgdGhhdCB3YXMgb25seSB2YWxpZCBmb3Igd2lkdGhzIGFuZCBoZWlnaHRzCisJICB0aGF0IGFyZSBtdWx0aXBsZXMgb2YgNC4KKwkgIENvcHkgb3ZlciBzaXplL3N0cmlkZSBtYWNyb3MgZnJvbSBqcGVnZGVjLiBUaGlzIGFsbG93cyB0aGUgZWxlbWVudAorCSAgdG8gd29yayB3aXRoIGFueSB3aWR0aCxoZWlnaHQuLi4KKwkgIC4uLiBidXQgcHV0cyBpbiBldmlkZW5jZSB0aGF0IHRoZSBhY3R1YWwgdHJhbnNmb3JtYXRpb25zIG9ubHkgd29yaworCSAgd2l0aCB3aWR0aC9oZWlnaHQgdGhhdCBhcmUgbXVsdGlwbGVzIG9mIDQuCisKKzIwMDctMDEtMTkgMDk6NDg6NDcgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiBBbGxvY2F0ZSBidWZmZXJzIG9mIHRoZSByaWdodCBzaXplLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiAoZ3N0X3NtcHRlX2NvbGxlY3RlZCk6CisJICBBbGxvY2F0ZSBidWZmZXJzIG9mIHRoZSByaWdodCBzaXplLgorCSAgVGhlIHByb3BlciBzaXplIG9mIGEgSTQyMCBidWZmZXIgaW4gYnl0ZXMgaXM6CisJICB3aWR0aCAqIGhlaWdodCAqIDMKKwkgIC0tLS0tLS0tLS0tLS0tLS0tLQorCSAgMgorCisyMDA3LTAxLTE4IDE4OjM3OjM5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3Qvc21wdGUvZ3N0c21wdGUuYzogUHJveHkgZ2V0Y2FwcyBvbiBzaW5rIHBhZHMgdG9vLCBzbyB0aGF0IHdlIGVpdGhlciBlbmQgdXAgd2l0aCB0aGUgc2FtZSBkaW1lbnNpb25zIG9uIGFsbCBwYWRzIG8uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzogKGdzdF9zbXB0ZV9pbml0KToKKwkgIFByb3h5IGdldGNhcHMgb24gc2luayBwYWRzIHRvbywgc28gdGhhdCB3ZSBlaXRoZXIgZW5kIHVwIHdpdGggdGhlCisJICBzYW1lIGRpbWVuc2lvbnMgb24gYWxsIHBhZHMgb3IgZXJyb3Igb3V0IGlmIHRoYXQncyBub3QgcG9zc2libGUKKwkgIChzZWVtcyB0byB3b3JrIGV2ZW4hKS4gRml4ZXMgIzM5ODA4NiwgSSB0aGluay4KKworMjAwNy0wMS0xOCAxMToyOToxNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogUmVtb3ZlIGxhZHNwYSBmcm9tIGRvY3M7IGFkZCBoaWVyYXJjaHkgaW5mbyBmb3IgR3N0QXVkaW9QYW5vcmFtYTsgZml4IGludGVnZXIgcHJvcGVydGllcyB3aXRoIC0xIGFzIG1pLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICBSZW1vdmUgbGFkc3BhIGZyb20gZG9jczsgYWRkIGhpZXJhcmNoeSBpbmZvIGZvciBHc3RBdWRpb1Bhbm9yYW1hOworCSAgZml4IGludGVnZXIgcHJvcGVydGllcyB3aXRoIC0xIGFzIG1pbmltdW0gdmFsdWUuCisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkaW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkgIFVwZGF0ZSB0byBDVlMuCisKKzIwMDctMDEtMTggMTE6MjM6MzYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOiBGaXggZG9jIHNlY3Rpb24gbmFtZSAoRml4ZXMgIzM5Nzk0NikKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmM6CisJICBGaXggZG9jIHNlY3Rpb24gbmFtZSAoRml4ZXMgIzM5Nzk0NikKKworMjAwNy0wMS0xOCAxMDozMzo1MCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogQ2hhbmdlTG9nOgorCSAgUmVtb3ZlIGJvZ3VzIENoYW5nZUxvZyBlbnRyeQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBSZW1vdmUgYm9ndXMgQ2hhbmdlTG9nIGVudHJ5CisKKzIwMDctMDEtMTcgMTQ6MzA6NTAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgc3lzL3Y0bDIvOiBGaXggRUlPIGhhbmRpbmcgd2hlbiBjYXB0dXJpbmcuIEFkZCBuZXcgcHJvcGVydHkgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gZW5xdWUgKGFuZCByZW1vdmUgdGhlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgKGdzdF92NGwyX29iamVjdF9pbnN0YWxsX3Byb3BlcnRpZXNfaGVscGVyKSwKKwkgIChnc3RfdjRsMl9vYmplY3Rfc2V0X3Byb3BlcnR5X2hlbHBlciksCisJICAoZ3N0X3Y0bDJfb2JqZWN0X2dldF9wcm9wZXJ0eV9oZWxwZXIpLCAoZ3N0X3Y0bDJfc2V0X2RlZmF1bHRzKToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfdjRsMnNyY19pbml0KSwgKGdzdF92NGwyc3JjX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3Y0bDJzcmNfZ2V0X3Byb3BlcnR5KSwgKGdzdF92NGwyc3JjX3NldF9jYXBzKToKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfZmlsbF9mb3JtYXRfbGlzdCksCisJICAoZ3N0X3Y0bDJzcmNfZ3JhYl9mcmFtZSksIChnc3RfdjRsMnNyY19zZXRfY2FwdHVyZSksCisJICAoZ3N0X3Y0bDJzcmNfY2FwdHVyZV9pbml0KSwgKGdzdF92NGwyc3JjX2NhcHR1cmVfc3RhcnQpLAorCSAgKGdzdF92NGwyc3JjX2NhcHR1cmVfZGVpbml0KToKKwkgIEZpeCBFSU8gaGFuZGluZyB3aGVuIGNhcHR1cmluZy4gQWRkIG5ldyBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YKKwkgIGJ1ZmZlcnMgdG8gZW5xdWUgKGFuZCByZW1vdmUgdGhlIGJvcmtlZCBudW0tYnVmZmVycyB1c2FnZSkuCisKKzIwMDctMDEtMTYgMDg6Mjk6MTEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOiBVc2UgYSBmdW5jdGlvbiBhcnJheSBmb3IgcHJvY2VzcyBtZXRob2RzLCBhZGQgbW9yZSBkb2NzIGFuZCBkZWZpbmUgdGhlIHN0YXJ0aW5kZXggb2YgZW51bXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tbyBjaXJjdWxhci1jaGFvcyBvcmc+CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzogKGdzdF9hdWRpb19wYW5vcmFtYV9jbGFzc19pbml0KSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfc2V0X3Byb2Nlc3NfZnVuY3Rpb24pOgorCSAgVXNlIGEgZnVuY3Rpb24gYXJyYXkgZm9yIHByb2Nlc3MgbWV0aG9kcywgYWRkIG1vcmUgZG9jcyBhbmQgZGVmaW5lIHRoZQorCSAgc3RhcnRpbmRleCBvZiBlbnVtcy4KKworMjAwNy0wMS0xNCAxNzo1NTozMyArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3QHNreW5ldC5iZT4KKworCSAgQWRkIHN1cHBvcnQgZm9yIG1vcmUgdGhhbiBvbmUgYXVkaW8gc3RyZWFtOyB3cml0ZSBiZXR0ZXIgQVZJWCBoZWFkZXI7IHJlZmFjdG9yIGNvZGUgYSBiaXQ7IGRvbid0IGFubm91bmNlIHZvcmJpcyBjYXBzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXcgYXQgc2t5bmV0IGJlPgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aV9tdXhfZmluYWxpemUpLAorCSAgKGdzdF9hdmlfbXV4X3BhZF9yZXNldCksIChnc3RfYXZpX211eF9yZXNldCksIChnc3RfYXZpX211eF9pbml0KSwKKwkgIChnc3RfYXZpX211eF92aWRzaW5rX3NldF9jYXBzKSwgKGdzdF9hdmlfbXV4X2F1ZHNpbmtfc2V0X2NhcHMpLAorCSAgKGdzdF9hdmlfbXV4X3JlcXVlc3RfbmV3X3BhZCksIChnc3RfYXZpX211eF9yZWxlYXNlX3BhZCksCisJICAoZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpX2hlYWRlciksCisJICAoZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpeF9oZWFkZXIpLCAoZ3N0X2F2aV9tdXhfcmlmZl9nZXRfaGVhZGVyKSwKKwkgIChnc3RfYXZpX211eF93cml0ZV9hdml4X2luZGV4KSwgKGdzdF9hdmlfbXV4X2FkZF9pbmRleCksCisJICAoZ3N0X2F2aV9tdXhfYmlnZmlsZSksIChnc3RfYXZpX211eF9zdGFydF9maWxlKSwKKwkgIChnc3RfYXZpX211eF9zdG9wX2ZpbGUpLCAoZ3N0X2F2aV9tdXhfaGFuZGxlX2V2ZW50KSwKKwkgIChnc3RfYXZpX211eF9kb19idWZmZXIpLCAoZ3N0X2F2aV9tdXhfZG9fb25lX2J1ZmZlciksCisJICAoZ3N0X2F2aV9tdXhfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguaDoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpbXV4LmM6ICh0ZWFyZG93bl9zcmNfcGFkKToKKwkgIEFkZCBzdXBwb3J0IGZvciBtb3JlIHRoYW4gb25lIGF1ZGlvIHN0cmVhbTsgd3JpdGUgYmV0dGVyIEFWSVgKKwkgIGhlYWRlcjsgcmVmYWN0b3IgY29kZSBhIGJpdDsgZG9uJ3QgYW5ub3VuY2Ugdm9yYmlzIGNhcHMgb24gb3VyIGF1ZGlvCisJICBzaW5rIHBhZHMgc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBpdCBhbnl3YXkuIENsb3NlcyAjMzc5Mjk4LgorCisyMDA3LTAxLTEzIDE5OjEyOjMyICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jIChnc3RfZGVpbnRlcmxlYXZlX2FkZF9uZXdfcGFkcyk6IFVzZSBmaXhlZCBjYXBzIG9uIHNyYyBwYWRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA3LTAxLTEzICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYyAoZ3N0X2RlaW50ZXJsZWF2ZV9hZGRfbmV3X3BhZHMpOgorCSAgVXNlIGZpeGVkIGNhcHMgb24gc3JjIHBhZHMuCisJICAoZ3N0X2RlaW50ZXJsZWF2ZV9yZW1vdmVfcGFkcyk6IFJlbW92ZSBzcmMgcGFkcywgbm90IHNpbmsgcGFkcy4gSQorCSAgc2VlbSB0byBoYXZlIHJldmVyc2UgbWlkYXMgZGlzZWFzZSEKKwkgIChnc3RfZGVpbnRlcmxlYXZlX3Byb2Nlc3MpOiBQcm94eSB0aW1lc3RhbXBzLCBvZmZzZXRzLCBkdXJhdGlvbnMsCisJICBhbmQgc2V0IGNhcHMgb24gb3V0Z29pbmcgYnVmZmVycy4gRml4ZXMgIzM5NTU5NywgSSB0aGluay4KKworMjAwNy0wMS0xMyAxODowMTo0MSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmMgKGdzdF9pbnRlcmxlYXZlX2luaXQpOiBJbml0IHRoZSBhY3RpdmF0aW9uIG1vZGUgcHJvcGVybHkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDctMDEtMTMgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYyAoZ3N0X2ludGVybGVhdmVfaW5pdCk6IEluaXQgdGhlCisJICBhY3RpdmF0aW9uIG1vZGUgcHJvcGVybHkuCisJICAoZ3N0X2ludGVybGVhdmVfc3JjX3NldGNhcHMsIGdzdF9pbnRlcmxlYXZlX3NyY19nZXRjYXBzKQorCSAgKGdzdF9pbnRlcmxlYXZlX2luaXQpOiBTZXQgYSBzZXRjYXBzIGFuZCBnZXRjYXBzIGZ1bmN0aW9uIG9uIHRoZQorCSAgc3JjIHBhZCwgc28gdGhhdCB3ZSBjYW4gaW1wbGVtZW50IHB1bGwtbW9kZSBuZWdvdGlhdGlvbi4KKwkgIChnc3RfaW50ZXJsZWF2ZV9zaW5rX3NldGNhcHMpOiBSZW5hbWVkIGZyb20KKwkgIGdzdF9pbnRlcmxlYXZlX3NldGNhcHMsIGFzIGl0IG9ubHkgZG9lcyB0aGUgc2luayBsb2dpYyBub3cuCisJICBJbXBsZW1lbnQgYm90aCBmb3IgcHVsbC1tb2RlIGFuZCBwdXNoLW1vZGUuCisJICAoZ3N0X2ludGVybGVhdmVfcHJvY2Vzcyk6IFNldCBjYXBzIG9uIG91ciBvdXRnb2luZyBidWZmZXIuCisJICAoZ3N0X2ludGVybGVhdmVfc3JjX2FjdGl2YXRlX3B1bGwpOiBGaXggc29tZSBtb3JlIGJvZ3VzIGNhc3RzLgorCSAgV2hhdCBpcyB1cCB3aXRoIHRoaXMuCisKKzIwMDctMDEtMTMgMTU6NTI6MTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS4qOiBBZGQgJ21ldGhvZCcgcHJvcGVydHkgYW5kIHByb3ZpZGUgYSBzaW1wbGUgKG5vbi1wc3ljaG9hY3VzdGljKSBwcm9jZXNzaW5nIG1ldGhvZCAoIzM5NDg1OSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tbyBjaXJjdWxhci1jaGFvcyBvcmc+CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfbWV0aG9kX2dldF90eXBlKSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfY2xhc3NfaW5pdCksIChnc3RfYXVkaW9fcGFub3JhbWFfaW5pdCksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3NldF9wcm9jZXNzX2Z1bmN0aW9uKSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfZ2V0X3Byb3BlcnR5KSwgKGdzdF9hdWRpb19wYW5vcmFtYV9zZXRfY2FwcyksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9tMnNfaW50X3NpbXBsZSksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9zMnNfaW50X3NpbXBsZSksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9tMnNfZmxvYXRfc2ltcGxlKSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX3Myc19mbG9hdF9zaW1wbGUpOgorCSAgKiBnc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmg6CisJICBBZGQgJ21ldGhvZCcgcHJvcGVydHkgYW5kIHByb3ZpZGUgYSBzaW1wbGUgKG5vbi1wc3ljaG9hY3VzdGljKQorCSAgcHJvY2Vzc2luZyBtZXRob2QgKCMzOTQ4NTkpLgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3Bhbm9yYW1hLmM6IChHU1RfU1RBUlRfVEVTVCksCisJICAocGFub3JhbWFfc3VpdGUpOgorCSAgVGVzdHMgZm9yIG5ldyBtZXRob2QuCisKKzIwMDctMDEtMTIgMTg6Mjg6MTMgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgY29tbWVudCBvdXQgTEFEU1BBIHBsdWdpbiBmb3Igbm93CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGNvbW1lbnQgb3V0IExBRFNQQSBwbHVnaW4gZm9yIG5vdworCisyMDA3LTAxLTEyIDE3OjE2OjUxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC86IEFkZCBYLVFUIGRlcGF5bG9hZGVyIHRoYXQgd2lsbCBldmVudHVhbGx5IHNoYXJlIGNvZGUgd2l0aCB0aGUgZGVtdXhlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3F0ZGVtdXgvZ3N0cnRweHF0ZGVwYXkuYzogKGdzdF9ydHBfeHF0X2RlcGF5X2Jhc2VfaW5pdCksCisJICAoZ3N0X3J0cF94cXRfZGVwYXlfY2xhc3NfaW5pdCksIChnc3RfcnRwX3hxdF9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX3hxdF9kZXBheV9maW5hbGl6ZSksIChnc3RfcnRwX3F1aWNrdGltZV9wYXJzZV9zZCksCisJICAoZ3N0X3J0cF94cXRfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX3hxdF9kZXBheV9wcm9jZXNzKSwKKwkgIChnc3RfcnRwX3hxdF9kZXBheV9zZXRfcHJvcGVydHkpLCAoZ3N0X3J0cF94cXRfZGVwYXlfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX3hxdF9kZXBheV9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3J0cF94cXRfZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcXRkZW11eC9nc3RydHB4cXRkZXBheS5oOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9iYXNlX2luaXQpLAorCSAgKGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfaGVhZGVyKSwgKGdzdF9xdGRlbXV4X2xvb3ApLAorCSAgKHF0ZGVtdXhfcGFyc2VfbW9vdiksIChxdGRlbXV4X3BhcnNlX2NvbnRhaW5lciksCisJICAocXRkZW11eF9wYXJzZV9ub2RlKSwgKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pLAorCSAgKHF0ZGVtdXhfcGFyc2VfdHJhayksIChxdGRlbXV4X2F1ZGlvX2NhcHMpOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICAqIGdzdC9xdGRlbXV4L3F1aWNrdGltZS5jOiAocGx1Z2luX2luaXQpOgorCSAgQWRkIFgtUVQgZGVwYXlsb2FkZXIgdGhhdCB3aWxsIGV2ZW50dWFsbHkgc2hhcmUgY29kZSB3aXRoIHRoZSBkZW11eGVyLgorCSAgTWFrZSBuZXcgcGx1Z2luIGVudHJ5IHBvaW50IHdpdGggcXVpY2t0aW1lIHJlbGVhdGVkIHN0dWZmLgorCisyMDA3LTAxLTEyIDEyOjEwOjE5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvcXRkZW11eC9NYWtlZmlsZS5hbTogRGlzdCBhbGwgbmV3IGZpbGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L01ha2VmaWxlLmFtOgorCSAgRGlzdCBhbGwgbmV3IGZpbGVzLgorCisyMDA3LTAxLTEyIDEwOjI3OjI1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBkb2NzL3BsdWdpbnMvOiBBY3RpdmF0ZSBkb2NzIGZvciBqYWNrLCBzZGwgYW5kIHF0ZGVtdXguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuc2lnbmFsczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF0ZGVtdXgueG1sOgorCSAgQWN0aXZhdGUgZG9jcyBmb3IgamFjaywgc2RsIGFuZCBxdGRlbXV4LgorCisyMDA3LTAxLTEyIDEwOjIyOjE2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC86IENsZWFudXAgYW5kIHJlZmFjdG9yIHRvIG1ha2UgdGhlIGNvZGUgbW9yZSByZWFkYWJsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZXh0cmFjdF9pbml0aWFsX2xlbmd0aF9hbmRfZm91cmNjKSwKKwkgIChnc3RfcXRkZW11eF9sb29wX3N0YXRlX2hlYWRlciksIChnc3RfcXRkZW11eF9jb21iaW5lX2Zsb3dzKSwKKwkgIChnc3RfcXRkZW11eF9sb29wX3N0YXRlX21vdmllKSwgKGdzdF9xdGRlbXV4X2xvb3ApLAorCSAgKGdzdF9xdGRlbXV4X2NoYWluKSwgKHF0ZGVtdXhfc2lua19hY3RpdmF0ZV9wdWxsKSwKKwkgIChxdGRlbXV4X2luZmxhdGUpLCAocXRkZW11eF9wYXJzZV9tb292KSwgKHF0ZGVtdXhfcGFyc2VfY29udGFpbmVyKSwKKwkgIChxdGRlbXV4X3BhcnNlX25vZGUpLCAocXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlKSwKKwkgIChxdGRlbXV4X3RyZWVfZ2V0X3NpYmxpbmdfYnlfdHlwZSksIChnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwKKwkgIChxdGRlbXV4X3BhcnNlX3NhbXBsZXMpLCAocXRkZW11eF9wYXJzZV9zZWdtZW50cyksCisJICAocXRkZW11eF9wYXJzZV90cmFrKSwgKHF0ZGVtdXhfdGFnX2FkZF9zdHIpLCAocXRkZW11eF90YWdfYWRkX251bSksCisJICAocXRkZW11eF90YWdfYWRkX2RhdGUpLCAocXRkZW11eF90YWdfYWRkX2ducmUpLAorCSAgKHF0ZGVtdXhfcGFyc2VfdWR0YSksIChxdGRlbXV4X3JlZGlyZWN0c19zb3J0X2Z1bmMpLAorCSAgKHF0ZGVtdXhfcHJvY2Vzc19yZWRpcmVjdHMpLCAocXRkZW11eF9wYXJzZV9yZWRpcmVjdHMpLAorCSAgKHF0ZGVtdXhfcGFyc2VfdHJlZSksIChnc3RfcXRkZW11eF9oYW5kbGVfZXNkcyksCisJICAocXRkZW11eF92aWRlb19jYXBzKSwgKHF0ZGVtdXhfYXVkaW9fY2Fwcyk6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguaDoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eF9kdW1wLmM6IChxdGRlbXV4X2R1bXBfbXZoZCksCisJICAocXRkZW11eF9kdW1wX3RraGQpLCAocXRkZW11eF9kdW1wX2Vsc3QpLCAocXRkZW11eF9kdW1wX21kaGQpLAorCSAgKHF0ZGVtdXhfZHVtcF9oZGxyKSwgKHF0ZGVtdXhfZHVtcF92bWhkKSwgKHF0ZGVtdXhfZHVtcF9kcmVmKSwKKwkgIChxdGRlbXV4X2R1bXBfc3RzZCksIChxdGRlbXV4X2R1bXBfc3R0cyksIChxdGRlbXV4X2R1bXBfc3RzcyksCisJICAocXRkZW11eF9kdW1wX3N0c2MpLCAocXRkZW11eF9kdW1wX3N0c3opLCAocXRkZW11eF9kdW1wX3N0Y28pLAorCSAgKHF0ZGVtdXhfZHVtcF9jbzY0KSwgKHF0ZGVtdXhfZHVtcF9kY29tKSwgKHF0ZGVtdXhfZHVtcF9jbXZkKSwKKwkgIChxdGRlbXV4X2R1bXBfdW5rbm93biksIChxdGRlbXV4X25vZGVfZHVtcF9mb3JlYWNoKSwKKwkgIChxdGRlbXV4X25vZGVfZHVtcCk6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXhfZHVtcC5oOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4X2ZvdXJjYy5oOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4X3R5cGVzLmM6IChxdGRlbXV4X3R5cGVfZ2V0KToKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eF90eXBlcy5oOgorCSAgKiBnc3QvcXRkZW11eC9xdHBhbGV0dGUuaDoKKwkgIENsZWFudXAgYW5kIHJlZmFjdG9yIHRvIG1ha2UgdGhlIGNvZGUgbW9yZSByZWFkYWJsZS4KKwkgIE1vdmUgZGVidWdnaW5nL3RhYmxlcyBpbnRvIHNlcGFyYXRlIGZpbGVzLgorCSAgQWRkIDIvNC8xNiBjb2xvciBwYWxsZXRlZSBzdXBwb3J0LgorCSAgRml4IHJhdyAxNSBiaXQgUkdCIGhhbmRsaW5nLgorCSAgVXNlIG1vcmUgRk9VUkNDIGNvbnN0YW50cy4KKwkgIEFkZCBzb21lIGRvY3MuCisKKzIwMDctMDEtMTEgMTk6NTE6MDQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOiBNaW5vciBjbGVhbi11cDogdXNlIGVudW0gdmFsdWVzIGluc3RlYWQgb2YgaGFyZGNvZGVkIGNvbnN0YW50cyAoIzM5NTUzNikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlICA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2NvcnJlY3Rpb25fbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2pvaW50X3N0ZXJlb19tb2RlX2dldF90eXBlKToKKwkgIE1pbm9yIGNsZWFuLXVwOiB1c2UgZW51bSB2YWx1ZXMgaW5zdGVhZCBvZiBoYXJkY29kZWQgY29uc3RhbnRzICgjMzk1NTM2KS4KKworMjAwNy0wMS0xMSAxNjo1OTo0MCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0LzogU2V0IGNvcnJlY3QgY2FwcyBvbiBvdXRnb2luZyBwdWxsZWQgYnVmZmVycywgb3IgdGhpbmdzIGJsb3cgdXAgYWZ0ZXIgcmVjZW50IGNvcmUgY2hhbmdlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXBldGFnL2dzdHRhZ2RlbXV4LmM6IChnc3RfdGFnX2RlbXV4X3JlYWRfcmFuZ2UpOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogKGdzdF9pZDNkZW11eF9yZWFkX3JhbmdlKToKKwkgIFNldCBjb3JyZWN0IGNhcHMgb24gb3V0Z29pbmcgcHVsbGVkIGJ1ZmZlcnMsIG9yIHRoaW5ncyBibG93IHVwCisJICBhZnRlciByZWNlbnQgY29yZSBjaGFuZ2VzLgorCisyMDA3LTAxLTExIDExOjA1OjA0ICswMDAwICBKb25hcyBIb2xtYmVyZyA8am9uYXMuaG9sbWJlcmdAYXhpcy5jb20+CisKKwkgIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IFJldHVybiBGTE9XIGVycm9ycyBBU0FQLiBGaXhlcyAjMzk0OTc3LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBCYXNlZCBvbiBwYXRjaCBieTogSm9uYXMgSG9sbWJlcmcgPGpvbmFzIGRvdCBob2xtYmVyZyBhdCBheGlzIGRvdCBjb20+CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IChnc3RfbXVsdGlwYXJ0X211eF9pbml0KSwKKwkgIChnc3RfbXVsdGlwYXJ0X211eF9yZXF1ZXN0X25ld19wYWQpLAorCSAgKGdzdF9tdWx0aXBhcnRfbXV4X3F1ZXVlX3BhZHMpLCAoZ3N0X211bHRpcGFydF9tdXhfY29sbGVjdGVkKSwKKwkgIChnc3RfbXVsdGlwYXJ0X211eF9jaGFuZ2Vfc3RhdGUpOgorCSAgUmV0dXJuIEZMT1cgZXJyb3JzIEFTQVAuIEZpeGVzICMzOTQ5NzcuCisJICBNaXNjIGNsZWFudXBzLgorCisyMDA3LTAxLTExIDA5OjMwOjU5ICswMDAwICBMdXR6IE11ZWxsZXIgPGx1dHpAdG9wZnJvc2UuZGU+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogQ2hlY2sgZm9yIHN0cmVhbSBwYWQgYmVmb3JlIGFjdGl2YXRpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBMdXR6IE11ZWxsZXIgPGx1dHogYXQgdG9wZnJvc2UgZG90IGRlPgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19hY3RpdmF0ZV9zdHJlYW1zKToKKwkgIENoZWNrIGZvciBzdHJlYW0gcGFkIGJlZm9yZSBhY3RpdmF0aW5nLgorCisyMDA3LTAxLTEwIDE1OjE5OjQ4ICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgZ3N0L3J0c3AvOiBBbGxvdyB1cmwgdG8gYmUgTlVMTCB0byBiZSBhYmxlIHRvIHVzZSBpdCBmb3Igc2VydmVyIGNvbm5lY3Rpb25zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUGV0ZXIgS2plbGxlcnN0ZWR0ICA8cGtqIGF0IGF4aXMgY29tPgorCSAgKiBnc3QvcnRzcC9DT1BZSU5HLk1JVDoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWUpLCAoZ3N0X3J0c3BzcmNfY2xlYW51cCksCisJICAoZ3N0X3J0c3BzcmNfYWxsb2NfdWRwX3BvcnRzKSwgKHBhZF91bmJsb2NrZWQpLCAocGFkX2Jsb2NrZWQpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwKKwkgIChnc3RfcnRzcHNyY19hY3RpdmF0ZV9zdHJlYW1zKSwgKGdzdF9ydHNwc3JjX2xvb3BfaW50ZXJsZWF2ZWQpLAorCSAgKGdzdF9ydHNwc3JjX2xvb3BfdWRwKSwgKGdzdF9ydHNwc3JjX3NlbmQpLAorCSAgKGdzdF9ydHNwc3JjX3BhcnNlX21ldGhvZHMpLAorCSAgKGdzdF9ydHNwc3JjX2NyZWF0ZV90cmFuc3BvcnRzX3N0cmluZyksCisJICAoZ3N0X3J0c3BzcmNfcHJlcGFyZV90cmFuc3BvcnRzKSwgKGdzdF9ydHNwc3JjX3NldHVwX3N0cmVhbXMpLAorCSAgKGdzdF9ydHNwc3JjX29wZW4pLCAoZ3N0X3J0c3BzcmNfY2xvc2UpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fY3JlYXRlKSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fY29ubmVjdCksIChydHNwX2Nvbm5lY3Rpb25fc2VuZCksIChyZWFkX2xpbmUpLAorCSAgKHBhcnNlX3JlcXVlc3RfbGluZSksIChwYXJzZV9saW5lKSwgKHJ0c3BfY29ubmVjdGlvbl9yZWFkKSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fY2xvc2UpOgorCSAgKiBnc3QvcnRzcC9ydHNwZGVmcy5jOiAocnRzcF9pbml0X3N0YXR1cyksIChydHNwX3N0cnJlc3VsdCksCisJICAocnRzcF9tZXRob2RfYXNfdGV4dCksIChydHNwX2hlYWRlcl9hc190ZXh0KSwKKwkgIChydHNwX3N0YXR1c19hc190ZXh0KSwgKHJ0c3BfZmluZF9oZWFkZXJfZmllbGQpLAorCSAgKHJ0c3BfZmluZF9tZXRob2QpOgorCSAgKiBnc3QvcnRzcC9ydHNwZGVmcy5oOgorCSAgKiBnc3QvcnRzcC9ydHNwZXh0d21zLmM6IChydHNwX2V4dF93bXNfYWZ0ZXJfc2VuZCksCisJICAocnRzcF9leHRfd21zX2NvbmZpZ3VyZV9zdHJlYW0pOgorCSAgKiBnc3QvcnRzcC9ydHNwbWVzc2FnZS5jOiAocnRzcF9tZXNzYWdlX25ldyksIChydHNwX21lc3NhZ2VfaW5pdCksCisJICAocnRzcF9tZXNzYWdlX25ld19yZXF1ZXN0KSwgKHJ0c3BfbWVzc2FnZV9pbml0X3JlcXVlc3QpLAorCSAgKHJ0c3BfbWVzc2FnZV9uZXdfcmVzcG9uc2UpLCAocnRzcF9tZXNzYWdlX2luaXRfcmVzcG9uc2UpLAorCSAgKHJ0c3BfbWVzc2FnZV9pbml0X2RhdGEpLCAocnRzcF9tZXNzYWdlX3Vuc2V0KSwKKwkgIChydHNwX21lc3NhZ2VfZnJlZSksIChydHNwX21lc3NhZ2VfYWRkX2hlYWRlciksCisJICAocnRzcF9tZXNzYWdlX2dldF9oZWFkZXIpLCAocnRzcF9tZXNzYWdlX3NldF9ib2R5KSwKKwkgIChydHNwX21lc3NhZ2VfZ2V0X2JvZHkpLCAoZHVtcF9tZW0pLCAocnRzcF9tZXNzYWdlX2R1bXApOgorCSAgKiBnc3QvcnRzcC9ydHNwbWVzc2FnZS5oOgorCSAgKiBnc3QvcnRzcC9zZHBtZXNzYWdlLmM6IChzZHBfbWVzc2FnZV9nZXRfYXR0cmlidXRlX3ZhbF9uKSwKKwkgIChzZHBfbWVkaWFfZ2V0X2F0dHJpYnV0ZV92YWxfbiksIChyZWFkX3N0cmluZyksIChyZWFkX3N0cmluZ19kZWwpLAorCSAgKHNkcF9wYXJzZV9saW5lKSwgKHNkcF9tZXNzYWdlX3BhcnNlX2J1ZmZlciksIChwcmludF9tZWRpYSksCisJICAoc2RwX21lc3NhZ2VfZHVtcCk6CisJICBBbGxvdyB1cmwgdG8gYmUgTlVMTCB0byBiZSBhYmxlIHRvIHVzZSBpdCBmb3Igc2VydmVyIGNvbm5lY3Rpb25zLgorCSAgQ2FuIG5vdyBzZW5kIHJlc3BvbnNlcyBhcyB3ZWxsIGFzIHJlcXVlc3RzLgorCSAgTm8gbG9uZ2VyIGhhbmdzIGluIGFuIGVuZGxlc3MgbG9vcCBpZiBFT0YgaXMgcmVjZWl2ZWQuCisJICBDYW4gbm93IGNvbnZlcnQgYSBzdGF0dXMgY29kZSB0byBhIHRleHQgc3RyaW5nLgorCSAgUmV0dXJuIFJUU1BfSERSX0lOVkFMSUQgZm9yIHVua25vd24gaGVhZGVycy4KKwkgIFJldHVybiBSVFNQX0lOVkFMSUQgZm9yIHVua25vd24gbWV0aG9kcy4KKwkgIENvcHkgQ1NlcSBhbmQgU2Vzc2lvbiBoZWFkZXJzIGZyb20gdGhlIHJlcXVlc3QuCisJICBPbmx5IGZyZWUgbWVtb3J5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnRseSBzZXQgbWVzc2FnZSB0eXBlLgorCSAgQWRkZWQgY29uc3QgdG8gZnVuY3Rpb24gYXJndW1lbnRzIGFzIGFwcHJvcHJpYXRlLgorCSAgQXZvaWQgYSBjb21waWxlciB3YXJuaW5nIHdoZW4gaW5pdGlhbGl6aW5nIG5tZWRpYS4KKwkgIFVzZSBndWludCByYXRoZXIgdGhhbiBnaW50IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgorCSAgRml4IGNyYXNoZXIgaW4gd21zIGV4dGVuc2lvbi4KKwkgIEZhY3RvciBvdXQgc3RyZWFtIHNldHVwIGZyb20gb3Blbl9jb25uZWN0aW9uLgorCSAgRGVsYXkgYWN0aXZhdGlvbiBvZiBzdHJlYW1zIHdoZW4gYWN0dWFsIGRhdGEgaXMgcmVjZWl2ZWQgZnJvbSB0aGUKKwkgIHNlcnZlciwgdGhpcyBwcmVwYXJlcyB1cyB0byBkbyBwcm9wZXIgcHJvdG9jb2wgc3dpdGNoaW5nLgorCSAgQWRkZWQgbmV3IGxpY2Vuc2UuCisJICBGaXhlcyAjMzgwODk1LgorCisyMDA3LTAxLTEwIDA5OjQ3OjQzICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIFNvbWUgc21hbGwgZG9jcyBmaXhlcyAoIzM5NDg1MSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tbyB1YnVudHUgY29tPgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWEuYzoKKwkgIFNvbWUgc21hbGwgZG9jcyBmaXhlcyAoIzM5NDg1MSkuCisKKzIwMDctMDEtMDkgMTI6MjU6MjYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogRml4IGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgRml4IGRvY3MuCisKKzIwMDctMDEtMDkgMTI6MjM6NDggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBBZGRlZCBSRkMgMjI1MCBNUEVHIFZpZGVvIERlcGF5bG9hZGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHAvZ3N0cnRwLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYzogKGdzdF9ydHBfbXB2X2RlcGF5X2Jhc2VfaW5pdCksCisJICAoZ3N0X3J0cF9tcHZfZGVwYXlfY2xhc3NfaW5pdCksIChnc3RfcnRwX21wdl9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX21wdl9kZXBheV9zZXRjYXBzKSwgKGdzdF9ydHBfbXB2X2RlcGF5X3Byb2Nlc3MpLAorCSAgKGdzdF9ydHBfbXB2X2RlcGF5X3NldF9wcm9wZXJ0eSksIChnc3RfcnRwX21wdl9kZXBheV9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfbXB2X2RlcGF5X2NoYW5nZV9zdGF0ZSksIChnc3RfcnRwX21wdl9kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuaDoKKwkgIEFkZGVkIFJGQyAyMjUwIE1QRUcgVmlkZW8gRGVwYXlsb2FkZXIuCisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6IChnc3RfcnRwX2gyNjNwX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfaDI2M3BfZGVwYXlfcHJvY2Vzcyk6CisJICBGaXggSGVhZGVyIGZpbGUuIFNtYWxsIGNsZWFudXBzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jOiAoZ3N0X3J0cF9tcDRnX2RlcGF5X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfbXA0Z19kZXBheV9pbml0KSwgKGdzdF9ydHBfbXA0Z19kZXBheV9maW5hbGl6ZSksCisJICAoZ3N0X3J0cF9tcDRnX2RlcGF5X3Byb2Nlc3MpLCAoZ3N0X3J0cF9tcDRnX2RlcGF5X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6IChnc3RfcnRwX21wNHZfZGVwYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9tcDR2X2RlcGF5X2luaXQpLCAoZ3N0X3J0cF9tcDR2X2RlcGF5X2ZpbmFsaXplKSwKKwkgIChnc3RfcnRwX21wNHZfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX21wNHZfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF9tcDR2X2RlcGF5X2NoYW5nZV9zdGF0ZSk6CisJICBSZW1vdmUgdXN1c2VkIGNvZGUuIFJlbW92ZSBBZGFwdGVyIGZyb20gc3RhdGUgQ2hhbmdlLiBBZGRlZCBkZWJ1Zy4KKwkgICogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOiAoZ3N0X3J0cF9tcGFfZGVwYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX21wYV9kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfbXBhX2RlcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfbXBhX2RlcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9tcGFfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuaDoKKwkgIFN1YmNsYXNzIGJhc2UgZGVwYXlsb2FkZXIuCisJICBBZGRlZCBkZWJ1Zy4KKwkgIFN1cHBvcnQgc3RhdGljIHBheWxvYWQgdHlwZSBhc3NpZ25tZW50IGFzIHdlbGwuCisJICAqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJICBGaXggY2Fwcy4KKworMjAwNy0wMS0wOCAxMjo0NToxMCArMDAwMCAgVmluY2VudCBUb3JyaSA8dnRvcnJpQHVuaXYtZXZyeS5mcj4KKworCSAgZXh0L2pwZWcvOiBUaGVzZSBsaWJqcGVnIGNhbGxiYWNrcyBzaG91bGQgcmV0dXJuIGEgJ2Jvb2xlYW4nICh1bnNpZ25lZCBjaGFyIGFwcGFyZW50bHkpIGFuZCBub3QgYSAnZ2Jvb2xlYW4nICh3aGljaCBtLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBWaW5jZW50IFRvcnJpICA8dnRvcnJpIGF0IHVuaXYtZXZyeSBmcj4KKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6CisJICAqIGV4dC9qcGVnL3Ntb2tlY29kZWMuYzoKKwkgIFRoZXNlIGxpYmpwZWcgY2FsbGJhY2tzIHNob3VsZCByZXR1cm4gYSAnYm9vbGVhbicgKHVuc2lnbmVkIGNoYXIKKwkgIGFwcGFyZW50bHkpIGFuZCBub3QgYSAnZ2Jvb2xlYW4nICh3aGljaCBtYXBzIHRvIGdpbnQpLiBGaXhlcworCSAgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCBNaW5nVyAoIzM5MzQyNykuCisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fcmVhZCk6CisJICBVc2UgaW9jdGxzb2NrZXQgb24gd2luMzIuCisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2NyZWF0ZSk6CisJICBTb21lIHByaW50ZiBmb3JtYXQgZml4ZXMgZm9yIHdpbjMyLgorCisyMDA3LTAxLTA3IDIyOjAzOjU0ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIE5ldyBlbGVtZW50cyBpbnRlcmxlYXZlIGFuZCBkZWludGVybGVhdmUsIGltcGxlbWVudCBjaGFubmVsIGludGVybGVhdmluZyBhbmQgZGVpbnRlcmxlYXZpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDctMDEtMDcgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L2ludGVybGVhdmUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9pbnRlcmxlYXZlL3BsdWdpbi5oOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9wbHVnaW4uYzoKKwkgICogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzogTmV3IGVsZW1lbnRzIGludGVybGVhdmUgYW5kCisJICBkZWludGVybGVhdmUsIGltcGxlbWVudCBjaGFubmVsIGludGVybGVhdmluZyBhbmQgZGVpbnRlcmxlYXZpbmcuCisJICBUaGUgaW50ZXJsZWF2ZXIgY2FuIG9wZXJhdGUgaW4gcHVsbCBvciBwdXNoIG1vZGUgYnV0IHRoZQorCSAgZGVpbnRlcmxlYXZlciBpcyBtb3JlIGxpa2UgYSBkZW11eGVyIGFuZCBjYW4gb25seSBvcGVyYXRlIGluIHB1c2gKKwkgIG1vZGUuCisKKzIwMDctMDEtMDcgMTA6NDQ6MTIgKzAwMDAgIFPDqWJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4KKworCSAgZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzogVXNlIGdzdF9ndWludDY0X3RvX2dkb3VibGUgZm9yIGNvbnZlcnNpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzogKGdzdF9jdXR0ZXJfY2hhaW4pOgorCSAgVXNlIGdzdF9ndWludDY0X3RvX2dkb3VibGUgZm9yIGNvbnZlcnNpb24uCisJICAqIHdpbjMyL3ZzNi9saWJnc3RtYXRyb3NrYS5kc3A6CisJICBBZGQgemxpYiB0byB0aGUgbGluay4KKwkgICogd2luMzIvdnM2L2xpYmdzdHZpZGVvYm94LmRzcDoKKwkgIFVwZGF0ZSBsaWJvaWwgbGlicmFyeSBuYW1lIChwcm9qZWN0IGlzIGxpbmtlZCB0byBsaWJvaWwtMC4zLTAubGliIG5vdykuCisKKzIwMDctMDEtMDUgMTg6MzI6MDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIENoZWNrIGZvciB6bGliIGFuZCBpZiBhdmFpbGFibGUgcGFzcyBpdCBleHBsaWNpdGx5IHRvIHRoZSBsaW5rZXIgd2hlbiBsaW5raW5nIHF0ZGVtdXguIElmIG5vdCBhdmFpbGFibGUgKG9yIC0tZGlzYWJsZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L3F0ZGVtdXgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfbW9vdik6CisJICBDaGVjayBmb3IgemxpYiBhbmQgaWYgYXZhaWxhYmxlIHBhc3MgaXQgZXhwbGljaXRseSB0byB0aGUgbGlua2VyCisJICB3aGVuIGxpbmtpbmcgcXRkZW11eC4gSWYgbm90IGF2YWlsYWJsZSAob3IgLS1kaXNhYmxlLWV4dGVybmFsIGhhcworCSAgYmVlbiBzcGVjaWZpZWQhKSwgZGlzYWJsZSB0aGUgYml0cyBpbiBxdGRlbXV4IHRoYXQgdXNlIGl0LiBGaXhlcworCSAgYnVpbGQgb24gTWluZ1cgKCMzOTI4NTYpLgorCisyMDA3LTAxLTA1IDE3OjIzOjA0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvTWFrZWZpbGUuYW06IElmIHpsaWIgaXMgYXZhaWxhYmxlIGFuZCB1c2VkLCB3ZSBtdXN0IGxpbmsgaXQgZXhwbGljaXRseSBmb3IgdGhpbmdzIHRvIHdvcmsgb24gTWluZ1cgKGZpeGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvTWFrZWZpbGUuYW06CisJICBJZiB6bGliIGlzIGF2YWlsYWJsZSBhbmQgdXNlZCwgd2UgbXVzdCBsaW5rIGl0IGV4cGxpY2l0bHkgZm9yCisJICB0aGluZ3MgdG8gd29yayBvbiBNaW5nVyAoZml4ZXMgIzM5Mjg1NSkuCisKKzIwMDctMDEtMDUgMTY6MDc6MTIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6IENhbGwgZ190aHJlYWRfaW5pdCgpIHJpZ2h0IGF0IHRoZSBiZWdpbm5pbmcuIFJlbW92ZSBzdXBlcmZsdW91cyBnc3RfaW5pdCgpIC0gd2UndmUgYWxyZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmM6IChtYWluKToKKwkgIENhbGwgZ190aHJlYWRfaW5pdCgpIHJpZ2h0IGF0IHRoZSBiZWdpbm5pbmcuIFJlbW92ZSBzdXBlcmZsdW91cworCSAgZ3N0X2luaXQoKSAtIHdlJ3ZlIGFscmVhZHkgYmVlbiBpbml0ZWQgdmlhIHRoZSBHT3B0aW9uIHN0dWZmLgorCisyMDA3LTAxLTA0IDExOjAyOjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZXNkL2VzZHNpbmsuYzogRG9uJ3QgcmV0dXJuIGJvZ3VzIHZhbHVlcyB3aGVuIGVzZF9nZXRfZGVsYXkoKSBmYWlscyBmb3Igc29tZSByZWFzb24gKCMzOTIxODkpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfZGVsYXkpOgorCSAgRG9uJ3QgcmV0dXJuIGJvZ3VzIHZhbHVlcyB3aGVuIGVzZF9nZXRfZGVsYXkoKSBmYWlscyBmb3Igc29tZQorCSAgcmVhc29uICgjMzkyMTg5KS4KKworMjAwNy0wMS0wNCAwOTo0NDo1NyArMDAwMCAgVmluY2VudCBUb3JyaSA8dnRvcnJpQHVuaXYtZXZyeS5mcj4KKworCSAgQWRkIGRpcmVjdHNvdW5kc2luayB0byBidWlsZCBhbmQgZGlzdCBpdCwgc28gaXQgZ2V0cyBidWlsdCB3aGVuIGNvbXBpbGluZyB3aXRoIE1pbmdXIG9uIHdpbjMyIGFuZCB0aGUgcmVxdWlyZWQgaGVhZGVyLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBWaW5jZW50IFRvcnJpICA8dnRvcnJpIGF0IHVuaXYtZXZyeSBmcj4KKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBzeXMvTWFrZWZpbGUuYW06CisJICAqIHN5cy9kaXJlY3Rzb3VuZC9NYWtlZmlsZS5hbToKKwkgICogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgKGdzdF9kaXJlY3Rzb3VuZHNpbmtfcmVzZXQpOgorCSAgQWRkIGRpcmVjdHNvdW5kc2luayB0byBidWlsZCBhbmQgZGlzdCBpdCwgc28gaXQgZ2V0cyBidWlsdCB3aGVuCisJICBjb21waWxpbmcgd2l0aCBNaW5nVyBvbiB3aW4zMiBhbmQgdGhlIHJlcXVpcmVkIGhlYWRlcnMgYW5kIGxpYnJhcmllcworCSAgYXJlIGF2YWlsYWJsZSAoZml4ZXM6ICMzOTI2MzgpLiBBbHNvIHNpbXBsaWZ5IERpcmVjdERyYXcgY2hlY2sgYSBiaXQuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5jdnNpZ25vcmU6CisJICBGaXggQ1ZTIGlnbm9yZSBmb3IgbmVvbmh0dHBzcmMgdGVzdCBiaW5hcnkuCisKKzIwMDctMDEtMDMgMTk6NTQ6MzMgKzAwMDAgIFZpbmNlbnQgVG9ycmkgPHZ0b3JyaUB1bml2LWV2cnkuZnI+CisKKwkgIEFkZCBkaXJlY3RkcmF3c2luayB0byBidWlsZCBhbmQgZGlzdCBpdCwgc28gaXQgZ2V0cyBidWlsdCB3aGVuIGNvbXBpbGluZyB3aXRoIE1pbmdXIG9uIHdpbjMyIGFuZCB0aGUgcmVxdWlyZWQgaGVhZGVycy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVmluY2VudCBUb3JyaSAgPHZ0b3JyaSBhdCB1bml2LWV2cnkgZnI+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogc3lzL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9NYWtlZmlsZS5hbToKKwkgIEFkZCBkaXJlY3RkcmF3c2luayB0byBidWlsZCBhbmQgZGlzdCBpdCwgc28gaXQgZ2V0cyBidWlsdCB3aGVuCisJICBjb21waWxpbmcgd2l0aCBNaW5nVyBvbiB3aW4zMiBhbmQgdGhlIHJlcXVpcmVkIGhlYWRlcnMgYW5kIGxpYnJhcmllcworCSAgYXJlIGF2YWlsYWJsZSAoZml4ZXM6ICMzOTIzMTMpLgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jOgorCSAgKGdzdF9kaXJlY3RkcmF3c2lua19jZW50ZXJfcmVjdCksIChnc3RfZGlyZWN0ZHJhd3Npbmtfc2hvd19mcmFtZSksCisJICAoZ3N0X2RpcmVjdGRyYXdzaW5rX3NldHVwX2RkcmF3KSwKKwkgIChnc3RfZGlyZWN0ZHJhd3Npbmtfc3VyZmFjZV9jcmVhdGUpOgorCSAgQ29tbWVudCBvdXQgc29tZSB1bnVzZWQgdGhpbmdzIGFuZCBmaXggc29tZSBwcmludGYgZm9ybWF0IGlzc3VlcyBpbgorCSAgb3JkZXIgdG8gYXZvaWQgd2FybmluZ3Mgd2hlbiBidWlsZGxpbmcgd2l0aCBNaW5nVyAoIzM5MjMxMykuCisKKzIwMDctMDEtMDMgMTY6NDE6MTAgKzAwMDAgIEplbnMgR3JhbnNldWVyIDxqZW5zZ3JAZ214Lm5ldD4KKworCSAgRml4IGJ1aWxkIHdpdGggZ2NjLTIueCAoZGVjbGFyZSB2YXJpYWJsZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGJsb2NrIGV0Yy4pLiBGaXhlcyAjMzkxOTcxLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSmVucyBHcmFuc2V1ZXIgIDxqZW5zZ3IgYXQgZ214IG5ldD4KKwkgICogZXh0L3h2aWQvZ3N0eHZpZGVuYy5jOiAoZ3N0X3h2aWRlbmNfZW5jb2RlKSwKKwkgIChnc3RfeHZpZGVuY19nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzogKGJwd3NpbmNfdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L2ZpbHRlci9nc3RmaWx0ZXIuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2ZpbHRlci9nc3RpaXIuYzogKGlpcl90cmFuc2Zvcm1faXApOgorCSAgKiBnc3QvZmlsdGVyL2dzdGxwd3NpbmMuYzogKGxwd3NpbmNfdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L21vZHBsdWcvZ3N0bW9kcGx1Zy5jYzoKKwkgICogZ3N0L251dmRlbXV4L2dzdG51dmRlbXV4LmM6IChnc3RfbnV2X2RlbXV4X2hlYWRlcl9sb2FkKSwKKwkgIChnc3RfbnV2X2RlbXV4X3N0cmVhbV9leHRlbmRfaGVhZGVyKToKKwkgIEZpeCBidWlsZCB3aXRoIGdjYy0yLnggKGRlY2xhcmUgdmFyaWFibGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYQorCSAgYmxvY2sgZXRjLikuIEZpeGVzICMzOTE5NzEuCisKKzIwMDYtMTItMzAgMTI6NDQ6MDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOiBXaGVuIHdlIGNhbid0IGNyZWF0ZSBhbiBlbGVtZW50IG5lZWRlZCBmb3IgdGhlIHRlc3QsIHByaW50IGEgbWVzc2FnZSBkZXRhaWxpbmcgd2hpYy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvY3JvcC5jOiAoR1NUX1NUQVJUX1RFU1QpLAorCSAgKHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nX2luaXRfY29udGV4dCk6CisJICBXaGVuIHdlIGNhbid0IGNyZWF0ZSBhbiBlbGVtZW50IG5lZWRlZCBmb3IgdGhlIHRlc3QsIHByaW50IGEgbWVzc2FnZQorCSAgZGV0YWlsaW5nIHdoaWNoIGVsZW1lbnQgaXQgYWN0dWFsbHkgaXMgdGhhdCdzIG1pc3NpbmcgKCMzOTA2NzMpLgorCisyMDA2LTEyLTI0IDExOjM2OjMxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiBGaXggcHJlc3VtYWJseSBjb3B5J24ncGFzdG8gZm9yIDE2YnBwIGRlcHRoLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6IChjb21wb3NpdGVfcGl4ZWwpOgorCSAgRml4IHByZXN1bWFibHkgY29weSduJ3Bhc3RvIGZvciAxNmJwcCBkZXB0aC4KKworMjAwNi0xMi0yNCAxMToyNDo1OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBUaGUgInNpZ25lZCIgZmllbGQgaW4gYXVkaW8gY2FwcyBpcyBvZiBib29sZWFuIHR5cGUsIHRyeWluZyB0byB1c2UgZ3N0X3N0cnVjdHVyZV9nZXRfaW50Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX3NldGNhcHMpOgorCSAgVGhlICJzaWduZWQiIGZpZWxkIGluIGF1ZGlvIGNhcHMgaXMgb2YgYm9vbGVhbiB0eXBlLCB0cnlpbmcgdG8gdXNlCisJICBnc3Rfc3RydWN0dXJlX2dldF9pbnQoKSB0byBleHRyYWN0IGl0IHdpbGwgZmFpbC4gRml4aW5nIHRoaXMgbWFrZXMKKwkgIG1hdHJvc2thbXV4IGFjY2VwdCByYXcgYXVkaW8gaW5wdXQgKCMzODcxMjEpICh1c2UgYXQgeW91ciBvd24gcmlzaworCSAgdGhvdWdoLCBkdWUgdG8gdGhlIG1hdHJvc2thIHNwZWMgYmVpbmcgbm90IGVudGlyZWx5IHVzZWZ1bCBpbiB0aGlzCisJICByZXNwZWN0KS4KKwkgIEFsc28gZml4IHVwIHJhdyBhdWRpbyBzdHJ1Y3R1cmVzIGluIHRlbXBsYXRlIGNhcHMgc28gdGhhdCB0aGV5CisJICByZXByZXNlbnQgd2hhdCBvdXIgc2V0Y2FwcyBmdW5jdGlvbiB3aWxsIGFjdHVhbGx5IGFjY2VwdCwgc28gdGhhdAorCSAgY29udmVydGVycyBrbm93IHdoYXQgdG8gY29udmVydCB0by4KKwkgIEZpbmFsbHksIGRvbid0IGZhaWwgaWYgdGhlcmUgaXNuJ3QgYW4gImVuZGlhbm5lc3MiIGZpZWxkIGluIDgtYml0CisJICBQQ00gY2Fwcy4KKworMjAwNi0xMi0yMiAxMDoxNToyNCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy86IHJlYXBwbHkgY29uc2lzdGVudCBwYWQgKGRlKWFjdGl2YXRpb24KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tcGVnMmVuYy5jOiAoc2V0dXBfbXBlZzJlbmMpLAorCSAgKGNsZWFudXBfbXBlZzJlbmMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6IChjbGVhbnVwX3JnYW5hbHlzaXMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZGVjLmM6IChzZXR1cF93YXZwYWNrZGVjKSwKKwkgIChjbGVhbnVwX3dhdnBhY2tkZWMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZW5jLmM6IChzZXR1cF93YXZwYWNrZW5jKSwKKwkgIChjbGVhbnVwX3dhdnBhY2tlbmMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy95NG1lbmMuYzogKHNldHVwX3k0bWVuYyksIChjbGVhbnVwX3k0bWVuYyk6CisJICByZWFwcGx5IGNvbnNpc3RlbnQgcGFkIChkZSlhY3RpdmF0aW9uCisKKzIwMDYtMTItMjIgMTA6MTU6MjMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvOiByZWFwcGx5IGNvbnNpc3RlbnQgcGFkIChkZSlhY3RpdmF0aW9uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9wYW5vcmFtYS5jOiAoY2xlYW51cF9wYW5vcmFtYSk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOiAoc2V0dXBfYXZpbXV4KSwgKGNsZWFudXBfYXZpbXV4KToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGRlYy5jOiAoc2V0dXBfY21tbGRlYyksCisJICAodGVhcmRvd25fY21tbGRlYyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxlbmMuYzogKHNldHVwX2NtbWxlbmMpLAorCSAgKHRlYXJkb3duX2NtbWxlbmMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOiAoc2V0dXBfbGV2ZWwpLCAoY2xlYW51cF9sZXZlbCk6CisJICByZWFwcGx5IGNvbnNpc3RlbnQgcGFkIChkZSlhY3RpdmF0aW9uCisKKzIwMDYtMTItMjEgMTc6MDM6MzkgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBjb25maWd1cmUuYWM6IEJhY2sgdG8gQ1ZTCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBDVlMKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSAgQWRkIDAuMTAuNSBkb2FwIGVudHJ5CisKKz09PSByZWxlYXNlIDAuMTAuNCA9PT0KKworMjAwNi0xMi0yMSAxNTo0NTowMiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogcmVsZWFzaW5nIDAuMTAuNCwgIkJsYWNrIEJ1Z3MiCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgID09PSByZWxlYXNlIDAuMTAuNCA9PT0KKwkgIDIwMDYtMTItMjEgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCSAgKiBjb25maWd1cmUuYWM6CisJICByZWxlYXNpbmcgMC4xMC40LCAiQmxhY2sgQnVncyIKKworPT09IHJlbGVhc2UgMC4xMC41ID09PQorCisyMDA2LTEyLTIxIDE1OjQwOjU1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgY29uZmlndXJlLmFjOiByZWxlYXNpbmcgMC4xMC41LCAiVGhlIFBhdGggb2YgVGhvcm5zIgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICA9PT0gcmVsZWFzZSAwLjEwLjUgPT09CisJICAyMDA2LTEyLTIxICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKwkgICogY29uZmlndXJlLmFjOgorCSAgcmVsZWFzaW5nIDAuMTAuNSwgIlRoZSBQYXRoIG9mIFRob3JucyIKKworMjAwNi0xMi0yMSAxNDowMzo0MiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9tcGVnMmVuYy5jOiAoc2V0dXBfbXBlZzJlbmMpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvbXBlZzJlbmMuYzogKHNldHVwX21wZWcyZW5jKQorCSAgKGNsZWFudXBfbXBlZzJlbmMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmM6IChjbGVhbnVwX3JnYW5hbHlzaXMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZGVjLmM6IChzZXR1cF93YXZwYWNrZGVjKSwKKwkgIChjbGVhbnVwX3dhdnBhY2tkZWMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZW5jLmM6IChzZXR1cF93YXZwYWNrZW5jKSwKKwkgIChjbGVhbnVwX3dhdnBhY2tlbmMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy95NG1lbmMuYzogKHNldHVwX3k0bWVuYyksIChjbGVhbnVwX3k0bWVuYyk6CisJICByZXZlcnQgbXkgZnJlZXplIGJyZWFrYWdlCisKKzIwMDYtMTItMjEgMTI6NDg6MzIgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvOiByZXZlcnQgbXkgZnJlZXplIGJyZWFrYWdlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9wYW5vcmFtYS5jOiAoY2xlYW51cF9wYW5vcmFtYSk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jOiAoc2V0dXBfYXZpbXV4KSwgKGNsZWFudXBfYXZpbXV4KToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGRlYy5jOiAoc2V0dXBfY21tbGRlYyksCisJICAodGVhcmRvd25fY21tbGRlYyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxlbmMuYzogKHNldHVwX2NtbWxlbmMpLAorCSAgKHRlYXJkb3duX2NtbWxlbmMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOiAoc2V0dXBfbGV2ZWwpLCAoY2xlYW51cF9sZXZlbCk6CisJICByZXZlcnQgbXkgZnJlZXplIGJyZWFrYWdlCisKKzIwMDYtMTItMjEgMDg6MjA6MTAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvOiBjb25zaXN0ZW50IHBhZCAoZGUpYWN0aXZhdGlvbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL21wZWcyZW5jLmM6IChzZXR1cF9tcGVnMmVuYyksCisJICAoY2xlYW51cF9tcGVnMmVuYyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3JnYW5hbHlzaXMuYzogKGNsZWFudXBfcmdhbmFseXNpcyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tkZWMuYzogKHNldHVwX3dhdnBhY2tkZWMpLAorCSAgKGNsZWFudXBfd2F2cGFja2RlYyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tlbmMuYzogKHNldHVwX3dhdnBhY2tlbmMpLAorCSAgKGNsZWFudXBfd2F2cGFja2VuYyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3k0bWVuYy5jOiAoc2V0dXBfeTRtZW5jKSwgKGNsZWFudXBfeTRtZW5jKToKKwkgIGNvbnNpc3RlbnQgcGFkIChkZSlhY3RpdmF0aW9uCisKKzIwMDYtMTItMjEgMDg6MTU6MjMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvOiBjb25zaXN0ZW50IHBhZCAoZGUpYWN0aXZhdGlvbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvcGFub3JhbWEuYzogKGNsZWFudXBfcGFub3JhbWEpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdmltdXguYzogKHNldHVwX2F2aW11eCksIChjbGVhbnVwX2F2aW11eCk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxkZWMuYzogKHNldHVwX2NtbWxkZWMpLAorCSAgKHRlYXJkb3duX2NtbWxkZWMpOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZW5jLmM6IChzZXR1cF9jbW1sZW5jKSwKKwkgICh0ZWFyZG93bl9jbW1sZW5jKToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzogKHNldHVwX2xldmVsKSwgKGNsZWFudXBfbGV2ZWwpOgorCSAgY29uc2lzdGVudCBwYWQgKGRlKWFjdGl2YXRpb24KKworMjAwNi0xMi0xOCAxNzoxMTo0OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBEb24ndCBwb3N0IEJVRkZFUklORyBtZXNzYWdlcyBpbiBzdHJlYW1pbmcgbW9kZSBpZiB0aGUgc3RyZWFtIGhlYWRlcnMgYXJlIGJlaGluZCB0aGUgbW92aWUgZGF0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfcG9zdF9wcm9ncmVzcyksCisJICAoZ3N0X3F0ZGVtdXhfY2hhaW4pOgorCSAgRG9uJ3QgcG9zdCBCVUZGRVJJTkcgbWVzc2FnZXMgaW4gc3RyZWFtaW5nIG1vZGUgaWYgdGhlIHN0cmVhbQorCSAgaGVhZGVycyBhcmUgYmVoaW5kIHRoZSBtb3ZpZSBkYXRhOyBpbnN0ZWFkLCBwb3N0ICJwcm9ncmVzcyIgZWxlbWVudAorCSAgbWVzc2FnZXMgYXMgYSB0ZW1wb3Jhcnkgc29sdXRpb24uIEFwcHMgbWlnaHQgZ2V0IGNvbmZ1c2VkIGFuZCBkbworCSAgc2lsbHkgdGhpbmdzIHRvIHRoZSBwaXBlbGluZSBzdGF0ZSBpZiB0aGV5IHNlZSBidWZmZXJpbmcgbWVzc2FnZXMKKwkgIGZyb20gZGlmZmVyZW50IHNvdXJjZXMgYW5kIGRvbid0IHJlYWxpemUgdGhleSBjb21lIGZyb20gZGlmZmVyZW50CisJICBzb3VyY2VzICgjMzg3MTYwKS4KKworMjAwNi0xMi0xOCAxNjo0NjoxNyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIERpc2FibGUgTEFEUFNBLCBhcyBpdCBoYXMgbW92ZWQgdG8gdGhlIC1iYWQgbW9kdWxlIGZvciB0aGUgZHVyYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBleHQvTWFrZWZpbGUuYW06CisJICBEaXNhYmxlIExBRFBTQSwgYXMgaXQgaGFzIG1vdmVkIHRvIHRoZSAtYmFkIG1vZHVsZSBmb3IgdGhlIGR1cmF0aW9uLgorCisyMDA2LTEyLTE4IDE1OjUxOjU0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5jOiBSZXNldCBmbG93X3N0YXRlIGJhY2sgdG8gX09LIGFmdGVyIGEgZmx1c2ggc3RvcCBzbyB0aGF0IHdlIGV4aXQgb3VyIGVycm9yIHN0YXRlIGFmdGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5jOiAoZ3N0X3NpZ25hbF9wcm9jZXNzb3Jfc2V0Y2FwcyksCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfZXZlbnQpOgorCSAgUmVzZXQgZmxvd19zdGF0ZSBiYWNrIHRvIF9PSyBhZnRlciBhIGZsdXNoIHN0b3Agc28gdGhhdCB3ZSBleGl0IG91cgorCSAgZXJyb3Igc3RhdGUgYWZ0ZXIgdGhlIGZsdXNoLiBGaXhlcyAjMzc0MjEzCisKKzIwMDYtMTItMTggMTU6NDk6MDggKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBDaGFuZ2VMb2cgc3VyZ2VyeSBvbiBvbmUgb2YgU3RlZmFuJ3MgY29tbWl0cyBmcm9tIEF1Z3VzdDoKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQ2hhbmdlTG9nIHN1cmdlcnkgb24gb25lIG9mIFN0ZWZhbidzIGNvbW1pdHMgZnJvbSBBdWd1c3Q6CisJICAqIGV4dC9NYWtlZmlsZS5hbToKKwkgIFF1aWV0bHkgKGFjY2lkZW50YWxseSkgZW5hYmxlIExBRFNQQSBmb3IgYnVpbGRpbmcgYnkgZGVmYXVsdCwKKwkgIGRlc3BpdGUgdGhlIGZhY3QgdGhhdCBpdCBkb2Vzbid0IG1lZXQgdGhlIHBsdWdpbiBjaGVja2xpc3QuCisJICAtLSBBZGRlZCBieSBKYW4gU2NobWlkdCAxOCBEZWMgMjAwNgorCisyMDA2LTEyLTE4IDEzOjQwOjM0ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBEb24ndCBvdXRwdXQgZ193YXJuaW5nIGZvciBhbiB1bnN1cHBvcnRlZCBmb3JtYXQsIGp1c3Qgc2VuZCBhCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfY2hhaW4pLAorCSAgKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pOgorCSAgRG9uJ3Qgb3V0cHV0IGdfd2FybmluZyBmb3IgYW4gdW5zdXBwb3J0ZWQgZm9ybWF0LCBqdXN0IHNlbmQgYQorCSAgR1NUX0VMRU1FTlRfV0FSTklORyBhbmQgZG9uJ3QgYWRkIHRoZSBwYWQuCisJICBGaXggdGhlIGNhc2Ugd2hlcmUgaXQgZG9lc24ndCBjaGVjayBmb3IgYSBOVUxMIHBhZCBpbiBzdHJlYW1pbmcgbW9kZS4KKwkgIEZpeGVzICMzODcxMzcKKworMjAwNi0xMi0xOCAxMjoyNzozMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBGaXggY3Jhc2ggZGVyZWZlcmVuY2luZyBOVUxMIHBvaW50ZXIgaWYgdGhlcmUncyBubyBzdGNvIGF0b20uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIEZpeCBjcmFzaCBkZXJlZmVyZW5jaW5nIE5VTEwgcG9pbnRlciBpZiB0aGVyZSdzIG5vIHN0Y28gYXRvbS4KKwkgIEZpeGVzICMzODcxMjIuCisKKzIwMDYtMTItMTggMTA6MDI6NTYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQHVidW50dS5jb20+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaDogVXNlIGxvY2FsIGNvcHkgb2YgbWQ1LmgsIGFzIGl0IGRpc2FwcGVhcmVkIGluIHJlY2VudCB3YXZwYWNrIGluc3RhbGxzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaDoKKwkgIFVzZSBsb2NhbCBjb3B5IG9mIG1kNS5oLCBhcyBpdCBkaXNhcHBlYXJlZCBpbiByZWNlbnQgd2F2cGFjaworCSAgaW5zdGFsbHMuCisJICBQYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW8gYXQgdWJ1bnR1IGRvdCBjb20+CisJICBGaXhlczogIzM4NzA3NgorCisyMDA2LTEyLTE3IDE5OjQyOjA1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA2LTEyLTE3IDA2OjExOjM5ICswMDAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSAgc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay4qOiBEZWNlbnQgZWZmb3J0IGF0IHBvcnRpbmcgdG8gMC4xMC4gIE5lZWRzIGNsZWFudXAgb24gT1MvWC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmg6CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKwkgIERlY2VudCBlZmZvcnQgYXQgcG9ydGluZyB0byAwLjEwLiAgTmVlZHMgY2xlYW51cCBvbiBPUy9YLgorCisyMDA2LTEyLTE3IDA1OjA3OjA3ICswMDAwICBWaWpheSBTYW50aGFuYW0gPHZpamF5QHNhbnRoYW5hbS5nbWFpbC5jb20+CisKKwkgIHN5cy9vc3h2aWRlby86IFByZWxpbWluYXJ5IHBhdGNoIGZvciBwb3J0aW5nIG9zeHZpZGVvc2luaworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVmlqYXkgU2FudGhhbmFtIDx2aWpheSBzYW50aGFuYW0gZ21haWwgY29tPgorCSAgKiBzeXMvb3N4dmlkZW8vTWFrZWZpbGUuYW06CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgUHJlbGltaW5hcnkgcGF0Y2ggZm9yIHBvcnRpbmcgb3N4dmlkZW9zaW5rCisKKzIwMDYtMTItMTYgMTY6MjE6MjYgKzAwMDAgIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKworCSAgZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiBJbnRyb2R1Y2Ugc29tZSBsb2NraW5nIGFyb3VuZCB0aGUgdmlkZW9taXhlciBzdGF0ZSBzbyB0aGF0IGl0IGRvZXMgbm90IGNyYXNoIHdoZW4gYWRkaW5nLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTam9lcmQgU2ltb25zIDxzam9lcmQgYXQgbHVvbiBkb3QgbmV0PgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IChnc3RfdmlkZW9taXhlcl9wYWRfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfdmlkZW9taXhlcl9zZXRfbWFzdGVyX2dlb21ldHJ5KSwKKwkgIChnc3RfdmlkZW9taXhlcl9wYWRfc2lua19zZXRjYXBzKSwgKGdzdF92aWRlb21peGVyX2NvbGxlY3RfZnJlZSksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfcmVzZXQpLCAoZ3N0X3ZpZGVvbWl4ZXJfaW5pdCksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfZmluYWxpemUpLCAoZ3N0X3ZpZGVvbWl4ZXJfcmVxdWVzdF9uZXdfcGFkKSwKKwkgIChnc3RfdmlkZW9taXhlcl9yZWxlYXNlX3BhZCksIChnc3RfdmlkZW9taXhlcl9jb2xsZWN0ZWQpLAorCSAgKGdzdF92aWRlb21peGVyX2NoYW5nZV9zdGF0ZSk6CisJICBJbnRyb2R1Y2Ugc29tZSBsb2NraW5nIGFyb3VuZCB0aGUgdmlkZW9taXhlciBzdGF0ZSBzbyB0aGF0IGl0IGRvZXMgbm90CisJICBjcmFzaCB3aGVuIGFkZGluZy9yZW1vdmluZyBwYWRzLiBGaXhlcyAjMzgzMDQzLgorCisyMDA2LTEyLTE2IDE1OjI1OjIzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFdlIGRvbid0IHN1cHBvcnQgc2Vla2luZyBpbiBzdHJlYW1pbmcgbW9kZSwgc28gZG9uJ3QgZXZlbiB0cnkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfZ2V0X3NyY19xdWVyeV90eXBlcyksCisJICAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChnc3RfcXRkZW11eF9oYW5kbGVfc3JjX2V2ZW50KToKKwkgIFdlIGRvbid0IHN1cHBvcnQgc2Vla2luZyBpbiBzdHJlYW1pbmcgbW9kZSwgc28gZG9uJ3QgZXZlbiB0cnkuCisJICBJbXBsZW1lbnQgc2Vla2luZyBxdWVyeSBzbyBhcHBzIGNhbiBxdWVyeSBzZWVrYWJpbGl0eSBwcm9wZXJseQorCSAgKHNlZSAjMzY1NDE0KS4gRml4IGR1cmF0aW9uIHF1ZXJ5LgorCisyMDA2LTEyLTE2IDExOjQyOjU2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IE1ha2Ugc3VyZSBsaWJjYWNhIGNhbiBhY3R1YWxseSBiZSB1c2VkIGluc3RlYWQgb2YganVzdCBjaGVja2luZyBmb3IgL3Vzci9iaW4vY2FjYS1jb25maWcsIHNvIHdlIGRvbid0IHcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBNYWtlIHN1cmUgbGliY2FjYSBjYW4gYWN0dWFsbHkgYmUgdXNlZCBpbnN0ZWFkIG9mIGp1c3QgY2hlY2tpbmcgZm9yCisJICAvdXNyL2Jpbi9jYWNhLWNvbmZpZywgc28gd2UgZG9uJ3Qgd3JvbmdseSB0cnkgdG8gYnVpbGQgY2FjYXNpbmsgd2hlbgorCSAgY3Jvc3MtY29tcGlsaW5nIChmaXhlcyAjMzg0NTg3KS4KKworMjAwNi0xMi0xNSAxMDo1NDoyOCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGFkZGluZyBkb2FwIGZpbGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBNYWtlZmlsZS5hbToKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC5kb2FwOgorCSAgKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBhZGRpbmcgZG9hcCBmaWxlCisKKzIwMDYtMTItMTQgMTY6MjA6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogbGliZmxhYy0xLjEuMyBjaGFuZ2VkIEFQSSBhZ2FpbiwgYnV0IHdlIGNhbid0IGJ1aWxkIGFnYWluc3QgaXQgeWV0LCBzbyBtYWtlIHN1cmUgb3VyIGNoZWNrIGRvZXNuJ3QgdXNlIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIGxpYmZsYWMtMS4xLjMgY2hhbmdlZCBBUEkgYWdhaW4sIGJ1dCB3ZSBjYW4ndCBidWlsZCBhZ2FpbnN0IGl0IHlldCwKKwkgIHNvIG1ha2Ugc3VyZSBvdXIgY2hlY2sgZG9lc24ndCB1c2UgbGliZmxhYy0xLjEuMyBhbmQgYWRkIGEgY29tbWVudAorCSAgdG8gdGhpcyBlZmZlY3QuCisKKzIwMDYtMTItMTQgMTQ6MjU6MTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6IEFkZCBzb21lIE5VTEwgcG9pbnRlciBjaGVja3MgKHBvc3NpYmx5IHJlbGF0ZWQgdG8gIzM4NTYyMykuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzogKGdzdF9xdWFya3R2X3RyYW5zZm9ybSksCisJICAoZ3N0X3F1YXJrdHZfcGxhbmV0YWJsZV9jbGVhcik6CisJICBBZGQgc29tZSBOVUxMIHBvaW50ZXIgY2hlY2tzIChwb3NzaWJseSByZWxhdGVkIHRvICMzODU2MjMpLgorCisyMDA2LTEyLTEzIDE3OjEyOjIyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEFkZCBBTVItV0IgdG8gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGZvcm1hdHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfZ2V0X2R1cmF0aW9uKSwKKwkgIChnc3RfcXRkZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwgKHF0ZGVtdXhfcGFyc2VfdHJhayksCisJICAocXRkZW11eF9hdWRpb19jYXBzKToKKwkgIEFkZCBBTVItV0IgdG8gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGZvcm1hdHMuCisKKzIwMDYtMTItMTIgMTg6NDU6NTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC86IEluIHN0cmVhbWluZyBtb2RlLCBpZiB0aGUgZmlyc3QgYnVmZmVyIHdlIGdldCBkb2Vzbid0IGhhdmUgYW4gb2Zmc2V0LCBmaXggaXQgdXAgdG8gYmUgMCwgb3RoZXJ3aXNlIHRyaW1taW5nIHdvbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzogKGdzdF90YWdfZGVtdXhfY2hhaW5fcGFyc2VfdGFnKSwKKwkgIChnc3RfdGFnX2RlbXV4X2NoYWluKToKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfY2hhaW4pOgorCSAgSW4gc3RyZWFtaW5nIG1vZGUsIGlmIHRoZSBmaXJzdCBidWZmZXIgd2UgZ2V0IGRvZXNuJ3QgaGF2ZSBhbgorCSAgb2Zmc2V0LCBmaXggaXQgdXAgdG8gYmUgMCwgb3RoZXJ3aXNlIHRyaW1taW5nIHdvbid0IHdvcmsgbGF0ZXIgb24KKwkgIGFuZCB3ZSdsbCBiZSB0eXBlZmluZGluZyBhcHBsaWNhdGlvbi94LWlkMywgd2hpY2ggbWF5IHJlc3VsdCBpbgorCSAgZGVjb2RlYmluIHBsdWdnaW5nIGFuIGVuZGxlc3MgbnVtYmVyIG9mIGlkM2RlbXV4IGVsZW1lbnRzIGFzIGEKKwkgIGNvbnNlcXVlbmNlLiBGaXhlcyAjMzg1MDMxLgorCisyMDA2LTEyLTExIDIxOjIxOjE2ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOiBJZ25vcmUgdGhlIGJ1ZmZlcl90aW1lIHRoZSBzb3VuZCBkZXZpY2UgcmVwb3J0cy4gVHVybnMgb3V0IGl0IGlzIHNvbWV0aW1lcyBjb21wbGV0ZWx5Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOiAoZ3N0X3N1bmF1ZGlvc2lua19wcmVwYXJlKToKKwkgIElnbm9yZSB0aGUgYnVmZmVyX3RpbWUgdGhlIHNvdW5kIGRldmljZSByZXBvcnRzLiBUdXJucyBvdXQgaXQgaXMKKwkgIHNvbWV0aW1lcyBjb21wbGV0ZWx5IGJvZ3VzIGFuZCB3ZSdyZSBiZXR0ZXIgb2ZmIHdpdGhvdXQgaXQuCisKKzIwMDYtMTItMTEgMTc6MzM6MjYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRml4IG5vbi13b3JraW5nIHJlZGlyZWN0cyBmcm9tIGluZXRmaWxtLmNvbSAoaGFuZGxlICdhbGlzJyByZWZlcmVuY2UgZGF0YSB0eXBlIGFzIHdlbGwpLiBGaXhlcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdHJlZSk6CisJICBGaXggbm9uLXdvcmtpbmcgcmVkaXJlY3RzIGZyb20gaW5ldGZpbG0uY29tIChoYW5kbGUgJ2FsaXMnIHJlZmVyZW5jZQorCSAgZGF0YSB0eXBlIGFzIHdlbGwpLiBGaXhlcyAjMzc4NjEzLgorCisyMDA2LTEyLTExIDEzOjU5OjMzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvOiBUcnkgaGFyZGVyIHRvIGV4dHJhY3QgdGhlIGZyYW1lcmF0ZSBmb3IgdmlkZW8gdHJhY2tzIGNvcnJlY3RseSBhbmQgc2F2ZSBpdCBkaXJlY3RseSBpbnN0ZWFkIG9mIGNvbnZlcnQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfdmlkZW9fY2Fwcyk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuYzoKKwkgIChnc3RfbWF0cm9za2FfdHJhY2tfaW5pdF92aWRlb19jb250ZXh0KToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgVHJ5IGhhcmRlciB0byBleHRyYWN0IHRoZSBmcmFtZXJhdGUgZm9yIHZpZGVvIHRyYWNrcyBjb3JyZWN0bHkgYW5kCisJICBzYXZlIGl0IGRpcmVjdGx5IGluc3RlYWQgb2YgY29udmVydGluZyBpdCBiYWNrIGFuZCBmb3J0aCBhIGZldworCSAgdGltZXMuIE1vc3RseSBtYWtlcyBhIGRpZmZlcmVuY2UgZm9yIHZlcnkgc21hbGwgZnJhbWVyYXRlcyAoPDEpLgorCSAgRml4ZXMgIzM4MDE5OS4KKworMjAwNi0xMi0xMSAxMTo0MToxOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuKjogUmVtb3ZlIGdjb25mIG5vdGlmeSBob29rIHdoZW4gdGhlIGdjb25mYXVkaW9zcmMgZWxlbWVudCBpcyBkZXN0cm95ZWQsIG90aGVyd2lzZSB0aGUgY2FsLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuYzogKGdzdF9nY29uZl9hdWRpb19zcmNfaW5pdCksCisJICAoZ3N0X2djb25mX2F1ZGlvX3NyY19kaXNwb3NlKSwgKGRvX3RvZ2dsZV9lbGVtZW50KToKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuaDoKKwkgIFJlbW92ZSBnY29uZiBub3RpZnkgaG9vayB3aGVuIHRoZSBnY29uZmF1ZGlvc3JjIGVsZW1lbnQgaXMKKwkgIGRlc3Ryb3llZCwgb3RoZXJ3aXNlIHRoZSBjYWxsYmFjayBtYXkgYmUgY2FsbGVkIG9uIGFuCisJICBhbHJlYWR5LWRlc3Ryb3llZCBpbnN0YW5jZSBhbmQgYmFkIHRoaW5ncyBoYXBwZW4uIFNob3VsZCBmaXgKKwkgICMzNzgxODQuCisJICBBbHNvIGlnbm9yZSBnY29uZiBrZXkgY2hhbmdlcyB3aGVuIHRoZSBzb3VyY2UgaXMgYWxyZWFkeSBydW5uaW5nLgorCisyMDA2LTEyLTA5IDE5OjI3OjI4ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxtYWlsQHNsb21vc25haWwuZGU+CisKKwkgIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzogV2UgbmVlZCB0byBiZSBhYmxlIHRvIHJlYWQgYW5kIHBhcnNlIGFueSBwb3NzaWJsZSBmbG9hdGluZyBwb2ludCBzdHJpbmcgZm9ybWF0ICgiMSwyMzQiIG9yIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSAgPG1haWwgYXQgc2xvbW9zbmFpbCBkZT4KKwkgICogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOiAoYXBlX2RlbXV4X3BhcnNlX3RhZ3MpOgorCSAgV2UgbmVlZCB0byBiZSBhYmxlIHRvIHJlYWQgYW5kIHBhcnNlIGFueSBwb3NzaWJsZSBmbG9hdGluZyBwb2ludCBzdHJpbmcKKwkgIGZvcm1hdCAoIjEsMjM0IiBvciAiMS4yMzQiKSBpcnJlc3BlY3RpdmUgb2YgdGhlIGN1cnJlbnQgbG9jYWxlLiBnX3N0cm9kKCkKKwkgIHdpbGwgcGFyc2UgdGhlIGZvcm1lciBvbmx5IGluIGNlcnRhaW4gbG9jYWxlcyB0aG91Z2gsIHNvIHdlIHJlYWxseSBuZWVkCisJICB0byBjYW5vbmljYWxpc2UgdGhlIHNlcGFyYXRvciB0byAnLicgYW5kIHRoZW4gdXNlIGdfYXNjaWlfc3RydG9kKCkgdG8KKwkgIG1ha2Ugc3VyZSB3ZSBjYW4gcGFyc2UgZWl0aGVyIHZlcnNpb24gYXQgYWxsIHRpbWVzLgorCSAgRml4ZXMgIzM4Mjk4MiBmb3IgcmVhbC4KKworMjAwNi0xMi0wOSAxNjoxNzozMyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHN5cy9zdW5hdWRpby86IFVzZSB0aGUgc3VuYXVkaW8gZGVidWcgY2F0ZWdvcnkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOgorCSAgVXNlIHRoZSBzdW5hdWRpbyBkZWJ1ZyBjYXRlZ29yeS4KKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOiAoZ3N0X3N1bmF1ZGlvc2lua19maW5hbGl6ZSksCisJICAoZ3N0X3N1bmF1ZGlvc2lua19jbGFzc19pbml0KSwgKGdzdF9zdW5hdWRpb3NpbmtfaW5pdCksCisJICAoZ3N0X3N1bmF1ZGlvc2lua19zZXRfcHJvcGVydHkpLCAoZ3N0X3N1bmF1ZGlvc2lua19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9zdW5hdWRpb3Npbmtfb3BlbiksIChnc3Rfc3VuYXVkaW9zaW5rX2Nsb3NlKSwKKwkgIChnc3Rfc3VuYXVkaW9zaW5rX3ByZXBhcmUpLCAoZ3N0X3N1bmF1ZGlvX3NpbmtfZG9fZGVsYXkpLAorCSAgKGdzdF9zdW5hdWRpb3Npbmtfd3JpdGUpLCAoZ3N0X3N1bmF1ZGlvc2lua19kZWxheSksCisJICAoZ3N0X3N1bmF1ZGlvc2lua19yZXNldCk6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NpbmsuaDoKKwkgIFVzZXMgdGhlIHN1bmF1ZGlvIGRlYnVnIGNhdGVnb3J5IGZvciBhbGwgZGVidWcgb3V0cHV0CisJICBJbXBsZW1lbnRzIHRoZSBfZGVsYXkoKSBjYWxsYmFjayB0byBzeW5jaHJvbmlzZSB2aWRlbyBwbGF5YmFjayBiZXR0ZXIKKwkgIENoYW5nZSB0aGUgc2VndG90YWwgYW5kIHNlZ3NpemUgdmFsdWVzIGJhY2sgdG8gdGhlIHBhcmVudCBjbGFzcworCSAgZGVmYXVsdHMgKHRha2VuIGZyb20gYnVmZmVyX3RpbWUgYW5kIGxhdGVuY3lfdGltZXMgb2YgMjAwbXMgYW5kIDEwbXMKKwkgIHJlc3BlY3RpdmVseSkKKwkgIE1lYXN1cmUgdGhlIHNhbXBsZXMgd3JpdHRlbiB0byB0aGUgZGV2aWNlIHZzLiBwbGF5ZWQuCisJICBLZWVwIHRyYWNrIG9mIHNlZ21lbnRzIGluIHRoZSBkZXZpY2UgYnkgd3JpdGluZyBlbXB0eSBlb2YgZnJhbWVzLCBhbmQKKwkgIHNsZWVwIHVzaW5nIGEgR0NvbmQgd2hlbiB3ZSBnZXQgdG9vIGZhciBhaGVhZCBhbmQgcmlzayBvdmVycnVubmluZyB0aGUKKwkgIHNpbmsncyByaW5nYnVmZmVyLgorCSAgRml4ZXM6ICMzNjA2NzMKKworMjAwNi0xMi0wOCAyMToxMjo0NyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkgIENvcnJlY3QgdGhlIGF0dHJpYnV0aW9uIG9mIHRoZSBwcmV2aW91cyBjb21taXQuIFRoZSBwYXRjaCBpbiBxdWVzdGlvbiB3YXMgd3JpdHRlbiBieSBCcmlhbiBDYW1lcm9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBDb3JyZWN0IHRoZSBhdHRyaWJ1dGlvbiBvZiB0aGUgcHJldmlvdXMgY29tbWl0LiBUaGUgcGF0Y2ggaW4KKwkgIHF1ZXN0aW9uIHdhcyB3cml0dGVuIGJ5IEJyaWFuIENhbWVyb24uCisKKzIwMDYtMTItMDggMTc6MDY6NDMgKzAwMDAgIFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRml4IGNhcHMgZm9yIDI0IGJpdCByYXcgUENNIGF1ZGlvICgyKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFJlbsOpIFN0YWRsZXIgIDxtYWlsIGF0IHJlbmVzdGFkbGVyIGRlPgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9nZXRfZHVyYXRpb24pLAorCSAgKGdzdF9xdGRlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLCAocXRkZW11eF9wYXJzZV90cmFrKSwKKwkgIChxdGRlbXV4X2F1ZGlvX2NhcHMpOgorCSAgRml4IGNhcHMgZm9yIDI0IGJpdCByYXcgUENNIGF1ZGlvICgyKS4KKwkgIEZpeGVzICMzODM0NzEuCisKKzIwMDYtMTItMDggMTY6Mzg6MTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPG1haWxAc2xvbW9zbmFpbC5kZT4KKworCSAgZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS4qOiBGaXggYXVkaW9wYW5vcmFtZSB3aXRoIGZsb2F0IHNhbXBsZXMuIEZpeGVzICMzODM3MjYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlICA8bWFpbCBhdCBzbG9tb3NuYWlsIGRlID4KKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jOiAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX2luaXQpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV9zZXRfY2FwcyksIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtKToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5oOgorCSAgRml4IGF1ZGlvcGFub3JhbWUgd2l0aCBmbG9hdCBzYW1wbGVzLiBGaXhlcyAjMzgzNzI2LgorCisyMDA2LTEyLTA4IDE1OjEyOjAxICswMDAwICBQYWRyYWlnIE8nQnJpYWluIDxwYWRyYWlnLm9icmlhaW5Ac3VuLmNvbT4KKworCSAgc3lzL3N1bmF1ZGlvLzogSW1wbGVtZW50IHJlc2V0IGZ1bmN0aW9ucyB0byB1bmJsb2NrIHRoZSBzcmMvc2luayBtb3JlIHF1aWNrbHkgb24gc3RhdGUgY2hhbmdlIHJlcXVlc3RzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NpbmsuYzogKGdzdF9zdW5hdWRpb3NpbmtfcmVzZXQpOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuYzogKGdzdF9zdW5hdWRpb3NyY19vcGVuKSwKKwkgIChnc3Rfc3VuYXVkaW9zcmNfcmVzZXQpOgorCSAgSW1wbGVtZW50IHJlc2V0IGZ1bmN0aW9ucyB0byB1bmJsb2NrIHRoZSBzcmMvc2luayBtb3JlIHF1aWNrbHkgb24KKwkgIHN0YXRlIGNoYW5nZSByZXF1ZXN0cy4KKwkgIFBhdGNoIGJ5OiBQYWRyYWlnIE8nQnJpYWluIDxwYWRyYWlnIGRvdCBvYnJpYWluIGF0IHN1biBkb3QgY29tPgorCisyMDA2LTEyLTA4IDE0OjQyOjQyICswMDAwICBKZXJyeSBUYW4gPGplcnJ5LnRhbkBzdW4uY29tPgorCisJICBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlci5jOiBDb25zdHJ1Y3QgdGhlIGNvcnJlY3QgbWl4ZXIgZGV2aWNlIG5hbWUgd2hlbiB0aGUgQVVESU9ERVYgZW52IHZhciBpcyBzZXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXIuYzoKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jaGFuZ2Vfc3RhdGUpOgorCSAgQ29uc3RydWN0IHRoZSBjb3JyZWN0IG1peGVyIGRldmljZSBuYW1lIHdoZW4gdGhlIEFVRElPREVWIGVudiB2YXIKKwkgIGlzIHNldC4KKwkgIFBhdGNoIGJ5OiBKZXJyeSBUYW4gPGplcnJ5LnRhbiBhdCBzdW4gZG90IGNvbT4KKwkgIEZpeGVzOiAjMzgzNTk2CisKKzIwMDYtMTItMDggMTQ6MzI6NTEgKzAwMDAgIEplcnJ5IFRhbiA8amVycnkudGFuQHN1bi5jb20+CisKKwkgIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOiBBcHBseSBwYXRjaCB0byBvcGVuIHRoZSBtaXhlciBjb250cm9sIGFuZCBzZXQgdGhlIE1VTFRJUExFX09QRU4gaW9jdGwuIE9uIHNvbGFyaXMsIHRoZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOiAoZ3N0X3N1bmF1ZGlvc3JjX29wZW4pOgorCSAgQXBwbHkgcGF0Y2ggdG8gb3BlbiB0aGUgbWl4ZXIgY29udHJvbCBhbmQgc2V0IHRoZSBNVUxUSVBMRV9PUEVOCisJICBpb2N0bC4gT24gc29sYXJpcywgdGhlIG1peGVyIGRldmljZSBkb2Vzbid0IG5lZWQgb3BlbmluZyBub24tYmxvY2tpbmcKKwkgIC0gaXQgY2FuIGJlIG9wZW5lZCBieSBtdWx0aXBsZSBwcm9jZXNzZXMgYnkgZGVmYXVsdCwgYnV0IG5lZWRzIHRoZSBpb2N0bCAJZm9yIG11bHRpcGxlIG9wZW5zIHdpdGhpbiAxIHByb2Nlc3MuCisJICBQYXRjaCBieTogSmVycnkgVGFuIDxqZXJyeS50YW4gYXQgc3VuIGRvdCBjb20+CisJICBGaXhlczogIzM0OTAxNQorCisyMDA2LTEyLTA3IDE3OjMwOjAzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3Qvc21wdGUvOiBQb3J0IHRvIDAuMTAgc29tZSBtb3JlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zbXB0ZS9nc3RtYXNrLmg6CisJICAqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiAoZ3N0X3NtcHRlX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zbXB0ZV9zZXRjYXBzKSwgKGdzdF9zbXB0ZV9pbml0KSwgKGdzdF9zbXB0ZV9yZXNldCksCisJICAoZ3N0X3NtcHRlX2NvbGxlY3RlZCksIChnc3Rfc21wdGVfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfc21wdGVfZ2V0X3Byb3BlcnR5KSwgKGdzdF9zbXB0ZV9jaGFuZ2Vfc3RhdGUpLCAocGx1Z2luX2luaXQpOgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGUuaDoKKwkgIFBvcnQgdG8gMC4xMCBzb21lIG1vcmUuCisJICBBZGRlZCBkdXJhdGlvbiBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi4KKwkgIE1ha2UgZnJhbWVyYXRlIGEgZnJhY3Rpb24uCisJICBEZXByZWNhdGUgZnBzIHByb3BlcnR5LCB3ZSBvbmx5IHVzZSBuZWdvdGlhdGVkIGZwcy4KKwkgIEFkZGVkIGRvY3MuCisJICBGaXggY29sbGVjdHBhZCB1c2FnZS4KKwkgIFJlc2V0IHN0YXRlIGluIFJFQURZLgorCSAgU2VuZCBORVdTRUdNRU5UIGV2ZW50LgorCSAgRml4IHJhY3kgdXBkYXRlcyBvZiBvYmplY3QgcHJvcGVydGllcy4KKwkgIEFkZGVkIGRlYnVnIGNhdGVnb3J5LgorCSAgRml4ZXMgIzM4MzMyMy4KKworMjAwNi0xMi0wNyAxMTozNTo0MSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBIYW5kbGUgbW9yZSBIMjYzIHZhcmlhbnRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2dldF9kdXJhdGlvbiksCisJICAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChxdGRlbXV4X3BhcnNlX3RyYWspLAorCSAgKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBIYW5kbGUgbW9yZSBIMjYzIHZhcmlhbnRzLgorCisyMDA2LTEyLTA2IDE1OjA2OjA0ICswMDAwICBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogRG9uJ3QgcmVzZXQgeHBvcyBhbmQgeXBvcyBpbiB0aGUgc2V0Y2FwcyBmdW5jdGlvbiBiZWNhdXNlIGNhdXNlcyB1bmV4cGVjdGVkIGJlaGF2aW91ci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFNqb2VyZCBTaW1vbnMgPHNqb2VyZCBhdCBsdW9uIGRvdCBuZXQ+CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIChnc3RfdmlkZW9taXhlcl9zZXRfbWFzdGVyX2dlb21ldHJ5KSwKKwkgIChnc3RfdmlkZW9taXhlcl9wYWRfc2lua19zZXRjYXBzKSwgKGdzdF92aWRlb21peGVyX2NvbGxlY3RfZnJlZSk6CisJICBEb24ndCByZXNldCB4cG9zIGFuZCB5cG9zIGluIHRoZSBzZXRjYXBzIGZ1bmN0aW9uIGJlY2F1c2UgY2F1c2VzCisJICB1bmV4cGVjdGVkIGJlaGF2aW91ci4KKwkgIEZpeGVzICMzODIxNzkuCisKKzIwMDYtMTItMDYgMTQ6NDU6MzAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IEtlZXAgdHJhY2sgb2YgdGhlIGJ1ZmZlciB0aW1lc3RhbXAgaW4gdGhlIGNvbGxlY3RkYXRhIG1lbWJlciBpbnN0ZWFkIG9mIG1vZGlmeWluZyB0aGUgYi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IChnc3RfbXVsdGlwYXJ0X211eF9jb21wYXJlX3BhZHMpLAorCSAgKGdzdF9tdWx0aXBhcnRfbXV4X3F1ZXVlX3BhZHMpLCAoZ3N0X211bHRpcGFydF9tdXhfY29sbGVjdGVkKToKKwkgIEtlZXAgdHJhY2sgb2YgdGhlIGJ1ZmZlciB0aW1lc3RhbXAgaW4gdGhlIGNvbGxlY3RkYXRhIG1lbWJlciBpbnN0ZWFkCisJICBvZiBtb2RpZnlpbmcgdGhlIGJ1ZmZlciB3aXRob3V0IG1ha2luZyB0aGUgbWV0YWRhdGEgd3JpdGFibGUgZmlyc3QuCisJICBGaXhlcyAjMzgyMjc3LgorCisyMDA2LTEyLTA2IDE0OjMzOjU0ICswMDAwICBSb2IgVGF5bG9yIDxyb2J0YXlsb3JAZmxvb3BpbHkub3JnPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy5jOiBJZiB1c2luZyBtdWx0aWNhc3QgaW4gdWRwc3JjLCBiaW5kIHRvIHRoZSBtdWx0aWNhc3QgYWRkcmVzcyByYXRoZXIgdGhhbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUm9iIFRheWxvciA8cm9idGF5bG9yIGF0IGZsb29waWx5IGRvdCBvcmc+CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX3N0YXJ0KToKKwkgIElmIHVzaW5nIG11bHRpY2FzdCBpbiB1ZHBzcmMsIGJpbmQgdG8gdGhlIG11bHRpY2FzdCBhZGRyZXNzIHJhdGhlciB0aGFuCisJICBJTl9BRERSX0FOWS4KKwkgIFRoaXMgYWxsb3dzIHRoZSBzaW11bHRhbm91cyB1c2Ugb2YgbXVsdGlwbGUgdWRwc3JjcyBsaXN0ZW5pbmcgb24KKwkgIGRpZmZlcmVudCBtdWx0aWNhdCBhZGRyZXNzZXMuIFdpdGhvdXQgdGhpcyBhbGwgdWRwc3JjcyB3aWxsIHJlY2VpdmUgYWxsCisJICBwYWNrZXRzIGZyb20gYWxsIHN1YnNjcmliZWQgbXVsdGljYXN0IGFkZHJlc3Nlcy4KKwkgIEZpeGVzICMzODMwMDEuCisKKzIwMDYtMTItMDYgMTM6MzU6NTIgKzAwMDAgIEpvbmF0aGFuIE1hdHRoZXcgPGpvbmF0aGFuQDBrYW9saW4ud2g5Lm5ldD4KKworCSAgZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzogRG9uJ3QgYXR0ZW1wdCB0byB3cml0ZSBhIE5VTEwgZnJhbWUgaW50byB0aGUgSUQzIHRhZyBzZXQgd2hlbiB0aGUgY3JlYXRlRnJhbWUgbWV0aG9kIHJldHVyLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkgIERvbid0IGF0dGVtcHQgdG8gd3JpdGUgYSBOVUxMIGZyYW1lIGludG8gdGhlIElEMyB0YWcgc2V0IHdoZW4gdGhlCisJICBjcmVhdGVGcmFtZSBtZXRob2QgcmV0dXJuZWQgTlVMTC4KKwkgIEZpeGVzOiAjMzgxODU3CisJICBQYXRjaCBieTogSm9uYXRoYW4gTWF0dGhldyA8am9uYXRoYW4gYXQgMGthb2xpbiB3aDkgbmV0ID4KKworMjAwNi0xMi0wNiAxMzoxNjo1OSArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8bWFpbEBzbG9tb3NuYWlsLmRlPgorCisJICBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6IFVzZSBnX3N0cnRvZCgpIGluc3RlYWQgb2Ygc3NjYW5mIHRvIHBhcnNlIGRvdWJsZXMsIHNvIHRoYXQgaXQgd2lsbCB0cnkgcGFyc2luZyBpbiB0aGUgQyBsb2MuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6IChhcGVfZGVtdXhfcGFyc2VfdGFncyk6CisJICBVc2UgZ19zdHJ0b2QoKSBpbnN0ZWFkIG9mIHNzY2FuZiB0byBwYXJzZSBkb3VibGVzLCBzbyB0aGF0IGl0IHdpbGwKKwkgIHRyeSBwYXJzaW5nIGluIHRoZSBDIGxvY2FsZSBpZiB0aGUgY3VycmVudCBsb2NhbGUgZmFpbHMuCisJICBGaXhlczogIzM4Mjk4MgorCSAgUGF0Y2ggYnk6IFNlYmFzdGlhbiBEcsO2Z2UgIDxtYWlsIGF0IHNsb21vc25haWwgZGUgPgorCisyMDA2LTEyLTAxIDEwOjMxOjQ2ICswMDAwICBTZXJnZXkgU2NvYmljaCA8c2VyZ2V5LnNjb2JpY2hAZ21haWwuY29tPgorCisJICB3aW4zMi9NQU5JRkVTVDogRml4IGNvbXBpbGF0aW9uIG9uIHdpbjMyIHVuZGVyIFZTOAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHdpbjMyL01BTklGRVNUOgorCSAgRml4IGNvbXBpbGF0aW9uIG9uIHdpbjMyIHVuZGVyIFZTOAorCSAgUGF0Y2ggYnk6IFNlcmdleSBTY29iaWNoIDxzZXJnZXkgZG90IHNjb2JpY2ggYXQgZ21haWwgZG90IGNvbT4KKwkgIFBhcnRpYWxseSBmaXhlcyAjMzgxMTc1CisKKzIwMDYtMTEtMzAgMTY6NDg6NTEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguYzogYWNjZXB0IGFsbCBtcGVndmVyc2lvbnMsZml4ZXMgIzM4MDgyNSBzcG90dGVkIGJ5OiBKZXJvbWUgQWxldAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJICBhY2NlcHQgYWxsIG1wZWd2ZXJzaW9ucyxmaXhlcyAjMzgwODI1CisJICBzcG90dGVkIGJ5OiBKZXJvbWUgQWxldAorCisyMDA2LTExLTMwIDE2OjQ2OjEzICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogY2xlYW51cCB0aGUgZXJyb3IgbWVzc2FnZSBhIGJpdCBtb3JlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfZmlsbF9mb3JtYXRfbGlzdCksCisJICAoZ3N0X3Y0bDJzcmNfcXVldWVfZnJhbWUpLCAoZ3N0X3Y0bDJzcmNfZ3JhYl9mcmFtZSksCisJICAoZ3N0X3Y0bDJzcmNfZ2V0X2NhcHR1cmUpLCAoZ3N0X3Y0bDJzcmNfc2V0X2NhcHR1cmUpLAorCSAgKGdzdF92NGwyc3JjX2NhcHR1cmVfaW5pdCksIChnc3RfdjRsMnNyY19idWZmZXJfZmluYWxpemUpOgorCSAgY2xlYW51cCB0aGUgZXJyb3IgbWVzc2FnZSBhIGJpdCBtb3JlCisKKzIwMDYtMTEtMzAgMTU6MDg6MDggKzAwMDAgIFJlbsOpIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisKKwkgIGdzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuYzogQ2FsbCB0aGUgYmFzZSBjbGFzcyBoYW5kbGVyLiAgRml4ZXMgIzM4MDYxMC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFJlbsOpIFN0YWRsZXIgIDxtYWlsIGF0IHJlbmVzdGFkbGVyIGRlPgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6IChnc3RfcmdfYW5hbHlzaXNfZXZlbnQpOgorCSAgQ2FsbCB0aGUgYmFzZSBjbGFzcyBoYW5kbGVyLiAgRml4ZXMgIzM4MDYxMC4KKworMjAwNi0xMS0yOCAxMjozMDoxMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzogRml4IHdpZHRoIGFuZCBoZWlnaHQgcHJvcGVydGllcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOiAoZ3N0X2NhY2FzaW5rX2NsYXNzX2luaXQpOgorCSAgRml4IHdpZHRoIGFuZCBoZWlnaHQgcHJvcGVydGllcy4KKwkgICogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuaDoKKwkgIEZpeCBjb21waWxhdGlvbiBvbiBuZXdlciBsaWJjYWNhIHRoYXQgcmVxdWlyZSB1cyB0byBpbmNsdWRlIGEgbmV3CisJICBoZWFkZXIuIEZpeGVzICMzNzk5MTguCisKKzIwMDYtMTEtMjggMTE6NTI6MjcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwLzogQWRkIG1ldGhvZCBzbyB0aGF0IGV4dGVuc2lvbnMgY2FuIGNob29zZSB0byBkaXNhYmxlIHRoZSBzZXR1cCBvZiBhIHN0cmVhbS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19vcGVuKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgKiBnc3QvcnRzcC9ydHNwZXh0Lmg6CisJICAqIGdzdC9ydHNwL3J0c3BleHR3bXMuYzogKHJ0c3BfZXh0X3dtc19jb25maWd1cmVfc3RyZWFtKSwKKwkgIChydHNwX2V4dF93bXNfZ2V0X2NvbnRleHQpOgorCSAgQWRkIG1ldGhvZCBzbyB0aGF0IGV4dGVuc2lvbnMgY2FuIGNob29zZSB0byBkaXNhYmxlIHRoZSBzZXR1cCBvZgorCSAgYSBzdHJlYW0uCisJICBNYWtlIHRoZSBXTVMgZXh0ZW5zaW9uIHNraXAgc2V0dXAgb2YgeC13bXMtcnR4IHN0cmVhbXMuIEZpeGVzICMzNzc3OTIuCisKKzIwMDYtMTEtMjcgMTc6MTY6MjYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogUmVtb3ZlIHNvbWUgYXNzZXJ0cyBhbmQgcmVwbGFjZSB0aGVtIHdpdGggYSBwcm9wZXIgZXJyb3IgbWVzc2FnZS4gRml4ZXMgIzM3OTI2MS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9nZXRfZHVyYXRpb24pLAorCSAgKGdzdF9xdGRlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLCAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIFJlbW92ZSBzb21lIGFzc2VydHMgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIGEgcHJvcGVyIGVycm9yCisJICBtZXNzYWdlLiBGaXhlcyAjMzc5MjYxLgorCisyMDA2LTExLTI3IDE2OjMwOjQ5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJICBtZW50aW9uIGJ1ZyBmaXgKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgbWVudGlvbiBidWcgZml4CisKKzIwMDYtMTEtMjcgMTY6Mjk6MDcgKzAwMDAgIEpvbmFzIEhvbG1iZXJnIDxqb25hcy5ob2xtYmVyZ0BheGlzLmNvbT4KKworCSAgZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogUHVzaCBoZWFkZXIgaW4gYSBzZXBhcmF0ZSBidWZmZXIgaW5zdGVhZCBvZiBtZW1jcHk6aW5nIGFsbCBkYXRhCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBKb25hcyBIb2xtYmVyZyA8am9uYXMgZG90IGhvbG1iZXJnIGF0IGF4aXMgZG90IGNvbT4KKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogKGdzdF9tdWx0aXBhcnRfbXV4X2NvbGxlY3RlZCk6CisJICBQdXNoIGhlYWRlciBpbiBhIHNlcGFyYXRlIGJ1ZmZlciBpbnN0ZWFkIG9mIG1lbWNweTppbmcgYWxsIGRhdGEKKwkgIENoYW5nZSBMRiA9PiBDUkxGIGluIGhlYWRlcnMKKwkgIE1vdmUgdHJhaWxpbmcgTEYgdG8gaGVhZGVyCisKKzIwMDYtMTEtMjcgMTY6MjY6NTAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzogU21hbGwgYnVmZmVyIG92ZXJmbG93IGZpeCBhbmQgaW1wcm92ZSBkZWJ1Z2dpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOiAoZ3N0X3J0cF9tcGFfZGVwYXlfY2hhaW4pOgorCSAgU21hbGwgYnVmZmVyIG92ZXJmbG93IGZpeCBhbmQgaW1wcm92ZSBkZWJ1Z2dpbmcuCisKKzIwMDYtMTEtMjQgMDg6NTg6NTMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZXh0L2VzZC86IHJlbW92ZSBvYnNvbGV0ZSBfZmFjdG9yeV9pbml0IHByb3RvcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkbW9uLmg6CisJICAqIGV4dC9lc2QvZXNkc2luay5oOgorCSAgcmVtb3ZlIG9ic29sZXRlIF9mYWN0b3J5X2luaXQgcHJvdG9zCisKKzIwMDYtMTEtMjQgMDc6NDY6NTQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiByZW1vdmUgZGVhZCBjb2RlLCB0d2VhayBkZWJ1Z3Mgc3RhdGVtZW50cywgYWRkIGNvbW1lbnRzLCB1c2UgX3VpbnQ2NF9zY2FsZSBpbnN0ZWFkIF91aW50NjRfc2NhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9pbmRleF9lbnRyeV9mb3JfdGltZSksCisJICAoZ3N0X2F2aV9kZW11eF9zcmNfY29udmVydCksIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLAorCSAgKGdzdF9hdmlfZGVtdXhfcGVla19jaHVuayksIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N1YmluZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3JlYWRfc3ViaW5kZXhlc19wdXNoKSwKKwkgIChnc3RfYXZpX2RlbXV4X3JlYWRfc3ViaW5kZXhlc19wdWxsKSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwKKwkgIChnc3RfYXZpX2RlbXV4X3BhcnNlX2luZGV4KSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N5bmMpLCAoZ3N0X2F2aV9kZW11eF9uZXh0X2RhdGFfYnVmZmVyKSwKKwkgIChnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfY2FsY3VsYXRlX2R1cmF0aW9uc19mcm9tX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVsbCksIChnc3RfYXZpX2RlbXV4X2RvX3NlZWspLAorCSAgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspLCAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpLAorCSAgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2RhdGEpLCAoZ3N0X2F2aV9kZW11eF9sb29wKToKKwkgIHJlbW92ZSBkZWFkIGNvZGUsIHR3ZWFrIGRlYnVncyBzdGF0ZW1lbnRzLCBhZGQgY29tbWVudHMsIHVzZQorCSAgX3VpbnQ2NF9zY2FsZSBpbnN0ZWFkIF91aW50NjRfc2NhbGVfaW50IHdoZW4gdXNpbmcgZ3VpbnQ2NCB2YWx1ZXMsCisJICBzbWFsbCBvcHRpbWl6YXRpb25zLCByZWZsb3cgc29tZSBlcnJvciBoYW5kbGluZworCisyMDA2LTExLTIyIDE3OjM5OjEzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBwby8uY3ZzaWdub3JlOiBXZSBuZXZlciBwdXQgLnBvdCBmaWxlcyBpbiBjdnMuIExldCdzIGlnbm9yZSB0aGVtIGFsbC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBwby8uY3ZzaWdub3JlOgorCSAgV2UgbmV2ZXIgcHV0IC5wb3QgZmlsZXMgaW4gY3ZzLiBMZXQncyBpZ25vcmUgdGhlbSBhbGwuCisKKzIwMDYtMTEtMjEgMTI6NTc6NTAgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgZW5hbGJlIExBRFNQQSBwbHVnaW4gaW4gc3BlYyBmaWxlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGVuYWxiZSBMQURTUEEgcGx1Z2luIGluIHNwZWMgZmlsZQorCisyMDA2LTExLTE5IDE4OjQ2OjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBwby9QT1RGSUxFUy5pbjogLi4uIGJ1dCBiZXR0ZXIgZXhjbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBkaXN0ZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogcG8vUE9URklMRVMuaW46CisJICAuLi4gYnV0IGJldHRlciBleGNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IGRpc3RlZC4KKworMjAwNi0xMS0xOSAxNjozMjo0OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgcG8vUE9URklMRVMuaW46IEFkZCB2NGwyIHNvdXJjZSBmaWxlcyB0byBsaXN0IG9mIGZpbGVzIHdpdGggdHJhbnNsYXRpb25zLCBzbyB0aGUgc3RyaW5ncyBhcmUgYWN0dWFsbHkgZXh0cmFjdGVkIChob3dlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogcG8vUE9URklMRVMuaW46CisJICBBZGQgdjRsMiBzb3VyY2UgZmlsZXMgdG8gbGlzdCBvZiBmaWxlcyB3aXRoIHRyYW5zbGF0aW9ucywgc28gdGhlCisJICBzdHJpbmdzIGFyZSBhY3R1YWxseSBleHRyYWN0ZWQgKGhvd2V2ZXIgYmFkIHRoZXkgc3RpbGwgbWF5IGJlKS4KKworMjAwNi0xMS0xOSAxNjozMDoxOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IE1pbm9yIGNsZWFuLXVwczogY29uc3QtaWZ5IHN0YXRpYyBhcnJheSwgcmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGZyb20gdXNlIEdTVF9ERUJVR19GVU5DUFRSLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOiAoZ3N0X3ZpZGVvX2JveF9jbGFzc19pbml0KToKKwkgIE1pbm9yIGNsZWFuLXVwczogY29uc3QtaWZ5IHN0YXRpYyBhcnJheSwgcmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGZyb20KKwkgIGxhc3QgZW51bSAoZ2NjLTIuOXggdHJpcHMgb3ZlciB0aGF0KSwgdXNlIEdTVF9ERUJVR19GVU5DUFRSLgorCisyMDA2LTExLTE5IDEzOjQxOjUzICswMDAwICBSZW7DqSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorCisJICBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogTWFrZSBzdXJlIHRoYXQgZ19mcmVlIGFsd2F5cyBnZXRzIGNhbGxlZCBvbiB0aGUgc2FtZSBwb2ludGVyIHRoYXQgd2FzIHJldHVybmVkIGJ5IGdfbWFsbG8uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKGlkM2RlbXV4X2lkM3YyX3BhcnNlX2ZyYW1lKToKKwkgIE1ha2Ugc3VyZSB0aGF0IGdfZnJlZSBhbHdheXMgZ2V0cyBjYWxsZWQgb24gdGhlIHNhbWUgcG9pbnRlciB0aGF0IHdhcworCSAgcmV0dXJuZWQgYnkgZ19tYWxsb2MuICBGaXhlcyAjMzc2NTk0LgorCSAgRG8gbm90IGxlYWsgbWVtb3J5IGlmIGRlY29tcHJlc3NlZCBzaXplIGlzIHdyb25nLgorCSAgUmVtb3ZlIHVubmVlZGVkIGNoZWNrIG9mIHJldHVybiB2YWx1ZSBvZiBnX21hbGxvYy4KKwkgIFBhdGNoIGJ5OiBSZW7DqSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorCisyMDA2LTExLTE4IDE4OjE0OjM0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IEFkZCBtaXNzaW5nIGN1cmx5IGJyYWNrZXRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX2NhcHR1cmVfZGVpbml0KToKKwkgIEFkZCBtaXNzaW5nIGN1cmx5IGJyYWNrZXRzLgorCisyMDA2LTExLTE3IDE0OjU0OjAxICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIENoYW5nZUxvZzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIEZpeCBjYXB0dXJlX2RlaW5pdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4IGNhcHR1cmVfZGVpbml0LgorCisyMDA2LTExLTE2IDE1OjM2OjQ4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IFVzZSBHU1RfREVCVUdfRlVOQ1BUUjsgYWN0aXZhdGUgcmVxdWVzdCBwYWQgYmVmb3JlIHJldHVybmluZyBpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X2NsYXNzX2luaXQpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfcmVxdWVzdF9uZXdfcGFkKToKKwkgIFVzZSBHU1RfREVCVUdfRlVOQ1BUUjsgYWN0aXZhdGUgcmVxdWVzdCBwYWQgYmVmb3JlIHJldHVybmluZyBpdC4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FtdXguYzogKHNldHVwX3NyY19wYWQpLAorCSAgKHNldHVwX3NpbmtfcGFkKSwgKEdTVF9TVEFSVF9URVNUKToKKwkgIEFjdGl2YXRlIHBhZHMgYmVmb3JlIHVzaW5nIHRoZW0uCisKKzIwMDYtMTEtMTYgMTU6MDQ6NTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogSW5pdGlhbGlzZSB2YXJpYWJsZSB0byBnZXQgcmlkIG9mIGJvZ3VzIGNvbXBpbGVyIHdhcm5pbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fc2Nhbik6CisJICBJbml0aWFsaXNlIHZhcmlhYmxlIHRvIGdldCByaWQgb2YgYm9ndXMgY29tcGlsZXIgd2FybmluZy4KKworMjAwNi0xMS0xNiAwNzoyNjoxNyArMDAwMCAgVmlsbGUgU3lyamFsYSA8dmlsbGUuc3lyamFsYUBtb3ZpYWwuZmk+CisKKwkgIGdzdC9ydHAvOiBTcGVjaWZ5IEguMjYzIHZhcmlhbnQgYW5kIHZlcnNpb24gaW4gdGhlIGNhcHMgKGZpeGVzICMzNjE2MzcpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBWaWxsZSBTeXJqYWxhIDx2aWxsZS5zeXJqYWxhQG1vdmlhbC5maT4KKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJICBTcGVjaWZ5IEguMjYzIHZhcmlhbnQgYW5kIHZlcnNpb24gaW4gdGhlIGNhcHMgKGZpeGVzICMzNjE2MzcpCisKKzIwMDYtMTEtMTUgMTc6NDQ6MDEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IERvbid0IHNldCBhIGRhdGEgcG9pbnRlciB0byBOVUxMIGFuZCBhIHNpemUgPiAwIHdoZW4gd2UgZGVhbCB3aXRoIGVtcHR5IHBhY2tldHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJlYWRfYm9keSk6CisJICBEb24ndCBzZXQgYSBkYXRhIHBvaW50ZXIgdG8gTlVMTCBhbmQgYSBzaXplID4gMCB3aGVuIHdlIGRlYWwKKwkgIHdpdGggZW1wdHkgcGFja2V0cy4KKwkgICogZ3N0L3J0c3AvcnRzcG1lc3NhZ2UuYzogKHJ0c3BfbWVzc2FnZV9uZXdfcmVzcG9uc2UpLAorCSAgKHJ0c3BfbWVzc2FnZV9pbml0X3Jlc3BvbnNlKSwgKHJ0c3BfbWVzc2FnZV9pbml0X2RhdGEpLAorCSAgKHJ0c3BfbWVzc2FnZV91bnNldCksIChydHNwX21lc3NhZ2VfZnJlZSksCisJICAocnRzcF9tZXNzYWdlX3Rha2VfYm9keSk6CisJICBDaGVjayB0aGF0IHdlIGNhbid0IGNyZWF0ZSBpbnZhbGlkIGVtcHR5IHBhY2tldHMuCisKKzIwMDYtMTEtMTUgMTI6MzU6NDYgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svOiBTb21lIHNtYWxsIGNsZWFuLXVwczogdXNlIGVudW1zIGluc3RlYWQgb2YgaGFyZC1jb2RlZCBudW1iZXJzLCBjb25zdC1pZnkgZWxlbWVudCBkZXRhaWxzLCByZS1mYWN0b3Igc29tLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlICA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfcmVzZXQpLAorCSAgKGdzdF93YXZwYWNrX2RlY19pbml0KSwgKGdzdF93YXZwYWNrX2RlY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfYmFzZV9pbml0KSwKKwkgIChnc3Rfd2F2cGFja19lbmNfY2xhc3NfaW5pdCksIChnc3Rfd2F2cGFja19lbmNfcmVzZXQpLAorCSAgKGdzdF93YXZwYWNrX2VuY19pbml0KSwgKGdzdF93YXZwYWNrX2VuY19zZXRfd3BfY29uZmlnKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6CisJICBTb21lIHNtYWxsIGNsZWFuLXVwczogdXNlIGVudW1zIGluc3RlYWQgb2YgaGFyZC1jb2RlZCBudW1iZXJzLAorCSAgY29uc3QtaWZ5IGVsZW1lbnQgZGV0YWlscywgcmUtZmFjdG9yIHNvbWUgY29kZSBpbnRvIF9yZXNldCgpCisJICBmdW5jdGlvbnMgKCMzNTI2MDUpLgorCisyMDA2LTExLTE1IDEyOjA4OjIwICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lio6IEFkZCBiYXNpYyB0YWcgd3JpdGluZyBzdXBwb3J0OyBpbXBsZW1lbnQgcmVsZWFzaW5nIHBhZHMgKCMzNzQ2NTgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyAgPG1hbmF1dyBhdCBza3luZXQgYmU+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfYWRkX2ludGVyZmFjZXMpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfY2xhc3NfaW5pdCksIChnc3RfbWF0cm9za2FfcGFkX2ZyZWUpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfcmVzZXQpLCAoZ3N0X21hdHJvc2thX211eF9oYW5kbGVfc2lua19ldmVudCksCisJICAoZ3N0X21hdHJvc2thX211eF9yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X21hdHJvc2thX211eF9yZWxlYXNlX3BhZCksCisJICAoZ3N0X21hdHJvc2thX211eF90cmFja19oZWFkZXIpLCAoZ3N0X21hdHJvc2thX211eF9zdGFydCksCisJICAoZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnKSwgKGdzdF9tYXRyb3NrYV9tdXhfZmluaXNoKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSAgQWRkIGJhc2ljIHRhZyB3cml0aW5nIHN1cHBvcnQ7IGltcGxlbWVudCByZWxlYXNpbmcgcGFkcyAoIzM3NDY1OCkuCisKKzIwMDYtMTEtMTUgMTE6MTk6MTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBIYW5kbGUgb3BhcXVlL3Vuc3BlY2lmaWVkIEFfQUFDIGF1ZGlvIGNvZGVjIElEIChmaXhlcyAjMzc0NzM3KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfYXVkaW9fY2Fwcyk6CisJICBIYW5kbGUgb3BhcXVlL3Vuc3BlY2lmaWVkIEFfQUFDIGF1ZGlvIGNvZGVjIElEIChmaXhlcyAjMzc0NzM3KS4KKworMjAwNi0xMS0xNSAwMDoxMjoxOSArMDAwMCAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogQWRkIERpcmFjIGZvdXJjYy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IEFkZCBEaXJhYyBmb3VyY2MuCisKKzIwMDYtMTEtMTQgMjA6MDc6MjIgKzAwMDAgIFNlcmdleSBTY29iaWNoIDxzZXJnZXkuc2NvYmljaEBnbWFpbC5jb20+CisKKwkgIHdpbjMyL3ZzOC86IE1ha2UgZW5kLW9mLWxpbmUgcmV0dXJucyB1bml4eSwgc28gdGhhdCB3aGVuIHRoZSBmaWxlcyBhcmUgY2hlY2tlZCBvdXQgb24gd2luMzIgdGhlIGxpbmUgcmV0dXJucyB3aWxsIGJlIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2VyZ2V5IFNjb2JpY2ggIDxzZXJnZXkuc2NvYmljaCBhdCBnbWFpbCBjb20+CisJICAqIHdpbjMyL3ZzOC9nc3QtcGx1Z2lucy1nb29kLnNsbjoKKwkgICogd2luMzIvdnM4L2xpYmdzdDEzOTQudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0YWFzaW5rLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGFsYXcudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0YWxwaGEudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0YWxwaGFjb2xvci52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3Rhbm5vZGV4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGFwZXRhZy52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RhdWRpb2Z4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGF1cGFyc2UudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0YXV0b2RldGVjdC52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RhdmkudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0Y2FjYXNpbmsudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0Y2Rpby52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RjdXR0ZXIudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0ZHYudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0ZWZmZWN0di52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RmbGFjLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGZseGRlYy52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3Rnb29tLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGljeWRlbXV4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGlkM2RlbXV4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGpwZWcudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0bGFkc3BhLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGxldmVsLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdG1hdHJvc2thLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdG1pa21vZC52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RtbmcudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0bW9ub3Njb3BlLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdG11bGF3LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdG11bHRpcGFydC52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RwbmcudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0cnRwLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHJ0c3AudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0c2hvdXQyLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHNtcHRlLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHNwZWV4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHRhZ2xpYi52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3R1ZHAudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0dmlkZW9iYWxhbmNlLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHZpZGVvYm94LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHZpZGVvZmxpcC52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3R2aWRlb21peGVyLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHdhdmVuYy52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3R3YXZwYXJzZS52Y3Byb2o6CisJICBNYWtlIGVuZC1vZi1saW5lIHJldHVybnMgdW5peHksIHNvIHRoYXQgd2hlbiB0aGUgZmlsZXMgYXJlIGNoZWNrZWQKKwkgIG91dCBvbiB3aW4zMiB0aGUgbGluZSByZXR1cm5zIHdpbGwgYmUgMGQgMGEgYW5kIG5vdCAwZCAwZCAwYS4KKwkgIEhvcGVmdWxseSBmaXhlcyAjMzY2NDkyLgorCisyMDA2LTExLTE0IDE1OjU1OjMyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IERpc2FibGUgaW5pdF9mcmFtZXMgZGVsYXkgdGltZXN0YW1wIGFkanVzdG1lbnQsIGl0IGRvZXMgbm90IHNlZW0gdG8gYmUgbmVlZGVkIGF0IGFsbC4gRml4ZXMgIzMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpOgorCSAgRGlzYWJsZSBpbml0X2ZyYW1lcyBkZWxheSB0aW1lc3RhbXAgYWRqdXN0bWVudCwgaXQgZG9lcyBub3QKKwkgIHNlZW0gdG8gYmUgbmVlZGVkIGF0IGFsbC4gRml4ZXMgIzM2OTYyMS4KKworMjAwNi0xMS0xNCAxMTo0Mzo0MCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBEb24ndCBwYXJzZSBleHRyYSBzYW1wbGUgcGFyYW1zIGZvciByYXcgcGNtLiBGaXhlcyAjMzc0OTE0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2dldF9kdXJhdGlvbiksCisJICAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgRG9uJ3QgcGFyc2UgZXh0cmEgc2FtcGxlIHBhcmFtcyBmb3IgcmF3IHBjbS4gRml4ZXMgIzM3NDkxNC4KKworMjAwNi0xMS0xMyAxODozMToxOCArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3QHNreW5ldC5iZT4KKworCSAgZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiBGaXggbWVtbGVhayBieSB1bnJlZidpbmcgY29sbGVjdHBhZHMgaW5zdGFuY2UgKHdoZW4gZmluYWxpemluZykKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE1hcmsgTmF1d2VsYWVydHMgIDxtYW5hdXcgYXQgc2t5bmV0IGJlPgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICAoZ3N0X3ZpZGVvbWl4ZXJfc2V0X21hc3Rlcl9nZW9tZXRyeSksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX3Npbmtfc2V0Y2FwcyksIChnc3RfdmlkZW9taXhlcl9jbGFzc19pbml0KSwKKwkgIChnc3RfdmlkZW9taXhlcl9jb2xsZWN0X2ZyZWUpLCAoZ3N0X3ZpZGVvbWl4ZXJfcmVzZXQpLAorCSAgKGdzdF92aWRlb21peGVyX2luaXQpLCAoZ3N0X3ZpZGVvbWl4ZXJfZmluYWxpemUpLAorCSAgKGdzdF92aWRlb21peGVyX3JlcXVlc3RfbmV3X3BhZCksIChnc3RfdmlkZW9taXhlcl9yZWxlYXNlX3BhZCksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfY29sbGVjdGVkKSwgKGdzdF92aWRlb21peGVyX2NoYW5nZV9zdGF0ZSk6CisJICBGaXggbWVtbGVhayBieSB1bnJlZidpbmcgY29sbGVjdHBhZHMgaW5zdGFuY2UgKHdoZW4gZmluYWxpemluZykKKwkgIEltcGxlbWVudCByZWxlYXNpbmcgYSByZXF1ZXN0IHBhZC4gRml4ZXMgIzM3NDQ3OS4KKworMjAwNi0xMS0xMCAyMDowODo0MiArMDAwMCAgU2VyZ2V5IFNjb2JpY2ggPHNlcmdleS5zY29iaWNoQGdtYWlsLmNvbT4KKworCSAgd2luMzIvdnM4LzogQWRkIFZTOCBwcm9qZWN0IGZpbGVzIChub3RlIHRoYXQgbWFueSBvZiB0aGUgcGx1Z2lucyBpbiBleHQgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQpLiBGaXhlcyAjMzY2NDkyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2VyZ2V5IFNjb2JpY2ggIDxzZXJnZXkuc2NvYmljaCBhdCBnbWFpbCBjb20+CisJICAqIHdpbjMyL3ZzOC9nc3QtcGx1Z2lucy1nb29kLnNsbjoKKwkgICogd2luMzIvdnM4L2xpYmdzdDEzOTQudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0YWFzaW5rLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGFsYXcudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0YWxwaGEudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0YWxwaGFjb2xvci52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3Rhbm5vZGV4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGFwZXRhZy52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RhdWRpb2Z4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGF1cGFyc2UudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0YXV0b2RldGVjdC52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RhdmkudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0Y2FjYXNpbmsudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0Y2Rpby52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RjdXR0ZXIudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0ZHYudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0ZWZmZWN0di52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RmbGFjLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGZseGRlYy52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3Rnb29tLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGljeWRlbXV4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGlkM2RlbXV4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGpwZWcudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0bGFkc3BhLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdGxldmVsLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdG1hdHJvc2thLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdG1pa21vZC52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RtbmcudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0bW9ub3Njb3BlLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdG11bGF3LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdG11bHRpcGFydC52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RwbmcudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0cnRwLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHJ0c3AudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0c2hvdXQyLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHNtcHRlLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHNwZWV4LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHRhZ2xpYi52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3R1ZHAudmNwcm9qOgorCSAgKiB3aW4zMi92czgvbGliZ3N0dmlkZW9iYWxhbmNlLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHZpZGVvYm94LnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHZpZGVvZmxpcC52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3R2aWRlb21peGVyLnZjcHJvajoKKwkgICogd2luMzIvdnM4L2xpYmdzdHdhdmVuYy52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3R3YXZwYXJzZS52Y3Byb2o6CisJICBBZGQgVlM4IHByb2plY3QgZmlsZXMgKG5vdGUgdGhhdCBtYW55IG9mIHRoZSBwbHVnaW5zIGluIGV4dCBhcmUKKwkgIGRpc2FibGVkIGJ5IGRlZmF1bHQpLiBGaXhlcyAjMzY2NDkyLgorCisyMDA2LTExLTEwIDE5OjE4OjMzICswMDAwICBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSAgZ3N0L211bHRpZmlsZS9NYWtlZmlsZS5hbTogTGV0J3Mgbm90IGRlcGVuZCBvbiBhIGZpbGUgdGhhdCBkb2Vzbid0IGV4aXN0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tdWx0aWZpbGUvTWFrZWZpbGUuYW06CisJICBMZXQncyBub3QgZGVwZW5kIG9uIGEgZmlsZSB0aGF0IGRvZXNuJ3QgZXhpc3QuCisKKzIwMDYtMTEtMTAgMTg6NTE6MTAgKzAwMDAgIERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisJICBSZXZpdmUgbXVsdGlmaWxlW3NyY3xzaW5rXS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9tdWx0aWZpbGUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlLmM6CisJICAqIGdzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgKiBnc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jOgorCSAgKiBnc3QvbXVsdGlmaWxlL211bHRpZmlsZS52cHJvajoKKwkgIFJldml2ZSBtdWx0aWZpbGVbc3JjfHNpbmtdLgorCisyMDA2LTExLTEwIDA4OjA5OjA1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogd2UgZG8gbm90IHRyYW5zbGF0ZSBkZWJ1ZyBtZXNzYWdlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX2dyYWJfZnJhbWUpOgorCSAgd2UgZG8gbm90IHRyYW5zbGF0ZSBkZWJ1ZyBtZXNzYWdlcworCisyMDA2LTExLTA4IDEyOjA0OjAzICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IGZpeCBjYXRlZ29yaXNhdGlvbiwgbWFrZSBzaG9ydCBkZXNjIG1vcmUgZXhwbGljaXQsIHJlbW92ZSB1bnVzZWQgY29kZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IChnc3RfZmx4ZGVjX2NsYXNzX2luaXQpOgorCSAgZml4IGNhdGVnb3Jpc2F0aW9uLCBtYWtlIHNob3J0IGRlc2MgbW9yZSBleHBsaWNpdCwgcmVtb3ZlIHVudXNlZCBjb2RlCisJICBGaXhlcyAjMzcyMDIxCisKKzIwMDYtMTEtMDggMDE6MzA6MzkgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSAgZ3N0L3J0cC86IEZpeCBlbGVtZW50IGRlc2NyaXB0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzoKKwkgIEZpeCBlbGVtZW50IGRlc2NyaXB0aW9ucy4KKworMjAwNi0xMS0wOCAwMToyOTo1MSArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJICBnc3QvcnRwLzogRml4IGRlc2NyaXB0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuYzogKGdzdF9ydHBfdm9yYmlzX3BheV9oYW5kbGVfYnVmZmVyKToKKwkgIEZpeCBkZXNjcmlwdGlvbi4KKwkgIFNtYWxsIGNsZWFudXAgaW4gdGhlIHBheWxvYWRlci4KKworMjAwNi0xMS0wOCAwMToyODowMCArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJICBnc3QvcnRwLzogQWRkIHRoZW9yYSBwYXkvZGVwYXlsb2FkZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHAvZ3N0cnRwLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYzogKGdzdF9ydHBfdGhlb3JhX2RlcGF5X2Jhc2VfaW5pdCksCisJICAoZ3N0X3J0cF90aGVvcmFfZGVwYXlfY2xhc3NfaW5pdCksIChnc3RfcnRwX3RoZW9yYV9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX3RoZW9yYV9kZXBheV9maW5hbGl6ZSksCisJICAoZ3N0X3J0cF90aGVvcmFfZGVwYXlfcGFyc2VfY29uZmlndXJhdGlvbiksCisJICAoZ3N0X3J0cF90aGVvcmFfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF90aGVvcmFfZGVwYXlfc3dpdGNoX2NvZGVib29rKSwKKwkgIChnc3RfcnRwX3RoZW9yYV9kZXBheV9wcm9jZXNzKSwKKwkgIChnc3RfcnRwX3RoZW9yYV9kZXBheV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfdGhlb3JhX2RlcGF5X2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF90aGVvcmFfZGVwYXlfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcnRwX3RoZW9yYV9kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHB0aGVvcmFwYXkuYzogKGdzdF9ydHBfdGhlb3JhX3BheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfdGhlb3JhX3BheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfdGhlb3JhX3BheV9pbml0KSwKKwkgIChnc3RfcnRwX3RoZW9yYV9wYXlfc2V0Y2FwcyksIChnc3RfcnRwX3RoZW9yYV9wYXlfcmVzZXRfcGFja2V0KSwKKwkgIChnc3RfcnRwX3RoZW9yYV9wYXlfaW5pdF9wYWNrZXQpLAorCSAgKGdzdF9ydHBfdGhlb3JhX3BheV9mbHVzaF9wYWNrZXQpLAorCSAgKGdzdF9ydHBfdGhlb3JhX3BheV9maW5pc2hfaGVhZGVycyksIChnc3RfcnRwX3RoZW9yYV9wYXlfcGFyc2VfaWQpLAorCSAgKGdzdF9ydHBfdGhlb3JhX3BheV9oYW5kbGVfYnVmZmVyKSwKKwkgIChnc3RfcnRwX3RoZW9yYV9wYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5oOgorCSAgQWRkIHRoZW9yYSBwYXkvZGVwYXlsb2FkZXJzLgorCisyMDA2LTExLTA3IDAxOjQzOjA2ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkgIGdzdC9ydHAvTWFrZWZpbGUuYW06IFdlIGRlcGVuZCBvbiBnc3R0YWcgdG8gZ2VuZXJhdGUgdGhlIHZvcmJpcyBjb21tZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgV2UgZGVwZW5kIG9uIGdzdHRhZyB0byBnZW5lcmF0ZSB0aGUgdm9yYmlzIGNvbW1lbnRzLgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmM6CisJICAoZ3N0X3J0cF92b3JiaXNfZGVwYXlfcGFyc2VfY29uZmlndXJhdGlvbiksCisJICAoZ3N0X3J0cF92b3JiaXNfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF92b3JiaXNfZGVwYXlfc3dpdGNoX2NvZGVib29rKSwKKwkgIChnc3RfcnRwX3ZvcmJpc19kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5oOgorCSAgUGFyc2UgY29uZmlndXJhdGlvbiBzdHJpbmcgaW4gdGhlIGRlcGF5bG9hZGVyLgorCSAgSW1wbGVtZW50IHNlbGVjdGluZyBhbmQgc3dpdGNoaW5nIHRvIGEgbmV3IGNvZGVib29rLgorCSAgUmVjZWl2aW5nIHZvcmJpcyBvdmVyIFJUUCBub3cgd29ya3MuCisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6IChnc3RfcnRwX3ZvcmJpc19wYXlfcmVzZXRfcGFja2V0KSwKKwkgIChnc3RfcnRwX3ZvcmJpc19wYXlfaW5pdF9wYWNrZXQpLAorCSAgKGdzdF9ydHBfdm9yYmlzX3BheV9maW5pc2hfaGVhZGVycyksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5oOgorCSAgU2V0IHRpbWVzdGFtcHMgb24gb3V0Z29pbmcgYnVmZmVycyBhbmQgUlRQIHBhY2tldHMuCisJICBGaXggY29uZmlndXJhdGlvbiBzdHJpbmcsIHByZXBlbmQgbnVtYmVyIG9mIFBhY2tldCBoZWFkZXJzLgorCSAgRml4IGVuY29kaW5nIG9mIGlkZW50IHN0cmluZy4KKwkgIEFkZCBkZWxpdmVyeS1tZXRob2QgdG8gY2Fwcy4KKwkgIFN0cmVhbWluZyB2b3JiaXMgb3ZlciBSVFAgbm93IHdvcmtzLgorCisyMDA2LTExLTA2IDIwOjUyOjEwICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkgIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5Lio6IEdlbmVyYXRlIGEgdmFsaWQgY29uZmlndXJhdGlvbiBzdHJpbmcgaW4gdGhlIGNhcHMgYmFzZWQgb24gdGhlIHZvcmJpcyBoZWFkZXJzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6IChnc3RfcnRwX3ZvcmJpc19wYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X2ZpbmlzaF9oZWFkZXJzKSwgKGdzdF9ydHBfdm9yYmlzX3BheV9wYXJzZV9pZCksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5oOgorCSAgR2VuZXJhdGUgYSB2YWxpZCBjb25maWd1cmF0aW9uIHN0cmluZyBpbiB0aGUgY2FwcyBiYXNlZCBvbiB0aGUKKwkgIHZvcmJpcyBoZWFkZXJzLgorCisyMDA2LTExLTAyIDIwOjEzOjI2ICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIEZpeCBlbnVtIG5pY2tzOyBvbmx5IGVtaXQgbm8tbW9yZS1wYWRzIG9uY2U7IGFkZCBzdXBwb3J0IGZvciB2ZXJ5IGZhc3QgZW5jb2RpbmcgbW9kZSBpbiB1cGNvbWluZyA0LjQwLjAgcmVsZWFzZSAoIzM2OS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW8gYXQgY2lyY3VsYXItY2hhb3Mub3JnPgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogKGdzdF93YXZwYWNrX2VuY19tb2RlX2dldF90eXBlKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfY29ycmVjdGlvbl9tb2RlX2dldF90eXBlKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfam9pbnRfc3RlcmVvX21vZGVfZ2V0X3R5cGUpLAorCSAgKGdzdF93YXZwYWNrX2VuY19pbml0KSwgKGdzdF93YXZwYWNrX2VuY19zZXRfd3BfY29uZmlnKToKKwkgIEZpeCBlbnVtIG5pY2tzOyBvbmx5IGVtaXQgbm8tbW9yZS1wYWRzIG9uY2U7IGFkZCBzdXBwb3J0IGZvciB2ZXJ5CisJICBmYXN0IGVuY29kaW5nIG1vZGUgaW4gdXBjb21pbmcgNC40MC4wIHJlbGVhc2UgKCMzNjk1MzkpLgorCisyMDA2LTExLTAyIDE0OjQzOjExICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvY2Rpby86IE1vdmUgQ0QtVEVYVCB1dGlsaXR5IGZ1bmN0aW9uIGludG8gY29tbW9uIGZpbGUgc28gaXQgY2FuIGFsc28gYmUgdXNlZCBieSBhIGZ1dHVyZSBjZGlvcGFyYW5vaWFzcmMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2NkaW8vZ3N0Y2Rpby5jOiAoZ3N0X2NkaW9fZ2V0X2NkdGV4dCk6CisJICAqIGV4dC9jZGlvL2dzdGNkaW8uaDoKKwkgICogZXh0L2NkaW8vZ3N0Y2Rpb2NkZGFzcmMuYzogKGdzdF9jZGlvX2NkZGFfc3JjX29wZW4pOgorCSAgTW92ZSBDRC1URVhUIHV0aWxpdHkgZnVuY3Rpb24gaW50byBjb21tb24gZmlsZSBzbyBpdCBjYW4gYWxzbyBiZQorCSAgdXNlZCBieSBhIGZ1dHVyZSBjZGlvcGFyYW5vaWFzcmMuCisKKzIwMDYtMTEtMDEgMTk6NDg6MjYgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogQ2hhbmdlTG9nOgorCSogc3lzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICBJbXByb3ZlZCBjb21tZW50cyBpbiBFTEVNRU5UX0VSUk9SL1dBUk5JTkcgYW5kIGFkZGVkICIjaWYgMCIgdG8geG92ZXJsYXkgY29kZSB0aGF0IGlzIHN0aWxsIG5vdCBpbXBsZW1lbnRlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgSW1wcm92ZWQgY29tbWVudHMgaW4gRUxFTUVOVF9FUlJPUi9XQVJOSU5HIGFuZCBhZGRlZCAiI2lmIDAiIHRvIHhvdmVybGF5IGNvZGUgdGhhdCBpcyBzdGlsbCBub3QgaW1wbGVtZW50ZWQuCisKKzIwMDYtMTEtMDEgMTM6NTk6NDkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiBXZSByZXF1aXJlIGEgLWJhc2UgbW9yZSByZWNlbnQgdGhhbiAwLjEwLjksIHNvIGl0J3Mgc2FmZSB0byB1c2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKHBhcnNlX3BpY3R1cmVfZnJhbWUpOgorCSAgV2UgcmVxdWlyZSBhIC1iYXNlIG1vcmUgcmVjZW50IHRoYW4gMC4xMC45LCBzbyBpdCdzIHNhZmUgdG8gdXNlCisJICBHU1RfVFlQRV9UQUdfSU1BR0VfVFlQRSB1bmNvbmRpdGlvbmFsbHkgbm93LgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19zaW5rX2V2ZW50KToKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdfZGVjX3NpbmtfZXZlbnQpOgorCSAgVXNlIF9uZXdzZWdtZW50X2Z1bGwoKSBub3cgdGhhdCB3ZSBkZXBlbmQgb24gYSByZWNlbnQgZW5vdWdoIGNvcmUuCisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgUmVtb3ZlIGNydWZ0IHRoYXQgd2UgZG9uJ3QgbmVlZCBhbnkgbG9uZ2VyIG5vdyB0aGF0IHdlIGRlcGVuZCBvbgorCSAgYSByZWNlbnQgZW5vdWdoIC1iYXNlLgorCisyMDA2LTExLTAxIDEwOjE5OjE4ICswMDAwICBTZXJnZXkgU2NvYmljaCA8c2VyZ2V5LnNjb2JpY2hAZ21haWwuY29tPgorCisJICBzeXMvOiBXYWl0IHVudGlsIHRoZSB3aW5kb3cgaXMgY3JlYXRlZCBiZWZvcmUgdXNpbmcgaXQ7IGd1YXJkIHVuaXN0ZC5oIGluY2x1ZGVzIHdpdGggSEFWRV9VTklTVERfSC4gKCMzNjY1MjMpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZXJnZXkgU2NvYmljaCAgPHNlcmdleSBkb3Qgc2NvYmljaCBhdCBnbWFpbCBjb20+CisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6CisJICAoZ3N0X2RpcmVjdGRyYXdzaW5rX3dpbmRvd190aHJlYWQpLAorCSAgKGdzdF9kaXJlY3RkcmF3c2lua19jcmVhdGVfZGVmYXVsdF93aW5kb3cpOgorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5oOgorCSAgKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBXYWl0IHVudGlsIHRoZSB3aW5kb3cgaXMgY3JlYXRlZCBiZWZvcmUgdXNpbmcgaXQ7IGd1YXJkIHVuaXN0ZC5oCisJICBpbmNsdWRlcyB3aXRoIEhBVkVfVU5JU1REX0guICgjMzY2NTIzKQorCSAgKiB3aW4zMi92czgvbGliZ3N0ZGlyZWN0ZHJhdy52Y3Byb2o6CisJICAqIHdpbjMyL3ZzOC9saWJnc3RkaXJlY3Rzb3VuZC52Y3Byb2o6CisJICBVcGRhdGUgcHJvamVjdCBmaWxlcy4KKworMjAwNi0xMC0zMSAxMDo1MjozMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEZpeCBhbmQgYWN0aXZhdGUgSUxCQyBwYXkgYW5kIGRlcGF5bG9hZGVycy4gRml4ZXMgIzM2ODE2Mi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwL2dzdHJ0cC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzogKGdzdF9ydHBpbGJjcGF5X2luaXQpLAorCSAgKGdzdF9ydHBpbGJjcGF5X3NldGNhcHMpOgorCSAgRml4IGFuZCBhY3RpdmF0ZSBJTEJDIHBheSBhbmQgZGVwYXlsb2FkZXJzLiBGaXhlcyAjMzY4MTYyLgorCisyMDA2LTEwLTMxIDEwOjMxOjE4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEhhbmRsZSB1bmJvdW5kZWQgbGVuZ3RoIHN0cmVhbXMgYSBiaXQgYmV0dGVyLiBGaXhlcyAjMzY3Njk2LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2dldF9kdXJhdGlvbiksCisJICAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChxdGRlbXV4X3BhcnNlX3RyZWUpLAorCSAgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBIYW5kbGUgdW5ib3VuZGVkIGxlbmd0aCBzdHJlYW1zIGEgYml0IGJldHRlci4gRml4ZXMgIzM2NzY5Ni4KKworMjAwNi0xMC0zMSAwOTo0NDozOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IFNvbWUgc21hbGwgY2xlYW51cHMsIHVzZSBfc2NhbGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IChzcGVleF9kZWNfY29udmVydCksCisJICAoc3BlZXhfZGVjX3NpbmtfZXZlbnQpLCAoc3BlZXhfZGVjX2NoYWluX3BhcnNlX2hlYWRlcik6CisJICBTb21lIHNtYWxsIGNsZWFudXBzLCB1c2UgX3NjYWxlLgorCisyMDA2LTEwLTMxIDA5OjI5OjM2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IFVzZSBoaWdoZXIgcHJlY2lzaW9uIHNjYWxlIGZ1bmN0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSk6CisJICBVc2UgaGlnaGVyIHByZWNpc2lvbiBzY2FsZSBmdW5jdGlvbi4KKworMjAwNi0xMC0zMCAxNjoxODoxOCArMDAwMCAgTWljaGFsIEJlbmVzIDxtaWNoYWwuYmVuZXNAaXRvbmlzLnR2PgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogRml4IHNldmVyYWwgaXNzdWVzIHdpdGggZW5jb2RlZC9jb21wcmVzc2VkL2VuY3J5cHRlZC9zaWduZWQgdHJhY2tzOyBhbHNvLCByZW1vdmUgc3VwZXIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE1pY2hhbCBCZW5lcyAgPG1pY2hhbCBkb3QgYmVuZXMgYXQgaXRvbmlzIHR2PgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9lbmNvZGluZ19jbXApLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9yZWFkX3RyYWNrX2VuY29kaW5ncyksCisJICAoZ3N0X21hdHJvc2thX2RlY29kZV9idWZmZXIpOgorCSAgRml4IHNldmVyYWwgaXNzdWVzIHdpdGggZW5jb2RlZC9jb21wcmVzc2VkL2VuY3J5cHRlZC9zaWduZWQgdHJhY2tzOworCSAgYWxzbywgcmVtb3ZlIHN1cGVyZmx1b3VzIG5ld2xpbmUgY2hhcmFjdGVycyBmcm9tIHNvbWUgZGVidWcKKwkgIHN0YXRlbWVudHMuICgjMzY2MTU1KQorCisyMDA2LTEwLTMwIDA5OjI0OjUzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvanBlZy86IFZhcmlvdXMgY2xlYW51cHMsIGNhcHNuZWdvIGFuZCBsZWFrIGZpeGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzogKGdzdF9qcGVnZW5jX2dldGNhcHMpOgorCSAgKiBleHQvanBlZy9nc3RzbW9rZWRlYy5jOiAoZ3N0X3Ntb2tlZGVjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zbW9rZWRlY19pbml0KSwgKGdzdF9zbW9rZWRlY19maW5hbGl6ZSksIChnc3Rfc21va2VkZWNfY2hhaW4pLAorCSAgKGdzdF9zbW9rZWRlY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvanBlZy9nc3RzbW9rZWVuYy5jOiAoZ3N0X3Ntb2tlZW5jX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zbW9rZWVuY19pbml0KSwgKGdzdF9zbW9rZWVuY19maW5hbGl6ZSksCisJICAoZ3N0X3Ntb2tlZW5jX2dldGNhcHMpLCAoZ3N0X3Ntb2tlZW5jX3NldGNhcHMpLAorCSAgKGdzdF9zbW9rZWVuY19yZXN5bmMpLCAoZ3N0X3Ntb2tlZW5jX2NoYWluKSwKKwkgIChnc3Rfc21va2VlbmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9zbW9rZWVuY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9zbW9rZWVuY19jaGFuZ2Vfc3RhdGUpOgorCSAgVmFyaW91cyBjbGVhbnVwcywgY2Fwc25lZ28gYW5kIGxlYWsgZml4ZXMuCisKKzIwMDYtMTAtMzAgMDg6MTc6MDggKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hbmF1d0Bza3luZXQuYmU+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogRml4IHZpZGVvbWl4ZXIgc28gdGhhdCBpdCBjYW4gaGFuZGxlIGFueSBjb21iaW5hdGlvbiBvZiBmcmFtZXJhdGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyAgPG1hbmF1dyBhdCBza3luZXQgYmU+CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogKGdzdF92aWRlb21peGVyX3VwZGF0ZV9xdWV1ZXMpOgorCSAgRml4IHZpZGVvbWl4ZXIgc28gdGhhdCBpdCBjYW4gaGFuZGxlIGFueSBjb21iaW5hdGlvbiBvZiBmcmFtZXJhdGVzLgorCSAgRml4ZXMgIzM2NzIyMS4KKworMjAwNi0xMC0yOCAxNjozNzoyMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBGaXggcG9zaXRpb24gcXVlcnkgZm9yIGF1ZGlvLiBhbHNvIGZpeGVzIHRpbWVzdGFtcHMgaW4gc3RyZWFtaW5nIG1vZGUgYW5kIGJ1ZyAjMzY0OTU4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9maWxlX2hlYWRlciksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5pdF9wdXNoKSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVzaCksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKSwKKwkgIChnc3RfYXZpX2RlbXV4X2NoYWluKToKKwkgIEZpeCBwb3NpdGlvbiBxdWVyeSBmb3IgYXVkaW8uIGFsc28gZml4ZXMgdGltZXN0YW1wcyBpbiBzdHJlYW1pbmcKKwkgIG1vZGUgYW5kIGJ1ZyAjMzY0OTU4LgorCSAgU21hbGwgY2xlYW51cHMuCisKKzIwMDYtMTAtMjcgMTc6MTA6NDIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZW5jLio6IEZpeCBzdHJpZGVzLiBGaXhlcyAjMzY0ODU2LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6IChnc3RfcG5nZW5jX3NldGNhcHMpLCAoZ3N0X3BuZ2VuY19jaGFpbik6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmg6CisJICBGaXggc3RyaWRlcy4gRml4ZXMgIzM2NDg1Ni4KKwkgIENsZWFudXAgY2Fwc25lZ28uCisJICBTZXQgY2FwcyBvbiBvdXRnb2luZyBidWZmZXJzLgorCisyMDA2LTEwLTE4IDE3OjA2OjIxICswMDAwICBWaWxsZSBTeXJqYWxhIDx2aWxsZS5zeXJqYWxhQG1vdmlhbC5maT4KKworCSAgZ3N0L3J0cC86IEFkZCBzdGF0aWMgcGF5bG9hZCBudW1iZXJzIGluIGFkZGl0aW9uIHRvIHRoZSBkeW5hbWljIG9uZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBWaWxsZSBTeXJqYWxhIDx2aWxsZSBkb3Qgc3lyamFsYSBhdCBtb3ZpYWwgZG90IGZpPgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hcGF5LmM6IChnc3RfcnRwX3BjbWFfcGF5X2ZsdXNoKSwKKwkgIChnc3RfcnRwX3BjbWFfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzogKGdzdF9ydHBfcGNtdV9wYXlfZmx1c2gpOgorCSAgQWRkIHN0YXRpYyBwYXlsb2FkIG51bWJlcnMgaW4gYWRkaXRpb24gdG8gdGhlIGR5bmFtaWMgb25lcy4KKwkgIEZpeGVzICMzNjE2MzkuCisKKzIwMDYtMTAtMTggMTY6MTg6NTUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwLzogUmV1c2UgYWxyZWFkeSBleGlzdGluZyBlbnVtIGZvciBsb3dlciB0cmFuc3BvcnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BfbG93ZXJfdHJhbnNfZ2V0X3R5cGUpLAorCSAgKGdzdF9ydHNwc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3J0c3BzcmNfbG9vcF9pbnRlcmxlYXZlZCksCisJICAoZ3N0X3J0c3BzcmNfbG9vcF91ZHApLCAoZ3N0X3J0c3BzcmNfb3BlbiksCisJICAoZ3N0X3J0c3BzcmNfdXJpX2dldF9wcm90b2NvbHMpLCAoZ3N0X3J0c3BzcmNfdXJpX3NldF91cmkpOgorCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiAocnRzcF9jb25uZWN0aW9uX2NyZWF0ZSk6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmg6CisJICAqIGdzdC9ydHNwL3J0c3B1cmwuYzogKHJ0c3BfdXJsX3BhcnNlKToKKwkgICogZ3N0L3J0c3AvcnRzcHVybC5oOgorCSAgUmV1c2UgYWxyZWFkeSBleGlzdGluZyBlbnVtIGZvciBsb3dlciB0cmFuc3BvcnQuCisJICBBZGQgcnRzcHQgYW5kIHJ0c3B1IHByb3RvY29scy4KKwkgIFNlbmQgcmVkaXJlY3QgdG8gcnRzcHQgd2hlbiB1ZHAgdGltZXMgb3V0LgorCisyMDA2LTEwLTE4IDE0OjAwOjQ0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogRml4IHNlZWtpbmcgc29tZSBtb3JlLCBtb3N0bHkgZm9yIHNwZWVkIGNoYW5nZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpOgorCSAgRml4IHNlZWtpbmcgc29tZSBtb3JlLCBtb3N0bHkgZm9yIHNwZWVkIGNoYW5nZXMuCisKKzIwMDYtMTAtMTggMTE6Mjg6MDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIENoYW5nZUxvZzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5OiBmaXggRnJlZHJpaydzIGUtbWFpbCBhZGRyZXNzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5OiBmaXggRnJlZHJpaydzIGUtbWFpbCBhZGRyZXNzCisKKzIwMDYtMTAtMTggMTE6MDQ6MDkgKzAwMDAgIEZyZWRyaWsgUGVyc3NvbiA8ZnJlcGVAYnJvYWRiYW5kLm5ldD4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLio6IEZpeCBfc2V0X2NoYW5uZWwoKTogcmVtb3ZlIHVzZWxlc3MgZ19vYmplY3Rfbm90aWZ5KCkgZm9yICJjaGFubmVsIiBwcm9wZXJ0eSB0aGF0IGRvZXNuJ3QgZXhpLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBGcmVkcmlrIFBlcnNzb24gIDxmcmVwZSBhdCBicm9hZGJhbmQgbmV0PgorCSAgKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuYzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmg6CisJICBGaXggX3NldF9jaGFubmVsKCk6IHJlbW92ZSB1c2VsZXNzIGdfb2JqZWN0X25vdGlmeSgpIGZvciAiY2hhbm5lbCIKKwkgIHByb3BlcnR5IHRoYXQgZG9lc24ndCBleGlzdCBhbnkgbG9uZ2VyIGFuZCB0aGVyZWZvcmUgbm93IGFsc28KKwkgIHVzZWxlc3MgcmVkaXJlY3QgKCMzMzg4MTgpLgorCisyMDA2LTEwLTE3IDE1OjE2OjQ3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBBY3RpdmF0ZSBwYWRzIGJlZm9yZSBhZGRpbmcgdGhlbSB0byBydW5uaW5nIGVsZW1lbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOiAoZ3N0X3dhdnBhY2tfZW5jX3NldF93cF9jb25maWcpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9jcmVhdGVfc3JjX3BhZCk6CisJICAqIGdzdC9udXZkZW11eC9nc3RudXZkZW11eC5jOiAoZ3N0X251dl9kZW11eF9jcmVhdGVfcGFkcyk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2twYXJzZS5jOiAod2F2cGFja3BhcnNlX2ZvdW5kX3BhZCk6CisJICBBY3RpdmF0ZSBwYWRzIGJlZm9yZSBhZGRpbmcgdGhlbSB0byBydW5uaW5nIGVsZW1lbnQuCisKKzIwMDYtMTAtMTcgMTQ6NTc6MTcgKzAwMDAgIEpvc2VwIFRvcnJhIFZhbGxlcyA8am9zZXBAZmx1ZW5kby5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogTWFrZSBjb21waWxlIHdpdGggRm9ydGUgY29tcGlsZXIsIG1vc3RseSBkb24ndCBkbyBwb2ludGVyIGFyaXRobWV0aWMgd2l0aCB2b2lkIHBvaW50ZXJzICgjMzYyNi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSm9zZXAgVG9ycmEgVmFsbGVzICA8am9zZXAgYXQgZmx1ZW5kbyBjb20+CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2hhbmRsZV9zaW5rX2V2ZW50KSwKKwkgIChuZXh0X2VudHJ5X3NpemUpLCAocXRkZW11eF9pbmZsYXRlKSwgKHF0ZGVtdXhfcGFyc2VfbW9vdiksCisJICAocXRkZW11eF9wYXJzZV90cmVlKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayksIChxdGRlbXV4X3RhZ19hZGRfc3RyKSwKKwkgIChxdGRlbXV4X3RhZ19hZGRfbnVtKSwgKHF0ZGVtdXhfdGFnX2FkZF9kYXRlKSwKKwkgIChxdGRlbXV4X3RhZ19hZGRfZ25yZSk6CisJICBNYWtlIGNvbXBpbGUgd2l0aCBGb3J0ZSBjb21waWxlciwgbW9zdGx5IGRvbid0IGRvIHBvaW50ZXIgYXJpdGhtZXRpYworCSAgd2l0aCB2b2lkIHBvaW50ZXJzICgjMzYyNjI2KS4KKworMjAwNi0xMC0xNyAxNDozNzo0OSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgc3lzL29zcy9nc3Rvc3NzaW5rLmM6IFNvbWUgZHJpdmVycyBkbyBub3Qgc3VwcG9ydCB1bnNldHRpbmcgdGhlIG5vbi1ibG9ja2luZyBmbGFnIG9uY2UgdGhlIGRldmljZSBpcyBvcGVuZWQuIEluIHRob3NlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3NzX3NpbmtfcHJlcGFyZSk6CisJICBTb21lIGRyaXZlcnMgZG8gbm90IHN1cHBvcnQgdW5zZXR0aW5nIHRoZSBub24tYmxvY2tpbmcgZmxhZyBvbmNlIHRoZQorCSAgZGV2aWNlIGlzIG9wZW5lZC4gSW4gdGhvc2UgY2FzZXMsIGNsb3NlL29wZW4gdGhlIGRldmljZSBpbgorCSAgbm9uLWJsb2NraW5nIG1vZGUuIEZpeGVzICMzNjI2NzMuCisKKzIwMDYtMTAtMTcgMTM6NDQ6MTQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgc3lzL3Y0bDIvOiBkZWFyIHN0ZWZhbiwgZnJhbWVzcGVyc2Vjb25kIGlzIG5vdCBmcmFtZXBlcmlvZCwgcmV2ZXJ0aW5nIGJ1dCBhZGRpbmcgY29tbWVudAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogKGdzdF92NGwyX2ZpbGxfbGlzdHMpOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19zZXRfZnBzKSwKKwkgIChnc3RfdjRsMnNyY19nZXRfZnBzKToKKwkgIGRlYXIgc3RlZmFuLCBmcmFtZXNwZXJzZWNvbmQgaXMgbm90IGZyYW1lcGVyaW9kLCByZXZlcnRpbmcgYnV0IGFkZGluZworCSAgY29tbWVudAorCisyMDA2LTEwLTE3IDExOjI4OjUwICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHN5cy92NGwyLzogTnVtZXJhdG9yIGlzIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3IgaXMgZGVub21pbmF0b3IuIFNheSB0aGF0IGFsb3VkIDUgdGltZXMgYW5kIHJldHJ5IGFmdGVyIG5leHQgYmVlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6IChnc3RfdjRsMl9maWxsX2xpc3RzKToKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfc2V0X2ZwcyksCisJICAoZ3N0X3Y0bDJzcmNfZ2V0X2Zwcyk6CisJICBOdW1lcmF0b3IgaXMgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciBpcyBkZW5vbWluYXRvci4gU2F5IHRoYXQgYWxvdWQKKwkgIDUgdGltZXMgYW5kIHJldHJ5IGFmdGVyIG5leHQgYmVlci4KKworMjAwNi0xMC0xNyAxMDo1OTo1NSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC4qOiBBdm9pZCB2b2lkIHBvaW50ZXIgdXNhZ2UsIGJldHRlciB1c2UgZ3VpbnQ4ICogaW5zdGVhZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlX21vb3YpLCAocXRkZW11eF9wYXJzZSksCisJICAocXRkZW11eF9ub2RlX2R1bXBfZm9yZWFjaCksIChxdGRlbXV4X2R1bXBfbXZoZCksCisJICAocXRkZW11eF9kdW1wX3RraGQpLCAocXRkZW11eF9kdW1wX2Vsc3QpLCAocXRkZW11eF9kdW1wX21kaGQpLAorCSAgKHF0ZGVtdXhfZHVtcF9oZGxyKSwgKHF0ZGVtdXhfZHVtcF92bWhkKSwgKHF0ZGVtdXhfZHVtcF9kcmVmKSwKKwkgIChxdGRlbXV4X2R1bXBfc3RzZCksIChxdGRlbXV4X2R1bXBfc3R0cyksIChxdGRlbXV4X2R1bXBfc3RzcyksCisJICAocXRkZW11eF9kdW1wX3N0c2MpLCAocXRkZW11eF9kdW1wX3N0c3opLCAocXRkZW11eF9kdW1wX3N0Y28pLAorCSAgKHF0ZGVtdXhfZHVtcF9jbzY0KSwgKHF0ZGVtdXhfZHVtcF9kY29tKSwgKHF0ZGVtdXhfZHVtcF9jbXZkKSwKKwkgIChxdGRlbXV4X2R1bXBfdW5rbm93biksIChxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUpLAorCSAgKHF0ZGVtdXhfdHJlZV9nZXRfc2libGluZ19ieV90eXBlKToKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSAgQXZvaWQgdm9pZCBwb2ludGVyIHVzYWdlLCBiZXR0ZXIgdXNlIGd1aW50OCAqIGluc3RlYWQuCisKKzIwMDYtMTAtMTYgMTg6MjI6NDcgKzAwMDAgIEpvc2VwIFRvcnJhIFZhbGxlcyA8am9zZXBAZmx1ZW5kby5jb20+CisKKwkgIEZpeCBhIGJ1bmNoIG9mIHByb2JsZW1zIGRpc2NvdmVyZWQgYnkgdGhlIEZvcnRlIGNvbXBpbGVyLCBtb3N0bHkgdHlwZSBtaXh1cHMgYW5kIHBvaW50ZXIgYXJpdGhtZXRpY3Mgd2l0aCB2b2lkIHBvaW50ZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSm9zZXAgVG9ycmEgVmFsbGVzICA8am9zZXAgYXQgZmx1ZW5kbyBjb20+CisJICAqIGV4dC9jYWlyby9nc3R0aW1lb3ZlcmxheS5jOiAoZ3N0X2NhaXJvX3RpbWVfb3ZlcmxheV90cmFuc2Zvcm0pOgorCSAgKiBleHQvZXNkL2VzZHNpbmsuYzogKGdzdF9lc2RzaW5rX3dyaXRlKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX2xlbmd0aCksCisJICAoZ3N0X2ZsYWNfZGVjX3JlYWRfc2Vla2FibGUpLCAoZ3N0X2ZsYWNfZGVjX2NoYWluKSwKKwkgIChnc3RfZmxhY19kZWNfc2VuZF9uZXdzZWdtZW50KToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOiAoZ3N0X2ZsYWNfZW5jX3NlZWtfY2FsbGJhY2spLAorCSAgKGdzdF9mbGFjX2VuY190ZWxsX2NhbGxiYWNrKToKKwkgICogZXh0L2pwZWcvc21va2Vjb2RlYy5jOiAoZmluZF9iZXN0X3NpemUpLCAoc21va2Vjb2RlY19lbmNvZGUpLAorCSAgKHNtb2tlY29kZWNfcGFyc2VfaGVhZGVyKSwgKHNtb2tlY29kZWNfZGVjb2RlKToKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmlfbXV4X3dyaXRlX2F2aXhfaW5kZXgpOgorCSAgKiBnc3QvZGVidWcvZWZlbmNlLmM6IChnc3RfZmVuY2VkX2J1ZmZlcl9hbGxvYyk6CisJICAqIGdzdC9nb29tL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJICAqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOiAoZ3N0X2ljeWRlbXV4X3R5cGVmaW5kX29yX2ZvcndhcmQpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fcmVhZCk6CisJICAqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcnRyYWNrLmg6CisJICBGaXggYSBidW5jaCBvZiBwcm9ibGVtcyBkaXNjb3ZlcmVkIGJ5IHRoZSBGb3J0ZSBjb21waWxlciwgbW9zdGx5IHR5cGUKKwkgIG1peHVwcyBhbmQgcG9pbnRlciBhcml0aG1ldGljcyB3aXRoIHZvaWQgcG9pbnRlcnMuIEZpeGVzICMzNjI2MDMuCisKKzIwMDYtMTAtMTIgMTk6MDI6NTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9zcGVleC86IE1pc2NlbGxhbmVvdXMgY2xlYW4tdXBzLCBhbW9uZyBvdGhlciB0aGluZ3M6IHNwZWV4ZW5jID0+IGVuYyB0byBlbmhhbmNlIGNvZGUgcmVhZGFiaWxpdHk7IGNoYW5nZSBzcGVleGVuYy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleF9lbmNfZ2V0X2Zvcm1hdHMpLAorCSAgKGdzdF9zcGVleF9lbmNfc2V0dXBfaW50ZXJmYWNlcyksIChnc3Rfc3BlZXhfZW5jX2Jhc2VfaW5pdCksCisJICAoZ3N0X3NwZWV4X2VuY19jbGFzc19pbml0KSwgKGdzdF9zcGVleF9lbmNfZmluYWxpemUpLAorCSAgKGdzdF9zcGVleF9lbmNfc2lua19zZXRjYXBzKSwgKGdzdF9zcGVleF9lbmNfY29udmVydF9zcmMpLAorCSAgKGdzdF9zcGVleF9lbmNfY29udmVydF9zaW5rKSwgKGdzdF9zcGVleF9lbmNfZ2V0X3F1ZXJ5X3R5cGVzKSwKKwkgIChnc3Rfc3BlZXhfZW5jX3NyY19xdWVyeSksIChnc3Rfc3BlZXhfZW5jX3NpbmtfcXVlcnkpLAorCSAgKGdzdF9zcGVleF9lbmNfaW5pdCksIChnc3Rfc3BlZXhfZW5jX2NyZWF0ZV9tZXRhZGF0YV9idWZmZXIpLAorCSAgKGdzdF9zcGVleF9lbmNfc2V0X2xhc3RfbXNnKSwgKGdzdF9zcGVleF9lbmNfc2V0dXApLAorCSAgKGdzdF9zcGVleF9lbmNfYnVmZmVyX2Zyb21fZGF0YSksIChnc3Rfc3BlZXhfZW5jX3B1c2hfYnVmZmVyKSwKKwkgIChnc3Rfc3BlZXhfZW5jX3NldF9oZWFkZXJfb25fY2FwcyksIChnc3Rfc3BlZXhfZW5jX3NpbmtldmVudCksCisJICAoZ3N0X3NwZWV4X2VuY19jaGFpbiksIChnc3Rfc3BlZXhfZW5jX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3NwZWV4X2VuY19zZXRfcHJvcGVydHkpLCAoZ3N0X3NwZWV4X2VuY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuaDoKKwkgIE1pc2NlbGxhbmVvdXMgY2xlYW4tdXBzLCBhbW9uZyBvdGhlciB0aGluZ3M6IHNwZWV4ZW5jID0+IGVuYyB0bworCSAgZW5oYW5jZSBjb2RlIHJlYWRhYmlsaXR5OyBjaGFuZ2Ugc3BlZXhlbmMgPT4gc3BlZXhfZW5jOyBpbiBjaGFpbgorCSAgZnVuY3Rpb24gdW5yZWYgaW5wdXQgYnVmZmVyIGluIGNhc2Ugb2YgZXJyb3I7IHRha2UgcmVmZXJlbmNlIGluCisJICBldmVudCBmdW5jdGlvbjsgdXNlIGJvaWxlcnBsYXRlIG1hY3JvOyB1c2UgZ3N0X3BhZF9xdWVyeV9wZWVyXyoKKwkgIGNvbnZlbmllbmNlIGZ1bmN0aW9ucy4KKworMjAwNi0xMC0xMiAxODozNToxMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IEZpeCBzb21lIG1lbSBsZWFrcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleGVuY19maW5hbGl6ZSksCisJICAoZ3N0X3NwZWV4ZW5jX3NldF9sYXN0X21zZyksIChnc3Rfc3BlZXhlbmNfc2V0dXApLAorCSAgKGdzdF9zcGVleGVuY19zZXRfaGVhZGVyX29uX2NhcHMpOgorCSAgRml4IHNvbWUgbWVtIGxlYWtzLgorCisyMDA2LTEwLTExIDE2OjIxOjUzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9VUkxTOiBBZGRlZCBzb21lIG90aGVyIFVSTC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9VUkxTOgorCSAgQWRkZWQgc29tZSBvdGhlciBVUkwuCisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2xvb3BfdWRwKSwKKwkgIChnc3RfcnRzcHNyY19oYW5kbGVfcmVxdWVzdCksIChnc3RfcnRzcHNyY19zZW5kKSwKKwkgIChnc3RfcnRzcHNyY19vcGVuKSwgKGdzdF9ydHNwc3JjX3BsYXkpLAorCSAgKGdzdF9ydHNwc3JjX2hhbmRsZV9tZXNzYWdlKSwgKGdzdF9ydHNwc3JjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIFdvcmsgb24gZmFsbGJhY2sgdG8gVENQIGNvbm5lY3Rpb24gd2hlbiB0aGUgVURQIHNvY2tldCB0aW1lcyBvdXQuCisJICBIYW5kbGVyIHNlcnZlciByZXF1ZXN0cywganVzdCByZXBseSB3aXRoIE9LIGZvciBub3cuCisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmM6IChydHNwX3N0cnJlc3VsdCk6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmg6CisJICBBZGRlZCBzb21lIG1vcmUgUmVhbCBleHRlbnNpb24gaGVhZGVycy4KKwkgICogZ3N0L3J0c3AvcnRzcHVybC5jOiAocnRzcF91cmxfcGFyc2UpOgorCSAgRml4IHBhcnNpbmcgb2YgdXJscyB3aXRoIGEgJzonIHRoYXQgaXMgbm90IHBhcnQgb2YgdGhlIGhvc3RuYW1lOnBvcnQKKwkgIHBhcnQgb2YgdGhlIHVybC4KKworMjAwNi0xMC0xMSAxMzo0OToyNiArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgc29tZSBmb3VyY2MgZm9yIERWIGZvcm1hdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3ZpZGVvX2NhcHMpOgorCSAgQWRkIHNvbWUgZm91cmNjIGZvciBEViBmb3JtYXQuCisKKzIwMDYtMTAtMTEgMTM6MjQ6NDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC86IEFjdGl2YXRlIHBhZCBiZWZvcmUgYWRkaW5nIGl0IHRvIHRoZSBhbHJlYWR5LXJ1bm5pbmcgZWxlbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXBldGFnL2dzdHRhZ2RlbXV4LmM6IChnc3RfdGFnX2RlbXV4X2FkZF9zcmNwYWQpOgorCSAgKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzogKGdzdF9pY3lkZW11eF9hZGRfc3JjcGFkKToKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfYWRkX3NyY3BhZCk6CisJICBBY3RpdmF0ZSBwYWQgYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgYWxyZWFkeS1ydW5uaW5nIGVsZW1lbnQuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ljeWRlbXV4LmM6IChpY3lkZW11eF9mb3VuZF9wYWQpOgorCSAgQWN0aXZhdGUgbmV3bHktY3JlYXRlZCBwYWQgdG9vLgorCisyMDA2LTEwLTExIDA4OjM0OjE0ICswMDAwICBTZWJhc3RpZW4gQ290ZSA8c2ViYXM2NDJAeWFob28uY2E+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IEZpeCBzb21lIGxlYWtzIGluIGNhcHMgYW5kIHVyaXMuIEZpeGVzICMzNjEyNTIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpZW4gQ290ZSA8c2ViYXM2NDIgYXQgeWFob28gZG90IGNhPgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfdWRwc3JjX2ZpbmFsaXplKSwgKGdzdF91ZHBzcmNfY3JlYXRlKSwgKGdzdF91ZHBzcmNfc2V0X3VyaSksCisJICAoZ3N0X3VkcHNyY19zdGFydCk6CisJICBGaXggc29tZSBsZWFrcyBpbiBjYXBzIGFuZCB1cmlzLiBGaXhlcyAjMzYxMjUyLgorCisyMDA2LTEwLTEwIDE4OjU0OjA1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFByaW50ZiBmb3JtYXQgZml4ZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZXh0cmFjdF9pbml0aWFsX2xlbmd0aF9hbmRfZm91cmNjKSwKKwkgIChnc3RfcXRkZW11eF9sb29wX3N0YXRlX2hlYWRlcik6CisJICBQcmludGYgZm9ybWF0IGZpeGVzLgorCSAgKiBzeXMvZHZiL2dzdGR2YnNyYy5jOgorCSAgVXNlICJfc3RkaW50LmgiLgorCisyMDA2LTEwLTEwIDA5OjU3OjE5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFJlb3JnYW5pc2Ugc29tZSBzdHVmZi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9pbml0KSwKKwkgIChnc3RfcXRkZW11eF9wdXNoX2V2ZW50KSwgKGdzdF9xdGRlbXV4X2RvX3NlZWspLAorCSAgKGdzdF9xdGRlbXV4X2NoYW5nZV9zdGF0ZSksIChleHRyYWN0X2luaXRpYWxfbGVuZ3RoX2FuZF9mb3VyY2MpLAorCSAgKGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfaGVhZGVyKSwgKGdzdF9xdGRlbXV4X2FjdGl2YXRlX3NlZ21lbnQpLAorCSAgKGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfbW92aWUpLCAoZ3N0X3F0ZGVtdXhfbG9vcCksCisJICAoZ3N0X3F0ZGVtdXhfcG9zdF9idWZmZXJpbmcpLCAoZ3N0X3F0ZGVtdXhfY2hhaW4pLAorCSAgKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pLCAocXRkZW11eF9wcm9jZXNzX3JlZGlyZWN0cyksCisJICAocXRkZW11eF9wYXJzZV90cmVlKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBSZW9yZ2FuaXNlIHNvbWUgc3R1ZmYuCisJICBQYXJzZSBSVFNQIHJlZGlyZWN0aW9uIFVSTFMuCisKKzIwMDYtMTAtMTAgMDg6Mjk6MDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9NYWtlZmlsZS5hbTogRml4IGNvcHknbidwYXN0ZS1vIChzcG90dGVkIGJ5IE1hcmsgTmF1d2VsYWVydHMsICMzNDE0ODkpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9NYWtlZmlsZS5hbToKKwkgIEZpeCBjb3B5J24ncGFzdGUtbyAoc3BvdHRlZCBieSBNYXJrIE5hdXdlbGFlcnRzLCAjMzQxNDg5KS4KKworMjAwNi0xMC0wOSAwNzowMToxOSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS4qOiBGaXggYnVpbGQgYXMgcGVyIHRoZSBwYXRjaCBpbiAjMzM4ODE4IGNvbW1lbnQgMzYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnhvdmVybGF5LmM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS5oOgorCSAgRml4IGJ1aWxkIGFzIHBlciB0aGUgcGF0Y2ggaW4gIzMzODgxOCBjb21tZW50IDM2LgorCisyMDA2LTEwLTA4IDIwOjA1OjEzICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJICBpbnNwZWN0IHVwZGF0ZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgaW5zcGVjdCB1cGRhdGVzCisKKzIwMDYtMTAtMDcgMjE6MTU6NDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogQWN0aXZhdGUgcGFkcyBiZWZvcmUgYWRkaW5nIHRoZW0gdG8gdGhlIHNvdXJjZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCk6CisJICBBY3RpdmF0ZSBwYWRzIGJlZm9yZSBhZGRpbmcgdGhlbSB0byB0aGUgc291cmNlLgorCisyMDA2LTEwLTA3IDExOjM3OjU5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBkb2NzL3BsdWdpbnMvOiBBZGQvdXBkYXRlIGRvY3Mgc3R1ZmYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5pbnRlcmZhY2VzOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR0c2RlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tbXMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXBlZzJlbmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmVvbi54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNvdW5kdG91Y2gueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BjZGVjLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXN3ZmRlYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWw6CisJICBBZGQvdXBkYXRlIGRvY3Mgc3R1ZmYuCisKKzIwMDYtMTAtMDYgMTc6MDA6MTQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIEFjdGl2YXRlIHBhZHMgYmVmb3JlIGFkZGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5jOiAoZ3N0X2R2ZGVtdXhfYWRkX3BhZHMpLCAoZ3N0X2R2ZGVtdXhfY2hhaW4pOgorCSAgKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6IChnc3RfYXVfcGFyc2VfYWRkX3NyY3BhZCk6CisJICBBY3RpdmF0ZSBwYWRzIGJlZm9yZSBhZGRpbmcuCisKKzIwMDYtMTAtMDYgMTY6MDM6MjMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzogQWN0aXZhdGUgcGFkcyBiZWZvcmUgYWRkaW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzogKGdzdF9tdWx0aXBhcnRfZGVtdXhfaW5pdCksCisJICAoZ3N0X211bHRpcGFydF9maW5kX3BhZF9ieV9taW1lKToKKwkgIEFjdGl2YXRlIHBhZHMgYmVmb3JlIGFkZGluZy4KKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzogKGdzdF9ydHBfbXA0dl9kZXBheV9jbGFzc19pbml0KToKKwkgIEJPSUxFUlBMQVRFIHNldHMgcGFyZW50X2NsYXNzIGZvciB1cy4KKworMjAwNi0xMC0wNiAxNTo1NjowMSArMDAwMCAgUmVuw6kgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKworCSAgQWRkIFJlcGxheUdhaW4gYW5hbHlzaXMgZWxlbWVudCAoIzM1NzA2OSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBSZW7DqSBTdGFkbGVyICA8bWFpbCBhdCByZW5lc3RhZGxlciBkZT4KKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGdzdC9yZXBsYXlnYWluL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmM6IChnc3RfcmdfYW5hbHlzaXNfYmFzZV9pbml0KSwKKwkgIChnc3RfcmdfYW5hbHlzaXNfY2xhc3NfaW5pdCksIChnc3RfcmdfYW5hbHlzaXNfaW5pdCksCisJICAoZ3N0X3JnX2FuYWx5c2lzX3NldF9wcm9wZXJ0eSksIChnc3RfcmdfYW5hbHlzaXNfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcmdfYW5hbHlzaXNfc3RhcnQpLCAoZ3N0X3JnX2FuYWx5c2lzX3NldF9jYXBzKSwKKwkgIChnc3RfcmdfYW5hbHlzaXNfdHJhbnNmb3JtX2lwKSwgKGdzdF9yZ19hbmFseXNpc19ldmVudCksCisJICAoZ3N0X3JnX2FuYWx5c2lzX3N0b3ApLCAoZ3N0X3JnX2FuYWx5c2lzX2hhbmRsZV90YWdzKSwKKwkgIChnc3RfcmdfYW5hbHlzaXNfaGFuZGxlX2VvcyksIChnc3RfcmdfYW5hbHlzaXNfdHJhY2tfcmVzdWx0KSwKKwkgIChnc3RfcmdfYW5hbHlzaXNfYWxidW1fcmVzdWx0KSwgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3JlcGxheWdhaW4vZ3N0cmdhbmFseXNpcy5oOgorCSAgKiBnc3QvcmVwbGF5Z2Fpbi9yZ2FuYWx5c2lzLmM6ICh5dWxlX2ZpbHRlciksIChidXR0ZXJfZmlsdGVyKSwKKwkgIChhcHBseV9maWx0ZXJzKSwgKHJlc2V0X2ZpbHRlcnMpLCAoYWNjdW11bGF0b3JfYWRkKSwKKwkgIChhY2N1bXVsYXRvcl9jbGVhciksIChhY2N1bXVsYXRvcl9yZXN1bHQpLCAocmdfYW5hbHlzaXNfbmV3KSwKKwkgIChyZ19hbmFseXNpc19zZXRfc2FtcGxlX3JhdGUpLCAocmdfYW5hbHlzaXNfZGVzdHJveSksCisJICAocmdfYW5hbHlzaXNfYW5hbHl6ZV9tb25vX2Zsb2F0KSwKKwkgIChyZ19hbmFseXNpc19hbmFseXplX3N0ZXJlb19mbG9hdCksCisJICAocmdfYW5hbHlzaXNfYW5hbHl6ZV9tb25vX2ludDE2KSwKKwkgIChyZ19hbmFseXNpc19hbmFseXplX3N0ZXJlb19pbnQxNiksIChyZ19hbmFseXNpc19hbmFseXplKSwKKwkgIChyZ19hbmFseXNpc190cmFja19yZXN1bHQpLCAocmdfYW5hbHlzaXNfYWxidW1fcmVzdWx0KSwKKwkgIChyZ19hbmFseXNpc19yZXNldF9hbGJ1bSksIChyZ19hbmFseXNpc19yZXNldCk6CisJICAqIGdzdC9yZXBsYXlnYWluL3JnYW5hbHlzaXMuaDoKKwkgIEFkZCBSZXBsYXlHYWluIGFuYWx5c2lzIGVsZW1lbnQgKCMzNTcwNjkpLgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jOiAoZ2V0X2V4cGVjdGVkX2dhaW4pLAorCSAgKHNldHVwX3JnYW5hbHlzaXMpLCAoY2xlYW51cF9yZ2FuYWx5c2lzKSwgKHNldF9wbGF5aW5nX3N0YXRlKSwKKwkgIChzZW5kX2Vvc19ldmVudCksIChzZW5kX3RhZ19ldmVudCksIChwb2xsX2VvcyksIChwb2xsX3RhZ3MpLAorCSAgKGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4pLCAoZmFpbF91bmxlc3NfdHJhY2tfcGVhayksCisJICAoZmFpbF91bmxlc3NfYWxidW1fZ2FpbiksIChmYWlsX3VubGVzc19hbGJ1bV9wZWFrKSwKKwkgIChmYWlsX2lmX3RyYWNrX3RhZ3MpLCAoZmFpbF9pZl9hbGJ1bV90YWdzKSwKKwkgIChmYWlsX3VubGVzc19udW1fdHJhY2tzKSwgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X21vbm8pLAorCSAgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X3N0ZXJlbyksICh0ZXN0X2J1ZmZlcl9jb25zdF9pbnQxNl9tb25vKSwKKwkgICh0ZXN0X2J1ZmZlcl9jb25zdF9pbnQxNl9zdGVyZW8pLCAodGVzdF9idWZmZXJfc3F1YXJlX2Zsb2F0X21vbm8pLAorCSAgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8pLCAodGVzdF9idWZmZXJfc3F1YXJlX2ludDE2X21vbm8pLAorCSAgKHRlc3RfYnVmZmVyX3NxdWFyZV9pbnQxNl9zdGVyZW8pLCAocHVzaF9idWZmZXIpLCAoR1NUX1NUQVJUX1RFU1QpLAorCSAgKHJnYW5hbHlzaXNfc3VpdGUpLCAobWFpbik6CisJICBVbml0IHRlc3RzIGZvciB0aGUgbmV3IHJlcGxheWdhaW4gZWxlbWVudC4KKworMjAwNi0xMC0wNiAxNTo0OTozOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2ZhYWQvZ3N0ZmFhZC5jOiBTb21lIGNsZWFudXBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mYWFkL2dzdGZhYWQuYzogKGdzdF9mYWFkX3NldGNhcHMpLCAoZ3N0X2ZhYWRfY2hhaW4pLAorCSAgKGdzdF9mYWFkX2Nsb3NlX2RlY29kZXIpOgorCSAgU29tZSBjbGVhbnVwcy4KKwkgIEFkZGVkIHNvbWUgbW9yZSBkZWJ1Z2dpbmcuCisJICBEb24ndCBldmVyIGlnbm9yZSB1bmxpbmtlZCwgd2UncmUgbm90IGEgZGVtdXhlci4KKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfYWRkX3N0cmVhbSk6CisJICBBY3RpdmF0ZSBwYWQgYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgZWxlbWVudC4KKworMjAwNi0xMC0wNiAxMjo1NTo1MyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy4qOiBSZXdvcmsgaG93IHRoZSB0cmFuc3BvcnQgc3RyaW5nIGlzIGNvbnN0cnVjdGVkLCB0cnkgdG8gc2hhcmUgY2hhbm5lbHMgYW5kIHVkcCBwb3J0cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcF9wcm90b19nZXRfdHlwZSksCisJICAoZ3N0X3J0c3BzcmNfY2xhc3NfaW5pdCksIChnc3RfcnRzcHNyY19pbml0KSwKKwkgIChnc3RfcnRzcHNyY19jcmVhdGVfc3RyZWFtKSwgKGdzdF9ydHNwc3JjX21lZGlhX3RvX2NhcHMpLAorCSAgKGdzdF9ydHNwc3JjX2FsbG9jX3VkcF9wb3J0cyksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90cmFuc3BvcnQpLCAoZmluZF9zdHJlYW1fYnlfY2hhbm5lbCksCisJICAoZ3N0X3J0c3BzcmNfcHVzaF9ldmVudCksIChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKSwKKwkgIChnc3RfcnRzcHNyY19jcmVhdGVfdHJhbnNwb3J0c19zdHJpbmcpLAorCSAgKGdzdF9ydHNwc3JjX2NvbmZpZ3VyZV90cmFuc3BvcnRzKSwgKGdzdF9ydHNwc3JjX29wZW4pLAorCSAgKGdzdF9ydHNwc3JjX2hhbmRsZV9tZXNzYWdlKSwgKGdzdF9ydHNwc3JjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIFJld29yayBob3cgdGhlIHRyYW5zcG9ydCBzdHJpbmcgaXMgY29uc3RydWN0ZWQsIHRyeSB0byBzaGFyZSBjaGFubmVscworCSAgYW5kIHVkcCBwb3J0cy4KKwkgIE1ha2UgbW9zdCBvZiB0aGUgc3R1ZmYgbGVzcyBkZXBlbmRhbnQgb24gUlRQIGFzIHdlIGFyZSBhbHNvIGdvaW5nIHRvIHVzZQorCSAgaXQgZm9yIFJEVC4KKwkgIEFkZCBzdXBwb3J0IGZvciB0cmFuc3BvcnQgc3BlY2lmaWMgc2Vzc2lvbiBtYW5hZ2Vycy4KKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJ0c3BfY29ubmVjdGlvbl9mbHVzaCk6CisJICBJbXBsZW1lbnQgX2ZsdXNoKCkuCisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmM6IChydHNwX3N0cnJlc3VsdCk6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmg6CisJICBBZGQgZ2VuZXJpYyBlcnJvciByZXR1cm4gY29kZS4KKwkgICogZ3N0L3J0c3AvcnRzcGV4dC5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIHBsdWdnYWJsZSB0cmFucG9ydCBzdHJpbmdzLgorCSAgKiBnc3QvcnRzcC9ydHNwZXh0d21zLmM6IChydHNwX2V4dF93bXNfYmVmb3JlX3NlbmQpLAorCSAgKHJ0c3BfZXh0X3dtc19hZnRlcl9zZW5kKSwgKHJ0c3BfZXh0X3dtc19wYXJzZV9zZHApLAorCSAgKHJ0c3BfZXh0X3dtc19nZXRfY29udGV4dCk6CisJICBEZXRlY3QgV01TZXJ2ZXIgYW5kIGFjdGl2YXRlIHRoZSBleHRlbnNpb24uCisJICAqIGdzdC9ydHNwL3J0c3B0cmFuc3BvcnQuYzogKHJ0c3BfdHJhbnNwb3J0X2dldF9taW1lKSwKKwkgIChydHNwX3RyYW5zcG9ydF9nZXRfbWFuYWdlciksIChydHNwX3RyYW5zcG9ydF9wYXJzZSk6CisJICAqIGdzdC9ydHNwL3J0c3B0cmFuc3BvcnQuaDoKKwkgIEFkZGVkIG1ldGhvZHMgdG8gZ2V0IG1pbWUvbWFuYWdlciBmb3IgY2VydGFpbiB0cmFuc3BvcnRzLgorCisyMDA2LTEwLTA2IDExOjMxOjExICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogRml4IG1lbSBsZWFrLCBhdm9pZCB1bm5lY2Vzc2FyeSBtZW1jcHkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IChnc3Rfc3BlY3RydW1fdHJhbnNmb3JtX2lwKToKKwkgIEZpeCBtZW0gbGVhaywgYXZvaWQgdW5uZWNlc3NhcnkgbWVtY3B5LgorCisyMDA2LTEwLTA2IDAyOjI5OjM1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiBSZW1vdmVkIGNydWZ0IGNvZGUgdGhhdCB3YXMganVzdCBjb21tZW50ZWQgb3V0LiBSZW1vdmVkIHNvbWUgb2Jzb2xldGUgZGVidWcgbG9ncyBzdGF0ZW1lbnRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX2luaXQpLAorCSAgKGdzdF9zcGVjdHJ1bV90cmFuc2Zvcm1faXApOgorCSAgUmVtb3ZlZCBjcnVmdCBjb2RlIHRoYXQgd2FzIGp1c3QgY29tbWVudGVkIG91dC4gUmVtb3ZlZCBzb21lIG9ic29sZXRlCisJICBkZWJ1ZyBsb2dzIHN0YXRlbWVudHMuCisKKzIwMDYtMTAtMDUgMTg6MTQ6NDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIEFub3RoZXIgYmF0Y2ggb2YgcHJpbnRmIGZvcm1hdCBmaXhlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHRzL2dzdGR0c2RlYy5jOiAoZ3N0X2R0c2RlY19jaGFpbik6CisJICAqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uYzogKGdzdF90cm1fc2V0Y2Fwcyk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogKGdzdF93YXZwYWNrX2VuY19zaW5rX3NldF9jYXBzKToKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfY2hhaW4pLCAocXRkZW11eF9wYXJzZSksCisJICAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IChnc3Rfc3BlY3RydW1fdHJhbnNmb3JtX2lwKToKKwkgIEFub3RoZXIgYmF0Y2ggb2YgcHJpbnRmIGZvcm1hdCBmaXhlcy4KKworMjAwNi0xMC0wNSAxNjozNzozMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgUHJpbnRmIGZvcm1hdCBmaXhlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuYzoKKwkgIChnc3RfY2Fpcm9fdGltZV9vdmVybGF5X3VwZGF0ZV9mb250X2hlaWdodCk6CisJICAqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6IChnc3RfcGl4YnVmc2NhbGVfdHJhbnNmb3JtX2NhcHMpOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChnc3RfanBlZ19kZWNfcGFyc2VfaW1hZ2VfZGF0YSk6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzogKGdzdF9qcGVnZW5jX2NoYWluKToKKwkgICogZXh0L2pwZWcvZ3N0c21va2VkZWMuYzogKGdzdF9zbW9rZWRlY19jaGFpbik6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6IChnc3Rfc21va2VlbmNfY2hhaW4pOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiAodXNlcl9lbmRyb3dfY2FsbGJhY2spOgorCSAgKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6IChnc3RfYXVfcGFyc2VfcGFyc2VfaGVhZGVyKToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdXBlcmluZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N1YmluZGV4KSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKToKKwkgICogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzogKGdzdF9jdXR0ZXJfY2hhaW4pOgorCSAgKiBnc3QvZGVidWcvZWZlbmNlLmM6IChnc3RfZWZlbmNlX2J1ZmZlcl9hbGxvYyksCisJICAoZ3N0X2ZlbmNlZF9idWZmZXJfY29weSk6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAoaWQzZGVtdXhfaWQzdjJfcGFyc2VfZnJhbWUpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9zdGFydCk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3NlbmQpLAorCSAgKGdzdF9ydHNwc3JjX2hhbmRsZV9tZXNzYWdlKToKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpOgorCSAgKiBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzogKHhpbWFnZXV0aWxfeGNvbnRleHRfZ2V0KToKKwkgIFByaW50ZiBmb3JtYXQgZml4ZXMuCisKKzIwMDYtMTAtMDQgMjI6Mzc6MDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLio6IEhhbmRsZSBwYWNrZWQgWVVWIGZvcm1hdHMgKFVZVlksIFlVWTIsIFlVWVYpIHNlcGFyYXRlbHk7IGFsc28sIGZpeCBwYXNzdGhyb3VnaCBtb2RlOyBsYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6IChnc3RfdmlkZW9fY3JvcF9jbGFzc19pbml0KSwKKwkgIChnc3RfdmlkZW9fY3JvcF9pbml0KSwKKwkgIChnc3RfdmlkZW9fY3JvcF9nZXRfaW1hZ2VfZGV0YWlsc19mcm9tX2NhcHMpLAorCSAgKGdzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9wYWNrZWRfY29tcGxleCksCisJICAoZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX3BhY2tlZF9zaW1wbGUpLAorCSAgKGdzdF92aWRlb19jcm9wX3RyYW5zZm9ybSksIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fY2FwcyksCisJICAoZ3N0X3ZpZGVvX2Nyb3Bfc2V0X2NhcHMpLAorCSAgKGdzdF92aWRlb2Nyb3BfY2xlYXJfbmVnb3RpYXRlZF9jYXBzX2xvY2tlZCksCisJICAoZ3N0X3ZpZGVvX2Nyb3Bfc2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuaDoKKwkgIEhhbmRsZSBwYWNrZWQgWVVWIGZvcm1hdHMgKFVZVlksIFlVWTIsIFlVWVYpIHNlcGFyYXRlbHk7IGFsc28sIGZpeAorCSAgcGFzc3Rocm91Z2ggbW9kZTsgbGFzdGx5LCBjbGVhciBuZWdvdGlhdGVkIGJhc2V0cmFuc2Zvcm0gY2FwcyB3aGVuCisJICB0aGUgY3JvcHBpbmcgY2hhbmdlcyBpbiBvcmRlciB0byBmb3JjZSByZW5lZ290aWF0aW9uLgorCisyMDA2LTEwLTA0IDIwOjA1OjA3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9pY2xlcy86IFZpc3VhbCB0ZXN0IGZvciB2aWRlb2Nyb3AsIHNob3dzIHRoYXQgcGFja2VkIHl1diBkb2Vzbid0IHdvcmsgcmlnaHQgeWV0LiAtLXdpdGgtZmZtcGVnY29sb3JzcGFjZSBvcHRpb24uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9pY2xlcy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvaWNsZXMvdmlkZW9jcm9wLXRlc3QuYzogKHF1aXRfbWFpbmxvb3ApLCAodGlja19jYiksCisJICAodGVzdF93aXRoX2NhcHMpLCAodmlkZW9fY3JvcF9nZXRfdGVzdF9jYXBzKSwgKG1haW4pOgorCSAgVmlzdWFsIHRlc3QgZm9yIHZpZGVvY3JvcCwgc2hvd3MgdGhhdCBwYWNrZWQgeXV2IGRvZXNuJ3Qgd29yayByaWdodAorCSAgeWV0LiAtLXdpdGgtZmZtcGVnY29sb3JzcGFjZSBvcHRpb24gZG9lc24ndCB3b3JrIHlldCBmb3IgdW5rbm93bgorCSAgcmVhc29ucyAoYW5vdGhlciBiYXNldHJhbnNmb3JtIGlzc3VlPykKKworMjAwNi0xMC0wNCAxNzo1MzoxMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvTWFrZWZpbGUuYW06IERpc3QgbmV3IC5oIGZpbGUgdG9vLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL01ha2VmaWxlLmFtOgorCSAgRGlzdCBuZXcgLmggZmlsZSB0b28uCisKKzIwMDYtMTAtMDQgMTc6MjQ6NDAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwLzogRmFjdG9yIG91dCBleHRlbnNpb24gaW4gc2VwYXJhdGUgbW9kdWxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuYzogKGdzdF9ydHBkZWNfZ2V0Y2FwcyksCisJICAoZ3N0X3J0cGRlY19jaGFpbl9ydHApLCAoZ3N0X3J0cGRlY19jaGFpbl9ydGNwKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfaW5pdCksCisJICAoZ3N0X3J0c3BzcmNfZmluYWxpemUpLCAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfcnRwbWFwKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksIChnc3RfcnRzcHNyY19zZW5kKSwKKwkgIChnc3RfcnRzcHNyY19wYXJzZV9tZXRob2RzKSwgKGdzdF9ydHNwc3JjX29wZW4pLAorCSAgKGdzdF9ydHNwc3JjX3BsYXkpLCAoZ3N0X3J0c3BzcmNfaGFuZGxlX21lc3NhZ2UpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmM6IChydHNwX3N0cnJlc3VsdCk6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmg6CisJICAqIGdzdC9ydHNwL3J0c3BleHQuaDoKKwkgICogZ3N0L3J0c3AvcnRzcGV4dHdtcy5jOiAocnRzcF9leHRfd21zX3BhcnNlX3NkcCksCisJICAocnRzcF9leHRfd21zX2dldF9jb250ZXh0KToKKwkgICogZ3N0L3J0c3AvcnRzcGV4dHdtcy5oOgorCSAgKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0LmM6IChydHNwX3RyYW5zcG9ydF9pbml0KSwgKHBhcnNlX21vZGUpLAorCSAgKHJ0c3BfdHJhbnNwb3J0X3BhcnNlKToKKwkgICogZ3N0L3J0c3AvcnRzcHRyYW5zcG9ydC5oOgorCSAgRmFjdG9yIG91dCBleHRlbnNpb24gaW4gc2VwYXJhdGUgbW9kdWxlLgorCSAgRml4IGdldGNhcHMgdG8gZmlsdGVyIGFnYWluc3QgdGhlIHBhZHRlbXBsYXRlLgorCSAgVXNlIENvbnRlbnQtQmFzZSBpZiB0aGUgc2VydmVyIGdpdmVzIG9uZS4KKwkgIFJld29yayB0aGUgdHJhbnNwb3J0IHBhcnNpbmcgYSBiaXQgZm9yIGZ1dHVyZSBleHRlbnNpb25zLgorCSAgQWRkZWQgc29tZSBSZWFsIEhlYWRlciBmaWVsZCBkZWZpbml0aW9ucy4KKworMjAwNi0xMC0wNCAxMDoyOToxMSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGRvY3MvcGx1Z2lucy86IGFkZGVkIHY0bDIgc3R1YnMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgIGFkZGVkIHY0bDIgc3R1YnMKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgYWRkIHY0bDIKKworMjAwNi0xMC0wNCAxMDoyNDo0OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOiBFeHRyYWN0IGRpc2MvYWxidW0vbWVkaXVtIG51bWJlciBhbmQgY291bnQgYW5kIHRyeSBoYXJkZXIgdG8gZXh0cmFjdCB0cmFjayBudW1iZXIvY291bnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jOiAoYXBlX2RlbXV4X3BhcnNlX3RhZ3MpOgorCSAgRXh0cmFjdCBkaXNjL2FsYnVtL21lZGl1bSBudW1iZXIgYW5kIGNvdW50IGFuZCB0cnkgaGFyZGVyCisJICB0byBleHRyYWN0IHRyYWNrIG51bWJlci9jb3VudC4KKworMjAwNi0xMC0wMyAxODozNjoyOSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIHRlc3RzL2ljbGVzLy5naXRpZ25vcmU6CisJICBtb2FwIGlnbm9yZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBtb2FwIGlnbm9yZQorCisyMDA2LTEwLTAzIDE4OjM1OjM0ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogdGVzdHMvaWNsZXMvTWFrZWZpbGUuYW06CisJICBhZGQgaWNsZSBmb3IgdjRsMgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgaWNsZSBmb3IgdjRsMgorCisyMDA2LTEwLTAzIDE4OjE1OjU4ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgYWRkIGJ1aWxkIHN0dWZmIGZvciB2NGwyLCBuZWVkcyAtLWVuYWJsZS1leHBlcmltZW50YWwgdW50aWwgdGhlIGxhc3QgYml0cyBhcmUgcmVzb2x2ZWQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIHN5cy9NYWtlZmlsZS5hbToKKwkgIGFkZCBidWlsZCBzdHVmZiBmb3IgdjRsMiwgbmVlZHMgLS1lbmFibGUtZXhwZXJpbWVudGFsIHVudGlsCisJICB0aGUgbGFzdCBiaXRzIGFyZSByZXNvbHZlZAorCisyMDA2LTEwLTAzIDEzOjQ3OjEwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgY29tbWVudCBvdXQgdGhlIG5vdGlmaWVzIGZvciByZW1vdmVkIHByb3BlcnRpZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgY29tbWVudCBvdXQgdGhlIG5vdGlmaWVzIGZvciByZW1vdmVkIHByb3BlcnRpZXMKKworMjAwNi0xMC0wMyAxMzozMDo0OCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzogY29tbWVudCBvdXQgdGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgYWxyZWFkeSBwYXJ0IG9mIHRoZSB0dW5lciBpbnRlcmZhY2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgKGdzdF92NGwyX29iamVjdF9pbnN0YWxsX3Byb3BlcnRpZXNfaGVscGVyKToKKwkgIGNvbW1lbnQgb3V0IHRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIGFscmVhZHkgcGFydCBvZiB0aGUgdHVuZXIKKwkgIGludGVyZmFjZS4KKworMjAwNi0xMC0wMyAxMzoxODo1OSArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSAgc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiBJbXByb3ZlIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMTAtMDMgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgSW1wcm92ZSBkb2NzLgorCisyMDA2LTEwLTAyIDE2OjE0OjA2ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIHN0b3AgcmVtb3ZpbmcgZ2RrcGl4YnVmIHBsdWdpbiBmcm9tIHBhY2thZ2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgc3RvcCByZW1vdmluZyBnZGtwaXhidWYgcGx1Z2luIGZyb20gcGFja2FnZQorCisyMDA2LTA5LTI5IDE1OjM5OjQxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogRGlzYWJsZSBhdXRvZGV0ZWN0IHRlc3QgdGVtcG9yYXJpbHksIHNvIHRoYXQgdGhlIGJ1aWxkIGJvdHMgdXBkYXRlIC1iYWQgYW5kIHRoZSByYW5rcyBvZiB1bnIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIERpc2FibGUgYXV0b2RldGVjdCB0ZXN0IHRlbXBvcmFyaWx5LCBzbyB0aGF0IHRoZSBidWlsZCBib3RzCisJICB1cGRhdGUgLWJhZCBhbmQgdGhlIHJhbmtzIG9mIHVucmVsaWFibGUgdmlkZW8gc2lua3MgaW4gdGhlcmUuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2F1dG9kZXRlY3QuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIFNraXAgdGVzdCBpZiBubyB1c2FibGUgdmlkZW9zaW5rIGlzIGZvdW5kLgorCisyMDA2LTA5LTI5IDE1OjM3OjI5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9VUkxTOiBBZGQgc29tZSBtb3JlIFVSTHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvVVJMUzoKKwkgIEFkZCBzb21lIG1vcmUgVVJMcy4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0c3BzcmNfaW5pdCksIChnc3RfcnRzcHNyY19maW5hbGl6ZSksCisJICAoZ3N0X3J0c3BzcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9ydHNwc3JjX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0c3BzcmNfc3RyZWFtX3NldHVwX3J0cCksIChnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkKSwKKwkgIChnc3RfcnRzcHNyY19sb29wX3VkcCksIChnc3RfcnRzcHNyY19sb29wX3NlbmRfY21kKSwKKwkgIChnc3RfcnRzcHNyY19sb29wKSwgKGdzdF9ydHNwc3JjX3NlbmQpLAorCSAgKGdzdF9ydHNwc3JjX3BhcnNlX21ldGhvZHMpLCAoZ3N0X3J0c3BzcmNfb3BlbiksCisJICAoZ3N0X3J0c3BzcmNfY2xvc2UpLCAoZ3N0X3J0c3BzcmNfcGxheSksIChnc3RfcnRzcHNyY19wYXVzZSksCisJICAoZ3N0X3J0c3BzcmNfaGFuZGxlX21lc3NhZ2UpLCAoZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgQWRkIHRpbWVvdXQgcHJvcGVydHkgdG8gY29udHJvbCBVRFAgdGltZW91dHMuCisJICBGaXggZXJyb3IgbWVzc2FnZXMuCisJICBBbHNvIHN0YXJ0IGEgbG9vcCBmdW5jdGlvbiB3aGVuIG9wZXJhdGluZyBpbiBVRFAgbW9kZSBzbyB0aGF0IHdlIGNhbgorCSAgZG8gc29tZSBtb3JlIHN0dWZmIGFzeW5jLgorCSAgSGFuZGxlIGVsZW1lbnQgbWVzc2FnZXMgZnJvbSB1ZHBzcmMgdG8gZGV0ZWN0IHRpbWVvdXRzLiBJZiBhIHRpbWVvdXQKKwkgIGhhcHBlbnMgd2UgY3VycmVudGx5IGdlbmVyYXRlIGFuIGVycm9yLgorCSAgQVBJOiBydHNwc3JjOjp0aW1lb3V0IHByb3BlcnR5LgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfdWRwc3JjX2NyZWF0ZSk6CisJICBSZWFsbHkgaW1wbGVtZW50IHRoZSB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcyBhbmQgbm90IG1pbGxpc2Vjb25kcy4KKworMjAwNi0wOS0yOSAxMTowOTo0MCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3VkcC9nc3R1ZHBzcmMuKjogQWRkZWQgcHJvcGVydHkgdG8gcG9zdCBhIG1lc3NhZ2Ugb24gdGltZW91dC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwgKGdzdF91ZHBzcmNfaW5pdCksCisJICAoZ3N0X3VkcHNyY19jcmVhdGUpLCAoZ3N0X3VkcHNyY19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF91ZHBzcmNfZ2V0X3Byb3BlcnR5KSwgKGdzdF91ZHBzcmNfdW5sb2NrKSwgKGdzdF91ZHBzcmNfc3RvcCk6CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmg6CisJICBBZGRlZCBwcm9wZXJ0eSB0byBwb3N0IGEgbWVzc2FnZSBvbiB0aW1lb3V0LgorCSAgVXBkYXRlZCBkb2NzLgorCSAgV2hlbiByZXN0YXJ0aW5nIHRoZSBzZWxlY3QsIGluaXRpYWxpemUgdGhlIGZkc2V0cyBhZ2Fpbi4KKwkgIEluaXQgY29udHJvbCBzb2NrZXRzIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSBjbG9zZSBhIHJhbmRvbSBzb2NrZXQuCisJICBBUEk6IEdzdFVEUFNyYzo6dGltZW91dCBwcm9wZXJ0eQorCisyMDA2LTA5LTI5IDA4OjE1OjA1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IEZpeCBmbGFnIHJlZ2lzdHJhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcF9wcm90b19nZXRfdHlwZSk6CisJICBGaXggZmxhZyByZWdpc3RyYXRpb24uCisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fcmVhZCk6CisJICBSZWFkaW5nIDAgYWxzbyBtZWFucyAnbm8gbW9yZSBjb21tYW5kcycKKworMjAwNi0wOS0yOSAwODowOToyNCArMDAwMCAgQW50b2luZSBUcmVtYmxheSA8aGV4YTAwQGdtYWlsLmNvbT4KKworCSAgZ3N0L3VkcC9nc3R1ZHBzcmMuYzogRml4IHBvc3NpYmxlIGluZmluaXRlIGxvb3Agd2hlbiBzaHV0dGluZyBkb3duLCBhIHJlYWQgY2FuIGFsc28gcmV0dXJuIDAgdG8gaW5kaWNhdGUgbm8gbW9yZSBtZXNzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBBbnRvaW5lIFRyZW1ibGF5IDxoZXhhMDAgYXQgZ21haWwgZG90IGNvbT4KKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfY3JlYXRlKToKKwkgIEZpeCBwb3NzaWJsZSBpbmZpbml0ZSBsb29wIHdoZW4gc2h1dHRpbmcgZG93biwgYSByZWFkIGNhbiBhbHNvIHJldHVybgorCSAgMCB0byBpbmRpY2F0ZSBubyBtb3JlIG1lc3NhZ2VzIGFyZSBhdmFpbGFibGUuIEZpeGVzICMzNTgxNTYuCisKKzIwMDYtMDktMjggMTc6MDg6NDcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHN5cy92NGwyLzogRnJhbWVyYXRlIGNhbiBiZSAwLzEgdG9vLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX2dldF9hbGxfY2FwcyksCisJICAoZ3N0X3Y0bDJzcmNfZ2V0X2NhcHMpOgorCSAgKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6IChnc3RfdjRsMl9maWxsX2xpc3RzKToKKwkgIEZyYW1lcmF0ZSBjYW4gYmUgMC8xIHRvby4KKwkgIEluaXQgZnJhbWVyYXRlIHRvIDAvMSBiZWZvcmUgcXVlcnlpbmcgaXQgc28gdGhhdCB3ZSBjYW4gZGV0ZWN0CisJICBkZXZpY2VzIHRoYXQgZG9uJ3Qga25vdyBhYm91dCBhIGZyYW1lcmF0ZS4KKwkgIEFkZCBzb21lIG1vcmUgZGVidWdnaW5nIGluZm8uCisKKzIwMDYtMDktMjggMTQ6MzE6NDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQWRkIHN1cHBvcnQgZm9yICd5djEyJyBmb3VyY2MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF92aWRlb19jYXBzKToKKwkgIEFkZCBzdXBwb3J0IGZvciAneXYxMicgZm91cmNjLgorCisyMDA2LTA5LTI3IDE3OjQ3OjU3ICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkqIHRlc3RzL2ljbGVzL3Y0bDJzcmMtdGVzdC5jOgorCSAgUmVtb3ZlZCBzZXQtdW5kZWYtZnBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBSZW1vdmVkIHNldC11bmRlZi1mcHMuCisKKzIwMDYtMDktMjcgMTc6MDQ6MjIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHN5cy92NGwyLzogUmVuYW1lZCBzb21lIHByb3BlcnRpZXMgdG8gbWF0Y2ggdGhlIHR1bmVyIGludGVyZmFjZSBuYW1pbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSAgKGdzdF92NGwyX29iamVjdF9pbnN0YWxsX3Byb3BlcnRpZXNfaGVscGVyKSwgKGdzdF92NGwyX29iamVjdF9uZXcpLAorCSAgKGdzdF92NGwyX29iamVjdF9zZXRfcHJvcGVydHlfaGVscGVyKSwKKwkgIChnc3RfdjRsMl9vYmplY3RfZ2V0X3Byb3BlcnR5X2hlbHBlciksIChnc3RfdjRsMl9zZXRfZGVmYXVsdHMpOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0Lmg6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF92NGwyc3JjX2NyZWF0ZSk6CisJICAqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOiAoZ3N0X3Y0bDJfdHVuZXJfY29udGFpbnNfY2hhbm5lbCksCisJICAoZ3N0X3Y0bDJfdHVuZXJfbGlzdF9jaGFubmVscyksCisJICAoZ3N0X3Y0bDJfdHVuZXJfc2V0X2NoYW5uZWxfYW5kX25vdGlmeSksCisJICAoZ3N0X3Y0bDJfdHVuZXJfZ2V0X2NoYW5uZWwpLCAoZ3N0X3Y0bDJfdHVuZXJfY29udGFpbnNfbm9ybSksCisJICAoZ3N0X3Y0bDJfdHVuZXJfbGlzdF9ub3JtcyksIChnc3RfdjRsMl90dW5lcl9zZXRfbm9ybV9hbmRfbm90aWZ5KSwKKwkgIChnc3RfdjRsMl90dW5lcl9nZXRfbm9ybSk6CisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogKGdzdF92NGwyX2dldF9jYXBhYmlsaXRpZXMpLAorCSAgKGdzdF92NGwyX2ZpbGxfbGlzdHMpLCAoZ3N0X3Y0bDJfZW1wdHlfbGlzdHMpOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19nZXRfZnBzKToKKwkgIFJlbmFtZWQgc29tZSBwcm9wZXJ0aWVzIHRvIG1hdGNoIHRoZSB0dW5lciBpbnRlcmZhY2UgbmFtaW5nLgorCisyMDA2LTA5LTI3IDE2OjE0OjE4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBTbWFsbCBjbGVhbnVwcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6IChnc3RfdjRsMl9vYmplY3Rfc2V0X3Byb3BlcnR5X2hlbHBlciksCisJICAoZ3N0X3Y0bDJfc2V0X2RlZmF1bHRzKToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfZ2V0X3JlYWQpLAorCSAgKGdzdF92NGwyc3JjX2NyZWF0ZSk6CisJICAqIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS5jOiAoZ3N0X3Y0bDJfeG92ZXJsYXlfb3Blbik6CisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogKGdzdF92NGwyX2dldF9jYXBhYmlsaXRpZXMpLAorCSAgKGdzdF92NGwyX2ZpbGxfbGlzdHMpLCAoZ3N0X3Y0bDJfb3BlbiksIChnc3RfdjRsMl9zZXRfbm9ybSksCisJICAoZ3N0X3Y0bDJfZ2V0X2ZyZXF1ZW5jeSksIChnc3RfdjRsMl9zZXRfZnJlcXVlbmN5KSwKKwkgIChnc3RfdjRsMl9zaWduYWxfc3RyZW5ndGgpLCAoZ3N0X3Y0bDJfZ2V0X2F0dHJpYnV0ZSksCisJICAoZ3N0X3Y0bDJfc2V0X2F0dHJpYnV0ZSksIChnc3RfdjRsMl9nZXRfaW5wdXQpLAorCSAgKGdzdF92NGwyX3NldF9pbnB1dCk6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX2ZpbGxfZm9ybWF0X2xpc3QpLAorCSAgKGdzdF92NGwyc3JjX2dyYWJfZnJhbWUpLCAoZ3N0X3Y0bDJzcmNfZ2V0X2NhcHR1cmUpLAorCSAgKGdzdF92NGwyc3JjX3NldF9jYXB0dXJlKSwgKGdzdF92NGwyc3JjX2NhcHR1cmVfaW5pdCksCisJICAoZ3N0X3Y0bDJzcmNfY2FwdHVyZV9zdGFydCksIChnc3RfdjRsMnNyY19jYXB0dXJlX3N0b3ApLAorCSAgKGdzdF92NGwyc3JjX2J1ZmZlcl9uZXcpOgorCSAgKiB0ZXN0cy9pY2xlcy92NGwyc3JjLXRlc3QuYzogKG15X2J1c19jYWxsYmFjayksIChtYWluKToKKwkgIFNtYWxsIGNsZWFudXBzLgorCSAgRml4IGVycm9yIG1lc3NhZ2VzLgorCSAgVXNlIGxvY2tzIHdoZW4gZ2V0dGluZyB0aW1lc3RhbXBzLgorCSAgRml4IGxlYWtzIGluIHRlc3QuCisJICBBZGQgbGljZW5zaW5nIGhlYWRlciB0byB0ZXN0cy4KKworMjAwNi0wOS0yNyAxNToxNDowNyArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuYzoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHRlc3RzL2ljbGVzL3Y0bDJzcmMtdGVzdC5jOgorCSAgU29tZSBjbGVhbnVwcyBhbmQgY29tbWVudHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFNvbWUgY2xlYW51cHMgYW5kIGNvbW1lbnRzLgorCisyMDA2LTA5LTI3IDEzOjQxOjM1ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIGFkZCBhdWRpb2Z4IHBsdWdpbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgYXVkaW9meCBwbHVnaW4KKworMjAwNi0wOS0yNiAxNDoxNzo1NCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZG9jcy9wbHVnaW5zLzogQWRkIHY0bDIgcGx1Z2luIHRvIHRoZSBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgIEFkZCB2NGwyIHBsdWdpbiB0byB0aGUgZG9jcy4KKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfZ2V0X3JlYWQpLAorCSAgKGdzdF92NGwyc3JjX2dldF9tbWFwKSwgKGdzdF92NGwyc3JjX2NyZWF0ZSk6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5jOgorCSAgRml4IGRvY3MuCisJICBSZW1vdmUgc29tZSBtb3JlIGV4dGVybnMuCisKKzIwMDYtMDktMjYgMTM6MTg6MDYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHN5cy92NGwyL01ha2VmaWxlLmFtOiBGaXggbWFrZWZpbGUsIGxpc3QgbGlicyBpbiBzdGFjayBvcmRlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkgIEZpeCBtYWtlZmlsZSwgbGlzdCBsaWJzIGluIHN0YWNrIG9yZGVyLgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaDoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOiAoZ3N0X3Y0bDJfZGV2aWNlX2dldF90eXBlKSwKKwkgIChnc3RfdjRsMl9vYmplY3RfaW5zdGFsbF9wcm9wZXJ0aWVzX2hlbHBlcik6CisJICAqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfZ2V0X3JlYWQpLAorCSAgKGdzdF92NGwyc3JjX2dldF9tbWFwKSwgKGdzdF92NGwyc3JjX2NyZWF0ZSk6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmg6CisJICAqIHN5cy92NGwyL2dzdHY0bDJ2aWRvcmllbnQuaDoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnhvdmVybGF5Lmg6CisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuaDoKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5oOgorCSAgRml4IGNvZGluZyBzdHlsZToKKwkgIC0gUmVtb3ZlIGV4dGVybiBmcm9tIGZ1bmN0aW9ucy4KKwkgIC0gRml4IGhlYWRlciBpbmRlbnRhdGlvbi4KKwkgIEZpeCBGbGFncywgYWRkIGRlZmF1bHRzIGZvciBwcm9wZXJ0aWVzLgorCSAgUmVtb3ZlIHVudXNlZCBlbnVtcy4KKwkgIEZpeCBUT09fTEFaWSBpbiBlcnJvciBtZXNzYWdlcy4KKworMjAwNi0wOS0yNiAxMTowNjoxNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgc3lzL3Y0bDIvOiBGaXggcGFzcyBhdCBjb2RlIGNsZWFudXBzLCBtb3ZlIGVycm9ycyBjYXNlcyBvdXQgb2YgdGhlIG5vcm1hbCBmbG93IGZvciBhZGRpdGlvbmFsIGNvZGUgY2xhcml0eS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6IChnc3RfdjRsMl9jbGFzc19wcm9iZV9kZXZpY2VzKSwKKwkgIChnc3RfdjRsMl9wcm9iZV9uZWVkc19wcm9iZSksCisJICAoZ3N0X3Y0bDJfb2JqZWN0X2luc3RhbGxfcHJvcGVydGllc19oZWxwZXIpLCAoZ3N0X3Y0bDJfb2JqZWN0X25ldyksCisJICAoZ3N0X3Y0bDJfb2JqZWN0X2Rlc3Ryb3kpLCAoZ3N0X3Y0bDJfb2JqZWN0X3NldF9wcm9wZXJ0eV9oZWxwZXIpLAorCSAgKGdzdF92NGwyX29iamVjdF9nZXRfcHJvcGVydHlfaGVscGVyKSwgKGdzdF92NGwyX3NldF9kZWZhdWx0cyksCisJICAoZ3N0X3Y0bDJfb2JqZWN0X3N0YXJ0KSwgKGdzdF92NGwyX29iamVjdF9zdG9wKToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfdjRsMnNyY19pbml0KSwgKGdzdF92NGwyc3JjX2Rpc3Bvc2UpLAorCSAgKGdzdF92NGwyc3JjX3NldF9wcm9wZXJ0eSksIChnc3RfdjRsMnNyY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF92NGwyc3JjX2ZpeGF0ZSksIChnc3RfdjRsMnNyY19nZXRfY2FwcyksCisJICAoZ3N0X3Y0bDJzcmNfc2V0X2NhcHMpLCAoZ3N0X3Y0bDJzcmNfZ2V0X3JlYWQpLAorCSAgKGdzdF92NGwyc3JjX2dldF9tbWFwKSwgKGdzdF92NGwyc3JjX2NyZWF0ZSk6CisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogKGdzdF92NGwyX2dldF9jYXBhYmlsaXRpZXMpLAorCSAgKGdzdF92NGwyX29wZW4pLCAoZ3N0X3Y0bDJfY2xvc2UpLCAoZ3N0X3Y0bDJfZ2V0X25vcm0pLAorCSAgKGdzdF92NGwyX3NldF9ub3JtKSwgKGdzdF92NGwyX2dldF9mcmVxdWVuY3kpLAorCSAgKGdzdF92NGwyX3NldF9mcmVxdWVuY3kpLCAoZ3N0X3Y0bDJfc2lnbmFsX3N0cmVuZ3RoKSwKKwkgIChnc3RfdjRsMl9nZXRfYXR0cmlidXRlKSwgKGdzdF92NGwyX3NldF9hdHRyaWJ1dGUpLAorCSAgKGdzdF92NGwyX2dldF9pbnB1dCksIChnc3RfdjRsMl9zZXRfaW5wdXQpOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19maWxsX2Zvcm1hdF9saXN0KSwKKwkgIChnc3RfdjRsMnNyY19xdWV1ZV9mcmFtZSksIChnc3RfdjRsMnNyY19ncmFiX2ZyYW1lKSwKKwkgIChnc3RfdjRsMnNyY19nZXRfY2FwdHVyZSksIChnc3RfdjRsMnNyY19zZXRfY2FwdHVyZSksCisJICAoZ3N0X3Y0bDJzcmNfY2FwdHVyZV9pbml0KSwgKGdzdF92NGwyc3JjX2NhcHR1cmVfc3RhcnQpLAorCSAgKGdzdF92NGwyc3JjX2NhcHR1cmVfc3RvcCksIChnc3RfdjRsMnNyY19jYXB0dXJlX2RlaW5pdCksCisJICAoZ3N0X3Y0bDJzcmNfZ2V0X3NpemVfbGltaXRzKSwgKGdzdF92NGwyc3JjX3NldF9mcHMpLAorCSAgKGdzdF92NGwyc3JjX2dldF9mcHMpLCAoZ3N0X3Y0bDJzcmNfYnVmZmVyX2ZpbmFsaXplKSwKKwkgIChnc3RfdjRsMnNyY19idWZmZXJfbmV3KToKKwkgIEZpeCBwYXNzIGF0IGNvZGUgY2xlYW51cHMsIG1vdmUgZXJyb3JzIGNhc2VzIG91dCBvZiB0aGUgbm9ybWFsCisJICBmbG93IGZvciBhZGRpdGlvbmFsIGNvZGUgY2xhcml0eS4KKworMjAwNi0wOS0yNSAxMzo1NTo0NCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F1dG9kZXRlY3QvOiBTbWFsbCBjbGVhbnVwcy4gZG9uJ3QgdHJ5IHRvIHNldCAic3luYyIgcHJvcGVydHkgd2hlbiBpdCBpcyBub3QgYXZhaWxhYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkgIChnc3RfYXV0b19hdWRpb19zaW5rX2Jhc2VfaW5pdCksIChnc3RfYXV0b19hdWRpb19zaW5rX2NsYXNzX2luaXQpLAorCSAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfZmluZF9iZXN0KToKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jOiAoZ3N0X2F1dG9fdmlkZW9fc2lua19kZXRlY3QpOgorCSAgU21hbGwgY2xlYW51cHMuCisJICBkb24ndCB0cnkgdG8gc2V0ICJzeW5jIiBwcm9wZXJ0eSB3aGVuIGl0IGlzIG5vdCBhdmFpbGFibGUuCisKKzIwMDYtMDktMjUgMTE6NDc6NDIgKzAwMDAgIFBldGVyIEtqZWxsZXJzdGVkdCA8cGtqQGF4aXMuY29tPgorCisJICBnc3QvOiBJbmNsdWRlIHN0ZGxpYi5oIGluIHNvbWUgbW9yZSBwbGFjZXMsIG1ha2VzIHRoaW5ncyBjb21waWxlIHdpdGggdUNsaWJjIGFuZCAtV2Vycm9yICgjMzU3NTkyKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFBldGVyIEtqZWxsZXJzdGVkdCAgPHBraiBhdCBheGlzIGNvbT4KKwkgICogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICBJbmNsdWRlIHN0ZGxpYi5oIGluIHNvbWUgbW9yZSBwbGFjZXMsIG1ha2VzIHRoaW5ncyBjb21waWxlCisJICB3aXRoIHVDbGliYyBhbmQgLVdlcnJvciAoIzM1NzU5MikuCisKKzIwMDYtMDktMjUgMDk6MTU6MTAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogb3VyIGNvZGUgc2hvdWxkIGhhbmRsZSB0aGF0IGZpbmUuIFNvbWUgb2YgdGhlIGJ1dHRvbnMgb24gdGhlIGFwcGxlIHRyYWlsZXIgc2l0ZSBhcmUgYXBwYXJlbnRseS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgIFNldCBtaW5pbXVtIGhlaWdodCB0byA4IChmcm9tIDE2KSwgb3VyIGNvZGUgc2hvdWxkIGhhbmRsZQorCSAgdGhhdCBmaW5lLiBTb21lIG9mIHRoZSBidXR0b25zIG9uIHRoZSBhcHBsZSB0cmFpbGVyIHNpdGUKKwkgIGFyZSBhcHBhcmVudGx5IG9ubHkgMTUgcGl4ZWxzIGhpZ2ggKHNlZSAjMzU3NDcwKS4KKworMjAwNi0wOS0yMyAxNTozMTo1NiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvOiBJbXByb3ZlIGVycm9yIHJlcG9ydGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19sb29wKSwgKGdzdF9ydHNwc3JjX3NlbmQpLAorCSAgKGdzdF9ydHNwc3JjX29wZW4pOgorCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiAocnRzcF9jb25uZWN0aW9uX2NyZWF0ZSksCisJICAocnRzcF9jb25uZWN0aW9uX2Nvbm5lY3QpLCAocnRzcF9jb25uZWN0aW9uX3JlYWQpLCAocmVhZF9ib2R5KSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fcmVjZWl2ZSk6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmM6IChydHNwX3N0cnJlc3VsdCk6CisJICAqIGdzdC9ydHNwL3J0c3BkZWZzLmg6CisJICBJbXByb3ZlIGVycm9yIHJlcG9ydGluZy4KKworMjAwNi0wOS0yMyAxNTozMDo0MCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEZpeCBrbGFzcyB0eXBvcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOiAoZ3N0X2FzdGVyaXNraDI2M19wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzogKGdzdF9ydHBfTDE2ZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6IChnc3RfcnRwX2Ftcl9kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOiAoZ3N0X3J0cF9nc21fZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzogKGdzdF9ydHBfaDI2M3BfZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOiAoZ3N0X3J0cF9oMjY0X2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzogKGdzdF9ydHBfaWxiY19kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmM6IChnc3RfcnRwX21wMnRfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9tcDJ0X2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzogKGdzdF9ydHBfbXA0Z19kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6IChnc3RfcnRwX21wNHZfZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6IChnc3RfcnRwX21wYV9kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtYWRlcGF5LmM6IChnc3RfcnRwX3BjbWFfZGVwYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5jOiAoZ3N0X3J0cF9wY211X2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmM6IChnc3RfcnRwX3NwZWV4X2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzogKGdzdF9ydHBfc3Yzdl9kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYzogKGdzdF9ydHBfdm9yYmlzX2RlcGF5X3BsdWdpbl9pbml0KToKKwkgIEZpeCBrbGFzcyB0eXBvcy4KKwkgIE1hcmsgUkFOS19NQVJHSU5BTCwgZGVjb2RlYmluIGNhbiBoYW5kbGUgdGhlIGRlcGF5bG9hZGVycyBmaW5lLgorCisyMDA2LTA5LTIyIDE3OjUzOjQ4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IE5lZWQgIC1iYXNlIENWUyBmb3IgZ3N0X2Jhc2VfcnRwX2RlcGF5bG9hZF9wdXNoX3RzKCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgTmVlZCAgLWJhc2UgQ1ZTIGZvciBnc3RfYmFzZV9ydHBfZGVwYXlsb2FkX3B1c2hfdHMoKS4KKworMjAwNi0wOS0yMiAxNzoyMjozNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBEb24ndCBjaGVjayBmb3IgYSB0YWcgdGhhdCBpcyBuZXZlciB0aGVyZSBhbmQgY2hlY2sgaWYgd2UgcmVhZCB0aGUgY29ycmVjdCB0YWcuIEZpeGVzIHNlZWtpbmcgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5kZXgpOgorCSAgRG9uJ3QgY2hlY2sgZm9yIGEgdGFnIHRoYXQgaXMgbmV2ZXIgdGhlcmUgYW5kIGNoZWNrIGlmIHdlIHJlYWQgdGhlCisJICBjb3JyZWN0IHRhZy4gRml4ZXMgc2Vla2luZyBhZ2Fpbi4KKwkgIFdlIG11c3QgcG9zdCBhbiBlcnJvciB3aGVuIGFsbCBwYWRzIGFyZSB1bmxpbmtlZC4KKworMjAwNi0wOS0yMiAxNToxNToxMyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IE1vcmUgZml4YWdlLCBzZXQgZW5kb2Rlci1wYXJhbXMgY29ycmVjdGx5IGluIHRoZSBwYXlsb2FkZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOiAoZ3N0X3J0cF92b3JiaXNfZGVwYXlfcHJvY2Vzcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmM6IChnc3RfcnRwX3ZvcmJpc19wYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X3Jlc2V0X3BhY2tldCksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X2luaXRfcGFja2V0KSwKKwkgIChnc3RfcnRwX3ZvcmJpc19wYXlfZmx1c2hfcGFja2V0KSwgKGdzdF9ydHBfdm9yYmlzX3BheV9wYXJzZV9pZCksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgTW9yZSBmaXhhZ2UsIHNldCBlbmRvZGVyLXBhcmFtcyBjb3JyZWN0bHkgaW4gdGhlIHBheWxvYWRlci4KKworMjAwNi0wOS0yMiAxMjoxMjoxMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F1dG9kZXRlY3QvOiBNYWtlIHN0YXRpYyBwYWQgdGVtcGxhdGVzIHN0YXRpYyB0byBhcHBlYXNlIHZhbGdyaW5kJ3MgbGVhayBkZXRlY3Rvci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJICAoZ3N0X2F1dG9fYXVkaW9fc2lua19iYXNlX2luaXQpOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJICAoZ3N0X2F1dG9fdmlkZW9fc2lua19iYXNlX2luaXQpOgorCSAgTWFrZSBzdGF0aWMgcGFkIHRlbXBsYXRlcyBzdGF0aWMgdG8gYXBwZWFzZSB2YWxncmluZCdzIGxlYWsKKwkgIGRldGVjdG9yLgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvYXV0b2RldGVjdC5jOiAoR1NUX1NUQVJUX1RFU1QpLAorCSAgKGF1dG9kZXRlY3Rfc3VpdGUpOgorCSAgQWRkIHNpbXBsZSB0ZXN0IGZvciB0aGUgZ2hvc3RwYWQgbG9ja3VwIG9uIHNodXRkb3duIGZpeGVkIGluIGNvcmUKKwkgIENWUyAoYXVkaW8gYml0IGRpc2FibGVkIGJlY2F1c2UgaXQgd291bGQgbmVlZCBkb3plbnMgb2YgYWxzYQorCSAgc3VwcHJlc3Npb25zIGFuZCBJJ20gdG9vIGxhenkgdG8gYWRkIHRob3NlIG5vdykuCisKKzIwMDYtMDktMjIgMTI6MDg6MTQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBTbWFsbCBjbGVhbnVwcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmM6IChnc3RfcnRwX0wxNmRlcGF5X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6IChnc3RfcnRwX21wNGdfZGVwYXlfY2xhc3NfaW5pdCk6CisJICBTbWFsbCBjbGVhbnVwcy4KKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jOiAoZ3N0X3J0cF92b3JiaXNfZGVwYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX3ZvcmJpc19kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfdm9yYmlzX2RlcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfdm9yYmlzX2RlcGF5X2ZpbmFsaXplKSwgKGdzdF9ydHBfdm9yYmlzX2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfdm9yYmlzX2RlcGF5X3Byb2Nlc3MpLAorCSAgKGdzdF9ydHBfdm9yYmlzX2RlcGF5X3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF92b3JiaXNfZGVwYXlfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwX3ZvcmJpc19kZXBheV9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9ydHBfdm9yYmlzX2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jOiAoZ3N0X3J0cF92b3JiaXNfcGF5X2Jhc2VfaW5pdCksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X2NsYXNzX2luaXQpLCAoZ3N0X3J0cF92b3JiaXNfcGF5X2luaXQpLAorCSAgKGdzdF9ydHBfdm9yYmlzX3BheV9zZXRjYXBzKSwgKGdzdF9ydHBfdm9yYmlzX3BheV9pbml0X3BhY2tldCksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X2ZsdXNoX3BhY2tldCksCisJICAoZ3N0X3J0cF92b3JiaXNfcGF5X2FwcGVuZF9idWZmZXIpLAorCSAgKGdzdF9ydHBfdm9yYmlzX3BheV9oYW5kbGVfYnVmZmVyKSwKKwkgIChnc3RfcnRwX3ZvcmJpc19wYXlfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5oOgorCSAgQWRkIGV4cGVyaW1lbnRhbCB2b3JiaXMgcGF5IGFuZCBkZXBheWxvYWRlcnMuCisKKzIwMDYtMDktMjEgMTM6MzM6MTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOiBGaXggcHJvZmlsZS1sZXZlbC1pZCBwYXJzaW5nIGFuZCBzZXR1cC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzogKGdzdF9ydHBfbXA0Z19wYXlfcGFyc2VfYXVkaW9fY29uZmlnKToKKwkgIEZpeCBwcm9maWxlLWxldmVsLWlkIHBhcnNpbmcgYW5kIHNldHVwLgorCisyMDA2LTA5LTIxIDA5OjUwOjQxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwLzogVXBkYXRlIFJFQURNRSwgc2ltcGxlIGNsZWFudXAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9SRUFETUU6CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX3NldF9wcm9wZXJ0eSk6CisJICBVcGRhdGUgUkVBRE1FLCBzaW1wbGUgY2xlYW51cC4KKworMjAwNi0wOS0yMSAwOTozNToxMyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9SRUFETUU6IFVwZGF0ZSBSRUFETUUgd2l0aCBzb21lIGV4YW1wbGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvUkVBRE1FOgorCSAgVXBkYXRlIFJFQURNRSB3aXRoIHNvbWUgZXhhbXBsZXMuCisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOiAoZ3N0X3J0cF9tcDRnX3BheV9pbml0KSwKKwkgIChnc3RfcnRwX21wNGdfcGF5X2ZpbmFsaXplKSwgKGdzdF9ydHBfbXA0Z19wYXlfcGFyc2VfYXVkaW9fY29uZmlnKSwKKwkgIChnc3RfcnRwX21wNGdfcGF5X3BhcnNlX3ZpZGVvX2NvbmZpZyksIChnc3RfcnRwX21wNGdfcGF5X25ld19jYXBzKSwKKwkgIChnc3RfcnRwX21wNGdfcGF5X3NldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuaDoKKwkgIE1ha2Ugb3B0aW9uYWwgUlRQIHBhcmFtZXRlcnMgb2YgdHlwZSBTVFJJTkcsIGFzIHJlcXVpcmVkIGJ5IHRoZQorCSAgYXBwbGljYXRpb24veC1ydHAgY2FwcyBzcGVjaWZpY2F0aW9uLgorCisyMDA2LTA5LTIwIDE5OjM3OjQ1ICswMDAwICBQaGlsaXBwZSBLYWxhZiA8cGhpbGlwcGUua2FsYWZAY29sbGFib3JhLmNvLnVrPgorCisJICBnc3QvcnRwLzogQ29ycmVjdGx5IGNhbGN1bGF0ZSBzaXplIG9mIGVhY2ggSDI2MysgUlRQIGJ1ZmZlciB0YWtpbmcgaW50byBhY2NvdW50IE1UVSBhbmQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSAgQ29ycmVjdGx5IGNhbGN1bGF0ZSBzaXplIG9mIGVhY2ggSDI2MysgUlRQIGJ1ZmZlciB0YWtpbmcgaW50byBhY2NvdW50IE1UVSBhbmQKKwkgIFJUUCBoZWFkZXIuCisKKzIwMDYtMDktMjAgMTY6NDE6NDggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvTWFrZWZpbGUuYW06IEFuZCBtYWtlZmlsZSB0b28uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgIEFuZCBtYWtlZmlsZSB0b28uCisKKzIwMDYtMDktMjAgMTY6MDk6MDMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBBZGRlZCBwcmVsaW1pbmFyeSBBU0YgZGVwYXlsb2FkZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBhc2ZkZXBheS5jOiAoZ3N0X3J0cF9hc2ZfZGVwYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX2FzZl9kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfYXNmX2RlcGF5X2luaXQpLAorCSAgKGRlY29kZV9iYXNlNjQpLCAoZ3N0X3J0cF9hc2ZfZGVwYXlfc2V0Y2FwcyksCisJICAoZ3N0X3J0cF9hc2ZfZGVwYXlfcHJvY2VzcyksIChnc3RfcnRwX2FzZl9kZXBheV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfYXNmX2RlcGF5X2dldF9wcm9wZXJ0eSksIChnc3RfcnRwX2FzZl9kZXBheV9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9ydHBfYXNmX2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBhc2ZkZXBheS5oOgorCSAgQWRkZWQgcHJlbGltaW5hcnkgQVNGIGRlcGF5bG9hZGVyLgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjRkZXBheS5jOiAoZGVjb2RlX2Jhc2U2NCk6CisJICBGaXggYmFzZTY0IGRlY29kaW5nLgorCisyMDA2LTA5LTIwIDE2OjA2OjI3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9VUkxTOiBBZGRlZCBzb21lIHRlc3QgVVJMUy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9VUkxTOgorCSAgQWRkZWQgc29tZSB0ZXN0IFVSTFMuCisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2NyZWF0ZV9zdHJlYW0pLAorCSAgKGdzdF9ydHNwc3JjX2xvb3ApLCAoZ3N0X3J0c3BzcmNfb3Blbik6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIFdoZW4gY3JlYXRpbmcgc3RyZWFtcywgZ2l2ZSBhY2Nlc3MgdG8gdGhlIGNvbXBsZXRlIFNEUC4KKwkgIEZpeCBzb21lIGxlYWtzLgorCSAgQ29sbGVjdCBhbmQgbWVyZ2UgZ2xvYmFsIHN0cmVhbSBwcm9wZXJ0aWVzIGluIHN0cmVhbSBjYXBzLgorCSAgUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgV01TZXJ2ZXIuCisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fY3JlYXRlKSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fY29ubmVjdCksIChydHNwX2Nvbm5lY3Rpb25fcmVhZCksIChyZWFkX2JvZHkpLAorCSAgKHJ0c3BfY29ubmVjdGlvbl9yZWNlaXZlKToKKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uaDoKKwkgIE1ha2UgY29ubmVjdGlvbiBpbnRlcnJ1cHRhYmxlLgorCSAgUmVmYWN0b3IgdG8gbWFrZSBpdCByZWNvbm5lY3RhYmxlLgorCSAgRG9uJ3QgZmFpbCBvbiBzaG9ydCByZWFkcyB3aGVuIHJlYWRpbmcgZGF0YSBwYWNrZXRzLgorCSAgKiBnc3QvcnRzcC9ydHNwdXJsLmM6IChydHNwX3VybF9wYXJzZSksIChydHNwX3VybF9zZXRfcG9ydCksCisJICAocnRzcF91cmxfZ2V0X3BvcnQpOgorCSAgKiBnc3QvcnRzcC9ydHNwdXJsLmg6CisJICBBZGQgbWV0aG9kcyBmb3IgZ2V0dGluZy9zZXR0aW5nIHRoZSBwb3J0LgorCSAgKiBnc3QvcnRzcC9zZHBtZXNzYWdlLmM6IChzZHBfbWVzc2FnZV9nZXRfYXR0cmlidXRlX3ZhbF9uKSwKKwkgIChzZHBfbWVzc2FnZV9nZXRfYXR0cmlidXRlX3ZhbCksIChzZHBfbWVkaWFfZ2V0X2F0dHJpYnV0ZSksCisJICAoc2RwX21lZGlhX2dldF9hdHRyaWJ1dGVfdmFsX24pLCAoc2RwX21lZGlhX2dldF9hdHRyaWJ1dGVfdmFsKSwKKwkgIChzZHBfbWVkaWFfZ2V0X2Zvcm1hdCksIChzZHBfcGFyc2VfbGluZSksCisJICAoc2RwX21lc3NhZ2VfcGFyc2VfYnVmZmVyKToKKwkgIEZpeCBoZWFkZXJzLgorCSAgQWRkIG1ldGhvZHMgZm9yIGdldHRpbmcgbXVsdGlwbGUgYXR0cmlidXRlcyB3aXRoIHRoZSBzYW1lIG5hbWUuCisJICBJbmNyZWFzZSBidWZmZXIgc2l6ZSB3aGVuIHBhcnNpbmcuCisJICBGaXggcGFyc2luZyBvZiBhPWZvbyBmaWVsZHMuCisJICAqIGdzdC9ydHNwL3Rlc3QuYzogKG1haW4pOgorCSAgVXBkYXRlIHRvIG5ldyBjb25uZWN0aW9uIEFQSS4KKwkgICogZ3N0L3J0c3AvcnRzcG1lc3NhZ2UuYzogKHJ0c3BfbWVzc2FnZV9uZXdfcmVzcG9uc2UpLAorCSAgKHJ0c3BfbWVzc2FnZV9pbml0X3Jlc3BvbnNlKSwgKHJ0c3BfbWVzc2FnZV9pbml0X2RhdGEpLAorCSAgKHJ0c3BfbWVzc2FnZV91bnNldCksIChydHNwX21lc3NhZ2VfZnJlZSksIChydHNwX21lc3NhZ2VfZHVtcCk6CisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmg6CisJICAqIGdzdC9ydHNwL3J0c3B0cmFuc3BvcnQuYzogKHJ0c3BfdHJhbnNwb3J0X2ZyZWUpOgorCSAgKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0Lmg6CisJICAqIGdzdC9ydHNwL3NkcC5oOgorCSAgKiBnc3QvcnRzcC9zZHBtZXNzYWdlLmg6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3AuYzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcC5oOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRwZGVjLmg6CisJICAqIGdzdC9ydHNwL3J0c3AuaDoKKwkgICogZ3N0L3J0c3AvcnRzcGRlZnMuYzoKKwkgICogZ3N0L3J0c3AvcnRzcGRlZnMuaDoKKwkgIER1YWwgbGljZW5zZWQgdW5kZXIgTUlUIGFuZCBMR1BMIG5vdy4KKworMjAwNi0wOS0xOSAxNzoyNToxNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvZ3N0cnRzcHNyYy4qOiBSZW9yZ2FuaXplIHN0cmVhbSBwYXJzaW5nIGFuZCBjcmVhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChmaW5kX3N0cmVhbV9ieV9wdCksCisJICAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksIChnc3RfcnRzcHNyY19mcmVlX3N0cmVhbSksCisJICAoZ3N0X3J0c3BzcmNfbWVkaWFfdG9fY2FwcyksIChnc3RfcnRzcHNyY19zdHJlYW1fc2V0dXBfcnRwKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksIChmaW5kX3N0cmVhbV9ieV9jaGFubmVsKSwKKwkgIChnc3RfcnRzcHNyY19wdXNoX2V2ZW50KSwgKGdzdF9ydHNwc3JjX2xvb3ApLCAoZ3N0X3J0c3BzcmNfc2VuZCksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfbWV0aG9kcyksIChnc3RfcnRzcHNyY19vcGVuKSwKKwkgIChnc3RfcnRzcHNyY19wYXJzZV9ydHBpbmZvKSwgKGdzdF9ydHNwc3JjX3BsYXkpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBSZW9yZ2FuaXplIHN0cmVhbSBwYXJzaW5nIGFuZCBjcmVhdGlvbi4KKwkgIERldGVjdCBjb250YWluZXIgZm9ybWF0cyBpbiBpbnRlcmxlYXZlZCBtb2RlLgorCSAgS2VlcCBtb3JlIHN0YXRlIGFib3V0IHRoZSBzdHJlYW1zLgorCSAgQXNzdW1lIGEgc2VydmVyIGFsc28gc3VwcG9ydHMgUExBWSBpZiBpdCBkb2VzIG5vdCBzYXkuCisJICBBZGQgdW5pY2FzdCBhbmQgaW50ZXJsZWF2ZWQgcHJvcGVydGllcyB0byBUQ1AgdHJhbnNwb3J0IHJlcXVlc3RzIHRvIG1ha2UKKwkgIHNvbWUgc2VydmVycyBoYXBweSAoV01TZXJ2ZXIpLgorCSAgKiBnc3QvcnRzcC9zZHBtZXNzYWdlLmg6CisJICBBZGQgc29tZSBkZWZpbmVzIGZvciB0aGUgc3RhbmRhcmQgQmFuZHdpZHRoIHR5cGVzLgorCisyMDA2LTA5LTE5IDE2OjI0OjEwICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIHRlc3RzL2ljbGVzL3Y0bDJzcmMtdGVzdC5jOgorCSAgSnVzdCBhIHNtYWxsIGZpeCB0byB0aGUgYXBwIG9wdGlvbnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEp1c3QgYSBzbWFsbCBmaXggdG8gdGhlIGFwcCBvcHRpb25zLgorCisyMDA2LTA5LTE5IDEzOjA4OjM1ICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5oOgorCSogdGVzdHMvaWNsZXMvdjRsMnNyYy10ZXN0LmM6CisJICBBZGQgVmlkZW8gT3JpZW50YXRpb24gaW50ZXJmYWNlIHN1cHBvcnQgdG8gdjRsMnNyYy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQWRkIFZpZGVvIE9yaWVudGF0aW9uIGludGVyZmFjZSBzdXBwb3J0IHRvIHY0bDJzcmMuCisKKzIwMDYtMDktMTkgMTA6NTM6NTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL3Rlc3QuYzogRml4IGJ1aWxkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL3Rlc3QuYzogKG1haW4pOgorCSAgRml4IGJ1aWxkLgorCisyMDA2LTA5LTE5IDEwOjE0OjUyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogQWRkIG1zLWdzbSB0byB0aGUgc3JjIHRlbXBsYXRlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgQWRkIG1zLWdzbSB0byB0aGUgc3JjIHRlbXBsYXRlLgorCisyMDA2LTA5LTE4IDE3OjM3OjQ2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLio6IFNtYWxsIGNsZWFudXBzLCBhZGRlZCBkb2N1bWVudGF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX21lZGlhX3RvX2NhcHMpLAorCSAgKGdzdF9ydHNwc3JjX3NlbmQpLCAoZ3N0X3J0c3BzcmNfcGFyc2VfbWV0aG9kcyksCisJICAoZ3N0X3J0c3BzcmNfb3BlbiksIChnc3RfcnRzcHNyY19jbG9zZSksIChnc3RfcnRzcHNyY19wbGF5KSwKKwkgIChnc3RfcnRzcHNyY19wYXVzZSksIChnc3RfcnRzcHNyY19jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9ydHNwc3JjX3VyaV9nZXRfdXJpKSwgKGdzdF9ydHNwc3JjX3VyaV9zZXRfdXJpKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgU21hbGwgY2xlYW51cHMsIGFkZGVkIGRvY3VtZW50YXRpb24uCisJICBUcnkgdG8gY2xlYW4gdXAgdGhlIHJlcXVlc3RzIGFuZCByZXNwb25zZXMuCisJICBSZWZhY3RvciBwYXJzaW5nIHRoZSBzdXBwb3J0ZWQgbWV0aG9kcy4KKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJ0c3BfY29ubmVjdGlvbl9vcGVuKSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fY3JlYXRlKSwgKHJ0c3BfY29ubmVjdGlvbl9zZW5kKSwKKwkgIChwYXJzZV9yZXNwb25zZV9zdGF0dXMpLCAocGFyc2VfcmVxdWVzdF9saW5lKSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fcmVjZWl2ZSksIChydHNwX2Nvbm5lY3Rpb25fY2xvc2UpLAorCSAgKHJ0c3BfY29ubmVjdGlvbl9mcmVlKToKKwkgICogZ3N0L3J0c3AvcnRzcHRyYW5zcG9ydC5jOiAocnRzcF90cmFuc3BvcnRfbmV3KSwKKwkgIChydHNwX3RyYW5zcG9ydF9pbml0KSwgKHJ0c3BfdHJhbnNwb3J0X3BhcnNlKSwKKwkgIChydHNwX3RyYW5zcG9ydF9mcmVlKToKKwkgICogZ3N0L3J0c3AvcnRzcHVybC5jOiAocnRzcF91cmxfcGFyc2UpOgorCSAgKiBnc3QvcnRzcC9zZHBtZXNzYWdlLmM6IChzZHBfbWVzc2FnZV9uZXcpLCAoc2RwX21lc3NhZ2VfaW5pdCksCisJICAoc2RwX21lc3NhZ2VfY2xlYW4pLCAoc2RwX21lc3NhZ2VfZnJlZSksIChzZHBfbWVkaWFfbmV3KSwKKwkgIChzZHBfbWVkaWFfaW5pdCksIChzZHBfbWVzc2FnZV9wYXJzZV9idWZmZXIpLCAoc2RwX21lc3NhZ2VfZHVtcCk6CisJICBVc2UgZ19yZXR1cm5fdmFsIHNvbWUgbW9yZS4KKwkgICogZ3N0L3J0c3AvcnRzcGRlZnMuaDoKKwkgIEFkZCBtb3JlIGVudW0gdmFsdWVzIHRvIHRyYWNrIGluaXRpYWwgc3RhdGVzLgorCSAgKiBnc3QvcnRzcC9ydHNwbWVzc2FnZS5jOiAocnRzcF9tZXNzYWdlX25ld19yZXF1ZXN0KSwKKwkgIChydHNwX21lc3NhZ2VfaW5pdF9yZXF1ZXN0KSwgKHJ0c3BfbWVzc2FnZV9uZXdfcmVzcG9uc2UpLAorCSAgKHJ0c3BfbWVzc2FnZV9pbml0X3Jlc3BvbnNlKSwgKHJ0c3BfbWVzc2FnZV9pbml0X2RhdGEpLAorCSAgKHJ0c3BfbWVzc2FnZV91bnNldCksIChydHNwX21lc3NhZ2VfZnJlZSksCisJICAocnRzcF9tZXNzYWdlX2FkZF9oZWFkZXIpLCAocnRzcF9tZXNzYWdlX3JlbW92ZV9oZWFkZXIpLAorCSAgKHJ0c3BfbWVzc2FnZV9nZXRfaGVhZGVyKSwgKHJ0c3BfbWVzc2FnZV9zZXRfYm9keSksCisJICAocnRzcF9tZXNzYWdlX3Rha2VfYm9keSksIChydHNwX21lc3NhZ2VfZ2V0X2JvZHkpLAorCSAgKHJ0c3BfbWVzc2FnZV9zdGVhbF9ib2R5KSwgKHJ0c3BfbWVzc2FnZV9kdW1wKToKKwkgICogZ3N0L3J0c3AvcnRzcG1lc3NhZ2UuaDoKKwkgIFJlb3JkZXIgYXJndW1lbnRzLCBvYmplY3QgZ29lcyBhcyB0aGUgZmlyc3Qgb25lLgorCSAgVXNlIGdfcmV0dXJuX3ZhbCBzb21lIG1vcmUuCisKKzIwMDYtMDktMTggMTU6MzY6MTQgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSAgRml4IEdTVF9CVUZGRVJfRFVSQVRJT04uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEZpeCBHU1RfQlVGRkVSX0RVUkFUSU9OLgorCisyMDA2LTA5LTE4IDE0OjAwOjQxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLio6IEV4cG9ydCBzb21ldGltZXMgc291cmNlIHBhZCB3aXRoIGNvcnJlY3QgY2FwcyBvbiB0aGUgdGVtcGxhdGUsIGNyZWF0ZSB0aGUgZ2hvc3RwYWQgZnJvbSB0aGUgdGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19iYXNlX2luaXQpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwgKGdzdF9ydHNwc3JjX3B1c2hfZXZlbnQpLAorCSAgKGdzdF9ydHNwc3JjX2xvb3ApLCAoZ3N0X3J0c3BzcmNfdXJpX3NldF91cmkpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBFeHBvcnQgc29tZXRpbWVzIHNvdXJjZSBwYWQgd2l0aCBjb3JyZWN0IGNhcHMgb24gdGhlIHRlbXBsYXRlLCBjcmVhdGUKKwkgIHRoZSBnaG9zdHBhZCBmcm9tIHRoZSB0ZW1wbGF0ZS4KKwkgIFJlbW92ZSBSVENQIHRlbXBsYXRlIGFzIHdlIG5ldmVyIGV4cG9zZSBSVENQLgorCSAgUHJvdGVjdCBhZ2FpbnN0IGludmFsaWQgYm9keSBzaXplLgorCSAgQXZvaWQgbWVtY3B5IHdoZW4gY3JlYXRpbmcgdGhlIG91dHB1dCBidWZmZXIuCisJICBQcm9wZXJseSBwb3N0IGFuIGVycm9yIGFuZCBzZW5kIEVPUyB3aGVuIHRoZSBsb29wIGZ1bmN0aW9uIGlzIHNodXQgZG93bi4KKworMjAwNi0wOS0xOCAxMToyOToxMiArMDAwMCAgTHV0eiBNdWVsbGVyIDxsdXR6QHRvcGZyb3NlLmRlPgorCisJICBnc3QvcnRzcC9nc3RydHNwc3JjLio6IE1ha2Ugc3VyZSB3ZSBjYW4gbmV2ZXIgc2V0IGFuIGludmFsaWQgbG9jYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEJhc2VkIG9uIHBhdGNoIGJ5OiBMdXR6IE11ZWxsZXIgPGx1dHogYXQgdG9wZnJvc2UgZG90IGRlPgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfcnRzcHNyY19pbml0KSwgKGdzdF9ydHNwc3JjX3NldF9wcm9wZXJ0eSksIChnc3RfcnRzcHNyY19vcGVuKSwKKwkgIChnc3RfcnRzcHNyY191cmlfZ2V0X3VyaSksIChnc3RfcnRzcHNyY191cmlfc2V0X3VyaSk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkgIE1ha2Ugc3VyZSB3ZSBjYW4gbmV2ZXIgc2V0IGFuIGludmFsaWQgbG9jYXRpb24uCisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmM6IChydHNwX21lc3NhZ2Vfc3RlYWxfYm9keSk6CisJICAqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmg6CisJICBBZGRlZCBfc3RlYWxfYm9keSBtZXRob2QgZm9yIGZ1dHVyZSB1c2UuCisJICAqIGdzdC9ydHNwL3J0c3B1cmwuYzogKHJ0c3BfdXJsX3BhcnNlKSwgKHJ0c3BfdXJsX2ZyZWUpOgorCSAgTWFrZSBmcmVlaW5nIG9mIE5VTEwgdXJsIHJldHVybiBpbW1lZGlhdGx5LgorCisyMDA2LTA5LTE4IDEwOjQyOjUyICswMDAwICBMdXR6IE11ZWxsZXIgPGx1dHpAdG9wZnJvc2UuZGU+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuKjogVXNlIGJvaWxlcnBsYXRlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBCYXNlZCBvbiBwYXRjaCBieTogTHV0eiBNdWVsbGVyIDxsdXR6IGF0IHRvcGZyb3NlIGRvdCBkZT4KKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoX2RvX2luaXQpLCAoZ3N0X3J0c3BzcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0c3BzcmNfaW5pdCksIChnc3RfcnRzcHNyY19zdHJlYW1fc2V0dXBfcnRwKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksIChnc3RfcnRzcHNyY19wbGF5KSwKKwkgIChnc3RfcnRzcHNyY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBVc2UgYm9pbGVycGxhdGUuCisJICBNYWtlIHJ0c3BzcmMgc3ViY2xhc3MgR3N0QmluIHRvIG1ha2Ugc3RhdGUgY2hhbmdlcyBlYXNpZXIuCisJICBBZGQgUmFuZ2UgaGVhZGVyIGZpZWxkIG9uIHRoZSBQTEFZIHJlcXVlc3QuCisKKzIwMDYtMDktMTggMDg6NTk6MTcgKzAwMDAgIFRoaWpzIFZlcm1laXIgPHRoaWpzLnZlcm1laXJAYmFyY28uY29tPgorCisJICBnc3QvcnRzcC86IFNtYWxsIGNsZWFudXBzLiB3aGVuIG11bHRpY2FzdCBpcyBzZWxlY3RlZCBhcyB0aGUgdHJhbnNwb3J0LCBjcmVhdGUgVURQIHNvdXJjZXMgYW5kIGNvbm5lY3QgdG8gdGhlIG11bHRpY2EuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IFRoaWpzIFZlcm1laXIgPHRoaWpzIGRvdCB2ZXJtZWlyIGF0IGJhcmNvIGRvdCBjb20+CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3NldF9zdGF0ZSksCisJICAoZ3N0X3J0c3BzcmNfbWVkaWFfdG9fY2FwcyksIChnc3RfcnRzcHNyY19zdHJlYW1fc2V0dXBfcnRwKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksIChnc3RfcnRzcHNyY19vcGVuKSwKKwkgIChnc3RfcnRzcHNyY19jbG9zZSksIChnc3RfcnRzcHNyY19wbGF5KSwgKGdzdF9ydHNwc3JjX3BhdXNlKToKKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKGluZXRfYXRvbik6CisJICBTbWFsbCBjbGVhbnVwcy4KKwkgIHdoZW4gbXVsdGljYXN0IGlzIHNlbGVjdGVkIGFzIHRoZSB0cmFuc3BvcnQsIGNyZWF0ZSBVRFAgc291cmNlcyBhbmQKKwkgIGNvbm5lY3QgdG8gdGhlIG11bHRpY2FzdCBncm91cC4KKwkgIE1vdmUgcGFyc2luZyBhbmQgc2V0dGluZyBvZiBjYXBzIHRvIGEgY29tbW9uIHBsYWNlLgorCSAgRml4ZXMgIzM0OTg5NC4KKworMjAwNi0wOS0xNiAyMjoxNDozNSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBNb3JlIEdfT0JKRUNUIG1hY3JvIGZpeGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvaGVybWVzL2dzdGhlcm1lc2NvbG9yc3BhY2UuYzoKKwkgICogZXh0L2l2b3JiaXMvdm9yYmlzZmlsZS5jOgorCSAgKiBleHQvbGNzL2dzdGNvbG9yc3BhY2UuYzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5oOgorCSAgKiBleHQveGluZS94aW5lYXVkaW9kZWMuYzoKKwkgICogZXh0L3hpbmUveGluZWF1ZGlvc2luay5jOgorCSAgKiBleHQveGluZS94aW5laW5wdXQuYzoKKwkgICogZ3N0L2NoYXJ0L2dzdGNoYXJ0LmM6CisJICAqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJICAqIGdzdC9nYW1lcy9nc3RwdXp6bGUuYzoKKwkgICogZ3N0L2xpYnJmYi9nc3RyZmJzcmMuYzoKKwkgICogZ3N0L21peG1hdHJpeC9taXhtYXRyaXguYzoKKwkgICogZ3N0L25zZi9nc3Ruc2YuaDoKKwkgICogZ3N0L3ZiaWRlYy9nc3R2YmlkZWMuYzoKKwkgICogZ3N0L3ZpcnR1YWxkdWIvZ3N0eHNoYXJwZW4uYzoKKwkgIE1vcmUgR19PQkpFQ1QgbWFjcm8gZml4aW5nLgorCisyMDA2LTA5LTE2IDIxOjU3OjI5ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIE1vcmUgR19PQkpFQ1QgbWFjcm8gZml4aW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkgICogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJICAqIGdzdC9kZWJ1Zy9icmVha215ZGF0YS5jOgorCSAgKiBnc3QvZGVidWcvbmVnb3RpYXRpb24uYzoKKwkgICogZ3N0L2RlYnVnL3Rlc3RwbHVnaW4uYzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuYzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOgorCSAgKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6CisJICAqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJICAqIGdzdC9lZmZlY3R2L2dzdHJldi5jOgorCSAgKiBnc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmM6CisJICAqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJICAqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvdGVtcGxhdGUuYzoKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuaDoKKwkgIE1vcmUgR19PQkpFQ1QgbWFjcm8gZml4aW5nLgorCisyMDA2LTA5LTE2IDE0OjMwOjU5ICswMDAwICBZdmVzIExlZmVidnJlIDxpdmFub2hlQGFiYWNvbS5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IENvcnJlY3RseSBzZXQgdGhlIGR3TGVuZ3RoIGluIHN0cmguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBZdmVzIExlZmVidnJlIDxpdmFub2hlIGF0IGFiYWNvbSBkb3QgY29tPgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aV9tdXhfc3RvcF9maWxlKToKKwkgIENvcnJlY3RseSBzZXQgdGhlIGR3TGVuZ3RoIGluIHN0cmguCisJICBXaXRoIHRoaXMgcGF0Y2gsIHRoZSBmaWxlIGR1cmF0aW9uIGlzIG5vdyBkaXNwbGF5ZWQgY29ycmVjdGx5IGluIHdpbmRvdworCSAgbWVkaWEgcGxheWVyIGFuZCB0aGUgQVZJIHBsYXlzIGNvbXBsZXRlbHkuIEZpeGVzICMzNTYxNDcKKworMjAwNi0wOS0xNSAxOToxMTowMCArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYzoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHRlc3RzL2ljbGVzL3Y0bDJzcmMtdGVzdC5jOgorCSAgVGhlIHRlc3QgYXBwbGljYXRpb24gYW5kIHRoZSBwbGdpbmQgZXJyb3IgbWVzc2FnZXMgaGFzIGJlZW4gaW1wcm92ZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFRoZSB0ZXN0IGFwcGxpY2F0aW9uIGFuZCB0aGUgcGxnaW5kIGVycm9yIG1lc3NhZ2VzIGhhcyBiZWVuIGltcHJvdmVkLgorCisyMDA2LTA5LTE1IDE3OjEwOjIyICswMDAwICBEYXJyZW4gS2VubnkgPGRhcnJlbi5rZW5ueUBzdW4uY29tPgorCisJICBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuYzogU2V0IHRoZSBvdXRwdXQgdHJhY2sgYXMgdGhlIE1BU1RFUiBzbyB0aGF0IHRoZSBnbm9tZS1zZXR0aW5ncy1kYWVtb24ga2V5YmluZGluZ3MuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IERhcnJlbiBLZW5ueSA8ZGFycmVuIGRvdCBrZW5ueSBhdCBzdW4gZG90IGNvbT4KKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJICAoZ3N0X3N1bmF1ZGlvbWl4ZXJfY3RybF9idWlsZF9saXN0KToKKwkgIFNldCB0aGUgb3V0cHV0IHRyYWNrIGFzIHRoZSBNQVNURVIgc28gdGhhdCB0aGUgZ25vbWUtc2V0dGluZ3MtZGFlbW9uCisJICBrZXliaW5kaW5ncyBmb3IgY2hhbmdpbmcgdGhlIHZvbHVtZSB1c2luZyB0aGUga2V5Ym9hcmQgd29ya3MuCisJICBGaXhlcyAjMzU2MTQyLgorCisyMDA2LTA5LTE1IDE2OjAxOjQ4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6IEZpeCBkb2N1bWVudGF0aW9uLCBpdCBpcyBub3QgcG9zc2libGUgdG8gY29udHJvbCB0aGUgZnJhbWVyYXRlIG9mIGpwZWdkZWMgdXNpbmcgZmlsdGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6IChnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYWluKToKKwkgIEZpeCBkb2N1bWVudGF0aW9uLCBpdCBpcyBub3QgcG9zc2libGUgdG8gY29udHJvbCB0aGUgZnJhbWVyYXRlIG9mIGpwZWdkZWMKKwkgIHVzaW5nIGZpbHRlcmVkIGNhcHMgeWV0LiBGaXhlcyAjMzU1MjEwLgorCSAgUmV0dXJuIHRoZSBkb3duc3RyZWFtIEdzdEZsb3dSZXR1cm4gaW5zdGVhZCBvZiBHU1RfRkxPV19PSyBzbyB0aGF0IHdlCisJICBzdG9wIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IuCisKKzIwMDYtMDktMTQgMTE6MDU6MzUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC86IERvbid0IGludGVycHJldCBhIGZpcnN0IGJ1ZmZlciB3aXRoIGFuIG9mZnNldCBvZiBOT05FIGFzICdmcm9tIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmVhbScsIGJ1dCBvbmx5IGEgZmlyc3QgYnVmZi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzogKGdzdF90YWdfZGVtdXhfY2hhaW5fcGFyc2VfdGFnKToKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfY2hhaW4pOgorCSAgRG9uJ3QgaW50ZXJwcmV0IGEgZmlyc3QgYnVmZmVyIHdpdGggYW4gb2Zmc2V0IG9mIE5PTkUgYXMKKwkgICdmcm9tIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmVhbScsIGJ1dCBvbmx5IGEgZmlyc3QgYnVmZmVyCisJICB0aGF0IGhhcyBhIHZhbGlkIGJ1ZmZlciBvZmZzZXQgdGhhdCdzIG5vbi16ZXJvIChzZWUgIzM0NTQ0OSkuCisKKzIwMDYtMDktMTQgMTA6Mzg6NDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC4qOiBXaGVuIHdlIG1lcmdlL2NvbGxlY3QgbXVsdGlwbGUgaW5jb21pbmcgYnVmZmVycyBmb3IgdHlwZWZpbmRpbmcgcHVycG9zZXMsIGtlZXAgYW4gaW5pdGlhbC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOiAoZ3N0X2ljeWRlbXV4X3Jlc2V0KSwKKwkgIChnc3RfaWN5ZGVtdXhfdHlwZWZpbmRfb3JfZm9yd2FyZCk6CisJICAqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5oOgorCSAgV2hlbiB3ZSBtZXJnZS9jb2xsZWN0IG11bHRpcGxlIGluY29taW5nIGJ1ZmZlcnMgZm9yIHR5cGVmaW5kaW5nCisJICBwdXJwb3Nlcywga2VlcCBhbiBpbml0aWFsIDAgb2Zmc2V0IG9uIHRoZSBmaXJzdCBvdXRnb2luZyBidWZmZXIKKwkgIGFzIHdlbGwgKG90aGVyd2lzZSBpZDNkZW11eCB3b24ndCB3b3JrIHJpZ2h0KS4gRml4ZXMgIzM0NTQ0OS4KKwkgIEFsc28gTWFrZSBidWZmZXIgbWV0YWRhdGEgd3JpdGFibGUgYmVmb3JlIHNldHRpbmcgYnVmZmVyIGNhcHMuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2ljeWRlbXV4LmM6ICh0eXBlZmluZF9zdWNjZWVkKSwKKwkgIChjbGVhbnVwX2ljeWRlbXV4KSwgKHB1c2hfZGF0YSksIChHU1RfU1RBUlRfVEVTVCksCisJICAoaWN5ZGVtdXhfc3VpdGUpOgorCSAgU21hbGwgdGVzdCBjYXNlIGZvciB0aGUgYWJvdmUuCisKKzIwMDYtMDktMTMgMTM6MjY6MTUgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBNb3JlIGNvZGUgcmV1c2UgYW5kIGJldHRlciBsb2dnaW5nIGluIF9wZWVrX2NodW5rKCkuIFJlaW50cm9kdWNlIGNoZWNrIGZvciBjaHVuayBzaXplcyBiZWZvcmUgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wZWVrX2NodW5rKSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksIChnc3RfYXZpX2RlbXV4X3N5bmMpLAorCSAgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlcl9wdXNoKSwKKwkgIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKSwKKwkgIChnc3RfYXZpX2RlbXV4X2xvb3ApOgorCSAgTW9yZSBjb2RlIHJldXNlIGFuZCBiZXR0ZXIgbG9nZ2luZyBpbiBfcGVla19jaHVuaygpLiBSZWludHJvZHVjZSBjaGVjaworCSAgZm9yIGNodW5rIHNpemVzIGJlZm9yZSByZWFkaW5nIHRoZW0gKGF2b2lkIG9vbSkuIEJldHRlciBoYW5kbGluZyBmb3IKKwkgIGludmFsaWQgY2h1bmtzaXplcyB3aGVuIHN0cmVhbWluZy4KKworMjAwNi0wOS0xMiAyMDoxODo1NSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogSW1wbGVtZW50cyBzdG9wKCkgdG8gY2xlYXIgdGhlIGFkYXB0ZXIgYW5kIGV2ZW50KCkgdG8gY2xlYXIgdGhlIGFkYXB0ZXIgb24gRkxVU0hfU1RPUCBhbmQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogKGdzdF9zcGVjdHJ1bV9jbGFzc19pbml0KSwKKwkgIChnc3Rfc3BlY3RydW1fc3RhcnQpLCAoZ3N0X3NwZWN0cnVtX3N0b3ApLCAoZ3N0X3NwZWN0cnVtX2V2ZW50KToKKwkgIEltcGxlbWVudHMgc3RvcCgpIHRvIGNsZWFyIHRoZSBhZGFwdGVyIGFuZCBldmVudCgpIHRvIGNsZWFyIHRoZQorCSAgYWRhcHRlciBvbiBGTFVTSF9TVE9QIGFuZCBFT1MuCisKKzIwMDYtMDktMTEgMjA6Mzg6NDEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2xldmVsL2dzdGxldmVsLio6IEZpeCB0eXBlIG1peHVwIGluIGxldmVsLT5pbnRlcnZhbCAoZ2RvdWJsZTwtPmd1aW50NjQpLiBTcG90dGVkIGJ5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfc2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmg6CisJICBGaXggdHlwZSBtaXh1cCBpbiBsZXZlbC0+aW50ZXJ2YWwgKGdkb3VibGU8LT5ndWludDY0KS4gU3BvdHRlZCBieQorCSAgUmVuw6kgU3RhZGxlcgorCisyMDA2LTA5LTExIDE4OjIzOjU5ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS4qOiBGaXggdHlwZSBtaXh1cCBpbiBzcGVjdHJ1bS0+aW50ZXJ2YWwgKGdkb3VibGU8LT5ndWludDY0KS4gU3BvdHRlZCBieQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX2luaXQpLAorCSAgKGdzdF9zcGVjdHJ1bV9zZXRfcHJvcGVydHkpOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uaDoKKwkgIEZpeCB0eXBlIG1peHVwIGluIHNwZWN0cnVtLT5pbnRlcnZhbCAoZ2RvdWJsZTwtPmd1aW50NjQpLiBTcG90dGVkIGJ5CisJICBSZW7DqSBTdGFkbGVyCisKKzIwMDYtMDktMTEgMTg6MDI6MzkgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3NwZWN0cnVtL2RlbW8tb3Nzc3JjLmM6IFVzZSBtb3JlIGRlZmluZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1vc3NzcmMuYzogKGRyYXdfc3BlY3RydW0pLCAobWFpbik6CisJICBVc2UgbW9yZSBkZWZpbmVzCisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX2luaXQpLAorCSAgKGdzdF9zcGVjdHJ1bV9kaXNwb3NlKSwgKGdzdF9zcGVjdHJ1bV9zZXRfY2FwcyksCisJICAoZ3N0X3NwZWN0cnVtX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5oOgorCSAgQXBwbHkgc29tZSBvZiB0aGUgc3BlY3RydW0gY2xlYW51cCBjaGFuZ2VzIHN1Z2dlc3RlZCBpbiAjMzQ4MDg1LgorCisyMDA2LTA5LTA4IDE2OjQ3OjQ2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IEJ1bXAgcmVxdWlyZW1lbnRzIG9mIC1iYXNlICh2aWRlb2Nyb3AgdGVzdCBjYXNlIG5lZWRzIHRoaXMpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEJ1bXAgcmVxdWlyZW1lbnRzIG9mIC1iYXNlICh2aWRlb2Nyb3AgdGVzdCBjYXNlIG5lZWRzIHRoaXMpLgorCSAgKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSAgRG9jdW1lbnQgc2xvcHB5IGhhbmRsaW5nIG9mIHN1YnNhbXBsZWQgY2hyb21hIHBsYW5lcyBpZgorCSAgbGVmdC90b3AgY3JvcHBpbmcgaXMgYW4gb2RkIG51bWJlci4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6IChoYW5kb2ZmX2NiKSwKKwkgICh2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZ19pbml0X2NvbnRleHQpLAorCSAgKHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nX2RlaW5pdF9jb250ZXh0KSwKKwkgICh2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyksIChjaGVja18xeDFfYnVmZmVyKSwgKEdTVF9TVEFSVF9URVNUKSwKKwkgICh2aWRlb2Nyb3Bfc3VpdGUpLCAobWFpbik6CisJICBBZGQgYW5vdGhlciB1bml0IHRlc3QgdGhhdCBjcm9wcyB0aGUgaW5wdXQgdG8gMXgxIChhbmQgY2hlY2tzCisJICB0aGF0IHRoYXQgcGl4ZWwgaGFzIHRoZSBleHBlY3RlZCB2YWx1ZXMgaW4gYSBudW1iZXIgb2YgZm9ybWF0cykuCisKKzIwMDYtMDktMDggMTE6MDQ6MjQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC92aWRlb2Nyb3AvOiBTb21lIHF1aWNrIHRlc3RzIGluZGljYXRlIHRoYXQgaXQgZG9lc24ndCBtYWtlIGEgZ3JlYXQgZGVhbCBvZiBzZW5zZSB0byB1c2UgbGlib2lsIGhlcmUsIGF0IGxlYXN0IG5vdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC92aWRlb2Nyb3AvTWFrZWZpbGUuYW06CisJICAqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6IChnc3RfdmlkZW9fY3JvcF9jbGFzc19pbml0KSwKKwkgIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fcGFja2VkKSwKKwkgIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fcGxhbmFyKToKKwkgIFNvbWUgcXVpY2sgdGVzdHMgaW5kaWNhdGUgdGhhdCBpdCBkb2Vzbid0IG1ha2UgYSBncmVhdCBkZWFsCisJICBvZiBzZW5zZSB0byB1c2UgbGlib2lsIGhlcmUsIGF0IGxlYXN0IG5vdCBmb3IgdGhlIG1lbWNweSgpcworCSAgd2UgZG8sIHNvIHJlbW92ZSBsaWJvaWwgdXNhZ2UgdW50aWwgdGhlcmUgaXMgY2xlYXIgZXZpZGVuY2UKKwkgIGl0IGFjdHVhbGx5IG1ha2VzIGEgcG9zaXRpdmUgZGlmZmVyZW5jZSBzb21ld2hlcmUuCisKKzIwMDYtMDktMDYgMDk6MDU6MzMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBSZXZlcnQgb25lIGNoYW5nZSB0byBmaXggc3RyZWFtaW5nIGF2aSAoYWRhcHRlciBzaXplICE9IGRhdGEgc2l6ZSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9yZWFkX3N1YmluZGV4ZXNfcHVsbCksCisJICAoZ3N0X2F2aV9kZW11eF9zeW5jKSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlcl9wdXNoKSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKToKKwkgIFJldmVydCBvbmUgY2hhbmdlIHRvIGZpeCBzdHJlYW1pbmcgYXZpIChhZGFwdGVyIHNpemUgIT0gZGF0YSBzaXplKS4KKworMjAwNi0wOS0wNCAxNjoyMToxNyArMDAwMCAgRnLDqWTDqXJpYyBSaXNzIDxmcmVkZXJpYy5yaXNzQGdtYWlsLmNvbT4KKworCSAgZ3N0L21hdHJvc2thLzogQWRkIHN1cHBvcnQgZm9yIFZPQlNVQiBzdWJ0aXRsZSB0cmFja3MgYW5kIHpsaWItY29tcHJlc3NlZCB0cmFja3MuIE1ha2Ugc3VyZSB3ZSBzdGFydCBvbiBhIGtleWZyYW1lIGFmLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBGcsOpZMOpcmljIFJpc3MgIDxmcmVkZXJpYy5yaXNzIGF0IGdtYWlsIGRvdCBjb20+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX3RyYWNrX2ZyZWUpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9yZXNldCksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3JlYWRfdHJhY2tfZW5jb2RpbmdzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSksIChnc3RfbWF0cm9za2FfZGVjb2RlX2J1ZmZlciksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2Jsb2NrZ3JvdXBfb3Jfc2ltcGxlYmxvY2spLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9zdWJ0aXRsZV9jYXBzKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIFZPQlNVQiBzdWJ0aXRsZSB0cmFja3MgYW5kIHpsaWItY29tcHJlc3NlZAorCSAgdHJhY2tzLiBNYWtlIHN1cmUgd2Ugc3RhcnQgb24gYSBrZXlmcmFtZSBhZnRlciBhIHNlZWsuICgjMzQzMzQ4KQorCisyMDA2LTA5LTA0IDE1OjA2OjI1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvOiBub3QgcGVyZmVjdCB5ZXQgdGhvdWdoLCBuZWVkcyBzb21lIHR3ZWFraW5nIGluIGZsYWNkZWM7IGFsc28sIHNlZWtpbmcgY291bGQgYmUgYmV0dGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3B1c2hfaGRyX2J1ZiksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3B1c2hfZmxhY19jb2RlY19wcml2X2RhdGEpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wdXNoX3hpcGhfY29kZWNfcHJpdl9kYXRhKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3ZpZGVvX2NhcHMpLCAoZ3N0X21hdHJvc2thX2RlbXV4X2F1ZGlvX2NhcHMpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBBZGQgYmFzaWMgRkxBQyBzdXBwb3J0ICgjMzExNTg2KSwgbm90IHBlcmZlY3QgeWV0IHRob3VnaCwgbmVlZHMgc29tZQorCSAgdHdlYWtpbmcgaW4gZmxhY2RlYzsgYWxzbywgc2Vla2luZyBjb3VsZCBiZSBiZXR0ZXIuCisJICBEbyBiZXR0ZXIgYm91bmRzIGNoZWNraW5nIHdoZW4gZGVzZXJpYWxpc2luZyB2b3JiaXMgc3RyZWFtIGhlYWRlcnMKKwkgIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCByZWFkIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgb24gYmFkIGlucHV0LgorCisyMDA2LTA5LTA0IDA5OjM0OjI1ICswMDAwICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyb0BubnZhLm9yZz4KKworCSAgZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOiBTZWVraW5nIGJhY2sgaW4gYSBmaWxlIGNvbnRhaW5pbmcgYSBDTU1MIHN0cmVhbSBlcnJvcnMgb3V0IGlmIHRoZSBzZWVrIGdvZXMgYmFjayB1cCB0byB0aGUgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRybyBhdCBubnZhIGRvdCBvcmc+CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuYzogKGdzdF9jbW1sX2RlY19jaGFpbik6CisJICBTZWVraW5nIGJhY2sgaW4gYSBmaWxlIGNvbnRhaW5pbmcgYSBDTU1MIHN0cmVhbSBlcnJvcnMgb3V0IGlmIHRoZSBzZWVrCisJICBnb2VzIGJhY2sgdXAgdG8gdGhlIENNTUwgaGVhZGVycy4gVGhpcyBpcyBiZWNhdXNlIGFmdGVyIHRoZSBzZWVrIHRoZSB4bWwKKwkgIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gPD94bWwgLi4uPz4gaXMgc3VibWl0dGVkIHRvIHRoZSB4bWwgcGFyc2VyIGFnYWluLAorCSAgd2hpY2ggcmVzdWx0cyBpbiBhbiBlcnJvci4gVGhlIGF0dGFjaGVkIHBhdGNoIGZpeGVzIHRoZSBwcm9ibGVtLgorCSAgRml4ZXMgIzM1MzkwOC4KKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5oOgorCSAgRml4IGF1dGhvcnMgbmFtZS4KKworMjAwNi0wOS0wMyAxMDo0NjoxNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6IE1vcmUgdGVzdHM6IGNoZWNrIHBhc3N0aHJvdWdoIG1vZGUgYW5kIGNhcHMgdHJhbnNmb3JtIGluIGJvdGggZGlyZWN0aW9ucyB3aXRoIGZpeGVkLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6IChoYW5kb2ZmX2NiKSwKKwkgIChidWZmZXJfcHJvYmVfY2IpLCAodGVzdF9jYXBzX3RyYW5zZm9ybSksICh0ZXN0X3Bhc3N0aHJvdWdoKSwKKwkgIChub3Rnc3RfdmFsdWVfbGlzdF9nZXRfbnRoX2ludCksICh2aWRlb2Nyb3Bfc3VpdGUpOgorCSAgTW9yZSB0ZXN0czogY2hlY2sgcGFzc3Rocm91Z2ggbW9kZSBhbmQgY2FwcyB0cmFuc2Zvcm0gaW4KKwkgIGJvdGggZGlyZWN0aW9ucyB3aXRoIGZpeGVkIHZhbHVlcywgcmFuZ2VzIGFuZCBsaXN0cy4KKworMjAwNi0wOS0wMiAxODo0OTowMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogQWRkIHZpZGVvY3JvcCB0byBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgIEFkZCB2aWRlb2Nyb3AgdG8gZG9jcy4KKwkgICogZ3N0L3ZpZGVvY3JvcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkgICogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuaDoKKwkgIE1vdmUgYm9pbGVycGxhdGUgc3R1ZmYgYW5kIHN0cnVjdHVyZXMgaW50byBhIGhlYWRlciBmaWxlLgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmM6ICh2aWRlb19jcm9wX2dldF90ZXN0X2NhcHMpLAorCSAgKHRlc3RfdW5pdF9zaXplcyksICh2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZ19pbml0X2NvbnRleHQpLAorCSAgKHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nX2RlaW5pdF9jb250ZXh0KSwKKwkgICh2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyksICh0ZXN0X2Nyb3BwaW5nKSwgKHZpZGVvY3JvcF9zdWl0ZSk6CisJICBBZGQgdW5pdCB0ZXN0cyBmb3IgdmlkZW9jcm9wLgorCisyMDA2LTA5LTAyIDE1OjMwOjQ1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBQb3J0L3Jld3JpdGUgdmlkZW9jcm9wIGZyb20gc2NyYXRjaCBmb3IgR1N0cmVhbWVyLTAuMTAsIGFuZCBtYWtlIGl0IHN1cHBvcnQgYWxsIGZvcm1hdHMgdmlkZW9zY2FsZSBzdXBwb3J0cyAoIzM0NTY1MykuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvdmlkZW9jcm9wL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOiAoZ3N0X3ZpZGVvX2Nyb3BfYmFzZV9pbml0KSwKKwkgIChnc3RfdmlkZW9fY3JvcF9jbGFzc19pbml0KSwgKGdzdF92aWRlb19jcm9wX2luaXQpLAorCSAgKGdzdF92aWRlb19jcm9wX2dldF9pbWFnZV9kZXRhaWxzX2Zyb21fY2FwcyksCisJICAoZ3N0X3ZpZGVvX2Nyb3BfZ2V0X3VuaXRfc2l6ZSksIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fcGFja2VkKSwKKwkgIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fcGxhbmFyKSwgKGdzdF92aWRlb19jcm9wX3RyYW5zZm9ybSksCisJICAoZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX2RpbWVuc2lvbiksCisJICAoZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX2RpbWVuc2lvbl92YWx1ZSksCisJICAoZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX2NhcHMpLCAoZ3N0X3ZpZGVvX2Nyb3Bfc2V0X2NhcHMpLAorCSAgKGdzdF92aWRlb19jcm9wX3NldF9wcm9wZXJ0eSksIChnc3RfdmlkZW9fY3JvcF9nZXRfcHJvcGVydHkpLAorCSAgKHBsdWdpbl9pbml0KToKKwkgIFBvcnQvcmV3cml0ZSB2aWRlb2Nyb3AgZnJvbSBzY3JhdGNoIGZvciBHU3RyZWFtZXItMC4xMCwgYW5kIG1ha2UKKwkgIGl0IHN1cHBvcnQgYWxsIGZvcm1hdHMgdmlkZW9zY2FsZSBzdXBwb3J0cyAoIzM0NTY1MykuCisKKzIwMDYtMDktMDIgMTQ6NDU6MDQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgc3lzL3Y0bDIvOiBXaGl0ZXNwYWNlIGNsZWFudXBzLCBkYXNoaWZ5IHByb3BlcnR5LW5hbWVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMmNvbG9yYmFsYW5jZS5jOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6CisJICAoZ3N0X3Y0bDJfb2JqZWN0X2luc3RhbGxfcHJvcGVydGllc19oZWxwZXIpOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19jbGFzc19pbml0KToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSAgV2hpdGVzcGFjZSBjbGVhbnVwcywgZGFzaGlmeSBwcm9wZXJ0eS1uYW1lcy4KKworMjAwNi0wOS0wMiAxNDoyODo1NSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBzeXMvdjRsMi86IENsZWFudXAgZXJyb3IgbWVzc2FnZXMgYW5kIHVuaWZ5IGhlYWRlciBjb21tZW50cworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMmNvbG9yYmFsYW5jZS5jOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmg6CisJICAqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuYzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5oOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYzogKGdzdF92NGwyX3hvdmVybGF5X29wZW4pOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuaDoKKwkgICogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOiAoZ3N0X3Y0bDJfZ2V0X2NhcGFiaWxpdGllcyksCisJICAoZ3N0X3Y0bDJfb3Blbik6CisJICAqIHN5cy92NGwyL3Y0bDJfY2FsbHMuaDoKKwkgICogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfcXVldWVfZnJhbWUpLAorCSAgKGdzdF92NGwyc3JjX2NhcHR1cmVfaW5pdCk6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuaDoKKwkgIENsZWFudXAgZXJyb3IgbWVzc2FnZXMgYW5kIHVuaWZ5IGhlYWRlciBjb21tZW50cworCisyMDA2LTA4LTMwIDE4OjAxOjUyICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIEFub3RoZXIgc21hbGwgZml4IHRvIHNldF9jYXBzIGZ1bmN0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBBbm90aGVyIHNtYWxsIGZpeCB0byBzZXRfY2FwcyBmdW5jdGlvbi4KKworMjAwNi0wOC0zMCAxMzozMDoxMyArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBTZW5kIG5ld19zZWdtZW50IGluIEdTVF9GT1JNQVRfVElNRSBpbnN0ZWFkIG9mIGluIEdTVF9GT1JNQVRfQllURVMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFNlbmQgbmV3X3NlZ21lbnQgaW4gR1NUX0ZPUk1BVF9USU1FIGluc3RlYWQgb2YgaW4gR1NUX0ZPUk1BVF9CWVRFUy4KKworMjAwNi0wOC0zMCAxMTozNjowNiArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBBIHNtYWxsIGZpeCB0byBzZXRfY2FwcyBmdW5jdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQSBzbWFsbCBmaXggdG8gc2V0X2NhcHMgZnVuY3Rpb24uCisKKzIwMDYtMDgtMzAgMTE6Mjc6NDAgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogUmVzZXQgZWFjaCBzdHJlYW1zIGxhc3RfZmxvdyB0byBHU1RfRkxPV19PSy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICAoZ3N0X3F0ZGVtdXhfZG9fc2Vlayk6CisJICBSZXNldCBlYWNoIHN0cmVhbXMgbGFzdF9mbG93IHRvIEdTVF9GTE9XX09LLgorCSAgKGdzdF9xdGRlbXV4X2FjdGl2YXRlX3NlZ21lbnQpOgorCSAgUmVtb3ZpbmcgbXlzdGljIG1vZGlmaWNhdGlvbnMgZm9yIGdvb2QuCisKKzIwMDYtMDgtMzAgMTE6MDc6MzcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBwdXQgYmFjayAnc2VnbWVudCBzdGFydDw9c3RvcCcgY2hhbmdlIHRoYXQgd2FzIG15c3RpY2FsbHkgcmV2ZXJ0ZWQgYnkgdGhlIGxhc3QgY29tbWl0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfYWN0aXZhdGVfc2VnbWVudCksCisJICAocXRkZW11eF9wYXJzZV90cmVlKToKKwkgIHB1dCBiYWNrICdzZWdtZW50IHN0YXJ0PD1zdG9wJyBjaGFuZ2UgdGhhdCB3YXMgbXlzdGljYWxseSByZXZlcnRlZCBieQorCSAgdGhlIGxhc3QgY29tbWl0CisKKzIwMDYtMDgtMzAgMTA6NDM6NTMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBGaXggdGhlIGJ1aWxkIGZvciBkaXNhYmxlZCBkZWJ1ZworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2FjdGl2YXRlX3NlZ21lbnQpLAorCSAgKHF0ZGVtdXhfcGFyc2VfdHJlZSk6CisJICBGaXggdGhlIGJ1aWxkIGZvciBkaXNhYmxlZCBkZWJ1ZworCisyMDA2LTA4LTI5IDIwOjU5OjQ3ICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuaDoKKwkgIEZpeGVkIGZyYW1lcmF0ZSBuZWdvdGlhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4ZWQgZnJhbWVyYXRlIG5lZ290aWF0aW9uLgorCisyMDA2LTA4LTI4IDE3OjQ3OjI5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IE1ha2Ugc3VyZSBzZWdtZW50IHN0YXJ0PD1zdG9wIGluIHdlaXJkIHF1aWNrdGltZSBmaWxlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9hY3RpdmF0ZV9zZWdtZW50KSwKKwkgIChnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayksCisJICAocXRkZW11eF92aWRlb19jYXBzKToKKwkgIE1ha2Ugc3VyZSBzZWdtZW50IHN0YXJ0PD1zdG9wIGluIHdlaXJkIHF1aWNrdGltZSBmaWxlcy4KKworMjAwNi0wOC0yOCAxNjo1OToxMyArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYyAoZ3N0X2R2MTM5NHNyY19mcm9tX3JhdzEzOTRoYW5kbGUpOiBOZXcgaGVscGVyIGZ1bmN0aW9uIHRvIGxlc3NlbiB0aGUgaWZkZWZzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA4LTI4ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYyAoZ3N0X2R2MTM5NHNyY19mcm9tX3JhdzEzOTRoYW5kbGUpOgorCSAgTmV3IGhlbHBlciBmdW5jdGlvbiB0byBsZXNzZW4gdGhlIGlmZGVmcy4KKwkgIChHU1RfSU5GT19PQkpFQ1QpOgorCSAgKGdzdF9kdjEzOTRzcmNfaXNvX3JlY2VpdmUpOiBVc2UgaXQuCisJICAoZ3N0X2R2MTM5NHNyY19jcmVhdGUpOiBBbHNvIHVzZSB0aGUgY29udHJvbCBzb2NrZXRzIGluIGllYzYxODgzCisJICBtb2RlLgorCSAgKGdzdF9kdjEzOTRzcmNfc3RhcnQsIGdzdF9kdjEzOTRzcmNfc3RvcCk6IEFsd2F5cyB1c2UgYSBzZXBhcmF0ZQorCSAgaGFuZGxlIGZvciBBVkMgb3BlcmF0aW9uczsgZml4ZXMgIzM0ODIzMy4KKworMjAwNi0wOC0yOCAxNDo1OTowNSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBzeXMvdjRsMi92NGwyX2NhbGxzLmM6IGFkZCBjb21tZW50cyBhbmQgbW9yZSBkZWJ1ZyBsb2dnaW5nCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOiAoZ3N0X3Y0bDJfZmlsbF9saXN0cyk6CisJICBhZGQgY29tbWVudHMgYW5kIG1vcmUgZGVidWcgbG9nZ2luZworCisyMDA2LTA4LTI3IDE3OjE0OjA2ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIFJlbmFtZSBhZ2FpbiAoYXVkaW9meGdvb2QgLT4gYXVkaW9meCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvZngueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meGdvb2QueG1sOgorCSAgKiBnc3QvYXVkaW9meC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvZngvYXVkaW9meC5jOgorCSAgKiBnc3QvYXVkaW9meGdvb2QvLmN2c2lnbm9yZToKKwkgICogZ3N0L2F1ZGlvZnhnb29kL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXVkaW9meGdvb2QvYXVkaW9meC5jOgorCSAgKiBnc3QvYXVkaW9meGdvb2QvYXVkaW9wYW5vcmFtYS5jOgorCSAgKiBnc3QvYXVkaW9meGdvb2QvYXVkaW9wYW5vcmFtYS5oOgorCSAgUmVuYW1lIGFnYWluIChhdWRpb2Z4Z29vZCAtPiBhdWRpb2Z4KS4KKworMjAwNi0wOC0yNyAxMzoxMjo1MiArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IEluaXRpYWx6ZSB2YXJpYWJsZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9uZXh0X2RhdGFfYnVmZmVyKSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9zY2FuKToKKwkgIEluaXRpYWx6ZSB2YXJpYWJsZXMuCisKKzIwMDYtMDgtMjUgMTY6MjE6MzcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguKjogTW9yZSBhdHRlbXB0cyB0byB0dXJuIHRoaXMgaW50byByZWFkYWJsZSBjb2RlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfY2xhc3NfaW5pdCksCisJICAoZ3N0X2F2aV9kZW11eF9pbml0KSwgKGdzdF9hdmlfZGVtdXhfZmluYWxpemUpLAorCSAgKGdzdF9hdmlfZGVtdXhfcmVzZXQpLCAoZ3N0X2F2aV9kZW11eF9pbmRleF9sYXN0KSwKKwkgIChnc3RfYXZpX2RlbXV4X2luZGV4X25leHQpLCAoZ3N0X2F2aV9kZW11eF9pbmRleF9lbnRyeV9mb3JfdGltZSksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdWJpbmRleCksIChnc3RfYXZpX2RlbXV4X3BhcnNlX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksIChnc3RfYXZpX2RlbXV4X3BlZWtfdGFnKSwKKwkgIChnc3RfYXZpX2RlbXV4X25leHRfZGF0YV9idWZmZXIpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fc2NhbiksCisJICAoZ3N0X2F2aV9kZW11eF9tYXNzYWdlX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X2NhbGN1bGF0ZV9kdXJhdGlvbnNfZnJvbV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyX3B1bGwpLCAoZ3N0X2F2aV9kZW11eF9kb19zZWVrKSwKKwkgIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksIChnc3RfYXZpX2RlbXV4X2xvb3ApLAorCSAgKGdzdF9hdmlfZGVtdXhfY2hhaW4pLCAoZ3N0X2F2aV9kZW11eF9zaW5rX2FjdGl2YXRlKSwKKwkgIChnc3RfYXZpX2RlbXV4X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIE1vcmUgYXR0ZW1wdHMgdG8gdHVybiB0aGlzIGludG8gcmVhZGFibGUgY29kZS4KKwkgIERvbid0IGxlYWsgYWRhcHRlcnMuCisJICBDYWxjdWxhdGUgZHVyYXRpb24gYWNjb3JkaW5nIHRvIGluZGV4IG1vcmUgZWZmaWNpZW50bHkuCisJICBEb24ndCB0cnkgdG8gYWN0IGxpa2Ugd2UgZHJpdmUgdGhlIHBpcGVsaW5lIGluIGNoYWluIG1vZGUuCisKKzIwMDYtMDgtMjUgMDk6NTM6MTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9hbm5vZGV4L2dzdGNtbWx1dGlscy5jOiBGaXggYnVpbGQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbHV0aWxzLmM6IChnc3RfY21tbF9jbG9ja190aW1lX2Zyb21fbnB0KToKKwkgIEZpeCBidWlsZC4KKworMjAwNi0wOC0yNSAwOTo0Mjo0MyArMDAwMCAgQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm9Abm52YS5vcmc+CisKKwkgIGV4dC9hbm5vZGV4L2dzdGFubm9kZXguYzogRG8gc29tZSBleHRyYSBzYW5pdHkgY2hlY2tzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQWxlc3NhbmRybyBEZWNpbmEgPGFsZXNzYW5kcm8gYXQgbm52YSBkb3Qgb3JnPgorCSAgKiBleHQvYW5ub2RleC9nc3Rhbm5vZGV4LmM6IChnc3RfYW5ub2RleF9ncmFudWxlX3RvX3RpbWUpOgorCSAgRG8gc29tZSBleHRyYSBzYW5pdHkgY2hlY2tzLgorCSAgRml4ZXMgIzM1MDM0MC4KKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOiAoZ3N0X2NtbWxfZW5jX2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X2NtbWxfZW5jX3BhcnNlX3RhZ19oZWFkKSwgKGdzdF9jbW1sX2VuY19wYXJzZV90YWdfY2xpcCksCisJICAoZ3N0X2NtbWxfZW5jX3B1c2hfY2xpcCksIChnc3RfY21tbF9lbmNfcHVzaCk6CisJICBDaGVjayBpZiBjbGlwLT5zdGFydF90aW1lIGlzIHZhbGlkIGJlZm9yZSBhZGRpbmcgdGhlIGNsaXAgdG8gdGhlCisJICB0cmFjayBsaXN0LgorCSAgUmVzZXQgZW5jLT5wcmVhbWJsZSBnb2luZyBmcm9tIFBBVVNFRCB0byBSRUFEWS4KKwkgIERvbid0IHVzZSBHU1RfRkxPV19VTkVYUEVDVEVEIGZvciB3cm9uZyB1c2FnZSBvZiB0aGUgZWxlbWVudCwgaXQgaXMKKwkgIG9ubHkgdXNlZCBmb3IgRU9TLgorCSAgT25seSBwb3N0IGFuIGVycm9yIG1lc3NhZ2UgaWYgd2Ugd2VyZSB0aGUgb25lIHRoYXQgY3JlYXRlZCB0aGUgZmF0YWwKKwkgIEdzdEZsb3dSZXR1cm4gdmFsdWUuCisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWx1dGlscy5jOiAoZ3N0X2NtbWxfY2xvY2tfdGltZV9mcm9tX25wdCksCisJICAoZ3N0X2NtbWxfY2xvY2tfdGltZV90b19ncmFudWxlKSwgKGdzdF9jbW1sX3RyYWNrX2xpc3RfaGFzX2NsaXApOgorCSAgUGFyc2UgdGhlIHNlY29uZHMgZmllbGQgb2YgdGhlIG5wdC1zZWMgdGltZSBmb3JtYXQgdXNpbmcgJWxsdSByYXRoZXIgdGhhbgorCSAgJWQgYW5kIGNoZWNrIHRoYXQgdGhlIHZhbHVlIHNjYWxlZCBieSBHU1RfU0VDT05EIGRvZXNuJ3Qgb3ZlcmZsb3cuCisJICBVc2UgZ3VpbnQ2NChzKSB0byByZXByZXNlbnQgdGhlIGtleWluZGV4IGFuZCBrZXlvZmZzZXQgZmllbGRzIG9mIGEgZ3JhbnVsZXBvcy4KKwkgIExvb2t1cCBhIGNsaXAncyB0cmFjayB3aXRoIGNsaXAtPnRyYWNrIHJhdGhlciB0aGFuIGNsaXAtPmlkIHdoaWNoCisJICBtYWtlcyBubyBzZW5zZS4KKwkgIElkZW50aWZ5IGEgY2xpcCBieSBpdHMgdHJhY2sgYW5kIHN0YXJ0IHRpbWUgYW5kIG5vdCBpdHMgeG1sIGlkLgorCSAgZG8gc29tZSBtb3JlIGlucHV0IGNoZWNraW5nIGFuZCBtYWtlIHN1cmUgd2UgZG9uJ3QgZG8gdW5kZWZpbmVkIHNoaWZ0cy4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGRlYy5jOiAoc2V0dXBfY21tbGRlYyksCisJICAodGVhcmRvd25fY21tbGRlYyksIChjaGVja19vdXRwdXRfYnVmZmVyX2lzX2VxdWFsKSwgKHB1c2hfZGF0YSksCisJICAoY21tbF90YWdfbWVzc2FnZV9wb3ApLCAoY2hlY2tfaGVhZGVycyksIChwdXNoX2NsaXBfZnVsbCksCisJICAocHVzaF9jbGlwKSwgKHB1c2hfZW1wdHlfY2xpcCksIChjaGVja19vdXRwdXRfY2xpcCksCisJICAoR1NUX1NUQVJUX1RFU1QpLCAoY21tbGRlY19zdWl0ZSk6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxlbmMuYzogKHNldHVwX2NtbWxlbmMpLAorCSAgKHRlYXJkb3duX2NtbWxlbmMpLCAoY2hlY2tfb3V0cHV0X2J1ZmZlcl9pc19lcXVhbCksIChwdXNoX2RhdGEpLAorCSAgKGNoZWNrX2hlYWRlcnMpLCAocHVzaF9jbGlwKSwgKGNoZWNrX2NsaXBfdGltZXMpLCAoY2hlY2tfY2xpcCksCisJICAoY2hlY2tfZW1wdHlfY2xpcCksIChHU1RfU1RBUlRfVEVTVCksIChjbW1sZW5jX3N1aXRlKToKKwkgIEFkZGVkIHNvbWUgbW9yZSBjaGVja3MuCisKKzIwMDYtMDgtMjQgMTk6MDA6MjIgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgTWFrZSBhbHNvIHRoZSBwYW4tcHJvcGVydHkgZmxvYXQgKHNhdmVzIHNjYWxpbmcgYW5kIHlpZWxkcyBiZXR0ZXIgcmVzb2x1dGlvbikKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meGdvb2QvYXVkaW9wYW5vcmFtYS5jOiAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX2NsYXNzX2luaXQpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV90cmFuc2Zvcm1fbTJzX2ludCksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9zMnNfaW50KSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX20yc19mbG9hdCksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9zMnNfZmxvYXQpOgorCSAgKiBnc3QvYXVkaW9meGdvb2QvYXVkaW9wYW5vcmFtYS5oOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3Bhbm9yYW1hLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBNYWtlIGFsc28gdGhlIHBhbi1wcm9wZXJ0eSBmbG9hdCAoc2F2ZXMgc2NhbGluZyBhbmQgeWllbGRzIGJldHRlcgorCSAgcmVzb2x1dGlvbikKKworMjAwNi0wOC0yNCAxODoyMzoxNCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXVkaW9meGdvb2QvYXVkaW9wYW5vcmFtYS5jOiBDaGFuZ2VMb2cgc3VyZ2VyeSB0byBhZGQgY3ltYXgncyByZWFsIG5hbWUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVkaW9meGdvb2QvYXVkaW9wYW5vcmFtYS5jOiAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3NldF9jYXBzKSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX20yc19mbG9hdCksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9zMnNfZmxvYXQpOgorCSAgQ2hhbmdlTG9nIHN1cmdlcnkgdG8gYWRkIGN5bWF4J3MgcmVhbCBuYW1lCisKKzIwMDYtMDgtMjQgMTg6MTc6MjAgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F1ZGlvZnhnb29kL2F1ZGlvcGFub3JhbWEuKjogQWRkZWQgZmxvYXQgc3VwcG9ydCAodGhhbmtzIGN5bWF4KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdWRpb2Z4Z29vZC9hdWRpb3Bhbm9yYW1hLmM6IChnc3RfYXVkaW9fcGFub3JhbWFfc2V0X2NhcHMpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV90cmFuc2Zvcm1fbTJzX2ludCksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9zMnNfaW50KSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX20yc19mbG9hdCksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9zMnNfZmxvYXQpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV90cmFuc2Zvcm0pOgorCSAgKiBnc3QvYXVkaW9meGdvb2QvYXVkaW9wYW5vcmFtYS5oOgorCSAgQWRkZWQgZmxvYXQgc3VwcG9ydCAodGhhbmtzIGN5bWF4KQorCisyMDA2LTA4LTI0IDE0OjE2OjU1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9hdWRpb2Z4Z29vZC9hdWRpb3Bhbm9yYW1hLmM6IEZpeCBkb2NzICYgZGVidWcgY2F0ZWdvcnkuIEFkZCBGaXhtZSBmb3Igdm9sdW1lIHBhbiBsZXZlbHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1ZGlvZnhnb29kL2F1ZGlvcGFub3JhbWEuYzoKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX20ycyk6CisJICBGaXggZG9jcyAmIGRlYnVnIGNhdGVnb3J5LiBBZGQgRml4bWUgZm9yIHZvbHVtZSBwYW4gbGV2ZWxzLgorCisyMDA2LTA4LTI0IDEzOjUxOjE1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogdW5icmVhayBBVkkgaW5kZXggaGFuZGxpbmcsIHNvbWUgbW9yZSBkZWJ1ZywgcmVtb3ZlIGFuIG9ic29sZXRlIGFkYXB0ZXJfZmx1c2ggdGhhdCBjYXVzZWQgc3RyZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcmVhZF9zdWJpbmRleGVzX3B1bGwpLAorCSAgKGdzdF9hdmlfZGVtdXhfc3luYyksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVzaCksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyX3B1bGwpLAorCSAgKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2RhdGEpLAorCSAgKGdzdF9hdmlfZGVtdXhfY2hhaW4pOgorCSAgdW5icmVhayBBVkkgaW5kZXggaGFuZGxpbmcsIHNvbWUgbW9yZSBkZWJ1ZywgcmVtb3ZlIGFuIG9ic29sZXRlCisJICBhZGFwdGVyX2ZsdXNoIHRoYXQgY2F1c2VkIHN0cmVhbWluZyB0byB3YW5kZXIgb2ZmIGluIHRoZSB3aWxkCisKKzIwMDYtMDgtMjQgMTE6MjE6MDYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguKjogU29tZSBtb3JlIGNsZWFudXBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdXBlcmluZGV4KSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3ViaW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfb2RtbCksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9pbmRleCksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9jYWxjdWxhdGVfZHVyYXRpb25zX2Zyb21faW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlcl9wdXNoKSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVsbCk6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIFNvbWUgbW9yZSBjbGVhbnVwcy4KKwkgIEZpeCB0b3RhbEZyYW1lcyBwYXJzaW5nIGluIE9ETUwuCisJICBEaXNhYmxlIHVzZSBvZiBpbmRleCBmb3IgbGVuZ3RoIGNhbGN1bGF0aW9uIGluIGNhc2Ugb2YgT0RNTCBhcyB0aGlzIGlzCisJICBicm9rZW4gbm93LgorCisyMDA2LTA4LTI0IDEwOjAzOjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IFVzZSBsaWJnc3R0YWcgaGVscGVyIGZ1bmN0aW9uIGhlcmUgdG9vLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjX2RlY191cGRhdGVfbWV0YWRhdGEpOgorCSAgVXNlIGxpYmdzdHRhZyBoZWxwZXIgZnVuY3Rpb24gaGVyZSB0b28uCisKKzIwMDYtMDgtMjQgMDk6MjQ6MTEgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiBQb3N0IGF1ZGlvIGNvZGVjIGFuZCBhdmVyYWdlIGJpdHJhdGUgdGFncyBvbiBidXMgKCMzNDQ0NzIpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW8gYXQgY2lyY3VsYXItY2hhb3Mub3JnPgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfcG9zdF90YWdzKSwKKwkgIChnc3Rfd2F2cGFja19kZWNfY2hhaW4pOgorCSAgUG9zdCBhdWRpbyBjb2RlYyBhbmQgYXZlcmFnZSBiaXRyYXRlIHRhZ3Mgb24gYnVzICgjMzQ0NDcyKS4KKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9iYXNlX2luaXQpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX3NyY19xdWVyeSk6CisJICBGb3J3YXJkIHF1ZXJpZXMgaW4gb3RoZXIgZm9ybWF0cyAoQllURSBmb3JtYXQgaW4gcGFydGljdWxhcikKKwkgIHVwc3RyZWFtOyBhZGQgU2ViYXN0aWFuIHRvIGF1dGhvcnMuCisKKzIwMDYtMDgtMjQgMDA6NDA6MDcgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5oOgorCSAgRml4IHNldF9jYXBzIHRvIHNldCB3aWR0aCBhbmQgaGVpZ2h0IHRvIHRoZSB2YWx1ZXMgdGhlIGRyaXZlciBpcyByZWFsbHkgd29ya2luZyB3aXRoLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGaXggc2V0X2NhcHMgdG8gc2V0IHdpZHRoIGFuZCBoZWlnaHQgdG8gdGhlIHZhbHVlcyB0aGUgZHJpdmVyIGlzIHJlYWxseSB3b3JraW5nIHdpdGguCisKKzIwMDYtMDgtMjMgMTU6MzM6NDcgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC4qOiBJbml0aWFsIHN0cmVhbWluZyBzdXBwb3J0IGZvciBhdmlkZW11eCAoZml4ZXMgIzMzNjQ2NSkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2NsYXNzX2luaXQpLAorCSAgKGdzdF9hdmlfZGVtdXhfaW5pdCksIChnc3RfYXZpX2RlbXV4X2Rpc3Bvc2UpLAorCSAgKGdzdF9hdmlfZGVtdXhfcmVzZXQpLCAoZ3N0X2F2aV9kZW11eF9pbmRleF9uZXh0KSwKKwkgIChnc3RfYXZpX2RlbXV4X2luZGV4X2VudHJ5X2Zvcl90aW1lKSwgKGdzdF9hdmlfZGVtdXhfc3JjX2NvbnZlcnQpLAorCSAgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLAorCSAgKGdzdF9hdmlfZGVtdXhfcGVla19jaHVua19pbmZvKSwgKGdzdF9hdmlfZGVtdXhfcGVla19jaHVuayksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5pdF9wdXNoKSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luaXRfcHVsbCksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdWJpbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9yZWFkX3N1YmluZGV4ZXNfcHVzaCksCisJICAoZ3N0X2F2aV9kZW11eF9yZWFkX3N1YmluZGV4ZXNfcHVsbCksIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksCisJICAoc29ydCksIChnc3RfYXZpX2RlbXV4X3BhcnNlX2luZGV4KSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N5bmMpLCAoZ3N0X2F2aV9kZW11eF9wZWVrX3RhZyksCisJICAoZ3N0X2F2aV9kZW11eF9tYXNzYWdlX2luZGV4KSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlcl9wdXNoKSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVsbCksCisJICAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSksCisJICAocHVzaF90YWdfbGlzdHMpLCAoZ3N0X2F2aV9kZW11eF9sb29wKSwgKGdzdF9hdmlfZGVtdXhfY2hhaW4pLAorCSAgKGdzdF9hdmlfZGVtdXhfc2lua19hY3RpdmF0ZSksIChnc3RfYXZpX2RlbXV4X2FjdGl2YXRlX3B1c2gpLAorCSAgKGdzdF9hdmlfZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgSW5pdGlhbCBzdHJlYW1pbmcgc3VwcG9ydCBmb3IgYXZpZGVtdXggKGZpeGVzICMzMzY0NjUpCisKKzIwMDYtMDgtMjMgMTA6MzA6MzEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogRml4IG1lbSBsZWFrLCBzZW5kIG5ld3NlZ21lbnQgZXZlbnQgb24gY29ycmVjdGlvbiBwYWQgYXMgd2VsbCAoIzM1MjQ3NikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jOiAoZ3N0X3dhdnBhY2tfZW5jX3B1c2hfYmxvY2spOgorCSAgRml4IG1lbSBsZWFrLCBzZW5kIG5ld3NlZ21lbnQgZXZlbnQgb24gY29ycmVjdGlvbiBwYWQKKwkgIGFzIHdlbGwgKCMzNTI0NzYpLgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogKGdzdF93YXZwYWNrX3BhcnNlX2Jhc2VfaW5pdCk6CisJICBSZXN0b3JlIG9yaWdpbmFsIGF1dGhvciAob24gU2ViYXN0aWFuJ3MgcmVxdWVzdCkuCisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9nc3QtcGx1Z2lucy1iYWQuc3VwcDoKKwkgIEFkZCAoc28gZmFyIGVtcHR5KSBzdXBwcmVzc2lvbiBmaWxlIGZvciAtYmFkLiBSZW1vdmUKKwkgIHdhdnBhY2tlbmMgdGVzdCBmcm9tIFZBTEdSSU5EX1RPX0ZJWCBub3cgdGhhdCB0aGUgbGVhaworCSAgaXMgZml4ZWQuCisKKzIwMDYtMDgtMjMgMDk6MjI6MDcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgdGVzdHMvY2hlY2svOiBBZGQgdW5pdCB0ZXN0cyBmb3Igd2F2cGFjayBlbGVtZW50cyAoIzM1MjQ3NikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tbyBhdCBjaXJjdWxhci1jaGFvcy5vcmc+CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZGVjLmM6IChzZXR1cF93YXZwYWNrZGVjKSwKKwkgIChjbGVhbnVwX3dhdnBhY2tkZWMpLCAoR1NUX1NUQVJUX1RFU1QpLCAod2F2cGFja2RlY19zdWl0ZSksIChtYWluKToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja2VuYy5jOiAoc2V0dXBfd2F2cGFja2VuYyksCisJICAoY2xlYW51cF93YXZwYWNrZW5jKSwgKEdTVF9TVEFSVF9URVNUKSwgKHdhdnBhY2tlbmNfc3VpdGUpLCAobWFpbik6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2twYXJzZS5jOiAod2F2cGFja3BhcnNlX2ZvdW5kX3BhZCksCisJICAoc2V0dXBfd2F2cGFja3BhcnNlKSwgKGNsZWFudXBfd2F2cGFja3BhcnNlKSwgKEdTVF9TVEFSVF9URVNUKSwKKwkgICh3YXZwYWNrcGFyc2Vfc3VpdGUpLCAobWFpbik6CisJICBBZGQgdW5pdCB0ZXN0cyBmb3Igd2F2cGFjayBlbGVtZW50cyAoIzM1MjQ3NikuCisKKzIwMDYtMDgtMjMgMDg6NTI6NTAgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgQWRkIGRvY3MgZm9yIHdhdnBhY2sgZWxlbWVudHMgKCMzNTI0NzYpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW8gYXQgY2lyY3VsYXItY2hhb3Mub3JnPgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYWNrLnhtbDoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmg6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5oOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmg6CisJICBBZGQgZG9jcyBmb3Igd2F2cGFjayBlbGVtZW50cyAoIzM1MjQ3NikuCisKKzIwMDYtMDgtMjIgMjA6Mzk6MjYgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSAgRml4ZWQgcXVlcnkgc2l6ZSB0byB3b3JrIHdpdGggZHJpdmVycyB0aGF0IHVzZXMgaW50ZXJtZWRpYXRlIHN0ZXAgbGlrZSAid2lkdGggKiBoZWlnaHQiIHRvIGZpbmQgY2xvc2VzdCBzaXplLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGaXhlZCBxdWVyeSBzaXplIHRvIHdvcmsgd2l0aCBkcml2ZXJzIHRoYXQgdXNlcyBpbnRlcm1lZGlhdGUgc3RlcCBsaWtlICJ3aWR0aCAqIGhlaWdodCIgdG8gZmluZCBjbG9zZXN0IHNpemUuCisKKzIwMDYtMDgtMjIgMTc6MjA6NDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOiBUaGVyZSBpcyBubyB0YWdsaWJtdXggZWxlbWVudCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgIFRoZXJlIGlzIG5vIHRhZ2xpYm11eCBlbGVtZW50IC4uLgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6CisJICBVc2UgJyUnIHJhdGhlciB0aGFuICcmcGVyYzsnIGluIGd0ay1kb2MgYmx1cmIsIGRvY3MgYnVpbGQKKwkgIHdhcyBjb21wbGFpbmluZyBhYm91dCB1bmtub3duIGVudGl0eSBoZXJlLgorCisyMDA2LTA4LTIyIDE3OjAyOjM5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4Lio6IE1hcmsgRElTQ09OVC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksCisJICAoZ3N0X2F2aV9kZW11eF9kb19zZWVrKSwgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspLAorCSAgKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgTWFyayBESVNDT05ULgorCSAgUmVtb3ZlIG9sZCB1bnVzZWQgZmllbGRzIGFuZCByZW9yZGVyIHRoZSBzdHJ1Y3QgYSBiaXQuCisKKzIwMDYtMDgtMjIgMTY6NDU6MzcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIFNtYWxsIGRvY3VtZW50YXRpb24gdXBkYXRlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19tZWRpYV90b19jYXBzKSwKKwkgIChnc3RfcnRzcHNyY19zZW5kKSwgKGdzdF9ydHNwc3JjX2Nsb3NlKSwgKGdzdF9ydHNwc3JjX3BsYXkpLAorCSAgKGdzdF9ydHNwc3JjX3BhdXNlKToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3Nfc2lua19vcGVuKSwKKwkgIChnc3Rfb3NzX3NpbmtfcHJlcGFyZSksIChnc3Rfb3NzX3NpbmtfdW5wcmVwYXJlKToKKwkgIFNtYWxsIGRvY3VtZW50YXRpb24gdXBkYXRlcy4KKworMjAwNi0wOC0yMiAxNjo0MjoyMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC4qOiBQcmVjYWxjIG1vc3Qgb2YgdGhlIGR1cmF0aW9uIHF1ZXJ5IGZvciBlYWNoIHN0cmVhbS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfYXZpX2RlbXV4X2luZGV4X2VudHJ5X2Zvcl90aW1lKSwKKwkgIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLCAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX2V2ZW50KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbml0KSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksIChnc3RfYXZpX2RlbXV4X3BlZWtfdGFnKSwKKwkgIChnc3RfYXZpX2RlbXV4X25leHRfZGF0YV9idWZmZXIpLAorCSAgKGdzdF9hdmlfZGVtdXhfY2FsY3VsYXRlX2R1cmF0aW9uc19mcm9tX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpLCAoZ3N0X2F2aV9kZW11eF9kb19zZWVrKSwKKwkgIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrKSwgKGdzdF9hdmlfZGVtdXhfYWdncmVnYXRlZF9mbG93KSwKKwkgIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksIChnc3RfYXZpX2RlbXV4X2xvb3ApLAorCSAgKGdzdF9hdmlfZGVtdXhfc2lua19hY3RpdmF0ZV9wdWxsKSwgKGdzdF9hdmlfZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgUHJlY2FsYyBtb3N0IG9mIHRoZSBkdXJhdGlvbiBxdWVyeSBmb3IgZWFjaCBzdHJlYW0uCisJICBNYWtlIHNlZWtpbmcgbW9yZSBjb3JyZWN0LgorCSAgVXNlIEdzdFNlZ21lbnQgdG8gdHJhY2sgcG9zaXRpb24gYW5kIGR1cmF0aW9uLgorCSAgQ29kZSBjbGVhbnVwcyBhbmQgbGVhayBmaXhlcy4KKwkgIENhbGN1bGF0ZSBjb3JyZWN0IHRvdGFsIGR1cmF0aW9uIGJhc2VkIG9uIGluZGV4IGxlbmd0aC4KKworMjAwNi0wOC0yMiAxMzo1MzozNCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiBJZiBzdHJpbmdzIGluIHRleHQgZmllbGRzIGFyZSBtYXJrZWQgSVNPODg1OS0xLCBidXQgY29udGFpbiB2YWxpZCBVVEYtOCBhbHJlYWR5LCB0aGVuIGhhbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAocGFyc2VfdGV4dF9pZGVudGlmaWNhdGlvbl9mcmFtZSksCisJICAocGFyc2VfaW5zZXJ0X3N0cmluZ19maWVsZCk6CisJICBJZiBzdHJpbmdzIGluIHRleHQgZmllbGRzIGFyZSBtYXJrZWQgSVNPODg1OS0xLCBidXQgY29udGFpbgorCSAgdmFsaWQgVVRGLTggYWxyZWFkeSwgdGhlbiBoYW5kbGUgdGhlbSBhcyBVVEYtOCBhbmQgaWdub3JlCisJICB0aGUgZW5jb2RpbmcuICgjMzUxNzk0KQorCisyMDA2LTA4LTIyIDEyOjI4OjI0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLio6IE1ha2UgZmxhYy1pbi1vZ2cgd29yayAoIzM1MjEwMCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX3NjYW5fZ290X2ZyYW1lKSwKKwkgIChnc3RfZmxhY19kZWNfd3JpdGUpLCAoZ3N0X2ZsYWNfZGVjX2xvb3ApLAorCSAgKGdzdF9mbGFjX2RlY19zaW5rX2V2ZW50KSwgKGdzdF9mbGFjX2RlY19jaGFpbiksCisJICAoZ3N0X2ZsYWNfZGVjX3NyY19xdWVyeSk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkgIE1ha2UgZmxhYy1pbi1vZ2cgd29yayAoIzM1MjEwMCkuCisKKzIwMDYtMDgtMjIgMTI6MTA6MzIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6IERvbid0IHVucmVmIGJ1ZmZlcnMgb2Ygd2hpY2ggd2UndmUgYWxyZWFkeSBnaXZlbiBhd2F5IG93bmVyc2hpcCB0byB0aGUgYWRhcHRlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOiAoZ3N0X21vbm9zY29wZV9jaGFpbik6CisJICBEb24ndCB1bnJlZiBidWZmZXJzIG9mIHdoaWNoIHdlJ3ZlIGFscmVhZHkgZ2l2ZW4gYXdheQorCSAgb3duZXJzaGlwIHRvIHRoZSBhZGFwdGVyLgorCisyMDA2LTA4LTIyIDEwOjMyOjM0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogTWFrZSBtZXRhZGF0YSBleHRyYWN0aW9uIGFjdHVhbGx5IHdvcmsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IChzcGVleF9kZWNfY2hhaW5fcGFyc2VfY29tbWVudHMpOgorCSAgTWFrZSBtZXRhZGF0YSBleHRyYWN0aW9uIGFjdHVhbGx5IHdvcmsuCisJICAqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiAoZ3N0X3NwZWV4ZW5jX2Jhc2VfaW5pdCksCisJICAoZ3N0X3NwZWV4ZW5jX2luaXQpLCAoZ3N0X3NwZWV4ZW5jX2NyZWF0ZV9tZXRhZGF0YV9idWZmZXIpLAorCSAgKGdzdF9zcGVleGVuY19jaGFpbik6CisJICBGaXggbWV0YWRhdGEgd3JpdGluZzogcmVwbGFjZSBvbGQgY29kZSB3aGljaCB3cm90ZSBjb21wbGV0ZWx5CisJICBicm9rZW4gdGFncyB3aXRoIGxpYmdzdHRhZy1iYXNlZCBjb2RlLiBQbHVzIG1pc2NlbGxhbmVvdXMKKwkgIGNvZGUgY2xlYW51cHMgKHVzZSBzdGF0aWMgcGFkIHRlbXBsYXRlcyBldGMuKSBhbmQgYSBidW5jaAorCSAgb2YgbGVhayBmaXhlcy4KKworMjAwNi0wOC0yMSAxOTozNDowMyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXVkaW9wYW5vcmFtYS86IGRpZSEgZGllISBkaWUhIHlvdSBzaG91bGQgbmV2ZXIgaGF2ZSBiZWVuIHRoZXJlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1ZGlvcGFub3JhbWEvLmN2c2lnbm9yZToKKwkgICogZ3N0L2F1ZGlvcGFub3JhbWEvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb3Bhbm9yYW1hL2F1ZGlvZnguYzoKKwkgICogZ3N0L2F1ZGlvcGFub3JhbWEvYXVkaW9wYW5vcmFtYS5jOgorCSAgKiBnc3QvYXVkaW9wYW5vcmFtYS9hdWRpb3Bhbm9yYW1hLmg6CisJICBkaWUhIGRpZSEgZGllISB5b3Ugc2hvdWxkIG5ldmVyIGhhdmUgYmVlbiB0aGVyZQorCisyMDA2LTA4LTIxIDE2OjI0OjI4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFNvbWUgbW9yZSBjb25zdGlmaWNhdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwgKHF0ZGVtdXhfcGFyc2UpLAorCSAgKHF0ZGVtdXhfbm9kZV9kdW1wX2ZvcmVhY2gpLCAocXRkZW11eF9wYXJzZV90cmFrKSwKKwkgIChxdGRlbXV4X3ZpZGVvX2NhcHMpLCAocXRkZW11eF9hdWRpb19jYXBzKToKKwkgIFNvbWUgbW9yZSBjb25zdGlmaWNhdGlvbi4KKwkgIEZpeCBzb21lIHBhbGV0dGVkIGRhdGEgZm9ybWF0cyBhZ2Fpbi4KKwkgIEZpeCB1bGF3L2FsYXcgaW4gcXQuCisJICBTZXQgY29ycmVjdCBjYXBzIGZvciByYXcgUkdCLgorCSAgQWRkIHN1cHBvcnQgZm9yIHl1djIsIHdoaWNoIGlzIGxpa2UgWXV2Mi4KKwkgIEFkZCBzdXBwb3J0IGZvciByYXcgYXVkaW8gd2l0aCB0aGUgTk9ORSBmb3VyY2MsIHdoaWNoIGlzIGxpa2UgcmF3LgorCisyMDA2LTA4LTIxIDEzOjU5OjUyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvd2F2cGFjay86IE1vcmUgY2xlYW4tdXBzOiB1c2Ugc2hvcnRlciB2YXJpYWJsZSBuYW1lcyB0byBtYWtlIGNvZGUgZWFzaWVyIHRvIHJlYWQ7IHByZWZpeCBzdHJ1Y3R1cmVzIHdlIGRlZmluZSB3aXQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfaW5pdCksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2ZpbmFsaXplKSwgKGdzdF93YXZwYWNrX2VuY19zaW5rX3NldF9jYXBzKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfc2V0X3dwX2NvbmZpZyksIChnc3Rfd2F2cGFja19lbmNfZm9ybWF0X3NhbXBsZXMpLAorCSAgKGdzdF93YXZwYWNrX2VuY19wdXNoX2Jsb2NrKSwgKGdzdF93YXZwYWNrX2VuY19jaGFpbiksCisJICAoZ3N0X3dhdnBhY2tfZW5jX3Jld3JpdGVfZmlyc3RfYmxvY2spLAorCSAgKGdzdF93YXZwYWNrX2VuY19zaW5rX2V2ZW50KSwgKGdzdF93YXZwYWNrX2VuY19jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF93YXZwYWNrX2VuY19zZXRfcHJvcGVydHkpLCAoZ3N0X3dhdnBhY2tfZW5jX2dldF9wcm9wZXJ0eSk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaDoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9yZXNldCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2Vfc3JjX3F1ZXJ5KSwgKGdzdF93YXZwYWNrX3BhcnNlX3NyY19ldmVudCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfaW5pdCksIChnc3Rfd2F2cGFja19wYXJzZV9nZXRfdXBzdHJlYW1fbGVuZ3RoKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9sb29wKToKKwkgIE1vcmUgY2xlYW4tdXBzOiB1c2Ugc2hvcnRlciB2YXJpYWJsZSBuYW1lcyB0byBtYWtlIGNvZGUgZWFzaWVyIHRvCisJICByZWFkOyBwcmVmaXggc3RydWN0dXJlcyB3ZSBkZWZpbmUgd2l0aCAnR3N0JyB0byBtYWtlIGl0IGNsZWFyZXIKKwkgIHdoZXJlIHRoZXkgY29tZSBmcm9tLgorCisyMDA2LTA4LTIxIDEzOjI2OjM3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IEZpeCBjYXBzIHNldCBvbiBidWZmZXJzIGFuZCB0ZW1wbGF0ZSBjYXBzIChvdXRwdXQgaXMgZnJhbWVkKSBhbmQgbWFrZSB0aGVtIG1hdGNoICgjMzUxNjYuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfaW5pdCksCisJICAoZ3N0X3dhdnBhY2tfZW5jX3NldF93cF9jb25maWcpLCAoZ3N0X3dhdnBhY2tfZW5jX3B1c2hfYmxvY2spLAorCSAgKGdzdF93YXZwYWNrX2VuY19jaGFpbiksIChnc3Rfd2F2cGFja19lbmNfcmV3cml0ZV9maXJzdF9ibG9jayksCisJICAoZ3N0X3dhdnBhY2tfZW5jX3NpbmtfZXZlbnQpOgorCSAgRml4IGNhcHMgc2V0IG9uIGJ1ZmZlcnMgYW5kIHRlbXBsYXRlIGNhcHMgKG91dHB1dCBpcyBmcmFtZWQpCisJICBhbmQgbWFrZSB0aGVtIG1hdGNoICgjMzUxNjYzKTsgdXNlIEdTVF9XQVJOSU5HX09CSkVDVCBpbnN0ZWFkIG9mCisJICBHU1RfRUxFTUVOVF9XQVJOSU5HOyBzaW1wbGlmeSBwdXNoX2Jsb2NrKCk7IGRvIHNvbWUgc21hbGwKKwkgIGNsZWFuLXVwcyBoZXJlIGFuZCB0aGVyZTsgZml4IG1lbWxlYWsgKCMzNTE2NjMpLgorCisyMDA2LTA4LTIxIDEzOjEyOjQ3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9wYW5vcmFtYS5jOiBGaXggaW52YWxpZCBtZW1vcnkgYWNjZXNzIGluIGF1ZGlvcGFub3JhbWEgdGVzdCBzdWl0ZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3Bhbm9yYW1hLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBGaXggaW52YWxpZCBtZW1vcnkgYWNjZXNzIGluIGF1ZGlvcGFub3JhbWEgdGVzdCBzdWl0ZS4KKworMjAwNi0wOC0yMSAxMTozNDo0MSArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZTogaWdub3JlIGJ1aWx0IGZpbGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOgorCSAgaWdub3JlIGJ1aWx0IGZpbGUKKworMjAwNi0wOC0yMSAxMDo0NjoyMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9NYWtlZmlsZS5hbTogRml4IHRoZSBidWlsZCBhZ2Fpbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgRml4IHRoZSBidWlsZCBhZ2Fpbi4KKworMjAwNi0wOC0yMSAwOToyMToyNyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXVkaW9meGdvb2QvOiByZXN1Ym1pdCB3aXRoIHRoZSBkZXNpcmVkIG5hbWUgKmFnYWluKgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdWRpb2Z4Z29vZC8uY3ZzaWdub3JlOgorCSAgKiBnc3QvYXVkaW9meGdvb2QvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hdWRpb2Z4Z29vZC9hdWRpb2Z4LmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9hdWRpb2Z4Z29vZC9hdWRpb3Bhbm9yYW1hLmM6IChnc3RfYXVkaW9fcGFub3JhbWFfYmFzZV9pbml0KSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfY2xhc3NfaW5pdCksIChnc3RfYXVkaW9fcGFub3JhbWFfaW5pdCksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX2dldF91bml0X3NpemUpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV90cmFuc2Zvcm1fY2FwcyksIChnc3RfYXVkaW9fcGFub3JhbWFfc2V0X2NhcHMpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV90cmFuc2Zvcm1fbTJzKSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX3MycyksIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtKToKKwkgICogZ3N0L2F1ZGlvZnhnb29kL2F1ZGlvcGFub3JhbWEuaDoKKwkgIHJlc3VibWl0IHdpdGggdGhlIGRlc2lyZWQgbmFtZSAqYWdhaW4qCisKKzIwMDYtMDgtMjAgMTM6MDk6NTEgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdXNlIGdfYXNzZXJ0IGluIF9nZXRfdW5pdF9zaXplCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzogKGdzdF9waXhidWZzY2FsZV9nZXRfdW5pdF9zaXplKToKKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2dldF91bml0X3NpemUpOgorCSAgdXNlIGdfYXNzZXJ0IGluIF9nZXRfdW5pdF9zaXplCisKKzIwMDYtMDgtMjAgMTM6MDY6NDQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogY2xlYW51cCAtdW51c2VkLnR4dCB0byBtYWtlIGl0IHVzZWZ1bCwgYWRkIHByZXZpb3VzbHkgbWlzc2luZyBkb2NzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meGdvb2QueG1sOgorCSAgY2xlYW51cCAtdW51c2VkLnR4dCB0byBtYWtlIGl0IHVzZWZ1bCwgYWRkIHByZXZpb3VzbHkgbWlzc2luZyBkb2NzCisJICAqIGV4dC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2VzZC9lc2Rtb24uYzoKKwkgICogZXh0L2VzZC9lc2RzaW5rLmM6CisJICAqIGV4dC9lc2QvZ3N0ZXNkLmM6IChwbHVnaW5faW5pdCk6CisJICByZWZsb3cgdG8gZ2V0IHJpZCBvZiB0d28gZXh0ZXJuYWwgc3ltYm9scworCSAgKiBnc3QvYXVkaW9meGdvb2QvYXVkaW9meC5jOiAocGx1Z2luX2luaXQpOgorCSAgcmUtYWRkCisKKzIwMDYtMDgtMjAgMTI6MDk6MTYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F1ZGlvZnhnb29kL2F1ZGlvZnguYworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L2F1ZGlvZnhnb29kLy5jdnNpZ25vcmU6CisJICAqIGdzdC9hdWRpb2Z4Z29vZC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1ZGlvZnhnb29kL2F1ZGlvZnguYworCSAgKiBnc3QvYXVkaW9meGdvb2QvYXVkaW9wYW5vcmFtYS5jOiAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX2Jhc2VfaW5pdCksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX2NsYXNzX2luaXQpLCAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX2luaXQpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdWRpb19wYW5vcmFtYV9nZXRfdW5pdF9zaXplKSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX2NhcHMpLCAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3NldF9jYXBzKSwKKwkgIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX20ycyksCisJICAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9zMnMpLCAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybSk6CisJICAqIGdzdC9hdWRpb2Z4Z29vZC9hdWRpb3Bhbm9yYW1hLmg6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3Bhbm9yYW1hLmM6IChzZXR1cF9wYW5vcmFtYV9tKSwKKwkgIChzZXR1cF9wYW5vcmFtYV9zKSwgKGNsZWFudXBfcGFub3JhbWEpLCAoR1NUX1NUQVJUX1RFU1QpLAorCSAgKHBhbm9yYW1hX3N1aXRlKSwgKG1haW4pOgorCSAgQWRkIGF1ZGlvZnhnb29kIHBsdWdpbiB3aXRoIGF1ZGlvcGFub3JhbWEgZWxlbWVudAorCisyMDA2LTA4LTE4IDIxOjM5OjAwICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiBGaXggcmVzeW5jaW5nIGluIHB1c2ggbW9kZSBub3Qgc3RvcHBpbmcgcmUtc3luY2luZyBhdCBlbWJlZGRlZCB6ZXJvZXM7IHNraXAgZ2FyYmFnZSBiZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBCYXNlZCBvbiBwYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW8gYXQgY2lyY3VsYXItY2hhb3Mub3JnPgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogKGdzdF93YXZwYWNrX3BhcnNlX3NpbmtfZXZlbnQpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2dldF91cHN0cmVhbV9sZW5ndGgpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2ZpbmRfbWFya2VyKSwgKGdzdF93YXZwYWNrX3BhcnNlX3Jlc3luY19sb29wKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9sb29wKSwgKGdzdF93YXZwYWNrX3BhcnNlX3Jlc3luY19hZGFwdGVyKToKKwkgIEZpeCByZXN5bmNpbmcgaW4gcHVzaCBtb2RlIG5vdCBzdG9wcGluZyByZS1zeW5jaW5nIGF0IGVtYmVkZGVkCisJICB6ZXJvZXM7IHNraXAgZ2FyYmFnZSBiZXR3ZWVuIGZyYW1lcyBpbiBwdWxsIG1vZGUgYXMgd2VsbCBpZgorCSAgbmVjZXNzYXJ5OyB1c2UgZ3N0X3BhZF9xdWVyeV9wZWVyX2R1cmF0aW9uKCk7IHB1c2ggRU9TIGFuZAorCSAgTkVXU0VHTUVOVCBldmVudCBpbiByaWdodCBkaXJlY3Rpb24gKCMzNTE2NTkpLgorCisyMDA2LTA4LTE4IDE3OjAwOjUzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06IE1vcmUgT3NzIGRvY3MgZml4YWdlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgIE1vcmUgT3NzIGRvY3MgZml4YWdlLgorCisyMDA2LTA4LTE4IDE2OjUyOjIxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogQWRkZWQgZXhwZXJpbWVudGFsIFNWUTMgZGVwYXlsb2FkZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYzogKGdzdF9ydHBfc3Yzdl9kZXBheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfc3Yzdl9kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfc3Yzdl9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX3N2M3ZfZGVwYXlfZmluYWxpemUpLCAoZ3N0X3J0cF9zdjN2X2RlcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfc3Yzdl9kZXBheV9wcm9jZXNzKSwgKGdzdF9ydHBfc3Yzdl9kZXBheV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfc3Yzdl9kZXBheV9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfc3Yzdl9kZXBheV9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9ydHBfc3Yzdl9kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5Lmg6CisJICBBZGRlZCBleHBlcmltZW50YWwgU1ZRMyBkZXBheWxvYWRlci4KKworMjAwNi0wOC0xOCAxMzoyNTowNiArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZXh0L2R2L2dzdGR2ZGVtdXguKjogV2hlbiBoYW5kbGluZyBzZWVrIHJlcXVlc3RzLCBkb24ndCBzZW5kIHRoZSBuZXdzZWdtZW50IGV2ZW50IGZyb20gdGhlIGNhbGxpbmcgdGhyZWFkLiBJbnN0ZWFkIHNhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2hhbmRsZV9wdWxsX3NlZWspLAorCSAgKGdzdF9kdmRlbXV4X2xvb3ApLCAoZ3N0X2R2ZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguaDoKKwkgIFdoZW4gaGFuZGxpbmcgc2VlayByZXF1ZXN0cywgZG9uJ3Qgc2VuZCB0aGUgbmV3c2VnbWVudCBldmVudCBmcm9tIHRoZQorCSAgY2FsbGluZyB0aHJlYWQuIEluc3RlYWQgc2F2ZSBpdCBzbyBpdCBjYW4gYmUgc2VudCBmcm9tIHRoZSBzdHJlYW1pbmcKKwkgIHRocmVhZC4KKworMjAwNi0wOC0xNyAxNTo1MTo1MCArMDAwMCAgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorCisJICBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6IEFjY2VwdCBsZWFkaW5nIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBib3VuZGFyeQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2pvZXJkIFNpbW9ucyA8c2pvZXJkIGF0IGx1b24gZG90IG5ldD4KKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOiAobXVsdGlwYXJ0X3BhcnNlX2hlYWRlcik6CisJICBBY2NlcHQgbGVhZGluZyB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUgYm91bmRhcnkKKwkgIFRoaXMgcGF0Y2ggbWFrZXMgdGhlIGRlbXV4ZXIgYWxsb3cgc29tZSB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUgYWN0dWFsCisJICBib3VuZGFyeS4gVGhpcyBtYWtlcyB0aGUgZGVtdXhlciB3b3JrIHdpdGggdGhlIGBgb2xkJycgZ3N0cmVhbWVyCisJICBtdWx0aXBhcnRtdXhlciBhZ2FpbiAod2hpY2ggcGxhY2VkIGFuIGV4dHJhIFxuIGJlZm9yZSB0aGUgc3RhcnQKKwkgIG9mIHRoZSBzdHJlYW0pIEZpeGVzICMzNDkwNjguCisKKzIwMDYtMDgtMTcgMTU6NDc6MjggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmM6IEVycm9yIG91dCBvbiBub24taW1wbGVtZW50ZWQgc3R1ZmYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzogKGdzdF9ydHBfaDI2NF9kZXBheV9wcm9jZXNzKToKKwkgIEVycm9yIG91dCBvbiBub24taW1wbGVtZW50ZWQgc3R1ZmYuCisKKzIwMDYtMDgtMTYgMTY6NTA6MDAgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSAgZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYzogTWFrZSBsYWRzcGEgZWxlbWVudHMgcmV1c2FibGUuIEZpeGVzICMzNTAwMDYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBBbmR5IFdpbmdvIDx3aW5nbyBhdCBwb2JveCBkb3QgY29tPgorCSAgKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5jOiAoZ3N0X3NpZ25hbF9wcm9jZXNzb3Jfc2V0dXApLAorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX3N0YXJ0KSwgKGdzdF9zaWduYWxfcHJvY2Vzc29yX3N0b3ApLAorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX2NsZWFudXApLCAoZ3N0X3NpZ25hbF9wcm9jZXNzb3Jfc2V0Y2FwcyksCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfcGVuX2J1ZmZlciksIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9mbHVzaCksCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfZG9fcHVsbHMpLCAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfZG9fcHVzaGVzKSwKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9jaGFuZ2Vfc3RhdGUpOgorCSAgTWFrZSBsYWRzcGEgZWxlbWVudHMgcmV1c2FibGUuIEZpeGVzICMzNTAwMDYuCisKKzIwMDYtMDgtMTYgMTU6MzM6MTIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9sYWRzcGEvZ3N0bGFkc3BhLmM6IENvbnZlcnQgJyAnIGludG8gJ18nLiBUcnkgdG8ga2VlcCBhcyBtYW55IGNoYXJhY3RlcnMgaW4gdGhlIHBhZHRlbXBsYXRlIG5hbWVzIGFzIHBvc3NpYmxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9sYWRzcGEvZ3N0bGFkc3BhLmM6IChnc3RfbGFkc3BhX2Jhc2VfaW5pdCk6CisJICBDb252ZXJ0ICcgJyBpbnRvICdfJy4gVHJ5IHRvIGtlZXAgYXMgbWFueSBjaGFyYWN0ZXJzIGluIHRoZSBwYWR0ZW1wbGF0ZQorCSAgbmFtZXMgYXMgcG9zc2libGUuCisKKzIwMDYtMDgtMTYgMTQ6NDc6NTAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmM6IEEgcHVzaCgpIGdpdmVzIGF3YXkgb3VyIHJlZmNvdW50IHNvIHdlIHNob3VsZCBub3QgdXNlIHRoZSBidWZmZXIgb24gdGhlIHBlbiBhbnltb3JlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmM6IChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9mbHVzaCksCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfZG9fcHVzaGVzKToKKwkgIEEgcHVzaCgpIGdpdmVzIGF3YXkgb3VyIHJlZmNvdW50IHNvIHdlIHNob3VsZCBub3QgdXNlIHRoZSBidWZmZXIgb24gdGhlCisJICBwZW4gYW55bW9yZS4KKworMjAwNi0wOC0xNiAxMzo0ODowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL29zcy9nc3Rvc3NtaXhlcmVsZW1lbnQuYzogRG9uJ3QgbGVhayBkZXZpY2Ugc3RyaW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3MvZ3N0b3NzbWl4ZXJlbGVtZW50LmM6IChnc3Rfb3NzX21peGVyX2VsZW1lbnRfY2xhc3NfaW5pdCksCisJICAoZ3N0X29zc19taXhlcl9lbGVtZW50X2ZpbmFsaXplKToKKwkgIERvbid0IGxlYWsgZGV2aWNlIHN0cmluZy4KKworMjAwNi0wOC0xNiAxMzowMTozMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBSZXF1aXJlIENWUyBvZiBHU3RyZWFtZXIgY29yZSBhbmQgLWJhc2UgKGZvcgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIFJlcXVpcmUgQ1ZTIG9mIEdTdHJlYW1lciBjb3JlIGFuZCAtYmFzZSAoZm9yCisJICBHU1RfVEFHX0VYVEVOREVEX0NPTU1FTlQgYW5kIGdzdF90YWdfcGFyc2VfZXh0ZW5kZWRfY29tbWVudCgpKS4KKwkgICogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkgIFdyaXRlIGV4dGVuZGVkIGNvbW1lbnQgdGFncyBwcm9wZXJseSAoIzM0ODc2MikuCisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAoaWQzZGVtdXhfaWQzdjJfcGFyc2VfZnJhbWUpLAorCSAgKHBhcnNlX2NvbW1lbnRfZnJhbWUpOgorCSAgRXh0cmFjdCBDT01NIGZyYW1lcyBpbnRvIGV4dGVuZGVkIGNvbW1lbnRzLCB3aGljaCBtYWtlcyBpdAorCSAgZWFzaWVyIHRvIHByb3Blcmx5IHJldGFpbiB0aGUgZGVzY3JpcHRpb24gYml0IG9mIHRoZSB0YWcKKwkgIGFuZCBtYWludGFpbiB0aGlzIGluZm9ybWF0aW9uIHdoZW4gcmUtdGFnZ2luZyAoIzM0ODc2MikuCisKKzIwMDYtMDgtMTYgMTI6MDI6NDggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOiBEb24ndCB0cnkgdG8gcnVuIGFubm9kZXggdW5pdCB0ZXN0cyBpZiB0aGUgYW5ub2RleCBwbHVnaW4gaGFzIG5vdCBiZWVuIGJ1aWx0IChGaXhlcyAjMzUxMTE2KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIERvbid0IHRyeSB0byBydW4gYW5ub2RleCB1bml0IHRlc3RzIGlmIHRoZSBhbm5vZGV4CisJICBwbHVnaW4gaGFzIG5vdCBiZWVuIGJ1aWx0IChGaXhlcyAjMzUxMTE2KS4KKworMjAwNi0wOC0xNiAxMDo1MzozMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOiBXaGVuIHdlIGNhbid0IGZpbmQgYSB1c2FibGUgYXVkaW9zaW5rLCBkb24ndCBlcnJvciBvdXQsIGJ1dCB1c2UgYSBmYWtlIHNpbmsgaW5zdGVhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfZmluZF9iZXN0KToKKwkgIFdoZW4gd2UgY2FuJ3QgZmluZCBhIHVzYWJsZSBhdWRpb3NpbmssIGRvbid0IGVycm9yIG91dCwKKwkgIGJ1dCB1c2UgYSBmYWtlIHNpbmsgaW5zdGVhZCBhbmQgcG9zdCBhIHdhcm5pbmcgbWVzc2FnZQorCSAgb24gdGhlIGJ1cyAoIzM0MTI3OCkuCisKKzIwMDYtMDgtMTYgMTA6NDA6MDQgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svOiBJbiBwdXNoIG1vZGUsIHJlLXN5bmMgdG8gbmV4dCB3YXZwYWNrIGhlYWRlciBpZiBzeW5jIGlzIGxvc3QgKCMzNTE1NTcpLiBBbHNvIHVzZSBoeXBoZW5zIGluc3RlYWQgb2YgdW5kLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tbyBhdCBjaXJjdWxhci1jaGFvcy5vcmc+CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuYzogKGdzdF93YXZwYWNrX2VuY19jbGFzc19pbml0KToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6CisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfcmVzeW5jX2FkYXB0ZXIpLCAoZ3N0X3dhdnBhY2tfcGFyc2VfY2hhaW4pOgorCSAgSW4gcHVzaCBtb2RlLCByZS1zeW5jIHRvIG5leHQgd2F2cGFjayBoZWFkZXIgaWYgc3luYyBpcyBsb3N0CisJICAoIzM1MTU1NykuIEFsc28gdXNlIGh5cGhlbnMgaW5zdGVhZCBvZiB1bmRlcnNjb3JlcyBpbgorCSAgR09iamVjdCBwcm9wZXJ0eSBuYW1lcy4KKworMjAwNi0wOC0xNiAxMDoyMjozMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL29zcy86IERvY3VtZW50IE9TUyBlbGVtZW50czsgYWRkIGd0ay1kb2MgYmx1cmIgd2l0aCAnU2luY2UgMC4xMC41JyBmb3Igb3NzbWl4ZXIncyBuZXcgZGV2aWNlIHByb3BlcnR5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3MvZ3N0b3NzbWl4ZXJlbGVtZW50LmM6IChnc3Rfb3NzX21peGVyX2VsZW1lbnRfY2xhc3NfaW5pdCk6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NyYy5jOgorCSAgRG9jdW1lbnQgT1NTIGVsZW1lbnRzOyBhZGQgZ3RrLWRvYyBibHVyYiB3aXRoICdTaW5jZSAwLjEwLjUnIGZvcgorCSAgb3NzbWl4ZXIncyBuZXcgZGV2aWNlIHByb3BlcnR5LgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBBZGQgZG9jcyBmb3IgT1NTIGVsZW1lbnRzLgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkaW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkgIFVwZGF0ZSB0byBDVlMgdmVyc2lvbi4KKworMjAwNi0wOC0xNiAxMDowNTowMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IENhcHMgZXh0cmEgcHJvcGVydGllcyBtdXN0IGJlIGRlZmluZWQgYXMgc3RyaW5ncyBmb3IgZGVwYXlsb2FkZXJzIGJlY2F1c2UgdGhleSBhcmUgZ2VuZXJhdGVkIGZyb20gYW4gU0RQLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuYzoKKwkgIENhcHMgZXh0cmEgcHJvcGVydGllcyBtdXN0IGJlIGRlZmluZWQgYXMgc3RyaW5ncyBmb3IKKwkgIGRlcGF5bG9hZGVycyBiZWNhdXNlIHRoZXkgYXJlIGdlbmVyYXRlZCBmcm9tIGFuIFNEUC4KKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYzogKGdzdF9ydHBfaDI2NF9kZXBheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfaDI2NF9kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfaDI2NF9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX2gyNjRfZGVwYXlfZmluYWxpemUpLCAoZGVjb2RlX2Jhc2U2NCksCisJICAoZ3N0X3J0cF9oMjY0X2RlcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9oMjY0X2RlcGF5X3Byb2Nlc3MpLAorCSAgKGdzdF9ydHBfaDI2NF9kZXBheV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfaDI2NF9kZXBheV9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfaDI2NF9kZXBheV9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9ydHBfaDI2NF9kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5Lmg6CisJICBBZGRlZCBiYXNpYywgbm90IGNvbXBsZXRlbHkgZnVuY3Rpb25hbCBSRkMgMzk4NCBIMjY0IGRlcGF5bG9hZGVyLgorCisyMDA2LTA4LTE2IDA5OjQ4OjI2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9nc3RydHBkZWMuYzogQWRkIHBhZHMgYWZ0ZXIgc2V0dGluZyB0aGVtIHVwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOiAoZ3N0X3J0cGRlY19pbml0KSwgKGdzdF9ydHBkZWNfZ2V0Y2Fwcyk6CisJICBBZGQgcGFkcyBhZnRlciBzZXR0aW5nIHRoZW0gdXAuCisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHNwc3JjX2luaXQpLCAoZ3N0X3J0c3BzcmNfZmluYWxpemUpLAorCSAgKGdzdF9ydHNwc3JjX2ZyZWVfc3RyZWFtKSwgKGdzdF9ydHNwc3JjX21lZGlhX3RvX2NhcHMpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9zZXR1cF9ydHApLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwKKwkgIChnc3RfcnRzcHNyY19jb21iaW5lX2Zsb3dzKSwgKGdzdF9ydHNwc3JjX2xvb3ApLAorCSAgKGdzdF9ydHNwc3JjX29wZW4pLCAoZ3N0X3J0c3BzcmNfY2xvc2UpLCAoZ3N0X3J0c3BzcmNfcGxheSksCisJICAoZ3N0X3J0c3BzcmNfcGF1c2UpOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBGaXggaW50ZXJsZWF2ZWQgbW9kZS4KKwkgIC0gUHJvdGVjdCBzdHJlYW1pbmcgd2l0aCBsb2NrLgorCSAgLSBDb21iaW5lIGZsb3dzCisJICAtIHNldCBjYXBzIG9uIG91dGdvaW5nIGJ1ZmZlcnMuCisJICAtIHN0cmlwIHRyYWlsaW5nIFwwIGZyb20gZGF0YSBwYWNrZXRzLgorCSAgLSBDb25maWd1cmUgUlRQL1JUQ1AgaW4gc3RyZWFtLgorCSAgVXNlIERFQlVHX09CSkVDVCBtb3JlLgorCisyMDA2LTA4LTE2IDA5OjI5OjIwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiBUdXJuIGEgZ19wcmludCBpbnRvIGEgREVCVUcgbGluZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19hZGQpOgorCSAgVHVybiBhIGdfcHJpbnQgaW50byBhIERFQlVHIGxpbmUuCisKKzIwMDYtMDgtMTYgMDk6MjU6MTcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIHN5cy9vc3MvOiBTbWFsbCBjbGVhbnVwcy4gQmV0dGVyIGVycm9yIHJlcG9ydGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3NzL2dzdG9zc21peGVyLmM6IChnc3Rfb3NzbWl4ZXJfb3BlbiksIChnc3Rfb3NzbWl4ZXJfbmV3KToKKwkgICogc3lzL29zcy9nc3Rvc3NtaXhlcmVsZW1lbnQuYzogKGdzdF9vc3NfbWl4ZXJfZWxlbWVudF9jbGFzc19pbml0KSwKKwkgIChnc3Rfb3NzX21peGVyX2VsZW1lbnRfaW5pdCksIChnc3Rfb3NzX21peGVyX2VsZW1lbnRfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfb3NzX21peGVyX2VsZW1lbnRfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfb3NzX21peGVyX2VsZW1lbnRfY2hhbmdlX3N0YXRlKToKKwkgICogc3lzL29zcy9nc3Rvc3NtaXhlcmVsZW1lbnQuaDoKKwkgIFNtYWxsIGNsZWFudXBzLiBCZXR0ZXIgZXJyb3IgcmVwb3J0aW5nLgorCSAgQWRkIGRldmljZSBwcm9wZXJ0eSBmb3IgdGhlIG1peGVyIGluc3RlYWQgb2YgdGhlIGhhcmRjb2RlZAorCSAgL2Rldi9taXhlci4gRml4ZXMgIzM1MDc4NS4KKwkgIEFQSTogR3N0T3NzTWl4ZXJFbGVtZW50OjpkZXZpY2UgcHJvcGVydHkKKworMjAwNi0wOC0xNSAyMjo0NDoyNyArMDAwMCAgSmVucyBHcmFuc2V1ZXIgPGplbnNnckBnbXgubmV0PgorCisJICBnY29uZi9NYWtlZmlsZS5hbTogTWFrZSAtLWRpc2FibGUtc2NoZW1hcyB3b3JrIHJpZ2h0ICh0aGV5IHN0aWxsIG5lZWQgdG8gYmUgY29waWVkIHRvIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LCBqdXMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEplbnMgR3JhbnNldWVyIDxqZW5zZ3IgYXQgZ214IG5ldD4KKwkgICogZ2NvbmYvTWFrZWZpbGUuYW06CisJICBNYWtlIC0tZGlzYWJsZS1zY2hlbWFzIHdvcmsgcmlnaHQgKHRoZXkgc3RpbGwgbmVlZAorCSAgdG8gYmUgY29waWVkIHRvIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LCBqdXN0IG5vdAorCSAgYXBwbGllZCkuIEZpeGVzICMzNTEzNDcgKGFsc28gIzM0NDEwMCkuCisKKzIwMDYtMDgtMTUgMjA6Mjk6NDUgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLio6IE1ha2Ugd2F2cGFja3BhcnNlIGFsc28gd29yayBpbiBwdXNoLW1vZGUgKG5vdCBzZWVrYWJsZSB5ZXQgdGhvdWdoKTsgc29tZSBzbWFsbCBjbGVhbi11Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9jbGFzc19pbml0KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9yZXNldCksIChnc3Rfd2F2cGFja19wYXJzZV9nZXRfc3JjX3F1ZXJ5X3R5cGVzKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9zcmNfcXVlcnkpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2hhbmRsZV9zZWVrX2V2ZW50KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9zaW5rX2V2ZW50KSwgKGdzdF93YXZwYWNrX3BhcnNlX2luaXQpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2NyZWF0ZV9zcmNfcGFkKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9wdXNoX2J1ZmZlciksIChnc3Rfd2F2cGFja19wYXJzZV9sb29wKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9jaGFpbiksIChnc3Rfd2F2cGFja19wYXJzZV9zaW5rX2FjdGl2YXRlKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9zaW5rX2FjdGl2YXRlX3B1bGwpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuaDoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tbyBhdCBjaXJjdWxhci1jaGFvcy5vcmc+CisJICBNYWtlIHdhdnBhY2twYXJzZSBhbHNvIHdvcmsgaW4gcHVzaC1tb2RlIChub3Qgc2Vla2FibGUgeWV0IHRob3VnaCk7CisJICBzb21lIHNtYWxsIGNsZWFuLXVwcyBhbG9uZyB0aGUgd2F5OyBhZGQgc3VwcG9ydCBmb3IgU0VFS0lORyBxdWVyeQorCSAgYW5kIHF1ZXJ5IHR5cGVzIGZ1bmN0aW9uLiAoIzM1MTQ5NSkuCisKKzIwMDYtMDgtMTQgMTE6Mzc6MTAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb25maWd1cmUuYWM6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBiYWNrIHRvIEhFQUQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYmFjayB0byBIRUFECisKKzIwMDYtMDgtMTQgMTE6MTQ6NDMgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYWNvbG9yLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taGFsZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JhbGFuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICByZWxlYXNpbmcgMC4xMC40CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbGVhc2luZyAwLjEwLjQKKworMjAwNi0wOC0xNCAxMDowNjo1NSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBFeHRyYWN0IGFsbCByZWZlcmVuY2VzL3JlZGlyZWN0aW9ucyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGFuZCBzb3J0IHRoZW07IGFsc28gZXh0cmFjdCBtaW5pLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9yZWRpcmVjdHNfc29ydF9mdW5jKSwKKwkgIChxdGRlbXV4X3Byb2Nlc3NfcmVkaXJlY3RzKSwgKHF0ZGVtdXhfcGFyc2VfdHJlZSk6CisJICBFeHRyYWN0IGFsbCByZWZlcmVuY2VzL3JlZGlyZWN0aW9ucyBpZiB0aGVyZSBpcyBtb3JlCisJICB0aGFuIG9uZSBhbmQgc29ydCB0aGVtOyBhbHNvIGV4dHJhY3QgbWluaW11bSByZXF1aXJlZAorCSAgYml0cmF0ZSBpbmZvcm1hdGlvbiBpZiBhdmFpbGFibGUuICgjMzUwMzk5KQorCisyMDA2LTA4LTEwIDE0OjEwOjI4ICswMDAwICBFZHdhcmQgSGVydmV5IDxlZHdhcmRAZmx1ZW5kby5jb20+CisKKwkgIFNlbmQgdGhlIG5ld3NlZ21lbnQgZXZlbnQgaW4gdGhlIHN0cmVhbWluZyB0aHJlYWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBFZHdhcmQgSGVydmV5IDxlZHdhcmRAZmx1ZW5kby5jb20+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpOgorCSAgU2VuZCB0aGUgbmV3c2VnbWVudCBldmVudCBpbiB0aGUgc3RyZWFtaW5nIHRocmVhZC4KKwkgIEZpeGVzICMzNDc1MjkKKworMjAwNi0wOC0xMCAxNDowMjo0NSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIGJ1bXBlZCBmb3IgcHJlcmVsCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGJ1bXBlZCBmb3IgcHJlcmVsCisKKzIwMDYtMDgtMTAgMTM6MTA6MzggKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vY3MucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSAgdXBkYXRlIHRyYW5zbGF0aW9ucworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICB1cGRhdGUgdHJhbnNsYXRpb25zCisKKzIwMDYtMDgtMDggMTQ6NTU6NTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRml4IHNpbGx5IHR5cG8uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmVlKToKKwkgIEZpeCBzaWxseSB0eXBvLgorCisyMDA2LTA4LTA4IDE0OjQ2OjAwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBDaGFuZ2VMb2c6CisJICBDaGFuZ2VMb2cgc3VyZ2VyeTogbWVudGlvbiBidWcgbnVtYmVyCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5OiBtZW50aW9uIGJ1ZyBudW1iZXIKKworMjAwNi0wOC0wOCAxNDo0MDo0NyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2pwZWcvOiBSZWZ1c2Ugc2luayBjYXBzIGluIHRoZSBlbmNvZGVyIGlmIHdpZHRoIG9yIGhlaWdodCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiwgdGhlIGVuY29kZXIgZG9lcyBub3Qgc3VwcG9ydCB0Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2pwZWcvZ3N0c21va2VkZWMuYzogKGdzdF9zbW9rZWRlY19jaGFpbik6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6IChnc3Rfc21va2VlbmNfc2V0Y2FwcyksCisJICAoZ3N0X3Ntb2tlZW5jX3Jlc3luYyksIChnc3Rfc21va2VlbmNfY2hhaW4pOgorCSAgUmVmdXNlIHNpbmsgY2FwcyBpbiB0aGUgZW5jb2RlciBpZiB3aWR0aCBvciBoZWlnaHQgaXMgbm90IGEKKwkgIG11bHRpcGxlIG9mIDE2LCB0aGUgZW5jb2RlciBkb2VzIG5vdCBzdXBwb3J0IHRoYXQgeWV0OyBhbG9uZyB0aGUKKwkgIHNhbWUgbGluZXMsIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGVuY29kZXIgc2V0dXAgZnVuY3Rpb247CisJICBhbHNvIHJlbW92ZSBzb21lIGRlYnVnIGxvZyBjbHV0dGVyLgorCisyMDA2LTA4LTA0IDExOjM4OjU0ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmg6IEFkZCBpbmZyYXN0cnVjdHVyZSBmb3Igc3RvcmluZyB3aGV0aGVyIGEgcHJvY2Vzc29yIGNhbiB3b3JrIGluIHBsYWNlIG9yIG5vdCwgYW5kIGZvci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA4LTA0ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5oOiBBZGQgaW5mcmFzdHJ1Y3R1cmUgZm9yIHN0b3JpbmcKKwkgIHdoZXRoZXIgYSBwcm9jZXNzb3IgY2FuIHdvcmsgaW4gcGxhY2Ugb3Igbm90LCBhbmQgZm9yIGtlZXBpbmcKKwkgIHRyYWNrIG9mIGl0cyBzdGF0ZS4gQ2hhbmdlIHRoZSBGbG93UmV0dXJuIGluc3RhbmNlIHZhcmlhYmxlIGZyb20KKwkgICJzdGF0ZSIgdG8gImZsb3dfc3RhdGUiLCBhbGwgY2FsbGVycyBjaGFuZ2VkLgorCSAgKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5jIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9zZXR1cCkKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9zdGFydCwgZ3N0X3NpZ25hbF9wcm9jZXNzb3Jfc3RvcCkKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9jbGVhbnVwKTogTmV3IGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlCisJICBwcm9jZXNzb3IncyBzdGF0ZS4KKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9zZXRjYXBzKTogc3RhcnQoKSBhcyB3ZWxsIGFzIHNldHVwKCkgaGVyZS4KKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9wcmVwYXJlKTogUmVzcGVjdCBDQU5fUFJPQ0VTU19JTl9QTEFDRS4KKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9jaGFuZ2Vfc3RhdGUpOiBTdG9wIGFuZCBjbGVhbnVwIHRoZQorCSAgcHJvY2Vzc29yIGFzIHdlIGdvIHRvIE5VTEwuCisJICAqIGV4dC9sYWRzcGEvZ3N0bGFkc3BhLmMgKGdzdF9sYWRzcGFfYmFzZV9pbml0KTogUmV1c2UgYnVmZmVycyBpZgorCSAgSU5QTEFDRV9CUk9LRU4gaXMgbm90IHNldC4KKwkgICogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYyAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfcHJlcGFyZSk6CisJICBEbyB0aGUgYWxsb2NfYnVmZmVyIGluIGJ5dGVzLCBub3QgZnJhbWVzLgorCisyMDA2LTA4LTA0IDEwOjIxOjI2ICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBzeXMveGltYWdlL3hpbWFnZXV0aWwuYzogRml4IHJnYiBtYXNrcyB3aGVuIHJlY29yZGluZyBpbiA8IDI0YnBwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA4LTA0ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisJICAqIHN5cy94aW1hZ2UveGltYWdldXRpbC5jOiAoeGltYWdldXRpbF94Y29udGV4dF9nZXQpOgorCSAgRml4IHJnYiBtYXNrcyB3aGVuIHJlY29yZGluZyBpbiA8IDI0YnBwLgorCisyMDA2LTA4LTA0IDA5OjIwOjI2ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmM6CisJICBCUEIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX3NyY19hY3RpdmF0ZV9wdWxsKTogQlBCCisKKzIwMDYtMDgtMDQgMDk6MDU6NTMgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYzoKKwkgIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmMgKGdzdF9zaWduYWxfcHJvY2Vzc29yX3NldGNhcHMpIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9wcmVwYXJlKSAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfdS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA4LTA0ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5jIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9zZXRjYXBzKQorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX3ByZXBhcmUpCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfdXBkYXRlX2lucHV0cykKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9wcm9jZXNzLCBnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9wZW5fYnVmZmVyKQorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX2ZsdXNoKQorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX3NpbmtfYWN0aXZhdGVfcHVzaCkKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9zcmNfYWN0aXZhdGVfcHVsbCkKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9jaGFuZ2Vfc3RhdGUpOiBSZW1vdmUgdGhlIGxhc3Qgb2YgdGhlIGNvZGUKKwkgIHRoYXQgYXNzdW1lcyB0aGF0IHdlIHByb2Nlc3Mgd2hvbGUgYnVmZmVycyBhdCBhIHRpbWUuIEZpeCBzb21lCisJICBkZWJ1Z2dpbmcuIFNlZW1zIHRvIHdvcmsgbm93IGluIHNvbWUgY2FzZXMuCisKKzIwMDYtMDctMzEgMjI6Mjc6MjIgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSAgZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYyAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfcHJvY2Vzcyk6IEZpeCBuZnJhbWVzLWNob29zaW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA4LTAxICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5jIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9wcm9jZXNzKToKKwkgIEZpeCBuZnJhbWVzLWNob29zaW5nLgorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX2luaXQpOiBJbml0IHBlbmRpbmdfaW4gYW5kIHBlbmRpbmdfb3V0LgorCisyMDA2LTA3LTMxIDIyOjAzOjA5ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmMgKGdzdF9zaWduYWxfcHJvY2Vzc29yX2luaXQpOiBObyBtb3JlIGRlZmF1bHQgc2FtcGxlIHJhdGUsIGFsdGhvdWdoIHdlIG5ldmVyIGNoZWNrIHRoYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA4LTAxICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5jIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9pbml0KTogTm8KKwkgIG1vcmUgZGVmYXVsdCBzYW1wbGUgcmF0ZSwgYWx0aG91Z2ggd2UgbmV2ZXIgY2hlY2sgdGhhdCB0aGUgc2FtcGxlCisJICByYXRlIGFjdHVhbGx5IGdldHMgc2V0LiBTb21ldGhpbmcgZm9yIHRoZSBmdXR1cmUuCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3Jfc2V0Y2Fwcyk6IFNvbWUgcmVmY291bnQgZml4ZXMsIGZsb3cgZml4ZXMuCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfZXZlbnQpOiBSZWZjb3VudCBmaXhlbi4KKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9wcm9jZXNzKTogUHVsbCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0bworCSAgcHJvY2VzcyBmcm9tIHRoZSBzaXplcyBvZiB0aGUgYnVmZmVycyBpbiB0aGUgaW5wdXQgcGVucy4KKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9wZW5fYnVmZmVyKTogUmVtb3ZlIGFuIGluY29ycmVjdCBGSVhNRSA6KQorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX2RvX3B1bGxzKTogQWRkIGFuIG5mcmFtZXMgYXJndW1lbnQsIGFuZCB1c2UKKwkgIGl0IGluc3RlYWQgb2YgYnVmZmVyX2ZyYW1lcy4KKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9nZXRyYW5nZSk6IFJlZmNvdW50IGZpeGVuLCBwYXNzIG5mcmFtZXMgb24KKwkgIHRvIGRvX3B1bGxzLgorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX2NoYWluKQorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX3NpbmtfYWN0aXZhdGVfcHVzaCkKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9zcmNfYWN0aXZhdGVfcHVsbCk6ICBSZWZjb3VudCBmaXhlbi4KKwkgICogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuaDogTm8gbW9yZSBidWZmZXJfZnJhbWVzLCB5YXkuCisKKzIwMDYtMDctMzEgMTk6NDQ6MTggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYzogZG9uJ3QgcXVlcnkgYnVmZmVyLWZyYW1lcyBmcm9tIGNhcHMsIGFkZCBsb3RzIG9mIGRlYnVnLWxvZywgdHJ5IGZpeCBmb3IgYXNzZXJ0ICgjMzQ5Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYzogKGdzdF9zaWduYWxfcHJvY2Vzc29yX3NldGNhcHMpLAorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX3Byb2Nlc3MpOgorCSAgZG9uJ3QgcXVlcnkgYnVmZmVyLWZyYW1lcyBmcm9tIGNhcHMsIGFkZCBsb3RzIG9mIGRlYnVnLWxvZywKKwkgIHRyeSBmaXggZm9yIGFzc2VydCAoIzM0OTE4OSkKKworMjAwNi0wNy0zMSAxNTo1ODo0MyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3VkcC9nc3R1ZHBzcmMuYzogRml4IGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIEZpeCBkb2NzLgorCisyMDA2LTA3LTI5IDE2OjMyOjI2ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmM6IEFkZCBkZWJ1Z3MgbG9ncyBoZXJlIGFuZCB0aGVyZSwgYWRkIG1vcmUgZXJyb3IgaGFuZGxpbmcsIGFkZCBzb21lCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYzoKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9hZGRfcGFkX2Zyb21fdGVtcGxhdGUpLAorCSAgKGdzdF9zaWduYWxfcHJvY2Vzc29yX2luaXQpLCAoZ3N0X3NpZ25hbF9wcm9jZXNzb3Jfc2V0Y2FwcyksCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfcHJvY2VzcyksIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9wZW5fYnVmZmVyKSwKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9kb19wdWxscyksIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9nZXRyYW5nZSksCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3Jfc2lua19hY3RpdmF0ZV9wdXNoKSwKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9zcmNfYWN0aXZhdGVfcHVsbCksCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfY2hhbmdlX3N0YXRlKToKKwkgIEFkZCBkZWJ1Z3MgbG9ncyBoZXJlIGFuZCB0aGVyZSwgYWRkIG1vcmUgZXJyb3IgaGFuZGxpbmcsIGFkZCBzb21lCisJICBGSVhNRSBjb21tZW50cywgZmlsZWQgIzM0OTE4OQorCisyMDA2LTA3LTI5IDExOjIyOjQ3ICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBleHQvanBlZy9nc3RzbW9rZWVuYy5jOiBTZXQgY2FwcyBvbiBidWZmZXIgY29ycmVjdGx5LiAgRml4ZXMgYnVnICMzNDkxNTUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDctMjkgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKwkgICogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzogKGdzdF9zbW9rZWVuY19nZXRjYXBzKSwKKwkgIChnc3Rfc21va2VlbmNfc2V0Y2FwcyksIChnc3Rfc21va2VlbmNfY2hhaW4pOgorCSAgU2V0IGNhcHMgb24gYnVmZmVyIGNvcnJlY3RseS4gIEZpeGVzIGJ1ZyAjMzQ5MTU1LgorCisyMDA2LTA3LTI4IDE2OjE3OjE3ICswMDAwICBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisKKwkgIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzogVXNlcyBHc3RBZGFwdGVyIGluc3RlYWQgb2Ygb3duIGJ1ZmZlcmluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFNqb2VyZCBTaW1vbnMgPHNqb2VyZCBhdCBsdW9uIGRvdCBuZXQ+CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzogKGdzdF9tdWx0aXBhcnRfZGVtdXhfYmFzZV9pbml0KSwKKwkgIChnc3RfbXVsdGlwYXJ0X2RlbXV4X2NsYXNzX2luaXQpLCAoZ3N0X211bHRpcGFydF9kZW11eF9pbml0KSwKKwkgIChnc3RfbXVsdGlwYXJ0X2RlbXV4X2ZpbmFsaXplKSwgKGdldF9saW5lX2VuZCksCisJICAobXVsdGlwYXJ0X3BhcnNlX2hlYWRlciksIChtdWx0aXBhcnRfZmluZF9ib3VuZGFyeSksCisJICAoZ3N0X211bHRpcGFydF9kZW11eF9jaGFpbiksIChnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X211bHRpcGFydF9zZXRfcHJvcGVydHkpLCAoZ3N0X211bHRpcGFydF9nZXRfcHJvcGVydHkpOgorCSAgVXNlcyBHc3RBZGFwdGVyIGluc3RlYWQgb2Ygb3duIGJ1ZmZlcmluZy4KKwkgIEFjdHVhbGx5IHBhcnNlcyB0aGUgbWltZS10eXBlIGNvcnJlY3RseSAoSW4gdGVzdHMgdGhlIG1pbWUtdHlwZSB3YXMKKwkgIGFsd2F5cyAiIiB3aXRoIHRoZSBvbGQgdmVyc2lvbikuCisJICBVc2VzIHRoZSBDb250ZW50LWxlbmd0aCBoZWFkZXIgaWYgYXZhaWxhYmxlIHRvIHNwZWVkIHVwIHRoaW5ncy4KKwkgIFJlbGlhYmx5IGF1dG9zY2FucyB0aGUgYm91bmRhcnkgbmFtZSBieSBkZWZhdWx0LgorCSAgRml4ZXMgIzM0OTA2OC4KKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogKGdzdF9tdWx0aXBhcnRfbXV4X2NvbGxlY3RlZCk6CisJICBEb24ndCBzdGFydCB0aGUgc3RyZWFtIHdpdGggYSBcbi4KKworMjAwNi0wNy0yOCAwODozMjo0NyArMDAwMCAgQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbkBzdW4uY29tPgorCisJICBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuYzogT3BlbiBzb3VyY2Ugd2l0aCBPX05PTkJMT0NLICgjMzQ5MDE1KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEJyaWFuIENhbWVyb24gPGJyaWFuIGRvdCBjYW1lcm9uIGF0IHN1biBjb20+CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOiAoZ3N0X3N1bmF1ZGlvc3JjX29wZW4pOgorCSAgT3BlbiBzb3VyY2Ugd2l0aCBPX05PTkJMT0NLICgjMzQ5MDE1KS4KKworMjAwNi0wNy0yOCAwODoyMToyNyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4Lio6IFdoaXRlc3BhY2UgZml4ZXMgYW5kIG1vcmUgZGVidWcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9tYXNzYWdlX2luZGV4KToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgV2hpdGVzcGFjZSBmaXhlcyBhbmQgbW9yZSBkZWJ1ZworCisyMDA2LTA3LTI3IDExOjIxOjUzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6IEdldCByaWQgb2Ygb2xkIGFuZCB1bnVzZWQgbWFnaWMgc291bmQtc2VydmVyIHByb3BlcnRpZXMgc3R1ZmYuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfY3JlYXRlX2VsZW1lbnRfd2l0aF9wcmV0dHlfbmFtZSksCisJICAoZ3N0X2F1dG9fYXVkaW9fc2lua19maW5kX2Jlc3QpLAorCSAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfY2hhbmdlX3N0YXRlKToKKwkgIEdldCByaWQgb2Ygb2xkIGFuZCB1bnVzZWQgbWFnaWMgc291bmQtc2VydmVyIHByb3BlcnRpZXMgc3R1ZmYuCisJICBBZGQgc3VmZml4IHRvIGNoaWxkIHNpbmsncyBuYW1lIHRoYXQgbWFrZXMgaXQgZWFzeSB0byBzZWUgZnJvbQorCSAgdGhlIG5hbWUgYWxvbmUgd2hpY2ggdHlwZSBpdCBhY3R1YWxseSBpcyAoYWxzYSwgb3NzLCBlc2QsIGV0Yy4pLgorCisyMDA2LTA3LTI3IDEwOjA1OjI3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy4qOiBSZW5hbWUgImJ1ZmZlciIgdG8gImJ1ZmZlci1zaXplIiB0byBtYWtlIGNsZWFyIGl0IGlzIGEgc2l6ZSB3ZSBzZXQgYW5kIG5vdCBzb21lIHNvcnQgb2YgZmVhdHVyZSAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwgKGdzdF91ZHBzcmNfaW5pdCksCisJICAoZ3N0X3VkcHNyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3VkcHNyY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF91ZHBzcmNfc3RhcnQpOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgUmVuYW1lICJidWZmZXIiIHRvICJidWZmZXItc2l6ZSIgdG8gbWFrZSBjbGVhciBpdCBpcyBhIHNpemUgd2Ugc2V0IGFuZAorCSAgbm90IHNvbWUgc29ydCBvZiBmZWF0dXJlIHdlIGVuYWJsZS4KKworMjAwNi0wNy0yNyAxMDowMTo0OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3VkcC9nc3R1ZHBzcmMuYzogVXNlIENMT1NFX1NPQ0tFVCgpIGhlcmUgaW5zdGVhZCBvZiBjbG9zZSgpIHRvIG1haW50YWluIHdpbjMyIHdvcmtpbmVzcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19zdGFydCk6CisJICBVc2UgQ0xPU0VfU09DS0VUKCkgaGVyZSBpbnN0ZWFkIG9mIGNsb3NlKCkgdG8gbWFpbnRhaW4KKwkgIHdpbjMyIHdvcmtpbmVzcy4KKworMjAwNi0wNy0yNyAwOTowNDo1MSArMDAwMCAgVGhpanMgVmVybWVpciA8dGhpanMudmVybWVpckBiYXJjby5jb20+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLio6IEFkZGVkICJidWZmZXIiIHByb3BlcnR5IHRvIGNvbnRyb2wgdGhlIGtlcm5lbCByZWNlaXZlIGJ1ZmZlciBzaXplLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogVGhpanMgVmVybWVpciA8dGhpanMgZG90IHZlcm1laXIgYXQgYmFyY28gZG90IGNvbT4KKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfY2xhc3NfaW5pdCksIChnc3RfdWRwc3JjX2luaXQpLAorCSAgKGdzdF91ZHBzcmNfY3JlYXRlKSwgKGdzdF91ZHBzcmNfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfdWRwc3JjX2dldF9wcm9wZXJ0eSksIChnc3RfdWRwc3JjX3N0YXJ0KToKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkgIEFkZGVkICJidWZmZXIiIHByb3BlcnR5IHRvIGNvbnRyb2wgdGhlIGtlcm5lbCByZWNlaXZlIGJ1ZmZlciBzaXplLgorCSAgVXBkYXRlIGRvY3VtZW50YXRpb24uCisJICBTbWFsbCBjbGVhbnVwcy4gRml4ZXMgIzM0ODc1Mi4KKwkgIEFQSTogYnVmZmVyIHByb3BlcnR5CisKKzIwMDYtMDctMjYgMTY6MzY6NTkgKzAwMDAgIEthaSBWZWhtYW5lbiA8a3YyMDA0QGVjYS5jeD4KKworCSAgZ3N0L3J0cC86IEZpeCB0aW1lc3RhbXAgY2FsY3VsYXRpb24gb24gb3V0Z29pbmcgUlRQIHBhY2tldHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBLYWkgVmVobWFuZW4gPGt2MjAwNCBhdCBlY2EgZG90IGN4PgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYzogKGdzdF9ydHBfcGNtYV9wYXlfZmx1c2gpLAorCSAgKGdzdF9ydHBfcGNtYV9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOiAoZ3N0X3J0cF9wY211X3BheV9mbHVzaCksCisJICAoZ3N0X3J0cF9wY211X3BheV9oYW5kbGVfYnVmZmVyKToKKwkgIEZpeCB0aW1lc3RhbXAgY2FsY3VsYXRpb24gb24gb3V0Z29pbmcgUlRQIHBhY2tldHMuCisJICBGaXhlcyAjMzQ4Njc1LgorCisyMDA2LTA3LTI2IDEwOjA3OjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOiBpcyBzdGlsbCBzdWItb3B0aW1hbCB0aG91Z2gsIHNpbmNlIHdlIGRvbid0IHJldGFpbiBvciBleHRyYWN0IHRoZSBjb21tZW50IGRlc2NyaXB0aW9ucyBwcm8uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSAgRml4IHdyaXRpbmcgb2YgY29tbWVudCBmcmFtZXMgKHNob3VsZCBiZSBDT01NIG5vdCBUQ09NKSwKKwkgIGlzIHN0aWxsIHN1Yi1vcHRpbWFsIHRob3VnaCwgc2luY2Ugd2UgZG9uJ3QgcmV0YWluIG9yCisJICBleHRyYWN0IHRoZSBjb21tZW50IGRlc2NyaXB0aW9ucyBwcm9wZXJseSAoIzMzNDM3NSwKKwkgIGFsc28gc2VlICMzMzQzNzUpLgorCisyMDA2LTA3LTI2IDA5OjAyOjU2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogI2RlZmluZSAnZmFjdCcgUklGRiBjaHVuayBpZiB3ZSBhcmUgbm90IGNvbXBpbGluZyBhZ2FpbnN0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICAjZGVmaW5lICdmYWN0JyBSSUZGIGNodW5rIGlmIHdlIGFyZSBub3QgY29tcGlsaW5nIGFnYWluc3QKKwkgIC1iYXNlIENWUyAod2UgZG9uJ3Qgd2FudCB0byBkZXBlbmQgb24gLWJhc2UgQ1ZTIGZvciB0aGlzCisJICBvbmUgZGVmaW5lIG9ubHksIGFuZCBhbHNvIG5vdCBmb3IgcmVsZWFzZSBvcmRlciByZWFzb25zKS4KKworMjAwNi0wNy0yNiAwODoxNzo0NSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzogSGFuZGxlIG11bHRpcGxlIHRhZ3Mgb2YgdGhlIHNhbWUgdHlwZSBwcm9wZXJseS4gUmUtaW5qZWN0IHVucGFyc2VkIElEM3YyIGZyYW1lcyB0aGF0IHdlIGdlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkgIEhhbmRsZSBtdWx0aXBsZSB0YWdzIG9mIHRoZSBzYW1lIHR5cGUgcHJvcGVybHkuIFJlLWluamVjdAorCSAgdW5wYXJzZWQgSUQzdjIgZnJhbWVzIHRoYXQgd2UgZ2V0IGFzIGJpbmFyeSBibG9icyBmcm9tCisJICBpZDNkZW11eCBpbnRvIHRoZSB0YWcgYWdhaW4gc28gd2UgZG9uJ3QgbG9zZSBpbmZvcm1hdGlvbgorCSAgd2hlbiByZXRhZ2dpbmcgKCMzMzQzNzUpLgorCisyMDA2LTA3LTI1IDE3OjU0OjI1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiBEb2N1bWVudCBuZXdseS1hZGRlZCBwcm9wZXJ0aWVzIHByb3Blcmx5LCBzbyB0aGF0IHRoZXJlIGlzIGEgJ1NpbmNlOiAwLjEwLjQnIGluIHRoZSBwbHVnaW4uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiAoZ3N0X3hpbWFnZV9zcmNfY2xhc3NfaW5pdCk6CisJICBEb2N1bWVudCBuZXdseS1hZGRlZCBwcm9wZXJ0aWVzIHByb3Blcmx5LCBzbyB0aGF0IHRoZXJlIGlzIGEKKwkgICdTaW5jZTogMC4xMC40JyBpbiB0aGUgcGx1Z2luIGRvY3MuIENvbnZlcnQgc29tZSBwcm9wZXJ0eQorCSAgbmFtZXMgaW50byBjYW5vbmljYWwgR09iamVjdCBzdHlsZSAoR09iamVjdCB3aWxsIGRvIHRoYXQKKwkgIGludGVybmFsbHkgYW55d2F5KS4KKworMjAwNi0wNy0yNSAxNjo0NzowNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogRXh0cmFjdCBmcmFtZXMgZm9yIElEM3YyIHZlcnNpb25zIHByaW9yIHRvIElEM3YyLjMuMCBwcm9wZXJseSBhcyB3ZWxsLCBhbmQgYWRkIHRoZSB2ZXJzaW9uIHRvLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzoKKwkgIChpZDNkZW11eF9hZGRfaWQzdjJfZnJhbWVfYmxvYl90b190YWdsaXN0KToKKwkgIEV4dHJhY3QgZnJhbWVzIGZvciBJRDN2MiB2ZXJzaW9ucyBwcmlvciB0byBJRDN2Mi4zLjAgcHJvcGVybHkgYXMKKwkgIHdlbGwsIGFuZCBhZGQgdGhlIHZlcnNpb24gdG8gdGhlIGJsb2IncyBidWZmZXIgY2Fwcywgc2luY2UgdGhhdAorCSAgaW5mb3JtYXRpb24gd2lsbCBiZSBuZWVkZWQgZm9yIGRlc2VyaWFsaXNhdGlvbiBsYXRlciBvbiAoIzM0ODY0NCkuCisKKzIwMDYtMDctMjUgMTM6MTQ6MDUgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBNb3ZlZCB3aW4zMiB2YXJpYW50IG9mIEdTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gdG8gZ3N0aW5mby5oLiBGaXhlZCBpbmRlbnRhdGlvbiBhbmQgc3BhY2luZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3JlYWRfc3ViaW5kZXhlcyksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0pOgorCSAgTW92ZWQgd2luMzIgdmFyaWFudCBvZiBHU1RfREVCVUdfQ0FURUdPUllfRVhURVJOIHRvIGdzdGluZm8uaC4gRml4ZWQKKwkgIGluZGVudGF0aW9uIGFuZCBzcGFjaW5nLgorCisyMDA2LTA3LTI0IDIxOjQzOjA2ICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkgIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuKjogQWRkIGFuIGF0dGVudWF0aW9uIHByb3BlcnR5IHRoYXQgd2lsbCBkaXJlY3RseSBhdHRlbnVhdGUgdGhlIGRpcmVjdHNvdW5kIGJ1ZmZlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmg6CisJICAqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuYzoKKwkgIEFkZCBhbiBhdHRlbnVhdGlvbiBwcm9wZXJ0eSB0aGF0IHdpbGwgZGlyZWN0bHkgYXR0ZW51YXRlIHRoZQorCSAgZGlyZWN0c291bmQgYnVmZmVyLgorCSAgQ2hhbmdlIHRoZSBzaXplIG9mIHRoZSBkaXJlY3Rzb3VuZCBzZWNvbmRhcnkgYnVmZmVyIHRvIGEgaGFsZiBzZWNvbmQuCisJICBBZGQgbW9yZSBkZWJ1ZyBsb2dzLgorCSAgQWRkIGEgbG9jayB0byBwcm90ZWN0IGRzb3VuZCBidWZmZXIgd3JpdGUgYWNjZXNzLgorCSAgRml4IGEgYmFkIGltcGxlbWVudGF0aW9uIG9mIHJlc2V0LgorCSAgKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkgICogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdGRyYXdzaW5rLmg6CisJICBBZGQgYSBrZWVwX2FzcGVjdF9yYXRpbyBwcm9wZXJ0eS4KKwkgIERvIG5vdCB1c2Ugb3ZlcmxheSBpZiBub3Qgc3VwcG9ydGVkLgorCSAgQWRkIG1vcmUgZGVidWcgbG9ncy4KKwkgIFJlbW92ZSBvdmVyd3JpdGUgb2YgV01fRVJBU0VCS0dORCBtZXNzYWdlIGhhbmRsaW5nLiBJdCB3YXMgbm90CisJICByZWRyYXdpbmcgYm9yZGVyIHdoZW4ga2VlcF9hc3BlY3RfcmF0aW8gd2FzIGVuYWJsZWQuCisJICAqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIHVwZGF0ZSB2ZXJzaW9uIHdhaXRpbmcgYW4gYXV0by1nZW5lcmF0ZWQgY29uZmlnLmgKKworMjAwNi0wNy0yNCAxNToyNTo0OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogVXBkYXRlIGZpbGVzIHRvIENWUy9QcmVyZWxlYXNlIHZlcnNpb24sIGFkZCBlc2RzaW5rIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbm5vZGV4LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkaW8ueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pZDNkZW11eC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9iYWxhbmNlLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sOgorCSAgVXBkYXRlIGZpbGVzIHRvIENWUy9QcmVyZWxlYXNlIHZlcnNpb24sIGFkZCBlc2RzaW5rIGRvY3MuCisJICAqIGV4dC9lc2QvZXNkc2luay5jOgorCSAgQWRkIGd0ay1kb2MgYmx1cmIuCisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSAgRml4IHR5cG8gaW4gZWxlbWVudCBkZXNjcmlwdGlvbi4KKworMjAwNi0wNy0yNCAxNDo1NDowNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSogQ2hhbmdlTG9nOgorCSAgQ2hhbmdlTG9nIHN1cmdlcnk6IGZpeCBTdGVmYW4ncyBlLW1haWwgYWRkcmVzcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBDaGFuZ2VMb2cgc3VyZ2VyeTogZml4IFN0ZWZhbidzIGUtbWFpbCBhZGRyZXNzCisKKzIwMDYtMDctMjQgMTQ6NDk6MTkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9lc2QvZXNkc2luay5jOiBQcmV2ZW50IGxpYmVzZCBmcm9tIGF1dG8tc3Bhd25pbmcgYSBzb3VuZCBkYWVtb24gaWYgaXQgaXMgbm90IGFscmVhZHkgcnVubmluZy4gTm93IHRoYXQgd2UgZG9uJ3QgZC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfb3BlbiksCisJICAoZ3N0X2VzZHNpbmtfZmFjdG9yeV9pbml0KToKKwkgIFByZXZlbnQgbGliZXNkIGZyb20gYXV0by1zcGF3bmluZyBhIHNvdW5kIGRhZW1vbiBpZiBpdAorCSAgaXMgbm90IGFscmVhZHkgcnVubmluZy4gTm93IHRoYXQgd2UgZG9uJ3QgZG8gZXZpbCBzdHVmZgorCSAgbGlrZSB0aGF0IGFueSBsb25nZXIgd2UgY2FuIGdpdmUgZXNkc2luayBhIHJhbmsgc28gdGhhdAorCSAgYXV0b2F1ZGlvc2luayB3aWxsIHRyeSBpdCBhcyB3ZWxsIGlmIGFsbCBvdGhlciBhdWRpbworCSAgc2lua3MgZmFpbCAoIzM0MzA1MSkuCisKKzIwMDYtMDctMjQgMTQ6NDI6MTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9lc2QvTWFrZWZpbGUuYW06IE9vcHMsIG5lZWQgdG8gcmVtb3ZlIFJFQURNRSBmcm9tIEVYVFJBX0RJU1QgYXMgd2VsbC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZXNkL01ha2VmaWxlLmFtOgorCSAgT29wcywgbmVlZCB0byByZW1vdmUgUkVBRE1FIGZyb20gRVhUUkFfRElTVCBhcyB3ZWxsLgorCisyMDA2LTA3LTI0IDE0OjM3OjM2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZXNkL1JFQURNRTogUmVtb3ZlLCBpdCBjb250YWlucyBub3RoaW5nIHVzZWZ1bCBhbnl3YXkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2VzZC9SRUFETUU6CisJICBSZW1vdmUsIGl0IGNvbnRhaW5zIG5vdGhpbmcgdXNlZnVsIGFueXdheS4KKwkgICogZXh0L2VzZC9lc2RzaW5rLmM6IChnc3RfZXNkc2lua19pbml0KSwgKGdzdF9lc2RzaW5rX3ByZXBhcmUpLAorCSAgKGdzdF9lc2RzaW5rX2RlbGF5KToKKwkgIFNvbWUgc21hbGwgY2xlYW4tdXBzOyB1c2UgR1NUX0JPSUxFUlBMQVRFIGV0Yy4KKworMjAwNi0wNy0yNCAxNDoxNjowNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2xhdy86IEZpeCBuZWdvdGlhdGlvbiB0byBkZWFsIHdpdGggQU5ZL0VNUFRZIGNhcHMgaW5zdGVhZCBvZiBsZWFraW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzogKGFsYXdkZWNfZ2V0Y2Fwcyk6CisJICAqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzogKGFsYXdlbmNfZ2V0Y2FwcyksIChnc3RfYWxhd2VuY19jaGFpbik6CisJICAqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6IChtdWxhd2RlY19nZXRjYXBzKToKKwkgICogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzogKG11bGF3ZW5jX2dldGNhcHMpOgorCSAgRml4IG5lZ290aWF0aW9uIHRvIGRlYWwgd2l0aCBBTlkvRU1QVFkgY2FwcyBpbnN0ZWFkIG9mIGxlYWtpbmcuCisKKzIwMDYtMDctMjQgMTM6NDA6NTYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLio6IFVzZSBpbmZvcm1hdGlvbiBmcm9tICdmYWN0JyBjaHVuayBmb3IgbGVuZ3RoIGNhbGN1bGF0aW9uIG9mIGNvbXByZXNzZWQgc2FtcGxlcy4gQ2FsY3VsYXRlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcmVzZXQpLAorCSAgKGdzdF93YXZwYXJzZV9vdGhlciksIChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKSwKKwkgIChnc3Rfd2F2cGFyc2VfZ2V0X3Vwc3RyZWFtX3NpemUpLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwKKwkgIChnc3Rfd2F2cGFyc2VfYWRkX3NyY19wYWQpLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKSwKKwkgIChnc3Rfd2F2cGFyc2VfcGFkX3F1ZXJ5KToKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICBVc2UgaW5mb3JtYXRpb24gZnJvbSAnZmFjdCcgY2h1bmsgZm9yIGxlbmd0aCBjYWxjdWxhdGlvbiBvZiBjb21wcmVzc2VkCisJICBzYW1wbGVzLiBDYWxjdWxhdGUgYnBzIGlmIGJvZ3VzIHZhbHVlIGlzIGZvdW5kIGluIHdhdiBoZWFkZXIgKGVtYmVkZWQKKwkgIG1wMi9tcDMpLgorCisyMDA2LTA3LTI0IDExOjQ4OjAzICswMDAwICBKb25pIFZhbHRhbmVuIDxqb25pLnZhbHRhbmVuQG1vdmlhbC5maT4KKworCSAgUG9ydCB1ZHAgcGx1Z2luIHRvIHdpbjMyICgjMzQ1Mjg4KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQmFzZWQgb24gcGF0Y2ggYnk6IEpvbmkgVmFsdGFuZW4gIDxqb25pIGRvdCB2YWx0YW5lbiBhdCBtb3ZpYWwgZmk+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6IChnc3RfZHludWRwc2lua19pbml0KSwKKwkgIChnc3RfZHludWRwc2lua19maW5hbGl6ZSksIChnc3RfZHludWRwc2lua19jbG9zZSk6CisJICAqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5oOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19pbml0KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX2ZpbmFsaXplKSwgKGdzdF9tdWx0aXVkcHNpbmtfY2xvc2UpOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgKiBnc3QvdWRwL2dzdHVkcC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNpbmsuaDoKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfaW5pdCksIChnc3RfdWRwc3JjX2NyZWF0ZSksCisJICAoZ3N0X3VkcHNyY19zdGFydCksIChnc3RfdWRwc3JjX3N0b3ApOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgKiBnc3QvdWRwL2dzdHVkcG5ldHV0aWxzLmM6IChnc3RfdWRwX25ldF91dGlsc193aW4zMl9pbmV0X2F0b24pLAorCSAgKGdzdF91ZHBfbmV0X3V0aWxzX3dpbjMyX3dzYV9zdGFydHVwKToKKwkgICogZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5oOgorCSAgUG9ydCB1ZHAgcGx1Z2luIHRvIHdpbjMyICgjMzQ1Mjg4KS4KKworMjAwNi0wNy0yNCAxMTowMDozNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogUmVtb3ZlIHVud2FudGVkIERFQlVHIGxpbmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJ0c3BfY29ubmVjdGlvbl9zZW5kKToKKwkgIFJlbW92ZSB1bndhbnRlZCBERUJVRyBsaW5lLgorCisyMDA2LTA3LTIzIDExOjMzOjU0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvaWQzZGVtdXgvOiBPbiBzZWNvbmQgdGhvdWdodCwgaXQgbWlnaHQgYmUgd2lzZXIgYW5kIG1vcmUgZWZmaWNpZW50IG5vdCB0byBkbyB0YWcgcmVnaXN0cmF0aW9uIGZyb20gYSBzdHJlYW1pbmcgdGguLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzoKKwkgIChpZDNkZW11eF9hZGRfaWQzdjJfZnJhbWVfYmxvYl90b190YWdsaXN0KToKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuaDoKKwkgIE9uIHNlY29uZCB0aG91Z2h0LCBpdCBtaWdodCBiZSB3aXNlciBhbmQgbW9yZSBlZmZpY2llbnQKKwkgIG5vdCB0byBkbyB0YWcgcmVnaXN0cmF0aW9uIGZyb20gYSBzdHJlYW1pbmcgdGhyZWFkLgorCisyMDA2LTA3LTIzIDEwOjU2OjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOiBQdXQgSUQzdjIgZnJhbWVzIHdlIGNhbid0IHBhcnNlIGFzIGJpbmFyeSBibG9icyBpbnRvIHByaXZhdGUgdGFncywgc28gdGhhdCB0aGV5IGFyZSBub3QgbG9zdCAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOgorCSAgKGlkM2RlbXV4X2FkZF9pZDN2Ml9mcmFtZV9ibG9iX3RvX3RhZ2xpc3QpLAorCSAgKGlkM2RlbXV4X2lkM3YyX2ZyYW1lc190b190YWdfbGlzdCk6CisJICBQdXQgSUQzdjIgZnJhbWVzIHdlIGNhbid0IHBhcnNlIGFzIGJpbmFyeSBibG9icyBpbnRvIHByaXZhdGUKKwkgIHRhZ3MsIHNvIHRoYXQgdGhleSBhcmUgbm90IGxvc3Qgd2hlbiByZXRhZ2dpbmcsIGF0IGxlYXN0IG9uY2UKKwkgIGlkM3YybXV4IGhhcyBiZWVuIHRhdWdodCB0byByZS1pbmplY3QgdGhvc2UgZnJhbWVzIGFnYWluLgorCSAgU2VlIGJ1ZyAjMzM0Mzc1LgorCisyMDA2LTA3LTIxIDEwOjU3OjAwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IEZpeCBzb21lIGxlYWtzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwKKwkgIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSk6CisJICBGaXggc29tZSBsZWFrcy4KKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogKGlkM2RlbXV4X2lkM3YyX2ZyYW1lc190b190YWdfbGlzdCk6CisJICBEb24ndCB1c2UgXG4gaW4gZGVidWcgbGluZXMuCisKKzIwMDYtMDctMjAgMTg6NDg6MzIgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogQWRkIGFubm9kZXggYW5kIGljeWRlbXV4LCBjbGVhbnVwIHRoZSBzZWN0aW9ucyBhIGJpdAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgIEFkZCBhbm5vZGV4IGFuZCBpY3lkZW11eCwgY2xlYW51cCB0aGUgc2VjdGlvbnMgYSBiaXQKKworMjAwNi0wNy0xOSAxNDozNjowMCArMDAwMCAgTWFydGluIFN6dWxlY2tpIDxjb21waXpAc3VraW1hc2hpdGEuY29tPgorCisJICBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6IElmICJkZXZpY2UtbmFtZSIgaXMgcmVxdWVzdGVkIGFuZCB0aGUgZGV2aWNlIGlzIG5vdCBvcGVuLCB0cnkgdG8gdGVtcG9yYXJpbHkgb3BlbiBpdCB0byBvYnQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE1hcnRpbiBTenVsZWNraQorCSAgKiBzeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmM6IChnc3RfdjRsMl9vYmplY3RfZ2V0X3Byb3BlcnR5X2hlbHBlcik6CisJICBJZiAiZGV2aWNlLW5hbWUiIGlzIHJlcXVlc3RlZCBhbmQgdGhlIGRldmljZSBpcyBub3QKKwkgIG9wZW4sIHRyeSB0byB0ZW1wb3JhcmlseSBvcGVuIGl0IHRvIG9idGFpbiB0aGlzCisJICBpbmZvcm1hdGlvbiAoIzM0MjQ5NCkuCisKKzIwMDYtMDctMTkgMTE6NTI6NTMgKzAwMDAgIEFsZXggTGFuY2FzdGVyIDxhbGV4bEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6IFdyaXRlIEdTVF9UQUdfRU5DT0RFUiBhbmQgR1NUX1RBR19FTkNPREVSX1ZFUlNJT04gYXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEFsZXggTGFuY2FzdGVyIDxhbGV4bCBhdCB1c2VycyBzb3VyY2Vmb3JnZSBuZXQ+CisJICAqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJICBXcml0ZSBHU1RfVEFHX0VOQ09ERVIgYW5kIEdTVF9UQUdfRU5DT0RFUl9WRVJTSU9OIGFzCisJICBJRDN2MiBUU1NFIGZyYW1lcyAoIzM0Nzg5OCkuCisKKzIwMDYtMDctMTkgMDc6NDA6NTIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkqIENoYW5nZUxvZzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5OiBtZW50aW9uIGZpeGVkIGJ1ZworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBDaGFuZ2VMb2cgc3VyZ2VyeTogbWVudGlvbiBmaXhlZCBidWcKKworMjAwNi0wNy0xOCAxOTo1OTowMSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aW11eC5jOiBSZXNwZWN0IG1wZWd2ZXJzaW9uIGZvciAidmlkZW8vbXBlZyIgYW5kIGdpdmUgbWVzc2FnZSBpbiBjYXNlIG9mIHVuaGFuZGxlZCB2ZXJzaW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aV9tdXhfdmlkc2lua19zZXRfY2Fwcyk6CisJICBSZXNwZWN0IG1wZWd2ZXJzaW9uIGZvciAidmlkZW8vbXBlZyIgYW5kIGdpdmUgbWVzc2FnZSBpbiBjYXNlIG9mCisJICB1bmhhbmRsZWQgdmVyc2lvbnMuCisKKzIwMDYtMDctMTggMTg6MDU6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogRml4IGNhcHMgYWZ0ZXIgcHJldmlvdXMgY2hhbmdlIHRvIGJ5dGUgb3JkZXIgZW5kaWFubmVzcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfY2hhaW4pOgorCSAgRml4IGNhcHMgYWZ0ZXIgcHJldmlvdXMgY2hhbmdlIHRvIGJ5dGUgb3JkZXIgZW5kaWFubmVzcy4KKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9yZXNldCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2Vfc2lua19ldmVudCksIChnc3Rfd2F2cGFja19wYXJzZV9pbml0KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9sb29wKToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmg6CisJICBRdWV1ZSBpbmNvbWluZyBldmVudHMgaWYgdGhlcmUncyBubyBzb3VyY2UgcGFkIHlldCBhbmQKKwkgIHNlbmQgdGhlbSBkb3duc3RyZWFtIGxhdGVyIHdoZW4gdGhlIHBhZCBpcyB0aGVyZS4KKworMjAwNi0wNy0xOCAxNjo0NzoyNSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy4qOiBPdXRwdXQgYXVkaW8gaW4gbmF0aXZlIGJ5dGUgb3JkZXIgKHdoaWNoIGlzIGFsc28gaG93IHdlIGdldCBzYW1wbGVzIGZyb20gd2F2cGFjayk7IG91dHB1Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX2luaXQpLAorCSAgKGdzdF93YXZwYWNrX2RlY19mb3JtYXRfc2FtcGxlcyksCisJICAoZ3N0X3dhdnBhY2tfZGVjX2NsaXBfb3V0Z29pbmdfYnVmZmVyKSwgKGdzdF93YXZwYWNrX2RlY19jaGFpbiksCisJICAoZ3N0X3dhdnBhY2tfZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaDoKKwkgIE91dHB1dCBhdWRpbyBpbiBuYXRpdmUgYnl0ZSBvcmRlciAod2hpY2ggaXMgYWxzbyBob3cgd2UgZ2V0CisJICBzYW1wbGVzIGZyb20gd2F2cGFjayk7IG91dHB1dCBzYW1wbGVzIHdpdGggMjEtMjQgYml0IGRlcHRoCisJICB3aXRoIDMyIGJpdCB3aWR0aCAobWFrZXMgdGhpbmdzIGVhc2llciBmb3IgdXMpLgorCisyMDA2LTA3LTE4IDE1OjUzOjM1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLio6IE1vcmUgY2xlYW4tdXBzOiByZW1vdmUgbW9zdCBvZiB0aGUgZGlzZnVuY3Rpb25hbCBjb3JyZWN0aW9uIHBhZCBzdHVmZiBmb3Igbm93LCBpZiBpdCBldmUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfYmFzZV9pbml0KSwKKwkgIChnc3Rfd2F2cGFja19kZWNfY2xhc3NfaW5pdCksIChnc3Rfd2F2cGFja19kZWNfaW5pdCksCisJICAoZ3N0X3dhdnBhY2tfZGVjX2ZpbmFsaXplKSwgKGdzdF93YXZwYWNrX2RlY19mb3JtYXRfc2FtcGxlcyksCisJICAoZ3N0X3dhdnBhY2tfZGVjX2NsaXBfb3V0Z29pbmdfYnVmZmVyKSwgKGdzdF93YXZwYWNrX2RlY19jaGFpbiksCisJICAoZ3N0X3dhdnBhY2tfZGVjX3NpbmtfZXZlbnQpLCAoZ3N0X3dhdnBhY2tfZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaDoKKwkgIE1vcmUgY2xlYW4tdXBzOiByZW1vdmUgbW9zdCBvZiB0aGUgZGlzZnVuY3Rpb25hbCBjb3JyZWN0aW9uCisJICBwYWQgc3R1ZmYgZm9yIG5vdywgaWYgaXQgZXZlciBnZXRzIGltcGxlbWVudGVkIGEgbG90IG9mIHN0dWZmCisJICB3aWxsIGhhdmUgdG8gYmUgcmV3cml0dGVuIGFueXdheTsgcmVkbyBjaGFpbiBmdW5jdGlvbiwgbW92ZQorCSAgZXJyb3JzIHRvIGVuZCwgZXJyb3Igb3V0IGluc3RlYWQgb2YgZ19hc3NlcnQoKWluZy4gQWxzbyByZW5hbWUKKwkgIG92ZXJseSBsb25nIHZhcmlhYmxlICd3YXZwYWNrZGVjJyB0byBqdXN0ICdkZWMnOyBtaXNjZWxsYW5lb3VzCisJICBvdGhlciBzbWFsbCBzdHVmZi4KKworMjAwNi0wNy0xOCAxNDowODowNiArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisJICBjb25maWd1cmUuYWM6IENoZWNrIGZvciB3YXZwYWNrIHZlcnNpb24gYW5kIGRlZmluZSBXQVZQQUNLX09MRF9BUEkgaWYgbmVjZXNzYXJ5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW8gYXQgY2lyY3VsYXItY2hhb3Mub3JnPgorCSAgKiBjb25maWd1cmUuYWM6CisJICBDaGVjayBmb3Igd2F2cGFjayB2ZXJzaW9uIGFuZCBkZWZpbmUgV0FWUEFDS19PTERfQVBJIGlmCisJICBuZWNlc3NhcnkuCisJICAqIGV4dC93YXZwYWNrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrY29tbW9uLmM6IChnc3Rfd2F2cGFja19yZWFkX2hlYWRlciksCisJICAoZ3N0X3dhdnBhY2tfcmVhZF9tZXRhZGF0YSk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tjb21tb24uaDoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX2Jhc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhY2tfZGVjX2NsYXNzX2luaXQpLCAoZ3N0X3dhdnBhY2tfZGVjX2luaXQpLAorCSAgKGdzdF93YXZwYWNrX2RlY19maW5hbGl6ZSksIChnc3Rfd2F2cGFja19kZWNfZm9ybWF0X3NhbXBsZXMpLAorCSAgKGdzdF93YXZwYWNrX2RlY19jbGlwX291dGdvaW5nX2J1ZmZlciksIChnc3Rfd2F2cGFja19kZWNfY2hhaW4pLAorCSAgKGdzdF93YXZwYWNrX2RlY19zaW5rX2V2ZW50KSwgKGdzdF93YXZwYWNrX2RlY19jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF93YXZwYWNrX2RlY19yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X3dhdnBhY2tfZGVjX3BsdWdpbl9pbml0KToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5oOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2luaXQpLCAoZ3N0X3dhdnBhY2tfZW5jX2ZpbmFsaXplKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfc2V0X3dwX2NvbmZpZyk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiAoZ3N0X3dhdnBhY2tfcGFyc2VfYmFzZV9pbml0KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9maW5hbGl6ZSksIChnc3Rfd2F2cGFja19wYXJzZV9jbGFzc19pbml0KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9pbmRleF9nZXRfZW50cnlfZnJvbV9zYW1wbGUpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX3NjYW5fdG9fZmluZF9zYW1wbGUpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2hhbmRsZV9zZWVrX2V2ZW50KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9jcmVhdGVfc3JjX3BhZCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuYzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3N0cmVhbXJlYWRlci5oOgorCSAgUG9ydCB0byBuZXcvb2ZmaWNpYWwgd2F2cGFjayBBUEksIGRvbid0IHVzZSBBUEkgdGhhdCB3YXMgZXhwb3J0ZWQKKwkgIGluIHdhdnBhY2sgaGVhZGVyIGZpbGVzIGFuZCBpbiB0aGUgbGliIGJ1dCBtZWFudCB0byBiZSBwcml2YXRlLCBhdAorCSAgbGVhc3Qgbm90IGZvciByZWNlbnQgd2F2cGFjayB2ZXJzaW9uczsgbWlzYy4gJ2NsZWFudXBzJyAoIzM0NzQ0MykuCisKKzIwMDYtMDctMTcgMTA6MjU6NTcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogU3RvcmUgZHVyYXRpb24gaW4gdWludDY0IHRvbyBpbnN0ZWFkIG9mIGNsaXBwaW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X3BlcmZvcm1fc2VlayksCisJICAoZ3N0X3F0ZGVtdXhfcHJlcGFyZV9jdXJyZW50X3NhbXBsZSksCisJICAoZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9tb3ZpZSk6CisJICBTdG9yZSBkdXJhdGlvbiBpbiB1aW50NjQgdG9vIGluc3RlYWQgb2YgY2xpcHBpbmcuCisJICBXaGVuIHdlIGRvIGEga2V5ZnJhbWUgc2VlayBhbmQgdGhlIHJlcXVlc3RlZCB0aW1lIGlzIGF0IHRoZQorCSAga2V5ZnJhbWUsIGRvbid0IHNlZWsgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBrZXlmcmFtZS4KKwkgIEZpeGVzICMzNDc0MzkuCisKKzIwMDYtMDctMTcgMTA6MjI6NTQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLio6IFVzZSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBzZWdtZW50IGluc3RlYWQgb2YgbGVha2luZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiAoZ3N0X3BuZ2RlY19pbml0KSwgKGJ1ZmZlcl9jbGlwKSwKKwkgIChnc3RfcG5nZGVjX2NhcHNfY3JlYXRlX2FuZF9zZXQpLCAoZ3N0X3BuZ2RlY190YXNrKSwKKwkgIChnc3RfcG5nZGVjX2NoYWluKSwgKGdzdF9wbmdkZWNfc2lua19ldmVudCksCisJICAoZ3N0X3BuZ2RlY19saWJwbmdfaW5pdCksIChnc3RfcG5nZGVjX2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3BuZ2RlY19zaW5rX2FjdGl2YXRlX3B1c2gpOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5oOgorCSAgVXNlIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHNlZ21lbnQgaW5zdGVhZCBvZiBsZWFraW5nLgorCSAgVmFyaW91cyBjbGVhbnVwcy4KKwkgIEZpeCBmbHVzaCBhbmQgc2VlayBoYW5kbGluZy4KKworMjAwNi0wNy0xNiAxNDozMTo0OCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEFkZGVkIHNpbXBsZSBnZW5lcmljIG1wZWc0IGRlcGF5bG9hZGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICAqIGdzdC9ydHAvZ3N0cnRwLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmM6IChnc3RfcnRwX21wNGdfZGVwYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfcnRwX21wNGdfZGVwYXlfY2xhc3NfaW5pdCksIChnc3RfcnRwX21wNGdfZGVwYXlfaW5pdCksCisJICAoZ3N0X3J0cF9tcDRnX2RlcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9tcDRnX2RlcGF5X3Byb2Nlc3MpLAorCSAgKGdzdF9ydHBfbXA0Z19kZXBheV9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfbXA0Z19kZXBheV9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBfbXA0Z19kZXBheV9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9ydHBfbXA0Z19kZXBheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOiAoZ3N0X3J0cF9tcDRnX3BheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX21wNGdfcGF5X3BhcnNlX2F1ZGlvX2NvbmZpZyksIChnc3RfcnRwX21wNGdfcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfbXA0Z19wYXlfZmx1c2gpOgorCSAgQWRkZWQgc2ltcGxlIGdlbmVyaWMgbXBlZzQgZGVwYXlsb2FkZXIuCisJICBGaXggZ2VuZXJpYyBtcGVnNCBwYXlsb2FkZXIuCisKKzIwMDYtMDctMTUgMTU6MjU6MDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogRG9uJ3QgdHJ5IGRvaW5nIHN0YXRlIGNoYW5nZXMgb24gYSBOVUxMIHBvaW50ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfc2V0X3N0YXRlKToKKwkgIERvbid0IHRyeSBkb2luZyBzdGF0ZSBjaGFuZ2VzIG9uIGEgTlVMTCBwb2ludGVyLgorCisyMDA2LTA3LTE1IDExOjUwOjI1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9zcGVjdHJ1bS86IERvIG5vdCB1c2UgZGVwcmVjYXRlZCBndGsgZnVuY3Rpb25zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOiAobWFpbik6CisJICAqIGdzdC9zcGVjdHJ1bS9kZW1vLW9zc3NyYy5jOiAobWFpbik6CisJICBEbyBub3QgdXNlIGRlcHJlY2F0ZWQgZ3RrIGZ1bmN0aW9ucy4KKworMjAwNi0wNy0xNCAxMzozMzo1NCArMDAwMCAgU2ViYXN0aWVuIENvdGUgPHNlYmFzNjQyQHlhaG9vLmNhPgorCisJICBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5Lio6IHJ0cGFtcmRlYyBpc24ndCBhIHN1YmNsYXNzIG9mIEdzdEJhc2VSdHBEZXBheWxvYWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpZW4gQ290ZSA8c2ViYXM2NDIgYXQgeWFob28gZG90IGNhPgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6IChnc3RfcnRwX2Ftcl9kZXBheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfYW1yX2RlcGF5X2NsYXNzX2luaXQpLCAoZ3N0X3J0cF9hbXJfZGVwYXlfaW5pdCksCisJICAoZ3N0X3J0cF9hbXJfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX2Ftcl9kZXBheV9wcm9jZXNzKToKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5oOgorCSAgcnRwYW1yZGVjIGlzbid0IGEgc3ViY2xhc3Mgb2YgR3N0QmFzZVJ0cERlcGF5bG9hZC4KKwkgIEZpeGVzICMzMjExOTEKKworMjAwNi0wNy0xNCAxMjowMTowNSArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSAgc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzogRml4IHNlZ2ZhdWx0IHdoZW4gbW92aW5nIG1vdXNlIHBvaW50ZXIgdG8gdGhlIGJvdHRvbSByaWdodCBjb3JuZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDctMTQgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKwkgICogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzogKGdzdF94aW1hZ2Vfc3JjX3hpbWFnZV9nZXQpLAorCSAgKGdzdF94aW1hZ2Vfc3JjX2dldF9jYXBzKSwgKGdzdF94aW1hZ2Vfc3JjX2NsYXNzX2luaXQpOgorCSAgRml4IHNlZ2ZhdWx0IHdoZW4gbW92aW5nIG1vdXNlIHBvaW50ZXIgdG8gdGhlIGJvdHRvbSByaWdodCBjb3JuZXIuCisKKzIwMDYtMDctMTMgMTU6MjI6MjAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjb21tb246CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXRkZW11eC54bWw6CisJICByZW1vdmUgc2RsdmlkZW9zaW5rIHBsdWdpbiBhbmQgdXBkYXRlIHRoZSByZXN0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbW92ZSBzZGx2aWRlb3NpbmsgcGx1Z2luIGFuZCB1cGRhdGUgdGhlIHJlc3QKKworMjAwNi0wNy0xMiAwOTozNDoxNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEFkZGVkIG1wZWcyIFRTIGRlcGF5bG9hZGVyLiBDbG9zaW5nICMzNDcyMzQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYzogKGdzdF9ydHBfbXAydF9kZXBheV9iYXNlX2luaXQpLAorCSAgKGdzdF9ydHBfbXAydF9kZXBheV9jbGFzc19pbml0KSwgKGdzdF9ydHBfbXAydF9kZXBheV9pbml0KSwKKwkgIChnc3RfcnRwX21wMnRfZGVwYXlfc2V0Y2FwcyksIChnc3RfcnRwX21wMnRfZGVwYXlfcHJvY2VzcyksCisJICAoZ3N0X3J0cF9tcDJ0X2RlcGF5X3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9tcDJ0X2RlcGF5X2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9tcDJ0X2RlcGF5X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3J0cF9tcDJ0X2RlcGF5X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuaDoKKwkgIEFkZGVkIG1wZWcyIFRTIGRlcGF5bG9hZGVyLiBDbG9zaW5nICMzNDcyMzQuCisKKzIwMDYtMDctMTIgMDk6Mjg6NDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiBGaXggdHlwbyBpbiBwcm9wZXJ0eSBuaWNrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX2NsYXNzX2luaXQpOgorCSAgRml4IHR5cG8gaW4gcHJvcGVydHkgbmljay4KKworMjAwNi0wNy0xMSAyMjo0Njo0NyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2NkaW8vZ3N0Y2Rpb2NkZGFzcmMuYzogUmVtb3ZlIGdfYXNzZXJ0IHRoYXQgc2hvdWxkbid0IGJlIHRoZXJlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9jZGlvL2dzdGNkaW9jZGRhc3JjLmM6IChnc3RfY2Rpb19jZGRhX3NyY19jbG9zZSk6CisJICBSZW1vdmUgZ19hc3NlcnQgdGhhdCBzaG91bGRuJ3QgYmUgdGhlcmUuCisKKzIwMDYtMDctMTAgMjA6MTE6MzQgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguKjogRG9uJ3QgcHVzaCB0YWcgZXZlbnRzIGZvdW5kIGJ5IGdzdF9yaWZmX3BhcnNlX2luZm8oKSBiZWZvcmUgb3V0cHV0dGluZworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcmVzZXQpLAorCSAgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlciksIChwdXNoX3RhZ19saXN0cyk6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIERvbid0IHB1c2ggdGFnIGV2ZW50cyBmb3VuZCBieSBnc3RfcmlmZl9wYXJzZV9pbmZvKCkgYmVmb3JlIG91dHB1dHRpbmcKKwkgIEdTVF9FVkVOVF9ORVdTRUdNRU5ULgorCisyMDA2LTA3LTEwIDE2OjQxOjU3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC86IHJlcGxhY2VkIGNsb3Nlc29ja2V0IGFuZCBjbG9zZSBpbiBjb2RlIHdpdGggb25lIENMT1NFX1NPQ0tFVC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJ0c3BfY29ubmVjdGlvbl9zZW5kKSwKKwkgIChydHNwX2Nvbm5lY3Rpb25fY2xvc2UpOgorCSAgKiBnc3QvcnRzcC9ydHNwZGVmcy5oOgorCSAgcmVwbGFjZWQgY2xvc2Vzb2NrZXQgYW5kIGNsb3NlIGluIGNvZGUgd2l0aCBvbmUgQ0xPU0VfU09DS0VULgorCSAgU29tZSBtb3JlIGNsZWFudXBzLiBGaXhlcyAjMzQ1MzAxLgorCisyMDA2LTA3LTEwIDE1OjI2OjM5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6IEZpeCBleGFtcGxlIHBpcGVsaW5lIGluIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSAgRml4IGV4YW1wbGUgcGlwZWxpbmUgaW4gZG9jcy4KKworMjAwNi0wNy0xMCAxNDo0OTo0NiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2ZpbHRlci86IERvbid0IGZvcmdldCBuZXcgZmlsZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ZpbHRlci9nc3RicHdzaW5jLmg6CisJICAqIGdzdC9maWx0ZXIvZ3N0aWlyLmg6CisJICAqIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy5oOgorCSAgRG9uJ3QgZm9yZ2V0IG5ldyBmaWxlcy4KKworMjAwNi0wNy0xMCAxNDo0MjoxNSArMDAwMCAgTWF0aGlzIEhvZmVyIDxtYXRoaXMuaG9mZXJAZHJlYW1sYWIubmV0PgorCisJICBQb3J0ZWQgdGhlIGdzdGZpbHRlciBwbHVnaW4gdG8gR1N0cmVhbWVyIDAuMTAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBNYXRoaXMgSG9mZXIgPG1hdGhpcyBkb3QgaG9mZXIgYXQgZHJlYW1sYWIgZG90IG5ldD4KKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvZmlsdGVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzogKGdzdF9icHdzaW5jX2Rpc3Bvc2UpLAorCSAgKGdzdF9icHdzaW5jX2Jhc2VfaW5pdCksIChnc3RfYnB3c2luY19jbGFzc19pbml0KSwKKwkgIChnc3RfYnB3c2luY19pbml0KSwgKGJwd3NpbmNfc2V0X2NhcHMpLCAoYnB3c2luY190cmFuc2Zvcm1faXApLAorCSAgKGJwd3NpbmNfc2V0X3Byb3BlcnR5KSwgKGJwd3NpbmNfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2ZpbHRlci9nc3RmaWx0ZXIuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2ZpbHRlci9nc3RmaWx0ZXIuaDoKKwkgICogZ3N0L2ZpbHRlci9nc3RpaXIuYzogKGdzdF9paXJfZGlzcG9zZSksIChnc3RfaWlyX2Jhc2VfaW5pdCksCisJICAoZ3N0X2lpcl9jbGFzc19pbml0KSwgKGdzdF9paXJfaW5pdCksIChpaXJfc2V0X2NhcHMpLAorCSAgKGlpcl90cmFuc2Zvcm1faXApLCAoaWlyX3NldF9wcm9wZXJ0eSksIChpaXJfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6IChnc3RfbHB3c2luY19kaXNwb3NlKSwKKwkgIChnc3RfbHB3c2luY19iYXNlX2luaXQpLCAoZ3N0X2xwd3NpbmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X2xwd3NpbmNfaW5pdCksIChscHdzaW5jX3NldF9jYXBzKSwgKGxwd3NpbmNfdHJhbnNmb3JtX2lwKSwKKwkgIChscHdzaW5jX3NldF9wcm9wZXJ0eSksIChscHdzaW5jX2dldF9wcm9wZXJ0eSk6CisJICBQb3J0ZWQgdGhlIGdzdGZpbHRlciBwbHVnaW4gdG8gR1N0cmVhbWVyIDAuMTAuCisKKzIwMDYtMDctMTAgMTA6MjE6NTcgKzAwMDAgIFJvYiBUYXlsb3IgPHJvYnRheWxvckBmbG9vcGlseS5vcmc+CisKKwkgIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IElmIGEgZGVzdGluYXRpb24gaXMgYWRkZWQgYmVmb3JlIHRoZSBzdHJlYW0gaXMgc2V0IHRvIFBBVVNFRCwgdGhlIG11bHRpY2FzdCBncm91cCBpcyBub3Qgai4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogUm9iIFRheWxvciA8cm9idGF5bG9yIGF0IGZsb29waWx5IGRvdCBvcmc+CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChqb2luX211bHRpY2FzdCksCisJICAoZ3N0X211bHRpdWRwc2lua19pbml0X3NlbmQpLCAoZ3N0X211bHRpdWRwc2lua19hZGQpOgorCSAgSWYgYSBkZXN0aW5hdGlvbiBpcyBhZGRlZCBiZWZvcmUgdGhlIHN0cmVhbSBpcyBzZXQgdG8gUEFVU0VELCB0aGUKKwkgIG11bHRpY2FzdCBncm91cCBpcyBub3Qgam9pbmVkIGFzIHRoZSBzb2NrZXQgaXMgbm90IGNyZWF0ZWQgeWV0LgorCSAgQWxzbyBUVEwgYW5kIExPT1Agc2hvdWxkIGFsc28gYmUgc2V0LiBGaXhlcyAjMzQ2OTIxLgorCisyMDA2LTA3LTEwIDA5OjU3OjI2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEV4dHJhY3QgY29tbWVudCBpbmZvcm1hdGlvbiEhCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV91ZHRhKToKKwkgIEV4dHJhY3QgY29tbWVudCBpbmZvcm1hdGlvbiEhCisKKzIwMDYtMDctMTAgMDk6NDY6MjUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRXh0cmFjdCB5ZWFyL2RhdGUgaW5mb3JtYXRpb24gKGZpeGVzICMzNDcwNzkpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdWR0YSksCisJICAocXRkZW11eF90YWdfYWRkX2RhdGUpOgorCSAgRXh0cmFjdCB5ZWFyL2RhdGUgaW5mb3JtYXRpb24gKGZpeGVzICMzNDcwNzkpLgorCisyMDA2LTA3LTA4IDIyOjQxOjI1ICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy4qOiBGaXggdXNlLWRhbWFnZSBwcm9wZXJ0eSB0byBhY3R1YWxseSB3b3JrIDopCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDctMDkgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKwkgICogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzogKGdzdF94aW1hZ2Vfc3JjX3hpbWFnZV9nZXQpLAorCSAgKGdzdF94aW1hZ2Vfc3JjX3NldF9wcm9wZXJ0eSksIChnc3RfeGltYWdlX3NyY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF94aW1hZ2Vfc3JjX2dldF9jYXBzKSwgKGdzdF94aW1hZ2Vfc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF94aW1hZ2Vfc3JjX2luaXQpOgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5oOgorCSAgRml4IHVzZS1kYW1hZ2UgcHJvcGVydHkgdG8gYWN0dWFsbHkgd29yayA6KQorCSAgQWRkIHN0YXJ0eCwgc3RhcnR5LCBlbmR4LCBlbmR5IHByb3BlcnRpZXMgc28gc2NyZWVuY2FzdHMgb3RoZXIgdGhhbiBmdWxsCisJICBzY3JlZW4gb25lcyBjYW4gd29yay4KKworMjAwNi0wNy0wOCAxOTowMzo1NCArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSAgc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuKjogQWRkIHVzZV9kYW1hZ2UgcHJvcGVydHkgdG8gb2ZmZXIgYWJpbGl0eSB0byBjaG9vc2Ugd2hldGhlciB0byB1c2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wNy0wOCAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiAoZ3N0X3hpbWFnZV9zcmNfeGltYWdlX2dldCksCisJICAoZ3N0X3hpbWFnZV9zcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF94aW1hZ2Vfc3JjX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3hpbWFnZV9zcmNfY2xhc3NfaW5pdCksIChnc3RfeGltYWdlX3NyY19pbml0KToKKwkgICogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuaDoKKwkgIEFkZCB1c2VfZGFtYWdlIHByb3BlcnR5IHRvIG9mZmVyIGFiaWxpdHkgdG8gY2hvb3NlIHdoZXRoZXIgdG8gdXNlCisJICBYRGFtYWdlIG9yIG5vdC4KKworMjAwNi0wNy0wNyAxNTowNDoyOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2dvb20vZmlsdGVycy5jOiBBdm9pZCBnb29tIGNvcmVkdW1waW5nIGJ5IGNsZWFyaW5nIG1lbW9yeS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS9maWx0ZXJzLmM6ICh6b29tRmlsdGVyU2V0UmVzb2x1dGlvbik6CisJICBBdm9pZCBnb29tIGNvcmVkdW1waW5nIGJ5IGNsZWFyaW5nIG1lbW9yeS4KKwkgIEZpeGVzIDM0NTY3OS4KKworMjAwNi0wNy0wNyAxNDozMDoyNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBEb24ndCBjcmFzaCBvbiB0d29zL3Nvd3QvcmF3IGF1ZGlvLiAjMzQ1ODMwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBEb24ndCBjcmFzaCBvbiB0d29zL3Nvd3QvcmF3IGF1ZGlvLiAjMzQ1ODMwLgorCisyMDA2LTA3LTA1IDIwOjIxOjAyICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkgIHdpbjMyL3ZzNi9saWJnc3RpZDNkZW11eC5kc3A6IEFkZCBhIGxpbmsgdG8gbGliZ3N0dGFnLTAuMTAubGliLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RpZDNkZW11eC5kc3A6CisJICBBZGQgYSBsaW5rIHRvIGxpYmdzdHRhZy0wLjEwLmxpYi4KKworMjAwNi0wNy0wNSAxNDo1MjoxMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0LzogRG9uJ3QgcmV0dXJuIEZMT1dfVU5FWFBFQ1RFRCB3aGVuIGEgYnVmZmVyIGlzIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbSAod2hpY2ggbWlnaHQgaGFwcGVuIHdpdGggbGFyZ2UgSUQzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FwZXRhZy9nc3R0YWdkZW11eC5jOiAoZ3N0X3RhZ19kZW11eF90cmltX2J1ZmZlciksCisJICAoZ3N0X3RhZ19kZW11eF9yZWFkX3JhbmdlKToKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfdHJpbV9idWZmZXIpLAorCSAgKGdzdF9pZDNkZW11eF9yZWFkX3JhbmdlKToKKwkgIERvbid0IHJldHVybiBGTE9XX1VORVhQRUNURUQgd2hlbiBhIGJ1ZmZlciBpcyBiZWZvcmUKKwkgIHRoZSBzdGFydCBvZiB0aGUgc3RyZWFtICh3aGljaCBtaWdodCBoYXBwZW4gd2l0aAorCSAgbGFyZ2UgSUQzdjIgdGFncyBpZiB0aGUgdGFnIHJlYWRpbmcgd2FzIGRvbmUgcHVsbHJhbmdlCisJICBiYXNlZCBhbmQgd2UgdGhlbiBzd2l0Y2hlZCB0byBwdXNoIG1vZGUgbGF0ZXIgb24pLgorCSAgRml4ZXMgcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGJ5IGNvbW1pdCBmcm9tIEp1bmUgMjl0aC4KKworMjAwNi0wNy0wNSAxMDoxNDoxNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzogTWFrZSBVVEYtOCB0aGUgZGVmYXVsdCBlbmNvZGluZyB3aGVuIHdyaXRpbmcgc3RyaW5nIHRhZ3MgKGJlZm9yZSwgb3VyIFVURi04IHN0cmluZ3Mgd291bGQgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYzoKKwkgIE1ha2UgVVRGLTggdGhlIGRlZmF1bHQgZW5jb2Rpbmcgd2hlbiB3cml0aW5nIHN0cmluZworCSAgdGFncyAoYmVmb3JlLCBvdXIgVVRGLTggc3RyaW5ncyB3b3VsZCBhdXRvbWF0aWNhbGx5CisJICBiZSBjb252ZXJ0ZWQgdG8gSVNPLTg4NTktMSBieSB0YWdsaWIgYW5kIHdyaXR0ZW4gYXMKKwkgIElTTy04ODU5LTEgZmllbGRzIGlmIHRoYXQgd2FzIHBvc3NpYmxlKS4KKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzdjJtdXguYzogKHV0Zjhfc3RyaW5nX2luX2J1ZiksCisJICAodGVzdF90YWdsaWJfaWQzbXV4X2NoZWNrX3RhZ19idWZmZXIpLCAoaWRlbnRpdHlfY2IpLAorCSAgKHRlc3RfdGFnbGliX2lkM211eF93aXRoX3RhZ3MpOgorCSAgQWRkIHRlc3QgY2FzZSB0aGF0IG1ha2VzIHN1cmUgb3VyIFVURi04IHN0cmluZ3MgaGF2ZQorCSAgYWN0dWFsbHkgYmVlbiB3cml0dGVuIGludG8gdGhlIHRhZyBhcyBVVEYtOC4KKworMjAwNi0wNy0wNCAxNjowMDoyNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBMZXQncyB0cnkgdGhhdCBhZ2Fpbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBMZXQncyB0cnkgdGhhdCBhZ2Fpbi4KKworMjAwNi0wNy0wNCAxNTo0MDo0NyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBEaXNhYmxlIG1vbm9zY29wZSBwbHVnaW4gZm9yIG5vdyB1bnRpbCBpdCBmdWxmaWxscyBhbGwgdGhlIHJlcXVpcmVtZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBEaXNhYmxlIG1vbm9zY29wZSBwbHVnaW4gZm9yIG5vdyB1bnRpbCBpdCBmdWxmaWxscworCSAgYWxsIHRoZSByZXF1aXJlbWVudHMuCisKKzIwMDYtMDctMDMgMjA6MzU6NDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFBvcnQgbW9ub3Njb3BlIHZpc3VhbGlzYXRpb24gdG8gMC4xMC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9tb25vc2NvcGUvTWFrZWZpbGUuYW06CisJICAqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6IChnc3RfbW9ub3Njb3BlX2Jhc2VfaW5pdCksCisJICAoZ3N0X21vbm9zY29wZV9jbGFzc19pbml0KSwgKGdzdF9tb25vc2NvcGVfaW5pdCksCisJICAoZ3N0X21vbm9zY29wZV9maW5hbGl6ZSksIChnc3RfbW9ub3Njb3BlX3Jlc2V0KSwKKwkgIChnc3RfbW9ub3Njb3BlX3Npbmtfc2V0Y2FwcyksIChnc3RfbW9ub3Njb3BlX3NyY19zZXRjYXBzKSwKKwkgIChnc3RfbW9ub3Njb3BlX3NyY19uZWdvdGlhdGUpLCAoZ2V0X2J1ZmZlciksIChnc3RfbW9ub3Njb3BlX2NoYWluKSwKKwkgIChnc3RfbW9ub3Njb3BlX3NpbmtfZXZlbnQpLCAoZ3N0X21vbm9zY29wZV9zcmNfZXZlbnQpLAorCSAgKGdzdF9tb25vc2NvcGVfY2hhbmdlX3N0YXRlKSwgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuaDoKKwkgIFBvcnQgbW9ub3Njb3BlIHZpc3VhbGlzYXRpb24gdG8gMC4xMC4KKworMjAwNi0wNy0wMyAyMDowMjo1NiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBGaXggc2lsbHkgY3Jhc2hlciBpbiBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb247IGFkZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9oZWFkZXIpLCAocXRkZW11eF92aWRlb19jYXBzKToKKwkgIEZpeCBzaWxseSBjcmFzaGVyIGluIHN0YXRlIGNoYW5nZSBmdW5jdGlvbjsgYWRkCisJICBJVjQxIGZvdXJjYyAoc2VlIGJ1ZyAjMTcxMTExKTsgZG9uJ3Qgb3V0cHV0IGNvbmZ1c2luZworCSAgZGVidWcgbWVzc2FnZSB3aGVuIHNraXBwaW5nIGF0b21zLgorCisyMDA2LTA3LTAzIDE2OjQzOjEwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvOiBSZXR1cm4gRkxPV19VTkVYUEVDVEVEIHdoZW4gYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgbm90CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FwZXRhZy9nc3R0YWdkZW11eC5jOiAoZ3N0X3RhZ19kZW11eF9jaGFpbik6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoZ3N0X2lkM2RlbXV4X2NoYWluKToKKwkgIFJldHVybiBGTE9XX1VORVhQRUNURUQgd2hlbiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCBub3QKKwkgIEZMT1dfRVJST1IuIEZpeGVzICdpbnRlcm5hbCBzdHJlYW0gZXJyb3InIGVycm9ycyB0aGF0CisJICB3b3VsZCBzb21ldGltZXMgb2NjdXIgaW4gdG90ZW0gd2hlbiBzY3J1YmJpbmcgdG8gdGhlCisJICBlbmQgb2YgYW4gSUQzdjEgdGFnZ2VkIG1wMyBmaWxlLgorCisyMDA2LTA3LTAzIDE1OjMxOjIyICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBleHQvbGlicG5nL2dzdHBuZ2RlYy4qOiBJbXBsZW1lbnQgYnVmZmVyIGNsaXBwaW5nL2Ryb3BwaW5nIHVzaW5nIEdzdFNlZ21lbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKGdzdF9wbmdkZWNfaW5pdCksICh1c2VyX2luZm9fY2FsbGJhY2spLAorCSAgKGJ1ZmZlcl9jbGlwKSwgKHVzZXJfZW5kX2NhbGxiYWNrKSwgKGdzdF9wbmdkZWNfY2hhaW4pLAorCSAgKGdzdF9wbmdkZWNfc2lua19ldmVudCksIChnc3RfcG5nZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmg6CisJICBJbXBsZW1lbnQgYnVmZmVyIGNsaXBwaW5nL2Ryb3BwaW5nIHVzaW5nIEdzdFNlZ21lbnQuCisJICBUaGlzIHByb3ZpZGVzIGFjY3VyYXRlIHNlZWtpbmcuCisKKzIwMDYtMDctMDMgMTU6Mjg6NDggKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguKjogUHJvcGVyIGFnZ3JlZ2F0aW9uIG9mIGVhY2ggc3RyZWFtJ3MgR3N0Rmxvd1JldHVybiBpbiBvcmRlciB0byBmaWd1cmUgb3V0IHdoZXRoZXIgdGhlIHRhc2sgc2hvdS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcmVzZXQpLAorCSAgKGdzdF9hdmlfZGVtdXhfcmVhZF9zdWJpbmRleGVzKSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwKKwkgIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrKSwgKGdzdF9hdmlfZGVtdXhfYWdncmVnYXRlZF9mbG93KSwKKwkgIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksIChwdXNoX3RhZ19saXN0cyksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSksIChnc3RfYXZpX2RlbXV4X2xvb3ApOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBQcm9wZXIgYWdncmVnYXRpb24gb2YgZWFjaCBzdHJlYW0ncyBHc3RGbG93UmV0dXJuIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQKKwkgIHdoZXRoZXIgdGhlIHRhc2sgc2hvdWxkIHN0b3Agb3Igbm90LgorCSAgRG9uJ3Qgc2VuZCBpbmxpbmUgZXZlbnRzIGJlZm9yZSBwdXNoaW5nIG91dCBhIE5FV19TRUdNRU5ULCBtb3JlCisJICBzcGVjaWZpY2FsbHkgZm9yIEdTVF9UQUdfRVZFTlQuCisJICBDaGFuZ2UgYSBHU1RfRVJST1IgdG8gYSBHU1RfV0FSTklORyBmb3IgYSBub24tZmF0YWwgc2l0dWF0aW9uIGluIHJlYWRpbmcKKwkgIHN1Yi1pbmRleGVzLgorCisyMDA2LTA2LTMwIDA3OjExOjI0ICswMDAwICBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uQHN1bi5jb20+CisKKwkgIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyY3RybC5jOiBNb3ZlICJNb25pdG9yIiBzbGlkZXIgdG8gaW5wdXQgdGFiIHNvIGl0IHdvcmtzIG1vcmUgbGlrZSBzZHRhdWRpb2NvbnRyb2wsIHdoaWNoIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQnJpYW4gQ2FtZXJvbiAgPGJyaWFuIGRvdCBjYW1lcm9uIGF0IHN1biBkb3QgY29tPgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuYzoKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX2J1aWxkX2xpc3QpOgorCSAgTW92ZSAiTW9uaXRvciIgc2xpZGVyIHRvIGlucHV0IHRhYiBzbyBpdCB3b3JrcyBtb3JlIGxpa2UKKwkgIHNkdGF1ZGlvY29udHJvbCwgd2hpY2ggaXMgd2hhdCBwZW9wbGUgb24gU29sYXJpcyBhcmUgdXNlZAorCSAgdG8gdXNpbmcgZm9yIHRoZWlyIG1peGVyIHByb2dyYW0gKCMzNDYyNTkpLgorCisyMDA2LTA2LTI5IDE0OjUwOjE4ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYzogZml4IGEgbGVhaywgY2xlYW4gdXAgYXQgdGhlIGVuZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBmaXggYSBsZWFrLCBjbGVhbiB1cCBhdCB0aGUgZW5kCisKKzIwMDYtMDYtMjkgMTE6NDE6NTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS86IFNlbmQgdGFnIGV2ZW50IGFmdGVyIG5ld3NlZ21lbnQgZXZlbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9sb29wX3N0cmVhbV9wYXJzZV9pZCk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIFNlbmQgdGFnIGV2ZW50IGFmdGVyIG5ld3NlZ21lbnQgZXZlbnQuCisKKzIwMDYtMDYtMjkgMTE6MTE6NTAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiBNYWtlIHN1cmUgd2UgZG9uJ3QgcmV0dXJuIEdTVF9GTE9XX09LIHdpdGggYSBOVUxMIGJ1ZmZlciBpbiBjZXJ0YWluIGNhc2VzIHdoZXJlIGEgcmVhZCBiZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoZ3N0X2lkM2RlbXV4X3RyaW1fYnVmZmVyKSwKKwkgIChnc3RfaWQzZGVtdXhfcmVhZF9yYW5nZSk6CisJICBNYWtlIHN1cmUgd2UgZG9uJ3QgcmV0dXJuIEdTVF9GTE9XX09LIHdpdGggYSBOVUxMIGJ1ZmZlciBpbgorCSAgY2VydGFpbiBjYXNlcyB3aGVyZSBhIHJlYWQgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMKKwkgIHJlcXVlc3RlZC4gRml4ZXMgIzM0NTkzMC4KKwkgICogZ3N0L2FwZXRhZy9nc3R0YWdkZW11eC5jOiAoZ3N0X3RhZ19kZW11eF90cmltX2J1ZmZlciksCisJICAoZ3N0X3RhZ19kZW11eF9yZWFkX3JhbmdlKToKKwkgIEZpeCBzYW1lIGlzc3VlIGhlcmUgYXMgd2VsbC4KKworMjAwNi0wNi0yOSAxMTowNToxNCArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSAgc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzogRml4IGh5cG90aGV0aWNhbCBjcmFzaC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wNi0yOSAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOiAoZ3N0X3hpbWFnZV9zcmNfeGltYWdlX2dldCk6CisJICBGaXggaHlwb3RoZXRpY2FsIGNyYXNoLgorCisyMDA2LTA2LTI4IDA4OjM2OjMwICswMDAwICBCcmlhbiBDYW1lcm9uIDxicmlhbi5jYW1lcm9uQHN1bi5jb20+CisKKwkgIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NpbmsuYzogRG8gbm90IG1vZGlmeSB0aGUgcG9ydHMgdmFsdWUuIElmIHRoZSB1c2VyIGhhcyB0dXJuZWQgb2ZmIHRoZSBidWlsdC1pbiBzcGVha2VycywgdGhlbi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogQnJpYW4gQ2FtZXJvbiAgPGJyaWFuIGRvdCBjYW1lcm9uIGF0IHN1biBkb3QgY29tPgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmM6IChnc3Rfc3VuYXVkaW9zaW5rX3ByZXBhcmUpOgorCSAgRG8gbm90IG1vZGlmeSB0aGUgcG9ydHMgdmFsdWUuIElmIHRoZSB1c2VyIGhhcyB0dXJuZWQgb2ZmIHRoZQorCSAgYnVpbHQtaW4gc3BlYWtlcnMsIHRoZW4gd2Ugc2hvdWxkIG5vdCByZXNldCBpdCBpbiB0aGUgcHJlcGFyZQorCSAgZnVuY3Rpb24sIHNpbmNlIHRoaXMgY2F1c2VzIHRoZSBidWlsdC1pbiBzcGVha2VycyB0byB0dXJuCisJICBiYWNrIG9uIGFueXRpbWUgdGhlIHVzZXIgY2hhbmdlcyBhIHRyYWNrIGluIHRvdGVtLCByaHl0aG1ib3gsCisJICBldGMuICgjMzQ2MDY2KS4KKworMjAwNi0wNi0yMyAwOTozNTo0NSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2dvb20vZ3N0Z29vbS5jOiBGaXggZG91YmxlIGNhcHMgdW5yZWYgd2hlbiBuZWdvdGlhdGlvbiBmYWlscy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9zcmNfbmVnb3RpYXRlKToKKwkgIEZpeCBkb3VibGUgY2FwcyB1bnJlZiB3aGVuIG5lZ290aWF0aW9uIGZhaWxzLgorCisyMDA2LTA2LTIyIDE5OjMxOjA0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBVc2UgR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyB3aGVyZSBwb3NzaWJsZSAoIzM0MjUwMykgcGx1cyB0d28gbWlub3IgbWFjcm8gZml4ZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sZW5jLmM6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxwYXJzZXIuYzoKKwkgICogZXh0L2R2L2dzdGR2ZGVjLmM6CisJICAqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJICAqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkgICogZXh0L2pwZWcvZ3N0c21va2VkZWMuYzoKKwkgICogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJICAqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6CisJICAqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJICAqIGdzdC9kZWJ1Zy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSAgKiBnc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYzoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRwZGVjLmM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkgICogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6CisJICAqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICBVc2UgR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyB3aGVyZSBwb3NzaWJsZSAoIzM0MjUwMykKKwkgIHBsdXMgdHdvIG1pbm9yIG1hY3JvIGZpeGVzLgorCisyMDA2LTA2LTIyIDE2OjI3OjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvOiBUcnkgdG8gZml4IHVwIGJyb2tlbiBtYXRyb3NrYSBmaWxlcyBjb250YWluaW5nIHN1YnRpdGxlIHN0cmVhbXMgd2l0aCBub24tVVRGOCBjaGFyYWN0ZXIgZW5jb2RpbmdzIChjb3UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfY2hlY2tfc3VidGl0bGVfYnVmZmVyKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3N1YnRpdGxlX2NhcHMpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJICAoZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfc3VidGl0bGVfY29udGV4dCk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIFRyeSB0byBmaXggdXAgYnJva2VuIG1hdHJvc2thIGZpbGVzIGNvbnRhaW5pbmcgc3VidGl0bGUKKwkgIHN0cmVhbXMgd2l0aCBub24tVVRGOCBjaGFyYWN0ZXIgZW5jb2RpbmdzIChjb3VydGVzeSBvZgorCSAgbWt2bWVyZ2UpIHVzaW5nIGVpdGhlciB0aGUgZW5jb2Rpbmcgc3BlY2lmaWVkIGluIHRoZQorCSAgR1NUX1NVQlRJVExFX0VOQ09ESU5HIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIHRoZQorCSAgY3VycmVudCBsb2NhbGUncyBjaGFyYWN0ZXIgc2V0IGlmIGl0IGlzIG5vbi1VVEY4LgorCSAgRml4ZXMgIzMzNzA3Ni4KKworMjAwNi0wNi0yMiAxMjoxNzoxMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IFNldCBpbWFnZSB0eXBlIGZyb20gQVBJQyBmcmFtZSBhcyAiaW1hZ2UtdHlwZSIgZmllbGQgb2YgR1NUX1RBR19JTUFHRSBidWZmZXIgY2FwcyAoIzM0NDYwNSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChwYXJzZV9waWN0dXJlX2ZyYW1lKToKKwkgIFNldCBpbWFnZSB0eXBlIGZyb20gQVBJQyBmcmFtZSBhcyAiaW1hZ2UtdHlwZSIgZmllbGQKKwkgIG9mIEdTVF9UQUdfSU1BR0UgYnVmZmVyIGNhcHMgKCMzNDQ2MDUpLgorCisyMDA2LTA2LTIwIDE5OjQwOjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy86IFN1cHBvcnQgY2hhaW4tYmFzZWQgb3BlcmF0aW9uLCBzaG91bGQgbWFrZSBmbGFjLW92ZXItREFBUCB3b3JrICgjMzQwNDkyKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX2luaXQpLAorCSAgKGdzdF9mbGFjX2RlY19yZXNldF9kZWNvZGVycyksCisJICAoZ3N0X2ZsYWNfZGVjX3NldHVwX3NlZWthYmxlX2RlY29kZXIpLAorCSAgKGdzdF9mbGFjX2RlY19zZXR1cF9zdHJlYW1fZGVjb2RlciksIChnc3RfZmxhY19kZWNfZmluYWxpemUpLAorCSAgKGdzdF9mbGFjX2RlY19tZXRhZGF0YV9jYWxsYmFjayksCisJICAoZ3N0X2ZsYWNfZGVjX21ldGFkYXRhX2NhbGxiYWNrX3NlZWthYmxlKSwKKwkgIChnc3RfZmxhY19kZWNfbWV0YWRhdGFfY2FsbGJhY2tfc3RyZWFtKSwKKwkgIChnc3RfZmxhY19kZWNfZXJyb3JfY2FsbGJhY2spLAorCSAgKGdzdF9mbGFjX2RlY19lcnJvcl9jYWxsYmFja19zZWVrYWJsZSksCisJICAoZ3N0X2ZsYWNfZGVjX2Vycm9yX2NhbGxiYWNrX3N0cmVhbSksIChnc3RfZmxhY19kZWNfcmVhZF9zZWVrYWJsZSksCisJICAoZ3N0X2ZsYWNfZGVjX3JlYWRfc3RyZWFtKSwgKGdzdF9mbGFjX2RlY193cml0ZSksCisJICAoZ3N0X2ZsYWNfZGVjX3dyaXRlX3NlZWthYmxlKSwgKGdzdF9mbGFjX2RlY193cml0ZV9zdHJlYW0pLAorCSAgKGdzdF9mbGFjX2RlY19sb29wKSwgKGdzdF9mbGFjX2RlY19zaW5rX2V2ZW50KSwKKwkgIChnc3RfZmxhY19kZWNfY2hhaW4pLCAoZ3N0X2ZsYWNfZGVjX2NvbnZlcnRfc2luayksCisJICAoZ3N0X2ZsYWNfZGVjX2dldF9zaW5rX3F1ZXJ5X3R5cGVzKSwgKGdzdF9mbGFjX2RlY19zaW5rX3F1ZXJ5KSwKKwkgIChnc3RfZmxhY19kZWNfZ2V0X3NyY19xdWVyeV90eXBlcyksIChnc3RfZmxhY19kZWNfc3JjX3F1ZXJ5KSwKKwkgIChnc3RfZmxhY19kZWNfaGFuZGxlX3NlZWtfZXZlbnQpLCAoZ3N0X2ZsYWNfZGVjX3NpbmtfYWN0aXZhdGUpLAorCSAgKGdzdF9mbGFjX2RlY19zaW5rX2FjdGl2YXRlX3B1c2gpLAorCSAgKGdzdF9mbGFjX2RlY19zaW5rX2FjdGl2YXRlX3B1bGwpLCAoZ3N0X2ZsYWNfZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkgIFN1cHBvcnQgY2hhaW4tYmFzZWQgb3BlcmF0aW9uLCBzaG91bGQgbWFrZSBmbGFjLW92ZXItREFBUAorCSAgd29yayAoIzM0MDQ5MikuCisKKzIwMDYtMDYtMjAgMTU6MzU6MDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OiBEb2MgdXBkYXRlcywgbWVyZ2Ugc29tZSB1bnVzZWQgc3ltYm9scy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgIERvYyB1cGRhdGVzLCBtZXJnZSBzb21lIHVudXNlZCBzeW1ib2xzLgorCisyMDA2LTA2LTIwIDE0OjU3OjA5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBBZGRlZCBkb2N1bWVudGF0aW9uIGZvciB0aGUgcnRzcCBwbHVnaW4uIEZpeGVzICMzNDUzOTMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOiAoZ3N0X3J0cGRlY19jbGFzc19pbml0KToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBBZGRlZCBkb2N1bWVudGF0aW9uIGZvciB0aGUgcnRzcCBwbHVnaW4uIEZpeGVzICMzNDUzOTMuCisKKzIwMDYtMDYtMjAgMTI6MTA6MjkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IFVzZSBiZXR0ZXIgR19PU18qIG1hY3Jvcy4gRml4ZXMgIzM0NTMwMSBzb21lIG1vcmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKGluZXRfYXRvbiksIChydHNwX2Nvbm5lY3Rpb25fc2VuZCksCisJICAocnRzcF9jb25uZWN0aW9uX2Nsb3NlKSwgKHJ0c3BfY29ubmVjdGlvbl9mcmVlKToKKwkgIFVzZSBiZXR0ZXIgR19PU18qIG1hY3Jvcy4gRml4ZXMgIzM0NTMwMSBzb21lIG1vcmUuCisKKzIwMDYtMDYtMjAgMTA6MzU6NDggKzAwMDAgIEJyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ac3VuLmNvbT4KKworCSAgc3lzL3N1bmF1ZGlvLzogQWRkIGEgU3VuQXVkaW8gc291cmNlIHBsdWdpbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEJyaWFuIENhbWVyb24gPGJyaWFuIGRvdCBjYW1lcm9uIGF0IHN1biBkb3QgY29tPgorCSAgKiBzeXMvc3VuYXVkaW8vTWFrZWZpbGUuYW06CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpby5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuYzoKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX2J1aWxkX2xpc3QpLCAoZ3N0X3N1bmF1ZGlvbWl4ZXJfY3RybF9uZXcpLAorCSAgKGdzdF9zdW5hdWRpb21peGVyX2N0cmxfbGlzdF90cmFja3MpLAorCSAgKGdzdF9zdW5hdWRpb21peGVyX2N0cmxfZ2V0X3ZvbHVtZSksCisJICAoZ3N0X3N1bmF1ZGlvbWl4ZXJfY3RybF9zZXRfdm9sdW1lKSwKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX3NldF9tdXRlKSwKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX3NldF9yZWNvcmQpOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuaDoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJ0cmFjay5jOgorCSAgKGdzdF9zdW5hdWRpb21peGVyX3RyYWNrX2luaXQpLCAoZ3N0X3N1bmF1ZGlvbWl4ZXJfdHJhY2tfbmV3KToKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJ0cmFjay5oOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zcmMuYzogKGdzdF9zdW5hdWRpb3NyY19kaXNwb3NlKSwKKwkgIChnc3Rfc3VuYXVkaW9zcmNfYmFzZV9pbml0KSwgKGdzdF9zdW5hdWRpb3NyY19jbGFzc19pbml0KSwKKwkgIChnc3Rfc3VuYXVkaW9zcmNfaW5pdCksIChnc3Rfc3VuYXVkaW9zcmNfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfc3VuYXVkaW9zcmNfZ2V0X3Byb3BlcnR5KSwgKGdzdF9zdW5hdWRpb3NyY19nZXRjYXBzKSwKKwkgIChnc3Rfc3VuYXVkaW9zcmNfb3BlbiksIChnc3Rfc3VuYXVkaW9zcmNfY2xvc2UpLAorCSAgKGdzdF9zdW5hdWRpb3NyY19wcmVwYXJlKSwgKGdzdF9zdW5hdWRpb3NyY191bnByZXBhcmUpLAorCSAgKGdzdF9zdW5hdWRpb3NyY19yZWFkKSwgKGdzdF9zdW5hdWRpb3NyY19kZWxheSksCisJICAoZ3N0X3N1bmF1ZGlvc3JjX3Jlc2V0KToKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc3JjLmg6CisJICBBZGQgYSBTdW5BdWRpbyBzb3VyY2UgcGx1Z2luLgorCSAgU3VwcG9ydCBzdGVyZW8gYW5kIHJpZ2h0L2xlZnQgY2hhbm5lbCBnYWluIGluIHRoZSBtaXhlciBwbHVnaW4uCisJICBTdXBwb3J0IHRoZSBSRUNPUkQgZmxhZyBzbyB0aGF0IHlvdSBjYW4gc3dpdGNoIGJldHdlZW4gbGluZS1pbnB1dCBhbmQKKwkgIG1pY3JvcGhvbmUgaW4gZ25vbWUtdm9sdW1lLWNvbnRyb2wuCisJICBDb2RlIGNsZWFudXBzIGxpa2UgdXNpbmcgYW4gZW51bWVyYXRvciBmb3IgdHJhY2sgbnVtYmVyIGluc3RlYWQgb2YgYW4KKwkgIGludGVnZXIuIEZpeGVzICMzNDQ5MjMuCisKKzIwMDYtMDYtMjAgMTA6MzE6NDEgKzAwMDAgIEpvbmkgVmFsdGFuZW4gPGpvbmkudmFsdGFuZW5AbW92aWFsLmZpPgorCisJICBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiBNYWtlIFJUU1AgcGx1Z2luIGNvbXBpbGUgb24gd2luZG93cy4gRml4ZXMgIzM0NTMwMS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEpvbmkgVmFsdGFuZW4gPGpvbmkgZG90IHZhbHRhbmVuIGF0IG1vdmlhbCBkb3QgZmk+CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChpbmV0X2F0b24pLCAocnRzcF9jb25uZWN0aW9uX3NlbmQpLAorCSAgKHJ0c3BfY29ubmVjdGlvbl9jbG9zZSk6CisJICBNYWtlIFJUU1AgcGx1Z2luIGNvbXBpbGUgb24gd2luZG93cy4gRml4ZXMgIzM0NTMwMS4KKwkgIFNvbWUgY2hhbmdlcyB0byBvcmlnaW5hbCBwYXRjaCB0byBjYXRjaCBlcnJvcnMgYmV0dGVyLgorCSAgdXNlIGlmZGVmIFdJTjMyIGluc3RlYWQgb2YgaWZuZGVmLgorCisyMDA2LTA2LTE5IDEwOjAwOjE4ICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBjb25maWd1cmUuYWM6IElmIHdlIGhhdmUgbGlicmF3MTM5NCA+PSAxLjIuMSwgdGhlbiB3ZSBuZWVkIGxpYmllYzYxODgzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA2LTE5ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIElmIHdlIGhhdmUgbGlicmF3MTM5NCA+PSAxLjIuMSwgdGhlbiB3ZSBuZWVkIGxpYmllYzYxODgzLgorCisyMDA2LTA2LTE4IDE0OjAwOjE5ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBleHQvanBlZy9nc3RqcGVnZGVjLmM6IEFmdGVyIGEgZmFpbGVkIGJ1ZmZlciBhbGxvYywgd2UgbmVlZCB0byBhYm9ydCB0aGUganBlZyBkZWNvZGluZyAoaXQgc3RhcnRlZCB3aGVuIHBhcnNpbmcgaGVhZGUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChnc3RfanBlZ19kZWNfY2hhaW4pOgorCSAgQWZ0ZXIgYSBmYWlsZWQgYnVmZmVyIGFsbG9jLCB3ZSBuZWVkIHRvIGFib3J0IHRoZSBqcGVnIGRlY29kaW5nIChpdAorCSAgc3RhcnRlZCB3aGVuIHBhcnNpbmcgaGVhZGVycyB0byBmaWd1cmUgb3V0IGhvdyBtYW55IGJ5dGVzIHdlIG5lZWQKKwkgIHRvIHJlcXVlc3QgZG93bnN0cmVhbSkuCisKKzIwMDYtMDYtMTggMTI6Mzc6MTIgKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hbmF1d0Bza3luZXQuYmU+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVhZCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZSAoIzM0NTIzMikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBNYXJrIE5hdXdlbGFlcnRzICA8bWFuYXV3IGF0IHNreW5ldCBiZT4KKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKToKKwkgIE1ha2Ugc3VyZSB3ZSBkb24ndCByZWFkIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlICgjMzQ1MjMyKS4KKworMjAwNi0wNi0xNyAxNDozNTozNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBGaXggLS1kaXNhYmxlLWV4dGVybmFsIChjYW4ndCBzZXQgY29uZGl0aW9uYWxzIGNvbmRpdGlvbmFsbHksICMzNDM2MDIpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEZpeCAtLWRpc2FibGUtZXh0ZXJuYWwgKGNhbid0IHNldCBjb25kaXRpb25hbHMgY29uZGl0aW9uYWxseSwKKwkgICMzNDM2MDIpLgorCisyMDA2LTA2LTE2IDEyOjM1OjA4ICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBnc3Qvc3BlY3RydW0vTWFrZWZpbGUuYW06IEZpeCBidWlsZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wNi0xNiAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCSAgKiBnc3Qvc3BlY3RydW0vTWFrZWZpbGUuYW06CisJICBGaXggYnVpbGQuCisKKzIwMDYtMDYtMTYgMTA6NTY6MjQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFVzZSBHU1RfUExVR0lOX0RPQ1MsIC0tZW5hYmxlLXBsdWdpbi1kb2NzIGV0Yy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBhdXRvZ2VuLnNoOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGRvY3MvTWFrZWZpbGUuYW06CisJICBVc2UgR1NUX1BMVUdJTl9ET0NTLCAtLWVuYWJsZS1wbHVnaW4tZG9jcyBldGMuCisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sOgorCSAgQWRkL2ZpeCBhcGV2Mm11eCBkb2NzLgorCisyMDA2LTA2LTE2IDA5OjQ5OjA3ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9zcGVjdHJ1bS86IHBvcnQgdG8gdXNlIG1lc3NhZ2UgdG8gZ2V0IHJlc3VsdHMsIGNsZWFubHkgZXhpdCB3aGVuIGNsb3NpbmcgdGhlIHdpbmRvdworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9kZW1vLWF1ZGlvdGVzdC5jOiAob25fd2luZG93X2Rlc3Ryb3kpLAorCSAgKGRyYXdfc3BlY3RydW0pLCAobWVzc2FnZV9oYW5kbGVyKSwgKG1haW4pOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1vc3NzcmMuYzogKG9uX3dpbmRvd19kZXN0cm95KSwgKGRyYXdfc3BlY3RydW0pLAorCSAgKG1lc3NhZ2VfaGFuZGxlciksIChtYWluKToKKwkgIHBvcnQgdG8gdXNlIG1lc3NhZ2UgdG8gZ2V0IHJlc3VsdHMsIGNsZWFubHkgZXhpdCB3aGVuIGNsb3NpbmcgdGhlIHdpbmRvdworCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogKGdzdF9zcGVjdHJ1bV9jbGFzc19pbml0KSwKKwkgIChnc3Rfc3BlY3RydW1faW5pdCksIChnc3Rfc3BlY3RydW1fZGlzcG9zZSksCisJICAoZ3N0X3NwZWN0cnVtX3NldF9wcm9wZXJ0eSksIChnc3Rfc3BlY3RydW1fZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfc3BlY3RydW1fc2V0X2NhcHMpLCAoZ3N0X3NwZWN0cnVtX3N0YXJ0KSwKKwkgIChnc3Rfc3BlY3RydW1fbWVzc2FnZV9uZXcpLCAoZ3N0X3NwZWN0cnVtX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5oOgorCSAgcG9ydCB0byBkZXJpdmUgZnJvbSBiYXNldHJhbnNmb3JtIGFuZCBzZW5kIHJlc3VsdHMgdmlhIG1lc3NhZ2VzCisJICAobGlrZSBsZXZlbCBlbGVtZW50KQorCisyMDA2LTA2LTE1IDE1OjU4OjA5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IENvbWJpbmUgcmV0dXJuIHZhbHVlcyBmcm9tIHNyYyBwYWQgcHVzaGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X3BlcmZvcm1fc2VlayksCisJICAoZ3N0X3F0ZGVtdXhfY29tYmluZV9mbG93cyksIChnc3RfcXRkZW11eF9sb29wX3N0YXRlX21vdmllKSwKKwkgIChnc3RfcXRkZW11eF9sb29wKSwgKGdzdF9xdGRlbXV4X2NoYWluKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBDb21iaW5lIHJldHVybiB2YWx1ZXMgZnJvbSBzcmMgcGFkIHB1c2hlcy4KKworMjAwNi0wNi0xNSAwODo1MDowOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBEb24ndCBjcmFzaCBvbiBmaWxlcyB3aXRoIDAgc2FtcGxlcywgRU9TIGltbWVkaWF0bHkgaW5zdGVhZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX3N0YXRlX2hlYWRlciksCisJICAoZ3N0X3F0ZGVtdXhfcHJlcGFyZV9jdXJyZW50X3NhbXBsZSksIChnc3RfcXRkZW11eF9hZHZhbmNlX3NhbXBsZSksCisJICAoZ3N0X3F0ZGVtdXhfYWRkX3N0cmVhbSk6CisJICBEb24ndCBjcmFzaCBvbiBmaWxlcyB3aXRoIDAgc2FtcGxlcywgRU9TIGltbWVkaWF0bHkgaW5zdGVhZC4KKwkgIEZpeGVzICMzNDQ5NDQuCisKKzIwMDYtMDYtMTQgMTU6NTk6NTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9kdi9nc3RkdmRlYy5jOiBSZXNldCBzZWdtZW50IGluZm8gb24gZmx1c2guCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfY2xhc3NfaW5pdCksIChnc3RfZHZkZWNfaW5pdCksCisJICAoZ3N0X2R2ZGVjX2ZpbmFsaXplKSwgKGdzdF9kdmRlY19zaW5rX2V2ZW50KSwKKwkgIChnc3RfZHZkZWNfY2hhbmdlX3N0YXRlKToKKwkgIFJlc2V0IHNlZ21lbnQgaW5mbyBvbiBmbHVzaC4KKwkgIEFsbG9jIHNlZ21lbnQgaW4gX2luaXQsIGZyZWUgaW4gX2ZpbmFsaXplLgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5jOiAoZ3N0X2R2ZGVtdXhfaGFuZGxlX3B1bGxfc2Vlayk6CisJICBEb24ndCBzZW5kIHNlZ21lbnRzIHR3aWNlLgorCisyMDA2LTA2LTE0IDE1OjA3OjIyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvZHYvZ3N0ZHZkZW11eC5jOiBSZXNwZWN0IHNlZ21lbnQuc3RvcC4gRml4ZXMgIzM0MjU5Mi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5jOiAoZ3N0X2R2ZGVtdXhfZGVtdXhfZnJhbWUpOgorCSAgUmVzcGVjdCBzZWdtZW50LnN0b3AuIEZpeGVzICMzNDI1OTIuCisKKzIwMDYtMDYtMTQgMTE6Mjg6NDEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiBObyBsYW5ndWFnZSBzcGVjaWZpZWQgbWVhbnMgdGhlIGltcGxpZWQgbGFuZ3VhZ2UgaXMgRW5nbGlzaCBhY2NvcmRpbmcgdG8gdGhlIG1hdHJvc2thIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9zdHJlYW0pOgorCSAgTm8gbGFuZ3VhZ2Ugc3BlY2lmaWVkIG1lYW5zIHRoZSBpbXBsaWVkIGxhbmd1YWdlIGlzIEVuZ2xpc2gKKwkgIGFjY29yZGluZyB0byB0aGUgbWF0cm9za2Egc3BlYyAocGFydGlhbGx5IGZpeGVzICMzNDQ3MDgpOworCSAgYWRkIHNvbWUgbW9yZSBkZWJ1ZyBvdXRwdXQuCisKKzIwMDYtMDYtMTQgMDk6MzI6MjcgKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKworCSAgZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy4qOiBVc2UgYml0cmF0ZSBwcm9wZXJ0eSBzb2xlbHkgZm9yIGJpdHJhdGVzIGFuZCBhZGQgbmV3IGJpdHMtcGVyLXNhbXBsZSBwcm9wZXJ0eSBmb3IgdGhlIG90Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlICA8c2xvbW8gYXQgY2lyY3VsYXItY2hhb3Mgb3JnPgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfYmFzZV9pbml0KSwKKwkgIChnc3Rfd2F2cGFja19lbmNfY2xhc3NfaW5pdCksIChnc3Rfd2F2cGFja19lbmNfc2V0X3dwX2NvbmZpZyksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2NoYWluKSwgKGdzdF93YXZwYWNrX2VuY19zaW5rX2V2ZW50KSwKKwkgIChnc3Rfd2F2cGFja19lbmNfc2V0X3Byb3BlcnR5KSwgKGdzdF93YXZwYWNrX2VuY19nZXRfcHJvcGVydHkpOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmg6CisJICBVc2UgYml0cmF0ZSBwcm9wZXJ0eSBzb2xlbHkgZm9yIGJpdHJhdGVzIGFuZCBhZGQgbmV3CisJICBiaXRzLXBlci1zYW1wbGUgcHJvcGVydHkgZm9yIHRoZSBvdGhlciBzdHVmZi4gU2V0IGR1cmF0aW9uCisJICB0byAndW5rbm93bicgaW4gaW5pdGlhbCBoZWFkZXIgYW5kIHJlc2VuZCBoZWFkZXIgd2l0aCBwcm9wZXIKKwkgIGR1cmF0aW9uIG9uIEVPUzsgdXBkYXRlIFNlYmFzdGlhbidzIGUtbWFpbCBhZGRyZXNzLgorCisyMDA2LTA2LTE0IDA4OjA2OjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogV2hlbiBvcGVyYXRpbmcgY2hhaW4tYmFzZWQsIGRvbid0IG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZSBjaHVua2luZyBvZiB0aGUgaW5jb21pbmcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9wZWVrX2NodW5rX2luZm8pLAorCSAgKGdzdF93YXZwYXJzZV9wZWVrX2NodW5rKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksCisJICAoZ3N0X3dhdnBhcnNlX2NoYWluKToKKwkgIFdoZW4gb3BlcmF0aW5nIGNoYWluLWJhc2VkLCBkb24ndCBtYWtlIGFueSBhc3N1bXB0aW9ucyBhYm91dCB0aGUKKwkgIGNodW5raW5nIG9mIHRoZSBpbmNvbWluZyBkYXRhIGFuZCBtYWtlIHN0cmVhbWluZyB3b3JrIG9uIGRheXMgb3RoZXIKKwkgIHRoYW4gdGhlIHNlY29uZCBUaHVyc2RheSBhZnRlciBhIGZ1bGwgbW9vbi4gQWxzbyBmaXggdXAgZGVidWcKKwkgIG1lc3NhZ2VzIGhlcmUgYW5kIHRoZXJlIGFuZCBtYWtlIHVzZSBvZiB0aGUgbW9zdCBleGNlbGxlbnQgbmV3CisJICBnc3RfcGFkX3F1ZXJ5X3BlZXJfZHVyYXRpb24oKSB1dGlsaXR5IGZ1bmN0aW9uLgorCSAgU2tpcCBhbnkgJ2JleHQnIGNodW5rcyBpbiBmcm9udCBvZiB0aGUgJ2ZtdCAnIGNodW5rLiBGaXhlcyAjMzQzODM3LgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwkgIFJlbW92ZSB0cmFpbGluZyBjb21tYSBhZnRlciBsYXN0IGVudW0gdmFsdWUsIHNvbWUgY29tcGlsZXJzIGRvbid0CisJICBsaWtlIHRoYXQuCisKKzIwMDYtMDYtMTMgMTc6MDU6MjUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBIYW5kbGUgcHJlbWF0dXJlIEVPUyBncmFjZWZ1bGx5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKToKKwkgIEhhbmRsZSBwcmVtYXR1cmUgRU9TIGdyYWNlZnVsbHkuCisKKzIwMDYtMDYtMTMgMDk6NTQ6MjYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogUHJldmVudCBvdXQgb2YgYm91bmRzIGFycmF5IGFjY2VzcyB3aGVuIHNjcnViYmluZyB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIGZpbGUgYmV0d2VlbiB0aGUgbGFzdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspOgorCSAgUHJldmVudCBvdXQgb2YgYm91bmRzIGFycmF5IGFjY2VzcyB3aGVuIHNjcnViYmluZyB0b3dhcmRzCisJICB0aGUgZW5kIG9mIHRoZSBmaWxlIGJldHdlZW4gdGhlIGxhc3QgaW5kZXggZW50cnkgYW5kIHRoZQorCSAgZW5kLiBGaXhlcyBvY2Nhc2lvbmFsICdzdGFydCA8PSBzdG9wJyBuZXdzZWdtZW50IGV2ZW50CisJICBhc3NlcnRpb25zIHdoZW4gc2NydWJiaW5nIGluIE1KUEVHIGZpbGVzLgorCisyMDA2LTA2LTEyIDExOjEzOjM5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy8uY3ZzaWdub3JlOiBBbmQgYW5vdGhlciBvbmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgIEFuZCBhbm90aGVyIG9uZS4KKworMjAwNi0wNi0xMiAxMTowNDo1OSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3NwZWN0cnVtLy5jdnNpZ25vcmU6IElnbm9yZSBtb3JlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS8uY3ZzaWdub3JlOgorCSAgSWdub3JlIG1vcmUuCisKKzIwMDYtMDYtMTIgMTA6NTM6MjYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9saWJtbXMvZ3N0bW1zLmM6IFNldCBjYXBzIG9uIG91dGdvaW5nIGJ1ZmZlcnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2xpYm1tcy9nc3RtbXMuYzogKGdzdF9tbXNfY3JlYXRlKToKKwkgIFNldCBjYXBzIG9uIG91dGdvaW5nIGJ1ZmZlcnMuCisJICAqIHN5cy9kaXJlY3RkcmF3L2dzdGRpcmVjdGRyYXdzaW5rLmM6IChnc3RfZGlyZWN0ZHJhd3NpbmtfaW5pdCk6CisJICBDb21tZW50IG91dCB1bnVzZWQgZ2xvYmFsIGluc3RhbmNlIHZhcmlhYmxlLgorCisyMDA2LTA2LTExIDE5OjMxOjEwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogRXh0cmFjdCBpbWFnZXMgZnJvbSBJRDN2MiB0YWdzIChBUElDIGZyYW1lcykuIEZpeGVzICMzMzk3MDQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChpZDNkZW11eF9pZDN2Ml9wYXJzZV9mcmFtZSksCisJICAoc2Nhbl9lbmNvZGVkX3N0cmluZyksIChwYXJzZV9waWN0dXJlX2ZyYW1lKToKKwkgIEV4dHJhY3QgaW1hZ2VzIGZyb20gSUQzdjIgdGFncyAoQVBJQyBmcmFtZXMpLiBGaXhlcyAjMzM5NzA0LgorCSAgKiBjb25maWd1cmUuYWM6CisJICBSZXF1aXJlIGNvcmUgPj0gMC4xMC44IChmb3IgR1NUX1RBR19JTUFHRSBhbmQKKwkgIEdTVF9UQUdfUFBFVklFV19JTUFHRSB1c2VkIGluIHRoZSBwYXRjaCBhYm92ZSkuCisKKzIwMDYtMDYtMTEgMTg6NTY6MjQgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBleHQvcmF3MTM5NC8uZ2l0aWdub3JlOgorCSogZXh0L3RhZ2xpYi8uZ2l0aWdub3JlOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2V4YW1wbGVzL2xldmVsLy5naXRpZ25vcmU6CisJICBtb2FwIGlnbm9yZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBtb2FwIGlnbm9yZQorCisyMDA2LTA2LTExIDE4OjUyOjE5ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IGdyYXR1aXRvdXMgY29tbWVudCBjaGFuZ2VzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IChnc3RfZHYxMzk0c3JjX2Rpc2NvdmVyX2F2Y19ub2RlKToKKwkgIGdyYXR1aXRvdXMgY29tbWVudCBjaGFuZ2VzCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2xldmVsLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBmaXggbGV2ZWwgdGVzdCBsZWFrcworCisyMDA2LTA2LTExIDE4OjQ0OjU0ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogLmdpdGlnbm9yZToKKwkgIGlnbm9yZSBtb3JlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGlnbm9yZSBtb3JlCisKKzIwMDYtMDYtMTEgMTg6MjA6MzkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC86IFVzZSBnc3RfcGFkX3F1ZXJ5X3BlZXJfZHVyYXRpb24oKSB1dGlsaXR5IGZ1bmN0aW9uIGhlcmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FwZXRhZy9nc3R0YWdkZW11eC5jOiAoZ3N0X3RhZ19kZW11eF9nZXRfdXBzdHJlYW1fc2l6ZSk6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoaWQzZGVtdXhfZ2V0X3Vwc3RyZWFtX3NpemUpOgorCSAgVXNlIGdzdF9wYWRfcXVlcnlfcGVlcl9kdXJhdGlvbigpIHV0aWxpdHkgZnVuY3Rpb24gaGVyZS4KKworMjAwNi0wNi0xMSAxMzo1NzoxOSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGF1dG9nZW4uc2g6IHJlcXVpcmUgYW0xNworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGF1dG9nZW4uc2g6CisJICByZXF1aXJlIGFtMTcKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBleHQvYW5ub2RleC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2NkaW8vTWFrZWZpbGUuYW06CisJICAqIGV4dC9kdi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2VzZC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2ZsYWMvTWFrZWZpbGUuYW06CisJICAqIGV4dC9nZGtfcGl4YnVmL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbGFkc3BhL01ha2VmaWxlLmFtOgorCSAgKiBleHQvbGliY2FjYS9NYWtlZmlsZS5hbToKKwkgICogZXh0L3NwZWV4L01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGFnbGliL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3NzL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvc3VuYXVkaW8vTWFrZWZpbGUuYW06CisJICAqIHN5cy94aW1hZ2UvTWFrZWZpbGUuYW06CisJICBjbGVhbiB1cCBidWlsZCBmdXJ0aGVyCisKKzIwMDYtMDYtMTEgMTM6NTU6MzQgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjb21tb246CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICB1cGRhdGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdXBkYXRlCisKKzIwMDYtMDYtMTAgMTU6MzM6MTggKzAwMDAgIFNlYmFzdGlhbiBEcsO2Z2UgPG1haWxAc2xvbW9zbmFpbC5kZT4KKworCSAgZXh0L3dhdnBhY2svOiBBZGQgd2F2cGFjayBlbmNvZGVyIGVsZW1lbnQgKCMzNDMxMzEpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSAgPG1haWwgYXQgc2xvbW9zbmFpbCBkZT4KKwkgICogZXh0L3dhdnBhY2svTWFrZWZpbGUuYW06CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2suYzogKHBsdWdpbl9pbml0KToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5oOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmM6IChnc3Rfd2F2cGFja19lbmNfbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2NvcnJlY3Rpb25fbW9kZV9nZXRfdHlwZSksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2pvaW50X3N0ZXJlb19tb2RlX2dldF90eXBlKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfYmFzZV9pbml0KSwgKGdzdF93YXZwYWNrX2VuY19jbGFzc19pbml0KSwKKwkgIChnc3Rfd2F2cGFja19lbmNfaW5pdCksIChnc3Rfd2F2cGFja19lbmNfZGlzcG9zZSksCisJICAoZ3N0X3dhdnBhY2tfZW5jX3Npbmtfc2V0X2NhcHMpLCAoZ3N0X3dhdnBhY2tfZW5jX3NldF93cF9jb25maWcpLAorCSAgKGdzdF93YXZwYWNrX2VuY19mb3JtYXRfc2FtcGxlcyksIChnc3Rfd2F2cGFja19lbmNfcHVzaF9ibG9jayksCisJICAoZ3N0X3dhdnBhY2tfZW5jX2NoYWluKSwgKGdzdF93YXZwYWNrX2VuY19yZXdyaXRlX2ZpcnN0X2Jsb2NrKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfc2lua19ldmVudCksIChnc3Rfd2F2cGFja19lbmNfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3Rfd2F2cGFja19lbmNfc2V0X3Byb3BlcnR5KSwgKGdzdF93YXZwYWNrX2VuY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF93YXZwYWNrX2VuY19wbHVnaW5faW5pdCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaDoKKwkgICogZXh0L3dhdnBhY2svbWQ1LmM6CisJICAqIGV4dC93YXZwYWNrL21kNS5oOgorCSAgQWRkIHdhdnBhY2sgZW5jb2RlciBlbGVtZW50ICgjMzQzMTMxKS4KKworMjAwNi0wNi0wOSAyMDozNjowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ2NvbmYvTWFrZWZpbGUuYW06IEhvbm91ciAtLWRpc2FibGUtc2NoZW1hcy1pbnN0YWxsIGNvbmZpZ3VyZSBvcHRpb24uIEZpeGVzICMzNDQxMDAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ2NvbmYvTWFrZWZpbGUuYW06CisJICBIb25vdXIgLS1kaXNhYmxlLXNjaGVtYXMtaW5zdGFsbCBjb25maWd1cmUgb3B0aW9uLiBGaXhlcyAjMzQ0MTAwLgorCisyMDA2LTA2LTA5IDE4OjMzOjAxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9leGFtcGxlcy9sZXZlbC9NYWtlZmlsZS5hbTogQWRkIC1sbSB0byBMSUJTIGZvciBwb3coKSBmdW5jdGlvbiwgZG9uJ3QgYXNzdW1lIG9uZSBvZiBvdXIgZGVwZW5kZW5jaWVzIChzdWNoIGFzIGwuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9sZXZlbC9NYWtlZmlsZS5hbToKKwkgIEFkZCAtbG0gdG8gTElCUyBmb3IgcG93KCkgZnVuY3Rpb24sIGRvbid0IGFzc3VtZSBvbmUgb2Ygb3VyCisJICBkZXBlbmRlbmNpZXMgKHN1Y2ggYXMgbGlieG1sLTIuMCkgZHJhZ3MgaXQgaW4gYXV0b21hdGljYWxseQorCSAgKCMzNDM2MDMpLgorCisyMDA2LTA2LTA5IDE4OjE3OjIzICswMDAwICBQZXRlciBLamVsbGVyc3RlZHQgPHBrakBheGlzLmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBXZSBzaG91bGQgdXNlICRTRUQgYW5kIG5vdCAkKFNFRCkgaW4gY29uZmlndXJlLmFjICgjMzQzNjc4KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFBldGVyIEtqZWxsZXJzdGVkdCAgPHBraiBhdCBheGlzIGRvdCBjb20+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIFdlIHNob3VsZCB1c2UgJFNFRCBhbmQgbm90ICQoU0VEKSBpbiBjb25maWd1cmUuYWMgKCMzNDM2NzgpLgorCisyMDA2LTA2LTA5IDE3OjM4OjE5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IENoZWNrIGZvciBYIGJlZm9yZSB1c2luZyBYX0NGTEFHUyBpbiB0aGUgY2hlY2sgZm9yIG9wZW5nbCAoIzM0Mzg2NikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQ2hlY2sgZm9yIFggYmVmb3JlIHVzaW5nIFhfQ0ZMQUdTIGluIHRoZSBjaGVjayBmb3Igb3BlbmdsICgjMzQzODY2KS4KKwkgICogZXh0L211c2VwYWNrL01ha2VmaWxlLmFtOgorCSAgKiBleHQvd2F2cGFjay9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NwZWVkL01ha2VmaWxlLmFtOgorCSAgQWRkIG1pc3NpbmcgR1NUX0xJQlMsIGZpeGVzIGJ1aWxkIG9uIGN5Z3dpbiAoIzM0Mzg2NikuCisKKzIwMDYtMDYtMDkgMTc6Mjk6MDggKzAwMDAgIEJyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ac3VuLmNvbT4KKworCSAgc3lzL3N1bmF1ZGlvLzogQXR0YWNoZWQgZmluZCBhIHBhdGNoIHRoYXQgZml4ZXMgYSBudW1iZXIgb2YgYnVncyB3aXRoIHRoZSBTdW5BdWRpbyBtaXhlciBwbHVnaW4gYW5kIGZpeGVzICMzNDQxMDE6IDEuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBCcmlhbiBDYW1lcm9uIDxicmlhbiBkb3QgY2FtZXJvbiBhdCBzdW4gZG90IGNvbT4KKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJICAoZ3N0X3N1bmF1ZGlvbWl4ZXJfY3RybF9vcGVuKSwgKGdzdF9zdW5hdWRpb21peGVyX2N0cmxfYnVpbGRfbGlzdCksCisJICAoZ3N0X3N1bmF1ZGlvbWl4ZXJfY3RybF9uZXcpLCAoZ3N0X3N1bmF1ZGlvbWl4ZXJfY3RybF9zZXRfdm9sdW1lKSwKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX3NldF9tdXRlKToKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOiAoZ3N0X3N1bmF1ZGlvc2lua19jbGFzc19pbml0KSwKKwkgIChnc3Rfc3VuYXVkaW9zaW5rX2luaXQpLCAoZ3N0X3N1bmF1ZGlvc2lua19wcmVwYXJlKSwKKwkgIChnc3Rfc3VuYXVkaW9zaW5rX3dyaXRlKToKKwkgIEF0dGFjaGVkIGZpbmQgYSBwYXRjaCB0aGF0IGZpeGVzIGEgbnVtYmVyIG9mIGJ1Z3Mgd2l0aCB0aGUgU3VuQXVkaW8gbWl4ZXIKKwkgIHBsdWdpbiBhbmQgZml4ZXMgIzM0NDEwMToKKwkgIDEuIFRoZSBnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX2J1aWxkX2xpc3Qga2VwdCBhcHBlbmRpbmcgdGhlIHNhbWUgMyB0cmFja3Mgb250bworCSAgdGhlIHRyYWNrbGlzdCBjYXVzaW5nIGdub21lLXZvbHVtZS1jb250cm9sJ3MgcHJlZmVyZW5jZXMgZGlhbG9nIHRvIGJlIG1lc3NlZAorCSAgdXAgYW5kIHdvdWxkIGNvcmUgZHVtcCBpZiB5b3UgY2hlY2tlZC91bmNoZWNrZWQgYW55IGl0ZW0uCisJICAyLiBXZSB3ZXJlbid0IHByZXZpb3VzbHkgc2V0dGluZyB0aGUgTVVURSBmbGFnIHByb3Blcmx5LiAgRml4aW5nIHRoaXMgbWFrZXMKKwkgIGdub21lLXZvbHVtZS1jb250cm9sIHdvcmsgYmV0dGVyLgorCSAgMy4gTm93IHdlIHByb3Blcmx5IGRlZmluZSB0aGUgaW5wdXQgdHJhY2sgdG8gYmUgR1NUX01JWEVSX1RSQUNLX0lOUFVUIGFuZAorCSAgdGhlIG1vbml0b3IgdG8gYmUgR1NUX01JWEVSX1RSQUNLX09VVFBVVCwgc28gdGhhdCBtYWtlcyBnbm9tZS12b2x1bWUtY29udHJvbAorCSAgbG9vayBiZXR0ZXIuCisJICBBbHNvIHNvbWUgbWlub3IgY2xlYW51cCBpbiBnc3RzdW5hdWRpb3NpbmsuYy4KKworMjAwNi0wNi0wOSAxNzoxMjo1MiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2pwZWcvZ3N0anBlZ2RlYy4qOiBBUEk6IEFkZGVkIElEQ1QgbWV0aG9kIHByb3BlcnR5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2lkY3RfbWV0aG9kX2dldF90eXBlKSwKKwkgIChnc3RfanBlZ19kZWNfY2xhc3NfaW5pdCksIChnc3RfanBlZ19kZWNfaW5pdCksCisJICAoZ3N0X2pwZWdfZGVjX2RlY29kZV9pbmRpcmVjdCksIChnc3RfanBlZ19kZWNfZGVjb2RlX2RpcmVjdCksCisJICAoZ3N0X2pwZWdfZGVjX2NoYWluKSwgKGdzdF9qcGVnX2RlY19zaW5rX2V2ZW50KSwKKwkgIChnc3RfanBlZ19kZWNfc2V0X3Byb3BlcnR5KSwgKGdzdF9qcGVnX2RlY19nZXRfcHJvcGVydHkpOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZGVjLmg6CisJICBBUEk6IEFkZGVkIElEQ1QgbWV0aG9kIHByb3BlcnR5CisJICBTbWFsbCBjbGVhbnVwcy4KKwkgIEF2b2lkIGR5bmFtaWMgYWxsb2NhdGlvbiBvZiB0cml2aWFsIGZpeGVkIHN0cnVjdHVyZS4KKwkgIEFsbG9jYXRlIGVub3VnaCBzcGFjZSBmb3IgdGVtcCA0OjQ6NCBZVVYgYnVmZmVycy4gRml4ZXMgIzM0MzY2MS4KKworMjAwNi0wNi0wNyAwOToyNToxNiArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSAgY29uZmlndXJlLmFjOiBXZSBub3cgcmVxdWlyZSBsaWJyYXcxMzk0ID49IDEuMS4wIGFuZCB0aGF0IHZlcnNpb24gb253YXJkcyBhbGwgaGF2ZSAucGMgZmlsZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDYtMDcgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKwkgICogY29uZmlndXJlLmFjOgorCSAgV2Ugbm93IHJlcXVpcmUgbGlicmF3MTM5NCA+PSAxLjEuMCBhbmQgdGhhdCB2ZXJzaW9uIG9ud2FyZHMgYWxsCisJICBoYXZlIC5wYyBmaWxlcy4KKworMjAwNi0wNi0wMiAxNTowMjo1NCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2xhdy9hbGF3LWRlY29kZS5jOiBUcnlpbmcgdG8gZ2V0IGl0ZW1zIGZyb20gYW4gQU5ZIG9yIEVNUFRZIGNhcHMgaXMgLi4uIHN0dXBpZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6IChhbGF3ZGVjX2dldGNhcHMpOgorCSAgVHJ5aW5nIHRvIGdldCBpdGVtcyBmcm9tIGFuIEFOWSBvciBFTVBUWSBjYXBzIGlzIC4uLiBzdHVwaWQuCisKKzIwMDYtMDYtMDIgMTE6MzM6MTggKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGV4dC9kdi9nc3RkdmRlYy4qOiBBZGRlZCBHc3RTZWdtZW50IGhhbmRsaW5nLCBub3cgaW1wbGVtZW50cyBkcm9wcGluZy9jbGlwcGluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19pbml0KSwgKGdzdF9kdmRlY19zaW5rX2V2ZW50KSwKKwkgIChnc3RfZHZkZWNfY2hhaW4pLCAoZ3N0X2R2ZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9kdi9nc3RkdmRlYy5oOgorCSAgQWRkZWQgR3N0U2VnbWVudCBoYW5kbGluZywgbm93IGltcGxlbWVudHMgZHJvcHBpbmcvY2xpcHBpbmcuCisKKzIwMDYtMDYtMDEgMjI6MDA6MjYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgRml4IG1vcmUgZ29iamVjdCBtYWNyb3M6IG9iajwtPmtsYXNzLCBHc3RYWFg8LT5Hc3RYWFhDbGFzcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9hbHNhc3BkaWYvYWxzYXNwZGlmc2luay5oOgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JkZWMuaDoKKwkgICogZXh0L2FtcndiL2dzdGFtcndiZW5jLmg6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YnBhcnNlLmg6CisJICAqIGV4dC9hcnRzL2dzdF9hcnRzLmg6CisJICAqIGV4dC9hcnRzZC9nc3RhcnRzZHNpbmsuaDoKKwkgICogZXh0L2F1ZGlvZmlsZS9nc3RhZnBhcnNlLmg6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzaW5rLmg6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzcmMuaDoKKwkgICogZXh0L2F1ZGlvcmVzYW1wbGUvZ3N0YXVkaW9yZXNhbXBsZS5oOgorCSAgKiBleHQvYnoyL2dzdGJ6MmRlYy5oOgorCSAgKiBleHQvYnoyL2dzdGJ6MmVuYy5oOgorCSAgKiBleHQvZGlyYWMvZ3N0ZGlyYWNkZWMuaDoKKwkgICogZXh0L2RpcmVjdGZiL2RmYnZpZGVvc2luay5oOgorCSAgKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmg6CisJICAqIGV4dC9kaXZ4L2dzdGRpdnhlbmMuaDoKKwkgICogZXh0L2R0cy9nc3RkdHNkZWMuaDoKKwkgICogZXh0L2ZhYWMvZ3N0ZmFhYy5oOgorCSAgKiBleHQvZ3NtL2dzdGdzbWRlYy5oOgorCSAgKiBleHQvZ3NtL2dzdGdzbWVuYy5oOgorCSAgKiBleHQvaXZvcmJpcy92b3JiaXNlbmMuaDoKKwkgICogZXh0L2xpYmZhbWUvZ3N0bGliZmFtZS5oOgorCSAgKiBleHQvbmFzL25hc3NpbmsuaDoKKwkgICogZXh0L25lb24vZ3N0bmVvbmh0dHBzcmMuaDoKKwkgICogZXh0L3BvbHlwL3BvbHlwc2luay5oOgorCSAgKiBleHQvc2RsL3NkbGF1ZGlvc2luay5oOgorCSAgKiBleHQvc2RsL3NkbHZpZGVvc2luay5oOgorCSAgKiBleHQvc2hvdXQvZ3N0c2hvdXQuaDoKKwkgICogZXh0L3NuYXBzaG90L2dzdHNuYXBzaG90Lmg6CisJICAqIGV4dC9zbmRmaWxlL2dzdHNmLmg6CisJICAqIGV4dC9zd2ZkZWMvZ3N0c3dmZGVjLmg6CisJICAqIGV4dC90YXJraW4vZ3N0dGFya2luZGVjLmg6CisJICAqIGV4dC90YXJraW4vZ3N0dGFya2luZW5jLmg6CisJICAqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmg6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaDoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmg6CisJICAqIGV4dC94aW5lL2dzdHhpbmUuaDoKKwkgICogZXh0L3h2aWQvZ3N0eHZpZGRlYy5oOgorCSAgKiBleHQveHZpZC9nc3R4dmlkZW5jLmg6CisJICAqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXBhcnNlLmg6CisJICAqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXN0cmlwLmg6CisJICAqIGdzdC9jb2xvcnNwYWNlL2dzdGNvbG9yc3BhY2UuaDoKKwkgICogZ3N0L2Zlc3RpdmFsL2dzdGZlc3RpdmFsLmg6CisJICAqIGdzdC9mcmVlemUvZ3N0ZnJlZXplLmg6CisJICAqIGdzdC9nZHAvZ3N0Z2RwZGVwYXkuaDoKKwkgICogZ3N0L2dkcC9nc3RnZHBwYXkuaDoKKwkgICogZ3N0L21vZHBsdWcvZ3N0bW9kcGx1Zy5oOgorCSAgKiBnc3QvbXBlZzFzeXMvZ3N0bXBlZzFzeXN0ZW1lbmNvZGUuaDoKKwkgICogZ3N0L21wZWcxdmlkZW9wYXJzZS9nc3RtcDF2aWRlb3BhcnNlLmg6CisJICAqIGdzdC9tcGVnMnN1Yi9nc3RtcGVnMnN1YnQuaDoKKwkgICogZ3N0L21wZWdhdWRpb3BhcnNlL2dzdG1wZWdhdWRpb3BhcnNlLmg6CisJICAqIGdzdC9tdWx0aWZpbGVzaW5rL2dzdG11bHRpZmlsZXNpbmsuaDoKKwkgICogZ3N0L292ZXJsYXkvZ3N0b3ZlcmxheS5oOgorCSAgKiBnc3QvcGxheW9uZGVtYW5kL2dzdHBsYXlvbmRlbWFuZC5oOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICAqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZGVjLmg6CisJICAqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZW5jLmg6CisJICAqIGdzdC9zbW9vdGgvZ3N0c21vb3RoLmg6CisJICAqIGdzdC9zbW9vdGh3YXZlL2dzdHNtb290aHdhdmUuaDoKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICAqIGdzdC9zcGVlZC9nc3RzcGVlZC5oOgorCSAgKiBnc3Qvc3RlcmVvL2dzdHN0ZXJlby5oOgorCSAgKiBnc3Qvc3dpdGNoL2dzdHN3aXRjaC5oOgorCSAgKiBnc3QvdHRhL2dzdHR0YWRlYy5oOgorCSAgKiBnc3QvdHRhL2dzdHR0YXBhcnNlLmg6CisJICAqIGdzdC92aWRlb2Ryb3AvZ3N0dmlkZW9kcm9wLmg6CisJICAqIGdzdC94aW5naGVhZGVyL2dzdHhpbmdtdXguaDoKKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuaDoKKwkgICogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oOgorCSAgKiBzeXMvZHhyMy9keHIzYXVkaW9zaW5rLmg6CisJICAqIHN5cy9keHIzL2R4cjNzcHVzaW5rLmg6CisJICAqIHN5cy9keHIzL2R4cjN2aWRlb3NpbmsuaDoKKwkgICogc3lzL3FjYW0vZ3N0cWNhbXNyYy5oOgorCSAgKiBzeXMvdmNkL3ZjZHNyYy5oOgorCSAgRml4IG1vcmUgZ29iamVjdCBtYWNyb3M6IG9iajwtPmtsYXNzLCBHc3RYWFg8LT5Hc3RYWFhDbGFzcworCisyMDA2LTA2LTAxIDIxOjA3OjI2ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIEZpeCBtb3JlIGdvYmplY3QgbWFjcm9zOiBvYmo8LT5rbGFzcywgR3N0WFhYPC0+R3N0WFhYQ2xhc3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmg6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuaDoKKwkgICogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5Lmg6CisJICAqIGV4dC9kdi9nc3RkdmRlYy5oOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5oOgorCSAgKiBleHQvZXNkL2VzZG1vbi5oOgorCSAgKiBleHQvZXNkL2VzZHNpbmsuaDoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5oOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NpbmsuaDoKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuaDoKKwkgICogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zaW5rLmg6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc3JjLmg6CisJICAqIGV4dC9nZGtfcGl4YnVmL2dzdGdka2FuaW1hdGlvbi5oOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5oOgorCSAgKiBleHQvaGFsL2dzdGhhbGF1ZGlvc2luay5oOgorCSAgKiBleHQvaGFsL2dzdGhhbGF1ZGlvc3JjLmg6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdlbmMuaDoKKwkgICogZXh0L2pwZWcvZ3N0c21va2VkZWMuaDoKKwkgICogZXh0L2pwZWcvZ3N0c21va2VlbmMuaDoKKwkgICogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuaDoKKwkgICogZXh0L2xpYm1uZy9nc3RtbmdkZWMuaDoKKwkgICogZXh0L2xpYm1uZy9nc3RtbmdlbmMuaDoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuaDoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdlbmMuaDoKKwkgICogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmg6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5oOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmg6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuaDoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5oOgorCSAgKiBnc3QvZGVidWcvZWZlbmNlLmg6CisJICAqIGdzdC9kZWJ1Zy9nc3RuYXZpZ2F0aW9udGVzdC5oOgorCSAgKiBnc3QvZGVidWcvZ3N0bmF2c2Vlay5oOgorCSAgKiBnc3QvZmx4L2dzdGZseGRlYy5oOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmg6CisJICAqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5oOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguaDoKKwkgICogZ3N0L2xhdy9hbGF3LWRlY29kZS5oOgorCSAgKiBnc3QvbGF3L2FsYXctZW5jb2RlLmg6CisJICAqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmg6CisJICAqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmg6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgICogZ3N0L21lZGlhbi9nc3RtZWRpYW4uaDoKKwkgICogZ3N0L29sZGNvcmUvZ3N0YWdncmVnYXRvci5oOgorCSAgKiBnc3Qvb2xkY29yZS9nc3RmZHNpbmsuaDoKKwkgICogZ3N0L29sZGNvcmUvZ3N0bWQ1c2luay5oOgorCSAgKiBnc3Qvb2xkY29yZS9nc3RtdWx0aWZpbGVzcmMuaDoKKwkgICogZ3N0L29sZGNvcmUvZ3N0cGlwZWZpbHRlci5oOgorCSAgKiBnc3Qvb2xkY29yZS9nc3RzaGFwZXIuaDoKKwkgICogZ3N0L29sZGNvcmUvZ3N0c3RhdGlzdGljcy5oOgorCSAgKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5oOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuaDoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGUuaDoKKwkgICogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmg6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmg6CisJICAqIGdzdC91ZHAvZ3N0dWRwc2luay5oOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5oOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmg6CisJICAqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaDoKKwkgICogc3lzL29zcy9nc3Rvc3NkbWFidWZmZXIuaDoKKwkgICogc3lzL29zcy9nc3Rvc3NtaXhlcmVsZW1lbnQuaDoKKwkgICogc3lzL29zcy9nc3Rvc3NzaW5rLmg6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc3JjLmg6CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXIuaDoKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5oOgorCSAgKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5oOgorCSAgRml4IG1vcmUgZ29iamVjdCBtYWNyb3M6IG9iajwtPmtsYXNzLCBHc3RYWFg8LT5Hc3RYWFhDbGFzcworCisyMDA2LTA1LTMxIDE2OjIzOjU0ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvZ29vbS9nc3Rnb29tLio6IEhhbmRsZSBRb1MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vZ3N0Z29vbS5jOiAoZ3N0X2dvb21fY2xhc3NfaW5pdCksIChnc3RfZ29vbV9pbml0KSwKKwkgIChnc3RfZ29vbV9maW5hbGl6ZSksIChnc3RfZ29vbV9yZXNldCksIChnc3RfZ29vbV9zaW5rX3NldGNhcHMpLAorCSAgKGdzdF9nb29tX3NyY19zZXRjYXBzKSwgKGdzdF9nb29tX3NyY19ldmVudCksCisJICAoZ3N0X2dvb21fc2lua19ldmVudCksIChnZXRfYnVmZmVyKSwgKGdzdF9nb29tX2NoYWluKSwKKwkgIChnc3RfZ29vbV9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmg6CisJICBIYW5kbGUgUW9TLgorCSAgSGFuZGxlIGZsdXNoaW5nLCBkaXNjb250IGFuZCBldmVudHMuCisJICBGaXggdGltZXN0YW1wcyBhbmQgdmFyaW91cyBvdGhlciBjbGVhbnVwcy4KKworMjAwNi0wNS0zMSAxNTozNzoxNiArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSAgZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IEZpeCBidXMgcmVzZXQgd2hlbiB1c2luZyBsaWJpZWM2MTg4MworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA1LTMxICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisJICAqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOiAoZ3N0X2R2MTM5NHNyY19idXNfcmVzZXQpOgorCSAgRml4IGJ1cyByZXNldCB3aGVuIHVzaW5nIGxpYmllYzYxODgzCisKKzIwMDYtMDUtMzEgMTA6MzE6MjMgKzAwMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkgIGNvbmZpZ3VyZS5hYzogRGV0ZWN0IGxpYmllYzYxODgzIGFuZCBzZXQgbmVjZXNzYXJ5IENGTEFHUyBhbmQgTElCUyBmb3IgZHYxMzk0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA1LTMxICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIERldGVjdCBsaWJpZWM2MTg4MyBhbmQgc2V0IG5lY2Vzc2FyeSBDRkxBR1MgYW5kIExJQlMgZm9yIGR2MTM5NC4KKwkgICogZXh0L3JhdzEzOTQvTWFrZWZpbGUuYW06CisJICBBZGQgQ0ZMQUdTLgorCSAgKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzogKGdzdF9kdjEzOTRzcmNfaWVjNjE4ODNfcmVjZWl2ZSksCisJICBOZXcgbWV0aG9kLCB0byByZWNlaXZlIHVzaW5nIGxpYmllYzYxODgzLgorCSAgKGdzdF9kdjEzOTRzcmNfaXNvX3JlY2VpdmUpLAorCSAgI2lmZGVmJ2Qgb3V0IGlmIGxpYmllYzYxODgzIGlzIHByZXNlbnQuCisJICAoZ3N0X2R2MTM5NHNyY19idXNfcmVzZXQpLAorCSAgR2V0IHVzZXJkYXRhIGNvcnJlY3RseSBpZiB1c2luZyBsaWJpZWM2MTg4My4KKwkgIChnc3RfZHYxMzk0c3JjX2NyZWF0ZSksCisJICBXaGVuIHVzaW5nIGxpYmllYzYxODgzLCBvbmx5IHBvbGwgb25lIGZkIGFuZCBubyBuZWVkIHRvIHJlYWQuCisJICAoZ3N0X2R2MTM5NHNyY19kaXNjb3Zlcl9hdmNfbm9kZSksCisJICBSZXBsYWNlIGdfd2FybmluZ3MuCisJICAoZ3N0X2R2MTM5NHNyY19zdGFydCksCisJICBDcmVhdGUgbmV3IGhhbmRsZSB3aGVuIHdlIGtub3cgd2hpY2ggZHYgcG9ydC4gIE1vcmUgcmVsaWFibGUKKwkgIHRoYW4gc2V0dGluZyBwb3J0IG9uIGFuIGV4aXN0aW5nIGhhbmRsZS4gIEluaXRpYWxpc2UgbGliaWVjNjE4ODMuCisJICAoZ3N0X2R2MTM5NHNyY19zdG9wKToKKwkgIElmIHVzaW5nIGxpYmllYzYxODgzLCB0aGVuIGNsZWFudXAgaXRzIGhhbmRsZSBwcm9wZXJseS4KKwkgICogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmg6CisJICBBZGQgbGliaWVjNjE4ODMgaGFuZGxlLgorCisyMDA2LTA1LTMwIDIxOjA3OjM4ICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogYWRkIGFuIGV4cGxpY2l0IGRsbCBpbXBvcnRlZCBkZWNsYXJhdGlvbiBmb3IgR1NUX0NBVF9FVkVOVCtXSU4zMgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzoKKwkgIGFkZCBhbiBleHBsaWNpdCBkbGwgaW1wb3J0ZWQgZGVjbGFyYXRpb24gZm9yIEdTVF9DQVRfRVZFTlQrV0lOMzIKKwkgICogd2luMzIvTUFOSUZFU1Q6CisJICBzb3J0IGZpbGUgbGlzdGluZworCSAgKiB3aW4zMi92czYvbGliZ3N0YXZpLmRzcDoKKwkgIGFkZCBnc3RhdmltdXguYyB0byB0aGUgcHJvamVjdAorCSAgKiB3aW4zMi92czYvbGliZ3N0aWQzZGVtdXguZHNwOgorCSAgYWRkIGxpbmsgdG8gemxpYiBsaWJyYXJ5CisJICAqIHdpbjMyL3ZzNi9saWJnc3RtYXRyb3NrYS5kc3A6CisJICBhZGQgbWF0cm9za2EtaWRzLmMgdG8gdGhlIHByb2plY3QKKworMjAwNi0wNS0zMCAxNDozNToxOCArMDAwMCAgU2ViYXN0aWFuIERyw7ZnZSA8bWFpbEBzbG9tb3NuYWlsLmRlPgorCisJICBBZGQgYXBldjJtdXggZWxlbWVudCAoIzM0MzEyMikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBTZWJhc3RpYW4gRHLDtmdlICA8bWFpbCBhdCBzbG9tb3NuYWlsIGRlID4KKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBleHQvdGFnbGliL01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGFnbGliL2dzdGFwZXYybXV4LmNjOgorCSAgKiBleHQvdGFnbGliL2dzdGFwZXYybXV4Lmg6CisJICAqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJICAqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4LmM6IChwbHVnaW5faW5pdCk6CisJICAqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4Lmg6CisJICBBZGQgYXBldjJtdXggZWxlbWVudCAoIzM0MzEyMikuCisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hcGV2Mm11eC5jOgorCSAgKHRlc3RfdGFnbGliX2FwZXYybXV4X2NyZWF0ZV90YWdzKSwKKwkgICh0ZXN0X3RhZ2xpYl9hcGV2Mm11eF9jaGVja190YWdzKSwgKGZpbGxfbXAzX2J1ZmZlciksIChnb3RfYnVmZmVyKSwKKwkgIChkZW11eF9wYWRfYWRkZWQpLCAodGVzdF90YWdsaWJfYXBldjJtdXhfY2hlY2tfb3V0cHV0X2J1ZmZlciksCisJICAodGVzdF90YWdsaWJfYXBldjJtdXhfd2l0aF90YWdzKSwgKEdTVF9TVEFSVF9URVNUKSwKKwkgIChhcGV2Mm11eF9zdWl0ZSksIChtYWluKToKKwkgIEFkZCB1bml0IHRlc3QgZm9yIGFwZXYybXV4IGVsZW1lbnQuCisKKzIwMDYtMDUtMjggMTc6MzM6MTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC86IEdTVF9QVFJfRk9STUFUIHNob3VsZCBiZSB1c2VkIHRvIHByaW50IGNhcHMgaW4gZGVidWcgc3RhdGVtZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOiAoZ3N0X2FscGhhX2NvbG9yX3RyYW5zZm9ybV9jYXBzKToKKwkgICogZ3N0L2RlYnVnL25lZ290aWF0aW9uLmM6IChnc3RfbmVnb3RpYXRpb25fdXBkYXRlX2NhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOiAoZ3N0X3J0cF9pbGJjX2RlcGF5X3NldGNhcHMpOgorCSAgR1NUX1BUUl9GT1JNQVQgc2hvdWxkIGJlIHVzZWQgdG8gcHJpbnQgY2FwcyBpbiBkZWJ1ZyBzdGF0ZW1lbnRzLgorCisyMDA2LTA1LTI4IDE0OjM4OjExICswMDAwICBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0B1YnVudHUuY29tPgorCisJICBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6IFNvbWUgY2xlYW4tdXBzIGFuZCBhZGRpdGlvbnM6IG1hcCBBUEUgJ2ZpbGUnIHRhZyB0bworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogU2ViYXN0aWFuIERyw7ZnZSAgPHNsb21vIGF0IHVidW50dSBkb3QgY29tPgorCSAgKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6IChhcGVfZGVtdXhfZ2V0X2dzdF90YWdfZnJvbV90YWcpLAorCSAgKGFwZV9kZW11eF9wYXJzZV90YWdzKToKKwkgIFNvbWUgY2xlYW4tdXBzIGFuZCBhZGRpdGlvbnM6IG1hcCBBUEUgJ2ZpbGUnIHRhZyB0bworCSAgR1NUX1RBR19MT0NBVElPTiAoIzM0MzEyMyk7IGFkZCBzdXBwb3J0IGZvciBleHRyYWN0aW5nCisJICB0aGUgdHJhY2sgY291bnQgYW5kIGNsZWFuIHVwIHBhcnNpbmcgYSBiaXQgKCMzNDMxMjcpLgorCisyMDA2LTA1LTI4IDEzOjQ5OjEyICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBleHQvanBlZy9nc3RqcGVnZGVjLmM6IEluaXRpYWxpemUgc2VnbWVudCB0byBHU1RfRk9STUFUX1VOREVGSU5FRCBpbiBSRUFEWS0+UEFVU0VELgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKGdzdF9qcGVnX2RlY19jaGFuZ2Vfc3RhdGUpOgorCSAgSW5pdGlhbGl6ZSBzZWdtZW50IHRvIEdTVF9GT1JNQVRfVU5ERUZJTkVEIGluIFJFQURZLT5QQVVTRUQuCisKKzIwMDYtMDUtMjggMTM6MzA6MTMgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGV4dC9qcGVnL2dzdGpwZWdkZWMuKjogQ2xpcCBvdXRnb2luZyBidWZmZXJzIGFjY29yZGluZyB0byBjdXJyZW50bHkgY29uZmlndXJlZCBzZWdtZW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKGdzdF9qcGVnX2RlY19maW5hbGl6ZSksCisJICAoZ3N0X2pwZWdfZGVjX2luaXQpLCAoZ3N0X2pwZWdfZGVjX2NoYWluKSwKKwkgIChnc3RfanBlZ19kZWNfc2lua19ldmVudCksIChnc3RfanBlZ19kZWNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAgQ2xpcCBvdXRnb2luZyBidWZmZXJzIGFjY29yZGluZyB0byBjdXJyZW50bHkgY29uZmlndXJlZCBzZWdtZW50LgorCisyMDA2LTA1LTI4IDEwOjM5OjAwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOiBIYW5kbGUgIHdyaXRpbmcgb2YgdHJhY2stY291bnQgb3IgYWxidW0tdm9sdW1lLWNvdW50IHdpdGhvdXQgdHJhY2stbnVtYmVyIG9yIGFsYnVtZS12b2x1bWUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSAgSGFuZGxlICB3cml0aW5nIG9mIHRyYWNrLWNvdW50IG9yIGFsYnVtLXZvbHVtZS1jb3VudCB3aXRob3V0CisJICB0cmFjay1udW1iZXIgb3IgYWxidW1lLXZvbHVtZS1udW1iZXIgKGluIHRoaXMgY2FzZSB0aGUgbnVtYmVyCisJICB3aWxsIGp1c3QgYmUgc2V0IHRvIDApLgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jOiAodGVzdF90YWdsaWJfaWQzbXV4X2NoZWNrX3RhZ3MpOgorCSAgSXQgd291bGQgYmUgbmljZSBpZiB3ZSBhY3R1YWxseSBjaGVja2VkIHRoZSB2YWx1ZXMgcmVjZWl2ZWQgZm9yCisJICB0cmFjay9hbGJ1bS12b2x1bWUgbnVtYmVyL2NvdW50IGluICBfY2hlY2tfdGFncygpLCByYXRoZXIgdGhhbgorCSAgc2V0dGluZyB0aGVtIGFnYWluIC4uLgorCisyMDA2LTA1LTI4IDEwOjA1OjQ3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogQSB0cmFjay92b2x1bWUgbnVtYmVyIG9yIGNvdW50IG9mIDAgZG9lcyBub3QgbWFrZSBzZW5zZSwganVzdCBpZ25vcmUgaXQgYWxvbmcgd2l0aCBuZWdhdGkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKGlkM3YyX3RhZ190b190YWdsaXN0KToKKwkgIEEgdHJhY2svdm9sdW1lIG51bWJlciBvciBjb3VudCBvZiAwIGRvZXMgbm90IG1ha2Ugc2Vuc2UsCisJICBqdXN0IGlnbm9yZSBpdCBhbG9uZyB3aXRoIG5lZ2F0aXZlIG51bWJlcnMgKGEgdGFnIG1pZ2h0CisJICBvbmx5IGNvbnRhaW4gYSB0cmFjayBjb3VudCB3aXRob3V0IGEgdHJhY2sgbnVtYmVyKS4KKworMjAwNi0wNS0yNyAxMzoxMTozNyArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiBBYm9ydCBkZWNvbXByZXNzaW9uIHdoZW4gcmVjZWl2aW5nIEZMVVNIX1NUT1AuIFRoaXMgc2hvdWxkIGF2b2lkIGlzc3VlcyB3aGVuIGludGVycnVwdGluZyBkZWNvLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdfZGVjX2luaXQpLAorCSAgKGdzdF9qcGVnX2RlY19zaW5rX2V2ZW50KToKKwkgIEFib3J0IGRlY29tcHJlc3Npb24gd2hlbiByZWNlaXZpbmcgRkxVU0hfU1RPUC4gVGhpcyBzaG91bGQgYXZvaWQKKwkgIGlzc3VlcyB3aGVuIGludGVycnVwdGluZyBkZWNvZGluZyB3aXRoIGZsdXNoZXMuCisKKzIwMDYtMDUtMjcgMTI6MTA6NTAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9mbGFjL2dzdGZsYWMuYzogRG9uJ3QgI2luY2x1ZGUgZmlsZSB3ZSBkb24ndCBkaXN0IGFueSBsb25nZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhYy5jOgorCSAgRG9uJ3QgI2luY2x1ZGUgZmlsZSB3ZSBkb24ndCBkaXN0IGFueSBsb25nZXIuCisKKzIwMDYtMDUtMjcgMTE6Mjc6NTkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFJFQURNRTogUmVwbGFjZSBjdXJyZW50IFJFQURNRSAoY29udGFpbmluZyB0aGUgcmVsZWFzZSBub3RlcyBmcm9tIHNvbWUgMC45LnggdmVyc2lvbikgd2l0aCBhIHByb3BlciBSRUFETUUgdGFrZW4gZnJvbS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIFJFQURNRToKKwkgIFJlcGxhY2UgY3VycmVudCBSRUFETUUgKGNvbnRhaW5pbmcgdGhlIHJlbGVhc2Ugbm90ZXMgZnJvbQorCSAgc29tZSAwLjkueCB2ZXJzaW9uKSB3aXRoIGEgcHJvcGVyIFJFQURNRSB0YWtlbiBmcm9tIHRoZSBjb3JlLgorCisyMDA2LTA1LTI2IDIyOjM1OjAwICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9zcGVjdHJ1bS86IGFkZGVkIGFub3RoZXIgZXhhbXBsZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3NwZWN0cnVtL2RlbW8tYXVkaW90ZXN0LmM6IChvbl9mcmVxdWVuY3lfY2hhbmdlZCksCisJICAoc3BlY3RydW1fY2hhaW4pLCAobWFpbik6CisJICAqIGdzdC9zcGVjdHJ1bS9kZW1vLW9zc3NyYy5jOgorCSAgYWRkZWQgYW5vdGhlciBleGFtcGxlCisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIGZpeCB0eXBvCisKKzIwMDYtMDUtMjYgMTM6MTY6NTQgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQ2xpcCB0aGUgb3V0cHV0ZWQgTkVXU0VHTUVOVCBzdG9wIHRpbWUgdG8gdGhlIGNvbmZpZ3VyZWQgc2VnbWVudCBzdG9wIHRpbWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfYWN0aXZhdGVfc2VnbWVudCk6CisJICBDbGlwIHRoZSBvdXRwdXRlZCBORVdTRUdNRU5UIHN0b3AgdGltZSB0byB0aGUgY29uZmlndXJlZCBzZWdtZW50IHN0b3AKKwkgIHRpbWUuCisKKzIwMDYtMDUtMjYgMTE6NDg6NDQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRG9uJ3QgY2xlYXIgdGhlIHJ1bm5pbmcgdmFyaWFibGUgaW4gdGhlIHNlZWsgY29kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9kb19zZWVrKToKKwkgIERvbid0IGNsZWFyIHRoZSBydW5uaW5nIHZhcmlhYmxlIGluIHRoZSBzZWVrIGNvZGUuCisKKzIwMDYtMDUtMjQgMTY6MDM6NDAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9kdi9nc3RkdmRlbXV4LmM6IEltcGxlbWVudCBFT1MgY29ycmVjdGx5IGJ5IGVpdGhlciBwb3N0aW5nCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2xvb3ApOgorCSAgSW1wbGVtZW50IEVPUyBjb3JyZWN0bHkgYnkgZWl0aGVyIHBvc3RpbmcKKwkgIFNFR01FTlRfRE9ORSBvciBwdXNoaW5nIGFuIEVPUyBtZXNzYWdlIGRlcGVuZGluZworCSAgb24gdGhlIHNlZWsgdHlwZS4gRml4ZXMgIzM0MjU5MgorCisyMDA2LTA1LTI0IDExOjU2OjQzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IERldGVjdCBRQ0VMUCBpbiBtcDRhIGRlc2NyaXB0b3JzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2hhbmRsZV9lc2RzKToKKwkgIERldGVjdCBRQ0VMUCBpbiBtcDRhIGRlc2NyaXB0b3JzLgorCisyMDA2LTA1LTI0IDEwOjAwOjUwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvbGF3LzogU29tZSBjbGVhbnVwcyBpbiB0aGUgY2hhaW4gZnVuY3Rpb25zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzogKGdzdF9hbGF3ZGVjX2NoYWluKToKKwkgICogZ3N0L2xhdy9hbGF3LWRlY29kZS5oOgorCSAgKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6IChnc3RfYWxhd2VuY19jaGFpbik6CisJICAqIGdzdC9sYXcvYWxhdy1lbmNvZGUuaDoKKwkgICogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzogKGdzdF9tdWxhd2RlY19jaGFpbik6CisJICAqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmg6CisJICAqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6IChnc3RfbXVsYXdlbmNfY2hhaW4pOgorCSAgKiBnc3QvbGF3L211bGF3LWVuY29kZS5oOgorCSAgU29tZSBjbGVhbnVwcyBpbiB0aGUgY2hhaW4gZnVuY3Rpb25zLgorCSAgUmVtb3ZlIHNvbWUgR1N0cmVhbWVyIDAuMC4yIGJpdHMuCisKKzIwMDYtMDUtMjMgMjA6MTU6MDQgKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hbmF1d0Bza3luZXQuYmU+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogZ3N0X2NvbGxlY3RfcGFkc19zdG9wKCkgbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSBjaGFpbmluZyB1cCB0byB0aGUgcGFyZW50IGNsYXNzICgjMzQyNy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyAgPG1hbmF1dyBhdCBza3luZXQgYmU+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfY2hhbmdlX3N0YXRlKToKKwkgIGdzdF9jb2xsZWN0X3BhZHNfc3RvcCgpIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgY2hhaW5pbmcgdXAKKwkgIHRvIHRoZSBwYXJlbnQgY2xhc3MgKCMzNDI3MzQpLgorCisyMDA2LTA1LTIzIDE2OjQ1OjIyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy86IFJlbW92ZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjcnVmdCBmb3IgZGVhbGluZyB3aXRoIEZMQUMgQVBJIGNoYW5nZXMgaW4gdGhlIDEuMC54IHNlcmllcyAtIHdlIHJlcXVpcmUgMS4uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2ZsYWMvZmxhY19jb21wYXQuaDoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhYy5jOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfaW5pdCk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkgIFJlbW92ZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjcnVmdCBmb3IgZGVhbGluZyB3aXRoIEZMQUMgQVBJCisJICBjaGFuZ2VzIGluIHRoZSAxLjAueCBzZXJpZXMgLSB3ZSByZXF1aXJlIDEuMS4xIG9yIG5ld2VyIHRoZXNlIGRheXMuCisKKzIwMDYtMDUtMjMgMTM6NDQ6MTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS86IEFkZCBzdXBwb3J0IGZvciBtdXhpbmcvZGVtdXhpbmcgdGhlb3JhIHZpZGVvICgjMzQyNDQ4OyB0b28gYmFkIG5vbmUgb2YgdGhlIHVzdWFsIGxpbnV4IHBsYXllcnMgY2FuIGFjdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9zdHJlYW0pLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wdXNoX3hpcGhfY29kZWNfcHJpdl9kYXRhKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3ZpZGVvX2NhcHMpLCAoZ3N0X21hdHJvc2thX2RlbXV4X2F1ZGlvX2NhcHMpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfYmFzZV9pbml0KSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzKSwKKwkgICh4aXBoM19zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhKSwKKwkgICh2b3JiaXNfc3RyZWFtaGVhZGVyX3RvX2NvZGVjZGF0YSksCisJICAodGhlb3JhX3N0cmVhbWhlYWRlcl90b19jb2RlY2RhdGEpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX3NldGNhcHMpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfZGF0YSk6CisJICBBZGQgc3VwcG9ydCBmb3IgbXV4aW5nL2RlbXV4aW5nIHRoZW9yYSB2aWRlbyAoIzM0MjQ0ODsgdG9vIGJhZAorCSAgbm9uZSBvZiB0aGUgdXN1YWwgbGludXggcGxheWVycyBjYW4gYWN0dWFsbHkgcGxheSB0aGlzKS4gUGxheWJhY2sKKwkgIGluIEdTdHJlYW1lciB3aWxsIHJlcXVpcmUgYWRkaXRpb25hbCBjaGFuZ2VzIHRvIHRoZW9yYWRlYyBpbiAtYmFzZS4KKwkgIFJlZmFjdG9yIHN0cmVhbWhlYWRlcnMgPD0+IENvZGVjUHJpdmF0ZURhdGEgY29kZSBhIGJpdDsgc29tZSBzbWFsbAorCSAgY2xlYW51cHMuCisKKzIwMDYtMDUtMjIgMTg6MDA6NTIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogcG8vUE9URklMRVMuaW46CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKSwgKHBsdWdpbl9pbml0KToKKwkgIHBvL1BPVEZJTEVTLmluOgorCSAgVGhyb3cgYW4gZXJyb3Igd2hlbiB0aGUgZmlsZSBpcyBlbmNyeXB0ZWQuIE1vdmUgcGx1Z2luX2luaXQgc3R1ZmYKKwkgIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFkZCBzdHVmZiBmb3IgaTE4biwgbWFrZSBkZWJ1ZyBjYXRlZ29yeQorCSAgc3RhdGljLgorCisyMDA2LTA1LTIyIDE1OjIzOjA1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvanBlZy9nc3RqcGVnZGVjLmM6IEZpeCBjcmFzaGVzIHdoZW4gdGhlIGhvcml6b250YWwgc3Vic2FtcGxpbmcgaXMgMS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChocmVzYW1wbGVjcHkxKSwKKwkgIChnc3RfanBlZ19kZWNfZGVjb2RlX2luZGlyZWN0KSwgKGdzdF9qcGVnX2RlY19jaGFpbik6CisJICBGaXggY3Jhc2hlcyB3aGVuIHRoZSBob3Jpem9udGFsIHN1YnNhbXBsaW5nIGlzIDEuCisJICBGaXhlcyAjMzQyMDk3LgorCisyMDA2LTA1LTIyIDE0OjU2OjI5ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5Lmg6CisJICBjb3ZlciB1cCB0aGUgZGlydHkgdHJ1dGgKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgY292ZXIgdXAgdGhlIGRpcnR5IHRydXRoCisKKzIwMDYtMDUtMjIgMTM6NTM6MTggKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hbmF1d0Bza3luZXQuYmU+CisKKwkgIGdzdC9hdmkvZ3N0YXZpbXV4Lio6IC0gYWRkIG9kbWwgKGxhcmdlIGZpbGUpIGluZGV4IHN1cHBvcnQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE1hcmsgTmF1d2VsYWVydHMgIDxtYW5hdXcgYXQgc2t5bmV0IGJlPgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aV9tdXhfZmluYWxpemUpLCAoZ3N0X2F2aV9tdXhfaW5pdCksCisJICAoZ3N0X2F2aV9tdXhfdmlkc2lua19zZXRfY2FwcyksIChnc3RfYXZpX211eF9hdWRzaW5rX3NldF9jYXBzKSwKKwkgIChnc3RfYXZpX211eF93cml0ZV90YWcpLCAoZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpX2hlYWRlciksCisJICAoZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpeF9oZWFkZXIpLCAoZ3N0X2F2aV9tdXhfd3JpdGVfYXZpeF9pbmRleCksCisJICAoZ3N0X2F2aV9tdXhfYWRkX2luZGV4KSwgKGdzdF9hdmlfbXV4X2JpZ2ZpbGUpLAorCSAgKGdzdF9hdmlfbXV4X3N0YXJ0X2ZpbGUpLCAoZ3N0X2F2aV9tdXhfc3RvcF9maWxlKSwKKwkgIChnc3RfYXZpX211eF9oYW5kbGVfZXZlbnQpLCAoZ3N0X2F2aV9tdXhfZG9fYXVkaW9fYnVmZmVyKSwKKwkgIChnc3RfYXZpX211eF9kb192aWRlb19idWZmZXIpLCAoZ3N0X2F2aV9tdXhfZG9fb25lX2J1ZmZlciksCisJICAoZ3N0X2F2aV9tdXhfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguaDoKKwkgIFNvbWUgZW5oYW5jZW1lbnRzIGZvciBhdmltdXggKCMzNDI1MjYpOgorCSAgLSBhZGQgb2RtbCAobGFyZ2UgZmlsZSkgaW5kZXggc3VwcG9ydAorCSAgLSBzdG9yZSBjb2RlYyBpbml0IGRhdGEgKGUuZy4gaHVmZnl1dikKKwkgIC0gbWlzY2VsbGFuZW91cyBvdGhlciBmaXhlcy9jbGVhbnVwcworCisyMDA2LTA1LTIyIDEzOjUxOjMwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaWxiY3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtYXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6CisJICBmaXggZGVzY3JpcHRpb25zIGFuZCBsaWNlbnNlIGJsb2NrcyBjdXQgYW5kIHBhc3RlIGFueW9uZSA/CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCBkZXNjcmlwdGlvbnMgYW5kIGxpY2Vuc2UgYmxvY2tzCisJICBjdXQgYW5kIHBhc3RlIGFueW9uZSA/CisKKzIwMDYtMDUtMjEgMTY6NDE6NDQgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6IFVzZSBib2lsZXJwbGF0ZSBtYWNybywgZml4IHN0cmluZ3MgdG8gbWF0Y2ggcGx1Z2luLW1vdmFsLXJlcXVpcmVtZW50cworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zcGVjdHJ1bV9pbml0KSwgKGdzdF9zcGVjdHJ1bV9zZXRfc2lua19jYXBzKSwKKwkgIChnc3Rfc3BlY3RydW1fZ2V0X3NpbmtfY2FwcyksIChnc3Rfc3BlY3RydW1fY2hhaW4pOgorCSAgVXNlIGJvaWxlcnBsYXRlIG1hY3JvLCBmaXggc3RyaW5ncyB0byBtYXRjaCBwbHVnaW4tbW92YWwtcmVxdWlyZW1lbnRzCisKKzIwMDYtMDUtMjEgMTY6MjM6MjMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3NwZWN0cnVtL01ha2VmaWxlLmFtOiBMaW5rIHRvIGJhc2UgbGlicmFyaWVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3NwZWN0cnVtL01ha2VmaWxlLmFtOgorCSAgTGluayB0byBiYXNlIGxpYnJhcmllcworCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1vc3NzcmMuYzogKG1haW4pOgorCSAgdXNlIG5ldyB0aHJlc2hob2xkIHByb3BlcnR5CisJICAqIGdzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jOiAoZ3N0X3NwZWN0cnVtX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zcGVjdHJ1bV9pbml0KSwgKGdzdF9zcGVjdHJ1bV9kaXNwb3NlKSwKKwkgIChnc3Rfc3BlY3RydW1fc2V0X3Byb3BlcnR5KSwgKGdzdF9zcGVjdHJ1bV9zZXRfc2lua19jYXBzKSwKKwkgIChnc3Rfc3BlY3RydW1fZ2V0X3NpbmtfY2FwcyksIChnc3Rfc3BlY3RydW1fY2hhaW4pLAorCSAgKGdzdF9zcGVjdHJ1bV9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uaDoKKwkgIFVzZSBnc3RfYWRhcHRlciwgc3VwcG9ydCBtdWx0aXBsZS1jaGFubmVscywgYWRkIHRocmVzaG9sZCBwcm9wZXJ0eSBmb3IKKwkgIHJlc3VsdCwgYWRkIGRvY3MsIGZpeCByZXN1bHRpbmcgc3BlY3RydW0gcmFuZ2UgKHdhcyBpbmNsdWRpbmcgbWlycm9yZWQKKwkgIHJlc3VsdHMpCisKKzIwMDYtMDUtMjAgMjI6NDI6MTUgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgSW5pdGlhbCBwb3J0IG9mIHRoZSBzcGVjdHJ1bSBlbGVtZW50CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3Qvc3BlY3RydW0vZGVtby1vc3NzcmMuYzogKHNwZWN0cnVtX2NoYWluKSwgKG1haW4pOgorCSAgKiBnc3Qvc3BlY3RydW0vZml4X2ZmdC5jOiAoZ3N0X3NwZWN0cnVtX2ZpeF9kb3QpOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogKGdzdF9zcGVjdHJ1bV9nZXRfdHlwZSksCisJICAoZ3N0X3NwZWN0cnVtX2Jhc2VfaW5pdCksIChnc3Rfc3BlY3RydW1fY2xhc3NfaW5pdCksCisJICAoZ3N0X3NwZWN0cnVtX2luaXQpLCAoZ3N0X3NwZWN0cnVtX2Rpc3Bvc2UpLAorCSAgKGdzdF9zcGVjdHJ1bV9zZXRfcHJvcGVydHkpLCAoZ3N0X3NwZWN0cnVtX2NoYWluKToKKwkgICogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmg6CisJICBJbml0aWFsIHBvcnQgb2YgdGhlIHNwZWN0cnVtIGVsZW1lbnQKKworMjAwNi0wNS0xOSAxODo1ODowNSArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYzoKKwkgIEkgZm9yZ2V0IHRvIGFkZCBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYyBpbiBsYXMgY29tbWl0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEkgZm9yZ2V0IHRvIGFkZCBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYyBpbiBsYXMgY29tbWl0CisKKzIwMDYtMDUtMTkgMTg6MzE6MjUgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogc3lzL3Y0bDIvZ3N0djRsMi5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgU29tZSBjbGVhbi11cHMgcmVxdWVzdGVkIGJ5IHdpbmdvIGluIGJ1ZyAjMzM4ODE4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBTb21lIGNsZWFuLXVwcyByZXF1ZXN0ZWQgYnkgd2luZ28gaW4gYnVnICMzMzg4MTguCisKKzIwMDYtMDUtMTkgMTQ6MDU6NTMgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogRG9uJ3Qgb3V0cHV0IGFueSB0YWcgd2hlbiB3ZSBlbmNvdW50ZXIgYSBuZWdhdGl2ZSB0cmFjayBudW1iZXIgLSB0aGUgdGFnIHR5cGUgaXMgdWludCwgc28uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKGlkM3YyX3RhZ190b190YWdsaXN0KToKKwkgIERvbid0IG91dHB1dCBhbnkgdGFnIHdoZW4gd2UgZW5jb3VudGVyIGEgbmVnYXRpdmUgdHJhY2sgbnVtYmVyIC0gdGhlCisJICB0YWcgdHlwZSBpcyB1aW50LCBzbyB3ZSBlbmQgdXAgb3V0cHV0dGluZyBodWdlIHBvc2l0aXZlIG51bWJlcnMKKwkgIGluc3RlYWQuIChGaXhlczogIzM0MjAyOSkKKworMjAwNi0wNS0xOCAyMzowNDo1OSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGNvbmZpZ3VyZS5hYzogdXBkYXRlIGZvciBuZXcgR1NUUEJfUExVR0lOU19ESVIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICB1cGRhdGUgZm9yIG5ldyBHU1RQQl9QTFVHSU5TX0RJUgorCisyMDA2LTA1LTE4IDE5OjM0OjQ3ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogQ2hlY2sgZm9yIFgxMQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIENoZWNrIGZvciBYMTEKKwkgICogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOiAoZ3N0X3Y0bDJfY2xhc3NfcHJvYmVfZGV2aWNlcyk6CisJICAqIHN5cy92NGwyL2dzdHY0bDJvYmplY3QuaDoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfaWZhY2Vfc3VwcG9ydGVkKToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYzogKGdzdF92NGwyX3hvdmVybGF5X29wZW4pOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuaDoKKwkgIENvZGUgY2xlYW51cHMsIGZpeCBkZWJ1ZyBtYWNyb3MKKworMjAwNi0wNS0xOCAxNDo0NTozMyArMDAwMCAgUGhpbGlwcGUgS2FsYWYgPHBoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51az4KKworCSAgcnRwL2dzdC9nc3RydHBoMjYzcGF5LmM6IFByb3Blcmx5IHNldCBzdGF0aWMgY2FwcyBmb3IgSDI2MyBhdCAzNC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wNS0xOCAgUGhpbGlwcGUgS2FsYWYgIDxwaGlsaXBwZS5rYWxhZiBhdCBjb2xsYWJvcmEuY28udWs+CisJICAqIHJ0cC9nc3QvZ3N0cnRwaDI2M3BheS5jOgorCSAgUHJvcGVybHkgc2V0IHN0YXRpYyBjYXBzIGZvciBIMjYzIGF0IDM0LgorCisyMDA2LTA1LTE4IDEyOjQ2OjA4ICswMDAwICBKYW1lcyBEb2MgTGl2aW5nc3RvbiA8ZG9jbGl2aW5nc3RvbkBnbWFpbC5jb20+CisKKwkgIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4LmM6IE1lcmdlIGV2ZW50IHRhZ3MgYW5kIHRhZyBzZXR0ZXIgdGFncyBjb3JyZWN0bHkgKCMzMzk5MTgpLiBBbHNvLCBkb24ndCBsZWFrIHRhZ2xpc3QgaW4gY2FzZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSmFtZXMgIkRvYyIgTGl2aW5nc3RvbiAgPGRvY2xpdmluZ3N0b24gZ21haWwgY29tPgorCSAgKiBleHQvdGFnbGliL2dzdHRhZ2xpYm11eC5jOiAoZ3N0X3RhZ19saWJfbXV4X3JlbmRlcl90YWcpOgorCSAgTWVyZ2UgZXZlbnQgdGFncyBhbmQgdGFnIHNldHRlciB0YWdzIGNvcnJlY3RseSAoIzMzOTkxOCkuIEFsc28sCisJICBkb24ndCBsZWFrIHRhZ2xpc3QgaW4gY2FzZSBvZiBhbiBlcnJvci4KKworMjAwNi0wNS0xNyAxODowOTowNiArMDAwMCAgUGhpbGlwcGUgS2FsYWYgPHBoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51az4KKworCSogY29tbW9uOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJICBGaXhlZCBjYXBzIGZvciBIMjYzIChub3QgdGhlIHNhbWUgYXMgSDI2MyspCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEZpeGVkIGNhcHMgZm9yIEgyNjMgKG5vdCB0aGUgc2FtZSBhcyBIMjYzKykKKworMjAwNi0wNS0xNyAxMjozNjoyNiArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzogV2UgY2FuIG9ubHkgZG8gY2FwcyBpbnRlcnNlY3Rpb24gaWYgdGhlIG90aGVyY2FwcyBhcmUgbm9uLWVtcHR5IGFuZCBub3QKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOiAobXVsYXdkZWNfZ2V0Y2Fwcyk6CisJICBXZSBjYW4gb25seSBkbyBjYXBzIGludGVyc2VjdGlvbiBpZiB0aGUgb3RoZXJjYXBzIGFyZSBub24tZW1wdHkgYW5kIG5vdAorCSAgQU5ZLiBFbHNlIHdlIHJldHVybiB0aGUgcGFkIHRlbXBsYXRlIChiYXNlX2NhcHMpLgorCisyMDA2LTA1LTE3IDExOjIwOjQ0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvanBlZy9nc3RqcGVnZGVjLmM6IEZpeCBjcmFzaCB3aGVuIG91dHB1dHRpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBjZXJ0YWluIHBpY3R1cmVzIChhbHdheXMgZ29vZCB0byB1c2UgdGhlIHIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChnc3RfanBlZ19kZWNfY2hhaW4pOgorCSAgRml4IGNyYXNoIHdoZW4gb3V0cHV0dGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGNlcnRhaW4KKwkgIHBpY3R1cmVzIChhbHdheXMgZ29vZCB0byB1c2UgdGhlIHJpZ2h0IHN0cnVjdCBtZW1iZXIgZm9yCisJICB0aGUgbnVtYmVyIG9mIHJlY29yZHMgaW4gYW4gYXJyYXkpLgorCisyMDA2LTA1LTE3IDA4OjEwOjMxICswMDAwICBKaW5kcmljaCBNYWtvdmlja2EgPGppbmRyaWNoLm1ha2l2aWNrYUBpdG9uaXMudHY+CisKKwkgIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogRG9uJ3QgY3JlYXRlIHVubmVjZXNzYXJ5IHN1Yi1idWZmZXJzIGFsbCB0aGUgdGltZS4gRHJhbWF0aWNhbGx5IGltcHJvdmVzIHBlcmZvcm1hbmNlIHdpdGggbS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogSmluZHJpY2ggTWFrb3ZpY2thICA8amluZHJpY2gubWFraXZpY2thIGF0IGl0b25pcyB0dj4KKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOiAoZ3N0X2VibWxfcmVhZF9wZWVrX2J5dGVzKSwKKwkgIChnc3RfZWJtbF9yZWFkX3B1bGxfYnl0ZXMpLCAoZ3N0X2VibWxfcmVhZF9lbGVtZW50X2lkKSwKKwkgIChnc3RfZWJtbF9yZWFkX2VsZW1lbnRfbGVuZ3RoKSwgKGdzdF9lYm1sX3JlYWRfYnVmZmVyKSwKKwkgIChnc3RfZWJtbF9yZWFkX2J5dGVzKSwgKGdzdF9lYm1sX3JlYWRfdWludCksIChnc3RfZWJtbF9yZWFkX3NpbnQpLAorCSAgKGdzdF9lYm1sX3JlYWRfZmxvYXQpLCAoZ3N0X2VibWxfcmVhZF9hc2NpaSksCisJICAoZ3N0X2VibWxfcmVhZF9iaW5hcnkpOgorCSAgRG9uJ3QgY3JlYXRlIHVubmVjZXNzYXJ5IHN1Yi1idWZmZXJzIGFsbCB0aGUgdGltZS4gRHJhbWF0aWNhbGx5CisJICBpbXByb3ZlcyBwZXJmb3JtYW5jZSB3aXRoIG11bHRpcGxlIGNvbmN1cnJlbnRseSBydW5uaW5nCisJICBtYXRyb3NrYWRlbXV4IGluc3RhbmNlcyAoIzM0MTgxOCkgKGFuZCBhdm9pZHMgZG9pbmcKKwkgIHVubmVjZXNzYXJpbHkgaW5lZmZpY2llbnQgdGhpbmdzIGluIHRoZSBnZW5lcmFsIGNhc2UpLgorCisyMDA2LTA1LTE2IDE3OjIwOjA0ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiBJbiBzbmFwc2hvdCBtb2RlLCB3ZSBhbHdheXMgcmV0dXJuIEdTVF9GTE9XX1VORVhQRUNURUQgd2hhdGV2ZXIgdGhlIHJldHVybiB2YWx1ZSBvZiBnc3RfcGFkX3AuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiAoZ3N0X3BuZ2VuY19jaGFpbik6CisJICBJbiBzbmFwc2hvdCBtb2RlLCB3ZSBhbHdheXMgcmV0dXJuIEdTVF9GTE9XX1VORVhQRUNURUQgd2hhdGV2ZXIgdGhlCisJICByZXR1cm4gdmFsdWUgb2YgZ3N0X3BhZF9wdXNoX2V2ZW50KCkuCisKKzIwMDYtMDUtMTYgMTQ6MDc6MjkgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvYXV0b2RldGVjdC86IE1ha2UgdGhlIG5hbWUgb2YgdGhlIGNoaWxkIGVsZW1lbnQgYmUgYmFzZWQgb24gdGhlIG5hbWUgb2YgdGhlIHBhcmVudCwgc28gdGhhdCBkZWJ1ZyBvdXRwdXQgaXMgbW9yZSAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJICAoZ3N0X2F1dG9fYXVkaW9fc2lua19maW5kX2Jlc3QpOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJICAoZ3N0X2F1dG9fdmlkZW9fc2lua19maW5kX2Jlc3QpOgorCSAgTWFrZSB0aGUgbmFtZSBvZiB0aGUgY2hpbGQgZWxlbWVudCBiZSBiYXNlZCBvbiB0aGUgbmFtZSBvZiB0aGUKKwkgIHBhcmVudCwgc28gdGhhdCBkZWJ1ZyBvdXRwdXQgaXMgbW9yZSB1c2VmdWwuCisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAoZmluZF91dGYxNl9ib20pLAorCSAgKHBhcnNlX2luc2VydF9zdHJpbmdfZmllbGQpLCAocGFyc2Vfc3BsaXRfc3RyaW5ncyk6CisJICBSZXdvcmsgc3RyaW5nIHBhcnNpbmcgdG8gYWx3YXlzIHdhbGsgb3ZlciBCT00gbWFya2VycyBpbiBVVEYxNgorCSAgc3RyaW5ncywgdXNpbmcgdGhlIGVuZGlhbm5lc3MgaW5kaWNhdGVkIGJ5IHRoZSBpbm5lcm1vc3Qgb25lLAorCSAgdGhlbiB0cnlpbmcgdGhlIG9wcG9zaXRlIGVuZGlhbm5lc3MgaWYgdGhhdCBmYWlscyB0byBjb252ZXJ0CisJICB0byB2YWxpZCBVVEYtOC4gRml4ZXMgIzM0MTc3NAorCisyMDA2LTA1LTE2IDEzOjMxOjAyICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBleHQvbGlicG5nL01ha2VmaWxlLmFtOiBBZGQgTElCUE5HX0NGTEFHUy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wNS0xNiAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCSAgUGF0Y2ggZnJvbTogTWF0dGhpZXUgPG1hdHRoaWV1IGF0IGZsdWVuZG8gZG90IGNvbT4KKwkgICogZXh0L2xpYnBuZy9NYWtlZmlsZS5hbToKKwkgIEFkZCBMSUJQTkdfQ0ZMQUdTLgorCisyMDA2LTA1LTE1IDExOjIwOjIxICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIHVwZGF0ZSB3aXRoIGxhdGVzdCBjaGFuZ2VzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHVwZGF0ZSB3aXRoIGxhdGVzdCBjaGFuZ2VzCisKKzIwMDYtMDUtMTUgMDk6MDA6NDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6IEFkZCBzdXBwb3J0IGZvciB3cml0aW5nIGltYWdlcyAoQVBJQyBmcmFtZXMpIGludG8gSUQzdjIgdGFncyAocGljdHVyZSB0eXBlIGFsd2F5cyBzZXQgdG8gJy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJICBBZGQgc3VwcG9ydCBmb3Igd3JpdGluZyBpbWFnZXMgKEFQSUMgZnJhbWVzKSBpbnRvIElEM3YyCisJICB0YWdzIChwaWN0dXJlIHR5cGUgYWx3YXlzIHNldCB0byAnb3RoZXInIGZvciBub3cgdGhvdWdoKS4KKworMjAwNi0wNS0xNCAxMjo1MDowNyArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogVXBkYXRlIGRvY3M7IHdhdnBhcnNlIGltcGxlbWVudHMgcHVzaCBhbmQgcHVsbCBtb2Rlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIFVwZGF0ZSBkb2NzOyB3YXZwYXJzZSBpbXBsZW1lbnRzIHB1c2ggYW5kIHB1bGwgbW9kZXMuCisKKzIwMDYtMDUtMTIgMTg6MTA6MzYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogT29vcHMsIGJpdHRlbiBieSB0aGUgY29weS1hbmQtcGFzdGUgZGVzaWduIHBhcmFkaWdtLCBmaXhlcyBzZWVrIGFnYWluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaW5kZXhfbmV4dCksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9pbmRleCksIChnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspLCAoZ3N0X2F2aV9kZW11eF9sb29wKToKKwkgIE9vb3BzLCBiaXR0ZW4gYnkgdGhlIGNvcHktYW5kLXBhc3RlIGRlc2lnbiBwYXJhZGlnbSwgZml4ZXMKKwkgIHNlZWsgYWdhaW4uCisKKzIwMDYtMDUtMTIgMTg6MDQ6MjIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguKjogU29tZSBjbGVhbnVwcywgcHJlcGFyZSB0byB1c2UgR3N0U2VnbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfYXZpX2RlbXV4X2luZGV4X25leHQpLCAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwKKwkgIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLCAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdWJpbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0pLCAoZ3N0X2F2aV9kZW11eF9wYXJzZV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5kZXgpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fc2NhbiksCisJICAoZ3N0X2F2aV9kZW11eF9tYXNzYWdlX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X2NhbGN1bGF0ZV9kdXJhdGlvbnNfZnJvbV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9wdXNoX2V2ZW50KSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlciksCisJICAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc2VlayksIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksCisJICAoZ3N0X2F2aV9kZW11eF9sb29wKToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgU29tZSBjbGVhbnVwcywgcHJlcGFyZSB0byB1c2UgR3N0U2VnbWVudC4KKwkgIEZpeCBlcnJvciBpbiBlbnRyeSB3YWxraW5nIGNvZGUuCisJICBGaXggVkJSIGRldGVjdGlvbi4KKwkgIFNtYXJ0ZXIgdGltZXN0YW1wIGNhbGN1bGF0aW9uIGNvZGUuCisJICBVbmlmb3JtIGVycm9yL2VvcyBoYW5kbGluZy4KKworMjAwNi0wNS0xMiAxNzo0NDoxNSArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogRml4IHVzZSBvZiB1bmluaXRpYWxpc2VkIHZhbHVlcyBpZiB3ZSdyZSBOT1Qgc2Vla2luZyBpbiByZWFkeS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9mbXQpLAorCSAgKGdzdF93YXZwYXJzZV9wZXJmb3JtX3NlZWspLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKToKKwkgIEZpeCB1c2Ugb2YgdW5pbml0aWFsaXNlZCB2YWx1ZXMgaWYgd2UncmUgTk9UIHNlZWtpbmcgaW4gcmVhZHkuCisJICBGaXggdHlwb3MuCisKKzIwMDYtMDUtMTIgMDg6MjM6MTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9NYWtlZmlsZS5hbTogQWRkIENGTEFHUyBhbmQgTElCUyBmb3IgbGliZ3N0YmFzZSwgZml4ZXMgYnVpbGQgb24KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvTWFrZWZpbGUuYW06CisJICBBZGQgQ0ZMQUdTIGFuZCBMSUJTIGZvciBsaWJnc3RiYXNlLCBmaXhlcyBidWlsZCBvbgorCSAgQ3lnd2luICgjMzQxNDg5KS4KKworMjAwNi0wNS0xMiAwODoyMTozNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IFNvbWUgbW9yZSBkZWJ1ZyBpbmZvLiBObyBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHN0cmluZyByZXR1cm5lZCBieSBnX2NvbnZlcnQoKSBpcyByZWFsLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChwYXJzZV9pbnNlcnRfc3RyaW5nX2ZpZWxkKToKKwkgIFNvbWUgbW9yZSBkZWJ1ZyBpbmZvLiBObyBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHN0cmluZworCSAgcmV0dXJuZWQgYnkgZ19jb252ZXJ0KCkgaXMgcmVhbGx5IFVURi04IC0gZWl0aGVyIGl0IGlzIG9yCisJICB3ZSBnZXQgTlVMTCByZXR1cm5lZC4KKworMjAwNi0wNS0xMSAxNzo1OTo1OSArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnhvdmVybGF5Lmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmg6CisJICBDaGFuZ2VzIHByb3Bvc2VkIGJ5IFdpbmdvIGluIGJ1ZyAjMzM4ODE4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBDaGFuZ2VzIHByb3Bvc2VkIGJ5IFdpbmdvIGluIGJ1ZyAjMzM4ODE4LgorCisyMDA2LTA1LTExIDA5OjA5OjQ5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEZpZ3VyZSBvdXQgdGhlIHJlYWwgYXVkaW8gdHlwZSBpbiBtcDRhIGJveGVzIGJ5IHBhcnNpbmcgdGhlIG9wdGlvbmFsIGRlc2NyaXB0b3JzIGluIHRoZSBvcHRpb24uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayksCisJICAoZ3N0X3F0ZGVtdXhfaGFuZGxlX2VzZHMpOgorCSAgRmlndXJlIG91dCB0aGUgcmVhbCBhdWRpbyB0eXBlIGluIG1wNGEgYm94ZXMgYnkgcGFyc2luZyB0aGUKKwkgIG9wdGlvbmFsIGRlc2NyaXB0b3JzIGluIHRoZSBvcHRpb25hbCBlc2RzIGJveC4gUHJvbW90ZSB0aGUKKwkgIGRlZmF1bHQgQUFDIHRvIG1wMyB3aGVuIGluZGljYXRlZC4gRml4ZXMgIzMzMDYzMi4KKworMjAwNi0wNS0xMCAxNzo0NDo1MCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBQYXJzZSB2ZXJzaW9uIDIgc2FtcGxlIGRlc2NyaXB0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlKSwgKHF0ZGVtdXhfZHVtcF91bmtub3duKSwKKwkgIChxdGRlbXV4X3BhcnNlX3RyYWspLCAoZ3N0X3F0ZGVtdXhfaGFuZGxlX2VzZHMpOgorCSAgUGFyc2UgdmVyc2lvbiAyIHNhbXBsZSBkZXNjcmlwdGlvbnMuCisJICBEb24ndCAjZGVmaW5lIGdzdF91dGlsX2R1bXBfbWVtKCksIHVzZSBzb21ldGhpbmcgbW9yZQorCSAgc3BlY2lmaWMgaW5zdGVhZCB0byBhdm9pZCBjb25mdXNpb24uCisKKzIwMDYtMDUtMTAgMTM6NTE6MDEgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogRml4IHBhcnNpbmcgb2YgbnVtZXJpYyBnZW5yZSBzdHJpbmdzIHNvbWUgbW9yZSwgYnkgZW5zdXJpbmcgdGhhdCB3ZSBvbmx5IHRyeSBhbmQgcGFyc2Ugc3QuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKGlkM3YyX2dlbnJlX2ZpZWxkc190b190YWdsaXN0KToKKwkgIEZpeCBwYXJzaW5nIG9mIG51bWVyaWMgZ2VucmUgc3RyaW5ncyBzb21lIG1vcmUsIGJ5IGVuc3VyaW5nIHRoYXQKKwkgIHdlIG9ubHkgdHJ5IGFuZCBwYXJzZSBzdHJpbmdzIHRoYXQgYSkgU3RhcnQgd2l0aCAnKCcgYW5kIGIpIENvbnNpc3QKKwkgIG9ubHkgb2YgZGlnaXRzLgorCSAgQWxzbywgd2hlbiBmaW5kaW5nIGFuIGVzY2FwaW5nICcoKCcgc2VxdWVuY2UsIGJ1c3QgaXQgYmFjayB0byAnKCcgYnkKKwkgIHN3YWxsb3dpbmcgdGhlIGZpcnN0IHBhcmVudGhlc2lzCisKKzIwMDYtMDUtMTAgMTE6MTc6MzEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9lc2QvZXNkc2luay4qOiBNb3ZlIHRoZSBlc2RfZ2V0X3NlcnZlcl9pbmZvKCkgaW50byBnc3RfZXNkc2lua19vcGVuKCkgYW5kIGZhaWwgd2l0aCBhIGRlY2VudCBlcnJvciBtZXNzYWdlIG9uIGVyci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfZmluYWxpemUpLCAoZ3N0X2VzZHNpbmtfZ2V0Y2FwcyksCisJICAoZ3N0X2VzZHNpbmtfb3BlbiksIChnc3RfZXNkc2lua19jbG9zZSk6CisJICAqIGV4dC9lc2QvZXNkc2luay5oOgorCSAgTW92ZSB0aGUgZXNkX2dldF9zZXJ2ZXJfaW5mbygpIGludG8gZ3N0X2VzZHNpbmtfb3BlbigpIGFuZCBmYWlsCisJICB3aXRoIGEgZGVjZW50IGVycm9yIG1lc3NhZ2Ugb24gZXJyb3JzLgorCisyMDA2LTA1LTEwIDEwOjI5OjU0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBDb25zdC1pZnkgR0VudW1WYWx1ZSBhcnJheXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2VzZC9lc2Rtb24uYzogKGdzdF9lc2Rtb25fZGVwdGhzX2dldF90eXBlKSwKKwkgIChnc3RfZXNkbW9uX2NoYW5uZWxzX2dldF90eXBlKToKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmM6IChnc3RfZ2NvbmZfcHJvZmlsZV9nZXRfdHlwZSk6CisJICAqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6IChnc3RfcGl4YnVmc2NhbGVfbWV0aG9kX2dldF90eXBlKToKKwkgICogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzogKGdzdF9jYWNhc2lua19kaXRoZXJfZ2V0X3R5cGUpOgorCSAgKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOiAoZ3N0X3Nob3V0MnNlbmRfcHJvdG9jb2xfZ2V0X3R5cGUpOgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogKGdzdF9hbHBoYV9tZXRob2RfZ2V0X3R5cGUpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOiAoZ3N0X2lsYmNfbW9kZV9nZXRfdHlwZSk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwX3Byb3RvX2dldF90eXBlKToKKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2ZpbGxfZ2V0X3R5cGUpOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6IChnc3RfdmlkZW9fZmxpcF9tZXRob2RfZ2V0X3R5cGUpOgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICAoZ3N0X3ZpZGVvX21peGVyX2JhY2tncm91bmRfZ2V0X3R5cGUpOgorCSAgQ29uc3QtaWZ5IEdFbnVtVmFsdWUgYXJyYXlzLgorCisyMDA2LTA1LTA5IDE0OjA4OjE1ICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJldD4KKworCSAgZ3N0L2F2aS9nc3RhdmltdXguYzogV29yayBhcm91bmQgZ3N0X2J1ZmZlcl9tYWtlX21ldGFkYXRhX3dyaXRhYmxlKCkgYnVnIHRoYXQgcmVzdWx0cyBpbiBhdmltdXggbWFya2luZyBhbGwgZnJhbWVzIGluLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBNYXJrIE5hdXdlbGFlcnRzICA8bWFuYXV3IGF0IHNreW5ldCBiZXQ+CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpX211eF9kb19hdWRpb19idWZmZXIpLAorCSAgKGdzdF9hdmlfbXV4X2RvX3ZpZGVvX2J1ZmZlcik6CisJICBXb3JrIGFyb3VuZCBnc3RfYnVmZmVyX21ha2VfbWV0YWRhdGFfd3JpdGFibGUoKSBidWcgdGhhdAorCSAgcmVzdWx0cyBpbiBhdmltdXggbWFya2luZyBhbGwgZnJhbWVzIGluIHRoZSBpbmRleCBhcworCSAga2V5ZnJhbWVzICgjMzQwODU5KS4KKworMjAwNi0wNS0wOCAxOToyMToxOCArMDAwMCAgTWFydGluIFJ1YmxpIDxtYXJ0aW5fcnVibGlAbG9naXRlY2guY29tPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJICBGaXggZm91cmNjIG5hbWUgcHJpbnRlZCBvdXQuIFBhdGNoIGZyb20gTWFydGluIFJ1YmxpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGaXggZm91cmNjIG5hbWUgcHJpbnRlZCBvdXQuIFBhdGNoIGZyb20gTWFydGluIFJ1YmxpLgorCisyMDA2LTA1LTA4IDE1OjIwOjEwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IERvbid0IGNhdXNlIHNpZGUgZWZmZWN0cyBpbiBhIGRlYnVnZ2luZyBmdW5jdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwKKwkgIChxdGRlbXV4X2R1bXBfbXZoZCk6CisJICBEb24ndCBjYXVzZSBzaWRlIGVmZmVjdHMgaW4gYSBkZWJ1Z2dpbmcgZnVuY3Rpb24uCisJICBBbHNvIHJlcG9ydCBkdXJhdGlvbiBpbiBwdXNoIG1vZGUgc2luY2Ugd2UgY2FuLgorCisyMDA2LTA1LTA4IDE0OjM1OjIwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9ydHNwdXJsLmM6IE1ha2UgcGFyc2luZyBvZiB1cmxzIHN1Y2sgc2xpZ2h0bHkgbGVzcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9ydHNwdXJsLmM6IChydHNwX3VybF9wYXJzZSk6CisJICBNYWtlIHBhcnNpbmcgb2YgdXJscyBzdWNrIHNsaWdodGx5IGxlc3MuCisKKzIwMDYtMDUtMDggMTE6NTM6MDMgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGF1dG9nZW4uc2g6IGxpYnRvb2xpemUgb24gRGFyd2luL01hY09TWCBpcyBjYWxsZWQgZ2xpYnRvb2xpemUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogYXV0b2dlbi5zaDogKENPTkZJR1VSRV9ERUZfT1BUKToKKwkgIGxpYnRvb2xpemUgb24gRGFyd2luL01hY09TWCBpcyBjYWxsZWQgZ2xpYnRvb2xpemUuCisKKzIwMDYtMDUtMDggMTA6NTk6MDUgKzAwMDAgIEplbnMgR3JhbnNldWVyIDxqZW5zZ3JAZ214Lm5ldD4KKworCSAgQzg5IGNvbXBsaWFuY2UgZml4ZXMuIEZpeGVzICMzNDA5ODAKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEplbnMgR3JhbnNldWVyIDxqZW5zZ3IgYXQgZ214IGRvdCBuZXQ+CisJICAqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6IChnc3RfcGl4YnVmc2NhbGVfaW5pdCk6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2Rpc3Bvc2UpOgorCSAgQzg5IGNvbXBsaWFuY2UgZml4ZXMuIEZpeGVzICMzNDA5ODAKKworMjAwNi0wNS0wNiAwOTowMTozNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy4qOiBIYW5kbGUgc2VnbWVudCBzZWVrcyB0aGF0IGluY2x1ZGUgdGhlIGVuZCBvZiB0aGUgZmlsZSBhcyBzdG9wIHBvaW50IHByb3Blcmx5OiB3aGVuIHRoZSBkZWNvZGVyLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX2xvb3ApOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmg6CisJICBIYW5kbGUgc2VnbWVudCBzZWVrcyB0aGF0IGluY2x1ZGUgdGhlIGVuZCBvZiB0aGUgZmlsZSBhcyBzdG9wIHBvaW50CisJICBwcm9wZXJseTogd2hlbiB0aGUgZGVjb2RlciBoaXRzIEVPUyB3ZSB3YW50IHRvIHNlbmQgYSBTRUdNRU5UX0RPTkUKKwkgIG1lc3NhZ2UgaW5zdGVhZCBvZiBhbiBFT1MgZXZlbnQgaW4gY2FzZSB3ZSdyZSBpbiBzZWdtZW50IHNlZWsKKwkgIG1vZGUgKGZpeGVzICMzNDA2OTkpLgorCisyMDA2LTA1LTA2IDAwOjE0OjA5ICswMDAwICBNYWNpZWogS2F0YWZpYXN6IDxtYXRocmlja0BtYXRocmljay5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYzoKKwkqIGdzdC9kZWJ1Zy9icmVha215ZGF0YS5jOgorCSogZ3N0L2RlYnVnL3Rlc3RwbHVnaW4uYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzoKKwkgIEFkZCBzZW1pY29sb25zIGFmdGVyIEdTVF9CT0lMRVJQTEFURVtfRlVMTF0gc28gdGhhdCBpbmRlbnQgZG9lc24ndCBtZXNzIHVwIGZvbGxvd2luZyBsaW5lcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQWRkIHNlbWljb2xvbnMgYWZ0ZXIgR1NUX0JPSUxFUlBMQVRFW19GVUxMXSBzbyB0aGF0IGluZGVudCBkb2Vzbid0IG1lc3MgdXAgZm9sbG93aW5nIGxpbmVzLgorCisyMDA2LTA1LTA1IDIwOjEyOjU5ICswMDAwICBNYXJ0aW4gUnVibGkgPG1hcnRpbl9ydWJsaUBsb2dpdGVjaC5jb20+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuaDoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuaDoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuaDoKKwkqIHRlc3RzL2ljbGVzL3Y0bDJzcmMtdGVzdC5jOgorCSAgU29tZSBjaGFuZ2VzIHByb3Bvc2VkIGJ5IHdpbmdvIGluIGJ1ZyAjMzM4ODE4IChidXQgbm90IGV2ZXJ5dGhpbmcgeWV0KS4gUGF0Y2ggZnJvbSBNYXJ0aW4gUnVibGkgdG8gZml4IGZyYW1lcmF0ZSBkZXRlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFNvbWUgY2hhbmdlcyBwcm9wb3NlZCBieSB3aW5nbyBpbiBidWcgIzMzODgxOCAoYnV0IG5vdCBldmVyeXRoaW5nIHlldCkuIFBhdGNoIGZyb20gTWFydGluIFJ1YmxpIHRvIGZpeCBmcmFtZXJhdGUgZGV0ZWN0aW9uLgorCisyMDA2LTA1LTA0IDE3OjI3OjI3ICswMDAwICBNaWNoYWwgQmVuZXMgPG1pY2hhbC5iZW5lc0B4ZXJpcy5jej4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IERvbid0IGxlYWsgY2FwcyB3aGVuIGZyZWVpbmcgdGhlIHN0cmVhbSBjb250ZXh0ICgjMzQwNjIzKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE1pY2hhbCBCZW5lcyAgPG1pY2hhbCBkb3QgYmVuZXMgYXQgeGVyaXMgZG90IGN6PgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9yZXNldCk6CisJICBEb24ndCBsZWFrIGNhcHMgd2hlbiBmcmVlaW5nIHRoZSBzdHJlYW0gY29udGV4dCAoIzM0MDYyMykuCisKKzIwMDYtMDUtMDQgMTU6NDA6MTggKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBjb25maWd1cmUuYWM6IEJhY2sgdG8gQ1ZTCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBDVlMKKworPT09IHJlbGVhc2UgMC4xMC4zID09PQorCisyMDA2LTA1LTA0IDE1OjM2OjAyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWN5ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkqIHdpbjMyL2NvbW1vbi9jb25maWcuaDoKKwkgIFJlYWxseSByZWxlYXNlIDAuMTAuMworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBSZWFsbHkgcmVsZWFzZSAwLjEwLjMKKworMjAwNi0wNS0wNCAxNToyODo1MyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdGRlbXV4LnhtbDoKKwkgIFJlYWxseSByZWxlYXNlIDAuMTAuMyB0aGlzIHRpbWUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmVhbGx5IHJlbGVhc2UgMC4xMC4zIHRoaXMgdGltZQorCisyMDA2LTA1LTA0IDE1OjA1OjAwICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnNpZ25hbHM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYW5ub2RleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Rpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWhhbGVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxhZHNwYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXRkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JhbGFuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWw6CisJKiB3aW4zMi9jb21tb24vY29uZmlnLmg6CisJICBSZWxlYXNlIDAuMTAuMworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBSZWxlYXNlIDAuMTAuMworCisyMDA2LTA1LTAzIDE4OjQ0OjM4ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA2LTA1LTAzIDE4OjQxOjQ3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IERvbid0IHN0cmNtcCgpIE5VTEwgc3RyaW5ncy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX211eF9zdHJlYW1faXNfdm9yYmlzX2hlYWRlciksCisJICAoZ3N0X21hdHJvc2thX211eF93cml0ZV9kYXRhKToKKwkgIERvbid0IHN0cmNtcCgpIE5VTEwgc3RyaW5ncy4KKwkgIE9ubHkgc3RhcnQgbmV3IGNsdXN0ZXJzIG9uIHZpZGVvIGtleWZyYW1lcywgbm90IG9uIGFueQorCSAgcmFuZG9tIGF1ZGlvIGJ1ZmZlciB0aGF0IGRvZXNuJ3QgaGF2ZSB0aGUgREVMVEFfVU5JVAorCSAgZmxhZyBzZXQgKGZpeGVzICdtYWtlIGNoZWNrJyBhZ2FpbikuCisKKzIwMDYtMDUtMDMgMTQ6NTE6NTAgKzAwMDAgIE1hcmsgTmF1d2VsYWVydHMgPG1hbmF1d0Bza3luZXQuYmU+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogRG9uJ3QgbWlzaW50ZXJwcmV0IEdTVF9DTE9DS19USU1FX05PTkUgYXMgdmVyeSBoaWdoIHRpbWVzdGFtcCB2YWx1ZSBhbmQgdGhlbiBkZWFkLWxvY2sgdy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTWFyayBOYXV3ZWxhZXJ0cyAgPG1hbmF1dyBhdCBza3luZXQgYmU+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfYmVzdF9wYWQpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfc3RyZWFtX2lzX3ZvcmJpc19oZWFkZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfZGF0YSk6CisJICBEb24ndCBtaXNpbnRlcnByZXQgR1NUX0NMT0NLX1RJTUVfTk9ORSBhcyB2ZXJ5IGhpZ2ggdGltZXN0YW1wCisJICB2YWx1ZSBhbmQgdGhlbiBkZWFkLWxvY2sgd2hlbiBtdXhpbmcgdm9yYmlzIGF1ZGlvIHN0cmVhbXMKKwkgICh0aGUgdGhyZWUgdm9yYmlzIGhlYWRlciBidWZmZXJzIGNhcnJ5IG5vIHRpbWVzdGFtcCwgYW5kIGl0CisJICB3b3VsZCB0cnkgdG8gbXV4IHRoZXNlIGFmdGVyIGFsbCB2aWRlbyBidWZmZXJzKS4gRml4ZXMgIzM0MDM0Ni4KKwkgIEltcHJvdmUgY2x1c3RlcmluZzogc3RhcnQgYSBuZXcgY2x1c3RlciBhbHNvIHdoZW5ldmVyIHdlIGdldAorCSAgYSBrZXlmcmFtZS4KKworMjAwNi0wNS0wMyAxNDozMDoyMSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQ2xlYW4gdXAgb25lIHBpZWNlIG9mIGxvZ2ljIHNsaWdodGx5IGFuZCByZW1vdmUgYSBkZWFkIGNvZGUgYmxvY2suCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIENsZWFuIHVwIG9uZSBwaWVjZSBvZiBsb2dpYyBzbGlnaHRseSBhbmQgcmVtb3ZlIGEKKwkgIGRlYWQgY29kZSBibG9jay4KKworMjAwNi0wNS0wMyAxNDoyODo1NyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGFkZCB3aW4zMiBzdHVmZgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIE1ha2VmaWxlLmFtOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIHdpbjMyL2NvbW1vbi9jb25maWcuaC5pbjoKKwkgIGFkZCB3aW4zMiBzdHVmZgorCisyMDA2LTA1LTAzIDE0OjI2OjUxICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgYWRkIHdpbjMyIHN0dWZmCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogTWFrZWZpbGUuYW06CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogd2luMzIvY29tbW9uL2NvbmZpZy5oLmluOgorCSAgYWRkIHdpbjMyIHN0dWZmCisKKzIwMDYtMDUtMDIgMjI6MzQ6NTIgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6IEZpeCB0aW1lb3ZlcmxheSBmb3Igbm9uLW11bHRpcGxlLW9mLTQgd2lkdGhzLiBUaGlzIGZvdXJjYyBjcmFwCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6IChnc3RfY2Fpcm9fdGltZV9vdmVybGF5X3RyYW5zZm9ybSk6CisJICBGaXggdGltZW92ZXJsYXkgZm9yIG5vbi1tdWx0aXBsZS1vZi00IHdpZHRocy4gVGhpcyBmb3VyY2MgY3JhcAorCSAgU1VDS1MuCisKKzIwMDYtMDUtMDIgMjE6NTI6NDggKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgRml4IGdldF9jYXBzIGZ1bmMgdG8gd29yayB3aGVuIG5vIGZyYW1lcmF0ZSBpcyBhdmFpbGFibGUgYW5kIHRoZSBjYXBzIGlzbid0IHNpbXBsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4IGdldF9jYXBzIGZ1bmMgdG8gd29yayB3aGVuIG5vIGZyYW1lcmF0ZSBpcyBhdmFpbGFibGUgYW5kIHRoZSBjYXBzIGlzbid0IHNpbXBsZS4KKworMjAwNi0wNS0wMiAxODo1MDoyMyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvOiBkb24ndCBsZWFrIGNhcHMtc3RyaW5nCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzogKGdzdF9hbHBoYV9jb2xvcl90cmFuc2Zvcm1fY2Fwcyk6CisJICAqIGdzdC9kZWJ1Zy9uZWdvdGlhdGlvbi5jOiAoZ3N0X25lZ290aWF0aW9uX3VwZGF0ZV9jYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuYzogKGdzdF9ydHBfaWxiY19kZXBheV9zZXRjYXBzKToKKwkgIGRvbid0IGxlYWsgY2Fwcy1zdHJpbmcKKworMjAwNi0wNS0wMiAxNTo0NjowMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IExldCBjb3JlIGluc2VydCBkZWZhdWx0IGVycm9yIG1lc3NhZ2UgZm9yIFRZUEVfTk9UX0ZPVU5EIGVycm9ycywgaXQncyBqdXN0IGFzIGdvb2QgYXMgb3VyLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfY2hhaW4pLAorCSAgKGdzdF9pZDNkZW11eF9zaW5rX2FjdGl2YXRlKToKKwkgIExldCBjb3JlIGluc2VydCBkZWZhdWx0IGVycm9yIG1lc3NhZ2UgZm9yIFRZUEVfTk9UX0ZPVU5ECisJICBlcnJvcnMsIGl0J3MganVzdCBhcyBnb29kIGFzIG91ciBvd24gYW5kIGhhcyB0aGUgYWRkZWQKKwkgIGJvbnVzIG9mIGJlaW5nIHRyYW5zbGF0ZWQuCisKKzIwMDYtMDUtMDIgMTU6NDA6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC86IFBvc3QgYW4gZXJyb3IgbWVzc2FnZSB3aGVuIHdlIGdldCBhbiBFT1MgZXZlbnQgYW5kIHdlcmUgbm90IGFibGUgdG8gZmluZCBvdXQgdGhlIHR5cGUgb2Ygc3RyZWFtLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzogKGdzdF90YWdfZGVtdXhfaW5pdCksCisJICAoZ3N0X3RhZ19kZW11eF9zaW5rX2V2ZW50KToKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfaW5pdCksCisJICAoZ3N0X2lkM2RlbXV4X3NpbmtfZXZlbnQpOgorCSAgUG9zdCBhbiBlcnJvciBtZXNzYWdlIHdoZW4gd2UgZ2V0IGFuIEVPUyBldmVudCBhbmQgd2VyZSBub3QKKwkgIGFibGUgdG8gZmluZCBvdXQgdGhlIHR5cGUgb2Ygc3RyZWFtLgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jOiAoZmlsbF9tcDNfYnVmZmVyKSwgKGdvdF9idWZmZXIpLAorCSAgKHRlc3RfdGFnbGliX2lkM211eF93aXRoX3RhZ3MpOgorCSAgRGVjcmVhc2UgbnVtLWJ1ZmZlcnMgdG8gMTYgcGVyIGl0ZXJhdGlvbiBhZ2Fpbiwgb3RoZXJ3aXNlIHRoZQorCSAgbWFueSBtZW1jcHkoKXMgYW5kIHJlYWxsb2NhdGlvbnMgaW4gdGhlIHRlc3Qgd2lsbCBoYW1tZXIgc2xvdworCSAgQ1BVcyBjb21wbGV0ZWx5IGFuZCBtYWtlIHRoZSB0ZXN0IHRpbWVvdXQuCisKKzIwMDYtMDUtMDIgMTM6MjQ6MzggKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBjb25maWd1cmUuYWM6IGZpZ3VyZSBvdXQgd2hlcmUgcGx1Z2lucy1iYXNlIHBsdWdpbnMgYXJlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgZmlndXJlIG91dCB3aGVyZSBwbHVnaW5zLWJhc2UgcGx1Z2lucyBhcmUKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICB1c2UgcGx1Z2lucy1iYXNlIHBsdWdpbnMsIHNvIHdlIGhhdmUgdHlwZWZpbmQgZnVuY3Rpb25zCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM3YybXV4LmM6ICh0ZXN0X3RhZ2xpYl9pZDNtdXhfd2l0aF90YWdzKToKKwkgIGluY3JlYXNlIG51bS1idWZmZXJzLCB0aGlzIG1ha2VzIHN1cmUgdGhlIHRlc3QgZXJyb3JzIG91dCBpbnN0ZWFkCisJICBvZiB0aW1pbmcgb3V0IHdoZW4gbm8gdHlwZWZpbmQgZnVuY3Rpb25zIGFyZSBwcmVzZW50CisKKzIwMDYtMDUtMDIgMTM6MDE6NTAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkgIGZpeCBkb2NzIGZvciB3YXZwYXJzZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggZG9jcyBmb3Igd2F2cGFyc2UKKworMjAwNi0wNS0wMSAyMTozNzo1MSArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS5jOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSogdGVzdHMvaWNsZXMvdjRsMnNyYy10ZXN0LmM6CisJICBGZXcgaW1wcm92ZW1lbnRzIHRvIG1vdmUgdG8gZ29vZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRmV3IGltcHJvdmVtZW50cyB0byBtb3ZlIHRvIGdvb2QuCisKKzIwMDYtMDUtMDEgMTE6NDY6MzMgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06IGFsc28gY2hlY2sgLmNjIGZpbGVzIGZvciBndGstZG9jIG1hcmt1cAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgIGFsc28gY2hlY2sgLmNjIGZpbGVzIGZvciBndGstZG9jIG1hcmt1cAorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM3YybXV4LmM6IChpZDN2Mm11eF9zdWl0ZSksIChtYWluKToKKwkgICogZXh0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGFnbGliL01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGFnbGliL2dzdGlkM3YybXV4Lmg6CisJICAqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4LmM6CisJICAqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4Lmg6CisJICBtb3ZlIHRhZ2xpYi1iYXNlZCBpZDN2Mm11eGVyIHRvIC1nb29kLiAgRml4ZXMgIzMzNjExMC4KKworMjAwNi0wNS0wMSAxMTo0NToxNSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWw6CisJICBhZGQgaWN5ZGVtdXggaW5zcGVjdGlvbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgaWN5ZGVtdXggaW5zcGVjdGlvbgorCisyMDA2LTA1LTAxIDExOjQzOjMxICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogcG8vUE9URklMRVMuaW46CisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vY3MucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vaXQucG86CisJKiBwby9uYi5wbzoKKwkqIHBvL25sLnBvOgorCSogcG8vb3IucG86CisJKiBwby9zcS5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby91ay5wbzoKKwkqIHBvL3ZpLnBvOgorCSAgYWRkIHhpbWFnZXNyYyBmb3IgdHJhbnNsYXRpb24KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkIHhpbWFnZXNyYyBmb3IgdHJhbnNsYXRpb24KKworMjAwNi0wNC0zMCAxNjoxNjo1OSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJKiBleHQvdGFnbGliL2dzdHRhZ2xpYm11eC5jOgorCSAgc21hbGwgY2xlYW51cHMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgc21hbGwgY2xlYW51cHMKKworMjAwNi0wNC0zMCAxNTozMjoxMyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGV4dC90YWdsaWIvZ3N0aWQzdjJtdXguY2M6CisJICBmaXggZG9jcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggZG9jcworCisyMDA2LTA0LTMwIDE0OjU1OjE1ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF0ZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWw6CisJICB1cGRhdGUgdG8gbGF0ZXN0IHZlcnNpb24KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdXBkYXRlIHRvIGxhdGVzdCB2ZXJzaW9uCisKKzIwMDYtMDQtMjkgMTg6NDY6MzYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC90YWdsaWIvZ3N0dGFnbGliLmNjOiBQb3N0IGFuIGVycm9yIG1lc3NhZ2Ugb24gdGhlIGJ1cyBpbiB0aGUgKGV4dHJlbWVseSB1bmxpa2VseSkgY2FzZSBvZiBhbiBlcnJvci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL2dzdHRhZ2xpYi5jYzoKKwkgIFBvc3QgYW4gZXJyb3IgbWVzc2FnZSBvbiB0aGUgYnVzIGluIHRoZSAoZXh0cmVtZWx5IHVubGlrZWx5KQorCSAgY2FzZSBvZiBhbiBlcnJvci4KKworMjAwNi0wNC0yOSAxODoxODoyNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L3RhZ2xpYi86IFNwbGl0IHRoZSBhY3R1YWwgSUQzdjIgdGFnIHJlbmRlcmluZyBjb2RlIGludG8gaXRzIG93biBzdWJjbGFzcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGFnbGliL2dzdGlkM3YybXV4LmNjOgorCSAgKiBleHQvdGFnbGliL2dzdGlkM3YybXV4Lmg6CisJICAqIGV4dC90YWdsaWIvZ3N0dGFnbGliLmNjOgorCSAgKiBleHQvdGFnbGliL2dzdHRhZ2xpYi5oOgorCSAgU3BsaXQgdGhlIGFjdHVhbCBJRDN2MiB0YWcgcmVuZGVyaW5nIGNvZGUgaW50bworCSAgaXRzIG93biBzdWJjbGFzcy4KKworMjAwNi0wNC0yOSAxNjoxNDoyMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IC4uLiBhbmQgZml4IG11bHRpY2hhbm5lbC9XQVZGT1JNQVRFWCBzdXBwb3J0IGFnYWluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKToKKwkgIC4uLiBhbmQgZml4IG11bHRpY2hhbm5lbC9XQVZGT1JNQVRFWCBzdXBwb3J0IGFnYWluLgorCisyMDA2LTA0LTI4IDIzOjA5OjE3ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS4qOiBBZGQgcHVzaCAoc3RyZWFtaW5nKSBtb2RlIHRvIHdhdnBhcnNlIChmaXhlcyAjMzM3NjI1KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2Jhc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhcnNlX2NsYXNzX2luaXQpLCAoZ3N0X3dhdnBhcnNlX2Rpc3Bvc2UpLAorCSAgKGdzdF93YXZwYXJzZV9yZXNldCksIChnc3Rfd2F2cGFyc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhcnNlX2NyZWF0ZV9zb3VyY2VwYWQpLCAoZ3N0X3dhdnBhcnNlX3BhcnNlX2FkdGwpLAorCSAgKGdzdF93YXZwYXJzZV9wYXJzZV9jdWVzKSwgKGdzdF93YXZwYXJzZV9wYXJzZV9maWxlX2hlYWRlciksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9pbml0KSwgKGdzdF93YXZwYXJzZV9wZXJmb3JtX3NlZWspLAorCSAgKGdzdF93YXZwYXJzZV9wZWVrX2NodW5rX2luZm8pLCAoZ3N0X3dhdnBhcnNlX3BlZWtfY2h1bmspLAorCSAgKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksIChnc3Rfd2F2cGFyc2VfcGFyc2Vfc3RyZWFtX2luaXQpLAorCSAgKGdzdF93YXZwYXJzZV9zZW5kX2V2ZW50KSwgKGdzdF93YXZwYXJzZV9hZGRfc3JjX3BhZCksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKSwgKGdzdF93YXZwYXJzZV9sb29wKSwKKwkgIChnc3Rfd2F2cGFyc2VfY2hhaW4pLCAoZ3N0X3dhdnBhcnNlX3NyY3BhZF9ldmVudCksCisJICAoZ3N0X3dhdnBhcnNlX3NpbmtfYWN0aXZhdGUpLCAoZ3N0X3dhdnBhcnNlX3NpbmtfYWN0aXZhdGVfcHVsbCksCisJICAoZ3N0X3dhdnBhcnNlX2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oOgorCSAgQWRkIHB1c2ggKHN0cmVhbWluZykgbW9kZSB0byB3YXZwYXJzZSAoZml4ZXMgIzMzNzYyNSkKKworMjAwNi0wNC0yOCAyMTo0MzowNyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2lkM3YybXV4LmM6CisJICBlbGVtZW50IHJlbmFtZWQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZWxlbWVudCByZW5hbWVkCisKKzIwMDYtMDQtMjggMTk6MjI6NDYgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teGltYWdlc3JjLnhtbDoKKwkgIGFkZCBwbHVnaW4gZG9jcyBmb3IgeGltYWdlc3JjCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCBwbHVnaW4gZG9jcyBmb3IgeGltYWdlc3JjCisKKzIwMDYtMDQtMjggMTk6MTU6MDggKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBhZGQgeGltYWdlc3JjIGljbGVzIHRlc3QKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIHRlc3RzL01ha2VmaWxlLmFtOgorCSAgYWRkIHhpbWFnZXNyYyBpY2xlcyB0ZXN0CisKKzIwMDYtMDQtMjggMTg6NTc6MDkgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBNb3ZlIHhpbWFnZXNyYyBwbHVnLWluIHRvIGdvb2QgYWZ0ZXIgcmV2aWV3LiAgRml4ZXMgIzMzNjc1Ni4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sZW5jLmM6IChnc3RfY21tbF9lbmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X2NtbWxfZW5jX3B1c2hfY2xpcCk6CisJICAqIHN5cy9NYWtlZmlsZS5hbToKKwkgICogc3lzL3hpbWFnZS9NYWtlZmlsZS5hbToKKwkgICogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIE1vdmUgeGltYWdlc3JjIHBsdWctaW4gdG8gZ29vZCBhZnRlciByZXZpZXcuICBGaXhlcyAjMzM2NzU2LgorCisyMDA2LTA0LTI4IDE2OjUxOjMzICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmg6CisJICBib3JnaWZ5IG5hbWluZworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBib3JnaWZ5IG5hbWluZworCisyMDA2LTA0LTI4IDE2OjQ2OjUyICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIGRvYyB0d2Vha3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZG9jIHR3ZWFrcworCisyMDA2LTA0LTI4IDE2OjE1OjIwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogc3lzL3hpbWFnZS9NYWtlZmlsZS5hbToKKwkqIHN5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmM6CisJICBjbGVhbiB1cCBNYWtlZmlsZS5hbQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBjbGVhbiB1cCBNYWtlZmlsZS5hbQorCisyMDA2LTA0LTI4IDE1OjMzOjA5ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZXh0L3RhZ2xpYi9nc3R0YWdsaWJtdXguYzoKKwkqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4Lmg6CisJICBwZWRhbnRpYyBjbGVhbnVwcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBwZWRhbnRpYyBjbGVhbnVwcworCisyMDA2LTA0LTI4IDE0OjU3OjU3ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC4qOiBGaXggZXZlbnQgaGFuZGxpbmc6IGNhY2hlIGV2ZW50cyB3aGVuIHR5cGVmaW5kaW5nIGFuZCBmb3J3YXJkIGxhdGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOiAoZ3N0X2ljeWRlbXV4X3Jlc2V0KSwgICAgICAgICAoZ3N0X2ljeWRlbXV4X2luaXQpLCAoZ3N0X2ljeWRlbXV4X3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X2ljeWRlbXV4X2FkZF9zcmNwYWQpLCAoZ3N0X2ljeWRlbXV4X3BhcnNlX2FuZF9zZW5kX3RhZ3MpLAorCSAgKGdzdF9pY3lkZW11eF9oYW5kbGVfZXZlbnQpLCAoZ3N0X2ljeWRlbXV4X3NlbmRfY2FjaGVkX2V2ZW50cyksCisJICAoZ3N0X2ljeWRlbXV4X3R5cGVmaW5kX29yX2ZvcndhcmQpLCAoZ3N0X2ljeWRlbXV4X2FkZF9tZXRhKSwKKwkgIChnc3RfaWN5ZGVtdXhfY2hhaW4pLCAoZ3N0X2ljeWRlbXV4X3NlbmRfdGFnX2V2ZW50KToKKwkgICogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4Lmg6CisJICBGaXggZXZlbnQgaGFuZGxpbmc6IGNhY2hlIGV2ZW50cyB3aGVuIHR5cGVmaW5kaW5nIGFuZCBmb3J3YXJkIGxhdGVyLgorCisyMDA2LTA0LTI4IDE0OjU1OjIwICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6IFJlZ2lzdGVyIG9zeGF1ZGlvc3JjIHRvIHRoZSBwbHVnaW4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDQtMjggIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSAgKHBsdWdpbl9pbml0KToKKwkgIFJlZ2lzdGVyIG9zeGF1ZGlvc3JjIHRvIHRoZSBwbHVnaW4uCisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSAgKGdzdF9vc3hfYXVkaW9fc3JjX29zeGVsZW1lbnRfZG9faW5pdCksCisJICAoZ3N0X29zeF9hdWRpb19zcmNfYmFzZV9pbml0KSwgKGdzdF9vc3hfYXVkaW9fc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9vc3hfYXVkaW9fc3JjX2luaXQpLCAoZ3N0X29zeF9hdWRpb19zcmNfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfb3N4X2F1ZGlvX3NyY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9vc3hfYXVkaW9fc3JjX2NyZWF0ZV9yaW5nYnVmZmVyKSwgKGdzdF9vc3hfYXVkaW9fc3JjX2lvX3Byb2MpLAorCSAgKGdzdF9vc3hfYXVkaW9fc3JjX29zeGVsZW1lbnRfaW5pdCk6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5oOgorCSAgUG9ydCBvZiBvc3hhdWRpb3NyYyB0byAwLjEwLgorCSAgKiBzeXMvb3N4YXVkaW8vTWFrZWZpbGUuYW06CisJICBBZGQgb3N4YXVkaW9zcmMKKworMjAwNi0wNC0yOCAxMjowMDozOSArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSAgY29tbWl0IENoYW5nZWxvZyBmb3IgcHJldmlvdXMgY29tbWl0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGNvbW1pdCBDaGFuZ2Vsb2cgZm9yIHByZXZpb3VzIGNvbW1pdAorCisyMDA2LTA0LTI4IDExOjU3OjM5ICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4cmluZ2J1ZmZlci5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeHJpbmdidWZmZXIuaDoKKwkgIEZvcmdvdCB0byBjb21taXQsIHF1aWNrIGNvbW1pdCBiZTQgYXBwbGUgZGllcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGb3Jnb3QgdG8gY29tbWl0LCBxdWljayBjb21taXQgYmU0IGFwcGxlIGRpZXMKKworMjAwNi0wNC0yOCAxMTozNzoyMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IFJlY29nbmlzZSBhbmQgc2tpcCBhbnkgYnl0ZSBvcmRlciBtYXJrZXIgKEJPTSkgaW4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKGhhc191dGYxNl9ib20pLAorCSAgKHBhcnNlX3NwbGl0X3N0cmluZ3MpOgorCSAgUmVjb2duaXNlIGFuZCBza2lwIGFueSBieXRlIG9yZGVyIG1hcmtlciAoQk9NKSBpbgorCSAgVVRGLTE2IHN0cmluZ3MuCisKKzIwMDYtMDQtMjcgMTY6MDU6NTQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIEFkZCBkb2NzIGZvciBib3RoIGF2aWRlbXV4IGFuZCBhdmltdXguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOgorCSAgQWRkIGRvY3MgZm9yIGJvdGggYXZpZGVtdXggYW5kIGF2aW11eC4KKworMjAwNi0wNC0yNyAxNDo1MTowNiArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3QHNreW5ldC5iZT4KKworCSAgZ3N0L2F2aS86IFBvcnQgQVZJIG11eGVyIHRvIEdTdHJlYW1lci0wLjEwICgjMzMyMDMxKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE1hcmsgTmF1d2VsYWVydHMgIDxtYW5hdXcgYXQgc2t5bmV0IGRvdCBiZT4KKwkgICogZ3N0L2F2aS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F2aS9nc3RhdmkuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmlfbXV4X2dldF90eXBlKSwKKwkgIChnc3RfYXZpX211eF9iYXNlX2luaXQpLCAoZ3N0X2F2aV9tdXhfZmluYWxpemUpLAorCSAgKGdzdF9hdmlfbXV4X2NsYXNzX2luaXQpLCAoZ3N0X2F2aV9tdXhfaW5pdCksCisJICAoZ3N0X2F2aV9tdXhfdmlkc2lua19zZXRfY2FwcyksIChnc3RfYXZpX211eF9hdWRzaW5rX3NldF9jYXBzKSwKKwkgIChnc3RfYXZpX211eF9wYWRfbGluayksIChnc3RfYXZpX211eF9wYWRfdW5saW5rKSwKKwkgIChnc3RfYXZpX211eF9yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X2F2aV9tdXhfcmVsZWFzZV9wYWQpLAorCSAgKGdzdF9hdmlfbXV4X3dyaXRlX3RhZyksIChnc3RfYXZpX211eF9yaWZmX2dldF9hdmlfaGVhZGVyKSwKKwkgIChnc3RfYXZpX211eF9yaWZmX2dldF9hdml4X2hlYWRlciksCisJICAoZ3N0X2F2aV9tdXhfcmlmZl9nZXRfdmlkZW9faGVhZGVyKSwKKwkgIChnc3RfYXZpX211eF9yaWZmX2dldF9hdWRpb19oZWFkZXIpLCAoZ3N0X2F2aV9tdXhfYWRkX2luZGV4KSwKKwkgIChnc3RfYXZpX211eF93cml0ZV9pbmRleCksIChnc3RfYXZpX211eF9iaWdmaWxlKSwKKwkgIChnc3RfYXZpX211eF9zdGFydF9maWxlKSwgKGdzdF9hdmlfbXV4X3N0b3BfZmlsZSksCisJICAoZ3N0X2F2aV9tdXhfcmVzdGFydF9maWxlKSwgKGdzdF9hdmlfbXV4X2hhbmRsZV9ldmVudCksCisJICAoZ3N0X2F2aV9tdXhfZmlsbF9xdWV1ZSksIChnc3RfYXZpX211eF9zZW5kX3BhZF9kYXRhKSwKKwkgIChnc3RfYXZpX211eF9zdHJpcF9idWZmZXIpLCAoZ3N0X2F2aV9tdXhfZG9fYXVkaW9fYnVmZmVyKSwKKwkgIChnc3RfYXZpX211eF9kb192aWRlb19idWZmZXIpLCAoZ3N0X2F2aV9tdXhfZG9fb25lX2J1ZmZlciksCisJICAoZ3N0X2F2aV9tdXhfbG9vcCksIChnc3RfYXZpX211eF9jb2xsZWN0X3BhZHMpLAorCSAgKGdzdF9hdmlfbXV4X2dldF9wcm9wZXJ0eSksIChnc3RfYXZpX211eF9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hdmlfbXV4X2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4Lmg6CisJICBQb3J0IEFWSSBtdXhlciB0byBHU3RyZWFtZXItMC4xMCAoIzMzMjAzMSkuCisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9hdmltdXguYzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvLmN2c2lnbm9yZToKKwkgIEFkZCB1bml0IHRlc3QgZm9yIEFWSSBtdXhlci4KKworMjAwNi0wNC0yNiAyMToyOTo0NSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuKjogcmV2ZXJ0ZWQgcGF0Y2ggIzMzNzYyNSBmb3IgdGhlIHByaWNlIG9mIDEgaG91ciBzbGVlcAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2Jhc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhcnNlX2NsYXNzX2luaXQpLCAoZ3N0X3dhdnBhcnNlX3Jlc2V0KSwKKwkgIChnc3Rfd2F2cGFyc2VfaW5pdCksIChnc3Rfd2F2cGFyc2VfY3JlYXRlX3NvdXJjZXBhZCksCisJICAoZ3N0X3dhdnBhcnNlX3BhcnNlX2ZpbGVfaGVhZGVyKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1faW5pdCksCisJICAoZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayksIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpLAorCSAgKGdzdF93YXZwYXJzZV9zZW5kX2V2ZW50KSwgKGdzdF93YXZwYXJzZV9hZGRfc3JjX3BhZCksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKSwgKGdzdF93YXZwYXJzZV9sb29wKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3JjcGFkX2V2ZW50KSwgKGdzdF93YXZwYXJzZV9zaW5rX2FjdGl2YXRlKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc2lua19hY3RpdmF0ZV9wdWxsKSwgKGdzdF93YXZwYXJzZV9jaGFuZ2Vfc3RhdGUpLAorCSAgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICByZXZlcnRlZCBwYXRjaCAjMzM3NjI1IGZvciB0aGUgcHJpY2Ugb2YgMSBob3VyIHNsZWVwCisKKzIwMDYtMDQtMjYgMjA6MTE6MTggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLio6IGNvcnJlY3QgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBwdXNoIG1vZGUgKGZyb20gbXkgbGFzdCBjb21taXQpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfYmFzZV9pbml0KSwKKwkgIChnc3Rfd2F2cGFyc2VfY2xhc3NfaW5pdCksIChnc3Rfd2F2cGFyc2VfcmVzZXQpLAorCSAgKGdzdF93YXZwYXJzZV9pbml0KSwgKGdzdF93YXZwYXJzZV9jcmVhdGVfc291cmNlcGFkKSwKKwkgIChnc3Rfd2F2cGFyc2VfcGFyc2VfYWR0bCksIChnc3Rfd2F2cGFyc2VfcGFyc2VfY3VlcyksCisJICAoZ3N0X3dhdnBhcnNlX3BhcnNlX2ZpbGVfaGVhZGVyKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1faW5pdCksCisJICAoZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayksIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpLAorCSAgKGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSksIChnc3Rfd2F2cGFyc2VfbG9vcCksCisJICAoZ3N0X3dhdnBhcnNlX2NoYWluKSwgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICBjb3JyZWN0IHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgcHVzaCBtb2RlCisJICAoZnJvbSBteSBsYXN0IGNvbW1pdCkKKworMjAwNi0wNC0yNiAxNzozNzoxMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2VzZC9lc2RzaW5rLmM6IEZpeCBjb21waWxlIHByb2JsZW0gYnkgZGVmaW5pbmcgRVNEX01BWF9XUklURV9TSVpFIGlmIGl0IGlzIG5vdCBpbiBlc2QuaAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOgorCSAgRml4IGNvbXBpbGUgcHJvYmxlbSBieSBkZWZpbmluZyBFU0RfTUFYX1dSSVRFX1NJWkUgaWYKKwkgIGl0IGlzIG5vdCBpbiBlc2QuaAorCisyMDA2LTA0LTI2IDE3OjA4OjI0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLio6IFJld3JpdGUgYXVwYXJzZSB0byBzdWNrIGEgbGl0dGxlIGJpdCBsZXNzOiBtYWtlIHNvdXJjZSBwYWQgZHluYW1pYywgc28gZGVjb2RlYmluL3BsYXliaW4gd28uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6IChnc3RfYXVfcGFyc2VfYmFzZV9pbml0KSwKKwkgIChnc3RfYXVfcGFyc2VfY2xhc3NfaW5pdCksIChnc3RfYXVfcGFyc2VfaW5pdCksCisJICAoZ3N0X2F1X3BhcnNlX3Jlc2V0KSwgKGdzdF9hdV9wYXJzZV9hZGRfc3JjcGFkKSwKKwkgIChnc3RfYXVfcGFyc2VfcmVtb3ZlX3NyY3BhZCksIChnc3RfYXVfcGFyc2VfcGFyc2VfaGVhZGVyKSwKKwkgIChnc3RfYXVfcGFyc2VfY2hhaW4pLCAoZ3N0X2F1X3BhcnNlX3NyY19jb252ZXJ0KSwKKwkgIChnc3RfYXVfcGFyc2Vfc3JjX3F1ZXJ5KSwgKGdzdF9hdV9wYXJzZV9oYW5kbGVfc2VlayksCisJICAoZ3N0X2F1X3BhcnNlX3NpbmtfZXZlbnQpLCAoZ3N0X2F1X3BhcnNlX3NyY19ldmVudCksCisJICAoZ3N0X2F1X3BhcnNlX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuaDoKKwkgIFJld3JpdGUgYXVwYXJzZSB0byBzdWNrIGEgbGl0dGxlIGJpdCBsZXNzOiBtYWtlIHNvdXJjZSBwYWQKKwkgIGR5bmFtaWMsIHNvIGRlY29kZWJpbi9wbGF5YmluIHdvcmsgd2l0aCBub24tcmF3IGZvcm1hdHMKKwkgIGxpa2UgYWxhdy9tdWxhdzsgYWRkIHF1ZXJ5IGZ1bmN0aW9uIGZvciBkdXJhdGlvbi9wb3NpdGlvbgorCSAgcXVlcmllczsgY2hlY2sgd2hldGhlciB3ZSBoYXZlIGVub3VnaCBkYXRhIGJlZm9yZSBhdHRlbXB0aW5nCisJICB0byBwYXJzZSB0aGUgaGVhZGVyIChpbnN0ZWFkIG9mIGNyYXNoaW5nIHdoZW4gdGhhdCBpcyBub3QgdGhlCisJICBjYXNlKTsgd29yayBhcm91bmQgYXVkaW9jb252ZXJ0IHN1Y2tpbmcgYnkgc3dhcHBpbmcgZW5kaWFubmVzcworCSAgdG8gdGhlIG5hdGl2ZSBlbmRpYW5uZXNzIG91cnNlbHZlcyBmb3IgZmxvYXQgZm9ybWF0czsgc2VuZAorCSAgaW5pdGlhbCBuZXdzZWdtZW50IGV2ZW50LiBGaXhlcyAjMTYxNzEyLgorCisyMDA2LTA0LTI2IDE2OjI5OjM4ICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBzeXMvb3N4YXVkaW8vOiBQb3J0IG9mIG9zeGF1ZGlvc2luayB0byAwLjEwCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDQtMjYgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKwkgICogc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50LmM6CisJICAoZ3N0X29zeF9hdWRpb19lbGVtZW50X2dldF90eXBlKSwKKwkgIChnc3Rfb3N4X2F1ZGlvX2VsZW1lbnRfY2xhc3NfaW5pdCk6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuaDoKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSAgKGdzdF9vc3hfYXVkaW9fc2lua19vc3hlbGVtZW50X2RvX2luaXQpLAorCSAgKGdzdF9vc3hfYXVkaW9fc2lua19iYXNlX2luaXQpLCAoZ3N0X29zeF9hdWRpb19zaW5rX2NsYXNzX2luaXQpLAorCSAgKGdzdF9vc3hfYXVkaW9fc2lua19pbml0KSwgKGdzdF9vc3hfYXVkaW9fc2lua19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9vc3hfYXVkaW9fc2lua19nZXRfcHJvcGVydHkpLCAoZ3N0X29zeF9hdWRpb19zaW5rX2dldGNhcHMpLAorCSAgKGdzdF9vc3hfYXVkaW9fc2lua19jcmVhdGVfcmluZ2J1ZmZlciksCisJICAoZ3N0X29zeF9hdWRpb19zaW5rX2lvX3Byb2MpLCAoZ3N0X29zeF9hdWRpb19zaW5rX29zeGVsZW1lbnRfaW5pdCksCisJICAocGx1Z2luX2luaXQpOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmg6CisJICBQb3J0IG9mIG9zeGF1ZGlvc2luayB0byAwLjEwCisKKzIwMDYtMDQtMjYgMDg6NTU6MjcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9lc2QvZXNkc2luay5jOiBBbHdheXMgd3JpdGUgRVNEX0JVRl9TSVpFIGJ5dGVzIGFuZCB1c2UgRVNEX01BWF9XUklURV9TSVpFIGFzIHRoZSBzaXplIG9mIHRoZSByaW5nYnVmZmVyLiBUaGlzIHNoby4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfcHJlcGFyZSksIChnc3RfZXNkc2lua19kZWxheSk6CisJICBBbHdheXMgd3JpdGUgRVNEX0JVRl9TSVpFIGJ5dGVzIGFuZCB1c2UgRVNEX01BWF9XUklURV9TSVpFIGFzCisJICB0aGUgc2l6ZSBvZiB0aGUgcmluZ2J1ZmZlci4gVGhpcyBzaG91bGQgZml4IGhhbmdzIHdpdGggb2xkZXIKKwkgIGVzZCBzb3VuZCBzZXJ2ZXJzLgorCisyMDA2LTA0LTI1IDIxOjU2OjM4ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIERlZmluZSBHc3RFbGVtZW50RGV0YWlscyBhcyBjb25zdCBhbmQgYWxzbyBzdGF0aWMgKHdoZW4gZGVmaW5lZCBhcyBnbG9iYWwpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2FtcndiL2dzdGFtcndiZGVjLmM6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YmVuYy5jOgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JwYXJzZS5jOgorCSAgKiBleHQvYXJ0cy9nc3RfYXJ0cy5jOgorCSAgKiBleHQvYXJ0c2QvZ3N0YXJ0c2RzaW5rLmM6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZwYXJzZS5jOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc2luay5jOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc3JjLmM6CisJICAqIGV4dC9hdWRpb3Jlc2FtcGxlL2dzdGF1ZGlvcmVzYW1wbGUuYzoKKwkgICogZXh0L2J6Mi9nc3RiejJkZWMuYzoKKwkgICogZXh0L2J6Mi9nc3RiejJlbmMuYzoKKwkgICogZXh0L2NkYXVkaW8vZ3N0Y2RhdWRpby5jOgorCSAgKiBleHQvZGlyZWN0ZmIvZGZidmlkZW9zaW5rLmM6CisJICAqIGV4dC9kaXZ4L2dzdGRpdnhkZWMuYzoKKwkgICogZXh0L2RpdngvZ3N0ZGl2eGVuYy5jOgorCSAgKiBleHQvZHRzL2dzdGR0c2RlYy5jOiAoZ3N0X2R0c2RlY19iYXNlX2luaXQpOgorCSAgKiBleHQvZmFhYy9nc3RmYWFjLmM6IChnc3RfZmFhY19iYXNlX2luaXQpOgorCSAgKiBleHQvZmFhZC9nc3RmYWFkLmM6CisJICAqIGV4dC9nc20vZ3N0Z3NtZGVjLmM6CisJICAqIGV4dC9nc20vZ3N0Z3NtZW5jLmM6CisJICAqIGV4dC9oZXJtZXMvZ3N0aGVybWVzY29sb3JzcGFjZS5jOgorCSAgKiBleHQvaXZvcmJpcy92b3JiaXNmaWxlLmM6CisJICAqIGV4dC9sY3MvZ3N0Y29sb3JzcGFjZS5jOgorCSAgKiBleHQvbGliZmFtZS9nc3RsaWJmYW1lLmM6CisJICAqIGV4dC9saWJtbXMvZ3N0bW1zLmM6IChnc3RfbW1zX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9tdXNlcGFjay9nc3RtdXNlcGFja2RlYy5jOiAoZ3N0X211c2VwYWNrZGVjX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uYzogKGdzdF9tdXNpY2JyYWluel9iYXNlX2luaXQpOgorCSAgKiBleHQvbmFzL25hc3NpbmsuYzogKGdzdF9uYXNzaW5rX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9uZW9uL2dzdG5lb25odHRwc3JjLmM6CisJICAqIGV4dC9zZGwvc2RsYXVkaW9zaW5rLmM6CisJICAqIGV4dC9zZGwvc2RsdmlkZW9zaW5rLmM6CisJICAqIGV4dC9zaG91dC9nc3RzaG91dC5jOgorCSAgKiBleHQvc25hcHNob3QvZ3N0c25hcHNob3QuYzoKKwkgICogZXh0L3NuZGZpbGUvZ3N0c2YuYzoKKwkgICogZXh0L3N3ZmRlYy9nc3Rzd2ZkZWMuYzoKKwkgICogZXh0L3Rhcmtpbi9nc3R0YXJraW5kZWMuYzoKKwkgICogZXh0L3Rhcmtpbi9nc3R0YXJraW5lbmMuYzoKKwkgICogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX2Jhc2VfaW5pdCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiAoZ3N0X3dhdnBhY2tfcGFyc2VfYmFzZV9pbml0KToKKwkgICogZXh0L3h2aWQvZ3N0eHZpZGRlYy5jOgorCSAgKiBleHQveHZpZC9nc3R4dmlkZW5jLmM6CisJICAqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXBhcnNlLmM6IChnc3RfY2R4YV9wYXJzZV9iYXNlX2luaXQpOgorCSAgKiBnc3QvY2R4YXBhcnNlL2dzdGNkeGFzdHJpcC5jOiAoZ3N0X2NkeGFzdHJpcF9iYXNlX2luaXQpOgorCSAgKiBnc3QvY2hhcnQvZ3N0Y2hhcnQuYzoKKwkgICogZ3N0L2NvbG9yc3BhY2UvZ3N0Y29sb3JzcGFjZS5jOgorCSAgKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkgICogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzogKGdzdF9paXJfZXF1YWxpemVyX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9mZXN0aXZhbC9nc3RmZXN0aXZhbC5jOgorCSAgKiBnc3QvZmlsdGVyL2dzdGJwd3NpbmMuYzoKKwkgICogZ3N0L2ZpbHRlci9nc3RpaXIuYzoKKwkgICogZ3N0L2ZpbHRlci9nc3RscHdzaW5jLmM6CisJICAqIGdzdC9mcmVlemUvZ3N0ZnJlZXplLmM6CisJICAqIGdzdC9nYW1lcy9nc3RwdXp6bGUuYzogKGdzdF9wdXp6bGVfYmFzZV9pbml0KToKKwkgICogZ3N0L2xpYnJmYi9nc3RyZmJzcmMuYzoKKwkgICogZ3N0L21peG1hdHJpeC9taXhtYXRyaXguYzoKKwkgICogZ3N0L21wZWcxc3lzL2dzdG1wZWcxc3lzdGVtZW5jb2RlLmM6CisJICAqIGdzdC9tcGVnMXZpZGVvcGFyc2UvZ3N0bXAxdmlkZW9wYXJzZS5jOgorCSAgKiBnc3QvbXBlZzJzdWIvZ3N0bXBlZzJzdWJ0LmM6CisJICAqIGdzdC9tcGVnYXVkaW9wYXJzZS9nc3RtcGVnYXVkaW9wYXJzZS5jOgorCSAgKiBnc3QvbXVsdGlmaWxlc2luay9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICAqIGdzdC9vdmVybGF5L2dzdG92ZXJsYXkuYzoKKwkgICogZ3N0L3Bhc3N0aHJvdWdoL2dzdHBhc3N0aHJvdWdoLmM6CisJICAqIGdzdC9wbGF5b25kZW1hbmQvZ3N0cGxheW9uZGVtYW5kLmM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgICogZ3N0L3J0anBlZy9nc3RydGpwZWdkZWMuYzoKKwkgICogZ3N0L3J0anBlZy9nc3RydGpwZWdlbmMuYzoKKwkgICogZ3N0L3Ntb290aC9nc3RzbW9vdGguYzoKKwkgICogZ3N0L3Ntb290aHdhdmUvZ3N0c21vb3Rod2F2ZS5jOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzoKKwkgICogZ3N0L3NwZWVkL2dzdHNwZWVkLmM6CisJICAqIGdzdC9zdGVyZW8vZ3N0c3RlcmVvLmM6CisJICAqIGdzdC9zd2l0Y2gvZ3N0c3dpdGNoLmM6CisJICAqIGdzdC90dGEvZ3N0dHRhZGVjLmM6IChnc3RfdHRhX2RlY19iYXNlX2luaXQpOgorCSAgKiBnc3QvdHRhL2dzdHR0YXBhcnNlLmM6IChnc3RfdHRhX3BhcnNlX2Jhc2VfaW5pdCk6CisJICAqIGdzdC92YmlkZWMvZ3N0dmJpZGVjLmM6CisJICAqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJICAqIGdzdC92aWRlb2Ryb3AvZ3N0dmlkZW9kcm9wLmM6CisJICAqIGdzdC92aXJ0dWFsZHViL2dzdHhzaGFycGVuLmM6CisJICAqIGdzdC94aW5naGVhZGVyL2dzdHhpbmdtdXguYzogKGdzdF94aW5nX211eF9iYXNlX2luaXQpOgorCSAgKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgKiBzeXMvY2Ryb20vZ3N0Y2RwbGF5ZXIuYzoKKwkgICogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuYzoKKwkgICogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSAgKiBzeXMvZ2xzaW5rL2dsaW1hZ2VzaW5rLmM6CisJICAqIHN5cy9xY2FtL2dzdHFjYW1zcmMuYzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgKiBzeXMvdmNkL3ZjZHNyYy5jOiAoZ3N0X3ZjZHNyY19iYXNlX2luaXQpOgorCSAgKiBzeXMveGltYWdlc3JjL3hpbWFnZXNyYy5jOgorCSAgRGVmaW5lIEdzdEVsZW1lbnREZXRhaWxzIGFzIGNvbnN0IGFuZCBhbHNvIHN0YXRpYyAod2hlbiBkZWZpbmVkIGFzCisJICBnbG9iYWwpCisKKzIwMDYtMDQtMjUgMjE6Mzk6NDYgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgRGVmaW5lIEdzdEVsZW1lbnREZXRhaWxzIGFzIGNvbnN0IGFuZCBhbHNvIHN0YXRpYyAod2hlbiBkZWZpbmVkIGFzIGdsb2JhbCkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuYzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzoKKwkgICogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6CisJICAqIGV4dC9jZGlvL2dzdGNkaW9jZGRhc3JjLmM6CisJICAqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5jOgorCSAgKiBleHQvZXNkL2VzZG1vbi5jOgorCSAgKiBleHQvZXNkL2VzZHNpbmsuYzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOiAoZ3N0X2djb25mX2F1ZGlvX3NpbmtfYmFzZV9pbml0KToKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zcmMuYzogKGdzdF9nY29uZl9hdWRpb19zcmNfYmFzZV9pbml0KToKKwkgICogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zaW5rLmM6IChnc3RfZ2NvbmZfdmlkZW9fc2lua19iYXNlX2luaXQpOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NyYy5jOiAoZ3N0X2djb25mX3ZpZGVvX3NyY19iYXNlX2luaXQpOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOgorCSAgKiBleHQvaGFsL2dzdGhhbGF1ZGlvc2luay5jOiAoZ3N0X2hhbF9hdWRpb19zaW5rX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zcmMuYzogKGdzdF9oYWxfYXVkaW9fc3JjX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAgKiBleHQvanBlZy9nc3RzbW9rZWRlYy5jOgorCSAgKiBleHQvanBlZy9nc3RzbW9rZWVuYy5jOgorCSAgKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOgorCSAgKiBleHQvbGlibW5nL2dzdG1uZ2RlYy5jOgorCSAgKiBleHQvbGlibW5nL2dzdG1uZ2VuYy5jOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSAgKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOgorCSAgKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkgICogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzogKGdzdF9zaG91dDJzZW5kX2luaXQpOgorCSAgKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5oOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJICAqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOgorCSAgKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6CisJICAqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfYmFzZV9pbml0KToKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jOgorCSAgKGdzdF9hdXRvX3ZpZGVvX3NpbmtfYmFzZV9pbml0KToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9iYXNlX2luaXQpOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aW11eF9iYXNlX2luaXQpOgorCSAgKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSAgKiBnc3QvZGVidWcvYnJlYWtteWRhdGEuYzoKKwkgICogZ3N0L2RlYnVnL2VmZW5jZS5jOgorCSAgKiBnc3QvZGVidWcvZ3N0bmF2aWdhdGlvbnRlc3QuYzoKKwkgICogZ3N0L2RlYnVnL2dzdG5hdnNlZWsuYzoKKwkgICogZ3N0L2RlYnVnL25lZ290aWF0aW9uLmM6CisJICAqIGdzdC9kZWJ1Zy9wcm9ncmVzc3JlcG9ydC5jOgorCSAgKiBnc3QvZGVidWcvdGVzdHBsdWdpbi5jOgorCSAgKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSAgKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJICAqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6CisJICAqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jOgorCSAgKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6CisJICAqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJICAqIGdzdC9nb29tL2dzdGdvb20uYzoKKwkgICogZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmM6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzoKKwkgICogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jOgorCSAgKiBnc3QvbGF3L2FsYXctZGVjb2RlLmM6IChnc3RfYWxhd2RlY19iYXNlX2luaXQpOgorCSAgKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6IChnc3RfYWxhd2VuY19iYXNlX2luaXQpOgorCSAgKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOiAoZ3N0X211bGF3ZGVjX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6IChnc3RfbXVsYXdlbmNfYmFzZV9pbml0KToKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X2Jhc2VfaW5pdCk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfYmFzZV9pbml0KToKKwkgICogZ3N0L21lZGlhbi9nc3RtZWRpYW4uYzoKKwkgICogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYzoKKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOgorCSAgKiBnc3Qvb2xkY29yZS9nc3RhZ2dyZWdhdG9yLmM6CisJICAqIGdzdC9vbGRjb3JlL2dzdGZkc2luay5jOgorCSAgKiBnc3Qvb2xkY29yZS9nc3RtZDVzaW5rLmM6CisJICAqIGdzdC9vbGRjb3JlL2dzdG11bHRpZmlsZXNyYy5jOgorCSAgKiBnc3Qvb2xkY29yZS9nc3RwaXBlZmlsdGVyLmM6CisJICAqIGdzdC9vbGRjb3JlL2dzdHNoYXBlci5jOgorCSAgKiBnc3Qvb2xkY29yZS9nc3RzdGF0aXN0aWNzLmM6CisJICAqIGdzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuYzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkgICogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6CisJICAqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6IChnc3RfZ2FtbWFfYmFzZV9pbml0KToKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICAqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb3RlbXBsYXRlLmM6CisJICAoZ3N0X3ZpZGVvdGVtcGxhdGVfYmFzZV9pbml0KToKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9iYXNlX2luaXQpLAorCSAgKGdzdF93YXZwYXJzZV9jbGFzc19pbml0KSwgKGdzdF93YXZwYXJzZV9kaXNwb3NlKSwKKwkgIChnc3Rfd2F2cGFyc2VfcmVzZXQpLCAoZ3N0X3dhdnBhcnNlX2luaXQpLAorCSAgKGdzdF93YXZwYXJzZV9wZXJmb3JtX3NlZWspLCAoZ3N0X3dhdnBhcnNlX3BlZWtfY2h1bmtfaW5mbyksCisJICAoZ3N0X3dhdnBhcnNlX3BlZWtfY2h1bmspLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwKKwkgIChnc3Rfd2F2cGFyc2VfcGFyc2Vfc3RyZWFtX2luaXQpLCAoZ3N0X3dhdnBhcnNlX3NlbmRfZXZlbnQpLAorCSAgKGdzdF93YXZwYXJzZV9hZGRfc3JjX3BhZCksIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpLAorCSAgKGdzdF93YXZwYXJzZV9jaGFpbiksIChnc3Rfd2F2cGFyc2Vfc3JjcGFkX2V2ZW50KSwKKwkgIChnc3Rfd2F2cGFyc2Vfc2lua19hY3RpdmF0ZSksIChnc3Rfd2F2cGFyc2Vfc2lua19hY3RpdmF0ZV9wdWxsKSwKKwkgIChnc3Rfd2F2cGFyc2VfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJICAqIHN5cy9vc3MvZ3N0b3NzbWl4ZXJlbGVtZW50LmM6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NyYy5jOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50LmM6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyLmM6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NpbmsuYzoKKwkgIERlZmluZSBHc3RFbGVtZW50RGV0YWlscyBhcyBjb25zdCBhbmQgYWxzbyBzdGF0aWMgKHdoZW4gZGVmaW5lZCBhcworCSAgZ2xvYmFsKQorCisyMDA2LTA0LTI1IDE3OjU3OjIzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvanBlZy9nc3RqcGVnZGVjLmM6IFNvdXJjZSBwYWQgaGFzIGZpeGVkIGNhcHMuIElmIHdlIGRvbid0IHNldCB0aGlzLCBiYWQgdGhpbmdzIGhhcHBlbiB3aGVuIHRoZSB3aW5kb3cgaXMgcmVzaXplZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChnc3RfanBlZ19kZWNfY2hhaW4pOgorCSAgU291cmNlIHBhZCBoYXMgZml4ZWQgY2Fwcy4gSWYgd2UgZG9uJ3Qgc2V0IHRoaXMsIGJhZAorCSAgdGhpbmdzIGhhcHBlbiB3aGVuIHRoZSB3aW5kb3cgaXMgcmVzaXplZC4KKworMjAwNi0wNC0yNSAxNjozODo1MCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thLzogSGFuZGxlIGNhc2Ugd2hlcmUgdGhlIFRyYWNrVHlwZSBlYm1sIGNodW5rIGRvZXMgbm90IGNvbWUgYmVmb3JlIHRoZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmM6CisJICAoZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfdmlkZW9fY29udGV4dCksCisJICAoZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfYXVkaW9fY29udGV4dCksCisJICAoZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfc3VidGl0bGVfY29udGV4dCksCisJICAoZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfY29tcGxleF9jb250ZXh0KToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgSGFuZGxlIGNhc2Ugd2hlcmUgdGhlIFRyYWNrVHlwZSBlYm1sIGNodW5rIGRvZXMgbm90IGNvbWUgYmVmb3JlIHRoZQorCSAgVHJhY2tJbmZvQXVkaW8gb3IgVHJhY2tJbmZvVmlkZW8gZWJtbCBjaHVuayAoIzMzOTQ0NikuIElnbm9yZSBRb1MKKwkgIGV2ZW50cy4KKworMjAwNi0wNC0yNSAxNjowOTo1NSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEl0J3MgY29kZWNfZGF0YSwgbm90IGNvZGVjX2luZm8uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRncGF5LmM6IChnc3RfcnRwX21wNGdfcGF5X3NldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzogKGdzdF9ydHBfbXA0dl9wYXlfc2V0Y2Fwcyk6CisJICBJdCdzIGNvZGVjX2RhdGEsIG5vdCBjb2RlY19pbmZvLgorCisyMDA2LTA0LTI1IDExOjQ1OjAwICswMDAwICBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogSGFuZGxlIGNvZGVjX2RhdGEgZm9yIFZmVyBjb21wYXRpYmlsaXR5IGNvZGVjIElEcyAoIzMzOTQ1MSkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IE1hcmsgTmF1d2VsYWVydHMgIDxtYW5hdXcgYXQgc2t5bmV0IGRvdCBiZT4KKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBIYW5kbGUgY29kZWNfZGF0YSBmb3IgVmZXIGNvbXBhdGliaWxpdHkgY29kZWMgSURzICgjMzM5NDUxKQorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX211eF92aWRlb19wYWRfc2V0Y2Fwcyk6CisJICBTYW1lIGhlcmUsIGhhbmRsZSBjb2RlY19kYXRhIGFuZCBhZGQgYWRkaXRpb25hbCBjYXBzIHdlIGNhbiBoYW5kbGUKKwkgIG5vdyB0byB0aGUgcGFkIHRlbXBsYXRlIChodWZmeXV2LCBkdiBhbmQgaDI2MyB2aWRlbykgKCMzMzk0NTEpCisKKzIwMDYtMDQtMjUgMTE6MDk6MjQgKzAwMDAgIEpvc2VmIFpsb21layA8am9zZWYuemxvbWVrQGl0b25pcy50dj4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBGaXggdGltZXN0YW1waW5nIG9mIEItZnJhbWVzLCB1c2Ugc2lnbmVkIGludGVnZXJzLCBkbyBzb21lIHJvdW5kaW5nICgjMzM5Njc4KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IEpvc2VmIFpsb21layAgPGpvc2VmIGRvdCB6bG9tZWsgYXQgaXRvbmlzIGRvdCB0dj4KKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9tdXhfY3JlYXRlX2J1ZmZlcl9oZWFkZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfZGF0YSk6CisJICBGaXggdGltZXN0YW1waW5nIG9mIEItZnJhbWVzLCB1c2Ugc2lnbmVkIGludGVnZXJzLCBkbworCSAgc29tZSByb3VuZGluZyAoIzMzOTY3OCkuCisKKzIwMDYtMDQtMjQgMTg6MzA6NTUgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogQ2hhbmdlTG9nOgorCSogZXh0L2Fubm9kZXgvZ3N0Y21tbHBhcnNlci5jOgorCSAganVzdCBtYWtlIGl0IGNvbXBpbGUgd2l0aCAtLWRpc2FibGUtZ3N0LWRlYnVnLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBqdXN0IG1ha2UgaXQgY29tcGlsZSB3aXRoIC0tZGlzYWJsZS1nc3QtZGVidWcuCisKKzIwMDYtMDQtMjMgMTU6NTU6MzAgKzAwMDAgIFPDqWJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IEZpeCBhIGJhZCBjb252ZXJzaW9uIHVzaW5nIGdzdF9ndWludDY0X3RvX2dkb3VibGUuIGZhYnMgKChnZG91YmxlKSBkZW11eC0+aW5kZXhbZW50cnldLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FkZW11eF9kb19pbmRleF9zZWVrKToKKwkgIEZpeCBhIGJhZCBjb252ZXJzaW9uIHVzaW5nIGdzdF9ndWludDY0X3RvX2dkb3VibGUuCisJICBmYWJzICgoZ2RvdWJsZSkgZGVtdXgtPmluZGV4W2VudHJ5XS50aW1lIC0gKGdkb3VibGUpIHNlZWtfcG9zKSBjYW4gbm90IGJlCisJICByZXBsYWNlZCBieSBmYWJzIChnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChkZW11eC0+aW5kZXhbZW50cnldLnRpbWUgLSBzZWVrX3BvcykpIGFzIHRoZQorCSAgZGlmZmVyZW5jZSBjb3VsZCBiZSBuZWdhdGl2ZS4gZmFicyAoZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAoZGVtdXgtPmluZGV4W2VudHJ5XS50aW1lKSAtCisJICBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChzZWVrX3BvcykpIGlzIHRoZSBnb29kIHNvbHV0aW9uLiBUaGFua3MgdG8gVGltIHdobyBoYXMgc2VlbiBteQorCSAgbWlzdGFrZS4KKworMjAwNi0wNC0yMiAxNTozMjo0OCArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogVXNlIGdzdF9ndWludDY0X3RvX2dkb3VibGUgZm9yIGNvbnZlcnNpb25zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FkZW11eF9kb19pbmRleF9zZWVrKToKKwkgIFVzZSBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIGZvciBjb252ZXJzaW9ucworCSAgKiB3aW4zMi92czYvZ3N0X3BsdWdpbnNfZ29vZC5kc3c6CisJICAqIHdpbjMyL3ZzNi9saWJnc3RpY3lkZW11eC5kc3A6CisJICBBZGQgYSBwcm9qZWN0IGZpbGUgZm9yIGljeWRlbXV4CisKKzIwMDYtMDQtMjEgMTg6MDc6MTAgKzAwMDAgIEZhYnJpemlvIEdlbm5hcmkgPGZhYnJpemlvLmdlQHRpc2NhbGkuaXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogV2hlbiBzcGxpdHRpbmcgYXVkaW8gY2h1bmtzLCB0aGUgYmxvY2sgYWxpZ25tZW50IGlzIG5vdCB0YWtlbiBpbiBjb25zaWRlcmF0aW9uLCBzbyB0aGUgc21hbGxlci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogRmFicml6aW8gR2VubmFyaSA8ZmFicml6aW8gZG90IGdlIGF0IHRpc2NhbGkgZG90IGl0PgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9pbmRleCksIChnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpOgorCSAgV2hlbiBzcGxpdHRpbmcgYXVkaW8gY2h1bmtzLCB0aGUgYmxvY2sgYWxpZ25tZW50IGlzIG5vdCB0YWtlbiBpbgorCSAgY29uc2lkZXJhdGlvbiwgc28gdGhlIHNtYWxsZXIgY2h1bmtzIGNvdWxkIGJlIG9mIHNpemUgd2hpY2ggaXMKKwkgIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBibG9jayBhbGlnbm1lbnQuIEZpeGVzICMzMzY5MDQKKworMjAwNi0wNC0yMSAxNzo1OTowMyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IFVzZSBzY2FsZSBmdW5jdGlvbnMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzogKGdzdF9kdjEzOTRzcmNfY29udmVydCk6CisJICBVc2Ugc2NhbGUgZnVuY3Rpb25zCisKKzIwMDYtMDQtMjEgMTc6Mjc6NDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9kdi9nc3Rkdi5jOiBGaXggYnVpbGQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2LmM6IChwbHVnaW5faW5pdCk6CisJICBGaXggYnVpbGQuCisKKzIwMDYtMDQtMjEgMTc6MTU6MjkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9kZWJ1Zy9wcm9ncmVzc3JlcG9ydC5jOiBBZGQgJ2Zvcm1hdCcgcHJvcGVydHkgdG8gZm9yY2UgcXVlcnlpbmcgdG8gYSBwYXJ0aWN1bGFyIGZvcm1hdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVidWcvcHJvZ3Jlc3NyZXBvcnQuYzogKGdzdF9wcm9ncmVzc19yZXBvcnRfZmluYWxpemUpLAorCSAgKGdzdF9wcm9ncmVzc19yZXBvcnRfY2xhc3NfaW5pdCksIChnc3RfcHJvZ3Jlc3NfcmVwb3J0X2luaXQpLAorCSAgKGdzdF9wcm9ncmVzc19yZXBvcnRfZG9fcXVlcnkpLCAoZ3N0X3Byb2dyZXNzX3JlcG9ydF9yZXBvcnQpLAorCSAgKGdzdF9wcm9ncmVzc19yZXBvcnRfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcHJvZ3Jlc3NfcmVwb3J0X2dldF9wcm9wZXJ0eSk6CisJICBBZGQgJ2Zvcm1hdCcgcHJvcGVydHkgdG8gZm9yY2UgcXVlcnlpbmcgdG8gYSBwYXJ0aWN1bGFyIGZvcm1hdC4KKworMjAwNi0wNC0yMSAxNTo1MDoyOCArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBleHQvZHYvZ3N0ZHYuYyAocGx1Z2luX2luaXQpOiBsaWJkdiBpcyBhIG1hcmdpbmFsIGRlY29kZXIsIGF0IGJlc3QsIG9uIGJpZyBlbmRpYW4gc3lzdGVtcy4gRHJvcCBpdHMgcmFuayBpbiB0aGF0IGNhc2UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wNC0yMSAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogZXh0L2R2L2dzdGR2LmMgKHBsdWdpbl9pbml0KTogbGliZHYgaXMgYSBtYXJnaW5hbCBkZWNvZGVyLCBhdAorCSAgYmVzdCwgb24gYmlnIGVuZGlhbiBzeXN0ZW1zLiBEcm9wIGl0cyByYW5rIGluIHRoYXQgY2FzZS4gT1RPSCBvbgorCSAgeDg2IGl0J3MgcXVpdGUgZmluZS4gU2VlIGNoYW5nZXMgZnJvbSB0b2RheSBpbiBnc3QtZmZtcGVnIGFzIHdlbGwuCisKKzIwMDYtMDQtMjEgMDk6Mjc6MTEgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgQWRkIGljeWRlbXV4LCBhbmQgdGVzdHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvaWN5ZGVtdXgvTWFrZWZpbGUuYW06CisJICAqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jOiAoZ3N0X2ljeWRlbXV4X2dldF90eXBlKSwKKwkgIChnc3RfaWN5ZGVtdXhfYmFzZV9pbml0KSwgKGdzdF9pY3lkZW11eF9jbGFzc19pbml0KSwKKwkgIChnc3RfaWN5ZGVtdXhfcmVzZXQpLCAoZ3N0X2ljeWRlbXV4X2luaXQpLAorCSAgKGdzdF9pY3lkZW11eF9zaW5rX3NldGNhcHMpLCAoZ3N0X2ljeWRlbXV4X2Rpc3Bvc2UpLAorCSAgKGdzdF9pY3lkZW11eF9hZGRfc3JjcGFkKSwgKGdzdF9pY3lkZW11eF9yZW1vdmVfc3JjcGFkKSwKKwkgICh1bmljb2RpZnkpLCAoZ3N0X2ljeWRlbXV4X3VuaWNvZGlmeSksCisJICAoZ3N0X2ljeWRlbXV4X3BhcnNlX2FuZF9zZW5kX3RhZ3MpLAorCSAgKGdzdF9pY3lkZW11eF90eXBlZmluZF9vcl9mb3J3YXJkKSwgKGdzdF9pY3lkZW11eF9hZGRfbWV0YSksCisJICAoZ3N0X2ljeWRlbXV4X2NoYWluKSwgKGdzdF9pY3lkZW11eF9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9pY3lkZW11eF9zZW5kX3RhZ19ldmVudCksIChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5oOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYzogKHR5cGVmaW5kX3N1Y2NlZWQpLAorCSAgKHBsdWdpbl9pbml0KSwgKGljeWRlbXV4X2ZvdW5kX3BhZCksIChjcmVhdGVfaWN5ZGVtdXgpLAorCSAgKGNsZWFudXBfaWN5ZGVtdXgpLCAocHVzaF9kYXRhKSwgKEdTVF9TVEFSVF9URVNUKSwKKwkgIChpY3lkZW11eF9zdWl0ZSksIChtYWluKToKKwkgIEFkZCBpY3lkZW11eCwgYW5kIHRlc3RzLgorCisyMDA2LTA0LTIwIDE3OjQ4OjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IFBvc3QgU0VHTUVOVF9ET05FIG1lc3NhZ2UgaW4gVElNRSBmb3JtYXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfZGVjX2xvb3ApOgorCSAgUG9zdCBTRUdNRU5UX0RPTkUgbWVzc2FnZSBpbiBUSU1FIGZvcm1hdC4KKworMjAwNi0wNC0yMCAxNzoyOTo1NiArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBBZGRlZCBhIGNvdXBsZSBvZiBpZmRlZnMgdG8gbWFrZSBpdCBjb21waWxlIHdpdGggb3RoZXIga2VybmVscy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQWRkZWQgYSBjb3VwbGUgb2YgaWZkZWZzIHRvIG1ha2UgaXQgY29tcGlsZSB3aXRoIG90aGVyIGtlcm5lbHMuCisKKzIwMDYtMDQtMjAgMTY6MzM6NTUgKzAwMDAgIEZhYnJpemlvIEdlbm5hcmkgPGZhYnJpemlvLmdlQHRpc2NhbGkuaXQ+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogRml4IGluZGV4IGNyZWF0aW9uIHdoZW4gd2UgaGF2ZSB0byBzY2FuIHRoZSBmaWxlIHRvIGNyZWF0ZSBhbiBpbmRleC4gVGhlcmUgbWF5IGJlIG90aGVyIHR5cGVzIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogRmFicml6aW8gR2VubmFyaSAgPGZhYnJpemlvIGRvdCBnZSBhdCB0aXNjYWxpIGRvdCBpdD4KKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wZWVrX3RhZyksCisJICAoZ3N0X2F2aV9kZW11eF9uZXh0X2RhdGFfYnVmZmVyKSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX3NjYW4pOgorCSAgRml4IGluZGV4IGNyZWF0aW9uIHdoZW4gd2UgaGF2ZSB0byBzY2FuIHRoZSBmaWxlIHRvIGNyZWF0ZQorCSAgYW4gaW5kZXguIFRoZXJlIG1heSBiZSBvdGhlciB0eXBlcyBvZiBSSUZGICdMSVNUJyBjaHVua3MgdGhhbgorCSAgJ21vdmknIGFuZCB3ZSBuZWVkIHRvIHNraXAgdGhlbSBwcm9wZXJseSBhcyB3ZWxsIG9yIHdlJ2xsIGVuZCB1cAorCSAgcmVhZGluZyBnYXJiYWdlICgjMzM2ODg5KS4gU29tZSBvdGhlciBjb3NtZXRpYyBjaGFuZ2VzLgorCisyMDA2LTA0LTIwIDE0OjIxOjQyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IEFkZCBzdXBwb3J0IGZvciBzZWdtZW50IHNlZWtzIChmaXhlcyAjMzM4MjkwKS4gQWxzbyBkZW1vdGUgc29tZSByZWN1cnJpbmcgZGVidWcgbWVzc2FnZSBmcm9tIEQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfbG9vcCksCisJICAoZ3N0X2ZsYWNfZGVjX2hhbmRsZV9zZWVrX2V2ZW50KToKKwkgIEFkZCBzdXBwb3J0IGZvciBzZWdtZW50IHNlZWtzIChmaXhlcyAjMzM4MjkwKS4gQWxzbyBkZW1vdGUKKwkgIHNvbWUgcmVjdXJyaW5nIGRlYnVnIG1lc3NhZ2UgZnJvbSBERUJVRyB0byBMT0cgbGV2ZWwuCisKKzIwMDYtMDQtMjAgMTM6MjM6NDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS86IFNldCBESVNDT05UIGZsYWcgb24gZmlyc3QgYnVmZmVyIGFmdGVyIGEgZGlzY29udGludWl0eS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKSwKKwkgIChnc3RfbWF0cm9za2FkZW11eF9kb19pbmRleF9zZWVrKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NlZWtfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgU2V0IERJU0NPTlQgZmxhZyBvbiBmaXJzdCBidWZmZXIgYWZ0ZXIgYSBkaXNjb250aW51aXR5LgorCSAgRml4IG5ld3NlZ21lbnQgZXZlbnRzIHNlbnQgd2hlbiBzZWVraW5nIGFuZCBob25vdXIgS0VZX1VOSVQKKwkgIHNlZWsgZmxhZy4gQ3JlYXRlIHBhZCB3aXRoIGJvZ3VzIGNhcHMgaWYgd2UgZG9uJ3QgcmVjb2duaXNlCisJICB0aGUgc3RyZWFtIGNvZGVjIGlkLgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkgIEZpeCBHT2JqZWN0IG1hY3Jvcy4KKworMjAwNi0wNC0yMCAxMTowMDoxNiArMDAwMCAgTWFyayBOYXV3ZWxhZXJ0cyA8bWFuYXV3QHNreW5ldC5iZT4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IEhhbmRsZSBlbmQgb2Ygc2VnbWVudCBwcm9wZXJseSB3aGVuIHNldDsgZG9uJ3QgZGVhZC1sb2NrIHdoZW4gcG9zdGluZyBzdGFydCBvZiBzZWdtZW50Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBNYXJrIE5hdXdlbGFlcnRzICA8bWFuYXV3IGF0IHNreW5ldCBkb3QgYmU+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc2Vla19ldmVudCksIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcCk6CisJICBIYW5kbGUgZW5kIG9mIHNlZ21lbnQgcHJvcGVybHkgd2hlbiBzZXQ7IGRvbid0IGRlYWQtbG9jayB3aGVuCisJICBwb3N0aW5nIHN0YXJ0IG9mIHNlZ21lbnQgbWVzc2FnZSB3aGVuIGRvaW5nIGEgc2VnbWVudCBzZWVrLgorCSAgRml4ZXMgIzMzODgxMC4KKworMjAwNi0wNC0yMCAwOTo0ODowNSArMDAwMCAgal4gPGpAYm9vdGxhYi5vcmc+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogTmV2ZXIgdHJlYXQgdmlkZW8gc3RyZWFtcyBhcyBhbiBhdWRpbyBzdHJlYW0uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBqXiA8aiBhdCBib290bGFiIGRvdCBvcmc+CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdHJhayksCisJICAocXRkZW11eF92aWRlb19jYXBzKToKKwkgIE5ldmVyIHRyZWF0IHZpZGVvIHN0cmVhbXMgYXMgYW4gYXVkaW8gc3RyZWFtLgorCSAgQWRkIHF0ZHJ3IG1pbWUgdHlwZS4KKwkgIEZpeGVzICMzMzkwNDEKKworMjAwNi0wNC0yMCAwOToxMToyMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IE1ha2UgbXBlZzIgYWFjIGF1ZGlvIHdvcms6IGNyZWF0ZSBhcnRpZmljaWFsIHByaXZhdGUgY29kZWMgZGF0YSBjaHVuayB3aGljaCBmYWFkMiBzZWVtLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYXVkaW9fY2FwcyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BsdWdpbl9pbml0KToKKwkgIE1ha2UgbXBlZzIgYWFjIGF1ZGlvIHdvcms6IGNyZWF0ZSBhcnRpZmljaWFsIHByaXZhdGUgY29kZWMgZGF0YQorCSAgY2h1bmsgd2hpY2ggZmFhZDIgc2VlbXMgdG8gcmVxdWlyZSwganVzdCBhcyB3ZSBkbyBmb3IgbXBlZzQgYWFjLgorCSAgQWxzbyBjYWxsIGdzdF9yaWZmX2luaXQoKS4gUGFydGlhbGx5IGZpeGVzICMzMzg3NjcuCisKKzIwMDYtMDQtMTkgMTU6MTY6MzMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLio6IFNldCBjYXBzIG9uIGZpcnN0IG91dGdvaW5nIGJ1ZmZlciwgc28gdGhhdCBpdCBkb2Vzbid0IGVycm9yIG91dCBpbW1lZGlhdGVseSB3aXRoIGEgbm9uLW5lZ290aS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX2Jhc2VfaW5pdCksCisJICAoZ3N0X3dhdmVuY19jbGFzc19pbml0KSwgKGdzdF93YXZlbmNfaW5pdCksCisJICAoZ3N0X3dhdmVuY19jcmVhdGVfaGVhZGVyX2J1ZiksIChnc3Rfd2F2ZW5jX3B1c2hfaGVhZGVyKSwKKwkgIChnc3Rfd2F2ZW5jX3Npbmtfc2V0Y2FwcyksIChnZXRfaWRfZnJvbV9uYW1lKSwgKGdzdF93YXZlbmNfZXZlbnQpLAorCSAgKGdzdF93YXZlbmNfY2hhaW4pLCAoZ3N0X3dhdmVuY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5oOgorCSAgU2V0IGNhcHMgb24gZmlyc3Qgb3V0Z29pbmcgYnVmZmVyLCBzbyB0aGF0IGl0IGRvZXNuJ3QgZXJyb3Igb3V0CisJICBpbW1lZGlhdGVseSB3aXRoIGEgbm9uLW5lZ290aWF0ZWQgZXJyb3IgKCMzMzg3MTYpLiBSZXdyaXRlIGFuZAorCSAgY2xlYW4gdXAgYSBiaXQ7IGZpeCBzZXRjYXBzIGZ1bmN0aW9uIHRvIHBhcnNlIHRoaW5ncyBwcm9wZXJseTsKKwkgIGZpeCBzaW5rIGNhcHMgKDhiaXQgYXVkaW8gaXMgdW5zaWduZWQgYW5kIGRvZXNuJ3QgaGF2ZSBkZXB0aCk7CisJICB1c2UgYm9pbGVycGxhdGUgbWFjcm9zOyByZW1vdmUgdW51c2VkIHByb3BlcnRpZXMgc3R1ZmYuCisKKzIwMDYtMDQtMTkgMDk6Mjc6MDAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRm9yIFZCUiBhdWRpbywgZG9uJ3QgdHJ5IHRvIGNhbGN1bGF0ZSB0aGUgc2FtcGxlc19wZXJfZnJhbWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIEZvciBWQlIgYXVkaW8sIGRvbid0IHRyeSB0byBjYWxjdWxhdGUgdGhlIHNhbXBsZXNfcGVyX2ZyYW1lLgorCSAgRml4ZXMgIzMzODkzNS4KKworMjAwNi0wNC0xOCAxODoxNDozNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6IExlYXZlIEpQRUcgZGVjb2RpbmcgdG8gb3VyIGpwZWdkZWMgcGx1Z2luLiBnZGtwaXhidWZkZWMgY2Fubm90IGhhbmRsZSBNSlBFRyBzdHJlYW1zIGFuLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJICBMZWF2ZSBKUEVHIGRlY29kaW5nIHRvIG91ciBqcGVnZGVjIHBsdWdpbi4gZ2RrcGl4YnVmZGVjIGNhbm5vdAorCSAgaGFuZGxlIE1KUEVHIHN0cmVhbXMgYW5kIG1pZ2h0IGJlIGF1dG9wbHVnZ2VkIGZvciB0aG9zZSBpZiB0aGUKKwkgIHVzZXIgZG9lc24ndCBoYXZlIGpwZWdkZWMgaW5zdGFsbGVkIChyZXN1bHRpbmcgaW4gYSBjcnlwdGljIGVycm9yCisJICBtZXNzYWdlIGFib3V0IGh1ZmZtYW4gdGFibGVzKS4gQmV0dGVyIHRvIGRpc2FibGUgSlBFRyBkZWNvZGluZyBoZXJlCisJICBhbmQgbGV0IHRoZSB1c2VyIGZpZ3VyZSBvdXQgdGhhdCBzaGUgbmVlZHMgdG8gaW5zdGFsbCBqcGVnZGVjLgorCisyMDA2LTA0LTE4IDE4OjA0OjQ4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuKjogTWFrZSB3b3JrIHdpdGggcGFja2V0aXNlZC9mcmFtZWQgaW5wdXQgKGUuZy4gcG5nLWluLXF1aWNrdGltZSkuIFVzZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOiAoZ3N0X2dka19waXhidWZfc2lua19zZXRjYXBzKSwKKwkgIChnc3RfZ2RrX3BpeGJ1Zl9jbGFzc19pbml0KSwgKGdzdF9nZGtfcGl4YnVmX2luaXQpLAorCSAgKGdzdF9nZGtfcGl4YnVmX2ZsdXNoKSwgKGdzdF9nZGtfcGl4YnVmX2NoYWluKToKKwkgICogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmg6CisJICBNYWtlIHdvcmsgd2l0aCBwYWNrZXRpc2VkL2ZyYW1lZCBpbnB1dCAoZS5nLiBwbmctaW4tcXVpY2t0aW1lKS4gVXNlCisJICBHU1RfRUxFTUVOVF9FUlJPUiB3aGVuIHdlIHJldHVybiBHU1RfRkxPV19FUlJPUi4gQWRkIHNvbWUKKwkgIEdTVF9ERUJVR19GVU5DUFRSIGhlcmUgYW5kIHRoZXJlLiBVc2UgR1NUX0xPRyBmb3IgcmVjdXJyaW5nCisJICBkZWJ1ZyBtZXNzYWdlcy4gRml4IGJvaWxlcnBsYXRlIG1hY3Jvcy4KKworMjAwNi0wNC0xOCAxNzoyOTo0MiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6IE5vIG5lZWQgdG8gc3BlY2lhbC1jYXNlIGZvciBHZGstMi4wIGFueSBsb25nZXIsIHdlIHJlcXVpcmUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKGdzdF9nZGtfcGl4YnVmX2dldF9jYXBzbGlzdCksCisJICAoZ3N0X2dka19waXhidWZfc2V0X3Byb3BlcnR5KSwgKGdzdF9nZGtfcGl4YnVmX2dldF9wcm9wZXJ0eSk6CisJICBObyBuZWVkIHRvIHNwZWNpYWwtY2FzZSBmb3IgR2RrLTIuMCBhbnkgbG9uZ2VyLCB3ZSByZXF1aXJlCisJICBHZGsgMi4yIG9yIG5ld2VyOyBtaW5vciBjbGVhbi11cHMuCisKKzIwMDYtMDQtMTggMTc6MTc6NTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFJld3JpdGUgYSBiaXQ6IHVzZSBHc3RCYXNlU2luazo6c3RhcnQgYW5kIHN0b3AgaW5zdGVhZCBvZiBhIHN0YXRlIGNoYW5nZSBmdW5jdGlvbjsgdXNlIEdTVF9FTEVNRU5UX0VSUk9SIGZvciBlcnJvciByZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6IChnc3Rfc2hvdXQyc2VuZF9iYXNlX2luaXQpLAorCSAgKGdzdF9zaG91dDJzZW5kX2NsYXNzX2luaXQpLCAoZ3N0X3Nob3V0MnNlbmRfaW5pdCksCisJICAoc2V0X3Nob3V0X21ldGFkYXRhKSwgKGdzdF9zaG91dDJzZW5kX3NldF9tZXRhZGF0YSksCisJICAoZ3N0X3Nob3V0MnNlbmRfZXZlbnQpLCAoZ3N0X3Nob3V0MnNlbmRfc3RhcnQpLAorCSAgKGdzdF9zaG91dDJzZW5kX2Nvbm5lY3QpLCAoZ3N0X3Nob3V0MnNlbmRfc3RvcCksCisJICAoZ3N0X3Nob3V0MnNlbmRfcmVuZGVyKSwgKGdzdF9zaG91dDJzZW5kX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3Nob3V0MnNlbmRfZ2V0X3Byb3BlcnR5KSwgKGdzdF9zaG91dDJzZW5kX3NldGNhcHMpLAorCSAgKHBsdWdpbl9pbml0KToKKwkgICogZXh0L3Nob3V0Mi9nc3RzaG91dDIuaDoKKwkgICogcG8vUE9URklMRVMuaW46CisJICBSZXdyaXRlIGEgYml0OiB1c2UgR3N0QmFzZVNpbms6OnN0YXJ0IGFuZCBzdG9wIGluc3RlYWQgb2YgYSBzdGF0ZQorCSAgY2hhbmdlIGZ1bmN0aW9uOyB1c2UgR1NUX0VMRU1FTlRfRVJST1IgZm9yIGVycm9yIHJlcG9ydGluZywgbm90CisJICBnX2Vycm9yKCkgb3IgR1NUX0VSUk9SKCk7IGRvbid0IHVucmVmIGNhcHMgaW4gc2V0Y2FwcyBmdW5jdGlvbiwKKwkgIHdpbGwgY2F1c2UgY3Jhc2hlcyBvciBhc3NlcnRpb24gZmFpbHVyZXM7IHJlbW92ZSAodW51c2VkKSAic3luYyIKKwkgIHByb3BlcnR5LCBiYXNlc2luayBhbHJlYWR5IGhhcyBzdWNoIGEgcHJvcGVydHk7IG1pc2MuIG90aGVyCisJICBtaW5vciBmaXhlcyBhbmQgY2xlYW51cHMuCisKKzIwMDYtMDQtMTggMTQ6MTU6MzMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIEFkZCB0cmFuc2xhdGFibGUgZXJyb3IgbWVzc2FnZSBmb3Igd2hlbiB3ZSBjYW5ub3QgY29ubmVjdCB0byB0aGUgc291bmQgc2VydmVyLCBhcyAiQ2Fubm90IG9wZW4gcmVzb3VyY2UgZm9yIHdyaXRpbmciIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfb3BlbiksIChnc3RfZXNkc2lua19wcmVwYXJlKToKKwkgICogZXh0L2VzZC9nc3Rlc2QuYzogKHBsdWdpbl9pbml0KToKKwkgICogcG8vUE9URklMRVMuaW46CisJICBBZGQgdHJhbnNsYXRhYmxlIGVycm9yIG1lc3NhZ2UgZm9yIHdoZW4gd2UgY2Fubm90CisJICBjb25uZWN0IHRvIHRoZSBzb3VuZCBzZXJ2ZXIsIGFzICJDYW5ub3Qgb3BlbiByZXNvdXJjZQorCSAgZm9yIHdyaXRpbmciIGlzbid0IHJlYWxseSBhbiBhY2NlcHRhYmxlIG1lc3NhZ2UgdG8gc2hvdworCSAgdG8gdGhlIHVzZXIgaW4gdGhpcyBjYXNlLgorCisyMDA2LTA0LTE4IDEzOjMyOjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvb3NzL2dzdC1pMThuLXBsdWdpbi5oOiBSZW1vdmUgYm9ndXMgZmlsZSB0aGF0IGRvZXNuJ3QgYmVsb25nIGhlcmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zcy9nc3QtaTE4bi1wbHVnaW4uaDoKKwkgIFJlbW92ZSBib2d1cyBmaWxlIHRoYXQgZG9lc24ndCBiZWxvbmcgaGVyZS4KKworMjAwNi0wNC0xNyAxOTo1NzoxMCArMDAwMCAgUGhpbGlwcGUgVmFsZW1ib2lzIDxsZXBoaWxvdXNvcGhlQHVzZXJzLnNmLm5ldD4KKworCSAgZXh0L3Nob3V0Mi9nc3RzaG91dDIuKjogSGFuZGxlIHRhZ3MgYmVpbmcgcmVjZWl2ZWQgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgaXMgZXN0YWJsaXNoZWQgcHJvcGVybHkgKHNlZSAjLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBQaGlsaXBwZSBWYWxlbWJvaXMKKwkgICogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzogKGdzdF9zaG91dDJzZW5kX2luaXQpLAorCSAgKGdzdF9zaG91dDJzZW5kX3NldF9tZXRhZGF0YSksIChnc3Rfc2hvdXQyc2VuZF9ldmVudCksCisJICAoZ3N0X3Nob3V0MnNlbmRfcmVuZGVyKSwgKGdzdF9zaG91dDJzZW5kX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmg6CisJICBIYW5kbGUgdGFncyBiZWluZyByZWNlaXZlZCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gdG8KKwkgIHRoZSBzZXJ2ZXIgaXMgZXN0YWJsaXNoZWQgcHJvcGVybHkgKHNlZSAjMzM4NjM2KS4KKworMjAwNi0wNC0xNyAxOTo0MzozMiArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6CisJICBKdXN0IGFkZGVkIGEgZ3RrLWRvYyBjb21tZW50LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBKdXN0IGFkZGVkIGEgZ3RrLWRvYyBjb21tZW50LgorCisyMDA2LTA0LTE3IDE5OjEyOjM2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOiBEb24ndCBjcmFzaCBpbiBjYXNlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgZmFpbHM6IGRvbid0IHNldCBwb2ludGVyIHRvIE5VTEwgYnkgYXNzaWduaW4uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOiAoZ3N0X3Nob3V0MnNlbmRfcmVuZGVyKToKKwkgIERvbid0IGNyYXNoIGluIGNhc2UgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBmYWlsczoKKwkgIGRvbid0IHNldCBwb2ludGVyIHRvIE5VTEwgYnkgYXNzaWduaW5nIEZBTFNFOyBlcnJvciBvdXQKKwkgIHByb3Blcmx5IGJ5IHVzaW5nIEdTVF9FTEVNRU5UX0VSUk9SIGFuZCByZXR1cm5pbmcKKwkgIEdTVF9GTE9XX0VSUk9SIChmaXhlcyAjMzM4NjM2KS4gTGFzdGx5LCBmcmVlIGNvbm5lY3Rpb24KKwkgIGJlZm9yZSByZXNldHRpbmcgdGhlIHBvaW50ZXIuCisKKzIwMDYtMDQtMTcgMTA6MDE6NTEgKzAwMDAgIEFsZXggTGFuY2FzdGVyIDxhbGV4bGFuQGZlZG9yYXByb2plY3Qub3JnPgorCisJICBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOiAoRml4ZXMgIzMzODcxMykKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdGFncy5jOgorCSAgUmVjb2duaXNlIFRDTyAoR2VucmUpIHRhZ3MgaW4gSUQzdjIuMi4gUGF0Y2ggYnkgQWxleCBMYW5jYXN0ZXIKKwkgIChGaXhlcyAjMzM4NzEzKQorCisyMDA2LTA0LTEzIDIxOjQ1OjU3ICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIEZpeGVkIHNvbWUgbWVtb3J5IGxlYWtzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGaXhlZCBzb21lIG1lbW9yeSBsZWFrcy4KKworMjAwNi0wNC0xMyAwOToxNTozMSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5oOgorCSogZ3N0L3J0cC9nc3RydHAuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBwY21hcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5Lmg6CisJICByZXZlcnRpbmcgcnRwIHBhdGNoZXMgdG8gZml4IGZyZWV6ZSBicmVhayBvbiAtYmFzZSBhcyBleHBsYWluZWQgb24gdGhlIGxpc3QKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmV2ZXJ0aW5nIHJ0cCBwYXRjaGVzIHRvIGZpeCBmcmVlemUgYnJlYWsgb24gLWJhc2UgYXMgZXhwbGFpbmVkIG9uIHRoZSBsaXN0CisKKzIwMDYtMDQtMTMgMDk6MDE6MTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9ydHAvOiBGaXggR09iamVjdCBtYWNyb3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNnBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBwY211cGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5Lmg6CisJICBGaXggR09iamVjdCBtYWNyb3MuCisKKzIwMDYtMDQtMTMgMDM6NDI6NTEgKzAwMDAgIFBoaWxpcHBlIEthbGFmIDxwaGlsaXBwZS5rYWxhZkBjb2xsYWJvcmEuY28udWs+CisKKwkgIGdzdC9ydHAvOiBQb3J0ZWQgbXVsYXcgYW5kIGFsYXcgcGF5bG9hZGVycyB0byB1c2UgbmV3IGJhc2UgY2xhc3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wNC0xMiBQaGlsaXBwZSBLYWxhZiA8cGhpbGlwcGUua2FsYWZAY29sbGFib3JhLmNvLnVrPgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwcGNtdXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuaDoKKwkgIFBvcnRlZCBtdWxhdyBhbmQgYWxhdyBwYXlsb2FkZXJzIHRvIHVzZSBuZXcgYmFzZSBjbGFzcworCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBpbGJjcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5Lmg6CisJICBBZGRlZCBuZXcgaUxCQyBwYXlsb2FkZXIvZGVwYXlsb2FkZXIuIFBheWxvYWRlciB1c2VzIG5ldyBhdWRpbyBwYXlsb2FkIGJhc2UKKwkgIGNsYXNzLgorCisyMDA2LTA0LTEyIDIxOjU3OjAyICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIEZpeCB0byB3b3JrIGluIHJlYWQgbW9kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4IHRvIHdvcmsgaW4gcmVhZCBtb2RlLgorCisyMDA2LTA0LTEyIDA5OjQyOjEwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogU29tZSBjbGVhbnVwcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKGdzdF9nZGtfcGl4YnVmX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X2dka19waXhidWZfZ2V0X2NhcHNsaXN0KSwgKGdzdF9nZGtfcGl4YnVmX3NpbmtfZ2V0Y2FwcyksCisJICAoZ3N0X2dka19waXhidWZfY2xhc3NfaW5pdCksIChnc3RfZ2RrX3BpeGJ1Zl9pbml0KSwKKwkgIChnc3RfZ2RrX3BpeGJ1Zl9mbHVzaCksIChnc3RfZ2RrX3BpeGJ1Zl9zaW5rX2V2ZW50KSwKKwkgIChnc3RfZ2RrX3BpeGJ1Zl9jaGFpbik6CisJICBTb21lIGNsZWFudXBzLgorCSAgQWRkZWQgUkdCQSBhcyBhIHBvc3NpYmxlIG91dHB1dCBmb3JtYXQuCisJICBDb3JyZWN0bHkgZnJlZSB0aGUgc3VwcG9ydGVkIG1pbWV0eXBlcy4KKwkgIGRlcHJlY2F0ZSBzaWxlbnQgYXJnLCBpdCdzIG5vdCB1c2VkLgorCSAgUmV0dXJuIHJlc3VsdCBmcm9tIF9hbGxvY19idWZmZXIgdG8gcGVlci4KKworMjAwNi0wNC0xMSAxODowMzozNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzogRG9uJ3QgbGVhayBtZW1vcnkgYWxsb2NhdGVkIGJ5IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYygpIGJ5IG92ZXJ3cml0aW5nIEdTVF9CVUZGRVJfTUFMTE9DLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzogKGdzdF9ydHBfbXA0dl9kZXBheV9wcm9jZXNzKToKKwkgIERvbid0IGxlYWsgbWVtb3J5IGFsbG9jYXRlZCBieSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MoKSBieQorCSAgb3ZlcndyaXRpbmcgR1NUX0JVRkZFUl9NQUxMT0NEQVRBLgorCisyMDA2LTA0LTExIDE1OjI3OjMxICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIGZpeCB2ZXJzaW9uIG51bWJlciBtYWNybworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggdmVyc2lvbiBudW1iZXIgbWFjcm8KKworMjAwNi0wNC0xMSAwOTozNTo0NSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2xpYnBuZy9nc3RwbmdkZWMuKjogSGFuZGxlIG1vcmUgdGhhbiBvbmUgZnJhbWUgaWYgdGhlIGNvbnRlbnQgaXMgZnJhbWVkLCBsaWtlIHdpdGggcG5nLWluLXF1aWNrdGltZSAoIzMzMTkxNykuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKGdzdF9wbmdkZWNfaW5pdCksCisJICAodXNlcl9lbmRyb3dfY2FsbGJhY2spLCAodXNlcl9lbmRfY2FsbGJhY2spLAorCSAgKGdzdF9wbmdkZWNfY2Fwc19jcmVhdGVfYW5kX3NldCksIChnc3RfcG5nZGVjX2NoYWluKSwKKwkgIChnc3RfcG5nZGVjX3Npbmtfc2V0Y2FwcyksIChnc3RfcG5nZGVjX3NpbmtfZXZlbnQpLAorCSAgKGdzdF9wbmdkZWNfbGlicG5nX2NsZWFyKSwgKGdzdF9wbmdkZWNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuaDoKKwkgIEhhbmRsZSBtb3JlIHRoYW4gb25lIGZyYW1lIGlmIHRoZSBjb250ZW50IGlzIGZyYW1lZCwKKwkgIGxpa2Ugd2l0aCBwbmctaW4tcXVpY2t0aW1lICgjMzMxOTE3KS4KKworMjAwNi0wNC0xMCAxOTo1NTozMSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIHN5cy9vc3MvOiAtIHRoZSB1c2VyLXZpc2libGUgZXJyb3Igc3RyaW5ncyB3ZXJlIGluIHRoZSB3cm9uZyBjYXRlZ29yeQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3MvTWFrZWZpbGUuYW06CisJICAqIHN5cy9vc3MvY29tbW9uLmg6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc19zaW5rX2luaXQpLCAoZ3N0X29zc19zaW5rX29wZW4pLAorCSAgKGdzdF9vc3Nfc2lua19wcmVwYXJlKSwgKGdzdF9vc3Nfc2lua191bnByZXBhcmUpOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NyYy5jOiAoZ3N0X29zc19zcmNfcHJlcGFyZSksCisJICAoZ3N0X29zc19zcmNfdW5wcmVwYXJlKToKKwkgIC0gdGhlIHVzZXItdmlzaWJsZSBlcnJvciBzdHJpbmdzIHdlcmUgaW4gdGhlIHdyb25nIGNhdGVnb3J5CisJICAtIGFuZCB0aGUgbWVzc2FnZXMgd2VyZSBub3QgbWFya2VkIGZvciB0cmFuc2xhdGlvbgorCSAgLSB3aGljaCBpcyBhY3R1YWxseSBhIGdvb2QgdGhpbmcsIGJlY2F1c2UgdGhleSB3ZXJlIGV4YWN0bHkKKwkgIHRoZSBraW5kIG9mIG1lc3NhZ2UgeW91IHdvdWxkIG5ldmVyIHdhbnQgYW55b25lIHRvIHNlZQorCSAgLSB0aGUgbWFjcm9zIHdlcmUgdXNpbmcgdmFyaWFibGVzIHRoYXQgZGlkbid0IGV4aXN0IGluIHRoZSBtYWNybworCSAgYXJndW1lbnRzCisJICAtIGFuZCB0aGV5IHdlcmUgb2J2aW91c2x5IGNvcGllZCBmcm9tIGVhY2ggb3RoZXIgYW5kIHRoZW4gbW9kaWZpZWQKKwkgIC0gc28gYSBjb21tb24gaGVhZGVyIG1ha2VzIHNlbnNlCisKKzIwMDYtMDQtMTAgMTc6MTY6MDkgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRml4IHBhcnNpbmcgb2YgbmV3ZXIgc3RzZCBjaHVua3MgYWdhaW4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIEZpeCBwYXJzaW5nIG9mIG5ld2VyIHN0c2QgY2h1bmtzIGFnYWluLgorCisyMDA2LTA0LTEwIDE2OjA5OjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IERvbid0IHRyeSB0byBtb2RpZnkgcmVhZC1vbmx5IGRhdGEuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOiAoZ3N0X2VibWxfcmVhZF9zaW50KToKKwkgIERvbid0IHRyeSB0byBtb2RpZnkgcmVhZC1vbmx5IGRhdGEuCisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrKToKKwkgIEZpeCBjb21tZW50ICh3b24ndCBjcmFzaCBhbnkgbG9uZ2VyIG5vdykuCisKKzIwMDYtMDQtMTAgMTU6NDg6NTUgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOiBVc2UgY29waWVzIG9mIGhlYWRlciBidWZmZXJzIGZvciBjYXBzIHRvIGF2b2lkIGNpcmN1bGFyIHJlZmNvdW50aW5nIHByb2JsZW1zIChhcyBpbiB0aGVvcmFkLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOiAoZ3N0X2NtbWxfZW5jX3NldF9oZWFkZXJfb25fY2Fwcyk6CisJICBVc2UgY29waWVzIG9mIGhlYWRlciBidWZmZXJzIGZvciBjYXBzIHRvIGF2b2lkIGNpcmN1bGFyIHJlZmNvdW50aW5nCisJICBwcm9ibGVtcyAoYXMgaW4gdGhlb3JhZGVjLCB2b3JiaXNkZWMpLgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZGVjLmM6IChHU1RfU1RBUlRfVEVTVCk6CisJICBGaXggYSB0eXBvIGluIHRlc3QgdGhhdCBtZWFudCBpdCB3YXMgdGVzdGluZyB0aGUgd3JvbmcgdGhpbmcuCisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxlbmMuYzogKGNoZWNrX2hlYWRlcnMpOgorCSAgRml4IHJlZmNvdW50IGNoZWNrcyBub3cgdGhhdCB3ZSB1c2UgYnVmZmVyLWNvcGllcyBmb3IgY2Fwcy4KKworMjAwNi0wNC0xMCAxNTo0Mzo1NCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IFVzZSBzdGF0aWMgcGFkIHRlbXBsYXRlcyB3aXRoIEFOWSBjYXBzIGZvciBhdWRpbyBhbmQgdmlkZW8gc291cmNlIHBhZHMgYW5kIGdldCByaWQgb2YgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYmFzZV9pbml0KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NlZWtfZXZlbnQpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF92aWRlb19jYXBzKSwgKGdzdF9tYXRyb3NrYV9kZW11eF9hdWRpb19jYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3VidGl0bGVfY2FwcyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BsdWdpbl9pbml0KToKKwkgIFVzZSBzdGF0aWMgcGFkIHRlbXBsYXRlcyB3aXRoIEFOWSBjYXBzIGZvciBhdWRpbyBhbmQgdmlkZW8KKwkgIHNvdXJjZSBwYWRzIGFuZCBnZXQgcmlkIG9mIGEgbG90IG9mIHVubmVjZXNzYXJ5IChhbmQgcGFydGlhbGx5CisJICBicm9rZW4pIGNvZGUgZm9yIHRoZSB0ZW1wbGF0ZSBjYXBzLiBDbGVhbiB1cCBjYXBzIGZpbmRpbmcKKwkgIGZ1bmN0aW9ucy4gRml4ZXMgcGxheWJhY2sgb2YgYXVkaW8gZmlsZXMvc3RyZWFtcyB0aGF0IGRvIG5vdAorCSAgY29udGFpbiB0aGUgc2FtcGxlIHJhdGUgYW5kL29yIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgYXVkaW8KKwkgIGNvbnRleHQgKGhhcHBlbnMgYSBsb3Qgd2l0aCB2b3JiaXMvbXAzIC5ta2EgZmlsZXMgaXQgc2VlbXMpLgorCSAgRml4ZXMgIzMzNzE4My4KKwkgIEFsc28gYWRkIG15c2VsZiB0byBjb3B5cmlnaHQgaG9sZGVycy4KKworMjAwNi0wNC0xMCAxNToyOToyMSArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBleHQvYW5ub2RleC9nc3RjbW1sdXRpbHMuYzogVXNlIGdfbGlzdF9kZWxldGVfbGluayAoKSBpbnN0ZWFkIG9mIGdfbGlzdF9yZW1vdmVfbGluayAoKSBzbyB0aGF0IHdlIGZyZWUgdGhlIGxpbmsgYXMgd2UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sdXRpbHMuYzogKGdzdF9jbW1sX3RyYWNrX2xpc3RfZGVsX2NsaXApOgorCSAgVXNlIGdfbGlzdF9kZWxldGVfbGluayAoKSBpbnN0ZWFkIG9mIGdfbGlzdF9yZW1vdmVfbGluayAoKSBzbyB0aGF0CisJICB3ZSBmcmVlIHRoZSBsaW5rIGFzIHdlbGwgYXMgdGhlIGNvbnRhaW5lZCBkYXRhLgorCisyMDA2LTA0LTEwIDE0OjIwOjQxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEZpeCBmcmFtZXJhdGUgY2FsY3VsYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfYWRkX3N0cmVhbSksCisJICAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIEZpeCBmcmFtZXJhdGUgY2FsY3VsYXRpb24uCisKKzIwMDYtMDQtMTAgMTA6MTA6NTUgKzAwMDAgIFJ5YW4gTG9ydGllIChkZXNydCkgPGRlc3J0QGRlc3RyLmNhPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IEZpeCBzb21lIGNyYXNoZXJzIHdpdGggZW1wdHkgY2h1bmtzLiAoRml4ZXMgIzMzNzc0OSkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFJ5YW4gTG9ydGllIChkZXNydCkgPGRlc3J0IGF0IGRlc3RyIGRvdCBjYT4KKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdXBlcmluZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksIChnc3RfYXZpX2RlbXV4X3BhcnNlX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpOgorCSAgRml4IHNvbWUgY3Jhc2hlcnMgd2l0aCBlbXB0eSBjaHVua3MuIChGaXhlcyAjMzM3NzQ5KQorCisyMDA2LTA0LTEwIDA4OjMxOjQwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IGZvcmNlIG1vbm8gODAwMCBIeiBvbiBBTVIgc2FtcGxlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgZm9yY2UgbW9ubyA4MDAwIEh6IG9uIEFNUiBzYW1wbGVzLgorCisyMDA2LTA0LTA5IDE4OjMwOjUxICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGV4dC9uZW9uL2dzdG5lb25odHRwc3JjLmM6IHJlbW92ZSBhdG9sbCBieSB1c2luZyBnX2FzY2lpX3N0cnRvdWxsIChhdG9sbCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdJTjMyKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9uZW9uL2dzdG5lb25odHRwc3JjLmM6IChnc3RfbmVvbmh0dHBfc3JjX3N0YXJ0KToKKwkgIHJlbW92ZSBhdG9sbCBieSB1c2luZyBnX2FzY2lpX3N0cnRvdWxsIChhdG9sbCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdJTjMyKQorCSAgKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jOgorCSAgKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICBkb25lIHNvbWUgY2xlYW5zIGluIHNvdXJjZXMKKwkgICogd2luMzIvdnM2OgorCSAgYWRkIHByb2plY3QgZmlsZXMgZm9yIG5lb24sIHF0ZGVtdXgKKworMjAwNi0wNC0wOSAxNzozMTozNyArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogdXNlIEdfR0lOVDY0X0NPTlNUQU5UIGZvciBJTlQ2NCBjb25zdGFudHMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogKGdzdF9sZXZlbF9zZXRfY2FwcyksKGdzdF9sZXZlbF90cmFuc2Zvcm1faXApOgorCSAgdXNlIEdfR0lOVDY0X0NPTlNUQU5UIGZvciBJTlQ2NCBjb25zdGFudHMKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgZGVmaW5lIHJpbnQgZm9yIFdJTjMyICNkZWZpbmUgcmludCh4KSAoZmxvb3IoKHgpKzAuNSkpCisJICAqIHdpbjMyL3ZzNi9saWJnc3RhdmkuZHNwOgorCSAgYWRkIG1pc3NpbmcgbGlicmFyaWVzIGZvciB0aGUgbGluayBhbmQgcmVtb3ZlIGF2aW11eC5jIGZyb20KKwkgIHRoZSBwcm9qZWN0IGFzIGl0IGlzbid0IHBvcnRlZCB0byAwLjEwIHlldAorCisyMDA2LTA0LTA5IDE0OjAwOjMyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IEV2ZW4gYmV0dGVyIHdvdWxkIGJlIGlmIHdlIGFjdHVhbGx5IGRpZCB0aGUgcmlnaHQgdGhpbmcgaGVyZSAoYWxzbywgR19HVUlOVDY0X0NPTlNUQU5UIG9ubHkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9yZWFkX3NpbnQpOgorCSAgRXZlbiBiZXR0ZXIgd291bGQgYmUgaWYgd2UgYWN0dWFsbHkgZGlkIHRoZSByaWdodCB0aGluZworCSAgaGVyZSAoYWxzbywgR19HVUlOVDY0X0NPTlNUQU5UIG9ubHkgZXhpc3RzIHNpbmNlIEdMaWItMi4xMCkuCisKKzIwMDYtMDQtMDkgMTM6NTI6MDMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogQ2FuJ3QganVzdCByZXBsYWNlIDFMTCB3aXRoIDFMIGhlcmUganVzdCBiZWNhdXNlIE1TVkMgZG9lc24ndCBzdXBwb3J0IGl0LCBhcyBpdCBtaWdodCBsZWFkIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogKGdzdF9lYm1sX3JlYWRfc2ludCk6CisJICBDYW4ndCBqdXN0IHJlcGxhY2UgMUxMIHdpdGggMUwgaGVyZSBqdXN0IGJlY2F1c2UgTVNWQyBkb2Vzbid0CisJICBzdXBwb3J0IGl0LCBhcyBpdCBtaWdodCBsZWFkIHRvIGluY29ycmVjdCByZXN1bHRzIHdoZW4gZG9pbmcgdGhlCisJICBiaXRzaGlmdGluZyBoZXJlLiBVc2luZyBHTGliJ3MgR19HVUlOVDY0X0NPTlNUQU5UKCkgbWFjcm8gdG8KKwkgIGZvcmNlIGEgNjQtYml0IGNvbnN0YW50IGluIGEgd2F5IHRoYXQgYWxsIGNvbXBpbGVycyBhcmUgaGFwcHkgd2l0aC4KKworMjAwNi0wNC0wOCAyMTo0ODowMSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBGaXggIzMzNzM2NSAoZ190eXBlX2NsYXNzX3JlZiA8LT4gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YmRlYy5jOiAoZ3N0X2FtcndiZGVjX2NsYXNzX2luaXQpOgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JlbmMuYzogKGdzdF9hbXJ3YmVuY19jbGFzc19pbml0KToKKwkgICogZXh0L2FtcndiL2dzdGFtcndicGFyc2UuYzogKGdzdF9hbXJ3YnBhcnNlX2NsYXNzX2luaXQpOgorCSAgKiBleHQvYXJ0cy9nc3RfYXJ0cy5jOiAoZ3N0X2FydHNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9hcnRzZC9nc3RhcnRzZHNpbmsuYzogKGdzdF9hcnRzZHNpbmtfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzaW5rLmM6IChnc3RfYWZzaW5rX2NsYXNzX2luaXQpOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc3JjLmM6IChnc3RfYWZzcmNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9hdWRpb3Jlc2FtcGxlL2dzdGF1ZGlvcmVzYW1wbGUuYzoKKwkgICogZXh0L2NkYXVkaW8vZ3N0Y2RhdWRpby5jOiAoZ3N0X2NkYXVkaW9fY2xhc3NfaW5pdCk6CisJICAqIGV4dC9kaXJlY3RmYi9kZmJ2aWRlb3NpbmsuYzogKGdzdF9kZmJ2aWRlb3NpbmtfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9kaXZ4L2dzdGRpdnhkZWMuYzogKGdzdF9kaXZ4ZGVjX2NsYXNzX2luaXQpOgorCSAgKiBleHQvaGVybWVzL2dzdGhlcm1lc2NvbG9yc3BhY2UuYzoKKwkgIChnc3RfaGVybWVzX2NvbG9yc3BhY2VfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9pdm9yYmlzL3ZvcmJpc2ZpbGUuYzogKGdzdF9pdm9yYmlzZmlsZV9jbGFzc19pbml0KToKKwkgICogZXh0L2phY2svZ3N0amFjay5jOiAoZ3N0X2phY2tfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9qYWNrL2dzdGphY2tiaW4uYzogKGdzdF9qYWNrX2Jpbl9jbGFzc19pbml0KToKKwkgICogZXh0L2xjcy9nc3Rjb2xvcnNwYWNlLmM6IChnc3RfY29sb3JzcGFjZV9jbGFzc19pbml0KToKKwkgICogZXh0L2xpYmZhbWUvZ3N0bGliZmFtZS5jOiAoZ3N0X2ZhbWVlbmNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uYzogKGdzdF9tdXNpY2JyYWluel9jbGFzc19pbml0KToKKwkgICogZXh0L25hcy9uYXNzaW5rLmM6IChnc3RfbmFzc2lua19jbGFzc19pbml0KToKKwkgICogZXh0L3Nob3V0L2dzdHNob3V0LmM6IChnc3RfaWNlY2FzdHNlbmRfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9zbmFwc2hvdC9nc3RzbmFwc2hvdC5jOiAoZ3N0X3NuYXBzaG90X2NsYXNzX2luaXQpOgorCSAgKiBleHQvc25kZmlsZS9nc3RzZi5jOiAoZ3N0X3NmX2NsYXNzX2luaXQpOgorCSAgKiBleHQvc3dmZGVjL2dzdHN3ZmRlYy5jOiAoZ3N0X3N3ZmRlY2J1ZmZlcl9jbGFzc19pbml0KSwKKwkgIChnc3Rfc3dmZGVjX2NsYXNzX2luaXQpOgorCSAgKiBleHQvdGFya2luL2dzdHRhcmtpbmRlYy5jOiAoZ3N0X3RhcmtpbmRlY19jbGFzc19pbml0KToKKwkgICogZXh0L3Rhcmtpbi9nc3R0YXJraW5lbmMuYzogKGdzdF90YXJraW5lbmNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXN0cmlwLmM6IChnc3RfY2R4YXN0cmlwX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvY2hhcnQvZ3N0Y2hhcnQuYzogKGdzdF9jaGFydF9jbGFzc19pbml0KToKKwkgICogZ3N0L2NvbG9yc3BhY2UvZ3N0Y29sb3JzcGFjZS5jOiAoZ3N0X2NvbG9yc3BhY2VfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jOiAoZ3N0X2RlaW50ZXJsYWNlX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZmVzdGl2YWwvZ3N0ZmVzdGl2YWwuYzogKGdzdF9mZXN0aXZhbF9jbGFzc19pbml0KToKKwkgICogZ3N0L2ZpbHRlci9nc3RicHdzaW5jLmM6IChnc3RfYnB3c2luY19jbGFzc19pbml0KToKKwkgICogZ3N0L2ZpbHRlci9nc3RpaXIuYzogKGdzdF9paXJfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy5jOiAoZ3N0X2xwd3NpbmNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9saWJyZmIvZ3N0cmZic3JjLmM6IChnc3RfcmZic3JjX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbWl4bWF0cml4L21peG1hdHJpeC5jOiAoZ3N0X21peG1hdHJpeF9jbGFzc19pbml0KToKKwkgICogZ3N0L21wZWcxc3lzL2dzdG1wZWcxc3lzdGVtZW5jb2RlLmM6CisJICAoZ3N0X3N5c3RlbV9lbmNvZGVfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9tcGVnMXZpZGVvcGFyc2UvZ3N0bXAxdmlkZW9wYXJzZS5jOgorCSAgKGdzdF9tcDF2aWRlb3BhcnNlX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbXBlZzJzdWIvZ3N0bXBlZzJzdWJ0LmM6IChnc3RfbXBlZzJzdWJ0X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbXBlZ2F1ZGlvcGFyc2UvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgIChnc3RfbXAzcGFyc2VfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9vdmVybGF5L2dzdG92ZXJsYXkuYzogKGdzdF9vdmVybGF5X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcGFzc3Rocm91Z2gvZ3N0cGFzc3Rocm91Z2guYzogKHBhc3N0aHJvdWdoX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcGxheW9uZGVtYW5kL2dzdHBsYXlvbmRlbWFuZC5jOiAocGxheV9vbl9kZW1hbmRfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZGVjLmM6IChnc3RfcnRqcGVnZGVjX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRqcGVnL2dzdHJ0anBlZ2VuYy5jOiAoZ3N0X3J0anBlZ2VuY19jbGFzc19pbml0KToKKwkgICogZ3N0L3Ntb290aC9nc3RzbW9vdGguYzogKGdzdF9zbW9vdGhfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9zbW9vdGh3YXZlL2dzdHNtb290aHdhdmUuYzogKGdzdF9zbW9vdGh3YXZlX2NsYXNzX2luaXQpOgorCSAgKiBnc3Qvc3BlY3RydW0vZ3N0c3BlY3RydW0uYzogKGdzdF9zcGVjdHJ1bV9jbGFzc19pbml0KToKKwkgICogZ3N0L3N0ZXJlby9nc3RzdGVyZW8uYzogKGdzdF9zdGVyZW9fY2xhc3NfaW5pdCk6CisJICAqIGdzdC9zd2l0Y2gvZ3N0c3dpdGNoLmM6IChnc3Rfc3dpdGNoX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvdHRhL2dzdHR0YWRlYy5jOiAoZ3N0X3R0YV9kZWNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC90dGEvZ3N0dHRhcGFyc2UuYzogKGdzdF90dGFfcGFyc2VfY2xhc3NfaW5pdCk6CisJICAqIGdzdC92YmlkZWMvZ3N0dmJpZGVjLmM6IChnc3RfdmJpZGVjX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOiAoZ3N0X3ZpZGVvX2Nyb3BfY2xhc3NfaW5pdCk6CisJICAqIGdzdC92aXJ0dWFsZHViL2dzdHhzaGFycGVuLmM6IChnc3RfeHNoYXJwZW5fY2xhc3NfaW5pdCk6CisJICAqIGdzdC95NG0vZ3N0eTRtZW5jb2RlLmM6IChnc3RfeTRtZW5jb2RlX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvY2Ryb20vZ3N0Y2RwbGF5ZXIuYzogKGNkcGxheWVyX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmM6CisJICAoZ3N0X2RpcmVjdHNvdW5kc2lua19jbGFzc19pbml0KToKKwkgICogc3lzL2R4cjMvZHhyM2F1ZGlvc2luay5jOiAoZHhyM2F1ZGlvc2lua19jbGFzc19pbml0KToKKwkgICogc3lzL2R4cjMvZHhyM3NwdXNpbmsuYzogKGR4cjNzcHVzaW5rX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvZHhyMy9keHIzdmlkZW9zaW5rLmM6IChkeHIzdmlkZW9zaW5rX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvcWNhbS9nc3RxY2Ftc3JjLmM6IChnc3RfcWNhbXNyY19jbGFzc19pbml0KToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMmNvbG9yYmFsYW5jZS5jOgorCSAgKGdzdF92NGwyX2NvbG9yX2JhbGFuY2VfY2hhbm5lbF9jbGFzc19pbml0KToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmM6IChnc3RfdjRsMl90dW5lcl9jaGFubmVsX2NsYXNzX2luaXQpLAorCSAgKGdzdF92NGwyX3R1bmVyX25vcm1fY2xhc3NfaW5pdCk6CisJICAqIHN5cy94aW1hZ2VzcmMveGltYWdlc3JjLmM6IChnc3RfeGltYWdlc3JjX2NsYXNzX2luaXQpOgorCSAgRml4ICMzMzczNjUgKGdfdHlwZV9jbGFzc19yZWYgPC0+IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCkKKworMjAwNi0wNC0wOCAyMToyMTo0NSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBGaXggIzMzNzM2NSAoZ190eXBlX2NsYXNzX3JlZiA8LT4gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzogKGdzdF9hYXNpbmtfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzogKGdzdF9mbGFjX3RhZ19jbGFzc19pbml0KToKKwkgICogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6IChnc3RfZ2RrX3BpeGJ1Zl9jbGFzc19pbml0KToKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOiAoZ3N0X2pwZWdlbmNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZGVjLmM6IChnc3Rfc21va2VkZWNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6IChnc3Rfc21va2VlbmNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6IChnc3RfY2FjYXNpbmtfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9saWJtbmcvZ3N0bW5nZGVjLmM6IChnc3RfbW5nZGVjX2NsYXNzX2luaXQpOgorCSAgKiBleHQvbGlibW5nL2dzdG1uZ2VuYy5jOiAoZ3N0X21uZ2VuY19jbGFzc19pbml0KToKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKGdzdF9wbmdkZWNfY2xhc3NfaW5pdCk6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6IChnc3RfcG5nZW5jX2NsYXNzX2luaXQpOgorCSAgKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOiAoZ3N0X21pa21vZF9jbGFzc19pbml0KToKKwkgICogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzogKGdzdF9zaG91dDJzZW5kX2NsYXNzX2luaXQpOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleGVuY19jbGFzc19pbml0KToKKwkgICogZ3N0L2FscGhhL2dzdGFscGhhLmM6IChnc3RfYWxwaGFfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpbXV4X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZGVidWcvZWZlbmNlLmM6IChnc3RfZWZlbmNlX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvZGVidWcvbmVnb3RpYXRpb24uYzogKGdzdF9uZWdvdGlhdGlvbl9jbGFzc19pbml0KToKKwkgICogZ3N0L2ZseC9nc3RmbHhkZWMuYzogKGdzdF9mbHhkZWNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9nb29tL2dzdGdvb20uYzogKGdzdF9nb29tX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogKGdzdF9pZDNkZW11eF9jbGFzc19pbml0KToKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6IChkZWludGVybGVhdmVfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzogKGludGVybGVhdmVfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzogKGdzdF9hbGF3ZGVjX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6IChnc3RfYWxhd2VuY19jbGFzc19pbml0KToKKwkgICogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzogKGdzdF9tdWxhd2VuY19jbGFzc19pbml0KToKKwkgICogZ3N0L21lZGlhbi9nc3RtZWRpYW4uYzogKGdzdF9tZWRpYW5fY2xhc3NfaW5pdCk6CisJICAqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6IChnc3RfbW9ub3Njb3BlX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jOiAoZ3N0X211bHRpcGFydF9tdXhfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmM6IChnc3RfYXN0ZXJpc2toMjYzX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmM6IChnc3RfcnRwX0wxNmRlcGF5X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNnBheS5jOiAoZ3N0X3J0cEwxNnBheV9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOiAoZ3N0X3J0cF9hbXJfZGVwYXlfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6IChnc3RfcnRwX2Ftcl9wYXlfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzogKGdzdF9ydHBfZGVwYXlfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuYzogKGdzdF9ydHBfZ3NtX2RlcGF5X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5jOiAoZ3N0X3J0cF9nc21fcGF5X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzogKGdzdF9ydHBfaDI2M19wYXlfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOiAoZ3N0X3J0cF9oMjYzcF9kZXBheV9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOiAoZ3N0X3J0cF9oMjYzcF9wYXlfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOiAoZ3N0X3J0cF9tcDRnX3BheV9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzogKGdzdF9ydHBfbXA0dl9kZXBheV9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6IChnc3RfcnRwX21wNHZfcGF5X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6IChnc3RfcnRwX21wYV9kZXBheV9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzogKGdzdF9ydHBfbXBhX3BheV9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYzogKGdzdF9ydHBfcGNtYV9kZXBheV9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBwY21hcGF5LmM6IChnc3RfcnRwX3BjbWFfcGF5X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVkZXBheS5jOiAoZ3N0X3J0cF9wY211X2RlcGF5X2NsYXNzX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYzogKGdzdF9ydHBfcGNtdV9wYXlfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOiAoZ3N0X3J0cF9zcGVleF9kZXBheV9jbGFzc19pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOiAoZ3N0X3J0cF9zcGVleF9wYXlfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOiAoZ3N0X3J0cGRlY19jbGFzc19pbml0KToKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfY2xhc3NfaW5pdCk6CisJICAqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5jOiAoZ3N0X3NtcHRlX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzogKGdzdF9keW51ZHBzaW5rX2NsYXNzX2luaXQpOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19jbGFzc19pbml0KToKKwkgICogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6IChnc3RfdWRwc2lua19jbGFzc19pbml0KToKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfY2xhc3NfaW5pdCk6CisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvb3NzL2dzdG9zc2RtYWJ1ZmZlci5jOiAoZ3N0X29zc2RtYWJ1ZmZlcl9jbGFzc19pbml0KToKKwkgICogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3NzX3NpbmtfY2xhc3NfaW5pdCk6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuYzoKKwkgIChnc3Rfb3N4YXVkaW9lbGVtZW50X2NsYXNzX2luaXQpOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6IChnc3Rfb3N4YXVkaW9zaW5rX2NsYXNzX2luaXQpOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuYzogKGdzdF9vc3hhdWRpb3NyY19jbGFzc19pbml0KToKKwkgICogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay5jOiAoZ3N0X3N1bmF1ZGlvc2lua19jbGFzc19pbml0KToKKwkgIEZpeCAjMzM3MzY1IChnX3R5cGVfY2xhc3NfcmVmIDwtPiBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQpCisKKzIwMDYtMDQtMDggMTk6MDY6MjUgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgRml4IG1vcmUgYnJva2VuIEdPYmplY3QgbWFjcm9zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L21pa21vZC9nc3RtaWttb2QuaDoKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmg6CisJICBGaXggbW9yZSBicm9rZW4gR09iamVjdCBtYWNyb3MKKworMjAwNi0wNC0wOCAxODo0MTowNyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBGaXggYnJva2VuIEdPYmplY3QgbWFjcm9zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3hpbmUvZ3N0eGluZS5oOgorCSAgKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5Lmg6CisJICAqIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50Lmg6CisJICAqIHN5cy94aW1hZ2VzcmMveGltYWdldXRpbC5oOgorCSAgRml4IGJyb2tlbiBHT2JqZWN0IG1hY3JvcworCisyMDA2LTA0LTA4IDE4OjI1OjU1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIEZpeCBicm9rZW4gR09iamVjdCBtYWNyb3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sZGVjLmg6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxlbmMuaDoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbHRhZy5oOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuaDoKKwkgICogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuaDoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5oOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5oOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50Lmg6CisJICBGaXggYnJva2VuIEdPYmplY3QgbWFjcm9zCisKKzIwMDYtMDQtMDggMTg6MjM6MDQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRG9uJ3QgbWFrZSByb3VuZGluZyBlcnJvcnMgaW4gdGltZXN0YW1wL2R1cmF0aW9uIGNhbGN1bGF0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9wcmVwYXJlX2N1cnJlbnRfc2FtcGxlKSwKKwkgIChnc3RfcXRkZW11eF9jaGFpbiksIChnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwgKHF0ZGVtdXhfZHVtcF9zdHN6KSwKKwkgIChxdGRlbXV4X2R1bXBfc3RjbyksIChxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgRG9uJ3QgbWFrZSByb3VuZGluZyBlcnJvcnMgaW4gdGltZXN0YW1wL2R1cmF0aW9uIGNhbGN1bGF0aW9ucy4KKwkgIEZpeCB0aW1lc3RhbXBzIGZvciBBTVIgYW5kIElNQTQuICBGaXhlcyAoIzMzNzQzNikuCisJICBDcmVhdGUgYSBkdW1teSBzZWdtZW50IGV2ZW4gd2hlbiB0aGVyZSBpcyBubyBlZGl0IGxpc3QuCisKKzIwMDYtMDQtMDggMTM6MDk6NTAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogRG9uJ3QgdHJ5IHRvIHNlZWsgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGUgKHdvdWxkIG9jY2FzaW9uYWxseSBkaXNwbGF5IGVycm9yIGRpYWxvZ3MgaW4gdG90ZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjX2RlY19oYW5kbGVfc2Vla19ldmVudCk6CisJICBEb24ndCB0cnkgdG8gc2VlayBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZSAod291bGQKKwkgIG9jY2FzaW9uYWxseSBkaXNwbGF5IGVycm9yIGRpYWxvZ3MgaW4gdG90ZW0gd2hlbiBzZWVraW5nCisJICB0byB0aGUgZW5kKSAoIzMzNTg2OSkuIFdpbGwgc3RpbGwgdGhyb3cgYW4gZXJyb3IgdGhvdWdoCisJICBpZiB0aGUgZmlsZSBpcyB0cnVuY2F0ZWQgYW5kIHRoZSB0b3RhbF9zYW1wbGVzIHZhbHVlIGluCisJICB0aGUgc3RyZWFtIGhlYWRlciBpcyB3cm9uZy4KKworMjAwNi0wNC0wNyAxODoxNTowOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2RlYy4qOiBJZiB0aGUgc3RyZWFtIGhlYWRlciBkb2Vzbid0IGNvbnRhaW4gdGhlIHRvdGFsIG51bWJlciBvZiBzYW1wbGVzLCBzZWFyY2ggZm9yIHRoZSBsYXN0IGZsYWMgZnJhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNfY2FsY3VsYXRlX2NyYzgpLAorCSAgKGdzdF9mbGFjX2RlY19zY2FuX2dvdF9mcmFtZSksIChnc3RfZmxhY19kZWNfc2Nhbl9mb3JfbGFzdF9ibG9jayksCisJICAoZ3N0X2ZsYWNfZGVjX21ldGFkYXRhX2NhbGxiYWNrKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgSWYgdGhlIHN0cmVhbSBoZWFkZXIgZG9lc24ndCBjb250YWluIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2FtcGxlcywKKwkgIHNlYXJjaCBmb3IgdGhlIGxhc3QgZmxhYyBmcmFtZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjYWxjdWxhdGUKKwkgIHRoZSB0b3RhbCBkdXJhdGlvbiBmcm9tIHRoYXQgZnJhbWUncyBvZmZzZXQgKGZpeGVzICMzMzc2MDkpLgorCisyMDA2LTA0LTA3IDE1OjUzOjQzICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBUeXBvIGZpeCwgcy9YRnJlZTg2L1gxMSBhbmQgYWRkZWQgZG9jIGJsdXJiIHNheWluZyB0aGF0IGl0IGZpeGF0ZXMgdG8gMjVmcHMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wNC0wNyAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCSAgKiBleHQvYW1yd2IvYW1yd2ItY29kZS9NYWtlZmlsZS5hbToKKwkgICogc3lzL3hpbWFnZXNyYy94aW1hZ2VzcmMuYzogKGdzdF94aW1hZ2VzcmNfcmVjYWxjKSwKKwkgIChnc3RfeGltYWdlc3JjX2NyZWF0ZSksIChnc3RfeGltYWdlc3JjX3NldF9wcm9wZXJ0eSk6CisJICBUeXBvIGZpeCwgcy9YRnJlZTg2L1gxMSBhbmQgYWRkZWQgZG9jIGJsdXJiIHNheWluZyB0aGF0IGl0IGZpeGF0ZXMgdG8KKwkgIDI1ZnBzCisKKzIwMDYtMDQtMDcgMTU6NDc6MjcgKzAwMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkgIHRlc3RzL2ljbGVzL3hpbWFnZXNyYy10ZXN0LmM6IEFjdHVhbGx5IGFzc2VydCB0aGF0IHBpcGVsaW5lIGdvZXMgdG8gcGxheWluZworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA0LTA3ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisJICAqIHRlc3RzL2ljbGVzL3hpbWFnZXNyYy10ZXN0LmM6IChtYWluKToKKwkgIEFjdHVhbGx5IGFzc2VydCB0aGF0IHBpcGVsaW5lIGdvZXMgdG8gcGxheWluZworCisyMDA2LTA0LTA3IDE1OjI3OjQwICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBzeXMveGltYWdlc3JjL3hpbWFnZXNyYy5jOiBGaXggdHlwbywgQysrIHN0eWxlIGNvbW1lbnRzIGFuZCBvdGhlciBzbWFsbCBjbGVhbnVwcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTA0LTA3ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisJICAqIHN5cy94aW1hZ2VzcmMveGltYWdlc3JjLmM6IChnc3RfeGltYWdlc3JjX3JlY2FsYyksCisJICAoY29tcG9zaXRlX3BpeGVsKSwgKGdzdF94aW1hZ2VzcmNfeGltYWdlX2dldCksCisJICAoZ3N0X3hpbWFnZXNyY19jcmVhdGUpLCAoZ3N0X3hpbWFnZXNyY19zZXRfcHJvcGVydHkpOgorCSAgRml4IHR5cG8sIEMrKyBzdHlsZSBjb21tZW50cyBhbmQgb3RoZXIgc21hbGwgY2xlYW51cHMKKworMjAwNi0wNC0wNyAxMDo0ODoxOSArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBEb24ndCB1bnJlZiB0aGUgR3N0UGFkVGVtcGxhdGUgcmV0dXJuZWQgYnkgZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKToKKwkgIERvbid0IHVucmVmIHRoZSBHc3RQYWRUZW1wbGF0ZSByZXR1cm5lZCBieQorCSAgZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSgpLgorCisyMDA2LTA0LTA2IDE5OjE2OjAyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEFkZGVkIGZ1bGwgZWRpdCBsaXN0IHN1cHBvcnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfaW5pdCksCisJICAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChnc3RfcXRkZW11eF9maW5kX2luZGV4KSwKKwkgIChnc3RfcXRkZW11eF9maW5kX2tleWZyYW1lKSwgKGdzdF9xdGRlbXV4X2ZpbmRfc2VnbWVudCksCisJICAoZ3N0X3F0ZGVtdXhfbW92ZV9zdHJlYW0pLCAoZ3N0X3F0ZGVtdXhfcGVyZm9ybV9zZWVrKSwKKwkgIChnc3RfcXRkZW11eF9kb19zZWVrKSwgKGdzdF9xdGRlbXV4X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3F0ZGVtdXhfYWN0aXZhdGVfc2VnbWVudCksCisJICAoZ3N0X3F0ZGVtdXhfcHJlcGFyZV9jdXJyZW50X3NhbXBsZSksIChnc3RfcXRkZW11eF9hZHZhbmNlX3NhbXBsZSksCisJICAoZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9tb3ZpZSksIChnc3RfcXRkZW11eF9sb29wKSwKKwkgIChxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgQWRkZWQgZnVsbCBlZGl0IGxpc3Qgc3VwcG9ydC4KKwkgIEF2b2lkIG92ZXJmbG93cyBpbiBwcm9sb2d1ZSBpbWFnZSBkZXRlY3Rpb24gY29kZS4KKwkgIEF2b2lkIHJvdW5kb2ZmIGVycm9ycyBpbiB0aW1lc3RhbXAgY2FsY3VsYXRpb25zLgorCisyMDA2LTA0LTA2IDExOjM1OjI2ICswMDAwICBqXiA8akBib290bGFiLm9yZz4KKworCSAgVW5pZnkgdGhlIGxvbmcgZGVzY3JpcHRpb25zIGluIHRoZSBwbHVnaW4gZGV0YWlscyAoIzMzNzI2MykuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBqXiAgPGogYXQgYm9vdGxhYiBkb3Qgb3JnPgorCSAgKiBleHQvYW1yd2IvZ3N0YW1yd2JkZWMuYzoKKwkgICogZXh0L2FtcndiL2dzdGFtcndiZW5jLmM6CisJICAqIGV4dC9hbXJ3Yi9nc3RhbXJ3YnBhcnNlLmM6CisJICAqIGV4dC9hcnRzL2dzdF9hcnRzLmM6CisJICAqIGV4dC9hcnRzZC9nc3RhcnRzZHNpbmsuYzoKKwkgICogZXh0L2F1ZGlvZmlsZS9nc3RhZnBhcnNlLmM6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzaW5rLmM6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzcmMuYzoKKwkgICogZXh0L2NkYXVkaW8vZ3N0Y2RhdWRpby5jOgorCSAgKiBleHQvZGlyZWN0ZmIvZGZidmlkZW9zaW5rLmM6CisJICAqIGV4dC9kaXZ4L2dzdGRpdnhkZWMuYzoKKwkgICogZXh0L2RpdngvZ3N0ZGl2eGVuYy5jOgorCSAgKiBleHQvZHRzL2dzdGR0c2RlYy5jOiAoZ3N0X2R0c2RlY19iYXNlX2luaXQpOgorCSAgKiBleHQvZmFhYy9nc3RmYWFjLmM6IChnc3RfZmFhY19iYXNlX2luaXQpOgorCSAgKiBleHQvZmFhZC9nc3RmYWFkLmM6CisJICAqIGV4dC9nc20vZ3N0Z3NtZGVjLmM6CisJICAqIGV4dC9nc20vZ3N0Z3NtZW5jLmM6CisJICAqIGV4dC9oZXJtZXMvZ3N0aGVybWVzY29sb3JzcGFjZS5jOgorCSAgKiBleHQvaXZvcmJpcy92b3JiaXNmaWxlLmM6CisJICAqIGV4dC9sY3MvZ3N0Y29sb3JzcGFjZS5jOgorCSAgKiBleHQvbGliZmFtZS9nc3RsaWJmYW1lLmM6CisJICAqIGV4dC9saWJtbXMvZ3N0bW1zLmM6IChnc3RfbW1zX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uYzogKGdzdF9tdXNpY2JyYWluel9iYXNlX2luaXQpOgorCSAgKiBleHQvbmFzL25hc3NpbmsuYzogKGdzdF9uYXNzaW5rX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9uZW9uL2dzdG5lb25odHRwc3JjLmM6CisJICAqIGV4dC9wb2x5cC9wb2x5cHNpbmsuYzogKGdzdF9wb2x5cHNpbmtfYmFzZV9pbml0KToKKwkgICogZXh0L3NkbC9zZGxhdWRpb3NpbmsuYzoKKwkgICogZXh0L3NkbC9zZGx2aWRlb3NpbmsuYzoKKwkgICogZXh0L3Nob3V0L2dzdHNob3V0LmM6CisJICAqIGV4dC9zbmFwc2hvdC9nc3RzbmFwc2hvdC5jOgorCSAgKiBleHQvc25kZmlsZS9nc3RzZi5jOgorCSAgKiBleHQvdGFya2luL2dzdHRhcmtpbmRlYy5jOgorCSAgKiBleHQvdGFya2luL2dzdHRhcmtpbmVuYy5jOgorCSAgKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfYmFzZV9pbml0KToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9iYXNlX2luaXQpOgorCSAgKiBleHQveHZpZC9nc3R4dmlkZGVjLmM6CisJICAqIGV4dC94dmlkL2dzdHh2aWRlbmMuYzoKKwkgICogZ3N0L2NkeGFwYXJzZS9nc3RjZHhhcGFyc2UuYzogKGdzdF9jZHhhX3BhcnNlX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXN0cmlwLmM6IChnc3RfY2R4YXN0cmlwX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9jaGFydC9nc3RjaGFydC5jOgorCSAgKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOiAoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFzZV9pbml0KToKKwkgICogZ3N0L2Zlc3RpdmFsL2dzdGZlc3RpdmFsLmM6CisJICAqIGdzdC9maWx0ZXIvZ3N0aWlyLmM6CisJICAqIGdzdC9maWx0ZXIvZ3N0bHB3c2luYy5jOgorCSAgKiBnc3QvZnJlZXplL2dzdGZyZWV6ZS5jOgorCSAgKiBnc3QvZ2FtZXMvZ3N0cHV6emxlLmM6IChnc3RfcHV6emxlX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9taXhtYXRyaXgvbWl4bWF0cml4LmM6CisJICAqIGdzdC9tcGVnMXN5cy9nc3RtcGVnMXN5c3RlbWVuY29kZS5jOgorCSAgKiBnc3QvbXBlZzF2aWRlb3BhcnNlL2dzdG1wMXZpZGVvcGFyc2UuYzoKKwkgICogZ3N0L21wZWcyc3ViL2dzdG1wZWcyc3VidC5jOgorCSAgKiBnc3QvbXBlZ2F1ZGlvcGFyc2UvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkgICogZ3N0L211bHRpZmlsZXNpbmsvZ3N0bXVsdGlmaWxlc2luay5jOgorCSAgKiBnc3Qvb3ZlcmxheS9nc3RvdmVybGF5LmM6CisJICAqIGdzdC9wYXNzdGhyb3VnaC9nc3RwYXNzdGhyb3VnaC5jOgorCSAgKiBnc3QvcGxheW9uZGVtYW5kL2dzdHBsYXlvbmRlbWFuZC5jOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICAqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZGVjLmM6CisJICAqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZW5jLmM6CisJICAqIGdzdC9zbW9vdGgvZ3N0c21vb3RoLmM6CisJICAqIGdzdC90dGEvZ3N0dHRhZGVjLmM6IChnc3RfdHRhX2RlY19iYXNlX2luaXQpOgorCSAgKiBnc3QvdHRhL2dzdHR0YXBhcnNlLmM6IChnc3RfdHRhX3BhcnNlX2Jhc2VfaW5pdCk6CisJICAqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJICAqIGdzdC92aWRlb2Ryb3AvZ3N0dmlkZW9kcm9wLmM6CisJICAqIGdzdC92aXJ0dWFsZHViL2dzdHhzaGFycGVuLmM6CisJICAqIGdzdC94aW5naGVhZGVyL2dzdHhpbmdtdXguYzogKGdzdF94aW5nX211eF9iYXNlX2luaXQpOgorCSAgKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSAgVW5pZnkgdGhlIGxvbmcgZGVzY3JpcHRpb25zIGluIHRoZSBwbHVnaW4gZGV0YWlscyAoIzMzNzI2MykuCisKKzIwMDYtMDQtMDYgMDk6MTQ6MzAgKzAwMDAgIEJyaWFuIENhbWVyb24gPGJyaWFuLmNhbWVyb25Ac3VuLmNvbT4KKworCSAgc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc2luay4qOiBVc2Ugc3BlYy0+c2Vnc2l6ZSBhbmQgc3BlYy0+c2VndG90YWwgaW4gdGhlIHByZXBhcmUgZnVuY3Rpb24gdG8gaW5pdGlhbGlzZSB0aGUgcmluZyBiLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIGJ5OiBCcmlhbiBDYW1lcm9uICA8YnJpYW4gZG90IGNhbWVyb24gYXQgc3VuIGRvdCBjb20+CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NpbmsuYzogKGdzdF9zdW5hdWRpb3NpbmtfaW5pdCksCisJICAoZ3N0X3N1bmF1ZGlvc2lua19wcmVwYXJlKSwgKGdzdF9zdW5hdWRpb3Npbmtfd3JpdGUpOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmg6CisJICBVc2Ugc3BlYy0+c2Vnc2l6ZSBhbmQgc3BlYy0+c2VndG90YWwgaW4gdGhlIHByZXBhcmUgZnVuY3Rpb24KKwkgIHRvIGluaXRpYWxpc2UgdGhlIHJpbmcgYnVmZmVyIGluc3RlYWQgb2YgdXNpbmcgdGhlIGJ1ZmZlci10aW1lCisJICBwcm9wZXJ0eSAoIzMzNzQyMSkuCisKKzIwMDYtMDQtMDYgMDg6NTI6NTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogQnVtcCBjb3JlIHJlcXVpcmVtZW50cyB0byBDVlMgZm9yIGdzdF9wYWRfcXVlcnlfcGVlcl9kdXJhdGlvbigpIHdoaWNoIGlzIHVzZWQgYnkgc3BlZXhkZWMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQnVtcCBjb3JlIHJlcXVpcmVtZW50cyB0byBDVlMgZm9yIGdzdF9wYWRfcXVlcnlfcGVlcl9kdXJhdGlvbigpCisJICB3aGljaCBpcyB1c2VkIGJ5IHNwZWV4ZGVjLgorCisyMDA2LTA0LTA1IDE4OjI3OjIyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvc3BlZXgvOiBGaXggc2Vla2luZyBhbmQgZHVyYXRpb24gcXVlcmllcyAoIzMzNzAzMyk7IGNsZWFuIHVwIGFuZCByZWZhY3RvciBhIGJpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXguYzogKHBsdWdpbl9pbml0KToKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IChnc3Rfc3BlZXhfZGVjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zcGVleF9kZWNfcmVzZXQpLCAoZ3N0X3NwZWV4X2RlY19pbml0KSwgKHNwZWV4X2RlY19jb252ZXJ0KSwKKwkgIChzcGVleF9nZXRfc2lua19xdWVyeV90eXBlcyksIChzcGVleF9kZWNfc2lua19xdWVyeSksCisJICAoc3BlZXhfZ2V0X3NyY19xdWVyeV90eXBlcyksIChzcGVleF9kZWNfc3JjX3F1ZXJ5KSwKKwkgIChzcGVleF9kZWNfc3JjX2V2ZW50KSwgKHNwZWV4X2RlY19zaW5rX2V2ZW50KSwKKwkgIChzcGVleF9kZWNfY2hhaW5fcGFyc2VfaGVhZGVyKSwgKHNwZWV4X2RlY19jaGFpbl9wYXJzZV9jb21tZW50cyksCisJICAoc3BlZXhfZGVjX2NoYWluX3BhcnNlX2RhdGEpLCAoc3BlZXhfZGVjX2NoYWluKSwKKwkgIChnc3Rfc3BlZXhfZGVjX2dldF9wcm9wZXJ0eSksIChnc3Rfc3BlZXhfZGVjX3NldF9wcm9wZXJ0eSksCisJICAoc3BlZXhfZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5oOgorCSAgRml4IHNlZWtpbmcgYW5kIGR1cmF0aW9uIHF1ZXJpZXMgKCMzMzcwMzMpOyBjbGVhbiB1cCBhbmQKKwkgIHJlZmFjdG9yIGEgYml0LgorCisyMDA2LTA0LTA1IDEyOjQxOjE0ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IGRpc3Rpbmd1aXNoIGJldHdlZW4gZGV2aWNlIG5vdCBmb3VuZCBhbmQgY291bGQgbm90IG9wZW4gZm9yIHJlYWRpbmcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkgIGRpc3Rpbmd1aXNoIGJldHdlZW4gZGV2aWNlIG5vdCBmb3VuZCBhbmQgY291bGQgbm90IG9wZW4gZm9yCisJICByZWFkaW5nCisKKzIwMDYtMDQtMDUgMDg6MzY6NTUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogVXNlIGR1cmF0aW9uIGFzIHNlZ21lbnQgc3RvcCBwb3NpdGlvbiBpZiBub25lIGlzIGV4cGxpY2l0bHkgY29uZmlndXJlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9wZXJmb3JtX3NlZWspLAorCSAgKGdzdF9xdGRlbXV4X2RvX3NlZWspLCAoZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9tb3ZpZSksCisJICAoZ3N0X3F0ZGVtdXhfbG9vcCk6CisJICBVc2UgZHVyYXRpb24gYXMgc2VnbWVudCBzdG9wIHBvc2l0aW9uIGlmIG5vbmUgaXMKKwkgIGV4cGxpY2l0bHkgY29uZmlndXJlZC4KKwkgIEFsc28gcGVyZm9ybSBFT1Mgd2hlbiB3ZSBydW4gcGFzdCB0aGUgc2VnbWVudCBzdG9wLgorCisyMDA2LTA0LTA0IDExOjIwOjU4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IE1vcmUgY2xlYW51cHMsIGFkZGVkIGNvbW1lbnRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2dvX2JhY2spLAorCSAgKGdzdF9xdGRlbXV4X3BlcmZvcm1fc2VlayksIChnc3RfcXRkZW11eF9kb19zZWVrKSwKKwkgIChnc3RfcXRkZW11eF9sb29wX3N0YXRlX21vdmllKSwgKGdzdF9xdGRlbXV4X2xvb3ApLAorCSAgKGdzdF9xdGRlbXV4X2NoYWluKSwgKHF0ZGVtdXhfcGFyc2VfdHJlZSksIChxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgTW9yZSBjbGVhbnVwcywgYWRkZWQgY29tbWVudHMuCisJICBNYXJrIGRpc2NvbnRpbnVpdGllcyBvbiBvdXRnb2luZyBidWZmZXJzLgorCSAgUG9zdCBiZXR0ZXIgZXJyb3JzIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcuCisJICBIYW5kbGUgRU9TIGFuZCBzZWdtZW50IGVuZCBwcm9wZXJseS4KKworMjAwNi0wNC0wNCAwODozMToxMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC4qOiBIYW5kbGUgc3RzcyBib3hlcyBzbyB3ZSBjYW4gbWFyayBhbmQgZmluZCBrZXlmcmFtZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfaW5pdCksCisJICAoZ3N0X3F0ZGVtdXhfcHVzaF9ldmVudCksIChnc3RfcXRkZW11eF9nb19iYWNrKSwKKwkgIChnc3RfcXRkZW11eF9wZXJmb3JtX3NlZWspLCAoZ3N0X3F0ZGVtdXhfZG9fc2VlayksCisJICAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19ldmVudCksIChwbHVnaW5faW5pdCksCisJICAoZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlKSwgKGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfbW92aWUpLAorCSAgKGdzdF9xdGRlbXV4X2xvb3ApLCAoZ3N0X3F0ZGVtdXhfY2hhaW4pLAorCSAgKHF0ZGVtdXhfc2lua19hY3RpdmF0ZV9wdWxsKSwgKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pLAorCSAgKHF0ZGVtdXhfcGFyc2UpLCAocXRkZW11eF9wYXJzZV90cmVlKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayksCisJICAocXRkZW11eF9wYXJzZV91ZHRhKSwgKHF0ZGVtdXhfdGFnX2FkZF9zdHIpLCAocXRkZW11eF90YWdfYWRkX251bSksCisJICAocXRkZW11eF90YWdfYWRkX2ducmUpLCAoZ3N0X3F0ZGVtdXhfaGFuZGxlX2VzZHMpOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICBIYW5kbGUgc3RzcyBib3hlcyBzbyB3ZSBjYW4gbWFyayBhbmQgZmluZCBrZXlmcmFtZXMuCisJICBJbXBsZW1lbnQgY29ycmVjdCBhY2N1cmF0ZSBhbmQga2V5ZnJhbWUgc2Vla2luZy4KKwkgIFVzZSBfREVCVUdfT0JKRUNUIHdoZW4gcG9zc2libGUuCisKKzIwMDYtMDQtMDMgMTM6Mjk6MjAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSAgaWdub3JlIG1vcmUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgaWdub3JlIG1vcmUKKworMjAwNi0wNC0wMyAxMzoyODo1NSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIHBrZ2NvbmZpZy9NYWtlZmlsZS5hbToKKwkgIGZpeCBkaXN0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCBkaXN0CisKKzIwMDYtMDQtMDMgMDk6MDI6MjkgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBhZGQgYSAucGMgZmlsZSBzbyBvdGhlciBtb2R1bGVzIGNhbiB1c2UgZ29vZCBwbHVnaW5zIGluIHRlc3RzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogTWFrZWZpbGUuYW06CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogcGtnY29uZmlnLy5jdnNpZ25vcmU6CisJICAqIHBrZ2NvbmZpZy9NYWtlZmlsZS5hbToKKwkgICogcGtnY29uZmlnL2dzdHJlYW1lci1wbHVnaW5zLWdvb2QtdW5pbnN0YWxsZWQucGMuaW46CisJICBhZGQgYSAucGMgZmlsZSBzbyBvdGhlciBtb2R1bGVzIGNhbiB1c2UgZ29vZCBwbHVnaW5zIGluIHRlc3RzCisKKzIwMDYtMDQtMDEgMTY6NTA6NDkgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjb21tb246CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXRkZW11eC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdGFnbGliLnhtbDoKKwkqIGV4dC90YWdsaWIvZ3N0dGFnbGlibXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jOgorCSAgYWRkIHRhZ2xpYiBjaGVja3MgYW5kIGRvY3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkIHRhZ2xpYiBjaGVja3MgYW5kIGRvY3MKKworMjAwNi0wNC0wMSAxNTozMDo1MSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy91cGxvYWQubWFrOgorCSAgZGlzYWJsZSB1c2Ugb2YgQVNfTElCVE9PTF9UQUdTLCBpdCBkb2Vzbid0IHdvcmsgY29ycmVjdGx5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGRpc2FibGUgdXNlIG9mIEFTX0xJQlRPT0xfVEFHUywgaXQgZG9lc24ndCB3b3JrIGNvcnJlY3RseQorCisyMDA2LTA0LTAxIDE0OjAzOjAzICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogY29tbW9uOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFubm9kZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2RrcGl4YnVmLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1oYWxlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxhZHNwYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYmFsYW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICBhZGRpbmcgaW5zcGVjdCBmaWxlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGRpbmcgaW5zcGVjdCBmaWxlcworCisyMDA2LTA0LTAxIDEwOjE1OjMzICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogdGVzdHMvaWNsZXMveGltYWdlc3JjLXRlc3QuYzoKKwkgIDUgc2Vjb25kIHRpbWVvdXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgNSBzZWNvbmQgdGltZW91dAorCisyMDA2LTA0LTAxIDEwOjE0OjI2ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogdGVzdHMvaWNsZXMvLmdpdGlnbm9yZToKKwkqIHRlc3RzL2ljbGVzL01ha2VmaWxlLmFtOgorCSogdGVzdHMvaWNsZXMveGltYWdlc3JjLXRlc3QuYzoKKwkgIHJlbmFtZSB0ZXN0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbmFtZSB0ZXN0CisKKzIwMDYtMDQtMDEgMTA6MDk6MTEgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSogZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmM6CisJKiBnc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5jOgorCSogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3BsdWdpbi5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kcGx1Z2luLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6CisJKiBzeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jOgorCSAgcmV3b3JrIGJ1aWxkOyBhZGQgdHJhbnNsYXRpb25zIGZvciB2NGwyCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJld29yayBidWlsZDsgYWRkIHRyYW5zbGF0aW9ucyBmb3IgdjRsMgorCisyMDA2LTA0LTAxIDA5OjU2OjQ1ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgY29uZmlndXJlLmFjOiBjbGVhbiB1cCwgdXNlIEFTX1ZFUlNJT04gYW5kIEFTX05BTk8KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBjbGVhbiB1cCwgdXNlIEFTX1ZFUlNJT04gYW5kIEFTX05BTk8KKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9zdGFydCk6CisJICB1c2UgUEFDS0FHRV9WRVJTSU9OIGRlZmluZQorCSAgKiBwby9hZi5wbzoKKwkgICogcG8vYXoucG86CisJICAqIHBvL2NzLnBvOgorCSAgKiBwby9lbl9HQi5wbzoKKwkgICogcG8vaHUucG86CisJICAqIHBvL2l0LnBvOgorCSAgKiBwby9uYi5wbzoKKwkgICogcG8vbmwucG86CisJICAqIHBvL29yLnBvOgorCSAgKiBwby9zcS5wbzoKKwkgICogcG8vc3IucG86CisJICAqIHBvL3N2LnBvOgorCSAgKiBwby91ay5wbzoKKwkgICogcG8vdmkucG86CisJICB1cGRhdGVkCisKKzIwMDYtMDMtMzEgMTc6NTI6MzYgKzAwMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkgIEFkZCB0ZXN0cyBhbmQgZml4IFBBUiBjYXBzIGlzc3VlIHRvIHhpbWFnZXNyYworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAzLTMxICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisJICAqIE1ha2VmaWxlLmFtOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIHN5cy94aW1hZ2VzcmMveGltYWdlc3JjLmM6CisJICAoZ3N0X3hpbWFnZXNyY194aW1hZ2VfZ2V0KSwKKwkgIChnc3RfeGltYWdlc3JjX2dldF9jYXBzKSwgKGdzdF94aW1hZ2VzcmNfY2xhc3NfaW5pdCk6CisJICAqIHN5cy94aW1hZ2VzcmMveGltYWdldXRpbC5jOgorCSAgKiB0ZXN0cy9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvaWNsZXMvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2ljbGVzL3hpbWFnZXNyYy10ZXN0LmM6ICh0ZXJtaW5hdGVfcGxheWJhY2spLCAobWFpbik6CisJICBBZGQgdGVzdHMgYW5kIGZpeCBQQVIgY2FwcyBpc3N1ZSB0byB4aW1hZ2VzcmMKKworMjAwNi0wMy0zMSAxNjozMjo0NyArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSAgc3lzL3hpbWFnZXNyYy94aW1hZ2VzcmMuYzogQWRkIGRvY3MgdG8geGltYWdlc3JjCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDMtMzEgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKwkgICogc3lzL3hpbWFnZXNyYy94aW1hZ2VzcmMuYzoKKwkgIEFkZCBkb2NzIHRvIHhpbWFnZXNyYworCisyMDA2LTAzLTMxIDE1OjIxOjM1ICswMDAwICBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhc0BtZXJhbGkub3JnPgorCisJICBzeXMveGltYWdlc3JjLzogRml4IHhpbWFnZXNyYyBzbyBhKSB0aGUgY3Vyc29yIGRvZXNudCB0cmFpbCBhbmQgYikgdGhlcmUgYXJlIG5vIHllbGxvdyByZWN0YW5nbGVzIHdpdGggdGhlIGN1cnNvcgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAzLTMxICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisJICAqIHN5cy94aW1hZ2VzcmMveGltYWdlc3JjLmM6IChjb21wb3NpdGVfcGl4ZWwpLAorCSAgKGdzdF94aW1hZ2VzcmNfeGltYWdlX2dldCksIChnc3RfeGltYWdlc3JjX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3hpbWFnZXNyY19nZXRfY2FwcyksIChnc3RfeGltYWdlc3JjX2NsYXNzX2luaXQpOgorCSAgKiBzeXMveGltYWdlc3JjL3hpbWFnZXNyYy5oOgorCSAgKiBzeXMveGltYWdlc3JjL3hpbWFnZXV0aWwuYzogKHhpbWFnZXV0aWxfeGNvbnRleHRfZ2V0KToKKwkgICogc3lzL3hpbWFnZXNyYy94aW1hZ2V1dGlsLmg6CisJICBGaXggeGltYWdlc3JjIHNvIGEpIHRoZSBjdXJzb3IgZG9lc250IHRyYWlsIGFuZCBiKSB0aGVyZSBhcmUgbm8KKwkgIHllbGxvdyByZWN0YW5nbGVzIHdpdGggdGhlIGN1cnNvcgorCisyMDA2LTAzLTMwIDIzOjQ2OjQyICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHdpbjMyL3ZzNi9nc3RfcGx1Z2luc19nb29kLmRzdzoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhbGF3LmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhbHBoYS5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0YWxwaGFjb2xvci5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0YXBldGFnLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhdXBhcnNlLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhdXRvZGV0ZWN0LmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RhdmkuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdGN1dHRlci5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0ZWZmZWN0di5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0Zmx4LmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3Rnb29tLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RpZDNkZW11eC5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0aW50ZXJsZWF2ZS5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0anBlZy5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0bGV2ZWwuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdG1hdHJvc2thLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RtZWRpYW4uZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdG1vbm9zY29wZS5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0bXVsYXcuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdG11bHRpcGFydC5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0cnRwLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RydHNwLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3RzbXB0ZS5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0c3BlZXguZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdHZpZGVvYmFsYW5jZS5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0dmlkZW9ib3guZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdHZpZGVvZmxpcC5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0dmlkZW9taXhlci5kc3A6CisJKiB3aW4zMi92czYvbGliZ3N0d2F2ZW5jLmRzcDoKKwkqIHdpbjMyL3ZzNi9saWJnc3R3YXZwYXJzZS5kc3A6CisJICBJJ20gdG9vIGxhenkgdG8gY29tbWVudCB0aGlzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICoqKiBlbXB0eSBsb2cgbWVzc2FnZSAqKioKKworMjAwNi0wMy0zMCAyMzozNzoxNiArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJICBleHRcanBlZ1xzbW9rZWNvZGVjLmM6IHVzZSBvZiBHU1RfREVCVUcgaW5zdGVhZCBvZiBERUJVRyhhLi4uKSBmb3IgV0lOMzIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHRcanBlZ1xzbW9rZWNvZGVjLmM6CisJICB1c2Ugb2YgR1NUX0RFQlVHIGluc3RlYWQgb2YgREVCVUcoYS4uLikgZm9yIFdJTjMyCisJICAqIGV4dFxzcGVleFxnc3RzcGVleGVuYy5jOiAoZ3N0X3NwZWV4ZW5jX3NldF9oZWFkZXJfb25fY2Fwcyk6CisJICBtb3ZlIGZpcnN0IGluc3RydWN0aW9uIGFmdGVyIGFsbCB2YXJpYWJsZXMgZGVjbGFyYXRpb25zCisJICAqIGdzdFxhbHBoYVxnc3RhbHBoYS5jOgorCSAgKiBnc3RcZWZmZWN0dlxnc3RzaGFnYWRlbGljLmM6CisJICAqIGdzdFxzbXB0ZVxwYWludC5jOgorCSAgKiBnc3RcdmlkZW9maWx0ZXJcZ3N0dmlkZW9iYWxhbmNlLmM6CisJICBkZWZpbmUgTV9QSSBpZiBpdCdzIG5vdCBkZWZpbmVkIChpdCdzIG5vdCBkZWZpbmVkIG9uIFdJTjMyKQorCSAgKiBnc3RcY3V0dGVyXGdzdGN1dHRlci5jOiAoZ3N0X2N1dHRlcl9jaGFpbik6CisJICAqIGdzdFxpZDNkZW11eFxpZDN2MmZyYW1lcy5jOiAocGFyc2VfcmVsYXRpdmVfdm9sdW1lX2FkanVzdG1lbnRfdHdvKToKKwkgICogZ3N0XGxldmVsXGdzdGxldmVsLmM6IChnc3RfbGV2ZWxfc2V0X3Byb3BlcnR5KSwgKGdzdF9sZXZlbF90cmFuc2Zvcm1faXApOgorCSAgKiBnc3RcbWF0cm9za2FcbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmZvKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfdmlkZW9fY2Fwcyk6CisJICAqIGdzdFxtYXRyb3NrYVxtYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfc3RhcnQpLCAoZ3N0X21hdHJvc2thX211eF9maW5pc2gpOgorCSAgKiBnc3Rcd2F2cGFyc2VcZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSk6CisJICB1c2UgZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSBmb3IgY29udmVyc2lvbnMKKwkgICogZ3N0XGdvb21cZmlsdGVycy5jOiAoc2V0UGl4ZWxSR0JfKToKKwkgIGZpeCBhIGRlYnVnIHdoaWNoIHdhcyB1c2luZyB1bmRlZmluZWQgdmFyaWFibGUKKwkgICogZ3N0XGxldmVsXGdzdGxldmVsLmM6IChnc3RfbGV2ZWxfc2V0X2NhcHMpLCAoZ3N0X2xldmVsX3RyYW5zZm9ybV9pcCk6CisJICAqIGdzdFxtYXRyb3NrYVxlYm1sLXJlYWQuYzogKGdzdF9lYm1sX3JlYWRfc2ludCk6CisJICByZXBsYWNlIExMIHN1ZmZpeCB3aXRoIEwgc3VmZml4IChMTCBpc24ndCBzdXBwb3J0ZWQgYnkgTVNWQzYuMCkKKwkgICogd2luMzIvdnM2OgorCSAgYWRkIHZzNiBwcm9qZWN0cyBmaWxlcyBmb3IgbW9zdCBvZiBwbHVnaW5zLWdvb2QKKworMjAwNi0wMy0zMCAxNTozNzowNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgYmV0dGVyL3VuaWZpZWQgbG9uZyBkZXNjcmlwdGlvbnMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuYzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzoKKwkgICogZXh0L2NhaXJvL2dzdHRpbWVvdmVybGF5LmM6CisJICAqIGV4dC9jZGlvL2dzdGNkaW9jZGRhc3JjLmM6CisJICAqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSAgKiBleHQvZXNkL2VzZG1vbi5jOgorCSAgKiBleHQvZXNkL2VzZHNpbmsuYzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzoKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmM6IChnc3RfZ2NvbmZfYXVkaW9fc2lua19iYXNlX2luaXQpOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NyYy5jOiAoZ3N0X2djb25mX2F1ZGlvX3NyY19iYXNlX2luaXQpOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NpbmsuYzogKGdzdF9nY29uZl92aWRlb19zaW5rX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc3JjLmM6IChnc3RfZ2NvbmZfdmlkZW9fc3JjX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOgorCSAgKiBleHQvaGFsL2dzdGhhbGF1ZGlvc2luay5jOiAoZ3N0X2hhbF9hdWRpb19zaW5rX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9oYWwvZ3N0aGFsYXVkaW9zcmMuYzogKGdzdF9oYWxfYXVkaW9fc3JjX2Jhc2VfaW5pdCk6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzoKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSAgKiBleHQvanBlZy9nc3RzbW9rZWRlYy5jOgorCSAgKiBleHQvanBlZy9nc3RzbW9rZWVuYy5jOgorCSAgKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOgorCSAgKiBleHQvbGlibW5nL2dzdG1uZ2RlYy5jOgorCSAgKiBleHQvbGlibW5nL2dzdG1uZ2VuYy5jOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCSAgKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOgorCSAgKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkgICogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzoKKwkgICogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkgICogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJICAoZ3N0X2F1dG9fYXVkaW9fc2lua19iYXNlX2luaXQpOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJICAoZ3N0X2F1dG9fdmlkZW9fc2lua19iYXNlX2luaXQpOgorCSAgKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aW11eF9iYXNlX2luaXQpOgorCSAgKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSAgKiBnc3QvZGVidWcvYnJlYWtteWRhdGEuYzoKKwkgICogZ3N0L2RlYnVnL2VmZW5jZS5jOgorCSAgKiBnc3QvZGVidWcvZ3N0bmF2aWdhdGlvbnRlc3QuYzoKKwkgICogZ3N0L2RlYnVnL25lZ290aWF0aW9uLmM6CisJICAqIGdzdC9kZWJ1Zy9wcm9ncmVzc3JlcG9ydC5jOgorCSAgKiBnc3QvZGVidWcvdGVzdHBsdWdpbi5jOgorCSAgKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOgorCSAgKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6CisJICAqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6CisJICAqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkgICogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSAgKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJICAqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOgorCSAgKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6CisJICAqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzogKGdzdF9hbGF3ZGVjX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzogKGdzdF9hbGF3ZW5jX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6IChnc3RfbXVsYXdkZWNfYmFzZV9pbml0KToKKwkgICogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzogKGdzdF9tdWxhd2VuY19iYXNlX2luaXQpOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYmFzZV9pbml0KToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9iYXNlX2luaXQpOgorCSAgKiBnc3QvbWVkaWFuL2dzdG1lZGlhbi5jOgorCSAgKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJICAqIGdzdC9vbGRjb3JlL2dzdG1kNXNpbmsuYzoKKwkgICogZ3N0L29sZGNvcmUvZ3N0bXVsdGlmaWxlc3JjLmM6CisJICAqIGdzdC9vbGRjb3JlL2dzdHBpcGVmaWx0ZXIuYzoKKwkgICogZ3N0L29sZGNvcmUvZ3N0c2hhcGVyLmM6CisJICAqIGdzdC9vbGRjb3JlL2dzdHN0YXRpc3RpY3MuYzoKKwkgICogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNnBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBwY211cGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6CisJICAqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOgorCSAgKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzoKKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJICAqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jOiAoZ3N0X2dhbW1hX2Jhc2VfaW5pdCk6CisJICAqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW90ZW1wbGF0ZS5jOgorCSAgKGdzdF92aWRlb3RlbXBsYXRlX2Jhc2VfaW5pdCk6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgICogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfYmFzZV9pbml0KToKKwkgIGJldHRlci91bmlmaWVkIGxvbmcgZGVzY3JpcHRpb25zCisJICBGaXhlZCAjMzM2NjAyCisJICBTb21lIGNsZWFudXBzIHRvIGF1cGFyc2UsIGRvbid0IHNlbmQgbXVsdGlwbGUgbmV3c2VnbWVudHMuCisKKzIwMDYtMDMtMjkgMTY6MDY6NTAgKzAwMDAgIE1pY2hhZWwgRG9taW5pYyBLIDxtZGtAbWRrLm9yZy5wbD4KKworCSAgZXh0L2R2L2dzdGR2ZGVtdXguKjogU2VlayBpbiBSRUFEWSBwYXRjaC4gT25seSB3b3JrcyBmb3IgcHVsbCBiYXNlZCBtb2RlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGcm9tIGEgcGF0Y2ggYnk6IE1pY2hhZWwgRG9taW5pYyBLLiA8bWRrIGF0IG1kayBkb3Qgb3JnIGRvdCBwbD4KKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2NsYXNzX2luaXQpLAorCSAgKGdzdF9kdmRlbXV4X3Jlc2V0KSwgKGdzdF9kdmRlbXV4X3NyY19jb252ZXJ0KSwKKwkgIChnc3RfZHZkZW11eF9zZW5kX2V2ZW50KSwgKGdzdF9kdmRlbXV4X2ZsdXNoKSwgKGdzdF9kdmRlbXV4X2xvb3ApLAorCSAgKGdzdF9kdmRlbXV4X3NpbmtfYWN0aXZhdGVfcHVsbCksIChnc3RfZHZkZW11eF9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5oOgorCSAgU2VlayBpbiBSRUFEWSBwYXRjaC4gT25seSB3b3JrcyBmb3IgcHVsbCBiYXNlZCBtb2RlLgorCSAgRml4ZXMgIzMyMzg4MAorCisyMDA2LTAzLTI3IDE3OjA2OjQ1ICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkgIFNtYWxsIGZpeCwgbm93IHB3YyBkcml2ZXIgY2FuIHRlbGwgYWJvdXQgaXRzIGJ1ZmZlcnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFNtYWxsIGZpeCwgbm93IHB3YyBkcml2ZXIgY2FuIHRlbGwgYWJvdXQgaXRzIGJ1ZmZlcnMuCisKKzIwMDYtMDMtMjcgMTQ6MDk6MTggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOiBGaXggdHdvIGNyYXNoZXJzOiBkb24ndCB1bnJlZiB0aGUgc2FtZSBjYXBzIHR3aWNlLCBhbmQgc2V0IHBpeGJ1ZiBsb2FkZXIgdG8gTlVMTCBhZnRlci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOiAoZ3N0X2dka19waXhidWZfZmx1c2gpLAorCSAgKGdzdF9nZGtfcGl4YnVmX2V2ZW50KToKKwkgIEZpeCB0d28gY3Jhc2hlcnM6IGRvbid0IHVucmVmIHRoZSBzYW1lIGNhcHMgdHdpY2UsIGFuZAorCSAgc2V0IHBpeGJ1ZiBsb2FkZXIgdG8gTlVMTCBhZnRlciBmcmVlaW5nIGl0LgorCisyMDA2LTAzLTI3IDE0OjAwOjAyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuKjogRG9uJ3QgbGVhayBhZGFwdGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiAoZ3N0X3NwZWV4ZW5jX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zcGVleGVuY19maW5hbGl6ZSksIChnc3Rfc3BlZXhlbmNfc2lua19zZXRjYXBzKSwKKwkgIChnc3Rfc3BlZXhlbmNfY2hhaW4pOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuaDoKKwkgIERvbid0IGxlYWsgYWRhcHRlci4KKwkgIEEgcHVzaCAqYWx3YXlzKiB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGJ1ZmZlciwgZXZlbiBvbgorCSAgZXJyb3JzLgorCSAgU21hbGwgY2xlYW51cHMuCisKKzIwMDYtMDMtMjYgMTk6NTY6MzcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC90YWdsaWIvZ3N0dGFnbGliLio6IEZpeCBuZXdzZWdtZW50IGV2ZW50IGhhbmRsaW5nIGEgYml0LiBXZSBuZWVkIHRvIGNhY2hlIHRoZSBmaXJzdCBuZXdzZWdtZW50IGV2ZW50LCBiZWNhdXNlIHdlIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC90YWdsaWIvZ3N0dGFnbGliLmNjOgorCSAgKiBleHQvdGFnbGliL2dzdHRhZ2xpYi5oOgorCSAgRml4IG5ld3NlZ21lbnQgZXZlbnQgaGFuZGxpbmcgYSBiaXQuIFdlIG5lZWQgdG8KKwkgIGNhY2hlIHRoZSBmaXJzdCBuZXdzZWdtZW50IGV2ZW50LCBiZWNhdXNlIHdlIGNhbid0CisJICBhZGp1c3Qgb2Zmc2V0cyB5ZXQgd2hlbiB3ZSBnZXQgaXQsIGFzIHdlIGRvbid0CisJICBrbm93IHRoZSBzaXplIG9mIHRoZSB0YWcgeWV0IGZvciBzdXJlIGF0IHRoYXQgcG9pbnQuCisJICBBbHNvIGRvIHNvbWUgbWlub3IgY2xlYW5pbmcgdXAgaGVyZSBhbmQgdGhlcmUgYW5kIGFkZAorCSAgc29tZSBkZWJ1ZyBzdGF0ZW1lbnRzLgorCisyMDA2LTAzLTI2IDEyOjI0OjU2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogQ3JlYXRlIHNvdXJjZSBwYWQgd2l0aG91dCBsZWFraW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoZ3N0X2lkM2RlbXV4X2FkZF9zcmNwYWQpOgorCSAgQ3JlYXRlIHNvdXJjZSBwYWQgd2l0aG91dCBsZWFraW5nLgorCisyMDA2LTAzLTI1IDIxOjU3OjI0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvdGFnbGliL2dzdHRhZ2xpYi5jYzogV2UgZG8gbm90IHdhbnQgdG8gcHJveHkgdGhlIGNhcHMgb24gdGhlIHNpbmsgcGFkOyBvdXIgc291cmNlIHBhZCBzaG91bGQgaGF2ZSBhcHBsaWNhdGlvbi94LWkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvdGFnbGliL2dzdHRhZ2xpYi5jYzoKKwkgIFdlIGRvIG5vdCB3YW50IHRvIHByb3h5IHRoZSBjYXBzIG9uIHRoZSBzaW5rIHBhZDsgb3VyCisJICBzb3VyY2UgcGFkIHNob3VsZCBoYXZlIGFwcGxpY2F0aW9uL3gtaWQzIGNhcHM7IGFsc28sCisJICBkb24ndCB1c2UgYWxyZWFkeS1mcmVlZCBzdHJpbmdzIGluIGRlYnVnIG1lc3NhZ2VzOworCSAgZmluYWxseSwgYWRqdXN0IGJ1ZmZlciBvZmZzZXRzIG9uIGJ1ZmZlcnMgc2VudCBvdXQuCisKKzIwMDYtMDMtMjUgMTM6MDI6NTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogT2xkZXIga2VybmVscyBkb24ndCBzZWVtIHRvIGhhdmUgdGhpcyBwYXJ0aWN1bGFyIHY0bDIgZm9ybWF0LCBzbyBjb21tZW50IG91dCB1bnRpbCB0aGlzIGdldHMgZi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkgIE9sZGVyIGtlcm5lbHMgZG9uJ3Qgc2VlbSB0byBoYXZlIHRoaXMgcGFydGljdWxhciB2NGwyIGZvcm1hdCwKKwkgIHNvIGNvbW1lbnQgb3V0IHVudGlsIHRoaXMgZ2V0cyBmaXhlZCBwcm9wZXJseSAoYW5kIG1ha2UKKwkgIGJ1aWxkYm90cyBoYXBweSkuCisKKzIwMDYtMDMtMjUgMDU6MzE6MjggKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogY29tbW9uOgorCSogc3lzL3Y0bDIvZ3N0djRsMmNvbG9yYmFsYW5jZS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMmNvbG9yYmFsYW5jZS5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMmVsZW1lbnQuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5jOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5oOgorCSAgSnVzdCBtYWtlIGZldyB0aGluZ3MgbW9yZSByb2J1c3QgYW5kIGFsc28gc29tZSBpZGVudGF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBKdXN0IG1ha2UgZmV3IHRoaW5ncyBtb3JlIHJvYnVzdCBhbmQgYWxzbyBzb21lIGlkZW50YXRpb24uCisKKzIwMDYtMDMtMjQgMTk6NDE6MDMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGV4dC9mbGFjLzogU3BpZmlmeSBhIGJpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfaGFuZGxlX3NlZWtfZXZlbnQpOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmg6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuaDoKKwkgIFNwaWZpZnkgYSBiaXQuCisJICBGaXggZGVhZGx5IGxvY2sgb3JkZXIgZXJyb3IgaW4gc2Vla2luZyBjb2RlLCBTVFJFQU1fTE9DSworCSAgY2Fubm90IGJlIHRha2VuIHdpdGhpbiBMT0NLIGFuZCB0aGUgc3RyZWFtaW5nIHZhcmlhYmxlcyBhcmUKKwkgIHByb3RlY3RlZCB3aXRoIHRoZSBTVFJFQU1fTE9DSyBhbnl3YXkuCisKKzIwMDYtMDMtMjQgMTg6NTY6MTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogdGhpcyBwYXRjaCBjb21iaW5lcyB0aGUgZ2xvYmFsIGluaXRfZnJhbWVzIHdpdGggdGhlIHN0cmVhbSBpbml0X2ZyYW1lcy4gUmF0aW9uYWxlIGJlaW5nIHRoYXQgdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcGFyc2VfaW5kZXgpLAorCSAgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4KSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX3NjYW4pLAorCSAgKGdzdF9hdmlfZGVtdXhfbWFzc2FnZV9pbmRleCksIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrKToKKwkgIHRoaXMgcGF0Y2ggY29tYmluZXMgdGhlIGdsb2JhbCBpbml0X2ZyYW1lcyB3aXRoIHRoZSBzdHJlYW0KKwkgIGluaXRfZnJhbWVzLiBSYXRpb25hbGUgYmVpbmcgdGhhdCB0aGUgZ2xvYmFsIGRlbGF5IHNob3VsZAorCSAgYmUgc3VidHJhY3RlZCBmcm9tIGFueSBzdHJlYW0gZGVsYXkuCisJICBGaXhlcyAjMzM1ODU4LgorCisyMDA2LTAzLTI0IDE3OjExOjU2ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC86IHVzZSBERUJVR19GVU5DUFRSIGZvciBjb2xsZWN0cGFkcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfaW5pdCk6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IChnc3RfbXVsdGlwYXJ0X211eF9pbml0KToKKwkgICogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6IChnc3Rfc21wdGVfaW5pdCk6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogKGdzdF92aWRlb21peGVyX2luaXQpOgorCSAgdXNlIERFQlVHX0ZVTkNQVFIgZm9yIGNvbGxlY3RwYWRzCisKKzIwMDYtMDMtMjQgMDk6NTQ6MDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzogRG9uJ3QgY3Jhc2ggd2hlbiBlbmNvZGluZyBpbWFnZXMgd2hlcmUgdGhlIG51bWJlciBvZiByb3dzIGlzbid0IGEgbXVsdGlwbGUgb2YgMipEQ1RTSVpFLiBBZGQgcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzogKGdzdF9qcGVnZW5jX2luaXQpLCAoZ3N0X2pwZWdlbmNfY2hhaW4pOgorCSAgRG9uJ3QgY3Jhc2ggd2hlbiBlbmNvZGluZyBpbWFnZXMgd2hlcmUgdGhlIG51bWJlciBvZiByb3dzIGlzbid0CisJICBhIG11bHRpcGxlIG9mIDIqRENUU0laRS4gQWRkIHNvbWUgR1NUX0RFQlVHX0ZVTkNQVFIuCisKKzIwMDYtMDMtMjMgMjE6Mjg6MDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIE1vcmUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uIGZpeGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiAoc3BlZXhfZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOiAoZGVpbnRlcmxlYXZlX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzogKGludGVybGVhdmVfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzogKGdzdF93YXZlbmNfY2hhbmdlX3N0YXRlKToKKwkgIE1vcmUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uIGZpeGVzLgorCisyMDA2LTAzLTIzIDIwOjEyOjQ3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvZXNkL2VzZHNpbmsuKjogRml4IGVzZCBjaG9wcHkgcGxheWJhY2sgYnkgY29uZmlndXJpbmcgYXVkaW9zaW5rIGNvcnJlY3RseS4gRml4ZXMgIzMyNTE5MQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfY2xhc3NfaW5pdCksCisJICAoZ3N0X2VzZHNpbmtfZ2V0Y2FwcyksIChnc3RfZXNkc2lua19vcGVuKSwgKGdzdF9lc2RzaW5rX2Nsb3NlKSwKKwkgIChnc3RfZXNkc2lua19wcmVwYXJlKSwgKGdzdF9lc2RzaW5rX3VucHJlcGFyZSksCisJICAoZ3N0X2VzZHNpbmtfZGVsYXkpLCAoZ3N0X2VzZHNpbmtfcmVzZXQpOgorCSAgKiBleHQvZXNkL2VzZHNpbmsuaDoKKwkgIEZpeCBlc2QgY2hvcHB5IHBsYXliYWNrIGJ5IGNvbmZpZ3VyaW5nIGF1ZGlvc2luaworCSAgY29ycmVjdGx5LiBGaXhlcyAjMzI1MTkxCisKKzIwMDYtMDMtMjMgMTk6NTc6MzQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IE1ha2Ugc3RhdGUgY2hhbmdlIGZ1bmN0aW9uIHRocmVhZC1zYWZlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IChnc3RfcG5nZGVjX2NoYW5nZV9zdGF0ZSk6CisJICBNYWtlIHN0YXRlIGNoYW5nZSBmdW5jdGlvbiB0aHJlYWQtc2FmZS4KKworMjAwNi0wMy0yMyAxNjo1MDozMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IERvbid0IHRyeSB0byByZWFkIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlIGp1c3QgYmVjYXVzZSB0aGUgaGVhZGVyIGNsYWltcyBhIGJpZ2dlciBzaXplLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfZ2V0X3Vwc3RyZWFtX3NpemUpLAorCSAgKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpOgorCSAgRG9uJ3QgdHJ5IHRvIHJlYWQgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGUganVzdCBiZWNhdXNlCisJICB0aGUgaGVhZGVyIGNsYWltcyBhIGJpZ2dlciBzaXplIChsaWtlIHdpdGggdHJ1bmNhdGVkIGZpbGVzKS4KKworMjAwNi0wMy0yMyAxNTozNjoyNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLio6IERlbGF5IHNvdXJjZSBwYWQgY3JlYXRpb24gdW50aWwgd2UgaGF2ZSB0aGUgZmlyc3QgY2h1bmsgb2YgbWVkaWEgZGF0YSwgc28gdGhlIHdlIGNhbiBleGFtLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpLCAoZ3N0X3dhdnBhcnNlX2FkZF9zcmNfcGFkKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpLCAoZ3N0X3dhdnBhcnNlX2xvb3ApOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwkgIERlbGF5IHNvdXJjZSBwYWQgY3JlYXRpb24gdW50aWwgd2UgaGF2ZSB0aGUgZmlyc3QgY2h1bmsgb2YKKwkgIG1lZGlhIGRhdGEsIHNvIHRoZSB3ZSBjYW4gZXhhbWluZSB0aGUgZGF0YSBhbmQgYWRqdXN0IHRoZQorCSAgY2FwcyBhY2NvcmRpbmdseSBpZiByZXF1aXJlZC4gVGhpcyBtYWtlcyBwbGF5YmFjayBvZiAud2F2CisJICBmaWxlcyB3aXRoIERUUy1kZWNsYXJlZC1hcy1QQ00gY29udGVudCB3b3JrICgjMzEzMjY2KS4KKworMjAwNi0wMy0yMiAxOTo1MDo1NiArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBhZGQgdmlkZW9iYWxhbmNlIHBsdWduCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCB2aWRlb2JhbGFuY2UgcGx1Z24KKworMjAwNi0wMy0yMiAxMzowMjoxMSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkgIG1lbnRpb24gZml4ZWQgYnVnIG51bWJlciBpbiB0aGUgY2hhbmdlbG9nCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIG1lbnRpb24gZml4ZWQgYnVnIG51bWJlciBpbiB0aGUgY2hhbmdlbG9nCisKKzIwMDYtMDMtMjIgMTM6MDA6MzQgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvOiBEb24ndCBhdHRlbXB0IHR5cGVmaW5kaW5nIG9uIHRvby1zaG9ydCBidWZmZXJzIHRoYXQgaGF2ZSBiZWVuIGNvbXBsZXRlbHkgdHJpbW1lZCBhd2F5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzogKGdzdF90YWdfZGVtdXhfY2hhaW4pOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogKGdzdF9pZDNkZW11eF9jaGFpbik6CisJICBEb24ndCBhdHRlbXB0IHR5cGVmaW5kaW5nIG9uIHRvby1zaG9ydCBidWZmZXJzIHRoYXQgaGF2ZSBiZWVuCisJICBjb21wbGV0ZWx5IHRyaW1tZWQgYXdheS4KKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogKGlkM2RlbXV4X3JlYWRfaWQzdjJfdGFnKToKKwkgIEltcHJvdmUgdGhlIGRlYnVnIG91dHB1dAorCisyMDA2LTAzLTIxIDE4OjEyOjU5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvZXNkL2VzZHNpbmsuYzogU29tZSBjbGVhbnVwcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZXNkL2VzZHNpbmsuYzogKGdzdF9lc2RzaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2VzZHNpbmtfaW5pdCksCisJICAoZ3N0X2VzZHNpbmtfZmluYWxpemUpLCAoZ3N0X2VzZHNpbmtfZ2V0Y2FwcyksIChnc3RfZXNkc2lua19vcGVuKSwKKwkgIChnc3RfZXNkc2lua19jbG9zZSksIChnc3RfZXNkc2lua19wcmVwYXJlKSwgKGdzdF9lc2RzaW5rX3dyaXRlKSwKKwkgIChnc3RfZXNkc2lua19zZXRfcHJvcGVydHkpLCAoZ3N0X2VzZHNpbmtfZ2V0X3Byb3BlcnR5KToKKwkgIFNvbWUgY2xlYW51cHMuCisJICBSZXNldCBmZCB0byAtMSB3aGVuIHdlIGNsb3NlIHRoZW0uCisKKzIwMDYtMDMtMjEgMTY6MTk6MzcgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogdGhlIE9QVElPTlMgcmVxdWVzdCByZXN1bHQgaXMgb3B0aW9uYWwgc28gZG9uJ3QgZmFpbCBvbiBpdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19vcGVuKToKKwkgIHRoZSBPUFRJT05TIHJlcXVlc3QgcmVzdWx0IGlzIG9wdGlvbmFsIHNvIGRvbid0CisJICBmYWlsIG9uIGl0LgorCisyMDA2LTAzLTIxIDE0OjUzOjM2ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvOiBnY2MgNC4xIHVucmVmZXJlbmNlZCBwb2ludGVyIGZpeGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzogKGdzdF90YWdfZGVtdXhfcmVzZXQpOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogKGdzdF9pZDNkZW11eF9yZXNldCk6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2NyZWF0ZV9zb3VyY2VwYWQpLAorCSAgKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksIChnc3Rfd2F2cGFyc2Vfc2VuZF9ldmVudCksCisJICAoZ3N0X3dhdnBhcnNlX2NoYW5nZV9zdGF0ZSk6CisJICBnY2MgNC4xIHVucmVmZXJlbmNlZCBwb2ludGVyIGZpeGVzLgorCisyMDA2LTAzLTIxIDEzOjA3OjMxICswMDAwICBUb21taSBNecO2aMOkbmVuIDxleHQtdG9tbWkubXlvaGFuZW5Abm9raWEuY29tPgorCisJICBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogRml4IGJsb2NrIGFsaWdubWVudCBjYWxjdWxhdGlvbi4gQWxpZ25tZW50IHNob3VsZCBiZSBkb25lIGJlZm9yZSBhZGRpbmcgdGhlIGJ5dGUgb2Zmc2V0IHcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUGF0Y2ggYnk6IFRvbW1pIE15w7Zow6RuZW4gIDxleHQtdG9tbWkgZG90IG15b2hhbmVuIGF0IG5va2lhIGRvdCBjb20+CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2Vlayk6CisJICBGaXggYmxvY2sgYWxpZ25tZW50IGNhbGN1bGF0aW9uLiBBbGlnbm1lbnQgc2hvdWxkIGJlIGRvbmUgYmVmb3JlCisJICBhZGRpbmcgdGhlIGJ5dGUgb2Zmc2V0IHdoZXJlIHRoZSBkYXRhIHN0YXJ0cyAoIzMzNTIzMSkuCisKKzIwMDYtMDMtMjAgMTg6MzQ6MjEgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOiBFbnN1cmUgdGhhdCB3ZSBzZXQgY29ycmVjdCBjYXBzIG9uIGJ1ZmZlcnMgdGhhdCBhcmUgdHJhbnNmZXJyZWQgZGlyZWN0IGZyb20gdGhlIGlucHV0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6IChnc3RfZWJtbF93cml0ZV9lbGVtZW50X3B1c2gpOgorCSAgRW5zdXJlIHRoYXQgd2Ugc2V0IGNvcnJlY3QgY2FwcyBvbiBidWZmZXJzIHRoYXQgYXJlIHRyYW5zZmVycmVkCisJICBkaXJlY3QgZnJvbSB0aGUgaW5wdXQuCisKKzIwMDYtMDMtMjAgMTc6Mzg6NDggKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvZ29vbS86IEZyZWUgZmlsdGVyIGRhdGEgd2hlbiBjbGVhbmluZyB1cC4gKEZpeGVzOiAjMzM0OTk1KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9nb29tL2ZpbHRlcnMuYzogKHpvb21GaWx0ZXJEZXN0cm95KToKKwkgICogZ3N0L2dvb20vZ29vbV9jb3JlLmM6IChnb29tX2Nsb3NlKToKKwkgIEZyZWUgZmlsdGVyIGRhdGEgd2hlbiBjbGVhbmluZyB1cC4gKEZpeGVzOiAjMzM0OTk1KQorCisyMDA2LTAzLTIwIDA4OjU5OjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvdGFnbGliL2dzdHRhZ2xpYi5oOiBGaXggbGVmdC1vdmVyIGdzdF9teV9maWx0ZXJfZ2V0X3R5cGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3RhZ2xpYi9nc3R0YWdsaWIuaDoKKwkgIEZpeCBsZWZ0LW92ZXIgZ3N0X215X2ZpbHRlcl9nZXRfdHlwZS4KKworMjAwNi0wMy0xNyAxNjozNDozNiArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSogc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYzoKKwkgIEhhdmUgYSBzaG93IG1vdXNlIHBvaW50ZXIgcHJvcGVydHkgYW5kIHVzZSBpdCBpZiB3ZSBjYW4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgSGF2ZSBhIHNob3cgbW91c2UgcG9pbnRlciBwcm9wZXJ0eSBhbmQgdXNlIGl0IGlmIHdlIGNhbgorCisyMDA2LTAzLTE3IDE1OjMzOjA4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IERvbid0IGNvbXBpbGUgdWRwIGFuZCBydHNwIHBsdWdpbnMgb24gd2luMzIgKG1pbmd3KSBvciBvdGhlciBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSA8c3lzL3NvY2tldC5oPiBmb3IuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBEb24ndCBjb21waWxlIHVkcCBhbmQgcnRzcCBwbHVnaW5zIG9uIHdpbjMyIChtaW5ndykgb3Igb3RoZXIKKwkgIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIDxzeXMvc29ja2V0Lmg+IGZvciBzb21lIHJlYXNvbiAoIzMxNjIwMykuCisKKzIwMDYtMDMtMTYgMTc6Mjg6MDcgKzAwMDAgIFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzQG1lcmFsaS5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmg6CisJICBDaGFuZ2UgYnVzIHJlc2V0IGhhbmRsZXIgc28gaXQgcmVwb3J0cyB1c2VmdWwgaW5mb3JtYXRpb24gc3VjaCBhcyB3aGV0aGVyIHRoZSBkZXZpY2UgYmVpbmcgdXNlZCBjb25uZWN0ZWQgb3IgZGlzY29ubmUuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQ2hhbmdlIGJ1cyByZXNldCBoYW5kbGVyIHNvIGl0IHJlcG9ydHMgdXNlZnVsIGluZm9ybWF0aW9uIHN1Y2ggYXMKKwkgIHdoZXRoZXIgdGhlIGRldmljZSBiZWluZyB1c2VkIGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQKKworMjAwNi0wMy0xNiAxNjowNjoyMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IFdlIG9ubHkgY2FyZSBhYm91dCBnYWluIGFuZCBwZWFrIGRhdGEgZm9yIHRoZSBtYXN0ZXIgdm9sdW1lLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOgorCSAgKHBhcnNlX3JlbGF0aXZlX3ZvbHVtZV9hZGp1c3RtZW50X3R3byk6CisJICBXZSBvbmx5IGNhcmUgYWJvdXQgZ2FpbiBhbmQgcGVhayBkYXRhIGZvciB0aGUgbWFzdGVyIHZvbHVtZS4KKworMjAwNi0wMy0xNiAxMzoyMjoyOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IFJlYWQgcmVwbGF5IGdhaW4gdGFncyAoIzMyMzcyMSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChpZDNkZW11eF9pZDN2Ml9wYXJzZV9mcmFtZSksCisJICAocGFyc2VfaWRfc3RyaW5nKSwgKHBhcnNlX3VuaXF1ZV9maWxlX2lkZW50aWZpZXIpLAorCSAgKHBhcnNlX3JlbGF0aXZlX3ZvbHVtZV9hZGp1c3RtZW50X3R3byksIChpZDN2Ml90YWdfdG9fdGFnbGlzdCk6CisJICBSZWFkIHJlcGxheSBnYWluIHRhZ3MgKCMzMjM3MjEpLgorCisyMDA2LTAzLTE1IDIzOjE5OjMwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IEJ1bXAgcmVxdWlyZW1lbnRzIHRvIGdzdC1wbHVnaW5zLWJhc2UgQ1ZTIGJlY2F1c2Ugb2YgYnVnZ3kgZ3N0X3RhZ19mcm9tX2lkM191c2VyX3RhZygpIGluIDAuMTAuNS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBCdW1wIHJlcXVpcmVtZW50cyB0byBnc3QtcGx1Z2lucy1iYXNlIENWUyBiZWNhdXNlCisJICBvZiBidWdneSBnc3RfdGFnX2Zyb21faWQzX3VzZXJfdGFnKCkgaW4gMC4xMC41LgorCisyMDA2LTAzLTE1IDIyOjMwOjI0ICswMDAwICBQaGlsaXBwZSBLYWxhZiA8cGhpbGlwcGUua2FsYWZAY29sbGFib3JhLmNvLnVrPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jOgorCSAgRml4ZWQgb25lIG9mIHRoZSBjYXBzIGluIHRoZSBjb2RlIGZyb20gbXVsYXcgdG8gYWxhdy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4ZWQgb25lIG9mIHRoZSBjYXBzIGluIHRoZSBjb2RlIGZyb20gbXVsYXcgdG8gYWxhdy4KKworMjAwNi0wMy0xNSAxNjoyMTozOCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzogRW5zdXJlIHRoYXQgd2Ugc2V0IGNhcHMgb24gdGhlIGJ1ZmZlcnMgd2UgcGFzcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXBldGFnL2dzdHRhZ2RlbXV4LmM6IChnc3RfdGFnX2RlbXV4X2NoYWluKToKKwkgIEVuc3VyZSB0aGF0IHdlIHNldCBjYXBzIG9uIHRoZSBidWZmZXJzIHdlIHBhc3MuCisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoZ3N0X2lkM2RlbXV4X2NoYWluKSwKKwkgIChnc3RfaWQzZGVtdXhfc2lua19hY3RpdmF0ZSk6CisJICBFbnN1cmUgdGhhdCB3ZSBzZXQgY2FwcyBvbiB0aGUgYnVmZmVycyB3ZSBwYXNzLgorCSAgVXNlIFNUUkVBTSwgVFlQRV9OT1RfRk9VTkQgYXMgdGhlIGVycm9yIGNsYXNzIHdoZW4KKwkgIHR5cGVmaW5kaW5nIGZhaWxzLgorCisyMDA2LTAzLTE1IDE2OjE3OjEyICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBGaXggbWVtbGVhayB3aXRoIGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCgpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOiAoZ3N0X3RleHRfb3ZlcmxheV9pbml0KToKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2luaXQpLCAoZ3N0X2R2ZGVtdXhfYWRkX3BhZHMpOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKGdzdF9nZGtfcGl4YnVmX2luaXQpOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChnc3RfanBlZ19kZWNfaW5pdCksCisJICAoZ3N0X2pwZWdfZGVjX3NldGNhcHMpOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6IChnc3RfanBlZ2VuY19pbml0KToKKwkgICogZXh0L2pwZWcvZ3N0c21va2VkZWMuYzogKGdzdF9zbW9rZWRlY19pbml0KToKKwkgICogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzogKGdzdF9zbW9rZWVuY19pbml0KToKKwkgICogZXh0L2xpYm1uZy9nc3RtbmdkZWMuYzogKGdzdF9tbmdkZWNfaW5pdCksCisJICAoZ3N0X21uZ2RlY19zcmNfZ2V0Y2Fwcyk6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IChnc3RfcG5nZGVjX2luaXQpLAorCSAgKGdzdF9wbmdkZWNfY2Fwc19jcmVhdGVfYW5kX3NldCk6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6IChnc3RfcG5nZW5jX2luaXQpOgorCSAgKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOiAoZ3N0X21pa21vZF9pbml0KToKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IChnc3Rfc3BlZXhfZGVjX2luaXQpOgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogKGdzdF9hbHBoYV9pbml0KToKKwkgICogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiAoZ3N0X2F1X3BhcnNlX2luaXQpOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2luaXQpLAorCSAgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19ldmVudCksIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSk6CisJICAqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6IChnc3RfY3V0dGVyX2luaXQpOgorCSAgKiBnc3QvZGVidWcvZWZlbmNlLmM6IChnc3RfZWZlbmNlX2luaXQpLCAoZ3N0X2VmZW5jZV9nZXRyYW5nZSksCisJICAoZ3N0X2VmZW5jZV9jaGVja2dldHJhbmdlKToKKwkgICogZ3N0L2RlYnVnL25lZ290aWF0aW9uLmM6IChnc3RfbmVnb3RpYXRpb25faW5pdCk6CisJICAqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IChnc3RfZmx4ZGVjX2luaXQpOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9pbml0KToKKwkgICogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzogKGdzdF9hc3Rlcmlza2gyNjNfaW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYzogKGdzdF9ydHBfTDE2ZGVwYXlfaW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6IChnc3RfcnRwTDE2cGF5X2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6IChnc3RfcnRwX2Ftcl9kZXBheV9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBkZXBheS5jOiAoZ3N0X3J0cF9kZXBheV9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jOiAoZ3N0X3J0cF9tcGFfZGVwYXlfaW5pdCk6CisJICAqIGdzdC9ydHNwL2dzdHJ0cGRlYy5jOiAoZ3N0X3J0cGRlY19pbml0KToKKwkgICogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6IChnc3Rfc21wdGVfaW5pdCk6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2luaXQpLAorCSAgKGdzdF93YXZwYXJzZV9jcmVhdGVfc291cmNlcGFkKToKKwkgIEZpeCBtZW1sZWFrIHdpdGggZ3N0X3N0YXRpY19wYWRfdGVtcGxhdGVfZ2V0KCkuCisJICBUaGlzIHVzZXMgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUoKSBpbnN0ZWFkLgorCSAgRml4ZXMgIzMzMzUxMgorCisyMDA2LTAzLTE1IDE1OjA4OjIwICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IExldCdzIG5vdCBmb3JnZXQgdG8gY2hhaW4gdXAgdG8gdGhlIHBhcmVudCBkaXNwb3NlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2Rpc3Bvc2UpOgorCSAgTGV0J3Mgbm90IGZvcmdldCB0byBjaGFpbiB1cCB0byB0aGUgcGFyZW50IGRpc3Bvc2UuCisKKzIwMDYtMDMtMTUgMTQ6Mzk6MjUgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogU2VyaWVzIG9mIG1lbWxlYWsgZml4ZXM6CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfY2xhc3NfaW5pdCksCisJICAoZ3N0X3F0ZGVtdXhfaW5pdCksIChnc3RfcXRkZW11eF9kaXNwb3NlKSwKKwkgIChnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBTZXJpZXMgb2YgbWVtbGVhayBmaXhlczoKKwkgIC0gVW5yZWYgdGhlIEdzdEFkYXB0ZXIgaW4gZmluYWxpemUuCisJICAtIFVzZSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSgpLCBzaG9ydGVyIGFuZCBzYWZlci4KKwkgIC0gRnJlZSB1bnVzZWQgUXREZW11eFN0cmVhbSB3aGVuIG5vdCB1c2VkLgorCisyMDA2LTAzLTE0IDE3OjU2OjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IEJ1bXAgLWJhc2UgcmVxdWlyZW1lbnQgdG8gMC4xMC41IGZvciBnc3RfdGFnX2Zyb21faWQzX3VzZXJfdGFnKCksIHVzZWQgYnkgaWQzZGVtdXguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQnVtcCAtYmFzZSByZXF1aXJlbWVudCB0byAwLjEwLjUgZm9yIGdzdF90YWdfZnJvbV9pZDNfdXNlcl90YWcoKSwKKwkgIHVzZWQgYnkgaWQzZGVtdXguCisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKGlkM2RlbXV4X2lkM3YyX3BhcnNlX2ZyYW1lKSwKKwkgIChwYXJzZV91c2VyX3RleHRfaWRlbnRpZmljYXRpb25fZnJhbWUpLAorCSAgKHBhcnNlX3VuaXF1ZV9maWxlX2lkZW50aWZpZXIpOgorCSAgQWRkIHN1cHBvcnQgZm9yIFVGSUQgYW5kIFRYWFggZnJhbWVzIGFuZCBleHRyYWN0IG11c2ljYnJhaW56IHRhZ3MuCisKKzIwMDYtMDMtMTQgMTc6MjQ6MDMgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogSW5pdGlhbGl6YXRpb24gb2YgdGhlIGRlYnVnZ2luZyBjYXRlZ29yeSBzaG91bGQgYmUgYXMgZWFybHkgYXMgcG9zc2libGUsIG1vdmluZyBpdCBmcm9tIF9jbGFzcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX2Jhc2VfaW5pdCksCisJICAoZ3N0X3Y0bDJzcmNfY2xhc3NfaW5pdCk6CisJICBJbml0aWFsaXphdGlvbiBvZiB0aGUgZGVidWdnaW5nIGNhdGVnb3J5IHNob3VsZCBiZSBhcyBlYXJseSBhcyBwb3NzaWJsZSwKKwkgIG1vdmluZyBpdCBmcm9tIF9jbGFzc19pbml0KCkgdG8gYmVnaW5uaW5nIG9mIF9iYXNlX2luaXQoKS4KKworMjAwNi0wMy0xNCAxNToyODowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBDYXRjaCBzaG9ydCByZWFkcywgbGlrZSB0aGV5IG1pZ2h0IGhhcHBlbiB3aXRoIHRydW5jYXRlZCBmaWxlcyAoc2VlICMzMDUyNzkpOyByZW1vdmUgdW5uZWNlc3NhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpOgorCSAgQ2F0Y2ggc2hvcnQgcmVhZHMsIGxpa2UgdGhleSBtaWdodCBoYXBwZW4gd2l0aCB0cnVuY2F0ZWQKKwkgIGZpbGVzIChzZWUgIzMwNTI3OSk7IHJlbW92ZSB1bm5lY2Vzc2FyeSBpbmRlbnRhdGlvbi4KKworMjAwNi0wMy0xNCAxNDoxODoxNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBGaXggRElCIGltYWdlIGludmVyc2lvbiBmb3IgcGljdHVyZXMgd2l0aCBhIGRlcHRoICE9IDggKCMzMDUyNzkpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaW52ZXJ0KToKKwkgIEZpeCBESUIgaW1hZ2UgaW52ZXJzaW9uIGZvciBwaWN0dXJlcyB3aXRoIGEKKwkgIGRlcHRoICE9IDggKCMzMDUyNzkpLgorCisyMDA2LTAzLTE0IDA5OjIzOjA5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvanBlZy9nc3RqcGVnZGVjLio6IEZpeCBkdXJhdGlvbnMgb24gb3V0Z29pbmcgYnVmZmVycyBhZnRlciBzZWVraW5nIGluIE1KUEVHIGZpbGVzICgjMzM0MDgzKTsgc29tZSBtaW5vciBjbGVhbi11cHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdfZGVjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9qcGVnX2RlY19jaGFpbiksIChnc3RfanBlZ19kZWNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAgRml4IGR1cmF0aW9ucyBvbiBvdXRnb2luZyBidWZmZXJzIGFmdGVyIHNlZWtpbmcKKwkgIGluIE1KUEVHIGZpbGVzICgjMzM0MDgzKTsgc29tZSBtaW5vciBjbGVhbi11cHMuCisKKzIwMDYtMDMtMTMgMTg6Mjg6MTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBJbXBsZW1lbnQgc2VlayBpbiBSRUFEWSAocmUtZml4ZXMgIzMyNzY1OCkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9yZXNldCksCisJICAoZ3N0X3dhdnBhcnNlX2NoYW5nZV9zdGF0ZSk6CisJICBJbXBsZW1lbnQgc2VlayBpbiBSRUFEWSAocmUtZml4ZXMgIzMyNzY1OCkKKworMjAwNi0wMy0xMyAxNzoyMjoxOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L3RhZ2xpYi9nc3R0YWdsaWIuY2M6IEFkZCBndGstZG9jIGJsdXJiICh1bnVzZWQgZm9yIHRoZSB0aW1lIGJlaW5nKTsgbWF0Y2ggcmVnaXN0ZXJlZCBwbHVnaW4gbmFtZSB0byB0aGUgZmlsZW5hbWUgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3RhZ2xpYi9nc3R0YWdsaWIuY2M6CisJICBBZGQgZ3RrLWRvYyBibHVyYiAodW51c2VkIGZvciB0aGUgdGltZSBiZWluZyk7IG1hdGNoIHJlZ2lzdGVyZWQKKwkgIHBsdWdpbiBuYW1lIHRvIHRoZSBmaWxlbmFtZSBvZiB0aGUgcGx1Z2luICh0YWdsaWJtdXggPT4gdGFnbGliKQorCisyMDA2LTAzLTEzIDE1OjQ5OjA4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBjbG9zZSAjMzMzNzg0IHVucmVmIHRoZSByZXN1bHQgb2YgZ3N0X3BhZF9nZXRfcGFyZW50KCkgYnk6IENocmlzdG9waGUgRmVyZ2VhdS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzogKGdzdF90ZXh0X292ZXJsYXlfc2V0Y2Fwcyk6CisJICAqIGV4dC9lc2QvZXNkbW9uLmM6IChnc3RfZXNkbW9uX2dldCk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzogKGdzdF9mbGFjX3RhZ19jaGFpbik6CisJICAqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOiAoZ3N0X2dka19waXhidWZfc2lua19zZXRjYXBzKSwKKwkgIChnc3RfZ2RrX3BpeGJ1Zl9zaW5rX2dldGNhcHMpOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6IChnc3RfanBlZ2VuY19nZXRjYXBzKSwKKwkgIChnc3RfanBlZ2VuY19zZXRjYXBzKToKKwkgICogZXh0L2pwZWcvZ3N0c21va2VkZWMuYzogKGdzdF9zbW9rZWRlY19jaGFpbik6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6IChnc3Rfc21va2VlbmNfZ2V0Y2FwcyksCisJICAoZ3N0X3Ntb2tlZW5jX3NldGNhcHMpOgorCSAgKiBleHQvbGlibW5nL2dzdG1uZ2RlYy5jOiAoZ3N0X21uZ2RlY19zaW5rbGluayksCisJICAoZ3N0X21uZ2RlY19zcmNfZ2V0Y2Fwcyk6CisJICAqIGV4dC9saWJtbmcvZ3N0bW5nZW5jLmM6IChnc3RfbW5nZW5jX3NpbmtsaW5rKSwKKwkgIChnc3RfbW5nZW5jX2NoYWluKToKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzogKGdzdF9wbmdlbmNfc2V0Y2Fwcyk6CisJICAqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6IChnc3RfbWlrbW9kX3NyY2xpbmspOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogKHNwZWV4X2RlY19jb252ZXJ0KSwKKwkgIChzcGVleF9kZWNfc3JjX2V2ZW50KSwgKHNwZWV4X2RlY19jaGFpbik6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpbXV4X3ZpZHNpbmtjb25uZWN0KSwKKwkgIChnc3RfYXZpbXV4X2F1ZHNpbmtjb25uZWN0KSwgKGdzdF9hdmltdXhfaGFuZGxlX2V2ZW50KToKKwkgICogZ3N0L2RlYnVnL25lZ290aWF0aW9uLmM6IChnc3RfbmVnb3RpYXRpb25fZ2V0Y2FwcyksCisJICAoZ3N0X25lZ290aWF0aW9uX3BhZF9saW5rKSwgKGdzdF9uZWdvdGlhdGlvbl9jaGFpbik6CisJICAqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IChnc3RfZmx4ZGVjX3NyY19xdWVyeV9oYW5kbGVyKSwKKwkgIChnc3RfZmx4ZGVjX2NoYWluKToKKwkgICogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6IChkZWludGVybGVhdmVfc2lua19saW5rKSwKKwkgIChkZWludGVybGVhdmVfY2hhaW4pOgorCSAgKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOiAobXVsYXdlbmNfc2V0Y2Fwcyk6CisJICAqIGdzdC9tZWRpYW4vZ3N0bWVkaWFuLmM6IChnc3RfbWVkaWFuX2xpbmspOgorCSAgKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOiAoZ3N0X21vbm9zY29wZV9zcmNjb25uZWN0KSwKKwkgIChnc3RfbW9ub3Njb3BlX2NoYWluKToKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzogKGdzdF9ydHBMMTZwYXlfc2lua2Nvbm5lY3QpOgorCSAgKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiAoZ3N0X3dhdmVuY19zaW5rX3NldGNhcHMpOgorCSAgKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmM6IChnc3Rfb3N4YXVkaW9zaW5rX2NoYWluKToKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6IChnc3Rfb3N4YXVkaW9zcmNfZ2V0KToKKwkgIGNsb3NlICMzMzM3ODQgdW5yZWYgdGhlIHJlc3VsdCBvZiBnc3RfcGFkX2dldF9wYXJlbnQoKQorCSAgYnk6IENocmlzdG9waGUgRmVyZ2VhdS4KKworMjAwNi0wMy0xMyAxMDowNTowOSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIEZpeCBidWlsZCBvZiB2NGwyIChzaWdoKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAzLTEzICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1kZWNsLWxpc3QudHh0OgorCSAgKiBzeXMvdjRsMi9NYWtlZmlsZS5hbTogRml4IGJ1aWxkIG9mIHY0bDIgKHNpZ2gpCisKKzIwMDYtMDMtMTIgMTU6MzM6MDAgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogZ19hdG9taWNfaW50X3NldCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBnbGliLTAuMTAsIHVzZSBnc3RfYXRvbWljX2ludF9ldCBpbnN0ZWFkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX2NhcHR1cmVfaW5pdCksCisJICAoZ3N0X3Y0bDJzcmNfYnVmZmVyX3Bvb2xfZnJlZSk6CisJICBnX2F0b21pY19pbnRfc2V0IGlzIG9ubHkgYXZhaWxhYmxlIGluIGdsaWItMC4xMCwgdXNlIGdzdF9hdG9taWNfaW50X2V0CisJICBpbnN0ZWFkLgorCisyMDA2LTAzLTEyIDE1OjI1OjUxICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5oOiBSZW1vdmUgdGltJ3MgYWRkaXRpb24gb2YgIl9zdGRpbnQuaCIgc2luY2UgaXQgZG9lc24ndCBtYWtlIHRoZSBQUEMgYnVpbGRib3QgaGFwcHkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL3Y0bDIvZ3N0djRsMmVsZW1lbnQuaDoKKwkgIFJlbW92ZSB0aW0ncyBhZGRpdGlvbiBvZiAiX3N0ZGludC5oIiBzaW5jZSBpdCBkb2Vzbid0IG1ha2UgdGhlIFBQQworCSAgYnVpbGRib3QgaGFwcHkuCisJICBJIHdpbGwganVzdCB1c2UgdGhlIHNhbWUgY29tbWVudCBSb25hbGQgdXNlZCB3aGVuIGhlIGFkZGVkIHRoZXNlIGxpbmVzOgorCSAgWWV0IEFub3RoZXIgSGFjayAodG0pIGZvciBrZXJuZWwgaGVhZGVyIGJvcmtlZG5lc3MuCisKKzIwMDYtMDMtMTIgMTU6MDI6MDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC90YWdsaWIvOiBBZGQgc3VwcG9ydCBmb3Igd3JpdGluZyBNdXNpY0JyYWlueiBJRHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3RhZ2xpYi9NYWtlZmlsZS5hbToKKwkgICogZXh0L3RhZ2xpYi9nc3R0YWdsaWIuY2M6CisJICAqIGV4dC90YWdsaWIvZ3N0dGFnbGliLmg6CisJICBBZGQgc3VwcG9ydCBmb3Igd3JpdGluZyBNdXNpY0JyYWlueiBJRHMuCisKKzIwMDYtMDMtMTIgMTQ6NDM6NTcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50Lmg6IEluY2x1ZGUgIl9zdGRpbnQuaCIgaW4gYW4gYXR0ZW1wdCB0byBtYWtlIHRoZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50Lmg6CisJICBJbmNsdWRlICJfc3RkaW50LmgiIGluIGFuIGF0dGVtcHQgdG8gbWFrZSB0aGUKKwkgIFBQQy1idWlsZGJvdCBoYXBweS4KKworMjAwNi0wMy0xMSAyMjo1MDowMyArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBzeXMvdjRsMi9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwydHVuZXIuaDoKKwkqIHN5cy92NGwyL2dzdHY0bDJ4b3ZlcmxheS5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnhvdmVybGF5Lmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmg6CisJICBWNEwyIHBvcnRlZCB0byAwLjEwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBWNEwyIHBvcnRlZCB0byAwLjEwLgorCisyMDA2LTAzLTExIDEwOjU4OjA4ICswMDAwICBBbGV4IExhbmNhc3RlciA8YWxleGxhbkBmZWRvcmFwcm9qZWN0Lm9yZz4KKworCSAgZXh0L3RhZ2xpYi9nc3R0YWdsaWIuY2M6IGFuZCBhZGQgc3VwcG9ydCBmb3IgVENPUCAoY29weXJpZ2h0KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAzLTExICBDaHJpc3RvcGhlIEZlcmdlYXUgIDx0ZXVmQGdub21lLm9yZz4KKwkgIFBhdGNoIGJ5OiBBbGV4IExhbmNhc3RlcgorCSAgKiBleHQvdGFnbGliL2dzdHRhZ2xpYi5jYzogZml4IHdyaXRpbmcgb2YgVFBPUyB0YWdzIChhbGJ1bSBudW1iZXIpLAorCSAgYW5kIGFkZCBzdXBwb3J0IGZvciBUQ09QIChjb3B5cmlnaHQpCisKKzIwMDYtMDMtMDkgMjA6MDI6NDQgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRml4IGJ1aWxkIHdpdGggZ2NjLTQuMSAoIzMyNzM1NSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfc2VuZF9ldmVudCk6CisJICBGaXggYnVpbGQgd2l0aCBnY2MtNC4xICgjMzI3MzU1KS4KKworMjAwNi0wMy0wOSAxNzo0NDoxNyArMDAwMCAgQ2hyaXN0b3BoZSBGZXJnZWF1IDx0ZXVmQGdub21lLm9yZz4KKworCSAgbmV3IGlkM3YyIG11eGVyIGJhc2VkIG9uIFRhZ0xpYgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAzLTA5ICBDaHJpc3RvcGhlIEZlcmdlYXUgIDx0ZXVmQGdub21lLm9yZz4KKwkgIHJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZXh0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGFnbGliL01ha2VmaWxlLmFtOgorCSAgKiBleHQvdGFnbGliL2dzdHRhZ2xpYi5jYzoKKwkgICogZXh0L3RhZ2xpYi9nc3R0YWdsaWIuaDogbmV3IGlkM3YyIG11eGVyIGJhc2VkIG9uIFRhZ0xpYgorCisyMDA2LTAzLTA5IDExOjQ3OjMyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvZHYvZ3N0ZHZkZW11eC5jOiBIYW5kbGUgZXZlbnRzIGluIHB1c2ggbW9kZSBiZXR0ZXIsIGNhbiBub3cgZG8gbm9uLWZsdXNoaW5nIHNlZWtzIGluIHB1c2ggbW9kZSBhcyB3ZWxsLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kdi9nc3RkdmRlbXV4LmM6IChnc3RfZHZkZW11eF9oYW5kbGVfc2lua19ldmVudCksCisJICAoZ3N0X2R2ZGVtdXhfY29udmVydF9zZWdtZW50KSwgKGdzdF9kdmRlbXV4X2RlbXV4X2ZyYW1lKToKKwkgIEhhbmRsZSBldmVudHMgaW4gcHVzaCBtb2RlIGJldHRlciwgY2FuIG5vdyBkbyBub24tZmx1c2hpbmcKKwkgIHNlZWtzIGluIHB1c2ggbW9kZSBhcyB3ZWxsLgorCisyMDA2LTAzLTA4IDEyOjE2OjE0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEV4dHJhY3QgZGlzYyBudW1iZXIgYW5kIGNvdW50IGZyb20gZmlsZXMgdGhhdCB1c2UgJ2Rpc2snIGluc3RlYWQgb2YgJ2Rpc2MnIGFzIG5vZGUgaWRlbnRpZmllciAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlX3VkdGEpOgorCSAgRXh0cmFjdCBkaXNjIG51bWJlciBhbmQgY291bnQgZnJvbSBmaWxlcyB0aGF0IHVzZQorCSAgJ2Rpc2snIGluc3RlYWQgb2YgJ2Rpc2MnIGFzIG5vZGUgaWRlbnRpZmllciBmb3IgdGhhdAorCSAgKGZpeGVzICMzMzIwNjYpLgorCisyMDA2LTAzLTA3IDE3OjMxOjAzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzogQXBwbGllZCBwYXRjaCBmcm9tIEthaSBWZWhtYW5lbiwgZml4ZXMgIzMzMzYyNC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzogKGdzdF9keW51ZHBzaW5rX2NsYXNzX2luaXQpOgorCSAgQXBwbGllZCBwYXRjaCBmcm9tIEthaSBWZWhtYW5lbiwgZml4ZXMgIzMzMzYyNC4KKworMjAwNi0wMy0wNiAyMjoyMjo0NSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IEltcGxlbWVudCBwYWxldHRlZCBhbmQgZ3JheXNjYWxlIHBuZyBmaWxlcyBoYW5kbGluZy4gKCMxNTAzNjMpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAzLTA2ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IChnc3RfcG5nZGVjX2NhcHNfY3JlYXRlX2FuZF9zZXQpOgorCSAgSW1wbGVtZW50IHBhbGV0dGVkIGFuZCBncmF5c2NhbGUgcG5nIGZpbGVzIGhhbmRsaW5nLgorCSAgKCMxNTAzNjMpLgorCisyMDA2LTAzLTA2IDAwOjEwOjI5ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IGZpeCBhIHRhZyBsaXN0IGFzc2VydCBmb2xsb3cgZ3N0LXBsdWdpbnMtYmFzZS9leHQvb2dnL1JFQURNRTsgc2V0IE9GRlNFVCBhbmQgT0ZGU0VUX0VORC4gIE11Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IChnc3Rfc3BlZXhlbmNfc2V0X2hlYWRlcl9vbl9jYXBzKSwKKwkgIChnc3Rfc3BlZXhlbmNfY2hhaW4pOgorCSAgZml4IGEgdGFnIGxpc3QgYXNzZXJ0CisJICBmb2xsb3cgZ3N0LXBsdWdpbnMtYmFzZS9leHQvb2dnL1JFQURNRTsgc2V0IE9GRlNFVAorCSAgYW5kIE9GRlNFVF9FTkQuICBNdXhlcyBjb3JyZWN0bHkgd2l0aCBnc3QtcGx1Z2lucy1iYXNlCisJICA+IDAuOS4zCisKKzIwMDYtMDMtMDUgMTM6MDM6NDAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQWRkIHN1cHBvcnQgZm9yICczSVZEJyBmb3VyY2MgKCMzMzM0MDMpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBBZGQgc3VwcG9ydCBmb3IgJzNJVkQnIGZvdXJjYyAoIzMzMzQwMykuCisKKzIwMDYtMDMtMDQgMjA6MTE6MzUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pZDNkZW11eC86IFVzZSBuZXcgdHlwZWZpbmQgaGVscGVyIGZ1bmN0aW9ucyBoZXJlIGFzIHdlbGwsIGFuZCBkbyB0eXBlZmluZGluZyBpbiBwdWxsLW1vZGUgaWYgdXBzdHJlYW0gc3VwcG9ydHMgdC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfYWRkX3NyY3BhZCksCisJICAoZ3N0X2lkM2RlbXV4X2NoYWluKSwgKGdzdF9pZDNkZW11eF9zaW5rX2FjdGl2YXRlKToKKwkgIFVzZSBuZXcgdHlwZWZpbmQgaGVscGVyIGZ1bmN0aW9ucyBoZXJlIGFzIHdlbGwsIGFuZAorCSAgZG8gdHlwZWZpbmRpbmcgaW4gcHVsbC1tb2RlIGlmIHVwc3RyZWFtIHN1cHBvcnRzIHRoYXQuCisKKzIwMDYtMDMtMDQgMTg6NTc6MzcgKzAwMDAgIEJlbmphbWluIFBpbmVhdSA8YmVuLnBpbmVhdUBnbWFpbC5jb20+CisKKwkgIHN5cy9zdW5hdWRpby86IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLCBicmVha3MgYnVpbGQgZnJvbSBDVlMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuYzoKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl9jdHJsX2dldF92b2x1bWUpLAorCSAgKGdzdF9zdW5hdWRpb21peGVyX2N0cmxfc2V0X3ZvbHVtZSk6CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVydHJhY2suYzoKKwkgIChnc3Rfc3VuYXVkaW9taXhlcl90cmFja19uZXcpOgorCSAgUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMsIGJyZWFrcyBidWlsZCBmcm9tIENWUworCSAgd2l0aCAtV2Vycm9yICgjMzMzMzkyLCBwYXRjaCBieTogQmVuamFtaW4gUGluZWF1KQorCisyMDA2LTAzLTAzIDIzOjQ1OjIzICswMDAwICBTw6liYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisKKwkgIHN5cy86IHNpbmtzIGFyZSBub3cgdXNpbmcgR1NUX1JBTktfUFJJTUFSWSB0byBiZSB1c2VkIHdpdGggYXV0b2RlY3RlY3Rpb24KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvZGlyZWN0ZHJhdzoKKwkgICogc3lzL2RpcmVjdHNvdW5kOgorCSAgc2lua3MgYXJlIG5vdyB1c2luZyBHU1RfUkFOS19QUklNQVJZIHRvIGJlIHVzZWQgd2l0aCBhdXRvZGVjdGVjdGlvbgorCSAgKiB3aW4zMi92czY6CisJICBwcm9qZWN0IGZpbGVzIHVwZGF0ZWQgdG8gZml4IHNvbWUgYnVncworCSAgKiB3aW4zMi92czc6CisJICAqIHdpbjMyL3ZzODoKKwkgIHZzNyBhbmQgdnM4IHByb2plY3QgZmlsZXMgYWRkZWQKKworMjAwNi0wMy0wMyAxODozNjo1MyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZG9jcy9wbHVnaW5zLzogQWRkZWQgd2F2cGFyc2UgZG9jcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgIEFkZGVkIHdhdnBhcnNlIGRvY3MuCisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2NsYXNzX2luaXQpLAorCSAgKGdzdF93YXZwYXJzZV9yZXNldCksIChnc3Rfd2F2cGFyc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhcnNlX2NyZWF0ZV9zb3VyY2VwYWQpLCAoZ3N0X3dhdnBhcnNlX3BhcnNlX2ZpbGVfaGVhZGVyKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2luaXQpLCAoZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwgKGdzdF93YXZwYXJzZV9zZW5kX2V2ZW50KSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpLCAoZ3N0X3dhdnBhcnNlX2xvb3ApLAorCSAgKGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQpLCAoZ3N0X3dhdnBhcnNlX3NpbmtfYWN0aXZhdGVfcHVsbCksCisJICAoZ3N0X3dhdnBhcnNlX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oOgorCSAgSW1wbGVtZW50IHNlZWsgaW4gUkVBRFkgKGZpeGVzICMzMjc2NTgpCisJICBBZGRlZCBkb2NzIGFuZCBkaWQgc29tZSBjbGVhbnVwcy4KKworMjAwNi0wMy0wMyAxNzo1MToxNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC4qOiBJZiB3ZSBoYXZlIGFuIGluZGV4LCB1c2UgYSBkdXJhdGlvbiBiYXNlZCBvbiB0aGUgaW5kZXggaW5zdGVhZCBvZiBibGluZGx5IHRydXN0aW5nIHRoZSBpbmZvcm1hLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwKKwkgIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLCAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0pLAorCSAgKGdzdF9hdmlfZGVtdXhfY2FsY3VsYXRlX2R1cmF0aW9uc19mcm9tX2luZGV4KSwKKwkgIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBJZiB3ZSBoYXZlIGFuIGluZGV4LCB1c2UgYSBkdXJhdGlvbiBiYXNlZCBvbiB0aGUgaW5kZXggaW5zdGVhZAorCSAgb2YgYmxpbmRseSB0cnVzdGluZyB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHN0cmVhbSBoZWFkZXJzCisJICAoZml4ZXMgIzMzMTgxNykuCisKKzIwMDYtMDMtMDMgMTU6NTA6NDAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGRvY3MvcGx1Z2lucy86IEFkZGVkIHNtb2tlIGFuZCBqcGVnIHRvIHRoZSBkb2NzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeToKKwkgIEFkZGVkIHNtb2tlIGFuZCBqcGVnIHRvIHRoZSBkb2NzLgorCSAgKiBleHQvanBlZy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2pwZWcvZ3N0anBlZy5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChnc3RfanBlZ19kZWNfY2hhaW4pOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZW5jLmg6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZGVjLmM6IChnc3Rfc21va2VkZWNfaW5pdCksCisJICAoZ3N0X3Ntb2tlZGVjX2NoYWluKToKKwkgICogZXh0L2pwZWcvZ3N0c21va2VkZWMuaDoKKwkgICogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzogKGdzdF9zbW9rZWVuY19jaGFpbik6CisJICAqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmg6CisJICAqIGV4dC9qcGVnL3Ntb2tlY29kZWMuaDoKKwkgIFBvcnQgc21va2VkZWMgKGZpeGVzICMzMzE5MDUpLgorCSAgQWRkZWQgc29tZSBkb2NzLgorCSAgU29tZSBjbGVhbnVwcy4KKworMjAwNi0wMy0wMyAxNDozOTo1NSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZG9jcy9wbHVnaW5zLzogQWRkZWQgdmlkZW9iYWxhbmNlIGFuZCB2aWRlb2ZsaXAgdG8gdGhlIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgQWRkZWQgdmlkZW9iYWxhbmNlIGFuZCB2aWRlb2ZsaXAgdG8gdGhlIGRvY3MuCisJICAqIGdzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOgorCSAgKGdzdF92aWRlb19iYWxhbmNlX3VwZGF0ZV90YWJsZXNfcGxhbmFyNDExKSwKKwkgIChnc3RfdmlkZW9fYmFsYW5jZV9pc19wYXNzdGhyb3VnaCksCisJICAoZ3N0X3ZpZGVvX2JhbGFuY2VfdXBkYXRlX3Byb3BlcnRpZXMpLCAob2lsX3RhYmxlbG9va3VwX3U4KSwKKwkgIChnc3RfdmlkZW9fYmFsYW5jZV9wbGFuYXI0MTFfaXApLCAoZ3N0X3ZpZGVvX2JhbGFuY2Vfc2V0X2NhcHMpLAorCSAgKGdzdF92aWRlb19iYWxhbmNlX3RyYW5zZm9ybV9pcCksIChnc3RfdmlkZW9fYmFsYW5jZV9iYXNlX2luaXQpLAorCSAgKGdzdF92aWRlb19iYWxhbmNlX2ZpbmFsaXplKSwgKGdzdF92aWRlb19iYWxhbmNlX2NsYXNzX2luaXQpLAorCSAgKGdzdF92aWRlb19iYWxhbmNlX2luaXQpLCAoZ3N0X3ZpZGVvX2JhbGFuY2VfaW50ZXJmYWNlX3N1cHBvcnRlZCksCisJICAoZ3N0X3ZpZGVvX2JhbGFuY2VfaW50ZXJmYWNlX2luaXQpLAorCSAgKGdzdF92aWRlb19iYWxhbmNlX2NvbG9yYmFsYW5jZV9saXN0X2NoYW5uZWxzKSwKKwkgIChnc3RfdmlkZW9fYmFsYW5jZV9jb2xvcmJhbGFuY2Vfc2V0X3ZhbHVlKSwKKwkgIChnc3RfdmlkZW9fYmFsYW5jZV9jb2xvcmJhbGFuY2VfZ2V0X3ZhbHVlKSwKKwkgIChnc3RfdmlkZW9fYmFsYW5jZV9jb2xvcmJhbGFuY2VfaW5pdCksCisJICAoZ3N0X3ZpZGVvX2JhbGFuY2Vfc2V0X3Byb3BlcnR5KSwgKGdzdF92aWRlb19iYWxhbmNlX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3ZpZGVvX2JhbGFuY2VfZ2V0X3R5cGUpLCAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmg6CisJICBQb3J0ZWQgdG8gMC4xMC4gKEZpeGVzICMzMjYxNjApCisJICBBZGRlZCBkb2NzLgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmM6CisJICAqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaDoKKwkgIEFkZGVkIGRvY3MuCisKKzIwMDYtMDMtMDMgMTE6MDc6NDEgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogVXNlIEdTVF9XQVJOSU5HIGluc3RlYWQgb2YgR1NUX0VSUk9SIGZvciBhbGwgdGhlIHRvbyBzaG9ydC9sb25nIGF0b21zIHdoZW4gcGFyc2luZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBVc2UgR1NUX1dBUk5JTkcgaW5zdGVhZCBvZiBHU1RfRVJST1IgZm9yIGFsbCB0aGUgdG9vIHNob3J0L2xvbmcgYXRvbXMKKwkgIHdoZW4gcGFyc2luZy4KKwkgIEFsc28gbGV0J3MgYmUgYSBiaXQgbGVzcyB2dWxnYXIgaW4gb3VyIHdhcm5pbmcgbWVzc2FnZXMgOikKKworMjAwNi0wMy0wMiAxNToxNDoyMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBCdW1wIHJlcXVpcmVtZW50cyB0byBjdXJyZW50IGNvcmUgYW5kIC1iYXNlIENWUyAoY29yZSBmb3IgbmV3IHR5cGVmaW5kIGhlbHBlciBBUEksIGFuZCAtYmFzZSBmb3IgdGhlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQnVtcCByZXF1aXJlbWVudHMgdG8gY3VycmVudCBjb3JlIGFuZCAtYmFzZSBDVlMKKwkgIChjb3JlIGZvciBuZXcgdHlwZWZpbmQgaGVscGVyIEFQSSwgYW5kIC1iYXNlIGZvciB0aGUKKwkgIFdBVkZPUk1BVEVYIHN1cHBvcnQgdGhhdCB3YXMgYWRkZWQgdG8gbGliZ3N0cmlmZiBhbmQKKwkgIGlzIG5lZWRlZCBieSB3YXZwYXJzZSkuCisJICAqIGdzdC9hcGV0YWcvTWFrZWZpbGUuYW06CisJICAqIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzogKGdzdF90YWdfZGVtdXhfY2hhaW4pLAorCSAgKGdzdF90YWdfZGVtdXhfc2lua19hY3RpdmF0ZSk6CisJICBVc2UgbmV3IHR5cGVmaW5kIGhlbHBlcnMgZm9yIHR5cGVmaW5kaW5nIGluc3RlYWQgb2Ygb3VyCisJICBob21lLWdyb3duIHN0dWZmOyBhbHNvLCBkbyB0eXBlZmluZGluZyBpbiBwdWxsLW1vZGUgaWYKKwkgIHVwc3RyZWFtIHN1cHBvcnRzIHRoYXQuCisKKzIwMDYtMDItMjggMTE6NTk6NDkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogQ2FuJ3QgZGl2aWRlIHRocm91Z2ggemVybyAoc3VwcHJlc3Mgd2FybmluZyBpbiBjYXNlIG9mIHN0cmVhbSB3aXRoIG9uZSBzaW5nbGUgc3RpbGwgcGljdHVyZSkgKC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBDYW4ndCBkaXZpZGUgdGhyb3VnaCB6ZXJvIChzdXBwcmVzcyB3YXJuaW5nIGluIGNhc2Ugb2YKKwkgIHN0cmVhbSB3aXRoIG9uZSBzaW5nbGUgc3RpbGwgcGljdHVyZSkgKHNlZSAjMzI3MDgzKQorCisyMDA2LTAyLTI4IDEwOjQwOjAxICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkgIHJlbW92ZSBjb25mbGljdCBpbmRpY2F0b3IKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmVtb3ZlIGNvbmZsaWN0IGluZGljYXRvcgorCisyMDA2LTAyLTI4IDEwOjM5OjA4ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkgIGFkZCBtaXNzaW5nIGVudHJ5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCBtaXNzaW5nIGVudHJ5CisKKzIwMDYtMDItMjggMTA6Mjk6MTYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBVc2UgREVCVUdfT0JKRUNUIG1vcmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGVyZm9ybV9zZWVrKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKSwKKwkgIChnc3Rfd2F2cGFyc2VfcGFkX2NvbnZlcnQpLCAoZ3N0X3dhdnBhcnNlX3NyY3BhZF9ldmVudCksCisJICAoZ3N0X3dhdnBhcnNlX3NpbmtfYWN0aXZhdGUpLCAoZ3N0X3dhdnBhcnNlX3NpbmtfYWN0aXZhdGVfcHVsbCk6CisJICBVc2UgREVCVUdfT0JKRUNUIG1vcmUuCisKKzIwMDYtMDItMjggMTA6MjI6MTEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGRvY3MvcGx1Z2lucy86IEFkZGVkIGR2ZGVjIGFuZCBkdmRlbXV4IHRvIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICBBZGRlZCBkdmRlYyBhbmQgZHZkZW11eCB0byBkb2NzLgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19iYXNlX2luaXQpLCAoZ3N0X2R2ZGVjX2NoYWluKToKKwkgIEFkZGVkIGRvY3MuCisJICBDaGVjayBmcmFtZSBzaXplcyBzbyB3ZSBkb24ndCBjcmFzaCB3aGVuIGRvbid0IGhhdmUgZW5vdWdoCisJICBkYXRhLgorCSAgU2VuZCBuaWNlIGVycm9yIG1lc3NhZ2VzIG9uIGVycm9yLgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5jOiAoZ3N0X2R2ZGVtdXhfYmFzZV9pbml0KSwKKwkgIChnc3RfZHZkZW11eF9jbGFzc19pbml0KSwgKGdzdF9kdmRlbXV4X2luaXQpLAorCSAgKGdzdF9kdmRlbXV4X2ZpbmFsaXplKSwgKGdzdF9kdmRlbXV4X3Jlc2V0KSwKKwkgIChnc3RfZHZkZW11eF9zcmNfY29udmVydCksIChnc3RfZHZkZW11eF9zaW5rX2NvbnZlcnQpLAorCSAgKGdzdF9kdmRlbXV4X3NyY19xdWVyeSksIChnc3RfZHZkZW11eF9zaW5rX3F1ZXJ5KSwKKwkgIChnc3RfZHZkZW11eF9wdXNoX2V2ZW50KSwgKGdzdF9kdmRlbXV4X2hhbmRsZV9zaW5rX2V2ZW50KSwKKwkgIChnc3RfZHZkZW11eF9jb252ZXJ0X3NyY19wYWlyKSwgKGdzdF9kdmRlbXV4X2NvbnZlcnRfc2lua19wYWlyKSwKKwkgIChnc3RfZHZkZW11eF9jb252ZXJ0X3NyY190b19zaW5rKSwgKGdzdF9kdmRlbXV4X2hhbmRsZV9wdXNoX3NlZWspLAorCSAgKGdzdF9kdmRlbXV4X2RvX3NlZWspLCAoZ3N0X2R2ZGVtdXhfaGFuZGxlX3B1bGxfc2VlayksCisJICAoZ3N0X2R2ZGVtdXhfaGFuZGxlX3NyY19ldmVudCksIChnc3RfZHZkZW11eF9kZW11eF9hdWRpbyksCisJICAoZ3N0X2R2ZGVtdXhfZGVtdXhfdmlkZW8pLCAoZ3N0X2R2ZGVtdXhfZGVtdXhfZnJhbWUpLAorCSAgKGdzdF9kdmRlbXV4X2ZsdXNoKSwgKGdzdF9kdmRlbXV4X2NoYWluKSwgKGdzdF9kdmRlbXV4X2xvb3ApLAorCSAgKGdzdF9kdmRlbXV4X3NpbmtfYWN0aXZhdGVfcHVzaCksIChnc3RfZHZkZW11eF9zaW5rX2FjdGl2YXRlX3B1bGwpLAorCSAgKGdzdF9kdmRlbXV4X3NpbmtfYWN0aXZhdGUpLCAoZ3N0X2R2ZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguaDoKKwkgIEFkZGVkIGRvY3MuCisJICBJbXBsZW1lbnQgcHVsbCBtb2RlLgorCSAgRml4IG1lbWxlYWtzLgorCSAgUmVkdWNlIG1lbWNweSBmb3IgdGhlIHZpZGVvIGRlbXV4aW5nLgorCisyMDA2LTAyLTI4IDA5OjIxOjI3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZXh0L2Fubm9kZXgvOiBBZGQgYSBsaXR0bGUgZXh0cmEgZGVidWcuIE1ha2UgdGhlIGRlY29kZXIgbm90IHJldHVybiBOT1RfTElOS0VELCBhcyB3ZSB3YW50IHRvIGNvbnRpbnVlIGRlY29kaW5nIGFsbCBDLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOiAoZ3N0X2NtbWxfZGVjX3NpbmtfZXZlbnQpLAorCSAgKGdzdF9jbW1sX2RlY19uZXdfYnVmZmVyKSwgKGdzdF9jbW1sX2RlY19wYXJzZV9wcmVhbWJsZSksCisJICAoZ3N0X2NtbWxfZGVjX3BhcnNlX2hlYWQpLCAoZ3N0X2NtbWxfZGVjX3B1c2hfY2xpcCk6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxwYXJzZXIuYzogKGdzdF9jbW1sX3BhcnNlcl9wYXJzZV9jaHVuayk6CisJICBBZGQgYSBsaXR0bGUgZXh0cmEgZGVidWcuIE1ha2UgdGhlIGRlY29kZXIgbm90IHJldHVybiBOT1RfTElOS0VELAorCSAgYXMgd2Ugd2FudCB0byBjb250aW51ZSBkZWNvZGluZyBhbGwgQ01NTCBhbmQgZW1pdHRpbmcgdGFncy4KKworMjAwNi0wMi0yNyAxNDozNzoyOSArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBhZGQgYW5ub2RleCBwbHVnaW4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkIGFubm9kZXggcGx1Z2luCisKKzIwMDYtMDItMjcgMTQ6MDA6MTggKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZXh0L2Fubm9kZXgvZ3N0c2tlbHRhZy4qOiBEZWxldGVkOyB0aGVzZSBmaWxlcyBhcmVuJ3QgdXNlZCBhbnkgbW9yZSBlaXRoZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0c2tlbHRhZy5jOgorCSAgKiBleHQvYW5ub2RleC9nc3Rza2VsdGFnLmg6CisJICBEZWxldGVkOyB0aGVzZSBmaWxlcyBhcmVuJ3QgdXNlZCBhbnkgbW9yZSBlaXRoZXIuCisKKzIwMDYtMDItMjUgMjA6Mzc6MjkgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBleHQvTWFrZWZpbGUuYW06IEZpeCBkaXN0LWNoZWNrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAyLTI1ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGV4dC9NYWtlZmlsZS5hbTogRml4IGRpc3QtY2hlY2suCisKKzIwMDYtMDItMjUgMTk6MzY6MjQgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBleHQvYW5ub2RleC9nc3RjbW1sZW5jLmM6IEZpeCBhbm90aGVyIG1lbWxlYWsuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDItMjUgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOiAoZ3N0X2NtbWxfZW5jX3B1c2hfY2xpcCk6IEZpeCBhbm90aGVyCisJICBtZW1sZWFrLgorCisyMDA2LTAyLTI1IDE5OjA3OjQxICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgRml4IGEgbWVtbGVhayBpbiBnc3RfY21tbF90cmFja19saXN0X2FkZF9jbGlwLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAyLTI1ICBBbGVzc2FuZHJvIERlY2luYSA8YWxlc3NhbmRyb0BubnZhLm9yZz4KKwkgICogZXh0L2Fubm9kZXgvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hbm5vZGV4L2dzdGFubm9kZXguYzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sZW5jLmM6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxwYXJzZXIuYzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbHBhcnNlci5oOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sdXRpbHMuYzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGRlYy5jOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZW5jLmM6CisJICBGaXggYSBtZW1sZWFrIGluIGdzdF9jbW1sX3RyYWNrX2xpc3RfYWRkX2NsaXAuCisJICBIYW5kbGUgb3ZlcmZsb3dzIGluIGNsaXAncyBzdGFydCBhbmQgZW5kIHRpbWVzLgorCSAgQWRkIHRoZSAiZW5jb2RlZCIgcGFyYW1ldGVyIHRvIGNtbWxkZWMgYW5kIGNtbWxlbmMgY2Fwcy4KKwkgIERvIG5vdCBwYXJzZSBqdW5rIGF0IHRoZSBlbmQgb2YgYSBDTU1MIHByZWFtYmxlIGJ1ZmZlci4KKwkgIFJlZ2lzdGVyIGEgbGlieG1sIGVycm9yIGhhbmRsZXIgdG8gbm90IHByaW50IHN0dWZmIG9uIHN0ZGVyci4KKwkgIENoZWNrIGZvciBiYWQgY2xpcCBzdGFydCBhbmQgZW5kIHRpbWVzIGluIHRoZSB0ZXN0c3VpdGVzLgorCisyMDA2LTAyLTI1IDExOjM3OjEwICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZXh0L2Fubm9kZXgvOiBGaXggcG9zc2libGUgbWVtbGVha3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDItMjUgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOiAoZ3N0X2NtbWxfZGVjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9jbW1sX2RlY19maW5hbGl6ZSksIChnc3RfY21tbF9kZWNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5jOiAoZ3N0X2NtbWxfZW5jX2NsYXNzX2luaXQpLAorCSAgKGdzdF9jbW1sX2VuY19maW5hbGl6ZSksIChnc3RfY21tbF9lbmNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbHV0aWxzLmM6IChnc3RfY21tbF90cmFja19saXN0X2Rlc3Ryb3kpOiBGaXgKKwkgIHBvc3NpYmxlIG1lbWxlYWtzLgorCisyMDA2LTAyLTI0IDIzOjUyOjI4ICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgdGVzdHMvY2hlY2svOiBGaXggdGVzdHMgc28gdGhhdCB0aGV5IHVzZSB0aGUgcGx1Z2lucy1iYXNlIHRhZ3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDItMjUgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogdGVzdHMvY2hlY2svTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL2NtbWxkZWMuYzoKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGVuYy5jOiBGaXggdGVzdHMgc28gdGhhdCB0aGV5IHVzZQorCSAgdGhlIHBsdWdpbnMtYmFzZSB0YWdzLgorCisyMDA2LTAyLTI0IDIzOjM2OjU4ICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZXh0L01ha2VmaWxlLmFtOiBSZS1lbmFibGUgbW9kdWxlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAyLTI1ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGV4dC9NYWtlZmlsZS5hbTogUmUtZW5hYmxlIG1vZHVsZS4KKworMjAwNi0wMi0yNCAyMzozMjoxNCArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOiBGb3Jnb3QgdG8gcmVtb3ZlIHRoYXQgdGVzdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wMi0yNSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogRm9yZ290IHRvIHJlbW92ZSB0aGF0IHRlc3QuCisKKzIwMDYtMDItMjQgMjM6MzE6MDggKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBUcnkgdG8gZml4IEFubm9kZXggcGx1Z2luLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAyLTI1ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGV4dC9hbm5vZGV4L01ha2VmaWxlLmFtOgorCSAgKiBleHQvYW5ub2RleC9nc3Rhbm5vZGV4LmM6IChwbHVnaW5faW5pdCk6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxkZWMuYzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0c2tlbGRlYy5jOgorCSAgKiBleHQvYW5ub2RleC9nc3Rza2VsZGVjLmg6CisJICAqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9za2VsZGVjLmM6IFRyeSB0byBmaXggQW5ub2RleCBwbHVnaW4uCisKKzIwMDYtMDItMjQgMjM6MDY6MjcgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogRGlzYWJsZSB0aG9zZSBjaGVja3MgYXMgd2VsbC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wMi0yNSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbTogRGlzYWJsZSB0aG9zZSBjaGVja3MgYXMgd2VsbC4KKworMjAwNi0wMi0yNCAyMjo0OToyOSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGV4dC9NYWtlZmlsZS5hbTogRGlzYWJsZSBhbm5vZGV4IGZvciBub3cgdW50aWwgd2UgZmlndXJlIG91dCBob3cgdG8gbWFrZSBpdCBidWlsZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wMi0yNCAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBleHQvTWFrZWZpbGUuYW06IERpc2FibGUgYW5ub2RleCBmb3Igbm93IHVudGlsIHdlIGZpZ3VyZSBvdXQKKwkgIGhvdyB0byBtYWtlIGl0IGJ1aWxkLgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9NYWtlZmlsZS5hbTogTm90ZSBmb3IgVGhvbWFzIDoKKwkgIEFkZCBhIHJ1bGUgdG8geW91ciBjaGVja2xpc3QgOiAicGxlYXNlIHRyeSB0byBhdCBsZWFzdCBidWlsZAorCSAgd2hhdCB5b3UgYXJlIGdvaW5nIHRvIGNvbW1pdCBpbnRvIC1nb29kLCBvciBpZiB5b3UgYXJlIHRvbyBsYXp5CisJICB0byBkbyB0aGF0LCBwbGVhc2UgY2hlY2sgdGhhdCB0aGUgYnVpbGRib3RzIGFyZSBub3QgY3J5aW5nIGJlY2F1c2UKKwkgIG9mIHlvdXIgY29tbWl0LiIKKworMjAwNi0wMi0yNCAxOTo1MToyOSArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvZ2RrX3BpeGJ1Zi9NYWtlZmlsZS5hbToKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmg6CisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuaDoKKwkgIEknbSB0b28gbGF6eSB0byBjb21tZW50IHRoaXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgR2RrcGl4YnVmIHBvcnRlZCBmcm9tIDAuOCB0byAwLjEwIGJ5IFJlbmF0byBGaWxobyA8cmVuYXRvLmZpbGhvQGluZHQub3JnLmJyPi4gZ3N0X2xvYWRlciBhbmQgZ2RrcGl4YnVmYW5pbWF0aW9uIHN0aWxsIG5lZWQgcG9ydC4KKworMjAwNi0wMi0yNCAxOTo0OTozMiArMDAwMCAgRmFicml6aW8gR2VubmFyaSA8ZmFicml6aW8uZ2VAdGlzY2FsaS5pdD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgc3VwcG9ydCBmb3IgcGFsZXR0aXNlZCBBcHBsZSBTTUMgdmlkZW9zICgjMzI3MDc1LCBiYXNlZCBvbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pLAorCSAgKHF0ZGVtdXhfcGFyc2VfdHJhayksIChxdGRlbXV4X3ZpZGVvX2NhcHMpOgorCSAgQWRkIHN1cHBvcnQgZm9yIHBhbGV0dGlzZWQgQXBwbGUgU01DIHZpZGVvcyAoIzMyNzA3NSwgYmFzZWQgb24KKwkgIHBhdGNoIGJ5OiBGYWJyaXppbyBHZW5uYXJpIDxmYWJyaXppbyBkb3QgZ2UgYXQgdGlzY2FsaSBkb3QgaXQ+KS4KKworMjAwNi0wMi0yNCAxOTowNzoxMCArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBBZGQgQW5ub2RleCBlbGVtZW50cyBmcm9tIEFsZXNzZW5kcm8gRGVjaW5hOiBza2VsZXRvbiBhbmQgQ01NTC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBleHQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9hbm5vZGV4L01ha2VmaWxlLmFtOgorCSAgKiBleHQvYW5ub2RleC9nc3Rhbm5vZGV4LmM6CisJICAqIGV4dC9hbm5vZGV4L2dzdGFubm9kZXguaDoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGRlYy5jOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sZGVjLmg6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxlbmMuYzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbGVuYy5oOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1scGFyc2VyLmM6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWxwYXJzZXIuaDoKKwkgICogZXh0L2Fubm9kZXgvZ3N0Y21tbHRhZy5jOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sdGFnLmg6CisJICAqIGV4dC9hbm5vZGV4L2dzdGNtbWx1dGlscy5jOgorCSAgKiBleHQvYW5ub2RleC9nc3RjbW1sdXRpbHMuaDoKKwkgICogZXh0L2Fubm9kZXgvZ3N0c2tlbGRlYy5jOgorCSAgKiBleHQvYW5ub2RleC9nc3Rza2VsZGVjLmg6CisJICAqIGV4dC9hbm5vZGV4L2dzdHNrZWx0YWcuYzoKKwkgICogZXh0L2Fubm9kZXgvZ3N0c2tlbHRhZy5oOgorCSAgKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgICogdGVzdHMvY2hlY2svZWxlbWVudHMvY21tbGRlYy5jOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9jbW1sZW5jLmM6CisJICAqIHRlc3RzL2NoZWNrL2VsZW1lbnRzL3NrZWxkZWMuYzoKKwkgIEFkZCBBbm5vZGV4IGVsZW1lbnRzIGZyb20gQWxlc3NlbmRybyBEZWNpbmE6IHNrZWxldG9uIGFuZCBDTU1MLgorCSAgSW5jbHVkZXMgdGVzdHMgJiBkb2NzLCBvaCBteSEgUGFzc2VzIFRob21hcydzIC1nb29kIGNoZWNrbGlzdAorCSAgZW50aXJlbHkuIFdvdy4KKworMjAwNi0wMi0yNCAxNzowOTo1NiArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBhdXRvZ2VuLnNoOiBDaGVjayBmb3IgYXV0b21ha2UgMS45IGFzIHdlbGwuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogYXV0b2dlbi5zaDoKKwkgIENoZWNrIGZvciBhdXRvbWFrZSAxLjkgYXMgd2VsbC4KKworMjAwNi0wMi0yNCAxNDo0OTo0OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOiBDaGFuZ2UgbWluLiBzYW1wbGUgcmF0ZSB0byA4a0h6IHRvIG1hdGNoIGZsYWNkZWMncy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJICBDaGFuZ2UgbWluLiBzYW1wbGUgcmF0ZSB0byA4a0h6IHRvIG1hdGNoIGZsYWNkZWMncy4KKworMjAwNi0wMi0yMyAyMDowODo1OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2NkaW8vTWFrZWZpbGUuYW06IEFkZCBHU1RfQkFTRV9DRkxBR1MgYW5kIEdTVF9CQVNFX0xJQlMgKHNlZW1zIHRvIGJlIHJlcXVpcmVkIGZvciBDeWd3aW4sIHNlZSAjMzE3MDQ4KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9jZGlvL01ha2VmaWxlLmFtOgorCSAgQWRkIEdTVF9CQVNFX0NGTEFHUyBhbmQgR1NUX0JBU0VfTElCUyAoc2VlbXMgdG8gYmUKKwkgIHJlcXVpcmVkIGZvciBDeWd3aW4sIHNlZSAjMzE3MDQ4KQorCSAgKiBnc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jOgorCSAgQ3lnd2luIGhhcyBpbmNsdWRlcyBmb3IgYm90aCB0aGUgdW5peCBuZXR3b3JrIHNvY2tldCBBUEkKKwkgIGFuZCB0aGUgd2luZG93cyBBUEksIGJ1dCBvbmx5IG9uZSBjYW4gYmUgaW5jbHVkZWQsIHNvIGZpeAorCSAgaW5jbHVkZXMgdG8gb25seSB1c2Ugb25lIG9yIHRoZSBvdGhlciwgcHJlZmVyaW5nIHRoZSB1bnhpCisJICBvbmUgKCMzMTcwNDgpLgorCisyMDA2LTAyLTIzIDEyOjIxOjI1ICswMDAwICBQaGlsaXBwZSBLYWxhZiA8cGhpbGlwcGUua2FsYWZAY29sbGFib3JhLmNvLnVrPgorCisJICBydHAvZ3N0LzogU2VwYXJhdGVkIHRoZSBHNzExIHBheWxvYWRlcnMvZGVwYXlsb2FkZXJzIGludG8gc2VwYXJhdGUgZWxlbWVudHMgZm9yIG11bGF3L2FsYXcuIEFsc28gcmVtb3ZlZCB0aGUgb2xkIGc3MTEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wMi0yMyAgUGhpbGlwcGUgS2FsYWYgIDxwaGlsaXBwZS5rYWxhZiBhdCBjb2xsYWJvcmEuY28udWs+CisJICAqIHJ0cC9nc3QvZ3N0cnRwcGNtYWRlcGF5LmM6CisJICAqIHJ0cC9nc3QvZ3N0cnRwcGNtYWRlcGF5Lmg6CisJICAqIHJ0cC9nc3QvZ3N0Z3N0cnRwcGNtYXBheS5jOgorCSAgKiBydHAvZ3N0L2dzdGdzdHJ0cHBjbWFwYXkuaDoKKwkgICogcnRwL2dzdC9nc3RydHBwY211ZGVwYXkuYzoKKwkgICogcnRwL2dzdC9nc3RydHBwY211ZGVwYXkuaDoKKwkgICogcnRwL2dzdC9nc3RydHBwY211cGF5LmM6CisJICAqIHJ0cC9nc3QvZ3N0cnRwcGNtdXBheS5oOgorCSAgKiBydHAvZ3N0L01ha2VmaWxlLmFtOgorCSAgKiBydHAvZ3N0L2dzdHJ0cC5jOgorCSAgKiBydHAvZ3N0L1JFQURNRToKKwkgIFNlcGFyYXRlZCB0aGUgRzcxMSBwYXlsb2FkZXJzL2RlcGF5bG9hZGVycyBpbnRvIHNlcGFyYXRlIGVsZW1lbnRzIGZvcgorCSAgbXVsYXcvYWxhdy4gQWxzbyByZW1vdmVkIHRoZSBvbGQgZzcxMSBwYXlsb2FkZXJzL2RlcGF5bG9hZGVycy4KKworMjAwNi0wMi0yMiAyMDoyMjoyNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2R2LzogVWViZXIgc3BpZmZpZnkgc29tZSBtb3JlLCBhZGRlZCBkZWJ1ZyBjYXRlZ29yeS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19iYXNlX2luaXQpLCAoZ3N0X2R2ZGVjX2luaXQpLAorCSAgKGdzdF9kdmRlY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuaDoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2Jhc2VfaW5pdCksIChnc3RfZHZkZW11eF9pbml0KSwKKwkgIChnc3RfZHZkZW11eF9zcmNfY29udmVydCksIChnc3RfZHZkZW11eF9zaW5rX2NvbnZlcnQpLAorCSAgKGdzdF9kdmRlbXV4X3NyY19xdWVyeSksIChnc3RfZHZkZW11eF9zaW5rX3F1ZXJ5KSwKKwkgIChnc3RfZHZkZW11eF9oYW5kbGVfc2lua19ldmVudCksIChnc3RfZHZkZW11eF9kZW11eF9mcmFtZSksCisJICAoZ3N0X2R2ZGVtdXhfZmx1c2gpLCAoZ3N0X2R2ZGVtdXhfY2hhaW4pLAorCSAgKGdzdF9kdmRlbXV4X2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9kdi9nc3RkdmRlbXV4Lmg6CisJICBVZWJlciBzcGlmZmlmeSBzb21lIG1vcmUsIGFkZGVkIGRlYnVnIGNhdGVnb3J5LgorCSAgVXNlIF9zY2FsZS4KKwkgIFVzZSBzZWdtZW50cywgcmVzcGVjdCBwbGF5YmFjayByYXRlIGZyb20gbmV3c2VnbWVudC4KKwkgIEZpeCByZWZjb3VudCBpc3N1ZS4KKworMjAwNi0wMi0yMiAwOTozMzoyNSArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgJ2R2c2QnIGFuZCAnZHYyNScgdG8gbGlzdCBvZiBwb3NzaWJsZSBmb3VyY2MgdmFsdWVzIGZvciBEViBWaWRlby4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmV2aWV3ZWQgYnkgOiBFZHdhcmQgSGVydmV5IDxlZHdhcmRAZmx1ZW5kby5jb20+CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBBZGQgJ2R2c2QnIGFuZCAnZHYyNScgdG8gbGlzdCBvZiBwb3NzaWJsZSBmb3VyY2MgdmFsdWVzIGZvciBEViBWaWRlby4KKwkgIEFkZCBpbWFnZS9wbmcgZm9yIGZvdXJjYyAncG5nICcKKworMjAwNi0wMi0yMCAyMToxOTo1OSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIFBvcnQgeGltYWdlc3JjIHRvIDAuMTAgKENsb3NlcyAjMzA0Nzk1KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogc3lzL01ha2VmaWxlLmFtOgorCSAgKiBzeXMveGltYWdlc3JjL01ha2VmaWxlLmFtOgorCSAgKiBzeXMveGltYWdlc3JjL3hpbWFnZXNyYy5jOiAoZ3N0X3hpbWFnZXNyY19yZXR1cm5fYnVmKSwKKwkgIChnc3RfeGltYWdlc3JjX29wZW5fZGlzcGxheSksIChnc3RfeGltYWdlc3JjX3N0YXJ0KSwKKwkgIChnc3RfeGltYWdlc3JjX3N0b3ApLCAoZ3N0X3hpbWFnZXNyY191bmxvY2spLAorCSAgKGdzdF94aW1hZ2VzcmNfcmVjYWxjKSwgKGNvbXBvc2l0ZV9waXhlbCksCisJICAoZ3N0X3hpbWFnZXNyY194aW1hZ2VfZ2V0KSwgKGdzdF94aW1hZ2VzcmNfY3JlYXRlKSwKKwkgIChnc3RfeGltYWdlc3JjX3NldF9wcm9wZXJ0eSksIChnc3RfeGltYWdlc3JjX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3hpbWFnZXNyY19jbGVhcl9idWZwb29sKSwgKGdzdF94aW1hZ2VzcmNfYmFzZV9pbml0KSwKKwkgIChnc3RfeGltYWdlc3JjX2Rpc3Bvc2UpLCAoZ3N0X3hpbWFnZXNyY19maW5hbGl6ZSksCisJICAoZ3N0X3hpbWFnZXNyY19nZXRfY2FwcyksIChnc3RfeGltYWdlc3JjX3NldF9jYXBzKSwKKwkgIChnc3RfeGltYWdlc3JjX2ZpeGF0ZSksIChnc3RfeGltYWdlc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF94aW1hZ2VzcmNfaW5pdCksIChwbHVnaW5faW5pdCk6CisJICAqIHN5cy94aW1hZ2VzcmMveGltYWdlc3JjLmg6CisJICAqIHN5cy94aW1hZ2VzcmMveGltYWdldXRpbC5jOiAoeGltYWdldXRpbF9oYW5kbGVfeGVycm9yKSwKKwkgICh4aW1hZ2V1dGlsX2NoZWNrX3hzaG1fY2FsbHMpLCAoeGltYWdldXRpbF94Y29udGV4dF9nZXQpLAorCSAgKHhpbWFnZXV0aWxfeGNvbnRleHRfY2xlYXIpLAorCSAgKHhpbWFnZXV0aWxfY2FsY3VsYXRlX3BpeGVsX2FzcGVjdF9yYXRpbyksCisJICAoZ3N0X3hpbWFnZXNyY19idWZmZXJfZmluYWxpemUpLCAoZ3N0X3hpbWFnZV9idWZmZXJfZnJlZSksCisJICAoZ3N0X3hpbWFnZXNyY19idWZmZXJfaW5pdCksIChnc3RfeGltYWdlc3JjX2J1ZmZlcl9jbGFzc19pbml0KSwKKwkgIChnc3RfeGltYWdlc3JjX2J1ZmZlcl9nZXRfdHlwZSksIChnc3RfeGltYWdldXRpbF94aW1hZ2VfbmV3KSwKKwkgIChnc3RfeGltYWdldXRpbF94aW1hZ2VfZGVzdHJveSk6CisJICAqIHN5cy94aW1hZ2VzcmMveGltYWdldXRpbC5oOgorCSAgUG9ydCB4aW1hZ2VzcmMgdG8gMC4xMCAoQ2xvc2VzICMzMDQ3OTUpCisKKz09PSByZWxlYXNlIDAuMTAuMSA9PT0KKworMjAwNi0wMi0yMCAxOToxMjoxMCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogcmVsZWFzaW5nIDAuMTAuMSwgIlNsaW15IC0geWV0IHNhdGlzZnlpbmciCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDItMjAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCSAgKiBjb25maWd1cmUuYWM6CisJICByZWxlYXNpbmcgMC4xMC4xLCAiU2xpbXkgLSB5ZXQgc2F0aXNmeWluZyIKKworMjAwNi0wMi0yMCAxMzowODo1MCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmM6IEZpeCBjb21waWxhdGlvbiBvZiBMQURQU0EuIEl0IGRvZXNuJ3Qgc2VlbSB0byB3b3JrLCBhbmQgaXNuJ3QgZW5hYmxlZCBmb3IgdGhlIGJ1aWxkLC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmM6IChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9ldmVudCksCisJICAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfcHJvY2Vzcyk6CisJICBGaXggY29tcGlsYXRpb24gb2YgTEFEUFNBLiBJdCBkb2Vzbid0IHNlZW0gdG8gd29yaywgYW5kIGlzbid0CisJICBlbmFibGVkIGZvciB0aGUgYnVpbGQsIGJ1dCBpdCBoZWxwcyBtZSB3aW4gdGhlIGZlYXR1cmUtY291bnQKKwkgIGNvbXBldGl0aW9ucyBvb2ggeWVhaC4KKworMjAwNi0wMi0xOSAxNjowMjoyNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBVc2Ugc2NhbGluZyBjb2RlIGZvciBhZGRlZCBwcmVjaXNzaW9uIGFuZCBtb3JlIGNvcnJlY3Qgc3RvcCBwb3NpdGlvbiBpbiBjYXNlIHNjYWxlPT0wLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3JjX2NvbnZlcnQpLAorCSAgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLAorCSAgKGdzdF9hdmlfZGVtdXhfcGFyc2VfZmlsZV9oZWFkZXIpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5pdCksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9hdmloKSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3VwZXJpbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdWJpbmRleCksIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyKSwgKGdzdF9hdmlfZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgIFVzZSBzY2FsaW5nIGNvZGUgZm9yIGFkZGVkIHByZWNpc3Npb24gYW5kIG1vcmUgY29ycmVjdCBzdG9wCisJICBwb3NpdGlvbiBpbiBjYXNlIHNjYWxlPT0wLgorCisyMDA2LTAyLTE5IDEyOjA5OjE5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvZmx4L2dzdGZseGRlYy4qOiBJbXBsZW1lbnQgRFVSQVRJT04gcXVlcnkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ZseC9nc3RmbHhkZWMuYzogKGdzdF9mbHhkZWNfc3JjX3F1ZXJ5X2hhbmRsZXIpLAorCSAgKGdzdF9mbHhkZWNfY2hhaW4pOgorCSAgKiBnc3QvZmx4L2dzdGZseGRlYy5oOgorCSAgSW1wbGVtZW50IERVUkFUSU9OIHF1ZXJ5LgorCisyMDA2LTAyLTE5IDExOjU3OjU4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvZmx4LzogU2V0IE1BTExPQ0RBVEEgZm9yIHRoZSB0ZW1wIGJ1ZmZlcnMgc28gd2UgZG9uJ3QgbGVhay4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZmx4L2ZseF9jb2xvci5oOgorCSAgKiBnc3QvZmx4L2ZseF9mbXQuaDoKKwkgICogZ3N0L2ZseC9nc3RmbHhkZWMuYzogKGdzdF9mbHhkZWNfaW5pdCksCisJICAoZ3N0X2ZseGRlY19zcmNfcXVlcnlfaGFuZGxlciksIChmbHhfZGVjb2RlX2NvbG9yKSwKKwkgIChnc3RfZmx4ZGVjX2NoYWluKToKKwkgICogZ3N0L2ZseC9nc3RmbHhkZWMuaDoKKwkgIFNldCBNQUxMT0NEQVRBIGZvciB0aGUgdGVtcCBidWZmZXJzIHNvIHdlIGRvbid0IGxlYWsuCisJICBTb21lIGRlYnVnIGNsZWFudXBzLgorCSAgQ29uc3VtZSBhbGwgZGF0YSBpbiB0aGUgYWRhcHRlciBiZWZvcmUgbGVhdmluZyB0aGUgY2hhaW4KKwkgIGZ1bmN0aW9uLiBGaXhlcyAjMzMwNjc4LgorCisyMDA2LTAyLTE4IDIwOjQ4OjA5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4LzogSGFuZGxlIDAgZGF0YSBzaXplIGluIG90aGVyd2lzZSB2YWxpZCBmcmFtZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogKGlkM2RlbXV4X2lkM3YyX2ZyYW1lc190b190YWdfbGlzdCk6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAoaWQzdjJfZ2VucmVfZmllbGRzX3RvX3RhZ2xpc3QpOgorCSAgSGFuZGxlIDAgZGF0YSBzaXplIGluIG90aGVyd2lzZSB2YWxpZCBmcmFtZXMuCisJICBIYW5kbGUgbnVtZXJpYyBzdHJpbmdzIGluIDIuNC4wIGV2ZW4gd2hlbiBub3QgaW4gcGFyZW50aGVzZXMKKworMjAwNi0wMi0xOCAxNzoyMDo0OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thLzogUmVjb2duaXNlIFNTQS9BU1MgYW5kIFVTRiBzdWJ0aXRsZSBmb3JtYXRzIGFuZCBzZXQgcHJvcGVyIGNhcHMgd2hlbiB0aGV5IGFyZSBmb3VuZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfc3VidGl0bGVfY2FwcyksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BsdWdpbl9pbml0KToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgUmVjb2duaXNlIFNTQS9BU1MgYW5kIFVTRiBzdWJ0aXRsZSBmb3JtYXRzIGFuZAorCSAgc2V0IHByb3BlciBjYXBzIHdoZW4gdGhleSBhcmUgZm91bmQuCisKKzIwMDYtMDItMTcgMTg6MjU6NDIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogRG9uJ3QgR1NUX0xPRyB0aW1lc3RhbXBzIGZyb20gbm9uZXhpc3RlbnQgaW5kZXggZW50cmllcyAoIzMzMTU4MikuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9tb3ZpZSk6CisJICBEb24ndCBHU1RfTE9HIHRpbWVzdGFtcHMgZnJvbSBub25leGlzdGVudCBpbmRleAorCSAgZW50cmllcyAoIzMzMTU4MikuCisKKzIwMDYtMDItMTcgMTc6NTQ6MDUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogRml4IGludmFsaWQgbWVtb3J5IGFjY2VzcyBmb3Igc29tZSBvZGQtc2l6ZWQgaW1hZ2VzIChzZWUgaW1hZ2UgY29udGFpbmVkIGluIHF1aWNrdGltZSBzdHJlYW0gaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKGdzdF9qcGVnX2RlY19kZWNvZGVfZGlyZWN0KSwKKwkgIChnc3RfanBlZ19kZWNfY2hhaW4pOgorCSAgRml4IGludmFsaWQgbWVtb3J5IGFjY2VzcyBmb3Igc29tZSBvZGQtc2l6ZWQgaW1hZ2VzCisJICAoc2VlIGltYWdlIGNvbnRhaW5lZCBpbiBxdWlja3RpbWUgc3RyZWFtIGluICMzMjcwODMpOworCSAgdXNlIGdfbWFsbG9jKCkgaW5zdGVhZCBvZiBnX2FsbG9jYSgpLgorCisyMDA2LTAyLTE3IDE2OjI4OjI5ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IENoZWNrIHRoYXQgdGhlIHNpemUgb2YgdGhlIHJldHVybmVkIGJ1ZmZlciBpcyBvZiB0aGUgY29ycmVjdCBzaXplIGJlY2F1c2UgdGhlIHBhcnNlciBhc3N1bWVzIHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX3N0YXRlX2hlYWRlcik6CisJICBDaGVjayB0aGF0IHRoZSBzaXplIG9mIHRoZSByZXR1cm5lZCBidWZmZXIgaXMgb2YgdGhlIGNvcnJlY3Qgc2l6ZQorCSAgYmVjYXVzZSB0aGUgcGFyc2VyIGFzc3VtZXMgdGhhdC4KKwkgIEZpeGVzICMzMzE1NDMuCisKKzIwMDYtMDItMTcgMTU6Mzc6MzggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzogUGF0Y2ggZnJvbSBTZWJhc3RpZW4gQ290ZSwgZml4ZXMgIzMxOTg4NAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzogKGdzdF9ydHBfYW1yX2RlcGF5X2NoYWluKToKKwkgIFBhdGNoIGZyb20gU2ViYXN0aWVuIENvdGUsIGZpeGVzICMzMTk4ODQKKworMjAwNi0wMi0xNyAxMToxOTozNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2NkaW8vZ3N0Y2Rpby5jOiBJbml0IGRlYnVnIGNhdGVnb3J5ICgjMzMxMjUzKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Rpby9nc3RjZGlvLmM6IChwbHVnaW5faW5pdCk6CisJICBJbml0IGRlYnVnIGNhdGVnb3J5ICgjMzMxMjUzKS4KKworMjAwNi0wMi0xNyAxMDo1MzozOCArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBleHQvZ2NvbmYvZ2NvbmYuYzoKKwkqIGV4dC9nY29uZi9nY29uZi5oOgorCSogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmM6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NpbmsuaDoKKwkqIGdjb25mL2dzdHJlYW1lci5zY2hlbWFzLmluOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgYWRkIEp1cmcncyBwYXRjaCBmb3IgbXVsdGlkZXZpY2Ugc3VwcG9ydAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgSnVyZydzIHBhdGNoIGZvciBtdWx0aWRldmljZSBzdXBwb3J0CisKKzIwMDYtMDItMTYgMjA6MzA6MTMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBQYXNzIGV4dHJhX2RhdGEgdG8gZ3N0X3JpZmZfY3JlYXRlX2F1ZGlvX2NhcHMoKSwgc28gdGhhdAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKToKKwkgIFBhc3MgZXh0cmFfZGF0YSB0byBnc3RfcmlmZl9jcmVhdGVfYXVkaW9fY2FwcygpLCBzbyB0aGF0CisJICBXQVZFRk9STUFURVggc3R1ZmYgd29ya3MuIFBvc3QgYXVkaW8gY29kZWMgbmFtZSBhbmQgcG9zdAorCSAgaXQgYXMgdGFnbGlzdCBvbiB0aGUgYnVzLiBBbGxvdyB1cCB0byA4IGNoYW5uZXNsIGZvciByYXcKKwkgIFBDTSBpbiB0aGUgc291cmNlIHBhZCB0ZW1wbGF0ZSBjYXBzLgorCisyMDA2LTAyLTE2IDE2OjUzOjUyICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6IEFwcGxpZWQgIzMxODY2My4gR2l2ZXMgcXVpdGUgYSBmZXcgZmFsc2UgcG9zaXRpdmVzIGluIGF1dG9zY2FuIG1vZGUsIGJ1dCBpdCdzIGJldHRlciAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6IChnc3RfbXVsdGlwYXJ0X2RlbXV4X2Jhc2VfaW5pdCksCisJICAoZ3N0X211bHRpcGFydF9kZW11eF9jbGFzc19pbml0KSwgKGdzdF9tdWx0aXBhcnRfZGVtdXhfaW5pdCksCisJICAoZ3N0X211bHRpcGFydF9kZW11eF9maW5hbGl6ZSksIChnc3RfbXVsdGlwYXJ0X2ZpbmRfcGFkX2J5X21pbWUpLAorCSAgKGdzdF9tdWx0aXBhcnRfZGVtdXhfY2hhaW4pLCAoZ3N0X211bHRpcGFydF9kZW11eF9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9tdWx0aXBhcnRfc2V0X3Byb3BlcnR5KSwgKGdzdF9tdWx0aXBhcnRfZ2V0X3Byb3BlcnR5KToKKwkgIEFwcGxpZWQgIzMxODY2My4gR2l2ZXMgcXVpdGUgYSBmZXcgZmFsc2UgcG9zaXRpdmVzIGluCisJICBhdXRvc2NhbiBtb2RlLCBidXQgaXQncyBiZXR0ZXIgdGhhbiBub3RoaW5nLiBOb3QgY2xvc2luZyB5ZXQuCisKKzIwMDYtMDItMTYgMTQ6MTM6NDggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIFVwZGF0ZSBkb2N1bWVudGF0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwgKGdzdF91ZHBzcmNfaW5pdCksCisJICAoZ3N0X3VkcHNyY19zdGFydCk6CisJICBVcGRhdGUgZG9jdW1lbnRhdGlvbi4KKwkgIEZpeCBhcmdzLgorCisyMDA2LTAyLTE2IDE0OjAyOjU3ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IERvbid0IHN0b3AgdGhlIHRhc2sgaWYgdGhlIHBhZCBpc24ndCBsaW5rZWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19ldmVudCksCisJICAoZ3N0X3F0ZGVtdXhfbG9vcCksIChxdGRlbXV4X3NpbmtfYWN0aXZhdGVfcHVsbCk6CisJICBEb24ndCBzdG9wIHRoZSB0YXNrIGlmIHRoZSBwYWQgaXNuJ3QgbGlua2VkLgorCisyMDA2LTAyLTE2IDEwOjU4OjE4ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogSUQzIDIuMy4wIHVzZWQgc3luY2gtc2FmZSBpbnRlZ2VycyBmb3IgdGhlIHRhZyBzaXplLCBidXQgbm90IGZvciB0aGUgZnJhbWUgc2l6ZS4gKEZpeGVzICMzMzEzNjgpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogKGlkM2RlbXV4X2lkM3YyX2ZyYW1lc190b190YWdfbGlzdCk6CisJICBJRDMgMi4zLjAgdXNlZCBzeW5jaC1zYWZlIGludGVnZXJzIGZvciB0aGUgdGFnIHNpemUsIGJ1dCBub3QgZm9yIHRoZQorCSAgZnJhbWUgc2l6ZS4gKEZpeGVzICMzMzEzNjgpCisKKzIwMDYtMDItMTYgMTA6NDI6MjUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL1JFQURNRTogVXBkYXRlZCBSRUFETUUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvUkVBRE1FOgorCSAgVXBkYXRlZCBSRUFETUUuCisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX2dldF90eXBlKSwKKwkgIChnc3RfcnRzcHNyY19jbGFzc19pbml0KSwgKGdzdF9ydHNwc3JjX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0c3BzcmNfZ2V0X3Byb3BlcnR5KSwgKGdzdF9ydHNwc3JjX3N0cmVhbV9zZXR1cF9ydHApOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmg6CisJICBNYWtlIHN1cmUgdGhlIFJUUCBwb3J0IGlzIGFuIGV2ZW4gcG9ydCBhbiB0cnkgdG8gYWxsb2NhdGUKKwkgIGFub3RoZXIgaWYgbm90LgorCSAgQWRkZWQgcmV0cnkgcHJvcGVydHkgdG8gY29udHJvbCBtYXggcmV0cmllcyBmb3IgcG9ydCBhbGxvY2F0aW9uLgorCSAgTWFrZSBzdXJlIFJUQ1AgcG9ydCBpcyBSVFAgcG9ydCsxLgorCSAgQ2xlYW51cCB3aGVuIHBvcnQgYWxsb2NhdGlvbiBmYWlscy4KKwkgIEZpeGVzICMzMTkxODMuCisKKzIwMDYtMDItMTYgMDk6MTc6NTggKzAwMDAgIFdvdXRlciBQYWVzZW4gPHdvdXRlckBrYW5nYXJvb3QubmV0PgorCisJICBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogRG9uJ3QgaWdub3JlIHJldHVybiB2YWx1ZSBvZiB0aGUgcGFyZW50IGNsYXNzJ3Mgc3RhdGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogKGdzdF9hbHBoYV9jaGFuZ2Vfc3RhdGUpOgorCSAgRG9uJ3QgaWdub3JlIHJldHVybiB2YWx1ZSBvZiB0aGUgcGFyZW50IGNsYXNzJ3Mgc3RhdGUKKwkgIGNoYW5nZSBmdW5jdGlvbiAoIzMzMTM4NSwgcGF0Y2ggYnk6IFdvdXRlciBQYWVzZW4pLgorCisyMDA2LTAyLTE1IDEyOjE3OjI4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBBZGQgSEFMIHNvdW5kIGRldmljZSB3cmFwcGVyIHBsdWdpbnMuIENsb3NlcyAjMzI5MTA2CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGV4dC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2hhbC9NYWtlZmlsZS5hbToKKwkgICogZXh0L2hhbC9nc3RoYWxhdWRpb3NpbmsuYzogKGdzdF9oYWxfYXVkaW9fc2lua19iYXNlX2luaXQpLAorCSAgKGdzdF9oYWxfYXVkaW9fc2lua19jbGFzc19pbml0KSwgKGdzdF9oYWxfYXVkaW9fc2lua19yZXNldCksCisJICAoZ3N0X2hhbF9hdWRpb19zaW5rX2luaXQpLCAoZ3N0X2hhbF9hdWRpb19zaW5rX2Rpc3Bvc2UpLAorCSAgKGRvX3RvZ2dsZV9lbGVtZW50KSwgKGdzdF9oYWxfYXVkaW9fc2lua19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9oYWxfYXVkaW9fc2lua19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9oYWxfYXVkaW9fc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvaGFsL2dzdGhhbGF1ZGlvc2luay5oOgorCSAgKiBleHQvaGFsL2dzdGhhbGF1ZGlvc3JjLmM6IChnc3RfaGFsX2F1ZGlvX3NyY19iYXNlX2luaXQpLAorCSAgKGdzdF9oYWxfYXVkaW9fc3JjX2NsYXNzX2luaXQpLCAoZ3N0X2hhbF9hdWRpb19zcmNfcmVzZXQpLAorCSAgKGdzdF9oYWxfYXVkaW9fc3JjX2luaXQpLCAoZ3N0X2hhbF9hdWRpb19zcmNfZGlzcG9zZSksCisJICAoZG9fdG9nZ2xlX2VsZW1lbnQpLCAoZ3N0X2hhbF9hdWRpb19zcmNfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfaGFsX2F1ZGlvX3NyY19nZXRfcHJvcGVydHkpLCAoZ3N0X2hhbF9hdWRpb19zcmNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2hhbC9nc3RoYWxhdWRpb3NyYy5oOgorCSAgKiBleHQvaGFsL2dzdGhhbGVsZW1lbnRzLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGV4dC9oYWwvZ3N0aGFsZWxlbWVudHMuaDoKKwkgICogZXh0L2hhbC9oYWwuYzogKGdzdF9oYWxfZ2V0X3N0cmluZyksCisJICAoZ3N0X2hhbF9yZW5kZXJfYmluX2Zyb21fdWRpKSwgKGdzdF9oYWxfZ2V0X2F1ZGlvX3NpbmspLAorCSAgKGdzdF9oYWxfZ2V0X2F1ZGlvX3NyYyk6CisJICAqIGV4dC9oYWwvaGFsLmg6CisJICBBZGQgSEFMIHNvdW5kIGRldmljZSB3cmFwcGVyIHBsdWdpbnMuIENsb3NlcyAjMzI5MTA2CisKKzIwMDYtMDItMTUgMTI6MTM6NDcgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogSXQgYXBwZWFycyAxMDAlIGVxdWFscyAxLzEgYW5kIG5vdCAxMDAvMSAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9jaGFpbik6CisJICBJdCBhcHBlYXJzIDEwMCUgZXF1YWxzIDEvMSBhbmQgbm90IDEwMC8xIC4uLgorCisyMDA2LTAyLTE1IDEwOjE1OjQ3ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IEFkZCBjb21tZW50IGluIGEgZnVsdGlsZSBhdHRlbXB0IHRvIHN0b3AgdGhlIGNvcHktYW5kLXBhc3RlIHBhcmFkaWdtIGxlYWRpbmcgdG8gZHVwbGljYXRpb24gb2YuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpOgorCSAgQWRkIGNvbW1lbnQgaW4gYSBmdWx0aWxlIGF0dGVtcHQgdG8gc3RvcCB0aGUgY29weS1hbmQtcGFzdGUKKwkgIHBhcmFkaWdtIGxlYWRpbmcgdG8gZHVwbGljYXRpb24gb2YgYmFkIGNvZGUuCisJICAqIGdzdC9ydHNwL3J0c3B0cmFuc3BvcnQuYzogKHJ0c3BfdHJhbnNwb3J0X3BhcnNlKToKKwkgIE1pbWUgcGFyYW1ldGVycyBoYXZlIHRvIGJlIGNoZWNrZWQgY2FzZSBpbnNlbnNpdGl2ZQorCisyMDA2LTAyLTE1IDA5OjQ1OjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFdoZW4gYnVmZmVyaW5nIE1EQVQgZGF0YSwgc2hvdyB0aGUgdXNlciBzb21ldGhpbmcgaXMgaGFwcGVuaW5nIGJ5IHBvc3RpbmcgJ2J1ZmZlcmluZycgbWVzc2FnZXMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9wb3N0X2J1ZmZlcmluZyksCisJICAoZ3N0X3F0ZGVtdXhfY2hhaW4pOgorCSAgV2hlbiBidWZmZXJpbmcgTURBVCBkYXRhLCBzaG93IHRoZSB1c2VyIHNvbWV0aGluZyBpcworCSAgaGFwcGVuaW5nIGJ5IHBvc3RpbmcgJ2J1ZmZlcmluZycgbWVzc2FnZXMgb24gdGhlIGJ1cy4KKworMjAwNi0wMi0xNCAyMzoyMzowOCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IEFkdmFuY2Ugc3RyZWFtIHRpbWUgZm9yIGxhZ2dpbmcgc3VidGl0bGUgc3RyZWFtcyBieSBzZW5kaW5nIG5ld3NlZ21lbnQgZXZlbnRzIHdpdGggdGhlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfc3luY19zdHJlYW1zKToKKwkgIEFkdmFuY2Ugc3RyZWFtIHRpbWUgZm9yIGxhZ2dpbmcgc3VidGl0bGUgc3RyZWFtcyBieSBzZW5kaW5nCisJICBuZXdzZWdtZW50IGV2ZW50cyB3aXRoIHRoZSB1cGRhdGUgZmxhZyBzZXQuCisKKzIwMDYtMDItMTQgMTg6NTA6MTMgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguKjogTWFrZSBwdXNoLWJhc2VkIHdvcmsgaWYgbWRhdCBhdG9tIGlzIGJlZm9yZSBtb292IGF0b20uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfaW5pdCksCisJICAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChnc3RfcXRkZW11eF9jaGFuZ2Vfc3RhdGUpLAorCSAgKG5leHRfZW50cnlfc2l6ZSksIChnc3RfcXRkZW11eF9jaGFpbik6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguaDoKKwkgIE1ha2UgcHVzaC1iYXNlZCB3b3JrIGlmIG1kYXQgYXRvbSBpcyBiZWZvcmUgbW9vdiBhdG9tLgorCSAgRG9uJ3QgYW5zd2VyIGR1cmF0aW9uIHF1ZXJ5LiBUaGlzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBpbnRvIHJlcGx5aW5nCisJICBGQUxTRSB0byBzZWVrIGV2ZW50cy4KKworMjAwNi0wMi0xNCAxNjo1ODozMCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBUaGVyZSBjYW4gYmUgYm9ndXMgZGF0YSBiZWZvcmUgdGhlIGhkcmwgTElTVCB0YWcgaW4gdGhlIFJJRkYgaGVhZGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlcik6CisJICBUaGVyZSBjYW4gYmUgYm9ndXMgZGF0YSBiZWZvcmUgdGhlIGhkcmwgTElTVCB0YWcgaW4gdGhlIFJJRkYgaGVhZGVyLgorCSAgSXQncyBoYXJkIHRvIHNheSBpZiBpdCdzIG5vdCByZXNwZWN0aW5nIHRoZSBBVkkgc3BlY2lmaWNhdGlvbnMgb3Igbm90LAorCSAgYnV0IHNpbmNlIEdvb2dsZSBWaWRlbyBpcyBwcm9kdWNpbmcgQVZJcyBsaWtlIHRoYXQgYW5kIHRoZSBvdGhlciBwbGF5ZXIKKwkgIGRvbid0IHNlZW0gdG8gY29tcGxhaW4sIEkgZ3Vlc3Mgd2Ugc2hvdWxkIGRvIHRoZSBzYW1lLgorCisyMDA2LTAyLTE0IDExOjI0OjUzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBkYXRhIGF0b21zIGFyZSBiZWZvcmUgbW9vdiBhdG9tcyBpbiBwdXNoLWJhc2VkIG1vZGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAobmV4dF9lbnRyeV9zaXplKSwgKGdzdF9xdGRlbXV4X2NoYWluKToKKwkgIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBkYXRhIGF0b21zIGFyZSBiZWZvcmUgbW9vdiBhdG9tcyBpbiBwdXNoLWJhc2VkIG1vZGUuCisJICBFcnJvcnMgb3V0IGdyYWNlZnVsbHkuCisKKzIwMDYtMDItMTMgMjI6MDQ6NDIgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4LzogUXREZW11eCBjYW4gbm93IHdvcmsgcHVzaC1iYXNlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfaW5pdCksCisJICAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQpLCAoZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlKSwKKwkgIChleHRyYWN0X2luaXRpYWxfbGVuZ3RoX2FuZF9mb3VyY2MpLAorCSAgKGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfaGVhZGVyKSwgKGdzdF9xdGRlbXV4X2xvb3Bfc3RhdGVfbW92aWUpLAorCSAgKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwgKG5leHRfZW50cnlfc2l6ZSksIChnc3RfcXRkZW11eF9jaGFpbiksCisJICAocXRkZW11eF9zaW5rX2FjdGl2YXRlKSwgKHF0ZGVtdXhfc2lua19hY3RpdmF0ZV9wdWxsKSwKKwkgIChxdGRlbXV4X3NpbmtfYWN0aXZhdGVfcHVzaCksIChxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICBRdERlbXV4IGNhbiBub3cgd29yayBwdXNoLWJhc2VkLgorCSAgSXQgc3RpbGwgbmVlZHMgc29tZSBsb3ZlIGZvciBzZWVraW5nLgorCisyMDA2LTAyLTEzIDEyOjAwOjUxICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IEFkZCBtb3JlIHZhbGlkYXRpb24gdG8gZW5zdXJlIHRoYXQgYSBjaGFyIGVuY29kaW5nIGNvbnZlcnNpb24gcHJvZHVjZWQgYSB2YWxpZCBVVEYtOCBzdHJpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChwYXJzZV9pbnNlcnRfc3RyaW5nX2ZpZWxkKSwKKwkgIChwYXJzZV9zcGxpdF9zdHJpbmdzKToKKwkgIEFkZCBtb3JlIHZhbGlkYXRpb24gdG8gZW5zdXJlIHRoYXQgYSBjaGFyIGVuY29kaW5nIGNvbnZlcnNpb24KKwkgIHByb2R1Y2VkIGEgdmFsaWQgVVRGLTggc3RyaW5nLgorCisyMDA2LTAyLTEzIDEwOjQzOjE1ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IFByb3Blcmx5IGhhbmRsZSBlbmQgb2Ygc2VnbWVudC4gQ2xvc2VzICMzMzA4ODUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJldmlld2VkIGJ5OiBFZHdhcmQgSGVydmV5ICA8ZWR3YXJkQGZsdWVuZG8uY29tPgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSk6CisJICBQcm9wZXJseSBoYW5kbGUgZW5kIG9mIHNlZ21lbnQuIENsb3NlcyAjMzMwODg1LgorCisyMDA2LTAyLTEzIDEwOjM2OjIzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuaDogRm9yIGdvdCB0byBjb21taXQgdGhpcyBvbmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDRncGF5Lmg6CisJICBGb3IgZ290IHRvIGNvbW1pdCB0aGlzIG9uZS4KKworMjAwNi0wMi0xMiAxODo1OTozNiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDRncGF5Lio6IE1ha2UgbW9yZSB0aGluZ3Mgd29yay4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNGdwYXkuYzogKGdzdF9ydHBfbXA0Z19wYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9tcDRnX3BheV9pbml0KSwgKGdzdF9ydHBfbXA0Z19wYXlfcGFyc2VfYXVkaW9fY29uZmlnKSwKKwkgIChnc3RfcnRwX21wNGdfcGF5X3BhcnNlX3ZpZGVvX2NvbmZpZyksIChnc3RfcnRwX21wNGdfcGF5X25ld19jYXBzKSwKKwkgIChnc3RfcnRwX21wNGdfcGF5X3NldGNhcHMpLCAoZ3N0X3J0cF9tcDRnX3BheV9mbHVzaCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5oOgorCSAgTWFrZSBtb3JlIHRoaW5ncyB3b3JrLgorCSAgSGFuZGxlIEFDQyBjb25maWcgc3RyaW5ncy4KKworMjAwNi0wMi0xMiAxMzoxMDoyMCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6IHNldCB0aW1lc3RhbXBzIGlmIG5vIGluY29taW5nIHRpbWVzdGFtcHMgc2V0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzogKGdzdF9ydHBfYW1yX3BheV9oYW5kbGVfYnVmZmVyKToKKwkgIHNldCB0aW1lc3RhbXBzIGlmIG5vIGluY29taW5nIHRpbWVzdGFtcHMgc2V0CisKKzIwMDYtMDItMTEgMTM6NTQ6MjYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hcGV0YWcvZ3N0dGFnZGVtdXguYzogLi4uIGFuZCBmaXggdGhlIHZlcnkgc2FtZSBsZWFrcyBpbiBHc3RUYWdEZW11eC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXBldGFnL2dzdHRhZ2RlbXV4LmM6IChnc3RfdGFnX2RlbXV4X2dldF91cHN0cmVhbV9zaXplKSwKKwkgIChnc3RfdGFnX2RlbXV4X2RvX3R5cGVmaW5kKToKKwkgIC4uLiBhbmQgZml4IHRoZSB2ZXJ5IHNhbWUgbGVha3MgaW4gR3N0VGFnRGVtdXguCisKKzIwMDYtMDItMTEgMTM6MzU6MTMgKzAwMDAgIEpvbiBUcm93YnJpZGdlIDx0cm93QHhpbWlhbi5jb20+CisKKwkgIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoaWQzZGVtdXhfZ2V0X3Vwc3RyZWFtX3NpemUpLAorCSAgKGdzdF9pZDNkZW11eF9kb190eXBlZmluZCk6CisJICBGaXggYSBjb3VwbGUgb2YgbWVtIGxlYWtzLiAoUGF0Y2ggYnkgSm9uYXRoYW4gTWF0dGhldworCSAgPGpvbmF0aGFuIGF0IGthb2xpbiBkb3Qgd2g5IGRvdCBuZXQ+KQorCisyMDA2LTAyLTEwIDE3OjM3OjM5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzogRmlyc3Qgc2V0IG9wdGlvbnMsIHRoZW4gc2V0IGNhcHMgb3IgZWxzZSB0aGUgYmFzZWNsYXNzIHdpbGwgbm90IGtub3cgYWJvdXQgdGhlIG9wdGlvbnMsIGR1aC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzogKGdzdF9ydHBfbXA0dl9wYXlfc2V0Y2Fwcyk6CisJICBGaXJzdCBzZXQgb3B0aW9ucywgdGhlbiBzZXQgY2FwcyBvciBlbHNlIHRoZSBiYXNlY2xhc3MKKwkgIHdpbGwgbm90IGtub3cgYWJvdXQgdGhlIG9wdGlvbnMsIGR1aC4KKworMjAwNi0wMi0xMCAxNzoxNjo1NSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6IERvbid0IHdhc3RlIHRpbWUgbG9va2luZyBmb3IgYSBjb25maWcgc3RyaW5nIGlmIHdlIGhhdmUgY29kZWNfaW5mbyBvbiB0aGUgaW5jb21taW5nIGNhcHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6IChnc3RfcnRwX21wNHZfcGF5X2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBfbXA0dl9wYXlfc2V0Y2Fwcyk6CisJICBEb24ndCB3YXN0ZSB0aW1lIGxvb2tpbmcgZm9yIGEgY29uZmlnIHN0cmluZyBpZiB3ZSBoYXZlIGNvZGVjX2luZm8KKwkgIG9uIHRoZSBpbmNvbW1pbmcgY2Fwcy4KKworMjAwNi0wMi0xMCAxNjo0MDo1OCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9SRUFETUU6IFNheSBzb21ldGhpbmcgYWJvdXQgY2FzZS1zZW5zaXRpdml0eSBvZiBjYXBzIHZzIG1pbWUtYXR0cmlidXRlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL1JFQURNRToKKwkgIFNheSBzb21ldGhpbmcgYWJvdXQgY2FzZS1zZW5zaXRpdml0eSBvZiBjYXBzIHZzIG1pbWUtYXR0cmlidXRlcy4KKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzogKGdzdF9ydHBfYW1yX3BheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX2Ftcl9wYXlfaGFuZGxlX2J1ZmZlcik6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jOiAoZ3N0X3J0cF9tcDRnX3BheV9nZXRfdHlwZSksCisJICAoZ3N0X3J0cF9tcDRnX3BheV9iYXNlX2luaXQpLCAoZ3N0X3J0cF9tcDRnX3BheV9jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwX21wNGdfcGF5X2luaXQpLCAoZ3N0X3J0cF9tcDRnX3BheV9maW5hbGl6ZSksCisJICAoZ3N0X3J0cF9tcDRnX3BheV9uZXdfY2FwcyksIChnc3RfcnRwX21wNGdfcGF5X3NldGNhcHMpLAorCSAgKGdzdF9ydHBfbXA0Z19wYXlfZmx1c2gpLCAoZ3N0X3J0cF9tcDRnX3BheV9oYW5kbGVfYnVmZmVyKSwKKwkgIChnc3RfcnRwX21wNGdfcGF5X3NldF9wcm9wZXJ0eSksIChnc3RfcnRwX21wNGdfcGF5X2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cF9tcDRnX3BheV9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0Z3BheS5oOgorCSAgQWRkZWQgYmVnaW5uaW5ncyBvZiBtcGVnNC1nZW5lcmljIHBheWxvYWRlciAoUkZDIDM2NDApCisKKzIwMDYtMDItMDkgMTQ6MjA6MTQgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwLzogUmVzdXJlY3RlZCBydHBkZWMgdG8gbWFrZSBydHNwc3JjIGhhcHB5IGFnYWluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRzcC9nc3RydHBkZWMuYzogKGdzdF9ydHBkZWNfZ2V0X3R5cGUpLAorCSAgKGdzdF9ydHBkZWNfY2xhc3NfaW5pdCksIChnc3RfcnRwZGVjX2luaXQpLCAoZ3N0X3J0cGRlY19nZXRjYXBzKSwKKwkgIChnc3RfcnRwZGVjX2NoYWluX3J0cCksIChnc3RfcnRwZGVjX2NoYWluX3J0Y3ApLAorCSAgKGdzdF9ydHBkZWNfc2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBkZWNfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9ydHNwL2dzdHJ0cGRlYy5oOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KToKKwkgICogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uYzogKHJlYWRfYm9keSksCisJICAocnRzcF9jb25uZWN0aW9uX3JlY2VpdmUpOgorCSAgKiBnc3QvcnRzcC9ydHNwbWVzc2FnZS5jOiAocnRzcF9tZXNzYWdlX2R1bXApOgorCSAgUmVzdXJlY3RlZCBydHBkZWMgdG8gbWFrZSBydHNwc3JjIGhhcHB5IGFnYWluLgorCSAgU2tpcCBhdHRyaWJ1dGVzIGZyb20gdGhlIHNlc3Npb24gaWQuCisJICBEb24ndCBjcmFzaCB3aGVuIGR1bXBpbmcgYSBtZXNzYWdlIHdpdGggYW4gZW1wdHkgYm9keS4KKworMjAwNi0wMi0wOSAxNDoxNDowNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOiBBZGRlZCBtb3JlIG1lYW5pbmdmdWxsIHdhcm5pbmdzIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOiAoZ3N0X3J0cF9hbXJfZGVwYXlfY2hhaW4pOgorCSAgQWRkZWQgbW9yZSBtZWFuaW5nZnVsbCB3YXJuaW5ncyB3aGVuIHNvbWV0aGluZyBnb2VzIHdyb25nLgorCSAgQ2xlYXIgRiBiaXQgb24gb3V0Z29pbmcgQU1SIHBhY2tldHMuCisJICAqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6IChnc3RfcnRwX2Ftcl9wYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cF9hbXJfcGF5X2hhbmRsZV9idWZmZXIpOgorCSAgQWRkZWQgZGVidWdnaW5nIGNhdGVnb3J5CisJICBTdXBwb3J0IHBheWxvYWRpbmcgb2YgbXVsdGlwbGUgQU1SIGZyYW1lcy4KKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6IChnc3RfcnRwX21wNHZfcGF5X2RlcGF5X2RhdGEpOgorCSAgQWRkZWQgc29tZSBkZWJ1Z2dpbmcuCisKKzIwMDYtMDItMDkgMTE6MjU6NDIgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBjb25maWd1cmUuYWM6IEJhY2sgdG8gQ1ZTCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgQmFjayB0byBDVlMKKworPT09IHJlbGVhc2UgMC4xMC4yID09PQorCisyMDA2LTAyLTA5IDExOjIyOjM4ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXBldGFnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXBhcnNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdXRvZGV0ZWN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdmkueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Rpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkgIFJlbGVhc2luZyAwLjEwLjIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmVsZWFzaW5nIDAuMTAuMgorCisyMDA2LTAyLTA4IDE3OjM1OjA1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA2LTAyLTA4IDE3OjE4OjIwICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSAgT29wcywganVtcGluZyB0aGUgZ3VuIHdpdGggdGhlIENoYW5nZUxvZyBlbnRyeQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBPb3BzLCBqdW1waW5nIHRoZSBndW4gd2l0aCB0aGUgQ2hhbmdlTG9nIGVudHJ5CisKKzIwMDYtMDItMDggMTc6MTY6NDYgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBjb25maWd1cmUuYWM6IEJ1bXAgY29yZSBhbmQgcGx1Z2lucy1iYXNlIHJlcXVpcmVtZW50IHRvIDAuMTAuMi4yIGZvciBBUEkgYWRkaXRpb25zIChhbmQgMSBtaWdyYXRpb24gb2YgZ3N0X2Jpbl9maW5kX3UuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBCdW1wIGNvcmUgYW5kIHBsdWdpbnMtYmFzZSByZXF1aXJlbWVudCB0byAwLjEwLjIuMgorCSAgZm9yIEFQSSBhZGRpdGlvbnMgKGFuZCAxIG1pZ3JhdGlvbiBvZiBnc3RfYmluX2ZpbmRfdW5jb25uZWN0ZWRfcGFkKQorCisyMDA2LTAyLTA4IDE3OjEyOjQwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvOiBSZWdpc3RlciBtdXNpY2JyYWlueiB0YWdzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWMuYzogKHBsdWdpbl9pbml0KToKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4LmM6IChwbHVnaW5faW5pdCk6CisJICBSZWdpc3RlciBtdXNpY2JyYWlueiB0YWdzLgorCisyMDA2LTAyLTA3IDE4OjMxOjMxICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgcmVtb3ZlIHVudXNlZCB2YXIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmVtb3ZlIHVudXNlZCB2YXIKKworMjAwNi0wMi0wNyAxODowMToxNyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogdXNlIHRoZSBjb3JyZWN0IHZhcmlhYmxlIHRvIGNoZWNrIGlmIHdlIGNhbiBjYWxjdWxhdGUgdGhlIGxhc3QgY2h1bmsuICBMb29rcyBsaWtlIGFuIG9idmlvdXMgYi4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwKKwkgIChxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgdXNlIHRoZSBjb3JyZWN0IHZhcmlhYmxlIHRvIGNoZWNrIGlmIHdlIGNhbiBjYWxjdWxhdGUKKwkgIHRoZSBsYXN0IGNodW5rLiAgTG9va3MgbGlrZSBhbiBvYnZpb3VzIGJ1ZywgYW5kIG1ha2VzCisJICB0aGUgZHVtcCBvZiBvZmZzZXRzIGNvbXBhcmFibGUgdG8gb3RoZXIgdG9vbHMKKworMjAwNi0wMi0wNyAxNzo1NDo0MiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogY2xlYW4gdXAgc29tZSBkZWJ1Z2dpbmcsIHVzaW5nIF9PQkpFQ1QsIG1vdmluZyByZWN1cnJpbmcgbWVzc2FnZXMgdG8gTE9HIGxldmVsCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpLAorCSAgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBjbGVhbiB1cCBzb21lIGRlYnVnZ2luZywgdXNpbmcgX09CSkVDVCwgbW92aW5nIHJlY3VycmluZworCSAgbWVzc2FnZXMgdG8gTE9HIGxldmVsCisKKzIwMDYtMDItMDcgMTY6MjM6MzMgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9nY29uZi9nY29uZi5oOiBSZW1vdmUgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb24gdGhhdCBubyBsb25nZXIgZXhpc3RzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nY29uZi9nY29uZi5oOgorCSAgUmVtb3ZlIGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9uIHRoYXQgbm8gbG9uZ2VyIGV4aXN0cy4KKworMjAwNi0wMi0wNyAxMzozOTowOCArMDAwMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXNAbWVyYWxpLm9yZz4KKworCSAgZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzogTWFrZSBzaG91dDIgd29yayBmb3Igbm9uIG9nZyBzdHJlYW1zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDYtMDItMDcgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKwkgICogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzogKGdzdF9zaG91dDJzZW5kX3JlbmRlciksCisJICAoZ3N0X3Nob3V0MnNlbmRfc2V0Y2FwcyksIChnc3Rfc2hvdXQyc2VuZF9jaGFuZ2Vfc3RhdGUpOgorCSAgTWFrZSBzaG91dDIgd29yayBmb3Igbm9uIG9nZyBzdHJlYW1zCisKKzIwMDYtMDItMDYgMTc6MjY6NDMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLio6IFVwZGF0ZWQgZG9jcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19jbGFzc19pbml0KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX3JlbmRlciksIChnc3RfbXVsdGl1ZHBzaW5rX2dldF9wcm9wZXJ0eSksCisJICAoZ3N0X211bHRpdWRwc2lua19pbml0X3NlbmQpLCAoZ3N0X211bHRpdWRwc2lua19hZGQpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfcmVtb3ZlKSwgKGdzdF9tdWx0aXVkcHNpbmtfY2xlYXIpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3N0YXRzKSwgKGdzdF9tdWx0aXVkcHNpbmtfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkgIFVwZGF0ZWQgZG9jcy4KKwkgIEFkZGVkIHByb3BlcnRpZXMgYnl0ZXMtc2VydmVkLCBieXRlc190b19zZXJ2ZS4KKwkgIFBvc3QgcHJvcGVyIGVycm9yIG1lc3NhZ2VzLAorCSAgRW1pdCBjbGllbnQgYWRkZWQgc2lnbmFsIHRvby4KKworMjAwNi0wMi0wNiAxNTo0MToyNSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC4qOiBTb21lIFFUIGRlbXV4IGxvdmluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwKKwkgIChnc3RfcXRkZW11eF9oYW5kbGVfc3JjX2V2ZW50KSwgKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwKKwkgIChxdGRlbXV4X2luZmxhdGUpLCAocXRkZW11eF9wYXJzZSksIChxdGRlbXV4X3BhcnNlX3RyYWspLAorCSAgKHF0ZGVtdXhfcGFyc2VfdWR0YSksIChxdGRlbXV4X3RhZ19hZGRfc3RyKSwgKHF0ZGVtdXhfdGFnX2FkZF9udW0pLAorCSAgKHF0ZGVtdXhfdGFnX2FkZF9nbnJlKSwgKGdzdF9xdGRlbXV4X2hhbmRsZV9lc2RzKSwKKwkgIChxdGRlbXV4X3ZpZGVvX2NhcHMpLCAocXRkZW11eF9hdWRpb19jYXBzKToKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSAgU29tZSBRVCBkZW11eCBsb3ZpbmcuCisJICBIYW5kbGUgc2Vla2luZyBpbiBhIGxlc3MgYnJva2VuIHdheS4KKwkgIEZpeCBBTVIgY2FwcyB0byBtYXRjaCB0aGUgQU1SIGRlY29kZXIuCisJICBTZXQgZmlyc3QgdGltZXN0YW1wIG9uIEFNUiBzYW1wbGVzIHRvIDAgZm9yIG5vdy4KKwkgIFJlbW92ZSBzb21lIFxuIGluIERFQlVHIHN0cmluZ3MuCisJICBVc2UgX3NjYWxlX2ludCBmb3IgbWF4aW11bSBwcmVjaXNpb24uCisKKzIwMDYtMDItMDYgMTU6MzE6MTYgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb21tb246CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkgIGFkZGluZyBkb2NzIGZvciBtdWx0aXVkcHNpbmsKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkaW5nIGRvY3MgZm9yIG11bHRpdWRwc2luaworCisyMDA2LTAyLTA2IDE1OjI4OjU2ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgZ3N0L2xldmVsL2dzdGxldmVsLmM6IHBlYWsgYmVsb3cgZGVjYXkgaXMgbm90IG5lY2Vzc2FyaWx5IGFuIGVycm9yLCBzbyBkb24ndCBFUlJPUiBsb2cKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogKGdzdF9sZXZlbF90cmFuc2Zvcm1faXApOgorCSAgcGVhayBiZWxvdyBkZWNheSBpcyBub3QgbmVjZXNzYXJpbHkgYW4gZXJyb3IsIHNvIGRvbid0IEVSUk9SIGxvZworCisyMDA2LTAyLTA2IDE1OjI3OjA2ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhaXJvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpcGFydC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFyc2UueG1sOgorCSAgY3ZzIHZlcnNpb25zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGN2cyB2ZXJzaW9ucworCisyMDA2LTAyLTA2IDE0OjI1OjM0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS4qOiBNYWtlIHN1cmUgd2Ugc2VuZCBhIG5ld3NlZ21lbnQgZXZlbnQgaW4gQllURVMgZm9ybWF0IGJlZm9yZSBzZW5kaW5nIGJ1ZmZlcnMgKCMzMjg1MzEpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6IChnc3RfZWJtbF93cml0ZV9yZXNldCksCisJICAoZ3N0X2VibWxfd3JpdGVfZmx1c2hfY2FjaGUpLCAoZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9wdXNoKSwKKwkgIChnc3RfZWJtbF93cml0ZV9zZWVrKToKKwkgICogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuaDoKKwkgIE1ha2Ugc3VyZSB3ZSBzZW5kIGEgbmV3c2VnbWVudCBldmVudCBpbiBCWVRFUyBmb3JtYXQKKwkgIGJlZm9yZSBzZW5kaW5nIGJ1ZmZlcnMgKCMzMjg1MzEpLgorCisyMDA2LTAyLTA2IDEyOjE4OjQ1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBQYXNzIHVuaGFuZGxlZCBxdWVyaWVzIHVwc3RyZWFtIGluc3RlYWQgb2YganVzdCBkcm9wcGluZyB0aGVtICgjMzI2NDQ2KS4gVXBkYXRlIHF1ZXJ5IHR5cGUgYXJyYXlzIGhlcmUgYW5kIHRoZXJlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kdi9nc3RkdmRlbXV4LmM6IChnc3RfZHZkZW11eF9zcmNfcXVlcnkpLAorCSAgKGdzdF9kdmRlbXV4X3NpbmtfcXVlcnkpOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfc3JjX3F1ZXJ5KToKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IChzcGVleF9nZXRfcXVlcnlfdHlwZXMpLAorCSAgKHNwZWV4X2RlY19zcmNfcXVlcnkpOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleGVuY19zcmNfcXVlcnkpLAorCSAgKGdzdF9zcGVleGVuY19zaW5rX3F1ZXJ5KToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2dldF9zcmNfcXVlcnlfdHlwZXMpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KToKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfZ2V0X3F1ZXJ5X3R5cGVzKSwKKwkgIChnc3Rfd2F2cGFyc2VfcGFkX3F1ZXJ5KToKKwkgIFBhc3MgdW5oYW5kbGVkIHF1ZXJpZXMgdXBzdHJlYW0gaW5zdGVhZCBvZiBqdXN0IGRyb3BwaW5nCisJICB0aGVtICgjMzI2NDQ2KS4gVXBkYXRlIHF1ZXJ5IHR5cGUgYXJyYXlzIGhlcmUgYW5kIHRoZXJlLgorCisyMDA2LTAyLTA2IDExOjU3OjUyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOiBDb2xsZWN0cGFkcyBpbiBjb3JlIGdvdCBjaGFuZ2VkIGFuZCBub3cgYWxzbyBob2xkcyBhIHJlZmVyZW5jZSB0byBhbnkgcGFkIHRoYXQgaXMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOiAoc2V0dXBfc3JjX3BhZCk6CisJICBDb2xsZWN0cGFkcyBpbiBjb3JlIGdvdCBjaGFuZ2VkIGFuZCBub3cgYWxzbyBob2xkcyBhCisJICByZWZlcmVuY2UgdG8gYW55IHBhZCB0aGF0IGlzIHBhcnQgb2YgaXQuIEZpeCByZWZjb3VudAorCSAgY2hlY2tzIGluIHRlc3QgY2FzZSBhY2NvcmRpbmdseS4KKworMjAwNi0wMi0wNiAxMTo0MTo0MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5oOiBGaXggaW5jbHVkZSwgZm9yIG5vdyBHc3RUYWdEZW11eCBpcyBpbiB0aGUgYXBldGFnIGRpci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4Lmg6CisJICBGaXggaW5jbHVkZSwgZm9yIG5vdyBHc3RUYWdEZW11eCBpcyBpbiB0aGUgYXBldGFnIGRpci4KKworMjAwNi0wMi0wNiAxMTozNDoyMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogQWRkIGNkaW8gcGx1Z2luIHRvIGRvY3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jZGlvLnhtbDoKKwkgIEFkZCBjZGlvIHBsdWdpbiB0byBkb2NzLgorCSAgKiBleHQvY2Rpby9nc3RjZGlvY2RkYXNyYy5jOgorCSAgQWRkIGd0ay1kb2MgYmx1cmIuCisJICAqIGV4dC9jZGlvL2dzdGNkaW8uYzoKKwkgIFRoZSBwbHVnaW4gaXMgY2FsbGVkICdjZGlvJyBub3QgJ2NkZGlvJy4KKworMjAwNi0wMi0wNiAxMDo1NjowNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgQWRkIEFQRSB0YWcgZGVtdXhlciAoIzMyNTY0OSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sOgorCSAgKiBnc3QvYXBldGFnL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvYXBldGFnL2dzdGFwZWRlbXV4LmM6CisJICAqIGdzdC9hcGV0YWcvZ3N0YXBlZGVtdXguaDoKKwkgICogZ3N0L2FwZXRhZy9nc3R0YWdkZW11eC5jOgorCSAgKiBnc3QvYXBldGFnL2dzdHRhZ2RlbXV4Lmg6CisJICBBZGQgQVBFIHRhZyBkZW11eGVyICgjMzI1NjQ5KS4KKworMjAwNi0wMi0wNSAyMjoyMjo1NiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGV4dC9nY29uZi86IElnbm9yZSBjaGFuZ2luZyB0aGUgR0NvbmYga2V5IHRvICIiLiBJZ25vcmUgR0NvbmYga2V5IHVwZGF0ZXMgdGhhdCBkb24ndCBhY3R1YWxseSBjaGFuZ2UgdGhlIHN0cmluZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2NvbmYvZ2NvbmYuYzogKGdzdF9nY29uZl9nZXRfZGVmYXVsdF9hdWRpb19zaW5rKSwKKwkgIChnc3RfZ2NvbmZfZ2V0X2RlZmF1bHRfdmlkZW9fc2luayksCisJICAoZ3N0X2djb25mX2dldF9kZWZhdWx0X2F1ZGlvX3NyYyksCisJICAoZ3N0X2djb25mX2dldF9kZWZhdWx0X3ZpZGVvX3NyYyk6CisJICAqIGV4dC9nY29uZi9nY29uZi5oOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NpbmsuYzogKGdzdF9nY29uZl9hdWRpb19zaW5rX3Jlc2V0KSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc2lua19pbml0KSwgKGdzdF9nY29uZl9hdWRpb19zaW5rX2Rpc3Bvc2UpLAorCSAgKGRvX3RvZ2dsZV9lbGVtZW50KToKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmg6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc3JjLmM6IChnc3RfZ2NvbmZfYXVkaW9fc3JjX3Jlc2V0KSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc3JjX2luaXQpLCAoZ3N0X2djb25mX2F1ZGlvX3NyY19kaXNwb3NlKSwKKwkgIChkb190b2dnbGVfZWxlbWVudCk6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc3JjLmg6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5jOiAoZ3N0X2djb25mX3ZpZGVvX3NpbmtfcmVzZXQpLAorCSAgKGdzdF9nY29uZl92aWRlb19zaW5rX2luaXQpLCAoZ3N0X2djb25mX3ZpZGVvX3NpbmtfZGlzcG9zZSksCisJICAoZG9fdG9nZ2xlX2VsZW1lbnQpOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NpbmsuaDoKKwkgICogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zcmMuYzogKGdzdF9nY29uZl92aWRlb19zcmNfcmVzZXQpLAorCSAgKGdzdF9nY29uZl92aWRlb19zcmNfaW5pdCksIChnc3RfZ2NvbmZfdmlkZW9fc3JjX2Rpc3Bvc2UpLAorCSAgKGRvX3RvZ2dsZV9lbGVtZW50KToKKwkgICogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zcmMuaDoKKwkgIElnbm9yZSBjaGFuZ2luZyB0aGUgR0NvbmYga2V5IHRvICIiLiBJZ25vcmUgR0NvbmYga2V5IHVwZGF0ZXMKKwkgIHRoYXQgZG9uJ3QgYWN0dWFsbHkgY2hhbmdlIHRoZSBzdHJpbmcuCisJICBGb3Igbm93LCBpZ25vcmUgdGhlIEdDb25mIGtleSB3aGVuIHRoZSBzdGF0ZSBpcyA+IFJFQURZLCBhcworCSAgaXQgYnJlYWtzIHN0cmVhbWluZy4gU29tZXRpbWUgaXQgd2lsbCBiZSBuaWNlIHRvIGJyaW5nIHRoZQorCSAgbmV3IHNpbmsgb25saW5lIGV2ZW4gbWlkLXN0cmVhbSwgYnkgc2VuZGluZyBORVdTRUdNRU5UIGluZm8KKwkgIGFuZCBwb3NzaWJseSBwcmVyb2xsaW5nLgorCSAgKEZpeGVzICMzMjY3MzYpCisKKzIwMDYtMDItMDUgMjA6NDM6NDkgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvZ29vbS86IE1ha2UgZ29vbSByZWVudHJhbnQgYnkgbW92aW5nIGFsbCBpbXBvcnRhbnQgc3RhdGljIHZhcmlhYmxlcyBpbnRvIGluc3RhbmNlIHN0cnVjdHVyZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vZmlsdGVycy5jOiAoem9vbUZpbHRlck5ldyksIChjYWxjdWxhdGVQWGFuZFBZKSwKKwkgIChzZXRQaXhlbFJHQiksIChzZXRQaXhlbFJHQl8pLCAoZ2V0UGl4ZWxSR0IpLCAoZ2V0UGl4ZWxSR0JfKSwKKwkgICh6b29tRmlsdGVyU2V0UmVzb2x1dGlvbiksICh6b29tRmlsdGVyRGVzdHJveSksCisJICAoem9vbUZpbHRlckZhc3RSR0IpLCAocG9pbnRGaWx0ZXIpOgorCSAgKiBnc3QvZ29vbS9maWx0ZXJzLmg6CisJICAqIGdzdC9nb29tL2dvb21fY29yZS5jOiAoZ29vbV9pbml0KSwgKGdvb21fc2V0X3Jlc29sdXRpb24pLAorCSAgKGdvb21fdXBkYXRlKSwgKGdvb21fY2xvc2UpOgorCSAgKiBnc3QvZ29vbS9nb29tX2NvcmUuaDoKKwkgICogZ3N0L2dvb20vZ29vbV90b29scy5oOgorCSAgKiBnc3QvZ29vbS9ncmFwaGljLmM6CisJICAqIGdzdC9nb29tL2dzdGdvb20uYzogKGdzdF9nb29tX2NsYXNzX2luaXQpLCAoZ3N0X2dvb21faW5pdCksCisJICAoZ3N0X2dvb21fZGlzcG9zZSksIChnc3RfZ29vbV9zcmNfc2V0Y2FwcyksIChnc3RfZ29vbV9jaGFpbik6CisJICAqIGdzdC9nb29tL2dzdGdvb20uaDoKKwkgICogZ3N0L2dvb20vbGluZXMuYzogKGdvb21fbGluZXMpOgorCSAgKiBnc3QvZ29vbS9saW5lcy5oOgorCSAgTWFrZSBnb29tIHJlZW50cmFudCBieSBtb3ZpbmcgYWxsIGltcG9ydGFudCBzdGF0aWMgdmFyaWFibGVzCisJICBpbnRvIGluc3RhbmNlIHN0cnVjdHVyZXMuCisJICAoRml4ZXMgIzMyOTE4MSkKKworMjAwNi0wMi0wNCAxNTo0MTo0MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC4qOiBUaGlyZCBhdHRlbXB0LCB1c2UgZ3N0X3BhZF9pc19saW5rZWQoKSB0aGlzIHRpbWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0pLAorCSAgKGdzdF9hdmlfZGVtdXhfYWxsX3NvdXJjZV9wYWRzX3VubGlua2VkKSwKKwkgIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSk6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIFRoaXJkIGF0dGVtcHQsIHVzZSBnc3RfcGFkX2lzX2xpbmtlZCgpIHRoaXMgdGltZS4KKworMjAwNi0wMi0wNCAxMzozMDoxMiArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiBBZGp1c3QgZm9yIGRhdGEgbGVuZ3RoIGluZGljYXRvcnMgd2hlbiBwYXJzaW5nIChGaXhlcyAjMzI5ODEwKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAoaWQzZGVtdXhfaWQzdjJfcGFyc2VfZnJhbWUpLAorCSAgKHBhcnNlX3NwbGl0X3N0cmluZ3MpOgorCSAgQWRqdXN0IGZvciBkYXRhIGxlbmd0aCBpbmRpY2F0b3JzIHdoZW4gcGFyc2luZyAoRml4ZXMgIzMyOTgxMCkKKwkgIEZpeCBzdHVwaWQgYnVnIHBhcnNpbmcgVVRGLTggdGFnIHRleHQuCisJICBPdXRwdXQgdGFnIHN0cmluZ3Mgd2l0aCBtdWx0aXBsZSBmaWVsZHMgYXMgbXVsdGlwbGUgdGFncywgc28gdGhlCisJICBhcHAgZ2V0cyBhbGwgdGhlIGRhdGEuCisKKzIwMDYtMDItMDMgMjA6MDU6MjAgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogQ2hhbmdlTG9nOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgRml4ZWQgYSBidWcgYWRkIGluIGxhc3QgY29tbWl0LCB3aGVyZSBubyBldmVudCBpcyBzZW5kLiBUaGFua3MgVGltIHRvIHNob3cgbWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEZpeGVkIGEgYnVnIGFkZCBpbiBsYXN0IGNvbW1pdCwgd2hlcmUgbm8gZXZlbnQgaXMgc2VuZC4gVGhhbmtzIFRpbSB0byBzaG93IG1lLgorCisyMDA2LTAyLTAzIDE4OjA3OjM1ICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIENoYW5nZUxvZzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkgIEp1c3QgbWFrZSBpdCBjb21waWxlIHdpdGggLS1kaXNhYmxlLWdzdC1kZWJ1Zy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgSnVzdCBtYWtlIGl0IGNvbXBpbGUgd2l0aCAtLWRpc2FibGUtZ3N0LWRlYnVnLgorCisyMDA2LTAyLTAzIDE2OjU1OjQyICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIHVwZGF0ZSBzcGVjIGZpbGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdXBkYXRlIHNwZWMgZmlsZQorCisyMDA2LTAyLTAzIDEzOjA2OjI0ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IE5ldmVyIG91dHB1dCBhIHRhZyB3aXRoIGEgbnVsbCBjb250ZW50cyBzdHJpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChwYXJzZV90ZXh0X2lkZW50aWZpY2F0aW9uX2ZyYW1lKSwKKwkgIChpZDN2Ml90YWdfdG9fdGFnbGlzdCksIChpZDN2Ml9nZW5yZV9zdHJpbmdfdG9fdGFnbGlzdCksCisJICAoaWQzdjJfZ2VucmVfZmllbGRzX3RvX3RhZ2xpc3QpOgorCSAgTmV2ZXIgb3V0cHV0IGEgdGFnIHdpdGggYSBudWxsIGNvbnRlbnRzIHN0cmluZy4KKworMjAwNi0wMi0wMiAyMTowMDoxNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBPbmx5IHBhdXNlIGlmIGFsbCBwYWRzIGFyZSB1bmxpbmtlZCBBTkQgd2UndmUgdHJpZWQgdG8gc2VuZCBkYXRhIG9uIGFsbCBvZiB0aGVtIGF0IGxlYXN0IG9uY2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9hbGxfc291cmNlX3BhZHNfdW5saW5rZWQpOgorCSAgT25seSBwYXVzZSBpZiBhbGwgcGFkcyBhcmUgdW5saW5rZWQgQU5EIHdlJ3ZlIHRyaWVkIHRvIHNlbmQgZGF0YQorCSAgb24gYWxsIG9mIHRoZW0gYXQgbGVhc3Qgb25jZS4KKworMjAwNi0wMi0wMiAxMjoyOToyNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBNYWtlIGxvb3AgZnVuY3Rpb24vdGFzayBwYXVzZSBpdHNlbGYgd2hlbiBhbGwgc291cmNlIHBhZHMgYXJlIHVubGlua2VkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfYWxsX3NvdXJjZV9wYWRzX3VubGlua2VkKSwKKwkgIChnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSksIChnc3RfYXZpX2RlbXV4X2xvb3ApOgorCSAgTWFrZSBsb29wIGZ1bmN0aW9uL3Rhc2sgcGF1c2UgaXRzZWxmIHdoZW4gYWxsIHNvdXJjZSBwYWRzIGFyZQorCSAgdW5saW5rZWQuCisKKzIwMDYtMDItMDIgMTA6NDc6MTUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFVzZSBuZXcgZnVuY3Rpb25zIGZyb20gY29yZSB0byByZW5kZXIgYSBiaW4gZnJvbSBhIHN0cmluZy4gRml4ZXMgYnVpbGQuIFVwIHJlcXVpcmVtZW50cyB0byBjb3JlIENWUy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGV4dC9nY29uZi9nY29uZi5jOiAoZ3N0X2djb25mX3JlbmRlcl9iaW5fZnJvbV9rZXkpOgorCSAgVXNlIG5ldyBmdW5jdGlvbnMgZnJvbSBjb3JlIHRvIHJlbmRlciBhIGJpbiBmcm9tIGEKKwkgIHN0cmluZy4gRml4ZXMgYnVpbGQuIFVwIHJlcXVpcmVtZW50cyB0byBjb3JlIENWUy4KKworMjAwNi0wMi0wMSAxMTowMTowNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiBEb24ndCBwdXNoIGJ1ZmZlcnMgaW50byB0aGUgYWRhcHRlciB0aGF0IHdlIGFyZSBnb2luZyB0byBwdXNoIGRvd25zdHJlYW0gYWdhaW4gd2l0aG91dCBmcmFtLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiAoZ3N0X2F1X3BhcnNlX2NoYWluKToKKwkgIERvbid0IHB1c2ggYnVmZmVycyBpbnRvIHRoZSBhZGFwdGVyIHRoYXQgd2UgYXJlIGdvaW5nIHRvCisJICBwdXNoIGRvd25zdHJlYW0gYWdhaW4gd2l0aG91dCBmcmFtaW5nIGFueXdheS4gQWxzbywgdGhlCisJICBhZGFwdG9yIHRha2VzIG93bmVyc2hpcCBvZiBidWZmZXJzIHB1dCBpbnRvIGl0IChmaXhlcworCSAgYXVwYXJzZSBwdXNoaW5nIGludmFsaWQgYnVmZmVycyBmb3IgLmF1IGZpbGVzIHdpdGgKKwkgIEFEUENNIGNvbnRlbnRzKS4gRmluYWxseSwgc2V0IGNhcHMgb24gYWxsIG91dGdvaW5nIGJ1ZmZlcnMuCisKKzIwMDYtMDEtMzAgMjM6MTM6MDUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBnc3QvaWQzZGVtdXgvOiBTb21lb25lIHNob3VsZCBraWNrIG15IGJ1dHQuIFJlbW92ZSBJRDN2MSB0YWdzIGZyb20gdGhlIGVuZCBvZiB0aGUgZmlsZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYzogKGdzdF9pZDNkZW11eF9jaGFpbiksCisJICAoZ3N0X2lkM2RlbXV4X3JlYWRfaWQzdjEpLCAoZ3N0X2lkM2RlbXV4X3NpbmtfYWN0aXZhdGUpLAorCSAgKGdzdF9pZDNkZW11eF9zZW5kX3RhZ19ldmVudCk6CisJICAqIGdzdC9pZDNkZW11eC9pZDN0YWdzLmM6IChpZDNkZW11eF9yZWFkX2lkM3YxX3RhZyk6CisJICBTb21lb25lIHNob3VsZCBraWNrIG15IGJ1dHQuIFJlbW92ZSBJRDN2MSB0YWdzIGZyb20gdGhlIGVuZCBvZiB0aGUKKwkgIGZpbGUuCisJICBJbXByb3ZlIGVycm9yIG1lc3NhZ2VzLiBTZW5kIHRoZSBUQUcgbWVzc2FnZSBhcyBzb29uIGFzIHdlIGNvbXBsZXRlCisJICB0eXBlZmluZGluZywgaW5zdGVhZCBvZiB3YWl0aW5nIHVudGlsIHdlIHNlbmQgdGhlIGZpcnN0IGJ1ZmZlci4KKwkgIERvd25zdHJlYW0gdGFnIGV2ZW50IGlzIHN0aWxsIHNlbnQgYmVmb3JlIHRoZSBmaXJzdCBidWZmZXIuCisKKzIwMDYtMDEtMjkgMjA6MDc6NDkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogQWRkIGRlYnVnIGNhdGVnb3J5LCB1c2UgYm9pbGVycGxhdGUgbWFjcm9zLCBmaXggaGFuZGxpbmcgb2Ygd2lkdGhzIG9mIDMyIGJpdHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOiAoZ3N0X3dhdnBhY2tfZGVjX3NldGNhcHMpLAorCSAgKGdzdF93YXZwYWNrX2RlY19iYXNlX2luaXQpLCAoZ3N0X3dhdnBhY2tfZGVjX2Rpc3Bvc2UpLAorCSAgKGdzdF93YXZwYWNrX2RlY19jbGFzc19pbml0KSwgKGdzdF93YXZwYWNrX2RlY19zaW5rX2V2ZW50KSwKKwkgIChnc3Rfd2F2cGFja19kZWNfaW5pdCksIChnc3Rfd2F2cGFja19kZWNfZm9ybWF0X3NhbXBsZXMpLAorCSAgKGdzdF93YXZwYWNrX2RlY19jaGFpbiksIChnc3Rfd2F2cGFja19kZWNfcGx1Z2luX2luaXQpOgorCSAgQWRkIGRlYnVnIGNhdGVnb3J5LCB1c2UgYm9pbGVycGxhdGUgbWFjcm9zLCBmaXggaGFuZGxpbmcKKwkgIG9mIHdpZHRocyBvZiAzMiBiaXRzLgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrcGFyc2UuYzogKGdzdF93YXZwYWNrX3BhcnNlX2Jhc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfZGlzcG9zZSksIChnc3Rfd2F2cGFja19wYXJzZV9jbGFzc19pbml0KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9pbmRleF9nZXRfbGFzdF9lbnRyeSksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfaW5kZXhfZ2V0X2VudHJ5X2Zyb21fc2FtcGxlKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9pbmRleF9hcHBlbmRfZW50cnkpLCAoZ3N0X3dhdnBhY2tfcGFyc2VfcmVzZXQpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX3NyY19xdWVyeSksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2Vfc2Nhbl90b19maW5kX3NhbXBsZSksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2Vfc2VuZF9uZXdzZWdtZW50KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9oYW5kbGVfc2Vla19ldmVudCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2Vfc3JjX2V2ZW50KSwgKGdzdF93YXZwYWNrX3BhcnNlX2luaXQpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2dldF91cHN0cmVhbV9sZW5ndGgpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX3B1bGxfYnVmZmVyKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9jcmVhdGVfc3JjX3BhZCksIChnc3Rfd2F2cGFja19wYXJzZV9sb29wKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF93YXZlcGFja19wYXJzZV9zaW5rX2FjdGl2YXRlKSwKKwkgIChnc3Rfd2F2ZXBhY2tfcGFyc2Vfc2lua19hY3RpdmF0ZV9wdWxsKSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9wbHVnaW5faW5pdCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5oOgorCSAgUmV3cml0ZSBhIGJpdCwgbW9zdGx5IHRvIGZpeCBmbG93IGxvZ2ljIGFuZCB0byBtYWtlIHNlZWtpbmcgd29yay4KKwkgIEZpeCBidWZmZXIvZXZlbnQgcmVmY291bnRpbmcuIEFkZCBzb21lIGRlYnVnIHN0YXRlbWVudHMuIEFkZAorCSAgd2lkdGggb2YgMzIgdG8gc291cmNlIHBhZCB0ZW1wbGF0ZSBjYXBzLiBVc2UgYm9pbGVycGxhdGUgbWFjcm9zLgorCisyMDA2LTAxLTI3IDEyOjE3OjU2ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIGV4dC9kdi86IENhbGwgZHZfc2V0X2Vycm9yX2xvZyAoZHZfZGVjb2Rlcl90ICosIE5VTEwpOyBhZnRlciBkdl9kZWNvZGVyX25ldyB0byBub3QgaGF2ZSB3YXJpbmdzIGZsb29kaW5nIHN0ZGVyci4gdGhpcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAxLTI3ICBKYW4gR2VyYmVyICA8akBib290bGFiLm9yZz4KKwkgIFJldmlld2VkIGJ5OiBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIGV4dC9kdi9nc3RkdmRlYy5jIChnc3RfZHZkZWNfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYyAoZ3N0X2R2ZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgIENhbGwgZHZfc2V0X2Vycm9yX2xvZyAoZHZfZGVjb2Rlcl90ICosIE5VTEwpOyBhZnRlciBkdl9kZWNvZGVyX25ldworCSAgdG8gbm90IGhhdmUgd2FyaW5ncyBmbG9vZGluZyBzdGRlcnIuIHRoaXMgaXMgdGhlIHN1Z2dlc3RlZCB3YXkKKwkgIGFsc28gdXNlZCBpbiBkdmdyYWIgYW5kIGtpbm8uICgjMzI4MzM2KQorCisyMDA2LTAxLTI3IDAxOjQzOjA3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgc3lzL29zcy9nc3Rvc3NzaW5rLmM6IEZyZWUgdGhlIGRldmljZSBuYW1lIHN0cmluZyB3aGVuIGZpbmFsaXNlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3Nfc2lua19jbGFzc19pbml0KSwKKwkgIChnc3Rfb3NzX3NpbmtfaW5pdCksIChnc3Rfb3NzX3NpbmtfZmluYWxpc2UpOgorCSAgRnJlZSB0aGUgZGV2aWNlIG5hbWUgc3RyaW5nIHdoZW4gZmluYWxpc2VkLgorCisyMDA2LTAxLTI2IDE2OjIzOjQyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IEZpeCB3cm9uZyBtZW1jcHkgc291cmNlIHBvaW50ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIEZpeCB3cm9uZyBtZW1jcHkgc291cmNlIHBvaW50ZXIuCisKKzIwMDYtMDEtMjUgMjI6MDU6MjggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiBEb24ndCBwdXQgZnVuY3Rpb24gY2FsbHMgaW4gZ19yZXR1cm5faWZfZmFpbCgpIHN0YXRlbWVudHMsIG9yIHRoZXknbGwgYmUgcmVwbGFjZWQgd2l0aCBOTy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoZ3N0X2lkM2RlbXV4X3JlbW92ZV9zcmNwYWQpOgorCSAgRG9uJ3QgcHV0IGZ1bmN0aW9uIGNhbGxzIGluIGdfcmV0dXJuX2lmX2ZhaWwoKSBzdGF0ZW1lbnRzLAorCSAgb3IgdGhleSdsbCBiZSByZXBsYWNlZCB3aXRoIE5PT1BzIGlmIHNvbWVvbmUgY29tcGlsZXMgd2l0aAorCSAgR19ESVNBQkxFX0NIRUNLUyBkZWZpbmVkLgorCisyMDA2LTAxLTI1IDIwOjMzOjA1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSAgY2hhbmdlbG9nIHN1cmdlcnkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgY2hhbmdlbG9nIHN1cmdlcnkKKworMjAwNi0wMS0yNSAxODoyMzowNSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiBOZXZlciB0cnVzdCBBTlkgaW5mb3JtYXRpb24gZW5jb2RlZCBpbiBhIG1lZGlhIGZpbGUsIGVzcGVjaWFsbHkgd2hlbiBpdCdzIGdpdmluZyB5b3Ugc2l6ZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAoaWQzZGVtdXhfaWQzdjJfcGFyc2VfZnJhbWUpOgorCSAgTmV2ZXIgdHJ1c3QgQU5ZIGluZm9ybWF0aW9uIGVuY29kZWQgaW4gYSBtZWRpYSBmaWxlLCBlc3BlY2lhbGx5CisJICB3aGVuIGl0J3MgZ2l2aW5nIHlvdSBzaXplcy4gKEZpeGVzICMzMjg0NTIpCisKKzIwMDYtMDEtMjQgMTg6MDM6NDYgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L3J0cC9nc3RydHBnNzExcGF5LmM6CisJICBJJ20gdG9vIGxhenkgdG8gY29tbWVudCB0aGlzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBhdGNoIHdyaXR0ZW4gYnkgS2FpIFZlaG1hbmVuIDxrYWkudmVobWFuZW5Abm9raWEuY29tPiBhcHBsaWVkLiBTZWUgYnVnICMzMjUxNDguCisKKzIwMDYtMDEtMjQgMTE6NTg6NTMgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogTW9yZSBjb2hlcmVudCBmcmFtZXJhdGUgc2V0dGluZyBvbiBjYXBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwKKwkgIChnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBNb3JlIGNvaGVyZW50IGZyYW1lcmF0ZSBzZXR0aW5nIG9uIGNhcHMuCisJICBJZiBzYW1wbGVfc2l6ZSBpcyBhdmFpbGFibGUsIHVzZSB0aGF0IGZvciB0aGUgc2FtcGxlcycgZHVyYXRpb24gaW4KKwkgIHRoZSBpbmRleC4gVGhpcyBlbmFibGVzIHNpbmdsZSBmcmFtZSBzdHJlYW1zIHRvIHdvcmsgKGFuZCBJIGltYWdpbmUKKwkgIGZpeGVzIHNvbWUgb3RoZXIgY2FzZXMpLgorCSAgVGVzdGVkIG9uIHRlc3RzdWl0ZSwgbm8gcmVncmVzc2lvbi4KKworMjAwNi0wMS0yMyAxODozOTozMSArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L21hdHJvc2thLzogQWRkZWQgcmVjb2duaXRpb24gb2YgUmVhbCBBdWRpbyBhbmQgVmlkZW8gc3RyZWFtcyBpbiBtYXRyb3NrYSBkZW11eGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3ZpZGVvX2NhcHMpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9hdWRpb19jYXBzKSwgKGdzdF9tYXRyb3NrYV9kZW11eF9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkgIEFkZGVkIHJlY29nbml0aW9uIG9mIFJlYWwgQXVkaW8gYW5kIFZpZGVvIHN0cmVhbXMgaW4gbWF0cm9za2EgZGVtdXhlci4KKworMjAwNi0wMS0yMyAxNToxMDo1NSArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGRlZCBjb2RlYyByZWNvZ25pdGlvbiBmb3I6IF8gVlAzMSA6IHZpZGVvL3gtdnAzIF8gQVZESiA6IGltYWdlL2pwZWcgXyBkdmNwLCBkdmMgIDogdmlkZW8veC1kLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKSwKKwkgIChxdGRlbXV4X3ZpZGVvX2NhcHMpLCAocXRkZW11eF9hdWRpb19jYXBzKToKKwkgIEFkZGVkIGNvZGVjIHJlY29nbml0aW9uIGZvcjoKKwkgIF8gVlAzMSA6IHZpZGVvL3gtdnAzCisJICBfIEFWREogOiBpbWFnZS9qcGVnCisJICBfIGR2Y3AsIGR2YyAgOiB2aWRlby94LWR2LCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2UKKwkgIF8gMHg2ZDczMDAxNyA6IGF1ZGlvL3gtYWRwY20sIGxheW91dD0oc3RyaW5nKXF1aWNrdGltZQorCisyMDA2LTAxLTIzIDE0OjMyOjQ3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IFJlbW92ZSBlcnJhbnQgYnJlYWsgc3RhdGVtZW50LCBhbmQgZml4IGNvbXBpbGF0aW9uIHdpdGggb2xkZXIgR0NDLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2MmZyYW1lcy5jOiAoaWQzdjJfdGFnX3RvX3RhZ2xpc3QpOgorCSAgUmVtb3ZlIGVycmFudCBicmVhayBzdGF0ZW1lbnQsIGFuZCBmaXggY29tcGlsYXRpb24gd2l0aAorCSAgb2xkZXIgR0NDLgorCisyMDA2LTAxLTIzIDEyOjA0OjEyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSAgTWVudGlvbiB0aGF0IG15IGxhc3QgY29tbWl0IGZpeGVzICMzMjgyNDEKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgTWVudGlvbiB0aGF0IG15IGxhc3QgY29tbWl0IGZpeGVzICMzMjgyNDEKKworMjAwNi0wMS0yMyAxMTowNjozNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL3N1bmF1ZGlvLzogRXhwb3J0IGZ1bmN0aW9ucyB0aGF0IGFyZSBuZWVkZWQgaW4gb3RoZXIgcGFydHMgb2YgdGhlIGNvZGUsIG1ha2VzIHRoZSBtaXhlciBhY3R1YWxseSB3b3JrOyBhZGp1c3QgbWFnLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisJICAqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyY3RybC5jOgorCSAgKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9zaW5rLmM6IChnc3Rfc3VuYXVkaW9zaW5rX2luaXQpOgorCSAgRXhwb3J0IGZ1bmN0aW9ucyB0aGF0IGFyZSBuZWVkZWQgaW4gb3RoZXIgcGFydHMgb2YgdGhlIGNvZGUsCisJICBtYWtlcyB0aGUgbWl4ZXIgYWN0dWFsbHkgd29yazsgYWRqdXN0IG1hZ2ljIG1pbmltdW0gYnVmZmVyLXRpbWUKKwkgIHZhbHVlIGZyb20gM21zIHRvIDVtcyB0byB3b3JrIGFyb3VuZCBzdHV0dGVyaW5nIGR1cmluZyBtcDMKKwkgIHBsYXliYWNrICgjMzI3NzY1KS4KKworMjAwNi0wMS0yMyAxMDo0NDowMyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBGaXggcG9zc2libGUgZGVhZGxvY2sgaW4gbWF0cm9za2EgbXV4ZXIgKCMzMjc4MjUpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBSZXZpZXdlZCBieTogVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X2Jlc3RfcGFkKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3dyaXRlX2RhdGEpLCAoZ3N0X21hdHJvc2thX211eF9jb2xsZWN0ZWQpOgorCSAgRml4IHBvc3NpYmxlIGRlYWRsb2NrIGluIG1hdHJvc2thIG11eGVyICgjMzI3ODI1KS4KKworMjAwNi0wMS0yMyAwOTo1OTowMyArMDAwMCAgSmVucyBHcmFuc2V1ZXIgPGplbnNnckBnbXgubmV0PgorCisJICBDODkgZml4ZXM6IGRlY2xhcmUgdmFyaWFibGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBibG9jayBhbmQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiAoZ3N0X3BuZ2VuY19jaGFpbik6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaW52ZXJ0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzogKGdzdF9ydHBfbXA0dl9kZXBheV9zZXRjYXBzKToKKwkgICogZ3N0L3J0c3Avc2RwbWVzc2FnZS5oOgorCSAgKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzogKGdzdF9keW51ZHBzaW5rX3JlbmRlcik6CisJICAqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChnc3RfbXVsdGl1ZHBzaW5rX2dldF9zdGF0cyk6CisJICBDODkgZml4ZXM6IGRlY2xhcmUgdmFyaWFibGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBibG9jayBhbmQKKwkgIG1ha2UgZ2NjLTIuOXggaGFwcHkgKCMzMjgyNjQ7IHBhdGNoIGJ5OiBKZW5zIEdyYW5zZXVlcgorCSAgPGplbnNnciBhdCBnbXggZG90IG5ldD4pLgorCisyMDA2LTAxLTIzIDA5OjIyOjE3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4LzogUmV3cml0ZSBwYXJzaW5nIG9mIHRleHQgdGFncyB0byBoYW5kbGUgbXVsdGlwbGUgTlVMTCB0ZXJtaW5hdGVkIHN0cmluZ3MuIFBhcnNlIG51bWVyaWMgZ2VucmUgc3RyaW5ncyBhLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogKGlkM2RlbXV4X3JlYWRfaWQzdjJfdGFnKToKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuaDoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChpZDNkZW11eF9pZDN2Ml9wYXJzZV9mcmFtZSksCisJICAocGFyc2VfY29tbWVudF9mcmFtZSksIChwYXJzZV90ZXh0X2lkZW50aWZpY2F0aW9uX2ZyYW1lKSwKKwkgIChpZDN2Ml90YWdfdG9fdGFnbGlzdCksIChpZDN2Ml9hcmVfZGlnaXRzKSwKKwkgIChpZDN2Ml9nZW5yZV9zdHJpbmdfdG9fdGFnbGlzdCksIChpZDN2Ml9nZW5yZV9maWVsZHNfdG9fdGFnbGlzdCksCisJICAocGFyc2Vfc3BsaXRfc3RyaW5ncyksIChmcmVlX3RhZ19zdHJpbmdzKToKKwkgIFJld3JpdGUgcGFyc2luZyBvZiB0ZXh0IHRhZ3MgdG8gaGFuZGxlIG11bHRpcGxlIE5VTEwgdGVybWluYXRlZAorCSAgc3RyaW5ncy4gUGFyc2UgbnVtZXJpYyBnZW5yZSBzdHJpbmdzIGFuZCBJRDN2MiB0eXBlCisJICAiKDMpKDYpQWx0ZXJuYXRpdmUiIHN0eWxlIGdlbnJlIHN0cmluZ3MuCisJICBQYXJzZSBkYXRlcyB0aGF0IGFyZSBvbmx5IFlZWVkgb3IgWVlZWS1tbSBmb3JtYXQuCisKKzIwMDYtMDEtMjEgMTE6NDM6NTMgKzAwMDAgIEZhYnJpemlvIDxmYWJyaXppby5nZUB0aXNjYWxpLml0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6ICd0d29zJyBhbmQgJ3Nvd3QnIGZvdXJjYyBjYW4gYmUgMTZiaXQgb3IgOGJpdCBhdWRpby4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlX3RyYWspLAorCSAgKHF0ZGVtdXhfYXVkaW9fY2Fwcyk6CisJICAndHdvcycgYW5kICdzb3d0JyBmb3VyY2MgY2FuIGJlIDE2Yml0IG9yIDhiaXQgYXVkaW8uCisJICBGaXggOGJpdCBjYXNlICgjMzI3MTMzLCBiYXNlZCBvbiBwYXRjaCBieTogRmFicml6aW8KKwkgIEdlbm5hcmkgPGZhYnJpemlvIGRvdCBnZSBhdCB0aXNjYWxpIGRvdCBpdD4pLgorCSAgQWxzbywgIkdfTElUVExFX0VORElBTiIgYW5kICJHX0JJR19FTkRJQU4iIGFyZSBub3QKKwkgIHZhbGlkIGxpdGVyYWxzIGZvciBlbmRpYW5uZXNzIGluIGNhcHMgc3RyaW5ncywKKwkgIG9ubHkgIkxJVFRMRV9FTkRJQU4iIGFuZCAiQklHX0VORElBTiIgYXJlIHZhbGlkLgorCisyMDA2LTAxLTIwIDE1OjA2OjI4ICswMDAwICBDaHJpc3RvcGggQnVyZ2hhcmR0IDxoYXdrZXNAd2ViLmRlPgorCisJICBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogRG9uJ3QgZm9yZ2V0IHRvIGluaXRpYWxpemUgbGlib2lsLCBvdGhlcndpc2Ugb3VyIG9pbCBmdW5jdGlvbnMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogKGdzdF92aWRlb19ib3hfY2xhc3NfaW5pdCk6CisJICBEb24ndCBmb3JnZXQgdG8gaW5pdGlhbGl6ZSBsaWJvaWwsIG90aGVyd2lzZSBvdXIgb2lsIGZ1bmN0aW9ucworCSAgd2lsbCBjcmFzaCAoZml4ZXMgIzMyNzg3MTsgcGF0Y2ggYnk6IENocmlzdG9waCBCdXJnaGFyZHQKKwkgIDxoYXdrZXMgYXQgd2ViIGRvdCBkZT4pLgorCisyMDA2LTAxLTE5IDIxOjQ2OjMyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJKiBDaGFuZ2VMb2c6CisJICBDaGFuZ2VMb2cgc3VyZ2VyeSAobGFzdCBlbnRyeSBtYXkgaGF2ZSBiZWVuIHNsaWdodGx5IG1pc2xlYWRpbmcpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIENoYW5nZUxvZyBzdXJnZXJ5IChsYXN0IGVudHJ5IG1heSBoYXZlIGJlZW4gc2xpZ2h0bHkgbWlzbGVhZGluZykKKworMjAwNi0wMS0xOSAyMTowMDo1MCArMDAwMCAgQnJpYW4gQ2FtZXJvbiA8YnJpYW4uY2FtZXJvbkBzdW4uY29tPgorCisJICBjb25maWd1cmUuYWM6IGp1c3QgbGlrZSBpbiB0aGUgY29yZSBhbmQgZ3N0LXBsdWdpbnMtYmFzZS4gRml4ZXMgYnVpbGQgb24gU29sYXJpcyAoZml4ZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBVc2UgcGxhaW4gQVNfTElCVE9PTF9UQUdTIGluc3RlYWQgb2YgQVNfTElCVE9PTF9UQUdTKFtDWFhdKSwganVzdAorCSAgbGlrZSBpbiB0aGUgY29yZSBhbmQgZ3N0LXBsdWdpbnMtYmFzZS4gRml4ZXMgYnVpbGQgb24gU29sYXJpcyAoZml4ZXMKKwkgICMzMjY2ODM7IHBhdGNoIGJ5OiBCcmlhbiBDYW1lcm9uIDxicmlhbiBkb3QgY2FtZXJvbiBhdCBzdW4gZG90IGNvbT4pCisKKzIwMDYtMDEtMTkgMDA6MTA6NTEgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9jZGlvLzogRml4IGJ1aWxkIGZvciBsaWJjZGlvIHZlcnNpb25zID49IDc2OyBnaXZlIHNsaWdodGx5IGxvd2VyIHJhbmsgdGhhbiBjZHBhcmFub2lhLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9jZGlvL2dzdGNkaW8uYzogKGdzdF9jZGlvX2FkZF9jZHRleHRfZmllbGQpLCAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvY2Rpby9nc3RjZGlvLmg6CisJICAqIGV4dC9jZGlvL2dzdGNkaW9jZGRhc3JjLmM6IChnc3RfY2Rpb19jZGRhX3NyY19nZXRfY2R0ZXh0KToKKwkgIEZpeCBidWlsZCBmb3IgbGliY2RpbyB2ZXJzaW9ucyA+PSA3NjsgZ2l2ZSBzbGlnaHRseSBsb3dlciByYW5rCisJICB0aGFuIGNkcGFyYW5vaWEuCisKKzIwMDYtMDEtMTggMTk6MzA6MzYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIFBvcnQgbGliY2RpbyBjZGRhIHNvdXJjZSwgZm9ybWVybHkga25vd24gYXMgY2RkYXNyYywgbm93IGtub3duIGFzIGNkaW9jZGRhc3JjIChmaXhlcyAjMzIzMzI3KS4gU2hvdWxkIGFsc28gcmVhZCBDRC1URS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZXh0L01ha2VmaWxlLmFtOgorCSAgKiBleHQvY2Rpby9NYWtlZmlsZS5hbToKKwkgICogZXh0L2NkaW8vZ3N0Y2Rpby5jOgorCSAgKiBleHQvY2Rpby9nc3RjZGlvLmg6CisJICAqIGV4dC9jZGlvL2dzdGNkaW9jZGRhc3JjLmM6CisJICAqIGV4dC9jZGlvL2dzdGNkaW9jZGRhc3JjLmg6CisJICBQb3J0IGxpYmNkaW8gY2RkYSBzb3VyY2UsIGZvcm1lcmx5IGtub3duIGFzIGNkZGFzcmMsIG5vdyBrbm93biBhcworCSAgY2Rpb2NkZGFzcmMgKGZpeGVzICMzMjMzMjcpLiBTaG91bGQgYWxzbyByZWFkIENELVRFWFQgaWYgYXZhaWxhYmxlLAorCSAgYnV0IHRoYXQncyBub3QgdGVzdGVkIChmaXhlcyAjMzE3NjU4KS4KKworMjAwNi0wMS0xOCAxOTowODowOCArMDAwMCAgVG9tbWkgTXnDtmjDpG5lbiA8ZXh0LXRvbW1pLm15b2hhbmVuQG5va2lhLmNvbT4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IEZpeCBjb252ZXJzaW9uIGZyb20gVElNRSB0byBCWVRFUyBmb3JtYXQgKGZpeGVzICMzMjY4NjQ7CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGFkX2NvbnZlcnQpOgorCSAgRml4IGNvbnZlcnNpb24gZnJvbSBUSU1FIHRvIEJZVEVTIGZvcm1hdCAoZml4ZXMgIzMyNjg2NDsKKwkgIHBhdGNoIGJ5OiBUb21taSBNecO2aMOkbmVuIDxleHQtdG9tbWkgZG90IG15b2hhbmVuIGF0IG5va2lhIGRvdCBjb20+KQorCisyMDA2LTAxLTE4IDE4OjU0OjAyICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIFJvbmFsZCdzIHBhdGNoIGFwcGxpZWQuIHNlZSBidWcgIzMyNjMxOC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUm9uYWxkJ3MgcGF0Y2ggYXBwbGllZC4gc2VlIGJ1ZyAjMzI2MzE4LgorCisyMDA2LTAxLTE3IDE2OjQ1OjQzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4Lio6IEZpeCBzZWVraW5nIGZvciBxdWlja3RpbWUgZmlsZXMuIENvdWxkIHN0aWxsIHVzZSBzb21lIG1vcmUgbG92ZSBhbmQgc29waGlzdGljYXRpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfaW5pdCksCisJICAoZ3N0X3F0ZGVtdXhfc2VuZF9ldmVudCksIChnc3RfcXRkZW11eF9oYW5kbGVfc3JjX2V2ZW50KSwKKwkgIChnc3RfcXRkZW11eF9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICBGaXggc2Vla2luZyBmb3IgcXVpY2t0aW1lIGZpbGVzLiBDb3VsZCBzdGlsbCB1c2Ugc29tZSBtb3JlCisJICBsb3ZlIGFuZCBzb3BoaXN0aWNhdGlvbi4KKworMjAwNi0wMS0xNiAxMDoyMzo0NyArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICB1cGRhdGUgd2l0aCBsb3ZlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHVwZGF0ZSB3aXRoIGxvdmUKKworMjAwNi0wMS0xNSAyMDoyMTo0OCArMDAwMCAgU2VyZ2V5IFNjb2JpY2ggPHNlcmdleS5zY29iaWNoQGdtYWlsLmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IEZpeCBjb21waWxhdGlvbiBvZiBpZDNkZW11eCB3aGVuIHpsaWIgaXMgbm90IHByZXNlbnQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyZnJhbWVzLmM6IChpZDNkZW11eF9pZDN2Ml9wYXJzZV9mcmFtZSk6CisJICBGaXggY29tcGlsYXRpb24gb2YgaWQzZGVtdXggd2hlbiB6bGliIGlzIG5vdCBwcmVzZW50LgorCSAgKEZpeGVzICMzMjY2MDI7IHBhdGNoIGJ5OiBTZXJnZXkgU2NvYmljaCkKKworMjAwNi0wMS0xNSAxNDoxMjoxMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2VzZC9NYWtlZmlsZS5hbTogb3RoZXJ3aXNlIGJ1aWxkIHdpbGwgZmFpbCBmb3IgZm9sa3Mgd2l0aCBsaWJlc2QgaW4gYSBub24tc3RhbmRhcmQgcHJlZml4ICgjMzI3MDA5KS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZXNkL01ha2VmaWxlLmFtOgorCSAgQWRkICQoRVNEX0NGTEFHUyksIG90aGVyd2lzZSBidWlsZCB3aWxsIGZhaWwgZm9yIGZvbGtzCisJICB3aXRoIGxpYmVzZCBpbiBhIG5vbi1zdGFuZGFyZCBwcmVmaXggKCMzMjcwMDkpLgorCisyMDA2LTAxLTEzIDE5OjI5OjI3ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogY29uZmlndXJlLmFjOgorCSAgYmFjayB0byBoZWFkCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGJhY2sgdG8gaGVhZAorCisyMDA2LTAxLTEzIDE5OjI1OjQwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBkb2NzL3VwbG9hZC5tYWs6CisJICByZWxlYXNpbmcgMC4xMC4xCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbGVhc2luZyAwLjEwLjEKKworMjAwNi0wMS0xMyAxODozNzoxMyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2pwZWcvZ3N0c21va2VlbmMuYzogZml4IG1lbWxlYWsuICBGaXhlcyAjMzI2NjE4CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHBhdGNoIGJ5OiBXaW0gVGF5bWFucworCSAgKiBleHQvanBlZy9nc3RzbW9rZWVuYy5jOiAoZ3N0X3Ntb2tlZW5jX2NoYWluKToKKwkgIGZpeCBtZW1sZWFrLiAgRml4ZXMgIzMyNjYxOAorCisyMDA2LTAxLTEzIDE4OjM1OjAwICswMDAwICBNaWtlIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiBGaXggbWVtbGVhay4gIEZpeGVzICMzMjY2MTIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNi0wMS0xMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKwkgIHBhdGNoIGJ5OiBNaWtlIFNtaXRoCisJICAqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiAoZ3N0X2xldmVsX21lc3NhZ2VfbmV3KSwKKwkgIChnc3RfbGV2ZWxfbWVzc2FnZV9hcHBlbmRfY2hhbm5lbCk6CisJICBGaXggbWVtbGVhay4gIEZpeGVzICMzMjY2MTIKKworMjAwNi0wMS0xMSAxMTozOToxMCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGNvbmZpZ3VyZS5hYzogcHJlcmVsZWFzaW5nCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgcHJlcmVsZWFzaW5nCisJICAqIHBvL2FmLnBvOgorCSAgKiBwby9hei5wbzoKKwkgICogcG8vY3MucG86CisJICAqIHBvL2VuX0dCLnBvOgorCSAgKiBwby9odS5wbzoKKwkgICogcG8vaXQucG86CisJICAqIHBvL25iLnBvOgorCSAgKiBwby9ubC5wbzoKKwkgICogcG8vb3IucG86CisJICAqIHBvL3NxLnBvOgorCSAgKiBwby9zci5wbzoKKwkgICogcG8vc3YucG86CisJICAqIHBvL3VrLnBvOgorCSAgKiBwby92aS5wbzoKKwkgIHVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAwNi0wMS0xMSAxMTowNDowMyArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgc3VwcG9ydCBmb3IgSW5kZW8zIHZpZGVvIGluIFF1aWNrdGltZSBmaWxlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmV2aWV3ZWQgYnk6IEVkd2FyZCBIZXJ2ZXkgIDxlZHdhcmRAZmx1ZW5kby5jb20+CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBBZGQgc3VwcG9ydCBmb3IgSW5kZW8zIHZpZGVvIGluIFF1aWNrdGltZSBmaWxlcy4KKwkgIENsb3NlcyAjMzI2NTI0CisKKzIwMDYtMDEtMTAgMTI6Mzg6NTkgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZ3N0L2xldmVsL2dzdGxldmVsLmM6IERvbid0IGxlYWsgZmlsdGVyIGFycmF5cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogKGdzdF9sZXZlbF9jbGFzc19pbml0KSwKKwkgIChnc3RfbGV2ZWxfZGlzcG9zZSk6CisJICBEb24ndCBsZWFrIGZpbHRlciBhcnJheXMuCisKKzIwMDYtMDEtMDkgMTc6MDQ6NTIgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3VwbG9hZC5tYWs6CisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJKiBzeXMvTWFrZWZpbGUuYW06CisJKiBzeXMvc3VuYXVkaW8vTWFrZWZpbGUuYW06CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW8uYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVyLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlci5oOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvbWl4ZXJjdHJsLmM6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW9taXhlcmN0cmwuaDoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVydHJhY2suYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb21peGVydHJhY2suaDoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NpbmsuYzoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NpbmsuaDoKKwkgIGFkZCBTdW4gQXVkaW8gcGx1Z2luLiBWZXJpZmllZCB0aGF0IG5vdGhpbmcgYnJlYWtzIGFuZCB0aGF0IG1ha2UgY2hlY2sgd29ya3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCBTdW4gQXVkaW8gcGx1Z2luLiBWZXJpZmllZCB0aGF0IG5vdGhpbmcgYnJlYWtzIGFuZCB0aGF0IG1ha2UgY2hlY2sgd29ya3MuCisJICBEb24ndCB0aGluayB0aGUgZG9jcyBnZXRzIHByb3Blcmx5IGJ1aWx0IHlldCwgYnV0IEkgZG9uJ3QgdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0byBlbmFibGUgdGhhdC4KKworMjAwNi0wMS0wNyAyMDowMTowOSArMDAwMCAgUGhpbGlwcGUgS2FsYWYgPHBoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0LXBsdWdpbnMtZ29vZC9nc3QvdWRwLzogQWxsb3cgdWRwc3JjIGFuZCBkeW51ZHBzaW5rIHRvIHRha2UgYSBzb2NrZmQgYXMgYSBwYXJhbWV0ZXIuIEZvciB1ZHBzcmMsIG92ZXJyaWRlcyB0aGUgcG9yLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMDEtMDcgIFBoaWxpcHBlIEtoYWxhZiAgPHBoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51az4KKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgQWxsb3cgdWRwc3JjIGFuZCBkeW51ZHBzaW5rIHRvIHRha2UgYSBzb2NrZmQgYXMgYSBwYXJhbWV0ZXIuIEZvciB1ZHBzcmMsCisJICBvdmVycmlkZXMgdGhlIHBvcnQgb3IgbXVsdGljYXN0IHBhcmFtZXRlcnMuIEZpeGVzIGJ1Z3MgIzMyMzAyMS4KKworMjAwNi0wMS0wNiAxNjoyODozMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2djb25mLzogQWRkIG5ldyBnY29uZmF1ZGlvc3JjIGFuZCBnY29uZnZpZGVvc3JjIGVsZW1lbnRzIChuZWVkZWQgZm9yIGdub21lLXNvdW5kLXJlY29yZGVyKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZ2NvbmYvTWFrZWZpbGUuYW06CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc3JjLmM6IChnc3RfZ2NvbmZfYXVkaW9fc3JjX2Jhc2VfaW5pdCksCisJICAoZ3N0X2djb25mX2F1ZGlvX3NyY19jbGFzc19pbml0KSwgKGdzdF9nY29uZl9hdWRpb19zcmNfcmVzZXQpLAorCSAgKGdzdF9nY29uZl9hdWRpb19zcmNfaW5pdCksIChnc3RfZ2NvbmZfYXVkaW9fc3JjX2Rpc3Bvc2UpLAorCSAgKGRvX3RvZ2dsZV9lbGVtZW50KSwgKGNiX3RvZ2dsZV9lbGVtZW50KSwKKwkgIChnc3RfZ2NvbmZfYXVkaW9fc3JjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc3JjLmg6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmVsZW1lbnRzLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc3JjLmM6IChnc3RfZ2NvbmZfdmlkZW9fc3JjX2Jhc2VfaW5pdCksCisJICAoZ3N0X2djb25mX3ZpZGVvX3NyY19jbGFzc19pbml0KSwgKGdzdF9nY29uZl92aWRlb19zcmNfcmVzZXQpLAorCSAgKGdzdF9nY29uZl92aWRlb19zcmNfaW5pdCksIChnc3RfZ2NvbmZfdmlkZW9fc3JjX2Rpc3Bvc2UpLAorCSAgKGRvX3RvZ2dsZV9lbGVtZW50KSwgKGNiX3RvZ2dsZV9lbGVtZW50KSwKKwkgIChnc3RfZ2NvbmZfdmlkZW9fc3JjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc3JjLmg6CisJICBBZGQgbmV3IGdjb25mYXVkaW9zcmMgYW5kIGdjb25mdmlkZW9zcmMgZWxlbWVudHMKKwkgIChuZWVkZWQgZm9yIGdub21lLXNvdW5kLXJlY29yZGVyKS4KKworMjAwNi0wMS0wNiAxMTo0Njo1MyArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IEFkZCBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMoKSBmb3IgcHJvcGVyIGRlY29kZWJpbiBiZWhhdmlvdXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfaWQzZGVtdXhfYWRkX3NyY3BhZCk6CisJICBBZGQgZ3N0X2VsZW1lbnRfbm9fbW9yZV9wYWRzKCkgZm9yIHByb3BlciBkZWNvZGViaW4gYmVoYXZpb3VyLgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKHBhcnNlX2NvbW1lbnRfZnJhbWUpLAorCSAgKHBhcnNlX3RleHRfaWRlbnRpZmljYXRpb25fZnJhbWUpLCAocGFyc2Vfc3BsaXRfc3RyaW5ncyk6CisJICBGYWlsdXJlIHRvIGRlY29kZSBzb21lIHRhZ3MgaXMgbm90IGEgR1NUX0VSUk9SKCkgYnV0IGEKKwkgIEdTVF9XQVJOSU5HKCkKKwkgIFdoZW4gaXRlcmF0aW5nIG92ZXIgYSBjaHVuayBvZiB0ZXh0LCBjaGVjayB0aGF0IHdlIGhhdmVuJ3QgZ29uZSB0b28KKwkgIGZhci4KKworMjAwNi0wMS0wNSAyMzoxNzo0NCArMDAwMCAgU8OpYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3cGx1Z2luLmM6CisJKiBzeXMvZGlyZWN0ZHJhdy9nc3RkaXJlY3RkcmF3c2luay5jOgorCSogc3lzL2RpcmVjdGRyYXcvZ3N0ZGlyZWN0ZHJhd3NpbmsuaDoKKwkqIHN5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHBsdWdpbi5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jOgorCSogc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oOgorCSogd2luMzIvdnM2L2xpYmdzdGRpcmVjdGRyYXcuZHNwOgorCSogd2luMzIvdnM2L2xpYmdzdGRpcmVjdHNvdW5kLmRzcDoKKwkgIGFkZGVkIHN5cy9kaXJlY3RkcmF3IGFkZGVkIHN5cy9kaXJlY3Rzb3VuZCBhZGRlZCB3aW4zMi92czYvZ3N0X3BsdWdpbnNfYmFkLmRzdyBhZGRlZCB3aW4zMi92czYvbGliZ3N0ZGlyZWN0c291bmQuZHNwIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA2LTAxLTA1ICBTZWJhc3RpZW4gTW91dHRlICA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisJICAqIGFkZGVkIHN5cy9kaXJlY3RkcmF3CisJICAqIGFkZGVkIHN5cy9kaXJlY3Rzb3VuZAorCSAgKiBhZGRlZCB3aW4zMi92czYvZ3N0X3BsdWdpbnNfYmFkLmRzdworCSAgKiBhZGRlZCB3aW4zMi92czYvbGliZ3N0ZGlyZWN0c291bmQuZHNwCisJICAqIGFkZGVkIHdpbjMyL3ZzNi9saWJnc3RkaXJlY3RkcmF3LmRzcAorCSAgKiBhZGRlZCB3aW4zMi9jb21tb24vY29uZmlnLmgKKworMjAwNi0wMS0wNSAxNzowMzo0NSArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogY2FsbCBvaWxfaW5pdCgpIHdoZW4gdXNpbmcgbGlib2lsCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2NsYXNzX2luaXQpLAorCSAgKHBsdWdpbl9pbml0KToKKwkgIGNhbGwgb2lsX2luaXQoKSB3aGVuIHVzaW5nIGxpYm9pbAorCisyMDA2LTAxLTA0IDE3OjI4OjQ5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvanBlZy86IEZpeCBsZWFrcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvanBlZy9nc3RzbW9rZWRlYy5jOiAoZ3N0X3Ntb2tlZGVjX2NoYWluKToKKwkgICogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzogKGdzdF9zbW9rZWVuY19jaGFpbik6CisJICBGaXggbGVha3MuCisKKzIwMDYtMDEtMDIgMTk6Mzg6MzIgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogRG9uJ3QgZ19hc3NlcnQoKSB3aGVyZSB3ZSBzaG91bGQganVzdCByZXR1cm4gRkFMU0U7IHJlbW92ZSB1bm5lY2Vzc2FyeSBnX2Fzc2VydCgpOyBpbml0aWFsaXplIC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBSZXZpZXdlZCBieTogVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfd3JpdGUpLAorCSAgKGdzdF9mbGFjX2RlY19jb252ZXJ0X3NyYyksIChnc3RfZmxhY19kZWNfc3JjX3F1ZXJ5KSwKKwkgIChnc3RfZmxhY19kZWNfY2hhbmdlX3N0YXRlKToKKwkgIERvbid0IGdfYXNzZXJ0KCkgd2hlcmUgd2Ugc2hvdWxkIGp1c3QgcmV0dXJuIEZBTFNFOyByZW1vdmUKKwkgIHVubmVjZXNzYXJ5IGdfYXNzZXJ0KCk7IGluaXRpYWxpemUgc29tZSBmaWVsZHMgcHJvcGVybHkgaW4KKwkgIHN0YXRlIGNoYW5nZSBmdW5jdGlvbiAoZml4ZXMgIzMyNTUwNCkuIEFsc28sIHVzZQorCSAgR1NUX0RFQlVHX09CSkVDVCBpbiB0d28gbW9yZSBwbGFjZXMuCisKKzIwMDUtMTItMzAgMTU6NTE6MDUgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBhbHNvIHJlbW92ZSBzbW9vdGh3YXZlJ3MgTWFrZWZpbGUuYW0KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBhbHNvIHJlbW92ZSBzbW9vdGh3YXZlJ3MgTWFrZWZpbGUuYW0KKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgZml4IHBsdWdpbiBkb2NzCisKKzIwMDUtMTItMzAgMTU6Mzk6MTcgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3Qvc21vb3Rod2F2ZS8uZ2l0aWdub3JlOgorCSogZ3N0L3Ntb290aHdhdmUvTWFrZWZpbGUuYW06CisJKiBnc3Qvc21vb3Rod2F2ZS9SRUFETUU6CisJKiBnc3Qvc21vb3Rod2F2ZS9kZW1vLW9zc3NyYy5jOgorCSogZ3N0L3Ntb290aHdhdmUvZ3N0c21vb3Rod2F2ZS5jOgorCSogZ3N0L3Ntb290aHdhdmUvZ3N0c21vb3Rod2F2ZS5oOgorCSAgcmVtb3ZlIG9sZCBwbHVnaW4gdGhhdCB3ZW50IGJhZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZW1vdmUgb2xkIHBsdWdpbiB0aGF0IHdlbnQgYmFkCisKKzIwMDUtMTItMzAgMTU6MzQ6MTggKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgdGVzdHMvZXhhbXBsZXMvTWFrZWZpbGUuYW06IGFkZGVkIG1pc3NpbmcgTWFrZWZpbGUuYW0KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9NYWtlZmlsZS5hbToKKwkgIGFkZGVkIG1pc3NpbmcgTWFrZWZpbGUuYW0KKworMjAwNS0xMi0zMCAxNToyODo0NCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBtb3ZlZCBsZXZlbC1leGFtcGxlIHRvIHRlc3RzL2V4YW1wbGVzL2xldmVsLWV4YW1wbGUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9sZXZlbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2xldmVsL2xldmVsLWV4YW1wbGUuYzoKKwkgICogdGVzdHMvTWFrZWZpbGUuYW06CisJICAqIHRlc3RzL2V4YW1wbGVzL2xldmVsL01ha2VmaWxlLmFtOgorCSAgKiB0ZXN0cy9leGFtcGxlcy9sZXZlbC9sZXZlbC1leGFtcGxlLmM6IChtZXNzYWdlX2hhbmRsZXIpLCAobWFpbik6CisJICBtb3ZlZCBsZXZlbC1leGFtcGxlIHRvIHRlc3RzL2V4YW1wbGVzL2xldmVsLWV4YW1wbGUKKwkgICogdGVzdHMvb2xkL2V4YW1wbGVzL2xldmVsL2RlbW8uYzogKG1haW4pOgorCSAgKiB0ZXN0cy9vbGQvZXhhbXBsZXMvbGV2ZWwvcGxvdC5jOiAobWFpbik6CisJICBzb21lIGluaXRpYWwgZml4ZXMKKworMjAwNS0xMi0yOSAxNjozNjoxOSArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBnc3QvdWRwL2dzdG11bHRpdWRwc2luay4qOiBUcmFjayBwYWNrZXRzIHNlbnQgcGVyIGNsaWVudCBpbiBhZGRpdGlvbiB0byBieXRlcyBzZW50OyBwcm92aWRlIHRoaXMgaW5mbyB0aHJvdWdoIGdldC1zdGEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19yZW5kZXIpLAorCSAgKGdzdF9tdWx0aXVkcHNpbmtfcmVtb3ZlKSwgKGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3N0YXRzKToKKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkgIFRyYWNrIHBhY2tldHMgc2VudCBwZXIgY2xpZW50IGluIGFkZGl0aW9uIHRvIGJ5dGVzIHNlbnQ7IHByb3ZpZGUKKwkgIHRoaXMgaW5mbyB0aHJvdWdoIGdldC1zdGF0cyBzaWduYWwKKworMjAwNS0xMi0yOSAxMToyNjoxMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiBDYW4ndCB1c2UgZ3N0X29iamVjdF91bnJlZigpIG9uIGEgR3N0QWRhcHRlciAoIzMyNTE5MSkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiAoZ3N0X2F1X3BhcnNlX2Rpc3Bvc2UpOgorCSAgQ2FuJ3QgdXNlIGdzdF9vYmplY3RfdW5yZWYoKSBvbiBhIEdzdEFkYXB0ZXIgKCMzMjUxOTEpLgorCisyMDA1LTEyLTI4IDE4OjU1OjMyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogSWYgYSBicm9rZW4gdGFnIGhhcyAwIGJ5dGVzIHBheWxvYWQsIGF0IGxlYXN0IHN0aWxsIHNraXAgdGhlIDEwIGJ5dGUgaGVhZGVyCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogKGlkM2RlbXV4X3JlYWRfaWQzdjJfdGFnKToKKwkgIElmIGEgYnJva2VuIHRhZyBoYXMgMCBieXRlcyBwYXlsb2FkLCBhdCBsZWFzdCBzdGlsbCBza2lwCisJICB0aGUgMTAgYnl0ZSBoZWFkZXIKKworMjAwNS0xMi0yMiAxNTowMDo0MSArMDAwMCAgUGhpbGlwcGUgS2FsYWYgPHBoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwLzogTWFraW5nIHRoZXNlIGRlcGF5bG9hZGVycyAoSDI2MysgYW5kIG1wZWc0IHZpZGVvKSBpbmhlcml0IGZyb20KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMi0yMiAgUGhpbGlwcGUgS2hhbGFmICA8YnVyZ2VyQHNwZWVkeS5vcmc+CisJICAqIGdzdC1wbHVnaW5zLWdvb2QvZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5Lmg6CisJICAqIGdzdC1wbHVnaW5zLWdvb2QvZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJICAqIGdzdC1wbHVnaW5zLWdvb2QvZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuaDoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5jOgorCSAgTWFraW5nIHRoZXNlIGRlcGF5bG9hZGVycyAoSDI2MysgYW5kIG1wZWc0IHZpZGVvKSBpbmhlcml0IGZyb20KKwkgIFJ0cEJhc2VEZXBheWxvYWRlckNsYXNzLiBGaXhlcyBidWdzICMzMjM5MjIgYW5kICMzMjM5MDguCisKKzIwMDUtMTItMjEgMTc6MTU6MDkgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLio6IFJlZ2VuZXJhdGUgdGhlIHBsdWdpbiBoaWVhcmNoeS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5OgorCSAgUmVnZW5lcmF0ZSB0aGUgcGx1Z2luIGhpZWFyY2h5LgorCisyMDA1LTEyLTIxIDE1OjI0OjU5ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgQWRkIGRvY3VtZW50YXRpb24gZm9yIGlkM2RlbXV4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEyLTIxICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICAqIGdzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jOiAoZ3N0X2lkM2RlbXV4X2dldF90eXBlKSwKKwkgIChnc3RfaWQzZGVtdXhfYmFzZV9pbml0KSwgKGdzdF9pZDNkZW11eF9jbGFzc19pbml0KSwKKwkgIChnc3RfaWQzZGVtdXhfY2hhaW4pOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguaDoKKwkgIEFkZCBkb2N1bWVudGF0aW9uIGZvciBpZDNkZW11eC4KKwkgIERvbid0IGZhaWwgaWYgdGhlIGZpcnN0IGJ1ZmZlciBpcyBub3QgYXQgb2Zmc2V0IDAsIGp1c3QKKwkgIGF0dGVtcHQgdG8gdHlwZWZpbmQgYW5kIGRvIHBhc3MgdGhyb3VnaAorCSAgUmVuYW1lIHRoZSBnc3RfdHlwZSBmdW5jdGlvbiBmcm9tIGdzdF9nc3RfaWQzZGVtdXguLgorCisyMDA1LTEyLTIwIDEyOjQ0OjI1ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkgIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLio6IENvbGxlY3Qgc3RhdGlzdGljczsgcmV0dXJuIHRoZW0gZnJvbSBnZXRfc3RhdHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogKGdzdF9tdWx0aXVkcHNpbmtfcmVuZGVyKSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX2FkZCksIChnc3RfbXVsdGl1ZHBzaW5rX3JlbW92ZSksCisJICAoZ3N0X211bHRpdWRwc2lua19nZXRfc3RhdHMpOgorCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5oOgorCSAgQ29sbGVjdCBzdGF0aXN0aWNzOyByZXR1cm4gdGhlbSBmcm9tIGdldF9zdGF0cy4KKworMjAwNS0xMi0xOSAxNTo0MzozMCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBTdHVwaWQgc2lnbmVkbmVzcyBpc3N1ZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3RyZWFtX3NjYW4pOgorCSAgU3R1cGlkIHNpZ25lZG5lc3MgaXNzdWUuLi4KKworMjAwNS0xMi0xOSAxNToxOTo0NCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZXh0L3N3ZmRlYy9nc3Rzd2ZkZWMuYzogQWRkIGRlYnVnZ2luZyBjYXRlZ29yeSBhbmQgcmV0dXJuIEdzdEZsb3dSZXR1cm4gaW4gdGhlIHJpZ2h0IHBsYWNlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zd2ZkZWMvZ3N0c3dmZGVjLmM6IChnc3Rfc3dmZGVjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9zd2ZkZWNfY2hhaW4pLCAoZ3N0X3N3ZmRlY19yZW5kZXIpOgorCSAgQWRkIGRlYnVnZ2luZyBjYXRlZ29yeSBhbmQgcmV0dXJuIEdzdEZsb3dSZXR1cm4gaW4gdGhlIHJpZ2h0IHBsYWNlcworCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmM6IChnc3Rfd2F2cGFja19kZWNfbGluayk6CisJICBHZXQgc29tZXRoaW5nIGZyb20gdGhlIHBlZXIgcGFkIG9uY2Ugd2UndmUgY2hlY2tlZCBpZiB0aGVyZSBpcyBhIHBlZXIgcGFkLgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9jaGFuZ2Vfc3RhdGUpLAorCSAgKHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSksIChxdGRlbXV4X3BhcnNlX3RyYWspLAorCSAgKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBDb3VwbGUgb2YgZml4ZXMKKworMjAwNS0xMi0xOSAxNTowNjoyNyArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBDb25zdHJ1Y3QgaW5kZXggZm9yIGluZGV4bGVzcyBmaWxlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLCAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0pLAorCSAgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfb2RtbCksIChnc3RfYXZpX2RlbXV4X3BlZWtfdGFnKSwKKwkgIChnc3RfYXZpX2RlbXV4X25leHRfZGF0YV9idWZmZXIpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fc2NhbiksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyKSwgKGdzdF9hdmlfZGVtdXhfbG9vcCk6CisJICBDb25zdHJ1Y3QgaW5kZXggZm9yIGluZGV4bGVzcyBmaWxlcy4KKwkgIE1ha2Ugc3VyZSBwYWQvYnVmZmVycyBhcmUgY29ycmVjdGx5IHJlc2V0IHRvIE5VTEwgb25jZSB3ZSBkb24ndCBuZWVkCisJICB0aGVtIGFueW1vcmUsIGVsc2Ugd2UgZ2V0IGxvdmVseSBzZWdmYXVsdHMvYXNzZXJ0aW9ucy4KKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBZZXMsIHlvdSBjYW4gaGF2ZSA5NktIeiBhdWRpbyBhbmQgd21hIGluIHdhdiA6KAorCisyMDA1LTEyLTE4IDE1OjE0OjQ0ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgY29uZmlndXJlLmFjOiBDaGVjayBmb3Igb3B0aW9uYWwgZGVwZW5kZW5jeSBvbiB6bGliIGZvciBpZDNkZW11eAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIENoZWNrIGZvciBvcHRpb25hbCBkZXBlbmRlbmN5IG9uIHpsaWIgZm9yIGlkM2RlbXV4CisJICAqIGdzdC9pZDNkZW11eC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmM6IChnc3RfZ3N0X2lkM2RlbXV4X2dldF90eXBlKSwKKwkgIChnc3RfaWQzZGVtdXhfYmFzZV9pbml0KSwgKGdzdF9pZDNkZW11eF9jbGFzc19pbml0KSwKKwkgIChnc3RfaWQzZGVtdXhfcmVzZXQpLCAoZ3N0X2lkM2RlbXV4X2luaXQpLCAoZ3N0X2lkM2RlbXV4X2Rpc3Bvc2UpLAorCSAgKGdzdF9pZDNkZW11eF9hZGRfc3JjcGFkKSwgKGdzdF9pZDNkZW11eF9yZW1vdmVfc3JjcGFkKSwKKwkgIChnc3RfaWQzZGVtdXhfdHJpbV9idWZmZXIpLCAoZ3N0X2lkM2RlbXV4X2NoYWluKSwKKwkgIChnc3RfaWQzZGVtdXhfc2V0X3Byb3BlcnR5KSwgKGdzdF9pZDNkZW11eF9nZXRfcHJvcGVydHkpLAorCSAgKGlkM2RlbXV4X2dldF91cHN0cmVhbV9zaXplKSwgKGdzdF9pZDNkZW11eF9zcmNwYWRfZXZlbnQpLAorCSAgKGdzdF9pZDNkZW11eF9yZWFkX2lkM3YxKSwgKGdzdF9pZDNkZW11eF9yZWFkX2lkM3YyKSwKKwkgIChnc3RfaWQzZGVtdXhfc2lua19hY3RpdmF0ZSksIChnc3RfaWQzZGVtdXhfc3JjX2FjdGl2YXRlX3B1bGwpLAorCSAgKGdzdF9pZDNkZW11eF9zcmNfY2hlY2tnZXRyYW5nZSksIChnc3RfaWQzZGVtdXhfcmVhZF9yYW5nZSksCisJICAoZ3N0X2lkM2RlbXV4X3NyY19nZXRyYW5nZSksIChnc3RfaWQzZGVtdXhfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfaWQzZGVtdXhfcGFkX3F1ZXJ5KSwgKGdzdF9pZDNkZW11eF9nZXRfcXVlcnlfdHlwZXMpLAorCSAgKHNpbXBsZV9maW5kX3BlZWspLCAoc2ltcGxlX2ZpbmRfc3VnZ2VzdCksCisJICAoZ3N0X2lkM2RlbXV4X2RvX3R5cGVmaW5kKSwgKGdzdF9pZDNkZW11eF9zZW5kX3RhZ19ldmVudCksCisJICAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguaDoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3RhZ3MuYzogKHJlYWRfc3luY2hfdWludCksCisJICAoaWQzZGVtdXhfcmVhZF9pZDN2MV90YWcpLCAoaWQzZGVtdXhfcmVhZF9pZDN2Ml90YWcpLAorCSAgKGlkM2RlbXV4X2lkM3YyX2ZyYW1lX2hkcl9zaXplKSwgKGNvbnZlcnRfZmlkX3RvX3YyNDApLAorCSAgKGlkM2RlbXV4X2lkM3YyX2ZyYW1lc190b190YWdfbGlzdCk6CisJICAqIGdzdC9pZDNkZW11eC9pZDN0YWdzLmg6CisJICAqIGdzdC9pZDNkZW11eC9pZDN2Mi40LjAtZnJhbWVzLnR4dDoKKwkgICogZ3N0L2lkM2RlbXV4L2lkM3YyLjQuMC1zdHJ1Y3R1cmUudHh0OgorCSAgKiBnc3QvaWQzZGVtdXgvaWQzdjJmcmFtZXMuYzogKGlkM2RlbXV4X2lkM3YyX3BhcnNlX2ZyYW1lKSwKKwkgIChwYXJzZV9jb21tZW50X2ZyYW1lKSwgKHBhcnNlX3RleHRfaWRlbnRpZmljYXRpb25fZnJhbWUpLAorCSAgKGlkM3YyX3RhZ190b190YWdsaXN0KSwgKHBhcnNlX3NwbGl0X3N0cmluZ3MpOgorCSAgQWxsIG5ldyBMR1BMIGlkMyBkZW11eGVyLiBDYW4gdXNlIHpsaWIgZm9yIGNvbXByZXNzZWQgZnJhbWVzLAorCSAgb3RoZXJ3aXNlIGl0IGRpc2NhcmRzIHRoZW0uIFdvcmtzIG9uIG15IHRlc3QgZmlsZXMuCisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2xvb3ApOgorCSAgRG9uJ3Qgc2VuZCBFT1MgdG8gYSBub24tZXhpc3Rpbmcgc3JjcGFkCisJICBUaGUgZGVidWcgY2F0ZWdvcnkgY2FuIGJlIHN0YXRpYworCisyMDA1LTEyLTE3IDE3OjQ4OjM4ICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zLzogVXBkYXRlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMi0xNyAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMtZGVjbC50eHQ6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy11bmRvY3VtZW50ZWQudHh0OgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtYmFkLXBsdWdpbnMuYXJnczoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWJhZC1wbHVnaW5zLmludGVyZmFjZXM6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1iYWQtcGx1Z2lucy5zaWduYWxzOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGZidmlkZW9zaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXF0ZGVtdXgueG1sOgorCSAgKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2RsdmlkZW9zaW5rLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWVkLnhtbDoKKwkgICogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXR0YS54bWw6IFVwZGF0ZXMuCisJICAqIGV4dC9kaXJlY3RmYi9kZmJ2aWRlb3NpbmsuYzoKKwkgIChnc3RfZGZidmlkZW9zaW5rX3N1cmZhY2VfY3JlYXRlKSwKKwkgIChnc3RfZGZidmlkZW9zaW5rX2V2ZW50X3RocmVhZCksIChnc3RfZGZidmlkZW9zaW5rX2VudW1fdm1vZGVzKSwKKwkgIChnc3RfZGZidmlkZW9zaW5rX2VudW1fZGV2aWNlcyksIChnc3RfZGZidmlkZW9zaW5rX3NldHVwKSwKKwkgIChnc3RfZGZidmlkZW9zaW5rX2NsZWFudXApLAorCSAgKGdzdF9kZmJ2aWRlb3NpbmtfY2FuX2JsaXRfZnJvbV9mb3JtYXQpLAorCSAgKGdzdF9kZmJ2aWRlb3NpbmtfZ2V0X2Jlc3Rfdm1vZGUpLCAoZ3N0X2RmYnZpZGVvc2lua19nZXRjYXBzKSwKKwkgIChnc3RfZGZidmlkZW9zaW5rX3NldGNhcHMpLCAoZ3N0X2RmYnZpZGVvc2lua19zaG93X2ZyYW1lKSwKKwkgIChnc3RfZGZidmlkZW9zaW5rX2J1ZmZlcl9hbGxvYyksIChnc3RfZGZic3VyZmFjZV9maW5hbGl6ZSksCisJICAoZ3N0X2RmYnZpZGVvc2lua19pbnRlcmZhY2Vfc3VwcG9ydGVkKSwKKwkgIChnc3RfZGZidmlkZW9zaW5rX25hdmlnYXRpb25fc2VuZF9ldmVudCksCisJICAoZ3N0X2RmYnZpZGVvc2lua191cGRhdGVfY29sb3JiYWxhbmNlKSwKKwkgIChnc3RfZGZidmlkZW9zaW5rX2NvbG9yYmFsYW5jZV9saXN0X2NoYW5uZWxzKSwKKwkgIChnc3RfZGZidmlkZW9zaW5rX2NvbG9yYmFsYW5jZV9zZXRfdmFsdWUpLAorCSAgKGdzdF9kZmJ2aWRlb3NpbmtfY29sb3JiYWxhbmNlX2dldF92YWx1ZSksCisJICAoZ3N0X2RmYnZpZGVvc2lua19jb2xvcmJhbGFuY2VfaW5pdCksCisJICAoZ3N0X2RmYnZpZGVvc2lua19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9kZmJ2aWRlb3NpbmtfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfZGZidmlkZW9zaW5rX2luaXQpLCAoZ3N0X2RmYnZpZGVvc2lua19jbGFzc19pbml0KToKKwkgICogZXh0L2RpcmVjdGZiL2RmYnZpZGVvc2luay5oOiBJbXBsZW1lbnQgdmVydGljYWwgc3luYyBhbmQKKwkgIGNvbG9yIGJhbGFuY2UgaW50ZXJmYWNlLgorCisyMDA1LTEyLTE2IDIxOjU3OjUxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGNoYW5nZSBzb21lIGNoYXIqIGludG8gY2hhcltdCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2VzZC9lc2Rtb24uYzogKGdzdF9lc2Rtb25fb3Blbl9hdWRpbyk6CisJICAqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfcHJlcGFyZSk6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkgIGNoYW5nZSBzb21lIGNoYXIqIGludG8gY2hhcltdCisKKzIwMDUtMTItMTYgMTk6MzI6NTMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS4qOiBVc2UgR3N0U2VnbWVudCB0byBpbXBsZW1lbnQgbW9yZSBzZWVraW5nIGZlYXR1cmVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3Jlc2V0KSwKKwkgIChnc3Rfd2F2cGFyc2Vfb3RoZXIpLCAoZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSksCisJICAoZ3N0X3dhdnBhcnNlX2xvb3ApLCAoZ3N0X3dhdnBhcnNlX3BhZF9jb252ZXJ0KSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3JjcGFkX2V2ZW50KSwgKGdzdF93YXZwYXJzZV9zaW5rX2FjdGl2YXRlX3B1bGwpOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwkgIFVzZSBHc3RTZWdtZW50IHRvIGltcGxlbWVudCBtb3JlIHNlZWtpbmcgZmVhdHVyZXMuCisKKzIwMDUtMTItMTYgMTI6MjU6MzggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogT29wcywgcmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGZyb20gY2FwcyBzdHJpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jOgorCSAgT29wcywgcmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGZyb20gY2FwcyBzdHJpbmcuCisKKzIwMDUtMTItMTYgMTA6MTI6NDkgKzAwMDAgIEJlbmphbWluIFBpbmVhdSA8YmVuLnBpbmVhdUBnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IEFkZCA8bmV0aW5ldC9pbi5oPiBpbmNsdWRlIGFuZCBtb3ZlIDxhcnBhL2luZXQuaD4gaW5jbHVkZSB0byBtYWtlIHRoaW5ncyB3b3JrIG9uIE9wZW5CU0QgYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6CisJICBBZGQgPG5ldGluZXQvaW4uaD4gaW5jbHVkZSBhbmQgbW92ZSA8YXJwYS9pbmV0Lmg+IGluY2x1ZGUKKwkgIHRvIG1ha2UgdGhpbmdzIHdvcmsgb24gT3BlbkJTRCBhcyB3ZWxsIChmaXhlcyAjMzIzNzE3OworCSAgcGF0Y2ggYnk6IEJlbmphbWluIFBpbmVhdSkKKworMjAwNS0xMi0xNiAwOTo1OToyMSArMDAwMCAgZ2NvY2F0cmVAZ21haWwuY29tIDxnY29jYXRyZUBnbWFpbC5jb20+CisKKwkgIGV4dC93YXZwYWNrLzogV2F2cGFjayBzdXBwb3J0cyBzYW1wbGVyYXRlcyBmcm9tIDYtMTkya0h6LCBmaXggcGFkIHRlbXBsYXRlIHJlbW92ZSBidWZmZXItZnJhbWVzIGZyb20gY2FwcywgdGhleSBhcmUgZy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogKGdzdF93YXZwYWNrX2RlY19saW5rKToKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6CisJICBXYXZwYWNrIHN1cHBvcnRzIHNhbXBsZXJhdGVzIGZyb20gNi0xOTJrSHosIGZpeCBwYWQgdGVtcGxhdGUKKwkgIGNhcHMgKGZpeGVzICMzMjI5NzM7IHBhdGNoIGJ5OiBnY29jYXRyZUBnbWFpbC5jb20pLiBBbHNvCisJICByZW1vdmUgYnVmZmVyLWZyYW1lcyBmcm9tIGNhcHMsIHRoZXkgYXJlIGdvbmUgaW4gMC4xMC4KKworMjAwNS0xMi0xNCAyMDowNTo0NSArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYzoKKwkgIFNldCBjbG9jayByYXRlIHRvIGJlIGZpeGVkIGluIDgwMDAuIEl0IGZpeGVzIGJ1ZyAjMzI0MDEyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBTZXQgY2xvY2sgcmF0ZSB0byBiZSBmaXhlZCBpbiA4MDAwLiBJdCBmaXhlcyBidWcgIzMyNDAxMi4KKworMjAwNS0xMi0xNCAxODowNzoxNiArMDAwMCAgUGhpbGlwcGUgS2FsYWYgPHBoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51az4KKworCSAgZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwLzogRml4ZWQgcGF5bG9hZCByYW5nZSBpbiBwYXlsb2RlciBjYXBzLiBSZW1vdmVkIHBheWxvYWQgcmFuZ2UgY29tcGxldGx5IGZyb20gZGVwYXlsb2FkZXJzIGFzLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTItMTQgIFBoaWxpcHBlIEtoYWxhZiAgPGJ1cmdlckBzcGVlZHkub3JnPgorCSAgKiBnc3QtcGx1Z2lucy1nb29kL2dzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmM6CisJICAqIGdzdC1wbHVnaW5zLWdvb2QvZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSAgKiBnc3QtcGx1Z2lucy1nb29kL2dzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJICAqIGdzdC1wbHVnaW5zLWdvb2QvZ3N0L3J0cC9nc3RydHBnNzExZGVwYXkuYzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwL2dzdHJ0cGc3MTFkZXBheS5jOgorCSAgKiBnc3QtcGx1Z2lucy1nb29kL2dzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuYzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJICAqIGdzdC1wbHVnaW5zLWdvb2QvZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJICAqIGdzdC1wbHVnaW5zLWdvb2QvZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkgICogZ3N0LXBsdWdpbnMtZ29vZC9nc3QvcnRwL1JFQURNRToKKwkgIEZpeGVkIHBheWxvYWQgcmFuZ2UgaW4gcGF5bG9kZXIgY2Fwcy4gUmVtb3ZlZCBwYXlsb2FkIHJhbmdlIGNvbXBsZXRseSBmcm9tCisJICBkZXBheWxvYWRlcnMgYXMgdGhleSBkb24ndCByZXF1aXJlIHBheWxvYWQgdHlwZSBpbiB0aGVpciBjYXBzLiBJbiBlZmZlY3QsCisJICB0aGVyZSBpc24ndCBhbnkgc3BlY2lmaWMgcGF5bG9hZCB0eXBlIGZvciBhbnkgZ2l2ZW4gY29kZWMsIG9ubHkgc3VnZ2VzdGlvbnMuCisJICBGaXhlcyBidWcgIzMyNDAxMS4KKworMjAwNS0xMi0xMyAyMTo1ODo0MiArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogQ29kZSBjbGVhbnVwIGFuZCByZS1lbmFibGluZyBxdWV1ZWQgdGltZSB2YWxpZGl0eSBjaGVjayBmb3IgY29ycmVjdCBFT1MgaGFuZGxpbmcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTItMTMgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfaW5pdCksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9xdWV1ZXMpLCAoZ3N0X3ZpZGVvbWl4ZXJfYmxlbmRfYnVmZmVycyksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfY29sbGVjdGVkKTogQ29kZSBjbGVhbnVwIGFuZCByZS1lbmFibGluZworCSAgcXVldWVkIHRpbWUgdmFsaWRpdHkgY2hlY2sgZm9yIGNvcnJlY3QgRU9TIGhhbmRsaW5nLgorCisyMDA1LTEyLTEzIDE3OjE4OjMyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvb3NzL2dzdG9zc21peGVyZWxlbWVudC5jOiBBZGQgJ2RldmljZS1uYW1lJyBwcm9wZXJ0eSBhbmQgZml4IHN0YXRlIGNoYW5nZSBmdW5jdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3NzL2dzdG9zc21peGVyZWxlbWVudC5jOiAoZ3N0X29zc19taXhlcl9lbGVtZW50X2NsYXNzX2luaXQpLAorCSAgKGdzdF9vc3NfbWl4ZXJfZWxlbWVudF9nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9vc3NfbWl4ZXJfZWxlbWVudF9jaGFuZ2Vfc3RhdGUpOgorCSAgQWRkICdkZXZpY2UtbmFtZScgcHJvcGVydHkgYW5kIGZpeCBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24uCisKKzIwMDUtMTItMTMgMTA6NDU6MDQgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IElmIHRoZSBzcGVlZCBvZiB0aGUgZmlsZSBpcyBudWxsIGluIHRoZSBoZWFkZXIsIHNldCB0aGUgZnJhbWVfdGltZSB0byB0aGUgZGVmYXVsdCBzZXR0aW5nIG9mIEdTVC4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IChnc3RfZmx4ZGVjX2NoYWluKToKKwkgIElmIHRoZSBzcGVlZCBvZiB0aGUgZmlsZSBpcyBudWxsIGluIHRoZSBoZWFkZXIsIHNldCB0aGUgZnJhbWVfdGltZSB0byB0aGUgZGVmYXVsdAorCSAgc2V0dGluZyBvZiBHU1RfU0VDT05EIC8gNzAuIFdoaWNoIGlzIHRoZSBkZWZhdWx0IGZyYW1lX2RlbGF5IGZvciAuZmxpIGZpbGVzIGFzCisJICBzdGF0ZWQgaW4gdGhpcyBkb2N1bWVudCA6IGh0dHA6Ly93d3cuY29tcHVwaGFzZS5jb20vZmxpYy5odG0KKwkgIFdvdWxkIGJlIG5pY2UgdG8gaGF2ZSB0aGUgdGltZSBjb252ZXJzaW9uIGRvbmUgcHJvcGVybHkgdG9vCisJICAoZHVyYXRpb24gPSBmbHhoLT5mcmFtZXMgKiBmbHhkZWMtPmZyYW1lX3RpbWUpCisKKzIwMDUtMTItMTIgMjI6Mjk6MzQgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBBZGRpbmcgZG9jdW1lbnRhdGlvbiBmb3IgdmlkZW9taXhlciBvbiBteSB3YXkgd2l0aCBhIGZ1bm55IHNhbXBsZSBwaXBlbGluZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMi0xMiAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIChnc3RfdmlkZW9taXhlcl9wYWRfc2lua19zZXRjYXBzKSwKKwkgIChnc3RfdmlkZW9taXhlcl9nZXRjYXBzKSwgKGdzdF92aWRlb21peGVyX2ZpbGxfcXVldWVzKSwKKwkgIChnc3RfdmlkZW9taXhlcl91cGRhdGVfcXVldWVzKSwgKGdzdF92aWRlb21peGVyX2NvbGxlY3RlZCk6CisJICBBZGRpbmcKKwkgIGRvY3VtZW50YXRpb24gZm9yIHZpZGVvbWl4ZXIgb24gbXkgd2F5IHdpdGggYSBmdW5ueSBzYW1wbGUKKwkgIHBpcGVsaW5lLgorCisyMDA1LTEyLTEyIDIxOjQzOjAwICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiBGaXggY2FwcyBuZWdvdGlhdGlvbi4gKCMzMjM4OTYpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTItMTIgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgKGdzdF92aWRlb21peGVyX3BhZF9zaW5rX3NldGNhcHMpLAorCSAgKGdzdF92aWRlb21peGVyX2dldGNhcHMpLCAoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9xdWV1ZXMpLAorCSAgKGdzdF92aWRlb21peGVyX3VwZGF0ZV9xdWV1ZXMpLCAoZ3N0X3ZpZGVvbWl4ZXJfY29sbGVjdGVkKToKKwkgIEZpeCBjYXBzIG5lZ290aWF0aW9uLiAoIzMyMzg5NikKKworMjAwNS0xMi0xMiAxODoxNDo1OCArMDAwMCAgQXJ3ZWQgdi4gTWVya2F0eiA8di5tZXJrYXR6QGdteC5uZXQ+CisKKwkqIENoYW5nZUxvZzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgU2V0IGNvcnJlY3QgdGltZXN0YW1wcyBvbiBhdWRpbyBsYWNlcywgZml4ZXMgcGxheWJhY2sgb2YgbXAzIGZyb20gbWF0cm9za2EuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFNldCBjb3JyZWN0IHRpbWVzdGFtcHMgb24gYXVkaW8gbGFjZXMsIGZpeGVzIHBsYXliYWNrIG9mIG1wMyBmcm9tIG1hdHJvc2thLgorCisyMDA1LTEyLTEyIDEwOjQwOjQyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvOiBHc3RPYmplY3RzIG11c3QgYmUgdW5yZWYnZWQgd2l0aCBnc3Rfb2JqZWN0X3VucmVmKCkgaW5zdGVhZCBvZiBnX29iamVjdF91bnJlZigpLCBvdGhlcndpc2UgdGhpbmdzIGJyZWFrIGZvciBHTGkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvaXZvcmJpcy92b3JiaXNmaWxlLmM6IChnc3RfaXZvcmJpc2ZpbGVfbG9vcCk6CisJICAqIGV4dC9saWJtbXMvZ3N0bW1zLmM6IChnc3RfbW1zX3NyY19xdWVyeSksIChnc3RfbW1zX2NyZWF0ZSk6CisJICAqIGV4dC9tdXNlcGFjay9nc3RtdXNlcGFja2RlYy5jOiAoZ3N0X211c2VwYWNrZGVjX3NyY19xdWVyeSksCisJICAoZ3N0X211c2VwYWNrZGVjX2xvb3ApOgorCSAgKiBleHQvc3dmZGVjL2dzdHN3ZmRlYy5jOiAoZ3N0X3N3ZmRlY192aWRlb19saW5rKSwKKwkgIChnc3Rfc3dmZGVjX3NyY19xdWVyeSk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOiAoZ3N0X3dhdnBhY2tfcGFyc2Vfc3JjX3F1ZXJ5KToKKwkgIEdzdE9iamVjdHMgbXVzdCBiZSB1bnJlZidlZCB3aXRoIGdzdF9vYmplY3RfdW5yZWYoKSBpbnN0ZWFkIG9mCisJICBnX29iamVjdF91bnJlZigpLCBvdGhlcndpc2UgdGhpbmdzIGJyZWFrIGZvciBHTGliLTIuNiB1c2Vycy4KKworMjAwNS0xMi0xMiAxMDozMDoyMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS4qOiBVc2UgZ3N0X29iamVjdF91bnJlZigpIGZvciBHc3RPYmplY3RzIGluc3RlYWQgb2YgZ19vYmplY3RfdW5yZWYoKSBhbmQgZml4IGEgbWVtIGxlYWsgaW4gYSBkLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiAoZ3N0X2F1X3BhcnNlX2Jhc2VfaW5pdCksCisJICAoZ3N0X2F1X3BhcnNlX2NsYXNzX2luaXQpLCAoZ3N0X2F1X3BhcnNlX2luaXQpLAorCSAgKGdzdF9hdV9wYXJzZV9kaXNwb3NlKSwgKGdzdF9hdV9wYXJzZV9jaGFpbiksCisJICAoZ3N0X2F1X3BhcnNlX2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJICAqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuaDoKKwkgIFVzZSBnc3Rfb2JqZWN0X3VucmVmKCkgZm9yIEdzdE9iamVjdHMgaW5zdGVhZCBvZgorCSAgZ19vYmplY3RfdW5yZWYoKSBhbmQgZml4IGEgbWVtIGxlYWsgaW4gYSBkZWJ1ZworCSAgc3RhdGVtZW50OyB3aGlsZSB3ZSdyZSBhdCBpdCwgYWxzbyBib3JnaWZ5LCB1c2UKKwkgIGJvaWxlcnBsYXRlIG1hY3JvcyBhbmQgY2xlYW4gdXAgYSBsaXR0bGUgYml0LgorCisyMDA1LTEyLTExIDIwOjI3OjA2ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvZGVidWcvZWZlbmNlLmM6IEFkZGVkIHB1bGwgbW9kZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVidWcvZWZlbmNlLmM6IChnc3RfZWZlbmNlX2luaXQpLCAoZ3N0X2VmZW5jZV9nZXRyYW5nZSksCisJICAoZ3N0X2VmZW5jZV9jaGVja2dldHJhbmdlKSwgKGdzdF9lZmVuY2VfYWN0aXZhdGVfc3JjX3B1bGwpOgorCSAgQWRkZWQgcHVsbCBtb2RlLgorCisyMDA1LTEyLTExIDE5OjI1OjQxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvOiBVc2UgYXVkaW90ZXN0c3JjIGluc3RlYWQgb2Ygc2luZXNyYyAoIzMyMzc5OCkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSAgKiBnc3QvbGV2ZWwvbGV2ZWwtZXhhbXBsZS5jOiAobWFpbik6CisJICAqIGdzdC9zbW9vdGh3YXZlL2RlbW8tb3Nzc3JjLmM6IChtYWluKToKKwkgIFVzZSBhdWRpb3Rlc3RzcmMgaW5zdGVhZCBvZiBzaW5lc3JjICgjMzIzNzk4KS4KKworMjAwNS0xMi0xMSAxNzo1MDo1MCArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBzeXMvb3NzL2dzdG9zc3NpbmsuYzogbW9yZSBkZWJ1Zy1mdW5jLXB0ciB1c2FnZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc19zaW5rX2NsYXNzX2luaXQpOgorCSAgbW9yZSBkZWJ1Zy1mdW5jLXB0ciB1c2FnZQorCisyMDA1LTEyLTExIDE2OjQzOjQyICswMDAwICBaZWVzaGFuIEFsaSA8emVlbml4QGdtYWlsLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L2ZseC9mbHhfY29sb3IuYzoKKwkqIGdzdC9mbHgvZmx4X2NvbG9yLmg6CisJKiBnc3QvZmx4L2ZseF9mbXQuaDoKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5oOgorCSAgTm93IGZseGRlYyB3b3JrcyBvbiBiaWctZW5kaWFuIG1hY2hpbmVzIGFzIHdlbGwuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIE5vdyBmbHhkZWMgd29ya3Mgb24gYmlnLWVuZGlhbiBtYWNoaW5lcyBhcyB3ZWxsLgorCisyMDA1LTEyLTExIDE2OjE0OjIyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvZGVidWcvZWZlbmNlLmM6IE1ha2Ugc3VyZSBHU1RfQlVGRkVSX0RBVEEgaXMgc2V0IG9uIGZlbmNlZCBjb3BpZWQgYnVmZmVyczsgZml4CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlYnVnL2VmZW5jZS5jOiAoZ3N0X2VmZW5jZV9pbml0KSwgKGdzdF9lZmVuY2VfY2hhaW4pLAorCSAgKGdzdF9mZW5jZWRfYnVmZmVyX2NvcHkpOgorCSAgTWFrZSBzdXJlIEdTVF9CVUZGRVJfREFUQSBpcyBzZXQgb24gZmVuY2VkIGNvcGllZCBidWZmZXJzOyBmaXgKKwkgIEdTVF9ERUJVRyBjcmFzaGVyIHdoZXJlIEdTVF9USU1FX0ZPUk1BVCB3YXMgbm90IHVzZWQgaW4KKwkgIGNvbmp1bmN0aW9uIHdpdGggR1NUX1RJTUVfQVJHUy4gQWxzbywgZG9uJ3QgbGVhayBwYWQgdGVtcGxhdGVzCisJICBhbmQgdXNlIEdTVF9ERUJVR19GVU5DUFRSIGZvciBwYWQgZnVuY3Rpb25zLgorCisyMDA1LTEyLTEwIDIwOjI2OjMzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLio6IFJld3JpdGUgZmxhY2RlYyBhIGJpdCwgc28gdGhhdCBldmVuIHNlZWtpbmcgbWlnaHQgd29yayBub3cuIE1vc3QgaW1wb3J0YW50bHksIGRvbid0IGFjdCB1cG9uIGEuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY19kZWNfYmFzZV9pbml0KSwKKwkgIChnc3RfZmxhY19kZWNfY2xhc3NfaW5pdCksIChnc3RfZmxhY19kZWNfaW5pdCksCisJICAoZ3N0X2ZsYWNfZGVjX21ldGFkYXRhX2NhbGxiYWNrKSwgKGdzdF9mbGFjX2RlY19lcnJvcl9jYWxsYmFjayksCisJICAoZ3N0X2ZsYWNfZGVjX2VvZiksIChnc3RfZmxhY19kZWNfd3JpdGUpLCAoZ3N0X2ZsYWNfZGVjX2xvb3ApLAorCSAgKGdzdF9mbGFjX2RlY19jb252ZXJ0X3NyYyksIChnc3RfZmxhY19kZWNfZ2V0X3NyY19xdWVyeV90eXBlcyksCisJICAoZ3N0X2ZsYWNfZGVjX3NyY19xdWVyeSksIChnc3RfZmxhY19kZWNfc2VuZF9uZXdzZWdtZW50KSwKKwkgIChnc3RfZmxhY19kZWNfaGFuZGxlX3NlZWtfZXZlbnQpLCAoZ3N0X2ZsYWNfZGVjX3NyY19ldmVudCksCisJICAoZ3N0X2ZsYWNfZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkgIFJld3JpdGUgZmxhY2RlYyBhIGJpdCwgc28gdGhhdCBldmVuIHNlZWtpbmcgbWlnaHQgd29yayBub3cuIE1vc3QKKwkgIGltcG9ydGFudGx5LCBkb24ndCBhY3QgdXBvbiBhbnkgZmxvdyByZXR1cm4gdmFsdWVzIHdlIGdldCwganVzdCB0ZWxsCisJICB0aGUgZGVjb2RlciBldmVyeXRoaW5nJ3MgZGFuZHkgYW5kIGFjdCBvbiB0aGUgZmxvdyByZXR1cm4gdmFsdWVzCisJICBsYXRlciBvbiBpbiB0aGUgbG9vcCBmdW5jdGlvbi4gV2UgZG9uJ3Qgd2FudCB0byBtZXNzIHVwIHRoZSBpbnRlcm5hbAorCSAgZGVjb2RlciBzdGF0ZSBmb3Igbm9uLWZhdGFsIHRoaW5ncyBsaWtlIGZsdXNoaW5nIHBhZHMgZXRjLiBPdGhlcgorCSAgdGhhbiB0aGF0LCB1c2UgR3N0U2VnbWVudCAoc2VnbWVudCBzZWVrcyBkb24ndCB3b3JrIHlldCB0aG91Z2gsIGJ1dAorCSAgc2hvdWxkIGJlIGVhc3kgdG8gYWRkKSwgdXNlIGJvaWxlcnBsYXRlIG1hY3JvcywgZHJvcCB0aGUgc3VwZXJmbHVvdXMKKwkgICdmbGFjZGVjOicgZnJvbSBkZWJ1ZyBtZXNzYWdlcywgdXNlIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQsIGFuZAorCSAgbG90cyBvZiBvdGhlciB0aGluZ3MuCisKKzIwMDUtMTItMTAgMTQ6NTc6NDggKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGNvbmZpZ3VyZS5hYzogVXBkYXRlIGNvbW1lbnQgaW4gT1NTIGluY2x1ZGVzIGNoZWNrLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIFVwZGF0ZSBjb21tZW50IGluIE9TUyBpbmNsdWRlcyBjaGVjay4KKwkgICogc3lzL29zcy9nc3Rvc3NkbWFidWZmZXIuYzoKKwkgICogc3lzL29zcy9nc3Rvc3NoZWxwZXIuYzoKKwkgICogc3lzL29zcy9nc3Rvc3NtaXhlci5jOgorCSAgKiBzeXMvb3NzL2dzdG9zc21peGVydHJhY2suYzoKKwkgICogc3lzL29zcy9nc3Rvc3NzaW5rLmM6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6CisJICAqIHN5cy9vc3Mvb3NzX3Byb2JlLmM6CisJICBEb24ndCBhc3N1bWUgdGhlIE9TUyBzb3VuZGNhcmQuaCBpbmNsdWRlIGlzIGFsd2F5cyBpbgorCSAgdGhlIHN5cy8gZGlyZWN0b3J5LiBJbnN0ZWFkLCB1c2UgdGhlIGV4aXN0aW5nIGRlZmluZXMKKwkgIGZyb20gY29uZmlnLmggdG8gaW5jbHVkZSB0aGUgcmlnaHQgZmlsZS4gRml4ZXMKKwkgIGNvbXBpbGF0aW9uIG9uIE9wZW5CU0QgMy44ICgjMzIzNzE4KS4KKworMjAwNS0xMi0wOSAxOTo1MTowMyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJKiBleHQvZmxhYy9nc3RmbGFjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmg6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmg6CisJICBib3JnaWZ5IGFuZCBmaXggdXAgZG9jdW1lbnRhdGlvbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBib3JnaWZ5IGFuZCBmaXggdXAgZG9jdW1lbnRhdGlvbgorCisyMDA1LTEyLTA5IDE1OjMwOjIxICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZXh0L2ZhYWQvZ3N0ZmFhZC5jOiBBc3N1bWUgdGhhdCBhbiB1bmtub3duIGNoYW5uZWwgbWFwcGluZyB3aXRoIDIgY2hhbm5lbHMgaXMgc3RlcmVvIGFuZCBwbGF5IGl0IHRoYXQgd2F5IGluc3RlYWQgb2YgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfY2hhbnBvc190b19nc3QpLAorCSAgKGdzdF9mYWFkX3VwZGF0ZV9jYXBzKToKKwkgIEFzc3VtZSB0aGF0IGFuIHVua25vd24gY2hhbm5lbCBtYXBwaW5nIHdpdGggMiBjaGFubmVscworCSAgaXMgc3RlcmVvIGFuZCBwbGF5IGl0IHRoYXQgd2F5IGluc3RlYWQgb2YgZXJyb3JpbmcuCisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwKKwkgIChnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBIYW5kbGUgZS5nLiBqcGVnIHN0cmVhbXMgd2l0aCAwIGR1cmF0aW9uIGZyYW1lcyBhcyBoYXZpbmcgMCBmcmFtZXJhdGUuCisJICBEZWJ1ZyBmaXhlcy4gU29tZSA2NCBiaXQgdmFyaWFibGUgZml4ZXMKKworMjAwNS0xMi0wOSAxMToxMjo0OCArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IEFjY2VwdCBhIHdpZGVyIHJhbmdlIG9mIGZsYWMgZmlsZXMsIG1vcmUgY2xvc2VseSBtYXRjaGluZyBmbGFjIHNwCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAocmF3X2NhcHNfZmFjdG9yeSksIChnc3RfZmxhY2RlY193cml0ZSk6CisJICBBY2NlcHQgYSB3aWRlciByYW5nZSBvZiBmbGFjIGZpbGVzLCBtb3JlIGNsb3NlbHkgbWF0Y2hpbmcgZmxhYyBzcAorCisyMDA1LTEyLTA4IDE2OjI3OjEyICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOiBBZGQgbXVsdGlwYXJ0IGVsZW1lbnRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEyLTA4ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbTogQWRkIG11bHRpcGFydCBlbGVtZW50cy4KKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OiBGaXggZmxhYy4KKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzoKKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogQWRkIGRvY3MuCisKKzIwMDUtMTItMDcgMTE6NDY6MTUgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogTWVtbGVhayBmaXhlcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX2hlYWRlciksCisJICAoZ3N0X3F0ZGVtdXhfYWRkX3N0cmVhbSk6CisJICBNZW1sZWFrIGZpeGVzLgorCSAgU2VuZCBvdXQgRU9TIGZvciB2YWxpZCByZWFzb25zIChjb3VsZG4ndCBwdWxsX3JhbmdlKCkgZnJvbSB1cHN0cmVhbQorCSAgZm9yIGV4YW1wbGUpLgorCisyMDA1LTEyLTA3IDExOjQwOjQ2ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IE1lbWxlYWsgYW5kIGNyYXNoZXIgZml4ZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX2V2ZW50KSwKKwkgIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpLAorCSAgKGdzdF9hdmlfZGVtdXhfaW52ZXJ0KToKKwkgIE1lbWxlYWsgYW5kIGNyYXNoZXIgZml4ZXMuCisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2Jhc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhcnNlX2NyZWF0ZV9zb3VyY2VwYWQpLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKToKKwkgIE1lbWxlYWsgZml4ZXMKKworMjAwNS0xMi0wNiAxOTo1NTo1OCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuaDoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuaDoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuaDoKKwkgIGV4cGFuZCB0YWJzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGV4cGFuZCB0YWJzCisKKzIwMDUtMTItMDYgMTk6NDQ6NTggKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmg6CisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuaDoKKwkqIGV4dC9kdi9nc3RkdmRlYy5oOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9kdi9nc3RkdmRlbXV4Lmg6CisJKiBleHQvZXNkL2VzZHNpbmsuaDoKKwkqIGV4dC9mbGFjL2ZsYWNfY29tcGF0Lmg6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmg6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmg6CisJKiBleHQvZ2NvbmYvZ2NvbmYuaDoKKwkqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5oOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zaW5rLmg6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGthbmltYXRpb24uaDoKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkqIGV4dC9qcGVnL3Ntb2tlY29kZWMuaDoKKwkqIGV4dC9qcGVnL3Ntb2tlZm9ybWF0Lmg6CisJKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5oOgorCSogZXh0L2xhZHNwYS9zZWFyY2guYzoKKwkqIGV4dC9sYWRzcGEvdXRpbHMuaDoKKwkqIGV4dC9saWJtbmcvZ3N0bW5nZGVjLmg6CisJKiBleHQvbGlibW5nL2dzdG1uZ2VuYy5jOgorCSogZXh0L2xpYm1uZy9nc3RtbmdlbmMuaDoKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5oOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuaDoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5oOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuaDoKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuaDoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuaDoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmg6CisJKiBnc3QvZGVidWcvdGVzdHMuYzoKKwkqIGdzdC9kZWJ1Zy90ZXN0cy5oOgorCSogZ3N0L2VmZmVjdHYvZ3N0d2FycC5jOgorCSogZ3N0L2ZseC9mbHhfZm10Lmg6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5oOgorCSogZ3N0L2dvb20vZmlsdGVycy5jOgorCSogZ3N0L2dvb20vZmlsdGVycy5oOgorCSogZ3N0L2dvb20vZ29vbV90b29scy5oOgorCSogZ3N0L2xhdy9hbGF3LWVuY29kZS5jOgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuaDoKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkqIGdzdC9tb25vc2NvcGUvY29udm9sdmUuYzoKKwkqIGdzdC9tb25vc2NvcGUvY29udm9sdmUuaDoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6CisJKiBnc3Qvb2xkY29yZS9nc3RhZ2dyZWdhdG9yLmM6CisJKiBnc3Qvb2xkY29yZS9nc3RhZ2dyZWdhdG9yLmg6CisJKiBnc3Qvb2xkY29yZS9nc3RtZDVzaW5rLmM6CisJKiBnc3Qvb2xkY29yZS9nc3RtZDVzaW5rLmg6CisJKiBnc3Qvb2xkY29yZS9nc3RtdWx0aWZpbGVzcmMuYzoKKwkqIGdzdC9vbGRjb3JlL2dzdG11bHRpZmlsZXNyYy5oOgorCSogZ3N0L29sZGNvcmUvZ3N0cGlwZWZpbHRlci5oOgorCSogZ3N0L29sZGNvcmUvZ3N0c2hhcGVyLmg6CisJKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cEwxNnBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuaDoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmg6CisJKiBnc3QvcnRzcC9ydHNwZGVmcy5oOgorCSogZ3N0L3J0c3AvcnRzcG1lc3NhZ2UuaDoKKwkqIGdzdC9ydHNwL3J0c3B0cmFuc3BvcnQuaDoKKwkqIGdzdC9ydHNwL3J0c3B1cmwuYzoKKwkqIGdzdC9ydHNwL3J0c3B1cmwuaDoKKwkqIGdzdC9ydHNwL3NkcG1lc3NhZ2UuYzoKKwkqIGdzdC9ydHNwL3NkcG1lc3NhZ2UuaDoKKwkqIGdzdC9zbXB0ZS9iYXJib3h3aXBlcy5jOgorCSogZ3N0L3NtcHRlL2dzdG1hc2suaDoKKwkqIGdzdC9zbXB0ZS9nc3RzbXB0ZS5oOgorCSogZ3N0L3NtcHRlL3BhaW50LmM6CisJKiBnc3Qvc21wdGUvcGFpbnQuaDoKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5oOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmg6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSogZ3N0L3dhdmVuYy9yaWZmLmg6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwkqIHN5cy9vc3MvZ3N0b3NzZG1hYnVmZmVyLmg6CisJKiBzeXMvb3NzL2dzdG9zc21peGVyLmg6CisJKiBzeXMvb3NzL2dzdG9zc21peGVyZWxlbWVudC5oOgorCSogc3lzL29zcy9nc3Rvc3NtaXhlcnRyYWNrLmg6CisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5oOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmg6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50Lmg6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmg6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zcmMuaDoKKwkgIGV4cGFuZCB0YWJzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGV4cGFuZCB0YWJzCisKKzIwMDUtMTItMDUgMTg6MTI6MDcgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBiYWNrIHRvIEhFQUQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYmFjayB0byBIRUFECisKKz09PSByZWxlYXNlIDAuMTAuMCA9PT0KKworMjAwNS0xMi0wNSAxODowMzoyMyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWN1dHRlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmVuY2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZseGRlYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1hdHJvc2thLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICByZWxlYXNpbmcgMC4xMC4wCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbGVhc2luZyAwLjEwLjAKKworMjAwNS0xMi0wNSAxODowMTo0OCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdGRlbXV4LnhtbDoKKwkgIHJlbGVhc2luZyAwLjEwLjAKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmVsZWFzaW5nIDAuMTAuMAorCisyMDA1LTEyLTA1IDE2OjIxOjA4ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA1LTEyLTA1IDE1OjA4OjQ2ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogTWFrZWZpbGUuYW06CisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vY3MucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJICB1cGRhdGUgdHJhbnNsYXRpb25zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAwNS0xMi0wNSAxMzowNDoyMiArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBVcGRhdGUgZm9yIGFsbG9jX2J1ZmZlciBjaGFuZ2VzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEyLTA1ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBleHQvZmFhYy9nc3RmYWFjLmM6IChnc3RfZmFhY19zaW5rX2V2ZW50KSwgKGdzdF9mYWFjX2NoYWluKToKKwkgICogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfY2hhaW4pOgorCSAgKiBleHQvaGVybWVzL2dzdGhlcm1lc2NvbG9yc3BhY2UuYzogKGdzdF9oZXJtZXNfY29sb3JzcGFjZV9jaGFpbik6CisJICAqIGV4dC9sY3MvZ3N0Y29sb3JzcGFjZS5jOiAoZ3N0X2NvbG9yc3BhY2VfY2hhaW4pOgorCSAgKiBleHQveGluZS94aW5laW5wdXQuYzogKGdzdF94aW5lX2lucHV0X2dldCk6CisJICAqIGdzdC9jb2xvcnNwYWNlL2dzdGNvbG9yc3BhY2UuYzogKGdzdF9jb2xvcnNwYWNlX2NoYWluKToKKwkgICogZ3N0L3NwZWVkL2dzdHNwZWVkLmM6IChzcGVlZF9jaGFpbik6CisJICAqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6IChnc3RfdmlkZW9fY3JvcF9jaGFpbik6IFVwZGF0ZSBmb3IKKwkgIGFsbG9jX2J1ZmZlciBjaGFuZ2VzLgorCisyMDA1LTEyLTA1IDEzOjAzOjAwICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIFVwZGF0ZSBmb3IgYWxsb2NfYnVmZmVyIGNoYW5nZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTItMDUgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIGV4dC9kdi9nc3RkdmRlYy5jOiAoZ3N0X2R2ZGVjX2NoYWluKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNkZWNfd3JpdGUpOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY2VuY193cml0ZV9jYWxsYmFjayk6CisJICAqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOiAoZ3N0X2dka19waXhidWZfY2hhaW4pOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOiAoZ3N0X3BpeGJ1ZnNjYWxlX2NoYWluKToKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdfZGVjX2NoYWluKToKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOiAoZ3N0X2pwZWdlbmNfY2hhaW4pOgorCSAgKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5jOiAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfcHJvY2Vzcyk6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6ICh1c2VyX2luZm9fY2FsbGJhY2spLCAoZ3N0X3BuZ2RlY190YXNrKToKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IChzcGVleF9kZWNfY2hhaW4pOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleGVuY19jaGFpbik6CisJICAqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzogKGdzdF9hdXBhcnNlX2NoYWluKToKKwkgICogZ3N0L2ZseC9nc3RmbHhkZWMuYzogKGdzdF9mbHhkZWNfY2hhaW4pOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9jaGFpbik6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wdXNoX3ZvcmJpc19jb2RlY19wcml2X2RhdGEpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfd3Zwa19oZWFkZXIpOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6IChnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYWluKToKKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogKGdzdF9tdWx0aXBhcnRfbXV4X2NvbGxlY3RlZCk6CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogKGdzdF92aWRlb21peGVyX2NvbGxlY3RlZCk6CisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX2NoYWluKTogVXBkYXRlIGZvcgorCSAgYWxsb2NfYnVmZmVyIGNoYW5nZXMuCisKKzIwMDUtMTItMDUgMTI6MjM6MjIgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOiBSZW1vdmUgYXJncyBmb3IgcGx1Z2lucyB0aGF0IGFyZW4ndCBpbiAtZ29vZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJICBSZW1vdmUgYXJncyBmb3IgcGx1Z2lucyB0aGF0IGFyZW4ndCBpbiAtZ29vZC4KKworMjAwNS0xMi0wNCAyMjoyNjowNyArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICByZW1vdmUgcGFuZ28gcGx1Z2luIGFzIGl0cyBnb25lIGludG8gYmFzZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZW1vdmUgcGFuZ28gcGx1Z2luIGFzIGl0cyBnb25lIGludG8gYmFzZQorCisyMDA1LTEyLTAzIDE4OjUxOjQ4ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSAgZml4IGVsZW1lbnQgZGVzY3JpcHRpb25zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCBlbGVtZW50IGRlc2NyaXB0aW9ucworCisyMDA1LTEyLTAzIDE4OjUwOjEyICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZkc3JjLnhtbDoKKwkgIHJlbW92ZSBmZHNyYyBkb2NzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbW92ZSBmZHNyYyBkb2NzCisKKzIwMDUtMTItMDEgMTk6MTg6MDggKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBiYWNrIHRvIEhFQUQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYmFjayB0byBIRUFECisKKz09PSByZWxlYXNlIDAuOS43ID09PQorCisyMDA1LTEyLTAxIDE5OjE0OjI2ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkgIHJlbGVhc2luZyAwLjkuNworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZWxlYXNpbmcgMC45LjcKKworMjAwNS0xMi0wMSAxOToxMzoyMCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1xdGRlbXV4LnhtbDoKKwkgIHJlbGVhc2luZyAwLjkuNworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZWxlYXNpbmcgMC45LjcKKworMjAwNS0xMi0wMSAxNzo1MzoyOSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGNvbW1vbjoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAwNS0xMi0wMSAxNTozNDoxMyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGRvY3MvcGx1Z2lucy8uZ2l0aWdub3JlOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSAgYWRkIG11bHRpcGFydCBwbHVnaW4gdG8gZG9jcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgbXVsdGlwYXJ0IHBsdWdpbiB0byBkb2NzCisKKzIwMDUtMTItMDEgMTU6MjI6MjUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvcGFuZ28vTWFrZWZpbGUuYW06CisJKiBleHQvcGFuZ28vZ3N0Y2xvY2tvdmVybGF5LmM6CisJKiBleHQvcGFuZ28vZ3N0Y2xvY2tvdmVybGF5Lmg6CisJKiBleHQvcGFuZ28vZ3N0dGV4dG92ZXJsYXkuYzoKKwkqIGV4dC9wYW5nby9nc3R0ZXh0b3ZlcmxheS5oOgorCSogZXh0L3BhbmdvL2dzdHRleHRyZW5kZXIuYzoKKwkqIGV4dC9wYW5nby9nc3R0ZXh0cmVuZGVyLmg6CisJKiBleHQvcGFuZ28vZ3N0dGltZW92ZXJsYXkuYzoKKwkqIGV4dC9wYW5nby9nc3R0aW1lb3ZlcmxheS5oOgorCSAgbW92ZSBwYW5nbyB0byBiYXNlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIG1vdmUgcGFuZ28gdG8gYmFzZQorCisyMDA1LTEyLTAxIDE0OjM5OjMwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgZ3N0L3J0cC86IHBhcnNlcnMgYXJlIGRlcGF5ZXJzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cEwxNmRlcGF5Lmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwTDE2cGFyc2UuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBMMTZwYXJzZS5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBnc21wYXJzZS5jOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbXBhcnNlLmg6CisJICBwYXJzZXJzIGFyZSBkZXBheWVycworCisyMDA1LTEyLTAxIDE0OjMwOjAxICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogY29tbW9uOgorCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmM6CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBMMTZlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2ZW5jLmg6CisJKiBnc3QvcnRwL2dzdHJ0cEwxNnBhcnNlLmM6CisJKiBnc3QvcnRwL2dzdHJ0cEwxNnBhcnNlLmg6CisJKiBnc3QvcnRwL2dzdHJ0cEwxNnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlYy5oOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBhbXJlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZW5jLmg6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGRlYy5oOgorCSogZ3N0L3J0cC9nc3RydHBkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzExZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFkZWMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzExZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFlbmMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzExcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21lbmMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGFyc2UuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGFyc2UuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNlbmMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVjLmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGVuYy5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2ZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZWMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2ZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZlbmMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlYy5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFkZWMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWVuYy5oOgorCSogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVjLmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGVuYy5oOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleHBheS5oOgorCSAgRG8gYnVyZ2VyJ3MgcmVuYW1lIGZvciBydHAgcGF5bG9hZGVycyBhbmQgZGVwYXlsb2FkZXJzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIERvIGJ1cmdlcidzIHJlbmFtZSBmb3IgcnRwIHBheWxvYWRlcnMgYW5kIGRlcGF5bG9hZGVycworCisyMDA1LTExLTMwIDE5OjAyOjM1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBleHQvZHYvOiBGaXggc2Vla2luZyBpbiBkdmRlbXV4IGFnYWluLCBhZGQgc29tZSBtb3JlIGRlYnVnIGluZm8uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfY2hhaW4pOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5jOiAoZ3N0X2R2ZGVtdXhfZGVtdXhfZnJhbWUpOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5oOgorCSAgRml4IHNlZWtpbmcgaW4gZHZkZW11eCBhZ2FpbiwgYWRkIHNvbWUgbW9yZSBkZWJ1ZyBpbmZvLgorCisyMDA1LTExLTMwIDE4OjQ4OjU2ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogY29uZmlndXJlLmFjOgorCSAgZml4IHRlc3RzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCB0ZXN0cworCisyMDA1LTExLTMwIDE4OjQwOjE5ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogTWFrZWZpbGUuYW06CisJICBhZGQgdGVzdHMgc3ViZGlyCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCB0ZXN0cyBzdWJkaXIKKworMjAwNS0xMS0zMCAxODozNjowMiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgYWRkIE1ha2VmaWxlLmFtCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCBNYWtlZmlsZS5hbQorCisyMDA1LTExLTMwIDE4OjI4OjUzICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgbW92ZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIFBPUlRFRF8wOToKKwkgICogZG9jcy9yYW5kb20vUE9SVEVEXzA5OgorCSAgbW92ZQorCSAgKiB0ZXN0cy9NYWtlZmlsZS5hbToKKwkgIGFkZAorCSAgKiB3aW4zMi9nc3Quc2xuOgorCSAgcmVtb3ZlCisKKzIwMDUtMTEtMzAgMTg6MjQ6MDggKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBNYWtlZmlsZS5hbToKKwkqIGNoZWNrLy5naXRpZ25vcmU6CisJKiBjaGVjay9NYWtlZmlsZS5hbToKKwkqIGNoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiBjaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSogY2hlY2svZWxlbWVudHMvbWF0cm9za2FtdXguYzoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4YW1wbGVzL01ha2VmaWxlLmFtOgorCSogZXhhbXBsZXMvY2Fwc2ZpbHRlci9NYWtlZmlsZS5hbToKKwkqIGV4YW1wbGVzL2NhcHNmaWx0ZXIvY2Fwc2ZpbHRlcjEuYzoKKwkqIGV4YW1wbGVzL2dvYi9NYWtlZmlsZS5hbToKKwkqIGV4YW1wbGVzL2dvYi9nc3QtaWRlbnRpdHkyLmdvYjoKKwkqIGV4YW1wbGVzL2dzdHBsYXkvLmdpdGlnbm9yZToKKwkqIGV4YW1wbGVzL2dzdHBsYXkvTWFrZWZpbGUuYW06CisJKiBleGFtcGxlcy9nc3RwbGF5L3BsYXllci5jOgorCSogZXhhbXBsZXMvaW5kZXhpbmcvLmdpdGlnbm9yZToKKwkqIGV4YW1wbGVzL2luZGV4aW5nL01ha2VmaWxlLmFtOgorCSogZXhhbXBsZXMvaW5kZXhpbmcvaW5kZXhtcGVnLmM6CisJKiBleGFtcGxlcy9sZXZlbC9NYWtlZmlsZS5hbToKKwkqIGV4YW1wbGVzL2xldmVsL1JFQURNRToKKwkqIGV4YW1wbGVzL2xldmVsL2RlbW8uYzoKKwkqIGV4YW1wbGVzL2xldmVsL3Bsb3QuYzoKKwkqIGV4YW1wbGVzL3N0YXRzL01ha2VmaWxlLmFtOgorCSogZXhhbXBsZXMvc3RhdHMvbXAyb2dnLmM6CisJKiBleGFtcGxlcy9zd2l0Y2gvLmdpdGlnbm9yZToKKwkqIGV4YW1wbGVzL3N3aXRjaC9NYWtlZmlsZS5hbToKKwkqIGV4YW1wbGVzL3N3aXRjaC9zd2l0Y2hlci5jOgorCSAgbW92ZSB1bmRlciB0ZXN0cworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBtb3ZlIHVuZGVyIHRlc3RzCisKKzIwMDUtMTEtMzAgMTY6NTc6NTcgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogY29tbW9uOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgdXBkYXRlIGZvciBsYXRlc3QgY2hhbmdlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICB1cGRhdGUgZm9yIGxhdGVzdCBjaGFuZ2VzCisKKzIwMDUtMTEtMzAgMTQ6NTM6MjkgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9wYW5nby9nc3R0ZXh0cmVuZGVyLio6IEFkZCBtaXNzaW5nIGZpbGVzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9wYW5nby9nc3R0ZXh0cmVuZGVyLmM6IChnc3RfdGV4dF9yZW5kZXJfYmFzZV9pbml0KSwKKwkgIChnc3RfdGV4dF9yZW5kZXJfY2xhc3NfaW5pdCksIChyZXNpemVfYml0bWFwKSwKKwkgIChnc3RfdGV4dF9yZW5kZXJfcmVuZGVyX3RleHQpLCAoZ3N0X3RleHRfcmVuZGVyX3NldGNhcHMpLAorCSAgKGdzdF90ZXh0X3JlbmRlcl9maXhhdGVfY2FwcyksIChnc3RfdGV4dF9yZW5kZXJlcl9iaXRtYXBfdG9fYXl1diksCisJICAoZ3N0X3RleHRfcmVuZGVyX2NoYWluKSwgKGdzdF90ZXh0X3JlbmRlcl9maW5hbGl6ZSksCisJICAoZ3N0X3RleHRfcmVuZGVyX2luaXQpLCAoZ3N0X3RleHRfcmVuZGVyX3NldF9wcm9wZXJ0eSk6CisJICAqIGV4dC9wYW5nby9nc3R0ZXh0cmVuZGVyLmg6CisJICBBZGQgbWlzc2luZyBmaWxlcy4KKworMjAwNS0xMS0zMCAxMzoyMDo1NyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgUG9ydCBwYW5nby1iYXNlZCB0ZXh0b3ZlcmxheSwgdGltZW92ZXJsYXkgYW5kIHRleHRyZW5kZXIgdG8gMC45IGFuZCBhZGQgYmFja2dyb3VuZCBzaGFkaW5nIGFuZCB0ZXh0IHdyYXBwaW5nIG1vZGVzLiBNLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBleHQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9wYW5nby9NYWtlZmlsZS5hbToKKwkgICogZXh0L3BhbmdvL2dzdGNsb2Nrb3ZlcmxheS5jOiAoZ3N0X2Nsb2NrX292ZXJsYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfY2xvY2tfb3ZlcmxheV9yZW5kZXJfdGltZSksIChnc3RfY2xvY2tfb3ZlcmxheV9nZXRfdGV4dCksCisJICAoZ3N0X2Nsb2NrX292ZXJsYXlfY2xhc3NfaW5pdCksIChnc3RfY2xvY2tfb3ZlcmxheV9pbml0KToKKwkgICogZXh0L3BhbmdvL2dzdGNsb2Nrb3ZlcmxheS5oOgorCSAgKiBleHQvcGFuZ28vZ3N0dGV4dG92ZXJsYXkuYzogKGdzdF90ZXh0X292ZXJsYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X2dldF90ZXh0KSwgKGdzdF90ZXh0X292ZXJsYXlfY2xhc3NfaW5pdCksCisJICAoZ3N0X3RleHRfb3ZlcmxheV9maW5hbGl6ZSksIChnc3RfdGV4dF9vdmVybGF5X2luaXQpLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfdXBkYXRlX3dyYXBfbW9kZSksIChnc3RfdGV4dF9vdmVybGF5X3NldGNhcHMpLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfdGV4dF9wYWRfbGlua2VkKSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X3RleHRfcGFkX3VubGlua2VkKSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X3NldF9wcm9wZXJ0eSksIChnc3RfdGV4dF9vdmVybGF5X2dldGNhcHMpLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfc2hhZGVfeSksIChnc3RfdGV4dF9vdmVybGF5X2JsaXRfeXV2NDIwKSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X3Jlc2l6ZV9iaXRtYXApLCAoZ3N0X3RleHRfb3ZlcmxheV9yZW5kZXJfdGV4dCksCisJICAoZ3N0X3RleHRfb3ZlcmxheV9wdXNoX2ZyYW1lKSwgKGdzdF90ZXh0X292ZXJsYXlfcG9wX3ZpZGVvKSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X3BvcF90ZXh0KSwgKGdzdF90ZXh0X292ZXJsYXlfY29sbGVjdGVkKSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJICAqIGV4dC9wYW5nby9nc3R0ZXh0b3ZlcmxheS5oOgorCSAgKiBleHQvcGFuZ28vZ3N0dGltZW92ZXJsYXkuYzogKGdzdF90aW1lX292ZXJsYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfdGltZV9vdmVybGF5X3JlbmRlcl90aW1lKSwgKGdzdF90aW1lX292ZXJsYXlfZ2V0X3RleHQpLAorCSAgKGdzdF90aW1lX292ZXJsYXlfY2xhc3NfaW5pdCksIChnc3RfdGltZV9vdmVybGF5X2luaXQpOgorCSAgKiBleHQvcGFuZ28vZ3N0dGltZW92ZXJsYXkuaDoKKwkgIFBvcnQgcGFuZ28tYmFzZWQgdGV4dG92ZXJsYXksIHRpbWVvdmVybGF5IGFuZCB0ZXh0cmVuZGVyIHRvIDAuOQorCSAgYW5kIGFkZCBiYWNrZ3JvdW5kIHNoYWRpbmcgYW5kIHRleHQgd3JhcHBpbmcgbW9kZXMuIE1ha2UKKwkgIHRpbW92ZXJsYXkgZGVyaXZlIGZyb20gdGV4dG92ZXJsYXkuIEFsc28gYWRkIG5ldyBjbG9ja292ZXJsYXkKKwkgIGVsZW1lbnQuCisKKzIwMDUtMTEtMzAgMTE6MTA6MDEgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvdWRwL01ha2VmaWxlLmFtOiBNb3ZlZCB0byBuZXRidWZmZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTEtMzAgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L3VkcC9NYWtlZmlsZS5hbTogTW92ZWQgdG8gbmV0YnVmZmVyLgorCisyMDA1LTExLTMwIDEwOjE4OjQyICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgUG9ydGVkIG11bHRpcGFydCBtdXgvZGVtdXggdG8gMC45LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTExLTMwICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogUE9SVEVEX085OgorCSAgKiBnc3QvbXVsdGlwYXJ0L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6CisJICAoZ3N0X211bHRpcGFydF9kZW11eF9iYXNlX2luaXQpLAorCSAgKGdzdF9tdWx0aXBhcnRfZGVtdXhfY2xhc3NfaW5pdCksIChnc3RfbXVsdGlwYXJ0X2RlbXV4X2luaXQpLAorCSAgKGdzdF9tdWx0aXBhcnRfZmluZF9wYWRfYnlfbWltZSksIChnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYWluKSwKKwkgIChnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X211bHRpcGFydF9kZW11eF9wbHVnaW5faW5pdCk6CisJICAqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IChnc3RfbXVsdGlwYXJ0X211eF9jbGFzc19pbml0KSwKKwkgIChnc3RfbXVsdGlwYXJ0X211eF9pbml0KSwgKGdzdF9tdWx0aXBhcnRfbXV4X2ZpbmFsaXplKSwKKwkgIChnc3RfbXVsdGlwYXJ0X211eF9zaW5rY29ubmVjdCksCisJICAoZ3N0X211bHRpcGFydF9tdXhfcmVxdWVzdF9uZXdfcGFkKSwKKwkgIChnc3RfbXVsdGlwYXJ0X211eF9oYW5kbGVfc3JjX2V2ZW50KSwKKwkgIChnc3RfbXVsdGlwYXJ0X211eF9xdWV1ZV9wYWRzKSwgKGdzdF9tdWx0aXBhcnRfbXV4X2NvbGxlY3RlZCksCisJICAoZ3N0X211bHRpcGFydF9tdXhfY2hhbmdlX3N0YXRlKTogUG9ydGVkIG11bHRpcGFydCBtdXgvZGVtdXggdG8KKwkgIDAuOS4KKworMjAwNS0xMS0zMCAwODoyNjo0NyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGdzdC86IHVwZGF0ZSBmb3Igc3ltYm9scyBjaGFuZ2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVidWcvZ3N0bmF2aWdhdGlvbnRlc3QuYzogKGdzdF9uYXZpZ2F0aW9udGVzdF9nZXRfdHlwZSk6CisJICAqIGdzdC9kZWJ1Zy9nc3RuYXZpZ2F0aW9udGVzdC5oOgorCSAgKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOiAoZ3N0X2FnaW5ndHZfZ2V0X3R5cGUpOgorCSAgKiBnc3QvZWZmZWN0di9nc3RkaWNlLmM6IChnc3RfZGljZXR2X2dldF90eXBlKToKKwkgICogZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5jOiAoZ3N0X2VkZ2V0dl9nZXRfdHlwZSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6IChnc3RfcXVhcmt0dl9nZXRfdHlwZSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdHJldi5jOiAoZ3N0X3JldnR2X2dldF90eXBlKToKKwkgICogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOiAoZ3N0X3NoYWdhZGVsaWN0dl9nZXRfdHlwZSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzogKGdzdF92ZXJ0aWdvdHZfZ2V0X3R5cGUpOgorCSAgKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6IChnc3Rfd2FycHR2X2dldF90eXBlKToKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOiAoZ3N0X3ZpZGVvX2ZsaXBfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfdmlkZW9fZmxpcF9nZXRfdHlwZSk6CisJICAqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaDoKKwkgIHVwZGF0ZSBmb3Igc3ltYm9scyBjaGFuZ2UKKworMjAwNS0xMS0yOSAxNzo0NjowNCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGdzdC91ZHAvOiB0aGUgb2xkIGdzdG5ldCBsaWIgd2FzIHJlbmFtZWQgZ3N0bmV0YnVmZmVyICgjMzIyMjU3KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgdGhlIG9sZCBnc3RuZXQgbGliIHdhcyByZW5hbWVkIGdzdG5ldGJ1ZmZlciAoIzMyMjI1NykKKworMjAwNS0xMS0yOSAxNTo0MjowMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6IEFjdHVhbGx5IHJlbmRlciB0aGUgdGV4dCBmcm9tIHRoZSB0ZXh0IHBhZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzogKGdzdF90ZXh0X292ZXJsYXlfcmVuZGVyX3RleHQpLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfY29sbGVjdGVkKToKKwkgIEFjdHVhbGx5IHJlbmRlciB0aGUgdGV4dCBmcm9tIHRoZSB0ZXh0IHBhZC4KKworMjAwNS0xMS0yOSAxNDo0OTowMCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2RlYnVnLzogVXBkYXRlIGZvciBHc3RCYXNlVHJhbnNmb3JtIGV2ZW50IHZpcnR1YWwgbWV0aG9kCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2RlYnVnL2dzdG5hdnNlZWsuYzogKGdzdF9uYXZzZWVrX2V2ZW50KToKKwkgICogZ3N0L2RlYnVnL3Byb2dyZXNzcmVwb3J0LmM6IChnc3RfcHJvZ3Jlc3NfcmVwb3J0X2V2ZW50KToKKwkgIFVwZGF0ZSBmb3IgR3N0QmFzZVRyYW5zZm9ybSBldmVudCB2aXJ0dWFsIG1ldGhvZAorCisyMDA1LTExLTI5IDEwOjU1OjA5ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgZXh0L2NhaXJvL01ha2VmaWxlLmFtOiBubyBuZWVkIHRvIGxpbmsgdG8gdmlkZW9maWx0ZXIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMS0yOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKwkgICogZXh0L2NhaXJvL01ha2VmaWxlLmFtOgorCSAgbm8gbmVlZCB0byBsaW5rIHRvIHZpZGVvZmlsdGVyCisKKzIwMDUtMTEtMjkgMTA6NDY6MDAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvZGVidWcvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWcvZ3N0bmF2aWdhdGlvbnRlc3QuaDoKKwkqIGdzdC9lZmZlY3R2L01ha2VmaWxlLmFtOgorCSogZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGRpY2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGVkZ2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6CisJKiBnc3QvZWZmZWN0di9nc3RyZXYuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzoKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZpbHRlci5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmlsdGVyLmg6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmg6CisJICByZW1vdmUgdGhlIHZpZGVvZmlsdGVyIGxpYnJhcnkgYW5kIGxpbmsgdG8gdGhlIG9uZSBpbiBiYXNlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHJlbW92ZSB0aGUgdmlkZW9maWx0ZXIgbGlicmFyeSBhbmQgbGluayB0byB0aGUgb25lIGluIGJhc2UKKworMjAwNS0xMS0yOSAwMTozMDo0MCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGNvbW1vbjoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaDoKKwkgIGJvcmdpZnkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYm9yZ2lmeQorCisyMDA1LTExLTI4IDE3OjMxOjQ0ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IFVzZWxlc3MgY2hlY2sgbm93IHdlJ3JlIHNldHRpbmcgdGhlIGN1cnJlbnQgZW50cnkgY29ycmVjdGx5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KToKKwkgIFVzZWxlc3MgY2hlY2sgbm93IHdlJ3JlIHNldHRpbmcgdGhlIGN1cnJlbnQgZW50cnkgY29ycmVjdGx5LgorCisyMDA1LTExLTI4IDE2OjU0OjAzICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvanBlZy9nc3RqcGVnZW5jLmM6IERvbid0IGxlYWsgaW5wdXQgYnVmZmVyIGluIGNoYWluIGZ1bmN0aW9uIChmaXhlcyAjMzIyNjY3KTsgbWFrZSBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24gdGhyZWFkLXMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6IChnc3RfanBlZ2VuY19yZXN5bmMpLCAoZ3N0X2pwZWdlbmNfY2hhaW4pLAorCSAgKGdzdF9qcGVnZW5jX3NldF9wcm9wZXJ0eSksIChnc3RfanBlZ2VuY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9qcGVnZW5jX2NoYW5nZV9zdGF0ZSk6CisJICBEb24ndCBsZWFrIGlucHV0IGJ1ZmZlciBpbiBjaGFpbiBmdW5jdGlvbiAoZml4ZXMgIzMyMjY2Nyk7IG1ha2UKKwkgIHN0YXRlIGNoYW5nZSBmdW5jdGlvbiB0aHJlYWQtc2FmZTsgZG9uJ3QgcmVwZWF0IHRoZSBjdXJyZW50IGZ1bmN0aW9uCisJICBuYW1lIGluIEdTVF9ERUJVRyBzdGF0ZW1lbnRzOyB1c2UgR1NUX1JPVU5EX1VQXyogbWFjcm9zOyB1c2UKKwkgIGdzdF9wYWRfYWxsb2NfYnVmZmVyKCk7IG1pc2MuIG1pbm9yIGNsZWFudXBzLgorCisyMDA1LTExLTI4IDE1OjQzOjI5ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBleHQvZmFhZC9nc3RmYWFkLmM6IEhhbmRsZSBncmFjZWZ1bGx5IHRoZSBjb25zZXF1ZW5jZSBvZiAiTWF4aW11bSBudW1iZXIgb2Ygc2NhbGVmYWN0b3IgYmFuZHMgZXhjZWVkZWQiLCB3aGljaCByZXN1bHQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9zcmNnZXRjYXBzKToKKwkgIEhhbmRsZSBncmFjZWZ1bGx5IHRoZSBjb25zZXF1ZW5jZSBvZiAiTWF4aW11bSBudW1iZXIgb2Ygc2NhbGVmYWN0b3IKKwkgIGJhbmRzIGV4Y2VlZGVkIiwgd2hpY2ggcmVzdWx0cyBpbiAwIGNoYW5uZWxzIHdpdGggc2FtcGxlcmF0ZXMgb2YgMC4KKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgIERvIHVwd2FyZCB0cmFuc2l0aW9ucywgdGhlbiBjYWxsIHBhcmVudCBzdGF0ZV9jaGFuZ2UsIHRoZW4gZG8KKwkgIGRvd253YXJkIHRyYW5zaXRpb25zLgorCisyMDA1LTExLTI4IDE1OjEzOjIyICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBMb29rIGZvciBwaXhlbC1hc3BlY3QtcmF0aW8gaW4gY2Fwcywgbm90IHBpeGVsX3dpZHRoIGFuZCBwaXhlbF9oZWlnaHQgKEZpeGVzOiAjMzIyNjQ1KQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIChnc3RfbWF0cm9za2FfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzKToKKwkgIExvb2sgZm9yIHBpeGVsLWFzcGVjdC1yYXRpbyBpbiBjYXBzLCBub3QgcGl4ZWxfd2lkdGggYW5kCisJICBwaXhlbF9oZWlnaHQgKEZpeGVzOiAjMzIyNjQ1KQorCisyMDA1LTExLTI4IDEyOjU5OjA1ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBGcm9tIE1pY2hhbCBCZW5lczogZnJhbWUgZHVyYXRpb24gc2hvdWxkIGJlIEdTVF9TRUNPTkQgLyBmcmFtZXJhdGUsIG5vdAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIChnc3RfbWF0cm9za2FfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzKToKKwkgIEZyb20gTWljaGFsIEJlbmVzOgorCSAgZnJhbWUgZHVyYXRpb24gc2hvdWxkIGJlIEdTVF9TRUNPTkQgLyBmcmFtZXJhdGUsIG5vdAorCSAgR1NUX1NFQ09ORCAqIGZyYW1lcmF0ZS4gKEZpeGVzOiAjMzIyNjQzKQorCisyMDA1LTExLTI3IDE3OjAyOjUzICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgY29uZmlndXJlLmFjOiBmaXggdXAgR1NUX1BMVUdJTl9MREZMQUdTCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgZml4IHVwIEdTVF9QTFVHSU5fTERGTEFHUworCSAgKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOgorCSAgZml4IGluY2x1ZGVzIChzZWUgIzMxNzA0MykKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOgorCSAgc3RvcCBpbnN0YWxsaW5nIHRoaXMgbGlicmFyeQorCisyMDA1LTExLTI3IDE1OjMwOjI1ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgbm8gbmVlZCBmb3IgYW4gQVNfTElCVE9PTCBjYWxsCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIG5vIG5lZWQgZm9yIGFuIEFTX0xJQlRPT0wgY2FsbAorCisyMDA1LTExLTI3IDE0OjMzOjMxICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogTWFrZWZpbGUuYW06CisJKiBjb21tb246CisJKiBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46CisJICBhZGQgQUNMT0NBTF9BTUZMQUdTOyByZW1vdmUgb2xkIHN0dWZmIGZyb20gc3BlYyBjaGFuZ2Vsb2cKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkIEFDTE9DQUxfQU1GTEFHUzsgcmVtb3ZlIG9sZCBzdHVmZiBmcm9tIHNwZWMgY2hhbmdlbG9nCisKKzIwMDUtMTEtMjYgMTI6NTQ6NDcgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIGV4dC9kdi9nc3RkdmRlYy5jOiBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGluY29taW5nIFZpZGVvIGR2IHN0cmVhbSBkb2Vzbid0IGhhdmUgYSBwaXhlbCBhc3BlY3QgcmF0aW8gc2V0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kdi9nc3RkdmRlYy5jOiAoZ3N0X2R2ZGVjX3Npbmtfc2V0Y2Fwcyk6CisJICBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGluY29taW5nIFZpZGVvIGR2IHN0cmVhbSBkb2Vzbid0IGhhdmUKKwkgIGEgcGl4ZWwgYXNwZWN0IHJhdGlvIHNldC4KKworMjAwNS0xMS0yNSAyMjoxNDo0NyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJICBkb2N1bWVudCBmbGFjZGVjCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGRvY3VtZW50IGZsYWNkZWMKKworMjAwNS0xMS0yNSAyMTozNjoxOCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm8uYzoKKwkqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOgorCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5Lmg6CisJKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuYzoKKwkqIGV4dC9jYWlyby9nc3R0aW1lb3ZlcmxheS5oOgorCSAgZG8gc29tZSBuYW1lIGJvcmdpZnlpbmcgZG9jdW1lbnQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZG8gc29tZSBuYW1lIGJvcmdpZnlpbmcKKwkgIGRvY3VtZW50CisKKzIwMDUtMTEtMjUgMjE6MDI6MTYgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBkb2N1bWVudGluZyBhdXRvKnNpbmsgdXNpbmcgc3Ryc3RyIGZvciB0aGUgdmlkZW8gc2luayBsb29rdXAsIGNsYXNzIGZpZWxkIGlzIG5vdCBvcmRlcmVkIHVwZGF0ZSBvdGhlciBwbHVnaW5zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtOgorCSAgKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zZWN0aW9ucy50eHQ6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkgIChnc3RfYXV0b19hdWRpb19zaW5rX2Jhc2VfaW5pdCk6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkgIChnc3RfYXV0b192aWRlb19zaW5rX2Jhc2VfaW5pdCksCisJICAoZ3N0X2F1dG9fdmlkZW9fc2lua19mYWN0b3J5X2ZpbHRlcik6CisJICBkb2N1bWVudGluZyBhdXRvKnNpbmsKKwkgIHVzaW5nIHN0cnN0ciBmb3IgdGhlIHZpZGVvIHNpbmsgbG9va3VwLCBjbGFzcyBmaWVsZCBpcyBub3Qgb3JkZXJlZAorCSAgdXBkYXRlIG90aGVyIHBsdWdpbnMKKworMjAwNS0xMS0yNSAxOTo1ODoxOSArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBleHQvd2F2cGFjay9NYWtlZmlsZS5hbToKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaDoKKwkqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5jOgorCSogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmg6CisJICBXYXZwYWNrIHBvcnRlZCB0byAwLjkuIE5vIHN1cHBvcnQgZm9yIGNvcnJlY3Rpb24gZmlsZSB5ZXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFdhdnBhY2sgcG9ydGVkIHRvIDAuOS4gTm8gc3VwcG9ydCBmb3IgY29ycmVjdGlvbiBmaWxlIHlldC4KKworMjAwNS0xMS0yNSAxODoxNTo1MSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGV4dC93YXZwYWNrLzogcHV0IGJhY2sgd2F2cGFjayAtIHN0aWxsIG5lZWRzIHBvcnRpbmcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvd2F2cGFjay9nc3R3YXZwYWNrY29tbW9uLmg6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuYzogKGdzdF93YXZwYWNrX2RlY19saW5rKSwKKwkgIChnc3Rfd2F2cGFja19kZWNfd3ZjbGluayksIChnc3Rfd2F2cGFja19kZWNfZ2V0X3R5cGUpLAorCSAgKGdzdF93YXZwYWNrX2RlY19iYXNlX2luaXQpLCAoZ3N0X3dhdnBhY2tfZGVjX2Rpc3Bvc2UpLAorCSAgKGdzdF93YXZwYWNrX2RlY19jbGFzc19pbml0KSwgKGdzdF93YXZwYWNrX2RlY19zcmNfcXVlcnkpLAorCSAgKGdzdF93YXZwYWNrX2RlY19pbml0KSwgKGdzdF93YXZwYWNrX2RlY19zZXR1cF9jb250ZXh0KSwKKwkgIChnc3Rfd2F2cGFja19kZWNfZm9ybWF0X3NhbXBsZXMpLCAoZ3N0X3dhdnBhY2tfZGVjX2xvb3ApLAorCSAgKGdzdF93YXZwYWNrX2RlY19wbHVnaW5faW5pdCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaDoKKwkgICogZXh0L3dhdnBhY2svZ3N0d2F2cGFja3BhcnNlLmM6IChnc3Rfd2F2cGFja19wYXJzZV9nZXRfdHlwZSksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfYmFzZV9pbml0KSwgKGdzdF93YXZwYWNrX3BhcnNlX2Rpc3Bvc2UpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2NsYXNzX2luaXQpLCAoZ3N0X3dhdnBhY2tfcGFyc2Vfc3JjX3F1ZXJ5KSwKKwkgIChnc3Rfd2F2cGFja19wYXJzZV9zcmNfZXZlbnQpLCAoZmluZF9oZWFkZXIpLCAoZmluZF9zYW1wbGUpLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX3NlZWspLCAoZ3N0X3dhdnBhY2tfcGFyc2VfaW5pdCksCisJICAoZ3N0X3dhdnBhY2tfcGFyc2VfaGFuZGxlX2V2ZW50KSwgKGdzdF93YXZwYWNrX3BhcnNlX2xvb3ApLAorCSAgKGdzdF93YXZwYWNrX3BhcnNlX2NoYW5nZV9zdGF0ZSksIChnc3Rfd2F2cGFja19wYXJzZV9wbHVnaW5faW5pdCk6CisJICAqIGV4dC93YXZwYWNrL2dzdHdhdnBhY2twYXJzZS5oOgorCSAgcHV0IGJhY2sgd2F2cGFjayAtIHN0aWxsIG5lZWRzIHBvcnRpbmcKKworMjAwNS0xMS0yNSAxODowMzoyNCArMDAwMCAgU2ViYXN0aWVuIENvdGUgPHNlYmFzNjQyQHlhaG9vLmNhPgorCisJICBnc3QvdWRwL2dzdHVkcHNyYy5jOiBQYXRjaCBmcm9tIFNlYmFzdGllbiBDb3RlIHRvIGNsb3NlIGNvbnRyb2wgc29ja2V0cyBpbiB1ZHBzcmMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfc3RvcCk6CisJICBQYXRjaCBmcm9tIFNlYmFzdGllbiBDb3RlIHRvIGNsb3NlIGNvbnRyb2wgc29ja2V0cyBpbiB1ZHBzcmMuCisKKzIwMDUtMTEtMjQgMTU6MDc6MDYgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvZWZmZWN0di9nc3RxdWFyay5jOiBGbHVzaCB0aGUgcGxhbmVzIGxpc3Qgb24gcmV2ZXJzZSBjYXBzIG5lZ290aWF0aW9uLiBUaGlzIHdhcyBjcmFzaGluZyBiZWNhdXNlIG9mIGRpZmZlcmVudGx5IHMuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMS0yNCAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOiAoZ3N0X3F1YXJrdHZfc2V0X2NhcHMpLAorCSAgKGdzdF9xdWFya3R2X2dldF91bml0X3NpemUpLCAoZ3N0X3F1YXJrdHZfdHJhbnNmb3JtKSwKKwkgIChnc3RfcXVhcmt0dl9wbGFuZXRhYmxlX2NsZWFyKSwgKGdzdF9xdWFya3R2X2NoYW5nZV9zdGF0ZSksCisJICAoZ3N0X3F1YXJrdHZfYmFzZV9pbml0KSwgKGdzdF9xdWFya3R2X2NsYXNzX2luaXQpLAorCSAgKGdzdF9xdWFya3R2X2luaXQpOiBGbHVzaCB0aGUgcGxhbmVzIGxpc3Qgb24gcmV2ZXJzZSBjYXBzCisJICBuZWdvdGlhdGlvbi4gVGhpcyB3YXMgY3Jhc2hpbmcgYmVjYXVzZSBvZiBkaWZmZXJlbnRseSBzaXplZAorCSAgYnVmZmVycy4KKworMjAwNS0xMS0yNCAxMjo1MDoyOCArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC86IEhhbmRsZSBzdHJpZGVzIGNvcnJlY3RseSwgZml4IGlkZW50aXR5IGZsaXBwaW5nLCBjb252ZXJ0IG5hdmlnYXRpb24gZXZlbnQgY29ycmVjdGx5IGFnYWluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTExLTI0ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGdzdC9kZWJ1Zy9nc3RuYXZpZ2F0aW9udGVzdC5jOiAoZHJhd19ib3hfcGxhbmFyNDExKToKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSAgKGdzdF92aWRlb2ZsaXBfbWV0aG9kX2dldF90eXBlKSwKKwkgIChnc3RfdmlkZW9mbGlwX3NldF9jYXBzKSwgKGdzdF92aWRlb2ZsaXBfdHJhbnNmb3JtX2NhcHMpLAorCSAgKGdzdF92aWRlb2ZsaXBfZ2V0X3VuaXRfc2l6ZSksIChnc3RfdmlkZW9mbGlwX2ZsaXApLAorCSAgKGdzdF92aWRlb2ZsaXBfdHJhbnNmb3JtKSwgKGdzdF92aWRlb2ZsaXBfaGFuZGxlX3NyY19ldmVudCksCisJICAoZ3N0X3ZpZGVvZmxpcF9zZXRfcHJvcGVydHkpLCAoZ3N0X3ZpZGVvZmxpcF9iYXNlX2luaXQpLAorCSAgKGdzdF92aWRlb2ZsaXBfY2xhc3NfaW5pdCksIChnc3RfdmlkZW9mbGlwX2luaXQpOiBIYW5kbGUgc3RyaWRlcworCSAgY29ycmVjdGx5LCBmaXggaWRlbnRpdHkgZmxpcHBpbmcsIGNvbnZlcnQgbmF2aWdhdGlvbiBldmVudAorCSAgY29ycmVjdGx5IGFnYWluLgorCisyMDA1LTExLTI0IDExOjE2OjUzICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkqIFJFQURNRToKKwkgIEZpeCAjMzIwMjg4OiB3cm9uZyByZWFkbWUgaW4gcGx1Z2lucy1nb29kCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEZpeCAjMzIwMjg4OiB3cm9uZyByZWFkbWUgaW4gcGx1Z2lucy1nb29kCisKKzIwMDUtMTEtMjQgMTE6MDY6MjkgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBNYWtlZmlsZS5hbToKKwkgIGZpeCB0b3J0dXJlIHRhcmdldAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggdG9ydHVyZSB0YXJnZXQKKworMjAwNS0xMS0yMyAyMToyNTo1NiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIE1ha2VmaWxlLmFtOgorCSAgYWRkIGEgdG9ydHVyZSB0YXJnZXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkIGEgdG9ydHVyZSB0YXJnZXQKKworMjAwNS0xMS0yMyAyMDowNToyNiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGJhY2sgdG8gSEVBRAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBiYWNrIHRvIEhFQUQKKworPT09IHJlbGVhc2UgMC45LjYgPT09CisKKzIwMDUtMTEtMjMgMTk6NTc6NDkgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcXRkZW11eC54bWw6CisJICByZWxlYXNpbmcgMC45LjYKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmVsZWFzaW5nIDAuOS42CisKKzIwMDUtMTEtMjMgMTk6NTY6MzEgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZW5jZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXNkc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXBuZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDJzZW5kLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvZmxpcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9taXhlci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2ZW5jLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICByZWxlYXNpbmcgMC45LjYKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmVsZWFzaW5nIDAuOS42CisKKzIwMDUtMTEtMjMgMTk6MTQ6MDcgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbDoKKwkgIGFkZGluZyBjdXR0ZXIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkaW5nIGN1dHRlcgorCisyMDA1LTExLTIzIDE5OjA1OjI5ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgVXBkYXRlIC5wbyBmaWxlcworCisyMDA1LTExLTIzIDE2OjQ5OjE2ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L2RlYnVnL2dzdG5hdmlnYXRpb250ZXN0LmM6IE9vcHMsIGluaXRpYWxpc2UgdGhlIGZyYW1lcmF0ZSBHVmFsdWUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZGVidWcvZ3N0bmF2aWdhdGlvbnRlc3QuYzogKGdzdF9uYXZpZ2F0aW9udGVzdF9pbml0KToKKwkgIE9vcHMsIGluaXRpYWxpc2UgdGhlIGZyYW1lcmF0ZSBHVmFsdWUKKworMjAwNS0xMS0yMyAxNTo1MDo1MSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIFZpZGVvRmlsdGVyIGluaGVyaXRzIGZyb20KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMS0yMyAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuYzoKKwkgIChnc3RfdGltZW92ZXJsYXlfdXBkYXRlX2ZvbnRfaGVpZ2h0KSwKKwkgIChnc3RfdGltZW92ZXJsYXlfc2V0X2NhcHMpLCAoZ3N0X3RpbWVvdmVybGF5X2dldF91bml0X3NpemUpLAorCSAgKGdzdF90aW1lb3ZlcmxheV90cmFuc2Zvcm0pLCAoZ3N0X3RpbWVvdmVybGF5X2Jhc2VfaW5pdCksCisJICAoZ3N0X3RpbWVvdmVybGF5X2NsYXNzX2luaXQpLCAoZ3N0X3RpbWVvdmVybGF5X2luaXQpLAorCSAgKGdzdF90aW1lb3ZlcmxheV9nZXRfdHlwZSk6CisJICAqIGV4dC9jYWlyby9nc3R0aW1lb3ZlcmxheS5oOgorCSAgKiBnc3QvZGVidWcvTWFrZWZpbGUuYW06CisJICAqIGdzdC9kZWJ1Zy9nc3RuYXZpZ2F0aW9udGVzdC5jOgorCSAgKGdzdF9uYXZpZ2F0aW9udGVzdF9oYW5kbGVfc3JjX2V2ZW50KSwKKwkgIChnc3RfbmF2aWdhdGlvbnRlc3RfZ2V0X3VuaXRfc2l6ZSksCisJICAoZ3N0X25hdmlnYXRpb250ZXN0X3NldF9jYXBzKSwKKwkgIChnc3RfbmF2aWdhdGlvbnRlc3RfdHJhbnNmb3JtKSwKKwkgIChnc3RfbmF2aWdhdGlvbnRlc3RfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfbmF2aWdhdGlvbnRlc3RfYmFzZV9pbml0KSwgKGdzdF9uYXZpZ2F0aW9udGVzdF9jbGFzc19pbml0KSwKKwkgIChnc3RfbmF2aWdhdGlvbnRlc3RfaW5pdCksIChnc3RfbmF2aWdhdGlvbnRlc3RfZ2V0X3R5cGUpLAorCSAgKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L2RlYnVnL2dzdG5hdmlnYXRpb250ZXN0Lmg6CisJICAqIGdzdC9lZmZlY3R2L01ha2VmaWxlLmFtOgorCSAgKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOiAoZ3N0X2FnaW5ndHZfc2V0X2NhcHMpLAorCSAgKGdzdF9hZ2luZ3R2X2dldF91bml0X3NpemUpLCAoZ3N0X2FnaW5ndHZfdHJhbnNmb3JtKSwKKwkgIChnc3RfYWdpbmd0dl9iYXNlX2luaXQpLCAoZ3N0X2FnaW5ndHZfY2xhc3NfaW5pdCksCisJICAoZ3N0X2FnaW5ndHZfaW5pdCksIChnc3RfYWdpbmd0dl9nZXRfdHlwZSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdGRpY2UuYzogKGdzdF9kaWNldHZfc2V0X2NhcHMpLAorCSAgKGdzdF9kaWNldHZfZ2V0X3VuaXRfc2l6ZSksIChnc3RfZGljZXR2X3RyYW5zZm9ybSksCisJICAoZ3N0X2RpY2V0dl9iYXNlX2luaXQpLCAoZ3N0X2RpY2V0dl9jbGFzc19pbml0KSwKKwkgIChnc3RfZGljZXR2X2luaXQpLAorCSAgKGdzdF9kaWNldHZfZ2V0X3R5cGUpOgorCSAgKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6IChnc3RfZWRnZXR2X3NldF9jYXBzKSwKKwkgIChnc3RfZWRnZXR2X2dldF91bml0X3NpemUpLCAoZ3N0X2VkZ2V0dl90cmFuc2Zvcm0pLAorCSAgKGdzdF9lZGdldHZfYmFzZV9pbml0KSwgKGdzdF9lZGdldHZfY2xhc3NfaW5pdCksCisJICAoZ3N0X2VkZ2V0dl9pbml0KSwKKwkgIChnc3RfZWRnZXR2X2dldF90eXBlKToKKwkgICogZ3N0L2VmZmVjdHYvZ3N0ZWZmZWN0di5jOgorCSAgKiBnc3QvZWZmZWN0di9nc3RlZmZlY3R2Lmg6CisJICAqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6IChnc3RfcXVhcmt0dl9zZXRfY2FwcyksCisJICAoZ3N0X3F1YXJrdHZfZ2V0X3VuaXRfc2l6ZSksIChmYXN0cmFuZCksCisJICAoZ3N0X3F1YXJrdHZfdHJhbnNmb3JtKSwKKwkgIChnc3RfcXVhcmt0dl9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3F1YXJrdHZfYmFzZV9pbml0KSwKKwkgIChnc3RfcXVhcmt0dl9jbGFzc19pbml0KSwgKGdzdF9xdWFya3R2X2luaXQpLAorCSAgKGdzdF9xdWFya3R2X2dldF90eXBlKToKKwkgICogZ3N0L2VmZmVjdHYvZ3N0cmV2LmM6IChnc3RfcmV2dHZfc2V0X2NhcHMpLAorCSAgKGdzdF9yZXZ0dl9nZXRfdW5pdF9zaXplKSwgKGdzdF9yZXZ0dl90cmFuc2Zvcm0pLAorCSAgKGdzdF9yZXZ0dl9iYXNlX2luaXQpLCAoZ3N0X3JldnR2X2NsYXNzX2luaXQpLCAoZ3N0X3JldnR2X2luaXQpLAorCSAgKGdzdF9yZXZ0dl9nZXRfdHlwZSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYzogKGdzdF9zaGFnYWRlbGljdHZfc2V0X2NhcHMpLAorCSAgKGdzdF9zaGFnYWRlbGljdHZfZ2V0X3VuaXRfc2l6ZSksIChnc3Rfc2hhZ2FkZWxpY3R2X3RyYW5zZm9ybSksCisJICAoZ3N0X3NoYWdhZGVsaWN0dl9iYXNlX2luaXQpLCAoZ3N0X3NoYWdhZGVsaWN0dl9jbGFzc19pbml0KSwKKwkgIChnc3Rfc2hhZ2FkZWxpY3R2X2luaXQpLCAoZ3N0X3NoYWdhZGVsaWN0dl9nZXRfdHlwZSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzogKGdzdF92ZXJ0aWdvdHZfc2V0X2NhcHMpLAorCSAgKGdzdF92ZXJ0aWdvdHZfZ2V0X3VuaXRfc2l6ZSksIChnc3RfdmVydGlnb3R2X3RyYW5zZm9ybSksCisJICAoZ3N0X3ZlcnRpZ290dl9iYXNlX2luaXQpLCAoZ3N0X3ZlcnRpZ290dl9jbGFzc19pbml0KSwKKwkgIChnc3RfdmVydGlnb3R2X2luaXQpLCAoZ3N0X3ZlcnRpZ290dl9nZXRfdHlwZSk6CisJICAqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzogKGdzdF93YXJwdHZfc2V0X2NhcHMpLAorCSAgKGdzdF93YXJwdHZfZ2V0X3VuaXRfc2l6ZSksIChnc3Rfd2FycHR2X3RyYW5zZm9ybSksCisJICAoZ3N0X3dhcnB0dl9iYXNlX2luaXQpLCAoZ3N0X3dhcnB0dl9jbGFzc19pbml0KSwKKwkgIChnc3Rfd2FycHR2X2luaXQpLAorCSAgKGdzdF93YXJwdHZfZ2V0X3R5cGUpOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJICAqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5oOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9maWx0ZXIuYzogKGdzdF92aWRlb2ZpbHRlcl9nZXRfdHlwZSksCisJICAoZ3N0X3ZpZGVvZmlsdGVyX2NsYXNzX2luaXQpLCAoZ3N0X3ZpZGVvZmlsdGVyX2luaXQpOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9maWx0ZXIuaDoKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOiAoZ3N0X3ZpZGVvZmxpcF9zZXRfY2FwcyksCisJICAoZ3N0X3ZpZGVvZmxpcF90cmFuc2Zvcm1fY2FwcyksIChnc3RfdmlkZW9mbGlwX2dldF91bml0X3NpemUpLAorCSAgKGdzdF92aWRlb2ZsaXBfZmxpcCksIChnc3RfdmlkZW9mbGlwX3RyYW5zZm9ybSksCisJICAoZ3N0X3ZpZGVvZmxpcF9oYW5kbGVfc3JjX2V2ZW50KSwgKGdzdF92aWRlb2ZsaXBfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfdmlkZW9mbGlwX2Jhc2VfaW5pdCksIChnc3RfdmlkZW9mbGlwX2NsYXNzX2luaXQpLAorCSAgKGdzdF92aWRlb2ZsaXBfaW5pdCksIChwbHVnaW5faW5pdCksIChnc3RfdmlkZW9mbGlwX2dldF90eXBlKToKKwkgICogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5oOiBWaWRlb0ZpbHRlciBpbmhlcml0cyBmcm9tCisJICBCYXNlVHJhbnNmb3JtLCBpdCdzIGp1c3QgYSBwbGFjZSBob2xkZXIgZm9yIG5vdyBhbmQgZXZlcnkgdmlkZW8KKwkgIGVmZmVjdCBwbHVnaW4gaGFzIGJlZW4gcG9ydGVkIHRvIHVzZSBCYXNlVHJhbnNmb3JtIGZlYXR1cmVzCisJICBkaXJlY3RseS4gUXVhcmtUViB3YXMgZml4ZWQgdG9vICh3YXMgYnJva2VuKSwgbmF2aWdhdGlvbnRlc3QKKwkgIHdvcmtzCisJICBhbmQgYmVzdCBmb3IgdGhlIGVuZCwgdmlkZW9mbGlwIGNvbnZlcnRzIG5hdmlnYXRpb24gZXZlbnRzCisJICBkZXBlbmRpbmcKKwkgIG9uIGZsaXAgbWV0aG9kICEgRml4ZXMgIzMyMDk1MworCisyMDA1LTExLTIzIDE0OjIyOjE4ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgRml4ZXMgZm9yIEFQSSBjaGFuZ2VzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2FhbGliL2dzdGFhc2luay5jOiAoZ3N0X2Fhc2lua19maXhhdGUpOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzogKGdzdF90ZXh0X292ZXJsYXlfY29sbGVjdGVkKToKKwkgICogZ3N0L2dvb20vZ3N0Z29vbS5jOiAoZ3N0X2dvb21faW5pdCksIChnc3RfZ29vbV9zcmNfc2V0Y2FwcyksCisJICAoZ3N0X2dvb21fc3JjX25lZ290aWF0ZSksIChnc3RfZ29vbV9jaGFpbik6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIChnc3RfbWF0cm9za2FfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzKToKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgRml4ZXMgZm9yIEFQSSBjaGFuZ2VzCisKKzIwMDUtMTEtMjMgMTI6MTk6MDYgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgYWRkIGN1dHRlciB0byBzcGVjIGluCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCBjdXR0ZXIgdG8gc3BlYyBpbgorCisyMDA1LTExLTIzIDExOjU3OjUxICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBDb252ZXJ0IHRvIGZyYWN0aW9uYWwgZnJhbWVyYXRlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwKKwkgIChnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwgKHF0ZGVtdXhfZHVtcF9tdmhkKSwKKwkgIChxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgQ29udmVydCB0byBmcmFjdGlvbmFsIGZyYW1lcmF0ZXMKKworMjAwNS0xMS0yMiAyMzo1ODoxNCArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBleHQvanBlZy86IEpQRUcgZnJhY3Rpb255IGdvb2RuZXNzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKGdzdF9qcGVnX2RlY19zZXRjYXBzKSwKKwkgIChnc3RfanBlZ19kZWNfY2hhaW4pLCAoZ3N0X2pwZWdfZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOiAoZ3N0X2pwZWdlbmNfc2V0Y2Fwcyk6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdlbmMuaDoKKwkgICogZXh0L2pwZWcvZ3N0c21va2VlbmMuYzogKGdzdF9zbW9rZWVuY19zZXRjYXBzKSwKKwkgIChnc3Rfc21va2VlbmNfcmVzeW5jKToKKwkgICogZXh0L2pwZWcvZ3N0c21va2VlbmMuaDoKKwkgIEpQRUcgZnJhY3Rpb255IGdvb2RuZXNzLgorCisyMDA1LTExLTIyIDIyOjM1OjU3ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGdzdC9nb29tL2ZpbHRlcnMuYzoKKwkqIGdzdC9nb29tL2dyYXBoaWMuaDoKKwkgIEZpeCBmb3IgIzMyMTQzMDogdW5yZXNvbHZlZCBzeW1ib2xzIGR1ZSB0byBpbmNvcnJlY3QgbGlua2FnZSBvbiBpbmxpbmUgZnVuY3Rpb25zIGluIGdvb20uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEZpeCBmb3IgIzMyMTQzMDogdW5yZXNvbHZlZCBzeW1ib2xzIGR1ZSB0byBpbmNvcnJlY3QgbGlua2FnZSBvbiBpbmxpbmUgZnVuY3Rpb25zCisJICBpbiBnb29tLgorCSAgRG9lcyBub3QsIGhvd2V2ZXIsIGZpeCB0aGUgZ2VuZXJhbCBjcmFja2hlYWRlZG5lc3Mgb2YgZ29vbSAoZ2xvYmFsIHZhcmlhYmxlcywKKwkgIG9oIG15ISk7IHRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIC1iYWQuCisKKzIwMDUtMTEtMjIgMjI6MjE6MzcgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBNb3JlIGZyYWN0aW9uYWwgZnJhbWVyYXRlIGNvbnZlcnNpb25zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6IChnc3RfdGV4dF9vdmVybGF5X2luaXQpLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfc2V0Y2FwcyksIChnc3RfdGV4dF9vdmVybGF5X2NvbGxlY3RlZCk6CisJICAqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5oOgorCSAgKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKGdzdF9nZGtfcGl4YnVmX3NpbmtfbGluayk6CisJICAqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5oOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiAoZ3N0X3BuZ2RlY19pbml0KSwKKwkgIChnc3RfcG5nZGVjX2NhcHNfY3JlYXRlX2FuZF9zZXQpOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5oOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiAoZ3N0X3BuZ2VuY19zZXRjYXBzKToKKwkgICogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzogKGdzdF9hbHBoYV9jb2xvcl9zZXRfY2Fwcyk6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpbXV4X2luaXQpLAorCSAgKGdzdF9hdmltdXhfdmlkc2lua2Nvbm5lY3QpOgorCSAgKiBnc3QvZmx4L2dzdGZseGRlYy5jOiAoZ3N0X2ZseGRlY19jaGFpbik6CisJICAqIGdzdC9nb29tL2dzdGdvb20uYzogKGdzdF9nb29tX2luaXQpLCAoZ3N0X2dvb21fc3JjX3NldGNhcHMpLAorCSAgKGdzdF9nb29tX3NyY19uZWdvdGlhdGUpLCAoZ3N0X2dvb21fY2hhaW4pOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmg6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3ZpZGVvX2NhcHMpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX211eF92aWRlb19wYWRfc2V0Y2Fwcyk6CisJICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaDoKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgTW9yZSBmcmFjdGlvbmFsIGZyYW1lcmF0ZSBjb252ZXJzaW9ucworCisyMDA1LTExLTIyIDIwOjA3OjQ3ICswMDAwICBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSAgQ29udmVydCB0byBmcmFjdGlvbmFsIGZyYW1lcmF0ZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2FhbGliL2dzdGFhc2luay5jOiAoZ3N0X2Fhc2lua19maXhhdGUpOgorCSAgKiBnc3QvZGVidWcvZ3N0bmF2aWdhdGlvbnRlc3QuYzoKKwkgIChnc3RfbmF2aWdhdGlvbnRlc3RfaGFuZGxlX3NyY19ldmVudCk6CisJICAqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZpbHRlci5jOgorCSAgKGdzdF92aWRlb2ZpbHRlcl9mb3JtYXRfZ2V0X3N0cnVjdHVyZSksIChnc3RfdmlkZW9maWx0ZXJfc2V0Y2FwcyksCisJICAoZ3N0X3ZpZGVvZmlsdGVyX2luaXQpOgorCSAgKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9maWx0ZXIuaDoKKwkgIENvbnZlcnQgdG8gZnJhY3Rpb25hbCBmcmFtZXJhdGVzLgorCisyMDA1LTExLTIyIDE4OjExOjU4ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJKiBleHQvZXNkL2VzZG1vbi5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzoKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhLmM6CisJKiBnc3Qvb2xkY29yZS9nc3RhZ2dyZWdhdG9yLmM6CisJKiBnc3Qvb2xkY29yZS9nc3RzaGFwZXIuYzoKKwkqIGdzdC9zbXB0ZS9iYXJib3h3aXBlcy5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkgIGZpeCB1cCBtb3JlIGVudW1zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCB1cCBtb3JlIGVudW1zCisKKzIwMDUtMTEtMjIgMTc6Mzk6MTEgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiBGcmFjdGlvbmFsIGZyYW1lcmF0ZXMsIHZpZGVvbWl4ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfZ2V0Y2FwcyksIChnc3RfdmlkZW9taXhlcl9maWxsX3F1ZXVlcyksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfdXBkYXRlX3F1ZXVlcyk6CisJICBGcmFjdGlvbmFsIGZyYW1lcmF0ZXMsIHZpZGVvbWl4ZXIuCisKKzIwMDUtMTEtMjIgMTc6MDk6MzYgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZXh0L2R2LzogRnJhY3Rpb25hbCBmcmFtZXJhdGVzIGZvciBEVi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19pbml0KSwgKGdzdF9kdmRlY19zaW5rX3NldGNhcHMpOgorCSAgKiBleHQvZHYvZ3N0ZHZkZWMuaDoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2luaXQpLAorCSAgKGdzdF9kdmRlbXV4X3NyY19jb252ZXJ0KSwgKGdzdF9kdmRlbXV4X3NpbmtfY29udmVydCksCisJICAoZ3N0X2R2ZGVtdXhfZGVtdXhfdmlkZW8pLCAoZ3N0X2R2ZGVtdXhfZGVtdXhfZnJhbWUpLAorCSAgKGdzdF9kdmRlbXV4X2ZsdXNoKToKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguaDoKKwkgIEZyYWN0aW9uYWwgZnJhbWVyYXRlcyBmb3IgRFYuCisKKzIwMDUtMTEtMjIgMTQ6NDQ6MjYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9hdXRvZGV0ZWN0LzogVXNlIGdzdF9wbHVnaW5fZmVhdHVyZV9saXN0X2ZyZWUoKSB0byBmcmVlIGZlYXR1cmUgbGlzdCBhbmQgaW4gdGhlIGNhc2Ugb2YgYXV0b3ZpZGVvc2luayBmcmVlIHRoZSBsaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkgIChnc3RfYXV0b19hdWRpb19zaW5rX2ZpbmRfYmVzdCksIChnc3RfYXV0b19hdWRpb19zaW5rX2RldGVjdCk6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkgIChnc3RfYXV0b192aWRlb19zaW5rX2ZpbmRfYmVzdCksIChnc3RfYXV0b192aWRlb19zaW5rX2RldGVjdCk6CisJICBVc2UgZ3N0X3BsdWdpbl9mZWF0dXJlX2xpc3RfZnJlZSgpIHRvIGZyZWUgZmVhdHVyZSBsaXN0IGFuZAorCSAgaW4gdGhlIGNhc2Ugb2YgYXV0b3ZpZGVvc2luayBmcmVlIHRoZSBsaXN0IGF0IGFsbC4gQWxzbworCSAgbWlzY2VsbGFuZW91cyBjb3NtZXRpYyBmaXhlcy4KKworMjAwNS0xMS0yMiAxMzoxMzoyMSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6IGNvcHkgY2FsY3VsYXRpb24gY29kZSBmcm9tIGxldmVsOyByZW1vdmUgdXNlIG9mIHNvbWUgYXVkaW8gZnVuY3Rpb25zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzogKGdzdF9jdXR0ZXJfY2hhaW4pLAorCSAgKGdzdF9jdXR0ZXJfc2V0X3Byb3BlcnR5KSwgKGdzdF9jdXR0ZXJfZ2V0X2NhcHMpOgorCSAgY29weSBjYWxjdWxhdGlvbiBjb2RlIGZyb20gbGV2ZWw7IHJlbW92ZSB1c2Ugb2Ygc29tZSBhdWRpbworCSAgZnVuY3Rpb25zCisKKzIwMDUtMTEtMjIgMTM6MTE6MjUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIHZhcmlvdXMgY29zbWV0aWMgZml4ZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdmFyaW91cyBjb3NtZXRpYyBmaXhlcworCisyMDA1LTExLTIyIDEyOjQ4OjEwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJICB2YXJpb3VzIGNvc21ldGljIGZpeGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHZhcmlvdXMgY29zbWV0aWMgZml4ZXMKKworMjAwNS0xMS0yMiAxMjo0MTozNSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgdmFyaW91cyBjb3NtZXRpYyBmaXhlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICB2YXJpb3VzIGNvc21ldGljIGZpeGVzCisKKzIwMDUtMTEtMjIgMTI6Mzg6MzMgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIFVwZGF0ZSBmb3IgZ3N0X3RhZ19zZXR0ZXIgQVBJIGNoYW5nZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTEtMjIgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIFVwZGF0ZSBmb3IgZ3N0X3RhZ19zZXR0ZXIgQVBJIGNoYW5nZXMuCisKKzIwMDUtMTEtMjIgMTE6NTc6NTEgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOgorCSAgZXh0L2ZhYWQvZ3N0ZmFhZC5jIChnc3RfZmFhZF9ldmVudCkgZXh0L2l2b3JiaXMvdm9yYmlzZmlsZS5jIChnc3RfaXZvcmJpc2ZpbGVfbG9vcCkgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jIChnc3RfcXRkZW11Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTEtMjIgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIGV4dC9mYWFkL2dzdGZhYWQuYyAoZ3N0X2ZhYWRfZXZlbnQpCisJICAqIGV4dC9pdm9yYmlzL3ZvcmJpc2ZpbGUuYyAoZ3N0X2l2b3JiaXNmaWxlX2xvb3ApCisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYyAoZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpCisJICAqIGdzdC9zcGVlZC9nc3RzcGVlZC5jIChzcGVlZF9zaW5rX2V2ZW50KQorCSAgKiBnc3QvdHRhL2dzdHR0YXBhcnNlLmMgKGdzdF90dGFfcGFyc2Vfc3JjX2V2ZW50KQorCSAgKGdzdF90dGFfcGFyc2VfcGFyc2VfaGVhZGVyKTogUnVuIHVwZGF0ZS1mdW5jbmFtZXMuCisKKzIwMDUtMTEtMjIgMTE6NTM6MzQgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzoKKwkqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zaW5rLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBleHQvZHYvZ3N0ZHZkZW11eC5jIChnc3RfZHZkZW11eF9oYW5kbGVfc2lua19ldmVudCkgKGdzdF9kdmRlbXV4X2RlbXV4X2ZyYW1lKSBleHQvZmxhYy9nc3RmbGFjZGVjLmMgKGdzdF9mbGFjZGVjX3dyaXQuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMS0yMiAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYyAoZ3N0X2R2ZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQpCisJICAoZ3N0X2R2ZGVtdXhfZGVtdXhfZnJhbWUpCisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYyAoZ3N0X2ZsYWNkZWNfd3JpdGUpCisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYyAoZ3N0X2ZsYWNlbmNfc2Vla19jYWxsYmFjaykKKwkgIChnc3RfZmxhY2VuY19zaW5rX2V2ZW50KQorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NpbmsuYyAoZ3N0X2djb25mX2F1ZGlvX3NpbmtfaW5pdCkKKwkgICogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zaW5rLmMgKGdzdF9nY29uZl92aWRlb19zaW5rX2luaXQpCisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmMgKGdzdF9wbmdkZWNfY2Fwc19jcmVhdGVfYW5kX3NldCkKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmMgKHNwZWV4X2RlY19ldmVudCwgc3BlZXhfZGVjX2NoYWluKQorCSAgKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmMgKGdzdF9hdXBhcnNlX2NoYWluKQorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmMgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfaW5pdCkKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jIChnc3RfYXV0b192aWRlb19zaW5rX2luaXQpCisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYyAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyKQorCSAgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspCisJICAqIGdzdC9nb29tL2dzdGdvb20uYyAoZ3N0X2dvb21fZXZlbnQpCisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmMgKGdzdF9lYm1sX3dyaXRlX3NlZWspCisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50KQorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9sb29wX3N0cmVhbV9wYXJzZV9pZCkKKwkgICogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYyAoZ3N0X3dhdmVuY19zdG9wX2ZpbGUpCisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jIChnc3Rfd2F2cGFyc2VfaGFuZGxlX3NlZWspCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKTogUnVuIHVwZGF0ZS1mdW5jbmFtZXMuCisKKzIwMDUtMTEtMjIgMTE6NDk6MzAgKzAwMDAgIEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkgIFVSSUhhbmRsZXIgaW50ZXJmYWNlIGFuZCBlbGVtZW50IHByb3BlcnRpZXMgYXJlIG5vdyBwcm9wZXJseSBzeW5jaHJvbml6ZWQgZm9yIERWMTM5NHNyYyBhbmQgVURQU3JjCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IChnc3RfZHYxMzk0c3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9kdjEzOTRzcmNfaW5pdCksIChnc3RfZHYxMzk0c3JjX2Rpc3Bvc2UpLAorCSAgKGdzdF9kdjEzOTRzcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9kdjEzOTRzcmNfZGlzY292ZXJfYXZjX25vZGUpLAorCSAgKGdzdF9kdjEzOTRzcmNfdXJpX3NldF91cmkpOgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwKKwkgIChnc3RfdWRwc3JjX3VwZGF0ZV91cmkpLCAoZ3N0X3VkcHNyY19zZXRfdXJpKSwKKwkgIChnc3RfdWRwc3JjX3NldF9wcm9wZXJ0eSksIChnc3RfdWRwc3JjX3VyaV9nZXRfdXJpKToKKwkgIFVSSUhhbmRsZXIgaW50ZXJmYWNlIGFuZCBlbGVtZW50IHByb3BlcnRpZXMgYXJlIG5vdyBwcm9wZXJseQorCSAgc3luY2hyb25pemVkIGZvciBEVjEzOTRzcmMgYW5kIFVEUFNyYworCisyMDA1LTExLTIyIDExOjM2OjA0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvOiBsaWJnc3R0YWdlZGl0IGhhcyBiZWVuIHJlbmFtZWQgdG8gbGliZ3N0dGFnLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL01ha2VmaWxlLmFtOgorCSAgKiBleHQvc3BlZXgvTWFrZWZpbGUuYW06CisJICBsaWJnc3R0YWdlZGl0IGhhcyBiZWVuIHJlbmFtZWQgdG8gbGliZ3N0dGFnLgorCisyMDA1LTExLTIxIDIwOjExOjU5ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5jOiBBcHBseSBwYXRjaCBmcm9tIFNlYmFzdGllbiBDb3RlIHRvIGZpeCAjMzE5MTg0LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChyZWFkX2JvZHkpOgorCSAgQXBwbHkgcGF0Y2ggZnJvbSBTZWJhc3RpZW4gQ290ZSB0byBmaXggIzMxOTE4NC4KKworMjAwNS0xMS0yMSAxOTo1MDoyNSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIHBvcnQgY3V0dGVyCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgKiBnc3QvY3V0dGVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOiAoZ3N0X2N1dHRlcl9jbGFzc19pbml0KSwKKwkgIChnc3RfY3V0dGVyX2luaXQpLCAoZ3N0X2N1dHRlcl9tZXNzYWdlX25ldyksIChnc3RfY3V0dGVyX2NoYWluKSwKKwkgIChnc3RfY3V0dGVyX3NldF9wcm9wZXJ0eSksIChnc3RfY3V0dGVyX2dldF9wcm9wZXJ0eSksCisJICAocGx1Z2luX2luaXQpLCAoZ3N0X2N1dHRlcl9nZXRfY2Fwcyk6CisJICBwb3J0IGN1dHRlcgorCSAgKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIGZpeCB1cCBwbHVnaW4gZGV0YWlscworCisyMDA1LTExLTIxIDE4OjA5OjAyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBVcGRhdGUgZm9yIHN0cmVhbSBsb2NrIEFQSSBjaGFuZ2VzOiBkb24ndCB0YWtlIHN0cmVhbSBsb2cgaW4gc2luayBldmVudCBoYW5kbGVycyBhbnkgbG9uZ2VyIGFuZCBjaGFuZ2UgR1NUX1NUUkVBTV9MT0MuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5jOiAoZ3N0X2R2ZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQpOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY2RlY19sb29wKSwKKwkgIChnc3RfZmxhY2RlY19zcmNfZXZlbnQpOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY2VuY19zaW5rX2V2ZW50KToKKwkgICogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYzogKGdzdF9zaWduYWxfcHJvY2Vzc29yX2V2ZW50KSwKKwkgIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9nZXRyYW5nZSksIChnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9jaGFpbik6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspOgorCSAgKiBnc3QvZmx4L2dzdGZseGRlYy5jOiAoZ3N0X2ZseGRlY19zcmNfZXZlbnRfaGFuZGxlciksCisJICAoZ3N0X2ZseGRlY19zaW5rX2V2ZW50X2hhbmRsZXIpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NlZWtfZXZlbnQpOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9oYW5kbGVfc2Vlayk6CisJICBVcGRhdGUgZm9yIHN0cmVhbSBsb2NrIEFQSSBjaGFuZ2VzOiBkb24ndCB0YWtlIHN0cmVhbSBsb2cKKwkgIGluIHNpbmsgZXZlbnQgaGFuZGxlcnMgYW55IGxvbmdlciBhbmQgY2hhbmdlIEdTVF9TVFJFQU1fTE9DSworCSAgdG8gR1NUX1BBRF9TVFJFQU1fTE9DSy4gRG9uJ3QgbGVhayByZWZlcmVuY2VzIGluIGZseGRlYyBldmVudAorCSAgZnVuY3Rpb25zLgorCisyMDA1LTExLTIxIDE3OjUyOjE1ICswMDAwICBNaWNoYWVsIFNtaXRoIDxtc21pdGhAeGlwaC5vcmc+CisKKwkqIGdzdC9hdXBhcnNlL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5oOgorCSAgRm9yZ290IHRvIGNvbW1pdCBoZWFkZXIgZmlsZSBjaGFuZ2VzLCBNYWtlZmlsZS5hbSBjaGFuZ2VzLiBPb3BzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGb3Jnb3QgdG8gY29tbWl0IGhlYWRlciBmaWxlIGNoYW5nZXMsIE1ha2VmaWxlLmFtIGNoYW5nZXMuIE9vcHMuCisKKzIwMDUtMTEtMjEgMTc6NDk6MjEgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSAgZ3N0X29iamVjdF91bnJlZiwgbm90IGdfb2JqZWN0X3VucmVmCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGdzdF9vYmplY3RfdW5yZWYsIG5vdCBnX29iamVjdF91bnJlZgorCisyMDA1LTExLTIxIDE3OjM3OjQxICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBGaXggZm9yIHN0cmVhbSBsb2NrIHVwZGF0ZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2ZhYWMvZ3N0ZmFhYy5jOiAoZ3N0X2ZhYWNfc2lua19ldmVudCk6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2hhbmRsZV9zcmNfZXZlbnQpOgorCSAgKiBnc3QvdHRhL2dzdHR0YXBhcnNlLmM6IChnc3RfdHRhX3BhcnNlX3NyY19ldmVudCk6CisJICBGaXggZm9yIHN0cmVhbSBsb2NrIHVwZGF0ZXMuCisKKzIwMDUtMTEtMjEgMTc6MjM6NDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiBVc2UgR1NUX0RFQlVHX0ZVTkNQVFI7IGFkZCBkZWJ1ZyBtZXNzYWdlIGluIHBhZCBhY3RpdmF0ZSBmdW5jdGlvbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9pbml0KSwKKwkgIChnc3Rfd2F2cGFyc2VfY3JlYXRlX3NvdXJjZXBhZCksIChnc3Rfd2F2cGFyc2Vfc2lua19hY3RpdmF0ZSk6CisJICBVc2UgR1NUX0RFQlVHX0ZVTkNQVFI7IGFkZCBkZWJ1ZyBtZXNzYWdlIGluIHBhZCBhY3RpdmF0ZSBmdW5jdGlvbi4KKworMjAwNS0xMS0yMSAxNzoxODowMSArMDAwMCAgTWljaGFlbCBTbWl0aCA8bXNtaXRoQHhpcGgub3JnPgorCisJICBnc3QvYXVwYXJzZS86IFBhcnRpYWxseSBmaXggIzE2MTcxMi4gcGxheWJpbiBzdGlsbCBkb2Vzbid0IHdvcmsgb24gdGhlc2UgZmlsZXMsIChvbiB0aGUgYnVnIHJlcG9ydCwgQW5keSBzYXlzIHdlIGFyZW4uLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXVwYXJzZS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiAoZ3N0X2F1cGFyc2VfY2xhc3NfaW5pdCksCisJICAoZ3N0X2F1cGFyc2VfaW5pdCksIChnc3RfYXVwYXJzZV9kaXNwb3NlKSwgKGdzdF9hdXBhcnNlX2NoYWluKSwKKwkgIChnc3RfYXVwYXJzZV9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmg6CisJICBQYXJ0aWFsbHkgZml4ICMxNjE3MTIuIHBsYXliaW4gc3RpbGwgZG9lc24ndCB3b3JrIG9uIHRoZXNlIGZpbGVzLAorCSAgKG9uIHRoZSBidWcgcmVwb3J0LCBBbmR5IHNheXMgd2UgYXJlbid0IHR5cGVmaW5kaW5nIGl0IGZvciBzb21lCisJICByZWFzb24/KSBidXQgYXQgbGVhc3QgYXVwYXJzZSBpc24ndCB0b3RhbGx5IGJ1c3RlZCBsaWtlIGl0IHdhcyBiZWZvcmUuCisKKzIwMDUtMTEtMjEgMTY6NDU6NDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogakBib290bGFiLm9yZywgIzMyMTkwMykuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF92aWRlb19jYXBzKToKKwkgIEFkZCBEWDUwLCBESVZYIGFuZCBESVYzIGZvdXJjY3MgKHBhdGNoIGJ5CisJICBqQGJvb3RsYWIub3JnLCAjMzIxOTAzKS4KKworMjAwNS0xMS0yMSAxNjozNjowNSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICAqLio6IFJhbiBzY3JpcHRzL3VwZGF0ZS1tYWNyb3MuIE9oIHllcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMS0yMSAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogKi5oOgorCSAgKiAqLmM6IFJhbiBzY3JpcHRzL3VwZGF0ZS1tYWNyb3MuIE9oIHllcy4KKworMjAwNS0xMS0yMSAxNTowNjozNSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IEZpbGxlciBldmVudHMgYXJlIGdvbmUgZm9yIG5vdywgY29tbWVudCBvdXQgc2VjdGlvbiBnZW5lcmF0aW5nIHRoZW0uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfc3luY19zdHJlYW1zKToKKwkgIEZpbGxlciBldmVudHMgYXJlIGdvbmUgZm9yIG5vdywgY29tbWVudCBvdXQgc2VjdGlvbiBnZW5lcmF0aW5nCisJICB0aGVtLgorCisyMDA1LTExLTIxIDE0OjM5OjA0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBVcGRhdGUgZm9yIEdTVF9GT1VSQ0NfRk9STUFUIEFQSSBjaGFuZ2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2RpcmVjdGZiL2RmYnZpZGVvc2luay5jOgorCSAgKGdzdF9kZmJ2aWRlb3NpbmtfZ2V0X2Zvcm1hdF9mcm9tX2NhcHMpOgorCSAgKiBleHQvc2RsL3NkbHZpZGVvc2luay5jOiAoZ3N0X3NkbHZpZGVvc2lua19jcmVhdGUpOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX2hlYWRlciksCisJICAocXRkZW11eF9wYXJzZSksIChxdGRlbXV4X3R5cGVfZ2V0KSwgKHF0ZGVtdXhfbm9kZV9kdW1wX2ZvcmVhY2gpLAorCSAgKHF0ZGVtdXhfZHVtcF9oZGxyKSwgKHF0ZGVtdXhfZHVtcF9kcmVmKSwgKHF0ZGVtdXhfZHVtcF9zdHNkKSwKKwkgIChxdGRlbXV4X2R1bXBfZGNvbSksIChxdGRlbXV4X3BhcnNlX3RyYWspLCAocXRkZW11eF92aWRlb19jYXBzKSwKKwkgIChxdGRlbXV4X2F1ZGlvX2NhcHMpOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY192NGwyZm91cmNjX3RvX2NhcHMpOgorCSAgKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19maWxsX2Zvcm1hdF9saXN0KSwKKwkgIChnc3RfdjRsMnNyY19jYXB0dXJlX2luaXQpLCAoZ3N0X3Y0bDJzcmNfZ2V0X3NpemVfbGltaXRzKToKKwkgIFVwZGF0ZSBmb3IgR1NUX0ZPVVJDQ19GT1JNQVQgQVBJIGNoYW5nZS4KKworMjAwNS0xMS0yMSAxNDozMzoxMSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIFJlbmFtZSBnc3RfY2Fwc19zdHJ1Y3R1cmVfZml4YXRlXyogdG8gZ3N0X3N0cnVjdHVyZV9maXhhdGVfKiAoIzMyMjAyNykKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvYXVkaW9yZXNhbXBsZS9nc3RhdWRpb3Jlc2FtcGxlLmM6CisJICAqIGV4dC9wb2x5cC9wb2x5cHNpbmsuYzogKGdzdF9wb2x5cHNpbmtfc2lua19maXhhdGUpOgorCSAgKiBnc3QvbGlicmZiL2dzdHJmYnNyYy5jOiAoZ3N0X3JmYnNyY19maXhhdGUpOgorCSAgKiBnc3QvbW9kcGx1Zy9nc3Rtb2RwbHVnLmNjOgorCSAgKiBzeXMvZ2xzaW5rL2dsaW1hZ2VzaW5rLmM6IChnc3RfZ2xpbWFnZXNpbmtfZml4YXRlKToKKwkgICogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfZml4YXRlKToKKwkgIFJlbmFtZSBnc3RfY2Fwc19zdHJ1Y3R1cmVfZml4YXRlXyogdG8gZ3N0X3N0cnVjdHVyZV9maXhhdGVfKgorCSAgKCMzMjIwMjcpCisKKzIwMDUtMTEtMjEgMTQ6MzE6MDUgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBSZW5hbWUgZ3N0X2NhcHNfc3RydWN0dXJlX2ZpeGF0ZV8qIHRvIGdzdF9zdHJ1Y3R1cmVfZml4YXRlXyogKCMzMjIwMjcpCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2FhbGliL2dzdGFhc2luay5jOiAoZ3N0X2Fhc2lua19maXhhdGUpOgorCSAgKiBleHQvbWlrbW9kL2dzdG1pa21vZC5jOiAoZ3N0X21pa21vZF9zcmNmaXhhdGUpOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9zcmNfbmVnb3RpYXRlKToKKwkgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5tOgorCSAgUmVuYW1lIGdzdF9jYXBzX3N0cnVjdHVyZV9maXhhdGVfKiB0byBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV8qCisJICAoIzMyMjAyNykKKworMjAwNS0xMS0yMSAxMzozODoyNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgRml4ZXMgZm9yIEdTVF9GT1VSQ0NfRk9STUFUIEFQSSBjaGFuZ2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2FhbGliL2dzdGFhc2luay5jOiAoZ3N0X2Fhc2lua19zZXRjYXBzKToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wYXJzZV9maWxlX2hlYWRlciksCisJICAoZ3N0X2F2aV9kZW11eF9yZWFkX3N1YmluZGV4ZXMpLCAoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0pLAorCSAgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfb2RtbCksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksCisJICAoZ3N0X2F2aV9kZW11eF9zeW5jKSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlciksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3ZpZGVvX2NhcHMpOgorCSAgKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiAod3JpdGVfbWV0YWRhdGEpOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9wYXJzZV9hZHRsKSwKKwkgIChnc3Rfd2F2cGFyc2VfcGFyc2VfZmlsZV9oZWFkZXIpLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKToKKwkgIEZpeGVzIGZvciBHU1RfRk9VUkNDX0ZPUk1BVCBBUEkgY2hhbmdlLgorCisyMDA1LTExLTIxIDEyOjEzOjQ4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBGaXggZm9yIGNvbGxlY3QgcGFkcyBBUEkgY2hhbmdlLiBBbHNvIGZpeCB0ZXh0b3ZlcmxheSBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6IChnc3RfdGV4dF9vdmVybGF5X2ZpbmFsaXplKSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X2luaXQpLCAoZ3N0X3RleHRfb3ZlcmxheV90ZXh0X3BhZF9saW5rZWQpLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfdGV4dF9wYWRfdW5saW5rZWQpLCAoZ3N0X3RleHRfb3ZlcmxheV9wb3BfdmlkZW8pLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfcG9wX3RleHQpLCAoZ3N0X3RleHRfb3ZlcmxheV9jb2xsZWN0ZWQpLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9pbml0KSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3Jlc2V0KSwgKGdzdF9tYXRyb3NrYV9tdXhfcmVxdWVzdF9uZXdfcGFkKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X2Jlc3RfcGFkKSwgKGdzdF9tYXRyb3NrYV9tdXhfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6IChnc3Rfc21wdGVfaW5pdCksIChnc3Rfc21wdGVfY29sbGVjdGVkKToKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfaW5pdCksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfcmVxdWVzdF9uZXdfcGFkKSwgKGdzdF92aWRlb21peGVyX2ZpbGxfcXVldWVzKSwKKwkgIChnc3RfdmlkZW9taXhlcl9jaGFuZ2Vfc3RhdGUpOgorCSAgRml4IGZvciBjb2xsZWN0IHBhZHMgQVBJIGNoYW5nZS4gQWxzbyBmaXggdGV4dG92ZXJsYXkgc3RhdGUKKwkgIGNoYW5nZSBmdW5jdGlvbi4KKworMjAwNS0xMS0yMCAxNzowNDo1NSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogUmVwbGFjZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTExLTIwICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfc3RhcnQpOiBSZXBsYWNlCisJICBHU1RfUEFEX0lTX1VTQUJMRSBieSBzb21ldGhpbmcgYXBwcm9hY2hpbmcgaXQuCisKKzIwMDUtMTEtMjAgMTY6NDM6MzIgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IEZpeCBmb3IKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMS0yMCAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X3N0YXJ0KTogRml4IGZvcgorCSAgQVBJIGNoYW5nZXMuCisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX2NoYWluKTogRml4IGZvciBBUEkKKwkgIGNoYW5nZXMsCisJICBidXQgYWxzbyBmaXggdGhlIGNvZGUgdGhhdCB3YXMgbm90IGNoZWNraW5nIHJldHVybiB2YWx1ZXMgZnJvbQorCSAgcGFkX3B1c2ggbmVpdGhlciB1c2luZyBwYWRfYWxsb2NfYnVmZmVyLgorCisyMDA1LTExLTE4IDE4OjE5OjIxICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiBBZGRlZCBkZWJ1ZyBjYXRlZ29yeQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6IChnc3RfcG5nZW5jX2NsYXNzX2luaXQpLAorCSAgKGdzdF9wbmdlbmNfY2hhaW4pOgorCSAgQWRkZWQgZGVidWcgY2F0ZWdvcnkKKwkgIFJldHVybiBHU1RfRkxPV19VTkVYUEVDVEVEIHdoZW4gc2VuZGluZyBhbiBFT1MsIHNvIHRoZSB3aG9sZSBwaXBlbGluZQorCSAgZ29lcyB0byBFT1MuCisKKzIwMDUtMTEtMTcgMTg6MjM6MjMgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWVuYy5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzExcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZWMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwc3BlZXhkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4ZW5jLmg6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cHNwZWV4cGF5Lmg6CisJICBDcmVhdGVkIFNwZWV4IHBheWxvYWRlciBhbmQgZGVwYXlsb2FkZXI7IE9wdGltaXplIEc3MTEgcGF5bG9hZGVyIHRvIHVzZSBhZGFwdGVyIGFuZCBzZW5kIHBhY2tldHMgdW50aWwgTVRVIHNpemUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIENyZWF0ZWQgU3BlZXggcGF5bG9hZGVyIGFuZCBkZXBheWxvYWRlcjsgT3B0aW1pemUgRzcxMSBwYXlsb2FkZXIgdG8gdXNlIGFkYXB0ZXIgYW5kIHNlbmQgcGFja2V0cyB1bnRpbCBNVFUgc2l6ZS4KKworMjAwNS0xMS0xNiAxOTowODo1NCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgY2hlY2svZWxlbWVudHMvbWF0cm9za2FtdXguYzogRml4IGxlYWsgaW4gY2hlY2suCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY2hlY2svZWxlbWVudHMvbWF0cm9za2FtdXguYzogKHNldHVwX3NyY19wYWQpLCAoc2V0dXBfc2lua19wYWQpOgorCSAgRml4IGxlYWsgaW4gY2hlY2suCisKKzIwMDUtMTEtMTYgMTc6MDA6MzIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IEZpeCBzdGF0ZSBjaGFuZ2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2ZseC9nc3RmbHhkZWMuYzogKGdzdF9mbHhkZWNfY2hhbmdlX3N0YXRlKToKKwkgIEZpeCBzdGF0ZSBjaGFuZ2UuCisKKzIwMDUtMTEtMTYgMTE6MDI6MjQgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzoKKwkgIE1vdmUgY29tbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKGdzdF91ZHBzcmNfY3JlYXRlKTogTW92ZSBjb21tZW50LgorCisyMDA1LTExLTE2IDEwOjQzOjQ0ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IENsZWFuIHVwIHdpdGggdGhlIGJvaWxlcnBsYXRlIG1hY3JvLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTExLTE2ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiBDbGVhbiB1cCB3aXRoIHRoZSBib2lsZXJwbGF0ZSBtYWNyby4KKworMjAwNS0xMS0xNSAxOTo0MToyMSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IFdoZW4gc2Vla2luZywgc2VlayB0byBjbG9zZXN0IGluZGV4IGVudHJ5IGF0IG9yIGJlZm9yZSB0aGUgcmVxdWVzdGVkIHNlZWsgcG9zaXRpb24sIG5vLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thZGVtdXhfZG9faW5kZXhfc2Vlayk6CisJICBXaGVuIHNlZWtpbmcsIHNlZWsgdG8gY2xvc2VzdCBpbmRleCBlbnRyeSBhdCBvciBiZWZvcmUgdGhlIHJlcXVlc3RlZAorCSAgc2VlayBwb3NpdGlvbiwgbm90IGp1c3QgdGhlIGNsb3Nlc3Qgb25lICgjMzIxMDAxKS4KKworMjAwNS0xMS0xNSAxMjoxNjowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBJbnZlcnQgRElCIGltYWdlcyBhZ2FpbiAoc2VlICMxMzIzNDEpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKHN3YXBfbGluZSksIChnc3RfYXZpX2RlbXV4X2ludmVydCksCisJICAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSk6CisJICBJbnZlcnQgRElCIGltYWdlcyBhZ2FpbiAoc2VlICMxMzIzNDEpLgorCisyMDA1LTExLTE0IDAyOjEzOjM1ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogY29tbW9uOgorCSogY29uZmlndXJlLmFjOgorCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2NhaXJvL2dzdGNhaXJvLmM6CisJKiBleHQvZHYvZ3N0ZHYuYzoKKwkqIGV4dC9lc2QvZ3N0ZXNkLmM6CisJKiBleHQvZmxhYy9nc3RmbGFjLmM6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZlbGVtZW50cy5jOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6CisJKiBleHQvanBlZy9nc3RqcGVnLmM6CisJKiBleHQvbGFkc3BhL2dzdGxhZHNwYS5jOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzoKKwkqIGV4dC9saWJtbmcvZ3N0bW5nLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZy5jOgorCSogZXh0L21pa21vZC9nc3RtaWttb2QuYzoKKwkqIGV4dC9wYW5nby9nc3R0ZXh0b3ZlcmxheS5jOgorCSogZXh0L3BhbmdvL2dzdHRpbWVvdmVybGF5LmM6CisJKiBleHQvcmF3MTM5NC9nc3QxMzk0LmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXguYzoKKwkqIGdzdC9hbHBoYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzoKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpLmM6CisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOgorCSogZ3N0L2RlYnVnL2VmZW5jZS5jOgorCSogZ3N0L2RlYnVnL2dzdGRlYnVnLmM6CisJKiBnc3QvZGVidWcvZ3N0bmF2aWdhdGlvbnRlc3QuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGVmZmVjdHYuYzoKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJKiBnc3QvbGF3L2FsYXcuYzoKKwkqIGdzdC9sYXcvbXVsYXcuYzoKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLmM6CisJKiBnc3QvbWVkaWFuL2dzdG1lZGlhbi5jOgorCSogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYzoKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0LmM6CisJKiBnc3Qvb2xkY29yZS9nc3RlbGVtZW50cy5jOgorCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0YXN0ZXJpc2toMjYzLmM6CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0c3AvZ3N0cnRzcC5jOgorCSogZ3N0L3Ntb290aHdhdmUvZ3N0c21vb3Rod2F2ZS5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJKiBnc3QvdWRwL2dzdHVkcC5jOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb3RlbXBsYXRlLmM6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJKiBzeXMvb3NzL2dzdG9zc2F1ZGlvLmM6CisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW8uYzoKKwkgIHJld29yayBjb25maWd1cmUuYWM7IG1ha2UgYXN0ZXJpc2sgcnRwIHN0dWZmIGNvbXBpbGUgb24gbWluZ3cKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmV3b3JrIGNvbmZpZ3VyZS5hYzsgbWFrZSBhc3RlcmlzayBydHAgc3R1ZmYgY29tcGlsZSBvbiBtaW5ndworCisyMDA1LTExLTEyIDEzOjMxOjU2ICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBleHQvanBlZy9nc3RqcGVnZGVjLmM6IE9ubHkgR1NUX0RFQlVHKCkgaW5mb3JtYXRpb24gb24gdGhlIHZhbGlkIGNvbXBvbmVudHMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdfZGVjX2NoYWluKToKKwkgIE9ubHkgR1NUX0RFQlVHKCkgaW5mb3JtYXRpb24gb24gdGhlIHZhbGlkIGNvbXBvbmVudHMuCisKKzIwMDUtMTEtMTEgMTk6MzQ6NTAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb25maWd1cmUuYWM6CisJICBiYWNrIHRvIGhlYWQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYmFjayB0byBoZWFkCisKKz09PSByZWxlYXNlIDAuOS41ID09PQorCisyMDA1LTExLTExIDE5OjMzOjIzICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkgIHJlbGVhc2luZyAwLjkuNQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZWxlYXNpbmcgMC45LjUKKworMjAwNS0xMS0xMSAxODozMzoyMSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJICBVcGRhdGUgLnBvIGZpbGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFVwZGF0ZSAucG8gZmlsZXMKKworMjAwNS0xMS0xMSAxNjo0ODo1OCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC4qOiBZZWFoLCBpbXBsZW1lbnQgcHJvcGVyIHNlZWtpbmcuIEV4YWN0IHNlZWtpbmcgYW5kIHNlZ21lbnQgc2Vla2luZy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3Jlc2V0KSwKKwkgIChnc3RfYXZpX2RlbXV4X3NyY19jb252ZXJ0KSwgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19ldmVudCksCisJICAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyKSwgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspLAorCSAgKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2RhdGEpLAorCSAgKGdzdF9hdmlfZGVtdXhfbG9vcCk6CisJICAqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIFllYWgsIGltcGxlbWVudCBwcm9wZXIgc2Vla2luZy4gRXhhY3Qgc2Vla2luZyBhbmQgc2VnbWVudCBzZWVraW5nLgorCSAgU3RpbGwgbmVlZCB0byBkbyBzb21lIGNoZWNrcyBmb3Igc2VnbWVudF9zdG9wLgorCisyMDA1LTExLTExIDE1OjE3OjQ0ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIGZpeCBDYWlybyBlbnRyeQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggQ2Fpcm8gZW50cnkKKworMjAwNS0xMS0xMCAxMjozNDoyNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBBZGQgc3VwcG9ydCBmb3IgY3VzdG9tIGdlbnJlIHRhZ3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdWR0YSk6CisJICBBZGQgc3VwcG9ydCBmb3IgY3VzdG9tIGdlbnJlIHRhZ3MuCisKKzIwMDUtMTEtMTAgMTI6MjI6MzAgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogRG9uJ3QgdHJ5IHRvIHJlYWR5IGJ1ZmZlciBkdXJhdGlvbiBmcm9tIGJ1ZmZlciB0aGF0IHdlIGRvbid0IG93biBhbnkgIGxvbmdlciBhbmQgdGhhdCBtaS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBSZXZpZXdlZCBieTogVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X3dyaXRlX2RhdGEpOgorCSAgRG9uJ3QgdHJ5IHRvIHJlYWR5IGJ1ZmZlciBkdXJhdGlvbiBmcm9tIGJ1ZmZlciB0aGF0IHdlIGRvbid0CisJICBvd24gYW55ICBsb25nZXIgYW5kIHRoYXQgbWlnaHQgYWxyZWFkeSBoYXZlIGJlZW4gdW5yZWZmZWQuCisJICAoIzMyMTEzNikKKworMjAwNS0xMS0wOSAyMTozNToyOSArMDAwMCAgWmVlc2hhbiBBbGkgPHplZW5peEBnbWFpbC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJICBBdHRlbXB0aW5nIHRvIG9wdGltaXplIHRoZSBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBBdHRlbXB0aW5nIHRvIG9wdGltaXplIHRoZSBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLgorCisyMDA1LTExLTA4IDA4OjU0OjMwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvb3NzL2dzdG9zc3NpbmsuYzogRG9uJ3QgcmUtdXNlIGFscmVhZHkgY2xvc2VkIGZpbGUgZGVzY3JpcHRvci4gKCMzMjA5MjApCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisJICAqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc19zaW5rX2Nsb3NlKToKKwkgIERvbid0IHJlLXVzZSBhbHJlYWR5IGNsb3NlZCBmaWxlIGRlc2NyaXB0b3IuICgjMzIwOTIwKQorCisyMDA1LTExLTA3IDE3OjM1OjIwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvb3NzL2dzdG9zc3NpbmsuKjogQ2FjaGUgcHJvYmVkIGNhcHM7IGZpeCBkZWJ1ZyBvdXRwdXQgZm9yIFNFVF9QQVJBTSBtYWNyb3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3NzX3NpbmtfZGlzcG9zZSksCisJICAoZ3N0X29zc19zaW5rX3NldF9wcm9wZXJ0eSksIChnc3Rfb3NzX3NpbmtfZ2V0Y2FwcyksCisJICAoZ3N0X29zc19zaW5rX3ByZXBhcmUpOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NpbmsuaDoKKwkgIENhY2hlIHByb2JlZCBjYXBzOyBmaXggZGVidWcgb3V0cHV0IGZvciBTRVRfUEFSQU0gbWFjcm9zLgorCisyMDA1LTExLTA3IDE1OjA5OjU0ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvY2Fpcm8vOiBQb3J0IGNhaXJvIHRleHRvdmVybGF5IHBsdWdpbiB0byAwLjkuIEFkZCAnc2hhZGVkLWJhY2tncm91bmQnIHByb3BlcnR5IGFuZCByZWRvIHBvc2l0aW9uLiBEb2Vzbid0IGhhbmRsZSAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvY2Fpcm8vTWFrZWZpbGUuYW06CisJICAqIGV4dC9jYWlyby9nc3RjYWlyby5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzogKGdzdF90ZXh0X292ZXJsYXlfYmFzZV9pbml0KSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X2NsYXNzX2luaXQpLCAoZ3N0X3RleHRfb3ZlcmxheV9maW5hbGl6ZSksCisJICAoZ3N0X3RleHRfb3ZlcmxheV9pbml0KSwgKGdzdF90ZXh0X292ZXJsYXlfZm9udF9pbml0KSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X3NldF9wcm9wZXJ0eSksIChnc3RfdGV4dF9vdmVybGF5X3JlbmRlcl90ZXh0KSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X2dldGNhcHMpLCAoZ3N0X3RleHRfb3ZlcmxheV9zZXRjYXBzKSwKKwkgIChnc3RfdGV4dF9vdmVybGF5X3RleHRfcGFkX2xpbmtlZCksCisJICAoZ3N0X3RleHRfb3ZlcmxheV90ZXh0X3BhZF91bmxpbmtlZCksIChnc3RfdGV4dF9vdmVybGF5X3NoYWRlX3kpLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfYmxpdF8xKSwgKGdzdF90ZXh0X292ZXJsYXlfYmxpdF9zdWIyeDIpLAorCSAgKGdzdF90ZXh0X292ZXJsYXlfcHVzaF9mcmFtZSksIChnc3RfdGV4dF9vdmVybGF5X3BvcF92aWRlbyksCisJICAoZ3N0X3RleHRfb3ZlcmxheV9wb3BfdGV4dCksIChnc3RfdGV4dF9vdmVybGF5X2NvbGxlY3RlZCksCisJICAoZ3N0X3RleHRfb3ZlcmxheV9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuaDoKKwkgIFBvcnQgY2Fpcm8gdGV4dG92ZXJsYXkgcGx1Z2luIHRvIDAuOS4gQWRkICdzaGFkZWQtYmFja2dyb3VuZCcKKwkgIHByb3BlcnR5IGFuZCByZWRvIHBvc2l0aW9uLiBEb2Vzbid0IGhhbmRsZSB1cHN0cmVhbSByZW5lZ290aWF0aW9uCisJICB5ZXQgdGhvdWdoLgorCisyMDA1LTExLTA3IDEwOjMxOjMyICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IE5vIG5lZWQgdG8gdGFrZSB0aGUgU1RSRUFNX0xPQ0sgaW4gdGhlIGxvb3AgZnVuY3Rpb24uIEltcHJvdmUgc29tZSBkZWJ1ZyBtZXNzYWdlcy4gRG9uJ3QgbGVhayAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksCisJICAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSksCisJICAoZ3N0X2F2aV9kZW11eF9sb29wKToKKwkgIE5vIG5lZWQgdG8gdGFrZSB0aGUgU1RSRUFNX0xPQ0sgaW4gdGhlIGxvb3AgZnVuY3Rpb24uIEltcHJvdmUKKwkgIHNvbWUgZGVidWcgbWVzc2FnZXMuIERvbid0IGxlYWsgcGFkIG5hbWVzIGluIGRlYnVnIG1lc3NhZ2VzLgorCisyMDA1LTExLTA3IDEwOjI3OjAwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogRG9uJ3QgZXJyb3Igb3V0IHdoZW4gdGhlIHNvdXJjZSBwYWQgaXNuJ3QgbGlua2VkLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wdXNoX3ZvcmJpc19jb2RlY19wcml2X2RhdGEpLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfd3Zwa19oZWFkZXIpOgorCSAgRG9uJ3QgZXJyb3Igb3V0IHdoZW4gdGhlIHNvdXJjZSBwYWQgaXNuJ3QgbGlua2VkLgorCisyMDA1LTExLTAyIDE5OjQyOjM4ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBleHQvZ2NvbmYvOiBGaXggc3RhdGUgY2hhbmdlIGZ1bmN0aW9ucyBoZXJlIGFzIHdlbGwgYW5kIHNldCBraWQgdG8gTlVMTCBzdGF0ZSBiZWZvcmUgcmVtb3ZpbmcgaXQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmM6IChkb190b2dnbGVfZWxlbWVudCksCisJICAoZ3N0X2djb25mX2F1ZGlvX3NpbmtfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zaW5rLmM6IChkb190b2dnbGVfZWxlbWVudCksCisJICAoZ3N0X2djb25mX3ZpZGVvX3NpbmtfY2hhbmdlX3N0YXRlKToKKwkgIEZpeCBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb25zIGhlcmUgYXMgd2VsbCBhbmQgc2V0IGtpZAorCSAgdG8gTlVMTCBzdGF0ZSBiZWZvcmUgcmVtb3ZpbmcgaXQuCisKKzIwMDUtMTEtMDIgMTY6NDg6NTUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOgorCSogY29tbW9uOgorCSogdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FtdXguYzoKKwkgIHNpZ2gsIHN0YXRpYyBwYWQgdGVtcGxhdGVzIGFyZW4ndCByZWZjb3VudGVkIHByb3Blcmx5CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHNpZ2gsIHN0YXRpYyBwYWQgdGVtcGxhdGVzIGFyZW4ndCByZWZjb3VudGVkIHByb3Blcmx5CisKKzIwMDUtMTEtMDEgMTY6MTQ6MjUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSogZ3N0L2xldmVsLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlOgorCSAgaWdub3JlIG1vcmUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgaWdub3JlIG1vcmUKKworMjAwNS0xMS0wMSAxNToxNTo0NCArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzogQWRkZWQgcHJvcGVyIGV2ZW50IGhhbmRsaW5kLCBtYWRlIGRvd25zdHJlYW0gbmV3c2VnbWVudCBldmVudCB1c2UgR1NUX0ZPUk1BVF9CWVRFUyAob3RoZXJ3aXNlLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzogKGdzdF93YXZlbmNfc3RvcF9maWxlKSwKKwkgIChnc3Rfd2F2ZW5jX2luaXQpLCAoZ3N0X3dhdmVuY19ldmVudCksIChnc3Rfd2F2ZW5jX2NoYWluKToKKwkgIEFkZGVkIHByb3BlciBldmVudCBoYW5kbGluZCwKKwkgIG1hZGUgZG93bnN0cmVhbSBuZXdzZWdtZW50IGV2ZW50IHVzZSBHU1RfRk9STUFUX0JZVEVTIChvdGhlcndpc2UgaXQncworCSAgaWdub3JlZCksCisJICBhbmQgZG9uJ3Qgc2V0IGEgZHVyYXRpb24gb2YgMCBmb3IgYnVmZmVycyBvdGhlcndpc2UgdGhleSBhcmUgZGlzY2FyZGVkCisJICBieSBHc3RCYXNlU2luay4KKwkgIEdzdFdhdkVuYyBuZWVkcyBzb21lIHNlcmlvdXMgbG92aW5nLCBhZnRlciBnb2luZyB0aHJvdWdoIHRoZSBjb2RlIEknbQorCSAgcmVhbGx5IHdvbmRlcmluZyBob3cgdGhpcyBjYW4gc3RheSBpbiAtZ29vZCAuLi4KKworMjAwNS0xMS0wMSAxNToxMToxNiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIEZpeCBsZWFrcyBhbmQgaW52YWxpZCBtZW1vcnkgYWNjZXNzIGFzIHJlcG9ydGVkIGJ5IHZhbGdyaW5kCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY2hlY2svZWxlbWVudHMvbWF0cm9za2FtdXguYzogKHNldHVwX3NyY19wYWQpLCAoc2V0dXBfc2lua19wYWQpLAorCSAgKHNldHVwX21hdHJvc2thbXV4KSwgKGNoZWNrX2J1ZmZlcl9kYXRhKSwgKEdTVF9TVEFSVF9URVNUKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9maW5hbGl6ZSksCisJICAoZ3N0X21hdHJvc2thX211eF9yZXNldCksIChnc3RfbWF0cm9za2FfbXV4X2F1ZGlvX3BhZF9zZXRjYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X3N0YXJ0KSwgKGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfZGF0YSksCisJICAoZ3N0X21hdHJvc2thX211eF9jb2xsZWN0ZWQpOgorCSAgRml4IGxlYWtzIGFuZCBpbnZhbGlkIG1lbW9yeSBhY2Nlc3MgYXMgcmVwb3J0ZWQgYnkgdmFsZ3JpbmQKKworMjAwNS0xMS0wMSAxNDo0MTowMSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGNoZWNrL2VsZW1lbnRzL21hdHJvc2thbXV4LmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jOgorCSAgLi4uIGFuZCBhZGQgdGhlIG1pc3NpbmcgZmlsZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAuLi4gYW5kIGFkZCB0aGUgbWlzc2luZyBmaWxlCisKKzIwMDUtMTEtMDEgMTQ6MzY6MDIgKzAwMDAgIE1pY2hhbCBCZW5lcyA8bWljaGFsLmJlbmVzQHhlcmlzLmN6PgorCisJICBhZGQgYSB1bml0IHRlc3QgZm9yIG1hdHJvc2thbXV4IGZpeCB0aGUgYnVncyB0aGF0IHRoZSB1bml0IHRlc3QgZXhwb3NlZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBQYXRjaCBieTogTWljaGFsIEJlbmVzIDxtaWNoYWwuYmVuZXNAeGVyaXMuY3o+CisJICAqIGNoZWNrL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOiAoZ3N0X2VibWxfd3JpdGVfc2Vlayk6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfaGFuZGxlX3NyY19ldmVudCksCisJICAoZ3N0X21hdHJvc2thX211eF9hdWRpb19wYWRfc2V0Y2FwcyksIChnc3RfbWF0cm9za2FfbXV4X3N0YXJ0KToKKwkgIGFkZCBhIHVuaXQgdGVzdCBmb3IgbWF0cm9za2FtdXgKKwkgIGZpeCB0aGUgYnVncyB0aGF0IHRoZSB1bml0IHRlc3QgZXhwb3NlZAorCisyMDA1LTExLTAxIDE0OjM0OjIyICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgIGZpeCBNYWtlZmlsZS5hbQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggTWFrZWZpbGUuYW0KKworMjAwNS0xMS0wMSAxMjozOToxNiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F1dG9kZXRlY3QvOiBGaXggc3RhdGUgY2hhbmdlIGZ1bmN0aW9uIGFuZCB1c2UgR1NUX0RFQlVHX0ZVTkNQVFIgaW4gY2xhc3NfaW5pdC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmM6CisJICAoZ3N0X2F1dG9fYXVkaW9fc2lua19jbGFzc19pbml0KSwKKwkgIChnc3RfYXV0b19hdWRpb19zaW5rX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzoKKwkgIChnc3RfYXV0b192aWRlb19zaW5rX2NsYXNzX2luaXQpLAorCSAgKGdzdF9hdXRvX3ZpZGVvX3NpbmtfY2hhbmdlX3N0YXRlKToKKwkgIEZpeCBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24gYW5kIHVzZSBHU1RfREVCVUdfRlVOQ1BUUiBpbgorCSAgY2xhc3NfaW5pdC4KKworMjAwNS0xMS0wMSAxMjozNTozOSArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thLzogU2V0IHRpbWVzdGFtcHMgb24gb3V0Z29pbmcgZWJtbCBoZWFkZXJzIGFzIHdlbGwsIHNvIHRoYXQgdGhlIGVsZW1lbnQgYWZ0ZXIgbWF0cm9za2FtdXggY2FuIGdldCB0aGUgdGltLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6IChnc3RfZWJtbF93cml0ZV9uZXcpLAorCSAgKGdzdF9lYm1sX3dyaXRlX3Jlc2V0KSwgKGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfbmV3KToKKwkgICogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuaDoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF93cml0ZV9kYXRhKToKKwkgIFNldCB0aW1lc3RhbXBzIG9uIG91dGdvaW5nIGVibWwgaGVhZGVycyBhcyB3ZWxsLCBzbyB0aGF0IHRoZQorCSAgZWxlbWVudCBhZnRlciBtYXRyb3NrYW11eCBjYW4gZ2V0IHRoZSB0aW1lc3RhbXAgYWxyZWFkeSB3aGVuCisJICByZWFkaW5nIHRoZSBmaXJzdCBlYm1sIGVsZW1lbnQgYW5kIGRvZXNuJ3QgaGF2ZSB0byB3YWl0IGZvcgorCSAgdGhlIGFjdHVhbCBkYXRhIGJ1ZmZlciBmb3IgdGhhdCAoIzMyMDMwOCkuCisKKzIwMDUtMTAtMzEgMjI6MDg6NTIgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOgorCSAgZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jIChnc3RfdmlkZW9taXhlcl9wYWRfdW5saW5rKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEwLTMxICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmMgKGdzdF92aWRlb21peGVyX3BhZF91bmxpbmspCisJICAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX2xpbmspOiBLaWxsIHNvbWUgbWVtbGVha3MuCisJICAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX2dldF9wcm9wZXJ0eSk6IFN0eWxlIGZpeC4KKwkgIChnc3RfdmlkZW9taXhlcl9wYWRfc2V0X3Byb3BlcnR5KTogU3R5bGUgZml4LgorCSAgKGdzdF92aWRlb21peGVyX3BhZF9pbml0KTogU3R5bGUgZml4LgorCSAgKGdzdF92aWRlb21peGVyX3VwZGF0ZV9xdWV1ZXMpOiBLaWxsIG1lbWxlYWsuCisJICAoZ3N0X3ZpZGVvbWl4ZXJfbG9vcCk6IEtpbGwgbWVtbGVhay4KKwkgIChnc3RfdmlkZW9taXhlcl9jb2xsZWN0ZWQpOiBLaWxsIG1lbWxlYWsuCisKKzIwMDUtMTAtMzEgMTk6MDg6MjcgKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSAgSnVzdCBzb21lIGNsZWFudXAuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEp1c3Qgc29tZSBjbGVhbnVwLgorCisyMDA1LTEwLTMxIDE0OjQxOjMxICswMDAwICBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAaW5kdC5vcmcuYnI+CisKKwkqIENoYW5nZUxvZzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgQWRkIGNoZWNrcyB0byBHU1RfRkxPV19OT1RfTElOS0VEIGZvciB2YWx1ZXMgcmV0dXJuZWQgZnJvbSBnc3RfcGFkX3B1c2guCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEFkZCBjaGVja3MgdG8gR1NUX0ZMT1dfTk9UX0xJTktFRCBmb3IgdmFsdWVzIHJldHVybmVkIGZyb20gZ3N0X3BhZF9wdXNoLgorCisyMDA1LTEwLTMxIDEyOjAwOjEwICswMDAwICBaZWVzaGFuIEFsaSA8emVlbml4QGdtYWlsLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L3J0cC9nc3RydHBnNzExZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFkZXBheS5jOgorCSAgUGF5bG9hZGVyIG5vdyBzZXRzIHNvbWUgZGVmYXVsdCBjYXBzIG9uIHRoZSBzcmNwYWQgaWYgY2FwcyBvbiB0aGUgc2lua3BhZCBhcmUgbmV2ZXIgc2V0LiBUaGlzIGlzIGltcG9ydGFudCBmb3IgdGhlIGc3Li4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFBheWxvYWRlciBub3cgc2V0cyBzb21lIGRlZmF1bHQgY2FwcyBvbiB0aGUgc3JjcGFkIGlmIGNhcHMgb24gdGhlIHNpbmtwYWQgYXJlIG5ldmVyIHNldC4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHRoZSBnNzExIHRvIHdvcmsgd2l0aCBidXJnZXIncyBydHBiaW4gZWxlbWVudC4KKworMjAwNS0xMC0yOCAxOToxOTo0MCArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb21tb246CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkgIEFkZCBjaGVja3MgZm9yIHJldHVybiB2YWx1ZXMgZnJvbSBnc3RfcGFkX3B1c2ggYW5kIGdzdF9wYWRfYWxsb2NfYnVmZmVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBBZGQgY2hlY2tzIGZvciByZXR1cm4gdmFsdWVzIGZyb20gZ3N0X3BhZF9wdXNoIGFuZCBnc3RfcGFkX2FsbG9jX2J1ZmZlci4KKworMjAwNS0xMC0yOCAxNTozMjo0OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thLzogQWRkIFNpbXBsZUJsb2NrIHN1cHBvcnQgdG8gbWF0cm9za2EgZGVtdXhlciBhbmQgbXV4ZXIgKHBhcnQgb2YKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgUmV2aWV3ZWQgYnk6IFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfaW5pdF9zdHJlYW0pLAorCSAgKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pbmZvKSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NsdXN0ZXIpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfY2xhc3NfaW5pdCksCisJICAoZ3N0X21hdHJvc2thX211eF9pbml0KSwgKGdzdF9tYXRyb3NrYV9tdXhfc3RhcnQpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfY3JlYXRlX2J1ZmZlcl9oZWFkZXIpLAorCSAgKGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfZGF0YSksIChnc3RfbWF0cm9za2FfbXV4X3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X21hdHJvc2thX211eF9nZXRfcHJvcGVydHkpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJICBBZGQgU2ltcGxlQmxvY2sgc3VwcG9ydCB0byBtYXRyb3NrYSBkZW11eGVyIGFuZCBtdXhlciAocGFydCBvZgorCSAgTWF0cm9za2EgdjIpLiAoIzMxOTczMSkKKworMjAwNS0xMC0yOCAxMzoyNDo0MCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2pwZWcvZ3N0anBlZ2RlYy4qOiBDbGVhbnVwcy4gRG9uJ3QgY3JlYXRlIGNhcHMgZm9yIGV2ZXJ5IGNoYWluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKGdzdF9qcGVnX2RlY19pbml0KSwgKGdzdF9qcGVnX2RlY19jaGFpbiksCisJICAoZ3N0X2pwZWdfZGVjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkgIENsZWFudXBzLiBEb24ndCBjcmVhdGUgY2FwcyBmb3IgZXZlcnkgY2hhaW4uCisKKzIwMDUtMTAtMjcgMTg6NDY6MzIgKzAwMDAgIEZsYXZpbyBPbGl2ZWlyYSA8ZmxhdmlvLm9saXZlaXJhQGluZHQub3JnLmJyPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmg6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuaDoKKwkgIEZpeCB0byBzZXQgdGltZXN0YW1wIG9uIGJ1ZmZlciwgaXQgd2FzIHRlc3RlZCB3aXRoIFJUUCBHNzExIGVsZW1lbnRzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBGaXggdG8gc2V0IHRpbWVzdGFtcCBvbiBidWZmZXIsIGl0IHdhcyB0ZXN0ZWQgd2l0aCBSVFAgRzcxMSBlbGVtZW50cy4KKworMjAwNS0xMC0yNyAxMToyNzo1MyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOiBSZW1vdmUgZ290X3JlZGlyZWN0IGZyb20gY2xhc3Mgc3RydWN0dXJlIGFzIHdlbGwuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSAgUmVtb3ZlIGdvdF9yZWRpcmVjdCBmcm9tIGNsYXNzIHN0cnVjdHVyZSBhcyB3ZWxsLgorCisyMDA1LTEwLTI3IDExOjI1OjE5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IFJlbW92ZSAnZ290LXJlZGlyZWN0JyBzaWduYWwgYW5kIHBvc3QgZWxlbWVudCBtZXNzYWdlIG9uIHRoZSBidXMgaW5zdGVhZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9jbGFzc19pbml0KSwKKwkgIChxdGRlbXV4X3BhcnNlX3RyZWUpOgorCSAgUmVtb3ZlICdnb3QtcmVkaXJlY3QnIHNpZ25hbCBhbmQgcG9zdCBlbGVtZW50IG1lc3NhZ2UKKwkgIG9uIHRoZSBidXMgaW5zdGVhZC4KKworMjAwNS0xMC0yNyAxMTowMDo0MCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgc3lzL29zcy9nc3Rvc3NzcmMuYzogU2V0IGNvcnJlY3QgZm9ybWF0IG9uIG9zcyBpbnN0ZWFkIG9mIGEgc2lsbHkgdmFsdWUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zcy9nc3Rvc3NzcmMuYzogKGdzdF9vc3Nfc3JjX3ByZXBhcmUpOgorCSAgU2V0IGNvcnJlY3QgZm9ybWF0IG9uIG9zcyBpbnN0ZWFkIG9mIGEgc2lsbHkgdmFsdWUuCisKKzIwMDUtMTAtMjcgMDk6NTI6MDggKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogVXNlIGxpYm9pbCBmb3IKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0yNyAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogKGdzdF92aWRlb19ib3hfY2xhc3NfaW5pdCksCisJICAoZ3N0X3ZpZGVvX2JveF90cmFuc2Zvcm1fY2FwcyksIChnc3RfdmlkZW9fYm94X3NldF9jYXBzKSwKKwkgIChnc3RfdmlkZW9fYm94X2dldF91bml0X3NpemUpLCAoZ3N0X3ZpZGVvX2JveF9jb3B5X3BsYW5lX2k0MjApLAorCSAgKGdzdF92aWRlb19ib3hfaTQyMCksIChnc3RfdmlkZW9fYm94X2F5dXYpOiBVc2UgbGlib2lsIGZvcgorCSAgSTQyMCByZW5kZXJpbmcgYXMgd2VsbCwgZG9lc24ndCBicmluZyBtdWNoIGZvciBteSBwbGF0Zm9ybS4KKwkgIE1pZ2h0IGhlbHAgb24gc29tZSBvdGhlciBwbGF0Zm9ybXMuCisKKzIwMDUtMTAtMjYgMjE6NDc6MzYgKzAwMDAgIFplZXNoYW4gQWxpIDx6ZWVuaXhAZ21haWwuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXJzZS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkgIERlY2xhcmluZyB0aGUgcGFkdGVtcGxhdGUgY29ycmVjdGx5LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBEZWNsYXJpbmcgdGhlIHBhZHRlbXBsYXRlIGNvcnJlY3RseS4KKworMjAwNS0xMC0yNiAyMDoyODozMiArMDAwMCAgWmVlc2hhbiBBbGkgPHplZW5peEBnbWFpbC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWRlYy5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzExZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzExcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXJzZS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkgIFNldHRpbmcgdGhlIHByb3BlciBjb3B5cmlnaHQgbm90aWNlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBTZXR0aW5nIHRoZSBwcm9wZXIgY29weXJpZ2h0IG5vdGljZS4KKworMjAwNS0xMC0yNiAxNzoyMzowNiArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC92aWRlb2JveC9NYWtlZmlsZS5hbTogVXNlIGxpYm9pbC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0yNiAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvdmlkZW9ib3gvTWFrZWZpbGUuYW06IFVzZSBsaWJvaWwuCisJICAqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOiAoZ3N0X3ZpZGVvX2JveF9jbGFzc19pbml0KSwKKwkgIChnc3RfdmlkZW9fYm94X3NldF9wcm9wZXJ0eSksIChnc3RfdmlkZW9fYm94X3RyYW5zZm9ybV9jYXBzKSwKKwkgIChnc3RfdmlkZW9fYm94X3NldF9jYXBzKSwgKGdzdF92aWRlb19ib3hfZ2V0X3VuaXRfc2l6ZSksCisJICAoZ3N0X3ZpZGVvX2JveF9heXV2KTogTG90IG9mIG9wdGltaXphdGlvbiBpbiBBWVVWIHJlbmRlcmluZworCSAgdXNpbmcgbGlib2lsLiBXaWxsIGRvdCB0aGUgc2FtZSB0byBJNDIwIGJvcmRlciBnZW5lcmF0aW9uCisJICB0b21vcnJvdy4KKworMjAwNS0xMC0yNiAxNjozNjowMSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJICBmaXggYXV0b21ha2Ugd2FybmluZ3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZml4IGF1dG9tYWtlIHdhcm5pbmdzCisKKzIwMDUtMTAtMjYgMTQ6NTA6NTkgKzAwMDAgIFplZXNoYW4gQWxpIDx6ZWVuaXhAZ21haWwuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWRlYy5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzExZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc21lbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGFyc2UuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGFyc2UuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJICBIYWNrZWQgdGhlIEc3MTEgKGRlKXBheWxvYWRlciB0byB0cnkgdG8gbWFrZSB0aGluZ3MgcmlnaHQuIHJ0cGc3MTFkZWMgbm93IGluaGVyaXRzIGZyb20gdGhlIGJhc2VydHBkZXBheWxvYWRlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgSGFja2VkIHRoZSBHNzExIChkZSlwYXlsb2FkZXIgdG8gdHJ5IHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiBydHBnNzExZGVjIG5vdyBpbmhlcml0cyBmcm9tIHRoZSBiYXNlcnRwZGVwYXlsb2FkZXIuCisKKzIwMDUtMTAtMjYgMTQ6MjM6NDUgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogUmVtb3ZpbmcgdGhpcyBmb3Jnb3R0ZW4gZGVidWcuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTAtMjYgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2NsYXNzX2luaXQpLAorCSAgKGdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2NhcHMpLCAoZ3N0X3ZpZGVvX2JveF9nZXRfdW5pdF9zaXplKSwKKwkgIChnc3RfdmlkZW9fYm94X2F5dXYpOiBSZW1vdmluZyB0aGlzIGZvcmdvdHRlbiBkZWJ1Zy4KKworMjAwNS0xMC0yNiAxNDowODo0OSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOiBGaXggdGhlIHN0cmlkZSBpc3N1ZSB3aGVuIGJveGluZyB0byBBWVVWLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEwLTI2ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOiAoZ3N0X3ZpZGVvX2JveF9jbGFzc19pbml0KSwKKwkgIChnc3RfdmlkZW9fYm94X3RyYW5zZm9ybV9jYXBzKSwgKGdzdF92aWRlb19ib3hfZ2V0X3VuaXRfc2l6ZSksCisJICAoZ3N0X3ZpZGVvX2JveF9heXV2KTogRml4IHRoZSBzdHJpZGUgaXNzdWUgd2hlbiBib3hpbmcgdG8gQVlVVi4KKworMjAwNS0xMC0yNiAxMToxMjozNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL29zcy86IEFjdHVhbGx5IHVzZSB0aGUgJ29zcycgZGVidWcgY2F0ZWdvcnkgd2UgcmVnaXN0ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogc3lzL29zcy9nc3Rvc3NhdWRpby5jOgorCSAgKiBzeXMvb3NzL2dzdG9zc2RtYWJ1ZmZlci5jOgorCSAgKiBzeXMvb3NzL2dzdG9zc2hlbHBlci5jOgorCSAgKiBzeXMvb3NzL2dzdG9zc21peGVyLmM6CisJICAqIHN5cy9vc3MvZ3N0b3NzbWl4ZXJlbGVtZW50LmM6CisJICAqIHN5cy9vc3MvZ3N0b3NzbWl4ZXJ0cmFjay5jOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzoKKwkgICogc3lzL29zcy9nc3Rvc3NzcmMuYzoKKwkgIEFjdHVhbGx5IHVzZSB0aGUgJ29zcycgZGVidWcgY2F0ZWdvcnkgd2UgcmVnaXN0ZXIuCisKKzIwMDUtMTAtMjYgMTA6Mzg6MTggKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IFVzZSBnc3RfcGFkX2dldF9wYXJlbnQgYW5kIGRyb3AgdGhlIHJlZiB0aGF0IHdhcyBhZGRlZCB0aHJvdWdoIHRoYXQgY2FsbC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0yNiAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6CisJICAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX3Npbmtfc2V0Y2FwcyksIChnc3RfdmlkZW9taXhlcl9nZXRjYXBzKToKKwkgIFVzZSBnc3RfcGFkX2dldF9wYXJlbnQgYW5kIGRyb3AgdGhlIHJlZiB0aGF0IHdhcyBhZGRlZCB0aHJvdWdoCisJICB0aGF0IGNhbGwuCisKKzIwMDUtMTAtMjYgMTA6MDM6MDIgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuYzoKKwkgIGZpeCBjb21waWxhdGlvbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggY29tcGlsYXRpb24KKworMjAwNS0xMC0yNSAyMTowOTozNiArMDAwMCAgRmxhdmlvIE9saXZlaXJhIDxmbGF2aW8ub2xpdmVpcmFAaW5kdC5vcmcuYnI+CisKKwkqIENoYW5nZUxvZzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWRlYy5jOgorCSogZ3N0L3J0cC9nc3RydHBnNzExZGVwYXkuYzoKKwkgIEp1c3QgcmVtb3ZlZCBhIGNvdXBsZSBvZiBsaW5lcyBvZiB3ZWlyZCBjb2RlIHVzZWQgZHVyaW5nIGRldmVsb3BtZW50L3Rlc3QgdGltZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgSnVzdCByZW1vdmVkIGEgY291cGxlIG9mIGxpbmVzIG9mIHdlaXJkIGNvZGUgdXNlZCBkdXJpbmcgZGV2ZWxvcG1lbnQvdGVzdCB0aW1lLgorCisyMDA1LTEwLTI1IDE5OjE5OjM4ICswMDAwICBGbGF2aW8gT2xpdmVpcmEgPGZsYXZpby5vbGl2ZWlyYUBpbmR0Lm9yZy5icj4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWRlYy5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzExZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZzcxMWVuYy5oOgorCSogZ3N0L3J0cC9nc3RydHBnNzExcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGc3MTFwYXkuaDoKKwkgIEc3MTEgcGF5bG9hZGVyIGFuZCBkZXBheWxvYWRlciBjcmVhdGVkIGJ5IEVkZ2FyZCBMaW1hIChpdCBzdXBwb3J0cyBtdWxhdyBhbmQgYWxhdyAoZGVjKWVuY29kZXJzKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBHNzExIHBheWxvYWRlciBhbmQgZGVwYXlsb2FkZXIgY3JlYXRlZCBieSBFZGdhcmQgTGltYSAoaXQgc3VwcG9ydHMKKwkgIG11bGF3IGFuZCBhbGF3IChkZWMpZW5jb2RlcnMpCisKKzIwMDUtMTAtMjUgMTc6NTU6MTkgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogRG9oICEgSSBpbnRyb2R1Y2VkIHdpbmdvJ3MgYnVnIGFnYWluICEgU29ycnkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0yNSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogKGdzdF92aWRlb19ib3hfY2xhc3NfaW5pdCksCisJICAoZ3N0X3ZpZGVvX2JveF90cmFuc2Zvcm1fY2FwcyksIChnc3RfdmlkZW9fYm94X2dldF91bml0X3NpemUpOgorCSAgRG9oICEgSSBpbnRyb2R1Y2VkIHdpbmdvJ3MgYnVnIGFnYWluICEgU29ycnkuLi4KKworMjAwNS0xMC0yNSAxNjowMjozOCArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgYWRkIG1pc3NpbmcgaGVhZGVyIGZpbGVzIGZvciBkaXN0aW5nCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCBtaXNzaW5nIGhlYWRlciBmaWxlcyBmb3IgZGlzdGluZworCisyMDA1LTEwLTI1IDE1OjA3OjAyICswMDAwICBaZWVzaGFuIEFsaSA8emVlbml4QGdtYWlsLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBnc21lbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtZW5jLmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBhcnNlLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBhcnNlLmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21wYXkuaDoKKwkgIEdldHRpbmcgdGhlIEdTTSAoZGUpcGF5bG9hZGVyIHdvcmtpbmcgYW5kIGNvbXBhdGlibGUgd2l0aCBvdXIgcGxhbnMgZm9yIFJUUC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgR2V0dGluZyB0aGUgR1NNIChkZSlwYXlsb2FkZXIgd29ya2luZyBhbmQgY29tcGF0aWJsZSB3aXRoIG91ciBwbGFucyBmb3IgUlRQLgorCisyMDA1LTEwLTI1IDEzOjAzOjA0ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC9ydHAvZ3N0cnRwLmM6CisJICBmaXggbWlzdGFrZW4gY2xhaW0gb24gR1BMLCBpdHMgTEdQTAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggbWlzdGFrZW4gY2xhaW0gb24gR1BMLCBpdHMgTEdQTAorCisyMDA1LTEwLTI1IDEwOjQ3OjA5ICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogUHVzaCBhIG5ld3NlZ21lbnQgZXZlbnQsIG1vdmUgc29tZSByZWR1bmRhbnQgY29kZSBpbiBhIHNpbmdsZSBwbGFjZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0yNSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiAodXNlcl9pbmZvX2NhbGxiYWNrKSwKKwkgIChnc3RfcG5nZGVjX2NhcHNfY3JlYXRlX2FuZF9zZXQpLCAoZ3N0X3BuZ2RlY190YXNrKTogUHVzaAorCSAgYSBuZXdzZWdtZW50IGV2ZW50LCBtb3ZlIHNvbWUgcmVkdW5kYW50IGNvZGUgaW4gYSBzaW5nbGUgcGxhY2UuCisKKzIwMDUtMTAtMjUgMTA6MjM6MjYgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiBUZW1wb3JhcnkgaGFjayB0byBnZXQgY29ycmVjdCBjb2xvcnMgb3JkZXIgd2hlbiB3ZSBoYXZlIGEgcG5nIGltYWdlIHdpdGggYWxwaGEgY2hhbm5lbC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0yNSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiAodXNlcl9pbmZvX2NhbGxiYWNrKSwKKwkgIChnc3RfcG5nZGVjX2NhcHNfY3JlYXRlX2FuZF9zZXQpLCAoZ3N0X3BuZ2RlY190YXNrKTogVGVtcG9yYXJ5CisJICBoYWNrIHRvIGdldCBjb3JyZWN0IGNvbG9ycyBvcmRlciB3aGVuIHdlIGhhdmUgYSBwbmcgaW1hZ2Ugd2l0aAorCSAgYWxwaGEgY2hhbm5lbC4KKworMjAwNS0xMC0yNCAxNzoyOTowMiArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZXh0L2R2L2dzdGR2ZGVtdXguYzogQ2FsbCBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgd2hlbiB0aGVyZSB3aWxsIGJlIG5vIG1vcmUgcGFkcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5jOiAoZ3N0X2R2ZGVtdXhfYWRkX3BhZHMpOgorCSAgQ2FsbCBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgd2hlbiB0aGVyZSB3aWxsIGJlIG5vIG1vcmUgcGFkcy4KKworMjAwNS0xMC0yNCAxNjozOTozOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IEFkZGVkIHR3byBuZXcgcGF5bG9hZGVycywgYW4gUkZDIDIxOTAgcGF5bG9hZGVyIGZvciBoMjYzIGFuZCBhIHBheWxvYWQgY29udmVydG9yIGZvciBhbiBhc3RlcmlzayBzZXJ2ZXIuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYzogKGdzdF9hc3Rlcmlza2gyNjNfZ2V0X3R5cGUpLAorCSAgKGdzdF9hc3Rlcmlza2gyNjNfYmFzZV9pbml0KSwgKGdzdF9hc3Rlcmlza2gyNjNfY2xhc3NfaW5pdCksCisJICAoZ3N0X2FzdGVyaXNraDI2M19pbml0KSwgKGdzdF9hc3Rlcmlza2gyNjNfZmluYWxpemUpLAorCSAgKGdzdF9hc3Rlcmlza2gyNjNfY2hhaW4pLCAoZ3N0X2FzdGVyaXNraDI2M19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9hc3Rlcmlza2gyNjNfZ2V0X3Byb3BlcnR5KSwgKGdzdF9hc3Rlcmlza2gyNjNfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfYXN0ZXJpc2toMjYzX3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuaDoKKwkgICogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzZW5jLmM6IChnc3RfcnRwaDI2M2VuY19nZXRfdHlwZSksCisJICAoZ3N0X3J0cGgyNjNlbmNfYmFzZV9pbml0KSwgKGdzdF9ydHBoMjYzZW5jX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBoMjYzZW5jX2luaXQpLCAoZ3N0X3J0cGgyNjNlbmNfZmluYWxpemUpLAorCSAgKGdzdF9ydHBoMjYzZW5jX3NldGNhcHMpLCAoZ3N0X3J0cGgyNjNlbmNfZ29iZmluZXIpLAorCSAgKGdzdF9ydHBoMjYzZW5jX2ZsdXNoKSwgKGdzdF9ydHBoMjYzZW5jX2hhbmRsZV9idWZmZXIpLAorCSAgKGdzdF9ydHBoMjYzZW5jX3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBoMjYzZW5jLmg6CisJICBBZGRlZCB0d28gbmV3IHBheWxvYWRlcnMsIGFuIFJGQyAyMTkwIHBheWxvYWRlciBmb3IgaDI2MyBhbmQKKwkgIGEgcGF5bG9hZCBjb252ZXJ0b3IgZm9yIGFuIGFzdGVyaXNrIHNlcnZlci4KKworMjAwNS0xMC0yNCAxNTo1NzoxNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgc3lzL29zcy9nc3Rvc3NzcmMuYzogU2V0IGJ5dGVzX3Blcl9zYW1wbGUgY29ycmVjdGx5IChpcyBub3QgYWx3YXlzIDQsIGJ1dCBkZXBlbmRzIG9uIHdpZHRoIGFuZCBudW1iZXIgb2YgY2hhbm5lbHMpLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6IChnc3Rfb3NzX3NyY19wcmVwYXJlKToKKwkgIFNldCBieXRlc19wZXJfc2FtcGxlIGNvcnJlY3RseSAoaXMgbm90IGFsd2F5cyA0LCBidXQKKwkgIGRlcGVuZHMgb24gd2lkdGggYW5kIG51bWJlciBvZiBjaGFubmVscykuCisKKzIwMDUtMTAtMjQgMTU6NTA6MDYgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9mbGFjL2dzdGZsYWNlbmMuKjogRml4IHNlZWtpbmcsIHNvIHRoYXQgZmxhY2VuYyBjYW4gcmV3cml0ZSB0aGUgaGVhZGVyIHdpdGggdGhlIGNvcnJlY3QgZHVyYXRpb24gYW5kIGFtb3VudCBvZiBzYS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzogKGdzdF9mbGFjZW5jX2Jhc2VfaW5pdCksCisJICAoZ3N0X2ZsYWNlbmNfaW5pdCksIChnc3RfZmxhY2VuY19zaW5rX3NldGNhcHMpLAorCSAgKGdzdF9mbGFjZW5jX3NlZWtfY2FsbGJhY2spLCAoZ3N0X2ZsYWNlbmNfd3JpdGVfY2FsbGJhY2spLAorCSAgKGdzdF9mbGFjZW5jX3NpbmtfZXZlbnQpLCAoZ3N0X2ZsYWNlbmNfY2hhaW4pLAorCSAgKGdzdF9mbGFjZW5jX3NldF9wcm9wZXJ0eSksIChnc3RfZmxhY2VuY19nZXRfcHJvcGVydHkpLAorCSAgKGdzdF9mbGFjZW5jX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNlbmMuaDoKKwkgIEZpeCBzZWVraW5nLCBzbyB0aGF0IGZsYWNlbmMgY2FuIHJld3JpdGUgdGhlIGhlYWRlciB3aXRoIHRoZQorCSAgY29ycmVjdCBkdXJhdGlvbiBhbmQgYW1vdW50IG9mIHNhbXBsZXMgYW5kIGFsbCB0aGF0IGF0IEVPUzsKKwkgIGFsc28gc2V0IHRpbWVzdGFtcHMgYW5kIGdyYW51bGVwb3Mgb24gb3V0Z29pbmcgYnVmZmVyczsgYWRkCisJICBkZWJ1ZyBjYXRlZ29yeTsgZml4IHN0YXRlIGNoYW5nZSBmdW5jdGlvbi4KKworMjAwNS0xMC0yNCAxMzo0NjowOSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogRG9uJ3QgcmVzdHJpY3QgdmlkZW8gZ2VvbWV0cnkgZnJvbSAxNiB0byA0MDk2LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEwLTI0ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogRG9uJ3QgcmVzdHJpY3QgdmlkZW8gZ2VvbWV0cnkKKwkgIGZyb20gMTYgdG8gNDA5Ni4KKworMjAwNS0xMC0yNCAxMzoyMjoxNCArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOiBGaXggY2FwcyBuZWdvdGlhdGlvbiBjb3JyZWN0bHksIGFkZCBkZWJ1Z2dpbmcgY2F0ZWdvcnkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTAtMjQgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2NsYXNzX2luaXQpLAorCSAgKGdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2NhcHMpLCAoZ3N0X3ZpZGVvX2JveF9nZXRfdW5pdF9zaXplKToKKwkgIEZpeCBjYXBzIG5lZ290aWF0aW9uIGNvcnJlY3RseSwgYWRkIGRlYnVnZ2luZyBjYXRlZ29yeS4KKworMjAwNS0xMC0yNCAxMzowMjo0NyArMDAwMCAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb25maWd1cmUuYWM6CisJICBwb3J0IG92ZXIgcGx1Z2luIGxpc3RpbmcgZnJvbSBiYXNlCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHBvcnQgb3ZlciBwbHVnaW4gbGlzdGluZyBmcm9tIGJhc2UKKworMjAwNS0xMC0yNCAwODo1OToyNCArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IERvbid0IHVzZSBmaXhlZCBjYXBzIG9uIGEgc2luayBwYWQuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTAtMjQgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKGdzdF9wbmdkZWNfaW5pdCk6IERvbid0IHVzZSBmaXhlZAorCSAgY2FwcyBvbgorCSAgYSBzaW5rIHBhZC4KKworMjAwNS0xMC0yMyAyMzowNTo1OSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvdXBsb2FkLm1hazoKKwkgIGJhY2sgdG8gSEVBRAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBiYWNrIHRvIEhFQUQKKworPT09IHJlbGVhc2UgMC45LjQgPT09CisKKzIwMDUtMTAtMjMgMjI6NDM6MDggKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVMRUFTRToKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGRvY3MvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnNpZ25hbHM6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlYnVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZlbmNlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdjb25mZWxlbWVudHMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWpwZWcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJICByZWxlYXNpbmcgMC45LjQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmVsZWFzaW5nIDAuOS40CisKKzIwMDUtMTAtMjMgMTE6MDc6MTAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJKiBwby9QT1RGSUxFUy5pbjoKKwkgIFNUT1BQRUQtPkZBSUxFRAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBTVE9QUEVELT5GQUlMRUQKKworMjAwNS0xMC0yMSAxNzowMDo1OCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IEFkZCBwb3NpdGlvbiBhbmQgZHVyYXRpb24gcXVlcnksIGZpeCBxdWVyeSB0eXBlIGZ1bmN0aW9uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiAoZ3N0X3NwZWV4ZW5jX2dldF9xdWVyeV90eXBlcyksCisJICAoZ3N0X3NwZWV4ZW5jX3NyY19xdWVyeSk6CisJICBBZGQgcG9zaXRpb24gYW5kIGR1cmF0aW9uIHF1ZXJ5LCBmaXggcXVlcnkgdHlwZSBmdW5jdGlvbi4KKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X3ZpZGVvX2NhcHMpLCAoZ3N0X21hdHJvc2thX2RlbXV4X2F1ZGlvX2NhcHMpOgorCSAgTGV0J3Mgbm90IHNldCBub24tZml4ZWQgY2FwcyBvbiBzb3VyY2UgcGFkcy4KKworMjAwNS0xMC0yMSAxNjoxNTo1NyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgU2V0IGNvcnJlY3Qgc3RyZWFtX3RpbWUgaW4gbmV3c2VnbWVudCBldmVudC4gYXZpIGNhbiBhbHNvIGhhbmRsZSBhIGR1cmF0aW9uIHF1ZXJ5IG5vdy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvZHYvZ3N0ZHZkZW11eC5jOiAoZ3N0X2R2ZGVtdXhfZGVtdXhfZnJhbWUpOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2dldF9zcmNfcXVlcnlfdHlwZXMpLAorCSAgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspOgorCSAgU2V0IGNvcnJlY3Qgc3RyZWFtX3RpbWUgaW4gbmV3c2VnbWVudCBldmVudC4KKwkgIGF2aSBjYW4gYWxzbyBoYW5kbGUgYSBkdXJhdGlvbiBxdWVyeSBub3cuCisKKzIwMDUtMTAtMjEgMTA6MDY6NDAgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgdXBkYXRlIGZvciBsYXRlc3QgYWRkaXRpb25zCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIHVwZGF0ZSBmb3IgbGF0ZXN0IGFkZGl0aW9ucworCisyMDA1LTEwLTIwIDE5OjE0OjI3ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogRml4IGR1cmF0aW9uIHF1ZXJ5OyBmaXggYmFzZXRpbWUgaW4gbmV3c2VnbWVudCBldmVudCBhZnRlciBzZWVrOyBmaXggZHVyYXRpb24gaW4gaW5pdGkuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksCisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50KSwKKwkgIChnc3RfbWF0cm9za2FfZGVtdXhfbG9vcF9zdHJlYW1fcGFyc2VfaWQpOgorCSAgRml4IGR1cmF0aW9uIHF1ZXJ5OyBmaXggYmFzZXRpbWUgaW4gbmV3c2VnbWVudCBldmVudCBhZnRlcgorCSAgc2VlazsgZml4IGR1cmF0aW9uIGluIGluaXRpYWwgbmV3c2VnbWVudCBldmVudC4KKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSAgKGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX3NldGNhcHMpLCAoZ3N0X21hdHJvc2thX211eF9zdGFydCk6CisJICBFeHRyYWN0IG51bWJlciBvZiBjaGFubmVscyBhbmQgc2FtcGxlcmF0ZSBmcm9tIHZvcmJpcyBoZWFkZXJzOworCSAgYWRkIHNvbWUgZGVidWcgbWVzc2FnZXMgd2hlbiBxdWVyeWluZyB0aGUgZHVyYXRpb25zIG9mIHRoZQorCSAgaW5wdXQgc3RyZWFtcy4KKworMjAwNS0xMC0yMCAxMTo1MDo1MyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IFNldCBzdHJlYW0gdGltZSBjb3JyZWN0bHkgaW4gbmV3c2VnbWVudC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9oYW5kbGVfc2VlayksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSksCisJICAoZ3N0X3dhdnBhcnNlX3BhZF9jb252ZXJ0KSwgKGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQpOgorCSAgU2V0IHN0cmVhbSB0aW1lIGNvcnJlY3RseSBpbiBuZXdzZWdtZW50LgorCisyMDA1LTEwLTIwIDExOjM5OjQwICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IENvcnJlY3RseSBmaWxsIGluIHRoZSBzdHJlYW0gdGltZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrKToKKwkgIENvcnJlY3RseSBmaWxsIGluIHRoZSBzdHJlYW0gdGltZS4KKworMjAwNS0xMC0xOSAyMDo0ODoyNCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGNoZWNrL2VsZW1lbnRzL2xldmVsLmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkqIGdzdC9sZXZlbC9sZXZlbC1leGFtcGxlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgdXNlIEVMRU1FTlQgbWVzc2FnZXMgaW5zdGVhZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICB1c2UgRUxFTUVOVCBtZXNzYWdlcyBpbnN0ZWFkCisKKzIwMDUtMTAtMTkgMTU6NTg6MDAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC86IEFQSSBjaGFuZ2UgZml4LgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2dldF9zcmNfcXVlcnlfdHlwZXMpLAorCSAgKGdzdF9xdGRlbXV4X2hhbmRsZV9zcmNfcXVlcnkpOgorCSAgKiBnc3Qvc3BlZWQvZ3N0c3BlZWQuYzogKHNwZWVkX2dldF9xdWVyeV90eXBlcyksIChzcGVlZF9zcmNfcXVlcnkpOgorCSAgKiBnc3QvdHRhL2dzdHR0YXBhcnNlLmM6IChnc3RfdHRhX3BhcnNlX3NyY19ldmVudCksCisJICAoZ3N0X3R0YV9wYXJzZV9nZXRfcXVlcnlfdHlwZXMpLCAoZ3N0X3R0YV9wYXJzZV9xdWVyeSk6CisJICBBUEkgY2hhbmdlIGZpeC4KKworMjAwNS0xMC0xOSAxNTo1NzowNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgQVBJIGNoYW5nZSBmaXguCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2dldF9zcmNfcXVlcnlfdHlwZXMpLAorCSAgKGdzdF9kdmRlbXV4X3NyY19xdWVyeSk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjZGVjX2xlbmd0aCksCisJICAoZ3N0X2ZsYWNkZWNfc3JjX3F1ZXJ5KToKKwkgICogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IChnc3RfZHYxMzk0c3JjX3F1ZXJ5KToKKwkgICogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IChzcGVleF9kZWNfc3JjX3F1ZXJ5KToKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KToKKwkgICogZ3N0L2RlYnVnL2dzdG5hdnNlZWsuYzogKGdzdF9uYXZzZWVrX3NlZWspOgorCSAgKiBnc3QvZGVidWcvcHJvZ3Jlc3NyZXBvcnQuYzogKGdzdF9wcm9ncmVzc19yZXBvcnRfcmVwb3J0KToKKwkgICogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOiAoZ3N0X2VibWxfcmVhZF9nZXRfbGVuZ3RoKToKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X3N0YXJ0KToKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfaGFuZGxlX3NlZWspLAorCSAgKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpLAorCSAgKGdzdF93YXZwYXJzZV9wYWRfY29udmVydCksIChnc3Rfd2F2cGFyc2VfcGFkX3F1ZXJ5KSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3JjcGFkX2V2ZW50KToKKwkgIEFQSSBjaGFuZ2UgZml4LgorCisyMDA1LTEwLTE5IDEwOjU3OjQ2ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvZ29vbS86IE1ha2UgaW5saW5lIGZ1bmN0aW9ucyBlaXRoZXIgJ3N0YXRpYyBpbmxpbmUnIG9yICdleHRlcm4gaW5saW5lJywgb3RoZXJ3aXNlIHRoZSBGb3J0ZSBjb21waWxlciBhcHBhcmVudGx5IHcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvZ29vbS9maWx0ZXJzLmM6CisJICAqIGdzdC9nb29tL2dyYXBoaWMuaDoKKwkgICogZ3N0L2dvb20vbGluZXMuYzoKKwkgIE1ha2UgaW5saW5lIGZ1bmN0aW9ucyBlaXRoZXIgJ3N0YXRpYyBpbmxpbmUnIG9yICdleHRlcm4gaW5saW5lJywKKwkgIG90aGVyd2lzZSB0aGUgRm9ydGUgY29tcGlsZXIgYXBwYXJlbnRseSB3b24ndCBpbmxpbmUgdGhlbSAoIzMxNzMwMCkuCisKKzIwMDUtMTAtMTggMjI6NTA6MTEgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiBmb3Jnb3QgdGhlIGJ1ZmZlciB1bnJlZiBpbiBwdWxsLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEwLTE5ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IGZvcmdvdCB0aGUgYnVmZmVyIHVucmVmIGluIHB1bGwuCisKKzIwMDUtMTAtMTggMjI6NDQ6MTEgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBleHQvbGlicG5nL2dzdHBuZ2RlYy4qOiBDb21wbGV0ZSByZXdyaXRlIG9mIHBuZ2RlYy4gSXQncyBub3cgdmVyeSBuaWNlIGFuZCBoYW5kbGUgcHVzaC9wdWxsIGJhc2VkIG1vZGVsLiBpZiB5b3UgaGF2ZSAuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0xOSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiAoZ3N0X3BuZ2RlY19jbGFzc19pbml0KSwKKwkgIChnc3RfcG5nZGVjX2luaXQpLCAodXNlcl9lcnJvcl9mbiksICh1c2VyX3dhcm5pbmdfZm4pLAorCSAgKHVzZXJfaW5mb19jYWxsYmFjayksICh1c2VyX2VuZHJvd19jYWxsYmFjayksCisJICAodXNlcl9lbmRfY2FsbGJhY2spLAorCSAgKHVzZXJfcmVhZF9kYXRhKSwgKGdzdF9wbmdkZWNfY2Fwc19jcmVhdGVfYW5kX3NldCksCisJICAoZ3N0X3BuZ2RlY190YXNrKSwgKGdzdF9wbmdkZWNfY2hhaW4pLCAoZ3N0X3BuZ2RlY19zaW5rX2V2ZW50KSwKKwkgIChnc3RfcG5nZGVjX2xpYnBuZ19jbGVhciksIChnc3RfcG5nZGVjX2xpYnBuZ19pbml0KSwKKwkgIChnc3RfcG5nZGVjX2NoYW5nZV9zdGF0ZSksIChnc3RfcG5nZGVjX3NpbmtfYWN0aXZhdGVfcHVzaCksCisJICAoZ3N0X3BuZ2RlY19zaW5rX2FjdGl2YXRlX3B1bGwpLCAoZ3N0X3BuZ2RlY19zaW5rX2FjdGl2YXRlKToKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuaDogQ29tcGxldGUgcmV3cml0ZSBvZiBwbmdkZWMuIEl0J3Mgbm93CisJICB2ZXJ5IG5pY2UgYW5kIGhhbmRsZSBwdXNoL3B1bGwgYmFzZWQgbW9kZWwuIGlmIHlvdSBoYXZlIGZpbGVzcmMKKwkgIGNvbm5lY3RlZCB0byBpdCwgaXQgd2lsbCBkbyByYW5kb20gYWNjZXNzIHRvIGxvYWQgdGhlIHBuZyBmaWxlLgorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIHNvdXJjZSB0aGF0IGNhbid0IGRvIF9nZXRyYW5nZSwgaXQgZG9lcworCSAgcHJvZ3Jlc3NpdmUgbG9hZGluZyB0aHJvdWdoIHRoZSBjaGFpbiBmdW5jdGlvbi4KKwkgICogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzogKGdzdF9hbHBoYV9jb2xvcl90cmFuc2Zvcm1fY2FwcyksCisJICAodHJhbnNmb3JtX3JnYiksICh0cmFuc2Zvcm1fYmdyKTogRml4IGNhcHMgbmVnb3RpYXRpb24gY29ycmVjdGx5CisJICB0aGFua3MgdG8gTWFzdGVyIFdpbSBUYXltYW5zIDstKQorCisyMDA1LTEwLTE4IDE4OjEyOjMxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvbWF0cm9za2EvOiBQb3J0ZWQgbWF0cm9za2EgZGVtdXhlciB0byAwLjkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6CisJICAqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuaDoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EuYzogKHBsdWdpbl9pbml0KToKKwkgIFBvcnRlZCBtYXRyb3NrYSBkZW11eGVyIHRvIDAuOS4KKworMjAwNS0xMC0xOCAxODowNjoxNCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiBGaXggbXBlZzQgaW5wdXQgaGFuZGxpbmcgKCMzMTg4NDcpOyBhbHNvLCB3aGlsZSB3ZSdyZSBhdCBpdCwgZml4IG1lZGlhIHR5cGUgZm9yIE1vdGlvbi1KLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzoKKwkgIChnc3RfbWF0cm9za2FfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzKSwKKwkgIChnc3RfbWF0cm9za2FfbXV4X2F1ZGlvX3BhZF9zZXRjYXBzKToKKwkgIEZpeCBtcGVnNCBpbnB1dCBoYW5kbGluZyAoIzMxODg0Nyk7IGFsc28sIHdoaWxlIHdlJ3JlIGF0IGl0LAorCSAgZml4IG1lZGlhIHR5cGUgZm9yIE1vdGlvbi1KUEVHOiBzaG91bGQgYmUgaW1hZ2UvanBlZy4KKworMjAwNS0xMC0xOCAxMzoyMToxOCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IEZpeCBmb3Igc2VnbWVudC1zdGFydC9zdG9wIEFQSSBjaGFuZ2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfaGFuZGxlX3NlZWspLAorCSAgKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2RhdGEpLAorCSAgKGdzdF93YXZwYXJzZV9wYWRfY29udmVydCksIChnc3Rfd2F2cGFyc2Vfc3JjcGFkX2V2ZW50KToKKwkgIEZpeCBmb3Igc2VnbWVudC1zdGFydC9zdG9wIEFQSSBjaGFuZ2UuCisKKzIwMDUtMTAtMTcgMTc6MTg6NTYgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOiBIYW5kbGUgY2FwcyBuZWdvdGlhdGlvbiBpbiBhIGJldHRlciB3YXkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTAtMTcgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzogKGdzdF9hbHBoYV9jb2xvcl90cmFuc2Zvcm1fY2FwcyksCisJICAodHJhbnNmb3JtX3JnYiksICh0cmFuc2Zvcm1fYmdyKTogSGFuZGxlIGNhcHMgbmVnb3RpYXRpb24gaW4gYQorCSAgYmV0dGVyCisJICB3YXkuCisKKzIwMDUtMTAtMTcgMTY6NTk6MjAgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogRml4IGNhcHMgbmVnbyBzb21lIG1vcmUgdG8gZ2V0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTAtMTcgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X3RyYW5zZm9ybV9jYXBzKSwKKwkgIChnc3RfdmlkZW9fYm94X2dldF91bml0X3NpemUpOiBGaXggY2FwcyBuZWdvIHNvbWUgbW9yZSB0byBnZXQKKwkgIEFZVVYKKwkgIG91dHB1dCBkZWNsYXJlZCBpbiB0cmFuc2Zvcm1fY2Fwcy4KKworMjAwNS0xMC0xNyAxNToyMzoyNCArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IFdlIHVzZSBmaXhlZCBjYXBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEwLTE3ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IChnc3RfcG5nZGVjX2luaXQpOiBXZSB1c2UgZml4ZWQgY2Fwcy4KKworMjAwNS0xMC0xNyAxNToxNDoyOSArMDAwMCAgSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkgIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOiBGaXggd3Jvbmcgc2l6ZSBjYWxjdWxhdGlvbnMgYW5kIGltcGxlbWVudCBnZXRfdW5pdF9zaXplIGNvcnJlY3RseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0xNyAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCSAgKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogKGdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2NhcHMpLAorCSAgKGdzdF92aWRlb19ib3hfZ2V0X3VuaXRfc2l6ZSk6IEZpeCB3cm9uZyBzaXplIGNhbGN1bGF0aW9ucyBhbmQKKwkgIGltcGxlbWVudCBnZXRfdW5pdF9zaXplIGNvcnJlY3RseS4KKworMjAwNS0xMC0xNyAxNDo1NjoxMiArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBFbmFibGUgZmx4IHBsdWdpbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICBFbmFibGUgZmx4IHBsdWdpbi4KKwkgICogZ3N0L2ZseC9nc3RmbHhkZWMuYzogKGZseF9kZWNvZGVfY2h1bmtzKToKKwkgIEZpeCBnY2M0IHNpZ25lZG5lc3MgaXNzdWUuCisKKzIwMDUtMTAtMTcgMDg6NDY6MzAgKzAwMDAgIEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJICBjb25maWd1cmUuYWM6IEFkZGluZyB2aWRlb21peGVyLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEwLTE3ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisJICAqIGNvbmZpZ3VyZS5hYzogQWRkaW5nIHZpZGVvbWl4ZXIuCisJICAqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IChnc3RfcG5nZGVjX2NsYXNzX2luaXQpLAorCSAgKHVzZXJfcmVhZF9kYXRhKSwgKGdzdF9wbmdkZWNfY2hhaW4pOiBNb3JlIGRlYnVnZ2luZy4KKwkgICogZ3N0L2FscGhhL01ha2VmaWxlLmFtOiBBZGRpbmcgYWxwaGFjb2xvcgorCSAgKiBnc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5jOiAoZ3N0X2FscGhhX2NvbG9yX2Jhc2VfaW5pdCksCisJICAoZ3N0X2FscGhhX2NvbG9yX2NsYXNzX2luaXQpLCAoZ3N0X2FscGhhX2NvbG9yX2luaXQpLAorCSAgKGdzdF9hbHBoYV9jb2xvcl90cmFuc2Zvcm1fY2FwcyksIChnc3RfYWxwaGFfY29sb3Jfc2V0X2NhcHMpLAorCSAgKHRyYW5zZm9ybV9yZ2IpLCAodHJhbnNmb3JtX2JnciksCisJICAoZ3N0X2FscGhhX2NvbG9yX3RyYW5zZm9ybV9pcCksCisJICAocGx1Z2luX2luaXQpOiBQb3J0ZWQgdG8gMC45IHVzaW5nIGluIHBsYWNlIGJhc2UgdHJhbmZvcm0uCisJICAqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IChnc3RfdmlkZW9taXhlcl9wYWRfZ2V0X3R5cGUpLAorCSAgKGdzdF92aWRlb21peGVyX3BhZF9jbGFzc19pbml0KSwKKwkgIChnc3RfdmlkZW9taXhlcl9wYWRfc2lua19zZXRjYXBzKSwKKwkgIChnc3RfdmlkZW9taXhlcl9wYWRfbGluayksIChnc3RfdmlkZW9taXhlcl9wYWRfdW5saW5rKSwKKwkgIChnc3RfdmlkZW9taXhlcl9wYWRfaW5pdCksIChnc3RfdmlkZW9taXhlcl9jbGFzc19pbml0KSwKKwkgIChnc3RfdmlkZW9taXhlcl9pbml0KSwgKGdzdF92aWRlb21peGVyX2dldGNhcHMpLAorCSAgKGdzdF92aWRlb21peGVyX3JlcXVlc3RfbmV3X3BhZCksIChnc3RfdmlkZW9taXhlcl9maWxsX3F1ZXVlcyksCisJICAoZ3N0X3ZpZGVvbWl4ZXJfYmxlbmRfYnVmZmVycyksIChnc3RfdmlkZW9taXhlcl91cGRhdGVfcXVldWVzKSwKKwkgIChnc3RfdmlkZW9taXhlcl9jb2xsZWN0ZWQpLCAoZ3N0X3ZpZGVvbWl4ZXJfY2hhbmdlX3N0YXRlKToKKwkgIFBvcnRlZAorCSAgdG8gMC45IHVzaW5nIGNvbGxlY3RwYWRzLgorCisyMDA1LTEwLTE2IDIxOjE5OjQ0ICswMDAwICBaZWVzaGFuIEFsaSA8emVlbml4QGdtYWlsLmNvbT4KKworCSogQ2hhbmdlTG9nOgorCSogY29tbW9uOgorCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2ZseC9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5oOgorCSAgZmx4IHBsdWdpbiBwb3J0ZWQgdG8gMC45CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZseCBwbHVnaW4gcG9ydGVkIHRvIDAuOQorCisyMDA1LTEwLTE2IDE0OjMzOjA1ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkgIHVzZSBnc3RfdmVyc2lvbl9zdHJpbmcKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdXNlIGdzdF92ZXJzaW9uX3N0cmluZworCisyMDA1LTEwLTE2IDEzOjE3OjExICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIGNvbmZpZ3VyZS5hYzogR0xJQl9DSEVDSy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0xNiAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogY29uZmlndXJlLmFjOiBHTElCX0NIRUNLLgorCisyMDA1LTEwLTE1IDE2OjQ4OjU1ICswMDAwICBKdWxpZW4gTW91dHRlIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSAgZXh0L2xpYnBuZy86IFBvcnRlZCBwbmdkZWMgdG8gMC45CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTAtMTUgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKwkgICogZXh0L2xpYnBuZy9NYWtlZmlsZS5hbToKKwkgICogZXh0L2xpYnBuZy9nc3RwbmcuYzogKHBsdWdpbl9pbml0KToKKwkgICogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzogKGdzdF9wbmdkZWNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3BuZ2RlY19pbml0KSwgKHVzZXJfcmVhZF9kYXRhKSwgKGdzdF9wbmdkZWNfY2hhaW4pOgorCSAgKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5oOiBQb3J0ZWQgcG5nZGVjIHRvIDAuOQorCisyMDA1LTEwLTE0IDEyOjQzOjMwICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBQb3J0IG1hdHJvc2thIG11eGVyIHRvIDAuOSAoIzMxODg0NykuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFJldmlld2VkIGJ5OiBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgICogZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvbWF0cm9za2EvZWJtbC1pZHMuaDoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgICogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuaDoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6CisJICAqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaDoKKwkgICogZ3N0L21hdHJvc2thL21hdHJvc2thLmM6IChwbHVnaW5faW5pdCk6CisJICBQb3J0IG1hdHJvc2thIG11eGVyIHRvIDAuOSAoIzMxODg0NykuCisKKzIwMDUtMTAtMTMgMTg6NTk6MzUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiBGaXggaGFuZGxpbmcgb2YgR1NUX1RBR19EQVRFLCB3aGljaCBpcyBub3cgb2YgR1NUX1RZUEVfREFURTsgdXNlIEdTVF9SRUFEX1VJTlQzMl9MRSgpIGFuZCBmci4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiAoZ3N0X3NwZWV4ZW5jX2dldF90YWdfdmFsdWUpLAorCSAgKGNvbW1lbnRfaW5pdCksIChjb21tZW50X2FkZCk6CisJICBGaXggaGFuZGxpbmcgb2YgR1NUX1RBR19EQVRFLCB3aGljaCBpcyBub3cgb2YgR1NUX1RZUEVfREFURTsKKwkgIHVzZSBHU1RfUkVBRF9VSU5UMzJfTEUoKSBhbmQgZnJpZW5kcyByYXRoZXIgdGhhbiB0aGUgcHJpdmF0ZQorCSAgaW1wbGVtZW50YXRpb24gb2YgdGhvc2Ugc2FtZSBtYWNyb3MuCisKKzIwMDUtMTAtMTMgMTY6MDE6MzUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBleHQvY2Fpcm8vTWFrZWZpbGUuYW06CisJICBmaXggZGlzdAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBmaXggZGlzdAorCisyMDA1LTEwLTEzIDE1OjI4OjAxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGV4YW1wbGVzL3N0YXRzL21wMm9nZy5jOiBtb3JlIHR5cG8gZml4ZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleGFtcGxlcy9zdGF0cy9tcDJvZ2cuYzoKKwkgIG1vcmUgdHlwbyBmaXhlcworCisyMDA1LTEwLTEyIDE0OjI5OjU1ICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIHJlbmFtZWQgR1NUX0ZMQUdTIG1hY3JvcyB0byBHU1RfT0JKRUNUX0ZMQUdTIG1vdmVkIGJpdHNoaWZ0IGZyb20gbWFjcm8gdG8gZW51bSBkZWZpbml0aW9uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXhhbXBsZXMvaW5kZXhpbmcvaW5kZXhtcGVnLmM6IChtYWluKToKKwkgICogZXh0L2FydHNkL2dzdGFydHNkc2luay5jOiAoZ3N0X2FydHNkc2lua19vcGVuX2F1ZGlvKSwKKwkgIChnc3RfYXJ0c2RzaW5rX2Nsb3NlX2F1ZGlvKSwgKGdzdF9hcnRzZHNpbmtfY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2FydHNkL2dzdGFydHNkc2luay5oOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmcGFyc2UuYzogKGdzdF9hZnBhcnNlX29wZW5fZmlsZSksCisJICAoZ3N0X2FmcGFyc2VfY2xvc2VfZmlsZSk6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZwYXJzZS5oOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc2luay5jOiAoZ3N0X2Fmc2lua19vcGVuX2ZpbGUpLAorCSAgKGdzdF9hZnNpbmtfY2xvc2VfZmlsZSksIChnc3RfYWZzaW5rX2NoYWluKSwKKwkgIChnc3RfYWZzaW5rX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzaW5rLmg6CisJICAqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzcmMuYzogKGdzdF9hZnNyY19vcGVuX2ZpbGUpLAorCSAgKGdzdF9hZnNyY19jbG9zZV9maWxlKSwgKGdzdF9hZnNyY19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvYXVkaW9maWxlL2dzdGFmc3JjLmg6CisJICAqIGV4dC9jZGF1ZGlvL2dzdGNkYXVkaW8uYzogKGdzdF9jZGF1ZGlvX2luaXQpOgorCSAgKiBleHQvZGlyZWN0ZmIvZGlyZWN0ZmJ2aWRlb3NpbmsuYzogKGdzdF9kaXJlY3RmYnZpZGVvc2lua19pbml0KToKKwkgICogZXh0L2R0cy9nc3RkdHNkZWMuYzogKGdzdF9kdHNkZWNfaW5pdCk6CisJICAqIGV4dC9qYWNrL2dzdGphY2suaDoKKwkgICogZXh0L2phY2svZ3N0amFja2Jpbi5jOiAoZ3N0X2phY2tfYmluX2luaXQpLAorCSAgKGdzdF9qYWNrX2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvbXVzZXBhY2svZ3N0bXVzZXBhY2tkZWMuYzogKGdzdF9tdXNlcGFja2RlY19pbml0KToKKwkgICogZXh0L211c2ljYnJhaW56L2dzdHRybS5jOiAoZ3N0X211c2ljYnJhaW56X2luaXQpOgorCSAgKiBleHQvbmFzL25hc3NpbmsuYzogKGdzdF9uYXNzaW5rX29wZW5fYXVkaW8pLAorCSAgKGdzdF9uYXNzaW5rX2Nsb3NlX2F1ZGlvKSwgKGdzdF9uYXNzaW5rX2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9uYXMvbmFzc2luay5oOgorCSAgKiBleHQvcG9seXAvcG9seXBzaW5rLmM6IChnc3RfcG9seXBzaW5rX2luaXQpOgorCSAgKiBleHQvc2RsL3NkbHZpZGVvc2luay5jOiAoZ3N0X3NkbHZpZGVvc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBleHQvc2RsL3NkbHZpZGVvc2luay5oOgorCSAgKiBleHQvc21vb3Rod2F2ZS9nc3RzbW9vdGh3YXZlLmM6IChnc3Rfc21vb3Rod2F2ZV9pbml0KToKKwkgICogZXh0L3NuZGZpbGUvZ3N0c2YuYzogKGdzdF9zZl9zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9zZl9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3NmX3JlbGVhc2VfcmVxdWVzdF9wYWQpLAorCSAgKGdzdF9zZl9vcGVuX2ZpbGUpLCAoZ3N0X3NmX2Nsb3NlX2ZpbGUpLCAoZ3N0X3NmX2xvb3ApOgorCSAgKiBleHQvc25kZmlsZS9nc3RzZi5oOgorCSAgKiBleHQvc3dmZGVjL2dzdHN3ZmRlYy5jOiAoZ3N0X3N3ZmRlY19pbml0KToKKwkgICogZXh0L3Rhcmtpbi9nc3R0YXJraW5kZWMuYzogKGdzdF90YXJraW5kZWNfaW5pdCk6CisJICAqIGdzdC9hcGV0YWcvYXBlZGVtdXguYzogKGdzdF9hcGVfZGVtdXhfaW5pdCk6CisJICAqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXBhcnNlLmM6IChnc3RfY2R4YXBhcnNlX2luaXQpOgorCSAgKiBnc3QvY2R4YXBhcnNlL2dzdGNkeGFzdHJpcC5jOiAoZ3N0X2NkeGFzdHJpcF9pbml0KToKKwkgICogZ3N0L2Zlc3RpdmFsL2dzdGZlc3RpdmFsLmM6IChnc3RfZmVzdGl2YWxfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L2Zlc3RpdmFsL2dzdGZlc3RpdmFsLmg6CisJICAqIGdzdC9tcGVnMnN1Yi9nc3RtcGVnMnN1YnQuYzogKGdzdF9tcGVnMnN1YnRfaW5pdCk6CisJICAqIGdzdC9tdWx0aWZpbGVzaW5rL2dzdG11bHRpZmlsZXNpbmsuYzogKGdzdF9tdWx0aWZpbGVzaW5rX2luaXQpLAorCSAgKGdzdF9tdWx0aWZpbGVzaW5rX3NldF9sb2NhdGlvbiksIChnc3RfbXVsdGlmaWxlc2lua19vcGVuX2ZpbGUpLAorCSAgKGdzdF9tdWx0aWZpbGVzaW5rX2Nsb3NlX2ZpbGUpLCAoZ3N0X211bHRpZmlsZXNpbmtfbmV4dF9maWxlKSwKKwkgIChnc3RfbXVsdGlmaWxlc2lua19wYWRfcXVlcnkpLCAoZ3N0X211bHRpZmlsZXNpbmtfaGFuZGxlX2V2ZW50KSwKKwkgIChnc3RfbXVsdGlmaWxlc2lua19jaGFpbiksIChnc3RfbXVsdGlmaWxlc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvbXVsdGlmaWxlc2luay9nc3RtdWx0aWZpbGVzaW5rLmg6CisJICAqIGdzdC92aWRlb2Ryb3AvZ3N0dmlkZW9kcm9wLmM6IChnc3RfdmlkZW9kcm9wX2luaXQpOgorCSAgKiBzeXMvY2Ryb20vZ3N0Y2RwbGF5ZXIuYzogKGNkcGxheWVyX2luaXQpOgorCSAgKiBzeXMvZHhyMy9keHIzYXVkaW9zaW5rLmM6IChkeHIzYXVkaW9zaW5rX2luaXQpLAorCSAgKGR4cjNhdWRpb3Npbmtfb3BlbiksIChkeHIzYXVkaW9zaW5rX2Nsb3NlKSwKKwkgIChkeHIzYXVkaW9zaW5rX2NoYWluX3BjbSksIChkeHIzYXVkaW9zaW5rX2NoYWluX2FjMyksCisJICAoZHhyM2F1ZGlvc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBzeXMvZHhyMy9keHIzYXVkaW9zaW5rLmg6CisJICAqIHN5cy9keHIzL2R4cjNzcHVzaW5rLmM6IChkeHIzc3B1c2lua19pbml0KSwgKGR4cjNzcHVzaW5rX29wZW4pLAorCSAgKGR4cjNzcHVzaW5rX2Nsb3NlKSwgKGR4cjNzcHVzaW5rX2NoYWluKSwKKwkgIChkeHIzc3B1c2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBzeXMvZHhyMy9keHIzc3B1c2luay5oOgorCSAgKiBzeXMvZHhyMy9keHIzdmlkZW9zaW5rLmM6IChkeHIzdmlkZW9zaW5rX2luaXQpLAorCSAgKGR4cjN2aWRlb3Npbmtfb3BlbiksIChkeHIzdmlkZW9zaW5rX2Nsb3NlKSwKKwkgIChkeHIzdmlkZW9zaW5rX3dyaXRlX2RhdGEpLCAoZHhyM3ZpZGVvc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgKiBzeXMvZHhyMy9keHIzdmlkZW9zaW5rLmg6CisJICAqIHN5cy9nbHNpbmsvZ2xpbWFnZXNpbmsuYzogKGdzdF9nbGltYWdlc2lua19pbml0KToKKwkgICogc3lzL3FjYW0vZ3N0cWNhbXNyYy5jOiAoZ3N0X3FjYW1zcmNfY2hhbmdlX3N0YXRlKSwKKwkgIChnc3RfcWNhbXNyY19vcGVuKSwgKGdzdF9xY2Ftc3JjX2Nsb3NlKToKKwkgICogc3lzL3FjYW0vZ3N0cWNhbXNyYy5oOgorCSAgKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19pbml0KToKKwkgICogc3lzL3ZjZC92Y2RzcmMuYzogKGdzdF92Y2RzcmNfc2V0X3Byb3BlcnR5KSwgKGdzdF92Y2RzcmNfZ2V0KSwKKwkgIChnc3RfdmNkc3JjX29wZW5fZmlsZSksIChnc3RfdmNkc3JjX2Nsb3NlX2ZpbGUpLAorCSAgKGdzdF92Y2RzcmNfY2hhbmdlX3N0YXRlKSwgKGdzdF92Y2RzcmNfcmVjYWxjdWxhdGUpOgorCSAgKiBzeXMvdmNkL3ZjZHNyYy5oOgorCSAgcmVuYW1lZCBHU1RfRkxBR1MgbWFjcm9zIHRvIEdTVF9PQkpFQ1RfRkxBR1MKKwkgIG1vdmVkIGJpdHNoaWZ0IGZyb20gbWFjcm8gdG8gZW51bSBkZWZpbml0aW9uCisKKzIwMDUtMTAtMTIgMTQ6Mjk6NDMgKzAwMDAgIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSAgcmVuYW1lZCBHU1RfRkxBR1MgbWFjcm9zIHRvIEdTVF9PQkpFQ1RfRkxBR1MgbW92ZWQgYml0c2hpZnQgZnJvbSBtYWNybyB0byBlbnVtIGRlZmluaXRpb24KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleGFtcGxlcy9pbmRleGluZy9pbmRleG1wZWcuYzogKG1haW4pOgorCSAgKiBleHQvZXNkL2VzZG1vbi5jOiAoZ3N0X2VzZG1vbl9vcGVuX2F1ZGlvKSwKKwkgIChnc3RfZXNkbW9uX2Nsb3NlX2F1ZGlvKSwgKGdzdF9lc2Rtb25fY2hhbmdlX3N0YXRlKToKKwkgICogZXh0L2VzZC9lc2Rtb24uaDoKKwkgICogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6IChnc3RfZ2RrX3BpeGJ1Zl9pbml0KToKKwkgICogZXh0L3BhbmdvL2dzdHRleHRvdmVybGF5LmM6IChnc3RfdGV4dG92ZXJsYXlfaW5pdCk6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzogKGdzdF9hdXRvX2F1ZGlvX3NpbmtfaW5pdCk6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzogKGdzdF9hdXRvX3ZpZGVvX3NpbmtfaW5pdCk6CisJICAqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpbXV4X2luaXQpOgorCSAgKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9pbml0KToKKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOiAoZ3N0X211bHRpcGFydF9kZW11eF9pbml0KToKKwkgICogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogKGdzdF9tdWx0aXBhcnRfbXV4X2luaXQpOgorCSAgKiBnc3Qvb2xkY29yZS9nc3RtdWx0aWZpbGVzcmMuYzogKGdzdF9tdWx0aWZpbGVzcmNfaW5pdCksCisJICAoZ3N0X211bHRpZmlsZXNyY19nZXQpLCAoZ3N0X211bHRpZmlsZXNyY19vcGVuX2ZpbGUpLAorCSAgKGdzdF9tdWx0aWZpbGVzcmNfY2xvc2VfZmlsZSksIChnc3RfbXVsdGlmaWxlc3JjX2NoYW5nZV9zdGF0ZSk6CisJICAqIGdzdC9vbGRjb3JlL2dzdG11bHRpZmlsZXNyYy5oOgorCSAgKiBnc3Qvb2xkY29yZS9nc3RwaXBlZmlsdGVyLmM6IChnc3RfcGlwZWZpbHRlcl9pbml0KSwKKwkgIChnc3RfcGlwZWZpbHRlcl9vcGVuX2ZpbGUpLCAoZ3N0X3BpcGVmaWx0ZXJfY2xvc2VfZmlsZSksCisJICAoZ3N0X3BpcGVmaWx0ZXJfY2hhbmdlX3N0YXRlKToKKwkgICogZ3N0L29sZGNvcmUvZ3N0cGlwZWZpbHRlci5oOgorCSAgKiBnc3Qvc21vb3Rod2F2ZS9nc3RzbW9vdGh3YXZlLmM6IChnc3Rfc21vb3Rod2F2ZV9pbml0KToKKwkgICogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfaW5pdCk6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzogKGdzdF9vc3hhdWRpb3NpbmtfaW5pdCk6CisJICAqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuaDoKKwkgICogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmg6CisJICByZW5hbWVkIEdTVF9GTEFHUyBtYWNyb3MgdG8gR1NUX09CSkVDVF9GTEFHUworCSAgbW92ZWQgYml0c2hpZnQgZnJvbSBtYWNybyB0byBlbnVtIGRlZmluaXRpb24KKworMjAwNS0xMC0xMiAwMzoxNDo1NyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkgIGRpc3QgY2Fpcm8KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZGlzdCBjYWlybworCisyMDA1LTEwLTEyIDAzOjEyOjU3ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSAgZXh0LzogdXBkYXRlIG9mIGNhaXJvLWJhc2VkIHRpbWVvdmVybGF5IHRvIDEuMCBDYWlybyBBUEkgZG9lc24ndCB3b3JrIHlldCBmb3IgcmVzaXppbmcgb2Ygb3V0cHV0IHNpbmsKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvTWFrZWZpbGUuYW06CisJICAqIGV4dC9jYWlyby9NYWtlZmlsZS5hbToKKwkgICogZXh0L2NhaXJvL2dzdGNhaXJvLmM6IChwbHVnaW5faW5pdCk6CisJICAqIGV4dC9jYWlyby9nc3R0ZXh0b3ZlcmxheS5jOiAoZ3N0X3RleHRvdmVybGF5X2NoYW5nZV9zdGF0ZSk6CisJICAqIGV4dC9jYWlyby9nc3R0aW1lb3ZlcmxheS5jOiAoZ3N0X3RpbWVvdmVybGF5X3VwZGF0ZV9mb250X2hlaWdodCksCisJICAoZ3N0X3RpbWVvdmVybGF5X3NldHVwKSwgKGdzdF90aW1lb3ZlcmxheV9wbGFuYXI0MTEpOgorCSAgKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuaDoKKwkgIHVwZGF0ZSBvZiBjYWlyby1iYXNlZCB0aW1lb3ZlcmxheSB0byAxLjAgQ2Fpcm8gQVBJCisJICBkb2Vzbid0IHdvcmsgeWV0IGZvciByZXNpemluZyBvZiBvdXRwdXQgc2luaworCisyMDA1LTEwLTEyIDAzOjA3OjI2ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgZG9uJ3QgYnVpbGQgY2hlY2tzIGlmIHdlIGRvbid0IGhhdmUgY2hlY2sKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZG9uJ3QgYnVpbGQgY2hlY2tzIGlmIHdlIGRvbid0IGhhdmUgY2hlY2sKKworMjAwNS0xMC0xMiAwMzowMzoyNyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogY29tbW9uOgorCSAgZG9uJ3QgYnVpbGQgY2hlY2tzIGlmIHdlIGRvbid0IGhhdmUgZ3N0Y2hlY2sKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZG9uJ3QgYnVpbGQgY2hlY2tzIGlmIHdlIGRvbid0IGhhdmUgZ3N0Y2hlY2sKKworMjAwNS0xMC0xMSAxNzozODoyOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IG5ld3NlZ21lbnQgQVBJIGZpeC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogKHNwZWV4X2RlY19ldmVudCksIChzcGVleF9kZWNfY2hhaW4pOgorCSAgbmV3c2VnbWVudCBBUEkgZml4LgorCisyMDA1LTEwLTExIDE2OjM0OjM2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvOiBuZXdzZWdtZW50IEFQSSB1cGRhdGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpOgorCSAgKiBnc3QvdHRhL2dzdHR0YXBhcnNlLmM6IChnc3RfdHRhX3BhcnNlX3NyY19ldmVudCksCisJICAoZ3N0X3R0YV9wYXJzZV9wYXJzZV9oZWFkZXIpOgorCSAgbmV3c2VnbWVudCBBUEkgdXBkYXRlLgorCisyMDA1LTEwLTExIDE2OjMzOjA4ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBuZXdzZWdtZW50IEFQSSB1cGRhdGUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X2hhbmRsZV9zaW5rX2V2ZW50KSwKKwkgIChnc3RfZHZkZW11eF9kZW11eF9mcmFtZSk6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjZGVjX3dyaXRlKToKKwkgICogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiAoZ3N0X2F1cGFyc2VfY2hhaW4pOgorCSAgKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpLAorCSAgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9ldmVudCk6CisJICAqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX3N0b3BfZmlsZSk6CisJICAqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2hhbmRsZV9zZWVrKSwKKwkgIChnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMpLCAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhKSwKKwkgIChnc3Rfd2F2cGFyc2VfbG9vcCksIChnc3Rfd2F2cGFyc2VfcGFkX2NvbnZlcnQpLAorCSAgKGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQpOgorCSAgbmV3c2VnbWVudCBBUEkgdXBkYXRlLgorCisyMDA1LTEwLTExIDEwOjA3OjM1ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiBTaWduZWRuZXNzIGNsZWFudXBzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEwLTExICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogU2lnbmVkbmVzcyBjbGVhbnVwcy4KKworMjAwNS0xMC0xMCAxOTo1Nzo0MCArMDAwMCAgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGluZHQub3JnLmJyPgorCisJKiBDaGFuZ2VMb2c6CisJKiBQT1JURURfMDk6CisJKiBleHQvc3BlZXgvTWFrZWZpbGUuYW06CisJKiBleHQvc3BlZXgvZ3N0c3BlZXguYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgU3BlZXhlbmMgcG9ydGVkIHRvIDAuOS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgU3BlZXhlbmMgcG9ydGVkIHRvIDAuOS4KKworMjAwNS0xMC0xMCAxNDoxNjoyMSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgc3lzL29zcy86IENsZWFudXBzLCBtYWtlIGRldmljZSBjb25maWd1cmFibGUgaW4gdGhlIHNpbmssIGhhbmRsZSBhbmQgcmVwb3J0IGVycm9ycy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3Nfc2lua19jbGFzc19pbml0KSwKKwkgIChnc3Rfb3NzX3NpbmtfaW5pdCksIChnc3Rfb3NzX3Npbmtfc2V0X3Byb3BlcnR5KSwKKwkgIChnc3Rfb3NzX3NpbmtfZ2V0X3Byb3BlcnR5KSwgKGdzdF9vc3Nfc2lua19vcGVuKSwKKwkgIChnc3Rfb3NzX3NpbmtfcHJlcGFyZSksIChnc3Rfb3NzX3NpbmtfcmVzZXQpOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NpbmsuaDoKKwkgICogc3lzL29zcy9nc3Rvc3NzcmMuYzogKGdzdF9vc3Nfc3JjX2NsYXNzX2luaXQpLAorCSAgKGdzdF9vc3Nfc3JjX3NldF9wcm9wZXJ0eSksIChnc3Rfb3NzX3NyY19pbml0KSwgKGdzdF9vc3Nfc3JjX29wZW4pLAorCSAgKGdzdF9vc3Nfc3JjX3ByZXBhcmUpOgorCSAgQ2xlYW51cHMsIG1ha2UgZGV2aWNlIGNvbmZpZ3VyYWJsZSBpbiB0aGUgc2luaywgaGFuZGxlIGFuZCByZXBvcnQKKwkgIGVycm9ycy4KKworMjAwNS0xMC0xMCAxMjozMTowNyArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZXh0L2djb25mLzogTWFrZSBzdXJlIGVsZW1lbnQgaXMgTlVMTCBiZWZvcmUgcmVtb3ZpbmcgZnJvbSB0aGUgYmluLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9nY29uZi9nc3RnY29uZmF1ZGlvc2luay5jOiAoZ3N0X2djb25mX2F1ZGlvX3NpbmtfcmVzZXQpOgorCSAgKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NpbmsuYzogKGdzdF9nY29uZl92aWRlb19zaW5rX3Jlc2V0KToKKwkgIE1ha2Ugc3VyZSBlbGVtZW50IGlzIE5VTEwgYmVmb3JlIHJlbW92aW5nIGZyb20gdGhlIGJpbi4KKworMjAwNS0xMC0wNyAxNjoyODoyNCArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkgIERvbid0IHVucmVmIHRoZSBtZXNzYWdlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAoZ3N0X2R2MTM5NHNyY19idXNfcmVzZXQpOiBEb24ndCB1bnJlZiB0aGUgbWVzc2FnZS4KKworMjAwNS0xMC0wNyAxNjoyMjo1OSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkgIFBvc3QgYSBtZXNzYWdlIHdoZW4gdGhlIGNhYmxlIGlzIHVucGx1Z2dlZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKGdzdF9kdjEzOTRzcmNfYnVzX3Jlc2V0KTogUG9zdCBhIG1lc3NhZ2Ugd2hlbiB0aGUgY2FibGUgaXMKKwkgIHVucGx1Z2dlZC4KKwkgIChnc3RfZHYxMzk0c3JjX2NyZWF0ZSwgZ3N0X2R2MTM5NHNyY191bmxvY2spOiBSZW1vdmUgc29tZSBwcmludHMuCisKKzIwMDUtMTAtMDcgMTU6MjQ6MjQgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSAgZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IE1ha2UgaW50ZXJydXB0aWJsZSwgc28gaXQgd29uJ3QgYmxvY2sgZm9yZXZlciBpbiBhIHJlYWQoKS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0xMC0wNyAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IE1ha2UgaW50ZXJydXB0aWJsZSwgc28gaXQgd29uJ3QKKwkgIGJsb2NrIGZvcmV2ZXIgaW4gYSByZWFkKCkuCisKKzIwMDUtMTAtMDcgMTM6MTc6NTMgKzAwMDAgIEFuZHkgV2luZ28gPHdpbmdvQHBvYm94LmNvbT4KKworCSAgZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IENsZWFuIHVwIGZvciBzdHlsZSBiZWZvcmUgZG9pbmcgc29tZSBoYWNraW5nLiBUaGUgb25seSBjaGFuZ2Ugc2hvdWxkIGJlIHRoYXQgdGhlIHN0YXRlIGNoLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMTAtMDcgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOiBDbGVhbiB1cCBmb3Igc3R5bGUgYmVmb3JlIGRvaW5nIHNvbWUKKwkgIGhhY2tpbmcuIFRoZSBvbmx5IGNoYW5nZSBzaG91bGQgYmUgdGhhdCB0aGUgc3RhdGUgY2hhbmdlIHN0dWZmIHdhcworCSAgcHV0IGludG8gYmFzZXNyYydzIHN0YXJ0KCkgYW5kIHN0b3AoKSByb3V0aW5lcywgd2hpY2ggY29hbGVzY2VzCisJICBzb21lIHN0ZXBzLgorCisyMDA1LTEwLTA3IDExOjMwOjQxICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBjb25maWd1cmUuYWM6IEFkZCBjaGVjayBmb3IgbW1hcAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIEFkZCBjaGVjayBmb3IgbW1hcAorCSAgKiBnc3QvZGVidWcvTWFrZWZpbGUuYW06CisJICBPbmx5IGNvbXBpbGUgZWZlbmNlIHBsdWdpbiBvbiBzeXN0ZW1zIHRoYXQgaGF2ZSBtbWFwLgorCisyMDA1LTEwLTA1IDE2OjM2OjU3ICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIGFkZCBsYXRlc3QgZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkIGxhdGVzdCBmaWxlcworCisyMDA1LTEwLTA1IDExOjM4OjI5ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBnc3QvZGVidWcvOiBQb3J0IHByb2dyZXNzcmVwb3J0LCBuYXZzZWVrLCBuYXZpZ2F0aW9udGVzdCwgdGVzdHNpbmsgYW5kIGJyZWFrbXlkYXRhLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9kZWJ1Zy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlYnVnL2JyZWFrbXlkYXRhLmM6CisJICAqIGdzdC9kZWJ1Zy9nc3RkZWJ1Zy5jOgorCSAgKiBnc3QvZGVidWcvZ3N0bmF2aWdhdGlvbnRlc3QuYzoKKwkgICogZ3N0L2RlYnVnL2dzdG5hdnNlZWsuYzoKKwkgICogZ3N0L2RlYnVnL2dzdG5hdnNlZWsuaDoKKwkgICogZ3N0L2RlYnVnL3Byb2dyZXNzcmVwb3J0LmM6CisJICAqIGdzdC9kZWJ1Zy90ZXN0cGx1Z2luLmM6CisJICBQb3J0IHByb2dyZXNzcmVwb3J0LCBuYXZzZWVrLCBuYXZpZ2F0aW9udGVzdCwgdGVzdHNpbmsgYW5kCisJICBicmVha215ZGF0YS4KKworMjAwNS0xMC0wNSAxMToxNToyMyArMDAwMCAgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKworCSAgZXh0L2R2L2dzdGR2ZGVtdXguYzogRml4ZXMgZm9yIGJldHRlciBjb252ZXJzaW9uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X3NyY19jb252ZXJ0KSwKKwkgIChnc3RfZHZkZW11eF9zcmNfcXVlcnkpOgorCSAgRml4ZXMgZm9yIGJldHRlciBjb252ZXJzaW9uCisKKzIwMDUtMTAtMDQgMTc6NTg6NDAgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZ3N0L2F1dG9kZXRlY3QvOiBTZXQgc3RhdGUgb2YgZWxlbWVudHMgdG8gTlVMTCBiZWZvcmUgcmVtb3ZpbmcgZnJvbSBiaW5zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzogKGdzdF9hdXRvX2F1ZGlvX3NpbmtfcmVzZXQpLAorCSAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfZmluZF9iZXN0KSwgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfZGV0ZWN0KToKKwkgICogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jOiAoZ3N0X2F1dG9fdmlkZW9fc2lua19yZXNldCksCisJICAoZ3N0X2F1dG9fdmlkZW9fc2lua19maW5kX2Jlc3QpLCAoZ3N0X2F1dG9fdmlkZW9fc2lua19kZXRlY3QpOgorCSAgU2V0IHN0YXRlIG9mIGVsZW1lbnRzIHRvIE5VTEwgYmVmb3JlIHJlbW92aW5nIGZyb20gYmlucy4KKwkgIFNldCBzdGF0ZSBvZiB0ZXN0IGVsZW1lbnQgdG8gTlVMTCBpZiB3ZSBmYWlsZWQgdG8gbW92ZSBpdCB0byBSRUFEWQorCisyMDA1LTEwLTA0IDE3OjQ0OjQzICswMDAwICBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJICBleHQvZHYvOiBBZGRlZCBERUZBVUxUIDw9PT4gQllURVMsIFRJTUUgY29udmVyc2lvbnMgb24gc3JjcGFkLAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9kdi9NYWtlZmlsZS5hbToKKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYzogKGdzdF9kdmRlbXV4X3NyY19xdWVyeSksIChnc3RfZHZkZW11eF9zcmNfY29udmVyKToKKwkgIEFkZGVkIERFRkFVTFQgPD09PiBCWVRFUywgVElNRSBjb252ZXJzaW9ucyBvbiBzcmNwYWQsCisJICBDb3JyZWN0ZWQgdGhlIHF1ZXJ5IGZ1bmN0aW9uIGZvciBwb3NpdGlvbiBzbyBpdCBkb2Vzbid0IGZvcmdldCB3aGF0CisJICBmb3JtYXQgd2FzIGFza2VkLCBhbmQgY2FsbHMgdGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zIG9uIHRoZSBjb3JyZWN0IHBhZC4KKworMjAwNS0xMC0wMyAxNzo1OToxOCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGJhY2sgdG8gaGVhZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBiYWNrIHRvIGhlYWQKKworPT09IHJlbGVhc2UgMC45LjMgPT09CisKKzIwMDUtMTAtMDMgMTc6NDg6NTcgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBORVdTOgorCSogUkVBRE1FOgorCSogY29uZmlndXJlLmFjOgorCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJKiBwby92aS5wbzoKKwkgIHJlbGVhc2UgdGltZQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZWxlYXNlIHRpbWUKKworMjAwNS0xMC0wMiAyMzowODozNSArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBleHQvZmxhYy9nc3RmbGFjZGVjLmMgKGdzdF9mbGFjZGVjX3dyaXRlKTogRGVhbCB3aXRoIHBhZF9hbGxvYyBlcnJvciByZXR1cm5zLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEwLTAzICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmMgKGdzdF9mbGFjZGVjX3dyaXRlKTogRGVhbCB3aXRoIHBhZF9hbGxvYworCSAgZXJyb3IgcmV0dXJucy4KKworMjAwNS0xMC0wMiAxNTozMzoxNCArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBjb25maWd1cmUuYWMgKEdTVF9QTFVHSU5fTERGTEFHUyk6IENoYW5nZSB0byBiZSBsaWtlIC1iYXNlLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTEwLTAyICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBjb25maWd1cmUuYWMgKEdTVF9QTFVHSU5fTERGTEFHUyk6IENoYW5nZSB0byBiZSBsaWtlIC1iYXNlLgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IFBvcnRlZCB0byAwLjkuCisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYyAoZ3N0X2ZsYWNkZWNfbG9vcCk6IEhhbmRsZSBlcnJvcnMgYmV0dGVyLgorCSAgKiBleHQvZmxhYy9NYWtlZmlsZS5hbTogQWRkIHRoZSBHU1RfUExVR0lOU19CQVNFIGNmbGFncyBhbmQgbGlicywKKwkgIGFuZCBsaW5rIHRvIGdzdHRhZ2VkaXQuIEVuYWJsZSBmbGFjZW5jLgorCSAgKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IFJlLWVuYWJsZSB0YWcgcmVhZGluZy4KKworMjAwNS0wOS0zMCAxNjozNjo0OSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC86IFZhcmlvdXMgY2xhc3MgYW5kIGNhcHMgZml4ZXMgZnJvbSBBbmRyZSBNYWdhbGhhZXMgKGFuZHJ1bmtvKQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZW5jLmM6IChnc3RfcnRwYW1yZW5jX3NldGNhcHMpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGdzbXBhcnNlLmM6CisJICAqIGdzdC9ydHAvZ3N0cnRwaDI2M3BlbmMuYzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZW5jLmM6IChnc3RfcnRwbXA0dmVuY19jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwbXA0dmVuY19wYXJzZV9kYXRhKSwgKGdzdF9ydHBtcDR2ZW5jX2hhbmRsZV9idWZmZXIpLAorCSAgKGdzdF9ydHBtcDR2ZW5jX3NldF9wcm9wZXJ0eSk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXBhZW5jLmM6IChnc3RfcnRwbXBhZW5jX2hhbmRsZV9idWZmZXIpOgorCSAgVmFyaW91cyBjbGFzcyBhbmQgY2FwcyBmaXhlcyBmcm9tIEFuZHJlIE1hZ2FsaGFlcyAoYW5kcnVua28pCisKKzIwMDUtMDktMjkgMTM6MDg6NDEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9sZXZlbC9sZXZlbC1leGFtcGxlLmM6IFVwZGF0ZSBmb3IgbmV3IGJ1cyBBUEkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xldmVsL2xldmVsLWV4YW1wbGUuYzogKG1haW4pOgorCSAgVXBkYXRlIGZvciBuZXcgYnVzIEFQSS4KKworMjAwNS0wOS0yOCAxMzozODowMiArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiBObyBuZWVkIHRvIHRha2Ugc3RyZWFtIGxvY2sgaGVyZS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX2hlYWRlcik6CisJICBObyBuZWVkIHRvIHRha2Ugc3RyZWFtIGxvY2sgaGVyZS4KKworMjAwNS0wOS0yOCAwOTo0NTowMCArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgY29uZmlndXJlLmFjOiBGaXggdW5leHBhbmRlZCBhdXRvY29uZiBtYWNybyBHU1RfRE9DLCB3aGljaCBoYXMgYmVlbiByZW5hbWVkIHRvIEdTVF9ET0NCT09LX0NIRUNLIChzZWUgY29tbW9uL200L2dzdC1kLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY29uZmlndXJlLmFjOgorCSAgRml4IHVuZXhwYW5kZWQgYXV0b2NvbmYgbWFjcm8gR1NUX0RPQywgd2hpY2ggaGFzIGJlZW4gcmVuYW1lZAorCSAgdG8gR1NUX0RPQ0JPT0tfQ0hFQ0sgKHNlZSBjb21tb24vbTQvZ3N0LWRvYy5tNCkgKCMzMTYyMDIpLgorCisyMDA1LTA5LTI3IDE1OjEyOjQ1ICswMDAwICBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIubmV0PgorCisJICBzeXMvb3NzL2dzdG9zc3NpbmsuYzogRml4IHBsYXliYWNrIG9mIG1vbm8gc3RyZWFtcyAoYnl0ZXNfcGVyX3NhbXBsZSBzaG91bGQgYmUgc2V0IGZyb20gdGhlIHNhbXBsZSB3aWR0aCBhbmQgdGhlIG51bWIuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3Nfc2lua19wcmVwYXJlKToKKwkgIEZpeCBwbGF5YmFjayBvZiBtb25vIHN0cmVhbXMgKGJ5dGVzX3Blcl9zYW1wbGUgc2hvdWxkIGJlIHNldAorCSAgZnJvbSB0aGUgc2FtcGxlIHdpZHRoIGFuZCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG5lZ290aWF0ZWQsCisJICBhbmQgbm90IGp1c3QgYmUgc2V0IHRvIDQpICgjMzE3MzM4KQorCisyMDA1LTA5LTI2IDE0OjU5OjEwICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIGFkZCBhdXBhcnNlIHRvIHBsdWdpbnMgbGlzdAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgYXVwYXJzZSB0byBwbHVnaW5zIGxpc3QKKworMjAwNS0wOS0yNiAxNDo0MjowOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBtcGFlbmMuYzogU2V0IGJ1ZmZlciBkdXJhdGlvbiBjb3JyZWN0bHkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFlbmMuYzogKGdzdF9ydHBtcGFlbmNfZmx1c2gpLAorCSAgKGdzdF9ydHBtcGFlbmNfaGFuZGxlX2J1ZmZlcik6CisJICBTZXQgYnVmZmVyIGR1cmF0aW9uIGNvcnJlY3RseS4KKworMjAwNS0wOS0yNiAxMzowNjoyNyArMDAwMCAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4KKworCSAgZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiBEb24ndCBjcmFzaCB3aGVuIGVuY291bnRlcmluZyBhIHN0cmVhbSB3aXRoIGFuIHVua25vd24gZm91cmNjIG9yIGNvZGVjIGlkLiBJbnN0ZWFkLCBjcmVhdGUgYSBwLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9iYXNlX2luaXQpLAorCSAgKGdzdF9hdmlfZGVtdXhfY2xhc3NfaW5pdCksIChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksCisJICAoZ3N0X2F2aV9kZW11eF9jaGFuZ2Vfc3RhdGUpOgorCSAgRG9uJ3QgY3Jhc2ggd2hlbiBlbmNvdW50ZXJpbmcgYSBzdHJlYW0gd2l0aCBhbiB1bmtub3duIGZvdXJjYyBvcgorCSAgY29kZWMgaWQuIEluc3RlYWQsIGNyZWF0ZSBhIHBhZCBvZiB0eXBlIHZpZGVvL3gtYXZpLXVua25vd24gb3IKKwkgIGF1ZGlvL3gtYXZpLXVua25vd24sIHdoaWNoIGFzIGEgc2lkZS1lZmZlY3QgYWxzbyByZXN1bHRzIGluIGxlc3MKKwkgIGNvbmZ1c2luZyBlcnJvciBtZXNzYWdlcyBpbiBwbGF5ZXJzICgnbm8gZGVjb2RlcicgdnMuICdubyBzdHJlYW1zJyk7CisJICBtaW5vciBmaXhlcyB0byBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb24gYW5kIGNsYXNzX2luaXQgZnVuY3Rpb24uCisKKzIwMDUtMDktMjQgMTM6MzQ6NDYgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL01ha2VmaWxlLmFtOgorCSAgc2V0IHVwIHBsdWdpbiBwYXRocyBwcm9wZXJseQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBzZXQgdXAgcGx1Z2luIHBhdGhzIHByb3Blcmx5CisKKzIwMDUtMDktMjQgMTM6MTA6NTIgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9hdXRvZGV0ZWN0LzogVGhlc2UgYXJlIHNpbmtzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYzogKGdzdF9hdXRvX2F1ZGlvX3NpbmtfaW5pdCk6CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzogKGdzdF9hdXRvX3ZpZGVvX3NpbmtfaW5pdCk6CisJICBUaGVzZSBhcmUgc2lua3MuCisKKzIwMDUtMDktMjQgMTI6MTA6MDIgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBjaGVjay9lbGVtZW50cy9sZXZlbC5jOiBmaXggdGVzdCBmb3IgbmV3IEdzdENsb2NrVGltZSB1c2UKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjaGVjay9lbGVtZW50cy9sZXZlbC5jOiAoR1NUX1NUQVJUX1RFU1QpOgorCSAgZml4IHRlc3QgZm9yIG5ldyBHc3RDbG9ja1RpbWUgdXNlCisJICAqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiAoZ3N0X2xldmVsX2luaXQpLCAoZ3N0X2xldmVsX3NldF9jYXBzKSwKKwkgIChnc3RfbGV2ZWxfdHJhbnNmb3JtX2lwKToKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmg6CisJICBmaXggdXAgdGhlIGRlY2F5IHBlYWssIGVuc3VyaW5nIHRoZSBkZWNheSBwZWFrIGlzIG5ldmVyIGxvd2VyCisJICB0aGFuIHRoZSBwZWFrIGZvciB0aGF0IGludGVydmFsCisKKzIwMDUtMDktMjMgMTg6MjM6MDQgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3M6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIHVwZGF0aW5nIGRvY3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgdXBkYXRpbmcgZG9jcworCisyMDA1LTA5LTIzIDE4OjE1OjUxICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogTWFrZWZpbGUuYW06CisJKiBjaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSogY29tbW9uOgorCSogZ3N0L2xldmVsL01ha2VmaWxlLmFtOgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuaDoKKwkqIGdzdC9sZXZlbC9sZXZlbC1leGFtcGxlLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgY29udmVydCB0byB1c2luZyBHc3RDbG9ja1RpbWUgZm9yIGFsbCB0aW1lIHZhbHVlcywgZmluYWxseS4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgY29udmVydCB0byB1c2luZyBHc3RDbG9ja1RpbWUgZm9yIGFsbCB0aW1lIHZhbHVlcywgZmluYWxseS4KKworMjAwNS0wOS0yMyAxNTowMTowMCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC9nb29tL01ha2VmaWxlLmFtOgorCSAgZml4IGJ1aWxkIG9mIGdvb20KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZml4IGJ1aWxkIG9mIGdvb20KKworMjAwNS0wOS0yMyAxNDoyMDowMSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGNvbW1vbjoKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOgorCSAgd2UgaGFuZGxlIG1vcmUgdGhhbiB0d28gY2hhbm5lbHMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgd2UgaGFuZGxlIG1vcmUgdGhhbiB0d28gY2hhbm5lbHMKKworMjAwNS0wOS0yMyAwNDoyMzowMCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9jYWlyby9NYWtlZmlsZS5hbToKKwkqIGV4dC9kdi9NYWtlZmlsZS5hbToKKwkqIGV4dC9lc2QvTWFrZWZpbGUuYW06CisJKiBleHQvZmxhYy9NYWtlZmlsZS5hbToKKwkqIGV4dC9nY29uZi9NYWtlZmlsZS5hbToKKwkqIGV4dC9nZGtfcGl4YnVmL01ha2VmaWxlLmFtOgorCSogZXh0L2pwZWcvTWFrZWZpbGUuYW06CisJKiBleHQvbGFkc3BhL01ha2VmaWxlLmFtOgorCSogZXh0L2xpYmNhY2EvTWFrZWZpbGUuYW06CisJKiBleHQvbGlibW5nL01ha2VmaWxlLmFtOgorCSogZXh0L2xpYnBuZy9NYWtlZmlsZS5hbToKKwkqIGV4dC9taWttb2QvTWFrZWZpbGUuYW06CisJKiBleHQvcGFuZ28vTWFrZWZpbGUuYW06CisJKiBleHQvcmF3MTM5NC9NYWtlZmlsZS5hbToKKwkqIGV4dC9zaG91dDIvTWFrZWZpbGUuYW06CisJKiBleHQvc3BlZXgvTWFrZWZpbGUuYW06CisJKiBnc3QvYWxwaGEvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVwYXJzZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzoKKwkqIGdzdC9hdXRvZGV0ZWN0L01ha2VmaWxlLmFtOgorCSogZ3N0L2F2aS9NYWtlZmlsZS5hbToKKwkqIGdzdC9jdXR0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvZGVidWcvTWFrZWZpbGUuYW06CisJKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbToKKwkqIGdzdC9mbHgvTWFrZWZpbGUuYW06CisJKiBnc3QvZ29vbS9NYWtlZmlsZS5hbToKKwkqIGdzdC9sYXcvTWFrZWZpbGUuYW06CisJKiBnc3QvbWF0cm9za2EvTWFrZWZpbGUuYW06CisJKiBnc3QvbWVkaWFuL01ha2VmaWxlLmFtOgorCSogZ3N0L21vbm9zY29wZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9tdWx0aXBhcnQvTWFrZWZpbGUuYW06CisJKiBnc3Qvb2xkY29yZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRzcC9NYWtlZmlsZS5hbToKKwkqIGdzdC9zbW9vdGh3YXZlL01ha2VmaWxlLmFtOgorCSogZ3N0L3NtcHRlL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvYm94L01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3Qvd2F2ZW5jL01ha2VmaWxlLmFtOgorCSogZ3N0L3dhdnBhcnNlL01ha2VmaWxlLmFtOgorCSogc3lzL29zcy9NYWtlZmlsZS5hbToKKwkqIHN5cy9vc3hhdWRpby9NYWtlZmlsZS5hbToKKwkgIGZpeCBidWlsZCBhbmQgdXNlIG9mIEdTVF9MSUJTCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCBidWlsZCBhbmQgdXNlIG9mIEdTVF9MSUJTCisKKzIwMDUtMDktMjIgMjI6Mzg6NDggKzAwMDAgIEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworCSogQ2hhbmdlTG9nOgorCSogUE9SVEVEXzA5OgorCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5oOgorCSAgQXVwYXJzZSBwb3J0ZWQgdG8gMC45LiBUZXN0ZWQgd2l0aCBmaWxlc3JjICEgYXVwYXJzZSAhIG9zc3NpbmsgYW5kIGFsc2FzaW5rCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIEF1cGFyc2UgcG9ydGVkIHRvIDAuOS4gVGVzdGVkIHdpdGggZmlsZXNyYyAhIGF1cGFyc2UgISBvc3NzaW5rIGFuZCBhbHNhc2luaworCisyMDA1LTA5LTIyIDE0OjEzOjM2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwLzogVXNlIGlzX2ZpbGxlZCB0byBib3RoIGNoZWNrIE1UVSBhbmQgbWF4LXB0aW1lIG9mIGJhc2UgY2xhc3MuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0cC9UT0RPOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGRlYy5jOiAoZ3N0X3J0cGRlY19nZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZW5jLmM6IChnc3RfcnRwbXA0dmVuY19jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwbXA0dmVuY19wYXJzZV9kYXRhKSwgKGdzdF9ydHBtcDR2ZW5jX2hhbmRsZV9idWZmZXIpLAorCSAgKGdzdF9ydHBtcDR2ZW5jX3NldF9wcm9wZXJ0eSk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmVuYy5oOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYWVuYy5jOiAoZ3N0X3J0cG1wYWVuY19oYW5kbGVfYnVmZmVyKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFlbmMuaDoKKwkgIFVzZSBpc19maWxsZWQgdG8gYm90aCBjaGVjayBNVFUgYW5kIG1heC1wdGltZSBvZiBiYXNlIGNsYXNzLgorCisyMDA1LTA5LTIyIDExOjI4OjIzICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cG1wNHZlbmMuYzogRG9uJ3QgZnJhZ21lbnQgcGFja2V0cyB3aXRoIG11bHRpcGxlIGZyYW1lcy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZlbmMuYzogKGdzdF9ydHBtcDR2ZW5jX2NsYXNzX2luaXQpLAorCSAgKGdzdF9ydHBtcDR2ZW5jX3BhcnNlX2RhdGEpLCAoZ3N0X3J0cG1wNHZlbmNfaGFuZGxlX2J1ZmZlciksCisJICAoZ3N0X3J0cG1wNHZlbmNfc2V0X3Byb3BlcnR5KToKKwkgIERvbid0IGZyYWdtZW50IHBhY2tldHMgd2l0aCBtdWx0aXBsZSBmcmFtZXMuCisKKzIwMDUtMDktMjIgMTA6Mzk6MTEgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBSZW1vdmUgZ19wcmludC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL1RPRE86CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlYy5jOiAoZ3N0X3J0cG1wNHZkZWNfc2V0Y2Fwcyk6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmVuYy5jOiAoZ3N0X3J0cG1wNHZlbmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cG1wNHZlbmNfaW5pdCksIChnc3RfcnRwbXA0dmVuY19wYXJzZV9kYXRhKSwKKwkgIChnc3RfcnRwbXA0dmVuY19oYW5kbGVfYnVmZmVyKSwgKGdzdF9ydHBtcDR2ZW5jX3NldF9wcm9wZXJ0eSksCisJICAoZ3N0X3J0cG1wNHZlbmNfZ2V0X3Byb3BlcnR5KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZW5jLmg6CisJICBSZW1vdmUgZ19wcmludC4KKwkgIFVwZGF0ZSBUT0RPCisJICBNYWtlIHBheWxvYWQgZW5jb2RlciBhIGJpdCBzbWFydGVyIGFuZCBtb3JlIGNvcnJlY3Qgd2l0aAorCSAgdGltZXN0YW1wcy4KKwkgIEFkZGVkIG9wdGlvbiBpbiBwYXlsb2FkZXIgdG8gaW5jbHVkZSBjb25maWcgc3RyaW5nIGluLWJhbmQuCisKKzIwMDUtMDktMjEgMTk6NDE6NDUgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogU3RyaXAgc3BhY2VzIGZvciBrZXkvdmFsdWUgcGFpcnMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BzcmNfcGFyc2VfcnRwbWFwKSwKKwkgIChnc3RfcnRzcHNyY19tZWRpYV90b19jYXBzKSwgKGdzdF9ydHNwc3JjX3N0cmVhbV9zZXR1cF9ydHApLAorCSAgKGdzdF9ydHNwc3JjX3NlbmQpOgorCSAgU3RyaXAgc3BhY2VzIGZvciBrZXkvdmFsdWUgcGFpcnMuCisKKzIwMDUtMDktMjEgMTc6NTM6MjYgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogTW9yZSBTRFAgcGFyc2luZyBhbmQgY2FwcyBzZXR0aW5nLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3BhcnNlX3J0cG1hcCksCisJICAoZ3N0X3J0c3BzcmNfbWVkaWFfdG9fY2FwcyksIChnc3RfcnRzcHNyY19zdHJlYW1fc2V0dXBfcnRwKSwKKwkgIChnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksIChnc3RfcnRzcHNyY19zZW5kKSwKKwkgIChnc3RfcnRzcHNyY19jaGFuZ2Vfc3RhdGUpOgorCSAgTW9yZSBTRFAgcGFyc2luZyBhbmQgY2FwcyBzZXR0aW5nLgorCSAgRG8gTk9fUFJFUk9MTCBkaWZmZXJlbnRseS4KKwkgIGFkZCBwYWRzIG9ubHkgYWZ0ZXIgbmVnb3RpYXRlZC4KKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3VkcHNyY19nZXRjYXBzKToKKwkgIEltcGxlbWVudCB0aGUgZ2V0Y2FwcyBmdW5jdGlvbi4KKworMjAwNS0wOS0yMSAxNzo1MDoyOSArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9nc3RydHBhbXJkZWMuYzogSGFuZGxlIG11bHRpcGxlIEFNciBwYWNrZXRzIHBlciBwYXlsb2FkLiBIYW5kbGUgQ1JDIGFuZCBwYXJzZSBJTEwvSUxQLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9ydHAvZ3N0cnRwYW1yZGVjLmM6IChnc3RfcnRwYW1yZGVjX3Npbmtfc2V0Y2FwcyksCisJICAoZ3N0X3J0cGFtcmRlY19jaGFpbik6CisJICBIYW5kbGUgbXVsdGlwbGUgQU1yIHBhY2tldHMgcGVyIHBheWxvYWQuIEhhbmRsZSBDUkMgYW5kCisJICBwYXJzZSBJTEwvSUxQLgorCSAgKiBnc3QvcnRwL2dzdHJ0cGFtcmVuYy5jOiAoZ3N0X3J0cGFtcmVuY19zZXRjYXBzKToKKwkgIE1ha2UgY2FwcyBwYXJhbXMgc3RyaW5ncyBmb3IgZWFzeSBTRFAgbWFwcGluZy4KKwkgICogZ3N0L3J0cC9nc3RydHBkZWMuYzogKGdzdF9ydHBkZWNfaW5pdCksIChnc3RfcnRwZGVjX2dldGNhcHMpOgorCSAgSGFuZGxlIGNhcHNuZWdvIGJldHRlci4KKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZGVjLmM6IChnc3RfcnRwbXA0dmRlY19zZXRjYXBzKToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZW5jLmM6IChnc3RfcnRwbXA0dmVuY19uZXdfY2Fwcyk6CisJICBHZW5lcmF0ZSBhbmQgcGFyc2UgY29uZmlnIHN0cmluZyBpbiB0aGUgY2Fwcy4KKworMjAwNS0wOS0yMSAxMjoxOToyNCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3J0cC9SRUFETUU6IFVwZGF0ZSBSRUFETUUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL1JFQURNRToKKwkgIFVwZGF0ZSBSRUFETUUKKwkgICogZ3N0L3J0cC9nc3RydHBhbXJkZWMuYzogKGdzdF9ydHBhbXJkZWNfc2lua19zZXRjYXBzKToKKwkgIE1ha2UgZXh0cmEgcGFyYW1zIGFzIHN0cmluZ3MuCisJICAqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3NldF9zdGF0ZSksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfcnRwbWFwKSwgKGdzdF9ydHNwc3JjX21lZGlhX3RvX2NhcHMpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9zZXR1cF9ydHApLCAoZ3N0X3J0c3BzcmNfc2VuZCk6CisJICBNYWtlIHN0YXRlIGNoYW5nZSByZXR1cm4gTk9fUFJFUk9MTCBhcyB0aGlzIGlzIGEgbGl2ZQorCSAgc291cmNlLgorCSAgKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19zZXRfcHJvcGVydHkpOgorCSAgRG9uJ3QgdW5yZWYgb2xkIGNhcHMgd2hlbiBOVUxMLgorCisyMDA1LTA5LTIwIDE3OjM1OjExICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRzcC86IEFkZCBVUkkgaGFuZGxlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19nZXRfdHlwZSksCisJICAoZ3N0X3J0c3BzcmNfcGFyc2VfcnRwbWFwKSwgKGdzdF9ydHNwc3JjX21lZGlhX3RvX2NhcHMpLAorCSAgKGdzdF9ydHNwc3JjX3N0cmVhbV9zZXR1cF9ydHApLCAoZ3N0X3J0c3BzcmNfc2VuZCksCisJICAoZ3N0X3J0c3BzcmNfb3BlbiksIChnc3RfcnRzcHNyY191cmlfZ2V0X3R5cGUpLAorCSAgKGdzdF9ydHNwc3JjX3VyaV9nZXRfcHJvdG9jb2xzKSwgKGdzdF9ydHNwc3JjX3VyaV9nZXRfdXJpKSwKKwkgIChnc3RfcnRzcHNyY191cmlfc2V0X3VyaSksIChnc3RfcnRzcHNyY191cmlfaGFuZGxlcl9pbml0KToKKwkgICogZ3N0L3J0c3Avc2RwbWVzc2FnZS5jOiAoc2RwX21lZGlhX2dldF9mb3JtYXQpOgorCSAgKiBnc3QvcnRzcC9zZHBtZXNzYWdlLmg6CisJICBBZGQgVVJJIGhhbmRsZXIuCisJICBQYXJzZSBTRFAgYW5kIGNyZWF0ZSBjYXBzLgorCisyMDA1LTA5LTIwIDE3OjE5OjQzICswMDAwICBDaHJpc3RpYW4gU2NoYWxsZXIgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIG1vcmUgc3BlYyBmaWxlIGZpeG9yaW5nCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIG1vcmUgc3BlYyBmaWxlIGZpeG9yaW5nCisKKzIwMDUtMDktMjAgMTc6MDQ6MzMgKzAwMDAgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSogZ3N0LXBsdWdpbnMuc3BlYy5pbjoKKwkgIGZpeCBzcGVjIGZpbGVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCBzcGVjIGZpbGVzCisKKzIwMDUtMDktMjAgMTA6NTE6NTEgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3QvcnRwL1JFQURNRToKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlYy5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dnBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5jOgorCSAgZG9uJ3QgdXNlIHVuZGVyc2NvcmVzCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGRvbid0IHVzZSB1bmRlcnNjb3JlcworCisyMDA1LTA5LTIwIDA3OjMwOjMxICswMDAwICBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkgIGdzdC9hbHBoYS9nc3RhbHBoYS5jOiBmaXggZWxlbWVudCBkZXNjcmlwdGlvbgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSAgZml4IGVsZW1lbnQgZGVzY3JpcHRpb24KKworMjAwNS0wOS0xOSAxNzo1NzowNiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlczoKKwkgIHByZXJlcXMgYXMgd2VsbAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBwcmVyZXFzIGFzIHdlbGwKKworMjAwNS0wOS0xOSAxNzo1Mzo0MiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGRvY3MvcGx1Z2lucy8uZ2l0aWdub3JlOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzOgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5oaWVyYXJjaHk6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmludGVyZmFjZXM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnNpZ25hbHM6CisJICBjb21taXQgcmVzdWx0IG9mIHNjYW5vYmogc3RlcAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBjb21taXQgcmVzdWx0IG9mIHNjYW5vYmogc3RlcAorCisyMDA1LTA5LTE5IDE3OjAzOjU1ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJICBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVjLmM6IERvbid0IGNoZWNrIHBheWxvYWQgZm9yIG5vdy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVjLmM6IChnc3RfcnRwaDI2M3BkZWNfY2hhaW4pOgorCSAgRG9uJ3QgY2hlY2sgcGF5bG9hZCBmb3Igbm93LgorCisyMDA1LTA5LTE5IDE2OjQzOjU2ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogTWFrZWZpbGUuYW06CisJICBhZGQgY2hlY2stdmFsZ3JpbmQgdGFyZ2V0CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGFkZCBjaGVjay12YWxncmluZCB0YXJnZXQKKworMjAwNS0wOS0xOSAxNjoyNjozMCArMDAwMCAgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKworCSAgZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLio6IEZpeCB3YXZwYXJzZSBzb21lIG1vcmUuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcmVzZXQpLAorCSAgKGdzdF93YXZwYXJzZV9pbml0KSwgKGdzdF93YXZwYXJzZV9wYXJzZV9maWxlX2hlYWRlciksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9pbml0KSwgKGdzdF93YXZwYXJzZV9oYW5kbGVfc2VlayksCisJICAoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSksCisJICAoZ3N0X3dhdnBhcnNlX2xvb3ApLCAoZ3N0X3dhdnBhcnNlX3BhZF9jb252ZXJ0KSwKKwkgIChnc3Rfd2F2cGFyc2VfcGFkX3F1ZXJ5KSwgKGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQpLAorCSAgKGdzdF93YXZwYXJzZV9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwkgIEZpeCB3YXZwYXJzZSBzb21lIG1vcmUuCisKKzIwMDUtMDktMTkgMTE6NDg6MTMgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGNoZWNrL2VsZW1lbnRzL2xldmVsLmM6IEZpeCBmb3IgYnVzIEFQSSBjaGFuZ2UuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogY2hlY2svZWxlbWVudHMvbGV2ZWwuYzogKEdTVF9TVEFSVF9URVNUKToKKwkgIEZpeCBmb3IgYnVzIEFQSSBjaGFuZ2UuCisKKzIwMDUtMDktMTkgMTE6Mzg6MTAgKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9sZXZlbC9sZXZlbC1leGFtcGxlLmM6IEZpeCBmb3IgbmV3IGJ1cyBBUEkuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogZ3N0L2xldmVsL2xldmVsLWV4YW1wbGUuYzogKG1haW4pOgorCSAgRml4IGZvciBuZXcgYnVzIEFQSS4KKwkgICogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfc2V0X3Byb3BlcnR5KToKKwkgIFNldCBjYXBzIG9uIHBhZHMuCisKKzIwMDUtMDktMTkgMTE6MDY6MDUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3QvZGVidWcvTWFrZWZpbGUuYW06CisJICBkaXNhYmxlIGZsYWdzIGZvciB1bmJ1aWx0IHBsdWdpbnMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZGlzYWJsZSBmbGFncyBmb3IgdW5idWlsdCBwbHVnaW5zCisKKzIwMDUtMDktMTkgMDg6MjE6MjkgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjb21tb246CisJKiBkb2NzL3BsdWdpbnMvc2Nhbm9iai1idWlsZC5zdGFtcDoKKwkgIG5vcm1hbCBidWlsZHMgc2hvdWxkbid0IHNjYW4gZ29iamVjdHMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgbm9ybWFsIGJ1aWxkcyBzaG91bGRuJ3Qgc2NhbiBnb2JqZWN0cworCisyMDA1LTA5LTE2IDAwOjM4OjUwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogY2hlY2svTWFrZWZpbGUuYW06CisJKiBjb21tb246CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkgIHJlbW92ZSBnc3QtcmVnaXN0ZXIKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgcmVtb3ZlIGdzdC1yZWdpc3RlcgorCisyMDA1LTA5LTE1IDEzOjU3OjU2ICswMDAwICBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb21tb246CisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9SRUFETUU6CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmVuYy5oOgorCSogZ3N0L3J0cC9nc3RydHBhbXJwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWRlcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbWVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21lbmMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGFyc2UuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGFyc2UuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGdzbXBheS5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlYy5jOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZW5jLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZW5jLmg6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwcGF5Lmg6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZWMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXA0dmVuYy5oOgorCSogZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wNHZwYXkuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFlbmMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYXBheS5oOgorCSAgVXBkYXRlcyB0byBwYXlsb2FkZXIvZGVwYXlsb2FkZXJzLCBtYWtlIHBheWxvYWRlcnMgdXNlIHRoZSBiYXNlIGNsYXNzZXMuCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIFVwZGF0ZXMgdG8gcGF5bG9hZGVyL2RlcGF5bG9hZGVycywgbWFrZSBwYXlsb2FkZXJzIHVzZQorCSAgdGhlIGJhc2UgY2xhc3Nlcy4KKwkgIFVwZGF0ZWQgUkVBRE1FIHdpdGggc3VnZ2VzdGVkIFJUUCBjYXBzIGFuZCBob3cgdG8gY29udmVydAorCSAgdG8vZnJvbSBTRFAuCisJICBBZGRlZCBjb25maWcgZGVzY3JpcHRvciBpbiBtcDR2IHBheWxvYWRlci4KKworMjAwNS0wOS0xNSAxMDo0Nzo1OCArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBnc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zaW5rLmMgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfZmluZF9iZXN0KTogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIDIwMDUtMDktMTUgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisJICAqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYyAoZ3N0X2F1dG9fYXVkaW9fc2lua19maW5kX2Jlc3QpOgorCSAgKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmMKKwkgIChnc3RfYXV0b192aWRlb19zaW5rX2ZpbmRfYmVzdCk6IFVwZGF0ZSBmb3IgbmV3IHJlZ2lzdHJ5IEFQSS4KKworMjAwNS0wOS0xNCAyMDo1MTo0NyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGNvbW1vbi86IGEgc2ltcGxlIHB5IHNjcmlwdCB0byBnZW5lcmF0ZSB2YWxpZCB4bWwgZnJvbSBhIEMgZXhhbXBsZSBwcm9iYWJseSBhbHNvIG5lZWQgdG8gc3RyaXAgYW4gTUlUIGxpY2Vuc2Ugd2hlbiB3ZS4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGNvbW1vbi9jLXRvLXhtbC5weToKKwkgICogY29tbW9uL2d0ay1kb2MtcGx1Z2lucy5tYWs6CisJICBhIHNpbXBsZSBweSBzY3JpcHQgdG8gZ2VuZXJhdGUgdmFsaWQgeG1sIGZyb20gYSBDIGV4YW1wbGUKKwkgIHByb2JhYmx5IGFsc28gbmVlZCB0byBzdHJpcCBhbiBNSVQgbGljZW5zZSB3aGVuIHdlIGRlY2lkZQorCSAgKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJICAqIGdzdC9sZXZlbC9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfaW5pdCk6CisJICAqIGdzdC9sZXZlbC9sZXZlbC1leGFtcGxlLmM6IChtZXNzYWdlX2hhbmRsZXIpLCAobWFpbik6CisJICBhZGQgYW4gZXhhbXBsZSB0byBsZXZlbCB0aGF0IHdpbGwgc2hvdyB1cCBpbiB0aGUgZG9jcworCSAgKiBnc3QvcnRwL1RPRE86CisJICBhZGQgYSBub3RlIGZvciB0aGUgZnV0dXJlCisKKzIwMDUtMDktMTQgMTE6NDQ6MTEgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSAgZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzogQWN0dWFsbHkgZGVmaW5lIHRoZSBkZWJ1ZyBvYmplY3QgYmVpbmcgdXNlZCBpbiB3YXZlbmMuIEZpeGVzICMzMTYyMDUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiAoZ3N0X3dhdmVuY19jbGFzc19pbml0KToKKwkgIEFjdHVhbGx5IGRlZmluZSB0aGUgZGVidWcgb2JqZWN0IGJlaW5nIHVzZWQgaW4gd2F2ZW5jLiBGaXhlcyAjMzE2MjA1CisKKzIwMDUtMDktMTQgMTE6MjM6NDQgKzAwMDAgIE1pY2hhZWwgU21pdGggPG1zbWl0aEB4aXBoLm9yZz4KKworCSogQ2hhbmdlTG9nOgorCSogZ3N0L3NtcHRlL01ha2VmaWxlLmFtOgorCSAgTGluayBzbXB0ZSBwbHVnaW4gYWdhaW5zdCBHU1RfQkFTRV9MSUJTLCB0byBnZXQgbGliZ3N0YmFzZTsgbmVlZGVkIHRvIGJ1aWxkIG9uIHdpbjMyIGFzIHRoaXMgcGx1Z2luIHVzZXMgY29sbGVjdHBhZHMgLi4uCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIExpbmsgc21wdGUgcGx1Z2luIGFnYWluc3QgR1NUX0JBU0VfTElCUywgdG8gZ2V0IGxpYmdzdGJhc2U7IG5lZWRlZCB0bworCSAgYnVpbGQgb24gd2luMzIgYXMgdGhpcyBwbHVnaW4gdXNlcyBjb2xsZWN0cGFkcyAoYnVnIDMxNjIwNCkKKworMjAwNS0wOS0xMiAxNjozNzowNSArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIENoYW5nZUxvZzoKKwkgIEZpeCB1cCBib2d1cyBDaGFuZ2VMb2cgZW50cnkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4IHVwIGJvZ3VzIENoYW5nZUxvZyBlbnRyeQorCisyMDA1LTA5LTEyIDE2OjE0OjQ4ICswMDAwICBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CisKKwkgIGF1dG9nZW4uc2ggKHBhY2thZ2UpOiBOb3cgdHlwZSAnbWFrZScgdG8gYnVpbGQgZ3N0LXBsdWdpbnMtZ29vZC4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0wOS0xMiAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogYXV0b2dlbi5zaCAocGFja2FnZSk6IE5vdyB0eXBlICdtYWtlJyB0byBidWlsZCBnc3QtcGx1Z2lucy1nb29kLgorCisyMDA1LTA5LTExIDE3OjUyOjA5ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogY29tbW9uOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLTEzOTQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxhdy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2FjYXNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lZmZlY3R2LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1lc2RzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mZHNyYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ2NvbmZlbGVtZW50cy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZ29vbS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGV2ZWwueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3NhdWRpby54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0c3AueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0MnNlbmQueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zcGVleC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2JveC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9mbGlwLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWw6CisJICBhZGQgc291cmNlIG1vZHVsZSB0byBkb2NzOyByZWluc3BlY3QKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkIHNvdXJjZSBtb2R1bGUgdG8gZG9jczsgcmVpbnNwZWN0CisKKzIwMDUtMDktMDkgMTc6NTY6NDMgKzAwMDAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJICBNb3ZlIGZkc3JjIGJhY2sgaW50byBnc3RyZWFtZXIgY29yZSBlbGVtZW50cy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9mZHNyYy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2Zkc3JjL2dzdGZkc3JjLmM6CisJICAqIGdzdC9mZHNyYy9nc3RmZHNyYy5oOgorCSAgTW92ZSBmZHNyYyBiYWNrIGludG8gZ3N0cmVhbWVyIGNvcmUgZWxlbWVudHMuCisJICAqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiAoZ3N0X2xldmVsX2NsYXNzX2luaXQpLAorCSAgKGdzdF9sZXZlbF90cmFuc2Zvcm1faXApOgorCSAgKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogKGdzdF92aWRlb19ib3hfc2V0X3Byb3BlcnR5KToKKwkgIEJhc2V0cmFuc2Zvcm0gY2hhbmdlcy4KKworMjAwNS0wOS0wOSAxNjoxMTo0OCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6CisJKiBleHQvanBlZy9zbW9rZWNvZGVjLmM6CisJICBmaXggY29tcGlsZXIgd2FybmluZ3MKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZml4IGNvbXBpbGVyIHdhcm5pbmdzCisKKzIwMDUtMDktMDkgMTE6MDk6NDkgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJICBnc3QtcGx1Z2lucy1nb29kLnNwZWMuaW46IHNwZWMgZmlsZSBmaXhlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIHNwZWMgZmlsZSBmaXhlcworCSAgKiBnc3QvdWRwL2dzdG11bHRpdWRwc2luay5jOiAoZ3N0X211bHRpdWRwc2lua19jbGFzc19pbml0KSwKKwkgIChnc3RfbXVsdGl1ZHBzaW5rX3JlbmRlciksIChnc3RfbXVsdGl1ZHBzaW5rX2FkZCksCisJICAoZ3N0X211bHRpdWRwc2lua19jbGVhcik6CisJICBpdCBhY3R1YWxseSBoZWxwcyB0byBhY3R1YWxseSBzdHJlYW0gaWYgd2UgaG9vayB1cCB0aGUKKwkgIGFkZCBzaWduYWwgdG8gYW4gYWN0dWFsIGltcGxlbWVudGF0aW9uCisJICAqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX3N0YXJ0KToKKwkgIHNvbWUgZGVidWdnaW5nCisKKzIwMDUtMDktMDggMTY6NTg6NDAgKzAwMDAgIEZsYXZpbyBPbGl2ZWlyYSA8ZmxhdmlvLm9saXZlaXJhQGluZHQub3JnLmJyPgorCisJKiBleHQvanBlZy9NYWtlZmlsZS5hbToKKwkqIGV4dC9qcGVnL2dzdGpwZWcuYzoKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzoKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6CisJICBqcGdlbmMgcG9ydGVkIHRvIEdTVHJlYW1lciAwLjkKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAganBnZW5jIHBvcnRlZCB0byBHU1RyZWFtZXIgMC45CisKKzIwMDUtMDktMDggMTY6MjY6MTcgKzAwMDAgIEZsYXZpbyBPbGl2ZWlyYSA8ZmxhdmlvLm9saXZlaXJhQGluZHQub3JnLmJyPgorCisJKiBDaGFuZ2VMb2c6CisJICBqcGVnZW5jIHBvcnRlZCB0byBHU3RyZWFtZXIgMC45CisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGpwZWdlbmMgcG9ydGVkIHRvIEdTdHJlYW1lciAwLjkKKworMjAwNS0wOS0wNyAxMzo0OTozNyArMDAwMCAgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJICBleHQvOiBnc3R0YWdpbnRlcmZhY2UuaCAtPiBnc3R0YWdzZXR0ZXIuaAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzoKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSAgKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6CisJICAqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSAgZ3N0dGFnaW50ZXJmYWNlLmggLT4gZ3N0dGFnc2V0dGVyLmgKKworMjAwNS0wOS0wNiAyMzozMDowMyArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkgIFBvcnQgdG8gMC45IGFuZCByZS1lbmFibGUgZWZlbmNlIHBsdWdpbi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBjb25maWd1cmUuYWM6CisJICAqIGdzdC9kZWJ1Zy9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2RlYnVnL2VmZW5jZS5jOiAoZ3N0X2VmZW5jZV9jbGFzc19pbml0KSwgKGdzdF9lZmVuY2VfaW5pdCksCisJICAoZ3N0X2VmZW5jZV9jaGFpbiksIChnc3RfZWZlbmNlX2J1ZmZlcl9hbGxvYyksIChwbHVnaW5faW5pdCksCisJICAoZ3N0X2ZlbmNlZF9idWZmZXJfZmluYWxpemUpLCAoZ3N0X2ZlbmNlZF9idWZmZXJfY29weSksCisJICAoZ3N0X2ZlbmNlZF9idWZmZXJfYWxsb2MpLCAoZ3N0X2ZlbmNlZF9idWZmZXJfY2xhc3NfaW5pdCksCisJICAoZ3N0X2ZlbmNlZF9idWZmZXJfaW5pdCksIChnc3RfZmVuY2VkX2J1ZmZlcl9nZXRfdHlwZSk6CisJICBQb3J0IHRvIDAuOSBhbmQgcmUtZW5hYmxlIGVmZW5jZSBwbHVnaW4uCisKKzIwMDUtMDktMDYgMjE6MzE6MjUgKzAwMDAgIFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5uZXQ+CisKKwkgIGV4dC9mbGFjL2dzdGZsYWNkZWMuKjogQWRkIHN1cHBvcnQgZm9yIGZsYWMgZmlsZXMgd2l0aCAyNC8zMiBiaXRzIHBlciBzYW1wbGU7IGFuZCBtaXNjLiBtaW5vciBjbGVhbi11cHMuIFNlZWtpbmcgaXMgcy4uLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGZsYWNfY2Fwc19mYWN0b3J5KSwgKHJhd19jYXBzX2ZhY3RvcnkpLAorCSAgKGdzdF9mbGFjZGVjX3dyaXRlKSwgKGdzdF9mbGFjZGVjX2NvbnZlcnRfc3JjKToKKwkgICogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oOgorCSAgQWRkIHN1cHBvcnQgZm9yIGZsYWMgZmlsZXMgd2l0aCAyNC8zMiBiaXRzIHBlciBzYW1wbGU7IGFuZCBtaXNjLgorCSAgbWlub3IgY2xlYW4tdXBzLiBTZWVraW5nIGlzIHN0aWxsIHBhcnRseSBicm9rZW4gKGZvciBtZSBhdCBsZWFzdCkuCisKKzIwMDUtMDktMDYgMTU6NTA6NTggKzAwMDAgIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisKKwkgIGdzdC9ydHAvOiBBZGRlZCBtcGVnNCB2aWRlbyBwYXlsb2FkIGVuY29kZXIvZGVjb2Rlci4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSAgKiBnc3QvcnRwL2dzdHJ0cC5jOiAocGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZkZWMuYzogKGdzdF9ydHBtcDR2ZGVjX2dldF90eXBlKSwKKwkgIChnc3RfcnRwbXA0dmRlY19iYXNlX2luaXQpLCAoZ3N0X3J0cG1wNHZkZWNfY2xhc3NfaW5pdCksCisJICAoZ3N0X3J0cG1wNHZkZWNfaW5pdCksIChnc3RfcnRwbXA0dmRlY19zZXRjYXBzKSwKKwkgIChnc3RfcnRwbXA0dmRlY19jaGFpbiksIChnc3RfcnRwbXA0dmRlY19zZXRfcHJvcGVydHkpLAorCSAgKGdzdF9ydHBtcDR2ZGVjX2dldF9wcm9wZXJ0eSksIChnc3RfcnRwbXA0dmRlY19jaGFuZ2Vfc3RhdGUpLAorCSAgKGdzdF9ydHBtcDR2ZGVjX3BsdWdpbl9pbml0KToKKwkgICogZ3N0L3J0cC9nc3RydHBtcDR2ZGVjLmg6CisJICAqIGdzdC9ydHAvZ3N0cnRwbXA0dmVuYy5jOiAoZ3N0X3J0cG1wNHZlbmNfZ2V0X3R5cGUpLAorCSAgKGdzdF9ydHBtcDR2ZW5jX2Jhc2VfaW5pdCksIChnc3RfcnRwbXA0dmVuY19jbGFzc19pbml0KSwKKwkgIChnc3RfcnRwbXA0dmVuY19pbml0KSwgKGdzdF9ydHBtcDR2ZW5jX3NldGNhcHMpLAorCSAgKGdzdF9ydHBtcDR2ZW5jX2ZsdXNoKSwgKGdzdF9ydHBtcDR2ZW5jX2NoYWluKSwKKwkgIChnc3RfcnRwbXA0dmVuY19zZXRfcHJvcGVydHkpLCAoZ3N0X3J0cG1wNHZlbmNfZ2V0X3Byb3BlcnR5KSwKKwkgIChnc3RfcnRwbXA0dmVuY19jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3J0cG1wNHZlbmNfcGx1Z2luX2luaXQpOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wNHZlbmMuaDoKKwkgICogZ3N0L3J0cC9nc3RydHBtcGFkZWMuYzogKGdzdF9ydHBtcGFkZWNfY2hhaW4pOgorCSAgKiBnc3QvcnRwL2dzdHJ0cG1wYWVuYy5jOiAoZ3N0X3J0cG1wYWVuY19mbHVzaCk6CisJICBBZGRlZCBtcGVnNCB2aWRlbyBwYXlsb2FkIGVuY29kZXIvZGVjb2Rlci4KKwkgIEFkZGVkIHNvbWUgZG9jcyBpbiBtcGEgcGF5bG9hZGVyLgorCisyMDA1LTA5LTA2IDE0OjA2OjQ3ICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgYmFjayB0byBIRUFECisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGJhY2sgdG8gSEVBRAorCis9PT0gcmVsZWFzZSAwLjkuMSA9PT0KKworMjAwNS0wOS0wNiAxNDowNTozMyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIENoYW5nZUxvZzoKKwkqIE5FV1M6CisJKiBSRUFETUU6CisJKiBSRUxFQVNFOgorCSogYXV0b2dlbi5zaDoKKwkqIGNvbW1vbjoKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIHJlbGVhc2luZyAwLjkuMgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZWxlYXNpbmcgMC45LjIKKworMjAwNS0wOS0wNSAxNzoyMDoyOCArMDAwMCAgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSAgRml4IHVwIGFsbCB0aGUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9ucy4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgRml4IHVwIGFsbCB0aGUgc3RhdGUgY2hhbmdlIGZ1bmN0aW9ucy4KKworMjAwNS0wOS0wNSAxNjoyODoxNiArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJICBleHQvZHYvZ3N0ZHZkZW11eC5jIChnc3RfZHZkZW11eF9jaGFpbik6IE1vdmUgdGhlIHBhZCBhZGRpbmcgaGVyZSBmcm9tIHRoZSBzdGF0ZSBjaGFuZ2UgaGFuZGxlciwgc28gd2UgZmlyZSBzaWduYWxzIHcuLi4KKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgMjAwNS0wOS0wNSAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKwkgICogZXh0L2R2L2dzdGR2ZGVtdXguYyAoZ3N0X2R2ZGVtdXhfY2hhaW4pOiBNb3ZlIHRoZSBwYWQgYWRkaW5nCisJICBoZXJlIGZyb20gdGhlIHN0YXRlIGNoYW5nZSBoYW5kbGVyLCBzbyB3ZSBmaXJlIHNpZ25hbHMgd2l0aG91dAorCSAgaG9sZGluZyB0aGUgc3RhdGUgbG9jay4KKworMjAwNS0wOS0wNSAxNToxMDoxOCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIGNsZWFuaW5nIHVwIGJhZAorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBjbGVhbmluZyB1cCBiYWQKKworMjAwNS0wOS0wNSAxMzoxODo0MiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGRvY3MvLmdpdGlnbm9yZToKKwkqIGRvY3MvcGx1Z2lucy8uZ2l0aWdub3JlOgorCSAgbWFpbnRlbmFuY2UgY29tbWl0cworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBtYWludGVuYW5jZSBjb21taXRzCisKKzIwMDUtMDktMDQgMTU6MDk6MzMgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0LWJ1aWxkLnN0YW1wOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3Quc3RhbXA6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWFzaW5rLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVzZHNpbmsueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZkc3JjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbGFjLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nY29uZmVsZW1lbnRzLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hvdXQyc2VuZC54bWw6CisJKiBkb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc21wdGUueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi11ZHAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbDoKKwkqIGRvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZsaXAueG1sOgorCSogZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbDoKKwkgIGRpc3RjaGVjayBmaXhlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBkaXN0Y2hlY2sgZml4ZXMKKworMjAwNS0wOS0wNCAxMTo1MDo0NyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogYXV0b2dlbi5zaDoKKwkqIGNvbW1vbjoKKwkqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJICBmaXggZGlzdGNoZWNrCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGZpeCBkaXN0Y2hlY2sKKworMjAwNS0wOS0wMiAxNTo1Njo1MiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC1wbHVnaW5zLWdvb2Quc3BlYy5pbjoKKwkgIHZhcmlvdXMgc3BlYyBmaXhlcworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICB2YXJpb3VzIHNwZWMgZml4ZXMKKworMjAwNS0wOS0wMiAxNTo0NDo1MCArMDAwMCAgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorCisJKiBjaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSogZXhhbXBsZXMvZ3N0cGxheS9wbGF5ZXIuYzoKKwkqIGV4YW1wbGVzL3N0YXRzL21wMm9nZy5jOgorCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6CisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkqIGV4dC9kdi9nc3RkdmRlbXV4LmM6CisJKiBleHQvZXNkL2VzZG1vbi5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOgorCSogZXh0L2djb25mL2dzdGdjb25mYXVkaW9zaW5rLmM6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZ2aWRlb3NpbmsuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka2FuaW1hdGlvbi5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOgorCSogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYzoKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6CisJKiBleHQvbGlibW5nL2dzdG1uZ2RlYy5jOgorCSogZXh0L21pa21vZC9nc3RtaWttb2QuYzoKKwkqIGV4dC9wYW5nby9nc3R0ZXh0b3ZlcmxheS5jOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzoKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkqIGdzdC9kZWJ1Zy9icmVha215ZGF0YS5jOgorCSogZ3N0L2RlYnVnL2dzdG5hdmlnYXRpb250ZXN0LmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOgorCSogZ3N0L2Zkc3JjL2dzdGZkc3JjLmM6CisJKiBnc3QvZmx4L2dzdGZseGRlYy5jOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOgorCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzoKKwkqIGdzdC9vbGRjb3JlL2dzdG1kNXNpbmsuYzoKKwkqIGdzdC9vbGRjb3JlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L29sZGNvcmUvZ3N0cGlwZWZpbHRlci5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBMMTZlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGFyc2UuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwTDE2cGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlYy5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBhbXJlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1ycGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGRlYy5jOgorCSogZ3N0L3J0cC9nc3RydHBkZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21kZXBheS5jOgorCSogZ3N0L3J0cC9nc3RydHBnc21lbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGFyc2UuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BlbmMuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuYzoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVjLmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmM6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWVuYy5jOgorCSogZ3N0L3J0cC9nc3RydHBtcGFwYXkuYzoKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzoKKwkqIGdzdC9zbW9vdGh3YXZlL2dzdHNtb290aHdhdmUuYzoKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5jOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzoKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzoKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzoKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vaHUucG86CisJKiBwby9pdC5wbzoKKwkqIHBvL25iLnBvOgorCSogcG8vbmwucG86CisJKiBwby9vci5wbzoKKwkqIHBvL3NxLnBvOgorCSogcG8vc3IucG86CisJKiBwby9zdi5wbzoKKwkqIHBvL3VrLnBvOgorCSogcG8vdmkucG86CisJKiBzeXMvb3NzL2dzdG9zc21peGVyZWxlbWVudC5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvZWxlbWVudC5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgQWxsIHBsdWdpbnMgdXBkYXRlZCBmb3IgZWxlbWVudCBzdGF0ZSBjaGFuZ2VzLgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICAyMDA1LTA5LTAyICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCSAgKiBBbGwgcGx1Z2lucyB1cGRhdGVkIGZvciBlbGVtZW50IHN0YXRlIGNoYW5nZXMuCisKKzIwMDUtMDktMDEgMjE6MjQ6NTcgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBleHQvYWFsaWIvTWFrZWZpbGUuYW06CisJICBmaXggYnVpbGQgYWZ0ZXIgY2xlYW5pbmcgdXAgbXkgdm9taXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZml4IGJ1aWxkIGFmdGVyIGNsZWFuaW5nIHVwIG15IHZvbWl0CisKKzIwMDUtMDktMDEgMjE6MjM6MDkgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBleHQvYWFsaWIvTWFrZWZpbGUuYW06CisJICBmaXggYnVpbGQgYWZ0ZXIgY2xlYW5pbmcgdXAgbXkgdm9taXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZml4IGJ1aWxkIGFmdGVyIGNsZWFuaW5nIHVwIG15IHZvbWl0CisKKzIwMDUtMDktMDEgMjE6MjA6NDUgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3Qvc21wdGUvTWFrZWZpbGUuYW06CisJICBmaXggYnVpbGQgYWZ0ZXIgY2xlYW5pbmcgdXAgbXkgdm9taXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZml4IGJ1aWxkIGFmdGVyIGNsZWFuaW5nIHVwIG15IHZvbWl0CisKKzIwMDUtMDktMDEgMjE6MTU6MzAgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBnc3Qvc21wdGUvTWFrZWZpbGUuYW06CisJICBmaXggYnVpbGQgYWZ0ZXIgY2xlYW5pbmcgdXAgbXkgdm9taXQKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZml4IGJ1aWxkIGFmdGVyIGNsZWFuaW5nIHVwIG15IHZvbWl0CisKKzIwMDUtMDktMDEgMjA6MjM6MjIgKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBNYWtlZmlsZS5hbToKKwkqIGNoZWNrLy5naXRpZ25vcmU6CisJKiBjaGVjay9NYWtlZmlsZS5hbToKKwkqIGNoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiBjaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSogY29tbW9uOgorCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuaDoKKwkqIHRlc3RzL2NoZWNrLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9jaGVjay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmU6CisJKiB0ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jOgorCSAgQW5kcmV3aW8gUGF0cmlja29mb3J1cyBXaW5nb255bXVzIC0gNSBhZGRpdGlvbmFsIHRlc3RzIGZvciB5b3VyIHNpbnMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgQW5kcmV3aW8gUGF0cmlja29mb3J1cyBXaW5nb255bXVzIC0gNSBhZGRpdGlvbmFsIHRlc3RzIGZvciB5b3VyIHNpbnMKKwkgIEFkZCBhIHJlZ3Jlc3Npb24gdGVzdCBmb3IgbGV2ZWwgYW5kIGZpeCBhIGNhc3RpbmcgYnVnIHRoYXQgbWFkZSB0aGUgYWRkaXRpb25hbAorCSAgY2hhbm5lbHMgdHVybiBvdXQgd3JvbmcKKworMjAwNS0wOS0wMSAxNzo1NToxNCArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGFkZCBkb2NzIHRvIGJ1aWxkCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgICogTWFrZWZpbGUuYW06CisJICAqIGNvbmZpZ3VyZS5hYzoKKwkgIGFkZCBkb2NzIHRvIGJ1aWxkCisJICAqIGNvbW1vbi9wbHVnaW5zLnhzbDoKKwkgIHdyYXAgRGVzY3JpcHRpb24gaW50byBhIHJlZnNlY3QyCisJICAqIGRvY3MvTWFrZWZpbGUuYW06CisJICAqIGRvY3MvcGx1Z2lucy9NYWtlZmlsZS5hbToKKwkgICogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1kb2NzLnNnbWw6CisJICAqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSAgKiBnc3QvZ29vbS9NYWtlZmlsZS5hbToKKwkgICogZ3N0L2dvb20vZ3N0Z29vbS5jOiAoZ3N0X2dvb21fZ2V0X3R5cGUpLCAoZ3N0X2dvb21fYmFzZV9pbml0KSwKKwkgIChnc3RfZ29vbV9jbGFzc19pbml0KSwgKGdzdF9nb29tX2luaXQpLCAoZ3N0X2dvb21fZGlzcG9zZSksCisJICAoZ3N0X2dvb21fc2lua19zZXRjYXBzKSwgKGdzdF9nb29tX3NyY19zZXRjYXBzKSwKKwkgIChnc3RfZ29vbV9zcmNfbmVnb3RpYXRlKSwgKGdzdF9nb29tX2V2ZW50KSwgKGdzdF9nb29tX2NoYWluKSwKKwkgIChnc3RfZ29vbV9jaGFuZ2Vfc3RhdGUpOgorCSAgKiBnc3QvZ29vbS9nc3Rnb29tLmg6CisJICBHc3RHT09NIC0+IEdzdEdvb20KKwkgIGFkZCBhbiBleGFtcGxlIGxhdW5jaCBsaW5lCisJICAqIGdzdC9sZXZlbC9nc3RsZXZlbC5oOgorCSAgKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOgorCSAgY2xlYW51cHMKKworMjAwNS0wOC0zMSAxNjoyODowNSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGdzdC9kdmRscGNtZGVjLy5naXRpZ25vcmU6CisJKiBnc3QvZHZkbHBjbWRlYy9NYWtlZmlsZS5hbToKKwkqIGdzdC9kdmRscGNtZGVjL2dzdGR2ZGxwY21kZWMuYzoKKwkqIGdzdC9kdmRscGNtZGVjL2dzdGR2ZGxwY21kZWMuaDoKKwkgIHJlbW92ZSBkdmRscGNtZGVjLCBpdCdzIGR2ZCBzdHVmZgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICByZW1vdmUgZHZkbHBjbWRlYywgaXQncyBkdmQgc3R1ZmYKKworMjAwNS0wOC0zMCAxOTo0MToxMiArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L2dldHRleHQuaDoKKwkqIGdzdC1saWJzL2dzdC9nc3QtaTE4bi1wbHVnaW4uaDoKKwkgIGFkZCBzb21lIGkxOG4gaGVhZGVycworCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBhZGQgc29tZSBpMThuIGhlYWRlcnMKKworMjAwNS0wOC0zMCAxOToyNDozNyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGRvY3MvcGx1Z2lucy8uZ2l0aWdub3JlOgorCSAgaWdub3JlIG1vcmUKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgaWdub3JlIG1vcmUKKworMjAwNS0wOC0zMCAxOToyNDowMyArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkqIGRvY3MvTWFrZWZpbGUuYW06CisJICBNYWtlZmlsZS5hbQorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBNYWtlZmlsZS5hbQorCisyMDA1LTA4LTMwIDE5OjIwOjAyICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogZG9jcy91cGxvYWQubWFrOgorCSogZG9jcy92ZXJzaW9uLmVudGl0aWVzLmluOgorCSAgY29tbWl0IG5ldyBzdHVmZgorCSAgT3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgZnJvbSBDVlM6CisJICBjb21taXQgbmV3IHN0dWZmCisKKzIwMDUtMDgtMzAgMTk6MDE6MTggKzAwMDAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCisJKiBDaGFuZ2VMb2c6CisJKiBjb21tb246CisJKiBjb25maWd1cmUuYWM6CisJKiBkb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW06CisJKiBkb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbDoKKwkqIGRvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0OgorCSogZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy50eXBlczoKKwkgIGRvY3VtZW50IGVsZW1lbnRzIGFuZCBwbHVnaW5zLiAgU2hhemFtICEKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgZG9jdW1lbnQgZWxlbWVudHMgYW5kIHBsdWdpbnMuICBTaGF6YW0gIQorCisyMDA1LTA4LTMwIDE3OjM3OjAwICswMDAwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKworCSogLmdpdGlnbm9yZToKKwkqIENPUFlJTkc6CisJKiBSRUxFQVNFOgorCSogZ3N0LXBsdWdpbnMtZ29vZC5zcGVjLmluOgorCSAgYWRkIHNvbWUgZmlsZXMKKwkgIE9yaWdpbmFsIGNvbW1pdCBtZXNzYWdlIGZyb20gQ1ZTOgorCSAgYWRkIHNvbWUgZmlsZXMKKworMjAwMS0xMi0xNyAxODozNzowMSArMDAwMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+CisKKwkgIGJ1aWxkaW5nIHVwIHNwZWVkCisJICBPcmlnaW5hbCBjb21taXQgbWVzc2FnZSBmcm9tIENWUzoKKwkgIGJ1aWxkaW5nIHVwIHNwZWVkCisKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJhYWM4ZQotLS0gL2Rldi9udWxsCisrKyBiL01BSU5UQUlORVJTCkBAIC0wLDAgKzEsMTIgQEAKK0dTdHJlYW1lciBpcyBjdXJyZW50bHkgbWFpbnRhaW5lZCBieSB0aGUgY29uc2Vuc3VzIG9mIGEgbnVtYmVyCitvZiBwZW9wbGUsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOgorCisgSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PgorIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0Bjb2F4aW9uLm5ldD4KKworTWFpbnRhaW5lci1yZWxhdGVkIGlzc3VlcyBzaG91bGQgYmUgYWRkcmVzc2VkIHRvOgorCisgIGdzdHJlYW1lci1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmFtIGIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjYjU5YQotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsODIgQEAKK0RJU1RDSEVDS19DT05GSUdVUkVfRkxBR1M9LS1lbmFibGUtZ3RrLWRvYworCitBTFdBWVNfU1VCRElSUyA9CQlcCisJZ3N0IHN5cyBleHQgCQlcCisJdGVzdHMJCQlcCisJZG9jcwkJCVwKKwlwbwkJCVwKKwljb21tb24JCQlcCisJbTQJCQlcCisJcGtnY29uZmlnCisKK1NVQkRJUlMgPSAkKEFMV0FZU19TVUJESVJTKQorCitESVNUX1NVQkRJUlMgPSAkKEFMV0FZU19TVUJESVJTKQorCitFWFRSQV9ESVNUID0gXAorCWRlcGNvbXAgXAorCUFVVEhPUlMgQ09QWUlORyBORVdTIFJFQURNRSBSRUxFQVNFIFJFUVVJUkVNRU5UUyBcCisJQ2hhbmdlTG9nIGdzdC1wbHVnaW5zLWdvb2QuZG9hcCBhdXRvZ2VuLnNoIFwKKwkkKHNoZWxsIGZpbmQgIiQodG9wX3NyY2RpcikiIC10eXBlIGYgLW5hbWUgbWVzb24uYnVpbGQgISAtcGF0aCAiJCh0b3Bfc3JjZGlyKS8kKFBBQ0tBR0VfVEFSTkFNRSktKiIgKSBcCisJbWVzb25fb3B0aW9ucy50eHQKKworRElTVENMRUFORklMRVMgPSBfc3RkaW50LmgKKworbm9pbnN0X0hFQURFUlMgPSBcCisJZ3N0LWxpYnMvZ3N0L2dldHRleHQuaCBcCisJZ3N0LWxpYnMvZ3N0L2dzdC1pMThuLXBsdWdpbi5oIFwKKwlnc3QtbGlicy9nc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oCisKK0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00IC1JIGNvbW1vbi9tNAorCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL3JlbGVhc2UubWFrCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL3BvLm1haworCitjaGVjay12YWxncmluZDoKKwkkKE1BS0UpIC1DIHRlc3RzL2NoZWNrIGNoZWNrLXZhbGdyaW5kCisKK2lmIEhBVkVfR1NUX0NIRUNLCitjaGVjay10b3J0dXJlOgorCSQoTUFLRSkgLUMgdGVzdHMvY2hlY2sgdG9ydHVyZQorYnVpbGQtY2hlY2tzOgorCSQoTUFLRSkgLUMgdGVzdHMvY2hlY2sgYnVpbGQtY2hlY2tzCitlbHNlCitjaGVjay10b3J0dXJlOgorCXRydWUKK2J1aWxkLWNoZWNrczoKKwl0cnVlCitlbmRpZgorCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL2NvdmVyYWdlL2xjb3YubWFrCisKKyMgY3J1ZnQ6IHBsdWdpbnMgdGhhdCBoYXZlIGJlZW4gbWVyZ2VkIG9yIG1vdmVkIG9yIHJlbmFtZWQKKworQ1JVRlRfRklMRVMgPSBcCisJJCh0b3BfYnVpbGRkaXIpL2dzdC1wbHVnaW5zLWdvb2Quc3BlYyBcCisJJCh0b3BfYnVpbGRkaXIpL3dpbjMyL2NvbW1vbi9jb25maWcuaC1uZXcgXAorCSQodG9wX2J1aWxkZGlyKS9jb21tb24vc2hhdmUgXAorCSQodG9wX2J1aWxkZGlyKS9jb21tb24vc2hhdmUtbGlidG9vbCBcCisJJCh0b3BfYnVpbGRkaXIpL2RvY3MvcGx1Z2lucy94bWwvcGx1Z2luLXNob3V0MnNlbmQueG1sIFwKKwkkKHRvcF9idWlsZGRpcikvZXh0L3B1bHNlLy5saWJzL2xpYmdzdHB1bHNlLnNvIFwKKwkkKHRvcF9idWlsZGRpcikvZXh0L3NvdXAvLmxpYnMvbGliZ3N0c291cGh0dHBzcmMuc28gXAorCSQodG9wX2J1aWxkZGlyKS9nc3QvbWVkaWFuLy5saWJzLyoue3NvLGRsbCxETEwsZHlsaWJ9IFwKKwkkKHRvcF9idWlsZGRpcikvZ3N0L3F0ZGVtdXgvLmxpYnMvKi57c28sZGxsLERMTCxkeWxpYn0gXAorCSQodG9wX2J1aWxkZGlyKS9nc3QvcXVpY2t0aW1lLy5saWJzLyoue3NvLGRsbCxETEwsZHlsaWJ9IFwKKwkkKHRvcF9idWlsZGRpcikvZ3N0L3ZpZGVvZmlsdGVyLy5saWJzLyp2aWRlb2ZsaXAue3NvLGRsbCxETEwsZHlsaWJ9IFwKKwkkKHRvcF9idWlsZGRpcikvZ3N0L3ZpZGVvZmlsdGVyLy5saWJzLyp2aWRlb2JhbGFuY2Uue3NvLGRsbCxETEwsZHlsaWJ9IFwKKwkkKHRvcF9idWlsZGRpcikvZ3N0L3ZpZGVvZmlsdGVyLy5saWJzLypnYW1tYS57c28sZGxsLERMTCxkeWxpYn0gXAorCSQodG9wX2J1aWxkZGlyKS9zeXMvZGlyZWN0c291bmQvLmxpYnMvbGliZ3N0ZGlyZWN0c291bmRzaW5rLntkbGwsRExMfSBcCisJJCh0b3BfYnVpbGRkaXIpL3N5cy9vc3M0Ly5saWJzL2xpYmdzdG9zczRhdWRpby5zbyBcCisJJCh0b3BfYnVpbGRkaXIpL3N5cy93YXZlZm9ybS8ubGlicy9saWJnc3R3YXZlZm9ybXNpbmsue2RsbCxETEx9CisKK0NSVUZUX0RJUlMgPSBcCisJJCh0b3Bfc3JjZGlyKS9kb2NzL3BsdWdpbnMvdG1wbCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvbWVkaWFuIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9xdGRlbXV4IFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9xdWlja3RpbWUgXAorCSQodG9wX3NyY2RpcikvZXh0L2Fubm9kZXggXAorCSQodG9wX3NyY2RpcikvdGVzdHMvZXhhbXBsZXMvcHVsc2UKKworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2NvbW1vbi9jcnVmdC5tYWsKKworYWxsLWxvY2FsOiBjaGVjay1jcnVmdApkaWZmIC0tZ2l0IGEvTkVXUyBiL05FV1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRmYjFlYQotLS0gL2Rldi9udWxsCisrKyBiL05FV1MKQEAgLTAsMCArMSw3MzQgQEAKKyMgR1N0cmVhbWVyIDEuMTIgUmVsZWFzZSBOb3RlcworCitHU3RyZWFtZXIgMS4xMi4wIHdhcyBvcmlnaW5hbGx5IHJlbGVhc2VkIG9uIDR0aCBNYXkgMjAxNy4KKworVGhlIEdTdHJlYW1lciB0ZWFtIGlzIHByb3VkIHRvIGFubm91bmNlIGEgbmV3IG1ham9yIGZlYXR1cmUgcmVsZWFzZSBpbiB0aGUKK3N0YWJsZSAxLnggQVBJIHNlcmllcyBvZiB5b3VyIGZhdm91cml0ZSBjcm9zcy1wbGF0Zm9ybSBtdWx0aW1lZGlhIGZyYW1ld29yayEKKworQXMgYWx3YXlzLCB0aGlzIHJlbGVhc2UgaXMgYWdhaW4gcGFja2VkIHdpdGggbmV3IGZlYXR1cmVzLCBidWcgZml4ZXMgYW5kIG90aGVyCitpbXByb3ZlbWVudHMuCisKK1NlZSBbaHR0cHM6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3JlbGVhc2VzLzEuMTIvXVtsYXRlc3RdIGZvciB0aGUgbGF0ZXN0Cit2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQuCisKKypMYXN0IHVwZGF0ZWQ6IFRodXJzZGF5IDQgTWF5IDIwMTcsIDExOjAwIFVUQyBbKGxvZyldW2dpdGxvZ10qCisKK1tsYXRlc3RdOiBodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvcmVsZWFzZXMvMS4xMi8KK1tnaXRsb2ddOiBodHRwczovL2NnaXQuZnJlZWRlc2t0b3Aub3JnL2dzdHJlYW1lci93d3cvbG9nL3NyYy9odGRvY3MvcmVsZWFzZXMvMS4xMi9yZWxlYXNlLW5vdGVzLTEuMTIubWQKKworIyMgSW50cm9kdWN0aW9uCisKK1RoZSBHU3RyZWFtZXIgdGVhbSBpcyBwcm91ZCB0byBhbm5vdW5jZSBhIG5ldyBtYWpvciBmZWF0dXJlIHJlbGVhc2UgaW4gdGhlCitzdGFibGUgMS54IEFQSSBzZXJpZXMgb2YgeW91ciBmYXZvdXJpdGUgY3Jvc3MtcGxhdGZvcm0gbXVsdGltZWRpYSBmcmFtZXdvcmshCisKK0FzIGFsd2F5cywgdGhpcyByZWxlYXNlIGlzIGFnYWluIHBhY2tlZCB3aXRoIG5ldyBmZWF0dXJlcywgYnVnIGZpeGVzIGFuZCBvdGhlcgoraW1wcm92ZW1lbnRzLgorCisjIyBIaWdobGlnaHRzCisKKy0gbmV3IGBtc2RrYCBwbHVnaW4gZm9yIEludGVsJ3MgTWVkaWEgU0RLIGZvciBoYXJkd2FyZS1hY2NlbGVyYXRlZCB2aWRlbworICBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgb24gSW50ZWwgZ3JhcGhpY3MgaGFyZHdhcmUgb24gV2luZG93cyBvciBMaW51eC4KKworLSBgeDI2NGVuY2AgY2FuIG5vdyB1c2UgbXVsdGlwbGUgeDI2NCBsaWJyYXJ5IHZlcnNpb25zIGNvbXBpbGVkIGZvciBkaWZmZXJlbnQKKyAgYml0IGRlcHRocyBhdCBydW50aW1lLCB0byB0cmFuc3BhcmVudGx5IHByb3ZpZGUgc3VwcG9ydCBmb3IgbXVsdGlwbGUgYml0CisgIGRlcHRocy4KKworLSBgdmlkZW9zY2FsZWAgYW5kIGB2aWRlb2NvbnZlcnRgIG5vdyBzdXBwb3J0IG11bHRpLXRocmVhZGVkIHNjYWxpbmcgYW5kCisgIGNvbnZlcnNpb24sIHdoaWNoIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2l0aCBoaWdoZXIgcmVzb2x1dGlvbiB2aWRlby4KKworLSBgaDI2NHBhcnNlYCB3aWxsIG5vdyBhdXRvbWF0aWNhbGx5IGluc2VydCBBVSBkZWxpbWl0ZXJzIGlmIG5lZWRlZCB3aGVuCisgIG91dHB1dHRpbmcgYnl0ZS1zdHJlYW0gZm9ybWF0LCB3aGljaCBpbXByb3ZlcyBzdGFuZGFyZCBjb21wbGlhbmNlIGFuZAorICBpcyBuZWVkZWQgaW4gcGFydGljdWxhciBmb3IgSExTIHBsYXliYWNrIG9uIGlPUy9tYWNPUy4KKworLSBgcnRwYmluYCBoYXMgYWNxdWlyZWQgYnVuZGxlIHN1cHBvcnQgZm9yIGluY29taW5nIHN0cmVhbXMKKworIyMgTWFqb3IgbmV3IGZlYXR1cmVzIGFuZCBjaGFuZ2VzCisKKyMjIyBOb3Rld29ydGh5IG5ldyBBUEkKKworLSBUaGUgdmlkZW8gbGlicmFyeSBnYWluZWQgc3VwcG9ydCBmb3IgYSBudW1iZXIgb2YgbmV3IHZpZGVvIGZvcm1hdHM6CisKKyAgLSBgR0JSXzEyTEVgLCBgR0JSXzEyQkVgLCBgR0JSQV8xMkxFYCwgYEdCUkFfMTJCRWAgKHBsYW5hciA0OjQ6NCBSR0IvUkdCQSwgMTIgYml0cyBwZXIgY2hhbm5lbCkKKyAgLSBgR0JSQV8xMExFYCwgYEdCUkFfMTBCRWAgKHBsYW5hciA0OjQ6NDo0IFJHQkEsIDEwIGJpdHMgcGVyIGNoYW5uZWwpCisgIC0gYEdCUkFgIChwbGFuYXIgNDo0OjQ6NCBBUkdCLCA4IGJpdHMgcGVyIGNoYW5uZWwpCisgIC0gYEk0MjBfMTJCRWAsIGBJNDIwXzEyTEVgIChwbGFuYXIgNDoyOjAgWVVWLCAxMiBiaXRzIHBlciBjaGFubmVsKQorICAtIGBJNDIyXzEyQkVgLGBJNDIyXzEyTEVgIChwbGFuYXIgNDoyOjIgWVVWLCAxMiBiaXRzIHBlciBjaGFubmVsKQorICAtIGBZNDQ0XzEyQkVgLCBgWTQ0NF8xMkxFYCAocGxhbmFyIDQ6NDo0IFlVViwgMTIgYml0cyBwZXIgY2hhbm5lbCkKKyAgLSBgVllVWWAgKGFub3RoZXIgcGFja2VkIDQ6MjoyIFlVViBmb3JtYXQpCisKKy0gVGhlIGhpZ2gtbGV2ZWwgYEdzdFBsYXllcmAgQVBJIHdhcyBleHRlbmRlZCB3aXRoIGZ1bmN0aW9ucyBmb3IgdGFraW5nIHZpZGVvCisgIHNuYXBzaG90cyBhbmQgZW5hYmxpbmcgYWNjdXJhdGUgc2Vla2luZy4gSXQgY2FuIG9wdGlvbmFsbHkgYWxzbyB1c2UgdGhlCisgIHN0aWxsLWV4cGVyaW1lbnRhbCBgcGxheWJpbjNgIGVsZW1lbnQgbm93LgorCisjIyMgTmV3IEVsZW1lbnRzCisKKy0gbXNkazogbmV3IHBsdWdpbiBmb3IgSW50ZWwncyBNZWRpYSBTREsgZm9yIGhhcmR3YXJlLWFjY2VsZXJhdGVkIHZpZGVvIGVuY29kaW5nCisgIGFuZCBkZWNvZGluZyBvbiBJbnRlbCBncmFwaGljcyBoYXJkd2FyZSBvbiBXaW5kb3dzIG9yIExpbnV4LiBUaGlzIGluY2x1ZGVzCisgIGFuIEguMjY0IGVuY29kZXIvZGVjb2RlciAoYG1zZGtoMjY0ZGVjYCwgYG1zZGtoMjY0ZW5jYCksCisgIGFuIEguMjY1IGVuY29kZXIvZGVjb2RlciAoYG1zZGtoMjY1ZGVjYCwgYG1zZGtoMjY1ZW5jYCksCisgIGFuIE1KUEVHIGVuY29kZXIvZW5jb2RlciAoYG1zZGttanBlZ2RlY2AsIGBtc2RrbWpwZWdlbmNgKSwKKyAgYW4gTVBFRy0yIHZpZGVvIGVuY29kZXIgKGBtc2RrbXBlZzJlbmNgKSBhbmQgYSBWUDggZW5jb2RlciAoYG1zZGt2cDhlbmNgKS4KKworLSBgaXFhYCBpcyBhIG5ldyBJbWFnZSBRdWFsaXR5IEFzc2Vzc21lbnQgcGx1Z2luIGJhc2VkIG9uIFtEU1NJTV1bZHNzaW1dLAorICBzaW1pbGFyIHRvIHRoZSBvbGQgKHVucG9ydGVkKSB2aWRlb21lYXN1cmUgZWxlbWVudC4KKworLSBUaGUgYGZhY2VvdmVybGF5YCBlbGVtZW50LCB3aGljaCBhbGxvd3MgeW91IHRvIG92ZXJsYXkgU1ZHIGdyYXBoaWNzIG92ZXIKKyAgYSBkZXRlY3RlZCBmYWNlIGluIGEgdmlkZW8gc3RyZWFtLCBoYXMgYmVlbiBwb3J0ZWQgZnJvbSAwLjEwLgorCistIG91ciBgZmZtcGVnYCB3cmFwcGVyIHBsdWdpbiBub3cgZXhwb3Nlcy9tYXBzIHRoZSBmZm1wZWcgT3B1cyBhdWRpbyBkZWNvZGVyCisgIChgYXZkZWNfb3B1c2ApIGFzIHdlbGwgYXMgdGhlIEdvUHJvIENpbmVGb3JtIEhEIC8gQ0ZIRCBkZWNvZGVyIChgYXZkZWNfY2ZoZGApLAorICBhbmQgYWxzbyBhIHBhcnNlci93cml0ZXIgZm9yIHRoZSBJVkYgZm9ybWF0IChgYXZkZW11eF9pdmZgIGFuZCBgYXZtdXhfaXZmYCkuCisKKy0gYGF1ZGlvYnVmZmVyc3BsaXRgIGlzIGEgbmV3IGVsZW1lbnQgdGhhdCBzcGxpdHMgcmF3IGF1ZGlvIGJ1ZmZlcnMgaW50bworICBlcXVhbC1zaXplZCBidWZmZXJzCisKKy0gYGF1ZGlvbWl4bWF0cml4YCBpcyBhIG5ldyBlbGVtZW50IHRoYXQgbWl4ZXMgTjpNIGF1ZGlvIGNoYW5uZWxzIGFjY29yZGluZyB0bworICBhIGNvbmZpZ3VyZWQgbWl4IG1hdHJpeC4KKworLSBUaGUgYHRpbWVjb2Rld2FpdGAgZWxlbWVudCBnb3QgcmVuYW1lZCB0byBgYXZ3YWl0YCBhbmQgY2FuIG9wZXJhdGUgaW4KKyAgZGlmZmVyZW50IG1vZGVzIG5vdy4KKworLSBUaGUgYG9wZW5jdmAgdmlkZW8gcHJvY2Vzc2luZyBwbHVnaW4gaGFzIGdhaW5lZCBhIG5ldyBgZGV3YXJwYCBlbGVtZW50IHRoYXQKKyAgZGV3YXJwcyBmaXNoZXllIGltYWdlcy4KKworLSBgdHRtbGAgaXMgYSBuZXcgcGx1Z2luIGZvciBwYXJzaW5nIGFuZCByZW5kZXJpbmcgc3VidGl0bGVzIGluIFRpbWVkIFRleHQKKyAgTWFya3VwIExhbmd1YWdlIChUVE1MKSBmb3JtYXQuIEZvciB0aGUgdGltZSBiZWluZyB0aGVzZSBlbGVtZW50cyB3aWxsIG5vdAorICBiZSBhdXRvcGx1Z2dlZCBkdXJpbmcgbWVkaWEgcGxheWJhY2sgaG93ZXZlciwgdW5sZXNzIHRoZSBgR1NUX1RUTUxfQVVUT1BMVUc9MWAKKyAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LiBPbmx5IHRoZSBFQlUtVFQtRCBwcm9maWxlIGlzIHN1cHBvcnRlZCBhdCB0aGlzCisgIHBvaW50LgorCitbZHNzaW1dOiBodHRwczovL2dpdGh1Yi5jb20vcG9ybmVsL2Rzc2ltCisKKyMjIyBOZXcgZWxlbWVudCBmZWF0dXJlcyBhbmQgYWRkaXRpb25zCisKKy0gYHgyNjRlbmNgIGNhbiBub3cgdXNlIG11bHRpcGxlIHgyNjQgbGlicmFyeSB2ZXJzaW9ucyBjb21waWxlZCBmb3IgZGlmZmVyZW50CisgIGJpdCBkZXB0aHMgYXQgcnVudGltZSwgdG8gdHJhbnNwYXJlbnRseSBwcm92aWRlIHN1cHBvcnQgZm9yIG11bHRpcGxlIGJpdAorICBkZXB0aHMuIEEgbmV3IGNvbmZpZ3VyZSBwYXJhbWV0ZXIgYC0td2l0aC14MjY0LWxpYnJhcmllc2AgaGFzIGJlZW4gYWRkZWQgdG8KKyAgc3BlY2lmeSBhZGRpdGlvbmFsIHBhdGhzIHRvIGxvb2sgZm9yIGFkZGl0aW9uYWwgeDI2NCBsaWJyYXJpZXMgdG8gbG9hZC4KKyAgQmFja2dyb3VuZCBpcyB0aGF0IHRoZSBsaWJ4MjY0IGxpYnJhcnkgaXMgYWx3YXlzIGNvbXBpbGUgZm9yIG9uZSBzcGVjaWZpYworICBiaXQgZGVwdGggYW5kIHRoZSBgeDI2NGVuY2AgZWxlbWVudCB3b3VsZCBzaW1wbHkgc3VwcG9ydCB0aGUgZGVwdGggc3VwcG9ydGVkCisgIGJ5IHRoZSB1bmRlcmx5aW5nIGxpYnJhcnkuIE5vdyB3ZSBjYW4gc3VwcG9ydCBtdWx0aXBsZSBkZXB0aHMuCisKKy0gYHgyNjRlbmNgIGFsc28gcGlja3MgdXAgdGhlIGludGVybGFjaW5nIG1vZGUgYXV0b21hdGljYWxseSBmcm9tIHRoZSBpbnB1dAorICBjYXBzIG5vdyBhbmQgcGFzc2VkIGludGVybGFjaW5nL1RGRiBpbmZvcm1hdGlvbiBjb3JyZWN0bHkgdG8gdGhlIGxpYnJhcnkuCisKKy0gYHZpZGVvc2NhbGVgIGFuZCBgdmlkZW9jb252ZXJ0YCBub3cgc3VwcG9ydCBtdWx0aS10aHJlYWRlZCBzY2FsaW5nIGFuZAorICBjb252ZXJzaW9uLCB3aGljaCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdpdGggaGlnaGVyIHJlc29sdXRpb24gdmlkZW8uCisgIFRoaXMgaGFzIHRvIGJlIGVuYWJsZWQgZXhwbGljaXRseSB2aWEgdGhlIGAibi10aHJlYWRzImAgcHJvcGVydHkuCisKKy0gYHZpZGVvcmF0ZWAncyBuZXcgYCJyYXRlImAgcHJvcGVydHkgbGV0cyB5b3Ugc2V0IGEgc3BlZWQgZmFjdG9yCisgIG9uIHRoZSBvdXRwdXQgc3RyZWFtCisKKy0gYHNwbGl0bXV4c2lua2AncyBidWZmZXIgY29sbGVjdGlvbiBhbmQgc2NoZWR1bGluZyB3YXMgcmV3cml0dGVuIHRvIG1ha2UKKyAgcHJvY2Vzc2luZyBhbmQgc3BsaXR0aW5nIGRldGVybWluaXN0aWM7IGJlZm9yZSBpdCB3YXMgcG9zc2libGUgZm9yIGEgYnVmZmVyCisgIHRvIGVuZCB1cCBpbiBhIGRpZmZlcmVudCBmaWxlIGNodW5rIGluIGRpZmZlcmVudCBydW5zLiBgc3BsaXRtdXhzaW5rYCBhbHNvCisgIGdhaW5lZCBhIG5ldyBgImZvcm1hdC1sb2NhdGlvbi1mdWxsImAgc2lnbmFsIHRoYXQgd29ya3MganVzdCBsaWtlIHRoZSBleGlzdGluZworICBgImZvcm1hdC1sb2NhdGlvbiJgIHNpZ25hbCBvbmx5IHRoYXQgaXQgaXMgYWxzbyBwYXNzZWQgdGhlIHByaW1hcnkgc3RyZWFtJ3MKKyAgZmlyc3QgYnVmZmVyIGFzIGFyZ3VtZW50LCBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCB0aGUgZmlsZSBuYW1lCisgIGJhc2VkIG9uIG1ldGFkYXRhIHN1Y2ggYXMgdGhlIGJ1ZmZlciB0aW1lc3RhbXAgb3IgYW55IEdzdE1ldGEgYXR0YWNoZWQgdG8KKyAgdGhlIGJ1ZmZlci4gVGhlIG5ldyBgIm1heC1zaXplLXRpbWVjb2RlImAgcHJvcGVydHkgYWxsb3dzIGZvciB0aW1lY29kZS1iYXNlZAorICBzcGxpdHRpbmcuIGBzcGxpdG11eHNpbmtgIHdpbGwgbm93IGFsc28gYXV0b21hdGljYWxseSBzdGFydCBhIG5ldyBmaWxlIGlmIHRoZQorICBpbnB1dCBjYXBzIGNoYW5nZSBpbiBhbiBpbmNvbXBhdGlibGUgd2F5LgorCistIGBmYWtlc2lua2AgaGFzIGEgbmV3IGAiZHJvcC1vdXQtb2Ytc2VnbWVudCJgIHByb3BlcnR5IHRvIG5vdCBkcm9wCisgIG91dC1vZi1zZWdtZW50IGJ1ZmZlcnMsIHdoaWNoIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorCistIGBpZGVudGl0eWAgZ2FpbmVkIGEgYCJ0cy1vZmZzZXQiYCBwcm9wZXJ0eS4KKworLSBib3RoIGBmYWtlc2lua2AgYW5kIGBpZGVudGl0eWAgbm93IGFsc28gcHJpbnQgd2hhdCBraW5kIG9mIG1ldGFzIGFyZSBhdHRhY2hlZAorICB0byBidWZmZXJzIHdoZW4gcHJpbnRpbmcgYnVmZmVyIGRldGFpbHMgdmlhIHRoZSBgImxhc3QtbWVzc2FnZSJgIHByb3BlcnR5CisgIHVzZWQgYnkgYGdzdC1sYXVuY2gtMS4wIC12YC4KKworLSBtdWx0aXF1ZXVlOiBtYWRlIGAibWluLWludGVybGVhdmUtdGltZSJgIGEgY29uZmlndXJhYmxlIHByb3BlcnR5LgorCistIHZpZGVvIG5lcmRzIHdpbGwgYmUgdGhyaWxsZWQgdG8ga25vdyB0aGF0IGB2aWRlb3Rlc3RzcmNgJ3Mgc25vdyBpcyBub3cKKyAgZGV0ZXJtaW5pc3RpYy4gYHZpZGVvdGVzdHNyY2AgYWxzbyBnYWluZWQgc29tZSBuZXcgcHJvcGVydGllcyB0byBtYWtlIHRoZQorICBiYWxsIHBhdHRlcm4gYmFzZWQgb24gc3lzdGVtIHRpbWUsIGFuZCBpbnZlcnQgY29sb3VycyBlYWNoIHNlY29uZAorICAoYCJhbmltYXRpb24tbW9kZSJgLCBgIm1vdGlvbiJgLCBhbmQgYCJmbGlwImAgcHJvcGVydGllcykuCisKKy0gYG9nZ2RlbXV4YCByZXZlcnNlIHBsYXliYWNrIHNob3VsZCB3b3JrIGFnYWluIG5vdy4gWW91J3JlIHdlbGNvbWUuCisKKy0gYHBsYXliaW4zYCBhbmQgYHVyaXNvdXJjZWJpbmAgbm93IGhhdmUgYnVmZmVyaW5nIGVuYWJsZWQgYnkgZGVmYXVsdCwgYW5kCisgIGJ1ZmZlcmluZyBtZXNzYWdlIGFnZ3JlZ2F0aW9uIHdhcyBmaXhlZC4KKworLSBgdGNwY2xpZW50c3JjYCBub3cgaGFzIGEgYCJ0aW1lb3V0ImAgcHJvcGVydHkKKworLSBgYXBwc2lua2AgaGFzIGdhaW5lZCBzdXBwb3J0IGZvciBidWZmZXIgbGlzdHMuIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICByZWFzb25zIHVzZXJzIG5lZWQgdG8gZW5hYmxlIHRoaXMgZXhwbGljaXRseSB3aXRoIGBnc3RfYXBwX3Npbmtfc2V0X2J1ZmZlcl9saXN0X3N1cHBvcnQoKWAsCisgIGhvd2V2ZXIuIE9uY2UgYWN0aXZhdGVkLCBhIHB1bGxlZCBgR3N0U2FtcGxlYCBjYW4gY29udGFpbiBlaXRoZXIgYSBidWZmZXIKKyAgbGlzdCBvciBhIHNpbmdsZSBidWZmZXIuCisKKy0gYHNwbGl0bXV4c3JjYCByZXZlcnNlIHBsYXliYWNrIHdhcyBmaXhlZCBhbmQgaGFuZGxpbmcgb2Ygc3BhcnNlIHN0cmVhbXMsIHN1Y2gKKyAgYXMgc3VidGl0bGUgdHJhY2tzIG9yIG1ldGFkYXRhIHRyYWNrcywgd2FzIGltcHJvdmVkLgorCistIGBtYXRyb3NrYW11eGAgaGFzIGFjcXVpcmVkIHN1cHBvcnQgZm9yIG11eGluZyBHNzIyIGF1ZGlvOyBpdCBhbHNvIG1hcmtzIGFsbAorICBidWZmZXJzIGFzIGtleWZyYW1lcyBub3cgd2hlbiBzdHJlYW1pbmcgb25seSBhdWRpbywgc28gdGhhdCBgdGNwc2VydmVyc2lua2AKKyAgd2lsbCBiZWhhdmUgcHJvcGVybHkgd2l0aCBhdWRpby1vbmx5IHN0cmVhbXMuCisKKy0gYHF0bXV4YCBnYWluZWQgc3VwcG9ydCBmb3IgUHJvUmVzIDQ0NDQgWFEsIEhFVkMvSC4yNjUgYW5kIENpbmVGb3JtIChHb1BybykgZm9ybWF0cywKKyAgYW5kIGdlbmVyYWxseSB3cml0ZXMgbW9yZSB2aWRlbyBzdHJlYW0tcmVsYXRlZCBtZXRhZGF0YSBpbnRvIHRoZSB0cmFjayBoZWFkZXJzLgorICBJdCBpcyBhbHNvIGFsbG93cyBjb25maWd1cmF0aW9uIG9mIHRoZSBtYXhpbXVtIGludGVybGVhdmUgc2l6ZSBpbiBieXRlcyBhbmQKKyAgdGltZSBub3cuIEZvciBmcmFnbWVudGVkIG1wNCB3ZSBhbHdheXMgd3JpdGUgdGhlIGB0ZmR0YCBhdG9tIG5vdyBhcyByZXF1aXJlZAorICBieSB0aGUgREFTSCBzcGVjLgorCistIGBxdGRlbXV4YCBzdXBwb3J0cyBGTEFDLCB4dmlkLCBtcDIsIFMxNkwgYW5kIENpbmVGb3JtIChHb1BybykgdHJhY2tzIG5vdywgYW5kCisgIGdlbmVyYWxseSB0cmllcyBoYXJkZXIgdG8gZXh0cmFjdCBtb3JlIHZpZGVvLXJlbGF0ZWQgaW5mb3JtYXRpb24gZnJvbSB0cmFjaworICBoZWFkZXJzLCBzdWNoIGFzIGNvbG9yaW1ldHJ5IG9yIGludGVybGFjaW5nIGRldGFpbHMuIEl0IGFsc28gcmVjZWl2ZWQgYQorICBjb3VwbGUgb2YgZml4ZXMgZm9yIHRoZSBzY2VuYXJpbyB3aGVyZSB1cHN0cmVhbSBvcGVyYXRlcyBpbiBUSU1FIGZvcm1hdCBhbmQKKyAgZmVlZHMgY2h1bmtzIHRvIHF0ZGVtdXggKGUuZy4gREFTSCBvciBNU0UpLgorCistIGBhdWRpb2VjaG9gIGhhcyB0d28gbmV3IHByb3BlcnRpZXMgdG8gYXBwbHkgYSBkZWxheSBvbmx5IHRvIGNlcnRhaW4gY2hhbm5lbHMKKyAgdG8gY3JlYXRlIGEgc3Vycm91bmQgZWZmZWN0LCByYXRoZXIgdGhhbiBhbiBlY2hvIG9uIGFsbCBjaGFubmVscy4gVGhpcyBpcworICB1c2VmdWwgd2hlbiB1cG1peGluZyBmcm9tIHN0ZXJlbywgZm9yIGV4YW1wbGUuIFRoZSBgInN1cnJvdW5kLWRlbGF5ImAgcHJvcGVydHkKKyAgZW5hYmxlcyB0aGlzLCBhbmQgdGhlIGAic3Vycm91bmQtbWFzayJgIHByb3BlcnR5IGNvbnRyb2xzIHdoaWNoIGNoYW5uZWxzCisgIGFyZSBjb25zaWRlcmVkIHN1cnJvdW5kIHNvdW5kIGNoYW5uZWxzIGluIHRoaXMgY2FzZS4KKworLSBgd2VicnRjZHNwYCBnYWluZWQgdmFyaW91cyBuZXcgcHJvcGVydGllcyBmb3IgZ2FpbiBjb250cm9sIGFuZCBhbHNvIGV4cG9zZXMKKyAgdm9pY2UgYWN0aXZpdHkgZGV0ZWN0aW9uIG5vdywgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIHBvc3QgYCJ2b2ljZS1hY3Rpdml0eSJgCisgIG1lc3NhZ2VzIG9uIHRoZSBidXMgd2hlbmV2ZXIgdGhlIHZvaWNlIGRldGVjdGlvbiBzdGF0dXMgY2hhbmdlcy4KKworLSBUaGUgYGRlY2tsaW5rYCBjYXB0dXJlIGVsZW1lbnRzIGZvciBCbGFja21hZ2ljIERlY2tsaW5rIGNhcmRzIGhhdmUgc2VlbiBhCisgIG51bWJlciBvZiBpbXByb3ZlbWVudHM6CisKKyAgLSBgZGVja2xpbmt2aWRlb3NyY2Agd2lsbCBwb3N0IGEgd2FybmluZyBtZXNzYWdlIG9uICJubyBzaWduYWwiIGFuZCBhbiBpbmZvCisgICAgbWVzc2FnZSB3aGVuIHRoZSBzaWduYWwgbG9jayBoYXMgYmVlbiAocmUpYWNxdWlyZWQuIFRoZXJlIGlzIGFsc28gYSBuZXcKKyAgICByZWFkLW9ubHkgYCJzaWduYWwiYCBwcm9wZXJ0eSB0aGF0IGNhbiBiZSB1c2VkIHRvIHF1ZXJ5IHRoZSBzaWduYWwgbG9jaworICAgIHN0YXR1cy4gVGhlIGBHQVBgIGZsYWcgd2lsbCBiZSBzZXQgb24gYnVmZmVycyB0aGF0IGFyZSBjYXB0dXJlZCB3aXRob3V0CisgICAgYSBzaWduYWwgbG9jay4gVGhlIG5ldyBgZHJvcC1uby1zaWduYWwtZnJhbWVzYCB3aWxsIG1ha2UgYGRlY2tsaW5rdmlkZW9zcmNgCisgICAgZHJvcCBhbGwgYnVmZmVycyB0aGF0IGhhdmUgYmVlbiBjYXB0dXJlZCB3aXRob3V0IGFuIGlucHV0IHNpZ25hbC4gVGhlCisgICAgYCJza2lwLWZpcnN0LXRpbWUiYCBwcm9wZXJ0eSB3aWxsIG1ha2UgdGhlIHNvdXJjZSBkcm9wIHRoZSBmaXJzdCBmZXcKKyAgICBidWZmZXJzLCB3aGljaCBpcyBoYW5keSBzaW5jZSBzb21lIGRldmljZXMgd2lsbCBhdCBmaXJzdCBvdXRwdXQgYnVmZmVycworICAgIHdpdGggdGhlIHdyb25nIHJlc29sdXRpb24gYmVmb3JlIHRoZXkgbWFuYWdlIHRvIGZpZ3VyZSBvdXQgdGhlIHJpZ2h0IGlucHV0CisgICAgZm9ybWF0IGFuZCBkZWNpZGUgb24gdGhlIGFjdHVhbCBvdXRwdXQgY2Fwcy4KKworICAtIGBkZWNrbGlua2F1ZGlvc3JjYCBzdXBwb3J0cyBtb3JlIHRoYW4ganVzdCAyIGF1ZGlvIGNoYW5uZWxzIG5vdy4KKworICAtIFRoZSBjYXB0dXJlIHNvdXJjZXMgbm8gbG9uZ2VyIHVzZSB0aGUgImhhcmR3YXJlIiB0aW1lc3RhbXBzIHdoaWNoIHR1cm4KKyAgICBvdXQgdG8gYmUgdXNlbGVzcyBhbmQgaW5zdGVhZCBqdXN0IHVzZSB0aGUgcGlwZWxpbmUgY2xvY2sgZGlyZWN0bHkuCisKKy0gYHNydHBkZWNgIG5vdyBhbHNvIGhhcyBhIHJlYWRvbmx5IGAic3RhdHMiYCBwcm9wZXJ0eSwganVzdCBsaWtlIGBzcnRwZW5jYC4KKworLSBgcnRwYmluYCBnYWluZWQgUlRQIGJ1bmRsZSBzdXBwb3J0LCBhcyB1c2VkIGJ5IGUuZy4gV2ViUlRDLiBUaGUgZmlyc3QKKyAgIHJ0cHNlc3Npb24gd2lsbCBoYXZlIGEgYHJ0cHNzcmNkZW11eGAgZWxlbWVudCBpbnNpZGUgc3BsaXR0aW5nIHRoZSBzdHJlYW1zCisgICBiYXNlZCBvbiB0aGVpciBTU1JDIGFuZCBwb3RlbnRpYWxseSBkaXNwYXRjaCB0byBhIGRpZmZlcmVudCBydHBzZXNzaW9uLgorICAgQmVjYXVzZSByZXRyYW5zbWlzc2lvbiBTU1JDcyBuZWVkIHRvIGJlIG1lcmdlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG1lZGlhCisgICBzdHJlYW0gdGhlIGA6Om9uLWJ1bmRsZWQtc3NyY2Agc2lnbmFsIGlzIGVtaXR0ZWQgb24gYHJ0cGJpbmAgc28gdGhhdCB0aGUKKyAgIGFwcGxpY2F0aW9uIGNhbiBmaW5kIG91dCB0byB3aGljaCBzZXNzaW9uIHRoZSBTU1JDIGJlbG9uZ3MuCisKKy0gYHJ0cHJ0eHF1ZXVlYCBnYWluZWQgdHdvIG5ldyBwcm9wZXJ0aWVzIGV4cG9zaW5nIHJldHJhbnNtaXNzaW9uCisgIHN0YXRpc3RpY3MgKGAicmVxdWVzdHMiYCBhbmQgYCJmdWxmaWxsZWQtcmVxdWVzdHMiYCkKKworLSBga21zc2lua2Agd2lsbCBub3cgdXNlIHRoZSBwcmVmZXJyZWQgbW9kZSBmb3IgdGhlIG1vbml0b3IgYW5kIHJlbmRlciB0byB0aGUKKyAgYmFzZSBwbGFuZSBpZiBub3RoaW5nIGVsc2UgaGFzIHNldCBhIG1vZGUgeWV0LiBUaGlzIGNhbiBhbHNvIGJlIGRvbmUgZm9yY2libHkKKyAgaW4gYW55IGNhc2UgdmlhIHRoZSBuZXcgYCJmb3JjZS1tb2Rlc2V0dGluZyJgIHByb3BlcnR5LiBGdXJ0aGVybW9yZSwgYGttc3NpbmtgCisgIG5vdyBhbGxvd3Mgb25seSB0aGUgc3VwcG9ydGVkIGNvbm5lY3RvciByZXNvbHV0aW9ucyBhcyBpbnB1dCBjYXBzIGluIG9yZGVyIHRvCisgIGF2b2lkIHNjYWxpbmcgb3IgcG9zaXRpb25pbmcgb2YgdGhlIGlucHV0IHN0cmVhbSwgYXMgYGttc3NpbmtgIGNhbid0IGtub3cKKyAgd2hldGhlciBzY2FsaW5nIG9yIHBvc2l0aW9uaW5nIHdvdWxkIGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSB1c2UgY2FzZSBhdAorICBoYW5kLgorCistIGB3YXlsYW5kc2lua2AgY2FuIG5vdyB0YWtlIERNQWJ1ZiBidWZmZXJzIGFzIGlucHV0IGluIHRoZSBwcmVzZW5jZQorICBvZiBhIGNvbXBhdGlibGUgV2F5bGFuZCBjb21wb3NpdG9yLiBUaGlzIGVuYWJsZXMgemVyby1jb3B5IHRyYW5zZmVyCisgIGZyb20gYSBkZWNvZGVyIG9yIHNvdXJjZSB0aGF0IG91dHB1dHMgRE1BYnVmLgorCistIGB1ZHBzcmNgIGNhbiBiZSBib3VuZCB0byBtb3JlIHRoYW4gb25lIGludGVyZmFjZSB3aGVuIGpvaW5pbmcgYQorICBtdWx0aWNhc3QgZ3JvdXAsIHRoaXMgaXMgZG9uZSBieSBnaXZpbmcgYSBjb21tYSBzZXBhcmF0ZSBsaXN0IG9mCisgIGludGVyZmFjZXMgc3VjaCBhcyBtdWx0aWNhc3QtaWZhY2U9ImV0aDAsZXRoMSIuCisKKyMjIyBQbHVnaW4gbW92ZXMKKworLSBgZGF0YXVyaXNyY2AgbW92ZWQgZnJvbSBnc3QtcGx1Z2lucy1iYWQgdG8gY29yZQorCistIFRoZSBgcmF3cGFyc2VgIHBsdWdpbiBjb250YWluaW5nIHRoZSBgcmF3YXVkaW9wYXJzZWAgYW5kIGByYXd2aWRlb3BhcnNlYAorICBlbGVtZW50cyBtb3ZlZCBmcm9tIGdzdC1wbHVnaW5zLWJhZCB0byBnc3QtcGx1Z2lucy1iYXNlLiBUaGVzZSBlbGVtZW50cworICBzdXBlcnNlZGUgdGhlIG9sZCBgdmlkZW9wYXJzZWAgYW5kIGBhdWRpb3BhcnNlYCBlbGVtZW50cy4gVGhleSB3b3JrIHRoZQorICBzYW1lLCB3aXRoIGp1c3Qgc29tZSBtaW5vciBBUEkgY2hhbmdlcy4gVGhlIG9sZCBsZWdhY3kgZWxlbWVudHMgc3RpbGwKKyAgZXhpc3QgaW4gZ3N0LXBsdWdpbnMtYmFkLCBidXQgbWF5IGJlIHJlbW92ZWQgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLgorCistIGB0aW1lY29kZXN0YW1wZXJgIGlzIGFuIGVsZW1lbnQgdGhhdCBhdHRhY2hlcyB0aW1lIGNvZGVzIHRvIHZpZGVvIGJ1ZmZlcnMKKyAgaW4gZm9ybSBvZiBgR3N0VmlkZW9UaW1lQ29kZU1ldGFgcy4gSXQgaGFkIGEgYCJjbG9jay1zb3VyY2UiYCBwcm9wZXJ0eQorICB3aGljaCBoYXMgbm93IGJlZW4gcmVtb3ZlZCBiZWNhdXNlIGl0IHdhcyBmYWlybHkgdXNlbGVzcyBpbiBwcmFjdGljZS4gSXQKKyAgZ2FpbmVkIHNvbWUgbmV3IHByb3BlcnRpZXMgaG93ZXZlcjogdGhlIGAiZmlyc3QtdGltZWNvZGUiYCBwcm9wZXJ0eSBjYW4KKyAgYmUgdXNlZCB0byBzZXQgdGhlIGluaXRhbCB0aW1lY29kZTsgYWx0ZXJuYXRpdmVseSBgImZpcnN0LXRpbWVjb2RlLXRvLW5vdyJgCisgIGNhbiBiZSBzZXQsIGFuZCB0aGVuIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lIGF0IHRoZSB0aW1lIHRoZSBmaXJzdCBidWZmZXIKKyAgYXJyaXZlcyBpcyB1c2VkIGFzIGJhc2UgdGltZSBmb3IgdGhlIHRpbWUgY29kZXMuCisKKworIyMjIFBsdWdpbiByZW1vdmFscworCistIFRoZSBgbWFkYCBtcDEvbXAyL21wMyBkZWNvZGVyIHBsdWdpbiB3YXMgcmVtb3ZlZCBmcm9tIGdzdC1wbHVnaW5zLXVnbHksCisgIGFzIGxpYm1hZCBpcyBHUEwgbGljZW5zZWQsIGhhcyBiZWVuIHVubWFpbnRhaW5lZCBmb3IgYSB2ZXJ5IGxvbmcgdGltZSwgYW5kCisgIHRoZXJlIGFyZSBiZXR0ZXIgYWx0ZXJuYXRpdmVzIGF2YWlsYWJsZS4gVXNlIHRoZSBgbXBnMTIzYXVkaW9kZWNgIGVsZW1lbnQKKyAgZnJvbSB0aGUgYG1wZzEyM2AgcGx1Z2luIGluIGdzdC1wbHVnaW5zLXVnbHkgaW5zdGVhZCwgb3IgYGF2ZGVjX21wM2AgZnJvbQorICB0aGUgYGdzdC1saWJhdmAgbW9kdWxlIHdoaWNoIHdyYXBzIHRoZSBmZm1wZWcgbGlicmFyeS4gV2UgZXhwZWN0IHRoYXQgd2UKKyAgd2lsbCBiZSBhYmxlIHRvIG1vdmUgbXAzIGRlY29kaW5nIHRvIGdzdC1wbHVnaW5zLWdvb2QgaW4gdGhlIG5leHQgY3ljbGUKKyAgc2VlaW5nIHRoYXQgbW9zdCBwYXRlbnRzIGFyb3VuZCBtcDMgaGF2ZSBleHBpcmVkIHJlY2VudGx5IG9yIGFyZSBhYm91dCB0bworICBleHBpcmUuCisKKy0gVGhlIGBtaW1pY2AgcGx1Z2luIHdhcyByZW1vdmVkIGZyb20gZ3N0LXBsdWdpbnMtYmFkLiBJdCBjb250YWluZWQgYSBkZWNvZGVyCisgIGFuZCBlbmNvZGVyIGZvciBhIHZpZGVvIGNvZGVjIHVzZWQgYnkgTVNOIG1lc3NlbmdlciBtYW55IG1hbnkgeWVhcnMgYWdvIChpbgorICBhIGdhbGF4eSBmYXIgZmFyIGF3YXkpLiBUaGUgdW5kZXJseWluZyBsaWJyYXJ5IGlzIHVubWFpbnRhaW5lZCBhbmQgbm8gb25lCisgIHJlYWxseSBuZWVkcyB0byB1c2UgdGhpcyBjb2RlYyBhbnkgbW9yZS4gUmVjb3JkZWQgdmlkZW9zIGNhbiBzdGlsbCBiZSBwbGF5ZWQKKyAgYmFjayB3aXRoIHRoZSBNSU1JQyBkZWNvZGVyIGluIGdzdC1saWJhdi4KKworIyMgTWlzY2VsbGFuZW91cyBBUEkgYWRkaXRpb25zCisKKy0gUmVxdWVzdCBwYWQgbmFtZSB0ZW1wbGF0ZXMgcGFzc2VkIHRvIGBnc3RfZWxlbWVudF9yZXF1ZXN0X3BhZCgpYCBtYXkgbm93CisgIGNvbnRhaW4gbXVsdGlwbGUgc3BlY2lmaWVycywgc3VjaCBhcyBlLmcuIGBzcmNfJXVfJXVgLgorCistIFtgZ3N0X2J1ZmZlcl9pdGVyYXRlX21ldGFfZmlsdGVyZWQoKWBdW2J1ZmZlci1pdGVyYXRlLW1ldGEtZmlsdGVyZWRdIGlzIGEKKyAgdmFyaWFudCBvZiBgZ3N0X2J1ZmZlcl9pdGVyYXRlX21ldGEoKWAgdGhhdCBvbmx5IHJldHVybnMgbWV0YXMgb2YgdGhlCisgIHJlcXVlc3RlZCB0eXBlIGFuZCBza2lwcyBhbGwgb3RoZXIgbWV0YXMuCisKKy0gW2Bnc3RfcGFkX3Rhc2tfZ2V0X3N0YXRlKClgXVtwYWQtdGFzay1nZXQtc3RhdGVdIGdldHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YKKyAgYSB0YXNrIGluIGEgdGhyZWFkLXNhZmUgd2F5LgorCistIFtgZ3N0X3VyaV9nZXRfbWVkaWFfZnJhZ21lbnRfdGFibGUoKWBdW3VyaS1nZXQtZnJhZ21lbnQtdGFibGVdIHByb3ZpZGVzIHRoZQorICBtZWRpYSBmcmFnbWVudHMgb2YgYW4gVVJJIGFzIGEgdGFibGUgb2Yga2V5PXZhbHVlIHBhaXJzLgorCistIFtgZ3N0X3ByaW50KClgXVtwcmludF0sIFtgZ3N0X3ByaW50bG4oKWBdW3ByaW50bG5dLCBbYGdzdF9wcmludGVycigpYF1bcHJpbnRlcnJdLAorICBhbmQgW2Bnc3RfcHJpbnRlcnJsbigpYF1bcHJpbnRlcnJsbl0gY2FuIGJlIHVzZWQgdG8gcHJpbnQgdG8gc3Rkb3V0IG9yIHN0ZGVyci4KKyAgVGhlc2UgZnVuY3Rpb25zIGFyZSBzaW1pbGFyIHRvIGBnX3ByaW50KClgIGFuZCBgZ19wcmludGVycigpYCBidXQgdGhleSBhbHNvCisgIHN1cHBvcnQgYWxsIHRoZSBhZGRpdGlvbmFsIGZvcm1hdCBzcGVjaWZpZXJzIHByb3ZpZGVkIGJ5IHRoZSBHU3RyZWFtZXIKKyAgbG9nZ2luZyBzeXN0ZW0sIHN1Y2ggYXMgZS5nLiBgR1NUX1BUUl9GT1JNQVRgLgorCistIGEgYEdzdFBhcmFtU3BlY0FycmF5YCBoYXMgYmVlbiBhZGRlZCwgZm9yIGVsZW1lbnRzIHdobyB3YW50IHRvIGhhdmUgYXJyYXkKKyAgdHlwZSBwcm9wZXJ0aWVzLCBzdWNoIGFzIHRoZSBgYXVkaW9taXhtYXRyaXhgIGVsZW1lbnQgZm9yIGV4YW1wbGUuIFRoZXJlIGFyZQorICBhbHNvIHR3byBuZXcgZnVuY3Rpb25zIHRvIHNldCBhbmQgZ2V0IHByb3BlcnRpZXMgb2YgdGhpcyB0eXBlIGZyb20gYmluZGluZ3M6CisgICAtIGdzdF91dGlsX3NldF9vYmplY3RfYXJyYXkoKQorICAgLSBnc3RfdXRpbF9nZXRfb2JqZWN0X2FycmF5KCkKKworLSB2YXJpb3VzIGhlbHBlciBmdW5jdGlvbnMgaGF2ZSBiZWVuIGFkZGVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHNldCBvciBnZXQKKyAgR3N0U3RydWN0dXJlIGZpZWxkcyBjb250YWluaW5nIGNhcHMtc3R5bGUgYXJyYXkgb3IgbGlzdCBmaWVsZHMgZnJvbSBsYW5ndWFnZQorICBiaW5kaW5ncyAod2hpY2ggdXN1YWxseSBzdXBwb3J0IEdWYWx1ZUFycmF5IGJ1dCBkb24ndCBrbm93IGFib3V0IHRoZSBHU3RyZWFtZXIKKyAgc3BlY2lmaWMgZnVuZGFtZW50YWwgdHlwZXMpOgorICAgLSBbYGdzdF9zdHJ1Y3R1cmVfZ2V0X2FycmF5KClgXVtnZXQtYXJyYXldCisgICAtIFtgZ3N0X3N0cnVjdHVyZV9zZXRfYXJyYXkoKWBdW3NldC1hcnJheV0KKyAgIC0gW2Bnc3Rfc3RydWN0dXJlX2dldF9saXN0KClgXVtnZXQtbGlzdF0KKyAgIC0gW2Bnc3Rfc3RydWN0dXJlX3NldF9saXN0KClgXVtzZXQtbGlzdF0KKworLSBhIG5ldyBbJ2R5bmFtaWMgdHlwZScgcmVnaXN0cnkgZmFjdG9yeSB0eXBlXVtkeW5hbWljLXR5cGVdIHdhcyBhZGRlZCB0bworICByZWdpc3RlciBkeW5hbWljYWxseSBsb2FkYWJsZSBHVHlwZSB0eXBlcy4gVGhpcyBpcyB1c2VmdWwgZm9yIGF1dG9tYXRpY2FsbHkKKyAgbG9hZGluZyBlbnVtL2ZsYWdzIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW4gY2Fwcywgc3VjaCBhcyBmb3IgZXhhbXBsZSB0aGUKKyAgYEdzdFZpZGVvTXVsdGl2aWV3RmxhZ3NTZXRgIHR5cGUgdXNlZCBpbiBtdWx0aXZpZXcgdmlkZW8gY2Fwcy4KKworLSB0aGVyZSBpcyBhIG5ldyBbYEdzdFByb3h5Q29udHJvbEJpbmRpbmdgXVtwcm94eS1jb250cm9sLWJpbmRpbmddIGZvciB1c2UKKyAgd2l0aCBHc3RDb250cm9sbGVyLiBUaGlzIGFsbG93cyBwcm94eWluZyB0aGUgY29udHJvbCBpbnRlcmZhY2UgZnJvbSBvbmUKKyAgcHJvcGVydHkgb24gb25lIEdzdE9iamVjdCB0byBhbm90aGVyIHByb3BlcnR5IChvZiB0aGUgc2FtZSB0eXBlKSBpbiBhbm90aGVyCisgIEdzdE9iamVjdC4gU28gZS5nLiBpbiBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwLCBvbmUgbWF5IG5lZWQgdG8gY2FsbAorICBgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcygpYCBvbiB0aGUgY2hpbGQgYW5kIGhhdmUgYSBiaW5kaW5nIChzZXQgZWxzZXdoZXJlKQorICBvbiB0aGUgcGFyZW50IHVwZGF0ZSB0aGUgdmFsdWUuIFRoaXMgaXMgdXNlZCBpbiBgZ2x2aWRlb21peGVyYCBhbmQgYGdsc2lua2JpbmAKKyAgZm9yIGV4YW1wbGUsIHdoZXJlIGBzeW5jX3ZhbHVlcygpYCBvbiB0aGUgY2hpbGQgcGFkIG9yIGVsZW1lbnQgd2lsbCBjYWxsCisgIGBzeW5jX3ZhbHVlcygpYCBvbiB0aGUgZXhwb3NlZCBiaW4gcGFkIG9yIGVsZW1lbnQuCisKKyAgTm90ZSB0aGF0IHRoaXMgZG9lc24ndCBzb2x2ZSBHT2JqZWN0IHByb3BlcnR5IGZvcndhcmRpbmcsIHRoYXQgbXVzdAorICBiZSB0YWtlbiBjYXJlIG9mIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBtYW51YWxseSBvciB1c2luZyBHQmluZGluZy4KKworLSBgZ3N0X2Jhc2VfcGFyc2VfZHJhaW4oKWAgaGFzIGJlZW4gbWFkZSBwdWJsaWMgZm9yIHN1YmNsYXNzZXMgdG8gdXNlLgorCistIGBnc3RfYmFzZV9zaW5rX3NldF9kcm9wX291dF9vZl9zZWdtZW50KCknIGNhbiBiZSB1c2VkIGJ5IHN1YmNsYXNzZXMgdG8KKyAgcHJldmVudCBHc3RCYXNlU2luayBmcm9tIGRyb3BwaW5nIGJ1ZmZlcnMgdGhhdCBmYWxsIG91dHNpZGUgb2YgdGhlIHNlZ21lbnQuCisKKy0gW2Bnc3RfY2FsY3VsYXRlX2xpbmVhcl9yZWdyZXNzaW9uKClgXVtjYWxjLWxpbi1yZWdyZXNzaW9uXSBpcyBhIG5ldyB1dGlsaXR5CisgIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBhIGxpbmVhciByZWdyZXNzaW9uLgorCistIFtgZ3N0X2RlYnVnX2dldF9zdGFja190cmFjZWBdW2dldC1zdGFjay10cmFjZV0gaXMgYW4gZWFzeSB3YXkgdG8gcmV0cmlldmUgYQorICBzdGFjayB0cmFjZSwgd2hpY2ggY2FuIGJlIHVzZWZ1bCBpbiB0cmFjZXIgcGx1Z2lucy4KKworLSBhbGxvY2F0b3JzOiB0aGUgZG1hYnVmIGFsbG9jYXRvciBpcyBub3cgc3ViLWNsYXNzYWJsZSwgYW5kIHRoZXJlIGlzIGEgbmV3CisgIGBHU1RfQ0FQU19GRUFUVVJFX01FTU9SWV9ETUFCVUZgIGRlZmluZS4KKworLSB2aWRlbyBkZWNvZGVyIHN1YmNsYXNzZXMgY2FuIHVzZSB0aGUgbmV3bHktYWRkZWQgZnVuY3Rpb24KKyAgYGdzdF92aWRlb19kZWNvZGVyX2FsbG9jYXRlX291dHB1dF9mcmFtZV93aXRoX3BhcmFtcygpYCB0bworICBwYXNzIGEgYEdzdEJ1ZmZlclBvb2xBY3F1aXJlUGFyYW1zYCB0byB0aGUgYnVmZmVyIHBvb2wgZm9yCisgIGVhY2ggYnVmZmVyIGFsbG9jYXRpb24uCisKKy0gdGhlIHZpZGVvIHRpbWUgY29kZSBBUEkgaGFzIGdhaW5lZCBhIGRlZGljYXRlZCBbYEdzdFZpZGVvVGltZUNvZGVJbnRlcnZhbGBdW3RpbWVjb2RlLWludGVydmFsXQorICB0eXBlIHBsdXMgcmVsYXRlZCBBUEksIGluY2x1ZGluZyBmdW5jdGlvbnMgdG8gYWRkIGludGVydmFscyB0byB0aW1lY29kZXMuCisKKy0gVGhlcmUgaXMgYSBuZXcgYGxpYmdzdGJhZGFsbG9jYXRvcnMtMS4wYCBsaWJyYXJ5IGluIGdzdC1wbHVnaW5zLWJhZCwgd2hpY2gKKyAgbWF5IGdvIGF3YXkgYWdhaW4gaW4gZnV0dXJlIHJlbGVhc2VzIG9uY2UgdGhlIGBHc3RQaHlzTWVtb3J5QWxsb2NhdG9yYAorICBpbnRlcmZhY2UgQVBJIGhhcyBiZWVuIHZhbGlkYXRlZCBieSBtb3JlIHVzZXJzIGFuZCB3YXMgbW92ZWQgdG8KKyAgYGxpYmdzdGFsbG9jYXRvcnMtMS4wYCBmcm9tIGdzdC1wbHVnaW5zLWJhc2UuCisKK1t0aW1lY29kZS1pbnRlcnZhbF06IGh0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kYXRhL2RvYy9nc3RyZWFtZXIvaGVhZC9nc3QtcGx1Z2lucy1iYXNlLWxpYnMvaHRtbC9nc3QtcGx1Z2lucy1iYXNlLWxpYnMtZ3N0dmlkZW8uaHRtbCNnc3QtdmlkZW8tdGltZS1jb2RlLWludGVydmFsLW5ldworW2J1ZmZlci1pdGVyYXRlLW1ldGEtZmlsdGVyZWRdOiBodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZGF0YS9kb2MvZ3N0cmVhbWVyL2hlYWQvZ3N0cmVhbWVyL2h0bWwvR3N0QnVmZmVyLmh0bWwjZ3N0LWJ1ZmZlci1pdGVyYXRlLW1ldGEtZmlsdGVyZWQKK1twYWQtdGFzay1nZXQtc3RhdGVdOiBodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZGF0YS9kb2MvZ3N0cmVhbWVyL2hlYWQvZ3N0cmVhbWVyL2h0bWwvR3N0UGFkLmh0bWwjZ3N0LXBhZC10YXNrLWdldC1zdGF0ZQorW3VyaS1nZXQtZnJhZ21lbnQtdGFibGVdOiBodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZGF0YS9kb2MvZ3N0cmVhbWVyL2hlYWQvZ3N0cmVhbWVyL2h0bWwvZ3N0cmVhbWVyLUdzdFVyaS5odG1sI2dzdC11cmktZ2V0LW1lZGlhLWZyYWdtZW50LXRhYmxlCitbcHJpbnRdOiBodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZGF0YS9kb2MvZ3N0cmVhbWVyL2hlYWQvZ3N0cmVhbWVyL2h0bWwvZ3N0cmVhbWVyLUdzdEluZm8uaHRtbCNnc3QtcHJpbnQKK1twcmludGxuXTogaHR0cHM6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RhdGEvZG9jL2dzdHJlYW1lci9oZWFkL2dzdHJlYW1lci9odG1sL2dzdHJlYW1lci1Hc3RJbmZvLmh0bWwjZ3N0LXByaW50bG4KK1twcmludGVycl06IGh0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kYXRhL2RvYy9nc3RyZWFtZXIvaGVhZC9nc3RyZWFtZXIvaHRtbC9nc3RyZWFtZXItR3N0SW5mby5odG1sI2dzdC1wcmludGVycgorW3ByaW50ZXJybG5dOiBodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZGF0YS9kb2MvZ3N0cmVhbWVyL2hlYWQvZ3N0cmVhbWVyL2h0bWwvZ3N0cmVhbWVyLUdzdEluZm8uaHRtbCNnc3QtcHJpbnRlcnJsbgorW2dldC1hcnJheV06IGh0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kYXRhL2RvYy9nc3RyZWFtZXIvaGVhZC9nc3RyZWFtZXIvaHRtbC9Hc3RTdHJ1Y3R1cmUuaHRtbCNnc3Qtc3RydWN0dXJlLWdldC1hcnJheQorW3NldC1hcnJheV06IGh0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kYXRhL2RvYy9nc3RyZWFtZXIvaGVhZC9nc3RyZWFtZXIvaHRtbC9Hc3RTdHJ1Y3R1cmUuaHRtbCNnc3Qtc3RydWN0dXJlLXNldC1hcnJheQorW2dldC1saXN0XTogaHR0cHM6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RhdGEvZG9jL2dzdHJlYW1lci9oZWFkL2dzdHJlYW1lci9odG1sL0dzdFN0cnVjdHVyZS5odG1sI2dzdC1zdHJ1Y3R1cmUtZ2V0LWxpc3QKK1tzZXQtbGlzdF06IGh0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kYXRhL2RvYy9nc3RyZWFtZXIvaGVhZC9nc3RyZWFtZXIvaHRtbC9Hc3RTdHJ1Y3R1cmUuaHRtbCNnc3Qtc3RydWN0dXJlLXNldC1saXN0CitbZHluYW1pYy10eXBlXTogaHR0cHM6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RhdGEvZG9jL2dzdHJlYW1lci9oZWFkL2dzdHJlYW1lci9odG1sL0dzdER5bmFtaWNUeXBlRmFjdG9yeS5odG1sCitbcHJveHktY29udHJvbC1iaW5kaW5nXTogaHR0cHM6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RhdGEvZG9jL2dzdHJlYW1lci9oZWFkL2dzdHJlYW1lci1saWJzL2h0bWwvZ3N0cmVhbWVyLWxpYnMtR3N0UHJveHlDb250cm9sQmluZGluZy5odG1sCitbY2FsYy1saW4tcmVncmVzc2lvbl06IGh0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kYXRhL2RvYy9nc3RyZWFtZXIvaGVhZC9nc3RyZWFtZXIvaHRtbC9nc3RyZWFtZXItR3N0VXRpbHMuaHRtbCNnc3QtY2FsY3VsYXRlLWxpbmVhci1yZWdyZXNzaW9uCitbZ2V0LXN0YWNrLXRyYWNlXTogaHR0cHM6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RhdGEvZG9jL2dzdHJlYW1lci9oZWFkL2dzdHJlYW1lci9odG1sL2dzdHJlYW1lci1Hc3RVdGlscy5odG1sI2dzdC1kZWJ1Zy1nZXQtc3RhY2stdHJhY2UKKworIyMjIEdzdFBsYXllcgorCitOZXcgQVBJIGhhcyBiZWVuIGFkZGVkIHRvOgorCisgLSBnZXQgdGhlIG51bWJlciBvZiBhdWRpby92aWRlby9zdWJ0aXRsZSBzdHJlYW1zOgorICAgLSBgZ3N0X3BsYXllcl9tZWRpYV9pbmZvX2dldF9udW1iZXJfb2Zfc3RyZWFtcygpYAorICAgLSBgZ3N0X3BsYXllcl9tZWRpYV9pbmZvX2dldF9udW1iZXJfb2ZfdmlkZW9fc3RyZWFtcygpYAorICAgLSBgZ3N0X3BsYXllcl9tZWRpYV9pbmZvX2dldF9udW1iZXJfb2ZfYXVkaW9fc3RyZWFtcygpYAorICAgLSBgZ3N0X3BsYXllcl9tZWRpYV9pbmZvX2dldF9udW1iZXJfb2Zfc3VidGl0bGVfc3RyZWFtcygpYAorCisgLSBlbmFibGUgYWNjdXJhdGUgc2Vla2luZzogYGdzdF9wbGF5ZXJfY29uZmlnX3NldF9zZWVrX2FjY3VyYXRlKClgCisgICBhbmQgYGdzdF9wbGF5ZXJfY29uZmlnX2dldF9zZWVrX2FjY3VyYXRlKClgCisKKyAtIGdldCBhIHNuYXBzaG90IGltYWdlIG9mIHRoZSB2aWRlbyBpbiBSR0J4LCBCR1J4LCBKUEVHLCBQTkcgb3IKKyAgIG5hdGl2ZSBmb3JtYXQ6IFtgZ3N0X3BsYXllcl9nZXRfdmlkZW9fc25hcHNob3QoKWBdW3NuYXBzaG90XQorCisgLSBzZWxlY3RpbmcgdXNlIG9mIGEgc3BlY2lmaWMgdmlkZW8gc2luayBlbGVtZW50CisgICAoW2Bnc3RfcGxheWVyX3ZpZGVvX292ZXJsYXlfdmlkZW9fcmVuZGVyZXJfbmV3X3dpdGhfc2luaygpYF1bcmVuZGVyZXItd2l0aC12c2lua10pCisKKyAtIElmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBgR1NUX1BMQVlFUl9VU0VfUExBWUJJTjNgIGlzIHNldCwgR3N0UGxheWVyIHdpbGwKKyAgIHVzZSB0aGUgc3RpbGwtZXhwZXJpbWVudGFsIGBwbGF5YmluM2AgZWxlbWVudCBhbmQgdGhlIGBHc3RTdHJlYW1zYCBBUEkgZm9yCisgICBwbGF5YmFjay4KKworW3NuYXBzaG90XTogaHR0cHM6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RhdGEvZG9jL2dzdHJlYW1lci9oZWFkL2dzdC1wbHVnaW5zLWJhZC1saWJzL2h0bWwvZ3N0LXBsdWdpbnMtYmFkLWxpYnMtZ3N0cGxheWVyLmh0bWwjZ3N0LXBsYXllci1nZXQtdmlkZW8tc25hcHNob3QKK1tyZW5kZXJlci13aXRoLXZzaW5rXTogaHR0cHM6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RhdGEvZG9jL2dzdHJlYW1lci9oZWFkL2dzdC1wbHVnaW5zLWJhZC1saWJzL2h0bWwvZ3N0LXBsdWdpbnMtYmFkLWxpYnMtZ3N0cGxheWVyLXZpZGVvb3ZlcmxheXZpZGVvcmVuZGVyZXIuaHRtbCNnc3QtcGxheWVyLXZpZGVvLW92ZXJsYXktdmlkZW8tcmVuZGVyZXItbmV3LXdpdGgtc2luaworCisjIyBNaXNjZWxsYW5lb3VzIGNoYW5nZXMKKworLSB2aWRlbyBjYXBzIGZvciBpbnRlcmxhY2VkIHZpZGVvIG1heSBjb250YWluIGFuIG9wdGlvbmFsIGAiZmllbGQtb3JkZXIiYCBmaWVsZAorICBub3cgaW4gdGhlIGNhc2Ugb2YgYGludGVybGFjZWQtbW9kZT1pbnRlcmxlYXZlZGAgdG8gc2lnbmFsIHRoYXQgdGhlIGZpZWxkCisgIG9yZGVyIGlzIGFsd2F5cyB0aGUgc2FtZSB0aHJvdWdob3V0IHRoZSBzdHJlYW0uIFRoaXMgaXMgdXNlZnVsIHRvIHNpZ25hbCB0bworICBtdXhlcnMgc3VjaCBhcyBtcDRtdXguIFRoZSBuZXcgZmllbGQgaXMgcGFyc2VkIGZyb20vdG8gYEdzdFZpZGVvSW5mb2Agb2YgY291cnNlLgorCistIHZpZGVvIGRlY29kZXIgYW5kIHZpZGVvIGVuY29kZXIgYmFzZSBjbGFzc2VzIHRyeSBoYXJkZXIgdG8gcHJveHkKKyAgaW50ZXJsYWNpbmcsIGNvbG9yaW1ldHJ5IGFuZCBjaHJvbWEtc2l0ZSByZWxhdGVkIGZpZWxkcyBpbiBjYXBzIHByb3Blcmx5LgorCistIFRoZSBidWZmZXIgc3RvcmVkIGluIHRoZSBgUFJPVEVDVElPTmAgZXZlbnRzIGlzIG5vdyBsZWZ0IHVuY2hhbmdlZC4gVGhpcyBpcyBhCisgIGNoYW5nZSBvZiBiZWhhdmlvdXIgc2luY2UgMS44LCBlc3BlY2lhbGx5IGZvciB0aGUgbXNzZGVtdXggZWxlbWVudCB3aGljaCB1c2VkIHRvCisgIGRlY29kZSB0aGUgYmFzZTY0IHBhcnNlZCBkYXRhIHdyYXBwZWQgaW4gdGhlIHByb3RlY3Rpb24gZXZlbnRzIGVtaXR0ZWQgYnkgdGhlCisgIGRlbXV4ZXIuCisKKy0gYFBST1RFQ1RJT05gIGV2ZW50cyBjYW4gbm93IGJlIGluamVjdGVkIGludG8gdGhlIHBpcGVsaW5lIGZyb20gdGhlIGFwcGxpY2F0aW9uOworICBzb3VyY2UgZWxlbWVudHMgZGVyaXZpbmcgZnJvbSBHc3RCYXNlU3JjIHdpbGwgZm9yd2FyZCB0aG9zZSBkb3duc3RyZWFtIG5vdy4KKworLSBUaGUgREFTSCBkZW11eGVyIGlzIG5vdyBjb3JyZWN0bHkgcGFyc2luZyB0aGUgTVNQUi0yLjAgQ29udGVudFByb3RlY3Rpb24gbm9kZXMKKyAgYW5kIGVtaXRzIFByb3RlY3Rpb24gZXZlbnRzIGFjY29yZGluZ2x5LiBBcHBsaWNhdGlvbnMgcmVseWluZyBvbiB0aG9zZSBldmVudHMKKyAgbWlnaHQgbmVlZCB0byBkZWNvZGUgdGhlIGJhc2U2NCBkYXRhIHN0b3JlZCBpbiB0aGUgZXZlbnQgYnVmZmVyIGJlZm9yZSB1c2luZyBpdC4KKworLSBUaGUgcmVnaXN0cnkgY2FuIG5vdyBhbHNvIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCisgIGBHU1RfUkVHSVNUUllfRElTQUJMRT15ZXNgLCB3aXRoIHNpbWlsYXIgZWZmZWN0IGFzIHRoZSBgR1NUX0RJU0FCTEVfUkVHSVNUUllgCisgIGNvbXBpbGUgdGltZSBzd2l0Y2guCisKKy0gU2Vla2luZyBwZXJmb3JtYW5jZSB3aXRoIGdzdHJlYW1lci12YWFwaSBiYXNlZCBkZWNvZGVycyB3YXMgaW1wcm92ZWQuIEl0IHdvdWxkCisgIHJlY3JlYXRlIHRoZSBkZWNvZGVyIGFuZCBzdXJmYWNlcyBvbiBldmVyeSBzZWVrIHdoaWNoIGNhbiBiZSBxdWl0ZSBzbG93LgorCistIG1vcmUgcm9idXN0IGhhbmRsaW5nIG9mIGlucHV0IGNhcHMgY2hhbmdlcyBpbiB2aWRlb2FnZ3JlZ2F0b3ItYmFzZWQgZWxlbWVudHMKKyAgc3VjaCBhcyBgY29tcG9zaXRvcmAuCisKKy0gTG90cyBvZiBhZGFwdGl2ZSBzdHJlYW1pbmctcmVsYXRlZCBmaXhlcyBhY3Jvc3MgdGhlIGJvYXJkIChEQVNILCBNU1MsIEhMUykuIEFsc286CisKKyAgLSBgbXNzZGVtdXhgLCB0aGUgTWljcm9zb2Z0IFNtb290aCBTdHJlYW1pbmcgZGVtdXhlciwgaGFzIHNlZW4gdmFyaW91cworICAgIGZpeGVzIGZvciBsaXZlIHN0cmVhbXMsIGR1cmF0aW9uIHJlcG9ydGluZyBhbmQgc2Vla2luZy4KKworICAtIFRoZSBEQVNIIG1hbmlmZXN0IHBhcnNlciBub3cgZXh0cmFjdHMgTVMgUGxheVJlYWR5IENvbnRlbnRQcm90ZWN0aW9uIG9iamVjdHMKKyAgICBmcm9tIG1hbmlmZXN0cyBhbmQgc2VuZHMgdGhlbSBkb3duc3RyZWFtIGFzIGBQUk9URUNUSU9OYCBldmVudHMuIEl0IGFsc28KKyAgICBzdXBwb3J0cyBtdWx0aXBsZSBQZXJpb2QgZWxlbWVudHMgaW4gZXh0ZXJuYWwgeG1sIG5vdy4KKworLSBnc3QtbGliYXYgd2FzIHVwZGF0ZWQgdG8gZmZtcGVnIDMuMyBidXQgc2hvdWxkIHN0aWxsIHdvcmsgd2l0aCBhbnkgMy54CisgIHZlcnNpb24uCisKKy0gR3N0RW5jb2RpbmdQcm9maWxlIGhhcyBiZWVuIGdlbmVyYWxseSBlbmhhbmNlZCBzbyBpdCBjYW4sIGZvcgorICBleGFtcGxlLCBiZSB1c2VkIHRvIGdldCBwb3NzaWJsZSBwcm9maWxlcyBmb3IgYSBnaXZlbiBmaWxlCisgIGV4dGVuc2lvbi4gSXQgaXMgbm93IHBvc3NpYmxlIHRvIGRlZmluZSBwcm9maWxlcyBiYXNlZCBvbiBlbGVtZW50CisgIGZhY3RvcnkgbmFtZXMgb3IgdXNpbmcgYSBwYXRoIHRvIGEgYC5nZXBgIGZpbGUgY29udGFpbmluZyBhCisgIHNlcmlhbGl6ZWQgcHJvZmlsZS4KKworLSBgYXVkaW9jb252ZXJ0YCBjYW4gbm93IGRvIGVuZGlhbm5lc3MgY29udmVyc2lvbiBpbi1wbGFjZS4gQWxsIG90aGVyCisgIGNvbnZlcnNpb25zIHN0aWxsIHJlcXVpcmUgYSBjb3B5LCBidXQgZS5nLiBzaWduIGNvbnZlcnNpb24gYW5kIGEgZmV3IG90aGVycworICBjb3VsZCBhbHNvIGJlIGltcGxlbWVudGVkIGluLXBsYWNlIG5vdy4KKworLSBUaGUgbmV3LCBleHBlcmltZW50YWwgYHBsYXliaW4zYCBhbmQgYHVyaXNvdXJjZWJpbmAgZWxlbWVudHMgZ290IG1hbnkKKyAgYnVnZml4ZXMgYW5kIGltcHJvdmVtZW50cyBhbmQgc2hvdWxkIGdlbmVyYWxseSBiZSBjbG9zZXIgdG8gYSBmdWxsCisgIHJlcGxhY2VtZW50IG9mIHRoZSBvbGQgZWxlbWVudHMuCisKKy0gYGludGVybGVhdmVgIG5vdyBzdXBwb3J0cyA+IDY0IGNoYW5uZWxzLgorCisjIyMgT3BlbkdMIGludGVncmF0aW9uCisKKy0gQXMgdXN1YWwgdGhlIEdTdHJlYW1lciBPcGVuR0wgaW50ZWdyYXRpb24gbGlicmFyeSBoYXMgc2VlbiBudW1lcm91cworICBmaXhlcyBhbmQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGFsbCBvdmVyIHRoZSBwbGFjZSwgYW5kIGlzIGhvcGVmdWxseQorICByZWFkeSBub3cgdG8gYmVjb21lIEFQSSBzdGFibGUgYW5kIGJlIG1vdmVkIHRvIGdzdC1wbHVnaW5zLWJhc2UgZHVyaW5nIHRoZQorICAxLjE0IHJlbGVhc2UgY3ljbGUuCisKKy0gVGhlIEdTdHJlYW1lciBPcGVuR0wgaW50ZWdyYXRpb24gbGF5ZXIgaGFzIGFsc28gZ2FpbmVkIHN1cHBvcnQgZm9yIHRoZQorICBWaXZhbnRlIEVHTCBGQiB3aW5kb3dpbmcgc3lzdGVtLCB3aGljaCBpbXByb3ZlcyBwZXJmb3JtYW5jZSBvbiBwbGF0Zm9ybXMKKyAgc3VjaCBhcyBGcmVlc2NhbGUgaU1YLjYgZm9yIHRob3NlIHdobyBhcmUgc3R1Y2sgd2l0aCB0aGUgcHJvcHJpZXRhcnkgZHJpdmVyLgorICBUaGUgYHFtbGdsc2lua2AgZWxlbWVudCBhbHNvIHN1cHBvcnRzIHRoaXMgbm93IGlmIFF0IGlzIHVzZWQgd2l0aCBlZ2xmcyBvcgorICB3YXlsYW5kIGJhY2tlbmQsIGFuZCBpdCB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIFtnc3RyZWFtZXItaW14XVtnc3RyZWFtZXItaW14XQorICBvZiBjb3Vyc2UuCisKKy0gdmFyaW91cyBgcW1sZ2xzcmNgIGltcHJvdmVtZW50cworCitbZ3N0cmVhbWVyLWlteF06IGh0dHBzOi8vZ2l0aHViLmNvbS9GcmVlc2NhbGUvZ3N0cmVhbWVyLWlteAorCisjIyBUcmFjaW5nIGZyYW1ld29yayBhbmQgZGVidWdnaW5nIGltcHJvdmVtZW50cworCistIE5ldyB0cmFjaW5nIGhvb2tzIGhhdmUgYmVlbiBhZGRlZCB0byB0cmFjayBHc3RNaW5pT2JqZWN0IGFuZCBHc3RPYmplY3QKKyAgcmVmL3VucmVmIG9wZXJhdGlvbnMuCisKKy0gVGhlIG1lbW9yeSBsZWFrcyB0cmFjZXIgY2FuIG9wdGlvbmFsbHkgdXNlIHRoaXMgdG8gcmV0cmlldmUgc3RhY2sgdHJhY2VzIGlmCisgIGVuYWJsZWQgd2l0aCBlLmcuIGBHU1RfVFJBQ0VSUz1sZWFrcyhmaWx0ZXJzPSJHc3RFdmVudCxHc3RNZXNzYWdlIixzdGFjay10cmFjZXMtZmxhZ3M9ZnVsbClgCisKKy0gVGhlIGBHU1RfREVCVUdfRklMRWAgZW52aXJvbm1lbnQgdmFyaWFibGUsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHdyaXRlIHRoZQorICBkZWJ1ZyBsb2cgb3V0cHV0IHRvIGEgZmlsZSBpbnN0ZWFkIG9mIHByaW50aW5nIGl0IHRvIHN0ZGVyciwgY2FuIG5vdyBjb250YWluCisgIGEgbmFtZSBwYXR0ZXJuLCB3aGljaCBpcyB1c2VmdWwgZm9yIGF1dG9tYXRlZCB0ZXN0aW5nIGFuZCBjb250aW51b3VzCisgIGludGVncmF0aW9uIHN5c3RlbXMuIFRoZSBmb2xsb3dpbmcgZm9ybWF0IHNwZWNpZmllcnMgYXJlIHN1cHBvcnRlZDoKKworICAgLSBgJXBgOiB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIFBJRAorICAgLSBgJXJgOiB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYSByYW5kb20gbnVtYmVyLCB3aGljaCBpcyB1c2VmdWwgZm9yIGluc3RhbmNlCisgICAgIHdoZW4gcnVubmluZyB0d28gcHJvY2Vzc2VzIHdpdGggdGhlIHNhbWUgUElEIGJ1dCBpbiBkaWZmZXJlbnQgY29udGFpbmVycy4KKworIyMgVG9vbHMKKworLSBgZ3N0LWluc3BlY3QtMS4wYCBjYW4gbm93IGxpc3QgZWxlbWVudHMgYnkgdHlwZSB3aXRoIHRoZSBuZXcgYC0tdHlwZXNgCisgICBjb21tYW5kLWxpbmUgb3B0aW9uLCBlLmcuIGBnc3QtaW5zcGVjdC0xLjAgLS10eXBlcz1BdWRpby9FbmNvZGVyYCB3aWxsCisgICBzaG93IGEgbGlzdCBvZiBhdWRpbyBlbmNvZGVycy4KKworLSBgZ3N0LWxhdW5jaC0xLjBgIGFuZCBgZ3N0X3BhcnNlX2xhdW5jaCgpYCBoYXZlIGdhaW5lZCBhIG5ldyBvcGVyYXRvciAoYDpgKQorICAgdGhhdCBhbGxvd3MgbGlua2luZyBhbGwgcGFkcyBiZXR3ZWVuIHR3byBlbGVtZW50cy4gVGhpcyBpcyB1c2VmdWwgaW4gY2FzZXMKKyAgIHdoZXJlIHRoZSBleGFjdCBudW1iZXIgb2YgcGFkcyBvciB0eXBlIG9mIHBhZHMgaXMgbm90IGtub3duIGJlZm9yZWhhbmQsIHN1Y2gKKyAgIGFzIGluIHRoZSBgdXJpZGVjb2RlYmluIDogZW5jb2RlYmluYCBzY2VuYXJpbywgZm9yIGV4YW1wbGUuIEluIHRoaXMgY2FzZSwKKyAgIG11bHRpcGxlIGxpbmtzIHdpbGwgYmUgY3JlYXRlZCBpZiB0aGUgZW5jb2RlYmluIGhhcyBtdWx0aXBsZSBwcm9maWxlcworICAgY29tcGF0aWJsZSB3aXRoIHRoZSBvdXRwdXQgb2YgdXJpZGVjb2RlYmluLgorCistIGBnc3QtZGV2aWNlLW1vbml0b3ItMS4wYCBub3cgc2hvd3MgYSBgZ3N0LWxhdW5jaC0xLjBgIHNuaXBwZXQgZm9yIGVhY2gKKyAgZGV2aWNlIHRoYXQgc2hvd3MgaG93IHRvIG1ha2UgdXNlIG9mIGl0IGluIGEgYGdzdC1sYXVuY2gtMS4wYCBwaXBlbGluZSBzdHJpbmcuCisKKyMjIEdTdHJlYW1lciBSVFNQIHNlcnZlcgorCistIFRoZSBSVFNQIHNlcnZlciBub3cgYWxzbyBzdXBwb3J0cyBEaWdlc3QgYXV0aGVudGljYXRpb24gaW4gYWRkaXRpb24gdG8gQmFzaWMKKyAgYXV0aGVudGljYXRpb24uCisKKy0gVGhlIGBHc3RSVFNQQ2xpZW50YCBjbGFzcyBoYXMgZ2FpbmVkIGEgYHByZS0qLXJlcXVlc3RgIHNpZ25hbCBhbmQgdmlydHVhbAorICBtZXRob2QgZm9yIGVhY2ggY2xpZW50IHJlcXVlc3QgdHlwZSwgZW1pdHRlZCBpbiB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcnRzcAorICByZXF1ZXN0LiBUaGVzZSBzaWduYWxzIG9yIHZpcnR1YWwgbWV0aG9kcyBsZXQgdGhlIGFwcGxpY2F0aW9uIHZhbGlkYXRlIHRoZQorICByZXF1ZXN0cywgY29uZmlndXJlIHRoZSBtZWRpYS9zdHJlYW0gaW4gYSBjZXJ0YWluIHdheSBhbmQgYWxzbyBnZW5lcmF0ZSBlcnJvcgorICBzdGF0dXMgY29kZXMgaW4gY2FzZSBvZiBhbiBlcnJvciBvciBhIGJhZCByZXF1ZXN0LgorCisjIyBHU3RyZWFtZXIgVkFBUEkKKworLSBHc3RWYWFwaURpc3BsYXkgbm93IGluaGVyaXRzIGZyb20gR3N0T2JqZWN0LCB0aHVzIHRoZSBWQSBkaXNwbGF5IGxvZ2dpbmcKKyAgbWVzc2FnZXMgYXJlIGJldHRlciBhbmQgdHJhY2luZyB0aGUgY29udGV4dCBzaGFyaW5nIGlzIG1vcmUgcmVhZGFibGUuCisKKy0gV2hlbiB1cGxvYWRpbmcgcmF3IGltYWdlcyBpbnRvIGEgVkEgc3VyZmFjZXMgbm93IFZBRGVyaXZlSW1hZ2VzIGFyZSB0cmllZAorICBmaXN0LCBpbXByb3ZpbmcgdGhlIHVwbG9hZCBwZXJmb3JtYW5jZSwgaWYgaXQgaXMgcG9zc2libGUuCisKKy0gVGhlIGRlY29kZXJzIGFuZCB0aGUgcG9zdC1wcm9jZXNzb3Igbm93IGNhbiBwdXNoIGRtYWJ1Zi1iYXNlZCBidWZmZXJzIHRvCisgIGRvd25zdHJlYW0gdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLiBGb3IgZXhhbXBsZToKKworICBgR1NUX0dMX1BMQVRGT1JNPWVnbCBnc3QtcGxheS0xLjAgdmlkZW8tc2FtcGxlLm1rdiAtLXZpZGVvc2luaz1nbGltYWdlc2lua2AKKworLSBSZWZhY3RvcmVkIHRoZSB3cmFwcGluZyBvZiBWQSBzdXJmYWNlIGludG8gZ3N0cmVhbWVyIG1lbW9yeSwgYWRkaW5nIGxvY2sKKyAgd2hlbiBtYXBwaW5nIGFuZCB1bm1hcHBpbmcsIGFuZCBtYW55IG90aGVyIGZpeGVzLgorCistIE5vdyBgdmFhcGlkZWNvZGViaW5gIGxvYWRzIGB2YWFwaXBvc3Rwcm9jYCBkeW5hbWljYWxseS4gSXQgaXMgcG9zc2libGUgdG8KKyAgYXZvaWQgaXQgdXNhZ2Ugd2l0aCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYEdTVF9WQUFQSV9ESVNBQkxFX1ZQUD0xYC4KKworLSBSZWdhcmRpbmcgZW5jb2RlcnM6IHRoZXkgaGF2ZSBwcmltYXJ5IHJhbmsgYWdhaW4sIHNpbmNlIHRoZXkgY2FuIGRpc2NvdmVyLAorICBpbiBydW4tdGltZSwgdGhlIGNvbG9yIGZvcm1hdHMgdGhleSBjYW4gdXNlIGZvciB1cHN0cmVhbSByYXcgYnVmZmVycyBhbmQKKyAgY2FwcyByZW5lZ290aWF0aW9uIGlzIG5vdyBwb3NzaWJsZS4gQWxzbyB0aGUgZW5jb2RlcnMgcHVzaCBlbmNvZGluZyBpbmZvCisgIGRvd25zdHJlYW0gdmlhIHRhZ3MuCisKKy0gQWJvdXQgc3BlY2lmaWMgZW5jb2RlcnM6IGFkZGVkIGNvbnN0YW50IGJpdC1yYXRlIGVuY29kaW5nIG1vZGUgZm9yIFZQOCBhbmQKKyAgSDI2NSBlbmNvZGVyIGhhbmRsZXMgUDAxMF8xMExFIGNvbG9yIGZvcm1hdC4KKworLSBSZWdhcmRpbmcgZGVjb2RlcnMsIGZsdXNoIG9wZXJhdGlvbiBoYXMgYmVlbiBpbXByb3ZlZCwgbm93IHRoZSBpbnRlcm5hbCBWQQorICBlbmNvZGVyIGlzIG5vdCByZWNyZWF0ZWQgYXQgZWFjaCBmbHVzaC4gQWxzbyB0aGVyZSBhcmUgc2V2ZXJhbCBpbXByb3ZlbWVudHMKKyAgaW4gdGhlIGhhbmRsaW5nIG9mIEgyNjQgYW5kIEgyNjUgc3RyZWFtcy4KKworLSBWQUFQSSBwbHVnaW5zIHRyeSB0byBjcmVhdGUgdGhlaXIgb24gR3N0R0wgY29udGV4dCAod2hlbiBhdmFpbGFibGUpIGlmIHRoZXkKKyAgY2Fubm90IGZpbmQgaXQgaW4gdGhlIHBpcGVsaW5lLCB0byBmaWd1cmUgb3V0IHdoYXQgdHlwZSBvZiBWQSBEaXNwbGF5IHRoZXkKKyAgc2hvdWxkIGNyZWF0ZS4KKworLSBSZWdhcmRpbmcgYHZhYXBpc2lua2AgZm9yIFgxMSwgaWYgdGhlIGJhY2tlbmQgcmVwb3J0cyB0aGF0IGl0IGlzIHVuYWJsZSB0bworICByZW5kZXIgY29ycmVjdGx5IHRoZSBjdXJyZW50IGNvbG9yIGZvcm1hdCwgYW4gaW50ZXJuYWwgVkEgcG9zdC1wcm9jZXNzb3IsIGlzCisgIGluc3RhbnRpYXRlZCAoaWYgYXZhaWxhYmxlKSBhbmQgY29udmVydHMgdGhlIGNvbG9yIGZvcm1hdC4KKworIyMgR1N0cmVhbWVyIEVkaXRpbmcgU2VydmljZXMgYW5kIE5MRQorCistIEVuaGFuY2VkIGF1dG8gdHJhbnNpdGlvbiBiZWhhdmlvdXIKKworLSBGaXggc29tZSByYWNlcyBpbiBgbmxlY29tcG9zaXRpb25gCisKKy0gQWxsb3cgYnVpbGRpbmcgd2l0aCBtc3ZjCisKKy0gQWRkZWQgYSBVTklYIG1hbnBhZ2UgZm9yIGBnZXMtbGF1bmNoYAorCistIEFQSSBjaGFuZ2VzOgorICAtIEFkZGVkIGdlc19kZWluaXQgKGFsbG93aW5nIHRoZSBsZWFrIHRyYWNlciB0byB3b3JrIHByb3Blcmx5KQorICAtIEFkZGVkIGdlc19sYXllcl9nZXRfY2xpcHNfaW5faW50ZXJ2YWwKKyAgLSBGaW5hbGx5IGhpZGUgaW50ZXJuYWwgc3ltYm9scyB0aGF0IHNob3VsZCBuZXZlciBoYXZlIGJlZW4gZXhwb3NlZAorCisjIyBHU3RyZWFtZXIgdmFsaWRhdGUKKworLSBQb3J0IGBnc3QtdmFsaWRhdGUtbGF1bmNoZXJgIHRvIHB5dGhvbiAzCisKKy0gYGdzdC12YWxpZGF0ZS1sYXVuY2hlcmAgbm93IGNoZWNrcyBpZiBibGFja2xpc3RlZCBidWdzIGhhdmUgYmVlbiBmaXhlZCBvbgorICBidWd6aWxsYSBhbmQgZXJyb3JzIG91dCBpZiBpdCBpcyB0aGUgY2FzZQorCistIEFsbG93IGJ1aWxkaW5nIHdpdGggbXN2YworCistIEFkZCBhYmlsaXR5IGZvciB0aGUgbGF1bmNoZXIgdG8gcnVuIEdTdHJlYW1lciB1bml0IHRlc3RzCisKKy0gQWRkZWQgYSB3YXkgdG8gYWN0aXZhdGUgdGhlIGxlYWtzIHRyYWNlciBvbiBvdXIgdGVzdHMgYW5kIGZpeCBsZWFrcworCistIE1ha2UgdGhlIGh0dHAgc2VydmVyIG11bHRpdGhyZWFkZWQKKworLSBOZXcgdGVzdHN1aXRlIGZvciBydW5uaW5nIHZhcmlvdXMgdGVzdCBzY2VuYXJpb3Mgb24gdGhlIERBU0gtSUYgdGVzdCB2ZWN0b3JzCisKKyMjIEJ1aWxkIGFuZCBEZXBlbmRlbmNpZXMKKworLSBNZXNvbiBidWlsZCBmaWxlcyBhcmUgbm93IGRpc3RlZCBpbiB0YXJiYWxscywgZm9yIGpoYnVpbGQgYW5kIHNvIGRpc3RybworICBwYWNrYWdlcnMgY2FuIHN0YXJ0IHVzaW5nIGl0LiBOb3RlIHRoYXQgdGhlIE1lc29uLWJhc2VkIGJ1aWxkIHN5c3RlbSBpcyBub3QKKyAgMTAwJSBmZWF0dXJlLWVxdWl2YWxlbnQgd2l0aCB0aGUgYXV0b3Rvb2xzLWJhc2VkIG9uZSB5ZXQuCisKKy0gU29tZSBwbHVnaW4gZmlsZW5hbWVzIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIG1hdGNoIHRoZSBwbHVnaW4gbmFtZXM6IGZvciBleGFtcGxlCisgIHRoZSBmaWxlIG5hbWUgb2YgdGhlIGBlbmNvZGluZ2AgcGx1Z2luIGluIGdzdC1wbHVnaW5zLWJhc2UgY29udGFpbmluZyB0aGUKKyAgYGVuY29kZWJpbmAgZWxlbWVudCB3YXMgYGxpYmdzdGVuY29kZWJpbi5zb2AgYW5kIGhhcyBiZWVuIGNoYW5nZWQgdG8KKyAgYGxpYmdzdGVuY29kZWJpbi5zb2AuIFRoaXMgYWZmZWN0cyBvbmx5IGEgaGFuZGZ1bCBvZiBwbHVnaW5zIGFjcm9zcyBtb2R1bGVzLgorCisgICoqRGV2ZWxvcGVycyB3aG8gaW5zdGFsbCBHU3RyZWFtZXIgZnJvbSBzb3VyY2UgYW5kIGp1c3QgZG8gYG1ha2UgaW5zdGFsbGAqKgorICAqKmFmdGVyIHVwZGF0aW5nIHRoZSBzb3VyY2UgY29kZSwgd2l0aG91dCBkb2luZyBgbWFrZSB1bmluc3RhbGxgIGZpcnN0LCB3aWxsKioKKyAgKipoYXZlIHRvIG1hbnVhbGx5IHJlbW92ZSB0aGUgb2xkIGluc3RhbGxlZCBwbHVnaW4gZmlsZXMgZnJvbSB0aGUgaW5zdGFsbGF0aW9uKioKKyAgKipwcmVmaXgsIG9yIHRoZXkgd2lsbCBnZXQgJ0Nhbm5vdCByZWdpc3RlciBleGlzdGluZyB0eXBlJyBjcml0aWNhbCB3YXJuaW5ncy4qKgorCistIE1vc3Qgb2YgdGhlIGRvY2Jvb2stYmFzZWQgZG9jdW1lbnRhdGlvbiAoRkFRLCBBcHBsaWNhdGlvbiBEZXZlbG9wbWVudCBNYW51YWwsCisgIFBsdWdpbiBXcml0ZXIncyBHdWlkZSwgZGVzaWduIGRvY3VtZW50cykgaGFzIGJlZW4gY29udmVydGVkIHRvIG1hcmtkb3duIGFuZAorICBtb3ZlZCBpbnRvIGEgbmV3IGdzdC1kb2NzIG1vZHVsZS4gVGhlIGd0ay1kb2MgbGlicmFyeSBBUEkgcmVmZXJlbmNlcyBhbmQKKyAgdGhlIHBsdWdpbnMgZG9jdW1lbnRhdGlvbiBhcmUgc3RpbGwgYnVpbHQgYXMgcGFydCBvZiB0aGUgc291cmNlIG1vZHVsZXMgdGhvdWdoLgorCistIEdTdHJlYW1lciBjb3JlIG5vdyBvcHRpb25hbGx5IHVzZXMgbGlidW53aW5kIGFuZCBsaWJkdyB0byBnZW5lcmF0ZSBiYWNrdHJhY2VzLgorICBUaGlzIGlzIHVzZWZ1bCBmb3IgdHJhY2VyIHBsdWdpbnMgdXNlZCBkdXJpbmcgZGVidWdnaW5nIGFuZCBkZXZlbG9wbWVudC4KKworLSBUaGVyZSBpcyBhIG5ldyBgbGliZ3N0YmFkYWxsb2NhdG9ycy0xLjBgIGxpYnJhcnkgaW4gZ3N0LXBsdWdpbnMtYmFkICh3aGljaAorICBtYXkgZ28gYXdheSBhZ2FpbiBpbiBmdXR1cmUgcmVsZWFzZXMgb25jZSB0aGUgYEdzdFBoeXNNZW1vcnlBbGxvY2F0b3JgCisgIGludGVyZmFjZSBBUEkgaGFzIGJlZW4gdmFsaWRhdGVkIGJ5IG1vcmUgdXNlcnMpLgorCistIGBnc3Qtb214YCBhbmQgYGdzdHJlYW1lci12YWFwaWAgbW9kdWxlcyBjYW4gbm93IGFsc28gYmUgYnVpbHQgdXNpbmcgdGhlCisgIE1lc29uIGJ1aWxkIHN5c3RlbS4KKworLSBUaGUgYHF0a2l0dmlkZW9zcmNgIGVsZW1lbnQgZm9yIG1hY09TIHdhcyByZW1vdmVkLiBUaGUgQVBJIGlzIGRlcHJlY2F0ZWQKKyAgc2luY2UgMTAuOSBhbmQgaXQgd2Fzbid0IHNoaXBwZWQgaW4gdGhlIGJpbmFyaWVzIHNpbmNlIGEgZmV3IHJlbGVhc2VzLgorCisjIyBQbGF0Zm9ybS1zcGVjaWZpYyBpbXByb3ZlbWVudHMKKworIyMjIEFuZHJvaWQKKworLSBhbmRyb2lkbWVkaWE6IGFkZCBzdXBwb3J0IGZvciBWUDkgdmlkZW8gZGVjb2RpbmcvZW5jb2RpbmcgYW5kIE9wdXMgYXVkaW8KKyAgZGVjb2RpbmcgKHdoZXJlIHN1cHBvcnRlZCkKKworIyMjIE9TL1ggYW5kIGlPUworCistIGBhdmZ2aWRlb3NyY2AsIHdoaWNoIHJlcHJlc2VudHMgYW4gaVBob25lIGNhbWVyYSBvciwgb24gYSBNYWMsIGEgc2NyZWVuY2FwdHVyZQorICBzZXNzaW9uLCBzbyBmYXIgYWxsb3dlZCB5b3UgdG8gc2VsZWN0IGFuIGlucHV0IGRldmljZSBieSBkZXZpY2UgaW5kZXggb25seS4KKyAgTmV3IEFQSSBhZGRzIHRoZSBhYmlsaXR5IHRvIHNlbGVjdCB0aGUgcG9zaXRpb24gKGZyb250IG9yIGJhY2sgZmFjaW5nKSBhbmQKKyAgZGV2aWNlLXR5cGUgKHdpZGUgYW5nbGUsIHRlbGVwaG90bywgZXRjLikuIEZ1cnRoZXJtb3JlLCB5b3UgY2FuIG5vdyBhbHNvCisgIHNwZWNpZnkgdGhlIG9yaWVudGF0aW9uIChwb3J0cmFpdCwgbGFuZHNjYXBlLCBldGMuKSBvZiB0aGUgdmlkZW9zdHJlYW0uCisKKyMjIyBXaW5kb3dzCisKKy0gYGR4OXNjcmVlbmNhcHNyY2AgY2FuIG5vdyBvcHRpb25hbGx5IGFsc28gY2FwdHVyZSB0aGUgY3Vyc29yLgorCisjIyBDb250cmlidXRvcnMKKworQWxlaXggQ29uY2hpbGxvIEZsYXF1ZSwgQWxlamFuZHJvIEcuIENhc3RybywgQWxla3NhbmRyIFNsb2JvZGVuaXVrLCBBbGV4YW5kcnUKK0LEg2x1yJssIEFsZXggQXNobGV5LCBBbmRyZSBNY0N1cmR5LCBBbmRyZXcsIEFudG9uIEVsaWFzc29uLCBBbnRvbmlvIE9zcGl0ZSwKK0FybmF1ZCBWcmFjLCBBcnVuIFJhZ2hhdmFuLCBBdXLDqWxpZW4gWmFuZWxsaSwgQXhlbCBNZW56ZWwsIEJlbmphbWluIE90dGUsCitCcmFua28gU3ViYXNpYywgQnJlbmRhbiBTaGFua3MsIENhcmwgS2Fyc3RlbiwgQ2FybG9zIFJhZmFlbCBHaWFuaSwgQ2hhbmdCb2sKK0NoYWUsIENocmlzIEJhc3MsIENocmlzdGlhbiBTY2hhbGxlciwgY2hyaXN0b3BoZWN2ciwgQ2xhdWRpbyBTYWF2ZWRyYSwKK0NvcmVudGluIE5vw6tsLCBEYWcgR3VsbGJlcmcsIERhbmllbCBHYXJiYW56bywgRGFuaWVsIFNoYWhhZiwgRGF2aWQgRXZhbnMsCitEYXZpZCBTY2hsZWVmLCBEYXZpZCBXYXJtYW4sIERvbWluaXF1ZSBMZXVlbmJlcmdlciwgRG9uZ2lsIFBhcmssIERvdWdsYXMKK0JhZ25hbGwsIEVkZ2FyZCBMaW1hLCBFZHdhcmQgSGVydmV5LCBFbWVyaWMgR3JhbmdlLCBFbnJpY28gSm9ybnMsIEVucmlxdWUKK09jYcOxYSBHb256w6FsZXosIEV2YW4gTmVtZXJzb24sIEZhYmlhbiBPcmNjb24sIEZhYmllbiBEZXNzZW5uZSwgRmFicmljZSBCZWxsZXQsCitGbG9yZW50IFRoacOpcnksIEZsb3JpYW4gWndvY2gsIEZyYW5jaXNjbyBWZWxhenF1ZXosIEZyw6lkw6lyaWMgRGFsbGVhdSwgR2FyaW1hCitHYXVyLCBHYXVyYXYgR3VwdGEsIEdlb3JnZSBLaWFnaWFkYWtpcywgR2VvcmcgTGlwcGl0c2NoLCBHw7ZyYW4gSsO2bnNzb24sIEdyYWhhbQorTGVnZ2V0dCwgR3VpbGxhdW1lIERlc21vdHRlcywgR3Vya2lycGFsIFNpbmdoLCBIYWlodWEgSHUsIEhhbm5vIEJvZWNrLCBIYXZhcmQKK0dyYWZmLCBIZWVreW91bmcgU2VvLCBob29uaGVlLmxlZSwgSHl1bmp1biBLbywgSW1yZSBFw7ZycywgScOxYWtpIEdhcmPDrWEKK0V0eGViYXJyaWEsIEphZ2FkaXNoLCBKYWd5dW0gS29vLCBKYW4gQWxleGFuZGVyIFN0ZWZmZW5zIChoZWZ0aWcpLCBKYW4KK1NjaG1pZHQsIEplYW4tQ2hyaXN0b3BoZSBUcm90aW4sIEpvY2hlbiBIZW5uZWJlcmcsIEpvbmFzIEhvbG1iZXJnLCBKb3JpcworVmFsZXR0ZSwgSm9zZXAgVG9ycmEsIEp1YW4gUGFibG8gVWdhcnRlLCBKdWxpZW4gSXNvcmNlLCBKw7xyZ2VuIFNhY2hzLCBLb29wCitNYXN0LCBLc2VuaWlhIFZhc2lsY2h1aywgTGFycyBXZW5kbGVyLCBsZWlnaDEyM2xpbnV4QGdvb2dsZW1haWwuY29tLCBMdWlzIGRlCitCZXRoZW5jb3VydCwgTHlvbiBXYW5nLCBNYXJjaW4gS29sbnksIE1hcmludXMgU2NocmFhbCwgTWFyayBOYXV3ZWxhZXJ0cywKK01hdGhpZXUgRHVwb25jaGVsbGUsIE1hdHRoZXcgV2F0ZXJzLCBNYXR0IFN0YXBsZXMsIE1pY2hhZWwgRHV0a2EsIE1pY2hhZWwKK09sYnJpY2gsIE1pY2hhZWwgU21pdGgsIE1pY2hhZWwgVHJldHRlciwgTWlndWVsIFBhcsOtcyBEw61heiwgbmFtYW55YWRhdjEyLCBOZWhhCitBcm9yYSwgTmljayBLYWxsZW4sIE5pY29sYSBNdXJpbm8sIE5pY29sYXMgRGVjaGVzbmUsIE5pY29sYXMgRHVmcmVzbmUsIE5pY29sYXMKK0h1ZXQsIE5pcmJoZWVrIENoYXVoYW4sIE9sZSBBbmRyw6kgVmFkbGEgUmF2bsOlcywgT2xpdmllciBDcsOqdGUsIFBhdHJpY2lhCitNdXNjYWx1LCBQZXRlciBLb3JzZ2FhcmQsIFBldGVyIFNlaWRlcmVyLCBQZXRyIEt1bGhhdnksIFBoaWxpcHBlIE5vcm1hbmQsCitQaGlsaXBwZSBSZW5vbiwgUGhpbGlwcCBaYWJlbCwgUmFodWwgQmVkYXJrYXIsIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQsCitSaWNhcmRvIFJpYmFsZGEgRGVsZ2FkbywgUmljbyBUenNjaGljaGhvbHosINCg0YPRgdC70LDQvSDQmNC20LHRg9C70LDRgtC+0LIsIFNhbXVlbCBNYXJveSwKK1NhbnRpYWdvIENhcm90LU5lbWVzaW8sIFNjb3R0IEQgUGhpbGxpcHMsIFNlYW4gRHVCb2lzLCBTZWJhc3RpYW4gRHLDtmdlLCBTZXJnZXkKK0Jvcm92a292LCBTZXVuZ2hhIFlhbmcsIHNoYWtpbiBjaG91LCBTb25nIEJpbmcsIFPDuHJlbiBKdXVsLCBTcmVlcmVuagorQmFsYWNoYW5kcmFuLCBTdGVmYW4gS29zdCwgU3RlZmFuIFNhdWVyLCBTdGVwYW4gU2FsZW5pa292aWNoLCBTdGlhbiBTZWxuZXMsCitTdHVhcnQgV2VhdmVyLCBzdWhhczJnbywgVGhpYWdvIFNhbnRvcywgVGhpYmF1bHQgU2F1bmllciwgVGhvbWFzIEJsdWVtZWwsCitUaG9tYXMgUGV0YXp6b25pLCBUaW0tUGhpbGlwcCBNw7xsbGVyLCBUaW5nLVdlaSBMYW4sIFRvYmlhcyBNdWVsbGVyLCBUb2RvcgorVG9tb3YsIFRvbWFzeiBaYWphYywgVWxmIE9sc3NvbiwgVXJzdWxhIE1hcGxlaHVyc3QsIFbDrWN0b3IgTWFudWVsIErDoXF1ZXogTGVhbCwKK1ZpY3RvciBUb3NvLCBWaW5jZW50IFBlbnF1ZXJjJ2gsIFZpbmVldGggVE0sIFZpbm9kIEtlc3RpLCBWaXRvciBNYXNzYXJ1IEloYSwKK1ZpdmlhIE5pa29sYWlkb3UsIFdlaUNodW5nQ2hhbmcsIFdpbGxpYW0gTWFubGV5LCBXaW0gVGF5bWFucywgV29qY2llY2gKK1ByenlieWwsIFdvbmNodWwgTGVlLCBYYXZpZXIgQ2xhZXNzZW5zLCBZYXN1c2hpIFNIT0pJCisKKy4uLiBhbmQgbWFueSBvdGhlcnMgd2hvIGhhdmUgY29udHJpYnV0ZWQgYnVnIHJlcG9ydHMsIHRyYW5zbGF0aW9ucywgc2VudAorc3VnZ2VzdGlvbnMgb3IgaGVscGVkIHRlc3RpbmcuCisKKyMjIEJ1Z3MgZml4ZWQgaW4gMS4xMgorCitNb3JlIHRoYW4gWzYzNSBidWdzXVtidWdzLWZpeGVkLWluLTEuMTJdIGhhdmUgYmVlbiBmaXhlZCBkdXJpbmcKK3RoZSBkZXZlbG9wbWVudCBvZiAxLjEyLgorCitUaGlzIGxpc3QgZG9lcyBub3QgaW5jbHVkZSBpc3N1ZXMgdGhhdCBoYXZlIGJlZW4gY2hlcnJ5LXBpY2tlZCBpbnRvIHRoZQorc3RhYmxlIDEuMTAgYnJhbmNoIGFuZCBmaXhlZCB0aGVyZSBhcyB3ZWxsLCBhbGwgZml4ZXMgdGhhdCBlbmRlZCB1cCBpbiB0aGUKKzEuMTAgYnJhbmNoIGFyZSBhbHNvIGluY2x1ZGVkIGluIDEuMTIuCisKK1RoaXMgbGlzdCBhbHNvIGRvZXMgbm90IGluY2x1ZGUgaXNzdWVzIHRoYXQgaGF2ZSBiZWVuIGZpeGVkIHdpdGhvdXQgYSBidWcKK3JlcG9ydCBpbiBidWd6aWxsYSwgc28gdGhlIGFjdHVhbCBudW1iZXIgb2YgZml4ZXMgaXMgbXVjaCBoaWdoZXIuCisKK1tidWdzLWZpeGVkLWluLTEuMTJdOiBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9idWdsaXN0LmNnaT9idWdfc3RhdHVzPVJFU09MVkVEJmJ1Z19zdGF0dXM9VkVSSUZJRUQmY2xhc3NpZmljYXRpb249UGxhdGZvcm0mbGltaXQ9MCZsaXN0X2lkPTIxMzI2NSZvcmRlcj1idWdfaWQmcHJvZHVjdD1HU3RyZWFtZXImcXVlcnlfZm9ybWF0PWFkdmFuY2VkJnJlc29sdXRpb249RklYRUQmdGFyZ2V0X21pbGVzdG9uZT0xLjEwLjEmdGFyZ2V0X21pbGVzdG9uZT0xLjEwLjImdGFyZ2V0X21pbGVzdG9uZT0xLjEwLjMmdGFyZ2V0X21pbGVzdG9uZT0xLjEwLjQmdGFyZ2V0X21pbGVzdG9uZT0xLjExLjEmdGFyZ2V0X21pbGVzdG9uZT0xLjExLjImdGFyZ2V0X21pbGVzdG9uZT0xLjExLjMmdGFyZ2V0X21pbGVzdG9uZT0xLjExLjQmdGFyZ2V0X21pbGVzdG9uZT0xLjExLjkwJnRhcmdldF9taWxlc3RvbmU9MS4xMS45MSZ0YXJnZXRfbWlsZXN0b25lPTEuMTIuMAorCisjIyBTdGFibGUgMS4xMiBicmFuY2gKKworQWZ0ZXIgdGhlIDEuMTIuMCByZWxlYXNlIHRoZXJlIHdpbGwgYmUgc2V2ZXJhbCAxLjEyLnggYnVnLWZpeCByZWxlYXNlcyB3aGljaAord2lsbCBjb250YWluIGJ1ZyBmaXhlcyB3aGljaCBoYXZlIGJlZW4gZGVlbWVkIHN1aXRhYmxlIGZvciBhIHN0YWJsZSBicmFuY2gsCitidXQgbm8gbmV3IGZlYXR1cmVzIG9yIGludHJ1c2l2ZSBjaGFuZ2VzIHdpbGwgYmUgYWRkZWQgdG8gYSBidWctZml4IHJlbGVhc2UKK3VzdWFsbHkuIFRoZSAxLjEyLnggYnVnLWZpeCByZWxlYXNlcyB3aWxsIGJlIG1hZGUgZnJvbSB0aGUgZ2l0IDEuMTIgYnJhbmNoLCB3aGljaAoraXMgYSBzdGFibGUgYnJhbmNoLgorCisjIyMgMS4xMi4wCisKKzEuMTIuMCB3YXMgcmVsZWFzZWQgb24gNHRoIE1heSAyMDE3LgorCisjIyBLbm93biBJc3N1ZXMKKworLSBUaGUgYHdlYnJ0Y2RzcGAgZWxlbWVudCBpcyBjdXJyZW50bHkgbm90IHNoaXBwZWQgYXMgcGFydCBvZiB0aGUgV2luZG93cworICBiaW5hcnkgcGFja2FnZXMgZHVlIHRvIGEgW2J1aWxkIHN5c3RlbSBpc3N1ZV1bYnVnLTc3MDI2NF0uCisKK1tidWctNzcwMjY0XTogaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MDI2NAorCisjIyBTY2hlZHVsZSBmb3IgMS4xNAorCitPdXIgbmV4dCBtYWpvciBmZWF0dXJlIHJlbGVhc2Ugd2lsbCBiZSAxLjE0LCBhbmQgMS4xMSB3aWxsIGJlIHRoZSB1bnN0YWJsZQorZGV2ZWxvcG1lbnQgdmVyc2lvbiBsZWFkaW5nIHVwIHRvIHRoZSBzdGFibGUgMS4xMiByZWxlYXNlLiBUaGUgZGV2ZWxvcG1lbnQKK29mIDEuMTMvMS4xNCB3aWxsIGhhcHBlbiBpbiB0aGUgZ2l0IG1hc3RlciBicmFuY2guCisKK1RoZSBwbGFuIGZvciB0aGUgMS4xNCBkZXZlbG9wbWVudCBjeWNsZSBpcyB5ZXQgdG8gYmUgY29uZmlybWVkLCBidXQgaXQgaXMKK2V4cGVjdGVkIHRoYXQgZmVhdHVyZSBmcmVlemUgd2lsbCBiZSBhcm91bmQgU2VwdGVtYmVyIDIwMTcKK2ZvbGxvd2VkIGJ5IHNldmVyYWwgMS4xMyBwcmUtcmVsZWFzZXMgYW5kIHRoZSBuZXcgMS4xNCBzdGFibGUgcmVsZWFzZQoraW4gT2N0b2Jlci4KKworMS4xNCB3aWxsIGJlIGJhY2t3YXJkcy1jb21wYXRpYmxlIHRvIHRoZSBzdGFibGUgMS4xMiwgMS4xMCwgMS44LCAxLjYsIDEuNCwKKzEuMiBhbmQgMS4wIHJlbGVhc2Ugc2VyaWVzLgorCistIC0gLQorCisqVGhlc2UgcmVsZWFzZSBub3RlcyBoYXZlIGJlZW4gcHJlcGFyZWQgYnkgU2ViYXN0aWFuIERyw7ZnZSwgVGltLVBoaWxpcHAgTcO8bGxlcgorYW5kIFbDrWN0b3IgTWFudWVsIErDoXF1ZXogTGVhbC4qCisKKypMaWNlbnNlOiBbQ0MgQlktU0EgNC4wXShodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvKSoKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjMyODQzCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FCkBAIC0wLDAgKzEsMjU1IEBACitHU3RyZWFtZXIgMS4xMy54IGRldmVsb3BtZW50IHNlcmllcworCitXSEFUIElUIElTCistLS0tLS0tLS0tCisKK1RoaXMgaXMgR1N0cmVhbWVyLCBhIGZyYW1ld29yayBmb3Igc3RyZWFtaW5nIG1lZGlhLgorCitXSEVSRSBUTyBTVEFSVAorLS0tLS0tLS0tLS0tLS0KKworV2UgaGF2ZSBhIHdlYnNpdGUgYXQKK2h0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnLworCitZb3Ugc2hvdWxkIHN0YXJ0IGJ5IGdvaW5nIHRocm91Z2ggb3VyIEZBUSBhdAoraHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZGF0YS9kb2MvZ3N0cmVhbWVyL2hlYWQvZmFxL2h0bWwvCisKK1RoZXJlIGlzIG1vcmUgZG9jdW1lbnRhdGlvbjsgZ28gdG8KK2h0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RvY3VtZW50YXRpb24KKworWW91IGNhbiBzdWJzY3JpYmUgdG8gb3VyIG1haWxpbmcgbGlzdHM7IHNlZSB0aGUgd2Vic2l0ZSBmb3IgZGV0YWlscy4KKworV2UgdHJhY2sgYnVncyBpbiBHTk9NRSdzIGJ1Z3ppbGxhOyBzZWUgdGhlIHdlYnNpdGUgZm9yIGRldGFpbHMuCisKK1lvdSBjYW4gam9pbiB1cyBvbiBJUkMgLSAjZ3N0cmVhbWVyIG9uIGlyYy5mcmVlbm9kZS5vcmcKKworR1N0cmVhbWVyIDEuMCBzZXJpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1N0YXJyaW5nCisKKyAgR1NUUkVBTUVSCisKK1RoZSBjb3JlIGFyb3VuZCB3aGljaCBhbGwgb3RoZXIgbW9kdWxlcyByZXZvbHZlLiAgQmFzZSBmdW5jdGlvbmFsaXR5IGFuZAorbGlicmFyaWVzLCBzb21lIGVzc2VudGlhbCBlbGVtZW50cywgZG9jdW1lbnRhdGlvbiwgYW5kIHRlc3RpbmcuCisKKyAgQkFTRQorCitBIHdlbGwtZ3Jvb21lZCBhbmQgd2VsbC1tYWludGFpbmVkIGNvbGxlY3Rpb24gb2YgR1N0cmVhbWVyIHBsdWctaW5zIGFuZAorZWxlbWVudHMsIHNwYW5uaW5nIHRoZSByYW5nZSBvZiBwb3NzaWJsZSB0eXBlcyBvZiBlbGVtZW50cyBvbmUgd291bGQgd2FudAordG8gd3JpdGUgZm9yIEdTdHJlYW1lci4gIAorCitBbmQgaW50cm9kdWNpbmcsIGZvciB0aGUgZmlyc3QgdGltZSBldmVyLCBvbiB0aGUgZGV2ZWxvcG1lbnQgc2NyZWVuIC4uLgorCisgIFRIRSBHT09ECisKKyAtLS0gIlN1Y2ggaW5ncmF0aXR1ZGUuICBBZnRlciBhbGwgdGhlIHRpbWVzIEkndmUgc2F2ZWQgeW91ciBsaWZlLiIKKworQSBjb2xsZWN0aW9uIG9mIHBsdWctaW5zIHlvdSdkIHdhbnQgdG8gaGF2ZSByaWdodCBuZXh0IHRvIHlvdSBvbiB0aGUKK2JhdHRsZWZpZWxkLiAgU2hvb3Rpbmcgc2hhcnAgYW5kIG1ha2luZyBubyBtaXN0YWtlcywgdGhlc2UgcGx1Zy1pbnMgaGF2ZSBpdAorYWxsOiBnb29kIGxvb2tzLCBnb29kIGNvZGUsIGFuZCBnb29kIGxpY2Vuc2luZy4gIERvY3VtZW50ZWQgYW5kIGRyZXNzZWQgdXAKK2luIHRlc3RzLiAgSWYgeW91J3JlIGxvb2tpbmcgZm9yIGEgcm9sZSBtb2RlbCB0byBiYXNlIHlvdXIgb3duIHBsdWctaW4gb24sCitoZXJlIGl0IGlzLgorCitJZiB5b3UgZmluZCBhIHBsb3QgaG9sZSBvciBhIGJhZGx5IGxpcC1zeW5jZWQgbGluZSBvZiBjb2RlIGluIHRoZW0sCitsZXQgdXMga25vdyAtIGl0IGlzIGEgbWF0dGVyIG9mIGhvbm91ciBmb3IgdXMgdG8gZW5zdXJlIEJsb25kaWUgZG9lc24ndCBsb29rCitsaWtlIGhlJ3MgYmVlbiB3YWxraW5nIDEwMCBtaWxlcyB0aHJvdWdoIHRoZSBkZXNlcnQgd2l0aG91dCB3YXRlci4KKworICBUSEUgVUdMWQorCisgIC0tLSAiV2hlbiB5b3UgaGF2ZSB0byBzaG9vdCwgc2hvb3QuICBEb24ndCB0YWxrLiIKKworVGhlcmUgYXJlIHRpbWVzIHdoZW4gdGhlIHdvcmxkIG5lZWRzIGEgY29sb3IgYmV0d2VlbiBibGFjayBhbmQgd2hpdGUuCitRdWFsaXR5IGNvZGUgdG8gbWF0Y2ggdGhlIGdvb2QncywgYnV0IHR3by10aW1pbmcsIGJhY2tzdGFiYmluZyBhbmQgcmVhZHkgdG8KK3NlbGwgeW91ciBmcmVlZG9tIGRvd24gdGhlIHJpdmVyLiAgVGhlc2UgcGx1Zy1pbnMgbWlnaHQgaGF2ZSBhIHBhdGVudCBub29zZQorYXJvdW5kIHRoZWlyIG5lY2ssIG9yIGEgbG9jay11cCBsaWNlbnNlLCBvciBhbnkgb3RoZXIgcHJvYmxlbSB0aGF0IG1ha2VzIHlvdQordGhpbmsgdHdpY2UgYWJvdXQgc2hpcHBpbmcgdGhlbS4KKworV2UgZG9uJ3QgY2FsbCB0aGVtIHVnbHkgYmVjYXVzZSB3ZSBsaWtlIHRoZW0gbGVzcy4gIERvZXMgYSBtb3RoZXIgbG92ZSBoZXIKK3NvbiBsZXNzIGJlY2F1c2UgaGUncyBub3QgYXMgcHJldHR5IGFzIHRoZSBvdGhlciBvbmVzID8gTm8gIC0gc2hlIGNvbW1lbmRzCitoaW0gb24gaGlzIGdyZWF0IHBlcnNvbmFsaXR5LiAgVGhlc2UgcGx1Zy1pbnMgYXJlIHRoZSBsaWZlIG9mIHRoZSBwYXJ0eS4KK0FuZCB3ZSdsbCBzdGlsbCBzdGVwIGluIGFuZCBzZXQgdGhlbSBzdHJhaWdodCBpZiB5b3UgcmVwb3J0IGFueSB1bmFjY2VwdGFibGUKK2JlaGF2aW91ciAtIGJlY2F1c2UgdGhlcmUgYXJlIHR3byBraW5kcyBvZiBwZW9wbGUgaW4gdGhlIHdvcmxkLCBteSBmcmllbmQ6Cit0aG9zZSB3aXRoIGEgcm9wZSBhcm91bmQgdGhlaXIgbmVjayBhbmQgdGhlIHBlb3BsZSB3aG8gZG8gdGhlIGN1dHRpbmcuCisKKyAgVEhFIEJBRAorCisgIC0tLSAiVGhhdCBhbiBhY2N1c2F0aW9uPyIKKworTm8gcGVyZmVjdGx5IGdyb29tZWQgbW91c3RhY2hlIG9yIGFueSBhbW91bnQgb2YgZmluZSBjbG90aGluZyBpcyBnb2luZyB0bworY292ZXIgdXAgdGhlIHRydXRoIC0gdGhlc2UgcGx1Zy1pbnMgYXJlIEJhZCB3aXRoIGEgY2FwaXRhbCBCLiAKK1RoZXkgbG9vayBmaW5lIG9uIHRoZSBvdXRzaWRlLCBhbmQgbWlnaHQgZXZlbiBhcHBlYXIgdG8gZ2V0IHRoZSBqb2IgZG9uZSwgYnV0CithdCB0aGUgZW5kIG9mIHRoZSBkYXkgdGhleSdyZSBhIGJsYWNrIHNoZWVwLiBXaXRob3V0IGEgZ29sZGVuLWhhaXJlZCBhbmdlbAordG8gd2F0Y2ggb3ZlciB0aGVtLCB0aGV5J2xsIHByb2JhYmx5IGxhbmQgaW4gYW4gdW5tYXJrZWQgZ3JhdmUgYXQgdGhlIGZpbmFsCitzaG93ZG93bi4KKworRG9uJ3QgYnVnIHVzIGFib3V0IHRoZWlyIHF1YWxpdHkgLSBleGVyY2lzZSB5b3VyIEZyZWUgU29mdHdhcmUgcmlnaHRzLAorcGF0Y2ggdXAgdGhlIG9mZmVuZGVyIGFuZCBzZW5kIHVzIHRoZSBwYXRjaCBvbiB0aGUgZmFzdGVzdCBzdGVlZCB5b3UgY2FuCitzdGVhbCBmcm9tIHRoZSBDb25mZWRlcmF0ZXMuIEJlY2F1c2UgeW91IHNlZSwgaW4gdGhpcyB3b3JsZCwgdGhlcmUncyB0d28KK2tpbmRzIG9mIHBlb3BsZSwgbXkgZnJpZW5kOiB0aG9zZSB3aXRoIGxvYWRlZCBndW5zIGFuZCB0aG9zZSB3aG8gZGlnLgorWW91IGRpZy4KKworVGhlIExvd2Rvd24KKy0tLS0tLS0tLS0tCisKKyAgLS0tICJJJ3ZlIG5ldmVyIHNlZW4gc28gbWFueSBwbHVnLWlucyB3YXN0ZWQgc28gYmFkbHkuIgorCitHU3RyZWFtZXIgUGx1Zy1pbnMgaGFzIGdyb3duIHNvIGJpZyB0aGF0IGl0J3MgaGFyZCB0byBzZXBhcmF0ZSB0aGUgd2hlYXQgZnJvbQordGhlIGNoYWZmLiAgQWxzbywgZGlzdHJpYnV0b3JzIGhhdmUgYnJvdWdodCB1cCBpc3N1ZXMgYWJvdXQgdGhlIGxlZ2FsIHN0YXR1cworb2Ygc29tZSBvZiB0aGUgcGx1Zy1pbnMgd2Ugc2hpcC4gIFRvIHJlbWVkeSB0aGlzLCB3ZSd2ZSBkaXZpZGVkIHRoZSBwcmV2aW91cworc2V0IG9mIGF2YWlsYWJsZSBwbHVnLWlucyBpbnRvIGZvdXIgbW9kdWxlczoKKworLSBnc3QtcGx1Z2lucy1iYXNlOiBhIHNtYWxsIGFuZCBmaXhlZCBzZXQgb2YgcGx1Zy1pbnMsIGNvdmVyaW5nIGEgd2lkZSByYW5nZQorICBvZiBwb3NzaWJsZSB0eXBlcyBvZiBlbGVtZW50czsgdGhlc2UgYXJlIGNvbnRpbnVvdXNseSBrZXB0IHVwLXRvLWRhdGUKKyAgd2l0aCBhbnkgY29yZSBjaGFuZ2VzIGR1cmluZyB0aGUgZGV2ZWxvcG1lbnQgc2VyaWVzLgorCisgIC0gV2UgYmVsaWV2ZSBkaXN0cmlidXRvcnMgY2FuIHNhZmVseSBzaGlwIHRoZXNlIHBsdWctaW5zLgorICAtIFBlb3BsZSB3cml0aW5nIGVsZW1lbnRzIHNob3VsZCBiYXNlIHRoZWlyIGNvZGUgb24gdGhlc2UgZWxlbWVudHMuCisgIC0gVGhlc2UgZWxlbWVudHMgY29tZSB3aXRoIGV4YW1wbGVzLCBkb2N1bWVudGF0aW9uLCBhbmQgcmVncmVzc2lvbiB0ZXN0cy4KKworLSBnc3QtcGx1Z2lucy1nb29kOiBhIHNldCBvZiBwbHVnLWlucyB0aGF0IHdlIGNvbnNpZGVyIHRvIGhhdmUgZ29vZCBxdWFsaXR5CisgIGNvZGUsIGNvcnJlY3QgZnVuY3Rpb25hbGl0eSwgb3VyIHByZWZlcnJlZCBsaWNlbnNlIChMR1BMIGZvciB0aGUgcGx1Zy1pbgorICBjb2RlLCBMR1BMIG9yIExHUEwtY29tcGF0aWJsZSBmb3IgdGhlIHN1cHBvcnRpbmcgbGlicmFyeSkuCisKKyAgLSBXZSBiZWxpZXZlIGRpc3RyaWJ1dG9ycyBjYW4gc2FmZWx5IHNoaXAgdGhlc2UgcGx1Zy1pbnMuCisgIC0gUGVvcGxlIHdyaXRpbmcgZWxlbWVudHMgc2hvdWxkIGJhc2UgdGhlaXIgY29kZSBvbiB0aGVzZSBlbGVtZW50cy4KKyAKKy0gZ3N0LXBsdWdpbnMtdWdseTogYSBzZXQgb2YgcGx1Zy1pbnMgdGhhdCBoYXZlIGdvb2QgcXVhbGl0eSBhbmQgY29ycmVjdAorICBmdW5jdGlvbmFsaXR5LCBidXQgZGlzdHJpYnV0aW5nIHRoZW0gbWlnaHQgcG9zZSBwcm9ibGVtcy4gIFRoZSBsaWNlbnNlCisgIG9uIGVpdGhlciB0aGUgcGx1Zy1pbnMgb3IgdGhlIHN1cHBvcnRpbmcgbGlicmFyaWVzIG1pZ2h0IG5vdCBiZSBob3cgd2UnZAorICBsaWtlLiBUaGUgY29kZSBtaWdodCBiZSB3aWRlbHkga25vd24gdG8gcHJlc2VudCBwYXRlbnQgcHJvYmxlbXMuCisKKyAgLSBEaXN0cmlidXRvcnMgc2hvdWxkIGNoZWNrIGlmIHRoZXkgd2FudC9jYW4gc2hpcCB0aGVzZSBwbHVnLWlucy4KKyAgLSBQZW9wbGUgd3JpdGluZyBlbGVtZW50cyBzaG91bGQgYmFzZSB0aGVpciBjb2RlIG9uIHRoZXNlIGVsZW1lbnRzLgorCistIGdzdC1wbHVnaW5zLWJhZDogYSBzZXQgb2YgcGx1Zy1pbnMgdGhhdCBhcmVuJ3QgdXAgdG8gcGFyIGNvbXBhcmVkIHRvIHRoZQorICByZXN0LiAgVGhleSBtaWdodCBiZSBjbG9zZSB0byBiZWluZyBnb29kIHF1YWxpdHksIGJ1dCB0aGV5J3JlIG1pc3NpbmcKKyAgc29tZXRoaW5nIC0gYmUgaXQgYSBnb29kIGNvZGUgcmV2aWV3LCBzb21lIGRvY3VtZW50YXRpb24sIGEgc2V0IG9mIHRlc3RzLAorICBhIHJlYWwgbGl2ZSBtYWludGFpbmVyLCBvciBzb21lIGFjdHVhbCB3aWRlIHVzZS4KKyAgSWYgdGhlIGJsYW5rcyBhcmUgZmlsbGVkIGluIHRoZXkgbWlnaHQgYmUgdXBncmFkZWQgdG8gYmVjb21lIHBhcnQgb2YKKyAgZWl0aGVyIGdzdC1wbHVnaW5zLWdvb2Qgb3IgZ3N0LXBsdWdpbnMtdWdseSwgZGVwZW5kaW5nIG9uIHRoZSBvdGhlciBmYWN0b3JzLgorCisgIC0gSWYgdGhlIHBsdWctaW5zIGJyZWFrLCB5b3UgY2FuJ3QgY29tcGxhaW4gLSBpbnN0ZWFkLCB5b3UgY2FuIGZpeCB0aGUKKyAgICBwcm9ibGVtIGFuZCBzZW5kIHVzIGEgcGF0Y2gsIG9yIGJyaWJlIHNvbWVvbmUgaW50byBmaXhpbmcgdGhlbSBmb3IgeW91LgorICAtIE5ldyBjb250cmlidXRvcnMgY2FuIHN0YXJ0IGhlcmUgZm9yIHRoaW5ncyB0byB3b3JrIG9uLgorCitQTEFURk9STVMKKy0tLS0tLS0tLQorCistIExpbnV4IGlzIG9mIGNvdXJzZSBmdWxseSBzdXBwb3J0ZWQKKy0gRnJlZUJTRCBpcyByZXBvcnRlZCB0byB3b3JrOyBvdGhlciBCU0RzIHNob3VsZCB3b3JrIHRvbworLSBTb2xhcmlzIGlzIHJlcG9ydGVkIHRvIHdvcms7IGEgc3BlY2lmaWMgc3VuYXVkaW9zaW5rIHBsdWdpbiBoYXMgYmVlbiB3cml0dGVuCistIE1hY09TWCB3b3JrcywgYmluYXJ5IDEueCBwYWNrYWdlcyBjYW4gYmUgYnVpbHQgdXNpbmcgdGhlIGNlcmJlcm8gYnVpbGQgdG9vbAorLSBXaW5kb3dzIHdvcmtzOyBiaW5hcnkgMS54IHBhY2thZ2VzIGNhbiBiZSBidWlsdCB1c2luZyB0aGUgY2VyYmVybyBidWlsZCB0b29sCisgIC0gTVN5cy9NaW5HVyBidWlsZHMKKyAgLSBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBidWlsZHMgYXJlIG5vdCB5ZXQgYXZhaWxhYmxlIG9yIHN1cHBvcnRlZAorLSBBbmRyb2lkIHdvcmtzLCBiaW5hcnkgMS54IHBhY2thZ2VzIGNhbiBiZSBidWlsdCB1c2luZyB0aGUgY2VyYmVybyBidWlsZCB0b29sCistIGlPUyB3b3JrcworCitJTlNUQUxMSU5HIEZST00gUEFDS0FHRVMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3Ugc2hvdWxkIGFsd2F5cyBwcmVmZXIgaW5zdGFsbGluZyBmcm9tIHBhY2thZ2VzIGZpcnN0LiAgR1N0cmVhbWVyIGlzCit3ZWxsLW1haW50YWluZWQgZm9yIGEgbnVtYmVyIG9mIGRpc3RyaWJ1dGlvbnMsIGluY2x1ZGluZyBGZWRvcmEsIERlYmlhbiwKK1VidW50dSwgTWFuZHJha2UsIEdlbnRvbywgLi4uCisKK09ubHkgaW4gY2FzZXMgd2hlcmUgeW91OgorLSB3YW50IHRvIGhhY2sgb24gR1N0cmVhbWVyCistIHdhbnQgdG8gdmVyaWZ5IHRoYXQgYSBidWcgaGFzIGJlZW4gZml4ZWQKKy0gZG8gbm90IGhhdmUgYSBzYW5lIGRpc3RyaWJ1dGlvbgorc2hvdWxkIHlvdSBjaG9vc2UgdG8gYnVpbGQgZnJvbSBzb3VyY2UgdGFyYmFsbHMgb3IgZ2l0LgorCitGaW5kIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZhcmlvdXMgcGFja2FnZXMgYXQKK2h0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2Rvd25sb2FkLworCitDT01QSUxJTkcgRlJPTSBTT1VSQ0UgVEFSQkFMTFMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIGFnYWluLCBtYWtlIHN1cmUgdGhhdCB5b3UgcmVhbGx5IG5lZWQgdG8gaW5zdGFsbCBmcm9tIHNvdXJjZSAhCisgIElmIEdTdHJlYW1lciBpcyBvbmUgb2YgeW91ciBmaXJzdCBwcm9qZWN0cyBldmVyIHRoYXQgeW91IGJ1aWxkIGZyb20gc291cmNlLAorICBjb25zaWRlciB0YWtpbmcgb24gYW4gZWFzaWVyIHByb2plY3QuCisKKy0gY2hlY2sgb3V0cHV0IG9mIC4vY29uZmlndXJlIC0taGVscCB0byBzZWUgaWYgYW55IG9wdGlvbnMgYXBwbHkgdG8geW91CistIHJ1bgorICAuL2NvbmZpZ3VyZQorICBtYWtlCisKKyAgdG8gYnVpbGQgR1N0cmVhbWVyLgorLSBpZiB5b3Ugd2FudCB0byBpbnN0YWxsIGl0IChub3QgcmVxdWlyZWQsIGJ1dCB3aGF0IHlvdSB1c3VhbGx5IHdhbnQgdG8gZG8pLCBydW4KKyAgbWFrZSBpbnN0YWxsCisKKy0gdHJ5IG91dCBhIHNpbXBsZSB0ZXN0OgorICBnc3QtbGF1bmNoIC12IGZha2VzcmMgbnVtX2J1ZmZlcnM9NSAhIGZha2VzaW5rCisgIChJZiB5b3UgZGlkbid0IGluc3RhbGwgR1N0cmVhbWVyLCBwcmVmaXggZ3N0LWxhdW5jaCB3aXRoIHRvb2xzLykKKworICBJZiBpdCBvdXRwdXRzIGEgYnVuY2ggb2YgbWVzc2FnZXMgZnJvbSBmYWtlc3JjIGFuZCBmYWtlc2luaywgZXZlcnl0aGluZyBpcworICBvay4KKworICBJZiBpdCBkaWQgbm90IHdvcmssIGtlZXAgaW4gbWluZCB0aGF0IHlvdSBtaWdodCBuZWVkIHRvIGFkanVzdCB0aGUKKyAgUEFUSCBhbmQvb3IgTERfTElCUkFSWV9QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBtYWtlIHRoZSBzeXN0ZW0KKyAgZmluZCBHU3RyZWFtZXIgaW4gdGhlIHByZWZpeCB3aGVyZSB5b3UgaW5zdGFsbGVkIChieSBkZWZhdWx0IHRoYXQgaXMgL3Vzci9sb2NhbCkuCisKKy0gQWZ0ZXIgdGhpcywgeW91J3JlIHJlYWR5IHRvIGluc3RhbGwgZ3N0LXBsdWdpbnMsIHdoaWNoIHdpbGwgcHJvdmlkZSB0aGUKKyAgZnVuY3Rpb25hbGl0eSB5b3UncmUgcHJvYmFibHkgbG9va2luZyBmb3IgYnkgbm93LCBzbyBnbyBvbiBhbmQgcmVhZAorICB0aGF0IFJFQURNRS4KKworQ09NUElMSU5HIEZST00gR0lUCistLS0tLS0tLS0tLS0tLS0tLS0KKworV2hlbiBidWlsZGluZyBmcm9tIGdpdCBzb3VyY2VzLCB5b3Ugd2lsbCBuZWVkIHRvIHJ1biBhdXRvZ2VuLnNoIHRvIGdlbmVyYXRlCit0aGUgYnVpbGQgc3lzdGVtIGZpbGVzLgorCitZb3Ugd2lsbCBuZWVkIGEgc2V0IG9mIGFkZGl0aW9uYWwgdG9vbHMgdHlwaWNhbCBmb3IgYnVpbGRpbmcgZnJvbSBnaXQsCitpbmNsdWRpbmc6CistIGF1dG9jb25mCistIGF1dG9tYWtlCistIGxpYnRvb2wKKworYXV0b2dlbi5zaCB3aWxsIGNoZWNrIGZvciByZWNlbnQgZW5vdWdoIHZlcnNpb25zIGFuZCBjb21wbGFpbiBpZiB5b3UgZG9uJ3QgaGF2ZQordGhlbS4gIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IHNwZWNpZmljIHZlcnNpb25zIG9mIGF1dG9tYWtlIGFuZCBhdXRvY29uZiB3aXRoCistLXdpdGgtYXV0b21ha2UgYW5kIC0td2l0aC1hdXRvY29uZgorCitDaGVjayBhdXRvZ2VuLnNoIG9wdGlvbnMgYnkgcnVubmluZyBhdXRvZ2VuLnNoIC0taGVscAorCithdXRvZ2VuLnNoIGNhbiBwYXNzIG9uIGFyZ3VtZW50cyB0byBjb25maWd1cmUKKworV2hlbiB5b3UgaGF2ZSBkb25lIHRoaXMgb25jZSwgeW91IGNhbiB1c2UgYXV0b3JlZ2VuLnNoIHRvIHJlLWF1dG9nZW4gd2l0aAordGhlIGxhc3QgcGFzc2VkIG9wdGlvbnMgYXMgYSBoYW5keSBzaG9ydGN1dC4gIFVzZSBpdC4KKworQWZ0ZXIgdGhlIGF1dG9nZW4uc2ggc3RhZ2UsIHlvdSBjYW4gZm9sbG93IHRoZSBkaXJlY3Rpb25zIGxpc3RlZCBpbgorIkNPTVBJTElORyBGUk9NIFNPVVJDRSIKKworWW91IGNhbiBhbHNvIHJ1biB5b3VyIHdob2xlIGdpdCBzdGFjayB1bmluc3RhbGxlZCBpbiB5b3VyIGhvbWUgZGlyZWN0b3J5LAorc28gdGhhdCB5b3UgY2FuIHF1aWNrbHkgdGVzdCBjaGFuZ2VzIHdpdGhvdXQgYWZmZWN0aW5nIHlvdXIgc3lzdGVtIHNldHVwIG9yCitpbnRlcmZlcmluZyB3aXRoIEdTdHJlYW1lciBpbnN0YWxsZWQgZnJvbSBwYWNrYWdlcy4gIE1hbnkgR1N0cmVhbWVyIGRldmVsb3BlcnMKK3VzZSBhbiB1bmluc3RhbGxlZCBzZXR1cCBmb3IgdGhlaXIgd29yay4KKworVGhlcmUgaXMgYSAnY3JlYXRlLXVuaW5zdGFsbGVkLXNldHVwLnNoJyBzY3JpcHQgaW4KKworICBodHRwOi8vY2dpdC5mcmVlZGVza3RvcC5vcmcvZ3N0cmVhbWVyL2dzdHJlYW1lci90cmVlL3NjcmlwdHMvCisKK3RvIGVhc2lseSBjcmVhdGUgYW4gdW5pbnN0YWxsZWQgc2V0dXAgZnJvbSBzY3JhdGNoLgorCisKK1BMVUctSU4gREVQRU5ERU5DSUVTIEFORCBMSUNFTlNFUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0dTdHJlYW1lciBpcyBkZXZlbG9wZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBMR1BMIChzZWUgTElDRU5TRSBmaWxlIGZvcgorZGV0YWlscykuIFNvbWUgb2Ygb3VyIHBsdWctaW5zIGhvd2V2ZXIgcmVseSBvbiBsaWJyYXJpZXMgd2hpY2ggYXJlIGF2YWlsYWJsZQordW5kZXIgb3RoZXIgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgYXJlIGRpc3RyaWJ1dGluZyBhbiBhcHBsaWNhdGlvbgord2hpY2ggaGFzIGEgbm9uLUdQTCBjb21wYXRpYmxlIGxpY2Vuc2UgKGZvciBpbnN0YW5jZSBhIGNsb3NlZC1zb3VyY2UKK2FwcGxpY2F0aW9uKSB3aXRoIEdTdHJlYW1lciwgeW91IGhhdmUgdG8gbWFrZSBzdXJlIG5vdCB0byBkaXN0cmlidXRlIEdQTC1saW5rZWQKK3BsdWctaW5zLgorCitXaGVuIHVzaW5nIEdQTC1saW5rZWQgcGx1Zy1pbnMsIEdTdHJlYW1lciBpcyBmb3IgYWxsIHByYWN0aWNhbCByZWFzb25zCit1bmRlciB0aGUgR1BMIGl0c2VsZi4KKworSElTVE9SWQorLS0tLS0tLQorCitUaGUgZnVuZGFtZW50YWwgZGVzaWduIGNvbWVzIGZyb20gdGhlIHZpZGVvIHBpcGVsaW5lIGF0IE9yZWdvbiBHcmFkdWF0ZQorSW5zdGl0dXRlLCBhcyB3ZWxsIGFzIHNvbWUgaWRlYXMgZnJvbSBEaXJlY3RNZWRpYS4gIEl0J3MgYmFzZWQgb24gcGx1Zy1pbnMgdGhhdAord2lsbCBwcm92aWRlIHRoZSB2YXJpb3VzIGNvZGVjIGFuZCBvdGhlciBmdW5jdGlvbmFsaXR5LiAgVGhlIGludGVyZmFjZQoraG9wZWZ1bGx5IGlzIGdlbmVyaWMgZW5vdWdoIGZvciB2YXJpb3VzIGNvbXBhbmllcyAoYWhlbSwgQXBwbGUpIHRvIHJlbGVhc2UKK2JpbmFyeSBjb2RlY3MgZm9yIExpbnV4LCB1bnRpbCBzdWNoIHRpbWUgYXMgdGhleSBnZXQgYSBjbHVlIGFuZCByZWxlYXNlIHRoZQorc291cmNlLgpkaWZmIC0tZ2l0IGEvUkVBRE1FLnN0YXRpYy1saW5raW5nIGIvUkVBRE1FLnN0YXRpYy1saW5raW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkODI5OWIKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUuc3RhdGljLWxpbmtpbmcKQEAgLTAsMCArMSwxNzQgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIEdTdHJlYW1lciBTdGF0aWMgTGlua2luZyBSRUFETUUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitEUkFGVCwgQXByaWwgMjAxMworCisKKyAgIEkuIElOVFJPRFVDVElPTgorCitJdCBpcyBwb3NzaWJsZSB0byBsaW5rIEdTdHJlYW1lciBsaWJyYXJpZXMsIHBsdWdpbnMgYW5kIGFwcGxpY2F0aW9ucworc3RhdGljYWxseSwgYm90aCBpbiBjYXNlIG9mIGZyZWUvbGlicmUvb3Blbi1zb3VyY2Ugc29mdHdhcmUgYXBwbGljYXRpb25zCithbmQgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zLiBPbiBzb21lIHBsYXRmb3JtcyBzdGF0aWMgbGlua2luZyBtYXkgZXZlbgorYmUgcmVxdWlyZWQuCisKK0hvd2V2ZXIsIGRpc3RyaWJ1dGluZyBzdGF0aWNhbGx5IGxpbmtlZCBiaW5hcmllcyB1c2luZyBHU3RyZWFtZXIgdXN1YWxseQorcmVxdWlyZXMgYWRkaXRpb25hbCBlZmZvcnQgdG8gc3RheSBjb21wbGlhbnQgd2l0aCB0aGUgR05VIExHUEwgdjIuMSBsaWNlbnNlLgorCitUaGUgcHVycG9zZSBvZiB0aGlzIGRvY3VtZW50IGlzIHRvIGRyYXcgYXR0ZW50aW9uIHRvIHRoaXMgZmFjdCwgYW5kIHRvCitzdW1tYXJpc2UgaW4gbGF5bWFuJ3MgdGVybXMgd2hhdCB3ZSBiZWxpZXZlIGlzIHJlcXVpcmVkIGZyb20gYW55b25lCitkaXN0cmlidXRpbmcgc3RhdGljYWxseSBsaW5rZWQgR1N0cmVhbWVyIGJpbmFyaWVzLiBNb3N0IG9mIHRoaXMgYWxzbworYXBwbGllcyB0byBkeW5hbWljYWxseSBsaW5rZWQgR1N0cmVhbWVyIGJpbmFyaWVzLgorCisKKyAgIElJLiBESVNDTEFJTUVSCisKK1RoaXMgZG9jdW1lbnQgaXMgbm90IGxlZ2FsIGFkdmljZSwgbm9yIGlzIGl0IGNvbXByZWhlbnNpdmUuIEl0IG1heSB1c2UKK3dvcmRzIGluIHdheXMgdGhhdCBkbyBub3QgbWF0Y2ggdGhlIGRlZmluaXRpb24gb3IgdXNlIGluIHRoZSBsaWNlbnNlCit0ZXh0LiBJdCBtYXkgZXZlbiBiZSBvdXRyaWdodCB3cm9uZy4gUmVhZCB0aGUgbGljZW5zZSB0ZXh0IGZvciBhbGwgdGhlCitkZXRhaWxzLCBpdCBpcyB0aGUgb25seSBsZWdhbGx5IGJpbmRpbmcgZG9jdW1lbnQgaW4gdGhpcyByZXNwZWN0LgorCitUaGlzIGRvY3VtZW50IGlzIHByaW1hcmlseSBjb25jZXJuZWQgd2l0aCB0aGUgaW1wbGljYXRpb25zIGZvciB0aGUKK2Rpc3RyaWJ1dGlvbiBvZiBiaW5hcmllcyBiYXNlZCBvbiBMR1BMLWxpY2Vuc2VkIHNvZnR3YXJlIGFzIGltcG9zZWQgYnkKK3RoZSBMR1BMIGxpY2Vuc2UsIGJ1dCB0aGVyZSBtYXkgYmUgb3RoZXIgcmVzdHJpY3Rpb25zIHRvIHRoZSBkaXN0cmlidXRpb24KK29mIHN1Y2ggYmluYXJpZXMsIHN1Y2ggYXMgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGNoYW5uZWxzCisoZS5nLiAiYXBwIHN0b3JlcyIpLgorCisKKyAgIElJSS4gVEhFIFNQSVJJVCBPRiBUSEUgTEdQTCBMSUNFTlNFCisKK1RoZSBHTlUgTEdQTCB2Mi4xIGxpY2Vuc2UgYWxsb3dzIHVzZSBvZiBzdWNoLWxpY2Vuc2VkIHNvZnR3YXJlIGJ5Citwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMsIGJ1dCBzdGlsbCBhaW1zIHRvIGVuc3VyZSB0aGF0IGF0IGxlYXN0IHRoZQorTEdQTC1saWNlbnNlZCBzb2Z0d2FyZSBwYXJ0cyByZW1haW4gZnJlZSB1bmRlciBhbGwgY2lyY3Vtc3RhbmNlcy4gVGhpcworbWVhbnMgYW55IGNoYW5nZXMgdG8gTEdQTC1saWNlbnNlZCBzb3VyY2UgY29kZSBtdXN0IGJlIGRvY3VtZW50ZWQgYW5kCitiZSBtYWRlIGF2YWlsYWJsZSBvbiByZXF1ZXN0IHRvIHRob3NlIHdobyByZWNlaXZlZCBiaW5hcmllcyBvZiB0aGUKK3NvZnR3YXJlLiBJdCBhbHNvIG1lYW5zIHRoYXQgaXQgbXVzdCBiZSBwb3NzaWJsZSB0byBtYWtlIGNoYW5nZXMgdG8gdGhlCitMR1BMLWxpY2Vuc2VkIHNvZnR3YXJlIHBhcnRzIGFuZCBtYWtlIHRoZSBhcHBsaWNhdGlvbiB1c2UgdGhvc2UsIGFzIGZhcgorYXMgdGhhdCBpcyBwb3NzaWJsZS4gQW5kIHRoYXQgcmVjaXBpZW50cyBvZiBhbiBhcHBsaWNhdGlvbiB1c2luZworTEdQTC1saWNlbnNlZCBzb2Z0d2FyZSBhcmUgbWFkZSBhd2FyZSBvZiB0aGVpciByaWdodHMgYWNjb3JkaW5nIHRvIHRoZQorTEdQTCBsaWNlbnNlLgorCitJbiBhbiBlbnZpcm9ubWVudCB3aGVyZSBHU3RyZWFtZXIgbGlicmFyaWVzIGFuZCBwbHVnaW5zIGFyZSB1c2VkIGFzCitkeW5hbWljYWxseS1sb2FkZWQgc2hhcmVkIG9iamVjdHMgKERMTC8uc28vLmR5biBmaWxlcyksIHRoaXMgaXMgdXN1YWxseQorbm90IGEgYmlnIHByb2JsZW0sIGJlY2F1c2UgaXQgaXMgZmFpcmx5IGVhc3kgdG8gY29tcGlsZSBhIG1vZGlmaWVkIHZlcnNpb24KK29mIHRoZSBHU3RyZWFtZXIgbGlicmFyaWVzIG9yIExHUEwgcGx1Z2lucywgYW5kIHRoZSBhcHBsaWNhdGlvbiB3aWxsL3Nob3VsZAoranVzdCBwaWNrIHVwIGFuZCB1c2UgdGhlIG1vZGlmaWVkIHZlcnNpb24gYXV0b21hdGljYWxseS4gQWxsIHRoYXQgaXMgbmVlZGVkCitpcyBmb3IgdGhlIG9yaWdpbmFsLCBMR1BMLWxpY2Vuc2VkIHNvdXJjZSBjb2RlIGFuZCBzb3VyY2UgY29kZSBtb2RpZmljYXRpb25zCit0byBiZSBtYWRlIGF2YWlsYWJsZSwgYW5kIGZvciBhIHdheSB0byBidWlsZCB0aGUgbGlicmFyaWVzIG9yIHBsdWdpbnMgZm9yCit0aGUgcGxhdGZvcm0gcmVxdWlyZWQgKHVzdWFsbHkgdGhhdCB3aWxsIGJlIHVzaW5nIHRoZSBidWlsZCBzeXN0ZW0gc2NyaXB0cwordGhhdCBjb21lIHdpdGggR1N0cmVhbWVyLCBhbmQgdXNpbmcgdGhlIHR5cGljYWwgYnVpbGQgZW52aXJvbm1lbnQgb24gdGhlCitzeXN0ZW0gaW4gcXVlc3Rpb24sIGJ1dCB3aGVyZSB0aGF0IGlzIG5vdCB0aGUgY2FzZSB0aGUgbmVlZGVkIGJ1aWxkIHNjcmlwdHMKK2FuZC9vciB0b29scyB3b3VsZCBuZWVkIHRvIGJlIHByb3ZpZGVkIGFzIHdlbGwpLgorCisKKyAgIElWLiBUSElOR1MgWU9VIE5FRUQgVE8gRE8KKworICAqIFlvdSBtdXN0IHRlbGwgdXNlcnMgb2YgeW91ciBhcHBsaWNhdGlvbiB0aGF0IHlvdSBhcmUgdXNpbmcgTEdQTC1saWNlbnNlZAorICAgIHNvZnR3YXJlLCB3aGljaCBMR1BMLWxpY2Vuc2VkIHNvZnR3YXJlIGV4YWN0bHksIGFuZCB5b3UgbXVzdCBwcm92aWRlIHRoZW0KKyAgICB3aXRoIGEgY29weSBvZiB0aGUgbGljZW5zZSBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzIHVuZGVyIHRoZSBMR1BMLgorCisgICogWW91IG11c3QgcHJvdmlkZSAob24gcmVxdWVzdCkgYWxsIHRoZSBzb3VyY2UgY29kZSBhbmQgYWxsIHRoZSBjaGFuZ2VzCisgICAgb3IgYWRkaXRpb25zIHlvdSBoYXZlIG1hZGUgdG8gdGhlIExHUEwtbGljZW5zZWQgc29mdHdhcmUgeW91IGFyZSB1c2luZy4KKworICAgIEZvciBHU3RyZWFtZXIgY29kZSB3ZSB3b3VsZCByZWNvbW1lbmQgdGhhdCB0aGUgY2hhbmdlcyBiZSBwcm92aWRlZCBlaXRoZXIKKyAgICBpbiBmb3JtIG9mIGEgYnJhbmNoIGluIGEgZ2l0IHJlcG9zaXRvcnksIG9yIGFzIGEgc2V0IG9mICJnaXQgZm9ybWF0LXBhdGNoIi0KKyAgICBzdHlsZSBwYXRjaGVzIGFnYWluc3QgYSBHU3RyZWFtZXIgcmVsZWFzZSBvciBhIHNuYXBzaG90IG9mIGEgR1N0cmVhbWVyIGdpdAorICAgIHJlcG9zaXRvcnkuIFRoZSBwYXRjaGVzIHNob3VsZCBpZGVhbGx5IHNheSB3aGF0IHdhcyBjaGFuZ2VkIGFuZCB3aHkgaXQKKyAgICB3YXMgY2hhbmdlZCwgYW5kIHRoZXJlIHNob3VsZCBpZGVhbGx5IGJlIHNlcGFyYXRlIHBhdGNoZXMgZm9yIGluZGVwZW5kZW50CisgICAgY2hhbmdlcy4KKworICAqIFlvdSBtdXN0IHByb3ZpZGUgYSB3YXkgZm9yIHVzZXJzIG9mIHlvdXIgYXBwbGljYXRpb24gdG8gbWFrZSBjaGFuZ2VzIHRvCisgICAgdGhlIExHUEwtbGljZW5zZWQgcGFydHMgb2YgdGhlIGNvZGUsIGFuZCByZS1jcmVhdGUgYSBmdWxsIGFwcGxpY2F0aW9uCisgICAgYmluYXJ5IHdpdGggdGhlIGNoYW5nZXMgKHVzaW5nIHRoZSBzdGFuZGFyZCB0b29sY2hhaW4gYW5kIHRvb2xzIG9mIHRoZQorICAgIHRhcmdldCBwbGF0Zm9ybTsgaWYgeW91IGFyZSB1c2luZyBhIGN1c3RvbSB0b29sY2hhaW4gb3IgY3VzdG9tIHRvb2xzCisgICAgeW91IG11c3QgcHJvdmlkZSB0aGVzZSBhbmQgZG9jdW1lbnQgaG93IHRvIHVzZSB0aGVtIHRvIGNyZWF0ZSBhIG5ldworICAgIGFwcGxpY2F0aW9uIGJpbmFyeSkuCisKKyAgICBOb3RlIHRoYXQgdGhpcyBvZiBjb3Vyc2UgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSB1c2VyIGlzIGFsbG93ZWQgdG8KKyAgICByZS1kaXN0cmlidXRlIHRoZSBjaGFuZ2VkIGFwcGxpY2F0aW9uLiBOb3IgZG9lcyBpdCBtZWFuIHRoYXQgeW91IGhhdmUKKyAgICB0byBwcm92aWRlIHlvdXIgcHJvcHJpZXRhcnkgc291cmNlIGNvZGUgLSBpdCBpcyBzdWZmaWNpZW50IHRvIHByb3ZpZGUgYQorICAgIHJlYWR5LW1hZGUgY29tcGlsZWQgb2JqZWN0IGZpbGUgdGhhdCBjYW4gYmUgcmVsaW5rZWQgaW50byBhbiBhcHBsaWNhdGlvbgorICAgIGJpbmFyeSB3aXRoIHRoZSByZS1jb21waWxlZCBMR1BMIGNvbXBvbmVudHMuCisKKworICAgVi4gVEhJTkdTIFRPIExPT0sgT1VUIEZPUgorCitXaGlsZSBtb3N0IEdTdHJlYW1lciBwbHVnaW5zIGFuZCB0aGUgbGlicmFyaWVzIHRoZXkgZGVwZW5kIG9uIGFyZSBsaWNlbnNlZAordW5kZXIgdGhlIExHUEwgb3IgZXZlbiBtb3JlIHBlcm1pc3NpdmUgbGljZW5zZXMsIHRoYXQgaXMgbm90IHRoZSBjYXNlIGZvcgorYWxsIHBsdWdpbnMgYW5kIGxpYnJhcmllcyB1c2VkLCBlc3AuIHRob3NlIGluIHRoZSBnc3QtcGx1Z2lucy11Z2x5IG9yCitzb21lIG9mIHRob3NlIGluIHRoZSBnc3QtcGx1Z2lucy1iYWQgc2V0IG9mIHBsdWdpbnMuCisKK1doZW4gc3RhdGljYWxseSBsaW5raW5nIHByb3ByaWV0YXJ5IGNvZGUsIGNhcmUgbXVzdCBiZSB0YWtlbiBub3QgdG8KK3N0YXRpY2FsbHkgbGluayBwbHVnaW5zIG9yIGxpYnJhcmllcyB0aGF0IGFyZSBsaWNlbnNlZCB1bmRlciBsZXNzIHBlcm1pc3NpdmUKK3Rlcm1zIHRoYW4gdGhlIExHUEwsIHN1Y2ggYXMgZS5nLiBHUEwtbGljZW5zZWQgbGlicmFyaWVzLgorCisKKyAgIFZJLiBTUEVDSUFMIENPTlNJREVSQVRJT05TIEZPUiBTUEVDSUZJQyBVU0UtQ0FTRVMKKworCisgICAxLiBQcm9wcmlldGFyeSBHU3RyZWFtZXIvR0xpYi1iYXNlZCBBcHBsaWNhdGlvbiBPbiBpT1MKKworTGV0J3MgYXNzdW1lIGFuIGluZGl2aWR1YWwgb3IgYSBjb21wYW55IHdhbnRzIHRvIGRpc3RyaWJ1dGUgYSBwcm9wcmlldGFyeQoraU9TIGFwcGxpY2F0aW9uIHRoYXQgaXMgYnVpbHQgb24gdG9wIG9mIEdTdHJlYW1lciBhbmQgR0xpYiB0aHJvdWdoCitBcHBsZSdzIEFwcCBTdG9yZS4gQXQgdGhlIHRpbWUgb2Ygd3JpdGluZyB0aGUgQXBwbGUgaVBob25lIGRldmVsb3BlcgorYWdyZWVtZW50IGRpZG7igJl0IGFsbG93IHRoZSBidW5kbGluZyBvZiBzaGFyZWQgbGlicmFyaWVzLCBzbyBkaXN0cmlidXRpbmcKK2EgcHJvcHJpZXRhcnkgaU9TIGFwcGxpY2F0aW9uIHdpdGggc2hhcmVkIGxpYnJhcmllcyBpcyBvbmx5IHBvc3NpYmxlIHVzaW5nCitkaXN0cmlidXRpb24gbWVjaGFuaXNtcyBvdXRzaWRlIG9mIHRoZSBBcHAgU3RvcmUgYW5kL29yIG9ubHkgdG8gamFpbGJyb2tlbgorZGV2aWNlcywgYSBwcm9zcGVjdCB0aGF0IG1heSBub3QgYXBwZWFsIHRvIG91ciBpbmRpdmlkdWFsIG9yIGNvbXBhbnkuIFNvIHRoZQorb25seSBhbHRlcm5hdGl2ZSB0aGVuIGlzIHRvIGxpbmsgZXZlcnl0aGluZyBzdGF0aWNhbGx5LCB3aGljaCBtZWFucyB0aGUKK29ibGlnYXRpb25zIG1lbnRpb25lZCBhYm92ZSBjb21lIGludG8gcGxheS4KKworCisgICAyLiBFeGFtcGxlOiBKYWJiZXIgb24gaU9TCisKK1RhbmRiZXJnIChub3cgQ2lzY28pIGNyZWF0ZWQgYSBKYWJiZXIgYXBwbGljYXRpb24gZm9yIGlPUywgYmFzZWQgb24gR1N0cmVhbWVyLgorT24gcmVxdWVzdCB0aGV5IHByb3ZpZGVkIGFuIExHUEwgY29tcGxpYW5jZSBidW5kbGUgaW4gZm9ybSBvZiBhIHppcCBmaWxlLCB3aXRoCityb3VnaGx5IHRoZSBmb2xsb3dpbmcgY29udGVudHM6CisKK2J1aWxkYXBwLnNoCityZWFkbWUudHh0CitKYWJiZXIvSmFiYmVyLUluZm8ucGxpc3QKK0phYmJlci9saWJpcC5hIFsyMzZNQiBiaW5hcnkgd2l0aCBwcm9wcmlldGFyeSBjb2RlXQorSmFiYmVyL21haW4ubW0KK0phYmJlci94Y2NvbmZpZy9BcHBsaWNhdGlvbi54Y2NvbmZpZworSmFiYmVyL3hjY29uZmlnL0RlYnVnLnhjY29uZmlnCitKYWJiZXIveGNjb25maWcvUmVsZWFzZS54Y2NvbmZpZworSmFiYmVyL3hjY29uZmlnL1NoYXJlZC54Y2NvbmZpZworSmFiYmVyL1Jlc291cmNlcy8qLmxwcm9qL0xvY2FsaXphYmxlLnN0cmluZ3MKK0phYmJlci9SZXNvdXJjZXMve0ltYWdlcyxBdWRpbyxTb3VuZHMsSUIsTWVzc2FnZSBTdHlsZXMsRW1vdGljb25zLEZvbnRzfS8qCitKYWJiZXIvUmVzb3VyY2VzLyoKK0phYmJlci54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCitKYWJiZXIueGNvZGVwcm9qL3Byb2plY3QueGN3b3Jrc3BhY2UvY29udGVudHMueGN3b3Jrc3BhY2VkYXRhCitvcGVuc291cmNlL2J1aWxkL2NvbmZpZy5zaXRlCitvcGVuc291cmNlL2J1aWxkL200L21vdmkubTQKK29wZW5zb3VyY2UvYnVpbGQvc2NyaXB0cy9jbGVhbi1kZXBzLnNoCitvcGVuc291cmNlL2J1aWxkL3NjcmlwdHMvZml4dXAtbWFrZWZpbGUuc2gKK29wZW5zb3VyY2UvYnVpbGQvc2NyaXB0cy9Nb3ZpTWFrZXIucHkKK29wZW5zb3VyY2UvYnVpbGQuc2gKK29wZW5zb3VyY2UvZW52LnNoCitvcGVuc291cmNlL01ha2VmaWxlCitvcGVuc291cmNlL2V4dGVybmFsL2dsaWIvKgorb3BlbnNvdXJjZS9leHRlcm5hbC9nc3RyZWFtZXIve2dzdHJlYW1lcixnc3QtcGx1Z2lucy0qfS8qCitvcGVuc291cmNlL2V4dGVybmFsL29wZW5zc2wvKgorb3BlbnNvdXJjZS9leHRlcm5hbC9wcm94eS1saWJpbnRsLyoKK29wZW5zb3VyY2UvdG9vbGNoYWluL2Rhcndpbi14ODYvYmluL3ttaXNjIGF1dG90b29vbHMsbTQsZ2xpYi1ta2VudW1zLGdsaWItZ2VubWFyc2hhbCxsaWJ0b29sLHBrZy1jb25maWcsZXRjLn0KK29wZW5zb3VyY2UvdG9vbGNoYWluL2Rhcndpbi14ODYvc2hhcmUve2FjbG9jYWwsYWNsb2NhbC0xLjExLGF1dG9jb25mLGF1dG9tYWtlLTEuMTEsbGlidG9vbH0vKgorb3BlbnNvdXJjZS90b29sY2hhaW4vZGFyd2luLXg4Ni9zaGFyZS9Db25maWcucG0KK29wZW5zb3VyY2UvdG9vbGNoYWluL2Rhcndpbi14ODYvc2hhcmUvQ29uZmlnLnBtLm1vdmkuaW4KK3BhdGNoZXMvZ2xpYi9nbGliLnBhdGNoCitwYXRjaGVzL2dzdC1wbHVnaW5zLWJhZC9nc3QtcGx1Z2lucy1iYWQucGF0Y2gKK3BhdGNoZXMvZ3N0LXBsdWdpbnMtYmFzZS9nc3QtcGx1Z2lucy1iYXNlLnBhdGNoCitwYXRjaGVzL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC5wYXRjaAorcGF0Y2hlcy9nc3RyZWFtZXIvZ3N0cmVhbWVyLnBhdGNoCitwYXRjaGVzL29wZW5zc2wvb3BlbnNzbC5wYXRjaAorCityZWFkbWUudHh0IHN0YXJ0cyB3aXRoICJUaGlzIFJlYWRtZSBmaWxlIGRlc2NyaWJlcyBob3cgdG8gYnVpbGQgdGhlIENpc2NvIAorSmFiYmVyIGZvciBpUGFkIGFwcGxpY2F0aW9uLiBZb3UgbmVlZCB0byBpbnN0YWxsIFhjb2RlLCBidXQgdGhlIGZpbmFsIHBhY2thZ2UKK2lzIGJ1aWx0IGJ5IHJ1bm5pbmcgYnVpbGRhcHAuc2guIiBhbmQgZGVzY3JpYmVzIGhvdyB0byBidWlsZCBwcm9qZWN0LAorcHJlcmVxdWlzaXRlcywgdGhlIHByb2NlZHVyZSBpbiBkZXRhaWwsIGFuZCBhICJIb3cgdG8gSW5jbHVkZSBQcm92aXNpb25pbmcKK1Byb2ZpbGUgTWFudWFsbHkgLyBBbHRlcm5hdGUgQ29kZSBTaWduaW5nIEluc3RydWN0aW9ucyIgc2VjdGlvbi4KKworCisgICAzLiBSYW5kb20gTGlua3MgV2hpY2ggTWF5IEJlIE9mIEludGVyZXN0CisKK1swXSBodHRwOi8vbXVsdGluYy5jb20vMjAwOS8wOC8yNC9jb21wYXRpYmlsaXR5LWJldHdlZW4tdGhlLWlwaG9uZS1hcHAtc3RvcmUtYW5kLXRoZS1sZ3BsLwpkaWZmIC0tZ2l0IGEvUkVMRUFTRSBiL1JFTEVBU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxMWY3ZAotLS0gL2Rldi9udWxsCisrKyBiL1JFTEVBU0UKQEAgLTAsMCArMSw5OCBAQAorCitSZWxlYXNlIG5vdGVzIGZvciBHU3RyZWFtZXIgR29vZCBQbHVnaW5zwqAxLjEyLjAKKworVGhlIEdTdHJlYW1lciB0ZWFtIGlzIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IHJlbGVhc2UgaW4gdGhlIHN0YWJsZSAxLjEyCityZWxlYXNlIHNlcmllcy4gVGhlIDEuMTIgcmVsZWFzZSBzZXJpZXMgaXMgYWRkaW5nIG5ldyBmZWF0dXJlcyBvbiB0b3Agb2YgdGhlCisxLjAsIDEuMiwgMS40LCAxLjYsIDEuOCBhbmQgMS4xMCBzZXJpZXMgYW5kIGlzIHBhcnQgb2YgdGhlIEFQSSBhbmQgQUJJLXN0YWJsZQorMS54IHJlbGVhc2Ugc2VyaWVzIG9mIHRoZSBHU3RyZWFtZXIgbXVsdGltZWRpYSBmcmFtZXdvcmsuCisKKworRnVsbCByZWxlYXNlIG5vdGVzIGNhbiBiZSBmb3VuZCBoZXJlCisKKworQmluYXJpZXMgZm9yIEFuZHJvaWQsIGlPUywgTWFjIE9TIFggYW5kIFdpbmRvd3Mgd2lsbCBiZSBwcm92aWRlZCBpbiB0aGUgbmV4dCBkYXlzLgorCisKKyJTdWNoIGluZ3JhdGl0dWRlLiAgQWZ0ZXIgYWxsIHRoZSB0aW1lcyBJJ3ZlIHNhdmVkIHlvdXIgbGlmZS4iCisKKworQSBjb2xsZWN0aW9uIG9mIHBsdWdpbnMgeW91J2Qgd2FudCB0byBoYXZlIHJpZ2h0IG5leHQgdG8geW91IG9uIHRoZQorYmF0dGxlZmllbGQuICBTaG9vdGluZyBzaGFycCBhbmQgbWFraW5nIG5vIG1pc3Rha2VzLCB0aGVzZSBwbHVnaW5zIGhhdmUgaXQKK2FsbDogZ29vZCBsb29rcywgZ29vZCBjb2RlLCBhbmQgZ29vZCBsaWNlbnNpbmcuICBEb2N1bWVudGVkIGFuZCBkcmVzc2VkIHVwCitpbiB0ZXN0cy4gIElmIHlvdSdyZSBsb29raW5nIGZvciBhIHJvbGUgbW9kZWwgdG8gYmFzZSB5b3VyIG93biBwbHVnaW4gb24sCitoZXJlIGl0IGlzLgorCisKK0lmIHlvdSBmaW5kIGEgcGxvdCBob2xlIG9yIGEgYmFkbHkgbGlwLXN5bmNlZCBsaW5lIG9mIGNvZGUgaW4gdGhlbSwKK2xldCB1cyBrbm93IC0gaXQgaXMgYSBtYXR0ZXIgb2YgaG9ub3VyIGZvciB1cyB0byBlbnN1cmUgQmxvbmRpZSBkb2Vzbid0IGxvb2sKK2xpa2UgaGUncyBiZWVuIHdhbGtpbmcgMTAwIG1pbGVzIHRocm91Z2ggdGhlIGRlc2VydCB3aXRob3V0IHdhdGVyLgorCisKK1RoaXMgbW9kdWxlIGNvbnRhaW5zIGEgc2V0IG9mIHBsdWdpbnMgdGhhdCB3ZSBjb25zaWRlciB0byBoYXZlIGdvb2QgcXVhbGl0eQorICBjb2RlLCBjb3JyZWN0IGZ1bmN0aW9uYWxpdHksIG91ciBwcmVmZXJyZWQgbGljZW5zZSAoTEdQTCBmb3IgdGhlIHBsdWdpbgorICBjb2RlLCBMR1BMIG9yIExHUEwtY29tcGF0aWJsZSBmb3IgdGhlIHN1cHBvcnRpbmcgbGlicmFyeSkuCitXZSBiZWxpZXZlIGRpc3RyaWJ1dG9ycyBjYW4gc2FmZWx5IHNoaXAgdGhlc2UgcGx1Z2lucy4KK1Blb3BsZSB3cml0aW5nIGVsZW1lbnRzIHNob3VsZCBiYXNlIHRoZWlyIGNvZGUgb24gdGhlc2UgZWxlbWVudHMuCisKKworT3RoZXIgbW9kdWxlcyBjb250YWluaW5nIHBsdWdpbnMgYXJlOgorCisKK2dzdC1wbHVnaW5zLWJhc2UKK2NvbnRhaW5zIGEgYmFzaWMgc2V0IG9mIHdlbGwtc3VwcG9ydGVkIHBsdWdpbnMKK2dzdC1wbHVnaW5zLXVnbHkKK2NvbnRhaW5zIGEgc2V0IG9mIHdlbGwtc3VwcG9ydGVkIHBsdWdpbnMsIGJ1dCBtaWdodCBwb3NlIHByb2JsZW1zIGZvcgorICAgIGRpc3RyaWJ1dG9ycworZ3N0LXBsdWdpbnMtYmFkCitjb250YWlucyBhIHNldCBvZiBsZXNzIHN1cHBvcnRlZCBwbHVnaW5zIHRoYXQgaGF2ZW4ndCBwYXNzZWQgdGhlCisgICAgcmlnb3JvdXMgcXVhbGl0eSB0ZXN0aW5nIHdlIGV4cGVjdCwgb3IgYXJlIHN0aWxsIG1pc3NpbmcgZG9jdW1lbnRhdGlvbgorICAgIGFuZC9vciB1bml0IHRlc3RzCitnc3QtbGliYXYKK2NvbnRhaW5zIGEgc2V0IG9mIGNvZGVjcyBwbHVnaW5zIGJhc2VkIG9uIGxpYmF2IChmb3JtZXJseSBnc3QtZmZtcGVnKQorCisKKworICAKKworQnVncyBmaXhlZCBpbiB0aGlzIHJlbGVhc2UKKyAgICAgCisgICAgICAqIDc4MjA0MiA6IHF0ZGVtdXg6IEZpeCBjcmFzaCBvbiBtc3Mgc3RyZWFtIGNhdXNlZCBieSBpbnZhbGlkIHN0c2QgZW50cnkgYWNjZXNzCisKKz09PT0gRG93bmxvYWQgPT09PQorCitZb3UgY2FuIGZpbmQgc291cmNlIHJlbGVhc2VzIG9mIGdzdC1wbHVnaW5zLWdvb2QgaW4gdGhlIGRvd25sb2FkCitkaXJlY3Rvcnk6IGh0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC8KKworVGhlIGdpdCByZXBvc2l0b3J5IGFuZCBkZXRhaWxzIGhvdyB0byBjbG9uZSBpdCBjYW4gYmUgZm91bmQgYXQKK2h0dHA6Ly9jZ2l0LmZyZWVkZXNrdG9wLm9yZy9nc3RyZWFtZXIvZ3N0LXBsdWdpbnMtZ29vZC8KKworPT09PSBIb21lcGFnZSA9PT09CisKK1RoZSBwcm9qZWN0J3Mgd2Vic2l0ZSBpcyBodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvCisKKz09PT0gU3VwcG9ydCBhbmQgQnVncyA9PT09CisKK1dlIHVzZSBHTk9NRSdzIGJ1Z3ppbGxhIGZvciBidWcgcmVwb3J0cyBhbmQgZmVhdHVyZSByZXF1ZXN0czoKK2h0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvZW50ZXJfYnVnLmNnaT9wcm9kdWN0PUdTdHJlYW1lcgorCitQbGVhc2Ugc3VibWl0IHBhdGNoZXMgdmlhIGJ1Z3ppbGxhIGFzIHdlbGwuCisKK0ZvciBoZWxwIGFuZCBzdXBwb3J0LCBwbGVhc2Ugc3Vic2NyaWJlIHRvIGFuZCBzZW5kIHF1ZXN0aW9ucyB0byB0aGUKK2dzdHJlYW1lci1kZXZlbCBtYWlsaW5nIGxpc3QgKHNlZSBiZWxvdyBmb3IgZGV0YWlscykuCisKK1RoZXJlIGlzIGFsc28gYSAjZ3N0cmVhbWVyIElSQyBjaGFubmVsIG9uIHRoZSBGcmVlbm9kZSBJUkMgbmV0d29yay4KKworPT09PSBEZXZlbG9wZXJzID09PT0KKworR1N0cmVhbWVyIGlzIHN0b3JlZCBpbiBHaXQsIGhvc3RlZCBhdCBnaXQuZnJlZWRlc2t0b3Aub3JnLCBhbmQgY2FuIGJlIGNsb25lZAorZnJvbSB0aGVyZSAoc2VlIGxpbmsgYWJvdmUpLgorCitJbnRlcmVzdGVkIGRldmVsb3BlcnMgb2YgdGhlIGNvcmUgbGlicmFyeSwgcGx1Z2lucywgYW5kIGFwcGxpY2F0aW9ucyBzaG91bGQKK3N1YnNjcmliZSB0byB0aGUgZ3N0cmVhbWVyLWRldmVsIGxpc3QuCisKKyAgICAgICAgCitDb250cmlidXRvcnMgdG8gdGhpcyByZWxlYXNlCisgICAgCisgICAgICAqIFNlYmFzdGlhbiBEcsO2Z2UKKyAgICAgICogU2V1bmdoYSBZYW5nCivCoApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1JFUVVJUkVNRU5UUyBiL1JFUVVJUkVNRU5UUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDBlODI0Ci0tLSAvZGV2L251bGwKKysrIGIvUkVRVUlSRU1FTlRTCkBAIC0wLDAgKzEsMTgyIEBACitHU3RyZWFtZXIgdXNlcyBhICpsYXJnZSogYXJyYXkgb2YgdG9vbHMgYW5kIGxpYnJhcmllcywgbW9zdCBvZiB3aGljaCBhcmUKK29wdGlvbmFsLiBXZSBoYXZlIGF0dGVtcHRlZCB0byBtYWtlIHN1cmUgdGhhdCBhbnkgY29kZSB0aGF0IGRlcGVuZHMgb24KK29wdGlvbmFsIGxpYnJhcmllcyBkb2Vzbid0IGdldCBidWlsdCB1bmxlc3MgeW91IGhhdmUgdGhvc2UgbGlicmFyaWVzLiBJZgoreW91IGZpbmQgdGhpcyBub3QgdG8gYmUgdGhlIGNhc2UsIHBsZWFzZSwgbGV0IHVzIGtub3cgYnkgZmlsaW5nIGEgYnVnCityZXBvcnQgYXQgaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy8uCisKK09uIERlYmlhbi9VYnVudHUsIHRoZSBlYXNpZXN0IHdheSB0byBpbnN0YWxsIG1vc3QgYnVpbGQgcmVxdWlyZW1lbnRzIGlzOgorCisgICAgICAgIHN1ZG8gYXB0LWdldCBidWlsZC1kZXAgZ3N0LXBsdWdpbnMtZ29vZDEuMAorCitSZXF1aXJlZCB0b29sczoKKz09PT09PT09PT09PT09PQorCitBbiBleHRyYSBzZXQgb2YgdG9vbHMgaXMgcmVxdWlyZWQgaWYgeW91IHdpc2ggdG8gYnVpbGQgR1N0cmVhbWVyCitmcm9tIGdpdCAodXNpbmcgYXV0b2dlbi5zaCk6CisKK2F1dG9jb25mICA+PSAyLjY4ICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi8KK2F1dG9tYWtlICA+PSAxLjExICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvbWFrZS8KK2dldHRleHQgICA+PSAwLjE3ICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nZXR0ZXh0LworbGlidG9vbCAgID49IDIuMi42ICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYnRvb2wvCitwa2djb25maWcgPj0gMC45LjAgIGh0dHBzOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9wa2djb25maWcvCisKK1JlcXVpcmVkIGxpYnJhcmllczoKKz09PT09PT09PT09PT09PT09PT0KKworUGFja2FnZTogICAgICAgIEdTdHJlYW1lcgorVmVyc2lvbjogICAgICAgIDEueCAoc2FtZSAxLnggdmVyc2lvbiBhcyB0aGlzIHBhY2thZ2UpCitSZWNvbW1lbmRlZDogICAgTGF0ZXN0IDEueAorVVJMOiAgICAgICAgICAgIGh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnLworRGViaWFuUGFja2FnZTogIGxpYmdzdHJlYW1lcjEuMC1kZXYKK05vdGVzOiAgICAgICAgICBUaGUgcmVxdWlyZWQgdmVyc2lvbiBpcyB1cGRhdGVkIGZyZXF1ZW50bHksIHNvIHRoZSB2ZXJzaW9uCisgICAgICAgICAgICAgICAgbGlzdGVkIGluIHRoaXMgZmlsZSBpcyBvZnRlbiBvdXQgb2YgZGF0ZS4gSWYgeW91IGFyZSBjb21waWxpbmcKKyAgICAgICAgICAgICAgICBmcm9tIGdpdCBtYXN0ZXIsIHlvdSB3aWxsIHVzdWFsbHkgbmVlZCBHU3RyZWFtZXIgY29yZSBhbmQKKyAgICAgICAgICAgICAgICBnc3QtcGx1Z2lucy1iYXNlIGZyb20gZ2l0IG1hc3RlciBhcyB3ZWxsLgorCitQYWNrYWdlOiAgICAgICAgR1N0cmVhbWVyIEJhc2UgUGx1Z2lucworVmVyc2lvbjogICAgICAgIDEueCAoc2FtZSAxLnggdmVyc2lvbiBhcyB0aGlzIHBhY2thZ2UpCitSZWNvbW1lbmRlZDogICAgTGF0ZXN0IDEueAorVVJMOiAgICAgICAgICAgIGh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnLworRGViaWFuUGFja2FnZTogIGxpYmdzdHJlYW1lci1wbHVnaW5zLWJhc2UxLjAtZGV2CitOb3RlczogICAgICAgICAgVGhlIHJlcXVpcmVkIHZlcnNpb24gaXMgdXBkYXRlZCBmcmVxdWVudGx5LCBzbyB0aGUgdmVyc2lvbgorICAgICAgICAgICAgICAgIGxpc3RlZCBpbiB0aGlzIGZpbGUgaXMgb2Z0ZW4gb3V0IG9mIGRhdGUuIElmIHlvdSBhcmUgY29tcGlsaW5nCisgICAgICAgICAgICAgICAgZnJvbSBnaXQgbWFzdGVyLCB5b3Ugd2lsbCB1c3VhbGx5IG5lZWQgR1N0cmVhbWVyIGNvcmUgYW5kCisgICAgICAgICAgICAgICAgZ3N0LXBsdWdpbnMtYmFzZSBmcm9tIGdpdCBtYXN0ZXIgYXMgd2VsbC4KKworCitPcHRpb25hbCBsaWJyYXJpZXM6Cis9PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZmlsZSBsaXN0cyBzdXBwb3J0aW5nIGxpYnJhcmllcyBmb3Igd2hpY2ggZ3N0LXBsdWdpbnMtZ29vZCBjb250YWlucworcGx1Z2lucywgYXMgd2VsbCBhcyB0aGVpciBtaW5pbXVtIHJlcXVpcmVkIHZlcnNpb24uIFlvdSBjYW4gZmluZCB0aGUKK2NvcnJlc3BvbmRpbmcgcGx1Z2lucyBpbiBleHQvKGxpYnJhcnkpCisKK1BhY2thZ2U6ICAgICAgICBPcmMKK1ZlcnNpb246ICAgICAgICA+PSAwLjQuMTcKK1JlY29tbWVuZGVkOiAgICBMYXRlc3QgMC40LngKK1VSTDogICAgICAgICAgICBodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kYXRhL3NyYy9vcmMvCitEZWJpYW5QYWNrYWdlOiAgbGlib3JjLTAuNC1kZXYKK05vdGVzOgkJVXNlZCBieSBtYW55IHBsdWdpbnMgZm9yIGFjY2VsZXJhdGluZyBTSU1EIHByb2Nlc3NpbmcgdXNpbmcKKyAgICAgICAgICAgICAgICBydW4tdGltZSBnZW5lcmF0ZWQgYXNzZW1ibHkuIE5vdCBhIGhhcmQgcmVxdWlyZW1lbnQsIGJ1dAorICAgICAgICAgICAgICAgIGhpZ2hseSByZWNvbW1lbmRlZC4gUGFja2FnZXJzLCBwbGVhc2UgaGFyZC1kZXBlbmQgb24gbGlib3JjLgorICAgICAgICAgICAgICAgIFRoZSBnaXQgcmVwb3NpdG9yeSBpcyBodHRwOi8vY2dpdC5mcmVlZGVza3RvcC5vcmcvZ3N0cmVhbWVyL29yYy8KKyAgICAgICAgICAgICAgICAoYWxsIHZlcnNpb25zIG9uIGVudHJvcHl3YXZlLmNvbSBhcmUgb3V0ZGF0ZWQpCisKK1BhY2thZ2U6ICAgICAgICBnZGstcGl4YnVmIExpYnJhcnkKK1ZlcnNpb246ICAgICAgICA+PSAyLjguMAorUmVjb21tZW5kZWQ6ICAgIExhdGVzdCAyLngKK1VSTDogICAgICAgICAgICBodHRwOi8vd3d3Lmd0ay5vcmcvCitEZWJpYW5QYWNrYWdlOiAgbGliZ2RrLXBpeGJ1ZjIuMC1kZXYKK1BsdWdpbnM6ICAgICAgICBnZGtwaXhidWYgKGdka3BpeGJ1ZmRlYywgZ2RrcGl4YnVmb3ZlcmxheSkKK05vdGVzOiAgICAgICAgICBUaGlzIGxpYnJhcnkgZG9lcyBub3QgZGVwZW5kIG9uIEd0aysgb3IgR2RrIG9yIGFueSB3aW5kb3cgc3lzdGVtCisKK1BhY2thZ2U6ICAgICAgICBHVEsrCitWZXJzaW9uOiAgICAgICAgPj0gMy4wCitSZWNvbW1lbmRlZDogICAgTGF0ZXN0IDMueAorVVJMOiAgICAgICAgICAgIGh0dHA6Ly93d3cuZ3RrLm9yZy8KK0RlYmlhblBhY2thZ2U6ICBsaWJndGstMy1kZXYKK1BsdWdpbnM6ICAgICAgICBOb25lCitOb3RlczoJICAgICAgICBPbmx5IG5lZWRlZCBieSBzb21lIG9mIHRoZSBleGFtcGxlcywgbm90IGJ5IGFueSBwbHVnaW5zLgorCitQYWNrYWdlOiAgICAgICAgWGxpYgorUGx1Z2luczogICAgICAgIHhpbWFnZXNyYworRGViaWFuUGFja2FnZTogIGxpYngxMS1kZXYgbGlieHYtZGV2IGxpYnh0LWRldgorCitQYWNrYWdlOiAgICAgICAgQUFMaWIKK1BsdWdpbnM6ICAgICAgICBhYXNpbmsKK1VSTDogICAgICAgICAgICBodHRwOi8vYWEtcHJvamVjdC5zb3VyY2Vmb3JnZS5uZXQvYWFsaWIvCisKK1BhY2thZ2U6ICAgICAgICBDYWlybworVmVyc2lvbjogICAgICAgID49IDEuMTAKK0RlYmlhblBhY2thZ2U6ICBsaWJjYWlybzItZGV2CitQbHVnaW5zOiAgICAgICAgY2Fpcm8gKGNhaXJvb3ZlcmxheSkKK1VSTDogICAgICAgICAgICBodHRwOi8vY2Fpcm9ncmFwaGljcy5vcmcvCisKK1BhY2thZ2U6ICAgICAgICBGTEFDCitWZXJzaW9uOiAgICAgICAgPj0gMS4xLjQKK0RlYmlhblBhY2thZ2U6ICBsaWJmbGFjLWRldgorUGx1Z2luczogICAgICAgIGZsYWMgKGZsYWNlbmMsIGZsYWNkZWMpCitVUkw6ICAgICAgICAgICAgaHR0cDovL2ZsYWMuc291cmNlZm9yZ2UubmV0LworCitQYWNrYWdlOiAgICAgICAgZ3VkZXYKK1ZlcnNpb246ICAgICAgICA+PSAxNDcKK0RlYmlhblBhY2thZ2U6ICBsaWJndWRldi0xLjAtZGV2CitQbHVnaW5zOiAgICAgICAgdjRsMiAodjRsMnNyYykKK1VSTDogICAgICAgICAgICBodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9zeXN0ZW1kLworTm90ZXM6ICAgICAgICAgIFRoaXMgZGVwZW5kZW5jeSBpcyBlbnRpcmVseSBvcHRpb25hbCwgdGhlIHZpZGVvNGxpbnV4IHBsdWdpbgorICAgICAgICAgICAgICAgIHdpbGwgd29yayBqdXN0IGZpbmUgd2l0aG91dCBpdC4gZ3VkZXYgaXMgb25seSByZXF1aXJlZCBmb3IKKyAgICAgICAgICAgICAgICB0aGUgZGV2aWNlIHByb2JpbmcgYW5kIG1vbml0b3JpbmcgZnVuY3Rpb25hbGl0eSB0byBkZXRlY3QKKyAgICAgICAgICAgICAgICB2aWRlbzRsaW51eCBkZXZpY2VzIGFwcGVhcmluZy9kaXNhcHBlYXJpbmcgYXQgcnVuLXRpbWUuCisKK1BhY2thZ2U6ICAgICAgICBKUEVHIGxpYnJhcnkKK1BsdWdpbnM6ICAgICAgICBqcGVnIChqcGVnZW5jLCBqcGVnZGVjLCBzbW9rZWVuYywgc21va2VkZWMpCitEZWJpYW5QYWNrYWdlOiAgbGlianBlZy1kZXYKK1VSTDogICAgICAgICAgICBodHRwOi8vd3d3LmxpYmpwZWctdHVyYm8ub3JnLworICAgICAgICAgICAgICAgIG9yIGh0dHA6Ly93d3cuaWpnLm9yZy8gZm9yIHRoZSBJSkcgdmVyc2lvbgorCitQYWNrYWdlOiAgICAgICAgTGliY2FjYQorUGx1Z2luczogICAgICAgIGNhY2FzaW5rCitEZWJpYW5QYWNrYWdlOiAgbGliY2FjYS1kZXYKK1VSTDogICAgICAgICAgICBodHRwOi8vbGliY2FjYS56b3kub3JnLworCitQYWNrYWdlOiAgICAgICAgTGliZHYKK1ZlcnNpb246ICAgICAgICA+PSAwLjEwMAorRGViaWFuUGFja2FnZTogIGxpYmR2NC1kZXYKK1BsdWdpbnM6ICAgICAgICBkdiAoZHZkZWMpCitVUkw6ICAgICAgICAgICAgaHR0cDovL2xpYmR2LnNvdXJjZWZvcmdlLm5ldC8KKworUGFja2FnZToJbGlibGFtZQorVmVyc2lvbjoJPj0gMy45OAorRGViaWFuUGFja2FnZToJbGlibXAzbGFtZS1kZXYKK1BsdWdpbnM6CWxhbWUgKGxhbWVtcDNlbmMpCitVUkw6CQlodHRwOi8vd3d3Lm1wM2Rldi5vcmcvbXAzLworCitQYWNrYWdlOglsaWJtcGcxMjMKK1ZlcnNpb246ICAgICAgICA+PSAxLjMKK0RlYmlhblBhY2thZ2U6ICBsaWJwbmcxMi1kZXYKK1BsdWdpbnM6ICAgICAgICBtcGcxMjMgKG1wZzEyM2F1ZGlvZGVjKQorVVJMOgkJaHR0cHM6Ly93d3cubXBnMTIzLmRlL2FwaS8KKworUGFja2FnZTogICAgICAgIExpYnBuZworVmVyc2lvbjogICAgICAgID49IDEuMgorRGViaWFuUGFja2FnZTogIGxpYnBuZzEyLWRldgorUGx1Z2luczogICAgICAgIHBuZyAocG5nZW5jLCBwbmdkZWMpCitVUkw6ICAgICAgICAgICAgaHR0cDovL3d3dy5saWJwbmcub3JnL3B1Yi9wbmcvbGlicG5nLmh0bWwKKworUGFja2FnZTogICAgICAgIGxpYnJhdzEzOTQKK1BsdWdpbnM6ICAgICAgICBkdjEzOTQKK1VSTDogICAgICAgICAgICBodHRwOi8vd3d3LmxpbnV4MTM5NC5vcmcvCisKK1BhY2thZ2U6ICAgICAgICBsaWJzaG91dAorVmVyc2lvbjogICAgICAgID49IDIuMAorRGViaWFuUGFja2FnZTogIGxpYnNob3V0My1kZXYKK3BsdWdpbnM6ICAgICAgICBzaG91dDIgKHNob3V0MnNlbmQpCitVUkw6ICAgICAgICAgICAgaHR0cDovL3d3dy5pY2VjYXN0Lm9yZy8KKworUGFja2FnZTogICAgICAgIHNwZWV4CitWZXJzaW9uOiAgICAgICAgPj0gMS4xLjYKK1BsdWdpbnM6ICAgICAgICBzcGVleCAoc3BlZXhlbmMsIHNwZWV4ZGVjKQorVVJMOiAgICAgICAgICAgIGh0dHA6Ly93d3cuc3BlZXgub3JnLworCitQYWNrYWdlOiAgICAgICAgdGFnbGliCitWZXJzaW9uOiAgICAgICAgPj0gMS41CitEZWJpYW5QYWNrYWdlOiAgbGlidGFnMS1kZXYKK1BsdWdpbnM6ICAgICAgICB0YWdsaWIgKGlkM3YybXV4KQorVVJMOiAgICAgICAgICAgIGh0dHA6Ly90YWdsaWIuZ2l0aHViLmlvLworCitQYWNrYWdlOgl0d29sYW1lCitWZXJzaW9uOgk+PSAwLjMuMTMKK0RlYmlhblBhY2thZ2U6CWxpYnR3b2xhbWUtZGV2CitQbHVnaW5zOgl0d29sYW1lICh0d29sYW1lbXAyZW5jKQorVVJMOgkJaHR0cDovL3d3dy50d29sYW1lLm9yZworCitQYWNrYWdlOiAgICAgICAgemxpYgorRGViaWFuUGFja2FnZTogIHpsaWIxZy1kZXYKK1BsdWdpbnM6ICAgICAgICBpc29tcDQgKHF0ZGVtdXgpLCBtYXRyb3NrYSAobWF0cm9za2FkZW11eCkKK1VSTDogICAgICAgICAgICBodHRwOi8vd3d3LnpsaWIubmV0LworCitPcHRpb25hbCAoZGViaWFuKSBwYWNrYWdlczoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitndGstZG9jLXRvb2xzID49IDEuMTIgIC0tIG5lZWRlZCB0byBidWlsZCBkb2N1bWVudGF0aW9uCitweXRob24teG1sICAtLSBuZWVkZWQgdG8gYnVpbGQgcGx1Z2luIGRvY3VtZW50YXRpb24KZGlmZiAtLWdpdCBhL2F1dG9nZW4uc2ggYi9hdXRvZ2VuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM5YWYwMjgKLS0tIC9kZXYvbnVsbAorKysgYi9hdXRvZ2VuLnNoCkBAIC0wLDAgKzEsMTI0IEBACisjIS9iaW4vc2gKKyMKKyMgZ3N0LXBsdWdpbnMtZ29vZCBhdXRvZ2VuLnNoCisjCisjIFJ1biB0aGlzIHRvIGdlbmVyYXRlIGFsbCB0aGUgaW5pdGlhbCBtYWtlZmlsZXMsIGV0Yy4KKyMKKyMgVGhpcyBmaWxlIGhhcyBiZWVuIGdlbmVyYXRlZCBmcm9tIGNvbW1vbi9hdXRvZ2VuLnNoLmluIHZpYSBjb21tb24vdXBkYXRlLWF1dG9nZW4KKworCit0ZXN0IC1uICIkc3JjZGlyIiB8fCBzcmNkaXI9YGRpcm5hbWUgIiQwImAKK3Rlc3QgLW4gIiRzcmNkaXIiIHx8IHNyY2Rpcj0uCisKK29sZGRpcj1gcHdkYAorY2QgIiRzcmNkaXIiCisKK3BhY2thZ2U9Z3N0LXBsdWdpbnMtZ29vZAorc3JjZmlsZT1nc3QtcGx1Z2lucy1nb29kLmRvYXAKKworIyBNYWtlIHN1cmUgd2UgaGF2ZSBjb21tb24KK2lmIHRlc3QgISAtZiBjb21tb24vZ3N0LWF1dG9nZW4uc2g7Cit0aGVuCisgIGVjaG8gIisgU2V0dGluZyB1cCBjb21tb24gc3VibW9kdWxlIgorICBnaXQgc3VibW9kdWxlIGluaXQKK2ZpCitnaXQgc3VibW9kdWxlIHVwZGF0ZQorCisjIHNvdXJjZSBoZWxwZXIgZnVuY3Rpb25zCitpZiB0ZXN0ICEgLWYgY29tbW9uL2dzdC1hdXRvZ2VuLnNoOwordGhlbgorICBlY2hvIFRoZXJlIGlzIHNvbWV0aGluZyB3cm9uZyB3aXRoIHlvdXIgc291cmNlIHRyZWUuCisgIGVjaG8gWW91IGFyZSBtaXNzaW5nIGNvbW1vbi9nc3QtYXV0b2dlbi5zaAorICBleGl0IDEKK2ZpCisuIGNvbW1vbi9nc3QtYXV0b2dlbi5zaAorCisjIGluc3RhbGwgcHJlLWNvbW1pdCBob29rIGZvciBkb2luZyBjbGVhbiBjb21taXRzCitpZiB0ZXN0ICEgXCggLXggLmdpdC9ob29rcy9wcmUtY29tbWl0IC1hIC1MIC5naXQvaG9va3MvcHJlLWNvbW1pdCBcKTsKK3RoZW4KKyAgICBybSAtZiAuZ2l0L2hvb2tzL3ByZS1jb21taXQKKyAgICBpZiAhIGxuIC1zIC4uLy4uL2NvbW1vbi9ob29rcy9wcmUtY29tbWl0Lmhvb2sgLmdpdC9ob29rcy9wcmUtY29tbWl0IDI+IC9kZXYvbnVsbAorICAgIHRoZW4KKyAgICAgICAgZWNobyAiRmFpbGVkIHRvIGNyZWF0ZSBjb21taXQgaG9vayBzeW1saW5rLCBjb3B5aW5nIGluc3RlYWQgLi4uIgorICAgICAgICBjcCBjb21tb24vaG9va3MvcHJlLWNvbW1pdC5ob29rIC5naXQvaG9va3MvcHJlLWNvbW1pdAorICAgIGZpCitmaQorCisjIEdOVSBnZXR0ZXh0IGF1dG9tYWtlIHN1cHBvcnQgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCBnaXQuCisjIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjExMjgKK2lmIHRlc3QgLWQgcG8gOyB0aGVuCisgIHRvdWNoIC10IDIwMDAwMTAxMDAwMCBwby9nc3QtcGx1Z2lucy1nb29kLTEuMC5wb3QKK2ZpCisKK0NPTkZJR1VSRV9ERUZfT1BUPSctLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgLS1lbmFibGUtZ3RrLWRvYycKKworaWYgdGVzdCAieCRwYWNrYWdlIiA9ICJ4Z3N0cmVhbWVyIjsgdGhlbgorICBDT05GSUdVUkVfREVGX09QVD0iJENPTkZJR1VSRV9ERUZfT1BUIC0tZW5hYmxlLWZhaWxpbmctdGVzdHMgLS1lbmFibGUtcG9pc29uaW5nIgorZWxpZiB0ZXN0ICJ4JHBhY2thZ2UiID0gInhnc3QtcGx1Z2lucy1iYWQiOyB0aGVuCisgIENPTkZJR1VSRV9ERUZfT1BUPSIkQ09ORklHVVJFX0RFRl9PUFQgLS13aXRoLXBsYXllci10ZXN0cyIKK2ZpCisKK2F1dG9nZW5fb3B0aW9ucyAkQAorCitwcmludGYgIisgY2hlY2sgZm9yIGJ1aWxkIHRvb2xzIgoraWYgdGVzdCAteiAiJE5PQ0hFQ0siOyB0aGVuCisgIGVjaG8KKworICBwcmludGYgIiAgY2hlY2tpbmcgZm9yIGF1dG9yZWNvbmYgLi4uICIKKyAgZWNobworICB3aGljaCAiYXV0b3JlY29uZiIgMj4vZGV2L251bGwgfHwgeworICAgIGVjaG8gIm5vdCBmb3VuZCEgUGxlYXNlIGluc3RhbGwgdGhlIGF1dG9jb25mIHBhY2thZ2UuIgorICAgIGV4aXQgMQorICB9CisKKyAgcHJpbnRmICIgIGNoZWNraW5nIGZvciBwa2ctY29uZmlnIC4uLiAiCisgIGVjaG8KKyAgd2hpY2ggInBrZy1jb25maWciIDI+L2Rldi9udWxsIHx8IHsKKyAgICBlY2hvICJub3QgZm91bmQhIFBsZWFzZSBpbnN0YWxsIHBrZy1jb25maWcuIgorICAgIGV4aXQgMQorICB9CitlbHNlCisgIGVjaG8gIjogc2tpcHBlZCB2ZXJzaW9uIGNoZWNrcyIKK2ZpCisKKyMgaWYgbm8gYXJndW1lbnRzIHNwZWNpZmllZCB0aGVuIHRoaXMgd2lsbCBiZSBwcmludGVkCitpZiB0ZXN0IC16ICIkKiIgJiYgdGVzdCAteiAiJE5PQ09ORklHVVJFIjsgdGhlbgorICBlY2hvICIrIGNoZWNraW5nIGZvciBhdXRvZ2VuLnNoIG9wdGlvbnMiCisgIGVjaG8gIiAgVGhpcyBhdXRvZ2VuIHNjcmlwdCB3aWxsIGF1dG9tYXRpY2FsbHkgcnVuIC4vY29uZmlndXJlIGFzOiIKKyAgZWNobyAiICAuL2NvbmZpZ3VyZSAkQ09ORklHVVJFX0RFRl9PUFQiCisgIGVjaG8gIiAgVG8gcGFzcyBhbnkgYWRkaXRpb25hbCBvcHRpb25zLCBwbGVhc2Ugc3BlY2lmeSB0aGVtIG9uIHRoZSAkMCIKKyAgZWNobyAiICBjb21tYW5kIGxpbmUuIgorZmkKKwordG9wbGV2ZWxfY2hlY2sgJHNyY2ZpbGUKKworIyBhdXRvcG9pbnQKK2lmIHRlc3QgLWQgcG8gJiYgZ3JlcCBeQU1fR05VX0dFVFRFWFRfVkVSU0lPTiBjb25maWd1cmUuYWMgPi9kZXYvbnVsbCA7IHRoZW4KKyAgdG9vbF9ydW4gImF1dG9wb2ludCIgIi0tZm9yY2UiCitmaQorCisjIGFjbG9jYWwKK2lmIHRlc3QgLWYgYWNpbmNsdWRlLm00OyB0aGVuIHJtIGFjaW5jbHVkZS5tNDsgZmkKKworYXV0b3JlY29uZiAtLWZvcmNlIC0taW5zdGFsbCB8fCBleGl0IDEKKwordGVzdCAtbiAiJE5PQ09ORklHVVJFIiAmJiB7CisgIGVjaG8gIisgc2tpcHBpbmcgY29uZmlndXJlIHN0YWdlIGZvciBwYWNrYWdlICRwYWNrYWdlLCBhcyByZXF1ZXN0ZWQuIgorICBlY2hvICIrIGF1dG9nZW4uc2ggZG9uZS4iCisgIGV4aXQgMAorfQorCitjZCAiJG9sZGRpciIKKworZWNobyAiKyBydW5uaW5nIGNvbmZpZ3VyZSAuLi4gIgordGVzdCAhIC16ICIkQ09ORklHVVJFX0RFRl9PUFQiICYmIGVjaG8gIiAgZGVmYXVsdCBmbGFnczogICRDT05GSUdVUkVfREVGX09QVCIKK3Rlc3QgISAteiAiJENPTkZJR1VSRV9FWFRfT1BUIiAmJiBlY2hvICIgIGV4dGVybmFsIGZsYWdzOiAkQ09ORklHVVJFX0VYVF9PUFQiCitlY2hvCisKK2VjaG8gIiRzcmNkaXIvY29uZmlndXJlIiAkQ09ORklHVVJFX0RFRl9PUFQgJENPTkZJR1VSRV9FWFRfT1BUCisiJHNyY2Rpci9jb25maWd1cmUiICRDT05GSUdVUkVfREVGX09QVCAkQ09ORklHVVJFX0VYVF9PUFQgfHwgeworICAgICAgICBlY2hvICIgIGNvbmZpZ3VyZSBmYWlsZWQiCisgICAgICAgIGV4aXQgMQorfQorCitlY2hvICJOb3cgdHlwZSAnbWFrZScgdG8gY29tcGlsZSAkcGFja2FnZS4iCmRpZmYgLS1naXQgYS9jb21tb24gYi9jb21tb24KbmV3IGZpbGUgbW9kZSAxNjAwMDAKaW5kZXggMDAwMDAwMC4uM2ZhMmM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbgpAQCAtMCwwICsxIEBACitTdWJwcm9qZWN0IGNvbW1pdCAzZmEyYzllMzcyYmNlZWMzMGJlOTFlNjdmYjAyYjZjYjA1YmVkNDkzCmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIxZWNmNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMCwwICsxLDExMjggQEAKK0FDX1BSRVJFUShbMi42OV0pCisKK2RubCBwbGVhc2UgcmVhZCBnc3RyZWFtZXIvZG9jcy9yYW5kb20vYXV0b3Rvb2xzIGJlZm9yZSBjaGFuZ2luZyB0aGlzIGZpbGUKKworZG5sIGluaXRpYWxpemUgYXV0b2NvbmYKK2RubCByZWxlYXNlcyBvbmx5IGRvIC1XYWxsLCBnaXQgYW5kIHByZXJlbGVhc2UgZG9lcyAtV2Vycm9yIHRvbworZG5sIHVzZSBhIHRocmVlIGRpZ2l0IHZlcnNpb24gbnVtYmVyIGZvciByZWxlYXNlcywgYW5kIGZvdXIgZm9yIGdpdC9wcmUKK0FDX0lOSVQoW0dTdHJlYW1lciBHb29kIFBsdWctaW5zXSxbMS4xMy4wLjFdLFtodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1HU3RyZWFtZXJdLFtnc3QtcGx1Z2lucy1nb29kXSkKKworQUdfR1NUX0lOSVQKKworZG5sIGluaXRpYWxpemUgYXV0b21ha2UKK0FNX0lOSVRfQVVUT01BS0UoWy1Xbm8tcG9ydGFiaWxpdHkgMS4xNCBuby1kaXN0LWd6aXAgZGlzdC14eiB0YXItdXN0YXIgc3ViZGlyLW9iamVjdHNdKQorCitkbmwgZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTl8qIHZhcmlhYmxlcworQVNfVkVSU0lPTgorCitkbmwgY2hlY2sgaWYgdGhpcyBpcyBhIHJlbGVhc2UgdmVyc2lvbgorQVNfTkFOTyhHU1RfR0lUPSJubyIsIEdTVF9HSVQ9InllcyIpCisKK2RubCBjYW4gYXV0b2NvbmYgZmluZCB0aGUgc291cmNlID8KK0FDX0NPTkZJR19TUkNESVIoW2dzdC9sYXcvYWxhdy5jXSkKKworZG5sIGRlZmluZSB0aGUgb3V0cHV0IGhlYWRlciBmb3IgY29uZmlnCitBQ19DT05GSUdfSEVBREVSUyhbY29uZmlnLmhdKQorCitkbmwgQU1fTUFJTlRBSU5FUl9NT0RFIG9ubHkgcHJvdmlkZXMgdGhlIG9wdGlvbiB0byBjb25maWd1cmUgdG8gZW5hYmxlIGl0CitBTV9NQUlOVEFJTkVSX01PREUoW2VuYWJsZV0pCisKK2RubCBzZXRzIGhvc3RfKiB2YXJpYWJsZXMKK0FDX0NBTk9OSUNBTF9IT1NUCisKK2RubCB1c2UgcHJldHR5IGJ1aWxkIG91dHB1dCB3aXRoIGF1dG9tYWtlID49IDEuMTEKK200X2lmZGVmKFtBTV9TSUxFTlRfUlVMRVNdLFtBTV9TSUxFTlRfUlVMRVMoW3llc10pXSwKKyAgW0FNX0RFRkFVTFRfVkVSQk9TSVRZPTEKKyAgIEFDX1NVQlNUKEFNX0RFRkFVTFRfVkVSQk9TSVRZKV0pCisKK2RubCBvdXIgbGlicmFyaWVzIGFuZCBpbnN0YWxsIGRpcnMgdXNlIEdTVF9BUElfVkVSU0lPTiBpbiB0aGUgZmlsZW5hbWUKK2RubCB0byBhbGxvdyBzaWRlLWJ5LXNpZGUgaW5zdGFsbGF0aW9uIG9mIGRpZmZlcmVudCBBUEkgdmVyc2lvbnMKK0dTVF9BUElfVkVSU0lPTj0xLjAKK0FDX1NVQlNUKEdTVF9BUElfVkVSU0lPTikKK0FDX0RFRklORV9VTlFVT1RFRChHU1RfQVBJX1ZFUlNJT04sICIkR1NUX0FQSV9WRVJTSU9OIiwKKyAgW0dTdHJlYW1lciBBUEkgVmVyc2lvbl0pCisKK0FHX0dTVF9MSUJUT09MX1BSRVBBUkUKK0FTX0xJQlRPT0woR1NULCAxMzAwLCAwLCAxMzAwKQorCitkbmwgKioqIHJlcXVpcmVkIHZlcnNpb25zIG9mIEdTdHJlYW1lciBzdHVmZiAqKioKK0dTVF9SRVE9MS4xMy4wLjEKK0dTVFBCX1JFUT0xLjEzLjAuMQorCitkbmwgKioqIGF1dG90b29scyBzdHVmZiAqKioqCisKK2RubCBhbGxvdyBmb3IgZGlmZmVyZW50IGF1dG90b29scworQVNfQVVUT1RPT0xTX0FMVEVSTkFURQorCitkbmwgQWRkIHBhcmFtZXRlcnMgZm9yIGFjbG9jYWwKK0FDX1NVQlNUKEFDTE9DQUxfQU1GTEFHUywgIi1JIG00IC1JIGNvbW1vbi9tNCIpCisKK2RubCBzZXQgdXAgZ2V0dGV4dAorZG5sIHRoZSB2ZXJzaW9uIGNoZWNrIG5lZWRzIHRvIHN0YXkgaGVyZSBiZWNhdXNlIGF1dG9wb2ludCBncmVwcyBmb3IgaXQKK0FNX0dOVV9HRVRURVhUX1ZFUlNJT04oWzAuMTddKQorQU1fR05VX0dFVFRFWFQoW2V4dGVybmFsXSkKK0FHX0dTVF9HRVRURVhUKFtnc3QtcGx1Z2lucy1nb29kLSRHU1RfQVBJX1ZFUlNJT05dKQorCitkbmwgKioqIGNoZWNrIGZvciBhcmd1bWVudHMgdG8gY29uZmlndXJlICoqKgorCitBR19HU1RfQVJHX0RJU0FCTEVfRkFUQUxfV0FSTklOR1MKK0FHX0dTVF9BUkdfRU5BQkxFX0VYVFJBX0NIRUNLUworCitBR19HU1RfQVJHX0RFQlVHCitBR19HU1RfQVJHX1BST0ZJTElORworQUdfR1NUX0FSR19WQUxHUklORAorQUdfR1NUX0FSR19HQ09WCisKK0FHX0dTVF9BUkdfRVhBTVBMRVMKKworQUdfR1NUX0FSR19XSVRIX1BLR19DT05GSUdfUEFUSAorQUdfR1NUX0FSR19XSVRIX1BBQ0tBR0VfTkFNRQorQUdfR1NUX0FSR19XSVRIX1BBQ0tBR0VfT1JJR0lOCisKK0FHX0dTVF9BUkdfV0lUSF9QTFVHSU5TCisKK0FHX0dTVF9BUkdfRU5BQkxFX0VYVEVSTkFMCisKK0FHX0dTVF9BUkdfRU5BQkxFX0VYUEVSSU1FTlRBTAorCitBR19HU1RfUEtHX0NPTkZJR19QQVRICisKK2RubCAqKiogY2hlY2tzIGZvciBwbGF0Zm9ybSAqKioKKworZG5sICogaGFyZHdhcmUvYXJjaGl0ZWN0dXJlICoKKworZG5sIGNvbW1vbi9tNC9nc3QtYXJjaC5tNAorZG5sIGNoZWNrIENQVSB0eXBlCitBR19HU1RfQVJDSAorCitkbmwgRGV0ZXJtaW5lIGVuZGlhbm5lc3MKK0FDX0NfQklHRU5ESUFOCisKK2RubCAqKiogY2hlY2tzIGZvciBwcm9ncmFtcyAqKioKKworZG5sIGZpbmQgYSBjb21waWxlcgorQUNfUFJPR19DQworQUNfUFJPR19DQ19TVERDCisKK2RubCBkZXRlcm1pbmUgYysrIGNvbXBpbGVyCitBQ19QUk9HX0NYWAorZG5sIGRldGVybWluZSBpZiBjKysgaXMgYXZhaWxhYmxlIG9uIHRoaXMgc3lzdGVtCitBQ19DSEVDS19QUk9HKEhBVkVfQ1hYLCAkQ1hYLCB5ZXMsIG5vKQorCitkbmwgZGV0ZXJtaW5lIGMrKyBwcmVwcm9jZXNzb3IKK2RubCBGSVhNRTogZG8gd2UgbmVlZCB0aGlzID8KK0FDX1BST0dfQ1hYQ1BQCisKK0FDX1BST0dfT0JKQworCitkbmwgY2hlY2sgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzICctYycgYW5kICctbycgb3B0aW9ucworQU1fUFJPR19DQ19DX08KKworZG5sIGZpbmQgYW4gYXNzZW1ibGVyCitBTV9QUk9HX0FTCisKK2RubCBjaGVjayBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgZG8gd2hpbGUoMCkgbWFjcm9zCitBR19HU1RfQ0hFQ0tfRE9XSElMRV9NQUNST1MKKworQUNfUEFUSF9QUk9HKFZBTEdSSU5EX1BBVEgsIHZhbGdyaW5kLCBubykKK0FNX0NPTkRJVElPTkFMKEhBVkVfVkFMR1JJTkQsIHRlc3QgISAieCRWQUxHUklORF9QQVRIIiA9ICJ4bm8iKQorCitkbmwgY2hlY2sgZm9yIGRvY3VtZW50YXRpb24gdG9vbHMKK0dUS19ET0NfQ0hFQ0soWzEuMTJdKQorQUdfR1NUX1BMVUdJTl9ET0NTKFsxLjEyXSkKKworZG5sICoqKiBjaGVja3MgZm9yIGxpYnJhcmllcyAqKioKKworZG5sIGNoZWNrIGZvciBsaWJtLCBmb3Igc2luKCkKK0xUX0xJQl9NCitBQ19TVUJTVChMSUJNKQorCitBQ19DSEVDS19GVU5DUyhjbG9ja19nZXR0aW1lLCBbXSwgWworICBBQ19DSEVDS19MSUIocnQsIGNsb2NrX2dldHRpbWUsIFsKKyAgICBBQ19ERUZJTkUoSEFWRV9DTE9DS19HRVRUSU1FLCAxKQorICAgIExJQlJUPSItbHJ0IgorICAgIEFDX1NVQlNUKFtMSUJSVF0pCisgIF0pCitdKQorCitkbmwgY2hlY2sgZm9yIHB0aHJlYWRzCitBWF9QVEhSRUFECisKK2RubCAqKiogY2hlY2tzIGZvciBoZWFkZXIgZmlsZXMgKioqCisKK2RubCBjaGVjayBpZiB3ZSBoYXZlIEFOU0kgQyBoZWFkZXIgZmlsZXMKK0FDX0hFQURFUl9TVERDCisKK2RubCB1c2VkIGJ5IGV4dC93YXZwYWNrCitBWF9DUkVBVEVfU1RESU5UX0gKKworZG5sIHVzZWQgaW4gZ3N0L3VkcAorQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3RpbWUuaF0pCisKK2RubCB1c2VkIGluIGdzdC91ZHAKK0FDX0NIRUNLX0hFQURFUlMoW3N5cy9zb2NrZXQuaF0pCisKK2RubCAqKiogY2hlY2tzIGZvciB0eXBlcy9kZWZpbmVzICoqKgorCitkbmwgQ2hlY2sgZm9yIEZJT05SRUFEIGlvY3RsIGRlY2xhcmF0aW9uLiAgVGhpcyBjaGVjayBpcyBuZWVkZWQKK2RubCBmb3IgdGhlIFVEUCBwbHVnaW4gdG8gYnVpbGQgb24gU29sYXJpcworR1NUX0NIRUNLX0ZJT05SRUFECisKK2RubCAqKiogY2hlY2tzIGZvciBzdHJ1Y3R1cmVzICoqKgorCitkbmwgKioqIGNoZWNrcyBmb3IgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzICoqKgorCitkbmwgY2hlY2sgaWYgd2UgaGF2ZSBHQ0MgaW5saW5lLWFzbQorQVNfR0NDX0lOTElORV9BU1NFTUJMWShbSEFWRV9HQ0NfQVNNPXllc10sIFtIQVZFX0dDQ19BU009bm9dKQoraWYgdGVzdCB4JEhBVkVfR0NDX0FTTSA9IHh5ZXMgOyB0aGVuCisgIEFDX0RFRklORShIQVZFX0dDQ19BU00sIDEsCisgICAgW0RlZmluZSBpZiBjb21waWxlciBzdXBwb3J0cyBnY2MgaW5saW5lIGFzc2VtYmx5XSkKK2ZpCitBTV9DT05ESVRJT05BTChIQVZFX0dDQ19BU00sIHRlc3QgIngkSEFWRV9HQ0NfQVNNIiA9ICJ4eWVzIikKKworZG5sICoqKiBjaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zICoqKgorCitMSUJTX1NBVkU9JExJQlMKK0xJQlM9IiRMSUJTICRMSUJNIgorQUNfQ0hFQ0tfRlVOQ1MocmludCBzaW5oIGNvc2ggYXNpbmggZnBjbGFzcykKK0xJQlM9JExJQlNfU0FWRQorCitkbmwgQ2hlY2sgd2hldGhlciBpc2luZigpIGlzIGRlZmluZWQgYnkgbWF0aC5oCitBQ19DQUNIRV9DSEVDSyhbZm9yIGlzaW5mXSwgYWNfY3ZfaGF2ZV9pc2luZiwKKyAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbI2luY2x1ZGUgPG1hdGguaD5dXSwgW1tmbG9hdCBmID0gMC4wOyBpbnQgaT1pc2luZihmKV1dKV0sW2FjX2N2X2hhdmVfaXNpbmY9InllcyJdLFthY19jdl9oYXZlX2lzaW5mPSJubyJdKSkKK2lmIHRlc3QgIiRhY19jdl9oYXZlX2lzaW5mIiA9ICJ5ZXMiCit0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfSVNJTkYsIDEsIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGlzaW5mJyBmdW5jdGlvbi5dKQorZmkKKworZG5sIENoZWNrIGZvciBtbWFwIChuZWVkZWQgYnkgZWxlY3RyaWNmZW5jZSBwbHVnaW4pCitBQ19GVU5DX01NQVAKK0FDX0NIRUNLX1NJWkVPRihbb2ZmX3RdKQorQU1fQ09ORElUSU9OQUwoR1NUX0hBVkVfTU1BUCwgdGVzdCAieCRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiA9ICJ4eWVzIikKKworZG5sIENoZWNrIGZvciBtbWFwIChuZWVkZWQgYnkgZWxlY3RyaWNmZW5jZSBwbHVnaW4pCisKK0FDX0NIRUNLX1RZUEUoW3N0cnVjdCBpcF9tcmVxbl0sIFsKKyAgICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfSVBfTVJFUU4sLCBbRGVmaW5lIGlmIHdlIGhhdmUgc3RydWN0IGlwX21yZXFuXSldLCwKKyAgICAgICAgICAgICAgWyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+XSkKKworZG5sICoqKiBjaGVja3MgZm9yIGRlcGVuZGVuY3kgbGlicmFyaWVzICoqKgorCisKK2RubCBHTGliCitHTElCX1JFUT0yLjQwLjAKK0FHX0dTVF9HTElCX0NIRUNLKFskR0xJQl9SRVFdKQorCitkbmwgT3JjCitPUkNfQ0hFQ0soWzAuNC4xN10pCisKK2RubCBjaGVja3MgZm9yIGdzdHJlYW1lcgorZG5sIHVuaW5zdGFsbGVkIGlzIHNlbGVjdGVkIHByZWZlcmVudGlhbGx5IC0tIHNlZSBwa2ctY29uZmlnKDEpCitBR19HU1RfQ0hFQ0tfR1NUKCRHU1RfQVBJX1ZFUlNJT04sIFskR1NUX1JFUV0sIHllcykKK0FHX0dTVF9DSEVDS19HU1RfQkFTRSgkR1NUX0FQSV9WRVJTSU9OLCBbJEdTVF9SRVFdLCB5ZXMpCitBR19HU1RfQ0hFQ0tfR1NUX0NPTlRST0xMRVIoJEdTVF9BUElfVkVSU0lPTiwgWyRHU1RfUkVRXSwgeWVzKQorQUdfR1NUX0NIRUNLX0dTVF9ORVQoJEdTVF9BUElfVkVSU0lPTiwgWyRHU1RfUkVRXSwgeWVzKQorQUdfR1NUX0NIRUNLX0dTVF9DSEVDSygkR1NUX0FQSV9WRVJTSU9OLCBbJEdTVF9SRVFdLCBubykKK0FHX0dTVF9DSEVDS19HU1RfUExVR0lOU19CQVNFKCRHU1RfQVBJX1ZFUlNJT04sIFskR1NUUEJfUkVRXSwgeWVzKQorCitHU1RfVE9PTFNfRElSPWAkUEtHX0NPTkZJRyAtLXZhcmlhYmxlPXRvb2xzZGlyIGdzdHJlYW1lci0kR1NUX0FQSV9WRVJTSU9OYAoraWYgdGVzdCAteiAkR1NUX1RPT0xTX0RJUjsgdGhlbgorICBBQ19NU0dfRVJST1IoW25vIHRvb2xzIGRpciBkZWZpbmVkIGluIEdTdHJlYW1lciBwa2ctY29uZmlnIGZpbGU7IGNvcmUgdXBncmFkZSBuZWVkZWQuXSkKK2ZpCitBQ19TVUJTVChHU1RfVE9PTFNfRElSKQorCitBQ19NU0dfTk9USUNFKFVzaW5nIEdTdHJlYW1lciBDb3JlIFBsdWdpbnMgaW4gJEdTVF9QTFVHSU5TX0RJUikKK0FDX01TR19OT1RJQ0UoVXNpbmcgR1N0cmVhbWVyIEJhc2UgUGx1Z2lucyBpbiAkR1NUUEJfUExVR0lOU19ESVIpCisKK0FNX0NPTkRJVElPTkFMKEhBVkVfR1NUX0NIRUNLLCB0ZXN0ICJ4JEhBVkVfR1NUX0NIRUNLIiA9ICJ4eWVzIikKKworZG5sIENoZWNrIGZvciBkb2N1bWVudGF0aW9uIHhyZWZzCitHTElCX1BSRUZJWD0iYCRQS0dfQ09ORklHIC0tdmFyaWFibGU9cHJlZml4IGdsaWItMi4wYCIKK0dTVF9QUkVGSVg9ImAkUEtHX0NPTkZJRyAtLXZhcmlhYmxlPXByZWZpeCBnc3RyZWFtZXItJEdTVF9BUElfVkVSU0lPTmAiCitHU1RQQl9QUkVGSVg9ImAkUEtHX0NPTkZJRyAtLXZhcmlhYmxlPXByZWZpeCBnc3RyZWFtZXItcGx1Z2lucy1iYXNlLSRHU1RfQVBJX1ZFUlNJT05gIgorQUNfU1VCU1QoR0xJQl9QUkVGSVgpCitBQ19TVUJTVChHU1RfUFJFRklYKQorQUNfU1VCU1QoR1NUUEJfUFJFRklYKQorCitkbmwgR1RLIGlzIG9wdGlvbmFsIGFuZCB1c2VkIGluIGV4YW1wbGVzCitIQVZFX0dUSz1ubworR1RLX1JFUT0zLjAuMAoraWYgdGVzdCAieCRCVUlMRF9FWEFNUExFUyIgPSAieHllcyI7IHRoZW4KKyAgUEtHX0NIRUNLX01PRFVMRVMoR1RLLCBndGsrLTMuMCA+PSAkR1RLX1JFUSwgSEFWRV9HVEs9eWVzLCBIQVZFX0dUSz1ubykKKyAgZG5sIHNvbWUgZXhhbXBsZXMgbmVlZCBndGsrLXgxMQorICBQS0dfQ0hFQ0tfTU9EVUxFUyhHVEtfWDExLCBndGsrLXgxMS0zLjAgPj0gJEdUS19SRVEsIEhBVkVfR1RLX1gxMT15ZXMsIEhBVkVfR1RLX1gxMT1ubykKKyAgQUNfU1VCU1QoR1RLX0xJQlMpCisgIEFDX1NVQlNUKEdUS19DRkxBR1MpCitmaQorQU1fQ09ORElUSU9OQUwoSEFWRV9HVEssIHRlc3QgIngkSEFWRV9HVEsiID0gInh5ZXMiKQorQU1fQ09ORElUSU9OQUwoSEFWRV9HVEtfWDExLCB0ZXN0ICJ4JEhBVkVfR1RLX1gxMSIgPSAieHllcyIpCisKK2RubCBDaGVjayBmb3IgLUJzeW1ib2xpYy1mdW5jdGlvbnMgbGlua2VyIGZsYWcgdXNlZCB0byBhdm9pZAorZG5sIGludHJhLWxpYnJhcnkgUExUIGp1bXBzLCBpZiBhdmFpbGFibGUuCitBQ19BUkdfRU5BQkxFKEJzeW1ib2xpYywKKyAgICAgICAgICAgICAgW0FTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtQnN5bWJvbGljXSxbYXZvaWQgbGlua2luZyB3aXRoIC1Cc3ltYm9saWNdKV0sLAorICAgICAgICAgICAgICBbU0FWRURfTERGTEFHUz0iJHtMREZMQUdTfSIgU0FWRURfTElCUz0iJHtMSUJTfSIKKyAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIC1Cc3ltYm9saWMtZnVuY3Rpb25zIGxpbmtlciBmbGFnXSkKKyAgICAgICAgICAgICAgIExERkxBR1M9LVdsLC1Cc3ltYm9saWMtZnVuY3Rpb25zCisgICAgICAgICAgICAgICBMSUJTPQorICAgICAgICAgICAgICAgQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZV9Cc3ltYm9saWM9eWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZV9Cc3ltYm9saWM9bm8pCisgICAgICAgICAgICAgICBMREZMQUdTPSIke1NBVkVEX0xERkxBR1N9IiBMSUJTPSIke1NBVkVEX0xJQlN9Il0pCisKK2RubCAqKiogc2V0IHZhcmlhYmxlcyBiYXNlZCBvbiBjb25maWd1cmUgYXJndW1lbnRzICoqKgorCitkbmwgc2V0IGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UKK0dTVF9MSUNFTlNFPSJMR1BMIgorQUNfREVGSU5FX1VOUVVPVEVEKEdTVF9MSUNFTlNFLCAiJEdTVF9MSUNFTlNFIiwgW0dTdHJlYW1lciBsaWNlbnNlXSkKK0FDX1NVQlNUKEdTVF9MSUNFTlNFKQorCitkbmwgc2V0IGxvY2F0aW9uIG9mIHBsdWdpbiBkaXJlY3RvcnkKK0FHX0dTVF9TRVRfUExVR0lORElSCisKK2RubCBzZXQgcmVsZWFzZSBkYXRlL3RpbWUKK0FHX0dTVF9TRVRfUEFDS0FHRV9SRUxFQVNFX0RBVEVUSU1FX1dJVEhfTkFOTyhbJFBBQ0tBR0VfVkVSU0lPTl9OQU5PXSwKKyAgWyIke3NyY2Rpcn0vZ3N0LXBsdWdpbnMtZ29vZC5kb2FwIl0sCisgIFskUEFDS0FHRV9WRVJTSU9OX01BSk9SLiRQQUNLQUdFX1ZFUlNJT05fTUlOT1IuJFBBQ0tBR0VfVkVSU0lPTl9NSUNST10pCisKKyMgc2V0IGJ5IEFHX0dTVF9QQVJTRV9TVUJTWVNURU1fRElTQUJMRVMgYWJvdmUKK2RubCBtYWtlIHN1cmUgaXQgZG9lc24ndCBjb21wbGFpbiBhYm91dCB1bnVzZWQgdmFyaWFibGVzIGlmIGRlYnVnZ2luZyBpcyBkaXNhYmxlZAorTk9fV0FSTklOR1M9IiIKK0FHX0dTVF9DSEVDS19HU1RfREVCVUdfRElTQUJMRUQoW05PX1dBUk5JTkdTPSItV25vLXVudXNlZCJdLCBbTk9fV0FSTklOR1M9IiJdKQorCitkbmwgZGVmaW5lIGFuIEVSUk9SX0NGTEFHUyBNYWtlZmlsZSB2YXJpYWJsZQorZG5sIC1XdW5kZWY6IHRvbyBtYW55IGJyb2tlbiBoZWFkZXJzCitBR19HU1RfU0VUX0VSUk9SX0NGTEFHUygkRkFUQUxfV0FSTklOR1MsIFsKKyAgICAgIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdyZWR1bmRhbnQtZGVjbHMKKyAgICAgIC1Xd3JpdGUtc3RyaW5ncyAtV29sZC1zdHlsZS1kZWZpbml0aW9uIC1XYWdncmVnYXRlLXJldHVybgorICAgICAgLVdpbml0LXNlbGYgLVdtaXNzaW5nLWluY2x1ZGUtZGlycyAtV2FkZHJlc3MgLVduby1tdWx0aWNoYXIKKyAgICAgIC1XbmVzdGVkLWV4dGVybnMgJE5PX1dBUk5JTkdTXSkKKworZG5sIGRlZmluZSBhbiBFUlJPUl9DWFhGTEFHUyBNYWtlZmlsZSB2YXJpYWJsZQorQUdfR1NUX1NFVF9FUlJPUl9DWFhGTEFHUygkRkFUQUxfV0FSTklOR1MsIFsKKyAgICAgICAgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3JlZHVuZGFudC1kZWNscworICAgICAgICAtV3dyaXRlLXN0cmluZ3MKKyAgICAgICAgLVdpbml0LXNlbGYgLVdtaXNzaW5nLWluY2x1ZGUtZGlycyAtV2FkZHJlc3MgLVduby1tdWx0aWNoYXIKKyAgICAgICAgJE5PX1dBUk5JTkdTXSkKKworZG5sIGRlZmluZSBhbiBFUlJPUl9PQkpDRkxBR1MgTWFrZWZpbGUgdmFyaWFibGUKK0FHX0dTVF9TRVRfRVJST1JfT0JKQ0ZMQUdTKCRGQVRBTF9XQVJOSU5HUywgWworICAgICAgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV21pc3NpbmctcHJvdG90eXBlcyAtV3JlZHVuZGFudC1kZWNscworICAgICAgLVd3cml0ZS1zdHJpbmdzIC1Xb2xkLXN0eWxlLWRlZmluaXRpb24KKyAgICAgIC1XaW5pdC1zZWxmIC1XbWlzc2luZy1pbmNsdWRlLWRpcnMgLVduby1tdWx0aWNoYXIKKyAgICAgIC1XbmVzdGVkLWV4dGVybnMgJE5PX1dBUk5JTkdTXSkKKworZG5sIGRlZmluZSBjb3JyZWN0IGxldmVsIGZvciBkZWJ1Z2dpbmcgbWVzc2FnZXMKK0FHX0dTVF9TRVRfTEVWRUxfREVGQVVMVCgkR1NUX0dJVCkKKworZG5sIHVzZWQgaW4gZXhhbXBsZXMKK0FHX0dTVF9ERUZBVUxUX0VMRU1FTlRTCisKK2RubCAqKiogcGx1Zy1pbnMgdG8gaW5jbHVkZSAqKioKKworZG5sIHRoZXNlIGFyZSBhbGwgdGhlIGdzdCBwbHVnLWlucywgY29tcGlsYWJsZSB3aXRob3V0IGFkZGl0aW9uYWwgbGlicworZG5sIHZpZGVvZmlsdGVyIGlzIGF0IHRoZSB0b3AgYmVjYXVzZSBvdGhlcnMgZGVwZW5kIG9uIGl0CitBR19HU1RfQ0hFQ0tfUExVR0lOKGFscGhhKQorQUdfR1NUX0NIRUNLX1BMVUdJTihhcGV0YWcpCitBR19HU1RfQ0hFQ0tfUExVR0lOKGF1ZGlvZngpCitBR19HU1RfQ0hFQ0tfUExVR0lOKGF1ZGlvcGFyc2VycykKK0FHX0dTVF9DSEVDS19QTFVHSU4oYXVwYXJzZSkKK0FHX0dTVF9DSEVDS19QTFVHSU4oYXV0b2RldGVjdCkKK0FHX0dTVF9DSEVDS19QTFVHSU4oYXZpKQorQUdfR1NUX0NIRUNLX1BMVUdJTihjdXR0ZXIpCitBR19HU1RfQ0hFQ0tfUExVR0lOKGRlYnVndXRpbHMpCitBR19HU1RfQ0hFQ0tfUExVR0lOKGRlaW50ZXJsYWNlKQorQUdfR1NUX0NIRUNLX1BMVUdJTihkdG1mKQorQUdfR1NUX0NIRUNLX1BMVUdJTihlZmZlY3R2KQorQUdfR1NUX0NIRUNLX1BMVUdJTihlcXVhbGl6ZXIpCitBR19HU1RfQ0hFQ0tfUExVR0lOKGZsdikKK0FHX0dTVF9DSEVDS19QTFVHSU4oZmx4KQorQUdfR1NUX0NIRUNLX1BMVUdJTihnb29tKQorQUdfR1NUX0NIRUNLX1BMVUdJTihnb29tMmsxKQorQUdfR1NUX0NIRUNLX1BMVUdJTihpY3lkZW11eCkKK0FHX0dTVF9DSEVDS19QTFVHSU4oaWQzZGVtdXgpCitBR19HU1RfQ0hFQ0tfUExVR0lOKGltYWdlZnJlZXplKQorQUdfR1NUX0NIRUNLX1BMVUdJTihpbnRlcmxlYXZlKQorQUdfR1NUX0NIRUNLX1BMVUdJTihpc29tcDQpCitBR19HU1RfQ0hFQ0tfUExVR0lOKGxhdykKK0FHX0dTVF9DSEVDS19QTFVHSU4obGV2ZWwpCitBR19HU1RfQ0hFQ0tfUExVR0lOKG1hdHJvc2thKQorQUdfR1NUX0NIRUNLX1BMVUdJTihtb25vc2NvcGUpCitBR19HU1RfQ0hFQ0tfUExVR0lOKG11bHRpZmlsZSkKK0FHX0dTVF9DSEVDS19QTFVHSU4obXVsdGlwYXJ0KQorQUdfR1NUX0NIRUNLX1BMVUdJTihyZXBsYXlnYWluKQorQUdfR1NUX0NIRUNLX1BMVUdJTihydHApCitBR19HU1RfQ0hFQ0tfUExVR0lOKHJ0cG1hbmFnZXIpCitBR19HU1RfQ0hFQ0tfUExVR0lOKHJ0c3ApCitBR19HU1RfQ0hFQ0tfUExVR0lOKHNoYXBld2lwZSkKK0FHX0dTVF9DSEVDS19QTFVHSU4oc21wdGUpCitBR19HU1RfQ0hFQ0tfUExVR0lOKHNwZWN0cnVtKQorQUdfR1NUX0NIRUNLX1BMVUdJTih1ZHApCitBR19HU1RfQ0hFQ0tfUExVR0lOKHZpZGVvYm94KQorQUdfR1NUX0NIRUNLX1BMVUdJTih2aWRlb2Nyb3ApCitBR19HU1RfQ0hFQ0tfUExVR0lOKHZpZGVvZmlsdGVyKQorQUdfR1NUX0NIRUNLX1BMVUdJTih2aWRlb21peGVyKQorQUdfR1NUX0NIRUNLX1BMVUdJTih3YXZlbmMpCitBR19HU1RfQ0hFQ0tfUExVR0lOKHdhdnBhcnNlKQorQUdfR1NUX0NIRUNLX1BMVUdJTih5NG0pCisKK2RubCBkaXNhYmxlIGV4cGVyaW1lbnRhbCBwbHVnLWlucworaWYgdGVzdCAieCRCVUlMRF9FWFBFUklNRU5UQUwiICE9ICJ4eWVzIjsgdGhlbgorICBBR19HU1RfRElTQUJMRV9QTFVHSU4obW9ub3Njb3BlKQorZmkKKworZG5sICoqKiBzeXMgcGx1Zy1pbnMgKioqCisKK2VjaG8KK0FDX01TR19OT1RJQ0UoW0NoZWNraW5nIGxpYnJhcmllcyBmb3IgcGx1Z2lucyBpbiBzeXMvXSkKK2VjaG8KKworZG5sIERpcmVjdFNvdW5kCit0cmFuc2xpdChkbm0sIG0sIGwpIEFNX0NPTkRJVElPTkFMKFVTRV9ESVJFQ1RTT1VORCwgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKERJUkVDVFNPVU5ELCBbRGlyZWN0U291bmQgcGx1Zy1pbl0sIGRpcmVjdHNvdW5kc2luaywgWworICBIQVZFX0RJUkVDVFNPVU5EPSJubyIKKyAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgIHNhdmVfTElCUz0iJExJQlMiCisgIENGTEFHUz0iJENGTEFHUyAkRElSRUNUU09VTkRfQ0ZMQUdTIgorICBMREZMQUdTPSIkTERGTEFHUyAkRElSRUNUU09VTkRfTERGTEFHUyIKKyAgTElCUz0iJExJQlMgLWxkc291bmQgLWxkeGVycjkgLWx1c2VyMzIgLWxvbGUzMiIKKyAgQUNfTVNHX0NIRUNLSU5HKGZvciBEaXJlY3RTb3VuZCBMREZMQUdTKQorICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPGR4ZXJyOS5oPgorI2luY2x1ZGUgPGRzb3VuZC5oPgorXV0sIFtbCisgIERYR2V0RXJyb3JTdHJpbmc5ICgwKTsKKyAgRGlyZWN0U291bmRDcmVhdGUoTlVMTCwgTlVMTCwgTlVMTCk7CisgIENMU0lERnJvbVN0cmluZyhOVUxMLCBOVUxMKTsKK11dKQorXSwKKyAgICBbSEFWRV9ESVJFQ1RTT1VORD0ieWVzIl0sCisgICAgW0hBVkVfRElSRUNUU09VTkQ9Im5vIl0pCisgIEFDX01TR19SRVNVTFQoJEhBVkVfRElSRUNUU09VTkQpCisgIENGTEFHUz0kc2F2ZV9DRkxBR1MKKyAgTERGTEFHUz0kc2F2ZV9MREZMQUdTCisgIExJQlM9JHNhdmVfTElCUworCisgIGlmIHRlc3QgIngkSEFWRV9ESVJFQ1RTT1VORCIgPSAieHllcyI7ICB0aGVuCisgICAgZG5sIHRoaXMgaXMgbXVjaCBtb3JlIHRoYW4gd2Ugd2FudAorICAgIERJUkVDVFNPVU5EX0xJQlM9Ii1sZHNvdW5kIC1sZHhlcnI5IC1sdXNlcjMyIC1sb2xlMzIiCisgICAgQUNfU1VCU1QoRElSRUNUU09VTkRfQ0ZMQUdTKQorICAgIEFDX1NVQlNUKERJUkVDVFNPVU5EX0xERkxBR1MpCisgICAgQUNfU1VCU1QoRElSRUNUU09VTkRfTElCUykKKyAgZmkKKyAgQUNfU1VCU1QoSEFWRV9ESVJFQ1RTT1VORCkKK10pCisKK2RubCAqKiogV2luMzIgV2F2ZU91dCAqKioKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX1dBVkVGT1JNLCB0cnVlKQorQUdfR1NUX0NIRUNLX0ZFQVRVUkUoV0FWRUZPUk0sIFtXaW4zMiBXYXZlRm9ybV0sIHdhdmVmb3Jtc2luaywgWworICBBQ19DSEVDS19IRUFERVIobW1zeXN0ZW0uaCwgSEFWRV9XQVZFRk9STT0ieWVzIiwgSEFWRV9XQVZFRk9STT0ibm8iLCBbI2luY2x1ZGUgPHdpbmRvd3MuaD5dKQorXSkKKworZG5sICoqKiBPU1MgYXVkaW8gKioqIChMaW51eCwgKkJTRCkKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX09TUywgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKE9TUywgW09TUyBhdWRpb10sIG9zc2F1ZGlvLCBbCisgSEFWRV9PU1M9InllcyIKK2RubCBMaW51eCBhbmQgbmV3ZXIgQlNEIHZlcnNpb25zIDoKKyBBQ19DSEVDS19IRUFERVIoc3lzL3NvdW5kY2FyZC5oLCBbCisgICBBQ19ERUZJTkUoSEFWRV9PU1NfSU5DTFVERV9JTl9TWVMsLCBbRGVmaW5lIGlmIE9TUyBpbmNsdWRlcyBhcmUgaW4gL3N5cy9dKQorICAgXSAsIFsKK2RubCBTb21lIG9sZCBCU0QgdmVyc2lvbnMgYW5kIGFsc28gbmV3ZXIgT3BlbkJTRCB2ZXJzaW9ucyA6CisgICBBQ19DSEVDS19IRUFERVIoc291bmRjYXJkLmgsIFsKKyAgICAgQUNfREVGSU5FKEhBVkVfT1NTX0lOQ0xVREVfSU5fUk9PVCwsIFtEZWZpbmUgaWYgT1NTIGluY2x1ZGVzIGFyZSBpbiAvXSkKKyAgICAgXSwgWworICBkbmwgU29tZSBvbGQgQlNEIHZlcnNpb25zIDoKKyAgICAgQUNfQ0hFQ0tfSEVBREVSKG1hY2hpbmUvc291bmRjYXJkLmgsIFsKKyAgICAgICBBQ19ERUZJTkUoSEFWRV9PU1NfSU5DTFVERV9JTl9NQUNISU5FLCwKKyAgICAgICAgIFtEZWZpbmUgaWYgT1NTIGluY2x1ZGVzIGFyZSBpbiAvbWFjaGluZS9dKQorICAgICAgIF0sIFsKKyAgICAgICBIQVZFX09TUz0ibm8iCisgICAgIF0pCisgICBdKQorIF0pCitdKQorCitkbmwgKioqIG9zczQgKioqCit0cmFuc2xpdChkbm0sIG0sIGwpIEFNX0NPTkRJVElPTkFMKFVTRV9PU1M0LCB0cnVlKQorQUdfR1NUX0NIRUNLX0ZFQVRVUkUoT1NTNCwgW09wZW4gU291bmQgU3lzdGVtIDRdLCBvc3M0LCBbCisgIEFDX01TR19DSEVDS0lORyhbQ2hlY2tpbmcgaWYgd2UgY2FuIGJ1aWxkIHRoZSBPU1M0IGVsZW1lbnRzXSkKKyAgQUNfQ0hFQ0tfSEVBREVSUyhbZmNudGwuaCBzeXMvaW9jdGwuaCBzeXMvc3RhdC5oIHN5cy90eXBlcy5oXSwKKyAgICAgIFt0ZXN0IC16ICIkT1NTNF9NSVNTSU5HX0hFQURFUiIgJiYgSEFWRV9PU1M0PSJ5ZXMiXSwKKyAgICAgIFtPU1M0X01JU1NJTkdfSEVBREVSPSJ5ZXMiO0hBVkVfT1NTND0ibm8iXSkKK10pCisKK2RubCAqKiogT1NYIEF1ZGlvICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfT1NYX0FVRElPLCB0cnVlKQorSEFWRV9JT1M9Im5vIgorQUdfR1NUX0NIRUNLX0ZFQVRVUkUoT1NYX0FVRElPLCBbT1NYIGF1ZGlvXSwgb3N4YXVkaW8sIFsKKyAgQUNfQ0hFQ0tfSEVBREVSKENvcmVBdWRpby9Db3JlQXVkaW8uaCwKKyAgICBbSEFWRV9PU1hfQVVESU89InllcyJdLAorICAgIFtBQ19DSEVDS19IRUFERVIoQ29yZUF1ZGlvL0NvcmVBdWRpb1R5cGVzLmgsCisgICAgWworICAgICAgSEFWRV9PU1hfQVVESU89InllcyIKKyAgICAgIEhBVkVfSU9TPSJ5ZXMiCisgICAgXSwgWworICAgICAgSEFWRV9PU1hfQVVESU89Im5vIgorICAgICAgSEFWRV9JT1M9Im5vIgorICAgIF0pXQorICApCitdKQoraWYgdGVzdCAieCRIQVZFX0lPUyIgPSAieHllcyI7IHRoZW4KKyAgQUNfREVGSU5FKEhBVkVfSU9TLCAxLCBbYnVpbGRpbmcgZm9yIGlPUyBwbGF0b2ZybV0pCitmaQorQU1fQ09ORElUSU9OQUwoSEFWRV9JT1MsIHRlc3QgIngkSEFWRV9JT1MiID0gInh5ZXMiKQorCitkbmwgKioqIE9TIFggdmlkZW8gKioqCit0cmFuc2xpdChkbm0sIG0sIGwpIEFNX0NPTkRJVElPTkFMKFVTRV9PU1hfVklERU8sIHRydWUpCitIQVZFX09TWF9WSURFTz0ibm8iCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShPU1hfVklERU8sIFtPU1ggdmlkZW9dLCBvc3h2aWRlb3NpbmssIFsKKyAgQUNfQ0hFQ0tfSEVBREVSKE9wZW5HTC9nbC5oLCBIQVZFX09TWF9WSURFTz0ieWVzIiwgSEFWRV9PU1hfVklERU89Im5vIikKKworICBkbmwgaW4gY2FzZSBoZWFkZXIgT3BlbkdML2dsLmggaXMgZm91bmQgb24gb3RoZXIgcGxhdGZvcm1zIChvciBvbGRlciwgdW5zdXBwb3J0ZWQgT1MgWCkKKyAgZG5sIGFsc28gcmVxdWlyZSBTbm93IExlb3BhcmQgb3IgbmV3ZXIKKworICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisgICAgICAgICNpbmNsdWRlIDxBdmFpbGFiaWxpdHlNYWNyb3MuaD4KKyAgICAgICAgI2lmIE1BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEIDwgMTA2MAorICAgICAgICAjZXJyb3IgVG9vIG9sZCBPU1ggdmVyc2lvbgorICAgICAgICAjZW5kaWYKKyAgICAgIF1dLCBbW3JldHVybiAwO11dKV0sW0hBVkVfT1NYX1ZJREVPPSJ5ZXMiXSxbSEFWRV9PU1hfVklERU89Im5vIl0pCitdKQorCitkbmwgKioqIFZpZGVvIDQgTGludXggMiAqKioKK2RubCByZW5hbWVkIHRvIEdTVF9WNEwyIGJlY2F1c2Ugb2Ygc29tZSBjb25mbGljdCB3aXRoIGtlcm5lbCBoZWFkZXJzCit0cmFuc2xpdChkbm0sIG0sIGwpIEFNX0NPTkRJVElPTkFMKFVTRV9HU1RfVjRMMiwgdHJ1ZSkKK0hBVkVfR1NUX1Y0TDI9bm8KK0FHX0dTVF9DSEVDS19GRUFUVVJFKEdTVF9WNEwyLCBbVmlkZW8gNCBMaW51eCAyXSwgdmlkZW80bGludXgyLCBbCisgIEFDX01TR19DSEVDS0lORyhbQ2hlY2tpbmcgZm9yIHZpZGVvNGxpbnV4MiBoZWFkZXIgLi4uXSkKKyAgQUNfQ0hFQ0tfSEVBREVSKGxpbnV4L3ZpZGVvZGV2Mi5oLCBbIEhBVkVfR1NUX1Y0TDI9eWVzIF0sCisgIFsKKyAgICBBQ19DSEVDS19IRUFERVIoc3lzL3ZpZGVvZGV2Mi5oLCBbIEhBVkVfR1NUX1Y0TDI9eWVzIF0sCisgICAgWworICAgICAgQUNfQ0hFQ0tfSEVBREVSKHN5cy92aWRlb2lvLmgsIFsgSEFWRV9HU1RfVjRMMj15ZXMgXSkKKyAgICBdKQorICBdKQorICBpZiB0ZXN0ICJ4JEhBVkVfVklERU9ERVYiID0gInhubyI7IHRoZW4KKyAgICAgQUNfTVNHX1dBUk4oW3ZpZGVvNGxpbnV4MiB3YXMgbm90IGZvdW5kXSkKKyAgZmkKK10pCisKKyMgT3B0aW9uYWwgZ3VkZXYgZm9yIGRldmljZSBwcm9iaW5nCitBQ19BUkdfV0lUSChbZ3VkZXZdLAorICBBU19IRUxQX1NUUklORyhbLS13aXRoLWd1ZGV2XSxbZGV2aWNlIGRldGVjdGlvbiB3aXRoIGd1ZGV2XSksCisgIFtdLAorICBbd2l0aF9ndWRldj1jaGVja10pCitpZiB0ZXN0IHgkSEFWRV9HU1RfVjRMMiA9IHh5ZXM7IHRoZW4KKyAgaWYgdGVzdCB4JHdpdGhfZ3VkZXYgIT0geG5vOyB0aGVuCisgICAgUEtHX0NIRUNLX01PRFVMRVMoR1VERVYsIFsgZ3VkZXYtMS4wID49IDE0NyBdLAorICAgICAgWyBBQ19ERUZJTkUoSEFWRV9HVURFViwgMSwKKyAgICAgICAgICBbV2hldGhlciBndWRldiBpcyBhdmFpbGFibGUgZm9yIGRldmljZSBkZXRlY3Rpb25dKQorICAgICAgXSwKKyAgICAgIFt0cnVlXSkKKyAgZmkKK2ZpCisKK0FDX1NVQlNUKEdVREVWX0NGTEFHUykKK0FDX1NVQlNUKEdVREVWX0xJQlMpCisKKyMgTWFrZSBsaWJ2NGwyIG5vbi1hdXRvbWFnaWMKK0FDX0FSR19XSVRIKFtsaWJ2NGwyXSwKKyAgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1saWJ2NGwyXSxbc3VwcG9ydCB2aWRlbyBidWZmZXIgY29udmVyc2lvbiB1c2luZyBsaWJ2NGwyXSksCisgIFtdLAorICBbd2l0aF9saWJ2NGwyPWNoZWNrXSkKK2lmIHRlc3QgeCRIQVZFX0dTVF9WNEwyID0geHllczsgdGhlbgorICBpZiB0ZXN0IHgkd2l0aF9saWJ2NGwyICE9IHhubzsgdGhlbgorICAgICAgUEtHX0NIRUNLX01PRFVMRVMoTElCVjRMMiwgbGlidjRsMiwKKyAgICAgICAgICBbIGhhdmVfbGlidjRsMj15ZXMKKyAgICAgICAgICAgIEFDX0RFRklORShIQVZFX0xJQlY0TDIsIDEsCisJICAgICAgICBbV2hldGhlciBsaWJ2NGwyIGlzIGF2YWlsYWJsZSBmb3IgdmlkZW8gYnVmZmVyIGNvbnZlcnNpb25dKQorICAgICAgICAgIF0sIFsKKyAgICAgICAgICBoYXZlX2xpYnY0bDI9bm8KKyAgICAgICAgICBdKQorICBlbHNlCisgICAgaGF2ZV9saWJ2NGwyPW5vCisgIGZpCitmaQorCitkbmwgQWxsb3cgZW5hYmxpbmcgdjRsMiBkZXZpY2UgcHJvYmluZworQVNfQ0FTRShbJGhvc3RdLAorICAgIFsqLSpsaW51eCpdLAorICAgICAgW0FTX0NBU0UoWyRob3N0X2NwdV0sCisgICAgICAgIFthcm0qXSwgWworICAgICAgICAgIGVuYWJsZV92NGwyX3Byb2JlPSJ5ZXMiXSwKKyAgICAgICAgW2FhcmNoNjQqXSwgWworICAgICAgICAgIGVuYWJsZV92NGwyX3Byb2JlPSJ5ZXMiXSldKQorQUNfQVJHX0VOQUJMRSgKKyAgdjRsMi1wcm9iZSwKKyAgQUNfSEVMUF9TVFJJTkcoCisgICAgWy0tZW5hYmxlLXY0bDItcHJvYmVdLAorICAgIFtlbmFibGUgVjRMMiBwbHVnaW4gdG8gcHJvYmUgZGV2aWNlcyBAPDpAZGVmYXVsdD1ub0A6PkBdKSkKK2lmIHRlc3QgIngkZW5hYmxlX3Y0bDJfcHJvYmUiID0gInh5ZXMiOyB0aGVuCisgIEFDX0RFRklORShHU1RfVjRMMl9FTkFCTEVfUFJPQkUsIDEsCisgICAgW0RlZmluZSBpZiBWaWRlbzRMaW51eCBwcm9iZSBzaGFsbCBiZSBydW4gYXQgcGx1Z2luIGxvYWRdKQorZmkKKworZG5sIENoZWNrIGZvciBYMTEKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX1gsIHRydWUpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShYLCBbWCBsaWJyYXJpZXMgYW5kIHBsdWdpbnNdLAorICAgICAgICAgICAgICAgICAgW3hpbWFnZXNyY10sIFsKKyAgUEtHX0NIRUNLX01PRFVMRVMoW1hdLCBbeDExXSwgWworICAgIEhBVkVfWD0ieWVzIgorICAgIGRubCBjaGVjayBmb3IgWGZpeGVzCisgICAgUEtHX0NIRUNLX01PRFVMRVMoW1hGSVhFU10sIFsgeGZpeGVzIF0sIFsKKyAgICAgIEFDX0RFRklORShIQVZFX1hGSVhFUywgMSwgW0RlZmluZWQgaWYgWGZpeGVzIGlzIGF2YWlsYWJsZV0pCisgICAgXSwgWyBIQVZFX1hGSVhFUz0ibm8iIF0pCisKKyAgICBkbmwgY2hlY2sgZm9yIFhkYW1hZ2UKKyAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhbWERBTUFHRV0sIFsgeGRhbWFnZSBdLCBbCisgICAgICBBQ19ERUZJTkUoSEFWRV9YREFNQUdFLCAxLCBbRGVmaW5lZCBpZiBYZGFtYWdlIGlzIGF2YWlsYWJsZV0pCisgICAgXSwgWyBIQVZFX1hEQU1BR0U9Im5vIiBdKQorCisgICAgZG5sIGNoZWNrIGZvciBYIFNobQorICAgIFBLR19DSEVDS19NT0RVTEVTKFtYRVhUXSwgWyB4ZXh0IF0sIFsKKyAgICAgIEFDX0NIRUNLX0xJQihbWGV4dF0sIFsgWFNobUF0dGFjaCBdLCBbCisgICAgICAgIEFDX0RFRklORShIQVZFX1hTSE0sIDEsIFtEZWZpbmVkIGlmIFhTaG0gaXMgYXZhaWxhYmxlXSkKKyAgICAgICAgWFNITV9MSUJTPSIkWEVYVF9MSUJTIgorICAgICAgICBYU0hNX0NGTEFHUz0iJFhFWFRfQ0ZMQUdTIgorICAgICAgXSwgWyBIQVZFX1hFWFQ9Im5vIiBdICwgWyAkWF9MSUJTIF0pCisgICAgXSkKKyAgICBBQ19TVUJTVChYU0hNX0xJQlMpCisgICAgQUNfU1VCU1QoWFNITV9DRkxBR1MpCisgIF0sIFsgSEFWRV9YPSJubyIgXSkKK10pCisKK2RubCAqKiogZXh0IHBsdWctaW5zICoqKgorZG5sIGtlZXAgdGhpcyBsaXN0IHNvcnRlZCBhbHBoYWJldGljYWxseSAhCisKK2lmIHRlc3QgIngkQlVJTERfRVhURVJOQUwiID0gInh5ZXMiOyB0aGVuCisKK2VjaG8KK0FDX01TR19OT1RJQ0UoW0NoZWNraW5nIGxpYnJhcmllcyBmb3IgcGx1Z2lucyBpbiBleHQvXSkKK2VjaG8KKworZG5sICoqKiBhYWxpYiAqKioKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX0FBTElCLCB0cnVlKQorQUdfR1NUX0NIRUNLX0ZFQVRVUkUoQUFMSUIsIFthYWxpYiBBU0NJSSBBcnQgbGlicmFyeV0sIGFhc2luaywgWworICBBTV9QQVRIX0FBTElCKCwgSEFWRV9BQUxJQj15ZXMsIEhBVkVfQUFMSUI9bm8pCitdKQorCitkbmwgKioqIGNhaXJvICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfQ0FJUk8sIHRydWUpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShDQUlSTywgW0NhaXJvIGdyYXBoaWNzIHJlbmRlcmluZyBhbmQgZ29iamVjdCBiaW5kaW5nc10sIGNhaXJvLCBbCisgIEFHX0dTVF9QS0dfQ0hFQ0tfTU9EVUxFUyhDQUlSTywgY2Fpcm8gPj0gMS4xMC4wIGNhaXJvLWdvYmplY3QgPj0gMS4xMC4wKQorXSkKKworZG5sICoqKiBGTEFDICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfRkxBQywgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKEZMQUMsIFtGTEFDIGxvc3NsZXNzIGF1ZGlvXSwgZmxhYywgWworICBBR19HU1RfUEtHX0NIRUNLX01PRFVMRVMoRkxBQywgZmxhYyA+PSAxLjEuNCkKK10pCisKK2RubCAqKiogR0RLIHBpeGJ1ZiAqKioKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX0dES19QSVhCVUYsIHRydWUpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShHREtfUElYQlVGLCBbR0RLIHBpeGJ1Zl0sIGdka3BpeGJ1ZiwgWworICBBR19HU1RfUEtHX0NIRUNLX01PRFVMRVMoR0RLX1BJWEJVRiwgZ2RrLXBpeGJ1Zi0yLjAgPj0gMi44LjApCitdKQorCitkbmwgKioqIEphY2sgKioqCit0cmFuc2xpdChkbm0sIG0sIGwpIEFNX0NPTkRJVElPTkFMKFVTRV9KQUNLLCB0cnVlKQorQUdfR1NUX0NIRUNLX0ZFQVRVUkUoSkFDSywgSmFjaywgamFjaywgWworICBQS0dfQ0hFQ0tfTU9EVUxFUyhKQUNLLCBqYWNrID49IDAuOTkuMTAsIEhBVkVfSkFDSz0ieWVzIiwgSEFWRV9KQUNLPSJubyIpCisgIEFDX1NVQlNUKEpBQ0tfQ0ZMQUdTKQorICBBQ19TVUJTVChKQUNLX0xJQlMpCisKKyAgQUdfR1NUX1BLR19DSEVDS19NT0RVTEVTKEpBQ0tfMF8xMjBfMSwgamFjayA+PSAwLjEyMC4xIGphY2sgPCAxLjApCisgIGlmIHRlc3QgeCRIQVZFX0pBQ0tfMF8xMjBfMSA9IHh5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9KQUNLXzBfMTIwXzEsIDEsIFtkZWZpbmVkIGlmIGphY2sgPj0gMC4xMjAuMSBpcyBhdmFpbGFibGVdKQorICBmaQorICBBR19HU1RfUEtHX0NIRUNLX01PRFVMRVMoSkFDS18xXzlfNywgamFjayA+PSAxLjkuNykKKyAgaWYgdGVzdCB4JEhBVkVfSkFDS18xXzlfNyA9IHh5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9KQUNLXzFfOV83LCAxLCBbZGVmaW5lZCBpZiBqYWNrID49IDEuOS43IGlzIGF2YWlsYWJsZV0pCisgIGZpCisKK10pCisKK2RubCAqKioganBlZyAqKioKK2RubCBGSVhNRTogd2UgY291bGQgdXNlIGhlYWRlciBjaGVja3MgaGVyZSBhcyB3ZWxsIElNTwordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfSlBFRywgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKEpQRUcsIFtqcGVnIGxpYnJhcnldLCBqcGVnLCBbCisgIEFDX0FSR19XSVRIKGpwZWctbW14LAorICAgIFsgIC0td2l0aC1qcGVnLW1teCwgcGF0aCB0byBNTVgnaWZpZWQgSlBFRyBsaWJyYXJ5XSkKKyAgT0xEX0xJQlM9IiRMSUJTIgorICBpZiB0ZXN0IHgkd2l0aF9qcGVnX21teCAhPSB4OyB0aGVuCisgICAgTElCUz0iJExJQlMgLUwkd2l0aF9qcGVnX21teCIKKyAgZmkKKyAgQUNfQ0hFQ0tfTElCKGpwZWctbW14LCBqcGVnX3NldF9kZWZhdWx0cywgSEFWRV9KUEVHPSJ5ZXMiLCBIQVZFX0pQRUc9Im5vIikKKyAgSlBFR19MSUJTPSIkTElCUyAtbGpwZWctbW14IgorICBMSUJTPSIkT0xEX0xJQlMiCisgIGlmIHRlc3QgeCRIQVZFX0pQRUcgIT0geHllczsgdGhlbgorICAgIEFDX0NIRUNLX0xJQihqcGVnLCBqcGVnX3NldF9kZWZhdWx0cywgSEFWRV9KUEVHPSJ5ZXMiLCBIQVZFX0pQRUc9Im5vIikKKyAgICBKUEVHX0xJQlM9Ii1sanBlZyIKKyAgZmkKKyAgQUNfU1VCU1QoSlBFR19MSUJTKQorXSkKKworZG5sICoqKiBsYW1lICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfTEFNRSwgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKExBTUUsIFtsYW1lIG1wMyBlbmNvZGVyIGxpYnJhcnldLCBsYW1lLCBbCisgIEFHX0dTVF9DSEVDS19MSUJIRUFERVIoTEFNRSwgbXAzbGFtZSwgbGFtZV9pbml0LCAkTElCTSwgbGFtZS9sYW1lLmgsCisgIFsKKyAgICBIQVZFX0xBTUU9InllcyIKKyAgICBMQU1FX0xJQlM9Ii1sbXAzbGFtZSAkTElCTSIKKyAgICBkbmwgaXMgbGFtZSBwcmVzZXRzIGF2YWlsYWJsZQorICAgIExBTUVfQ0ZMQUdTPSIiCisgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyNpbmNsdWRlIDxsYW1lL2xhbWUuaD5dXSwgW1sgaW50IHByZXNldCA9IE1FRElVTSBdXSldLFtMQU1FX0NGTEFHUz0iLURHU1RMQU1FX1BSRVNFVCJdLFtMQU1FX0NGTEFHUz0iIgorICAgIF0pCisgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyNpbmNsdWRlIDxsYW1lL2xhbWUuaD5dXSwgW1sKKyAgICAgICAgdm9pZCAqcHRyID0gJmxhbWVfc2V0X1ZCUl9xdWFsaXR5CisgICAgICBdXSldLFtMQU1FX0NGTEFHUz0iJExBTUVfQ0ZMQUdTIC1ESEFWRV9MQU1FX1NFVF9WQlJfUVVBTElUWSJdLFtMQU1FX0NGTEFHUz0iJExBTUVfQ0ZMQUdTIgorICAgIF0pCisgIEFDX1NVQlNUKExBTUVfQ0ZMQUdTKQorICBBQ19TVUJTVChMQU1FX0xJQlMpCisgIF0pCitdKQorCitkbmwgKioqIGxpYmNhY2EgKioqCit0cmFuc2xpdChkbm0sIG0sIGwpIEFNX0NPTkRJVElPTkFMKFVTRV9MSUJDQUNBLCB0cnVlKQorQUdfR1NUX0NIRUNLX0ZFQVRVUkUoTElCQ0FDQSwgW2xpYmNhY2EgY29sb3VyZWQgQVNDSUkgYXJ0XSwgY2FjYXNpbmssIFsKKyAgQUdfR1NUX1BLR19DSEVDS19NT0RVTEVTKExJQkNBQ0EsIGNhY2EpCitdKQorCitkbmwgKioqIGxpYmR2ICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfTElCRFYsIHRydWUpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShMSUJEViwgW2xpYmR2IERWIGRlbXV4ZXIvZGVjb2Rlcl0sIGR2LCBbCisgIEFHX0dTVF9QS0dfQ0hFQ0tfTU9EVUxFUyhMSUJEViwgbGliZHYgPj0gMC4xMDApCitdKQorCitkbmwgKioqIGxpYnBuZyAqKioKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX0xJQlBORywgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKExJQlBORywgW1BvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MgbGlicmFyeV0sIHBuZywgWworICBBR19HU1RfUEtHX0NIRUNLX01PRFVMRVMoTElCUE5HLCBsaWJwbmcgPj0gMS4yKQorICBpZiB0ZXN0ICRIQVZFX0xJQlBORyA9ICJ5ZXMiOyB0aGVuCisgICAgUEtHX0NIRUNLX01PRFVMRVMoTElCUE5HXzFfNSwgbGlicG5nID49IDEuNS4xLCBbCisgICAgICAgIEFDX0RFRklORShIQVZFX0xJQlBOR18xXzUsIDEsIFtEZWZpbmVkIGlmIGxpYnBuZyB2ZXJzaW9uIGlzIDEuNS4xIG9yIG5ld2VyXSkKKyAgICAgIF0sIFt0cnVlXSkKKyAgZmkKK10pCisKK2RubCAqKiogbXBnMTIzICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfTVBHMTIzLCB0cnVlKQorQUdfR1NUX0NIRUNLX0ZFQVRVUkUoTVBHMTIzLCBbbXBnMTIzIGF1ZGlvIGRlY29kZXJdLCBtcGcxMjMsIFsKKyAgUEtHX0NIRUNLX01PRFVMRVMoTVBHMTIzLCBsaWJtcGcxMjMgPj0gMS4xMywgSEFWRV9NUEcxMjM9InllcyIsIEhBVkVfTVBHMTIzPSJubyIpCisgIEFDX1NVQlNUKE1QRzEyM19DRkxBR1MpCisgIEFDX1NVQlNUKE1QRzEyM19MSUJTKQorXSkKKworZG5sICoqKiBwdWxzZWF1ZGlvICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfUFVMU0UsIHRydWUpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShQVUxTRSwgW3B1bHNlYXVkaW8gcGx1Zy1pbl0sIHB1bHNlYXVkaW8sIFsKKworICBkbmwgdXNlZCBpbiBleHQvcHVsc2UvcHVsc2V1dGlsLmMKKyAgQUNfQ0hFQ0tfSEVBREVSUyhbcHJvY2Vzcy5oXSkKKworICBBR19HU1RfUEtHX0NIRUNLX01PRFVMRVMoUFVMU0UsIGxpYnB1bHNlID49IDIuMCkKK10pCisKK2RubCAqKiogZHYxMzk0ICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfRFYxMzk0LCB0cnVlKQorQUdfR1NUX0NIRUNLX0ZFQVRVUkUoRFYxMzk0LCBbcmF3MTM5NCBhbmQgYXZjMTM5NCBsaWJyYXJ5XSwgMTM5NCwgWworICBkbmwgZmlyc3QgdGVzdCBmb3IgbGlicmF3MTM5NCA+PSAyLjAuMAorICBBR19HU1RfUEtHX0NIRUNLX01PRFVMRVMoUkFXMTM5NCwgbGlicmF3MTM5NCA+PSAyLjAuMCkKKyAgQUdfR1NUX1BLR19DSEVDS19NT0RVTEVTKExJQklFQzYxODgzLCBsaWJpZWM2MTg4MyA+PSAxLjAuMCkKKyAgZG5sIG5vdyBzZWUgaG93IGZhciB3ZSBnb3QKKyAgaWYgdGVzdCB4JEhBVkVfUkFXMTM5NCA9IHh5ZXMgJiYgXAorICAgICB0ZXN0IHgkSEFWRV9MSUJJRUM2MTg4MyA9IHh5ZXM7IHRoZW4KKyAgICAgICBBR19HU1RfQ0hFQ0tfTElCSEVBREVSKEFWQzEzOTQsCisgICAgICAgIGF2YzEzOTQsIGF2YzEzOTRfc2VuZF9jb21tYW5kLCAkUkFXMTM5NF9MSUJTLAorCWxpYmF2YzEzOTQvYXZjMTM5NC5oLCBBVkMxMzk0X0xJQlM9Ii1sYXZjMTM5NCIpCisgICAgICAgQUdfR1NUX0NIRUNLX0xJQkhFQURFUihST00xMzk0LAorICAgICAgICByb20xMzk0LCByb20xMzk0X2ZyZWVfZGlyZWN0b3J5LCAkUkFXMTM5NF9MSUJTLAorICAgICAgICBsaWJhdmMxMzk0L3JvbTEzOTQuaCwgUk9NMTM5NF9MSUJTPSItbHJvbTEzOTQiKQorICAgICAgIGlmIHRlc3QgeCRIQVZFX0FWQzEzOTQgPSB4eWVzICYmIFwKKyAgICAgICAgICB0ZXN0IHgkSEFWRV9BVkMxMzk0ID0geHllcyAmJiBcCisJICB0ZXN0IHgkSEFWRV9ST00xMzk0ID0geHllczsgdGhlbgorCSAgSEFWRV9EVjEzOTQ9eWVzCisgICAgICAgICAgRFYxMzk0X0xJQlM9IiRSQVcxMzk0X0xJQlMgJEFWQzEzOTRfTElCUyAkUk9NMTM5NF9MSUJTICRMSUJJRUM2MTg4M19MSUJTIgorICAgICAgICAgIERWMTM5NF9DRkxBR1M9IiRSQVcxMzk0X0NGTEFHUyAkTElCSUVDNjE4ODNfQ0ZMQUdTIC1ESEFWRV9MSUJJRUM2MTg4MyIKKyAgICAgICAgICBBQ19TVUJTVChEVjEzOTRfQ0ZMQUdTKQorICAgICAgICAgIEFDX1NVQlNUKERWMTM5NF9MSUJTKQorCWZpCisgIGVsc2UKKyAgICAgICBpZiB0ZXN0IHgkSEFWRV9SQVcxMzk0ID0geG5vOyB0aGVuCisJICBBR19HU1RfUEtHX0NIRUNLX01PRFVMRVMoUkFXMTM5NCwgbGlicmF3MTM5NCA+PSAxLjEuMCkKKwkgIEFHX0dTVF9DSEVDS19MSUJIRUFERVIoQVZDMTM5NCwKKwkgICBhdmMxMzk0LCBhdmMxMzk0X3NlbmRfY29tbWFuZCwgJFJBVzEzOTRfTElCUywKKwkgICBsaWJhdmMxMzk0L2F2YzEzOTQuaCwgQVZDMTM5NF9MSUJTPSItbGF2YzEzOTQiKQorCSAgQUdfR1NUX0NIRUNLX0xJQkhFQURFUihST00xMzk0LAorCSAgIHJvbTEzOTQsIHJvbTEzOTRfZnJlZV9kaXJlY3RvcnksICRSQVcxMzk0X0xJQlMsCisJICAgbGliYXZjMTM5NC9yb20xMzk0LmgsIFJPTTEzOTRfTElCUz0iLWxyb20xMzk0IikKKyAgICAgICAgICBpZiB0ZXN0IHgkSEFWRV9SQVcxMzk0ID0geHllcyAmJiBcCisJICAgICB0ZXN0IHgkSEFWRV9BVkMxMzk0ID0geHllcyAmJiBcCisJICAgICB0ZXN0IHgkSEFWRV9ST00xMzk0ID0geHllczsgdGhlbgorCSAgICAgSEFWRV9EVjEzOTQ9eWVzCisJICAgICBEVjEzOTRfTElCUz0iJFJBVzEzOTRfTElCUyAkQVZDMTM5NF9MSUJTICRST00xMzk0X0xJQlMiCisJICAgICBEVjEzOTRfQ0ZMQUdTPSIkUkFXMTM5NF9DRkxBR1MiCisJICAgICBpZiB0ZXN0IHgkSEFWRV9MSUJJRUM2MTg4MyA9IHh5ZXM7IHRoZW4KKwkgICAgICAgRFYxMzk0X0NGTEFHUz0iJFJBVzEzOTRfQ0ZMQUdTICRMSUJJRUM2MTg4M19DRkxBR1MgLURIQVZFX0xJQklFQzYxODgzIgorCSAgICAgICBEVjEzOTRfTElCUz0iJERWMTM5NF9MSUJTICRMSUJJRUM2MTg4M19MSUJTIgorCSAgICAgZmkKKyAgICAgICAgICAgICBBQ19TVUJTVChEVjEzOTRfQ0ZMQUdTKQorICAgICAgICAgICAgIEFDX1NVQlNUKERWMTM5NF9MSUJTKQorICAgICAgICAgICBmaQorCSBmaQorICBmaQorXSkKK0FNX0NPTkRJVElPTkFMKFVTRV9MSUJJRUM2MTg4MywgWyB0ZXN0ICJ4JHtIQVZFX0xJQklFQzYxODgzfSIgPSB4eWVzIF0gKQorCitkbmwgKioqIHNob3V0MiAqKioKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX1NIT1VUMiwgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKFNIT1VUMiwgW1Nob3V0Y2FzdC9JY2VjYXN0IGNsaWVudCBsaWJyYXJ5XSwgc2hvdXQyLCBbCisgIEFHX0dTVF9QS0dfQ0hFQ0tfTU9EVUxFUyhTSE9VVDIsIHNob3V0ID49IDIuMCkKK10pCisKK2RubCAqKiogc291cCAqKioKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX1NPVVAsIHRydWUpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShTT1VQLCBbc291cCBodHRwIGNsaWVudCBwbHVnaW4gKDIuNCldLCBzb3VwaHR0cHNyYywgWworICBQS0dfQ0hFQ0tfTU9EVUxFUyhTT1VQLCBsaWJzb3VwLTIuNCA+PSAyLjQ4LCBbSEFWRV9TT1VQPSJ5ZXMiXSwgW0hBVkVfU09VUD0ibm8iXSkKKyAgQUNfU1VCU1QoU09VUF9DRkxBR1MpCisgIEFDX1NVQlNUKFNPVVBfTElCUykKK10pCisKK2RubCAqKiogc3BlZXggKioqCit0cmFuc2xpdChkbm0sIG0sIGwpIEFNX0NPTkRJVElPTkFMKFVTRV9TUEVFWCwgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKFNQRUVYLCBbc3BlZXggc3BlZWNoIGNvZGVjXSwgc3BlZXgsIFsKKyAgQUdfR1NUX1BLR19DSEVDS19NT0RVTEVTKFNQRUVYLCBzcGVleCA+PSAxLjEuNikKK10pCisKK2RubCAqKiogdGFnbGliICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfVEFHTElCLCB0cnVlKQorQUdfR1NUX0NIRUNLX0ZFQVRVUkUoVEFHTElCLCBbdGFnbGliIHRhZ2dpbmcgbGlicmFyeV0sIHRhZ2xpYiwgWworICBBR19HU1RfUEtHX0NIRUNLX01PRFVMRVMoVEFHTElCLCB0YWdsaWIgPj0gMS41KQorICBpZiB0ZXN0ICJ4JEhBVkVfQ1hYIiAhPSAieHllcyI7IHRoZW4KKyAgICBVU0VfVEFHTElCPWZhbHNlCisgICAgQUNfTVNHX05PVElDRShbTm90IGJ1aWxkaW5nIHRhZ2xpYiBwbHVnaW46IG5vIEMrKyBjb21waWxlciBmb3VuZF0pCisgIGVsc2UKKyAgICBkbmwgd29yayBhcm91bmQgYnVnIGluIHRhZ2xpYiAxLjUgaGVhZGVycywgcmVtb3ZlIG9uY2UgdGhlcmUgaXMgYSAxLjYKKyAgICBBU19DWFhfQ09NUElMRVJfRkxBRyhbLVduby1hdHRyaWJ1dGVzXSwgWworICAgICAgICBUQUdMSUJfQ1hYRkxBR1M9IiRUQUdMSUJfQ0ZMQUdTIC1Xbm8tYXR0cmlidXRlcyIKKyAgICAgIF0sIFsKKyAgICAgICAgVEFHTElCX0NYWEZMQUdTPSIkVEFHTElCX0NGTEFHUyIKKyAgICBdKQorICAgIEFDX1NVQlNUKFRBR0xJQl9DWFhGTEFHUykKKyAgZmkKK10pCisKK2RubCAqKiogdHdvbGFtZSAqKioKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX1RXT0xBTUUsIHRydWUpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShUV09MQU1FLCBbdHdvbGFtZV0sIHR3b2xhbWUsIFsKKyAgUEtHX0NIRUNLX01PRFVMRVMoVFdPTEFNRSwgdHdvbGFtZSA+PSAwLjMuMTAsIFsKKyAgICAgIEhBVkVfVFdPTEFNRT0ieWVzIl0sIFsKKyAgICAgIEhBVkVfVFdPTEFNRT0ibm8iCisgIF0pCisgIEFDX1NVQlNUKFRXT0xBTUVfQ0ZMQUdTKQorICBBQ19TVUJTVChUV09MQU1FX0xJQlMpCitdKQorCisKK2RubCAqKiogdnB4ICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfVlBYLCB2cHgpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShWUFgsIFtWUFggZGVjb2Rlcl0sIHZweCwgWworICBQS0dfQ0hFQ0tfTU9EVUxFUyhWUFgsIHZweCA+PSAxLjEuMCwgW0hBVkVfVlBYPSJ5ZXMiXSwgW0hBVkVfVlBYPSJubyJdKQorICBIQVZFX1ZQOD1ubworICBIQVZFX1ZQOT1ubworCisgIGlmIHRlc3QgJEhBVkVfVlBYID0gInllcyI7IHRoZW4KKyAgICBPTERfTElCUz0iJExJQlMiCisgICAgT0xEX0NGTEFHUz0iJENGTEFHUyIKKyAgICBDRkxBR1M9IiRDRkxBR1MgJFZQWF9DRkxBR1MiCisgICAgTElCUz0iJExJQlMgJFZQWF9MSUJTIgorICAgIEFDX0NIRUNLX0xJQih2cHgsIHZweF9jb2RlY192cDhfY3hfYWxnbywgWworICAgICAgSEFWRV9WUDg9eWVzCisgICAgICBBQ19ERUZJTkUoSEFWRV9WUDhfRU5DT0RFUiwgMSwgW0RlZmluZWQgaWYgdGhlIFZQOCBlbmNvZGVyIGlzIGF2YWlsYWJsZV0pCisgICAgXSkKKyAgICBBQ19DSEVDS19MSUIodnB4LCB2cHhfY29kZWNfdnA4X2R4X2FsZ28sIFsKKyAgICAgIEhBVkVfVlA4PXllcworICAgICAgQUNfREVGSU5FKEhBVkVfVlA4X0RFQ09ERVIsIDEsIFtEZWZpbmVkIGlmIHRoZSBWUDggZGVjb2RlciBpcyBhdmFpbGFibGVdKQorICAgIF0pCisKKyAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhWUFhfMTMwLCB2cHggPj0gMS4zLjAsIFsKKyAgICAgIEFDX0NIRUNLX0xJQih2cHgsIHZweF9jb2RlY192cDlfY3hfYWxnbywgWworICAgICAgICBIQVZFX1ZQOT15ZXMKKyAgICAgICAgQUNfREVGSU5FKEhBVkVfVlA5X0VOQ09ERVIsIDEsIFtEZWZpbmVkIGlmIHRoZSBWUDkgZW5jb2RlciBpcyBhdmFpbGFibGVdKQorICAgICAgXSkKKyAgICAgIEFDX0NIRUNLX0xJQih2cHgsIHZweF9jb2RlY192cDlfZHhfYWxnbywgWworICAgICAgICBIQVZFX1ZQOT15ZXMKKyAgICAgICAgQUNfREVGSU5FKEhBVkVfVlA5X0RFQ09ERVIsIDEsIFtEZWZpbmVkIGlmIHRoZSBWUDkgZGVjb2RlciBpcyBhdmFpbGFibGVdKQorICAgICAgXSkKKyAgICBdLCBbdHJ1ZV0pCisKKyAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhWUFhfMTQwLCB2cHggPj0gMS40LjAsIFsKKyAgICAgIEFDX0RFRklORShIQVZFX1ZQWF8xXzQsIDEsIFtEZWZpbmVkIGlmIHRoZSBWUFggbGlicmFyeSB2ZXJzaW9uIGlzIDEuNCBvciBiaWdnZXJdKQorICAgIF0sIFt0cnVlXSkKKworICAgIExJQlM9IiRPTERfTElCUyIKKyAgICBDRkxBR1M9IiRPTERfQ0ZMQUdTIgorICBmaQorICBBQ19TVUJTVChWUFhfTElCUykKKyAgQUNfU1VCU1QoVlBYX0NGTEFHUykKK10pCisKK2RubCAqKiogd2F2cGFjayAqKioKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX1dBVlBBQ0ssIHRydWUpCitBR19HU1RfQ0hFQ0tfRkVBVFVSRShXQVZQQUNLLCBbd2F2cGFjayBwbHVnLWluXSwgd2F2cGFjaywgWworICBBR19HU1RfUEtHX0NIRUNLX01PRFVMRVMoV0FWUEFDSywgd2F2cGFjayA+PSA0LjYwLjApCitdKQorCitkbmwgKioqIHF0ZGVtdXggJiBtYXRyb3NrYSBwcmVmZXIgdG8gaGF2ZSB6bGliICoqKgordHJhbnNsaXQoZG5tLCBtLCBsKSBBTV9DT05ESVRJT05BTChVU0VfWkxJQiwgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKFpMSUIsIFt6bGliIHN1cHBvcnQgZm9yIHF0ZGVtdXgvbWF0cm9za2FdLCwgWworICBBR19HU1RfQ0hFQ0tfTElCSEVBREVSKFpMSUIsCisgICAgeiwgdW5jb21wcmVzcywsIHpsaWIuaCwgWworICAgIEhBVkVfWkxJQj0ieWVzIgorICAgIFpMSUJfTElCUz0iLWx6IgorICAgIEFDX1NVQlNUKFpMSUJfTElCUykKKyAgXSkKK10pCisKK2RubCAqKiogbWF0cm9za2EgcHJlZmVycyB0byBoYXZlIGJ6MiAqKioKK3RyYW5zbGl0KGRubSwgbSwgbCkgQU1fQ09ORElUSU9OQUwoVVNFX0JaMiwgdHJ1ZSkKK0FHX0dTVF9DSEVDS19GRUFUVVJFKEJaMiwgW2J6MiBsaWJyYXJ5IGZvciBtYXRyb3NrYSBdLCwgWworICBzYXZlX0xJQlM9JExJQlMKKyAgTElCUz0iJExJQlMgLWxiejIiCisgIEFDX01TR19DSEVDS0lORyhbZm9yIEJaMl9iemxpYlZlcnNpb24gaW4gLWxiejJdKQorICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbI2luY2x1ZGUgPGJ6bGliLmg+XV0sIFtbY29uc3QgY2hhciAqdmVyc2lvbiA9IEJaMl9iemxpYlZlcnNpb24gKCk7XV0pXSxbSEFWRV9CWjI9eWVzXSxbSEFWRV9CWjI9bm9dKQorICBBQ19NU0dfUkVTVUxUKCRIQVZFX0JaMikKKyAgTElCUz0kc2F2ZV9MSUJTCisgIGlmIHRlc3QgIngkSEFWRV9CWjIiID0gInh5ZXMiOyB0aGVuCisgICAgQloyX0xJQlM9Ii1sYnoyIgorICBmaQorICBBQ19TVUJTVChCWjJfTElCUykKK10pCisKK2Vsc2UKKworZG5sIG5vdCBidWlsZGluZyBwbHVnaW5zIHdpdGggZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLAorZG5sIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHNldCB0aGUgY29uZGl0aW9uYWxzCitBTV9DT05ESVRJT05BTChVU0VfQUFMSUIsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0JaMiwgZmFsc2UpCitBTV9DT05ESVRJT05BTChVU0VfQ0FJUk8sIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0RJUkVDVFNPVU5ELCBmYWxzZSkKK0FNX0NPTkRJVElPTkFMKFVTRV9EVjEzOTQsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0ZMQUMsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0dES19QSVhCVUYsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0pBQ0ssIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0pQRUcsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0xBTUUsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0xJQkNBQ0EsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX0xJQkRWLCBmYWxzZSkKK0FNX0NPTkRJVElPTkFMKFVTRV9MSUJJRUM2MTg4MywgZmFsc2UpCitBTV9DT05ESVRJT05BTChVU0VfTElCUE5HLCBmYWxzZSkKK0FNX0NPTkRJVElPTkFMKFVTRV9NUEcxMjMsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX09TUywgZmFsc2UpCitBTV9DT05ESVRJT05BTChVU0VfT1NTNCwgZmFsc2UpCitBTV9DT05ESVRJT05BTChVU0VfT1NYX0FVRElPLCBmYWxzZSkKK0FNX0NPTkRJVElPTkFMKFVTRV9PU1hfVklERU8sIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX1BVTFNFLCBmYWxzZSkKK0FNX0NPTkRJVElPTkFMKFVTRV9TSE9VVDIsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX1NPVVAsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX1NQRUVYLCBmYWxzZSkKK0FNX0NPTkRJVElPTkFMKFVTRV9UQUdMSUIsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX1RXT0xBTUUsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX1ZQWCwgZmFsc2UpCitBTV9DT05ESVRJT05BTChVU0VfV0FWRUZPUk0sIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX1dBVlBBQ0ssIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX1gsIGZhbHNlKQorQU1fQ09ORElUSU9OQUwoVVNFX1pMSUIsIGZhbHNlKQorCitmaSBkbmwgb2YgRVhUIHBsdWdpbnMKKworZG5sICoqKiBmaW5hbGl6ZSBDRkxBR1MsIExERkxBR1MsIExJQlMKKworZG5sIE92ZXJ2aWV3OgorZG5sIEdTVF9PUFRJT05fQ0ZMQUdTOiAgY29tbW9uIGZsYWdzIGZvciBwcm9maWxpbmcsIGRlYnVnZ2luZywgZXJyb3JzLCAuLi4KK2RubCBHU1RfKjogICAgICAgICAgICAgIGZsYWdzIHNoYXJlZCBieSBhbGwgYnVpbHQgb2JqZWN0cworZG5sIEdTVF9BTExfTERGTEFHUzogICAgbGlua2VyIGZsYWdzIHNoYXJlZCBieSBhbGwKK2RubCBHU1RfTElCX0xERkxBR1M6ICAgIG5vdCBuZWVkZWQsIHdlIGRvbid0IGluc3RhbGwgbGlicmFyaWVzCitkbmwgR1NUX0xUX0xERkxBR1M6ICAgICBsaWJyYXJ5IHZlcnNpb25pbmcgb2Ygb3VyIGxpYnJhcmllcworZG5sIEdTVF9QTFVHSU5fTERGTEFHUzogZmxhZ3MgdG8gYmUgdXNlZCBmb3IgYWxsIHBsdWdpbnMKKworZG5sIEdTVF9PUFRJT05fQ0ZMQUdTCitpZiB0ZXN0ICJ4JFVTRV9ERUJVRyIgPSB4eWVzOyB0aGVuCisgICBQUk9GSUxFX0NGTEFHUz0iLWciCitmaQorQUNfU1VCU1QoUFJPRklMRV9DRkxBR1MpCisKK2lmIHRlc3QgIngkUEFDS0FHRV9WRVJTSU9OX05BTk8iID0gIngxIjsgdGhlbgorICBkbmwgRGVmaW5lIF9vbmx5XyBmb3IgZ2l0IChub3QgcHJlLXJlbGVhc2VzIG9yIHJlbGVhc2VzKQorICBERVBSRUNBVEVEX0NGTEFHUz0iLURHU1RfRElTQUJMRV9ERVBSRUNBVEVEIgorZWxzZQorICBERVBSRUNBVEVEX0NGTEFHUz0iIgorZmkKK0FDX1NVQlNUKERFUFJFQ0FURURfQ0ZMQUdTKQorCitWSVNJQklMSVRZX0NGTEFHUz0iIgorQVNfQ09NUElMRVJfRkxBRyhbLWZ2aXNpYmlsaXR5PWhpZGRlbl0sIFtWSVNJQklMSVRZX0NGTEFHUz0iLWZ2aXNpYmlsaXR5PWhpZGRlbiJdKQorQUNfU1VCU1QoVklTSUJJTElUWV9DRkxBR1MpCisKK1ZJU0lCSUxJVFlfQ1hYRkxBR1M9IiIKK2lmIHRlc3QgIngkSEFWRV9DWFgiID0gInh5ZXMiOyB0aGVuCisgIEFTX0NYWF9DT01QSUxFUl9GTEFHKFstZnZpc2liaWxpdHk9aGlkZGVuXSwgW1ZJU0lCSUxJVFlfQ1hYRkxBR1M9Ii1mdmlzaWJpbGl0eT1oaWRkZW4iXSkKK2ZpCitBQ19TVUJTVChWSVNJQklMSVRZX0NYWEZMQUdTKQorCitkbmwgZGlzYWJsZSBzdHJpY3QgYWxpYXNpbmcKK0FTX0NPTVBJTEVSX0ZMQUcoWy1mbm8tc3RyaWN0LWFsaWFzaW5nXSwgW0VYVFJBX0NGTEFHUz0iLWZuby1zdHJpY3QtYWxpYXNpbmciXSkKK0FDX1NVQlNUKEVYVFJBX0NGTEFHUykKKworZG5sIGV2ZXJ5IGZsYWcgaW4gR1NUX09QVElPTl9DRkxBR1MsIEdTVF9PUFRJT05fQ1hYRkxBR1MgYW5kIEdTVF9PUFRJT05fT0JKQ0ZMQUdTIGNhbiBiZSBvdmVycmlkZGVuCitkbmwgYXQgbWFrZSB0aW1lIHdpdGggZS5nLiBtYWtlIEVSUk9SX0NGTEFHUz0iIgorR1NUX09QVElPTl9DRkxBR1M9IlwkKFdBUk5JTkdfQ0ZMQUdTKSBcJChFUlJPUl9DRkxBR1MpIFwkKERFQlVHX0NGTEFHUykgXCQoUFJPRklMRV9DRkxBR1MpIFwkKEdDT1ZfQ0ZMQUdTKSBcJChPUFRfQ0ZMQUdTKSBcJChERVBSRUNBVEVEX0NGTEFHUykiCitHU1RfT1BUSU9OX0NYWEZMQUdTPSJcJChXQVJOSU5HX0NYWEZMQUdTKSBcJChFUlJPUl9DWFhGTEFHUykgXCQoREVCVUdfQ0ZMQUdTKSBcJChQUk9GSUxFX0NGTEFHUykgXCQoR0NPVl9DRkxBR1MpIFwkKE9QVF9DRkxBR1MpIFwkKERFUFJFQ0FURURfQ0ZMQUdTKSIKK0dTVF9PUFRJT05fT0JKQ0ZMQUdTPSJcJChXQVJOSU5HX09CSkNGTEFHUykgXCQoRVJST1JfT0JKQ0ZMQUdTKSBcJChERUJVR19DRkxBR1MpIFwkKFBST0ZJTEVfQ0ZMQUdTKSBcJChHQ09WX0NGTEFHUykgXCQoT1BUX0NGTEFHUykgXCQoREVQUkVDQVRFRF9DRkxBR1MpIgorQUNfU1VCU1QoR1NUX09QVElPTl9DRkxBR1MpCitBQ19TVUJTVChHU1RfT1BUSU9OX0NYWEZMQUdTKQorQUNfU1VCU1QoR1NUX09QVElPTl9PQkpDRkxBR1MpCisKK2RubCBvdXIgbGlicmFyaWVzIG5lZWQgdG8gYmUgdmVyc2lvbmVkIGNvcnJlY3RseQorQUNfU1VCU1QoR1NUX0xUX0xERkxBR1MpCisKK2RubCBGSVhNRTogZG8gd2Ugd2FudCB0byByZW5hbWUgdG8gR1NUX0FMTF8qID8KK2RubCBwcmVmZXIgaW50ZXJuYWwgaGVhZGVycyB0byBhbHJlYWR5IGluc3RhbGxlZCBvbmVzCitkbmwgYWxzbyBhZGQgYnVpbGRkaXIgaW5jbHVkZSBmb3IgZW51bXR5cGVzIGFuZCBtYXJzaGFsCitkbmwgYWRkIEVSUk9SX0NGTEFHUywgYnV0IG92ZXJyaWRhYmxlCitHU1RfQ0ZMQUdTPSIkR1NUX0NGTEFHUyAtREdTVF9VU0VfVU5TVEFCTEVfQVBJIgorR1NUX0NYWEZMQUdTPSItSVwkKHRvcF9zcmNkaXIpL2dzdC1saWJzICRHU1RfQ0ZMQUdTICRFWFRSQV9DRkxBR1MgJEdMSUJfRVhUUkFfQ0ZMQUdTIFwkKEdTVF9PUFRJT05fQ1hYRkxBR1MpIFwkKFZJU0lCSUxJVFlfQ1hYRkxBR1MpIgorR1NUX09CSkNGTEFHUz0iLUlcJCh0b3Bfc3JjZGlyKS9nc3QtbGlicyAkR1NUX0NGTEFHUyAkRVhUUkFfQ0ZMQUdTICRHTElCX0VYVFJBX0NGTEFHUyBcJChHU1RfT1BUSU9OX09CSkNGTEFHUykiCitHU1RfQ0ZMQUdTPSItSVwkKHRvcF9zcmNkaXIpL2dzdC1saWJzICRHU1RfQ0ZMQUdTICRFWFRSQV9DRkxBR1MgJEdMSUJfRVhUUkFfQ0ZMQUdTIFwkKEdTVF9PUFRJT05fQ0ZMQUdTKSBcJChWSVNJQklMSVRZX0NGTEFHUykiCitBQ19TVUJTVChHU1RfQ0ZMQUdTKQorQUNfU1VCU1QoR1NUX0NYWEZMQUdTKQorQUNfU1VCU1QoR1NUX09CSkNGTEFHUykKK0FDX1NVQlNUKEdTVF9MSUJTKQorCitkbmwgTERGTEFHUyByZWFsbHkgc2hvdWxkIG9ubHkgY29udGFpbiBmbGFncywgbm90IGxpYnMgLSB0aGV5IGdldCBhZGRlZCBiZWZvcmUKK2RubCB3aGF0ZXZlcnRhcmdldF9MSUJTIGFuZCAtTCBmbGFncyBoZXJlIGFmZmVjdCB0aGUgcmVzdCBvZiB0aGUgbGlua2luZworR1NUX0FMTF9MREZMQUdTPSItbm8tdW5kZWZpbmVkIgoraWYgdGVzdCAieCR7ZW5hYmxlX0JzeW1ib2xpY30iID0gInh5ZXMiOyB0aGVuCisgIEdTVF9BTExfTERGTEFHUz0iJEdTVF9BTExfTERGTEFHUyAtV2wsLUJzeW1ib2xpYy1mdW5jdGlvbnMiCitmaQorQUNfU1VCU1QoR1NUX0FMTF9MREZMQUdTKQorCitkbmwgdGhpcyByZWFsbHkgc2hvdWxkIG9ubHkgY29udGFpbiBmbGFncywgbm90IGxpYnMgLSB0aGV5IGdldCBhZGRlZCBiZWZvcmUKK2RubCB3aGF0ZXZlcnRhcmdldF9MSUJTIGFuZCAtTCBmbGFncyBoZXJlIGFmZmVjdCB0aGUgcmVzdCBvZiB0aGUgbGlua2luZworR1NUX1BMVUdJTl9MREZMQUdTPSItbW9kdWxlIC1hdm9pZC12ZXJzaW9uICRHU1RfQUxMX0xERkxBR1MiCitBQ19TVUJTVChHU1RfUExVR0lOX0xERkxBR1MpCisKK2RubCAqKiogb3V0cHV0IGZpbGVzICoqKgorCiskTUtESVJfUCB0ZXN0cy9jaGVjay9vcmMKKworZG5sIGtlZXAgdGhpcyBhbHBoYWJldGljIHBlciBkaXJlY3RvcnksIHBsZWFzZQorQUNfQ09ORklHX0ZJTEVTKAorTWFrZWZpbGUKK2dzdC9NYWtlZmlsZQorZ3N0L2FscGhhL01ha2VmaWxlCitnc3QvYXBldGFnL01ha2VmaWxlCitnc3QvYXVkaW9meC9NYWtlZmlsZQorZ3N0L2F1ZGlvcGFyc2Vycy9NYWtlZmlsZQorZ3N0L2F1cGFyc2UvTWFrZWZpbGUKK2dzdC9hdXRvZGV0ZWN0L01ha2VmaWxlCitnc3QvYXZpL01ha2VmaWxlCitnc3QvY3V0dGVyL01ha2VmaWxlCitnc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUKK2dzdC9kdG1mL01ha2VmaWxlCitnc3QvZGVidWd1dGlscy9NYWtlZmlsZQorZ3N0L2VmZmVjdHYvTWFrZWZpbGUKK2dzdC9lcXVhbGl6ZXIvTWFrZWZpbGUKK2dzdC9mbHYvTWFrZWZpbGUKK2dzdC9nb29tL01ha2VmaWxlCitnc3QvZ29vbTJrMS9NYWtlZmlsZQorZ3N0L2lkM2RlbXV4L01ha2VmaWxlCitnc3QvaWN5ZGVtdXgvTWFrZWZpbGUKK2dzdC9pbWFnZWZyZWV6ZS9NYWtlZmlsZQorZ3N0L2ludGVybGVhdmUvTWFrZWZpbGUKK2dzdC9pc29tcDQvTWFrZWZpbGUKK2dzdC9sYXcvTWFrZWZpbGUKK2dzdC9sZXZlbC9NYWtlZmlsZQorZ3N0L21hdHJvc2thL01ha2VmaWxlCitnc3QvbW9ub3Njb3BlL01ha2VmaWxlCitnc3QvbXVsdGlmaWxlL01ha2VmaWxlCitnc3QvbXVsdGlwYXJ0L01ha2VmaWxlCitnc3QvcmVwbGF5Z2Fpbi9NYWtlZmlsZQorZ3N0L3J0cC9NYWtlZmlsZQorZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUKK2dzdC9ydHNwL01ha2VmaWxlCitnc3Qvc2hhcGV3aXBlL01ha2VmaWxlCitnc3Qvc21wdGUvTWFrZWZpbGUKK2dzdC9zcGVjdHJ1bS9NYWtlZmlsZQorZ3N0L3VkcC9NYWtlZmlsZQorZ3N0L3ZpZGVvYm94L01ha2VmaWxlCitnc3QvdmlkZW9jcm9wL01ha2VmaWxlCitnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUKK2dzdC92aWRlb21peGVyL01ha2VmaWxlCitnc3Qvd2F2ZW5jL01ha2VmaWxlCitnc3Qvd2F2cGFyc2UvTWFrZWZpbGUKK2dzdC9mbHgvTWFrZWZpbGUKK2dzdC95NG0vTWFrZWZpbGUKK2V4dC9NYWtlZmlsZQorZXh0L2FhbGliL01ha2VmaWxlCitleHQvY2Fpcm8vTWFrZWZpbGUKK2V4dC9kdi9NYWtlZmlsZQorZXh0L2ZsYWMvTWFrZWZpbGUKK2V4dC9nZGtfcGl4YnVmL01ha2VmaWxlCitleHQvamFjay9NYWtlZmlsZQorZXh0L2pwZWcvTWFrZWZpbGUKK2V4dC9sYW1lL01ha2VmaWxlCitleHQvbGliY2FjYS9NYWtlZmlsZQorZXh0L2xpYnBuZy9NYWtlZmlsZQorZXh0L21wZzEyMy9NYWtlZmlsZQorZXh0L3B1bHNlL01ha2VmaWxlCitleHQvcmF3MTM5NC9NYWtlZmlsZQorZXh0L3Nob3V0Mi9NYWtlZmlsZQorZXh0L3NvdXAvTWFrZWZpbGUKK2V4dC9zcGVleC9NYWtlZmlsZQorZXh0L3RhZ2xpYi9NYWtlZmlsZQorZXh0L3R3b2xhbWUvTWFrZWZpbGUKK2V4dC92cHgvTWFrZWZpbGUKK2V4dC93YXZwYWNrL01ha2VmaWxlCitzeXMvTWFrZWZpbGUKK3N5cy9kaXJlY3Rzb3VuZC9NYWtlZmlsZQorc3lzL29zcy9NYWtlZmlsZQorc3lzL29zczQvTWFrZWZpbGUKK3N5cy9vc3hhdWRpby9NYWtlZmlsZQorc3lzL29zeHZpZGVvL01ha2VmaWxlCitzeXMvdjRsMi9NYWtlZmlsZQorc3lzL3dhdmVmb3JtL01ha2VmaWxlCitzeXMveGltYWdlL01ha2VmaWxlCitwby9NYWtlZmlsZS5pbgordGVzdHMvTWFrZWZpbGUKK3Rlc3RzL2NoZWNrL01ha2VmaWxlCit0ZXN0cy9leGFtcGxlcy9NYWtlZmlsZQordGVzdHMvZXhhbXBsZXMvYXVkaW9meC9NYWtlZmlsZQordGVzdHMvZXhhbXBsZXMvY2Fpcm8vTWFrZWZpbGUKK3Rlc3RzL2V4YW1wbGVzL2VxdWFsaXplci9NYWtlZmlsZQordGVzdHMvZXhhbXBsZXMvamFjay9NYWtlZmlsZQordGVzdHMvZXhhbXBsZXMvbGV2ZWwvTWFrZWZpbGUKK3Rlc3RzL2V4YW1wbGVzL3J0cC9NYWtlZmlsZQordGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL01ha2VmaWxlCit0ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9NYWtlZmlsZQordGVzdHMvZXhhbXBsZXMvdjRsMi9NYWtlZmlsZQordGVzdHMvZmlsZXMvTWFrZWZpbGUKK3Rlc3RzL2ljbGVzL01ha2VmaWxlCitjb21tb24vTWFrZWZpbGUKK2NvbW1vbi9tNC9NYWtlZmlsZQorbTQvTWFrZWZpbGUKK2RvY3MvTWFrZWZpbGUKK2RvY3MvcGx1Z2lucy9NYWtlZmlsZQorZG9jcy92ZXJzaW9uLmVudGl0aWVzCitwa2djb25maWcvTWFrZWZpbGUKK3BrZ2NvbmZpZy9nc3RyZWFtZXItcGx1Z2lucy1nb29kLXVuaW5zdGFsbGVkLnBjCispCitBQ19PVVRQVVQKKworQUdfR1NUX09VVFBVVF9QTFVHSU5TCitPUkNfT1VUUFVUCisKZGlmZiAtLWdpdCBhL2RvY3MvLmdpdGlnbm9yZSBiL2RvY3MvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWE3YWJlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKK3ZlcnNpb24uZW50aXRpZXMKZGlmZiAtLWdpdCBhL2RvY3MvTWFrZWZpbGUuYW0gYi9kb2NzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZjQxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTkgQEAKK2lmIEVOQUJMRV9HVEtfRE9DCitpZiBFTkFCTEVfUExVR0lOX0RPQ1MKK1BMVUdJTl9ET0NTX0RJUlMgPSBwbHVnaW5zCitlbHNlCitQTFVHSU5fRE9DU19ESVJTID0KK2VuZGlmCitlbHNlCitQTFVHSU5fRE9DU19ESVJTID0gcGx1Z2lucworZW5kaWYKKworU1VCRElSUyA9ICQoUExVR0lOX0RPQ1NfRElSUykKK0RJU1RfU1VCRElSUyA9IHBsdWdpbnMKKworRVhUUkFfRElTVCA9IFwKKyAgICAgICAgcmFuZG9tL0NoYW5nZUxvZy0wLjggXAorICAgICAgICB2ZXJzaW9uLmVudGl0aWVzLmluCisKK3VwbG9hZDoKKwlAaWYgdGVzdCAieCQoU1VCRElSUykiICE9IHg7IHRoZW4gZm9yIGEgaW4gJChTVUJESVJTKTsgZG8gY2QgJCRhOyBtYWtlIHVwbG9hZDsgY2QgLi47IGRvbmU7IGZpCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvLmdpdGlnbm9yZSBiL2RvY3MvcGx1Z2lucy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNzJhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIzIEBACitNYWtlZmlsZQorTWFrZWZpbGUuaW4KKworKi1kZWNsLnR4dAorKi1kZWNsLWxpc3QudHh0CisqLXVuZGVjbGFyZWQudHh0CisqLXVuZG9jdW1lbnRlZC50eHQKKyotdW51c2VkLnR4dAorKi1vdmVycmlkZXMudHh0CisKK2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzLm5ldworZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnNpZ25hbHMubmV3CisKK3RtcGwKK2h0bWwKK3NnbWwKK3htbAorKi5zdGFtcAorKi5iYWsKKworZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNjYW4KK2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zY2FuLmMKK2luc3BlY3QtcmVnaXN0cnkuKgpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtIGIvZG9jcy9wbHVnaW5zL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MmEwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyNDUgQEAKK0dTVF9ET0NfU0NBTk9CSiA9ICQodG9wX3NyY2RpcikvY29tbW9uL2dzdGRvYy1zY2FuZ29iagorCisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgTWFrZWZpbGUuaW4KKworIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlLCBlLmcuICdnbGliJy4KKyNET0NfTU9EVUxFPWdzdC1wbHVnaW5zLWxpYnMtQEdTVF9BUElfVkVSU0lPTkAKK01PRFVMRT1nc3QtcGx1Z2lucy1nb29kCitET0NfTU9EVUxFPSQoTU9EVUxFKS1wbHVnaW5zCisKKyMgZm9yIHVwbG9hZC1kb2MubWFrCitET0M9JChNT0RVTEUpLXBsdWdpbnMKK0ZPUk1BVFM9aHRtbAoraHRtbDogaHRtbC1idWlsZC5zdGFtcAoraW5jbHVkZSAkKHRvcF9zcmNkaXIpL2NvbW1vbi91cGxvYWQtZG9jLm1haworCisjIFRoZSB0b3AtbGV2ZWwgU0dNTCBmaWxlLiBDaGFuZ2UgaXQgaWYgeW91IHdhbnQuCitET0NfTUFJTl9TR01MX0ZJTEU9JChET0NfTU9EVUxFKS1kb2NzLnNnbWwKKworIyBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBjb2RlLgorIyBndGstZG9jIHdpbGwgc2VhcmNoIGFsbCAuYyAmIC5oIGZpbGVzIGJlbmVhdGggaGVyZSBmb3IgaW5saW5lIGNvbW1lbnRzCisjIGRvY3VtZW50aW5nIGZ1bmN0aW9ucyBhbmQgbWFjcm9zLgorRE9DX1NPVVJDRV9ESVIgPSAkKHRvcF9zcmNkaXIpL2dzdCAkKHRvcF9zcmNkaXIpL2V4dCAkKHRvcF9zcmNkaXIpL3N5cworCisjIEV4dHJhIG9wdGlvbnMgdG8gc3VwcGx5IHRvIGd0a2RvYy1zY2FuLgorU0NBTl9PUFRJT05TPQorCisjIEV4dHJhIG9wdGlvbnMgdG8gc3VwcGx5IHRvIGd0a2RvYy1ta2RiLgorTUtEQl9PUFRJT05TPS0tc2dtbC1tb2RlIC0tc291cmNlLXN1ZmZpeGVzPWMsaCxjYworCisjIEV4dHJhIG9wdGlvbnMgdG8gc3VwcGx5IHRvIGd0a2RvYy1maXhyZWYuCitGSVhYUkVGX09QVElPTlM9LS1leHRyYS1kaXI9JChHTElCX1BSRUZJWCkvc2hhcmUvZ3RrLWRvYy9odG1sIFwKKwktLWV4dHJhLWRpcj0kKEdTVF9QUkVGSVgpL3NoYXJlL2d0ay1kb2MvaHRtbCBcCisJLS1leHRyYS1kaXI9JChHU1RQQl9QUkVGSVgpL3NoYXJlL2d0ay1kb2MvaHRtbAorCisjIFVzZWQgZm9yIGRlcGVuZGVuY2llcy4KK0hGSUxFX0dMT0I9IFwKKyAgJCh0b3Bfc3JjZGlyKS9nc3QvKi8qLmggJCh0b3Bfc3JjZGlyKS9leHQvKi8qLmggJCh0b3Bfc3JjZGlyKS9zeXMvKi8qLmgKK0NGSUxFX0dMT0I9IFwKKyAgJCh0b3Bfc3JjZGlyKS9nc3QvKi8qLmMgJCh0b3Bfc3JjZGlyKS9leHQvKi8qLmMgJCh0b3Bfc3JjZGlyKS9zeXMvKi8qLmMgXAorICAkKHRvcF9zcmNkaXIpL2V4dC8qLyouY2MgJCh0b3Bfc3JjZGlyKS9zeXMvKi8qLm0KKworIyBIZWFkZXIgZmlsZXMgdG8gaWdub3JlIHdoZW4gc2Nhbm5pbmcuCitJR05PUkVfSEZJTEVTID0gCitJR05PUkVfQ0ZJTEVTID0KKworIyB3ZSBhZGQgYWxsIC5oIGZpbGVzIG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSBzaWduYWxzL2FyZ3Mgd2Ugd2FudAorIyBzYWRseSB0aGlzIGFsc28gcHVsbHMgaW4gdGhlIHByaXZhdGUgbWV0aG9kcyAtIG1heWJlIHdlIHNob3VsZAorIyBtb3ZlIHRob3NlIGFyb3VuZCBpbiB0aGUgc291cmNlID8KKyMgYWxzbywgd2Ugc2hvdWxkIGFkZCBzb21lIHN0dWZmIGhlcmUgY29uZGl0aW9uYWxseSBiYXNlZCBvbiB3aGV0aGVyCisjIG9yIG5vdCB0aGUgcGx1Z2luIHdpbGwgYWN0dWFsbHkgYnVpbGQKKyMgYnV0IEknbSBub3Qgc3VyZSBhYm91dCB0aGF0IC0gaXQgbWlnaHQgYmUgdGhpcyBKdXN0IFdvcmtzIGdpdmVuIHRoYXQKKyMgdGhlIHJlZ2lzdHJ5IHdvbid0IGhhdmUgdGhlIGVsZW1lbnQKKworRVhUUkFfSEZJTEVTID0gXAorCSQodG9wX3NyY2RpcikvZXh0L2FhbGliL2dzdGFhc2luay5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC9jYWlyby9nc3RjYWlyb292ZXJsYXkuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvZHYvZ3N0ZHZkZWMuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvZHYvZ3N0ZHZkZW11eC5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC9mbGFjL2dzdGZsYWNkZWMuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvZmxhYy9nc3RmbGFjZW5jLmggXAorCSQodG9wX3NyY2RpcikvZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZnNpbmsuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvamFjay9nc3RqYWNrYXVkaW9zcmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmggXAorCSQodG9wX3NyY2RpcikvZXh0L2pwZWcvZ3N0anBlZ2RlYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC9qcGVnL2dzdGpwZWdlbmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvbGFtZS9nc3RsYW1lbXAzZW5jLmggXAorCSQodG9wX3NyY2RpcikvZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvbGlicG5nL2dzdHBuZ2RlYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC9saWJwbmcvZ3N0cG5nZW5jLmggXAorCSQodG9wX3NyY2RpcikvZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmggXAorCSQodG9wX3NyY2RpcikvZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC9zaG91dDIvZ3N0c2hvdXQyLmggXAorCSQodG9wX3NyY2RpcikvZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvdGFnbGliL2dzdGFwZXYybXV4LmggXAorCSQodG9wX3NyY2RpcikvZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC90d29sYW1lL2dzdHR3b2xhbWVtcDJlbmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvcHVsc2UvcHVsc2VzaW5rLmggXAorCSQodG9wX3NyY2RpcikvZXh0L3B1bHNlL3B1bHNlc3JjLmggXAorCSQodG9wX3NyY2RpcikvZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmggXAorCSQodG9wX3NyY2RpcikvZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmggXAorCSQodG9wX3NyY2RpcikvZXh0L3ZweC9nc3R2cDhkZWMuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvdnB4L2dzdHZwOGVuYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaCBcCisJJCh0b3Bfc3JjZGlyKS9leHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2FscGhhL2dzdGFscGhhLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXBldGFnL2dzdGFwZWRlbXV4LmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2F1ZGlvZngvYXVkaW9hbXBsaWZ5LmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXVkaW9meC9hdWRpb2thcmFva2UuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2F1ZGlvZngvYXVkaW9paXJmaWx0ZXIuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXVkaW9wYXJzZXJzL2dzdGFjM3BhcnNlLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9hdWRpb3BhcnNlcnMvZ3N0ZmxhY3BhcnNlLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXZpL2dzdGF2aWRlbXV4LmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2F2aS9nc3RhdmltdXguaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2N1dHRlci9nc3RjdXR0ZXIuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2RlYnVndXRpbHMvZ3N0dGFnaW5qZWN0LmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvZHRtZi9nc3RkdG1mc3JjLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9lZmZlY3R2L2dzdGFnaW5nLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2VmZmVjdHYvZ3N0ZGljZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9lZmZlY3R2L2dzdGVkZ2UuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvZWZmZWN0di9nc3RxdWFyay5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9lZmZlY3R2L2dzdHJldi5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvZWZmZWN0di9nc3R2ZXJ0aWdvLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2VmZmVjdHYvZ3N0d2FycC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9lZmZlY3R2L2dzdHN0cmVhay5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9lZmZlY3R2L2dzdHJpcHBsZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9lZmZlY3R2L2dzdG9wLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIzYmFuZHMuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjEwYmFuZHMuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9mbHYvZ3N0Zmx2ZGVtdXguaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvZmx2L2dzdGZsdm11eC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9mbHgvZ3N0Zmx4ZGVjLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2dvb20vZ3N0Z29vbS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9nb29tMmsxL2dzdGdvb20uaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvbGF3L2FsYXctZGVjb2RlLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2xhdy9hbGF3LWVuY29kZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9sYXcvbXVsYXctZGVjb2RlLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2xhdy9tdWxhdy1lbmNvZGUuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L2xldmVsL2dzdGxldmVsLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmggXAorCSQodG9wX3NyY2RpcikvZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9tYXRyb3NrYS93ZWJtLW11eC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9pc29tcDQvcXRkZW11eC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9pc29tcDQvZ3N0cXRtdXguaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvaXNvbXA0L2dzdHF0bXV4LWRvYy5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvcmVwbGF5Z2Fpbi9nc3RyZ3ZvbHVtZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9ydHAvZ3N0cnRwajJrcGF5LmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3J0cC9nc3RydHBqcGVncGF5LmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvcnRwbWFuYWdlci9nc3RydHBkdG1mbXV4LmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHJlY2VpdmUuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvcnRzcC9nc3RydHBkZWMuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvcnRzcC9nc3RydHNwc3JjLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3Qvc21wdGUvZ3N0c21wdGUuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3VkcC9nc3R1ZHBzcmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvdWRwL2dzdHVkcHNpbmsuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC92aWRlb2Nyb3AvZ3N0YXNwZWN0cmF0aW9jcm9wLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5oIFwKKwkkKHRvcF9zcmNkaXIpL2dzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIycGFkLmggXAorCSQodG9wX3NyY2RpcikvZ3N0L3dhdmVuYy9nc3R3YXZlbmMuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaCBcCisJJCh0b3Bfc3JjZGlyKS9nc3QveTRtL2dzdHk0bWVuY29kZS5oIFwKKwkkKHRvcF9zcmNkaXIpL3N5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuaCBcCisJJCh0b3Bfc3JjZGlyKS9zeXMvb3NzNC9vc3M0LXNpbmsuaCBcCisJJCh0b3Bfc3JjZGlyKS9zeXMvb3NzNC9vc3M0LXNvdXJjZS5oIFwKKwkkKHRvcF9zcmNkaXIpL3N5cy9vc3MvZ3N0b3Nzc2luay5oIFwKKwkkKHRvcF9zcmNkaXIpL3N5cy9vc3MvZ3N0b3Nzc3JjLmggXAorCSQodG9wX3NyY2Rpcikvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmggXAorCSQodG9wX3NyY2Rpcikvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5oIFwKKwkkKHRvcF9zcmNkaXIpL3N5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaCBcCisJJCh0b3Bfc3JjZGlyKS9zeXMvdjRsMi9nc3R2NGwyc3JjLmggXAorCSQodG9wX3NyY2Rpcikvc3lzL3Y0bDIvZ3N0djRsMnNpbmsuaCBcCisJJCh0b3Bfc3JjZGlyKS9zeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmggXAorCSQodG9wX3NyY2Rpcikvc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZGVjLmggXAorCSQodG9wX3NyY2Rpcikvc3lzL3Y0bDIvZ3N0djRsMnJhZGlvLmggXAorCSQodG9wX3NyY2Rpcikvc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5oIFwKKwkkKHRvcF9zcmNkaXIpL3N5cy94aW1hZ2UvZ3N0eGltYWdlc3JjLmgKKworIyBleGFtcGxlIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8geG1sIGFuZCBwbGFjZWQgaW4geG1sLworRVhBTVBMRV9DRklMRVMgPSBcCisJJCh0b3Bfc3JjZGlyKS90ZXN0cy9leGFtcGxlcy9sZXZlbC9sZXZlbC1leGFtcGxlLmMgXAorCSQodG9wX3NyY2RpcikvdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vc3BlY3RydW0tZXhhbXBsZS5jIFwKKwkkKHRvcF9zcmNkaXIpL3Rlc3RzL2V4YW1wbGVzL2F1ZGlvZngvZmlyZmlsdGVyLWV4YW1wbGUuYyBcCisJJCh0b3Bfc3JjZGlyKS90ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L2lpcmZpbHRlci1leGFtcGxlLmMKKworIyBJbWFnZXMgdG8gY29weSBpbnRvIEhUTUwgZGlyZWN0b3J5LgorSFRNTF9JTUFHRVMgPQorCisjIEV4dHJhIFNHTUwgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgJChET0NfTUFJTl9TR01MX0ZJTEUpLgorY29udGVudF9maWxlcyA9CisKKyMgT3RoZXIgZmlsZXMgdG8gZGlzdHJpYnV0ZS4KK2V4dHJhX2ZpbGVzID0KKworIyBDRkxBR1MgYW5kIExERkxBR1MgZm9yIGNvbXBpbGluZyBzY2FuIHByb2dyYW0uIE9ubHkgbmVlZGVkIGlmIHlvdXIgYXBwL2xpYgorIyBjb250YWlucyBHdGtPYmplY3RzL0dPYmplY3RzIGFuZCB5b3Ugd2FudCB0byBkb2N1bWVudCBzaWduYWxzIGFuZCBwcm9wZXJ0aWVzLgorR1RLRE9DX0NGTEFHUyA9ICQoR1NUX0JBU0VfQ0ZMQUdTKSAtSSQodG9wX2J1aWxkZGlyKQorR1RLRE9DX0xJQlMgPSAkKEdTVF9CQVNFX0xJQlMpCisKKyMgSWYgeW91IG5lZWQgdG8gb3ZlcnJpZGUgc29tZSBvZiB0aGUgZGVjbGFyYXRpb25zLCBwbGFjZSB0aGVtIGluIHRoaXMgZmlsZQorIyBhbmQgdW5jb21tZW50IHRoaXMgbGluZS4KKyNET0NfT1ZFUlJJREVTID0gJChET0NfTU9EVUxFKS1vdmVycmlkZXMudHh0CitET0NfT1ZFUlJJREVTID0KKworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2NvbW1vbi9ndGstZG9jLXBsdWdpbnMubWFrCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbCBiL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtZG9jcy5zZ21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MTI4ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLWRvY3Muc2dtbApAQCAtMCwwICsxLDM3NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgYm9vayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIgCisgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjEuMi9kb2Nib29reC5kdGQiIFsKKzwhRU5USVRZICUgbG9jYWwuY29tbW9uLmF0dHJpYiAieG1sbnM6eGkgIENEQVRBICAjRklYRUQgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDMvWEluY2x1ZGUnIj4KKzwhRU5USVRZICUgdmVyc2lvbi1lbnRpdGllcyBTWVNURU0gInZlcnNpb24uZW50aXRpZXMiPgorJXZlcnNpb24tZW50aXRpZXM7CitdPgorCis8Ym9vayBpZD0iaW5kZXgiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzL1hJbmNsdWRlIj4KKyAgPGJvb2tpbmZvPgorICAgIDx0aXRsZT5HU3RyZWFtZXIgR29vZCBQbHVnaW5zICZHU1RfQVBJX1ZFUlNJT047IFBsdWdpbnMgUmVmZXJlbmNlIE1hbnVhbDwvdGl0bGU+CisgICAgPHJlbGVhc2VpbmZvPgorICAgICAgZm9yIEdTdHJlYW1lciBHb29kIFBsdWdpbnMgJkdTVF9BUElfVkVSU0lPTjsgKCZHU1RfVkVSU0lPTjspCisgICAgICBUaGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZCBvbi1saW5lIGF0CisgICAgICA8dWxpbmsgcm9sZT0ib25saW5lLWxvY2F0aW9uIiB1cmw9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RhdGEvZG9jL2dzdHJlYW1lci9oZWFkL2dzdC1wbHVnaW5zLWdvb2QvaHRtbC8iPmh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RhdGEvZG9jL2dzdHJlYW1lci9oZWFkL2dzdC1wbHVnaW5zLWdvb2QvaHRtbC88L3VsaW5rPi4KKyAgICA8L3JlbGVhc2VpbmZvPgorICA8L2Jvb2tpbmZvPgorCisgIDxjaGFwdGVyPgorICAgIDx0aXRsZT5nc3QtcGx1Z2lucy1nb29kIEVsZW1lbnRzPC90aXRsZT4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC0zZ3BwbXV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hYWNwYXJzZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYWFzaW5rLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hYzNwYXJzZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYWdpbmd0di54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYWxhd2RlYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYWxhd2VuYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYWxwaGFjb2xvci54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYWxwaGEueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWFtcnBhcnNlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hcGVkZW11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYXBldjJtdXgueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWFzcGVjdHJhdGlvY3JvcC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYXN0ZXJpc2toMjYzLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hdWRpb2FtcGxpZnkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWF1ZGlvY2hlYmJhbmQueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWF1ZGlvY2hlYmxpbWl0LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hdWRpb2R5bmFtaWMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWF1ZGlvZWNoby54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYXVkaW9maXJmaWx0ZXIueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWF1ZGlvaWlyZmlsdGVyLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hdWRpb2ludmVydC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYXVkaW9rYXJhb2tlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hdWRpb3Bhbm9yYW1hLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hdWRpb3dzaW5jYmFuZC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYXVkaW93c2luY2xpbWl0LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hdXBhcnNlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hdXRvYXVkaW9zaW5rLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1hdXRvYXVkaW9zcmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWF1dG92aWRlb3NpbmsueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWF1dG92aWRlb3NyYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYXZpZGVtdXgueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWF2aW11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtYXZpc3VidGl0bGUueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWJyZWFrbXlkYXRhLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1jYWNhc2luay54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtY2Fpcm9vdmVybGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1jYXBzc2V0dGVyLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1jcHVyZXBvcnQueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWN1dHRlci54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtZGNhcGFyc2UueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWRlaW50ZXJsYWNlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1kZWludGVybGVhdmUueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWRpY2V0di54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtZGlyZWN0c291bmRzaW5rLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1kdG1mc3JjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1kdjEzOTRzcmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWR2ZGVjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1kdmRlbXV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1keW51ZHBzaW5rLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1lZGdldHYueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWVxdWFsaXplci0xMGJhbmRzLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1lcXVhbGl6ZXItM2JhbmRzLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1lcXVhbGl6ZXItbmJhbmRzLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1maXJmaWx0ZXItZXhhbXBsZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtZmxhY2RlYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtZmxhY2VuYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtZmxhY3BhcnNlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1mbGFjdGFnLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1mbHZkZW11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtZmx2bXV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1mbHhkZWMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWdhbW1hLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1nZGtwaXhidWZkZWMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWdka3BpeGJ1Zm92ZXJsYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWdka3BpeGJ1ZnNpbmsueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWdvb20yazEueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWdvb20ueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWhkdjEzOTRzcmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWljeWRlbXV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1pZDNkZW11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtaWQzdjJtdXgueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWlpcmVxdWFsaXplci54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtaWlyZmlsdGVyLWV4YW1wbGUueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWltYWdlZnJlZXplLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1pbnRlcmxlYXZlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1pc21sbXV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1qYWNrYXVkaW9zaW5rLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1qYWNrYXVkaW9zcmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWpwZWdkZWMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWpwZWdlbmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWxhbWVtcDNlbmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWxldmVsLWV4YW1wbGUueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LWxldmVsLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1tYXRyb3NrYWRlbXV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1tYXRyb3NrYW11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtbWF0cm9za2FwYXJzZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtbWoybXV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1tb25vc2NvcGUueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW1wNG11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtbXBlZ2F1ZGlvcGFyc2UueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW1wZzEyM2F1ZGlvZGVjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1tdWxhd2RlYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtbXVsYXdlbmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW11bHRpZmlsZXNpbmsueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW11bHRpZmlsZXNyYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtbXVsdGlwYXJ0ZGVtdXgueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW11bHRpcGFydG11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtbXVsdGl1ZHBzaW5rLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1uYXZpZ2F0aW9udGVzdC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtbmF2c2Vlay54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtb3B0di54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtb3NzNHNpbmsueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW9zczRzcmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW9zc3NpbmsueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LW9zc3NyYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtb3N4YXVkaW9zaW5rLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1vc3hhdWRpb3NyYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtb3N4dmlkZW9zaW5rLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1wbmdkZWMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXBuZ2VuYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcHJvZ3Jlc3NyZXBvcnQueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXB1bHNlc2luay54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcHVsc2VzcmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXB1c2hmaWxlc3JjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1xdGRlbXV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1xdG1vb3ZyZWNvdmVyLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1xdG11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcXVhcmt0di54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcmFkaW9hY3R2LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1yZXZ0di54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcmdhbmFseXNpcy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcmdsaW1pdGVyLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1yZ3ZvbHVtZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcmlwcGxldHYueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJuZGJ1ZmZlcnNpemUueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGFjM2RlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBhYzNwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGFtcmRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBhbXJwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGJpbi54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwYnZkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwYnZwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGNlbHRkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwY2VsdHBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwZGVjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBkdG1mZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGR0bWZtdXgueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGR0bWZzcmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGR2ZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGR2cGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBnNzIyZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGc3MjJwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGc3MjNkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwZzcyM3BheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwZzcyNmRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBnNzI2cGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBnNzI5ZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGc3MjlwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGdzbWRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBnc21wYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGdzdGRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBnc3RwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGgyNjFkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwaDI2MXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwaDI2M2RlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBoMjYzcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBoMjYzcGRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBoMjYzcHBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwaDI2NGRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBoMjY0cGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBoMjY1ZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGgyNjVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGlsYmNkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwaWxiY3BheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwajJrZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGoya3BheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwaml0dGVyYnVmZmVyLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBqcGVnZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGpwZWdwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cGtsdmRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBrbHZwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cEw4ZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cEw4cGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBMMTZkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwTDE2cGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBMMjRkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwTDI0cGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBtcDFzZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cG1wMnRkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwbXAydHBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwbXA0YWRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBtcDRhcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBtcDRnZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cG1wNGdwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cG1wNHZkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwbXA0dnBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwbXBhZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cG1wYXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwbXBhcm9idXN0ZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cG1wdmRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBtcHZwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cG11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwb3B1c2RlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBvcHVzcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBwY21hZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHBjbWFwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHBjbXVkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwcGNtdXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwcHRkZW11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwcWNlbHBkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwcWRtMmRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBydHhxdWV1ZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwcnR4cmVjZWl2ZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwcnR4c2VuZC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwc2JjZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHNiY3BheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwc2Vzc2lvbi54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwc2lyZW5kZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwc2lyZW5wYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHNwZWV4ZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHNwZWV4cGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBzc3JjZGVtdXgueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHN0cmVhbWRlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHBzdHJlYW1wYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHN2M3ZkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwdGhlb3JhZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHRoZW9yYXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwdm9yYmlzZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHZvcmJpc3BheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwdnA4ZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHZwOHBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwdnA5ZGVwYXkueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXJ0cHZwOXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRwdnJhd2RlcGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHB2cmF3cGF5LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1ydHB4cXRkZXBheS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtcnRzcHNyYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtc2JjcGFyc2UueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXNjYWxldGVtcG8ueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXNoYWdhZGVsaWN0di54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtc2hhcGV3aXBlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1zaG91dDJzZW5kLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1zbXB0ZWFscGhhLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1zbXB0ZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtc291cGh0dHBjbGllbnRzaW5rLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1zb3VwaHR0cHNyYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtc3BlY3RydW0tZXhhbXBsZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtc3BlY3RydW0ueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXNwZWV4ZGVjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1zcGVleGVuYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtc3BsaXRmaWxlc3JjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1zcGxpdG11eHNpbmsueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXNwbGl0bXV4c3JjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC1zdHJlYWt0di54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtdGFnaW5qZWN0LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC10ZXN0c2luay54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtdHdvbGFtZW1wMmVuYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtdWRwc2luay54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtdWRwc3JjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC12NGwycmFkaW8ueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXY0bDJzaW5rLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC12NGwyc3JjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC12ZXJ0aWdvdHYueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXZpZGVvYmFsYW5jZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtdmlkZW9ib3gueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXZpZGVvY3JvcC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtdmlkZW9mbGlwLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC12aWRlb21lZGlhbi54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtdmlkZW9taXhlci54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtdnA4ZGVjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC12cDhlbmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXZwOWRlYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtdnA5ZW5jLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC13YXJwdHYueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXdhdmVmb3Jtc2luay54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2VsZW1lbnQtd2F2ZW5jLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC13YXZwYWNrZGVjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC13YXZwYWNrZW5jLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC13YXZwYWNrcGFyc2UueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXdhdnBhcnNlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC13ZWJtbXV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvZWxlbWVudC14aW1hZ2VzcmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9lbGVtZW50LXk0bWVuYy54bWwiIC8+CisgIDwvY2hhcHRlcj4KKworICA8Y2hhcHRlcj4KKyAgICA8dGl0bGU+Z3N0LXBsdWdpbnMtZ29vZCBQbHVnaW5zPC90aXRsZT4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLTEzOTQueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tYWFzaW5rLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWFsYXcueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tYWxwaGFjb2xvci54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1hbHBoYS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1hcGV0YWcueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tYXVkaW9meC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1hdWRpb3BhcnNlcnMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tYXVwYXJzZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1hdXRvZGV0ZWN0LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWF2aS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1jYWNhc2luay54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1jYWlyby54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1jdXR0ZXIueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tZGVidWcueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tZGlyZWN0c291bmQueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tZHRtZi54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1kdi54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1lZmZlY3R2LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWVxdWFsaXplci54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1mbGFjLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWZsdi54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1mbHhkZWMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tZ2RrcGl4YnVmLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWdvb20yazEueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tZ29vbS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1pY3lkZW11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1pZDNkZW11eC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1pbWFnZWZyZWV6ZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1pbnRlcmxlYXZlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWlzb21wNC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1qYWNrLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLWpwZWcueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tbGFtZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1sZXZlbC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1tYXRyb3NrYS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1tb25vc2NvcGUueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tbXBnMTIzLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLW11bGF3LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLW11bHRpZmlsZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1tdWx0aXBhcnQueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tbmF2aWdhdGlvbnRlc3QueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tb3NzNC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1vc3NhdWRpby54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1vc3hhdWRpby54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1vc3h2aWRlby54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1wbmcueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tcHVsc2VhdWRpby54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1yZXBsYXlnYWluLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXJ0cG1hbmFnZXIueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tcnRwLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXJ0c3AueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tc2hhcGV3aXBlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXNob3V0Mi54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1zbXB0ZS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi1zb3VwLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXNwZWN0cnVtLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXNwZWV4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXRhZ2xpYi54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi10d29sYW1lLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXVkcC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi12aWRlbzRsaW51eDIueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tdmlkZW9ib3gueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tdmlkZW9jcm9wLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXZpZGVvZmlsdGVyLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXZpZGVvbWl4ZXIueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9wbHVnaW4tdnB4LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXdhdmVmb3JtLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXdhdmVuYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi13YXZwYWNrLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXdhdnBhcnNlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvcGx1Z2luLXhpbWFnZXNyYy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL3BsdWdpbi15NG1lbmMueG1sIiAvPgorICA8L2NoYXB0ZXI+Cis8L2Jvb2s+CmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dCBiL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMtc2VjdGlvbnMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyM2RiNTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNlY3Rpb25zLnR4dApAQCAtMCwwICsxLDQzNTAgQEAKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC0zZ3BwbXV4PC9GSUxFPgorPFRJVExFPjNncHBtdXg8L1RJVExFPgorR3N0M0dQUE11eAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3QzR1BQTXV4Q2xhc3MKK0dTVF8zX0dQUF9NVVgKK0dTVF8zX0dQUF9NVVhfQ0FTVAorR1NUX0lTXzNfR1BQX01VWAorR1NUXzNfR1BQX01VWF9DTEFTUworR1NUX0lTXzNfR1BQX01VWF9DTEFTUworR1NUX1RZUEVfM19HUFBfTVVYCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0XzNfZ3BwX211eF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYWFzaW5rPC9GSUxFPgorPFRJVExFPmFhc2luazwvVElUTEU+CitHc3RBQVNpbmsKK0dzdEFBU2lua0RpdGhlcmVycworR3N0QUFTaW5rRHJpdmVycworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBQVNpbmtDbGFzcworR1NUX0FBX1NJTksKK0dTVF9BQV9TSU5LX0NBU1QKK0dTVF9JU19BQV9TSU5LCitHU1RfQUFfU0lOS19DTEFTUworR1NUX0lTX0FBX1NJTktfQ0xBU1MKK0dTVF9UWVBFX0FBX1NJTksKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYWFfc2lua19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYWxhd2RlYzwvRklMRT4KKzxUSVRMRT5hbGF3ZGVjPC9USVRMRT4KK0dzdEFMYXdEZWMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0QUxhd0RlY0NsYXNzCitHU1RfQV9MQVdfREVDCitHU1RfQV9MQVdfREVDX0NBU1QKK0dTVF9JU19BX0xBV19ERUMKK0dTVF9BX0xBV19ERUNfQ0xBU1MKK0dTVF9JU19BX0xBV19ERUNfQ0xBU1MKK0dTVF9UWVBFX0FfTEFXX0RFQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hX2xhd19kZWNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWFsYXdlbmM8L0ZJTEU+Cis8VElUTEU+YWxhd2VuYzwvVElUTEU+CitHc3RBTGF3RW5jCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEFMYXdFbmNDbGFzcworR1NUX0FfTEFXX0VOQworR1NUX0FfTEFXX0VOQ19DQVNUCitHU1RfSVNfQV9MQVdfRU5DCitHU1RfQV9MQVdfRU5DX0NMQVNTCitHU1RfSVNfQV9MQVdfRU5DX0NMQVNTCitHU1RfVFlQRV9BX0xBV19FTkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYV9sYXdfZW5jX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hYWNwYXJzZTwvRklMRT4KKzxUSVRMRT5hYWNwYXJzZTwvVElUTEU+CitHc3RBYWNQYXJzZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBYWNQYXJzZUNsYXNzCitHU1RfQUFDX1BBUlNFCitHU1RfQUFDX1BBUlNFX0NBU1QKK0dTVF9JU19BQUNfUEFSU0UKK0dTVF9BQUNfUEFSU0VfQ0xBU1MKK0dTVF9JU19BQUNfUEFSU0VfQ0xBU1MKK0dTVF9UWVBFX0FBQ19QQVJTRQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hYWNfcGFyc2VfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWFjM3BhcnNlPC9GSUxFPgorPFRJVExFPmFjM3BhcnNlPC9USVRMRT4KK0dzdEFjM1BhcnNlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEFjM1BhcnNlQ2xhc3MKK0dTVF9BQzNfUEFSU0UKK0dTVF9BQzNfUEFSU0VfQ0FTVAorR1NUX0lTX0FDM19QQVJTRQorR1NUX0FDM19QQVJTRV9DTEFTUworR1NUX0lTX0FDM19QQVJTRV9DTEFTUworR1NUX1RZUEVfQUMzX1BBUlNFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2FjM19wYXJzZV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYWdpbmd0djwvRklMRT4KKzxUSVRMRT5hZ2luZ3R2PC9USVRMRT4KK0dzdEFnaW5nVFYKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0QWdpbmdUVkNsYXNzCitHU1RfQUdJTkdfVFYKK0dTVF9BR0lOR19UVl9DQVNUCitHU1RfSVNfQUdJTkdfVFYKK0dTVF9BR0lOR19UVl9DTEFTUworR1NUX0lTX0FHSU5HX1RWX0NMQVNTCitHU1RfVFlQRV9BR0lOR19UVgorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hZ2luZ190dl9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYWxwaGE8L0ZJTEU+Cis8VElUTEU+YWxwaGE8L1RJVExFPgorR3N0QWxwaGEKK0dzdEFscGhhTWV0aG9kCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEFscGhhQ2xhc3MKK0dTVF9BTFBIQQorR1NUX0FMUEhBX0NBU1QKK0dTVF9JU19BTFBIQQorR1NUX0FMUEhBX0NMQVNTCitHU1RfSVNfQUxQSEFfQ0xBU1MKK0dTVF9UWVBFX0FMUEhBCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2FscGhhX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hbHBoYWNvbG9yPC9GSUxFPgorPFRJVExFPmFscGhhY29sb3I8L1RJVExFPgorR3N0QWxwaGFDb2xvcgorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBbHBoYUNvbG9yQ2xhc3MKK0dTVF9BTFBIQV9DT0xPUgorR1NUX0FMUEhBX0NPTE9SX0NBU1QKK0dTVF9JU19BTFBIQV9DT0xPUgorR1NUX0FMUEhBX0NPTE9SX0NMQVNTCitHU1RfSVNfQUxQSEFfQ09MT1JfQ0xBU1MKK0dTVF9UWVBFX0FMUEhBX0NPTE9SCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2FscGhhX2NvbG9yX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hbXJwYXJzZTwvRklMRT4KKzxUSVRMRT5hbXJwYXJzZTwvVElUTEU+CitHc3RBbXJQYXJzZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBbXJQYXJzZUNsYXNzCitHU1RfQU1SX1BBUlNFCitHU1RfQU1SX1BBUlNFX0NBU1QKK0dTVF9JU19BTVJfUEFSU0UKK0dTVF9BTVJfUEFSU0VfQ0xBU1MKK0dTVF9JU19BTVJfUEFSU0VfQ0xBU1MKK0dTVF9UWVBFX0FNUl9QQVJTRQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hbXJfcGFyc2VfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWFwZWRlbXV4PC9GSUxFPgorPFRJVExFPmFwZWRlbXV4PC9USVRMRT4KK0dzdEFwZURlbXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEFwZURlbXV4Q2xhc3MKK0dTVF9BUEVfREVNVVgKK0dTVF9BUEVfREVNVVhfQ0FTVAorR1NUX0lTX0FQRV9ERU1VWAorR1NUX0FQRV9ERU1VWF9DTEFTUworR1NUX0lTX0FQRV9ERU1VWF9DTEFTUworR1NUX1RZUEVfQVBFX0RFTVVYCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2FwZV9kZW11eF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYXBldjJtdXg8L0ZJTEU+Cis8VElUTEU+YXBldjJtdXg8L1RJVExFPgorR3N0QXBldjJNdXgKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0QXBldjJNdXhDbGFzcworR1NUX0FQRVYyX01VWAorR1NUX0FQRVYyX01VWF9DQVNUCitHU1RfSVNfQVBFVjJfTVVYCitHU1RfQVBFVjJfTVVYX0NMQVNTCitHU1RfSVNfQVBFVjJfTVVYX0NMQVNTCitHU1RfVFlQRV9BUEVWMl9NVVgKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYXBldjJfbXV4X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hc3BlY3RyYXRpb2Nyb3A8L0ZJTEU+Cis8VElUTEU+YXNwZWN0cmF0aW9jcm9wPC9USVRMRT4KK0dzdEFzcGVjdFJhdGlvQ3JvcAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBc3BlY3RSYXRpb0Nyb3BDbGFzcworR1NUX0FTUEVDVF9SQVRJT19DUk9QCitHU1RfQVNQRUNUX1JBVElPX0NST1BfQ0FTVAorR1NUX0lTX0FTUEVDVF9SQVRJT19DUk9QCitHU1RfQVNQRUNUX1JBVElPX0NST1BfQ0xBU1MKK0dTVF9JU19BU1BFQ1RfUkFUSU9fQ1JPUF9DTEFTUworR1NUX1RZUEVfQVNQRUNUX1JBVElPX0NST1AKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYXNwZWN0X3JhdGlvX2Nyb3BfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWFzdGVyaXNraDI2MzwvRklMRT4KKzxUSVRMRT5hc3Rlcmlza2gyNjM8L1RJVExFPgorR3N0QXN0ZXJpc2toMjYzCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEFzdGVyaXNraDI2M0NsYXNzCitHU1RfQVNURVJJU0tIMjYzCitHU1RfQVNURVJJU0tIMjYzX0NBU1QKK0dTVF9JU19BU1RFUklTS0gyNjMKK0dTVF9BU1RFUklTS0gyNjNfQ0xBU1MKK0dTVF9JU19BU1RFUklTS0gyNjNfQ0xBU1MKK0dTVF9UWVBFX0FTVEVSSVNLSDI2MworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hc3Rlcmlza2gyNjNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWF1cGFyc2U8L0ZJTEU+Cis8VElUTEU+YXVwYXJzZTwvVElUTEU+CitHc3RBdVBhcnNlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEF1UGFyc2VDbGFzcworR1NUX0FVX1BBUlNFCitHU1RfQVVfUEFSU0VfQ0FTVAorR1NUX0lTX0FVX1BBUlNFCitHU1RfQVVfUEFSU0VfQ0xBU1MKK0dTVF9JU19BVV9QQVJTRV9DTEFTUworR1NUX1RZUEVfQVVfUEFSU0UKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYXVfcGFyc2VfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWF1ZGlvYW1wbGlmeTwvRklMRT4KKzxUSVRMRT5hdWRpb2FtcGxpZnk8L1RJVExFPgorR3N0QXVkaW9BbXBsaWZ5CitHc3RBdWRpb0FtcGxpZnlDbGlwcGluZ01ldGhvZAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBdWRpb0FtcGxpZnlDbGFzcworR1NUX0FVRElPX0FNUExJRlkKK0dTVF9BVURJT19BTVBMSUZZX0NBU1QKK0dTVF9JU19BVURJT19BTVBMSUZZCitHU1RfQVVESU9fQU1QTElGWV9DTEFTUworR1NUX0lTX0FVRElPX0FNUExJRllfQ0xBU1MKK0dTVF9UWVBFX0FVRElPX0FNUExJRlkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYXVkaW9fYW1wbGlmeV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYXVkaW9jaGViYmFuZDwvRklMRT4KKzxUSVRMRT5hdWRpb2NoZWJiYW5kPC9USVRMRT4KK0dzdEF1ZGlvQ2hlYkJhbmQKK0dzdEF1ZGlvQ2hlYkJhbmRNb2RlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEF1ZGlvQ2hlYkJhbmRDbGFzcworR1NUX0FVRElPX0NIRUJfQkFORAorR1NUX0FVRElPX0NIRUJfQkFORF9DQVNUCitHU1RfSVNfQVVESU9fQ0hFQl9CQU5ECitHU1RfQVVESU9fQ0hFQl9CQU5EX0NMQVNTCitHU1RfSVNfQVVESU9fQ0hFQl9CQU5EX0NMQVNTCitHU1RfVFlQRV9BVURJT19DSEVCX0JBTkQKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYXVkaW9fY2hlYl9iYW5kX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hdWRpb2NoZWJsaW1pdDwvRklMRT4KKzxUSVRMRT5hdWRpb2NoZWJsaW1pdDwvVElUTEU+CitHc3RBdWRpb0NoZWJMaW1pdAorR3N0QXVkaW9DaGViTGltaXRNb2RlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEF1ZGlvQ2hlYkxpbWl0Q2xhc3MKK0dTVF9BVURJT19DSEVCX0xJTUlUCitHU1RfQVVESU9fQ0hFQl9MSU1JVF9DQVNUCitHU1RfSVNfQVVESU9fQ0hFQl9MSU1JVAorR1NUX0FVRElPX0NIRUJfTElNSVRfQ0xBU1MKK0dTVF9JU19BVURJT19DSEVCX0xJTUlUX0NMQVNTCitHU1RfVFlQRV9BVURJT19DSEVCX0xJTUlUCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2F1ZGlvX2NoZWJfbGltaXRfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWF1ZGlvZHluYW1pYzwvRklMRT4KKzxUSVRMRT5hdWRpb2R5bmFtaWM8L1RJVExFPgorR3N0QXVkaW9EeW5hbWljCitHc3RBdWRpb0R5bmFtaWNDaGFyYWN0ZXJpc3RpY3MKK0dzdEF1ZGlvRHluYW1pY01vZGUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0QXVkaW9EeW5hbWljQ2xhc3MKK0dTVF9BVURJT19EWU5BTUlDCitHU1RfQVVESU9fRFlOQU1JQ19DQVNUCitHU1RfSVNfQVVESU9fRFlOQU1JQworR1NUX0FVRElPX0RZTkFNSUNfQ0xBU1MKK0dTVF9JU19BVURJT19EWU5BTUlDX0NMQVNTCitHU1RfVFlQRV9BVURJT19EWU5BTUlDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2F1ZGlvX2R5bmFtaWNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWF1ZGlvZWNobzwvRklMRT4KKzxUSVRMRT5hdWRpb2VjaG88L1RJVExFPgorR3N0QXVkaW9FY2hvCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEF1ZGlvRWNob0NsYXNzCitHU1RfQVVESU9fRUNITworR1NUX0FVRElPX0VDSE9fQ0FTVAorR1NUX0lTX0FVRElPX0VDSE8KK0dTVF9BVURJT19FQ0hPX0NMQVNTCitHU1RfSVNfQVVESU9fRUNIT19DTEFTUworR1NUX1RZUEVfQVVESU9fRUNITworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hdWRpb19lY2hvX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hdWRpb2ZpcmZpbHRlcjwvRklMRT4KKzxUSVRMRT5hdWRpb2ZpcmZpbHRlcjwvVElUTEU+CitHc3RBdWRpb0ZJUkZpbHRlcgorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBdWRpb0ZJUkZpbHRlckNsYXNzCitHU1RfQVVESU9fRklSX0ZJTFRFUgorR1NUX0FVRElPX0ZJUl9GSUxURVJfQ0FTVAorR1NUX0lTX0FVRElPX0ZJUl9GSUxURVIKK0dTVF9BVURJT19GSVJfRklMVEVSX0NMQVNTCitHU1RfSVNfQVVESU9fRklSX0ZJTFRFUl9DTEFTUworR1NUX1RZUEVfQVVESU9fRklSX0ZJTFRFUgorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hdWRpb19maXJfZmlsdGVyX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hdWRpb2lpcmZpbHRlcjwvRklMRT4KKzxUSVRMRT5hdWRpb2lpcmZpbHRlcjwvVElUTEU+CitHc3RBdWRpb0lJUkZpbHRlcgorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBdWRpb0lJUkZpbHRlckNsYXNzCitHU1RfQVVESU9fSUlSX0ZJTFRFUgorR1NUX0FVRElPX0lJUl9GSUxURVJfQ0FTVAorR1NUX0lTX0FVRElPX0lJUl9GSUxURVIKK0dTVF9BVURJT19JSVJfRklMVEVSX0NMQVNTCitHU1RfSVNfQVVESU9fSUlSX0ZJTFRFUl9DTEFTUworR1NUX1RZUEVfQVVESU9fSUlSX0ZJTFRFUgorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hdWRpb19paXJfZmlsdGVyX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hdWRpb2ludmVydDwvRklMRT4KKzxUSVRMRT5hdWRpb2ludmVydDwvVElUTEU+CitHc3RBdWRpb0ludmVydAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBdWRpb0ludmVydENsYXNzCitHU1RfQVVESU9fSU5WRVJUCitHU1RfQVVESU9fSU5WRVJUX0NBU1QKK0dTVF9JU19BVURJT19JTlZFUlQKK0dTVF9BVURJT19JTlZFUlRfQ0xBU1MKK0dTVF9JU19BVURJT19JTlZFUlRfQ0xBU1MKK0dTVF9UWVBFX0FVRElPX0lOVkVSVAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hdWRpb19pbnZlcnRfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWF1ZGlva2FyYW9rZTwvRklMRT4KKzxUSVRMRT5hdWRpb2thcmFva2U8L1RJVExFPgorR3N0QXVkaW9LYXJhb2tlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEF1ZGlvS2FyYW9rZUNsYXNzCitHU1RfQVVESU9fS0FSQU9LRQorR1NUX0FVRElPX0tBUkFPS0VfQ0FTVAorR1NUX0lTX0FVRElPX0tBUkFPS0UKK0dTVF9BVURJT19LQVJBT0tFX0NMQVNTCitHU1RfSVNfQVVESU9fS0FSQU9LRV9DTEFTUworR1NUX1RZUEVfQVVESU9fS0FSQU9LRQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hdWRpb19rYXJhb2tlX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hdWRpb3Bhbm9yYW1hPC9GSUxFPgorPFRJVExFPmF1ZGlvcGFub3JhbWE8L1RJVExFPgorR3N0QXVkaW9QYW5vcmFtYQorR3N0QXVkaW9QYW5vcmFtYU1ldGhvZAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBdWRpb1Bhbm9yYW1hQ2xhc3MKK0dTVF9BVURJT19QQU5PUkFNQQorR1NUX0FVRElPX1BBTk9SQU1BX0NBU1QKK0dTVF9JU19BVURJT19QQU5PUkFNQQorR1NUX0FVRElPX1BBTk9SQU1BX0NMQVNTCitHU1RfSVNfQVVESU9fUEFOT1JBTUFfQ0xBU1MKK0dTVF9UWVBFX0FVRElPX1BBTk9SQU1BCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2F1ZGlvX3Bhbm9yYW1hX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hdWRpb3dzaW5jYmFuZDwvRklMRT4KKzxUSVRMRT5hdWRpb3dzaW5jYmFuZDwvVElUTEU+CitHc3RBdWRpb1dTaW5jQmFuZAorR3N0QXVkaW9XU2luY0JhbmRNb2RlCitHc3RBdWRpb1dTaW5jQmFuZFdpbmRvdworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBdWRpb1dTaW5jQmFuZENsYXNzCitHU1RfQVVESU9fV19TSU5DX0JBTkQKK0dTVF9BVURJT19XX1NJTkNfQkFORF9DQVNUCitHU1RfSVNfQVVESU9fV19TSU5DX0JBTkQKK0dTVF9BVURJT19XX1NJTkNfQkFORF9DTEFTUworR1NUX0lTX0FVRElPX1dfU0lOQ19CQU5EX0NMQVNTCitHU1RfVFlQRV9BVURJT19XX1NJTkNfQkFORAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hdWRpb193X3NpbmNfYmFuZF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYXVkaW93c2luY2xpbWl0PC9GSUxFPgorPFRJVExFPmF1ZGlvd3NpbmNsaW1pdDwvVElUTEU+CitHc3RBdWRpb1dTaW5jTGltaXQKK0dzdEF1ZGlvV1NpbmNMaW1pdE1vZGUKK0dzdEF1ZGlvV1NpbmNMaW1pdFdpbmRvdworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBdWRpb1dTaW5jTGltaXRDbGFzcworR1NUX0FVRElPX1dfU0lOQ19MSU1JVAorR1NUX0FVRElPX1dfU0lOQ19MSU1JVF9DQVNUCitHU1RfSVNfQVVESU9fV19TSU5DX0xJTUlUCitHU1RfQVVESU9fV19TSU5DX0xJTUlUX0NMQVNTCitHU1RfSVNfQVVESU9fV19TSU5DX0xJTUlUX0NMQVNTCitHU1RfVFlQRV9BVURJT19XX1NJTkNfTElNSVQKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfYXVkaW9fd19zaW5jX2xpbWl0X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hdXRvYXVkaW9zaW5rPC9GSUxFPgorPFRJVExFPmF1dG9hdWRpb3Npbms8L1RJVExFPgorR3N0QXV0b0F1ZGlvU2luaworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBdXRvQXVkaW9TaW5rQ2xhc3MKK0dTVF9BVVRPX0FVRElPX1NJTksKK0dTVF9BVVRPX0FVRElPX1NJTktfQ0FTVAorR1NUX0lTX0FVVE9fQVVESU9fU0lOSworR1NUX0FVVE9fQVVESU9fU0lOS19DTEFTUworR1NUX0lTX0FVVE9fQVVESU9fU0lOS19DTEFTUworR1NUX1RZUEVfQVVUT19BVURJT19TSU5LCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2F1dG9fYXVkaW9fc2lua19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYXV0b2F1ZGlvc3JjPC9GSUxFPgorPFRJVExFPmF1dG9hdWRpb3NyYzwvVElUTEU+CitHc3RBdXRvQXVkaW9TcmMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0QXV0b0F1ZGlvU3JjQ2xhc3MKK0dTVF9BVVRPX0FVRElPX1NSQworR1NUX0FVVE9fQVVESU9fU1JDX0NBU1QKK0dTVF9JU19BVVRPX0FVRElPX1NSQworR1NUX0FVVE9fQVVESU9fU1JDX0NMQVNTCitHU1RfSVNfQVVUT19BVURJT19TUkNfQ0xBU1MKK0dTVF9UWVBFX0FVVE9fQVVESU9fU1JDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2F1dG9fYXVkaW9fc3JjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hdXRvdmlkZW9zaW5rPC9GSUxFPgorPFRJVExFPmF1dG92aWRlb3Npbms8L1RJVExFPgorR3N0QXV0b1ZpZGVvU2luaworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBdXRvVmlkZW9TaW5rQ2xhc3MKK0dTVF9BVVRPX1ZJREVPX1NJTksKK0dTVF9BVVRPX1ZJREVPX1NJTktfQ0FTVAorR1NUX0lTX0FVVE9fVklERU9fU0lOSworR1NUX0FVVE9fVklERU9fU0lOS19DTEFTUworR1NUX0lTX0FVVE9fVklERU9fU0lOS19DTEFTUworR1NUX1RZUEVfQVVUT19WSURFT19TSU5LCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2F1dG9fdmlkZW9fc2lua19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtYXV0b3ZpZGVvc3JjPC9GSUxFPgorPFRJVExFPmF1dG92aWRlb3NyYzwvVElUTEU+CitHc3RBdXRvVmlkZW9TcmMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0QXV0b1ZpZGVvU3JjQ2xhc3MKK0dTVF9BVVRPX1ZJREVPX1NSQworR1NUX0FVVE9fVklERU9fU1JDX0NBU1QKK0dTVF9JU19BVVRPX1ZJREVPX1NSQworR1NUX0FVVE9fVklERU9fU1JDX0NMQVNTCitHU1RfSVNfQVVUT19WSURFT19TUkNfQ0xBU1MKK0dTVF9UWVBFX0FVVE9fVklERU9fU1JDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2F1dG9fdmlkZW9fc3JjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hdmlkZW11eDwvRklMRT4KKzxUSVRMRT5hdmlkZW11eDwvVElUTEU+CitHc3RBdmlEZW11eAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBdmlEZW11eENsYXNzCitHU1RfQVZJX0RFTVVYCitHU1RfQVZJX0RFTVVYX0NBU1QKK0dTVF9JU19BVklfREVNVVgKK0dTVF9BVklfREVNVVhfQ0xBU1MKK0dTVF9JU19BVklfREVNVVhfQ0xBU1MKK0dTVF9UWVBFX0FWSV9ERU1VWAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hdmlfZGVtdXhfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWF2aW11eDwvRklMRT4KKzxUSVRMRT5hdmltdXg8L1RJVExFPgorR3N0QXZpTXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEF2aU11eENsYXNzCitHU1RfQVZJX01VWAorR1NUX0FWSV9NVVhfQ0FTVAorR1NUX0lTX0FWSV9NVVgKK0dTVF9BVklfTVVYX0NMQVNTCitHU1RfSVNfQVZJX01VWF9DTEFTUworR1NUX1RZUEVfQVZJX01VWAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hdmlfbXV4X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1hdmlzdWJ0aXRsZTwvRklMRT4KKzxUSVRMRT5hdmlzdWJ0aXRsZTwvVElUTEU+CitHc3RBdmlTdWJ0aXRsZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RBdmlTdWJ0aXRsZUNsYXNzCitHU1RfQVZJX1NVQlRJVExFCitHU1RfQVZJX1NVQlRJVExFX0NBU1QKK0dTVF9JU19BVklfU1VCVElUTEUKK0dTVF9BVklfU1VCVElUTEVfQ0xBU1MKK0dTVF9JU19BVklfU1VCVElUTEVfQ0xBU1MKK0dTVF9UWVBFX0FWSV9TVUJUSVRMRQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9hdmlfc3VidGl0bGVfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWJyZWFrbXlkYXRhPC9GSUxFPgorPFRJVExFPmJyZWFrbXlkYXRhPC9USVRMRT4KK0dzdEJyZWFrTXlEYXRhCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEJyZWFrTXlEYXRhQ2xhc3MKK0dTVF9CUkVBS19NWV9EQVRBCitHU1RfQlJFQUtfTVlfREFUQV9DQVNUCitHU1RfSVNfQlJFQUtfTVlfREFUQQorR1NUX0JSRUFLX01ZX0RBVEFfQ0xBU1MKK0dTVF9JU19CUkVBS19NWV9EQVRBX0NMQVNTCitHU1RfVFlQRV9CUkVBS19NWV9EQVRBCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2JyZWFrX215X2RhdGFfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWNhY2FzaW5rPC9GSUxFPgorPFRJVExFPmNhY2FzaW5rPC9USVRMRT4KK0dzdENBQ0FTaW5rCitHc3RDQUNBU2lua0RpdGhlcmluZworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RDQUNBU2lua0NsYXNzCitHU1RfQ0FDQV9TSU5LCitHU1RfQ0FDQV9TSU5LX0NBU1QKK0dTVF9JU19DQUNBX1NJTksKK0dTVF9DQUNBX1NJTktfQ0xBU1MKK0dTVF9JU19DQUNBX1NJTktfQ0xBU1MKK0dTVF9UWVBFX0NBQ0FfU0lOSworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9jYWNhX3NpbmtfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWNhaXJvb3ZlcmxheTwvRklMRT4KKzxUSVRMRT5jYWlyb292ZXJsYXk8L1RJVExFPgorR3N0Q2Fpcm9PdmVybGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdENhaXJvT3ZlcmxheUNsYXNzCitHU1RfQ0FJUk9fT1ZFUkxBWQorR1NUX0NBSVJPX09WRVJMQVlfQ0FTVAorR1NUX0lTX0NBSVJPX09WRVJMQVkKK0dTVF9DQUlST19PVkVSTEFZX0NMQVNTCitHU1RfSVNfQ0FJUk9fT1ZFUkxBWV9DTEFTUworR1NUX1RZUEVfQ0FJUk9fT1ZFUkxBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9jYWlyb19vdmVybGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1jYXBzc2V0dGVyPC9GSUxFPgorPFRJVExFPmNhcHNzZXR0ZXI8L1RJVExFPgorR3N0Q2Fwc1NldHRlcgorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RDYXBzU2V0dGVyQ2xhc3MKK0dTVF9DQVBTX1NFVFRFUgorR1NUX0NBUFNfU0VUVEVSX0NBU1QKK0dTVF9JU19DQVBTX1NFVFRFUgorR1NUX0NBUFNfU0VUVEVSX0NMQVNTCitHU1RfSVNfQ0FQU19TRVRURVJfQ0xBU1MKK0dTVF9UWVBFX0NBUFNfU0VUVEVSCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2NhcHNfc2V0dGVyX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1jcHVyZXBvcnQ8L0ZJTEU+Cis8VElUTEU+Y3B1cmVwb3J0PC9USVRMRT4KK0dzdENwdVJlcG9ydAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RDcHVSZXBvcnRDbGFzcworR1NUX0NQVV9SRVBPUlQKK0dTVF9DUFVfUkVQT1JUX0NBU1QKK0dTVF9JU19DUFVfUkVQT1JUCitHU1RfQ1BVX1JFUE9SVF9DTEFTUworR1NUX0lTX0NQVV9SRVBPUlRfQ0xBU1MKK0dTVF9UWVBFX0NQVV9SRVBPUlQKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfY3B1X3JlcG9ydF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtY3V0dGVyPC9GSUxFPgorPFRJVExFPmN1dHRlcjwvVElUTEU+CitHc3RDdXR0ZXIKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0Q3V0dGVyQ2xhc3MKK0dTVF9DVVRURVIKK0dTVF9DVVRURVJfQ0FTVAorR1NUX0lTX0NVVFRFUgorR1NUX0NVVFRFUl9DTEFTUworR1NUX0lTX0NVVFRFUl9DTEFTUworR1NUX1RZUEVfQ1VUVEVSCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2N1dHRlcl9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZGlyZWN0c291bmRzaW5rPC9GSUxFPgorPFRJVExFPmRpcmVjdHNvdW5kc2luazwvVElUTEU+CitHc3REaXJlY3RTb3VuZFNpbmsKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0RGlyZWN0U291bmRTaW5rQ2xhc3MKK0dTVF9ESVJFQ1RTT1VORF9TSU5LCitHU1RfRElSRUNUU09VTkRfU0lOS19DTEFTUworR1NUX0lTX0RJUkVDVFNPVU5EX1NJTksKK0dTVF9JU19ESVJFQ1RTT1VORF9TSU5LX0NMQVNTCitHU1RfVFlQRV9ESVJFQ1RTT1VORF9TSU5LCitnc3RfZGlyZWN0c291bmRfc2lua19nZXRfdHlwZQorR1NUX0RTT1VORF9MT0NLCitHU1RfRFNPVU5EX1VOTE9DSworPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZHRtZnNyYzwvRklMRT4KKzxUSVRMRT5kdG1mc3JjPC9USVRMRT4KK0dzdERUTUZTcmMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0RFRNRlNyY0NsYXNzCitHU1RfRFRNRl9TUkMKK0dTVF9EVE1GX1NSQ19DQVNUCitHU1RfSVNfRFRNRl9TUkMKK0dTVF9EVE1GX1NSQ19DTEFTUworR1NUX0lTX0RUTUZfU1JDX0NMQVNTCitHU1RfVFlQRV9EVE1GX1NSQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9kdG1mX3NyY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZHYxMzk0c3JjPC9GSUxFPgorPFRJVExFPmR2MTM5NHNyYzwvVElUTEU+CitHc3REVjEzOTRTcmMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0RFYxMzk0U3JjQ2xhc3MKK0dTVF9EX1YxMzk0X1NSQworR1NUX0RfVjEzOTRfU1JDX0NBU1QKK0dTVF9JU19EX1YxMzk0X1NSQworR1NUX0RfVjEzOTRfU1JDX0NMQVNTCitHU1RfSVNfRF9WMTM5NF9TUkNfQ0xBU1MKK0dTVF9UWVBFX0RfVjEzOTRfU1JDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2RfdjEzOTRfc3JjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1kdmRlYzwvRklMRT4KKzxUSVRMRT5kdmRlYzwvVElUTEU+CitHc3REVkRlYworR3N0RFZEZWNRdWFsaXR5RW51bQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3REVkRlY0NsYXNzCitHU1RfRFZfREVDCitHU1RfRFZfREVDX0NBU1QKK0dTVF9JU19EVl9ERUMKK0dTVF9EVl9ERUNfQ0xBU1MKK0dTVF9JU19EVl9ERUNfQ0xBU1MKK0dTVF9UWVBFX0RWX0RFQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9kdl9kZWNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWR2ZGVtdXg8L0ZJTEU+Cis8VElUTEU+ZHZkZW11eDwvVElUTEU+CitHc3REVkRlbXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdERWRGVtdXhDbGFzcworR1NUX0RWX0RFTVVYCitHU1RfRFZfREVNVVhfQ0FTVAorR1NUX0lTX0RWX0RFTVVYCitHU1RfRFZfREVNVVhfQ0xBU1MKK0dTVF9JU19EVl9ERU1VWF9DTEFTUworR1NUX1RZUEVfRFZfREVNVVgKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfZHZfZGVtdXhfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWRjYXBhcnNlPC9GSUxFPgorPFRJVExFPmRjYXBhcnNlPC9USVRMRT4KK0dzdERjYVBhcnNlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdERjYVBhcnNlQ2xhc3MKK0dTVF9EQ0FfUEFSU0UKK0dTVF9EQ0FfUEFSU0VfQ0FTVAorR1NUX0lTX0RDQV9QQVJTRQorR1NUX0RDQV9QQVJTRV9DTEFTUworR1NUX0lTX0RDQV9QQVJTRV9DTEFTUworR1NUX1RZUEVfRENBX1BBUlNFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2RjYV9wYXJzZV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZGVpbnRlcmxhY2U8L0ZJTEU+Cis8VElUTEU+ZGVpbnRlcmxhY2U8L1RJVExFPgorR3N0RGVpbnRlcmxhY2UKK0dzdERlaW50ZXJsYWNlRmllbGRzCitHc3REZWludGVybGFjZUxvY2tpbmcKK0dzdERlaW50ZXJsYWNlTWV0aG9kcworR3N0RGVpbnRlcmxhY2VNb2RlcworR3N0RGVpbnRlcmxhY2VGaWVsZExheW91dAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3REZWludGVybGFjZUNsYXNzCitHU1RfREVJTlRFUkxBQ0UKK0dTVF9ERUlOVEVSTEFDRV9DQVNUCitHU1RfSVNfREVJTlRFUkxBQ0UKK0dTVF9ERUlOVEVSTEFDRV9DTEFTUworR1NUX0lTX0RFSU5URVJMQUNFX0NMQVNTCitHU1RfVFlQRV9ERUlOVEVSTEFDRQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9kZWludGVybGFjZV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZGVpbnRlcmxlYXZlPC9GSUxFPgorPFRJVExFPmRlaW50ZXJsZWF2ZTwvVElUTEU+CitHc3REZWludGVybGVhdmUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0RGVpbnRlcmxlYXZlQ2xhc3MKK0dTVF9ERUlOVEVSTEVBVkUKK0dTVF9ERUlOVEVSTEVBVkVfQ0FTVAorR1NUX0lTX0RFSU5URVJMRUFWRQorR1NUX0RFSU5URVJMRUFWRV9DTEFTUworR1NUX0lTX0RFSU5URVJMRUFWRV9DTEFTUworR1NUX1RZUEVfREVJTlRFUkxFQVZFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2RlaW50ZXJsZWF2ZV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZGljZXR2PC9GSUxFPgorPFRJVExFPmRpY2V0djwvVElUTEU+CitHc3REaWNlVFYKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0RGljZVRWQ2xhc3MKK0dTVF9ESUNFX1RWCitHU1RfRElDRV9UVl9DQVNUCitHU1RfSVNfRElDRV9UVgorR1NUX0RJQ0VfVFZfQ0xBU1MKK0dTVF9JU19ESUNFX1RWX0NMQVNTCitHU1RfVFlQRV9ESUNFX1RWCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2RpY2VfdHZfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWR5bnVkcHNpbms8L0ZJTEU+Cis8VElUTEU+ZHludWRwc2luazwvVElUTEU+CitHc3REeW5VRFBTaW5rCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdER5blVEUFNpbmtDbGFzcworR1NUX0RZTl9VRFBfU0lOSworR1NUX0RZTl9VRFBfU0lOS19DQVNUCitHU1RfSVNfRFlOX1VEUF9TSU5LCitHU1RfRFlOX1VEUF9TSU5LX0NMQVNTCitHU1RfSVNfRFlOX1VEUF9TSU5LX0NMQVNTCitHU1RfVFlQRV9EWU5fVURQX1NJTksKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfZHluX3VkcF9zaW5rX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1lZGdldHY8L0ZJTEU+Cis8VElUTEU+ZWRnZXR2PC9USVRMRT4KK0dzdEVkZ2VUVgorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RFZGdlVFZDbGFzcworR1NUX0VER0VfVFYKK0dTVF9FREdFX1RWX0NBU1QKK0dTVF9JU19FREdFX1RWCitHU1RfRURHRV9UVl9DTEFTUworR1NUX0lTX0VER0VfVFZfQ0xBU1MKK0dTVF9UWVBFX0VER0VfVFYKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfZWRnZV90dl9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZmxhY2RlYzwvRklMRT4KKzxUSVRMRT5mbGFjZGVjPC9USVRMRT4KK0dzdEZsYWNEZWMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0RmxhY0RlY0NsYXNzCitHU1RfRkxBQ19ERUMKK0dTVF9GTEFDX0RFQ19DQVNUCitHU1RfSVNfRkxBQ19ERUMKK0dTVF9GTEFDX0RFQ19DTEFTUworR1NUX0lTX0ZMQUNfREVDX0NMQVNTCitHU1RfVFlQRV9GTEFDX0RFQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9mbGFjX2RlY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZmxhY2VuYzwvRklMRT4KKzxUSVRMRT5mbGFjZW5jPC9USVRMRT4KK0dzdEZsYWNFbmMKK0dzdEZsYWNFbmNRdWFsaXR5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEZsYWNFbmNDbGFzcworR1NUX0ZMQUNfRU5DCitHU1RfRkxBQ19FTkNfQ0FTVAorR1NUX0lTX0ZMQUNfRU5DCitHU1RfRkxBQ19FTkNfQ0xBU1MKK0dTVF9JU19GTEFDX0VOQ19DTEFTUworR1NUX1RZUEVfRkxBQ19FTkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfZmxhY19lbmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWZsYWNwYXJzZTwvRklMRT4KKzxUSVRMRT5mbGFjcGFyc2U8L1RJVExFPgorR3N0RmxhY1BhcnNlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEZsYWNQYXJzZUNsYXNzCitHU1RfRkxBQ19QQVJTRQorR1NUX0ZMQUNfUEFSU0VfQ0FTVAorR1NUX0lTX0ZMQUNfUEFSU0UKK0dTVF9GTEFDX1BBUlNFX0NMQVNTCitHU1RfSVNfRkxBQ19QQVJTRV9DTEFTUworR1NUX1RZUEVfRkxBQ19QQVJTRQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9mbGFjX3BhcnNlX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1mbGFjdGFnPC9GSUxFPgorPFRJVExFPmZsYWN0YWc8L1RJVExFPgorR3N0RmxhY1RhZworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RGbGFjVGFnQ2xhc3MKK0dTVF9GTEFDX1RBRworR1NUX0ZMQUNfVEFHX0NBU1QKK0dTVF9JU19GTEFDX1RBRworR1NUX0ZMQUNfVEFHX0NMQVNTCitHU1RfSVNfRkxBQ19UQUdfQ0xBU1MKK0dTVF9UWVBFX0ZMQUNfVEFHCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2ZsYWNfdGFnX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1mbHZkZW11eDwvRklMRT4KKzxUSVRMRT5mbHZkZW11eDwvVElUTEU+CitHc3RGbHZEZW11eAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RGbHZEZW11eENsYXNzCitHU1RfRkxWX0RFTVVYCitHU1RfRkxWX0RFTVVYX0NBU1QKK0dTVF9JU19GTFZfREVNVVgKK0dTVF9GTFZfREVNVVhfQ0xBU1MKK0dTVF9JU19GTFZfREVNVVhfQ0xBU1MKK0dTVF9UWVBFX0ZMVl9ERU1VWAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9mbHZfZGVtdXhfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWZsdm11eDwvRklMRT4KKzxUSVRMRT5mbHZtdXg8L1RJVExFPgorR3N0Rmx2TXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEZsdk11eENsYXNzCitHU1RfRkxWX01VWAorR1NUX0ZMVl9NVVhfQ0FTVAorR1NUX0lTX0ZMVl9NVVgKK0dTVF9GTFZfTVVYX0NMQVNTCitHU1RfSVNfRkxWX01VWF9DTEFTUworR1NUX1RZUEVfRkxWX01VWAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9mbHZfbXV4X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1mbHhkZWM8L0ZJTEU+Cis8VElUTEU+Zmx4ZGVjPC9USVRMRT4KK0dzdEZseERlYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RGbHhEZWNDbGFzcworR1NUX0ZMWF9ERUMKK0dTVF9GTFhfREVDX0NBU1QKK0dTVF9JU19GTFhfREVDCitHU1RfRkxYX0RFQ19DTEFTUworR1NUX0lTX0ZMWF9ERUNfQ0xBU1MKK0dTVF9UWVBFX0ZMWF9ERUMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfZmx4X2RlY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZ2FtbWE8L0ZJTEU+Cis8VElUTEU+Z2FtbWE8L1RJVExFPgorR3N0R2FtbWEKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0R2FtbWFDbGFzcworR1NUX0dBTU1BCitHU1RfR0FNTUFfQ0FTVAorR1NUX0lTX0dBTU1BCitHU1RfR0FNTUFfQ0xBU1MKK0dTVF9JU19HQU1NQV9DTEFTUworR1NUX1RZUEVfR0FNTUEKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfZ2FtbWFfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWdka3BpeGJ1ZmRlYzwvRklMRT4KKzxUSVRMRT5nZGtwaXhidWZkZWM8L1RJVExFPgorR3N0R2RrUGl4YnVmRGVjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEdka1BpeGJ1ZkRlY0NsYXNzCitHU1RfR0RLX1BJWEJVRl9ERUMKK0dTVF9HREtfUElYQlVGX0RFQ19DQVNUCitHU1RfSVNfR0RLX1BJWEJVRl9ERUMKK0dTVF9HREtfUElYQlVGX0RFQ19DTEFTUworR1NUX0lTX0dES19QSVhCVUZfREVDX0NMQVNTCitHU1RfVFlQRV9HREtfUElYQlVGX0RFQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9nZGtfcGl4YnVmX2RlY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZ2RrcGl4YnVmb3ZlcmxheTwvRklMRT4KKzxUSVRMRT5nZGtwaXhidWZvdmVybGF5PC9USVRMRT4KK0dzdEdka1BpeGJ1Zk92ZXJsYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0R2RrUGl4YnVmT3ZlcmxheUNsYXNzCitHU1RfR0RLX1BJWEJVRl9PVkVSTEFZCitHU1RfR0RLX1BJWEJVRl9PVkVSTEFZX0NBU1QKK0dTVF9JU19HREtfUElYQlVGX09WRVJMQVkKK0dTVF9HREtfUElYQlVGX09WRVJMQVlfQ0xBU1MKK0dTVF9JU19HREtfUElYQlVGX09WRVJMQVlfQ0xBU1MKK0dTVF9UWVBFX0dES19QSVhCVUZfT1ZFUkxBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9nZGtfcGl4YnVmX292ZXJsYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWdka3BpeGJ1ZnNpbms8L0ZJTEU+Cis8VElUTEU+Z2RrcGl4YnVmc2luazwvVElUTEU+CitHc3RHZGtQaXhidWZTaW5rCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEdka1BpeGJ1ZlNpbmtDbGFzcworR1NUX0dES19QSVhCVUZfU0lOSworR1NUX0dES19QSVhCVUZfU0lOS19DQVNUCitHU1RfSVNfR0RLX1BJWEJVRl9TSU5LCitHU1RfR0RLX1BJWEJVRl9TSU5LX0NMQVNTCitHU1RfSVNfR0RLX1BJWEJVRl9TSU5LX0NMQVNTCitHU1RfVFlQRV9HREtfUElYQlVGX1NJTksKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfZ2RrX3BpeGJ1Zl9zaW5rX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1nb29tPC9GSUxFPgorPFRJVExFPmdvb208L1RJVExFPgorR3N0R29vbQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RHb29tQ2xhc3MKK0dTVF9HT09NCitHU1RfR09PTV9DQVNUCitHU1RfSVNfR09PTQorR1NUX0dPT01fQ0xBU1MKK0dTVF9JU19HT09NX0NMQVNTCitHU1RfVFlQRV9HT09NCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2dvb21fZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWdvb20yazE8L0ZJTEU+Cis8VElUTEU+Z29vbTJrMTwvVElUTEU+CitHc3RHb29tMmsxCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEdvb20yazFDbGFzcworR1NUX0dPT00ySzEKK0dTVF9HT09NMksxX0NBU1QKK0dTVF9JU19HT09NMksxCitHU1RfR09PTTJLMV9DTEFTUworR1NUX0lTX0dPT00ySzFfQ0xBU1MKK0dTVF9UWVBFX0dPT00ySzEKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfZ29vbTJrMV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtaGR2MTM5NHNyYzwvRklMRT4KKzxUSVRMRT5oZHYxMzk0c3JjPC9USVRMRT4KK0dzdEhEVjEzOTRTcmMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0SERWMTM5NFNyY0NsYXNzCitHU1RfSERfVjEzOTRfU1JDCitHU1RfSERfVjEzOTRfU1JDX0NBU1QKK0dTVF9JU19IRF9WMTM5NF9TUkMKK0dTVF9IRF9WMTM5NF9TUkNfQ0xBU1MKK0dTVF9JU19IRF9WMTM5NF9TUkNfQ0xBU1MKK0dTVF9UWVBFX0hEX1YxMzk0X1NSQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9oZF92MTM5NF9zcmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWljeWRlbXV4PC9GSUxFPgorPFRJVExFPmljeWRlbXV4PC9USVRMRT4KK0dzdElDWURlbXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdElDWURlbXV4Q2xhc3MKK0dTVF9JQ1lfREVNVVgKK0dTVF9JQ1lfREVNVVhfQ0FTVAorR1NUX0lTX0lDWV9ERU1VWAorR1NUX0lDWV9ERU1VWF9DTEFTUworR1NUX0lTX0lDWV9ERU1VWF9DTEFTUworR1NUX1RZUEVfSUNZX0RFTVVYCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2ljeV9kZW11eF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtaWQzZGVtdXg8L0ZJTEU+Cis8VElUTEU+aWQzZGVtdXg8L1RJVExFPgorR3N0SUQzRGVtdXgKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0SUQzRGVtdXhDbGFzcworR1NUX0lfRDNfREVNVVgKK0dTVF9JX0QzX0RFTVVYX0NBU1QKK0dTVF9JU19JX0QzX0RFTVVYCitHU1RfSV9EM19ERU1VWF9DTEFTUworR1NUX0lTX0lfRDNfREVNVVhfQ0xBU1MKK0dTVF9UWVBFX0lfRDNfREVNVVgKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfaV9kM19kZW11eF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtaXNtbG11eDwvRklMRT4KKzxUSVRMRT5pc21sbXV4PC9USVRMRT4KK0dzdElTTUxNdXgKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0SVNNTE11eENsYXNzCitHU1RfSVNNTF9NVVgKK0dTVF9JU01MX01VWF9DQVNUCitHU1RfSVNfSVNNTF9NVVgKK0dTVF9JU01MX01VWF9DTEFTUworR1NUX0lTX0lTTUxfTVVYX0NMQVNTCitHU1RfVFlQRV9JU01MX01VWAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9pc21sX211eF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtaWQzdjJtdXg8L0ZJTEU+Cis8VElUTEU+aWQzdjJtdXg8L1RJVExFPgorR3N0SWQzdjJNdXgKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0SWQzdjJNdXhDbGFzcworR1NUX0lEM1YyX01VWAorR1NUX0lEM1YyX01VWF9DQVNUCitHU1RfSVNfSUQzVjJfTVVYCitHU1RfSUQzVjJfTVVYX0NMQVNTCitHU1RfSVNfSUQzVjJfTVVYX0NMQVNTCitHU1RfVFlQRV9JRDNWMl9NVVgKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfaWQzdjJfbXV4X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1paXJlcXVhbGl6ZXI8L0ZJTEU+Cis8VElUTEU+aWlyZXF1YWxpemVyPC9USVRMRT4KK0dzdElpckVxdWFsaXplcgorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RJaXJFcXVhbGl6ZXJDbGFzcworR1NUX0lJUl9FUVVBTElaRVIKK0dTVF9JSVJfRVFVQUxJWkVSX0NBU1QKK0dTVF9JU19JSVJfRVFVQUxJWkVSCitHU1RfSUlSX0VRVUFMSVpFUl9DTEFTUworR1NUX0lTX0lJUl9FUVVBTElaRVJfQ0xBU1MKK0dTVF9UWVBFX0lJUl9FUVVBTElaRVIKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfaWlyX2VxdWFsaXplcl9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZXF1YWxpemVyLTEwYmFuZHM8L0ZJTEU+Cis8VElUTEU+ZXF1YWxpemVyLTEwYmFuZHM8L1RJVExFPgorR3N0SWlyRXF1YWxpemVyMTBCYW5kcworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RJaXJFcXVhbGl6ZXIxMEJhbmRzQ2xhc3MKK0dTVF9JSVJfRVFVQUxJWkVSMTBfQkFORFMKK0dTVF9JSVJfRVFVQUxJWkVSMTBfQkFORFNfQ0FTVAorR1NUX0lTX0lJUl9FUVVBTElaRVIxMF9CQU5EUworR1NUX0lJUl9FUVVBTElaRVIxMF9CQU5EU19DTEFTUworR1NUX0lTX0lJUl9FUVVBTElaRVIxMF9CQU5EU19DTEFTUworR1NUX1RZUEVfSUlSX0VRVUFMSVpFUjEwX0JBTkRTCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2lpcl9lcXVhbGl6ZXIxMF9iYW5kc19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtZXF1YWxpemVyLTNiYW5kczwvRklMRT4KKzxUSVRMRT5lcXVhbGl6ZXItM2JhbmRzPC9USVRMRT4KK0dzdElpckVxdWFsaXplcjNCYW5kcworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RJaXJFcXVhbGl6ZXIzQmFuZHNDbGFzcworR1NUX0lJUl9FUVVBTElaRVIzX0JBTkRTCitHU1RfSUlSX0VRVUFMSVpFUjNfQkFORFNfQ0FTVAorR1NUX0lTX0lJUl9FUVVBTElaRVIzX0JBTkRTCitHU1RfSUlSX0VRVUFMSVpFUjNfQkFORFNfQ0xBU1MKK0dTVF9JU19JSVJfRVFVQUxJWkVSM19CQU5EU19DTEFTUworR1NUX1RZUEVfSUlSX0VRVUFMSVpFUjNfQkFORFMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfaWlyX2VxdWFsaXplcjNfYmFuZHNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWVxdWFsaXplci1uYmFuZHM8L0ZJTEU+Cis8VElUTEU+ZXF1YWxpemVyLW5iYW5kczwvVElUTEU+CitHc3RJaXJFcXVhbGl6ZXJOQmFuZHMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0SWlyRXF1YWxpemVyTkJhbmRzQ2xhc3MKK0dTVF9JSVJfRVFVQUxJWkVSX05fQkFORFMKK0dTVF9JSVJfRVFVQUxJWkVSX05fQkFORFNfQ0FTVAorR1NUX0lTX0lJUl9FUVVBTElaRVJfTl9CQU5EUworR1NUX0lJUl9FUVVBTElaRVJfTl9CQU5EU19DTEFTUworR1NUX0lTX0lJUl9FUVVBTElaRVJfTl9CQU5EU19DTEFTUworR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl9OX0JBTkRTCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2lpcl9lcXVhbGl6ZXJfbl9iYW5kc19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtaW1hZ2VmcmVlemU8L0ZJTEU+Cis8VElUTEU+aW1hZ2VmcmVlemU8L1RJVExFPgorR3N0SW1hZ2VGcmVlemUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0SW1hZ2VGcmVlemVDbGFzcworR1NUX0lNQUdFX0ZSRUVaRQorR1NUX0lNQUdFX0ZSRUVaRV9DQVNUCitHU1RfSVNfSU1BR0VfRlJFRVpFCitHU1RfSU1BR0VfRlJFRVpFX0NMQVNTCitHU1RfSVNfSU1BR0VfRlJFRVpFX0NMQVNTCitHU1RfVFlQRV9JTUFHRV9GUkVFWkUKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfaW1hZ2VfZnJlZXplX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1pbnRlcmxlYXZlPC9GSUxFPgorPFRJVExFPmludGVybGVhdmU8L1RJVExFPgorR3N0SW50ZXJsZWF2ZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RJbnRlcmxlYXZlQ2xhc3MKK0dTVF9JTlRFUkxFQVZFCitHU1RfSU5URVJMRUFWRV9DQVNUCitHU1RfSVNfSU5URVJMRUFWRQorR1NUX0lOVEVSTEVBVkVfQ0xBU1MKK0dTVF9JU19JTlRFUkxFQVZFX0NMQVNTCitHU1RfVFlQRV9JTlRFUkxFQVZFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X2ludGVybGVhdmVfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWphY2thdWRpb3Npbms8L0ZJTEU+Cis8VElUTEU+amFja2F1ZGlvc2luazwvVElUTEU+CitHc3RKYWNrQXVkaW9TaW5rCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEphY2tBdWRpb1NpbmtDbGFzcworR1NUX0pBQ0tfQVVESU9fU0lOSworR1NUX0pBQ0tfQVVESU9fU0lOS19DQVNUCitHU1RfSVNfSkFDS19BVURJT19TSU5LCitHU1RfSkFDS19BVURJT19TSU5LX0NMQVNTCitHU1RfSVNfSkFDS19BVURJT19TSU5LX0NMQVNTCitHU1RfVFlQRV9KQUNLX0FVRElPX1NJTksKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfamFja19hdWRpb19zaW5rX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1qYWNrYXVkaW9zcmM8L0ZJTEU+Cis8VElUTEU+amFja2F1ZGlvc3JjPC9USVRMRT4KK0dzdEphY2tBdWRpb1NyYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RKYWNrQXVkaW9TcmNDbGFzcworR1NUX0pBQ0tfQVVESU9fU1JDCitHU1RfSkFDS19BVURJT19TUkNfQ0FTVAorR1NUX0lTX0pBQ0tfQVVESU9fU1JDCitHU1RfSkFDS19BVURJT19TUkNfQ0xBU1MKK0dTVF9JU19KQUNLX0FVRElPX1NSQ19DTEFTUworR1NUX1RZUEVfSkFDS19BVURJT19TUkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfamFja19hdWRpb19zcmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWpwZWdkZWM8L0ZJTEU+Cis8VElUTEU+anBlZ2RlYzwvVElUTEU+CitHc3RKcGVnRGVjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEpwZWdEZWNDbGFzcworR1NUX0pQRUdfREVDCitHU1RfSlBFR19ERUNfQ0FTVAorR1NUX0lTX0pQRUdfREVDCitHU1RfSlBFR19ERUNfQ0xBU1MKK0dTVF9JU19KUEVHX0RFQ19DTEFTUworR1NUX1RZUEVfSlBFR19ERUMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfanBlZ19kZWNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWpwZWdlbmM8L0ZJTEU+Cis8VElUTEU+anBlZ2VuYzwvVElUTEU+CitHc3RKcGVnRW5jCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdEpwZWdFbmNDbGFzcworR1NUX0pQRUdfRU5DCitHU1RfSlBFR19FTkNfQ0FTVAorR1NUX0lTX0pQRUdfRU5DCitHU1RfSlBFR19FTkNfQ0xBU1MKK0dTVF9JU19KUEVHX0VOQ19DTEFTUworR1NUX1RZUEVfSlBFR19FTkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfanBlZ19lbmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LWxhbWVtcDNlbmM8L0ZJTEU+Cis8VElUTEU+bGFtZW1wM2VuYzwvVElUTEU+CitHc3RMYW1lTVAzRW5jCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdExhbWVNUDNFbmNDbGFzcworR1NUX0xBTUVNUDNFTkMKK0dTVF9MQU1FTVAzRU5DX0NMQVNTCitHU1RfSVNfTEFNRU1QM0VOQworR1NUX0lTX0xBTUVNUDNFTkNfQ0xBU1MKK0dTVF9UWVBFX0xBTUVNUDNFTkMKK2dzdF9sYW1lbXAzZW5jX2dldF90eXBlCitnc3RfbGFtZW1wM2VuY19yZWdpc3RlcgorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtbGV2ZWw8L0ZJTEU+Cis8VElUTEU+bGV2ZWw8L1RJVExFPgorR3N0TGV2ZWwKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0TGV2ZWxDbGFzcworR1NUX0xFVkVMCitHU1RfTEVWRUxfQ0FTVAorR1NUX0lTX0xFVkVMCitHU1RfTEVWRUxfQ0xBU1MKK0dTVF9JU19MRVZFTF9DTEFTUworR1NUX1RZUEVfTEVWRUwKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfbGV2ZWxfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW1qMm11eDwvRklMRT4KKzxUSVRMRT5tajJtdXg8L1RJVExFPgorR3N0TUoyTXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdE1KMk11eENsYXNzCitHU1RfTV9KMl9NVVgKK0dTVF9NX0oyX01VWF9DQVNUCitHU1RfSVNfTV9KMl9NVVgKK0dTVF9NX0oyX01VWF9DTEFTUworR1NUX0lTX01fSjJfTVVYX0NMQVNTCitHU1RfVFlQRV9NX0oyX01VWAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9tX2oyX211eF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtbXA0bXV4PC9GSUxFPgorPFRJVExFPm1wNG11eDwvVElUTEU+CitHc3RNUDRNdXgKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0TVA0TXV4Q2xhc3MKK0dTVF9NX1A0X01VWAorR1NUX01fUDRfTVVYX0NBU1QKK0dTVF9JU19NX1A0X01VWAorR1NUX01fUDRfTVVYX0NMQVNTCitHU1RfSVNfTV9QNF9NVVhfQ0xBU1MKK0dTVF9UWVBFX01fUDRfTVVYCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X21fcDRfbXV4X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1tYXRyb3NrYWRlbXV4PC9GSUxFPgorPFRJVExFPm1hdHJvc2thZGVtdXg8L1RJVExFPgorR3N0TWF0cm9za2FEZW11eAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RNYXRyb3NrYURlbXV4Q2xhc3MKK0dTVF9NQVRST1NLQV9ERU1VWAorR1NUX01BVFJPU0tBX0RFTVVYX0NBU1QKK0dTVF9JU19NQVRST1NLQV9ERU1VWAorR1NUX01BVFJPU0tBX0RFTVVYX0NMQVNTCitHU1RfSVNfTUFUUk9TS0FfREVNVVhfQ0xBU1MKK0dTVF9UWVBFX01BVFJPU0tBX0RFTVVYCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X21hdHJvc2thX2RlbXV4X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1tYXRyb3NrYW11eDwvRklMRT4KKzxUSVRMRT5tYXRyb3NrYW11eDwvVElUTEU+CitHc3RNYXRyb3NrYU11eAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RNYXRyb3NrYU11eENsYXNzCitHU1RfTUFUUk9TS0FfTVVYCitHU1RfTUFUUk9TS0FfTVVYX0NBU1QKK0dTVF9JU19NQVRST1NLQV9NVVgKK0dTVF9NQVRST1NLQV9NVVhfQ0xBU1MKK0dTVF9JU19NQVRST1NLQV9NVVhfQ0xBU1MKK0dTVF9UWVBFX01BVFJPU0tBX01VWAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9tYXRyb3NrYV9tdXhfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW1vbm9zY29wZTwvRklMRT4KKzxUSVRMRT5tb25vc2NvcGU8L1RJVExFPgorR3N0TW9ub3Njb3BlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdE1vbm9zY29wZUNsYXNzCitHU1RfTU9OT1NDT1BFCitHU1RfSVNfTU9OT1NDT1BFCitHU1RfVFlQRV9NT05PU0NPUEUKK0dTVF9NT05PU0NPUEVfQ0xBU1MKK0dTVF9JU19NT05PU0NPUEVfQ0xBU1MKK2dzdF9tb25vc2NvcGVfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW1hdHJvc2thcGFyc2U8L0ZJTEU+Cis8VElUTEU+bWF0cm9za2FwYXJzZTwvVElUTEU+CitHc3RNYXRyb3NrYVBhcnNlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdE1hdHJvc2thUGFyc2VDbGFzcworR1NUX01BVFJPU0tBX1BBUlNFCitHU1RfTUFUUk9TS0FfUEFSU0VfQ0FTVAorR1NUX0lTX01BVFJPU0tBX1BBUlNFCitHU1RfTUFUUk9TS0FfUEFSU0VfQ0xBU1MKK0dTVF9JU19NQVRST1NLQV9QQVJTRV9DTEFTUworR1NUX1RZUEVfTUFUUk9TS0FfUEFSU0UKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfbWF0cm9za2FfcGFyc2VfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW1wZWdhdWRpb3BhcnNlPC9GSUxFPgorPFRJVExFPm1wZWdhdWRpb3BhcnNlPC9USVRMRT4KK0dzdE1wZWdBdWRpb1BhcnNlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdE1wZWdBdWRpb1BhcnNlQ2xhc3MKK0dTVF9NUEVHX0FVRElPX1BBUlNFCitHU1RfTVBFR19BVURJT19QQVJTRV9DQVNUCitHU1RfSVNfTVBFR19BVURJT19QQVJTRQorR1NUX01QRUdfQVVESU9fUEFSU0VfQ0xBU1MKK0dTVF9JU19NUEVHX0FVRElPX1BBUlNFX0NMQVNTCitHU1RfVFlQRV9NUEVHX0FVRElPX1BBUlNFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X21wZWdfYXVkaW9fcGFyc2VfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW1wZzEyM2F1ZGlvZGVjPC9GSUxFPgorPFRJVExFPm1wZzEyM2F1ZGlvZGVjPC9USVRMRT4KK0dzdE1wZzEyM0F1ZGlvRGVjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdE1wZzEyM0F1ZGlvRGVjQ2xhc3MKK0dTVF9NUEcxMjNfQVVESU9fREVDCitHU1RfTVBHMTIzX0FVRElPX0RFQ19DTEFTUworR1NUX0lTX01QRzEyM19BVURJT19ERUMKK0dTVF9JU19NUEcxMjNfQVVESU9fREVDX0NMQVNTCitHU1RfVFlQRV9NUEcxMjNfQVVESU9fREVDCitnc3RfbXBnMTIzX2F1ZGlvX2RlY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtbXVsYXdkZWM8L0ZJTEU+Cis8VElUTEU+bXVsYXdkZWM8L1RJVExFPgorR3N0TXVMYXdEZWMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0TXVMYXdEZWNDbGFzcworR1NUX01VX0xBV19ERUMKK0dTVF9NVV9MQVdfREVDX0NBU1QKK0dTVF9JU19NVV9MQVdfREVDCitHU1RfTVVfTEFXX0RFQ19DTEFTUworR1NUX0lTX01VX0xBV19ERUNfQ0xBU1MKK0dTVF9UWVBFX01VX0xBV19ERUMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfbXVfbGF3X2RlY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtbXVsYXdlbmM8L0ZJTEU+Cis8VElUTEU+bXVsYXdlbmM8L1RJVExFPgorR3N0TXVMYXdFbmMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0TXVMYXdFbmNDbGFzcworR1NUX01VX0xBV19FTkMKK0dTVF9NVV9MQVdfRU5DX0NBU1QKK0dTVF9JU19NVV9MQVdfRU5DCitHU1RfTVVfTEFXX0VOQ19DTEFTUworR1NUX0lTX01VX0xBV19FTkNfQ0xBU1MKK0dTVF9UWVBFX01VX0xBV19FTkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfbXVfbGF3X2VuY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtbXVsdGlmaWxlc2luazwvRklMRT4KKzxUSVRMRT5tdWx0aWZpbGVzaW5rPC9USVRMRT4KK0dzdE11bHRpRmlsZVNpbmsKK0dzdE11bHRpRmlsZVNpbmtOZXh0Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdE11bHRpRmlsZVNpbmtDbGFzcworR1NUX01VTFRJX0ZJTEVfU0lOSworR1NUX01VTFRJX0ZJTEVfU0lOS19DQVNUCitHU1RfSVNfTVVMVElfRklMRV9TSU5LCitHU1RfTVVMVElfRklMRV9TSU5LX0NMQVNTCitHU1RfSVNfTVVMVElfRklMRV9TSU5LX0NMQVNTCitHU1RfVFlQRV9NVUxUSV9GSUxFX1NJTksKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfbXVsdGlfZmlsZV9zaW5rX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1tdWx0aWZpbGVzcmM8L0ZJTEU+Cis8VElUTEU+bXVsdGlmaWxlc3JjPC9USVRMRT4KK0dzdE11bHRpRmlsZVNyYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RNdWx0aUZpbGVTcmNDbGFzcworR1NUX01VTFRJX0ZJTEVfU1JDCitHU1RfTVVMVElfRklMRV9TUkNfQ0FTVAorR1NUX0lTX01VTFRJX0ZJTEVfU1JDCitHU1RfTVVMVElfRklMRV9TUkNfQ0xBU1MKK0dTVF9JU19NVUxUSV9GSUxFX1NSQ19DTEFTUworR1NUX1RZUEVfTVVMVElfRklMRV9TUkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfbXVsdGlfZmlsZV9zcmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW11bHRpdWRwc2luazwvRklMRT4KKzxUSVRMRT5tdWx0aXVkcHNpbms8L1RJVExFPgorR3N0TXVsdGlVRFBTaW5rCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdE11bHRpVURQU2lua0NsYXNzCitHU1RfTVVMVElfVURQX1NJTksKK0dTVF9NVUxUSV9VRFBfU0lOS19DQVNUCitHU1RfSVNfTVVMVElfVURQX1NJTksKK0dTVF9NVUxUSV9VRFBfU0lOS19DTEFTUworR1NUX0lTX01VTFRJX1VEUF9TSU5LX0NMQVNTCitHU1RfVFlQRV9NVUxUSV9VRFBfU0lOSworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9tdWx0aV91ZHBfc2lua19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtbXVsdGlwYXJ0ZGVtdXg8L0ZJTEU+Cis8VElUTEU+bXVsdGlwYXJ0ZGVtdXg8L1RJVExFPgorR3N0TXVsdGlwYXJ0RGVtdXgKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0TXVsdGlwYXJ0RGVtdXhDbGFzcworR1NUX01VTFRJUEFSVF9ERU1VWAorR1NUX01VTFRJUEFSVF9ERU1VWF9DQVNUCitHU1RfSVNfTVVMVElQQVJUX0RFTVVYCitHU1RfTVVMVElQQVJUX0RFTVVYX0NMQVNTCitHU1RfSVNfTVVMVElQQVJUX0RFTVVYX0NMQVNTCitHU1RfVFlQRV9NVUxUSVBBUlRfREVNVVgKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfbXVsdGlwYXJ0X2RlbXV4X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1tdWx0aXBhcnRtdXg8L0ZJTEU+Cis8VElUTEU+bXVsdGlwYXJ0bXV4PC9USVRMRT4KK0dzdE11bHRpcGFydE11eAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RNdWx0aXBhcnRNdXhDbGFzcworR1NUX01VTFRJUEFSVF9NVVgKK0dTVF9NVUxUSVBBUlRfTVVYX0NBU1QKK0dTVF9JU19NVUxUSVBBUlRfTVVYCitHU1RfTVVMVElQQVJUX01VWF9DTEFTUworR1NUX0lTX01VTFRJUEFSVF9NVVhfQ0xBU1MKK0dTVF9UWVBFX01VTFRJUEFSVF9NVVgKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfbXVsdGlwYXJ0X211eF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtbmF2c2VlazwvRklMRT4KKzxUSVRMRT5uYXZzZWVrPC9USVRMRT4KK0dzdE5hdlNlZWsKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0TmF2U2Vla0NsYXNzCitHU1RfTkFWX1NFRUsKK0dTVF9OQVZfU0VFS19DQVNUCitHU1RfSVNfTkFWX1NFRUsKK0dTVF9OQVZfU0VFS19DTEFTUworR1NUX0lTX05BVl9TRUVLX0NMQVNTCitHU1RfVFlQRV9OQVZfU0VFSworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9uYXZfc2Vla19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtbmF2aWdhdGlvbnRlc3Q8L0ZJTEU+Cis8VElUTEU+bmF2aWdhdGlvbnRlc3Q8L1RJVExFPgorR3N0TmF2aWdhdGlvbnRlc3QKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0TmF2aWdhdGlvbnRlc3RDbGFzcworR1NUX05BVklHQVRJT05URVNUCitHU1RfTkFWSUdBVElPTlRFU1RfQ0FTVAorR1NUX0lTX05BVklHQVRJT05URVNUCitHU1RfTkFWSUdBVElPTlRFU1RfQ0xBU1MKK0dTVF9JU19OQVZJR0FUSU9OVEVTVF9DTEFTUworR1NUX1RZUEVfTkFWSUdBVElPTlRFU1QKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfbmF2aWdhdGlvbnRlc3RfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW9wdHY8L0ZJTEU+Cis8VElUTEU+b3B0djwvVElUTEU+CitHc3RPcFRWCitHc3RPcFRWTW9kZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RPcFRWQ2xhc3MKK0dTVF9PUF9UVgorR1NUX09QX1RWX0NBU1QKK0dTVF9JU19PUF9UVgorR1NUX09QX1RWX0NMQVNTCitHU1RfSVNfT1BfVFZfQ0xBU1MKK0dTVF9UWVBFX09QX1RWCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X29wX3R2X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1vc3M0c2luazwvRklMRT4KKzxUSVRMRT5vc3M0c2luazwvVElUTEU+CitHc3RPc3M0U2luaworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RPc3M0U2lua0NsYXNzCitHU1RfT1NTNF9TSU5LCitHU1RfT1NTNF9TSU5LX0NBU1QKK0dTVF9JU19PU1M0X1NJTksKK0dTVF9PU1M0X1NJTktfQ0xBU1MKK0dTVF9JU19PU1M0X1NJTktfQ0xBU1MKK0dTVF9UWVBFX09TUzRfU0lOSworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9vc3M0X3NpbmtfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW9zczRzcmM8L0ZJTEU+Cis8VElUTEU+b3NzNHNyYzwvVElUTEU+CitHc3RPc3M0U291cmNlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdE9zczRTb3VyY2VDbGFzcworR1NUX09TUzRfU09VUkNFCitHU1RfT1NTNF9TT1VSQ0VfQ0FTVAorR1NUX0lTX09TUzRfU09VUkNFCitHU1RfT1NTNF9TT1VSQ0VfQ0xBU1MKK0dTVF9JU19PU1M0X1NPVVJDRV9DTEFTUworR1NUX1RZUEVfT1NTNF9TT1VSQ0UKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfb3NzNF9zb3VyY2VfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW9zc3Npbms8L0ZJTEU+Cis8VElUTEU+b3Nzc2luazwvVElUTEU+CitHc3RPc3NTaW5rCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdE9zc1NpbmtDbGFzcworR1NUX09TU19TSU5LCitHU1RfT1NTX1NJTktfQ0FTVAorR1NUX0lTX09TU19TSU5LCitHU1RfT1NTX1NJTktfQ0xBU1MKK0dTVF9JU19PU1NfU0lOS19DTEFTUworR1NUX1RZUEVfT1NTX1NJTksKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfb3NzX3NpbmtfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW9zc3NyYzwvRklMRT4KKzxUSVRMRT5vc3NzcmM8L1RJVExFPgorR3N0T3NzU3JjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdE9zc1NyY0NsYXNzCitHU1RfT1NTX1NSQworR1NUX09TU19TUkNfQ0FTVAorR1NUX0lTX09TU19TUkMKK0dTVF9PU1NfU1JDX0NMQVNTCitHU1RfSVNfT1NTX1NSQ19DTEFTUworR1NUX1RZUEVfT1NTX1NSQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9vc3Nfc3JjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1vc3hhdWRpb3Npbms8L0ZJTEU+Cis8VElUTEU+b3N4YXVkaW9zaW5rPC9USVRMRT4KK0dzdE9zeEF1ZGlvU2luaworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RPc3hBdWRpb1NpbmtDbGFzcworR1NUX1RZUEVfT1NYX0FVRElPX1NJTksKK0dTVF9PU1hfQVVESU9fU0lOSworR1NUX09TWF9BVURJT19TSU5LX0NMQVNTCitnc3Rfb3N4X2F1ZGlvX3NpbmtfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW9zeGF1ZGlvc3JjPC9GSUxFPgorPFRJVExFPm9zeGF1ZGlvc3JjPC9USVRMRT4KK0dzdE9zeEF1ZGlvU3JjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdE9zeEF1ZGlvU3JjQ2xhc3MKK0dTVF9UWVBFX09TWF9BVURJT19TUkMKK0dTVF9PU1hfQVVESU9fU1JDCitHU1RfT1NYX0FVRElPX1NSQ19DTEFTUworZ3N0X29zeF9hdWRpb19zcmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LW9zeHZpZGVvc2luazwvRklMRT4KKzxUSVRMRT5vc3h2aWRlb3Npbms8L1RJVExFPgorR3N0T1NYVmlkZW9TaW5rCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdE9TWFZpZGVvU2lua0NsYXNzCitHc3RPU1hXaW5kb3cKKzxTVUJTRUNUSU9OIFByaXZhdGU+CitHU1RfSVNfT1NYX1ZJREVPX1NJTksKK0dTVF9JU19PU1hfVklERU9fU0lOS19DTEFTUworR1NUX09TWF9WSURFT19TSU5LCitHU1RfT1NYX1ZJREVPX1NJTktfQ0xBU1MKK0dTVF9UWVBFX09TWF9WSURFT19TSU5LCitHU1RfVFlQRV9PU1hWSURFT0JVRkZFUgorZ3N0X29zeF92aWRlb19zaW5rX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1wbmdkZWM8L0ZJTEU+Cis8VElUTEU+cG5nZGVjPC9USVRMRT4KK0dzdFBuZ0RlYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RQbmdEZWNDbGFzcworR1NUX1BOR19ERUMKK0dTVF9QTkdfREVDX0NBU1QKK0dTVF9JU19QTkdfREVDCitHU1RfUE5HX0RFQ19DTEFTUworR1NUX0lTX1BOR19ERUNfQ0xBU1MKK0dTVF9UWVBFX1BOR19ERUMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcG5nX2RlY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcG5nZW5jPC9GSUxFPgorPFRJVExFPnBuZ2VuYzwvVElUTEU+CitHc3RQbmdFbmMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UG5nRW5jQ2xhc3MKK0dTVF9QTkdfRU5DCitHU1RfUE5HX0VOQ19DQVNUCitHU1RfSVNfUE5HX0VOQworR1NUX1BOR19FTkNfQ0xBU1MKK0dTVF9JU19QTkdfRU5DX0NMQVNTCitHU1RfVFlQRV9QTkdfRU5DCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3BuZ19lbmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXByb2dyZXNzcmVwb3J0PC9GSUxFPgorPFRJVExFPnByb2dyZXNzcmVwb3J0PC9USVRMRT4KK0dzdFByb2dyZXNzUmVwb3J0Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFByb2dyZXNzUmVwb3J0Q2xhc3MKK0dTVF9QUk9HUkVTU19SRVBPUlQKK0dTVF9QUk9HUkVTU19SRVBPUlRfQ0FTVAorR1NUX0lTX1BST0dSRVNTX1JFUE9SVAorR1NUX1BST0dSRVNTX1JFUE9SVF9DTEFTUworR1NUX0lTX1BST0dSRVNTX1JFUE9SVF9DTEFTUworR1NUX1RZUEVfUFJPR1JFU1NfUkVQT1JUCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3Byb2dyZXNzX3JlcG9ydF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcHVsc2VzaW5rPC9GSUxFPgorPFRJVExFPnB1bHNlc2luazwvVElUTEU+CitHc3RQdWxzZVNpbmsKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UHVsc2VTaW5rQ2xhc3MKK0dTVF9QVUxTRV9TSU5LCitHU1RfUFVMU0VfU0lOS19DQVNUCitHU1RfSVNfUFVMU0VfU0lOSworR1NUX1BVTFNFX1NJTktfQ0xBU1MKK0dTVF9JU19QVUxTRV9TSU5LX0NMQVNTCitHU1RfVFlQRV9QVUxTRV9TSU5LCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3B1bHNlX3NpbmtfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXB1bHNlc3JjPC9GSUxFPgorPFRJVExFPnB1bHNlc3JjPC9USVRMRT4KK0dzdFB1bHNlU3JjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFB1bHNlU3JjQ2xhc3MKK0dTVF9QVUxTRV9TUkMKK0dTVF9QVUxTRV9TUkNfQ0FTVAorR1NUX0lTX1BVTFNFX1NSQworR1NUX1BVTFNFX1NSQ19DTEFTUworR1NUX0lTX1BVTFNFX1NSQ19DTEFTUworR1NUX1RZUEVfUFVMU0VfU1JDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3B1bHNlX3NyY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcHVzaGZpbGVzcmM8L0ZJTEU+Cis8VElUTEU+cHVzaGZpbGVzcmM8L1RJVExFPgorR3N0UHVzaEZpbGVTcmMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UHVzaEZpbGVTcmNDbGFzcworR1NUX1BVU0hfRklMRV9TUkMKK0dTVF9QVVNIX0ZJTEVfU1JDX0NBU1QKK0dTVF9JU19QVVNIX0ZJTEVfU1JDCitHU1RfUFVTSF9GSUxFX1NSQ19DTEFTUworR1NUX0lTX1BVU0hfRklMRV9TUkNfQ0xBU1MKK0dTVF9UWVBFX1BVU0hfRklMRV9TUkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcHVzaF9maWxlX3NyY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcXRkZW11eDwvRklMRT4KKzxUSVRMRT5xdGRlbXV4PC9USVRMRT4KK0dzdFFURGVtdXgKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UVREZW11eENsYXNzCitHU1RfUVRfREVNVVgKK0dTVF9RVF9ERU1VWF9DQVNUCitHU1RfSVNfUVRfREVNVVgKK0dTVF9RVF9ERU1VWF9DTEFTUworR1NUX0lTX1FUX0RFTVVYX0NMQVNTCitHU1RfVFlQRV9RVF9ERU1VWAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9xdF9kZW11eF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcXRtb292cmVjb3ZlcjwvRklMRT4KKzxUSVRMRT5xdG1vb3ZyZWNvdmVyPC9USVRMRT4KK0dzdFFUTW9vdlJlY292ZXIKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UVRNb292UmVjb3ZlckNsYXNzCitHU1RfUVRfTU9PVl9SRUNPVkVSCitHU1RfUVRfTU9PVl9SRUNPVkVSX0NBU1QKK0dTVF9JU19RVF9NT09WX1JFQ09WRVIKK0dTVF9RVF9NT09WX1JFQ09WRVJfQ0xBU1MKK0dTVF9JU19RVF9NT09WX1JFQ09WRVJfQ0xBU1MKK0dTVF9UWVBFX1FUX01PT1ZfUkVDT1ZFUgorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9xdF9tb292X3JlY292ZXJfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXF0bXV4PC9GSUxFPgorPFRJVExFPnF0bXV4PC9USVRMRT4KK0dzdFFUTXV4CitHc3RRVE11eER0c01ldGhvZHMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UVRNdXhDbGFzcworR1NUX1FUX01VWAorR1NUX1FUX01VWF9DQVNUCitHU1RfSVNfUVRfTVVYCitHU1RfUVRfTVVYX0NMQVNTCitHU1RfSVNfUVRfTVVYX0NMQVNTCitHU1RfVFlQRV9RVF9NVVgKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcXRfbXV4X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1xdWFya3R2PC9GSUxFPgorPFRJVExFPnF1YXJrdHY8L1RJVExFPgorR3N0UXVhcmtUVgorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RRdWFya1RWQ2xhc3MKK0dTVF9RVUFSS19UVgorR1NUX1FVQVJLX1RWX0NBU1QKK0dTVF9JU19RVUFSS19UVgorR1NUX1FVQVJLX1RWX0NMQVNTCitHU1RfSVNfUVVBUktfVFZfQ0xBU1MKK0dTVF9UWVBFX1FVQVJLX1RWCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3F1YXJrX3R2X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBidmRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cGJ2ZGVwYXk8L1RJVExFPgorR3N0UlRQQlZEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSVFBCVkRlcGF5Q2xhc3MKK0dTVF9SVFBCVl9ERVBBWQorR1NUX1JUUEJWX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBCVl9ERVBBWQorR1NUX1JUUEJWX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQQlZfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUEJWX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cGJ2X2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBidnBheTwvRklMRT4KKzxUSVRMRT5ydHBidnBheTwvVElUTEU+CitHc3RSVFBCVlBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSVFBCVlBheUNsYXNzCitHU1RfUlRQQlZfUEFZCitHU1RfUlRQQlZfUEFZX0NBU1QKK0dTVF9JU19SVFBCVl9QQVkKK0dTVF9SVFBCVl9QQVlfQ0xBU1MKK0dTVF9JU19SVFBCVl9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUEJWX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBidl9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGR0bWZtdXg8L0ZJTEU+Cis8VElUTEU+cnRwZHRtZm11eDwvVElUTEU+CitHc3RSVFBEVE1GTXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJUUERUTUZNdXhDbGFzcworR1NUX1JUUERUTUZfTVVYCitHU1RfUlRQRFRNRl9NVVhfQ0FTVAorR1NUX0lTX1JUUERUTUZfTVVYCitHU1RfUlRQRFRNRl9NVVhfQ0xBU1MKK0dTVF9JU19SVFBEVE1GX01VWF9DTEFTUworR1NUX1RZUEVfUlRQRFRNRl9NVVgKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwZHRtZl9tdXhfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGR0bWZzcmM8L0ZJTEU+Cis8VElUTEU+cnRwZHRtZnNyYzwvVElUTEU+CitHc3RSVFBEVE1GU3JjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJUUERUTUZTcmNDbGFzcworR1NUX1JUUERUTUZfU1JDCitHU1RfUlRQRFRNRl9TUkNfQ0FTVAorR1NUX0lTX1JUUERUTUZfU1JDCitHU1RfUlRQRFRNRl9TUkNfQ0xBU1MKK0dTVF9JU19SVFBEVE1GX1NSQ19DTEFTUworR1NUX1RZUEVfUlRQRFRNRl9TUkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwZHRtZl9zcmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGR2ZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwZHZkZXBheTwvVElUTEU+CitHc3RSVFBEVkRlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJUUERWRGVwYXlDbGFzcworR1NUX1JUUERWX0RFUEFZCitHU1RfUlRQRFZfREVQQVlfQ0FTVAorR1NUX0lTX1JUUERWX0RFUEFZCitHU1RfUlRQRFZfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBEVl9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQRFZfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwZHZfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGR2cGF5PC9GSUxFPgorPFRJVExFPnJ0cGR2cGF5PC9USVRMRT4KK0dzdFJUUERWUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJUUERWUGF5Q2xhc3MKK0dTVF9SVFBEVl9QQVkKK0dTVF9SVFBEVl9QQVlfQ0FTVAorR1NUX0lTX1JUUERWX1BBWQorR1NUX1JUUERWX1BBWV9DTEFTUworR1NUX0lTX1JUUERWX1BBWV9DTEFTUworR1NUX1RZUEVfUlRQRFZfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cGR2X3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwZGVjPC9GSUxFPgorPFRJVExFPnJ0cGRlYzwvVElUTEU+CitHc3RSVFBEZWMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UlRQRGVjQ2xhc3MKK0dTVF9SVFBfREVDCitHU1RfUlRQX0RFQ19DQVNUCitHU1RfSVNfUlRQX0RFQworR1NUX1JUUF9ERUNfQ0xBU1MKK0dTVF9JU19SVFBfREVDX0NMQVNTCitHU1RfVFlQRV9SVFBfREVDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9kZWNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGc3MjNwYXk8L0ZJTEU+Cis8VElUTEU+cnRwZzcyM3BheTwvVElUTEU+CitHc3RSVFBHNzIzUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJUUEc3MjNQYXlDbGFzcworR1NUX1JUUF9HNzIzX1BBWQorR1NUX1JUUF9HNzIzX1BBWV9DQVNUCitHU1RfSVNfUlRQX0c3MjNfUEFZCitHU1RfUlRQX0c3MjNfUEFZX0NMQVNTCitHU1RfSVNfUlRQX0c3MjNfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfRzcyM19QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2c3MjNfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBnNzI5cGF5PC9GSUxFPgorPFRJVExFPnJ0cGc3MjlwYXk8L1RJVExFPgorR3N0UlRQRzcyOVBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSVFBHNzI5UGF5Q2xhc3MKK0dTVF9SVFBfRzcyOV9QQVkKK0dTVF9SVFBfRzcyOV9QQVlfQ0FTVAorR1NUX0lTX1JUUF9HNzI5X1BBWQorR1NUX1JUUF9HNzI5X1BBWV9DTEFTUworR1NUX0lTX1JUUF9HNzI5X1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX0c3MjlfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9nNzI5X3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwZ3NtZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwZ3NtZGVwYXk8L1RJVExFPgorR3N0UlRQR1NNRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UlRQR1NNRGVwYXlDbGFzcworR1NUX1JUUEdTTV9ERVBBWQorR1NUX1JUUEdTTV9ERVBBWV9DQVNUCitHU1RfSVNfUlRQR1NNX0RFUEFZCitHU1RfUlRQR1NNX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQR1NNX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBHU01fREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwZ3NtX2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBnc21wYXk8L0ZJTEU+Cis8VElUTEU+cnRwZ3NtcGF5PC9USVRMRT4KK0dzdFJUUEdTTVBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSVFBHU01QYXlDbGFzcworR1NUX1JUUEdTTV9QQVkKK0dTVF9SVFBHU01fUEFZX0NBU1QKK0dTVF9JU19SVFBHU01fUEFZCitHU1RfUlRQR1NNX1BBWV9DTEFTUworR1NUX0lTX1JUUEdTTV9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUEdTTV9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwZ3NtX3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwaWxiY3BheTwvRklMRT4KKzxUSVRMRT5ydHBpbGJjcGF5PC9USVRMRT4KK0dzdFJUUElMQkNQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UlRQSUxCQ1BheUNsYXNzCitHU1RfUlRQSUxCQ19QQVkKK0dTVF9SVFBJTEJDX1BBWV9DQVNUCitHU1RfSVNfUlRQSUxCQ19QQVkKK0dTVF9SVFBJTEJDX1BBWV9DTEFTUworR1NUX0lTX1JUUElMQkNfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBJTEJDX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBpbGJjX3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwbXAydHBheTwvRklMRT4KKzxUSVRMRT5ydHBtcDJ0cGF5PC9USVRMRT4KK0dzdFJUUE1QMlRQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UlRQTVAyVFBheUNsYXNzCitHU1RfUlRQTV9QMl9UX1BBWQorR1NUX1JUUE1fUDJfVF9QQVlfQ0FTVAorR1NUX0lTX1JUUE1fUDJfVF9QQVkKK0dTVF9SVFBNX1AyX1RfUEFZX0NMQVNTCitHU1RfSVNfUlRQTV9QMl9UX1BBWV9DTEFTUworR1NUX1RZUEVfUlRQTV9QMl9UX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBtX3AyX3RfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBtcHZwYXk8L0ZJTEU+Cis8VElUTEU+cnRwbXB2cGF5PC9USVRMRT4KK0dzdFJUUE1QVlBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSVFBNUFZQYXlDbGFzcworR1NUX1JUUE1QVl9QQVkKK0dTVF9SVFBNUFZfUEFZX0NBU1QKK0dTVF9JU19SVFBNUFZfUEFZCitHU1RfUlRQTVBWX1BBWV9DTEFTUworR1NUX0lTX1JUUE1QVl9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUE1QVl9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwbXB2X3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwbXV4PC9GSUxFPgorPFRJVExFPnJ0cG11eDwvVElUTEU+CitHc3RSVFBNdXgKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UlRQTXV4Q2xhc3MKK0dTVF9SVFBfTVVYCitHU1RfUlRQX01VWF9DQVNUCitHU1RfSVNfUlRQX01VWAorR1NUX1JUUF9NVVhfQ0xBU1MKK0dTVF9JU19SVFBfTVVYX0NMQVNTCitHU1RfVFlQRV9SVFBfTVVYCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9tdXhfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cG9wdXNkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBvcHVzZGVwYXk8L1RJVExFPgorR3N0UlRQT3B1c0RlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJUUE9wdXNEZXBheUNsYXNzCitHU1RfUlRQX09QVVNfREVQQVkKK0dTVF9SVFBfT1BVU19ERVBBWV9DQVNUCitHU1RfSVNfUlRQX09QVVNfREVQQVkKK0dTVF9SVFBfT1BVU19ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9PUFVTX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfT1BVU19ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfb3B1c19kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwcnR4cXVldWU8L0ZJTEU+Cis8VElUTEU+cnRwcnR4cXVldWU8L1RJVExFPgorR3N0UlRQUnR4UXVldWUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UlRQUnR4UXVldWVDbGFzcworR1NUX1JUUF9SVFhfUVVFVUUKK0dTVF9SVFBfUlRYX1FVRVVFX0NBU1QKK0dTVF9JU19SVFBfUlRYX1FVRVVFCitHU1RfUlRQX1JUWF9RVUVVRV9DTEFTUworR1NUX0lTX1JUUF9SVFhfUVVFVUVfQ0xBU1MKK0dTVF9UWVBFX1JUUF9SVFhfUVVFVUUKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3J0eF9xdWV1ZV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwc2lyZW5kZXBheTwvRklMRT4KKzxUSVRMRT5ydHBzaXJlbmRlcGF5PC9USVRMRT4KK0dzdFJUUFNpcmVuRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UlRQU2lyZW5EZXBheUNsYXNzCitHU1RfUlRQX1NJUkVOX0RFUEFZCitHU1RfUlRQX1NJUkVOX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfU0lSRU5fREVQQVkKK0dTVF9SVFBfU0lSRU5fREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfU0lSRU5fREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9TSVJFTl9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfc2lyZW5fZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHNpcmVucGF5PC9GSUxFPgorPFRJVExFPnJ0cHNpcmVucGF5PC9USVRMRT4KK0dzdFJUUFNpcmVuUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJUUFNpcmVuUGF5Q2xhc3MKK0dTVF9SVFBfU0lSRU5fUEFZCitHU1RfUlRQX1NJUkVOX1BBWV9DQVNUCitHU1RfSVNfUlRQX1NJUkVOX1BBWQorR1NUX1JUUF9TSVJFTl9QQVlfQ0xBU1MKK0dTVF9JU19SVFBfU0lSRU5fUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfU0lSRU5fUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9zaXJlbl9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGlsYmNkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBpbGJjZGVwYXk8L1RJVExFPgorR3N0UlRQaUxCQ0RlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJUUGlMQkNEZXBheUNsYXNzCitHU1RfUlRfUElfTEJDX0RFUEFZCitHU1RfUlRfUElfTEJDX0RFUEFZX0NBU1QKK0dTVF9JU19SVF9QSV9MQkNfREVQQVkKK0dTVF9SVF9QSV9MQkNfREVQQVlfQ0xBU1MKK0dTVF9JU19SVF9QSV9MQkNfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUX1BJX0xCQ19ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydF9waV9sYmNfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0c3BzcmM8L0ZJTEU+Cis8VElUTEU+cnRzcHNyYzwvVElUTEU+CitHc3RSVFNQU3JjCitHc3RSVFNQU3JjQnVmZmVyTW9kZQorR3N0UlRTUFNyY050cFRpbWVTb3VyY2UKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UlRTUFNyY0NsYXNzCitHU1RfUlRTUF9TUkMKK0dTVF9SVFNQX1NSQ19DQVNUCitHU1RfSVNfUlRTUF9TUkMKK0dTVF9SVFNQX1NSQ19DTEFTUworR1NUX0lTX1JUU1BfU1JDX0NMQVNTCitHU1RfVFlQRV9SVFNQX1NSQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHNwX3NyY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcmFkaW9hY3R2PC9GSUxFPgorPFRJVExFPnJhZGlvYWN0djwvVElUTEU+CitHc3RSYWRpb2FjVFYKK0dzdFJhZGlvYWNUVkNvbG9yCitHc3RSYWRpb2FjVFZNb2RlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJhZGlvYWNUVkNsYXNzCitHU1RfUkFESU9BQ19UVgorR1NUX1JBRElPQUNfVFZfQ0FTVAorR1NUX0lTX1JBRElPQUNfVFYKK0dTVF9SQURJT0FDX1RWX0NMQVNTCitHU1RfSVNfUkFESU9BQ19UVl9DTEFTUworR1NUX1RZUEVfUkFESU9BQ19UVgorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9yYWRpb2FjX3R2X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1yZXZ0djwvRklMRT4KKzxUSVRMRT5yZXZ0djwvVElUTEU+CitHc3RSZXZUVgorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSZXZUVkNsYXNzCitHU1RfUkVWX1RWCitHU1RfUkVWX1RWX0NBU1QKK0dTVF9JU19SRVZfVFYKK0dTVF9SRVZfVFZfQ0xBU1MKK0dTVF9JU19SRVZfVFZfQ0xBU1MKK0dTVF9UWVBFX1JFVl9UVgorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9yZXZfdHZfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJnYW5hbHlzaXM8L0ZJTEU+Cis8VElUTEU+cmdhbmFseXNpczwvVElUTEU+CitHc3RSZ0FuYWx5c2lzCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJnQW5hbHlzaXNDbGFzcworR1NUX1JHX0FOQUxZU0lTCitHU1RfUkdfQU5BTFlTSVNfQ0FTVAorR1NUX0lTX1JHX0FOQUxZU0lTCitHU1RfUkdfQU5BTFlTSVNfQ0xBU1MKK0dTVF9JU19SR19BTkFMWVNJU19DTEFTUworR1NUX1RZUEVfUkdfQU5BTFlTSVMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcmdfYW5hbHlzaXNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJnbGltaXRlcjwvRklMRT4KKzxUSVRMRT5yZ2xpbWl0ZXI8L1RJVExFPgorR3N0UmdMaW1pdGVyCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJnTGltaXRlckNsYXNzCitHU1RfUkdfTElNSVRFUgorR1NUX1JHX0xJTUlURVJfQ0FTVAorR1NUX0lTX1JHX0xJTUlURVIKK0dTVF9SR19MSU1JVEVSX0NMQVNTCitHU1RfSVNfUkdfTElNSVRFUl9DTEFTUworR1NUX1RZUEVfUkdfTElNSVRFUgorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9yZ19saW1pdGVyX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1yZ3ZvbHVtZTwvRklMRT4KKzxUSVRMRT5yZ3ZvbHVtZTwvVElUTEU+CitHc3RSZ1ZvbHVtZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSZ1ZvbHVtZUNsYXNzCitHU1RfUkdfVk9MVU1FCitHU1RfUkdfVk9MVU1FX0NBU1QKK0dTVF9JU19SR19WT0xVTUUKK0dTVF9SR19WT0xVTUVfQ0xBU1MKK0dTVF9JU19SR19WT0xVTUVfQ0xBU1MKK0dTVF9UWVBFX1JHX1ZPTFVNRQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9yZ192b2x1bWVfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJpcHBsZXR2PC9GSUxFPgorPFRJVExFPnJpcHBsZXR2PC9USVRMRT4KK0dzdFJpcHBsZVRWCitHc3RSaXBwbGVUVk1vZGUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UmlwcGxlVFZDbGFzcworR1NUX1JJUFBMRV9UVgorR1NUX1JJUFBMRV9UVl9DQVNUCitHU1RfSVNfUklQUExFX1RWCitHU1RfUklQUExFX1RWX0NMQVNTCitHU1RfSVNfUklQUExFX1RWX0NMQVNTCitHU1RfVFlQRV9SSVBQTEVfVFYKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcmlwcGxlX3R2X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ybmRidWZmZXJzaXplPC9GSUxFPgorPFRJVExFPnJuZGJ1ZmZlcnNpemU8L1RJVExFPgorR3N0Um5kQnVmZmVyU2l6ZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSbmRCdWZmZXJTaXplQ2xhc3MKK0dTVF9STkRfQlVGRkVSX1NJWkUKK0dTVF9STkRfQlVGRkVSX1NJWkVfQ0FTVAorR1NUX0lTX1JORF9CVUZGRVJfU0laRQorR1NUX1JORF9CVUZGRVJfU0laRV9DTEFTUworR1NUX0lTX1JORF9CVUZGRVJfU0laRV9DTEFTUworR1NUX1RZUEVfUk5EX0JVRkZFUl9TSVpFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3JuZF9idWZmZXJfc2l6ZV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwYWMzZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwYWMzZGVwYXk8L1RJVExFPgorR3N0UnRwQUMzRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwQUMzRGVwYXlDbGFzcworR1NUX1JUUF9BX0MzX0RFUEFZCitHU1RfUlRQX0FfQzNfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9BX0MzX0RFUEFZCitHU1RfUlRQX0FfQzNfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfQV9DM19ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX0FfQzNfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2FfYzNfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGFjM3BheTwvRklMRT4KKzxUSVRMRT5ydHBhYzNwYXk8L1RJVExFPgorR3N0UnRwQUMzUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEFDM1BheUNsYXNzCitHU1RfUlRQX0FfQzNfUEFZCitHU1RfUlRQX0FfQzNfUEFZX0NBU1QKK0dTVF9JU19SVFBfQV9DM19QQVkKK0dTVF9SVFBfQV9DM19QQVlfQ0xBU1MKK0dTVF9JU19SVFBfQV9DM19QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9BX0MzX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfYV9jM19wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGFtcmRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cGFtcmRlcGF5PC9USVRMRT4KK0dzdFJ0cEFNUkRlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEFNUkRlcGF5Q2xhc3MKK0dTVF9SVFBfQU1SX0RFUEFZCitHU1RfUlRQX0FNUl9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX0FNUl9ERVBBWQorR1NUX1JUUF9BTVJfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfQU1SX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfQU1SX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9hbXJfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGFtcnBheTwvRklMRT4KKzxUSVRMRT5ydHBhbXJwYXk8L1RJVExFPgorR3N0UnRwQU1SUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEFNUlBheUNsYXNzCitHU1RfUlRQX0FNUl9QQVkKK0dTVF9SVFBfQU1SX1BBWV9DQVNUCitHU1RfSVNfUlRQX0FNUl9QQVkKK0dTVF9SVFBfQU1SX1BBWV9DTEFTUworR1NUX0lTX1JUUF9BTVJfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfQU1SX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfYW1yX3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwYmluPC9GSUxFPgorPFRJVExFPnJ0cGJpbjwvVElUTEU+CitHc3RSdHBCaW4KKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwQmluQ2xhc3MKK0dTVF9SVFBfQklOCitHU1RfUlRQX0JJTl9DQVNUCitHU1RfSVNfUlRQX0JJTgorR1NUX1JUUF9CSU5fQ0xBU1MKK0dTVF9JU19SVFBfQklOX0NMQVNTCitHU1RfVFlQRV9SVFBfQklOCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9iaW5fZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGNlbHRkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBjZWx0ZGVwYXk8L1RJVExFPgorR3N0UnRwQ0VMVERlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cENFTFREZXBheUNsYXNzCitHU1RfUlRQX0NFTFRfREVQQVkKK0dTVF9SVFBfQ0VMVF9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX0NFTFRfREVQQVkKK0dTVF9SVFBfQ0VMVF9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9DRUxUX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfQ0VMVF9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfY2VsdF9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwY2VsdHBheTwvRklMRT4KKzxUSVRMRT5ydHBjZWx0cGF5PC9USVRMRT4KK0dzdFJ0cENFTFRQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwQ0VMVFBheUNsYXNzCitHU1RfUlRQX0NFTFRfUEFZCitHU1RfUlRQX0NFTFRfUEFZX0NBU1QKK0dTVF9JU19SVFBfQ0VMVF9QQVkKK0dTVF9SVFBfQ0VMVF9QQVlfQ0xBU1MKK0dTVF9JU19SVFBfQ0VMVF9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9DRUxUX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfY2VsdF9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGR0bWZkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBkdG1mZGVwYXk8L1RJVExFPgorR3N0UnRwRFRNRkRlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cERUTUZEZXBheUNsYXNzCitHU1RfUlRQX0RUTUZfREVQQVkKK0dTVF9SVFBfRFRNRl9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX0RUTUZfREVQQVkKK0dTVF9SVFBfRFRNRl9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9EVE1GX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfRFRNRl9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfZHRtZl9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwZzcyMmRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cGc3MjJkZXBheTwvVElUTEU+CitHc3RSdHBHNzIyRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwRzcyMkRlcGF5Q2xhc3MKK0dTVF9SVFBfRzcyMl9ERVBBWQorR1NUX1JUUF9HNzIyX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfRzcyMl9ERVBBWQorR1NUX1JUUF9HNzIyX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX0c3MjJfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9HNzIyX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9nNzIyX2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBnNzIycGF5PC9GSUxFPgorPFRJVExFPnJ0cGc3MjJwYXk8L1RJVExFPgorR3N0UnRwRzcyMlBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBHNzIyUGF5Q2xhc3MKK0dTVF9SVFBfRzcyMl9QQVkKK0dTVF9SVFBfRzcyMl9QQVlfQ0FTVAorR1NUX0lTX1JUUF9HNzIyX1BBWQorR1NUX1JUUF9HNzIyX1BBWV9DTEFTUworR1NUX0lTX1JUUF9HNzIyX1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX0c3MjJfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9nNzIyX3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwZzcyM2RlcGF5PC9GSUxFPgorPFRJVExFPnJ0cGc3MjNkZXBheTwvVElUTEU+CitHc3RSdHBHNzIzRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwRzcyM0RlcGF5Q2xhc3MKK0dTVF9SVFBfRzcyM19ERVBBWQorR1NUX1JUUF9HNzIzX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfRzcyM19ERVBBWQorR1NUX1JUUF9HNzIzX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX0c3MjNfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9HNzIzX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9nNzIzX2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBnNzI2ZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwZzcyNmRlcGF5PC9USVRMRT4KK0dzdFJ0cEc3MjZEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBHNzI2RGVwYXlDbGFzcworR1NUX1JUUF9HNzI2X0RFUEFZCitHU1RfUlRQX0c3MjZfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9HNzI2X0RFUEFZCitHU1RfUlRQX0c3MjZfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfRzcyNl9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX0c3MjZfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2c3MjZfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGc3MjZwYXk8L0ZJTEU+Cis8VElUTEU+cnRwZzcyNnBheTwvVElUTEU+CitHc3RSdHBHNzI2UGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEc3MjZQYXlDbGFzcworR1NUX1JUUF9HNzI2X1BBWQorR1NUX1JUUF9HNzI2X1BBWV9DQVNUCitHU1RfSVNfUlRQX0c3MjZfUEFZCitHU1RfUlRQX0c3MjZfUEFZX0NMQVNTCitHU1RfSVNfUlRQX0c3MjZfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfRzcyNl9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2c3MjZfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBnNzI5ZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwZzcyOWRlcGF5PC9USVRMRT4KK0dzdFJ0cEc3MjlEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBHNzI5RGVwYXlDbGFzcworR1NUX1JUUF9HNzI5X0RFUEFZCitHU1RfUlRQX0c3MjlfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9HNzI5X0RFUEFZCitHU1RfUlRQX0c3MjlfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfRzcyOV9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX0c3MjlfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2c3MjlfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGdzdGRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cGdzdGRlcGF5PC9USVRMRT4KK0dzdFJ0cEdTVERlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEdTVERlcGF5Q2xhc3MKK0dTVF9SVFBfR1NUX0RFUEFZCitHU1RfUlRQX0dTVF9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX0dTVF9ERVBBWQorR1NUX1JUUF9HU1RfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfR1NUX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfR1NUX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9nc3RfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGdzdHBheTwvRklMRT4KKzxUSVRMRT5ydHBnc3RwYXk8L1RJVExFPgorR3N0UnRwR1NUUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEdTVFBheUNsYXNzCitHU1RfUlRQX0dTVF9QQVkKK0dTVF9SVFBfR1NUX1BBWV9DQVNUCitHU1RfSVNfUlRQX0dTVF9QQVkKK0dTVF9SVFBfR1NUX1BBWV9DTEFTUworR1NUX0lTX1JUUF9HU1RfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfR1NUX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfZ3N0X3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwaDI2MWRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cGgyNjFkZXBheTwvVElUTEU+CitHc3RSdHBIMjYxRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwSDI2MURlcGF5Q2xhc3MKK0dTVF9SVFBfSDI2MV9ERVBBWQorR1NUX1JUUF9IMjYxX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfSDI2MV9ERVBBWQorR1NUX1JUUF9IMjYxX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX0gyNjFfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9IMjYxX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9oMjYxX2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBoMjYxcGF5PC9GSUxFPgorPFRJVExFPnJ0cGgyNjFwYXk8L1RJVExFPgorR3N0UnRwSDI2MVBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBIMjYxUGF5Q2xhc3MKK0dTVF9SVFBfSDI2MV9QQVkKK0dTVF9SVFBfSDI2MV9QQVlfQ0FTVAorR1NUX0lTX1JUUF9IMjYxX1BBWQorR1NUX1JUUF9IMjYxX1BBWV9DTEFTUworR1NUX0lTX1JUUF9IMjYxX1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX0gyNjFfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9oMjYxX3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwaDI2M2RlcGF5PC9GSUxFPgorPFRJVExFPnJ0cGgyNjNkZXBheTwvVElUTEU+CitHc3RSdHBIMjYzRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwSDI2M0RlcGF5Q2xhc3MKK0dTVF9SVFBfSDI2M19ERVBBWQorR1NUX1JUUF9IMjYzX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfSDI2M19ERVBBWQorR1NUX1JUUF9IMjYzX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX0gyNjNfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9IMjYzX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9oMjYzX2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBoMjYzcGRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cGgyNjNwZGVwYXk8L1RJVExFPgorR3N0UnRwSDI2M1BEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBIMjYzUERlcGF5Q2xhc3MKK0dTVF9SVFBfSDI2M19QX0RFUEFZCitHU1RfUlRQX0gyNjNfUF9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX0gyNjNfUF9ERVBBWQorR1NUX1JUUF9IMjYzX1BfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfSDI2M19QX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfSDI2M19QX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9oMjYzX3BfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGgyNjNwcGF5PC9GSUxFPgorPFRJVExFPnJ0cGgyNjNwcGF5PC9USVRMRT4KK0dzdFJ0cEgyNjNQUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEgyNjNQUGF5Q2xhc3MKK0dTVF9SVFBfSDI2M19QX1BBWQorR1NUX1JUUF9IMjYzX1BfUEFZX0NBU1QKK0dTVF9JU19SVFBfSDI2M19QX1BBWQorR1NUX1JUUF9IMjYzX1BfUEFZX0NMQVNTCitHU1RfSVNfUlRQX0gyNjNfUF9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9IMjYzX1BfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9oMjYzX3BfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBoMjYzcGF5PC9GSUxFPgorPFRJVExFPnJ0cGgyNjNwYXk8L1RJVExFPgorR3N0UnRwSDI2M1BheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBIMjYzUGF5Q2xhc3MKK0dTVF9SVFBfSDI2M19QQVkKK0dTVF9SVFBfSDI2M19QQVlfQ0FTVAorR1NUX0lTX1JUUF9IMjYzX1BBWQorR1NUX1JUUF9IMjYzX1BBWV9DTEFTUworR1NUX0lTX1JUUF9IMjYzX1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX0gyNjNfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9oMjYzX3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwaDI2NGRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cGgyNjRkZXBheTwvVElUTEU+CitHc3RSdHBIMjY0RGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwSDI2NERlcGF5Q2xhc3MKK0dTVF9SVFBfSDI2NF9ERVBBWQorR1NUX1JUUF9IMjY0X0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfSDI2NF9ERVBBWQorR1NUX1JUUF9IMjY0X0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX0gyNjRfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9IMjY0X0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9oMjY0X2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBoMjY0cGF5PC9GSUxFPgorPFRJVExFPnJ0cGgyNjRwYXk8L1RJVExFPgorR3N0UnRwSDI2NFBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBIMjY0UGF5Q2xhc3MKK0dTVF9SVFBfSDI2NF9QQVkKK0dTVF9SVFBfSDI2NF9QQVlfQ0FTVAorR1NUX0lTX1JUUF9IMjY0X1BBWQorR1NUX1JUUF9IMjY0X1BBWV9DTEFTUworR1NUX0lTX1JUUF9IMjY0X1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX0gyNjRfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9oMjY0X3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwaDI2NWRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cGgyNjVkZXBheTwvVElUTEU+CitHc3RSdHBIMjY1RGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwSDI2NURlcGF5Q2xhc3MKK0dTVF9SVFBfSDI2NV9ERVBBWQorR1NUX1JUUF9IMjY1X0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfSDI2NV9ERVBBWQorR1NUX1JUUF9IMjY1X0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX0gyNjVfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9IMjY1X0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9oMjY1X2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBoMjY1cGF5PC9GSUxFPgorPFRJVExFPnJ0cGgyNjVwYXk8L1RJVExFPgorR3N0UnRwSDI2NVBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBIMjY1UGF5Q2xhc3MKK0dTVF9SVFBfSDI2NV9QQVkKK0dTVF9SVFBfSDI2NV9QQVlfQ0FTVAorR1NUX0lTX1JUUF9IMjY1X1BBWQorR1NUX1JUUF9IMjY1X1BBWV9DTEFTUworR1NUX0lTX1JUUF9IMjY1X1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX0gyNjVfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9oMjY1X3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwajJrZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwajJrZGVwYXk8L1RJVExFPgorR3N0UnRwSjJLRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwSjJLRGVwYXlDbGFzcworR1NUX1JUUF9KMl9LX0RFUEFZCitHU1RfUlRQX0oyX0tfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9KMl9LX0RFUEFZCitHU1RfUlRQX0oyX0tfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfSjJfS19ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX0oyX0tfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2oyX2tfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGoya3BheTwvRklMRT4KKzxUSVRMRT5ydHBqMmtwYXk8L1RJVExFPgorR3N0UnRwSjJLUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEoyS1BheUNsYXNzCitHU1RfUlRQX0oyX0tfUEFZCitHU1RfUlRQX0oyX0tfUEFZX0NBU1QKK0dTVF9JU19SVFBfSjJfS19QQVkKK0dTVF9SVFBfSjJfS19QQVlfQ0xBU1MKK0dTVF9JU19SVFBfSjJfS19QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9KMl9LX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfajJfa19wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGpwZWdkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBqcGVnZGVwYXk8L1RJVExFPgorR3N0UnRwSlBFR0RlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEpQRUdEZXBheUNsYXNzCitHU1RfUlRQX0pQRUdfREVQQVkKK0dTVF9SVFBfSlBFR19ERVBBWV9DQVNUCitHU1RfSVNfUlRQX0pQRUdfREVQQVkKK0dTVF9SVFBfSlBFR19ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9KUEVHX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfSlBFR19ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfanBlZ19kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwanBlZ3BheTwvRklMRT4KKzxUSVRMRT5ydHBqcGVncGF5PC9USVRMRT4KK0dzdFJ0cEpQRUdQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwSlBFR1BheUNsYXNzCitHU1RfUlRQX0pQRUdfUEFZCitHU1RfUlRQX0pQRUdfUEFZX0NBU1QKK0dTVF9JU19SVFBfSlBFR19QQVkKK0dTVF9SVFBfSlBFR19QQVlfQ0xBU1MKK0dTVF9JU19SVFBfSlBFR19QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9KUEVHX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfanBlZ19wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cGppdHRlcmJ1ZmZlcjwvRklMRT4KKzxUSVRMRT5ydHBqaXR0ZXJidWZmZXI8L1RJVExFPgorR3N0UnRwSml0dGVyQnVmZmVyCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cEppdHRlckJ1ZmZlckNsYXNzCitHU1RfUlRQX0pJVFRFUl9CVUZGRVIKK0dTVF9SVFBfSklUVEVSX0JVRkZFUl9DQVNUCitHU1RfSVNfUlRQX0pJVFRFUl9CVUZGRVIKK0dTVF9SVFBfSklUVEVSX0JVRkZFUl9DTEFTUworR1NUX0lTX1JUUF9KSVRURVJfQlVGRkVSX0NMQVNTCitHU1RfVFlQRV9SVFBfSklUVEVSX0JVRkZFUgorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwa2x2ZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwa2x2ZGVwYXk8L1RJVExFPgorR3N0UnRwS2x2RGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwS2x2RGVwYXlDbGFzcworR1NUX1JUUF9LTFZfREVQQVkKK0dTVF9SVFBfS0xWX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfS0xWX0RFUEFZCitHU1RfUlRQX0tMVl9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9LTFZfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9LTFZfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2tsdl9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwa2x2cGF5PC9GSUxFPgorPFRJVExFPnJ0cGtsdnBheTwvVElUTEU+CitHc3RSdHBLbHZQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwS2x2UGF5Q2xhc3MKK0dTVF9SVFBfS0xWX1BBWQorR1NUX1JUUF9LTFZfUEFZX0NBU1QKK0dTVF9JU19SVFBfS0xWX1BBWQorR1NUX1JUUF9LTFZfUEFZX0NMQVNTCitHU1RfSVNfUlRQX0tMVl9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9LTFZfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9rbHZfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBMOGRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cEw4ZGVwYXk8L1RJVExFPgorR3N0UnRwTDhEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBMOERlcGF5Q2xhc3MKK0dTVF9SVFBfTDhfREVQQVkKK0dTVF9SVFBfTDhfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9MOF9ERVBBWQorR1NUX1JUUF9MOF9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9MOF9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX0w4X0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9sOF9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwTDhwYXk8L0ZJTEU+Cis8VElUTEU+cnRwTDhwYXk8L1RJVExFPgorR3N0UnRwTDhQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwTDhQYXlDbGFzcworR1NUX1JUUF9MOF9QQVkKK0dTVF9SVFBfTDhfUEFZX0NBU1QKK0dTVF9JU19SVFBfTDhfUEFZCitHU1RfUlRQX0w4X1BBWV9DTEFTUworR1NUX0lTX1JUUF9MOF9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9MOF9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2w4X3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwTDE2ZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwTDE2ZGVwYXk8L1RJVExFPgorR3N0UnRwTDE2RGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwTDE2RGVwYXlDbGFzcworR1NUX1JUUF9MMTZfREVQQVkKK0dTVF9SVFBfTDE2X0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfTDE2X0RFUEFZCitHU1RfUlRQX0wxNl9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9MMTZfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9MMTZfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2wxNl9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwTDE2cGF5PC9GSUxFPgorPFRJVExFPnJ0cEwxNnBheTwvVElUTEU+CitHc3RSdHBMMTZQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwTDE2UGF5Q2xhc3MKK0dTVF9SVFBfTDE2X1BBWQorR1NUX1JUUF9MMTZfUEFZX0NBU1QKK0dTVF9JU19SVFBfTDE2X1BBWQorR1NUX1JUUF9MMTZfUEFZX0NMQVNTCitHU1RfSVNfUlRQX0wxNl9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9MMTZfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9sMTZfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBMMjRkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBMMjRkZXBheTwvVElUTEU+CitHc3RSdHBMMjREZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBMMjREZXBheUNsYXNzCitHU1RfUlRQX0wyNF9ERVBBWQorR1NUX1JUUF9MMjRfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9MMjRfREVQQVkKK0dTVF9SVFBfTDI0X0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX0wyNF9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX0wyNF9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfbDI0X2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBMMjRwYXk8L0ZJTEU+Cis8VElUTEU+cnRwTDI0cGF5PC9USVRMRT4KK0dzdFJ0cEwyNFBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBMMjRQYXlDbGFzcworR1NUX1JUUF9MMjRfUEFZCitHU1RfUlRQX0wyNF9QQVlfQ0FTVAorR1NUX0lTX1JUUF9MMjRfUEFZCitHU1RfUlRQX0wyNF9QQVlfQ0xBU1MKK0dTVF9JU19SVFBfTDI0X1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX0wyNF9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX2wyNF9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cG1wMXNkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBtcDFzZGVwYXk8L1RJVExFPgorR3N0UnRwTVAxU0RlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cE1QMVNEZXBheUNsYXNzCitHU1RfUlRQX01fUDFfU19ERVBBWQorR1NUX1JUUF9NX1AxX1NfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9NX1AxX1NfREVQQVkKK0dTVF9SVFBfTV9QMV9TX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX01fUDFfU19ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX01fUDFfU19ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfbV9wMV9zX2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBtcDJ0ZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwbXAydGRlcGF5PC9USVRMRT4KK0dzdFJ0cE1QMlREZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBNUDJURGVwYXlDbGFzcworR1NUX1JUUF9NX1AyX1RfREVQQVkKK0dTVF9SVFBfTV9QMl9UX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfTV9QMl9UX0RFUEFZCitHU1RfUlRQX01fUDJfVF9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9NX1AyX1RfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9NX1AyX1RfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX21fcDJfdF9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwbXA0YWRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cG1wNGFkZXBheTwvVElUTEU+CitHc3RSdHBNUDRBRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwTVA0QURlcGF5Q2xhc3MKK0dTVF9SVFBfTV9QNF9BX0RFUEFZCitHU1RfUlRQX01fUDRfQV9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX01fUDRfQV9ERVBBWQorR1NUX1JUUF9NX1A0X0FfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfTV9QNF9BX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfTV9QNF9BX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9tX3A0X2FfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cG1wNGFwYXk8L0ZJTEU+Cis8VElUTEU+cnRwbXA0YXBheTwvVElUTEU+CitHc3RSdHBNUDRBUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cE1QNEFQYXlDbGFzcworR1NUX1JUUF9NX1A0X0FfUEFZCitHU1RfUlRQX01fUDRfQV9QQVlfQ0FTVAorR1NUX0lTX1JUUF9NX1A0X0FfUEFZCitHU1RfUlRQX01fUDRfQV9QQVlfQ0xBU1MKK0dTVF9JU19SVFBfTV9QNF9BX1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX01fUDRfQV9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX21fcDRfYV9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cG1wNGdkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBtcDRnZGVwYXk8L1RJVExFPgorR3N0UnRwTVA0R0RlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cE1QNEdEZXBheUNsYXNzCitHU1RfUlRQX01fUDRfR19ERVBBWQorR1NUX1JUUF9NX1A0X0dfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9NX1A0X0dfREVQQVkKK0dTVF9SVFBfTV9QNF9HX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX01fUDRfR19ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX01fUDRfR19ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfbV9wNF9nX2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBtcDRncGF5PC9GSUxFPgorPFRJVExFPnJ0cG1wNGdwYXk8L1RJVExFPgorR3N0UnRwTVA0R1BheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBNUDRHUGF5Q2xhc3MKK0dTVF9SVFBfTV9QNF9HX1BBWQorR1NUX1JUUF9NX1A0X0dfUEFZX0NBU1QKK0dTVF9JU19SVFBfTV9QNF9HX1BBWQorR1NUX1JUUF9NX1A0X0dfUEFZX0NMQVNTCitHU1RfSVNfUlRQX01fUDRfR19QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9NX1A0X0dfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9tX3A0X2dfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBtcDR2ZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwbXA0dmRlcGF5PC9USVRMRT4KK0dzdFJ0cE1QNFZEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBNUDRWRGVwYXlDbGFzcworR1NUX1JUUF9NX1A0X1ZfREVQQVkKK0dTVF9SVFBfTV9QNF9WX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfTV9QNF9WX0RFUEFZCitHU1RfUlRQX01fUDRfVl9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9NX1A0X1ZfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9NX1A0X1ZfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX21fcDRfdl9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwbXA0dnBheTwvRklMRT4KKzxUSVRMRT5ydHBtcDR2cGF5PC9USVRMRT4KK0dzdFJ0cE1QNFZQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwTVA0VlBheUNsYXNzCitHU1RfUlRQX01fUDRfVl9QQVkKK0dTVF9SVFBfTV9QNF9WX1BBWV9DQVNUCitHU1RfSVNfUlRQX01fUDRfVl9QQVkKK0dTVF9SVFBfTV9QNF9WX1BBWV9DTEFTUworR1NUX0lTX1JUUF9NX1A0X1ZfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfTV9QNF9WX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfbV9wNF92X3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwbXBhZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwbXBhZGVwYXk8L1RJVExFPgorR3N0UnRwTVBBRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwTVBBRGVwYXlDbGFzcworR1NUX1JUUF9NUEFfREVQQVkKK0dTVF9SVFBfTVBBX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfTVBBX0RFUEFZCitHU1RfUlRQX01QQV9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9NUEFfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9NUEFfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX21wYV9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwbXBhcGF5PC9GSUxFPgorPFRJVExFPnJ0cG1wYXBheTwvVElUTEU+CitHc3RSdHBNUEFQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwTVBBUGF5Q2xhc3MKK0dTVF9SVFBfTVBBX1BBWQorR1NUX1JUUF9NUEFfUEFZX0NBU1QKK0dTVF9JU19SVFBfTVBBX1BBWQorR1NUX1JUUF9NUEFfUEFZX0NMQVNTCitHU1RfSVNfUlRQX01QQV9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9NUEFfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9tcGFfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBtcGFyb2J1c3RkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBtcGFyb2J1c3RkZXBheTwvVElUTEU+CitHc3RSdHBNUEFSb2J1c3REZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBNUEFSb2J1c3REZXBheUNsYXNzCitHU1RfUlRQX01QQV9ST0JVU1RfREVQQVkKK0dTVF9SVFBfTVBBX1JPQlVTVF9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX01QQV9ST0JVU1RfREVQQVkKK0dTVF9SVFBfTVBBX1JPQlVTVF9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9NUEFfUk9CVVNUX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfTVBBX1JPQlVTVF9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwbXB2ZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwbXB2ZGVwYXk8L1RJVExFPgorR3N0UnRwTVBWRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwTVBWRGVwYXlDbGFzcworR1NUX1JUUF9NUFZfREVQQVkKK0dTVF9SVFBfTVBWX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfTVBWX0RFUEFZCitHU1RfUlRQX01QVl9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9NUFZfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9NUFZfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX21wdl9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwb3B1c3BheTwvRklMRT4KKzxUSVRMRT5ydHBvcHVzcGF5PC9USVRMRT4KK0dzdFJ0cE9QVVNQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwT1BVU1BheUNsYXNzCitHU1RfUlRQX09QVVNfUEFZCitHU1RfUlRQX09QVVNfUEFZX0NBU1QKK0dTVF9JU19SVFBfT1BVU19QQVkKK0dTVF9SVFBfT1BVU19QQVlfQ0xBU1MKK0dTVF9JU19SVFBfT1BVU19QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9PUFVTX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfb3B1c19wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHBjbWFkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBwY21hZGVwYXk8L1RJVExFPgorR3N0UnRwUGNtYURlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFBjbWFEZXBheUNsYXNzCitHU1RfUlRQX1BDTUFfREVQQVkKK0dTVF9SVFBfUENNQV9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX1BDTUFfREVQQVkKK0dTVF9SVFBfUENNQV9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9QQ01BX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfUENNQV9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfcGNtYV9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwcGNtYXBheTwvRklMRT4KKzxUSVRMRT5ydHBwY21hcGF5PC9USVRMRT4KK0dzdFJ0cFBjbWFQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwUGNtYVBheUNsYXNzCitHU1RfUlRQX1BDTUFfUEFZCitHU1RfUlRQX1BDTUFfUEFZX0NBU1QKK0dTVF9JU19SVFBfUENNQV9QQVkKK0dTVF9SVFBfUENNQV9QQVlfQ0xBU1MKK0dTVF9JU19SVFBfUENNQV9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9QQ01BX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfcGNtYV9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHBjbXVkZXBheTwvRklMRT4KKzxUSVRMRT5ydHBwY211ZGVwYXk8L1RJVExFPgorR3N0UnRwUGNtdURlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFBjbXVEZXBheUNsYXNzCitHU1RfUlRQX1BDTVVfREVQQVkKK0dTVF9SVFBfUENNVV9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX1BDTVVfREVQQVkKK0dTVF9SVFBfUENNVV9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9QQ01VX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfUENNVV9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfcGNtdV9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwcGNtdXBheTwvRklMRT4KKzxUSVRMRT5ydHBwY211cGF5PC9USVRMRT4KK0dzdFJ0cFBjbXVQYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwUGNtdVBheUNsYXNzCitHU1RfUlRQX1BDTVVfUEFZCitHU1RfUlRQX1BDTVVfUEFZX0NBU1QKK0dTVF9JU19SVFBfUENNVV9QQVkKK0dTVF9SVFBfUENNVV9QQVlfQ0xBU1MKK0dTVF9JU19SVFBfUENNVV9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9QQ01VX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfcGNtdV9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHB0ZGVtdXg8L0ZJTEU+Cis8VElUTEU+cnRwcHRkZW11eDwvVElUTEU+CitHc3RSdHBQdERlbXV4Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFB0RGVtdXhDbGFzcworR1NUX1JUUF9QVF9ERU1VWAorR1NUX1JUUF9QVF9ERU1VWF9DQVNUCitHU1RfSVNfUlRQX1BUX0RFTVVYCitHU1RfUlRQX1BUX0RFTVVYX0NMQVNTCitHU1RfSVNfUlRQX1BUX0RFTVVYX0NMQVNTCitHU1RfVFlQRV9SVFBfUFRfREVNVVgKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3B0X2RlbXV4X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBxY2VscGRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cHFjZWxwZGVwYXk8L1RJVExFPgorR3N0UnRwUUNFTFBEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBRQ0VMUERlcGF5Q2xhc3MKK0dTVF9SVFBfUUNFTFBfREVQQVkKK0dTVF9SVFBfUUNFTFBfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9RQ0VMUF9ERVBBWQorR1NUX1JUUF9RQ0VMUF9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9RQ0VMUF9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX1FDRUxQX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9xY2VscF9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwcWRtMmRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cHFkbTJkZXBheTwvVElUTEU+CitHc3RSdHBRRE0yRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwUURNMkRlcGF5Q2xhc3MKK0dTVF9SVFBfUURfTTJfREVQQVkKK0dTVF9SVFBfUURfTTJfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9RRF9NMl9ERVBBWQorR1NUX1JUUF9RRF9NMl9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9RRF9NMl9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX1FEX00yX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9xZF9tMl9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwcnR4cmVjZWl2ZTwvRklMRT4KKzxUSVRMRT5ydHBydHhyZWNlaXZlPC9USVRMRT4KK0dzdFJ0cFJ0eFJlY2VpdmUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwUnR4UmVjZWl2ZUNsYXNzCitHU1RfUlRQX1JUWF9SRUNFSVZFCitHU1RfUlRQX1JUWF9SRUNFSVZFX0NBU1QKK0dTVF9JU19SVFBfUlRYX1JFQ0VJVkUKK0dTVF9SVFBfUlRYX1JFQ0VJVkVfQ0xBU1MKK0dTVF9JU19SVFBfUlRYX1JFQ0VJVkVfQ0xBU1MKK0dTVF9UWVBFX1JUUF9SVFhfUkVDRUlWRQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfcnR4X3JlY2VpdmVfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHJ0eHNlbmQ8L0ZJTEU+Cis8VElUTEU+cnRwcnR4c2VuZDwvVElUTEU+CitHc3RSdHBSdHhTZW5kCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFJ0eFNlbmRDbGFzcworR1NUX1JUUF9SVFhfU0VORAorR1NUX1JUUF9SVFhfU0VORF9DQVNUCitHU1RfSVNfUlRQX1JUWF9TRU5ECitHU1RfUlRQX1JUWF9TRU5EX0NMQVNTCitHU1RfSVNfUlRQX1JUWF9TRU5EX0NMQVNTCitHU1RfVFlQRV9SVFBfUlRYX1NFTkQKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3J0eF9zZW5kX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBzYmNwYXk8L0ZJTEU+Cis8VElUTEU+cnRwc2JjcGF5PC9USVRMRT4KK0dzdFJ0cFNCQ1BheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBTQkNQYXlDbGFzcworR1NUX1JUUF9TQkNfUEFZCitHU1RfUlRQX1NCQ19QQVlfQ0FTVAorR1NUX0lTX1JUUF9TQkNfUEFZCitHU1RfUlRQX1NCQ19QQVlfQ0xBU1MKK0dTVF9JU19SVFBfU0JDX1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX1NCQ19QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3NiY19wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHNwZWV4ZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwc3BlZXhkZXBheTwvVElUTEU+CitHc3RSdHBTUEVFWERlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFNQRUVYRGVwYXlDbGFzcworR1NUX1JUUF9TUEVFWF9ERVBBWQorR1NUX1JUUF9TUEVFWF9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX1NQRUVYX0RFUEFZCitHU1RfUlRQX1NQRUVYX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX1NQRUVYX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfU1BFRVhfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3NwZWV4X2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBzcGVleHBheTwvRklMRT4KKzxUSVRMRT5ydHBzcGVleHBheTwvVElUTEU+CitHc3RSdHBTUEVFWFBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBTUEVFWFBheUNsYXNzCitHU1RfUlRQX1NQRUVYX1BBWQorR1NUX1JUUF9TUEVFWF9QQVlfQ0FTVAorR1NUX0lTX1JUUF9TUEVFWF9QQVkKK0dTVF9SVFBfU1BFRVhfUEFZX0NMQVNTCitHU1RfSVNfUlRQX1NQRUVYX1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX1NQRUVYX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfc3BlZXhfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBzdjN2ZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwc3YzdmRlcGF5PC9USVRMRT4KK0dzdFJ0cFNWM1ZEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBTVjNWRGVwYXlDbGFzcworR1NUX1JUUF9TX1YzX1ZfREVQQVkKK0dTVF9SVFBfU19WM19WX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfU19WM19WX0RFUEFZCitHU1RfUlRQX1NfVjNfVl9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9TX1YzX1ZfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9TX1YzX1ZfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3NfdjNfdl9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwc2JjZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwc2JjZGVwYXk8L1RJVExFPgorR3N0UnRwU2JjRGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwU2JjRGVwYXlDbGFzcworR1NUX1JUUF9TQkNfREVQQVkKK0dTVF9SVFBfU0JDX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfU0JDX0RFUEFZCitHU1RfUlRQX1NCQ19ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9TQkNfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9TQkNfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3NiY19kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwc2Vzc2lvbjwvRklMRT4KKzxUSVRMRT5ydHBzZXNzaW9uPC9USVRMRT4KK0dzdFJ0cFNlc3Npb24KKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwU2Vzc2lvbkNsYXNzCitHU1RfUlRQX1NFU1NJT04KK0dTVF9SVFBfU0VTU0lPTl9DQVNUCitHU1RfSVNfUlRQX1NFU1NJT04KK0dTVF9SVFBfU0VTU0lPTl9DTEFTUworR1NUX0lTX1JUUF9TRVNTSU9OX0NMQVNTCitHU1RfVFlQRV9SVFBfU0VTU0lPTgorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfc2Vzc2lvbl9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwc3NyY2RlbXV4PC9GSUxFPgorPFRJVExFPnJ0cHNzcmNkZW11eDwvVElUTEU+CitHc3RSdHBTc3JjRGVtdXgKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwU3NyY0RlbXV4Q2xhc3MKK0dTVF9SVFBfU1NSQ19ERU1VWAorR1NUX1JUUF9TU1JDX0RFTVVYX0NBU1QKK0dTVF9JU19SVFBfU1NSQ19ERU1VWAorR1NUX1JUUF9TU1JDX0RFTVVYX0NMQVNTCitHU1RfSVNfUlRQX1NTUkNfREVNVVhfQ0xBU1MKK0dTVF9UWVBFX1JUUF9TU1JDX0RFTVVYCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF9zc3JjX2RlbXV4X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBzdHJlYW1kZXBheTwvRklMRT4KKzxUSVRMRT5ydHBzdHJlYW1kZXBheTwvVElUTEU+CitHc3RSdHBTdHJlYW1EZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBTdHJlYW1EZXBheUNsYXNzCitHU1RfUlRQX1NUUkVBTV9ERVBBWQorR1NUX1JUUF9TVFJFQU1fREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9TVFJFQU1fREVQQVkKK0dTVF9SVFBfU1RSRUFNX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX1NUUkVBTV9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX1NUUkVBTV9ERVBBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfc3RyZWFtX2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHBzdHJlYW1wYXk8L0ZJTEU+Cis8VElUTEU+cnRwc3RyZWFtcGF5PC9USVRMRT4KK0dzdFJ0cFN0cmVhbVBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBTdHJlYW1QYXlDbGFzcworR1NUX1JUUF9TVFJFQU1fUEFZCitHU1RfUlRQX1NUUkVBTV9QQVlfQ0FTVAorR1NUX0lTX1JUUF9TVFJFQU1fUEFZCitHU1RfUlRQX1NUUkVBTV9QQVlfQ0xBU1MKK0dTVF9JU19SVFBfU1RSRUFNX1BBWV9DTEFTUworR1NUX1RZUEVfUlRQX1NUUkVBTV9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3N0cmVhbV9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHRoZW9yYWRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cHRoZW9yYWRlcGF5PC9USVRMRT4KK0dzdFJ0cFRoZW9yYURlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFRoZW9yYURlcGF5Q2xhc3MKK0dTVF9SVFBfVEhFT1JBX0RFUEFZCitHU1RfUlRQX1RIRU9SQV9ERVBBWV9DQVNUCitHU1RfSVNfUlRQX1RIRU9SQV9ERVBBWQorR1NUX1JUUF9USEVPUkFfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfVEhFT1JBX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfVEhFT1JBX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF90aGVvcmFfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHRoZW9yYXBheTwvRklMRT4KKzxUSVRMRT5ydHB0aGVvcmFwYXk8L1RJVExFPgorR3N0UnRwVGhlb3JhUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFRoZW9yYVBheUNsYXNzCitHU1RfUlRQX1RIRU9SQV9QQVkKK0dTVF9SVFBfVEhFT1JBX1BBWV9DQVNUCitHU1RfSVNfUlRQX1RIRU9SQV9QQVkKK0dTVF9SVFBfVEhFT1JBX1BBWV9DTEFTUworR1NUX0lTX1JUUF9USEVPUkFfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfVEhFT1JBX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfdGhlb3JhX3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRwdnA4ZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwdnA4ZGVwYXk8L1RJVExFPgorR3N0UnRwVlA4RGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwVlA4RGVwYXlDbGFzcworR1NUX1JUUF9WX1A4X0RFUEFZCitHU1RfUlRQX1ZfUDhfREVQQVlfQ0FTVAorR1NUX0lTX1JUUF9WX1A4X0RFUEFZCitHU1RfUlRQX1ZfUDhfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfVl9QOF9ERVBBWV9DTEFTUworR1NUX1RZUEVfUlRQX1ZfUDhfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3ZfcDhfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHZwOHBheTwvRklMRT4KKzxUSVRMRT5ydHB2cDhwYXk8L1RJVExFPgorR3N0UnRwVlA4UGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFZQOFBheUNsYXNzCitHU1RfUlRQX1ZfUDhfUEFZCitHU1RfUlRQX1ZfUDhfUEFZX0NBU1QKK0dTVF9JU19SVFBfVl9QOF9QQVkKK0dTVF9SVFBfVl9QOF9QQVlfQ0xBU1MKK0dTVF9JU19SVFBfVl9QOF9QQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9WX1A4X1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfdl9wOF9wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHZwOWRlcGF5PC9GSUxFPgorPFRJVExFPnJ0cHZwOWRlcGF5PC9USVRMRT4KK0dzdFJ0cFZQOURlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFZQOURlcGF5Q2xhc3MKK0dTVF9SVFBfVl9QOV9ERVBBWQorR1NUX1JUUF9WX1A5X0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfVl9QOV9ERVBBWQorR1NUX1JUUF9WX1A5X0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX1ZfUDlfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9WX1A5X0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF92X3A5X2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHB2cDlwYXk8L0ZJTEU+Cis8VElUTEU+cnRwdnA5cGF5PC9USVRMRT4KK0dzdFJ0cFZQOVBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBWUDlQYXlDbGFzcworR1NUX1JUUF9WX1A5X1BBWQorR1NUX1JUUF9WX1A5X1BBWV9DQVNUCitHU1RfSVNfUlRQX1ZfUDlfUEFZCitHU1RfUlRQX1ZfUDlfUEFZX0NMQVNTCitHU1RfSVNfUlRQX1ZfUDlfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfVl9QOV9QQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3ZfcDlfcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHB2cmF3ZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRwdnJhd2RlcGF5PC9USVRMRT4KK0dzdFJ0cFZSYXdEZXBheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBWUmF3RGVwYXlDbGFzcworR1NUX1JUUF9WX1JBV19ERVBBWQorR1NUX1JUUF9WX1JBV19ERVBBWV9DQVNUCitHU1RfSVNfUlRQX1ZfUkFXX0RFUEFZCitHU1RfUlRQX1ZfUkFXX0RFUEFZX0NMQVNTCitHU1RfSVNfUlRQX1ZfUkFXX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfVl9SQVdfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3ZfcmF3X2RlcGF5X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1ydHB2cmF3cGF5PC9GSUxFPgorPFRJVExFPnJ0cHZyYXdwYXk8L1RJVExFPgorR3N0UnRwVlJhd1BheQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RSdHBWUmF3UGF5Q2xhc3MKK0dTVF9SVFBfVl9SQVdfUEFZCitHU1RfUlRQX1ZfUkFXX1BBWV9DQVNUCitHU1RfSVNfUlRQX1ZfUkFXX1BBWQorR1NUX1JUUF9WX1JBV19QQVlfQ0xBU1MKK0dTVF9JU19SVFBfVl9SQVdfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfVl9SQVdfUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF92X3Jhd19wYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHZvcmJpc2RlcGF5PC9GSUxFPgorPFRJVExFPnJ0cHZvcmJpc2RlcGF5PC9USVRMRT4KK0dzdFJ0cFZvcmJpc0RlcGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFZvcmJpc0RlcGF5Q2xhc3MKK0dTVF9SVFBfVk9SQklTX0RFUEFZCitHU1RfUlRQX1ZPUkJJU19ERVBBWV9DQVNUCitHU1RfSVNfUlRQX1ZPUkJJU19ERVBBWQorR1NUX1JUUF9WT1JCSVNfREVQQVlfQ0xBU1MKK0dTVF9JU19SVFBfVk9SQklTX0RFUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfVk9SQklTX0RFUEFZCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3J0cF92b3JiaXNfZGVwYXlfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXJ0cHZvcmJpc3BheTwvRklMRT4KKzxUSVRMRT5ydHB2b3JiaXNwYXk8L1RJVExFPgorR3N0UnRwVm9yYmlzUGF5Cis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFJ0cFZvcmJpc1BheUNsYXNzCitHU1RfUlRQX1ZPUkJJU19QQVkKK0dTVF9SVFBfVk9SQklTX1BBWV9DQVNUCitHU1RfSVNfUlRQX1ZPUkJJU19QQVkKK0dTVF9SVFBfVk9SQklTX1BBWV9DTEFTUworR1NUX0lTX1JUUF9WT1JCSVNfUEFZX0NMQVNTCitHU1RfVFlQRV9SVFBfVk9SQklTX1BBWQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9ydHBfdm9yYmlzX3BheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtcnRweHF0ZGVwYXk8L0ZJTEU+Cis8VElUTEU+cnRweHF0ZGVwYXk8L1RJVExFPgorR3N0UnRwWFFURGVwYXkKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0UnRwWFFURGVwYXlDbGFzcworR1NUX1JUUF9YUVRfREVQQVkKK0dTVF9SVFBfWFFUX0RFUEFZX0NBU1QKK0dTVF9JU19SVFBfWFFUX0RFUEFZCitHU1RfUlRQX1hRVF9ERVBBWV9DTEFTUworR1NUX0lTX1JUUF9YUVRfREVQQVlfQ0xBU1MKK0dTVF9UWVBFX1JUUF9YUVRfREVQQVkKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfcnRwX3hxdF9kZXBheV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtc21wdGU8L0ZJTEU+Cis8VElUTEU+c21wdGU8L1RJVExFPgorR3N0U01QVEUKK0dzdFNNUFRFVHJhbnNpdGlvblR5cGUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0U01QVEVDbGFzcworR1NUX1NNUFRFCitHU1RfU01QVEVfQ0FTVAorR1NUX0lTX1NNUFRFCitHU1RfU01QVEVfQ0xBU1MKK0dTVF9JU19TTVBURV9DTEFTUworR1NUX1RZUEVfU01QVEUKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfc21wdGVfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXNtcHRlYWxwaGE8L0ZJTEU+Cis8VElUTEU+c21wdGVhbHBoYTwvVElUTEU+CitHc3RTTVBURUFscGhhCitHc3RTTVBURUFscGhhVHJhbnNpdGlvblR5cGUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0U01QVEVBbHBoYUNsYXNzCitHU1RfU01QVEVfQUxQSEEKK0dTVF9TTVBURV9BTFBIQV9DQVNUCitHU1RfSVNfU01QVEVfQUxQSEEKK0dTVF9TTVBURV9BTFBIQV9DTEFTUworR1NUX0lTX1NNUFRFX0FMUEhBX0NMQVNTCitHU1RfVFlQRV9TTVBURV9BTFBIQQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9zbXB0ZV9hbHBoYV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtc2JjcGFyc2U8L0ZJTEU+Cis8VElUTEU+c2JjcGFyc2U8L1RJVExFPgorR3N0U2JjUGFyc2UKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0U2JjUGFyc2VDbGFzcworR1NUX1NCQ19QQVJTRQorR1NUX1NCQ19QQVJTRV9DQVNUCitHU1RfSVNfU0JDX1BBUlNFCitHU1RfU0JDX1BBUlNFX0NMQVNTCitHU1RfSVNfU0JDX1BBUlNFX0NMQVNTCitHU1RfVFlQRV9TQkNfUEFSU0UKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfc2JjX3BhcnNlX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1zY2FsZXRlbXBvPC9GSUxFPgorPFRJVExFPnNjYWxldGVtcG88L1RJVExFPgorR3N0U2NhbGV0ZW1wbworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RTY2FsZXRlbXBvQ2xhc3MKK0dTVF9TQ0FMRVRFTVBPCitHU1RfU0NBTEVURU1QT19DQVNUCitHU1RfSVNfU0NBTEVURU1QTworR1NUX1NDQUxFVEVNUE9fQ0xBU1MKK0dTVF9JU19TQ0FMRVRFTVBPX0NMQVNTCitHU1RfVFlQRV9TQ0FMRVRFTVBPCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3NjYWxldGVtcG9fZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXNoYWdhZGVsaWN0djwvRklMRT4KKzxUSVRMRT5zaGFnYWRlbGljdHY8L1RJVExFPgorR3N0U2hhZ2FkZWxpY1RWCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFNoYWdhZGVsaWNUVkNsYXNzCitHU1RfU0hBR0FERUxJQ19UVgorR1NUX1NIQUdBREVMSUNfVFZfQ0FTVAorR1NUX0lTX1NIQUdBREVMSUNfVFYKK0dTVF9TSEFHQURFTElDX1RWX0NMQVNTCitHU1RfSVNfU0hBR0FERUxJQ19UVl9DTEFTUworR1NUX1RZUEVfU0hBR0FERUxJQ19UVgorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9zaGFnYWRlbGljX3R2X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1zaGFwZXdpcGU8L0ZJTEU+Cis8VElUTEU+c2hhcGV3aXBlPC9USVRMRT4KK0dzdFNoYXBlV2lwZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RTaGFwZVdpcGVDbGFzcworR1NUX1NIQVBFX1dJUEUKK0dTVF9TSEFQRV9XSVBFX0NBU1QKK0dTVF9JU19TSEFQRV9XSVBFCitHU1RfU0hBUEVfV0lQRV9DTEFTUworR1NUX0lTX1NIQVBFX1dJUEVfQ0xBU1MKK0dTVF9UWVBFX1NIQVBFX1dJUEUKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfc2hhcGVfd2lwZV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtc2hvdXQyc2VuZDwvRklMRT4KKzxUSVRMRT5zaG91dDJzZW5kPC9USVRMRT4KK0dzdFNob3V0MnNlbmQKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0U2hvdXQyc2VuZENsYXNzCitHU1RfU0hPVVQyU0VORAorR1NUX1NIT1VUMlNFTkRfQ0FTVAorR1NUX0lTX1NIT1VUMlNFTkQKK0dTVF9TSE9VVDJTRU5EX0NMQVNTCitHU1RfSVNfU0hPVVQyU0VORF9DTEFTUworR1NUX1RZUEVfU0hPVVQyU0VORAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9zaG91dDJzZW5kX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1zb3VwaHR0cHNyYzwvRklMRT4KKzxUSVRMRT5zb3VwaHR0cHNyYzwvVElUTEU+CitHc3RTb3VwSFRUUFNyYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RTb3VwSFRUUFNyY0NsYXNzCitHU1RfU09VUF9IVFRQX1NSQworR1NUX1NPVVBfSFRUUF9TUkNfQ0FTVAorR1NUX0lTX1NPVVBfSFRUUF9TUkMKK0dTVF9TT1VQX0hUVFBfU1JDX0NMQVNTCitHU1RfSVNfU09VUF9IVFRQX1NSQ19DTEFTUworR1NUX1RZUEVfU09VUF9IVFRQX1NSQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9zb3VwX2h0dHBfc3JjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1zb3VwaHR0cGNsaWVudHNpbms8L0ZJTEU+Cis8VElUTEU+c291cGh0dHBjbGllbnRzaW5rPC9USVRMRT4KK0dzdFNvdXBIdHRwQ2xpZW50U2luaworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RTb3VwSHR0cENsaWVudFNpbmtDbGFzcworR1NUX1NPVVBfSFRUUF9DTElFTlRfU0lOSworR1NUX1NPVVBfSFRUUF9DTElFTlRfU0lOS19DQVNUCitHU1RfSVNfU09VUF9IVFRQX0NMSUVOVF9TSU5LCitHU1RfU09VUF9IVFRQX0NMSUVOVF9TSU5LX0NMQVNTCitHU1RfSVNfU09VUF9IVFRQX0NMSUVOVF9TSU5LX0NMQVNTCitHU1RfVFlQRV9TT1VQX0hUVFBfQ0xJRU5UX1NJTksKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1zcGVjdHJ1bTwvRklMRT4KKzxUSVRMRT5zcGVjdHJ1bTwvVElUTEU+CitHc3RTcGVjdHJ1bQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RTcGVjdHJ1bUNsYXNzCitHU1RfU1BFQ1RSVU0KK0dTVF9TUEVDVFJVTV9DQVNUCitHU1RfSVNfU1BFQ1RSVU0KK0dTVF9TUEVDVFJVTV9DTEFTUworR1NUX0lTX1NQRUNUUlVNX0NMQVNTCitHU1RfVFlQRV9TUEVDVFJVTQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF9zcGVjdHJ1bV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtc3BlZXhkZWM8L0ZJTEU+Cis8VElUTEU+c3BlZXhkZWM8L1RJVExFPgorR3N0U3BlZXhEZWMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0U3BlZXhEZWNDbGFzcworR1NUX1NQRUVYX0RFQworR1NUX1NQRUVYX0RFQ19DQVNUCitHU1RfSVNfU1BFRVhfREVDCitHU1RfU1BFRVhfREVDX0NMQVNTCitHU1RfSVNfU1BFRVhfREVDX0NMQVNTCitHU1RfVFlQRV9TUEVFWF9ERUMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfc3BlZXhfZGVjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1zcGVleGVuYzwvRklMRT4KKzxUSVRMRT5zcGVleGVuYzwvVElUTEU+CitHc3RTcGVleEVuYworR3N0U3BlZXhFbmNNb2RlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFNwZWV4RW5jQ2xhc3MKK0dTVF9TUEVFWF9FTkMKK0dTVF9TUEVFWF9FTkNfQ0FTVAorR1NUX0lTX1NQRUVYX0VOQworR1NUX1NQRUVYX0VOQ19DTEFTUworR1NUX0lTX1NQRUVYX0VOQ19DTEFTUworR1NUX1RZUEVfU1BFRVhfRU5DCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3NwZWV4X2VuY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtc3BsaXRmaWxlc3JjPC9GSUxFPgorPFRJVExFPnNwbGl0ZmlsZXNyYzwvVElUTEU+CitHc3RTcGxpdEZpbGVTcmMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0U3BsaXRGaWxlU3JjQ2xhc3MKK0dTVF9TUExJVF9GSUxFX1NSQworR1NUX1NQTElUX0ZJTEVfU1JDX0NBU1QKK0dTVF9JU19TUExJVF9GSUxFX1NSQworR1NUX1NQTElUX0ZJTEVfU1JDX0NMQVNTCitHU1RfSVNfU1BMSVRfRklMRV9TUkNfQ0xBU1MKK0dTVF9UWVBFX1NQTElUX0ZJTEVfU1JDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3NwbGl0X2ZpbGVfc3JjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC1zcGxpdG11eHNpbms8L0ZJTEU+Cis8VElUTEU+c3BsaXRtdXhzaW5rPC9USVRMRT4KK0dzdFNwbGl0TXV4U2luaworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RTcGxpdE11eFNpbmtDbGFzcworR1NUX1NQTElUX01VWF9TSU5LCitHU1RfU1BMSVRfTVVYX1NJTktfQ0FTVAorR1NUX0lTX1NQTElUX01VWF9TSU5LCitHU1RfU1BMSVRfTVVYX1NJTktfQ0xBU1MKK0dTVF9JU19TUExJVF9NVVhfU0lOS19DTEFTUworR1NUX1RZUEVfU1BMSVRfTVVYX1NJTksKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfc3BsaXRfbXV4X3NpbmtfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXNwbGl0bXV4c3JjPC9GSUxFPgorPFRJVExFPnNwbGl0bXV4c3JjPC9USVRMRT4KK0dzdFNwbGl0TXV4U3JjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFNwbGl0TXV4U3JjQ2xhc3MKK0dTVF9TUExJVF9NVVhfU1JDCitHU1RfU1BMSVRfTVVYX1NSQ19DQVNUCitHU1RfSVNfU1BMSVRfTVVYX1NSQworR1NUX1NQTElUX01VWF9TUkNfQ0xBU1MKK0dTVF9JU19TUExJVF9NVVhfU1JDX0NMQVNTCitHU1RfVFlQRV9TUExJVF9NVVhfU1JDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3NwbGl0X211eF9zcmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXN0cmVha3R2PC9GSUxFPgorPFRJVExFPnN0cmVha3R2PC9USVRMRT4KK0dzdFN0cmVha1RWCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFN0cmVha1RWQ2xhc3MKK0dTVF9TVFJFQUtfVFYKK0dTVF9TVFJFQUtfVFZfQ0FTVAorR1NUX0lTX1NUUkVBS19UVgorR1NUX1NUUkVBS19UVl9DTEFTUworR1NUX0lTX1NUUkVBS19UVl9DTEFTUworR1NUX1RZUEVfU1RSRUFLX1RWCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3N0cmVha190dl9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtdGFnaW5qZWN0PC9GSUxFPgorPFRJVExFPnRhZ2luamVjdDwvVElUTEU+CitHc3RUYWdJbmplY3QKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0VGFnSW5qZWN0Q2xhc3MKK0dTVF9UQUdfSU5KRUNUCitHU1RfVEFHX0lOSkVDVF9DQVNUCitHU1RfSVNfVEFHX0lOSkVDVAorR1NUX1RBR19JTkpFQ1RfQ0xBU1MKK0dTVF9JU19UQUdfSU5KRUNUX0NMQVNTCitHU1RfVFlQRV9UQUdfSU5KRUNUCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3RhZ19pbmplY3RfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXRlc3RzaW5rPC9GSUxFPgorPFRJVExFPnRlc3RzaW5rPC9USVRMRT4KK0dzdFRlc3QKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0VGVzdENsYXNzCitHU1RfVEVTVAorR1NUX1RFU1RfQ0FTVAorR1NUX0lTX1RFU1QKK0dTVF9URVNUX0NMQVNTCitHU1RfSVNfVEVTVF9DTEFTUworR1NUX1RZUEVfVEVTVAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF90ZXN0X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC10d29sYW1lbXAyZW5jPC9GSUxFPgorPFRJVExFPnR3b2xhbWU8L1RJVExFPgorR3N0VHdvTGFtZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RUd29MYW1lQ2xhc3MKK0dTVF9UV09fTEFNRQorR1NUX1RXT19MQU1FX0NMQVNTCitHU1RfSVNfVFdPX0xBTUUKK0dTVF9JU19UV09fTEFNRV9DTEFTUworR1NUX1RZUEVfVFdPX0xBTUUKK2dzdF90d29fbGFtZV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtdWRwc2luazwvRklMRT4KKzxUSVRMRT51ZHBzaW5rPC9USVRMRT4KK0dzdFVEUFNpbmsKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0VURQU2lua0NsYXNzCitHU1RfVURQX1NJTksKK0dTVF9VRFBfU0lOS19DQVNUCitHU1RfSVNfVURQX1NJTksKK0dTVF9VRFBfU0lOS19DTEFTUworR1NUX0lTX1VEUF9TSU5LX0NMQVNTCitHU1RfVFlQRV9VRFBfU0lOSworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF91ZHBfc2lua19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtdWRwc3JjPC9GSUxFPgorPFRJVExFPnVkcHNyYzwvVElUTEU+CitHc3RVRFBTcmMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0VURQU3JjQ2xhc3MKK0dTVF9VRFBfU1JDCitHU1RfVURQX1NSQ19DQVNUCitHU1RfSVNfVURQX1NSQworR1NUX1VEUF9TUkNfQ0xBU1MKK0dTVF9JU19VRFBfU1JDX0NMQVNTCitHU1RfVFlQRV9VRFBfU1JDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3VkcF9zcmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXY0bDJyYWRpbzwvRklMRT4KKzxUSVRMRT52NGwycmFkaW88L1RJVExFPgorR3N0VjRsMlJhZGlvCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFY0bDJSYWRpb0NsYXNzCitHU1RfVjRMMl9SQURJTworR1NUX1Y0TDJfUkFESU9fQ0FTVAorR1NUX0lTX1Y0TDJfUkFESU8KK0dTVF9WNEwyX1JBRElPX0NMQVNTCitHU1RfSVNfVjRMMl9SQURJT19DTEFTUworR1NUX1RZUEVfVjRMMl9SQURJTworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF92NGwyX3JhZGlvX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC12NGwyc2luazwvRklMRT4KKzxUSVRMRT52NGwyc2luazwvVElUTEU+CitHc3RWNGwyU2luaworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RWNGwyU2lua0NsYXNzCitHU1RfVjRMMl9TSU5LCitHU1RfVjRMMl9TSU5LX0NBU1QKK0dTVF9JU19WNEwyX1NJTksKK0dTVF9WNEwyX1NJTktfQ0xBU1MKK0dTVF9JU19WNEwyX1NJTktfQ0xBU1MKK0dTVF9UWVBFX1Y0TDJfU0lOSworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF92NGwyX3NpbmtfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXY0bDJzcmM8L0ZJTEU+Cis8VElUTEU+djRsMnNyYzwvVElUTEU+CitHc3RWNGwyU3JjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFY0bDJTcmNDbGFzcworR1NUX1Y0TDJfU1JDCitHU1RfVjRMMl9TUkNfQ0FTVAorR1NUX0lTX1Y0TDJfU1JDCitHU1RfVjRMMl9TUkNfQ0xBU1MKK0dTVF9JU19WNEwyX1NSQ19DTEFTUworR1NUX1RZUEVfVjRMMl9TUkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfdjRsMl9zcmNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXZwOGRlYzwvRklMRT4KKzxUSVRMRT52cDhkZWM8L1RJVExFPgorR3N0VlA4RGVjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFZQOERlY0NsYXNzCitHU1RfVl9QOF9ERUMKK0dTVF9WX1A4X0RFQ19DQVNUCitHU1RfSVNfVl9QOF9ERUMKK0dTVF9WX1A4X0RFQ19DTEFTUworR1NUX0lTX1ZfUDhfREVDX0NMQVNTCitHU1RfVFlQRV9WX1A4X0RFQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF92X3A4X2RlY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtdnA4ZW5jPC9GSUxFPgorPFRJVExFPnZwOGVuYzwvVElUTEU+CitHc3RWUDhFbmMKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0VlA4RW5jQ2xhc3MKK0dTVF9WX1A4X0VOQworR1NUX1ZfUDhfRU5DX0NBU1QKK0dTVF9JU19WX1A4X0VOQworR1NUX1ZfUDhfRU5DX0NMQVNTCitHU1RfSVNfVl9QOF9FTkNfQ0xBU1MKK0dTVF9UWVBFX1ZfUDhfRU5DCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3ZfcDhfZW5jX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC12cDlkZWM8L0ZJTEU+Cis8VElUTEU+dnA5ZGVjPC9USVRMRT4KK0dzdFZQOURlYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RWUDlEZWNDbGFzcworR1NUX1ZfUDlfREVDCitHU1RfVl9QOV9ERUNfQ0FTVAorR1NUX0lTX1ZfUDlfREVDCitHU1RfVl9QOV9ERUNfQ0xBU1MKK0dTVF9JU19WX1A5X0RFQ19DTEFTUworR1NUX1RZUEVfVl9QOV9ERUMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfdl9wOV9kZWNfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXZwOWVuYzwvRklMRT4KKzxUSVRMRT52cDllbmM8L1RJVExFPgorR3N0VlA5RW5jCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFZQOUVuY0NsYXNzCitHU1RfVl9QOV9FTkMKK0dTVF9WX1A5X0VOQ19DQVNUCitHU1RfSVNfVl9QOV9FTkMKK0dTVF9WX1A5X0VOQ19DTEFTUworR1NUX0lTX1ZfUDlfRU5DX0NMQVNTCitHU1RfVFlQRV9WX1A5X0VOQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF92X3A5X2VuY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtdmVydGlnb3R2PC9GSUxFPgorPFRJVExFPnZlcnRpZ290djwvVElUTEU+CitHc3RWZXJ0aWdvVFYKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0VmVydGlnb1RWQ2xhc3MKK0dTVF9WRVJUSUdPX1RWCitHU1RfVkVSVElHT19UVl9DQVNUCitHU1RfSVNfVkVSVElHT19UVgorR1NUX1ZFUlRJR09fVFZfQ0xBU1MKK0dTVF9JU19WRVJUSUdPX1RWX0NMQVNTCitHU1RfVFlQRV9WRVJUSUdPX1RWCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3ZlcnRpZ29fdHZfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXZpZGVvYmFsYW5jZTwvRklMRT4KKzxUSVRMRT52aWRlb2JhbGFuY2U8L1RJVExFPgorR3N0VmlkZW9CYWxhbmNlCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFZpZGVvQmFsYW5jZUNsYXNzCitHU1RfVklERU9fQkFMQU5DRQorR1NUX1ZJREVPX0JBTEFOQ0VfQ0FTVAorR1NUX0lTX1ZJREVPX0JBTEFOQ0UKK0dTVF9WSURFT19CQUxBTkNFX0NMQVNTCitHU1RfSVNfVklERU9fQkFMQU5DRV9DTEFTUworR1NUX1RZUEVfVklERU9fQkFMQU5DRQorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF92aWRlb19iYWxhbmNlX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC12aWRlb2JveDwvRklMRT4KKzxUSVRMRT52aWRlb2JveDwvVElUTEU+CitHc3RWaWRlb0JveAorR3N0VmlkZW9Cb3hGaWxsCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFZpZGVvQm94Q2xhc3MKK0dTVF9WSURFT19CT1gKK0dTVF9WSURFT19CT1hfQ0FTVAorR1NUX0lTX1ZJREVPX0JPWAorR1NUX1ZJREVPX0JPWF9DTEFTUworR1NUX0lTX1ZJREVPX0JPWF9DTEFTUworR1NUX1RZUEVfVklERU9fQk9YCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3ZpZGVvX2JveF9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtdmlkZW9jcm9wPC9GSUxFPgorPFRJVExFPnZpZGVvY3JvcDwvVElUTEU+CitHc3RWaWRlb0Nyb3AKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0VmlkZW9Dcm9wQ2xhc3MKK0dTVF9WSURFT19DUk9QCitHU1RfVklERU9fQ1JPUF9DQVNUCitHU1RfSVNfVklERU9fQ1JPUAorR1NUX1ZJREVPX0NST1BfQ0xBU1MKK0dTVF9JU19WSURFT19DUk9QX0NMQVNTCitHU1RfVFlQRV9WSURFT19DUk9QCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3ZpZGVvX2Nyb3BfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXZpZGVvZmxpcDwvRklMRT4KKzxUSVRMRT52aWRlb2ZsaXA8L1RJVExFPgorR3N0VmlkZW9GbGlwCitHc3RWaWRlb0ZsaXBNZXRob2QKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0VmlkZW9GbGlwQ2xhc3MKK0dTVF9WSURFT19GTElQCitHU1RfVklERU9fRkxJUF9DQVNUCitHU1RfSVNfVklERU9fRkxJUAorR1NUX1ZJREVPX0ZMSVBfQ0xBU1MKK0dTVF9JU19WSURFT19GTElQX0NMQVNTCitHU1RfVFlQRV9WSURFT19GTElQCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3ZpZGVvX2ZsaXBfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXZpZGVvbWVkaWFuPC9GSUxFPgorPFRJVExFPnZpZGVvbWVkaWFuPC9USVRMRT4KK0dzdFZpZGVvTWVkaWFuCitHc3RWaWRlb01lZGlhblNpemUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0VmlkZW9NZWRpYW5DbGFzcworR1NUX1ZJREVPX01FRElBTgorR1NUX1ZJREVPX01FRElBTl9DQVNUCitHU1RfSVNfVklERU9fTUVESUFOCitHU1RfVklERU9fTUVESUFOX0NMQVNTCitHU1RfSVNfVklERU9fTUVESUFOX0NMQVNTCitHU1RfVFlQRV9WSURFT19NRURJQU4KKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3RfdmlkZW9fbWVkaWFuX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC12aWRlb21peGVyPC9GSUxFPgorPFRJVExFPnZpZGVvbWl4ZXI8L1RJVExFPgorR3N0VmlkZW9NaXhlcjIKK0dzdFZpZGVvTWl4ZXIyQmFja2dyb3VuZAorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RWaWRlb01peGVyMkNsYXNzCitHU1RfVklERU9fTUlYRVIyCitHU1RfVklERU9fTUlYRVIyX0NBU1QKK0dTVF9JU19WSURFT19NSVhFUjIKK0dTVF9WSURFT19NSVhFUjJfQ0xBU1MKK0dTVF9JU19WSURFT19NSVhFUjJfQ0xBU1MKK0dTVF9UWVBFX1ZJREVPX01JWEVSMgorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF92aWRlb19taXhlcjJfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXdhcnB0djwvRklMRT4KKzxUSVRMRT53YXJwdHY8L1RJVExFPgorR3N0V2FycFRWCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFdhcnBUVkNsYXNzCitHU1RfV0FSUF9UVgorR1NUX1dBUlBfVFZfQ0FTVAorR1NUX0lTX1dBUlBfVFYKK0dTVF9XQVJQX1RWX0NMQVNTCitHU1RfSVNfV0FSUF9UVl9DTEFTUworR1NUX1RZUEVfV0FSUF9UVgorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF93YXJwX3R2X2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC13YXZlZm9ybXNpbms8L0ZJTEU+Cis8VElUTEU+d2F2ZWZvcm1zaW5rPC9USVRMRT4KK0dzdFdhdmVGb3JtU2luaworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RXYXZlRm9ybVNpbmtDbGFzcworR1NUX0lTX1dBVkVGT1JNX1NJTksKK0dTVF9JU19XQVZFRk9STV9TSU5LX0NMQVNTCitHU1RfV0FWRUZPUk1fU0lOSworR1NUX1dBVkVGT1JNX1NJTktfQ0xBU1MKK0dTVF9UWVBFX1dBVkVGT1JNX1NJTksKK2dzdF93YXZlZm9ybV9zaW5rX2dldF90eXBlCitXQVZFX0ZPUk1BVF85Nk0wOAorV0FWRV9GT1JNQVRfOTZNMTYKK1dBVkVfRk9STUFUXzk2UzA4CitXQVZFX0ZPUk1BVF85NlMxNgorQlVGRkVSX0NPVU5UCitCVUZGRVJfU0laRQorRVJST1JfTEVOR1RICis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC13YXZlbmM8L0ZJTEU+Cis8VElUTEU+d2F2ZW5jPC9USVRMRT4KK0dzdFdhdkVuYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RXYXZFbmNDbGFzcworR1NUX1dBVl9FTkMKK0dTVF9XQVZfRU5DX0NBU1QKK0dTVF9JU19XQVZfRU5DCitHU1RfV0FWX0VOQ19DTEFTUworR1NUX0lTX1dBVl9FTkNfQ0xBU1MKK0dTVF9UWVBFX1dBVl9FTkMKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfd2F2X2VuY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtd2F2cGFyc2U8L0ZJTEU+Cis8VElUTEU+d2F2cGFyc2U8L1RJVExFPgorR3N0V2F2UGFyc2UKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0V2F2UGFyc2VDbGFzcworR1NUX1dBVl9QQVJTRQorR1NUX1dBVl9QQVJTRV9DQVNUCitHU1RfSVNfV0FWX1BBUlNFCitHU1RfV0FWX1BBUlNFX0NMQVNTCitHU1RfSVNfV0FWX1BBUlNFX0NMQVNTCitHU1RfVFlQRV9XQVZfUEFSU0UKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfd2F2X3BhcnNlX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC13YXZwYWNrZGVjPC9GSUxFPgorPFRJVExFPndhdnBhY2tkZWM8L1RJVExFPgorR3N0V2F2cGFja0RlYworPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RXYXZwYWNrRGVjQ2xhc3MKK0dTVF9XQVZQQUNLX0RFQworR1NUX1dBVlBBQ0tfREVDX0NBU1QKK0dTVF9JU19XQVZQQUNLX0RFQworR1NUX1dBVlBBQ0tfREVDX0NMQVNTCitHU1RfSVNfV0FWUEFDS19ERUNfQ0xBU1MKK0dTVF9UWVBFX1dBVlBBQ0tfREVDCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3dhdnBhY2tfZGVjX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC13YXZwYWNrZW5jPC9GSUxFPgorPFRJVExFPndhdnBhY2tlbmM8L1RJVExFPgorR3N0V2F2cGFja0VuYworR3N0V2F2cGFja0VuY0NvcnJlY3Rpb25Nb2RlCitHc3RXYXZwYWNrRW5jSlNNb2RlCitHc3RXYXZwYWNrRW5jTW9kZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RXYXZwYWNrRW5jQ2xhc3MKK0dTVF9XQVZQQUNLX0VOQworR1NUX1dBVlBBQ0tfRU5DX0NBU1QKK0dTVF9JU19XQVZQQUNLX0VOQworR1NUX1dBVlBBQ0tfRU5DX0NMQVNTCitHU1RfSVNfV0FWUEFDS19FTkNfQ0xBU1MKK0dTVF9UWVBFX1dBVlBBQ0tfRU5DCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3dhdnBhY2tfZW5jX2dldF90eXBlCis8L1NFQ1RJT04+CisKKzxTRUNUSU9OPgorPEZJTEU+ZWxlbWVudC13YXZwYWNrcGFyc2U8L0ZJTEU+Cis8VElUTEU+d2F2cGFja3BhcnNlPC9USVRMRT4KK0dzdFdhdnBhY2tQYXJzZQorPFNVQlNFQ1RJT04gU3RhbmRhcmQ+CitHc3RXYXZwYWNrUGFyc2VDbGFzcworR1NUX1dBVlBBQ0tfUEFSU0UKK0dTVF9XQVZQQUNLX1BBUlNFX0NBU1QKK0dTVF9JU19XQVZQQUNLX1BBUlNFCitHU1RfV0FWUEFDS19QQVJTRV9DTEFTUworR1NUX0lTX1dBVlBBQ0tfUEFSU0VfQ0xBU1MKK0dTVF9UWVBFX1dBVlBBQ0tfUEFSU0UKKzxTVUJTRUNUSU9OIFByaXZhdGU+Citnc3Rfd2F2cGFja19wYXJzZV9nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQtd2VibW11eDwvRklMRT4KKzxUSVRMRT53ZWJtbXV4PC9USVRMRT4KK0dzdFdlYk1NdXgKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0V2ViTU11eENsYXNzCitHU1RfV0VCX01fTVVYCitHU1RfV0VCX01fTVVYX0NBU1QKK0dTVF9JU19XRUJfTV9NVVgKK0dTVF9XRUJfTV9NVVhfQ0xBU1MKK0dTVF9JU19XRUJfTV9NVVhfQ0xBU1MKK0dTVF9UWVBFX1dFQl9NX01VWAorPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF93ZWJfbV9tdXhfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKworPFNFQ1RJT04+Cis8RklMRT5lbGVtZW50LXhpbWFnZXNyYzwvRklMRT4KKzxUSVRMRT54aW1hZ2VzcmM8L1RJVExFPgorR3N0WEltYWdlU3JjCis8U1VCU0VDVElPTiBTdGFuZGFyZD4KK0dzdFhJbWFnZVNyY0NsYXNzCitHU1RfWF9JTUFHRV9TUkMKK0dTVF9YX0lNQUdFX1NSQ19DQVNUCitHU1RfSVNfWF9JTUFHRV9TUkMKK0dTVF9YX0lNQUdFX1NSQ19DTEFTUworR1NUX0lTX1hfSU1BR0VfU1JDX0NMQVNTCitHU1RfVFlQRV9YX0lNQUdFX1NSQworPFNVQlNFQ1RJT04gUHJpdmF0ZT4KK2dzdF94X2ltYWdlX3NyY19nZXRfdHlwZQorPC9TRUNUSU9OPgorCis8U0VDVElPTj4KKzxGSUxFPmVsZW1lbnQteTRtZW5jPC9GSUxFPgorPFRJVExFPnk0bWVuYzwvVElUTEU+CitHc3RZNG1FbmNvZGUKKzxTVUJTRUNUSU9OIFN0YW5kYXJkPgorR3N0WTRtRW5jb2RlQ2xhc3MKK0dTVF9ZNE1fRU5DT0RFCitHU1RfWTRNX0VOQ09ERV9DQVNUCitHU1RfSVNfWTRNX0VOQ09ERQorR1NUX1k0TV9FTkNPREVfQ0xBU1MKK0dTVF9JU19ZNE1fRU5DT0RFX0NMQVNTCitHU1RfVFlQRV9ZNE1fRU5DT0RFCis8U1VCU0VDVElPTiBQcml2YXRlPgorZ3N0X3k0bV9lbmNvZGVfZ2V0X3R5cGUKKzwvU0VDVElPTj4KKwpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzIGIvZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5hcmdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzgzMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmFyZ3MKQEAgLTAsMCArMSwyNDU4MCBAQAorPEFSRz4KKzxOQU1FPkdzdElpckVxdWFsaXplcjEwQmFuZHM6OmJhbmQwPC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bLTI0LDEyXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+MjkgSHo8L05JQ0s+Cis8QkxVUkI+Z2FpbiBmb3IgdGhlIGZyZXF1ZW5jeSBiYW5kIDI5IEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SWlyRXF1YWxpemVyMTBCYW5kczo6YmFuZDE8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlstMjQsMTJdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz41OSBIejwvTklDSz4KKzxCTFVSQj5nYWluIGZvciB0aGUgZnJlcXVlbmN5IGJhbmQgNTkgSHosIHJhbmdpbmcgZnJvbSAtMjQgZEIgdG8gKzEyIGRCLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJaXJFcXVhbGl6ZXIxMEJhbmRzOjpiYW5kMjwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Wy0yNCwxMl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPjExOSBIejwvTklDSz4KKzxCTFVSQj5nYWluIGZvciB0aGUgZnJlcXVlbmN5IGJhbmQgMTE5IEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SWlyRXF1YWxpemVyMTBCYW5kczo6YmFuZDM8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlstMjQsMTJdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz4yMzcgSHo8L05JQ0s+Cis8QkxVUkI+Z2FpbiBmb3IgdGhlIGZyZXF1ZW5jeSBiYW5kIDIzNyBIeiwgcmFuZ2luZyBmcm9tIC0yNCBkQiB0byArMTIgZEIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdElpckVxdWFsaXplcjEwQmFuZHM6OmJhbmQ0PC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bLTI0LDEyXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+NDc0IEh6PC9OSUNLPgorPEJMVVJCPmdhaW4gZm9yIHRoZSBmcmVxdWVuY3kgYmFuZCA0NzQgSHosIHJhbmdpbmcgZnJvbSAtMjQgZEIgdG8gKzEyIGRCLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJaXJFcXVhbGl6ZXIxMEJhbmRzOjpiYW5kNTwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Wy0yNCwxMl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPjk0NyBIejwvTklDSz4KKzxCTFVSQj5nYWluIGZvciB0aGUgZnJlcXVlbmN5IGJhbmQgOTQ3IEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SWlyRXF1YWxpemVyMTBCYW5kczo6YmFuZDY8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlstMjQsMTJdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz4xODg5IEh6PC9OSUNLPgorPEJMVVJCPmdhaW4gZm9yIHRoZSBmcmVxdWVuY3kgYmFuZCAxODg5IEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SWlyRXF1YWxpemVyMTBCYW5kczo6YmFuZDc8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlstMjQsMTJdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz4zNzcwIEh6PC9OSUNLPgorPEJMVVJCPmdhaW4gZm9yIHRoZSBmcmVxdWVuY3kgYmFuZCAzNzcwIEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SWlyRXF1YWxpemVyMTBCYW5kczo6YmFuZDg8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlstMjQsMTJdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz43NTIzIEh6PC9OSUNLPgorPEJMVVJCPmdhaW4gZm9yIHRoZSBmcmVxdWVuY3kgYmFuZCA3NTIzIEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SWlyRXF1YWxpemVyMTBCYW5kczo6YmFuZDk8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlstMjQsMTJdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz4xNTAxMSBIejwvTklDSz4KKzxCTFVSQj5nYWluIGZvciB0aGUgZnJlcXVlbmN5IGJhbmQgMTUwMTEgSHosIHJhbmdpbmcgZnJvbSAtMjQgZEIgdG8gKzEyIGRCLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJaXJFcXVhbGl6ZXIzQmFuZHM6OmJhbmQwPC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bLTI0LDEyXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+MTEwIEh6PC9OSUNLPgorPEJMVVJCPmdhaW4gZm9yIHRoZSBmcmVxdWVuY3kgYmFuZCAxMDAgSHosIHJhbmdpbmcgZnJvbSAtMjQuMCB0byArMTIuMC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SWlyRXF1YWxpemVyM0JhbmRzOjpiYW5kMTwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Wy0yNCwxMl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPjExMDAgSHo8L05JQ0s+Cis8QkxVUkI+Z2FpbiBmb3IgdGhlIGZyZXF1ZW5jeSBiYW5kIDExMDAgSHosIHJhbmdpbmcgZnJvbSAtMjQuMCB0byArMTIuMC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SWlyRXF1YWxpemVyM0JhbmRzOjpiYW5kMjwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Wy0yNCwxMl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPjExIGtIejwvTklDSz4KKzxCTFVSQj5nYWluIGZvciB0aGUgZnJlcXVlbmN5IGJhbmQgMTEga0h6LCByYW5naW5nIGZyb20gLTI0LjAgdG8gKzEyLjAuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdElpckVxdWFsaXplck5CYW5kczo6bnVtLWJhbmRzPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsNjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+bnVtLWJhbmRzPC9OSUNLPgorPEJMVVJCPm51bWJlciBvZiBkaWZmZXJlbnQgYmFuZHMgdG8gdXNlLjwvQkxVUkI+Cis8REVGQVVMVD4xMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlGaWxlU2luazo6bG9jYXRpb248L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5GaWxlIExvY2F0aW9uPC9OSUNLPgorPEJMVVJCPkxvY2F0aW9uIG9mIHRoZSBmaWxlIHRvIHdyaXRlLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNdWx0aUZpbGVTaW5rOjppbmRleDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SW5kZXg8L05JQ0s+Cis8QkxVUkI+SW5kZXggdG8gdXNlIHdpdGggbG9jYXRpb24gcHJvcGVydHkgdG8gY3JlYXRlIGZpbGUgbmFtZXMuICBUaGUgaW5kZXggaXMgaW5jcmVtZW50ZWQgYnkgb25lIGZvciBlYWNoIGJ1ZmZlciB3cml0dGVuLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNdWx0aUZpbGVTaW5rOjpuZXh0LWZpbGU8L05BTUU+Cis8VFlQRT5Hc3RNdWx0aUZpbGVTaW5rTmV4dDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk5leHQgRmlsZTwvTklDSz4KKzxCTFVSQj5XaGVuIHRvIHN0YXJ0IGEgbmV3IGZpbGUuPC9CTFVSQj4KKzxERUZBVUxUPk5ldyBmaWxlIGZvciBlYWNoIGJ1ZmZlcjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlGaWxlU2luazo6cG9zdC1tZXNzYWdlczwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UG9zdCBNZXNzYWdlczwvTklDSz4KKzxCTFVSQj5Qb3N0IGEgbWVzc2FnZSBmb3IgZWFjaCBmaWxlIHdpdGggaW5mb3JtYXRpb24gb2YgdGhlIGJ1ZmZlci48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpRmlsZVNpbms6Om1heC1maWxlczwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IGZpbGVzPC9OSUNLPgorPEJMVVJCPk1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRvIGtlZXAgb24gZGlzay4gT25jZSB0aGUgbWF4aW11bSBpcyByZWFjaGVkLG9sZCBmaWxlcyBzdGFydCB0byBiZSBkZWxldGVkIHRvIG1ha2Ugcm9vbSBmb3IgbmV3IG9uZXMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpRmlsZVNpbms6Om1heC1maWxlLXNpemU8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4aW11bSBGaWxlIFNpemU8L05JQ0s+Cis8QkxVUkI+TWF4aW11bSBmaWxlIHNpemUgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IGZpbGUgaW4gbWF4LXNpemUgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+MjE0NzQ4MzY0ODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlGaWxlU2luazo6YWdncmVnYXRlLWdvcHM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkFnZ3JlZ2F0ZSBHT1BzPC9OSUNLPgorPEJMVVJCPldoZXRoZXIgdG8gYWdncmVnYXRlIEdPUHMgYW5kIHByb2Nlc3MgdGhlbSBhcyBhIHdob2xlIHdpdGhvdXQgc3BsaXR0aW5nLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlGaWxlU2luazo6bWF4LWZpbGUtZHVyYXRpb248L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4aW11bSBGaWxlIER1cmF0aW9uPC9OSUNLPgorPEJMVVJCPk1heGltdW0gZmlsZSBkdXJhdGlvbiBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgZmlsZSBpbiBtYXgtc2l6ZSBtb2RlLjwvQkxVUkI+Cis8REVGQVVMVD4xODQ0Njc0NDA3MzcwOTU1MTYxNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlGaWxlU3JjOjpjYXBzPC9OQU1FPgorPFRZUEU+R3N0Q2Fwcyo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5DYXBzPC9OSUNLPgorPEJMVVJCPkNhcHMgZGVzY3JpYmluZyB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpRmlsZVNyYzo6aW5kZXg8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZpbGUgSW5kZXg8L05JQ0s+Cis8QkxVUkI+SW5kZXggdG8gdXNlIHdpdGggbG9jYXRpb24gcHJvcGVydHkgdG8gY3JlYXRlIGZpbGUgbmFtZXMuICBUaGUgaW5kZXggaXMgaW5jcmVtZW50ZWQgYnkgb25lIGZvciBlYWNoIGJ1ZmZlciByZWFkLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNdWx0aUZpbGVTcmM6OmxvY2F0aW9uPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RmlsZSBMb2NhdGlvbjwvTklDSz4KKzxCTFVSQj5QYXR0ZXJuIHRvIGNyZWF0ZSBmaWxlIG5hbWVzIG9mIGlucHV0IGZpbGVzLiAgRmlsZSBuYW1lcyBhcmUgY3JlYXRlZCBieSBjYWxsaW5nIHNwcmludGYoKSB3aXRoIHRoZSBwYXR0ZXJuIGFuZCB0aGUgY3VycmVudCBpbmRleC48L0JMVVJCPgorPERFRkFVTFQ+IiUwNWQiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNdWx0aUZpbGVTcmM6Omxvb3A8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkxvb3A8L05JQ0s+Cis8QkxVUkI+V2hldGhlciB0byByZXBlYXQgZnJvbSB0aGUgYmVnaW5uaW5nIHdoZW4gYWxsIGZpbGVzIGhhdmUgYmVlbiByZWFkLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlGaWxlU3JjOjpzdGFydC1pbmRleDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U3RhcnQgSW5kZXg8L05JQ0s+Cis8QkxVUkI+U3RhcnQgdmFsdWUgb2YgaW5kZXguICBUaGUgaW5pdGlhbCB2YWx1ZSBvZiBpbmRleCBjYW4gYmUgc2V0IGVpdGhlciBieSBzZXR0aW5nIGluZGV4IG9yIHN0YXJ0LWluZGV4LiAgV2hlbiB0aGUgZW5kIG9mIHRoZSBsb29wIGlzIHJlYWNoZWQsIHRoZSBpbmRleCB3aWxsIGJlIHNldCB0byB0aGUgdmFsdWUgc3RhcnQtaW5kZXguPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpRmlsZVNyYzo6c3RvcC1pbmRleDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U3RvcCBJbmRleDwvTklDSz4KKzxCTFVSQj5TdG9wIHZhbHVlIG9mIGluZGV4LiAgVGhlIHNwZWNpYWwgdmFsdWUgLTEgbWVhbnMgbm8gc3RvcC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0T3NzU3JjOjpkZXZpY2U8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EZXZpY2U8L05JQ0s+Cis8QkxVUkI+T1NTIGRldmljZSAodXN1YWxseSAvZGV2L2RzcE4pLjwvQkxVUkI+Cis8REVGQVVMVD4iL2Rldi9kc3AiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RPc3NTcmM6OmRldmljZS1uYW1lPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5EZXZpY2UgbmFtZTwvTklDSz4KKzxCTFVSQj5IdW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBzb3VuZCBkZXZpY2UuPC9CTFVSQj4KKzxERUZBVUxUPiIiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTcGVjdHJ1bTo6YmFuZHM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT5bMiwxMDczNzQxODI0XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QmFuZHM8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIGZyZXF1ZW5jeSBiYW5kcy48L0JMVVJCPgorPERFRkFVTFQ+MTI4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTcGVjdHJ1bTo6aW50ZXJ2YWw8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPj49IDE8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVydmFsPC9OSUNLPgorPEJMVVJCPkludGVydmFsIG9mIHRpbWUgYmV0d2VlbiBtZXNzYWdlIHBvc3RzIChpbiBuYW5vc2Vjb25kcykuPC9CTFVSQj4KKzxERUZBVUxUPjEwMDAwMDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BlY3RydW06OnRocmVzaG9sZDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VGhyZXNob2xkPC9OSUNLPgorPEJMVVJCPmRCIHRocmVzaG9sZCBmb3IgcmVzdWx0LiBBbGwgbG93ZXIgdmFsdWVzIHdpbGwgYmUgc2V0IHRvIHRoaXMuPC9CTFVSQj4KKzxERUZBVUxUPi02MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BlY3RydW06Om1lc3NhZ2UtbWFnbml0dWRlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYWduaXR1ZGU8L05JQ0s+Cis8QkxVUkI+V2hldGhlciB0byBhZGQgYSAnbWFnbml0dWRlJyBmaWVsZCB0byB0aGUgc3RydWN0dXJlIG9mIGFueSAnc3BlY3RydW0nIGVsZW1lbnQgbWVzc2FnZXMgcG9zdGVkIG9uIHRoZSBidXMuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwZWN0cnVtOjptZXNzYWdlLXBoYXNlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5QaGFzZTwvTklDSz4KKzxCTFVSQj5XaGV0aGVyIHRvIGFkZCBhICdwaGFzZScgZmllbGQgdG8gdGhlIHN0cnVjdHVyZSBvZiBhbnkgJ3NwZWN0cnVtJyBlbGVtZW50IG1lc3NhZ2VzIHBvc3RlZCBvbiB0aGUgYnVzLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BlY3RydW06OnBvc3QtbWVzc2FnZXM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBvc3QgTWVzc2FnZXM8L05JQ0s+Cis8QkxVUkI+V2hldGhlciB0byBwb3N0IGEgJ3NwZWN0cnVtJyBlbGVtZW50IG1lc3NhZ2Ugb24gdGhlIGJ1cyBmb3IgZWFjaCBwYXNzZWQgaW50ZXJ2YWwuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwZWN0cnVtOjptdWx0aS1jaGFubmVsPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NdWx0aWNoYW5uZWwgcmVzdWx0czwvTklDSz4KKzxCTFVSQj5TZW5kIHNlcGFyYXRlIHJlc3VsdHMgZm9yIGVhY2ggY2hhbm5lbC48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvQm94OjphbHBoYTwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkFscGhhPC9OSUNLPgorPEJMVVJCPkFscGhhIHZhbHVlIHBpY3R1cmUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvQm94Ojpib3JkZXItYWxwaGE8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Cb3JkZXIgQWxwaGE8L05JQ0s+Cis8QkxVUkI+QWxwaGEgdmFsdWUgb2YgdGhlIGJvcmRlci48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VmlkZW9Cb3g6OmJvdHRvbTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Cb3R0b208L05JQ0s+Cis8QkxVUkI+UGl4ZWxzIHRvIGJveCBhdCBib3R0b20gKDwwID0gYWRkIGEgYm9yZGVyKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VmlkZW9Cb3g6OmZpbGw8L05BTUU+Cis8VFlQRT5Hc3RWaWRlb0JveEZpbGw8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5GaWxsPC9OSUNLPgorPEJMVVJCPkhvdyB0byBmaWxsIHRoZSBib3JkZXJzLjwvQkxVUkI+Cis8REVGQVVMVD5CbGFjazwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VmlkZW9Cb3g6OmxlZnQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TGVmdDwvTklDSz4KKzxCTFVSQj5QaXhlbHMgdG8gYm94IGF0IGxlZnQgKDwwICA9IGFkZCBhIGJvcmRlcikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvQm94OjpyaWdodDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SaWdodDwvTklDSz4KKzxCTFVSQj5QaXhlbHMgdG8gYm94IGF0IHJpZ2h0ICg8MCA9IGFkZCBhIGJvcmRlcikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvQm94Ojp0b3A8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VG9wPC9OSUNLPgorPEJMVVJCPlBpeGVscyB0byBib3ggYXQgdG9wICg8MCA9IGFkZCBhIGJvcmRlcikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvQm94OjphdXRvY3JvcDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QXV0byBjcm9wPC9OSUNLPgorPEJMVVJCPkF1dG8gY3JvcC48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFVEUFNpbms6Omhvc3Q8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5ob3N0PC9OSUNLPgorPEJMVVJCPlRoZSBob3N0L0lQL011bHRpY2FzdCBncm91cCB0byBzZW5kIHRoZSBwYWNrZXRzIHRvLjwvQkxVUkI+Cis8REVGQVVMVD4ibG9jYWxob3N0IjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VURQU2luazo6cG9ydDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNjU1MzVdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5wb3J0PC9OSUNLPgorPEJMVVJCPlRoZSBwb3J0IHRvIHNlbmQgdGhlIHBhY2tldHMgdG8uPC9CTFVSQj4KKzxERUZBVUxUPjUwMDQ8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFVEUFNyYzo6Y2FwczwvTkFNRT4KKzxUWVBFPkdzdENhcHMqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q2FwczwvTklDSz4KKzxCTFVSQj5UaGUgY2FwcyBvZiB0aGUgc291cmNlIHBhZC48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RVRFBTcmM6Om11bHRpY2FzdC1ncm91cDwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk11bHRpY2FzdCBHcm91cDwvTklDSz4KKzxCTFVSQj5UaGUgQWRkcmVzcyBvZiBtdWx0aWNhc3QgZ3JvdXAgdG8gam9pbi4gKERFUFJFQ0FURUQ6IFVzZSBhZGRyZXNzIHByb3BlcnR5IGluc3RlYWQpLjwvQkxVUkI+Cis8REVGQVVMVD4iMC4wLjAuMCI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFVEUFNyYzo6cG9ydDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNjU1MzVdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qb3J0PC9OSUNLPgorPEJMVVJCPlRoZSBwb3J0IHRvIHJlY2VpdmUgdGhlIHBhY2tldHMgZnJvbSwgMD1hbGxvY2F0ZS48L0JMVVJCPgorPERFRkFVTFQ+NTAwNDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VURQU3JjOjp1cmk8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5VUkk8L05JQ0s+Cis8QkxVUkI+VVJJIGluIHRoZSBmb3JtIG9mIHVkcDovL211bHRpY2FzdF9ncm91cDpwb3J0LjwvQkxVUkI+Cis8REVGQVVMVD4idWRwOi8vMC4wLjAuMDo1MDA0IjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VURQU3JjOjpidWZmZXItc2l6ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QnVmZmVyIFNpemU8L05JQ0s+Cis8QkxVUkI+U2l6ZSBvZiB0aGUga2VybmVsIHJlY2VpdmUgYnVmZmVyIGluIGJ5dGVzLCAwPWRlZmF1bHQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFVEUFNyYzo6dGltZW91dDwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UaW1lb3V0PC9OSUNLPgorPEJMVVJCPlBvc3QgYSBtZXNzYWdlIGFmdGVyIHRpbWVvdXQgbmFub3NlY29uZHMgKDAgPSBkaXNhYmxlZCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFVEUFNyYzo6c2tpcC1maXJzdC1ieXRlczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U2tpcCBmaXJzdCBieXRlczwvTklDSz4KKzxCTFVSQj5udW1iZXIgb2YgYnl0ZXMgdG8gc2tpcCBmb3IgZWFjaCB1ZHAgcGFja2V0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RVRFBTcmM6OmF1dG8tbXVsdGljYXN0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5BdXRvIE11bHRpY2FzdDwvTklDSz4KKzxCTFVSQj5BdXRvbWF0aWNhbGx5IGpvaW4vbGVhdmUgbXVsdGljYXN0IGdyb3Vwcy48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VURQU3JjOjptdWx0aWNhc3QtaWZhY2U8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NdWx0aWNhc3QgSW50ZXJmYWNlPC9OSUNLPgorPEJMVVJCPlRoZSBuZXR3b3JrIGludGVyZmFjZSBvbiB3aGljaCB0byBqb2luIHRoZSBtdWx0aWNhc3QgZ3JvdXAuVGhpcyBhbGxvd3MgbXVsdGlwbGUgaW50ZXJmYWNlcyBzZXBlcmF0ZWQgYnkgY29tbWEuICgiZXRoMCxldGgxIikuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFVEUFNyYzo6cmV1c2U8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJldXNlPC9OSUNLPgorPEJMVVJCPkVuYWJsZSByZXVzZSBvZiB0aGUgcG9ydC48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VURQU3JjOjpjbG9zZS1zb2NrZXQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNsb3NlIHNvY2tldDwvTklDSz4KKzxCTFVSQj5DbG9zZSBzb2NrZXQgaWYgcGFzc2VkIGFzIHByb3BlcnR5IG9uIHN0YXRlIGNoYW5nZS48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VURQU3JjOjpzb2NrZXQ8L05BTUU+Cis8VFlQRT5HU29ja2V0KjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNvY2tldDwvTklDSz4KKzxCTFVSQj5Tb2NrZXQgdG8gdXNlIGZvciBVRFAgcmVjZXB0aW9uLiAoTlVMTCA9PSBhbGxvY2F0ZSkuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VURQU3JjOjp1c2VkLXNvY2tldDwvTkFNRT4KKzxUWVBFPkdTb2NrZXQqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5Tb2NrZXQgSGFuZGxlPC9OSUNLPgorPEJMVVJCPlNvY2tldCBjdXJyZW50bHkgaW4gdXNlIGZvciBVRFAgcmVjZXB0aW9uLiAoTlVMTCA9IG5vIHNvY2tldCkuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VURQU3JjOjphZGRyZXNzPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QWRkcmVzczwvTklDSz4KKzxCTFVSQj5BZGRyZXNzIHRvIHJlY2VpdmUgcGFja2V0cyBmb3IuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgbXVsdGljYXN0LWdyb3VwIHByb3BlcnR5IGZvciBub3cuPC9CTFVSQj4KKzxERUZBVUxUPiIwLjAuMC4wIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VURQU3JjOjpsb29wPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NdWx0aWNhc3QgTG9vcGJhY2s8L05JQ0s+Cis8QkxVUkI+VXNlZCBmb3Igc2V0dGluZyB0aGUgbXVsdGljYXN0IGxvb3AgcGFyYW1ldGVyLiBUUlVFID0gZW5hYmxlLCBGQUxTRSA9IGRpc2FibGUuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFVEUFNyYzo6cmV0cmlldmUtc2VuZGVyLWFkZHJlc3M8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJldHJpZXZlIFNlbmRlciBBZGRyZXNzPC9OSUNLPgorPEJMVVJCPldoZXRoZXIgdG8gcmV0cmlldmUgdGhlIHNlbmRlciBhZGRyZXNzIGFuZCBhZGQgaXQgdG8gYnVmZmVycyBhcyBtZXRhLiBEaXNhYmxpbmcgdGhpcyBtaWdodCByZXN1bHQgaW4gbWlub3IgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGluIGNlcnRhaW4gc2NlbmFyaW9zLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTTVBURTo6Ym9yZGVyPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Cb3JkZXI8L05JQ0s+Cis8QkxVUkI+VGhlIGJvcmRlciB3aWR0aCBvZiB0aGUgdHJhbnNpdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U01QVEU6OmRlcHRoPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSwyNF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRlcHRoPC9OSUNLPgorPEJMVVJCPkRlcHRoIG9mIHRoZSBtYXNrIGluIGJpdHMuPC9CTFVSQj4KKzxERUZBVUxUPjE2PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTTVBURTo6dHlwZTwvTkFNRT4KKzxUWVBFPkdzdFNNUFRFVHJhbnNpdGlvblR5cGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UeXBlPC9OSUNLPgorPEJMVVJCPlRoZSB0eXBlIG9mIHRyYW5zaXRpb24gdG8gdXNlLjwvQkxVUkI+Cis8REVGQVVMVD5BIGJhciBtb3ZlcyBmcm9tIGxlZnQgdG8gcmlnaHQ8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNNUFRFOjpkdXJhdGlvbjwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EdXJhdGlvbjwvTklDSz4KKzxCTFVSQj5EdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBlZmZlY3QgaW4gbmFub3NlY29uZHMuPC9CTFVSQj4KKzxERUZBVUxUPjEwMDAwMDAwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNNUFRFOjppbnZlcnQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludmVydDwvTklDSz4KKzxCTFVSQj5JbnZlcnQgdHJhbnNpdGlvbiBtYXNrLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6ZGVidWc8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRlYnVnPC9OSUNLPgorPEJMVVJCPkR1bXAgcmVxdWVzdCBhbmQgcmVzcG9uc2UgbWVzc2FnZXMgdG8gc3Rkb3V0KERFUFJFQ0FURUQ6IFByaW50ZWQgYWxsIFJUU1AgbWVzc2FnZSB0byBnc3RyZWFtZXIgbG9nIGFzICdsb2cnIGxldmVsKS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OmxvY2F0aW9uPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UlRTUCBMb2NhdGlvbjwvTklDSz4KKzxCTFVSQj5Mb2NhdGlvbiBvZiB0aGUgUlRTUCB1cmwgdG8gcmVhZC48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6cHJvdG9jb2xzPC9OQU1FPgorPFRZUEU+R3N0UlRTUExvd2VyVHJhbnM8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qcm90b2NvbHM8L05JQ0s+Cis8QkxVUkI+QWxsb3dlZCBsb3dlciB0cmFuc3BvcnQgcHJvdG9jb2xzLjwvQkxVUkI+Cis8REVGQVVMVD5HU1RfUlRTUF9MT1dFUl9UUkFOU19VRFB8R1NUX1JUU1BfTE9XRVJfVFJBTlNfVURQX01DQVNUfEdTVF9SVFNQX0xPV0VSX1RSQU5TX1RDUDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6cmV0cnk8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSA2NTUzNTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UmV0cnk8L05JQ0s+Cis8QkxVUkI+TWF4IG51bWJlciBvZiByZXRyaWVzIHdoZW4gYWxsb2NhdGluZyBSVFAgcG9ydHMuPC9CTFVSQj4KKzxERUZBVUxUPjIwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjp0aW1lb3V0PC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRpbWVvdXQ8L05JQ0s+Cis8QkxVUkI+UmV0cnkgVENQIHRyYW5zcG9ydCBhZnRlciBVRFAgdGltZW91dCBtaWNyb3NlY29uZHMgKDAgPSBkaXNhYmxlZCkuPC9CTFVSQj4KKzxERUZBVUxUPjUwMDAwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkJ1ZmZlciBsYXRlbmN5IGluIG1zPC9OSUNLPgorPEJMVVJCPkFtb3VudCBvZiBtcyB0byBidWZmZXIuPC9CTFVSQj4KKzxERUZBVUxUPjIwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OnRjcC10aW1lb3V0PC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRDUCBUaW1lb3V0PC9OSUNLPgorPEJMVVJCPkZhaWwgYWZ0ZXIgdGltZW91dCBtaWNyb3NlY29uZHMgb24gVENQIGNvbm5lY3Rpb25zICgwID0gZGlzYWJsZWQpLjwvQkxVUkI+Cis8REVGQVVMVD4yMDAwMDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6Y29ubmVjdGlvbi1zcGVlZDwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PD0gMTg0NDY3NDQwNzM3MDk1NTE8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNvbm5lY3Rpb24gU3BlZWQ8L05JQ0s+Cis8QkxVUkI+TmV0d29yayBjb25uZWN0aW9uIHNwZWVkIGluIGticHMgKDAgPSB1bmtub3duKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6bmF0LW1ldGhvZDwvTkFNRT4KKzxUWVBFPkdzdFJUU1BOYXRNZXRob2Q8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5OQVQgTWV0aG9kPC9OSUNLPgorPEJMVVJCPk1ldGhvZCB0byB1c2UgZm9yIHRyYXZlcnNpbmcgZmlyZXdhbGxzIGFuZCBOQVQuPC9CTFVSQj4KKzxERUZBVUxUPlNlbmQgRHVtbXkgcGFja2V0czwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6ZG8tcnRjcDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RG8gUlRDUDwvTklDSz4KKzxCTFVSQj5TZW5kIFJUQ1AgcGFja2V0cywgZGlzYWJsZSBmb3Igb2xkIGluY29tcGF0aWJsZSBzZXJ2ZXIuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OnByb3h5PC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UHJveHk8L05JQ0s+Cis8QkxVUkI+UHJveHkgc2V0dGluZ3MgZm9yIEhUVFAgdHVubmVsaW5nLiBGb3JtYXQ6IFtodHRwOi8vXVt1c2VyOnBhc3N3ZEBdaG9zdFs6cG9ydF0uPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OnJ0cC1ibG9ja3NpemU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSA2NTUzNjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UlRQIEJsb2Nrc2l6ZTwvTklDSz4KKzxCTFVSQj5SVFAgcGFja2FnZSBzaXplIHRvIHN1Z2dlc3QgdG8gc2VydmVyICgwID0gZGlzYWJsZWQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjp1c2VyLWlkPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+dXNlci1pZDwvTklDSz4KKzxCTFVSQj5SVFNQIGxvY2F0aW9uIFVSSSB1c2VyIGlkIGZvciBhdXRoZW50aWNhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6dXNlci1wdzwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPnVzZXItcHc8L05JQ0s+Cis8QkxVUkI+UlRTUCBsb2NhdGlvbiBVUkkgdXNlciBwYXNzd29yZCBmb3IgYXV0aGVudGljYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OmJ1ZmZlci1tb2RlPC9OQU1FPgorPFRZUEU+R3N0UlRTUFNyY0J1ZmZlck1vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CdWZmZXIgTW9kZTwvTklDSz4KKzxCTFVSQj5Db250cm9sIHRoZSBidWZmZXJpbmcgYWxnb3JpdGhtIGluIHVzZS48L0JMVVJCPgorPERFRkFVTFQ+Q2hvb3NlIG1vZGUgZGVwZW5kaW5nIG9uIHN0cmVhbSBsaXZlPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjpwb3J0LXJhbmdlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UG9ydCByYW5nZTwvTklDSz4KKzxCTFVSQj5DbGllbnQgcG9ydCByYW5nZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlY2VpdmUgUlRQIGFuZCBSVENQIGRhdGEsIGVnLiAzMDAwLTMwMDUgKE5VTEwgPSBubyByZXN0cmljdGlvbnMpLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjp1ZHAtYnVmZmVyLXNpemU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlVEUCBCdWZmZXIgU2l6ZTwvTklDSz4KKzxCTFVSQj5TaXplIG9mIHRoZSBrZXJuZWwgVURQIHJlY2VpdmUgYnVmZmVyIGluIGJ5dGVzLCAwPWRlZmF1bHQuPC9CTFVSQj4KKzxERUZBVUxUPjUyNDI4ODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6c2hvcnQtaGVhZGVyPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TaG9ydCBIZWFkZXI8L05JQ0s+Cis8QkxVUkI+T25seSBzZW5kIHRoZSBiYXNpYyBSVFNQIGhlYWRlcnMgZm9yIGJyb2tlbiBlbmNvZGVycy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OmRvLXJ0c3Ata2VlcC1hbGl2ZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RG8gUlRTUCBLZWVwIEFsaXZlPC9OSUNLPgorPEJMVVJCPlNlbmQgUlRTUCBrZWVwIGFsaXZlIHBhY2tldHMsIGRpc2FibGUgZm9yIG9sZCBpbmNvbXBhdGlibGUgc2VydmVyLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjpkcm9wLW9uLWxhdGVuY3k8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRyb3AgYnVmZmVycyB3aGVuIG1heGltdW0gbGF0ZW5jeSBpcyByZWFjaGVkPC9OSUNLPgorPEJMVVJCPlRlbGxzIHRoZSBqaXR0ZXJidWZmZXIgdG8gbmV2ZXIgZXhjZWVkIHRoZSBnaXZlbiBsYXRlbmN5IGluIHNpemUuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjpwcm9iYXRpb248L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk51bWJlciBvZiBwcm9iYXRpb25zPC9OSUNLPgorPEJMVVJCPkNvbnNlY3V0aXZlIHBhY2tldCBzZXF1ZW5jZSBudW1iZXJzIHRvIGFjY2VwdCB0aGUgc291cmNlLjwvQkxVUkI+Cis8REVGQVVMVD4yPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjp1ZHAtcmVjb25uZWN0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SZWNvbm5lY3QgdG8gdGhlIHNlcnZlcjwvTklDSz4KKzxCTFVSQj5SZWNvbm5lY3QgdG8gdGhlIHNlcnZlciBpZiBSVFNQIGNvbm5lY3Rpb24gaXMgY2xvc2VkIHdoZW4gZG9pbmcgVURQLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjpwcm94eS1pZDwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPnByb3h5LWlkPC9OSUNLPgorPEJMVVJCPkhUVFAgcHJveHkgVVJJIHVzZXIgaWQgZm9yIGF1dGhlbnRpY2F0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4iIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6cHJveHktcHc8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5wcm94eS1wdzwvTklDSz4KKzxCTFVSQj5IVFRQIHByb3h5IFVSSSB1c2VyIHBhc3N3b3JkIGZvciBhdXRoZW50aWNhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+IiI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6Om11bHRpY2FzdC1pZmFjZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk11bHRpY2FzdCBJbnRlcmZhY2U8L05JQ0s+Cis8QkxVUkI+VGhlIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIHRvIGpvaW4gdGhlIG11bHRpY2FzdCBncm91cC48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRTUFNyYzo6bnRwLXN5bmM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlN5bmMgb24gTlRQIGNsb2NrPC9OSUNLPgorPEJMVVJCPlN5bmNocm9uaXplIHJlY2VpdmVkIHN0cmVhbXMgdG8gdGhlIE5UUCBjbG9jay48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OnVzZS1waXBlbGluZS1jbG9jazwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VXNlIHBpcGVsaW5lIGNsb2NrPC9OSUNLPgorPEJMVVJCPlVzZSB0aGUgcGlwZWxpbmUgcnVubmluZy10aW1lIHRvIHNldCB0aGUgTlRQIHRpbWUgaW4gdGhlIFJUQ1AgU1IgbWVzc2FnZXMoREVQUkVDQVRFRDogVXNlIG50cC10aW1lLXNvdXJjZSBwcm9wZXJ0eSkuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjpzZGVzPC9OQU1FPgorPFRZUEU+R3N0U3RydWN0dXJlKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNERVM8L05JQ0s+Cis8QkxVUkI+VGhlIFNERVMgaXRlbXMgb2YgdGhpcyBzZXNzaW9uLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OnRscy1kYXRhYmFzZTwvTkFNRT4KKzxUWVBFPkdUbHNEYXRhYmFzZSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UTFMgZGF0YWJhc2U8L05JQ0s+Cis8QkxVUkI+VExTIGRhdGFiYXNlIHdpdGggYW5jaG9yIGNlcnRpZmljYXRlIGF1dGhvcml0aWVzIHVzZWQgdG8gdmFsaWRhdGUgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZS48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjp0bHMtdmFsaWRhdGlvbi1mbGFnczwvTkFNRT4KKzxUWVBFPkdUbHNDZXJ0aWZpY2F0ZUZsYWdzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VExTIHZhbGlkYXRpb24gZmxhZ3M8L05JQ0s+Cis8QkxVUkI+VExTIGNlcnRpZmljYXRlIHZhbGlkYXRpb24gZmxhZ3MgdXNlZCB0byB2YWxpZGF0ZSB0aGUgc2VydmVyIGNlcnRpZmljYXRlLjwvQkxVUkI+Cis8REVGQVVMVD5HX1RMU19DRVJUSUZJQ0FURV9VTktOT1dOX0NBfEdfVExTX0NFUlRJRklDQVRFX0JBRF9JREVOVElUWXxHX1RMU19DRVJUSUZJQ0FURV9OT1RfQUNUSVZBVEVEfEdfVExTX0NFUlRJRklDQVRFX0VYUElSRUR8R19UTFNfQ0VSVElGSUNBVEVfUkVWT0tFRHxHX1RMU19DRVJUSUZJQ0FURV9JTlNFQ1VSRXxHX1RMU19DRVJUSUZJQ0FURV9HRU5FUklDX0VSUk9SPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjpkby1yZXRyYW5zbWlzc2lvbjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UmV0cmFuc21pc3Npb248L05JQ0s+Cis8QkxVUkI+QXNrIHRoZSBzZXJ2ZXIgdG8gcmV0cmFuc21pdCBsb3N0IHBhY2tldHMuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OnRscy1pbnRlcmFjdGlvbjwvTkFNRT4KKzxUWVBFPkdUbHNJbnRlcmFjdGlvbio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UTFMgaW50ZXJhY3Rpb248L05JQ0s+Cis8QkxVUkI+QSBHVGxzSW50ZXJhY3Rpb24gb2JqZWN0IHRvIHByb210IHRoZSB1c2VyIGZvciBwYXNzd29yZCBvciBjZXJ0aWZpY2F0ZS48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjpudHAtdGltZS1zb3VyY2U8L05BTUU+Cis8VFlQRT5Hc3RSVFNQU3JjTnRwVGltZVNvdXJjZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk5UUCBUaW1lIFNvdXJjZTwvTklDSz4KKzxCTFVSQj5OVFAgdGltZSBzb3VyY2UgZm9yIFJUQ1AgcGFja2V0cy48L0JMVVJCPgorPERFRkFVTFQ+TlRQIHRpbWUgYmFzZWQgb24gcmVhbHRpbWUgY2xvY2s8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OnVzZXItYWdlbnQ8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Vc2VyIEFnZW50PC9OSUNLPgorPEJMVVJCPlRoZSBVc2VyLUFnZW50IHN0cmluZyB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuPC9CTFVSQj4KKzxERUZBVUxUPiJHU3RyZWFtZXIvMS4xMy4wLjEiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjptYXgtcnRjcC1ydHAtdGltZS1kaWZmPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSBHX01BWFVMT05HPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggUlRDUCBSVFAgVGltZSBEaWZmPC9OSUNLPgorPEJMVVJCPk1heGltdW0gYW1vdW50IG9mIHRpbWUgaW4gbXMgdGhhdCB0aGUgUlRQIHRpbWUgaW4gUlRDUCBTUnMgaXMgYWxsb3dlZCB0byBiZSBhaGVhZCAoLTEgZGlzYWJsZWQpLjwvQkxVUkI+Cis8REVGQVVMVD4xMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFNQU3JjOjpyZmM3MjczLXN5bmM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlN5bmMgb24gUkZDNzI3MyBjbG9jazwvTklDSz4KKzxCTFVSQj5TeW5jaHJvbml6ZSByZWNlaXZlZCBzdHJlYW1zIHRvIHRoZSBSRkM3MjczIGNsb2NrIChyZXF1aXJlcyBjbG9jayBhbmQgb2Zmc2V0IHRvIGJlIHByb3ZpZGVkKS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6OmRlZmF1bHQtcnRzcC12ZXJzaW9uPC9OQU1FPgorPFRZUEU+R3N0UlRTUFZlcnNpb248L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UaGUgUlRTUCB2ZXJzaW9uIHRvIHRyeSBmaXJzdDwvTklDSz4KKzxCTFVSQj5UaGUgUlRTUCB2ZXJzaW9uIHRoYXQgc2hvdWxkIGJlIHRyaWVkIGZpcnN0IHdoZW4gbmVnb3RpYXRpbmcgdmVyc2lvbi48L0JMVVJCPgorPERFRkFVTFQ+R1NUX1JUU1BfVkVSU0lPTl8xXzA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6Om1heC10cy1vZmZzZXQ8L05BTUU+Cis8VFlQRT5naW50NjQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IFRTIE9mZnNldDwvTklDSz4KKzxCTFVSQj5UaGUgbWF4aW11bSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgdGltZSBvZmZzZXQgaW4gKG5hbm9zZWNvbmRzKS4gTm90ZSwgaWYgdGhlIG50cC1zeW5jIHBhcmFtZXRlciBpcyBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgaXMgY2hhbmdlZCB0byAwIChubyBsaW1pdCkuPC9CTFVSQj4KKzxERUZBVUxUPjMwMDAwMDAwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUU1BTcmM6Om1heC10cy1vZmZzZXQtYWRqdXN0bWVudDwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggVGltZXN0YW1wIE9mZnNldCBBZGp1c3RtZW50PC9OSUNLPgorPEJMVVJCPlRoZSBtYXhpbXVtIG51bWJlciBvZiBuYW5vc2Vjb25kcyBwZXIgZnJhbWUgdGhhdCB0aW1lIHN0YW1wIG9mZnNldHMgbWF5IGJlIGFkanVzdGVkICgwID0gbm8gbGltaXQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFBEZWM6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkJ1ZmZlciBsYXRlbmN5IGluIG1zPC9OSUNLPgorPEJMVVJCPkFtb3VudCBvZiBtcyB0byBidWZmZXIuPC9CTFVSQj4KKzxERUZBVUxUPjIwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TGV2ZWw6OmludGVydmFsPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT4+PSAxPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5JbnRlcnZhbDwvTklDSz4KKzxCTFVSQj5JbnRlcnZhbCBvZiB0aW1lIGJldHdlZW4gbWVzc2FnZSBwb3N0cyAoaW4gbmFub3NlY29uZHMpLjwvQkxVUkI+Cis8REVGQVVMVD4xMDAwMDAwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdExldmVsOjptZXNzYWdlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5tZXNzYWdlPC9OSUNLPgorPEJMVVJCPlBvc3QgYSAnbGV2ZWwnIG1lc3NhZ2UgZm9yIGVhY2ggcGFzc2VkIGludGVydmFsIChkZXByZWNhdGVkLCB1c2UgdGhlIHBvc3QtbWVzc2FnZXMgcHJvcGVydHkgaW5zdGVhZCkuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdExldmVsOjpwZWFrLWZhbGxvZmY8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBlYWsgRmFsbG9mZjwvTklDSz4KKzxCTFVSQj5EZWNheSByYXRlIG9mIGRlY2F5IHBlYWsgYWZ0ZXIgVFRMIChpbiBkQi9zZWMpLjwvQkxVUkI+Cis8REVGQVVMVD4xMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TGV2ZWw6OnBlYWstdHRsPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBlYWsgVFRMPC9OSUNLPgorPEJMVVJCPlRpbWUgVG8gTGl2ZSBvZiBkZWNheSBwZWFrIGJlZm9yZSBpdCBmYWxscyBiYWNrIChpbiBuYW5vc2Vjb25kcykuPC9CTFVSQj4KKzxERUZBVUxUPjMwMDAwMDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TGV2ZWw6OnBvc3QtbWVzc2FnZXM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBvc3QgTWVzc2FnZXM8L05JQ0s+Cis8QkxVUkI+V2hldGhlciB0byBwb3N0IGEgJ2xldmVsJyBlbGVtZW50IG1lc3NhZ2Ugb24gdGhlIGJ1cyBmb3IgZWFjaCBwYXNzZWQgaW50ZXJ2YWwuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERpY2VUVjo6c3F1YXJlLWJpdHM8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TcXVhcmUgQml0czwvTklDSz4KKzxCTFVSQj5UaGUgc2l6ZSBvZiB0aGUgU3F1YXJlcy48L0JMVVJCPgorPERFRkFVTFQ+NDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VmVydGlnb1RWOjpzcGVlZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMC4wMSwxMDBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TcGVlZDwvTklDSz4KKzxCTFVSQj5Db250cm9sIHRoZSBzcGVlZCBvZiBtb3ZlbWVudC48L0JMVVJCPgorPERFRkFVTFQ+MC4wMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VmVydGlnb1RWOjp6b29tLXNwZWVkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLjAxLDEuMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlpvb20gU3BlZWQ8L05JQ0s+Cis8QkxVUkI+Q29udHJvbCB0aGUgcmF0ZSBvZiB6b29taW5nLjwvQkxVUkI+Cis8REVGQVVMVD4xLjAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSZXZUVjo6ZGVsYXk8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRlbGF5PC9OSUNLPgorPEJMVVJCPkRlbGF5IGluIGZyYW1lcyBiZXR3ZWVuIHVwZGF0ZXMuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJldlRWOjpnYWluPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSwyMDBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5HYWluPC9OSUNLPgorPEJMVVJCPkNvbnRyb2wgZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+NTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJldlRWOjpsaW5lc3BhY2U8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkxpbmVzcGFjZTwvTklDSz4KKzxCTFVSQj5Db250cm9sIGxpbmUgc3BhY2luZy48L0JMVVJCPgorPERFRkFVTFQ+NjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UXVhcmtUVjo6cGxhbmVzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSw2NF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBsYW5lczwvTklDSz4KKzxCTFVSQj5OdW1iZXIgb2YgcGxhbmVzLjwvQkxVUkI+Cis8REVGQVVMVD4xNjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QWxwaGE6OmFscGhhPC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QWxwaGE8L05JQ0s+Cis8QkxVUkI+VGhlIHZhbHVlIGZvciB0aGUgYWxwaGEgY2hhbm5lbC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QWxwaGE6OmFuZ2xlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDkwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QW5nbGU8L05JQ0s+Cis8QkxVUkI+U2l6ZSBvZiB0aGUgY29sb3JjdWJlIHRvIGNoYW5nZS48L0JMVVJCPgorPERFRkFVTFQ+MjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFscGhhOjptZXRob2Q8L05BTUU+Cis8VFlQRT5Hc3RBbHBoYU1ldGhvZDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1ldGhvZDwvTklDSz4KKzxCTFVSQj5Ib3cgdGhlIGFscGhhIGNoYW5uZWxzIHNob3VsZCBiZSBjcmVhdGVkLjwvQkxVUkI+Cis8REVGQVVMVD5TZXQvYWRqdXN0IGFscGhhIGNoYW5uZWw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFscGhhOjpub2lzZS1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw2NF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk5vaXNlIExldmVsPC9OSUNLPgorPEJMVVJCPlNpemUgb2Ygbm9pc2UgcmFkaXVzLjwvQkxVUkI+Cis8REVGQVVMVD4yPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBbHBoYTo6dGFyZ2V0LWI8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSAyNTU8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRhcmdldCBCbHVlPC9OSUNLPgorPEJMVVJCPlRoZSBibHVlIGNvbG9yIHZhbHVlIGZvciBjdXN0b20gUkdCIGNocm9tYSBrZXlpbmcuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFscGhhOjp0YXJnZXQtZzwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDI1NTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VGFyZ2V0IEdyZWVuPC9OSUNLPgorPEJMVVJCPlRoZSBncmVlbiBjb2xvciB2YWx1ZSBmb3IgY3VzdG9tIFJHQiBjaHJvbWEga2V5aW5nLjwvQkxVUkI+Cis8REVGQVVMVD4yNTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFscGhhOjp0YXJnZXQtcjwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDI1NTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VGFyZ2V0IFJlZDwvTklDSz4KKzxCTFVSQj5UaGUgcmVkIGNvbG9yIHZhbHVlIGZvciBjdXN0b20gUkdCIGNocm9tYSBrZXlpbmcuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFscGhhOjpibGFjay1zZW5zaXRpdml0eTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDEyODwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QmxhY2sgU2Vuc2l0aXZpdHk8L05JQ0s+Cis8QkxVUkI+U2Vuc2l0aXZpdHkgdG8gZGFyayBjb2xvcnMuPC9CTFVSQj4KKzxERUZBVUxUPjEwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QWxwaGE6OndoaXRlLXNlbnNpdGl2aXR5PC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMTI4PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5XaGl0ZSBTZW5zaXRpdml0eTwvTklDSz4KKzxCTFVSQj5TZW5zaXRpdml0eSB0byBicmlnaHQgY29sb3JzLjwvQkxVUkI+Cis8REVGQVVMVD4xMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFscGhhOjpwcmVmZXItcGFzc3Rocm91Z2g8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlByZWZlciBQYXNzdGhyb3VnaDwvTklDSz4KKzxCTFVSQj5Eb24ndCBkbyBhbnkgcHJvY2Vzc2luZyBmb3IgYWxwaGE9MS4wIGlmIHBvc3NpYmxlLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U2hvdXQyc2VuZDo6ZGVzY3JpcHRpb248L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5kZXNjcmlwdGlvbjwvTklDSz4KKzxCTFVSQj5kZXNjcmlwdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+IiI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNob3V0MnNlbmQ6OmdlbnJlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Z2VucmU8L05JQ0s+Cis8QkxVUkI+Z2VucmUuPC9CTFVSQj4KKzxERUZBVUxUPiIiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTaG91dDJzZW5kOjppcDwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPmlwPC9OSUNLPgorPEJMVVJCPklQIGFkZHJlc3Mgb3IgaG9zdG5hbWUuPC9CTFVSQj4KKzxERUZBVUxUPiIxMjcuMC4wLjEiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTaG91dDJzZW5kOjptb3VudDwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPm1vdW50PC9OSUNLPgorPEJMVVJCPm1vdW50LjwvQkxVUkI+Cis8REVGQVVMVD4iIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U2hvdXQyc2VuZDo6cGFzc3dvcmQ8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5wYXNzd29yZDwvTklDSz4KKzxCTFVSQj5wYXNzd29yZC48L0JMVVJCPgorPERFRkFVTFQ+ImhhY2ttZSI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNob3V0MnNlbmQ6OnBvcnQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDY1NTM1XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+cG9ydDwvTklDSz4KKzxCTFVSQj5wb3J0LjwvQkxVUkI+Cis8REVGQVVMVD44MDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTaG91dDJzZW5kOjpwcm90b2NvbDwvTkFNRT4KKzxUWVBFPkdzdFNob3V0MlNlbmRQcm90b2NvbDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPnByb3RvY29sPC9OSUNLPgorPEJMVVJCPkNvbm5lY3Rpb24gUHJvdG9jb2wgdG8gdXNlLjwvQkxVUkI+Cis8REVGQVVMVD5IdHRwIFByb3RvY29sIChpY2VjYXN0IDIueCk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNob3V0MnNlbmQ6OnN0cmVhbW5hbWU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5zdHJlYW1uYW1lPC9OSUNLPgorPEJMVVJCPm5hbWUgb2YgdGhlIHN0cmVhbS48L0JMVVJCPgorPERFRkFVTFQ+IiI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNob3V0MnNlbmQ6OnVybDwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPnVybDwvTklDSz4KKzxCTFVSQj50aGUgc3RyZWFtJ3MgaG9tZXBhZ2UgVVJMLjwvQkxVUkI+Cis8REVGQVVMVD4iIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U2hvdXQyc2VuZDo6dXNlcm5hbWU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz51c2VybmFtZTwvTklDSz4KKzxCTFVSQj51c2VybmFtZS48L0JMVVJCPgorPERFRkFVTFQ+InNvdXJjZSI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNob3V0MnNlbmQ6OnB1YmxpYzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+cHVibGljPC9OSUNLPgorPEJMVVJCPklmIHRoZSBzdHJlYW0gc2hvdWxkIGJlIGxpc3RlZCBvbiB0aGUgc2VydmVyJ3Mgc3RyZWFtIGRpcmVjdG9yeS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNob3V0MnNlbmQ6OnRpbWVvdXQ8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT4+PSAxPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz50aW1lb3V0PC9OSUNLPgorPEJMVVJCPk1heCBhbW91bnQgb2YgdGltZSB0byB3YWl0IGZvciBuZXR3b3JrIGFjdGl2aXR5LCBpbiBtaWxsaXNlY29uZHMuPC9CTFVSQj4KKzxERUZBVUxUPjEwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTcGVleERlYzo6ZW5oPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Fbmg8L05JQ0s+Cis8QkxVUkI+RW5hYmxlIHBlcmNlcHR1YWwgZW5oYW5jZW1lbnQuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFBuZ0VuYzo6Y29tcHJlc3Npb24tbGV2ZWw8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSA5PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5jb21wcmVzc2lvbi1sZXZlbDwvTklDSz4KKzxCTFVSQj5QTkcgY29tcHJlc3Npb24gbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjY8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFBuZ0VuYzo6c25hcHNob3Q8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNuYXBzaG90PC9OSUNLPgorPEJMVVJCPlNlbmQgRU9TIGFmdGVyIGVuY29kaW5nIGEgZnJhbWUsIHVzZWZ1bCBmb3Igc25hcHNob3RzLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0Q0FDQVNpbms6OmFudGktYWxpYXNpbmc8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkFudGkgQWxpYXNpbmc8L05JQ0s+Cis8QkxVUkI+RW5hYmxlcyBBbnRpLUFsaWFzaW5nLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RDQUNBU2luazo6ZGl0aGVyPC9OQU1FPgorPFRZUEU+R3N0Q0FDQVNpbmtEaXRoZXJpbmc8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EaXRoZXIgVHlwZTwvTklDSz4KKzxCTFVSQj5TZXQgdHlwZSBvZiBEaXRoZXIuPC9CTFVSQj4KKzxERUZBVUxUPk5vIGRpdGhlcmluZzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0Q0FDQVNpbms6OnNjcmVlbi1oZWlnaHQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+U2NyZWVuIEhlaWdodDwvTklDSz4KKzxCTFVSQj5UaGUgaGVpZ2h0IG9mIHRoZSBzY3JlZW4uPC9CTFVSQj4KKzxERUZBVUxUPjI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RDQUNBU2luazo6c2NyZWVuLXdpZHRoPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPlNjcmVlbiBXaWR0aDwvTklDSz4KKzxCTFVSQj5UaGUgd2lkdGggb2YgdGhlIHNjcmVlbi48L0JMVVJCPgorPERFRkFVTFQ+ODA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEpwZWdFbmM6OnF1YWxpdHk8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlF1YWxpdHk8L05JQ0s+Cis8QkxVUkI+UXVhbGl0eSBvZiBlbmNvZGluZy48L0JMVVJCPgorPERFRkFVTFQ+ODU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEpwZWdFbmM6OmlkY3QtbWV0aG9kPC9OQU1FPgorPFRZUEU+R3N0SURDVE1ldGhvZDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPklEQ1QgTWV0aG9kPC9OSUNLPgorPEJMVVJCPlRoZSBJRENUIGFsZ29yaXRobSB0byB1c2UuPC9CTFVSQj4KKzxERUZBVUxUPkZhc3RlciwgbGVzcyBhY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0RFZEZWM6OmNsYW1wLWNocm9tYTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q2xhbXAgY2hyb21hPC9OSUNLPgorPEJMVVJCPkNsYW1wIGNocm9tYS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERWRGVjOjpjbGFtcC1sdW1hPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5DbGFtcCBsdW1hPC9OSUNLPgorPEJMVVJCPkNsYW1wIGx1bWEuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REVkRlYzo6ZHJvcC1mYWN0b3I8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDE8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRyb3AgRmFjdG9yPC9OSUNLPgorPEJMVVJCPk9ubHkgZGVjb2RlIE50aCBmcmFtZS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0RFZEZWM6OnF1YWxpdHk8L05BTUU+Cis8VFlQRT5Hc3REVkRlY1F1YWxpdHlFbnVtPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UXVhbGl0eTwvTklDSz4KKzxCTFVSQj5EZWNvZGluZyBxdWFsaXR5LjwvQkxVUkI+Cis8REVGQVVMVD5IaWdoZXN0IHF1YWxpdHkgY29sb3VyIGRlY29kaW5nPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBQVNpbms6OmJyaWdodG5lc3M8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+YnJpZ2h0bmVzczwvTklDSz4KKzxCTFVSQj5icmlnaHRuZXNzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBQVNpbms6OmNvbnRyYXN0PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPmNvbnRyYXN0PC9OSUNLPgorPEJMVVJCPmNvbnRyYXN0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBQVNpbms6OmRpdGhlcjwvTkFNRT4KKzxUWVBFPkdzdEFBU2lua0RpdGhlcmVyczwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPmRpdGhlcjwvTklDSz4KKzxCTFVSQj5kaXRoZXIuPC9CTFVSQj4KKzxERUZBVUxUPm5vIGRpdGhlcmluZzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QUFTaW5rOjpkcml2ZXI8L05BTUU+Cis8VFlQRT5Hc3RBQVNpbmtEcml2ZXJzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+ZHJpdmVyPC9OSUNLPgorPEJMVVJCPmRyaXZlci48L0JMVVJCPgorPERFRkFVTFQ+WDExIGRyaXZlciAxLjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFBU2luazo6ZnJhbWUtdGltZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmZyYW1lIHRpbWU8L05JQ0s+Cis8QkxVUkI+ZnJhbWUgdGltZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QUFTaW5rOjpmcmFtZXMtZGlzcGxheWVkPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+ZnJhbWVzIGRpc3BsYXllZDwvTklDSz4KKzxCTFVSQj5mcmFtZXMgZGlzcGxheWVkLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBQVNpbms6OmdhbW1hPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5nYW1tYTwvTklDSz4KKzxCTFVSQj5nYW1tYS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QUFTaW5rOjpoZWlnaHQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+aGVpZ2h0PC9OSUNLPgorPEJMVVJCPmhlaWdodC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QUFTaW5rOjppbnZlcnNpb248L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPmludmVyc2lvbjwvTklDSz4KKzxCTFVSQj5pbnZlcnNpb24uPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFBU2luazo6cmFuZG9tdmFsPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPnJhbmRvbXZhbDwvTklDSz4KKzxCTFVSQj5yYW5kb212YWwuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFBU2luazo6d2lkdGg8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+d2lkdGg8L05JQ0s+Cis8QkxVUkI+d2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwZWV4RW5jOjphYnI8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BQlI8L05JQ0s+Cis8QkxVUkI+RW5hYmxlIGF2ZXJhZ2UgYml0LXJhdGUgKDAgPSBkaXNhYmxlZCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwZWV4RW5jOjpiaXRyYXRlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RW5jb2RpbmcgQml0LXJhdGU8L05JQ0s+Cis8QkxVUkI+U3BlY2lmeSBhbiBlbmNvZGluZyBiaXQtcmF0ZSAoaW4gYnBzKS4gKDAgPSBhdXRvbWF0aWMpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTcGVleEVuYzo6Y29tcGxleGl0eTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkNvbXBsZXhpdHk8L05JQ0s+Cis8QkxVUkI+U2V0IGVuY29kaW5nIGNvbXBsZXhpdHkuPC9CTFVSQj4KKzxERUZBVUxUPjM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwZWV4RW5jOjpkdHg8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EVFg8L05JQ0s+Cis8QkxVUkI+RW5hYmxlIGRpc2NvbnRpbnVvdXMgdHJhbnNtaXNzaW9uLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BlZXhFbmM6Omxhc3QtbWVzc2FnZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGFzdC1tZXNzYWdlPC9OSUNLPgorPEJMVVJCPlRoZSBsYXN0IHN0YXR1cyBtZXNzYWdlLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTcGVleEVuYzo6bmZyYW1lczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk5GcmFtZXM8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIGZyYW1lcyBwZXIgYnVmZmVyLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTcGVleEVuYzo6cXVhbGl0eTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5RdWFsaXR5PC9OSUNLPgorPEJMVVJCPkVuY29kaW5nIHF1YWxpdHkuPC9CTFVSQj4KKzxERUZBVUxUPjg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwZWV4RW5jOjp2YWQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WQUQ8L05JQ0s+Cis8QkxVUkI+RW5hYmxlIHZvaWNlIGFjdGl2aXR5IGRldGVjdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwZWV4RW5jOjp2YnI8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WQlI8L05JQ0s+Cis8QkxVUkI+RW5hYmxlIHZhcmlhYmxlIGJpdC1yYXRlLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BlZXhFbmM6Om1vZGU8L05BTUU+Cis8VFlQRT5Hc3RTcGVleEVuY01vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kZTwvTklDSz4KKzxCTFVSQj5UaGUgZW5jb2RpbmcgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+QXV0bzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0RFYxMzk0U3JjOjpjaGFubmVsPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw2NF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNoYW5uZWw8L05JQ0s+Cis8QkxVUkI+Q2hhbm5lbCBudW1iZXIgZm9yIGxpc3RlbmluZy48L0JMVVJCPgorPERFRkFVTFQ+NjM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERWMTM5NFNyYzo6Y29uc2VjdXRpdmU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDE8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPmNvbnNlY3V0aXZlIGZyYW1lczwvTklDSz4KKzxCTFVSQj5zZW5kIG4gY29uc2VjdXRpdmUgZnJhbWVzIGFmdGVyIHNraXBwaW5nLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REVjEzOTRTcmM6OmRyb3AtaW5jb21wbGV0ZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+ZHJvcCBpbmNvbXBsZXRlPC9OSUNLPgorPEJMVVJCPmRyb3AgaW5jb21wbGV0ZSBmcmFtZXMuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERWMTM5NFNyYzo6Z3VpZDwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5HVUlEPC9OSUNLPgorPEJMVVJCPnNlbGVjdCBvbmUgb2YgbXVsdGlwbGUgRFYgZGV2aWNlcyBieSBpdHMgR1VJRC4gdXNlIGEgaGV4YWRlY2ltYWwgbGlrZSAweGhoaGhoaGhoaGhoaGhoaGguICgwID0gbm8gZ3VpZCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERWMTM5NFNyYzo6cG9ydDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+W0dfTUFYVUxPTkcsMTZdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qb3J0PC9OSUNLPgorPEJMVVJCPlBvcnQgbnVtYmVyICgtMSBhdXRvbWF0aWMpLjwvQkxVUkI+Cis8REVGQVVMVD4tMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0RFYxMzk0U3JjOjpza2lwPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5za2lwIGZyYW1lczwvTklDSz4KKzxCTFVSQj5za2lwIG4gZnJhbWVzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REVjEzOTRTcmM6OnVzZS1hdmM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlVzZSBBVi9DPC9OSUNLPgorPEJMVVJCPlVzZSBBVi9DIFZUUiBjb250cm9sLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REVjEzOTRTcmM6OmRldmljZS1uYW1lPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5kZXZpY2UgbmFtZTwvTklDSz4KKzxCTFVSQj51c2VyLWZyaWVuZGx5IG5hbWUgb2YgdGhlIGRldmljZS48L0JMVVJCPgorPERFRkFVTFQ+IkRlZmF1bHQiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RGbGFjRW5jOjpibG9ja3NpemU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT5bMTYsNjU1MzVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmxvY2tzaXplPC9OSUNLPgorPEJMVVJCPkJsb2Nrc2l6ZSBpbiBzYW1wbGVzLjwvQkxVUkI+Cis8REVGQVVMVD40NjA4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RGbGFjRW5jOjplc2NhcGUtY29kaW5nPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RG8gRXNjYXBlIGNvZGluZzwvTklDSz4KKzxCTFVSQj5zZWFyY2ggZm9yIGVzY2FwZSBjb2RlcyBpbiB0aGUgZW50cm9weSBjb2Rpbmcgc3RhZ2UgZm9yIHNsaWdodGx5IGJldHRlciBjb21wcmVzc2lvbi48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEZsYWNFbmM6OmV4aGF1c3RpdmUtbW9kZWwtc2VhcmNoPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RG8gZXhoYXVzdGl2ZSBtb2RlbCBzZWFyY2g8L05JQ0s+Cis8QkxVUkI+ZG8gZXhoYXVzdGl2ZSBzZWFyY2ggb2YgTFAgY29lZmZpY2llbnQgcXVhbnRpemF0aW9uIChleHBlbnNpdmUhKS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEZsYWNFbmM6Omxvb3NlLW1pZC1zaWRlLXN0ZXJlbzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxvb3NlIG1pZCBzaWRlIHN0ZXJlbzwvTklDSz4KKzxCTFVSQj5Mb29zZSBtaWQgc2lkZSBzdGVyZW8uPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RGbGFjRW5jOjptYXgtbHBjLW9yZGVyPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMzI8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NYXggTFBDIG9yZGVyPC9OSUNLPgorPEJMVVJCPk1heCBMUEMgb3JkZXI7IDAgPT4gdXNlIG9ubHkgZml4ZWQgcHJlZGljdG9ycy48L0JMVVJCPgorPERFRkFVTFQ+ODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0RmxhY0VuYzo6bWF4LXJlc2lkdWFsLXBhcnRpdGlvbi1vcmRlcjwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDE2PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TWF4IHJlc2lkdWFsIHBhcnRpdGlvbiBvcmRlcjwvTklDSz4KKzxCTFVSQj5NYXggcmVzaWR1YWwgcGFydGl0aW9uIG9yZGVyIChhYm92ZSA0IGRvZXNuJ3QgdXN1YWxseSBoZWxwIG11Y2gpLjwvQkxVUkI+Cis8REVGQVVMVD4zPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RGbGFjRW5jOjptaWQtc2lkZS1zdGVyZW88L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EbyBtaWQgc2lkZSBzdGVyZW88L05JQ0s+Cis8QkxVUkI+RG8gbWlkIHNpZGUgc3RlcmVvIChvbmx5IGZvciBzdGVyZW8gaW5wdXQpLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RGbGFjRW5jOjptaW4tcmVzaWR1YWwtcGFydGl0aW9uLW9yZGVyPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMTY8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NaW4gcmVzaWR1YWwgcGFydGl0aW9uIG9yZGVyPC9OSUNLPgorPEJMVVJCPk1pbiByZXNpZHVhbCBwYXJ0aXRpb24gb3JkZXIgKGFib3ZlIDQgZG9lc24ndCB1c3VhbGx5IGhlbHAgbXVjaCkuPC9CTFVSQj4KKzxERUZBVUxUPjM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEZsYWNFbmM6OnFscC1jb2VmZi1wcmVjLXNlYXJjaDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRvIFFMUCBjb2VmZmljaWVudHMgcHJlY2lzaW9uIHNlYXJjaDwvTklDSz4KKzxCTFVSQj5mYWxzZSA9IHVzZSBxbHBfY29lZmZfcHJlY2lzaW9uLCB0cnVlID0gc2VhcmNoIGFyb3VuZCBxbHBfY29lZmZfcHJlY2lzaW9uLCB0YWtlIGJlc3QuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RGbGFjRW5jOjpxbHAtY29lZmYtcHJlY2lzaW9uPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMzI8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5RTFAgY29lZmZpY2llbnRzIHByZWNpc2lvbjwvTklDSz4KKzxCTFVSQj5QcmVjaXNpb24gaW4gYml0cyBvZiBxdWFudGl6ZWQgbGluZWFyLXByZWRpY3RvciBjb2VmZmljaWVudHM7IDAgPSBhdXRvbWF0aWMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEZsYWNFbmM6OnF1YWxpdHk8L05BTUU+Cis8VFlQRT5Hc3RGbGFjRW5jUXVhbGl0eTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5RdWFsaXR5PC9OSUNLPgorPEJMVVJCPlNwZWVkIHZlcnN1cyBjb21wcmVzc2lvbiB0cmFkZW9mZi48L0JMVVJCPgorPERFRkFVTFQ+NSAtIERlZmF1bHQ8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEZsYWNFbmM6OnJpY2UtcGFyYW1ldGVyLXNlYXJjaC1kaXN0PC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMTU8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5yaWNlX3BhcmFtZXRlcl9zZWFyY2hfZGlzdDwvTklDSz4KKzxCTFVSQj4wID0gdHJ5IG9ubHkgY2FsYydkIHBhcmFtZXRlciBrOyBlbHNlIHRyeSBhbGwgW2stZGlzdC4uaytkaXN0XSBwYXJhbWV0ZXJzLCB1c2UgYmVzdC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0RmxhY0VuYzo6c3RyZWFtYWJsZS1zdWJzZXQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TdHJlYW1hYmxlIHN1YnNldDwvTklDSz4KKzxCTFVSQj50cnVlIHRvIGxpbWl0IGVuY29kZXIgdG8gZ2VuZXJhdGluZyBhIFN1YnNldCBzdHJlYW0sIGVsc2UgZmFsc2UuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEZsYWNFbmM6OnBhZGRpbmc8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5QYWRkaW5nPC9OSUNLPgorPEJMVVJCPldyaXRlIGEgUEFERElORyBibG9jayB3aXRoIHRoaXMgbGVuZ3RoIGluIGJ5dGVzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RGbGFjRW5jOjpzZWVrcG9pbnRzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAtMjE0NzQ4MzY0NzwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNlZWtwb2ludHM8L05JQ0s+Cis8QkxVUkI+QWRkIFNFRUtUQUJMRSBtZXRhZGF0YSAoaWYgPiAwLCBudW1iZXIgb2YgZW50cmllcywgaWYgPCAwLCBpbnRlcnZhbCBpbiBzZWMpLjwvQkxVUkI+Cis8REVGQVVMVD4tMTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE9zc1Npbms6OmRldmljZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRldmljZTwvTklDSz4KKzxCTFVSQj5PU1MgZGV2aWNlICh1c3VhbGx5IC9kZXYvZHNwTikuPC9CTFVSQj4KKzxERUZBVUxUPiIvZGV2L2RzcCI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1hdHJvc2thTXV4Ojp3cml0aW5nLWFwcDwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPldyaXRpbmcgYXBwbGljYXRpb24uPC9OSUNLPgorPEJMVVJCPlRoZSBuYW1lIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGNyZWF0ZXMgdGhlIG1hdHJvc2thIGZpbGUuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1hdHJvc2thTXV4Ojp2ZXJzaW9uPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSwyXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RG9jVHlwZSB2ZXJzaW9uPC9OSUNLPgorPEJMVVJCPlRoaXMgcGFyYW1ldGVyIGRldGVybWluZXMgd2hhdCBNYXRyb3NrYSBmZWF0dXJlcyBjYW4gYmUgdXNlZC48L0JMVVJCPgorPERFRkFVTFQ+MjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TWF0cm9za2FNdXg6Om1pbi1pbmRleC1pbnRlcnZhbDwvTkFNRT4KKzxUWVBFPmdpbnQ2NDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NaW5pbXVtIHRpbWUgYmV0d2VlbiBpbmRleCBlbnRyaWVzPC9OSUNLPgorPEJMVVJCPkFuIGluZGV4IGVudHJ5IGlzIGNyZWF0ZWQgZXZlcnkgc28gbWFueSBuYW5vc2Vjb25kcy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TWF0cm9za2FNdXg6OnN0cmVhbWFibGU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRldGVybWluZXMgd2hldGhlciBvdXRwdXQgc2hvdWxkIGJlIHN0cmVhbWFibGU8L05JQ0s+Cis8QkxVUkI+SWYgc2V0IHRvIHRydWUsIHRoZSBvdXRwdXQgc2hvdWxkIGJlIGFzIGlmIGl0IGlzIHRvIGJlIHN0cmVhbWVkIGFuZCBoZW5jZSBubyBpbmRleGVzIHdyaXR0ZW4gb3IgZHVyYXRpb24gd3JpdHRlbi48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1hdHJvc2thTXV4Ojp0aW1lY29kZXNjYWxlPC9OQU1FPgorPFRZUEU+Z2ludDY0PC9UWVBFPgorPFJBTkdFPlsxLDEwMDAwMDAwMDBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UaW1lY29kZSBTY2FsZTwvTklDSz4KKzxCTFVSQj5UaW1lY29kZVNjYWxlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBSYXcgVGltZWNvZGUgb2YgYSBCbG9jay48L0JMVVJCPgorPERFRkFVTFQ+MTAwMDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TWF0cm9za2FNdXg6Om1heC1jbHVzdGVyLWR1cmF0aW9uPC9OQU1FPgorPFRZUEU+Z2ludDY0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heGltdW0gY2x1c3RlciBkdXJhdGlvbjwvTklDSz4KKzxCTFVSQj5BIG5ldyBjbHVzdGVyIHdpbGwgYmUgY3JlYXRlZCBpZiBpdHMgZHVyYXRpb24gZXhjZWVkcyB0aGlzIHZhbHVlLiAwIG1lYW5zIG5vIG1heGltdW0gZHVyYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjY1NTM1MDAwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNYXRyb3NrYU11eDo6bWluLWNsdXN0ZXItZHVyYXRpb248L05BTUU+Cis8VFlQRT5naW50NjQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWluaW11bSBjbHVzdGVyIGR1cmF0aW9uPC9OSUNLPgorPEJMVVJCPkRlc2lkZXJlZCBjbHVzdGVyIGR1cmF0aW9uIGFzIG5hbm9zZWNvbmRzLiBBIG5ldyBjbHVzdGVyIHdpbGwgYmUgY3JlYXRlZCBpcnJlc3BlY3RpdmUgb2YgdGhpcyBwcm9wZXJ0eSBpZiBhIGZvcmNlIGtleSB1bml0IGV2ZW50IGlzIHJlY2VpdmVkLiAwIG1lYW5zIGNyZWF0ZSBhIG5ldyBjbHVzdGVyIGZvciBlYWNoIHZpZGVvIGtleWZyYW1lIG9yIGZvciBlYWNoIGF1ZGlvIGJ1ZmZlciBpbiBhdWRpbyBvbmx5IHN0cmVhbXMuPC9CTFVSQj4KKzxERUZBVUxUPjUwMDAwMDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VGVzdDo6YWxsb3dlZC10aW1lc3RhbXAtZGV2aWF0aW9uPC9OQU1FPgorPFRZUEU+Z2ludDY0PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5hbGxvd2VkIHRpbWVzdGFtcCBkZXZpYXRpb248L05JQ0s+Cis8QkxVUkI+YWxsb3dlZCBhdmVyYWdlIGRpZmZlcmVuY2UgaW4gdXNlYyBiZXR3ZWVuIHRpbWVzdGFtcCBvZiBuZXh0IGJ1ZmZlciBhbmQgZXhwZWN0ZWQgdGltZXN0YW1wIGZyb20gYW5hbHl6aW5nIGxhc3QgYnVmZmVyLjwvQkxVUkI+Cis8REVGQVVMVD4tMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VGVzdDo6YnVmZmVyLWNvdW50PC9OQU1FPgorPFRZUEU+Z2ludDY0PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+YnVmZmVyIGNvdW50PC9OSUNLPgorPEJMVVJCPm51bWJlciBvZiBidWZmZXJzIGluIHN0cmVhbS48L0JMVVJCPgorPERFRkFVTFQ+LTE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFRlc3Q6OmV4cGVjdGVkLWJ1ZmZlci1jb3VudDwvTkFNRT4KKzxUWVBFPmdpbnQ2NDwvVFlQRT4KKzxSQU5HRT4+PSBHX01BWFVMT05HPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZXhwZWN0ZWQgYnVmZmVyIGNvdW50PC9OSUNLPgorPEJMVVJCPmV4cGVjdGVkIG51bWJlciBvZiBidWZmZXJzIGluIHN0cmVhbS48L0JMVVJCPgorPERFRkFVTFQ+LTE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFRlc3Q6OmV4cGVjdGVkLWxlbmd0aDwvTkFNRT4KKzxUWVBFPmdpbnQ2NDwvVFlQRT4KKzxSQU5HRT4+PSBHX01BWFVMT05HPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZXhwZWN0ZWQgbGVuZ3RoPC9OSUNLPgorPEJMVVJCPmV4cGVjdGVkIGxlbmd0aCBvZiBzdHJlYW0uPC9CTFVSQj4KKzxERUZBVUxUPi0xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RUZXN0OjpleHBlY3RlZC1tZDU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZXhwZWN0ZWQgbWQ1PC9OSUNLPgorPEJMVVJCPmV4cGVjdGVkIG1kNSBvZiBwcm9jZXNzaW5nIHRoZSB3aG9sZSBkYXRhLjwvQkxVUkI+Cis8REVGQVVMVD4iLS0tIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VGVzdDo6bGVuZ3RoPC9OQU1FPgorPFRZUEU+Z2ludDY0PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGVuZ3RoPC9OSUNLPgorPEJMVVJCPmxlbmd0aCBvZiBzdHJlYW0uPC9CTFVSQj4KKzxERUZBVUxUPi0xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RUZXN0OjptZDU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPm1kNTwvTklDSz4KKzxCTFVSQj5tZDUgb2YgcHJvY2Vzc2luZyB0aGUgd2hvbGUgZGF0YS48L0JMVVJCPgorPERFRkFVTFQ+Ii0tLSI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFRlc3Q6OnRpbWVzdGFtcC1kZXZpYXRpb248L05BTUU+Cis8VFlQRT5naW50NjQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz50aW1lc3RhbXAgZGV2aWF0aW9uPC9OSUNLPgorPEJMVVJCPmF2ZXJhZ2UgZGlmZmVyZW5jZSBpbiB1c2VjIGJldHdlZW4gdGltZXN0YW1wIG9mIG5leHQgYnVmZmVyIGFuZCBleHBlY3RlZCB0aW1lc3RhbXAgZnJvbSBhbmFseXppbmcgbGFzdCBidWZmZXIuPC9CTFVSQj4KKzxERUZBVUxUPi0xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RQcm9ncmVzc1JlcG9ydDo6c2lsZW50PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EbyBub3QgcHJpbnQgb3V0cHV0IHRvIHN0ZG91dDwvTklDSz4KKzxCTFVSQj5EbyBub3QgcHJpbnQgb3V0cHV0IHRvIHN0ZG91dC48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFByb2dyZXNzUmVwb3J0Ojp1cGRhdGUtZnJlcTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VXBkYXRlIEZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5OdW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIHJlcG9ydHMgd2hlbiBkYXRhIGlzIGZsb3dpbmcuPC9CTFVSQj4KKzxERUZBVUxUPjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFByb2dyZXNzUmVwb3J0Ojpmb3JtYXQ8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5mb3JtYXQ8L05JQ0s+Cis8QkxVUkI+Rm9ybWF0IHRvIHVzZSBmb3IgdGhlIHF1ZXJ5aW5nLjwvQkxVUkI+Cis8REVGQVVMVD4iYXV0byI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFByb2dyZXNzUmVwb3J0Ojpkby1xdWVyeTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VXNlIGEgcXVlcnkgaW5zdGVhZCBvZiBidWZmZXIgbWV0YWRhdGEgdG8gZGV0ZXJtaW5lIHN0cmVhbSBwb3NpdGlvbjwvTklDSz4KKzxCTFVSQj5Vc2UgYSBxdWVyeSBpbnN0ZWFkIG9mIGJ1ZmZlciBtZXRhZGF0YSB0byBkZXRlcm1pbmUgc3RyZWFtIHBvc2l0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3ROYXZTZWVrOjpzZWVrLW9mZnNldDwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U2VlayBPZmZzZXQ8L05JQ0s+Cis8QkxVUkI+VGltZSBpbiBzZWNvbmRzIHRvIHNlZWsgYnkuPC9CTFVSQj4KKzxERUZBVUxUPjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEJyZWFrTXlEYXRhOjpwcm9iYWJpbGl0eTwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wcm9iYWJpbGl0eTwvTklDSz4KKzxCTFVSQj5wcm9iYWJpbGl0eSBmb3IgZWFjaCBieXRlIGluIHRoZSBidWZmZXIgdG8gYmUgY2hhbmdlZC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QnJlYWtNeURhdGE6OnNlZWQ8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5zZWVkPC9OSUNLPgorPEJMVVJCPnNlZWQgZm9yIHJhbmRvbW5lc3MgKGluaXRpYWxpemVkIHdoZW4gZ29pbmcgZnJvbSBSRUFEWSB0byBQQVVTRUQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RCcmVha015RGF0YTo6c2V0LXRvPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bR19NQVhVTE9ORywyNTVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+c2V0LXRvPC9OSUNLPgorPEJMVVJCPnNldCBjaGFuZ2VkIGJ5dGVzIHRvIHRoaXMgdmFsdWUgKC0xIG1lYW5zIHJhbmRvbSB2YWx1ZS48L0JMVVJCPgorPERFRkFVTFQ+LTE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEJyZWFrTXlEYXRhOjpza2lwPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+c2tpcDwvTklDSz4KKzxCTFVSQj5hbW91bnQgb2YgYnl0ZXMgc2tpcHBlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHN0cmVhbS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0Q3V0dGVyOjpsZWFreTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TGVha3k8L05JQ0s+Cis8QkxVUkI+ZG8gd2UgbGVhayBidWZmZXJzIHdoZW4gYmVsb3cgdGhyZXNob2xkID8uPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RDdXR0ZXI6OnByZS1sZW5ndGg8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UHJlLXJlY29yZGluZyBidWZmZXIgbGVuZ3RoPC9OSUNLPgorPEJMVVJCPkxlbmd0aCBvZiBwcmUtcmVjb3JkaW5nIGJ1ZmZlciAoaW4gbmFub3NlY29uZHMpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RDdXR0ZXI6OnJ1bi1sZW5ndGg8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UnVuIGxlbmd0aDwvTklDSz4KKzxCTFVSQj5MZW5ndGggb2YgZHJvcCBiZWxvdyB0aHJlc2hvbGQgYmVmb3JlIGN1dF9zdG9wIChpbiBuYW5vc2Vjb25kcykuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEN1dHRlcjo6dGhyZXNob2xkPC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRocmVzaG9sZDwvTklDSz4KKzxCTFVSQj5Wb2x1bWUgdGhyZXNob2xkIGJlZm9yZSB0cmlnZ2VyLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RDdXR0ZXI6OnRocmVzaG9sZC1kQjwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UaHJlc2hvbGQgKGRCKTwvTklDSz4KKzxCTFVSQj5Wb2x1bWUgdGhyZXNob2xkIGJlZm9yZSB0cmlnZ2VyIChpbiBkQikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvRmxpcDo6bWV0aG9kPC9OQU1FPgorPFRZUEU+R3N0VmlkZW9GbGlwTWV0aG9kPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPm1ldGhvZDwvTklDSz4KKzxCTFVSQj5tZXRob2QgKGRlcHJlY2F0ZWQsIHVzZSB2aWRlby1kaXJlY3Rpb24gaW5zdGVhZCkuPC9CTFVSQj4KKzxERUZBVUxUPklkZW50aXR5IChubyByb3RhdGlvbik8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cE1QNFZQYXk6OmNvbmZpZy1pbnRlcnZhbDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDM2MDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNvbmZpZyBTZW5kIEludGVydmFsPC9OSUNLPgorPEJMVVJCPlNlbmQgQ29uZmlnIEluc2VydGlvbiBJbnRlcnZhbCBpbiBzZWNvbmRzIChjb25maWd1cmF0aW9uIGhlYWRlcnMgd2lsbCBiZSBtdWx0aXBsZXhlZCBpbiB0aGUgZGF0YSBzdHJlYW0gd2hlbiBkZXRlY3RlZC4pICgwID0gZGlzYWJsZWQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNdWx0aXBhcnRNdXg6OmJvdW5kYXJ5PC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Qm91bmRhcnk8L05JQ0s+Cis8QkxVUkI+Qm91bmRhcnkgc3RyaW5nLjwvQkxVUkI+Cis8REVGQVVMVD4iVGhpc1JhbmRvbVN0cmluZyI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdElEM0RlbXV4OjpwcmVmZXItdjE8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5QcmVmZXIgdmVyc2lvbiAxIHRhZzwvTklDSz4KKzxCTFVSQj5QcmVmZXIgdGFncyBmcm9tIElEM3YxIHRhZyBhdCBlbmQgb2YgZmlsZSB3aGVuIGJvdGggSUQzdjEgYW5kIElEM3YyIHRhZ3MgYXJlIHByZXNlbnQuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REeW5VRFBTaW5rOjpjbG9zZS1zb2NrZXQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNsb3NlIHNvY2tldDwvTklDSz4KKzxCTFVSQj5DbG9zZSBzb2NrZXQgaWYgcGFzc2VkIGFzIHByb3BlcnR5IG9uIHN0YXRlIGNoYW5nZS48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0RHluVURQU2luazo6c29ja2V0PC9OQU1FPgorPFRZUEU+R1NvY2tldCo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Tb2NrZXQ8L05JQ0s+Cis8QkxVUkI+U29ja2V0IHRvIHVzZSBmb3IgVURQIHNlbmRpbmcuIChOVUxMID09IGFsbG9jYXRlKS48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REeW5VRFBTaW5rOjpiaW5kLWFkZHJlc3M8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CaW5kIEFkZHJlc3M8L05JQ0s+Cis8QkxVUkI+QWRkcmVzcyB0byBiaW5kIHRoZSBzb2NrZXQgdG8uPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdER5blVEUFNpbms6OmJpbmQtcG9ydDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNjU1MzVdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CaW5kIFBvcnQ8L05JQ0s+Cis8QkxVUkI+UG9ydCB0byBiaW5kIHRoZSBzb2NrZXQgdG8uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdER5blVEUFNpbms6OnNvY2tldC12NjwvTkFNRT4KKzxUWVBFPkdTb2NrZXQqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U29ja2V0IElQdjY8L05JQ0s+Cis8QkxVUkI+U29ja2V0IHRvIHVzZSBmb3IgVURQdjYgc2VuZGluZy4gKE5VTEwgPT0gYWxsb2NhdGUpLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6Ynl0ZXMtc2VydmVkPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+Qnl0ZXMgc2VydmVkPC9OSUNLPgorPEJMVVJCPlRvdGFsIG51bWJlciBvZiBieXRlcyBzZW50IHRvIGFsbCBjbGllbnRzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNdWx0aVVEUFNpbms6OmJ5dGVzLXRvLXNlcnZlPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+Qnl0ZXMgdG8gc2VydmU8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIHRvIHNlcnZlIHRvIGNsaWVudHMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6Y2xpZW50czwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNsaWVudHM8L05JQ0s+Cis8QkxVUkI+QSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBob3N0OnBvcnQgcGFpcnMgd2l0aCBkZXN0aW5hdGlvbnMuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6YXV0by1tdWx0aWNhc3Q8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkF1dG9tYXRpY2FsbHkgam9pbi9sZWF2ZSBtdWx0aWNhc3QgZ3JvdXBzPC9OSUNLPgorPEJMVVJCPkF1dG9tYXRpY2FsbHkgam9pbi9sZWF2ZSB0aGUgbXVsdGljYXN0IGdyb3VwcywgRkFMU0UgbWVhbnMgdXNlciBoYXMgdG8gZG8gaXQgaGltc2VsZi48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjpsb29wPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NdWx0aWNhc3QgTG9vcGJhY2s8L05JQ0s+Cis8QkxVUkI+VXNlZCBmb3Igc2V0dGluZyB0aGUgbXVsdGljYXN0IGxvb3AgcGFyYW1ldGVyLiBUUlVFID0gZW5hYmxlLCBGQUxTRSA9IGRpc2FibGUuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6cW9zLWRzY3A8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPltHX01BWFVMT05HLDYzXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UW9TIGRpZmYgc3J2IGNvZGUgcG9pbnQ8L05JQ0s+Cis8QkxVUkI+UXVhbGl0eSBvZiBTZXJ2aWNlLCBkaWZmZXJlbnRpYXRlZCBzZXJ2aWNlcyBjb2RlIHBvaW50ICgtMSBkZWZhdWx0KS48L0JMVVJCPgorPERFRkFVTFQ+LTE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6dHRsPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwyNTVdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5VbmljYXN0IFRUTDwvTklDSz4KKzxCTFVSQj5Vc2VkIGZvciBzZXR0aW5nIHRoZSB1bmljYXN0IFRUTCBwYXJhbWV0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjY0PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNdWx0aVVEUFNpbms6OnR0bC1tYzwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMjU1XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TXVsdGljYXN0IFRUTDwvTklDSz4KKzxCTFVSQj5Vc2VkIGZvciBzZXR0aW5nIHRoZSBtdWx0aWNhc3QgVFRMIHBhcmFtZXRlci48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjpzZW5kLWR1cGxpY2F0ZXM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNlbmQgRHVwbGljYXRlczwvTklDSz4KKzxCTFVSQj5XaGVuIGEgZGlzdGluYXRpb24vcG9ydCBwYWlyIGlzIGFkZGVkIG11bHRpcGxlIHRpbWVzLCBzZW5kIHBhY2tldHMgbXVsdGlwbGUgdGltZXMgYXMgd2VsbC48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjpidWZmZXItc2l6ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QnVmZmVyIFNpemU8L05JQ0s+Cis8QkxVUkI+U2l6ZSBvZiB0aGUga2VybmVsIHNlbmQgYnVmZmVyIGluIGJ5dGVzLCAwPWRlZmF1bHQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6Y2xvc2Utc29ja2V0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5DbG9zZSBzb2NrZXQ8L05JQ0s+Cis8QkxVUkI+Q2xvc2Ugc29ja2V0IGlmIHBhc3NlZCBhcyBwcm9wZXJ0eSBvbiBzdGF0ZSBjaGFuZ2UuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6c29ja2V0PC9OQU1FPgorPFRZUEU+R1NvY2tldCo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Tb2NrZXQgSGFuZGxlPC9OSUNLPgorPEJMVVJCPlNvY2tldCB0byB1c2UgZm9yIFVEUCBzZW5kaW5nLiAoTlVMTCA9PSBhbGxvY2F0ZSkuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjp1c2VkLXNvY2tldDwvTkFNRT4KKzxUWVBFPkdTb2NrZXQqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5Vc2VkIFNvY2tldCBIYW5kbGU8L05JQ0s+Cis8QkxVUkI+U29ja2V0IGN1cnJlbnRseSBpbiB1c2UgZm9yIFVEUCBzZW5kaW5nLiAoTlVMTCA9PSBubyBzb2NrZXQpLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6Zm9yY2UtaXB2NDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Rm9yY2UgSVB2NDwvTklDSz4KKzxCTFVSQj5Gb3JjaW5nIHRoZSB1c2Ugb2YgYW4gSVB2NCBzb2NrZXQgKERFUFJFQ0FURUQsIGhhcyBubyBlZmZlY3QgYW55bW9yZSkuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNdWx0aVVEUFNpbms6Om11bHRpY2FzdC1pZmFjZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk11bHRpY2FzdCBJbnRlcmZhY2U8L05JQ0s+Cis8QkxVUkI+VGhlIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIHRvIGpvaW4gdGhlIG11bHRpY2FzdCBncm91cC48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjpiaW5kLWFkZHJlc3M8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CaW5kIEFkZHJlc3M8L05JQ0s+Cis8QkxVUkI+QWRkcmVzcyB0byBiaW5kIHRoZSBzb2NrZXQgdG8uPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE11bHRpVURQU2luazo6YmluZC1wb3J0PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw2NTUzNV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkJpbmQgUG9ydDwvTklDSz4KKzxCTFVSQj5Qb3J0IHRvIGJpbmQgdGhlIHNvY2tldCB0by48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjpzb2NrZXQtdjY8L05BTUU+Cis8VFlQRT5HU29ja2V0KjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNvY2tldCBIYW5kbGUgSVB2NjwvTklDSz4KKzxCTFVSQj5Tb2NrZXQgdG8gdXNlIGZvciBVRFB2NiBzZW5kaW5nLiAoTlVMTCA9PSBhbGxvY2F0ZSkuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjp1c2VkLXNvY2tldC12NjwvTkFNRT4KKzxUWVBFPkdTb2NrZXQqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5Vc2VkIFNvY2tldCBIYW5kbGUgSVB2NjwvTklDSz4KKzxCTFVSQj5Tb2NrZXQgY3VycmVudGx5IGluIHVzZSBmb3IgVURQdjYgc2VuZGluZy4gKE5VTEwgPT0gbm8gc29ja2V0KS48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RYSW1hZ2VTcmM6OmRpc3BsYXktbmFtZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRpc3BsYXk8L05JQ0s+Cis8QkxVUkI+WCBEaXNwbGF5IE5hbWUuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFhJbWFnZVNyYzo6c2hvdy1wb2ludGVyPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TaG93IE1vdXNlIFBvaW50ZXI8L05JQ0s+Cis8QkxVUkI+U2hvdyBtb3VzZSBwb2ludGVyIChpZiBYRml4ZXMgZXh0ZW5zaW9uIGVuYWJsZWQpLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RYSW1hZ2VTcmM6OmVuZHg8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSBHX01BWElOVDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RW5kIFg8L05JQ0s+Cis8QkxVUkI+WCBjb29yZGluYXRlIG9mIGJvdHRvbSByaWdodCBjb3JuZXIgb2YgYXJlYSB0byBiZSByZWNvcmRlZCAoMCBmb3IgYm90dG9tIHJpZ2h0IG9mIHNjcmVlbikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFhJbWFnZVNyYzo6ZW5keTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IEdfTUFYSU5UPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5FbmQgWTwvTklDSz4KKzxCTFVSQj5ZIGNvb3JkaW5hdGUgb2YgYm90dG9tIHJpZ2h0IGNvcm5lciBvZiBhcmVhIHRvIGJlIHJlY29yZGVkICgwIGZvciBib3R0b20gcmlnaHQgb2Ygc2NyZWVuKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0WEltYWdlU3JjOjpzdGFydHg8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSBHX01BWElOVDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U3RhcnQgWCBjby1vcmRpbmF0ZTwvTklDSz4KKzxCTFVSQj5YIGNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIGFyZWEgdG8gYmUgcmVjb3JkZWQgKDAgZm9yIHRvcCBsZWZ0IG9mIHNjcmVlbikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFhJbWFnZVNyYzo6c3RhcnR5PC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gR19NQVhJTlQ8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlN0YXJ0IFkgY28tb3JkaW5hdGU8L05JQ0s+Cis8QkxVUkI+WSBjb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiBhcmVhIHRvIGJlIHJlY29yZGVkICgwIGZvciB0b3AgbGVmdCBvZiBzY3JlZW4pLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RYSW1hZ2VTcmM6OnVzZS1kYW1hZ2U8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlVzZSBYRGFtYWdlPC9OSUNLPgorPEJMVVJCPlVzZSBYRGFtYWdlIChpZiBYRGFtYWdlIGV4dGVuc2lvbiBlbmFibGVkKS48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0WEltYWdlU3JjOjpyZW1vdGU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJlbW90ZSBkaXNwYXk8L05JQ0s+Cis8QkxVUkI+V2hldGhlciB0aGUgZGlzcGxheSBpcyByZW1vdGUuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RYSW1hZ2VTcmM6OnhpZDwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5XaW5kb3cgWElEPC9OSUNLPgorPEJMVVJCPldpbmRvdyBYSUQgdG8gY2FwdHVyZSBmcm9tLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RYSW1hZ2VTcmM6OnhuYW1lPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+V2luZG93IG5hbWU8L05JQ0s+Cis8QkxVUkI+V2luZG93IG5hbWUgdG8gY2FwdHVyZSBmcm9tLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWaWRlb0JhbGFuY2U6OmJyaWdodG5lc3M8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QnJpZ2h0bmVzczwvTklDSz4KKzxCTFVSQj5icmlnaHRuZXNzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWaWRlb0JhbGFuY2U6OmNvbnRyYXN0PC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bMCwyXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29udHJhc3Q8L05JQ0s+Cis8QkxVUkI+Y29udHJhc3QuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvQmFsYW5jZTo6aHVlPC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkh1ZTwvTklDSz4KKzxCTFVSQj5odWUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvQmFsYW5jZTo6c2F0dXJhdGlvbjwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsMl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNhdHVyYXRpb248L05JQ0s+Cis8QkxVUkI+c2F0dXJhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlwYXJ0RGVtdXg6OmJvdW5kYXJ5PC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJvdW5kYXJ5PC9OSUNLPgorPEJMVVJCPlRoZSBib3VuZGFyeSBzdHJpbmcgc2VwYXJhdGluZyBkYXRhLCBhdXRvbWF0aWMgaWYgTlVMTC48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TXVsdGlwYXJ0RGVtdXg6OnNpbmdsZS1zdHJlYW08L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNpbmdsZSBTdHJlYW08L05JQ0s+Cis8QkxVUkI+QXNzdW1lIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgc3RyZWFtIHdob3NlIGNvbnRlbnQtdHlwZSB3aWxsIG5vdCBjaGFuZ2UgYW5kIGVtaXQgbm8tbW9yZS1wYWRzIGFzIHNvb24gYXMgdGhlIGZpcnN0IGJvdW5kYXJ5IGNvbnRlbnQgaXMgcGFyc2VkLCBkZWNvZGVkLCBhbmQgcGFkcyBhcmUgbGlua2VkLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXZpTXV4OjpiaWdmaWxlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CaWdmaWxlIFN1cHBvcnQgKD4yR0IpPC9OSUNLPgorPEJMVVJCPlN1cHBvcnQgZm9yIG9wZW5ETUwtMi4wIChiaWcpIEFWSSBmaWxlcy48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SnBlZ0RlYzo6aWRjdC1tZXRob2Q8L05BTUU+Cis8VFlQRT5Hc3RJRENUTWV0aG9kPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SURDVCBNZXRob2Q8L05JQ0s+Cis8QkxVUkI+VGhlIElEQ1QgYWxnb3JpdGhtIHRvIHVzZS48L0JMVVJCPgorPERFRkFVTFQ+RmFzdGVyLCBsZXNzIGFjY3VyYXRlIGludGVnZXIgbWV0aG9kPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RKcGVnRGVjOjptYXgtZXJyb3JzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSBHX01BWFVMT05HPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXhpbXVtIENvbnNlY3V0aXZlIERlY29kaW5nIEVycm9yczwvTklDSz4KKzxCTFVSQj4oRGVwcmVjYXRlZCkgRXJyb3Igb3V0IGFmdGVyIHJlY2VpdmluZyBOIGNvbnNlY3V0aXZlIGRlY29kaW5nIGVycm9ycyAoLTEgPSBuZXZlciBmYWlsLCAwID0gYXV0b21hdGljLCAxID0gZmFpbCBvbiBmaXJzdCBlcnJvcikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUUGlMQkNEZXBheTo6bW9kZTwvTkFNRT4KKzxUWVBFPmlMQkNNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TW9kZTwvTklDSz4KKzxCTFVSQj5pTEJDIGZyYW1lIG1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPjMwbXMgZnJhbWVzPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb1Bhbm9yYW1hOjpwYW5vcmFtYTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBhbm9yYW1hPC9OSUNLPgorPEJMVVJCPlBvc2l0aW9uIGluIHN0ZXJlbyBwYW5vcmFtYSAoLTEuMCBsZWZ0IC0+IDEuMCByaWdodCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvUGFub3JhbWE6Om1ldGhvZDwvTkFNRT4KKzxUWVBFPkdzdEF1ZGlvUGFub3JhbWFNZXRob2Q8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5QYW5uaW5nIG1ldGhvZDwvTklDSz4KKzxCTFVSQj5Qc3ljaG9hY291c3RpYyBtb2RlIGtlZXBzIHNhbWUgcGVyY2VpdmVkIGxvdWRuZXNzLCBzaW1wbGUgbW9kZSBqdXN0IGNvbnRyb2xzIHZvbHVtZSBvZiBvbmUgY2hhbm5lbC48L0JMVVJCPgorPERFRkFVTFQ+UHN5Y2hvYWNvdXN0aWMgUGFubmluZyAoZGVmYXVsdCk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvSW52ZXJ0OjpkZWdyZWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRlZ3JlZTwvTklDSz4KKzxCTFVSQj5EZWdyZWUgb2YgaW52ZXJzaW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb0FtcGxpZnk6OmFtcGxpZmljYXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5BbXBsaWZpY2F0aW9uPC9OSUNLPgorPEJMVVJCPkZhY3RvciBvZiBhbXBsaWZpY2F0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb0FtcGxpZnk6OmNsaXBwaW5nLW1ldGhvZDwvTkFNRT4KKzxUWVBFPkdzdEF1ZGlvQW1wbGlmeUNsaXBwaW5nTWV0aG9kPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q2xpcHBpbmcgbWV0aG9kPC9OSUNLPgorPEJMVVJCPlNlbGVjdHMgaG93IHRvIGhhbmRsZSB2YWx1ZXMgaGlnaGVyIHRoYW4gdGhlIG1heGltdW0uPC9CTFVSQj4KKzxERUZBVUxUPk5vcm1hbCBjbGlwcGluZyAoZGVmYXVsdCk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvRHluYW1pYzo6Y2hhcmFjdGVyaXN0aWNzPC9OQU1FPgorPFRZUEU+R3N0QXVkaW9EeW5hbWljQ2hhcmFjdGVyaXN0aWNzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q2hhcmFjdGVyaXN0aWNzPC9OSUNLPgorPEJMVVJCPlNlbGVjdHMgd2hldGhlciB0aGUgcmF0aW8gc2hvdWxkIGJlIGFwcGxpZWQgc21vb3RoIChzb2Z0LWtuZWUpIG9yIGhhcmQgKGhhcmQta25lZSkuPC9CTFVSQj4KKzxERUZBVUxUPkhhcmQgS25lZSAoZGVmYXVsdCk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvRHluYW1pYzo6bW9kZTwvTkFNRT4KKzxUWVBFPkdzdEF1ZGlvRHluYW1pY01vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPlNlbGVjdHMgd2hldGhlciB0aGUgZmlsdGVyIHNob3VsZCB3b3JrIG9uIGxvdWQgc2FtcGxlcyAoY29tcHJlc3Nvcikgb3JxdWlldCBzYW1wbGVzIChleHBhbmRlcikuPC9CTFVSQj4KKzxERUZBVUxUPkNvbXByZXNzb3IgKGRlZmF1bHQpPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb0R5bmFtaWM6OnJhdGlvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJhdGlvPC9OSUNLPgorPEJMVVJCPlJhdGlvIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvRHluYW1pYzo6dGhyZXNob2xkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UaHJlc2hvbGQ8L05JQ0s+Cis8QkxVUkI+VGhyZXNob2xkIHVudGlsIHRoZSBmaWx0ZXIgaXMgYWN0aXZhdGVkLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RXYXZwYWNrRW5jOjpiaXRyYXRlPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gOTYwMDAwMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Qml0cmF0ZTwvTklDSz4KKzxCTFVSQj5UcnkgdG8gZW5jb2RlIHdpdGggdGhpcyBhdmVyYWdlIGJpdHJhdGUgKGJpdHMvc2VjKS4gVGhpcyBlbmFibGVzIGxvc3N5IGVuY29kaW5nLCB2YWx1ZXMgc21hbGxlciB0aGFuIDI0MDAwIGRpc2FibGUgaXQgYWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFdhdnBhY2tFbmM6OmJpdHMtcGVyLXNhbXBsZTwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsMjRdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CaXRzIHBlciBzYW1wbGU8L05JQ0s+Cis8QkxVUkI+VHJ5IHRvIGVuY29kZSB3aXRoIHRoaXMgYW1vdW50IG9mIGJpdHMgcGVyIHNhbXBsZS4gVGhpcyBlbmFibGVzIGxvc3N5IGVuY29kaW5nLCB2YWx1ZXMgc21hbGxlciB0aGFuIDIuMCBkaXNhYmxlIGl0IGFnYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RXYXZwYWNrRW5jOjpjb3JyZWN0aW9uLW1vZGU8L05BTUU+Cis8VFlQRT5Hc3RXYXZwYWNrRW5jQ29ycmVjdGlvbk1vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Db3JyZWN0aW9uIHN0cmVhbSBtb2RlPC9OSUNLPgorPEJMVVJCPlVzZSB0aGlzIG1vZGUgZm9yIHRoZSBjb3JyZWN0aW9uIHN0cmVhbS4gT25seSB3b3JrcyBpbiBsb3NzeSBtb2RlIS48L0JMVVJCPgorPERFRkFVTFQ+Q3JlYXRlIG5vIGNvcnJlY3Rpb24gZmlsZTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0V2F2cGFja0VuYzo6ZXh0cmEtcHJvY2Vzc2luZzwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDY8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkV4dHJhIHByb2Nlc3Npbmc8L05JQ0s+Cis8QkxVUkI+VXNlIGJldHRlciBidXQgc2xvd2VyIGZpbHRlcnMgZm9yIGJldHRlciBjb21wcmVzc2lvbi9xdWFsaXR5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RXYXZwYWNrRW5jOjpqb2ludC1zdGVyZW8tbW9kZTwvTkFNRT4KKzxUWVBFPkdzdFdhdnBhY2tFbmNKU01vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Kb2ludC1TdGVyZW8gbW9kZTwvTklDSz4KKzxCTFVSQj5Vc2UgdGhpcyBqb2ludC1zdGVyZW8gbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+YXV0bzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0V2F2cGFja0VuYzo6bWQ1PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NRDU8L05JQ0s+Cis8QkxVUkI+U3RvcmUgTUQ1IGhhc2ggb2YgcmF3IHNhbXBsZXMgd2l0aGluIHRoZSBmaWxlLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0V2F2cGFja0VuYzo6bW9kZTwvTkFNRT4KKzxUWVBFPkdzdFdhdnBhY2tFbmNNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RW5jb2RpbmcgbW9kZTwvTklDSz4KKzxCTFVSQj5TcGVlZCB2ZXJzdXMgY29tcHJlc3Npb24gdHJhZGVvZmYuPC9CTFVSQj4KKzxERUZBVUxUPk5vcm1hbCBDb21wcmVzc2lvbjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwTVAyVERlcGF5Ojpza2lwLWZpcnN0LWJ5dGVzPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Ta2lwIGZpcnN0IGJ5dGVzPC9OSUNLPgorPEJMVVJCPlRoZSBhbW91bnQgb2YgYnl0ZXMgdGhhdCBuZWVkIHRvIGJlIHNraXBwZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGF5bG9hZC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSDI2M1BQYXk6OmZyYWdtZW50YXRpb24tbW9kZTwvTkFNRT4KKzxUWVBFPkdzdEZyYWdtZW50YXRpb25Nb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RnJhZ21lbnRhdGlvbiBNb2RlPC9OSUNLPgorPEJMVVJCPlBhY2tldCBGcmFnbWVudGF0aW9uIE1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPk5vcm1hbDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0R2FtbWE6OmdhbW1hPC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bMC4wMSwxMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkdhbW1hPC9OSUNLPgorPEJMVVJCPmdhbW1hLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWaWRlb0Nyb3A6OmJvdHRvbTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Qm90dG9tPC9OSUNLPgorPEJMVVJCPlBpeGVscyB0byBjcm9wIGF0IGJvdHRvbSAoLTEgdG8gYXV0by1jcm9wKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VmlkZW9Dcm9wOjpsZWZ0PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSBHX01BWFVMT05HPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5MZWZ0PC9OSUNLPgorPEJMVVJCPlBpeGVscyB0byBjcm9wIGF0IGxlZnQgKC0xIHRvIGF1dG8tY3JvcCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvQ3JvcDo6cmlnaHQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJpZ2h0PC9OSUNLPgorPEJMVVJCPlBpeGVscyB0byBjcm9wIGF0IHJpZ2h0ICgtMSB0byBhdXRvLWNyb3ApLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWaWRlb0Nyb3A6OnRvcDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VG9wPC9OSUNLPgorPEJMVVJCPlBpeGVscyB0byBjcm9wIGF0IHRvcCAoLTEgdG8gYXV0by1jcm9wKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNyYzo6ZGV2aWNlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RGV2aWNlPC9OSUNLPgorPEJMVVJCPkRldmljZSBsb2NhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+Ii9kZXYvdmlkZW8wIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNyYzo6ZGV2aWNlLW5hbWU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkRldmljZSBuYW1lPC9OSUNLPgorPEJMVVJCPk5hbWUgb2YgdGhlIGRldmljZS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNyYzo6ZmxhZ3M8L05BTUU+Cis8VFlQRT5Hc3RWNGwyRGV2aWNlVHlwZUZsYWdzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5GbGFnczwvTklDSz4KKzxCTFVSQj5EZXZpY2UgdHlwZSBmbGFncy48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWNGwyU3JjOjpkZXZpY2UtZmQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+RmlsZSBkZXNjcmlwdG9yPC9OSUNLPgorPEJMVVJCPkZpbGUgZGVzY3JpcHRvciBvZiB0aGUgZGV2aWNlLjwvQkxVUkI+Cis8REVGQVVMVD4tMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNyYzo6YnJpZ2h0bmVzczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CcmlnaHRuZXNzPC9OSUNLPgorPEJMVVJCPlBpY3R1cmUgYnJpZ2h0bmVzcywgb3IgbW9yZSBwcmVjaXNlbHksIHRoZSBibGFjayBsZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNyYzo6Y29udHJhc3Q8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29udHJhc3Q8L05JQ0s+Cis8QkxVUkI+UGljdHVyZSBjb250cmFzdCBvciBsdW1hIGdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTcmM6Omh1ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5IdWU8L05JQ0s+Cis8QkxVUkI+SHVlIG9yIGNvbG9yIGJhbGFuY2UuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTcmM6OnNhdHVyYXRpb248L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U2F0dXJhdGlvbjwvTklDSz4KKzxCTFVSQj5QaWN0dXJlIGNvbG9yIHNhdHVyYXRpb24gb3IgY2hyb21hIGdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTcmM6Om5vcm08L05BTUU+Cis8VFlQRT5WNEwyX1RWX25vcm1zPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VFYgbm9ybTwvTklDSz4KKzxCTFVSQj52aWRlbyBzdGFuZGFyZC48L0JMVVJCPgorPERFRkFVTFQ+bm9uZTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNyYzo6aW8tbW9kZTwvTkFNRT4KKzxUWVBFPkdzdFY0bDJJT01vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5JTyBtb2RlPC9OSUNLPgorPEJMVVJCPkkvTyBtb2RlLjwvQkxVUkI+Cis8REVGQVVMVD5HU1RfVjRMMl9JT19BVVRPPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWNGwyU3JjOjpleHRyYS1jb250cm9sczwvTkFNRT4KKzxUWVBFPkdzdFN0cnVjdHVyZSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5FeHRyYSBDb250cm9sczwvTklDSz4KKzxCTFVSQj5FeHRyYSB2NGwyIGNvbnRyb2xzIChDSURzKSBmb3IgdGhlIGRldmljZS48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWNGwyU3JjOjpmb3JjZS1hc3BlY3QtcmF0aW88L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZvcmNlIGFzcGVjdCByYXRpbzwvTklDSz4KKzxCTFVSQj5XaGVuIGVuYWJsZWQsIHRoZSBwaXhlbCBhc3BlY3QgcmF0aW8gd2lsbCBiZSBlbmZvcmNlZC48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNyYzo6cGl4ZWwtYXNwZWN0LXJhdGlvPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UGl4ZWwgQXNwZWN0IFJhdGlvPC9OSUNLPgorPEJMVVJCPk92ZXJ3cml0ZSB0aGUgcGl4ZWwgYXNwZWN0IHJhdGlvIG9mIHRoZSBkZXZpY2UuPC9CTFVSQj4KKzxERUZBVUxUPiIxLzEiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb0NoZWJCYW5kOjpsb3dlci1mcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TG93ZXIgZnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPlN0YXJ0IGZyZXF1ZW5jeSBvZiB0aGUgYmFuZCAoSHopLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb0NoZWJCYW5kOjptb2RlPC9OQU1FPgorPFRZUEU+R3N0QXVkaW9DaGViQmFuZE1vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPkxvdyBwYXNzIG9yIGhpZ2ggcGFzcyBtb2RlLjwvQkxVUkI+Cis8REVGQVVMVD5CYW5kIHBhc3MgKGRlZmF1bHQpPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb0NoZWJCYW5kOjpwb2xlczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzQsMzJdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qb2xlczwvTklDSz4KKzxCTFVSQj5OdW1iZXIgb2YgcG9sZXMgdG8gdXNlLCB3aWxsIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgbXVsdGlwbHkgb2YgZm91ci48L0JMVVJCPgorPERFRkFVTFQ+NDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9DaGViQmFuZDo6cmlwcGxlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDIwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJpcHBsZTwvTklDSz4KKzxCTFVSQj5BbW91bnQgb2YgcmlwcGxlIChkQikuPC9CTFVSQj4KKzxERUZBVUxUPjAuMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvQ2hlYkJhbmQ6OnR5cGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDJdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UeXBlPC9OSUNLPgorPEJMVVJCPlR5cGUgb2YgdGhlIGNoZWJ5Y2hldiBmaWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvQ2hlYkJhbmQ6OnVwcGVyLWZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMDAwMDBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5VcHBlciBmcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+U3RvcCBmcmVxdWVuY3kgb2YgdGhlIGJhbmQgKEh6KS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9DaGViTGltaXQ6OmN1dG9mZjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMDAwMDBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5DdXRvZmY8L05JQ0s+Cis8QkxVUkI+Q3V0IG9mZiBmcmVxdWVuY3kgKEh6KS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9DaGViTGltaXQ6Om1vZGU8L05BTUU+Cis8VFlQRT5Hc3RBdWRpb0NoZWJMaW1pdE1vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPkxvdyBwYXNzIG9yIGhpZ2ggcGFzcyBtb2RlLjwvQkxVUkI+Cis8REVGQVVMVD5Mb3cgcGFzcyAoZGVmYXVsdCk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvQ2hlYkxpbWl0Ojpwb2xlczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzIsMzJdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qb2xlczwvTklDSz4KKzxCTFVSQj5OdW1iZXIgb2YgcG9sZXMgdG8gdXNlLCB3aWxsIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgZXZlbiBudW1iZXIuPC9CTFVSQj4KKzxERUZBVUxUPjQ8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvQ2hlYkxpbWl0OjpyaXBwbGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMjAwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UmlwcGxlPC9OSUNLPgorPEJMVVJCPkFtb3VudCBvZiByaXBwbGUgKGRCKS48L0JMVVJCPgorPERFRkFVTFQ+MC4yNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9DaGViTGltaXQ6OnR5cGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDJdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UeXBlPC9OSUNLPgorPEJMVVJCPlR5cGUgb2YgdGhlIGNoZWJ5Y2hldiBmaWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvV1NpbmNCYW5kOjpsb3dlci1mcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TG93ZXIgRnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkN1dC1vZmYgbG93ZXIgZnJlcXVlbmN5IChIeikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvV1NpbmNCYW5kOjp1cHBlci1mcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VXBwZXIgRnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkN1dC1vZmYgdXBwZXIgZnJlcXVlbmN5IChIeikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvV1NpbmNCYW5kOjptb2RlPC9OQU1FPgorPFRZUEU+R3N0QXVkaW9XU2luY0JhbmRNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TW9kZTwvTklDSz4KKzxCTFVSQj5CYW5kIHBhc3Mgb3IgYmFuZCByZWplY3QgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+QmFuZCBwYXNzIChkZWZhdWx0KTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9XU2luY0JhbmQ6OndpbmRvdzwvTkFNRT4KKzxUWVBFPkdzdEF1ZGlvV1NpbmNCYW5kV2luZG93PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+V2luZG93PC9OSUNLPgorPEJMVVJCPldpbmRvdyBmdW5jdGlvbiB0byB1c2UuPC9CTFVSQj4KKzxERUZBVUxUPkhhbW1pbmcgd2luZG93IChkZWZhdWx0KTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9XU2luY0JhbmQ6Omxlbmd0aDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzMsMjU2MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TGVuZ3RoPC9OSUNLPgorPEJMVVJCPkZpbHRlciBrZXJuZWwgbGVuZ3RoLCB3aWxsIGJlIHJvdW5kZWQgdG8gdGhlIG5leHQgb2RkIG51bWJlci48L0JMVVJCPgorPERFRkFVTFQ+MTAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb1dTaW5jTGltaXQ6Omxlbmd0aDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzMsMjU2MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TGVuZ3RoPC9OSUNLPgorPEJMVVJCPkZpbHRlciBrZXJuZWwgbGVuZ3RoLCB3aWxsIGJlIHJvdW5kZWQgdG8gdGhlIG5leHQgb2RkIG51bWJlci48L0JMVVJCPgorPERFRkFVTFQ+MTAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb1dTaW5jTGltaXQ6Om1vZGU8L05BTUU+Cis8VFlQRT5Hc3RBdWRpb1dTaW5jTGltaXRNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TW9kZTwvTklDSz4KKzxCTFVSQj5Mb3cgcGFzcyBvciBoaWdoIHBhc3MgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+TG93IHBhc3MgKGRlZmF1bHQpPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb1dTaW5jTGltaXQ6OndpbmRvdzwvTkFNRT4KKzxUWVBFPkdzdEF1ZGlvV1NpbmNMaW1pdFdpbmRvdzwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPldpbmRvdzwvTklDSz4KKzxCTFVSQj5XaW5kb3cgZnVuY3Rpb24gdG8gdXNlLjwvQkxVUkI+Cis8REVGQVVMVD5IYW1taW5nIHdpbmRvdyAoZGVmYXVsdCk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvV1NpbmNMaW1pdDo6Y3V0b2ZmPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkN1dG9mZjwvTklDSz4KKzxCTFVSQj5DdXQtb2ZmIEZyZXF1ZW5jeSAoSHopLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSbmRCdWZmZXJTaXplOjptYXg8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDE8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5tYXhpbXVtPC9OSUNLPgorPEJMVVJCPm1heGltdW0gYnVmZmVyIHNpemUuPC9CTFVSQj4KKzxERUZBVUxUPjgxOTI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJuZEJ1ZmZlclNpemU6Om1pbjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPm1pbmludW08L05JQ0s+Cis8QkxVUkI+bWluaW51bSBidWZmZXIgc2l6ZS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0Um5kQnVmZmVyU2l6ZTo6c2VlZDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnJhbmRvbSBudW1iZXIgc2VlZDwvTklDSz4KKzxCTFVSQj5zZWVkIGZvciByYW5kb21uZXNzIChpbml0aWFsaXplZCB3aGVuIGdvaW5nIGZyb20gUkVBRFkgdG8gUEFVU0VEKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXV0b0F1ZGlvU2luazo6dHMtb2Zmc2V0PC9OQU1FPgorPFRZUEU+Z2ludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VFMgT2Zmc2V0PC9OSUNLPgorPEJMVVJCPlRpbWVzdGFtcCBvZmZzZXQgaW4gbmFub3NlY29uZHMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1dG9BdWRpb1Npbms6OnN5bmM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlN5bmM8L05JQ0s+Cis8QkxVUkI+U3luYyBvbiB0aGUgY2xvY2suPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1dG9WaWRlb1Npbms6OnRzLW9mZnNldDwvTkFNRT4KKzxUWVBFPmdpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRTIE9mZnNldDwvTklDSz4KKzxCTFVSQj5UaW1lc3RhbXAgb2Zmc2V0IGluIG5hbm9zZWNvbmRzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdXRvVmlkZW9TaW5rOjpzeW5jPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TeW5jPC9OSUNLPgorPEJMVVJCPlN5bmMgb24gdGhlIGNsb2NrLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RPc3hBdWRpb1Npbms6OmRldmljZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RGV2aWNlIElEPC9OSUNLPgorPEJMVVJCPkRldmljZSBJRCBvZiBvdXRwdXQgZGV2aWNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RPc3hBdWRpb1NyYzo6ZGV2aWNlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EZXZpY2UgSUQ8L05JQ0s+Cis8QkxVUkI+RGV2aWNlIElEIG9mIGlucHV0IGRldmljZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0T1NYVmlkZW9TaW5rOjplbWJlZDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+ZW1iZWQ8L05JQ0s+Cis8QkxVUkI+V2hlbiBlbmFibGVkLCBpdCAgY2FuIGJlIGVtYmVkZGVkLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0T1NYVmlkZW9TaW5rOjpmdWxsc2NyZWVuPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5mdWxsc2NyZWVuPC9OSUNLPgorPEJMVVJCPldoZW4gZW5hYmxlZCwgdGhlIHZpZXcgIGlzIGZ1bGxzY3JlZW4uPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RHZGtQaXhidWZTaW5rOjpsYXN0LXBpeGJ1ZjwvTkFNRT4KKzxUWVBFPkdka1BpeGJ1Zio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkxhc3QgUGl4YnVmPC9OSUNLPgorPEJMVVJCPkxhc3QgR2RrUGl4YnVmIG9iamVjdCByZW5kZXJlZC48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RHZGtQaXhidWZTaW5rOjpwb3N0LW1lc3NhZ2VzPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qb3N0IE1lc3NhZ2VzPC9OSUNLPgorPEJMVVJCPldoZXRoZXIgdG8gcG9zdCBtZXNzYWdlcyBjb250YWluaW5nIHBpeGJ1ZnMgb24gdGhlIGJ1cy48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U291cEhUVFBTcmM6OmF1dG9tYXRpYy1yZWRpcmVjdDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+YXV0b21hdGljLXJlZGlyZWN0PC9OSUNLPgorPEJMVVJCPkF1dG9tYXRpY2FsbHkgZm9sbG93IEhUVFAgcmVkaXJlY3RzIChIVFRQIFN0YXR1cyBDb2RlIDN4eCkuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIVFRQU3JjOjpjb29raWVzPC9OQU1FPgorPFRZUEU+R1N0cnY8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Db29raWVzPC9OSUNLPgorPEJMVVJCPkhUVFAgcmVxdWVzdCBjb29raWVzLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIVFRQU3JjOjppcmFkaW8tbW9kZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+aXJhZGlvLW1vZGU8L05JQ0s+Cis8QkxVUkI+RW5hYmxlIGludGVybmV0IHJhZGlvIG1vZGUgKGFzayBzZXJ2ZXIgdG8gc2VuZCBzaG91dGNhc3QvaWNlY2FzdCBtZXRhZGF0YSBpbnRlcmxlYXZlZCB3aXRoIHRoZSBhY3R1YWwgc3RyZWFtIGRhdGEpLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSFRUUFNyYzo6bG9jYXRpb248L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Mb2NhdGlvbjwvTklDSz4KKzxCTFVSQj5Mb2NhdGlvbiB0byByZWFkIGZyb20uPC9CTFVSQj4KKzxERUZBVUxUPiIiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSFRUUFNyYzo6cHJveHk8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qcm94eTwvTklDSz4KKzxCTFVSQj5IVFRQIHByb3h5IHNlcnZlciBVUkkuPC9CTFVSQj4KKzxERUZBVUxUPiIiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSFRUUFNyYzo6dXNlci1hZ2VudDwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlVzZXItQWdlbnQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUgb2YgdGhlIFVzZXItQWdlbnQgSFRUUCByZXF1ZXN0IGhlYWRlciBmaWVsZC48L0JMVVJCPgorPERFRkFVTFQ+IkdTdHJlYW1lciBzb3VwaHR0cHNyYyAxLjEzLjAuMSAiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSFRUUFNyYzo6aXMtbGl2ZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+aXMtbGl2ZTwvTklDSz4KKzxCTFVSQj5BY3QgbGlrZSBhIGxpdmUgc291cmNlLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U291cEhUVFBTcmM6OnByb3h5LWlkPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+cHJveHktaWQ8L05JQ0s+Cis8QkxVUkI+SFRUUCBwcm94eSBVUkkgdXNlciBpZCBmb3IgYXV0aGVudGljYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPiIiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSFRUUFNyYzo6cHJveHktcHc8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5wcm94eS1wdzwvTklDSz4KKzxCTFVSQj5IVFRQIHByb3h5IFVSSSB1c2VyIHBhc3N3b3JkIGZvciBhdXRoZW50aWNhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+IiI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIVFRQU3JjOjp1c2VyLWlkPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+dXNlci1pZDwvTklDSz4KKzxCTFVSQj5IVFRQIGxvY2F0aW9uIFVSSSB1c2VyIGlkIGZvciBhdXRoZW50aWNhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+IiI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIVFRQU3JjOjp1c2VyLXB3PC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+dXNlci1wdzwvTklDSz4KKzxCTFVSQj5IVFRQIGxvY2F0aW9uIFVSSSB1c2VyIHBhc3N3b3JkIGZvciBhdXRoZW50aWNhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+IiI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIVFRQU3JjOjpleHRyYS1oZWFkZXJzPC9OQU1FPgorPFRZUEU+R3N0U3RydWN0dXJlKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkV4dHJhIEhlYWRlcnM8L05JQ0s+Cis8QkxVUkI+RXh0cmEgaGVhZGVycyB0byBhcHBlbmQgdG8gdGhlIEhUVFAgcmVxdWVzdC48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSFRUUFNyYzo6dGltZW91dDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDM2MDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPnRpbWVvdXQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUgaW4gc2Vjb25kcyB0byB0aW1lb3V0IGEgYmxvY2tpbmcgSS9PICgwID0gTm8gdGltZW91dCkuPC9CTFVSQj4KKzxERUZBVUxUPjE1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSFRUUFNyYzo6Y29tcHJlc3M8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNvbXByZXNzPC9OSUNLPgorPEJMVVJCPkFsbG93IGNvbXByZXNzZWQgY29udGVudCBlbmNvZGluZ3MuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSFRUUFNyYzo6aHR0cC1sb2ctbGV2ZWw8L05BTUU+Cis8VFlQRT5Tb3VwTG9nZ2VyTG9nTGV2ZWw8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5IVFRQIGxvZyBsZXZlbDwvTklDSz4KKzxCTFVSQj5TZXQgbG9nIGxldmVsIGZvciBzb3VwJ3MgSFRUUCBzZXNzaW9uIGxvZy48L0JMVVJCPgorPERFRkFVTFQ+U09VUF9MT0dHRVJfTE9HX0hFQURFUlM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIVFRQU3JjOjprZWVwLWFsaXZlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5rZWVwLWFsaXZlPC9OSUNLPgorPEJMVVJCPlVzZSBIVFRQIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIVFRQU3JjOjpyZXRyaWVzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSBHX01BWFVMT05HPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SZXRyaWVzPC9OSUNLPgorPEJMVVJCPk1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgdW50aWwgZ2l2aW5nIHVwICgtMT1pbmZpbml0ZSkuPC9CTFVSQj4KKzxERUZBVUxUPjM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIVFRQU3JjOjpzc2wtY2EtZmlsZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNTTCBDQSBGaWxlPC9OSUNLPgorPEJMVVJCPkxvY2F0aW9uIG9mIGEgU1NMIGFuY2hvciBDQSBmaWxlIHRvIHVzZS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U291cEhUVFBTcmM6OnNzbC1zdHJpY3Q8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNTTCBTdHJpY3Q8L05JQ0s+Cis8QkxVUkI+U3RyaWN0IFNTTCBjZXJ0aWZpY2F0ZSBjaGVja2luZy48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U291cEhUVFBTcmM6OnNzbC11c2Utc3lzdGVtLWNhLWZpbGU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlVzZSBTeXN0ZW0gQ0EgRmlsZTwvTklDSz4KKzxCTFVSQj5Vc2Ugc3lzdGVtIENBIGZpbGUuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIVFRQU3JjOjp0bHMtZGF0YWJhc2U8L05BTUU+Cis8VFlQRT5HVGxzRGF0YWJhc2UqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VExTIGRhdGFiYXNlPC9OSUNLPgorPEJMVVJCPlRMUyBkYXRhYmFzZSB3aXRoIGFuY2hvciBjZXJ0aWZpY2F0ZSBhdXRob3JpdGllcyB1c2VkIHRvIHZhbGlkYXRlIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U291cEhUVFBTcmM6Om1ldGhvZDwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkhUVFAgbWV0aG9kPC9OSUNLPgorPEJMVVJCPlRoZSBIVFRQIG1ldGhvZCB0byB1c2UgKEdFVCwgSEVBRCwgT1BUSU9OUywgZXRjKS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U291cEhUVFBTcmM6OnRscy1pbnRlcmFjdGlvbjwvTkFNRT4KKzxUWVBFPkdUbHNJbnRlcmFjdGlvbio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UTFMgaW50ZXJhY3Rpb248L05JQ0s+Cis8QkxVUkI+QSBHVGxzSW50ZXJhY3Rpb24gb2JqZWN0IHRvIGJlIHVzZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBvciBjZXJ0aWZpY2F0ZSBkYXRhYmFzZSBuZWVkIHRvIGludGVyYWN0IHdpdGggdGhlIHVzZXIuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRQRFZQYXk6Om1vZGU8L05BTUU+Cis8VFlQRT5Hc3REVlBheU1vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPlRoZSBwYXlsb2FkIG1vZGUgb2YgcGF5bG9hZGluZy48L0JMVVJCPgorPERFRkFVTFQ+VmlkZW8gb25seTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSDI2NFBheTo6c3Byb3AtcGFyYW1ldGVyLXNldHM8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5zcHJvcC1wYXJhbWV0ZXItc2V0czwvTklDSz4KKzxCTFVSQj5UaGUgYmFzZTY0IHNwcm9wLXBhcmFtZXRlci1zZXRzIHRvIHNldCBpbiBvdXQgY2FwcyAoc2V0IHRvIE5VTEwgdG8gZXh0cmFjdCBmcm9tIHN0cmVhbSkuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEgyNjRQYXk6OmNvbmZpZy1pbnRlcnZhbDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+W0dfTUFYVUxPTkcsMzYwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNQUyBQUFMgU2VuZCBJbnRlcnZhbDwvTklDSz4KKzxCTFVSQj5TZW5kIFNQUyBhbmQgUFBTIEluc2VydGlvbiBJbnRlcnZhbCBpbiBzZWNvbmRzIChzcHJvcCBwYXJhbWV0ZXIgc2V0cyB3aWxsIGJlIG11bHRpcGxleGVkIGluIHRoZSBkYXRhIHN0cmVhbSB3aGVuIGRldGVjdGVkLikgKDAgPSBkaXNhYmxlZCwgLTEgPSBzZW5kIHdpdGggZXZlcnkgSURSIGZyYW1lKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcmRMaW1pdGVyOjpSZXNpZHVlLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzaWR1ZS1sZXZlbDwvTklDSz4KKzxCTFVSQj5SZXNpZHVlLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGFyZExpbWl0ZXI6OldldC1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldldC1sZXZlbDwvTklDSz4KKzxCTFVSQj5XZXQtbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oYXJkTGltaXRlcjo6ZEItbGltaXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy01MCwwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmRCLWxpbWl0PC9OSUNLPgorPEJMVVJCPmRCLWxpbWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGotZXEtbW9ubzo6SGktZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SGktZ2FpbjwvTklDSz4KKzxCTFVSQj5IaS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGotZXEtbW9ubzo6TG8tZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TG8tZ2FpbjwvTklDSz4KKzxCTFVSQj5Mby1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGotZXEtbW9ubzo6TWlkLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCw2XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1pZC1nYWluPC9OSUNLPgorPEJMVVJCPk1pZC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGotZXEtbW9ubzo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kai1lcTo6SGktZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SGktZ2FpbjwvTklDSz4KKzxCTFVSQj5IaS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGotZXE6OkxvLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCw2XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxvLWdhaW48L05JQ0s+Cis8QkxVUkI+TG8tZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRqLWVxOjpNaWQtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TWlkLWdhaW48L05JQ0s+Cis8QkxVUkI+TWlkLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kai1lcTo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1icmFuY2gtaWMtb2NvYzo6Rmlyc3QtT3V0cHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5GaXJzdC1PdXRwdXQ8L05JQ0s+Cis8QkxVUkI+Rmlyc3QtT3V0cHV0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1icmFuY2gtaWMtb2NvYzo6SW5wdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5wdXQ8L05JQ0s+Cis8QkxVUkI+SW5wdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWJyYW5jaC1pYy1vY29jOjpTZWNvbmQtT3V0cHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5TZWNvbmQtT3V0cHV0PC9OSUNLPgorPEJMVVJCPlNlY29uZC1PdXRwdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUV4YWdnZXJhdGU6OmFtb3VudDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+YW1vdW50PC9OSUNLPgorPEJMVVJCPmFtb3VudC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVRyYW5zcG9zZTo6dHJhbnNwb3NlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjQsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+dHJhbnNwb3NlPC9OSUNLPgorPEJMVVJCPnRyYW5zcG9zZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUFjY3VtdWxhdGU6OmRlY2F5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZGVjYXk8L05JQ0s+Cis8QkxVUkI+ZGVjYXkuPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BY2N1bXVsYXRlOjpnbGlzc2FuZG88L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Z2xpc3NhbmRvPC9OSUNLPgorPEJMVVJCPmdsaXNzYW5kby48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNpbnVzV2F2ZXdyYXBwZXI6OldyYXAtZGVncmVlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldyYXAtZGVncmVlPC9OSUNLPgorPEJMVVJCPldyYXAtZGVncmVlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm92ZXJkcml2ZTo6RHJpdmUtbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEsM108L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Ecml2ZS1sZXZlbDwvTklDSz4KKzxCTFVSQj5Ecml2ZS1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW1iZXE6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmxhdGVuY3k8L05JQ0s+Cis8QkxVUkI+bGF0ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbWJlcTo6cGFyYW0tMTAwMDBIei1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMTAwMDBIei1nYWluPC9OSUNLPgorPEJMVVJCPnBhcmFtLTEwMDAwSHotZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW1iZXE6OnBhcmFtLTEwMEh6LWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0xMDBIei1nYWluPC9OSUNLPgorPEJMVVJCPnBhcmFtLTEwMEh6LWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1tYmVxOjpwYXJhbS0xMjUwSHotZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTEyNTBIei1nYWluPC9OSUNLPgorPEJMVVJCPnBhcmFtLTEyNTBIei1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbWJlcTo6cGFyYW0tMTU2SHotZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTE1Nkh6LWdhaW48L05JQ0s+Cis8QkxVUkI+cGFyYW0tMTU2SHotZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW1iZXE6OnBhcmFtLTE3NTBIei1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMTc1MEh6LWdhaW48L05JQ0s+Cis8QkxVUkI+cGFyYW0tMTc1MEh6LWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1tYmVxOjpwYXJhbS0yMDAwMEh6LWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0yMDAwMEh6LWdhaW48L05JQ0s+Cis8QkxVUkI+cGFyYW0tMjAwMDBIei1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbWJlcTo6cGFyYW0tMjIwSHotZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTIyMEh6LWdhaW48L05JQ0s+Cis8QkxVUkI+cGFyYW0tMjIwSHotZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW1iZXE6OnBhcmFtLTI1MDBIei1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMjUwMEh6LWdhaW48L05JQ0s+Cis8QkxVUkI+cGFyYW0tMjUwMEh6LWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1tYmVxOjpwYXJhbS0zMTFIei1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMzExSHotZ2FpbjwvTklDSz4KKzxCTFVSQj5wYXJhbS0zMTFIei1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbWJlcTo6cGFyYW0tMzUwMEh6LWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0zNTAwSHotZ2FpbjwvTklDSz4KKzxCTFVSQj5wYXJhbS0zNTAwSHotZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW1iZXE6OnBhcmFtLTQ0MEh6LWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS00NDBIei1nYWluPC9OSUNLPgorPEJMVVJCPnBhcmFtLTQ0MEh6LWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1tYmVxOjpwYXJhbS01MDAwSHotZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTUwMDBIei1nYWluPC9OSUNLPgorPEJMVVJCPnBhcmFtLTUwMDBIei1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbWJlcTo6cGFyYW0tNTBIei1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tNTBIei1nYWluPC9OSUNLPgorPEJMVVJCPnBhcmFtLTUwSHotZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW1iZXE6OnBhcmFtLTYyMkh6LWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS02MjJIei1nYWluPC9OSUNLPgorPEJMVVJCPnBhcmFtLTYyMkh6LWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1tYmVxOjpwYXJhbS04ODBIei1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tODgwSHotZ2FpbjwvTklDSz4KKzxCTFVSQj5wYXJhbS04ODBIei1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXlvcmFtYTo6QW1wbGl0dWRlLWNoYW5nZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QW1wbGl0dWRlLWNoYW5nZTwvTklDSz4KKzxCTFVSQj5BbXBsaXR1ZGUtY2hhbmdlLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXlvcmFtYTo6QW1wbGl0dWRlLXJhbmRvbTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QW1wbGl0dWRlLXJhbmRvbTwvTklDSz4KKzxCTFVSQj5BbXBsaXR1ZGUtcmFuZG9tLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXlvcmFtYTo6RGVsYXktY2hhbmdlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDIsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheS1jaGFuZ2U8L05JQ0s+Cis8QkxVUkI+RGVsYXktY2hhbmdlLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXlvcmFtYTo6RGVsYXktcmFuZG9tPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheS1yYW5kb208L05JQ0s+Cis8QkxVUkI+RGVsYXktcmFuZG9tLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXlvcmFtYTo6RGVsYXktcmFuZ2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAwMSw2XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbGF5LXJhbmdlPC9OSUNLPgorPEJMVVJCPkRlbGF5LXJhbmdlLjwvQkxVUkI+Cis8REVGQVVMVD42PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXlvcmFtYTo6RHJ5LXdldC1taXg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Ecnktd2V0LW1peDwvTklDSz4KKzxCTFVSQj5Ecnktd2V0LW1peC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRlbGF5b3JhbWE6OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRlbGF5b3JhbWE6OkZpcnN0LWRlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Rmlyc3QtZGVsYXk8L05JQ0s+Cis8QkxVUkI+Rmlyc3QtZGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kZWxheW9yYW1hOjpJbnB1dC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTYsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5wdXQtZ2FpbjwvTklDSz4KKzxCTFVSQj5JbnB1dC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXlvcmFtYTo6TnVtYmVyLW9mLXRhcHM8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsyLDEyOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5OdW1iZXItb2YtdGFwczwvTklDSz4KKzxCTFVSQj5OdW1iZXItb2YtdGFwcy48L0JMVVJCPgorPERFRkFVTFQ+MjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRlbGF5b3JhbWE6OlJhbmRvbS1zZWVkPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJhbmRvbS1zZWVkPC9OSUNLPgorPEJMVVJCPlJhbmRvbS1zZWVkLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC0xLUJhbmR3aWR0aC0tb2N0YXZlcy08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMSw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMS1CYW5kd2lkdGgtLW9jdGF2ZXMtPC9OSUNLPgorPEJMVVJCPkJhbmQtMS1CYW5kd2lkdGgtLW9jdGF2ZXMtLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC0xLUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNDAsMjgwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMS1GcmVxLS1Iei08L05JQ0s+Cis8QkxVUkI+QmFuZC0xLUZyZXEtLUh6LS48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC0xLUdhaW4tLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTUwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMS1HYWluLS1kQi08L05JQ0s+Cis8QkxVUkI+QmFuZC0xLUdhaW4tLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXItYnc6OkJhbmQtMi1CYW5kd2lkdGgtLW9jdGF2ZXMtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTItQmFuZHdpZHRoLS1vY3RhdmVzLTwvTklDSz4KKzxCTFVSQj5CYW5kLTItQmFuZHdpZHRoLS1vY3RhdmVzLS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXItYnc6OkJhbmQtMi1GcmVxLS1Iei08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEwMCw1MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0yLUZyZXEtLUh6LTwvTklDSz4KKzxCTFVSQj5CYW5kLTItRnJlcS0tSHotLjwvQkxVUkI+Cis8REVGQVVMVD4yMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyLWJ3OjpCYW5kLTItR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0yLUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5CYW5kLTItR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC0zLUJhbmR3aWR0aC0tb2N0YXZlcy08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMSw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMy1CYW5kd2lkdGgtLW9jdGF2ZXMtPC9OSUNLPgorPEJMVVJCPkJhbmQtMy1CYW5kd2lkdGgtLW9jdGF2ZXMtLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC0zLUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMjAwLDEwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0zLUZyZXEtLUh6LTwvTklDSz4KKzxCTFVSQj5CYW5kLTMtRnJlcS0tSHotLjwvQkxVUkI+Cis8REVGQVVMVD40MDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyLWJ3OjpCYW5kLTMtR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0zLUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5CYW5kLTMtR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC00LUJhbmR3aWR0aC0tb2N0YXZlcy08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMSw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNC1CYW5kd2lkdGgtLW9jdGF2ZXMtPC9OSUNLPgorPEJMVVJCPkJhbmQtNC1CYW5kd2lkdGgtLW9jdGF2ZXMtLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC00LUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNDAwLDI4MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC00LUZyZXEtLUh6LTwvTklDSz4KKzxCTFVSQj5CYW5kLTQtRnJlcS0tSHotLjwvQkxVUkI+Cis8REVGQVVMVD4xMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC00LUdhaW4tLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTUwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNC1HYWluLS1kQi08L05JQ0s+Cis8QkxVUkI+QmFuZC00LUdhaW4tLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXItYnc6OkJhbmQtNS1CYW5kd2lkdGgtLW9jdGF2ZXMtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTUtQmFuZHdpZHRoLS1vY3RhdmVzLTwvTklDSz4KKzxCTFVSQj5CYW5kLTUtQmFuZHdpZHRoLS1vY3RhdmVzLS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXItYnc6OkJhbmQtNS1GcmVxLS1Iei08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEwMDAsNTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTUtRnJlcS0tSHotPC9OSUNLPgorPEJMVVJCPkJhbmQtNS1GcmVxLS1Iei0uPC9CTFVSQj4KKzxERUZBVUxUPjMwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyLWJ3OjpCYW5kLTUtR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC01LUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5CYW5kLTUtR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC02LUJhbmR3aWR0aC0tb2N0YXZlcy08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMSw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNi1CYW5kd2lkdGgtLW9jdGF2ZXMtPC9OSUNLPgorPEJMVVJCPkJhbmQtNi1CYW5kd2lkdGgtLW9jdGF2ZXMtLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC02LUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMzAwMCw5MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNi1GcmVxLS1Iei08L05JQ0s+Cis8QkxVUkI+QmFuZC02LUZyZXEtLUh6LS48L0JMVVJCPgorPERFRkFVTFQ+NjAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXItYnc6OkJhbmQtNi1HYWluLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy01MCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTYtR2Fpbi0tZEItPC9OSUNLPgorPEJMVVJCPkJhbmQtNi1HYWluLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyLWJ3OjpCYW5kLTctQmFuZHdpZHRoLS1vY3RhdmVzLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC03LUJhbmR3aWR0aC0tb2N0YXZlcy08L05JQ0s+Cis8QkxVUkI+QmFuZC03LUJhbmR3aWR0aC0tb2N0YXZlcy0uPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyLWJ3OjpCYW5kLTctRnJlcS0tSHotPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls2MDAwLDE4MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNy1GcmVxLS1Iei08L05JQ0s+Cis8QkxVUkI+QmFuZC03LUZyZXEtLUh6LS48L0JMVVJCPgorPERFRkFVTFQ+MTIwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyLWJ3OjpCYW5kLTctR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC03LUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5CYW5kLTctR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC04LUJhbmR3aWR0aC0tb2N0YXZlcy08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMSw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtOC1CYW5kd2lkdGgtLW9jdGF2ZXMtPC9OSUNLPgorPEJMVVJCPkJhbmQtOC1CYW5kd2lkdGgtLW9jdGF2ZXMtLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplci1idzo6QmFuZC04LUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMTAwMDAsMjAwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC04LUZyZXEtLUh6LTwvTklDSz4KKzxCTFVSQj5CYW5kLTgtRnJlcS0tSHotLjwvQkxVUkI+Cis8REVGQVVMVD4xNTAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXItYnc6OkJhbmQtOC1HYWluLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy01MCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTgtR2Fpbi0tZEItPC9OSUNLPgorPEJMVVJCPkJhbmQtOC1HYWluLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jcm9zc292ZXJEaXN0OjpDcm9zc292ZXItYW1wbGl0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Dcm9zc292ZXItYW1wbGl0dWRlPC9OSUNLPgorPEJMVVJCPkNyb3Nzb3Zlci1hbXBsaXR1ZGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jcm9zc292ZXJEaXN0OjpTbW9vdGhpbmc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TbW9vdGhpbmc8L05JQ0s+Cis8QkxVUkI+U21vb3RoaW5nLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZmFkRGVsYXk6OkRlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXk8L05JQ0s+Cis8QkxVUkI+RGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mYWREZWxheTo6RmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPkZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbXVsdGl2b2ljZUNob3J1czo6RGVsYXktYmFzZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMTAsNDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktYmFzZTwvTklDSz4KKzxCTFVSQj5EZWxheS1iYXNlLjwvQkxVUkI+Cis8REVGQVVMVD4xMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW11bHRpdm9pY2VDaG9ydXM6OkRldHVuZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRldHVuZTwvTklDSz4KKzxCTFVSQj5EZXR1bmUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1tdWx0aXZvaWNlQ2hvcnVzOjpMRk8tZnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxGTy1mcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+TEZPLWZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+OTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW11bHRpdm9pY2VDaG9ydXM6Ok51bWJlci1vZi12b2ljZXM8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TnVtYmVyLW9mLXZvaWNlczwvTklDSz4KKzxCTFVSQj5OdW1iZXItb2Ytdm9pY2VzLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbXVsdGl2b2ljZUNob3J1czo6T3V0cHV0LWF0dGVudWF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRwdXQtYXR0ZW51YXRpb248L05JQ0s+Cis8QkxVUkI+T3V0cHV0LWF0dGVudWF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbXVsdGl2b2ljZUNob3J1czo6Vm9pY2Utc2VwYXJhdGlvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZvaWNlLXNlcGFyYXRpb248L05JQ0s+Cis8QkxVUkI+Vm9pY2Utc2VwYXJhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc3luY3NxdWFyZS1mY2dhLW9hOjpGcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MTY8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zbW9vdGhEZWNpbWF0ZTo6UmVzYW1wbGUtcmF0ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw0NDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNhbXBsZS1yYXRlPC9OSUNLPgorPEJMVVJCPlJlc2FtcGxlLXJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjQ0MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc21vb3RoRGVjaW1hdGU6OlNtb290aGluZzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNtb290aGluZzwvTklDSz4KKzxCTFVSQj5TbW9vdGhpbmcuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbGxwYXNzLW46OkRlY2F5LVRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlY2F5LVRpbWU8L05JQ0s+Cis8QkxVUkI+RGVjYXktVGltZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFsbHBhc3Mtbjo6RGVsYXktVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktVGltZTwvTklDSz4KKzxCTFVSQj5EZWxheS1UaW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYWxscGFzcy1uOjpNYXgtRGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1heC1EZWxheTwvTklDSz4KKzxCTFVSQj5NYXgtRGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbGxwYXNzLWw6OkRlY2F5LVRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlY2F5LVRpbWU8L05JQ0s+Cis8QkxVUkI+RGVjYXktVGltZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFsbHBhc3MtbDo6RGVsYXktVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktVGltZTwvTklDSz4KKzxCTFVSQj5EZWxheS1UaW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYWxscGFzcy1sOjpNYXgtRGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1heC1EZWxheTwvTklDSz4KKzxCTFVSQj5NYXgtRGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbGxwYXNzLWM6OkRlY2F5LVRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlY2F5LVRpbWU8L05JQ0s+Cis8QkxVUkI+RGVjYXktVGltZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFsbHBhc3MtYzo6RGVsYXktVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktVGltZTwvTklDSz4KKzxCTFVSQj5EZWxheS1UaW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYWxscGFzcy1jOjpNYXgtRGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1heC1EZWxheTwvTklDSz4KKzxCTFVSQj5NYXgtRGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mbU9zYzo6V2F2ZWZvcm08L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+V2F2ZWZvcm08L05JQ0s+Cis8QkxVUkI+V2F2ZWZvcm0uPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mb2xkb3Zlcjo6RHJpdmU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Ecml2ZTwvTklDSz4KKzxCTFVSQj5Ecml2ZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZvbGRvdmVyOjpTa2V3PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U2tldzwvTklDSz4KKzxCTFVSQj5Ta2V3LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmFsdmU6OkRpc3RvcnRpb24tY2hhcmFjdGVyPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGlzdG9ydGlvbi1jaGFyYWN0ZXI8L05JQ0s+Cis8QkxVUkI+RGlzdG9ydGlvbi1jaGFyYWN0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12YWx2ZTo6RGlzdG9ydGlvbi1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRpc3RvcnRpb24tbGV2ZWw8L05JQ0s+Cis8QkxVUkI+RGlzdG9ydGlvbi1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRpZmZlcmVuY2UtaWFtYy1vYTo6SW5wdXQtdG8tU3VidHJhY3Q8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5wdXQtdG8tU3VidHJhY3Q8L05JQ0s+Cis8QkxVUkI+SW5wdXQtdG8tU3VidHJhY3QuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRpZmZlcmVuY2UtaWNtYS1vYTo6SW5wdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5wdXQ8L05JQ0s+Cis8QkxVUkI+SW5wdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRpZmZlcmVuY2UtaWNtYy1vYzo6RGlmZmVyZW5jZS1PdXRwdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkRpZmZlcmVuY2UtT3V0cHV0PC9OSUNLPgorPEJMVVJCPkRpZmZlcmVuY2UtT3V0cHV0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kaWZmZXJlbmNlLWljbWMtb2M6OklucHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklucHV0PC9OSUNLPgorPEJMVVJCPklucHV0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kaWZmZXJlbmNlLWljbWMtb2M6OklucHV0LXRvLVN1YnRyYWN0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklucHV0LXRvLVN1YnRyYWN0PC9OSUNLPgorPEJMVVJCPklucHV0LXRvLVN1YnRyYWN0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtMTo6RXhwLUZNLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RXhwLUZNLWdhaW48L05JQ0s+Cis8QkxVUkI+RXhwLUZNLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtMTo6RnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNiw2XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtMTo6SW5wdXQtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTYwLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklucHV0LWdhaW48L05JQ0s+Cis8QkxVUkI+SW5wdXQtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2xwZi0xOjpPdXRwdXQtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTE1LDE1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk91dHB1dC1nYWluPC9OSUNLPgorPEJMVVJCPk91dHB1dC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtTXZjbHBmLTE6OlJlc29uYW5jZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc29uYW5jZTwvTklDSz4KKzxCTFVSQj5SZXNvbmFuY2UuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtMTo6UmVzb25hbmNlLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2UtZ2FpbjwvTklDSz4KKzxCTFVSQj5SZXNvbmFuY2UtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2xwZi0yOjpFeHAtRk0tZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5FeHAtRk0tZ2FpbjwvTklDSz4KKzxCTFVSQj5FeHAtRk0tZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2xwZi0yOjpGcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy02LDZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2xwZi0yOjpJbnB1dC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNjAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5wdXQtZ2FpbjwvTklDSz4KKzxCTFVSQj5JbnB1dC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtTXZjbHBmLTI6Ok91dHB1dC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMTUsMTVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0LWdhaW48L05JQ0s+Cis8QkxVUkI+T3V0cHV0LWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtMjo6UmVzb25hbmNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzb25hbmNlPC9OSUNLPgorPEJMVVJCPlJlc29uYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2xwZi0yOjpSZXNvbmFuY2UtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc29uYW5jZS1nYWluPC9OSUNLPgorPEJMVVJCPlJlc29uYW5jZS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtTXZjbHBmLTM6OkV4cC1GTS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkV4cC1GTS1nYWluPC9OSUNLPgorPEJMVVJCPkV4cC1GTS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtTXZjbHBmLTM6OkZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTYsNl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtTXZjbHBmLTM6OklucHV0LWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy02MCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5JbnB1dC1nYWluPC9OSUNLPgorPEJMVVJCPklucHV0LWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtMzo6T3V0cHV0LWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xNSwxNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRwdXQtZ2FpbjwvTklDSz4KKzxCTFVSQj5PdXRwdXQtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2xwZi0zOjpSZXNvbmFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2U8L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtTXZjbHBmLTM6OlJlc29uYW5jZS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzb25hbmNlLWdhaW48L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtNDo6RXhwLUZNLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RXhwLUZNLWdhaW48L05JQ0s+Cis8QkxVUkI+RXhwLUZNLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtNDo6RmlsdGVyLXBvbGVzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHRlci1wb2xlczwvTklDSz4KKzxCTFVSQj5GaWx0ZXItcG9sZXMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtNDo6RnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNiw2XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtNDo6SW5wdXQtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTYwLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklucHV0LWdhaW48L05JQ0s+Cis8QkxVUkI+SW5wdXQtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2xwZi00OjpPdXRwdXQtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTE1LDE1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk91dHB1dC1nYWluPC9OSUNLPgorPEJMVVJCPk91dHB1dC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtTXZjbHBmLTQ6OlJlc29uYW5jZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc29uYW5jZTwvTklDSz4KKzxCTFVSQj5SZXNvbmFuY2UuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1NdmNscGYtNDo6UmVzb25hbmNlLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2UtZ2FpbjwvTklDSz4KKzxCTFVSQj5SZXNvbmFuY2UtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFsaWVud2FoLW1vbm86OkRlbGF5PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bNSw1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTwvTklDSz4KKzxCTFVSQj5EZWxheS48L0JMVVJCPgorPERFRkFVTFQ+NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFsaWVud2FoLW1vbm86OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbGllbndhaC1tb25vOjpGcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsaW5mXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbGllbndhaC1tb25vOjpJbml0aWFsLXBoYXNlLWZvci1zdGVyZW88L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5pdGlhbC1waGFzZS1mb3Itc3RlcmVvPC9OSUNLPgorPEJMVVJCPkluaXRpYWwtcGhhc2UtZm9yLXN0ZXJlby48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYWxpZW53YWgtc3RlcmVvOjpEZWxheTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzUsNTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXk8L05JQ0s+Cis8QkxVUkI+RGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbGllbndhaC1zdGVyZW86OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbGllbndhaC1zdGVyZW86OkZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCxpbmZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFsaWVud2FoLXN0ZXJlbzo6SW5pdGlhbC1waGFzZS1mb3Itc3RlcmVvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDYsMjgzMTldPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5pdGlhbC1waGFzZS1mb3Itc3RlcmVvPC9OSUNLPgorPEJMVVJCPkluaXRpYWwtcGhhc2UtZm9yLXN0ZXJlby48L0JMVVJCPgorPERFRkFVTFQ+NiwyODMxOTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmdCZWF0ZXI6OkltcHVsc2UtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW1wdWxzZS1nYWluPC9OSUNLPgorPEJMVVJCPkltcHVsc2UtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+LTcwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ29uZ0JlYXRlcjo6U3RyaWtlLWR1cmF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMSwwLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3RyaWtlLWR1cmF0aW9uPC9OSUNLPgorPEJMVVJCPlN0cmlrZS1kdXJhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MCwxMDA1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ29uZ0JlYXRlcjo6U3RyaWtlLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0cmlrZS1nYWluPC9OSUNLPgorPEJMVVJCPlN0cmlrZS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2hvcnVzMTo6RGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXk8L05JQ0s+Cis8QkxVUkI+RGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DaG9ydXMxOjpNb2QtQW1wbGl0dWRlLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kLUFtcGxpdHVkZS0xPC9OSUNLPgorPEJMVVJCPk1vZC1BbXBsaXR1ZGUtMS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNob3J1czE6Ok1vZC1BbXBsaXR1ZGUtMjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwzXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1vZC1BbXBsaXR1ZGUtMjwvTklDSz4KKzxCTFVSQj5Nb2QtQW1wbGl0dWRlLTIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DaG9ydXMxOjpNb2QtRnJlcXVlbmN5LTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAzLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1vZC1GcmVxdWVuY3ktMTwvTklDSz4KKzxCTFVSQj5Nb2QtRnJlcXVlbmN5LTEuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDAzPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2hvcnVzMTo6TW9kLUZyZXF1ZW5jeS0yPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1vZC1GcmVxdWVuY3ktMjwvTklDSz4KKzxCTFVSQj5Nb2QtRnJlcXVlbmN5LTIuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DaG9ydXMyOjpEZWxheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTwvTklDSz4KKzxCTFVSQj5EZWxheS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNob3J1czI6Ok1vZC1BbXBsaXR1ZGUtMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Nb2QtQW1wbGl0dWRlLTE8L05JQ0s+Cis8QkxVUkI+TW9kLUFtcGxpdHVkZS0xLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2hvcnVzMjo6TW9kLUFtcGxpdHVkZS0yPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDNdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kLUFtcGxpdHVkZS0yPC9OSUNLPgorPEJMVVJCPk1vZC1BbXBsaXR1ZGUtMi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNob3J1czI6Ok1vZC1GcmVxdWVuY3ktMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDMsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kLUZyZXF1ZW5jeS0xPC9OSUNLPgorPEJMVVJCPk1vZC1GcmVxdWVuY3ktMS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMDM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DaG9ydXMyOjpNb2QtRnJlcXVlbmN5LTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kLUZyZXF1ZW5jeS0yPC9OSUNLPgorPEJMVVJCPk1vZC1GcmVxdWVuY3ktMi48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhpbGJlcnQ6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmxhdGVuY3k8L05JQ0s+Cis8QkxVUkI+bGF0ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwZURlbGF5OjpEcnktbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy05MCwwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRyeS1sZXZlbDwvTklDSz4KKzxCTFVSQj5EcnktbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPi05MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcGVEZWxheTo6VGFwLTEtZGlzdGFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UYXAtMS1kaXN0YW5jZTwvTklDSz4KKzxCTFVSQj5UYXAtMS1kaXN0YW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcGVEZWxheTo6VGFwLTEtbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy05MCwwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRhcC0xLWxldmVsPC9OSUNLPgorPEJMVVJCPlRhcC0xLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwZURlbGF5OjpUYXAtMi1kaXN0YW5jZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRhcC0yLWRpc3RhbmNlPC9OSUNLPgorPEJMVVJCPlRhcC0yLWRpc3RhbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwZURlbGF5OjpUYXAtMi1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTkwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGFwLTItbGV2ZWw8L05JQ0s+Cis8QkxVUkI+VGFwLTItbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPi05MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcGVEZWxheTo6VGFwLTMtZGlzdGFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UYXAtMy1kaXN0YW5jZTwvTklDSz4KKzxCTFVSQj5UYXAtMy1kaXN0YW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcGVEZWxheTo6VGFwLTMtbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy05MCwwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRhcC0zLWxldmVsPC9OSUNLPgorPEJMVVJCPlRhcC0zLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4tOTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXBlRGVsYXk6OlRhcC00LWRpc3RhbmNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGFwLTQtZGlzdGFuY2U8L05JQ0s+Cis8QkxVUkI+VGFwLTQtZGlzdGFuY2UuPC9CTFVSQj4KKzxERUZBVUxUPjM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXBlRGVsYXk6OlRhcC00LWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UYXAtNC1sZXZlbDwvTklDSz4KKzxCTFVSQj5UYXAtNC1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+LTkwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwZURlbGF5OjpUYXBlLXNwZWVkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRhcGUtc3BlZWQ8L05JQ0s+Cis8QkxVUkI+VGFwZS1zcGVlZC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXN1bS1pYWljLW9hOjpTZWNvbmQtSW5wdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U2Vjb25kLUlucHV0PC9OSUNLPgorPEJMVVJCPlNlY29uZC1JbnB1dC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc3VtLWljaWMtb2M6OkZpcnN0LUlucHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpcnN0LUlucHV0PC9OSUNLPgorPEJMVVJCPkZpcnN0LUlucHV0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zdW0taWNpYy1vYzo6U2Vjb25kLUlucHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNlY29uZC1JbnB1dDwvTklDSz4KKzxCTFVSQj5TZWNvbmQtSW5wdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXN1bS1pY2ljLW9jOjpTdW1tZWQtT3V0cHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5TdW1tZWQtT3V0cHV0PC9OSUNLPgorPEJMVVJCPlN1bW1lZC1PdXRwdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjMTo6QXR0YWNrLXRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIsNDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkF0dGFjay10aW1lPC9OSUNLPgorPEJMVVJCPkF0dGFjay10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD4xMDEsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjMTo6S25lZS1yYWRpdXM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+S25lZS1yYWRpdXM8L05JQ0s+Cis8QkxVUkI+S25lZS1yYWRpdXMuPC9CTFVSQj4KKzxERUZBVUxUPjMsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzE6Ok1ha2V1cC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1ha2V1cC1nYWluPC9OSUNLPgorPEJMVVJCPk1ha2V1cC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2MxOjpSYXRpbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SYXRpbzwvTklDSz4KKzxCTFVSQj5SYXRpby48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjMTo6UmVsZWFzZS10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyLDgwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWxlYXNlLXRpbWU8L05JQ0s+Cis8QkxVUkI+UmVsZWFzZS10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD40MDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzE6OlRocmVzaG9sZC1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTMwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGhyZXNob2xkLWxldmVsPC9OSUNLPgorPEJMVVJCPlRocmVzaG9sZC1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWNvbWJTcGxpdHRlcjo6QmFuZC1zZXBhcmF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxNiw2NDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC1zZXBhcmF0aW9uPC9OSUNLPgorPEJMVVJCPkJhbmQtc2VwYXJhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MTcyPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2M0bTo6QW1wbGl0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDAsMTJdPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkFtcGxpdHVkZTwvTklDSz4KKzxCTFVSQj5BbXBsaXR1ZGUuPC9CTFVSQj4KKzxERUZBVUxUPi00MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjNG06OkF0dGFjay10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDUsNDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkF0dGFjay10aW1lPC9OSUNLPgorPEJMVVJCPkF0dGFjay10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD4xMDEsMTI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2M0bTo6R2Fpbi1yZWR1Y3Rpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yNCwwXTwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5HYWluLXJlZHVjdGlvbjwvTklDSz4KKzxCTFVSQj5HYWluLXJlZHVjdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+LTI0PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2M0bTo6S25lZS1yYWRpdXM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+S25lZS1yYWRpdXM8L05JQ0s+Cis8QkxVUkI+S25lZS1yYWRpdXMuPC9CTFVSQj4KKzxERUZBVUxUPjMsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzRtOjpNYWtldXAtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NYWtldXAtZ2FpbjwvTklDSz4KKzxCTFVSQj5NYWtldXAtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjNG06OlJNUy1wZWFrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Uk1TLXBlYWs8L05JQ0s+Cis8QkxVUkI+Uk1TLXBlYWsuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzRtOjpSYXRpbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SYXRpbzwvTklDSz4KKzxCTFVSQj5SYXRpby48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjNG06OlJlbGVhc2UtdGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMiw4MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVsZWFzZS10aW1lPC9OSUNLPgorPEJMVVJCPlJlbGVhc2UtdGltZS48L0JMVVJCPgorPERFRkFVTFQ+NDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2M0bTo6VGhyZXNob2xkLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMzAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UaHJlc2hvbGQtbGV2ZWw8L05JQ0s+Cis8QkxVUkI+VGhyZXNob2xkLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcHJlYW1wOjpmYzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMjAsNDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5mYzwvTklDSz4KKzxCTFVSQj5mYy48L0JMVVJCPgorPERFRkFVTFQ+NDQwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcHJlYW1wOjpnYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmdhaW48L05JQ0s+Cis8QkxVUkI+Z2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxzRmlsdGVyOjpDdXRvZmYtZnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls4OCwyLDIyMDUwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkN1dG9mZi1mcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+Q3V0b2ZmLWZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MTM5NCw1NjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxzRmlsdGVyOjpGaWx0ZXItdHlwZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0ZXItdHlwZTwvTklDSz4KKzxCTFVSQj5GaWx0ZXItdHlwZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxzRmlsdGVyOjpSZXNvbmFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2U8L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbWF0cml4TVNTdDo6V2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5XaWR0aDwvTklDSz4KKzxCTFVSQj5XaWR0aC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxwZjo6Q3V0b2ZmLUZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DdXRvZmYtRnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkN1dG9mZi1GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjQ0MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhwZjo6Q3V0b2ZmLUZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DdXRvZmYtRnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkN1dG9mZi1GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjQ0MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpNYXRjaC1SYW5nZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TWF0Y2gtUmFuZ2U8L05JQ0s+Cis8QkxVUkI+TWF0Y2gtUmFuZ2UuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6TW9kZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPk1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6UXVhbnRpc2UtUmFuZ2UtTWF4aW11bTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5RdWFudGlzZS1SYW5nZS1NYXhpbXVtPC9OSUNLPgorPEJMVVJCPlF1YW50aXNlLVJhbmdlLU1heGltdW0uPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpRdWFudGlzZS1SYW5nZS1NaW5pbXVtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlF1YW50aXNlLVJhbmdlLU1pbmltdW08L05JQ0s+Cis8QkxVUkI+UXVhbnRpc2UtUmFuZ2UtTWluaW11bS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlN0ZXBzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSw1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TdGVwczwvTklDSz4KKzxCTFVSQj5TdGVwcy48L0JMVVJCPgorPERFRkFVTFQ+NTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0wPC9OSUNLPgorPEJMVVJCPlZhbHVlLTAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0xPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTEwPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTEwPC9OSUNLPgorPEJMVVJCPlZhbHVlLTEwLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0xMjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0xMjwvTklDSz4KKzxCTFVSQj5WYWx1ZS0xMi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTEzPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTEzPC9OSUNLPgorPEJMVVJCPlZhbHVlLTEzLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMTQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0xNTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0xNTwvTklDSz4KKzxCTFVSQj5WYWx1ZS0xNS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTE2PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTE2PC9OSUNLPgorPEJMVVJCPlZhbHVlLTE2LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMTc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0xODwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0xODwvTklDSz4KKzxCTFVSQj5WYWx1ZS0xOC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTE5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTE5PC9OSUNLPgorPEJMVVJCPlZhbHVlLTE5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0yPC9OSUNLPgorPEJMVVJCPlZhbHVlLTIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0yMDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0yMDwvTklDSz4KKzxCTFVSQj5WYWx1ZS0yMC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTIxPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTIxPC9OSUNLPgorPEJMVVJCPlZhbHVlLTIxLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMjI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0yMzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0yMzwvTklDSz4KKzxCTFVSQj5WYWx1ZS0yMy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTI0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTI0PC9OSUNLPgorPEJMVVJCPlZhbHVlLTI0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMjU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0yNjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0yNjwvTklDSz4KKzxCTFVSQj5WYWx1ZS0yNi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTI3PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTI3PC9OSUNLPgorPEJMVVJCPlZhbHVlLTI3LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMjg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0yOTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0yOTwvTklDSz4KKzxCTFVSQj5WYWx1ZS0yOS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzwvTklDSz4KKzxCTFVSQj5WYWx1ZS0zLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMzA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0zMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0zMTwvTklDSz4KKzxCTFVSQj5WYWx1ZS0zMS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTMyPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTMyPC9OSUNLPgorPEJMVVJCPlZhbHVlLTMyLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMzM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0zNDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0zNDwvTklDSz4KKzxCTFVSQj5WYWx1ZS0zNC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTM1PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTM1PC9OSUNLPgorPEJMVVJCPlZhbHVlLTM1LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMzY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS0zNzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0zNzwvTklDSz4KKzxCTFVSQj5WYWx1ZS0zNy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTM4PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTM4PC9OSUNLPgorPEJMVVJCPlZhbHVlLTM4LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtMzk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS00PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTQwPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTQwPC9OSUNLPgorPEJMVVJCPlZhbHVlLTQwLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtNDE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS00MjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS00MjwvTklDSz4KKzxCTFVSQj5WYWx1ZS00Mi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTQzPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTQzPC9OSUNLPgorPEJMVVJCPlZhbHVlLTQzLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtNDQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS00NTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS00NTwvTklDSz4KKzxCTFVSQj5WYWx1ZS00NS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTQ2PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTQ2PC9OSUNLPgorPEJMVVJCPlZhbHVlLTQ2LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtNDc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS00ODwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS00ODwvTklDSz4KKzxCTFVSQj5WYWx1ZS00OC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTQ5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTQ5PC9OSUNLPgorPEJMVVJCPlZhbHVlLTQ5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtNTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS01PC9OSUNLPgorPEJMVVJCPlZhbHVlLTUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS02PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyNTA6OlZhbHVlLTc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzwvTklDSz4KKzxCTFVSQj5WYWx1ZS03LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXI1MDo6VmFsdWUtODwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS04PC9OSUNLPgorPEJMVVJCPlZhbHVlLTguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjUwOjpWYWx1ZS05PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGxhdGU6OkRhbXBpbmc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EYW1waW5nPC9OSUNLPgorPEJMVVJCPkRhbXBpbmcuPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1wbGF0ZTo6RHJ5LXdldC1taXg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Ecnktd2V0LW1peDwvTklDSz4KKzxCTFVSQj5Ecnktd2V0LW1peC48L0JMVVJCPgorPERFRkFVTFQ+MCwyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBsYXRlOjpSZXZlcmItdGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4LDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmV2ZXJiLXRpbWU8L05JQ0s+Cis8QkxVUkI+UmV2ZXJiLXRpbWUuPC9CTFVSQj4KKzxERUZBVUxUPjQsMjU1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGlvZGU6Ok1vZGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsM108L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPk1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIxMDA6Ok1hdGNoLVJhbmdlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NYXRjaC1SYW5nZTwvTklDSz4KKzxCTFVSQj5NYXRjaC1SYW5nZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6TW9kZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPk1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIxMDA6OlF1YW50aXNlLVJhbmdlLU1heGltdW08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UXVhbnRpc2UtUmFuZ2UtTWF4aW11bTwvTklDSz4KKzxCTFVSQj5RdWFudGlzZS1SYW5nZS1NYXhpbXVtLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIxMDA6OlF1YW50aXNlLVJhbmdlLU1pbmltdW08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UXVhbnRpc2UtUmFuZ2UtTWluaW11bTwvTklDSz4KKzxCTFVSQj5RdWFudGlzZS1SYW5nZS1NaW5pbXVtLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIxMDA6OlN0ZXBzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSwxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3RlcHM8L05JQ0s+Cis8QkxVUkI+U3RlcHMuPC9CTFVSQj4KKzxERUZBVUxUPjEwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0wPC9OSUNLPgorPEJMVVJCPlZhbHVlLTAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0xPC9OSUNLPgorPEJMVVJCPlZhbHVlLTEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMTk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0yPC9OSUNLPgorPEJMVVJCPlZhbHVlLTIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMjk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMjkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0zPC9OSUNLPgorPEJMVVJCPlZhbHVlLTMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtMzk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMzk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMzkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS00PC9OSUNLPgorPEJMVVJCPlZhbHVlLTQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNDk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNDk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNDkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS01PC9OSUNLPgorPEJMVVJCPlZhbHVlLTUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNTk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNTkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS02PC9OSUNLPgorPEJMVVJCPlZhbHVlLTYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNjk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNjk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNjkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS03PC9OSUNLPgorPEJMVVJCPlZhbHVlLTcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtNzk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNzk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNzkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS04PC9OSUNLPgorPEJMVVJCPlZhbHVlLTguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtODk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtODkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS05PC9OSUNLPgorPEJMVVJCPlZhbHVlLTkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjEwMDo6VmFsdWUtOTk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtOTk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtOTkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC10dWJld2FybXRoOjpEcml2ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRyaXZlPC9OSUNLPgorPEJMVVJCPkRyaXZlLjwvQkxVUkI+Cis8REVGQVVMVD4yLDU3NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC10dWJld2FybXRoOjpUYXBlLS1UdWJlLUJsZW5kPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMTAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGFwZS0tVHViZS1CbGVuZDwvTklDSz4KKzxCTFVSQj5UYXBlLS1UdWJlLUJsZW5kLjwvQkxVUkI+Cis8REVGQVVMVD4xMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1yZXNscDo6RnJlcXVlbmN5LU9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMjAsMjAwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LU9mZnNldDwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3ktT2Zmc2V0LjwvQkxVUkI+Cis8REVGQVVMVD4yMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1yZXNscDo6RnJlcXVlbmN5LVBpdGNoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMiwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS1QaXRjaDwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3ktUGl0Y2guPC9CTFVSQj4KKzxERUZBVUxUPi0yPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLXJlc2xwOjpHYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+R2FpbjwvTklDSz4KKzxCTFVSQj5HYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLXJlc2xwOjpSZXNvbmFuY2UtT2Zmc2V0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc29uYW5jZS1PZmZzZXQ8L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLU9mZnNldC48L0JMVVJCPgorPERFRkFVTFQ+MCwwMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtbHA6OkZyZXF1ZW5jeS1PZmZzZXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIwLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS1PZmZzZXQ8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LU9mZnNldC48L0JMVVJCPgorPERFRkFVTFQ+MjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtbHA6OkZyZXF1ZW5jeS1QaXRjaDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3ktUGl0Y2g8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LVBpdGNoLjwvQkxVUkI+Cis8REVGQVVMVD4tMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1scDo6R2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkdhaW48L05JQ0s+Cis8QkxVUkI+R2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1scDo6UmVzb25hbmNlLU9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2UtT2Zmc2V0PC9OSUNLPgorPEJMVVJCPlJlc29uYW5jZS1PZmZzZXQuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLWhwOjpGcmVxdWVuY3ktT2Zmc2V0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyMCwyMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3ktT2Zmc2V0PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS1PZmZzZXQuPC9CTFVSQj4KKzxERUZBVUxUPjIwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLWhwOjpGcmVxdWVuY3ktUGl0Y2g8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LVBpdGNoPC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS1QaXRjaC48L0JMVVJCPgorPERFRkFVTFQ+LTI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtaHA6OkdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5HYWluPC9OSUNLPgorPEJMVVJCPkdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtaHA6OlJlc29uYW5jZS1PZmZzZXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAxLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzb25hbmNlLU9mZnNldDwvTklDSz4KKzxCTFVSQj5SZXNvbmFuY2UtT2Zmc2V0LjwvQkxVUkI+Cis8REVGQVVMVD4wLDAwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1icDE6OkZyZXF1ZW5jeS1PZmZzZXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIwLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS1PZmZzZXQ8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LU9mZnNldC48L0JMVVJCPgorPERFRkFVTFQ+MjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtYnAxOjpGcmVxdWVuY3ktUGl0Y2g8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LVBpdGNoPC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS1QaXRjaC48L0JMVVJCPgorPERFRkFVTFQ+LTI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtYnAxOjpHYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+R2FpbjwvTklDSz4KKzxCTFVSQj5HYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLWJwMTo6UmVzb25hbmNlLU9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2UtT2Zmc2V0PC9OSUNLPgorPEJMVVJCPlJlc29uYW5jZS1PZmZzZXQuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLWJwMjo6RnJlcXVlbmN5LU9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMjAsMjAwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LU9mZnNldDwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3ktT2Zmc2V0LjwvQkxVUkI+Cis8REVGQVVMVD4yMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1icDI6OkZyZXF1ZW5jeS1QaXRjaDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3ktUGl0Y2g8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LVBpdGNoLjwvQkxVUkI+Cis8REVGQVVMVD4tMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1icDI6OkdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5HYWluPC9OSUNLPgorPEJMVVJCPkdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtYnAyOjpSZXNvbmFuY2UtT2Zmc2V0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc29uYW5jZS1PZmZzZXQ8L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLU9mZnNldC48L0JMVVJCPgorPERFRkFVTFQ+MCwwMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2Ytbm90Y2g6OkZyZXF1ZW5jeS1PZmZzZXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIwLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS1PZmZzZXQ8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LU9mZnNldC48L0JMVVJCPgorPERFRkFVTFQ+MjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2Ytbm90Y2g6OkZyZXF1ZW5jeS1QaXRjaDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3ktUGl0Y2g8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LVBpdGNoLjwvQkxVUkI+Cis8REVGQVVMVD4tMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1ub3RjaDo6R2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkdhaW48L05JQ0s+Cis8QkxVUkI+R2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1ub3RjaDo6UmVzb25hbmNlLU9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2UtT2Zmc2V0PC9OSUNLPgorPEJMVVJCPlJlc29uYW5jZS1PZmZzZXQuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLXBlYWtlcTo6RnJlcXVlbmN5LU9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMjAsMjAwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LU9mZnNldDwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3ktT2Zmc2V0LjwvQkxVUkI+Cis8REVGQVVMVD4yMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1wZWFrZXE6OkZyZXF1ZW5jeS1QaXRjaDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3ktUGl0Y2g8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LVBpdGNoLjwvQkxVUkI+Cis8REVGQVVMVD4tMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1wZWFrZXE6OkdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5HYWluPC9OSUNLPgorPEJMVVJCPkdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtcGVha2VxOjpSZXNvbmFuY2UtT2Zmc2V0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc29uYW5jZS1PZmZzZXQ8L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLU9mZnNldC48L0JMVVJCPgorPERFRkFVTFQ+MCwwMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtcGVha2VxOjpkQmdhaW4tT2Zmc2V0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls2LDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmRCZ2Fpbi1PZmZzZXQ8L05JQ0s+Cis8QkxVUkI+ZEJnYWluLU9mZnNldC48L0JMVVJCPgorPERFRkFVTFQ+NjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1sc2hlbGY6OkZyZXF1ZW5jeS1PZmZzZXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIwLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS1PZmZzZXQ8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LU9mZnNldC48L0JMVVJCPgorPERFRkFVTFQ+MjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtbHNoZWxmOjpGcmVxdWVuY3ktUGl0Y2g8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LVBpdGNoPC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS1QaXRjaC48L0JMVVJCPgorPERFRkFVTFQ+LTI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtbHNoZWxmOjpHYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+R2FpbjwvTklDSz4KKzxCTFVSQj5HYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLWxzaGVsZjo6UmVzb25hbmNlLU9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2UtT2Zmc2V0PC9OSUNLPgorPEJMVVJCPlJlc29uYW5jZS1PZmZzZXQuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLWxzaGVsZjo6ZEJnYWluLU9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNiwyNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kQmdhaW4tT2Zmc2V0PC9OSUNLPgorPEJMVVJCPmRCZ2Fpbi1PZmZzZXQuPC9CTFVSQj4KKzxERUZBVUxUPjY8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12Y2YtaHNoZWxmOjpGcmVxdWVuY3ktT2Zmc2V0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyMCwyMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3ktT2Zmc2V0PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS1PZmZzZXQuPC9CTFVSQj4KKzxERUZBVUxUPjIwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLWhzaGVsZjo6RnJlcXVlbmN5LVBpdGNoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMiwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS1QaXRjaDwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3ktUGl0Y2guPC9CTFVSQj4KKzxERUZBVUxUPi0yPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmLWhzaGVsZjo6R2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkdhaW48L05JQ0s+Cis8QkxVUkI+R2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1oc2hlbGY6OlJlc29uYW5jZS1PZmZzZXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAxLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzb25hbmNlLU9mZnNldDwvTklDSz4KKzxCTFVSQj5SZXNvbmFuY2UtT2Zmc2V0LjwvQkxVUkI+Cis8REVGQVVMVD4wLDAwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZjZi1oc2hlbGY6OmRCZ2Fpbi1PZmZzZXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzYsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZEJnYWluLU9mZnNldDwvTklDSz4KKzxCTFVSQj5kQmdhaW4tT2Zmc2V0LjwvQkxVUkI+Cis8REVGQVVMVD42PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2F0YW5NYXhpbWlzZXI6OkRlY2F5LXRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVjYXktdGltZTwvTklDSz4KKzxCTFVSQj5EZWNheS10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD4zMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNhdGFuTWF4aW1pc2VyOjpLbmVlLXBvaW50PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5LbmVlLXBvaW50PC9OSUNLPgorPEJMVVJCPktuZWUtcG9pbnQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zeW5jcHVsc2UtZmNwY2dhLW9hOjpGcmVxdWVuejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw2NF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuejwvTklDSz4KKzxCTFVSQj5GcmVxdWVuei48L0JMVVJCPgorPERFRkFVTFQ+MTY8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zeW5jcHVsc2UtZmNwY2dhLW9hOjpQdWxzZS1XaWR0aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlB1bHNlLVdpZHRoPC9OSUNLPgorPEJMVVJCPlB1bHNlLVdpZHRoLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmFuc2llbnQ6OkF0dGFjay1zcGVlZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdHRhY2stc3BlZWQ8L05JQ0s+Cis8QkxVUkI+QXR0YWNrLXNwZWVkLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJhbnNpZW50OjpTdXN0YWluLXRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3VzdGFpbi10aW1lPC9OSUNLPgorPEJMVVJCPlN1c3RhaW4tdGltZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjMzo6QXR0YWNrLXRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIsNDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkF0dGFjay10aW1lPC9OSUNLPgorPEJMVVJCPkF0dGFjay10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD4xMDEsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjMzo6Q2hhaW4tYmFsYW5jZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkNoYWluLWJhbGFuY2U8L05JQ0s+Cis8QkxVUkI+Q2hhaW4tYmFsYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjMzo6S25lZS1yYWRpdXM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+S25lZS1yYWRpdXM8L05JQ0s+Cis8QkxVUkI+S25lZS1yYWRpdXMuPC9CTFVSQj4KKzxERUZBVUxUPjMsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzM6Ok1ha2V1cC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1ha2V1cC1nYWluPC9OSUNLPgorPEJMVVJCPk1ha2V1cC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2MzOjpSYXRpbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SYXRpbzwvTklDSz4KKzxCTFVSQj5SYXRpby48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjMzo6UmVsZWFzZS10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyLDgwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWxlYXNlLXRpbWU8L05JQ0s+Cis8QkxVUkI+UmVsZWFzZS10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD40MDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzM6OlRocmVzaG9sZC1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTMwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGhyZXNob2xkLWxldmVsPC9OSUNLPgorPEJMVVJCPlRocmVzaG9sZC1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1zaWdtb2lkOjpQb3N0LUdhaW4tLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTkwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlBvc3QtR2Fpbi0tZEItPC9OSUNLPgorPEJMVVJCPlBvc3QtR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXNpZ21vaWQ6OlByZS1HYWluLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy05MCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5QcmUtR2Fpbi0tZEItPC9OSUNLPgorPEJMVVJCPlByZS1HYWluLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbmFsb2d1ZU9zYzo6RnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDA0NDEsMjIwMDUsOV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD40NDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbmFsb2d1ZU9zYzo6SW5zdGFiaWxpdHk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5JbnN0YWJpbGl0eTwvTklDSz4KKzxCTFVSQj5JbnN0YWJpbGl0eS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlT3NjOjpXYXJtdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5XYXJtdGg8L05JQ0s+Cis8QkxVUkI+V2FybXRoLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWVPc2M6OldhdmVmb3JtPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldhdmVmb3JtPC9OSUNLPgorPEJMVVJCPldhdmVmb3JtLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYWRzcjo6QWJrbGluZ3plaXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFia2xpbmd6ZWl0PC9OSUNLPgorPEJMVVJCPkFia2xpbmd6ZWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYWRzcjo6QXVza2xpbmd6ZWl0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdXNrbGluZ3plaXQ8L05JQ0s+Cis8QkxVUkI+QXVza2xpbmd6ZWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYWRzcjo6RWluc2Nod2luZ3plaXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkVpbnNjaHdpbmd6ZWl0PC9OSUNLPgorPEJMVVJCPkVpbnNjaHdpbmd6ZWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYWRzcjo6SGFsdGV3ZXJ0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SGFsdGV3ZXJ0PC9OSUNLPgorPEJMVVJCPkhhbHRld2VydC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFkc3I6OlRyaWdnZXItVGhyZXNob2xkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRyaWdnZXItVGhyZXNob2xkPC9OSUNLPgorPEJMVVJCPlRyaWdnZXItVGhyZXNob2xkLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zaWZ0ZXI6OlNpZnQtc2l6ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwxMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNpZnQtc2l6ZTwvTklDSz4KKzxCTFVSQj5TaWZ0LXNpemUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hZHNyLWcrdDo6QWJrbGluZ3plaXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFia2xpbmd6ZWl0PC9OSUNLPgorPEJMVVJCPkFia2xpbmd6ZWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYWRzci1nK3Q6OkF1c2tsaW5nemVpdDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QXVza2xpbmd6ZWl0PC9OSUNLPgorPEJMVVJCPkF1c2tsaW5nemVpdC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFkc3ItZyt0OjpFaW5zY2h3aW5nemVpdDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RWluc2Nod2luZ3plaXQ8L05JQ0s+Cis8QkxVUkI+RWluc2Nod2luZ3plaXQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hZHNyLWcrdDo6SGFsdGV3ZXJ0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SGFsdGV3ZXJ0PC9OSUNLPgorPEJMVVJCPkhhbHRld2VydC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXJhdGlvLW5hZGMtb2E6OkRlbm9taW5hdG9yPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbm9taW5hdG9yPC9OSUNLPgorPEJMVVJCPkRlbm9taW5hdG9yLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1yYXRpby1uY2RhLW9hOjpOdW1lcmF0b3I8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TnVtZXJhdG9yPC9OSUNLPgorPEJMVVJCPk51bWVyYXRvci48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmF0aW8tbmNkYy1vYzo6RGVub21pbmF0b3I8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVub21pbmF0b3I8L05JQ0s+Cis8QkxVUkI+RGVub21pbmF0b3IuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXJhdGlvLW5jZGMtb2M6Ok51bWVyYXRvcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5OdW1lcmF0b3I8L05JQ0s+Cis8QkxVUkI+TnVtZXJhdG9yLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1yYXRpby1uY2RjLW9jOjpSYXRpby1PdXRwdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPlJhdGlvLU91dHB1dDwvTklDSz4KKzxCTFVSQj5SYXRpby1PdXRwdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdpYW50RmxhbmdlOjpEZWxheS0xLXJhbmdlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktMS1yYW5nZTwvTklDSz4KKzxCTFVSQj5EZWxheS0xLXJhbmdlLjwvQkxVUkI+Cis8REVGQVVMVD4yLDYyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdpYW50RmxhbmdlOjpEZWxheS0yLXJhbmdlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktMi1yYW5nZTwvTklDSz4KKzxCTFVSQj5EZWxheS0yLXJhbmdlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ2lhbnRGbGFuZ2U6OkRvdWJsZS1kZWxheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Eb3VibGUtZGVsYXk8L05JQ0s+Cis8QkxVUkI+RG91YmxlLWRlbGF5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1naWFudEZsYW5nZTo6RHJ5LVdldC1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRyeS1XZXQtbGV2ZWw8L05JQ0s+Cis8QkxVUkI+RHJ5LVdldC1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdpYW50RmxhbmdlOjpGZWVkYmFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEwMCwxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1naWFudEZsYW5nZTo6TEZPLWZyZXF1ZW5jeS0xPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxGTy1mcmVxdWVuY3ktMTwvTklDSz4KKzxCTFVSQj5MRk8tZnJlcXVlbmN5LTEuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1naWFudEZsYW5nZTo6TEZPLWZyZXF1ZW5jeS0yPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxGTy1mcmVxdWVuY3ktMjwvTklDSz4KKzxCTFVSQj5MRk8tZnJlcXVlbmN5LTIuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zdmY6OkZpbHRlci1RPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdGVyLVE8L05JQ0s+Cis8QkxVUkI+RmlsdGVyLVEuPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zdmY6OkZpbHRlci1mcmVxPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDYwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdGVyLWZyZXE8L05JQ0s+Cis8QkxVUkI+RmlsdGVyLWZyZXEuPC9CTFVSQj4KKzxERUZBVUxUPjQ0MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXN2Zjo6RmlsdGVyLXJlc29uYW5jZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHRlci1yZXNvbmFuY2U8L05JQ0s+Cis8QkxVUkI+RmlsdGVyLXJlc29uYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXN2Zjo6RmlsdGVyLXR5cGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdGVyLXR5cGU8L05JQ0s+Cis8QkxVUkI+RmlsdGVyLXR5cGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1scDRwb2xlLWZjcmNpYS1vYTo6Q3V0b2ZmLUZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw5MTg3NSwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DdXRvZmYtRnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkN1dG9mZi1GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjIyMDUwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbHA0cG9sZS1mY3JjaWEtb2E6OlJlc29uYW56PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzb25hbno8L05JQ0s+Cis8QkxVUkI+UmVzb25hbnouPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcGl0Y2g6OkRyeS1MZXZlbC0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LUxldmVsLS1kQi08L05JQ0s+Cis8QkxVUkI+RHJ5LUxldmVsLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPi05MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1waXRjaDo6UmF0ZS1TaGlmdC0tLS08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy01MCwxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmF0ZS1TaGlmdC0tLS08L05JQ0s+Cis8QkxVUkI+UmF0ZS1TaGlmdC0tLS0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcGl0Y2g6OlNlbWl0b25lLVNoaWZ0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMTIsMTJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U2VtaXRvbmUtU2hpZnQ8L05JQ0s+Cis8QkxVUkI+U2VtaXRvbmUtU2hpZnQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcGl0Y2g6OldldC1MZXZlbC0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+V2V0LUxldmVsLS1kQi08L05JQ0s+Cis8QkxVUkI+V2V0LUxldmVsLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcGl0Y2g6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTYwMjddPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmxhdGVuY3k8L05JQ0s+Cis8QkxVUkI+bGF0ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MTYwMjc8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zcXVhcmUtZmMtb2E6OkZyZXF1ZW56PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDkxODc1LDIyMDUwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW56PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW56LjwvQkxVUkI+Cis8REVGQVVMVD40NDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1iYW5kcGFzcy1hLWlpcjo6QmFuZHdpZHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0LDQxLDE5ODQ1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmR3aWR0aDwvTklDSz4KKzxCTFVSQj5CYW5kd2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjI5NSw4MzI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1iYW5kcGFzcy1hLWlpcjo6Q2VudGVyLUZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNCw0MSwxOTg0NV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DZW50ZXItRnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkNlbnRlci1GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjM2LDExOTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbXAtbW9ubzo6R2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+R2FpbjwvTklDSz4KKzxCTFVSQj5HYWluLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW1wLXN0ZXJlbzo6R2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+R2FpbjwvTklDSz4KKzxCTFVSQj5HYWluLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmluZ21vZC0yaTFvOjpNb2R1bGF0aW9uLWRlcHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kdWxhdGlvbi1kZXB0aDwvTklDSz4KKzxCTFVSQj5Nb2R1bGF0aW9uLWRlcHRoLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmluZ21vZC0xaTFvMWw6OkZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwxMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjQ0MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXJpbmdtb2QtMWkxbzFsOjpNb2R1bGF0aW9uLWRlcHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kdWxhdGlvbi1kZXB0aDwvTklDSz4KKzxCTFVSQj5Nb2R1bGF0aW9uLWRlcHRoLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmluZ21vZC0xaTFvMWw6OlNhd3Rvb3RoLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNhd3Rvb3RoLWxldmVsPC9OSUNLPgorPEJMVVJCPlNhd3Rvb3RoLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmluZ21vZC0xaTFvMWw6OlNpbmUtbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U2luZS1sZXZlbDwvTklDSz4KKzxCTFVSQj5TaW5lLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmluZ21vZC0xaTFvMWw6OlNxdWFyZS1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TcXVhcmUtbGV2ZWw8L05JQ0s+Cis8QkxVUkI+U3F1YXJlLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmluZ21vZC0xaTFvMWw6OlRyaWFuZ2xlLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRyaWFuZ2xlLWxldmVsPC9OSUNLPgorPEJMVVJCPlRyaWFuZ2xlLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXktbjo6RGVsYXktVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktVGltZTwvTklDSz4KKzxCTFVSQj5EZWxheS1UaW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXktbjo6TWF4LURlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NYXgtRGVsYXk8L05JQ0s+Cis8QkxVUkI+TWF4LURlbGF5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXktbDo6RGVsYXktVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktVGltZTwvTklDSz4KKzxCTFVSQj5EZWxheS1UaW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXktbDo6TWF4LURlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NYXgtRGVsYXk8L05JQ0s+Cis8QkxVUkI+TWF4LURlbGF5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXktYzo6RGVsYXktVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktVGltZTwvTklDSz4KKzxCTFVSQj5EZWxheS1UaW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXktYzo6TWF4LURlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NYXgtRGVsYXk8L05JQ0s+Cis8QkxVUkI+TWF4LURlbGF5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm1vZC1mYW1jLW9hOjpNb2R1bGF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1vZHVsYXRpb248L05JQ0s+Cis8QkxVUkI+TW9kdWxhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm1vZC1mY21hLW9hOjpGcmVxdWVuejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw5MTg3NSwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuejwvTklDSz4KKzxCTFVSQj5GcmVxdWVuei48L0JMVVJCPgorPERFRkFVTFQ+NDQwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm1vZC1mY21jLW9jOjpGcmVxdWVuejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw5MTg3NSwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuejwvTklDSz4KKzxCTFVSQj5GcmVxdWVuei48L0JMVVJCPgorPERFRkFVTFQ+NDQwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm1vZC1mY21jLW9jOjpNb2R1bGF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1vZHVsYXRpb248L05JQ0s+Cis8QkxVUkI+TW9kdWxhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm1vZC1mY21jLW9jOjpNb2R1bGllcnRlLUZyZXF1ZW56PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5Nb2R1bGllcnRlLUZyZXF1ZW56PC9OSUNLPgorPEJMVVJCPk1vZHVsaWVydGUtRnJlcXVlbnouPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWd2ZXJiOjpEYW1waW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGFtcGluZzwvTklDSz4KKzxCTFVSQj5EYW1waW5nLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1ndmVyYjo6RHJ5LXNpZ25hbC1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LXNpZ25hbC1sZXZlbDwvTklDSz4KKzxCTFVSQj5Ecnktc2lnbmFsLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4tNzA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1ndmVyYjo6RWFybHktcmVmbGVjdGlvbi1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RWFybHktcmVmbGVjdGlvbi1sZXZlbDwvTklDSz4KKzxCTFVSQj5FYXJseS1yZWZsZWN0aW9uLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ3ZlcmI6OklucHV0LWJhbmR3aWR0aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklucHV0LWJhbmR3aWR0aDwvTklDSz4KKzxCTFVSQj5JbnB1dC1iYW5kd2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjAsNzU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1ndmVyYjo6UmV2ZXJiLXRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMSwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXZlcmItdGltZTwvTklDSz4KKzxCTFVSQj5SZXZlcmItdGltZS48L0JMVVJCPgorPERFRkFVTFQ+Nyw1NzU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1ndmVyYjo6Um9vbXNpemU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEsMzAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJvb21zaXplPC9OSUNLPgorPEJMVVJCPlJvb21zaXplLjwvQkxVUkI+Cis8REVGQVVMVD43NSw3NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWd2ZXJiOjpUYWlsLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UYWlsLWxldmVsPC9OSUNLPgorPEJMVVJCPlRhaWwtbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPi0xNyw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2U0OjpBbXBsaXR1ZGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy00MCwxMl08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+QW1wbGl0dWRlPC9OSUNLPgorPEJMVVJCPkFtcGxpdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+LTQwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2U0OjpBdHRhY2stdGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSw1LDQwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdHRhY2stdGltZTwvTklDSz4KKzxCTFVSQj5BdHRhY2stdGltZS48L0JMVVJCPgorPERFRkFVTFQ+MTAxLDEyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlNDo6QXR0ZW51YXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yNCwwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkF0dGVudWF0aW9uPC9OSUNLPgorPEJMVVJCPkF0dGVudWF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2U0OjpHYWluLWV4cGFuc2lvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyNF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+R2Fpbi1leHBhbnNpb248L05JQ0s+Cis8QkxVUkI+R2Fpbi1leHBhbnNpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZTQ6OktuZWUtcmFkaXVzPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPktuZWUtcmFkaXVzPC9OSUNLPgorPEJMVVJCPktuZWUtcmFkaXVzLjwvQkxVUkI+Cis8REVGQVVMVD4zLDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2U0OjpSTVMtcGVhazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJNUy1wZWFrPC9OSUNLPgorPEJMVVJCPlJNUy1wZWFrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2U0OjpSYXRpbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SYXRpbzwvTklDSz4KKzxCTFVSQj5SYXRpby48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlNDo6UmVsZWFzZS10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyLDgwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWxlYXNlLXRpbWU8L05JQ0s+Cis8QkxVUkI+UmVsZWFzZS10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD40MDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZTQ6OlRocmVzaG9sZC1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTMwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGhyZXNob2xkLWxldmVsPC9OSUNLPgorPEJMVVJCPlRocmVzaG9sZC1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLWRhbXBpbmc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Jbm5lci1kYW1waW5nPC9OSUNLPgorPEJMVVJCPklubmVyLWRhbXBpbmcuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXNpemUtMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklubmVyLXNpemUtMTwvTklDSz4KKzxCTFVSQj5Jbm5lci1zaXplLTEuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXNpemUtMjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklubmVyLXNpemUtMjwvTklDSz4KKzxCTFVSQj5Jbm5lci1zaXplLTIuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXNpemUtMzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklubmVyLXNpemUtMzwvTklDSz4KKzxCTFVSQj5Jbm5lci1zaXplLTMuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXNpemUtNDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklubmVyLXNpemUtNDwvTklDSz4KKzxCTFVSQj5Jbm5lci1zaXplLTQuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXN0aWZmbmVzcy0xLS08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Jbm5lci1zdGlmZm5lc3MtMS0tPC9OSUNLPgorPEJMVVJCPklubmVyLXN0aWZmbmVzcy0xLS0uPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXN0aWZmbmVzcy0xLS0tMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklubmVyLXN0aWZmbmVzcy0xLS0tMTwvTklDSz4KKzxCTFVSQj5Jbm5lci1zdGlmZm5lc3MtMS0tLTEuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXN0aWZmbmVzcy0yLS08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Jbm5lci1zdGlmZm5lc3MtMi0tPC9OSUNLPgorPEJMVVJCPklubmVyLXN0aWZmbmVzcy0yLS0uPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXN0aWZmbmVzcy0yLS0tMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklubmVyLXN0aWZmbmVzcy0yLS0tMTwvTklDSz4KKzxCTFVSQj5Jbm5lci1zdGlmZm5lc3MtMi0tLTEuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXN0aWZmbmVzcy0zLS08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Jbm5lci1zdGlmZm5lc3MtMy0tPC9OSUNLPgorPEJMVVJCPklubmVyLXN0aWZmbmVzcy0zLS0uPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXN0aWZmbmVzcy0zLS0tMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklubmVyLXN0aWZmbmVzcy0zLS0tMTwvTklDSz4KKzxCTFVSQj5Jbm5lci1zdGlmZm5lc3MtMy0tLTEuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXN0aWZmbmVzcy00LS08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Jbm5lci1zdGlmZm5lc3MtNC0tPC9OSUNLPgorPEJMVVJCPklubmVyLXN0aWZmbmVzcy00LS0uPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6OklubmVyLXN0aWZmbmVzcy00LS0tMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklubmVyLXN0aWZmbmVzcy00LS0tMTwvTklDSz4KKzxCTFVSQj5Jbm5lci1zdGlmZm5lc3MtNC0tLTEuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdvbmc6Ok1pYy1wb3NpdGlvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1pYy1wb3NpdGlvbjwvTklDSz4KKzxCTFVSQj5NaWMtcG9zaXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1kYW1waW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0ZXItZGFtcGluZzwvTklDSz4KKzxCTFVSQj5PdXRlci1kYW1waW5nLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zaXplLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRlci1zaXplLTE8L05JQ0s+Cis8QkxVUkI+T3V0ZXItc2l6ZS0xLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zaXplLTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRlci1zaXplLTI8L05JQ0s+Cis8QkxVUkI+T3V0ZXItc2l6ZS0yLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zaXplLTM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRlci1zaXplLTM8L05JQ0s+Cis8QkxVUkI+T3V0ZXItc2l6ZS0zLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zaXplLTQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRlci1zaXplLTQ8L05JQ0s+Cis8QkxVUkI+T3V0ZXItc2l6ZS00LjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zdGlmZm5lc3MtMS0tPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0ZXItc3RpZmZuZXNzLTEtLTwvTklDSz4KKzxCTFVSQj5PdXRlci1zdGlmZm5lc3MtMS0tLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zdGlmZm5lc3MtMS0tLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRlci1zdGlmZm5lc3MtMS0tLTE8L05JQ0s+Cis8QkxVUkI+T3V0ZXItc3RpZmZuZXNzLTEtLS0xLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zdGlmZm5lc3MtMi0tPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0ZXItc3RpZmZuZXNzLTItLTwvTklDSz4KKzxCTFVSQj5PdXRlci1zdGlmZm5lc3MtMi0tLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zdGlmZm5lc3MtMi0tLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRlci1zdGlmZm5lc3MtMi0tLTE8L05JQ0s+Cis8QkxVUkI+T3V0ZXItc3RpZmZuZXNzLTItLS0xLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zdGlmZm5lc3MtMy0tPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0ZXItc3RpZmZuZXNzLTMtLTwvTklDSz4KKzxCTFVSQj5PdXRlci1zdGlmZm5lc3MtMy0tLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zdGlmZm5lc3MtMy0tLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRlci1zdGlmZm5lc3MtMy0tLTE8L05JQ0s+Cis8QkxVUkI+T3V0ZXItc3RpZmZuZXNzLTMtLS0xLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zdGlmZm5lc3MtNC0tPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0ZXItc3RpZmZuZXNzLTQtLTwvTklDSz4KKzxCTFVSQj5PdXRlci1zdGlmZm5lc3MtNC0tLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nb25nOjpPdXRlci1zdGlmZm5lc3MtNC0tLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRlci1zdGlmZm5lc3MtNC0tLTE8L05JQ0s+Cis8QkxVUkI+T3V0ZXItc3RpZmZuZXNzLTQtLS0xLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1lbmNvZGUtYmZvcm1hdDo6U291bmQtU291cmNlLVgtQ29vcmRpbmF0ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Tb3VuZC1Tb3VyY2UtWC1Db29yZGluYXRlPC9OSUNLPgorPEJMVVJCPlNvdW5kLVNvdXJjZS1YLUNvb3JkaW5hdGUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1lbmNvZGUtYmZvcm1hdDo6U291bmQtU291cmNlLVktQ29vcmRpbmF0ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Tb3VuZC1Tb3VyY2UtWS1Db29yZGluYXRlPC9OSUNLPgorPEJMVVJCPlNvdW5kLVNvdXJjZS1ZLUNvb3JkaW5hdGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1lbmNvZGUtYmZvcm1hdDo6U291bmQtU291cmNlLVotQ29vcmRpbmF0ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Tb3VuZC1Tb3VyY2UtWi1Db29yZGluYXRlPC9OSUNLPgorPEJMVVJCPlNvdW5kLVNvdXJjZS1aLUNvb3JkaW5hdGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1lbmNvZGUtZm1oOjpTb3VuZC1Tb3VyY2UtWC1Db29yZGluYXRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNvdW5kLVNvdXJjZS1YLUNvb3JkaW5hdGU8L05JQ0s+Cis8QkxVUkI+U291bmQtU291cmNlLVgtQ29vcmRpbmF0ZS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWVuY29kZS1mbWg6OlNvdW5kLVNvdXJjZS1ZLUNvb3JkaW5hdGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U291bmQtU291cmNlLVktQ29vcmRpbmF0ZTwvTklDSz4KKzxCTFVSQj5Tb3VuZC1Tb3VyY2UtWS1Db29yZGluYXRlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZW5jb2RlLWZtaDo6U291bmQtU291cmNlLVotQ29vcmRpbmF0ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Tb3VuZC1Tb3VyY2UtWi1Db29yZGluYXRlPC9OSUNLPgorPEJMVVJCPlNvdW5kLVNvdXJjZS1aLUNvb3JkaW5hdGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1iZi1yb3RhdGUtejo6QW5nbGUtb2YtUm90YXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xODAsMTgwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFuZ2xlLW9mLVJvdGF0aW9uPC9OSUNLPgorPEJMVVJCPkFuZ2xlLW9mLVJvdGF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD45MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZtaC1yb3RhdGUtejo6QW5nbGUtb2YtUm90YXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xODAsMTgwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFuZ2xlLW9mLVJvdGF0aW9uPC9OSUNLPgorPEJMVVJCPkFuZ2xlLW9mLVJvdGF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD45MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpEQ08xLUF0dGFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzEtQXR0YWNrPC9OSUNLPgorPEJMVVJCPkRDTzEtQXR0YWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkRDTzEtRGVjYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08xLURlY2F5PC9OSUNLPgorPEJMVVJCPkRDTzEtRGVjYXkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbmFsb2d1ZTo6RENPMS1MRk8tRnJlcXVlbmN5LU1vZHVsYXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMS1MRk8tRnJlcXVlbmN5LU1vZHVsYXRpb248L05JQ0s+Cis8QkxVUkI+RENPMS1MRk8tRnJlcXVlbmN5LU1vZHVsYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPi0yPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkRDTzEtTEZPLVB1bHNlLVdpZHRoLU1vZHVsYXRpb248L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMS1MRk8tUHVsc2UtV2lkdGgtTW9kdWxhdGlvbjwvTklDSz4KKzxCTFVSQj5EQ08xLUxGTy1QdWxzZS1XaWR0aC1Nb2R1bGF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkRDTzEtT2N0YXZlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzEtT2N0YXZlPC9OSUNLPgorPEJMVVJCPkRDTzEtT2N0YXZlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpEQ08xLVJlbGVhc2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08xLVJlbGVhc2U8L05JQ0s+Cis8QkxVUkI+RENPMS1SZWxlYXNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkRDTzEtU3VzdGFpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzEtU3VzdGFpbjwvTklDSz4KKzxCTFVSQj5EQ08xLVN1c3RhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbmFsb2d1ZTo6RENPMS1XYXZlZm9ybTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08xLVdhdmVmb3JtPC9OSUNLPgorPEJMVVJCPkRDTzEtV2F2ZWZvcm0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbmFsb2d1ZTo6RENPMi1BdHRhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08yLUF0dGFjazwvTklDSz4KKzxCTFVSQj5EQ08yLUF0dGFjay48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpEQ08yLURlY2F5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMi1EZWNheTwvTklDSz4KKzxCTFVSQj5EQ08yLURlY2F5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkRDTzItTEZPLUZyZXF1ZW5jeS1Nb2R1bGF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMiwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzItTEZPLUZyZXF1ZW5jeS1Nb2R1bGF0aW9uPC9OSUNLPgorPEJMVVJCPkRDTzItTEZPLUZyZXF1ZW5jeS1Nb2R1bGF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4tMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpEQ08yLUxGTy1QdWxzZS1XaWR0aC1Nb2R1bGF0aW9uPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzItTEZPLVB1bHNlLVdpZHRoLU1vZHVsYXRpb248L05JQ0s+Cis8QkxVUkI+RENPMi1MRk8tUHVsc2UtV2lkdGgtTW9kdWxhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpEQ08yLU9jdGF2ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzItT2N0YXZlPC9OSUNLPgorPEJMVVJCPkRDTzItT2N0YXZlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkRDTzItUmVsZWFzZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzItUmVsZWFzZTwvTklDSz4KKzxCTFVSQj5EQ08yLVJlbGVhc2UuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbmFsb2d1ZTo6RENPMi1TdXN0YWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMi1TdXN0YWluPC9OSUNLPgorPEJMVVJCPkRDTzItU3VzdGFpbi48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpEQ08yLVdhdmVmb3JtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMi1XYXZlZm9ybTwvTklDSz4KKzxCTFVSQj5EQ08yLVdhdmVmb3JtLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkZpbHRlci1BdHRhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0ZXItQXR0YWNrPC9OSUNLPgorPEJMVVJCPkZpbHRlci1BdHRhY2suPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbmFsb2d1ZTo6RmlsdGVyLURlY2F5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdGVyLURlY2F5PC9OSUNLPgorPEJMVVJCPkZpbHRlci1EZWNheS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpGaWx0ZXItRW52ZWxvcGUtTW9kdWxhdGlvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0ZXItRW52ZWxvcGUtTW9kdWxhdGlvbjwvTklDSz4KKzxCTFVSQj5GaWx0ZXItRW52ZWxvcGUtTW9kdWxhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpGaWx0ZXItTEZPLU1vZHVsYXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0ZXItTEZPLU1vZHVsYXRpb248L05JQ0s+Cis8QkxVUkI+RmlsdGVyLUxGTy1Nb2R1bGF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkZpbHRlci1SZWxlYXNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdGVyLVJlbGVhc2U8L05JQ0s+Cis8QkxVUkI+RmlsdGVyLVJlbGVhc2UuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbmFsb2d1ZTo6RmlsdGVyLVJlc29uYW5jZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHRlci1SZXNvbmFuY2U8L05JQ0s+Cis8QkxVUkI+RmlsdGVyLVJlc29uYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpGaWx0ZXItU3VzdGFpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHRlci1TdXN0YWluPC9OSUNLPgorPEJMVVJCPkZpbHRlci1TdXN0YWluLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkdhdGU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5HYXRlPC9OSUNLPgorPEJMVVJCPkdhdGUuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW5hbG9ndWU6OkxGTy1GYWRlaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MRk8tRmFkZWluPC9OSUNLPgorPEJMVVJCPkxGTy1GYWRlaW4uPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbmFsb2d1ZTo6TEZPLUZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxGTy1GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+TEZPLUZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFuYWxvZ3VlOjpWZWxvY2l0eTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZlbG9jaXR5PC9OSUNLPgorPEJMVVJCPlZlbG9jaXR5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtY2FueW9uLWRlbGF5OjpMZWZ0LXRvLVJpZ2h0LUZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxlZnQtdG8tUmlnaHQtRmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+TGVmdC10by1SaWdodC1GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+LTE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jYW55b24tZGVsYXk6OkxlZnQtdG8tUmlnaHQtVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSwwLDk5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxlZnQtdG8tUmlnaHQtVGltZTwvTklDSz4KKzxCTFVSQj5MZWZ0LXRvLVJpZ2h0LVRpbWUuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jYW55b24tZGVsYXk6Okxvdy1QYXNzLUN1dG9mZjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSw1MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxvdy1QYXNzLUN1dG9mZjwvTklDSz4KKzxCTFVSQj5Mb3ctUGFzcy1DdXRvZmYuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jYW55b24tZGVsYXk6OlJpZ2h0LXRvLUxlZnQtRmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmlnaHQtdG8tTGVmdC1GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5SaWdodC10by1MZWZ0LUZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4tMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWNhbnlvbi1kZWxheTo6UmlnaHQtdG8tTGVmdC1UaW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDAsOTldPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmlnaHQtdG8tTGVmdC1UaW1lPC9OSUNLPgorPEJMVVJCPlJpZ2h0LXRvLUxlZnQtVGltZS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRpc2ludGVncmF0b3I6Ok11bHRpcGxpZXI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TXVsdGlwbGllcjwvTklDSz4KKzxCTFVSQj5NdWx0aXBsaWVyLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGlzaW50ZWdyYXRvcjo6UHJvYmFiaWxpdHk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Qcm9iYWJpbGl0eTwvTklDSz4KKzxCTFVSQj5Qcm9iYWJpbGl0eS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNsZWRnZWhhbW1lcjo6Q2Fycmllci1pbmZsdWVuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q2Fycmllci1pbmZsdWVuY2U8L05JQ0s+Cis8QkxVUkI+Q2Fycmllci1pbmZsdWVuY2UuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zbGVkZ2VoYW1tZXI6Ok1vZHVsYXRvci1pbmZsdWVuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kdWxhdG9yLWluZmx1ZW5jZTwvTklDSz4KKzxCTFVSQj5Nb2R1bGF0b3ItaW5mbHVlbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2xlZGdlaGFtbWVyOjpSYXRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxZS0wNSwwLDAwMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SYXRlPC9OSUNLPgorPEJMVVJCPlJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDAwNTA1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXktMC0wMXM6OkRlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAsMDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXk8L05JQ0s+Cis8QkxVUkI+RGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kZWxheS0wLTAxczo6RHJ5LVdldC1CYWxhbmNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LVdldC1CYWxhbmNlPC9OSUNLPgorPEJMVVJCPkRyeS1XZXQtQmFsYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXktMC0xczo6RGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbGF5PC9OSUNLPgorPEJMVVJCPkRlbGF5LjwvQkxVUkI+Cis8REVGQVVMVD4wLDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kZWxheS0wLTFzOjpEcnktV2V0LUJhbGFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktV2V0LUJhbGFuY2U8L05JQ0s+Cis8QkxVUkI+RHJ5LVdldC1CYWxhbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kZWxheS0xczo6RGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTwvTklDSz4KKzxCTFVSQj5EZWxheS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRlbGF5LTFzOjpEcnktV2V0LUJhbGFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktV2V0LUJhbGFuY2U8L05JQ0s+Cis8QkxVUkI+RHJ5LVdldC1CYWxhbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kZWxheS01czo6RGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTwvTklDSz4KKzxCTFVSQj5EZWxheS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRlbGF5LTVzOjpEcnktV2V0LUJhbGFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktV2V0LUJhbGFuY2U8L05JQ0s+Cis8QkxVUkI+RHJ5LVdldC1CYWxhbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kZWxheS02MHM6OkRlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDYwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbGF5PC9OSUNLPgorPEJMVVJCPkRlbGF5LjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGVsYXktNjBzOjpEcnktV2V0LUJhbGFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktV2V0LUJhbGFuY2U8L05JQ0s+Cis8QkxVUkI+RHJ5LVdldC1CYWxhbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmFjay1tYXgtcGVhazo6RW52ZWxvcGUtRm9yZ2V0dGluZy1GYWN0b3I8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkVudmVsb3BlLUZvcmdldHRpbmctRmFjdG9yPC9OSUNLPgorPEJMVVJCPkVudmVsb3BlLUZvcmdldHRpbmctRmFjdG9yLjwvQkxVUkI+Cis8REVGQVVMVD4zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyYWNrLW1heC1wZWFrOjpPdXRwdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5PdXRwdXQ8L05JQ0s+Cis8QkxVUkI+T3V0cHV0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJhY2stbWF4LXJtczo6RW52ZWxvcGUtRm9yZ2V0dGluZy1GYWN0b3I8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkVudmVsb3BlLUZvcmdldHRpbmctRmFjdG9yPC9OSUNLPgorPEJMVVJCPkVudmVsb3BlLUZvcmdldHRpbmctRmFjdG9yLjwvQkxVUkI+Cis8REVGQVVMVD4zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyYWNrLW1heC1ybXM6Ok91dHB1dDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPk91dHB1dDwvTklDSz4KKzxCTFVSQj5PdXRwdXQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmFjay1wZWFrOjpPdXRwdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5PdXRwdXQ8L05JQ0s+Cis8QkxVUkI+T3V0cHV0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJhY2stcGVhazo6U21vb3RoaW5nLUZhY3RvcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNtb290aGluZy1GYWN0b3I8L05JQ0s+Cis8QkxVUkI+U21vb3RoaW5nLUZhY3Rvci48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyYWNrLXJtczo6T3V0cHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0PC9OSUNLPgorPEJMVVJCPk91dHB1dC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyYWNrLXJtczo6U21vb3RoaW5nLUZhY3RvcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNtb290aGluZy1GYWN0b3I8L05JQ0s+Cis8QkxVUkI+U21vb3RoaW5nLUZhY3Rvci48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZiZGVsYXktMC0wMXM6OkRlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAsMDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXk8L05JQ0s+Cis8QkxVUkI+RGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mYmRlbGF5LTAtMDFzOjpEcnktV2V0LUJhbGFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktV2V0LUJhbGFuY2U8L05JQ0s+Cis8QkxVUkI+RHJ5LVdldC1CYWxhbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mYmRlbGF5LTAtMDFzOjpGZWVkYmFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZmJkZWxheS0wLTFzOjpEZWxheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXk8L05JQ0s+Cis8QkxVUkI+RGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjAsMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZiZGVsYXktMC0xczo6RHJ5LVdldC1CYWxhbmNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LVdldC1CYWxhbmNlPC9OSUNLPgorPEJMVVJCPkRyeS1XZXQtQmFsYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZmJkZWxheS0wLTFzOjpGZWVkYmFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZmJkZWxheS0xczo6RGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTwvTklDSz4KKzxCTFVSQj5EZWxheS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZiZGVsYXktMXM6OkRyeS1XZXQtQmFsYW5jZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRyeS1XZXQtQmFsYW5jZTwvTklDSz4KKzxCTFVSQj5EcnktV2V0LUJhbGFuY2UuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZiZGVsYXktMXM6OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPkZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mYmRlbGF5LTVzOjpEZWxheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbGF5PC9OSUNLPgorPEJMVVJCPkRlbGF5LjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZmJkZWxheS01czo6RHJ5LVdldC1CYWxhbmNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LVdldC1CYWxhbmNlPC9OSUNLPgorPEJMVVJCPkRyeS1XZXQtQmFsYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZmJkZWxheS01czo6RmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZiZGVsYXktNjBzOjpEZWxheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw2MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTwvTklDSz4KKzxCTFVSQj5EZWxheS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZiZGVsYXktNjBzOjpEcnktV2V0LUJhbGFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktV2V0LUJhbGFuY2U8L05JQ0s+Cis8QkxVUkI+RHJ5LVdldC1CYWxhbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mYmRlbGF5LTYwczo6RmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZyZWV2ZXJiMzo6RGFtcGluZzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRhbXBpbmc8L05JQ0s+Cis8QkxVUkI+RGFtcGluZy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZyZWV2ZXJiMzo6RHJ5LUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LUxldmVsPC9OSUNLPgorPEJMVVJCPkRyeS1MZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZyZWV2ZXJiMzo6RnJlZXplLU1vZGU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVlemUtTW9kZTwvTklDSz4KKzxCTFVSQj5GcmVlemUtTW9kZS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mcmVldmVyYjM6OlJvb20tU2l6ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJvb20tU2l6ZTwvTklDSz4KKzxCTFVSQj5Sb29tLVNpemUuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZyZWV2ZXJiMzo6V2V0LUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+V2V0LUxldmVsPC9OSUNLPgorPEJMVVJCPldldC1MZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZyZWV2ZXJiMzo6V2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5XaWR0aDwvTklDSz4KKzxCTFVSQj5XaWR0aC48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ3JhaW4tc2NhdHRlcjo6RGVuc2l0eTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVuc2l0eTwvTklDSz4KKzxCTFVSQj5EZW5zaXR5LjwvQkxVUkI+Cis8REVGQVVMVD4zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdyYWluLXNjYXR0ZXI6OkdyYWluLUF0dGFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+R3JhaW4tQXR0YWNrPC9OSUNLPgorPEJMVVJCPkdyYWluLUF0dGFjay48L0JMVVJCPgorPERFRkFVTFQ+Myw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1ncmFpbi1zY2F0dGVyOjpHcmFpbi1MZW5ndGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkdyYWluLUxlbmd0aDwvTklDSz4KKzxCTFVSQj5HcmFpbi1MZW5ndGguPC9CTFVSQj4KKzxERUZBVUxUPjMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ3JhaW4tc2NhdHRlcjo6U2NhdHRlcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNjYXR0ZXI8L05JQ0s+Cis8QkxVUkI+U2NhdHRlci48L0JMVVJCPgorPERFRkFVTFQ+Miw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGFyZC1nYXRlOjpUaHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UaHJlc2hvbGQ8L05JQ0s+Cis8QkxVUkI+VGhyZXNob2xkLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaWRlbnRpdHktY29udHJvbDo6SW5wdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5wdXQ8L05JQ0s+Cis8QkxVUkI+SW5wdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWlkZW50aXR5LWNvbnRyb2w6Ok91dHB1dDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0PC9OSUNLPgorPEJMVVJCPk91dHB1dC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbG9maTo6Q3JhY2tsaW5nPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q3JhY2tsaW5nPC9OSUNLPgorPEJMVVJCPkNyYWNrbGluZy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxvZmk6Ok9wYW1wLUJhbmR3aWR0aC1MaW1pdGluZzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwxMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PcGFtcC1CYW5kd2lkdGgtTGltaXRpbmc8L05JQ0s+Cis8QkxVUkI+T3BhbXAtQmFuZHdpZHRoLUxpbWl0aW5nLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbG9maTo6UG93ZXJzdXBwbHktT3ZlcmxvYWRpbmc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlBvd2Vyc3VwcGx5LU92ZXJsb2FkaW5nPC9OSUNLPgorPEJMVVJCPlBvd2Vyc3VwcGx5LU92ZXJsb2FkaW5nLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbG9naXN0aWM6OlN0ZXAtZnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDQ0LDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3RlcC1mcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+U3RlcC1mcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjIyLDA1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbG9naXN0aWM6OnBhcmFtLS1yLS1wYXJhbWV0ZXI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIsOSwzLDk5OTldPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tLXItLXBhcmFtZXRlcjwvTklDSz4KKzxCTFVSQj5wYXJhbS0tci0tcGFyYW1ldGVyLjwvQkxVUkI+Cis8REVGQVVMVD4zLDk5OTk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1ub2lzZS1zb3VyY2Utd2hpdGU6OkFtcGxpdHVkZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QW1wbGl0dWRlPC9OSUNLPgorPEJMVVJCPkFtcGxpdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW51bGwtY2k6OklucHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklucHV0PC9OSUNLPgorPEJMVVJCPklucHV0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1udWxsLWNvOjpPdXRwdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPk91dHB1dDwvTklDSz4KKzxCTFVSQj5PdXRwdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW9yZ2FuOjpBdHRhY2stSGk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdHRhY2stSGk8L05JQ0s+Cis8QkxVUkI+QXR0YWNrLUhpLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtb3JnYW46OkF0dGFjay1MbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkF0dGFjay1MbzwvTklDSz4KKzxCTFVSQj5BdHRhY2stTG8uPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1vcmdhbjo6QnJhc3M8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CcmFzczwvTklDSz4KKzxCTFVSQj5CcmFzcy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1vcmdhbjo6RGVjYXktSGk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWNheS1IaTwvTklDSz4KKzxCTFVSQj5EZWNheS1IaS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW9yZ2FuOjpEZWNheS1MbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlY2F5LUxvPC9OSUNLPgorPEJMVVJCPkRlY2F5LUxvLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtb3JnYW46OkZsdXRlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Rmx1dGU8L05JQ0s+Cis8QkxVUkI+Rmx1dGUuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtb3JnYW46OkZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtb3JnYW46OkdhdGU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5HYXRlPC9OSUNLPgorPEJMVVJCPkdhdGUuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtb3JnYW46OlJlZWQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWVkPC9OSUNLPgorPEJMVVJCPlJlZWQuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtb3JnYW46OlJlbGVhc2UtSGk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWxlYXNlLUhpPC9OSUNLPgorPEJMVVJCPlJlbGVhc2UtSGkuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1vcmdhbjo6UmVsZWFzZS1MbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlbGVhc2UtTG88L05JQ0s+Cis8QkxVUkI+UmVsZWFzZS1Mby48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW9yZ2FuOjpTdXN0YWluLUhpPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3VzdGFpbi1IaTwvTklDSz4KKzxCTFVSQj5TdXN0YWluLUhpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtb3JnYW46OlN1c3RhaW4tTG88L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TdXN0YWluLUxvPC9OSUNLPgorPEJMVVJCPlN1c3RhaW4tTG8uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1vcmdhbjo6VmVsb2NpdHk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WZWxvY2l0eTwvTklDSz4KKzxCTFVSQj5WZWxvY2l0eS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW9yZ2FuOjpwYXJhbS0xNnRoLUhhcm1vbmljPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMTZ0aC1IYXJtb25pYzwvTklDSz4KKzxCTFVSQj5wYXJhbS0xNnRoLUhhcm1vbmljLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtb3JnYW46OnBhcmFtLTItMi0zcmQtSGFybW9uaWM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0yLTItM3JkLUhhcm1vbmljPC9OSUNLPgorPEJMVVJCPnBhcmFtLTItMi0zcmQtSGFybW9uaWMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1vcmdhbjo6cGFyYW0tMm5kLUhhcm1vbmljPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMm5kLUhhcm1vbmljPC9OSUNLPgorPEJMVVJCPnBhcmFtLTJuZC1IYXJtb25pYy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW9yZ2FuOjpwYXJhbS00dGgtSGFybW9uaWM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS00dGgtSGFybW9uaWM8L05JQ0s+Cis8QkxVUkI+cGFyYW0tNHRoLUhhcm1vbmljLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtb3JnYW46OnBhcmFtLTUtMS0zcmQtSGFybW9uaWM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS01LTEtM3JkLUhhcm1vbmljPC9OSUNLPgorPEJMVVJCPnBhcmFtLTUtMS0zcmQtSGFybW9uaWMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1vcmdhbjo6cGFyYW0tOHRoLUhhcm1vbmljPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tOHRoLUhhcm1vbmljPC9OSUNLPgorPEJMVVJCPnBhcmFtLTh0aC1IYXJtb25pYy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBlYWs6OlBlYWs8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5QZWFrPC9OSUNLPgorPEJMVVJCPlBlYWsuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPMS1BdHRhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08xLUF0dGFjazwvTklDSz4KKzxCTFVSQj5EQ08xLUF0dGFjay48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ08xLURlY2F5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMS1EZWNheTwvTklDSz4KKzxCTFVSQj5EQ08xLURlY2F5LjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzEtTW9kdWxhdGlvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzEtTW9kdWxhdGlvbjwvTklDSz4KKzxCTFVSQj5EQ08xLU1vZHVsYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPMS1PY3RhdmU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMS1PY3RhdmU8L05JQ0s+Cis8QkxVUkI+RENPMS1PY3RhdmUuPC9CTFVSQj4KKzxERUZBVUxUPi0yPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzEtUmVsZWFzZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzEtUmVsZWFzZTwvTklDSz4KKzxCTFVSQj5EQ08xLVJlbGVhc2UuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPMS1TdXN0YWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMS1TdXN0YWluPC9OSUNLPgorPEJMVVJCPkRDTzEtU3VzdGFpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ08xLVdhdmVmb3JtPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzEtV2F2ZWZvcm08L05JQ0s+Cis8QkxVUkI+RENPMS1XYXZlZm9ybS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ08yLUF0dGFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzItQXR0YWNrPC9OSUNLPgorPEJMVVJCPkRDTzItQXR0YWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzItRGVjYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08yLURlY2F5PC9OSUNLPgorPEJMVVJCPkRDTzItRGVjYXkuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPMi1Nb2R1bGF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMi1Nb2R1bGF0aW9uPC9OSUNLPgorPEJMVVJCPkRDTzItTW9kdWxhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ08yLU9jdGF2ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08yLU9jdGF2ZTwvTklDSz4KKzxCTFVSQj5EQ08yLU9jdGF2ZS48L0JMVVJCPgorPERFRkFVTFQ+LTI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPMi1SZWxlYXNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMi1SZWxlYXNlPC9OSUNLPgorPEJMVVJCPkRDTzItUmVsZWFzZS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ08yLVN1c3RhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08yLVN1c3RhaW48L05JQ0s+Cis8QkxVUkI+RENPMi1TdXN0YWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzItV2F2ZWZvcm08L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMi1XYXZlZm9ybTwvTklDSz4KKzxCTFVSQj5EQ08yLVdhdmVmb3JtLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzMtQXR0YWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPMy1BdHRhY2s8L05JQ0s+Cis8QkxVUkI+RENPMy1BdHRhY2suPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPMy1EZWNheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzMtRGVjYXk8L05JQ0s+Cis8QkxVUkI+RENPMy1EZWNheS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ08zLU1vZHVsYXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08zLU1vZHVsYXRpb248L05JQ0s+Cis8QkxVUkI+RENPMy1Nb2R1bGF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzMtT2N0YXZlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMiwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzMtT2N0YXZlPC9OSUNLPgorPEJMVVJCPkRDTzMtT2N0YXZlLjwvQkxVUkI+Cis8REVGQVVMVD4tMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ08zLVJlbGVhc2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08zLVJlbGVhc2U8L05JQ0s+Cis8QkxVUkI+RENPMy1SZWxlYXNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzMtU3VzdGFpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzMtU3VzdGFpbjwvTklDSz4KKzxCTFVSQj5EQ08zLVN1c3RhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPMy1XYXZlZm9ybTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ08zLVdhdmVmb3JtPC9OSUNLPgorPEJMVVJCPkRDTzMtV2F2ZWZvcm0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPNC1BdHRhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ080LUF0dGFjazwvTklDSz4KKzxCTFVSQj5EQ080LUF0dGFjay48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ080LURlY2F5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPNC1EZWNheTwvTklDSz4KKzxCTFVSQj5EQ080LURlY2F5LjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzQtTW9kdWxhdGlvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzQtTW9kdWxhdGlvbjwvTklDSz4KKzxCTFVSQj5EQ080LU1vZHVsYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPNC1PY3RhdmU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPNC1PY3RhdmU8L05JQ0s+Cis8QkxVUkI+RENPNC1PY3RhdmUuPC9CTFVSQj4KKzxERUZBVUxUPi0yPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzQtUmVsZWFzZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzQtUmVsZWFzZTwvTklDSz4KKzxCTFVSQj5EQ080LVJlbGVhc2UuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPNC1TdXN0YWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPNC1TdXN0YWluPC9OSUNLPgorPEJMVVJCPkRDTzQtU3VzdGFpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ080LVdhdmVmb3JtPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzQtV2F2ZWZvcm08L05JQ0s+Cis8QkxVUkI+RENPNC1XYXZlZm9ybS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ081LUF0dGFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzUtQXR0YWNrPC9OSUNLPgorPEJMVVJCPkRDTzUtQXR0YWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzUtRGVjYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ081LURlY2F5PC9OSUNLPgorPEJMVVJCPkRDTzUtRGVjYXkuPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPNS1Nb2R1bGF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPNS1Nb2R1bGF0aW9uPC9OSUNLPgorPEJMVVJCPkRDTzUtTW9kdWxhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ081LU9jdGF2ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ081LU9jdGF2ZTwvTklDSz4KKzxCTFVSQj5EQ081LU9jdGF2ZS48L0JMVVJCPgorPERFRkFVTFQ+LTI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPNS1SZWxlYXNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPNS1SZWxlYXNlPC9OSUNLPgorPEJMVVJCPkRDTzUtUmVsZWFzZS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ081LVN1c3RhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ081LVN1c3RhaW48L05JQ0s+Cis8QkxVUkI+RENPNS1TdXN0YWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzUtV2F2ZWZvcm08L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPNS1XYXZlZm9ybTwvTklDSz4KKzxCTFVSQj5EQ081LVdhdmVmb3JtLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzYtQXR0YWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RENPNi1BdHRhY2s8L05JQ0s+Cis8QkxVUkI+RENPNi1BdHRhY2suPC9CTFVSQj4KKzxERUZBVUxUPjAsMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPNi1EZWNheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzYtRGVjYXk8L05JQ0s+Cis8QkxVUkI+RENPNi1EZWNheS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ082LU1vZHVsYXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ082LU1vZHVsYXRpb248L05JQ0s+Cis8QkxVUkI+RENPNi1Nb2R1bGF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzYtT2N0YXZlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMiwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzYtT2N0YXZlPC9OSUNLPgorPEJMVVJCPkRDTzYtT2N0YXZlLjwvQkxVUkI+Cis8REVGQVVMVD4tMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlbW9kOjpEQ082LVJlbGVhc2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ082LVJlbGVhc2U8L05JQ0s+Cis8QkxVUkI+RENPNi1SZWxlYXNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2Vtb2Q6OkRDTzYtU3VzdGFpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRDTzYtU3VzdGFpbjwvTklDSz4KKzxCTFVSQj5EQ082LVN1c3RhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RENPNi1XYXZlZm9ybTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EQ082LVdhdmVmb3JtPC9OSUNLPgorPEJMVVJCPkRDTzYtV2F2ZWZvcm0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6RnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6R2F0ZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkdhdGU8L05JQ0s+Cis8QkxVUkI+R2F0ZS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZW1vZDo6VmVsb2NpdHk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WZWxvY2l0eTwvTklDSz4KKzxCTFVSQj5WZWxvY2l0eS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBpbmstaW50ZXJwb2xhdGVkLWF1ZGlvOjpIaWdoZXN0LWZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw0NDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5IaWdoZXN0LWZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5IaWdoZXN0LWZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBpbmstc2g6OlNhbXBsZS1hbmQtaG9sZC1mcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsODgyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNhbXBsZS1hbmQtaG9sZC1mcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+U2FtcGxlLWFuZC1ob2xkLWZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWNvbXByZXNzLXBlYWs6OkNvbXByZXNzaW9uLVJhdGlvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjw9IDE8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Db21wcmVzc2lvbi1SYXRpbzwvTklDSz4KKzxCTFVSQj5Db21wcmVzc2lvbi1SYXRpby48L0JMVVJCPgorPERFRkFVTFQ+LTEsNzAxNDFlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtY29tcHJlc3MtcGVhazo6T3V0cHV0LUVudmVsb3BlLUF0dGFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0LUVudmVsb3BlLUF0dGFjazwvTklDSz4KKzxCTFVSQj5PdXRwdXQtRW52ZWxvcGUtQXR0YWNrLjwvQkxVUkI+Cis8REVGQVVMVD4zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWNvbXByZXNzLXBlYWs6Ok91dHB1dC1FbnZlbG9wZS1EZWNheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0LUVudmVsb3BlLURlY2F5PC9OSUNLPgorPEJMVVJCPk91dHB1dC1FbnZlbG9wZS1EZWNheS48L0JMVVJCPgorPERFRkFVTFQ+Myw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jb21wcmVzcy1wZWFrOjpUaHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRocmVzaG9sZDwvTklDSz4KKzxCTFVSQj5UaHJlc2hvbGQuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jb21wcmVzcy1ybXM6OkNvbXByZXNzaW9uLVJhdGlvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjw9IDE8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Db21wcmVzc2lvbi1SYXRpbzwvTklDSz4KKzxCTFVSQj5Db21wcmVzc2lvbi1SYXRpby48L0JMVVJCPgorPERFRkFVTFQ+LTEsNzAxNDFlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtY29tcHJlc3Mtcm1zOjpPdXRwdXQtRW52ZWxvcGUtQXR0YWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRwdXQtRW52ZWxvcGUtQXR0YWNrPC9OSUNLPgorPEJMVVJCPk91dHB1dC1FbnZlbG9wZS1BdHRhY2suPC9CTFVSQj4KKzxERUZBVUxUPjMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtY29tcHJlc3Mtcm1zOjpPdXRwdXQtRW52ZWxvcGUtRGVjYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk91dHB1dC1FbnZlbG9wZS1EZWNheTwvTklDSz4KKzxCTFVSQj5PdXRwdXQtRW52ZWxvcGUtRGVjYXkuPC9CTFVSQj4KKzxERUZBVUxUPjMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtY29tcHJlc3Mtcm1zOjpUaHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRocmVzaG9sZDwvTklDSz4KKzxCTFVSQj5UaHJlc2hvbGQuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1leHBhbmQtcGVhazo6RXhwYW5zaW9uLVJhdGlvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjw9IDE8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5FeHBhbnNpb24tUmF0aW88L05JQ0s+Cis8QkxVUkI+RXhwYW5zaW9uLVJhdGlvLjwvQkxVUkI+Cis8REVGQVVMVD4tMSw3MDE0MWUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1leHBhbmQtcGVhazo6T3V0cHV0LUVudmVsb3BlLUF0dGFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0LUVudmVsb3BlLUF0dGFjazwvTklDSz4KKzxCTFVSQj5PdXRwdXQtRW52ZWxvcGUtQXR0YWNrLjwvQkxVUkI+Cis8REVGQVVMVD4zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWV4cGFuZC1wZWFrOjpPdXRwdXQtRW52ZWxvcGUtRGVjYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk91dHB1dC1FbnZlbG9wZS1EZWNheTwvTklDSz4KKzxCTFVSQj5PdXRwdXQtRW52ZWxvcGUtRGVjYXkuPC9CTFVSQj4KKzxERUZBVUxUPjMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZXhwYW5kLXBlYWs6OlRocmVzaG9sZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGhyZXNob2xkPC9OSUNLPgorPEJMVVJCPlRocmVzaG9sZC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWV4cGFuZC1ybXM6OkV4cGFuc2lvbi1SYXRpbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48PSAxPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RXhwYW5zaW9uLVJhdGlvPC9OSUNLPgorPEJMVVJCPkV4cGFuc2lvbi1SYXRpby48L0JMVVJCPgorPERFRkFVTFQ+LTEsNzAxNDFlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZXhwYW5kLXJtczo6T3V0cHV0LUVudmVsb3BlLUF0dGFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0LUVudmVsb3BlLUF0dGFjazwvTklDSz4KKzxCTFVSQj5PdXRwdXQtRW52ZWxvcGUtQXR0YWNrLjwvQkxVUkI+Cis8REVGQVVMVD4zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWV4cGFuZC1ybXM6Ok91dHB1dC1FbnZlbG9wZS1EZWNheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0LUVudmVsb3BlLURlY2F5PC9OSUNLPgorPEJMVVJCPk91dHB1dC1FbnZlbG9wZS1EZWNheS48L0JMVVJCPgorPERFRkFVTFQ+Myw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1leHBhbmQtcm1zOjpUaHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRocmVzaG9sZDwvTklDSz4KKzxCTFVSQj5UaHJlc2hvbGQuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1saW1pdC1wZWFrOjpPdXRwdXQtRW52ZWxvcGUtQXR0YWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRwdXQtRW52ZWxvcGUtQXR0YWNrPC9OSUNLPgorPEJMVVJCPk91dHB1dC1FbnZlbG9wZS1BdHRhY2suPC9CTFVSQj4KKzxERUZBVUxUPjMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbGltaXQtcGVhazo6T3V0cHV0LUVudmVsb3BlLURlY2F5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRwdXQtRW52ZWxvcGUtRGVjYXk8L05JQ0s+Cis8QkxVUkI+T3V0cHV0LUVudmVsb3BlLURlY2F5LjwvQkxVUkI+Cis8REVGQVVMVD4zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxpbWl0LXBlYWs6OlRocmVzaG9sZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGhyZXNob2xkPC9OSUNLPgorPEJMVVJCPlRocmVzaG9sZC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxpbWl0LXJtczo6T3V0cHV0LUVudmVsb3BlLUF0dGFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0LUVudmVsb3BlLUF0dGFjazwvTklDSz4KKzxCTFVSQj5PdXRwdXQtRW52ZWxvcGUtQXR0YWNrLjwvQkxVUkI+Cis8REVGQVVMVD4zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxpbWl0LXJtczo6T3V0cHV0LUVudmVsb3BlLURlY2F5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRwdXQtRW52ZWxvcGUtRGVjYXk8L05JQ0s+Cis8QkxVUkI+T3V0cHV0LUVudmVsb3BlLURlY2F5LjwvQkxVUkI+Cis8REVGQVVMVD4zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxpbWl0LXJtczo6VGhyZXNob2xkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UaHJlc2hvbGQ8L05JQ0s+Cis8QkxVUkI+VGhyZXNob2xkLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2luZS1mYWFjOjpBbXBsaXR1ZGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFtcGxpdHVkZTwvTklDSz4KKzxCTFVSQj5BbXBsaXR1ZGUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zaW5lLWZjYWE6OkZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD40NDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zaW5lLWZjYWM6OkFtcGxpdHVkZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QW1wbGl0dWRlPC9OSUNLPgorPEJMVVJCPkFtcGxpdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNpbmUtZmNhYzo6RnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDIyMDUwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjQ0MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXN5bmRydW06OkZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc3luZHJ1bTo6RnJlcXVlbmN5LVJhdGlvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS1SYXRpbzwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3ktUmF0aW8uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zeW5kcnVtOjpSZXNvbmFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAxLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzb25hbmNlPC9OSUNLPgorPEJMVVJCPlJlc29uYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zeW5kcnVtOjpUcmlnZ2VyPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VHJpZ2dlcjwvTklDSz4KKzxCTFVSQj5UcmlnZ2VyLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXN5bmRydW06OlZlbG9jaXR5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZlbG9jaXR5PC9OSUNLPgorPEJMVVJCPlZlbG9jaXR5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmMzAzOjpDdXRvZmY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DdXRvZmY8L05JQ0s+Cis8QkxVUkI+Q3V0b2ZmLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmMzAzOjpEZWNheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlY2F5PC9OSUNLPgorPEJMVVJCPkRlY2F5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmMzAzOjpFbnZlbG9wZS1Nb2R1bGF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RW52ZWxvcGUtTW9kdWxhdGlvbjwvTklDSz4KKzxCTFVSQj5FbnZlbG9wZS1Nb2R1bGF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmMzAzOjpSZXNvbmFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2U8L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmNmMzAzOjpUcmlnZ2VyPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VHJpZ2dlcjwvTklDSz4KKzxCTFVSQj5UcmlnZ2VyLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXdzaGFwZS1zaW5lOjpMaW1pdGluZy1BbXBsaXR1ZGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxpbWl0aW5nLUFtcGxpdHVkZTwvTklDSz4KKzxCTFVSQj5MaW1pdGluZy1BbXBsaXR1ZGUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jaGVic3RvcnRpb246OkRpc3RvcnRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsM108L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EaXN0b3J0aW9uPC9OSUNLPgorPEJMVVJCPkRpc3RvcnRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1sY3JEZWxheTo6Qy1kZWxheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyNzAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkMtZGVsYXk8L05JQ0s+Cis8QkxVUkI+Qy1kZWxheS48L0JMVVJCPgorPERFRkFVTFQ+Njc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbGNyRGVsYXk6OkMtbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Qy1sZXZlbDwvTklDSz4KKzxCTFVSQj5DLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4yNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxjckRlbGF5OjpEcnktV2V0LWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LVdldC1sZXZlbDwvTklDSz4KKzxCTFVSQj5EcnktV2V0LWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbGNyRGVsYXk6OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMTAwLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxjckRlbGF5OjpIaWdoLWRhbXA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkhpZ2gtZGFtcDwvTklDSz4KKzxCTFVSQj5IaWdoLWRhbXAuPC9CTFVSQj4KKzxERUZBVUxUPjUwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbGNyRGVsYXk6OkwtZGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMjcwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MLWRlbGF5PC9OSUNLPgorPEJMVVJCPkwtZGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjY3NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxjckRlbGF5OjpMLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDUwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkwtbGV2ZWw8L05JQ0s+Cis8QkxVUkI+TC1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1sY3JEZWxheTo6TG93LWRhbXA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxvdy1kYW1wPC9OSUNLPgorPEJMVVJCPkxvdy1kYW1wLjwvQkxVUkI+Cis8REVGQVVMVD41MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWxjckRlbGF5OjpSLWRlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDI3MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Ui1kZWxheTwvTklDSz4KKzxCTFVSQj5SLWRlbGF5LjwvQkxVUkI+Cis8REVGQVVMVD42NzU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1sY3JEZWxheTo6Ui1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SLWxldmVsPC9OSUNLPgorPEJMVVJCPlItbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbGNyRGVsYXk6OlNwcmVhZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TcHJlYWQ8L05JQ0s+Cis8QkxVUkI+U3ByZWFkLjwvQkxVUkI+Cis8REVGQVVMVD4yNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRpdmlkZXI6OkRlbm9taW5hdG9yPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbm9taW5hdG9yPC9OSUNLPgorPEJMVVJCPkRlbm9taW5hdG9yLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmFuZG9tLWZhc2Mtb2E6OldhdmUtU21vb3RobmVzczwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldhdmUtU21vb3RobmVzczwvTklDSz4KKzxCTFVSQj5XYXZlLVNtb290aG5lc3MuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1yYW5kb20tZmNzYS1vYTo6RnJlcXVlbno8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsOTE4NzUsMjIwNTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbno8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbnouPC9CTFVSQj4KKzxERUZBVUxUPjQ0MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXJhbmRvbS1mY3NjLW9hOjpGcmVxdWVuejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw5MTg3NSwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuejwvTklDSz4KKzxCTFVSQj5GcmVxdWVuei48L0JMVVJCPgorPERFRkFVTFQ+NDQwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmFuZG9tLWZjc2Mtb2E6OldhdmUtU21vb3RobmVzczwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldhdmUtU21vb3RobmVzczwvTklDSz4KKzxCTFVSQj5XYXZlLVNtb290aG5lc3MuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1sZm9QaGFzZXI6OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPkZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbGZvUGhhc2VyOjpMRk8tZGVwdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MRk8tZGVwdGg8L05JQ0s+Cis8QkxVUkI+TEZPLWRlcHRoLjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbGZvUGhhc2VyOjpMRk8tcmF0ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TEZPLXJhdGU8L05JQ0s+Cis8QkxVUkI+TEZPLXJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbGZvUGhhc2VyOjpTcHJlYWQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TcHJlYWQ8L05JQ0s+Cis8QkxVUkI+U3ByZWFkLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm91ckJ5Rm91clBvbGU6OkZlZWRiYWNrLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2stMTwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay0xLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm91ckJ5Rm91clBvbGU6OkZlZWRiYWNrLTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2stMjwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay0yLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm91ckJ5Rm91clBvbGU6OkZlZWRiYWNrLTM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2stMzwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay0zLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm91ckJ5Rm91clBvbGU6OkZlZWRiYWNrLTQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2stNDwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay00LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm91ckJ5Rm91clBvbGU6OkZyZXF1ZW5jeS0xPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS0xPC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS0xLjwvQkxVUkI+Cis8REVGQVVMVD41MDAwLDc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm91ckJ5Rm91clBvbGU6OkZyZXF1ZW5jeS0yPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS0yPC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS0yLjwvQkxVUkI+Cis8REVGQVVMVD4xMDAwMCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm91ckJ5Rm91clBvbGU6OkZyZXF1ZW5jeS0zPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS0zPC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS0zLjwvQkxVUkI+Cis8REVGQVVMVD4xNTAwMCwyPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZm91ckJ5Rm91clBvbGU6OkZyZXF1ZW5jeS00PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS00PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS00LjwvQkxVUkI+Cis8REVGQVVMVD4yMDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWF1dG9QaGFzZXI6OkF0dGFjay10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QXR0YWNrLXRpbWU8L05JQ0s+Cis8QkxVUkI+QXR0YWNrLXRpbWUuPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hdXRvUGhhc2VyOjpEZWNheS10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVjYXktdGltZTwvTklDSz4KKzxCTFVSQj5EZWNheS10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYXV0b1BoYXNlcjo6RmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hdXRvUGhhc2VyOjpNb2R1bGF0aW9uLWRlcHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kdWxhdGlvbi1kZXB0aDwvTklDSz4KKzxCTFVSQj5Nb2R1bGF0aW9uLWRlcHRoLjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYXV0b1BoYXNlcjo6U3ByZWFkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3ByZWFkPC9OSUNLPgorPEJMVVJCPlNwcmVhZC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1yZWZsZWN0b3I6OkRyeS1MZXZlbC0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LUxldmVsLS1kQi08L05JQ0s+Cis8QkxVUkI+RHJ5LUxldmVsLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPi05MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1yZWZsZWN0b3I6OkZyYWdtZW50LUxlbmd0aC0tbXMtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyMCwxNjAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyYWdtZW50LUxlbmd0aC0tbXMtPC9OSUNLPgorPEJMVVJCPkZyYWdtZW50LUxlbmd0aC0tbXMtLjwvQkxVUkI+Cis8REVGQVVMVD40MTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcmVmbGVjdG9yOjpXZXQtTGV2ZWwtLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTkwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldldC1MZXZlbC0tZEItPC9OSUNLPgorPEJMVVJCPldldC1MZXZlbC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZmFzdExvb2thaGVhZExpbWl0ZXI6OkF0dGVudWF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDcwXTwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5BdHRlbnVhdGlvbjwvTklDSz4KKzxCTFVSQj5BdHRlbnVhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZhc3RMb29rYWhlYWRMaW1pdGVyOjpJbnB1dC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5wdXQtZ2FpbjwvTklDSz4KKzxCTFVSQj5JbnB1dC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZmFzdExvb2thaGVhZExpbWl0ZXI6OkxpbWl0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MaW1pdDwvTklDSz4KKzxCTFVSQj5MaW1pdC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZhc3RMb29rYWhlYWRMaW1pdGVyOjpSZWxlYXNlLXRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWxlYXNlLXRpbWU8L05JQ0s+Cis8QkxVUkI+UmVsZWFzZS10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wLDUwNzU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mYXN0TG9va2FoZWFkTGltaXRlcjo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIyMDo6TWF0Y2gtUmFuZ2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1hdGNoLVJhbmdlPC9OSUNLPgorPEJMVVJCPk1hdGNoLVJhbmdlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyMjA6Ok1vZGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kZTwvTklDSz4KKzxCTFVSQj5Nb2RlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyMjA6OlF1YW50aXNlLVJhbmdlLU1heGltdW08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UXVhbnRpc2UtUmFuZ2UtTWF4aW11bTwvTklDSz4KKzxCTFVSQj5RdWFudGlzZS1SYW5nZS1NYXhpbXVtLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIyMDo6UXVhbnRpc2UtUmFuZ2UtTWluaW11bTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5RdWFudGlzZS1SYW5nZS1NaW5pbXVtPC9OSUNLPgorPEJMVVJCPlF1YW50aXNlLVJhbmdlLU1pbmltdW0uPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjIwOjpTdGVwczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3RlcHM8L05JQ0s+Cis8QkxVUkI+U3RlcHMuPC9CTFVSQj4KKzxERUZBVUxUPjIwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyMjA6OlZhbHVlLTA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMDwvTklDSz4KKzxCTFVSQj5WYWx1ZS0wLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIyMDo6VmFsdWUtMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0xPC9OSUNLPgorPEJMVVJCPlZhbHVlLTEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjIwOjpWYWx1ZS0xMDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0xMDwvTklDSz4KKzxCTFVSQj5WYWx1ZS0xMC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyMjA6OlZhbHVlLTExPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTExPC9OSUNLPgorPEJMVVJCPlZhbHVlLTExLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIyMDo6VmFsdWUtMTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjIwOjpWYWx1ZS0xMzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0xMzwvTklDSz4KKzxCTFVSQj5WYWx1ZS0xMy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyMjA6OlZhbHVlLTE0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTE0PC9OSUNLPgorPEJMVVJCPlZhbHVlLTE0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIyMDo6VmFsdWUtMTU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjIwOjpWYWx1ZS0xNjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0xNjwvTklDSz4KKzxCTFVSQj5WYWx1ZS0xNi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyMjA6OlZhbHVlLTE3PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTE3PC9OSUNLPgorPEJMVVJCPlZhbHVlLTE3LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIyMDo6VmFsdWUtMTg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMTg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtMTguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjIwOjpWYWx1ZS0xOTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0xOTwvTklDSz4KKzxCTFVSQj5WYWx1ZS0xOS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyMjA6OlZhbHVlLTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtMjwvTklDSz4KKzxCTFVSQj5WYWx1ZS0yLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIyMDo6VmFsdWUtMzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS0zPC9OSUNLPgorPEJMVVJCPlZhbHVlLTMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjIwOjpWYWx1ZS00PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyMjA6OlZhbHVlLTU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtNTwvTklDSz4KKzxCTFVSQj5WYWx1ZS01LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIyMDo6VmFsdWUtNjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS02PC9OSUNLPgorPEJMVVJCPlZhbHVlLTYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXF1YW50aXNlcjIwOjpWYWx1ZS03PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLTc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtNy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcXVhbnRpc2VyMjA6OlZhbHVlLTg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtODwvTklDSz4KKzxCTFVSQj5WYWx1ZS04LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1xdWFudGlzZXIyMDo6VmFsdWUtOTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS05PC9OSUNLPgorPEJMVVJCPlZhbHVlLTkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZ5bmlsOjpDcmFja2xlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q3JhY2tsZTwvTklDSz4KKzxCTFVSQj5DcmFja2xlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdnluaWw6OlJQTTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMzMsNzhdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UlBNPC9OSUNLPgorPEJMVVJCPlJQTS48L0JMVVJCPgorPERFRkFVTFQ+MzM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12eW5pbDo6U3VyZmFjZS13YXJwaW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3VyZmFjZS13YXJwaW5nPC9OSUNLPgorPEJMVVJCPlN1cmZhY2Utd2FycGluZy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZ5bmlsOjpXZWFyPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+V2VhcjwvTklDSz4KKzxCTFVSQj5XZWFyLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdnluaWw6OlllYXI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzE5MDAsMTk5MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5ZZWFyPC9OSUNLPgorPEJMVVJCPlllYXIuPC9CTFVSQj4KKzxERUZBVUxUPjE5OTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jb25zdDo6U2lnbmFsLWFtcGxpdHVkZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNpZ25hbC1hbXBsaXR1ZGU8L05JQ0s+Cis8QkxVUkI+U2lnbmFsLWFtcGxpdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXByb2R1Y3QtaWFpYy1vYTo6U2Vjb25kLUlucHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNlY29uZC1JbnB1dDwvTklDSz4KKzxCTFVSQj5TZWNvbmQtSW5wdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXByb2R1Y3QtaWNpYy1vYzo6Rmlyc3QtSW5wdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Rmlyc3QtSW5wdXQ8L05JQ0s+Cis8QkxVUkI+Rmlyc3QtSW5wdXQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXByb2R1Y3QtaWNpYy1vYzo6UHJvZHVjdC1PdXRwdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPlByb2R1Y3QtT3V0cHV0PC9OSUNLPgorPEJMVVJCPlByb2R1Y3QtT3V0cHV0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1wcm9kdWN0LWljaWMtb2M6OlNlY29uZC1JbnB1dDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TZWNvbmQtSW5wdXQ8L05JQ0s+Cis8QkxVUkI+U2Vjb25kLUlucHV0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcmV2ZXJiOjpBbGxwYXNzLUZpbHRlcnM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BbGxwYXNzLUZpbHRlcnM8L05JQ0s+Cis8QkxVUkI+QWxscGFzcy1GaWx0ZXJzLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1yZXZlcmI6OkJhbmRwYXNzLUZpbHRlcjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmRwYXNzLUZpbHRlcjwvTklDSz4KKzxCTFVSQj5CYW5kcGFzcy1GaWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXJldmVyYjo6Q29tYi1GaWx0ZXJzPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q29tYi1GaWx0ZXJzPC9OSUNLPgorPEJMVVJCPkNvbWItRmlsdGVycy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcmV2ZXJiOjpEZWNheS0tbXMtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlY2F5LS1tcy08L05JQ0s+Cis8QkxVUkI+RGVjYXktLW1zLS48L0JMVVJCPgorPERFRkFVTFQ+MjUwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1yZXZlcmI6OkRyeS1MZXZlbC0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LUxldmVsLS1kQi08L05JQ0s+Cis8QkxVUkI+RHJ5LUxldmVsLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcmV2ZXJiOjpFbmhhbmNlZC1TdGVyZW88L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5FbmhhbmNlZC1TdGVyZW88L05JQ0s+Cis8QkxVUkI+RW5oYW5jZWQtU3RlcmVvLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1yZXZlcmI6OlJldmVyYi1UeXBlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw0Ml08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXZlcmItVHlwZTwvTklDSz4KKzxCTFVSQj5SZXZlcmItVHlwZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1yZXZlcmI6OldldC1MZXZlbC0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+V2V0LUxldmVsLS1kQi08L05JQ0s+Cis8QkxVUkI+V2V0LUxldmVsLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QdWxzZS1WQ086OkV4cC1GTS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RXhwLUZNLWdhaW48L05JQ0s+Cis8QkxVUkI+RXhwLUZNLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QdWxzZS1WQ086OkxQLWZpbHRlcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxQLWZpbHRlcjwvTklDSz4KKzxCTFVSQj5MUC1maWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QdWxzZS1WQ086Okxpbi1GTS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TGluLUZNLWdhaW48L05JQ0s+Cis8QkxVUkI+TGluLUZNLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QdWxzZS1WQ086Ok9jdGF2ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Wy00LDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T2N0YXZlPC9OSUNLPgorPEJMVVJCPk9jdGF2ZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVB1bHNlLVZDTzo6VHVuZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlR1bmU8L05JQ0s+Cis8QkxVUkI+VHVuZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNhdy1WQ086OkV4cC1GTS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RXhwLUZNLWdhaW48L05JQ0s+Cis8QkxVUkI+RXhwLUZNLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TYXctVkNPOjpMUC1maWx0ZXI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MUC1maWx0ZXI8L05JQ0s+Cis8QkxVUkI+TFAtZmlsdGVyLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU2F3LVZDTzo6TGluLUZNLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MaW4tRk0tZ2FpbjwvTklDSz4KKzxCTFVSQj5MaW4tRk0tZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNhdy1WQ086Ok9jdGF2ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Wy00LDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T2N0YXZlPC9OSUNLPgorPEJMVVJCPk9jdGF2ZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNhdy1WQ086OlR1bmU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UdW5lPC9OSUNLPgorPEJMVVJCPlR1bmUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1SZWMtVkNPOjpFeHAtRk0tZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkV4cC1GTS1nYWluPC9OSUNLPgorPEJMVVJCPkV4cC1GTS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUmVjLVZDTzo6Rm9ybS1tb2Q8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Gb3JtLW1vZDwvTklDSz4KKzxCTFVSQj5Gb3JtLW1vZC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVJlYy1WQ086OkxQLWZpbHRlcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxQLWZpbHRlcjwvTklDSz4KKzxCTFVSQj5MUC1maWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1SZWMtVkNPOjpMaW4tRk0tZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxpbi1GTS1nYWluPC9OSUNLPgorPEJMVVJCPkxpbi1GTS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUmVjLVZDTzo6T2N0YXZlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bLTQsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PY3RhdmU8L05JQ0s+Cis8QkxVUkI+T2N0YXZlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUmVjLVZDTzo6VHVuZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlR1bmU8L05JQ0s+Cis8QkxVUkI+VHVuZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVJlYy1WQ086OldhdmVmb3JtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldhdmVmb3JtPC9OSUNLPgorPEJMVVJCPldhdmVmb3JtLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2luZ2xlUGFyYTo6QmFuZHdpZHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZHdpZHRoPC9OSUNLPgorPEJMVVJCPkJhbmR3aWR0aC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNpbmdsZVBhcmE6OkZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxNzY0MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD40NDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zaW5nbGVQYXJhOjpHYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+R2FpbjwvTklDSz4KKzxCTFVSQj5HYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ2F0ZTo6QXR0YWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDEwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QXR0YWNrPC9OSUNLPgorPEJMVVJCPkF0dGFjay48L0JMVVJCPgorPERFRkFVTFQ+MjUwLDAwODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWdhdGU6OkRlY2F5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyLDQwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVjYXk8L05JQ0s+Cis8QkxVUkI+RGVjYXkuPC9CTFVSQj4KKzxERUZBVUxUPjIwMDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nYXRlOjpIRi1rZXktZmlsdGVyPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyMjAsNSwyMTYwOV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5IRi1rZXktZmlsdGVyPC9OSUNLPgorPEJMVVJCPkhGLWtleS1maWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjIxNjA5PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ2F0ZTo6SG9sZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMiwyMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkhvbGQ8L05JQ0s+Cis8QkxVUkI+SG9sZC48L0JMVVJCPgorPERFRkFVTFQ+MTUwMCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ2F0ZTo6TEYta2V5LWZpbHRlcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMzAsODcsNDQxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MRi1rZXktZmlsdGVyPC9OSUNLPgorPEJMVVJCPkxGLWtleS1maWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjMwLDg3PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ2F0ZTo6T3V0cHV0LXNlbGVjdDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0LXNlbGVjdDwvTklDSz4KKzxCTFVSQj5PdXRwdXQtc2VsZWN0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ2F0ZTo6UmFuZ2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy05MCwwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJhbmdlPC9OSUNLPgorPEJMVVJCPlJhbmdlLjwvQkxVUkI+Cis8REVGQVVMVD4tOTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nYXRlOjpUaHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UaHJlc2hvbGQ8L05JQ0s+Cis8QkxVUkI+VGhyZXNob2xkLjwvQkxVUkI+Cis8REVGQVVMVD4tNzA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZHluYW1pY3Mtc3Q6OkF0dGFjay0tbXMtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0LDUwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdHRhY2stLW1zLTwvTklDSz4KKzxCTFVSQj5BdHRhY2stLW1zLS48L0JMVVJCPgorPERFRkFVTFQ+MTI4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWR5bmFtaWNzLXN0OjpFbnZlbG9wZS1Wb2x1bWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy02MCwyMF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+RW52ZWxvcGUtVm9sdW1lPC9OSUNLPgorPEJMVVJCPkVudmVsb3BlLVZvbHVtZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1keW5hbWljcy1zdDo6RW52ZWxvcGUtVm9sdW1lLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy02MCwyMF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+RW52ZWxvcGUtVm9sdW1lLTE8L05JQ0s+Cis8QkxVUkI+RW52ZWxvcGUtVm9sdW1lLTEuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZHluYW1pY3Mtc3Q6OkZ1bmN0aW9uPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GdW5jdGlvbjwvTklDSz4KKzxCTFVSQj5GdW5jdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1keW5hbWljcy1zdDo6R2Fpbi1BZGp1c3RtZW50PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkdhaW4tQWRqdXN0bWVudDwvTklDSz4KKzxCTFVSQj5HYWluLUFkanVzdG1lbnQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZHluYW1pY3Mtc3Q6OkdhaW4tQWRqdXN0bWVudC0xPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkdhaW4tQWRqdXN0bWVudC0xPC9OSUNLPgorPEJMVVJCPkdhaW4tQWRqdXN0bWVudC0xLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWR5bmFtaWNzLXN0OjpNYWtldXAtR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TWFrZXVwLUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5NYWtldXAtR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWR5bmFtaWNzLXN0OjpPZmZzZXQtR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T2Zmc2V0LUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5PZmZzZXQtR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWR5bmFtaWNzLXN0OjpSZWxlYXNlLS1tcy08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzQsMTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWxlYXNlLS1tcy08L05JQ0s+Cis8QkxVUkI+UmVsZWFzZS0tbXMtLjwvQkxVUkI+Cis8REVGQVVMVD41MDI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZHluYW1pY3Mtc3Q6OlN0ZXJlby1Nb2RlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0ZXJlby1Nb2RlPC9OSUNLPgorPEJMVVJCPlN0ZXJlby1Nb2RlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OkJhbmR3aWR0aC0xPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEyNSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmR3aWR0aC0xPC9OSUNLPgorPEJMVVJCPkJhbmR3aWR0aC0xLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OkJhbmR3aWR0aC0yPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEyNSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmR3aWR0aC0yPC9OSUNLPgorPEJMVVJCPkJhbmR3aWR0aC0yLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OkJhbmR3aWR0aC0zPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEyNSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmR3aWR0aC0zPC9OSUNLPgorPEJMVVJCPkJhbmR3aWR0aC0zLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OkJhbmR3aWR0aC00PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEyNSw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmR3aWR0aC00PC9OSUNLPgorPEJMVVJCPkJhbmR3aWR0aC00LjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OkZpbHRlcjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHRlcjwvTklDSz4KKzxCTFVSQj5GaWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OkZyZXF1ZW5jeS0xPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyMCwyMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS0xPC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS0xLjwvQkxVUkI+Cis8REVGQVVMVD4yMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QYXJhbWV0cmljMTo6RnJlcXVlbmN5LTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzQwLDQwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LTI8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LTIuPC9CTFVSQj4KKzxERUZBVUxUPjQwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBhcmFtZXRyaWMxOjpGcmVxdWVuY3ktMzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMTAwLDEwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeS0zPC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS0zLjwvQkxVUkI+Cis8REVGQVVMVD4xMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OkZyZXF1ZW5jeS00PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyMDAsMjAwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LTQ8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LTQuPC9CTFVSQj4KKzxERUZBVUxUPjIwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QYXJhbWV0cmljMTo6R2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkdhaW48L05JQ0s+Cis8QkxVUkI+R2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBhcmFtZXRyaWMxOjpHYWluLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5HYWluLTE8L05JQ0s+Cis8QkxVUkI+R2Fpbi0xLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OkdhaW4tMjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkdhaW4tMjwvTklDSz4KKzxCTFVSQj5HYWluLTIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QYXJhbWV0cmljMTo6R2Fpbi0zPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+R2Fpbi0zPC9OSUNLPgorPEJMVVJCPkdhaW4tMy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBhcmFtZXRyaWMxOjpHYWluLTQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5HYWluLTQ8L05JQ0s+Cis8QkxVUkI+R2Fpbi00LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OlNlY3Rpb24tMTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNlY3Rpb24tMTwvTklDSz4KKzxCTFVSQj5TZWN0aW9uLTEuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OlNlY3Rpb24tMjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNlY3Rpb24tMjwvTklDSz4KKzxCTFVSQj5TZWN0aW9uLTIuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OlNlY3Rpb24tMzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNlY3Rpb24tMzwvTklDSz4KKzxCTFVSQj5TZWN0aW9uLTMuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFyYW1ldHJpYzE6OlNlY3Rpb24tNDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNlY3Rpb24tNDwvTklDSz4KKzxCTFVSQj5TZWN0aW9uLTQuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2luQ29zOjpCYXNlLWZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwNDQxLDIyMDUwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhc2UtZnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkJhc2UtZnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD40NDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zaW5Db3M6OlBpdGNoLW9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw4XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlBpdGNoLW9mZnNldDwvTklDSz4KKzxCTFVSQj5QaXRjaC1vZmZzZXQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1tYXRyaXhTcGF0aWFsaXNlcjo6V2lkdGg8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlstNTEyLDUxMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5XaWR0aDwvTklDSz4KKzxCTFVSQj5XaWR0aC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1saW1pdGVyOjpMaW1pdC1MZXZlbC0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMzAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TGltaXQtTGV2ZWwtLWRCLTwvTklDSz4KKzxCTFVSQj5MaW1pdC1MZXZlbC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWxpbWl0ZXI6Ok91dHB1dC1Wb2x1bWUtLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTMwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk91dHB1dC1Wb2x1bWUtLWRCLTwvTklDSz4KKzxCTFVSQj5PdXRwdXQtVm9sdW1lLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtbGltaXRlcjo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyNTAwLDFdPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmxhdGVuY3k8L05JQ0s+Cis8QkxVUkI+bGF0ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MjUwMCwxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYm9kZVNoaWZ0ZXJDVjo6QmFzZS1zaGlmdDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw1MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhc2Utc2hpZnQ8L05JQ0s+Cis8QkxVUkI+QmFzZS1zaGlmdC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWJvZGVTaGlmdGVyQ1Y6OkNWLUF0dGVudWF0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q1YtQXR0ZW51YXRpb248L05JQ0s+Cis8QkxVUkI+Q1YtQXR0ZW51YXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1ib2RlU2hpZnRlckNWOjpNaXg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TWl4PC9OSUNLPgorPEJMVVJCPk1peC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWJvZGVTaGlmdGVyQ1Y6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmxhdGVuY3k8L05JQ0s+Cis8QkxVUkI+bGF0ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGhhc2VyMTo6RXhwLUZNLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RXhwLUZNLWdhaW48L05JQ0s+Cis8QkxVUkI+RXhwLUZNLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QaGFzZXIxOjpGZWVkYmFjay1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZlZWRiYWNrLWdhaW48L05JQ0s+Cis8QkxVUkI+RmVlZGJhY2stZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBoYXNlcjE6OkZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTYsNl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGhhc2VyMTo6SW5wdXQtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTQwLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklucHV0LWdhaW48L05JQ0s+Cis8QkxVUkI+SW5wdXQtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBoYXNlcjE6Okxpbi1GTS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxpbi1GTS1nYWluPC9OSUNLPgorPEJMVVJCPkxpbi1GTS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGhhc2VyMTo6T3V0cHV0LW1peDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PdXRwdXQtbWl4PC9OSUNLPgorPEJMVVJCPk91dHB1dC1taXguPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QaGFzZXIxOjpTZWN0aW9uczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U2VjdGlvbnM8L05JQ0s+Cis8QkxVUkI+U2VjdGlvbnMuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QaGFzZXIxK0xGTzo6RmVlZGJhY2stZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjay1nYWluPC9OSUNLPgorPEJMVVJCPkZlZWRiYWNrLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QaGFzZXIxK0xGTzo6RnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNiw2XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QaGFzZXIxK0xGTzo6SW5wdXQtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTQwLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklucHV0LWdhaW48L05JQ0s+Cis8QkxVUkI+SW5wdXQtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBoYXNlcjErTEZPOjpMRk8tZnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAxLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxGTy1mcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+TEZPLWZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBoYXNlcjErTEZPOjpMRk8td2F2ZWZvcm08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TEZPLXdhdmVmb3JtPC9OSUNLPgorPEJMVVJCPkxGTy13YXZlZm9ybS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBoYXNlcjErTEZPOjpNb2R1bGF0aW9uLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kdWxhdGlvbi1nYWluPC9OSUNLPgorPEJMVVJCPk1vZHVsYXRpb24tZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBoYXNlcjErTEZPOjpPdXRwdXQtbWl4PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk91dHB1dC1taXg8L05JQ0s+Cis8QkxVUkI+T3V0cHV0LW1peC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBoYXNlcjErTEZPOjpTZWN0aW9uczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U2VjdGlvbnM8L05JQ0s+Cis8QkxVUkI+U2VjdGlvbnMuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kZWNpbWF0b3I6OkJpdC1kZXB0aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwyNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CaXQtZGVwdGg8L05JQ0s+Cis8QkxVUkI+Qml0LWRlcHRoLjwvQkxVUkI+Cis8REVGQVVMVD4yNDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRlY2ltYXRvcjo6U2FtcGxlLXJhdGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzQ0LDEsNDQxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U2FtcGxlLXJhdGU8L05JQ0s+Cis8QkxVUkI+U2FtcGxlLXJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjQ0MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2hhcGVyOjpXYXZlc2hhcGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5XYXZlc2hhcGU8L05JQ0s+Cis8QkxVUkI+V2F2ZXNoYXBlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJpYW5nbGUtZmFzYy1vYTo6U2xvcGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TbG9wZTwvTklDSz4KKzxCTFVSQj5TbG9wZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJpYW5nbGUtZmNzYS1vYTo6RnJlcXVlbno8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsOTE4NzUsMjIwNTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbno8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbnouPC9CTFVSQj4KKzxERUZBVUxUPjQ0MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyaWFuZ2xlLWZjc2Mtb2E6OkZyZXF1ZW56PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDkxODc1LDIyMDUwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW56PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW56LjwvQkxVUkI+Cis8REVGQVVMVD40NDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmlhbmdsZS1mY3NjLW9hOjpTbG9wZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNsb3BlPC9OSUNLPgorPEJMVVJCPlNsb3BlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kakZsYW5nZXI6OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMTAwLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRqRmxhbmdlcjo6TEZPLWRlcHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TEZPLWRlcHRoPC9OSUNLPgorPEJMVVJCPkxGTy1kZXB0aC48L0JMVVJCPgorPERFRkFVTFQ+NDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRqRmxhbmdlcjo6TEZPLXBlcmlvZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxLDMyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxGTy1wZXJpb2Q8L05JQ0s+Cis8QkxVUkI+TEZPLXBlcmlvZC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRqRmxhbmdlcjo6TEZPLXN5bmM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TEZPLXN5bmM8L05JQ0s+Cis8QkxVUkI+TEZPLXN5bmMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWltcDo6R2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTkwLDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkdhaW48L05JQ0s+Cis8QkxVUkI+R2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWltcDo6SGlnaC1sYXRlbmN5LW1vZGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SGlnaC1sYXRlbmN5LW1vZGU8L05JQ0s+Cis8QkxVUkI+SGlnaC1sYXRlbmN5LW1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1pbXA6OkltcHVsc2UtSUQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDIxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkltcHVsc2UtSUQ8L05JQ0s+Cis8QkxVUkI+SW1wdWxzZS1JRC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWltcDo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZHluYW1pY3MtbTo6QXR0YWNrLS1tcy08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzQsNTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkF0dGFjay0tbXMtPC9OSUNLPgorPEJMVVJCPkF0dGFjay0tbXMtLjwvQkxVUkI+Cis8REVGQVVMVD4xMjg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZHluYW1pY3MtbTo6RW52ZWxvcGUtVm9sdW1lLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy02MCwyMF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+RW52ZWxvcGUtVm9sdW1lLS1kQi08L05JQ0s+Cis8QkxVUkI+RW52ZWxvcGUtVm9sdW1lLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZHluYW1pY3MtbTo6RnVuY3Rpb248L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDE0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZ1bmN0aW9uPC9OSUNLPgorPEJMVVJCPkZ1bmN0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWR5bmFtaWNzLW06OkdhaW4tQWRqdXN0bWVudC0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkdhaW4tQWRqdXN0bWVudC0tZEItPC9OSUNLPgorPEJMVVJCPkdhaW4tQWRqdXN0bWVudC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWR5bmFtaWNzLW06Ok1ha2V1cC1HYWluLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NYWtldXAtR2Fpbi0tZEItPC9OSUNLPgorPEJMVVJCPk1ha2V1cC1HYWluLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZHluYW1pY3MtbTo6T2Zmc2V0LUdhaW4tLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk9mZnNldC1HYWluLS1kQi08L05JQ0s+Cis8QkxVUkI+T2Zmc2V0LUdhaW4tLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1keW5hbWljcy1tOjpSZWxlYXNlLS1tcy08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzQsMTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWxlYXNlLS1tcy08L05JQ0s+Cis8QkxVUkI+UmVsZWFzZS0tbXMtLjwvQkxVUkI+Cis8REVGQVVMVD41MDI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS14ZmFkZTo6Q3Jvc3NmYWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkNyb3NzZmFkZTwvTklDSz4KKzxCTFVSQj5Dcm9zc2ZhZGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS14ZmFkZTQ6OkNyb3NzZmFkZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Dcm9zc2ZhZGU8L05JQ0s+Cis8QkxVUkI+Q3Jvc3NmYWRlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXRyZW1vbG86OkRlcHRoLS0tLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVwdGgtLS0tPC9OSUNLPgorPEJMVVJCPkRlcHRoLS0tLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC10cmVtb2xvOjpGcmVxdWVuY3ktLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3ktLUh6LTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3ktLUh6LS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC10cmVtb2xvOjpHYWluLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5HYWluLS1kQi08L05JQ0s+Cis8QkxVUkI+R2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGl0Y2hTY2FsZTo6UGl0Y2gtY28tZWZmaWNpZW50PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDUsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5QaXRjaC1jby1lZmZpY2llbnQ8L05JQ0s+Cis8QkxVUkI+UGl0Y2gtY28tZWZmaWNpZW50LjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGl0Y2hTY2FsZTo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waXRjaFNjYWxlSFE6OlBpdGNoLWNvLWVmZmljaWVudDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw1LDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UGl0Y2gtY28tZWZmaWNpZW50PC9OSUNLPgorPEJMVVJCPlBpdGNoLWNvLWVmZmljaWVudC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBpdGNoU2NhbGVIUTo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12YWx2ZVJlY3Q6OkRpc3RvcnRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EaXN0b3J0aW9uPC9OSUNLPgorPEJMVVJCPkRpc3RvcnRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12YWx2ZVJlY3Q6OlNhZy1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNhZy1sZXZlbDwvTklDSz4KKzxCTFVSQj5TYWctbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcGlua25vaXNlOjpGcmFjdGFsLURpbWVuc2lvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyYWN0YWwtRGltZW5zaW9uPC9OSUNLPgorPEJMVVJCPkZyYWN0YWwtRGltZW5zaW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcGlua25vaXNlOjpOb2lzZS1MZXZlbC0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Tm9pc2UtTGV2ZWwtLWRCLTwvTklDSz4KKzxCTFVSQj5Ob2lzZS1MZXZlbC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4tOTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcGlua25vaXNlOjpTaWduYWwtTGV2ZWwtLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTkwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlNpZ25hbC1MZXZlbC0tZEItPC9OSUNLPgorPEJMVVJCPlNpZ25hbC1MZXZlbC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaW50ZXJwb2xhdG9yOjpDb250cm9sLUlucHV0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkNvbnRyb2wtSW5wdXQ8L05JQ0s+Cis8QkxVUkI+Q29udHJvbC1JbnB1dC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpCYW5kLTEtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMS1nYWluPC9OSUNLPgorPEJMVVJCPkJhbmQtMS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpCYW5kLTItZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMi1nYWluPC9OSUNLPgorPEJMVVJCPkJhbmQtMi1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpCYW5kLTMtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMy1nYWluPC9OSUNLPgorPEJMVVJCPkJhbmQtMy1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEZWxheTEtZmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTEtZmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RGVsYXkxLWZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEZWxheTEtbGVuZ3RoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXkxLWxlbmd0aDwvTklDSz4KKzxCTFVSQj5EZWxheTEtbGVuZ3RoLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEZWxheTEtd2V0bmVzczwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbGF5MS13ZXRuZXNzPC9OSUNLPgorPEJMVVJCPkRlbGF5MS13ZXRuZXNzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEZWxheTItZmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTItZmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RGVsYXkyLWZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEZWxheTItbGVuZ3RoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXkyLWxlbmd0aDwvTklDSz4KKzxCTFVSQj5EZWxheTItbGVuZ3RoLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEZWxheTItd2V0bmVzczwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbGF5Mi13ZXRuZXNzPC9OSUNLPgorPEJMVVJCPkRlbGF5Mi13ZXRuZXNzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEZWxheTMtZmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTMtZmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RGVsYXkzLWZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEZWxheTMtbGVuZ3RoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXkzLWxlbmd0aDwvTklDSz4KKzxCTFVSQj5EZWxheTMtbGVuZ3RoLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEZWxheTMtd2V0bmVzczwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbGF5My13ZXRuZXNzPC9OSUNLPgorPEJMVVJCPkRlbGF5My13ZXRuZXNzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEaXN0MS1kcml2ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwzXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRpc3QxLWRyaXZlPC9OSUNLPgorPEJMVVJCPkRpc3QxLWRyaXZlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEaXN0Mi1kcml2ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwzXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRpc3QyLWRyaXZlPC9OSUNLPgorPEJMVVJCPkRpc3QyLWRyaXZlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpEaXN0My1kcml2ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwzXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRpc3QzLWRyaXZlPC9OSUNLPgorPEJMVVJCPkRpc3QzLWRyaXZlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpGaWx0MS1MRk8xLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAwLDUwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0MS1MRk8xLWxldmVsPC9OSUNLPgorPEJMVVJCPkZpbHQxLUxGTzEtbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6OkZpbHQxLUxGTzItbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy01MDAsNTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHQxLUxGTzItbGV2ZWw8L05JQ0s+Cis8QkxVUkI+RmlsdDEtTEZPMi1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6RmlsdDEtZnJlcTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw4MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHQxLWZyZXE8L05JQ0s+Cis8QkxVUkI+RmlsdDEtZnJlcS48L0JMVVJCPgorPERFRkFVTFQ+NDQwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpGaWx0MS1xPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdDEtcTwvTklDSz4KKzxCTFVSQj5GaWx0MS1xLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpGaWx0MS1yZXNvbmFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0MS1yZXNvbmFuY2U8L05JQ0s+Cis8QkxVUkI+RmlsdDEtcmVzb25hbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpGaWx0MS10eXBlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHQxLXR5cGU8L05JQ0s+Cis8QkxVUkI+RmlsdDEtdHlwZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6RmlsdDItTEZPMS1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTUwMCw1MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdDItTEZPMS1sZXZlbDwvTklDSz4KKzxCTFVSQj5GaWx0Mi1MRk8xLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpGaWx0Mi1MRk8yLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAwLDUwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0Mi1MRk8yLWxldmVsPC9OSUNLPgorPEJMVVJCPkZpbHQyLUxGTzItbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6OkZpbHQyLWZyZXE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsODAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0Mi1mcmVxPC9OSUNLPgorPEJMVVJCPkZpbHQyLWZyZXEuPC9CTFVSQj4KKzxERUZBVUxUPjQ0MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6RmlsdDItcTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHQyLXE8L05JQ0s+Cis8QkxVUkI+RmlsdDItcS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6RmlsdDItcmVzb25hbmNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdDItcmVzb25hbmNlPC9OSUNLPgorPEJMVVJCPkZpbHQyLXJlc29uYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6RmlsdDItdHlwZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0Mi10eXBlPC9OSUNLPgorPEJMVVJCPkZpbHQyLXR5cGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6OkZpbHQzLUxGTzEtbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy01MDAsNTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHQzLUxGTzEtbGV2ZWw8L05JQ0s+Cis8QkxVUkI+RmlsdDMtTEZPMS1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6RmlsdDMtTEZPMi1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTUwMCw1MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdDMtTEZPMi1sZXZlbDwvTklDSz4KKzxCTFVSQj5GaWx0My1MRk8yLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpGaWx0My1mcmVxPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDgwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdDMtZnJlcTwvTklDSz4KKzxCTFVSQj5GaWx0My1mcmVxLjwvQkxVUkI+Cis8REVGQVVMVD40NDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6OkZpbHQzLXE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWx0My1xPC9OSUNLPgorPEJMVVJCPkZpbHQzLXEuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6OkZpbHQzLXJlc29uYW5jZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbHQzLXJlc29uYW5jZTwvTklDSz4KKzxCTFVSQj5GaWx0My1yZXNvbmFuY2UuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6OkZpbHQzLXR5cGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsdDMtdHlwZTwvTklDSz4KKzxCTFVSQj5GaWx0My10eXBlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpJbnB1dC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5wdXQtZ2FpbjwvTklDSz4KKzxCTFVSQj5JbnB1dC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpMRk8xLWZyZXE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MRk8xLWZyZXE8L05JQ0s+Cis8QkxVUkI+TEZPMS1mcmVxLjwvQkxVUkI+Cis8REVGQVVMVD4yNTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6OkxGTzEtd2F2ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MRk8xLXdhdmU8L05JQ0s+Cis8QkxVUkI+TEZPMS13YXZlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpMRk8yLWZyZXE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MRk8yLWZyZXE8L05JQ0s+Cis8QkxVUkI+TEZPMi1mcmVxLjwvQkxVUkI+Cis8REVGQVVMVD4yNTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6OkxGTzItd2F2ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MRk8yLXdhdmU8L05JQ0s+Cis8QkxVUkI+TEZPMi13YXZlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpPc2MxLWZyZXE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Pc2MxLWZyZXE8L05JQ0s+Cis8QkxVUkI+T3NjMS1mcmVxLjwvQkxVUkI+Cis8REVGQVVMVD40NDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6Ok9zYzEtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk9zYzEtZ2FpbjwvTklDSz4KKzxCTFVSQj5Pc2MxLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPi03MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6T3NjMS13YXZlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk9zYzEtd2F2ZTwvTklDSz4KKzxCTFVSQj5Pc2MxLXdhdmUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6Ok9zYzItZnJlcTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw0MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk9zYzItZnJlcTwvTklDSz4KKzxCTFVSQj5Pc2MyLWZyZXEuPC9CTFVSQj4KKzxERUZBVUxUPjQ0MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6T3NjMi1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3NjMi1nYWluPC9OSUNLPgorPEJMVVJCPk9zYzItZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+LTcwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpPc2MyLXdhdmU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3NjMi13YXZlPC9OSUNLPgorPEJMVVJCPk9zYzItd2F2ZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6Uk0xLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5STTEtZ2FpbjwvTklDSz4KKzxCTFVSQj5STTEtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+LTcwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGVybWVzRmlsdGVyOjpSTTItZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJNMi1nYWluPC9OSUNLPgorPEJMVVJCPlJNMi1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4tNzA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1oZXJtZXNGaWx0ZXI6OlJNMy1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Uk0zLWdhaW48L05JQ0s+Cis8QkxVUkI+Uk0zLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPi03MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6UmluZ21vZC0xLWRlcHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmluZ21vZC0xLWRlcHRoPC9OSUNLPgorPEJMVVJCPlJpbmdtb2QtMS1kZXB0aC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6UmluZ21vZC0yLWRlcHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmluZ21vZC0yLWRlcHRoPC9OSUNLPgorPEJMVVJCPlJpbmdtb2QtMi1kZXB0aC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6UmluZ21vZC0zLWRlcHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmluZ21vZC0zLWRlcHRoPC9OSUNLPgorPEJMVVJCPlJpbmdtb2QtMy1kZXB0aC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6WG92ZXItbG93ZXItZnJlcTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNTAsNjAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Yb3Zlci1sb3dlci1mcmVxPC9OSUNLPgorPEJMVVJCPlhvdmVyLWxvd2VyLWZyZXEuPC9CTFVSQj4KKzxERUZBVUxUPjE1MzcsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhlcm1lc0ZpbHRlcjo6WG92ZXItdXBwZXItZnJlcTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMTAwMCwxMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Yb3Zlci11cHBlci1mcmVxPC9OSUNLPgorPEJMVVJCPlhvdmVyLXVwcGVyLWZyZXEuPC9CTFVSQj4KKzxERUZBVUxUPjc3NTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1pbXB1bHNlLWZjOjpGcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1ib2RlU2hpZnRlcjo6RnJlcXVlbmN5LXNoaWZ0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDUwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LXNoaWZ0PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS1zaGlmdC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWJvZGVTaGlmdGVyOjpsYXRlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5sYXRlbmN5PC9OSUNLPgorPEJMVVJCPmxhdGVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpGdW5kYW1lbnRhbC1tYWduaXR1ZGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnVuZGFtZW50YWwtbWFnbml0dWRlPC9OSUNLPgorPEJMVVJCPkZ1bmRhbWVudGFsLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpwYXJhbS0xMHRoLWhhcm1vbmljLW1hZ25pdHVkZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0xMHRoLWhhcm1vbmljLW1hZ25pdHVkZTwvTklDSz4KKzxCTFVSQj5wYXJhbS0xMHRoLWhhcm1vbmljLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpwYXJhbS0ybmQtaGFybW9uaWMtbWFnbml0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTJuZC1oYXJtb25pYy1tYWduaXR1ZGU8L05JQ0s+Cis8QkxVUkI+cGFyYW0tMm5kLWhhcm1vbmljLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpwYXJhbS0zcmQtaGFybW9uaWMtbWFnbml0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTNyZC1oYXJtb25pYy1tYWduaXR1ZGU8L05JQ0s+Cis8QkxVUkI+cGFyYW0tM3JkLWhhcm1vbmljLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpwYXJhbS00dGgtaGFybW9uaWMtbWFnbml0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTR0aC1oYXJtb25pYy1tYWduaXR1ZGU8L05JQ0s+Cis8QkxVUkI+cGFyYW0tNHRoLWhhcm1vbmljLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpwYXJhbS01dGgtaGFybW9uaWMtbWFnbml0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTV0aC1oYXJtb25pYy1tYWduaXR1ZGU8L05JQ0s+Cis8QkxVUkI+cGFyYW0tNXRoLWhhcm1vbmljLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpwYXJhbS02dGgtaGFybW9uaWMtbWFnbml0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTZ0aC1oYXJtb25pYy1tYWduaXR1ZGU8L05JQ0s+Cis8QkxVUkI+cGFyYW0tNnRoLWhhcm1vbmljLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpwYXJhbS03dGgtaGFybW9uaWMtbWFnbml0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTd0aC1oYXJtb25pYy1tYWduaXR1ZGU8L05JQ0s+Cis8QkxVUkI+cGFyYW0tN3RoLWhhcm1vbmljLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpwYXJhbS04dGgtaGFybW9uaWMtbWFnbml0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTh0aC1oYXJtb25pYy1tYWduaXR1ZGU8L05JQ0s+Cis8QkxVUkI+cGFyYW0tOHRoLWhhcm1vbmljLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhhcm1vbmljR2VuOjpwYXJhbS05dGgtaGFybW9uaWMtbWFnbml0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTl0aC1oYXJtb25pYy1tYWduaXR1ZGU8L05JQ0s+Cis8QkxVUkI+cGFyYW0tOXRoLWhhcm1vbmljLW1hZ25pdHVkZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXB1bHNlLWZhcGMtb2E6OlB1bHNlLVdpZHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UHVsc2UtV2lkdGg8L05JQ0s+Cis8QkxVUkI+UHVsc2UtV2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXB1bHNlLWZjcGEtb2E6OkZyZXF1ZW56PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDkxODc1LDIyMDUwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyZXF1ZW56PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW56LjwvQkxVUkI+Cis8REVGQVVMVD40NDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1wdWxzZS1mY3BjLW9hOjpGcmVxdWVuejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw5MTg3NSwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuejwvTklDSz4KKzxCTFVSQj5GcmVxdWVuei48L0JMVVJCPgorPERFRkFVTFQ+NDQwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcHVsc2UtZmNwYy1vYTo6UHVsc2UtV2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5QdWxzZS1XaWR0aDwvTklDSz4KKzxCTFVSQj5QdWxzZS1XaWR0aC48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbG93cGFzcy1paXI6OkN1dG9mZi1GcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzQsNDEsMTk4NDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q3V0b2ZmLUZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5DdXRvZmYtRnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4yNDIyLDk3PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbG93cGFzcy1paXI6OlN0YWdlcy0yLXBvbGVzLXBlci1zdGFnZS08L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0YWdlcy0yLXBvbGVzLXBlci1zdGFnZS08L05JQ0s+Cis8QkxVUkI+U3RhZ2VzLTItcG9sZXMtcGVyLXN0YWdlLS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1yb3RzcGVhazo6SG9ybi1GcmVxdWVuY3ktLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Ib3JuLUZyZXF1ZW5jeS0tSHotPC9OSUNLPgorPEJMVVJCPkhvcm4tRnJlcXVlbmN5LS1Iei0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcm90c3BlYWs6Ok1pYy1EaXN0YW5jZS0tLS08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1pYy1EaXN0YW5jZS0tLS08L05JQ0s+Cis8QkxVUkI+TWljLURpc3RhbmNlLS0tLS48L0JMVVJCPgorPERFRkFVTFQ+MjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcm90c3BlYWs6OlJvdG9yLUZyZXF1ZW5jeS0tSHotPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJvdG9yLUZyZXF1ZW5jeS0tSHotPC9OSUNLPgorPEJMVVJCPlJvdG9yLUZyZXF1ZW5jeS0tSHotLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXJvdHNwZWFrOjpSb3Rvci1Ib3JuLU1peDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJvdG9yLUhvcm4tTWl4PC9OSUNLPgorPEJMVVJCPlJvdG9yLUhvcm4tTWl4LjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtcm90c3BlYWs6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsOTIwMF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD45MjAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXZpYnJhdG86OkRlcHRoLS0tLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZXB0aC0tLS08L05JQ0s+Cis8QkxVUkI+RGVwdGgtLS0tLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXZpYnJhdG86OkRyeS1MZXZlbC0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LUxldmVsLS1kQi08L05JQ0s+Cis8QkxVUkI+RHJ5LUxldmVsLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPi05MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC12aWJyYXRvOjpGcmVxdWVuY3ktLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3ktLUh6LTwvTklDSz4KKzxCTFVSQj5GcmVxdWVuY3ktLUh6LS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC12aWJyYXRvOjpXZXQtTGV2ZWwtLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTkwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldldC1MZXZlbC0tZEItPC9OSUNLPgorPEJMVVJCPldldC1MZXZlbC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXZpYnJhdG86OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNjMwMF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD42MzAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc3RlcE11eGVyOjpDcm9zc2ZhZGUtdGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q3Jvc3NmYWRlLXRpbWU8L05JQ0s+Cis8QkxVUkI+Q3Jvc3NmYWRlLXRpbWUuPC9CTFVSQj4KKzxERUZBVUxUPjUwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZmxhbmdlcjo6RGVsYXktYmFzZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxLDI1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbGF5LWJhc2U8L05JQ0s+Cis8QkxVUkI+RGVsYXktYmFzZS48L0JMVVJCPgorPERFRkFVTFQ+NiwzMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1mbGFuZ2VyOjpGZWVkYmFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZsYW5nZXI6OkxGTy1mcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDUsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxGTy1mcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+TEZPLWZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MCwzMzQzNzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZsYW5nZXI6Ok1heC1zbG93ZG93bjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NYXgtc2xvd2Rvd248L05JQ0s+Cis8QkxVUkI+TWF4LXNsb3dkb3duLjwvQkxVUkI+Cis8REVGQVVMVD4yLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbXA6OkFtcHMtZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDcwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFtcHMtZ2FpbjwvTklDSz4KKzxCTFVSQj5BbXBzLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kYWhkc3ItZyt0LWNvbnRyb2w6OkFia2xpbmd6ZWl0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BYmtsaW5nemVpdDwvTklDSz4KKzxCTFVSQj5BYmtsaW5nemVpdC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRhaGRzci1nK3QtY29udHJvbDo6QXVza2xpbmd6ZWl0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdXNrbGluZ3plaXQ8L05JQ0s+Cis8QkxVUkI+QXVza2xpbmd6ZWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGFoZHNyLWcrdC1jb250cm9sOjpFaW5zY2h3aW5nemVpdDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RWluc2Nod2luZ3plaXQ8L05JQ0s+Cis8QkxVUkI+RWluc2Nod2luZ3plaXQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kYWhkc3ItZyt0LWNvbnRyb2w6OkhhbHRld2VydDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkhhbHRld2VydDwvTklDSz4KKzxCTFVSQj5IYWx0ZXdlcnQuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kYWhkc3ItZyt0LWNvbnRyb2w6OkhhbHRlemVpdDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SGFsdGV6ZWl0PC9OSUNLPgorPEJMVVJCPkhhbHRlemVpdC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRhaGRzci1nK3QtY29udHJvbDo6VmVyei0tZ2VydW5nc3plaXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZlcnotLWdlcnVuZ3N6ZWl0PC9OSUNLPgorPEJMVVJCPlZlcnotLWdlcnVuZ3N6ZWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGFoZHNyLWNnK3QtY29udHJvbDo6QWJrbGluZ3plaXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFia2xpbmd6ZWl0PC9OSUNLPgorPEJMVVJCPkFia2xpbmd6ZWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGFoZHNyLWNnK3QtY29udHJvbDo6QXVza2xpbmd6ZWl0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdXNrbGluZ3plaXQ8L05JQ0s+Cis8QkxVUkI+QXVza2xpbmd6ZWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZGFoZHNyLWNnK3QtY29udHJvbDo6QXVzbC0tc2VyPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QXVzbC0tc2VyPC9OSUNLPgorPEJMVVJCPkF1c2wtLXNlci48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kYWhkc3ItY2crdC1jb250cm9sOjpFaW5zY2h3aW5nemVpdDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RWluc2Nod2luZ3plaXQ8L05JQ0s+Cis8QkxVUkI+RWluc2Nod2luZ3plaXQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kYWhkc3ItY2crdC1jb250cm9sOjpHYXR0ZXI8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5HYXR0ZXI8L05JQ0s+Cis8QkxVUkI+R2F0dGVyLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRhaGRzci1jZyt0LWNvbnRyb2w6OkhhbHRld2VydDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkhhbHRld2VydDwvTklDSz4KKzxCTFVSQj5IYWx0ZXdlcnQuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kYWhkc3ItY2crdC1jb250cm9sOjpIYWx0ZXplaXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkhhbHRlemVpdDwvTklDSz4KKzxCTFVSQj5IYWx0ZXplaXQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1kYWhkc3ItY2crdC1jb250cm9sOjpWZXJ6LS1nZXJ1bmdzemVpdDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmVyei0tZ2VydW5nc3plaXQ8L05JQ0s+Cis8QkxVUkI+VmVyei0tZ2VydW5nc3plaXQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TeW5jLVNhdy1WQ086OkV4cC1GTS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RXhwLUZNLWdhaW48L05JQ0s+Cis8QkxVUkI+RXhwLUZNLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TeW5jLVNhdy1WQ086OkxQLWZpbHRlcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxQLWZpbHRlcjwvTklDSz4KKzxCTFVSQj5MUC1maWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN5bmMtU2F3LVZDTzo6TGluLUZNLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MaW4tRk0tZ2FpbjwvTklDSz4KKzxCTFVSQj5MaW4tRk0tZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN5bmMtU2F3LVZDTzo6T2N0YXZlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bLTQsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5PY3RhdmU8L05JQ0s+Cis8QkxVUkI+T2N0YXZlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3luYy1TYXctVkNPOjpUdW5lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VHVuZTwvTklDSz4KKzxCTFVSQj5UdW5lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3luYy1SZWN0LVZDTzo6RXhwLUZNLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5FeHAtRk0tZ2FpbjwvTklDSz4KKzxCTFVSQj5FeHAtRk0tZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN5bmMtUmVjdC1WQ086OkxQLWZpbHRlcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxQLWZpbHRlcjwvTklDSz4KKzxCTFVSQj5MUC1maWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN5bmMtUmVjdC1WQ086Okxpbi1GTS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TGluLUZNLWdhaW48L05JQ0s+Cis8QkxVUkI+TGluLUZNLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TeW5jLVJlY3QtVkNPOjpPY3RhdmU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlstNCw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk9jdGF2ZTwvTklDSz4KKzxCTFVSQj5PY3RhdmUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TeW5jLVJlY3QtVkNPOjpUdW5lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VHVuZTwvTklDSz4KKzxCTFVSQj5UdW5lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3luYy1SZWN0LVZDTzo6V01vZC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+V01vZC1nYWluPC9OSUNLPgorPEJMVVJCPldNb2QtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN5bmMtUmVjdC1WQ086OldhdmVmb3JtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldhdmVmb3JtPC9OSUNLPgorPEJMVVJCPldhdmVmb3JtLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3luYy1UcmktVkNPOjpFeHAtRk0tZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkV4cC1GTS1nYWluPC9OSUNLPgorPEJMVVJCPkV4cC1GTS1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3luYy1UcmktVkNPOjpMUC1maWx0ZXI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MUC1maWx0ZXI8L05JQ0s+Cis8QkxVUkI+TFAtZmlsdGVyLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TeW5jLVRyaS1WQ086Okxpbi1GTS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TGluLUZNLWdhaW48L05JQ0s+Cis8QkxVUkI+TGluLUZNLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TeW5jLVRyaS1WQ086Ok9jdGF2ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Wy00LDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T2N0YXZlPC9OSUNLPgorPEJMVVJCPk9jdGF2ZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN5bmMtVHJpLVZDTzo6VHVuZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlR1bmU8L05JQ0s+Cis8QkxVUkI+VHVuZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN5bmMtVHJpLVZDTzo6V01vZC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+V01vZC1nYWluPC9OSUNLPgorPEJMVVJCPldNb2QtZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN5bmMtVHJpLVZDTzo6V2F2ZWZvcm08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+V2F2ZWZvcm08L05JQ0s+Cis8QkxVUkI+V2F2ZWZvcm0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1id3hvdmVyLWlpcjo6Q3V0b2ZmLUZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNCw0MSwxOTg0NV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DdXRvZmYtRnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkN1dG9mZi1GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjM2LDExOTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1id3hvdmVyLWlpcjo6UmVzb25hbmNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEsMSw0MV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2U8L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDc1NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWJ1dHRsb3ctaWlyOjpDdXRvZmYtRnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0LDQxLDE5ODQ1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkN1dG9mZi1GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+Q3V0b2ZmLUZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MzYsMTE5NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWJ1dHRsb3ctaWlyOjpSZXNvbmFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMSwxLDQxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc29uYW5jZTwvTklDSz4KKzxCTFVSQj5SZXNvbmFuY2UuPC9CTFVSQj4KKzxERUZBVUxUPjAsNzU1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYnV0dGhpZ2gtaWlyOjpDdXRvZmYtRnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0LDQxLDE5ODQ1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkN1dG9mZi1GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+Q3V0b2ZmLUZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MzYsMTE5NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWJ1dHRoaWdoLWlpcjo6UmVzb25hbmNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEsMSw0MV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2U8L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDc1NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2hwZi0xOjpFeHAtRk0tZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5FeHAtRk0tZ2FpbjwvTklDSz4KKzxCTFVSQj5FeHAtRk0tZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2hwZi0xOjpGcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy02LDZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLU12Y2hwZi0xOjpJbnB1dC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNjAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5wdXQtZ2FpbjwvTklDSz4KKzxCTFVSQj5JbnB1dC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtTXZjaHBmLTE6Ok91dHB1dC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMTUsMTVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+T3V0cHV0LWdhaW48L05JQ0s+Cis8QkxVUkI+T3V0cHV0LWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmFja2VyLWdhYWNkY2lhLW9hOjpBdHRhY2stUmF0ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw5MTg3NSwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdHRhY2stUmF0ZTwvTklDSz4KKzxCTFVSQj5BdHRhY2stUmF0ZS48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJhY2tlci1nYWFjZGNpYS1vYTo6QXR0YWNrLVJhdGUtMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw5MTg3NSwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdHRhY2stUmF0ZS0xPC9OSUNLPgorPEJMVVJCPkF0dGFjay1SYXRlLTEuPC9CTFVSQj4KKzxERUZBVUxUPjEwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyYWNrZXItZ2FhY2RjaWEtb2E6OkRlY2F5LVJhdGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsOTE4NzUsMjIwNTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVjYXktUmF0ZTwvTklDSz4KKzxCTFVSQj5EZWNheS1SYXRlLjwvQkxVUkI+Cis8REVGQVVMVD4xMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmFja2VyLWdhYWNkY2lhLW9hOjpEZWNheS1SYXRlLTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsOTE4NzUsMjIwNTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVjYXktUmF0ZS0xPC9OSUNLPgorPEJMVVJCPkRlY2F5LVJhdGUtMS48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWRvdWJsZXI6OkRyeS1MZWZ0LVBvc2l0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LUxlZnQtUG9zaXRpb248L05JQ0s+Cis8QkxVUkI+RHJ5LUxlZnQtUG9zaXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZG91Ymxlcjo6RHJ5LUxldmVsLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy05MCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktTGV2ZWwtLWRCLTwvTklDSz4KKzxCTFVSQj5EcnktTGV2ZWwtLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1kb3VibGVyOjpEcnktUmlnaHQtUG9zaXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktUmlnaHQtUG9zaXRpb248L05JQ0s+Cis8QkxVUkI+RHJ5LVJpZ2h0LVBvc2l0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWRvdWJsZXI6OlBpdGNoLVRyYWNraW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UGl0Y2gtVHJhY2tpbmc8L05JQ0s+Cis8QkxVUkI+UGl0Y2gtVHJhY2tpbmcuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1kb3VibGVyOjpUaW1lLVRyYWNraW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGltZS1UcmFja2luZzwvTklDSz4KKzxCTFVSQj5UaW1lLVRyYWNraW5nLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZG91Ymxlcjo6V2V0LUxlZnQtUG9zaXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5XZXQtTGVmdC1Qb3NpdGlvbjwvTklDSz4KKzxCTFVSQj5XZXQtTGVmdC1Qb3NpdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1kb3VibGVyOjpXZXQtTGV2ZWwtLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTkwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldldC1MZXZlbC0tZEItPC9OSUNLPgorPEJMVVJCPldldC1MZXZlbC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWRvdWJsZXI6OldldC1SaWdodC1Qb3NpdGlvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldldC1SaWdodC1Qb3NpdGlvbjwvTklDSz4KKzxCTFVSQj5XZXQtUmlnaHQtUG9zaXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbXAtZ2NpYS1vYTo6VmVyc3QtLXJrdW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTYsOTZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmVyc3QtLXJrdW5nPC9OSUNLPgorPEJMVVJCPlZlcnN0LS1ya3VuZy48L0JMVVJCPgorPERFRkFVTFQ+LTk2PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMTY6OkNsb3NlZC1HYXRlLVZhbHVlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkNsb3NlZC1HYXRlLVZhbHVlPC9OSUNLPgorPEJMVVJCPkNsb3NlZC1HYXRlLVZhbHVlLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIxNjo6TG9vcC1TdGVwczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsMTZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TG9vcC1TdGVwczwvTklDSz4KKzxCTFVSQj5Mb29wLVN0ZXBzLjwvQkxVUkI+Cis8REVGQVVMVD4xNjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjE2OjpSZXNldC10by1WYWx1ZS1vbi1HYXRlLUNsb3NlLTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNldC10by1WYWx1ZS1vbi1HYXRlLUNsb3NlLTwvTklDSz4KKzxCTFVSQj5SZXNldC10by1WYWx1ZS1vbi1HYXRlLUNsb3NlLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjE2OjpWYWx1ZS1TdGVwLTA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0wPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMTY6OlZhbHVlLVN0ZXAtMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIxNjo6VmFsdWUtU3RlcC0xMDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTEwPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMTAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjE2OjpWYWx1ZS1TdGVwLTExPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xMS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMTY6OlZhbHVlLVN0ZXAtMTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0xMjwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTEyLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIxNjo6VmFsdWUtU3RlcC0xMzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTEzPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMTMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjE2OjpWYWx1ZS1TdGVwLTE0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xNC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMTY6OlZhbHVlLVN0ZXAtMTU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0xNTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTE1LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIxNjo6VmFsdWUtU3RlcC0yPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMjwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjE2OjpWYWx1ZS1TdGVwLTM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0zPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMTY6OlZhbHVlLVN0ZXAtNDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC00LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIxNjo6VmFsdWUtU3RlcC01PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjE2OjpWYWx1ZS1TdGVwLTY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC02PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMTY6OlZhbHVlLVN0ZXAtNzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC03LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIxNjo6VmFsdWUtU3RlcC04PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtODwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjE2OjpWYWx1ZS1TdGVwLTk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC05PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtOS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2MyOjpBdHRhY2stdGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMiw0MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QXR0YWNrLXRpbWU8L05JQ0s+Cis8QkxVUkI+QXR0YWNrLXRpbWUuPC9CTFVSQj4KKzxERUZBVUxUPjEwMSw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2MyOjpLbmVlLXJhZGl1czwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5LbmVlLXJhZGl1czwvTklDSz4KKzxCTFVSQj5LbmVlLXJhZGl1cy48L0JMVVJCPgorPERFRkFVTFQ+MywyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjMjo6TWFrZXVwLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TWFrZXVwLWdhaW48L05JQ0s+Cis8QkxVUkI+TWFrZXVwLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzI6OlJhdGlvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJhdGlvPC9OSUNLPgorPEJMVVJCPlJhdGlvLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2MyOjpSZWxlYXNlLXRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIsODAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlbGVhc2UtdGltZTwvTklDSz4KKzxCTFVSQj5SZWxlYXNlLXRpbWUuPC9CTFVSQj4KKzxERUZBVUxUPjQwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjMjo6VGhyZXNob2xkLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMzAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UaHJlc2hvbGQtbGV2ZWw8L05JQ0s+Cis8QkxVUkI+VGhyZXNob2xkLWxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZHlzb25Db21wcmVzczo6Q29tcHJlc3Npb24tcmF0aW88L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Db21wcmVzc2lvbi1yYXRpbzwvTklDSz4KKzxCTFVSQj5Db21wcmVzc2lvbi1yYXRpby48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZHlzb25Db21wcmVzczo6RmFzdC1jb21wcmVzc2lvbi1yYXRpbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZhc3QtY29tcHJlc3Npb24tcmF0aW88L05JQ0s+Cis8QkxVUkI+RmFzdC1jb21wcmVzc2lvbi1yYXRpby48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZHlzb25Db21wcmVzczo6UGVhay1saW1pdDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTMwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UGVhay1saW1pdDwvTklDSz4KKzxCTFVSQj5QZWFrLWxpbWl0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZHlzb25Db21wcmVzczo6UmVsZWFzZS10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVsZWFzZS10aW1lPC9OSUNLPgorPEJMVVJCPlJlbGVhc2UtdGltZS48L0JMVVJCPgorPERFRkFVTFQ+MCwyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWRlY2F5OjpEZWNheS1UaW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWNheS1UaW1lPC9OSUNLPgorPEJMVVJCPkRlY2F5LVRpbWUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1hbGlhczo6QWxpYXNpbmctbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BbGlhc2luZy1sZXZlbDwvTklDSz4KKzxCTFVSQj5BbGlhc2luZy1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNvb3Blckxvb3Blcjo6Q3ljbGUtTGVuZ3RoLU91dDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkN5Y2xlLUxlbmd0aC1PdXQ8L05JQ0s+Cis8QkxVUkI+Q3ljbGUtTGVuZ3RoLU91dC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNvb3Blckxvb3Blcjo6RHJ5LUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LUxldmVsPC9OSUNLPgorPEJMVVJCPkRyeS1MZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNvb3Blckxvb3Blcjo6RmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNvb3Blckxvb3Blcjo6RnJlZS1TYW1wbGUtTWVtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+RnJlZS1TYW1wbGUtTWVtPC9OSUNLPgorPEJMVVJCPkZyZWUtU2FtcGxlLU1lbS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNvb3Blckxvb3Blcjo6TG9vcC1MZW5ndGgtT3V0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+TG9vcC1MZW5ndGgtT3V0PC9OSUNLPgorPEJMVVJCPkxvb3AtTGVuZ3RoLU91dC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNvb3Blckxvb3Blcjo6TG9vcC1Qb3NpdGlvbi1PdXQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5Mb29wLVBvc2l0aW9uLU91dDwvTklDSz4KKzxCTFVSQj5Mb29wLVBvc2l0aW9uLU91dC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNvb3Blckxvb3Blcjo6TXVsdGktQ29udHJvbDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMTI3XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk11bHRpLUNvbnRyb2w8L05JQ0s+Cis8QkxVUkI+TXVsdGktQ29udHJvbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNvb3Blckxvb3Blcjo6TXVsdGlDdHJsLTEwczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMTJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TXVsdGlDdHJsLTEwczwvTklDSz4KKzxCTFVSQj5NdWx0aUN0cmwtMTBzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU29vcGVyTG9vcGVyOjpRdWFudGl6ZU1vZGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjw9IEdfTUlOSU5UPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UXVhbnRpemVNb2RlPC9OSUNLPgorPEJMVVJCPlF1YW50aXplTW9kZS48L0JMVVJCPgorPERFRkFVTFQ+LTIxNDc0ODM2NDg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Tb29wZXJMb29wZXI6OlJhdGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy00LDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmF0ZTwvTklDSz4KKzxCTFVSQj5SYXRlLjwvQkxVUkI+Cis8REVGQVVMVD4tNDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNvb3Blckxvb3Blcjo6UmVkb1RhcE1vZGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjw9IEdfTUlOSU5UPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVkb1RhcE1vZGU8L05JQ0s+Cis8QkxVUkI+UmVkb1RhcE1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPi0yMTQ3NDgzNjQ4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU29vcGVyTG9vcGVyOjpSb3VuZE1vZGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjw9IEdfTUlOSU5UPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Um91bmRNb2RlPC9OSUNLPgorPEJMVVJCPlJvdW5kTW9kZS48L0JMVVJCPgorPERFRkFVTFQ+LTIxNDc0ODM2NDg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Tb29wZXJMb29wZXI6OlNjcmF0Y2gtRGVzdGluYXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TY3JhdGNoLURlc3RpbmF0aW9uPC9OSUNLPgorPEJMVVJCPlNjcmF0Y2gtRGVzdGluYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Tb29wZXJMb29wZXI6OlN0YXRlLU91dHB1dDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+U3RhdGUtT3V0cHV0PC9OSUNLPgorPEJMVVJCPlN0YXRlLU91dHB1dC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU29vcGVyTG9vcGVyOjpUYXAtRGVsYXktVHJpZ2dlcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRhcC1EZWxheS1UcmlnZ2VyPC9OSUNLPgorPEJMVVJCPlRhcC1EZWxheS1UcmlnZ2VyLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU29vcGVyTG9vcGVyOjpUb3RhbC1TYW1wbGUtTWVtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+VG90YWwtU2FtcGxlLU1lbTwvTklDSz4KKzxCTFVSQj5Ub3RhbC1TYW1wbGUtTWVtLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU29vcGVyTG9vcGVyOjpUcmlnZ2VyLVRocmVzaG9sZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRyaWdnZXItVGhyZXNob2xkPC9OSUNLPgorPEJMVVJCPlRyaWdnZXItVGhyZXNob2xkLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU29vcGVyTG9vcGVyOjpXZXQtTGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5XZXQtTGV2ZWw8L05JQ0s+Cis8QkxVUkI+V2V0LUxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmxldmVsLW1vbm86OkN1cnJlbnQtTXVsdGlwbGllcjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+Q3VycmVudC1NdWx0aXBsaWVyPC9OSUNLPgorPEJMVVJCPkN1cnJlbnQtTXVsdGlwbGllci48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZsZXZlbC1tb25vOjpMb29rLWFoZWFkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TG9vay1haGVhZDwvTklDSz4KKzxCTFVSQj5Mb29rLWFoZWFkLjwvQkxVUkI+Cis8REVGQVVMVD4yLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12bGV2ZWwtbW9ubzo6TWF4aW11bS1NdWx0aXBsaWVyPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1heGltdW0tTXVsdGlwbGllcjwvTklDSz4KKzxCTFVSQj5NYXhpbXVtLU11bHRpcGxpZXIuPC9CTFVSQj4KKzxERUZBVUxUPjEwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmxldmVsLW1vbm86OlN0cmVuZ3RoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3RyZW5ndGg8L05JQ0s+Cis8QkxVUkI+U3RyZW5ndGguPC9CTFVSQj4KKzxERUZBVUxUPjAsNzU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12bGV2ZWwtbW9ubzo6VW5kbzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlVuZG88L05JQ0s+Cis8QkxVUkI+VW5kby48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12bGV2ZWwtbW9ubzo6VXNlLU1heGltdW0tTXVsdGlwbGllcjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlVzZS1NYXhpbXVtLU11bHRpcGxpZXI8L05JQ0s+Cis8QkxVUkI+VXNlLU1heGltdW0tTXVsdGlwbGllci48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12bGV2ZWwtc3RlcmVvOjpDdXJyZW50LU11bHRpcGxpZXI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkN1cnJlbnQtTXVsdGlwbGllcjwvTklDSz4KKzxCTFVSQj5DdXJyZW50LU11bHRpcGxpZXIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12bGV2ZWwtc3RlcmVvOjpMb29rLWFoZWFkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TG9vay1haGVhZDwvTklDSz4KKzxCTFVSQj5Mb29rLWFoZWFkLjwvQkxVUkI+Cis8REVGQVVMVD4yLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12bGV2ZWwtc3RlcmVvOjpNYXhpbXVtLU11bHRpcGxpZXI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TWF4aW11bS1NdWx0aXBsaWVyPC9OSUNLPgorPEJMVVJCPk1heGltdW0tTXVsdGlwbGllci48L0JMVVJCPgorPERFRkFVTFQ+MTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12bGV2ZWwtc3RlcmVvOjpTdHJlbmd0aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0cmVuZ3RoPC9OSUNLPgorPEJMVVJCPlN0cmVuZ3RoLjwvQkxVUkI+Cis8REVGQVVMVD4wLDc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdmxldmVsLXN0ZXJlbzo6VW5kbzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlVuZG88L05JQ0s+Cis8QkxVUkI+VW5kby48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12bGV2ZWwtc3RlcmVvOjpVc2UtTWF4aW11bS1NdWx0aXBsaWVyPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VXNlLU1heGltdW0tTXVsdGlwbGllcjwvTklDSz4KKzxCTFVSQj5Vc2UtTWF4aW11bS1NdWx0aXBsaWVyLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFydGlmaWNpYWxMYXRlbmN5OjpEZWxheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheTwvTklDSz4KKzxCTFVSQj5EZWxheS48L0JMVVJCPgorPERFRkFVTFQ+MjUwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFydGlmaWNpYWxMYXRlbmN5OjpsYXRlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5sYXRlbmN5PC9OSUNLPgorPEJMVVJCPmxhdGVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyaXBsZVBhcmE6OkJhbmQtMS1iYW5kd2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTEtYmFuZHdpZHRoPC9OSUNLPgorPEJMVVJCPkJhbmQtMS1iYW5kd2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmlwbGVQYXJhOjpCYW5kLTEtZnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0LDQxLDIxNjA5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMS1mcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+QmFuZC0xLWZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MzYsODk2NzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyaXBsZVBhcmE6OkJhbmQtMS1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0xLWdhaW48L05JQ0s+Cis8QkxVUkI+QmFuZC0xLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmlwbGVQYXJhOjpCYW5kLTItYmFuZHdpZHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0yLWJhbmR3aWR0aDwvTklDSz4KKzxCTFVSQj5CYW5kLTItYmFuZHdpZHRoLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJpcGxlUGFyYTo6QmFuZC0yLWZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNCw0MSwyMTYwOV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTItZnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkJhbmQtMi1mcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjMwOCw3PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJpcGxlUGFyYTo6QmFuZC0yLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTItZ2FpbjwvTklDSz4KKzxCTFVSQj5CYW5kLTItZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyaXBsZVBhcmE6OkJhbmQtMy1iYW5kd2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTMtYmFuZHdpZHRoPC9OSUNLPgorPEJMVVJCPkJhbmQtMy1iYW5kd2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmlwbGVQYXJhOjpCYW5kLTMtZnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0LDQxLDIxNjA5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMy1mcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+QmFuZC0zLWZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MjU4Miw3NzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRyaXBsZVBhcmE6OkJhbmQtMy1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0zLWdhaW48L05JQ0s+Cis8QkxVUkI+QmFuZC0zLWdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmlwbGVQYXJhOjpIaWdoLXNoZWx2aW5nLWZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNCw0MSwyMTYwOV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5IaWdoLXNoZWx2aW5nLWZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5IaWdoLXNoZWx2aW5nLWZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MjE2MDk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmlwbGVQYXJhOjpIaWdoLXNoZWx2aW5nLWdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5IaWdoLXNoZWx2aW5nLWdhaW48L05JQ0s+Cis8QkxVUkI+SGlnaC1zaGVsdmluZy1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJpcGxlUGFyYTo6SGlnaC1zaGVsdmluZy1zbG9wZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkhpZ2gtc2hlbHZpbmctc2xvcGU8L05JQ0s+Cis8QkxVUkI+SGlnaC1zaGVsdmluZy1zbG9wZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJpcGxlUGFyYTo6TG93LXNoZWx2aW5nLWZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNCw0MSwyMTYwOV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Mb3ctc2hlbHZpbmctZnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkxvdy1zaGVsdmluZy1mcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjQsNDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10cmlwbGVQYXJhOjpMb3ctc2hlbHZpbmctZ2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDMwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkxvdy1zaGVsdmluZy1nYWluPC9OSUNLPgorPEJMVVJCPkxvdy1zaGVsdmluZy1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdHJpcGxlUGFyYTo6TG93LXNoZWx2aW5nLXNsb3BlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TG93LXNoZWx2aW5nLXNsb3BlPC9OSUNLPgorPEJMVVJCPkxvdy1zaGVsdmluZy1zbG9wZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmV2ZGVsYXk6OkNyb3NzZmFkZS1zYW1wbGVzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw1MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkNyb3NzZmFkZS1zYW1wbGVzPC9OSUNLPgorPEJMVVJCPkNyb3NzZmFkZS1zYW1wbGVzLjwvQkxVUkI+Cis8REVGQVVMVD4xMjUwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmV2ZGVsYXk6OkRlbGF5LVRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZWxheS1UaW1lPC9OSUNLPgorPEJMVVJCPkRlbGF5LVRpbWUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1yZXZkZWxheTo6RHJ5LUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktTGV2ZWw8L05JQ0s+Cis8QkxVUkI+RHJ5LUxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcmV2ZGVsYXk6OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+RmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1yZXZkZWxheTo6V2V0LUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5XZXQtTGV2ZWw8L05JQ0s+Cis8QkxVUkI+V2V0LUxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplcjo6QmFuZC0xLUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNDAsMjgwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMS1GcmVxLS1Iei08L05JQ0s+Cis8QkxVUkI+QmFuZC0xLUZyZXEtLUh6LS48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplcjo6QmFuZC0xLUdhaW4tLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTUwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMS1HYWluLS1kQi08L05JQ0s+Cis8QkxVUkI+QmFuZC0xLUdhaW4tLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXI6OkJhbmQtMi1GcmVxLS1Iei08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEwMCw1MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0yLUZyZXEtLUh6LTwvTklDSz4KKzxCTFVSQj5CYW5kLTItRnJlcS0tSHotLjwvQkxVUkI+Cis8REVGQVVMVD4yMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyOjpCYW5kLTItR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0yLUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5CYW5kLTItR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplcjo6QmFuZC0zLUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMjAwLDEwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0zLUZyZXEtLUh6LTwvTklDSz4KKzxCTFVSQj5CYW5kLTMtRnJlcS0tSHotLjwvQkxVUkI+Cis8REVGQVVMVD40MDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyOjpCYW5kLTMtR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0zLUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5CYW5kLTMtR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplcjo6QmFuZC00LUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNDAwLDI4MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC00LUZyZXEtLUh6LTwvTklDSz4KKzxCTFVSQj5CYW5kLTQtRnJlcS0tSHotLjwvQkxVUkI+Cis8REVGQVVMVD4xMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplcjo6QmFuZC00LUdhaW4tLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTUwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNC1HYWluLS1kQi08L05JQ0s+Cis8QkxVUkI+QmFuZC00LUdhaW4tLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXI6OkJhbmQtNS1GcmVxLS1Iei08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEwMDAsNTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTUtRnJlcS0tSHotPC9OSUNLPgorPEJMVVJCPkJhbmQtNS1GcmVxLS1Iei0uPC9CTFVSQj4KKzxERUZBVUxUPjMwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyOjpCYW5kLTUtR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC01LUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5CYW5kLTUtR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplcjo6QmFuZC02LUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMzAwMCw5MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNi1GcmVxLS1Iei08L05JQ0s+Cis8QkxVUkI+QmFuZC02LUZyZXEtLUh6LS48L0JMVVJCPgorPERFRkFVTFQ+NjAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXI6OkJhbmQtNi1HYWluLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy01MCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTYtR2Fpbi0tZEItPC9OSUNLPgorPEJMVVJCPkJhbmQtNi1HYWluLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyOjpCYW5kLTctRnJlcS0tSHotPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls2MDAwLDE4MDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNy1GcmVxLS1Iei08L05JQ0s+Cis8QkxVUkI+QmFuZC03LUZyZXEtLUh6LS48L0JMVVJCPgorPERFRkFVTFQ+MTIwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZXF1YWxpemVyOjpCYW5kLTctR2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNTAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC03LUdhaW4tLWRCLTwvTklDSz4KKzxCTFVSQj5CYW5kLTctR2Fpbi0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWVxdWFsaXplcjo6QmFuZC04LUZyZXEtLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMTAwMDAsMjAwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC04LUZyZXEtLUh6LTwvTklDSz4KKzxCTFVSQj5CYW5kLTgtRnJlcS0tSHotLjwvQkxVUkI+Cis8REVGQVVMVD4xNTAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1lcXVhbGl6ZXI6OkJhbmQtOC1HYWluLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy01MCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTgtR2Fpbi0tZEItPC9OSUNLPgorPEJMVVJCPkJhbmQtOC1HYWluLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1yZXRyb0ZsYW5nZTo6QXZlcmFnZS1zdGFsbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BdmVyYWdlLXN0YWxsPC9OSUNLPgorPEJMVVJCPkF2ZXJhZ2Utc3RhbGwuPC9CTFVSQj4KKzxERUZBVUxUPjIsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXJldHJvRmxhbmdlOjpGbGFuZ2UtZnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDUsOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GbGFuZ2UtZnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkZsYW5nZS1mcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbWJpc29uaWNzLW1vbm8tcGFubmVyOjpBemltdXRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMTgwLDE4MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BemltdXRoPC9OSUNLPgorPEJMVVJCPkF6aW11dGguPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbWJpc29uaWNzLW1vbm8tcGFubmVyOjpFbGV2YXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy05MCw5MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5FbGV2YXRpb248L05JQ0s+Cis8QkxVUkI+RWxldmF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1iaXNvbmljcy1zdGVyby1wYW5uZXI6OkF6aW11dGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xODAsMTgwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkF6aW11dGg8L05JQ0s+Cis8QkxVUkI+QXppbXV0aC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUFtYmlzb25pY3Mtc3Rlcm8tcGFubmVyOjpFbGV2YXRpb248L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy05MCw5MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5FbGV2YXRpb248L05JQ0s+Cis8QkxVUkI+RWxldmF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1iaXNvbmljcy1zdGVyby1wYW5uZXI6OldpZHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOTAsOTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+V2lkdGg8L05JQ0s+Cis8QkxVUkI+V2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjkwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1iaXNvbmljcy1yb3RhdG9yOjpBbmdsZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTE4MCwxODBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QW5nbGU8L05JQ0s+Cis8QkxVUkI+QW5nbGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbWJpc29uaWNzLXNxdWFyZS1kZWNvZGVyOjpEaXN0YW5jZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwzMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EaXN0YW5jZTwvTklDSz4KKzxCTFVSQj5EaXN0YW5jZS48L0JMVVJCPgorPERFRkFVTFQ+MzA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbWJpc29uaWNzLXNxdWFyZS1kZWNvZGVyOjpGcm9udDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyb250PC9OSUNLPgorPEJMVVJCPkZyb250LjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUFtYmlzb25pY3Mtc3F1YXJlLWRlY29kZXI6OkxGLXJhdGlvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TEYtcmF0aW88L05JQ0s+Cis8QkxVUkI+TEYtcmF0aW8uPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbWJpc29uaWNzLWhleGFnb24tZGVjb2Rlcjo6RGlzdGFuY2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGlzdGFuY2U8L05JQ0s+Cis8QkxVUkI+RGlzdGFuY2UuPC9CTFVSQj4KKzxERUZBVUxUPjMwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1iaXNvbmljcy1oZXhhZ29uLWRlY29kZXI6OkZyb250PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJvbnQ8L05JQ0s+Cis8QkxVUkI+RnJvbnQuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1iaXNvbmljcy1oZXhhZ29uLWRlY29kZXI6OkxGLXJhdGlvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TEYtcmF0aW88L05JQ0s+Cis8QkxVUkI+TEYtcmF0aW8uPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1HMnJldmVyYjo6RGFtcGluZzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRhbXBpbmc8L05JQ0s+Cis8QkxVUkI+RGFtcGluZy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUcycmV2ZXJiOjpEcnktc291bmQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy04MCwwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRyeS1zb3VuZDwvTklDSz4KKzxCTFVSQj5Ecnktc291bmQuPC9CTFVSQj4KKzxERUZBVUxUPi04MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUcycmV2ZXJiOjpJbnB1dC1CVzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPklucHV0LUJXPC9OSUNLPgorPEJMVVJCPklucHV0LUJXLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRzJyZXZlcmI6OlJlZmxlY3Rpb25zPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstODAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWZsZWN0aW9uczwvTklDSz4KKzxCTFVSQj5SZWZsZWN0aW9ucy48L0JMVVJCPgorPERFRkFVTFQ+LTgwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRzJyZXZlcmI6OlJldmVyYi10YWlsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstODAsMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXZlcmItdGFpbDwvTklDSz4KKzxCTFVSQj5SZXZlcmItdGFpbC48L0JMVVJCPgorPERFRkFVTFQ+LTgwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRzJyZXZlcmI6OlJldmVyYi10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJldmVyYi10aW1lPC9OSUNLPgorPEJMVVJCPlJldmVyYi10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRzJyZXZlcmI6OlJvb20tc2l6ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMTAsMTUwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJvb20tc2l6ZTwvTklDSz4KKzxCTFVSQj5Sb29tLXNpemUuPC9CTFVSQj4KKzxERUZBVUxUPjEwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYW1QaXRjaHNoaWZ0OjpCdWZmZXItc2l6ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsN108L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CdWZmZXItc2l6ZTwvTklDSz4KKzxCTFVSQj5CdWZmZXItc2l6ZS48L0JMVVJCPgorPERFRkFVTFQ+NDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFtUGl0Y2hzaGlmdDo6UGl0Y2gtc2hpZnQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMjUsNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5QaXRjaC1zaGlmdDwvTklDSz4KKzxCTFVSQj5QaXRjaC1zaGlmdC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWFtUGl0Y2hzaGlmdDo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1tb2REZWxheTo6QmFzZS1kZWxheTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhc2UtZGVsYXk8L05JQ0s+Cis8QkxVUkI+QmFzZS1kZWxheS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1hdXRvcGFuOjpEZXB0aC0tLS08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlcHRoLS0tLTwvTklDSz4KKzxCTFVSQj5EZXB0aC0tLS0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtYXV0b3Bhbjo6RnJlcXVlbmN5LS1Iei08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LS1Iei08L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LS1Iei0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtYXV0b3Bhbjo6R2Fpbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNzAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+R2Fpbi0tZEItPC9OSUNLPgorPEJMVVJCPkdhaW4tLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXJhdGVTaGlmdGVyOjpSYXRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNCw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJhdGU8L05JQ0s+Cis8QkxVUkI+UmF0ZS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUZpbHRlcjo6RnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxMCwyMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4xMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUZpbHRlcjo6SW5lcnRpYTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNSwxMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5lcnRpYTwvTklDSz4KKzxCTFVSQj5JbmVydGlhLjwvQkxVUkI+Cis8REVGQVVMVD41PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRmlsdGVyOjpNb2RlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1vZGU8L05JQ0s+Cis8QkxVUkI+TW9kZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUZpbHRlcjo6UmVzb25hbmNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDcwNywyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNvbmFuY2U8L05JQ0s+Cis8QkxVUkI+UmVzb25hbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDcwNzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUZsYW5nZXI6OkFtb3VudDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFtb3VudDwvTklDSz4KKzxCTFVSQj5BbW91bnQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1GbGFuZ2VyOjpGZWVkYmFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTAsOTksMCw5OV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+LTAsOTk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1GbGFuZ2VyOjpNaW5pbXVtLWRlbGF5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TWluaW11bS1kZWxheTwvTklDSz4KKzxCTFVSQj5NaW5pbXVtLWRlbGF5LjwvQkxVUkI+Cis8REVGQVVMVD4wLDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1GbGFuZ2VyOjpNb2R1bGF0aW9uLWRlcHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kdWxhdGlvbi1kZXB0aDwvTklDSz4KKzxCTFVSQj5Nb2R1bGF0aW9uLWRlcHRoLjwvQkxVUkI+Cis8REVGQVVMVD4wLDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1GbGFuZ2VyOjpNb2R1bGF0aW9uLXJhdGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDEsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW9kdWxhdGlvbi1yYXRlPC9OSUNLPgorPEJMVVJCPk1vZHVsYXRpb24tcmF0ZS48L0JMVVJCPgorPERFRkFVTFQ+MCwwMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUZsYW5nZXI6OlJlc2V0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzZXQ8L05JQ0s+Cis8QkxVUkI+UmVzZXQuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRmxhbmdlcjo6U3RlcmVvLXBoYXNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDM2MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TdGVyZW8tcGhhc2U8L05JQ0s+Cis8QkxVUkI+U3RlcmVvLXBoYXNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUmV2ZXJiOjpBbW91bnQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5BbW91bnQ8L05JQ0s+Cis8QkxVUkI+QW1vdW50LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUmV2ZXJiOjpEZWNheS10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDUsMTVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVjYXktdGltZTwvTklDSz4KKzxCTFVSQj5EZWNheS10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1SZXZlcmI6OkRpZmZ1c2lvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRpZmZ1c2lvbjwvTklDSz4KKzxCTFVSQj5EaWZmdXNpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1SZXZlcmI6OkhpZ2gtRnJxLURhbXA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIwMDAsMjAwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SGlnaC1GcnEtRGFtcDwvTklDSz4KKzxCTFVSQj5IaWdoLUZycS1EYW1wLjwvQkxVUkI+Cis8REVGQVVMVD4yMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUmV2ZXJiOjpSb29tLXNpemU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDNdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Um9vbS1zaXplPC9OSUNLPgorPEJMVVJCPlJvb20tc2l6ZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVZpbnRhZ2VEZWxheTo6QW1vdW50PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QW1vdW50PC9OSUNLPgorPEJMVVJCPkFtb3VudC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVZpbnRhZ2VEZWxheTo6RmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GZWVkYmFjazwvTklDSz4KKzxCTFVSQj5GZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVZpbnRhZ2VEZWxheTo6TWVkaXVtPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1lZGl1bTwvTklDSz4KKzxCTFVSQj5NZWRpdW0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1WaW50YWdlRGVsYXk6Ok1peC1tb2RlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1peC1tb2RlPC9OSUNLPgorPEJMVVJCPk1peC1tb2RlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVmludGFnZURlbGF5OjpTdWJkaXZpZGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDE2XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN1YmRpdmlkZTwvTklDSz4KKzxCTFVSQj5TdWJkaXZpZGUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1WaW50YWdlRGVsYXk6OlRlbXBvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlszMCwzMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGVtcG88L05JQ0s+Cis8QkxVUkI+VGVtcG8uPC9CTFVSQj4KKzxERUZBVUxUPjMwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVmludGFnZURlbGF5OjpUaW1lLUw8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDE2XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRpbWUtTDwvTklDSz4KKzxCTFVSQj5UaW1lLUwuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1WaW50YWdlRGVsYXk6OlRpbWUtUjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsMTZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGltZS1SPC9OSUNLPgorPEJMVVJCPlRpbWUtUi48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVJvdGFyeVNwZWFrZXI6OlNwZWVkLU1vZGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3BlZWQtTW9kZTwvTklDSz4KKzxCTFVSQj5TcGVlZC1Nb2RlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUm90YXJ5U3BlYWtlcjo6VGFwLU9mZnNldDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRhcC1PZmZzZXQ8L05JQ0s+Cis8QkxVUkI+VGFwLU9mZnNldC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVJvdGFyeVNwZWFrZXI6OlRhcC1TcGFjaW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGFwLVNwYWNpbmc8L05JQ0s+Cis8QkxVUkI+VGFwLVNwYWNpbmcuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZXI6OkFtb3VudDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFtb3VudDwvTklDSz4KKzxCTFVSQj5BbW91bnQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZXI6OkNlbnRlci1GcmVxPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyMCwyMDAwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DZW50ZXItRnJlcTwvTklDSz4KKzxCTFVSQj5DZW50ZXItRnJlcS48L0JMVVJCPgorPERFRkFVTFQ+MjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZXI6OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMCw5OSwwLDk5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPkZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4tMCw5OTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlcjo6TW9kdWxhdGlvbi1kZXB0aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMDgwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Nb2R1bGF0aW9uLWRlcHRoPC9OSUNLPgorPEJMVVJCPk1vZHVsYXRpb24tZGVwdGguPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1waGFzZXI6Ok1vZHVsYXRpb24tcmF0ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMSwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Nb2R1bGF0aW9uLXJhdGU8L05JQ0s+Cis8QkxVUkI+TW9kdWxhdGlvbi1yYXRlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2VyOjpSZXNldDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc2V0PC9OSUNLPgorPEJMVVJCPlJlc2V0LjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXBoYXNlcjo6U3RlcmVvLXBoYXNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDM2MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TdGVyZW8tcGhhc2U8L05JQ0s+Cis8QkxVUkI+U3RlcmVvLXBoYXNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcGhhc2VyOjpwYXJhbS0tLVN0YWdlczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsMTJdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tLS1TdGFnZXM8L05JQ0s+Cis8QkxVUkI+cGFyYW0tLS1TdGFnZXMuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1FcTo6cGFyYW0tMS1rSHo8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy00OCwyNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0xLWtIejwvTklDSz4KKzxCTFVSQj5wYXJhbS0xLWtIei48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUVxOjpwYXJhbS0xMjUtSHo8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy00OCwyNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0xMjUtSHo8L05JQ0s+Cis8QkxVUkI+cGFyYW0tMTI1LUh6LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRXE6OnBhcmFtLTE2LWtIejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTQ4LDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTE2LWtIejwvTklDSz4KKzxCTFVSQj5wYXJhbS0xNi1rSHouPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1FcTo6cGFyYW0tMi1rSHo8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy00OCwyNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0yLWtIejwvTklDSz4KKzxCTFVSQj5wYXJhbS0yLWtIei48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUVxOjpwYXJhbS0yNTAtSHo8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy00OCwyNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0yNTAtSHo8L05JQ0s+Cis8QkxVUkI+cGFyYW0tMjUwLUh6LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRXE6OnBhcmFtLTMxLUh6PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDgsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMzEtSHo8L05JQ0s+Cis8QkxVUkI+cGFyYW0tMzEtSHouPC9CTFVSQj4KKzxERUZBVUxUPi0zMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUVxOjpwYXJhbS00LWtIejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTQ4LDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTQta0h6PC9OSUNLPgorPEJMVVJCPnBhcmFtLTQta0h6LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRXE6OnBhcmFtLTUwMC1IejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTQ4LDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTUwMC1IejwvTklDSz4KKzxCTFVSQj5wYXJhbS01MDAtSHouPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1FcTo6cGFyYW0tNjMtSHo8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy00OCwyNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS02My1IejwvTklDSz4KKzxCTFVSQj5wYXJhbS02My1Iei48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUVxOjpwYXJhbS04LWtIejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTQ4LDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTgta0h6PC9OSUNLPgorPEJMVVJCPnBhcmFtLTgta0h6LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRXEyeDI6OnBhcmFtLTEta0h6PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDgsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMS1rSHo8L05JQ0s+Cis8QkxVUkI+cGFyYW0tMS1rSHouPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1FcTJ4Mjo6cGFyYW0tMTI1LUh6PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDgsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMTI1LUh6PC9OSUNLPgorPEJMVVJCPnBhcmFtLTEyNS1Iei48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUVxMngyOjpwYXJhbS0xNi1rSHo8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy00OCwyNF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0xNi1rSHo8L05JQ0s+Cis8QkxVUkI+cGFyYW0tMTYta0h6LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRXEyeDI6OnBhcmFtLTIta0h6PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDgsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMi1rSHo8L05JQ0s+Cis8QkxVUkI+cGFyYW0tMi1rSHouPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1FcTJ4Mjo6cGFyYW0tMjUwLUh6PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDgsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tMjUwLUh6PC9OSUNLPgorPEJMVVJCPnBhcmFtLTI1MC1Iei48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUVxMngyOjpwYXJhbS0zMS1IejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTQ4LDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTMxLUh6PC9OSUNLPgorPEJMVVJCPnBhcmFtLTMxLUh6LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRXEyeDI6OnBhcmFtLTQta0h6PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDgsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tNC1rSHo8L05JQ0s+Cis8QkxVUkI+cGFyYW0tNC1rSHouPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1FcTJ4Mjo6cGFyYW0tNTAwLUh6PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDgsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tNTAwLUh6PC9OSUNLPgorPEJMVVJCPnBhcmFtLTUwMC1Iei48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUVxMngyOjpwYXJhbS02My1IejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTQ4LDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTYzLUh6PC9OSUNLPgorPEJMVVJCPnBhcmFtLTYzLUh6LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRXEyeDI6OnBhcmFtLTgta0h6PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDgsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFyYW0tOC1rSHo8L05JQ0s+Cis8QkxVUkI+cGFyYW0tOC1rSHouPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Db21wcmVzczo6YXR0YWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmF0dGFjazwvTklDSz4KKzxCTFVSQj5hdHRhY2suPC9CTFVSQj4KKzxERUZBVUxUPjAsMDAxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ29tcHJlc3M6OmdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Z2FpbjwvTklDSz4KKzxCTFVSQj5nYWluLjwvQkxVUkI+Cis8REVGQVVMVD42PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ29tcHJlc3M6OmtuZWUtcmFkaXVzPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmtuZWUtcmFkaXVzPC9OSUNLPgorPEJMVVJCPmtuZWUtcmFkaXVzLjwvQkxVUkI+Cis8REVGQVVMVD4zLDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ29tcHJlc3M6OnJhdGlvPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnJhdGlvPC9OSUNLPgorPEJMVVJCPnJhdGlvLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ29tcHJlc3M6OnJlbGVhc2U8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAxLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cmVsZWFzZTwvTklDSz4KKzxCTFVSQj5yZWxlYXNlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDUwMDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Db21wcmVzczo6dGhyZXNob2xkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMzAsNDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnRocmVzaG9sZDwvTklDSz4KKzxCTFVSQj50aHJlc2hvbGQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QYW46Om1vbm88L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5tb25vPC9OSUNLPgorPEJMVVJCPm1vbm8uPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFuOjpwYW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGFuPC9OSUNLPgorPEJMVVJCPnBhbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBhbjo6dDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxLDQwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnQ8L05JQ0s+Cis8QkxVUkI+dC48L0JMVVJCPgorPERFRkFVTFQ+MTAsMDc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGFuOjp3aWR0aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPndpZHRoPC9OSUNLPgorPEJMVVJCPndpZHRoLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUHJlYW1wSUlJOjpnYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmdhaW48L05JQ0s+Cis8QkxVUkI+Z2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVByZWFtcElJSTo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QcmVhbXBJSUk6OnRlbXBlcmF0dXJlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwNSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnRlbXBlcmF0dXJlPC9OSUNLPgorPEJMVVJCPnRlbXBlcmF0dXJlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1Mzc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUHJlYW1wSVY6OmJhc3M8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5iYXNzPC9OSUNLPgorPEJMVVJCPmJhc3MuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QcmVhbXBJVjo6Z2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5nYWluPC9OSUNLPgorPEJMVVJCPmdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QcmVhbXBJVjo6aGk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5oaTwvTklDSz4KKzxCTFVSQj5oaS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVByZWFtcElWOjpsYXRlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5sYXRlbmN5PC9OSUNLPgorPEJMVVJCPmxhdGVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVByZWFtcElWOjptaWQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5taWQ8L05JQ0s+Cis8QkxVUkI+bWlkLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUHJlYW1wSVY6OnRlbXBlcmF0dXJlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwNSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnRlbXBlcmF0dXJlPC9OSUNLPgorPEJMVVJCPnRlbXBlcmF0dXJlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDUwMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QcmVhbXBJVjo6dHJlYmxlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+dHJlYmxlPC9OSUNLPgorPEJMVVJCPnRyZWJsZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVRvbmVTdGFjazo6YmFzczwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmJhc3M8L05JQ0s+Cis8QkxVUkI+YmFzcy48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVG9uZVN0YWNrOjptaWQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5taWQ8L05JQ0s+Cis8QkxVUkI+bWlkLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Ub25lU3RhY2s6Om1vZGVsPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPm1vZGVsPC9OSUNLPgorPEJMVVJCPm1vZGVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVG9uZVN0YWNrOjp0cmVibGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz50cmVibGU8L05JQ0s+Cis8QkxVUkI+dHJlYmxlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Ub25lU3RhY2tMVDo6YmFzczwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmJhc3M8L05JQ0s+Cis8QkxVUkI+YmFzcy48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVG9uZVN0YWNrTFQ6Om1pZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPm1pZDwvTklDSz4KKzxCTFVSQj5taWQuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVRvbmVTdGFja0xUOjp0cmVibGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz50cmVibGU8L05JQ0s+Cis8QkxVUkI+dHJlYmxlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBJSUk6OmRyaXZlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kcml2ZTwvTklDSz4KKzxCTFVSQj5kcml2ZS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUFtcElJSTo6Z2FpbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5nYWluPC9OSUNLPgorPEJMVVJCPmdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBJSUk6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmxhdGVuY3k8L05JQ0s+Cis8QkxVUkI+bGF0ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wSUlJOjp0ZW1wZXJhdHVyZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDUsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz50ZW1wZXJhdHVyZTwvTklDSz4KKzxCTFVSQj50ZW1wZXJhdHVyZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1MDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wSVY6OmJhc3M8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0yMCwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5iYXNzPC9OSUNLPgorPEJMVVJCPmJhc3MuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBJVjo6ZHJpdmU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmRyaXZlPC9OSUNLPgorPEJMVVJCPmRyaXZlLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wSVY6OmdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Z2FpbjwvTklDSz4KKzxCTFVSQj5nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wSVY6OmhpPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+aGk8L05JQ0s+Cis8QkxVUkI+aGkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBJVjo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBJVjo6bWlkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjAsMjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+bWlkPC9OSUNLPgorPEJMVVJCPm1pZC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUFtcElWOjp0ZW1wZXJhdHVyZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDUsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz50ZW1wZXJhdHVyZTwvTklDSz4KKzxCTFVSQj50ZW1wZXJhdHVyZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1MDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wSVY6OnRyZWJsZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTIwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnRyZWJsZTwvTklDSz4KKzxCTFVSQj50cmVibGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBWOjpiYXNzPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstOSw5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmJhc3M8L05JQ0s+Cis8QkxVUkI+YmFzcy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUFtcFY6OmRyaXZlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kcml2ZTwvTklDSz4KKzxCTFVSQj5kcml2ZS48L0JMVVJCPgorPERFRkFVTFQ+MCw3NTAwMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBWOjpnYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDNdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Z2FpbjwvTklDSz4KKzxCTFVSQj5nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wVjo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+bGF0ZW5jeTwvTklDSz4KKzxCTFVSQj5sYXRlbmN5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBWOjp0b25lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+dG9uZTwvTklDSz4KKzxCTFVSQj50b25lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wVjo6d2F0dHM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzUsMTUwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPndhdHRzPC9OSUNLPgorPEJMVVJCPndhdHRzLjwvQkxVUkI+Cis8REVGQVVMVD43Nyw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wVlRTOjpiYXNzPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+YmFzczwvTklDSz4KKzxCTFVSQj5iYXNzLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBWVFM6OmRyaXZlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMDEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kcml2ZTwvTklDSz4KKzxCTFVSQj5kcml2ZS48L0JMVVJCPgorPERFRkFVTFQ+MCwyNTAwNzU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBWVFM6OmdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsM108L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5nYWluPC9OSUNLPgorPEJMVVJCPmdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjIsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BbXBWVFM6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmxhdGVuY3k8L05JQ0s+Cis8QkxVUkI+bGF0ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wVlRTOjptaWQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5taWQ8L05JQ0s+Cis8QkxVUkI+bWlkLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQW1wVlRTOjptb2RlbDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5tb2RlbDwvTklDSz4KKzxCTFVSQj5tb2RlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUFtcFZUUzo6dHJlYmxlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+dHJlYmxlPC9OSUNLPgorPEJMVVJCPnRyZWJsZS48L0JMVVJCPgorPERFRkFVTFQ+MCw3NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUFtcFZUUzo6d2F0dHM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPndhdHRzPC9OSUNLPgorPEJMVVJCPndhdHRzLjwvQkxVUkI+Cis8REVGQVVMVD4wLDc1MDAyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNhYmluZXRJOjpnYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjQsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Z2FpbjwvTklDSz4KKzxCTFVSQj5nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2FiaW5ldEk6Om1vZGVsPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPm1vZGVsPC9OSUNLPgorPEJMVVJCPm1vZGVsLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2FiaW5ldElJOjpnYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjQsMjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Z2FpbjwvTklDSz4KKzxCTFVSQj5nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2FiaW5ldElJOjptb2RlbDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5tb2RlbDwvTklDSz4KKzxCTFVSQj5tb2RlbC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNsaXA6OmdhaW48L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03Miw3Ml08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5nYWluPC9OSUNLPgorPEJMVVJCPmdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DbGlwOjpsYXRlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5sYXRlbmN5PC9OSUNLPgorPEJMVVJCPmxhdGVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNob3J1c0k6OmJsZW5kPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+YmxlbmQ8L05JQ0s+Cis8QkxVUkI+YmxlbmQuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DaG9ydXNJOjpmZWVkYmFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPmZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2hvcnVzSTo6ZmVlZGZvcndhcmQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5mZWVkZm9yd2FyZDwvTklDSz4KKzxCTFVSQj5mZWVkZm9yd2FyZC48L0JMVVJCPgorPERFRkFVTFQ+MCwyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNob3J1c0k6OnJhdGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5yYXRlPC9OSUNLPgorPEJMVVJCPnJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjEsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DaG9ydXNJOjp0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyLDUsNDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+dDwvTklDSz4KKzxCTFVSQj50LjwvQkxVUkI+Cis8REVGQVVMVD41PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2hvcnVzSTo6d2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNSwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz53aWR0aDwvTklDSz4KKzxCTFVSQj53aWR0aC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN0ZXJlb0Nob3J1c0k6OmJsZW5kPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+YmxlbmQ8L05JQ0s+Cis8QkxVUkI+YmxlbmQuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TdGVyZW9DaG9ydXNJOjpmZWVkYmFjazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPmZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3RlcmVvQ2hvcnVzSTo6ZmVlZGZvcndhcmQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5mZWVkZm9yd2FyZDwvTklDSz4KKzxCTFVSQj5mZWVkZm9yd2FyZC48L0JMVVJCPgorPERFRkFVTFQ+MCwyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN0ZXJlb0Nob3J1c0k6OnBoYXNlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cGhhc2U8L05JQ0s+Cis8QkxVUkI+cGhhc2UuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TdGVyZW9DaG9ydXNJOjpyYXRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cmF0ZTwvTklDSz4KKzxCTFVSQj5yYXRlLjwvQkxVUkI+Cis8REVGQVVMVD4xLDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3RlcmVvQ2hvcnVzSTo6dDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMiw1LDQwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnQ8L05JQ0s+Cis8QkxVUkI+dC48L0JMVVJCPgorPERFRkFVTFQ+Miw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3RlcmVvQ2hvcnVzSTo6d2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNSwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz53aWR0aDwvTklDSz4KKzxCTFVSQj53aWR0aC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNob3J1c0lJOjpibGVuZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmJsZW5kPC9OSUNLPgorPEJMVVJCPmJsZW5kLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2hvcnVzSUk6OmZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+ZmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DaG9ydXNJSTo6ZmVlZGZvcndhcmQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5mZWVkZm9yd2FyZDwvTklDSz4KKzxCTFVSQj5mZWVkZm9yd2FyZC48L0JMVVJCPgorPERFRkFVTFQ+MCwyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNob3J1c0lJOjpyYXRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cmF0ZTwvTklDSz4KKzxCTFVSQj5yYXRlLjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2hvcnVzSUk6OnQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIsNSw0MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz50PC9OSUNLPgorPEJMVVJCPnQuPC9CTFVSQj4KKzxERUZBVUxUPjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DaG9ydXNJSTo6d2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNSwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz53aWR0aDwvTklDSz4KKzxCTFVSQj53aWR0aC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN0ZXJlb0Nob3J1c0lJOjpibGVuZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmJsZW5kPC9OSUNLPgorPEJMVVJCPmJsZW5kLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3RlcmVvQ2hvcnVzSUk6OmZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+ZmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TdGVyZW9DaG9ydXNJSTo6ZmVlZGZvcndhcmQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5mZWVkZm9yd2FyZDwvTklDSz4KKzxCTFVSQj5mZWVkZm9yd2FyZC48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3RlcmVvQ2hvcnVzSUk6OnJhdGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5yYXRlPC9OSUNLPgorPEJMVVJCPnJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TdGVyZW9DaG9ydXNJSTo6dDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMiw1LDQwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnQ8L05JQ0s+Cis8QkxVUkI+dC48L0JMVVJCPgorPERFRkFVTFQ+MTEsODc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3RlcmVvQ2hvcnVzSUk6OndpZHRoPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDUsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+d2lkdGg8L05JQ0s+Cis8QkxVUkI+d2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjIsODc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGhhc2VySTo6ZGVwdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kZXB0aDwvTklDSz4KKzxCTFVSQj5kZXB0aC48L0JMVVJCPgorPERFRkFVTFQ+MCw3NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBoYXNlckk6OmZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAsOTk5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPmZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wLDc0OTI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGhhc2VySTo6cmF0ZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5yYXRlPC9OSUNLPgorPEJMVVJCPnJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QaGFzZXJJOjpzcHJlYWQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMywxNDE1OV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5zcHJlYWQ8L05JQ0s+Cis8QkxVUkI+c3ByZWFkLjwvQkxVUkI+Cis8REVGQVVMVD4wLDc4NTM5ODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBoYXNlcklJOjpkZXB0aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmRlcHRoPC9OSUNLPgorPEJMVVJCPmRlcHRoLjwvQkxVUkI+Cis8REVGQVVMVD4wLDc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGhhc2VySUk6OmZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAsOTk5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPmZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wLDc0OTI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGhhc2VySUk6OnJhdGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5yYXRlPC9OSUNLPgorPEJMVVJCPnJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QaGFzZXJJSTo6c3ByZWFkPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEsNTcwOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5zcHJlYWQ8L05JQ0s+Cis8QkxVUkI+c3ByZWFkLjwvQkxVUkI+Cis8REVGQVVMVD4wLDM5MjY5OTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN3ZWVwVkZJOjpRPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMSwwLDk5OV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5RPC9OSUNLPgorPEJMVVJCPlEuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN3ZWVwVkZJOjpkZXB0aC14PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZGVwdGgteDwvTklDSz4KKzxCTFVSQj5kZXB0aC14LjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3dlZXBWRkk6OmRlcHRoLXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kZXB0aC15PC9OSUNLPgorPEJMVVJCPmRlcHRoLXkuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN3ZWVwVkZJOjpkZXB0aC16PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZGVwdGgtejwvTklDSz4KKzxCTFVSQj5kZXB0aC16LjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3dlZXBWRkk6OmY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzgzLDMzODNdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZjwvTklDSz4KKzxCTFVSQj5mLjwvQkxVUkI+Cis8REVGQVVMVD4yMDksNzE3PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3dlZXBWRkk6Omg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAxLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+aDwvTklDSz4KKzxCTFVSQj5oLjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1MDc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3dlZXBWRkk6Om1vZGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+bW9kZTwvTklDSz4KKzxCTFVSQj5tb2RlLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3dlZXBWRklJOjpRPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMSwwLDk5OV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5RPC9OSUNLPgorPEJMVVJCPlEuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN3ZWVwVkZJSTo6US1kZXB0aC14PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+US1kZXB0aC14PC9OSUNLPgorPEJMVVJCPlEtZGVwdGgteC48L0JMVVJCPgorPERFRkFVTFQ+MCwyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN3ZWVwVkZJSTo6US1kZXB0aC15PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+US1kZXB0aC15PC9OSUNLPgorPEJMVVJCPlEtZGVwdGgteS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3dlZXBWRklJOjpRLWRlcHRoLXo8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5RLWRlcHRoLXo8L05JQ0s+Cis8QkxVUkI+US1kZXB0aC16LjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU3dlZXBWRklJOjpRLWg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDAxLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+US1oPC9OSUNLPgorPEJMVVJCPlEtaC48L0JMVVJCPgorPERFRkFVTFQ+MCwyNTA3NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN3ZWVwVkZJSTo6ZjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bODMsMzM4M108L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5mPC9OSUNLPgorPEJMVVJCPmYuPC9CTFVSQj4KKzxERUZBVUxUPjIwOSw3MTc8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Td2VlcFZGSUk6OmYtZGVwdGgteDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmYtZGVwdGgteDwvTklDSz4KKzxCTFVSQj5mLWRlcHRoLXguPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Td2VlcFZGSUk6OmYtZGVwdGgteTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmYtZGVwdGgteTwvTklDSz4KKzxCTFVSQj5mLWRlcHRoLXkuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN3ZWVwVkZJSTo6Zi1kZXB0aC16PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Zi1kZXB0aC16PC9OSUNLPgorPEJMVVJCPmYtZGVwdGgtei48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVN3ZWVwVkZJSTo6Zi1oPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmYtaDwvTklDSz4KKzxCTFVSQj5mLWguPC9CTFVSQj4KKzxERUZBVUxUPjAsMjUwNzU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Td2VlcFZGSUk6Om1vZGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+bW9kZTwvTklDSz4KKzxCTFVSQj5tb2RlLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQXV0b1dhaDo6UTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDEsMCw5OTldPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UTwvTklDSz4KKzxCTFVSQj5RLjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1MDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BdXRvV2FoOjpkZXB0aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmRlcHRoPC9OSUNLPgorPEJMVVJCPmRlcHRoLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1BdXRvV2FoOjpmPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0Myw5MzNdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZjwvTklDSz4KKzxCTFVSQj5mLjwvQkxVUkI+Cis8REVGQVVMVD45Miw4MDUxPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU2NhcGU6OmJsZW5kPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+YmxlbmQ8L05JQ0s+Cis8QkxVUkI+YmxlbmQuPC9CTFVSQj4KKzxERUZBVUxUPjAsNzU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1TY2FwZTo6YnBtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlszMCwyNDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+YnBtPC9OSUNLPgorPEJMVVJCPmJwbS48L0JMVVJCPgorPERFRkFVTFQ+ODIsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNjYXBlOjpkaXZpZGVyPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMiw0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmRpdmlkZXI8L05JQ0s+Cis8QkxVUkI+ZGl2aWRlci48L0JMVVJCPgorPERFRkFVTFQ+MjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNjYXBlOjpkcnk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kcnk8L05JQ0s+Cis8QkxVUkI+ZHJ5LjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU2NhcGU6OmZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZmVlZGJhY2s8L05JQ0s+Cis8QkxVUkI+ZmVlZGJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1WQ09zOjpmPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxLDU3NTFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZjwvTklDSz4KKzxCTFVSQj5mLjwvQkxVUkI+Cis8REVGQVVMVD4xMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1WQ09zOjpwYXJhbS0tLS0tLXNxdWFyZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLS0tLS0tc3F1YXJlPC9OSUNLPgorPEJMVVJCPnBhcmFtLS0tLS0tc3F1YXJlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVkNPczo6dHJpLS0tLXNhdzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnRyaS0tLS1zYXc8L05JQ0s+Cis8QkxVUkI+dHJpLS0tLXNhdy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVZDT3M6OnZvbHVtZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMWUtMDYsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz52b2x1bWU8L05JQ0s+Cis8QkxVUkI+dm9sdW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1WQ09kOjpibGVuZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5ibGVuZDwvTklDSz4KKzxCTFVSQj5ibGVuZC48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVkNPZDo6ZjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSw1NzUxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmY8L05JQ0s+Cis8QkxVUkI+Zi48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVkNPZDo6cGFyYW0tMS0tLS0tLS1zcXVhcmU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0xLS0tLS0tLXNxdWFyZTwvTklDSz4KKzxCTFVSQj5wYXJhbS0xLS0tLS0tLXNxdWFyZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVZDT2Q6OnBhcmFtLTEtLXRyaS0tLS1zYXc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0xLS10cmktLS0tc2F3PC9OSUNLPgorPEJMVVJCPnBhcmFtLTEtLXRyaS0tLS1zYXcuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1WQ09kOjpwYXJhbS0yLS0tLS0tLXNxdWFyZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTItLS0tLS0tc3F1YXJlPC9OSUNLPgorPEJMVVJCPnBhcmFtLTItLS0tLS0tc3F1YXJlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVkNPZDo6cGFyYW0tMi0tdHJpLS0tLXNhdzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnBhcmFtLTItLXRyaS0tLS1zYXc8L05JQ0s+Cis8QkxVUkI+cGFyYW0tMi0tdHJpLS0tLXNhdy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVZDT2Q6OnBhcmFtLTItLXR1bmU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy0xMiwxMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYXJhbS0yLS10dW5lPC9OSUNLPgorPEJMVVJCPnBhcmFtLTItLXR1bmUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1WQ09kOjpzeW5jPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+c3luYzwvTklDSz4KKzxCTFVSQj5zeW5jLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtVkNPZDo6dm9sdW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsxZS0wNiwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnZvbHVtZTwvTklDSz4KKzxCTFVSQj52b2x1bWUuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNFTzo6ZGFtcGluZzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmRhbXBpbmc8L05JQ0s+Cis8QkxVUkI+ZGFtcGluZy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNFTzo6bXBtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0LDI0NF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5tcG08L05JQ0s+Cis8QkxVUkI+bXBtLjwvQkxVUkI+Cis8REVGQVVMVD4xODQ8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DRU86OnZvbHVtZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnZvbHVtZTwvTklDSz4KKzxCTFVSQj52b2x1bWUuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVNpbjo6ZjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDAxLDIwMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmY8L05JQ0s+Cis8QkxVUkI+Zi48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtU2luOjp2b2x1bWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzFlLTA2LDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+dm9sdW1lPC9OSUNLPgorPEJMVVJCPnZvbHVtZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtV2hpdGU6OnZvbHVtZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMWUtMDYsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz52b2x1bWU8L05JQ0s+Cis8QkxVUkI+dm9sdW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Mb3Jlbno6Omg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5oPC9OSUNLPgorPEJMVVJCPmguPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Mb3Jlbno6OnZvbHVtZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMWUtMDYsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz52b2x1bWU8L05JQ0s+Cis8QkxVUkI+dm9sdW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Mb3Jlbno6Ong8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz54PC9OSUNLPgorPEJMVVJCPnguPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Mb3Jlbno6Onk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz55PC9OSUNLPgorPEJMVVJCPnkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Mb3Jlbno6Ono8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz56PC9OSUNLPgorPEJMVVJCPnouPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Sb2Vzc2xlcjo6aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmg8L05JQ0s+Cis8QkxVUkI+aC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVJvZXNzbGVyOjp2b2x1bWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzFlLTA2LDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+dm9sdW1lPC9OSUNLPgorPEJMVVJCPnZvbHVtZS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUm9lc3NsZXI6Ong8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz54PC9OSUNLPgorPEJMVVJCPnguPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1Sb2Vzc2xlcjo6eTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnk8L05JQ0s+Cis8QkxVUkI+eS48L0JMVVJCPgorPERFRkFVTFQ+MCw1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUm9lc3NsZXI6Ono8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz56PC9OSUNLPgorPEJMVVJCPnouPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1KVlJldjo6YmxlbmQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMCwyOF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5ibGVuZDwvTklDSz4KKzxCTFVSQj5ibGVuZC48L0JMVVJCPgorPERFRkFVTFQ+MCwwNzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUpWUmV2Ojp0NjA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNCw2XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnQ2MDwvTklDSz4KKzxCTFVSQj50NjAuPC9CTFVSQj4KKzxERUZBVUxUPjIsMzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBsYXRlOjpiYW5kd2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMDA1LDAsOTk5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmJhbmR3aWR0aDwvTklDSz4KKzxCTFVSQj5iYW5kd2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjAsNTAyPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGxhdGU6OmJsZW5kPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+YmxlbmQ8L05JQ0s+Cis8QkxVUkI+YmxlbmQuPC9CTFVSQj4KKzxERUZBVUxUPjAsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QbGF0ZTo6ZGFtcGluZzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDA1LDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZGFtcGluZzwvTklDSz4KKzxCTFVSQj5kYW1waW5nLjwvQkxVUkI+Cis8REVGQVVMVD4wLDI1MDM3NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBsYXRlOjp0YWlsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAsNzQ5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnRhaWw8L05JQ0s+Cis8QkxVUkI+dGFpbC48L0JMVVJCPgorPERFRkFVTFQ+MCwzNzQ1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGxhdGUyeDI6OmJhbmR3aWR0aDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwwMDUsMCw5OTldPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+YmFuZHdpZHRoPC9OSUNLPgorPEJMVVJCPmJhbmR3aWR0aC48L0JMVVJCPgorPERFRkFVTFQ+MCw1MDI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1QbGF0ZTJ4Mjo6YmxlbmQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5ibGVuZDwvTklDSz4KKzxCTFVSQj5ibGVuZC48L0JMVVJCPgorPERFRkFVTFQ+MCwyNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLVBsYXRlMngyOjpkYW1waW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDAwMDUsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kYW1waW5nPC9OSUNLPgorPEJMVVJCPmRhbXBpbmcuPC9CTFVSQj4KKzxERUZBVUxUPjAsMjUwMzc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtUGxhdGUyeDI6OnRhaWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMCw3NDldPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+dGFpbDwvTklDSz4KKzxCTFVSQj50YWlsLjwvQkxVUkI+Cis8REVGQVVMVD4wLDM3NDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1DbGljazo6YnBtPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0LDI0NF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5icG08L05JQ0s+Cis8QkxVUkI+YnBtLjwvQkxVUkI+Cis8REVGQVVMVD42NDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUNsaWNrOjpkYW1waW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZGFtcGluZzwvTklDSz4KKzxCTFVSQj5kYW1waW5nLjwvQkxVUkI+Cis8REVGQVVMVD4wLDc1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtQ2xpY2s6OnZvbHVtZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPnZvbHVtZTwvTklDSz4KKzxCTFVSQj52b2x1bWUuPC9CTFVSQj4KKzxERUZBVUxUPjAsNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLURpcmFjOjpkYW1waW5nPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZGFtcGluZzwvTklDSz4KKzxCTFVSQj5kYW1waW5nLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtRGlyYWM6OnBwbTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMzAsNjBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+cHBtPC9OSUNLPgorPEJMVVJCPnBwbS48L0JMVVJCPgorPERFRkFVTFQ+MzA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1EaXJhYzo6dm9sdW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+dm9sdW1lPC9OSUNLPgorPEJMVVJCPnZvbHVtZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLUhSVEY6OnBhbjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Wy0zNiwzNl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5wYW48L05JQ0s+Cis8QkxVUkI+cGFuLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OkNsb3NlZC1HYXRlLVZhbHVlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkNsb3NlZC1HYXRlLVZhbHVlPC9OSUNLPgorPEJMVVJCPkNsb3NlZC1HYXRlLVZhbHVlLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6TG9vcC1TdGVwczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsNjRdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TG9vcC1TdGVwczwvTklDSz4KKzxCTFVSQj5Mb29wLVN0ZXBzLjwvQkxVUkI+Cis8REVGQVVMVD42NDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpSZXNldC10by1WYWx1ZS1vbi1HYXRlLUNsb3NlLTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNldC10by1WYWx1ZS1vbi1HYXRlLUNsb3NlLTwvTklDSz4KKzxCTFVSQj5SZXNldC10by1WYWx1ZS1vbi1HYXRlLUNsb3NlLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0wPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0xMDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTEwPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMTAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTExPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xMS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0xMjwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTEyLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0xMzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTEzPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMTMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTE0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xNC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMTU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0xNTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTE1LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0xNjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTE2PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMTYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTE3PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xNy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMTg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0xODwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTE4LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0xOTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTE5PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMTkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0yPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMjA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0yMDwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTIwLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0yMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTIxPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMjEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTIyPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMjI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0yMi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMjM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0yMzwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTIzLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0yNDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTI0PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMjQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTI1PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMjU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0yNS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMjY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0yNjwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTI2LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0yNzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTI3PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMjcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTI4PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMjg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0yOC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMjk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0yOTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTI5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0zPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMzwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTMwPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMzA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0zMC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMzE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0zMTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTMxLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0zMjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTMyPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMzIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTMzPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMzM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0zMy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMzQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0zNDwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTM0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0zNTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTM1PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMzUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTM2PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMzY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0zNi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtMzc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0zNzwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTM3LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC0zODwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTM4PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMzguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTM5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMzk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0zOS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC00LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC00MDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTQwPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNDAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTQxPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNDE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC00MS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNDI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC00MjwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTQyLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC00MzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTQzPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNDMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTQ0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNDQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC00NC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNDU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC00NTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTQ1LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC00NjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTQ2PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNDYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTQ3PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNDc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC00Ny48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNDg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC00ODwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTQ4LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC00OTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTQ5PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNDkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC01PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNTA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC01MDwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTUwLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC01MTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTUxPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNTEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTUyPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNTI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC01Mi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNTM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC01MzwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTUzLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC01NDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTU0PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNTQuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTU1PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNTU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC01NS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNTY8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC01NjwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTU2LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC01NzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTU3PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNTcuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTU4PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNTg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC01OC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNTk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC01OTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTU5LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC02PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNjwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTYwPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNjA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC02MC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNjE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC02MTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTYxLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC02MjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTYyPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNjIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTYzPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNjM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC02My48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyNjQ6OlZhbHVlLVN0ZXAtNzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC03LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXI2NDo6VmFsdWUtU3RlcC04PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtODwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjY0OjpWYWx1ZS1TdGVwLTk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC05PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtOS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcG9pbnRlckNhc3REaXN0b3J0aW9uOjpEcnktd2V0LW1peDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRyeS13ZXQtbWl4PC9OSUNLPgorPEJMVVJCPkRyeS13ZXQtbWl4LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtcG9pbnRlckNhc3REaXN0b3J0aW9uOjpFZmZlY3QtY3V0b2ZmLWZyZXE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzQsNDEsMTMyMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RWZmZWN0LWN1dG9mZi1mcmVxPC9OSUNLPgorPEJMVVJCPkVmZmVjdC1jdXRvZmYtZnJlcS48L0JMVVJCPgorPERFRkFVTFQ+MzIsNjM3NjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWNvbWI6OkJhbmQtc2VwYXJhdGlvbjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMTYsNjQwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtc2VwYXJhdGlvbjwvTklDSz4KKzxCTFVSQj5CYW5kLXNlcGFyYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjE3MjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWNvbWI6OkZlZWRiYWNrPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMCw5OSwwLDk5XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPkZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXN0ZXJlby1lY2hvOjpDcm9zcy1Nb2RlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q3Jvc3MtTW9kZTwvTklDSz4KKzxCTFVSQj5Dcm9zcy1Nb2RlLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1zdGVyZW8tZWNobzo6RHJ5LUxldmVsLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EcnktTGV2ZWwtLWRCLTwvTklDSz4KKzxCTFVSQj5EcnktTGV2ZWwtLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1zdGVyZW8tZWNobzo6SGFhcy1FZmZlY3Q8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5IYWFzLUVmZmVjdDwvTklDSz4KKzxCTFVSQj5IYWFzLUVmZmVjdC48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtc3RlcmVvLWVjaG86OkwtRGVsYXktLW1zLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkwtRGVsYXktLW1zLTwvTklDSz4KKzxCTFVSQj5MLURlbGF5LS1tcy0uPC9CTFVSQj4KKzxERUZBVUxUPjEwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1zdGVyZW8tZWNobzo6TC1FY2hvLUxldmVsLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy03MCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MLUVjaG8tTGV2ZWwtLWRCLTwvTklDSz4KKzxCTFVSQj5MLUVjaG8tTGV2ZWwtLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1zdGVyZW8tZWNobzo6TC1GZWVkYmFjay0tLS08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkwtRmVlZGJhY2stLS0tPC9OSUNLPgorPEJMVVJCPkwtRmVlZGJhY2stLS0tLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXN0ZXJlby1lY2hvOjpSLUVjaG8tTGV2ZWwtLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlItRWNoby1MZXZlbC0tZEItPC9OSUNLPgorPEJMVVJCPlItRWNoby1MZXZlbC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLXN0ZXJlby1lY2hvOjpSLUhhYXMtRGVsYXktLW1zLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwyMDAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlItSGFhcy1EZWxheS0tbXMtPC9OSUNLPgorPEJMVVJCPlItSGFhcy1EZWxheS0tbXMtLjwvQkxVUkI+Cis8REVGQVVMVD4xMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtc3RlcmVvLWVjaG86OlItSGFhcy1GZWVkYmFjay0tLS08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlItSGFhcy1GZWVkYmFjay0tLS08L05JQ0s+Cis8QkxVUkI+Ui1IYWFzLUZlZWRiYWNrLS0tLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1zdGVyZW8tZWNobzo6U3dhcC1PdXRwdXRzPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3dhcC1PdXRwdXRzPC9OSUNLPgorPEJMVVJCPlN3YXAtT3V0cHV0cy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nc206OkRyeS13ZXQtbWl4PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RHJ5LXdldC1taXg8L05JQ0s+Cis8QkxVUkI+RHJ5LXdldC1taXguPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nc206OkVycm9yLXJhdGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMzBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RXJyb3ItcmF0ZTwvTklDSz4KKzxCTFVSQj5FcnJvci1yYXRlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtZ3NtOjpOdW1iZXItb2YtcGFzc2VzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5OdW1iZXItb2YtcGFzc2VzPC9OSUNLPgorPEJMVVJCPk51bWJlci1vZi1wYXNzZXMuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1nc206OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmxhdGVuY3k8L05JQ0s+Cis8QkxVUkI+bGF0ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtaGlnaHBhc3MtaWlyOjpDdXRvZmYtRnJlcXVlbmN5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPls0LDQxLDE5ODQ1XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkN1dG9mZi1GcmVxdWVuY3k8L05JQ0s+Cis8QkxVUkI+Q3V0b2ZmLUZyZXF1ZW5jeS48L0JMVVJCPgorPERFRkFVTFQ+MzYsMTE5NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWhpZ2hwYXNzLWlpcjo6U3RhZ2VzLTItcG9sZXMtcGVyLXN0YWdlLTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3RhZ2VzLTItcG9sZXMtcGVyLXN0YWdlLTwvTklDSz4KKzxCTFVSQj5TdGFnZXMtMi1wb2xlcy1wZXItc3RhZ2UtLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdm9jb2Rlcjo6QmFuZC0xLUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0xLUxldmVsPC9OSUNLPgorPEJMVVJCPkJhbmQtMS1MZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZvY29kZXI6OkJhbmQtMTAtTGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTEwLUxldmVsPC9OSUNLPgorPEJMVVJCPkJhbmQtMTAtTGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12b2NvZGVyOjpCYW5kLTExLUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0xMS1MZXZlbDwvTklDSz4KKzxCTFVSQj5CYW5kLTExLUxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdm9jb2Rlcjo6QmFuZC0xMi1MZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMTItTGV2ZWw8L05JQ0s+Cis8QkxVUkI+QmFuZC0xMi1MZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZvY29kZXI6OkJhbmQtMTMtTGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTEzLUxldmVsPC9OSUNLPgorPEJMVVJCPkJhbmQtMTMtTGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12b2NvZGVyOjpCYW5kLTE0LUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0xNC1MZXZlbDwvTklDSz4KKzxCTFVSQj5CYW5kLTE0LUxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdm9jb2Rlcjo6QmFuZC0xNS1MZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtMTUtTGV2ZWw8L05JQ0s+Cis8QkxVUkI+QmFuZC0xNS1MZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZvY29kZXI6OkJhbmQtMTYtTGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTE2LUxldmVsPC9OSUNLPgorPEJMVVJCPkJhbmQtMTYtTGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12b2NvZGVyOjpCYW5kLTItTGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTItTGV2ZWw8L05JQ0s+Cis8QkxVUkI+QmFuZC0yLUxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdm9jb2Rlcjo6QmFuZC0zLUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC0zLUxldmVsPC9OSUNLPgorPEJMVVJCPkJhbmQtMy1MZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZvY29kZXI6OkJhbmQtNC1MZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNC1MZXZlbDwvTklDSz4KKzxCTFVSQj5CYW5kLTQtTGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12b2NvZGVyOjpCYW5kLTUtTGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTUtTGV2ZWw8L05JQ0s+Cis8QkxVUkI+QmFuZC01LUxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdm9jb2Rlcjo6QmFuZC02LUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC02LUxldmVsPC9OSUNLPgorPEJMVVJCPkJhbmQtNi1MZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZvY29kZXI6OkJhbmQtNy1MZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJhbmQtNy1MZXZlbDwvTklDSz4KKzxCTFVSQj5CYW5kLTctTGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS12b2NvZGVyOjpCYW5kLTgtTGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5CYW5kLTgtTGV2ZWw8L05JQ0s+Cis8QkxVUkI+QmFuZC04LUxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdm9jb2Rlcjo6QmFuZC05LUxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZC05LUxldmVsPC9OSUNLPgorPEJMVVJCPkJhbmQtOS1MZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXZvY29kZXI6Ok51bWJlci1vZi1iYW5kczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsMTZdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TnVtYmVyLW9mLWJhbmRzPC9OSUNLPgorPEJMVVJCPk51bWJlci1vZi1iYW5kcy48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWthcmFva2U6OlZvY2FsLXZvbHVtZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTcwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Vm9jYWwtdm9sdW1lPC9OSUNLPgorPEJMVVJCPlZvY2FsLXZvbHVtZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWphbWluQ29udHJvbGxlcjo6U2NlbmUtbm8tPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TY2VuZS1uby08L05JQ0s+Cis8QkxVUkI+U2NlbmUtbm8tLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWNob3J1c2ZsYW5nZXI6OkNvbnRvdXItLUh6LTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMjAsMjAwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q29udG91ci0tSHotPC9OSUNLPgorPEJMVVJCPkNvbnRvdXItLUh6LS48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWNob3J1c2ZsYW5nZXI6OkRlbGF5LS1tcy08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlbGF5LS1tcy08L05JQ0s+Cis8QkxVUkI+RGVsYXktLW1zLS48L0JMVVJCPgorPERFRkFVTFQ+MjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtY2hvcnVzZmxhbmdlcjo6RGVwdGgtLS0tPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5EZXB0aC0tLS08L05JQ0s+Cis8QkxVUkI+RGVwdGgtLS0tLjwvQkxVUkI+Cis8REVGQVVMVD43NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1jaG9ydXNmbGFuZ2VyOjpEcnktTGV2ZWwtLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTkwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRyeS1MZXZlbC0tZEItPC9OSUNLPgorPEJMVVJCPkRyeS1MZXZlbC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtdGFwLWNob3J1c2ZsYW5nZXI6OkZyZXF1ZW5jeS0tSHotPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LS1Iei08L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LS1Iei0uPC9CTFVSQj4KKzxERUZBVUxUPjEsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtY2hvcnVzZmxhbmdlcjo6TC1SLVBoYXNlLVNoaWZ0LS1kZWctPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDE4MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5MLVItUGhhc2UtU2hpZnQtLWRlZy08L05JQ0s+Cis8QkxVUkI+TC1SLVBoYXNlLVNoaWZ0LS1kZWctLjwvQkxVUkI+Cis8REVGQVVMVD45MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1jaG9ydXNmbGFuZ2VyOjpXZXQtTGV2ZWwtLWRCLTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTkwLDIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPldldC1MZXZlbC0tZEItPC9OSUNLPgorPEJMVVJCPldldC1MZXZlbC0tZEItLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtYmFuZHBhc3MtaWlyOjpCYW5kd2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzQsNDEsMTk4NDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZHdpZHRoPC9OSUNLPgorPEJMVVJCPkJhbmR3aWR0aC48L0JMVVJCPgorPERFRkFVTFQ+Mjk1LDgzMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWJhbmRwYXNzLWlpcjo6Q2VudGVyLUZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNCw0MSwxOTg0NV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DZW50ZXItRnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkNlbnRlci1GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjI5NSw4MzI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1iYW5kcGFzcy1paXI6OlN0YWdlcy0yLXBvbGVzLXBlci1zdGFnZS08L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0YWdlcy0yLXBvbGVzLXBlci1zdGFnZS08L05JQ0s+Cis8QkxVUkI+U3RhZ2VzLTItcG9sZXMtcGVyLXN0YWdlLS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjNDo6QW1wbGl0dWRlPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstNDAsMTJdPC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkFtcGxpdHVkZTwvTklDSz4KKzxCTFVSQj5BbXBsaXR1ZGUuPC9CTFVSQj4KKzxERUZBVUxUPi00MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjNDo6QXR0YWNrLXRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEsNSw0MDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QXR0YWNrLXRpbWU8L05JQ0s+Cis8QkxVUkI+QXR0YWNrLXRpbWUuPC9CTFVSQj4KKzxERUZBVUxUPjEwMSwxMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzQ6OkdhaW4tcmVkdWN0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlstMjQsMF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+R2Fpbi1yZWR1Y3Rpb248L05JQ0s+Cis8QkxVUkI+R2Fpbi1yZWR1Y3Rpb24uPC9CTFVSQj4KKzxERUZBVUxUPi0yNDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjNDo6S25lZS1yYWRpdXM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzEsMTBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+S25lZS1yYWRpdXM8L05JQ0s+Cis8QkxVUkI+S25lZS1yYWRpdXMuPC9CTFVSQj4KKzxERUZBVUxUPjMsMjU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzQ6Ok1ha2V1cC1nYWluPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDI0XTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1ha2V1cC1nYWluPC9OSUNLPgorPEJMVVJCPk1ha2V1cC1nYWluLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2M0OjpSTVMtcGVhazwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJNUy1wZWFrPC9OSUNLPgorPEJMVVJCPlJNUy1wZWFrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2M0OjpSYXRpbzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMSwyMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SYXRpbzwvTklDSz4KKzxCTFVSQj5SYXRpby48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNjNDo6UmVsZWFzZS10aW1lPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlsyLDgwMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZWxlYXNlLXRpbWU8L05JQ0s+Cis8QkxVUkI+UmVsZWFzZS10aW1lLjwvQkxVUkI+Cis8REVGQVVMVD40MDE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zYzQ6OlRocmVzaG9sZC1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTMwLDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VGhyZXNob2xkLWxldmVsPC9OSUNLPgorPEJMVVJCPlRocmVzaG9sZC1sZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNhd3Rvb3RoLWZjLW9hOjpGcmVxdWVuejwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCw5MTg3NSwyMjA1MF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmVxdWVuejwvTklDSz4KKzxCTFVSQj5GcmVxdWVuei48L0JMVVJCPgorPERFRkFVTFQ+NDQwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtbm90Y2gtaWlyOjpCYW5kd2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzQsNDEsMTk4NDVdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+QmFuZHdpZHRoPC9OSUNLPgorPEJMVVJCPkJhbmR3aWR0aC48L0JMVVJCPgorPERFRkFVTFQ+Mjk1LDgzMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW5vdGNoLWlpcjo6Q2VudGVyLUZyZXF1ZW5jeTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bNCw0MSwxOTg0NV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DZW50ZXItRnJlcXVlbmN5PC9OSUNLPgorPEJMVVJCPkNlbnRlci1GcmVxdWVuY3kuPC9CTFVSQj4KKzxERUZBVUxUPjI5NSw4MzI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1ub3RjaC1paXI6OlN0YWdlcy0yLXBvbGVzLXBlci1zdGFnZS08L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlsxLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0YWdlcy0yLXBvbGVzLXBlci1zdGFnZS08L05JQ0s+Cis8QkxVUkI+U3RhZ2VzLTItcG9sZXMtcGVyLXN0YWdlLS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWZyZXFUcmFja2VyOjpUcmFja2luZy1zcGVlZDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRyYWNraW5nLXNwZWVkPC9OSUNLPgorPEJMVVJCPlRyYWNraW5nLXNwZWVkLjwvQkxVUkI+Cis8REVGQVVMVD4wLDU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jb21iLW46OkRlY2F5LVRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlY2F5LVRpbWU8L05JQ0s+Cis8QkxVUkI+RGVjYXktVGltZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWNvbWItbjo6RGVsYXktVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktVGltZTwvTklDSz4KKzxCTFVSQj5EZWxheS1UaW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtY29tYi1uOjpNYXgtRGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1heC1EZWxheTwvTklDSz4KKzxCTFVSQj5NYXgtRGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jb21iLWw6OkRlY2F5LVRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlY2F5LVRpbWU8L05JQ0s+Cis8QkxVUkI+RGVjYXktVGltZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWNvbWItbDo6RGVsYXktVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktVGltZTwvTklDSz4KKzxCTFVSQj5EZWxheS1UaW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtY29tYi1sOjpNYXgtRGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1heC1EZWxheTwvTklDSz4KKzxCTFVSQj5NYXgtRGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1jb21iLWM6OkRlY2F5LVRpbWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkRlY2F5LVRpbWU8L05JQ0s+Cis8QkxVUkI+RGVjYXktVGltZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLWNvbWItYzo6RGVsYXktVGltZTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RGVsYXktVGltZTwvTklDSz4KKzxCTFVSQj5EZWxheS1UaW1lLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtY29tYi1jOjpNYXgtRGVsYXk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1heC1EZWxheTwvTklDSz4KKzxCTFVSQj5NYXgtRGVsYXkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6Q2xvc2VkLUdhdGUtVmFsdWU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+Q2xvc2VkLUdhdGUtVmFsdWU8L05JQ0s+Cis8QkxVUkI+Q2xvc2VkLUdhdGUtVmFsdWUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpMb29wLVN0ZXBzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSwzMl08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Mb29wLVN0ZXBzPC9OSUNLPgorPEJMVVJCPkxvb3AtU3RlcHMuPC9CTFVSQj4KKzxERUZBVUxUPjMyPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlJlc2V0LXRvLVZhbHVlLW9uLUdhdGUtQ2xvc2UtPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc2V0LXRvLVZhbHVlLW9uLUdhdGUtQ2xvc2UtPC9OSUNLPgorPEJMVVJCPlJlc2V0LXRvLVZhbHVlLW9uLUdhdGUtQ2xvc2UtLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtMDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0wLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC0xPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTEwPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTA8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xMC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtMTE8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0xMTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTExLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC0xMjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTEyPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMTIuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTEzPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTM8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xMy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtMTQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0xNDwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTE0LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC0xNTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTE1PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMTUuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTE2PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTY8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xNi48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtMTc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0xNzwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTE3LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC0xODwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTE4PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMTguPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTE5PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMTk8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0xOS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtMjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTI8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0yLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC0yMDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTIwPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMjAuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTIxPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMjE8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0yMS48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtMjI8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0yMjwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTIyLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC0yMzwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTIzPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMjMuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTI0PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMjQ8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0yNC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtMjU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0yNTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTI1LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC0yNjwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTI2PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMjYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTI3PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtMjc8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC0yNy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtMjg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0yODwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTI4LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC0yOTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTI5PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMjkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTM8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0zPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtMzA8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC0zMDwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTMwLjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC0zMTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTMxPC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtMzEuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC00PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNC48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtNTwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTU8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC01LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC02PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtNjwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTYuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXNlcXVlbmNlcjMyOjpWYWx1ZS1TdGVwLTc8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VmFsdWUtU3RlcC03PC9OSUNLPgorPEJMVVJCPlZhbHVlLVN0ZXAtNy48L0JMVVJCPgorPERFRkFVTFQ+LTMsNDAyODJlKzM4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5sYWRzcGEtc2VxdWVuY2VyMzI6OlZhbHVlLVN0ZXAtODwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5WYWx1ZS1TdGVwLTg8L05JQ0s+Cis8QkxVUkI+VmFsdWUtU3RlcC04LjwvQkxVUkI+Cis8REVGQVVMVD4tMyw0MDI4MmUrMzg8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS1zZXF1ZW5jZXIzMjo6VmFsdWUtU3RlcC05PC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlZhbHVlLVN0ZXAtOTwvTklDSz4KKzxCTFVSQj5WYWx1ZS1TdGVwLTkuPC9CTFVSQj4KKzxERUZBVUxUPi0zLDQwMjgyZSszODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLXRhcC1kZWVzc2VyOjpBdHRlbnVhdGlvbi0tZEItPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDEwXTwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5BdHRlbnVhdGlvbi0tZEItPC9OSUNLPgorPEJMVVJCPkF0dGVudWF0aW9uLS1kQi0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZGVlc3Nlcjo6RnJlcXVlbmN5LS1Iei08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzIwMDAsMTYwMDBdPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJlcXVlbmN5LS1Iei08L05JQ0s+Cis8QkxVUkI+RnJlcXVlbmN5LS1Iei0uPC9CTFVSQj4KKzxERUZBVUxUPjU1MDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZGVlc3Nlcjo6TW9uaXRvcjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Nb25pdG9yPC9OSUNLPgorPEJMVVJCPk1vbml0b3IuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZGVlc3Nlcjo6U2lkZWNoYWluLUZpbHRlcjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5TaWRlY2hhaW4tRmlsdGVyPC9OSUNLPgorPEJMVVJCPlNpZGVjaGFpbi1GaWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPmxhZHNwYS10YXAtZGVlc3Nlcjo6VGhyZXNob2xkLUxldmVsLS1kQi08L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Wy01MCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UaHJlc2hvbGQtTGV2ZWwtLWRCLTwvTklDSz4KKzxCTFVSQj5UaHJlc2hvbGQtTGV2ZWwtLWRCLS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+bGFkc3BhLW5vaXNlLXdoaXRlOjpBbXBsaXR1ZGU8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkFtcGxpdHVkZTwvTklDSz4KKzxCTFVSQj5BbXBsaXR1ZGUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNNUFRFQWxwaGE6OmJvcmRlcjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Qm9yZGVyPC9OSUNLPgorPEJMVVJCPlRoZSBib3JkZXIgd2lkdGggb2YgdGhlIHRyYW5zaXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNNUFRFQWxwaGE6OmRlcHRoPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSwyNF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRlcHRoPC9OSUNLPgorPEJMVVJCPkRlcHRoIG9mIHRoZSBtYXNrIGluIGJpdHMuPC9CTFVSQj4KKzxERUZBVUxUPjE2PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTTVBURUFscGhhOjpwb3NpdGlvbjwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBvc2l0aW9uPC9OSUNLPgorPEJMVVJCPlBvc2l0aW9uIG9mIHRoZSB0cmFuc2l0aW9uIGVmZmVjdC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U01QVEVBbHBoYTo6dHlwZTwvTkFNRT4KKzxUWVBFPkdzdFNNUFRFQWxwaGFUcmFuc2l0aW9uVHlwZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlR5cGU8L05JQ0s+Cis8QkxVUkI+VGhlIHR5cGUgb2YgdHJhbnNpdGlvbiB0byB1c2UuPC9CTFVSQj4KKzxERUZBVUxUPkEgYmFyIG1vdmVzIGZyb20gbGVmdCB0byByaWdodDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U01QVEVBbHBoYTo6aW52ZXJ0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5JbnZlcnQ8L05JQ0s+Cis8QkxVUkI+SW52ZXJ0IHRyYW5zaXRpb24gbWFzay48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvS2FyYW9rZTo6ZmlsdGVyLWJhbmQ8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsNDQxXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RmlsdGVyIEJhbmQ8L05JQ0s+Cis8QkxVUkI+VGhlIEZyZXF1ZW5jeSBiYW5kIG9mIHRoZSBmaWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjIyMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9LYXJhb2tlOjpmaWx0ZXItd2lkdGg8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RmlsdGVyIFdpZHRoPC9OSUNLPgorPEJMVVJCPlRoZSBGcmVxdWVuY3kgd2lkdGggb2YgdGhlIGZpbHRlci48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb0thcmFva2U6OmxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5MZXZlbDwvTklDSz4KKzxCTFVSQj5MZXZlbCBvZiB0aGUgZWZmZWN0ICgxLjAgPSBmdWxsKS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9LYXJhb2tlOjptb25vLWxldmVsPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Nb25vIExldmVsPC9OSUNLPgorPEJMVVJCPkxldmVsIG9mIHRoZSBtb25vIGNoYW5uZWwgKDEuMCA9IGZ1bGwpLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RQdWxzZVNpbms6OmRldmljZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRldmljZTwvTklDSz4KKzxCTFVSQj5UaGUgUHVsc2VBdWRpbyBzaW5rIGRldmljZSB0byBjb25uZWN0IHRvLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RQdWxzZVNpbms6OnNlcnZlcjwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNlcnZlcjwvTklDSz4KKzxCTFVSQj5UaGUgUHVsc2VBdWRpbyBzZXJ2ZXIgdG8gY29ubmVjdCB0by48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVsc2VTaW5rOjpkZXZpY2UtbmFtZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+RGV2aWNlIG5hbWU8L05JQ0s+Cis8QkxVUkI+SHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgc291bmQgZGV2aWNlLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RQdWxzZVNpbms6OnZvbHVtZTwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsMTBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Wb2x1bWU8L05JQ0s+Cis8QkxVUkI+TGluZWFyIHZvbHVtZSBvZiB0aGlzIHN0cmVhbSwgMS4wPTEwMCUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFB1bHNlU2luazo6bXV0ZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TXV0ZTwvTklDSz4KKzxCTFVSQj5NdXRlIHN0YXRlIG9mIHRoaXMgc3RyZWFtLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVsc2VTaW5rOjpzdHJlYW0tcHJvcGVydGllczwvTkFNRT4KKzxUWVBFPkdzdFN0cnVjdHVyZSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5zdHJlYW0gcHJvcGVydGllczwvTklDSz4KKzxCTFVSQj5saXN0IG9mIHB1bHNlYXVkaW8gc3RyZWFtIHByb3BlcnRpZXMuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVsc2VTaW5rOjpjbGllbnQtbmFtZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNsaWVudCBOYW1lPC9OSUNLPgorPEJMVVJCPlRoZSBQdWxzZUF1ZGlvIGNsaWVudCBuYW1lIHRvIHVzZS48L0JMVVJCPgorPERFRkFVTFQ+ImdzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy1zY2FuIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVsc2VTaW5rOjpjdXJyZW50LWRldmljZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+Q3VycmVudCBEZXZpY2U8L05JQ0s+Cis8QkxVUkI+VGhlIGN1cnJlbnQgUHVsc2VBdWRpbyBzaW5rIGRldmljZS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVsc2VTcmM6OmRldmljZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRldmljZTwvTklDSz4KKzxCTFVSQj5UaGUgUHVsc2VBdWRpbyBzb3VyY2UgZGV2aWNlIHRvIGNvbm5lY3QgdG8uPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFB1bHNlU3JjOjpzZXJ2ZXI8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TZXJ2ZXI8L05JQ0s+Cis8QkxVUkI+VGhlIFB1bHNlQXVkaW8gc2VydmVyIHRvIGNvbm5lY3QgdG8uPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFB1bHNlU3JjOjpkZXZpY2UtbmFtZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+RGV2aWNlIG5hbWU8L05JQ0s+Cis8QkxVUkI+SHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgc291bmQgZGV2aWNlLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RQdWxzZVNyYzo6c3RyZWFtLXByb3BlcnRpZXM8L05BTUU+Cis8VFlQRT5Hc3RTdHJ1Y3R1cmUqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+c3RyZWFtIHByb3BlcnRpZXM8L05JQ0s+Cis8QkxVUkI+bGlzdCBvZiBwdWxzZWF1ZGlvIHN0cmVhbSBwcm9wZXJ0aWVzLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFB1bHNlU3JjOjptdXRlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NdXRlPC9OSUNLPgorPEJMVVJCPk11dGUgc3RhdGUgb2YgdGhpcyBzdHJlYW0uPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RQdWxzZVNyYzo6c291cmNlLW91dHB1dC1pbmRleDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5zb3VyY2Ugb3V0cHV0IGluZGV4PC9OSUNLPgorPEJMVVJCPlRoZSBpbmRleCBvZiB0aGUgUHVsc2VBdWRpbyBzb3VyY2Ugb3V0cHV0IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyByZWNvcmQgc3RyZWFtLjwvQkxVUkI+Cis8REVGQVVMVD40Mjk0OTY3Mjk1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RQdWxzZVNyYzo6dm9sdW1lPC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlZvbHVtZTwvTklDSz4KKzxCTFVSQj5MaW5lYXIgdm9sdW1lIG9mIHRoaXMgc3RyZWFtLCAxLjA9MTAwJS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVsc2VTcmM6OmNsaWVudC1uYW1lPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q2xpZW50IE5hbWU8L05JQ0s+Cis8QkxVUkI+VGhlIFB1bHNlQXVkaW8gY2xpZW50X25hbWVfdG9fdXNlLjwvQkxVUkI+Cis8REVGQVVMVD4iZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLXNjYW4iPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RQdWxzZVNyYzo6Y3VycmVudC1kZXZpY2U8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkN1cnJlbnQgRGV2aWNlPC9OSUNLPgorPEJMVVJCPlRoZSBjdXJyZW50IFB1bHNlQXVkaW8gc291cmNlIGRldmljZS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VGFnSW5qZWN0Ojp0YWdzPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+dzwvRkxBR1M+Cis8TklDSz50YWdsaXN0PC9OSUNLPgorPEJMVVJCPkxpc3Qgb2YgdGFncyB0byBpbmplY3QgaW50byB0aGUgdGFyZ2V0IGZpbGUuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERlaW50ZXJsZWF2ZTo6a2VlcC1wb3NpdGlvbnM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPktlZXAgcG9zaXRpb25zPC9OSUNLPgorPEJMVVJCPktlZXAgdGhlIG9yaWdpbmFsIGNoYW5uZWwgcG9zaXRpb25zIG9uIHRoZSBvdXRwdXQgYnVmZmVycy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEludGVybGVhdmU6OmNoYW5uZWwtcG9zaXRpb25zPC9OQU1FPgorPFRZUEU+R1ZhbHVlQXJyYXkqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q2hhbm5lbCBwb3NpdGlvbnM8L05JQ0s+Cis8QkxVUkI+Q2hhbm5lbCBwb3NpdGlvbnMgdXNlZCBvbiB0aGUgb3V0cHV0LjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEludGVybGVhdmU6OmNoYW5uZWwtcG9zaXRpb25zLWZyb20taW5wdXQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNoYW5uZWwgcG9zaXRpb25zIGZyb20gaW5wdXQ8L05JQ0s+Cis8QkxVUkI+VGFrZSBjaGFubmVsIHBvc2l0aW9ucyBmcm9tIHRoZSBpbnB1dC48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UmdWb2x1bWU6OmFsYnVtLW1vZGU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkFsYnVtIG1vZGU8L05JQ0s+Cis8QkxVUkI+UHJlZmVyIGFsYnVtIG92ZXIgdHJhY2sgZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UmdWb2x1bWU6OmZhbGxiYWNrLWdhaW48L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlstNjAsNjBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5GYWxsYmFjayBnYWluPC9OSUNLPgorPEJMVVJCPkdhaW4gZm9yIHN0cmVhbXMgbWlzc2luZyB0YWdzIFtkQl0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJnVm9sdW1lOjpoZWFkcm9vbTwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsNjBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5IZWFkcm9vbTwvTklDSz4KKzxCTFVSQj5FeHRyYSBoZWFkcm9vbSBbZEJdLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSZ1ZvbHVtZTo6cHJlLWFtcDwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Wy02MCw2MF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlByZS1hbXA8L05JQ0s+Cis8QkxVUkI+RXh0cmEgZ2FpbiBbZEJdLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSZ1ZvbHVtZTo6cmVzdWx0LWdhaW48L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlstMTIwLDEyMF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+UmVzdWx0LWdhaW48L05JQ0s+Cis8QkxVUkI+QXBwbGllZCBnYWluIFtkQl0uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJnVm9sdW1lOjp0YXJnZXQtZ2FpbjwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Wy0xMjAsMTIwXTwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5UYXJnZXQtZ2FpbjwvTklDSz4KKzxCTFVSQj5BcHBsaWNhYmxlIGdhaW4gW2RCXS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UmdMaW1pdGVyOjplbmFibGVkPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5FbmFibGVkPC9OSUNLPgorPEJMVVJCPkVuYWJsZSBwcm9jZXNzaW5nLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSZ0FuYWx5c2lzOjpmb3JjZWQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZvcmNlZDwvTklDSz4KKzxCTFVSQj5BbmFseXplIGV2ZW4gaWYgUmVwbGF5R2FpbiB0YWdzIGV4aXN0LjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSZ0FuYWx5c2lzOjpudW0tdHJhY2tzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5OdW1iZXIgb2YgYWxidW0gdHJhY2tzPC9OSUNLPgorPEJMVVJCPk51bWJlciBvZiByZW1haW5pbmcgYWxidW0gdHJhY2tzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSZ0FuYWx5c2lzOjpyZWZlcmVuY2UtbGV2ZWw8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlswLDE1MF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJlZmVyZW5jZSBsZXZlbDwvTklDSz4KKzxCTFVSQj5SZWZlcmVuY2UgbGV2ZWwgW2RCXS48L0JMVVJCPgorPERFRkFVTFQ+ODk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJnQW5hbHlzaXM6Om1lc3NhZ2U8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5NZXNzYWdlPC9OSUNLPgorPEJMVVJCPlBvc3Qgc3RhdGljcyBtZXNzYWdlcy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEhEVjEzOTRTcmM6OmNoYW5uZWw8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDY0XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q2hhbm5lbDwvTklDSz4KKzxCTFVSQj5DaGFubmVsIG51bWJlciBmb3IgbGlzdGVuaW5nLjwvQkxVUkI+Cis8REVGQVVMVD42MzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SERWMTM5NFNyYzo6ZGV2aWNlLW5hbWU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPmRldmljZSBuYW1lPC9OSUNLPgorPEJMVVJCPnVzZXItZnJpZW5kbHkgbmFtZSBvZiB0aGUgZGV2aWNlLjwvQkxVUkI+Cis8REVGQVVMVD4iRGVmYXVsdCI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEhEVjEzOTRTcmM6Omd1aWQ8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+R1VJRDwvTklDSz4KKzxCTFVSQj5zZWxlY3Qgb25lIG9mIG11bHRpcGxlIERWIGRldmljZXMgYnkgaXRzIEdVSUQuIHVzZSBhIGhleGFkZWNpbWFsIGxpa2UgMHhoaGhoaGhoaGhoaGhoaGhoLiAoMCA9IG5vIGd1aWQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RIRFYxMzk0U3JjOjpwb3J0PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bR19NQVhVTE9ORywxNl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBvcnQ8L05JQ0s+Cis8QkxVUkI+UG9ydCBudW1iZXIgKC0xIGF1dG9tYXRpYykuPC9CTFVSQj4KKzxERUZBVUxUPi0xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RIRFYxMzk0U3JjOjp1c2UtYXZjPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Vc2UgQVYvQzwvTklDSz4KKzxCTFVSQj5Vc2UgQVYvQyBWVFIgY29udHJvbC48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSlBFR1BheTo6cXVhbGl0eTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMjU1XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UXVhbGl0eTwvTklDSz4KKzxCTFVSQj5RdWFsaXR5IGZhY3RvciBvbiBKUEVHIGRhdGEgKHVudXNlZCkuPC9CTFVSQj4KKzxERUZBVUxUPjI1NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSlBFR1BheTo6dHlwZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMjU1XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VHlwZTwvTklDSz4KKzxCTFVSQj5EZWZhdWx0IEpQRUcgVHlwZSwgb3ZlcndyaXR0ZW4gYnkgU09GIHdoZW4gcHJlc2VudC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9GSVJGaWx0ZXI6Omtlcm5lbDwvTkFNRT4KKzxUWVBFPkdWYWx1ZUFycmF5KjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZpbHRlciBLZXJuZWw8L05JQ0s+Cis8QkxVUkI+RmlsdGVyIGtlcm5lbCBmb3IgdGhlIEZJUiBmaWx0ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9GSVJGaWx0ZXI6OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TGF0ZWN5PC9OSUNLPgorPEJMVVJCPkZpbHRlciBsYXRlbmN5IGluIHNhbXBsZXMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvSUlSRmlsdGVyOjphPC9OQU1FPgorPFRZUEU+R1ZhbHVlQXJyYXkqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QTwvTklDSz4KKzxCTFVSQj5GaWx0ZXIgY29lZmZpY2llbnRzIChkZW5vbWluYXRvciBvZiB0cmFuc2ZlciBmdW5jdGlvbikuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9JSVJGaWx0ZXI6OmI8L05BTUU+Cis8VFlQRT5HVmFsdWVBcnJheSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CPC9OSUNLPgorPEJMVVJCPkZpbHRlciBjb2VmZmljaWVudHMgKG51bWVyYXRvciBvZiB0cmFuc2ZlciBmdW5jdGlvbikuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9FY2hvOjpkZWxheTwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+Pj0gMTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RGVsYXk8L05JQ0s+Cis8QkxVUkI+RGVsYXkgb2YgdGhlIGVjaG8gaW4gbmFub3NlY29uZHMuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvRWNobzo6ZmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPkFtb3VudCBvZiBmZWVkYmFjay48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QXVkaW9FY2hvOjppbnRlbnNpdHk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVuc2l0eTwvTklDSz4KKzxCTFVSQj5JbnRlbnNpdHkgb2YgdGhlIGVjaG8uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEF1ZGlvRWNobzo6bWF4LWRlbGF5PC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT4+PSAxPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXhpbXVtIERlbGF5PC9OSUNLPgorPEJMVVJCPk1heGltdW0gZGVsYXkgb2YgdGhlIGVjaG8gaW4gbmFub3NlY29uZHMgKGNhbid0IGJlIGNoYW5nZWQgaW4gUExBWUlORyBvciBQQVVTRUQgc3RhdGUpLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb0VjaG86OnN1cnJvdW5kLWRlbGF5PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5FbmFibGUgU3Vycm91bmQgRGVsYXk8L05JQ0s+Cis8QkxVUkI+RGVsYXkgU3Vycm91bmQgQ2hhbm5lbHMgd2hlbiBUUlVFIGluc3RlYWQgb2YgYXBwbHlpbmcgYW4gZWNobyBlZmZlY3QuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBdWRpb0VjaG86OnN1cnJvdW5kLW1hc2s8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPj49IDE8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlN1cnJvdW5kIE1hc2s8L05JQ0s+Cis8QkxVUkI+QSBiaXRtYXNrIG9mIGNoYW5uZWxzIHRoYXQgYXJlIGNvbnNpZGVyZWQgc3Vycm91bmQgYW5kIGRlbGF5ZWQgd2hlbiBzdXJyb3VuZC1kZWxheSA9IFRSVUUuPC9CTFVSQj4KKzxERUZBVUxUPjE4NDQ2NzQ0MDczNzA5NTUxNjEyPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBc3BlY3RSYXRpb0Nyb3A6OmFzcGVjdC1yYXRpbzwvTkFNRT4KKzxUWVBFPkdzdEZyYWN0aW9uPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+YXNwZWN0LXJhdGlvPC9OSUNLPgorPEJMVVJCPlRhcmdldCBhc3BlY3QtcmF0aW8gb2YgdmlkZW8uPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwRzcyNkRlcGF5Ojpmb3JjZS1hYWwyPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Gb3JjZSBBQUwyPC9OSUNLPgorPEJMVVJCPkZvcmNlIEFBTDIgZGVjb2RpbmcgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBiYWQgcGF5bG9hZGVycy48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwRzcyNlBheTo6Zm9yY2UtYWFsMjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Rm9yY2UgQUFMMjwvTklDSz4KKzxCTFVSQj5Gb3JjZSBBQUwyIGVuY29kaW5nIGZvciBjb21wYXRpYmlsaXR5IHdpdGggYmFkIGRlcGF5bG9hZGVycy48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSDI2M1BheTo6bW9kZWEtb25seTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RnJhZ21lbnQgcGFja2V0cyBpbiBtb2RlIEEgT25seTwvTklDSz4KKzxCTFVSQj5EaXNhYmxlIHBhY2tldGl6YXRpb24gbW9kZXMgQiBhbmQgQy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERlaW50ZXJsYWNlOjpmaWVsZHM8L05BTUU+Cis8VFlQRT5Hc3REZWludGVybGFjZUZpZWxkczwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPmZpZWxkczwvTklDSz4KKzxCTFVSQj5GaWVsZHMgdG8gdXNlIGZvciBkZWludGVybGFjaW5nLjwvQkxVUkI+Cis8REVGQVVMVD5BbGwgZmllbGRzPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REZWludGVybGFjZTo6bWV0aG9kPC9OQU1FPgorPFRZUEU+R3N0RGVpbnRlcmxhY2VNZXRob2RzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWV0aG9kPC9OSUNLPgorPEJMVVJCPkRlaW50ZXJsYWNlIE1ldGhvZC48L0JMVVJCPgorPERFRkFVTFQ+TGluZWFyPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REZWludGVybGFjZTo6bW9kZTwvTkFNRT4KKzxUWVBFPkdzdERlaW50ZXJsYWNlTW9kZXM8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPkRlaW50ZXJsYWNlIE1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPkF1dG8gZGV0ZWN0aW9uIChiZXN0IGVmZm9ydCk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERlaW50ZXJsYWNlOjp0ZmY8L05BTUU+Cis8VFlQRT5Hc3REZWludGVybGFjZUZpZWxkTGF5b3V0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+dGZmPC9OSUNLPgorPEJMVVJCPkRlaW50ZXJsYWNlIHRvcCBmaWVsZCBmaXJzdC48L0JMVVJCPgorPERFRkFVTFQ+QXV0byBkZXRlY3Rpb248L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERlaW50ZXJsYWNlOjpkcm9wLW9ycGhhbnM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPmRyb3Atb3JwaGFuczwvTklDSz4KKzxCTFVSQj5Ecm9wIG9ycGhhbiBmaWVsZHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0ZWxlY2luZSBwYXR0ZXJucyBpbiBhY3RpdmUgbG9ja2luZyBtb2RlLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REZWludGVybGFjZTo6aWdub3JlLW9ic2N1cmU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPmlnbm9yZS1vYnNjdXJlPC9OSUNLPgorPEJMVVJCPklnbm9yZSBvYnNjdXJlIHRlbGVjaW5lIHBhdHRlcm5zIChvbmx5IGNvbnNpZGVyIFAsIEkgYW5kIDI6MyB2YXJpYW50cykuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdERlaW50ZXJsYWNlOjpsb2NraW5nPC9OQU1FPgorPFRZUEU+R3N0RGVpbnRlcmxhY2VMb2NraW5nPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+bG9ja2luZzwvTklDSz4KKzxCTFVSQj5QYXR0ZXJuIGxvY2tpbmcgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+Tm8gcGF0dGVybiBsb2NraW5nPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBZ2luZ1RWOjpjb2xvci1hZ2luZzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29sb3IgQWdpbmc8L05JQ0s+Cis8QkxVUkI+Q29sb3IgQWdpbmcuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEFnaW5nVFY6OmR1c3RzPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EdXN0czwvTklDSz4KKzxCTFVSQj5EdXN0cy48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0QWdpbmdUVjo6cGl0czwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UGl0czwvTklDSz4KKzxCTFVSQj5QaXRzLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RBZ2luZ1RWOjpzY3JhdGNoLWxpbmVzPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMjA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNjcmF0Y2ggTGluZXM8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIHNjcmF0Y2ggbGluZXMuPC9CTFVSQj4KKzxERUZBVUxUPjc8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE9wVFY6Om1vZGU8L05BTUU+Cis8VFlQRT5Hc3RPcFRWTW9kZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1vZGU8L05JQ0s+Cis8QkxVUkI+TW9kZS48L0JMVVJCPgorPERFRkFVTFQ+TWFlbHN0cm9tPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RPcFRWOjpzcGVlZDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TcGVlZDwvTklDSz4KKzxCTFVSQj5FZmZlY3Qgc3BlZWQuPC9CTFVSQj4KKzxERUZBVUxUPjE2PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RPcFRWOjp0aHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSBHX01BWElOVDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VGhyZXNob2xkPC9OSUNLPgorPEJMVVJCPkx1bWEgdGhyZXNob2xkLjwvQkxVUkI+Cis8REVGQVVMVD42MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UmFkaW9hY1RWOjpjb2xvcjwvTkFNRT4KKzxUWVBFPkdzdFJhZGlvYWNUVkNvbG9yPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29sb3I8L05JQ0s+Cis8QkxVUkI+Q29sb3IuPC9CTFVSQj4KKzxERUZBVUxUPldoaXRlPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSYWRpb2FjVFY6OmludGVydmFsPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gR19NQVhJTlQ8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVydmFsPC9OSUNLPgorPEJMVVJCPlNuYXBzaG90IGludGVydmFsIChpbiBzdHJvYmUgbW9kZSkuPC9CTFVSQj4KKzxERUZBVUxUPjM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJhZGlvYWNUVjo6bW9kZTwvTkFNRT4KKzxUWVBFPkdzdFJhZGlvYWNUVk1vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPk1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPk5vcm1hbDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UmFkaW9hY1RWOjp0cmlnZ2VyPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UcmlnZ2VyPC9OSUNLPgorPEJMVVJCPlRyaWdnZXIgKGluIHRyaWdnZXIgbW9kZSkuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTdHJlYWtUVjo6ZmVlZGJhY2s8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZlZWRiYWNrPC9OSUNLPgorPEJMVVJCPkZlZWRiYWNrLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UmlwcGxlVFY6Om1vZGU8L05BTUU+Cis8VFlQRT5Hc3RSaXBwbGVUVk1vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Nb2RlPC9OSUNLPgorPEJMVVJCPk1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPk1vdGlvbiBEZXRlY3Rpb248L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJpcHBsZVRWOjpyZXNldDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+dzwvRkxBR1M+Cis8TklDSz5SZXNldDwvTklDSz4KKzxCTFVSQj5SZXNldCBhbGwgY3VycmVudCByaXBwbGVzLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjpkby1sb3N0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EbyBMb3N0PC9OSUNLPgorPEJMVVJCPlNlbmQgYW4gZXZlbnQgZG93bnN0cmVhbSB3aGVuIGEgcGFja2V0IGlzIGxvc3QuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBCaW46OmxhdGVuY3k8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkJ1ZmZlciBsYXRlbmN5IGluIG1zPC9OSUNLPgorPEJMVVJCPkRlZmF1bHQgYW1vdW50IG9mIG1zIHRvIGJ1ZmZlciBpbiB0aGUgaml0dGVyYnVmZmVycy48L0JMVVJCPgorPERFRkFVTFQ+MjAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBCaW46OnNkZXM8L05BTUU+Cis8VFlQRT5Hc3RTdHJ1Y3R1cmUqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U0RFUzwvTklDSz4KKzxCTFVSQj5UaGUgU0RFUyBpdGVtcyBvZiB0aGlzIHNlc3Npb24uPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjppZ25vcmUtcHQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPklnbm9yZSBQVDwvTklDSz4KKzxCTFVSQj5EbyBub3QgZGVtdWx0aXBsZXggYmFzZWQgb24gUFQgdmFsdWVzLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjphdXRvcmVtb3ZlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5BdXRvIFJlbW92ZTwvTklDSz4KKzxCTFVSQj5BdXRvbWF0aWNhbGx5IHJlbW92ZSB0aW1lZCBvdXQgc291cmNlcy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEJpbjo6YnVmZmVyLW1vZGU8L05BTUU+Cis8VFlQRT5SVFBKaXR0ZXJCdWZmZXJNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QnVmZmVyIE1vZGU8L05JQ0s+Cis8QkxVUkI+Q29udHJvbCB0aGUgYnVmZmVyaW5nIGFsZ29yaXRobSBpbiB1c2UuPC9CTFVSQj4KKzxERUZBVUxUPlNsYXZlIHJlY2VpdmVyIHRvIHNlbmRlciBjbG9jazwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjpudHAtc3luYzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U3luYyBvbiBOVFAgY2xvY2s8L05JQ0s+Cis8QkxVUkI+U3luY2hyb25pemUgcmVjZWl2ZWQgc3RyZWFtcyB0byB0aGUgTlRQIGNsb2NrLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjp1c2UtcGlwZWxpbmUtY2xvY2s8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlVzZSBwaXBlbGluZSBjbG9jazwvTklDSz4KKzxCTFVSQj5Vc2UgdGhlIHBpcGVsaW5lIHJ1bm5pbmctdGltZSB0byBzZXQgdGhlIE5UUCB0aW1lIGluIHRoZSBSVENQIFNSIG1lc3NhZ2VzIChERVBSRUNBVEVEOiBVc2UgbnRwLXRpbWUtc291cmNlIHByb3BlcnR5KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEJpbjo6cnRjcC1zeW5jPC9OQU1FPgorPFRZUEU+R3N0UlRDUFN5bmM8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SVENQIFN5bmM8L05JQ0s+Cis8QkxVUkI+VXNlIG9mIFJUQ1AgU1IgaW4gc3luY2hyb25pemF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD5hbHdheXM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEJpbjo6cnRjcC1zeW5jLWludGVydmFsPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SVENQIFN5bmMgSW50ZXJ2YWw8L05JQ0s+Cis8QkxVUkI+UlRDUCBTUiBpbnRlcnZhbCBzeW5jaHJvbml6YXRpb24gKG1zKSAoMCA9IGFsd2F5cykuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEJpbjo6ZHJvcC1vbi1sYXRlbmN5PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Ecm9wIGJ1ZmZlcnMgd2hlbiBtYXhpbXVtIGxhdGVuY3kgaXMgcmVhY2hlZDwvTklDSz4KKzxCTFVSQj5UZWxscyB0aGUgaml0dGVyYnVmZmVyIHRvIG5ldmVyIGV4Y2VlZCB0aGUgZ2l2ZW4gbGF0ZW5jeSBpbiBzaXplLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjpkby1zeW5jLWV2ZW50PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EbyBTeW5jIEV2ZW50PC9OSUNLPgorPEJMVVJCPlNlbmQgZXZlbnQgZG93bnN0cmVhbSB3aGVuIGEgc3RyZWFtIGlzIHN5bmNocm9uaXplZCB0byB0aGUgc2VuZGVyLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjpkby1yZXRyYW5zbWlzc2lvbjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RG8gcmV0cmFuc21pc3Npb248L05JQ0s+Cis8QkxVUkI+RW5hYmxlIHJldHJhbnNtaXNzaW9uIG9uIGFsbCBzdHJlYW1zLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjpydHAtcHJvZmlsZTwvTkFNRT4KKzxUWVBFPkdzdFJUUFByb2ZpbGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SVFAgUHJvZmlsZTwvTklDSz4KKzxCTFVSQj5EZWZhdWx0IFJUUCBwcm9maWxlIG9mIG5ld2x5IGNyZWF0ZWQgc2Vzc2lvbnMuPC9CTFVSQj4KKzxERUZBVUxUPkdTVF9SVFBfUFJPRklMRV9BVlA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEJpbjo6bnRwLXRpbWUtc291cmNlPC9OQU1FPgorPFRZUEU+R3N0UnRwTnRwVGltZVNvdXJjZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk5UUCBUaW1lIFNvdXJjZTwvTklDSz4KKzxCTFVSQj5OVFAgdGltZSBzb3VyY2UgZm9yIFJUQ1AgcGFja2V0cy48L0JMVVJCPgorPERFRkFVTFQ+TlRQIHRpbWUgYmFzZWQgb24gcmVhbHRpbWUgY2xvY2s8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEJpbjo6bWF4LWRyb3BvdXQtdGltZTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IGRyb3BvdXQgdGltZTwvTklDSz4KKzxCTFVSQj5UaGUgbWF4aW11bSB0aW1lIChtaWxsaXNlY29uZHMpIG9mIG1pc3NpbmcgcGFja2V0cyB0b2xlcmF0ZWQuPC9CTFVSQj4KKzxERUZBVUxUPjYwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBCaW46Om1heC1taXNvcmRlci10aW1lPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggbWlzb3JkZXIgdGltZTwvTklDSz4KKzxCTFVSQj5UaGUgbWF4aW11bSB0aW1lIChtaWxsaXNlY29uZHMpIG9mIG1pc29yZGVyZWQgcGFja2V0cyB0b2xlcmF0ZWQuPC9CTFVSQj4KKzxERUZBVUxUPjIwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEJpbjo6bWF4LXJ0Y3AtcnRwLXRpbWUtZGlmZjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IFJUQ1AgUlRQIFRpbWUgRGlmZjwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIGFtb3VudCBvZiB0aW1lIGluIG1zIHRoYXQgdGhlIFJUUCB0aW1lIGluIFJUQ1AgU1JzIGlzIGFsbG93ZWQgdG8gYmUgYWhlYWQgKC0xIGRpc2FibGVkKS48L0JMVVJCPgorPERFRkFVTFQ+MTAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjpydGNwLXN5bmMtc2VuZC10aW1lPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SVENQIFN5bmMgU2VuZCBUaW1lPC9OSUNLPgorPEJMVVJCPlVzZSBzZW5kIHRpbWUgb3IgY2FwdHVyZSB0aW1lIGZvciBSVENQIHN5bmMgKFRSVUUgPSBzZW5kIHRpbWUsIEZBTFNFID0gY2FwdHVyZSB0aW1lKS48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjpyZmM3MjczLXN5bmM8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlN5bmMgb24gUkZDNzI3MyBjbG9jazwvTklDSz4KKzxCTFVSQj5TeW5jaHJvbml6ZSByZWNlaXZlZCBzdHJlYW1zIHRvIHRoZSBSRkM3MjczIGNsb2NrIChyZXF1aXJlcyBjbG9jayBhbmQgb2Zmc2V0IHRvIGJlIHByb3ZpZGVkKS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEJpbjo6bWF4LXN0cmVhbXM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBTdHJlYW1zPC9OSUNLPgorPEJMVVJCPlRoZSBtYXhpbXVtIG51bWJlciBvZiBzdHJlYW1zIHRvIGNyZWF0ZSBmb3Igb25lIHNlc3Npb24uPC9CTFVSQj4KKzxERUZBVUxUPjQyOTQ5NjcyOTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEJpbjo6bWF4LXRzLW9mZnNldDwvTkFNRT4KKzxUWVBFPmdpbnQ2NDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggVFMgT2Zmc2V0PC9OSUNLPgorPEJMVVJCPlRoZSBtYXhpbXVtIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0aW1lIG9mZnNldCBpbiAobmFub3NlY29uZHMpLiBOb3RlLCBpZiB0aGUgbnRwLXN5bmMgcGFyYW1ldGVyIGlzIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBjaGFuZ2VkIHRvIDAgKG5vIGxpbWl0KS48L0JMVVJCPgorPERFRkFVTFQ+MzAwMDAwMDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwQmluOjptYXgtdHMtb2Zmc2V0LWFkanVzdG1lbnQ8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IFRpbWVzdGFtcCBPZmZzZXQgQWRqdXN0bWVudDwvTklDSz4KKzxCTFVSQj5UaGUgbWF4aW11bSBudW1iZXIgb2YgbmFub3NlY29uZHMgcGVyIGZyYW1lIHRoYXQgdGltZSBzdGFtcCBvZmZzZXRzIG1heSBiZSBhZGp1c3RlZCAoMCA9IG5vIGxpbWl0KS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSml0dGVyQnVmZmVyOjpkby1sb3N0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EbyBMb3N0PC9OSUNLPgorPEJMVVJCPlNlbmQgYW4gZXZlbnQgZG93bnN0cmVhbSB3aGVuIGEgcGFja2V0IGlzIGxvc3QuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OmRyb3Atb24tbGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RHJvcCBidWZmZXJzIHdoZW4gbWF4aW11bSBsYXRlbmN5IGlzIHJlYWNoZWQ8L05JQ0s+Cis8QkxVUkI+VGVsbHMgdGhlIGppdHRlcmJ1ZmZlciB0byBuZXZlciBleGNlZWQgdGhlIGdpdmVuIGxhdGVuY3kgaW4gc2l6ZS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEppdHRlckJ1ZmZlcjo6bGF0ZW5jeTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QnVmZmVyIGxhdGVuY3kgaW4gbXM8L05JQ0s+Cis8QkxVUkI+QW1vdW50IG9mIG1zIHRvIGJ1ZmZlci48L0JMVVJCPgorPERFRkFVTFQ+MjAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnRzLW9mZnNldDwvTkFNRT4KKzxUWVBFPmdpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRpbWVzdGFtcCBPZmZzZXQ8L05JQ0s+Cis8QkxVUkI+QWRqdXN0IGJ1ZmZlciB0aW1lc3RhbXBzIHdpdGggb2Zmc2V0IGluIG5hbm9zZWNvbmRzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6Om1vZGU8L05BTUU+Cis8VFlQRT5SVFBKaXR0ZXJCdWZmZXJNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TW9kZTwvTklDSz4KKzxCTFVSQj5Db250cm9sIHRoZSBidWZmZXJpbmcgYWxnb3JpdGhtIGluIHVzZS48L0JMVVJCPgorPERFRkFVTFQ+U2xhdmUgcmVjZWl2ZXIgdG8gc2VuZGVyIGNsb2NrPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnBlcmNlbnQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+cGVyY2VudDwvTklDSz4KKzxCTFVSQj5UaGUgYnVmZmVyIGZpbGxlZCBwZXJjZW50LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OmRvLXJldHJhbnNtaXNzaW9uPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EbyBSZXRyYW5zbWlzc2lvbjwvTklDSz4KKzxCTFVSQj5TZW5kIHJldHJhbnNtaXNzaW9uIGV2ZW50cyB1cHN0cmVhbSB3aGVuIGEgcGFja2V0IGlzIGxhdGUuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnJ0eC1kZWxheTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UlRYIERlbGF5PC9OSUNLPgorPEJMVVJCPkV4dHJhIHRpbWUgaW4gbXMgdG8gd2FpdCBiZWZvcmUgc2VuZGluZyByZXRyYW5zbWlzc2lvbiBldmVudCAoLTEgYXV0b21hdGljKS48L0JMVVJCPgorPERFRkFVTFQ+LTE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEppdHRlckJ1ZmZlcjo6cnR4LWRlbGF5LXJlb3JkZXI8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJUWCBEZWxheSBSZW9yZGVyPC9OSUNLPgorPEJMVVJCPlNlbmRpbmcgcmV0cmFuc21pc3Npb24gZXZlbnQgd2hlbiB0aGlzIG11Y2ggcmVvcmRlcmluZyAoMCBkaXNhYmxlLCAtMSBhdXRvbWF0aWMpLjwvQkxVUkI+Cis8REVGQVVMVD4zPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnJ0eC1yZXRyeS1wZXJpb2Q8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJUWCBSZXRyeSBQZXJpb2Q8L05JQ0s+Cis8QkxVUkI+VHJ5IHRvIGdldCBhIHJldHJhbnNtaXNzaW9uIGZvciB0aGlzIG1hbnkgbXMgKC0xIGF1dG9tYXRpYykuPC9CTFVSQj4KKzxERUZBVUxUPi0xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnJ0eC1yZXRyeS10aW1lb3V0PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSBHX01BWFVMT05HPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SVFggUmV0cnkgVGltZW91dDwvTklDSz4KKzxCTFVSQj5SZXRyeSBzZW5kaW5nIGEgdHJhbnNtaXNzaW9uIGV2ZW50IGFmdGVyIHRoaXMgdGltZW91dCBpbiBtcyAoLTEgYXV0b21hdGljKS48L0JMVVJCPgorPERFRkFVTFQ+LTE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEppdHRlckJ1ZmZlcjo6c3RhdHM8L05BTUU+Cis8VFlQRT5Hc3RTdHJ1Y3R1cmUqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5TdGF0aXN0aWNzPC9OSUNLPgorPEJMVVJCPlZhcmlvdXMgc3RhdGlzdGljcy48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnJ0eC1taW4tZGVsYXk8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1pbmltdW0gUlRYIERlbGF5PC9OSUNLPgorPEJMVVJCPk1pbmltdW0gdGltZSBpbiBtcyB0byB3YWl0IGJlZm9yZSBzZW5kaW5nIHJldHJhbnNtaXNzaW9uIGV2ZW50LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnJ0eC1taW4tcmV0cnktdGltZW91dDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UlRYIE1pbiBSZXRyeSBUaW1lb3V0PC9OSUNLPgorPEJMVVJCPk1pbmltdW0gdGltZW91dCBiZXR3ZWVuIHNlbmRpbmcgYSB0cmFuc21pc3Npb24gZXZlbnQgaW4gbXMgKC0xIGF1dG9tYXRpYykuPC9CTFVSQj4KKzxERUZBVUxUPi0xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnJ0eC1tYXgtcmV0cmllczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UlRYIE1heCBSZXRyaWVzPC9OSUNLPgorPEJMVVJCPlRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIHRvIHJlcXVlc3QgYSByZXRyYW5zbWlzc2lvbi4gKC0xIG5vdCBsaW1pdGVkKS48L0JMVVJCPgorPERFRkFVTFQ+LTE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEppdHRlckJ1ZmZlcjo6cnR4LW5leHQtc2VxbnVtPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SVFggbmV4dCBzZXFudW08L05JQ0s+Cis8QkxVUkI+RXN0aW1hdGUgd2hlbiB0aGUgbmV4dCBwYWNrZXQgc2hvdWxkIGFycml2ZSBhbmQgc2NoZWR1bGUgYSByZXRyYW5zbWlzc2lvbiByZXF1ZXN0IGZvciBpdC48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSml0dGVyQnVmZmVyOjptYXgtZHJvcG91dC10aW1lPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggZHJvcG91dCB0aW1lPC9OSUNLPgorPEJMVVJCPlRoZSBtYXhpbXVtIHRpbWUgKG1pbGxpc2Vjb25kcykgb2YgbWlzc2luZyBwYWNrZXRzIHRvbGVyYXRlZC48L0JMVVJCPgorPERFRkFVTFQ+NjAwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cEppdHRlckJ1ZmZlcjo6bWF4LW1pc29yZGVyLXRpbWU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBtaXNvcmRlciB0aW1lPC9OSUNLPgorPEJMVVJCPlRoZSBtYXhpbXVtIHRpbWUgKG1pbGxpc2Vjb25kcykgb2YgbWlzb3JkZXJlZCBwYWNrZXRzIHRvbGVyYXRlZC48L0JMVVJCPgorPERFRkFVTFQ+MjAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSml0dGVyQnVmZmVyOjptYXgtcnRjcC1ydHAtdGltZS1kaWZmPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSBHX01BWFVMT05HPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggUlRDUCBSVFAgVGltZSBEaWZmPC9OSUNLPgorPEJMVVJCPk1heGltdW0gYW1vdW50IG9mIHRpbWUgaW4gbXMgdGhhdCB0aGUgUlRQIHRpbWUgaW4gUlRDUCBTUnMgaXMgYWxsb3dlZCB0byBiZSBhaGVhZCAoLTEgZGlzYWJsZWQpLjwvQkxVUkI+Cis8REVGQVVMVD4xMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OnJmYzcyNzMtc3luYzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U3luYyBvbiBSRkM3MjczIGNsb2NrPC9OSUNLPgorPEJMVVJCPlN5bmNocm9uaXplIHJlY2VpdmVkIHN0cmVhbXMgdG8gdGhlIFJGQzcyNzMgY2xvY2sgKHJlcXVpcmVzIGNsb2NrIGFuZCBvZmZzZXQgdG8gYmUgcHJvdmlkZWQpLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSml0dGVyQnVmZmVyOjpydHgtZGVhZGxpbmU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJUWCBEZWFkbGluZSAobXMpPC9OSUNLPgorPEJMVVJCPlRoZSBkZWFkbGluZSBmb3IgYSB2YWxpZCBSVFggcmVxdWVzdCBpbiBtaWxsaXNlY29uZHMuICgtMSBhdXRvbWF0aWMpLjwvQkxVUkI+Cis8REVGQVVMVD4tMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSml0dGVyQnVmZmVyOjpydHgtc3RhdHMtdGltZW91dDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UlRYIFN0YXRpc3RpY3MgVGltZW91dDwvTklDSz4KKzxCTFVSQj5UaGUgdGltZSB0byB3YWl0IGZvciBhIHJldHJhbnNtaXR0ZWQgcGFja2V0IGFmdGVyIGl0IGhhcyBiZWVuIGNvbnNpZGVyZWQgbG9zdCBpbiBvcmRlciB0byBjb2xsZWN0IHN0YXRpc3RpY3MgKG1zKS48L0JMVVJCPgorPERFRkFVTFQ+MTAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSml0dGVyQnVmZmVyOjpmYXN0c3RhcnQtbWluLXBhY2tldHM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZhc3RzdGFydCBtaW5pbXVtIHBhY2tldHM8L05JQ0s+Cis8QkxVUkI+VGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBwYWNrZXRzIG5lZWRlZCB0byBzdGFydCAoc2V0IHRvIDAgdG8gZGlzYWJsZSBmYXN0c3RhcnQuIFRoZSBqaXR0ZXJidWZmZXIgd2lsbCBieSBkZWZhdWx0IHN0YXJ0IGFmdGVyIHRoZSBsYXRlbmN5IGhhcyBlbGFwc2VkKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSml0dGVyQnVmZmVyOjptYXgtdHMtb2Zmc2V0LWFkanVzdG1lbnQ8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IFRpbWVzdGFtcCBPZmZzZXQgQWRqdXN0bWVudDwvTklDSz4KKzxCTFVSQj5UaGUgbWF4aW11bSBudW1iZXIgb2YgbmFub3NlY29uZHMgcGVyIGZyYW1lIHRoYXQgdGltZSBzdGFtcCBvZmZzZXRzIG1heSBiZSBhZGp1c3RlZCAoMCA9IG5vIGxpbWl0KS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6YmFuZHdpZHRoPC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CYW5kd2lkdGg8L05JQ0s+Cis8QkxVUkI+VGhlIGJhbmR3aWR0aCBvZiB0aGUgc2Vzc2lvbiBpbiBieXRlcyBwZXIgc2Vjb25kICgwIGZvciBhdXRvLWRpc2NvdmVyKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6aW50ZXJuYWwtc2Vzc2lvbjwvTkFNRT4KKzxUWVBFPlJUUFNlc3Npb24qPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5JbnRlcm5hbCBTZXNzaW9uPC9OSUNLPgorPEJMVVJCPlRoZSBpbnRlcm5hbCBSVFBTZXNzaW9uIG9iamVjdC48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBTZXNzaW9uOjpudW0tYWN0aXZlLXNvdXJjZXM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+TnVtIEFjdGl2ZSBTb3VyY2VzPC9OSUNLPgorPEJMVVJCPlRoZSBudW1iZXIgb2YgYWN0aXZlIHNvdXJjZXMgaW4gdGhlIHNlc3Npb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFNlc3Npb246Om51bS1zb3VyY2VzPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPk51bSBTb3VyY2VzPC9OSUNLPgorPEJMVVJCPlRoZSBudW1iZXIgb2Ygc291cmNlcyBpbiB0aGUgc2Vzc2lvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6cnRjcC1mcmFjdGlvbjwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UlRDUCBGcmFjdGlvbjwvTklDSz4KKzxCTFVSQj5UaGUgUlRDUCBiYW5kd2lkdGggb2YgdGhlIHNlc3Npb24gaW4gYnl0ZXMgcGVyIHNlY29uZCAob3IgYXMgYSByZWFsIGZyYWN0aW9uIG9mIHRoZSBSVFAgYmFuZHdpZHRoIGlmIDwgMS4wKS48L0JMVVJCPgorPERFRkFVTFQ+MC4wNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6c2RlczwvTkFNRT4KKzxUWVBFPkdzdFN0cnVjdHVyZSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TREVTPC9OSUNLPgorPEJMVVJCPlRoZSBTREVTIGl0ZW1zIG9mIHRoaXMgc2Vzc2lvbi48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBTZXNzaW9uOjpydGNwLXJyLWJhbmR3aWR0aDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UlRDUCBSUiBiYW5kd2lkdGg8L05JQ0s+Cis8QkxVUkI+VGhlIFJUQ1AgYmFuZHdpZHRoIHVzZWQgZm9yIHJlY2VpdmVycyBpbiBieXRlcyBwZXIgc2Vjb25kICgtMSA9IGRlZmF1bHQpLjwvQkxVUkI+Cis8REVGQVVMVD4tMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6cnRjcC1ycy1iYW5kd2lkdGg8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJUQ1AgUlMgYmFuZHdpZHRoPC9OSUNLPgorPEJMVVJCPlRoZSBSVENQIGJhbmR3aWR0aCB1c2VkIGZvciBzZW5kZXJzIGluIGJ5dGVzIHBlciBzZWNvbmQgKC0xID0gZGVmYXVsdCkuPC9CTFVSQj4KKzxERUZBVUxUPi0xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBTZXNzaW9uOjp1c2UtcGlwZWxpbmUtY2xvY2s8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlVzZSBwaXBlbGluZSBjbG9jazwvTklDSz4KKzxCTFVSQj5Vc2UgdGhlIHBpcGVsaW5lIHJ1bm5pbmctdGltZSB0byBzZXQgdGhlIE5UUCB0aW1lIGluIHRoZSBSVENQIFNSIG1lc3NhZ2VzIChERVBSRUNBVEVEOiBVc2UgbnRwLXRpbWUtc291cmNlIHByb3BlcnR5KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFNlc3Npb246OnJ0Y3AtbWluLWludGVydmFsPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1pbmltdW0gUlRDUCBpbnRlcnZhbDwvTklDSz4KKzxCTFVSQj5NaW5pbXVtIGludGVydmFsIGJldHdlZW4gUmVndWxhciBSVENQIHBhY2tldCAoaW4gbnMpLjwvQkxVUkI+Cis8REVGQVVMVD41MDAwMDAwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBTZXNzaW9uOjpwcm9iYXRpb248L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk51bWJlciBvZiBwcm9iYXRpb25zPC9OSUNLPgorPEJMVVJCPkNvbnNlY3V0aXZlIHBhY2tldCBzZXF1ZW5jZSBudW1iZXJzIHRvIGFjY2VwdCB0aGUgc291cmNlLjwvQkxVUkI+Cis8REVGQVVMVD4yPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBTZXNzaW9uOjpzdGF0czwvTkFNRT4KKzxUWVBFPkdzdFN0cnVjdHVyZSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPlN0YXRpc3RpY3M8L05JQ0s+Cis8QkxVUkI+VmFyaW91cyBzdGF0aXN0aWNzLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFNlc3Npb246OnJ0cC1wcm9maWxlPC9OQU1FPgorPFRZUEU+R3N0UlRQUHJvZmlsZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJUUCBQcm9maWxlPC9OSUNLPgorPEJMVVJCPlJUUCBwcm9maWxlIHRvIHVzZS48L0JMVVJCPgorPERFRkFVTFQ+R1NUX1JUUF9QUk9GSUxFX0FWUDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6bnRwLXRpbWUtc291cmNlPC9OQU1FPgorPFRZUEU+R3N0UnRwTnRwVGltZVNvdXJjZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk5UUCBUaW1lIFNvdXJjZTwvTklDSz4KKzxCTFVSQj5OVFAgdGltZSBzb3VyY2UgZm9yIFJUQ1AgcGFja2V0cy48L0JMVVJCPgorPERFRkFVTFQ+TlRQIHRpbWUgYmFzZWQgb24gcmVhbHRpbWUgY2xvY2s8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFNlc3Npb246Om1heC1kcm9wb3V0LXRpbWU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBkcm9wb3V0IHRpbWU8L05JQ0s+Cis8QkxVUkI+VGhlIG1heGltdW0gdGltZSAobWlsbGlzZWNvbmRzKSBvZiBtaXNzaW5nIHBhY2tldHMgdG9sZXJhdGVkLjwvQkxVUkI+Cis8REVGQVVMVD42MDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6bWF4LW1pc29yZGVyLXRpbWU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBtaXNvcmRlciB0aW1lPC9OSUNLPgorPEJMVVJCPlRoZSBtYXhpbXVtIHRpbWUgKG1pbGxpc2Vjb25kcykgb2YgbWlzb3JkZXJlZCBwYWNrZXRzIHRvbGVyYXRlZC48L0JMVVJCPgorPERFRkFVTFQ+MjAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6cnRjcC1zeW5jLXNlbmQtdGltZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UlRDUCBTeW5jIFNlbmQgVGltZTwvTklDSz4KKzxCTFVSQj5Vc2Ugc2VuZCB0aW1lIG9yIGNhcHR1cmUgdGltZSBmb3IgUlRDUCBzeW5jIChUUlVFID0gc2VuZCB0aW1lLCBGQUxTRSA9IGNhcHR1cmUgdGltZSkuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFJ0eFNlbmQ6Om1heC1zaXplLXRpbWU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBTaXplIFRpbWU8L05JQ0s+Cis8QkxVUkI+QW1vdW50IG9mIG1zIHRvIHF1ZXVlICgwID0gdW5saW1pdGVkKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwUnR4U2VuZDo6bWF4LXNpemUtcGFja2V0czwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDMyNzY3PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggU2l6ZSBQYWNrZXRzPC9OSUNLPgorPEJMVVJCPkFtb3VudCBvZiBwYWNrZXRzIHRvIHF1ZXVlICgwID0gdW5saW1pdGVkKS48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBSdHhTZW5kOjpudW0tcnR4LXJlcXVlc3RzPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPk51bSBSVFggUmVxdWVzdHM8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIHJldHJhbnNtaXNzaW9uIGV2ZW50cyByZWNlaXZlZC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwUnR4U2VuZDo6bnVtLXJ0eC1wYWNrZXRzPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPk51bSBSVFggUGFja2V0czwvTklDSz4KKzxCTFVSQj4gTnVtYmVyIG9mIHJldHJhbnNtaXNzaW9uIHBhY2tldHMgc2VudC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwUnR4U2VuZDo6cGF5bG9hZC10eXBlLW1hcDwvTkFNRT4KKzxUWVBFPkdzdFN0cnVjdHVyZSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5QYXlsb2FkIFR5cGUgTWFwPC9OSUNLPgorPEJMVVJCPk1hcCBvZiBvcmlnaW5hbCBwYXlsb2FkIHR5cGVzIHRvIHRoZWlyIHJldHJhbnNtaXNzaW9uIHBheWxvYWQgdHlwZXMuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwUnR4U2VuZDo6c3NyYy1tYXA8L05BTUU+Cis8VFlQRT5Hc3RTdHJ1Y3R1cmUqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+dzwvRkxBR1M+Cis8TklDSz5TU1JDIE1hcDwvTklDSz4KKzxCTFVSQj5NYXAgb2YgU1NSQ3MgdG8gdGhlaXIgcmV0cmFuc21pc3Npb24gU1NSQ3MgZm9yIFNTUkMtbXVsdGlwbGV4ZWQgbW9kZSAoZGVmYXVsdCA9IHJhbmRvbSkuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwUnR4UmVjZWl2ZTo6bnVtLXJ0eC1yZXF1ZXN0czwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5OdW0gUlRYIFJlcXVlc3RzPC9OSUNLPgorPEJMVVJCPk51bWJlciBvZiByZXRyYW5zbWlzc2lvbiBldmVudHMgcmVjZWl2ZWQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFJ0eFJlY2VpdmU6Om51bS1ydHgtcGFja2V0czwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5OdW0gUlRYIFBhY2tldHM8L05JQ0s+Cis8QkxVUkI+IE51bWJlciBvZiByZXRyYW5zbWlzc2lvbiBwYWNrZXRzIHJlY2VpdmVkLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBSdHhSZWNlaXZlOjpudW0tcnR4LWFzc29jLXBhY2tldHM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+TnVtIFJUWCBBc3NvY2lhdGVkIFBhY2tldHM8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIHJldHJhbnNtaXNzaW9uIHBhY2tldHMgY29ycmVjdGx5IGFzc29jaWF0ZWQgd2l0aCByZXRyYW5zbWlzc2lvbiByZXF1ZXN0cy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwUnR4UmVjZWl2ZTo6cGF5bG9hZC10eXBlLW1hcDwvTkFNRT4KKzxUWVBFPkdzdFN0cnVjdHVyZSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5QYXlsb2FkIFR5cGUgTWFwPC9OSUNLPgorPEJMVVJCPk1hcCBvZiBvcmlnaW5hbCBwYXlsb2FkIHR5cGVzIHRvIHRoZWlyIHJldHJhbnNtaXNzaW9uIHBheWxvYWQgdHlwZXMuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNpbms6OmRldmljZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRldmljZTwvTklDSz4KKzxCTFVSQj5EZXZpY2UgbG9jYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPiIvZGV2L3ZpZGVvMSI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjpkZXZpY2UtZmQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+RmlsZSBkZXNjcmlwdG9yPC9OSUNLPgorPEJMVVJCPkZpbGUgZGVzY3JpcHRvciBvZiB0aGUgZGV2aWNlLjwvQkxVUkI+Cis8REVGQVVMVD4tMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNpbms6OmRldmljZS1uYW1lPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5EZXZpY2UgbmFtZTwvTklDSz4KKzxCTFVSQj5OYW1lIG9mIHRoZSBkZXZpY2UuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjpmbGFnczwvTkFNRT4KKzxUWVBFPkdzdFY0bDJEZXZpY2VUeXBlRmxhZ3M8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPkZsYWdzPC9OSUNLPgorPEJMVVJCPkRldmljZSB0eXBlIGZsYWdzLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjpvdmVybGF5LWhlaWdodDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+T3ZlcmxheSBoZWlnaHQ8L05JQ0s+Cis8QkxVUkI+VGhlIGhlaWdodCBvZiB0aGUgdmlkZW8gb3ZlcmxheTsgZGVmYXVsdCBpcyBlcXVhbCB0byBuZWdvdGlhdGVkIGltYWdlIGhlaWdodC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNpbms6Om92ZXJsYXktbGVmdDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5PdmVybGF5IGxlZnQ8L05JQ0s+Cis8QkxVUkI+VGhlIGxlZnRtb3N0ICh4KSBjb29yZGluYXRlIG9mIHRoZSB2aWRlbyBvdmVybGF5OyB0b3AgbGVmdCBjb3JuZXIgb2Ygc2NyZWVuIGlzIDAsMC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNpbms6Om92ZXJsYXktdG9wPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk92ZXJsYXkgdG9wPC9OSUNLPgorPEJMVVJCPlRoZSB0b3Btb3N0ICh5KSBjb29yZGluYXRlIG9mIHRoZSB2aWRlbyBvdmVybGF5OyB0b3AgbGVmdCBjb3JuZXIgb2Ygc2NyZWVuIGlzIDAsMC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNpbms6Om92ZXJsYXktd2lkdGg8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk92ZXJsYXkgd2lkdGg8L05JQ0s+Cis8QkxVUkI+VGhlIHdpZHRoIG9mIHRoZSB2aWRlbyBvdmVybGF5OyBkZWZhdWx0IGlzIGVxdWFsIHRvIG5lZ290aWF0ZWQgaW1hZ2Ugd2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjpicmlnaHRuZXNzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkJyaWdodG5lc3M8L05JQ0s+Cis8QkxVUkI+UGljdHVyZSBicmlnaHRuZXNzLCBvciBtb3JlIHByZWNpc2VseSwgdGhlIGJsYWNrIGxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWNGwyU2luazo6Y29udHJhc3Q8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29udHJhc3Q8L05JQ0s+Cis8QkxVUkI+UGljdHVyZSBjb250cmFzdCBvciBsdW1hIGdhaW4uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjpodWU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SHVlPC9OSUNLPgorPEJMVVJCPkh1ZSBvciBjb2xvciBiYWxhbmNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWNGwyU2luazo6c2F0dXJhdGlvbjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TYXR1cmF0aW9uPC9OSUNLPgorPEJMVVJCPlBpY3R1cmUgY29sb3Igc2F0dXJhdGlvbiBvciBjaHJvbWEgZ2Fpbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNpbms6OmNyb3AtaGVpZ2h0PC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Dcm9wIGhlaWdodDwvTklDSz4KKzxCTFVSQj5UaGUgaGVpZ2h0IG9mIHRoZSB2aWRlbyBjcm9wOyBkZWZhdWx0IGlzIGVxdWFsIHRvIG5lZ290aWF0ZWQgaW1hZ2UgaGVpZ2h0LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWNGwyU2luazo6Y3JvcC1sZWZ0PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNyb3AgbGVmdDwvTklDSz4KKzxCTFVSQj5UaGUgbGVmdG1vc3QgKHgpIGNvb3JkaW5hdGUgb2YgdGhlIHZpZGVvIGNyb3A7IHRvcCBsZWZ0IGNvcm5lciBvZiBpbWFnZSBpcyAwLDAuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjpjcm9wLXRvcDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Dcm9wIHRvcDwvTklDSz4KKzxCTFVSQj5UaGUgdG9wbW9zdCAoeSkgY29vcmRpbmF0ZSBvZiB0aGUgdmlkZW8gY3JvcDsgdG9wIGxlZnQgY29ybmVyIG9mIGltYWdlIGlzIDAsMC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlNpbms6OmNyb3Atd2lkdGg8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNyb3Agd2lkdGg8L05JQ0s+Cis8QkxVUkI+VGhlIHdpZHRoIG9mIHRoZSB2aWRlbyBjcm9wOyBkZWZhdWx0IGlzIGVxdWFsIHRvIG5lZ290aWF0ZWQgaW1hZ2Ugd2lkdGguPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjppby1tb2RlPC9OQU1FPgorPFRZUEU+R3N0VjRsMklPTW9kZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPklPIG1vZGU8L05JQ0s+Cis8QkxVUkI+SS9PIG1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPkdTVF9WNEwyX0lPX0FVVE88L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjpub3JtPC9OQU1FPgorPFRZUEU+VjRMMl9UVl9ub3JtczwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRWIG5vcm08L05JQ0s+Cis8QkxVUkI+dmlkZW8gc3RhbmRhcmQuPC9CTFVSQj4KKzxERUZBVUxUPm5vbmU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjpleHRyYS1jb250cm9sczwvTkFNRT4KKzxUWVBFPkdzdFN0cnVjdHVyZSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5FeHRyYSBDb250cm9sczwvTklDSz4KKzxCTFVSQj5FeHRyYSB2NGwyIGNvbnRyb2xzIChDSURzKSBmb3IgdGhlIGRldmljZS48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWNGwyU2luazo6Zm9yY2UtYXNwZWN0LXJhdGlvPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Gb3JjZSBhc3BlY3QgcmF0aW88L05JQ0s+Cis8QkxVUkI+V2hlbiBlbmFibGVkLCB0aGUgcGl4ZWwgYXNwZWN0IHJhdGlvIHdpbGwgYmUgZW5mb3JjZWQuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFY0bDJTaW5rOjpwaXhlbC1hc3BlY3QtcmF0aW88L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5QaXhlbCBBc3BlY3QgUmF0aW88L05JQ0s+Cis8QkxVUkI+T3ZlcndyaXRlIHRoZSBwaXhlbCBhc3BlY3QgcmF0aW8gb2YgdGhlIGRldmljZS48L0JMVVJCPgorPERFRkFVTFQ+IjEvMSI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNoYXBlV2lwZTo6Ym9yZGVyPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Cb3JkZXI8L05JQ0s+Cis8QkxVUkI+Qm9yZGVyIG9mIHRoZSBtYXNrLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTaGFwZVdpcGU6OnBvc2l0aW9uPC9OQU1FPgorPFRZUEU+Z2Zsb2F0PC9UWVBFPgorPFJBTkdFPlswLDFdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qb3NpdGlvbjwvTklDSz4KKzxCTFVSQj5Qb3NpdGlvbiBvZiB0aGUgbWFzay48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0Rmx2TXV4OjpzdHJlYW1hYmxlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5zdHJlYW1hYmxlPC9OSUNLPgorPEJMVVJCPklmIHNldCB0byB0cnVlLCB0aGUgb3V0cHV0IHNob3VsZCBiZSBhcyBpZiBpdCBpcyB0byBiZSBzdHJlYW1lZCBhbmQgaGVuY2Ugbm8gaW5kZXhlcyB3cml0dGVuIG9yIGR1cmF0aW9uIHdyaXR0ZW4uPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RGbHZNdXg6Om1ldGFkYXRhY3JlYXRvcjwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPm1ldGFkYXRhY3JlYXRvcjwvTklDSz4KKzxCTFVSQj5UaGUgdmFsdWUgb2YgbWV0YWRhdGFjcmVhdG9yIGluIHRoZSBtZXRhIHBhY2tldC48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0Q2Fwc1NldHRlcjo6Y2FwczwvTkFNRT4KKzxUWVBFPkdzdENhcHMqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWVyZ2UgY2FwczwvTklDSz4KKzxCTFVSQj5NZXJnZSB0aGVzZSBjYXBzICh0aGVyZWJ5IG92ZXJ3cml0aW5nKSBpbiB0aGUgc3RyZWFtLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdENhcHNTZXR0ZXI6OmpvaW48L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkpvaW48L05JQ0s+Cis8QkxVUkI+TWF0Y2ggaW5jb21pbmcgY2FwcycgbWltZS10eXBlIHRvIG1pbWUtdHlwZSBvZiBwcm92aWRlZCBjYXBzLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RDYXBzU2V0dGVyOjpyZXBsYWNlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SZXBsYWNlPC9OSUNLPgorPEJMVVJCPkRyb3AgZmllbGRzIG9mIGluY29taW5nIGNhcHMuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RPc3M0U291cmNlOjpkZXZpY2U8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EZXZpY2U8L05JQ0s+Cis8QkxVUkI+T1NTNCBkZXZpY2UgKGUuZy4gL2Rldi9vc3MvaGRhdWRpbzAvcGNtMCBvciAvZGV2L2RzcE4pIChOVUxMID0gdXNlIGZpcnN0IGF2YWlsYWJsZSBkZXZpY2UpLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RPc3M0U291cmNlOjpkZXZpY2UtbmFtZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+RGV2aWNlIG5hbWU8L05JQ0s+Cis8QkxVUkI+SHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgc291bmQgZGV2aWNlLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RPc3M0U2luazo6ZGV2aWNlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RGV2aWNlPC9OSUNLPgorPEJMVVJCPk9TUzQgZGV2aWNlIChlLmcuIC9kZXYvb3NzL2hkYXVkaW8wL3BjbTAgb3IgL2Rldi9kc3BOKSAoTlVMTCA9IHVzZSBmaXJzdCBhdmFpbGFibGUgcGxheWJhY2sgZGV2aWNlKS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0T3NzNFNpbms6OmRldmljZS1uYW1lPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5EZXZpY2UgbmFtZTwvTklDSz4KKzxCTFVSQj5IdW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBzb3VuZCBkZXZpY2UuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE9zczRTaW5rOjptdXRlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NdXRlPC9OSUNLPgorPEJMVVJCPk11dGUgc3RhdGUgb2YgdGhpcyBzdHJlYW0uPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RPc3M0U2luazo6dm9sdW1lPC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bMCwxMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlZvbHVtZTwvTklDSz4KKzxCTFVSQj5MaW5lYXIgdm9sdW1lIG9mIHRoaXMgc3RyZWFtLCAxLjA9MTAwJS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwVGhlb3JhUGF5Ojpjb25maWctaW50ZXJ2YWw8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSAzNjAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Db25maWcgU2VuZCBJbnRlcnZhbDwvTklDSz4KKzxCTFVSQj5TZW5kIENvbmZpZyBJbnNlcnRpb24gSW50ZXJ2YWwgaW4gc2Vjb25kcyAoY29uZmlndXJhdGlvbiBoZWFkZXJzIHdpbGwgYmUgbXVsdGlwbGV4ZWQgaW4gdGhlIGRhdGEgc3RyZWFtIHdoZW4gZGV0ZWN0ZWQuKSAoMCA9IGRpc2FibGVkKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VmlkZW9NaXhlcjI6OmJhY2tncm91bmQ8L05BTUU+Cis8VFlQRT5Hc3RWaWRlb01peGVyMkJhY2tncm91bmQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CYWNrZ3JvdW5kPC9OSUNLPgorPEJMVVJCPkJhY2tncm91bmQgdHlwZS48L0JMVVJCPgorPERFRkFVTFQ+Q2hlY2tlciBwYXR0ZXJuPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RKYWNrQXVkaW9TcmM6OmNsaWVudDwvTkFNRT4KKzxUWVBFPkphY2tDbGllbnQqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SmFja0NsaWVudDwvTklDSz4KKzxCTFVSQj5IYW5kbGUgZm9yIGphY2sgY2xpZW50LjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEphY2tBdWRpb1NyYzo6Y29ubmVjdDwvTkFNRT4KKzxUWVBFPkdzdEphY2tDb25uZWN0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29ubmVjdDwvTklDSz4KKzxCTFVSQj5TcGVjaWZ5IGhvdyB0aGUgaW5wdXQgcG9ydHMgd2lsbCBiZSBjb25uZWN0ZWQuPC9CTFVSQj4KKzxERUZBVUxUPkF1dG9tYXRpY2FsbHkgY29ubmVjdCBwb3J0cyB0byBwaHlzaWNhbCBwb3J0czwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SmFja0F1ZGlvU3JjOjpzZXJ2ZXI8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TZXJ2ZXI8L05JQ0s+Cis8QkxVUkI+VGhlIEphY2sgc2VydmVyIHRvIGNvbm5lY3QgdG8gKE5VTEwgPSBkZWZhdWx0KS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SmFja0F1ZGlvU3JjOjpjbGllbnQtbmFtZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNsaWVudCBuYW1lPC9OSUNLPgorPEJMVVJCPlRoZSBjbGllbnQgbmFtZSBvZiB0aGUgSmFjayBpbnN0YW5jZSAoTlVMTCA9IGRlZmF1bHQpLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RKYWNrQXVkaW9TcmM6OnRyYW5zcG9ydDwvTkFNRT4KKzxUWVBFPkdzdEphY2tUcmFuc3BvcnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UcmFuc3BvcnQgbW9kZTwvTklDSz4KKzxCTFVSQj5KYWNrIHRyYW5zcG9ydCBiZWhhdmlvdXIgb2YgdGhlIGNsaWVudC48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RKYWNrQXVkaW9TcmM6OnBvcnQtcGF0dGVybjwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPnBvcnQgcGF0dGVybjwvTklDSz4KKzxCTFVSQj5BIHBhdHRlcm4gdG8gc2VsZWN0IHdoaWNoIHBvcnRzIHRvIGNvbm5lY3QgdG8gKE5VTEwgPSBmaXJzdCBwaHlzaWNhbCBwb3J0cykuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEphY2tBdWRpb1Npbms6OmNsaWVudDwvTkFNRT4KKzxUWVBFPkphY2tDbGllbnQqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SmFja0NsaWVudDwvTklDSz4KKzxCTFVSQj5IYW5kbGUgZm9yIGphY2sgY2xpZW50LjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEphY2tBdWRpb1Npbms6OmNvbm5lY3Q8L05BTUU+Cis8VFlQRT5Hc3RKYWNrQ29ubmVjdDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNvbm5lY3Q8L05JQ0s+Cis8QkxVUkI+U3BlY2lmeSBob3cgdGhlIG91dHB1dCBwb3J0cyB3aWxsIGJlIGNvbm5lY3RlZC48L0JMVVJCPgorPERFRkFVTFQ+QXV0b21hdGljYWxseSBjb25uZWN0IHBvcnRzIHRvIHBoeXNpY2FsIHBvcnRzPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RKYWNrQXVkaW9TaW5rOjpzZXJ2ZXI8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TZXJ2ZXI8L05JQ0s+Cis8QkxVUkI+VGhlIEphY2sgc2VydmVyIHRvIGNvbm5lY3QgdG8gKE5VTEwgPSBkZWZhdWx0KS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SmFja0F1ZGlvU2luazo6Y2xpZW50LW5hbWU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5DbGllbnQgbmFtZTwvTklDSz4KKzxCTFVSQj5UaGUgY2xpZW50IG5hbWUgb2YgdGhlIEphY2sgaW5zdGFuY2UgKE5VTEwgPSBkZWZhdWx0KS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SmFja0F1ZGlvU2luazo6dHJhbnNwb3J0PC9OQU1FPgorPFRZUEU+R3N0SmFja1RyYW5zcG9ydDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRyYW5zcG9ydCBtb2RlPC9OSUNLPgorPEJMVVJCPkphY2sgdHJhbnNwb3J0IGJlaGF2aW91ciBvZiB0aGUgY2xpZW50LjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEphY2tBdWRpb1Npbms6OnBvcnQtcGF0dGVybjwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPnBvcnQgcGF0dGVybjwvTklDSz4KKzxCTFVSQj5BIHBhdHRlcm4gdG8gc2VsZWN0IHdoaWNoIHBvcnRzIHRvIGNvbm5lY3QgdG8gKE5VTEwgPSBmaXJzdCBwaHlzaWNhbCBwb3J0cykuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEZsYWNQYXJzZTo6Y2hlY2stZnJhbWUtY2hlY2tzdW1zPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5DaGVjayBGcmFtZSBDaGVja3N1bXM8L05JQ0s+Cis8QkxVUkI+Q2hlY2sgdGhlIG92ZXJhbGwgY2hlY2tzdW1zIG9mIGV2ZXJ5IGZyYW1lLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlJhZGlvOjpkZXZpY2U8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SYWRpbyBkZXZpY2UgbG9jYXRpb248L05JQ0s+Cis8QkxVUkI+VmlkZW80TGludXgyIHJhZGlvIGRldmljZSBsb2NhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+Ii9kZXYvcmFkaW8wIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VjRsMlJhZGlvOjpmcmVxdWVuY3k8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPls4NzUwMDAwMCwxMDgwMDAwMDBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TdGF0aW9uIGZyZXF1ZW5jeTwvTklDSz4KKzxCTFVSQj5TdGF0aW9uIGZyZXF1ZW5jeSBpbiBIei48L0JMVVJCPgorPERFRkFVTFQ+MTAwMDAwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RRVE11eDo6ZHRzLW1ldGhvZDwvTkFNRT4KKzxUWVBFPkdzdFFUTXV4RHRzTWV0aG9kczwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kdHMtbWV0aG9kPC9OSUNLPgorPEJMVVJCPk1ldGhvZCB0byBkZXRlcm1pbmUgRFRTIHRpbWUgKERFUFJFQ0FURUQpLjwvQkxVUkI+Cis8REVGQVVMVD5yZW9yZGVyPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RRVE11eDo6ZmFzdHN0YXJ0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Gb3JtYXQgZmlsZSB0byBmYXN0c3RhcnQ8L05JQ0s+Cis8QkxVUkI+SWYgdGhlIGZpbGUgc2hvdWxkIGJlIGZvcm1hdHRlZCBmb3IgZmFzdHN0YXJ0IChoZWFkZXJzIGZpcnN0KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFFUTXV4OjpmYXN0c3RhcnQtZmlsZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GaWxlIHRvIHVzZSBmb3Igc3RvcmluZyBidWZmZXJzPC9OSUNLPgorPEJMVVJCPkZpbGUgdGhhdCB3aWxsIGJlIHVzZWQgdGVtcG9yYXJpbHkgdG8gc3RvcmUgZGF0YSBmcm9tIHRoZSBzdHJlYW0gd2hlbiBjcmVhdGluZyBhIGZhc3RzdGFydCBmaWxlLiBJZiBudWxsIGEgZmlsZXBhdGggd2lsbCBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFFUTXV4OjpmcmFnbWVudC1kdXJhdGlvbjwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyYWdtZW50IGR1cmF0aW9uPC9OSUNLPgorPEJMVVJCPkZyYWdtZW50IGR1cmF0aW9ucyBpbiBtcyAocHJvZHVjZSBhIGZyYWdtZW50ZWQgZmlsZSBpZiA+IDApLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RRVE11eDo6bW9vdi1yZWNvdmVyeS1maWxlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbGUgdG8gc3RvcmUgZGF0YSBmb3IgcG9zdGVyaW9yIG1vb3YgYXRvbSByZWNvdmVyeTwvTklDSz4KKzxCTFVSQj5GaWxlIHRvIGJlIHVzZWQgdG8gc3RvcmUgZGF0YSBmb3IgbW9vdiBhdG9tIG1ha2luZyBtb3ZpZSBmaWxlIHJlY292ZXJ5IHBvc3NpYmxlIGluIGNhc2Ugb2YgYSBjcmFzaCBkdXJpbmcgbXV4aW5nLiBOdWxsIGZvciBkaXNhYmxlZC4gKEV4cGVyaW1lbnRhbCkuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFFUTXV4Ojptb3ZpZS10aW1lc2NhbGU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Nb3ZpZSB0aW1lc2NhbGU8L05JQ0s+Cis8QkxVUkI+VGltZXNjYWxlIHRvIHVzZSBpbiB0aGUgbW92aWUgKHVuaXRzIHBlciBzZWNvbmQsIDAgPT0gZGVmYXVsdCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFFUTXV4OjpwcmVzZW50YXRpb24tdGltZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkluY2x1ZGUgcHJlc2VudGF0aW9uLXRpbWUgaW5mbzwvTklDSz4KKzxCTFVSQj5DYWxjdWxhdGUgYW5kIGluY2x1ZGUgcHJlc2VudGF0aW9uL2NvbXBvc2l0aW9uIHRpbWUgKGluIGFkZGl0aW9uIHRvIGRlY29kaW5nIHRpbWUpLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RRVE11eDo6c3RyZWFtYWJsZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0cmVhbWFibGU8L05JQ0s+Cis8QkxVUkI+SWYgc2V0IHRvIHRydWUsIHRoZSBvdXRwdXQgc2hvdWxkIGJlIGFzIGlmIGl0IGlzIHRvIGJlIHN0cmVhbWVkIGFuZCBoZW5jZSBubyBpbmRleGVzIHdyaXR0ZW4gb3IgZHVyYXRpb24gd3JpdHRlbi4gKERFUFJFQ0FURUQsIG9ubHkgdmFsaWQgZm9yIGZyYWdtZW50ZWQgTVA0KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFFUTXV4Ojp0cmFrLXRpbWVzY2FsZTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRyYWNrIHRpbWVzY2FsZTwvTklDSz4KKzxCTFVSQj5UaW1lc2NhbGUgdG8gdXNlIGZvciB0aGUgdHJhY2tzICh1bml0cyBwZXIgc2Vjb25kLCAwIGlzIGF1dG9tYXRpYykuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFFUTXV4OjpyZXNlcnZlZC1ieXRlcy1wZXItc2VjPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMTAwMDA8L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNlcnZlZCBNT09WIGJ5dGVzIHBlciBzZWNvbmQsIHBlciB0cmFjazwvTklDSz4KKzxCTFVSQj5NdWx0aXBsaWVyIGZvciBjb252ZXJ0aW5nIHJlc2VydmVkLW1heC1kdXJhdGlvbiBpbnRvIGJ5dGVzIG9mIGhlYWRlciB0byByZXNlcnZlLCBwZXIgc2Vjb25kLCBwZXIgdHJhY2suPC9CTFVSQj4KKzxERUZBVUxUPjU1MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UVRNdXg6OnJlc2VydmVkLWR1cmF0aW9uLXJlbWFpbmluZzwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPlJlcG9ydCB0aGUgYXBwcm94aW1hdGUgYW1vdW50IG9mIHJlbWFpbmluZyByZWNvcmRpbmcgc3BhY2UgKG5zKTwvTklDSz4KKzxCTFVSQj5SZXBvcnRzIHRoZSBhcHByb3hpbWF0ZSBhbW91bnQgb2YgcmVtYWluaW5nIG1vb3YgaGVhZGVyIHNwYWNlIHJlc2VydmVkIHVzaW5nIHJlc2VydmVkLW1heC1kdXJhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UVRNdXg6OnJlc2VydmVkLW1heC1kdXJhdGlvbjwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SZXNlcnZlZCBtYXhpbXVtIGZpbGUgZHVyYXRpb24gKG5zKTwvTklDSz4KKzxCTFVSQj5XaGVuIHNldCB0byBhIHZhbHVlID4gMCwgcmVzZXJ2ZXMgc3BhY2UgZm9yIGluZGV4IHRhYmxlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLjwvQkxVUkI+Cis8REVGQVVMVD4xODQ0Njc0NDA3MzcwOTU1MTYxNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UVRNdXg6OnJlc2VydmVkLW1vb3YtdXBkYXRlLXBlcmlvZDwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5JbnRlcnZhbCBhdCB3aGljaCB0byB1cGRhdGUgaW5kZXggdGFibGVzIChucyk8L05JQ0s+Cis8QkxVUkI+V2hlbiB1c2VkIHdpdGggcmVzZXJ2ZWQtbWF4LWR1cmF0aW9uLCBwZXJpb2RpY2FsbHkgdXBkYXRlcyB0aGUgaW5kZXggdGFibGVzIHdpdGggaW5mb3JtYXRpb24gbXV4ZWQgc28gZmFyLjwvQkxVUkI+Cis8REVGQVVMVD4xODQ0Njc0NDA3MzcwOTU1MTYxNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UVRNdXg6OmludGVybGVhdmUtYnl0ZXM8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SW50ZXJsZWF2ZSAoYnl0ZXMpPC9OSUNLPgorPEJMVVJCPkludGVybGVhdmUgYmV0d2VlbiBzdHJlYW1zIGluIGJ5dGVzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RRVE11eDo6aW50ZXJsZWF2ZS10aW1lPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVybGVhdmUgKHRpbWUpPC9OSUNLPgorPEJMVVJCPkludGVybGVhdmUgYmV0d2VlbiBzdHJlYW1zIGluIG5hbm9zZWNvbmRzLjwvQkxVUkI+Cis8REVGQVVMVD4yNTAwMDAwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFFUTXV4OjptYXgtcmF3LWF1ZGlvLWRyaWZ0PC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBSYXcgQXVkaW8gRHJpZnQ8L05JQ0s+Cis8QkxVUkI+TWF4aW11bSBhbGxvd2VkIGRyaWZ0IG9mIHJhdyBhdWRpbyBzYW1wbGVzIHZzLiB0aW1lc3RhbXBzIGluIG5hbm9zZWNvbmRzLjwvQkxVUkI+Cis8REVGQVVMVD40MDAwMDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UVRNdXg6OnJlc2VydmVkLXByZWZpbGw8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNlcnZlZCBQcmVmaWxsIFNhbXBsZXMgVGFibGU8L05JQ0s+Cis8QkxVUkI+UHJlZmlsbCBzYW1wbGVzIHRhYmxlIG9mIHJlc2VydmVkIGR1cmF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UVRNb292UmVjb3Zlcjo6YnJva2VuLWlucHV0PC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UGF0aCB0byBicm9rZW4gaW5wdXQgZmlsZTwvTklDSz4KKzxCTFVSQj5QYXRoIHRvIGJyb2tlbiBpbnB1dCBmaWxlLiAoSWYgcXRtdXggd2FzIG9uIGZhc3RzdGFydCBtb2RlLCB0aGlzIGZpbGUgaXMgdGhlIGZhc3RzdGFydCBmaWxlKS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UVRNb292UmVjb3Zlcjo6ZmFzdHN0YXJ0LW1vZGU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPklmIHRoZSBicm9rZW4gaW5wdXQgaXMgZnJvbSBmYXN0c3RhcnQgbW9kZTwvTklDSz4KKzxCTFVSQj5JZiB0aGUgYnJva2VuIGlucHV0IGlzIGZyb20gZmFzdHN0YXJ0IG1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RRVE1vb3ZSZWNvdmVyOjpmaXhlZC1vdXRwdXQ8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5QYXRoIHRvIHdyaXRlIHRoZSBmaXhlZCBmaWxlPC9OSUNLPgorPEJMVVJCPlBhdGggdG8gd3JpdGUgdGhlIGZpeGVkIGZpbGUgdG8gKHVzZWQgYXMgb3V0cHV0KS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UVRNb292UmVjb3Zlcjo6cmVjb3ZlcnktaW5wdXQ8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5QYXRoIHRvIHJlY292ZXJ5IGZpbGU8L05JQ0s+Cis8QkxVUkI+UGF0aCB0byByZWNvdmVyeSBmaWxlICh1c2VkIGFzIGlucHV0KS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TVA0TXV4OjpkdHMtbWV0aG9kPC9OQU1FPgorPFRZUEU+R3N0UVRNdXhEdHNNZXRob2RzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmR0cy1tZXRob2Q8L05JQ0s+Cis8QkxVUkI+TWV0aG9kIHRvIGRldGVybWluZSBEVFMgdGltZSAoREVQUkVDQVRFRCkuPC9CTFVSQj4KKzxERUZBVUxUPnJlb3JkZXI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1QNE11eDo6ZmFzdHN0YXJ0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Gb3JtYXQgZmlsZSB0byBmYXN0c3RhcnQ8L05JQ0s+Cis8QkxVUkI+SWYgdGhlIGZpbGUgc2hvdWxkIGJlIGZvcm1hdHRlZCBmb3IgZmFzdHN0YXJ0IChoZWFkZXJzIGZpcnN0KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1QNE11eDo6ZmFzdHN0YXJ0LWZpbGU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsZSB0byB1c2UgZm9yIHN0b3JpbmcgYnVmZmVyczwvTklDSz4KKzxCTFVSQj5GaWxlIHRoYXQgd2lsbCBiZSB1c2VkIHRlbXBvcmFyaWx5IHRvIHN0b3JlIGRhdGEgZnJvbSB0aGUgc3RyZWFtIHdoZW4gY3JlYXRpbmcgYSBmYXN0c3RhcnQgZmlsZS4gSWYgbnVsbCBhIGZpbGVwYXRoIHdpbGwgYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNUDRNdXg6OmZyYWdtZW50LWR1cmF0aW9uPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJhZ21lbnQgZHVyYXRpb248L05JQ0s+Cis8QkxVUkI+RnJhZ21lbnQgZHVyYXRpb25zIGluIG1zIChwcm9kdWNlIGEgZnJhZ21lbnRlZCBmaWxlIGlmID4gMCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1QNE11eDo6bW9vdi1yZWNvdmVyeS1maWxlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbGUgdG8gc3RvcmUgZGF0YSBmb3IgcG9zdGVyaW9yIG1vb3YgYXRvbSByZWNvdmVyeTwvTklDSz4KKzxCTFVSQj5GaWxlIHRvIGJlIHVzZWQgdG8gc3RvcmUgZGF0YSBmb3IgbW9vdiBhdG9tIG1ha2luZyBtb3ZpZSBmaWxlIHJlY292ZXJ5IHBvc3NpYmxlIGluIGNhc2Ugb2YgYSBjcmFzaCBkdXJpbmcgbXV4aW5nLiBOdWxsIGZvciBkaXNhYmxlZC4gKEV4cGVyaW1lbnRhbCkuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1QNE11eDo6bW92aWUtdGltZXNjYWxlPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW92aWUgdGltZXNjYWxlPC9OSUNLPgorPEJMVVJCPlRpbWVzY2FsZSB0byB1c2UgaW4gdGhlIG1vdmllICh1bml0cyBwZXIgc2Vjb25kLCAwID09IGRlZmF1bHQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNUDRNdXg6OnByZXNlbnRhdGlvbi10aW1lPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5jbHVkZSBwcmVzZW50YXRpb24tdGltZSBpbmZvPC9OSUNLPgorPEJMVVJCPkNhbGN1bGF0ZSBhbmQgaW5jbHVkZSBwcmVzZW50YXRpb24vY29tcG9zaXRpb24gdGltZSAoaW4gYWRkaXRpb24gdG8gZGVjb2RpbmcgdGltZSkuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1QNE11eDo6c3RyZWFtYWJsZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0cmVhbWFibGU8L05JQ0s+Cis8QkxVUkI+SWYgc2V0IHRvIHRydWUsIHRoZSBvdXRwdXQgc2hvdWxkIGJlIGFzIGlmIGl0IGlzIHRvIGJlIHN0cmVhbWVkIGFuZCBoZW5jZSBubyBpbmRleGVzIHdyaXR0ZW4gb3IgZHVyYXRpb24gd3JpdHRlbi4gKERFUFJFQ0FURUQsIG9ubHkgdmFsaWQgZm9yIGZyYWdtZW50ZWQgTVA0KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1QNE11eDo6dHJhay10aW1lc2NhbGU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UcmFjayB0aW1lc2NhbGU8L05JQ0s+Cis8QkxVUkI+VGltZXNjYWxlIHRvIHVzZSBmb3IgdGhlIHRyYWNrcyAodW5pdHMgcGVyIHNlY29uZCwgMCBpcyBhdXRvbWF0aWMpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNUDRNdXg6OnJlc2VydmVkLWJ5dGVzLXBlci1zZWM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSAxMDAwMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc2VydmVkIE1PT1YgYnl0ZXMgcGVyIHNlY29uZCwgcGVyIHRyYWNrPC9OSUNLPgorPEJMVVJCPk11bHRpcGxpZXIgZm9yIGNvbnZlcnRpbmcgcmVzZXJ2ZWQtbWF4LWR1cmF0aW9uIGludG8gYnl0ZXMgb2YgaGVhZGVyIHRvIHJlc2VydmUsIHBlciBzZWNvbmQsIHBlciB0cmFjay48L0JMVVJCPgorPERFRkFVTFQ+NTUwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNUDRNdXg6OnJlc2VydmVkLWR1cmF0aW9uLXJlbWFpbmluZzwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPlJlcG9ydCB0aGUgYXBwcm94aW1hdGUgYW1vdW50IG9mIHJlbWFpbmluZyByZWNvcmRpbmcgc3BhY2UgKG5zKTwvTklDSz4KKzxCTFVSQj5SZXBvcnRzIHRoZSBhcHByb3hpbWF0ZSBhbW91bnQgb2YgcmVtYWluaW5nIG1vb3YgaGVhZGVyIHNwYWNlIHJlc2VydmVkIHVzaW5nIHJlc2VydmVkLW1heC1kdXJhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TVA0TXV4OjpyZXNlcnZlZC1tYXgtZHVyYXRpb248L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UmVzZXJ2ZWQgbWF4aW11bSBmaWxlIGR1cmF0aW9uIChucyk8L05JQ0s+Cis8QkxVUkI+V2hlbiBzZXQgdG8gYSB2YWx1ZSA+IDAsIHJlc2VydmVzIHNwYWNlIGZvciBpbmRleCB0YWJsZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS48L0JMVVJCPgorPERFRkFVTFQ+MTg0NDY3NDQwNzM3MDk1NTE2MTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1QNE11eDo6cmVzZXJ2ZWQtbW9vdi11cGRhdGUtcGVyaW9kPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVydmFsIGF0IHdoaWNoIHRvIHVwZGF0ZSBpbmRleCB0YWJsZXMgKG5zKTwvTklDSz4KKzxCTFVSQj5XaGVuIHVzZWQgd2l0aCByZXNlcnZlZC1tYXgtZHVyYXRpb24sIHBlcmlvZGljYWxseSB1cGRhdGVzIHRoZSBpbmRleCB0YWJsZXMgd2l0aCBpbmZvcm1hdGlvbiBtdXhlZCBzbyBmYXIuPC9CTFVSQj4KKzxERUZBVUxUPjE4NDQ2NzQ0MDczNzA5NTUxNjE1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNUDRNdXg6OmludGVybGVhdmUtYnl0ZXM8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SW50ZXJsZWF2ZSAoYnl0ZXMpPC9OSUNLPgorPEJMVVJCPkludGVybGVhdmUgYmV0d2VlbiBzdHJlYW1zIGluIGJ5dGVzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNUDRNdXg6OmludGVybGVhdmUtdGltZTwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5JbnRlcmxlYXZlICh0aW1lKTwvTklDSz4KKzxCTFVSQj5JbnRlcmxlYXZlIGJldHdlZW4gc3RyZWFtcyBpbiBuYW5vc2Vjb25kcy48L0JMVVJCPgorPERFRkFVTFQ+MjUwMDAwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNUDRNdXg6Om1heC1yYXctYXVkaW8tZHJpZnQ8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IFJhdyBBdWRpbyBEcmlmdDwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIGFsbG93ZWQgZHJpZnQgb2YgcmF3IGF1ZGlvIHNhbXBsZXMgdnMuIHRpbWVzdGFtcHMgaW4gbmFub3NlY29uZHMuPC9CTFVSQj4KKzxERUZBVUxUPjQwMDAwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNUDRNdXg6OnJlc2VydmVkLXByZWZpbGw8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNlcnZlZCBQcmVmaWxsIFNhbXBsZXMgVGFibGU8L05JQ0s+Cis8QkxVUkI+UHJlZmlsbCBzYW1wbGVzIHRhYmxlIG9mIHJlc2VydmVkIGR1cmF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TUoyTXV4OjpkdHMtbWV0aG9kPC9OQU1FPgorPFRZUEU+R3N0UVRNdXhEdHNNZXRob2RzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPmR0cy1tZXRob2Q8L05JQ0s+Cis8QkxVUkI+TWV0aG9kIHRvIGRldGVybWluZSBEVFMgdGltZSAoREVQUkVDQVRFRCkuPC9CTFVSQj4KKzxERUZBVUxUPnJlb3JkZXI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1KMk11eDo6ZmFzdHN0YXJ0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Gb3JtYXQgZmlsZSB0byBmYXN0c3RhcnQ8L05JQ0s+Cis8QkxVUkI+SWYgdGhlIGZpbGUgc2hvdWxkIGJlIGZvcm1hdHRlZCBmb3IgZmFzdHN0YXJ0IChoZWFkZXJzIGZpcnN0KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1KMk11eDo6ZmFzdHN0YXJ0LWZpbGU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsZSB0byB1c2UgZm9yIHN0b3JpbmcgYnVmZmVyczwvTklDSz4KKzxCTFVSQj5GaWxlIHRoYXQgd2lsbCBiZSB1c2VkIHRlbXBvcmFyaWx5IHRvIHN0b3JlIGRhdGEgZnJvbSB0aGUgc3RyZWFtIHdoZW4gY3JlYXRpbmcgYSBmYXN0c3RhcnQgZmlsZS4gSWYgbnVsbCBhIGZpbGVwYXRoIHdpbGwgYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNSjJNdXg6OmZyYWdtZW50LWR1cmF0aW9uPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RnJhZ21lbnQgZHVyYXRpb248L05JQ0s+Cis8QkxVUkI+RnJhZ21lbnQgZHVyYXRpb25zIGluIG1zIChwcm9kdWNlIGEgZnJhZ21lbnRlZCBmaWxlIGlmID4gMCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1KMk11eDo6bW9vdi1yZWNvdmVyeS1maWxlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbGUgdG8gc3RvcmUgZGF0YSBmb3IgcG9zdGVyaW9yIG1vb3YgYXRvbSByZWNvdmVyeTwvTklDSz4KKzxCTFVSQj5GaWxlIHRvIGJlIHVzZWQgdG8gc3RvcmUgZGF0YSBmb3IgbW9vdiBhdG9tIG1ha2luZyBtb3ZpZSBmaWxlIHJlY292ZXJ5IHBvc3NpYmxlIGluIGNhc2Ugb2YgYSBjcmFzaCBkdXJpbmcgbXV4aW5nLiBOdWxsIGZvciBkaXNhYmxlZC4gKEV4cGVyaW1lbnRhbCkuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1KMk11eDo6bW92aWUtdGltZXNjYWxlPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW92aWUgdGltZXNjYWxlPC9OSUNLPgorPEJMVVJCPlRpbWVzY2FsZSB0byB1c2UgaW4gdGhlIG1vdmllICh1bml0cyBwZXIgc2Vjb25kLCAwID09IGRlZmF1bHQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNSjJNdXg6OnByZXNlbnRhdGlvbi10aW1lPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+SW5jbHVkZSBwcmVzZW50YXRpb24tdGltZSBpbmZvPC9OSUNLPgorPEJMVVJCPkNhbGN1bGF0ZSBhbmQgaW5jbHVkZSBwcmVzZW50YXRpb24vY29tcG9zaXRpb24gdGltZSAoaW4gYWRkaXRpb24gdG8gZGVjb2RpbmcgdGltZSkuPC9CTFVSQj4KKzxERUZBVUxUPlRSVUU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1KMk11eDo6c3RyZWFtYWJsZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0cmVhbWFibGU8L05JQ0s+Cis8QkxVUkI+SWYgc2V0IHRvIHRydWUsIHRoZSBvdXRwdXQgc2hvdWxkIGJlIGFzIGlmIGl0IGlzIHRvIGJlIHN0cmVhbWVkIGFuZCBoZW5jZSBubyBpbmRleGVzIHdyaXR0ZW4gb3IgZHVyYXRpb24gd3JpdHRlbi4gKERFUFJFQ0FURUQsIG9ubHkgdmFsaWQgZm9yIGZyYWdtZW50ZWQgTVA0KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1KMk11eDo6dHJhay10aW1lc2NhbGU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5UcmFjayB0aW1lc2NhbGU8L05JQ0s+Cis8QkxVUkI+VGltZXNjYWxlIHRvIHVzZSBmb3IgdGhlIHRyYWNrcyAodW5pdHMgcGVyIHNlY29uZCwgMCBpcyBhdXRvbWF0aWMpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNSjJNdXg6OnJlc2VydmVkLWJ5dGVzLXBlci1zZWM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSAxMDAwMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc2VydmVkIE1PT1YgYnl0ZXMgcGVyIHNlY29uZCwgcGVyIHRyYWNrPC9OSUNLPgorPEJMVVJCPk11bHRpcGxpZXIgZm9yIGNvbnZlcnRpbmcgcmVzZXJ2ZWQtbWF4LWR1cmF0aW9uIGludG8gYnl0ZXMgb2YgaGVhZGVyIHRvIHJlc2VydmUsIHBlciBzZWNvbmQsIHBlciB0cmFjay48L0JMVVJCPgorPERFRkFVTFQ+NTUwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNSjJNdXg6OnJlc2VydmVkLWR1cmF0aW9uLXJlbWFpbmluZzwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPlJlcG9ydCB0aGUgYXBwcm94aW1hdGUgYW1vdW50IG9mIHJlbWFpbmluZyByZWNvcmRpbmcgc3BhY2UgKG5zKTwvTklDSz4KKzxCTFVSQj5SZXBvcnRzIHRoZSBhcHByb3hpbWF0ZSBhbW91bnQgb2YgcmVtYWluaW5nIG1vb3YgaGVhZGVyIHNwYWNlIHJlc2VydmVkIHVzaW5nIHJlc2VydmVkLW1heC1kdXJhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TUoyTXV4OjpyZXNlcnZlZC1tYXgtZHVyYXRpb248L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UmVzZXJ2ZWQgbWF4aW11bSBmaWxlIGR1cmF0aW9uIChucyk8L05JQ0s+Cis8QkxVUkI+V2hlbiBzZXQgdG8gYSB2YWx1ZSA+IDAsIHJlc2VydmVzIHNwYWNlIGZvciBpbmRleCB0YWJsZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS48L0JMVVJCPgorPERFRkFVTFQ+MTg0NDY3NDQwNzM3MDk1NTE2MTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdE1KMk11eDo6cmVzZXJ2ZWQtbW9vdi11cGRhdGUtcGVyaW9kPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVydmFsIGF0IHdoaWNoIHRvIHVwZGF0ZSBpbmRleCB0YWJsZXMgKG5zKTwvTklDSz4KKzxCTFVSQj5XaGVuIHVzZWQgd2l0aCByZXNlcnZlZC1tYXgtZHVyYXRpb24sIHBlcmlvZGljYWxseSB1cGRhdGVzIHRoZSBpbmRleCB0YWJsZXMgd2l0aCBpbmZvcm1hdGlvbiBtdXhlZCBzbyBmYXIuPC9CTFVSQj4KKzxERUZBVUxUPjE4NDQ2NzQ0MDczNzA5NTUxNjE1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNSjJNdXg6OmludGVybGVhdmUtYnl0ZXM8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SW50ZXJsZWF2ZSAoYnl0ZXMpPC9OSUNLPgorPEJMVVJCPkludGVybGVhdmUgYmV0d2VlbiBzdHJlYW1zIGluIGJ5dGVzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNSjJNdXg6OmludGVybGVhdmUtdGltZTwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5JbnRlcmxlYXZlICh0aW1lKTwvTklDSz4KKzxCTFVSQj5JbnRlcmxlYXZlIGJldHdlZW4gc3RyZWFtcyBpbiBuYW5vc2Vjb25kcy48L0JMVVJCPgorPERFRkFVTFQ+MjUwMDAwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNSjJNdXg6Om1heC1yYXctYXVkaW8tZHJpZnQ8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IFJhdyBBdWRpbyBEcmlmdDwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIGFsbG93ZWQgZHJpZnQgb2YgcmF3IGF1ZGlvIHNhbXBsZXMgdnMuIHRpbWVzdGFtcHMgaW4gbmFub3NlY29uZHMuPC9CTFVSQj4KKzxERUZBVUxUPjQwMDAwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RNSjJNdXg6OnJlc2VydmVkLXByZWZpbGw8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNlcnZlZCBQcmVmaWxsIFNhbXBsZXMgVGFibGU8L05JQ0s+Cis8QkxVUkI+UHJlZmlsbCBzYW1wbGVzIHRhYmxlIG9mIHJlc2VydmVkIGR1cmF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SVNNTE11eDo6ZHRzLW1ldGhvZDwvTkFNRT4KKzxUWVBFPkdzdFFUTXV4RHRzTWV0aG9kczwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5kdHMtbWV0aG9kPC9OSUNLPgorPEJMVVJCPk1ldGhvZCB0byBkZXRlcm1pbmUgRFRTIHRpbWUgKERFUFJFQ0FURUQpLjwvQkxVUkI+Cis8REVGQVVMVD5yZW9yZGVyPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJU01MTXV4OjpmYXN0c3RhcnQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZvcm1hdCBmaWxlIHRvIGZhc3RzdGFydDwvTklDSz4KKzxCTFVSQj5JZiB0aGUgZmlsZSBzaG91bGQgYmUgZm9ybWF0dGVkIGZvciBmYXN0c3RhcnQgKGhlYWRlcnMgZmlyc3QpLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SVNNTE11eDo6ZmFzdHN0YXJ0LWZpbGU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsZSB0byB1c2UgZm9yIHN0b3JpbmcgYnVmZmVyczwvTklDSz4KKzxCTFVSQj5GaWxlIHRoYXQgd2lsbCBiZSB1c2VkIHRlbXBvcmFyaWx5IHRvIHN0b3JlIGRhdGEgZnJvbSB0aGUgc3RyZWFtIHdoZW4gY3JlYXRpbmcgYSBmYXN0c3RhcnQgZmlsZS4gSWYgbnVsbCBhIGZpbGVwYXRoIHdpbGwgYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJU01MTXV4OjpmcmFnbWVudC1kdXJhdGlvbjwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZyYWdtZW50IGR1cmF0aW9uPC9OSUNLPgorPEJMVVJCPkZyYWdtZW50IGR1cmF0aW9ucyBpbiBtcyAocHJvZHVjZSBhIGZyYWdtZW50ZWQgZmlsZSBpZiA+IDApLjwvQkxVUkI+Cis8REVGQVVMVD4yMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJU01MTXV4Ojptb292LXJlY292ZXJ5LWZpbGU8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+RmlsZSB0byBzdG9yZSBkYXRhIGZvciBwb3N0ZXJpb3IgbW9vdiBhdG9tIHJlY292ZXJ5PC9OSUNLPgorPEJMVVJCPkZpbGUgdG8gYmUgdXNlZCB0byBzdG9yZSBkYXRhIGZvciBtb292IGF0b20gbWFraW5nIG1vdmllIGZpbGUgcmVjb3ZlcnkgcG9zc2libGUgaW4gY2FzZSBvZiBhIGNyYXNoIGR1cmluZyBtdXhpbmcuIE51bGwgZm9yIGRpc2FibGVkLiAoRXhwZXJpbWVudGFsKS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SVNNTE11eDo6bW92aWUtdGltZXNjYWxlPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+TW92aWUgdGltZXNjYWxlPC9OSUNLPgorPEJMVVJCPlRpbWVzY2FsZSB0byB1c2UgaW4gdGhlIG1vdmllICh1bml0cyBwZXIgc2Vjb25kLCAwID09IGRlZmF1bHQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJU01MTXV4OjpwcmVzZW50YXRpb24tdGltZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkluY2x1ZGUgcHJlc2VudGF0aW9uLXRpbWUgaW5mbzwvTklDSz4KKzxCTFVSQj5DYWxjdWxhdGUgYW5kIGluY2x1ZGUgcHJlc2VudGF0aW9uL2NvbXBvc2l0aW9uIHRpbWUgKGluIGFkZGl0aW9uIHRvIGRlY29kaW5nIHRpbWUpLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJU01MTXV4OjpzdHJlYW1hYmxlPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+U3RyZWFtYWJsZTwvTklDSz4KKzxCTFVSQj5JZiBzZXQgdG8gdHJ1ZSwgdGhlIG91dHB1dCBzaG91bGQgYmUgYXMgaWYgaXQgaXMgdG8gYmUgc3RyZWFtZWQgYW5kIGhlbmNlIG5vIGluZGV4ZXMgd3JpdHRlbiBvciBkdXJhdGlvbiB3cml0dGVuLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJU01MTXV4Ojp0cmFrLXRpbWVzY2FsZTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRyYWNrIHRpbWVzY2FsZTwvTklDSz4KKzxCTFVSQj5UaW1lc2NhbGUgdG8gdXNlIGZvciB0aGUgdHJhY2tzICh1bml0cyBwZXIgc2Vjb25kLCAwIGlzIGF1dG9tYXRpYykuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdElTTUxNdXg6OnJlc2VydmVkLWJ5dGVzLXBlci1zZWM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSAxMDAwMDwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlJlc2VydmVkIE1PT1YgYnl0ZXMgcGVyIHNlY29uZCwgcGVyIHRyYWNrPC9OSUNLPgorPEJMVVJCPk11bHRpcGxpZXIgZm9yIGNvbnZlcnRpbmcgcmVzZXJ2ZWQtbWF4LWR1cmF0aW9uIGludG8gYnl0ZXMgb2YgaGVhZGVyIHRvIHJlc2VydmUsIHBlciBzZWNvbmQsIHBlciB0cmFjay48L0JMVVJCPgorPERFRkFVTFQ+NTUwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJU01MTXV4OjpyZXNlcnZlZC1kdXJhdGlvbi1yZW1haW5pbmc8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5SZXBvcnQgdGhlIGFwcHJveGltYXRlIGFtb3VudCBvZiByZW1haW5pbmcgcmVjb3JkaW5nIHNwYWNlIChucyk8L05JQ0s+Cis8QkxVUkI+UmVwb3J0cyB0aGUgYXBwcm94aW1hdGUgYW1vdW50IG9mIHJlbWFpbmluZyBtb292IGhlYWRlciBzcGFjZSByZXNlcnZlZCB1c2luZyByZXNlcnZlZC1tYXgtZHVyYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdElTTUxNdXg6OnJlc2VydmVkLW1heC1kdXJhdGlvbjwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SZXNlcnZlZCBtYXhpbXVtIGZpbGUgZHVyYXRpb24gKG5zKTwvTklDSz4KKzxCTFVSQj5XaGVuIHNldCB0byBhIHZhbHVlID4gMCwgcmVzZXJ2ZXMgc3BhY2UgZm9yIGluZGV4IHRhYmxlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLjwvQkxVUkI+Cis8REVGQVVMVD4xODQ0Njc0NDA3MzcwOTU1MTYxNTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SVNNTE11eDo6cmVzZXJ2ZWQtbW9vdi11cGRhdGUtcGVyaW9kPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVydmFsIGF0IHdoaWNoIHRvIHVwZGF0ZSBpbmRleCB0YWJsZXMgKG5zKTwvTklDSz4KKzxCTFVSQj5XaGVuIHVzZWQgd2l0aCByZXNlcnZlZC1tYXgtZHVyYXRpb24sIHBlcmlvZGljYWxseSB1cGRhdGVzIHRoZSBpbmRleCB0YWJsZXMgd2l0aCBpbmZvcm1hdGlvbiBtdXhlZCBzbyBmYXIuPC9CTFVSQj4KKzxERUZBVUxUPjE4NDQ2NzQ0MDczNzA5NTUxNjE1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJU01MTXV4OjppbnRlcmxlYXZlLWJ5dGVzPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVybGVhdmUgKGJ5dGVzKTwvTklDSz4KKzxCTFVSQj5JbnRlcmxlYXZlIGJldHdlZW4gc3RyZWFtcyBpbiBieXRlcy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0SVNNTE11eDo6aW50ZXJsZWF2ZS10aW1lPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVybGVhdmUgKHRpbWUpPC9OSUNLPgorPEJMVVJCPkludGVybGVhdmUgYmV0d2VlbiBzdHJlYW1zIGluIG5hbm9zZWNvbmRzLjwvQkxVUkI+Cis8REVGQVVMVD4yNTAwMDAwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdElTTUxNdXg6Om1heC1yYXctYXVkaW8tZHJpZnQ8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IFJhdyBBdWRpbyBEcmlmdDwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIGFsbG93ZWQgZHJpZnQgb2YgcmF3IGF1ZGlvIHNhbXBsZXMgdnMuIHRpbWVzdGFtcHMgaW4gbmFub3NlY29uZHMuPC9CTFVSQj4KKzxERUZBVUxUPjQwMDAwMDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RJU01MTXV4OjpyZXNlcnZlZC1wcmVmaWxsPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzZXJ2ZWQgUHJlZmlsbCBTYW1wbGVzIFRhYmxlPC9OSUNLPgorPEJMVVJCPlByZWZpbGwgc2FtcGxlcyB0YWJsZSBvZiByZXNlcnZlZCBkdXJhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdDNHUFBNdXg6OmR0cy1tZXRob2Q8L05BTUU+Cis8VFlQRT5Hc3RRVE11eER0c01ldGhvZHM8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+ZHRzLW1ldGhvZDwvTklDSz4KKzxCTFVSQj5NZXRob2QgdG8gZGV0ZXJtaW5lIERUUyB0aW1lIChERVBSRUNBVEVEKS48L0JMVVJCPgorPERFRkFVTFQ+cmVvcmRlcjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0M0dQUE11eDo6ZmFzdHN0YXJ0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Gb3JtYXQgZmlsZSB0byBmYXN0c3RhcnQ8L05JQ0s+Cis8QkxVUkI+SWYgdGhlIGZpbGUgc2hvdWxkIGJlIGZvcm1hdHRlZCBmb3IgZmFzdHN0YXJ0IChoZWFkZXJzIGZpcnN0KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdDNHUFBNdXg6OmZhc3RzdGFydC1maWxlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbGUgdG8gdXNlIGZvciBzdG9yaW5nIGJ1ZmZlcnM8L05JQ0s+Cis8QkxVUkI+RmlsZSB0aGF0IHdpbGwgYmUgdXNlZCB0ZW1wb3JhcmlseSB0byBzdG9yZSBkYXRhIGZyb20gdGhlIHN0cmVhbSB3aGVuIGNyZWF0aW5nIGEgZmFzdHN0YXJ0IGZpbGUuIElmIG51bGwgYSBmaWxlcGF0aCB3aWxsIGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0M0dQUE11eDo6ZnJhZ21lbnQtZHVyYXRpb248L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5GcmFnbWVudCBkdXJhdGlvbjwvTklDSz4KKzxCTFVSQj5GcmFnbWVudCBkdXJhdGlvbnMgaW4gbXMgKHByb2R1Y2UgYSBmcmFnbWVudGVkIGZpbGUgaWYgPiAwKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0M0dQUE11eDo6bW9vdi1yZWNvdmVyeS1maWxlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkZpbGUgdG8gc3RvcmUgZGF0YSBmb3IgcG9zdGVyaW9yIG1vb3YgYXRvbSByZWNvdmVyeTwvTklDSz4KKzxCTFVSQj5GaWxlIHRvIGJlIHVzZWQgdG8gc3RvcmUgZGF0YSBmb3IgbW9vdiBhdG9tIG1ha2luZyBtb3ZpZSBmaWxlIHJlY292ZXJ5IHBvc3NpYmxlIGluIGNhc2Ugb2YgYSBjcmFzaCBkdXJpbmcgbXV4aW5nLiBOdWxsIGZvciBkaXNhYmxlZC4gKEV4cGVyaW1lbnRhbCkuPC9CTFVSQj4KKzxERUZBVUxUPk5VTEw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdDNHUFBNdXg6Om1vdmllLXRpbWVzY2FsZTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPk1vdmllIHRpbWVzY2FsZTwvTklDSz4KKzxCTFVSQj5UaW1lc2NhbGUgdG8gdXNlIGluIHRoZSBtb3ZpZSAodW5pdHMgcGVyIHNlY29uZCwgMCA9PSBkZWZhdWx0KS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0M0dQUE11eDo6cHJlc2VudGF0aW9uLXRpbWU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5JbmNsdWRlIHByZXNlbnRhdGlvbi10aW1lIGluZm88L05JQ0s+Cis8QkxVUkI+Q2FsY3VsYXRlIGFuZCBpbmNsdWRlIHByZXNlbnRhdGlvbi9jb21wb3NpdGlvbiB0aW1lIChpbiBhZGRpdGlvbiB0byBkZWNvZGluZyB0aW1lKS48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0M0dQUE11eDo6c3RyZWFtYWJsZTwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlN0cmVhbWFibGU8L05JQ0s+Cis8QkxVUkI+SWYgc2V0IHRvIHRydWUsIHRoZSBvdXRwdXQgc2hvdWxkIGJlIGFzIGlmIGl0IGlzIHRvIGJlIHN0cmVhbWVkIGFuZCBoZW5jZSBubyBpbmRleGVzIHdyaXR0ZW4gb3IgZHVyYXRpb24gd3JpdHRlbi4gKERFUFJFQ0FURUQsIG9ubHkgdmFsaWQgZm9yIGZyYWdtZW50ZWQgTVA0KS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdDNHUFBNdXg6OnRyYWstdGltZXNjYWxlPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+VHJhY2sgdGltZXNjYWxlPC9OSUNLPgorPEJMVVJCPlRpbWVzY2FsZSB0byB1c2UgZm9yIHRoZSB0cmFja3MgKHVuaXRzIHBlciBzZWNvbmQsIDAgaXMgYXV0b21hdGljKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0M0dQUE11eDo6cmVzZXJ2ZWQtYnl0ZXMtcGVyLXNlYzwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDEwMDAwPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UmVzZXJ2ZWQgTU9PViBieXRlcyBwZXIgc2Vjb25kLCBwZXIgdHJhY2s8L05JQ0s+Cis8QkxVUkI+TXVsdGlwbGllciBmb3IgY29udmVydGluZyByZXNlcnZlZC1tYXgtZHVyYXRpb24gaW50byBieXRlcyBvZiBoZWFkZXIgdG8gcmVzZXJ2ZSwgcGVyIHNlY29uZCwgcGVyIHRyYWNrLjwvQkxVUkI+Cis8REVGQVVMVD41NTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdDNHUFBNdXg6OnJlc2VydmVkLWR1cmF0aW9uLXJlbWFpbmluZzwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPlJlcG9ydCB0aGUgYXBwcm94aW1hdGUgYW1vdW50IG9mIHJlbWFpbmluZyByZWNvcmRpbmcgc3BhY2UgKG5zKTwvTklDSz4KKzxCTFVSQj5SZXBvcnRzIHRoZSBhcHByb3hpbWF0ZSBhbW91bnQgb2YgcmVtYWluaW5nIG1vb3YgaGVhZGVyIHNwYWNlIHJlc2VydmVkIHVzaW5nIHJlc2VydmVkLW1heC1kdXJhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0M0dQUE11eDo6cmVzZXJ2ZWQtbWF4LWR1cmF0aW9uPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJlc2VydmVkIG1heGltdW0gZmlsZSBkdXJhdGlvbiAobnMpPC9OSUNLPgorPEJMVVJCPldoZW4gc2V0IHRvIGEgdmFsdWUgPiAwLCByZXNlcnZlcyBzcGFjZSBmb3IgaW5kZXggdGFibGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuPC9CTFVSQj4KKzxERUZBVUxUPjE4NDQ2NzQ0MDczNzA5NTUxNjE1PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3QzR1BQTXV4OjpyZXNlcnZlZC1tb292LXVwZGF0ZS1wZXJpb2Q8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SW50ZXJ2YWwgYXQgd2hpY2ggdG8gdXBkYXRlIGluZGV4IHRhYmxlcyAobnMpPC9OSUNLPgorPEJMVVJCPldoZW4gdXNlZCB3aXRoIHJlc2VydmVkLW1heC1kdXJhdGlvbiwgcGVyaW9kaWNhbGx5IHVwZGF0ZXMgdGhlIGluZGV4IHRhYmxlcyB3aXRoIGluZm9ybWF0aW9uIG11eGVkIHNvIGZhci48L0JMVVJCPgorPERFRkFVTFQ+MTg0NDY3NDQwNzM3MDk1NTE2MTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdDNHUFBNdXg6OmludGVybGVhdmUtYnl0ZXM8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SW50ZXJsZWF2ZSAoYnl0ZXMpPC9OSUNLPgorPEJMVVJCPkludGVybGVhdmUgYmV0d2VlbiBzdHJlYW1zIGluIGJ5dGVzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3QzR1BQTXV4OjppbnRlcmxlYXZlLXRpbWU8L05BTUU+Cis8VFlQRT5ndWludDY0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SW50ZXJsZWF2ZSAodGltZSk8L05JQ0s+Cis8QkxVUkI+SW50ZXJsZWF2ZSBiZXR3ZWVuIHN0cmVhbXMgaW4gbmFub3NlY29uZHMuPC9CTFVSQj4KKzxERUZBVUxUPjI1MDAwMDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0M0dQUE11eDo6bWF4LXJhdy1hdWRpby1kcmlmdDwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggUmF3IEF1ZGlvIERyaWZ0PC9OSUNLPgorPEJMVVJCPk1heGltdW0gYWxsb3dlZCBkcmlmdCBvZiByYXcgYXVkaW8gc2FtcGxlcyB2cy4gdGltZXN0YW1wcyBpbiBuYW5vc2Vjb25kcy48L0JMVVJCPgorPERFRkFVTFQ+NDAwMDAwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdDNHUFBNdXg6OnJlc2VydmVkLXByZWZpbGw8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5SZXNlcnZlZCBQcmVmaWxsIFNhbXBsZXMgVGFibGU8L05JQ0s+Cis8QkxVUkI+UHJlZmlsbCBzYW1wbGVzIHRhYmxlIG9mIHJlc2VydmVkIGR1cmF0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BsaXRGaWxlU3JjOjpsb2NhdGlvbjwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZpbGUgTG9jYXRpb248L05JQ0s+Cis8QkxVUkI+V2lsZGNhcmQgcGF0dGVybiB0byBtYXRjaCBmaWxlIG5hbWVzIG9mIHRoZSBpbnB1dCBmaWxlcy4gSWYgdGhlIGxvY2F0aW9uIGlzIGFuIGFic29sdXRlIHBhdGggb3IgY29udGFpbnMgZGlyZWN0b3J5IGNvbXBvbmVudHMsIG9ubHkgdGhlIGJhc2UgZmlsZSBuYW1lIHBhcnQgd2lsbCBiZSBjb25zaWRlcmVkIGZvciBwYXR0ZXJuIG1hdGNoaW5nLiBUaGUgcmVzdWx0cyB3aWxsIGJlIHNvcnRlZC48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TWF0cm9za2FEZW11eDo6bWF4LWdhcC10aW1lPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heGltdW0gZ2FwIHRpbWU8L05JQ0s+Cis8QkxVUkI+VGhlIGRlbXV4ZXIgc2VuZHMgb3V0IHNlZ21lbnQgZXZlbnRzIGZvciBza2lwcGluZyBnYXBzIGxvbmdlciB0aGFuIHRoaXMgKDAgPSBkaXNhYmxlZCkuPC9CTFVSQj4KKzxERUZBVUxUPjIwMDAwMDAwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIdHRwQ2xpZW50U2luazo6YXV0b21hdGljLXJlZGlyZWN0PC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5hdXRvbWF0aWMtcmVkaXJlY3Q8L05JQ0s+Cis8QkxVUkI+QXV0b21hdGljYWxseSBmb2xsb3cgSFRUUCByZWRpcmVjdHMgKEhUVFAgU3RhdHVzIENvZGUgM3h4KS48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U291cEh0dHBDbGllbnRTaW5rOjpjb29raWVzPC9OQU1FPgorPFRZUEU+R1N0cnY8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Db29raWVzPC9OSUNLPgorPEJMVVJCPkhUVFAgcmVxdWVzdCBjb29raWVzLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIdHRwQ2xpZW50U2luazo6bG9jYXRpb248L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Mb2NhdGlvbjwvTklDSz4KKzxCTFVSQj5VUkkgdG8gc2VuZCB0by48L0JMVVJCPgorPERFRkFVTFQ+IiI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIdHRwQ2xpZW50U2luazo6cHJveHk8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qcm94eTwvTklDSz4KKzxCTFVSQj5IVFRQIHByb3h5IHNlcnZlciBVUkkuPC9CTFVSQj4KKzxERUZBVUxUPiIiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSHR0cENsaWVudFNpbms6OnByb3h5LWlkPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+cHJveHktaWQ8L05JQ0s+Cis8QkxVUkI+dXNlciBpZCBmb3IgcHJveHkgYXV0aGVudGljYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPiIiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSHR0cENsaWVudFNpbms6OnByb3h5LXB3PC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+cHJveHktcHc8L05JQ0s+Cis8QkxVUkI+dXNlciBwYXNzd29yZCBmb3IgcHJveHkgYXV0aGVudGljYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPiIiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSHR0cENsaWVudFNpbms6OnNlc3Npb248L05BTUU+Cis8VFlQRT5Tb3VwU2Vzc2lvbio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5zZXNzaW9uPC9OSUNLPgorPEJMVVJCPlNvdXBTZXNzaW9uIG9iamVjdCB0byB1c2UgZm9yIGNvbW11bmljYXRpb24uPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U291cEh0dHBDbGllbnRTaW5rOjp1c2VyLWFnZW50PC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VXNlci1BZ2VudDwvTklDSz4KKzxCTFVSQj5WYWx1ZSBvZiB0aGUgVXNlci1BZ2VudCBIVFRQIHJlcXVlc3QgaGVhZGVyIGZpZWxkLjwvQkxVUkI+Cis8REVGQVVMVD4iR1N0cmVhbWVyIHNvdXBodHRwY2xpZW50c2luayAiPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTb3VwSHR0cENsaWVudFNpbms6OnVzZXItaWQ8L05BTUU+Cis8VFlQRT5nY2hhcio8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz51c2VyLWlkPC9OSUNLPgorPEJMVVJCPnVzZXIgaWQgZm9yIGF1dGhlbnRpY2F0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4iIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U291cEh0dHBDbGllbnRTaW5rOjp1c2VyLXB3PC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+dXNlci1wdzwvTklDSz4KKzxCTFVSQj51c2VyIHBhc3N3b3JkIGZvciBhdXRoZW50aWNhdGlvbi48L0JMVVJCPgorPERFRkFVTFQ+IiI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIdHRwQ2xpZW50U2luazo6aHR0cC1sb2ctbGV2ZWw8L05BTUU+Cis8VFlQRT5Tb3VwTG9nZ2VyTG9nTGV2ZWw8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5IVFRQIGxvZyBsZXZlbDwvTklDSz4KKzxCTFVSQj5TZXQgbG9nIGxldmVsIGZvciBzb3VwJ3MgSFRUUCBzZXNzaW9uIGxvZy48L0JMVVJCPgorPERFRkFVTFQ+U09VUF9MT0dHRVJfTE9HX05PTkU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIdHRwQ2xpZW50U2luazo6cmV0cmllczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UmV0cmllczwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLCB6ZXJvIHRvIGRpc2FibGUsIC0xIHRvIHJldHJ5IGZvcmV2ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNvdXBIdHRwQ2xpZW50U2luazo6cmV0cnktZGVsYXk8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDE8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJldHJ5IERlbGF5PC9OSUNLPgorPEJMVVJCPkRlbGF5IGluIHNlY29uZHMgYmV0d2VlbiByZXRyaWVzIGFmdGVyIGEgZmFpbHVyZS48L0JMVVJCPgorPERFRkFVTFQ+NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0V2F2UGFyc2U6Omlnbm9yZS1sZW5ndGg8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPklnbm9yZSBsZW5ndGg8L05JQ0s+Cis8QkxVUkI+SWdub3JlIGxlbmd0aCBmcm9tIHRoZSBXYXZlIGhlYWRlci48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEdka1BpeGJ1Zk92ZXJsYXk6OmxvY2F0aW9uPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+bG9jYXRpb248L05JQ0s+Cis8QkxVUkI+TG9jYXRpb24gb2YgaW1hZ2UgZmlsZSB0byBvdmVybGF5LjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RHZGtQaXhidWZPdmVybGF5OjpvZmZzZXQteDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5YIE9mZnNldDwvTklDSz4KKzxCTFVSQj5Gb3IgcG9zaXRpdmUgdmFsdWUsIGhvcml6b250YWwgb2Zmc2V0IG9mIG92ZXJsYXkgaW1hZ2UgaW4gcGl4ZWxzIGZyb20gbGVmdCBvZiB2aWRlbyBpbWFnZS4gRm9yIG5lZ2F0aXZlIHZhbHVlLCBob3Jpem9udGFsIG9mZnNldCBvZiBvdmVybGF5IGltYWdlIGluIHBpeGVscyBmcm9tIHJpZ2h0IG9mIHZpZGVvIGltYWdlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RHZGtQaXhidWZPdmVybGF5OjpvZmZzZXQteTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5ZIE9mZnNldDwvTklDSz4KKzxCTFVSQj5Gb3IgcG9zaXRpdmUgdmFsdWUsIHZlcnRpY2FsIG9mZnNldCBvZiBvdmVybGF5IGltYWdlIGluIHBpeGVscyBmcm9tIHRvcCBvZiB2aWRlbyBpbWFnZS4gRm9yIG5lZ2F0aXZlIHZhbHVlLCB2ZXJ0aWNhbCBvZmZzZXQgb2Ygb3ZlcmxheSBpbWFnZSBpbiBwaXhlbHMgZnJvbSBib3R0b20gb2YgdmlkZW8gaW1hZ2UuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEdka1BpeGJ1Zk92ZXJsYXk6Om92ZXJsYXktaGVpZ2h0PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5PdmVybGF5IEhlaWdodDwvTklDSz4KKzxCTFVSQj5IZWlnaHQgb2Ygb3ZlcmxheSBpbWFnZSBpbiBwaXhlbHMgKDAgPSBzYW1lIGFzIG92ZXJsYXkgaW1hZ2UpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RHZGtQaXhidWZPdmVybGF5OjpvdmVybGF5LXdpZHRoPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5PdmVybGF5IFdpZHRoPC9OSUNLPgorPEJMVVJCPldpZHRoIG9mIG92ZXJsYXkgaW1hZ2UgaW4gcGl4ZWxzICgwID0gc2FtZSBhcyBvdmVybGF5IGltYWdlKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0R2RrUGl4YnVmT3ZlcmxheTo6cmVsYXRpdmUteDwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SZWxhdGl2ZSBYIE9mZnNldDwvTklDSz4KKzxCTFVSQj5Ib3Jpem9udGFsIG9mZnNldCBvZiBvdmVybGF5IGltYWdlIGluIGZyYWN0aW9ucyBvZiB2aWRlbyBpbWFnZSB3aWR0aCwgZnJvbSB0b3AtbGVmdCBjb3JuZXIgb2YgdmlkZW8gaW1hZ2UgKGluIHJlbGF0aXZlIHBvc2l0aW9uaW5nKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0R2RrUGl4YnVmT3ZlcmxheTo6cmVsYXRpdmUteTwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Wy0xLDFdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SZWxhdGl2ZSBZIE9mZnNldDwvTklDSz4KKzxCTFVSQj5WZXJ0aWNhbCBvZmZzZXQgb2Ygb3ZlcmxheSBpbWFnZSBpbiBmcmFjdGlvbnMgb2YgdmlkZW8gaW1hZ2UgaGVpZ2h0LCBmcm9tIHRvcC1sZWZ0IGNvcm5lciBvZiB2aWRlbyBpbWFnZSAoaW4gcmVsYXRpdmUgcG9zaXRpb25pbmcpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RHZGtQaXhidWZPdmVybGF5OjphbHBoYTwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkFscGhhPC9OSUNLPgorPEJMVVJCPkdsb2JhbCBhbHBoYSBvZiBvdmVybGF5IGltYWdlLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RHZGtQaXhidWZPdmVybGF5OjpwaXhidWY8L05BTUU+Cis8VFlQRT5HZGtQaXhidWYqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UGl4YnVmPC9OSUNLPgorPEJMVVJCPkdka1BpeGJ1ZiBvYmplY3QgdG8gcmVuZGVyLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdEdka1BpeGJ1Zk92ZXJsYXk6OnBvc2l0aW9uaW5nLW1vZGU8L05BTUU+Cis8VFlQRT5Hc3RHZGtQaXhidWZQb3NpdGlvbmluZ01vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qb3NpdGlvbmluZyBtb2RlPC9OSUNLPgorPEJMVVJCPlBvc2l0aW9uaW5nIG1vZGUgb2Ygb2Zmc2V0LXggYW5kIG9mZnNldC15IHByb3BlcnRpZXMuPC9CTFVSQj4KKzxERUZBVUxUPnBpeGVscy1yZWxhdGl2ZS10by1lZGdlczwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0R2RrUGl4YnVmT3ZlcmxheTo6Y29lZi14PC9OQU1FPgorPFRZUEU+Z2RvdWJsZTwvVFlQRT4KKzxSQU5HRT5bLTEsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJlbGF0aXZlIFggT2Zmc2V0PC9OSUNLPgorPEJMVVJCPkhvcml6b250YWwgb2Zmc2V0IG9mIG92ZXJsYXkgaW1hZ2UgaW4gZnJhY3Rpb25zIG9mIHZpZGVvIGltYWdlIHdpZHRoLCBmcm9tIHRvcC1sZWZ0IGNvcm5lciBvZiB2aWRlbyBpbWFnZSAoYWJzb2x1dGUgcG9zaXRpb25pbmcpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RHZGtQaXhidWZPdmVybGF5Ojpjb2VmLXk8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPlstMSwxXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UmVsYXRpdmUgWSBPZmZzZXQ8L05JQ0s+Cis8QkxVUkI+VmVydGljYWwgb2Zmc2V0IG9mIG92ZXJsYXkgaW1hZ2UgaW4gZnJhY3Rpb25zIG9mIHZpZGVvIGltYWdlIGhlaWdodCwgZnJvbSB0b3AtbGVmdCBjb3JuZXIgb2YgdmlkZW8gaW1hZ2UgKGFic29sdXRlIHBvc2l0aW9uaW5nKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjphcm5yLW1heGZyYW1lczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMTVdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5BbHRSZWYgbWF4IGZyYW1lczwvTklDSz4KKzxCTFVSQj5BbHRSZWYgbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OmFybnItc3RyZW5ndGg8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDZdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5BbHRSZWYgc3RyZW5ndGg8L05JQ0s+Cis8QkxVUkI+QWx0UmVmIHN0cmVuZ3RoLjwvQkxVUkI+Cis8REVGQVVMVD4zPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OmFybnItdHlwZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsM108L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkFsdFJlZiB0eXBlPC9OSUNLPgorPEJMVVJCPkFsdFJlZiB0eXBlLjwvQkxVUkI+Cis8REVGQVVMVD4zPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OmF1dG8tYWx0LXJlZjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QXV0byBhbHQgcmVmZXJlbmNlIGZyYW1lczwvTklDSz4KKzxCTFVSQj5BdXRvbWF0aWNhbGx5IGdlbmVyYXRlIEFsdFJlZiBmcmFtZXMuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OmJ1ZmZlci1pbml0aWFsLXNpemU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkJ1ZmZlciBpbml0aWFsIHNpemU8L05JQ0s+Cis8QkxVUkI+SW5pdGlhbCBjbGllbnQgYnVmZmVyIHNpemUgKG1zKS48L0JMVVJCPgorPERFRkFVTFQ+NDAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjpidWZmZXItb3B0aW1hbC1zaXplPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CdWZmZXIgb3B0aW1hbCBzaXplPC9OSUNLPgorPEJMVVJCPk9wdGltYWwgY2xpZW50IGJ1ZmZlciBzaXplIChtcykuPC9CTFVSQj4KKzxERUZBVUxUPjUwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6YnVmZmVyLXNpemU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkJ1ZmZlciBzaXplPC9OSUNLPgorPEJMVVJCPkNsaWVudCBidWZmZXIgc2l6ZSAobXMpLjwvQkxVUkI+Cis8REVGQVVMVD42MDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OmNwdS11c2VkPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bLTE2LDE2XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q1BVIHVzZWQ8L05JQ0s+Cis8QkxVUkI+Q1BVIHVzZWQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6Y3EtbGV2ZWw8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDYzXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29uc3RyYWluZWQgcXVhbGl0eSBsZXZlbDwvTklDSz4KKzxCTFVSQj5Db25zdHJhaW5lZCBxdWFsaXR5IGxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4xMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjpkZWFkbGluZTwvTkFNRT4KKzxUWVBFPmdpbnQ2NDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EZWFkbGluZTwvTklDSz4KKzxCTFVSQj5EZWFkbGluZSBwZXIgZnJhbWUgKHVzZWMsIDA9ZGlzYWJsZWQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OmRyb3BmcmFtZS10aHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRyb3AgRnJhbWUgVGhyZXNob2xkPC9OSUNLPgorPEJMVVJCPlRlbXBvcmFsIHJlc2FtcGxpbmcgdGhyZXNob2xkIChidWYgJSkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6ZW5kLXVzYWdlPC9OQU1FPgorPFRZUEU+R3N0VlA4RW5jRW5kVXNhZ2U8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SYXRlIGNvbnRyb2wgbW9kZTwvTklDSz4KKzxCTFVSQj5SYXRlIGNvbnRyb2wgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+VmFyaWFibGUgQml0IFJhdGUgKFZCUikgbW9kZTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjplcnJvci1yZXNpbGllbnQ8L05BTUU+Cis8VFlQRT5Hc3RWUDhFbmNFckZsYWdzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RXJyb3IgcmVzaWxpZW50PC9OSUNLPgorPEJMVVJCPkVycm9yIHJlc2lsaWVuY2UgZmxhZ3MuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjpsYWctaW4tZnJhbWVzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwyNV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkxhZyBpbiBmcmFtZXM8L05JQ0s+Cis8QkxVUkI+TWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIHRvIGxhZy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjptYXgtcXVhbnRpemVyPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw2M108L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heGltdW0gUXVhbnRpemVyPC9OSUNLPgorPEJMVVJCPk1heGltdW0gUXVhbnRpemVyICh3b3JzdCkuPC9CTFVSQj4KKzxERUZBVUxUPjYzPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6Om1pbi1xdWFudGl6ZXI8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDYzXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWluaW11bSBRdWFudGl6ZXI8L05JQ0s+Cis8QkxVUkI+TWluaW11bSBRdWFudGl6ZXIgKGJlc3QpLjwvQkxVUkI+Cis8REVGQVVMVD40PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6Om11bHRpcGFzcy1jYWNoZS1maWxlPC9OQU1FPgorPFRZUEU+Z2NoYXIqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TXVsdGlwYXNzIENhY2hlIEZpbGU8L05JQ0s+Cis8QkxVUkI+TXVsdGlwYXNzIGNhY2hlIGZpbGUuIElmIHN0cmVhbSBjYXBzIHJlaW5pdGVkLCBtdWx0aXBsZSBmaWxlcyB3aWxsIGJlIGNyZWF0ZWQ6IGZpbGUsIGZpbGUuMSwgZmlsZS4yLCAuLi4gYW5kIHNvIG9uLjwvQkxVUkI+Cis8REVGQVVMVD4ibXVsdGlwYXNzLmNhY2hlIjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjptdWx0aXBhc3MtbW9kZTwvTkFNRT4KKzxUWVBFPkdzdFZQOEVuY011bHRpcGFzc01vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NdWx0aXBhc3MgTW9kZTwvTklDSz4KKzxCTFVSQj5NdWx0aXBhc3MgZW5jb2RlIG1vZGUuPC9CTFVSQj4KKzxERUZBVUxUPk9uZSBwYXNzIGVuY29kaW5nIChkZWZhdWx0KTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjpub2lzZS1zZW5zaXRpdml0eTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk5vaXNlIHNlbnNpdGl2aXR5PC9OSUNLPgorPEJMVVJCPk5vaXNlIHNlbnNpc2l2aXR5IChmcmFtZXMgdG8gYmx1cikuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6cmVzaXplLWFsbG93ZWQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJlc2l6ZSBBbGxvd2VkPC9OSUNLPgorPEJMVVJCPkFsbG93IHNwYXRpYWwgcmVzYW1wbGluZy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6cmVzaXplLWRvd24tdGhyZXNob2xkPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxMDBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SZXNpemUgRG93biBUaHJlc2hvbGQ8L05JQ0s+Cis8QkxVUkI+RG93bnNjYWxlIHRocmVzaG9sZCAoYnVmICUpLjwvQkxVUkI+Cis8REVGQVVMVD42MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjpyZXNpemUtdXAtdGhyZXNob2xkPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxMDBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SZXNpemUgVXAgVGhyZXNob2xkPC9OSUNLPgorPEJMVVJCPlVwc2NhbGUgdGhyZXNob2xkIChidWYgJSkuPC9CTFVSQj4KKzxERUZBVUxUPjMwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OnNoYXJwbmVzczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsN108L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNoYXJwbmVzczwvTklDSz4KKzxCTFVSQj5GaWx0ZXIgc2hhcnBuZXNzLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OnN0YXRpYy10aHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlN0YXRpYyBUaHJlc2hvbGQ8L05JQ0s+Cis8QkxVUkI+TW90aW9uIGRldGVjdGlvbiB0aHJlc2hvbGQuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6dGFyZ2V0LWJpdHJhdGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRhcmdldCBiaXRyYXRlPC9OSUNLPgorPEJMVVJCPlRhcmdldCBiaXRyYXRlIChpbiBiaXRzL3NlYykuPC9CTFVSQj4KKzxERUZBVUxUPjI1NjAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjp0aHJlYWRzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw2NF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRocmVhZHM8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OnRva2VuLXBhcnRpdGlvbnM8L05BTUU+Cis8VFlQRT5Hc3RWUDhFbmNUb2tlblBhcnRpdGlvbnM8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Ub2tlbiBwYXJ0aXRpb25zPC9OSUNLPgorPEJMVVJCPk51bWJlciBvZiB0b2tlbiBwYXJ0aXRpb25zLjwvQkxVUkI+Cis8REVGQVVMVD5PbmUgdG9rZW4gcGFydGl0aW9uPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OnR1bmluZzwvTkFNRT4KKzxUWVBFPkdzdFZQOEVuY1R1bmluZzwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlR1bmluZzwvTklDSz4KKzxCTFVSQj5UdW5pbmcuPC9CTFVSQj4KKzxERUZBVUxUPlR1bmUgZm9yIFBTTlI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6aG9yaXpvbnRhbC1zY2FsaW5nLW1vZGU8L05BTUU+Cis8VFlQRT5Hc3RWUDhFbmNTY2FsaW5nTW9kZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkhvcml6b250YWwgc2NhbGluZyBtb2RlPC9OSUNLPgorPEJMVVJCPkhvcml6b250YWwgc2NhbGluZyBtb2RlLjwvQkxVUkI+Cis8REVGQVVMVD5Ob3JtYWw8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6a2V5ZnJhbWUtbWF4LWRpc3Q8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPktleWZyYW1lIG1heCBkaXN0YW5jZTwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIGRpc3RhbmNlIGJldHdlZW4ga2V5ZnJhbWVzIChudW1iZXIgb2YgZnJhbWVzKS48L0JMVVJCPgorPERFRkFVTFQ+MTI4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OmtleWZyYW1lLW1vZGU8L05BTUU+Cis8VFlQRT5Hc3RWUDhFbmNLZk1vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5LZXlmcmFtZSBNb2RlPC9OSUNLPgorPEJMVVJCPktleWZyYW1lIHBsYWNlbWVudC48L0JMVVJCPgorPERFRkFVTFQ+RGV0ZXJtaW5lIG9wdGltYWwgcGxhY2VtZW50IGF1dG9tYXRpY2FsbHk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6bWF4LWludHJhLWJpdHJhdGU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBJbnRyYSBiaXRyYXRlPC9OSUNLPgorPEJMVVJCPk1heGltdW0gSW50cmEgZnJhbWUgYml0cmF0ZS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjpvdmVyc2hvb3Q8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDEwMDBdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5PdmVyc2hvb3QgUENUPC9OSUNLPgorPEJMVVJCPkRhdGFyYXRlIG92ZXJzaG9vdCAobWF4KSB0YXJnZXQgKCUpLjwvQkxVUkI+Cis8REVGQVVMVD4xMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6dGVtcG9yYWwtc2NhbGFiaWxpdHktbGF5ZXItaWQ8L05BTUU+Cis8VFlQRT5HVmFsdWVBcnJheSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Db2RpbmcgbGF5ZXIgaWRlbnRpZmljYXRpb248L05JQ0s+Cis8QkxVUkI+U2VxdWVuY2UgZGVmaW5pbmcgY29kaW5nIGxheWVyIG1lbWJlcnNoaXAuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjp0ZW1wb3JhbC1zY2FsYWJpbGl0eS1udW1iZXItbGF5ZXJzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSw1XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TnVtYmVyIG9mIGNvZGluZyBsYXllcnM8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIGNvZGluZyBsYXllcnMgdG8gdXNlLjwvQkxVUkI+Cis8REVGQVVMVD4xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OnRlbXBvcmFsLXNjYWxhYmlsaXR5LXBlcmlvZGljaXR5PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxNl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNvZGluZyBsYXllciBwZXJpb2RpY2l0eTwvTklDSz4KKzxCTFVSQj5MZW5ndGggb2Ygc2VxdWVuY2UgdGhhdCBkZWZpbmVzIGxheWVyIG1lbWJlcnNoaXAgcGVyaW9kaWNpdHkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6dGVtcG9yYWwtc2NhbGFiaWxpdHktcmF0ZS1kZWNpbWF0b3I8L05BTUU+Cis8VFlQRT5HVmFsdWVBcnJheSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Db2RpbmcgbGF5ZXIgcmF0ZSBkZWNpbWF0b3I8L05JQ0s+Cis8QkxVUkI+UmF0ZSBkZWNpbWF0aW9uIGZhY3RvcnMgZm9yIGVhY2ggbGF5ZXIuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RW5jOjp0ZW1wb3JhbC1zY2FsYWJpbGl0eS10YXJnZXQtYml0cmF0ZTwvTkFNRT4KKzxUWVBFPkdWYWx1ZUFycmF5KjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNvZGluZyBsYXllciB0YXJnZXQgYml0cmF0ZXM8L05JQ0s+Cis8QkxVUkI+VGFyZ2V0IGJpdHJhdGVzIGZvciBjb2RpbmcgbGF5ZXJzIChvbmUgcGVyIGxheWVyLCBkZWNyZWFzaW5nKS48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OnR3b3Bhc3MtdmJyLWJpYXM8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPjItcGFzcyBWQlIgYmlhczwvTklDSz4KKzxCTFVSQj5DQlIvVkJSIGJpYXMgKDA9Q0JSLCAxMDA9VkJSKS48L0JMVVJCPgorPERFRkFVTFQ+NTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6dHdvcGFzcy12YnItbWF4c2VjdGlvbjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Mi1wYXNzIEdPUCBtYXggYml0cmF0ZTwvTklDSz4KKzxCTFVSQj5HT1AgbWF4aW11bSBiaXRyYXRlICglIHRhcmdldCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6dHdvcGFzcy12YnItbWluc2VjdGlvbjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Mi1wYXNzIEdPUCBtaW4gYml0cmF0ZTwvTklDSz4KKzxCTFVSQj5HT1AgbWluaW11bSBiaXRyYXRlICglIHRhcmdldCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOEVuYzo6dW5kZXJzaG9vdDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlVuZGVyc2hvb3QgUENUPC9OSUNLPgorPEJMVVJCPkRhdGFyYXRlIHVuZGVyc2hvb3QgKG1pbikgdGFyZ2V0ICglKS48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OnZlcnRpY2FsLXNjYWxpbmctbW9kZTwvTkFNRT4KKzxUWVBFPkdzdFZQOEVuY1NjYWxpbmdNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VmVydGljYWwgc2NhbGluZyBtb2RlPC9OSUNLPgorPEJMVVJCPlZlcnRpY2FsIHNjYWxpbmcgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+Tm9ybWFsPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhFbmM6OnRpbWViYXNlPC9OQU1FPgorPFRZUEU+R3N0RnJhY3Rpb248L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TaG9ydGVzdCBpbnRlcmZyYW1lIHRpbWU8L05JQ0s+Cis8QkxVUkI+RnJhY3Rpb24gb2Ygb25lIHNlY29uZCB0aGF0IGlzIHRoZSBzaG9ydGVzdCBpbnRlcmZyYW1lIHRpbWUgLSBub3JtYWxseSBsZWZ0IGFzIHplcm8gd2hpY2ggd2lsbCBkZWZhdWx0IHRvIHRoZSBmcmFtZXJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RGVjOjpkZWJsb2NraW5nLWxldmVsPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMTY8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRlYmxvY2tpbmcgTGV2ZWw8L05JQ0s+Cis8QkxVUkI+RGVibG9ja2luZyBsZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+NDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RGVjOjpub2lzZS1sZXZlbDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDE2PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Ob2lzZSBMZXZlbDwvTklDSz4KKzxCTFVSQj5Ob2lzZSBsZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RGVjOjpwb3N0LXByb2Nlc3Npbmc8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBvc3QgUHJvY2Vzc2luZzwvTklDSz4KKzxCTFVSQj5FbmFibGUgcG9zdCBwcm9jZXNzaW5nLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA4RGVjOjpwb3N0LXByb2Nlc3NpbmctZmxhZ3M8L05BTUU+Cis8VFlQRT5Hc3RWUDhEZWNQb3N0UHJvY2Vzc2luZ0ZsYWdzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UG9zdCBQcm9jZXNzaW5nIEZsYWdzPC9OSUNLPgorPEJMVVJCPkZsYWdzIHRvIGNvbnRyb2wgcG9zdCBwcm9jZXNzaW5nLjwvQkxVUkI+Cis8REVGQVVMVD5EZWJsb2NrfERlbWFjcm9ibG9ja3xNdWx0aS1mcmFtZSBxdWFsaXR5IGVuaGFuY2VtZW50PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDhEZWM6OnRocmVhZHM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT5bMSwxNl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBUaHJlYWRzPC9OSUNLPgorPEJMVVJCPk1heGltdW0gbnVtYmVyIG9mIGRlY29kaW5nIHRocmVhZHMuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZpZGVvTWVkaWFuOjpmaWx0ZXJzaXplPC9OQU1FPgorPFRZUEU+R3N0VmlkZW9NZWRpYW5TaXplPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RmlsdGVyc2l6ZTwvTklDSz4KKzxCTFVSQj5UaGUgc2l6ZSBvZiB0aGUgZmlsdGVyLjwvQkxVUkI+Cis8REVGQVVMVD5NZWRpYW4gb2YgNSBuZWlnaGJvdXIgcGl4ZWxzPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWaWRlb01lZGlhbjo6bHVtLW9ubHk8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkx1bSBPbmx5PC9OSUNLPgorPEJMVVJCPk9ubHkgYXBwbHkgZmlsdGVyIG9uIGx1bWluYW5jZS48L0JMVVJCPgorPERFRkFVTFQ+VFJVRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U2NhbGV0ZW1wbzo6b3ZlcmxhcDwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk92ZXJsYXAgTGVuZ3RoPC9OSUNLPgorPEJMVVJCPlBlcmNlbnRhZ2Ugb2Ygc3RyaWRlIHRvIG92ZXJsYXAuPC9CTFVSQj4KKzxERUZBVUxUPjAuMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U2NhbGV0ZW1wbzo6cmF0ZTwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+Wy0yLjE0NzQ4ZSswOSwyLjE0NzQ4ZSswOV08L1JBTkdFPgorPEZMQUdTPnI8L0ZMQUdTPgorPE5JQ0s+UGxheWJhY2sgUmF0ZTwvTklDSz4KKzxCTFVSQj5DdXJyZW50IHBsYXliYWNrIHJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNjYWxldGVtcG86OnNlYXJjaDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjw9IDUwMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U2VhcmNoIExlbmd0aDwvTklDSz4KKzxCTFVSQj5MZW5ndGggaW4gbWlsbGlzZWNvbmRzIHRvIHNlYXJjaCBmb3IgYmVzdCBvdmVybGFwIHBvc2l0aW9uLjwvQkxVUkI+Cis8REVGQVVMVD4xNDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U2NhbGV0ZW1wbzo6c3RyaWRlPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsNTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlN0cmlkZSBMZW5ndGg8L05JQ0s+Cis8QkxVUkI+TGVuZ3RoIGluIG1pbGxpc2Vjb25kcyB0byBvdXRwdXQgZWFjaCBzdHJpZGUuPC9CTFVSQj4KKzxERUZBVUxUPjMwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFBNdXg6OnNlcW51bTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5TZXF1ZW5jZSBudW1iZXI8L05JQ0s+Cis8QkxVUkI+VGhlIFJUUCBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3QgcHJvY2Vzc2VkIHBhY2tldC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRQTXV4OjpzZXFudW0tb2Zmc2V0PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSBHX01BWFVMT05HPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TZXF1ZW5jZSBudW1iZXIgT2Zmc2V0PC9OSUNLPgorPEJMVVJCPk9mZnNldCB0byBhZGQgdG8gYWxsIG91dGdvaW5nIHNlcW51bSAoLTEgPSByYW5kb20pLjwvQkxVUkI+Cis8REVGQVVMVD4tMTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRQTXV4Ojpzc3JjPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TU1JDPC9OSUNLPgorPEJMVVJCPlRoZSBTU1JDIG9mIHRoZSBwYWNrZXRzIChkZWZhdWx0ID09IHJhbmRvbSkuPC9CTFVSQj4KKzxERUZBVUxUPjQyOTQ5NjcyOTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUUE11eDo6dGltZXN0YW1wLW9mZnNldDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VGltZXN0YW1wIE9mZnNldDwvTklDSz4KKzxCTFVSQj5PZmZzZXQgdG8gYWRkIHRvIGFsbCBvdXRnb2luZyB0aW1lc3RhbXBzICgtMSA9IHJhbmRvbSkuPC9CTFVSQj4KKzxERUZBVUxUPi0xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBTQkNQYXk6Om1pbi1mcmFtZXM8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IEdfTUFYVUxPTkc8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPm1pbmltdW0gZnJhbWUgbnVtYmVyPC9OSUNLPgorPEJMVVJCPk1pbmltdW0gcXVhbnRpdHkgb2YgZnJhbWVzIHRvIHNlbmQgaW4gb25lIHBhY2tldCAoLTEgZm9yIG1heGltdW0gYWxsb3dlZCBieSB0aGUgbXR1KS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRQRFRNRlNyYzo6Y2xvY2stcmF0ZTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Y2xvY2tyYXRlPC9OSUNLPgorPEJMVVJCPlRoZSBjbG9jay1yYXRlIGF0IHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBkdG1mIHBhY2tldHMuPC9CTFVSQj4KKzxERUZBVUxUPjgwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUUERUTUZTcmM6OnBhY2tldC1yZWR1bmRhbmN5PC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsNV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBhY2tldCBSZWR1bmRhbmN5PC9OSUNLPgorPEJMVVJCPk51bWJlciBvZiBwYWNrZXRzIHRvIHNlbmQgdG8gaW5kaWNhdGUgc3RhcnQgYW5kIHN0b3AgZHRtZiBldmVudHMuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUUERUTUZTcmM6OnB0PC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMTI4PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5wYXlsb2FkIHR5cGU8L05JQ0s+Cis8QkxVUkI+VGhlIHBheWxvYWQgdHlwZSBvZiB0aGUgcGFja2V0cy48L0JMVVJCPgorPERFRkFVTFQ+OTY8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUUERUTUZTcmM6OnNlcW51bTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5TZXF1ZW5jZSBudW1iZXI8L05JQ0s+Cis8QkxVUkI+VGhlIFJUUCBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3QgcHJvY2Vzc2VkIHBhY2tldC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRQRFRNRlNyYzo6c2VxbnVtLW9mZnNldDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U2VxdWVuY2UgbnVtYmVyIE9mZnNldDwvTklDSz4KKzxCTFVSQj5PZmZzZXQgdG8gYWRkIHRvIGFsbCBvdXRnb2luZyBzZXFudW0gKC0xID0gcmFuZG9tKS48L0JMVVJCPgorPERFRkFVTFQ+LTE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUUERUTUZTcmM6OnNzcmM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlNTUkM8L05JQ0s+Cis8QkxVUkI+VGhlIFNTUkMgb2YgdGhlIHBhY2tldHMgKC0xID09IHJhbmRvbSkuPC9CTFVSQj4KKzxERUZBVUxUPjQyOTQ5NjcyOTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUUERUTUZTcmM6OnRpbWVzdGFtcDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5UaW1lc3RhbXA8L05JQ0s+Cis8QkxVUkI+VGhlIFJUUCB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgcHJvY2Vzc2VkIHBhY2tldC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRQRFRNRlNyYzo6dGltZXN0YW1wLW9mZnNldDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gR19NQVhVTE9ORzwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VGltZXN0YW1wIE9mZnNldDwvTklDSz4KKzxCTFVSQj5PZmZzZXQgdG8gYWRkIHRvIGFsbCBvdXRnb2luZyB0aW1lc3RhbXBzICgtMSA9IHJhbmRvbSkuPC9CTFVSQj4KKzxERUZBVUxUPi0xPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBEVE1GRGVwYXk6Om1heC1kdXJhdGlvbjwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4aW11bSBkdXJhdGlvbjwvTklDSz4KKzxCTFVSQj5UaGUgbWF4dW1pbXVtIGR1cmF0aW9uIChtcykgb2YgdGhlIG91dGdvaW5nIHNvdW5kcGFja2V0LiAoMCA9IG5vIGxpbWl0KS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwRFRNRkRlcGF5Ojp1bml0LXRpbWU8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSAxMDAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5EdXJhdGlvbiB1bml0dGltZTwvTklDSz4KKzxCTFVSQj5UaGUgc21hbGxlc3QgdW5pdCAobXMpIHRoZSBkdXJhdGlvbiBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgKDAgZGlzYWJsZXMgaXQpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3REVE1GU3JjOjppbnRlcnZhbDwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPlsxMCw1MF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkludGVydmFsIGJldHdlZW4gdG9uZSBwYWNrZXRzPC9OSUNLPgorPEJMVVJCPkludGVydmFsIGluIG1zIGJldHdlZW4gdHdvIHRvbmUgcGFja2V0cy48L0JMVVJCPgorPERFRkFVTFQ+NTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFZvcmJpc1BheTo6Y29uZmlnLWludGVydmFsPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMzYwMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29uZmlnIFNlbmQgSW50ZXJ2YWw8L05JQ0s+Cis8QkxVUkI+U2VuZCBDb25maWcgSW5zZXJ0aW9uIEludGVydmFsIGluIHNlY29uZHMgKGNvbmZpZ3VyYXRpb24gaGVhZGVycyB3aWxsIGJlIG11bHRpcGxleGVkIGluIHRoZSBkYXRhIHN0cmVhbSB3aGVuIGRldGVjdGVkLikgKDAgPSBkaXNhYmxlZCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJUUFJ0eFF1ZXVlOjptYXgtc2l6ZS1wYWNrZXRzPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggU2l6ZSBQYWNrZXRzPC9OSUNLPgorPEJMVVJCPkFtb3VudCBvZiBwYWNrZXRzIHRvIHF1ZXVlICgwID0gdW5saW1pdGVkKS48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSVFBSdHhRdWV1ZTo6bWF4LXNpemUtdGltZTwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IFNpemUgVGltZXM8L05JQ0s+Cis8QkxVUkI+QW1vdW50IG9mIG1zIHRvIHF1ZXVlICgwID0gdW5saW1pdGVkKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRQUnR4UXVldWU6OmZ1bGZpbGxlZC1yZXF1ZXN0czwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cjwvRkxBR1M+Cis8TklDSz5GdWxmaWxsZWQgUmVxdWVzdHM8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIGZ1bGZpbGxlZCByZXRyYW5zbWlzc2lvbiByZXF1ZXN0cy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UlRQUnR4UXVldWU6OnJlcXVlc3RzPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5yPC9GTEFHUz4KKzxOSUNLPlJlcXVlc3RzPC9OSUNLPgorPEJMVVJCPlRvdGFsIG51bWJlciBvZiByZXRyYW5zbWlzc2lvbiByZXF1ZXN0cy48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwR1NUUGF5Ojpjb25maWctaW50ZXJ2YWw8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSAzNjAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5DYXBzL1RhZ3MgU2VuZCBJbnRlcnZhbDwvTklDSz4KKzxCTFVSQj5JbnRlcnZhbCBmb3Igc2VuZGluZyBjYXBzIGFuZCBUQUcgZXZlbnRzIGluIHNlY29uZHMgKDAgPSBkaXNhYmxlZCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFZQOFBheTo6cGljdHVyZS1pZC1tb2RlPC9OQU1FPgorPFRZUEU+R3N0VlA4UlRQUGF5TW9kZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlBpY3R1cmUgSUQgTW9kZTwvTklDSz4KKzxCTFVSQj5UaGUgcGljdHVyZSBJRCBtb2RlIGZvciBwYXlsb2FkaW5nLjwvQkxVUkI+Cis8REVGQVVMVD5ObyBQaWN0dXJlIElEPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OmFybnItbWF4ZnJhbWVzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwxNV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkFsdFJlZiBtYXggZnJhbWVzPC9OSUNLPgorPEJMVVJCPkFsdFJlZiBtYXhpbXVtIG51bWJlciBvZiBmcmFtZXMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6YXJuci1zdHJlbmd0aDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkFsdFJlZiBzdHJlbmd0aDwvTklDSz4KKzxCTFVSQj5BbHRSZWYgc3RyZW5ndGguPC9CTFVSQj4KKzxERUZBVUxUPjM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6YXJuci10eXBlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMSwzXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QWx0UmVmIHR5cGU8L05JQ0s+Cis8QkxVUkI+QWx0UmVmIHR5cGUuPC9CTFVSQj4KKzxERUZBVUxUPjM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6YXV0by1hbHQtcmVmPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5BdXRvIGFsdCByZWZlcmVuY2UgZnJhbWVzPC9OSUNLPgorPEJMVVJCPkF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgQWx0UmVmIGZyYW1lcy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6YnVmZmVyLWluaXRpYWwtc2l6ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QnVmZmVyIGluaXRpYWwgc2l6ZTwvTklDSz4KKzxCTFVSQj5Jbml0aWFsIGNsaWVudCBidWZmZXIgc2l6ZSAobXMpLjwvQkxVUkI+Cis8REVGQVVMVD40MDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OmJ1ZmZlci1vcHRpbWFsLXNpemU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkJ1ZmZlciBvcHRpbWFsIHNpemU8L05JQ0s+Cis8QkxVUkI+T3B0aW1hbCBjbGllbnQgYnVmZmVyIHNpemUgKG1zKS48L0JMVVJCPgorPERFRkFVTFQ+NTAwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjpidWZmZXItc2l6ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+QnVmZmVyIHNpemU8L05JQ0s+Cis8QkxVUkI+Q2xpZW50IGJ1ZmZlciBzaXplIChtcykuPC9CTFVSQj4KKzxERUZBVUxUPjYwMDA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6Y3B1LXVzZWQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlstMTYsMTZdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5DUFUgdXNlZDwvTklDSz4KKzxCTFVSQj5DUFUgdXNlZC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjpjcS1sZXZlbDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNjNdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Db25zdHJhaW5lZCBxdWFsaXR5IGxldmVsPC9OSUNLPgorPEJMVVJCPkNvbnN0cmFpbmVkIHF1YWxpdHkgbGV2ZWwuPC9CTFVSQj4KKzxERUZBVUxUPjEwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OmRlYWRsaW5lPC9OQU1FPgorPFRZUEU+Z2ludDY0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkRlYWRsaW5lPC9OSUNLPgorPEJMVVJCPkRlYWRsaW5lIHBlciBmcmFtZSAodXNlYywgMD1kaXNhYmxlZCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6ZHJvcGZyYW1lLXRocmVzaG9sZDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RHJvcCBGcmFtZSBUaHJlc2hvbGQ8L05JQ0s+Cis8QkxVUkI+VGVtcG9yYWwgcmVzYW1wbGluZyB0aHJlc2hvbGQgKGJ1ZiAlKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjplbmQtdXNhZ2U8L05BTUU+Cis8VFlQRT5Hc3RWUDlFbmNFbmRVc2FnZTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJhdGUgY29udHJvbCBtb2RlPC9OSUNLPgorPEJMVVJCPlJhdGUgY29udHJvbCBtb2RlLjwvQkxVUkI+Cis8REVGQVVMVD5WYXJpYWJsZSBCaXQgUmF0ZSAoVkJSKSBtb2RlPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OmVycm9yLXJlc2lsaWVudDwvTkFNRT4KKzxUWVBFPkdzdFZQOUVuY0VyRmxhZ3M8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5FcnJvciByZXNpbGllbnQ8L05JQ0s+Cis8QkxVUkI+RXJyb3IgcmVzaWxpZW5jZSBmbGFncy48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6Omhvcml6b250YWwtc2NhbGluZy1tb2RlPC9OQU1FPgorPFRZUEU+R3N0VlA5RW5jU2NhbGluZ01vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Ib3Jpem9udGFsIHNjYWxpbmcgbW9kZTwvTklDSz4KKzxCTFVSQj5Ib3Jpem9udGFsIHNjYWxpbmcgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+Tm9ybWFsPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OmtleWZyYW1lLW1heC1kaXN0PC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5LZXlmcmFtZSBtYXggZGlzdGFuY2U8L05JQ0s+Cis8QkxVUkI+TWF4aW11bSBkaXN0YW5jZSBiZXR3ZWVuIGtleWZyYW1lcyAobnVtYmVyIG9mIGZyYW1lcykuPC9CTFVSQj4KKzxERUZBVUxUPjEyODwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjprZXlmcmFtZS1tb2RlPC9OQU1FPgorPFRZUEU+R3N0VlA5RW5jS2ZNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+S2V5ZnJhbWUgTW9kZTwvTklDSz4KKzxCTFVSQj5LZXlmcmFtZSBwbGFjZW1lbnQuPC9CTFVSQj4KKzxERUZBVUxUPkRldGVybWluZSBvcHRpbWFsIHBsYWNlbWVudCBhdXRvbWF0aWNhbGx5PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OmxhZy1pbi1mcmFtZXM8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDI1XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TGFnIGluIGZyYW1lczwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgdG8gbGFnLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6Om1heC1pbnRyYS1iaXRyYXRlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT4+PSAwPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXggSW50cmEgYml0cmF0ZTwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIEludHJhIGZyYW1lIGJpdHJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6bWF4LXF1YW50aXplcjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsNjNdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5NYXhpbXVtIFF1YW50aXplcjwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIFF1YW50aXplciAod29yc3QpLjwvQkxVUkI+Cis8REVGQVVMVD42MzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjptaW4tcXVhbnRpemVyPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw2M108L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1pbmltdW0gUXVhbnRpemVyPC9OSUNLPgorPEJMVVJCPk1pbmltdW0gUXVhbnRpemVyIChiZXN0KS48L0JMVVJCPgorPERFRkFVTFQ+NDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjptdWx0aXBhc3MtY2FjaGUtZmlsZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk11bHRpcGFzcyBDYWNoZSBGaWxlPC9OSUNLPgorPEJMVVJCPk11bHRpcGFzcyBjYWNoZSBmaWxlLiBJZiBzdHJlYW0gY2FwcyByZWluaXRlZCwgbXVsdGlwbGUgZmlsZXMgd2lsbCBiZSBjcmVhdGVkOiBmaWxlLCBmaWxlLjEsIGZpbGUuMiwgLi4uIGFuZCBzbyBvbi48L0JMVVJCPgorPERFRkFVTFQ+Im11bHRpcGFzcy5jYWNoZSI8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6bXVsdGlwYXNzLW1vZGU8L05BTUU+Cis8VFlQRT5Hc3RWUDlFbmNNdWx0aXBhc3NNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TXVsdGlwYXNzIE1vZGU8L05JQ0s+Cis8QkxVUkI+TXVsdGlwYXNzIGVuY29kZSBtb2RlLjwvQkxVUkI+Cis8REVGQVVMVD5PbmUgcGFzcyBlbmNvZGluZyAoZGVmYXVsdCk8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6bm9pc2Utc2Vuc2l0aXZpdHk8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDZdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Ob2lzZSBzZW5zaXRpdml0eTwvTklDSz4KKzxCTFVSQj5Ob2lzZSBzZW5zaXNpdml0eSAoZnJhbWVzIHRvIGJsdXIpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6Om92ZXJzaG9vdDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk92ZXJzaG9vdCBQQ1Q8L05JQ0s+Cis8QkxVUkI+RGF0YXJhdGUgb3ZlcnNob290IChtYXgpIHRhcmdldCAoJSkuPC9CTFVSQj4KKzxERUZBVUxUPjEwMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjpyZXNpemUtYWxsb3dlZDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UmVzaXplIEFsbG93ZWQ8L05JQ0s+Cis8QkxVUkI+QWxsb3cgc3BhdGlhbCByZXNhbXBsaW5nLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjpyZXNpemUtZG93bi10aHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJlc2l6ZSBEb3duIFRocmVzaG9sZDwvTklDSz4KKzxCTFVSQj5Eb3duc2NhbGUgdGhyZXNob2xkIChidWYgJSkuPC9CTFVSQj4KKzxERUZBVUxUPjYwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OnJlc2l6ZS11cC10aHJlc2hvbGQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlJlc2l6ZSBVcCBUaHJlc2hvbGQ8L05JQ0s+Cis8QkxVUkI+VXBzY2FsZSB0aHJlc2hvbGQgKGJ1ZiAlKS48L0JMVVJCPgorPERFRkFVTFQ+MzA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6c2hhcnBuZXNzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw3XTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U2hhcnBuZXNzPC9OSUNLPgorPEJMVVJCPkZpbHRlciBzaGFycG5lc3MuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6c3RhdGljLXRocmVzaG9sZDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U3RhdGljIFRocmVzaG9sZDwvTklDSz4KKzxCTFVSQj5Nb3Rpb24gZGV0ZWN0aW9uIHRocmVzaG9sZC48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjp0YXJnZXQtYml0cmF0ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VGFyZ2V0IGJpdHJhdGU8L05JQ0s+Cis8QkxVUkI+VGFyZ2V0IGJpdHJhdGUgKGluIGJpdHMvc2VjKS48L0JMVVJCPgorPERFRkFVTFQ+MjU2MDAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OnRlbXBvcmFsLXNjYWxhYmlsaXR5LWxheWVyLWlkPC9OQU1FPgorPFRZUEU+R1ZhbHVlQXJyYXkqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29kaW5nIGxheWVyIGlkZW50aWZpY2F0aW9uPC9OSUNLPgorPEJMVVJCPlNlcXVlbmNlIGRlZmluaW5nIGNvZGluZyBsYXllciBtZW1iZXJzaGlwLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6dGVtcG9yYWwtc2NhbGFiaWxpdHktbnVtYmVyLWxheWVyczwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzEsNV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk51bWJlciBvZiBjb2RpbmcgbGF5ZXJzPC9OSUNLPgorPEJMVVJCPk51bWJlciBvZiBjb2RpbmcgbGF5ZXJzIHRvIHVzZS48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjp0ZW1wb3JhbC1zY2FsYWJpbGl0eS1wZXJpb2RpY2l0eTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMTZdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Db2RpbmcgbGF5ZXIgcGVyaW9kaWNpdHk8L05JQ0s+Cis8QkxVUkI+TGVuZ3RoIG9mIHNlcXVlbmNlIHRoYXQgZGVmaW5lcyBsYXllciBtZW1iZXJzaGlwIHBlcmlvZGljaXR5LjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OnRlbXBvcmFsLXNjYWxhYmlsaXR5LXJhdGUtZGVjaW1hdG9yPC9OQU1FPgorPFRZUEU+R1ZhbHVlQXJyYXkqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Q29kaW5nIGxheWVyIHJhdGUgZGVjaW1hdG9yPC9OSUNLPgorPEJMVVJCPlJhdGUgZGVjaW1hdGlvbiBmYWN0b3JzIGZvciBlYWNoIGxheWVyLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6dGVtcG9yYWwtc2NhbGFiaWxpdHktdGFyZ2V0LWJpdHJhdGU8L05BTUU+Cis8VFlQRT5HVmFsdWVBcnJheSo8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Db2RpbmcgbGF5ZXIgdGFyZ2V0IGJpdHJhdGVzPC9OSUNLPgorPEJMVVJCPlRhcmdldCBiaXRyYXRlcyBmb3IgY29kaW5nIGxheWVycyAob25lIHBlciBsYXllciwgZGVjcmVhc2luZykuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjp0aHJlYWRzPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCw2NF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlRocmVhZHM8L05JQ0s+Cis8QkxVUkI+TnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OnRpbWViYXNlPC9OQU1FPgorPFRZUEU+R3N0RnJhY3Rpb248L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5TaG9ydGVzdCBpbnRlcmZyYW1lIHRpbWU8L05JQ0s+Cis8QkxVUkI+RnJhY3Rpb24gb2Ygb25lIHNlY29uZCB0aGF0IGlzIHRoZSBzaG9ydGVzdCBpbnRlcmZyYW1lIHRpbWUgLSBub3JtYWxseSBsZWZ0IGFzIHplcm8gd2hpY2ggd2lsbCBkZWZhdWx0IHRvIHRoZSBmcmFtZXJhdGUuPC9CTFVSQj4KKzxERUZBVUxUPjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjp0b2tlbi1wYXJ0aXRpb25zPC9OQU1FPgorPFRZUEU+R3N0VlA5RW5jVG9rZW5QYXJ0aXRpb25zPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VG9rZW4gcGFydGl0aW9uczwvTklDSz4KKzxCTFVSQj5OdW1iZXIgb2YgdG9rZW4gcGFydGl0aW9ucy48L0JMVVJCPgorPERFRkFVTFQ+T25lIHRva2VuIHBhcnRpdGlvbjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VlA5RW5jOjp0dW5pbmc8L05BTUU+Cis8VFlQRT5Hc3RWUDlFbmNUdW5pbmc8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5UdW5pbmc8L05JQ0s+Cis8QkxVUkI+VHVuaW5nLjwvQkxVUkI+Cis8REVGQVVMVD5UdW5lIGZvciBQU05SPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OnR3b3Bhc3MtdmJyLWJpYXM8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPlswLDEwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPjItcGFzcyBWQlIgYmlhczwvTklDSz4KKzxCTFVSQj5DQlIvVkJSIGJpYXMgKDA9Q0JSLCAxMDA9VkJSKS48L0JMVVJCPgorPERFRkFVTFQ+NTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6dHdvcGFzcy12YnItbWF4c2VjdGlvbjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Mi1wYXNzIEdPUCBtYXggYml0cmF0ZTwvTklDSz4KKzxCTFVSQj5HT1AgbWF4aW11bSBiaXRyYXRlICglIHRhcmdldCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6dHdvcGFzcy12YnItbWluc2VjdGlvbjwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+Mi1wYXNzIEdPUCBtaW4gYml0cmF0ZTwvTklDSz4KKzxCTFVSQj5HT1AgbWluaW11bSBiaXRyYXRlICglIHRhcmdldCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFZQOUVuYzo6dW5kZXJzaG9vdDwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzAsMTAwMF08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlVuZGVyc2hvb3QgUENUPC9OSUNLPgorPEJMVVJCPkRhdGFyYXRlIHVuZGVyc2hvb3QgKG1pbikgdGFyZ2V0ICglKS48L0JMVVJCPgorPERFRkFVTFQ+MTAwPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlFbmM6OnZlcnRpY2FsLXNjYWxpbmctbW9kZTwvTkFNRT4KKzxUWVBFPkdzdFZQOUVuY1NjYWxpbmdNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VmVydGljYWwgc2NhbGluZyBtb2RlPC9OSUNLPgorPEJMVVJCPlZlcnRpY2FsIHNjYWxpbmcgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+Tm9ybWFsPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlEZWM6OmRlYmxvY2tpbmctbGV2ZWw8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT48PSAxNjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RGVibG9ja2luZyBMZXZlbDwvTklDSz4KKzxCTFVSQj5EZWJsb2NraW5nIGxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD40PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlEZWM6Om5vaXNlLWxldmVsPC9OQU1FPgorPFRZUEU+Z3VpbnQ8L1RZUEU+Cis8UkFOR0U+PD0gMTY8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk5vaXNlIExldmVsPC9OSUNLPgorPEJMVVJCPk5vaXNlIGxldmVsLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlEZWM6OnBvc3QtcHJvY2Vzc2luZzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UG9zdCBQcm9jZXNzaW5nPC9OSUNLPgorPEJMVVJCPkVuYWJsZSBwb3N0IHByb2Nlc3NpbmcuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlEZWM6OnBvc3QtcHJvY2Vzc2luZy1mbGFnczwvTkFNRT4KKzxUWVBFPkdzdFZQOURlY1Bvc3RQcm9jZXNzaW5nRmxhZ3M8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qb3N0IFByb2Nlc3NpbmcgRmxhZ3M8L05JQ0s+Cis8QkxVUkI+RmxhZ3MgdG8gY29udHJvbCBwb3N0IHByb2Nlc3NpbmcuPC9CTFVSQj4KKzxERUZBVUxUPkRlYmxvY2t8RGVtYWNyb2Jsb2NrPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RWUDlEZWM6OnRocmVhZHM8L05BTUU+Cis8VFlQRT5ndWludDwvVFlQRT4KKzxSQU5HRT5bMSwxNl08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heCBUaHJlYWRzPC9OSUNLPgorPEJMVVJCPk1heGltdW0gbnVtYmVyIG9mIGRlY29kaW5nIHRocmVhZHMuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFZSYXdQYXk6OmNodW5rcy1wZXItZnJhbWU8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDE8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNodW5rcyBwZXIgRnJhbWU8L05JQ0s+Cis8QkxVUkI+U3BsaXQgYW5kIHNlbmQgb3V0IGVhY2ggZnJhbWUgaW4gbXVsdGlwbGUgY2h1bmtzIHRvIHJlZHVjZSBvdmVyaGVhZC48L0JMVVJCPgorPERFRkFVTFQ+MTA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFB1c2hGaWxlU3JjOjphcHBsaWVkLXJhdGU8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPj49IEdfTUlORE9VQkxFPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5BcHBsaWVkIFJhdGU8L05JQ0s+Cis8QkxVUkI+QXBwbGllZCByYXRlIHRvIHVzZSBpbiBUSU1FIFNFR01FTlQuPC9CTFVSQj4KKzxERUZBVUxUPjE8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFB1c2hGaWxlU3JjOjppbml0aWFsLXRpbWVzdGFtcDwvTkFNRT4KKzxUWVBFPmd1aW50NjQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Jbml0aWFsIFRpbWVzdGFtcDwvTklDSz4KKzxCTFVSQj5Jbml0aWFsIEJ1ZmZlciBUaW1lc3RhbXAgKGlmIHRpbWUtc2VnbWVudCBUUlVFKS48L0JMVVJCPgorPERFRkFVTFQ+MTg0NDY3NDQwNzM3MDk1NTE2MTU8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFB1c2hGaWxlU3JjOjpsb2NhdGlvbjwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZpbGUgTG9jYXRpb248L05JQ0s+Cis8QkxVUkI+TG9jYXRpb24gb2YgdGhlIGZpbGUgdG8gcmVhZC48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVzaEZpbGVTcmM6OnJhdGU8L05BTUU+Cis8VFlQRT5nZG91YmxlPC9UWVBFPgorPFJBTkdFPj49IEdfTUlORE9VQkxFPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5SYXRlPC9OSUNLPgorPEJMVVJCPlJhdGUgdG8gdXNlIGluIFRJTUUgU0VHTUVOVC48L0JMVVJCPgorPERFRkFVTFQ+MTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVzaEZpbGVTcmM6OnN0YXJ0LXRpbWU8L05BTUU+Cis8VFlQRT5naW50NjQ8L1RZUEU+Cis8UkFOR0U+Pj0gMDwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U3RhcnQgVGltZTwvTklDSz4KKzxCTFVSQj5Jbml0aWFsIFN0YXJ0IFRpbWUgKGlmIHRpbWUtc2VnbWVudCBUUlVFKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVzaEZpbGVTcmM6OnN0cmVhbS10aW1lPC9OQU1FPgorPFRZUEU+Z2ludDY0PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlN0cmVhbSBUaW1lPC9OSUNLPgorPEJMVVJCPkluaXRpYWwgU3RyZWFtIFRpbWUgKGlmIHRpbWUtc2VnbWVudCBUUlVFKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UHVzaEZpbGVTcmM6OnRpbWUtc2VnbWVudDwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VGltZSBTZWdtZW50PC9OSUNLPgorPEJMVVJCPkVtaXQgVElNRSBTRUdNRU5UUy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwbGl0TXV4U3JjOjpsb2NhdGlvbjwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZpbGUgSW5wdXQgUGF0dGVybjwvTklDSz4KKzxCTFVSQj5HbG9iIHBhdHRlcm4gZm9yIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZXMgdG8gcmVhZC48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BsaXRNdXhTaW5rOjpsb2NhdGlvbjwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkZpbGUgT3V0cHV0IFBhdHRlcm48L05JQ0s+Cis8QkxVUkI+Rm9ybWF0IHN0cmluZyBwYXR0ZXJuIGZvciB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGVzIHRvIHdyaXRlIChlLmcuIHZpZGVvJTA1ZC5tcDQpLjwvQkxVUkI+Cis8REVGQVVMVD5OVUxMPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTcGxpdE11eFNpbms6Om1heC1zaXplLWJ5dGVzPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heC4gc2l6ZSBieXRlczwvTklDSz4KKzxCTFVSQj5NYXguIGFtb3VudCBvZiBkYXRhIHBlciBmaWxlIChpbiBieXRlcywgMD1kaXNhYmxlKS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BsaXRNdXhTaW5rOjptYXgtc2l6ZS10aW1lPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heC4gc2l6ZSAobnMpPC9OSUNLPgorPEJMVVJCPk1heC4gYW1vdW50IG9mIHRpbWUgcGVyIGZpbGUgKGluIG5zLCAwPWRpc2FibGUpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTcGxpdE11eFNpbms6Om11eC1vdmVyaGVhZDwvTkFNRT4KKzxUWVBFPmdkb3VibGU8L1RZUEU+Cis8UkFOR0U+WzAsMV08L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk11eGluZyBPdmVyaGVhZDwvTklDSz4KKzxCTFVSQj5FeHRyYSBzaXplIG92ZXJoZWFkIG9mIG11eGluZyAoMC4wMiA9IDIlKS48L0JMVVJCPgorPERFRkFVTFQ+MC4wMjwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BsaXRNdXhTaW5rOjptdXhlcjwvTkFNRT4KKzxUWVBFPkdzdEVsZW1lbnQqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TXV4ZXI8L05JQ0s+Cis8QkxVUkI+VGhlIG11eGVyIGVsZW1lbnQgdG8gdXNlIChOVUxMID0gZGVmYXVsdCBtcDRtdXgpLjwvQkxVUkI+Cis8REVGQVVMVD48L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwbGl0TXV4U2luazo6c2luazwvTkFNRT4KKzxUWVBFPkdzdEVsZW1lbnQqPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U2luazwvTklDSz4KKzxCTFVSQj5UaGUgc2luayBlbGVtZW50IChvciBlbGVtZW50IGNoYWluKSB0byB1c2UgKE5VTEwgPSBkZWZhdWx0IGZpbGVzaW5rKS48L0JMVVJCPgorPERFRkFVTFQ+PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RTcGxpdE11eFNpbms6Om1heC1maWxlczwvTkFNRT4KKzxUWVBFPmd1aW50PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TWF4IGZpbGVzPC9OSUNLPgorPEJMVVJCPk1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRvIGtlZXAgb24gZGlzay4gT25jZSB0aGUgbWF4aW11bSBpcyByZWFjaGVkLG9sZCBmaWxlcyBzdGFydCB0byBiZSBkZWxldGVkIHRvIG1ha2Ugcm9vbSBmb3IgbmV3IG9uZXMuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFNwbGl0TXV4U2luazo6c2VuZC1rZXlmcmFtZS1yZXF1ZXN0czwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+UmVxdWVzdCBrZXlmcmFtZXMgYXQgbWF4LXNpemUtdGltZTwvTklDSz4KKzxCTFVSQj5SZXF1ZXN0IGEga2V5ZnJhbWUgZXZlcnkgbWF4LXNpemUtdGltZSBucyB0byB0cnkgc3BsaXR0aW5nIGF0IHRoYXQgcG9pbnQuIE5lZWRzIG1heC1zaXplLWJ5dGVzIHRvIGJlIDAgaW4gb3JkZXIgdG8gYmUgZWZmZWN0aXZlLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BsaXRNdXhTaW5rOjptYXgtc2l6ZS10aW1lY29kZTwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPk1heGltdW0gdGltZWNvZGUgZGlmZmVyZW5jZTwvTklDSz4KKzxCTFVSQj5NYXhpbXVtIGRpZmZlcmVuY2UgaW4gdGltZWNvZGUgYmV0d2VlbiBmaXJzdCBhbmQgbGFzdCBmcmFtZS4gU2VwYXJhdG9yIGlzIGFzc3VtZWQgdG8gYmUgIjoiIGV2ZXJ5d2hlcmUgKGUuZy4gMDE6MDA6MDA6MDApLiBXaWxsIG9ubHkgYmUgZWZmZWN0aXZlIGlmIGEgdGltZWNvZGUgdHJhY2sgaXMgcHJlc2VudC48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BsaXRNdXhTaW5rOjphbGlnbm1lbnQtdGhyZXNob2xkPC9OQU1FPgorPFRZUEU+Z3VpbnQ2NDwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkFsaWdubWVudCB0aHJlc2hvbGQgKG5zKTwvTklDSz4KKzxCTFVSQj5BbGxvdyBub24tcmVmZXJlbmNlIHN0cmVhbXMgdG8gYmUgdGhhdCBtYW55IG5zIGJlZm9yZSB0aGUgcmVmZXJlbmNlIHN0cmVhbS48L0JMVVJCPgorPERFRkFVTFQ+MDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0U3BsaXRNdXhTaW5rOjp1c2Utcm9idXN0LW11eGluZzwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+U3VwcG9ydCByb2J1c3QtbXV4aW5nIG1vZGUgb2Ygc29tZSBtdXhlcnM8L05JQ0s+Cis8QkxVUkI+Q2hlY2sgaWYgbXV4ZXJzIHN1cHBvcnQgcm9idXN0IG11eGluZyB2aWEgdGhlIHJlc2VydmVkLW1heC1kdXJhdGlvbiBhbmQgcmVzZXJ2ZWQtZHVyYXRpb24tcmVtYWluaW5nIHByb3BlcnRpZXMgYW5kIHVzZSB0aGVtIGlmIHNvLiAoT25seSBwcmVzZW50IG9uIHF0bXV4IGFuZCBtcDRtdXggZm9yIG5vdykuIHNwbGl0bXV4c2luayBtYXkgdGhlbiBhbHNvICBjcmVhdGUgbmV3IGZyYWdtZW50cyBpZiB0aGUgcmVzZXJ2ZWQgaGVhZGVyIHNwYWNlIGlzIGFib3V0IHRvIG92ZXJmbG93LiBOb3RlIHRoaXMgZG9lcyBub3Qgc2V0IHJlc2VydmVkLW1vb3YtdXBkYXRlLXBlcmlvZCAtIGFwcHMgc2hvdWxkIGRvIHRoYXQgbWFudWFsbHkuPC9CTFVSQj4KKzxERUZBVUxUPkZBTFNFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBWUDlQYXk6OnBpY3R1cmUtaWQtbW9kZTwvTkFNRT4KKzxUWVBFPkdzdFZQOVJUUFBheU1vZGU8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5QaWN0dXJlIElEIE1vZGU8L05JQ0s+Cis8QkxVUkI+VGhlIHBpY3R1cmUgSUQgbW9kZSBmb3IgcGF5bG9hZGluZy48L0JMVVJCPgorPERFRkFVTFQ+Tm8gUGljdHVyZSBJRDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0UnRwSDI2NVBheTo6Y29uZmlnLWludGVydmFsPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bR19NQVhVTE9ORywzNjAwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VlBTIFNQUyBQUFMgU2VuZCBJbnRlcnZhbDwvTklDSz4KKzxCTFVSQj5TZW5kIFZQUywgU1BTIGFuZCBQUFMgSW5zZXJ0aW9uIEludGVydmFsIGluIHNlY29uZHMgKHNwcm9wIHBhcmFtZXRlciBzZXRzIHdpbGwgYmUgbXVsdGlwbGV4ZWQgaW4gdGhlIGRhdGEgc3RyZWFtIHdoZW4gZGV0ZWN0ZWQuKSAoMCA9IGRpc2FibGVkLCAtMSA9IHNlbmQgd2l0aCBldmVyeSBJRFIgZnJhbWUpLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RSdHBIMjY1UGF5OjpzcHJvcC1wYXJhbWV0ZXItc2V0czwvTkFNRT4KKzxUWVBFPmdjaGFyKjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPnNwcm9wLXBhcmFtZXRlci1zZXRzPC9OSUNLPgorPEJMVVJCPlRoZSBiYXNlNjQgc3Byb3AtcGFyYW1ldGVyLXNldHMgdG8gc2V0IGluIG91dCBjYXBzIChzZXQgdG8gTlVMTCB0byBleHRyYWN0IGZyb20gc3RyZWFtKS48L0JMVVJCPgorPERFRkFVTFQ+TlVMTDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0TGFtZU1QM0VuYzo6Yml0cmF0ZTwvTkFNRT4KKzxUWVBFPmdpbnQ8L1RZUEU+Cis8UkFOR0U+WzgsMzIwXTwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPkJpdHJhdGUgKGtiL3MpPC9OSUNLPgorPEJMVVJCPkJpdHJhdGUgaW4ga2JpdC9zZWMgKE9ubHkgdmFsaWQgaWYgdGFyZ2V0IGlzIGJpdHJhdGUsIGZvciBDQlIgb25lIG9mIDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYgb3IgMzIwKS48L0JMVVJCPgorPERFRkFVTFQ+MTI4PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RMYW1lTVAzRW5jOjpjYnI8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5DQlI8L05JQ0s+Cis8QkxVUkI+RW5mb3JjZSBjb25zdGFudCBiaXRyYXRlIGVuY29kaW5nIChPbmx5IHZhbGlkIGlmIHRhcmdldCBpcyBiaXRyYXRlKS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdExhbWVNUDNFbmM6OmVuY29kaW5nLWVuZ2luZS1xdWFsaXR5PC9OQU1FPgorPFRZUEU+R3N0TGFtZU1QM0VuY0VuY29kaW5nRW5naW5lUXVhbGl0eTwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5FbmNvZGluZyBFbmdpbmUgUXVhbGl0eTwvTklDSz4KKzxCTFVSQj5RdWFsaXR5L3NwZWVkIG9mIHRoZSBlbmNvZGluZyBlbmdpbmUsIHRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBiaXRyYXRlIS48L0JMVVJCPgorPERFRkFVTFQ+U3RhbmRhcmQ8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdExhbWVNUDNFbmM6Om1vbm88L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3eDwvRkxBR1M+Cis8TklDSz5Nb25vPC9OSUNLPgorPEJMVVJCPkVuZm9yY2UgbW9ubyBlbmNvZGluZy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdExhbWVNUDNFbmM6OnF1YWxpdHk8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+WzAsOS45OTldPC9SQU5HRT4KKzxGTEFHUz5yd3g8L0ZMQUdTPgorPE5JQ0s+UXVhbGl0eTwvTklDSz4KKzxCTFVSQj5WQlIgUXVhbGl0eSBmcm9tIDAgdG8gMTAsIDAgYmVpbmcgdGhlIGJlc3QgKE9ubHkgdmFsaWQgaWYgdGFyZ2V0IGlzIHF1YWxpdHkpLjwvQkxVUkI+Cis8REVGQVVMVD40PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RMYW1lTVAzRW5jOjp0YXJnZXQ8L05BTUU+Cis8VFlQRT5Hc3RMYW1lTVAzRW5jVGFyZ2V0PC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnd4PC9GTEFHUz4KKzxOSUNLPlRhcmdldDwvTklDSz4KKzxCTFVSQj5PcHRpbWl6ZSBmb3IgcXVhbGl0eSBvciBiaXRyYXRlLjwvQkxVUkI+Cis8REVGQVVMVD5RdWFsaXR5PC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RUd29MYW1lOjphdGgtbGV2ZWw8L05BTUU+Cis8VFlQRT5nZmxvYXQ8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5BVEggTGV2ZWw8L05JQ0s+Cis8QkxVUkI+QVRIIExldmVsIGluIGRCLjwvQkxVUkI+Cis8REVGQVVMVD4wPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RUd29MYW1lOjpiaXRyYXRlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bOCwzODRdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5CaXRyYXRlIChrYi9zKTwvTklDSz4KKzxCTFVSQj5CaXRyYXRlIGluIGtiaXQvc2VjICg4LCAxNiwgMjQsIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTQ0LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMCwgMzg0KS48L0JMVVJCPgorPERFRkFVTFQ+MTkyPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RUd29MYW1lOjpjb3B5cmlnaHQ8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPkNvcHlyaWdodDwvTklDSz4KKzxCTFVSQj5NYXJrIGFzIGNvcHlyaWdodC48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFR3b0xhbWU6OmVtcGhhc2lzPC9OQU1FPgorPFRZUEU+R3N0VHdvTGFtZUVtcGhhc2lzPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RW1waGFzaXM8L05JQ0s+Cis8QkxVUkI+UHJlLWVtcGhhc2lzIHRvIGFwcGx5IHRvIHRoZSBkZWNvZGVkIGF1ZGlvLjwvQkxVUkI+Cis8REVGQVVMVD5ObyBlbXBoYXNpczwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VHdvTGFtZTo6ZW5lcmd5LWxldmVsLWV4dGVuc2lvbjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RW5lcmd5IExldmVsIEV4dGVuc2lvbjwvTklDSz4KKzxCTFVSQj5Xcml0ZSBwZWFrIFBDTSBsZXZlbCB0byBlYWNoIGZyYW1lLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VHdvTGFtZTo6ZXJyb3ItcHJvdGVjdGlvbjwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+RXJyb3IgcHJvdGVjdGlvbjwvTklDSz4KKzxCTFVSQj5BZGRzIGNoZWNrc3VtIHRvIGV2ZXJ5IGZyYW1lLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VHdvTGFtZTo6bW9kZTwvTkFNRT4KKzxUWVBFPkdzdFR3b0xhbWVNb2RlPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+TW9kZTwvTklDSz4KKzxCTFVSQj5FbmNvZGluZyBtb2RlLjwvQkxVUkI+Cis8REVGQVVMVD5Kb2ludCBTdGVyZW88L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFR3b0xhbWU6Om9yaWdpbmFsPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5PcmlnaW5hbDwvTklDSz4KKzxCTFVSQj5NYXJrIGFzIG9yaWdpbmFsLjwvQkxVUkI+Cis8REVGQVVMVD5UUlVFPC9ERUZBVUxUPgorPC9BUkc+CisKKzxBUkc+Cis8TkFNRT5Hc3RUd29MYW1lOjpwYWRkaW5nPC9OQU1FPgorPFRZUEU+R3N0VHdvTGFtZVBhZGRpbmc8L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5QYWRkaW5nPC9OSUNLPgorPEJMVVJCPlBhZGRpbmcgdHlwZS48L0JMVVJCPgorPERFRkFVTFQ+Tm8gUGFkZGluZzwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VHdvTGFtZTo6cHN5bW9kZWw8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPltHX01BWFVMT05HLDRdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5Qc3ljaG9hY291c3RpYyBNb2RlbDwvTklDSz4KKzxCTFVSQj5Qc3ljaG9hY291c3RpYyBtb2RlbCB1c2VkIHRvIGVuY29kZSB0aGUgYXVkaW8uPC9CTFVSQj4KKzxERUZBVUxUPjM8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFR3b0xhbWU6OnF1aWNrLW1vZGU8L05BTUU+Cis8VFlQRT5nYm9vbGVhbjwvVFlQRT4KKzxSQU5HRT48L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlF1aWNrIG1vZGU8L05JQ0s+Cis8QkxVUkI+Q2FsY3VsYXRlIFBzeW1vZGVsIGV2ZXJ5IGZyYW1lcy48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFR3b0xhbWU6OnF1aWNrLW1vZGUtY291bnQ8L05BTUU+Cis8VFlQRT5naW50PC9UWVBFPgorPFJBTkdFPj49IDA8L1JBTkdFPgorPEZMQUdTPnJ3PC9GTEFHUz4KKzxOSUNLPlF1aWNrIG1vZGUgY291bnQ8L05JQ0s+Cis8QkxVUkI+Q2FsY3VsYXRlIFBzeW1vZGVsIGV2ZXJ5IG4gZnJhbWVzLjwvQkxVUkI+Cis8REVGQVVMVD4xMDwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VHdvTGFtZTo6dmJyPC9OQU1FPgorPFRZUEU+Z2Jvb2xlYW48L1RZUEU+Cis8UkFOR0U+PC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5WQlI8L05JQ0s+Cis8QkxVUkI+RW5hYmxlIHZhcmlhYmxlIGJpdHJhdGUgbW9kZS48L0JMVVJCPgorPERFRkFVTFQ+RkFMU0U8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFR3b0xhbWU6OnZici1sZXZlbDwvTkFNRT4KKzxUWVBFPmdmbG9hdDwvVFlQRT4KKzxSQU5HRT5bLTEwLDEwXTwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+VkJSIExldmVsPC9OSUNLPgorPEJMVVJCPlZCUiBMZXZlbC48L0JMVVJCPgorPERFRkFVTFQ+NTwvREVGQVVMVD4KKzwvQVJHPgorCis8QVJHPgorPE5BTUU+R3N0VHdvTGFtZTo6dmJyLW1heC1iaXRyYXRlPC9OQU1FPgorPFRZUEU+Z2ludDwvVFlQRT4KKzxSQU5HRT5bMCwzODRdPC9SQU5HRT4KKzxGTEFHUz5ydzwvRkxBR1M+Cis8TklDSz5WQlIgbWF4IGJpdHJhdGU8L05JQ0s+Cis8QkxVUkI+U3BlY2lmeSBtYXhpbXVtIFZCUiBiaXRyYXRlICgwPW9mZiwgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAsIDM4NCkuPC9CTFVSQj4KKzxERUZBVUxUPjA8L0RFRkFVTFQ+Cis8L0FSRz4KKworPEFSRz4KKzxOQU1FPkdzdFJ0cFNiY0RlcGF5OjppZ25vcmUtdGltZXN0YW1wczwvTkFNRT4KKzxUWVBFPmdib29sZWFuPC9UWVBFPgorPFJBTkdFPjwvUkFOR0U+Cis8RkxBR1M+cnc8L0ZMQUdTPgorPE5JQ0s+SWdub3JlIFRpbWVzdGFtcHM8L05JQ0s+Cis8QkxVUkI+VmFyaW91cyBzdGF0aXN0aWNzLjwvQkxVUkI+Cis8REVGQVVMVD5GQUxTRTwvREVGQVVMVD4KKzwvQVJHPgorCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeSBiL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaGllcmFyY2h5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYmQzZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLmhpZXJhcmNoeQpAQCAtMCwwICsxLDM3MSBAQAorR09iamVjdAorICBHSU9TdHJlYW0KKyAgICBHVGxzQ29ubmVjdGlvbgorICBHSW5pdGlhbGx5VW5vd25lZAorICAgIEdzdE9iamVjdAorICAgICAgR3N0QWxsb2NhdG9yCisgICAgICAgIEdzdEFsbG9jYXRvclN5c21lbQorICAgICAgR3N0QXVkaW9SaW5nQnVmZmVyCisgICAgICAgIEdzdEF1ZGlvU2lua1JpbmdCdWZmZXIKKyAgICAgICAgR3N0QXVkaW9TcmNSaW5nQnVmZmVyCisgICAgICAgIEdzdEphY2tBdWRpb1NpbmtSaW5nQnVmZmVyCisgICAgICAgIEdzdEphY2tBdWRpb1NyY1JpbmdCdWZmZXIKKyAgICAgIEdzdEJ1cworICAgICAgR3N0Q2xvY2sKKyAgICAgICAgR3N0U3lzdGVtQ2xvY2sKKyAgICAgICAgICBHc3RBdWRpb0Nsb2NrCisgICAgICBHc3RDb250cm9sQmluZGluZworICAgICAgR3N0Q29udHJvbFNvdXJjZQorICAgICAgR3N0RGV2aWNlUHJvdmlkZXIKKyAgICAgICAgR3N0UHVsc2VEZXZpY2VQcm92aWRlcgorICAgICAgICBHc3RWNGwyRGV2aWNlUHJvdmlkZXIKKyAgICAgIEdzdEVsZW1lbnQKKyAgICAgICAgR3N0M0dQUE11eAorICAgICAgICBHc3RBZ2dyZWdhdG9yCisgICAgICAgICAgR3N0Rmx2TXV4CisgICAgICAgIEdzdEFzdGVyaXNraDI2MworICAgICAgICBHc3RBdVBhcnNlCisgICAgICAgIEdzdEF1ZGlvRGVjb2RlcgorICAgICAgICAgIEdzdEFMYXdEZWMKKyAgICAgICAgICBHc3RGbGFjRGVjCisgICAgICAgICAgR3N0TXBnMTIzQXVkaW9EZWMKKyAgICAgICAgICBHc3RNdUxhd0RlYworICAgICAgICAgIEdzdFNwZWV4RGVjCisgICAgICAgICAgR3N0V2F2cGFja0RlYworICAgICAgICBHc3RBdWRpb0VuY29kZXIKKyAgICAgICAgICBHc3RBTGF3RW5jCisgICAgICAgICAgR3N0RmxhY0VuYworICAgICAgICAgIEdzdExhbWVNUDNFbmMKKyAgICAgICAgICBHc3RNdUxhd0VuYworICAgICAgICAgIEdzdFNwZWV4RW5jCisgICAgICAgICAgR3N0VHdvTGFtZQorICAgICAgICAgIEdzdFdhdnBhY2tFbmMKKyAgICAgICAgR3N0QXVkaW9WaXN1YWxpemVyCisgICAgICAgICAgR3N0R29vbQorICAgICAgICAgIEdzdEdvb20yazEKKyAgICAgICAgR3N0QXZpRGVtdXgKKyAgICAgICAgR3N0QXZpTXV4CisgICAgICAgIEdzdEF2aVN1YnRpdGxlCisgICAgICAgIEdzdEJhc2VQYXJzZQorICAgICAgICAgIEdzdEFhY1BhcnNlCisgICAgICAgICAgR3N0QWMzUGFyc2UKKyAgICAgICAgICBHc3RBbXJQYXJzZQorICAgICAgICAgIEdzdERjYVBhcnNlCisgICAgICAgICAgR3N0RmxhY1BhcnNlCisgICAgICAgICAgR3N0TXBlZ0F1ZGlvUGFyc2UKKyAgICAgICAgICBHc3RSdHBTdHJlYW1EZXBheQorICAgICAgICAgIEdzdFNiY1BhcnNlCisgICAgICAgICAgR3N0V2F2cGFja1BhcnNlCisgICAgICAgIEdzdEJhc2VTaW5rCisgICAgICAgICAgR3N0QXVkaW9CYXNlU2luaworICAgICAgICAgICAgR3N0QXVkaW9TaW5rCisgICAgICAgICAgICAgIEdzdE9zczRTaW5rCisgICAgICAgICAgICAgIEdzdE9zc1NpbmsKKyAgICAgICAgICAgIEdzdEphY2tBdWRpb1NpbmsKKyAgICAgICAgICAgIEdzdFB1bHNlU2luaworICAgICAgICAgIEdzdENBQ0FTaW5rCisgICAgICAgICAgR3N0RHluVURQU2luaworICAgICAgICAgIEdzdE11bHRpRmlsZVNpbmsKKyAgICAgICAgICBHc3RNdWx0aVVEUFNpbmsKKyAgICAgICAgICAgIEdzdFVEUFNpbmsKKyAgICAgICAgICBHc3RTaG91dDJzZW5kCisgICAgICAgICAgR3N0U291cEh0dHBDbGllbnRTaW5rCisgICAgICAgICAgR3N0VGVzdAorICAgICAgICAgIEdzdFZpZGVvU2luaworICAgICAgICAgICAgR3N0QUFTaW5rCisgICAgICAgICAgICBHc3RHZGtQaXhidWZTaW5rCisgICAgICAgICAgICBHc3RWNGwyU2luaworICAgICAgICBHc3RCYXNlU3JjCisgICAgICAgICAgR3N0RFRNRlNyYworICAgICAgICAgIEdzdFB1c2hTcmMKKyAgICAgICAgICAgIEdzdEF1ZGlvQmFzZVNyYworICAgICAgICAgICAgICBHc3RBdWRpb1NyYworICAgICAgICAgICAgICAgIEdzdE9zczRTb3VyY2UKKyAgICAgICAgICAgICAgICBHc3RPc3NTcmMKKyAgICAgICAgICAgICAgICBHc3RQdWxzZVNyYworICAgICAgICAgICAgICBHc3RKYWNrQXVkaW9TcmMKKyAgICAgICAgICAgIEdzdERWMTM5NFNyYworICAgICAgICAgICAgR3N0SERWMTM5NFNyYworICAgICAgICAgICAgR3N0TXVsdGlGaWxlU3JjCisgICAgICAgICAgICBHc3RTb3VwSFRUUFNyYworICAgICAgICAgICAgR3N0VURQU3JjCisgICAgICAgICAgICBHc3RWNGwyU3JjCisgICAgICAgICAgICBHc3RYSW1hZ2VTcmMKKyAgICAgICAgICBHc3RSVFBEVE1GU3JjCisgICAgICAgICAgR3N0U3BsaXRGaWxlU3JjCisgICAgICAgIEdzdEJhc2VUcmFuc2Zvcm0KKyAgICAgICAgICBHc3RBdWRpb0ZpbHRlcgorICAgICAgICAgICAgR3N0QXVkaW9BbXBsaWZ5CisgICAgICAgICAgICBHc3RBdWRpb0R5bmFtaWMKKyAgICAgICAgICAgIEdzdEF1ZGlvRWNobworICAgICAgICAgICAgR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXIKKyAgICAgICAgICAgICAgR3N0QXVkaW9GSVJGaWx0ZXIKKyAgICAgICAgICAgICAgR3N0QXVkaW9XU2luY0JhbmQKKyAgICAgICAgICAgICAgR3N0QXVkaW9XU2luY0xpbWl0CisgICAgICAgICAgICBHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlcgorICAgICAgICAgICAgICBHc3RBdWRpb0NoZWJCYW5kCisgICAgICAgICAgICAgIEdzdEF1ZGlvQ2hlYkxpbWl0CisgICAgICAgICAgICAgIEdzdEF1ZGlvSUlSRmlsdGVyCisgICAgICAgICAgICBHc3RBdWRpb0ludmVydAorICAgICAgICAgICAgR3N0QXVkaW9LYXJhb2tlCisgICAgICAgICAgICBHc3RJaXJFcXVhbGl6ZXIKKyAgICAgICAgICAgICAgR3N0SWlyRXF1YWxpemVyMTBCYW5kcworICAgICAgICAgICAgICBHc3RJaXJFcXVhbGl6ZXIzQmFuZHMKKyAgICAgICAgICAgICAgR3N0SWlyRXF1YWxpemVyTkJhbmRzCisgICAgICAgICAgICBHc3RTcGVjdHJ1bQorICAgICAgICAgIEdzdEF1ZGlvUGFub3JhbWEKKyAgICAgICAgICBHc3RCcmVha015RGF0YQorICAgICAgICAgIEdzdENhcHNTZXR0ZXIKKyAgICAgICAgICBHc3RDcHVSZXBvcnQKKyAgICAgICAgICBHc3RMZXZlbAorICAgICAgICAgIEdzdE5hdlNlZWsKKyAgICAgICAgICBHc3RQcm9ncmVzc1JlcG9ydAorICAgICAgICAgIEdzdFJnQW5hbHlzaXMKKyAgICAgICAgICBHc3RSZ0xpbWl0ZXIKKyAgICAgICAgICBHc3RTY2FsZXRlbXBvCisgICAgICAgICAgR3N0VGFnSW5qZWN0CisgICAgICAgICAgR3N0VmlkZW9GaWx0ZXIKKyAgICAgICAgICAgIEdzdEFnaW5nVFYKKyAgICAgICAgICAgIEdzdEFscGhhCisgICAgICAgICAgICBHc3RBbHBoYUNvbG9yCisgICAgICAgICAgICBHc3RDYWlyb092ZXJsYXkKKyAgICAgICAgICAgIEdzdERpY2VUVgorICAgICAgICAgICAgR3N0RWRnZVRWCisgICAgICAgICAgICBHc3RHYW1tYQorICAgICAgICAgICAgR3N0R2RrUGl4YnVmT3ZlcmxheQorICAgICAgICAgICAgR3N0TmF2aWdhdGlvbnRlc3QKKyAgICAgICAgICAgIEdzdE9wVFYKKyAgICAgICAgICAgIEdzdFF1YXJrVFYKKyAgICAgICAgICAgIEdzdFJhZGlvYWNUVgorICAgICAgICAgICAgR3N0UmV2VFYKKyAgICAgICAgICAgIEdzdFJpcHBsZVRWCisgICAgICAgICAgICBHc3RTTVBURUFscGhhCisgICAgICAgICAgICBHc3RTaGFnYWRlbGljVFYKKyAgICAgICAgICAgIEdzdFN0cmVha1RWCisgICAgICAgICAgICBHc3RWZXJ0aWdvVFYKKyAgICAgICAgICAgIEdzdFZpZGVvQmFsYW5jZQorICAgICAgICAgICAgR3N0VmlkZW9Cb3gKKyAgICAgICAgICAgIEdzdFZpZGVvQ3JvcAorICAgICAgICAgICAgR3N0VmlkZW9GbGlwCisgICAgICAgICAgICBHc3RWaWRlb01lZGlhbgorICAgICAgICAgICAgR3N0V2FycFRWCisgICAgICAgIEdzdEJpbgorICAgICAgICAgIEdzdEFzcGVjdFJhdGlvQ3JvcAorICAgICAgICAgIEdzdEF1dG9EZXRlY3QKKyAgICAgICAgICAgIEdzdEF1dG9BdWRpb1NpbmsKKyAgICAgICAgICAgIEdzdEF1dG9BdWRpb1NyYworICAgICAgICAgICAgR3N0QXV0b1ZpZGVvU2luaworICAgICAgICAgICAgR3N0QXV0b1ZpZGVvU3JjCisgICAgICAgICAgR3N0UGlwZWxpbmUKKyAgICAgICAgICAgIEdzdFFUTW9vdlJlY292ZXIKKyAgICAgICAgICBHc3RQdXNoRmlsZVNyYworICAgICAgICAgIEdzdFJUU1BTcmMKKyAgICAgICAgICBHc3RSZ1ZvbHVtZQorICAgICAgICAgIEdzdFJ0cEJpbgorICAgICAgICAgIEdzdFNwbGl0TXV4U2luaworICAgICAgICAgIEdzdFNwbGl0TXV4U3JjCisgICAgICAgIEdzdEN1dHRlcgorICAgICAgICBHc3REVkRlYworICAgICAgICBHc3REVkRlbXV4CisgICAgICAgIEdzdERlaW50ZXJsYWNlCisgICAgICAgIEdzdERlaW50ZXJsZWF2ZQorICAgICAgICBHc3RGbGFjVGFnCisgICAgICAgIEdzdEZsdkRlbXV4CisgICAgICAgIEdzdEZseERlYworICAgICAgICBHc3RHZGtQaXhidWZEZWMKKyAgICAgICAgR3N0SUNZRGVtdXgKKyAgICAgICAgR3N0SVNNTE11eAorICAgICAgICBHc3RJbWFnZUZyZWV6ZQorICAgICAgICBHc3RJbnRlcmxlYXZlCisgICAgICAgIEdzdE1KMk11eAorICAgICAgICBHc3RNUDRNdXgKKyAgICAgICAgR3N0TWF0cm9za2FEZW11eAorICAgICAgICBHc3RNYXRyb3NrYU11eAorICAgICAgICAgIEdzdFdlYk1NdXgKKyAgICAgICAgR3N0TWF0cm9za2FQYXJzZQorICAgICAgICBHc3RNdWx0aXBhcnREZW11eAorICAgICAgICBHc3RNdWx0aXBhcnRNdXgKKyAgICAgICAgR3N0UVREZW11eAorICAgICAgICBHc3RRVE11eAorICAgICAgICBHc3RSVFBCYXNlRGVwYXlsb2FkCisgICAgICAgICAgR3N0UlRQQlZEZXBheQorICAgICAgICAgIEdzdFJUUERWRGVwYXkKKyAgICAgICAgICBHc3RSVFBHU01EZXBheQorICAgICAgICAgIEdzdFJUUE9wdXNEZXBheQorICAgICAgICAgIEdzdFJUUFNpcmVuRGVwYXkKKyAgICAgICAgICBHc3RSVFBpTEJDRGVwYXkKKyAgICAgICAgICBHc3RSdHBBQzNEZXBheQorICAgICAgICAgIEdzdFJ0cEFNUkRlcGF5CisgICAgICAgICAgR3N0UnRwQ0VMVERlcGF5CisgICAgICAgICAgR3N0UnRwRFRNRkRlcGF5CisgICAgICAgICAgR3N0UnRwRzcyMkRlcGF5CisgICAgICAgICAgR3N0UnRwRzcyM0RlcGF5CisgICAgICAgICAgR3N0UnRwRzcyNkRlcGF5CisgICAgICAgICAgR3N0UnRwRzcyOURlcGF5CisgICAgICAgICAgR3N0UnRwR1NURGVwYXkKKyAgICAgICAgICBHc3RSdHBIMjYxRGVwYXkKKyAgICAgICAgICBHc3RSdHBIMjYzRGVwYXkKKyAgICAgICAgICBHc3RSdHBIMjYzUERlcGF5CisgICAgICAgICAgR3N0UnRwSDI2NERlcGF5CisgICAgICAgICAgR3N0UnRwSDI2NURlcGF5CisgICAgICAgICAgR3N0UnRwSjJLRGVwYXkKKyAgICAgICAgICBHc3RSdHBKUEVHRGVwYXkKKyAgICAgICAgICBHc3RSdHBLbHZEZXBheQorICAgICAgICAgIEdzdFJ0cEwxNkRlcGF5CisgICAgICAgICAgR3N0UnRwTDI0RGVwYXkKKyAgICAgICAgICBHc3RSdHBMOERlcGF5CisgICAgICAgICAgR3N0UnRwTVAxU0RlcGF5CisgICAgICAgICAgR3N0UnRwTVAyVERlcGF5CisgICAgICAgICAgR3N0UnRwTVA0QURlcGF5CisgICAgICAgICAgR3N0UnRwTVA0R0RlcGF5CisgICAgICAgICAgR3N0UnRwTVA0VkRlcGF5CisgICAgICAgICAgR3N0UnRwTVBBRGVwYXkKKyAgICAgICAgICBHc3RSdHBNUEFSb2J1c3REZXBheQorICAgICAgICAgIEdzdFJ0cE1QVkRlcGF5CisgICAgICAgICAgR3N0UnRwUGNtYURlcGF5CisgICAgICAgICAgR3N0UnRwUGNtdURlcGF5CisgICAgICAgICAgR3N0UnRwUUNFTFBEZXBheQorICAgICAgICAgIEdzdFJ0cFFETTJEZXBheQorICAgICAgICAgIEdzdFJ0cFNQRUVYRGVwYXkKKyAgICAgICAgICBHc3RSdHBTVjNWRGVwYXkKKyAgICAgICAgICBHc3RSdHBTYmNEZXBheQorICAgICAgICAgIEdzdFJ0cFRoZW9yYURlcGF5CisgICAgICAgICAgR3N0UnRwVlA4RGVwYXkKKyAgICAgICAgICBHc3RSdHBWUDlEZXBheQorICAgICAgICAgIEdzdFJ0cFZSYXdEZXBheQorICAgICAgICAgIEdzdFJ0cFZvcmJpc0RlcGF5CisgICAgICAgICAgR3N0UnRwWFFURGVwYXkKKyAgICAgICAgR3N0UlRQQmFzZVBheWxvYWQKKyAgICAgICAgICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkCisgICAgICAgICAgICBHc3RSVFBCVlBheQorICAgICAgICAgICAgR3N0UlRQSUxCQ1BheQorICAgICAgICAgICAgR3N0UlRQU2lyZW5QYXkKKyAgICAgICAgICAgIEdzdFJ0cEc3MjJQYXkKKyAgICAgICAgICAgIEdzdFJ0cEc3MjZQYXkKKyAgICAgICAgICAgIEdzdFJ0cEwxNlBheQorICAgICAgICAgICAgR3N0UnRwTDI0UGF5CisgICAgICAgICAgICBHc3RSdHBMOFBheQorICAgICAgICAgICAgR3N0UnRwUGNtYVBheQorICAgICAgICAgICAgR3N0UnRwUGNtdVBheQorICAgICAgICAgIEdzdFJUUERWUGF5CisgICAgICAgICAgR3N0UlRQRzcyM1BheQorICAgICAgICAgIEdzdFJUUEc3MjlQYXkKKyAgICAgICAgICBHc3RSVFBHU01QYXkKKyAgICAgICAgICBHc3RSVFBNUDJUUGF5CisgICAgICAgICAgR3N0UlRQTVBWUGF5CisgICAgICAgICAgR3N0UnRwQUMzUGF5CisgICAgICAgICAgR3N0UnRwQU1SUGF5CisgICAgICAgICAgR3N0UnRwQ0VMVFBheQorICAgICAgICAgIEdzdFJ0cEdTVFBheQorICAgICAgICAgIEdzdFJ0cEgyNjFQYXkKKyAgICAgICAgICBHc3RSdHBIMjYzUFBheQorICAgICAgICAgIEdzdFJ0cEgyNjNQYXkKKyAgICAgICAgICBHc3RSdHBIMjY0UGF5CisgICAgICAgICAgR3N0UnRwSDI2NVBheQorICAgICAgICAgIEdzdFJ0cEoyS1BheQorICAgICAgICAgIEdzdFJ0cEpQRUdQYXkKKyAgICAgICAgICBHc3RSdHBLbHZQYXkKKyAgICAgICAgICBHc3RSdHBNUDRBUGF5CisgICAgICAgICAgR3N0UnRwTVA0R1BheQorICAgICAgICAgIEdzdFJ0cE1QNFZQYXkKKyAgICAgICAgICBHc3RSdHBNUEFQYXkKKyAgICAgICAgICBHc3RSdHBPUFVTUGF5CisgICAgICAgICAgR3N0UnRwU0JDUGF5CisgICAgICAgICAgR3N0UnRwU1BFRVhQYXkKKyAgICAgICAgICBHc3RSdHBUaGVvcmFQYXkKKyAgICAgICAgICBHc3RSdHBWUDhQYXkKKyAgICAgICAgICBHc3RSdHBWUDlQYXkKKyAgICAgICAgICBHc3RSdHBWUmF3UGF5CisgICAgICAgICAgR3N0UnRwVm9yYmlzUGF5CisgICAgICAgIEdzdFJUUERlYworICAgICAgICBHc3RSVFBNdXgKKyAgICAgICAgICBHc3RSVFBEVE1GTXV4CisgICAgICAgIEdzdFJUUFJ0eFF1ZXVlCisgICAgICAgIEdzdFJuZEJ1ZmZlclNpemUKKyAgICAgICAgR3N0UnRwSml0dGVyQnVmZmVyCisgICAgICAgIEdzdFJ0cFB0RGVtdXgKKyAgICAgICAgR3N0UnRwUnR4UmVjZWl2ZQorICAgICAgICBHc3RSdHBSdHhTZW5kCisgICAgICAgIEdzdFJ0cFNlc3Npb24KKyAgICAgICAgR3N0UnRwU3NyY0RlbXV4CisgICAgICAgIEdzdFJ0cFN0cmVhbVBheQorICAgICAgICBHc3RTTVBURQorICAgICAgICBHc3RTaGFwZVdpcGUKKyAgICAgICAgR3N0VGFnRGVtdXgKKyAgICAgICAgICBHc3RBcGVEZW11eAorICAgICAgICAgIEdzdElEM0RlbXV4CisgICAgICAgIEdzdFRhZ011eAorICAgICAgICAgIEdzdEFwZXYyTXV4CisgICAgICAgICAgR3N0SWQzdjJNdXgKKyAgICAgICAgR3N0VjRsMlJhZGlvCisgICAgICAgIEdzdFZpZGVvRGVjb2RlcgorICAgICAgICAgIEdzdEpwZWdEZWMKKyAgICAgICAgICBHc3RQbmdEZWMKKyAgICAgICAgICBHc3RWUFhEZWMKKyAgICAgICAgICAgIEdzdFZQOERlYworICAgICAgICAgICAgR3N0VlA5RGVjCisgICAgICAgIEdzdFZpZGVvRW5jb2RlcgorICAgICAgICAgIEdzdEpwZWdFbmMKKyAgICAgICAgICBHc3RQbmdFbmMKKyAgICAgICAgICBHc3RWUFhFbmMKKyAgICAgICAgICAgIEdzdFZQOEVuYworICAgICAgICAgICAgR3N0VlA5RW5jCisgICAgICAgICAgR3N0WTRtRW5jb2RlCisgICAgICAgIEdzdFZpZGVvTWl4ZXIyCisgICAgICAgIEdzdFdhdkVuYworICAgICAgICBHc3RXYXZQYXJzZQorICAgICAgR3N0UGFkCisgICAgICAgIEdzdEFnZ3JlZ2F0b3JQYWQKKyAgICAgICAgICBHc3RGbHZNdXhQYWQKKyAgICAgICAgR3N0SW50ZXJsZWF2ZVBhZAorICAgICAgICBHc3RWaWRlb01peGVyMlBhZAorICAgICAgR3N0UGFkVGVtcGxhdGUKKyAgICAgIEdzdFBsdWdpbgorICAgICAgR3N0UGx1Z2luRmVhdHVyZQorICAgICAgICBHc3REZXZpY2VQcm92aWRlckZhY3RvcnkKKyAgICAgICAgR3N0RHluYW1pY1R5cGVGYWN0b3J5CisgICAgICAgIEdzdEVsZW1lbnRGYWN0b3J5CisgICAgICAgIEdzdFRyYWNlckZhY3RvcnkKKyAgICAgICAgR3N0VHlwZUZpbmRGYWN0b3J5CisgICAgICBHc3RSZWdpc3RyeQorICAgICAgR3N0VGFzaworICAgICAgR3N0VGFza1Bvb2wKKyAgR1Jlc29sdmVyCisgIEdTb2NrZXQKKyAgR1NvY2tldEFkZHJlc3MKKyAgICBHSW5ldFNvY2tldEFkZHJlc3MKKyAgICAgIEdQcm94eUFkZHJlc3MKKyAgR1NvY2tldENsaWVudAorICBHU29ja2V0Q29udHJvbE1lc3NhZ2UKKyAgICBHc3RJUFBrdGluZm9NZXNzYWdlCisgICAgR3N0SVBWNlBrdGluZm9NZXNzYWdlCisgIEdTb2NrZXRMaXN0ZW5lcgorICAgIEdTb2NrZXRTZXJ2aWNlCisgIEdUbHNDZXJ0aWZpY2F0ZQorICBHVGxzRGF0YWJhc2UKKyAgR1Rsc0ludGVyYWN0aW9uCisgIEdka1BpeGJ1ZgorICBHc3RDb2xvckJhbGFuY2VDaGFubmVsCisgIEdzdFR1bmVyQ2hhbm5lbAorICBHc3RUdW5lck5vcm0KKyAgUlRQU2Vzc2lvbgorICBTb3VwU2Vzc2lvbgorR0ludGVyZmFjZQorICBHRGF0YWdyYW1CYXNlZAorICBHSWNvbgorICBHSW5pdGFibGUKKyAgR0xvYWRhYmxlSWNvbgorICBHUHJveHlSZXNvbHZlcgorICBHU29ja2V0Q29ubmVjdGFibGUKKyAgR1R5cGVQbHVnaW4KKyAgR3N0Q2hpbGRQcm94eQorICBHc3RDb2xvckJhbGFuY2UKKyAgR3N0UHJlc2V0CisgIEdzdFN0cmVhbVZvbHVtZQorICBHc3RUYWdTZXR0ZXIKKyAgR3N0VGFnWG1wV3JpdGVyCisgIEdzdFRvY1NldHRlcgorICBHc3RUdW5lcgorICBHc3RVUklIYW5kbGVyCisgIEdzdFZpZGVvRGlyZWN0aW9uCisgIEdzdFZpZGVvT3JpZW50YXRpb24KZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlcyBiL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuaW50ZXJmYWNlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzZlY2E1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5pbnRlcmZhY2VzCkBAIC0wLDAgKzEsMTE0IEBACitHSW5ldFNvY2tldEFkZHJlc3MgR1NvY2tldENvbm5lY3RhYmxlCitHUHJveHlBZGRyZXNzIEdTb2NrZXRDb25uZWN0YWJsZQorR1NvY2tldCBHSW5pdGFibGUKK0dTb2NrZXQgR0luaXRhYmxlIEdEYXRhZ3JhbUJhc2VkCitHU29ja2V0QWRkcmVzcyBHU29ja2V0Q29ubmVjdGFibGUKK0dka1BpeGJ1ZiBHSWNvbgorR2RrUGl4YnVmIEdJY29uIEdMb2FkYWJsZUljb24KK0dzdDNHUFBNdXggR3N0VGFnU2V0dGVyIEdzdFRhZ1htcFdyaXRlcgorR3N0M0dQUE11eCBHc3RUYWdTZXR0ZXIgR3N0VGFnWG1wV3JpdGVyIEdzdFByZXNldAorR3N0QUxhd0VuYyBHc3RQcmVzZXQKK0dzdEFwZXYyTXV4IEdzdFRhZ1NldHRlcgorR3N0QXNwZWN0UmF0aW9Dcm9wIEdzdENoaWxkUHJveHkKK0dzdEF1ZGlvRW5jb2RlciBHc3RQcmVzZXQKK0dzdEF1dG9BdWRpb1NpbmsgR3N0Q2hpbGRQcm94eQorR3N0QXV0b0F1ZGlvU3JjIEdzdENoaWxkUHJveHkKK0dzdEF1dG9EZXRlY3QgR3N0Q2hpbGRQcm94eQorR3N0QXV0b1ZpZGVvU2luayBHc3RDaGlsZFByb3h5CitHc3RBdXRvVmlkZW9TcmMgR3N0Q2hpbGRQcm94eQorR3N0QXZpTXV4IEdzdFRhZ1NldHRlcgorR3N0QmluIEdzdENoaWxkUHJveHkKK0dzdERWMTM5NFNyYyBHc3RVUklIYW5kbGVyCitHc3REVjEzOTRTcmMgR3N0VVJJSGFuZGxlciBHc3RQcm9wZXJ0eVByb2JlCitHc3REZWludGVybGFjZSBHc3RDaGlsZFByb3h5CitHc3RGbGFjRW5jIEdzdFByZXNldCBHc3RUYWdTZXR0ZXIKK0dzdEZsYWNFbmMgR3N0UHJlc2V0IEdzdFRhZ1NldHRlciBHc3RUb2NTZXR0ZXIKK0dzdEZsYWNFbmMgR3N0VGFnU2V0dGVyIEdzdFByZXNldAorR3N0RmxhY1RhZyBHc3RUYWdTZXR0ZXIKK0dzdEZsdk11eCBHc3RUYWdTZXR0ZXIKK0dzdEdDb25mQXVkaW9TaW5rIEdzdENoaWxkUHJveHkKK0dzdEdDb25mQXVkaW9TcmMgR3N0Q2hpbGRQcm94eQorR3N0R0NvbmZWaWRlb1NpbmsgR3N0Q2hpbGRQcm94eQorR3N0R0NvbmZWaWRlb1NyYyBHc3RDaGlsZFByb3h5CitHc3RHUFBNdXggR3N0VGFnU2V0dGVyIEdzdFRhZ1htcFdyaXRlcgorR3N0SERWMTM5NFNyYyBHc3RVUklIYW5kbGVyCitHc3RIRFYxMzk0U3JjIEdzdFVSSUhhbmRsZXIgR3N0UHJvcGVydHlQcm9iZQorR3N0SGFsQXVkaW9TaW5rIEdzdENoaWxkUHJveHkKK0dzdEhhbEF1ZGlvU3JjIEdzdENoaWxkUHJveHkKK0dzdElTTUxNdXggR3N0VGFnU2V0dGVyIEdzdFRhZ1htcFdyaXRlcgorR3N0SVNNTE11eCBHc3RUYWdTZXR0ZXIgR3N0VGFnWG1wV3JpdGVyIEdzdFByZXNldAorR3N0SWQzdjJNdXggR3N0VGFnU2V0dGVyCitHc3RJaXJFcXVhbGl6ZXIgR3N0Q2hpbGRQcm94eQorR3N0SWlyRXF1YWxpemVyIEdzdENoaWxkUHJveHkgR3N0UHJlc2V0CitHc3RJaXJFcXVhbGl6ZXIxMEJhbmRzIEdzdENoaWxkUHJveHkgR3N0UHJlc2V0CitHc3RJaXJFcXVhbGl6ZXIzQmFuZHMgR3N0Q2hpbGRQcm94eSBHc3RQcmVzZXQKK0dzdElpckVxdWFsaXplck5CYW5kcyBHc3RDaGlsZFByb3h5CitHc3RJaXJFcXVhbGl6ZXJOQmFuZHMgR3N0Q2hpbGRQcm94eSBHc3RQcmVzZXQKK0dzdEpwZWdFbmMgR3N0UHJlc2V0CitHc3RMYW1lTVAzRW5jIEdzdFByZXNldAorR3N0TUoyTXV4IEdzdFRhZ1NldHRlciBHc3RUYWdYbXBXcml0ZXIKK0dzdE1KMk11eCBHc3RUYWdTZXR0ZXIgR3N0VGFnWG1wV3JpdGVyIEdzdFByZXNldAorR3N0TVA0TXV4IEdzdFRhZ1NldHRlciBHc3RUYWdYbXBXcml0ZXIKK0dzdE1QNE11eCBHc3RUYWdTZXR0ZXIgR3N0VGFnWG1wV3JpdGVyIEdzdFByZXNldAorR3N0TWF0cm9za2FNdXggR3N0VGFnU2V0dGVyCitHc3RNYXRyb3NrYU11eCBHc3RUYWdTZXR0ZXIgR3N0VG9jU2V0dGVyCitHc3RNdUxhd0VuYyBHc3RQcmVzZXQKK0dzdE9zczRNaXhlciBHc3RJbXBsZW1lbnRzSW50ZXJmYWNlIEdzdE1peGVyIEdzdFByb3BlcnR5UHJvYmUKK0dzdE9zczRTaW5rIEdzdFN0cmVhbVZvbHVtZQorR3N0T3NzNFNpbmsgR3N0U3RyZWFtVm9sdW1lIEdzdFByb3BlcnR5UHJvYmUKK0dzdE9zczRTb3VyY2UgR3N0SW1wbGVtZW50c0ludGVyZmFjZSBHc3RNaXhlciBHc3RQcm9wZXJ0eVByb2JlCitHc3RPc3NNaXhlckVsZW1lbnQgR3N0SW1wbGVtZW50c0ludGVyZmFjZSBHc3RNaXhlcgorR3N0T3NzU3JjIEdzdEltcGxlbWVudHNJbnRlcmZhY2UgR3N0TWl4ZXIKK0dzdFBpcGVsaW5lIEdzdENoaWxkUHJveHkKK0dzdFBuZ0VuYyBHc3RQcmVzZXQKK0dzdFB1bHNlQXVkaW9TaW5rIEdzdENoaWxkUHJveHkKK0dzdFB1bHNlTWl4ZXIgR3N0SW1wbGVtZW50c0ludGVyZmFjZSBHc3RNaXhlciBHc3RQcm9wZXJ0eVByb2JlCitHc3RQdWxzZU1peGVyIEdzdE1peGVyCitHc3RQdWxzZVNpbmsgR3N0U3RyZWFtVm9sdW1lCitHc3RQdWxzZVNpbmsgR3N0U3RyZWFtVm9sdW1lIEdzdEltcGxlbWVudHNJbnRlcmZhY2UgR3N0UHJvcGVydHlQcm9iZQorR3N0UHVsc2VTcmMgR3N0SW1wbGVtZW50c0ludGVyZmFjZSBHc3RNaXhlciBHc3RQcm9wZXJ0eVByb2JlCitHc3RQdWxzZVNyYyBHc3RNaXhlciBHc3RTdHJlYW1Wb2x1bWUKK0dzdFB1bHNlU3JjIEdzdFN0cmVhbVZvbHVtZQorR3N0UHVsc2VTcmMgR3N0U3RyZWFtVm9sdW1lIEdzdEltcGxlbWVudHNJbnRlcmZhY2UgR3N0TWl4ZXIgR3N0UHJvcGVydHlQcm9iZQorR3N0UHVzaEZpbGVTcmMgR3N0Q2hpbGRQcm94eSBHc3RVUklIYW5kbGVyCitHc3RRVE1vb3ZSZWNvdmVyIEdzdENoaWxkUHJveHkKK0dzdFFUTXV4IEdzdFRhZ1NldHRlciBHc3RUYWdYbXBXcml0ZXIKK0dzdFFUTXV4IEdzdFRhZ1NldHRlciBHc3RUYWdYbXBXcml0ZXIgR3N0UHJlc2V0CitHc3RSVFNQU3JjIEdzdENoaWxkUHJveHkgR3N0VVJJSGFuZGxlcgorR3N0UmdWb2x1bWUgR3N0Q2hpbGRQcm94eQorR3N0UnRwQmluIEdzdENoaWxkUHJveHkKK0dzdFNob3V0MnNlbmQgR3N0VGFnU2V0dGVyCitHc3RTb3VwSFRUUFNyYyBHc3RVUklIYW5kbGVyCitHc3RTcGVleEVuYyBHc3RQcmVzZXQgR3N0VGFnU2V0dGVyCitHc3RTcGVleEVuYyBHc3RUYWdTZXR0ZXIgR3N0UHJlc2V0CitHc3RTcGxpdEZpbGVTcmMgR3N0VVJJSGFuZGxlcgorR3N0U3BsaXRNdXhTaW5rIEdzdENoaWxkUHJveHkKK0dzdFNwbGl0TXV4U3JjIEdzdENoaWxkUHJveHkgR3N0VVJJSGFuZGxlcgorR3N0U3dpdGNoU2luayBHc3RDaGlsZFByb3h5CitHc3RTd2l0Y2hTcmMgR3N0Q2hpbGRQcm94eQorR3N0VGFnTGliTXV4IEdzdFRhZ1NldHRlcgorR3N0VGFnTXV4IEdzdFRhZ1NldHRlcgorR3N0VHdvTGFtZSBHc3RQcmVzZXQKK0dzdFVEUFNpbmsgR3N0VVJJSGFuZGxlcgorR3N0VURQU3JjIEdzdFVSSUhhbmRsZXIKK0dzdFY0bDJSYWRpbyBHc3RVUklIYW5kbGVyIEdzdEltcGxlbWVudHNJbnRlcmZhY2UgR3N0VHVuZXIgR3N0UHJvcGVydHlQcm9iZQorR3N0VjRsMlJhZGlvIEdzdFVSSUhhbmRsZXIgR3N0VHVuZXIKK0dzdFY0bDJTaW5rIEdzdEltcGxlbWVudHNJbnRlcmZhY2UgR3N0WE92ZXJsYXkgR3N0TmF2aWdhdGlvbiBHc3RDb2xvckJhbGFuY2UgR3N0VmlkZW9PcmllbnRhdGlvbiBHc3RQcm9wZXJ0eVByb2JlCitHc3RWNGwyU2luayBHc3RUdW5lciBHc3RDb2xvckJhbGFuY2UgR3N0VmlkZW9PcmllbnRhdGlvbgorR3N0VjRsMlNpbmsgR3N0VHVuZXIgR3N0VmlkZW9PdmVybGF5IEdzdE5hdmlnYXRpb24gR3N0Q29sb3JCYWxhbmNlIEdzdFZpZGVvT3JpZW50YXRpb24KK0dzdFY0bDJTcmMgR3N0VVJJSGFuZGxlciBHc3RJbXBsZW1lbnRzSW50ZXJmYWNlIEdzdFR1bmVyIEdzdENvbG9yQmFsYW5jZSBHc3RWaWRlb09yaWVudGF0aW9uIEdzdFByb3BlcnR5UHJvYmUKK0dzdFY0bDJTcmMgR3N0VVJJSGFuZGxlciBHc3RUdW5lciBHc3RDb2xvckJhbGFuY2UgR3N0VmlkZW9PcmllbnRhdGlvbgorR3N0VlA4RW5jIEdzdFByZXNldCBHc3RUYWdTZXR0ZXIKK0dzdFZQOUVuYyBHc3RQcmVzZXQgR3N0VGFnU2V0dGVyCitHc3RWUFhFbmMgR3N0UHJlc2V0IEdzdFRhZ1NldHRlcgorR3N0VmlkZW9CYWxhbmNlIEdzdENvbG9yQmFsYW5jZQorR3N0VmlkZW9CYWxhbmNlIEdzdEltcGxlbWVudHNJbnRlcmZhY2UgR3N0Q29sb3JCYWxhbmNlCitHc3RWaWRlb0VuY29kZXIgR3N0UHJlc2V0CitHc3RWaWRlb0ZsaXAgR3N0VmlkZW9EaXJlY3Rpb24KK0dzdFZpZGVvTWl4ZXIgR3N0Q2hpbGRQcm94eQorR3N0VmlkZW9NaXhlcjIgR3N0Q2hpbGRQcm94eQorR3N0V2F2RW5jIEdzdFRhZ1NldHRlciBHc3RUb2NTZXR0ZXIKK0dzdFdhdnBhY2tFbmMgR3N0UHJlc2V0CitHc3RXZWJNTXV4IEdzdFRhZ1NldHRlcgorR3N0V2ViTU11eCBHc3RUYWdTZXR0ZXIgR3N0VG9jU2V0dGVyCitHc3RZNG1FbmNvZGUgR3N0UHJlc2V0CmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXMgYi9kb2NzL3BsdWdpbnMvZ3N0LXBsdWdpbnMtZ29vZC1wbHVnaW5zLnByZXJlcXVpc2l0ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhZmExNQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMucHJlcmVxdWlzaXRlcwpAQCAtMCwwICsxLDE4IEBACitHRGF0YWdyYW1CYXNlZCBHT2JqZWN0CitHSWNvbiBHT2JqZWN0CitHSW5pdGFibGUgR09iamVjdAorR0xvYWRhYmxlSWNvbiBHSWNvbiBHT2JqZWN0CitHUHJveHlSZXNvbHZlciBHT2JqZWN0CitHU29ja2V0Q29ubmVjdGFibGUgR09iamVjdAorR3N0Q2hpbGRQcm94eSBHT2JqZWN0CitHc3RDaGlsZFByb3h5IEdzdE9iamVjdAorR3N0Q29sb3JCYWxhbmNlIEdzdEltcGxlbWVudHNJbnRlcmZhY2UgR3N0RWxlbWVudAorR3N0SW1wbGVtZW50c0ludGVyZmFjZSBHc3RFbGVtZW50CitHc3RNaXhlciBHc3RJbXBsZW1lbnRzSW50ZXJmYWNlIEdzdEVsZW1lbnQKK0dzdFN0cmVhbVZvbHVtZSBHT2JqZWN0CitHc3RUYWdTZXR0ZXIgR3N0RWxlbWVudAorR3N0VGFnWG1wV3JpdGVyIEdzdEVsZW1lbnQKK0dzdFRvY1NldHRlciBHc3RFbGVtZW50CitHc3RUdW5lciBHc3RJbXBsZW1lbnRzSW50ZXJmYWNlIEdzdEVsZW1lbnQKK0dzdFZpZGVvT3JpZW50YXRpb24gR3N0SW1wbGVtZW50c0ludGVyZmFjZSBHc3RFbGVtZW50CitHc3RYT3ZlcmxheSBHc3RJbXBsZW1lbnRzSW50ZXJmYWNlIEdzdEVsZW1lbnQKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFscyBiL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMuc2lnbmFscwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGM2ZmJiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy5zaWduYWxzCkBAIC0wLDAgKzEsNzAyIEBACis8U0lHTkFMPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjphZGQ8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmxhPC9GTEFHUz4KK0dzdE11bHRpVURQU2luayAqZ3N0bXVsdGl1ZHBzaW5rCitnY2hhciAqYXJnMQorZ2ludCAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RNdWx0aVVEUFNpbms6OmNsZWFyPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sYTwvRkxBR1M+CitHc3RNdWx0aVVEUFNpbmsgKmdzdG11bHRpdWRwc2luaworPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RNdWx0aVVEUFNpbms6OmNsaWVudC1hZGRlZDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RNdWx0aVVEUFNpbmsgKmdzdG11bHRpdWRwc2luaworZ2NoYXIgKmFyZzEKK2dpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjpjbGllbnQtcmVtb3ZlZDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RNdWx0aVVEUFNpbmsgKmdzdG11bHRpdWRwc2luaworZ2NoYXIgKmFyZzEKK2dpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0TXVsdGlVRFBTaW5rOjpnZXQtc3RhdHM8L05BTUU+Cis8UkVUVVJOUz5Hc3RTdHJ1Y3R1cmUqPC9SRVRVUk5TPgorPEZMQUdTPmxhPC9GTEFHUz4KK0dzdE11bHRpVURQU2luayAqZ3N0bXVsdGl1ZHBzaW5rCitnY2hhciAqYXJnMQorZ2ludCAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RNdWx0aVVEUFNpbms6OnJlbW92ZTwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bGE8L0ZMQUdTPgorR3N0TXVsdGlVRFBTaW5rICpnc3RtdWx0aXVkcHNpbmsKK2djaGFyICphcmcxCitnaW50ICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdER5blVEUFNpbms6OmdldC1zdGF0czwvTkFNRT4KKzxSRVRVUk5TPkdzdFN0cnVjdHVyZSo8L1JFVFVSTlM+Cis8RkxBR1M+bGE8L0ZMQUdTPgorR3N0RHluVURQU2luayAqZ3N0ZHludWRwc2luaworZ2NoYXIgKmFyZzEKK2dpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0U2hvdXQyc2VuZDo6Y29ubmVjdGlvbi1wcm9ibGVtPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5jPC9GTEFHUz4KK0dzdFNob3V0MnNlbmQgKmdzdHNob3V0MnNlbmQKK2dpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0RFYxMzk0U3JjOjpmcmFtZS1kcm9wcGVkPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdERWMTM5NFNyYyAqZ3N0ZHYxMzk0c3JjCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJUUERlYzo6Y2xlYXItcHQtbWFwPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJUUERlYyAqZ3N0cnRwZGVjCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJUUERlYzo6cmVxdWVzdC1wdC1tYXA8L05BTUU+Cis8UkVUVVJOUz5Hc3RDYXBzKjwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJUUERlYyAqZ3N0cnRwZGVjCitndWludCAgYXJnMQorZ3VpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UlRQRGVjOjpvbi1ieWUtc3NyYzwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSVFBEZWMgKmdzdHJ0cGRlYworZ3VpbnQgIGFyZzEKK2d1aW50ICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJUUERlYzo6b24tYnllLXRpbWVvdXQ8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UlRQRGVjICpnc3RydHBkZWMKK2d1aW50ICBhcmcxCitndWludCAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSVFBEZWM6Om9uLW5ldy1zc3JjPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJUUERlYyAqZ3N0cnRwZGVjCitndWludCAgYXJnMQorZ3VpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UlRQRGVjOjpvbi1zc3JjLWNvbGxpc2lvbjwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSVFBEZWMgKmdzdHJ0cGRlYworZ3VpbnQgIGFyZzEKK2d1aW50ICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJUUERlYzo6b24tc3NyYy12YWxpZGF0ZWQ8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UlRQRGVjICpnc3RydHBkZWMKK2d1aW50ICBhcmcxCitndWludCAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSVFBEZWM6Om9uLXRpbWVvdXQ8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UlRQRGVjICpnc3RydHBkZWMKK2d1aW50ICBhcmcxCitndWludCAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RBdWRpb0ZJUkZpbHRlcjo6cmF0ZS1jaGFuZ2VkPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdEF1ZGlvRklSRmlsdGVyICpnc3RhdWRpb2ZpcmZpbHRlcgorZ2ludCAgYXJnMQorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RBdWRpb0lJUkZpbHRlcjo6cmF0ZS1jaGFuZ2VkPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdEF1ZGlvSUlSRmlsdGVyICpnc3RhdWRpb2lpcmZpbHRlcgorZ2ludCAgYXJnMQorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBCaW46OmNsZWFyLXB0LW1hcDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bGE8L0ZMQUdTPgorR3N0UnRwQmluICpnc3RydHBiaW4KKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpnZXQtaW50ZXJuYWwtc2Vzc2lvbjwvTkFNRT4KKzxSRVRVUk5TPlJUUFNlc3Npb24qPC9SRVRVUk5TPgorPEZMQUdTPmxhPC9GTEFHUz4KK0dzdFJ0cEJpbiAqZ3N0cnRwYmluCitndWludCAgYXJnMQorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBCaW46Om9uLWJ5ZS1zc3JjPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cEJpbiAqZ3N0cnRwYmluCitndWludCAgYXJnMQorZ3VpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpvbi1ieWUtdGltZW91dDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorZ3VpbnQgIGFyZzEKK2d1aW50ICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEJpbjo6b24tbmV3LXNzcmM8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwQmluICpnc3RydHBiaW4KK2d1aW50ICBhcmcxCitndWludCAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBCaW46Om9uLW5wdC1zdG9wPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cEJpbiAqZ3N0cnRwYmluCitndWludCAgYXJnMQorZ3VpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpvbi1zZW5kZXItdGltZW91dDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorZ3VpbnQgIGFyZzEKK2d1aW50ICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEJpbjo6b24tc3NyYy1hY3RpdmU8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwQmluICpnc3RydHBiaW4KK2d1aW50ICBhcmcxCitndWludCAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBCaW46Om9uLXNzcmMtY29sbGlzaW9uPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cEJpbiAqZ3N0cnRwYmluCitndWludCAgYXJnMQorZ3VpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpvbi1zc3JjLXNkZXM8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwQmluICpnc3RydHBiaW4KK2d1aW50ICBhcmcxCitndWludCAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBCaW46Om9uLXNzcmMtdmFsaWRhdGVkPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cEJpbiAqZ3N0cnRwYmluCitndWludCAgYXJnMQorZ3VpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpvbi10aW1lb3V0PC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cEJpbiAqZ3N0cnRwYmluCitndWludCAgYXJnMQorZ3VpbnQgIGFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpyZXF1ZXN0LXB0LW1hcDwvTkFNRT4KKzxSRVRVUk5TPkdzdENhcHMqPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwQmluICpnc3RydHBiaW4KK2d1aW50ICBhcmcxCitndWludCAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBCaW46OnJlc2V0LXN5bmM8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmxhPC9GTEFHUz4KK0dzdFJ0cEJpbiAqZ3N0cnRwYmluCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEJpbjo6cGF5bG9hZC10eXBlLWNoYW5nZTwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorZ3VpbnQgIGFyZzEKK2d1aW50ICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEJpbjo6bmV3LWppdHRlcmJ1ZmZlcjwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorR3N0RWxlbWVudCAqYXJnMQorZ3VpbnQgIGFyZzIKK2d1aW50ICBhcmczCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEJpbjo6cmVxdWVzdC1hdXgtcmVjZWl2ZXI8L05BTUU+Cis8UkVUVVJOUz5Hc3RFbGVtZW50KjwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cEJpbiAqZ3N0cnRwYmluCitndWludCAgYXJnMQorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBCaW46OnJlcXVlc3QtYXV4LXNlbmRlcjwvTkFNRT4KKzxSRVRVUk5TPkdzdEVsZW1lbnQqPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwQmluICpnc3RydHBiaW4KK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEJpbjo6cmVxdWVzdC1ydGNwLWRlY29kZXI8L05BTUU+Cis8UkVUVVJOUz5Hc3RFbGVtZW50KjwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cEJpbiAqZ3N0cnRwYmluCitndWludCAgYXJnMQorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBCaW46OnJlcXVlc3QtcnRjcC1lbmNvZGVyPC9OQU1FPgorPFJFVFVSTlM+R3N0RWxlbWVudCo8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpyZXF1ZXN0LXJ0cC1kZWNvZGVyPC9OQU1FPgorPFJFVFVSTlM+R3N0RWxlbWVudCo8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpyZXF1ZXN0LXJ0cC1lbmNvZGVyPC9OQU1FPgorPFJFVFVSTlM+R3N0RWxlbWVudCo8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpvbi1uZXctc2VuZGVyLXNzcmM8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwQmluICpnc3RydHBiaW4KK2d1aW50ICBhcmcxCitndWludCAgYXJnMgorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBCaW46Om9uLXNlbmRlci1zc3JjLWFjdGl2ZTwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorZ3VpbnQgIGFyZzEKK2d1aW50ICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEJpbjo6Z2V0LXNlc3Npb248L05BTUU+Cis8UkVUVVJOUz5Hc3RFbGVtZW50KjwvUkVUVVJOUz4KKzxGTEFHUz5sYTwvRkxBR1M+CitHc3RSdHBCaW4gKmdzdHJ0cGJpbgorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwQmluOjpvbi1idW5kbGVkLXNzcmM8L05BTUU+Cis8UkVUVVJOUz5ndWludDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cEJpbiAqZ3N0cnRwYmluCitndWludCAgYXJnMQorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBKaXR0ZXJCdWZmZXI6OmNsZWFyLXB0LW1hcDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bGE8L0ZMQUdTPgorR3N0UnRwSml0dGVyQnVmZmVyICpnc3RydHBqaXR0ZXJidWZmZXIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwSml0dGVyQnVmZmVyOjpoYW5kbGUtc3luYzwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBKaXR0ZXJCdWZmZXIgKmdzdHJ0cGppdHRlcmJ1ZmZlcgorR3N0U3RydWN0dXJlICphcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEppdHRlckJ1ZmZlcjo6b24tbnB0LXN0b3A8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwSml0dGVyQnVmZmVyICpnc3RydHBqaXR0ZXJidWZmZXIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwSml0dGVyQnVmZmVyOjpyZXF1ZXN0LXB0LW1hcDwvTkFNRT4KKzxSRVRVUk5TPkdzdENhcHMqPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwSml0dGVyQnVmZmVyICpnc3RydHBqaXR0ZXJidWZmZXIKK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cEppdHRlckJ1ZmZlcjo6c2V0LWFjdGl2ZTwvTkFNRT4KKzxSRVRVUk5TPmd1aW50NjQ8L1JFVFVSTlM+Cis8RkxBR1M+bGE8L0ZMQUdTPgorR3N0UnRwSml0dGVyQnVmZmVyICpnc3RydHBqaXR0ZXJidWZmZXIKK2dib29sZWFuICBhcmcxCitndWludDY0ICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cFB0RGVtdXg6OmNsZWFyLXB0LW1hcDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bGE8L0ZMQUdTPgorR3N0UnRwUHREZW11eCAqZ3N0cnRwcHRkZW11eAorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBQdERlbXV4OjpuZXctcGF5bG9hZC10eXBlPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cFB0RGVtdXggKmdzdHJ0cHB0ZGVtdXgKK2d1aW50ICBhcmcxCitHc3RQYWQgKmFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwUHREZW11eDo6cGF5bG9hZC10eXBlLWNoYW5nZTwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBQdERlbXV4ICpnc3RydHBwdGRlbXV4CitndWludCAgYXJnMQorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBQdERlbXV4OjpyZXF1ZXN0LXB0LW1hcDwvTkFNRT4KKzxSRVRVUk5TPkdzdENhcHMqPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwUHREZW11eCAqZ3N0cnRwcHRkZW11eAorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6Y2xlYXItcHQtbWFwPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5hPC9GTEFHUz4KK0dzdFJ0cFNlc3Npb24gKmdzdHJ0cHNlc3Npb24KKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6b24tYnllLXNzcmM8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwU2Vzc2lvbiAqZ3N0cnRwc2Vzc2lvbgorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6b24tYnllLXRpbWVvdXQ8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwU2Vzc2lvbiAqZ3N0cnRwc2Vzc2lvbgorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6b24tbmV3LXNzcmM8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwU2Vzc2lvbiAqZ3N0cnRwc2Vzc2lvbgorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6b24tc2VuZGVyLXRpbWVvdXQ8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwU2Vzc2lvbiAqZ3N0cnRwc2Vzc2lvbgorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6b24tc3NyYy1hY3RpdmU8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwU2Vzc2lvbiAqZ3N0cnRwc2Vzc2lvbgorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6b24tc3NyYy1jb2xsaXNpb248L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwU2Vzc2lvbiAqZ3N0cnRwc2Vzc2lvbgorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6b24tc3NyYy1zZGVzPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cFNlc3Npb24gKmdzdHJ0cHNlc3Npb24KK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cFNlc3Npb246Om9uLXNzcmMtdmFsaWRhdGVkPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cFNlc3Npb24gKmdzdHJ0cHNlc3Npb24KK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cFNlc3Npb246Om9uLXRpbWVvdXQ8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwU2Vzc2lvbiAqZ3N0cnRwc2Vzc2lvbgorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwU2Vzc2lvbjo6cmVxdWVzdC1wdC1tYXA8L05BTUU+Cis8UkVUVVJOUz5Hc3RDYXBzKjwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cFNlc3Npb24gKmdzdHJ0cHNlc3Npb24KK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJ0cFNlc3Npb246Om9uLW5ldy1zZW5kZXItc3NyYzwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RSdHBTZXNzaW9uICpnc3RydHBzZXNzaW9uCitndWludCAgYXJnMQorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RSdHBTZXNzaW9uOjpvbi1zZW5kZXItc3NyYy1hY3RpdmU8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwU2Vzc2lvbiAqZ3N0cnRwc2Vzc2lvbgorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwU3NyY0RlbXV4OjpjbGVhci1zc3JjPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sYTwvRkxBR1M+CitHc3RSdHBTc3JjRGVtdXggKmdzdHJ0cHNzcmNkZW11eAorZ3VpbnQgIGFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwU3NyY0RlbXV4OjpuZXctc3NyYy1wYWQ8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UnRwU3NyY0RlbXV4ICpnc3RydHBzc3JjZGVtdXgKK2d1aW50ICBhcmcxCitHc3RQYWQgKmFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UnRwU3NyY0RlbXV4OjpyZW1vdmVkLXNzcmMtcGFkPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJ0cFNzcmNEZW11eCAqZ3N0cnRwc3NyY2RlbXV4CitndWludCAgYXJnMQorR3N0UGFkICphcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdENhaXJvT3ZlcmxheTo6Y2Fwcy1jaGFuZ2VkPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz48L0ZMQUdTPgorR3N0Q2Fpcm9PdmVybGF5ICpnc3RjYWlyb292ZXJsYXkKK0dzdENhcHMgKmFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0Q2Fpcm9PdmVybGF5OjpkcmF3PC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz48L0ZMQUdTPgorR3N0Q2Fpcm9PdmVybGF5ICpnc3RjYWlyb292ZXJsYXkKK0NhaXJvQ29udGV4dCAqYXJnMQorZ3VpbnQ2NCAgYXJnMgorZ3VpbnQ2NCAgYXJnMworPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RWNGwyU3JjOjpwcmVwYXJlLWZvcm1hdDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+bDwvRkxBR1M+CitHc3RWNGwyU3JjICpnc3R2NGwyc3JjCitnaW50ICBhcmcxCitHc3RDYXBzICphcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJUU1BTcmM6OmhhbmRsZS1yZXF1ZXN0PC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz48L0ZMQUdTPgorR3N0UlRTUFNyYyAqZ3N0cnRzcHNyYworZ3BvaW50ZXIgIGFyZzEKK2dwb2ludGVyICBhcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJUU1BTcmM6Om9uLXNkcDwvTkFNRT4KKzxSRVRVUk5TPnZvaWQ8L1JFVFVSTlM+Cis8RkxBR1M+PC9GTEFHUz4KK0dzdFJUU1BTcmMgKmdzdHJ0c3BzcmMKK0dzdFNEUE1lc3NhZ2UgKmFyZzEKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UlRTUFNyYzo6c2VsZWN0LXN0cmVhbTwvTkFNRT4KKzxSRVRVUk5TPmdib29sZWFuPC9SRVRVUk5TPgorPEZMQUdTPmZjPC9GTEFHUz4KK0dzdFJUU1BTcmMgKmdzdHJ0c3BzcmMKK2d1aW50ICBhcmcxCitHc3RDYXBzICphcmcyCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJUU1BTcmM6Om5ldy1tYW5hZ2VyPC9OQU1FPgorPFJFVFVSTlM+dm9pZDwvUkVUVVJOUz4KKzxGTEFHUz5mYzwvRkxBR1M+CitHc3RSVFNQU3JjICpnc3RydHNwc3JjCitHc3RFbGVtZW50ICphcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJUU1BTcmM6OnJlcXVlc3QtcnRjcC1rZXk8L05BTUU+Cis8UkVUVVJOUz5Hc3RDYXBzKjwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFJUU1BTcmMgKmdzdHJ0c3BzcmMKK2d1aW50ICBhcmcxCis8L1NJR05BTD4KKworPFNJR05BTD4KKzxOQU1FPkdzdFJUU1BTcmM6OmFjY2VwdC1jZXJ0aWZpY2F0ZTwvTkFNRT4KKzxSRVRVUk5TPmdib29sZWFuPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0UlRTUFNyYyAqZ3N0cnRzcHNyYworR1Rsc0Nvbm5lY3Rpb24gKmFyZzEKK0dUbHNDZXJ0aWZpY2F0ZSAqYXJnMgorR1Rsc0NlcnRpZmljYXRlRmxhZ3MgIGFyZzMKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0UlRTUFNyYzo6YmVmb3JlLXNlbmQ8L05BTUU+Cis8UkVUVVJOUz5nYm9vbGVhbjwvUkVUVVJOUz4KKzxGTEFHUz5mYzwvRkxBR1M+CitHc3RSVFNQU3JjICpnc3RydHNwc3JjCitHc3RSVFNQTWVzc2FnZSAqYXJnMQorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RTcGxpdE11eFNpbms6OmZvcm1hdC1sb2NhdGlvbjwvTkFNRT4KKzxSRVRVUk5TPmdjaGFyKjwvUkVUVVJOUz4KKzxGTEFHUz5sPC9GTEFHUz4KK0dzdFNwbGl0TXV4U2luayAqZ3N0c3BsaXRtdXhzaW5rCitndWludCAgYXJnMQorPC9TSUdOQUw+CisKKzxTSUdOQUw+Cis8TkFNRT5Hc3RTcGxpdE11eFNpbms6OmZvcm1hdC1sb2NhdGlvbi1mdWxsPC9OQU1FPgorPFJFVFVSTlM+Z2NoYXIqPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0U3BsaXRNdXhTaW5rICpnc3RzcGxpdG11eHNpbmsKK2d1aW50ICBhcmcxCitHc3RTYW1wbGUgKmFyZzIKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0U3BsaXRNdXhTaW5rOjpzcGxpdC1ub3c8L05BTUU+Cis8UkVUVVJOUz52b2lkPC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0U3BsaXRNdXhTaW5rICpnc3RzcGxpdG11eHNpbmsKKzwvU0lHTkFMPgorCis8U0lHTkFMPgorPE5BTUU+R3N0U3BsaXRNdXhTcmM6OmZvcm1hdC1sb2NhdGlvbjwvTkFNRT4KKzxSRVRVUk5TPkdTdHJ2PC9SRVRVUk5TPgorPEZMQUdTPmw8L0ZMQUdTPgorR3N0U3BsaXRNdXhTcmMgKmdzdHNwbGl0bXV4c3JjCis8L1NJR05BTD4KKwpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2dzdC1wbHVnaW5zLWdvb2QtcGx1Z2lucy50eXBlcyBiL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMudHlwZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE1YjRiNAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9nc3QtcGx1Z2lucy1nb29kLXBsdWdpbnMudHlwZXMKQEAgLTAsMCArMSw0IEBACisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCit0eXBlOkdzdElpckVxdWFsaXplcgordHlwZTpHc3RWaWRlb01peGVyUGFkCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tMTM5NC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxYzhjZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi0xMzk0LnhtbApAQCAtMCwwICsxLDQzIEBACis8cGx1Z2luPgorICA8bmFtZT4xMzk0PC9uYW1lPgorICA8ZGVzY3JpcHRpb24+U291cmNlIGZvciB2aWRlbyBkYXRhIHZpYSBJRUVFMTM5NCBpbnRlcmZhY2U8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZXh0L3JhdzEzOTQvLmxpYnMvbGliZ3N0MTM5NC5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3QxMzk0LnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5kdjEzOTRzcmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+RmlyZXdpcmUgKDEzOTQpIERWIHZpZGVvIHNvdXJjZTwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U291cmNlL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5Tb3VyY2UgZm9yIERWIHZpZGVvIGRhdGEgZnJvbSBmaXJld2lyZSBwb3J0PC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RXJpayBXYWx0aGluc2VuICZsdDtvbWVnYUB0ZW1wbGUtYmFwdGlzdC5jb20mZ3Q7LCBEYW5pZWwgRmlzY2hlciAmbHQ7ZGFuQGYzYy5jb20mZ3Q7LCBXaW0gVGF5bWFucyAmbHQ7d2ltQGZsdWVuZG8uY29tJmd0OywgWmFoZWVyIEFiYmFzIE1lcmFsaSAmbHQ7emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1kdiwgZm9ybWF0PShzdHJpbmcpeyBOVFNDLCBQQUwgfSwgc3lzdGVtc3RyZWFtPShib29sZWFuKXRydWU8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5oZHYxMzk0c3JjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkZpcmV3aXJlICgxMzk0KSBIRFYgdmlkZW8gc291cmNlPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Tb3VyY2UvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlNvdXJjZSBmb3IgTVBFRy1UUyB2aWRlbyBkYXRhIGZyb20gZmlyZXdpcmUgcG9ydDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkVkd2FyZCBIZXJ2ZXkgJmx0O2JpbGJvZWRAYmlsYm9lZC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8vbXBlZ3RzLCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pdHJ1ZSwgcGFja2V0c2l6ZT0oaW50KTE4ODwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFhc2luay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWExZTM4OAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hYXNpbmsueG1sCkBAIC0wLDAgKzEsMjggQEAKKzxwbHVnaW4+CisgIDxuYW1lPmFhc2luazwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkFTQ0lJIEFydCB2aWRlbyBzaW5rPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2V4dC9hYWxpYi8ubGlicy9saWJnc3RhYXNpbmsuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0YWFzaW5rLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hYXNpbms8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QVNDSUkgYXJ0IHZpZGVvIHNpbms8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNpbmsvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkFuIEFTQ0lJIGFydCB2aWRlb3Npbms8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAY2hlbGxvLmJlJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUk0MjAsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbGF3LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWViMGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFsYXcueG1sCkBAIC0wLDAgKzEsNTUgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmFsYXc8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5BTGF3IGF1ZGlvIGNvbnZlcnNpb24gcm91dGluZXM8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L2xhdy8ubGlicy9saWJnc3RhbGF3LnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGFsYXcuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmFsYXdkZWM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QSBMYXcgYXVkaW8gZGVjb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVjb2Rlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+Q29udmVydCA4Yml0IEEgbGF3IHRvIDE2Yml0IFBDTTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlphaGVlciBBYmJhcyBNZXJhbGkgJmx0O3phaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1hbGF3LCByYXRlPShpbnQpWyA4MDAwLCAxOTIwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzE2TEUsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyA4MDAwLCAxOTIwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmFsYXdlbmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QSBMYXcgYXVkaW8gZW5jb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRW5jb2Rlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+Q29udmVydCAxNmJpdCBQQ00gdG8gOGJpdCBBIGxhdzwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlphaGVlciBBYmJhcyBNZXJhbGkgJmx0O3phaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMxNkxFLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgODAwMCwgMTkyMDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1hbGF3LCByYXRlPShpbnQpWyA4MDAwLCAxOTIwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hbHBoYS54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOTIzYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGEueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmFscGhhPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+YWRkcyBhbiBhbHBoYSBjaGFubmVsIHRvIHZpZGVvIC0gY29uc3RhbnQgb3IgdmlhIGNocm9tYS1rZXlpbmc8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L2FscGhhLy5saWJzL2xpYmdzdGFscGhhLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGFscGhhLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hbHBoYTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BbHBoYSBmaWx0ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkFkZHMgYW4gYWxwaGEgY2hhbm5lbCB0byB2aWRlbyAtIHVuaWZvcm0gb3IgdmlhIGNocm9tYS1rZXlpbmc8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OworRWR3YXJkIEhlcnZleSAmbHQ7ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWsmZ3Q7CitKYW4gU2NobWlkdCAmbHQ7dGhheXRhbkBub3JhaXNpbi5uZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBBWVVWLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0JBLCBZNDQ0LCB4UkdCLCBCR1J4LCB4QkdSLCBSR0J4LCBSR0IsIEJHUiwgWTQyQiwgWVVZMiwgWVZZVSwgVVlWWSwgSTQyMCwgWVYxMiwgWTQxQiB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQVlVViwgQVJHQiwgQkdSQSwgQUJHUiwgUkdCQSwgWTQ0NCwgeFJHQiwgQkdSeCwgeEJHUiwgUkdCeCwgUkdCLCBCR1IsIFk0MkIsIFlVWTIsIFlWWVUsIFVZVlksIEk0MjAsIFlWMTIsIFk0MUIgfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFscGhhY29sb3IueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMWViMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYWxwaGFjb2xvci54bWwKQEAgLTAsMCArMSwzNCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+YWxwaGFjb2xvcjwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPlJHQkEgZnJvbS90byBBWVVWIGNvbG9yc3BhY2UgY29udmVyc2lvbiBwcmVzZXJ2aW5nIHRoZSBhbHBoYSBjaGFubmVsPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9hbHBoYS8ubGlicy9saWJnc3RhbHBoYWNvbG9yLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGFscGhhY29sb3Iuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmFscGhhY29sb3I8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QWxwaGEgY29sb3IgZmlsdGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvQ29udmVydGVyL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BUkdCIGZyb20vdG8gQVlVViBjb2xvcnNwYWNlIGNvbnZlcnNpb24gcHJlc2VydmluZyB0aGUgYWxwaGEgY2hhbm5lbDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBSR0JBLCBCR1JBLCBBUkdCLCBBQkdSLCBBWVVWIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBSR0JBLCBCR1JBLCBBUkdCLCBBQkdSLCBBWVVWIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWFwZXRhZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2NTI3YwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hcGV0YWcueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmFwZXRhZzwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkFQRXYxLzIgdGFnIHJlYWRlcjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvYXBldGFnLy5saWJzL2xpYmdzdGFwZXRhZy5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RhcGV0YWcuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmFwZWRlbXV4PC9uYW1lPgorICAgICAgPGxvbmduYW1lPkFQRSB0YWcgZGVtdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVtdXhlci9NZXRhZGF0YTwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UmVhZCBhbmQgb3V0cHV0IEFQRSB0YWdzIHdoaWxlIGRlbXV4aW5nIHRoZSBjb250ZW50czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlRpbS1QaGlsaXBwIE3DvGxsZXIgJmx0O3RpbSBjZW50cmljdWxhciBuZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LWFwZXRhZzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9meC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUyOWE2MwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1hdWRpb2Z4LnhtbApAQCAtMCwwICsxLDI4NiBAQAorPHBsdWdpbj4KKyAgPG5hbWU+YXVkaW9meDwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkF1ZGlvIGVmZmVjdHMgcGx1Z2luPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9hdWRpb2Z4Ly5saWJzL2xpYmdzdGF1ZGlvZnguc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0YXVkaW9meC5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+YXVkaW9hbXBsaWZ5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPkF1ZGlvIGFtcGxpZmllcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+QW1wbGlmaWVzIGFuIGF1ZGlvIHN0cmVhbSBieSBhIGdpdmVuIGZhY3RvcjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNlYmFzdGlhbiBEcsO2Z2UgJmx0O3Nsb21vQGNpcmN1bGFyLWNoYW9zLm9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFM4LCBTMTZMRSwgUzMyTEUsIEYzMkxFLCBGNjRMRSB9LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGxheW91dD0oc3RyaW5nKXsgaW50ZXJsZWF2ZWQsIG5vbi1pbnRlcmxlYXZlZCB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFM4LCBTMTZMRSwgUzMyTEUsIEYzMkxFLCBGNjRMRSB9LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGxheW91dD0oc3RyaW5nKXsgaW50ZXJsZWF2ZWQsIG5vbi1pbnRlcmxlYXZlZCB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+YXVkaW9jaGViYmFuZDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5CYW5kIHBhc3MgJmFtcDsgYmFuZCByZWplY3QgZmlsdGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5DaGVieXNoZXYgYmFuZCBwYXNzIGFuZCBiYW5kIHJlamVjdCBmaWx0ZXI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TZWJhc3RpYW4gRHLDtmdlICZsdDtzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEYzMkxFLCBGNjRMRSB9LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEYzMkxFLCBGNjRMRSB9LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+YXVkaW9jaGVibGltaXQ8L25hbWU+CisgICAgICA8bG9uZ25hbWU+TG93IHBhc3MgJmFtcDsgaGlnaCBwYXNzIGZpbHRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+Q2hlYnlzaGV2IGxvdyBwYXNzIGFuZCBoaWdoIHBhc3MgZmlsdGVyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBGMzJMRSwgRjY0TEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBGMzJMRSwgRjY0TEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmF1ZGlvZHluYW1pYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5EeW5hbWljIHJhbmdlIGNvbnRyb2xsZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkNvbXByZXNzb3IgYW5kIEV4cGFuZGVyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzE2TEUsIEYzMkxFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpeyBpbnRlcmxlYXZlZCwgbm9uLWludGVybGVhdmVkIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzE2TEUsIEYzMkxFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpeyBpbnRlcmxlYXZlZCwgbm9uLWludGVybGVhdmVkIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hdWRpb2VjaG88L25hbWU+CisgICAgICA8bG9uZ25hbWU+QXVkaW8gZWNobzwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+QWRkcyBhbiBlY2hvIG9yIHJldmVyYiBlZmZlY3QgdG8gYW4gYXVkaW8gc3RyZWFtPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBGMzJMRSwgRjY0TEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBGMzJMRSwgRjY0TEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmF1ZGlvZmlyZmlsdGVyPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkF1ZGlvIEZJUiBmaWx0ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkdlbmVyaWMgYXVkaW8gRklSIGZpbHRlciB3aXRoIGN1c3RvbSBmaWx0ZXIga2VybmVsPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBGMzJMRSwgRjY0TEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBGMzJMRSwgRjY0TEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmF1ZGlvaWlyZmlsdGVyPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkF1ZGlvIElJUiBmaWx0ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkdlbmVyaWMgYXVkaW8gSUlSIGZpbHRlciB3aXRoIGN1c3RvbSBmaWx0ZXIga2VybmVsPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBGMzJMRSwgRjY0TEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBGMzJMRSwgRjY0TEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmF1ZGlvaW52ZXJ0PC9uYW1lPgorICAgICAgPGxvbmduYW1lPkF1ZGlvIGludmVyc2lvbjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+U3dhcHMgdXBwZXIgYW5kIGxvd2VyIGhhbGYgb2YgYXVkaW8gc2FtcGxlczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNlYmFzdGlhbiBEcsO2Z2UgJmx0O3Nsb21vQGNpcmN1bGFyLWNoYW9zLm9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMxNkxFLCBGMzJMRSB9LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGxheW91dD0oc3RyaW5nKXsgaW50ZXJsZWF2ZWQsIG5vbi1pbnRlcmxlYXZlZCB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMxNkxFLCBGMzJMRSB9LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGxheW91dD0oc3RyaW5nKXsgaW50ZXJsZWF2ZWQsIG5vbi1pbnRlcmxlYXZlZCB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+YXVkaW9rYXJhb2tlPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkF1ZGlvS2FyYW9rZTwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UmVtb3ZlcyB2b2ljZSBmcm9tIHNvdW5kPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMxNkxFLCBGMzJMRSB9LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpMiwgY2hhbm5lbC1tYXNrPShiaXRtYXNrKTB4MDAwMDAwMDAwMDAwMDAwMywgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzE2TEUsIEYzMkxFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludCkyLCBjaGFubmVsLW1hc2s9KGJpdG1hc2spMHgwMDAwMDAwMDAwMDAwMDAzLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmF1ZGlvcGFub3JhbWE8L25hbWU+CisgICAgICA8bG9uZ25hbWU+U3RlcmVvIHBvc2l0aW9uaW5nPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5Qb3NpdGlvbnMgYXVkaW8gc3RyZWFtcyBpbiB0aGUgc3RlcmVvIHBhbm9yYW1hPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U3RlZmFuIEtvc3QgJmx0O2Vuc29uaWNAdXNlcnMuc2YubmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIFMxNkxFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIFMxNkxFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludCkyLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmF1ZGlvd3NpbmNiYW5kPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkJhbmQgcGFzcyAmYW1wOyBiYW5kIHJlamVjdCBmaWx0ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkJhbmQgcGFzcyBhbmQgYmFuZCByZWplY3Qgd2luZG93ZWQgc2luYyBmaWx0ZXI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaG9tYXMgVmFuZGVyIFN0aWNoZWxlICZsdDt0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmcmZ3Q7LCBTdGV2ZW4gVy4gU21pdGgsIERyZWFtbGFiIFRlY2hub2xvZ2llcyBMdGQuICZsdDttYXRoaXMuaG9mZXJAZHJlYW1sYWIubmV0Jmd0OywgU2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBGMzJMRSwgRjY0TEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBGMzJMRSwgRjY0TEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmF1ZGlvd3NpbmNsaW1pdDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5Mb3cgcGFzcyAmYW1wOyBoaWdoIHBhc3MgZmlsdGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5Mb3cgcGFzcyBhbmQgaGlnaCBwYXNzIHdpbmRvd2VkIHNpbmMgZmlsdGVyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGhvbWFzIFZhbmRlciBTdGljaGVsZSAmbHQ7dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnJmd0OywgU3RldmVuIFcuIFNtaXRoLCBEcmVhbWxhYiBUZWNobm9sb2dpZXMgTHRkLiAmbHQ7bWF0aGlzLmhvZmVyQGRyZWFtbGFiLm5ldCZndDssIFNlYmFzdGlhbiBEcsO2Z2UgJmx0O3NlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIEY2NExFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIEY2NExFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5zY2FsZXRlbXBvPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlNjYWxldGVtcG88L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvUmF0ZTwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+U3luYyBhdWRpbyB0ZW1wbyB3aXRoIHBsYXliYWNrIHJhdGU8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5Sb3YgSnV2YW5vICZsdDtyb3ZqdXZhbm9AdXNlcnMuc291cmNlZm9yZ2UubmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUYzMkxFLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylGNjRMRSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzE2TEUsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpRjMyTEUsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUY2NExFLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTMTZMRSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVkaW9wYXJzZXJzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjRjZDJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1ZGlvcGFyc2Vycy54bWwKQEAgLTAsMCArMSwxODEgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmF1ZGlvcGFyc2VyczwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPlBhcnNlcnMgZm9yIHZhcmlvdXMgYXVkaW8gZm9ybWF0czwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvYXVkaW9wYXJzZXJzLy5saWJzL2xpYmdzdGF1ZGlvcGFyc2Vycy5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RhdWRpb3BhcnNlcnMuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmFhY3BhcnNlPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkFBQyBhdWRpbyBzdHJlYW0gcGFyc2VyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXJzZXIvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkFkdmFuY2VkIEF1ZGlvIENvZGluZyBwYXJzZXI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TdGVmYW4gS29zdCAmbHQ7c3RlZmFuLmtvc3RAbm9raWEuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCl7IDIsIDQgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9tcGVnLCBmcmFtZWQ9KGJvb2xlYW4pdHJ1ZSwgbXBlZ3ZlcnNpb249KGludCl7IDIsIDQgfSwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKXsgcmF3LCBhZHRzLCBhZGlmLCBsb2FzIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hYzNwYXJzZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BQzMgYXVkaW8gc3RyZWFtIHBhcnNlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGFyc2VyL0NvbnZlcnRlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+QUMzIHBhcnNlcjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlRpbS1QaGlsaXBwIE3DvGxsZXIgJmx0O3RpbSBjZW50cmljdWxhciBuZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWFjMzsgYXVkaW8veC1lYWMzOyBhdWRpby9hYzM7IGF1ZGlvL3gtcHJpdmF0ZTEtYWMzPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtYWMzLCBmcmFtZWQ9KGJvb2xlYW4pdHJ1ZSwgY2hhbm5lbHM9KGludClbIDEsIDYgXSwgcmF0ZT0oaW50KVsgODAwMCwgNDgwMDAgXSwgYWxpZ25tZW50PShzdHJpbmcpeyBpZWM2MTkzNywgZnJhbWUgfTsgYXVkaW8veC1lYWMzLCBmcmFtZWQ9KGJvb2xlYW4pdHJ1ZSwgY2hhbm5lbHM9KGludClbIDEsIDYgXSwgcmF0ZT0oaW50KVsgODAwMCwgNDgwMDAgXSwgYWxpZ25tZW50PShzdHJpbmcpeyBpZWM2MTkzNywgZnJhbWUgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmFtcnBhcnNlPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkFNUiBhdWRpbyBzdHJlYW0gcGFyc2VyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXJzZXIvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkFkYXB0aXZlIE11bHRpLVJhdGUgYXVkaW8gcGFyc2VyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+Um9uYWxkIEJ1bHRqZSAmbHQ7cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1hbXItbmItc2g7IGF1ZGlvL3gtYW1yLXdiLXNoPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL0FNUiwgcmF0ZT0oaW50KTgwMDAsIGNoYW5uZWxzPShpbnQpMTsgYXVkaW8vQU1SLVdCLCByYXRlPShpbnQpMTYwMDAsIGNoYW5uZWxzPShpbnQpMTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmRjYXBhcnNlPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkRUUyBDb2hlcmVudCBBY291c3RpY3MgYXVkaW8gc3RyZWFtIHBhcnNlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGFyc2VyL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5EQ0EgcGFyc2VyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGltLVBoaWxpcHAgTcO8bGxlciAmbHQ7dGltIGNlbnRyaWN1bGFyIG5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtZHRzOyBhdWRpby94LXByaXZhdGUxLWR0czwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWR0cywgZnJhbWVkPShib29sZWFuKXRydWUsIGNoYW5uZWxzPShpbnQpWyAxLCA4IF0sIHJhdGU9KGludClbIDgwMDAsIDE5MjAwMCBdLCBkZXB0aD0oaW50KXsgMTQsIDE2IH0sIGVuZGlhbm5lc3M9KGludCl7IDEyMzQsIDQzMjEgfSwgYmxvY2stc2l6ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZS1zaXplPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5mbGFjcGFyc2U8L25hbWU+CisgICAgICA8bG9uZ25hbWU+RkxBQyBhdWRpbyBwYXJzZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BhcnNlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGFyc2VzIGF1ZGlvIHdpdGggdGhlIEZMQUMgbG9zc2xlc3MgYXVkaW8gY29kZWM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TZWJhc3RpYW4gRHLDtmdlICZsdDtzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtZmxhYzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWZsYWMsIGZyYW1lZD0oYm9vbGVhbil0cnVlLCBjaGFubmVscz0oaW50KVsgMSwgOCBdLCByYXRlPShpbnQpWyAxLCA2NTUzNTAgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPm1wZWdhdWRpb3BhcnNlPC9uYW1lPgorICAgICAgPGxvbmduYW1lPk1QRUcxIEF1ZGlvIFBhcnNlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGFyc2VyL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXJzZXMgYW5kIGZyYW1lcyBtcGVnMSBhdWRpbyBzdHJlYW1zIChsZXZlbHMgMS0zKSwgcHJvdmlkZXMgc2VlazwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkphbiBTY2htaWR0ICZsdDt0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tJmd0OyxNYXJrIE5hdXdlbGFlcnRzICZsdDttYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpMTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTEsIGxheWVyPShpbnQpWyAxLCAzIF0sIG1wZWdhdWRpb3ZlcnNpb249KGludClbIDEsIDMgXSwgcmF0ZT0oaW50KVsgODAwMCwgNDgwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXSwgcGFyc2VkPShib29sZWFuKXRydWU8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5zYmNwYXJzZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5TQkMgYXVkaW8gcGFyc2VyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXJzZXIvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBhcnNlcyBhbiBTQkMgYmx1ZXRvb3RoIGF1ZGlvIHN0cmVhbTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlRpbS1QaGlsaXBwIE3DvGxsZXIgJmx0O3RpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1zYmM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1zYmMsIHBhcnNlZD0oYm9vbGVhbil0cnVlLCBjaGFubmVscz0oaW50KVsgMSwgMiBdLCByYXRlPShpbnQpeyAxNjAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+d2F2cGFja3BhcnNlPC9uYW1lPgorICAgICAgPGxvbmduYW1lPldhdnBhY2sgYXVkaW8gc3RyZWFtIHBhcnNlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGFyc2VyL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5XYXZwYWNrIHBhcnNlcjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPk1hcmsgTmF1d2VsYWVydHMgJmx0O21hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC13YXZwYWNrPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtd2F2cGFjaywgZGVwdGg9KGludClbIDEsIDMyIF0sIGNoYW5uZWxzPShpbnQpWyAxLCA4IF0sIHJhdGU9KGludClbIDYwMDAsIDE5MjAwMCBdLCBmcmFtZWQ9KGJvb2xlYW4pdHJ1ZTsgYXVkaW8veC13YXZwYWNrLWNvcnJlY3Rpb24sIGZyYW1lZD0oYm9vbGVhbil0cnVlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1cGFyc2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MzZiOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXVwYXJzZS54bWwKQEAgLTAsMCArMSwzNCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+YXVwYXJzZTwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPnBhcnNlcyBhdSBzdHJlYW1zPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9hdXBhcnNlLy5saWJzL2xpYmdzdGF1cGFyc2Uuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0YXVwYXJzZS5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+YXVwYXJzZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BVSBhdWRpbyBkZW11eGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZW11eGVyL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXJzZSBhbiAuYXUgZmlsZSBpbnRvIHJhdyBhdWRpbzwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkVyaWsgV2FsdGhpbnNlbiAmbHQ7b21lZ2FAY3NlLm9naS5lZHUmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWF1PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFM4LCBTMTZMRSwgUzE2QkUsIFMyNExFLCBTMjRCRSwgUzMyTEUsIFMzMkJFLCBGMzJMRSwgRjMyQkUsIEY2NExFLCBGNjRCRSB9LCByYXRlPShpbnQpWyA4MDAwLCAxOTIwMDAgXSwgY2hhbm5lbHM9KGludCkxLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzgsIFMxNkxFLCBTMTZCRSwgUzI0TEUsIFMyNEJFLCBTMzJMRSwgUzMyQkUsIEYzMkxFLCBGMzJCRSwgRjY0TEUsIEY2NEJFIH0sIHJhdGU9KGludClbIDgwMDAsIDE5MjAwMCBdLCBjaGFubmVscz0oaW50KTIsIGNoYW5uZWwtbWFzaz0oYml0bWFzaykweDAwMDAwMDAwMDAwMDAwMDMsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkOyBhdWRpby94LWFsYXcsIHJhdGU9KGludClbIDgwMDAsIDE5MjAwMCBdLCBjaGFubmVscz0oaW50KVsgMSwgMiBdOyBhdWRpby94LW11bGF3LCByYXRlPShpbnQpWyA4MDAwLCAxOTIwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTsgYXVkaW8veC1hZHBjbSwgbGF5b3V0PShzdHJpbmcpeyBnNzIxLCBnNzIyLCBnNzIzXzMsIGc3MjNfNSB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF1dG9kZXRlY3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMjg0MTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXV0b2RldGVjdC54bWwKQEAgLTAsMCArMSw3MyBAQAorPHBsdWdpbj4KKyAgPG5hbWU+YXV0b2RldGVjdDwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPlBsdWdpbiBjb250YWlucyBhdXRvLWRldGVjdGlvbiBwbHVnaW5zIGZvciB2aWRlby9hdWRpbyBpbi0gYW5kIG91dHB1dHM8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L2F1dG9kZXRlY3QvLmxpYnMvbGliZ3N0YXV0b2RldGVjdC5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RhdXRvZGV0ZWN0LnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hdXRvYXVkaW9zaW5rPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkF1dG8gYXVkaW8gc2luazwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U2luay9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+V3JhcHBlciBhdWRpbyBzaW5rIGZvciBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIGF1ZGlvIHNpbms8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5KYW4gU2NobWlkdCAmbHQ7dGhheXRhbkBub3JhaXNpbi5uZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hdXRvYXVkaW9zcmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QXV0byBhdWRpbyBzb3VyY2U8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNvdXJjZS9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+V3JhcHBlciBhdWRpbyBzb3VyY2UgZm9yIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYXVkaW8gc291cmNlPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+SmFuIFNjaG1pZHQgJmx0O3RoYXl0YW5Abm9yYWlzaW4ubmV0Jmd0OywgU3RlZmFuIEtvc3QgJmx0O2Vuc29uaWNAdXNlcnMuc2YubmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmF1dG92aWRlb3Npbms8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QXV0byB2aWRlbyBzaW5rPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5TaW5rL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5XcmFwcGVyIHZpZGVvIHNpbmsgZm9yIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdmlkZW8gc2luazwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkphbiBTY2htaWR0ICZsdDt0aGF5dGFuQG5vcmFpc2luLm5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmF1dG92aWRlb3NyYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BdXRvIHZpZGVvIHNvdXJjZTwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U291cmNlL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5XcmFwcGVyIHZpZGVvIHNvdXJjZSBmb3IgYXV0b21hdGljYWxseSBkZXRlY3RlZCB2aWRlbyBzb3VyY2U8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5KYW4gU2NobWlkdCAmbHQ7dGhheXRhbkBub3JhaXNpbi5uZXQmZ3Q7LCBTdGVmYW4gS29zdCAmbHQ7ZW5zb25pY0B1c2Vycy5zZi5uZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tYXZpLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2IwOWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWF2aS54bWwKQEAgLTAsMCArMSwxMDAgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmF2aTwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkFWSSBzdHJlYW0gaGFuZGxpbmc8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L2F2aS8ubGlicy9saWJnc3Rhdmkuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0YXZpLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hdmlkZW11eDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BdmkgZGVtdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVtdXhlcjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RGVtdWx0aXBsZXggYW4gYXZpIGZpbGUgaW50byBhdWRpbyBhbmQgdmlkZW88L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5FcmlrIFdhbHRoaW5zZW4gJmx0O29tZWdhQGNzZS5vZ2kuZWR1Jmd0OywgV2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGNoZWxsby5iZSZndDssIFRoaWpzIFZlcm1laXIgJmx0O3RoaWpzdmVybWVpckBnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LW1zdmlkZW88L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+YXVkaW9fJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+c29tZXRpbWVzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9tcy1nc207IGF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpMSwgbGF5ZXI9KGludCkzOyBhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTEsIGxheWVyPShpbnQpMjsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzgsIFU4LCBTMTZMRSwgVTE2TEUsIFMyNExFLCBVMjRMRSwgUzMyTEUsIFUzMkxFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkOyBhdWRpby94LXZvcmJpczsgYXVkaW8veC1hYzM7IGF1ZGlvL3gtZHRzOyBhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQ7IGF1ZGlvL3gtYWxhdzsgYXVkaW8veC1tdWxhdzsgYXVkaW8veC13bXMsIGJpdHJhdGU9KGludClbIDAsIDIxNDc0ODM2NDcgXSwgYmxvY2tfYWxpZ249KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC1hZHBjbSwgbGF5b3V0PShzdHJpbmcpbWljcm9zb2Z0LCBibG9ja19hbGlnbj0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LWFkcGNtLCBsYXlvdXQ9KHN0cmluZylkdmksIGJsb2NrX2FsaWduPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtdHJ1ZXNwZWVjaDsgYXVkaW8veC13bWEsIHdtYXZlcnNpb249KGludCkxLCBiaXRyYXRlPShpbnQpWyAwLCAyMTQ3NDgzNjQ3IF0sIGJsb2NrX2FsaWduPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtd21hLCB3bWF2ZXJzaW9uPShpbnQpMiwgYml0cmF0ZT0oaW50KVsgMCwgMjE0NzQ4MzY0NyBdLCBibG9ja19hbGlnbj0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LXdtYSwgd21hdmVyc2lvbj0oaW50KTMsIGJpdHJhdGU9KGludClbIDAsIDIxNDc0ODM2NDcgXSwgYmxvY2tfYWxpZ249KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC12bmQuc29ueS5hdHJhYzM7IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEYzMkxFLCBGNjRMRSB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDsgYXVkaW8veC12b3h3YXJlLCB2b3h3YXJldHlwZT0oaW50KTExNzsgYXVkaW8veC1hZHBjbSwgbGF5b3V0PShzdHJpbmcpZGs0OyBhdWRpby94LWFkcGNtLCBsYXlvdXQ9KHN0cmluZylkazM7IGF1ZGlvL3gtYWRwY20sIGxheW91dD0oc3RyaW5nKWR2aTsgYXVkaW8vQU1SOyBhdWRpby9BTVItV0I7IGF1ZGlvL3gtc2lyZW47IGFwcGxpY2F0aW9uL3gtb2dnLWF2aTsgYXVkaW8veC1hdmktdW5rbm93bjwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zdWJwaWN0dXJlXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+c3VicGljdHVyZS94LXhzdWI8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3VidGl0bGVfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+c29tZXRpbWVzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXN1YnRpdGxlLWF2aTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT52aWRlb18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtYXN1cywgYXN1c3ZlcnNpb249KGludCkxLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtYXN1cywgYXN1c3ZlcnNpb249KGludCkyLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtY2lycnVzLWxvZ2ljLWFjY3VwYWssIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1jYW1zdHVkaW8sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1jb21wcmVzc2VkLXl1diwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBSR0I4UCwgQkdSLCBCR1J4IH0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1kaXZ4LCBkaXZ4dmVyc2lvbj0oaW50KTMsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1kaXZ4LCBkaXZ4dmVyc2lvbj0oaW50KTQsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC10cnVlbW90aW9uLCB0cnVldmVyc2lvbj0oaW50KTEsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1kdiwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlLCBkdnZlcnNpb249KGludCkyNSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWR2LCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2UsIGR2dmVyc2lvbj0oaW50KTUwLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtZGl2eCwgZGl2eHZlcnNpb249KGludCk1LCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtZmxhc2gtdmlkZW8sIGZsdnZlcnNpb249KGludCkxLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtdnA2LWZsYXNoLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtaDI2MywgdmFyaWFudD0oc3RyaW5nKWl0dSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWgyNjMsIHZhcmlhbnQ9KHN0cmluZylsdWNlbnQsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1oMjY0LCB2YXJpYW50PShzdHJpbmcpaXR1LCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtaHVmZnl1diwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWludGVsLWgyNjMsIHZhcmlhbnQ9KHN0cmluZylpbnRlbCwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpSTQyMCwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWluZGVvLCBpbmRlb3ZlcnNpb249KGludCkzLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtaW5kZW8sIGluZGVvdmVyc2lvbj0oaW50KTQsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1pbmRlbywgaW5kZW92ZXJzaW9uPShpbnQpNSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWgyNjMsIHZhcmlhbnQ9KHN0cmluZylsZWFkLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtaDI2NCwgdmFyaWFudD0oc3RyaW5nKWxlYWQsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1oMjYzLCB2YXJpYW50PShzdHJpbmcpbWljcm9zb2Z0LCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGltYWdlL2pwZWcsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1tc21wZWcsIG1zbXBlZ3ZlcnNpb249KGludCk0MiwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LW1zbXBlZywgbXNtcGVndmVyc2lvbj0oaW50KTQzLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL21wZWcsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZSwgbXBlZ3ZlcnNpb249KGludCkxLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL21wZWcsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZSwgbXBlZ3ZlcnNpb249KGludCkyLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtbXNtcGVnLCBtc21wZWd2ZXJzaW9uPShpbnQpNDEsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1tc3poLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGltYWdlL3BuZywgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXJsZSwgbGF5b3V0PShzdHJpbmcpbWljcm9zb2Z0LCBkZXB0aD0oaW50KVsgMSwgNjQgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWluZGVvLCBpbmRlb3ZlcnNpb249KGludCkyLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3NwNXgsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC10cnVlbW90aW9uLCB0cnVldmVyc2lvbj0oaW50KTIsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1jYW10YXNpYSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXVsdGltb3Rpb24sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVVZVlksIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1hdGktdmNyLCB2Y3J2ZXJzaW9uPShpbnQpMSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWF0aS12Y3IsIHZjcnZlcnNpb249KGludCkyLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtaDI2MywgdmFyaWFudD0oc3RyaW5nKXZkb2xpdmUsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1oMjYzLCB2YXJpYW50PShzdHJpbmcpdml2bywgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXZtbmMsIHZlcnNpb249KGludCkxLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtdnAzLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtaDI2NCwgdmFyaWFudD0oc3RyaW5nKXZpZGVvc29mdCwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXdtdiwgd212dmVyc2lvbj0oaW50KTEsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC13bXYsIHdtdnZlcnNpb249KGludCkyLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtd212LCB3bXZ2ZXJzaW9uPShpbnQpMywgZm9ybWF0PShzdHJpbmcpV01WMywgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXhhbiwgd2N2ZXJzaW9uPShpbnQpNCwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpWVVZMiwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpWVZVOSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXpsaWIsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1jaW5lcGFrLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtaDI2NCwgdmFyaWFudD0oc3RyaW5nKWl0dSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LW1zdmlkZW9jb2RlYywgbXN2aWRlb3ZlcnNpb249KGludCkxLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtaDI2MywgdmFyaWFudD0oc3RyaW5nKXhpcmxpbmssIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1kaXJhYywgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWZmdiwgZmZ2dmVyc2lvbj0oaW50KTEsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1rbXZjLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtdnA1LCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtdnA2LCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtdnA2LWZsYXNoLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtdnA3LCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtdnA4LCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtbWltaWMsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1hcHBsZS12aWRlbywgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXRoZW9yYSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWZyYXBzLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtYWFzYywgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpWVYxMiwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWxvY28sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC16bWJ2LCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl2MjEwLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylyMjEwLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtZHYsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbil0cnVlOyB2aWRlby94LWF2aS11bmtub3duPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+YXZpbXV4PC9uYW1lPgorICAgICAgPGxvbmduYW1lPkF2aSBtdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvTXV4ZXI8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPk11eGVzIGF1ZGlvIGFuZCB2aWRlbyBpbnRvIGFuIGF2aSBzdHJlYW08L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5HU3RyZWFtZXIgbWFpbnRhaW5lcnMgJmx0O2dzdHJlYW1lci1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+YXVkaW9fJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFU4LCBTMTZMRSB9LCByYXRlPShpbnQpWyAxMDAwLCA5NjAwMCBdLCBjaGFubmVscz0oaW50KVsgMSwgMiBdOyBhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTEsIGxheWVyPShpbnQpWyAxLCAzIF0sIHJhdGU9KGludClbIDEwMDAsIDk2MDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF07IGF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKXJhdywgcmF0ZT0oaW50KVsgMTAwMCwgOTYwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTsgYXVkaW8veC1hYzMsIHJhdGU9KGludClbIDEwMDAsIDk2MDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCA2IF07IGF1ZGlvL3gtYWxhdywgcmF0ZT0oaW50KVsgMTAwMCwgNDgwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTsgYXVkaW8veC1tdWxhdywgcmF0ZT0oaW50KVsgMTAwMCwgNDgwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTsgYXVkaW8veC13bWEsIHJhdGU9KGludClbIDEwMDAsIDk2MDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF0sIHdtYXZlcnNpb249KGludClbIDEsIDIgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT52aWRlb18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgWVVZMiwgSTQyMCwgQkdSLCBCR1J4LCBCR1JBLCBHUkFZOCwgVVlWWSB9LCB3aWR0aD0oaW50KVsgMTYsIDQwOTYgXSwgaGVpZ2h0PShpbnQpWyAxNiwgNDA5NiBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgaW1hZ2UvanBlZywgd2lkdGg9KGludClbIDE2LCA0MDk2IF0sIGhlaWdodD0oaW50KVsgMTYsIDQwOTYgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtZGl2eCwgd2lkdGg9KGludClbIDE2LCA0MDk2IF0sIGhlaWdodD0oaW50KVsgMTYsIDQwOTYgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF0sIGRpdnh2ZXJzaW9uPShpbnQpWyAzLCA1IF07IHZpZGVvL3gtbXNtcGVnLCB3aWR0aD0oaW50KVsgMTYsIDQwOTYgXSwgaGVpZ2h0PShpbnQpWyAxNiwgNDA5NiBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgbXNtcGVndmVyc2lvbj0oaW50KVsgNDEsIDQzIF07IHZpZGVvL21wZWcsIHdpZHRoPShpbnQpWyAxNiwgNDA5NiBdLCBoZWlnaHQ9KGludClbIDE2LCA0MDk2IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCBtcGVndmVyc2lvbj0oaW50KXsgMSwgMiwgNCB9LCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2U7IHZpZGVvL3gtaDI2Mywgd2lkdGg9KGludClbIDE2LCA0MDk2IF0sIGhlaWdodD0oaW50KVsgMTYsIDQwOTYgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtaDI2NCwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWJ5dGUtc3RyZWFtLCBhbGlnbm1lbnQ9KHN0cmluZylhdSwgd2lkdGg9KGludClbIDE2LCA0MDk2IF0sIGhlaWdodD0oaW50KVsgMTYsIDQwOTYgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtZHYsIHdpZHRoPShpbnQpNzIwLCBoZWlnaHQ9KGludCl7IDU3NiwgNDgwIH0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2U7IHZpZGVvL3gtaHVmZnl1diwgd2lkdGg9KGludClbIDE2LCA0MDk2IF0sIGhlaWdodD0oaW50KVsgMTYsIDQwOTYgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtd212LCB3aWR0aD0oaW50KVsgMTYsIDQwOTYgXSwgaGVpZ2h0PShpbnQpWyAxNiwgNDA5NiBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd212dmVyc2lvbj0oaW50KVsgMSwgMyBdOyBpbWFnZS94LWpwYywgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXZwOCwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyBpbWFnZS9wbmcsIHdpZHRoPShpbnQpWyAxNiwgNDA5NiBdLCBoZWlnaHQ9KGludClbIDE2LCA0MDk2IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtbXN2aWRlbzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmF2aXN1YnRpdGxlPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkF2aSBzdWJ0aXRsZSBwYXJzZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BhcnNlci9TdWJ0aXRsZTwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGFyc2UgYXZpIHN1YnRpdGxlIHN0cmVhbTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlRoaWpzIFZlcm1laXIgJmx0O3RoaWpzdmVybWVpckBnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXN1YnRpdGxlLWF2aTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXN1YnRpdGxlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWNhY2FzaW5rLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNiY2UwZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWNhc2luay54bWwKQEAgLTAsMCArMSwyOCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+Y2FjYXNpbms8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5Db2xvcmVkIEFTQ0lJIEFydCB2aWRlbyBzaW5rPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2V4dC9saWJjYWNhLy5saWJzL2xpYmdzdGNhY2FzaW5rLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGNhY2FzaW5rLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5jYWNhc2luazwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BIGNvbG9yZWQgQVNDSUkgYXJ0IHZpZGVvIHNpbms8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNpbmsvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkEgY29sb3JlZCBBU0NJSSBhcnQgdmlkZW9zaW5rPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+WmVlc2hhbiBBbGkgJmx0O3phazE0N0B5YWhvby5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBSR0IsIEJHUiwgUkdCeCwgeFJHQiwgQkdSeCwgeEJHUiwgUkdCMTYsIFJHQjE1IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jYWlyby54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YzJhMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY2Fpcm8ueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmNhaXJvPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+Q2Fpcm8tYmFzZWQgZWxlbWVudHM8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZXh0L2NhaXJvLy5saWJzL2xpYmdzdGNhaXJvLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGNhaXJvLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5jYWlyb292ZXJsYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+Q2Fpcm8gb3ZlcmxheTwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VkaXRvci9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UmVuZGVyIG92ZXJsYXkgb24gYSB2aWRlbyBzdHJlYW0gdXNpbmcgQ2Fpcm88L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5Kb24gTm9yZGJ5ICZsdDtqb25vbm9yQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEJHUngsIEJHUkEsIFJHQjE2IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBCR1J4LCBCR1JBLCBSR0IxNiB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1jdXR0ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMGQyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tY3V0dGVyLnhtbApAQCAtMCwwICsxLDM0IEBACis8cGx1Z2luPgorICA8bmFtZT5jdXR0ZXI8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5BdWRpbyBDdXR0ZXIgdG8gc3BsaXQgYXVkaW8gaW50byBub24tc2lsZW50IGJpdHM8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L2N1dHRlci8ubGlicy9saWJnc3RjdXR0ZXIuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0Y3V0dGVyLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5jdXR0ZXI8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QXVkaW8gY3V0dGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWRpdG9yL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BdWRpbyBDdXR0ZXIgdG8gc3BsaXQgYXVkaW8gaW50byBub24tc2lsZW50IGJpdHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaG9tYXMgVmFuZGVyIFN0aWNoZWxlICZsdDt0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTOCwgUzE2TEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTOCwgUzE2TEUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kZWJ1Zy54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZDkxYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVidWcueG1sCkBAIC0wLDAgKzEsMTkwIEBACis8cGx1Z2luPgorICA8bmFtZT5kZWJ1ZzwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPmVsZW1lbnRzIGZvciB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmc8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L2RlYnVndXRpbHMvLmxpYnMvbGliZ3N0ZGVidWcuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0ZGVidWcuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmJyZWFrbXlkYXRhPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkJyZWFrIG15IGRhdGE8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlRlc3Rpbmc8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPnJhbmRvbWx5IGNoYW5nZSBkYXRhIGluIHRoZSBzdHJlYW08L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5CZW5qYW1pbiBPdHRlICZsdDtvdHRlQGdub21lJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmNhcHNzZXR0ZXI8L25hbWU+CisgICAgICA8bG9uZ25hbWU+Q2Fwc1NldHRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+R2VuZXJpYzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+U2V0L21lcmdlIGNhcHMgb24gc3RyZWFtPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+TWFyayBOYXV3ZWxhZXJ0cyAmbHQ7bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmNwdXJlcG9ydDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5DUFUgcmVwb3J0PC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5UZXN0aW5nPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5Qb3N0IGNwdSB1c2FnZSBpbmZvcm1hdGlvbiBldmVyeSBidWZmZXI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5aYWhlZXIgQWJiYXMgTWVyYWxpICZsdDt6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5uYXZzZWVrPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlNlZWsgYmFzZWQgb24gbGVmdC1yaWdodCBhcnJvd3M8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+U2VlayBiYXNlZCBvbiBuYXZpZ2F0aW9uIGtleXMgbGVmdC1yaWdodDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkphbiBTY2htaWR0ICZsdDt0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnByb2dyZXNzcmVwb3J0PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlByb2dyZXNzIHJlcG9ydDwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+VGVzdGluZzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGVyaW9kaWNhbGx5IHF1ZXJ5IGFuZCByZXBvcnQgb24gcHJvY2Vzc2luZyBwcm9ncmVzczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkphbiBTY2htaWR0ICZsdDt0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnB1c2hmaWxlc3JjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlB1c2ggRmlsZSBTb3VyY2U8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlRlc3Rpbmc8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkltcGxlbWVudHMgcHVzaGZpbGU6Ly8gVVJJLWhhbmRsZXIgZm9yIHB1c2gtYmFzZWQgZmlsZSBhY2Nlc3M8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaW0tUGhpbGlwcCBNw7xsbGVyICZsdDt0aW0gY2VudHJpY3VsYXIgbmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJuZGJ1ZmZlcnNpemU8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UmFuZG9tIGJ1ZmZlciBzaXplPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5UZXN0aW5nPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5wdWxsIHJhbmRvbSBzaXplZCBidWZmZXJzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U3RlZmFuIEtvc3QgJmx0O3N0ZWZhbi5rb3N0QG5va2lhLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT50YWdpbmplY3Q8L25hbWU+CisgICAgICA8bG9uZ25hbWU+VGFnSW5qZWN0PC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5HZW5lcmljPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5pbmplY3QgbWV0YWRhdGEgdGFnczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlN0ZWZhbiBLb3N0ICZsdDtlbnNvbmljQHVzZXJzLnNmLm5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT50ZXN0c2luazwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5UZXN0IHBsdWdpbjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+VGVzdGluZzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+cGVyZm9ybSBhIG51bWJlciBvZiB0ZXN0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkJlbmphbWluIE90dGUgJmx0O290dGVAZ25vbWUmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGVpbnRlcmxhY2UueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWM4M2U2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRlaW50ZXJsYWNlLnhtbApAQCAtMCwwICsxLDM0IEBACis8cGx1Z2luPgorICA8bmFtZT5kZWludGVybGFjZTwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkRlaW50ZXJsYWNlcjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvZGVpbnRlcmxhY2UvLmxpYnMvbGliZ3N0ZGVpbnRlcmxhY2Uuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0ZGVpbnRlcmxhY2Uuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmRlaW50ZXJsYWNlPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkRlaW50ZXJsYWNlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9WaWRlby9EZWludGVybGFjZTwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RGVpbnRlcmxhY2UgTWV0aG9kcyBwb3J0ZWQgZnJvbSBEU2NhbGVyL1R2VGltZTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPk1hcnRpbiBFaWtlcm1hbm4gJmx0O21laWtlckB1cGIuZGUmZ3Q7LCBTZWJhc3RpYW4gRHLDtmdlICZsdDtzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEFZVVYsIEFSR0IsIEFCR1IsIFJHQkEsIEJHUkEsIFk0NDQsIHhSR0IsIHhCR1IsIFJHQngsIEJHUngsIFJHQiwgQkdSLCBZVVkyLCBZVllVLCBVWVZZLCBZNDJCLCBJNDIwLCBZVjEyLCBZNDFCLCBOVjEyLCBOVjIxIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1yYXcoQU5ZKSwgZm9ybWF0PShzdHJpbmcpeyBJNDIwLCBZVjEyLCBZVVkyLCBVWVZZLCBBWVVWLCBSR0J4LCBCR1J4LCB4UkdCLCB4QkdSLCBSR0JBLCBCR1JBLCBBUkdCLCBBQkdSLCBSR0IsIEJHUiwgWTQxQiwgWTQyQiwgWVZZVSwgWTQ0NCwgdjIxMCwgdjIxNiwgTlYxMiwgTlYyMSwgR1JBWTgsIEdSQVkxNl9CRSwgR1JBWTE2X0xFLCB2MzA4LCBSR0IxNiwgQkdSMTYsIFJHQjE1LCBCR1IxNSwgVVlWUCwgQTQyMCwgUkdCOFAsIFlVVjksIFlWVTksIElZVTEsIEFSR0I2NCwgQVlVVjY0LCByMjEwLCBJNDIwXzEwQkUsIEk0MjBfMTBMRSwgSTQyMl8xMEJFLCBJNDIyXzEwTEUsIFk0NDRfMTBCRSwgWTQ0NF8xMExFLCBHQlIsIEdCUl8xMEJFLCBHQlJfMTBMRSwgTlYxNiwgTlYyNCwgTlYxMl82NFozMiwgQTQyMF8xMEJFLCBBNDIwXzEwTEUsIEE0MjJfMTBCRSwgQTQyMl8xMExFLCBBNDQ0XzEwQkUsIEE0NDRfMTBMRSwgTlY2MSwgUDAxMF8xMEJFLCBQMDEwXzEwTEUsIElZVTIsIFZZVVksIEdCUkEsIEdCUkFfMTBCRSwgR0JSQV8xMExFLCBHQlJfMTJCRSwgR0JSXzEyTEUsIEdCUkFfMTJCRSwgR0JSQV8xMkxFLCBJNDIwXzEyQkUsIEk0MjBfMTJMRSwgSTQyMl8xMkJFLCBJNDIyXzEyTEUsIFk0NDRfMTJCRSwgWTQ0NF8xMkxFIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBBWVVWLCBBUkdCLCBBQkdSLCBSR0JBLCBCR1JBLCBZNDQ0LCB4UkdCLCB4QkdSLCBSR0J4LCBCR1J4LCBSR0IsIEJHUiwgWVVZMiwgWVZZVSwgVVlWWSwgWTQyQiwgSTQyMCwgWVYxMiwgWTQxQiwgTlYxMiwgTlYyMSB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtcmF3KEFOWSksIGZvcm1hdD0oc3RyaW5nKXsgSTQyMCwgWVYxMiwgWVVZMiwgVVlWWSwgQVlVViwgUkdCeCwgQkdSeCwgeFJHQiwgeEJHUiwgUkdCQSwgQkdSQSwgQVJHQiwgQUJHUiwgUkdCLCBCR1IsIFk0MUIsIFk0MkIsIFlWWVUsIFk0NDQsIHYyMTAsIHYyMTYsIE5WMTIsIE5WMjEsIEdSQVk4LCBHUkFZMTZfQkUsIEdSQVkxNl9MRSwgdjMwOCwgUkdCMTYsIEJHUjE2LCBSR0IxNSwgQkdSMTUsIFVZVlAsIEE0MjAsIFJHQjhQLCBZVVY5LCBZVlU5LCBJWVUxLCBBUkdCNjQsIEFZVVY2NCwgcjIxMCwgSTQyMF8xMEJFLCBJNDIwXzEwTEUsIEk0MjJfMTBCRSwgSTQyMl8xMExFLCBZNDQ0XzEwQkUsIFk0NDRfMTBMRSwgR0JSLCBHQlJfMTBCRSwgR0JSXzEwTEUsIE5WMTYsIE5WMjQsIE5WMTJfNjRaMzIsIEE0MjBfMTBCRSwgQTQyMF8xMExFLCBBNDIyXzEwQkUsIEE0MjJfMTBMRSwgQTQ0NF8xMEJFLCBBNDQ0XzEwTEUsIE5WNjEsIFAwMTBfMTBCRSwgUDAxMF8xMExFLCBJWVUyLCBWWVVZLCBHQlJBLCBHQlJBXzEwQkUsIEdCUkFfMTBMRSwgR0JSXzEyQkUsIEdCUl8xMkxFLCBHQlJBXzEyQkUsIEdCUkFfMTJMRSwgSTQyMF8xMkJFLCBJNDIwXzEyTEUsIEk0MjJfMTJCRSwgSTQyMl8xMkxFLCBZNDQ0XzEyQkUsIFk0NDRfMTJMRSB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZGlyZWN0c291bmQueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRpcmVjdHNvdW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTljY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWRpcmVjdHNvdW5kLnhtbApAQCAtMCwwICsxLDIwIEBACis8cGx1Z2luPgorICA8bmFtZT5kaXJlY3Rzb3VuZDwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkRpcmVjdFNvdW5kIHBsdWdpbjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi93aW4zMi92czYvcmVsZWFzZS9saWJnc3RkaXJlY3Rzb3VuZC5kbGw8L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0ZGlyZWN0c291bmQuZGxsPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MC4xMC40LjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtYmFkPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIENWUzwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmRpcmVjdHNvdW5kc2luazwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5EaXJlY3RTb3VuZCBhdWRpbyBzaW5rPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5TaW5rL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5EaXJlY3RTb3VuZCBhdWRpbyBzaW5rPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U2ViYXN0aWVuIE1vdXR0ZSAmbHQ7c2ViYXN0aWVuQG1vdXR0ZS5uZXQmZ3Q7PC9hdXRob3I+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZHRtZi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2NDg0NQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdG1mLnhtbApAQCAtMCwwICsxLDY0IEBACis8cGx1Z2luPgorICA8bmFtZT5kdG1mPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+RFRNRiBwbHVnaW5zPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9kdG1mLy5saWJzL2xpYmdzdGR0bWYuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0ZHRtZi5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+ZHRtZnNyYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5EVE1GIHRvbmUgZ2VuZXJhdG9yPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Tb3VyY2UvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkdlbmVyYXRlcyBEVE1GIHRvbmVzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+WW91bmVzcyBBbGFvdWkgJmx0O3lvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzE2TEUsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludCkxPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwZHRtZmRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBEVE1GIHBhY2tldCBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yazwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+R2VuZXJhdGVzIERUTUYgU291bmQgZnJvbSB0ZWxlcGhvbmUtZXZlbnQgUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5Zb3VuZXNzIEFsYW91aSAmbHQ7eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KVsgMCwgMjE0NzQ4MzY0NyBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpVEVMRVBIT05FLUVWRU5UPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTMTZMRSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KTE8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBkdG1mc3JjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBEVE1GIHBhY2tldCBnZW5lcmF0b3I8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNvdXJjZS9OZXR3b3JrPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5HZW5lcmF0ZXMgUlRQIERUTUYgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlplZXNoYW4gQWxpICZsdDt6ZWVzaGFuLmFsaUBub2tpYS5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KVsgMCwgMjE0NzQ4MzY0NyBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpVEVMRVBIT05FLUVWRU5UPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWR2LnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzOTUwYwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1kdi54bWwKQEAgLTAsMCArMSw2MSBAQAorPHBsdWdpbj4KKyAgPG5hbWU+ZHY8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5EViBkZW11eGVyIGFuZCBkZWNvZGVyIGJhc2VkIG9uIGxpYmR2IChsaWJkdi5zZi5uZXQpPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2V4dC9kdi8ubGlicy9saWJnc3Rkdi5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3Rkdi5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+ZHZkZWM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+RFYgdmlkZW8gZGVjb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVjb2Rlci9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+VXNlcyBsaWJkdiB0byBkZWNvZGUgRFYgdmlkZW8gKHNtcHRlMzE0KSAobGliZHYuc291cmNlZm9yZ2UubmV0KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkVyaWsgV2FsdGhpbnNlbiAmbHQ7b21lZ2FAY3NlLm9naS5lZHUmZ3Q7LFdpbSBUYXltYW5zICZsdDt3aW1AZmx1ZW5kby5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LWR2LCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2U8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgWVVZMiwgQkdSeCwgUkdCIH0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAxLzEsIDYwLzEgXSwgd2lkdGg9KGludCk3MjAsIGhlaWdodD0oaW50KXsgNTc2LCA0ODAgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmR2ZGVtdXg8L25hbWU+CisgICAgICA8bG9uZ25hbWU+RFYgc3lzdGVtIHN0cmVhbSBkZW11eGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZW11eGVyPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5Vc2VzIGxpYmR2IHRvIHNlcGFyYXRlIERWIGF1ZGlvIGZyb20gRFYgdmlkZW8gKGxpYmR2LnNvdXJjZWZvcmdlLm5ldCk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5FcmlrIFdhbHRoaW5zZW4gJmx0O29tZWdhQGNzZS5vZ2kuZWR1Jmd0OywgV2ltIFRheW1hbnMgJmx0O3dpbUBmbHVlbmRvLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtZHYsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbil0cnVlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPmF1ZGlvPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMxNkxFLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KXsgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCBjaGFubmVscz0oaW50KXsgMiwgNCB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnZpZGVvPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1kdiwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVmZmVjdHYueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMjJhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZWZmZWN0di54bWwKQEAgLTAsMCArMSwyNjUgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmVmZmVjdHY8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5lZmZlY3QgcGx1Z2lucyBmcm9tIHRoZSBlZmZlY3R2IHByb2plY3Q8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L2VmZmVjdHYvLmxpYnMvbGliZ3N0ZWZmZWN0di5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RlZmZlY3R2LnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5hZ2luZ3R2PC9uYW1lPgorICAgICAgPGxvbmduYW1lPkFnaW5nVFYgZWZmZWN0PC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BZ2luZ1RWIGFkZHMgYWdlIHRvIHZpZGVvIGlucHV0IHVzaW5nIHNjcmF0Y2hlcyBhbmQgZHVzdDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNhbSBMYW50aW5nYSAmbHQ7c2xvdWtlbkBkZXZvbHV0aW9uLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEJHUngsIFJHQnggfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEJHUngsIFJHQnggfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+ZGljZXR2PC9uYW1lPgorICAgICAgPGxvbmduYW1lPkRpY2VUViBlZmZlY3Q8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPiZhcG9zO0RpY2VzJmFwb3M7IHRoZSBzY3JlZW4gdXAgaW50byBtYW55IHNtYWxsIHNxdWFyZXM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuYmUmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBSR0J4LCB4UkdCLCBCR1J4LCB4QkdSIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBSR0J4LCB4UkdCLCBCR1J4LCB4QkdSIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmVkZ2V0djwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5FZGdlVFYgZWZmZWN0PC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BcHBseSBlZGdlIGRldGVjdCBvbiB2aWRlbzwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BjaGVsbG8uYmUmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBCR1J4LCBSR0J4IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBCR1J4LCBSR0J4IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPm9wdHY8L25hbWU+CisgICAgICA8bG9uZ25hbWU+T3BUViBlZmZlY3Q8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPk9wdGljYWwgYXJ0IG1lZXRzIHJlYWwtdGltZSB2aWRlbyBlZmZlY3Q8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5GVUtVQ0hJLCBLZW50YXJvdSAmbHQ7ZnVrdWNoaUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQmZ3Q7LCBTZWJhc3RpYW4gRHLDtmdlICZsdDtzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEJHUngsIFJHQnggfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEJHUngsIFJHQnggfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cXVhcmt0djwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5RdWFya1RWIGVmZmVjdDwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+TW90aW9uIGRpc3NvbHZlcjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkZVS1VDSEksIEtlbnRhcm91ICZsdDtmdWt1Y2hpQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IHhSR0IsIHhCR1IsIEJHUngsIFJHQnggfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IHhSR0IsIHhCR1IsIEJHUngsIFJHQnggfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cmFkaW9hY3R2PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJhZGlvYWNUViBlZmZlY3Q8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPm1vdGlvbi1lbmxpZ2h0bWVudCBlZmZlY3Q8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5GVUtVQ0hJLCBLZW50YXJvdSAmbHQ7ZnVrdWNoaUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQmZ3Q7LCBTZWJhc3RpYW4gRHLDtmdlICZsdDtzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFJHQngsIEJHUnggfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFJHQngsIEJHUnggfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cmV2dHY8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UmV2VFYgZWZmZWN0PC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BIHZpZGVvIHdhdmVmb3JtIG1vbml0b3IgZm9yIGVhY2ggbGluZSBvZiB2aWRlbyBwcm9jZXNzZWQ8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuYmUmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBCR1J4LCBSR0J4IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBCR1J4LCBSR0J4IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJpcHBsZXR2PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJpcHBsZVRWIGVmZmVjdDwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UmlwcGxlVFYgZG9lcyByaXBwbGUgbWFyayBlZmZlY3Qgb24gdGhlIHZpZGVvIGlucHV0PC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RlVLVUNISSwgS2VudGFyb3UgJmx0O2Z1a3VjaGlAdXNlcnMuc291cmNlZm9yZ2UubmV0Jmd0OywgU2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBCR1J4LCBSR0J4LCB4QkdSLCB4UkdCIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBCR1J4LCBSR0J4LCB4QkdSLCB4UkdCIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnNoYWdhZGVsaWN0djwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5TaGFnYWRlbGljVFY8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPk9oIGJlaGF2ZSwgU2hhZ2VkZWxpY1RWIG1ha2VzIGltYWdlcyBzaGFnYWRlbGljITwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BjaGVsbG8uYmUmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpQkdSeCwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylCR1J4LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5zdHJlYWt0djwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5TdHJlYWtUViBlZmZlY3Q8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlN0cmVha1RWIG1ha2VzIGFmdGVyIGltYWdlcyBvZiBtb3Zpbmcgb2JqZWN0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkZVS1VDSEksIEtlbnRhcm91ICZsdDtmdWt1Y2hpQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCZndDssIFNlYmFzdGlhbiBEcsO2Z2UgJmx0O3NlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQkdSeCwgUkdCeCwgeEJHUiwgeFJHQiB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQkdSeCwgUkdCeCwgeEJHUiwgeFJHQiB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT52ZXJ0aWdvdHY8L25hbWU+CisgICAgICA8bG9uZ25hbWU+VmVydGlnb1RWIGVmZmVjdDwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+QSBsb29wYmFjayBhbHBoYSBibGVuZGluZyBlZmZlY3RvciB3aXRoIHJvdGF0aW5nIGFuZCBzY2FsaW5nPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmJlJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUkdCeCwgQkdSeCB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUkdCeCwgQkdSeCB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT53YXJwdHY8L25hbWU+CisgICAgICA8bG9uZ25hbWU+V2FycFRWIGVmZmVjdDwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+V2FycFRWIGRvZXMgcmVhbHRpbWUgZ29vJmFwb3M7aW5nIG9mIHRoZSB2aWRlbyBpbnB1dDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNhbSBMYW50aW5nYSAmbHQ7c2xvdWtlbkBkZXZvbHV0aW9uLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFJHQngsIHhSR0IsIEJHUngsIHhCR1IgfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFJHQngsIHhSR0IsIEJHUngsIHhCR1IgfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZXF1YWxpemVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTZiNjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWVxdWFsaXplci54bWwKQEAgLTAsMCArMSw3NiBAQAorPHBsdWdpbj4KKyAgPG5hbWU+ZXF1YWxpemVyPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+R1N0cmVhbWVyIGF1ZGlvIGVxdWFsaXplcnM8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L2VxdWFsaXplci8ubGlicy9saWJnc3RlcXVhbGl6ZXIuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0ZXF1YWxpemVyLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5lcXVhbGl6ZXItMTBiYW5kczwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT4xMCBCYW5kIEVxdWFsaXplcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RGlyZWN0IEZvcm0gMTAgYmFuZCBJSVIgZXF1YWxpemVyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U3RlZmFuIEtvc3QgJmx0O2Vuc29uaWNAdXNlcnMuc2YubmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzE2TEUsIEYzMkxFLCBGNjRMRSB9LCByYXRlPShpbnQpWyAxMDAwLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMxNkxFLCBGMzJMRSwgRjY0TEUgfSwgcmF0ZT0oaW50KVsgMTAwMCwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmVxdWFsaXplci0zYmFuZHM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+MyBCYW5kIEVxdWFsaXplcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RGlyZWN0IEZvcm0gMyBiYW5kIElJUiBlcXVhbGl6ZXI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TdGVmYW4gS29zdCAmbHQ7ZW5zb25pY0B1c2Vycy5zZi5uZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTMTZMRSwgRjMyTEUsIEY2NExFIH0sIHJhdGU9KGludClbIDEwMDAsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzE2TEUsIEYzMkxFLCBGNjRMRSB9LCByYXRlPShpbnQpWyAxMDAwLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+ZXF1YWxpemVyLW5iYW5kczwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5OIEJhbmQgRXF1YWxpemVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5EaXJlY3QgRm9ybSBJSVIgZXF1YWxpemVyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+QmVuamFtaW4gT3R0ZSAmbHQ7b3R0ZUBnbm9tZS5vcmcmZ3Q7LCBTdGVmYW4gS29zdCAmbHQ7ZW5zb25pY0B1c2Vycy5zZi5uZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTMTZMRSwgRjMyTEUsIEY2NExFIH0sIHJhdGU9KGludClbIDEwMDAsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzE2TEUsIEYzMkxFLCBGNjRMRSB9LCByYXRlPShpbnQpWyAxMDAwLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsYWMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MWEwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmxhYy54bWwKQEAgLTAsMCArMSw3NiBAQAorPHBsdWdpbj4KKyAgPG5hbWU+ZmxhYzwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPlRoZSBGTEFDIExvc3NsZXNzIGNvbXByZXNzb3IgQ29kZWM8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZXh0L2ZsYWMvLmxpYnMvbGliZ3N0ZmxhYy5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RmbGFjLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5mbGFjZGVjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkZMQUMgYXVkaW8gZGVjb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVjb2Rlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RGVjb2RlcyBGTEFDIGxvc3NsZXNzIGF1ZGlvIHN0cmVhbXM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaW0tUGhpbGlwcCBNw7xsbGVyICZsdDt0aW1AY2VudHJpY3VsYXIubmV0Jmd0OywgV2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtZmxhYywgZnJhbWVkPShib29sZWFuKXRydWUsIHJhdGU9KGludClbIDEsIDY1NTM1MCBdLCBjaGFubmVscz0oaW50KVsgMSwgOCBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFM4LCBTMTZMRSwgUzI0XzMyTEUsIFMzMkxFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyAxLCA2NTUzNTAgXSwgY2hhbm5lbHM9KGludClbIDEsIDggXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmZsYWNlbmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+RkxBQyBhdWRpbyBlbmNvZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9FbmNvZGVyL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FbmNvZGVzIGF1ZGlvIHdpdGggdGhlIEZMQUMgbG9zc2xlc3MgYXVkaW8gZW5jb2RlcjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BjaGVsbG8uYmUmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTOCwgUzE2TEUsIFMyNExFLCBTMjRfMzJMRSB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgMSwgNjU1MzUwIF0sIGNoYW5uZWxzPShpbnQpMTsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzgsIFMxNkxFLCBTMjRMRSwgUzI0XzMyTEUgfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDY1NTM1MCBdLCBjaGFubmVscz0oaW50KTIsIGNoYW5uZWwtbWFzaz0oYml0bWFzaykweDAwMDAwMDAwMDAwMDAwMDM7IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFM4LCBTMTZMRSwgUzI0TEUsIFMyNF8zMkxFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyAxLCA2NTUzNTAgXSwgY2hhbm5lbHM9KGludCkzLCBjaGFubmVsLW1hc2s9KGJpdG1hc2spMHgwMDAwMDAwMDAwMDAwMDA3OyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTOCwgUzE2TEUsIFMyNExFLCBTMjRfMzJMRSB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgMSwgNjU1MzUwIF0sIGNoYW5uZWxzPShpbnQpNCwgY2hhbm5lbC1tYXNrPShiaXRtYXNrKTB4MDAwMDAwMDAwMDAwMDAzMzsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzgsIFMxNkxFLCBTMjRMRSwgUzI0XzMyTEUgfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDY1NTM1MCBdLCBjaGFubmVscz0oaW50KTUsIGNoYW5uZWwtbWFzaz0oYml0bWFzaykweDAwMDAwMDAwMDAwMDAwMzc7IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFM4LCBTMTZMRSwgUzI0TEUsIFMyNF8zMkxFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyAxLCA2NTUzNTAgXSwgY2hhbm5lbHM9KGludCk2LCBjaGFubmVsLW1hc2s9KGJpdG1hc2spMHgwMDAwMDAwMDAwMDAwMDNmOyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTOCwgUzE2TEUsIFMyNExFLCBTMjRfMzJMRSB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgMSwgNjU1MzUwIF0sIGNoYW5uZWxzPShpbnQpNywgY2hhbm5lbC1tYXNrPShiaXRtYXNrKTB4MDAwMDAwMDAwMDAwMDEzZjsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzgsIFMxNkxFLCBTMjRMRSwgUzI0XzMyTEUgfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDY1NTM1MCBdLCBjaGFubmVscz0oaW50KTgsIGNoYW5uZWwtbWFzaz0oYml0bWFzaykweDAwMDAwMDAwMDAwMDBjM2Y8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1mbGFjPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+ZmxhY3RhZzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5GTEFDIHRhZ2dlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Rm9ybWF0dGVyL01ldGFkYXRhPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5SZXdyaXRlIHRhZ3MgaW4gYSBGTEFDIGZpbGU8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5DaHJpc3RvcGhlIEZlcmdlYXUgJmx0O3RldWZAZ25vbWUub3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1mbGFjPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtZmxhYzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWZsdi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3OTUyZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHYueG1sCkBAIC0wLDAgKzEsNjcgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmZsdjwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkZMViBtdXhpbmcgYW5kIGRlbXV4aW5nIHBsdWdpbjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvZmx2Ly5saWJzL2xpYmdzdGZsdi5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RmbHYuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmZsdmRlbXV4PC9uYW1lPgorICAgICAgPGxvbmduYW1lPkZMViBEZW11eGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZW11eGVyPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5EZW11eCBGTFYgZmVlZHMgaW50byBkaWdpdGFsIHN0cmVhbXM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5KdWxpZW4gTW91dHRlICZsdDtqdWxpZW5AbW91dHRlLm5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtZmx2PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPmF1ZGlvPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1hZHBjbSwgbGF5b3V0PShzdHJpbmcpc3dmLCBjaGFubmVscz0oaW50KXsgMSwgMiB9LCByYXRlPShpbnQpeyA1NTEyLCAxMTAyNSwgMjIwNTAsIDQ0MTAwIH07IGF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpMSwgbGF5ZXI9KGludCkzLCBjaGFubmVscz0oaW50KXsgMSwgMiB9LCByYXRlPShpbnQpeyA1NTEyLCA4MDAwLCAxMTAyNSwgMjIwNTAsIDQ0MTAwIH0sIHBhcnNlZD0oYm9vbGVhbil0cnVlOyBhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylyYXcsIGZyYW1lZD0oYm9vbGVhbil0cnVlOyBhdWRpby94LW5lbGx5bW9zZXIsIGNoYW5uZWxzPShpbnQpeyAxLCAyIH0sIHJhdGU9KGludCl7IDU1MTIsIDgwMDAsIDExMDI1LCAxNjAwMCwgMjIwNTAsIDQ0MTAwIH07IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFU4LCBTMTZMRSB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgY2hhbm5lbHM9KGludCl7IDEsIDIgfSwgcmF0ZT0oaW50KXsgNTUxMiwgMTEwMjUsIDIyMDUwLCA0NDEwMCB9OyBhdWRpby94LWFsYXcsIGNoYW5uZWxzPShpbnQpeyAxLCAyIH0sIHJhdGU9KGludCl7IDU1MTIsIDExMDI1LCAyMjA1MCwgNDQxMDAgfTsgYXVkaW8veC1tdWxhdywgY2hhbm5lbHM9KGludCl7IDEsIDIgfSwgcmF0ZT0oaW50KXsgNTUxMiwgMTEwMjUsIDIyMDUwLCA0NDEwMCB9OyBhdWRpby94LXNwZWV4LCBjaGFubmVscz0oaW50KTEsIHJhdGU9KGludCkxNjAwMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT52aWRlbzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtZmxhc2gtdmlkZW8sIGZsdnZlcnNpb249KGludCkxOyB2aWRlby94LWZsYXNoLXNjcmVlbjsgdmlkZW8veC12cDYtZmxhc2g7IHZpZGVvL3gtdnA2LWFscGhhOyB2aWRlby94LWgyNjQsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylhdmM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5mbHZtdXg8L25hbWU+CisgICAgICA8bG9uZ25hbWU+RkxWIG11eGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9NdXhlcjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+TXV4ZXMgdmlkZW8vYXVkaW8gc3RyZWFtcyBpbnRvIGEgRkxWIHN0cmVhbTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNlYmFzdGlhbiBEcsO2Z2UgJmx0O3NlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPmF1ZGlvPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWFkcGNtLCBsYXlvdXQ9KHN0cmluZylzd2YsIGNoYW5uZWxzPShpbnQpeyAxLCAyIH0sIHJhdGU9KGludCl7IDU1MTIsIDExMDI1LCAyMjA1MCwgNDQxMDAgfTsgYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCkxLCBsYXllcj0oaW50KTMsIGNoYW5uZWxzPShpbnQpeyAxLCAyIH0sIHJhdGU9KGludCl7IDU1MTIsIDgwMDAsIDExMDI1LCAyMjA1MCwgNDQxMDAgfSwgcGFyc2VkPShib29sZWFuKXRydWU7IGF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpeyA0LCAyIH0sIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylyYXc7IGF1ZGlvL3gtbmVsbHltb3NlciwgY2hhbm5lbHM9KGludCl7IDEsIDIgfSwgcmF0ZT0oaW50KXsgNTUxMiwgODAwMCwgMTEwMjUsIDE2MDAwLCAyMjA1MCwgNDQxMDAgfTsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgVTgsIFMxNkxFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCBjaGFubmVscz0oaW50KXsgMSwgMiB9LCByYXRlPShpbnQpeyA1NTEyLCAxMTAyNSwgMjIwNTAsIDQ0MTAwIH07IGF1ZGlvL3gtYWxhdywgY2hhbm5lbHM9KGludCl7IDEsIDIgfSwgcmF0ZT0oaW50KXsgNTUxMiwgMTEwMjUsIDIyMDUwLCA0NDEwMCB9OyBhdWRpby94LW11bGF3LCBjaGFubmVscz0oaW50KXsgMSwgMiB9LCByYXRlPShpbnQpeyA1NTEyLCAxMTAyNSwgMjIwNTAsIDQ0MTAwIH07IGF1ZGlvL3gtc3BlZXgsIGNoYW5uZWxzPShpbnQpMSwgcmF0ZT0oaW50KTE2MDAwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnZpZGVvPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LWZsYXNoLXZpZGVvOyB2aWRlby94LWZsYXNoLXNjcmVlbjsgdmlkZW8veC12cDYtZmxhc2g7IHZpZGVvL3gtdnA2LWFscGhhOyB2aWRlby94LWgyNjQsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylhdmM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1mbHY8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1mbHhkZWMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZjMxMGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tZmx4ZGVjLnhtbApAQCAtMCwwICsxLDM0IEBACis8cGx1Z2luPgorICA8bmFtZT5mbHhkZWM8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5GTEMvRkxJL0ZMWCB2aWRlbyBkZWNvZGVyPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9mbHgvLmxpYnMvbGliZ3N0Zmx4ZGVjLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGZseGRlYy5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+Zmx4ZGVjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkZMWCB2aWRlbyBkZWNvZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZWNvZGVyL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5GTEMvRkxJL0ZMWCB2aWRlbyBkZWNvZGVyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U2VwcCBXaWpuYW5kcyAmbHQ7bXJyYXp6QGdhcmJhZ2UtY29kZXJ6Lm5ldCZndDssIFplZXNoYW4gQWxpICZsdDt6ZWVuaXhAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1mbGk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUJHUngsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdka3BpeGJ1Zi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkZmJkNAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nZGtwaXhidWYueG1sCkBAIC0wLDAgKzEsNzAgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmdka3BpeGJ1ZjwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkdka1BpeGJ1Zi1iYXNlZCBpbWFnZSBkZWNvZGVyLCBvdmVybGF5IGFuZCBzaW5rPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2V4dC9nZGtfcGl4YnVmLy5saWJzL2xpYmdzdGdka3BpeGJ1Zi5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RnZGtwaXhidWYuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmdka3BpeGJ1ZmRlYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5HZGtQaXhidWYgaW1hZ2UgZGVjb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVjb2Rlci9JbWFnZTwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RGVjb2RlcyBpbWFnZXMgaW4gYSB2aWRlbyBzdHJlYW0gdXNpbmcgR2RrUGl4YnVmPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RGF2aWQgQS4gU2NobGVlZiAmbHQ7ZHNAc2NobGVlZi5vcmcmZ3Q7LCBSZW5hdG8gRmlsaG8gJmx0O3JlbmF0by5maWxob0BpbmR0Lm9yZy5iciZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmltYWdlL3BuZzsgaW1hZ2UveC1pY29uOyBhcHBsaWNhdGlvbi94LW5hdmktYW5pbWF0aW9uOyBpbWFnZS94LWNtdS1yYXN0ZXI7IGltYWdlL3gtc3VuLXJhc3RlcjsgaW1hZ2UveC1waXhtYXA7IGltYWdlL3RpZmY7IGltYWdlL3gtcG9ydGFibGUtYW55bWFwOyBpbWFnZS94LXBvcnRhYmxlLWJpdG1hcDsgaW1hZ2UveC1wb3J0YWJsZS1ncmF5bWFwOyBpbWFnZS94LXBvcnRhYmxlLXBpeG1hcDsgaW1hZ2UvYm1wOyBpbWFnZS94LWJtcDsgaW1hZ2UveC1NUy1ibXA7IGltYWdlL3ZuZC53YXAud2JtcDsgaW1hZ2UveC1iaXRtYXA7IGltYWdlL3gtdGdhOyBpbWFnZS94LXBjeDsgaW1hZ2Uvc3ZnOyBpbWFnZS9zdmcreG1sPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylSR0IsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVJHQkEsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmdka3BpeGJ1Zm92ZXJsYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+R2RrUGl4YnVmIE92ZXJsYXk8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPk92ZXJsYXkgYW4gaW1hZ2Ugb250byBhIHZpZGVvIHN0cmVhbTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlRpbS1QaGlsaXBwIE3DvGxsZXIgJmx0O3RpbSBjZW50cmljdWxhciBuZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBSR0J4LCBSR0IsIEJHUiwgQkdSeCwgeFJHQiwgeEJHUiwgUkdCQSwgQkdSQSwgQVJHQiwgQUJHUiwgSTQyMCwgWVYxMiwgQVlVViwgWVVZMiwgVVlWWSwgdjMwOCwgdjIxMCwgdjIxNiwgWTQxQiwgWTQyQiwgWTQ0NCwgWVZZVSwgTlYxMiwgTlYyMSwgVVlWUCwgUkdCMTYsIEJHUjE2LCBSR0IxNSwgQkdSMTUsIFVZVlAsIEE0MjAsIFlVVjksIFlWVTksIElZVTEsIEFSR0I2NCwgQVlVVjY0LCByMjEwLCBJNDIwXzEwTEUsIEk0MjBfMTBCRSwgR1JBWTgsIEdSQVkxNl9CRSwgR1JBWTE2X0xFIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBSR0J4LCBSR0IsIEJHUiwgQkdSeCwgeFJHQiwgeEJHUiwgUkdCQSwgQkdSQSwgQVJHQiwgQUJHUiwgSTQyMCwgWVYxMiwgQVlVViwgWVVZMiwgVVlWWSwgdjMwOCwgdjIxMCwgdjIxNiwgWTQxQiwgWTQyQiwgWTQ0NCwgWVZZVSwgTlYxMiwgTlYyMSwgVVlWUCwgUkdCMTYsIEJHUjE2LCBSR0IxNSwgQkdSMTUsIFVZVlAsIEE0MjAsIFlVVjksIFlWVTksIElZVTEsIEFSR0I2NCwgQVlVVjY0LCByMjEwLCBJNDIwXzEwTEUsIEk0MjBfMTBCRSwgR1JBWTgsIEdSQVkxNl9CRSwgR1JBWTE2X0xFIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmdka3BpeGJ1ZnNpbms8L25hbWU+CisgICAgICA8bG9uZ25hbWU+R2RrUGl4YnVmIHNpbms8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNpbmsvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPk91dHB1dCBpbWFnZXMgYXMgR2RrUGl4YnVmIG9iamVjdHMgaW4gYnVzIG1lc3NhZ2VzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGltLVBoaWxpcHAgTcO8bGxlciAmbHQ7dGltIGNlbnRyaWN1bGFyIG5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylSR0IsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVJHQkEsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODQzMTgxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20ueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmdvb208L25hbWU+CisgIDxkZXNjcmlwdGlvbj5HT09NIHZpc3VhbGl6YXRpb24gZmlsdGVyPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9nb29tLy5saWJzL2xpYmdzdGdvb20uc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0Z29vbS5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+Z29vbTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5HT09NOiB3aGF0IGEgR09PTSE8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlZpc3VhbGl6YXRpb248L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlRha2VzIGZyYW1lcyBvZiBkYXRhIGFuZCBvdXRwdXRzIHZpZGVvIGZyYW1lcyB1c2luZyB0aGUgR09PTSBmaWx0ZXI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltQGZsdWVuZG8uY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMxNkxFLCByYXRlPShpbnQpWyA4MDAwLCA5NjAwMCBdLCBjaGFubmVscz0oaW50KTEsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkOyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzE2TEUsIHJhdGU9KGludClbIDgwMDAsIDk2MDAwIF0sIGNoYW5uZWxzPShpbnQpMiwgY2hhbm5lbC1tYXNrPShiaXRtYXNrKTB4MDAwMDAwMDAwMDAwMDAwMywgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUJHUngsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1nb29tMmsxLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTA0NDc5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWdvb20yazEueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmdvb20yazE8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5HT09NIDJrMSB2aXN1YWxpemF0aW9uIGZpbHRlcjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvZ29vbTJrMS8ubGlicy9saWJnc3Rnb29tMmsxLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGdvb20yazEuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmdvb20yazE8L25hbWU+CisgICAgICA8bG9uZ25hbWU+R09PTTogd2hhdCBhIEdPT00hIDJrMSBlZGl0aW9uPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5WaXN1YWxpemF0aW9uPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5UYWtlcyBmcmFtZXMgb2YgZGF0YSBhbmQgb3V0cHV0cyB2aWRlbyBmcmFtZXMgdXNpbmcgdGhlIEdPT00gMmsxIGZpbHRlcjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW1AZmx1ZW5kby5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzE2TEUsIHJhdGU9KGludClbIDgwMDAsIDk2MDAwIF0sIGNoYW5uZWxzPShpbnQpMSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ7IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTMTZMRSwgcmF0ZT0oaW50KVsgODAwMCwgOTYwMDAgXSwgY2hhbm5lbHM9KGludCkyLCBjaGFubmVsLW1hc2s9KGJpdG1hc2spMHgwMDAwMDAwMDAwMDAwMDAzLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpQkdSeCwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWljeWRlbXV4LnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRlMjBkZgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pY3lkZW11eC54bWwKQEAgLTAsMCArMSwzNCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+aWN5ZGVtdXg8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5EZW11eCBJQ1kgdGFncyBmcm9tIGEgc3RyZWFtPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9pY3lkZW11eC8ubGlicy9saWJnc3RpY3lkZW11eC5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RpY3lkZW11eC5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+aWN5ZGVtdXg8L25hbWU+CisgICAgICA8bG9uZ25hbWU+SUNZIHRhZyBkZW11eGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZW11eGVyL01ldGFkYXRhPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5SZWFkIGFuZCBvdXRwdXQgSUNZIHRhZ3Mgd2hpbGUgZGVtdXhpbmcgdGhlIGNvbnRlbnRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+SmFuIFNjaG1pZHQgJmx0O3RoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20mZ3Q7LCBNaWNoYWVsIFNtaXRoICZsdDttc21pdGhAZmx1ZW5kby5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LWljeSwgbWV0YWRhdGEtaW50ZXJ2YWw9KGludClbIDAsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+c29tZXRpbWVzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taWQzZGVtdXgueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2FmMzdjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWlkM2RlbXV4LnhtbApAQCAtMCwwICsxLDM0IEBACis8cGx1Z2luPgorICA8bmFtZT5pZDNkZW11eDwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkRlbXV4IElEM3YxIGFuZCBJRDN2MiB0YWdzIGZyb20gYSBmaWxlPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9pZDNkZW11eC8ubGlicy9saWJnc3RpZDNkZW11eC5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RpZDNkZW11eC5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+aWQzZGVtdXg8L25hbWU+CisgICAgICA8bG9uZ25hbWU+SUQzIHRhZyBkZW11eGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZW11eGVyL01ldGFkYXRhPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5SZWFkIGFuZCBvdXRwdXQgSUQzdjEgYW5kIElEM3YyIHRhZ3Mgd2hpbGUgZGVtdXhpbmcgdGhlIGNvbnRlbnRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+SmFuIFNjaG1pZHQgJmx0O3RoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LWlkMzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taW1hZ2VmcmVlemUueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjg0NGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWltYWdlZnJlZXplLnhtbApAQCAtMCwwICsxLDM0IEBACis8cGx1Z2luPgorICA8bmFtZT5pbWFnZWZyZWV6ZTwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPlN0aWxsIGZyYW1lIHN0cmVhbSBnZW5lcmF0b3I8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L2ltYWdlZnJlZXplLy5saWJzL2xpYmdzdGltYWdlZnJlZXplLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGltYWdlZnJlZXplLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5pbWFnZWZyZWV6ZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5TdGlsbCBmcmFtZSBzdHJlYW0gZ2VuZXJhdG9yPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkdlbmVyYXRlcyBhIHN0aWxsIGZyYW1lIHN0cmVhbSBmcm9tIGFuIGltYWdlPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pbnRlcmxlYXZlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDQ0MjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWludGVybGVhdmUueG1sCkBAIC0wLDAgKzEsNTUgQEAKKzxwbHVnaW4+CisgIDxuYW1lPmludGVybGVhdmU8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5BdWRpbyBpbnRlcmxlYXZlci9kZWludGVybGVhdmVyPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9pbnRlcmxlYXZlLy5saWJzL2xpYmdzdGludGVybGVhdmUuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0aW50ZXJsZWF2ZS5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+ZGVpbnRlcmxlYXZlPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkF1ZGlvIGRlaW50ZXJsZWF2ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9Db252ZXJ0ZXIvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlNwbGl0cyBvbmUgaW50ZXJsZWF2ZWQgbXVsdGljaGFubmVsIGF1ZGlvIHN0cmVhbSBpbnRvIG1hbnkgbW9ubyBhdWRpbyBzdHJlYW1zPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+QW5keSBXaW5nbyAmbHQ7d2luZ28gYXQgcG9ib3guY29tJmd0OywgSWFpbiAmbHQ7aWFpbkBwcmV0dHlwZW9wbGUub3JnJmd0OywgU2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzgsIFU4LCBTMTZMRSwgUzE2QkUsIFUxNkxFLCBVMTZCRSwgUzI0XzMyTEUsIFMyNF8zMkJFLCBVMjRfMzJMRSwgVTI0XzMyQkUsIFMzMkxFLCBTMzJCRSwgVTMyTEUsIFUzMkJFLCBTMjRMRSwgUzI0QkUsIFUyNExFLCBVMjRCRSwgUzIwTEUsIFMyMEJFLCBVMjBMRSwgVTIwQkUsIFMxOExFLCBTMThCRSwgVTE4TEUsIFUxOEJFLCBGMzJMRSwgRjMyQkUsIEY2NExFLCBGNjRCRSB9LCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyY18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFM4LCBVOCwgUzE2TEUsIFMxNkJFLCBVMTZMRSwgVTE2QkUsIFMyNF8zMkxFLCBTMjRfMzJCRSwgVTI0XzMyTEUsIFUyNF8zMkJFLCBTMzJMRSwgUzMyQkUsIFUzMkxFLCBVMzJCRSwgUzI0TEUsIFMyNEJFLCBVMjRMRSwgVTI0QkUsIFMyMExFLCBTMjBCRSwgVTIwTEUsIFUyMEJFLCBTMThMRSwgUzE4QkUsIFUxOExFLCBVMThCRSwgRjMyTEUsIEYzMkJFLCBGNjRMRSwgRjY0QkUgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KTEsIGxheW91dD0oc3RyaW5nKXsgbm9uLWludGVybGVhdmVkLCBpbnRlcmxlYXZlZCB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+aW50ZXJsZWF2ZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BdWRpbyBpbnRlcmxlYXZlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0NvbnZlcnRlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+Rm9sZHMgbWFueSBtb25vIGNoYW5uZWxzIGludG8gb25lIGludGVybGVhdmVkIGF1ZGlvIHN0cmVhbTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkFuZHkgV2luZ28gJmx0O3dpbmdvIGF0IHBvYm94LmNvbSZndDssIFNlYmFzdGlhbiBEcsO2Z2UgJmx0O3Nsb21vQGNpcmN1bGFyLWNoYW9zLm9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KTEsIGZvcm1hdD0oc3RyaW5nKXsgUzgsIFU4LCBTMTZMRSwgUzE2QkUsIFUxNkxFLCBVMTZCRSwgUzI0XzMyTEUsIFMyNF8zMkJFLCBVMjRfMzJMRSwgVTI0XzMyQkUsIFMzMkxFLCBTMzJCRSwgVTMyTEUsIFUzMkJFLCBTMjRMRSwgUzI0QkUsIFUyNExFLCBVMjRCRSwgUzIwTEUsIFMyMEJFLCBVMjBMRSwgVTIwQkUsIFMxOExFLCBTMThCRSwgVTE4TEUsIFUxOEJFLCBGMzJMRSwgRjMyQkUsIEY2NExFLCBGNjRCRSB9LCBsYXlvdXQ9KHN0cmluZyl7IG5vbi1pbnRlcmxlYXZlZCwgaW50ZXJsZWF2ZWQgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmb3JtYXQ9KHN0cmluZyl7IFM4LCBVOCwgUzE2TEUsIFMxNkJFLCBVMTZMRSwgVTE2QkUsIFMyNF8zMkxFLCBTMjRfMzJCRSwgVTI0XzMyTEUsIFUyNF8zMkJFLCBTMzJMRSwgUzMyQkUsIFUzMkxFLCBVMzJCRSwgUzI0TEUsIFMyNEJFLCBVMjRMRSwgVTI0QkUsIFMyMExFLCBTMjBCRSwgVTIwTEUsIFUyMEJFLCBTMThMRSwgUzE4QkUsIFUxOExFLCBVMThCRSwgRjMyTEUsIEYzMkJFLCBGNjRMRSwgRjY0QkUgfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1pc29tcDQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YjljN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4taXNvbXA0LnhtbApAQCAtMCwwICsxLDIyOSBAQAorPHBsdWdpbj4KKyAgPG5hbWU+aXNvbXA0PC9uYW1lPgorICA8ZGVzY3JpcHRpb24+SVNPIGJhc2UgbWVkaWEgZmlsZSBmb3JtYXQgc3VwcG9ydCAobXA0LCAzZ3BwLCBxdCwgbWoyKTwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvaXNvbXA0Ly5saWJzL2xpYmdzdGlzb21wNC5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3Rpc29tcDQuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPjNncHBtdXg8L25hbWU+CisgICAgICA8bG9uZ25hbWU+M0dQUCBNdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvTXV4ZXI8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPk11bHRpcGxleCBhdWRpbyBhbmQgdmlkZW8gaW50byBhIDNHUFAgZmlsZTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlRoaWFnbyBTb3VzYSBTYW50b3MgJmx0O3RoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPmF1ZGlvXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9BTVIsIHJhdGU9KGludCk4MDAwLCBjaGFubmVscz0oaW50KVsgMSwgMiBdOyBhdWRpby9BTVItV0IsIHJhdGU9KGludCkxNjAwMCwgY2hhbm5lbHM9KGludClbIDEsIDIgXTsgYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCkxLCBsYXllcj0oaW50KTMsIGNoYW5uZWxzPShpbnQpWyAxLCAyIF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCk0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpcmF3LCBjaGFubmVscz0oaW50KVsgMSwgOCBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtYWMzLCBjaGFubmVscz0oaW50KVsgMSwgNiBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3VidGl0bGVfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnRleHQveC1yYXcsIGZvcm1hdD0oc3RyaW5nKXV0Zjg8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+dmlkZW9fJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtaDI2Mywgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCk0LCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2UsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtZGl2eCwgZGl2eHZlcnNpb249KGludCk1LCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWgyNjQsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylhdmMsIGFsaWdubWVudD0oc3RyaW5nKWF1LCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3F1aWNrdGltZSwgdmFyaWFudD0oc3RyaW5nKTNncHA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5pc21sbXV4PC9uYW1lPgorICAgICAgPGxvbmduYW1lPklTTUwgTXV4ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL011eGVyPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5NdWx0aXBsZXggYXVkaW8gYW5kIHZpZGVvIGludG8gYSBJU01MIGZpbGU8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaGlhZ28gU291c2EgU2FudG9zICZsdDt0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5iciZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5hdWRpb18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCkxLCBsYXllcj0oaW50KTMsIGNoYW5uZWxzPShpbnQpWyAxLCAyIF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCk0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpcmF3LCBjaGFubmVscz0oaW50KVsgMSwgOCBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+dmlkZW9fJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlLCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWRpdngsIGRpdnh2ZXJzaW9uPShpbnQpNSwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1oMjY0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpYXZjLCBhbGlnbm1lbnQ9KHN0cmluZylhdSwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby9xdWlja3RpbWUsIHZhcmlhbnQ9KHN0cmluZylpc28tZnJhZ21lbnRlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPm1qMm11eDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5NSjIgTXV4ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL011eGVyPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5NdWx0aXBsZXggYXVkaW8gYW5kIHZpZGVvIGludG8gYSBNSjIgZmlsZTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlRoaWFnbyBTb3VzYSBTYW50b3MgJmx0O3RoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPmF1ZGlvXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTMTZMRSwgUzE2QkUsIFM4LCBVOCB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgY2hhbm5lbHM9KGludClbIDEsIDIgXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnZpZGVvXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5pbWFnZS94LWoyYywgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgaW1hZ2UveC1qcGMsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8vbWoyPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+bXA0bXV4PC9uYW1lPgorICAgICAgPGxvbmduYW1lPk1QNCBNdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvTXV4ZXI8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPk11bHRpcGxleCBhdWRpbyBhbmQgdmlkZW8gaW50byBhIE1QNCBmaWxlPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGhpYWdvIFNvdXNhIFNhbnRvcyAmbHQ7dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnImZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+YXVkaW9fJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpMSwgbGF5ZXI9KGludClbIDEsIDMgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylyYXcsIGNoYW5uZWxzPShpbnQpWyAxLCA4IF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC1hYzMsIGNoYW5uZWxzPShpbnQpWyAxLCA2IF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC1hbGFjLCBjaGFubmVscz0oaW50KVsgMSwgMiBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtb3B1cywgY2hhbm5lbC1tYXBwaW5nLWZhbWlseT0oaW50KVsgMCwgMjU1IF0sIGNoYW5uZWxzPShpbnQpWyAxLCA4IF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zdWJ0aXRsZV8ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dGV4dC94LXJhdywgZm9ybWF0PShzdHJpbmcpdXRmODwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT52aWRlb18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCk0LCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2UsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtZGl2eCwgZGl2eHZlcnNpb249KGludCk1LCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWgyNjQsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylhdmMsIGFsaWdubWVudD0oc3RyaW5nKWF1LCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWgyNjUsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZyl7IGh2YzEsIGhldjEgfSwgYWxpZ25tZW50PShzdHJpbmcpYXUsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtbXA0LXBhcnQsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8vcXVpY2t0aW1lLCB2YXJpYW50PShzdHJpbmcpaXNvPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cXRkZW11eDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5RdWlja1RpbWUgZGVtdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVtdXhlcjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RGVtdWx0aXBsZXggYSBRdWlja1RpbWUgZmlsZSBpbnRvIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RGF2aWQgU2NobGVlZiAmbHQ7ZHNAc2NobGVlZi5vcmcmZ3Q7LCBXaW0gVGF5bWFucyAmbHQ7d2ltQGZsdWVuZG8uY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8vcXVpY2t0aW1lOyB2aWRlby9tajI7IGF1ZGlvL3gtbTRhOyBhcHBsaWNhdGlvbi94LTNncDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5hdWRpb18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zdWJ0aXRsZV8ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT52aWRlb18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnF0bW9vdnJlY292ZXI8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UVQgTW9vdiBSZWNvdmVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5VdGlsPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5SZWNvdmVycyB1bmZpbmlzaGVkIHF0bXV4IGZpbGVzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGhpYWdvIFNhbnRvcyAmbHQ7dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5xdG11eDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5RdWlja1RpbWUgTXV4ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL011eGVyPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5NdWx0aXBsZXggYXVkaW8gYW5kIHZpZGVvIGludG8gYSBRdWlja1RpbWUgZmlsZTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlRoaWFnbyBTb3VzYSBTYW50b3MgJmx0O3RoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPmF1ZGlvXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTMzJMRSwgUzMyQkUsIFMyNExFLCBTMjRCRSwgUzE2TEUsIFMxNkJFLCBTOCwgVTggfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIGNoYW5uZWxzPShpbnQpWyAxLCAyIF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzMyTEUsIFMzMkJFLCBTMjRMRSwgUzI0QkUsIFMxNkxFLCBTMTZCRSwgUzgsIFU4IH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCBjaGFubmVsLW1hc2s9KGJpdG1hc2spMHgwMDAwMDAwMDAwMDAwMDAwLCBjaGFubmVscz0oaW50KVsgMSwgMTYgXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTEsIGxheWVyPShpbnQpWyAxLCAzIF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCk0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpcmF3LCBjaGFubmVscz0oaW50KVsgMSwgOCBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtYWMzLCBjaGFubmVscz0oaW50KVsgMSwgNiBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtYWRwY20sIGxheW91dD0oc3RyaW5nKWR2aSwgYmxvY2tfYWxpZ249KGludClbIDY0LCA4MDk2IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC1hbGF3LCBjaGFubmVscz0oaW50KVsgMSwgMiBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtbXVsYXcsIGNoYW5uZWxzPShpbnQpWyAxLCAyIF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8vQU1SLCByYXRlPShpbnQpODAwMCwgY2hhbm5lbHM9KGludClbIDEsIDIgXTsgYXVkaW8vQU1SLVdCLCByYXRlPShpbnQpMTYwMDAsIGNoYW5uZWxzPShpbnQpWyAxLCAyIF07IGF1ZGlvL3gtYWxhYywgY2hhbm5lbHM9KGludClbIDEsIDIgXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LW9wdXMsIGNoYW5uZWwtbWFwcGluZy1mYW1pbHk9KGludClbIDAsIDI1NSBdLCBjaGFubmVscz0oaW50KVsgMSwgOCBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3VidGl0bGVfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnRleHQveC1yYXcsIGZvcm1hdD0oc3RyaW5nKXV0Zjg8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+dmlkZW9fJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFJHQiwgVVlWWSwgdjIxMCB9LCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZSwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1kaXZ4LCBkaXZ4dmVyc2lvbj0oaW50KTUsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtcHJvcmVzLCB2YXJpYW50PShzdHJpbmcpeyBzdGFuZGFyZCwgbHQsIGhxLCBwcm94eSwgNDQ0NCwgNDQ0NHhxIH0sIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtY2luZWZvcm0sIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtaDI2Mywgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1oMjY0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpYXZjLCBhbGlnbm1lbnQ9KHN0cmluZylhdSwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1oMjY1LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpeyBodmMxLCBoZXYxIH0sIGFsaWdubWVudD0oc3RyaW5nKWF1LCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXN2cSwgc3ZxdmVyc2lvbj0oaW50KTMsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtZHYsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZSwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgaW1hZ2UvanBlZywgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgaW1hZ2UvcG5nLCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXZwOCwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC12cDksIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtZGlyYWMsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtcXQtcGFydCwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby9xdWlja3RpbWUsIHZhcmlhbnQ9KHN0cmluZylhcHBsZTsgdmlkZW8vcXVpY2t0aW1lPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRweHF0ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIHBhY2tldCBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yazwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgUXVpY2t0aW1lIGF1ZGlvL3ZpZGVvIGZyb20gUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltQGZsdWVuZG8uY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgbWVkaWE9KHN0cmluZyl7IGF1ZGlvLCB2aWRlbyB9LCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZyl7IFgtUVQsIFgtUVVJQ0tUSU1FIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWphY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNTVmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tamFjay54bWwKQEAgLTAsMCArMSw0MyBAQAorPHBsdWdpbj4KKyAgPG5hbWU+amFjazwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkpBQ0sgYXVkaW8gZWxlbWVudHM8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZXh0L2phY2svLmxpYnMvbGliZ3N0amFjay5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RqYWNrLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5qYWNrYXVkaW9zaW5rPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkF1ZGlvIFNpbmsgKEphY2spPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5TaW5rL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5PdXRwdXQgYXVkaW8gdG8gYSBKQUNLIHNlcnZlcjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpRjMyTEUsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5qYWNrYXVkaW9zcmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QXVkaW8gU291cmNlIChKYWNrKTwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U291cmNlL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5DYXB0dXJlcyBhdWRpbyBmcm9tIGEgSkFDSyBzZXJ2ZXI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UcmlzdGFuIE1hdHRoZXdzICZsdDt0cmlzdGFuQHNhdC5xYy5jYSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpRjMyTEUsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tanBlZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwMzFkMwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1qcGVnLnhtbApAQCAtMCwwICsxLDU1IEBACis8cGx1Z2luPgorICA8bmFtZT5qcGVnPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+SlBlZyBwbHVnaW4gbGlicmFyeTwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9leHQvanBlZy8ubGlicy9saWJnc3RqcGVnLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGpwZWcuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmpwZWdkZWM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+SlBFRyBpbWFnZSBkZWNvZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZWNvZGVyL0ltYWdlPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5EZWNvZGUgaW1hZ2VzIGZyb20gSlBFRyBmb3JtYXQ8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltQGZsdWVuZG8uY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+aW1hZ2UvanBlZzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBJNDIwLCBSR0IsIEJHUiwgUkdCeCwgeFJHQiwgQkdSeCwgeEJHUiwgR1JBWTggfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+anBlZ2VuYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5KUEVHIGltYWdlIGVuY29kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0VuY29kZXIvSW1hZ2U8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkVuY29kZSBpbWFnZXMgaW4gSlBFRyBmb3JtYXQ8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAdHZkLmJlJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgSTQyMCwgWVYxMiwgWVVZMiwgVVlWWSwgWTQxQiwgWTQyQiwgWVZZVSwgWTQ0NCwgTlYyMSwgTlYxMiwgUkdCLCBCR1IsIFJHQngsIHhSR0IsIEJHUngsIHhCR1IsIEdSQVk4IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5pbWFnZS9qcGVnLCB3aWR0aD0oaW50KVsgMTYsIDY1NTM1IF0sIGhlaWdodD0oaW50KVsgMTYsIDY1NTM1IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdLCBzb2YtbWFya2VyPShpbnQpeyAwLCAxLCAyLCA5IH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGFtZS54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbGFtZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdmYzJlNgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sYW1lLnhtbApAQCAtMCwwICsxLDM0IEBACis8cGx1Z2luPgorICA8bmFtZT5sYW1lPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+RW5jb2RlIE1QM3Mgd2l0aCBMQU1FPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2V4dC9sYW1lLy5saWJzL2xpYmdzdGxhbWUuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0bGFtZS5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+bGFtZW1wM2VuYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5MLkEuTS5FLiBtcDMgZW5jb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRW5jb2Rlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+SGlnaC1xdWFsaXR5IGZyZWUgTVAzIGVuY29kZXI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TZWJhc3RpYW4gRHLDtmdlICZsdDtzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTMTZMRSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludCl7IDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCBjaGFubmVscz0oaW50KTE7IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTMTZMRSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludCl7IDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCBjaGFubmVscz0oaW50KTIsIGNoYW5uZWwtbWFzaz0oYml0bWFzaykweDAwMDAwMDAwMDAwMDAwMDM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCkxLCBsYXllcj0oaW50KTMsIHJhdGU9KGludCl7IDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCBjaGFubmVscz0oaW50KVsgMSwgMiBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLWxldmVsLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4YWU0MAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1sZXZlbC54bWwKQEAgLTAsMCArMSwzNCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+bGV2ZWw8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5BdWRpbyBsZXZlbCBwbHVnaW48L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L2xldmVsLy5saWJzL2xpYmdzdGxldmVsLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdGxldmVsLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5sZXZlbDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5MZXZlbDwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0FuYWx5emVyL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5STVMvUGVhay9EZWNheWluZyBQZWFrIExldmVsIG1lc3NhZ2VyIGZvciBhdWRpby9yYXc8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaG9tYXMgVmFuZGVyIFN0aWNoZWxlICZsdDt0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTOCwgUzE2TEUsIFMzMkxFLCBGMzJMRSwgRjY0TEUgfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTOCwgUzE2TEUsIFMzMkxFLCBGMzJMRSwgRjY0TEUgfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tYXRyb3NrYS54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZjZlMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbWF0cm9za2EueG1sCkBAIC0wLDAgKzEsMTMzIEBACis8cGx1Z2luPgorICA8bmFtZT5tYXRyb3NrYTwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPk1hdHJvc2thIGFuZCBXZWJNIHN0cmVhbSBoYW5kbGluZzwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvbWF0cm9za2EvLmxpYnMvbGliZ3N0bWF0cm9za2Euc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0bWF0cm9za2Euc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPm1hdHJvc2thZGVtdXg8L25hbWU+CisgICAgICA8bG9uZ25hbWU+TWF0cm9za2EgZGVtdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVtdXhlcjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RGVtdXhlcyBNYXRyb3NrYS9XZWJNIHN0cmVhbXMgaW50byB2aWRlby9hdWRpby9zdWJ0aXRsZXM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5HU3RyZWFtZXIgbWFpbnRhaW5lcnMgJmx0O2dzdHJlYW1lci1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LW1hdHJvc2thOyB2aWRlby94LW1hdHJvc2thOyB2aWRlby94LW1hdHJvc2thLTNkOyBhdWRpby93ZWJtOyB2aWRlby93ZWJtPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPmF1ZGlvXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnN1YnRpdGxlXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dGV4dC94LXJhdywgZm9ybWF0PShzdHJpbmcpcGFuZ28tbWFya3VwOyBhcHBsaWNhdGlvbi94LXNzYTsgYXBwbGljYXRpb24veC1hc3M7IGFwcGxpY2F0aW9uL3gtdXNmOyBzdWJwaWN0dXJlL3gtZHZkOyBzdWJwaWN0dXJlL3gtcGdzOyBzdWJ0aXRsZS94LWthdGU7IGFwcGxpY2F0aW9uL3gtc3VidGl0bGUtdW5rbm93bjwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT52aWRlb18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPm1hdHJvc2thbXV4PC9uYW1lPgorICAgICAgPGxvbmduYW1lPk1hdHJvc2thIG11eGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9NdXhlcjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+TXV4ZXMgdmlkZW8vYXVkaW8vc3VidGl0bGUgc3RyZWFtcyBpbnRvIGEgbWF0cm9za2Egc3RyZWFtPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+R1N0cmVhbWVyIG1haW50YWluZXJzICZsdDtnc3RyZWFtZXItZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPmF1ZGlvXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTEsIGxheWVyPShpbnQpWyAxLCAzIF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCl7IDIsIDQgfSwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKXJhdywgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LWFjMywgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LWVhYzMsIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC1kdHMsIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC12b3JiaXMsIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC1mbGFjLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtb3B1czsgYXVkaW8veC1zcGVleCwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBVOCwgUzE2QkUsIFMxNkxFLCBTMjRCRSwgUzI0TEUsIFMzMkJFLCBTMzJMRSwgRjMyTEUsIEY2NExFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtdHRhLCB3aWR0aD0oaW50KXsgOCwgMTYsIDI0IH0sIGNoYW5uZWxzPShpbnQpeyAxLCAyIH0sIHJhdGU9KGludClbIDgwMDAsIDk2MDAwIF07IGF1ZGlvL3gtcG4tcmVhbGF1ZGlvLCByYXZlcnNpb249KGludCl7IDEsIDIsIDggfSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LXdtYSwgd21hdmVyc2lvbj0oaW50KVsgMSwgMyBdLCBibG9ja19hbGlnbj0oaW50KVsgMCwgNjU1MzUgXSwgYml0cmF0ZT0oaW50KVsgMCwgNTI0Mjg4IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC1hbGF3LCBjaGFubmVscz0oaW50KXsgMSwgMiB9LCByYXRlPShpbnQpWyA4MDAwLCAxOTIwMDAgXTsgYXVkaW8veC1tdWxhdywgY2hhbm5lbHM9KGludCl7IDEsIDIgfSwgcmF0ZT0oaW50KVsgODAwMCwgMTkyMDAwIF07IGF1ZGlvL3gtYWRwY20sIGxheW91dD0oc3RyaW5nKWR2aSwgYmxvY2tfYWxpZ249KGludClbIDY0LCA4MTkyIF0sIGNoYW5uZWxzPShpbnQpeyAxLCAyIH0sIHJhdGU9KGludClbIDgwMDAsIDk2MDAwIF07IGF1ZGlvL0c3MjIsIGNoYW5uZWxzPShpbnQpMSwgcmF0ZT0oaW50KTE2MDAwOyBhdWRpby94LWFkcGNtLCBsYXlvdXQ9KHN0cmluZylnNzI2LCBjaGFubmVscz0oaW50KTEsIHJhdGU9KGludCk4MDAwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnN1YnRpdGxlXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5zdWJ0aXRsZS94LWthdGU7IHRleHQveC1yYXcsIGZvcm1hdD0oc3RyaW5nKXV0Zjg7IGFwcGxpY2F0aW9uL3gtc3NhOyBhcHBsaWNhdGlvbi94LWFzczsgYXBwbGljYXRpb24veC11c2Y7IHN1YnBpY3R1cmUveC1kdmQ7IGFwcGxpY2F0aW9uL3gtc3VidGl0bGUtdW5rbm93bjwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT52aWRlb18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCl7IDEsIDIsIDQgfSwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlLCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWgyNjQsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylhdmMsIGFsaWdubWVudD0oc3RyaW5nKWF1LCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWgyNjUsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylodmMxLCBhbGlnbm1lbnQ9KHN0cmluZylhdSwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1kaXZ4LCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LWh1ZmZ5dXYsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtZHYsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtaDI2Mywgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1tc21wZWcsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IGltYWdlL2pwZWcsIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtdGhlb3JhOyB2aWRlby94LWRpcmFjLCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXBuLXJlYWx2aWRlbywgcm12ZXJzaW9uPShpbnQpWyAxLCA0IF0sIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtdnA4LCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXZwOSwgd2lkdGg9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXTsgdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgWVVZMiwgSTQyMCwgWVYxMiwgVVlWWSwgQVlVViwgR1JBWTgsIEJHUiwgUkdCIH0sIHdpZHRoPShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDE2LCAyMTQ3NDgzNjQ3IF07IHZpZGVvL3gtcHJvcmVzLCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdOyB2aWRlby94LXdtdiwgd212dmVyc2lvbj0oaW50KVsgMSwgMyBdLCB3aWR0aD0oaW50KVsgMTYsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxNiwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtbWF0cm9za2E7IHZpZGVvL3gtbWF0cm9za2EtM2Q7IGF1ZGlvL3gtbWF0cm9za2E8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5tYXRyb3NrYXBhcnNlPC9uYW1lPgorICAgICAgPGxvbmduYW1lPk1hdHJvc2thIHBhcnNlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGFyc2VyPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXJzZXMgTWF0cm9za2EvV2ViTSBzdHJlYW1zIGludG8gdmlkZW8vYXVkaW8vc3VidGl0bGVzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+R1N0cmVhbWVyIG1haW50YWluZXJzICZsdDtnc3RyZWFtZXItZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1tYXRyb3NrYTsgdmlkZW8veC1tYXRyb3NrYTsgdmlkZW8veC1tYXRyb3NrYS0zZDsgYXVkaW8vd2VibTsgdmlkZW8vd2VibTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LW1hdHJvc2thOyB2aWRlby94LW1hdHJvc2thOyB2aWRlby94LW1hdHJvc2thLTNkOyBhdWRpby93ZWJtOyB2aWRlby93ZWJtPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+d2VibW11eDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5XZWJNIG11eGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9NdXhlcjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+TXV4ZXMgdmlkZW8gYW5kIGF1ZGlvIHN0cmVhbXMgaW50byBhIFdlYk0gc3RyZWFtPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+R1N0cmVhbWVyIG1haW50YWluZXJzICZsdDtnc3RyZWFtZXItZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPmF1ZGlvXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXZvcmJpcywgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LW9wdXMsIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zdWJ0aXRsZV8ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+c3VidGl0bGUveC1rYXRlOyB0ZXh0L3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl1dGY4OyBhcHBsaWNhdGlvbi94LXNzYTsgYXBwbGljYXRpb24veC1hc3M7IGFwcGxpY2F0aW9uL3gtdXNmOyBzdWJwaWN0dXJlL3gtZHZkOyBhcHBsaWNhdGlvbi94LXN1YnRpdGxlLXVua25vd248L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+dmlkZW9fJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtdnA4LCB3aWR0aD0oaW50KVsgMTYsIDQwOTYgXSwgaGVpZ2h0PShpbnQpWyAxNiwgNDA5NiBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC12cDksIHdpZHRoPShpbnQpWyAxNiwgNDA5NiBdLCBoZWlnaHQ9KGludClbIDE2LCA0MDk2IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LWF2MSwgd2lkdGg9KGludClbIDE2LCA0MDk2IF0sIGhlaWdodD0oaW50KVsgMTYsIDQwOTYgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8vd2VibTsgYXVkaW8vd2VibTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW1vbm9zY29wZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExMTYzNQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tb25vc2NvcGUueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxwbHVnaW4+CisgIDxuYW1lPm1vbm9zY29wZTwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPk1vbm9zY29wZSB2aXN1YWxpemF0aW9uPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9tb25vc2NvcGUvLmxpYnMvbGliZ3N0bW9ub3Njb3BlLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdG1vbm9zY29wZS5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMS4zPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgc291cmNlIHJlbGVhc2U8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5tb25vc2NvcGU8L25hbWU+CisgICAgICA8bG9uZ25hbWU+TW9ub3Njb3BlPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5WaXN1YWxpemF0aW9uPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5EaXNwbGF5cyBhIGhpZ2hseSBzdGFiaWxpc2VkIHdhdmVmb3JtIG9mIGF1ZGlvIGlucHV0PC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+UmljaGFyZCBCb3VsdG9uICZsdDtyaWNoYXJkQHRhcnRhcnVzLm9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTMTZMRSwgcmF0ZT0oaW50KVsgODAwMCwgOTYwMDAgXSwgY2hhbm5lbHM9KGludCkxLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpQkdSeCwgd2lkdGg9KGludCkyNTYsIGhlaWdodD0oaW50KTEyOCwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXBnMTIzLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tcGcxMjMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNDA5MDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXBnMTIzLnhtbApAQCAtMCwwICsxLDM0IEBACis8cGx1Z2luPgorICA8bmFtZT5tcGcxMjM8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5tcDMgZGVjb2RpbmcgYmFzZWQgb24gdGhlIG1wZzEyMyBsaWJyYXJ5PC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2V4dC9tcGcxMjMvLmxpYnMvbGliZ3N0bXBnMTIzLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdG1wZzEyMy5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+bXBnMTIzYXVkaW9kZWM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+bXBnMTIzIG1wMyBkZWNvZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZWNvZGVyL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5EZWNvZGVzIG1wMyBzdHJlYW1zIHVzaW5nIHRoZSBtcGcxMjMgbGlicmFyeTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkNhcmxvcyBSYWZhZWwgR2lhbmkgJmx0O2R2QHBzZXVkb3Rlcm1pbmFsLm9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpMSwgbGF5ZXI9KGludClbIDEsIDMgXSwgcmF0ZT0oaW50KXsgODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF0sIHBhcnNlZD0oYm9vbGVhbil0cnVlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMxNkxFLCBVMTZMRSwgUzMyTEUsIFUzMkxFLCBTMjRMRSwgVTI0TEUsIEYzMkxFIH0sIHJhdGU9KGludCl7IDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCBjaGFubmVscz0oaW50KVsgMSwgMiBdLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWxhdy54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZGRhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsYXcueG1sCkBAIC0wLDAgKzEsNTUgQEAKKzxwbHVnaW4+CisgIDxuYW1lPm11bGF3PC9uYW1lPgorICA8ZGVzY3JpcHRpb24+TXVMYXcgYXVkaW8gY29udmVyc2lvbiByb3V0aW5lczwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvbGF3Ly5saWJzL2xpYmdzdG11bGF3LnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdG11bGF3LnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5tdWxhd2RlYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5NdSBMYXcgYXVkaW8gZGVjb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVjb2Rlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+Q29udmVydCA4Yml0IG11IGxhdyB0byAxNmJpdCBQQ008L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5aYWhlZXIgQWJiYXMgTWVyYWxpICZsdDt6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtbXVsYXcsIHJhdGU9KGludClbIDgwMDAsIDE5MjAwMCBdLCBjaGFubmVscz0oaW50KVsgMSwgMiBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTMTZMRSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDgwMDAsIDE5MjAwMCBdLCBjaGFubmVscz0oaW50KVsgMSwgMiBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+bXVsYXdlbmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+TXUgTGF3IGF1ZGlvIGVuY29kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0VuY29kZXIvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkNvbnZlcnQgMTZiaXQgUENNIHRvIDhiaXQgbXUgbGF3PC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+WmFoZWVyIEFiYmFzIE1lcmFsaSAmbHQ7emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzE2TEUsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyA4MDAwLCAxOTIwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LW11bGF3LCByYXRlPShpbnQpWyA4MDAwLCAxOTIwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW11bHRpZmlsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRkMDFhMAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aWZpbGUueG1sCkBAIC0wLDAgKzEsMTEyIEBACis8cGx1Z2luPgorICA8bmFtZT5tdWx0aWZpbGU8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5SZWFkcy9Xcml0ZXMgYnVmZmVycyBmcm9tL3RvIHNlcXVlbnRpYWxseSBuYW1lZCBmaWxlczwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvbXVsdGlmaWxlLy5saWJzL2xpYmdzdG11bHRpZmlsZS5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RtdWx0aWZpbGUuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPm11bHRpZmlsZXNpbms8L25hbWU+CisgICAgICA8bG9uZ25hbWU+TXVsdGktRmlsZSBTaW5rPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5TaW5rL0ZpbGU8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPldyaXRlIGJ1ZmZlcnMgdG8gYSBzZXF1ZW50aWFsbHkgbmFtZWQgc2V0IG9mIGZpbGVzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RGF2aWQgU2NobGVlZiAmbHQ7ZHNAc2NobGVlZi5vcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5tdWx0aWZpbGVzcmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+TXVsdGktRmlsZSBTb3VyY2U8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNvdXJjZS9GaWxlPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5SZWFkIGEgc2VxdWVudGlhbGx5IG5hbWVkIHNldCBvZiBmaWxlcyBpbnRvIGJ1ZmZlcnM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5EYXZpZCBTY2hsZWVmICZsdDtkc0BzY2hsZWVmLm9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5zcGxpdGZpbGVzcmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+U3BsaXQtRmlsZSBTb3VyY2U8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNvdXJjZS9GaWxlPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5SZWFkIGEgc2VxdWVudGlhbGx5IG5hbWVkIHNldCBvZiBmaWxlcyBhcyBpZiBpdCB3YXMgb25lIGxhcmdlIGZpbGU8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaW0tUGhpbGlwcCBNw7xsbGVyICZsdDt0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5zcGxpdG11eHNpbms8L25hbWU+CisgICAgICA8bG9uZ25hbWU+U3BsaXQgTXV4aW5nIEJpbjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+R2VuZXJpYy9CaW4vTXV4ZXI8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkNvbnZlbmllbmNlIGJpbiB0aGF0IG11eGVzIGluY29taW5nIHN0cmVhbXMgaW50byBtdWx0aXBsZSB0aW1lL3NpemUgbGltaXRlZCBmaWxlczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkphbiBTY2htaWR0ICZsdDtqYW5AY2VudHJpY3VsYXIuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPmF1ZGlvXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3VidGl0bGVfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT52aWRlbzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+c3BsaXRtdXhzcmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+U3BsaXQgRmlsZSBEZW11eGluZyBCaW48L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkdlbmVyaWMvQmluL0RlbXV4ZXI8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlNvdXJjZSB0aGF0IHJlYWRzIGEgc2V0IG9mIGZpbGVzIGNyZWF0ZWQgYnkgc3BsaXRtdXhzaW5rPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+SmFuIFNjaG1pZHQgJmx0O2phbkBjZW50cmljdWxhci5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+YXVkaW9fJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+c29tZXRpbWVzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3VidGl0bGVfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+c29tZXRpbWVzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+dmlkZW88L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+c29tZXRpbWVzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1tdWx0aXBhcnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDU0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tbXVsdGlwYXJ0LnhtbApAQCAtMCwwICsxLDU1IEBACis8cGx1Z2luPgorICA8bmFtZT5tdWx0aXBhcnQ8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5tdWx0aXBhcnQgc3RyZWFtIG1hbmlwdWxhdGlvbjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvbXVsdGlwYXJ0Ly5saWJzL2xpYmdzdG11bHRpcGFydC5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RtdWx0aXBhcnQuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPm11bHRpcGFydGRlbXV4PC9uYW1lPgorICAgICAgPGxvbmduYW1lPk11bHRpcGFydCBkZW11eGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZW11eGVyPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5kZW11eCBtdWx0aXBhcnQgc3RyZWFtczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7LCBTam9lcmQgU2ltb25zICZsdDtzam9lcmRAbHVvbi5uZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5tdWx0aXBhcnQveC1taXhlZC1yZXBsYWNlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyY18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPm11bHRpcGFydG11eDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5NdWx0aXBhcnQgbXV4ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL011eGVyPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5tdXggbXVsdGlwYXJ0IHN0cmVhbXM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltQGZsdWVuZG8uY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbmtfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5tdWx0aXBhcnQveC1taXhlZC1yZXBsYWNlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW5hdmlnYXRpb250ZXN0LnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFkMmJmMQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1uYXZpZ2F0aW9udGVzdC54bWwKQEAgLTAsMCArMSwzNCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+bmF2aWdhdGlvbnRlc3Q8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5UZW1wbGF0ZSBmb3IgYSB2aWRlbyBmaWx0ZXI8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L2RlYnVndXRpbHMvLmxpYnMvbGliZ3N0bmF2aWdhdGlvbnRlc3Quc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0bmF2aWdhdGlvbnRlc3Quc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPm5hdmlnYXRpb250ZXN0PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlZpZGVvIG5hdmlnYXRpb24gdGVzdDwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+SGFuZGxlIG5hdmlnYXRpb24gZXZlbnRzIHNob3dpbmcgYSBibGFjayBzcXVhcmUgZm9sbG93aW5nIG1vdXNlIHBvaW50ZXI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5EYXZpZCBTY2hsZWVmICZsdDtkc0BzY2hsZWVmLm9yZyZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylJNDIwLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUk0MjAsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3M0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzVmNjdiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zczQueG1sCkBAIC0wLDAgKzEsNDMgQEAKKzxwbHVnaW4+CisgIDxuYW1lPm9zczQ8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5PcGVuIFNvdW5kIFN5c3RlbSAoT1NTKSB2ZXJzaW9uIDQgc3VwcG9ydCBmb3IgR1N0cmVhbWVyPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL3N5cy9vc3M0Ly5saWJzL2xpYmdzdG9zczQuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0b3NzNC5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+b3NzNHNpbms8L25hbWU+CisgICAgICA8bG9uZ25hbWU+T1NTIHY0IEF1ZGlvIFNpbms8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNpbmsvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPk91dHB1dCB0byBhIHNvdW5kIGNhcmQgdmlhIE9TUyB2ZXJzaW9uIDQ8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaW0tUGhpbGlwcCBNw7xsbGVyICZsdDt0aW0gY2VudHJpY3VsYXIgbmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1hbGF3LCByYXRlPShpbnQpWyAxLCAxOTIwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDQwOTYgXTsgYXVkaW8veC1tdWxhdywgcmF0ZT0oaW50KVsgMSwgMTkyMDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCA0MDk2IF07IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMzMkxFLCBTMzJCRSwgUzI0XzMyTEUsIFMyNF8zMkJFLCBTMjRMRSwgUzE2TEUsIFMxNkJFLCBVMTZMRSwgVTE2QkUsIFM4LCBVOCB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgMSwgMTkyMDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCA0MDk2IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5vc3M0c3JjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPk9TUyB2NCBBdWRpbyBTb3VyY2U8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNvdXJjZS9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+Q2FwdHVyZSBmcm9tIGEgc291bmQgY2FyZCB2aWEgT1NTIHZlcnNpb24gNDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlRpbS1QaGlsaXBwIE3DvGxsZXIgJmx0O3RpbSBjZW50cmljdWxhciBuZXQmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1hbGF3LCByYXRlPShpbnQpWyAxLCAxOTIwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDQwOTYgXTsgYXVkaW8veC1tdWxhdywgcmF0ZT0oaW50KVsgMSwgMTkyMDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCA0MDk2IF07IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMzMkxFLCBTMzJCRSwgUzI0XzMyTEUsIFMyNF8zMkJFLCBTMjRMRSwgUzE2TEUsIFMxNkJFLCBVMTZMRSwgVTE2QkUsIFM4LCBVOCB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgMSwgMTkyMDAwIF0sIGNoYW5uZWxzPShpbnQpWyAxLCA0MDk2IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tb3NzYXVkaW8ueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGRjYzNlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zc2F1ZGlvLnhtbApAQCAtMCwwICsxLDQzIEBACis8cGx1Z2luPgorICA8bmFtZT5vc3NhdWRpbzwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPk9TUyAoT3BlbiBTb3VuZCBTeXN0ZW0pIHN1cHBvcnQgZm9yIEdTdHJlYW1lcjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9zeXMvb3NzLy5saWJzL2xpYmdzdG9zc2F1ZGlvLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdG9zc2F1ZGlvLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5vc3NzaW5rPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkF1ZGlvIFNpbmsgKE9TUyk8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNpbmsvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPk91dHB1dCB0byBhIHNvdW5kIGNhcmQgdmlhIE9TUzwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkVyaWsgV2FsdGhpbnNlbiAmbHQ7b21lZ2FAY3NlLm9naS5lZHUmZ3Q7LCBXaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAY2hlbGxvLmJlJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzE2TEUsIFUxNkxFLCBTOCwgVTggfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludCkxOyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTMTZMRSwgVTE2TEUsIFM4LCBVOCB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KTIsIGNoYW5uZWwtbWFzaz0oYml0bWFzaykweDAwMDAwMDAwMDAwMDAwMDM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5vc3NzcmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+QXVkaW8gU291cmNlIChPU1MpPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Tb3VyY2UvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkNhcHR1cmUgZnJvbSBhIHNvdW5kIGNhcmQgdmlhIE9TUzwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkVyaWsgV2FsdGhpbnNlbiAmbHQ7b21lZ2FAY3NlLm9naS5lZHUmZ3Q7LCBXaW0gVGF5bWFucyAmbHQ7d2ltQGZsdWVuZG8uY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFMxNkxFLCBVMTZMRSwgUzgsIFU4IH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpMTsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzE2TEUsIFUxNkxFLCBTOCwgVTggfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludCkyLCBjaGFubmVsLW1hc2s9KGJpdG1hc2spMHgwMDAwMDAwMDAwMDAwMDAzPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zeGF1ZGlvLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3hhdWRpby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcxOGE0YQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3hhdWRpby54bWwKQEAgLTAsMCArMSwyNyBAQAorPHBsdWdpbj4KKyAgPG5hbWU+b3N4YXVkaW88L25hbWU+CisgIDxkZXNjcmlwdGlvbj5PU1ggKE1hYyBPUyBYKSBhdWRpbyBzdXBwb3J0IGZvciBHU3RyZWFtZXI8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vc3lzL29zeGF1ZGlvLy5saWJzL2xpYmdzdG9zeGF1ZGlvLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdG9zeGF1ZGlvLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MC4xMC41LjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBDVlMvcHJlcmVsZWFzZTwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPm9zeGF1ZGlvc2luazwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BdWRpbyBTaW5rIChPU1gpPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5TaW5rL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5PdXRwdXQgdG8gYSBzb3VuZCBjYXJkIGluIE9TIFg8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5aYWhlZXIgQWJiYXMgTWVyYWxpICZsdDt6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZyZndDs8L2F1dGhvcj4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5vc3hhdWRpb3NyYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5BdWRpbyBTb3VyY2UgKE9TWCk8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNvdXJjZS9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+SW5wdXQgZnJvbSBhIHNvdW5kIGNhcmQgaW4gT1MgWDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlphaGVlciBBYmJhcyBNZXJhbGkgJmx0O3phaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnJmd0OzwvYXV0aG9yPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLW9zeHZpZGVvLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3h2aWRlby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViZGVlYgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1vc3h2aWRlby54bWwKQEAgLTAsMCArMSwyMCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+b3N4dmlkZW88L25hbWU+CisgIDxkZXNjcmlwdGlvbj5PU1ggbmF0aXZlIHZpZGVvIG91dHB1dCBwbHVnaW48L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZXh0L29zeHZpZGVvLy5saWJzL2xpYmdzdG9zeHZpZGVvLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdG9zeHZpZGVvLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MC4xMC40PC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWJhZDwvc291cmNlPgorICA8cGFja2FnZT5Hc3RyZWFtZXI8L3BhY2thZ2U+CisgIDxvcmlnaW4+aHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmc8L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+b3N4dmlkZW9zaW5rPC9uYW1lPgorICAgICAgPGxvbmduYW1lPk9TWCBWaWRlbyBzaW5rPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5TaW5rL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5PU1ggbmF0aXZlIHZpZGVvc2luazwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlphaGVlciBBYmJhcyBNZXJhbGkgJmx0O3phaGVlcmFiYXMgYXQgbWVyYWxpIGRvdCBvcmcmZ3Q7PC9hdXRob3I+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1wbmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YTNlNDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcG5nLnhtbApAQCAtMCwwICsxLDU1IEBACis8cGx1Z2luPgorICA8bmFtZT5wbmc8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5QTkcgcGx1Z2luIGxpYnJhcnk8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZXh0L2xpYnBuZy8ubGlicy9saWJnc3Rwbmcuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0cG5nLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5wbmdkZWM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UE5HIGltYWdlIGRlY29kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlY29kZXIvSW1hZ2U8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkRlY29kZSBhIHBuZyB2aWRlbyBmcmFtZSB0byBhIHJhdyBpbWFnZTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW1AZmx1ZW5kby5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5pbWFnZS9wbmc8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUkdCQSwgUkdCLCBBUkdCNjQsIEdSQVk4LCBHUkFZMTZfQkUgfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cG5nZW5jPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlBORyBpbWFnZSBlbmNvZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9FbmNvZGVyL0ltYWdlPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FbmNvZGUgYSB2aWRlbyBmcmFtZSB0byBhIC5wbmcgaW1hZ2U8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5KZXJlbXkgU0lNT04gJmx0O2pzaW1vbjEzQHlhaG9vLmZyJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUkdCQSwgUkdCLCBHUkFZOCwgR1JBWTE2X0JFIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5pbWFnZS9wbmcsIHdpZHRoPShpbnQpWyAxNiwgMTAwMDAwMCBdLCBoZWlnaHQ9KGludClbIDE2LCAxMDAwMDAwIF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXB1bHNlYXVkaW8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MDY3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcHVsc2VhdWRpby54bWwKQEAgLTAsMCArMSw0MyBAQAorPHBsdWdpbj4KKyAgPG5hbWU+cHVsc2VhdWRpbzwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPlB1bHNlQXVkaW8gcGx1Z2luIGxpYnJhcnk8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZXh0L3B1bHNlLy5saWJzL2xpYmdzdHB1bHNlYXVkaW8uc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0cHVsc2VhdWRpby5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cHVsc2VzaW5rPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlB1bHNlQXVkaW8gQXVkaW8gU2luazwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U2luay9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGxheXMgYXVkaW8gdG8gYSBQdWxzZUF1ZGlvIHNlcnZlcjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkxlbm5hcnQgUG9ldHRlcmluZzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzE2TEUsIFMxNkJFLCBGMzJMRSwgRjMyQkUsIFMzMkxFLCBTMzJCRSwgUzI0TEUsIFMyNEJFLCBTMjRfMzJMRSwgUzI0XzMyQkUsIFU4IH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAzMiBdOyBhdWRpby94LWFsYXcsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDMyIF07IGF1ZGlvL3gtbXVsYXcsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDMyIF07IGF1ZGlvL3gtYWMzLCBmcmFtZWQ9KGJvb2xlYW4pdHJ1ZTsgYXVkaW8veC1lYWMzLCBmcmFtZWQ9KGJvb2xlYW4pdHJ1ZTsgYXVkaW8veC1kdHMsIGZyYW1lZD0oYm9vbGVhbil0cnVlLCBibG9jay1zaXplPShpbnQpeyA1MTIsIDEwMjQsIDIwNDggfTsgYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCkxLCBtcGVnYXVkaW92ZXJzaW9uPShpbnQpWyAxLCAzIF0sIHBhcnNlZD0oYm9vbGVhbil0cnVlOyBhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KXsgMiwgNCB9LCBmcmFtZWQ9KGJvb2xlYW4pdHJ1ZSwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWFkdHM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5wdWxzZXNyYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5QdWxzZUF1ZGlvIEF1ZGlvIFNvdXJjZTwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U291cmNlL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5DYXB0dXJlcyBhdWRpbyBmcm9tIGEgUHVsc2VBdWRpbyBzZXJ2ZXI8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5MZW5uYXJ0IFBvZXR0ZXJpbmc8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBTMTZMRSwgUzE2QkUsIEYzMkxFLCBGMzJCRSwgUzMyTEUsIFMzMkJFLCBTMjRMRSwgUzI0QkUsIFMyNF8zMkxFLCBTMjRfMzJCRSwgVTggfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDMyIF07IGF1ZGlvL3gtYWxhdywgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMzIgXTsgYXVkaW8veC1tdWxhdywgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMzIgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1yZXBsYXlnYWluLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWJhYWRhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJlcGxheWdhaW4ueG1sCkBAIC0wLDAgKzEsNzYgQEAKKzxwbHVnaW4+CisgIDxuYW1lPnJlcGxheWdhaW48L25hbWU+CisgIDxkZXNjcmlwdGlvbj5SZXBsYXlHYWluIHZvbHVtZSBub3JtYWxpemF0aW9uPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9yZXBsYXlnYWluLy5saWJzL2xpYmdzdHJlcGxheWdhaW4uc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0cmVwbGF5Z2Fpbi5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cmdhbmFseXNpczwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SZXBsYXlHYWluIGFuYWx5c2lzPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvQW5hbHl6ZXIvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBlcmZvcm0gdGhlIFJlcGxheUdhaW4gYW5hbHlzaXM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5SZW7DqSBTdGFkbGVyICZsdDttYWlsQHJlbmVzdGFkbGVyLmRlJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIFMxNkxFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCBjaGFubmVscz0oaW50KTEsIHJhdGU9KGludCl7IDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9OyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBGMzJMRSwgUzE2TEUgfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIGNoYW5uZWxzPShpbnQpMiwgY2hhbm5lbC1tYXNrPShiaXRtYXNrKTB4MDAwMDAwMDAwMDAwMDAwMywgcmF0ZT0oaW50KXsgODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIFMxNkxFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCBjaGFubmVscz0oaW50KTEsIHJhdGU9KGludCl7IDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9OyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBGMzJMRSwgUzE2TEUgfSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIGNoYW5uZWxzPShpbnQpMiwgY2hhbm5lbC1tYXNrPShiaXRtYXNrKTB4MDAwMDAwMDAwMDAwMDAwMywgcmF0ZT0oaW50KXsgODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5yZ2xpbWl0ZXI8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UmVwbGF5R2FpbiBsaW1pdGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BcHBseSBzaWduYWwgY29tcHJlc3Npb24gdG8gcmF3IGF1ZGlvIGRhdGE8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5SZW7DqSBTdGFkbGVyICZsdDttYWlsQHJlbmVzdGFkbGVyLmRlJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUYzMkxFLCBsYXlvdXQ9KHN0cmluZyl7IGludGVybGVhdmVkLCBub24taW50ZXJsZWF2ZWQgfSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylGMzJMRSwgbGF5b3V0PShzdHJpbmcpeyBpbnRlcmxlYXZlZCwgbm9uLWludGVybGVhdmVkIH0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJndm9sdW1lPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJlcGxheUdhaW4gdm9sdW1lPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BcHBseSBSZXBsYXlHYWluIHZvbHVtZSBhZGp1c3RtZW50PC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+UmVuw6kgU3RhZGxlciAmbHQ7bWFpbEByZW5lc3RhZGxlci5kZSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEYzMkxFLCBTMTZMRSB9LCBsYXlvdXQ9KHN0cmluZyl7IGludGVybGVhdmVkLCBub24taW50ZXJsZWF2ZWQgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEYzMkxFLCBTMTZMRSB9LCBsYXlvdXQ9KHN0cmluZyl7IGludGVybGVhdmVkLCBub24taW50ZXJsZWF2ZWQgfSwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWZhZWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cC54bWwKQEAgLTAsMCArMSwxODYxIEBACis8cGx1Z2luPgorICA8bmFtZT5ydHA8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5SZWFsLXRpbWUgcHJvdG9jb2wgcGx1Z2luczwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvcnRwLy5saWJzL2xpYmdzdHJ0cC5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RydHAuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPmFzdGVyaXNraDI2MzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgQXN0ZXJpc2sgSDI2MyBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIEgyNjMgdmlkZW8gZnJvbSBSVFAgYW5kIGVuY29kZXMgaW4gQXN0ZXJpc2sgSDI2MyBmb3JtYXQ8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5OZWlsIFN0cmF0Zm9yZCAmbHQ7bmVpbHNAdmlwYWRpYS5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjYzLTE5OTg8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1hc3Rlcmlza2gyNjM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBMMTZkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgYXVkaW8gZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyByYXcgYXVkaW8gZnJvbSBSVFAgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlplZXNoYW4gQWxpICZsdDt6YWsxNDdAeWFob28uY29tJmd0OyxXaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUwxNjsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludCl7IDEwLCAxMSB9LCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMxNkJFLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwTDE2cGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBhdWRpbyBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZC1lbmNvZGUgUmF3IGF1ZGlvIGludG8gUlRQIHBhY2tldHMgKFJGQyAzNTUxKTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzE2QkUsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTDE2LCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUwxNiwgcGF5bG9hZD0oaW50KTEwLCBjbG9jay1yYXRlPShpbnQpNDQxMDA7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTDE2LCBwYXlsb2FkPShpbnQpMTEsIGNsb2NrLXJhdGU9KGludCk0NDEwMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cEwyNGRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBhdWRpbyBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIHJhdyAyNC1iaXQgYXVkaW8gZnJvbSBSVFAgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlplZXNoYW4gQWxpICZsdDt6YWsxNDdAeWFob28uY29tJmd0OyxXaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OyxEYXZpZCBIb2xyb3lkICZsdDtkYXZlQGJhZGdlcnMtaW4tZm9pbC5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylMMjQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMyNEJFLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwTDI0cGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBhdWRpbyBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZC1lbmNvZGUgUmF3IDI0LWJpdCBhdWRpbyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgMzE5MCk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OyxEYXZpZCBIb2xyb3lkICZsdDtkYXZlQGJhZGdlcnMtaW4tZm9pbC5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTMjRCRSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylMMjQsIGNoYW5uZWxzPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBMOGRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBhdWRpbyBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIHJhdyBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+WmVlc2hhbiBBbGkgJmx0O3phazE0N0B5YWhvby5jb20mZ3Q7LFdpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7LCBHRSBJbnRlbGxpZ2VudCBQbGF0Zm9ybXMgRW1iZWRkZWQgU3lzdGVtcywgSW5jLjwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUw4PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylVOCwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cEw4cGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBhdWRpbyBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZC1lbmNvZGUgUmF3IGF1ZGlvIGludG8gUlRQIHBhY2tldHMgKFJGQyAzNTUxKTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7LCBHRSBJbnRlbGxpZ2VudCBQbGF0Zm9ybXMgRW1iZWRkZWQgU3lzdGVtcywgSW5jLjwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVU4LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUw4LCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwYWMzZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEFDMyBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIEFDMyBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgNDE4NCk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGNsb2NrLXJhdGU9KGludCl7IDMyMDAwLCA0NDEwMCwgNDgwMDAgfSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUFDMzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9hYzM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBhYzNwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEFDMyBhdWRpbyBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZCBBQzMgYXVkaW8gYXMgUlRQIHBhY2tldHMgKFJGQyA0MTg0KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9hYzM7IGF1ZGlvL3gtYWMzPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCl7IDMyMDAwLCA0NDEwMCwgNDgwMDAgfSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUFDMzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGFtcmRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBBTVIgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBBTVIgb3IgQU1SLVdCIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAzMjY3KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgY2xvY2stcmF0ZT0oaW50KTgwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylBTVIsIG9jdGV0LWFsaWduPShzdHJpbmcpMTsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGNsb2NrLXJhdGU9KGludCkxNjAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUFNUi1XQiwgb2N0ZXQtYWxpZ249KHN0cmluZykxPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL0FNUiwgY2hhbm5lbHM9KGludCkxLCByYXRlPShpbnQpODAwMDsgYXVkaW8vQU1SLVdCLCBjaGFubmVscz0oaW50KTEsIHJhdGU9KGludCkxNjAwMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGFtcnBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgQU1SIHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkLWVuY29kZSBBTVIgb3IgQU1SLVdCIGF1ZGlvIGludG8gUlRQIHBhY2tldHMgKFJGQyAzMjY3KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9BTVIsIGNoYW5uZWxzPShpbnQpMSwgcmF0ZT0oaW50KTgwMDA7IGF1ZGlvL0FNUi1XQiwgY2hhbm5lbHM9KGludCkxLCByYXRlPShpbnQpMTYwMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTgwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylBTVIsIGVuY29kaW5nLXBhcmFtcz0oc3RyaW5nKTEsIG9jdGV0LWFsaWduPShzdHJpbmcpMSwgY3JjPShzdHJpbmcpMCwgcm9idXN0LXNvcnRpbmc9KHN0cmluZykwLCBpbnRlcmxlYXZpbmc9KHN0cmluZykwLCBtb2RlLXNldD0oaW50KVsgMCwgNyBdLCBtb2RlLWNoYW5nZS1wZXJpb2Q9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbW9kZS1jaGFuZ2UtbmVpZ2hib3I9KHN0cmluZyl7IDAsIDEgfSwgbWF4cHRpbWU9KGludClbIDIwLCAyMTQ3NDgzNjQ3IF0sIHB0aW1lPShpbnQpWyAyMCwgMjE0NzQ4MzY0NyBdOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpMTYwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylBTVItV0IsIGVuY29kaW5nLXBhcmFtcz0oc3RyaW5nKTEsIG9jdGV0LWFsaWduPShzdHJpbmcpMSwgY3JjPShzdHJpbmcpMCwgcm9idXN0LXNvcnRpbmc9KHN0cmluZykwLCBpbnRlcmxlYXZpbmc9KHN0cmluZykwLCBtb2RlLXNldD0oaW50KVsgMCwgNyBdLCBtb2RlLWNoYW5nZS1wZXJpb2Q9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbW9kZS1jaGFuZ2UtbmVpZ2hib3I9KHN0cmluZyl7IDAsIDEgfSwgbWF4cHRpbWU9KGludClbIDIwLCAyMTQ3NDgzNjQ3IF0sIHB0aW1lPShpbnQpWyAyMCwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwYnZkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgQnJvYWRjb21Wb2ljZSBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIEJyb2FkY29tVm9pY2UgYXVkaW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDQyOTgpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUJWMTY7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpMTYwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylCVjMyPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtYnYsIG1vZGU9KGludCl7IDE2LCAzMiB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwYnZwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEJWIFBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYWNrZXRpemUgQnJvYWRjb21Wb2ljZSBhdWRpbyBzdHJlYW1zIGludG8gUlRQIHBhY2tldHMgKFJGQyA0Mjk4KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWJ2LCBtb2RlPShpbnQpeyAxNiwgMzIgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUJWMTY7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCkxNjAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUJWMzI8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBjZWx0ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIENFTFQgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBDRUxUIGF1ZGlvIGZyb20gUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGNsb2NrLXJhdGU9KGludClbIDMyMDAwLCA0ODAwMCBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpQ0VMVDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWNlbHQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBjZWx0cGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBDRUxUIHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkLWVuY29kZXMgQ0VMVCBhdWRpbyBpbnRvIGEgUlRQIHBhY2tldDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWNlbHQsIHJhdGU9KGludClbIDMyMDAwLCA2NDAwMCBdLCBjaGFubmVscz0oaW50KVsgMSwgMiBdLCBmcmFtZS1zaXplPShpbnQpWyA2NCwgNTEyIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KVsgMzIwMDAsIDQ4MDAwIF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylDRUxUPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwZHZkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgRFYgRGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5EZXBheWxvYWRzIERWIGZyb20gUlRQIHBhY2tldHMgKFJGQyAzMTg5KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPk1hcmNlbCBNb3JlYXV4ICZsdDttYXJjZWxtQHNwYWNlbGFicy5ubCZndDssIFdpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl7IHZpZGVvLCBhdWRpbyB9LCBlbmNvZGluZy1uYW1lPShzdHJpbmcpRFYsIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RlPShzdHJpbmcpeyBTRC1WQ1IvNTI1LTYwLCBTRC1WQ1IvNjI1LTUwLCBIRC1WQ1IvMTEyNS02MCwgSEQtVkNSLzEyNTAtNTAsIFNETC1WQ1IvNTI1LTYwLCBTREwtVkNSLzYyNS01MCwgMzA2TS81MjUtNjAsIDMwNk0vNjI1LTUwLCAzMTRNLTI1LzUyNS02MCwgMzE0TS0yNS82MjUtNTAsIDMxNE0tNTAvNTI1LTYwLCAzMTRNLTUwLzYyNS01MCB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtZHY8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBkdnBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgRFYgUGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWRzIERWIGludG8gUlRQIHBhY2tldHMgKFJGQyAzMTg5KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPk1hcmNlbCBNb3JlYXV4ICZsdDttYXJjZWxtQHNwYWNlbGFicy5ubCZndDssIFdpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LWR2PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXsgdmlkZW8sIGF1ZGlvIH0sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKURWLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kZT0oc3RyaW5nKXsgU0QtVkNSLzUyNS02MCwgU0QtVkNSLzYyNS01MCwgSEQtVkNSLzExMjUtNjAsIEhELVZDUi8xMjUwLTUwLCBTREwtVkNSLzUyNS02MCwgU0RMLVZDUi82MjUtNTAsIDMwNk0vNTI1LTYwLCAzMDZNLzYyNS01MCwgMzE0TS0yNS81MjUtNjAsIDMxNE0tMjUvNjI1LTUwLCAzMTRNLTUwLzUyNS02MCwgMzE0TS01MC82MjUtNTAgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGc3MjJkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgYXVkaW8gZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBHNzIyIGF1ZGlvIGZyb20gUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGNsb2NrLXJhdGU9KGludCk4MDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpRzcyMjsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludCk5LCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vRzcyMiwgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwZzcyMnBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgYXVkaW8gcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWQtZW5jb2RlIFJhdyBhdWRpbyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgMzU1MSk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vRzcyMiwgcmF0ZT0oaW50KTE2MDAwLCBjaGFubmVscz0oaW50KTE8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGVuY29kaW5nLW5hbWU9KHN0cmluZylHNzIyLCBwYXlsb2FkPShpbnQpOSwgZW5jb2RpbmctcGFyYW1zPShzdHJpbmcpMSwgY2xvY2stcmF0ZT0oaW50KTgwMDA7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpRzcyMiwgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBlbmNvZGluZy1wYXJhbXM9KHN0cmluZykxLCBjbG9jay1yYXRlPShpbnQpODAwMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGc3MjNkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgRy43MjMgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBHLjcyMyBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMzU1MSk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGNsb2NrLXJhdGU9KGludCk4MDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpRzcyMzsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludCk0LCBjbG9jay1yYXRlPShpbnQpODAwMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9HNzIzLCBjaGFubmVscz0oaW50KTEsIHJhdGU9KGludCk4MDAwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwZzcyM3BheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgRy43MjMgcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBhY2tldGl6ZSBHLjcyMyBhdWRpbyBpbnRvIFJUUCBwYWNrZXRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL0c3MjMsIGNoYW5uZWxzPShpbnQpMSwgcmF0ZT0oaW50KTgwMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludCk0LCBjbG9jay1yYXRlPShpbnQpODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUc3MjM7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk4MDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpRzcyMzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGc3MjZkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgRy43MjYgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBHLjcyNiBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+QXhpcyBDb21tdW5pY2F0aW9ucyAmbHQ7ZGV2LWdzdHJlYW1lckBheGlzLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpeyBHNzI2LCBHNzI2LTE2LCBHNzI2LTI0LCBHNzI2LTMyLCBHNzI2LTQwLCBBQUwyLUc3MjYtMTYsIEFBTDItRzcyNi0yNCwgQUFMMi1HNzI2LTMyLCBBQUwyLUc3MjYtNDAgfSwgY2xvY2stcmF0ZT0oaW50KTgwMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1hZHBjbSwgY2hhbm5lbHM9KGludCkxLCByYXRlPShpbnQpODAwMCwgYml0cmF0ZT0oaW50KXsgMTYwMDAsIDI0MDAwLCAzMjAwMCwgNDAwMDAgfSwgYmxvY2tfYWxpZ249KGludCl7IDIsIDMsIDQsIDUgfSwgbGF5b3V0PShzdHJpbmcpZzcyNjwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGc3MjZwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEcuNzI2IHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkLWVuY29kZXMgRy43MjYgYXVkaW8gaW50byBhIFJUUCBwYWNrZXQ8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5BeGlzIENvbW11bmljYXRpb25zICZsdDtkZXYtZ3N0cmVhbWVyQGF4aXMuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1hZHBjbSwgY2hhbm5lbHM9KGludCkxLCByYXRlPShpbnQpODAwMCwgYml0cmF0ZT0oaW50KXsgMTYwMDAsIDI0MDAwLCAzMjAwMCwgNDAwMDAgfSwgbGF5b3V0PShzdHJpbmcpZzcyNjwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKXsgRzcyNi0xNiwgRzcyNi0yNCwgRzcyNi0zMiwgRzcyNi00MCwgQUFMMi1HNzI2LTE2LCBBQUwyLUc3MjYtMjQsIEFBTDItRzcyNi0zMiwgQUFMMi1HNzI2LTQwIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBnNzI5ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEcuNzI5IGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgRy43MjkgYXVkaW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDM1NTEpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+TGF1cmVudCBHbGF5YWwgJmx0O3NwZ2xlZ2xlQHlhaG9vLmZyJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGNsb2NrLXJhdGU9KGludCk4MDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpRzcyOTsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludCkxOCwgY2xvY2stcmF0ZT0oaW50KTgwMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vRzcyOSwgY2hhbm5lbHM9KGludCkxLCByYXRlPShpbnQpODAwMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGc3MjlwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEcuNzI5IHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYWNrZXRpemUgRy43MjkgYXVkaW8gaW50byBSVFAgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPk9saXZpZXIgQ3JldGUgJmx0O29saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vRzcyOSwgY2hhbm5lbHM9KGludCkxLCByYXRlPShpbnQpODAwMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KTE4LCBjbG9jay1yYXRlPShpbnQpODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUc3Mjk7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk4MDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpRzcyOTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGdzbWRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBHU00gZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBHU00gYXVkaW8gZnJvbSBSVFAgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlplZXNoYW4gQWxpICZsdDt6ZWVuaXhAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGNsb2NrLXJhdGU9KGludCk4MDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpR1NNOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KTMsIGNsb2NrLXJhdGU9KGludCk4MDAwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtZ3NtLCByYXRlPShpbnQpODAwMCwgY2hhbm5lbHM9KGludCkxPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwZ3NtcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBHU00gcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWQtZW5jb2RlcyBHU00gYXVkaW8gaW50byBhIFJUUCBwYWNrZXQ8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5aZWVzaGFuIEFsaSAmbHQ7emVlbml4QGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtZ3NtLCByYXRlPShpbnQpODAwMCwgY2hhbm5lbHM9KGludCkxPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpMywgY2xvY2stcmF0ZT0oaW50KTgwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylHU007IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk4MDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpR1NNPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwZ3N0ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+R1N0cmVhbWVyIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBHU3RyZWFtZXIgYnVmZmVycyBmcm9tIFJUUCBwYWNrZXRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWFwcGxpY2F0aW9uLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylYLUdTVDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBnc3RwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEdTdHJlYW1lciBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZCBHU3RyZWFtZXIgYnVmZmVycyBhcyBSVFAgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXBwbGljYXRpb24sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpWC1HU1Q8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBoMjYxZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEgyNjEgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBIMjYxIHZpZGVvIGZyb20gUlRQIHBhY2tldHMgKFJGQyA0NTg3KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlN0aWFuIFNlbG5lcyAmbHQ7c3RpYW5AcGV4aXAuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludCkzMSwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpSDI2MTsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpSDI2MTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LWgyNjE8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBoMjYxcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBIMjYxIHBhY2tldCBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZC1lbmNvZGVzIEgyNjEgdmlkZW8gaW4gUlRQIHBhY2tldHMgKFJGQyA0NTg3KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlN0aWFuIFNlbG5lcyAmbHQ7c3RpYW5AcGV4aXAuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1oMjYxPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpMzEsIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjE7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjE8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBoMjYzZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEgyNjMgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBIMjYzIHZpZGVvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAyMTkwKTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlBoaWxpcHBlIEthbGFmICZsdDtwaGlsaXBwZS5rYWxhZkBjb2xsYWJvcmEuY28udWsmZ3Q7LCBFZHdhcmQgSGVydmV5ICZsdDtiaWxib2VkQGJpbGJvZWQuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludCkzNCwgY2xvY2stcmF0ZT0oaW50KTkwMDAwOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpSDI2MzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LWgyNjMsIHZhcmlhbnQ9KHN0cmluZylpdHUsIGgyNjN2ZXJzaW9uPShzdHJpbmcpaDI2MzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGgyNjNwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEgyNjMgcGFja2V0IHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkLWVuY29kZXMgSDI2MyB2aWRlbyBpbiBSVFAgcGFja2V0cyAoUkZDIDIxOTApPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+TmVpbCBTdHJhdGZvcmQgJmx0O25laWxzQHZpcGFkaWEuY29tJmd0O0RlamFuIFNha2Vsc2FrICZsdDtkZWphbi5zYWtlbHNha0BtYXJhbmQuc2kmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LWgyNjMsIHZhcmlhbnQ9KHN0cmluZylpdHUsIGgyNjN2ZXJzaW9uPShzdHJpbmcpaDI2MzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgcGF5bG9hZD0oaW50KTM0LCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjYzOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjYzPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwaDI2M3BkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgSDI2MyBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIEgyNjMvKy8rKyB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgNDYyOSk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjMtMTk5ODsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjMtMjAwMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LWgyNjMsIHZhcmlhbnQ9KHN0cmluZylpdHU8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBoMjYzcHBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgSDI2MyBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZC1lbmNvZGVzIEgyNjMvKy8rKyB2aWRlbyBpbiBSVFAgcGFja2V0cyAoUkZDIDQ2MjkpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtaDI2MywgdmFyaWFudD0oc3RyaW5nKWl0dTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjYzLTE5OTg7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjMtMjAwMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGgyNjRkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgSDI2NCBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIEgyNjQgdmlkZW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDM5ODQpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjY0PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtaDI2NCwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWF2YywgYWxpZ25tZW50PShzdHJpbmcpYXU7IHZpZGVvL3gtaDI2NCwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWJ5dGUtc3RyZWFtLCBhbGlnbm1lbnQ9KHN0cmluZyl7IG5hbCwgYXUgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGgyNjRwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEgyNjQgcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWQtZW5jb2RlIEgyNjQgdmlkZW8gaW50byBSVFAgcGFja2V0cyAoUkZDIDM5ODQpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+TGF1cmVudCBHbGF5YWwgJmx0O3NwZ2xlZ2xlQHlhaG9vLmZyJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1oMjY0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpYXZjLCBhbGlnbm1lbnQ9KHN0cmluZylhdTsgdmlkZW8veC1oMjY0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpYnl0ZS1zdHJlYW0sIGFsaWdubWVudD0oc3RyaW5nKXsgbmFsLCBhdSB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBoMjY1ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEgyNjUgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBIMjY1IHZpZGVvIGZyb20gUlRQIHBhY2tldHMgKFJGQyA3Nzk4KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkp1cmdlbiBTbG93YWNrICZsdDtqdXJnZW5zbG93YWNrQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjY1PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtaDI2NSwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWh2YzEsIGFsaWdubWVudD0oc3RyaW5nKWF1OyB2aWRlby94LWgyNjUsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylieXRlLXN0cmVhbSwgYWxpZ25tZW50PShzdHJpbmcpeyBuYWwsIGF1IH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBoMjY1cGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBIMjY1IHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkLWVuY29kZSBIMjY1IHZpZGVvIGludG8gUlRQIHBhY2tldHMgKFJGQyA3Nzk4KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkp1cmdlbiBTbG93YWNrICZsdDtqdXJnZW5zbG93YWNrQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtaDI2NSwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWh2YzEsIGFsaWdubWVudD0oc3RyaW5nKWF1OyB2aWRlby94LWgyNjUsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylieXRlLXN0cmVhbSwgYWxpZ25tZW50PShzdHJpbmcpeyBuYWwsIGF1IH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpSDI2NTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGlsYmNkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgaUxCQyBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIGlMQkMgYXVkaW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDM5NTIpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+UGhpbGlwcGUgS2FsYWYgJmx0O3BoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUlMQkM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1pTEJDLCBtb2RlPShpbnQpeyAyMCwgMzAgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGlsYmNwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIGlMQkMgUGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBhY2tldGl6ZSBpTEJDIGF1ZGlvIHN0cmVhbXMgaW50byBSVFAgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlBoaWxpcHBlIEthbGFmICZsdDtwaGlsaXBwZS5rYWxhZkBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWlMQkMsIG1vZGU9KGludCl7IDIwLCAzMCB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk4MDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpSUxCQywgbW9kZT0oc3RyaW5nKXsgMjAsIDMwIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBqMmtkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgSlBFRyAyMDAwIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgSlBFRyAyMDAwIHZpZGVvIGZyb20gUlRQIHBhY2tldHMgKFJGQyA1MzcxKTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBzYW1wbGluZz0oc3RyaW5nKXsgUkdCLCBCR1IsIFJHQkEsIEJHUkEsIFlDYkNyQSwgWUNiQ3ItNDo0OjQsIFlDYkNyLTQ6MjoyLCBZQ2JDci00OjI6MCwgWUNiQ3ItNDoxOjEsIEdSQVlTQ0FMRSB9LCBlbmNvZGluZy1uYW1lPShzdHJpbmcpSlBFRzIwMDA7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGNvbG9yc3BhY2U9KHN0cmluZyl7IHNSR0IsIHNZVVYsIEdSQVkgfSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUpQRUcyMDAwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmltYWdlL3gtanBjLCBjb2xvcnNwYWNlPShzdHJpbmcpeyBzUkdCLCBzWVVWLCBHUkFZIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBqMmtwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEpQRUcgMjAwMCBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZC1lbmNvZGVzIEpQRUcgMjAwMCBwaWN0dXJlcyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgNTM3MSk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+aW1hZ2UveC1qcGMsIHNhbXBsaW5nPShzdHJpbmcpeyBSR0IsIEJHUiwgUkdCQSwgQkdSQSwgWUNiQ3JBLCBZQ2JDci00OjQ6NCwgWUNiQ3ItNDoyOjIsIFlDYkNyLTQ6MjowLCBZQ2JDci00OjE6MSwgR1JBWVNDQUxFIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBzYW1wbGluZz0oc3RyaW5nKXsgUkdCLCBCR1IsIFJHQkEsIEJHUkEsIFlDYkNyQSwgWUNiQ3ItNDo0OjQsIFlDYkNyLTQ6MjoyLCBZQ2JDci00OjI6MCwgWUNiQ3ItNDoxOjEsIEdSQVlTQ0FMRSB9LCBlbmNvZGluZy1uYW1lPShzdHJpbmcpSlBFRzIwMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBqcGVnZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIEpQRUcgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBKUEVHIHZpZGVvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAyNDM1KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpSlBFRzsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludCkyNiwgY2xvY2stcmF0ZT0oaW50KTkwMDAwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmltYWdlL2pwZWc8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBqcGVncGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBKUEVHIHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkLWVuY29kZXMgSlBFRyBwaWN0dXJlcyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgMjQzNSk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5BeGlzIENvbW11bmljYXRpb25zICZsdDtkZXYtZ3N0cmVhbWVyQGF4aXMuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+aW1hZ2UvanBlZzsgdmlkZW8veC1qcGVnPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpMjYsIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUpQRUcsIHdpZHRoPShpbnQpWyAxLCA2NTUzNiBdLCBoZWlnaHQ9KGludClbIDEsIDY1NTM2IF07IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUpQRUcsIHdpZHRoPShpbnQpWyAxLCA2NTUzNiBdLCBoZWlnaHQ9KGludClbIDEsIDY1NTM2IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBrbHZkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgS0xWIERlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgS0xWIChTTVBURSBTVCAzMzYpIG1ldGFkYXRhIGZyb20gUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaW0tUGhpbGlwcCBNw7xsbGVyICZsdDt0aW1AY2VudHJpY3VsYXIuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXBwbGljYXRpb24sIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKVNNUFRFMzM2TTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5tZXRhL3gta2x2LCBwYXJzZWQ9KGJvb2xlYW4pdHJ1ZTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGtsdnBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgS0xWIFBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkcyBLTFYgKFNNUFRFIFNUIDMzNikgbWV0YWRhdGEgYXMgUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaW0tUGhpbGlwcCBNw7xsbGVyICZsdDt0aW1AY2VudHJpY3VsYXIuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+bWV0YS94LWtsdiwgcGFyc2VkPShib29sZWFuKXRydWU8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXBwbGljYXRpb24sIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKVNNUFRFMzM2TTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cG1wMXNkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgTVBFRzEgU3lzdGVtIFN0cmVhbSBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIE1QRUcxIFN5c3RlbSBTdHJlYW1zIGZyb20gUlRQIHBhY2tldHMgKFJGQyAzNTU1KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylvdGhlciwgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTVAxUzsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKU1QMVM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8vbXBlZywgc3lzdGVtc3RyZWFtPShib29sZWFuKXRydWU8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBtcDJ0ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIE1QRUcgVHJhbnNwb3J0IFN0cmVhbSBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIE1QRUcyIFRTIGZyb20gUlRQIHBhY2tldHMgKFJGQyAyMjUwKTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7LCBUaGlqcyBWZXJtZWlyICZsdDt0aGlqcy52ZXJtZWlyQGJhcmNvLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZyl7IE1QMlQsIE1QMlQtRVMgfTsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludCkzMywgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL21wZWd0cywgcGFja2V0c2l6ZT0oaW50KTE4OCwgc3lzdGVtc3RyZWFtPShib29sZWFuKXRydWU8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBtcDJ0cGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBNUEVHMiBUcmFuc3BvcnQgU3RyZWFtIHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkLWVuY29kZXMgTVBFRzIgVFMgaW50byBSVFAgcGFja2V0cyAoUkZDIDIyNTApPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL21wZWd0cywgcGFja2V0c2l6ZT0oaW50KTE4OCwgc3lzdGVtc3RyZWFtPShib29sZWFuKXRydWU8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludCkzMywgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTVAyVDsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTVAyVDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cG1wNGFkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgTVBFRzQgYXVkaW8gZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBNUEVHNCBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMzAxNik8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5Ob2tpYSBDb3Jwb3JhdGlvbiAoY29udGFjdCAmbHQ7c3RlZmFuLmtvc3RAbm9raWEuY29tJmd0OyksIFdpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTVA0QS1MQVRNPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgZnJhbWVkPShib29sZWFuKXsgZmFsc2UsIHRydWUgfSwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKXJhdzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cG1wNGFwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIE1QRUc0IGF1ZGlvIHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkIE1QRUc0IGF1ZGlvIGFzIFJUUCBwYWNrZXRzIChSRkMgMzAxNik8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCk0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpcmF3PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKU1QNEEtTEFUTTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cG1wNGdkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgTVBFRzQgRVMgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBNUEVHNCBlbGVtZW50YXJ5IHN0cmVhbXMgZnJvbSBSVFAgcGFja2V0cyAoUkZDIDM2NDApPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXsgdmlkZW8sIGF1ZGlvLCBhcHBsaWNhdGlvbiB9LCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylNUEVHNC1HRU5FUklDLCBtb2RlPShzdHJpbmcpeyBnZW5lcmljLCBDRUxQLWNiciwgQ0VMUC12YnIsIEFBQy1sYnIsIEFBQy1oYnIgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZTsgYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCk0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpcmF3PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwbXA0Z3BheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgTVBFRzQgRVMgcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWQgTVBFRzQgZWxlbWVudGFyeSBzdHJlYW1zIGFzIFJUUCBwYWNrZXRzIChSRkMgMzY0MCk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCk0LCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2U7IGF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKXJhdzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl7IHZpZGVvLCBhdWRpbywgYXBwbGljYXRpb24gfSwgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylNUEVHNC1HRU5FUklDLCBzdHJlYW10eXBlPShzdHJpbmcpeyA0LCA1IH0sIG1vZGU9KHN0cmluZyl7IGdlbmVyaWMsIENFTFAtY2JyLCBDRUxQLXZiciwgQUFDLWxiciwgQUFDLWhiciB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwbXA0dmRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBNUEVHNCB2aWRlbyBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIE1QRUc0IHZpZGVvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAzMDE2KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTVA0Vi1FUzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cG1wNHZwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIE1QRUc0IFZpZGVvIHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkIE1QRUctNCB2aWRlbyBhcyBSVFAgcGFja2V0cyAoUkZDIDMwMTYpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlOyB2aWRlby94LWRpdng8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTVA0Vi1FUzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cG1wYWRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBNUEVHIGF1ZGlvIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgTVBFRyBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMjAzOCk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludCkxNCwgY2xvY2stcmF0ZT0oaW50KTkwMDAwOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgZW5jb2RpbmctbmFtZT0oc3RyaW5nKU1QQSwgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpMTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cG1wYXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgTVBFRyBhdWRpbyBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZCBNUEVHIGF1ZGlvIGFzIFJUUCBwYWNrZXRzIChSRkMgMjAzOCk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCkxPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpMTQsIGNsb2NrLXJhdGU9KGludCk5MDAwMDsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTVBBPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwbXBhcm9idXN0ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIE1QRUcgYXVkaW8gZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBNUEVHIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKFJGQyA1MjE5KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPk1hcmsgTmF1d2VsYWVydHMgJmx0O21hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKU1QQS1ST0JVU1Q7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZyl7IFgtTVAzLURSQUZULTAwLCBYLU1QMy1EUkFGVC0wMSwgWC1NUDMtRFJBRlQtMDIsIFgtTVAzLURSQUZULTAzLCBYLU1QMy1EUkFGVC0wNCwgWC1NUDMtRFJBRlQtMDUsIFgtTVAzLURSQUZULTA2IH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCkxPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwbXB2ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIE1QRUcgdmlkZW8gZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBNUEVHIHZpZGVvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAyMjUwKTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTVBWOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgcGF5bG9hZD0oaW50KTMyLCBjbG9jay1yYXRlPShpbnQpOTAwMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCkyLCBzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2U8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBtcHZwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIE1QRUcyIEVTIHZpZGVvIHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkLWVuY29kZXMgTVBFRzIgRVMgaW50byBSVFAgcGFja2V0cyAoUkZDIDIyNTApPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGhpanMgVmVybWVpciAmbHQ7dGhpanN2ZXJtZWlyQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpMiwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBwYXlsb2FkPShpbnQpMzIsIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKU1QVjsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTVBWPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwb3B1c2RlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBPcHVzIHBhY2tldCBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIE9wdXMgYXVkaW8gZnJvbSBSVFAgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkRhbmlsbyBDZXNhciBMZW1lcyBkZSBQYXVsYSAmbHQ7ZGFuaWxvLmNlc2FyQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk0ODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKXsgT1BVUywgWC1HU1QtT1BVUy1EUkFGVC1TUElUVEtBLTAwIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1vcHVzLCBjaGFubmVsLW1hcHBpbmctZmFtaWx5PShpbnQpMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cG9wdXNwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIE9wdXMgcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlB1dHMgT3B1cyBhdWRpbyBpbiBSVFAgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkRhbmlsbyBDZXNhciBMZW1lcyBkZSBQYXVsYSAmbHQ7ZGFuaWxvLmNlc2FyQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtb3B1cywgY2hhbm5lbHM9KGludClbIDEsIDIgXSwgY2hhbm5lbC1tYXBwaW5nLWZhbWlseT0oaW50KTA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTQ4MDAwLCBlbmNvZGluZy1wYXJhbXM9KHN0cmluZykyLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpeyBPUFVTLCBYLUdTVC1PUFVTLURSQUZULVNQSVRUS0EtMDAgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHBjbWFkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgUENNQSBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIFBDTUEgYXVkaW8gZnJvbSBSVFAgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkVkZ2FyZCBMaW1hICZsdDtlZGdhcmQubGltYUBnbWFpbC5jb20mZ3Q7LCBaZWVzaGFuIEFsaSAmbHQ7emVlbml4QGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpOCwgY2xvY2stcmF0ZT0oaW50KTgwMDA7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylQQ01BPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtYWxhdywgY2hhbm5lbHM9KGludCkxLCByYXRlPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBwY21hcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBQQ01BIHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkLWVuY29kZXMgUENNQSBhdWRpbyBpbnRvIGEgUlRQIHBhY2tldDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkVkZ2FyZCBMaW1hICZsdDtlZGdhcmQubGltYUBnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LWFsYXcsIGNoYW5uZWxzPShpbnQpMSwgcmF0ZT0oaW50KTgwMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludCk4LCBjbG9jay1yYXRlPShpbnQpODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKVBDTUE7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKVBDTUE8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBwY211ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIFBDTVUgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBQQ01VIGF1ZGlvIGZyb20gUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5FZGdhcmQgTGltYSAmbHQ7ZWRnYXJkLmxpbWFAZ21haWwuY29tJmd0OywgWmVlc2hhbiBBbGkgJmx0O3plZW5peEBnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KTAsIGNsb2NrLXJhdGU9KGludCk4MDAwOyBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgZW5jb2RpbmctbmFtZT0oc3RyaW5nKVBDTVUsIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LW11bGF3LCBjaGFubmVscz0oaW50KTEsIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHBjbXVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIFBDTVUgcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWQtZW5jb2RlcyBQQ01VIGF1ZGlvIGludG8gYSBSVFAgcGFja2V0PC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RWRnYXJkIExpbWEgJmx0O2VkZ2FyZC5saW1hQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtbXVsYXcsIGNoYW5uZWxzPShpbnQpMSwgcmF0ZT0oaW50KTgwMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludCkwLCBjbG9jay1yYXRlPShpbnQpODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKVBDTVU7IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKVBDTVU8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBxY2VscGRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBRQ0VMUCBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIFFDRUxQIChQdXJlVm9pY2UpIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAyNjU4KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgY2xvY2stcmF0ZT0oaW50KTgwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylRQ0VMUDsgYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludCkxMiwgY2xvY2stcmF0ZT0oaW50KTgwMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8vcWNlbHAsIGNoYW5uZWxzPShpbnQpMSwgcmF0ZT0oaW50KTgwMDA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBxZG0yZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIFFETTIgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBRRE0yIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKG5vIFJGQyk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5FZHdhcmQgSGVydmV5ICZsdDtiaWxib2VkQGJpbGJvZWQuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGVuY29kaW5nLW5hbWU9KHN0cmluZylYLVFETTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXFkbTI8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBzYmNkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgU0JDIGF1ZGlvIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgU0JDIGF1ZGlvIGZyb20gUlRQIHBhY2tldHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5BcnVuIFJhZ2hhdmFuICZsdDthcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCl7IDE2MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylTQkM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1zYmMsIHJhdGU9KGludCl7IDE2MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF0sIG1vZGU9KHN0cmluZyl7IG1vbm8sIGR1YWwsIHN0ZXJlbywgam9pbnQgfSwgYmxvY2tzPShpbnQpeyA0LCA4LCAxMiwgMTYgfSwgc3ViYmFuZHM9KGludCl7IDQsIDggfSwgYWxsb2NhdGlvbi1tZXRob2Q9KHN0cmluZyl7IHNuciwgbG91ZG5lc3MgfSwgYml0cG9vbD0oaW50KVsgMiwgNjQgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHNiY3BheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgcGFja2V0IHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcms8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWQgU0JDIGF1ZGlvIGFzIFJUUCBwYWNrZXRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGhpYWdvIFNvdXNhIFNhbnRvcyAmbHQ7dGhpYWdvc3NAbGNjLnVmY2cuZWR1LmJyJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1zYmMsIHJhdGU9KGludCl7IDE2MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH0sIGNoYW5uZWxzPShpbnQpWyAxLCAyIF0sIGNoYW5uZWwtbW9kZT0oc3RyaW5nKXsgbW9ubywgZHVhbCwgc3RlcmVvLCBqb2ludCB9LCBibG9ja3M9KGludCl7IDQsIDgsIDEyLCAxNiB9LCBzdWJiYW5kcz0oaW50KXsgNCwgOCB9LCBhbGxvY2F0aW9uLW1ldGhvZD0oc3RyaW5nKXsgc25yLCBsb3VkbmVzcyB9LCBiaXRwb29sPShpbnQpWyAyLCA2NCBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCl7IDE2MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH0sIGVuY29kaW5nLW5hbWU9KHN0cmluZylTQkM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBzaXJlbmRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBTaXJlbiBwYWNrZXQgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBTaXJlbiBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+UGhpbGlwcGUgS2FsYWYgJmx0O3BoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpMTYwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylTSVJFTjwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXNpcmVuLCBkY3QtbGVuZ3RoPShpbnQpMzIwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwc2lyZW5wYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIFBheWxvYWRlciBmb3IgU2lyZW4gQXVkaW88L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGFja2V0aXplIFNpcmVuIGF1ZGlvIHN0cmVhbXMgaW50byBSVFAgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPllvdW5lc3MgQWxhb3VpICZsdDtrYWthcm90b0BrYWthcm90by5ob21lbGludXgubmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1zaXJlbiwgZGN0LWxlbmd0aD0oaW50KTMyMDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpMTYwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylTSVJFTiwgYml0cmF0ZT0oc3RyaW5nKTE2MDAwLCBkY3QtbGVuZ3RoPShpbnQpMzIwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwc3BlZXhkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgU3BlZXggZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBTcGVleCBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RWRnYXJkIExpbWEgJmx0O2VkZ2FyZC5saW1hQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpWyA2MDAwLCA0ODAwMCBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpU1BFRVg8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1zcGVleDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHNwZWV4cGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBTcGVleCBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZC1lbmNvZGVzIFNwZWV4IGF1ZGlvIGludG8gYSBSVFAgcGFja2V0PC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RWRnYXJkIExpbWEgJmx0O2VkZ2FyZC5saW1hQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtc3BlZXgsIHJhdGU9KGludClbIDYwMDAsIDQ4MDAwIF0sIGNoYW5uZWxzPShpbnQpMTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpWyA2MDAwLCA0ODAwMCBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpU1BFRVgsIGVuY29kaW5nLXBhcmFtcz0oc3RyaW5nKTE8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBzdHJlYW1kZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgU3RyZWFtIERlcGF5bG9hZGluZzwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yazwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RGVwYXlsb2FkcyBSVFAvUlRDUCBwYWNrZXRzIGZvciBzdHJlYW1pbmcgcHJvdG9jb2xzIGFjY29yZGluZyB0byBSRkM0NTcxPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLXN0cmVhbTsgYXBwbGljYXRpb24veC1ydGNwLXN0cmVhbTsgYXBwbGljYXRpb24veC1zcnRwLXN0cmVhbTsgYXBwbGljYXRpb24veC1zcnRjcC1zdHJlYW08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHA7IGFwcGxpY2F0aW9uL3gtcnRjcDsgYXBwbGljYXRpb24veC1zcnRwOyBhcHBsaWNhdGlvbi94LXNydGNwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwc3RyZWFtcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBTdHJlYW0gUGF5bG9hZGluZzwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcms8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWRzIFJUUC9SVENQIHBhY2tldHMgZm9yIHN0cmVhbWluZyBwcm90b2NvbHMgYWNjb3JkaW5nIHRvIFJGQzQ1NzE8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TZWJhc3RpYW4gRHLDtmdlICZsdDtzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHA7IGFwcGxpY2F0aW9uL3gtcnRjcDsgYXBwbGljYXRpb24veC1zcnRwOyBhcHBsaWNhdGlvbi94LXNydGNwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLXN0cmVhbTsgYXBwbGljYXRpb24veC1ydGNwLXN0cmVhbTsgYXBwbGljYXRpb24veC1zcnRwLXN0cmVhbTsgYXBwbGljYXRpb24veC1zcnRjcC1zdHJlYW08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBzdjN2ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIFNWUTMgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBTVlEzIHZpZGVvIGZyb20gUlRQIHBhY2tldHMgKG5vIFJGQyk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKXsgWC1TVjNWLUVTLCBYLVNPUkVOU09OLVZJREVPLCBYLVNPUkVOU09OVklERU8sIFgtU29yZW5zb25WaWRlbyB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtc3ZxLCBzdnF2ZXJzaW9uPShpbnQpMzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHRoZW9yYWRlcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBUaGVvcmEgZGVwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FeHRyYWN0cyBUaGVvcmEgdmlkZW8gZnJvbSBSVFAgcGFja2V0cyAoZHJhZnQtMDEgb2YgUkZDIFhYWFgpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylUSEVPUkE8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC10aGVvcmE8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHB0aGVvcmFwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIFRoZW9yYSBwYXlsb2FkZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+UGF5bG9hZC1lbmNvZGUgVGhlb3JhIHZpZGVvIGludG8gUlRQIHBhY2tldHMgKGRyYWZ0LTAxIFJGQyBYWFhYKTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXRoZW9yYTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywgcGF5bG9hZD0oaW50KVsgOTYsIDEyNyBdLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylUSEVPUkE8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHB2b3JiaXNkZXBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgVm9yYmlzIGRlcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RXh0cmFjdHMgVm9yYmlzIEF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKFJGQyA1MjE1KTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpVk9SQklTPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmF1ZGlvL3gtdm9yYmlzPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwdm9yYmlzcGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBWb3JiaXMgcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlBheWxvYWQtZW5jb2RlIFZvcmJpcyBhdWRpbyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgNTIxNSk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC12b3JiaXM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpVk9SQklTPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwdnA4ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIFZQOCBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIFZQOCB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzKTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNqb2VyZCBTaW1vbnMgJmx0O3Nqb2VyZEBsdW9uLm5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIGVuY29kaW5nLW5hbWU9KHN0cmluZyl7IFZQOCwgVlA4LURSQUZULUlFVEYtMDEgfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXZwODwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHZwOHBheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgVlA4IHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QdXRzIFZQOCB2aWRlbyBpbiBSVFAgcGFja2V0czwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNqb2VyZCBTaW1vbnMgJmx0O3Nqb2VyZEBsdW9uLm5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtdnA4PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBwYXlsb2FkPShpbnQpWyA5NiwgMTI3IF0sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKXsgVlA4LCBWUDgtRFJBRlQtSUVURi0wMSB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwdnA5ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIFZQOSBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIFZQOSB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzKTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlN0aWFuIFNlbG5lcyAmbHQ7c3RpYW5AcGV4aXAuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgbWVkaWE9KHN0cmluZyl2aWRlbywgZW5jb2RpbmctbmFtZT0oc3RyaW5nKXsgVlA5LCBWUDktRFJBRlQtSUVURi0wMSB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtdnA5PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwdnA5cGF5PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBWUDkgcGF5bG9hZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlB1dHMgVlA5IHZpZGVvIGluIFJUUCBwYWNrZXRzKTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlN0aWFuIFNlbG5lcyAmbHQ7c3RpYW5AcGV4aXAuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC12cDk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpeyBWUDksIFZQOS1EUkFGVC1JRVRGLTAxIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHB2cmF3ZGVwYXk8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIFJhdyBWaWRlbyBkZXBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkV4dHJhY3RzIHJhdyB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgNDE3NSk8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKVJBVywgc2FtcGxpbmc9KHN0cmluZyl7IFJHQiwgUkdCQSwgQkdSLCBCR1JBLCBZQ2JDci00OjQ6NCwgWUNiQ3ItNDoyOjIsIFlDYkNyLTQ6MjowLCBZQ2JDci00OjE6MSB9LCBkZXB0aD0oc3RyaW5nKXsgOCwgMTAsIDEyLCAxNiB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwdnJhd3BheTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgUmF3IFZpZGVvIHBheWxvYWRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXlsb2FkIHJhdyB2aWRlbyBhcyBSVFAgcGFja2V0cyAoUkZDIDQxNzUpPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFJHQiwgUkdCQSwgQkdSLCBCR1JBLCBBWVVWLCBVWVZZLCBJNDIwLCBZNDFCLCBVWVZQIH0sIHdpZHRoPShpbnQpWyAxLCAzMjc2NyBdLCBoZWlnaHQ9KGludClbIDEsIDMyNzY3IF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludClbIDk2LCAxMjcgXSwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpUkFXLCBzYW1wbGluZz0oc3RyaW5nKXsgUkdCLCBSR0JBLCBCR1IsIEJHUkEsIFlDYkNyLTQ6NDo0LCBZQ2JDci00OjI6MiwgWUNiQ3ItNDoyOjAsIFlDYkNyLTQ6MToxIH0sIGRlcHRoPShzdHJpbmcpeyA4LCAxMCwgMTIsIDE2IH0sIGNvbG9yaW1ldHJ5PShzdHJpbmcpeyBCVDYwMS01LCBCVDcwOS0yLCBTTVBURTI0ME0gfTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHBtYW5hZ2VyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODRlZWFmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXJ0cG1hbmFnZXIueG1sCkBAIC0wLDAgKzEsMzAxIEBACis8cGx1Z2luPgorICA8bmFtZT5ydHBtYW5hZ2VyPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+UlRQIHNlc3Npb24gbWFuYWdlbWVudCBwbHVnaW4gbGlicmFyeTwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvcnRwbWFuYWdlci8ubGlicy9saWJnc3RydHBtYW5hZ2VyLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHJ0cG1hbmFnZXIuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGJpbjwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgQmluPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvTmV0d29yay9SVFA8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlJlYWwtVGltZSBUcmFuc3BvcnQgUHJvdG9jb2wgYmluPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5yZWN2X3J0Y3Bfc2lua18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydGNwOyBhcHBsaWNhdGlvbi94LXNydGNwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnJlY3ZfcnRwX3NpbmtfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwOyBhcHBsaWNhdGlvbi94LXNydHA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2VuZF9ydHBfc2lua18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+cmVjdl9ydHBfc3JjXyV1XyV1XyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2VuZF9ydHBfc3JjXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHA7IGFwcGxpY2F0aW9uL3gtc3J0cDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zZW5kX3J0Y3Bfc3JjXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRjcDsgYXBwbGljYXRpb24veC1zcnRjcDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGR0bWZtdXg8L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIG11eGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9NdXhlcjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+bWl4ZXMgUlRQIERUTUYgc3RyZWFtcyBpbnRvIG90aGVyIFJUUCBzdHJlYW1zPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+WmVlc2hhbiBBbGkgJmx0O2ZpcnN0Lmxhc3RAbm9raWEuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnByaW9yaXR5X3NpbmtfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbmtfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwaml0dGVyYnVmZmVyPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBwYWNrZXQgaml0dGVyLWJ1ZmZlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BIGJ1ZmZlciB0aGF0IGRlYWxzIHdpdGggbmV0d29yayBqaXR0ZXIgYW5kIG90aGVyIHRyYW5zbWlzc2lvbiBmYXVsdHM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5QaGlsaXBwZSBLYWxhZiAmbHQ7cGhpbGlwcGUua2FsYWZAY29sbGFib3JhLmNvLnVrJmd0OywgV2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbmtfcnRjcDwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydGNwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwbXV4PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBtdXhlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvTXV4ZXI8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPm11bHRpcGxleCBOIHJ0cCBzdHJlYW1zIGludG8gb25lPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+WmVlc2hhbiBBbGkgJmx0O2ZpcnN0Lmxhc3RAbm9raWEuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbmtfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwcHRkZW11eDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgRGVtdXg8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkRlbXV4L05ldHdvcmsvUlRQPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXJzZXMgY29kZWMgc3RyZWFtcyB0cmFuc21pdHRlZCBpbiB0aGUgc2FtZSBSVFAgc2Vzc2lvbjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkthaSBWZWhtYW5lbiAmbHQ7a2FpLnZlaG1hbmVuQG5va2lhLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyY18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwLCBwYXlsb2FkPShpbnQpWyAwLCAyNTUgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHJ0eHF1ZXVlPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBSZXRyYW5zbWlzc2lvbiBRdWV1ZTwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWM8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPktlZXAgUlRQIHBhY2tldHMgaW4gYSBxdWV1ZSBmb3IgcmV0cmFuc21pc3Npb248L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBydHhyZWNlaXZlPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBSZXRyYW5zbWlzc2lvbiByZWNlaXZlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWM8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlJlY2VpdmUgcmV0cmFuc21pdHRlZCBSVFAgcGFja2V0cyBhY2NvcmRpbmcgdG8gUkZDNDU4ODwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkp1bGllbiBJc29yY2UgJmx0O2p1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5ydHBydHhzZW5kPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBSZXRyYW5zbWlzc2lvbiBTZW5kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5SZXRyYW5zbWl0IFJUUCBwYWNrZXRzIHdoZW4gbmVlZGVkLCBhY2NvcmRpbmcgdG8gUkZDNDU4ODwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkp1bGllbiBJc29yY2UgJmx0O2p1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHAsIGNsb2NrLXJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0cDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cHNlc3Npb248L25hbWU+CisgICAgICA8bG9uZ25hbWU+UlRQIFNlc3Npb248L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+SW1wbGVtZW50IGFuIFJUUCBzZXNzaW9uPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5yZWN2X3J0Y3Bfc2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydGNwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnJlY3ZfcnRwX3Npbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNlbmRfcnRwX3Npbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnJlcXVlc3Q8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnJlY3ZfcnRwX3NyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNlbmRfcnRwX3NyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5zb21ldGltZXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtcnRwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnN5bmNfc3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydGNwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNlbmRfcnRjcF9zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydGNwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRwc3NyY2RlbXV4PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJUUCBTU1JDIERlbXV4PC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5EZW11eC9OZXR3b3JrL1JUUDwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+U3BsaXRzIFJUUCBzdHJlYW1zIGJhc2VkIG9uIHRoZSBTU1JDPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5ydGNwX3Npbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydGNwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+cnRjcF9zcmNfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+c29tZXRpbWVzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0Y3A8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tcnRzcC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1MjliNAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1ydHNwLnhtbApAQCAtMCwwICsxLDYxIEBACis8cGx1Z2luPgorICA8bmFtZT5ydHNwPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+dHJhbnNmZXIgZGF0YSB2aWEgUlRTUDwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvcnRzcC8ubGlicy9saWJnc3RydHNwLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHJ0c3Auc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnJ0cGRlYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFAgRGVjb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvUGFyc2VyL05ldHdvcms8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkFjY2VwdHMgcmF3IFJUUCBhbmQgUlRDUCBwYWNrZXRzIGFuZCBzZW5kcyB0aGVtIGZvcndhcmQ8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnJlY3ZfcnRjcF9zaW5rXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXJ0Y3A8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+cmVjdl9ydHBfc2lua18ldTwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+cmVjdl9ydHBfc3JjXyV1XyV1XyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHA8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+cnRjcF9zcmNfJXU8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+cmVxdWVzdDwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydGNwPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+cnRzcHNyYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5SVFNQIHBhY2tldCByZWNlaXZlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U291cmNlL05ldHdvcms8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlJlY2VpdmUgZGF0YSBvdmVyIHRoZSBuZXR3b3JrIHZpYSBSVFNQIChSRkMgMjMyNik8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltQGZsdWVuZG8uY29tJmd0OywgVGhpanMgVmVybWVpciAmbHQ7dGhpanMudmVybWVpckBiYXJjby5jb20mZ3Q7LCBMdXR6IE11ZWxsZXIgJmx0O2x1dHpAdG9wZnJvc2UuZGUmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3RyZWFtXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1ydHA7IGFwcGxpY2F0aW9uL3gtcmR0PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc2hhcGV3aXBlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDMyMmYxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNoYXBld2lwZS54bWwKQEAgLTAsMCArMSw0MCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+c2hhcGV3aXBlPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+U2hhcGUgV2lwZSB0cmFuc2l0aW9uIGZpbHRlcjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3Qvc2hhcGV3aXBlLy5saWJzL2xpYmdzdHNoYXBld2lwZS5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RzaGFwZXdpcGUuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnNoYXBld2lwZTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5TaGFwZSBXaXBlIHRyYW5zaXRpb24gZmlsdGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWRpdG9yL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BZGRzIGEgc2hhcGUgd2lwZSB0cmFuc2l0aW9uIHRvIGEgdmlkZW8gc3RyZWFtPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+bWFza19zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylHUkFZOCwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pMC8xOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpR1JBWTE2X0xFLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbikwLzE8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+dmlkZW9fc2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBBWVVWLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0JBIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBBWVVWLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0JBIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDIueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNob3V0Mi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGExM2ExYQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zaG91dDIueG1sCkBAIC0wLDAgKzEsMjggQEAKKzxwbHVnaW4+CisgIDxuYW1lPnNob3V0MjwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPlNlbmRzIGRhdGEgdG8gYW4gaWNlY2FzdCBzZXJ2ZXIgdXNpbmcgbGlic2hvdXQyPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2V4dC9zaG91dDIvLmxpYnMvbGliZ3N0c2hvdXQyLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHNob3V0Mi5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+c2hvdXQyc2VuZDwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5JY2VjYXN0IG5ldHdvcmsgc2luazwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U2luay9OZXR3b3JrPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5TZW5kcyBkYXRhIHRvIGFuIGljZWNhc3Qgc2VydmVyPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGNoZWxsby5iZSZndDssIFBlZHJvIENvcnRlLVJlYWwgJmx0O3R5cG9AbmV0Y2Fiby5wdCZndDssIFphaGVlciBBYmJhcyBNZXJhbGkgJmx0O3phaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24vb2dnOyBhdWRpby9vZ2c7IHZpZGVvL29nZzsgYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb249KGludCkxLCBsYXllcj0oaW50KVsgMSwgMyBdOyB2aWRlby93ZWJtOyBhdWRpby93ZWJtPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNtcHRlLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkMTBlOQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zbXB0ZS54bWwKQEAgLTAsMCArMSw2MSBAQAorPHBsdWdpbj4KKyAgPG5hbWU+c21wdGU8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5BcHBseSB0aGUgc3RhbmRhcmQgU01QVEUgdHJhbnNpdGlvbnMgb24gdmlkZW8gaW1hZ2VzPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC9zbXB0ZS8ubGlicy9saWJnc3RzbXB0ZS5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RzbXB0ZS5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+c21wdGU8L25hbWU+CisgICAgICA8bG9uZ25hbWU+U01QVEUgdHJhbnNpdGlvbnM8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZGl0b3IvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkFwcGx5IHRoZSBzdGFuZGFyZCBTTVBURSB0cmFuc2l0aW9ucyBvbiB2aWRlbyBpbWFnZXM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltLnRheW1hbnNAY2hlbGxvLmJlJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbmsxPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylJNDIwLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazI8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUk0MjAsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpSTQyMCwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+c21wdGVhbHBoYTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5TTVBURSB0cmFuc2l0aW9uczwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VkaXRvci9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+QXBwbHkgdGhlIHN0YW5kYXJkIFNNUFRFIHRyYW5zaXRpb25zIGFzIGFscGhhIG9uIHZpZGVvIGltYWdlczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpSTQyMCwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpWVYxMiwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpQVlVViwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpQVJHQiwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpQkdSQSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpUkdCQSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpQVJHQiwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylBWVVWLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylBUkdCLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylCR1JBLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylSR0JBLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylBUkdCLCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc291cC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IyYzYyZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi1zb3VwLnhtbApAQCAtMCwwICsxLDQzIEBACis8cGx1Z2luPgorICA8bmFtZT5zb3VwPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+bGlic291cCBIVFRQIGNsaWVudCBzcmMvc2luazwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9leHQvc291cC8ubGlicy9saWJnc3Rzb3VwLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHNvdXAuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnNvdXBodHRwY2xpZW50c2luazwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5IVFRQIGNsaWVudCBzaW5rPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5HZW5lcmljPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5TZW5kcyBzdHJlYW1zIHRvIEhUVFAgc2VydmVyIHZpYSBQVVQ8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5EYXZpZCBTY2hsZWVmICZsdDtkc0BlbnRyb3B5d2F2ZS5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5zb3VwaHR0cHNyYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5IVFRQIGNsaWVudCBzb3VyY2U8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNvdXJjZS9OZXR3b3JrPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5SZWNlaXZlIGRhdGEgYXMgYSBjbGllbnQgb3ZlciB0aGUgbmV0d29yayB2aWEgSFRUUCB1c2luZyBTT1VQPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V291dGVyIENsb2V0ZW5zICZsdDt3b3V0ZXJAbWluZC5iZSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlY3RydW0ueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWJkZDNjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWN0cnVtLnhtbApAQCAtMCwwICsxLDM0IEBACis8cGx1Z2luPgorICA8bmFtZT5zcGVjdHJ1bTwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPlJ1biBhbiBGRlQgb24gdGhlIGF1ZGlvIHNpZ25hbCwgb3V0cHV0IHNwZWN0cnVtIGRhdGE8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L3NwZWN0cnVtLy5saWJzL2xpYmdzdHNwZWN0cnVtLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHNwZWN0cnVtLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5zcGVjdHJ1bTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5TcGVjdHJ1bSBhbmFseXplcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0FuYWx5emVyL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5SdW4gYW4gRkZUIG9uIHRoZSBhdWRpbyBzaWduYWwsIG91dHB1dCBzcGVjdHJ1bSBkYXRhPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RXJpayBXYWx0aGluc2VuICZsdDtvbWVnYUBjc2Uub2dpLmVkdSZndDssIFN0ZWZhbiBLb3N0ICZsdDtlbnNvbmljQHVzZXJzLnNmLm5ldCZndDssIFNlYmFzdGlhbiBEcsO2Z2UgJmx0O3NlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzE2TEUsIFMyNExFLCBTMzJMRSwgRjMyTEUsIEY2NExFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzE2TEUsIFMyNExFLCBTMzJMRSwgRjMyTEUsIEY2NExFIH0sIHJhdGU9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgY2hhbm5lbHM9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQ8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tc3BlZXgueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzgzOWRiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXNwZWV4LnhtbApAQCAtMCwwICsxLDU1IEBACis8cGx1Z2luPgorICA8bmFtZT5zcGVleDwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPlNwZWV4IHBsdWdpbiBsaWJyYXJ5PC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2V4dC9zcGVleC8ubGlicy9saWJnc3RzcGVleC5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3RzcGVleC5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+c3BlZXhkZWM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+U3BlZXggYXVkaW8gZGVjb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRGVjb2Rlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+ZGVjb2RlIHNwZWV4IHN0cmVhbXMgdG8gYXVkaW88L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltQGZsdWVuZG8uY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1zcGVleDwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzE2TEUsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyA2MDAwLCA0ODAwMCBdLCBjaGFubmVscz0oaW50KVsgMSwgMiBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+c3BlZXhlbmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+U3BlZXggYXVkaW8gZW5jb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRW5jb2Rlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RW5jb2RlcyBhdWRpbyBpbiBTcGVleCBmb3JtYXQ8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltQGZsdWVuZG8uY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVMxNkxFLCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgcmF0ZT0oaW50KVsgNjAwMCwgNDgwMDAgXSwgY2hhbm5lbHM9KGludCkxOyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzE2TEUsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpWyA2MDAwLCA0ODAwMCBdLCBjaGFubmVscz0oaW50KTIsIGNoYW5uZWwtbWFzaz0oYml0bWFzaykweDAwMDAwMDAwMDAwMDAwMDM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1zcGVleCwgcmF0ZT0oaW50KVsgNjAwMCwgNDgwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXRhZ2xpYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkxM2ZhOQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10YWdsaWIueG1sCkBAIC0wLDAgKzEsNTUgQEAKKzxwbHVnaW4+CisgIDxuYW1lPnRhZ2xpYjwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPlRhZyB3cml0aW5nIHBsdWctaW4gYmFzZWQgb24gdGFnbGliPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2V4dC90YWdsaWIvLmxpYnMvbGliZ3N0dGFnbGliLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHRhZ2xpYi5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+YXBldjJtdXg8L25hbWU+CisgICAgICA8bG9uZ25hbWU+VGFnTGliLWJhc2VkIEFQRXYyIE11eGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Gb3JtYXR0ZXIvTWV0YWRhdGE8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkFkZHMgYW4gQVBFdjIgaGVhZGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgZmlsZXMgdXNpbmcgdGFnbGliPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+U2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmFwcGxpY2F0aW9uL3gtYXBldGFnPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+aWQzdjJtdXg8L25hbWU+CisgICAgICA8bG9uZ25hbWU+VGFnTGliLWJhc2VkIElEM3YyIE11eGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Gb3JtYXR0ZXIvTWV0YWRhdGE8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkFkZHMgYW4gSUQzdjIgaGVhZGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgTVAzIGZpbGVzIHVzaW5nIHRhZ2xpYjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkNocmlzdG9waGUgRmVyZ2VhdSAmbHQ7dGV1ZkBnbm9tZS5vcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXBwbGljYXRpb24veC1pZDM8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdHdvbGFtZS54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdHdvbGFtZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYwYTliZAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi10d29sYW1lLnhtbApAQCAtMCwwICsxLDM0IEBACis8cGx1Z2luPgorICA8bmFtZT50d29sYW1lPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+RW5jb2RlIE1QMnMgd2l0aCBUd29MQU1FPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2V4dC90d29sYW1lLy5saWJzL2xpYmdzdHR3b2xhbWUuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0dHdvbGFtZS5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+dHdvbGFtZW1wMmVuYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5Ud29MQU1FIG1wMiBlbmNvZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9FbmNvZGVyL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5IaWdoLXF1YWxpdHkgZnJlZSBNUDIgZW5jb2RlcjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlNlYmFzdGlhbiBEcsO2Z2UgJmx0O3NlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIFMxNkxFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpeyAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH0sIGNoYW5uZWxzPShpbnQpMTsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgRjMyTEUsIFMxNkxFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCByYXRlPShpbnQpeyAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH0sIGNoYW5uZWxzPShpbnQpMiwgY2hhbm5lbC1tYXNrPShiaXRtYXNrKTB4MDAwMDAwMDAwMDAwMDAwMzwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTEsIGxheWVyPShpbnQpMiwgcmF0ZT0oaW50KXsgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCBjaGFubmVscz0oaW50KVsgMSwgMiBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdWRwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjliYTcxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXVkcC54bWwKQEAgLTAsMCArMSw3MyBAQAorPHBsdWdpbj4KKyAgPG5hbWU+dWRwPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+dHJhbnNmZXIgZGF0YSB2aWEgVURQPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC91ZHAvLmxpYnMvbGliZ3N0dWRwLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHVkcC5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+ZHludWRwc2luazwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5VRFAgcGFja2V0IHNlbmRlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U2luay9OZXR3b3JrPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5TZW5kIGRhdGEgb3ZlciB0aGUgbmV0d29yayB2aWEgVURQIHdpdGggcGFja2V0IGRlc3RpbmF0aW9ucyBwaWNrZWQgdXAgZHluYW1pY2FsbHkgZnJvbSBtZXRhIG9uIHRoZSBidWZmZXJzIHBhc3NlZDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPlBoaWxpcHBlIEtoYWxhZiAmbHQ7YnVyZ2VyQHNwZWVkeS5vcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5tdWx0aXVkcHNpbms8L25hbWU+CisgICAgICA8bG9uZ25hbWU+VURQIHBhY2tldCBzZW5kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNpbmsvTmV0d29yazwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+U2VuZCBkYXRhIG92ZXIgdGhlIG5ldHdvcmsgdmlhIFVEUCB0byBvbmUgb3IgbXVsdGlwbGUgcmVjaXBpZW50cyB3aGljaCBjYW4gYmUgYWRkZWQgb3IgcmVtb3ZlZCBhdCBydW50aW1lIHVzaW5nIGFjdGlvbiBzaWduYWxzPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+V2ltIFRheW1hbnMgJmx0O3dpbS50YXltYW5zQGdtYWlsLmNvbSZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPkFOWTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnVkcHNpbms8L25hbWU+CisgICAgICA8bG9uZ25hbWU+VURQIHBhY2tldCBzZW5kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNpbmsvTmV0d29yazwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+U2VuZCBkYXRhIG92ZXIgdGhlIG5ldHdvcmsgdmlhIFVEUDwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW1AZmx1ZW5kby5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5BTlk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT51ZHBzcmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+VURQIHBhY2tldCByZWNlaXZlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U291cmNlL05ldHdvcms8L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlJlY2VpdmUgZGF0YSBvdmVyIHRoZSBuZXR3b3JrIHZpYSBVRFA8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5XaW0gVGF5bWFucyAmbHQ7d2ltQGZsdWVuZG8uY29tJmd0OywgVGhpanMgVmVybWVpciAmbHQ7dGhpanMudmVybWVpckBiYXJjby5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+QU5ZPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW80bGludXgyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTkxYTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvNGxpbnV4Mi54bWwKQEAgLTAsMCArMSw1MiBAQAorPHBsdWdpbj4KKyAgPG5hbWU+dmlkZW80bGludXgyPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+ZWxlbWVudHMgZm9yIFZpZGVvIDQgTGludXg8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vc3lzL3Y0bDIvLmxpYnMvbGliZ3N0dmlkZW80bGludXgyLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHZpZGVvNGxpbnV4Mi5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+djRsMnJhZGlvPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlJhZGlvICh2aWRlbzRsaW51eDIpIFR1bmVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5UdW5lcjwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+Q29udHJvbHMgYSBWaWRlbzRMaW51eDIgcmFkaW8gZGV2aWNlPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+QWxleGV5IENoZXJub3YgJmx0OzRlcm5vdkBnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT52NGwyc2luazwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5WaWRlbyAodmlkZW80bGludXgyKSBTaW5rPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5TaW5rL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5EaXNwbGF5cyBmcmFtZXMgb24gYSB2aWRlbzRsaW51eDIgZGV2aWNlPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+Um9iIENsYXJrICZsdDtyb2JAdGkuY29tJmd0Oyw8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmltYWdlL2pwZWc7IHZpZGVvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlOyB2aWRlby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTI7IHZpZGVvL21wZWd0cywgc3lzdGVtc3RyZWFtPShib29sZWFuKXRydWU7IHZpZGVvL3gtYmF5ZXIsIGZvcm1hdD0oc3RyaW5nKXsgYmdnciwgZ2JyZywgZ3JiZywgcmdnYiB9LCB3aWR0aD0oaW50KVsgMSwgMzI3NjggXSwgaGVpZ2h0PShpbnQpWyAxLCAzMjc2OCBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1kdiwgc3lzdGVtc3RyZWFtPShib29sZWFuKXRydWU7IHZpZGVvL3gtaDI2MywgdmFyaWFudD0oc3RyaW5nKWl0dTsgdmlkZW8veC1oMjY0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpeyBieXRlLXN0cmVhbSwgYXZjIH0sIGFsaWdubWVudD0oc3RyaW5nKWF1OyB2aWRlby94LXB3YzEsIHdpZHRoPShpbnQpWyAxLCAzMjc2OCBdLCBoZWlnaHQ9KGludClbIDEsIDMyNzY4IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXB3YzIsIHdpZHRoPShpbnQpWyAxLCAzMjc2OCBdLCBoZWlnaHQ9KGludClbIDEsIDMyNzY4IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBSR0IxNiwgQkdSLCBSR0IsIEdSQVk4LCBHUkFZMTZfTEUsIEdSQVkxNl9CRSwgWVZVOSwgWVYxMiwgWVVZMiwgWVZZVSwgVVlWWSwgWTQyQiwgWTQxQiwgWVVWOSwgTlYxMl82NFozMiwgTlYyNCwgTlY2MSwgTlYxNiwgTlYyMSwgTlYxMiwgSTQyMCwgQkdSQSwgQkdSeCwgQVJHQiwgeFJHQiwgQkdSMTUsIFJHQjE1IH0sIHdpZHRoPShpbnQpWyAxLCAzMjc2OCBdLCBoZWlnaHQ9KGludClbIDEsIDMyNzY4IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXNvbml4LCB3aWR0aD0oaW50KVsgMSwgMzI3NjggXSwgaGVpZ2h0PShpbnQpWyAxLCAzMjc2OCBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC12cDg7IHZpZGVvL3gtdnA5OyB2aWRlby94LXdtdiwgd212dmVyc2lvbj0oaW50KTMsIGZvcm1hdD0oc3RyaW5nKVdWQzE8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT52NGwyc3JjPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlZpZGVvICh2aWRlbzRsaW51eDIpIFNvdXJjZTwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+U291cmNlL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5SZWFkcyBmcmFtZXMgZnJvbSBhIFZpZGVvNExpbnV4MiBkZXZpY2U8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5FZGdhcmQgTGltYSAmbHQ7ZWRnYXJkLmxpbWFAZ21haWwuY29tJmd0OywgU3RlZmFuIEtvc3QgJmx0O2Vuc29uaWNAdXNlcnMuc2YubmV0Jmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPmltYWdlL2pwZWc7IHZpZGVvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpNCwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlOyB2aWRlby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTI7IHZpZGVvL21wZWd0cywgc3lzdGVtc3RyZWFtPShib29sZWFuKXRydWU7IHZpZGVvL3gtYmF5ZXIsIGZvcm1hdD0oc3RyaW5nKXsgYmdnciwgZ2JyZywgZ3JiZywgcmdnYiB9LCB3aWR0aD0oaW50KVsgMSwgMzI3NjggXSwgaGVpZ2h0PShpbnQpWyAxLCAzMjc2OCBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC1kdiwgc3lzdGVtc3RyZWFtPShib29sZWFuKXRydWU7IHZpZGVvL3gtaDI2MywgdmFyaWFudD0oc3RyaW5nKWl0dTsgdmlkZW8veC1oMjY0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpeyBieXRlLXN0cmVhbSwgYXZjIH0sIGFsaWdubWVudD0oc3RyaW5nKWF1OyB2aWRlby94LXB3YzEsIHdpZHRoPShpbnQpWyAxLCAzMjc2OCBdLCBoZWlnaHQ9KGludClbIDEsIDMyNzY4IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXB3YzIsIHdpZHRoPShpbnQpWyAxLCAzMjc2OCBdLCBoZWlnaHQ9KGludClbIDEsIDMyNzY4IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBSR0IxNiwgQkdSLCBSR0IsIEdSQVk4LCBHUkFZMTZfTEUsIEdSQVkxNl9CRSwgWVZVOSwgWVYxMiwgWVVZMiwgWVZZVSwgVVlWWSwgWTQyQiwgWTQxQiwgWVVWOSwgTlYxMl82NFozMiwgTlYyNCwgTlY2MSwgTlYxNiwgTlYyMSwgTlYxMiwgSTQyMCwgQkdSQSwgQkdSeCwgQVJHQiwgeFJHQiwgQkdSMTUsIFJHQjE1IH0sIHdpZHRoPShpbnQpWyAxLCAzMjc2OCBdLCBoZWlnaHQ9KGludClbIDEsIDMyNzY4IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXNvbml4LCB3aWR0aD0oaW50KVsgMSwgMzI3NjggXSwgaGVpZ2h0PShpbnQpWyAxLCAzMjc2OCBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTsgdmlkZW8veC12cDg7IHZpZGVvL3gtdnA5OyB2aWRlby94LXdtdiwgd212dmVyc2lvbj0oaW50KTMsIGZvcm1hdD0oc3RyaW5nKVdWQzE8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9ib3gueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzM3OTU4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvYm94LnhtbApAQCAtMCwwICsxLDM0IEBACis8cGx1Z2luPgorICA8bmFtZT52aWRlb2JveDwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPnJlc2l6ZXMgYSB2aWRlbyBieSBhZGRpbmcgYm9yZGVycyBvciBjcm9wcGluZzwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvdmlkZW9ib3gvLmxpYnMvbGliZ3N0dmlkZW9ib3guc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0dmlkZW9ib3guc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnZpZGVvYm94PC9uYW1lPgorICAgICAgPGxvbmduYW1lPlZpZGVvIGJveCBmaWx0ZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPlJlc2l6ZXMgYSB2aWRlbyBieSBhZGRpbmcgYm9yZGVycyBvciBjcm9wcGluZzwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW1AZmx1ZW5kby5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBBWVVWLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0JBLCB4UkdCLCBCR1J4LCB4QkdSLCBSR0J4LCBSR0IsIEJHUiwgWTQ0NCwgWTQyQiwgWVVZMiwgWVZZVSwgVVlWWSwgSTQyMCwgWVYxMiwgWTQxQiwgR1JBWTgsIEdSQVkxNl9CRSwgR1JBWTE2X0xFIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBBWVVWLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0JBLCB4UkdCLCBCR1J4LCB4QkdSLCBSR0J4LCBSR0IsIEJHUiwgWTQ0NCwgWTQyQiwgWVVZMiwgWVZZVSwgVVlWWSwgSTQyMCwgWVYxMiwgWTQxQiwgR1JBWTgsIEdSQVkxNl9CRSwgR1JBWTE2X0xFIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvY3JvcC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhNjYwOQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2Nyb3AueG1sCkBAIC0wLDAgKzEsNTUgQEAKKzxwbHVnaW4+CisgIDxuYW1lPnZpZGVvY3JvcDwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkNyb3BzIHZpZGVvIGludG8gYSB1c2VyLWRlZmluZWQgcmVnaW9uPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC92aWRlb2Nyb3AvLmxpYnMvbGliZ3N0dmlkZW9jcm9wLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHZpZGVvY3JvcC5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+YXNwZWN0cmF0aW9jcm9wPC9uYW1lPgorICAgICAgPGxvbmduYW1lPmFzcGVjdHJhdGlvY3JvcDwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+Q3JvcHMgdmlkZW8gaW50byBhIHVzZXItZGVmaW5lZCBhc3BlY3QtcmF0aW88L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5UaGlqcyBWZXJtZWlyICZsdDt0aGlqc3Zlcm1laXJAZ21haWwuY29tJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUkdCeCwgeFJHQiwgQkdSeCwgeEJHUiwgUkdCQSwgQVJHQiwgQkdSQSwgQUJHUiwgUkdCLCBCR1IsIEFZVVYsIFlVWTIsIFlWWVUsIFVZVlksIEk0MjAsIFlWMTIsIFJHQjE2LCBSR0IxNSwgR1JBWTgsIE5WMTIsIE5WMjEsIEdSQVkxNl9MRSwgR1JBWTE2X0JFIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBSR0J4LCB4UkdCLCBCR1J4LCB4QkdSLCBSR0JBLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0IsIEJHUiwgQVlVViwgWVVZMiwgWVZZVSwgVVlWWSwgSTQyMCwgWVYxMiwgUkdCMTYsIFJHQjE1LCBHUkFZOCwgTlYxMiwgTlYyMSwgR1JBWTE2X0xFLCBHUkFZMTZfQkUgfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+dmlkZW9jcm9wPC9uYW1lPgorICAgICAgPGxvbmduYW1lPkNyb3A8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkNyb3BzIHZpZGVvIGludG8gYSB1c2VyLWRlZmluZWQgcmVnaW9uPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+VGltLVBoaWxpcHAgTcO8bGxlciAmbHQ7dGltIGNlbnRyaWN1bGFyIG5ldCZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IFJHQngsIHhSR0IsIEJHUngsIHhCR1IsIFJHQkEsIEFSR0IsIEJHUkEsIEFCR1IsIFJHQiwgQkdSLCBBWVVWLCBZVVkyLCBZVllVLCBVWVZZLCBJNDIwLCBZVjEyLCBSR0IxNiwgUkdCMTUsIEdSQVk4LCBOVjEyLCBOVjIxLCBHUkFZMTZfTEUsIEdSQVkxNl9CRSB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUkdCeCwgeFJHQiwgQkdSeCwgeEJHUiwgUkdCQSwgQVJHQiwgQkdSQSwgQUJHUiwgUkdCLCBCR1IsIEFZVVYsIFlVWTIsIFlWWVUsIFVZVlksIEk0MjAsIFlWMTIsIFJHQjE2LCBSR0IxNSwgR1JBWTgsIE5WMTIsIE5WMjEsIEdSQVkxNl9MRSwgR1JBWTE2X0JFIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb2ZpbHRlci54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMWQzMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdmlkZW9maWx0ZXIueG1sCkBAIC0wLDAgKzEsOTcgQEAKKzxwbHVnaW4+CisgIDxuYW1lPnZpZGVvZmlsdGVyPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+VmlkZW8gZmlsdGVycyBwbHVnaW48L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L3ZpZGVvZmlsdGVyLy5saWJzL2xpYmdzdHZpZGVvZmlsdGVyLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHZpZGVvZmlsdGVyLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT5nYW1tYTwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5WaWRlbyBnYW1tYSBjb3JyZWN0aW9uPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5GaWx0ZXIvRWZmZWN0L1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5BZGp1c3RzIGdhbW1hIG9uIGEgdmlkZW8gc3RyZWFtPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+QXJ3ZWQgdi4gTWVya2F0eiAmbHQ7di5tZXJrYXR6QGdteC5uZXQ8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEFZVVYsIEFSR0IsIEJHUkEsIEFCR1IsIFJHQkEsIFk0NDQsIHhSR0IsIFJHQngsIHhCR1IsIEJHUngsIFJHQiwgQkdSLCBZNDJCLCBOVjEyLCBOVjIxLCBZVVkyLCBVWVZZLCBZVllVLCBJNDIwLCBZVjEyLCBJWVVWLCBZNDFCIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBBWVVWLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0JBLCBZNDQ0LCB4UkdCLCBSR0J4LCB4QkdSLCBCR1J4LCBSR0IsIEJHUiwgWTQyQiwgTlYxMiwgTlYyMSwgWVVZMiwgVVlWWSwgWVZZVSwgSTQyMCwgWVYxMiwgSVlVViwgWTQxQiB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT52aWRlb2JhbGFuY2U8L25hbWU+CisgICAgICA8bG9uZ25hbWU+VmlkZW8gYmFsYW5jZTwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VmZmVjdC9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+QWRqdXN0cyBicmlnaHRuZXNzLCBjb250cmFzdCwgaHVlLCBzYXR1cmF0aW9uIG9uIGEgdmlkZW8gc3RyZWFtPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RGF2aWQgU2NobGVlZiAmbHQ7ZHNAc2NobGVlZi5vcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBBWVVWLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0JBLCBZNDQ0LCB4UkdCLCBSR0J4LCB4QkdSLCBCR1J4LCBSR0IsIEJHUiwgWTQyQiwgWVVZMiwgVVlWWSwgWVZZVSwgSTQyMCwgWVYxMiwgSVlVViwgWTQxQiwgTlYxMiwgTlYyMSB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF07IHZpZGVvL3gtcmF3KEFOWSk8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQVlVViwgQVJHQiwgQkdSQSwgQUJHUiwgUkdCQSwgWTQ0NCwgeFJHQiwgUkdCeCwgeEJHUiwgQkdSeCwgUkdCLCBCR1IsIFk0MkIsIFlVWTIsIFVZVlksIFlWWVUsIEk0MjAsIFlWMTIsIElZVVYsIFk0MUIsIE5WMTIsIE5WMjEgfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdOyB2aWRlby94LXJhdyhBTlkpPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+dmlkZW9mbGlwPC9uYW1lPgorICAgICAgPGxvbmduYW1lPlZpZGVvIGZsaXBwZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkZsaXBzIGFuZCByb3RhdGVzIHZpZGVvPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RGF2aWQgU2NobGVlZiAmbHQ7ZHNAc2NobGVlZi5vcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBBWVVWLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0JBLCBZNDQ0LCB4UkdCLCBSR0J4LCB4QkdSLCBCR1J4LCBSR0IsIEJHUiwgSTQyMCwgWVYxMiwgSVlVViwgWVVZMiwgVVlWWSwgWVZZVSwgTlYxMiwgTlYyMSwgR1JBWTgsIEdSQVkxNl9CRSwgR1JBWTE2X0xFIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBBWVVWLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0JBLCBZNDQ0LCB4UkdCLCBSR0J4LCB4QkdSLCBCR1J4LCBSR0IsIEJHUiwgSTQyMCwgWVYxMiwgSVlVViwgWVVZMiwgVVlWWSwgWVZZVSwgTlYxMiwgTlYyMSwgR1JBWTgsIEdSQVkxNl9CRSwgR1JBWTE2X0xFIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnZpZGVvbWVkaWFuPC9uYW1lPgorICAgICAgPGxvbmduYW1lPk1lZGlhbiBlZmZlY3Q8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkZpbHRlci9FZmZlY3QvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkFwcGx5IGEgbWVkaWFuIGZpbHRlciB0byBhbiBpbWFnZTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBJNDIwLCBZVjEyIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBJNDIwLCBZVjEyIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi12aWRlb21peGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzQ2M2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZpZGVvbWl4ZXIueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxwbHVnaW4+CisgIDxuYW1lPnZpZGVvbWl4ZXI8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5WaWRlbyBtaXhlcjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3QvdmlkZW9taXhlci8ubGlicy9saWJnc3R2aWRlb21peGVyLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHZpZGVvbWl4ZXIuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnZpZGVvbWl4ZXI8L25hbWU+CisgICAgICA8bG9uZ25hbWU+VmlkZW8gbWl4ZXIgMjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+RmlsdGVyL0VkaXRvci9WaWRlby9Db21wb3NpdG9yPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5NaXggbXVsdGlwbGUgdmlkZW8gc3RyZWFtczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW1AZmx1ZW5kby5jb20mZ3Q7LCBTZWJhc3RpYW4gRHLDtmdlICZsdDtzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rXyV1PC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5yZXF1ZXN0PC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBBWVVWLCBCR1JBLCBBUkdCLCBSR0JBLCBBQkdSLCBZNDQ0LCBZNDJCLCBZVVkyLCBVWVZZLCBZVllVLCBJNDIwLCBZVjEyLCBOVjEyLCBOVjIxLCBZNDFCLCBSR0IsIEJHUiwgeFJHQiwgeEJHUiwgUkdCeCwgQkdSeCB9LCB3aWR0aD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBoZWlnaHQ9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgZnJhbWVyYXRlPShmcmFjdGlvbilbIDAvMSwgMjE0NzQ4MzY0Ny8xIF08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgQVlVViwgQkdSQSwgQVJHQiwgUkdCQSwgQUJHUiwgWTQ0NCwgWTQyQiwgWVVZMiwgVVlWWSwgWVZZVSwgSTQyMCwgWVYxMiwgTlYxMiwgTlYyMSwgWTQxQiwgUkdCLCBCR1IsIHhSR0IsIHhCR1IsIFJHQngsIEJHUnggfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4tdnB4LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2Q1MWY4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXZweC54bWwKQEAgLTAsMCArMSw5NyBAQAorPHBsdWdpbj4KKyAgPG5hbWU+dnB4PC9uYW1lPgorICA8ZGVzY3JpcHRpb24+VlA4IHBsdWdpbjwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9leHQvdnB4Ly5saWJzL2xpYmdzdHZweC5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3R2cHguc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnZwOGRlYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5PbjIgVlA4IERlY29kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlY29kZXIvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkRlY29kZSBWUDggdmlkZW8gc3RyZWFtczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkRhdmlkIFNjaGxlZWYgJmx0O2RzQGVudHJvcHl3YXZlLmNvbSZndDssIFNlYmFzdGlhbiBEcsO2Z2UgJmx0O3NlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC12cDg8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUk0MjAsIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnZwOGVuYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5PbjIgVlA4IEVuY29kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0VuY29kZXIvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkVuY29kZSBWUDggdmlkZW8gc3RyZWFtczwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkRhdmlkIFNjaGxlZWYgJmx0O2RzQGVudHJvcHl3YXZlLmNvbSZndDssIFNlYmFzdGlhbiBEcsO2Z2UgJmx0O3NlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNpbms8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zaW5rPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+dmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUk0MjAsIHdpZHRoPShpbnQpWyAxLCAxNjM4MyBdLCBoZWlnaHQ9KGludClbIDEsIDE2MzgzIF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtdnA4LCBwcm9maWxlPShzdHJpbmcpeyAwLCAxLCAyLCAzIH08L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgIDwvcGFkcz4KKyAgICA8L2VsZW1lbnQ+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT52cDlkZWM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+T24yIFZQOSBEZWNvZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZWNvZGVyL1ZpZGVvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5EZWNvZGUgVlA5IHZpZGVvIHN0cmVhbXM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5EYXZpZCBTY2hsZWVmICZsdDtkc0BlbnRyb3B5d2F2ZS5jb20mZ3Q7LCBTZWJhc3RpYW4gRHLDtmdlICZsdDtzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51ayZndDs8L2F1dGhvcj4KKyAgICAgIDxwYWRzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zaW5rPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c2luazwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtdnA5PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEk0MjAsIFlWMTIsIFk0MkIsIFk0NDQgfSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGZyYW1lcmF0ZT0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+dnA5ZW5jPC9uYW1lPgorICAgICAgPGxvbmduYW1lPk9uMiBWUDkgRW5jb2RlcjwvbG9uZ25hbWU+CisgICAgICA8Y2xhc3M+Q29kZWMvRW5jb2Rlci9WaWRlbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RW5jb2RlIFZQOSB2aWRlbyBzdHJlYW1zPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+RGF2aWQgU2NobGVlZiAmbHQ7ZHNAZW50cm9weXdhdmUuY29tJmd0OywgU2ViYXN0aWFuIERyw7ZnZSAmbHQ7c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWsmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBJNDIwLCBZVjEyIH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXZwOSwgcHJvZmlsZT0oc3RyaW5nKXsgMCwgMSwgMiwgMyB9PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVmb3JtLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlZm9ybS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkMjc3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlZm9ybS54bWwKQEAgLTAsMCArMSwyMCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+d2F2ZWZvcm08L25hbWU+CisgIDxkZXNjcmlwdGlvbj5XYXZlRm9ybSBBUEkgYmFzZWQgcGx1Z2luPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL3dpbjMyL3ZzNi9yZWxlYXNlL2xpYmdzdHdhdmVmb3JtLmRsbDwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3R3YXZlZm9ybS5kbGw8L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4wLjEwLjQuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1iYWQ8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgQ1ZTPC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+d2F2ZWZvcm1zaW5rPC9uYW1lPgorICAgICAgPGxvbmduYW1lPldhdmVGb3JtIGF1ZGlvIHNpbms8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPlNpbmsvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPldhdmVGb3JtIGF1ZGlvIHNpbms8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TZWJhc3RpZW4gTW91dHRlICZsdDtzZWJhc3RpZW5AbW91dHRlLm5ldCZndDs8L2F1dGhvcj4KKyAgICA8L2VsZW1lbnQ+CisgIDwvZWxlbWVudHM+Cis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdmVuYy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5ODhiMwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZlbmMueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzxwbHVnaW4+CisgIDxuYW1lPndhdmVuYzwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkVuY29kZSByYXcgYXVkaW8gaW50byBXQVY8L2Rlc2NyaXB0aW9uPgorICA8ZmlsZW5hbWU+Li4vLi4vZ3N0L3dhdmVuYy8ubGlicy9saWJnc3R3YXZlbmMuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0d2F2ZW5jLnNvPC9iYXNlbmFtZT4KKyAgPHZlcnNpb24+MS4xMy4wLjE8L3ZlcnNpb24+CisgIDxsaWNlbnNlPkxHUEw8L2xpY2Vuc2U+CisgIDxzb3VyY2U+Z3N0LXBsdWdpbnMtZ29vZDwvc291cmNlPgorICA8cGFja2FnZT5HU3RyZWFtZXIgR29vZCBQbHVnLWlucyBnaXQ8L3BhY2thZ2U+CisgIDxvcmlnaW4+VW5rbm93biBwYWNrYWdlIG9yaWdpbjwvb3JpZ2luPgorICA8ZWxlbWVudHM+CisgICAgPGVsZW1lbnQ+CisgICAgICA8bmFtZT53YXZlbmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+V0FWIGF1ZGlvIG11eGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9NdXhlci9BdWRpbzwvY2xhc3M+CisgICAgICA8ZGVzY3JpcHRpb24+RW5jb2RlIHJhdyBhdWRpbyBpbnRvIFdBVjwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPklhaW4gSG9sbWVzICZsdDtpYWluQHByZXR0eXBlb3BsZS5vcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgcmF0ZT0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBjaGFubmVscz0oaW50KVsgMSwgNjU1MzUgXSwgZm9ybWF0PShzdHJpbmcpeyBTMzJMRSwgUzI0TEUsIFMxNkxFLCBVOCwgRjMyTEUsIEY2NExFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkOyBhdWRpby94LWFsYXcsIHJhdGU9KGludClbIDgwMDAsIDE5MjAwMCBdLCBjaGFubmVscz0oaW50KVsgMSwgMiBdOyBhdWRpby94LW11bGF3LCByYXRlPShpbnQpWyA4MDAwLCAxOTIwMDAgXSwgY2hhbm5lbHM9KGludClbIDEsIDIgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXdhdjsgYXVkaW8veC1yZjY0PC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwN2VjODMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4td2F2cGFjay54bWwKQEAgLTAsMCArMSw2MSBAQAorPHBsdWdpbj4KKyAgPG5hbWU+d2F2cGFjazwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPldhdnBhY2sgbG9zc2xlc3MvbG9zc3kgYXVkaW8gZm9ybWF0IGhhbmRsaW5nPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2V4dC93YXZwYWNrLy5saWJzL2xpYmdzdHdhdnBhY2suc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0d2F2cGFjay5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+d2F2cGFja2RlYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5XYXZwYWNrIGF1ZGlvIGRlY29kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0RlY29kZXIvQXVkaW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkRlY29kZXMgV2F2cGFjayBhdWRpbyBkYXRhPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxhdXRob3I+QXJ3ZWQgdi4gTWVya2F0eiAmbHQ7di5tZXJrYXR6QGdteC5uZXQmZ3Q7LCBTZWJhc3RpYW4gRHLDtmdlICZsdDtzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXdhdnBhY2ssIGRlcHRoPShpbnQpWyAxLCAzMiBdLCBjaGFubmVscz0oaW50KVsgMSwgOCBdLCByYXRlPShpbnQpWyA2MDAwLCAxOTIwMDAgXSwgZnJhbWVkPShib29sZWFuKXRydWU8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPmFsd2F5czwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVM4LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZCwgY2hhbm5lbHM9KGludClbIDEsIDggXSwgcmF0ZT0oaW50KVsgNjAwMCwgMTkyMDAwIF07IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTMTZMRSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIGNoYW5uZWxzPShpbnQpWyAxLCA4IF0sIHJhdGU9KGludClbIDYwMDAsIDE5MjAwMCBdOyBhdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzMyTEUsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCBjaGFubmVscz0oaW50KVsgMSwgOCBdLCByYXRlPShpbnQpWyA2MDAwLCAxOTIwMDAgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPndhdnBhY2tlbmM8L25hbWU+CisgICAgICA8bG9uZ25hbWU+V2F2cGFjayBhdWRpbyBlbmNvZGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9FbmNvZGVyL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5FbmNvZGVzIGF1ZGlvIHdpdGggdGhlIFdhdnBhY2sgbG9zc2xlc3MvbG9zc3kgYXVkaW8gY29kZWM8L2Rlc2NyaXB0aW9uPgorICAgICAgPGF1dGhvcj5TZWJhc3RpYW4gRHLDtmdlICZsdDtzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmcmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXJhdywgZm9ybWF0PShzdHJpbmcpUzMyTEUsIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkLCBjaGFubmVscz0oaW50KVsgMSwgOCBdLCByYXRlPShpbnQpWyA2MDAwLCAxOTIwMDAgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXdhdnBhY2ssIGRlcHRoPShpbnQpWyAxLCAzMiBdLCBjaGFubmVscz0oaW50KVsgMSwgOCBdLCByYXRlPShpbnQpWyA2MDAwLCAxOTIwMDAgXSwgZnJhbWVkPShib29sZWFuKXRydWU8L2RldGFpbHM+CisgICAgICAgIDwvY2Fwcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+d3Zjc3JjPC9uYW1lPgorICAgICAgICAgIDxkaXJlY3Rpb24+c291cmNlPC9kaXJlY3Rpb24+CisgICAgICAgICAgPHByZXNlbmNlPnNvbWV0aW1lczwvcHJlc2VuY2U+CisgICAgICAgICAgPGRldGFpbHM+YXVkaW8veC13YXZwYWNrLWNvcnJlY3Rpb24sIGZyYW1lZD0oYm9vbGVhbil0cnVlPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXdhdnBhcnNlLnhtbCBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MyZTJiMQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi13YXZwYXJzZS54bWwKQEAgLTAsMCArMSwzNCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+d2F2cGFyc2U8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5QYXJzZSBhIC53YXYgZmlsZSBpbnRvIHJhdyBhdWRpbzwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9nc3Qvd2F2cGFyc2UvLmxpYnMvbGliZ3N0d2F2cGFyc2Uuc288L2ZpbGVuYW1lPgorICA8YmFzZW5hbWU+bGliZ3N0d2F2cGFyc2Uuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPndhdnBhcnNlPC9uYW1lPgorICAgICAgPGxvbmduYW1lPldBViBhdWRpbyBkZW11eGVyPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Db2RlYy9EZW11eGVyL0F1ZGlvPC9jbGFzcz4KKyAgICAgIDxkZXNjcmlwdGlvbj5QYXJzZSBhIC53YXYgZmlsZSBpbnRvIHJhdyBhdWRpbzwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkVyaWsgV2FsdGhpbnNlbiAmbHQ7b21lZ2FAY3NlLm9naS5lZHUmZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby94LXdhdjwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hdWRpby9tcy1nc207IGF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPShpbnQpMSwgbGF5ZXI9KGludCkzOyBhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTEsIGxheWVyPShpbnQpMjsgYXVkaW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKXsgUzgsIFU4LCBTMTZMRSwgVTE2TEUsIFMyNExFLCBVMjRMRSwgUzMyTEUsIFUzMkxFIH0sIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkOyBhdWRpby94LXZvcmJpczsgYXVkaW8veC1hYzM7IGF1ZGlvL3gtZHRzOyBhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQ7IGF1ZGlvL3gtYWxhdzsgYXVkaW8veC1tdWxhdzsgYXVkaW8veC13bXMsIGJpdHJhdGU9KGludClbIDAsIDIxNDc0ODM2NDcgXSwgYmxvY2tfYWxpZ249KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC1hZHBjbSwgbGF5b3V0PShzdHJpbmcpbWljcm9zb2Z0LCBibG9ja19hbGlnbj0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LWFkcGNtLCBsYXlvdXQ9KHN0cmluZylkdmksIGJsb2NrX2FsaWduPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtdHJ1ZXNwZWVjaDsgYXVkaW8veC13bWEsIHdtYXZlcnNpb249KGludCkxLCBiaXRyYXRlPShpbnQpWyAwLCAyMTQ3NDgzNjQ3IF0sIGJsb2NrX2FsaWduPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF07IGF1ZGlvL3gtd21hLCB3bWF2ZXJzaW9uPShpbnQpMiwgYml0cmF0ZT0oaW50KVsgMCwgMjE0NzQ4MzY0NyBdLCBibG9ja19hbGlnbj0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdOyBhdWRpby94LXdtYSwgd21hdmVyc2lvbj0oaW50KTMsIGJpdHJhdGU9KGludClbIDAsIDIxNDc0ODM2NDcgXSwgYmxvY2tfYWxpZ249KGludClbIDEsIDIxNDc0ODM2NDcgXTsgYXVkaW8veC12bmQuc29ueS5hdHJhYzM7IGF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZyl7IEYzMkxFLCBGNjRMRSB9LCBsYXlvdXQ9KHN0cmluZylpbnRlcmxlYXZlZDsgYXVkaW8veC12b3h3YXJlLCB2b3h3YXJldHlwZT0oaW50KTExNzsgYXVkaW8veC1hZHBjbSwgbGF5b3V0PShzdHJpbmcpZGs0OyBhdWRpby94LWFkcGNtLCBsYXlvdXQ9KHN0cmluZylkazM7IGF1ZGlvL3gtYWRwY20sIGxheW91dD0oc3RyaW5nKWR2aTsgYXVkaW8vQU1SOyBhdWRpby9BTVItV0I7IGF1ZGlvL3gtc2lyZW47IGFwcGxpY2F0aW9uL3gtb2dnLWF2aTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXhpbWFnZXNyYy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwODBiZAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvcGx1Z2lucy9pbnNwZWN0L3BsdWdpbi14aW1hZ2VzcmMueG1sCkBAIC0wLDAgKzEsMjggQEAKKzxwbHVnaW4+CisgIDxuYW1lPnhpbWFnZXNyYzwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPlgxMSB2aWRlbyBpbnB1dCBwbHVnaW4gdXNpbmcgc3RhbmRhcmQgWGxpYiBjYWxsczwvZGVzY3JpcHRpb24+CisgIDxmaWxlbmFtZT4uLi8uLi9zeXMveGltYWdlLy5saWJzL2xpYmdzdHhpbWFnZXNyYy5zbzwvZmlsZW5hbWU+CisgIDxiYXNlbmFtZT5saWJnc3R4aW1hZ2VzcmMuc288L2Jhc2VuYW1lPgorICA8dmVyc2lvbj4xLjEzLjAuMTwvdmVyc2lvbj4KKyAgPGxpY2Vuc2U+TEdQTDwvbGljZW5zZT4KKyAgPHNvdXJjZT5nc3QtcGx1Z2lucy1nb29kPC9zb3VyY2U+CisgIDxwYWNrYWdlPkdTdHJlYW1lciBHb29kIFBsdWctaW5zIGdpdDwvcGFja2FnZT4KKyAgPG9yaWdpbj5Vbmtub3duIHBhY2thZ2Ugb3JpZ2luPC9vcmlnaW4+CisgIDxlbGVtZW50cz4KKyAgICA8ZWxlbWVudD4KKyAgICAgIDxuYW1lPnhpbWFnZXNyYzwvbmFtZT4KKyAgICAgIDxsb25nbmFtZT5YaW1hZ2UgdmlkZW8gc291cmNlPC9sb25nbmFtZT4KKyAgICAgIDxjbGFzcz5Tb3VyY2UvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkNyZWF0ZXMgYSBzY3JlZW5zaG90IHZpZGVvIHN0cmVhbTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPkx1dHogTXVlbGxlciAmbHQ7bHV0ekB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQmZ3Q7LCBKYW4gU2NobWlkdCAmbHQ7dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbSZndDssIFphaGVlciBNZXJhbGkgJmx0O3phaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnJmd0OzwvYXV0aG9yPgorICAgICAgPHBhZHM+CisgICAgICAgIDxjYXBzPgorICAgICAgICAgIDxuYW1lPnNyYzwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNvdXJjZTwvZGlyZWN0aW9uPgorICAgICAgICAgIDxwcmVzZW5jZT5hbHdheXM8L3ByZXNlbmNlPgorICAgICAgICAgIDxkZXRhaWxzPnZpZGVvL3gtcmF3LCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXSwgd2lkdGg9KGludClbIDEsIDIxNDc0ODM2NDcgXSwgaGVpZ2h0PShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIHBpeGVsLWFzcGVjdC1yYXRpbz0oZnJhY3Rpb24pWyAwLzEsIDIxNDc0ODM2NDcvMSBdPC9kZXRhaWxzPgorICAgICAgICA8L2NhcHM+CisgICAgICA8L3BhZHM+CisgICAgPC9lbGVtZW50PgorICA8L2VsZW1lbnRzPgorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWwgYi9kb2NzL3BsdWdpbnMvaW5zcGVjdC9wbHVnaW4teTRtZW5jLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTU0MzNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9wbHVnaW5zL2luc3BlY3QvcGx1Z2luLXk0bWVuYy54bWwKQEAgLTAsMCArMSwzNCBAQAorPHBsdWdpbj4KKyAgPG5hbWU+eTRtZW5jPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+RW5jb2RlcyBhIFlVViBmcmFtZSBpbnRvIHRoZSB5dXY0bXBlZyBmb3JtYXQgKG1qcGVndG9vbHMpPC9kZXNjcmlwdGlvbj4KKyAgPGZpbGVuYW1lPi4uLy4uL2dzdC95NG0vLmxpYnMvbGliZ3N0eTRtZW5jLnNvPC9maWxlbmFtZT4KKyAgPGJhc2VuYW1lPmxpYmdzdHk0bWVuYy5zbzwvYmFzZW5hbWU+CisgIDx2ZXJzaW9uPjEuMTMuMC4xPC92ZXJzaW9uPgorICA8bGljZW5zZT5MR1BMPC9saWNlbnNlPgorICA8c291cmNlPmdzdC1wbHVnaW5zLWdvb2Q8L3NvdXJjZT4KKyAgPHBhY2thZ2U+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0PC9wYWNrYWdlPgorICA8b3JpZ2luPlVua25vd24gcGFja2FnZSBvcmlnaW48L29yaWdpbj4KKyAgPGVsZW1lbnRzPgorICAgIDxlbGVtZW50PgorICAgICAgPG5hbWU+eTRtZW5jPC9uYW1lPgorICAgICAgPGxvbmduYW1lPllVVjRNUEVHIHZpZGVvIGVuY29kZXI8L2xvbmduYW1lPgorICAgICAgPGNsYXNzPkNvZGVjL0VuY29kZXIvVmlkZW88L2NsYXNzPgorICAgICAgPGRlc2NyaXB0aW9uPkVuY29kZXMgYSBZVVYgZnJhbWUgaW50byB0aGUgeXV2NG1wZWcgZm9ybWF0IChtanBlZ3Rvb2xzKTwvZGVzY3JpcHRpb24+CisgICAgICA8YXV0aG9yPldpbSBUYXltYW5zICZsdDt3aW0udGF5bWFuc0BnbWFpbC5jb20mZ3Q7PC9hdXRob3I+CisgICAgICA8cGFkcz4KKyAgICAgICAgPGNhcHM+CisgICAgICAgICAgPG5hbWU+c2luazwvbmFtZT4KKyAgICAgICAgICA8ZGlyZWN0aW9uPnNpbms8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz52aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpeyBJWVVWLCBJNDIwLCBZNDJCLCBZNDFCLCBZNDQ0IH0sIHdpZHRoPShpbnQpWyAxLCAyMTQ3NDgzNjQ3IF0sIGhlaWdodD0oaW50KVsgMSwgMjE0NzQ4MzY0NyBdLCBmcmFtZXJhdGU9KGZyYWN0aW9uKVsgMC8xLCAyMTQ3NDgzNjQ3LzEgXTwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgICA8Y2Fwcz4KKyAgICAgICAgICA8bmFtZT5zcmM8L25hbWU+CisgICAgICAgICAgPGRpcmVjdGlvbj5zb3VyY2U8L2RpcmVjdGlvbj4KKyAgICAgICAgICA8cHJlc2VuY2U+YWx3YXlzPC9wcmVzZW5jZT4KKyAgICAgICAgICA8ZGV0YWlscz5hcHBsaWNhdGlvbi94LXl1djRtcGVnLCB5NG12ZXJzaW9uPShpbnQpMjwvZGV0YWlscz4KKyAgICAgICAgPC9jYXBzPgorICAgICAgPC9wYWRzPgorICAgIDwvZWxlbWVudD4KKyAgPC9lbGVtZW50cz4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvcmFuZG9tL0NoYW5nZUxvZy0wLjggYi9kb2NzL3JhbmRvbS9DaGFuZ2VMb2ctMC44Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2M2VmNmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3JhbmRvbS9DaGFuZ2VMb2ctMC44CkBAIC0wLDAgKzEsMTc1MDEgQEAKKzIwMDUtMDgtMjggIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIFVwZGF0ZXMgZm9yIHR3by1hcmcgaW5pdCBmcm9tIEdTVF9CT0lMRVJQTEFURS4KKworCSogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuYyAoZ3N0X3NpZ25hbF9wcm9jZXNzb3JfaW5pdCk6IFVzZQorCXRoZSBzZWNvbmQgYXJnIGZvciB0aGUgY2xhc3MsIGJlY2F1c2UgR19PQkpFQ1RfR0VUX0NMQVNTIChzZWxmKQorCXJldHVybnMgdGhlIHdyb25nIHRoaW5nLgorCShnc3Rfc2lnbmFsX3Byb2Nlc3Nvcl9hZGRfcGFkX2Zyb21fdGVtcGxhdGUpOiBNYWtlIHBhZHMgb2YgdGhlCisJcmlnaHQgdHlwZS4KKworCSogZXh0L2xhZHNwYS9nc3RsYWRzcGEuYyAoZ3N0X2xhZHNwYV9jbGFzc19nZXRfcGFyYW1fc3BlYyk6IE1ha2UKKwl3cml0YWJsZSBwYXJhbSBzcGVjcyBHX1BBUkFNX0NPTlNUUlVDVCBzbyBkZWZhdWx0IHZhbHVlcyB3b3JrLgorCShnc3RfbGFkc3BhX2luaXQpOiBVc2UgdGhlIHNlY29uZCBhcmcgZm9yIHRoZSBjbGFzcy4KKworMjAwNS0wOC0yNiAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L2xhZHNwYS9nc3RsYWRzcGEuYzogCisJKiBleHQvbGFkc3BhL2dzdGxhZHNwYS5oOiBGaW5pc2ggcG9ydGluZywgc3RpbGwgZG9lc24ndCB3b3JrIGJ1dAorCWl0IGRvZXMgY29tcGlsZSBhbmQgcmVnaXN0ZXIuIEkgaGF2ZSBtb3JlIGZlYXR1cmVzIHRoYW4geW91LgorCQorCSogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuaDogCisJKiBleHQvbGFkc3BhL2dzdHNpZ25hbHByb2Nlc3Nvci5jOiBVcGRhdGVzLCBidWcgZml4ZW4uCisKKzIwMDUtMDgtMjYgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6IChnc3RfcXVhcmt0dl9pbml0KSwKKwkoZ3N0X3F1YXJrdHZfY2hhbmdlX3N0YXRlKToKKwkgIGRvIHByb3BlciBjbGVhbnVwL2NyZWF0aW9uLCBmaXhlcyBzdGF0ZSBjaGFuZ2VzCisKKzIwMDUtMDgtMjUgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfbWVzc2FnZV9uZXcpOgorCVJldmVydCB1bnBvcHVsYXIgY2hhbmdlIGZvciBHU1RfTUVTU0FHRV9TUkMgdG8gR09iamVjdC4KKworMjAwNS0wOC0yNSAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L2xhZHNwYS9nc3RsYWRzcGEuaDogCisJKiBleHQvbGFkc3BhL2dzdGxhZHNwYS5jOiBIYWxmd2F5LXBvcnRlZC4gRG9lc24ndCBjb21waWxlIHlldC4KKworCSogZXh0L2xhZHNwYS9nc3RzaWduYWxwcm9jZXNzb3IuaDoKKwkqIGV4dC9sYWRzcGEvZ3N0c2lnbmFscHJvY2Vzc29yLmM6IE5ldyBmaWxlcywgdGhlIHN0YXJ0IG9mIGEgYmFzZQorCWNsYXNzIGZvciBEU1AgZWxlbWVudHMuCisKKwkqIGNvbmZpZ3VyZS5hYzogU29ydCB0aGUgZXh0ZXJuYWwgbGlicyBjaGVja3MsIGFkZCBhIGxhZHNwYSBjaGVjaywKKwlvdXRwdXQgdGhlIGxhZHNwYSBtYWtlZmlsZS4KKworMjAwNS0wOC0yNSAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwkqIGdzdC9yZWFsbWVkaWEvcm1kZW11eC5jIChnc3Rfcm1kZW11eF9sb29wLCBnc3Rfcm1kZW11eF9jaGFpbik6CisJRml4ZWQgRU9TLgorCShnc3Rfcm1kZW11eF9wYXJzZV9pbmR4X2RhdGEsIGdzdF9ybWRlbXV4X3BhcnNlX2luZHgpOiBIYW5kbGUKKwltYWxmb3JtZWQgaW5kZXggaGVhZGVycyB3aGVyZSB0aGUgcGFja2V0IHNpemUgaXMgaW5jb3JyZWN0LgorCisyMDA1LTA4LTI0ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5jIChnc3RfZHZkZW11eF9kZW11eF9mcmFtZSk6IFNlbmQgb3V0IHZhbGlkCisJc2VnbWVudCBlbmQgdGltZXN0YW1wcy4KKworMjAwNS0wOC0yNCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSAgbGFtZSBhbmQgbXBlZ2F1ZGlvcGFyc2Ugc2VlbSB0byB3b3JrCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogKGdzdF92aWRlb19ib3hfY2xhc3NfaW5pdCksCisJKGdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2NhcHMpLCAoZ3N0X3ZpZGVvX2JveF9nZXRfdW5pdF9zaXplKToKKwkgIHVwZGF0ZSBmb3IgYmFzZXRyYW5zZm9ybSBjaGFuZ2VzCisKKzIwMDUtMDgtMjQgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiAoZ3N0X2xldmVsX21lc3NhZ2VfbmV3KToKKwkgIEdTVF9NRVNTQUdFX1NSQyBiZWNhbWUgYSBHT2JqZWN0CisKKzIwMDUtMDgtMjMgIFN0ZWZhbiBLb3N0ICA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5oOgorCSAgRml4ZWQgaW5jbHVkZSBwYXRoIG9mIGFkYXB0ZXIKKworMjAwNS0wOC0yMyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiAoZ3N0X3NwZWV4X2RlY19jbGFzc19pbml0KToKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiAoZ3N0X3NwZWV4ZW5jX2NsYXNzX2luaXQpOgorCUZpeCBwcm9wZXJ0eSB3YXJuaW5nLgorCisyMDA1LTA4LTIzICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBhbXJkZWMuYzogKGdzdF9ydHBhbXJkZWNfaW5pdCksCisJKGdzdF9ydHBhbXJkZWNfc2lua19zZXRjYXBzKSwgKGdzdF9ydHBhbXJkZWNfY2hhaW4pOgorCSogZ3N0L3J0cC9nc3RydHBhbXJlbmMuYzogKGdzdF9ydHBhbXJlbmNfY2xhc3NfaW5pdCksCisJKGdzdF9ydHBhbXJlbmNfaW5pdCksIChnc3RfcnRwYW1yZW5jX2NoYWluKToKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BlbmMuYzogKGdzdF9ydHBoMjYzcGVuY19jbGFzc19pbml0KSwKKwkoZ3N0X3J0cGgyNjNwZW5jX2ZsdXNoKSwgKGdzdF9ydHBoMjYzcGVuY19jaGFpbik6CisJU21hbGwgdXBkYXRlcywgUkZDIHJlZmVyZW5jZSB0byBwYXlsb2FkIGVuY29kZXJzLgorCisyMDA1LTA4LTIzICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvc3BlZXgvTWFrZWZpbGUuYW06CisJKiBleHQvc3BlZXgvZ3N0c3BlZXguYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiAoc3BlZXhfZ2V0X3F1ZXJ5X3R5cGVzKSwKKwkoZ3N0X3NwZWV4X2RlY19pbml0KSwgKHNwZWV4X2RlY19zcmNfcXVlcnkpLCAoc3BlZXhfZGVjX3NyY19ldmVudCksCisJKHNwZWV4X2RlY19ldmVudCksIChzcGVleF9kZWNfY2hhaW4pOgorCSAgUG9ydCBzcGVleGRlYy4gTGVhZHMgdG8gc29tZSB1bmZhbWlsaWFyIHdhcm5pbmdzIG9uIGNvbnNvbGUsCisJICBidXQgd29ya3Mgb3RoZXJ3aXNlLgorCisyMDA1LTA4LTIzICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jIChnc3Rfb3NzX3NyY19vcGVuKTogU2V0IHRoZSBkZXZpY2UtbmFtZQorCXByb3BlcnR5IGFmdGVyIG9wZW5pbmcgdGhlIG1peGVyLgorCisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOiAKKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmg6IEVhc3kgdG8gaW1wbGVtZW50IGEgbWl4ZXIsIGVoLi4uCisKKwkqIHN5cy9vc3MvZ3N0b3NzbWl4ZXJlbGVtZW50Lmg6CisJKiBzeXMvb3NzL2dzdG9zc21peGVyZWxlbWVudC5jOiBBZGRlZCBtaXhlciBlbGVtZW50IGxpa2UKKwlhbHNhbWl4ZXIuCisKKwkqIHN5cy9vc3MvTWFrZWZpbGUuYW06IAorCSogc3lzL29zcy9nc3Rvc3NhdWRpby5jOiBSZWdpc3RlciB0aGUgb3NzbWl4ZXIgZWxlbWVudC4KKwkKKwkqIHN5cy9vc3MvZ3N0b3NzbWl4ZXIuaDoKKwkqIHN5cy9vc3MvZ3N0b3NzbWl4ZXIuYzogUmVmYWN0b3JlZCB0byBiZSBtb3JlIGxpa2UgYWxzYW1peGVyLgorCisJKiBzeXMvb3NzL2dzdG9zc21peGVydHJhY2suaDoKKwkqIHN5cy9vc3MvZ3N0b3NzbWl4ZXJ0cmFjay5jOiBTcGxpdCBvdXQgZnJvbSBnc3Rvc3NtaXhlci5bY2hdLAorCWxpa2UgZ3N0YWxzYW1peGVyLgorCisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOgorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IFdoZXJlIGJlZm9yZSB3ZSB1c2VkIGEgZ3N0b3NzZWxlbWVudAorCW9iamVjdCBhcyBhIGhlbHBlciBsaWJyYXJ5LCBub3cganVzdCBjYWxsIGZ1bmN0aW9ucyBmcm9tCisJZ3N0b3NzaGVscGVyLgorCisJKiBzeXMvb3NzL2dzdG9zc2hlbHBlci5oOgorCSogc3lzL29zcy9nc3Rvc3NoZWxwZXIuYzogTWFkZSBhIHJlYWwgbGlicmFyeS4gUmVtb3ZlZAorCXByb3BlcnR5cHJvYmUgZm9yIG5vdywgc2hvdWxkIGFkZCBpdCBiYWNrIGxhdGVyLgorCQorCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50Lmg6CisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogUmVtb3ZlZCwgd2UgZG9uJ3QgaGF2ZSBhIHNoYXJlZCBiYXNlCisJY2xhc3MuCisJCisJKiBzeXMvb3NzL2dzdG9zc2hlbHBlci5jIChnc3Rfb3NzX2hlbHBlcl9wcm9iZV9jYXBzKTogU2VhcmNoCisJaGlnaGVyLXRvLWxvd2VyLCBtYWtlcyAxNiBiaXQgYXBwZWFyIGVhcmxpZXIgaW4gdGhlIGNhcHMsIHdoaWNoCisJbWFrZXMgaXQgcHJlZmVycmVkLgorCisJKiBzeXMvb3NzL2dzdG9zc3NyYy5oOiAKKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6IFRvdGFsbHkgcG9ydGVkLCBkdWRlLgorCisJKiBzeXMvb3NzL01ha2VmaWxlLmFtOgorCSogc3lzL29zcy9nc3Rvc3NhdWRpby5jOiBBZGQgb3Nzc3JjLgorCQorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IFdlIGRvIG5hdGl2ZSBieXRlIG9yZGVyLgorCisyMDA1LTA4LTIzICBPd2VuIEZyYXNlci1HcmVlbiAgPG93ZW5AZGlzY29iYWJlLm5ldD4KKworCSogZ3N0L3JlYWxtZWRpYS9ybWRlbXV4LmMgKGdzdF9ybWRlbXV4X3NyY19ldmVudCk6IEZpeGVkIGJ1ZworCWNhdXNpbmcgZXZlbnRzIHRvIGJlIHBhc3NlZCB3cm9uZyB3YXkuCisJKGdzdF9ybWRlbXV4X3BhcnNlX3BhY2tldCk6IEF2b2lkIGFjY2lkZW50YWxseSBza2lwcGluZyBhdWRpby4KKworMjAwNS0wOC0yMiAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfaW5pdCksCisJKGdzdF9pZDNfdGFnX3NpbmtfZXZlbnQpLCAoZ3N0X2lkM190YWdfZG9fY2Fwc19uZWdvKSwKKwkoZ3N0X2lkM190YWdfY2hhaW4pLCAoZ3N0X2lkM190YWdfY2hhbmdlX3N0YXRlKSwgKHBsdWdpbl9pbml0KToKKwkgIFdvcmtzIGEgYml0IGJldHRlciBub3csIGJ1dCBzdGlsbCBuZWVkcyBhIHJld3JpdGUgdG8gdXNlCisJICBnZXRfcmFuZ2UgaW5zdGVhZCBvZiB0aGlzIHNlZWtpbmcgbmFzdGluZXNzLgorCisyMDA1LTA4LTIyICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvZmxhYy9NYWtlZmlsZS5hbToKKwkqIGV4dC9mbGFjL2dzdGZsYWMuYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGZsYWNkZWNfZ2V0X3R5cGUpLCAoZ3N0X2ZsYWNkZWNfaW5pdCksCisJKGdzdF9mbGFjZGVjX3VwZGF0ZV9tZXRhZGF0YSksIChnc3RfZmxhY2RlY19zZWVrKSwKKwkoZ3N0X2ZsYWNkZWNfdGVsbCksIChnc3RfZmxhY2RlY19sZW5ndGgpLCAoZ3N0X2ZsYWNkZWNfcmVhZCksCisJKGdzdF9mbGFjZGVjX3dyaXRlKSwgKGdzdF9mbGFjZGVjX2xvb3ApLAorCShnc3RfZmxhY2RlY19nZXRfc3JjX3F1ZXJ5X3R5cGVzKSwgKGdzdF9mbGFjZGVjX3NyY19xdWVyeSksCisJKGdzdF9mbGFjZGVjX3NyY19ldmVudCksIChnc3RfZmxhY2RlY19zaW5rX2FjdGl2YXRlKSwKKwkoZ3N0X2ZsYWNkZWNfc2lua19hY3RpdmF0ZV9wdWxsKSwgKGdzdF9mbGFjZGVjX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmg6CisJICBQb3J0IGZsYWNkZWMgKHNlZWtpbmcgaXMgc3RpbGwgc2xvdydpc2gpLgorCisyMDA1LTA4LTIyICBPd2VuIEZyYXNlci1HcmVlbiAgPG93ZW5AZGlzY29iYWJlLm5ldD4KKworCSogZ3N0L3JlYWxtZWRpYS9ybWRlbXV4LmM6IAorCShnc3Rfcm1kZW11eF9wZXJmb3JtX3NlZWssIGdzdF9ybWRlbXV4X3BhcnNlX3BhY2tldCk6IAorCVNlZWtpbmcgaW1wcm92ZW1lbnRzLgorCisyMDA1LTA4LTE5ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogKGdzdF9tdWx0aXVkcHNpbmtfY2xhc3NfaW5pdCk6CisJUmVtb3ZlIGdldF90aW1lIGNvZGUgdGhhdCBpcyBib3RoIHdyb25nIGFuZCB1bm5lZWRlZC4KKworMjAwNS0wOC0xOSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BlbmMuYzogKGdzdF9ydHBoMjYzcGVuY19jbGFzc19pbml0KSwKKwkoZ3N0X3J0cGgyNjNwZW5jX2ZsdXNoKSwgKGdzdF9ydHBoMjYzcGVuY19jaGFpbiksCisJKGdzdF9ydHBoMjYzcGVuY19zZXRfcHJvcGVydHkpLCAoZ3N0X3J0cGgyNjNwZW5jX2dldF9wcm9wZXJ0eSk6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZW5jLmg6CisJQWRkZWQgY29uZmlndXJhYmxlIHB0IGFuZCBzc3JjLCB0byBiZSBtZXJnZWQgaW4gdGhlIGNhcHMgb3IKKwlhIGJhc2UgY2xhc3MuLi4KKworMjAwNS0wOC0xOSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BkZWMuYzogKGdzdF9ydHBoMjYzcGRlY19pbml0KSwKKwkoZ3N0X3J0cGgyNjNwZGVjX2NoYWluKToKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BlbmMuYzogKGdzdF9ydHBoMjYzcGVuY19jbGFzc19pbml0KSwKKwkoZ3N0X3J0cGgyNjNwZW5jX2ZsdXNoKSwgKGdzdF9ydHBoMjYzcGVuY19jaGFpbik6CisJU29tZSBjbGVhbnVwcyBpbiB0aGUgaDI2M3AgKGRlKXBheWxvYWRlcnMuCisKKzIwMDUtMDgtMTkgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvYW1ybmIvYW1ybmJkZWMuYzoKKwkqIGV4dC9hbXJuYi9hbXJuYmVuYy5jOiAoZ3N0X2Ftcm5iZW5jX3NldGNhcHMpOgorCSogZXh0L2Ftcm5iL2Ftcm5icGFyc2UuYzoKKwlVcGRhdGUgY2FwcyB3aXRoIGF1ZGlvL0FNUi4KKwkKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZGVjLmM6IChnc3RfcnRwYW1yZGVjX2luaXQpLAorCShnc3RfcnRwYW1yZGVjX3Npbmtfc2V0Y2FwcyksIChnc3RfcnRwYW1yZGVjX2NoYWluKSwKKwkoZ3N0X3J0cGFtcmRlY19jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZWMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwYW1yZW5jLmM6IChnc3RfcnRwYW1yZW5jX2NsYXNzX2luaXQpLAorCShnc3RfcnRwYW1yZW5jX2luaXQpLCAoZ3N0X3J0cGFtcmVuY19jaGFpbik6CisJRG9udCBzZXQgRlQgaGVhZGVycyB0d2ljZSwgaXQgd2FzIGFscmVhZHkgaW4gdGhlIGVuY29kZWQKKwliaXRzdHJlYW0uCisJCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zZW5kKSwgKGdzdF9ydHNwc3JjX29wZW4pLAorCShnc3RfcnRzcHNyY19jbG9zZSksIChnc3RfcnRzcHNyY19wbGF5KToKKwkqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChwYXJzZV9saW5lKToKKwlDbGVhbnVwcworCQorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfY2xhc3NfaW5pdCksCisJKGdzdF91ZHBzcmNfY3JlYXRlKSwgKGdzdF91ZHBzcmNfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3VkcHNyY19nZXRfcHJvcGVydHkpOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwlBZGRlZCBjYXBzIHByb3BlcnR5LCB3ZSBuZWVkIHRoaXMgc29vbiB0byB0eXBlIHRoZSBidWZmZXJzLgorCisyMDA1LTA4LTE4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBhbXJkZWMuYzogKGdzdF9ydHBhbXJkZWNfaW5pdCksCisJKGdzdF9ydHBhbXJkZWNfY2hhaW4pOgorCUZpeCB1cCBhbXIgZGVwYXlsb2FkZXIgYSBiaXQuCisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX3NlbmQpLCAoZ3N0X3J0c3BzcmNfb3BlbiksCisJKGdzdF9ydHNwc3JjX2Nsb3NlKSwgKGdzdF9ydHNwc3JjX3BsYXkpOgorCUxvb2sgZm9yIG9wdGlvbnMgcmVzdWx0IGluIFB1YmxpYyBhbmQgQWxsb3cgaGVhZGVyIGZpZWxkcy4uCisJc3BlYyBzYXlzIEFsbG93IGJ1dCBzb21lIHNlcnZlcnMgcmV0dXJuIFB1YmxpYy4uLgorCisyMDA1LTA4LTE4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3J0cC9nc3RydHBhbXJlbmMuYzogKGdzdF9ydHBhbXJlbmNfY2xhc3NfaW5pdCksCisJKGdzdF9ydHBhbXJlbmNfaW5pdCksIChnc3RfcnRwYW1yZW5jX2NoYWluKSwKKwkoZ3N0X3J0cGFtcmVuY19zZXRfcHJvcGVydHkpLCAoZ3N0X3J0cGFtcmVuY19nZXRfcHJvcGVydHkpOgorCSogZ3N0L3J0cC9nc3RydHBhbXJlbmMuaDoKKwlBZGRlZCBwYXlsb2FkX3R5cGUgYW5kIHNzcmMgcHJvcGVydGllcyB0byB0aGUgcGF5bG9hZGVyLgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zZW5kKSwgKGdzdF9ydHNwc3JjX29wZW4pLAorCShnc3RfcnRzcHNyY19jbG9zZSksIChnc3RfcnRzcHNyY19wbGF5KToKKwlPcHRpb25zIG5lZWQgdG8gYmUgc3RyaXBwZWQgYW5kIGFyZSBpbiB0aGUgUHVibGljIGhlYWRlciBmaWVsZC4KKworCSogZ3N0L3J0c3AvcnRzcHVybC5jOiAocnRzcF91cmxfcGFyc2UpOgorCUZpeCB1cmwgLyBwYXJzaW5nLi4uCisKKworMjAwNS0wOC0xOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06CisJKiBnc3QvcnRwL2dzdHJ0cC5jOiAocGx1Z2luX2luaXQpOgorCSogZ3N0L3J0cC9nc3RydHBhbXJkZWMuYzogKGdzdF9ydHBhbXJkZWNfZ2V0X3R5cGUpLAorCShnc3RfcnRwYW1yZGVjX2Jhc2VfaW5pdCksIChnc3RfcnRwYW1yZGVjX2NsYXNzX2luaXQpLAorCShnc3RfcnRwYW1yZGVjX2luaXQpLCAoZ3N0X3J0cGFtcmRlY19jaGFpbiksCisJKGdzdF9ydHBhbXJkZWNfc2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBhbXJkZWNfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3J0cGFtcmRlY19jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3J0cGFtcmRlY19wbHVnaW5faW5pdCk6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmRlYy5oOgorCSogZ3N0L3J0cC9nc3RydHBhbXJlbmMuYzogKGdzdF9ydHBhbXJlbmNfZ2V0X3R5cGUpLAorCShnc3RfcnRwYW1yZW5jX2Jhc2VfaW5pdCksIChnc3RfcnRwYW1yZW5jX2NsYXNzX2luaXQpLAorCShnc3RfcnRwYW1yZW5jX2luaXQpLCAoZ3N0X3J0cGFtcmVuY19jaGFpbiksCisJKGdzdF9ydHBhbXJlbmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBhbXJlbmNfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3J0cGFtcmVuY19jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3J0cGFtcmVuY19wbHVnaW5faW5pdCk6CisJKiBnc3QvcnRwL2dzdHJ0cGFtcmVuYy5oOgorCSogZ3N0L3J0cC9nc3RydHBtcGFlbmMuYzogKGdzdF9ydHBtcGFlbmNfY2xhc3NfaW5pdCksCisJKGdzdF9ydHBtcGFlbmNfZmx1c2gpLCAoZ3N0X3J0cG1wYWVuY19jaGFpbik6CisJQWRkZWQgdmVyeSBzaW1wbGlzdGljIGFtciBwYXlsb2FkZXIuIGRlcGF5bG9hZGVyIGRvZXMgbm90CisJd29yayB5ZXQuCisKKzIwMDUtMDgtMTggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19zZW5kKSwgKGdzdF9ydHNwc3JjX29wZW4pLAorCShnc3RfcnRzcHNyY19jbG9zZSksIChnc3RfcnRzcHNyY19wbGF5KSwgKGdzdF9ydHNwc3JjX3BhdXNlKSwKKwkoZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkqIGdzdC9ydHNwL3J0c3BkZWZzLmM6IChydHNwX21ldGhvZF9hc190ZXh0KSwgKHJ0c3BfZmluZF9tZXRob2QpOgorCSogZ3N0L3J0c3AvcnRzcGRlZnMuaDoKKwkqIGdzdC9ydHNwL3J0c3B0cmFuc3BvcnQuYzogKHJ0c3BfdHJhbnNwb3J0X3BhcnNlKToKKwlIYW5kbGUgUlRTUCBkZWZhdWx0cyBiZXR0ZXIuCisJSXNzdWUgT1BUSU9OUyByZXF1ZXN0IHRvIGZpZ3VyZSBvdXQgd2hhdCB3ZSBhcmUgYWxsb3dlZCB0byBkby4KKwlNYWtlIHRoZSBtZXRob2RzIGEgYml0ZmllbGQgc28gd2UgY2FuIGVhc2lseSBjb2xsZWN0IHN1cHBvcnRlZCAKKwlvcHRpb25zLgorCUZpeCBydHNwX2ZpbmRfbWV0aG9kLgorCURvIHByb3BlciBSVFNQIGNvbm5lY3Rpb24gc2h1dGRvd24uCisKKzIwMDUtMDgtMTggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAtY29tbW9uLmg6CisJKiBnc3QvcnRwL2dzdHJ0cC5jOiAocGx1Z2luX2luaXQpOgorCSogZ3N0L3J0cC9nc3RydHBMMTZlbmMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwZGVjLmM6IChnc3RfcnRwZGVjX2dldF90eXBlKSwKKwkoZ3N0X3J0cGRlY19jbGFzc19pbml0KSwgKGdzdF9ydHBkZWNfY2hhaW5fcnRwKSwKKwkoZ3N0X3J0cGRlY19jaGFpbl9ydGNwKSwgKGdzdF9ydHBkZWNfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3J0cGRlY19wbHVnaW5faW5pdCk6CisJKiBnc3QvcnRwL2dzdHJ0cGgyNjNwZGVjLmM6IChnc3RfcnRwaDI2M3BkZWNfZ2V0X3R5cGUpLAorCShnc3RfcnRwaDI2M3BkZWNfYmFzZV9pbml0KSwgKGdzdF9ydHBoMjYzcGRlY19jbGFzc19pbml0KSwKKwkoZ3N0X3J0cGgyNjNwZGVjX2luaXQpLCAoZ3N0X3J0cGgyNjNwZGVjX2NoYWluKSwKKwkoZ3N0X3J0cGgyNjNwZGVjX3NldF9wcm9wZXJ0eSksIChnc3RfcnRwaDI2M3BkZWNfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3J0cGgyNjNwZGVjX2NoYW5nZV9zdGF0ZSksIChnc3RfcnRwaDI2M3BkZWNfcGx1Z2luX2luaXQpOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGRlYy5oOgorCSogZ3N0L3J0cC9nc3RydHBoMjYzcGVuYy5jOiAoZ3N0X3J0cGgyNjNwZW5jX2dldF90eXBlKSwKKwkoZ3N0X3J0cGgyNjNwZW5jX2Jhc2VfaW5pdCksIChnc3RfcnRwaDI2M3BlbmNfY2xhc3NfaW5pdCksCisJKGdzdF9ydHBoMjYzcGVuY19pbml0KSwgKGdzdF9ydHBoMjYzcGVuY19mbHVzaCksCisJKGdzdF9ydHBoMjYzcGVuY19jaGFpbiksIChnc3RfcnRwaDI2M3BlbmNfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3J0cGgyNjNwZW5jX2dldF9wcm9wZXJ0eSksIChnc3RfcnRwaDI2M3BlbmNfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3J0cGgyNjNwZW5jX3BsdWdpbl9pbml0KToKKwkqIGdzdC9ydHAvZ3N0cnRwaDI2M3BlbmMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZGVjLmM6IChnc3RfcnRwbXBhZGVjX2dldF90eXBlKSwKKwkoZ3N0X3J0cG1wYWRlY19iYXNlX2luaXQpLCAoZ3N0X3J0cG1wYWRlY19jbGFzc19pbml0KSwKKwkoZ3N0X3J0cG1wYWRlY19pbml0KSwgKGdzdF9ydHBtcGFkZWNfY2hhaW4pLAorCShnc3RfcnRwbXBhZGVjX3NldF9wcm9wZXJ0eSksIChnc3RfcnRwbXBhZGVjX2dldF9wcm9wZXJ0eSksCisJKGdzdF9ydHBtcGFkZWNfY2hhbmdlX3N0YXRlKSwgKGdzdF9ydHBtcGFkZWNfcGx1Z2luX2luaXQpOgorCSogZ3N0L3J0cC9nc3RydHBtcGFkZWMuaDoKKwkqIGdzdC9ydHAvZ3N0cnRwbXBhZW5jLmM6IChnc3RfcnRwbXBhZW5jX2dldF90eXBlKSwKKwkoZ3N0X3J0cG1wYWVuY19iYXNlX2luaXQpLCAoZ3N0X3J0cG1wYWVuY19jbGFzc19pbml0KSwKKwkoZ3N0X3J0cG1wYWVuY19pbml0KSwgKGdzdF9ydHBtcGFlbmNfZmx1c2gpLCAoZ3N0X3J0cG1wYWVuY19jaGFpbiksCisJKGdzdF9ydHBtcGFlbmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBtcGFlbmNfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3J0cG1wYWVuY19jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3J0cG1wYWVuY19wbHVnaW5faW5pdCk6CisJKiBnc3QvcnRwL2dzdHJ0cG1wYWVuYy5oOgorCSogZ3N0L3J0cC9ydHAtcGFja2V0LmM6CisJKiBnc3QvcnRwL3J0cC1wYWNrZXQuaDoKKwlSZW1vdmUgb2xkIGNvZGUgdGhhdCBpcyBub3cgaW4gZ3N0LWxpYnMvZ3N0L3J0cC8uCisJQWRkZWQgc29tZSBwYXlsb2FkL2RlcGF5bG9hZGVycy4KKworCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6IChnc3RfdWRwc2lua19jbGFzc19pbml0KToKKwlGaXggcG9ydCBudW1iZXIgcmFuZ2UuCisKKzIwMDUtMDgtMTcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJQWRkZWQgbXBlZ2F1ZGlvcGFyc2UKKworCSogZXh0L2xhbWUvZ3N0bGFtZS5jOiAoZ3N0X2xhbWVfc3JjX2dldGNhcHMpLAorCShnc3RfbGFtZV9zcmNfc2V0Y2FwcyksIChnc3RfbGFtZV9zaW5rX3NldGNhcHMpLAorCShnc3RfbGFtZV9zaW5rX2V2ZW50KSwgKGdzdF9sYW1lX2NoYWluKToKKwlTb21lIGNsZWFudXBzLgorCUZpeCBtZW1sZWFrLgorCisJKiBnc3QvbXBlZ2F1ZGlvcGFyc2UvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzoKKwkoZ3N0X21wM3BhcnNlX2NsYXNzX2luaXQpLCAoZ3N0X21wM3BhcnNlX2luaXQpLAorCShnc3RfbXAzcGFyc2VfY2hhaW4pLCAoZ3N0X21wM3BhcnNlX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvbXBlZ2F1ZGlvcGFyc2UvZ3N0bXBlZ2F1ZGlvcGFyc2UuaDoKKwlQb3J0ZWQgbXBlZ2F1ZGlvcGFyc2UKKworMjAwNS0wOC0xNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwc3JjX29wZW4pLCAoZ3N0X3J0c3BzcmNfcGxheSk6CisJU3VwcG9ydCBhYnNvbHV0ZSBjb250cm9sIHVybHMgdG9vLgorCisyMDA1LTA4LTE2ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksCisJKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlcik6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9jaGFuZ2Vfc3RhdGUpLAorCShnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwgKHF0ZGVtdXhfcGFyc2VfdHJlZSk6CisJICBVbmNvbW1lbnQgbWV0YWRhdGEgYW5kIGNvZGVjLW5hbWUgaGFuZGxpbmcuCisKKzIwMDUtMDgtMTYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvYW1ybmIvYW1ybmJwYXJzZS5jOiAoZ3N0X2Ftcm5icGFyc2VfcmVhZF9oZWFkZXIpOgorCUZpeCBjb21waWxlIHdhcm5pbmcuCisKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzogKGdzdF9sYW1lX2NsYXNzX2luaXQpLAorCShnc3RfbGFtZV9zcmNfZ2V0Y2FwcyksIChnc3RfbGFtZV9zcmNfc2V0Y2FwcyksCisJKGdzdF9sYW1lX3Npbmtfc2V0Y2FwcyksIChnc3RfbGFtZV9pbml0KSwgKGdzdF9sYW1lX3NpbmtfZXZlbnQpLAorCShnc3RfbGFtZV9jaGFpbiksIChnc3RfbGFtZV9jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L2xhbWUvZ3N0bGFtZS5oOgorCVBvcnQgbGFtZSBwbHVnaW4KKworMjAwNS0wOC0xNiAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVtdXguYyAoZ3N0X2R2ZGVtdXhfZmx1c2gpOiBVc2UgZ3N0X2FkYXB0ZXJfdGFrZSBzbworCXdlIGhhdmUgb3VyIG93biBjb3B5IG9mIHRoZSBkYXRhLgorCShnc3RfZHZkZW11eF9kZW11eF92aWRlbyk6IFNldCB0aGUgdGFrZSgpIGRhdGEgYXMgbWFsbG9jX2RhdGEgc28KKwlpdCB3aWxsIGdldCBmcmVlZCBsYXRlci4KKworCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmMgKGdzdF9kdjEzOTRzcmNfaXNvX3JlY2VpdmUpOiBOb3RlCisJbGljZW5zZSBpbmZvIGluIHRoZSBzb3VyY2UgY29kZSAtLSB3YXMgb25seSBpbiB0aGUgY29tbWl0IGxvZworCWJlZm9yZS4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmg6CisJKiBleHQvZHYvZ3N0ZHZkZWMuYzogT25seSBkZWNvZGVzIHN5c3RlbXN0cmVhbT1GQUxTRSBkdiB2aWRlbyAtLQorCW9sZCBwaXBlbGluZXMgdXNpbmcgZHZkZWMgc2hvdWxkIHByb2JhYmx5IGhhdmUgYSBkdmRlbXV4IGZpcnN0LgorCisJKiBleHQvZHYvZ3N0ZHZkZW11eC5oOgorCSogZXh0L2R2L2dzdGR2ZGVtdXguYzogU3BsaXQgb3V0IGZyb20gZHZkZWMsIGNodW5rcyB0aGUgaW5jb21pbmcKKwlzeXN0ZW1zdHJlYW09VFJVRSBkYXRhIGludG8gZnJhbWVzLCBzZXRzIGNhcHMgZGF0YSwgYW5kIHNwaXRzIG91dAorCVBDTSBhdWRpbyBpbiBhZGRpdGlvbiB0byBzeXN0ZW1zdHJlYW09RkFMU0UgdmlkZW8gZnJhbWVzLiBPcGVyYXRlcworCWluIGNoYWluIG1vZGUgb25seSBmb3Igbm93OyBzaG91bGQgbWFrZSBhIGdldHJhbmdlIHZlcnNpb24gYXMKKwl3ZWxsLgorCisJKiBleHQvZHYvZ3N0ZHYuYzogTmV3IGZpbGUsIHJlZ2lzdGVycyB0aGUgbGliZ3N0ZHYgcGx1Z2luLgorCisJKiBleHQvZHYvTWFrZWZpbGUuYW06IExpYnJhcnkgbmFtZSBjaGFuZ2VkIHRvIGxpYmdzdGR2LiBTcGxpdAorCWR2ZGVjIGludG8gZHZkZW11eCBhbmQgZHZkZWMuCisKKzIwMDUtMDgtMTYgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9mYWFkL2dzdGZhYWQuYzogKGdzdF9mYWFkX2V2ZW50KSwgKGdzdF9mYWFkX2NoYWluKToKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKToKKwkgIEhhbmRsZSBfcHVzaCgpIHJldHVybiB2YWx1ZXMuCisKKzIwMDUtMDgtMTUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9mYWFkL2dzdGZhYWQuYzogKGdzdF9mYWFkX2V2ZW50KToKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKToKKwkgIEZpeCBkZWJ1Zy4KKworMjAwNS0wOC0xNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKSwKKwkocXRkZW11eF92aWRlb19jYXBzKToKKwkgIEZvcndhcmRwb3J0IGZyb20gMC44IHRvIGltcGxlbWVudCBSTEUuCisKKzIwMDUtMDgtMTUgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcnRzcC9SRUFETUU6CisJQWRkZWQgcnRzcCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gZG9jcy4KKworMjAwNS0wOC0xNCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOgorCSAgYWFsaWIgaXMgTEdQTCwgc28gdGhpcyBwbHVnaW4gY2FuIGJlIExHUEwKKwkqIGV4dC9hcnRzL2dzdF9hcnRzLmM6IChwbHVnaW5faW5pdCk6CisJICByZW5hbWUsIHdlIGRvbid0IGxpa2UgdW5kZXJzY29yZXMKKwkqIGV4dC9hdWRpb2ZpbGUvZ3N0YWYuYzoKKwkqIGV4dC9zbmRmaWxlL2dzdHNmLmM6CisJICByZW5hbWUsIHdlIGxpa2UgYSBkZXNjcmlwdGl2ZSBwbHVnaW4gbmFtZQorCSogZXh0L2djb25mL2dzdGdjb25mZWxlbWVudHMuYzoKKwkgIGNoYW5nZSBkZXNjcmlwdGlvbiBhIGxpdHRsZQorCSogZXh0L211c2ljYnJhaW56L2dzdHRybS5jOgorCSAgbXVzaWNicmFpbnogaXMgTEdQTCwgc28gcGx1Z2luIGNhbiBiZSBMR1BMCisJKiBleHQvcmF3MTM5NC9nc3QxMzk0LmM6CisJICByZW5hbWUsIHdlIGxpa2UgYWxsLWRpZ2l0IG5hbWVzCisJKiBnc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jOgorCSogZ3N0L2Zkc3JjL2dzdGZkc3JjLmM6CisJKiBnc3QvbXVsdGlmaWxlc2luay9nc3RtdWx0aWZpbGVzaW5rLmM6CisJICByZW5hbWUKKwkqIGdzdC92aXJ0dWFsZHViL2dzdHZpcnR1YWxkdWIuYzoKKwkgIHVzZSBHU1RfUExVR0lOX0RFRklORQorCSogc3lzL2R4cjMvZHhyM2luaXQuYzoKKwkgIG9ubHkgdXNlcyBzeXN0ZW0gaGVhZGVycywgYW5kIGNvZGUgaXMgTEdQTCwgc28gcGx1Z2luIGlzIExHUEwKKworMjAwNS0wOC0xMyAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBleHQvbWFkL01ha2VmaWxlLmFtOgorCSogZ3N0L2F2aS9NYWtlZmlsZS5hbToKKwkqIGdzdC9lZmZlY3R2L01ha2VmaWxlLmFtOgorCSogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkqIGdzdC93YXZwYXJzZS9NYWtlZmlsZS5hbToKKwkgIFVzZSAtbGdzdGZvby1AR1NUX01BSk9STUlOT1JAIGluc3RlYWQgb2YgLWxnc3Rmb28tMC45CisKKzIwMDUtMDgtMTIgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdfZGVjX2RlY29kZV9pbmRpcmVjdCksCisJKGdzdF9qcGVnX2RlY19kZWNvZGVfZGlyZWN0KSwgKGdzdF9qcGVnX2RlY19jaGFpbik6CisJICBGaXggZGVjb2Rpbmcgb2YgcGljdHVyZXMgd2l0aCBjZXJ0YWluIHVuZXZlbiBvciB1bmFsaWduZWQKKwkgIHdpZHRocyB3aGVyZSBqcGVnbGliIG5lZWRzIG1vcmUgaG9yaXpvbnRhbCBwYWRkaW5nIHRoYW4gb3VyCisJICBJNDIwIGJ1ZmZlcnMgcHJvdmlkZSwgcmVzdWx0aW5nIGluIGJsb2NreSBhcnRpZmFjdHMgYXQgdGhlCisJICBsZWZ0IHNpZGUgb2YgdGhlIHBpY3R1cmUgKCMxNjQxNzYpLiAKKwkgIEFsc28gbWFrZSB1c2Ugb2Ygb3VyIHNoaW55IG5ldyBHU1RfUk9VTkRfTigpIG1hY3Jvcy4KKworMjAwNS0wOC0xMSAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChnc3RfanBlZ19kZWNfaW5pdCksIChnc3RfanBlZ19kZWNfY2hhaW4pLAorCShnc3RfanBlZ19kZWNfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuaDoKKwkgIEZpeCBjcmFzaGVzL2ludmFsaWQgbWVtb3J5IGFjY2VzcyBmb3IgcGljdHVyZXMgdGhhdCBoYXZlIGEgaGVpZ2h0CisJICB0aGF0IGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IChvciByYXRoZXI6IHZfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKS4KKwkgIAorCSAgQWxzbyBmaXggdGhlIHN0YXRlIGNoYW5nZSBmdW5jdGlvbiBmb3IgZG93bndhcmRzIHN0YXRlIGNoYW5nZXMKKwkgIChuZWVkIHRvIGNoYWluIHVwIHRvIHBhcmVudCBiZWZvcmUgZGVzdHJveWluZyBvdXIgcmVzb3VyY2VzLCB0byAKKwkgIG1ha2Ugc3VyZSBwYWRzIGdldCBkZWFjdGl2YXRlZCBhbmQgb3VyIGNoYWluIGZ1bmN0aW9uIGlzbid0CisJICBydW5uaW5nIGFuZCB1c2luZyB0aG9zZSB2ZXJ5IHNhbWUgcmVzb3VyY2VzIGluIGFub3RoZXIgdGhyZWFkKS4KKworCSAgVGhlIGpwZWcgbGluZSBidWZmZXIgb25seSBuZWVkcyB0byBiZSB2X3NhbXBfZmFjdG9yKkRDVFNJWkUgbGluZXMKKwkgIHBlciBwbGFuZSwgbm90IHBpY3R1cmVfaGVpZ2h0IGxpbmVzOyBhbGxvY2F0ZSB0aGF0IG9uIHRoZSBzdGFjay4KKworMjAwNS0wOC0xMCAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9zdHJlYW1faGVhZGVycyksCisJKGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSk6CisJICBBZGQgc29tZSBmaXhlcyBmcm9tIDAuOCBicmFuY2g6IGFsbG93IDI0LzMyYnBzIHNvbmdzIGFuZAorCSAgYmxvY2thbGlnbiBzYW1wbGVzIHRvIHRoZSBoZWFkZXItc3BlY2lmaWVkIHNpemUsIGlmIGFueQorCSAgKCMzMTEwNzApOyBlcnJvciBvdXQgb24gY2hhbm5lbHM9PTAgb3IgYml0cmF0ZT09MCAKKwkgICgjMzA5MDQzLCAjMzA0NTg4KS4KKworMjAwNS0wOC0xMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L2xldmVsL2dzdGxldmVsLmM6IChnc3RfbGV2ZWxfaW5pdCksIChnc3RfbGV2ZWxfc2V0X2NhcHMpLAorCShnc3RfbGV2ZWxfdHJhbnNmb3JtKToKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5oOgorCSAgcmVtb3ZlIHVudXNlZCBNUyBzdHJ1Y3QgbWVtYmVyCisJICBkb24ndCByZXNldCB0aGUgQ1MgdmFsdWVzIGZvciBjaGFubmVscyBvbiBldmVyeSBfY2hhaW4sIHNvIHRoYXQKKwkgIGxldmVsIGFjdHVhbGx5IGNvcnJlY3RseSBjYWxjdWxhdGVzIHRoZSBSTVMgdmFsdWUuICBzaWdoLgorCSAgY2FsY3VsYXRlIFJNUyB2YWx1ZXMgY29ycmVjdGx5IGZvciBwZWFrIGFuZCBkZWNheSBwZWFrIHN1bXM7CisJICBiZWZvcmUgd2Ugd2VyZSBzaWduYWxsaW5nIHRoZW0gYXMgaWYgdGhleSBhbHJlYWR5IHdlcmUgYW1wbGl0dWRlCisJICBhbmQgbm90IHBvd2VyIHZhbHVlcy4gIHNpZ2guCisJUmVtaW5kIG1lIHRvIG5vdCB0cnkgYW5kIHByZXRlbmQgSSdtIHdyaXRpbmcgRFNQIGNvZGUuCisKKzIwMDUtMDgtMTAgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9mYWFkL2dzdGZhYWQuYzogKGdzdF9mYWFkX2NsYXNzX2luaXQpLCAoZ3N0X2ZhYWRfc2V0Y2Fwcyk6CisJICBBZGQgZGVidWcgY2F0ZWdvcnksIHJlbW92ZSBDbG9zZSgpIGNhbGwgdGhhdCBtYWRlIGl0IGNyYXNoCisJICB3aGVuZXZlciByZXVzaW5nLCByZW5lZ290aWF0aW5nIG9yIGFueXRoaW5nOyBDbG9zZSgpIGFjdHVhbGx5CisJICBmcmVlKClzIHRoZSBoYW5kbGUgYW5kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBSRUFEWS0+TlVMTC4KKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKToKKwkgIEFjdHVhbGx5IHNldCBjYXBzIG9uIGJ1ZmZlciAoaW4gYWRkaXRpb24gdG8gcGFkKSwgYWxzby4KKworMjAwNS0wOC0xMCAgT3dlbiBGcmFzZXItR3JlZW4gIDxvd2VuQGRpc2NvYmFiZS5uZXQ+CisKKwkqIGdzdC9yZWFsbWVkaWEvcm1kZW11eC5jIChnc3Rfcm1kZW11eF9zaW5rX2FjdGl2YXRlKSAKKwkoZ3N0X3JtZGVtdXhfc2lua19hY3RpdmF0ZV9wdXNoLCBnc3Rfcm1kZW11eF9zaW5rX2FjdGl2YXRlX3B1bGwpIAorCShnc3Rfcm1kZW11eF9sb29wLCBnc3Rfcm1kZW11eF9zcmNfZXZlbnQpIAorCShnc3Rfcm1kZW11eF9wZXJmb3JtX3NlZWssIGdzdF9ybWRlbXV4X3NyY19xdWVyeSk6IEltcGxlbWVudGVkCisJcHVzaC1wdWxsIGFuZCBzZWVraW5nLgorCisyMDA1LTA4LTA5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9ldmVudCk6CisJICBTaWduL3Vuc2lnbiBtaXNtYXRjaC4KKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2NsYXNzX2luaXQpLAorCShnc3RfcXRkZW11eF9pbml0KSwgKGdzdF9xdGRlbXV4X2dldF9zcmNfcXVlcnlfdHlwZXMpLAorCShnc3RfcXRkZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwgKGdzdF9xdGRlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLAorCShwbHVnaW5faW5pdCksIChnc3RfcXRkZW11eF9oYW5kbGVfc2lua19ldmVudCksCisJKGdzdF9xdGRlbXV4X2NoYW5nZV9zdGF0ZSksIChnc3RfcXRkZW11eF9sb29wX2hlYWRlciksCisJKHF0ZGVtdXhfc2lua19hY3RpdmF0ZSksIChxdGRlbXV4X3NpbmtfYWN0aXZhdGVfcHVsbCksCisJKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pLCAocXRkZW11eF9wYXJzZSksIChxdGRlbXV4X3BhcnNlX3RyZWUpLAorCShxdGRlbXV4X3BhcnNlX3RyYWspLCAocXRkZW11eF92aWRlb19jYXBzKSwgKHF0ZGVtdXhfYXVkaW9fY2Fwcyk6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisJICBIYWxmLWFzc2VkIHBvcnQgKGhleSwgaXQgd29ya3MpLgorCisyMDA1LTA4LTA5ICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlcik6CisJICBGaXggQVZJIGhlYWRlciBwYXJzaW5nOiBhZGQgbWlzc2luZyBicmVhayBzdGF0ZW1lbnQgYWZ0ZXIKKwkgIEdTVF9SSUZGX0lORk9fTElTVCBwYXJzaW5nIGNvZGU7IGdzdF9yaWZmX3JlYWRfY2h1bmsoKSBoYXMKKwkgIGFscmVhZHkgYWR2YW5jZWQgdGhlIGF2aS0+b2Zmc2V0LCBubyBuZWVkIHRvIGRvIGl0IHR3aWNlCisJICAoZml4ZXMgTW92aWVPZk1vdmllcy5hdmkpLgorCisyMDA1LTA4LTA5ICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKGdzdF9qcGVnX2RlY19pbml0KSwKKwkoZ3N0X2pwZWdfZGVjX3NldGNhcHMpLCAoZ3N0X2pwZWdfZGVjX2NoYWluKSwKKwkoZ3N0X2pwZWdfZGVjX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmg6CisJICBNYWtlIG1qcGVnIGFjdHVhbGx5IHdvcmsgYW5kIHNraXAganBlZyBkYXRhIHBhcnNpbmcgaWYgd2UKKwkgIGtub3cgdGhhdCB0aGUgaW5wdXQgaXMgcGFja2V0aXplZCAoaWUuIGVhY2ggaW5wdXQgYnVmZmVyCisJICBpcyBleGFjdGx5IG9uZSBqcGVnIGZyYW1lKS4KKworMjAwNS0wOC0wOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfaW5pdCksIChnc3RfbWFkX2NoYWluKToKKwkgIEl0J2QgYmUgbmljZSBpZiBJIGNvdWxkIGxpc3RlbiB0byBteSBtcDMgZmlsZXMsIHNvIHNlbmQgb3V0IGFuCisJICBpbml0aWFsIGRpc2NvbnQsIGFzIHRoZSBzaW5rIGFwcGFyZW50bHkgd2FudHMuCisKKzIwMDUtMDgtMDkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19ldmVudCksCisJKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspOgorCSAgRml4IHNlZWtpbmcgKG9yLCB3ZWxsLCBmaXggdGhyZWFkaW5nIGlzc3VlIHdoZXJlIGEgdmFyaWFibGUgd2FzCisJICBzZXQgYmVmb3JlIGEgbG9jayB3YXMgdGFrZW4gYW5kIHdhcyBhbHJlYWR5IHVuc2V0IGJlZm9yZSB0aGF0CisJICBzYW1lIGxvY2sgd2FzIHRha2VuIGFuZCB3YXMgdGh1cyBubyBsb25nZXIgaW4gZXhpc3RhbmNlIHdoZW4gaXQKKwkgIGFjdHVhbGx5IGhhZCB0byBiZSB1c2VkKS4KKworMjAwNS0wOC0wOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpOgorCSAgTWl4aW5nIGJpbmFyeSBhbmQgbG9naWNhbCBvcGVyYXRvcnMgaXMgbm90IGdvaW5nIHRvIHdvcms7IGZpeAorCSAgcG9zaXRpb24tcXVlcnlpbmcgaW4gVG90ZW0uCisKKzIwMDUtMDgtMDggIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfYmFzZV9pbml0KSwgKGdzdF9mYWFkX2NsYXNzX2luaXQpLAorCShnc3RfZmFhZF9pbml0KSwgKGdzdF9mYWFkX3NldGNhcHMpLCAoZ3N0X2ZhYWRfc3JjZ2V0Y2FwcyksCisJKGdzdF9mYWFkX2V2ZW50KSwgKGdzdF9mYWFkX3VwZGF0ZV9jYXBzKSwgKGdzdF9mYWFkX2NoYWluKSwKKwkoZ3N0X2ZhYWRfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9mYWFkL2dzdGZhYWQuaDoKKwkgIEZpeCBuZWdvdGlhdGlvbiAoIzMxMDkzMikgYW5kIG1pc2NlbGxhbmVvdXMgb3RoZXIgc3R1ZmYuIFByb2JhYmx5CisJICBzdGlsbCBuZWVkcyBzb21lIG1vcmUgd29yay4KKworMjAwNS0wOC0wOCAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChnc3RfanBlZ19kZWNfaW5pdCksCisJKGdzdF9qcGVnX2RlY19zZXRjYXBzKSwgKGdzdF9qcGVnX2RlY19jaGFpbik6CisJICBBZGQgc2V0Y2FwcygpIGZ1bmN0aW9uIChmb3IgbWpwZWcpLgorCisyMDA1LTA4LTA4ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvZXNkL2VzZHNpbmsuYyAoZ3N0X2VzZHNpbmtfZ2V0Y2Fwcyk6IFNlZW1zIHRoYXQgd2llcmQKKwl2YV9saXN0IGNhcHMgc2V0dGluZyBmdW5jdGlvbiB3YXMgYm9ya2VkLiBGaXhlZCBlc2RzaW5rLgorCisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYyAoZ3N0X29zc19zaW5rX29wZW4sIGdzdF9vc3Nfc2lua19jbG9zZSkgCisJKGdzdF9vc3Nfc2lua19wcmVwYXJlLCBnc3Rfb3NzX3NpbmtfdW5wcmVwYXJlKTogVXBkYXRlIGZvciBuZXdlcgorCWF1ZGlvc2luayBhcGkuCisKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jIChnc3RfZHYxMzk0c3JjX2dldF9wcm9wZXJ0eSkgCisJKGdzdF9kdjEzOTRzcmNfc2V0X3Byb3BlcnR5KTogU3R5bGUuIEFsbCBhYm91dCB0aGUgc3R5bGUuCisKKwkqIGV4dC9lc2QvZXNkc2luay5jIChnc3RfZXNkc2lua19nZXRjYXBzKTogUmV0dXJuIHNwZWNpZmljIGNhcHMKKwlvbmx5IGlmIGluIFJFQURZIG9yIGhpZ2hlciAoaS5lLiwgaWYgX29wZW4oKSBoYXMgYmVlbiBjYWxsZWQuKQorCShnc3RfZXNkc2lua19vcGVuLCBnc3RfZXNkc2lua19jbG9zZSwgZ3N0X2VzZHNpbmtfcHJlcGFyZSkgCisJKGdzdF9lc2RzaW5rX3VucHJlcGFyZSk6IFVwZGF0ZSBmb3IgYXVkaW9zaW5rIGNoYW5nZXMuCisJKGdzdF9lc2RzaW5rX2NoYW5nZV9zdGF0ZSk6IERpZSEKKworMjAwNS0wOC0wOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2pwZWcvTWFrZWZpbGUuYW06CisJICBGaXggY29tcGlsZS4KKworMjAwNS0wOC0wOCAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvanBlZy9NYWtlZmlsZS5hbToKKwkqIGV4dC9qcGVnL2dzdGpwZWcuYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKGdzdF9qcGVnX2RlY19nZXRfdHlwZSksCisJKGdzdF9qcGVnX2RlY19maW5hbGl6ZSksIChnc3RfanBlZ19kZWNfYmFzZV9pbml0KSwKKwkoZ3N0X2pwZWdfZGVjX2NsYXNzX2luaXQpLCAoZ3N0X2pwZWdfZGVjX2ZpbGxfaW5wdXRfYnVmZmVyKSwKKwkoZ3N0X2pwZWdfZGVjX2luaXRfc291cmNlKSwgKGdzdF9qcGVnX2RlY19za2lwX2lucHV0X2RhdGEpLAorCShnc3RfanBlZ19kZWNfcmVzeW5jX3RvX3Jlc3RhcnQpLCAoZ3N0X2pwZWdfZGVjX3Rlcm1fc291cmNlKSwKKwkoZ3N0X2pwZWdfZGVjX215X291dHB1dF9tZXNzYWdlKSwgKGdzdF9qcGVnX2RlY19teV9lbWl0X21lc3NhZ2UpLAorCShnc3RfanBlZ19kZWNfbXlfZXJyb3JfZXhpdCksIChnc3RfanBlZ19kZWNfaW5pdCksCisJKGlzX2pwZWdfc3RhcnRfbWFya2VyKSwgKGlzX2pwZWdfZW5kX21hcmtlciksCisJKGdzdF9qcGVnX2RlY19maW5kX2pwZWdfaGVhZGVyKSwgKGdzdF9qcGVnX2RlY19lbnN1cmVfaGVhZGVyKSwKKwkoZ3N0X2pwZWdfZGVjX2hhdmVfZW5kX21hcmtlciksCisJKGdzdF9qcGVnX2RlY19wYXJzZV90YWdfaGFzX2VudHJvcHlfc2VnbWVudCksCisJKGdzdF9qcGVnX2RlY19wYXJzZV9pbWFnZV9kYXRhKSwgKGdzdF9qcGVnX2RlY19jaGFpbiksCisJKGdzdF9qcGVnX2RlY19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5oOgorCSAgUG9ydCBqcGVnZGVjIHRvIDAuOTsgaGFuZGxlcyAncHJvZ3Jlc3NpdmUgbG9hZGluZycgbm93LCBpZS4gaW5wdXQgZG9lcworCSAgbm8gbG9uZ2VyIG5lZWQgdG8gYmUgb25lIHNpbmdsZSBidWZmZXIuCisKKzIwMDUtMDgtMDQgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIHN5cy9vc3MvZ3N0b3NzYXVkaW8uYyAocGx1Z2luX2luaXQpOiBTZWNvbmQtY2xhc3MgY2l0aXplbi4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmMgKGdzdF92aWRlb19ib3hfZ2V0X3NpemUpOiBVcGRhdGUgZm9yCisJQVBJIGNoYW5nZXMuCisKKwkqIGNvbmZpZ3VyZS5hYyAoREVGQVVMVF9BVURJT1NJTkssIERFRkFVTFRfVklERU9TSU5LKTogU2V0IHRvCisJYXV0b2F1ZGlvc2luayBhbmQgYXV0b3ZpZGVvc2luay4KKworMjAwNS0wOC0wNCAgRWR3YXJkIEhlcnZleSAgPGVkd2FyZEBmbHVlbmRvLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9yZXNldCksCisJKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZWFtKSwgKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KToKKwlZb3UgbmVlZCB0byBhbGxvY2F0YXRlIChsZW4rMSkgY2hhcmFjdGVycyB0byBzdG9yZSBhIGxlbiBzaXplIHN0cmluZy4KKwlBbHNvIGRvbid0IHN0b3AgdGhlIHByb2Nlc3NpbmcgdGFzayBpZiB0aGUgb3V0cHV0IHBhZCBpcyBub3QgbGlua2VkLgorCisyMDA1LTA4LTAzICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NpbmsuYzogKGdzdF9nY29uZl9hdWRpb19zaW5rX3Jlc2V0KSwKKwkoZ3N0X2djb25mX2F1ZGlvX3NpbmtfaW5pdCksIChkb190b2dnbGVfZWxlbWVudCksCisJKGNiX3RvZ2dsZV9lbGVtZW50KSwgKGdzdF9nY29uZl9hdWRpb19zaW5rX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NpbmsuaDoKKwkqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5jOiAoZ3N0X2djb25mX3ZpZGVvX3NpbmtfcmVzZXQpLAorCShnc3RfZ2NvbmZfdmlkZW9fc2lua19pbml0KSwgKGRvX3RvZ2dsZV9lbGVtZW50KSwKKwkoY2JfdG9nZ2xlX2VsZW1lbnQpLCAoZ3N0X2djb25mX3ZpZGVvX3NpbmtfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9nY29uZi9nc3RnY29uZnZpZGVvc2luay5oOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOiAoZ3N0X2F1dG9fYXVkaW9fc2lua19yZXNldCksCisJKGdzdF9hdXRvX2F1ZGlvX3NpbmtfaW5pdCksIChnc3RfYXV0b19hdWRpb19zaW5rX2RldGVjdCksCisJKGdzdF9hdXRvX2F1ZGlvX3NpbmtfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuaDoKKwkqIGdzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYzogKGdzdF9hdXRvX3ZpZGVvX3NpbmtfcmVzZXQpLAorCShnc3RfYXV0b192aWRlb19zaW5rX2luaXQpLCAoZ3N0X2F1dG9fdmlkZW9fc2lua19kZXRlY3QpLAorCShnc3RfYXV0b192aWRlb19zaW5rX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmg6CisJICBVc2UgbmV3IGdob3N0cGFkIEFQSTsgbm93IHRoZXkgYWN0dWFsbHkgd29yayBpbiBUb3RlbSwgYWxzby4KKworMjAwNS0wOC0wMyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2xpYnBuZy9NYWtlZmlsZS5hbToKKwkgIEZpeCB1bmluc3RhbGxlZCBidWlsZC4KKworMjAwNS0wOC0wMiAgRWR3YXJkIEhlcnZleSAgPGVkd2FyZEBmbHVlbmRvLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2xpYnBuZy9NYWtlZmlsZS5hbToKKwkqIGV4dC9saWJwbmcvZ3N0cG5nLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOgorCVBvcnRlZCBwbmdlbmMgLCBzdGlsbCBoYXZlIHRvIHBvcnQgcG5nZGVjLi4uCisKKzIwMDUtMDgtMDEgIFN0ZWZhbiBLb3N0ICA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwlyZXZpZXdlZCBieTogPGRlbGV0ZSBpZiBub3QgdXNpbmcgYSBidWRkeT4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L2xhZHNwYS9NYWtlZmlsZS5hbToKKwkqIGV4dC9sYWRzcGEvZ3N0bGFkc3BhLmM6IChnc3RfbGFkc3BhX2luaXQpLCAoZ3N0X2xhZHNwYV9sb29wKSwKKwkoZ3N0X2xhZHNwYV9jaGFpbiksIChnc3RfbGFkc3BhX2dldCksIChwbHVnaW5faW5pdCk6CisJKiBleHQvbGFkc3BhL2dzdGxhZHNwYS5oOgorICAgICAgICAgIGRlYWN0aXZhdGUgYW5kIHJlbW92ZSBkcGFyYW1zIChsaWJnc3Rjb250cm9sKQorCisyMDA1LTA3LTI3ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfZXZlbnQpOgorCUNvbXBpbGUgZml4ZXMuCisKKzIwMDUtMDctMjcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvYW1ybmIvYW1ybmJwYXJzZS5jOiAoZ3N0X2Ftcm5icGFyc2VfZXZlbnQpLAorCShnc3RfYW1ybmJwYXJzZV9sb29wKToKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOiAoZ3N0X2R2ZGVjX2hhbmRsZV9zaW5rX2V2ZW50KSwKKwkoZ3N0X2R2ZGVjX2hhbmRsZV9zcmNfZXZlbnQpLCAoZ3N0X2R2ZGVjX2RlY29kZV9mcmFtZSk6CisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfc3JjX2V2ZW50KSwKKwkoZ3N0X2lkM190YWdfc2lua19ldmVudCksIChnc3RfaWQzX3RhZ19jaGFpbik6CisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9zcmNfcXVlcnkpLCAoaW5kZXhfc2VlayksCisJKG5vcm1hbF9zZWVrKSwgKGdzdF9tYWRfc2lua19ldmVudCksIChnc3RfbWFkX2NoYWluKToKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzogKGdzdF9zaG91dDJzZW5kX2V2ZW50KToKKwkqIGV4dC9zaWRwbGF5L2dzdHNpZGRlYy5jYzoKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19ldmVudCksCisJKGdzdF9hdmlfZGVtdXhfc2VuZF9ldmVudCksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpLAorCShnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrKSwgKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KToKKwkqIGdzdC9nb29tL2dzdGdvb20uYzogKGdzdF9nb29tX2V2ZW50KToKKwkqIGdzdC9yZWFsbWVkaWEvcm1kZW11eC5jOiAoZ3N0X3JtZGVtdXhfc2lua19ldmVudCksCisJKGdzdF9ybWRlbXV4X2NoYWluKSwgKGdzdF9ybWRlbXV4X3NlbmRfZXZlbnQpLAorCShnc3Rfcm1kZW11eF9hZGRfc3RyZWFtKToKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2hhbmRsZV9zZWVrKSwKKwkoZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzKSwgKGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSksCisJKGdzdF93YXZwYXJzZV9sb29wKSwgKGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQpOgorCVZhcmlvdXMgZXZlbnQgdXBkYXRlcyBhbmQgY2xlYW51cHMuCisKKzIwMDUtMDctMjUgIENocmlzdGlhbiBTY2hhbGxlciAgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKworCSogZ3N0LXBsdWdpbnMuc3BlYy5pbjogYWRkIHNpbGVuY2UgYW5kIHZpZGVvZmxpcAorCSogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOiBhZGQgbWlzc2luZyBoZWFkZXIgdG8gbm9pbnN0CisKKzIwMDUtMDctMjUgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jOiAoZ3N0X2dhbW1hX3NldHVwKToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzogKGdzdF92aWRlb2JhbGFuY2Vfc2V0dXApOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmlsdGVyLmM6IChnc3RfdmlkZW9maWx0ZXJfY2xhc3NfaW5pdCksCisJKGdzdF92aWRlb2ZpbHRlcl9nZXRjYXBzKSwgKGdzdF92aWRlb2ZpbHRlcl9zZXRjYXBzKSwKKwkoZ3N0X3ZpZGVvZmlsdGVyX2luaXQpLCAoZ3N0X3ZpZGVvZmlsdGVyX2NoYWluKSwKKwkoZ3N0X3ZpZGVvZmlsdGVyX3NldF9wcm9wZXJ0eSksIChnc3RfdmlkZW9maWx0ZXJfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3ZpZGVvZmlsdGVyX3NldHVwKSwgKGdzdF92aWRlb2ZpbHRlcl9jbGFzc19hZGRfcGFkX3RlbXBsYXRlcyk6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9maWx0ZXIuaDoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzogKGdzdF92aWRlb2ZsaXBfaW5pdCksCisJKGdzdF92aWRlb2ZsaXBfc2V0X3Byb3BlcnR5KSwgKGdzdF92aWRlb2ZsaXBfZ2V0X3Byb3BlcnR5KSwKKwkocGx1Z2luX2luaXQpLCAoZ3N0X3ZpZGVvZmxpcF9zZXR1cCksIChnc3RfdmlkZW9mbGlwX3BsYW5hcjQxMSk6CisJICBmb3J3YXJkIHBvcnQgZnJvbSAwLjkgYW5kIGVuYWJsZSB2aWRlb2ZsaXAgbm93IHRoYXQgaXQgd29ya3MKKworMjAwNS0wNy0yMyAgRWR3YXJkIEhlcnZleSAgPGVkd2FyZEBmbHVlbmRvLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L3NpbGVuY2UvTWFrZWZpbGUuYW06CisJKiBnc3Qvc2lsZW5jZS9nc3RzaWxlbmNlLmg6CisJKiBnc3Qvc2lsZW5jZS9nc3RzaWxlbmNlLmM6CisJUG9ydGVkIHNpbGVuY2UgdG8gMC45IHVzaW5nIEdzdEJhc2VTcmMgLi4uIDE4MCBsaW5lcyA6KQorCisyMDA1LTA3LTIyICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9zcmNfZXZlbnQpOgorCSAgRmlyc3QgdHJ5IGZvcndhcmRpbmcgZXZlbnRzLCBtYWtlcyBzZWVraW5nIGluIEFWSSBmaWxlcyB3aXRoIG1wMworCSAgYXVkaW8gd29yayBhZ2Fpbi4KKworMjAwNS0wNy0yMCAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmMgKGdzdF9tcGVnMmRlY19zaW5rX2V2ZW50KTogU2lnbmVkbmVzcworCWZpeC4KKworMjAwNS0wNy0yMCAgRWR3YXJkIEhlcnZleSAgPGVkd2FyZEBmbHVlbmRvLmNvbT4KKworCSogY29uZmlndXJlLmFjOiAKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oOgorCSogZ3N0L3dhdnBhcnNlL01ha2VmaWxlLmFtOgorCVBvcnRlZCB3YXZwYXJzZSB0byAwLjkgLiBQbGF5aW5nLCBzZWVraW5nIGFuZCBzdGF0ZSBjaGFuZ2VzIHdvcmsuCisJQ291bGQgbmVlZCBtb3JlIGxvdmluZyBvbiB0aGUgaGVhZGVycyB0aG91Z2guCisKKzIwMDUtMDctMjAgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkqIGV4dC9nY29uZi9NYWtlZmlsZS5hbToKKwkqIGV4dC9nY29uZi9nY29uZi5jOiAoZ3N0X2Jpbl9maW5kX3VuY29ubmVjdGVkX3BhZCksCisJKGdzdF9nY29uZl9yZW5kZXJfYmluX2Zyb21fZGVzY3JpcHRpb24pLAorCShnc3RfZ2NvbmZfZ2V0X2RlZmF1bHRfdmlkZW9fc2luayk6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZhdWRpb3NpbmsuYzogKGdzdF9nY29uZl9hdWRpb19zaW5rX2Jhc2VfaW5pdCksCisJKGdzdF9nY29uZl9hdWRpb19zaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2djb25mX2F1ZGlvX3NpbmtfZGlzcG9zZSksCisJKGNiX3RvZ2dsZV9lbGVtZW50KSwgKGdzdF9nY29uZl9hdWRpb19zaW5rX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvZ2NvbmYvZ3N0Z2NvbmZlbGVtZW50cy5oOgorCSogZXh0L2djb25mL2dzdGdjb25mdmlkZW9zaW5rLmM6IChnc3RfZ2NvbmZfdmlkZW9fc2lua19iYXNlX2luaXQpLAorCShnc3RfZ2NvbmZfdmlkZW9fc2lua19jbGFzc19pbml0KSwgKGdzdF9nY29uZl92aWRlb19zaW5rX2Rpc3Bvc2UpLAorCShjYl90b2dnbGVfZWxlbWVudCksIChnc3RfZ2NvbmZfdmlkZW9fc2lua19jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jOgorCShnc3RfYXV0b19hdWRpb19zaW5rX2Jhc2VfaW5pdCksIChnc3RfYXV0b19hdWRpb19zaW5rX2NsYXNzX2luaXQpLAorCShnc3RfYXV0b19hdWRpb19zaW5rX2RldGVjdCksIChnc3RfYXV0b19hdWRpb19zaW5rX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zaW5rLmM6CisJKGdzdF9hdXRvX3ZpZGVvX3NpbmtfYmFzZV9pbml0KSwgKGdzdF9hdXRvX3ZpZGVvX3NpbmtfY2xhc3NfaW5pdCksCisJKGdzdF9hdXRvX3ZpZGVvX3NpbmtfZmluZF9iZXN0KSwgKGdzdF9hdXRvX3ZpZGVvX3NpbmtfZGV0ZWN0KToKKwkgIFBvcnQgYXV0by9nY29uZnNpbmtzIHRvIDAuOS4gVGhleSBhY3R1YWxseSBhcHBlYXIgdG8gd29yayBoZXJlIGluCisJICBUb3RlbSBhcyB3ZWxsLCBtYWtpbmcgdGhlbSBhY3R1YWxseSB1c2VmdWwuCisKKzIwMDUtMDctMjAgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9mYWFkL01ha2VmaWxlLmFtOgorCSAgRml4IHVuaW5zdGFsbGVkIGJ1aWxkLgorCisyMDA1LTA3LTE5ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3NzX3NpbmtfZ2V0X2Zvcm1hdCksCisJKGdzdF9vc3Nfc2lua19vcGVuKToKKwlQYXJzZSBzcGVjIHRvIHNldCBjb3JyZWN0IG9zcyB2YWx1ZXMuCisKKzIwMDUtMDctMTkgIEVkZ2FyZCBOLiBBLiBHLiBMaW1hIDxlZGdhcmQubGltYUBpbmR0Lm9yZy5icj4KKworICAgICAgICAqIGNvbmZpZ3VyZS5hYworCSogZXh0L01ha2VmaWxlLmFtCisJKiBleHQvYW1ybmIvYW1ybmJkZWMuYworCSogZXh0L2Ftcm5iL2Ftcm5iZW5jLmMKKwkqIGV4dC9hbXJuYi9hbXJuYnBhcnNlLmMKKwkqIGV4dC9mYWFkL2dzdGZhYWQuYworCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmMKKwlQb3J0ZWQgYW1ybmIsIGZhYWQsIG1wZWcyZGVjIHRvIDAuOQorCisyMDA1LTA3LTE5ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYyAoZ3N0X2R2ZGVjX2RlY29kZV92aWRlbyk6IFNldCB0aGUgcHJvcGVyCisJZnJhbWVyYXRlIG9uIHRoZSBvdXRib3VuZCBidWZmZXIuCisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jIChnc3RfZHZkZWNfZGVjb2RlX3ZpZGVvKTogRG9uJ3QgY2xvYmJlcgorCWFsbG9jX2J1ZmZlcidzIHJldHVybiB2YWx1ZS4KKwkoZ3N0X2R2ZGVjX2RlY29kZV9mcmFtZSk6IEhhbmRsZSB1bmxpbmtlZCBwYWRzIHdpdGggZ3JhY2UgYW5kCisJYWdpbGl0eS4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmg6IEZpeCBzaWduZWRuZXNzIGVycm9yLgorCisyMDA1LTA3LTE5ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfaW5pdCksIChnc3RfZHZkZWNfc3JjX2NvbnZlcnQpLAorCShnc3RfZHZkZWNfc2lua19jb252ZXJ0KSwgKGdzdF9kdmRlY19nZXRfc3JjX3F1ZXJ5X3R5cGVzKSwKKwkoZ3N0X2R2ZGVjX3NyY19xdWVyeSksIChnc3RfZHZkZWNfZ2V0X3NpbmtfcXVlcnlfdHlwZXMpLAorCShnc3RfZHZkZWNfc2lua19xdWVyeSksIChnc3RfZHZkZWNfc2VuZF9ldmVudCksCisJKGdzdF9kdmRlY19oYW5kbGVfc2lua19ldmVudCksIChnc3RfZHZkZWNfaGFuZGxlX3NyY19ldmVudCksCisJKGdzdF9kdmRlY19kZWNvZGVfYXVkaW8pLCAoZ3N0X2R2ZGVjX2RlY29kZV92aWRlbyksCisJKGdzdF9kdmRlY19kZWNvZGVfZnJhbWUpLCAoZ3N0X2R2ZGVjX2ZsdXNoKSwgKGdzdF9kdmRlY19jaGFpbik6CisJKiBleHQvZHYvZ3N0ZHZkZWMuaDoKKwlJbXBsZW1lbnRlZCBzZWVraW5nIGluIGR2ZGVjLgorCisyMDA1LTA3LTE5ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCisJKiBleHQvTWFrZWZpbGUuYW06IEVuYWJsZSBkdmRldiBhbmQgcmF3MTM5NHNyYy4KKworMjAwNS0wNy0xOCAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogY29uZmlndXJlLmFjOiBVc2UgQVNfTElCVE9PTF9UQUdTLiBGaXggY3JhcCBnZXR0ZXh0IGNvbW1pdAorCWNvbW1lbnQuCisKKzIwMDUtMDctMTggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcHNyY19hZGRfZWxlbWVudCksCisJKGdzdF9ydHNwc3JjX3BsYXkpOgorCUZpeCBmb3IgY29yZSBjaGFuZ2VzLgorCisyMDA1LTA3LTE4ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfaWQzX3RhZ19zaW5rX2V2ZW50KToKKwkgIFdoZW4gcmV0dXJuaW5nIHRvIE5PUk1BTCBzdGF0ZSBhZnRlciByZWFkaW5nIHRhZ3MsCisJICBwYXNzIG9uIHRoZSBkaXNjb250IGV2ZW50LgorCisyMDA1LTA3LTE4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3JlYWxtZWRpYS9ybWRlbXV4LmM6IChnc3Rfcm1kZW11eF9zaW5rX2V2ZW50KSwKKwkoZ3N0X3JtZGVtdXhfY2hhbmdlX3N0YXRlKSwgKGdzdF9ybWRlbXV4X2NoYWluKSwKKwkoZ3N0X3JtZGVtdXhfZ2V0X3N0cmVhbV9ieV9pZCksIChnc3Rfcm1kZW11eF9zZW5kX2V2ZW50KSwKKwkoZ3N0X3JtZGVtdXhfYWRkX3N0cmVhbSk6CisJU2VuZCBkaXNjb250IGV2ZW50IGJlZm9yZSBwdXNoaW5nIGZpcnN0IGJ1ZmZlci4KKworMjAwNS0wNy0xNyAgUGhpbGlwcGUgS2hhbGFmIDxidXJnZXJAc3BlZWR5Lm9yZz4KKworCSogZ3N0L2Zkc3JjL2dzdGZkc3JjLmM6CisJUmVtb3ZlZCAjaW5jbHVkZSA8Z3N0X3ByaXZhdGUuaD4KKworMjAwNS0wNy0xNiAgUGhpbGlwcGUgS2hhbGFmIDxidXJnZXJAc3BlZWR5Lm9yZz4KKworCSogZ3N0L2Zkc3JjL2dzdGZkc3JjLmM6CisJKiBnc3QvZmRzcmMvZ3N0ZmRzcmMuaDoKKwkqIGdzdC9mZHNyYy9NYWtlZmlsZS5hbToKKwlNb3ZlZCBmZHNyYyAwLjkgcG9ydCBmcm9tIGdzdHJlYW1lci9nc3QvZWxlbWVudHMgdG8gaGVyZS4KKworMjAwNS0wNy0xNiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX3NyY19xdWVyeSksIChnc3RfbWFkX3NpbmtfZXZlbnQpLAorCShnc3RfbWFkX2NoYWluKToKKwlBZGQgY29udmVydCBmdW5jdGlvbiBmb3IgcHJvcGVyIHRpbWVzdGFtcCBjYWxjdWxhdGlvbnMuCisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc2VuZF9ldmVudCksCisJKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlciksIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrKSwKKwkoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpLCAoZ3N0X2F2aV9kZW11eF9sb29wKToKKwlTZW5kIG91dCBpbml0aWFsIGRpc2NvbnQuCisKKzIwMDUtMDctMTUgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogKGdzdF9sZXZlbF90cmFuc2Zvcm0pOgorCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2NsYXNzX2luaXQpLAorCShnc3RfdmlkZW9fYm94X2dldF9zaXplKSwgKGdzdF92aWRlb19ib3hfdHJhbnNmb3JtKToKKwlQb3J0IHRvIG5ldyBiYXNlIGNsYXNzLgorCisyMDA1LTA3LTE0ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IChnc3RfZHYxMzk0c3JjX2dldF90eXBlKSwKKwkoZ3N0X2R2MTM5NHNyY19jbGFzc19pbml0KSwgKGdzdF9kdjEzOTRzcmNfaW5pdCksCisJKGdzdF9kdjEzOTRzcmNfaXNvX3JlY2VpdmUpLCAoZ3N0X2R2MTM5NHNyY19jcmVhdGUpLAorCShnc3RfZHYxMzk0c3JjX2NoYW5nZV9zdGF0ZSksIChnc3RfZHYxMzk0c3JjX3F1ZXJ5KToKKwlJdCdzIFBVU0hfU1JDIG5vdy4KKworMjAwNS0wNy0xNCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfZ2V0X3R5cGUpLAorCShnc3RfdWRwc3JjX2NsYXNzX2luaXQpOgorCSAgbW9yZSBhdXRpc3RpYyBjbGVhbmxpbmVzcyBpbiBmdW5jdGlvbnMvbmFtZXMvZGVmaW5lcworCisKKzIwMDUtMDctMTAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzogKGdzdF9hYXNpbmtfZ2V0X3R5cGUpLAorCShnc3RfYWFzaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2Fhc2lua19pbml0KToKKwkqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfZ2V0X3R5cGUpLAorCShnc3RfZXNkc2lua19jbGFzc19pbml0KToKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmM6IChnc3RfY2FjYXNpbmtfZ2V0X3R5cGUpLAorCShnc3RfY2FjYXNpbmtfY2xhc3NfaW5pdCksIChnc3RfY2FjYXNpbmtfaW5pdCk6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5jOiAoZ3N0X3Nob3V0MnNlbmRfZ2V0X3R5cGUpLAorCShnc3Rfc2hvdXQyc2VuZF9jbGFzc19pbml0KSwgKGdzdF9zaG91dDJzZW5kX2luaXQpOgorCSogZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmM6IChnc3RfZHludWRwc2lua19nZXRfdHlwZSksCisJKGdzdF9keW51ZHBzaW5rX2NsYXNzX2luaXQpOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogKGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3R5cGUpLAorCShnc3RfbXVsdGl1ZHBzaW5rX2NsYXNzX2luaXQpOgorCSAgbW9yZSBtYWNybyBzcGxpdHRpbmcKKworMjAwNS0wNy0wOCAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogc3lzL29zcy86IFBvcnQgZnJvbSBUSFJFQURFRCt3aW0ncyBmaXhlcy4KKworCSogZ3N0L2F2aS9NYWtlZmlsZS5hbSAobGliZ3N0YXZpX2xhX0NGTEFHUyk6IE5vIGdldHRleHQgaGFja3MsIHRoZQorCWRlZmluZXMgY29tZSBmcm9tIGNvbmZpZy5oLgorCisJKiBhdXRvZ2VuLnNoOiBSdW4gYXV0b3BvaW50LCBldGMuCisKKwkqIE1ha2VmaWxlLmFtIChESVNUX1NVQkRJUlMsIFNVQkRJUlMpOiBHbyBpbnRvIHBvLy4KKworCSogY29uZmlndXJlLmFjOiBBZGQgZ2V0dGV4dCBzdHVmZi4KKworMjAwNS0wNy0wNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOiAoZ3N0X3ZpZGVvX2JveF9pbml0KSwKKwkoZ3N0X3ZpZGVvX2JveF90cmFuc2Zvcm1fY2FwcyksIChnc3RfdmlkZW9fYm94X3NldF9jYXBzKToKKwlMb2dpYyB3YXMgcmV2ZXJzZWQuIE5lZWRzIHNvbWUgIG1vcmUgZml4ZXMgaW4gdGhlIHRyYW5zZm9ybQorCWZ1bmN0aW9uIHRvIGluY2x1ZGUgQVlVViBvdXRwdXQuCisJTW92ZWQgQVlVViBhcyBwcmVmZXJlZCBmb3JtYXQuCisKKzIwMDUtMDctMDcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvZHYvTWFrZWZpbGUuYW06CisJKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19jbGFzc19pbml0KSwgKGdzdF9kdmRlY19pbml0KSwKKwkoZ3N0X2R2ZGVjX2dldF9zcmNfcXVlcnlfdHlwZXMpLCAoZ3N0X2R2ZGVjX3NyY19xdWVyeSksCisJKGdzdF9kdmRlY19oYW5kbGVfc2lua19ldmVudCksIChnc3RfZHZkZWNfaGFuZGxlX3NyY19ldmVudCksCisJKGdzdF9kdmRlY192aWRlb19nZXRjYXBzKSwgKGdzdF9kdmRlY192aWRlb19zZXRjYXBzKSwKKwkoZ3N0X2R2ZGVjX2RlY29kZV9hdWRpbyksIChnc3RfZHZkZWNfZGVjb2RlX3ZpZGVvKSwKKwkoZ3N0X2R2ZGVjX2RlY29kZV9mcmFtZSksIChnc3RfZHZkZWNfY2hhaW4pLAorCShnc3RfZHZkZWNfY2hhbmdlX3N0YXRlKSwgKGdzdF9kdmRlY19zZXRfcHJvcGVydHkpLAorCShnc3RfZHZkZWNfZ2V0X3Byb3BlcnR5KSwgKHBsdWdpbl9pbml0KToKKwkqIGV4dC9kdi9nc3RkdmRlYy5oOgorCSogZXh0L2VzZC9lc2RzaW5rLmM6IChnc3RfZXNkc2lua19jbGFzc19pbml0KToKKwlQb3J0ZWQgRFZkZWMgdG8gMC45LgorCVBhcmVudCBvZiBlc2RzaW5rIGlzIEdzdEF1ZGlvU2luay4KKworMjAwNS0wNy0wNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9yYXcxMzk0L01ha2VmaWxlLmFtOgorCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IChnc3RfZHYxMzk0c3JjX2dldF90eXBlKSwKKwkoZ3N0X2R2MTM5NHNyY19jbGFzc19pbml0KSwgKGdzdF9kdjEzOTRzcmNfaW5pdCksCisJKGdzdF9kdjEzOTRzcmNfaXNvX3JlY2VpdmUpLCAoZ3N0X2R2MTM5NHNyY19jcmVhdGUpLAorCShnc3RfZHYxMzk0c3JjX2NoYW5nZV9zdGF0ZSksIChnc3RfZHYxMzk0c3JjX2NvbnZlcnQpLAorCShnc3RfZHYxMzk0c3JjX2dldF9xdWVyeV90eXBlcyksIChnc3RfZHYxMzk0c3JjX3F1ZXJ5KToKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5oOgorCVBvcnRlZCB0aGUgMTM5NCBzb3VyY2UgdG8gMC45LgorCisyMDA1LTA3LTA3ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX2dldF9xdWVyeV90eXBlcyk6CisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9nZXRfcXVlcnlfdHlwZXMpLCAoZ3N0X21hZF9zcmNfcXVlcnkpOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9nZXRfc3JjX3F1ZXJ5X3R5cGVzKToKKwlSZW1vdmUgZGVwcmVjYXRlZC91bnNlZCBjb2RlLgorCisyMDA1LTA3LTA2ICBFZHdhcmQgSGVydmV5ICA8ZWR3YXJkQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19pbml0KTogCisJR1NUX0JBU0VTUkMgLS0+IEdTVF9CQVNFX1NSQworCisyMDA1LTA3LTA1ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCisJKiBnc3Qvb25ldG9uOiBSZW1vdmVkIChyZXBsYWNlZCBieSBkZWludGVybGVhdmUpLgorCisJKiBnc3QvYWRkZXI6CisJKiBnc3QvYXVkaW9jb252ZXJ0OgorCSogZ3N0L2F1ZGlvcmF0ZToKKwkqIGdzdC9hdWRpb3NjYWxlOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2U6CisJKiBnc3QvcGxheWJhY2s6CisJKiBnc3Qvc2luZToKKwkqIGdzdC9zdWJwYXJzZToKKwkqIGdzdC90YWdzOgorCSogZ3N0L3RjcDoKKwkqIGdzdC92aWRlb3NjYWxlOgorCSogZ3N0L3ZvbHVtZTogUmVtb3ZlZCBkaXJzIHRoYXQgYXJlIG5vdyBpbiBnc3QtcGx1Z2lucy1iYXNlLgorCisyMDA1LTA3LTA1ICBFZHdhcmQgSGVydmV5ICA8ZWR3YXJkQGZsdWVuZG8uY29tPgorCisJKiBjb25maWd1cmUuYWM6IChHU1RfUExVR0lOU19BTEwpOiAKKwl2aWRlb2ZpbHRlciBtdXN0IGJlIGNvbXBpbGVkIGZpcnN0LCBzaW5jZSBvdGhlciBwbHVnaW5zIGRlcGVuZCBvbnQgaXQuCisKKzIwMDUtMDctMDUgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIFdheSwgd2F5LCB3YXkgdG9vIG1hbnkgZmlsZXM6CisJUmVtb3ZlIGNyYWNrIGNvbW1lbnQgZnJvbSB0aGUgMjAwMCBlcmEuCisKKzIwMDUtMDctMDUgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGdzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jOiBDbGVhbiB1cCwgcG9ydCB0byAwLjksIHVzZQorCUJhc2VUcmFuc2Zvcm0uCisKKwkqIGdzdC92aWRlb2JveC9NYWtlZmlsZS5hbTogTGluayB0byBiYXNlIGxpYnMsIGluY2x1ZGUKKwlwbHVnaW5zLWJhc2UgY2ZsYWdzLCBkaXN0IHRoZSBSRUFETUUuCisKKwkqIGNvbmZpZ3VyZS5hYyAoR1NUX1BMVUdJTl9BTEwsIEFDX0NPTkZJR19GSUxFUyk6IEFkZCB2aWRlb2JveCB0bworCXRoZSBidWlsZC4KKworMjAwNS0wNy0wNCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9yZWFsbWVkaWEvcm1kZW11eC5jOgorCUkgZG9uJ3QgdGhpbmsgdGhhdCBwaWVjZSBvZiBjaGFuZ2Vsb2cgc2hvdWxkIGdvIHRoZXJlLgorCisyMDA1LTA3LTA0ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCisJKiBleGFtcGxlcy9sZXZlbC86CisJKiBleGFtcGxlcy9sZXZlbC9NYWtlZmlsZS5hbToKKwkqIGV4YW1wbGVzL2xldmVsL1JFQURNRToKKwkqIGV4YW1wbGVzL2xldmVsL2RlbW8uYzoKKwkqIGV4YW1wbGVzL2xldmVsL3Bsb3QuYzogRXhhbXBsZXMgbW92ZWQgb3V0IG9mIHRoZSBzb3VyY2UgZGlyLiBOb3QKKwl1cGRhdGVkIHRoby4KKworCSogY29uZmlndXJlLmFjOiBBZGQgbGV2ZWwgdG8gdGhlIGJ1aWxkLgorCisJKiBnc3QvbGV2ZWwvTWFrZWZpbGUuYW06CisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuaDoKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiBDbGVhbmVkIHVwLCBwb3J0ZWQgdG8gMC45LgorCisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmMgKGdzdF9hYXNpbmtfZml4YXRlKTogVXBkYXRlIGZvciBuZXdlcgorCWZpeGF0ZSBwcm90b3R5cGUuCisKKzIwMDUtMDctMDMgIE93ZW4gRnJhc2VyLUdyZWVuICA8b3dlbkBkaXNjb2JhYmUubmV0PgorCisJKiBnc3QvcmVhbG1lZGlhL3JtZGVtdXguYyAoZ3N0X3JtZGVtdXhfYWRkX3N0cmVhbSksCisJKGdzdF9ybWRlbXV4X3NyY19nZXRjYXBzKSwgKGdzdF9ybWRlbXV4X2NoYWluKTogCisJQWRkZWQgZ2V0Y2FwcyBmdW5jdGlvbiBub19tb3JlX3BhZHMgY2FsbAorCisyMDA1LTA3LTAxICBQaGlsaXBwZSBLaGFsYWYgPGJ1cmdlckBzcGVlZHkub3JnPgorCSogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkqIGdzdC91ZHAvZ3N0dWRwLmM6CisJKiBnc3QvdWRwL2dzdGR5bnVkcHNpbmsuYzogKG5ldykKKwkqIGdzdC91ZHAvZ3N0ZHludWRwc2luay5oOiAobmV3KQorCSAgQWRkZWQgbmV3IGVsZW1lbnQgKHVkcGR5bnNpbmspIHRoYXQgcmVjZWl2ZXMgR3N0TmV0QnVmZmVycyBhbmQgc2VuZHMgdGhlCisJICB1ZHAgcGFja2V0cyB0byB0aGUgc291cmNlIGdpdmVuIGluIHRoZSBidWZmZXIuIEl0J3MgdXNlZCBieSBydHBzZXNzaW9uCisJICBlbGVtZW50IGZvciBub3cuCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOgorCSAgRml4ZWQgbWVtb3J5IGxlYWsuCisKKzIwMDUtMDctMDEgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L21hZC9NYWtlZmlsZS5hbToKKwkqIHN5cy9vc3MvTWFrZWZpbGUuYW06CisJUm9sbCBnc3RyZWFtZXItaW50ZXJmYWNlcy0wLjkucGMgaW50byBnc3RyZWFtZXItcGx1Z2lucy1iYXNlLTAuOS5wYworCisyMDA1LTA3LTAxICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisJKiBleHQvbGliY2FjYS9NYWtlZmlsZS5hbToKKwkqIGV4dC9tYWQvTWFrZWZpbGUuYW06CisJKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbToKKwkqIGdzdC91ZHAvTWFrZWZpbGUuYW06CisJICBSZXBsYWNlIEdTVF9QTFVHSU5TX0xJQlNfKiB3aXRoIEdTVF9QTFVHSU5TX0JBU0VfKgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfc3JjX3F1ZXJ5KSwKKwkoZ3N0X2lkM190YWdfc3JjX2V2ZW50KSwgKGdzdF9pZDNfdGFnX3NpbmtfZXZlbnQpLAorCShnc3RfaWQzX3RhZ19jaGFpbiksIChwbHVnaW5faW5pdCk6CisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9zcmNfcXVlcnkpLCAoZ3N0X21hZF9jaGFpbik6CisJICBTaWduZWRuZXNzIHdhcm5pbmcgZml4LCB1c2UgZ3N0X3BhZF9nZXRfcGVlciBpbnN0ZWFkIG9mIEdTVF9QQURfUEVFUgorCSAgaW4gcXVlcnlpbmcgYW5kIGV2ZW50IGhhbmRsaW5nLCBiZWNhdXNlIHdlJ3JlIG5vdCBob2xkaW5nIHRoZSBwYWQKKwkgIGxvY2sgYW5kIHRoZSBwZWVyIG1heSBkaXNhcHBlYXIuCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3BhcnNlX3N1YmluZGV4KSwKKwkoZ3N0X2F2aV9kZW11eF9wYXJzZV9pbmRleCksIChnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpOgorCSAgU2lnbmVkbmVzcyB3YXJuaW5nIGZpeGVzLgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW90ZW1wbGF0ZS5jOiAocGx1Z2luX2luaXQpOgorCSAgUmVtb3ZlIGdzdF9saWJyYXJ5X2xvYWQKKworMjAwNS0wNi0zMCAgRWR3YXJkIEhlcnZleSAgPGVkd2FyZEBmbHVlbmRvLmNvbT4KKworCSogZ3N0L2F2aS9NYWtlZmlsZS5hbTogKGxpYmdzdGF2aV9sYV9MSUJBREQpOgorCUFkZGVkIGxpbmtpbmcgdG8gbGliZ3N0cmlmZi0wLjkKKwkKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX3NyY19xdWVyeSk6IAorCWNoZWNrIHRoZSBmb3JtYXQgb2YgdGhlIHVwc3RyZWFtIHF1ZXJ5IGFuZCByZXR1cm4gcXVlcnkgaWYgaXQncyB0aGUKKwlzYW1lIGZvcm1hdCBhcyB0aGUgcmVxdWVzdGVkIG9uZS4KKworMjAwNS0wNi0zMCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KToKKwkgIENvbXBpbGVyIHBhaW5zLgorCisyMDA1LTA2LTMwICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QvYXZpL01ha2VmaWxlLmFtOgorCSogZ3N0L2F2aS9nc3RhdmkuYzogKHBsdWdpbl9pbml0KToKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfZ2V0X3R5cGUpLAorCShnc3RfYXZpX2RlbXV4X2NsYXNzX2luaXQpLCAoZ3N0X2F2aV9kZW11eF9pbml0KSwKKwkoZ3N0X2F2aV9kZW11eF9yZXNldCksIChnc3RfYXZpX2RlbXV4X2luZGV4X25leHQpLAorCShnc3RfYXZpX2RlbXV4X2luZGV4X2VudHJ5X2Zvcl90aW1lKSwKKwkoZ3N0X2F2aV9kZW11eF9pbmRleF9lbnRyeV9mb3JfYnl0ZSksCisJKGdzdF9hdmlfZGVtdXhfaW5kZXhfZW50cnlfZm9yX2ZyYW1lKSwgKGdzdF9hdmlfZGVtdXhfc3JjX2NvbnZlcnQpLAorCShnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLCAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX2V2ZW50KSwKKwkoZ3N0X2F2aV9kZW11eF9wYXJzZV9maWxlX2hlYWRlciksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbml0KSwKKwkoZ3N0X2F2aV9kZW11eF9wYXJzZV9hdmloKSwgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3VwZXJpbmRleCksCisJKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3ViaW5kZXgpLCAoZ3N0X2F2aV9kZW11eF9yZWFkX3N1YmluZGV4ZXMpLAorCShnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSksIChnc3RfYXZpX2RlbXV4X3BhcnNlX29kbWwpLAorCShnc3RfYXZpX2RlbXV4X3BhcnNlX2luZGV4KSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4KSwKKwkoZ3N0X2F2aV9kZW11eF9zdHJlYW1fc2NhbiksIChnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpLAorCShnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpLCAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc2VlayksCisJKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2RhdGEpLAorCShnc3RfYXZpX2RlbXV4X2xvb3ApLCAoZ3N0X2F2aV9kZW11eF9zaW5rX2FjdGl2YXRlKSwKKwkoZ3N0X2F2aV9kZW11eF9zaW5rX2FjdGl2YXRlX3B1bGwpOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5oOgorCSAgUG9ydCBmcm9tIC1USFJFQURFRCB0byBIRUFELCBhbmQgZml4IGZvciBsYXRlc3QgQVBJIGNoYW5nZXMgb2YKKwkgIHRoZSBkYXkuIEtlZXAgYXZpbXV4IGRlYWQgZm9yIG5vdy4KKworMjAwNS0wNi0yOSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6IChnc3Rfc2hvdXQyc2VuZF9yZW5kZXIpOgorCUZpeCBidWlsZC4KKworMjAwNS0wNi0yOSAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZXhhbXBsZS5jOiBSZW1vdmVkIGdzdF9saWJyYXJ5X2xvYWQsIEkKKwl0aGluay4gV2hhdGV2ZXIgdGhpcyBwbHVnaW4gYWN0dWFsbHkgZG9lcywgdGhhdCBJIGRvbid0IGtub3cuCisKKzIwMDUtMDYtMjkgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmMgKGdzdF9pZDNfdGFnX2dldF9ldmVudF9tYXNrcyk6IFJlc2NobW9vdmUuCisKKwkqIGV4dC9tYWQvZ3N0bWFkLmMgKGdzdF9tYWRfZ2V0X2V2ZW50X21hc2tzKTogUmVtb3ZlLgorCShnc3RfbWFkX2NoYWluKTogQXBwZWFzZSBHQ0MuCisKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmMgKGdzdF9jYWNhc2lua19zZXRjYXBzKTogU2lnbmVkbmVzcy4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jIChnc3RfYWFzaW5rX2ZpeGF0ZSk6IFVucmVmIGNhcHMsIG5vdCBmcmVlLgorCShnc3RfYWFzaW5rX3NjYWxlKTogU2lnbmVkbmVzcy4KKworCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmMgKGdzdF91ZHBzaW5rX2dldF90eXBlKTogQWN0dWFsbHkgYWRkIHRoZQorCVVSSSBoYW5kbGVyLgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jIChnc3RfdWRwc3JjX3N0YXJ0KToKKwkoZ3N0X3VkcHNyY19jcmVhdGUpOiBTaWduZWRuZXNzLgorCisJKiBnc3QvcnRzcC9zZHBtZXNzYWdlLmMgKHNkcF9tZXNzYWdlX3BhcnNlX2J1ZmZlcik6IFRoYW5rcworCWNvbXBpbGVyIQorCShzZHBfcGFyc2VfbGluZSk6IFNpZ25lZG5lc3MgZml4LgorCisJKiBjb25maWd1cmUuYWMgKEdTVF9DRkxBR1MpOiBHQ0Mgc3RyaWtlcyBiYWNrISEhIExldCB0aGUgYnVpbGQKKwlicmVha2FnZSBlbnN1ZSEhIQorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmMgKGdzdF9ydHNwc3JjX2xvb3AsIGdzdF9ydHNwc3JjX29wZW4pOgorCVNpZ25lZG5lc3MsIHVudXNlZCB2YXIgZml4ZXMuCisJKGdzdF9ydHNwc3JjX2Nsb3NlKTogVW51c2VkPworCisJKiBnc3QvcmVhbG1lZGlhL3JtZGVtdXguYyAocmVfaGV4ZHVtcF9ieXRlcyk6IFVudXNlZC4KKworCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYyAoZ3N0X211bGF3ZW5jX2NoYWluKTogU2lnbmVuZXNzIGZpeC4KKworCSogZ3N0L2xhdy9hbGF3LWVuY29kZS5jIChhbGF3ZW5jX2dldGNhcHMpOiBSZW1vdmUgdW5uZWVkZWQKKwlkZWNsYXJhdGlvbnMuIFR5cG8gKHByb2JhYmx5IGNyYXNoZXIpIGZpeC4KKwkKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmMgKG11bGF3ZGVjX2dldGNhcHMpOiAKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmMgKG11bGF3ZW5jX2dldGNhcHMpOiAKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYyAoYWxhd2RlY19nZXRjYXBzKTogU2FtZSBjcmFzaGVyIGZpeC4KKworCSogZ3N0L2dvb20vZ3N0Z29vbS5jIChnc3RfZ29vbV9pbml0KTogSG9vayB1cCB0aGUgZXZlbnQgZnVuY3Rpb24uCisKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYyAoZ3N0X3dhcnB0dl9zZXR1cCk6IFNpZ25lZG5lc3MgZml4LgorCisJKiBnc3QvZWZmZWN0di9nc3RkaWNlLmMgKGdzdF9kaWNldHZfZHJhdyk6IFVtLCBkZWZlcmVuY2luZworCXVuaW5pdGlhbGl6ZWQgcG9pbnRlciBub3QgZ29vZC4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZXhhbXBsZS5jIChwbHVnaW5faW5pdCk6IAorCSogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtIChsaWJnc3R2aWRlb2V4YW1wbGVfbGFfTElCQUREKTogTGluaworCXRvIGxpYmdzdHZpZGVvZmlsdGVyIGluc3RlYWQgb2YgZ3N0X2xpYnJhcnlfbG9hZC4KKworCSogZ3N0L2FscGhhL2dzdGFscGhhLmMgKGdzdF9hbHBoYV9jaHJvbWFfa2V5X2k0MjApIAorCShnc3RfYWxwaGFfY2hyb21hX2tleV9heXV2KTogU2lnbmVkbmVzcyBmaXhlbi4KKworMjAwNS0wNi0yOSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwX3Byb3RvX2dldF90eXBlKSwKKwkoZ3N0X3J0c3BzcmNfY2xhc3NfaW5pdCksIChnc3RfcnRzcHNyY19jcmVhdGVfc3RyZWFtKSwKKwkoZ3N0X3J0c3BzcmNfYWRkX2VsZW1lbnQpLCAoZ3N0X3J0c3BzcmNfc2V0X3N0YXRlKSwKKwkoZ3N0X3J0c3BzcmNfc3RyZWFtX3NldHVwX3J0cCksCisJKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwgKGZpbmRfc3RyZWFtKSwKKwkoZ3N0X3J0c3BzcmNfbG9vcCksIChnc3RfcnRzcHNyY19vcGVuKSwgKGdzdF9ydHNwc3JjX3BsYXkpLAorCShnc3RfcnRzcHNyY19jaGFuZ2Vfc3RhdGUpOgorCUZpeCBjYXNlIHdoZXJlIG91dHBhZCBjb3VsZCBub3QgYmUgZGVjaWRlZC4KKworMjAwNS0wNi0yOSAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L01ha2VmaWxlLmFtIChNQURfRElSKTogQWRkIG1hZCB0byB0aGUgYnVpbGQuCisKKzIwMDUtMDYtMjggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfc3JjX2xpbmspOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfaW5pdCk6CisJRml4IG9sZCBSUEFEIG1hY3JvLgorCWJhc2VzcmMgLT4gYmFzZV9zcmMKKworMjAwNS0wNi0yNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfaWQzX3RhZ19zcmNfbGluayk6CisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9jaGFpbik6CisJUlBBRF8gLT4gUEFECisJRml4IGFyZ3MgaW4gYnVmZmVyYWxsb2MgZnVuY3Rpb24gY2FsbC4KKwlNYWtlcyB0aGUgbWFkIHBsdWdpbiBjb21waWxlIGFnYWluCisKKzIwMDUtMDYtMjcgIE93ZW4gRnJhc2VyLUdyZWVuICA8b3dlbkBkaXNjb2JhYmUubmV0PgorCisJKiBnc3QvcmVhbG1lZGlhL3JtZGVtdXguYzogUmV3cm90ZSB0byB1c2UgZ3N0YWRhcHRlci4gQWxzbyBwYXJzZXMKKwlhdWRpbyBhbmQgdmlkZW8gaGVhZGVyIHBhY2tldHMgZm9yIGtub3duIHByb3BlcnRpZXMuCisKKzIwMDUtMDYtMjMgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcF9wcm90b19nZXRfdHlwZSksCisJKGdzdF9ydHNwc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksCisJKGdzdF9ydHNwc3JjX2FkZF9lbGVtZW50KSwgKGdzdF9ydHNwc3JjX3NldF9zdGF0ZSksCisJKGdzdF9ydHNwc3JjX3N0cmVhbV9zZXR1cF9ydHApLAorCShnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksIChmaW5kX3N0cmVhbSksCisJKGdzdF9ydHNwc3JjX2xvb3ApLCAoZ3N0X3J0c3BzcmNfb3BlbiksIChnc3RfcnRzcHNyY19wbGF5KSwKKwkoZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC9ydHNwL3J0c3B1cmwuYzogKHJ0c3BfdXJsX3BhcnNlKToKKwlNYWtlIHJ0c3BzcmMgYSBsaXZlIHNvdXJjZS4KKwlEb24ndCB0cnkgdG8gcGFyc2UgTlVMTCB1cmxzLgorCisyMDA1LTA2LTIzICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfaW5pdCk6CisJTWFrZSB1ZHBzcmMgYSBsaXZlIHNvdXJjZS4KKworMjAwNS0wNi0wMiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC91ZHAvTWFrZWZpbGUuYW06CisJVXNlIHZlcnNpb25lZCBuZXQgbGliLgorCisyMDA1LTA2LTAyICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwlGaXggaGFjayBpbiBtYWtlZmlsZS4KKworMjAwNS0wNi0wMiAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogRmluaXNoIHBvcnRpbmcgdG8gMC45OiBubyBtb3JlIGdzdGRhdGEsCisJY2hlY2sgZm9yIGxpbmsgZnVuY3Rpb25zIGJlZm9yZSBjYWxsaW5nIHRoZW0sIGdpdmUKKwlnc3RfbWVzc2FnZV9uZXdfdGFnIGl0cyBvd24gY29weSBvZiB0aGUgdGFnIGxpc3QsIHNldCB0aGUgcGFyc2VyCisJc3RhdGUgYmVmb3JlIHNlbmRpbmcgdGhlIGV2ZW50IChiZWNhdXNlIGluIDAuOSBldmVudHMgYXJlCisJcHJvY2Vzc2VkIGltbWVkaWF0ZWx5KSwgY2FzdGluZyBmaXhlcy4KKworCSogZXh0L21hZC9NYWtlZmlsZS5hbSAobGliZ3N0bWFkX2xhX0xERkxBR1MpOiBMaW5rIHdpdGgKKwlnc3R0YWdlZGl0LgorCisyMDA1LTA2LTAyICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3VkcC9NYWtlZmlsZS5hbToKKwkqIGdzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmM6IChnc3RfbXVsdGl1ZHBzaW5rX2dldF90eXBlKSwKKwkoZ3N0X211bHRpdWRwc2lua19iYXNlX2luaXQpLCAoZ3N0X211bHRpdWRwc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X211bHRpdWRwc2lua19pbml0KSwgKGdzdF9tdWx0aXVkcHNpbmtfZmluYWxpemUpLAorCShnc3RfbXVsdGl1ZHBzaW5rX2dldF90aW1lcyksIChnc3RfbXVsdGl1ZHBzaW5rX3JlbmRlciksCisJKGdzdF9tdWx0aXVkcHNpbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF9tdWx0aXVkcHNpbmtfaW5pdF9zZW5kKSwKKwkoZ3N0X211bHRpdWRwc2lua19hZGQpLCAoY2xpZW50X2NvbXBhcmUpLCAoZnJlZV9jbGllbnQpLAorCShnc3RfbXVsdGl1ZHBzaW5rX3JlbW92ZSksIChnc3RfbXVsdGl1ZHBzaW5rX2NsZWFyKSwKKwkoZ3N0X211bHRpdWRwc2lua19nZXRfc3RhdHMpOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfZ2V0X3R5cGUpLAorCShnc3RfdWRwc3JjX2Jhc2VfaW5pdCksIChnc3RfdWRwc3JjX2NsYXNzX2luaXQpLAorCShnc3RfdWRwc3JjX2NyZWF0ZSksIChnc3RfdWRwc3JjX3NldF91cmkpLCAoZ3N0X3VkcHNyY19zdGFydCksCisJKGdzdF91ZHBzcmNfdW5sb2NrKSwgKGdzdF91ZHBzcmNfc3RvcCk6CisJVXNlIE5ldEJ1ZmZlciBhbmQgc21hbGwgY2xlYW51cHMuCisJSW1wbGVtZW50IGNsaWVudCByZW1vdmFsIGluIG11bHRpdWRwc2luay4KKworMjAwNS0wNi0wMiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9ydHNwL1JFQURNRToKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuYzogKGdzdF9ydHNwX3Byb3RvX2dldF90eXBlKSwKKwkoZ3N0X3J0c3BzcmNfY2xhc3NfaW5pdCksIChnc3RfcnRzcHNyY19jcmVhdGVfc3RyZWFtKSwKKwkoZ3N0X3J0c3BzcmNfYWRkX2VsZW1lbnQpLCAoZ3N0X3J0c3BzcmNfc2V0X3N0YXRlKSwKKwkoZ3N0X3J0c3BzcmNfc3RyZWFtX3NldHVwX3J0cCksCisJKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwgKGZpbmRfc3RyZWFtKSwKKwkoZ3N0X3J0c3BzcmNfbG9vcCksIChnc3RfcnRzcHNyY19vcGVuKSwgKGdzdF9ydHNwc3JjX3BsYXkpLAorCShnc3RfcnRzcHNyY19jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L3J0c3AvcnRzcHRyYW5zcG9ydC5jOiAocnRzcF90cmFuc3BvcnRfbmV3KSwKKwkocnRzcF90cmFuc3BvcnRfaW5pdCksIChwYXJzZV9tb2RlKSwgKHBhcnNlX3JhbmdlKSwKKwkocnRzcF90cmFuc3BvcnRfcGFyc2UpLCAocnRzcF90cmFuc3BvcnRfZnJlZSk6CisJUlRTUCBjbGVhbnVwcy4KKworMjAwNS0wNi0wMiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6IChnc3RfcXVhcmt0dl9jaGFpbik6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9jaGFpbik6CisJKiBnc3QvdmlkZW9ib3gvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogKGdzdF92aWRlb19ib3hfY2xhc3NfaW5pdCksCisJKGdzdF92aWRlb19ib3hfaW5pdCksIChnc3RfdmlkZW9fYm94X3Npbmtfc2V0Y2FwcyksCisJKGdzdF92aWRlb19ib3hfY2hhaW4pOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmlsdGVyLmM6IChnc3RfdmlkZW9maWx0ZXJfY2hhaW4pOgorCSogZ3N0L3ZpZGVvcmF0ZS9nc3R2aWRlb3JhdGUuYzogKGdzdF92aWRlb3JhdGVfY2xhc3NfaW5pdCksCisJKGdzdF92aWRlb3JhdGVfZ2V0Y2FwcyksIChnc3RfdmlkZW9yYXRlX3NldGNhcHMpLAorCShnc3RfdmlkZW9yYXRlX2luaXQpLCAoZ3N0X3ZpZGVvcmF0ZV9ldmVudCksIChnc3RfdmlkZW9yYXRlX2NoYWluKSwKKwkoZ3N0X3ZpZGVvcmF0ZV9jaGFuZ2Vfc3RhdGUpOgorCUJ1ZmZlcmFsbG9jIGNoYW5nZXMuCisKKzIwMDUtMDUtMjUgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9jaGFpbiksIChnc3RfbWFkX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvc2lkcGxheS9nc3RzaWRkZWMuY2M6CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogKGdzdF9hbHBoYV9jaGFpbik6CisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6IChnc3RfZ29vbV9jaGFpbik6CisJTm8gbmVlZCB0byB0YWtlIHRoZSBsb2NrIGFueW1vcmUsICBjb3JlIGFscmVhZHkgZGlkCisJdGhhdCBiZWZvcmUgY2FsbGluZyB1cy4KKworMjAwNS0wNS0yNSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9hbXJuYi9hbXJuYmRlYy5jOiAoZ3N0X2Ftcm5iZGVjX2luaXQpLCAoZ3N0X2Ftcm5iZGVjX2NoYWluKSwKKwkoZ3N0X2Ftcm5iZGVjX3N0YXRlX2NoYW5nZSk6CisJKiBleHQvYW1ybmIvYW1ybmJlbmMuYzogKGdzdF9hbXJuYmVuY19iYXNlX2luaXQpLAorCShnc3RfYW1ybmJlbmNfZmluYWxpemUpLCAoZ3N0X2Ftcm5iZW5jX2NoYWluKSwKKwkoZ3N0X2Ftcm5iZW5jX3N0YXRlX2NoYW5nZSk6CisJKiBleHQvYW1ybmIvYW1ybmJwYXJzZS5jOiAoZ3N0X2Ftcm5icGFyc2VfaW5pdCksCisJKGdzdF9hbXJuYnBhcnNlX3F1ZXJ5KSwgKGdzdF9hbXJuYnBhcnNlX2NoYWluKSwKKwkoZ3N0X2Ftcm5icGFyc2VfcmVhZF9oZWFkZXIpLCAoZ3N0X2Ftcm5icGFyc2VfbG9vcCksCisJKGdzdF9hbXJuYnBhcnNlX3NpbmtfYWN0aXZhdGUpLCAoZ3N0X2Ftcm5icGFyc2Vfc3RhdGVfY2hhbmdlKToKKwlDb3JlIGFscmVhZHkgdG9vayB0aGUgbG9jay4KKworMjAwNS0wNS0xOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L2VzZC9NYWtlZmlsZS5hbToKKwkgIERpc2FibGUgdGNwIGVsZW1lbnRzIGFuZCBlc2Rtb24gKHRoZXkgZG9uJ3QgY29tcGlsZSkuCisKKzIwMDUtMDUtMTkgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogTWFrZWZpbGUuYW06CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBzeXMvTWFrZWZpbGUuYW06CisJICBNYWtlIG15IGF1dG9tYWtlIHZlcnNpb24gc2h1dCB1cCBhYm91dCB1bmRlZmluZWQgdmFyaWFibGVzCisJKiBnc3QvZ29vbS9nc3Rnb29tLmM6CisJICBHc3RBZGFwdGVyIG1vdmVkIHRvIGJhc2Ugb2JqZWN0cy4gCisKKzIwMDUtMDUtMTggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvYW1ybmIvTWFrZWZpbGUuYW06CisJKiBleHQvYW1ybmIvYW1ybmIuYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC9hbXJuYi9hbXJuYmRlYy5jOiAoZ3N0X2Ftcm5iZGVjX2luaXQpLAorCShnc3RfYW1ybmJkZWNfc2V0Y2FwcyksIChnc3RfYW1ybmJkZWNfY2hhaW4pLAorCShnc3RfYW1ybmJkZWNfc3RhdGVfY2hhbmdlKToKKwkqIGV4dC9hbXJuYi9hbXJuYmRlYy5oOgorCSogZXh0L2Ftcm5iL2Ftcm5iZW5jLmM6IChnc3RfYW1ybmJlbmNfZ2V0X3R5cGUpLAorCShnc3RfYW1ybmJlbmNfYmFzZV9pbml0KSwgKGdzdF9hbXJuYmVuY19jbGFzc19pbml0KSwKKwkoZ3N0X2Ftcm5iZW5jX2luaXQpLCAoZ3N0X2Ftcm5iZW5jX2ZpbmFsaXplKSwKKwkoZ3N0X2Ftcm5iZW5jX3NldGNhcHMpLCAoZ3N0X2Ftcm5iZW5jX2NoYWluKSwKKwkoZ3N0X2Ftcm5iZW5jX3N0YXRlX2NoYW5nZSk6CisJKiBleHQvYW1ybmIvYW1ybmJlbmMuaDoKKwkqIGV4dC9hbXJuYi9hbXJuYnBhcnNlLmM6IChnc3RfYW1ybmJwYXJzZV9pbml0KSwKKwkoZ3N0X2Ftcm5icGFyc2VfcXVlcnkpLCAoZ3N0X2Ftcm5icGFyc2VfZXZlbnQpLAorCShnc3RfYW1ybmJwYXJzZV9jaGFpbiksIChnc3RfYW1ybmJwYXJzZV9yZWFkX2hlYWRlciksCisJKGdzdF9hbXJuYnBhcnNlX2xvb3ApLCAoZ3N0X2Ftcm5icGFyc2Vfc2lua19hY3RpdmF0ZSksCisJKGdzdF9hbXJuYnBhcnNlX3N0YXRlX2NoYW5nZSk6CisJKiBleHQvYW1ybmIvYW1ybmJwYXJzZS5oOgorCVBvcnRlZCBBTVIgZGVjb2Rlci9wYXJzZS4KKwlBZGRlZCBBTVIgZW5jb2Rlci4KKworMjAwNS0wNS0xOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9nb29tL01ha2VmaWxlLmFtOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOiAoZ3N0X2dvb21faW5pdCksIChnc3RfZ29vbV9zaW5rX3NldGNhcHMpLAorCShnc3RfZ29vbV9zcmNfc2V0Y2FwcyksIChnc3RfZ29vbV9zcmNfbmVnb3RpYXRlKSwgKGdzdF9nb29tX2V2ZW50KSwKKwkoZ3N0X2dvb21fY2hhaW4pLCAoZ3N0X2dvb21fY2hhbmdlX3N0YXRlKSwgKHBsdWdpbl9pbml0KToKKwlQb3J0ZWQgZ29vbS4KKwlBZGRlZCBnb29tIGFuZCBhbHBoYSB0byBidWlsZC4KKworMjAwNS0wNS0xNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9hbHBoYS9NYWtlZmlsZS5hbToKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYS5jOiAoZ3N0X2FscGhhX2NsYXNzX2luaXQpLCAoZ3N0X2FscGhhX2luaXQpLAorCShnc3RfYWxwaGFfc2lua19zZXRjYXBzKSwgKGdzdF9hbHBoYV9jaGFpbik6CisJUG9ydGVkIGFscGhhLCAgcmVtb3ZlIGFscGhhY29sb3IgYXMgZnVuY3Rpb25hbGl0eSBpcyBpbgorCWZmbXBlZ2NvbG9yc3BhY2UuCisKKzIwMDUtMDUtMTcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOiAoZ3N0X2NhY2FzaW5rX3NldGNhcHMpLAorCShnc3RfY2FjYXNpbmtfcmVuZGVyKSwgKGdzdF9jYWNhc2lua19vcGVuKSwgKGdzdF9jYWNhc2lua19jbG9zZSksCisJKGdzdF9jYWNhc2lua19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuaDoKKwlDbGVhbnVwcy4KKworMjAwNS0wNS0xNSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJTW92ZSBjb3JlIHBsdWdpbnMgb3V0IG9mIGNvcmUuICBJIGRvbid0IG1pbmQgZmRzcmMvZmRzaW5rCisJZ29pbmcgYmFjayBpbnRvIHRoZSBjb3JlOyB0aGV5IHdlcmUganVzdCBkaXNhYmxlZCB0aGVyZSwgc28KKwlJIG1vdmVkIHRoZW0uICBTb21lIG9mIHRoaXMgc3R1ZmYgY291bGQgKHNob3VsZCkgYmUgZGVsZXRlZC4KKwkqIGdzdC9vbGRjb3JlL01ha2VmaWxlLmFtOgorCSogZ3N0L29sZGNvcmUvZ3N0YWdncmVnYXRvci5jOgorCSogZ3N0L29sZGNvcmUvZ3N0YWdncmVnYXRvci5oOgorCSogZ3N0L29sZGNvcmUvZ3N0ZWxlbWVudHMuYzoKKwkqIGdzdC9vbGRjb3JlL2dzdGZkc2luay5jOgorCSogZ3N0L29sZGNvcmUvZ3N0ZmRzaW5rLmg6CisJKiBnc3Qvb2xkY29yZS9nc3RmZHNyYy5jOgorCSogZ3N0L29sZGNvcmUvZ3N0ZmRzcmMuaDoKKwkqIGdzdC9vbGRjb3JlL2dzdG1kNXNpbmsuYzoKKwkqIGdzdC9vbGRjb3JlL2dzdG1kNXNpbmsuaDoKKwkqIGdzdC9vbGRjb3JlL2dzdG11bHRpZmlsZXNyYy5jOgorCSogZ3N0L29sZGNvcmUvZ3N0bXVsdGlmaWxlc3JjLmg6CisJKiBnc3Qvb2xkY29yZS9nc3RwaXBlZmlsdGVyLmM6CisJKiBnc3Qvb2xkY29yZS9nc3RwaXBlZmlsdGVyLmg6CisJKiBnc3Qvb2xkY29yZS9nc3RzaGFwZXIuYzoKKwkqIGdzdC9vbGRjb3JlL2dzdHNoYXBlci5oOgorCSogZ3N0L29sZGNvcmUvZ3N0c3RhdGlzdGljcy5jOgorCSogZ3N0L29sZGNvcmUvZ3N0c3RhdGlzdGljcy5oOgorCisyMDA1LTA1LTEzICBDaHJpc3RpYW4gU2NoYWxsZXIgIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBleHQvTWFrZWZpbGUuYW06IGRpc3QgZXNkIGRpcmVjdG9yeQorCSogZ3N0LXBsdWdpbnMuc3BlYy5pbjogYWRkIHJ0cCBwbHVnaW5zIGFuZCBlc2QgcGx1Z2luCisJKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbTogZml4IHZpZGVvZmlsdGVyIGxpbmtpbmcKKwkqIGdzdC9ydHAvTWFrZWZpbGUuYW06IGFkZCBtaXNzaW5nIGhlYWRlcnMgCisJKiBnc3QvcnRzcC9NYWtlZmlsZS5hbTogYWRkIG1pc3NpbmcgaGVhZGVycworCisyMDA1LTA1LTEyICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L3NpZHBsYXkvZ3N0c2lkZGVjLmNjOgorCUFkZCB3b3JraW5nIHBsdWdpbnMgdG8gYnVpbGQuCisJTWFrZSBzaWRwbGF5IGNvbXBpbGUgYWdhaW4uCisKKzIwMDUtMDUtMTIgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfc3JjX3F1ZXJ5KToKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2NoYWluKToKKwlGaXggbWFkIGFuZCBpZDN0YWcgY29tcGlsYXRpb24gYWdhaW4uCisKKzIwMDUtMDUtMTIgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdWRwLy5jdnNpZ25vcmU6CisJKiBnc3QvdWRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYzogKGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3R5cGUpLAorCShnc3RfbXVsdGl1ZHBzaW5rX2Jhc2VfaW5pdCksIChnc3RfbXVsdGl1ZHBzaW5rX2NsYXNzX2luaXQpLAorCShnc3RfbXVsdGl1ZHBzaW5rX2luaXQpLCAoZ3N0X211bHRpdWRwc2lua19maW5hbGl6ZSksCisJKGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3RpbWVzKSwgKGdzdF9tdWx0aXVkcHNpbmtfcmVuZGVyKSwKKwkoZ3N0X211bHRpdWRwc2lua19zZXRfcHJvcGVydHkpLCAoZ3N0X211bHRpdWRwc2lua19nZXRfcHJvcGVydHkpLAorCShnc3RfbXVsdGl1ZHBzaW5rX2luaXRfc2VuZCksIChnc3RfbXVsdGl1ZHBzaW5rX2Nsb3NlKSwKKwkoZ3N0X211bHRpdWRwc2lua19hZGQpLCAoZ3N0X211bHRpdWRwc2lua19yZW1vdmUpLAorCShnc3RfbXVsdGl1ZHBzaW5rX2NsZWFyKSwgKGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3N0YXRzKSwKKwkoZ3N0X211bHRpdWRwc2lua19jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwLW1hcnNoYWwubGlzdDoKKwkqIGdzdC91ZHAvZ3N0dWRwLmM6IChwbHVnaW5faW5pdCk6CisJKiBnc3QvdWRwL2dzdHVkcC5oOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6IChnc3RfdWRwc2lua19nZXRfdHlwZSksCisJKGdzdF91ZHBzaW5rX2Jhc2VfaW5pdCksIChnc3RfdWRwc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X3VkcHNpbmtfaW5pdCksIChnc3RfdWRwc2lua19zZXRfdXJpKSwKKwkoZ3N0X3VkcHNpbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF91ZHBzaW5rX2dldF9wcm9wZXJ0eSksCisJKGdzdF91ZHBzaW5rX3VyaV9nZXRfdHlwZSksIChnc3RfdWRwc2lua191cmlfZ2V0X3Byb3RvY29scyksCisJKGdzdF91ZHBzaW5rX3VyaV9nZXRfdXJpKSwgKGdzdF91ZHBzaW5rX3VyaV9zZXRfdXJpKSwKKwkoZ3N0X3VkcHNpbmtfdXJpX2hhbmRsZXJfaW5pdCk6CisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuaDoKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2dldF90eXBlKSwKKwkoZ3N0X3VkcHNyY19iYXNlX2luaXQpLCAoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwKKwkoZ3N0X3VkcHNyY19jcmVhdGUpLCAoZ3N0X3VkcHNyY19zZXRfdXJpKSwgKGdzdF91ZHBzcmNfc3RhcnQpLAorCShnc3RfdWRwc3JjX3VubG9jayksIChnc3RfdWRwc3JjX3N0b3ApOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwlBZGRlZCBtdWx0aWZkc2luayB0byBzZW5kIFVEUCB0byBtdWx0aXBsZSBhZGRyZXNzZXMuCisJQ2xlYW5lZCB1cCBVRFAgc291cmNlL3NpbmsgZWxlbWVudHMgc29tZSBtb3JlLgorCU1ha2UgVURQIHNpbmsgZXh0ZW5kcyBmcm9tIG11bHRpdWRwc2luay4KKworMjAwNS0wNS0xMiAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9zcmNfcXVlcnkpLCAoZ3N0X21hZF9zaW5rX2V2ZW50KToKKwkgIE1ha2UgcXVlcmllcyBhY3R1YWxseSB3b3JrICh1cGRhdGUgY29yZSBmaXJzdCkuCisKKzIwMDUtMDUtMTIgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcnRzcC9SRUFETUU6CisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNyYy5jOiAoZ3N0X3RjcGNsaWVudHNyY19nZXRfdHlwZSksCisJKGdzdF90Y3BjbGllbnRzcmNfYmFzZV9pbml0KSwgKGdzdF90Y3BjbGllbnRzcmNfY2xhc3NfaW5pdCksCisJKGdzdF90Y3BjbGllbnRzcmNfaW5pdCksIChnc3RfdGNwY2xpZW50c3JjX2dldGNhcHMpLAorCShnc3RfdGNwY2xpZW50c3JjX3N0b3ApLCAoZ3N0X3RjcGNsaWVudHNyY19lb3MpLAorCShnc3RfdGNwY2xpZW50c3JjX2NyZWF0ZSksIChnc3RfdGNwY2xpZW50c3JjX3N0YXJ0KToKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c3JjLmg6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNyYy5jOiAoZ3N0X3RjcHNlcnZlcnNyY19nZXRfdHlwZSksCisJKGdzdF90Y3BzZXJ2ZXJzcmNfYmFzZV9pbml0KSwgKGdzdF90Y3BzZXJ2ZXJzcmNfY2xhc3NfaW5pdCksCisJKGdzdF90Y3BzZXJ2ZXJzcmNfaW5pdCksIChnc3RfdGNwc2VydmVyc3JjX2NyZWF0ZSksCisJKGdzdF90Y3BzZXJ2ZXJzcmNfc3RhcnQpLCAoZ3N0X3RjcHNlcnZlcnNyY19zdG9wKToKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc3JjLmg6CisJKiBnc3QvdGNwL2dzdHRjcHNyYy5jOiAoZ3N0X3RjcHNyY19nZXRfdHlwZSksCisJKGdzdF90Y3BzcmNfYmFzZV9pbml0KSwgKGdzdF90Y3BzcmNfY2xhc3NfaW5pdCksIChnc3RfdGNwc3JjX2luaXQpLAorCShnc3RfdGNwc3JjX2NyZWF0ZSksIChnc3RfdGNwc3JjX3N0YXJ0KSwgKGdzdF90Y3BzcmNfc3RvcCk6CisJKiBnc3QvdGNwL2dzdHRjcHNyYy5oOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6IChnc3RfdWRwc2lua19iYXNlX2luaXQpLAorCShnc3RfdWRwc2lua19pbml0KSwgKGdzdF91ZHBzaW5rX2dldF90aW1lcyksIChnc3RfdWRwc2lua19yZW5kZXIpLAorCShnc3RfdWRwc2lua19zZXRfcHJvcGVydHkpLCAoZ3N0X3VkcHNpbmtfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3VkcHNpbmtfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5oOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfZ2V0X3R5cGUpLAorCShnc3RfdWRwc3JjX2Jhc2VfaW5pdCksIChnc3RfdWRwc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3VkcHNyY19pbml0KSwKKwkoZ3N0X3VkcHNyY19jcmVhdGUpLCAoZ3N0X3VkcHNyY19zZXRfdXJpKSwgKGdzdF91ZHBzcmNfc3RhcnQpLAorCShnc3RfdWRwc3JjX3N0b3ApOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwlNYWtlIFVEUCBhbmQgVENQIGVsZW1lbnRzIHVzZSBQdXNoU3JjLgorCisKKzIwMDUtMDUtMTEgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfaW5pdCksIChnc3RfbWFkX3NyY19xdWVyeSksCisJKGluZGV4X3NlZWspLCAobm9ybWFsX3NlZWspLCAoZ3N0X21hZF9zaW5rX2V2ZW50KToKKwkgIFBvcnQgdG8gbmV3IHF1ZXJ5IEFQSSBhbmQgcmVwbGFjZSBnc3RfcGFkX2NvbnZlcnQoKQorCSAgYW5kIGdzdF9wYWRfZ2V0X2Zvcm1hdHMoKSB1c2FnZS4gZ3N0aWQzdGFnIGxvb2tzIGxpa2UKKwkgIGl0IG5lZWRzIHNvbWUgbW9yZSBsb3ZlIGJlZm9yZSBpdCB3aWxsIHdvcmsgYWdhaW4sIGlmIAorCSAgbm90IGEgcmV3cml0ZS4KKworMjAwNS0wNS0xMiAgWmVlc2hhbiBBbGkgIDx6ZWVuaXhAZ21haWwuY29tPgorCisJKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbToKKwlGaXhlZCB0aGUgZWZmZWN0diBidWlsZCBhZ2Fpbi4KKworMjAwNS0wNS0xMSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC90Y3AvTWFrZWZpbGUuYW06CisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6IChnc3RfbXVsdGlmZHNpbmtfZ2V0X3R5cGUpLAorCShnc3RfbXVsdGlmZHNpbmtfYmFzZV9pbml0KSwgKGdzdF9tdWx0aWZkc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X211bHRpZmRzaW5rX2luaXQpLCAoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfd3JpdGUpLAorCShnc3RfbXVsdGlmZHNpbmtfcXVldWVfYnVmZmVyKSwgKGdzdF9tdWx0aWZkc2lua19yZW5kZXIpLAorCShnc3RfbXVsdGlmZHNpbmtfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuaDoKKwkqIGdzdC90Y3AvZ3N0dGNwLmM6CisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNpbmsuYzogKGdzdF90Y3BjbGllbnRzaW5rX2dldF90eXBlKSwKKwkoZ3N0X3RjcGNsaWVudHNpbmtfYmFzZV9pbml0KSwgKGdzdF90Y3BjbGllbnRzaW5rX2NsYXNzX2luaXQpLAorCShnc3RfdGNwY2xpZW50c2lua19pbml0KSwgKGdzdF90Y3BjbGllbnRzaW5rX3JlbmRlciksCisJKGdzdF90Y3BjbGllbnRzaW5rX3NldF9wcm9wZXJ0eSksIChnc3RfdGNwY2xpZW50c2lua19nZXRfcHJvcGVydHkpLAorCShnc3RfdGNwY2xpZW50c2lua19jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzaW5rLmg6CisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNyYy5jOiAoZ3N0X3RjcGNsaWVudHNyY19jbGFzc19pbml0KSwKKwkoZ3N0X3RjcGNsaWVudHNyY19pbml0X3JlY2VpdmUpOgorCSogZ3N0L3RjcC9nc3R0Y3BwbHVnaW4uYzogKHBsdWdpbl9pbml0KToKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc2luay5jOiAoZ3N0X3RjcHNlcnZlcnNpbmtfY2xhc3NfaW5pdCk6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNpbmsuaDoKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc3JjLmM6IChnc3RfdGNwc2VydmVyc3JjX2NsYXNzX2luaXQpOgorCSogZ3N0L3RjcC9nc3R0Y3BzaW5rLmM6IChnc3RfdGNwc2lua19nZXRfdHlwZSksCisJKGdzdF90Y3BzaW5rX2Jhc2VfaW5pdCksIChnc3RfdGNwc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X3RjcHNpbmtfc2V0Y2FwcyksIChnc3RfdGNwc2lua19pbml0KSwgKGdzdF90Y3BzaW5rX2dldF90aW1lcyksCisJKGdzdF90Y3BzaW5rX3JlbmRlciksIChnc3RfdGNwc2lua19zZXRfcHJvcGVydHkpLAorCShnc3RfdGNwc2lua19nZXRfcHJvcGVydHkpOgorCSogZ3N0L3RjcC9nc3R0Y3BzaW5rLmg6CisJKiBnc3QvdGNwL2dzdHRjcHNyYy5jOiAoZ3N0X3RjcHNyY19jbGFzc19pbml0KSwgKGdzdF90Y3BzcmNfZ2V0KToKKwlQb3J0ZWQgb3ZlciBzb21lIHNpbmsgZWxlbWVudHMuCisJU291cmNlcyBub3QgcG9ydGVkIHlldCBhcyB0aGV5IHJlcXVpcmUgYSBQdXNoU291cmNlIGJhc2UgY2xhc3MuCisKKzIwMDUtMDUtMTEgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZ3N0L2VmZmVjdHYvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJICBUdXJuIHZpZGVvZmlsdGVyIGludG8gYSBsaWJyYXJ5IChwcml2YXRlIGZvciBub3cpCisKKzIwMDUtMDUtMTEgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcnRzcC9SRUFETUU6CisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcF9wcm90b19nZXRfdHlwZSksCisJKGdzdF9ydHNwc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksCisJKGdzdF9ydHNwc3JjX2FkZF9lbGVtZW50KSwgKGdzdF9ydHNwc3JjX3NldF9zdGF0ZSksCisJKGdzdF9ydHNwc3JjX3N0cmVhbV9zZXR1cF9ydHApLAorCShnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCksIChmaW5kX3N0cmVhbSksCisJKGdzdF9ydHNwc3JjX2xvb3ApLCAoZ3N0X3J0c3BzcmNfb3BlbiksIChnc3RfcnRzcHNyY19wbGF5KToKKwkqIGdzdC9ydHNwL3J0c3AuaDoKKwkqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fY3JlYXRlKSwKKwkocnRzcF9jb25uZWN0aW9uX3NlbmQpLCAocmVhZF9saW5lKSwgKHBhcnNlX3JlcXVlc3RfbGluZSksCisJKHBhcnNlX2xpbmUpLCAocmVhZF9ib2R5KSwgKHJ0c3BfY29ubmVjdGlvbl9yZWNlaXZlKSwKKwkocnRzcF9jb25uZWN0aW9uX2ZyZWUpOgorCSogZ3N0L3J0c3AvcnRzcGNvbm5lY3Rpb24uaDoKKwkqIGdzdC9ydHNwL3J0c3BkZWZzLmM6IChydHNwX2ZpbmRfbWV0aG9kKToKKwkqIGdzdC9ydHNwL3J0c3BkZWZzLmg6CisJKiBnc3QvcnRzcC9ydHNwbWVzc2FnZS5jOiAocnRzcF9tZXNzYWdlX3NldF9ib2R5KSwKKwkocnRzcF9tZXNzYWdlX3Rha2VfYm9keSk6CisJKiBnc3QvcnRzcC9ydHNwbWVzc2FnZS5oOgorCSogZ3N0L3J0c3AvcnRzcHN0cmVhbS5oOgorCSogZ3N0L3J0c3Avc2RwbWVzc2FnZS5jOiAoc2RwX3BhcnNlX2xpbmUpOgorCUFkZGVkIFJFQURNRQorCVNvbWUgY2xlYW51cHMuCisKKzIwMDUtMDUtMTEgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcnRzcC9nc3RydHNwc3JjLmM6IChnc3RfcnRzcF9wcm90b19nZXRfdHlwZSksCisJKGdzdF9ydHNwc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3J0c3BzcmNfaW5pdCksCisJKGdzdF9ydHNwc3JjX2NyZWF0ZV9zdHJlYW0pLCAoZ3N0X3J0c3BzcmNfYWRkX2VsZW1lbnQpLAorCShnc3RfcnRzcHNyY19zZXRfc3RhdGUpLCAoZ3N0X3J0c3BzcmNfc3RyZWFtX3NldHVwX3J0cCksCisJKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwgKGZpbmRfc3RyZWFtKSwKKwkoZ3N0X3J0c3BzcmNfbG9vcCksIChnc3RfcnRzcHNyY19vcGVuKSwgKGdzdF9ydHNwc3JjX2Nsb3NlKSwKKwkoZ3N0X3J0c3BzcmNfcGxheSksIChnc3RfcnRzcHNyY19jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5oOgorCVNldHVwIFVEUCBzb3VyY2VzIGNvcnJlY3RseSwgcmVjZWl2ZXMgcmF3IGRhdGEgZnJvbSBSVFNQCisJY29tcGxpYW50IHNlcnZlcnMgbm93LgorCisyMDA1LTA1LTExICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3J0c3AvLmN2c2lnbm9yZToKKwkqIGdzdC9ydHNwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0c3AvZ3N0cnRzcC5jOiAocGx1Z2luX2luaXQpOgorCSogZ3N0L3J0c3AvZ3N0cnRzcC5oOgorCSogZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jOiAoZ3N0X3J0c3BfcHJvdG9fZ2V0X3R5cGUpLAorCShnc3RfcnRzcHNyY19nZXRfdHlwZSksIChnc3RfcnRzcHNyY19iYXNlX2luaXQpLAorCShnc3RfcnRzcHNyY19jbGFzc19pbml0KSwgKGdzdF9ydHNwc3JjX2luaXQpLAorCShnc3RfcnRzcHNyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3J0c3BzcmNfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3J0c3BzcmNfY3JlYXRlX3N0cmVhbSksIChydHNwc3JjX2FkZF9lbGVtZW50KSwKKwkoZ3N0X3J0c3BzcmNfc3RyZWFtX3NldHVwX3J0cCksCisJKGdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0KSwgKGZpbmRfc3RyZWFtKSwKKwkoZ3N0X3J0c3BzcmNfbG9vcCksIChnc3RfcnRzcHNyY19zZW5kKSwgKGdzdF9ydHNwc3JjX29wZW4pLAorCShnc3RfcnRzcHNyY19jbG9zZSksIChnc3RfcnRzcHNyY19wbGF5KSwgKGdzdF9ydHNwc3JjX3BhdXNlKSwKKwkoZ3N0X3J0c3BzcmNfYWN0aXZhdGUpLCAoZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC9ydHNwL2dzdHJ0c3BzcmMuaDoKKwkqIGdzdC9ydHNwL3J0c3AuaDoKKwkqIGdzdC9ydHNwL3J0c3Bjb25uZWN0aW9uLmM6IChydHNwX2Nvbm5lY3Rpb25fb3BlbiksCisJKHJ0c3BfY29ubmVjdGlvbl9jcmVhdGUpLCAoYXBwZW5kX2hlYWRlciksIChydHNwX2Nvbm5lY3Rpb25fc2VuZCksCisJKHJlYWRfbGluZSksIChyZWFkX3N0cmluZyksIChyZWFkX2tleSksIChwYXJzZV9yZXNwb25zZV9zdGF0dXMpLAorCShwYXJzZV9saW5lKSwgKHJlYWRfYm9keSksIChydHNwX2Nvbm5lY3Rpb25fcmVjZWl2ZSksCisJKHJ0c3BfY29ubmVjdGlvbl9jbG9zZSk6CisJKiBnc3QvcnRzcC9ydHNwY29ubmVjdGlvbi5oOgorCSogZ3N0L3J0c3AvcnRzcGRlZnMuYzogKHJ0c3BfaW5pdF9zdGF0dXMpLCAocnRzcF9tZXRob2RfYXNfdGV4dCksCisJKHJ0c3BfaGVhZGVyX2FzX3RleHQpLCAocnRzcF9zdGF0dXNfYXNfdGV4dCksCisJKHJ0c3Bfc3RhdHVzX3RvX3N0cmluZyksIChydHNwX2ZpbmRfaGVhZGVyX2ZpZWxkKToKKwkqIGdzdC9ydHNwL3J0c3BkZWZzLmg6CisJKiBnc3QvcnRzcC9ydHNwbWVzc2FnZS5jOiAocnRzcF9tZXNzYWdlX25ld19yZXF1ZXN0KSwKKwkocnRzcF9tZXNzYWdlX2luaXRfcmVxdWVzdCksIChydHNwX21lc3NhZ2VfbmV3X3Jlc3BvbnNlKSwKKwkocnRzcF9tZXNzYWdlX2luaXRfcmVzcG9uc2UpLCAocnRzcF9tZXNzYWdlX2luaXRfZGF0YSksCisJKHJ0c3BfbWVzc2FnZV9hZGRfaGVhZGVyKSwgKHJ0c3BfbWVzc2FnZV9yZW1vdmVfaGVhZGVyKSwKKwkocnRzcF9tZXNzYWdlX2dldF9oZWFkZXIpLCAocnRzcF9tZXNzYWdlX2dldF9oZWFkZXJfY29weSksCisJKHJ0c3BfbWVzc2FnZV9zZXRfYm9keSksIChydHNwX21lc3NhZ2Vfc2V0X2JvZHlfY29weSksCisJKHJ0c3BfbWVzc2FnZV9nZXRfYm9keSksIChydHNwX21lc3NhZ2VfZ2V0X2JvZHlfY29weSksIChkdW1wX21lbSksCisJKGR1bXBfa2V5X3ZhbHVlKSwgKHJ0c3BfbWVzc2FnZV9kdW1wKToKKwkqIGdzdC9ydHNwL3J0c3BtZXNzYWdlLmg6CisJKiBnc3QvcnRzcC9ydHNwc3RyZWFtLmg6CisJKiBnc3QvcnRzcC9ydHNwdHJhbnNwb3J0LmM6IChydHNwX3RyYW5zcG9ydF9uZXcpLAorCShydHNwX3RyYW5zcG9ydF9pbml0KSwgKHBhcnNlX21vZGUpLCAocGFyc2VfcmFuZ2UpLAorCShydHNwX3RyYW5zcG9ydF9wYXJzZSksIChydHNwX3RyYW5zcG9ydF9mcmVlKToKKwkqIGdzdC9ydHNwL3J0c3B0cmFuc3BvcnQuaDoKKwkqIGdzdC9ydHNwL3J0c3B1cmwuYzogKHJ0c3BfdXJsX3BhcnNlKSwgKHJ0c3BfdXJsX2ZyZWUpOgorCSogZ3N0L3J0c3AvcnRzcHVybC5oOgorCSogZ3N0L3J0c3Avc2RwLmg6CisJKiBnc3QvcnRzcC9zZHBtZXNzYWdlLmM6IChzZHBfbWVzc2FnZV9uZXcpLCAoc2RwX21lc3NhZ2VfaW5pdCksCisJKHNkcF9tZXNzYWdlX2NsZWFuKSwgKHNkcF9tZXNzYWdlX2ZyZWUpLCAoc2RwX21lZGlhX25ldyksCisJKHNkcF9tZWRpYV9pbml0KSwgKHNkcF9tZXNzYWdlX3NldF9vcmlnaW4pLAorCShzZHBfbWVzc2FnZV9nZXRfb3JpZ2luKSwgKHNkcF9tZXNzYWdlX3NldF9jb25uZWN0aW9uKSwKKwkoc2RwX21lc3NhZ2VfZ2V0X2Nvbm5lY3Rpb24pLCAoc2RwX21lc3NhZ2VfYWRkX2JhbmR3aWR0aCksCisJKHNkcF9tZXNzYWdlX2FkZF90aW1lKSwgKHNkcF9tZXNzYWdlX2FkZF96b25lKSwKKwkoc2RwX21lc3NhZ2Vfc2V0X2tleSksIChzZHBfbWVzc2FnZV9nZXRfa2V5KSwKKwkoc2RwX21lc3NhZ2VfZ2V0X2F0dHJpYnV0ZV92YWwpLCAoc2RwX21lc3NhZ2VfYWRkX2F0dHJpYnV0ZSksCisJKHNkcF9tZXNzYWdlX2FkZF9tZWRpYSksIChzZHBfbWVkaWFfYWRkX2F0dHJpYnV0ZSksCisJKHNkcF9tZWRpYV9hZGRfYmFuZHdpZHRoKSwgKHNkcF9tZWRpYV9hZGRfZm9ybWF0KSwKKwkoc2RwX21lZGlhX2dldF9hdHRyaWJ1dGVfdmFsKSwgKHJlYWRfc3RyaW5nKSwgKHJlYWRfc3RyaW5nX2RlbCksCisJKHNkcF9wYXJzZV9saW5lKSwgKHNkcF9tZXNzYWdlX3BhcnNlX2J1ZmZlciksIChwcmludF9tZWRpYSksCisJKHNkcF9tZXNzYWdlX2R1bXApOgorCSogZ3N0L3J0c3Avc2RwbWVzc2FnZS5oOgorCSogZ3N0L3J0c3AvdGVzdC5jOiAobWFpbik6CisJUG9ydGVkIHRvIDAuOS4KKwlTZXQgdXAgdHJhbnNwb3J0cywgaW5pdCBVRFAgcG9ydHMsIGluaXQgUlRQIHNlc3Npb24gbWFuYWdlcnMuCisKKzIwMDUtMDUtMTEgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcnRwL01ha2VmaWxlLmFtOgorCSogZ3N0L3J0cC9nc3RydHAuYzogKHBsdWdpbl9pbml0KToKKwkqIGdzdC9ydHAvZ3N0cnRwZGVjLmM6IChnc3RfcnRwZGVjX2dldF90eXBlKSwKKwkoZ3N0X3J0cGRlY19jbGFzc19pbml0KSwgKGdzdF9ydHBkZWNfaW5pdCksIChnc3RfcnRwZGVjX2NoYWluX3J0cCksCisJKGdzdF9ydHBkZWNfY2hhaW5fcnRjcCksIChnc3RfcnRwZGVjX3NldF9wcm9wZXJ0eSksCisJKGdzdF9ydHBkZWNfZ2V0X3Byb3BlcnR5KSwgKGdzdF9ydHBkZWNfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3J0cGRlY19wbHVnaW5faW5pdCk6CisJKiBnc3QvcnRwL2dzdHJ0cGRlYy5oOgorCSogZ3N0L3VkcC9nc3R1ZHBzaW5rLmM6IChnc3RfdWRwc2lua19iYXNlX2luaXQpLAorCShnc3RfdWRwc2lua19nZXRfdGltZXMpLCAoZ3N0X3VkcHNpbmtfcmVuZGVyKSwKKwkoZ3N0X3VkcHNpbmtfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2dldF90eXBlKSwKKwkoZ3N0X3VkcHNyY19iYXNlX2luaXQpLCAoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwgKGdzdF91ZHBzcmNfaW5pdCksCisJKGdzdF91ZHBzcmNfbG9vcCksIChnc3RfdWRwc3JjX3NldF91cmkpLCAoZ3N0X3VkcHNyY19zZXRfcHJvcGVydHkpLAorCShnc3RfdWRwc3JjX2dldF9wcm9wZXJ0eSksIChnc3RfdWRwc3JjX2luaXRfcmVjZWl2ZSksCisJKGdzdF91ZHBzcmNfYWN0aXZhdGUpLCAoZ3N0X3VkcHNyY19jaGFuZ2Vfc3RhdGUpLAorCShnc3RfdWRwc3JjX3VyaV9nZXRfdHlwZSksIChnc3RfdWRwc3JjX3VyaV9nZXRfcHJvdG9jb2xzKSwKKwkoZ3N0X3VkcHNyY191cmlfZ2V0X3VyaSksIChnc3RfdWRwc3JjX3VyaV9zZXRfdXJpKSwKKwkoZ3N0X3VkcHNyY191cmlfaGFuZGxlcl9pbml0KToKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmg6CisJVURQIGZpeGVzLCBhZGRlZCB1cmkgaGFuZGxlci4KKwlBZGRlZCBydHBkZWMgdGhhdCB3aWxsIG1hbmFnZSB0aGUgUlRQIHNlc3Npb24gaW4gdGhlIGZ1dHVyZS4KKworMjAwNS0wNS0xMCAgQXJ3ZWQgdi4gTWVya2F0eiAgPHYubWVya2F0ekBnbXgubmV0PgorCisJKiBQT1JURURfMDk6CisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvZXNkL01ha2VmaWxlLmFtOgorCSogZXh0L2VzZC9lc2RzaW5rLmM6IChnc3RfZXNkc2lua19nZXRfdHlwZSksCisJKGdzdF9lc2RzaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2VzZHNpbmtfaW5pdCksCisJKGdzdF9lc2RzaW5rX2Rpc3Bvc2UpLCAoZ3N0X2VzZHNpbmtfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X2NhcHNfc2V0X2VhY2gpLCAoZ3N0X2VzZHNpbmtfZ2V0Y2FwcyksIChnc3RfZXNkc2lua19vcGVuKSwKKwkoZ3N0X2VzZHNpbmtfY2xvc2UpLCAoZ3N0X2VzZHNpbmtfd3JpdGUpLCAoZ3N0X2VzZHNpbmtfZGVsYXkpLAorCShnc3RfZXNkc2lua19yZXNldCksIChnc3RfZXNkc2lua19zZXRfcHJvcGVydHkpLAorCShnc3RfZXNkc2lua19nZXRfcHJvcGVydHkpLCAoZ3N0X2VzZHNpbmtfZmFjdG9yeV9pbml0KToKKwkqIGV4dC9lc2QvZXNkc2luay5oOgorCSogZXh0L2VzZC9nc3Rlc2QuYzogKHBsdWdpbl9pbml0KToKKwlQb3J0ZWQgZXNkc2luayBwbHVnaW4KKworMjAwNS0wNS0xMCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC91ZHAvTWFrZWZpbGUuYW06CisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuYzogKGdzdF91ZHBzaW5rX2dldF90eXBlKSwKKwkoZ3N0X3VkcHNpbmtfYmFzZV9pbml0KSwgKGdzdF91ZHBzaW5rX2NsYXNzX2luaXQpLAorCShnc3RfdWRwc2lua19pbml0KSwgKGdzdF91ZHBzaW5rX2dldF90aW1lcyksIChnc3RfdWRwc2lua19yZW5kZXIpLAorCShnc3RfdWRwc2lua19zZXRfcHJvcGVydHkpLCAoZ3N0X3VkcHNpbmtfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3VkcHNpbmtfaW5pdF9zZW5kKSwgKGdzdF91ZHBzaW5rX2Nsb3NlKSwKKwkoZ3N0X3VkcHNpbmtfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC91ZHAvZ3N0dWRwc2luay5oOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuYzogKGdzdF91ZHBzcmNfYmFzZV9pbml0KSwKKwkoZ3N0X3VkcHNyY19jbGFzc19pbml0KSwgKGdzdF91ZHBzcmNfaW5pdCksIChnc3RfdWRwc3JjX2xvb3ApLAorCShnc3RfdWRwc3JjX3NldF9wcm9wZXJ0eSksIChnc3RfdWRwc3JjX2dldF9wcm9wZXJ0eSksCisJKGdzdF91ZHBzcmNfaW5pdF9yZWNlaXZlKSwgKGdzdF91ZHBzcmNfY2xvc2UpLAorCShnc3RfdWRwc3JjX2FjdGl2YXRlKSwgKGdzdF91ZHBzcmNfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmg6CisJUG9ydGVkIHVkcCBzcmMvc2luay4KKworMjAwNS0wNS0wOSAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBQT1JURURfMDk6CisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvc2hvdXQyL01ha2VmaWxlLmFtOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzogKGdzdF9zaG91dDJzZW5kX2dldF90eXBlKSwKKwkoZ3N0X3Nob3V0MnNlbmRfYmFzZV9pbml0KSwgKGdzdF9zaG91dDJzZW5kX2NsYXNzX2luaXQpLAorCShnc3Rfc2hvdXQyc2VuZF9pbml0KSwgKGdzdF9zaG91dDJzZW5kX2V2ZW50KSwKKwkoZ3N0X3Nob3V0MnNlbmRfcmVuZGVyKSwgKGdzdF9zaG91dDJzZW5kX3NldF9wcm9wZXJ0eSksCisJKGdzdF9zaG91dDJzZW5kX2dldF9wcm9wZXJ0eSksIChnc3Rfc2hvdXQyc2VuZF9zZXRjYXBzKSwKKwkoZ3N0X3Nob3V0MnNlbmRfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmg6CisKKwlQb3J0IHNob3V0MiBwbHVnaW4KKworMjAwNS0wNS0wOCAgWmVlc2hhbiBBbGkgICA8emVlbml4QGdtYWlsLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2xpYmNhY2EvTWFrZWZpbGUuYW06CisJKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOiAoZ3N0X2NhY2FzaW5rX2dldF90eXBlKSwKKwkoZ3N0X2NhY2FzaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2NhY2FzaW5rX2dldF90aW1lcyksCisJKGdzdF9jYWNhc2lua19zZXRjYXBzKSwgKGdzdF9jYWNhc2lua19pbml0KSwgKGdzdF9jYWNhc2lua19yZW5kZXIpLAorCShwbHVnaW5faW5pdCk6CisJKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5oOgorCVBvcnRlZCB0aGUgbGliY2FjYSBwbHVnaW4uCisKKzIwMDUtMDUtMDggIFplZXNoYW4gQWxpICA8emVlbml4QGdtYWlsLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L21hZC9NYWtlZmlsZS5hbToKKwkqIGVmZmVjdHYvTWFrZWZpbGUuYW06CisJRml4ZWQgYSBmZXcgdGhpbmdzIHRvIGVuYWJsZSB0aGUgbWFkIGFuZCBlZmZlY3R2IHRvIGJlIGFibGUgdG8gZmluZCB0aGUKKwloZWFkZXJzIGluIHRoZSBnc3QtcGx1Z2lucy1iYXNlL2dzdC1saWJzIGFuZCB0byBsaW5rIGFnYWluc3QgdGhlIGxpYnMKKwlpbiB0aGVyZS4KKworMjAwNS0wNS0wNyAgWmVlc2hhbiBBbGkgIDx6ZWVuaXhAZ21haWwuY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJRml4ZWQgdGhlIGJ1aWxkIGJ5IGZpeGluZyBhIHNtYWxsIG1pc3Rha2Ugb2YgV2ltLgorCQorMjAwNS0wNS0wNiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9hYWxpYi9NYWtlZmlsZS5hbToKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzogKGdzdF9hYXNpbmtfZ2V0X3R5cGUpLAorCShnc3RfYWFzaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2Fhc2lua19maXhhdGUpLCAoZ3N0X2Fhc2lua19zZXRjYXBzKSwKKwkoZ3N0X2Fhc2lua19pbml0KSwgKGdzdF9hYXNpbmtfZ2V0X3RpbWVzKSwgKGdzdF9hYXNpbmtfcmVuZGVyKSwKKwkoZ3N0X2Fhc2lua19zZXRfcHJvcGVydHkpLCAoZ3N0X2Fhc2lua19nZXRfcHJvcGVydHkpLAorCShnc3RfYWFzaW5rX29wZW4pLCAoZ3N0X2Fhc2lua19jbG9zZSksIChnc3RfYWFzaW5rX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmg6CisJKiBnc3Qvc21wdGUvTWFrZWZpbGUuYW06CisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzogKGdzdF9zbXB0ZV9zZXRjYXBzKSwgKGdzdF9zbXB0ZV9pbml0KSwKKwkoZ3N0X3NtcHRlX2NvbGxlY3RlZCk6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuaDoKKwlQb3J0ZWQgMiBtb3JlIHBsdWdpbnMuIHVzZ2x5IGhhY2sgaW4gdGhlIE1ha2VmaWxlLmFtIHRob3VnaCwgSSdtCisJc3VyZSBzb21lb25lIHdpbGwgZml4IGl0LgorCisyMDA1LTA1LTA2ICBDaHJpc3RpYW4gU2NoYWxsZXIgIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBjb25maWd1cmUuYWM6IGFkZCBzaWRwbGF5CisJKiBleHQvTWFrZWZpbGUuYW06IGFkZCBzaWRwbGF5CisJKiBleHQvc2lkcGxheS9NYWtlZmlsZS5hbTogYWRkIEdTVF9QTFVHSU5TX0NGTEFHUworCSogZXh0L3NpZHBsYXkvZ3N0c2lkZGVjLmNjOiByZW1vdmUgYnl0ZXN0cmVhbS5oCisKKzIwMDUtMDUtMDYgIENocmlzdGlhbiBTY2hhbGxlciAgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogYWRkIGdzdC1wbHVnaW5zLWxpYnMKKworMjAwNS0wNS0wNiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9zaWRwbGF5L2dzdHNpZGRlYy5jYzoKKwkqIGV4dC9zaWRwbGF5L2dzdHNpZGRlYy5oOgorCVBvcnRlZCBzaWRwbGF5LgorCisyMDA1LTA1LTA2ICBDaHJpc3RpYW4gU2NoYWxsZXIgIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBjb25maWd1cmUuYWM6IAorCSogZXh0L21hZC9NYWtlZmlsZS5hbTogYWRkIGxpbmtpbmcgb2YgZ3N0aW50ZXJmYWNlcworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKHBsdWdpbl9pbml0KTogcmVtb3ZlIGxpYnJhcnlfbG9hZAorCSogZ3N0LXBsdWdpbnMuc3BlYy5pbjogCisJKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbTogbGluayB0byBsaWJnc3R2aWRlb2ZpbHRlcgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWZmZWN0di5jOiAocGx1Z2luX2luaXQpOiBzYW1lIGFzIGZvciBtYWQKKwkqIGdzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbTogbWFrZSBzdXJlIHZpZGVvZmxpcCBpcyBub3QgYnVpbHQKKworMjAwNS0wNS0wNiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9sYXcvYWxhdy1kZWNvZGUuYzogKGFsYXdkZWNfZ2V0Y2FwcyksIChhbGF3ZGVjX3NldGNhcHMpLAorCShnc3RfYWxhd2RlY19pbml0KSwgKGdzdF9hbGF3ZGVjX2NoYWluKToKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzogKGFsYXdlbmNfZ2V0Y2FwcyksIChhbGF3ZW5jX3NldGNhcHMpLAorCShnc3RfYWxhd2VuY19pbml0KSwgKGdzdF9hbGF3ZW5jX2NoYWluKToKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6IChtdWxhd2RlY19nZXRjYXBzKSwgKG11bGF3ZGVjX3NldGNhcHMpLAorCShnc3RfbXVsYXdkZWNfaW5pdCksIChnc3RfbXVsYXdkZWNfY2hhaW4pOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzogKG11bGF3ZW5jX2dldGNhcHMpLCAobXVsYXdlbmNfc2V0Y2FwcyksCisJKGdzdF9tdWxhd2VuY19pbml0KSwgKGdzdF9tdWxhd2VuY19jaGFpbik6CisJUG9ydGVkIGFsYXcgYW5kIG11bGF3IHBsdWdpbnMgdG8gMC45LCBmaXhlZCB0aGUgbmVnb3RpYXRpb24gYXMKKwl3ZWxsLgorCisyMDA1LTA1LTA2ICBDaHJpc3RpYW4gU2NoYWxsZXIgIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBleHQvYWxzYTogcmVtb3ZlZCBwbHVnaW5zIHRoYXQgYXJlIG5vdyBpbiBnc3QtcGx1Z2lucy1iYXNlCisJKiBleHQvZ25vbWV2ZnM6CisJKiBleHQvdGhlb3JhOgorCSogZXh0L3ZvcmJpczoKKwkqIGdzdC9hZGRlcjoKKwkqIGdzdC9hdWRpb2NvbnZlcnQ6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZToKKwkqIGdzdC90eXBlZmluZDoKKwkqIGdzdC92aWRlb2ZpbHRlcjogY29tbWVudCBvdXQgdmlkZW9mbGlwIGFuZCBnYW1tYSBwbHVnaW5zCisKKzIwMDUtMDUtMDYgIENocmlzdGlhbiBTY2hhbGxlciAgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC1saWJzOiBSZW1vdmUgYWxsIGZpbGVzIGFzIHRoaXMgaXMgaW4gZ3N0LXBsdWdpbnMtYmFzZSBub3cKKwkqIGdzdC1saWJzL1JFQURNRTogYWRkIGEgcmVtb3ZlIGluZm9ybWluZyBvZiB0aGlzIG1vdmUKKworMjAwNS0wNS0wNiAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPiAKKworCSogUE9SVEVEXzA5OiB1cGRhdGUgdG8gYWRkIHZpZGVvZmlsdGVyCisJKiBjb25maWd1cmUuYWM6IHJlLWFkZCB2aWRlb2ZpbHRlcgorCSogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOiByZW1vdmUgdmlkZW9iYWxhbmNlIChub3QgcG9ydGVkIHlldCkKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jOiAoZ3N0X2dhbW1hX2NsYXNzX2luaXQpOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOiAoZ3N0X3ZpZGVvYmFsYW5jZV9jbGFzc19pbml0KToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZpbHRlci5jOiAoZ3N0X3ZpZGVvZmlsdGVyX2dldGNhcHMpLAorCShnc3RfdmlkZW9maWx0ZXJfc2V0Y2FwcyksIChnc3RfdmlkZW9maWx0ZXJfaW5pdCksCisJKGdzdF92aWRlb2ZpbHRlcl9jaGFpbiksIChnc3RfdmlkZW9maWx0ZXJfc2V0X291dHB1dF9zaXplKToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYzogKGdzdF92aWRlb2ZsaXBfY2xhc3NfaW5pdCk6CisKKzIwMDUtMDUtMDYgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogZXh0L21hZDogcG9ydGVkIHBsdWdpbiBmcm9tIHRocmVhZGVkIGJyYW5jaAorCSogZ3N0L2VmZmVjdHY6IHBvcnRlZCBwbHVnaW5zIGZyb20gdGhyZWFkZWQgYnJhbmNoCisJKiBnc3QvbGF3OiBlbmFibGUgbGF3IHBsdWdpbiBhcyBpdCBjb21waWxlcyAoV2ltIHdpbGwgZml4b3IpCisKKzIwMDUtMDUtMDYgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCWZpeCB0eXBvCisKKzIwMDUtMDUtMDUgIENocmlzdGlhbiBTY2hhbGxlciA8dXJhZXVzQGdub21lLm9yZz4KKworCSogVXBkYXRlIGNvbmZpZ3VyZS5hYyBhbmQgTWFrZWZpbGVzIHRvIG9ubHkgYnVpbGQgd2hhdCBpcyBhY3R1YWxseQorCXBvcnRlZCBhbmQgbm90IG1vdmVkIGludG8gZ3N0LXBsdWdpbnMtYmFzZQorCisyMDA1LTAyLTIyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBodW50aW5nIHNlYXNvbiBvbiAwLjkgaXMgbm93IE9QRU4KKworMjAwNS0wMi0yMiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50LmM6IChnc3Rfb3NzZWxlbWVudF9jbGFzc19wcm9iZV9kZXZpY2VzKToKKwkgIEtpY2sgdGhlIGhlbGwgb3V0IG9mIGdjYyBmb3Igbm90IHdhcm5pbmcgbWUgYWJvdXQgYSBzeW1ib2wgY29uZmxpY3QuCisKKzIwMDUtMDItMjIgIEx1Y2EgT2duaWJlbmUgIDxsdW9nbmlAdGluLml0PgorCisJUmV2aWV3ZWQgYnk6IFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzogKGdzdF9waXhidWZzY2FsZV9saW5rKToKKwkgIERvbid0IGxlYWsgY2FwcyBzdHJpbmcgKGZpeGVzICMxNjgxMzQpCisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzogKGdzdF9qcGVnZW5jX2NsYXNzX2luaXQpLAorCShnc3RfanBlZ2VuY19pbml0KSwgKGdzdF9qcGVnZW5jX2ZpbmFsaXplKSwKKwkoZ3N0X2pwZWdlbmNfY2hhbmdlX3N0YXRlKToKKwkgIERvbid0IGxlYWsgbGluZSBidWZmZXJzIGFuZCBjb250ZXh0IHN0cnVjdCAoZml4ZXMgIzE2ODEzMykuCisKKzIwMDUtMDItMjEgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L2RpcmFjL2dzdGRpcmFjZGVjLmNjOgorCShnc3RfZGlyYWNkZWNfY2hhaW4pOgorCSAgU2luY2UgZGlyYWMgMC41LjAgdGhlIGZyYW1lcmF0ZSBpbiBkaXJhYyBpcyBleHByZXNzZWQgYXMgYQorCSAgcmF0aW9uYWwgbnVtYmVyLiBGaXggYnVpbGQgYW5kIHVwIHJlcXVpcmVtZW50IHRvIDAuNS4wLCBhbmQKKwkgIGFsc28gcGFzcyBwYXJhbWV0ZXJzIHRvIGdzdF9kaXJhY2RlY19saW5rIGluIHRoZSByaWdodCBvcmRlcgorCSAgKGZpeGVzICMxNjc5NTkpLgorCisyMDA1LTAyLTIxICBNYWNpZWogS2F0YWZpYXN6ICA8bWF0aHJpY2tAZnJlZWRlc2t0b3Aub3JnPgorCisJKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9zaW5rY29ubmVjdCksIChnc3RfZmFhZF9jaGFpbik6CisJKiBleHQvZmFhZC9nc3RmYWFkLmg6CisJVEVIIExPTkdFU1QgREVCVUdHSU5HIFNFU1NJT04gRVZBUiBpcyBvdmVyLiBGaXggaW50ZXJhY3Rpb24gd2l0aCAKKwljZXJ0YWluIGludmFsaWQgbXV4ZWQgc3RyZWFtcywgd2hlcmUgc29tZSBwYWNrZXRzIHdpbGwgY29udGFpbiAKKwlqdW5rIGFmdGVyIGRlY29kZXIgZGF0YS4gUGFydGlhbGx5IGZpeGVzICMxNDkxNTguCisKKzIwMDUtMDItMjEgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCSogZ3N0L2R2ZGxwY21kZWMvZ3N0ZHZkbHBjbWRlYy5jOiAoZ3N0X2R2ZGxwY21kZWNfY2hhaW4pOgorICAgICAgICAgIE1ha2Ugc3VyZSB3ZSBvbmx5IHdyaXRlIHRvIHdyaXRhYmxlIGJ1ZmZlcnMKKworMjAwNS0wMi0yMCAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6CisJKGdzdF9yaWZmX2NyZWF0ZV9hdWRpb19jYXBzX3dpdGhfZGF0YSk6CisJICBEbyBhY3R1YWxseSBmaXggaW52YWxpZCBSSUZGIGZtdCBoZWFkZXIgdmFsdWVzIGZvciBhbGF3CisJICBhbmQgbXVsYXcgYXVkaW8gaW5zdGVhZCBvZiBqdXN0IHNheWluZyBzby4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfZm10KToKKwkgIEdpdmUgZ3N0X3JpZmZfY3JlYXRlX2F1ZGlvX2NhcHNfd2l0aF9kYXRhKCkgYSBjaGFuY2UgdG8KKwkgIGZpeCB1cCBicm9rZW4gZm9ybWF0IGhlYWRlciBmaWVsZHMgYmVmb3JlIGV4dHJhY3RpbmcgYW55CisJICBwYXJhbWV0ZXJzIGZyb20gdGhlIGhlYWRlci4gKGZpeGVzICMxNjc2MzMpCisKKzIwMDUtMDItMTkgIE1hcnRpbiBIb2x0ZXJzICA8bWFydGluLmhvbHRlcnNAZ214LmRlPgorCisJUmV2aWV3ZWQgYnk6IFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZ3N0L2F1ZGlvY29udmVydC9idWZmZXJmcmFtZXNjb252ZXJ0LmM6CisJKGJ1ZmZlcl9mcmFtZXNfY29udmVydF9saW5rKToKKwkgIERvbid0IGxlYWsgb3RoZXJjYXBzLiAoZml4ZXMgIzE2Nzg3OCkKKworMjAwNS0wMi0xOSAgQXJ3ZWQgdi4gTWVya2F0eiAgPHYubWVya2F0ekBnbXgubmV0Pj4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L2xpYnZpc3VhbC92aXN1YWwuYzogKGdzdF92aXN1YWxfc3JjbGluayksCisJKGdzdF92aXN1YWxfY2hhbmdlX3N0YXRlKToKKwkgIFN1cHBvcnQgbGlidmlzdWFsIDAuMi4wLgorCisyMDA1LTAyLTE4ICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKGdzdF9qcGVnZGVjX2NoYWluKToKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzogKGdzdF9qcGVnZW5jX3Jlc3luYyksIChnc3RfanBlZ2VuY19jaGFpbik6CisJICBVc2Ugc2FtZSByb3dzdHJpZGVzIGZvciBJNDIwIGFzIHVzZWQgZXZlcnl3aGVyZSBlbHNlLgorCisyMDA1LTAyLTE3ICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaW52ZXJ0KToKKwkgIERlY2xhcmUgdmFyaWFibGVzIGF0IGJlZ2lubmluZyBvZiBibG9jayBhbmQgbWFrZSBnY2MtMi45NSBoYXBweQorCSAgKGZpeGVzICMgMTY3NDgyLCBwYXRjaCBieSBHZXJnZWx5IE5hZ3kpLgorCSAgCisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNyYy5jOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuaDoKKwkgIE1vdmUgc29tZSBpbmNsdWRlcyBpbnRvIHRoZSBoZWFkZXIsIHNvIHRoYXQgc3RydWN0IHNvY2thZGRyX2luIGlzCisJICBkZWZpbmVkIHdoZW4gaXQgc2hvdWxkIGJlIGRlZmluZWQgb24gRnJlZUJTRCBhcyB3ZWxsIChmaXhlcworCSAgIzE2NzQ4MykuCisJICAKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc3JjLmM6IChnc3RfdGNwc2VydmVyc3JjX2luaXRfcmVjZWl2ZSk6CisJICBEb24ndCBwYXNzIHVuaW5pdGlhbGlzZWQgdmFsdWVzIHRvIHNldHNvY2tvcHQoKSBoZXJlIGVpdGhlci4KKworMjAwNS0wMi0xNyAgTHVjYSBPZ25pYmVuZSAgPGx1b2duaSBhdCB0aW4gZG90IGl0PgorCisJUmV2aWV3ZWQgYnk6IFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzaW5rLmM6IChnc3RfdGNwc2VydmVyc2lua19pbml0X3NlbmQpOgorCSAgRG9uJ3QgcGFzcyB1bmluaXRpYWxpc2VkIHZhbHVlcyB0byBzZXRzb2Nrb3B0KCkuIChmaXhlcyAjMTY3NzA0KQorCisyMDA1LTAyLTE2ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJpbi5jOiAoYWRkX3NpbmspOgorCSAgSW52ZXJ0IGJpbl9hZGQvbGluayBvcmRlciB0byB3b3JrYXJvdW5kIGRlYWRsb2NrIGluIG9wdC4KKworMjAwNS0wMi0xNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21vZHBsdWcvZ3N0bW9kcGx1Zy5jYzoKKwkgIEFkZCBtaXNzaW5nIGJyZWFrIGNhdXNpbmcgcG9zaXRpb24gcXVlcmllcyB0byBmYWlsLgorCisyMDA1LTAyLTE1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX3BhZF9wb3B1bGF0ZSk6CisJICBHcmFucG9zIGNhbiBhcHBhcmVudGx5IGJlIC0xLCB3aGljaCBzY3Jld3MgdXAgY2FsY3VsYXRpb25zLi4uCisKKzIwMDUtMDItMTYgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19jaGFpbiksCisJKGdzdF94aW1hZ2VzaW5rX3NlbmRfcGVuZGluZ19uYXZpZ2F0aW9uKSwKKwkoZ3N0X3hpbWFnZXNpbmtfbmF2aWdhdGlvbl9zZW5kX2V2ZW50KSwgKGdzdF94aW1hZ2VzaW5rX2ZpbmFsaXplKSwKKwkoZ3N0X3hpbWFnZXNpbmtfaW5pdCk6CisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuaDoKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfY2hhaW4pLAorCShnc3RfeHZpbWFnZXNpbmtfc2VuZF9wZW5kaW5nX25hdmlnYXRpb24pLAorCShnc3RfeHZpbWFnZXNpbmtfbmF2aWdhdGlvbl9zZW5kX2V2ZW50KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2ZpbmFsaXplKSwgKGdzdF94dmltYWdlc2lua19pbml0KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmg6CisJICBVc2UgYSBtdXRleCBwcm90ZWN0ZWQgbGlzdCB0byBtYXJzaGFsIG5hdmlnYXRpb24KKwkgIGV2ZW50cyBpbnRvIHRoZSBzdHJlYW0gdGhyZWFkIGZyb20gd2hpY2hldmVyIHRocmVhZAorCSAgc2VuZHMgdGhlbS4KKworMjAwNS0wMi0xNSAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBnc3Qvc3BlZWQvZGVtby1tcDMuYzogKHRpbWVfdGlja19jYiksIChtYWluKToKKwkgIERpc3BsYXkgY3VycmVudCBwb3NpdGlvbiBhbmQgdHJhY2sgbGVuZ3RoOyBtaXNjLiBjbGVhbi11cHMuCisJICAKKwkqIGdzdC9zcGVlZC9nc3RzcGVlZC5jOiAoc3BlZWRfZ2V0X3F1ZXJ5X3R5cGVzKSwgKHNwZWVkX3NyY19xdWVyeSksCisJKHNwZWVkX2luaXQpLCAoc3BlZWRfY2hhaW4pOgorCSAgQWRkIHF1ZXJ5IGZ1bmN0aW9uLCBzbyB0aGF0IHRoZSBzdHJlYW0gbGVuZ3RoIGFuZCBjdXJyZW50IHBvc2l0aW9uCisJICBnZXQgYWRqdXN0ZWQgd2hlbiBxdWVyaWVkIChub3RlIHRoYXQgY3VycmVudCBwb3NpdGlvbiBxdWVyaWVzIG1heQorCSAgc3RpbGwgYmUgd3JvbmcgaWYgdGhlIGF1ZGlvIHNpbmsgcmV0dXJucyB2YWx1ZXMgYmFzZWQgb24gYnVmZmVyCisJICB0aW1lc3RhbXBzIGluc3RlYWQgb2YgcGFzc2luZyBvbiB0aGUgcXVlcnkpLgorCisyMDA1LTAyLTEzICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChnc3RfYXVkaW9fY29udmVydF9saW5rKSwKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfY2hhbm5lbHMpOgorCSAgY3JlYXRlIGNoYW5uZWwgY29udmVyc2lvbiBtYXRyaXggd2hlbiBsaW5raW5nCisJKiBnc3QvYXVkaW9jb252ZXJ0Ly5jdnNpZ25vcmU6CisJKiBnc3QvYXVkaW9jb252ZXJ0L01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvY29udmVydC9jaGFubmVsbWl4dGVzdC5jOiAobWFpbik6CisJICBhZGQgKHVnbHkpIHRlc3QgdGhhdCBlbnN1cmVzIHN0ZXJlbyA8PT4gbW9ubyBjb252ZXJzaW9uIHdvcmtzCisJICBjb3JyZWN0bHkKKworMjAwNS0wMi0xMyAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGNoYW5uZWxtaXguaDoKKwkgIGluY2x1ZGUgbWlzc2luZyBoZWFkZXIgZmlsZQorCSogZ3N0L2F1ZGlvY29udmVydC9nc3RjaGFubmVsbWl4LmM6CisJKGdzdF9hdWRpb19jb252ZXJ0X2ZpbGxfY29tcGF0aWJsZSk6CisJICB1c2Ugc2FtZSBzaWduIGZvciBib3RoIGNoYW5uZWxzIHdoZW4gY29udmVydGluZyB0by9mcm9tIGNvbXBhdGlibGUKKwkgIGNoYW5uZWwuIFByZXZpb3VzbHkgdXNlZCBkaWZmZXJlbnQgc2lnbnMgbWFkZSB0aGUgc2lnbmFscyBjYW5jZWwKKwkgIGVhY2ggb3RoZXIgb3V0IGFuZCBhcHBlYXIgbGlrZSBzaWxlbmNlLiAoZml4ZXMgIzE2NzI2OSkKKworMjAwNS0wMi0xMiAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9hdmNvZGVjLmg6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2RlY21hcC5jOgorCShnc3RfZmZtcGVnX3BpeGZtdF90b19jYXBzKSwgKGdzdF9mZm1wZWdfY2Fwc190b19waXhmbXQpLAorCShnc3RfZmZtcGVnY3NwX2F2cGljdHVyZV9maWxsKToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2ltZ2NvbnZlcnQuYzoKKwkgIENvbnZlcnQgdG8gYW5kIGZyb20gWVYxMiAoZml4ZXMgIzE1NjM3OSkuCisKKzIwMDUtMDItMTIgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua194d2luZG93X25ldyksCisJKGdzdF94aW1hZ2VzaW5rX3NpbmtfbGluayksIChnc3RfeGltYWdlc2lua19jaGFuZ2Vfc3RhdGUpLAorCShnc3RfeGltYWdlc2lua19jaGFpbiksIChnc3RfeGltYWdlc2lua19zZXRfeHdpbmRvd19pZCksCisJKGdzdF94aW1hZ2VzaW5rX2V4cG9zZSksIChnc3RfeGltYWdlc2lua19zZXRfcHJvcGVydHkpLAorCShnc3RfeGltYWdlc2lua19maW5hbGl6ZSksIChnc3RfeGltYWdlc2lua19pbml0KTogUHJvdGVjdCBpbnRlcmZhY2UKKyAgICAgICAgbWV0aG9kcyBmcm9tIGNoYWluIGFuZCBuZWdvdGlhdGlvbiBhbmQgdmljZSB2ZXJzYSAoRml4ZXMgIzE2NjE0MikuCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuaDogQWRkIHN0cmVhbV9sb2NrLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19zaW5rX2xpbmspLAorCShnc3RfeHZpbWFnZXNpbmtfY2hhaW4pLCAoZ3N0X3h2aW1hZ2VzaW5rX2J1ZmZlcl9mcmVlKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2J1ZmZlcl9hbGxvYyksIChnc3RfeHZpbWFnZXNpbmtfc2V0X3h3aW5kb3dfaWQpLAorCShnc3RfeHZpbWFnZXNpbmtfZXhwb3NlKTogQ2hlY2sgZm9yIHhjb250ZXh0IGJlZm9yZSB0cnlpbmcgdG8gbGluay4KKworMjAwNS0wMi0xMiAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBleHQvZHZkbmF2L2R2ZG5hdnNyYy5jOiAoZHZkbmF2c3JjX29wZW4pOgorCSAgRG9uJ3Qgc2VuZCAiSGV5ISBZb3UgZ2F2ZSBtZSBhIE5VTEwgcG9pbnRlciB5b3UgbmF1Z2h0eSBwZXJzb24iIGFzCisJICBlcnJvciBtZXNzYWdlIHdoZW4gd2UgY2FuJ3Qgb3BlbiB0aGUgRFZEIGRldmljZSAod2hlbiBkdmRuYXZfb3BlbigpCisJICBmYWlscywgc3JjLT5kdmRuYXYgaXMgTlVMTCwgc28gZHZkbmF2X2Vycl90b19zdHJpbmcoKSB3aWxsIHJldHVybgorCSAgdGhlIGFib3ZlKS4gU2VuZCBzb21ldGhpbmcgbW9yZSB1c2VmdWwgaW5zdGVhZCAoZml4ZXMgIzE2NzExNykuCisKKzIwMDUtMDItMTEgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua194dmltYWdlX3B1dCksCisJKGdzdF94dmltYWdlc2lua19zaW5rX2xpbmspLCAoZ3N0X3h2aW1hZ2VzaW5rX2NoYW5nZV9zdGF0ZSksCisJKGdzdF94dmltYWdlc2lua19jaGFpbiksIChnc3RfeHZpbWFnZXNpbmtfYnVmZmVyX2ZyZWUpLAorCShnc3RfeHZpbWFnZXNpbmtfYnVmZmVyX2FsbG9jKSwgKGdzdF94dmltYWdlc2lua19zZXRfeHdpbmRvd19pZCksCisJKGdzdF94dmltYWdlc2lua19leHBvc2UpLCAoZ3N0X3h2aW1hZ2VzaW5rX3NldF9wcm9wZXJ0eSksCisJKGdzdF94dmltYWdlc2lua19maW5hbGl6ZSksIChnc3RfeHZpbWFnZXNpbmtfaW5pdCk6IFByb3RlY3QgaW50ZXJmYWNlCisJbWV0aG9kcyBmcm9tIGNoYWluIGFuZCBuZWdvdGlhdGlvbiBhbmQgdmljZSB2ZXJzYSAoRml4ZXMgIzE2NjE0MikuCisJRml4IGEgcG9zc2libGUgYnVnIG9mIGltYWdlcyBpbiB0aGUgYnVmZmVyIHBvb2wgYmVpbmcgZGlzY2FyZGVkIGJlY2F1c2UKKwl3ZSBhcmUgbG9va2luZyBhdCB0aGUgd3JvbmcgZ2VvbWV0cnkuCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5oOiBBZGQgc3RyZWFtX2xvY2suCisKKzIwMDUtMDItMTEgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmM6IChjcm9wX2J1ZmZlcik6IENoYW5nZSB1aW50IHRvCisJdW5zaWduZWQgaW50LiAoZml4ZXMgIzE2NzEyOCkKKworMjAwNS0wMi0xMSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvbGlicmZiL01ha2VmaWxlLmFtOiBUZXN0aW5nIHN0dWZmIGJlZm9yZSBjb21taXR0aW5nIGlzCisJICBmb3Igd2ltcHMuLi4gYW5kIHBlb3BsZSB3aXRoIGZhc3QgbWFjaGluZXMuICBGaXggc3R1cGlkCisJICBtaXN0YWtlLgorCisyMDA1LTAyLTExICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogUHVsbCBpbiBsaWJyZmIgZnJvbSBteSBDVlMgdHJlZSwgYmVjYXVzZSBpdCBpcworCSAgdG9vIHNtYWxsIGFuZCBhbm5veWluZyB0byBiZSBzZXBhcmF0ZS4gIE1vdmUgcmZic3JjIHBsdWdpbgorCSAgdG8gZ3N0Ly4KKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkqIGV4dC9saWJyZmIvTWFrZWZpbGUuYW06CisJKiBleHQvbGlicmZiL2dzdHJmYnNyYy5jOgorCSogZ3N0L2xpYnJmYi9NYWtlZmlsZS5hbToKKwkqIGdzdC9saWJyZmIvZ3N0cmZic3JjLmM6CisJKiBnc3QvbGlicmZiL3JmYi5jOgorCSogZ3N0L2xpYnJmYi9yZmIuaDoKKwkqIGdzdC9saWJyZmIvcmZiYnVmZmVyLmM6CisJKiBnc3QvbGlicmZiL3JmYmJ1ZmZlci5oOgorCSogZ3N0L2xpYnJmYi9yZmJieXRlc3RyZWFtLmM6CisJKiBnc3QvbGlicmZiL3JmYmJ5dGVzdHJlYW0uaDoKKwkqIGdzdC9saWJyZmIvcmZiY29udGV4dC5oOgorCSogZ3N0L2xpYnJmYi9yZmJkZWNvZGVyLmM6CisJKiBnc3QvbGlicmZiL3JmYmRlY29kZXIuaDoKKwkqIGdzdC9saWJyZmIvcmZidXRpbC5oOgorCisyMDA1LTAyLTEwICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGdzdC9zcGVlZC9NYWtlZmlsZS5hbToKKwkqIGdzdC9zcGVlZC9kZW1vLW1wMy5jOiAobWFpbik6CisJKiBnc3Qvc3BlZWQvZmlsdGVyLmZ1bmM6CisJKiBnc3Qvc3BlZWQvZ3N0c3BlZWQuYzogKHNwZWVkX2xpbmspLCAoc3BlZWRfcGFyc2VfY2FwcyksCisJKHNwZWVkX2NsYXNzX2luaXQpLCAoc3BlZWRfaW5pdCksIChzcGVlZF9jaGFpbl9pbnQxNiksCisJKHNwZWVkX2NoYWluX2Zsb2F0MzIpLCAoc3BlZWRfY2hhaW4pLCAoc3BlZWRfc2V0X3Byb3BlcnR5KSwKKwkoc3BlZWRfZ2V0X3Byb3BlcnR5KSwgKHNwZWVkX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3Qvc3BlZWQvZ3N0c3BlZWQuaDoKKwkgIEZpeCBzcGVlZCBlbGVtZW50IGFuZCBtYWtlIGl0IGNoYWluLWJhc2VkIChmaXhlcyAjMTU2NDY3KSwKKwkgIGFuZCBtYWtlIGl0IGhhbmRsZSBtb3JlIHRoYW4gb25lIGNoYW5uZWwuCisKKzIwMDUtMDItMTAgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZXh0L2R0cy9nc3RkdHNkZWMuYzogKGdzdF9kdHNkZWNfaW5pdCksIChnc3RfZHRzZGVjX2NoYW5uZWxzKSwKKwkoZ3N0X2R0c2RlY19oYW5kbGVfZXZlbnQpLCAoZ3N0X2R0c2RlY19oYW5kbGVfZnJhbWUpLAorCShnc3RfZHRzZGVjX2NoYWluKSwgKGdzdF9kdHNkZWNfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9kdHMvZ3N0ZHRzZGVjLmg6CisgICAgICAgICAgRG9uJ3QgY2xvYmJlciB0aGUgc3RhY2sgY29uc3RydWN0aW5nIHRoZSBjaGFubmVscyBhcnJheS4KKwkgIE1ha2UgdGhlIGVsZW1lbnQgY2hhaW4tYmFzZWQuIERUUyB0cmFja3MgY2FuIG5vdyBiZSBwbGF5ZWQuCisJICAKKzIwMDUtMDItMDkgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL211bHRpY2hhbm5lbC5oOgorCSogZ3N0LWxpYnMvZ3N0L2djb25mL2djb25mLmg6CisJKiBnc3QtbGlicy9nc3QvaWRjdC9pZGN0Lmg6CisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLXByaXYuaDoKKwkqIGdzdC1saWJzL2dzdC9wbGF5L3BsYXkuaDoKKwkqIGdzdC1saWJzL2dzdC9yZXNhbXBsZS9wcml2YXRlLmg6CisJKiBnc3QtbGlicy9nc3QvcmVzYW1wbGUvcmVzYW1wbGUuaDoKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtaWRzLmg6CisJKiBnc3QtbGlicy9nc3QvdmlkZW8vdmlkZW8uaDoKKwkqIGdzdC1saWJzL2dzdC92aWRlby92aWRlb3NpbmsuaDoKKwkgIEFkZCBHX0JFR0lOX0RFQ0xTIGFuZCBHX0VORF9ERUNMUyBhcm91bmQgaGVhZGVycyB3aGVyZQorCSAgbWlzc2luZywgc28gdGhhdCB0aGV5IHdvcmsgd2hlbiBpbmNsdWRlZCBmcm9tIEMrKyBjb2RlLgorCisyMDA1LTAyLTA5ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIHRlc3RzdWl0ZS9nc3QtbGludDogQ2hlY2sgZm9yIG5vbi1zdGF0aWNhbGx5IHNjb3BlZAorCSAgcGFyZW50X2NsYXNzIHZhcmlhYmxlcy4gIFRoaXMgd29uJ3QgYmUgYSBwcm9ibGVtIG9uY2UKKwkgIHBsdWdpbnMgYXJlIGxvYWRlZCB3aXRoIFJUTERfTE9DQUwuCisKKzIwMDUtMDItMDkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9tcGxleC9nc3RtcGxleGliaXRzdHJlYW0uY2M6CisJICBnY2MgbWFkbmVzcy4KKworMjAwNS0wMi0wOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ21wYXJzZS5jOgorCSogZ3N0L2RlYnVnL2dzdG5hdmlnYXRpb250ZXN0LmM6CisJICBEaWUsIHRob3UgZmF1bHR5IHN5bWJvbCBwb2xsdXRvcnMgKG5vbi1zdGF0aWMgcGFyZW50X2NsYXNzKS4KKworMjAwNS0wMi0wOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L21wbGV4L2dzdG1wbGV4aWJpdHN0cmVhbS5jYzoKKwkgIEZpeCBldmVudCBoYW5kbGluZyAoIzE2NTUyNSkuCisKKzIwMDUtMDItMDggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6CisJKiBnc3QvbW9kcGx1Zy9nc3Rtb2RwbHVnLmNjOgorCSAgQWRkIG1pc3NpbmcgZW5kaWFubmVzcyB0byB0ZW1wbGF0ZSAoZml4ZXMgIzE2NTUwOSkuCisKKzIwMDUtMDItMDggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoZ3N0X2FzZl9kZW11eF9oYW5kbGVfZGF0YSk6CisJICBGaXggd3Jvbmcgb3JkZXIgb2YgcmVhZGluZyBvZiBvcHRpb25hbCBieXRlcyAoIzE2NTI5MCkuCisKKzIwMDUtMDItMDggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2NoZWNrX2V2ZW50KToKKwkgIEltcGxlbWVudCBGSUxMRVIgZXZlbnQgYXdhcmVuZXNzLgorCisyMDA1LTAyLTA4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvY2RwYXJhbm9pYS9nc3RjZHBhcmFub2lhLmM6IChjZHBhcmFub2lhX2NvbnZlcnQpOgorCSAgRml4IHRyYWNrIGNhbGN1bGF0aW9ucyAoIzE2NjIwOCkuCisKKzIwMDUtMDItMDggIEdlcmdlbHkgTmFneSAgPGFsZ2Vybm9uQGJvbmVodW50ZXIucnVsZXoub3JnPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOiAoZ3N0X3BuZ2RlY19pbml0KSwgKGdzdF9wbmdkZWNfY2hhaW4pOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzoKKwkgIEZpeCBieXRlLW9yZGVyLCB1c2UgcHJvcGVyIGZpeGVkIGNhcHMuIEZpeGVzICMxNjQxOTcuCisKKzIwMDUtMDItMDggIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSAgQWRkIGR2ZGxwY21kZWMgCisKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOiAoZ3N0X21wZWcyZGVjX3Jlc2V0KSwKKwkoZnJlZV9hbGxfYnVmZmVycyksIChnc3RfbXBlZzJkZWNfYWxsb2NfYnVmZmVyKToKKwkgIERvbid0IHB1c2ggYnVmZmVycyBpZiB0aGUgc3JjIHBhZCBpc24ndCBuZWdvdGlhdGVkIHlldC4KKwkgIAorCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzoKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfYnVmZmVyX3RvX2RlZmF1bHRfZm9ybWF0KSwKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfYnVmZmVyX2Zyb21fZGVmYXVsdF9mb3JtYXQpOgorCSAgQWRkIHN1cHBvcnQgZm9yIDI0LWJpdCB3aWR0aC4KKworCSogZ3N0L2R2ZGxwY21kZWMvLmN2c2lnbm9yZToKKwkqIGdzdC9kdmRscGNtZGVjL01ha2VmaWxlLmFtOgorCSogZ3N0L2R2ZGxwY21kZWMvZ3N0ZHZkbHBjbWRlYy5jOiAoZ3N0X2R2ZGxwY21kZWNfZ2V0X3R5cGUpLAorCShnc3RfZHZkbHBjbWRlY19iYXNlX2luaXQpLCAoZ3N0X2R2ZGxwY21kZWNfY2xhc3NfaW5pdCksCisJKGdzdF9kdmRscGNtX3Jlc2V0KSwgKGdzdF9kdmRscGNtZGVjX2luaXQpLCAoZ3N0X2R2ZGxwY21kZWNfbGluayksCisJKGdzdF9kdmRscGNtZGVjX2NoYWluKSwgKGdzdF9kdmRscGNtZGVjX2NoYW5nZV9zdGF0ZSksCisJKHBsdWdpbl9pbml0KToKKwkqIGdzdC9kdmRscGNtZGVjL2dzdGR2ZGxwY21kZWMuaDoKKwkgIE5ldyBkZWNvZGVyIGZvciByZWFycmFuZ2luZyBEVkQgTFBDTSBpbnRvIG91ciBhdWRpby94LXJhdy1pbnQKKwkgIGZvcm1hdC4gTmVlZHMgc3VwcG9ydCBmb3IgdGhlIGNoYW5uZWxzIG1hcHMgaWYgc29tZW9uZSBjYW4gZmluZCAKKwkgIGEgRFZEIExQQ00gdHJhY2sgd2l0aCA+IDIgY2hhbm5lbHMuCisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdGR2ZGRlbXV4LmM6IChnc3RfZHZkX2RlbXV4X2hhbmRsZV9kdmRfZXZlbnQpLAorCShnc3RfZHZkX2RlbXV4X3NlbmRfZGlzY29udCksIChnc3RfZHZkX2RlbXV4X2hhbmRsZV9kaXNjb250KSwKKwkoZ3N0X2R2ZF9kZW11eF9nZXRfYXVkaW9fc3RyZWFtKSwgKGdzdF9kdmRfZGVtdXhfcHJvY2Vzc19wcml2YXRlKToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdGR2ZGRlbXV4Lmg6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguYzogKGdzdF9tcGVnX2RlbXV4X3NlbmRfZGlzY29udCksCisJKGdzdF9tcGVnX2RlbXV4X25ld19vdXRwdXRfcGFkKSwgKGdzdF9tcGVnX2RlbXV4X2luaXRfc3RyZWFtKSwKKwkoZ3N0X21wZWdfZGVtdXhfc2VuZF9zdWJidWZmZXIpLCAoZ3N0X21wZWdfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSk6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguaDoKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYXJzZS5jOiAoZ3N0X21wZWdfcGFyc2VfcmVzZXQpLAorCShnc3RfbXBlZ19wYXJzZV9wYXJzZV9wYWNraGVhZCksIChnc3RfbXBlZ19wYXJzZV9sb29wKSwKKwkoZ3N0X21wZWdfcGFyc2VfZ2V0X3JhdGUpLCAoZ3N0X21wZWdfcGFyc2VfY29udmVydF9zcmMpLAorCShnc3RfbXBlZ19wYXJzZV9oYW5kbGVfc3JjX3F1ZXJ5KSwKKwkoZ3N0X21wZWdfcGFyc2VfaGFuZGxlX3NyY19ldmVudCk6CisJICBVc2UgYXVkaW8veC1kdmQtbHBjbSBmb3IgTFBDTSBvdXRwdXQuCisJICBBZGQgRFRTIG91dHB1dC4KKworMjAwNS0wMi0wOCAgR2VyZ2VseSBOYWd5ICA8YWxnZXJub25AYm9uZWh1bnRlci5ydWxlei5vcmc+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmM6IChnc3RfYWxwaGFfY29sb3Jfc2lua19saW5rKSwKKwkodHJhbnNmb3JtX3JnYiksICh0cmFuc2Zvcm1fYmdyKSwgKGdzdF9hbHBoYV9jb2xvcl9jaGFpbik6CisJICBBZGQgQkdSQSBoYW5kbGluZyAoIzE2NTczNikuCisKKzIwMDUtMDItMDggIEZyYW5jaXMgTGFib250ZSAgPGZyYW5jaXNfbGFib250ZUBob3RtYWlsLmNvbT4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2xhdy9hbGF3LWRlY29kZS5jOiAoYWxhd2RlY19saW5rKToKKwkqIGdzdC9sYXcvYWxhdy1lbmNvZGUuYzogKGFsYXdlbmNfbGluayk6CisJKiBnc3QvbGF3L211bGF3LWRlY29kZS5jOiAobXVsYXdkZWNfbGluayk6CisJKiBnc3QvbGF3L211bGF3LWVuY29kZS5jOiAobXVsYXdlbmNfbGluayk6CisJICBGaXggY2FwcyBtZW1sZWFrcyAoIzE2NjYwMCkuCisKKzIwMDUtMDItMDggIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZXh0L3Rhcmtpbi9tZW0uaDoKKwkqIGV4dC90YXJraW4vd2F2ZWxldC5oOgorCSogZXh0L3Rhcmtpbi95dXYuaDoKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2F2Y29kZWMuaDoKKwkgIEluY2x1ZGUgIl9zdGRpbnQuaCIgaW5zdGVhZCBvZiA8c3RkaW50Lmg+LiBGaXhlcyBidWlsZCBvbgorCSAgc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgc3RkaW50LmgsIGxpa2UgU29sYXJpczkgKGZpeGVzICMxNjY2MzEpLgorCisyMDA1LTAyLTA1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2NoYW5nZV9zdGF0ZSk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3h3aW5kb3dfY2xlYXIpLAorCShnc3RfeHZpbWFnZXNpbmtfY2hhbmdlX3N0YXRlKToKKwkgIENsZWFyIHdpbmRvdyBvbiBQQVVTRUQtPlJFQURZIGluc3RlYWQgb2YgUkVBRFktPlBBVVNFRC4gU3RvcAorCSAgWHYgdmlkZW8gKGFuZCB0aGVyZWJ5IHJlZ2VuZXJhdGUgWHYgY29sb3Vya2V5KSBpbiBjbGVhcigpIHNvCisJICB0aGF0IFBMQVkgLT4gUkVBRFkgLT4gUExBWSB3b3JrcyAoZml4ZXMgIzE2MjUwNCkuCisKKzIwMDUtMDItMDUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzcmMuYzogKGdzdF92NGxtanBlZ3NyY19nZXRjYXBzKToKKwkgIFN3aXRjaCB0byBsaXN0IGluc3RlYWQgb2YgcmFuZ2UsIHNpbmNlIE1KUEVHLWRldmljZXMgcmVhbGx5IGp1c3QKKwkgIHN1cHBvcnQgZGVjaW1hdGlvbnMsIG5vdCBhbnkgc2l6ZS4KKworMjAwNS0wMi0wNSAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmM6IChnc3RfbXBlZzJkZWNfb3Blbl9kZWNvZGVyKSwKKwkoZ3N0X21wZWcyZGVjX3Jlc2V0KSwgKGZyZWVfYWxsX2J1ZmZlcnMpLAorCShnc3RfbXBlZzJkZWNfYWxsb2NfYnVmZmVyKSwgKGhhbmRsZV9zZXF1ZW5jZSk6CisJKiBleHQvbXBlZzJkZWMvZ3N0bXBlZzJkZWMuaDoKKwkgIFRoZSBsaWJtcGVnMiB1c2VyLWFsbG9jYXRlZCBidWZmZXIgbWFuYWdlbWVudCBpcyBhd2t3YXJkLCAKKwkgIHRvIHNheSB0aGUgbGVhc3QuIEhvcGVmdWxseSB0aGlzIGZpeGVzIHRoaW5ncy4KKworMjAwNS0wMi0wNCAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogZ3N0L2F1ZGlvY29udmVydC9idWZmZXJmcmFtZXNjb252ZXJ0LmMKKwkoYnVmZmVyX2ZyYW1lc19jb252ZXJ0X2ZpeGF0ZSk6IE5ldyBmdW5jdGlvbiwgZml4YXRlcyB0byAyNTYKKwlmcmFtZXMgcGVyIGJ1ZmZlciBieSBkZWZhdWx0LiAoTXVjaCBiZXR0ZXIgdGhhbiAxLikKKwkoYnVmZmVyX2ZyYW1lc19jb252ZXJ0X2luaXQpOiBTZXQgdGhlIGZpeGF0ZSBmdW5jdGlvbiBmb3IgYm90aCBzcmMKKwlhbmQgc2luayBwYWQuCisJKGJ1ZmZlcl9mcmFtZXNfY29udmVydF9saW5rKTogQWZ0ZXIgc3VjY2VzcyBzZXR0aW5nIG5vbmZpeGVkIGNhcHMsCisJZ2V0IHRoZSBuZWdvdGlhdGVkIGNhcHMgc28gd2UgY2FuIGtub3cgaG93IG1hbnkgYnVmZmVyLWZyYW1lcyBpdAorCXdpbGwgYmUuIE5vIGlkZWEgaG93IHRoaXMgd29ya2VkIGF0IGFsbCBiZWZvcmUuCisKKzIwMDUtMDItMDUgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmM6IChnc3RfbXBlZzJkZWNfaW5pdCksCisJKGdzdF9tcGVnMmRlY19jbG9zZV9kZWNvZGVyKSwgKHB1dF9idWZmZXIpLCAoY2hlY2tfYnVmZmVyKSwKKwkoZnJlZV9idWZmZXIpLCAoZnJlZV9hbGxfYnVmZmVycyksIChnc3RfbXBlZzJkZWNfYWxsb2NfYnVmZmVyKSwKKwkoaGFuZGxlX3NlcXVlbmNlKSwgKGhhbmRsZV9waWN0dXJlKToKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5oOgorCSAgUmVhcnJhbmdlIGJ1ZmZlciB0cmFja2luZyBhbmQgcmVmY291bnRpbmcgYW5kIHJlZmFjdG9yCisJICBhIGxpdHRsZSBmb3IgcmVhZGFiaWxpdHkuIAorCisyMDA1LTAyLTA0ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisJKiBzeXMvdjRsL2dzdHY0bC5jOiAocGx1Z2luX2luaXQpOgorCSogc3lzL3Y0bC9nc3R2NGxqcGVnc3JjLmM6IChnc3RfdjRsanBlZ3NyY19nZXRfdHlwZSksCisJKGdzdF92NGxqcGVnc3JjX2Jhc2VfaW5pdCksIChnc3RfdjRsanBlZ3NyY19jbGFzc19pbml0KSwKKwkoZ3N0X3Y0bGpwZWdzcmNfaW5pdCksIChnc3RfdjRsanBlZ3NyY19zcmNfbGluayksCisJKGdzdF92NGxqcGVnc3JjX2dldGNhcHMpLCAoZ3N0X3Y0bGpwZWdzcmNfZ2V0KToKKwkqIHN5cy92NGwvZ3N0djRsanBlZ3NyYy5oOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzogKGdzdF92NGxzcmNfb3BlbiksIChnc3RfdjRsc3JjX3NyY19saW5rKToKKwkqIHN5cy92NGwvdjRsX2NhbGxzLmg6CisJKiBzeXMvdjRsL3Y0bHNyY19jYWxscy5jOiAoZ3N0X3Y0bHNyY19wYWxldHRlX25hbWUpLAorCShnc3RfdjRsc3JjX2dldF9mcHMpOgorCSogc3lzL3Y0bC92NGxzcmNfY2FsbHMuaDoKKwkgIEFkZCBuZXcgdjRsanBlZ3NyYyBmb3IgaGFuZGxpbmcgdGhlIG92NTF4IGhhY2t5ICJJJ2xsIGdpdmUKKwkgIHlvdSBqcGVnIGluc2lkZSByZ2IgZnJhbWVzIiBkcml2ZXIuCisJICBEb24ndCBlcnJvciBpbiB0aGUgdjRsc3JjIGxpbmsgZnVuY3Rpb24sIGp1c3QgcmV0dXJuIAorCSAgUkVGVVNFRC4KKworMjAwNS0wMi0wMyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL3FjYW0vZ3N0cWNhbXNyYy5jOiAoZ3N0X3FjYW1zcmNfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3FjYW1zcmNfb3Blbik6CisJICBVc2UgR1NUX0VMRU1FTlRfRVJST1IsIG5vdCBnX3dhcm5pbmcsIGlmIG9wZW4gZmFpbGVkLgorCisyMDA1LTAyLTAyICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3ZpZGVvX2NhcHMpOgorCSAgQ2hhbmdlIGNhcHMgb24gTUpQRUctQiBzbyBpdCBkb2Vzbid0IGludGVyZmVyZSB3aXRoIE1KUEVHL0pQRUcuCisKKzIwMDUtMDItMDIgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOiAoZ3N0X2R2MTM5NHNyY19jaGFuZ2Vfc3RhdGUpOgorCSAgUmVzZXQgbmVnb3RpYXRlZCBzdGF0ZSBvbiBQQVVTRUQtPlJFQURZLgorCisyMDA1LTAyLTAyICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogUHV0IERFRkFVTFRfQVVESU9TSU5LIGluIGNvbmZpZy5oIGFuZCB1c2UKKwl3aGVyZWV2ZXIgcG9zc2libGUuICAoRml4ZXMgIzE2NTk5NykKKwkqIGV4YW1wbGVzL2NhcHNmaWx0ZXIvY2Fwc2ZpbHRlcjEuYzogKG1haW4pOgorCSogZXhhbXBsZXMvZHlucGFyYW1zL2ZpbHRlci5jOiAoY3JlYXRlX3VpKToKKwkqIGV4YW1wbGVzL3NlZWtpbmcvY2RwYXJhbm9pYS5jOiAoZ2V0X3RyYWNrX2luZm8pLCAobWFpbik6CisJKiBleGFtcGxlcy9zZWVraW5nL2NoYWluZWQuYzogKG1haW4pOgorCSogZXhhbXBsZXMvc2Vla2luZy9zZWVrLmM6IChtYWtlX21vZF9waXBlbGluZSksIChtYWtlX2R2X3BpcGVsaW5lKSwKKwkobWFrZV93YXZfcGlwZWxpbmUpLCAobWFrZV9mbGFjX3BpcGVsaW5lKSwgKG1ha2Vfc2lkX3BpcGVsaW5lKSwKKwkobWFrZV92b3JiaXNfcGlwZWxpbmUpLCAobWFrZV9tcDNfcGlwZWxpbmUpLCAobWFrZV9hdmlfcGlwZWxpbmUpLAorCShtYWtlX21wZWdfcGlwZWxpbmUpLCAobWFrZV9tcGVnbnRfcGlwZWxpbmUpOgorCSogZXhhbXBsZXMvc2Vla2luZy9zcGlkZXJfc2Vlay5jOiAobWFrZV9zcGlkZXJfcGlwZWxpbmUpOgorCSogZXhhbXBsZXMvc3dpdGNoL3N3aXRjaGVyLmM6IChtYWluKToKKwkqIGV4dC9kdi9kZW1vLXBsYXkuYzogKG1haW4pOgorCSogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2NoYWluKToKKwkqIGV4dC9zbW9vdGh3YXZlL2RlbW8tb3Nzc3JjLmM6IChtYWluKToKKwkqIGdzdC1saWJzL2dzdC9nY29uZi9nY29uZi5jOiAoZ3N0X2djb25mX3NldF9zdHJpbmcpLAorCShnc3RfZ2NvbmZfcmVuZGVyX2Jpbl9mcm9tX2Rlc2NyaXB0aW9uKSwKKwkoZ3N0X2djb25mX2dldF9kZWZhdWx0X2F1ZGlvX3NpbmspLAorCShnc3RfZ2NvbmZfZ2V0X2RlZmF1bHRfdmlkZW9fc2luayksCisJKGdzdF9nY29uZl9nZXRfZGVmYXVsdF9hdWRpb19zcmMpLAorCShnc3RfZ2NvbmZfZ2V0X2RlZmF1bHRfdmlkZW9fc3JjKSwKKwkoZ3N0X2djb25mX2dldF9kZWZhdWx0X3Zpc3VhbGl6YXRpb25fZWxlbWVudCk6CisJKiBnc3QvbGV2ZWwvZGVtby5jOiAobWFpbik6CisJKiBnc3QvbGV2ZWwvcGxvdC5jOiAobWFpbik6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJpbi5jOiAoZ2VuX3ZpZGVvX2VsZW1lbnQpLAorCShnZW5fYXVkaW9fZWxlbWVudCk6CisJKiBnc3QvcGxheWJhY2svdGVzdC5jOiAoZ2VuX3ZpZGVvX2VsZW1lbnQpLCAoZ2VuX2F1ZGlvX2VsZW1lbnQpOgorCSogZ3N0L3BsYXlvbmRlbWFuZC9kZW1vLW1wMy5jOiAoc2V0dXBfcGlwZWxpbmUpOgorCSogZ3N0L3NpbmUvZGVtby1kcGFyYW1zLmM6IChtYWluKToKKwkqIGdzdC9zcGVjdHJ1bS9kZW1vLW9zc3NyYy5jOiAobWFpbik6CisJKiBnc3Qvc3BlZWQvZGVtby1tcDMuYzogKG1haW4pOgorCSogZ3N0L3ZvbHVtZS9kZW1vLmM6IChtYWluKToKKwkqIHRlc3RzdWl0ZS9lbWJlZC9lbWJlZC5jOiAobWFpbik6CisKKzIwMDUtMDItMDIgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzaW5rLmM6IChnc3RfdGNwY2xpZW50c2lua19jbGFzc19pbml0KSwKKwkoZ3N0X3RjcGNsaWVudHNpbmtfZmluYWxpemUpOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuYzogKGdzdF90Y3BjbGllbnRzcmNfY2xhc3NfaW5pdCksCisJKGdzdF90Y3BjbGllbnRzcmNfZmluYWxpemUpOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzaW5rLmM6IChnc3RfdGNwc2VydmVyc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfaW5pdCksIChnc3RfdGNwc2VydmVyc2lua19maW5hbGl6ZSk6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNyYy5jOiAoZ3N0X3RjcHNlcnZlcnNyY19jbGFzc19pbml0KSwKKwkoZ3N0X3RjcHNlcnZlcnNyY19pbml0KSwgKGdzdF90Y3BzZXJ2ZXJzcmNfZmluYWxpemUpOgorCSAgRG9uJ3QgbGVhayB0aGUgaG9zdG5hbWUgd2hlbiBzaHV0dGluZyBkb3duLgorCSAgSW4gdGNwc2VydmVyc3JjLCB0YWtlIGEgY29weSBvZiB0aGUgZGVmYXVsdCBob3N0bmFtZS4KKworMjAwNS0wMi0wMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6IChnc3RfZHYxMzk0c3JjX2lzb19yZWNlaXZlKToKKwkgIFNldCBjYXBzIHRvIHN5c3RlbXN0cmVhbT1UUlVFLgorCisyMDA1LTAyLTAxICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiB0ZXN0c3VpdGUvTWFrZWZpbGUuYW06CisJICBGaXggbW9yZSBPU1ggYnVpbGRib3RzLgorCisyMDA1LTAyLTAyICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOgorCSAgRG9uJ3Qgc2VuZCB0aGluZ3MgdG8gTlVMTCBQQURfUEVFUnMKKworCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6IChnc3RfZGVpbnRlcmxhY2VfY2hhaW4pOgorCSAgQ29weS1vbi13cml0ZSB0aGUgaW5jb21pbmcgYnVmZmVyLgorCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5oOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2Nsb2NrLmg6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguYzogKGdzdF9tcGVnX2RlbXV4X3BhcnNlX3N5c2hlYWQpLAorCShub3JtYWxfc2VlayksIChnc3RfbXBlZ19kZW11eF9oYW5kbGVfc3JjX2V2ZW50KToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdkZW11eC5oOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ3BhY2tldGl6ZS5oOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ3BhcnNlLmM6CisJKGdzdF9tcGVnX3BhcnNlX3VwZGF0ZV9zdHJlYW1pbmZvKSwgKGdzdF9tcGVnX3BhcnNlX3Jlc2V0KSwKKwkoZ3N0X21wZWdfcGFyc2VfaGFuZGxlX2Rpc2NvbnQpLCAoZ3N0X21wZWdfcGFyc2VfcGFyc2VfcGFja2hlYWQpLAorCShnc3RfbXBlZ19wYXJzZV9sb29wKSwgKGdzdF9tcGVnX3BhcnNlX2dldF9yYXRlKSwKKwkoZ3N0X21wZWdfcGFyc2VfY29udmVydF9zcmMpLCAoZ3N0X21wZWdfcGFyc2VfaGFuZGxlX3NyY19xdWVyeSksCisJKGdzdF9tcGVnX3BhcnNlX2hhbmRsZV9zcmNfZXZlbnQpLCAoZ3N0X21wZWdfcGFyc2VfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYXJzZS5oOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0cmZjMjI1MGVuYy5oOgorICAgICAgICAgIFZhcmlvdXMgY2hhbmdlcyB0byB0aGUgd2F5IHRpbWUgaXMgY29tcHV0ZWQgdGhhdCBtYWtlIHNlZWtpbmcgYW5kCisJICB0b3RhbCB0aW1lIGVzdGltYXRpb24gbXVjaCBiZXR0ZXIgaGVyZS4KKwkgIFVzZSBHX0JFR0lOL0VORF9ERUNMUyBpbnN0ZWFkIG9mIF9fY3BsdXNwbHVzCisKKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6IChnc3RfdmlkZW9fY3JvcF9jaGFpbik6CisJICBVc2UgZ3N0X2J1ZmZlcl9zdGFtcCBpbnN0ZWFkIG9mIG9ubHkgY29weWluZyB0aGUgVElNRVNUQU1QCisKKzIwMDUtMDItMDEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9zdWJwYXJzZS9nc3RzdWJwYXJzZS5jOgorCSAgRml4IE9TWCBidWlsZGJvdC4KKworMjAwNS0wMS0zMSAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBleHQvdGhlb3JhL3RoZW9yYWVuYy5jOiAodGhlb3JhX2J1ZmZlcl9mcm9tX3BhY2tldCksCisJKHRoZW9yYV9lbmNfY2hhaW4pLCAodGhlb3JhX2VuY19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L3ZvcmJpcy92b3JiaXNlbmMuYzogKGdzdF92b3JiaXNlbmNfaW5pdCksCisJKGdzdF92b3JiaXNlbmNfYnVmZmVyX2Zyb21fcGFja2V0KSwgKGdzdF92b3JiaXNlbmNfY2hhaW4pLAorCShnc3Rfdm9yYmlzZW5jX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvdm9yYmlzL3ZvcmJpc2VuYy5oOgorCSAgU2V0IGdyYW51bGVwb3MgYW5kIHRpbWVzdGFtcCBjb3JyZWN0bHkgZm9yIHN0cmVhbXMgbm90CisJICBzdGFydGluZyBhdCAwLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBpbml0aWFsIGRlbGF5LgorCisyMDA1LTAxLTMxICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdGR2ZGRlbXV4LmM6CisJICBBZGQgYXVkaW8veC1kdHMgdG8gYXVkaW8gcGFkIHRlbXBsYXRlIGNhcHMKKworMjAwNS0wMS0zMCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvcG9seXAvcG9seXBzaW5rLmM6IChnc3RfcG9seXBzaW5rX2Jhc2VfaW5pdCksCisJKGNyZWF0ZV9jb250ZXh0KSwgKGdzdF9wb2x5cHNpbmtfbGluayk6IEZpeCBzaWxseSBlbmRpYW5uZXNzCisJYnVnLiAgQWRkIHNvbWUgZGVidWdnaW5nLiAgUmVtb3ZlIGZsb2F0IGZyb20gY2FwczsgaXQgZG9lc24ndAorCXdvcmsuICBBdHRlbXB0IHRvIGdldCByZW1vdGUgYXVkaW8gd29ya2luZy4KKworMjAwNS0wMS0yOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF92aWRlb19jYXBzKToKKwkgIEFkZCAzSVYyIGZvdXJjYy4KKworMjAwNS0wMS0yOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9hZGRfc3RyZWFtKSwgKHN3YXBfbGluZSksCisJKGdzdF9hdmlfZGVtdXhfaW52ZXJ0KSwgKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KSwKKwkoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSk6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBJbnZlcnQgRElCIGltYWdlcy4gRml4ZXMgIzEzMjM0MS4KKworMjAwNS0wMS0yOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29sb3JzcGFjZS5jOgorCShnc3RfZmZtcGVnY3NwX2NoYWluKToKKwkgIEQnb2gsIHJlZmVyZW5jZSB0aGUgcGFsZXR0ZSBkYXRhLCBub3QgdGhlIHBhbGV0dGUgc3RydWN0dXJlLgorCSAgRml4ZXMgY29sb3IgZGlzdG9ydGlvbiBpbiAjMTMyMzQxLgorCisyMDA1LTAxLTI5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvdmlkZW9zY2FsZS9nc3R2aWRlb3NjYWxlLmM6IChnc3RfdmlkZW9zY2FsZV9saW5rKToKKwkgIFBBUiBjYW4gYmUgbm9uLWZpeGVkIHdoZW4gbm90IHByb3ZpZGVkIGFzIGFyZ3VtZW50ICgjMTYyNjI2KS4KKworMjAwNS0wMS0yOSAgRGF2aWQgTW9vcmUgIDxkY21AYWNtLm9yZz4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpOgorCSAgUmUtYXBwbHkgcGF0Y2ggZnJvbSAjMTQyMjcyIHRoYXQgYWxsb3dzIG5vbi1zZWVrYWJsZSBzb3VyY2VzLAorCSAgcmUtcHJvcG9zZWQgYnkgRGFuaWVsIERyYWtlIDxkc2RAZ2VudG9vLm9yZz4uCisKKzIwMDUtMDEtMjkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtZW5jLmM6IChnc3RfcnRwZ3NtZW5jX2luaXQpOgorCSAgVXNlIHRoZSBzcmMgdGVtcGxhdGUgZm9yIGNyZWF0aW5nIHRoZSBzcmMgcGFkICgjMTYyMzMwKS4KKworMjAwNS0wMS0yOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L211c2VwYWNrL01ha2VmaWxlLmFtOgorCSogZXh0L211c2VwYWNrL2dzdG11c2VwYWNrZGVjLmM6IChnc3RfbXVzZXBhY2tkZWNfY2xhc3NfaW5pdCksCisJKGdzdF9tdXNlcGFja2RlY19pbml0KSwgKGdzdF9tdXNlcGFja2RlY19kaXNwb3NlKSwKKwkoZ3N0X211c2VwYWNrZGVjX3NyY19xdWVyeSksIChnc3RfbXVzZXBhY2tkZWNfc3JjX2NvbnZlcnQpLAorCShnc3RfbXVzZXBhY2tfc3RyZWFtX2luaXQpLCAoZ3N0X211c2VwYWNrZGVjX2xvb3ApLAorCShnc3RfbXVzZXBhY2tkZWNfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9tdXNlcGFjay9nc3RtdXNlcGFja2RlYy5jcHA6CisJKiBleHQvbXVzZXBhY2svZ3N0bXVzZXBhY2tkZWMuaDoKKwkqIGV4dC9tdXNlcGFjay9nc3RtdXNlcGFja3JlYWRlci5jOiAoZ3N0X211c2VwYWNrX3JlYWRlcl9wZWVrKSwKKwkoZ3N0X211c2VwYWNrX3JlYWRlcl9yZWFkKSwgKGdzdF9tdXNlcGFja19yZWFkZXJfc2VlayksCisJKGdzdF9tdXNlcGFja19yZWFkZXJfdGVsbCksIChnc3RfbXVzZXBhY2tfcmVhZGVyX2dldF9zaXplKSwKKwkoZ3N0X211c2VwYWNrX3JlYWRlcl9jYW5zZWVrKSwgKGdzdF9tdXNlcGFja19pbml0X3JlYWRlcik6CisJKiBleHQvbXVzZXBhY2svZ3N0bXVzZXBhY2tyZWFkZXIuY3BwOgorCSogZXh0L211c2VwYWNrL2dzdG11c2VwYWNrcmVhZGVyLmg6CisJICBVcGRhdGUgdG8gMS4xIEFQSSAoIzE2NTQ0NikuCisKKzIwMDUtMDEtMjggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkgIFVuYnJlYWsgYnVpbGRib3QuCisKKzIwMDUtMDEtMjggIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOiBDaGFuZ2UgdGhlIHBpeGVsIGFzcGVjdCByYXRpbyBvZiBkdmRlYyBvdXRwdXQKKwl0byByZWZsZWN0IGEgZGlmZmVyZW50IGR1YmlvdXMgaW50ZXJuZXQgc291cmNlLiBBZGQgYSByZWZlcmVuY2UKKwlhbmQgc29tZSBjb21tZW50YXJ5LgorCisyMDA1LTAxLTI4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0c3RyZWFtc2VsZWN0b3IuYzogKGdzdF9zdHJlYW1fc2VsZWN0b3JfaW5pdCksCisJKGdzdF9zdHJlYW1fc2VsZWN0b3JfZ2V0X2NhcHMpLCAoZ3N0X3N0cmVhbV9zZWxlY3Rvcl9jaGFpbik6CisJKiBnc3QvcGxheWJhY2svZ3N0c3RyZWFtc2VsZWN0b3IuaDoKKwkgIEJlIG1vcmUgc2VsZWN0aXZlIHdoZW4gd2UncmUgcmVkb2luZyBjYXBzIG5lZ290aWF0aW9uIGZyb20KKwkgIHdpdGhpbiB0aGUgY2hhaW4gZnVuY3Rpb24gb24gYSBzdHJlYW0gY2hhbmdlLgorCisyMDA1LTAxLTI4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvYW1ybmIvTWFrZWZpbGUuYW06CisJKiBleHQvYW1ybmIvYW1ybmIuYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC9hbXJuYi9hbXJuYmRlYy5jOiAoZ3N0X2Ftcm5iZGVjX2dldF90eXBlKSwKKwkoZ3N0X2Ftcm5iZGVjX2Jhc2VfaW5pdCksIChnc3RfYW1ybmJkZWNfY2xhc3NfaW5pdCksCisJKGdzdF9hbXJuYmRlY19pbml0KSwgKGdzdF9hbXJuYmRlY19saW5rKSwgKGdzdF9hbXJuYmRlY19jaGFpbiksCisJKGdzdF9hbXJuYmRlY19zdGF0ZV9jaGFuZ2UpOgorCSogZXh0L2Ftcm5iL2Ftcm5iZGVjLmg6CisJKiBleHQvYW1ybmIvYW1ybmJwYXJzZS5jOiAoZ3N0X2Ftcm5icGFyc2VfZ2V0X3R5cGUpLAorCShnc3RfYW1ybmJwYXJzZV9iYXNlX2luaXQpLCAoZ3N0X2Ftcm5icGFyc2VfY2xhc3NfaW5pdCksCisJKGdzdF9hbXJuYnBhcnNlX2luaXQpLCAoZ3N0X2Ftcm5icGFyc2VfZm9ybWF0cyksCisJKGdzdF9hbXJuYnBhcnNlX3F1ZXJ5dHlwZXMpLCAoZ3N0X2Ftcm5icGFyc2VfcXVlcnkpLAorCShnc3RfYW1ybmJwYXJzZV9oYW5kbGVfZXZlbnQpLCAoZ3N0X2Ftcm5icGFyc2VfcmVzZXJ2ZSksCisJKGdzdF9hbXJuYnBhcnNlX2xvb3ApLCAoZ3N0X2Ftcm5icGFyc2Vfc3RhdGVfY2hhbmdlKToKKwkqIGV4dC9hbXJuYi9hbXJuYnBhcnNlLmg6CisJICBBZGQgc3VwcG9ydCBmb3IgQU1SLU5CIChtb2JpbGUgcGhvbmUgYXVkaW8gZm9ybWF0OyAjMTU1MTYzLCAjMTYzMjg2KS4KKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAocGx1Z2luX2luaXQpOgorCSAgQWRkIEFNUi1OQi8tV0IgcmF3IGZvcm1hdHMuCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9saW5rKToKKwkgIEtlZXAgdmFsaWQgdGltZSB3aGVuIGNoYW5naW5nIGZvcm1hdC4KKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwKKwkocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIEFkZCBzb21lIG1vcmUgZm9ybWF0LXNwZWNpZmljIG9wdGlvbnMgKCMxNDAxNDEsICMxNDM1NTUsICMxNTUxNjMpLgorCisyMDA1LTAxLTI4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2Jsb2NrZ3JvdXApOgorCSAgRml4IGxvZ2ljIGVycm9yIGluIHRpbWluZyBvZiBzdWJ0aXRsZSBzdHJlYW0gc3luY2hyb25pemF0aW9uLgorCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChxdF90eXBlX2ZpbmQpOgorCSAgQWRkIHNraXAtY2h1bmssIHdoaWNoIGlzIGZvdW5kIGluIGtvZGFrLWNhbWVyYSBzdHJlYW1zLgorCisyMDA1LTAxLTI3ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBwby9MSU5HVUFTOgorCSogcG8vdmkucG86CisJICBBZGRpbmcgVmlldG5hbWVzZSB0cmFuc2xhdGlvbiAoc3VibWl0dGVkIGJ5IENseXRpZSBTaWRkYWxsKQorCisyMDA1LTAxLTI3ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0ZGVjb2RlYmluLmM6ICh0cnlfdG9fbGlua18xKToKKwkgIFVzZSByZWFscGFkIGZvciBzaWduYWwuCisKKzIwMDUtMDEtMjcgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9tYWQvZ3N0aWQzZGVtdXhiaW4uYzogKGdzdF9pZDNkZW11eF9iaW5fYmFzZV9pbml0KToKKwkgIEZpeCBjYXRlZ29yeSBzbyBkZWNvZGViaW4gcGlja3MgaXQgdXAuCisKKzIwMDUtMDEtMjcgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9tYWQvTWFrZWZpbGUuYW06CisJKiBleHQvbWFkL2dzdGlkM2RlbXV4YmluLmM6IChnc3RfaWQzZGVtdXhfYmluX2dldF90eXBlKSwKKwkoZ3N0X2lkM2RlbXV4X2Jpbl9iYXNlX2luaXQpLCAoZ3N0X2lkM2RlbXV4X2Jpbl9jbGFzc19pbml0KSwKKwkoZ3N0X2lkM2RlbXV4X2Jpbl9pbml0KSwgKGdzdF9pZDNkZW11eF9iaW5fcmVtb3ZlX3BhZCksCisJKGZvdW5kX3R5cGUpLCAoZ3N0X2lkM2RlbXV4X2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX2FkZF9zcmNfcGFkKSwKKwkoZ3N0X2lkM190YWdfaW5pdCksIChnc3RfaWQzX3RhZ19oYW5kbGVfZXZlbnQpLAorCShnc3RfaWQzX3RhZ19zcmNfbGluayksIChnc3RfaWQzX3RhZ19jaGFpbiksCisJKGdzdF9pZDNfdGFnX2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJKiBleHQvbWFkL2dzdG1hZC5oOgorCSAgQWRkIGlkM2RlbXV4YmluICh3aGljaCBpcyBhIHNpbXBsZSBiaW4gY29uc2lzdGluZyBvZiBpZDNkZW11eAorCSAgYW5kIHR5cGVmaW5kKSwgdGFrZSBvdmVyIHJhbmsgZnJvbSBpZDNkZW11eCwgcmVtb3ZlIHR5cGVmaW5kCisJICBjb2RlIGZyb20gaWQzZGVtdXguIE1ha2VzIGFsbCBicm9rZW4gbXAzcyB0aGF0IEkga25vdyBvZiB3b3JrLAorCSAgYW5kIHRoZXJlYnkgZml4ZXMgIzE1MjY4OC4KKworMjAwNS0wMS0yNyAgRWR3YXJkIEhlcnZleSAgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX3NyY19ldmVudCk6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpOgorCSAgQWxsb3cgc2Vla3Mgb24gYXVkaW8gcGFkLCBtYWtlIG1hZCBmb3J3YXJkIHRob3NlICgjMTY0ODI2KS4KKwkqIGdzdC9hdWRpb3NjYWxlL2dzdGF1ZGlvc2NhbGUuYzogKGdzdF9hdWRpb3NjYWxlX2NoYWluKToKKwkgIFNldCBkdXJhdGlvbiAoIzE2NTMzNSkuCisKKzIwMDUtMDEtMjcgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoZ3N0X2FzZl9kZW11eF9pbml0KSwKKwkoZ3N0X2FzZl9kZW11eF9jb21taXRfdGFnbGlzdCksIChnc3RfYXNmX2RlbXV4X3Byb2Nlc3NfY29tbWVudCksCisJKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19leHRfY29udGVudF9kZXNjKSwKKwkoZ3N0X2FzZl9kZW11eF9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X2FzZl9kZW11eF9hZGRfYXVkaW9fc3RyZWFtKSwKKwkoZ3N0X2FzZl9kZW11eF9hZGRfdmlkZW9fc3RyZWFtKSwgKGdzdF9hc2ZfZGVtdXhfc2V0dXBfcGFkKToKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5oOgorCSAgSW1wcm92ZSBtZXRhZGF0YSBkaXNwbGF5LCBlLmcuIGlmIHRoZSBtZXRhZGF0YSBjb21lcyBiZWZvcmUgdGhlCisJICBzdHJlYW1zIGFyZSBsb2FkZWQgKHdoaWNoIGlzIHBlcmZlY3RseSB2YWxpZCkuCisKKzIwMDUtMDEtMjcgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHRvb2xzL2dzdC1sYXVuY2gtZXh0LW0ubToKKwkgIEZpeCBBVkkvQVNGIHBpcGVsaW5lcyAoIzE2NTM0MCkuCisKKzIwMDUtMDEtMjYgIEFtYXVyeSBKYWNxdW90ICA8c3hwZXJ0QGVzaXRjb20ub3JnPgorCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5LmM6IGluY2x1ZGUgIHN0cmluZy5oIGFuZCBzdHJpbmdzLmggdG8gZml4CisJYnVpbGQgZmFpbHVyZSBvbiBhbWQ2NAorCisyMDA1LTAxLTI2ICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChtYWRfaWQzX3BhcnNlX2xhdGluMV9zdHJpbmcpLAorCShtYWRfaWQzX3BhcnNlX2NvbW1lbnRfZnJhbWUpLCAoZ3N0X21hZF9pZDNfdG9fdGFnX2xpc3QpOgorCSAgQ2hlY2sgZW52aXJvbm1lbnQgdmFyaWFibGVzIEdTVF9JRDNWMl9UQUdfRU5DT0RJTkcsCisJICBHU1RfSUQzX1RBR19FTkNPRElORyBhbmQgR1NUX1RBR19FTkNPRElORyBmb3IgYSBjb2xvbi1zZXBhcmF0ZWQKKwkgIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncyB0byBmb3JjZSBpbnRlcnByZXRhdGlvbiBvZiBub24tdW5pY29kZQorCSAgc3RyaW5ncyBzdG9yZWQgaW4gYW4gSUQzdjIgdGFnIHRvIGEgcGFydGljdWxhciBlbmNvZGluZy4gSWYgbm9uZQorCSAgaXMgc3BlY2lmaWVkLCB0cnkgdG8gdXNlIGN1cnJlbnQgbG9jYWxlJ3MgZW5jb2RpbmcsIHRoZW4gZmFsbCBiYWNrCisJICB0byBJU08tODg1OS0xICh3aGljaCB3aWxsIGFsd2F5cyBzdWNjZWVkKS4gKFJlc29sdmVzICMxNDkyNzQpCisJKiBnc3QvdGFncy9nc3RpZDN0YWcuYzogKGdzdF90YWdfZnJvbV9pZDNfdGFnKSwKKwkoZ3N0X3RhZ19leHRyYWN0X2lkM3YxX3N0cmluZyksIChnc3RfdGFnX2xpc3RfbmV3X2Zyb21faWQzdjEpOgorCSAgQ2hlY2sgZW52aXJvbm1lbnQgdmFyaWFibGVzIEdTVF9JRDNWMV9UQUdfRU5DT0RJTkcsCisJICBHU1RfSUQzX1RBR19FTkNPRElORyBhbmQgR1NUX1RBR19FTkNPRElORyBmb3IgYSBjb2xvbi1zZXBhcmF0ZWQKKwkgIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncyB0byB1c2UgaW4gY2FzZSBhIHN0cmluZyBlbmNvdW50ZXJlZAorCSAgaW4gYW4gSUQzdjEgdGFnIGlzIG5vdCB2YWxpZCBVVEYtOCBhbHJlYWR5LiBJZiBubyBlbmNvZGluZyBpcworCSAgc3BlY2lmaWVkLCB0cnkgdG8gdXNlIHRoZSBjdXJyZW50IGxvY2FsZSdzIGVuY29kaW5nLCB0aGVuIGZhbGwKKwkgIGJhY2sgdG8gSVNPLTg4NTktMSAod2hpY2ggd2lsbCBhbHdheXMgc3VjY2VlZCkuCisKKzIwMDUtMDEtMjUgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfY2hlY2tfY2Fwc19yZXNldCksIChnc3RfbWFkX2NoYWluKToKKwkgIC0gb24gaGFsZiBmcmFtZXJhdGUsIGNvbXB1dGUgdGhlIHJhdGUgaW4gYWR2YW5jZSBzbyB0aGUgY29tcGFyaXNvbnMKKwkgICAgZG9uJ3QgY29tcGFyZSB3cm9uZyB2YWx1ZXMKKwkgIC0gZG9uJ3QgdXNlIG1hZF9zeW50aC9mcmFtZV9tdXRlIGFueW1vcmUsIHRoaXMgbWlycm9ycyBtYWRfZGVjb2RlcgorCSAgICBiZWhhdmlvdXIKKwkgIC0gZG9uJ3QgdXNlIG1hZF9oZWFkZXJfZGVjb2RlIGFueW1vcmUsIG1hZF9mcmFtZV9kZWNvZGUgZG9lcyB0aGF0CisJICAgIGF1dG9tYXRpY2FsbHkKKwkgIC0gd2hlbiBnZXR0aW5nIHJpZCBvZiBjb25zdW1lZCBieXRlcywgcmVzZXQgdGhlIHN0cmVhbSdzIHNraXBsZW4KKwkgIChmaXhlcyAjMTYzODY3KQorCisyMDA1LTAxLTI2ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYXJzZS5jOiAoZ3N0X21wZWdfcGFyc2VfY2xhc3NfaW5pdCkKKwkgIFVzZSAxLzIgYSBzZWNvbmQgZm9yIGRlZmF1bHQgbWF4X2Rpc2NvbnQsIGFzIFBFUyBzdHJlYW1zIGZyb20gRFZCCisJICBzZWVtIHRvIGhhdmUgbGFyZ2VyIHNwYWNpbmdzIGluIHRoZSBTQ1IuIAorCSAgRml4IGEgdHlwby4KKworMjAwNS0wMS0yNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChncm91cF9jb21taXQpOgorCSAgTm90aWZ5IGRlbGF5ZWQgc3RyZWFtLWluZm8gYXZhaWxhYmlsaXR5LgorCisyMDA1LTAxLTI2ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisJKiBleHQvYTUyZGVjL2dzdGE1MmRlYy5jOiAoZ3N0X2E1MmRlY19wdXNoKSwKKwkoZ3N0X2E1MmRlY19oYW5kbGVfZXZlbnQpLCAoZ3N0X2E1MmRlY19jaGFpbik6CisJQWRkIHNvbWUgZGVidWcgb3V0cHV0LiBDaGVjayB0aGF0IGEgZGlzY29udCBoYXMgYSB2YWxpZAorCXRpbWUgYXNzb2NpYXRlZC4KKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2NoZWNrX2V2ZW50KSwKKwkoZ3N0X2Fsc2Ffc2lua19sb29wKToKKwlJZ25vcmUgVEFHIGV2ZW50cy4gQSBsaXR0bGUgZXh0cmEgZGVidWcgZm9yIGJyb2tlbiB0aW1lc3RhbXBzLgorCSogZXh0L2R2ZG5hdi9kdmRuYXZzcmMuYzogKGR2ZG5hdnNyY19pbml0KSwgKGR2ZG5hdnNyY19sb29wKSwKKwkoZHZkbmF2c3JjX2NoYW5nZV9zdGF0ZSk6CisJRW5zdXJlIHdlIHNlbmQgYSBkaXNjb250IHRvIGVuZ2FnZSB0aGUgbGluayBiZWZvcmUgd2Ugc2VuZCBhbnkKKwlvdGhlciBldmVudHMuCisJKiBleHQvZHZkcmVhZC9kdmRyZWFkc3JjLmM6IChkdmRyZWFkc3JjX2luaXQpLAorCShkdmRyZWFkc3JjX2ZpbmFsaXplKSwgKF9jbG9zZSksIChfb3BlbiksIChfc2Vla190aXRsZSksCisJKF9zZWVrX2NoYXB0ZXIpLCAoc2Vla19zZWN0b3IpLCAoZHZkcmVhZHNyY19nZXQpLAorCShkdmRyZWFkc3JjX3VyaV9nZXRfdXJpKSwgKGR2ZHJlYWRzcmNfdXJpX3NldF91cmkpOgorCUhhbmRsZSBVUkkgb2YgdGhlIGZvcm0gZHZkOi8vdGl0bGVbLGNoYXB0ZXJbLGFuZ2xlXV0uIEN1cnJlbnRseSBvbmx5CisJZHZkOi8vdGl0bGUgd29ya3MgaW4gdG90ZW0gYmVjYXVzZSB0eXBlZmluZGluZyBzZW5kcyBhIHNlZWsgdGhhdCBlbmRzCisJdXAgZ29pbmcgYmFjayB0byBjaGFwdGVyIDEgcmVnYXJkbGVzcy4KKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOgorCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmg6CisJT3V0cHV0IGNvcnJlY3QgdGltZXN0YW1wcyBhbmQgaGFuZGxlIGRpc2NvbnRzLgorCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ2V0X3JlbGF0aXZlKToKKwlTbWFsbCBndWFyZCBhZ2FpbnN0IGEgbnVsbCBkZXJlZmVyZW5jZS4KKwkqIGV4dC9wYW5nby9nc3R0ZXh0b3ZlcmxheS5jOiAoZ3N0X3RleHRvdmVybGF5X2ZpbmFsaXplKSwKKwkoZ3N0X3RleHRvdmVybGF5X3NldF9wcm9wZXJ0eSk6CisJRnJlZSBtZW1vcnkgd2hlbiBkb25lLiBEb24ndCBjYWxsIGdzdF9ldmVudF9maWxsZXJfZ2V0X2R1cmF0aW9uIG9uCisJRU9TIGV2ZW50cy4gVXNlIEdTVF9MT0cgYW5kIEdTVF9XQVJOSU5HIGluc3RlYWQgb2YgZ19tZXNzYWdlIGFuZAorCWdfd2FybmluZy4KKwkqIGV4dC9zbW9vdGh3YXZlL2dzdHNtb290aHdhdmUuYzogKGdzdF9zbW9vdGh3YXZlX2luaXQpLAorCShkcmF3X2xpbmUpLCAoZ3N0X3Ntb290aHdhdmVfZGlzcG9zZSksIChnc3Rfc3dfc2lua2xpbmspLAorCShnc3Rfc3dfc3JjbGluayksIChnc3Rfc21vb3Rod2F2ZV9jaGFpbik6CisJRHJhdyBzb2xpZCBsaW5lcywgcHJldHRpZXIgY29sb3Vycy4KKwkqIGdzdC9tcGVnMnN1Yi9nc3RtcGVnMnN1YnQuYzogKGdzdF9tcGVnMnN1YnRfaW5pdCk6CisJQWRkIGEgZGVmYXVsdCBwYWxldHRlIHRoYXQnbGwgd29yayBmb3Igc29tZSBtb3ZpZXMuCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5jOiAoZ3N0X2R2ZF9kZW11eF9pbml0KSwKKwkoZ3N0X2R2ZF9kZW11eF9oYW5kbGVfZHZkX2V2ZW50KSwgKGdzdF9kdmRfZGVtdXhfc2VuZF9kaXNjb250KSwKKwkoZ3N0X2R2ZF9kZW11eF9zZW5kX3N1YmJ1ZmZlciksIChnc3RfZHZkX2RlbXV4X3Jlc2V0KToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdGR2ZGRlbXV4Lmg6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguYzogKGdzdF9tcGVnX2RlbXV4X3NlbmRfZGlzY29udCksCisJKGdzdF9tcGVnX2RlbXV4X3BhcnNlX3N5c2hlYWQpLCAoZ3N0X21wZWdfZGVtdXhfcGFyc2VfcGVzKToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYXJzZS5jOiAoZ3N0X21wZWdfcGFyc2VfaW5pdCksCisJKGdzdF9tcGVnX3BhcnNlX2hhbmRsZV9kaXNjb250KSwgKGdzdF9tcGVnX3BhcnNlX3BhcnNlX3BhY2toZWFkKToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYXJzZS5oOgorCVVzZSBQVE0vTkFWIGV2ZW50cyB3aGVuIGZvciB0aW1lc3RhbXAgYWRqdXN0bWVudCB3aGVuIGNvbm5lY3RlZCB0byAKKwlkdmRuYXZzcmMuIERvbid0IHVzZSBtYW55IGRpc2NvbnQgZXZlbnRzIHdoZXJlIG9uZSBzdWZmaWNlcy4KKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ3JvdXBfZGVzdHJveSksCisJKGdlbl9wcmVyb2xsX2VsZW1lbnQpLCAoZ3N0X3BsYXlfYmFzZV9iaW5fYWRkX2VsZW1lbnQpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmg6CisJTWFrZSBzdXJlIHdlIHJlbW92ZSBzdWJ0aXRsZXMgZnJvbSB0aGUgc2FtZSBiaW4gd2UgcHV0IHRoZW0gaW4uCisJKiBnc3Qvc3VicGFyc2UvZ3N0c3VicGFyc2UuYzogKGNvbnZlcnRfZW5jb2RpbmcpLCAocGFyc2Vfc3VicmlwKSwKKwkoZ3N0X3N1YnBhcnNlX2J1ZmZlcl9mb3JtYXRfYXV0b2RldGVjdCksCisJKGdzdF9zdWJwYXJzZV9jaGFuZ2Vfc3RhdGUpOgorCUZpeCBzb21lIG1lbWxlYWtzIGFuZCBpbnZhbGlkIGFjY2Vzc2VzLgorCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChvZ2dhbnhfdHlwZV9maW5kKSwKKwkob2dnc2tlbF90eXBlX2ZpbmQpLCAoY21tbF90eXBlX2ZpbmQpLCAocGx1Z2luX2luaXQpOgorCVNvbWUgdHlwZWZpbmQgZnVuY3Rpb25zIGZvciBBbm5vZGV4IHYzLjAgZmlsZXMKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oOgorCUdzdFJpZmZSZWFkQ2xhc3MgaXMgdGhlIGNvcnJlY3QgcGFyZW50IGNsYXNzLgorCisyMDA1LTAxLTI1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6CisJKGdzdF9yaWZmX2NyZWF0ZV92aWRlb19jYXBzX3dpdGhfZGF0YSk6CisJICBBZGQgZXh0cmFkYXRhIHRvIGh1ZmZ5dXYgKGZpeGVzICMxNjUwMTMpLgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6CisJKGdzdF9yaWZmX3JlYWRfc3RyZl92aWRzX3dpdGhfZGF0YSk6CisJICBGaXggZXh0cmFkYXRhIGV4dHJhY3Rpb24gaWYgaXQgaXMgaW4gdGhlIGNodW5rIHNpemUuCisKKzIwMDUtMDEtMjUgIEVkd2FyZCBIZXJ2ZXkgIDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOiAoZ3N0X3F1YXJrdHZfY2xhc3NfaW5pdCksCisJKGdzdF9xdWFya3R2X2NoYW5nZV9zdGF0ZSksIChnc3RfcXVhcmt0dl9kaXNwb3NlKToKKwkgIE1lbW9yeSBmcmVlJ2luZyBsb2NhdGlvbiBmaXggKCMxNjQ3MDgpLgorCisyMDA1LTAxLTI1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdyb3VwX2NvbW1pdCksCisJKGdlbl9wcmVyb2xsX2VsZW1lbnQpLCAocHJvYmVfdHJpZ2dlcmVkKSwgKGdlbl9zb3VyY2VfZWxlbWVudCksCisJKHNldHVwX3NvdXJjZSksIChnc3RfcGxheV9iYXNlX2Jpbl9jaGFuZ2Vfc3RhdGUpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9hZGRfZWxlbWVudCk6CisJICBEb24ndCBibG9jayBmb3Igc3RyZWFtcy4KKwkqIGdzdC9wbGF5YmFjay9nc3RzdHJlYW1pbmZvLmM6IChzdHJlYW1faW5mb19jaGFuZ2Vfc3RhdGUpLAorCShnc3Rfc3RyZWFtX2luZm9fc2V0X211dGUpOgorCSAgVXNlIGdzdF9wYWRfc2V0X2FjdGl2ZV9yZWN1cnNpdmUuCisKKzIwMDUtMDEtMjUgIEFuZHkgV2luZ28gIDx3aW5nb0Bwb2JveC5jb20+CisKKwkqIHN5cy92NGwvZ3N0djRsZWxlbWVudC5jIChnc3RfdjRsX2lmYWNlX3N1cHBvcnRlZCk6IEZpeCBjb21waWxlCisJZm9yICNpZm5kZWYgSEFWRV9YVklERU8uCisKKzIwMDUtMDEtMjQgIEplZmZyZXkgQy4gT2xsaWUKKworCXJldmlld2VkIGJ5OiBNYWNpZWogS2F0YWZpYXN6ICA8bWF0aHJpY2tAZnJlZWRlc2t0b3Aub3JnPgorCisJKiBleHQvZ3NtL2dzdGdzbWRlYy5jOiAoZ3N0X2dzbWRlY19pbml0KSwgKGdzdF9nc21kZWNfY2hhaW4pOgorCSogZXh0L2dzbS9nc3Rnc21kZWMuaDoKKwkqIGV4dC9nc20vZ3N0Z3NtZW5jLmM6IChnc3RfZ3NtZW5jX2luaXQpLCAoZ3N0X2dzbWVuY19jaGFpbik6CisJKiBleHQvZ3NtL2dzdGdzbWVuYy5oOgorCUZpeCByYXRlIHRvIDhrSHogYXMgcGVyIHNwZWMsIHJlbW92ZXMgb2JzY3VyZSBlcnJvcnMgd2hlbiBubyByYXRlCisJd2FzIGdpdmVuIGJ5IHByb3BlcnR5LiBBZGQgcHJvcGVyIGJ1ZmZlciB0aW1lc3RhbXBzIGFuZCBvZmZzZXRzLgorCisyMDA1LTAxLTI0ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6CisJKGdzdF9yaWZmX2NyZWF0ZV9hdWRpb19jYXBzX3dpdGhfZGF0YSk6CisJICBBdWRpbyBjYW4gYmUgPDgwMDBIei4KKworMjAwNS0wMS0yMiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCSAgRXhwbGljaXQgc3RhdGUgY2hhbmdlIHRvIHdvcmthcm91bmQgcmVmY291bnQgYnVncy4KKworMjAwNS0wMS0yMiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmltdXhfd3JpdGVfdGFnKSwKKwkoZ3N0X2F2aW11eF9yaWZmX2dldF9hdmlfaGVhZGVyKToKKwkgIEZpeC4uLgorCisyMDA1LTAxLTE5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuYzogKGdzdF9yaWZmX3BlZWtfZWxlbWVudF9kYXRhKSwKKwkoZ3N0X3JpZmZfcmVhZF9lbGVtZW50X2RhdGEpOgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmg6CisJICBBZGQgX3BlZWsgdmVyc2lvbiAocmVxJ2VkIGluIENEWEEpLgorCSogZ3N0L2NkeGFwYXJzZS9nc3RjZHhhcGFyc2UuYzogKGdzdF9jZHhhcGFyc2VfaW5pdCksCisJKGdzdF9jZHhhcGFyc2VfbG9vcCk6CisJICBGaXggcGFyc2luZyBpbiBwbGF5YmluLgorCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAoY2xvc2VfcGFkX2xpbmspOgorCSAgSWdub3JlIGN1cnJlbnRfIHBhZHMsIHRoZXkgY2F1c2UgbWFqb3IgYW5ub3lhbmNlLgorCisyMDA1LTAxLTE5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jOiAoZ3N0X2Fsc2Ffc2lua19sb29wKToKKwkgIFNhZmV0eSBndWFyZC4KKworMjAwNS0wMS0xOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmltdXhfd3JpdGVfdGFnKToKKwkgIEZpeCBwYWRkaW5nLi4uCisKKzIwMDUtMDEtMTkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogKGdzdF9lYm1sX3JlYWRfYnVmZmVyKToKKwkgIEFsbG93IGZvciAwLXNpemVkIGJ1ZmZlcnMuIEZpeGVzIGxlbmd0aCBxdWVyeSBwcm9ibGVtcyBpbgorCSAgc3RhcndhcnMubWt2IGZyb20gdGhlIHRlc3RzdWl0ZS4KKworMjAwNS0wMS0xOSAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogKGdzdF92aWRlb19ib3hfY29weV9wbGFuZV9pNDIwKSwKKwkoZ3N0X3ZpZGVvX2JveF9pNDIwKSwgKGdzdF92aWRlb19ib3hfY2hhaW4pOgorCSAgRml4IHJvdyBzdHJpZGVzIGZvciBJNDIwIChmaXhlcyAjMTYzMTU5KQorCSAgCisyMDA1LTAxLTE5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVncGFyc2UuYzogKGdzdF9tcGVnX3BhcnNlX3BhcnNlX3BhY2toZWFkKToKKwkgIE1QRUcyIGhhcyBhIHVzZWZ1bCByYXRlIHByb3BlcnR5LCBzbyB3ZSBjYW4gYWN0dWFsbHkgdXNlIHRoYXQuCisJICBGb3IgTVBFRy0xLCBjb250aW51ZSB1c2luZyB0aGUgYnl0ZXMvdGltZSBwcm9wZXJ0aWVzLgorCisyMDA1LTAxLTE5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6CisJKGdzdF9yaWZmX2NyZWF0ZV92aWRlb19jYXBzX3dpdGhfZGF0YSksCisJKGdzdF9yaWZmX2NyZWF0ZV92aWRlb190ZW1wbGF0ZV9jYXBzKToKKwkgIEFkZCBpbnRlbC1oMjYzLgorCisyMDA1LTAxLTE5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9jaGVja19jYXBzX3Jlc2V0KSwgKGdzdF9tYWRfY2hhaW4pOgorCSAgRmFpbCBpZiBjYXBzIG5lZ290aWF0aW9uIGZhaWxzLiBTaG91bGQgZml4ICMxNjIxODQsIGFuZCBzaG91bGQKKwkgIGRlZmluYXRlbHkgYmUgaW4gdGhlcmUgcmVnYXJkbGVzcyBvZiBpdCBmaXhpbmcgdGhlIGFjdHVhbCBidWcuCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aW11eF9nZXRfdHlwZSksIChnc3RfYXZpbXV4X2luaXQpLAorCShnc3RfYXZpbXV4X3dyaXRlX3RhZyksIChnc3RfYXZpbXV4X3JpZmZfZ2V0X2F2aV9oZWFkZXIpLAorCShnc3RfYXZpbXV4X3JpZmZfZ2V0X2F2aXhfaGVhZGVyKSwKKwkoZ3N0X2F2aW11eF9yaWZmX2dldF92aWRlb19oZWFkZXIpLAorCShnc3RfYXZpbXV4X3JpZmZfZ2V0X2F1ZGlvX2hlYWRlciksIChnc3RfYXZpbXV4X3dyaXRlX2luZGV4KSwKKwkoZ3N0X2F2aW11eF9zdGFydF9maWxlKSwgKGdzdF9hdmltdXhfaGFuZGxlX2V2ZW50KSwKKwkoZ3N0X2F2aW11eF9jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L2F2aS9nc3RhdmltdXguaDoKKwkgIFJlZmFjdG9yIHN0cnVjdHVyZSB3cml0aW5nIHRvIHVzZSBHU1RfV1JJVEVfVUlOVCBtYWNyb3MsIGFkZAorCSAgbWV0YWRhdGEgd3JpdGluZyBzdXBwb3J0LgorCisyMDA1LTAxLTE4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0c3RyZWFtaW5mby5jOiAoZ3N0X3N0cmVhbV9pbmZvX2Rpc3Bvc2UpOgorCSAgRWxlbWVudHMgbWF5IGFscmVhZHkgYmUgZGVzdHJveWVkIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCisKKzIwMDUtMDEtMTggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2NoYW5nZV9zdGF0ZSksCisJKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwgKGdzdF9xdGRlbXV4X2hhbmRsZV9lc2RzKToKKwkgIE1vcmUgbWVtb3J5IGxlYWsgZml4ZXMgKCMxNDkxNjIpLgorCisyMDA1LTAxLTE4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9jaGFuZ2Vfc3RhdGUpLAorCShnc3RfcXRkZW11eF9hZGRfc3RyZWFtKToKKwkgIEZpeCB0d28gbWVtbGVha3MuCisKKzIwMDUtMDEtMTggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9mYWFkL2dzdGZhYWQuYzogKGdzdF9mYWFkX3NyY2dldGNhcHMpOgorCSAgQXJnaC4uLgorCisyMDA1LTAxLTE3ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9zcmNnZXRjYXBzKToKKwkgIEZpeCBvZmYtYnktb25lIGJ1Zy4gRml4ZXMgd2FybmluZ3MgZHVyaW5nIHBsYXliYWNrIG9mIHNpbmNpdHkubXA0CisJICB3aGVuIGZpeGF0aW5nIHRvIHNpeCBjaGFubmVscyBpbiBUb3RlbS4KKworMjAwNS0wMS0xNyAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBhdCBjZW50cmljdWxhciBkb3QgbmV0PgorCisJKiBleHQvZHZkcmVhZC9kdmRyZWFkc3JjLmM6IChnZXRfbmV4dF9jZWxsX2Zvcik6CisJICBGaXggY29tcGlsZSB3YXJuaW5ncyBvbiBTb2xhcmlzIDEwIGJ1aWxkYm90CisKKzIwMDUtMDEtMTcgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gYXQgY2VudHJpY3VsYXIgZG90IG5ldD4KKworCSogZXh0L2R2ZHJlYWQvZHZkcmVhZHNyYy5jOiAoX3JlYWQpOgorCSAgRG9uJ3QgcmVhZCBiZXlvbmQgdGhlIGxhc3QgY2VsbCBpbiBhIGNoYXB0ZXIgKGZpeGVzIAorCSAgaW52YWxpZCBtZW1vcnkgYWNjZXNzKQorCisyMDA1LTAxLTE3ICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGF0IGNlbnRyaWN1bGFyIGRvdCBuZXQ+CisKKwkqIGV4dC9kdmRyZWFkL3N0cmVhbV9sYWJlbHMuYzoKKwkoZHZkcmVhZHNyY19nZXRfYXVkaW9fc3RyZWFtX2xhYmVscyk6CisJICBVc2UgTlVMTCBmb3IgYW4gZW1wdHkgR0xpc3QgaW5zdGVhZCBvZiBnX2xpc3RfYWxsb2MoKTsgZml4IAorCSAgbWVtb3J5IGxlYWtzOyBzL0xDUE0vTFBDTS87IHVzZSBnX3N0cmR1cF9wcmludGYoKSBpbnN0ZWFkIAorCSAgb2YgR1N0cmluZyAoZWFzaWVyIHRvIGJ1bGsgZnJlZSBsYXRlcikKKworMjAwNS0wMS0xNyAgR2VyZ2VseSBOYWd5ICA8YWxnZXJub25AYm9uZWh1bnRlci5ydWxlei5vcmc+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvZGVjbWFwLmM6CisJKGdzdF9mZm1wZWdfcGl4Zm10X3RvX2NhcHMpOgorCSAgRml4IEJHUkEzMiBjYXBzICgjMTY0MjA5KS4KKworMjAwNS0wMS0xNyAgR2VyZ2VseSBOYWd5ICA8YWxnZXJub25AYm9uZWh1bnRlci5ydWxlei5vcmc+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvZGVjbWFwLmM6CisJKGdzdF9mZm1wZWdfY2Fwc190b19waXhmbXQpOgorCSAgYWxwaGFfbWFzayBjYW4gYmUgUkdCQS9BQkdSLiBGaXhlcyAjMTY0MjY1LgorCisyMDA1LTAxLTE3ICBGcmFuY2lzIExhYm9udGUgIDxmcmFuY2lzX2xhYm9udGVAaG90bWFpbC5jb20+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOiAoY3JvcF9idWZmZXIpLAorCShnc3RfbXBlZzJkZWNfYWxsb2NfYnVmZmVyKToKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5oOgorCSAgQ3JvcCBpZiBkZWNvZGluZyBzaXplIGlzIG5vdCB0aGUgYWN0dWFsIGltYWdlIHNpemUgKCMxNjM2NzYpLgorCisyMDA1LTAxLTE3ICBTdGV2ZSBCYWtlciAgPHN0ZXZlQHN0ZXZlYmFrZXIub3JnPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKGFpZmZfdHlwZV9maW5kKSwKKwkoc3Z4X3R5cGVfZmluZCksIChzZHNfdHlwZV9maW5kKSwgKGlyY2FtX3R5cGVfZmluZCksIChwbHVnaW5faW5pdCk6CisJICBBZGQgbGlic25kZmlsZSB0eXBlZmluZCBmdW5jdGlvbnMgKCMxNjMzMDkpLgorCisyMDA1LTAxLTE3ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiB0b29scy9nc3QtbGF1bmNoLWV4dC1tLm06CisJICBBZGQgLmFhYywgZml4IC5tMXYvLm0ydiAoIzE2Mzg5MSkuCisKKzIwMDUtMDEtMTcgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FjbG9jay5jOiAoZ3N0X2Fsc2FfY2xvY2tfd2FpdCk6CisJICBTYW5pdHkgY2hlY2ssIGRvbid0IHdhaXQgZW5kbGVzc2x5IHNpbmNlIHRoZSBjbG9jayBtaWdodCBub3QKKwkgIGFjdHVhbGx5IHJ1biBhdCB0aGlzIHBvaW50ICh3aGljaCBpcyBhIGRlYWRsb2NrKS4gRml4ZXMgIzE2NDA2OS4KKworMjAwNS0wMS0xNiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChwcm9iZV90cmlnZ2VyZWQpOgorCSAgT2YgY291cnNlLCBvbmx5IHBhdXNlIGlmIGdyb3VwIGlzIGRvbmUuLi4KKworMjAwNS0wMS0xNiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChwcm9iZV90cmlnZ2VyZWQpOgorCSAgVGhyZWFkIHNhZmV0eS4KKworMjAwNS0wMS0xNiAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBleHQvc3dmZGVjL2dzdHN3ZmRlYy5jOiAoZ3N0X3N3ZmRlY19jaGFuZ2Vfc3RhdGUpOgorCSAgRG9uJ3QgcmV0dXJuIHN0YXRlIGNoYW5nZSBzdWNjZXNzIHdoZW4gdGhlIHBhcmVudAorCSAgZmFpbGVkLgorCisyMDA1LTAxLTE2ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aW11eF9oYW5kbGVfZXZlbnQpOgorCSAgRnJlZSBldmVudHMgKGZpeCBtZW1sZWFrIGluICMxNjI5MDUpLgorCisyMDA1LTAxLTE1ICBHZXJnZWx5IE5hZ3kgIDxhbGdlcm5vbkBib25laHVudGVyLnJ1bGV6Lm9yZz4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29kZWNtYXAuYzoKKwkoZ3N0X2ZmbXBlZ19jYXBzX3RvX3BpeGZtdCk6CisJICBGaXggZm9yIGRlcHRoID0gMTUuIEZpeGVzICMxNjE2NzUuCisKKzIwMDUtMDEtMTQgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX2dldGNhcHMpOgorCSAgU2V0IEZQUyBjb3JyZWN0bHksIGV2ZW4gZm9yIHdlYmNhbXMgYW5kIHRoZSBsaWtlLgorCSogc3lzL3Y0bC92NGxfY2FsbHMuYzogKGdzdF92NGxfc2V0X2NoYW5fbm9ybSk6CisJICBEb24gZXJyb3Igb24gc2V0dGluZyB3aGlsZSBjYXB0dXJpbmcuCisKKzIwMDUtMDEtMTQgIFN0ZXBoYW5lIExPRVVJTExFVCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkqIGdzdC9zdWJwYXJzZS9nc3RzdWJwYXJzZS5jOiAocGFyc2VfbWR2ZHN1Yik6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOiAoZ3N0X3k0bWVuY29kZV9zaW5rY29ubmVjdCk6CisJICBJJ20gYSBiYWQgYm95LiB1c2luZyAvMTAwMS4gdG8gZm9yY2UgQyB0byBkbyBmbG9hdCBkaXZpc2lvbgorCSAgYW5kIG5vdCBpbnRlZ2VyIGRpdmlzaW9uIChhcyBpdCBkaWQgaW4gbXkgbGFzdCBjb21taXQpCisJICBUaGFua3MgdG8gRGF2aWQgSS4gTGVobiBmb3IgcG9pbnRpbmcgdGhpcyBtaXN0YWtlLgorCisyMDA1LTAxLTE0ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvdjRsL2dzdHY0bGVsZW1lbnQuYzogKGdzdF92NGxfaWZhY2Vfc3VwcG9ydGVkKToKKwkgIFJldmVydCBKb2hhbsK0cyAxLjM1LT4xLjM2IHNpbmNlIGl0IGJyZWFrcyBjb21wYXQuCisKKzIwMDUtMDEtMTQgIFN0ZXBoYW5lIExPRVVJTExFVCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkqIGV4dC9saWJmYW1lL2dzdGxpYmZhbWUuYzoKKwkqIGdzdC9zdWJwYXJzZS9nc3RzdWJwYXJzZS5jOiAocGFyc2VfbWR2ZHN1Yik6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOiAoZ3N0X3k0bWVuY29kZV9zaW5rY29ubmVjdCk6CisgICAgICAgICAgcmVwbGFjZSBmcmFtZXJhdGUgYXByb3hpbWF0aW9ucyBieSB0aGVpciByZWFsIHZhbHVlCisgICAgICAgICAgKDI0MDAwLzEwMDEsIDMwMDAwLzEwMDEsIDYwMDAwLzEwMDEpCisgICAgICAgICAgRmluaXNoIGZpeGluZyBidWcgIzE2NDA0OQorCisyMDA1LTAxLTEzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvb2dnL2dzdG9nZ211eC5jOgorCSAgZW9zL2JvcyBkZWJ1Z2dpbmcKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuYzoKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuaDoKKwkqIGdzdC90Y3AvZ3N0dGNwLmM6CisJKiBnc3QvdGNwL2dzdHRjcC5oOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzaW5rLmM6CisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNyYy5jOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzaW5rLmM6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNyYy5jOgorCSAgaW1wcm92ZSByZXVzYWJpbGl0eSBvZiBlbGVtZW50cyBhZnRlciBzdGF0ZSBjaGFuZ2VzIGFuZCBlcnJvcnMKKwkgIG1ha2UgbXVsdGlmZHNpbmsgdGhyb3cgYXdheSBzdHJlYW1oZWFkZXJzIHdoZW4gcmVjZWl2aW5nIG5ldyBvbmVzCisKKzIwMDUtMDEtMTMgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX3JhdGVzX3Byb2JlKToKKwkgIEZpeCBmb3IgaWYgaXRlbXMgYXJlIGFscmVhZHkgaW4gbGlzdC4uLgorCisyMDA1LTAxLTEyICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9hZGRlci9nc3RhZGRlci5jOiAoZ3N0X2FkZGVyX2xvb3ApOgorCSAgZml4IGFkZGVyIGEgYml0IHNvIGl0IGRvZXNuJ3Qgc2NyZXcgdXAgd2l0aCBldmVudHMgYXMgbXVjaCBhbnltb3JlCisKKzIwMDUtMDEtMTIgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzogKGdzdF9waXhidWZzY2FsZV9saW5rKSwKKwkocGl4YnVmc2NhbGVfc2NhbGUpLCAoZ3N0X3BpeGJ1ZnNjYWxlX2NoYWluKToKKwkqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmg6CisJICBJbmNvcnBvcmF0ZSBjaGFuZ2VzIGZyb20gVGltLVBoaWxpcHAgTXVlbGxlciA8dC5pLm1Ab3JhbmdlLm5ldD4KKwkgIHRvIGVuc3VyZSByb3dzdHJpZGVzIGFyZSBjYWxjdWxhdGVkIHRoZSBzYW1lIHdheSBhcyAKKwkgIGZmbXBlZ2NvbG9yc3BhY2UKKwkgIFVzZSBnc3RfYnVmZmVyX3N0YW1wIGluc3RlYWQgb2YgY29weWluZyBUSU1FU1RBTVAgbWFudWFsbHksIHNvCisJICB0aGF0IHdlIHBpY2sgdXAgZHVyYXRpb24gYW5kIG9mZnNldCBhbHNvLgorCisyMDA1LTAxLTExICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aW11eF9jbGFzc19pbml0KSwKKwkoZ3N0X2F2aW11eF9wYWRfdW5saW5rKSwgKGdzdF9hdmltdXhfcmVsZWFzZV9wYWQpOgorCSAgUmV1c2FiaWxpdHkgZml4ZXMuCisKKzIwMDUtMDEtMTEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FtaXhlci5jOiAoZ3N0X2Fsc2FfbWl4ZXJfdXBkYXRlKSwKKwkoZ3N0X2Fsc2FfbWl4ZXJfZ2V0X3ZvbHVtZSksIChnc3RfYWxzYV9taXhlcl9zZXRfdm9sdW1lKSwKKwkoZ3N0X2Fsc2FfbWl4ZXJfc2V0X211dGUpLCAoZ3N0X2Fsc2FfbWl4ZXJfc2V0X3JlY29yZCksCisJKGdzdF9hbHNhX21peGVyX3NldF9vcHRpb24pLCAoZ3N0X2Fsc2FfbWl4ZXJfZ2V0X29wdGlvbik6CisJICBVcGRhdGUgZmxhZ3Mgd2hlbiByZXF1ZXN0ZWQuCisKKzIwMDUtMDEtMTEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX3JhdGVzX3Byb2JlKToKKwkgIEZpeCBkbWl4LgorCisyMDA1LTAxLTExICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdzdF9wbGF5X2Jhc2VfYmluX2NsYXNzX2luaXQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9pbml0KSwgKGdzdF9wbGF5X2Jhc2VfYmluX2Rpc3Bvc2UpLAorCShwcm9iZV90cmlnZ2VyZWQpLCAobmV3X2RlY29kZWRfcGFkKSwgKGdlbl9zb3VyY2VfZWxlbWVudCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX3NldF9wcm9wZXJ0eSksIChnc3RfcGxheV9iYXNlX2Jpbl9nZXRfcHJvcGVydHkpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmg6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJpbi5jOiAoZ3N0X3BsYXlfYmluX2NsYXNzX2luaXQpLAorCShnc3RfcGxheV9iaW5faW5pdCksIChncm91cF9zd2l0Y2gpLCAocmVtb3ZlX3NpbmtzKSwgKHNldHVwX3NpbmtzKSwKKwkoZ3N0X3BsYXlfYmluX2NoYW5nZV9zdGF0ZSk6CisJICBJbXBsZW1lbnQgZ3JvdXAtc3dpdGNoIHNpZ25hbCBmb3IgdXNlIGluIGFwcHMgdG8gY2xlYXIgbWV0YWRhdGEKKwkgIGNhY2hlLCBjbGVhbiB1cCBzdWJ0aXRsZSwgYWRkIHN1YnVyaSBwcm9wZXJ0eSBpbnN0ZWFkIG9mICMgaGFjaywKKwkgIHNvbWUgZXJyb3Itb3V0IGZpeGVzLgorCisyMDA1LTAxLTExICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jOiAodm9yYmlzX2RlY19jaGFpbik6CisJICBEZWJ1Zy4KKwkqIHN5cy92NGwvdjRsc3JjX2NhbGxzLmM6IChnc3RfdjRsc3JjX2dyYWJfZnJhbWUpOgorCSAgSWYgd2UgZ290IGEgc3RhdGUgY2hhbmdlIGluIHRoZSBfZ2V0IGhhbmRsZXIsIGRvbid0IHJldHVybiBzdWNjZXNzLgorCisyMDA1LTAxLTEwICBTdGVwaGFuZSBMT0VVSUxMRVQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdkZWNfbXlfb3V0cHV0X21lc3NhZ2UpLAorCShnc3RfanBlZ2RlY19teV9lbWl0X21lc3NhZ2UpLCAoZ3N0X2pwZWdkZWNfaW5pdCk6CisJICBNYWtlIGpwZWdkZWMgcXVpZXQgb24gTUpQRUcgZGVjb2RpbmcKKwkqIGdzdC9hc2ZkZW11eC9SRUFETUU6CisJICBGaXggbWltZXR5cGVzIGZvciBNSlBFRyBhbmQgSDI2MworCisyMDA1LTAxLTEwICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOiAodGhlb3JhX2RlY19jaGFpbik6CisJICBGaXggYnJva2VuIGNvZGUgZ2VuZXJhdGlvbiBieSBnY2MgYnkgc3dhcHBpbmcgYXJndW1lbnRzLgorCSogZXh0L3ZvcmJpcy92b3JiaXNkZWMuYzogKHZvcmJpc19kZWNfc3JjX3F1ZXJ5KToKKwkgIEZpeCBcbiBpbiBkZWJ1Zy4KKworMjAwNS0wMS0xMCAgU3RlcGhhbmUgTE9FVUlMTEVUICA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIFRPRE86CisJICBkZWxldGUgdGhpcyBmaWxlLCBpdCBpcyBieSBmYXIgb3V0ZGF0ZWQKKwkqIGV4dC9hbHNhL2dzdGFsc2EuMTogcmVtb3ZlCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChhZGRfcmF0ZXMpLCAoYWRkX2NoYW5uZWxzKSwgKGdzdF9hbHNhX2NhcHMpLAorCShnc3RfYWxzYV9jaGVja19zYW1wbGVfcmF0ZXMpLCAoZ3N0X2Fsc2FfcmF0ZXNfcHJvYmUpLAorCShnc3RfYWxzYV9nZXRfY2Fwcyk6CisJICBBZGQgSFcgcHJvYmluZyBmb3Igc3VwcG9ydGVkIHNhbXBsZSByYXRlcy4gRml4ZXMgIzE2MTcwNAorCisyMDA1LTAxLTEwICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXVkaW9zY2FsZS9nc3RhdWRpb3NjYWxlLmM6IChnc3RfYXVkaW9zY2FsZV9jaGFpbik6CisJICBEb24ndCBjcmFzaCwgYmlhdGNoISA6KS4KKworMjAwNS0wMS0xMCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L211c2VwYWNrL2dzdG11c2VwYWNrcmVhZGVyLmNwcDoKKwkqIGdzdC9hcGV0YWcvYXBlZGVtdXguYzogKGdzdF9hcGVfZGVtdXhfc3RyZWFtX2RhdGEpOgorCSAgU29tZSB3b3JrIG9uIHRhZ3MgLSBzdGlsbCBkb2Vzbid0IHdvcmsgaW4gcGxheWJpbi4uLgorCSogZ3N0L2F1ZGlvc2NhbGUvZ3N0YXVkaW9zY2FsZS5jOiAoZ3N0X2F1ZGlvc2NhbGVfY2hhaW4pOgorCSAgSGFuZGxlIGV2ZW50cy4uLgorCisyMDA1LTAxLTEwICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlX3RyZWUpOgorCSAgQWxzbyBzaG92ZSB0YWdzIG9uIGtpZCBwYWRzLgorCisyMDA1LTAxLTEwICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuYzogKGdzdF9yaWZmX3JlYWRfdXNlX2V2ZW50KToKKwkgIERvbid0IGJhaWwgb24gdW5rbm93biBldmVudHMuCisJKiBnc3QvYXVkaW9zY2FsZS9nc3RhdWRpb3NjYWxlLmM6IChnc3RfYXVkaW9zY2FsZV9jaGFpbik6CisJICBEb24ndCBjcmFzaCBvbiBldmVudHMgYmVmb3JlIG5lZ290aWF0aW9uLgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9hZGRfc3RyZWFtKToKKwkgIFNlbmQgdGFncyBvbiBwYWRzLCB0b28uCisJKiBnc3QvcGxheWJhY2svZ3N0c3RyZWFtc2VsZWN0b3IuYzoKKwkoZ3N0X3N0cmVhbV9zZWxlY3Rvcl9yZXF1ZXN0X25ld19wYWQpOgorCSAgRm9yd2FyZCBldmVudHMgb24gZmlyc3QgcGFkIGlmIG5vIGlucHV0IHdhcyBzZWxlY3RlZCB5ZXQuCisKKzIwMDUtMDEtMTAgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoc2V0dXBfc3Vic3RyZWFtcyk6CisJICBEb24ndCBkaXNhYmxlIHN0cmVhbXR5cGUgaWYgdGhlIHN0cmVhbSBkb2Vzbid0IGV4aXN0LCBzaW5jZQorCSAgdGhlbiBwbGF5aW5nIGEgdmlkZW8gYWZ0ZXIgYXVkaW8gd2lsbCBkaXNhYmxlIGJvdGggYW5kIG5vdGhpbmcKKwkgIHdpbGwgaGFwcGVuLiBGaXhlcyB0aGUgdGVzdHN1aXRlLgorCisyMDA1LTAxLTEwICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvdjRsL2dzdHY0bHhvdmVybGF5LmM6IChnc3RfdjRsX3hvdmVybGF5X2ludGVyZmFjZV9pbml0KSwKKwkoZ3N0X3Y0bF94b3ZlcmxheV9zZXRfeHdpbmRvd19pZCk6CisJKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYzogKGdzdF92NGwyX3hvdmVybGF5X2ludGVyZmFjZV9pbml0KSwKKwkoZ3N0X3Y0bDJfeG92ZXJsYXlfc2V0X3h3aW5kb3dfaWQpOgorCSAgQWRkIGRlYnVnIGNhdGVnb3JpZXMsIGZpeCBvdmVybGF5IGRpc2FibGluZy4KKworMjAwNS0wMS0xMCAgU3RlcGhhbmUgTE9FVUlMTEVUICA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX2NsYXNzX2luaXQpLCAoZ3N0X2Fsc2FfZ2V0X2NhcHMpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5oOgorCSAgQWRkIEhXIHByb2JpbmcgZm9yIHBlcmlvZF9jb3VudC9zaXplIGFuZCBidWZmZXJfc2l6ZSBNSVgvTUFYCisJICBBZGp1c3QgZGVmYXVsdC91c2VyIGRlZmluZWQgdmFsdWUgaWYgb3V0IG9mIGJvdW5kcworCSAgU2hvdWxkIGZpeCBidWcgIzE2MjAyNAorCisyMDA1LTAxLTA5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9oYW5kbGVfc2lua19ldmVudCk6CisJICBGaXggd2FybmluZyAoIzE2MTE5MSkuCisKKzIwMDUtMDEtMDkgIFN0ZXBoYW5lIExPRVVJTExFVCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBleHQvZHZkcmVhZC9zdHJlYW1fbGFiZWxzLmM6CisJKGR2ZHJlYWRzcmNfZ2V0X2F1ZGlvX3N0cmVhbV9sYWJlbHMpOgorCSAgRml4IHdhcm5pbmcgKGluaXQgdGhlIGdvb2QgdmFyaWFibGUgaW4gc3dpdGNoIGRlZmF1bHQpCisKKzIwMDUtMDEtMDkgIEtvb3AgTWFzdCAgPGt3bUByYWluYm93LXJ1bm5lci5ubD4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3R0YS9nc3R0dGFwYXJzZS5jOiAoZ3N0X3R0YV9zcmNfZXZlbnQpOgorCSAgRml4IGdjYy0yLjk1IGNvbXBpbGUgKCMxNjM0ODUpLgorCisyMDA1LTAxLTA5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY2VuY19pbml0KSwKKwkoZ3N0X2ZsYWNlbmNfc2Vla19jYWxsYmFjayksIChnc3RfZmxhY2VuY193cml0ZV9jYWxsYmFjayksCisJKGdzdF9mbGFjZW5jX3RlbGxfY2FsbGJhY2spLCAoZ3N0X2ZsYWNlbmNfY2hhaW4pLAorCShnc3RfZmxhY2VuY19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5oOgorCSAgVXBkYXRlIGZvciBBUEkgY2hhbmdlIGluIGZsYWMtMS4xLjEuIFVwZGF0ZSByZXF1aXJlbWVudCBpbgorCSAgY29uZmlndXJlLmFjLiBGaXhlcyAjMTYyOTc0LgorCisyMDA1LTAxLTA5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdyb3VwX2Rlc3Ryb3kpOgorCSAgUmVtb3ZlIGhhY2sgdG8gZ2V0IHJpZCBvZiBhc3NlcnQgYW5kIGdldCByaWQgb2YgdW5saW5rZWQKKwkgIHNpZ25hbHMgcHJvcGVybHkuCisKKzIwMDUtMDEtMDkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoc2V0dXBfc291cmNlKToKKwkgIFNldCBzb3VyY2UgdG8gTlVMTCBzbyB0aGF0IHJlc291cmNlcyBhcmUgZnJlZSdlZC4gRml4ZXMgaXNzdWVzCisJICB3aXRoIHBsYXliYWNrIG9mIENEREEgYW5kIHNpbWlsYXIgZGV2aWNlLWFjY2Vzc2luZyB0aGluZ3MuCisKKzIwMDUtMDEtMDkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHRlc3RzdWl0ZS9lbWJlZC9NYWtlZmlsZS5hbToKKwkgIHRlc3QtPm5vaW5zdCwgZml4IG1ha2UgdGVzdCBpbiBidWlsZGJvdC4KKworMjAwNS0wMS0wOSAgU3RlcGhhbmUgTE9FVUlMTEVUICA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGV4dC9kdmRyZWFkL3N0cmVhbV9sYWJlbHMuYzogbmV3IGZpbGUKKwkqIGV4dC9kdmRyZWFkL3N0cmVhbV9sYWJlbHMuaDogbmV3IGZpbGUKKwkqIGV4dC9kdmRyZWFkL01ha2VmaWxlLmFtOgorCSogZXh0L2R2ZHJlYWQvZHZkcmVhZHNyYy5jOiAoX3NlZWtfdGl0bGUpOgorCSAgRXh0cmFjdCBhdWRpbyBzdHJlYW0gbGFiZWwgZnJvbSBEVkQgSUZPIGZpbGVzLgorCSAgSXQgb25seSBkdW1wIHRoZW0gb24gdGhlIGNvbnNvbGUgZm9yIG5vdywgc3RpbGwgaGF2ZSB0bworCSAgbWFrZSBwbGF5YmluIGF3YXJlIG9mIHRoZW0uCisKKzIwMDUtMDEtMDkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoc2V0dXBfc291cmNlKToKKwkgIEZpeCBoYW5naW5nIHN1YnMuCisKKzIwMDUtMDEtMDkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ3N0X3BsYXlfYmFzZV9iaW5faW5pdCksCisJKGdlbl9wcmVyb2xsX2VsZW1lbnQpLCAocmVtb3ZlX2dyb3VwcyksIChzZXR1cF9zdWJ0aXRsZSksCisJKGdlbl9zb3VyY2VfZWxlbWVudCksIChzZXR1cF9zb3VyY2UpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmg6CisJICBNdWx0aXBsZSAuc3ViIGZpbGVzIGlzIGp1c3QgYSBzdHVwaWQgaWRlYS4uLiBGaXggc29tZSB0aHJlYWRpbmcKKwkgIG1pc3Rha2VzLiBJbnRlcmVzdGluZ2x5LCBleHRlcm5hbCAuc3ViIGZpbGVzIGNhdXNlIHBsYXliaW4gdG8KKwkgIGhhbmcsIEkgZG9uJ3Qga25vdyB3aHkuLi4gUGFyc2luZyBmaXhlcyBjb250cmlidXRlZCBieSBGcmFuw6dvaXMKKwkgIEtvb21hbiA8Zmtvb21hbkB0dXhlZC5uZXQ+LgorCisyMDA1LTAxLTA5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiB0ZXN0c3VpdGUvZW1iZWQvTWFrZWZpbGUuYW06CisJICBGaXggYnVpbGRib3QuCisKKzIwMDUtMDEtMDkgIEdlcmdlbHkgTmFneSAgPGFsZ2Vybm9uQGJvbmVodW50ZXIucnVsZXoub3JnPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiAoZ3N0X3BuZ2VuY19jbGFzc19pbml0KSwKKwkoZ3N0X3BuZ2VuY19pbml0KSwgKGdzdF9wbmdlbmNfY2hhaW4pLCAoZ3N0X3BuZ2VuY19nZXRfcHJvcGVydHkpLAorCShnc3RfcG5nZW5jX3NldF9wcm9wZXJ0eSk6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5oOgorCSAgQWRkIGNvbXByZXNzaW9uIGxldmVsIHByb3BlcnR5ICgjMTYzMzIzKS4KKworMjAwNS0wMS0wOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZXhhbXBsZXMvY2Fwc2ZpbHRlci9jYXBzZmlsdGVyMS5jOiAobWFpbik6CisJKiBleGFtcGxlcy9zZWVraW5nL3NwaWRlcl9zZWVrLmM6IChtYWtlX3NwaWRlcl9waXBlbGluZSk6CisJKiBleHQvZHZkcmVhZC9NYWtlZmlsZS5hbToKKwkqIGV4dC9kdmRyZWFkL2RlbW8tcGxheToKKwkqIGV4dC9kdmRyZWFkL2RlbW8tcGxheS5jOgorCSogZ2NvbmYvZ3N0cmVhbWVyLnNjaGVtYXMuaW46CisJKiBnc3QtbGlicy9nc3QvZ2NvbmYvZ2NvbmYuYzoKKwkqIHN5cy92NGwvVE9ETzoKKwkqIHRlc3RzdWl0ZS9NYWtlZmlsZS5hbToKKwkqIHRlc3RzdWl0ZS9lbWJlZC9NYWtlZmlsZS5hbToKKwkqIHRlc3RzdWl0ZS9lbWJlZC9lbWJlZC5jOiAoY2JfZXhwb3NlKSwgKG1haW4pOgorCSAgUmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIHh2aWRlb3NpbmssIGZpeCBleGFtcGxlcyAoIzE0MDg0NSkuCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdyb3VwX2Rlc3Ryb3kpOgorCSAgQXBwYXJlbnRseSwgZGlzcG9zYWwgZG9lcyBub3QgdW5saW5rIC0gc28gZG8gZXhwbGljaXRlbHkuCisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jOiAoZ3N0X2Fsc2Ffc2lua19jaGVja19ldmVudCk6CisJICBBZGQgZGVidWcuCisKKzIwMDUtMDEtMDkgIE1hY2llaiBLYXRhZmlhc3ogPG1hdGhyaWNrQGZyZWVkZXNrdG9wLm9yZz4KKworCSogUkVBRE1FOiBmaXggUEtHX0NPTkZJR19QQVRIIGluc3RydWN0aW9ucywgd2hhdCB3YXMgdGhlcmUKKwlwcmV2aW91c2x5IHdhcyBicmVha2luZyBkZWZhdWx0IHNlYXJjaCBwYXRoLCBub3QgbmljZS4gCisJRml4ZXMgIzE2MzM1OAorCisyMDA1LTAxLTA5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXVkaW9zY2FsZS9nc3RhdWRpb3NjYWxlLmM6IChnc3RfYXVkaW9zY2FsZV9pbml0KSwKKwkoZ3N0X2F1ZGlvc2NhbGVfY2hhaW4pOgorCSAgJSNeQF4jQF5AI14jQF4jQF5AI15AI15AI15AI14jQF4jQF4jQF5AI14jQCBmaXggc2Vla2luZworCSAgd2hlbiByZXNhbXBsaW5nIC0gaG93IHRoZSBeQCReIUBeISBpcyB0aGlzIHBvc3NpYmxlPyE/CisKKzIwMDUtMDEtMDkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX2NoYW5nZV9zdGF0ZSk6CisJICBSZXNldCB2YXJpYWJsZXMgb24gUkVBRFkuCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmM6IChnc3RfbWF0cm9za2FfbXV4X3JlcXVlc3RfbmV3X3BhZCksCisJKGdzdF9tYXRyb3NrYV9tdXhfbG9vcCk6CisJICBSZXF1aXJlIGRhdGEgYmVmb3JlIHdyaXRpbmcgaGVhZGVyLgorCisyMDA1LTAxLTA5ICBGcmFuY2lzIExhYm9udGUgIDxmcmFuY2lzX2xhYm9udGVAaG90bWFpbC5jb20+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2NoYWluKToKKwkgIERvbid0IGNhbGwgbWFkX3N0cmVhbV9zeW5jKCkgZGlyZWN0bHkgYWZ0ZXIgcmVjb3ZlcmluZyBzeW5jLgorCSAgRml4ZXMgIzE1MTY2MS4KKworMjAwNS0wMS0wOSAgTWFydGluIEVpa2VybWFubiAgPG1laWtlckB1cGIuZGU+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9zbmFwc2hvdC9nc3RzbmFwc2hvdC5jOiAoZ3N0X3NuYXBzaG90X2NsYXNzX2luaXQpLAorCShzbmFwc2hvdF9oYW5kbGVyKSwgKGdzdF9zbmFwc2hvdF9zaW5rY29ubmVjdCksCisJKGdzdF9zbmFwc2hvdF9jaGFpbik6CisJICBBbGxvY2F0ZSByZXNvdXJjZXMgd2hlbiByZXF1aXJlZCwgZml4IHJlY3Vyc2l2ZSBzaWduYWwgZW1pc3Npb24KKwkgIGFuZCBmaXggY2Fwcy4gRml4ZXMgIzE2MTY2Ny4KKworMjAwNS0wMS0wOSAgR2VyZ2VseSBOYWd5ICA8YWxnZXJub25AYm9uZWh1bnRlci5ydWxlei5vcmc+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IChnc3RfcG5nZGVjX3NyY19nZXRjYXBzKSwKKwkoZ3N0X3BuZ2RlY19jaGFpbik6CisJICBIYW5kbGUgb25seSA4LWJwcGMgKGJpdHMtcGVyLXBpeGVsLWNvbXBvbmVudCkgaW1hZ2VzLCBiZXR0ZXIKKwkgIGVycm9yIGhhbmRsaW5nIGFuZCBjb3JyZWN0IHN0cmlkZXMuIEZpeGVzICMxNjMxNzcuCisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiAoZ3N0X3BuZ2VuY19zaW5rbGluayksCisJKGdzdF9wbmdlbmNfY2hhaW4pOgorCSAgQmV0dGVyIGVycm9yIGhhbmRsaW5nLiBGaXhlcyAjMTYzMzQ4LgorCisyMDA1LTAxLTA5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZHZkbmF2L2R2ZG5hdnNyYy5jOiAoZHZkbmF2c3JjX2dldF90eXBlKSwKKwkoZHZkbmF2c3JjX3VyaV9nZXRfdHlwZSksIChkdmRuYXZzcmNfdXJpX2dldF9wcm90b2NvbHMpLAorCShkdmRuYXZzcmNfdXJpX2dldF91cmkpLCAoZHZkbmF2c3JjX3VyaV9zZXRfdXJpKSwKKwkoZHZkbmF2c3JjX3VyaV9oYW5kbGVyX2luaXQpOgorCSAgQWRkIERWRC1uYXYgVVJJIChkdmRuYXY6Ly8pIGZvciBUb3RlbSB0ZXN0aW5nIHB1cnBvc2VzLgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnZW5fc291cmNlX2VsZW1lbnQpOgorCSAgQWRkIE1NUyB0byBzdHJlYW1pbmcgVVJJcy4KKworMjAwNS0wMS0wOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19uYXZpZ2F0aW9uX3NlbmRfZXZlbnQpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzoKKwkoZ3N0X3h2aW1hZ2VzaW5rX25hdmlnYXRpb25fc2VuZF9ldmVudCk6CisJICBDaGVjayBmb3IgcGFkIGF2YWlsYWJpbGl0eSBiZWZvcmUgc2VuZGluZyBldmVudC4KKworMjAwNS0wMS0wOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LXBsdWdpbnMuc3BlYy5pbjoKKwkgIEFkZCBzdWJwYXJzZS4KKworMjAwNS0wMS0wOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSAgU2luY2Ugd2UgdXNlIGZ1bmN0aW9ucyBmcm9tIENWUywgdXAgcmVxdWlyZW1lbnQuCisKKzIwMDUtMDEtMDggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9NYWtlZmlsZS5hbToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ3N0X3BsYXlfYmFzZV9iaW5fY2xhc3NfaW5pdCksCisJKGdyb3VwX2Rlc3Ryb3kpLCAoZ3JvdXBfY29tbWl0KSwgKGdyb3VwX2lzX211dGVkKSwKKwkoZ2VuX3ByZXJvbGxfZWxlbWVudCksIChhZGRfc3RyZWFtKSwgKHVua25vd25fdHlwZSksCisJKHByb2JlX3RyaWdnZXJlZCksIChwcmVyb2xsX3VubGlua2VkKSwgKG11dGVfc3RyZWFtKSwKKwkoc2lsZW5jZV9zdHJlYW0pLCAobmV3X2RlY29kZWRfcGFkKSwgKHNldHVwX3N1YnN0cmVhbXMpLAorCShzZXR1cF9zb3VyY2UpLCAoZ2V0X2FjdGl2ZV9zb3VyY2UpLCAobXV0ZV9ncm91cF90eXBlKSwKKwkobXV0ZWRfZ3JvdXBfY2hhbmdlX3N0YXRlKSwgKHNldF9hY3RpdmVfc291cmNlKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fc2V0X3Byb3BlcnR5KSwgKGdzdF9wbGF5X2Jhc2VfYmluX2dldF9wcm9wZXJ0eSksCisJKHBsYXlfYmFzZV9lb3MpLCAoZ3N0X3BsYXlfYmFzZV9iaW5fY2hhbmdlX3N0YXRlKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5oOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGFkZF9zaW5rKSwgKHNldHVwX3NpbmtzKToKKwkqIGdzdC9wbGF5YmFjay9nc3RzdHJlYW1pbmZvLmM6IChnc3Rfc3RyZWFtX2luZm9fY2xhc3NfaW5pdCksCisJKGdzdF9zdHJlYW1faW5mb19kaXNwb3NlKSwgKHN0cmVhbV9pbmZvX211dGVfcGFkKSwKKwkoc3RyZWFtX2luZm9fY2hhbmdlX3N0YXRlKSwgKGdzdF9zdHJlYW1faW5mb19zZXRfbXV0ZSk6CisJKiBnc3QvcGxheWJhY2svZ3N0c3RyZWFtc2VsZWN0b3IuYzogKGdzdF9zdHJlYW1fc2VsZWN0b3JfZ2V0X3R5cGUpLAorCShnc3Rfc3RyZWFtX3NlbGVjdG9yX2Jhc2VfaW5pdCksIChnc3Rfc3RyZWFtX3NlbGVjdG9yX2NsYXNzX2luaXQpLAorCShnc3Rfc3RyZWFtX3NlbGVjdG9yX2luaXQpLCAoZ3N0X3N0cmVhbV9zZWxlY3Rvcl9kaXNwb3NlKSwKKwkoZ3N0X3N0cmVhbV9zZWxlY3Rvcl9nZXRfbGlua2VkX3BhZCksCisJKGdzdF9zdHJlYW1fc2VsZWN0b3JfZ2V0X2NhcHMpLCAoZ3N0X3N0cmVhbV9zZWxlY3Rvcl9saW5rKSwKKwkoZ3N0X3N0cmVhbV9zZWxlY3Rvcl9nZXRfbGlua2VkX3BhZHMpLAorCShnc3Rfc3RyZWFtX3NlbGVjdG9yX3JlcXVlc3RfbmV3X3BhZCksIChnc3Rfc3RyZWFtX3NlbGVjdG9yX2NoYWluKToKKwkqIGdzdC9wbGF5YmFjay9nc3RzdHJlYW1zZWxlY3Rvci5oOgorCSAgQWRkaW5nIHN0cmVhbSBzZWxlY3Rpb24gc3VwcG9ydCBwbHVzIHJlcXVpcmVkIHByb3BlcnRpZXMgZm9yCisJICBhcHBsaWNhdGlvbnMgdG8gdXNlIHRoaXMuIEZ1bGx5IGZpeGVzICMxMDA5MzEuCisKKzIwMDUtMDEtMDggIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L2dhbWVzL2dzdHB1enpsZS5jOiAobmF2X2V2ZW50X2hhbmRsZXIpOgorCSAgLSBoYW5kbGUgbmF2IGV2ZW50cyBkaWZmZXJlbnRseTogZm9yd2FyZCBldmVyeSBldmVudCBubyBtYXR0ZXIgaWYgaXQKKwkgICAgd2FzIGhhbmRsZWQgb3Igbm90LgorCSAgLSB0cmFuc2xhdGUgZXZlbnRzCisJICBZb3UgY2FuIG5vdyBjaGVhdCBieSB1c2luZyBuYXZpZ2F0aW9udGVzdCAhIHB1enpsZSBhbmQgbW92aW5nIHRoZQorCSAgbW91c2UgY2xvc2UgdG8gdGhlIGVkZ2Ugb2YgYSB0aWxlLiA7KQorCisyMDA1LTAxLTA4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX3BhZF9uZXcpOgorCSogZXh0L29nZy9nc3RvZ21wYXJzZS5jOiAoZ3N0X29nbV90ZXh0X3BhcnNlX2dldF90eXBlKSwKKwkoZ3N0X29nbV90ZXh0X3BhcnNlX2Jhc2VfaW5pdCksIChnc3Rfb2dtX3RleHRfcGFyc2VfaW5pdCksCisJKGdzdF9vZ21fcGFyc2VfZ2V0X3NpbmtfcXVlcnl0eXBlcyksIChnc3Rfb2dtX3BhcnNlX3NpbmtfY29udmVydCksCisJKGdzdF9vZ21fcGFyc2Vfc2lua19xdWVyeSksIChnc3Rfb2dtX3BhcnNlX2NoYWluKSwKKwkoZ3N0X29nbV9wYXJzZV9wbHVnaW5faW5pdCk6CisJKiBleHQvcGFuZ28vZ3N0dGV4dG92ZXJsYXkuYzogKGdzdF90ZXh0b3ZlcmxheV9saW5rZWRwYWRzKSwKKwkoZ3N0X3RleHRvdmVybGF5X2xpbmspLCAoZ3N0X3RleHRvdmVybGF5X2dldGNhcHMpLAorCShnc3RfdGV4dG92ZXJsYXlfZXZlbnQpLCAoZ3N0X3RleHRvdmVybGF5X3ZpZGVvX2NoYWluKSwKKwkoZ3N0X3RleHRvdmVybGF5X2xvb3ApLCAoZ3N0X3RleHRvdmVybGF5X2luaXQpLCAocGx1Z2luX2luaXQpOgorCSogZXh0L3BhbmdvL2dzdHRleHRvdmVybGF5Lmg6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfc3RyZWFtKSwKKwkoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50KSwKKwkoZ3N0X21hdHJvc2thX2RlbXV4X3N5bmNfc3RyZWFtcyksCisJKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwKSwKKwkoZ3N0X21hdHJvc2thX2RlbXV4X3N1YnRpdGxlX2NhcHMpLAorCShnc3RfbWF0cm9za2FfZGVtdXhfcGx1Z2luX2luaXQpOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAoY2xvc2VfcGFkX2xpbmspOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9pbml0KSwKKwkoZ2VuX3ByZXJvbGxfZWxlbWVudCksIChyZW1vdmVfZ3JvdXBzKSwgKGFkZF9zdHJlYW0pLAorCShuZXdfZGVjb2RlZF9wYWQpLCAoc2V0dXBfc3VidGl0bGVzKSwgKGdlbl9zb3VyY2VfZWxlbWVudCksCisJKHNldHVwX3NvdXJjZSk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uaDoKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnZW5fdGV4dF9lbGVtZW50KSwgKHNldHVwX3NpbmtzKToKKwkqIGdzdC9zdWJwYXJzZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9zdWJwYXJzZS9nc3RzdWJwYXJzZS5jOiAoZ3N0X3N1YnBhcnNlX2dldF90eXBlKSwKKwkoZ3N0X3N1YnBhcnNlX2Jhc2VfaW5pdCksIChnc3Rfc3VicGFyc2VfY2xhc3NfaW5pdCksCisJKGdzdF9zdWJwYXJzZV9pbml0KSwgKGdzdF9zdWJwYXJzZV9mb3JtYXRzKSwKKwkoZ3N0X3N1YnBhcnNlX2V2ZW50bWFzayksIChnc3Rfc3VicGFyc2VfZXZlbnQpLAorCShnc3Rfc3VicGFyc2VfaGFuZGxlX2V2ZW50KSwgKGNvbnZlcnRfZW5jb2RpbmcpLCAoZ2V0X25leHRfbGluZSksCisJKHBhcnNlX21kdmRzdWIpLCAocGFyc2VfbWR2ZHN1Yl9pbml0KSwgKHBhcnNlX3N1YnJpcCksCisJKHBhcnNlX3N1YnJpcF9kZWluaXQpLCAocGFyc2Vfc3VicmlwX2luaXQpLCAocGFyc2VfbXBzdWIpLAorCShwYXJzZV9tcHN1Yl9kZWluaXQpLCAocGFyc2VfbXBzdWJfaW5pdCksCisJKGdzdF9zdWJwYXJzZV9idWZmZXJfZm9ybWF0X2F1dG9kZXRlY3QpLAorCShnc3Rfc3VicGFyc2VfZm9ybWF0X2F1dG9kZXRlY3QpLCAoZ3N0X3N1YnBhcnNlX2xvb3ApLAorCShnc3Rfc3VicGFyc2VfY2hhbmdlX3N0YXRlKSwgKGdzdF9zdWJwYXJzZV90eXBlX2ZpbmQpLAorCShwbHVnaW5faW5pdCk6CisJKiBnc3Qvc3VicGFyc2UvZ3N0c3VicGFyc2UuaDoKKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAob2dtdGV4dF90eXBlX2ZpbmQpLAorCShwbHVnaW5faW5pdCk6CisJICBBZGQgc3VidGl0bGUgc3VwcG9ydCwgLnN1YiBwYXJzZXIgKHN1cHBvcnRzIFNSVCBhbmQgTVBzdWIpLAorCSAgT0dNIHRleHQgc3VwcG9ydCwgTWF0cm9za2EgVVRGLTggdGV4dCBzdXBwb3J0LCBkZWFkbG9jayBmaXhlcworCSAgYWxsIG92ZXIgdGhlIHBsYWNlLCBzdWJ0aXRsZSBhd2FyZW5lc3MgaW4gZGVjb2RlYmluL3BsYXliaW4KKwkgIGFuZCBzb21lIGZpeGVzIHRvIHRleHRvdmVybGF5IHRvIGhhbmRsZSBzdWJ0aXRsZXMgaW4gYSBzdHJlYW0KKwkgIGNvcnJlY3RseS4gRml4ZXMgIzEwMDkzMS4KKworMjAwNS0wMS0wOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L3ZvcmJpcy92b3JiaXNkZWMuYzogKHZvcmJpc19kZWNfc3JjX3F1ZXJ5KToKKwkgIENoZWNrIGZvciBwYWQgYXZhaWxhYmlsaXR5IGJlZm9yZSBkb2luZyBhIHF1ZXJ5IG9uIGl0LgorCisyMDA1LTAxLTA4ICBTdGVwaGFuZSBMT0VVSUxMRVQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6CisJICByZWFsbHkgZml4IGJwcDI0LzMyIGR2ZGVjIGNhcHMgKGNsYXNzaWMgcmdiYSBpbmRlZWQpCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzoKKwkoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX2V4dF9jb250ZW50X2Rlc2MpOgorCSAgZG9uJ3Qgc2VuZCB0ZXh0IHRhZ3MgaWYgdGhleSBhcmUgZW1wdHkgKGJpcyByZXBldGl0YSkKKworMjAwNS0wMS0wOCAgU3RlcGhhbmUgTE9FVUlMTEVUICA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSByZW1vdmUgdW5uZWVkZWQgY29tbWVudCBmcm9tIGR2ZGVjCisJICAocmVsYXRlZCB0byBEViA0Q0MgY29kZXMgaW4gQVZJIGZpbGVzKQorCSAgbW92ZWQgdGhlbSBpbiBnc3RyZWFtZXIvZG9jcy9yYW5kb20vbWltZXR5cGVzCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzoKKwkoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX2V4dF9jb250ZW50X2Rlc2MpOgorCSBkb24ndCBzZW5kIHRleHQgdGFncyBpZiB0aGV5IGFyZSBlbXB0eQorCSBmaXggbWVtIGxlYWsgb24gZXJyb3IgcGF0aAorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvYXZjb2RlYy5oOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29kZWNtYXAuYzoKKwkoZ3N0X2ZmbXBlZ19waXhmbXRfdG9fY2FwcyksIChnc3RfZmZtcGVnX2NhcHNfdG9fcGl4Zm10KSwKKwkoZ3N0X2ZmbXBlZ2NzcF9hdnBpY3R1cmVfZmlsbCk6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9pbWdjb252ZXJ0LmM6IChpbWdfZ2V0X2FscGhhX2luZm8pOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvaW1nY29udmVydF90ZW1wbGF0ZS5oOgorCSBhZGRzIEJHUjMyIGFuZCBCR1JBMzIgdG8gZmZtcGVnY29sb3JzcGFjZQorCSAgKHN0aWxsIGJhZCBjb2xvcnMsIGZpeGluZyBpdCBvbiBuZXh0IGNvbW1pdCkKKwkgIGhlbHBzIHdpdGggZHZkZWMgb3V0cHV0aW5nIEJHUjMyCisKKzIwMDUtMDEtMDggIFN0ZXBoYW5lIExPRVVJTExFVCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzoKKwkgRml4IGF1ZGlvIGNhcHMgaSBqdXN0IGJyb2tlIChtaXNzaW5nICcsJykKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfZ2V0X3R5cGUpLAorCShnc3RfbWF0cm9za2FfbXV4X3Jlc2V0KToKKwkgRml4IHR5cG8gKyBhZGQgRklYTUUgYWJvdXQgb2xkICJ4LWdzdC1tZXRhZGF0YSIgY3JhcAorCisyMDA1LTAxLTA3ICBTdGVwaGFuZSBMT0VVSUxMRVQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZXh0L2R2L2RlbW8tcGxheS5jOiAobWFpbik6CisJIHh2aWRlb3NpbmsgLT4geHZpbWFnZXNpbmsKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOgorCSBjaGFuZ2UgcmdiIDMyLzMyIGNhcHMgdG8gMjQvMzIgKG5vIGFscGhhKQorCSBjaGFuZ2UgbmIgb2YgY2hhbm5lbHMgdG8gYmUgYSBsaXN0ICgyIG9yIDQsIG5vdCAyKQorCSBjaGFuZ2Ugc2FtcGxlIHJhdGUgdG8gYmUgYSBsaXN0ICgzMiwgNDQuMSwgNDgga0h6KSBub3QgYSByYW5nZQorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6CisJKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19leHRfY29udGVudF9kZXNjKToKKwkgQWRkICdkYXRlL3llYXInIHRvIGV4dHJhY3RlZCBtZXRhZGF0YSBsaXN0CisKKzIwMDUtMDEtMDcgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChnc3RfYXVkaW9fY29udmVydF9maXhhdGUpOgorCSAgVGhlIHJldHVybiB2YWx1ZSBvZiBmaXhhdGVfdG8gZG9lcyBub3QgaW1wbHkgdGhhdCB0aGUgcmVxdWVzdGVkCisJICB2YWx1ZSB3YXMgc2V0LCBzbyBkb24ndCBhc3N1bWUuCisKKzIwMDUtMDEtMDcgIEdlcmdlbHkgTmFneSAgPGFsZ2Vybm9uQGJvbmVodW50ZXIucnVsZXoub3JnPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2RlYy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzogKGdzdF9wbmdlbmNfYmFzZV9pbml0KSwKKwkoZ3N0X3BuZ2VuY19zaW5rbGluayksIChnc3RfcG5nZW5jX2luaXQpLCAoZ3N0X3BuZ2VuY19jaGFpbik6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5oOgorCSAgQWxwaGEgc3VwcG9ydCAoZW5jb2RlcjsgIzE2MzE2MSksIG1pbWUgZml4YWdlLgorCisyMDA1LTAxLTA3ICBTZWJhc3RpZW4gQ290ZSAgPHNjNUBoZXJtZXMudXNoZXJiLmNhPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZmFhYy9nc3RmYWFjLmM6IChnc3RfZmFhY19vdXRwdXRmb3JtYXRfZ2V0X3R5cGUpLAorCShnc3RfZmFhY19jbGFzc19pbml0KSwgKGdzdF9mYWFjX2luaXQpLCAoZ3N0X2ZhYWNfc3JjY29ubmVjdCksCisJKGdzdF9mYWFjX3NldF9wcm9wZXJ0eSksIChnc3RfZmFhY19nZXRfcHJvcGVydHkpOgorCSogZXh0L2ZhYWMvZ3N0ZmFhYy5oOgorCSAgQWxsb3cgZm9yIEFEVFMgb3V0cHV0ICgjMTUzNDM0KS4KKworMjAwNS0wMS0wNyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOiAoZ3N0X3Y0bDJzcmNfZ2V0Y2Fwcyk6CisJICBGaXggYWdhaW5zdCB0ZW1wbGF0ZSAoIzE1MDU3NikuCisKKzIwMDUtMDEtMDYgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L2dhbWVzL2dzdHB1enpsZS5jOiAoZHJhd19wdXp6bGUpOgorCSAgZG9uJ3QgZHJhdyBhIHB1enpsZSBpZiBlaXRoZXIgd2lkdGggb3IgaGVpZ2h0IG9mIHRpbGVzIHdvdWxkIGJlIDAuCisKKzIwMDUtMDEtMDYgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L2dhbWVzL2dzdHB1enpsZS5jOiAoZ3N0X3B1enpsZV9nZXRfdHlwZSksCisJKGdzdF9wdXp6bGVfY2xhc3NfaW5pdCksIChnc3RfcHV6emxlX2ZpbmFsaXplKToKKwkgIG5vIG1lbWxlYWtzLCBwbGVhc2UKKwkoZ3N0X3B1enpsZV9jcmVhdGUpLCAoZ3N0X3B1enpsZV9pbml0KSwKKwkoZ3N0X3B1enpsZV9zZXRfcHJvcGVydHkpLCAoZ3N0X3B1enpsZV9zZXR1cCk6CisJICBjaGFuZ2UgaW5pdGlhbGl6YXRpb24gY29kZSBhcm91bmQgc28gd2UgZG9uJ3QgcmVzaHVmZmxlIG9uIHJlc2l6ZQorCShkcmF3X3B1enpsZSk6CisJICBmaXggYW5vdGhlciBzdHVwaWQgdHlwbworCisyMDA1LTAxLTA2ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9nYW1lcy9nc3R2aWRlb2ltYWdlLmM6IChjb3B5X2hsaW5lX1lVWTIpOgorCSAgZml4IHN0dXBpZCB0eXBvIHRoYXQgYm9ya2VkIGNvcHlpbmcgb24gWVVZMgorCisyMDA1LTAxLTA2ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9nYW1lcy9nc3RwdXp6bGUuYzogKGRyYXdfcHV6emxlKToKKwkgIGZpeCBlZGdlcyB3aGVuIGltYWdlIHNpemVzIGFyZW4ndCBtdWx0aXBsZXMgb2YgdGlsZSBzaXplcworCisyMDA1LTAxLTA2ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9nYW1lcy9nc3RwdXp6bGUuYzogKGdzdF9wdXp6bGVfYmFzZV9pbml0KToKKwkgIG1ha2UgUkdCIGVuZGlhbm5lc3Mgd29yayBjb3JyZWN0bHkKKwkoZ3N0X3B1enpsZV9zaG93KSwgKGdzdF9wdXp6bGVfc3dhcCksIChnc3RfcHV6emxlX21vdmUpOgorCSAgcmVmYWN0b3IgYW5kIGZpeCByYWNlIHdpdGggaW5pdGlhbCBzaHVmZmxpbmcKKwkobmF2X2V2ZW50X2hhbmRsZXIpOgorCSAgYWxsb3cgdXNpbmcgdGhlIG1vdXNlIHRvIHB1enpsZQorCShkcmF3X3B1enpsZSk6CisJICBpbnNpc3Qgb24gdGlsZXMgaGF2aW5nIHdpZHRoIGFuZCBoZWlnaHQgYXMgbXVsdGlwbGVzIG9mIDQgdG8gZ2V0CisJICBjbGVhbiBZVVYgaW1hZ2UgaGFuZGxpbmcKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9uZXcpLAorCShnc3RfeHZpbWFnZXNpbmtfaGFuZGxlX3hldmVudHMpLCAoZ3N0X3h2aW1hZ2VzaW5rX2J1ZmZlcl9hbGxvYyk6CisJICBzL0RFQlVHL0xPRy8gZm9yIGNvbW1vbiBtZXNzYWdlcworCShnc3RfeHZpbWFnZXNpbmtfbmF2aWdhdGlvbl9zZW5kX2V2ZW50KToKKwkgIGZpeCBtb3VzZSBldmVudCB0cmFuc2xhdGlvbiB0byBub3QgaW5jbHVkZSBzY3JlZW4gUEFSCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX25hdmlnYXRpb25fc2VuZF9ldmVudCk6CisJICBmaXggbW91c2UgZXZlbnQgdHJhbnNsYXRpb24gdG8gYWN0dWFsbHkgd29yaworCisyMDA1LTAxLTA2ICBTdGVwaGFuZSBMT0VVSUxMRVQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6CisJKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19leHRfY29udGVudF9kZXNjKToKKwkgRXh0cmFjdCBUcmFja051bWJlciBtZXRhZGF0YSArIGNsZWFuIHVwIGNvZGUKKwkqIGdzdC9nYW1lcy9nc3R2aWRlb2ltYWdlLmM6IChnc3RfdmlkZW9faW1hZ2VfZHJhd19yZWN0YW5nbGUpOgorCSBIb3BlIHRoaXMgaXMgdGhlIGdvb2QgZml4ICh2YXIgdXNlZCB1bml0aWFsaXNlZCkKKworMjAwNS0wMS0wNiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfY2hhaW4pOgorCSAgT25seSBpbmNyZW1lbnQgdGltZXN0YW1wIGlmIGl0J3MgdmFsaWQuIEZpeGVzIHJhdyBBQUMgc3RyZWFtcy4KKworMjAwNS0wMS0wNiAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QvZ2FtZXMvTWFrZWZpbGUuYW06CisJKiBnc3QvZ2FtZXMvZ3N0cHV6emxlLmM6CisJICBhZGQgYSBwdXp6bGUgZ2FtZSB3aXRoLi4uCisJKiBnc3QvZ2FtZXMvZ3N0dmlkZW9pbWFnZS5jOgorCSogZ3N0L2dhbWVzL2dzdHZpZGVvaW1hZ2UuaDoKKwkgIC4uLiBmdWxsIGNvbG9yc3BhY2Ugc3VwcG9ydCAodGhhdCBpbmNsdWRlcyBZVVY5IGFuZCBSR0IxNikpIHN0b2xlbgorCSAgZnJvbSB2aWRlb3Rlc3RzcmMgYW5kIG1hZGUgaW50byBzb21ldGhpbmcgdGhhdCB3b3VsZCBiZSBhIG5pY2UKKwkgIGxpYnJhcnkgZm9yIGEgbG90IG9mIG90aGVyIHBsdWdpbnMuCisKKzIwMDUtMDEtMDYgIFN0ZXBoYW5lIExPRVVJTExFVCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBjb25maWd1cmUuYWM6CisJIGRvbid0IGNvbXBpbGUgZmFhZCBwbHVnaW4gaWYgYSBSQyBvZiAyLjAgaXMgZm91bmQKKwkgRml4ZXMgIzE1NTM0NiAoYW5kIEZDMSBidWlsZGJvdCkKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOgorCShnc3RfYXNmX2RlbXV4X3Byb2Nlc3NfZXh0X2NvbnRlbnRfZGVzYyk6CisJIHRyeSB0byBtYWtlIFNvbGFyaXMgY29tcGlsZXIgaGFwcGllcgorCisyMDA1LTAxLTA2ICBQYXVsIEphY2sgIDxwamFja0BzZmFmLm9yZz4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L3NuYXBzaG90L2dzdHNuYXBzaG90LmM6IChnc3Rfc25hcHNob3RfY2xhc3NfaW5pdCk6CisJICBGaXggc2VnZmF1bHQgKCMxNjE2NjcpLgorCisyMDA1LTAxLTA1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19nZXRjYXBzKToKKwkgIEZpeCBmcmFtZXJhdGUgcmVwb3J0aW5nLgorCisyMDA1LTAxLTA1ICBTdGVwaGFuZSBMT0VVSUxMRVQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1pZHMuaDoKKwkqIGdzdC93YXZlbmMvcmlmZi5oOgorCSBBZGQgQU1SIChWQlIgYW5kIENCUikgaWRzIHRvIHJpZmYuaCBhdWRpbyBjb2RlYyBsaXN0CisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzoKKwkoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX2V4dF9jb250ZW50X2Rlc2MpLAorCShnc3RfYXNmX2RlbXV4X3Byb2Nlc3Nfb2JqZWN0KToKKwkgIFJldHJpZXZlIG1vcmUgdGFncyBmcm9tIEFTRiBmaWxlcyAoR2VucmUsIEFsYnVtVGl0bGUsIEFydGlzdCkKKworMjAwNS0wMS0wNSAgTWFydGluIEVpa2VybWFubiAgPG1laWtlckB1cGIuZGU+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdGR2ZGRlbXV4LmM6IChnc3RfZHZkX2RlbXV4X2NsYXNzX2luaXQpLAorCShnc3RfZHZkX2RlbXV4X2hhbmRsZV9kaXNjb250KToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdkZW11eC5jOiAoZ3N0X21wZWdfZGVtdXhfY2xhc3NfaW5pdCksCisJKGdzdF9tcGVnX2RlbXV4X2hhbmRsZV9kaXNjb250KToKKwkgIFJlY3JlYXRlIHBhZHMgb24gbmV3LW1lZGlhICgjMTYwNzMwKS4KKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYXJzZS5jOiAoZ3N0X21wZWdfcGFyc2VfbmV3X3BhZCk6CisJICBTZW5kIGRpc2NvbnQgZXZlbiBpZiBtYW5hZ2VyIGNoYW5nZXMgdGltZXN0YW1wcyAoIzE2MTkyOSkuCisKKzIwMDUtMDEtMDUgIFNlYmFzdGllbiBDb3RlICA8c2M1QGhlcm1lcy51c2hlcmIuY2E+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9yZXNhbXBsZS9yZXNhbXBsZS5jOiAoZ3N0X3Jlc2FtcGxlX3NpbmNfZnRfczE2KToKKwkgIEZpeCBpbnZhbGlkIG1lbW9yeSBhY2Nlc3MgKCMxNTkyMTEpLgorCisyMDA1LTAxLTA1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleGFtcGxlcy9nc3RwbGF5L3BsYXllci5jOiAobWFpbik6CisJICBEb24ndCBpdGVyYXRlLgorCSogZXhhbXBsZXMvc2Vla2luZy9zZWVrLmM6IChmaXhhdGUpLCAobWFrZV9wbGF5ZXJiaW5fcGlwZWxpbmUpOgorCSAgQWRkIHZpc3VhbGl6YXRpb25zLgorCSogZXh0L2E1MmRlYy9nc3RhNTJkZWMuYzogKGdzdF9hNTJkZWNfcHVzaCksCisJKGdzdF9hNTJkZWNfaGFuZGxlX2ZyYW1lKToKKwkgIFNldCBkdXJhdGlvbi4KKwkqIGV4dC9kdmRuYXYvZ3N0LWR2ZDoKKwkgIEFkZCBhdWRpb2NvbnZlcnQuIEZpeGVzICMxNjEzMjUuCisJKiBleHQvZHZkcmVhZC9kdmRyZWFkc3JjLmM6IChkdmRyZWFkc3JjX2dldCk6CisJICBFeHBsaWNpdGVseSBjYXNlIHRvIGdpbnQ2NC4gUG9zc2libGUgdmFsZ3JpbmQgZXJyb3IuCisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5LmM6IChjYXBzX3NldCksIChzZXR1cF9zaXplKSwKKwkoZ3N0X3BsYXlfdGlja19jYWxsYmFjayksIChnc3RfcGxheV9jaGFuZ2Vfc3RhdGUpLAorCShnc3RfcGxheV9kaXNwb3NlKSwgKGdzdF9wbGF5X2luaXQpLCAoZ3N0X3BsYXlfY2xhc3NfaW5pdCksCisJKGdzdF9wbGF5X3NldF9sb2NhdGlvbiksIChnc3RfcGxheV9nZXRfbG9jYXRpb24pLAorCShnc3RfcGxheV9zZWVrX3RvX3RpbWUpLCAoZ3N0X3BsYXlfc2V0X2RhdGFfc3JjKSwKKwkoZ3N0X3BsYXlfc2V0X3ZpZGVvX3NpbmspLCAoZ3N0X3BsYXlfc2V0X2F1ZGlvX3NpbmspLAorCShnc3RfcGxheV9zZXRfdmlzdWFsaXphdGlvbiksIChnc3RfcGxheV9jb25uZWN0X3Zpc3VhbGl6YXRpb24pLAorCShnc3RfcGxheV9nZXRfZnJhbWVyYXRlKSwgKGdzdF9wbGF5X2dldF9hbGxfYnlfaW50ZXJmYWNlKSwKKwkoZ3N0X3BsYXlfbmV3KToKKwkgIFVzZSBwbGF5YmluLiBGaXhlcyAjMTM5NzQ5IGFuZCAjMTQ3NzQ0LgorCSogZ3N0L2FwZXRhZy9hcGVkZW11eC5jOiAoZ3N0X2FwZV9kZW11eF9wYXJzZV90YWdzKToKKwkgIEFkZCBnZW5yZSB0YWcuCisJKiBnc3QvYXVkaW9zY2FsZS9nc3RhdWRpb3NjYWxlLmM6IChnc3RfYXVkaW9zY2FsZV9tZXRob2RfZ2V0X3R5cGUpLAorCShhdWRpb3NjYWxlX2dldF90eXBlKSwgKGdzdF9hdWRpb3NjYWxlX2Jhc2VfaW5pdCksCisJKGdzdF9hdWRpb3NjYWxlX2NsYXNzX2luaXQpLCAoZ3N0X2F1ZGlvc2NhbGVfZXhwYW5kX2NhcHMpLAorCShnc3RfYXVkaW9zY2FsZV9nZXRjYXBzKSwgKGdzdF9hdWRpb3NjYWxlX2ZpeGF0ZSksCisJKGdzdF9hdWRpb3NjYWxlX2xpbmspLCAoZ3N0X2F1ZGlvc2NhbGVfZ2V0X2J1ZmZlciksCisJKGdzdF9hdWRpb3NjYWxlX2RlY3JlYXNlX3JhdGUpLCAoZ3N0X2F1ZGlvc2NhbGVfaW5jcmVhc2VfcmF0ZSksCisJKGdzdF9hdWRpb3NjYWxlX2luaXQpLCAoZ3N0X2F1ZGlvc2NhbGVfZGlzcG9zZSksCisJKGdzdF9hdWRpb3NjYWxlX2NoYWluKSwgKGdzdF9hdWRpb3NjYWxlX3NldF9wcm9wZXJ0eSksCisJKGdzdF9hdWRpb3NjYWxlX2dldF9wcm9wZXJ0eSksIChwbHVnaW5faW5pdCk6CisJICBJbmRlbnQgcHJvcGVybHkuCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5jOiAoZ3N0X2R2ZF9kZW11eF9wcm9jZXNzX3ByaXZhdGUpOgorCSAgRml4IExQQ00uCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X3BhcnNlX3VkdGEpLAorCShxdGRlbXV4X3RhZ19hZGRfc3RyKSwgKHF0ZGVtdXhfdGFnX2FkZF9udW0pLAorCShxdGRlbXV4X3RhZ19hZGRfZ25yZSksIChxdGRlbXV4X3ZpZGVvX2NhcHMpOgorCSAgQWRkIG1vcmUgbWV0YWRhdGEgKGZpeGVzICMxNjI2NTYpLgorCisyMDA1LTAxLTA1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBiYWNrIHRvIGN2cworCis9PT0gcmVsZWFzZSAwLjguNyA9PT0KKworMjAwNS0wMS0wNSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogTkVXUzoKKwkqIFJFTEVBU0U6CisJKiBjb25maWd1cmUuYWM6CisJICByZWxlYXNpbmcgMC44LjcsICJIeXBlcnNwYWNlIgorCisyMDA1LTAxLTA1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJcGF0Y2ggYnk6IFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0LmkubUB6ZW4uY28udWs+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOgorCSBGaXggZm9yICMxNjI5MjQgLSBmcmVlIGNhcHMgYWZ0ZXIgdXNlLCBub3QgYmVmb3JlCisKKzIwMDUtMDEtMDQgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwlwYXRjaCBieTogUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzoKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgRml4IGZvciAjMTU0NzczIC0gZml4ZXMgcGxheWJhY2sgb2Ygc21hbGwgLndhdiBmaWxlcworCisyMDA1LTAxLTAzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJcGF0Y2ggYnk6IFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F1ZGlvc2NhbGUvZ3N0YXVkaW9zY2FsZS5jOgorCSAgRml4IGZvciAjMTYyODE5IC0gbWFrZSBhdWRpb3NjYWxlIHJldXNhYmxlCisJICBGaXhlcyBwbGF5YmFjayBvZiBtb3JlIHRoYW4gb25lIGZpbGUgd2l0aCBwbGF5YmluL3RvdGVtCisKKzIwMDQtMTItMjkgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2F2Y29kZWMuaDoKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvZGVjbWFwLmM6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9pbWdjb252ZXJ0LmM6CisJICBjbGVhbiB1cCB0aGUgbWVzcyB0aGF0IG1hZGUgbWUgY3J5IGFuZCBhdm9pZCBuZWVkbGVzcyBkdXBsaWNhdGlvbgorCisyMDA0LTEyLTI5ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9pbWdjb252ZXJ0LmM6CisJICBnaXZlIHNvbWUgaW5kaWNhdGlvbiBvZiB3aHkgd2UncmUgc2VnZmF1bHRpbmcKKworMjAwNC0xMi0yOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSAgRml4IGluZGVudGF0aW9uLCBmaXggdjRsMiBwbHVnaW4gZGV0ZWN0aW9uLgorCSogZXh0L01ha2VmaWxlLmFtOgorCSAgRml4IGxpYm1tcyBsb2NhdGlvbiAoTWFjaWVqLCB1c2UgZGlmZiAtdSEpLgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfaW5pdCk6CisJICBJbml0aWFsaXplIGNhcHMgY2FjaGUgdG8gTlVMTC4KKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnc3RfcGxheV9iaW5fY2hhbmdlX3N0YXRlKToKKwkgIE9ubHkgY2hhbmdlIHN0YXRlIG9uIGF1ZGlvc2luayBpZiBpdCBleGlzdHMuCisKKzIwMDQtMTItMjggIE1hY2llaiBLYXRhZmlhc3ogIDxtYXRocmlja0BtYXRocmljay5vcmc+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4Lmg6CisJRml4IFZvcmJpcyBzdHJlYW1zIGZhaWxpbmcgdG8gZGVjb2RlIGluIHNvbWUgZmlsZXMsIHdoZXJlIGNsdXN0ZXJfdGltZQorCWlzbid0IDAsIGJlY2F1c2UgdGhlbiBpdCBkb2Vzbid0IHNlbmQgY29kZWNfcHJpdiBiZWZvcmUgYWN0dWFsIGRhdGEuCisJUmVtb3ZlIHRpbWUtYmFzZWQgdGVzdCBhbmQgcmVwbGFjZSBpdCB3aXRoIG1hcmtlciBzZXQgb24gYmVnaW5uaW5nIG9mCisJbmV3IHN0cmVhbQorCisyMDA0LTEyLTI4ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwlNZXJnZSBwYXRjaCBmcm9tIFJvbmFsZCBmaXhpbmcgcHJvYmxlbXMgd2l0aCBzdHJlYW1pbmcKKwl0ZXh0LgorCSogZXh0L2NhaXJvL2dzdGNhaXJvLmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzogKGdzdF90ZXh0b3ZlcmxheV9yZW5kZXJfdGV4dCksCisJKGdzdF90ZXh0X292ZXJsYXlfYmxpdF8xKSwgKGdzdF90ZXh0X292ZXJsYXlfYmxpdF9zdWIyeDIpLAorCShnc3RfdGV4dG92ZXJsYXlfdmlkZW9fY2hhaW4pLCAoZ3N0X3RleHRvdmVybGF5X2xvb3ApLAorCShnc3RfdGV4dG92ZXJsYXlfZm9udF9pbml0KSwgKGdzdF90ZXh0b3ZlcmxheV9pbml0KSwKKwkoZ3N0X3RleHRvdmVybGF5X3NldF9wcm9wZXJ0eSk6CisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuaDoKKworMjAwNC0xMi0yNyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzogKGdzdF90ZXh0b3ZlcmxheV9yZW5kZXJfdGV4dCksCisJKGdzdF90ZXh0X292ZXJsYXlfYmxpdF8xKSwgKGdzdF90ZXh0X292ZXJsYXlfYmxpdF9zdWIyeDIpLAorCShnc3RfdGV4dG92ZXJsYXlfdmlkZW9fY2hhaW4pLCAoZ3N0X3RleHRvdmVybGF5X2xvb3ApLAorCShnc3RfdGV4dG92ZXJsYXlfZm9udF9pbml0KSwgKGdzdF90ZXh0b3ZlcmxheV9pbml0KSwKKwkoZ3N0X3RleHRvdmVybGF5X3NldF9wcm9wZXJ0eSk6IEltcHJvdmVtZW50cyB0byBhY3R1YWxseQorCXJlbmRlciB0ZXh0IGFzIHdoaXRlIG9uIGJsYWNrIG91dGxpbmUgb24gdmlkZW8sIGluY2x1ZGluZworCWZvbnQgc2VsZWN0aW9uIGFuZCBob3Jpem9udGFsL3ZlcnRpY2FsIGFsaWdubWVudC4gIChSb25hbGQncworCWNocmlzdG1hcyBwcmVzZW50KQorCSogZXh0L2NhaXJvL2dzdHRleHRvdmVybGF5Lmg6CisKKzIwMDQtMTItMjYgIFN0ZXBoYW5lIExvZXVpbGxldCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBleHQvb2dnL2dzdG9nZy5jOgorCSogZXh0L29nZy9nc3RvZ21wYXJzZS5jOgorCSAgZml4IG9nbVthdWRpby92aWRlb11wYXJzZSBwbHVnaW4gcmVnaXN0cmF0aW9uCisJICAocmlmZiB3b24ndCBsb2FkIGlmIGJ5dGVzdHJlYW0gaXMgYWxyZWFkeSBsb2FkZWQpCisKKzIwMDQtMTItMjQgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0Y2hhbm5lbG1peC5jOgorCSAgZml4IGZvciBHTElCIDwgMi40CisKKzIwMDQtMTItMjQgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogY29uZmlndXJlLmFjOgorCSAgZGlzYWJsZSBkb2NzIGFnYWluIHVudGlsIGl0IGFjdHVhbGx5IHBhc3NlcyBtYWtlIGRpc3RjaGVjay4KKworMjAwNC0xMi0yNCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF90eXBlX2dldCksIChxdGRlbXV4X2F1ZGlvX2NhcHMpOgorCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChxM2dwX3R5cGVfZmluZCksCisJKHBsdWdpbl9pbml0KToKKwkgIEFkZCAzR1AgKHZhcmlhYmxlcyBuYW1lIFEzR1AgYmVjYXVzZSB0aGV5IGNhbid0IHN0YXJ0IHdpdGggYQorCSAgbnVtYmVyKS4gQWRkIHNhbXIgYXVkaW8gZm91cmNjICh1c2VkIGluIC4zZ3AgZmlsZXMpLCBkZWNvZGVyCisJICBpcyB3b3JrIGluIHByb2dyZXNzLiBBbHNvIGRvIGEgR1NUX1dBUk5JTkcgaW5zdGVhZCBvZiBFUlJPUgorCSAgaW4gY2FzZSBvZiB1bmtub3duIG5vZGVzLCB0byBkZWNyZWFzZSBvdXRwdXQuCisKKzIwMDQtMTItMjQgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIE1ha2VmaWxlLmFtOgorCSAgcmVhbGx5IGZpeCBkaXN0CisKKzIwMDQtMTItMjMgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5oOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmg6CisJICBGaXhlcyAjMTU4MzgyLiAgTWFrZSBzcGVleCBwbHVnaW4gY29tcGF0aWJsZSB3aXRoIGJvdGggMS4wIGFuZCAxLjEuCisJICBGaXggZGV0ZWN0aW9uIGNvZGUgaW4gY29uZmlndXJlLmFjCisKKzIwMDQtMTItMjMgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCShnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cCk6CisJICBTYXZlIHBvc2l0aW9uLCBzbyB0aGF0IHF1ZXJpZXMgZ2l2ZSBwcm9wZXIgcmV0dXJuIHZhbHVlcy4gRG9uJ3QKKwkgIGtub3cgaG93IHRoaXMgY291bGQgZXZlciBoYXZlIHdvcmtlZCBiZWZvcmUuLi4KKworMjAwNC0xMi0yMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgUHV0IGFkZGl0aW9uYWwgTEFNRSBjaGVjayBpbnNpZGUgdGhlIGNvbmRpdGlvbmFsLiAgRml4ZXMgIzE1MjMzOQorCisyMDA0LTEyLTIzICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksCisJKGdzdF9hdmlfZGVtdXhfc3RyZWFtX3NjYW4pOgorCSAgQWRkIHNvbWUgbW9yZSBkZWJ1Zy4gRml4IGxvZ2ljIGVycm9yIHdoZW4gc2V0dGluZyBtb3ZpIG9mZnNldAorCSAgd2hpbGUgcmVhZGluZyBpbmRleC4KKworMjAwNC0xMi0yMyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5kZXgpLAorCShnc3RfYXZpX2RlbXV4X3N0cmVhbV9zY2FuKSwgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspLAorCShnc3RfYXZpX2RlbXV4X3Byb2Nlc3NfbmV4dF9lbnRyeSk6CisJICBBZGQgc29tZSBkZWJ1Z2dpbmcuIEJldHRlciBkZXRlY3Rpb24gb2YgYnJva2VuIGluZGV4ZXMgYW5kIHRoZQorCSAgYWNjb21wYW55aW5nIGluZGV4IHJlY292ZXJ5LiBObyBpbmZpbml0ZSBsb29wcyBvbiBzdGF0ZSBjaGFuZ2VzCisJICB3aGVuIHdlJ3JlIHN0aWxsIGluIG91ciBsb29wZnVuY3Rpb24uCisKKzIwMDQtMTItMjIgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEZpeCB1cC4KKworMjAwNC0xMi0yMiAgQXJjaGFuYSBTaGFoICA8YXJjaGFuYS5zaGFoQHdpcHJvLmNvbT4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VubWl4ZXIuYzogKGdzdF9zdW5hdWRpb21peGVyX3NldF92b2x1bWUpOgorCSAgTm9ybWFsaXppbmcgdGhlIHZhbHVlIGJlZm9yZSBzZXR0aW5nCisJKGdzdF9zdW5hdWRpb21peGVyX2dldF92b2x1bWUpOgorCSAgTm9ybWFsaXppbmcgdGhlIHZhbHVlIGFmdGVyIGdldHRpbmcuIEZpeGVzIGJ1ZyMgMTYxOTgwCisKKzIwMDQtMTItMjIgIENocmlzdGlhbiBGcmVkcmlrIEthbGFnZXIgU2NoYWxsZXIgIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBNYWtlZmlsZS5hbTogTWFrZSBzdXJlIGRvY3MgZ2V0cyBkaXN0ZWQKKwkqIGRvY3MvTWFrZWZpbGUuYW06IE1ha2Ugc3VyZSBhbGwgbmVlZGVkIGZpbGVzIGdldCBkaXN0ZWQKKwkqIGdzdC1wbHVnaW5zLnNwZWMuaW46IGxhdGVzdCB1cGRhdGVzCisKKzIwMDQtMTItMjIgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdzdF9wbGF5X2Jhc2VfYmluX2FkZF9lbGVtZW50KToKKwlSZXZlcnQgcGF0Y2ggMS4zOCBhcyBjbG9jayBkaXN0cmlidXRpb24gb3ZlciBzY2hlZHVsZXJzIGRvZXMKKwlub3Qgd29yayBjb3JyZWNseSBpbiB0aGUgY29yZSB5ZXQuCisKKzIwMDQtMTItMjEgIFN0ZXBoYW5lIExvZXVpbGxldCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBzeXMvb3NzL1JFQURNRTogcmVtb3ZlIHRoaXMgZmlsZSwgd2hpY2ggcHJlZGF0ZXMgbXkgYmlydGgKKwkgIChhbmQgd2hpY2ggY29udGVudCBpcyBieSBmYXIgb3V0ZGF0ZWQpCisKKzIwMDQtMTItMjAgIFN0ZWZhbiBLb3N0ICA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogY29uZmlndXJlLmFjOgorCSogZG9jcy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvbGlicy9NYWtlZmlsZS5hbToKKwkqIGRvY3MvbGlicy9nc3QtcGx1Z2lucy1saWJzLWRvY3Muc2dtbDoKKwkqIGRvY3MvbGlicy9nc3QtcGx1Z2lucy1saWJzLXNlY3Rpb25zLnR4dDoKKwkqIGRvY3MvbGlicy90bXBsL2dzdGdjb25mLnNnbWw6CisJKiBkb2NzL3VwbG9hZC5tYWs6CisJKiBkb2NzL3ZlcnNpb24uZW50aXRpZXMuaW46CisJICBBZGRlZCBib2lsZXJwbGF0ZSBndGstZG9jIGZpbGVzIGZvciBwbHVnaW4tbGlicyBkb2N1bWVudGF0aW9uLgorCisyMDA0LTEyLTE5ICBTdGVwaGFuZSBMb2V1aWxsZXQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiBmaXggaW50IGFuZCBmbG9hdCBhdWRpbyBjYXBzCisKKzIwMDQtMTItMTkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy92NGwvZ3N0djRsZWxlbWVudC5jOiAoZ3N0X3Y0bF9pZmFjZV9zdXBwb3J0ZWQpOgorCSogc3lzL3Y0bDIvZ3N0djRsMmVsZW1lbnQuYzogKGdzdF92NGwyX2lmYWNlX3N1cHBvcnRlZCk6CisJICBnX2Fzc2VydCgpIGNhbiBiZSBhIG1hY3JvLCBkb24ndCB1c2UgI2lmZGVmIGluc2lkZSBpdC4KKworMjAwNC0xMi0xOSAgRWR3YXJkIEhlcnZleSAgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC92aWRlb3JhdGUvZ3N0dmlkZW9yYXRlLmM6IChnc3RfdmlkZW9yYXRlX2JsYW5rX2RhdGEpLAorCShnc3RfdmlkZW9yYXRlX2luaXQpLCAoZ3N0X3ZpZGVvcmF0ZV9jaGFpbiksCisJKGdzdF92aWRlb3JhdGVfY2hhbmdlX3N0YXRlKToKKwkgIEV2ZW50IGhhbmRsaW5nIChmaXhlcyAjMTU5OTg2KS4KKworMjAwNC0xMi0xOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOgorCShnc3RfcmlmZl9jcmVhdGVfdmlkZW9fY2Fwc193aXRoX2RhdGEpOgorCSAgQWRkIEJMWjAgKEJsaXp6YXJkJ3MgdmVyc2lvbiBvZiBEaXZYKSBmb3VyY2MuCisKKzIwMDQtMTItMTggIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3R0YS9nc3R0dGFkZWMuYzogKGdzdF90dGFfZGVjX2xpbmspOiBBbmQgeWV0IGFub3RoZXIKKwlwb3J0YWJpbGl0eSBmaXguCisKKzIwMDQtMTItMTggIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3R0YS90dGFkZWMuaDogRGlzYWJsZSBzb21lIGhlYWRlciBjb2RlIHRoYXQgaXNuJ3QgdXNlZAorCWFuZCBjbGVhcmx5IGlzbid0IHBvcnRhYmxlLgorCisyMDA0LTEyLTE4ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2ltZ2NvbnZlcnQuYzogKGdldF9waXhfZm10X2luZm8pLAorCShhdmNvZGVjX2dldF9jaHJvbWFfc3ViX3NhbXBsZSksIChhdmNvZGVjX2dldF9waXhfZm10X25hbWUpLAorCShhdmNvZGVjX2dldF9waXhfZm10KSwgKGF2cGljdHVyZV9sYXlvdXQpLAorCShhdmNvZGVjX2dldF9waXhfZm10X2xvc3MpLCAoYXZnX2JpdHNfcGVyX3BpeGVsKSwgKGltZ19jb3B5KSwKKwkoZ2V0X2NvbnZlcnRfdGFibGVfZW50cnkpLCAoaW1nX2NvbnZlcnQpLCAoaW1nX2dldF9hbHBoYV9pbmZvKToKKwlGaXggY29kZSB0byBub3QgdXNlIEdDQyBleHRlbnNpb25zIChhbmQgYzk5IGV4dGVuc2lvbnMgdGhhdAorCUZvcnRlIGRvZXMgbm90IGxpa2UuKQorCisyMDA0LTEyLTE5ICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dC5pLm1AemVuLmNvLnVrPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzogKGdzdF9kZWludGVybGFjZV9saW5rKSwKKwkoZ3N0X2RlaW50ZXJsYWNlX2NoYWluKToKKwkgIFJvd3N0cmlkZSBmaXhlcy4gRml4ZXMgIzE2MTAzOS4KKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6IChnc3RfdmlkZW9fY3JvcF9pbml0KSwKKwkoZ3N0X3ZpZGVvX2Nyb3BfZ2V0X3Byb3BlcnR5KSwgKGdzdF92aWRlb19jcm9wX2FkZF90b19zdHJ1Y3RfdmFsKSwKKwkoZ3N0X3ZpZGVvX2Nyb3BfZ2V0Y2FwcyksIChnc3RfdmlkZW9fY3JvcF9saW5rKSwKKwkoZ3N0X3ZpZGVvX2Nyb3BfaTQyMCksIChnc3RfdmlkZW9fY3JvcF9jaGFpbiksCisJKGdzdF92aWRlb19jcm9wX2NoYW5nZV9zdGF0ZSk6CisJICBSZXdvcmsgb2YgbmVnb3RpYXRpb24uIEFjdHVhbGx5IHdvcmtzIG5vdy4gRml4ZXMgIzE1ODY1MC4KKworMjAwNC0xMi0xOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZWJtbG51bV9zaW50KToKKwkgIFRoYXQgd2FzIHZlcnkgc3R1cGlkLgorCisyMDA0LTEyLTE4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2Jsb2NrZ3JvdXApOgorCSAgRml4IHBvc3NpYmxlIGNyYXNoZXIuCisKKzIwMDQtMTItMTggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2VibWxudW1fdWludCksCisJKGdzdF9tYXRyb3NrYV9lYm1sbnVtX3NpbnQpLCAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2Jsb2NrZ3JvdXApOgorCSAgTGFjZSBzaXplcyBjYW4gYmUgemVyby4KKworMjAwNC0xMi0xOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L211c2VwYWNrL2dzdG11c2VwYWNrZGVjLmNwcDoKKwkgIEZldGNoIGVycm9yIHJldHVybiB2YWx1ZXMuIEZpeGVzICMxNjE2MjQuCisJKiBnc3QvYXBldGFnL2FwZWRlbXV4LmM6IChnc3RfYXBlX2RlbXV4X3N0cmVhbV9kYXRhKToKKwkgIFJlYWxseSBFT1MuCisKKzIwMDQtMTItMTggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4KToKKwkgIFdvcmsgZm9yIHRydW5jYXRlZCAodW5maW5pc2hlZCBkb3dubG9hZCBldGMuKSBmaWxlcy4gRml4ZXMgIzE2MDUxNC4KKworMjAwNC0xMi0xOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfbG9vcCk6CisJICBGaXggZm9yIGludGVnZXIgb3ZlcmZsb3cuIE1ha2VzICMxNTYwMDEgbm90IGNyYXNoLiBQcm9iYWJseSBtYXNrcworCSAgdGhlIHJlYWwgYnVnLgorCisyMDA0LTEyLTE3ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYWMzcGFyc2UvZ3N0YWMzcGFyc2UuYzogKHBsdWdpbl9pbml0KToKKwkgIFBhcnNlcnMgbmV2ZXIgaGF2ZSByYW5rcy4gRml4ZXMgIzE1OTY1MS4KKworMjAwNC0xMi0xNyAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBnc3QvcGxheWJhY2svZ3N0ZGVjb2RlYmluLmM6IChjb21wYXJlX3JhbmtzKToKKwkgIG1ha2Ugc3VyZSB0aGUgZmFjb3RyaWVzIGFyZSBvcmRlcmVkIHRoZSBzYW1lIGV2ZXJ5IHRpbWUgZXZlbiBpZiB0aGV5CisJICBoYXZlIHRoZSBzYW1lIHJhbmsgYnkgdXNpbmcgdGhlIG5hbWUKKwkqIGdzdC9wbGF5YmFjay9nc3RkZWNvZGViaW4uYzogKGZpbmRfY29tcGF0aWJsZXMpOgorCSAgbWFrZSBzdXJlIHdlIGRvbid0IGFkZCBmYWN0b3JpZXMgdG8gdGhlIGxpc3QgdHdpY2UKKworMjAwNC0xMi0xNiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb25maWd1cmUuYWM6IGxvb2sgZm9yIG11c2VwYWNrIGhlYWRlcnMgYXMgbXVzZXBhY2svKi5oCisJKGZpeGVzICMxNTk4NDcpCisJKiBleHQvbXVzZXBhY2svZ3N0bXVzZXBhY2tkZWMuaDogdXNlIDxtdXNlcGFjay8qLmg+CisJKiBleHQvbXVzZXBhY2svZ3N0bXVzZXBhY2tyZWFkZXIuaDogc2FtZQorCisyMDA0LTEyLTE3ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuYzoKKwkoZ3N0X3JpZmZfcmVhZF9zdHJmX2F1ZHNfd2l0aF9kYXRhKToKKwkgIFJlYWQgZXh0cmFkYXRhIGNvcnJlY3RseSAoZml4ZXMgIzE1NTg3OSkuCisKKzIwMDQtMTItMTYgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2F1ZGlvc2NhbGUvZ3N0YXVkaW9zY2FsZS5jOiBhbGxvdyBwYXNzdGhydSBvZiA+MiBjaGFubmVsCisJYXVkaW8uICBkb2VzIF9ub3RfIGF0dGVtcHQgb3IgYWxsb3cgY29udmVyc2lvbiB1bmxlc3MgY2hhbm5lbHMKKwlpcyAxIG9yIDIuCisKKzIwMDQtMTItMTYgIENocmlzdGlhbiBGcmVkcmlrIEthbGFnZXIgU2NoYWxsZXIgIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiB0b29scy9nc3QtbGF1bmNoLWV4dC1tLm06IGZpeCBtcGVnIGFuZCB2b2IgcGlwZWxpbmVzCisKKzIwMDQtMTItMTYgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2F1ZGlvc2NhbGUvZ3N0YXVkaW9zY2FsZS5jOiB0aGUgcmVzYW1wbGUgbGlicmFyeSBvbmx5CisJaGFuZGxlcyAxIG9yIDIgY2hhbm5lbHMuICBDaGFuZ2UgY2FwcyB0byBjb21wZW5zYXRlLgorCisyMDA0LTEyLTE2ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGFhY19yYXRlX2lkeCksIChhYWNfcHJvZmlsZV9pZHgpLAorCShnc3RfbWF0cm9za2FfZGVtdXhfYXVkaW9fY2Fwcyk6CisJICBTb21lIE1QRUctQUFDIGhhY2tzLCBiZWNhdXNlIGVsc2UgaXQgZG9lc24ndCB3b3JrLi4uCisKKzIwMDQtMTItMTYgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzoKKwkoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX2NhcHNfd2l0aF9kYXRhKSwKKwkoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX3RlbXBsYXRlX2NhcHMpOgorCSAgQWRkIGgyNjQuCisKKzIwMDQtMTItMTYgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9NYWtlZmlsZS5hbToKKwkgIFRyeSB0byBmaXggYnVpbGRib3QuCisKKzIwMDQtMTItMTYgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuYzoKKwkgIENsZWFuIHVwIGFuZCB1bmlmb3JtaXplIGRlYnVnZ2luZy4KKworMjAwNC0xMi0xNiAgRWR3YXJkIEhlcnZleSAgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdGR2ZGRlbXV4LmM6IChnc3RfZHZkX2RlbXV4X2NsYXNzX2luaXQpLAorCShnc3RfZHZkX2RlbXV4X3Jlc2V0KSwgKGdzdF9kdmRfZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdkZW11eC5jOiAoZ3N0X21wZWdfZGVtdXhfcmVzZXQpLAorCShnc3RfbXBlZ19kZW11eF9jaGFuZ2Vfc3RhdGUpOgorCSAgUmVzZXQgb24gcmVhZHkuIEZpeGVzIDE2MDI3Ni4KKworMjAwNC0xMi0xNiAgU2ViYXN0aWVuIENvdGUgIDxzYzVAaGVybWVzLnVzaGVyYi5jYT4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29sb3JzcGFjZS5jOgorCShnc3RfZmZtcGVnY3NwX3BhZF9saW5rKToKKwkgIEZpeCBtZW1sZWFrICgjMTU0ODE1KS4KKworMjAwNC0xMi0xNiAgSmFtZXMgQm93ZXMgIDxib3dlc0Bjcy5kYWwuY2E+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uYzogKGdzdF9tdXNpY2JyYWluel9jbGFzc19pbml0KSwKKwkoZ3N0X211c2ljYnJhaW56X2luaXQpLCAoZ3N0X211c2ljYnJhaW56X2NoYWluKSwKKwkoZ3N0X211c2ljYnJhaW56X3NldF9wcm9wZXJ0eSksIChnc3RfbXVzaWNicmFpbnpfZ2V0X3Byb3BlcnR5KToKKwkqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uaDoKKwkgIEFkZCBzdXBwb3J0IGZvciB1c2luZyBhIHByb3h5IHNlcnZlciB3aGVuIGdldHRpbmcgYSB0cm0gaWQgZnJvbQorCSAgdGhlIE11c2ljQnJhaW56IGRhdGFiYXNlICgjMTQ5NjEzKS4KKworMjAwNC0xMi0xNiAgQ2hyaXN0b3BoZSBGZXJnZWF1ICA8dGV1ZkBnbm9tZS5vcmc+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RkZWNvZGViaW4uYzogKG5ld19wYWQpLCAoY2xvc2VfbGluayk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKG5ld19kZWNvZGVkX3BhZCk6CisJICBGaXggbWVtbGVha3MgKCMxNTcyMzMpLgorCisyMDA0LTEyLTE2ICBTZWJhc3RpZW4gQ290ZSAgPHNjNUBoZXJtZXMudXNoZXJiLmNhPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmVzYW1wbGUvcmVzYW1wbGUuYzogKGdzdF9yZXNhbXBsZV9jbG9zZSk6CisJKiBnc3QtbGlicy9nc3QvcmVzYW1wbGUvcmVzYW1wbGUuaDoKKwkqIGdzdC9hdWRpb3NjYWxlL2dzdGF1ZGlvc2NhbGUuYzoKKwkgIEZpeCBtZW1sZWFrICgjMTU5MjE1KS4KKworMjAwNC0xMi0xNiAgVG9uaSBXaWxsYmVyZyAgPHRvbml3QGlraS5maT4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50LmM6IChnc3Rfb3NzZWxlbWVudF9wcm9iZV9jYXBzKToKKwkqIHN5cy9vc3Mvb3NzX3Byb2JlLmM6IChtYWluKToKKwkgIENoZWNrIGZvciBtb25vL3N0ZXJlbyBzdXBwb3J0IChzaW1pbGFyIHRvIHNhbXBsZXJhdGUgcHJvYmluZyksCisJICBmaXhlcyAjMTU5NDMzLiBBbHNvIGFkZCBtaXNzaW5nIGNvcHlyaWdodCBoZWFkZXIgdG8gb3NzX3Byb2JlLmMuCisKKzIwMDQtMTItMTUgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29uZmlndXJlLmFjOiBhZGQgYXVkaW9yZXNhbXBsZSBhbmQgY2Fpcm8gcGx1Z2lucy4gIFJlbW92ZQorCUhBVkVfTU1YIHN0dWZmLCBiZWNhdXNlIGl0J3Mgbm90IHVzZWQuCisJKiBleHQvTWFrZWZpbGUuYW06IHNhbWUKKwkqIGV4dC9hdWRpb3Jlc2FtcGxlL01ha2VmaWxlLmFtOiBZb3UgYXJlIG5vdCByZWFkeSBmb3IgYW4KKwlhdWRpbyByZXNhbXBsaW5nIGVsZW1lbnQgYmFzZWQgb24gYXVkaW9yZXNhbXBsZS4KKwkqIGV4dC9hdWRpb3Jlc2FtcGxlL2dzdGF1ZGlvcmVzYW1wbGUuYzoKKwkqIGV4dC9hdWRpb3Jlc2FtcGxlL2dzdGF1ZGlvcmVzYW1wbGUuaDoKKwkqIGV4dC9jYWlyby9NYWtlZmlsZS5hbTogWW91IGFyZSBub3QgcmVhZHkgZm9yIG92ZXJsYXkgZWxlbWVudHMKKwliYXNlZCBvbiBjYWlyby4gIERvbid0IGxvb2sgdG9vIGNsb3NlbHksIHRoZXNlIGVsZW1lbnRzIGtpbmRhCisJc3VjayByaWdodCBub3cuCisJKiBleHQvY2Fpcm8vZ3N0Y2Fpcm8uYzogbmV3CisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuYzogbmV3CisJKiBleHQvY2Fpcm8vZ3N0dGV4dG92ZXJsYXkuaDogbmV3CisJKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuYzogbmV3CisJKiBleHQvY2Fpcm8vZ3N0dGltZW92ZXJsYXkuaDogbmV3CisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLXByaXYuaDogZml4IGNvbXBpbGUKKwlwcm9ibGVtIHdpdGggY29tcGlsZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCB2YXJpYWRpYyBtYWNyb3MuCisKKzIwMDQtMTItMTUgIEJhbGFtdXJhbGkgVmlzd2FuYXRoYW4gIDxiYWxhbXVyYWxpLnZpc3dhbmF0aGFuQHdpcHJvLmNvbT4KKworCVJldmlld2VkIGJ5OiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW8uYzogKHBsdWdpbl9pbml0KTogIEFwcGx5IHBhdGNoIGZyb20KKwlCYWxhLCByZWdpc3RlcmluZyBzdW5hdWRpb3NyYyAob29wcyEpLCBhbmQgY2xlYW5pbmcgdXAgY29kZSBhCisJYml0LiAgQWxzbyByYW4gaW5kZW50LWdzdC4KKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOiAoZ3N0X3N1bmF1ZGlvc3JjX2luaXQpLAorCShnc3Rfc3VuYXVkaW9zcmNfY2hhbmdlX3N0YXRlKSwgKGdzdF9zdW5hdWRpb3NyY19nZXQpLAorCShnc3Rfc3VuYXVkaW9zcmNfc2V0cGFyYW1zKToKKworMjAwNC0xMi0xNCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvZmVzdGl2YWwvZ3N0ZmVzdGl2YWwuYzogKGdzdF9mZXN0aXZhbF9jaGFpbik6IFNldCB0aGUKKwlvdXRwdXQgcmF0ZSB0byAxNjAwMC4gIFNob3VsZCBmaXggIzE2MDIzNS4KKworMjAwNC0xMi0xNCAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKG1wZWcyX3N5c190eXBlX2ZpbmQpOgorCUFkZCB0eXBlZmluZGluZyBmb3IgbXBlZzIgcGVzIHN0cmVhbXMKKworMjAwNC0xMi0xMyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb25maWd1cmUuYWM6ICBBcHBsaWVkIHBhdGNoIGZyb20gYnVnICMxNDM2NTksIG1ha2luZyBkZWZhdWx0CisJc291cmNlcyBhbmQgc2lua3MgT1MtZGVwZW5kZW50IChmb3IgU29sYXJpcyksIGFuZCBhZGRlZCBjb2RlCisJZm9yIE9TL1guCisJKiBnY29uZi9nc3RyZWFtZXIuc2NoZW1hcy5pbjogdXNlIE9TLWRlcGVuZGVudCBzaW5rcyBpbiBnY29uZi4KKworMjAwNC0xMi0xMyAgU3RlcGhhbmUgTG9ldWlsbGV0ICA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzoKKwkgIGZvcmdvdCB0byBhZGQgaDIuNjQgdG8gYXZpZGVtdXggdGVtcGxhdGUgY2FwcworCisyMDA0LTEyLTEzICBTdGVwaGFuZSBMb2V1aWxsZXQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZ3N0L3dhdmVuYy9yaWZmLmg6CisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6CisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLWlkcy5oOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYworCWFkZCA0Q0MgY29kZSBmb3IgVmlkZW9Tb2Z0IGgyNjQgaW4gQVZJIChWU1NIKQorCSAgZml4ZXMgYnVnICMxNjA2NTUKKwlyZW1vdmUgczMyMyBmcm9tIHJpZmYsIGl0J3MgcXVpY2t0aW1lIHNwZWNpZmljIDooCisKKzIwMDQtMTItMTMgIFN0ZXBoYW5lIExvZXVpbGxldCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBnc3QvYXNmZGVtdXgvUkVBRE1FCisJKiBnc3Qvd2F2ZW5jL3JpZmYuaAorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1pZHMuaAorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6CisJICBhZGQgbmV3IDRDQyBjb2RlcyBmb3IgaDI2MyByZWxhdGVkIGNvZGVjcworCSAgZml4ZXMgcGFydGlhbGx5IGJ1ZyAjMTU1MTYzCisKKzIwMDQtMTItMTIgIENocmlzdGlhbiBGcmVkcmlrIEthbGFnZXIgU2NoYWxsZXIgIDxjaHJpc3RpYW4gYXQgZmx1ZW5kbyBkb3QgY29tPgorCisJKiBjb25maWd1cmUuYWM6IFVwZGF0ZSBwb2x5YXVkaW8gcmVxdWlyZW1lbnQgdG8gMC43CisJKiBleHQvcG9seXAvcG9seXBzaW5rLmM6IChjcmVhdGVfc3RyZWFtKTogYWRkIHBhdGNoIGZyb20gaWFpbiAoMTU4MjU4KQorCisyMDA0LTEyLTExICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5jOgorCWZpeCBteSBuYW1lJ3Mgc3BlbGxpbmchIDopCisKKzIwMDQtMTItMTEgIFN0ZXBoYW5lIExvZXVpbGxldCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBBVVRIT1JTIENoYW5nZUxvZworCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jCisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYworCSogZ3N0L2xhdy86CisJCWFsYXctZGVjb2RlLmMgYWxhdy1lbmNvZGUuYworCQltdWxhdy1kZWNvZGUuYyBtdWxhdy1lbmNvZGUuYworCSogZ3N0L29uZXRvbi9nc3RvbmV0b24uYworCSogc3lzL29zeGF1ZGlvLzoKKwkJZ3N0b3N4YXVkaW9lbGVtZW50LmMgZ3N0b3N4YXVkaW9zaW5rLmMgZ3N0b3N4YXVkaW9zcmMuYworCSogc3lzL29zeHZpZGVvLzoKKwkJY29jb2F3aW5kb3cuaCBjb2NvYXdpbmRvdy5tCisJCW9zeHZpZGVvc2luay5oIG9zeHZpZGVvc2luay5tCisKKwlwdXQgdGhlIHNhbWUgbWFpbCBhZGRyZXNzIGZvciBaYWhlZXIgQWJiYXMgTWVyYWxpIGV2ZXJ5d2hlcmUKKworMjAwNC0xMi0xMCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X2xvb3ApOgorCSAgQWxpZ24gYnkgcGFja2V0c2l6ZSwgYW5kIGFzc2VydCB0aGF0IHdlIGEgcGFja2V0IGF2YWlsYWJsZSBiZWZvcmUKKwkgIHBsYXlpbmcuIFRoZSBmaXJzdCBtYWtlcyB3ZWJzdHJlYW1zIHdvcmsgKHRoZXkgb2Z0ZW4gaW5jbHVkZQorCSAgdHJhaWxpbmcgcGFkZGluZyBkYXRhIGluIGEgcGFja2V0KSwgdGhlIHNlY29uZCBhbGxvd3MgcGF1c2luZyBhCisJICBBU0Ygc3RyZWFtIGluIHRvdGVtIHdpdGhvdXQgZ2V0dGluZyBkZW11eCBlcnJvcnMgYWZ0ZXJ3YXJkcy4KKworMjAwNC0xMi0wOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ2V0X3JlbGF0aXZlKToKKwkgIENoZWNrIGZvciBub24tTlVMTCBiZWZvcmUgYWNjZXNzaW5nIG1lbWJlciAoZW5kLW9mLWNoYWluKS4KKworMjAwNC0xMi0wOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2NkcGFyYW5vaWEvZ3N0Y2RwYXJhbm9pYS5jOiAoY2RwYXJhbm9pYV9jbGFzc19pbml0KSwKKwkoY2RwYXJhbm9pYV9zZXRfcHJvcGVydHkpLCAoY2RwYXJhbm9pYV9nZXRfcHJvcGVydHkpOgorCSogZXh0L2R2ZG5hdi9kdmRuYXZzcmMuYzogKGR2ZG5hdnNyY19jbGFzc19pbml0KSwKKwkoZHZkbmF2c3JjX3NldF9wcm9wZXJ0eSksIChkdmRuYXZzcmNfZ2V0X3Byb3BlcnR5KToKKwkqIGV4dC9kdmRyZWFkL2R2ZHJlYWRzcmMuYzogKGR2ZHJlYWRzcmNfY2xhc3NfaW5pdCksCisJKGR2ZHJlYWRzcmNfaW5pdCksIChkdmRyZWFkc3JjX3NldF9wcm9wZXJ0eSksCisJKGR2ZHJlYWRzcmNfZ2V0X3Byb3BlcnR5KToKKwkqIHN5cy92Y2QvdmNkc3JjLmM6IChnc3RfdmNkc3JjX2NsYXNzX2luaXQpLAorCShnc3RfdmNkc3JjX3NldF9wcm9wZXJ0eSksIChnc3RfdmNkc3JjX2dldF9wcm9wZXJ0eSk6CisJICBTeW5jaHJvbml6ZSBwcm9wZXJ0eSBuYW1lcyB3aGVyZSBub3QgeWV0IHRoZSBjYXNlLiBEZXZpY2VzIGFyZQorCSAgbm93IGRldmljZT1YLCBvdGhlciB2ZXJzaW9ucyBhcmUgZGVwcmVjYXRlZCAoYnV0IHN0aWxsIGV4aXN0KS4KKwkgIEFsc28gdXNlIGdfZnJlZSgpIHVuY29uZGl0aW9uYWxseS4KKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ3N0X3BsYXlfYmFzZV9iaW5fY2xhc3NfaW5pdCksCisJKHNldHVwX3NvdXJjZSksIChnc3RfcGxheV9iYXNlX2Jpbl9nZXRfcHJvcGVydHkpOgorCSAgRXhwb3NlIHNvdXJjZS4KKworMjAwNC0xMi0wOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOiBtb3ZlIEdDT05GIG1hY3JvIG91dHNpZGUgY29uZGl0aW9uYWwgZm9yIHRoZSBhbQorCSAgY29uZGl0aW9uYWwuIEZpeGVzICMxNjA0MzkKKworMjAwNC0xMi0wOCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiB0b29scy9nc3QtdmlzdWFsaXNlLW0ubTogU3dpdGNoIHRvIGVsZW1lbnRzIHRoYXQgY3VycmVudGx5CisJZXhpc3QuCisKKzIwMDQtMTItMDggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9vZ2cvZ3N0b2dtcGFyc2UuYzogKGdzdF9vZ21fcGFyc2VfY2hhaW4pOgorCSAgV2UgbG92ZSB3cm9uZyBjb21tYXMuCisKKzIwMDQtMTItMDggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCShnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSk6CisJICBEb24ndCBzZXQgREVGQVVMVCwgdW5zdXBwb3J0ZWQgLSBtYWtlcyBsZW5ndGggZGlzcGxheSBpbmNvcnJlY3RseQorCSAgaW4gc29tZSBjYXNlcy4KKworMjAwNC0xMi0wNyAgQ2hyaXN0aWFuIEZyZWRyaWsgS2FsYWdlciBTY2hhbGxlciAgPHVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIGdzdC9tb25vc2NvcGUvUkVBRE1FOiByZW1vdmUgYmx1cmIgYWJvdXQgZmlsZXMgYmVpbmcgR1BMCisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOiBDaGFuZ2UgbGljZW5zZSBmaWVsZCB0byBMR1BMCisJKiBnc3QvbW9ub3Njb3BlL21vbm9zY29wZS5jOiBDaGFuZ2UgbGljZW5zZSB0byBCU0Qgd2l0aCBleHBsYW5hdGlvbgorCSAgbW9ub3Njb3BlIGlzIG5vdyBlZmZlY3RpdmVseSBMR1BMIGxpY2Vuc2VkCisKKzIwMDQtMTItMDcgIENocmlzdGlhbiBGcmVkcmlrIEthbGFnZXIgU2NoYWxsZXIgIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QvbW9ub3Njb3BlL1JFQURNRTogVXBkYXRlIGluZm9ybWF0aW9uIHRvIGJlIG1vcmUgY29ycmVjdAorCSogZ3N0L21vbm9zY29wZS9jb252b2x2ZS5jOiBSZWxpY2Vuc2UgdG8gTEdQTAorCSogZ3N0L21vbm9zY29wZS9jb252b2x2ZS5oOiBSZWxpY2Vuc2UgdG8gTEdQTAorCisyMDA0LTEyLTA2ICBBcndlZCB2LiBNZXJrYXR6IDx2Lm1lcmthdHpAZ214Lm5ldD4KKworCSogZ3N0L21wZWdhdWRpb3BhcnNlL2dzdG1wZWdhdWRpb3BhcnNlLmM6IChnc3RfbXAzcGFyc2VfY2hhaW4pOgorCSAgc2V0IEJVRkZFUl9EVVJBVElPTiB0byBjb3JyZWN0IHZhbHVlcyAobXBlZzEgYXVkaW8gZnJhbWUgbGVuZ3RoIGlzIGZpeGVkKQorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9hdWRpb19wYWRfbGluayk6CisJICBzZXQgZGVmYXVsdF9kdXJhdGlvbiBmb3IgbXBlZzEgYXVkaW8KKworMjAwNC0xMi0wNiAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9nZXRfY2FwcyksIChnc3RfYWxzYV9jbG9zZV9hdWRpbyk6CisJKiBleHQvYWxzYS9nc3RhbHNhLmg6CisJICByZWZhY3RvciBiaWcgY2h1bmtzIG9mIHRoZSBjb3JlIGNhcHMgbmVnb3RpYXRpb24gY29kZSB0byBtYWtlIGl0CisJICBhIGxvdCBmYXN0ZXIsIGJlY2F1c2UgcGVvcGxlIGNsYWltIGl0J3MgcmVhbGx5IHNsb3cKKwkgIChhY3R1YWxseSwganVzdCBjYWNoZSB0aGUgZ2V0Y2FwcyB3aGVuIHRoZSBkZXZpY2UgaXMgb3BlbmVkKQorCisyMDA0LTEyLTA2ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYTUyZGVjL2dzdGE1MmRlYy5jOiAoZ3N0X2E1MmRlY19pbml0KSwKKwkoZ3N0X2E1MmRlY19oYW5kbGVfZXZlbnQpLCAoZ3N0X2E1MmRlY191cGRhdGVfc3RyZWFtaW5mbyksCisJKGdzdF9hNTJkZWNfaGFuZGxlX2ZyYW1lKSwgKGdzdF9hNTJkZWNfY2hhaW4pLAorCShnc3RfYTUyZGVjX2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJKiBleHQvYTUyZGVjL2dzdGE1MmRlYy5oOgorCSAgRG8gc29tZXRoaW5nIHVzZWZ1bCB3aXRoIHRpbWVzdGFtcHMuIE1ha2UgY2hhaW4tYmFzZWQgKHNpbmNlCisJICB0aGVyZSdzIHJlYWxseSBubyByZWFzb24gdG8gYmUgbG9vcGJhc2VkKS4KKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcHJvY2Vzc19uZXh0X2VudHJ5KToKKwkgIFVwZGF0ZSBjdXJyZW50X2J5dGUvZnJhbWUgY29ycmVjdGx5LgorCisyMDA0LTEyLTA0ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXBldGFnL2FwZWRlbXV4LmM6IChnc3RfYXBlX2RlbXV4X3BhcnNlX3RhZ3MpLAorCShnc3RfYXBlX2RlbXV4X3N0cmVhbV9pbml0KToKKwkgIEZvcndhcmQgdGFncywgdG9vLgorCisyMDA0LTEyLTA0ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXBldGFnL2FwZWRlbXV4LmM6IChnc3RfYXBlX2RlbXV4X3N0cmVhbV9pbml0KToKKwkgIExldCdzIG1ha2Ugc3VyZSB3ZSdyZSBkb25lIHR5cGVmaW5kaW5nIHdoZW4gZGV0ZWN0aW5nIHRhZ3MuCisKKzIwMDQtMTItMDMgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogKGdzdF9lYm1sX3JlYWRfY2xhc3NfaW5pdCksCisJKGdzdF9lYm1sX3JlYWRfaW5pdCksIChnc3RfZWJtbF9yZWFkX3VzZV9ldmVudCksCisJKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9pZCksIChnc3RfZWJtbF9wZWVrX2lkKSwKKwkoZ3N0X2VibWxfcmVhZF9zZWVrKSwgKGdzdF9lYm1sX3JlYWRfc2tpcCksCisJKGdzdF9lYm1sX3JlYWRfcmVzZXJ2ZSksIChnc3RfZWJtbF9yZWFkX2J1ZmZlciksCisJKGdzdF9lYm1sX3JlYWRfbWFzdGVyKToKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCShnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfY29udGVudHMpLAorCShnc3RfbWF0cm9za2FfZGVtdXhfbG9vcF9zdHJlYW0pLCAoZ3N0X21hdHJvc2thX2RlbXV4X2F1ZGlvX2NhcHMpOgorCSAgRGlzZ3VzdGluZ2x5IGV2aWwgaGFjayBmb3Igd29ya2luZyBhcm91bmQgSU5URVJSVVBUIGV2ZW50cyBhbmQKKwkgIHRoZWlyIGV4dHJlbWVseSBhbm5veWluZyBoYWJpdCBvZiBiZWluZyBhIHBhaW4gaW4gdGhlIGFzcy4gV2UKKwkgIHNpbXBseSBwZWVrIGEgY2x1c3RlciBiZWZvcmUgcmVhZGluZyBhbnkgb2YgaXQuCisKKzIwMDQtMTItMDMgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9tdXNlcGFjay9nc3RtdXNlcGFja2RlYy5jcHA6CisJICBUaGVyZSdzIGFsc28gZmxvYXRpbmcgcG9pbnQgbGlibXVzZXBhY2tzLgorCisyMDA0LTEyLTAzICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9jaGFucG9zX2Zyb21fZ3N0KSwKKwkoZ3N0X2ZhYWRfY2hhbnBvc190b19nc3QpLCAoZ3N0X2ZhYWRfY2hhaW4pOgorCSAgU2V0IERVUkFUSU9OIGV2ZW4gaWYgc291cmNlIGJ1ZmZlciBkaWRuJ3QuIEFsc28gdXNlIGluY3JlYXNpbmcKKwkgIHRpbWVzdGFtcHMuCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6CisJKGdzdF9yaWZmX2NyZWF0ZV9hdWRpb19jYXBzX3dpdGhfZGF0YSk6CisJICBCbG9ja19hbGlnbiBjYW4gaGF2ZSBsYXJnZXIgdmFsdWVzIHRoYW4gODE5Mi4KKworMjAwNC0xMi0wMiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2xhdy9hbGF3LWRlY29kZS5jOiAoYWxhd2RlY19nZXRjYXBzKSwgKGFsYXdkZWNfbGluayk6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6IChhbGF3ZW5jX2dldGNhcHMpLCAoYWxhd2VuY19saW5rKToKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6IChtdWxhd2RlY19nZXRjYXBzKSwgKG11bGF3ZGVjX2xpbmspOgorCSogZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYzogKG11bGF3ZW5jX2dldGNhcHMpLCAobXVsYXdlbmNfbGluayk6CisJICBGaXggY2Fwcy4KKworMjAwNC0xMi0wMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL3Y0bC92NGxfY2FsbHMuYzogKGdzdF92NGxfZ2V0X2NoYW5fbmFtZXMpOgorCSAgRml4IGxvZ2ljIGJ1Zy4KKworMjAwNC0xMi0wMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ190eXBlX2ZpbmQpOgorCSAgWWF5LCBhbm90aGVyIG9uZS4KKworMjAwNC0xMi0wMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2VzZC9lc2RzaW5rLmM6IChnc3RfZXNkc2lua19jaGFpbik6CisJICBNYWtlIGVycm9yIGFjdHVhbGx5IHNheSBzb21ldGhpbmcgdXNlZnVsIChmaXhlcyAjMTU2Nzk4KS4KKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzoKKwkoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX2NhcHNfd2l0aF9kYXRhKSwKKwkoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX3RlbXBsYXRlX2NhcHMpOgorCSAgQWRkIEludGVsIFZpZGVvIDUuMCBmb3VyY2MgKElWNTApLgorCisyMDA0LTEyLTAxICBDaHJpc3RvcGhlIEZlcmdlYXUgIDx0ZXVmQGdub21lLm9yZz4KKworCSogZXh0L21hZC9nc3RtYWQuYzogKG1wZzEyM19wYXJzZV94aW5nX2hlYWRlcik6IGZpeCB4aW5nIGhlYWRlcgorCWRldGVjdGlvbiBvbiBtb25vIGFuZCBzdGVyZW8gbXAzIGZpbGVzLgorCisyMDA0LTEyLTAxICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdzdF9wbGF5X2Jhc2VfYmluX2NoYW5nZV9zdGF0ZSk6CisJICBEb24ndCBjcmFzaCBvbiBFTVBUWSBjYXBzIChlLmcuIHdoZW4gdGhlIGRlbXV4ZXIgZGlkbid0IHJlY29nbml6ZQorCSAgdGhlIGNvbnRhaW5lZCBzdHJlYW0pLgorCisyMDA0LTEyLTAxICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9zcmNjb25uZWN0KSwgKGdzdF9mYWFkX2NoYWluKToKKwkgIE9vcHMsIHJlbW92ZSBkZWJ1Zy4KKworMjAwNC0xMi0wMSAgU2ViYXN0aWVuIENvdGUgIDxzYzVAaGVybWVzLnVzaGVyYi5jYT4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2xhdy9hbGF3LWRlY29kZS5jOiAoYWxhd2RlY19nZXRjYXBzKToKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6IChtdWxhd2RlY19nZXRjYXBzKToKKwkgIFByZXZlbnQgd2FybmluZ3Mgd2hlbiBuZWdvdGlhdGluZyBjYXBzIChmaXhlcyAjMTU5MzM4KS4KKworMjAwNC0xMi0wMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29sb3JzcGFjZS5jOgorCShnc3RfZmZtcGVnY3NwX2NoYWluKToKKwkgIFJlbW92ZSBvbGQgbGVmdG92ZXIgdGhhdCBzaG91bGRuJ3QgYmUgdGhlcmUuLi4KKworMjAwNC0xMi0wMSAgU2ViYXN0aWVuIENvdGUgIDxzYzVAaGVybWVzLnVzaGVyYi5jYT4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9yZWFkX3VzZV9ldmVudCk6CisJICBEb24ndCBmb3J3YXJkIERJU0NPTlQgZXZlbnRzIChmaXhlcyAjMTU5Njg0KS4KKworMjAwNC0xMi0wMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKHJlbW92ZV9zaW5rcyksIChzZXR1cF9zaW5rcyk6CisJICBVbmxpbmsgbWFudWFsbHkgc2luY2Ugc29tZXRpbWVzIGJpbiBkaXNwb3NhbCAoYW5kIHRoZXJlZm9yZQorCSAgcGFkIHVubGlua2luZykgaXMgZGVsYXllZCwgd2hpY2ggd2lsbCBjYXVzZSBhIG5ldyBtZWRpYSBmaWxlCisJICB0byBub3QgYmUgYWJsZSB0byBzdGFydCBwbGF5aW5nIGluc3RhbnRseS4KKworMjAwNC0xMS0yOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHN0cmVhbWluZm8uYzogKHN0cmVhbV9pbmZvX211dGVfcGFkKToKKwkgIE9uIG11dGUgb2YgYW4gdW5saW5rZWQgc3RyZWFtLCBjaGVjayBmb3IgcGFkIGF2YWlsYWJpbGl0eSBzbworCSAgd2UgZG9uJ3QgY3Jhc2ggb24gdW5saW5rZWQgcGFkLgorCisyMDA0LTExLTI5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksCisJKGdzdF9hdmlfZGVtdXhfbWFzc2FnZV9pbmRleCk6CisJICBGaXggcXVpdGUgaHVtaWxpYXRpbmcgYnVnIGluIG9taXR0aW5nIDAtc2l6ZWQgaW5kZXggY2h1bmtzIGJ1dAorCSAgZm9yZ2V0dGluZyB0byBjb3VudCB0aGVtIGZvciB0aW1lc3RhbXBzLgorCisyMDA0LTExLTI5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYTUyZGVjL2dzdGE1MmRlYy5jOiAoZ3N0X2E1MmRlY19sb29wKToKKwkgIEFjdHVhbGx5IGxlYXZlIHRoZSBsb29wIGlmIHdlIGZhaWxlZCB0byBzeW5jLiBEb24ndCBjcmFzaC4KKworMjAwNC0xMS0yOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21wZWdzdHJlYW0vZ3N0ZHZkZGVtdXguYzogKGdzdF9kdmRfZGVtdXhfZ2V0X2F1ZGlvX3N0cmVhbSksCisJKGdzdF9kdmRfZGVtdXhfcHJvY2Vzc19wcml2YXRlKToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdGR2ZGRlbXV4Lmg6CisJICBGaXggY3Jhc2ggKCMxNTk3NTkpLiBEb2Vzbid0IHdvcmssIHRob3VnaC4gOi0oLgorCisyMDA0LTExLTI4ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0Y2hhbm5lbG1peC5jOiAoZ3N0X2F1ZGlvX2NvbnZlcnRfbWl4KToKKwkgIG1vcmUgb3ZlcndyaXRpbmcgcHJvdGVjdGlvbiBkdWUgdG8gbW9kaWZ5aW5nIGNoYW5uZWxzIG9uZSBieSBvbmUKKwkgIGluc3RlYWQgb2YgYWxsIGF0IG9uY2UKKworMjAwNC0xMS0yOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RjaGFubmVsbWl4LmM6CisJKGdzdF9hdWRpb19jb252ZXJ0X2ZpbGxfbm9ybWFsaXplKToKKwkgIE5vcm1hbGl6ZSB1c2luZyBhYnNvbHV0ZSB2YWx1ZXMuCisKKzIwMDQtMTEtMjggIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2RpcmVjdGZiL01ha2VmaWxlLmFtOgorCSogZXh0L2RpcmVjdGZiL2RpcmVjdGZidmlkZW9zaW5rLmM6IChnc3RfZGlyZWN0ZmJ2aWRlb3NpbmtfY3JlYXRlKSwKKwkoZ3N0X2RpcmVjdGZidmlkZW9zaW5rX2dldF9waXhlbF9mb3JtYXQpLAorCShnc3RfZGlyZWN0ZmJ2aWRlb3NpbmtfZ2V0X2Zvcm1hdF9mcm9tX2ZvdXJjYyksCisJKGdzdF9kaXJlY3RmYnZpZGVvc2lua19maXhhdGUpLCAoZ3N0X2RpcmVjdGZidmlkZW9zaW5rX2dldGNhcHMpLAorCShnc3RfZGlyZWN0ZmJ2aWRlb3Npbmtfc2lua19saW5rKSwKKwkoZ3N0X2RpcmVjdGZidmlkZW9zaW5rX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9kaXJlY3RmYnZpZGVvc2lua19jaGFpbiksIChnc3RfZGlyZWN0ZmJ2aWRlb3NpbmtfYnVmZmVyX2ZyZWUpLAorCShnc3RfZGlyZWN0ZmJ2aWRlb3NpbmtfYnVmZmVyX2FsbG9jKSwKKwkoZ3N0X2RpcmVjdGZidmlkZW9zaW5rX2ludGVyZmFjZV9zdXBwb3J0ZWQpLAorCShnc3RfZGlyZWN0ZmJ2aWRlb3NpbmtfaW50ZXJmYWNlX2luaXQpLAorCShnc3RfZGlyZWN0ZmJ2aWRlb3NpbmtfbmF2aWdhdGlvbl9zZW5kX2V2ZW50KSwKKwkoZ3N0X2RpcmVjdGZidmlkZW9zaW5rX25hdmlnYXRpb25faW5pdCksCisJKGdzdF9kaXJlY3RmYnZpZGVvc2lua19zZXRfcHJvcGVydHkpLAorCShnc3RfZGlyZWN0ZmJ2aWRlb3NpbmtfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2RpcmVjdGZidmlkZW9zaW5rX2ZpbmFsaXplKSwgKGdzdF9kaXJlY3RmYnZpZGVvc2lua19pbml0KSwKKwkoZ3N0X2RpcmVjdGZidmlkZW9zaW5rX2Jhc2VfaW5pdCksCisJKGdzdF9kaXJlY3RmYnZpZGVvc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X2RpcmVjdGZidmlkZW9zaW5rX2dldF90eXBlKSwgKHBsdWdpbl9pbml0KToKKwkqIGV4dC9kaXJlY3RmYi9kaXJlY3RmYnZpZGVvc2luay5oOiBBZGRpbmcgYSBmaXJzdCB2ZXJzaW9uIG9mCisJZGlyZWN0ZmJ2aWRlb3NpbmsuCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2luaXQpOiBJbml0aWFsaXppbmcgc29tZQorCW1vcmUuCisKKzIwMDQtMTEtMjggIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RjaGFubmVsbWl4LmM6IChnc3RfYXVkaW9fY29udmVydF9taXgpOgorCSAgd2FsayB0aGUgc2FtcGxlcyBiYWNrd2FyZHMgaWYgb3V0X2NoYW5uZWxzID4gaW5fY2hhbm5lbHMgc28gd2UgZG9uJ3QKKwkgIG92ZXJ3cml0ZSBkYXRhCisKKzIwMDQtMTEtMjggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvTWFrZWZpbGUuYW06CisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiAoZ3N0X2F1ZGlvX2NvbnZlcnRfaW5pdCksCisJKGdzdF9hdWRpb19jb252ZXJ0X2xpbmspLCAoZ3N0X2F1ZGlvX2NvbnZlcnRfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfY2hhbm5lbHMpOgorCSogZ3N0L2F1ZGlvY29udmVydC9nc3RjaGFubmVsbWl4LmM6CisJKGdzdF9hdWRpb19jb252ZXJ0X3Vuc2V0X21hdHJpeCksCisJKGdzdF9hdWRpb19jb252ZXJ0X2ZpbGxfaWRlbnRpY2FsKSwKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfZmlsbF9jb21wYXRpYmxlKSwKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfZGV0ZWN0X3BvcyksIChnc3RfYXVkaW9fY29udmVydF9maWxsX29uZV9vdGhlciksCisJKGdzdF9hdWRpb19jb252ZXJ0X2ZpbGxfb3RoZXJzKSwKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfZmlsbF9ub3JtYWxpemUpLAorCShnc3RfYXVkaW9fY29udmVydF9maWxsX21hdHJpeCksIChnc3RfYXVkaW9fY29udmVydF9zZXR1cF9tYXRyaXgpLAorCShnc3RfYXVkaW9fY29udmVydF9wYXNzdGhyb3VnaCksIChnc3RfYXVkaW9fY29udmVydF9taXgpOgorCSogZ3N0L2F1ZGlvY29udmVydC9nc3RjaGFubmVsbWl4Lmg6CisJICBJbXBsZW1lbnQgYSBjaGFubmVsIG1peGVyLgorCisyMDA0LTExLTI4ICBNYXJ0aW4gU290byAgPG1hcnRpbnNvdG9AdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jIChnc3RfYWxzYV9zaW5rX2xvb3ApOgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5oOgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5jIChnc3RfYWxzYV9zZXRfY2xvY2spOgorCU1ha2UgYWxzYXNpbmsgYWN0dWFsbHkgaG9ub3IgZ3N0X2VsZW1lbnRfc2V0X2Nsb2NrIGFuZCB1c2UgdGhhdAorCWNsb2NrIGluc3RlYWQgb2YgaXRzIGludGVybmFsIG9uZS4KKworMjAwNC0xMS0yNyAgQ2hyaXN0b3BoZSBGZXJnZWF1ICA8dGV1ZkBnbm9tZS5vcmc+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoc2V0dXBfc291cmNlKTogZml4ZWQgYSBjYXBzIGxlYWsKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fY2hhbmdlX3N0YXRlKTogbnVsbGlmeSBzb3VyY2UgYW5kIGRlY29kZXIgd2hlbgorCWdvaW5nIGZyb20gUkVBRFkgdG8gTlVMTCBzbyB0aGF0IHdlIGRvbid0IHRyeSB0byBkbyB3ZWlyZCBzdHVmZiB3aXRoCisJdGhlbSB3aGVuIGdvaW5nIGZyb20gTlVMTCB0byBSRUFEWQorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdzdF9wbGF5X2Jpbl9pbml0KTogdXNlIGdzdF9vYmplY3RfdW5yZWYKKwlpbnN0ZWFkIG9mIGdfb2JqZWN0X3VucmVmCisJKGdlbl92aWRlb19lbGVtZW50KSwgKGdlbl9hdWRpb19lbGVtZW50KTogbW9yZSByZWZjb3VudGluZyBmaXhlcywgbm93CisJaXQgc2hvdWxkIGJlIGNvcnJlY3QKKwkoZ3N0X3BsYXlfYmluX2NoYW5nZV9zdGF0ZSk6IGRvbid0IGNhbGwgcmVtb3ZlX3NpbmtzIGlmIHdlIGFyZQorCWN1cnJlbnRseSBkaXNwb3NpbmcgdGhlIG9iamVjdAorCisyMDA0LTExLTI3ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYTUyZGVjL2dzdGE1MmRlYy5jOiAoZ3N0X2E1MmRlY19sb29wKToKKwkgIERvbid0IGZvcmdldCBiYXNzIGlmIGl0J3MgdGhlcmUuIEVsc2UgbGVmdCBjaGFubmVsIGlzIHNpbGVudC4uLgorCisyMDA0LTExLTI3ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYTUyZGVjL2dzdGE1MmRlYy5jOiAoZ3N0X2E1MmRlY19sb29wKSwKKwkoZ3N0X2E1MmRlY19jaGFuZ2Vfc3RhdGUpOgorCSAgRG9uJ3QgZG8gc2FtcGxlIGFkanVzdGluZyBhbnltb3JlLCB3ZSB1c2UgZmxvYXQgYXVkaW8gbm93LgorCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKGdzdF9hdWRpb19jb252ZXJ0X2ZpeGF0ZSk6CisJICBEb24ndCBmaXhhdGUgdG8gbm9uLWV4aXN0aW5nIHByb3BlcnRpZXMuCisKKzIwMDQtMTEtMjcgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hNTJkZWMvZ3N0YTUyZGVjLmM6IChnc3RfYTUyZGVjX2NoYW5uZWxzKSwKKwkoZ3N0X2E1MmRlY19jaGFuZ2Vfc3RhdGUpOgorCSAgQWR2ZXJ0aXNlIHRoYXQgd2UgY2FuIGRvIHN1cnJvdW5kIHNvdW5kLgorCisyMDA0LTExLTI3ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYTUyZGVjL2dzdGE1MmRlYy5jOiAoZ3N0X2E1MmRlY19yZW5lZyk6CisJICBBZGQgYnVmZmVyLWZyYW1lcz0wLgorCSogZXh0L2R2ZHJlYWQvZHZkcmVhZHNyYy5jOiAoZHZkcmVhZHNyY19nZXRfdHlwZSksCisJKGR2ZHJlYWRzcmNfaW5pdCksIChkdmRyZWFkc3JjX2dldF9ldmVudF9tYXNrKSwKKwkoZHZkcmVhZHNyY19nZXRfcXVlcnlfdHlwZXMpLCAoZHZkcmVhZHNyY19nZXRfZm9ybWF0cyksCisJKGR2ZHJlYWRzcmNfc3JjcGFkX2V2ZW50KSwgKGR2ZHJlYWRzcmNfc3JjcGFkX3F1ZXJ5KSwKKwkoX3NlZWtfdGl0bGUpLCAoX3NlZWtfY2hhcHRlciksIChnZXRfbmV4dF9jZWxsX2ZvciksIChfcmVhZCksCisJKHNlZWtfc2VjdG9yKSwgKGR2ZHJlYWRzcmNfZ2V0KSwgKGR2ZHJlYWRzcmNfb3Blbl9maWxlKSwKKwkoZHZkcmVhZHNyY19jaGFuZ2Vfc3RhdGUpLCAoZHZkcmVhZHNyY191cmlfZ2V0X3R5cGUpLAorCShkdmRyZWFkc3JjX3VyaV9nZXRfcHJvdG9jb2xzKSwgKGR2ZHJlYWRzcmNfdXJpX2dldF91cmkpLAorCShkdmRyZWFkc3JjX3VyaV9zZXRfdXJpKSwgKGR2ZHJlYWRzcmNfdXJpX2hhbmRsZXJfaW5pdCk6CisJKiBleHQvZHZkcmVhZC9kdmRyZWFkc3JjLmg6CisJICBBZGQgc2Vla2luZywgcXVlcnlpbmcgZm9yIGJ5dGVzLCBzZWN0b3JzLCB0aXRsZSwgYW5nbGUgYW5kCisJICBjaGFwdGVyLiBIYW5kbGUgbXVsdGlwbGUgY2hhcHRlcnMuIFJlbGljZW5zZSB0byBMR1BMIGJlY2F1c2UKKwkgIEJpbGx5IGFncmVlZCBvbiB0aGF0ICh0aGFua3MgQmlsbHkhKS4KKworMjAwNC0xMS0yNyAgQ2hyaXN0b3BoZSBGZXJnZWF1ICA8dGV1ZkBnbm9tZS5vcmc+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChnc3RfYXVkaW9fY29udmVydF9kaXNwb3NlKToKKwljYWxsIHBhcmVudCBkaXNwb3NlIG1ldGhvZAorCisyMDA0LTExLTI3ICBNYXJ0aW4gU290byAgPG1hcnRpbnNvdG9AdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QtbGlicy9nc3QvYXVkaW8vYXVkaW9jbG9jay5jIChnc3RfYXVkaW9fY2xvY2tfc2V0X2FjdGl2ZSkKKwkoZ3N0X2F1ZGlvX2Nsb2NrX2dldF9pbnRlcm5hbF90aW1lKToKKwlGaXggYWN0aXZlIDwtPiBpbmFjdGl2ZSB0cmFuc2l0aW9uczogZW5zdXJlIHRpbWUgdmFsdWUgYWx3YXlzCisJZ3Jvd3MgYW5kIGF2b2lkIGFicnVwdCB2YWx1ZSBjaGFuZ2VzLgorCisyMDA0LTExLTI3ICBBcndlZCB2LiBNZXJrYXR6IDx2Lm1lcmthdHpAZ214Lm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L3R0YS9NYWtlZmlsZS5hbToKKwkqIGdzdC90dGEvY3JjMzIuaDoKKwkqIGdzdC90dGEvZmlsdGVycy5oOgorCSogZ3N0L3R0YS9nc3R0dGEuYzoKKwkqIGdzdC90dGEvZ3N0dHRhZGVjLmM6CisJKiBnc3QvdHRhL2dzdHR0YWRlYy5oOgorCSogZ3N0L3R0YS9nc3R0dGFwYXJzZS5jOgorCSogZ3N0L3R0YS9nc3R0dGFwYXJzZS5oOgorCSogZ3N0L3R0YS90dGFkZWMuaDoKKwkgIGFkZGVkIFRUQSBwYXJzZXIgYW5kIGRlY29kZXIKKworMjAwNC0xMS0yNiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9jbGFzc19pbml0KSwKKwkocHJvYmVfdHJpZ2dlcmVkKSwgKGNoZWNrX3F1ZXVlKSwgKGJ1ZmZlcl91bmRlcnJ1biksCisJKGJ1ZmZlcl9ydW5uaW5nKSwgKGJ1ZmZlcl9vdmVycnVuKSwgKGdlbl9zb3VyY2VfZWxlbWVudCksCisJKHNldHVwX3NvdXJjZSk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uaDoKKwkgIEltcGxlbWVudCBidWZmZXJpbmcuIE5lZWRzIHNvbWUgbW9yZSB3b3JrLgorCisyMDA0LTExLTI2ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOiAodGhlb3JhX2RlY19jaGFpbik6CisJICBGaXggaWxvZyBtYXNrIHJhbmdlIG92ZXJmbG93LgorCisyMDA0LTExLTI2ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9nZXRfY2Fwcyk6CisJICBEb24ndCBvbWl0IHRoZSBsYXN0ICh3aGljaCBpbiBjYXNlIG9mIGRtaXggaXMgdGhlIG9ubHkgOikgKQorCSAgY2hhbm5lbCBjb3VudC4gRG9uJ3Qgc2V0IGNoYW5uZWxzIGlmIDw9IDIuCisKKzIwMDQtMTEtMjYgIENocmlzdG9waGUgRmVyZ2VhdSAgPHRldWZAZ25vbWUub3JnPgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJpbi5jOiAoZ2VuX3ZpZGVvX2VsZW1lbnQpLAorCShnZW5fYXVkaW9fZWxlbWVudCk6IFJlbW92ZWQgMiBvYnNvbGV0ZSBjb21tZW50cworCisyMDA0LTExLTI2ICBTdGVwaGFuZSBMb2V1aWxsZXQgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBleHQvdm9yYmlzL29nZ3ZvcmJpc2VuYy5jCisJKiBleHQvdm9yYmlzL3ZvcmJpc2VuYy5jIDoKKwkgIGNoYW5nZSBkZXNjcmlwdGlvbiBmaWVsZHMgb2YgdGhvc2UgcGx1Z2lucyB0byBkaWZmZXJlbnRpYXRlIHRoZW0KKwkgIChwaXRpdmkgc2hvdyBFbmNvZGVycyBieSBkZXNjcmlwdGlvbiwgdGhleSBoYWQgdGhlIHNhbWUgb25lKQorCisyMDA0LTExLTI1ICBDaHJpc3RvcGhlIEZlcmdlYXUgIDx0ZXVmQGdub21lLm9yZz4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdzdF9wbGF5X2Jpbl9kaXNwb3NlKSwKKwkoZ3N0X3BsYXlfYmluX3NldF9wcm9wZXJ0eSksIChnZW5fdmlkZW9fZWxlbWVudCksCisJKGdlbl9hdWRpb19lbGVtZW50KToKKwkgIFJlZmNvdW50aW5nIGZpeGVzIGZvciBwcm92aWRlZCBhdWRpby0vdmlkZW9zaW5rcy4KKworMjAwNC0xMS0yNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdlbl92aWRlb19lbGVtZW50KSwKKwkoZ2VuX2F1ZGlvX2VsZW1lbnQpLCAoc2V0dXBfc2lua3MpLCAoZ3N0X3BsYXlfYmluX2NoYW5nZV9zdGF0ZSk6CisJICBEb24ndCByZWZlcmVuY2UgYWxsIHNpbmtzLCBidXQgb25seSB0aGUgdmlkZW8tIGFuZCBhdWRpb3NpbmtzLgorCSAgVGhlIHZpcy4gZWxlbWVudCBzaG91bGQgYmUgZGlzcG9zZWQgd2hlbiB3ZSdyZSBkb25lIHdpdGggaXQuCisJICBXZSBkb24ndCBoYXZlIGFueSByZWFzb24gdG8ga2VlcCBpdCBhcm91bmQuIFRoaXMgZml4ZXMgd2FybmluZ3MKKwkgIHdoZW4gcmV1c2luZyBwbGF5YmluIGZvciBwbGF5aW5nIG11bHRpcGxlIGF1ZGlvIGZpbGVzIHdpdGgKKwkgIHZpcy4gZW5hYmxlZC4gQWxzbyByZWxlYXNlIGF1ZGlvIGRldmljZSBvbiBwYXVzZSAtIGlkZWEgc3RvbGVuCisJICBmcm9tIFJoeXRobWJveC4KKworMjAwNC0xMS0yNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2E1MmRlYy9nc3RhNTJkZWMuYzogKGdzdF9hNTJkZWNfY2hhbm5lbHMpLCAoZ3N0X2E1MmRlY19wdXNoKSwKKwkoZ3N0X2E1MmRlY19yZW5lZyksIChnc3RfYTUyZGVjX2xvb3ApLCAocGx1Z2luX2luaXQpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfZ2V0X2NhcHMpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYXBsdWdpbi5jOiAocGx1Z2luX2luaXQpOgorCSogZXh0L2R0cy9nc3RkdHNkZWMuYzogKGdzdF9kdHNkZWNfY2hhbm5lbHMpLAorCShnc3RfZHRzZGVjX3JlbmVnb3RpYXRlKSwgKGdzdF9kdHNkZWNfbG9vcCksIChwbHVnaW5faW5pdCk6CisJKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9pbml0KSwgKGdzdF9mYWFkX2NoYW5wb3NfZnJvbV9nc3QpLAorCShnc3RfZmFhZF9jaGFucG9zX3RvX2dzdCksIChnc3RfZmFhZF9zaW5rY29ubmVjdCksCisJKGdzdF9mYWFkX3NyY2dldGNhcHMpLCAoZ3N0X2ZhYWRfc3JjY29ubmVjdCksIChnc3RfZmFhZF9jaGFpbiksCisJKGdzdF9mYWFkX2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJKiBleHQvZmFhZC9nc3RmYWFkLmg6CisJKiBleHQvdm9yYmlzL3ZvcmJpcy5jOiAocGx1Z2luX2luaXQpOgorCSogZXh0L3ZvcmJpcy92b3JiaXNkZWMuYzogKHZvcmJpc19kZWNfY2hhaW4pOgorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2F1ZGlvLmM6IChwbHVnaW5faW5pdCk6CisJKiBnc3QtbGlicy9nc3QvYXVkaW8vbXVsdGljaGFubmVsLmM6CisJKGdzdF9hdWRpb19jaGVja19jaGFubmVsX3Bvc2l0aW9ucyksCisJKGdzdF9hdWRpb19nZXRfY2hhbm5lbF9wb3NpdGlvbnMpLAorCShnc3RfYXVkaW9fc2V0X2NoYW5uZWxfcG9zaXRpb25zKSwKKwkoZ3N0X2F1ZGlvX3NldF9zdHJ1Y3R1cmVfY2hhbm5lbF9wb3NpdGlvbnNfbGlzdCksCisJKGFkZF9saXN0X3RvX3N0cnVjdCksIChnc3RfYXVkaW9fc2V0X2NhcHNfY2hhbm5lbF9wb3NpdGlvbnNfbGlzdCksCisJKGdzdF9hdWRpb19maXhhdGVfY2hhbm5lbF9wb3NpdGlvbnMpOgorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL211bHRpY2hhbm5lbC5oOgorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL3Rlc3RjaGFubmVscy5jOiAobWFpbik6CisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOgorCShnc3RfYXVkaW9fY29udmVydF9jbGFzc19pbml0KSwgKGdzdF9hdWRpb19jb252ZXJ0X2luaXQpLAorCShnc3RfYXVkaW9fY29udmVydF9kaXNwb3NlKSwgKGdzdF9hdWRpb19jb252ZXJ0X2dldGNhcHMpLAorCShnc3RfYXVkaW9fY29udmVydF9wYXJzZV9jYXBzKSwgKGdzdF9hdWRpb19jb252ZXJ0X2xpbmspLAorCShnc3RfYXVkaW9fY29udmVydF9maXhhdGUpLCAoZ3N0X2F1ZGlvX2NvbnZlcnRfY2hhbm5lbHMpOgorCSogZ3N0L2F1ZGlvY29udmVydC9wbHVnaW4uYzogKHBsdWdpbl9pbml0KToKKwkgIFN1cnJvdW5kIHNvdW5kIHN1cHBvcnQuCisKKzIwMDQtMTEtMjUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfZGVtdXhfcHVzaCk6CisJICBGaXggcG9zaXRpb24gZm9yIGRpc2NvbnQgaWYgd2UncmUgY2xvc2UgYXMgd2VsbC4gTml0cGlja2luZywgYnV0CisJICBzYXZlcyBhIGZldyBtaWxsaXNlY29uZHMgb2YgZXh0cmEgd2FpdGluZyBvciBza2lwcGluZy4KKworMjAwNC0xMS0yNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAoZ3N0X2RlY29kZV9iaW5fZmFjdG9yeV9maWx0ZXIpOgorCSAgV2Ugc29tZXRpbWVzIG5lZWQgcGFyc2VycyBmb3IgcGxheWJhY2ssIHNvIGFkZCB0aG9zZSB0b28uCisKKzIwMDQtMTEtMjUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGdzdC9hcGV0YWcvTWFrZWZpbGUuYW06CisJKiBnc3QvYXBldGFnL2FwZWRlbXV4LmM6IChnc3RfYXBlX2RlbXV4X2dldF90eXBlKSwKKwkoZ3N0X2FwZV9kZW11eF9iYXNlX2luaXQpLCAoZ3N0X2FwZV9kZW11eF9jbGFzc19pbml0KSwKKwkoZ3N0X2FwZV9kZW11eF9pbml0KSwgKGdzdF9hcGVfZGVtdXhfZ2V0X3NyY19mb3JtYXRzKSwKKwkoZ3N0X2FwZV9kZW11eF9nZXRfc3JjX3F1ZXJ5X3R5cGVzKSwKKwkoZ3N0X2FwZV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwgKGdzdF9hcGVfZGVtdXhfZ2V0X2V2ZW50X21hc2spLAorCShnc3RfYXBlX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLCAoZ3N0X2FwZV9kZW11eF9oYW5kbGVfZXZlbnQpLAorCShnc3RfYXBlX2RlbXV4X3R5cGVmaW5kX3BlZWspLCAoZ3N0X2FwZV9kZW11eF90eXBlZmluZF9nZXRfbGVuZ3RoKSwKKwkoZ3N0X2FwZV9kZW11eF90eXBlZmluZF9zdWdnZXN0KSwgKGdzdF9hcGVfZGVtdXhfdHlwZWZpbmQpLAorCShnc3RfYXBlX2RlbXV4X3BhcnNlX3RhZ3MpLCAoZ3N0X2FwZV9kZW11eF9zdHJlYW1faW5pdCksCisJKGdzdF9hcGVfZGVtdXhfc3RyZWFtX2RhdGEpLCAoZ3N0X2FwZV9kZW11eF9sb29wKSwKKwkoZ3N0X2FwZV9kZW11eF9jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L2FwZXRhZy9hcGVkZW11eC5oOgorCSogZ3N0L2FwZXRhZy9hcGV0YWcuYzogKHBsdWdpbl9pbml0KToKKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAoYXBldGFnX3R5cGVfZmluZCksCisJKHBsdWdpbl9pbml0KToKKwkgIEFQRSB2MS8yIHRhZyByZWFkZXIgcGx1cyB0eXBlZmluZCBmdW5jdGlvbi4KKworMjAwNC0xMS0yNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9hZGRfZWxlbWVudCk6CisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKG1wM190eXBlX2ZpbmQpOgorCSAgUmVtb3ZlIGhhY2tzIGZvciBvbGRlciBjb3JlLiBSZXF1aXJlIG5ld2VyIGNvcmUgdmVyc2lvbgorCSAgYWNjb3JkaW5nbHkuCisKKzIwMDQtMTEtMjUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9jZHhhcGFyc2UvTWFrZWZpbGUuYW06CisJKiBnc3QvY2R4YXBhcnNlL2dzdGNkeGFwYXJzZS5jOiAoZ3N0X2NkeGFwYXJzZV9nZXRfdHlwZSksCisJKGdzdF9jZHhhcGFyc2VfY2xhc3NfaW5pdCksIChnc3RfY2R4YXBhcnNlX2luaXQpLAorCShnc3RfY2R4YXBhcnNlX2xvb3ApLCAoZ3N0X2NkeGFwYXJzZV9jaGFuZ2Vfc3RhdGUpLCAocGx1Z2luX2luaXQpOgorCSogZ3N0L2NkeGFwYXJzZS9nc3RjZHhhcGFyc2UuaDoKKwkqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXN0cmlwLmM6IChnc3RfY2R4YXN0cmlwX2dldF90eXBlKSwKKwkoZ3N0X2NkeGFzdHJpcF9iYXNlX2luaXQpLCAoZ3N0X2NkeGFzdHJpcF9jbGFzc19pbml0KSwKKwkoZ3N0X2NkeGFzdHJpcF9pbml0KSwgKGdzdF9jZHhhc3RyaXBfZ2V0X3NyY19mb3JtYXRzKSwKKwkoZ3N0X2NkeGFzdHJpcF9nZXRfc3JjX3F1ZXJ5X3R5cGVzKSwKKwkoZ3N0X2NkeGFzdHJpcF9oYW5kbGVfc3JjX3F1ZXJ5KSwgKGdzdF9jZHhhc3RyaXBfZ2V0X2V2ZW50X21hc2spLAorCShnc3RfY2R4YXN0cmlwX2hhbmRsZV9zcmNfZXZlbnQpLCAoZ3N0X2NkeGFzdHJpcF9zdHJpcCksCisJKGdzdF9jZHhhc3RyaXBfc3luYyksIChnc3RfY2R4YXN0cmlwX2hhbmRsZV9ldmVudCksCisJKGdzdF9jZHhhc3RyaXBfY2hhaW4pLCAoZ3N0X2NkeGFzdHJpcF9jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L2NkeGFwYXJzZS9nc3RjZHhhc3RyaXAuaDoKKwkgIFNWQ0QvVkNEIGhlYWRlciBzdHJpcHBpbmcgc2VwYXJhdGVkIGZyb20gQ0RYQSBpbWFnZSBwYXJzaW5nLgorCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChtcDNfdHlwZV9maW5kKSwKKwkocGx1Z2luX2luaXQpOgorCSAgQWRkIFZDRC9TVkNEIGhlYWRlciB0eXBlZmluZGluZyBmb3IgVkNEL1NWQ0QuCisJKiBzeXMvdmNkL3ZjZHNyYy5jOiAoZ3N0X3ZjZHNyY19nZXRfdHlwZSksIChnc3RfdmNkc3JjX2Jhc2VfaW5pdCksCisJKGdzdF92Y2RzcmNfY2xhc3NfaW5pdCksIChnc3RfdmNkc3JjX2luaXQpLAorCShnc3RfdmNkc3JjX3NldF9wcm9wZXJ0eSksIChnc3RfdmNkc3JjX2dldF9wcm9wZXJ0eSksCisJKGdzdF92Y2RzcmNfZ2V0X2V2ZW50X21hc2spLCAoZ3N0X3ZjZHNyY19nZXRfcXVlcnlfdHlwZXMpLAorCShnc3RfdmNkc3JjX2dldF9mb3JtYXRzKSwgKGdzdF92Y2RzcmNfc3JjcGFkX2V2ZW50KSwKKwkoZ3N0X3ZjZHNyY19zcmNwYWRfcXVlcnkpLCAoZ3N0X3ZjZHNyY19nZXQpLAorCShnc3RfdmNkc3JjX29wZW5fZmlsZSksIChnc3RfdmNkc3JjX2Nsb3NlX2ZpbGUpLAorCShnc3RfdmNkc3JjX2NoYW5nZV9zdGF0ZSksIChnc3RfdmNkc3JjX21zZiksCisJKGdzdF92Y2RzcmNfcmVjYWxjdWxhdGUpLCAoZ3N0X3ZjZHNyY191cmlfZ2V0X3R5cGUpLAorCShnc3RfdmNkc3JjX3VyaV9nZXRfcHJvdG9jb2xzKSwgKGdzdF92Y2RzcmNfdXJpX2dldF91cmkpLAorCShnc3RfdmNkc3JjX3VyaV9zZXRfdXJpKSwgKGdzdF92Y2RzcmNfdXJpX2hhbmRsZXJfaW5pdCk6CisJKiBzeXMvdmNkL3ZjZHNyYy5oOgorCSAgRml4IHVwLCBhZGQgc2Vla2luZywgcXVlcnlpbmcsIFVSSSBpbnRlcmZhY2UuIFdvcmtzIGluIHRvdGVtIG5vdy4KKworMjAwNC0xMS0yNSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgYmFjayB0byBDVlMKKworPT09IHJlbGVhc2UgMC44LjYgPT09CisKKzIwMDQtMTEtMjUgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2NzLnBvOgorCSogcG8vZW5fR0IucG86CisJKiBwby9odS5wbzoKKwkqIHBvL2l0LnBvOgorCSogcG8vbmIucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL29yLnBvOgorCSogcG8vc3EucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJICByZWxlYXNpbmcgMC44LjYsICJJT1UgTG92ZSIKKworMjAwNC0xMS0yMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCXBhdGNoIGJ5OiBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOgorCSAgRml4IHVucGxheWFibGUgZmlsZXMgZXJyb3IgaGFuZGxpbmcuICBGaXhlcyAjMTU4MzY1CisKKzIwMDQtMTEtMjMgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwlwYXRjaCBieTogUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzoKKwkgIEZpeCBicm9rZW4gbXAzIHR5cGVmaW5kaW5nLiAgRml4ZXMgIzE1ODM3NQorCisyMDA0LTExLTIzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJcGF0Y2ggYnk6IFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOgorCSAgRml4IHN5bmMgb24gYnJva2VuIGZpbGVzLiAgRml4ZXMgIzE1ODk3NgorCisyMDA0LTExLTIzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJcGF0Y2ggYnk6IEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6CisJICBDb3B5IG92ZXIgYnVmZmVyIHByb3BlcnRpZXMuICBGaXhlcyAjMTU4ODMyCisKKzIwMDQtMTEtMjMgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwlwYXRjaCBieTogVGltLVBoaWxpcHAgTcO8bGxlciA8dC5pLm1AemVuLmNvLnVrPgorCisJKiBleHQvZHZkcmVhZC9kdmRyZWFkc3JjLmM6CisJICBGaXhlcyBpbnZhbGlkIHJlYWRzICgjMTU4NDYyKQorCisyMDA0LTExLTIzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuaDoKKwkqIHN5cy92NGwvdjRsc3JjX2NhbGxzLmM6CisJICBQcm9iZSBsZXNzIGFuZCBjYWNoZSBpdC4gIEZpeGVzICMxNTkxODcuCisKKzIwMDQtMTEtMjMgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC92aWRlb3JhdGUvZ3N0dmlkZW9yYXRlLmM6CisJICBIYW5kbGUgYWxsIHZpZGVvIGZvcm1hdHMuIEZpeGVzICMxNTkxODYuCisKKzIwMDQtMTEtMTYgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKwkqIGdzdC9zeW5hZXN0aGVzaWEvZ3N0c3luYWVzdGhlc2lhLmM6CisJKGdzdF9zeW5hZXN0aGVzaWFfY2xhc3NfaW5pdCksIChnc3Rfc3luYWVzdGhlc2lhX2luaXQpLAorCShnc3Rfc3luYWVzdGhlc2lhX2Rpc3Bvc2UpLCAoZ3N0X3N5bmFlc3RoZXNpYV9maW5hbGl6ZSksCisJKGdzdF9zeW5hZXN0aGVzaWFfc2lua19saW5rKSwgKGdzdF9zeW5hZXN0aGVzaWFfc3JjX2dldGNhcHMpLAorCShnc3Rfc3luYWVzdGhlc2lhX3NyY19saW5rKSwgKGdzdF9zeW5hZXN0aGVzaWFfY2hhaW4pLAorCShnc3Rfc3luYWVzdGhlc2lhX2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJRml4IHVwIHN5bmFlc3RoZXNpYSB0byB3b3JrIHVuZGVyIGRpZmZlcmVudCBzYW1wbGVyYXRlcy8gYnVmZmVyIHNpemVzLgorCUZvcmNlIDMyMHgyMDAgb3V0cHV0LCBhcyB0aGF0J3MgdGhlIG9ubHkgdGhpbmcgdGhlIHVuZGVybHlpbmcKKwlzeW5hZXN0aGVzaWEgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMuIFN0aWxsIG5lZWRzIHRvIGJlIG1hZGUKKwlyZS1lbnRyYW50LgorCisyMDA0LTExLTE0ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJICBGaXggbXBlZzJlbmMgY29uZmlndXJlIGNoZWNrIChzaW1pbGFyIHRvIG1wbGV4IGNoZWNrIGJlbG93KS4KKworMjAwNC0xMS0xNCAgS29vcCBNYXN0ICA8a3dtQHJhaW5ib3ctcnVubmVyLm5sPgorCisJcmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2RlY21hcC5jOgorCSAgRml4IGZvciBnY2MtMi45NSAoZml4ZXMgIzE1ODIyMSkuCisKKzIwMDQtMTEtMTMgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ3N0X3BsYXlfYmFzZV9iaW5fYWRkX2VsZW1lbnQpOgorCSAgUmUtYWRkIGNsb2NrIGRpc3RyaWJ1dGlvbiBoYWNrICh1bnRpbCBuZXcgY29yZSBpcyByZWxlYXNlZCkuCisJICBGaXhlcyAjMTU4MTI1LgorCisyMDA0LTExLTEzICBBcndlZCB2LiBNZXJrYXR6ICA8di5tZXJrYXR6QGdteC5uZXQ+CisJKiBjb25maWd1cmUuYWM6CisJICBmaXggbXBsZXggY29uZmlndXJlIGNoZWNrIHNlZ2ZhdWx0aW5nIG9uIHNvbWUgc3lzdGVtcyAoYnVnICMxNDA5OTQpCisKKzIwMDQtMTEtMTMgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfcGNtX3dhaXQpOgorCSAgYWRkIGRlYnVnZ2luZworCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfbG9vcCk6CisJICBkbyBhIHdhaXQgd2hlbiB3ZSBlbnRlciB0aGUgbG9vcCBmdW5jIHdpdGggbm8gZGF0YSBhdmFpbGFibGUgdG8KKwkgIHdyaXRlIGluc3RlYWQgb2YgZ2V0dGluZyBpbnRvIGFuIDEwMCUgQ1BVIGxvb3AgYnkganVzdCByZXR1cm5pbmcgYW5kCisJICBiZWluZyBjYWxsZWQgYWdhaW4gYnkgdGhlIHNjaGVkdWxlcgorCisyMDA0LTExLTEzICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9saWJ2aXN1YWwvdmlzdWFsLmM6IChnc3RfdmlzdWFsX2dldF90eXBlKSwKKwkobGlidmlzdWFsX2xvZ19oYW5kbGVyKSwgKGdzdF92aXN1YWxfZ2V0Y2FwcyksCisJKGdzdF92aXN1YWxfc3JjbGluayksIChnc3RfdmlzdWFsX2NoYW5nZV9zdGF0ZSksIChtYWtlX3ZhbGlkX25hbWUpLAorCShwbHVnaW5faW5pdCk6CisJICBVcGRhdGUgbGlidmlzdWFsIHRvIDAuMS43LiBMaW5rIGluIHRoZSBkZWJ1ZyBoYW5kbGluZyB0byBnc3RyZWFtZXIKKwkqIGV4dC9zbW9vdGh3YXZlL01ha2VmaWxlLmFtOgorCSogZXh0L3Ntb290aHdhdmUvZGVtby1vc3NzcmMuYzogKG1haW4pOgorCSogZXh0L3Ntb290aHdhdmUvZ3N0c21vb3Rod2F2ZS5jOiAoZ3N0X3Ntb290aHdhdmVfY2xhc3NfaW5pdCksCisJKGdzdF9zbW9vdGh3YXZlX2luaXQpLCAoZ3N0X3Ntb290aHdhdmVfZGlzcG9zZSksIChnc3Rfc3dfc2lua2xpbmspLAorCShnc3Rfc3dfc3JjbGluayksIChnc3Rfc21vb3Rod2F2ZV9jaGFpbiksIChnc3Rfc3dfY2hhbmdlX3N0YXRlKSwKKwkocGx1Z2luX2luaXQpOgorCSogZXh0L3Ntb290aHdhdmUvZ3N0c21vb3Rod2F2ZS5oOgorCSAgTWFrZSBnc3RzbW9vdGh3YXZlIGEgd29ya2luZyBlbGVtZW50IGluIHRoZSAyMHRoIGNlbnR1cnkuCisKKwkqIGdzdC9jaGFydC9nc3RjaGFydC5jOiAoZ3N0X2NoYXJ0X2luaXQpLCAoZ3N0X2NoYXJ0X3NyY2Nvbm5lY3QpOgorCSAgRml4IGluY29ycmVjdCBsaW5rIGZ1bmN0aW9uCisKKzIwMDQtMTEtMTIgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC92b2x1bWUvZ3N0dm9sdW1lLmM6CisJICBBbGxvdyBidWZmZXItZnJhbWVzPTAuCisKKzIwMDQtMTEtMTIgSWFpbiA8aWFpbmdub21lQGdtYWlsLmNvbT4KKworCSogY29uZmlndXJlLmFjOiBDaGVjayBmb3IgcG9seXBhdWRpbworCisJKiBleHQvTWFrZWZpbGUuYW06IEJ1aWxkIHRoZSBwb2x5cCBkaXIKKworCSogZXh0L3BvbHlwOiBUaGUgcG9seXBzaW5rIHNvdXJjZXMuCisKKzIwMDQtMTAtMzAgSWFpbiA8aWFpbmdub21lQGdtYWlsLmNvbT4KKworCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jIChpbnRlcmxlYXZlX3VubGluayk6IENoYW5nZSB0aGUgc3JjIHBhZHMKKwljYXBzIHRvIHJlZmxlY3QgdGhlIG5ldyBudW1iZXIgb2YgY2hhbm5lbHMuCisKKzIwMDQtMTEtMTIgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2xvb3ApOgorCSAgRml4IGZvciBuZWdvdGlhdGlvbiBvcmRlciBwcm9ibGVtLiBUaGlzIHdvdWxkIHNob3cgd2hlbiB0aGUKKwkgIEFMU0EgbG9vcGZ1Y3Rpb24gd2FzIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIGZ1bmN0aW9uLiBBTFNBCisJICB3b3VsZG4ndCBkbyBhbnl0aGluZyBiZWNhdXNlIHdlJ3JlIG5vdCBuZWdvdGlhdGVkIHlldCwgbGVhZGluZworCSAgdG8gYW4gaW5maW5pdGUgbG9vcC4gU2hvd2VkIGluIGUuZy4gUmh5dGhtYm94LiBGaXhlcyAjMTU4MDA2LgorCisyMDA0LTExLTExICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dC5pLm1AemVuLmNvLnVrPgorCisJcmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jOiAodm9yYmlzX2RlY19zcmNfcXVlcnkpOgorCSAgTm8gd2FybmluZ3MgKCMxNTc5ODYpLgorCisyMDA0LTExLTExICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKHBsdWdpbl9pbml0KToKKwkgIFByZWZlciBhcGV2MS8yIGFuZCBpZDN2MSAoYXQgZW5kIG9mIGZpbGUpIG92ZXIgbXVzZXBhY2suCisKKzIwMDQtMTEtMTEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X2xvb3Bfc3RyZWFtKToKKwkgIFNpZ25hbCBuby1tb3JlLXBhZHMgKHNvIGl0IHdvcmtzIGluIHBsYXliaW4pLgorCisyMDA0LTExLTExICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbXVzZXBhY2svZ3N0bXVzZXBhY2tyZWFkZXIuY3BwOgorCSAgV29ya2Fyb3VuZCBmb3Igb2xkZXIgY29yZS4KKworMjAwNC0xMS0xMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvaW1nY29udmVydC5jOiAoeXV2NDIwcF90b195dXY0MjIpOgorCSAgQWN0dWFsbHkgdGVzdCBmb3Igb2RkIHdpZHRoL2hlaWdodCByYXRoZXIgdGhhbiB0ZXN0aW5nIHdoZXRoZXIKKwkgIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIHRoYXQgd2FzIDAgYmVmb3JlIHdlIHN1YnRyYWN0ZWQgMSBpcyBub3cKKwkgIG5vdCBlcXVhbCB0byB6ZXJvICh3aGljaCBpdCBhbHdheXMgaXMpLgorCisyMDA0LTExLTExICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50LmM6IChnc3RfdjRsMl9pZmFjZV9zdXBwb3J0ZWQpOgorCUZpeCBjb21waWxhdGlvbiBpZiBIQVZFX1hWSURFTyBpcyBub3QgZGVmaW5lZAorCisyMDA0LTExLTExICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIHN5cy92NGwvZ3N0djRsZWxlbWVudC5jOiAoZ3N0X3Y0bF9pZmFjZV9zdXBwb3J0ZWQpOgorCUZpeCBjb21waWxhdGlvbiBpZiBIQVZFX1hWSURFTyBpcyBub3QgZGVmaW5lZAorCisyMDA0LTExLTExICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGdzdC9nb29tL2dzdGdvb20uYzogKGdzdF9nb29tX2NsYXNzX2luaXQpLCAoZ3N0X2dvb21faW5pdCksCisJKGdzdF9nb29tX2Rpc3Bvc2UpLCAoZ3N0X2dvb21fc2lua2Nvbm5lY3QpLCAoZ3N0X2dvb21fY2hhaW4pLAorCShnc3RfZ29vbV9jaGFuZ2Vfc3RhdGUpLCAocGx1Z2luX2luaXQpOgorCVVzZSB0aGUgYnl0ZXN0cmVhbSBhZGFwdGVyIHNvIGdvb20gZG9lc24ndCBkZXBlbmQgb24gdGhlIGlucHV0CisJYnVmZmVyIHNpemUuCisJQWRkIGEgZGVidWcgY2F0ZWdvcnkKKworMjAwNC0xMS0xMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfY2hhbmdlX3N0YXRlKToKKwkgIE9ubHkgc2V0IGhhcmR3YXJlIHBhcmFtZXRlcnMgKmFmdGVyKiBuZWdvdGlhdGlvbi4gQmVmb3JlCisJICBuZWdvdGlhdGlvbiwgaXQgd2lsbCBzZXQgQU5ZIGFuZCB0aGF0IHNlZW1zIHRvIGNhdXNlIGNyYXNoZXMKKwkgIChzZWUgZS5nLiAjMTUxMjg4LCAjMTUzMjI3KS4KKworMjAwNC0xMS0xMCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfZ2V0X3RpbWUpOgorCSAgVGhpcyBzZWVtcyB0byBiZSBhbnRpcXVlIGxlZnRvdmVyLiBJdCBuZWVkcyB0byBwYXNzIGVycm9yCisJICBjaGVja2luZy4KKwkqIGV4dC9zZGwvc2RsdmlkZW9zaW5rLmM6IChnc3Rfc2RsdmlkZW9zaW5rX2luaXQpLAorCShnc3Rfc2RsdmlkZW9zaW5rX2RlaW5pdHNkbCksIChnc3Rfc2RsdmlkZW9zaW5rX2luaXRzZGwpLAorCShnc3Rfc2RsdmlkZW9zaW5rX2Rlc3Ryb3kpLCAoZ3N0X3NkbHZpZGVvc2lua19jcmVhdGUpLAorCShnc3Rfc2RsdmlkZW9zaW5rX3Npbmtjb25uZWN0KSwgKGdzdF9zZGx2aWRlb3NpbmtfY2hhaW4pOgorCSAgRml4IEdzdFhPdmVybGF5IGltcGxlbWVudGF0aW9uICgjMTUxMDU5KS4KKworMjAwNC0xMS0xMCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCSAgRG9uJ3QgYXNzZXJ0ICgjMTU3ODUzKS4KKworMjAwNC0xMS0xMCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfY2hlY2tfZXZlbnQpLAorCSAgRml4IGJ5dGVzL3NhbXBsZXMgY29uZnVzdGlvbi4KKwkoZ3N0X2Fsc2Ffc2lua19tbWFwKSwgKGdzdF9hbHNhX3NpbmtfbG9vcCk6CisJICBGaXggZm9yIHVuZGVycnVuICgjMTQ0Mzg5KS4KKworMjAwNC0xMS0wOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChtcDNfdHlwZV9maW5kKToKKwkgIERpc2FibGUgaGFsZndheS1zZWVrIGZvciBwZW5kaW5nIHJlbGVhc2UgKHNpbmNlIGl0IG5lZWRzIGEgbmV3CisJICBjb3JlIHJlbGVhc2UpLgorCisyMDA0LTExLTA5ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuaDoKKwkqIHN5cy92NGwvdjRsc3JjX2NhbGxzLmM6CisJICBhZGQgYXV0b3Byb2JlLWZwcyBwcm9wZXJ0eSBzbyB3ZSBjYW4gc2VwYXJhdGUgYXV0b3Byb2JpbmcgcGFydHMKKworMjAwNC0xMS0wOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzoKKwkqIHN5cy92NGwvdjRsc3JjX2NhbGxzLmM6CisJaW5pdGlhbGlzZSBmb3VyY2MgdG8gY2F0Y2ggdW5zZXQgZm91cmNjJ3MsIGFuZCBkZWJ1ZworCisyMDA0LTExLTA5ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3BsYXliYWNrL1JFQURNRToKKwkqIGdzdC9wbGF5YmFjay9nc3RkZWNvZGViaW4uYzogKGNsb3NlX3BhZF9saW5rKSwgKHRyeV90b19saW5rXzEpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdzdF9wbGF5X2Jpbl9pbml0KSwKKwkoZ3N0X3BsYXlfYmluX2Rpc3Bvc2UpLCAoZ3N0X3BsYXlfYmluX3NldF9wcm9wZXJ0eSksCisJKHJlbW92ZV9zaW5rcyksIChzZXR1cF9zaW5rcyksIChnc3RfcGxheV9iaW5fY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3BsYXlfYmluX2dldF9ldmVudF9tYXNrcyksIChnc3RfcGxheV9iaW5fc2VuZF9ldmVudCksCisJKGdzdF9wbGF5X2Jpbl9nZXRfZm9ybWF0cyksIChnc3RfcGxheV9iaW5fY29udmVydCksCisJKGdzdF9wbGF5X2Jpbl9nZXRfcXVlcnlfdHlwZXMpLCAoZ3N0X3BsYXlfYmluX3F1ZXJ5KToKKwlDbGVhbnVwcyBhbmQgc29tZSBtb3JlIGRvY3VtZW50YXRpb24uCisKKzIwMDQtMTEtMDkgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzogKGdzdF9jYWNhc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X2NhY2FzaW5rX2luaXQpLCAoZ3N0X2NhY2FzaW5rX2NoYWluKToKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmg6CisJQ2FjYXNpbmsgaW5oZXJpdHMgZnJvbSBWaWRlb1NpbmssIHNvIGxldCB0aGF0IHN0b3JlIHRoZSBjbG9jay4KKworMjAwNC0xMS0wOSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9SRUFETUU6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdyb3VwX2Rlc3Ryb3kpLCAoZ3JvdXBfaXNfbXV0ZWQpLAorCShhZGRfc3RyZWFtKSwgKHVua25vd25fdHlwZSksIChhZGRfZWxlbWVudF9zdHJlYW0pLCAobm9fbW9yZV9wYWRzKSwKKwkocHJvYmVfdHJpZ2dlcmVkKSwgKHByZXJvbGxfdW5saW5rZWQpLCAobmV3X2RlY29kZWRfcGFkKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fY2hhbmdlX3N0YXRlKSwgKGdzdF9wbGF5X2Jhc2VfYmluX2ZvdW5kX3RhZyk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJpbi5jOiAoZ2VuX3Zpc19lbGVtZW50KSwgKHJlbW92ZV9zaW5rcyksCisJKHNldHVwX3NpbmtzKToKKwkqIGdzdC9wbGF5YmFjay9nc3RzdHJlYW1pbmZvLmM6IChnc3Rfc3RyZWFtX2luZm9fc2V0X211dGUpLAorCShnc3Rfc3RyZWFtX2luZm9faXNfbXV0ZSksIChnc3Rfc3RyZWFtX2luZm9fc2V0X3Byb3BlcnR5KToKKwkqIGdzdC9wbGF5YmFjay9nc3RzdHJlYW1pbmZvLmg6CisJVXBkYXRlZCBSRUFETUUuCisJT25seSBzd2l0Y2ggZ3JvdXBzIGlmIGFsbCBzdHJlYW1zIGhhdmUgbXV0ZWQgKEVPU2VkKS4KKwlTZW5kIFRhZ3MgaW4gc3luYyB3aXRoIHRoZSBzdHJlYW0gcGxheWJhY2sgaW5zdGVhZCBvZiBpbgorCXRoZSBwbGF5YmFjay9wcmVyb2xsIHBoYXNlLgorCVNvbWUgY2xlYW51cHMsIGZyZWUgdGhlIGZha2VzcmMgZWxlbWVudHMuCisKKzIwMDQtMTEtMDkgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfZ2V0X2NhcHNfaW50ZXJuYWwpOgorCSAgYnVmZmVyLWZyYW1lcyBwcm9wZXJ0eSB3YXMgbWlzc2luZworCSogZXh0L2FydHMvZ3N0X2FydHMuYzoKKwkgIHJhdGUgbWlzc2luZyBmcm9tIHNpbmtjYXBzCisJKiBleHQvYXVkaW9maWxlL2dzdGFmcGFyc2UuYzoKKwkqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzaW5rLmM6CisJKiBleHQvYXVkaW9maWxlL2dzdGFmc3JjLmM6CisJKiBleHQvc3dmZGVjL2dzdHN3ZmRlYy5jOgorCSAgaW50IGF1ZGlvIGRvZXNuJ3Qga25vdyBidWZmZXItZnJhbWVzCisJKiBleHQvY2RwYXJhbm9pYS9nc3RjZHBhcmFub2lhLmM6CisJICBpbnQgYXVkaW8gZG9lc24ndCBrbm93IGNodW5rc2l6ZSBlaXRoZXIKKwkqIGV4dC9uYXMvbmFzc2luay5jOgorCSAgaXQncyBlbmRpYW5uZXNzLCBub3QgZW5kaWFuZXNzCisJKiBnc3QtbGlicy9nc3QvYXVkaW8vYXVkaW8uaDoKKwkgIG1ha2UgZmxvYXQgc3RhbmRhcmQgcGFkIHRlbXBsYXRlIGNhcHMgcmVhbGx5IGRlc2NyaWJlIGZsb2F0CisJKiBnc3QvbGF3L211bGF3LmM6IChsaW5lYXJfZmFjdG9yeSk6CisJICBzaWduZWQgb25seSwgcGxlYXNlCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5jOgorCSAgd2lkdGhzIG9mIDIwIGFyZSBub3QgdmFsaWQKKworMjAwNC0xMS0wOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCVN1Ym1pdHRlZCBieTogTHVjYSBGZXJyZXR0aSA8ZWxsZS51Y2FAaW5maW5pdG8uaXQ+CisKKwkqIHBvL0xJTkdVQVM6CisJKiBwby9pdC5wbzoKKwkgIEFkZCBJdGFsaWFuCisKKzIwMDQtMTEtMDggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcGxheWJhY2svUkVBRE1FOgorCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAoY2xvc2VfcGFkX2xpbmspLCAodHJ5X3RvX2xpbmtfMSk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKHByb2JlX3RyaWdnZXJlZCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2NoYW5nZV9zdGF0ZSk6CisJVXBkYXRlZCBSRUFETUUsIGFkZGVkIG1vcmUgY29tbWVudHMgZm9yIGZpeG1lcyBldGMuLgorCisyMDA0LTExLTA4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9hZGRfZWxlbWVudCk6CisJV2UgY2FuIHJlbW92ZSB0aGlzIGhhY2sgbm93LgorCisyMDA0LTExLTA4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfYmxlbmRfYXl1dl9heXV2KSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9jaGVja2VyKSwgKGdzdF92aWRlb21peGVyX2ZpbGxfY29sb3IpLAorCShnc3RfdmlkZW9taXhlcl9ibGVuZF9idWZmZXJzKSwgKGdzdF92aWRlb21peGVyX2xvb3ApOgorCU9ubHkgbWl4IEFZVVYgZm9yIG1heGltdW0gcXVhbGl0eS4KKworMjAwNC0xMS0wOCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ2V0X3JlbGF0aXZlKSwgKGdzdF9vZ2dfZGVtdXhfc3JjX3F1ZXJ5KSwKKwkoZ3N0X29nZ19kZW11eF9wdXNoKSwgKGdzdF9vZ2dfcGFkX3B1c2gpOgorCSAgTGV0J3MgYWN0IGFzIGlmIHdlJ3JlIHN5bmNocm9uaXplZCBub3chIDopLgorCSogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzogKHRoZW9yYV9kZWNfY2hhaW4pOgorCSAgQWRkIHNvbWUgZGVidWcuCisKKzIwMDQtMTEtMDggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogKGdzdF9hbHBoYV9tZXRob2RfZ2V0X3R5cGUpLAorCShnc3RfYWxwaGFfc2V0X3Byb3BlcnR5KSwgKGdzdF9hbHBoYV9zaW5rX2xpbmspLAorCShnc3RfYWxwaGFfc2V0X2F5dXYpLCAoZ3N0X2FscGhhX3NldF9pNDIwKSwKKwkoZ3N0X2FscGhhX2Nocm9tYV9rZXlfYXl1diksIChnc3RfYWxwaGFfY2hyb21hX2tleV9pNDIwKSwKKwkoZ3N0X2FscGhhX2luaXRfcGFyYW1zKSwgKGdzdF9hbHBoYV9jaGFpbik6CisJSW1wbGVtZW50IGFscGhhIGZ1bmN0aW9ucyBmb3IgQVlVViB0b28sIHRoaXMgaW5jcmVhc2VzCisJYWNjdXJhY3kgcXVpdGUgYSBiaXQuCisKKzIwMDQtMTEtMDggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9hdmNvZGVjLmg6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2RlY21hcC5jOgorCShnc3RfZmZtcGVnX3BpeGZtdF90b19jYXBzKSwgKGdzdF9mZm1wZWdfY2Fwc190b19waXhmbXQpLAorCShnc3RfZmZtcGVnY3NwX2F2cGljdHVyZV9maWxsKToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvbG9yc3BhY2UuYzoKKwkoZ3N0X2ZmbXBlZ2NzcF9jYXBzX3JlbW92ZV9mb3JtYXRfaW5mbyk6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9pbWdjb252ZXJ0LmM6IChhdnBpY3R1cmVfZ2V0X3NpemUpLAorCShzaHJpbmsxMiksIChpbWdfZ2V0X2FscGhhX2luZm8pLCAoZGVpbnRlcmxhY2VfbGluZSksCisJKGRlaW50ZXJsYWNlX2xpbmVfaW5wbGFjZSk6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9pbWdjb252ZXJ0X3RlbXBsYXRlLmg6CisJQWRkZWQgQVlVViBjb2xvcnNwYWNlIGFuZCBoYW5kbGUgUkdCQSBhIGJpdCBtb3JlIHJlc3BlY3RmdWwuCisKKzIwMDQtMTEtMDggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfcGFkX3B1c2gpOgorCSAgQWN0dWFsbHkgYWx3YXlzIHNlbmQgYSBkaXNjb250IChjb3JuZXJjYXNlIHdoZW4gcmVzZW5kaW5nIHRoZQorCSAgc2FtZSBzZXJpYWwtdGFnZ2VkIGNoYWluIHR3aWNlKS4KKworMjAwNC0xMS0wOCAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3hjb250ZXh0X2NsZWFyKSwKKwkoZ3N0X3hpbWFnZXNpbmtfZmluYWxpemUpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua194Y29udGV4dF9jbGVhciksCisJKGdzdF94dmltYWdlc2lua19maW5hbGl6ZSk6IFNvbWUgbW9yZSBjbGVhbnVwcywgbGVha3MgZml4ZWQgYW5kIGNoZWNrcy4KKworMjAwNC0xMS0wOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAoYWFjX3R5cGVfZmluZCk6CisJRG9uJ3Qgc2VnZmF1bHQgb24gTlVMTCBkYXRhLgorCisyMDA0LTExLTA4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAodW5saW5rZWQpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXktbWFyc2hhbC5saXN0OgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9jbGFzc19pbml0KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5faW5pdCksIChncm91cF9jcmVhdGUpLCAoZ2V0X2FjdGl2ZV9ncm91cCksCisJKGdldF9idWlsZGluZ19ncm91cCksIChncm91cF9kZXN0cm95KSwgKGdyb3VwX2NvbW1pdCksCisJKHF1ZXVlX292ZXJydW4pLCAocmVtb3ZlX2dyb3VwcyksIChhZGRfc3RyZWFtKSwgKHVua25vd25fdHlwZSksCisJKGFkZF9lbGVtZW50X3N0cmVhbSksIChub19tb3JlX3BhZHMpLCAocHJvYmVfdHJpZ2dlcmVkKSwKKwkocHJlcm9sbF91bmxpbmtlZCksIChuZXdfZGVjb2RlZF9wYWQpLCAocmVtb3ZlZF9kZWNvZGVkX3BhZCksCisJKHN0YXRlX2NoYW5nZSksIChzZXR1cF9zb3VyY2UpLCAoZ3N0X3BsYXlfYmFzZV9iaW5fZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fY2hhbmdlX3N0YXRlKSwgKGdzdF9wbGF5X2Jhc2VfYmluX2FkZF9lbGVtZW50KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fbGlua19zdHJlYW0pLAorCShnc3RfcGxheV9iYXNlX2Jpbl9nZXRfc3RyZWFtaW5mbyk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uaDoKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnc3RfcGxheV9iaW5fY2xhc3NfaW5pdCksCisJKHJlbW92ZV9zaW5rcyksIChzZXR1cF9zaW5rcyksIChnc3RfcGxheV9iaW5fY2hhbmdlX3N0YXRlKToKKwlBZGQgc3VwcG9ydCBmb3IgY2hhaW5lZCBvZ2cgZmlsZXMuIFByZXBhcmUgZm9yIHBsYXlsaXN0CisJc3VwcG9ydC4gVGhpcyBwYXRjaCBpbnRyb2R1Y2VzIHRoZSBjb25jZXB0IG9mIHBhZCBncm91cHMsIHdoaWNoCisJdG9nZXRoZXIgY29tcG9zZSBvbmUgcGxheWFibGUgbWVkaWEgZmlsZS4KKworMjAwNC0xMS0wNyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiB0ZXN0c3VpdGUvZ3N0LWxpbnQ6IENoZWNrIGZvciBwYWQgdGVtcGxhdGVzIHRoYXQgYXJlbid0IHN0YXRpY2FsbHkKKwlzY29wZWQuCisKKzIwMDQtMTEtMDcgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkqIGV4dC9tdXNlcGFjay9NYWtlZmlsZS5hbToKKwkqIGV4dC9tdXNlcGFjay9nc3RtdXNlcGFja2RlYy5jcHA6CisJKiBleHQvbXVzZXBhY2svZ3N0bXVzZXBhY2tkZWMuaDoKKwkqIGV4dC9tdXNlcGFjay9nc3RtdXNlcGFja3JlYWRlci5jcHA6CisJKiBleHQvbXVzZXBhY2svZ3N0bXVzZXBhY2tyZWFkZXIuaDoKKwkgIEFkZCBtdXNlcGFjayBkZWNvZGVyLgorCSogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfYmFzZV9pbml0KToKKwkgIE1ha2UgcGFkIHRlbXBsYXRlcyBzdGF0aWMuCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKG1wM190eXBlX2ZpbmQpLAorCShwbHVnaW5faW5pdCk6CisJICBBZGQgbXVzZXBhY2sgdHlwZWZpbmRlciwgbWFrZSBtcDMgdHlwZWZpbmRpbmcgd29yayBoYWxmd2F5IHN0cmVhbSwKKwkgIHdoaWNoIGRvZXNuJ3QgYWN0dWFsbHkgd29yayB5ZXQgYmVjYXVzZSBpZDNkZW11eCBkb2Vzbid0IGltcGxlbWVudAorCSAgX2dldF9sZW5ndGgoKS4KKworMjAwNC0xMS0wNyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dtdXguYzogKGdzdF9vZ2dfbXV4X25leHRfYnVmZmVyKSwKKwkoZ3N0X29nZ19tdXhfcXVldWVfcGFkcyksIChnc3Rfb2dnX211eF9sb29wKToKKwkgIEZpeCBpbnRlcnJ1cHQgZXZlbnQgaGFuZGxpbmcgKCMxNDQ0MzYpLgorCisyMDA0LTExLTA3ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfZG9fdHlwZWZpbmQpOgorCSAgSGlkZSB1bnVzZWQgZ2xvcnkuCisKKzIwMDQtMTEtMDYgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0LmkubUB6ZW4uY28udWs+CisKKwlyZXZpZXdlZCBieTogUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L3ZvcmJpcy92b3JiaXNlbmMuYzogKHJhd19jYXBzX2ZhY3RvcnkpOgorCSAgRml4IHdlaXJkIGNhcHMgKCMxNTc1NDgpLgorCisyMDA0LTExLTA2ICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dC5pLm1AemVuLmNvLnVrPgorCisJUmV2aWV3ZWQgYnk6IFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtcGFyc2UuYzogKGdzdF9ydHBnc21fY2Fwc19uZWdvKToKKwkgIEFkZCBtaXNzaW5nIE5VTEwgdGVybWluYXRvciAoIzE1NzU0MykuCisKKzIwMDQtMTEtMDUgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC90Y3AvZ3N0dGNwLmg6CisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNpbmsuYzoKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c3JjLmM6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNpbmsuYzoKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc3JjLmM6CisJICBwb3J0cyBjYW4gZ28gdXAgdG8gNjU1MzUuICBNb3ZlIGNvbW1vbiBkZWZpbmVzIHRvIGdzdHRjcC5oCisKKzIwMDQtMTEtMDUgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdmlkZW90ZXN0c3JjL3ZpZGVvdGVzdHNyYy5jOiAocGFpbnRfc2V0dXBfWTQxQiksCisJKHBhaW50X2hsaW5lX1k0MUIpLCAocGFpbnRfc2V0dXBfWTQyQiksIChwYWludF9obGluZV9ZNDJCKToKKwlBZGRlZCB0d28gbW9yZSBjb2xvcnNwYWNlcy4KKworMjAwNC0xMS0wNSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvZGVjbWFwLmM6CisJKGdzdF9mZm1wZWdjc3BfYXZwaWN0dXJlX2ZpbGwpOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvaW1nY29udmVydC5jOiAoYXZwaWN0dXJlX2dldF9zaXplKSwKKwkoeXV2NDIycF90b195dXY0MjIpLCAoeXV2NDIwcF90b195dXY0MjIpLCAoc2hyaW5rMTIpLAorCShpbWdfY29udmVydCksIChkZWludGVybGFjZV9saW5lKSwgKGRlaW50ZXJsYWNlX2xpbmVfaW5wbGFjZSk6CisJTW9yZSBzdHJpZGUgZml4ZXMuCisKKzIwMDQtMTEtMDUgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogKGdzdF9hbHBoYV9zZXRfcHJvcGVydHkpLCAoZ3N0X2FscGhhX2FkZCksCisJKGdzdF9hbHBoYV9jaHJvbWFfa2V5KSwgKGdzdF9hbHBoYV9pbml0X3BhcmFtcyksIChnc3RfYWxwaGFfY2hhaW4pOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfYmxlbmRfYXl1dl9pNDIwKSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9jaGVja2VyKSwgKGdzdF92aWRlb21peGVyX2JsZW5kX2J1ZmZlcnMpLAorCShnc3RfdmlkZW9taXhlcl9sb29wKToKKwlNb3JlIHN0cmlkZSBmaXhlcy4KKworMjAwNC0xMS0wNSAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9jaGFpbik6CisJICBkb24ndCBvdmVyZmxvdyBkYXRhIGJ1ZmZlci4gRmx1c2ggbm90IG5lZWRlZCBzeW5jIGRhdGEgd2hlbiBzeW5jaW5nCisJICBmYWlsZWQuCisKKzIwMDQtMTEtMDQgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogKGdzdF9hbHBoYV9tZXRob2RfZ2V0X3R5cGUpLAorCShnc3RfYWxwaGFfY2xhc3NfaW5pdCksIChnc3RfYWxwaGFfaW5pdCksIChnc3RfYWxwaGFfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2FscGhhX2dldF9wcm9wZXJ0eSksIChnc3RfYWxwaGFfYWRkKSwgKGdzdF9hbHBoYV9jaHJvbWFfa2V5KSwKKwkoZ3N0X2FscGhhX2luaXRfcGFyYW1zKSwgKGdzdF9hbHBoYV9jaGFpbiksCisJKGdzdF9hbHBoYV9jaGFuZ2Vfc3RhdGUpOgorCVVwZGF0ZWQgdGhlIGNocm9tYSBrZXlpbmcgYWxnb3JpdGhtIHdpdGggc29tZXRoaW5nIG1vcmUKKwlzb3BoaXN0aWNhdGVkLgorCisyMDA0LTExLTAzICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfYmxlbmRfYXl1dl9pNDIwKSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9jaGVja2VyKSwgKGdzdF92aWRlb21peGVyX2ZpbGxfY29sb3IpLAorCShnc3RfdmlkZW9taXhlcl9ibGVuZF9idWZmZXJzKSwgKGdzdF92aWRlb21peGVyX2xvb3ApOgorCUZpeCBzdHJpZGUgaXNzdWVzLiBEb2VzIG5vdCBjb21wbGV0ZWx5IHdvcmsgZm9yIG9kZAorCWhlaWdodHMuCisKKzIwMDQtMTEtMDMgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogKGdzdF9hbHBoYV9tZXRob2RfZ2V0X3R5cGUpLAorCShnc3RfYWxwaGFfY2hyb21hX2tleSksIChnc3RfYWxwaGFfY2hhaW4pOgorCUZpeCBzdHJpZGUgaXNzdWVzLiBEb2VzIG5vdCBjb21wbGV0ZWx5IHdvcmsgZm9yIG9kZAorCWhlaWdodHMuCisKKzIwMDQtMTEtMDMgIENocmlzdG9waGUgRmVyZ2VhdSAgPHRldWZAZ25vbWUub3JnPgorCisJKiBnc3QvdmlkZW9zY2FsZS9nc3R2aWRlb3NjYWxlLmM6IChnc3RfdmlkZW9zY2FsZV9nZXRjYXBzKToKKwkqIGdzdC92aWRlb3NjYWxlL3ZpZGVvc2NhbGUuYzogKHZpZGVvc2NhbGVfZmluZF9ieV9zdHJ1Y3R1cmUpOgorCWxlYWsgZml4ZXMKKworMjAwNC0xMS0wMyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvZGVjbWFwLmM6CisJKGdzdF9mZm1wZWdjc3BfYXZwaWN0dXJlX2ZpbGwpOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvaW1nY29udmVydC5jOiAoYXZwaWN0dXJlX2dldF9zaXplKSwKKwkoYXZwaWN0dXJlX2FsbG9jKToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2ltZ2NvbnZlcnRfdGVtcGxhdGUuaDoKKwlVc2UgY29ycmVjdCBfZmlsbCBmdW5jdGlvbiB0byBnZXQgY29ycmVjdCBzdHJpZGVzLgorCisyMDA0LTExLTAyICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwKKwkoZ3N0X3F0ZGVtdXhfYWRkX3N0cmVhbSksIChxdGRlbXV4X3BhcnNlKSwgKHF0ZGVtdXhfcGFyc2VfdHJlZSksCisJKHF0ZGVtdXhfcGFyc2VfdWR0YSksIChxdGRlbXV4X3RhZ19hZGQpLCAoZ3N0X3F0ZGVtdXhfaGFuZGxlX2VzZHMpOgorCUNoYW5nZSBhbGwgZ19wcmludCgpcyB0byBkZWJ1Z2dpbmcuICBBZGQgYSBidW5jaCBvZiBjb25zaXN0ZW5jeQorCWNoZWNrcy4KKworMjAwNC0xMS0wMiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RkZWNvZGViaW4uYzogKGdzdF9kZWNvZGVfYmluX2NsYXNzX2luaXQpLAorCSh0cnlfdG9fbGlua18xKSwgKGdldF9vdXJfZ2hvc3RfcGFkKSwgKHJlbW92ZV9lbGVtZW50X2NoYWluKSwKKwkodW5saW5rZWQpLCAobm9fbW9yZV9wYWRzKSwgKGNsb3NlX2xpbmspOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9pbml0KSwKKwkodW5rbm93bl90eXBlKSwgKGFkZF9lbGVtZW50X3N0cmVhbSksIChuZXdfZGVjb2RlZF9wYWQpLAorCShyZW1vdmVkX2RlY29kZWRfcGFkKSwgKHNldHVwX3NvdXJjZSk6CisJKiBnc3QvcGxheWJhY2svZ3N0c3RyZWFtaW5mby5jOiAoZ3N0X3N0cmVhbV9pbmZvX2dldF90eXBlKSwKKwkoZ3N0X3N0cmVhbV9pbmZvX2NsYXNzX2luaXQpLCAoZ3N0X3N0cmVhbV9pbmZvX2luaXQpLAorCShnc3Rfc3RyZWFtX2luZm9fbmV3KSwgKGdzdF9zdHJlYW1faW5mb19kaXNwb3NlKSwKKwkoc3RyZWFtX2luZm9fbXV0ZV9wYWQpLCAoZ3N0X3N0cmVhbV9pbmZvX3NldF9wcm9wZXJ0eSksCisJKGdzdF9zdHJlYW1faW5mb19nZXRfcHJvcGVydHkpOgorCSogZ3N0L3BsYXliYWNrL2dzdHN0cmVhbWluZm8uaDoKKwlGaXggcGxheWJhY2sgb2YgbXVsdGlwbGUgZmlsZXMuCisJYSBzbGlnaHRseSBkaWZmZXJlbnQgYXBwcm9hY2ggdG8gaGFuZGxpbmcgZHluYW1pYyBwYWQgcmVtb3ZhbHMuCisJVGhpcyBvbmUgb25seSBsb29rcyBhdCBwYWRzIHRoYXQgd2UgaGF2ZSBsaW5rZWQuCisKKzIwMDQtMTEtMDEgIENocmlzdG9waGUgRmVyZ2VhdSAgPHRldWZAZ25vbWUub3JnPgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X2ZpbmFsaXplKTogZml4IGFuICJpbnZhbGlkCisJZnJlZSIgd2FybmluZyBmcm9tIGxpYmMuCisKKzIwMDQtMTEtMDEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RkZWNvZGViaW4uYzogKGdzdF9kZWNvZGVfYmluX2NsYXNzX2luaXQpLAorCShnZXRfdW5jb25uZWN0ZWRfZWxlbWVudCksIChyZW1vdmVfc3RhcnRpbmdfZnJvbSksIChwYWRfcmVtb3ZlZCksCisJKGNsb3NlX2xpbmspOgorCSAgSW1wbGVtZW50IHN1cHBvcnQgZm9yIGR5bmFtaWMgcGFkIGNoYW5naW5nLiBXZSBsaXN0ZW4gdG8gImxpdmUiCisJICBwYWQgcmVtb3ZhbHMgKGkuZS4gd2hpbGUgcGxheWluZykgYW5kIHJlLXNldHVwIGF1dG9wbHVnZ2luZworCSAgYWZ0ZXIgdGhhdC4gUGxheWJhc2ViaW4vcGxheWJpbiBuZWVkIHNvbWUgbW9yZSB3b3JrIGZvciB0aGlzCisJICB0byBmaW5hbGx5IHdvcmssIGJ1dCBkZWNvZGViaW4gc3VwcG9ydHMgKGFuZCByZXBsdWdzKSBjaGFpbmVkCisJICBvZ2cgbm93LgorCisyMDA0LTExLTAyICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX2NsYXNzX2luaXQpLCAoZ3N0X2Fsc2FfZGlzcG9zZSksCisJKGdzdF9hbHNhX2ZpbmFsaXplKToKKwkqIGV4dC9jZGF1ZGlvL2dzdGNkYXVkaW8uYzogKGdzdF9jZGF1ZGlvX2NsYXNzX2luaXQpLAorCShnc3RfY2RhdWRpb19maW5hbGl6ZSk6CisJKiBleHQvY2RwYXJhbm9pYS9nc3RjZHBhcmFub2lhLmM6IChjZHBhcmFub2lhX2NsYXNzX2luaXQpLAorCShjZHBhcmFub2lhX2ZpbmFsaXplKToKKwkqIGV4dC9kaXZ4L2dzdGRpdnhkZWMuYzogKGdzdF9kaXZ4ZGVjX2Rpc3Bvc2UpOgorCSogZXh0L2RpdngvZ3N0ZGl2eGVuYy5jOiAoZ3N0X2RpdnhlbmNfZGlzcG9zZSk6CisJKiBleHQvZHZkcmVhZC9kdmRyZWFkc3JjLmM6IChkdmRyZWFkc3JjX2NsYXNzX2luaXQpLAorCShkdmRyZWFkc3JjX2ZpbmFsaXplKToKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjZGVjX2NsYXNzX2luaXQpLAorCShnc3RfZmxhY2RlY19maW5hbGl6ZSk6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY2VuY19jbGFzc19pbml0KSwKKwkoZ3N0X2ZsYWNlbmNfZmluYWxpemUpOgorCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc2luay5jOiAoZ3N0X2dub21ldmZzc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X2dub21ldmZzc2lua19maW5hbGl6ZSk6CisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzcmMuYzogKGdzdF9nbm9tZXZmc3NyY19jbGFzc19pbml0KSwKKwkoZ3N0X2dub21ldmZzc3JjX2ZpbmFsaXplKToKKwkqIGV4dC9saWJmYW1lL2dzdGxpYmZhbWUuYzogKGdzdF9mYW1lZW5jX2NsYXNzX2luaXQpLAorCShnc3RfZmFtZWVuY19maW5hbGl6ZSk6CisJKiBleHQvbmFzL25hc3NpbmsuYzogKGdzdF9uYXNzaW5rX2NsYXNzX2luaXQpLAorCShnc3RfbmFzc2lua19maW5hbGl6ZSk6CisJKiBleHQvc2RsL3NkbHZpZGVvc2luay5jOiAoZ3N0X3NkbHZpZGVvc2lua19maW5hbGl6ZSksCisJKGdzdF9zZGx2aWRlb3NpbmtfY2xhc3NfaW5pdCk6CisJKiBleHQvc25kZmlsZS9nc3RzZi5jOiAoZ3N0X3NmX2Rpc3Bvc2UpOgorCSogZ3N0LWxpYnMvZ3N0L21peGVyL21peGVydHJhY2suYzogKGdzdF9taXhlcl90cmFja19kaXNwb3NlKToKKwkqIGdzdC1saWJzL2dzdC90dW5lci90dW5lcmNoYW5uZWwuYzogKGdzdF90dW5lcl9jaGFubmVsX2Rpc3Bvc2UpOgorCSogZ3N0LWxpYnMvZ3N0L3R1bmVyL3R1bmVybm9ybS5jOiAoZ3N0X3R1bmVyX25vcm1fZGlzcG9zZSk6CisJKiBnc3QtbGlicy9nc3QveHdpbmRvd2xpc3RlbmVyL3h3aW5kb3dsaXN0ZW5lci5jOgorCShnc3RfeF93aW5kb3dfbGlzdGVuZXJfZGlzcG9zZSk6CisJKiBnc3QvYXVkaW9zY2FsZS9nc3RhdWRpb3NjYWxlLmM6CisJKiBnc3QvcGxheW9uZGVtYW5kL2dzdHBsYXlvbmRlbWFuZC5jOiAocGxheV9vbl9kZW1hbmRfY2xhc3NfaW5pdCksCisJKHBsYXlfb25fZGVtYW5kX2ZpbmFsaXplKToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzogKGdzdF92aWRlb2JhbGFuY2VfZGlzcG9zZSk6CisJKiBnc3QvdmlkZW9zY2FsZS9nc3R2aWRlb3NjYWxlLmM6IChnc3RfdmlkZW9zY2FsZV9jaGFpbik6CisJKiBzeXMvY2Ryb20vZ3N0Y2RwbGF5ZXIuYzogKGNkcGxheWVyX2NsYXNzX2luaXQpLAorCShjZHBsYXllcl9maW5hbGl6ZSk6CisJKiBzeXMvZ2xzaW5rL2dsaW1hZ2VzaW5rLmM6IChnc3RfZ2xpbWFnZXNpbmtfZmluYWxpemUpLAorCShnc3RfZ2xpbWFnZXNpbmtfY2xhc3NfaW5pdCk6CisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogKGdzdF9vc3NlbGVtZW50X2NsYXNzX2luaXQpLAorCShnc3Rfb3NzZWxlbWVudF9maW5hbGl6ZSk6CisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3NzaW5rX2Rpc3Bvc2UpOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzogKGdzdF9vc3NzcmNfZGlzcG9zZSk6CisJKiBzeXMvdjRsL2dzdHY0bGVsZW1lbnQuYzogKGdzdF92NGxlbGVtZW50X2Rpc3Bvc2UpOgorCSAgRml4ZXMgYSBidW5jaCBvZiBwcm9ibGVtcyB3aXRoIGZpbmFsaXplIGFuZCBkaXNwb3NlIGZ1bmN0aW9ucywKKwkgIGVpdGhlciBhc3N1bXB0aW9ucyB0aGF0IGRpc3Bvc2UgaXMgb25seSBjYWxsZWQgb25jZSwgb3Igbm90IGNhbGxpbmcKKwkgIHRoZSBwYXJlbnQgY2xhc3MgZGlzcG9zZS9maW5hbGl6ZSBmdW5jdGlvbgorCisyMDA0LTExLTAxICBTdGVmYW4gS29zdCAgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBleHQvZXNkL2VzZHNpbmsuYzogKGdzdF9lc2RzaW5rX2luaXQpLCAoZ3N0X2VzZHNpbmtfbGluayk6CisJICBhZGRlZCB0d28gYXBpIHByZWNvbmRpdGlvbiBndWFyZHMKKwkgIHVzZSBnX3N0cmR1cCB3aXRoIGdldGVudiB0byBmaXggY3Jhc2ggd2hlbiB1c2luZyBFTlZWQVIKKworMjAwNC0xMS0wMSAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCSogZXh0L2VzZC9lc2RzaW5rLmM6IChnc3RfZXNkc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X2VzZHNpbmtfZmluYWxpemUpOgorCVVzZSBhIGZpbmFsaXplIGZ1bmN0aW9uLCBub3QgZGlzcG9zZSwgYW5kIG1vcmUgaW1wb3J0YW50bHksCisJY2FsbCB0aGUgcGFyZW50IGNsYXNzIGZpbmFsaXplIGZ1bmN0aW9uIHRvbworCisyMDA0LTExLTAxICBKb2hhbiBEYWhsaW4gIDxqb2hhbkBnbm9tZS5vcmc+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzoKKwkqIGdzdC90YWdzL2dzdHZvcmJpc3RhZy5jOgorCVBsdWcgbGVha3MuCisKKzIwMDQtMTAtMzEgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L3RhZ3MvZ3N0dm9yYmlzdGFnLmM6IChnc3Rfdm9yYmlzX3RhZ19jaGFpbik6CisJICBsb3RzYSBtZW1sZWFrcyB0b2RheS4gQnV0IHRoZXkncmUgYWxsIHNtYWxsLi4uCisKKzIwMDQtMTAtMzEgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19wYWRfcHVzaCk6CisJICBhbm90aGVyIG1lbWxlYWsgY3J1c2hlZAorCisyMDA0LTEwLTMxICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC90YWdzL2dzdHZvcmJpc3RhZy5jOiAoZ3N0X3RhZ190b192b3JiaXNfY29tbWVudHMpOgorCSAgZml4IG1lbWxlYWsKKworMjAwNC0xMC0zMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19wYWRfcHVzaCk6CisJICBIYWNrIHRvIHByZXZlbnQgY3Jhc2ggd2hlbiBnb2luZyB0byBSRUFEWSBpbnNpZGUgc2lnbmFsIGhhbmRsZXIKKwkgIHdoaWxlIHRoaXMgZnVuY3Rpb24gaXMgYWN0aXZlLgorCisyMDA0LTEwLTMxICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9NYWtlZmlsZS5hbToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2F2Y29kZWMuaDoKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2NvbW1vbi5oOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZHNwdXRpbC5jOiAoZHNwdXRpbF9zdGF0aWNfaW5pdCk6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9kc3B1dGlsLmg6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWcuYzogKHBsdWdpbl9pbml0KToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvZGVjbWFwLmM6CisJKGdzdF9mZm1wZWdfZ2V0X3BhbGV0dGUpLCAoZ3N0X2ZmbXBlZ19zZXRfcGFsZXR0ZSksCisJKGdzdF9mZm1wZWdfcGl4Zm10X3RvX2NhcHMpLCAoZ3N0X2ZmbXBlZ19zbXBmbXRfdG9fY2FwcyksCisJKGdzdF9mZm1wZWdjc3BfY29kZWN0eXBlX3RvX2NhcHMpLCAoZ3N0X2ZmbXBlZ19jYXBzX3RvX3NtcGZtdCksCisJKGdzdF9mZm1wZWdfY2Fwc190b19waXhmbXQpLCAoZ3N0X2ZmbXBlZ2NzcF9jYXBzX3dpdGhfY29kZWN0eXBlKSwKKwkoZ3N0X2ZmbXBlZ2NzcF9hdnBpY3R1cmVfZmlsbCk6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2RlY21hcC5oOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29sb3JzcGFjZS5jOgorCShnc3RfZmZtcGVnY3NwX2NhcHNfcmVtb3ZlX2Zvcm1hdF9pbmZvKSwgKGdzdF9mZm1wZWdjc3BfZ2V0Y2FwcyksCisJKGdzdF9mZm1wZWdjc3BfcGFkX2xpbmspLCAoZ3N0X2ZmbXBlZ2NzcF9nZXRfdHlwZSksCisJKGdzdF9mZm1wZWdjc3BfYmFzZV9pbml0KSwgKGdzdF9mZm1wZWdjc3BfY2xhc3NfaW5pdCksCisJKGdzdF9mZm1wZWdjc3BfaW5pdCksIChnc3RfZmZtcGVnY3NwX2NoYWluKSwKKwkoZ3N0X2ZmbXBlZ2NzcF9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X2ZmbXBlZ2NzcF9zZXRfcHJvcGVydHkpLAorCShnc3RfZmZtcGVnY3NwX2dldF9wcm9wZXJ0eSksIChnc3RfZmZtcGVnY29sb3JzcGFjZV9yZWdpc3Rlcik6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9pbWdjb252ZXJ0LmM6CisJKGF2Y29kZWNfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKSwgKGF2Y29kZWNfZ2V0X3BpeF9mbXRfbmFtZSksCisJKGF2Y29kZWNfZ2V0X3BpeF9mbXQpLCAoYXZwaWN0dXJlX2ZpbGwpLCAoYXZwaWN0dXJlX2xheW91dCksCisJKGF2cGljdHVyZV9nZXRfc2l6ZSksIChhdmNvZGVjX2dldF9waXhfZm10X2xvc3MpLAorCShhdmdfYml0c19wZXJfcGl4ZWwpLCAoYXZjb2RlY19maW5kX2Jlc3RfcGl4X2ZtdDEpLAorCShhdmNvZGVjX2ZpbmRfYmVzdF9waXhfZm10KSwgKGltZ19jb3B5X3BsYW5lKSwgKGltZ19jb3B5KSwKKwkoeXV2NDIyX3RvX3l1djQyMHApLCAodXl2eTQyMl90b195dXY0MjBwKSwgKHV5dnk0MjJfdG9feXV2NDIycCksCisJKHl1djQyMl90b195dXY0MjJwKSwgKHl1djQyMnBfdG9feXV2NDIyKSwgKHl1djQyMnBfdG9fdXl2eTQyMiksCisJKHV5dnk0MTFfdG9feXV2NDExcCksICh5dXY0MjBwX3RvX3l1djQyMiksIChDX0pQRUdfVE9fQ0NJUiksCisJKGltZ19jb252ZXJ0X2luaXQpLCAoaW1nX2FwcGx5X3RhYmxlKSwgKHNocmluazQxKSwgKHNocmluazIxKSwKKwkoc2hyaW5rMTIpLCAoc2hyaW5rMjIpLCAoc2hyaW5rNDQpLCAoZ3JvdzIxX2xpbmUpLCAoZ3JvdzQxX2xpbmUpLAorCShncm93MjEpLCAoZ3JvdzIyKSwgKGdyb3c0MSksIChncm93NDQpLCAoY29udjQxMSksCisJKGdpZl9jbHV0X2luZGV4KSwgKGJ1aWxkX3JnYl9wYWxldHRlKSwgKGJpdGNvcHlfbiksIChtb25vX3RvX2dyYXkpLAorCShtb25vd2hpdGVfdG9fZ3JheSksIChtb25vYmxhY2tfdG9fZ3JheSksIChncmF5X3RvX21vbm8pLAorCShncmF5X3RvX21vbm93aGl0ZSksIChncmF5X3RvX21vbm9ibGFjayksIChhdnBpY3R1cmVfYWxsb2MpLAorCShhdnBpY3R1cmVfZnJlZSksIChpc195dXZfcGxhbmFyKSwgKGltZ19jb252ZXJ0KSwKKwkoZ2V0X2FscGhhX2luZm9fcGFsOCksIChpbWdfZ2V0X2FscGhhX2luZm8pLCAoZGVpbnRlcmxhY2VfbGluZSksCisJKGRlaW50ZXJsYWNlX2xpbmVfaW5wbGFjZSksIChkZWludGVybGFjZV9ib3R0b21fZmllbGQpLAorCShkZWludGVybGFjZV9ib3R0b21fZmllbGRfaW5wbGFjZSksIChhdnBpY3R1cmVfZGVpbnRlcmxhY2UpOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvaW1nY29udmVydF90ZW1wbGF0ZS5oOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvbWVtLmM6IChhdl9tYWxsb2MpLCAoYXZfcmVhbGxvYyksIChhdl9mcmVlKToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL21teC5oOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvdXRpbHMuYzogKGF2X21hbGxvY3opLCAoYXZfc3RyZHVwKSwKKwkoYXZfZmFzdF9yZWFsbG9jKSwgKGF2X21hbGxvY3pfc3RhdGljKSwgKGF2X2ZyZWVfc3RhdGljKSwKKwkoYXZfZnJlZXApLCAoYXZjb2RlY19nZXRfY29udGV4dF9kZWZhdWx0cyksCisJKGF2Y29kZWNfYWxsb2NfY29udGV4dCksIChhdmNvZGVjX2luaXQpOgorCSAgU3luYyBiYWNrIGZyb20gZ3N0LWZmbXBlZy4gRGVwcmVjYXRlcyBmZmNvbG9yc3BhY2UuIEFkZHMgcGFsZXR0ZQorCSAgaGFuZGxpbmcgcGx1cyB1cGRhdGUgZnJvbSBmZm1wZWcgQ1ZTLiBMYXJnZSBjbGVhbi11cC4KKworMjAwNC0xMC0zMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL01ha2VmaWxlLmFtOgorCSAgV2UgbmVlZCB0aGUgbWFyc2hhbGxlcnMgZm9yIGRlY29kZWJpbiwgdG9vLgorCisyMDA0LTEwLTMwICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAocXRfdHlwZV9maW5kKTogTWFrZQorCSAgcXVpY2t0aW1lIHR5cGVmaW5kaW5nIHdvcmsgd2l0aCA2NC1iaXQgb2Zmc2V0cy4KKworMjAwNC0xMC0zMCAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19oYW5kbGVfc2lua19ldmVudCk6CisJICBTZXQgRU9TIG9uIHRoZSBlbGVtZW50IHdoZW4gcHJvY2Vzc2luZyBhbiBFT1MgZXZlbnQuCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuaDoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5oOgorCSAgT25seSBrZWVwIGEgY29uc3QgcHRyIHRvIHRoZSBtb2RlCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6CisJKGdzdF9yaWZmX2NyZWF0ZV9hdWRpb19jYXBzX3dpdGhfZGF0YSksCisJKGdzdF9yaWZmX2NyZWF0ZV9hdWRpb190ZW1wbGF0ZV9jYXBzKToKKwkgIEFsbG93IFdNQVYzLCB3aXRoIHVwIHRvIDYgY2hhbm5lbHMuCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmbXV4LmM6IChnc3RfYXNmbXV4X3JlcXVlc3RfbmV3X3BhZCk6CisJICBEb24ndCBjYWxsIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIG9uIGEgc2luayBwYWQuCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5jOgorCShnc3RfZHZkX2RlbXV4X2dldF9zdWJwaWN0dXJlX3N0cmVhbSksCisJKGdzdF9kdmRfZGVtdXhfc2V0X2N1cl9hdWRpbyksIChnc3RfZHZkX2RlbXV4X3NldF9jdXJfc3VicGljdHVyZSk6CisJICBDb3B5IHRoZSBleHBsaWNpdCBjYXBzIHRoYXQgd2VyZSBzZXQgYWNyb3NzIHRvIHRoZSBjdXJfKiBwYWRzLAorCSAgaW5zdGVhZCBvZiB0cnlpbmcgdG8gdXNlIGEgcG9zc2libHkgbm9uLWV4aXN0ZW50IG5lZ290aWF0ZWQgY2Fwcy4KKwkgIFJlc2V0IHRoZSB0eXBlIG9mIHN1YnBpY3R1cmUgcGFkcyB0byBVTktOT1dOIGFmdGVyIGNhbGxpbmcKKwkgIGluaXRfc3RyZWFtLCBzbyB0aGF0IHRoZSBjYXBzIGdldCBzZXQuCisKKzIwMDQtMTAtMjkgIE1hcnRpbiBQaXR0ICA8bWFydGluLnBpdHRAY2Fub25pY2FsLmNvbT4KKworCVJldmlld2VkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X3Byb2Nlc3NfY2h1bmspOgorCSAgRG9uJ3QgdG91Y2ggYnVmZmVyIGlmIGl0IGlzIG9mIHNpemUgMCAoZml4ZXMgIzE1MTA2NCkuCisKKzIwMDQtMTAtMjkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfZGVtdXhfcHVzaCksIChnc3Rfb2dnX3BhZF9wdXNoKToKKwkgIFN5bmNocm9uaXplZCBkaXNjb250IGhhbmRsaW5nLgorCisyMDA0LTEwLTI5ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X3NyY19ldmVudCksCisJKGdzdF9vZ2dfZGVtdXhfcHVzaCk6CisJICBNYWtlIHNlZWtpbmcgc29ydC1vZiBleGFjdCBhZ2FpbiAoZml4ZXMgIzE1NjM4NykuCisKKzIwMDQtMTAtMjkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAodW5rbm93bl90eXBlKSwKKwkoYWRkX2VsZW1lbnRfc3RyZWFtKSwgKG5ld19kZWNvZGVkX3BhZCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvcGxheWJhY2svZ3N0c3RyZWFtaW5mby5jOiAoZ3N0X3N0cmVhbV9pbmZvX2NsYXNzX2luaXQpLAorCShnc3Rfc3RyZWFtX2luZm9faW5pdCksIChnc3Rfc3RyZWFtX2luZm9fbmV3KSwKKwkoZ3N0X3N0cmVhbV9pbmZvX2Rpc3Bvc2UpLCAoZ3N0X3N0cmVhbV9pbmZvX2dldF9wcm9wZXJ0eSk6CisJKiBnc3QvcGxheWJhY2svZ3N0c3RyZWFtaW5mby5oOgorCSAgTWFrZSBjYXBzIGV4cGxpY2l0ZWx5IGF2YWlsYWJsZS4gTWFrZXMgdGVzdGluZyBmb3IgdW5zdXBwb3J0ZWQKKwkgIHR5cGVzIHBvc3NpYmxlLiBJbXByb3ZlcyBlcnJvciByZXBvcnRpbmcuCisKKzIwMDQtMTAtMjkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6CisJKGdzdF9hdWRpb19jb252ZXJ0X2J1ZmZlcl90b19kZWZhdWx0X2Zvcm1hdCk6CisJICBSZWFsbHkgZG9uJ3QgdG91Y2ggcmVhZC1vbmx5IGJ1ZmZlcnMgKCMxNTY1NjMpLgorCisyMDA0LTEwLTI5ICBTZWJhc3RpZW4gQ290ZSAgPHNjNUBoZXJtZXMudXNoZXJiLmNhPgorCisJUmV2aWV3ZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2ZtdCk6CisJICBGaXggbWVtbGVhayAoIzE1NTIyMykuCisKKzIwMDQtMTAtMjkgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwLy5jdnNpZ25vcmU6CisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6IChnc3Rfc3luY19tZXRob2RfZ2V0X3R5cGUpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xhc3NfaW5pdCksIChnc3RfbXVsdGlmZHNpbmtfaW5pdCksCisJKGdzdF9tdWx0aWZkc2lua19hZGQpLCAoZ3N0X211bHRpZmRzaW5rX3JlbW92ZSksCisJKGdzdF9tdWx0aWZkc2lua19yZW1vdmVfY2xpZW50X2xpbmspLCAoaXNfc3luY19mcmFtZSksCisJKGdzdF9tdWx0aWZkc2lua19uZXdfY2xpZW50KSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfd3JpdGUpLAorCShnc3RfbXVsdGlmZHNpbmtfcmVjb3Zlcl9jbGllbnQpLCAoZ3N0X211bHRpZmRzaW5rX3F1ZXVlX2J1ZmZlciksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50cyksIChnc3RfbXVsdGlmZHNpbmtfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X211bHRpZmRzaW5rX2dldF9wcm9wZXJ0eSk6CisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmg6CisJQWRkZWQgYnVyc3Qgb24gY29ubmVjdCBzeW5jX21ldGhvZCwgZGVwcmVjYXRlZCBzeW5jX2NsaWVudHMsCisJc3RyZWFtbGluZWQgdGhlIHN5bmMgY29kZSBzb21lIG1vcmUuCisKKzIwMDQtMTAtMjkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAodGhyZWFkX2Vycm9yKSwgKHNldHVwX3NvdXJjZSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2NoYW5nZV9zdGF0ZSk6CisJICBJbXByb3ZlIGVycm9yIHJlcG9ydGluZy4KKworMjAwNC0xMC0yOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC90Y3AvTWFrZWZpbGUuYW06CisJKiBnc3QvdGNwL2Zkc2V0c3RyZXNzLmM6IChtZXNzX3NvbWVfbW9yZSksIChydW5fdGVzdCksIChtYWluKToKKwkqIGdzdC90Y3AvZ3N0ZmRzZXQuYzogKG5lYXJlc3RfcG93KSwgKHJlc2l6ZSksIChlbnN1cmVfc2l6ZSksCisJKGdzdF9mZHNldF9uZXcpLCAoZ3N0X2Zkc2V0X2ZyZWUpLCAoZ3N0X2Zkc2V0X3NldF9tb2RlKSwKKwkoZ3N0X2Zkc2V0X2ZkX2N0bF93cml0ZSksIChnc3RfZmRzZXRfZmRfY3RsX3JlYWQpLAorCShnc3RfZmRzZXRfZmRfaGFzX2Nsb3NlZCksIChnc3RfZmRzZXRfZmRfaGFzX2Vycm9yKSwKKwkoZ3N0X2Zkc2V0X2ZkX2Nhbl9yZWFkKSwgKGdzdF9mZHNldF9mZF9jYW5fd3JpdGUpLAorCShnc3RfZmRzZXRfd2FpdCk6CisJQWRkZWQgbW9yZSBsb2NrcyBhcm91bmQgZmRzZXQgc3RydWN0dXJlcy4gRml4ZWQvcmV3b3JrZWQKKwl0aGUgcG9sbCBhcnJheSByZXNpemluZyBjb2RlLgorCUFkZGVkIHN0cmVzcyB0ZXN0IGZvciBmZHNldC4KKworMjAwNC0xMC0yOCAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuYzogKGdzdF9hdWRpb2ZpbHRlcl9saW5rKToKKwlmaXggYnVpbGQKKworMjAwNC0xMC0yOCAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QtbGlicy9nc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuYzogKGdzdF9hdWRpb2ZpbHRlcl9saW5rKToKKwkgIGZpeCBsaW5rIGZ1bmN0aW9uIHRvIGFsd2F5cyBxdWVyeSBjaGFubmVscyBhbmQgcXVlcnkgd2lkdGggZm9yCisJICBmbG9hdHMKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGFkZCBlcXVhbGl6ZXIgZGlyCisJKiBnc3QvZXF1YWxpemVyL01ha2VmaWxlLmFtOgorCSogZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuYzogKGdzdF9paXJfZXF1YWxpemVyX2dldF90eXBlKSwKKwkoZ3N0X2lpcl9lcXVhbGl6ZXJfYmFzZV9pbml0KSwgKGdzdF9paXJfZXF1YWxpemVyX2NsYXNzX2luaXQpLAorCShnc3RfaWlyX2VxdWFsaXplcl9pbml0KSwgKGdzdF9paXJfZXF1YWxpemVyX2ZpbmFsaXplKSwKKwkoYXJnX3RvX3NjYWxlKSwgKHNldHVwX2ZpbHRlciksCisJKGdzdF9paXJfZXF1YWxpemVyX2NvbXB1dGVfZnJlcXVlbmNpZXMpLAorCShnc3RfaWlyX2VxdWFsaXplcl9zZXRfcHJvcGVydHkpLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2lpcl9lcXVhbGl6ZXJfZmlsdGVyX2lucGxhY2UpLCAoZ3N0X2lpcl9lcXVhbGl6ZXJfc2V0dXApLAorCShwbHVnaW5faW5pdCk6CisJICBhZGQgYW4gZXF1YWxpemVyCisKKzIwMDQtMTAtMjcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwlTdWJtaXR0ZWQgYnk6IEtqYXJ0YW4gTWFyYWFzIDxrbWFyYWFzQGJyb2FkcGFyay5ubz4KKworCSogcG8vTElOR1VBUzoKKwkqIHBvL25iLnBvOgorCSAgQWRkZWQgTm9yd2VnaWFuIEJva21hYWwgdHJhbnNsYXRpb24KKworMjAwNC0xMC0yNyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVyLmM6IChnc3RfYWxzYV9taXhlcl9idWlsZF9saXN0KToKKwkgIERvbid0IGJyZWFrIG9uIG9wdGlvbnMgKGZpeGVzICMxNTY0ODgpLgorCisyMDA0LTEwLTI3ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvY2RhdWRpby9NYWtlZmlsZS5hbToKKwkqIHN5cy9NYWtlZmlsZS5hbToKKwkgIGZpeCBidWlsZCBvbiBvbGRlciBhdXRvbWFrZQorCisyMDA0LTEwLTI2ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfdmlkZW9fZ2V0Y2FwcyksCisJKGdzdF9kdmRlY192aWRlb19saW5rKSwgKGdzdF9kdmRlY19wdXNoKSwgKGdzdF9kdmRlY19sb29wKToKKwlBbGxvdyBhIGxpdHRsZSBtYXJnaW4gd2hlbiBuZWdvdGlhdGluZyB0aGUgZnJhbWVyYXRlLgorCisyMDA0LTEwLTI2ICBTdGVmYW4gS29zdCAgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzoKKwkgIHN5bmNob25pc2VkIG5hbWluZyBvZiBwYWRzIGFuZCBwYWQtdGVtcGxhdGVzCisKKzIwMDQtMTAtMjYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X3NyY19ldmVudCksCisJKGdzdF9vZ2dfZGVtdXhfaGFuZGxlX2V2ZW50KSwgKF9maW5kX2NoYWluX2dldF91bmtub3duX3BhcnQpLAorCShfZmluZF9zdHJlYW1zX2NoZWNrKSwgKGdzdF9vZ2dfZGVtdXhfcHVzaCk6CisJRml4IEVPUyBhZ2Fpbi4gTmVlZHMgdG8gYmUgZG9uZSBpbiBhIGJldHRlciB3YXkuIFdlIHNob3VsZCBub3QKKwlyZW1vdmUgdGhlIHBhZCBpZiB0aGVyZSBpcyBubyBuZXcgY2hhaW5lZCBzdHJlYW0uCisKKzIwMDQtMTAtMjYgSWFpbiA8aWFpbmdub21lQGdtYWlsLmNvbT4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jIChnc3Rfb2dnX3BhZF9uZXcpOiBGcmVlIHRoZSB0YWcgbGlzdC4KKwkqIGdzdC9hdWRpb3NjYWxlL2dzdGF1ZGlvc2NhbGUuYyAoZ3N0X2F1ZGlvc2NhbGVfbGluayk6IEZyZWUgdGhlIGNvcHkKKwlvZiB0aGUgY2Fwcy4KKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYyAoaW50ZXJsZWF2ZV9jbGFzc19pbml0KTogSG9vayB1cCByZWxlYXNlCisJcGFkLgorCShpbnRlcmxlYXZlX3JlbGVhc2VfcGFkKTogUmVtb3ZlIHRoZSBwYWQuCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogQWxsb3cgdGhlIGxldmVsIHRvIHRha2UgMSBvciAyIGNoYW5uZWxzLgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvLmMgKGdzdF9zdW5hdWRpb19zZXRwYXJhbXMpOiBQYXkgYXR0ZW50aW9uIHRvCisJdGhlIHNldCBkZXZpY2UuCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jIChnc3RfeHZpbWFnZXNpbmtfZ2V0X3h2X3N1cHBvcnQpOiBGcmVlIHRoZQorCWF0dHJzCisJKGdzdF94dmltYWdlc2lua194Y29udGV4dF9jbGVhcik6IEZyZWUgdGhlIHhjb250ZXh0LgorCShnc3RfeHZpbWFnZXNpbmtfZmluYWxpemUpOiBGcmVlIHRoZSBwYXIuCisKKzIwMDQtMTAtMjYgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6IChnc3RfYXZpbXV4X2F1ZHNpbmtjb25uZWN0KSwKKwkoZ3N0X2F2aW11eF9zdG9wX2ZpbGUpOgorCSAgRmlyc3QgY2FsY3VsYXRlIHRoZSByYXRlLCBhbmQgb25seSB0aGVuIHVzZSBpdC4gSGRyLnJhdGUgaXMgYQorCSAgbXVsdGlwbGUgYW5kIG5vdCBhIGRlcml2YXRpdmUgb2YgaGRyLnNjYWxlLiBTY2FsZSBpcyBub3QgdGhlCisJICBzYW1lIGFzIGJsb2NrYWxpZ24gYnV0IGlzIHNvbGVseSByZWxhdGVkIHRvIHJhdGUuCisKKzIwMDQtMTAtMjYgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3NpbmsuYzogKGdzdF9nbm9tZXZmc3NpbmtfaW5pdCksCisJKGdzdF9nbm9tZXZmc3NpbmtfaGFuZGxlX2V2ZW50KSwgKGdzdF9nbm9tZXZmc3NpbmtfY2hhaW4pOgorCSAgSW1wbGVtZW50IHNlZWtpbmcuCisKKzIwMDQtMTAtMjUgIEphbWVzIEhlbnN0cmlkZ2UgIDxqYW1lc0BqYW1lc2guaWQuYXU+CisKKwlSZXZpZXdlZCBieTogIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXhhbXBsZXMvZ3N0cGxheS9wbGF5ZXIuYzogKGdvdF9zdHJlYW1fbGVuZ3RoKSwgKG1haW4pOgorCSogZXhhbXBsZXMvc2Vla2luZy9jZHBsYXllci5jOiAodXBkYXRlX3NjYWxlKToKKwkqIGV4YW1wbGVzL3NlZWtpbmcvc2Vlay5jOiAoZm9ybWF0X3ZhbHVlKSwgKHVwZGF0ZV9zY2FsZSk6CisJKiBleGFtcGxlcy9zZWVraW5nL3NwaWRlcl9zZWVrLmM6IChmb3JtYXRfdmFsdWUpLCAodXBkYXRlX3NjYWxlKSwKKwkoc3RvcF9zZWVrKToKKwlCdWlsZCBmaXhlcyBvbiBBTUQ2NC4KKworMjAwNC0xMC0yNSAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJcmV2aWV3ZWQgYnk6IFJvbmFsZCBCdWx0amUgPHJidWx0amUgYXQgZ25vbWUgZG90IG9yZz4KKworCSogc3lzL3Y0bC92NGxfY2FsbHMuYzogKGdzdF92NGxfZ2V0X2NoYW5fbmFtZXMpOgorCUZpeCBmb3Igc29tZSB2NGwgY2FyZHMgd2hpY2ggaGFuZyBpbiB2NGxzcmMKKworMjAwNC0xMC0yNSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfcGFkX3JlbW92ZSksCisJKGdzdF9vZ2dfZGVtdXhfcHVzaCksIChnc3Rfb2dnX2NoYWluc19jbGVhcik6CisJTWFrZSBzdXJlIHRvIHJlbW92ZSB0aGUgcGFkIHdoZW4gYSBuZXcgY2hhaW4gaXMKKwllbmNvdW50ZXJlZC4gU2V0IHNvbWUgdmFycyB0byBOVUxMIHNvIHdlIGRvbid0IHRyeQorCXRvIHJlZmVyZW5jZSBmcmVlZCBtZW1vcnkuCisKKzIwMDQtMTAtMjUgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleGFtcGxlcy9zZWVraW5nL01ha2VmaWxlLmFtOgorCSogZXhhbXBsZXMvc2Vla2luZy9jZHBsYXllci5jOiAodXBkYXRlX3NjYWxlKToKKwkqIGV4YW1wbGVzL3NlZWtpbmcvY2hhaW5lZC5jOiAodW5saW5rZWQpLCAobmV3X3BhZCksIChtYWluKToKKwkqIGV4YW1wbGVzL3NlZWtpbmcvcGxheWJpbi5jOiAobWFrZV9wbGF5ZXJiaW5fcGlwZWxpbmUpLAorCShmb3JtYXRfdmFsdWUpLCAodXBkYXRlX3NjYWxlKSwgKGl0ZXJhdGUpLCAoc3RhcnRfc2VlayksCisJKHN0b3Bfc2VlayksIChwcmludF9tZWRpYV9pbmZvKSwgKHBsYXlfY2IpLCAocGF1c2VfY2IpLCAoc3RvcF9jYiksCisJKHByaW50X3VzYWdlKSwgKG1haW4pOgorCUFkZGVkIHNvbWUgbW9yZSBleGFtcGxlcywgdXBkYXRlIG90aGVycy4KKworMjAwNC0xMC0yNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNkZWNfdXBkYXRlX21ldGFkYXRhKToKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiAoc3BlZXhfZGVjX2NoYWluKToKKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6ICh0aGVvcmFfZGVjX2NoYWluKToKKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmM6ICh2b3JiaXNfZGVjX2NoYWluKToKKwkgIEFkZCBjb2RlYy1uYW1lIG1ldGFkYXRhLgorCisyMDA0LTEwLTI1ICBUYWthbyBGdWppd2FyYSAgPFRha2FvLkZ1aml3YXJhQFN1bi5DT00+CisKKwlSZXZpZXdkIGJ5OiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVyLmM6IChnc3RfYWxzYV9taXhlcl9idWlsZF9saXN0KToKKwkqIGV4dC9hbHNhL2dzdGFsc2FtaXhlcnRyYWNrLmM6IChnc3RfYWxzYV9taXhlcl90cmFja19uZXcpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVydHJhY2suaDoKKwkqIHBvL1BPVEZJTEVTLmluOgorCSAgQUxTQSBtaXhlciB0cmFjayBsYWJlbCBpbnRlcm5hdGlvbmFsaXphdGlvbiAoIzE1NDA1NCkuCisKKzIwMDQtMTAtMjUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6ICh0aGVvcmFfZGVjX2NoYWluKToKKwkgIEV4cG9ydCBiaXRyYXRlIGFzIG1ldGFkYXRhLgorCisyMDA0LTEwLTI1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhbWl4ZXIuYzogKGdzdF9hbHNhX21peGVyX2J1aWxkX2xpc3QpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVydHJhY2suYzogKGdzdF9hbHNhX21peGVyX3RyYWNrX25ldyk6CisJKiBleHQvYWxzYS9nc3RhbHNhbWl4ZXJ0cmFjay5oOgorCSAgRml4IG5hbWVzLCBmaXggbG9vcC4KKworMjAwNC0xMC0yNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmM6IChnc3Rfc3BlZXhfZGVjX2luaXQpLAorCShzcGVleF9kZWNfY29udmVydCk6CisJICBzaW5rY29udmVydCBmdW5jdGlvbiBzbyBvZ2dkZW11eCBjYW4gZ2V0IHRoZSBmaWxlIGxlbmd0aCAodG90ZW0pLgorCisyMDA0LTEwLTI1ICBKYW1lcyBNb3JyaXNvbiAgPGphMm1vcnJpQGNzY2x1Yi51d2F0ZXJsb28uY2E+CisKKwlSZXZpZXdlZCBieTogIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX2NodW5rKToKKwkgIERvbid0IHB1c2ggaW5jb21wbGV0ZSBwYWNrZXRzLgorCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChtNGFfdHlwZV9maW5kKToKKwkgIEZpeCBNUEVHLTQgYXVkaW8gdHlwZWZpbmRpbmcuCisKKzIwMDQtMTAtMjUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy92NGwvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsL2dzdHY0bC5jOiAocGx1Z2luX2luaXQpOgorCSogc3lzL3Y0bC9nc3R2NGxlbGVtZW50LmM6IChnc3RfdjRsZWxlbWVudF9nZXRfdHlwZSksCisJKGdzdF92NGxlbGVtZW50X2luaXQpLCAoZ3N0X3Y0bGVsZW1lbnRfZGlzcG9zZSksCisJKGdzdF92NGxlbGVtZW50X2NoYW5nZV9zdGF0ZSk6CisJKiBzeXMvdjRsL2dzdHY0bGVsZW1lbnQuaDoKKwkqIHN5cy92NGwvZ3N0djRseG92ZXJsYXkuYzogKGdzdF92NGxfeG92ZXJsYXlfb3BlbiksCisJKGdzdF92NGxfeG92ZXJsYXlfY2xvc2UpLCAoaWRsZV9yZWZyZXNoKSwKKwkoZ3N0X3Y0bF94b3ZlcmxheV9zZXRfeHdpbmRvd19pZCk6CisJKiBzeXMvdjRsL2dzdHY0bHhvdmVybGF5Lmg6CisJKiBzeXMvdjRsL3Y0bC1vdmVybGF5X2NhbGxzLmM6CisJKiBzeXMvdjRsL3Y0bF9jYWxscy5oOgorCSogc3lzL3Y0bDIvTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6IChwbHVnaW5faW5pdCk6CisJKiBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5jOiAoZ3N0X3Y0bDJlbGVtZW50X2dldF90eXBlKSwKKwkoZ3N0X3Y0bDJlbGVtZW50X2luaXQpLCAoZ3N0X3Y0bDJlbGVtZW50X2Rpc3Bvc2UpLAorCShnc3RfdjRsMmVsZW1lbnRfY2hhbmdlX3N0YXRlKToKKwkqIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50Lmg6CisJKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuYzogKGdzdF92NGwyX3hvdmVybGF5X29wZW4pLAorCShnc3RfdjRsMl94b3ZlcmxheV9jbG9zZSksIChpZGxlX3JlZnJlc2gpLAorCShnc3RfdjRsMl94b3ZlcmxheV9zZXRfeHdpbmRvd19pZCk6CisJKiBzeXMvdjRsMi9nc3R2NGwyeG92ZXJsYXkuaDoKKwkqIHN5cy92NGwyL3Y0bDItb3ZlcmxheV9jYWxscy5jOgorCSogc3lzL3Y0bDIvdjRsMl9jYWxscy5oOgorCSAgUmVtb3ZlIGNsaWVudC1zaWRlIG92ZXJsYXkgaGFuZGxpbmcsIHVzZSB0aGUgWC1zZXJ2ZXIgdjRsIHBsdWdpbgorCSAgZm9yIHRoYXQuIE5pY2VyIG92ZXJsYXksIGxlc3MgY29kZS4gQWxzbyBtYWtlIHRoZSBwbHVnaW4KKwkgIGNvbXBpbGVhYmxlIHdpdGhvdXQgWCAoYnV0IHRoZW4gd2l0aG91dCBvdmVybGF5LCBvYnZpb3VzbHkpLgorCSAgTWFrZXMgeHdpbmRvd2xpc3RlbmVyIG9ic29sZXRlLCBzaG91bGQgd2UgcmVtb3ZlIHRoYXQ/CisKKzIwMDQtMTAtMjUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6IChnc3Rfb3Nzc3JjX2dldF90aW1lKSwgKGdzdF9vc3NzcmNfZ2V0KSwKKwkoZ3N0X29zc3NyY19zcmNfcXVlcnkpOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuaDoKKwkgIE9LLCBzbyBwZW9wbGUgd2FudCBvZmZzZXQgaW4gREVGQVVMVC4gVGhpcyB0aW1lLCBhY3R1YWxseSBmaXggYWxsCisJICBjYXNlcy4KKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX2dldGNhcHMpOgorCSAgQWRkIEZQUyBwcm9wZXJseS4KKworMjAwNC0xMC0yNCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2FzZmRlbXV4L2dzdGFzZm11eC5jOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzoKKwkgIEZyYW1lcmF0ZS4KKworMjAwNC0xMC0yNCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL3Y0bDIvZ3N0djRsMmVsZW1lbnQuYzogKGdzdF92NGwyZWxlbWVudF9zZXRfcHJvcGVydHkpOgorCSAgRml4IHByb3BlcnRpZXMgKGNoYW5uZWwsIG5vcm0sIGZyZXF1ZW5jeSkuCisKKzIwMDQtMTAtMjQgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50LmM6IChnc3RfdjRsMmVsZW1lbnRfZ2V0X3Byb3BlcnR5KToKKwkgIEZsYWcgdHlwby4KKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogKGdzdF92NGwyX3NldF9kZWZhdWx0cyk6CisJICBObyB3YXJuaW5ncy4KKworMjAwNC0xMC0yNCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfY2xlYXJfZm9ybWF0X2xpc3QpOgorCSAgRml4IGhhbmcuCisKKzIwMDQtMTAtMjQgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50Lmg6CisJICBZZXQgQW5vdGhlciBIYWNrICh0bSkgZm9yIGtlcm5lbCBoZWFkZXIgYm9ya2VkbmVzcy4KKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX2luaXQpLAorCShnc3RfdjRsMnNyY192NGwyZm91cmNjX3RvX2NhcHMpLCAoZ3N0X3Y0bDJfZm91cmNjX2Zyb21fc3RydWN0dXJlKSwKKwkoZ3N0X3Y0bDJzcmNfbGluayksIChnc3RfdjRsMnNyY19nZXRjYXBzKSwKKwkoZ3N0X3Y0bDJzcmNfY2hhbmdlX3N0YXRlKToKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuaDoKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX2NhcHR1cmVfaW5pdCksCisJKGdzdF92NGwyc3JjX2NhcHR1cmVfc3RhcnQpLCAoZ3N0X3Y0bDJzcmNfY2FwdHVyZV9zdG9wKToKKwkgIEZpeCBjYXBzLCBrZWVwIHRyYWNrIG9mIHN0YXRlLCB3b3JrLgorCisyMDA0LTEwLTI0ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19nZXRjYXBzKToKKwkgIFF1aWV0LgorCisyMDA0LTEwLTI0ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOiAoZ3N0X29zc3NyY19nZXQpOgorCSAgRG9uJ3QgbWl4IGJ5dGVzIGFuZCBzYW1wbGVzLgorCisyMDA0LTEwLTI0ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvb2dnL2dzdG9nZ211eC5jOgorCSAgQmFzaWMgcGFkIHRlbXBsYXRlIHdoaWNoIGFjY2VwdHMgT0dNIHRyYWNrcywgc3BlZXgsIGZsYWMsIHZvcmJpcworCSAgYW5kIHRoZW9yYS4gQW55IGlzIGluY29ycmVjdC4KKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZtdXguYzogKGdzdF9hc2ZtdXhfdmlkc2lua19saW5rKToKKwkgIEZpeCBjYXBzLgorCSogc3lzL3Y0bC9nc3R2NGxtanBlZ3NpbmsuYzogKGdzdF92NGxtanBlZ3NpbmtfYmFzZV9pbml0KToKKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzcmMuYzogKGdzdF92NGxtanBlZ3NyY19iYXNlX2luaXQpLAorCShnc3RfdjRsbWpwZWdzcmNfaW5pdCksIChnc3RfdjRsbWpwZWdzcmNfc3JjY29ubmVjdCksCisJKGdzdF92NGxtanBlZ3NyY19nZXRjYXBzKSwgKGdzdF92NGxtanBlZ3NyY19jaGFuZ2Vfc3RhdGUpOgorCSogc3lzL3Y0bC9nc3R2NGxtanBlZ3NyYy5oOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzogKGdzdF92NGxzcmNfc3JjX2xpbmspLCAoZ3N0X3Y0bHNyY19nZXRjYXBzKSwKKwkoZ3N0X3Y0bHNyY19jaGFuZ2Vfc3RhdGUpOgorCSogc3lzL3Y0bC92NGxtanBlZ3NyY19jYWxscy5jOiAoZ3N0X3Y0bG1qcGVnc3JjX2NhcHR1cmVfc3RhcnQpLAorCShnc3RfdjRsbWpwZWdzcmNfY2FwdHVyZV9zdG9wKToKKwkgIEZpeCBjYXBzLiBLZWVwIHRyYWNrIG9mIGludGVybmFsIHN0YXRlLiBXb3JrLgorCisyMDA0LTEwLTIzICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvTWFrZWZpbGUuYW06CisJICBGaXggdGhlIGJ1aWxkIGZpeGVzLgorCisyMDA0LTEwLTIzICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X3NyY19xdWVyeSksCisJKGdzdF9vZ2dfZGVtdXhfc3JjX2V2ZW50KSwgKF9maW5kX2NoYWluX3NlZWspLAorCShnc3Rfb2dnX3BhZF9wdXNoKToKKwkgIENoZWNrIGZvciBwYWQgYXZhaWxhYmlsaXR5IGJlZm9yZSB1c2luZyBpdC4KKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKF9maW5kX2NoYWluX3Byb2Nlc3MpOgorCSAgRml4IHBhcnNpbmcgb2YgY2hhaW5lZCBvZ2cuIE5lZWRzIG1vcmUgd29yayBvbiB0aGUgZGVjb2RlciBzaWRlLgorCisyMDA0LTEwLTIyICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC9zcGVjdHJ1bS9NYWtlZmlsZS5hbToKKwkqIGdzdC9zcGVjdHJ1bS9kZW1vLW9zc3NyYy5jOiAoc3BlY3RydW1fY2hhaW4pLCAobWFpbiksCisJKGlkbGVfZnVuYyk6CisJICBGaXggZGVtbyBhbmQgcmVlbmFibGUgaXQuIFllcywgSSdtIGN1cnJlbnRseSBwbGF5aW5nIHdpdGggYXVkaW8KKwkgIGFuYWx5c2lzIHRvb2xzCisKKzIwMDQtMTAtMjIgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfcGFkX3B1c2gpOgorCSAgV2UgbG92ZSBpdCBpZiBmaWxlcyB0aGF0IHN0YXJ0IGF0IHplcm8gd29yayB0b28uLi4KKworMjAwNC0xMC0yMiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9pdGVyYXRlKToKKwkgIEhhbmRsZSBmaWxlcyB3aXRoIG1pc3NpbmcgRU9TIGhlYWRlcnMuCisKKzIwMDQtMTAtMjEgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzaW5rLmM6CisJKGdzdF90Y3BzZXJ2ZXJzaW5rX2hhbmRsZV9zZXJ2ZXJfcmVhZCksCisJKGdzdF90Y3BzZXJ2ZXJzaW5rX2luaXRfc2VuZCk6CisJWmVybyBzb21lIHZhcmlhYmxlcyBmaXJzdCAobmVlZCBmb3IgYWNjZXB0IG5vdCB0byByZXR1cm4gRUlOVkFMKQorCisyMDA0LTEwLTIwICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X3NyY19xdWVyeSksCisJKGdzdF9vZ2dfZGVtdXhfc3JjX2V2ZW50KSwgKGdzdF9vZ2dfcGFkX3B1c2gpOgorCSogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzogKHRoZW9yYV9kZWNfc2lua19jb252ZXJ0KSwKKwkodGhlb3JhX2RlY19jaGFpbik6CisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jOiAodm9yYmlzX2RlY19nZXRfZm9ybWF0cyksCisJKGdzdF92b3JiaXNfZGVjX2luaXQpLCAodm9yYmlzX2RlY19jb252ZXJ0KSwgKHZvcmJpc19kZWNfY2hhaW4pOgorCSAgU2Vla2luZyBhbmQgcXVlcnlpbmcgZmluZXR1bmUuCisKKzIwMDQtMTAtMjAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkqIGV4dC9yYXcxMzk0L01ha2VmaWxlLmFtOgorCSAgZml4IHRoZSBidWlsZAorCisyMDA0LTEwLTIwICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X2l0ZXJhdGUpOgorCSAgV3JvbmcgcmV0dXJuLgorCSogZ3N0L3BsYXliYWNrL01ha2VmaWxlLmFtOgorCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAoZ3N0X2RlY29kZV9iaW5fY2xhc3NfaW5pdCk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheS1tYXJzaGFsLmxpc3Q6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdzdF9wbGF5X2Jhc2VfYmluX2NsYXNzX2luaXQpOgorCSAgRml4IG1hcnNoYWxsZXJzLgorCisyMDA0LTEwLTE4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X3NyY19ldmVudCk6CisJICBTaWxlbmNlLgorCisyMDA0LTEwLTE4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X3NyY19xdWVyeSksCisJKGdzdF9vZ2dfZGVtdXhfc3JjX2V2ZW50KSwgKGdzdF9vZ2dfcGFkX3BvcHVsYXRlKSwKKwkoZ3N0X29nZ19wYWRfcHVzaCk6CisJICBZYXkgZm9yIG5vbi1saW5lYWlyIGdyYW51bGVwb3MgaW4gdGhlb3JhLgorCisyMDA0LTEwLTE4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfaW5pdCksIChnc3RfZHZkZWNfdmlkZW9fZ2V0Y2FwcyksCisJKGdzdF9kdmRlY192aWRlb19saW5rKSwgKGdzdF9kdmRlY19wdXNoKSwgKGdzdF9kdmRlY19sb29wKToKKwkqIGV4dC9kdi9nc3RkdmRlYy5oOgorCU1ha2Ugc3VyZSB3ZSByZW5lZ290aWF0ZSBhc3BlY3QgcmF0aW8gd2hlbiB0aGUgY2FtZXJhIHN3aXRjaGVzLgorCisyMDA0LTEwLTE4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X3NyY19xdWVyeSksCisJKGdzdF9vZ2dfZGVtdXhfc3JjX2V2ZW50KSwgKGdzdF9vZ2dfcGFkX3B1c2gpOgorCSAgU3RhcnQgYXQgemVyby4KKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6ICh0aGVvcmFfZGVjX2NoYWluKToKKwkgIFNraXAgaGVhZGVycy4gQmFkIGlkZWEgZm9yIGNoYWluZWQgb2dnLCBidXQgZml4ZXMgc2Vla2luZy4KKworMjAwNC0xMC0xOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwlJIHN3ZWFyLCB0aGlzIGlzIHRoZSBsYXN0IHRpbWUgSSB0b3VjaCB0aGlzLgorCisyMDA0LTEwLTE4ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X3NyY19xdWVyeSksCisJKGdzdF9vZ2dfZGVtdXhfc3JjX2V2ZW50KSwgKGdzdF9vZ2dfcGFkX3BvcHVsYXRlKSwKKwkoX3JlYWRfYm9zX3Byb2Nlc3MpLCAoZ3N0X29nZ19kZW11eF9pdGVyYXRlKSwgKGdzdF9vZ2dfcGFkX25ldyk6CisJICBGYXN0ZXIgc2Vla2luZy4KKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6ICh0aGVvcmFfZGVjX3NpbmtfY29udmVydCk6CisJICBUaW1lLXRvLWRlZmF1bHQgY29udmVyc2lvbi4KKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmM6ICh2b3JiaXNfZGVjX2NoYWluKToKKwkgIERvbid0IGVycm9yIG9uIHVua25vd24gcGFja2V0cywganVzdCBza2lwLiBXZSBzaG91bGQgcHJvYmFibHkKKwkgIHJlYWQgdGhlbSBpZiB3ZSB3YW50IHRvIHN1cHBvcnQgY2hhaW5lZCBvZ2cuCisKKzIwMDQtMTAtMTggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJQWRkZWQgY2RhdWRpbyB0byB3cm9uZyBsaXN0LgorCisyMDA0LTEwLTE4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCVJldml2ZSBjZGF1ZGlvLgorCisyMDA0LTEwLTE4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfdmlkZW9fZ2V0Y2FwcyksCisJKGdzdF9kdmRlY192aWRlb19saW5rKSwgKGdzdF9kdmRlY19wdXNoKToKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6IChnc3Rfc21va2VlbmNfY2xhc3NfaW5pdCksCisJKGdzdF9zbW9rZWVuY19yZXN5bmMpLCAoZ3N0X3Ntb2tlZW5jX2NoYWluKToKKwlGaXggbWltZXR5cGUgb24gc21va2UgZW5jb2Rlci4KKwlBZGQgYXNwZWN0IHJhdGlvIHRvIGR2ZGVjLiBOb3Qgc3VyZSBpZiB0aGVzZQorCXZhbHVlcyBhcmUgY29ycmVjdCB0aG91Z2guLi4uCisKKzIwMDQtMTAtMTggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvdm9yYmlzL3ZvcmJpc2VuYy5jOiAoZ3N0X3ZvcmJpc2VuY19jbGFzc19pbml0KToKKwlGaXggdm9yYmlzIHByb3BlcnR5IGRlc2NyaXB0aW9ucyBhbmQgcmFuZ2VzLgorCisyMDA0LTEwLTE4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9pdGVyYXRlKToKKwlSZWFsbHkgZG8gbm90aGluZyB3aGVuIG5vIGRhdGEgaXMgYXZhaWxhYmxlLgorCUdvIHRvIHRoZSBwbGF5aW5nIHN0YXRlIHdoZW4gdGhlIHN0cmVhbSBpcyBub3Qgc2Vla2FibGUKKwlpbnN0ZWFkIG9mIGZhaWxpbmcuCisKKzIwMDQtMTAtMTggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvY2RhdWRpby9nc3RjZGF1ZGlvLmM6IChfZG9faW5pdCksIChnc3RfY2RhdWRpb19iYXNlX2luaXQpLAorCShnc3RfY2RhdWRpb19nZXRfZXZlbnRfbWFza3MpLCAoZ3N0X2NkYXVkaW9fc2VuZF9ldmVudCksCisJKGdzdF9jZGF1ZGlvX3F1ZXJ5KSwgKHBsdWdpbl9pbml0KSwgKGNkYXVkaW9fdXJpX2dldF90eXBlKSwKKwkoY2RhdWRpb191cmlfZ2V0X3Byb3RvY29scyksIChjZGF1ZGlvX3VyaV9nZXRfdXJpKSwKKwkoY2RhdWRpb191cmlfc2V0X3VyaSksIChjZGF1ZGlvX3VyaV9oYW5kbGVyX2luaXQpOgorCUFkZGVkIHVyaSBoYW5kbGVyIGZvciBjZDovLworCVBvcnQgdG8gbmV3IEFQSS4KKworMjAwNC0xMC0xOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RkZWNvZGViaW4uYzogKGdzdF9kZWNvZGVfYmluX2NsYXNzX2luaXQpLAorCShnc3RfZGVjb2RlX2Jpbl9pbml0KSwgKGZpbmRfY29tcGF0aWJsZXMpLCAoY2xvc2VfcGFkX2xpbmspLAorCSh0cnlfdG9fbGlua18xKSwgKG5vX21vcmVfcGFkcyksIChjbG9zZV9saW5rKSwgKHR5cGVfZm91bmQpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnZW5fcHJlcm9sbF9lbGVtZW50KSwKKwkocmVtb3ZlX3ByZXJvbGxzKSwgKHVua25vd25fdHlwZSksIChhZGRfZWxlbWVudF9zdHJlYW0pLAorCShuZXdfZGVjb2RlZF9wYWQpLCAoc2V0dXBfc291cmNlKSwgKGdzdF9wbGF5X2Jhc2VfYmluX2FkZF9lbGVtZW50KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fcmVtb3ZlX2VsZW1lbnQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9saW5rX3N0cmVhbSk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJpbi5jOiAoZ2VuX3ZpZGVvX2VsZW1lbnQpLAorCShnZW5fdmlzX2VsZW1lbnQpLCAocmVtb3ZlX3NpbmtzKSwgKHNldHVwX3NpbmtzKToKKwkqIGdzdC9wbGF5YmFjay9nc3RzdHJlYW1pbmZvLmM6IChnc3Rfc3RyZWFtX3R5cGVfZ2V0X3R5cGUpLAorCShnc3Rfc3RyZWFtX2luZm9fZ2V0X3R5cGUpLCAoZ3N0X3N0cmVhbV9pbmZvX2NsYXNzX2luaXQpLAorCShnc3Rfc3RyZWFtX2luZm9faW5pdCksIChnc3Rfc3RyZWFtX2luZm9fbmV3KSwKKwkoZ3N0X3N0cmVhbV9pbmZvX2Rpc3Bvc2UpLCAoc3RyZWFtX2luZm9fbXV0ZV9wYWQpLAorCShnc3Rfc3RyZWFtX2luZm9fc2V0X3Byb3BlcnR5KSwgKGdzdF9zdHJlYW1faW5mb19nZXRfcHJvcGVydHkpOgorCSogZ3N0L3BsYXliYWNrL2dzdHN0cmVhbWluZm8uaDoKKwlBZGQgc2luayBwYWR0ZW1wbGF0ZSB0byBkZWNvZGViaW4uCisJQWRkZWQgc29tZSBtb3JlIGNvbW1lbnRzLgorCU1ha2UgcXVldWUgc2l6ZSBjb25maWd1cmFibGUgaW4gcGxheWJhc2ViaW4uCisJQWRkZWQgcG9zc2liaWxpdHkgdG8gdXNlIGVsZW1lbnRzIGFzIHNpbmtzIChleCBjZGF1ZGlvKS4KKworMjAwNC0xMC0xNSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiAoZ3N0X3NwZWV4ZW5jX2NsYXNzX2luaXQpLAorCShnc3Rfc3BlZXhlbmNfY2hhaW4pOgorCUZpeCBzcGVleCB0aW1lc3RhbXBzIHNvIHRoYXQgaXQgZ2V0cyBtdXhlZCBwcm9wZXJseS4KKworMjAwNC0xMC0xNSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOiAoZ3N0X2R2MTM5NHNyY19nZXRfdHlwZSksCisJKGdzdF9kdjEzOTRzcmNfYmFzZV9pbml0KSwgKGdzdF9kdjEzOTRzcmNfY2xhc3NfaW5pdCksCisJKGdzdF9kdjEzOTRzcmNfaW5pdCksIChnc3RfZHYxMzk0c3JjX2Rpc3Bvc2UpLAorCShnc3RfZHYxMzk0c3JjX2lzb19yZWNlaXZlKSwgKGdzdF9kdjEzOTRzcmNfZGlzY292ZXJfYXZjX25vZGUpLAorCShnc3RfZHYxMzk0c3JjX2NoYW5nZV9zdGF0ZSksIChnc3RfZHYxMzk0c3JjX2dldF9ldmVudF9tYXNrKSwKKwkoZ3N0X2R2MTM5NHNyY19ldmVudCksIChnc3RfZHYxMzk0c3JjX2dldF9mb3JtYXRzKSwKKwkoZ3N0X2R2MTM5NHNyY19jb252ZXJ0KSwgKGdzdF9kdjEzOTRzcmNfZ2V0X3F1ZXJ5X3R5cGVzKSwKKwkoZ3N0X2R2MTM5NHNyY19xdWVyeSksIChnc3RfZHYxMzk0c3JjX3VyaV9nZXRfdHlwZSksCisJKGdzdF9kdjEzOTRzcmNfdXJpX2dldF9wcm90b2NvbHMpLCAoZ3N0X2R2MTM5NHNyY191cmlfZ2V0X3VyaSksCisJKGdzdF9kdjEzOTRzcmNfdXJpX3NldF91cmkpLCAoZ3N0X2R2MTM5NHNyY191cmlfaGFuZGxlcl9pbml0KToKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5oOgorCUFkZGVkIGNvbnZlcnNpb24vcXVlcnkgZnVuY3Rpb25zLgorCVVwZGF0ZSBidWZmZXIgdGltZXN0YW1wcywKKwlBZGRlZCBzaWduYWxzLgorCUFkZGVkIHVyaSBkdjovLyBzbyBpdCBtaWdodCBwbGF5IGZyb20gdGhlIGZpcmV3aXJlIGluIHBsYXliaW4uCisJRml4IGEgcG9zc2libGUgbGVhay4KKwlBZGRlZCBkZWJ1Z2dpbmcuCisKKzIwMDQtMTAtMTUgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzogKGdzdF9kdjEzOTRzcmNfY2xhc3NfaW5pdCksCisJKGdzdF9kdjEzOTRzcmNfaW5pdCksIChnc3RfZHYxMzk0c3JjX3NldF9wcm9wZXJ0eSksCisJKGdzdF9kdjEzOTRzcmNfZ2V0X3Byb3BlcnR5KSwgKGdzdF9kdjEzOTRzcmNfaXNvX3JlY2VpdmUpLAorCShnc3RfZHYxMzk0c3JjX2Rpc2NvdmVyX2F2Y19ub2RlKSwgKGdzdF9kdjEzOTRzcmNfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5oOgorCUFkZGVkIEFWL0MgVlRSIGNvbnRyb2wgc3VwcG9ydCBuZWVkZWQgZm9yIHNvbWUgY2FtZXJhcy4KKwlBZGRlZCBhdXRvbWF0aWMgcG9ydCBkZXRlY3Rpb24uCisJQWRkZWQgcHJvcGVydGllcyBmb3Igc2VsZWN0aW5nIHRoZSBjaGFubmVsLgorCVRoZSBjb25maWd1cmUuYWMgc2NyaXB0IGlzIG5vdCB5ZXQgdXBkYXRlZCB0byByZWZsZWN0IHRoZQorCW5ldyBsaWJhdmMxMzk0IGFuZCBsaWJyb20xMzk0IGRlcGVuZGVuY2llcy4KKworMjAwNC0xMC0xNSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwKKwkocXRkZW11eF9wYXJzZSksIChnc3RfcXRkZW11eF9oYW5kbGVfZXNkcyk6CisJQW4gZXNkcyBib3ggaXMgbm90IGEgY29udGFpbmVyLgorCUZpeCBwYXJzaW5nIG9mIG1wNHYgYm94ZXMuCisJRG8gbm90IHRyeSB0byByZW5lZ290aWF0ZSBmcHMgZm9yIGVhY2ggZnJhbWUuIE5lZWQgdG8KKwlmaW5kIGEgYmV0dGVyIG1ldGhvZC4gVGhpcyBzaG91bGQgZml4IG1wNCBwbGF5YmFjay4KKworMjAwNC0xMC0xNCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb25maWd1cmUuYWM6IHVwZGF0ZSBmb3Igc3dmZGVjLTAuMyBhbmQgbGlib2lsLTAuMgorCSogZXh0L3N3ZmRlYy9nc3Rzd2ZkZWMuYzogdXBkYXRlIGZvciBzd2ZkZWMtMC4zCisJKiBleHQvc3dmZGVjL2dzdHN3ZmRlYy5oOiBzYW1lCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6IHVwZGF0ZSBmb3IgbGlib2lsLTAuMgorCSogZ3N0L3ZpZGVvdGVzdHNyYy92aWRlb3Rlc3RzcmMuYzogc2FtZQorCisyMDA0LTEwLTE0ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X211bHRpZmRzaW5rX2FkZCksCisJKGdzdF9tdWx0aWZkc2lua19yZW1vdmUpLCAoZ3N0X211bHRpZmRzaW5rX3JlbW92ZV9jbGllbnRfbGluayksCisJKGlzX3N5bmNfZnJhbWUpLCAoZ3N0X211bHRpZmRzaW5rX25ld19jbGllbnQpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF93cml0ZSksCisJKGdzdF9tdWx0aWZkc2lua19yZWNvdmVyX2NsaWVudCksIChnc3RfbXVsdGlmZHNpbmtfcXVldWVfYnVmZmVyKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRzKSwgKGdzdF9tdWx0aWZkc2lua19jaGFuZ2Vfc3RhdGUpOgorCVR1cm4gd2FybmluZ3MgaW50byBpbmZvLgorCURvbid0IGFsbG93IGEgc3RhdGUgY2hhbmdlIGluIHRoZSBzdHJlYW1pbmcgdGhyZWFkLgorCisyMDA0LTEwLTE0ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvdm9yYmlzL29nZ3ZvcmJpc2VuYy5jOgorCSogZXh0L3ZvcmJpcy92b3JiaXNkZWMuYzoKKwkgIGZpeCB0ZW1wbGF0ZSBzYW1wbGUgcmF0ZQorCisyMDA0LTEwLTEzICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfY2hlY2tfY2Fwc19yZXNldCksIChnc3RfbWFkX2NoYWluKToKKwlEZWNvZGluZyB0aGUgaGVhZGVyIGZpcnN0IGZpeGVzIHNvbWUgcHJvYmxlbXMgaW4gcmVzeW5jaW5nCisJaW4gbW9yZSBtcDNzLgorCisyMDA0LTEwLTEyICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdlbl92aWRlb19lbGVtZW50KSwKKwkoZ2VuX3Zpc19lbGVtZW50KSwgKHJlbW92ZV9zaW5rcyksIChzZXR1cF9zaW5rcyk6CisJQWRkZWQgdmlzIHBsdWdpbiBzdXBwb3J0LCBuZWVkIHRvIGNvbmZpZ3VyZSB0aGUgdmlzCisJZWxlbWVudCB0byBhY3RpdmF0ZSBpdC4KKworMjAwNC0xMC0xMiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc3JjLmM6IChnc3RfZ25vbWV2ZnNzcmNfZ2V0KSwKKwkoZ3N0X2dub21ldmZzc3JjX3NyY3BhZF9xdWVyeSksIChnc3RfZ25vbWV2ZnNzcmNfc3JjcGFkX2V2ZW50KToKKwkgIFNvbWUgZGVidWcuCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3Jlc2V0KSwKKwkoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX2V2ZW50KSwgKGdzdF9hdmlfZGVtdXhfcmVhZF9zdXBlcmluZGV4KSwKKwkoZ3N0X2F2aV9kZW11eF9yZWFkX3N1YmluZGV4ZXMpLCAoZ3N0X2F2aV9kZW11eF9hZGRfc3RyZWFtKSwKKwkoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5kZXgpLCAoZ3N0X2F2aV9kZW11eF9za2lwKSwKKwkoZ3N0X2F2aV9kZW11eF9zeW5jKSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX3NjYW4pLAorCShnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyKToKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguaDoKKwkgIFN1cHBvcnQgZm9yIG9wZW5ETUwtMi4wIGluZHgvaXgjIyBjaHVua3MuIFN1cHBvcnQgZm9yIGJyb2tlbiBpbmRleAorCSAgcmVjb3ZlcnkgKHdoZXJlLCBpZiBwYXJ0IG9mIHRoZSBpbmRleCBpcyBicm9rZW4sIHdlIHdpbGwgc3RpbGwgcmVhZAorCSAgdGhlIHJlc3Qgb2YgdGhlIGluZGV4IGFuZCByZWNvdmVyIHRoZSBicm9rZW4gcGFydCBieSBzdHJlYW0KKwkgIHNjYW5uaW5nKS4gTW9yZSBicm9rZW4gbWVkaWEgc3VwcG9ydC4gRU9TIHdvcmthcm91bmRzLiBHZW5lcmFsIEFWSQorCSAgYnJhaW5kYW1hZ2UgaGVhZGFjaGUgcmVjb3ZlcnkuIEFzcGlyaW4gaW5jbHVkZWQuCisKKzIwMDQtMTAtMTEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9jZHBhcmFub2lhL2dzdGNkcGFyYW5vaWEuYzogKGNkcGFyYW5vaWFfb3BlbiksCisJKGNkcGFyYW5vaWFfZXZlbnQpLCAoY2RwYXJhbm9pYV9xdWVyeSk6CisJICBHZXQgcmlkIG9mIGhpZGVvdXMgbGVhZC1pbi4KKworMjAwNC0xMC0xMSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoc2V0dXBfc291cmNlKToKKwlXcm9uZyB2YXIgdXNlZCB0byBnZXQgZ19saXN0X25leHQuCisKKzIwMDQtMTAtMTEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9jZHBhcmFub2lhL2dzdGNkcGFyYW5vaWEuYzogKGNkcGFyYW5vaWFfY2xhc3NfaW5pdCksCisJKGNkcGFyYW5vaWFfZ2V0KSwgKGNkcGFyYW5vaWFfb3Blbik6CisJICBSZXBvcnQgZGlzY2lkIGFzIG1ldGFkYXRhLCBhZGQgZHVyYXRpb24uCisKKzIwMDQtMTAtMTEgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKHNldHVwX3NvdXJjZSk6CisJQ2xlYW51cCB0aGUgcHJldmlvdXMgcGlwZWxpbmUgYSBsaXR0bGUgZWFybGllciBmb3IgdGhlCisJY2FzZSB0aGF0IGEgc291cmNlIGVsZW1lbnQgcHJvdmlkZXMgcmF3IGRhdGEuCisKKzIwMDQtMTAtMTEgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX2NoYWluKToKKwkgIHJlc2V0IHYxIHRhZyBvZmZzZXQgd2hlbiB0aGVyZSBpcyBubyB2MSB0YWcuIEZpeGVzIGlkM2RlbXV4IGFsd2F5cworCSAgY29uc3VtaW5nIHRoZSBsYXN0IDEyOCBieXRlcywgZXZlbiB0aG91Z2ggaXQgd2FzIHZhbGlkIG1wMyBkYXRhLgorCisyMDA0LTEwLTEwICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX3BhbGV0dGVfdG9fY2FwcyksCisJKGdzdF92NGxzcmNfZ2V0Y2FwcyksIChnc3RfdjRsc3JjX2dldCk6CisJKiBzeXMvdjRsL3Y0bC1vdmVybGF5X2NhbGxzLmM6IChnc3RfdjRsX3NldF9vdmVybGF5KToKKwlDaGFuZ2UgZ193YXJuaW5ncyB0byBHU1RfV0FSTklOR19PQkpFQ1QgYW5kIGZpeCBjb2xvdXJzcGFjZSBpc3N1ZQorCisyMDA0LTEwLTEwICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX3NyY19saW5rKSwgKGdzdF92NGxzcmNfZ2V0Y2Fwcyk6CisJRml4IGZvciB3ZWJjYW1zIHRoYXQgc3VwcG9ydCBvbmx5IHNwZWNpZmljIHdpZHRoIG9yIGhlaWdodAorCisyMDA0LTEwLTA5ICBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dC5pLm1AemVuLmNvLnVrPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiAoZ3N0X3dhdmVuY19zdG9wX2ZpbGUpOgorCSAgRml4IHdyb25nIGRpc2NvbnQgZXZlbnQgc2V0dXAgKGZpeGVzICMxNTQ5NjcpLgorCisyMDA0LTEwLTA5ICBTZWJhc3RpZW4gQ290ZSAgPHNjNUBoZXJtZXMudXNoZXJiLmNhPgorCisJUmV2aWV3ZWQgYnk6ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6IChnc3RfYXVwYXJzZV9jaGFpbik6CisJICBFcnJvciBvdXQgb24gaW52YWxpZCBkYXRhIChmaXhlcyAjMTU0ODA3KS4KKworMjAwNC0xMC0wOSAgVGltLVBoaWxpcHAgTcO8bGxlciAgPHQuaS5tQHplbi5jby51az4KKworCVJldmlld2VkIGJ5OiBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZHZkcmVhZC9kdmRyZWFkc3JjLmM6IChfcmVhZCk6CisJICBNYWtlIHRpdGxlcyA+IDAgd29yayBhZ2FpbiAoZml4ZXMgIzE1NDgzNCkuCisKKzIwMDQtMTAtMDkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzoKKwkoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX3RlbXBsYXRlX2NhcHMpOgorCSAgV01WMyBtaXNzaW5nIGluIHRlbXBsYXRlIGNhcHMuCisKKzIwMDQtMTAtMDkgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfbWFzc2FnZV9pbmRleCk6CisJICBPSywgc28gdGhlIG9yaWdpbmFsIGNvZGUgd2FzIHRvbyBzdHJpY3QuIEl0IG1ha2VzIHJhbmRvbSBBVkkgZmlsZXMKKwkgIGhhbmcgZm9yIHNlY29uZHMgdXBvbiBvcGVuaW5nLCB3aGljaCBpcyB1bmFjY2VwdGFibGUgYW5kIGlzIGZhcgorCSAgYmV5b25kIHRoZSBvcmlnaW5hbCBnb2FsIG9mIGdldHRpbmcgbXVsdGlwbGUgY2h1bmtzIGZvciBvbmUtY2h1bmsKKwkgIHNvdW5jIHN0cmVhbSBmaWxlcy4gU28gbm93IGRvIGp1c3QgdGhhdC4KKworMjAwNC0xMC0wOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChzZXR1cF9zb3VyY2UpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCSAgQWN0dWFsbHkgY2xlYW4gdXAgc3RyZWFtaW5mbyBpZiBvdXRwdXQgZmFpbHMuIFRoaXMgd291bGQgdHJpZ2dlcgorCSAgaWYsIGZvciBleGFtcGxlLCB0aGVyZSB3YXMgbm8gQ0QgaW4gdGhlIGRyaXZlLiBObyBwcmVyb2xsLCBzbworCSAgYSBzdHJlYW1pbmZvIHN0cnVjdHVyZSBpcyBjcmVhdGVkLCBidXQgdGhlIHN1YnNlcXVlbnQgc3RhdGUgY2hhbmdlCisJICBvZiB0aGUgdGhyZWFkIGZhaWxzLgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdzdF9wbGF5X2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCSAgRG9uJ3QgY2hhbmdlIHN0YXRlIGlmIHBhcmVudCBmYWlsZWQuCisKKzIwMDQtMTAtMDggIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnc3RfcGxheV9iaW5fY2xhc3NfaW5pdCksCisJKGdzdF9wbGF5X2Jpbl9pbml0KSwgKGdzdF9wbGF5X2Jpbl9nZXRfcHJvcGVydHkpLCAoaGFuZG9mZiksCisJKGdlbl92aWRlb19lbGVtZW50KSwgKHJlbW92ZV9zaW5rcyk6CisJICBBZGQgc21hbGwgYml0cyBvZiBjb2RlIGZvciBzY3JlZW5zaG90IGhhbmRsaW5nLgorCisyMDA0LTEwLTA4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdzdF9wbGF5X2Jpbl9zZXRfcHJvcGVydHkpLAorCShnZW5fdmlkZW9fZWxlbWVudCksIChnZW5fYXVkaW9fZWxlbWVudCksIChzZXR1cF9zaW5rcyk6CisJRG9uJ3QgYXNzdW1lIHRoZSB1c2VyIHByb3ZpZGVkIHNpbmtzIGFyZSBuYW1lZCAic2luayIuLi4KKworMjAwNC0xMC0wOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ2VuX3ByZXJvbGxfZWxlbWVudCksCisJKHVua25vd25fdHlwZSksIChzZXR1cF9zb3VyY2UpLCAoZ3N0X3BsYXlfYmFzZV9iaW5fcmVtb3ZlX2VsZW1lbnQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9saW5rX3N0cmVhbSk6CisJRG8gbm90IHRyeSB0byBhdXRvcGx1ZyBzb3VyY2VzIHRoYXQgZ2VuZXJhdGUgcmF3IHN0cmVhbXMgbGlrZQorCWNkcGFyYW5vaWEuCisJZGlzY29ubmVjdCB0aGUgcHJlcm9sbCBvdmVycnVuIHNpZ25hbCB3aGVuIHdlIGRvbid0IG5lZWQgaXQgYW55bW9yZS4KKworMjAwNC0xMC0wOCAgTWlsb3N6IERlcmV6eW5za2kgIDxpbnRlcm5hbGVycm9yLnJlekBmaHR3LWJlcmxpbi5kZT4KKworCSogZXh0L2NkcGFyYW5vaWEvZ3N0Y2RwYXJhbm9pYS5jOiAoX2RvX2luaXQpLAorCUFkZGVkIHJld29ya2VkIHBhdGNoIGZyb20gIzE1NDkwMyBmcm9tIG1pbG9zeiBkZXJlenluc2tpIChkZWFkY2hpcCkuCisKKzIwMDQtMTAtMDggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvY2RwYXJhbm9pYS9nc3RjZHBhcmFub2lhLmM6IChfZG9faW5pdCksCisJKGNkcGFyYW5vaWFfYmFzZV9pbml0KSwgKGNkcGFyYW5vaWFfY2xhc3NfaW5pdCksIChjZHBhcmFub2lhX2luaXQpLAorCShjZHBhcmFub2lhX2Rpc3Bvc2UpLCAoY2RwYXJhbm9pYV9nZXQpLCAoY2RwYXJhbm9pYV9jaGFuZ2Vfc3RhdGUpLAorCShjZHBhcmFub2lhX2NvbnZlcnQpLCAoY2RwYXJhbm9pYV91cmlfZ2V0X3R5cGUpLAorCShjZHBhcmFub2lhX3VyaV9nZXRfcHJvdG9jb2xzKSwgKGNkcGFyYW5vaWFfdXJpX2dldF91cmkpLAorCShjZHBhcmFub2lhX3VyaV9zZXRfdXJpKSwgKGNkcGFyYW5vaWFfdXJpX2hhbmRsZXJfaW5pdCk6CisJKiBleHQvY2RwYXJhbm9pYS9nc3RjZHBhcmFub2lhLmg6CisJVGhpcyBhZGRzIHRoZSBjZGRhOi8vPHRyYWNrbnVtPiB1cmkuCisKKzIwMDQtMTAtMDggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcGxheWJhY2svZ3N0ZGVjb2RlYmluLmM6IChnc3RfZGVjb2RlX2Jpbl9jbGFzc19pbml0KSwKKwkoZ3N0X2RlY29kZV9iaW5faW5pdCksIChmaW5kX2NvbXBhdGlibGVzKSwgKGNsb3NlX3BhZF9saW5rKSwKKwkodHJ5X3RvX2xpbmtfMSksIChub19tb3JlX3BhZHMpLCAoY2xvc2VfbGluayksICh0eXBlX2ZvdW5kKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoZ3N0X3BsYXlfYmFzZV9iaW5fY2xhc3NfaW5pdCksCisJKHVua25vd25fdHlwZSksIChnc3RfcGxheV9iYXNlX2Jpbl9yZW1vdmVfZWxlbWVudCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2xpbmtfc3RyZWFtKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5oOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdzdF9wbGF5X2Jpbl9pbml0KSwKKwkoZ3N0X3BsYXlfYmluX3NldF9wcm9wZXJ0eSksIChnZW5fdmlkZW9fZWxlbWVudCksCisJKGdlbl9hdWRpb19lbGVtZW50KSwgKHNldHVwX3NpbmtzKToKKwkqIGdzdC9wbGF5YmFjay9nc3RzdHJlYW1pbmZvLmM6IChnc3Rfc3RyZWFtX3R5cGVfZ2V0X3R5cGUpLAorCShnc3Rfc3RyZWFtX2luZm9fZ2V0X3R5cGUpLCAoZ3N0X3N0cmVhbV9pbmZvX2NsYXNzX2luaXQpLAorCShnc3Rfc3RyZWFtX2luZm9faW5pdCksIChnc3Rfc3RyZWFtX2luZm9fbmV3KSwKKwkoZ3N0X3N0cmVhbV9pbmZvX2Rpc3Bvc2UpLCAoc3RyZWFtX2luZm9fbXV0ZV9wYWQpLAorCShnc3Rfc3RyZWFtX2luZm9fc2V0X3Byb3BlcnR5KSwgKGdzdF9zdHJlYW1faW5mb19nZXRfcHJvcGVydHkpOgorCSogZ3N0L3BsYXliYWNrL2dzdHN0cmVhbWluZm8uaDoKKwlSZXVzZSB0aGUgYXVkaW8gYW5kIHZpZGVvIGJpbnMuCisJU29tZSBpbnRlcm5hbCBjbGVhbnVwcyBpbiB0aGUgc3RyZWFtIHNlbGVjdGlvbiBjb2RlLgorCisyMDA0LTEwLTA4ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfc2lua19saW5rKSwKKwkoZ3N0X3hpbWFnZXNpbmtfc2V0X3h3aW5kb3dfaWQpLCAoZ3N0X3hpbWFnZXNpbmtfaW5pdCk6CisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuaDoKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfc2lua19saW5rKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3NldF94d2luZG93X2lkKSwgKGdzdF94dmltYWdlc2lua19pbml0KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmg6IFJldmVydGluZyBSb25hbGQncyBjaGFuZ2VzIGFzIHRoZSBpc3N1ZSBpcworCW5vdCBjb21pbmcgZnJvbSB0aG9zZSBlbGVtZW50cy4gTW9yZW92ZXIgdGhlc2UgZWxlbWVudHMgc2hvdWxkIG5vdCBrZWVwCisJdGhlIHhpZCB0aGV5IGhhdmUgYmVlbiBnaXZlbiB3aGVuIGluIE5VTEwgc3RhdGUuCisKKzIwMDQtMTAtMDcgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfc2lua19saW5rKSwKKwkoZ3N0X3hpbWFnZXNpbmtfc2V0X3h3aW5kb3dfaWQpLCAoZ3N0X3hpbWFnZXNpbmtfaW5pdCk6CisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuaDoKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfc2lua19saW5rKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3NldF94d2luZG93X2lkKSwgKGdzdF94dmltYWdlc2lua19pbml0KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmg6CisJICBBY3R1YWxseSBvbmx5IGNyZWF0ZSBhIG5ldyB0b3BsZXZlbCB3aW5kb3cgaWYgd2UncmUgbm90IGdvbm5hCisJICBlbWJlZCBpdCByaWdodCBhZnRlci4KKworMjAwNC0xMC0wNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAocGxheV9iYXNlX2Jpbl9tdXRlX3BhZCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX211dGVfc3RyZWFtKSwgKGdzdF9wbGF5X2Jhc2VfYmluX2xpbmtfc3RyZWFtKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChzZXR1cF9zaW5rcyk6CisJSW1wbGVtZW50IG11dGluZy91bm11dGluZyBvZiBzdHJlYW1zLCBtdXRlIHN0cmVhbXMgdGhhdCBhcmUgbm90CisJdXNlZC4KKworMjAwNC0xMC0wNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAoYWMzX3R5cGVfZmluZCksCisJKHBsdWdpbl9pbml0KToKKwlBZGRlZCBsYW1lIGF1ZGlvL3gtYWMzIHR5cGVmaW5kIGZ1bmN0aW9uLgorCisyMDA0LTEwLTA2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgYnVtcCBuYW5vIHRvIGN2cworCis9PT0gcmVsZWFzZSAwLjguNSA9PT0KKworMjAwNC0xMC0wNiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIE5FV1M6CisJKiBSRUxFQVNFOgorCSogY29uZmlndXJlLmFjOgorCSAgcmVsZWFzaW5nIDAuOC41LCAiVGFrZSBZb3UgT24iCisKKzIwMDQtMTAtMDYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcGxheWJhY2svZ3N0ZGVjb2RlYmluLmM6IChnc3RfZGVjb2RlX2Jpbl9pbml0KSwKKwkoZmluZF9jb21wYXRpYmxlcyksIChjbG9zZV9wYWRfbGluayksICh0cnlfdG9fbGlua18xKSwgKG5ld19wYWQpLAorCShub19tb3JlX3BhZHMpLCAoY2xvc2VfbGluayksICh0eXBlX2ZvdW5kKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAobmV3X2RlY29kZWRfcGFkKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnZW5fdmlkZW9fZWxlbWVudCk6CisJRG8gbm90IHNpZ25hbCB0aGUgbm9fbW9yZV9wYWRzIGFmdGVyIHRoZSBmaXJzdCBwYWQgd2hlbgorCXdlIGFyZSBwbHVnZ2luZyBhIG5vbiBkeW5hbWljIGVsZW1lbnQgd2l0aCBtdWx0aXBsZQorCW91dHB1dCBwYWRzIChsaWtlIHN3ZmRlYywgZHZkZWMsIC4uLikuCisKKzIwMDQtMTAtMDYgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGJ1bXAgZm9yIHByZXJlbGVhc2UKKworMjAwNC0xMC0wNiAgU3RlcGhhbmUgTG9ldWlsbGV0ICA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOgorCSAgYWRkIEFUUkFDMyB0byBTVEFUSUMgQ0FQUyB0byBmaXggYSB3YXJuaW5nCisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzoKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOgorCSAgZml4IHR5cG9zCisKKzIwMDQtMTAtMDYgIFN0ZXBoYW5lIExvZXVpbGxldCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6CisJICBnZW5lcmF0ZSBjYXBzIGZvciBBVFJBQzMgYXVkaW8gc3RyZWFtcworCisJKiBnc3QvcmVhbG1lZGlhL3JtZGVtdXguYzoKKwkgIGdlbmVyYXRlIGNhcHMgZm9yIEFUUkFDMyBhdWRpbyBzdHJlYW1zCisKKzIwMDQtMTAtMDYgIFN0ZXBoYW5lIExvZXVpbGxldCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBnc3Qvd2F2cGFyc2UvTWFrZWZpbGUuYW0KKwkqIGdzdC93YXZwYXJzZS9yaWZmLmgKKwkqIGdzdC93YXZwYXJzZS93YXZwYXJzZS52Y3Byb2oKKwkgIHJpZmYuaCByZW1vdmFsICh1bnVzZWQgYW5kIGR1cGxpY2F0aW9uIHdpdGggcmlmZi1pZHMuaCkKKworMjAwNC0xMC0wNiAgU3RlcGhhbmUgTG9ldWlsbGV0ICA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oCisJICByZW1vdmUgZHVwbGljYXRlZCBkZWZpbmVzIGZvciBhdWRpbyBjb2RlYyBjb2RlcworCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLWlkcy5oCisJKiBnc3Qvd2F2ZW5jL3JpZmYuaDoKKwkgIGFkZCAiNENDIiBjb2RlIGZvciBBVFJBQzMgYXVkaW8gc3RyZWFtcworCSAgYWRkICI0Q0MiIGNvZGUgZm9yIElUVV9HNzIxX0FEUENNICh1bnVzZWQgZm9yIG5vdykKKworMjAwNC0xMC0wNiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IChnc3RfZmx4ZGVjX2luaXQpLCAoZ3N0X2ZseGRlY19sb29wKToKKwlBY3R1YWxseSBfZG9fIG5lZ290aWF0aW9uLiBQYXNzIGdkb3VibGUgYXMgYXJnIGluc3RlYWQKKwlvZiBndWludDY0IGZvciB0aGUgZnJhbWVyYXRlLgorCisyMDA0LTEwLTA2ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAoZ3N0X2RlY29kZV9iaW5faW5pdCksCisJKGZpbmRfY29tcGF0aWJsZXMpLCAoY2xvc2VfcGFkX2xpbmspLCAodHJ5X3RvX2xpbmtfMSksCisJKG5vX21vcmVfcGFkcyksIChjbG9zZV9saW5rKSwgKHR5cGVfZm91bmQpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChuZXdfZGVjb2RlZF9wYWQpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdlbl92aWRlb19lbGVtZW50KSwKKwkoZ2VuX2F1ZGlvX2VsZW1lbnQpOgorCVNldCBzdGF0ZSBvbiBuZXdseSBhZGRlZCBlbGVtZW50IHRvIFJFQURZIHNvIHRoYXQgbmVnb3RpYXRpb24KKwljYW4gaGFwcGVuIEFTQVAuCisJQWRkZXMgc29tZSBtb3JlIGRlYnVnIGluZm8uCisJRG8gbm90IHRyeSB0byBwbHVnIHBhZHMgd2l0aCBtdWx0aXBsZSBjYXBzIHN0cnVjdHVyZXMgb3IgQU5ZCisJYmVjYXVzZSBpdCBpcyB0b28gZGFuZ2Vyb3VzIHNpbmNlIHdlIGRvIG5vdCBkbyBkeW5hbWljCisJcmVwbHVnZ2luZy4KKworMjAwNC0xMC0wNiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCXdyaXR0ZW4gYnk6IEdvcmEgTW9oYW50eSA8Z29yYV9tb2hhbnR5QHlhaG9vLmNvLmluPgorCisJKiBwby9MSU5HVUFTOgorCSogcG8vb3IucG86CisJICBhZGQgT3JpeWEgdHJhbnNsYXRpb24KKworMjAwNC0xMC0wNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9tYXNzYWdlX2luZGV4KToKKwkgIFByZXZlbnQgb3ZlcndyaXRlIG9mIHNpemUgbWVtYmVyLiBNYWtlcyBhdWRpbyBzb3VuZCBjcmFwcHkuCisKKzIwMDQtMTAtMDUgIFN0ZXBoYW5lIExvZXVpbGxldCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKHBsdWdpbl9pbml0KToKKwlBZGQgcm12YiB0byB0aGUgbGlzdCBvZiBrbm93biBSZWFsTWVkaWEgZXh0ZW5zaW9ucworCisyMDA0LTEwLTA1ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L2xpYm1uZy9nc3RtbmdkZWMuYzogKGdzdF9tbmdkZWNfbG9vcCksIChtbmdkZWNfZXJyb3IpLAorCShtbmdkZWNfb3BlbnN0cmVhbSksIChtbmdkZWNfY2xvc2VzdHJlYW0pLAorCShtbmdkZWNfaGFuZGxlX3NpbmtfZXZlbnQpLCAobW5nZGVjX3JlYWRkYXRhKSwKKwkobW5nZGVjX2dldHRpY2tjb3VudCksIChtbmdkZWNfc2V0dGltZXIpLCAobW5nZGVjX3Byb2Nlc3NoZWFkZXIpLAorCShtbmdkZWNfZ2V0Y2FudmFzbGluZSksIChtbmdkZWNfcmVmcmVzaCksCisJKGdzdF9tbmdkZWNfY2hhbmdlX3N0YXRlKToKKwlTZXQgdGhlIGZyYW1lcmF0ZSBjb3JyZWN0bHkuCisKKzIwMDQtMTAtMDQgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfbWFzc2FnZV9pbmRleCk6CisJICBUaGVyZSB3YXMgc29tZXRoaW5nIHdyb25nIHdpdGggdGhlIGluZGV4IG1hc3NhZ2luZy4KKworMjAwNC0xMC0wNCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWcuYzogKHNtb2tlX3R5cGVfZmluZCksIChwbHVnaW5faW5pdCk6CisJKiBleHQvanBlZy9nc3RzbW9rZWRlYy5jOiAoZ3N0X3Ntb2tlZGVjX2luaXQpLAorCShnc3Rfc21va2VkZWNfY2hhaW4pOgorCSogZXh0L2pwZWcvZ3N0c21va2VkZWMuaDoKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmM6IChnc3Rfc21va2VlbmNfY2xhc3NfaW5pdCksCisJKGdzdF9zbW9rZWVuY19pbml0KSwgKGdzdF9zbW9rZWVuY19yZXN5bmMpLCAoZ3N0X3Ntb2tlZW5jX2NoYWluKToKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZW5jLmg6CisJKiBleHQvanBlZy9zbW9rZWNvZGVjLmM6IChzbW9rZWNvZGVjX2VuY29kZV9uZXcpLAorCShzbW9rZWNvZGVjX2RlY29kZV9uZXcpLCAoc21va2Vjb2RlY19pbmZvX2ZyZWUpLAorCShzbW9rZWNvZGVjX3NldF9xdWFsaXR5KSwgKHNtb2tlY29kZWNfZ2V0X3F1YWxpdHkpLAorCShzbW9rZWNvZGVjX3NldF90aHJlc2hvbGQpLCAoc21va2Vjb2RlY19nZXRfdGhyZXNob2xkKSwKKwkoc21va2Vjb2RlY19zZXRfYml0cmF0ZSksIChzbW9rZWNvZGVjX2dldF9iaXRyYXRlKSwKKwkoZmluZF9iZXN0X3NpemUpLCAoYWJzX2RpZmYpLCAocHV0KSwgKHNtb2tlY29kZWNfZW5jb2RlX2lkKSwKKwkoc21va2Vjb2RlY19lbmNvZGUpLCAoc21va2Vjb2RlY19wYXJzZV9pZCksCisJKHNtb2tlY29kZWNfcGFyc2VfaGVhZGVyKSwgKHNtb2tlY29kZWNfZGVjb2RlKToKKwkqIGV4dC9qcGVnL3Ntb2tlY29kZWMuaDoKKwkqIGV4dC9qcGVnL3Ntb2tlZm9ybWF0Lmg6CisJVXBkYXRlZCBzbW9rZSwgbmV3IGJpdHN0cmVhbSwgYWxsb3dzIGVtYmVkZGluZyBpbiBvZ2cuCisKKzIwMDQtMTAtMDQgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19ldmVudCk6CisJICBGaXggc2Vla2luZyBpbiBzb21lIGZpbGVzLiBBbGwgdGhpcyBjb2RlIGlzIG5vIGxvbmdlciBuZWVkZWQgKGFuZAorCSAgYWN0dWFsbHkgYnJlYWtzIHN0dWZmKSBiZWNhdXNlIHdlIG5vdyBzeW5jaHJvbml6ZSB0aGUgZnVsbCBpbmRleAorCSAgcmlnaHQgd2hlbiByZWFkaW5nIHRoZSBoZWFkZXIuCisKKzIwMDQtMTAtMDQgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJY29uZmlndXJlIHVwZGF0ZSBmb3IgbGlibW5nLgorCisyMDA0LTEwLTA0ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L2xpYm1uZy9NYWtlZmlsZS5hbToKKwkqIGV4dC9saWJtbmcvZ3N0bW5nLmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvbGlibW5nL2dzdG1uZy5oOgorCSogZXh0L2xpYm1uZy9nc3RtbmdkZWMuYzogKGdzdF9tbmdkZWNfZ2V0X3R5cGUpLAorCShnc3RfbW5nZGVjX2Jhc2VfaW5pdCksIChnc3RfbW5nZGVjX2NsYXNzX2luaXQpLAorCShnc3RfbW5nZGVjX3NpbmtsaW5rKSwgKGdzdF9tbmdkZWNfaW5pdCksIChnc3RfbW5nZGVjX3NyY19nZXRjYXBzKSwKKwkoZ3N0X21uZ2RlY19sb29wKSwgKGdzdF9tbmdkZWNfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X21uZ2RlY19zZXRfcHJvcGVydHkpLCAobW5nZGVjX2Vycm9yKSwgKG1uZ2RlY19vcGVuc3RyZWFtKSwKKwkobW5nZGVjX2Nsb3Nlc3RyZWFtKSwgKG1uZ2RlY19oYW5kbGVfc2lua19ldmVudCksCisJKG1uZ2RlY19yZWFkZGF0YSksIChtbmdkZWNfZ2V0dGlja2NvdW50KSwgKG1uZ2RlY19zZXR0aW1lciksCisJKG1uZ2RlY19wcm9jZXNzaGVhZGVyKSwgKG1uZ2RlY19nZXRjYW52YXNsaW5lKSwgKG1uZ2RlY19yZWZyZXNoKSwKKwkoZ3N0X21uZ2RlY19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L2xpYm1uZy9nc3RtbmdkZWMuaDoKKwkqIGV4dC9saWJtbmcvZ3N0bW5nZW5jLmM6IChnc3RfbW5nZW5jX2dldF90eXBlKSwKKwkobW5nX2NhcHNfZmFjdG9yeSksIChyYXdfY2Fwc19mYWN0b3J5KSwgKGdzdF9tbmdlbmNfYmFzZV9pbml0KSwKKwkoZ3N0X21uZ2VuY19jbGFzc19pbml0KSwgKGdzdF9tbmdlbmNfc2lua2xpbmspLCAoZ3N0X21uZ2VuY19pbml0KSwKKwkoZ3N0X21uZ2VuY19jaGFpbiksIChnc3RfbW5nZW5jX2dldF9wcm9wZXJ0eSksCisJKGdzdF9tbmdlbmNfc2V0X3Byb3BlcnR5KToKKwkqIGV4dC9saWJtbmcvZ3N0bW5nZW5jLmg6CisJQWRkZWQgYmFzaWMgTU5HIGRlY29kZXIuIE5lZWRzIG1vcmUgd29yay4gVGhlIGVuY29kZXIgZG9lcworCW5vdCB3b3JrIHlldC4KKworMjAwNC0xMC0wNCAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3JlYWxtZWRpYS9ybWRlbXV4LmM6IChnc3Rfcm1kZW11eF9oYW5kbGVfc2lua19ldmVudCksCisJKGdzdF9ybWRlbXV4X2xvb3ApLCAoZ3N0X3JtZGVtdXhfYWRkX3N0cmVhbSksCisJKGdzdF9ybWRlbXV4X3BhcnNlX21kcHIpLCAoZ3N0X3JtZGVtdXhfZHVtcF9tZHByKToKKwkgIERvbid0IGhhbmcgb24gbGVuZ3RoPTAgY2h1bmtzLiBTb21lIG5lZ290aWF0aW9uIGZpeGVzLiBTaWduYWwKKwkgIG5vLW1vcmUtcGFkcy4KKworMjAwNC0xMC0wNCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgeW91IG5lZWQgYXQgbGVhc3QgMS4wLjQgb2Ygc3BlZXgKKworMjAwNC0xMC0wNCBJYWluIDxpYWluZ25vbWVAZ21haWwuY29tPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuaDogUmV2ZXJ0IHRoZSBpbmNsdWRlcyBjaGFuZ2VzLgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuW2NoXTogUmV2ZXJ0IHRoZSBpbmNsdWRlcyBjaGFuZ2VzLgorCisyMDA0LTA5LTMwIElhaW4gPGlhaW5nbm9tZUBnbWFpbC5jb20+CisKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpby5jIChnc3Rfc3VuYXVkaW9zaW5rX29wZW4pOiBVc2UgdGhlIGRldmljZQorCWZvdW5kIGR1cmluZyBpbml0IG9yIHNldCBhcyBhIHByb3BlcnR5IGluc3RlYWQgb2YgaGFyZGNvZGluZyAvZGV2L2F1ZGlvCisKKzIwMDQtMTAtMDQgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9yZWFsbWVkaWEvcm1kZW11eC5jOiAoZ3N0X3JtZGVtdXhfY2xhc3NfaW5pdCksCisJKGdzdF9ybWRlbXV4X2luaXQpLCAoZ3N0X3JtZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQpLAorCShnc3Rfcm1kZW11eF9sb29wKSwgKGdzdF9ybWRlbXV4X2FkZF9zdHJlYW0pLCAocmVfaGV4ZHVtcF9ieXRlcyksCisJKHJlX2R1bXBfcGFzY2FsX3N0cmluZyksIChnc3Rfcm1kZW11eF9kdW1wX19ybWYpLAorCShnc3Rfcm1kZW11eF9kdW1wX3Byb3ApLCAoZ3N0X3JtZGVtdXhfcGFyc2VfbWRwciksCisJKGdzdF9ybWRlbXV4X2R1bXBfbWRwciksIChnc3Rfcm1kZW11eF9kdW1wX2luZHgpLAorCShnc3Rfcm1kZW11eF9kdW1wX2RhdGEpOgorCSAgVXNlIGRlYnVnIGNhdGVnb3J5LCBmaXggRU9TIGhhbmRsaW5nLiBmaWxlc3JjICEgcm1kZW11eCBub3cKKwkgIHdvcmtzLgorCisyMDA0LTEwLTA0ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksCisJKGdzdF9hdmlfZGVtdXhfc3RyZWFtX3NjYW4pLCAoc29ydCksIChnc3RfYXZpX2RlbXV4X21hc3NhZ2VfaW5kZXgpLAorCShnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSk6CisJICBJbXByb3ZlIGFsbG9jYXRpb24sIGN1dHRpbmcgYW5kIHNvcnRpbmcgb2YgdGhlIGluZGV4LiBIb3cgdGFrZXMgYQorCSAgZmV3IHNlY29uZHMgaW5zdGVhZCBvZiBtaW51dGVzLgorCisyMDA0LTEwLTAzICBDaHJpc3RvcGhlIEZlcmdlYXUgIDx0ZXVmQGdub21lLm9yZz4KKworCSogZ3N0L3JlYWxtZWRpYS9ybWRlbXV4LmM6IChnc3Rfcm1kZW11eF9wYXJzZV9tZHByKToKKwkgIGZpeGVkIGNvbXBpbGF0aW9uCisKKzIwMDQtMTAtMDIgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzoKKwkoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX2NhcHNfd2l0aF9kYXRhKSwKKwkoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX3RlbXBsYXRlX2NhcHMpOgorCSAgQWRkIHdpbmcgY29tbWFuZGVyIGZvcm1hdCBtaW1ldHlwZS9mb3VyY2NzLgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9tYXNzYWdlX2luZGV4KToKKwkgIERvbid0IGNyYXNoIGlmIHNvbWUgdmFsdWUgaXMgMC4KKworMjAwNC0xMC0wMiAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOgorCShnc3RfcmlmZl9jcmVhdGVfdmlkZW9fY2Fwc193aXRoX2RhdGEpLAorCShnc3RfcmlmZl9jcmVhdGVfdmlkZW9fdGVtcGxhdGVfY2Fwcyk6CisJICBBZGQgRElCIGZvdXJjYyAocmF3LCBwYWxldHRpemVkIDgtYml0IFJHQikuCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuYzoKKwkoZ3N0X3JpZmZfcmVhZF9zdHJmX3ZpZHNfd2l0aF9kYXRhKToKKwkgIE9vcHMsIGZpeCBzdHJmX2RhdGEgcmVhZGluZyBidWcuCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2FkZF9zdHJlYW0pOgorCSAgVXNlIGEgbm9uLU5VTEwgdGFnLgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIFRpbWUgZm9yIGhhY2tzLiBTb3JyeSBEYXZlLiBBdCBsZWFzdCBvbmUgcXVpY2t0aW1lIG1vdmllIChhCisJICB0cmFpbGVyKSB0aGF0IEkndmUgZW5jb3VudGVyZWQgY29udGFpbnMgbXVsdGlwbGUgdmlkZW8gdHJhY2tzLgorCSAgT25lIG9mIHRob3NlIGlzIHRoZSBhY3R1YWwgdmlkZW8gdHJhY2ssIHRoZSBvdGhlciBhcmUgb25lLWZyYW1lCisJICB0cmFja3MgKGltYWdlcykuIFVuZm9ydHVuYXRlbHksIHRoZSBudW1iZXIgb2YgZnJhbWVzIGFjY29yZGluZworCSAgdG8gdGhlIHRyYWsgaGVhZGVyIGlzIDEgZm9yIGVhY2gsIHNvIHRoYXQgZG9lc24ndCBoZWxwLiBTbworCSAgaW5zdGVhZCwgSSBsb29rIGF0IHRoZSBkdXJhdGlvbiBhbmQgZGlzY2FyZCB0cmFja3Mgd2l0aCBhCisJICBkdXJhdGlvbiBzaG9ydGVyIHRoYW4gMjAlIG9mIHRoZSBsZW5ndGggb2YgdGhlIHN0cmVhbS4gQmV0dGVyCisJICB0aGFuIG5vdGhpbmcuCisKKzIwMDQtMTAtMDEgIENocmlzdGlhbiBTY2hhbGxlciA8Y2hyaXN0aWFuQGZsdWVuZG8uY29tPgorCisJKiBleHQvaXZvcmJpcy92b3JiaXMuYzoKKwkgIFBhdGNoIGZyb20gUGhpbCBCbHVuZGVsbCAoQnVnIDE1MjM0MSkKKworMjAwNC0xMC0wMSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiAoZ3N0X3NwZWV4X2RlY19jbGFzc19pbml0KSwKKwkoc3BlZXhfZGVjX2dldF9mb3JtYXRzKSwgKHNwZWV4X2RlY19jb252ZXJ0KSwKKwkoc3BlZXhfZGVjX3NyY19xdWVyeSksIChzcGVleF9kZWNfc3JjX2V2ZW50KSwgKHNwZWV4X2RlY19ldmVudCksCisJKHNwZWV4X2RlY19jaGFpbiksIChnc3Rfc3BlZXhkZWNfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3NwZWV4ZGVjX3NldF9wcm9wZXJ0eSk6CisJU21hbGwgY2xlYW51cHMuCisKKzIwMDQtMTAtMDEgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9jbGFzc19pbml0KSwKKwkoZ3N0X3dhdnBhcnNlX3N0cmVhbV9pbml0KSwgKGdzdF93YXZwYXJzZV9mbXQpLAorCShnc3Rfd2F2cGFyc2Vfb3RoZXIpLCAoZ3N0X3dhdnBhcnNlX2xvb3ApLAorCShnc3Rfd2F2cGFyc2VfcGFkX2NvbnZlcnQpLCAoZ3N0X3dhdnBhcnNlX3BhZF9xdWVyeSksCisJKGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQpOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmg6CisJQWRkZWQgc29tZSBtb3JlIGRlYnVnZ2luZyBpbmZvLgorCUZpeCB0aGUgY2FzZSB3aGVyZSB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlIGlzIDAuCisJTWFrZSBzdXJlIHdlIHNlZWsgdG8gc2FtcGxlIGJvcmRlcnMuCisKKzIwMDQtMTAtMDEgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcGxheWJhY2svUkVBRE1FOgorCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAoZ3N0X2RlY29kZV9iaW5fZmFjdG9yeV9maWx0ZXIpLAorCShnc3RfZGVjb2RlX2Jpbl9pbml0KSwgKGZpbmRfY29tcGF0aWJsZXMpLCAoY2xvc2VfcGFkX2xpbmspLAorCSh0cnlfdG9fbGlua18xKSwgKG5vX21vcmVfcGFkcyksIChjbG9zZV9saW5rKSwgKHR5cGVfZm91bmQpOgorCUFkZCBzb21lIGRlYnVnIGluZm8gdG8gZGVjb2RlYmluLCB1cGRhdGUgUkVBRE1FCisKKzIwMDQtMTAtMDEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9kdmRuYXYvZHZkbmF2c3JjLmM6IChkdmRuYXZfaGFuZGxlX25hdmlnYXRpb25fZXZlbnQpOgorCSAgRG9uJ3QgdXNlIGdfcHJpbnQoKTsgdXNlIEdTVF9ERUJVRygpLgorCisyMDA0LTEwLTAxICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvb2dnL2dzdG9nZ211eC5jOiAoZ3N0X29nZ19tdXhfbmV4dF9idWZmZXIpLAorCShnc3Rfb2dnX211eF9xdWV1ZV9wYWRzKToKKwkgIEhhbmRsZSBFT1MgcHJvcGVybHkuCisKKzIwMDQtMTAtMDEgIFNlYmFzdGllbiBDb3RlICA8c2M1QGhlcm1lcy51c2hlcmIuY2E+CisKKwlSZXZpZXdlZCBieTogUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfaW5pdCksIChnc3RfZmFhZF9zaW5rY29ubmVjdCksCisJKGdzdF9mYWFkX2NoYWluKSwgKGdzdF9mYWFkX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvZmFhZC9nc3RmYWFkLmg6CisJICBBbGxvdyBwbGF5YmFjayBvZiByYXcgKHVuZnJhbWVkKSBNUEVHIEFBQyBmaWxlcyAoIzE0ODk5MykuCisKKzIwMDQtMTAtMDEgIFNlYmFzdGllbiBDb3RlICA8c2M1QGhlcm1lcy51c2hlcmIuY2E+CisKKwlSZXZpZXdlZCBieTogUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfZm10KToKKwkgIFRocm93IGVycm9yIGlmIHdlIGRpZG4ndCByZWNvZ25pemUgdGhlIHN0cmVhbS4gRml4ZXMgIzE1MjI4OS4KKworMjAwNC0xMC0wMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3ZpZGVvc2NhbGUvZ3N0dmlkZW9zY2FsZS5jOiAoZ3N0X3ZpZGVvc2NhbGVfbGluayk6CisJICBGaXggbmVnb3RpYXRpb24uCisKKzIwMDQtMTAtMDEgIEZyYW5jaXMgTGFib250ZSAgPGZyYW5jaXNfbGFib250ZUBob3RtYWlsLmNvbT4KKworCVJldmlld2VkIGJ5OiBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9mbXQpOgorCSAgRml4IG1lbWxlYWsuCisKKzIwMDQtMTAtMDEgIEJhbGFtdXJhbGkgVmlzd2FuYXRoYW4gIDxiYWxhbXVyYWxpLnZpc3dhbmF0aGFuQHdpcHJvLmNvbT4KKworCVJldmlld2VkIGJ5OiBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuYXVkaW8uYzogKGdzdF9zdW5hdWRpb3Npbmtfc2V0cGFyYW1zKToKKwkgIFNvbHZlICMxNTI4MDUuCisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VubWl4ZXIuYzogKGdzdF9zdW5hdWRpb21peGVyX3NldF9tdXRlKToKKwkgIFNvbHZlIDE1MjgwNi4KKworMjAwNC0xMC0wMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOgorCShnc3RfcmlmZl9jcmVhdGVfdmlkZW9fY2Fwc193aXRoX2RhdGEpLAorCShnc3RfcmlmZl9jcmVhdGVfYXVkaW9fY2Fwc193aXRoX2RhdGEpOgorCSAgQWRkIGNvZGVjX2RhdGEgaGFuZGxpbmcgKGxpa2UgYXNmZGVtdXggdXNlZCB0byBkbykuCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmLmM6IChwbHVnaW5faW5pdCk6CisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfYmFzZV9pbml0KSwKKwkoZ3N0X2FzZl9kZW11eF9hZGRfYXVkaW9fc3RyZWFtKSwgKGdzdF9hc2ZfZGVtdXhfYWRkX3ZpZGVvX3N0cmVhbSk6CisJICBVc2UgcmlmZi1tZWRpYSBmb3IgY2FwcyBjcmVhdGlvbiBpbnN0ZWFkIG9mIG91ciBvd24gKG1vc3RseQorCSAgYnJva2VuKSBjb3B5IG9mIGl0cyBmdW5jdGlvbnMuCisKKzIwMDQtMTAtMDEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy92NGwvdjRsc3JjX2NhbGxzLmM6IChnc3RfdjRsc3JjX3RyeV9jYXB0dXJlKToKKwkgIERvbid0IGFjdHVhbGx5IGVycm9yIG91dCBpZiB3ZSBnZXQgYW5vdGhlciByZXR1cm4gdmFsdWUgdGhhbgorCSAgLUVJTlZBTC4gT3Bwb3NpdGUgdG8gd2hhdCBJIGZpcnN0IHRob3VnaHQsIGRyaXZlcnMgaGF2ZSByYW5kb20KKwkgIHJldHVybiB2YWx1ZXMgZm9yIHRoaXMsIGFsdGhvdWdoIC1FSU5WQUwgaXMgdGhlIGV4cGVjdGVkIHJldHVybgorCSAgdmFsdWUuIFNpbmNlIHRoaXMgaXMgbm90IGZhdGFsLCB3ZSBzaG91bGRuJ3QgdXNlCisJICBHU1RfRUxFTUVOVF9FUlJPUigpIGJ1dCBqdXN0IEdTVF9FUlJPUl9PQkpFQ1QoKS4KKworMjAwNC0xMC0wMSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2R2ZHJlYWQvZHZkcmVhZHNyYy5jOiAoZHZkcmVhZHNyY19jbGFzc19pbml0KSwKKwkoZHZkcmVhZHNyY19pbml0KSwgKGR2ZHJlYWRzcmNfZGlzcG9zZSksIChkdmRyZWFkc3JjX3NldF9wcm9wZXJ0eSksCisJKGR2ZHJlYWRzcmNfZ2V0X3Byb3BlcnR5KSwgKF9vcGVuKSwgKF9zZWVrKSwgKF9yZWFkKSwKKwkoZHZkcmVhZHNyY19nZXQpLCAoZHZkcmVhZHNyY19vcGVuX2ZpbGUpLAorCShkdmRyZWFkc3JjX2NoYW5nZV9zdGF0ZSk6CisJICBGaXguIERvbid0IGRvIG9uZSBiaWcgaHVnZSBsb29wIGFyb3VuZCB0aGUgd2hvbGUgRFZELCB0aGF0IHdpbGwKKwkgIGNhY2hlIGFsbCBkYXRhIGFuZCB0aHVzIGVhdCBzaXplb2YoZHZkKSAoc2V2ZXJhbCBHQikgYmVmb3JlIHdlCisJICBzZWUgc29tZXRoaW5nLgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9yZWFkX3NlZWspOgorCSAgQWN0dWFsbHkgTlVMTCdpZnkgZXZlbnQgYWZ0ZXIgdXNpbmcgaXQuCisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9yZWFkX3VzZV9ldmVudCksCisJKGdzdF9lYm1sX3JlYWRfaGFuZGxlX2V2ZW50KSwgKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9pZCksCisJKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9sZW5ndGgpLCAoZ3N0X2VibWxfcmVhZF9lbGVtZW50X2RhdGEpLAorCShnc3RfZWJtbF9yZWFkX3NlZWspLCAoZ3N0X2VibWxfcmVhZF9za2lwKToKKwkgIEhhbmRsZSBldmVudHMuCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5jOiAoZ3N0X2R2ZF9kZW11eF9iYXNlX2luaXQpLAorCShnc3RfZHZkX2RlbXV4X2luaXQpLCAoZ3N0X2R2ZF9kZW11eF9nZXRfYXVkaW9fc3RyZWFtKSwKKwkoZ3N0X2R2ZF9kZW11eF9nZXRfc3VicGljdHVyZV9zdHJlYW0pLCAoZ3N0X2R2ZF9kZW11eF9wbHVnaW5faW5pdCk6CisJICBGaXggdGltaW5nICh0aGlzIHdpbGwgcHJvYmFibHkgYnJlYWsgaWYgSSBzZWVrIHVzaW5nIG1lbnVzLCBidXQKKwkgIEkgZGlkbid0IGdldCB0aGVyZSB5ZXQpLiBWT0JzIGFuZCBub3JtYWwgRFZEcyBzaG91bGQgbm93IHdvcmsuCisJICBBZGQgYSBtcGVnMi1vbmx5IHBhZCB3aXRoIGhpZ2ggcmFuayBzbyB0aGlzIGdldCBhdXRvcGx1Z2dlZCBmb3IKKwkgIE1QRUctMiBtb3ZpZXMuCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguYzogKGdzdF9tcGVnX2RlbXV4X2Jhc2VfaW5pdCksCisJKGdzdF9tcGVnX2RlbXV4X2NsYXNzX2luaXQpLCAoZ3N0X21wZWdfZGVtdXhfaW5pdCksCisJKGdzdF9tcGVnX2RlbXV4X25ld19vdXRwdXRfcGFkKSwgKGdzdF9tcGVnX2RlbXV4X2dldF92aWRlb19zdHJlYW0pLAorCShnc3RfbXBlZ19kZW11eF9nZXRfYXVkaW9fc3RyZWFtKSwKKwkoZ3N0X21wZWdfZGVtdXhfZ2V0X3ByaXZhdGVfc3RyZWFtKSwgKGdzdF9tcGVnX2RlbXV4X3BhcnNlX3BhY2tldCksCisJKGdzdF9tcGVnX2RlbXV4X3BhcnNlX3BlcyksIChnc3RfbXBlZ19kZW11eF9wbHVnaW5faW5pdCk6CisJICBVc2UgdGhpcyBhcyBzZWNvbmQgcmFuayBmb3IgTVBFRy0xIGFuZCBNUEVHLTIuIFN0aWxsIHVzZSB0aGlzIGZvcgorCSAgTVBFRy0xIGJ1dCB1c2UgZHZkZGVtdXggZm9yIE1QRUctMi4KKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYXJzZS5jOiAoZ3N0X21wZWdfcGFyc2VfY2xhc3NfaW5pdCksCisJKGdzdF9tcGVnX3BhcnNlX2luaXQpLCAoZ3N0X21wZWdfcGFyc2VfbmV3X3BhZCksCisJKGdzdF9tcGVnX3BhcnNlX3BhcnNlX3BhY2toZWFkKToKKwkgIFRpbWluZy4gT25seSBhZGQgcGFkIHRlbXBsYXRlIGlmIGl0IGV4aXN0cy4gQWRkIHNpbmsgdGVtcGxhdGUgZnJvbQorCSAgY2xhc3MgYW5kIG5vdCBmcm9tIG91cnNlbHZlcy4gVGhpcyBtZWFucyB3ZSB3aWxsIGFsd2F5cyB1c2UgdGhlCisJICBjb3JyZWN0IHNpbmsgdGVtcGxhdGUgZXZlbiBpZiBpdCBpcyBub3QgdGhlIG9uZSBkZWZpbmVkIGluIHRoaXMKKwkgIGZpbGUuCisKKzIwMDQtMDktMjkgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguYzogKGdzdF9tcGVnX2RlbXV4X3BhcnNlX3BhY2tldCksCisJKGdzdF9tcGVnX2RlbXV4X3BhcnNlX3Blcyk6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVncGFyc2UuYzogKGdzdF9tcGVnX3BhcnNlX3BhcnNlX3BhY2toZWFkKToKKwlGaXggcGxheWJhY2sgb2YgbXBlZyBhZ2FpbiwgdGltZXN0YW1wcyB3aGVyZSBzY3Jld2VkIHVwIGJ5CisJcGF0Y2ggMS42MS4KKworMjAwNC0wOS0yOSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNkZWNfc3JjX3F1ZXJ5KToKKwkgIE9ubHkgcmV0dXJuIHRydWUgaWYgd2UgYWN0dWFsbHkgZmlsbGVkIHNvbWV0aGluZyBpbi4gUHJldmVudHMKKwkgIHBsYXllciBhcHBsaWNhdGlvbnMgZnJvbSBzaG93aW5nIGEgcmFuZG9tIGxlbmd0aCBmb3IgZmxhYyBmaWxlcy4KKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOiAoZ3N0X3JpZmZfcmVhZF9jbGFzc19pbml0KSwKKwkoZ3N0X3JpZmZfcmVhZF91c2VfZXZlbnQpLCAoZ3N0X3JpZmZfcmVhZF9oYW5kbGVfZXZlbnQpLAorCShnc3RfcmlmZl9yZWFkX3NlZWspLCAoZ3N0X3JpZmZfcmVhZF9za2lwKSwgKGdzdF9yaWZmX3JlYWRfc3RyaCksCisJKGdzdF9yaWZmX3JlYWRfc3RyZl92aWRzX3dpdGhfZGF0YSksCisJKGdzdF9yaWZmX3JlYWRfc3RyZl9hdWRzX3dpdGhfZGF0YSksIChnc3RfcmlmZl9yZWFkX3N0cmZfaWF2cyk6CisJICBPSywgb2ssIHNvIEkgaW1wbGVtZW50ZWQgZXZlbnQgaGFuZGxpbmcuIEFwcGFyZW50bHkgaXQncyBub3JtYWwKKwkgIHRoYXQgd2UgcmVjZWl2ZSByYW5kb20gZXZlbnRzIGF0IHJhbmRvbSBwb2ludHMgd2l0aG91dCBhc2tpbmcKKwkgIGZvciBpdC4KKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfcmVzZXQpLAorCShnc3RfYXZpX2RlbXV4X3NyY19jb252ZXJ0KSwgKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksCisJKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19ldmVudCksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksCisJKGdzdF9hdmlfZGVtdXhfc3luYyksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9zY2FuKSwKKwkoZ3N0X2F2aV9kZW11eF9tYXNzYWdlX2luZGV4KSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlciksCisJKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWspLCAoZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkpLAorCShnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKSwgKGdzdF9hdmlfZGVtdXhfbG9vcCk6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBJbXBsZW1lbnQgbm9uLWxpbmVhaXIgY2h1bmsgaGFuZGxpbmcgYW5kIHN1YmNodW5rIHByb2Nlc3NpbmcuCisJICBUaGUgZmlyc3Qgc29sdmVzIHBsYXliYWNrIG9mIEFWSSBmaWxlcyB3aGVyZSB0aGUgYXVkaW8gYW5kIHZpZGVvCisJICBkYXRhIG9mIGluZGl2aWR1YWwgYnVmZmVycyB0aGF0IHdlIHJlYWQgYXJlIG5vdCBzeW5jaHJvbml6ZWQuCisJICBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGFjY29yZGluZyB0byB0aGUgd29uZGVyZnVsIEFWSSBzcGVjcywgYnV0CisJICBvZiBjb3Vyc2UgaXQgZG9lcyBoYXBwZW4gaW4gcmVhbGl0eS4gSXQgaXMgYWxzbyBhIHByZXJlcXVpc2l0ZSBmb3IKKwkgIHRoZSBzZWNvbmQuIFN1YmNodW5rIHByb2Nlc3NpbmcgYWxsb3dzIHVzIHRvIGN1dCBjaHVua3MgaW4gc21hbGwKKwkgIHBpZWNlcyBhbmQgcHJvY2VzcyBlYWNoIG9mIHRoZXNlIHBpZWNlcyBzZXBhcmF0ZWx5LiBUaGlzIGlzCisJICByZXF1aXJlZCBiZWNhdXNlIEkndmUgc2VlbiBzZXZlcmFsIEFWSSBmaWxlcyB3aXRoIGluY3JlZGlibHkgbGFyZ2UKKwkgIGF1ZGlvIGNodW5rcywgZXZlbiBzb21lIGZpbGVzIHdpdGggb25seSBvbmUgYXVkaW8gY2h1bmsgZm9yIHRoZQorCSAgd2hvbGUgZmlsZS4gVGhpcyBhbGxvd3MgZm9yIHByb3BlciBwbGF5YmFjayBpbmNsdWRpbmcgc2Vla2luZy4KKwkgIFRoaXMgcGF0Y2ggaXMgc3VwcG9zZWQgdG8gZml4IGFsbCBBVkkgQS9WIHN5bmMgaXNzdWVzLgorCSogZ3N0L2ZseC9nc3RmbHhkZWMuYzogKGdzdF9mbHhkZWNfY2xhc3NfaW5pdCksCisJKGZseF9kZWNvZGVfY2h1bmtzKSwgKGZseF9kZWNvZGVfY29sb3IpLCAoZ3N0X2ZseGRlY19sb29wKToKKwkgIFdvcmsuCisJKiBnc3QvbW9kcGx1Zy9nc3Rtb2RwbHVnLmNjOgorCSAgUHJvcGVyIHJldHVybiB2YWx1ZSBzZXR0aW5nIGZvciB0aGUgcXVlcnkoKSBmdW5jdGlvbi4KKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAoc2V0dXBfc291cmNlKToKKwkgIEJlaW5nIGluIG5vbi1wbGF5aW5nIHN0YXRlIChhZnRlciwgZS5nLiwgRU9TKSBpcyBub3QgbmVjZXNzYXJpbHkKKwkgIGEgYmFkIHRoaW5nLiBBbGxvdyBmb3IgdGhhdC4gVGhpcyBmaXhlcyBwbGF5YmFjayBvZiBzaG9ydCBmaWxlcy4KKwkgIFRoZXkgZG9uJ3QgYWN0dWFsbHkgcGxheWJhY2sgZnVsbHkgbm93LCBiZWNhdXNlIHRoZSBjbG9jayBhbHJlYWR5CisJICBydW5zLiBUaGlzIG1lYW5zIHRoYXQgc21hbGwgZmlsZXMgKDw1MDBrQikgd2l0aCBhIHNtYWxsIGxlbmd0aAorCSAgKDwyc2VjKSB3aWxsIHN0aWxsIG5vdCBvciBiYXJlbHkgcGxheS4gT3RoZXIgZmlsZXMsIHN1Y2ggYXMgbW9kCisJICBvciBmbHgsIHdpbGwgd29yayBjb3JyZWN0bHksIGhvd2V2ZXIuCisKKzIwMDQtMDktMjggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvc3BlZXgvZ3N0c3BlZXguYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiAoZ3N0X3NwZWV4X2RlY19iYXNlX2luaXQpLAorCShnc3Rfc3BlZXhfZGVjX2NsYXNzX2luaXQpLCAoc3BlZXhfZGVjX2dldF9mb3JtYXRzKSwKKwkoc3BlZXhfZ2V0X2V2ZW50X21hc2tzKSwgKHNwZWV4X2dldF9xdWVyeV90eXBlcyksCisJKGdzdF9zcGVleF9kZWNfaW5pdCksIChzcGVleF9kZWNfY29udmVydCksIChzcGVleF9kZWNfc3JjX3F1ZXJ5KSwKKwkoc3BlZXhfZGVjX3NyY19ldmVudCksIChzcGVleF9kZWNfZXZlbnQpLCAoc3BlZXhfZGVjX2NoYWluKSwKKwkoZ3N0X3NwZWV4ZGVjX2dldF9wcm9wZXJ0eSksIChnc3Rfc3BlZXhkZWNfc2V0X3Byb3BlcnR5KSwKKwkoc3BlZXhfZGVjX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuaDoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiAoZ3N0X3NwZWV4ZW5jX2dldF9mb3JtYXRzKSwKKwkoZ3N0X3NwZWV4ZW5jX2dldF90eXBlKSwgKHNwZWV4X2NhcHNfZmFjdG9yeSksIChyYXdfY2Fwc19mYWN0b3J5KSwKKwkoZ3N0X3NwZWV4ZW5jX2Jhc2VfaW5pdCksIChnc3Rfc3BlZXhlbmNfY2xhc3NfaW5pdCksCisJKGdzdF9zcGVleGVuY19zaW5rY29ubmVjdCksIChnc3Rfc3BlZXhlbmNfY29udmVydF9zcmMpLAorCShnc3Rfc3BlZXhlbmNfY29udmVydF9zaW5rKSwgKGdzdF9zcGVleGVuY19nZXRfcXVlcnlfdHlwZXMpLAorCShnc3Rfc3BlZXhlbmNfc3JjX3F1ZXJ5KSwgKGdzdF9zcGVleGVuY19pbml0KSwKKwkoZ3N0X3NwZWV4ZW5jX2dldF90YWdfdmFsdWUpLCAoY29tbWVudF9pbml0KSwgKGNvbW1lbnRfYWRkKSwKKwkoZ3N0X3NwZWV4ZW5jX21ldGFkYXRhX3NldDEpLCAoZ3N0X3NwZWV4ZW5jX3NldF9tZXRhZGF0YSksCisJKGdzdF9zcGVleGVuY19zZXR1cCksIChnc3Rfc3BlZXhlbmNfYnVmZmVyX2Zyb21fZGF0YSksCisJKGdzdF9zcGVleGVuY19wdXNoX2J1ZmZlciksIChnc3Rfc3BlZXhlbmNfc2V0X2hlYWRlcl9vbl9jYXBzKSwKKwkoZ3N0X3NwZWV4ZW5jX2NoYWluKSwgKGdzdF9zcGVleGVuY19nZXRfcHJvcGVydHkpLAorCShnc3Rfc3BlZXhlbmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9zcGVleGVuY19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmg6CisJUmV3cm90ZSBzcGVleCBlbmNvZGVyLCBtYWtlIHN1cmUgaXQgY2FuIGJlIGVtYmVkZGVkIGluIG9nZy4KKwlJbXBsZW1lbnRlZCBzcGVleCBkZWNvZGVyLgorCisyMDA0LTA5LTI4ICBDaHJpc3RpYW4gU2NoYWxsZXIgPGNocmlzdGlhbkBmbHVlbmRvLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCVJlbW92ZSBraW9zbGF2ZSBwbHVnaW4uIE1hcmtleSBpcyBicmV3aW5nIGEgbmV3IHdvcmtpbmcgb25lCisJKiBleHQvTWFrZWZpbGUuYW06IFJlbW92ZSBraW9zbGF2ZSBwbHVnaW4KKwkqIGV4dC9raW86IHJlbW92ZQorCSogZ3N0LXBsdWdpbnMuc3BlYy5pbjogcmVtb3ZlIGtpbyBwbHVnaW4gZnJvbSBzcGVjCisKKzIwMDQtMDktMjcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6IChnc3RfbXVsdGlmZHNpbmtfYWRkKSwKKwkoZ3N0X211bHRpZmRzaW5rX3JlbW92ZSksIChnc3RfbXVsdGlmZHNpbmtfcmVtb3ZlX2NsaWVudF9saW5rKSwKKwkoaXNfc3luY19mcmFtZSksIChnc3RfbXVsdGlmZHNpbmtfY2xpZW50X3F1ZXVlX2J1ZmZlciksCisJKGdzdF9tdWx0aWZkc2lua19uZXdfY2xpZW50KSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfd3JpdGUpLAorCShnc3RfbXVsdGlmZHNpbmtfcmVjb3Zlcl9jbGllbnQpLCAoZ3N0X211bHRpZmRzaW5rX3F1ZXVlX2J1ZmZlciksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50cyk6CisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmg6CisJTWFrZSBzeW5jaW5nIHRvIGtleWZyYW1lcyBhY3R1YWxseSB3b3JrIGZvciBuZXcgY2xpZW50cyBhbmQgbGFnZ2luZworCWNsaWVudHMuCisKKzIwMDQtMDktMjYgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0L2RlYnVnL2dzdG5hdmlnYXRpb250ZXN0LmM6IChnc3RfbmF2aWdhdGlvbnRlc3RfY2xhc3NfaW5pdCksCisJKGdzdF9uYXZpZ2F0aW9udGVzdF9oYW5kbGVfc3JjX2V2ZW50KSwgKGRyYXdfYm94X3BsYW5hcjQxMSksCisJKGdzdF9uYXZpZ2F0aW9udGVzdF9wbGFuYXI0MTEpLCAoZ3N0X25hdmlnYXRpb250ZXN0X2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvZGVidWcvZ3N0bmF2aWdhdGlvbnRlc3QuaDoKKwkgIG1ha2UgbmF2aWdhdGlvbnRlc3QgZGlzcGxheSBidXR0b24tcHJlc3MgYW5kIGJ1dHRvbi1yZWxlYXNlIGV2ZW50cworCisyMDA0LTA5LTI2IElhaW4gPGlhaW5nbm9tZUBnbWFpbC5jb20+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYyAoYWxsX2NoYW5uZWxzX25ld19tZWRpYSk6IENoZWNrcyBpZiBhbGwKKwl0aGUgY2hhbm5lbHMgaGF2ZSByZWNlaXZlZCBhIG5ldyBtZWRpYSBldmVudC4KKwkoaW50ZXJsZWF2ZV9idWZmZXJlZF9sb29wKTogQ29tcHJlc3NlcyBhIG5ldyBtZWRpYSBldmVudCBvbiBhbGwKKwljaGFubmVscyBpbnRvIG9uZS4KKworMjAwNC0wOS0yNiBJYWluIDxpYWluZ25vbWVAZ21haWwuY29tPgorCisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jIChnc3Rfd2F2ZW5jX2NoYWluKTogQ29tcGFueSBzYXlzIHdlIG5lZWQgdG8KKwljYWxsIHRoZSBzaW5rcGFkJ3MgZGVmYXVsdCBldmVudCBoYW5kbGVyIGFuZCBub3QgdGhlIHNyY3BhZHMuIEhlIGFsc28KKwlzYXlzIHRoaXMgaXMgY29uZnVzaW5nIDopCisJKGdzdF93YXZlbmNfc3RvcF9maWxlKTogQ29tcGFueSBzYXlzIHRoYXQgc2VlayBldmVudHMgb25seSBnbyB1cHN0cmVhbQorCXdlIHNob3VsZCBzZW5kIGEgZGlzY29udGludW91cyBkb3duc3RyZWFtIGluc3RlYWQuCisKKzIwMDQtMDktMjUgIENocmlzdGlhbiBTY2hhbGxlciA8Y2hyaXN0aWFuQGZsdWVuZG8uY29tPgorCisJKiBVcGRhdGUgU1BFQyBmaWxlIHRvIGJlIHVzYWJsZSBpbiBjb25qdW5jdGlvbiB3aXRoIEZlZG9yYSBDb3JlLAorCSAgRmVkb3JhLnVzIGFuZCBmcmVzaHJwbXMgcGFja2FnZXMKKwkqIEZpeCB0eXBvIGluIG11bHRpZmlsZXNyYyB0ZXN0IE1ha2VmaWxlCisKKzIwMDQtMDktMjQgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKG5ld19kZWNvZGVkX3BhZCk6CisJT25seSBzaWduYWwgdGhlIG5vX21vcmVfcGFkcyBzaWduYWwgd2hlbiB3ZSBoYXZlCisJYWRkZWQgdGhlIHN0cmVhbSB0byBvdXIgbGlzdC4KKworMjAwNC0wOS0yNCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAocmVtb3ZlX3ByZXJvbGxzKSwKKwkobmV3X2RlY29kZWRfcGFkKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5oOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKHNldHVwX3NpbmtzKToKKwlEb24ndCB0cnkgdG8gcHJlcm9sbCBvciBkZWNvZGUgbW9yZSB0aGFuIG9uZSBhdWRpby92aWRlbworCXRyYWNrLgorCisyMDA0LTA5LTI0ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdzdF9wbGF5X2Jhc2VfYmluX2NoYW5nZV9zdGF0ZSk6CisJICBUaHJvdyBlcnJvciBpZiB3ZSBmYWlsZWQgdG8gZmluZCBhIHN1aXRhYmxlIG91dHB1dC4gVGhpcyBzaG91bGQKKwkgIHRocm93IGFuIGVycm9yIGlmIHdlIHN1Y2Nlc3NmdWxseSBzZXQgdXAgYSBwaXBlbGluZSAoZS5nLiBiZWNhdXNlCisJICB3ZSByZWNvZ25pemVkIGEgbWVkaWEgZmlsZSkgYnV0IGZvdW5kIG5vIGRlY29kYWJsZSBzdHJlYW1zIGluIGl0CisJICAoZS5nLiBiZWNhdXNlIGl0IGNvbnRhaW5zIG9ubHkgbWVkaWEgc3RyZWFtIHR5cGVzIGZvciB3aGljaCB3ZQorCSAgaGF2ZSBubyBkZWNvZGVycywgb3IgYmVjYXVzZSBpdCdzIG5vdCBhIG1lZGlhIHR5cGUpLgorCisyMDA0LTA5LTIzICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZGlyYWMvTWFrZWZpbGUuYW06CisJKiBleHQvZGlyYWMvZ3N0ZGlyYWMuY2M6CisJKiBleHQvZGlyYWMvZ3N0ZGlyYWNkZWMuY2M6CisJKiBleHQvZGlyYWMvZ3N0ZGlyYWNkZWMuaDoKKwkgIERvIHNvbWV0aGluZy4gRG9uJ3QgYWN0dWFsbHkga25vdyBpZiB0aGlzIHdvcmtzIGJlY2F1c2UgSSBkb24ndAorCSAgaGF2ZSBhIGRlbXV4ZXIgeWV0LgorCSogZXh0L2dzbS9nc3Rnc21kZWMuYzogKGdzdF9nc21kZWNfZ2V0Y2Fwcyk6CisJICBBZGQgY2hhbm5lbHM9MSB0byBjYXBzIHJldHVybmVkIGZyb20gX2dldGNhcHMoKS4KKwkqIGV4dC9vZ2cvZ3N0b2dtcGFyc2UuYzogKGdzdF9vZ21fYXVkaW9fcGFyc2VfZ2V0X3R5cGUpLAorCShnc3Rfb2dtX3ZpZGVvX3BhcnNlX2dldF90eXBlKSwgKGdzdF9vZ21fYXVkaW9fcGFyc2VfYmFzZV9pbml0KSwKKwkoZ3N0X29nbV92aWRlb19wYXJzZV9iYXNlX2luaXQpLCAoZ3N0X29nbV9wYXJzZV9pbml0KSwKKwkoZ3N0X29nbV9hdWRpb19wYXJzZV9pbml0KSwgKGdzdF9vZ21fdmlkZW9fcGFyc2VfaW5pdCksCisJKGdzdF9vZ21fcGFyc2Vfc2lua19jb252ZXJ0KSwgKGdzdF9vZ21fcGFyc2VfY2hhaW4pLAorCShnc3Rfb2dtX3BhcnNlX2NoYW5nZV9zdGF0ZSk6CisJICBTZXBhcmF0ZSBiZXR3ZWVuIGF1ZGlvL3ZpZGVvIHNvIG9nbWF1ZGlvcGFyc2UgYWN0dWFsbHkgdXNlcyB0aGUKKwkgIGF1ZGlvIHBhZCB0ZW1wbGF0ZXMuIEJvdGggYXVkaW8gYW5kIHZpZGVvIHdvcmsgbm93LCBpbmNsdWRpbmcKKwkgIGF1dG9wbHVnZ2luZy4gQWxzbyB1c2Ugc29tZXRpbWVzLXNyY3BhZCBoYWNrLgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9yZWFkX3NlZWspOgorCSAgSGFuZGxlIGV2ZW50cyBiZXR0ZXIuIERvbid0IGhhbmcgb24gaW5maW5pdGUgbG9vcHMuCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2NsYXNzX2luaXQpLAorCShnc3RfYXZpX2RlbXV4X2luaXQpLCAoZ3N0X2F2aV9kZW11eF9yZXNldCksCisJKGdzdF9hdmlfZGVtdXhfc3JjX2NvbnZlcnQpLCAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwKKwkoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyKSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2RhdGEpLAorCShnc3RfYXZpX2RlbXV4X2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBJbXByb3ZlIEEvViBzeW5jLiBTdGlsbCBub3QgcGVyZmVjdC4KKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogKGdzdF9lYm1sX3JlYWRfc2VlayksCisJKGdzdF9lYm1sX3JlYWRfc2tpcCk6CisJICBIYW5kbGUgZXZlbnRzIGJldHRlci4KKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2hhbmRsZV9zaW5rX2V2ZW50KSwKKwkoZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpLCAocXRkZW11eF9wYXJzZV90cmFrKSwKKwkocXRkZW11eF9hdWRpb19jYXBzKToKKwkgIEFkZCBJTUE0LiBJbXByb3ZlIGV2ZW50IGhhbmRsaW5nLiBTYXZlIG9mZnNldCBhZnRlciBhIHNlZWsgd2hlbgorCSAgdGhlIGhlYWRlcnMgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgc28gdGhhdCB3ZSBkb24ndCBlbmQgdXAgaW4KKwkgIGFuIGluZmluaXRlIGxvb3AuCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKHF0X3R5cGVfZmluZCk6CisJICBBZGQgbG93LXByaW9yaXR5IHR5cGVmaW5kIHN1cHBvcnQgZm9yIGZpbGVzIHdpdGggbm8gbGVuZ3RoLgorCisyMDA0LTA5LTIzICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIHRlc3RzdWl0ZS9tdWx0aWZpbGVzaW5rL01ha2VmaWxlLmFtOgorCWZpeCB0eXBvCisKKzIwMDQtMDktMjIgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua194aW1hZ2VfZGVzdHJveSk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2NoZWNrX3hzaG1fY2FsbHMpOiBGaXgKKwltaXN0YWtlcyBmcm9tIHRoYXl0YW4ncyBwYXRjaGVzLgorCisyMDA0LTA5LTIzICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeGltYWdlX2Rlc3Ryb3kpOgorCSAgRm9yIGNvbXBsZXRlbmVzcywgWFN5bmMgaW4gdGhlIGRlc3Ryb3kgZnVuY3Rpb24gYXMgeHZpbWFnZSBkb2VzLgorCisyMDA0LTA5LTIzICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmM6IChnc3RfcGl4YnVmc2NhbGVfZ2V0Y2Fwcyk6CisJICAgQ29ycmVjdCBjYXBzIG5lZ290aWF0aW9uCisJKiBnc3Qvdm9sdW1lL2dzdHZvbHVtZS5jOiAodm9sdW1lX2NoYWluX2Zsb2F0KSwKKwkodm9sdW1lX2NoYWluX2ludDE2KToKKwkgICBNb2RpZnkgZGVidWcgb3V0cHV0IHRvIGJlIGxpdHRsZSBtb3JlIGluZm9ybWF0aXZlCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2NoZWNrX3hzaG1fY2FsbHMpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19jaGVja194c2htX2NhbGxzKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3h2aW1hZ2VfZGVzdHJveSk6CisJICBBZGQgWFN5bmMgY2FsbHMgYWZ0ZXIgZGV0YWNoaW5nIGZyb20gdGhlIHNoYXJlZCBtZW1vcnkgc2VnbWVudCB0bworCSAgYXZvaWQgYSBjcmFzaC4KKworMjAwNC0wOS0yMiAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBleHQvb2dnL2dzdG9nZ211eC5jOiAoZ3N0X29nZ19tdXhfaW5pdCksCisJKGdzdF9vZ2dfbXV4X25leHRfYnVmZmVyKSwgKGdzdF9vZ2dfbXV4X2xvb3ApOgorCSogZXh0L3ZvcmJpcy92b3JiaXMuYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmM6IChnc3Rfdm9yYmlzZW5jX2luaXQpLAorCShnc3Rfdm9yYmlzZW5jX2NoYWluKToKKwkqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmg6CisJcmVtb3ZlIGV4cGxpY2l0IG5ld21lZGlhIHN1cHBvcnQgZnJvbSBvZ2dtdXggYW5kIHZvcmJpc2VuYworCWFkZCBkZWJ1ZyBjYXRlZ29yeSB0byB2b3JiaXNlbmMKKwkqIGdzdC9tdWx0aWZpbGVzaW5rL2dzdG11bHRpZmlsZXNpbmsuYzoKKwkoZ3N0X211bHRpZmlsZXNpbmtfY2xhc3NfaW5pdCksIChnc3RfbXVsdGlmaWxlc2lua19pbml0KSwKKwkoZ3N0X211bHRpZmlsZXNpbmtfZGlzcG9zZSksIChnc3RfbXVsdGlmaWxlc2lua19zZXRfbG9jYXRpb24pLAorCShnc3RfbXVsdGlmaWxlc2lua19zZXRfcHJvcGVydHkpLCAoZ3N0X211bHRpZmlsZXNpbmtfbmV4dF9maWxlKSwKKwkoZ3N0X211bHRpZmlsZXNpbmtfaGFuZGxlX2V2ZW50KSwgKGdzdF9tdWx0aWZpbGVzaW5rX2NoYWluKSwKKwkocGx1Z2luX2luaXQpOgorCSogZ3N0L211bHRpZmlsZXNpbmsvZ3N0bXVsdGlmaWxlc2luay5oOgorCWFkZCBzdXBwb3J0IGZvciBzdHJlYW1oZWFkZXIgaW4gbXVsdGlmaWxlc2luaworCisyMDA0LTA5LTIyICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKF9yZWFkX3Zhcl9sZW5ndGgpLCAoX3JlYWRfZ3VpZCksCisJKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19zZWdtZW50KSwgKGdzdF9hc2ZfZGVtdXhfaGFuZGxlX2RhdGEpLAorCShnc3RfYXNmX2RlbXV4X3Byb2Nlc3NfY2h1bmspLCAoZ3N0X2FzZl9kZW11eF9oYW5kbGVfc2lua19ldmVudCk6CisJICBQcmV2ZW50IGluZmluaXRlIGxvb3BzLiBNb3JlIGNvcnJlY3QgZXJyb3IgcmVwb3J0aW5nLgorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiAoZ3N0X2F1cGFyc2VfY2hhaW4pOgorCSAgRXJyb3Igb3V0IGlmIG5lZ290aWF0aW9uIGZhaWxzLgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChzZXR1cF9zb3VyY2UpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3BsYXlfYmFzZV9iaW5fZXJyb3IpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9mb3VuZF90YWcpOgorCSAgRXJyb3IvdGFnIGZvcndhcmRpbmcuIFByZS1yb2xsIGZpeGVzIGZvciBzb3VyY2UgZXJyb3JzIG9uIHN0YXRlCisJICBjaGFuZ2VzIChlLmcuICJmaWxlIGRvZXMgbm90IGV4aXN0IikgdG8gcHJldmVudCBoYW5ncy4KKworMjAwNC0wOS0yMSAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiB0ZXN0c3VpdGUvbXVsdGlmaWxlc2luay9NYWtlZmlsZS5hbToKKwkqIHRlc3RzdWl0ZS9tdWx0aWZpbGVzaW5rL2xhbWVfdGVzdC5jOiAoZ3N0X25ld21lZGlhX2Jhc2VfaW5pdCksCisJKGdzdF9uZXdtZWRpYV9jbGFzc19pbml0KSwgKGdzdF9uZXdtZWRpYV9pbml0KSwKKwkoZ3N0X25ld21lZGlhX2NoYWluKSwgKGdzdF9uZXdtZWRpYV90cmlnZ2VyKSwgKHRlc3RfZm9ybWF0KSwKKwkobmV3ZmlsZV9zaWduYWwpLCAodGVzdF9zaWduYWwpLCAobWFpbik6CisJKiB0ZXN0c3VpdGUvbXVsdGlmaWxlc2luay9tdWx0aWZpbGVzcmNfdGVzdC5jOiAobWFpbik6CisJKiB0ZXN0c3VpdGUvbXVsdGlmaWxlc2luay9vZ2d0aGVvcmFfdGVzdC5jOgorCShnc3RfbmV3bWVkaWFfYmFzZV9pbml0KSwgKGdzdF9uZXdtZWRpYV9jbGFzc19pbml0KSwKKwkoZ3N0X25ld21lZGlhX2luaXQpLCAoZ3N0X25ld21lZGlhX2NoYWluKSwgKGdzdF9uZXdtZWRpYV90cmlnZ2VyKSwKKwkodGVzdF9mb3JtYXQpLCAobmV3ZmlsZV9zaWduYWwpLCAodGVzdF9zaWduYWwpLCAobWFpbik6CisJKiB0ZXN0c3VpdGUvbXVsdGlmaWxlc2luay9vZ2d2b3JiaXNfdGVzdC5jOgorCShnc3RfbmV3bWVkaWFfYmFzZV9pbml0KSwgKGdzdF9uZXdtZWRpYV9jbGFzc19pbml0KSwKKwkoZ3N0X25ld21lZGlhX2luaXQpLCAoZ3N0X25ld21lZGlhX2NoYWluKSwgKGdzdF9uZXdtZWRpYV90cmlnZ2VyKSwKKwkodGVzdF9mb3JtYXQpLCAobmV3ZmlsZV9zaWduYWwpLCAodGVzdF9zaWduYWwpLCAobWFpbik6CisJKiB0ZXN0c3VpdGUvbXVsdGlmaWxlc2luay93YXZlbmNfdGVzdC5jOiAoZ3N0X25ld21lZGlhX2Jhc2VfaW5pdCksCisJKGdzdF9uZXdtZWRpYV9jbGFzc19pbml0KSwgKGdzdF9uZXdtZWRpYV9pbml0KSwKKwkoZ3N0X25ld21lZGlhX2NoYWluKSwgKGdzdF9uZXdtZWRpYV90cmlnZ2VyKSwgKHRlc3RfZm9ybWF0KSwKKwkobmV3ZmlsZV9zaWduYWwpLCAodGVzdF9zaWduYWwpLCAobWFpbik6CisJTmV3IG1lZGlhIHRlc3RzCisKKzIwMDQtMDktMjAgIENocmlzdGlhbiBTY2hhbGxlciA8Y2hyaXN0aWFuQGZsdWVuZG8uY29tPgorCisJKiBGaXggbWlrbW9kIGxpY2Vuc2UgdG8gTEdQTCBhcyB0aGV5IGhhdmUgcmVsaWNlbnNlZAorCSogTW92ZSBEaXJhYyBhbmQgRWZmZWN0diBpbnRvIExHUEwgc2VjdGlvbiBvZiBSRUFETUVfbGljZW5zZQorCisyMDA0LTA5LTIwICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9jaGVja19jYXBzX3Jlc2V0KSwKKwkoZ3N0X21hZF9jaGFuZ2Vfc3RhdGUpOgorCSAgQWxsb3cgZm9yIG1wMyByYXRlL2NoYW5uZWxzIGNoYW5nZXMuIEhvd2V2ZXIsIG9ubHkgdmVyeQorCSAgY29uc2VydmF0aXZlbHkuIFJlYXNvbiB0aGF0IHdlICpoYXZlKiB0byBlbmFibGUgdGhpcyBpcyBzbWlwbHkKKwkgIGJlY2F1c2UgdGhlIG1hZCBmaW5kX3N5bmMoKSBmdW5jdGlvbiBpcyBub3QgZ29vZCBlbm91Z2gsIGl0IHdpbGwKKwkgIHJlZ3VsYXJseSBzeW5jIG9uIHJhbmRvbSBkYXRhIGFzIHZhbGlkIGZyYW1lcyBhbmQgdGhlcmVmb3JlIG1ha2UKKwkgIHVzIHByb3ZpZGUgcmFuZG9tIGNhcHMgYXMgKmZpbmFsKiBjYXBzIG9mIHRoZSBzdHJlYW0uIFRoZSBiZXN0IGZpeAorCSAgSSBjb3VsZCB0aGluayBvZiBpcyB0byBzaW1wbHkgcmVxdWlyZSBzZXZlcmFsIG9mIHRoZSBzYW1lIHN0cmVhbQorCSAgY2hhbmdlcyBpbiBhIHJvdyBiZWZvcmUgd2UgY2hhbmdlIGNhcHMuCisJICBUaGUgYWN0dWFsIHRlc3RjYXNlIHRoYXQgd29ya3Mgbm93IGlzICMKKwkqIGV4dC9vZ2cvTWFrZWZpbGUuYW06CisJKiBleHQvb2dnL2dzdG9nZy5jOiAocGx1Z2luX2luaXQpOgorCSogZXh0L29nZy9nc3RvZ21wYXJzZS5jOgorCSAgT0dNIHN1cHBvcnQgKHZpZGVvIG9ubHkgZm9yIG5vdzsgSSBuZWVkIGFuIGF1ZGlvIHNhbXBsZSBmaWxlKS4KKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoZ3N0X2FzZl9kZW11eF9iYXNlX2luaXQpLAorCShnc3RfYXNmX2RlbXV4X3Byb2Nlc3Nfc3RyZWFtKSwgKGdzdF9hc2ZfZGVtdXhfdmlkZW9fY2FwcyksCisJKGdzdF9hc2ZfZGVtdXhfYWRkX3ZpZGVvX3N0cmVhbSk6CisJICBXTVYgZXh0cmFkYXRhLgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6ICh1bmtub3duX3R5cGUpOgorCSAgRG9uJ3QgZXJyb3Igb3V0IG9uIHNpbmdsZSB1bmtub3duLXR5cGVzIGFmdGVyIGFsbC4gSXQncyB3cm9uZy4KKwkgIElmIHdlIGZvdW5kIHR5cGUgb2YgdmlkZW8gYW5kIGF1ZGlvIGJ1dCBub3Qgb2YgYSBzdWJ0aXRsZSBzdHJlYW0sCisJICBpdCB3aWxsIHN0aWxsIGVycm9yIG91dCAod2hpY2ggaXMgdW53YW50ZWQpLiBXaWxsIGZpbmQgYSBiZXR0ZXIgZml4CisJICBsYXRlciBvbi4KKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAob2dtdmlkZW9fdHlwZV9maW5kKSwKKwkob2dtYXVkaW9fdHlwZV9maW5kKSwgKHBsdWdpbl9pbml0KToKKwkgIE9HTSBzdXBwb3J0LgorCisyMDA0LTA5LTIwICBKb2hhbiBEYWhsaW4gIDxqb2hhbkBnbm9tZS5vcmc+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYyAoZ3N0X2pwZWdkZWNfY2hhaW4pOiBBbGxvY2F0ZSB0aGUgYnVmZmVyCisJYWZ0ZXIgc2V0dGluZyBjYXBzLgorCisyMDA0LTA5LTE5ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX2luaXQpLCAoZ3N0X3dhdmVuY19jaGFpbik6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5oOgorCUFkZGVkIG5ld21lZGlhIHN1cHBvcnQgdG8gd2F2ZW5jCisKKzIwMDQtMDktMTcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL2dzdGZkc2V0LmM6IChnc3RfZmRzZXRfZmRfaGFzX2Nsb3NlZCksCisJKGdzdF9mZHNldF9mZF9oYXNfZXJyb3IpLCAoZ3N0X2Zkc2V0X2ZkX2Nhbl9yZWFkKSwKKwkoZ3N0X2Zkc2V0X2ZkX2Nhbl93cml0ZSksIChnc3RfZmRzZXRfd2FpdCk6CisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6IChnc3RfY2xpZW50X3N0YXR1c19nZXRfdHlwZSksCisJKGdzdF9tdWx0aWZkc2lua19pbml0KSwgKGdzdF9tdWx0aWZkc2lua19hZGQpLAorCShnc3RfbXVsdGlmZHNpbmtfcmVtb3ZlKSwgKGdzdF9tdWx0aWZkc2lua19nZXRfc3RhdHMpLAorCShnc3RfbXVsdGlmZHNpbmtfcmVtb3ZlX2NsaWVudF9saW5rKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9xdWV1ZV9idWZmZXIpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF93cml0ZSksCisJKGdzdF9tdWx0aWZkc2lua19yZWNvdmVyX2NsaWVudCksIChnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudHMpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xvc2UpLCAoZ3N0X211bHRpZmRzaW5rX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmg6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNpbmsuYzogKGdzdF90Y3BzZXJ2ZXJzaW5rX2NsYXNzX2luaXQpLAorCShnc3RfdGNwc2VydmVyc2lua19yZW1vdmVkKToKKwlTbWFsbCBjbGVhbnVwcyBpbiBmZHNldC5jCisJVXNlIGEgaGFzdGFibGUgdG8gbWFwIGZkIHRvIHRoZSBjbGllbnQgc3RydWN0dXJlIGZvciBmYXN0ZXIKKwlsb29rdXAgaW4gX3JlbW92ZSBhbmQgZ2V0X3N0YXRzLgorCUFkZGVkIHZpcnR1YWwgZnVuY3Rpb24gdG8gY2xvc2UgdGhlIGZkcy4KKwlIYW5kbGUgY2xpZW50cyBldmVuIHdoZW4gdGhlIHNlbGVjdC9wb2xsIGNhbGwgd2FzIHVuYmxvY2tlZCBiZWNhdXNlCisJb2YgYSBjb21tYW5kLgorCUltcGxlbWVudCBzeW5jaW5nIHRvIGtleWZyYW1lIGluIHRoZSByZWNvdmVyeSBwcm9jZWR1cmUuCisKKzIwMDQtMDktMTYgSWFpbiA8aWFpbmdub21lQGdtYWlsLmNvbT4KKworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYyAoX2ZpeGF0ZV9jYXBzX3RvX2ludCk6IEZyZWUgdGhlCisJdHJ5IGNhcHMuCisKKzIwMDQtMDktMTUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdGR2ZGRlbXV4LmM6IChnc3RfZHZkX2RlbXV4X2dldF9hdWRpb19zdHJlYW0pOgorCSAgQ2FwcyBhcmUgb25seSBzZXQgaWYgdGhlIHR5cGUgb2YgdGhlIHN0cmVhbSBpcyB1bmtub3duLCBidXQgdGhpcworCSAgaXMgaW5pdGlhbGl6ZWQgaW4gLT5pbml0X3N0cmVhbSgpLCBzbyBzZXQgdG8gVU5LTk9XTiBhZnRlciBjYWxsaW5nCisJICAtPmluaXRfc3RyZWFtKCkgc28gdGhhdCBjYXBzbmVnbyBzdGFydHMuCisKKzIwMDQtMDktMTUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksCisJKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2RhdGEpOgorCSAgSnVzdCBoYXJkY29kZSBmb3IgcmF3IGF1ZGlvIHRoZW4uIEFWSSBhdWRpbyBzdWNrcy4KKworMjAwNC0wOS0xNSAgQXJ3ZWQgdi4gTWVya2F0eiAgPHYubWVya2F0ekBnbXgubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9hdWRpb19jYXBzKToKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGF1ZGlvc2lua190ZW1wbCksCisJKGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX2xpbmspOgorCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6ICh0dGFfY2FwcyksIChwbHVnaW5faW5pdCk6CisJVXNlIGF1ZGlvL3gtdHRhZmlsZSBmb3IgdHRhIGZpbGVzIGFuZCBhdWRpby94LXR0YSBmb3IgcmF3IHR0YSBmcmFtZXMuCisKKzIwMDQtMDktMTUgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksCisJKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2RhdGEpOgorCSAgVHJ5IHRvIGZpeCBhL3Ygc3luYyBpc3N1ZXMuCisKKzIwMDQtMDktMTUgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29uZmlndXJlLmFjOiByZW1vdmUgTkFTTSBjaGVjaywgc2luY2Ugd2UgZG9uJ3QgdXNlIGl0LiAgVXBkYXRlCisJZGlyYWMgY2hlY2sgdG8gMC40CisJKiBleHQvZGlyYWMvZ3N0ZGlyYWNkZWMuY2M6IHVwZGF0ZSB0byBjdXJyZW50IDAuNCBBUEkKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChnc3RfYXVkaW9fY29udmVydF9saW5rKToKKwlJbml0aWFsaXplZCB2YXJpYWJsZXMuCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9jaGFuZ2Vfc3RhdGUpLAorCShnc3RfcXRkZW11eF9sb29wX2hlYWRlciksIChxdGRlbXV4X3BhcnNlKSwgKHF0ZGVtdXhfcGFyc2VfdHJhayksCisJKGdzdF9xdGRlbXV4X2hhbmRsZV9lc2RzKSwgKHF0ZGVtdXhfYXVkaW9fY2Fwcyk6IEZpeCBzZWVraW5nLCBhZGQKKwlTVlEzIGZvcm1hdAorCisyMDA0LTA5LTE1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLAorCShnc3RfYXZpX2RlbXV4X2FkZF9zdHJlYW0pLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSk6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBGaXggZm9yIGNvbXByZXNzZWQgYXVkaW8gKG1wMykgdGltZXN0YW1wIGdlbmVyYXRpb24uIEhvdyBkaWQgdGhpcworCSAgZXZlciB3b3JrPworCisyMDA0LTA5LTE1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJpbi5jOiAoZ3N0X3BsYXlfYmluX2dldF9wcm9wZXJ0eSk6CisJICBWb2x1bWUgaXMgYSBkb3VibGUgbm90IGEgZmxvYXQuCisKKzIwMDQtMDktMTUgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6IChnc3RfbXVsdGlmZHNpbmtfcmVtb3ZlX2NsaWVudF9saW5rKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRzKSwgKGdzdF9tdWx0aWZkc2lua19jaGFuZ2Vfc3RhdGUpOgorCURvbid0IGNsb3NlIHRoZSBmZCBpbiBtdWx0aWZkc2luayBhcyB3ZSBkaWRuJ3Qgb3BlbiBpdCBpbiB0aGUKKwlmaXJzdCBwbGFjZS4gU29tZSBjbGVhbnVwcy4KKworMjAwNC0wOS0xNSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfcGFkX3B1c2gpOgorCSogZXh0L29nZy9nc3RvZ2dtdXguYzogKGdzdF9vZ2dfbXV4X25leHRfYnVmZmVyKSwKKwkoZ3N0X29nZ19tdXhfc2VuZF9oZWFkZXJzKSwgKGdzdF9vZ2dfbXV4X2xvb3ApOgorCUZpeCB0aGUgY2FzZSB3aGVyZSB0aGUgbXV4ZXIgd291bGQgbWFyayBwYWdlcyBhcyBkZWx0YQorCWZyYW1lcyB3aGVuIHRoZXkgYXJlIG5vdCAodm9yYmlzIG9ubHkgb2dnKS4KKworMjAwNC0wOS0xNSAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChzdGF0ZV9jaGFuZ2UpLCAoc2V0dXBfc291cmNlKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fY2hhbmdlX3N0YXRlKToKKwkgIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBmYWlsZWQgdG8gc2V0dXAgYSBjbGVhciBwaXBlbGluZS4gVGhpcworCSAgd2lsbCB0aHJvdyBhbiBlcnJvciAob3IgRU9TLCBhbm90aGVyIG5pY2UgY2FzZSkgYW5kIGlmIHlvdSBkb24ndAorCSAgY2F0Y2ggdGhhdCwgdGhlIGFwcCB3aWxsIHdhaXQgZm9yIHRoZSBzaWduYWwgZm9yZXZlciAoYW5kIHRodXMKKwkgIGhhbmcpLgorCisyMDA0LTA5LTE1ICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzaW5rLmM6CisJKGdzdF9nbm9tZXZmc3NpbmtfdXJpX2dldF9wcm90b2NvbHMpOgorCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc3JjLmM6CisJKGdzdF9nbm9tZXZmc3NyY191cmlfZ2V0X3Byb3RvY29scyk6CisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnN1cmkuYzogKGdzdF9nbm9tZXZmc19nZXRfc3VwcG9ydGVkX3VyaXMpOgorCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzdXJpLmg6CisJICBVc2UgX3VyaV9uZXcoKSBpbnN0ZWFkIG9mIF9vcGVuKCksIHNvIGl0IGRvZXNuJ3QgdGFrZSBhcyBsb25nIGFuZAorCSAgQ2hyaXN0b3BoZSdzIGNvbXB1dGVyIHdvbid0IGhhbmcuCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKHVua25vd25fdHlwZSk6CisJICBUaHJvdyBlcnJvciBvbiB1bmtub3duIG1lZGlhIHR5cGUsIHNvIGFwcHMgYWN0dWFsbHkgZGlzcGxheSBpdC4KKworMjAwNC0wOS0xNCAgQnJpYW4gQ2FtZXJvbiAgPGJyaWFuLmNhbWVyb25Ac3VuLmNvbQorCisJKiB0b29scy9nc3QtbGF1bmNoLWV4dC1tLm06ICBDaGFuZ2VkIH4gdG8gJEVOVntIT01FfSB0byBhbGxvdworCSAgdGhpcyBzY3JpcHQgdG8gd29yayBvbiBTb2xhcmlzIHNpbmNlIGJhc2ggc2hlbGwgaGFuZGxlcyBlY2hvCisJICBkaWZmZXJlbmx5IHRoYW4gYmFzaC4KKworMjAwNC0wOS0xNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOiAocXVldWVfb3ZlcnJ1biksIChub19tb3JlX3BhZHMpLAorCShzZXR1cF9zb3VyY2UpLCAoZ3N0X3BsYXlfYmFzZV9iaW5fc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fYWRkX2VsZW1lbnQpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdzdF9wbGF5X2Jpbl9zZW5kX2V2ZW50KToKKwlTb21lIG1vcmUgd29yayBvbiBtYWtpbmcgc3VyZSBzZWVraW5nIHBhdXNlcyB0aGUgcGlwZWxpbmUgYW5kCisJdGhhdCBjaGFuZ2luZyB0aGUgdXJpIGFjdHVhbGx5IGRvZXMgc29tZXRoaW5nLgorCisyMDA0LTA5LTE3ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9nc3RmZHNldC5jOiAoZ3N0X2Zkc2V0X3dhaXQpOgorCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X211bHRpZmRzaW5rX2Nsb3NlKToKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc2luay5jOiAoZ3N0X3RjcHNlcnZlcnNpbmtfaW5pdF9zZW5kKSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfY2xvc2UpOgorCUJlIGEgYml0IG1vcmUgcGFyYW5vaWQgd2hlbiBmcmVlaW5nIG1lbW9yeS4KKworMjAwNC0wOS0xMyAgUm9uYWxkIFMuIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfYWRkX3N0cmVhbSksCisJKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBEb24ndCBjcmFzaCBieSBkaXZpZGluZyBieSB6ZXJvIChzZWUgc2FtcGxlIG1vdmllIGluICMxMjY5MjIpLgorCisyMDA0LTA5LTEzICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X2F1ZGlvX2NhcHMpOgorCSAgRG9uJ3QgdG91Y2ggbm9uLWV4aXN0aW5nIGRhdGEgKGZpeGVzIGNyYXNoIG9uIGZpbGUgaW4gIzE0MDE0NykuCisKKzIwMDQtMDktMTMgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5jOgorCShnc3RfcGxheV9iYXNlX2Jpbl9kaXNwb3NlKSwgKGdzdF9wbGF5X2Jhc2VfYmluX3NldF9wcm9wZXJ0eSk6CisJICBIYW5kbGUgZG91YmxlIGRpc3Bvc2FscywgYW5kIHByb3BlciBjaGFuZ2Ugb2YgVVJJcy4KKworMjAwNC0wOS0xMyAgTWFydGluIEVpa2VybWFubiA8bWVpa2VyQHVwYi5kZT4KKworCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ3BhcnNlLmM6CisJICBmaXggc3luY2hyb25pc3RhdGlvbiBmb3Igc3RyZWFtcyByZWNvcmRlZCBmcm9tIGRpZ2l0YWwgUENSCisJICBmaXhlcyBidWcgIzExOTM3NgorCisyMDA0LTA5LTEzICBSb25hbGQgUy4gQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZ25vbWV2ZnMvTWFrZWZpbGUuYW06CisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnMuYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3NpbmsuYzogKGdzdF9nbm9tZXZmc3NpbmtfZ2V0X3R5cGUpLAorCShnc3RfZ25vbWV2ZnNzaW5rX2Rpc3Bvc2UpLCAoZ3N0X2dub21ldmZzc2lua19pbml0KSwKKwkoZ3N0X2dub21ldmZzc2lua191cmlfZ2V0X3R5cGUpLAorCShnc3RfZ25vbWV2ZnNzaW5rX3VyaV9nZXRfcHJvdG9jb2xzKSwKKwkoZ3N0X2dub21ldmZzc2lua191cmlfZ2V0X3VyaSksIChnc3RfZ25vbWV2ZnNzaW5rX3VyaV9zZXRfdXJpKSwKKwkoZ3N0X2dub21ldmZzc2lua191cmlfaGFuZGxlcl9pbml0KSwKKwkoZ3N0X2dub21ldmZzc2lua19zZXRfcHJvcGVydHkpLCAoZ3N0X2dub21ldmZzc2lua19nZXRfcHJvcGVydHkpLAorCShnc3RfZ25vbWV2ZnNzaW5rX29wZW5fZmlsZSksIChnc3RfZ25vbWV2ZnNzaW5rX2Nsb3NlX2ZpbGUpOgorCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc3JjLmM6IChnc3RfZ25vbWV2ZnNzcmNfZ2V0X3R5cGUpLAorCShnc3RfZ25vbWV2ZnNzcmNfaW5pdCksIChnc3RfZ25vbWV2ZnNzcmNfZGlzcG9zZSksCisJKGdzdF9nbm9tZXZmc3NyY191cmlfZ2V0X3R5cGUpLAorCShnc3RfZ25vbWV2ZnNzcmNfdXJpX2dldF9wcm90b2NvbHMpLCAoZ3N0X2dub21ldmZzc3JjX3VyaV9nZXRfdXJpKSwKKwkoZ3N0X2dub21ldmZzc3JjX3VyaV9zZXRfdXJpKSwgKGdzdF9nbm9tZXZmc3NyY191cmlfaGFuZGxlcl9pbml0KSwKKwkoZ3N0X2dub21ldmZzc3JjX3NldF9wcm9wZXJ0eSksIChnc3RfZ25vbWV2ZnNzcmNfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2dub21ldmZzc3JjX29wZW5fZmlsZSksIChnc3RfZ25vbWV2ZnNzcmNfY2xvc2VfZmlsZSk6CisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnN1cmkuYzogKGdzdF9nbm9tZXZmc19nZXRfc3VwcG9ydGVkX3VyaXMpOgorCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzdXJpLmg6CisJICBBZGQgVVJJIHN1cHBvcnQgdG8gR25vbWUtVkZTIHBsdWdpbnMuIFRyaWVzIHRvIGxvYWQgYSBmaXhlZCBsaXN0CisJICBvZiBmYWtlIFVSSXMgdG8gc2VlIHdoaWNoIHRoaXMgdmVyc2lvbiBvZiBHbm9tZS1WRlMgbGlrZXMsIGFuZAorCSAgdXNlcyB0aGF0IGZvciB0aGUgR3N0LVVSSSBpbnRlcmZhY2UuIE1ha2VzIHBsYXliaW4gc3VwcG9ydCBodHRwOi8vCisJICBzdHJlYW1zLiBBbHNvIGZpeCB1cCBzb21lIHN0dXBpZCBiZWhhdmlvdXIgaW4gZ25vbWV2ZnNzcmMuCisKKzIwMDQtMDktMTMgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FtaXhlci5jOiAoZ3N0X2Fsc2FfbWl4ZXJfdXBkYXRlKSwKKwkoZ3N0X2Fsc2FfbWl4ZXJfZ2V0X3ZvbHVtZSksIChnc3RfYWxzYV9taXhlcl9zZXRfdm9sdW1lKSwKKwkoZ3N0X2Fsc2FfbWl4ZXJfc2V0X211dGUpLCAoZ3N0X2Fsc2FfbWl4ZXJfc2V0X3JlY29yZCksCisJKGdzdF9hbHNhX21peGVyX3NldF9vcHRpb24pLCAoZ3N0X2Fsc2FfbWl4ZXJfZ2V0X29wdGlvbik6CisJICBVcGRhdGUgbWl4ZXIgKHRvIHN5bmMgd2l0aCBvdGhlciBzZXNzaW9ucykgaWYgd2UgdHJ5IHRvIG9idGFpbgorCSAgYSBuZXcgdmFsdWUuIFRoaXMgbWFrZXMgYWxzYW1peGVyIHdvcmsgYWNjcm9zcyBhcHBsaWNhdGlvbnMuCisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jOiAoZ3N0X2Fsc2Ffc2lua19nZXRfdGltZSk6CisJICBPbmx5IGNhbGwgc3luYyBmdW5jdGlvbnMgaWYgd2UncmUgcnVubmluZywgZWxzZSBhbHNhbGliIGFzc2VydHMuCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X3NyY19xdWVyeSk6CisJICBTb21ldGltZXMgZmFpbHMgdG8gY29tcGlsZS4gUG9zc2libHkgYSBnY2MgYnVnLgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdlbl92aWRlb19lbGVtZW50KSwKKwkoZ2VuX2F1ZGlvX2VsZW1lbnQpOgorCSAgQWRkIGEgcmVmZXJlbmNlIHRvIGFuIGFwcGxpY2F0aW9uLXByb3ZpZGVkIG9iamVjdCwgYmVjYXVzZSB3ZSBsb3NlCisJICB0aGlzIHNhbWUgcmVmZXJlbmNlIGlmIHdlIGFkZCBpdCB0byB0aGUgYmluLiBJZiB3ZSBkb24ndCBkbyB0aGlzLAorCSAgd2UgY2FuIG9ubHkgdXNlIHRoaXMgb2JqZWN0IG9uY2UgYW5kIHRodXMgY3Jhc2ggaWYgd2UgZ28gZnJvbQorCSAgcmVhZHkgdG8gcGxheWluZywgYmFjayB0byByZWFkeSBhbmQgYmFjayB0byBwbGF5aW5nIGFnYWluLgorCSAgQWxzbyBhZGQgYW4gYXVkaW9zY2FsZSBlbGVtZW50IGJlY2F1c2Ugc2V2ZXJhbCBjaGVhcCBzb3VuZGNhcmRzIC0KKwkgIGxpa2UgbWluZSAtIGRvbid0IHN1cHBvcnQgYWxsIHNhbXBsZXJhdGVzLgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua194Y29udGV4dF9nZXQpLAorCShnc3RfeGltYWdlc2lua194Y29udGV4dF9jbGVhciksIChnc3RfeGltYWdlc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgRml4IHdyb25nIG9yZGVyIG9yIFBBUiBjYWxscy4gTWFrZXMgYXV0b21hdGljYWxseSBvYnRhaW5lZCBQQVIKKwkgIGZyb20gdGhlIFggc2VydmVyIGF0dWFsbHkgYmVpbmcgdXNlZC4KKworMjAwNC0wOS0xMiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJRml4ZXM6ICMxNTE4NzksICMxNTE4ODEsICMxNTE4ODIsICMxNTE4ODMsICMxNTE4ODQsICMxNTE4ODYsCisJIzE1MTg4NywgIzE1MjEwMiwgIzE1MjI0Ny4KKwkqIGV4YW1wbGVzL2luZGV4aW5nL2luZGV4bXBlZy5jOiA2NC1iaXQgd2FybmluZyBmaXhlcy4KKwkqIGV4YW1wbGVzL3NlZWtpbmcvY2RwYXJhbm9pYS5jOiBzYW1lCisJKiBleGFtcGxlcy9zZWVraW5nL2NkcGxheWVyLmM6IHNhbWUKKwkqIGV4YW1wbGVzL3NlZWtpbmcvc2Vlay5jOiBzYW1lCisJKiBleGFtcGxlcy9zZWVraW5nL3NwaWRlcl9zZWVrLmM6IHNhbWUKKwkqIGV4YW1wbGVzL3NlZWtpbmcvdm9yYmlzZmlsZS5jOiBzYW1lCisJKiBleGFtcGxlcy9zdGF0cy9tcDJvZ2cuYzogc2FtZQorCSogZXh0L2VzZC9lc2RzaW5rLmM6IChnc3RfZXNkc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X2VzZHNpbmtfZGlzcG9zZSk6IERpc3Bvc2Ugb2YgZWxlbWVudCBwcm9wZXJseS4KKwkqIGV4dC9pdm9yYmlzL3ZvcmJpc2ZpbGUuYzogKGdzdF9pdm9yYmlzZmlsZV9zZWVrKTogNjQtYml0IHdhcm5pbmcKKwlmaXhlcy4KKwkqIGV4dC9uYXMvbmFzc2luay5jOiAoZ3N0X25hc3NpbmtfY2xhc3NfaW5pdCksCisJKGdzdF9uYXNzaW5rX2Rpc3Bvc2UpOiBEaXNwb3NlIG9mIGVsZW1lbnQgY29ycmVjdGx5LgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzogKGdzdF93YXZlbmNfY2hhaW4pOiBGaXggbGVhay4KKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfY2hlY2tfeHNobV9jYWxscyksCisJKGdzdF94aW1hZ2VzaW5rX3hpbWFnZV9uZXcpLCAoZ3N0X3hpbWFnZXNpbmtfeGltYWdlX2Rlc3Ryb3kpOgorCUZpeCA2NC1iaXQgd2FybmluZy4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfY2hlY2tfeHNobV9jYWxscyksCisJKGdzdF94dmltYWdlc2lua194dmltYWdlX25ldyksIChnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9kZXN0cm95KToKKwlGaXggNjQtYml0IHdhcm5pbmcuCisKKzIwMDQtMDktMTIgIFN0ZXBoYW5lIExvZXVpbGxldCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBjb25maWd1cmUuYWMgOiBjaGFuZ2Ugc3BlZXggZGV0ZWN0aW9uIGFzIDEuMS42IG5vdyB1c2VzCisJICAucGMvcGtnLWNvbmZpZyBhbmQgdGhleSBjaGFuZ2VkIHRoZWlyIGhlYWRlcnMgbG9jYXRpb24uCisKKzIwMDQtMDktMDkgIEFyd2VkIHYuIE1lcmthdHogIDx2Lm1lcmthdHpAZ214Lm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5oOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9yZXNldCksCisJKGdzdF9tYXRyb3NrYV9tdXhfc3RhcnQpLCAoZ3N0X21hdHJvc2thX211eF9maW5pc2gpLAorCShnc3RfbWF0cm9za2FfbXV4X3dyaXRlX2RhdGEpOgorCSAgV3JpdGUgbXVsdGlwbGUgYmxvY2tzL2ZyYW1lcyBwZXIgY2x1c3Rlci4KKwkJV3JpdGUgbWV0YS1zZWVrIGluZm9ybWF0aW9uIChzZWVrIGhlYWRzKS4KKworMjAwNC0wOS0wOSAgU2NvdHQgV2hlZWxlciA8d2hlZWxlckBrZGUub3JnPgorCisJKiBnc3QvZ3N0cGxheWJpbi5jOiAoZ3N0X3BsYXlfYmluX2NsYXNzX2luaXQpLCAoZ3N0X3BsYXlfYmluX2luaXQpLAorCShnc3RfcGxheV9iaW5fc2V0X3Byb3BlcnR5KSwgKGdzdF9wbGF5X2Jpbl9nZXRfcHJvcGVydHkpLAorCShnZW5fYXVkaW9fZWxlbWVudCksIChnZW5fYXVkaW9fZWxlbWVudCk6CisJICBBZGQgYSB2b2x1bWUgZWxlbWVudCAvIHByb3BlcnR5IHRvIHRoZSBwaXBlbGluZS4KKworMjAwNC0wOS0wNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogKGdzdF92aWRlb21peGVyX2JsZW5kX2J1ZmZlcnMpOgorCUNvcHkgdGltZXN0YW1wcyBmcm9tIHRoZSBtYXN0ZXIgcGFkIHRvIHRoZSBvdXRwdXQgYnVmZmVycy4KKworMjAwNC0wOS0wMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmM6CisJICB0aHJvdyBlcnJvcnMgd2hlbiBhcHBsaWNhYmxlCisKKzIwMDQtMDktMDEgIEFyd2VkIHYuIE1lcmthdHogIDx2Lm1lcmthdHpAZ214Lm5ldD4KKworCSogZ3N0L21hdHJvc2thL2VibWwtaWRzLmg6CisJKiBnc3QvbWF0cm9za2EvZWJtbC1yZWFkLmM6IChnc3RfZWJtbF9yZWFkX2RhdGUpOgorCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzogKGdzdF9lYm1sX3dyaXRlX2RhdGUpOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9maW5pc2gpOgorCSAgYXV0b21hdGljYWxseSBjb252ZXJ0IHVuaXggdGltZSA8LT4gZWJtbCB0aW1lIHdoZW4gcmVhZGluZy93cml0aW5nCisJICBhIGRhdGUsIHVzZSBnc3RfZWJtbF93cml0ZV91aW50IHRvIHdyaXRlIENVRVRJTUUsCisJICBub3QgZ3N0X2VibWxfd3JpdGVfZGF0ZS4KKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaDoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfY3JlYXRlX3VpZCksCisJKGdzdF9tYXRyb3NrYV9tdXhfcmVzZXQpLCAoZ3N0X21hdHJvc2thX211eF9hdWRpb19wYWRfbGluayksCisJKGdzdF9tYXRyb3NrYV9tdXhfdHJhY2tfaGVhZGVyKSwgKGdzdF9tYXRyb3NrYV9tdXhfc3RhcnQpLAorCShnc3RfbWF0cm9za2FfbXV4X3dyaXRlX2RhdGEpOgorCSAgV3JpdGUgdHJhY2sgYW5kIHNlZ21lbnQgVUlEcywgd3JpdGUgbXV4aW5nIGRhdGUsIHdyaXRlCisJICBUUkFDS0RFRkFVTFREVVJBVElPTiBmb3IgVFRBIGF1ZGlvLCB3cml0ZSBCTE9DS0RVUkFUSU9OIGlmIGtub3duLgorCSAgQ3JlYXRlIGN1ZXMgZm9yIGF1ZGlvIG9ubHkgZmlsZXMuCisKKzIwMDQtMDgtMzEgIFJvbmFsZCBTLiBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FtaXhlci5jOiAoZ3N0X2Fsc2FfbWl4ZXJfYnVpbGRfbGlzdCk6CisJKiBleHQvYWxzYS9nc3RhbHNhbWl4ZXJ0cmFjay5jOiAoZ3N0X2Fsc2FfbWl4ZXJfdHJhY2tfbmV3KToKKwkgIFJlLWNvbW1pdCBBTFNBIHN3aXRjaGVzLgorCSogZ3N0L2FkZGVyL2dzdGFkZGVyLmM6IChnc3RfYWRkZXJfbG9vcCk6CisJICA2NC1iaXQgZml4ICgjMTUxNDE2KS4KKwkqIGdzdC9kZWJ1Zy9wcm9ncmVzc3JlcG9ydC5jOiAoZ3N0X3Byb2dyZXNzcmVwb3J0X3JlcG9ydCk6CisJICA2NC1iaXQgZml4ICgjMTUxNDE5KS4KKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCShnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfY29udGVudHMpOgorCSAgNjQtYml0IGZpeCAoIzE1MTQyMCkuCisJKiBnc3QvcGxheWJhY2svdGVzdDMuYzogKHVwZGF0ZV9zY2FsZSk6CisJICA2NC1iaXQgZml4ICgjMTUxNDIxKS4KKworMjAwNC0wOC0zMSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgYnVtcCBuYW5vIHRvIGN2cworCis9PT0gcmVsZWFzZSAwLjguNCA9PT0KKworMjAwNC0wOC0wMiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOiByZWxlYXNpbmcgMC44LjQsICJBbGlhcyIKKworMjAwNC0wOC0zMSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L3RoZW9yYS9NYWtlZmlsZS5hbToKKwkgIGZpeCBtYWtlZmlsZS4gIEZpeGVzICMxNTE0NjIuCisKKzIwMDQtMDgtMzAgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL2dzdGZkc2V0LmM6IChnc3RfZmRzZXRfZnJlZSksIChnc3RfZmRzZXRfd2FpdCk6CisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6IChnc3RfbXVsdGlmZHNpbmtfYWRkKSwKKwkoZ3N0X211bHRpZmRzaW5rX3JlbW92ZV9jbGllbnRfbGluayksCisJKGdzdF9tdWx0aWZkc2lua19jbGllbnRfcXVldWVfYnVmZmVyKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfd3JpdGUpOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzaW5rLmM6IChnc3RfdGNwY2xpZW50c2lua19pbml0X3NlbmQpOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuYzogKGdzdF90Y3BjbGllbnRzcmNfaW5pdF9yZWNlaXZlKToKKwlGaXggc29tZSBtZW1vcnkgbGVha3MuCisKKzIwMDQtMDgtMzAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwlQYXRjaCBieTogRGF2aWQgU2NobGVlZgorCisJKiBjb25maWd1cmUuYWM6CisJKiBzeXMvTWFrZWZpbGUuYW06CisJICByZW5hbWUgb3VyIGRldGVjdGlvbiBtYWNybyBmb3IgVjRMMi4gIEZpeGVzICMxNTEyMzYuCisKKzIwMDQtMDgtMzAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwlQYXRjaCBieTogRGF2aWQgU2NobGVlZgorCisJKiBjb25maWd1cmUuYWM6CisJICBjaGVjayB0byBkZWZpbmUgTEFNRVBSRVNFVC4gIEZpeGVzICMxNTEyMzIuCisKKzIwMDQtMDgtMjcgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogc3lzL2dsc2luay9nbGltYWdlc2luay5jOiAoZ3N0X2dsaW1hZ2VzaW5rX3hpbWFnZV9wdXQpLAorCShnc3RfZ2xpbWFnZXNpbmtfeHdpbmRvd19uZXcpLCAoZ3N0X2dsaW1hZ2VzaW5rX3hjb250ZXh0X2dldCksCisJKGdzdF9nbGltYWdlc2lua19maXhhdGUpOiAgTW92ZSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgdG8KKwltYWtlIGdjYy0yLjk1IGhhcHB5LgorCisyMDA0LTA4LTI3ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBidW1wIG5hbm8gZm9yIHByZXJlbGVhc2UKKworMjAwNC0wOC0yNyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBzeXMvc3VuYXVkaW8vTWFrZWZpbGUuYW06IEFkZCBzdW5hdWRpb3NyYyBwYXRjaCBmcm9tIEJhbGEKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpb3NyYy5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvc3JjLmg6CisKKzIwMDQtMDgtMjcgQXJ3ZWQgdi4gTWVya2F0eiA8di5tZXJrYXR6QGdteC5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogKGdzdF9lYm1sX3BlZWRfaWQpLCAoZ3N0X2VibWxfcmVhZF9lbGVtZW50X2lkKSwKKwloYW5kbGUgRU9TIGNvcnJlY3RseQorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF92aWRlb19wYWRfbGluayk6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJYWRkZWQgQklUTUFQSU5GT0hFQURFUiBzdHJ1Y3R1cmUsIG11eCB2aWRlby94LWRpdnggYW5kIHZpZGVvL3gteHZpZCBpbgorCVZGVyBjb21wYXRpYmlsaXR5IG1vZGUKKworMjAwNC0wOC0yNyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCXBhdGNoIGJ5OiBaYWhlZXIgQWJiYXMgTWVyYWxpCisKKwkqIGV4dC9vZ2cvZ3N0b2dnbXV4LmM6CisJKiBleHQvdm9yYmlzL3ZvcmJpc2VuYy5jOgorCSogZXh0L3ZvcmJpcy92b3JiaXNlbmMuaDoKKwkgIGhhbmRsZSBORVdNRURJQQorCisyMDA0LTA4LTI2IEFyd2VkIHYuIE1lcmthdHogPHYubWVya2F0ekBnbXgubmV0PgorCisJKiBnc3QvbWF0cm9za2EvZWJtbC13cml0ZS5jOiAoZ3N0X2VibWxfd3JpdGVfZmxvYXQpLAorCWZpeCBieXRlIG9yZGVyIHJldmVyc2lvbiBvbiBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzLgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoYXVkaW9zaW5rX3RlbXBsKSwKKwkoZ3N0X21hdHJvc2thX211eF9hdWRpb19wYWRfbGluayk6CisJYWRkIFRUQSBjb2RlYyB0byB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgY29kZWNzLgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9pbml0KSwKKwkoZ3N0X21hdHJvc2thX211eF9zdGFydCksIChnc3RfbWF0cm9za2FfbXV4X2ZpbmlzaCksCisJKGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfZGF0YSk6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4Lmg6CisJd3JpdGUgc2VnbWVudCBkdXJhdGlvbiBjb3JyZWN0bHksIHdyaXRlIG11eGluZyBhcHAgc3RyaW5nLCBmaXhlcyBidWdzCisJIzE0MDg5NyBhbmQgIzE0MDg5OC4KKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfbG9vcCksCisJd2FpdCBmb3IgYWxsIHBhZHMgdG8gYmUgbmVnb3RpYXRlZCBiZWZvcmUgc3RhcnRpbmcgdG8gbXV4LgorCisyMDA0LTA4LTI2ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzogKGdzdF9sYW1lX2luaXQpLCAoZ3N0X2xhbWVfY2hhaW4pOgorCSogZXh0L2xhbWUvZ3N0bGFtZS5oOgorCUFkZGVkIG5ldyBtZWRpYSBzdXBwb3J0IHRvIGxhbWUKKworMjAwNC0wOC0yNSBBcndlZCB2LiBNZXJrYXR6IDx2Lm1lcmthdHpAZ214Lm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cCksCisJc2VuZCB2b3JiaXMgaGVhZGVycyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgc3RyZWFtLCBmaXhlcyBidWcgIzE0MTU1NC4KKwlJbnRlcnByZXQgQkxPQ0tEVVJBVElPTiBhbmQgc2V0IGJ1ZmZlciBkdXJhdGlvbiBhY2NvcmRpbmdseSwgZml4ZXMKKwlidWcgIzE0ODk1MC4KKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X2F1ZGlvX2NhcHMpLAorCShnc3RfbWF0cm9za2FfZGVtdXhfcGx1Z2luX2luaXQpOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCWVuYWJsZSBkZW11eGluZyBvZiBUVEEgYXVkaW8gc3RyZWFtcywgZml4ZXMgYnVnICMxNDg5NTEuCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKHR0YV90eXBlX2ZpbmQpLCAocGx1Z2luX2luaXQpLAorCWVuYWJsZSB0eXBlZmluZGluZyBmb3IgVFRBIGF1ZGlvIGZpbGVzLCBmaXhlcyBidWcgIzE0ODcxMS4KKwkqIGV4dC94dmlkL2dzdHh2aWRkZWMuYzogKGdzdF94dmlkZGVjX2NoYWluKSwKKwlzZXQgWFZJRF9MT1dERUxBWSBmbGFnIGZvciBkZWNvZGluZyBzbyB4dmlkIGFsd2F5cyByZXR1cm5zIGFuIGltYWdlLAorCWZpeGVzIHBsYXliYWNrIG9mIHBhY2tlZCBiaXRzdHJlYW0gYW5kIHh2aWQgd2l0aCBiZnJhbWVzLCBidWcgIzEzNTQwNy4KKworMjAwNC0wOC0yNCAgU2ViYXN0aWVuIENvdGUgIDxzYzVAaGVybWVzLnVzaGVyYi5jYT4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9wZWVrX2hlYWQpLAorCShnc3RfcmlmZl9yZWFkX2VsZW1lbnRfZGF0YSksIChnc3RfcmlmZl9yZWFkX3NlZWspLAorCShnc3RfcmlmZl9yZWFkX3NraXApOiBmaXggaW5maW5pdGUgbG9vcCBpbiB3YXZwYXJzZSwgZml4ZXMgYnVnCisJIzE0NDYxNiwgcGF0Y2ggcmV2aWV3ZWQgYnkgUm9uYWxkIGFuZCBjb21taXR0ZWQgYnkgQ2hyaXN0b3BoZSBGZXJnZWF1CisJPHRldWZAZ25vbWUub3JnPgorCisyMDA0LTA4LTIzIElhaW4gPGlhaW5nbm9tZUBnbWFpbC5jb20+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmMgKGdzdF9tYWRfaWQzX3RvX3RhZ19saXN0KTogU3BlY2lhbCBjYXNlIENPTU0KKwl0YWdzLiBUaGV5IGFwcGVhciB0byBiZSBoYW5kbGVkIGRpZmZlcmVudGx5IHRvIG5vcm1hbC4KKwkodGFnX2xpc3RfdG9faWQzX3RhZ19mb3JlYWNoKTogRGl0dG8uCisKKzIwMDQtMDgtMjIgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvb2dnL2dzdG9nZ211eC5jOiAoZ3N0X29nZ19tdXhfbmV4dF9idWZmZXIpLAorCShnc3Rfb2dnX211eF9zZW5kX2hlYWRlcnMpLCAoZ3N0X29nZ19tdXhfbG9vcCk6CisJTWFrZSBzdXJlIHdlIG5ldmVyIHNlbmQgLTEgZ3JhbnVsZXBvcy4KKworMjAwNC0wOC0yMCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnbXV4LmM6IChnc3Rfb2dnX211eF9uZXh0X2J1ZmZlciksCisJKGdzdF9vZ2dfbXV4X2xvb3ApOgorCUkgd2lsbCBhY2NlcHQgYml0Y2hzbGFwcGluZ3Mgd2l0aCBub24gc2hhcnAgb2JqZWN0cy4KKworMjAwNC0wOC0yMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJQ2xlYW4gdXAgdGhlIHRlc3QgZm9yIGxhbWUgcHJlc2V0cworCisyMDA0LTA4LTE5ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9sYW1lL01ha2VmaWxlLmFtOgorCSogZXh0L2xhbWUvZ3N0bGFtZS5jOiAoZ3N0X2xhbWVfY2xhc3NfaW5pdCksCisJKGdzdF9sYW1lX3NldF9wcm9wZXJ0eSksIChnc3RfbGFtZV9nZXRfcHJvcGVydHkpLCAoZ3N0X2xhbWVfc2V0dXApOgorCU9ubHkgZW5hYmxlIGxhbWUgcHJlc2V0cyBpZiB2ZXJzaW9uIG9mIGxhbWUgaGFzIHByZXNldHMgaW4gQVBJCisKKzIwMDQtMDgtMTkgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2luaXQpLCAoZ3N0X3VkcHNyY19nZXQpOgorCSogZ3N0L3VkcC9nc3R1ZHBzcmMuaDoKKwkgIERvbid0IGNhbGwgZ3N0X3BhZF9wdXNoIGluIGEgZ2V0IGZ1bmN0aW9uLiBGaXhlcyAjMTUwNDQ5CisKKzIwMDQtMDgtMTggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL2dzdGZkc2V0LmM6IChnc3RfZmRzZXRfZnJlZSksIChnc3RfZmRzZXRfc2V0X21vZGUpLAorCShnc3RfZmRzZXRfZ2V0X21vZGUpLCAoZ3N0X2Zkc2V0X2FkZF9mZCksIChnc3RfZmRzZXRfcmVtb3ZlX2ZkKSwKKwkoZ3N0X2Zkc2V0X2ZkX2N0bF93cml0ZSksIChnc3RfZmRzZXRfZmRfY3RsX3JlYWQpLAorCShnc3RfZmRzZXRfZmRfaGFzX2Nsb3NlZCksIChnc3RfZmRzZXRfZmRfaGFzX2Vycm9yKSwKKwkoZ3N0X2Zkc2V0X2ZkX2Nhbl9yZWFkKSwgKGdzdF9mZHNldF9mZF9jYW5fd3JpdGUpLAorCShnc3RfZmRzZXRfd2FpdCk6CisJKiBnc3QvdGNwL2dzdGZkc2V0Lmg6CisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6IChnc3RfbXVsdGlmZHNpbmtfYWRkKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9xdWV1ZV9idWZmZXIpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF93cml0ZSk6CisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmg6CisJU29tZSBleHRyYSBjaGVja3MgaW4gZ3N0ZmRzZXQuCisJT25seSB1c2Ugc2VuZCgpIHdoZW4gdGhlIGZkIGlzIGEgc29ja2V0LiBEb24ndCB0cnkgdG8KKwlyZWFkIGZyb20gd3JpdGUgb25seSBmZHMuCisKKzIwMDQtMDgtMTggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL2dzdGZkc2V0LmM6IChnc3RfZmRzZXRfYWRkX2ZkKSwgKGdzdF9mZHNldF9yZW1vdmVfZmQpLAorCShnc3RfZmRzZXRfZmRfY3RsX3dyaXRlKSwgKGdzdF9mZHNldF9mZF9jdGxfcmVhZCksCisJKGdzdF9mZHNldF9mZF9oYXNfY2xvc2VkKSwgKGdzdF9mZHNldF9mZF9oYXNfZXJyb3IpLAorCShnc3RfZmRzZXRfZmRfY2FuX3JlYWQpLCAoZ3N0X2Zkc2V0X2ZkX2Nhbl93cml0ZSksCisJKGdzdF9mZHNldF93YWl0KToKKwlBZGQgbW9yZSBsb2NraW5nIGFuZCBib3VuZHMgY2hlY2tpbmcuCisKKzIwMDQtMDgtMTggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL2dzdGZkc2V0LmM6IChlbnN1cmVfc2l6ZSksIChnc3RfZmRzZXRfd2FpdCk6CisJUmVhbGxvYyB0ZXN0IGZkc2V0IGluIHRoZSBsb2NrIGFuZCByaWdodCBiZWZvcmUgc3RhcnRpbmcKKwl0aGUgcG9sbCBjYWxsLiBCdW1wIHRoZSBsaW1pdCB0byA0MDk2LgorCisyMDA0LTA4LTE3ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIHN5cy9zdW5hdWRpby9NYWtlZmlsZS5hbToKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpby5jOiBGaXggY2FwcyB0byBoYW5kbGUgZnVsbCByYW5nZQorCW9mIHJhdGVzIGFuZCBjaGFubmVscy4gIE1ha2UgZGVidWdnaW5nIGxlc3Mgb2Jub3hpb3VzLgorCisJUGF0Y2ggZnJvbSBCYWxhbXVyYWxpIFZpc3dhbmF0aGFuIGltcGxlbWVudGluZyBhIG1peGVyIGZvcgorCVN1biBhdWRpby4gIChidWcgIzE0NDA5MSk6CisJKiBzeXMvc3VuYXVkaW8vZ3N0c3VuZWxlbWVudC5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmVsZW1lbnQuaDoKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5taXhlci5jOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bm1peGVyLmg6CisKKzIwMDQtMDgtMTcgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogZ3N0L2F1ZGlvc2NhbGUvZ3N0YXVkaW9zY2FsZS5jOgorCSogZ3N0L2F1ZGlvc2NhbGUvZ3N0YXVkaW9zY2FsZS5oOgorCW1hZGUgYXVkaW9zY2FsZSByZXNhbXBsZSBmcm9tIGFueSBzYW1wbGUgcmF0ZSB0byBhbnkgc2FtcGxlIHJhdGUKKworMjAwNC0wOC0xNyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuYzoKKwkgIGVycm9yIG91dCBvbiB1bnN1cHBvcnRlZCB0eXBlcworCisyMDA0LTA4LTE3ICBJYWluIDxpYWluZ25vbWVAZ21haWwuY29tPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmMgKGdzdF9mbGFjZW5jX3VwZGF0ZV9xdWFsaXR5KTogT25seSBzZXQgdGhlCisJbWlkX3NpZGUgYW5kIGxvb3NlX21pZF9zaWRlIHByb3BlcnRpZXMgaWYgaXRzIGEgc3RlcmVvIHN0cmVhbS4KKworMjAwNC0wOC0xNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6IChnc3RfdGhlb3JhX2RlY19jbGFzc19pbml0KSwKKwkodGhlb3JhX2dldF9mb3JtYXRzKSwgKHRoZW9yYV9kZWNfc3JjX2NvbnZlcnQpLAorCSh0aGVvcmFfZGVjX3NpbmtfY29udmVydCksICh0aGVvcmFfZGVjX3NyY19xdWVyeSksCisJKHRoZW9yYV9kZWNfc3JjX2V2ZW50KSwgKHRoZW9yYV9kZWNfZXZlbnQpLCAodGhlb3JhX2RlY19jaGFpbik6CisJQWRkIGEgZGVidWcgbGluZS4KKworMjAwNC0wOC0xNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfZGVtdXhfaXRlcmF0ZSksCisJKGdzdF9vZ2dfcGFkX3B1c2gpOgorCSogZXh0L29nZy9nc3RvZ2dtdXguYzogKGdzdF9vZ2dfbXV4X2luaXQpLAorCShnc3Rfb2dnX211eF9yZXF1ZXN0X25ld19wYWQpLCAoZ3N0X29nZ19tdXhfbmV4dF9idWZmZXIpLAorCShnc3Rfb2dnX211eF9idWZmZXJfZnJvbV9wYWdlKSwgKGdzdF9vZ2dfbXV4X3B1c2hfcGFnZSksCisJKGdzdF9vZ2dfbXV4X3NlbmRfaGVhZGVycyksIChnc3Rfb2dnX211eF9sb29wKToKKwlNYXJrIGRlbHRhIHVuaXRzIGluIHRoZSBtdXhlci4KKwlUcnkgdG8gZGVjb2RlIHRoZSBwYWNrZXQgYWZ0ZXIgYW4gb3V0LW9mLXN5bmMgZXJyb3IgZnJvbQorCWxpYm9nZy4KKworMjAwNC0wOC0xNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuYzogKGdzdF9tdWx0aWZkc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X211bHRpZmRzaW5rX2luaXQpLCAoZ3N0X211bHRpZmRzaW5rX2FkZCksCisJKGdzdF9tdWx0aWZkc2lua19jbGllbnRfcXVldWVfYnVmZmVyKSwKKwkoZ3N0X211bHRpZmRzaW5rX3NldF9wcm9wZXJ0eSksIChnc3RfbXVsdGlmZHNpbmtfZ2V0X3Byb3BlcnR5KToKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuaDoKKwlBZGRlZCBvcHRpb24gdG8gc2VuZCBhIGtleWZyYW1lIHRvIGNsaWVudHMgYXMgdGhlIGZpcnN0IGJ1ZmZlci4KKwlNYWtlIHRpbWVvdXQgcHJvcGVydHkgd3JpdGFibGUuCisKKzIwMDQtMDgtMTcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwlwYXRjaCBieTogV2ltIFRheW1hbnMKKworCSogZ3N0L3RjcC9nc3RmZHNldC5jOgorCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOgorCSAgZml4IGluZGV4IGNvbXBhcmlzb24sIHNob3VsZCBpbmNsdWRlIDAKKworMjAwNC0wOC0xNiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC90Y3AvZ3N0ZmRzZXQuYzogKGVuc3VyZV9zaXplKSwgKGdzdF9mZHNldF9uZXcpLAorCShnc3RfZmRzZXRfYWRkX2ZkKSwgKGdzdF9mZHNldF9yZW1vdmVfZmQpLAorCShnc3RfZmRzZXRfZmRfaGFzX2Nsb3NlZCksIChnc3RfZmRzZXRfZmRfaGFzX2Vycm9yKSwKKwkoZ3N0X2Zkc2V0X2ZkX2Nhbl9yZWFkKSwgKGdzdF9mZHNldF9mZF9jYW5fd3JpdGUpLAorCShnc3RfZmRzZXRfd2FpdCk6CisJICBjb3B5IHdoZW4gcmVhbGxvY2luZyBmb3IgcG9sbCBzbyB0aGUgc2VsZWN0IGFyZ3VtZW50cyBkb24ndCBnZXQKKwkgIGNoYW5nZWQgZHVyaW5nIHRoZSBjYWxsCisKKzIwMDQtMDgtMTYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvdGhlb3JhL3RoZW9yYWVuYy5jOiAoZ3N0X2JvcmRlcl9tb2RlX2dldF90eXBlKSwKKwkoZ3N0X3RoZW9yYV9lbmNfY2xhc3NfaW5pdCksICh0aGVvcmFfZW5jX3NpbmtfbGluayksCisJKHRoZW9yYV9idWZmZXJfZnJvbV9wYWNrZXQpLCAodGhlb3JhX2VuY19jaGFpbik6CisJRml4IGJ1ZyB3aGVyZSBidWZmZXJzIHdlcmUgbm90IG1hcmtlZCBhcyBrZXlmcmFtZXMKKwljb3JyZWN0bHkuCisKKzIwMDQtMDgtMTUgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogZXh0L2xhbWUvZ3N0bGFtZS5jOiAoZ3N0X2xhbWVfdmJybW9kZV9nZXRfdHlwZSksCisJKGdzdF9sYW1lX3ByZXNldF9nZXRfdHlwZSksIChnc3RfbGFtZV9jbGFzc19pbml0KToKKwlkZXNjcmliZSB0aGUgZW51bSB2YWx1ZXMgZm9yIHZiciBtb2RlIGFuZCBwcmVzZXRzIG1vcmUgdmVyYm9zZWx5CisKKzIwMDQtMDgtMTMgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogZXh0L2xhbWUvZ3N0bGFtZS5jOiAoZ3N0X2xhbWVfbW9kZV9nZXRfdHlwZSksCisJKGdzdF9sYW1lX3F1YWxpdHlfZ2V0X3R5cGUpLCAoZ3N0X2xhbWVfcGFkZGluZ19nZXRfdHlwZSksCisJKGdzdF9sYW1lX3ByZXNldF9nZXRfdHlwZSksIChnc3RfbGFtZV9jbGFzc19pbml0KSwgKGdzdF9sYW1lX2luaXQpLAorCShnc3RfbGFtZV9zZXRfcHJvcGVydHkpLCAoZ3N0X2xhbWVfZ2V0X3Byb3BlcnR5KSwgKGdzdF9sYW1lX3NldHVwKToKKwkqIGV4dC9sYW1lL2dzdGxhbWUuaDoKKwlhZGQgcHJlc2V0IHByb3BlcnR5IHRvIGxhbWUgc28gaXQgY2FuIHVzZSBsYW1lIHByZXNldHMKKworMjAwNC0wOC0xMyAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBleHQvbGFtZS9nc3RsYW1lLmM6IChnc3RfbGFtZV9nZXRfcHJvcGVydHkpOgorCXdob29wcyBmb3Jnb3QgYnJlYWssIHRoYW5rcyB0ZXVmCisKKzIwMDQtMDgtMTMgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogZXh0L2xhbWUvZ3N0bGFtZS5jOiAoZ3N0X2xhbWVfdmJybW9kZV9nZXRfdHlwZSksCisJKGdzdF9sYW1lX2NsYXNzX2luaXQpLCAoZ3N0X2xhbWVfc3JjX2dldGNhcHMpLAorCShnc3RfbGFtZV9zaW5rX2xpbmspLCAoZ3N0X2xhbWVfaW5pdCksIChnc3RfbGFtZV9zZXRfcHJvcGVydHkpLAorCShnc3RfbGFtZV9nZXRfcHJvcGVydHkpLCAoZ3N0X2xhbWVfc2V0dXApOgorCSogZXh0L2xhbWUvZ3N0bGFtZS5oOgorCWZpeCBsYW1lJ3MgYnJva2VuIHZiciBzdHVmZiwgYWxsb3cgaXQgdG8gcmVzYW1wbGUgaWYgbmVlZCBiZSwgYW5kIGFsc28KKwltYWtlIHhpbmcgaGVhZGVyIG9wdGlvbmFsCisKKzIwMDQtMDgtMTIgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogZXh0L2xhbWUvZ3N0bGFtZS5jOiAoZ3N0X2xhbWVfc3JjX2dldGNhcHMpLCAoZ3N0X2xhbWVfaW5pdCk6CisJYWRkZWQgZ2V0Y2FwcyBmdW5jdGlvbiBzbyBzYW1wbGVyYXRlIGRvZXNudCBnZXQgZml4YXRlZCB0byBzaWxseSB2YWx1ZXMKKworMjAwNC0wOC0xMiAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBleHQvbGFtZS9nc3RsYW1lLmM6IChnc3RfbGFtZV9zcmNfbGluayk6CisJcmV2ZXJ0IHByZXZpb3VzIGZpeAorCisyMDA0LTA4LTEyICBKb2hhbiBEYWhsaW4gIDxqb2hhbkBnbm9tZS5vcmc+CisKKwkqIHN5cy92NGwvZ3N0djRsZWxlbWVudC5jIChnc3RfdjRsX2lmYWNlX3N1cHBvcnRlZCk6IFJlbW92ZSBib2d1cworCWNoZWNrcy4gRG9lc24ndCBtYXR0ZXIgd2hhdCBzdGF0ZSB3ZSBhcmUgaW4uIEludGVyZmFjZXMgYXJlIGEKKwljb21waWxlIHRpbWUgdGhpbmcsIG5vdCBydW50aW1lLiBJdCBhbHNvIGJyb2tlIHRoZSBweXRob24gYmluZGluZ3MuCisKKzIwMDQtMDgtMTIgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogZXh0L2xhbWUvZ3N0bGFtZS5jOiAoZ3N0X2xhbWVfc3JjX2xpbmspOgorCW1hZGUgc291cmNlIHBhZCBsaW5rIGZ1bmN0aW9uIGNoZWNrIGlmIHNpbmtwYWQgaXMgb2suLmZpeGVzIHRoZSBwcm9ibGVtCisJd2hlcmUgY29yZSBmaXhhdGVzIHRoZSBvdXRwdXQgcmF0ZSBvZiBsYW1lIHN0dXBpZGx5CisKKzIwMDQtMDgtMTIgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgKGF0KSBhcGVzdGFhcnQgKGRvdCkgb3JnPgorCisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19zcmNfbGluayksIChnc3RfdjRsc3JjX2ZpeGF0ZSk6CisJKiBzeXMvdjRsL3Y0bF9jYWxscy5jOgorCSogc3lzL3Y0bC92NGxzcmNfY2FsbHMuYzogKGdzdF92NGxzcmNfc2V0X2NhcHR1cmUpOgorCSAgZml4IGZpeGF0ZSBmdW5jdGlvbiB0byBoYW5kbGUgbm9uc2ltcGxlIGNhcHMuCisJICByZW1vdmUgYm9ndXMgY2hlY2sgaW4gX2xpbmsKKwkgIGNsZWFudXBzCisKKzIwMDQtMDgtMTIgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogZXh0L2xhbWUvZ3N0bGFtZS5jOiAoZ3N0X2xhbWVfY2xhc3NfaW5pdCksIChnc3RfbGFtZV9pbml0KToKKwlzZXQgZGVmYXVsdCBjb21wcmVzc2lvbiByYXRpbyBwYXJhbWV0ZXIgdG8gMC4wIHNvIGJpdHJhdGUgcGFyYW1ldGVyCisJd29ya3MgOikKKworMjAwNC0wOC0xMSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvdGNwL2dzdGZkc2V0LmM6IEZpeCBjb21waWxlIHByb2JsZW0gb24gT1MvWC4KKworMjAwNC0wOC0xMSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvbXBlZzFzeXMvZ3N0bXBlZzFzeXN0ZW1lbmNvZGUuYzogT29wcywgdGhpcyB3YXMgY29ycmVjdAorCWJlZm9yZS4KKworMjAwNC0wOC0xMSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QtbGlicy9nc3QvdmlkZW8vdmlkZW9zaW5rLmg6IENoYW5nZSBjb3B5cmlnaHQgYmxvY2sgdG8gTEdQTC4KKworMjAwNC0wOC0xMSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvcGFuZ28vZ3N0dGV4dG92ZXJsYXkuYzogQWRkIGNvcHlyaWdodCBibG9jayBhbmQgZml4IHBsdWdpbgorCSAgbGljZW5zZSBmaWVsZAorCSogZ3N0LWxpYnMvZ3N0L2lkY3QvTWFrZWZpbGUuYW06IFJlbW92ZSBtbXgvc3NlIGNvZGUKKwkqIGdzdC1saWJzL2dzdC92aWRlby9nc3R2aWRlb3NpbmsuYzogQ2hhbmdlIGNvcHlyaWdodCBibG9jayB0bworCSAgTEdQTC4KKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzogRml4IHBsdWdpbiBsaWNlbnNlIGZpZWxkLgorCSogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYzogRml4IHBsdWdpbiBsaWNlbnNlIGZpZWxkLgorCSogZ3N0L21wZWcxc3lzL2dzdG1wZWcxc3lzdGVtZW5jb2RlLmM6IEZpeCBwbHVnaW4gbGljZW5zZSBmaWVsZC4KKwkqIGdzdC9ydHAvZ3N0cnRwLmM6IEZpeCBwbHVnaW4gbGljZW5zZSBmaWVsZC4KKworMjAwNC0wOC0xMSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC90Y3AvTWFrZWZpbGUuYW06CisJKiBnc3QvdGNwL2dzdGZkc2V0LmM6IChnc3RfZmRzZXRfbW9kZV9nZXRfdHlwZSksIChuZWFyZXN0X3BvdyksCisJKGVuc3VyZV9zaXplKSwgKGdzdF9mZHNldF9uZXcpLCAoZ3N0X2Zkc2V0X2ZyZWUpLAorCShnc3RfZmRzZXRfc2V0X21vZGUpLCAoZ3N0X2Zkc2V0X2dldF9tb2RlKSwgKGdzdF9mZHNldF9hZGRfZmQpLAorCShnc3RfZmRzZXRfcmVtb3ZlX2ZkKSwgKGdzdF9mZHNldF9mZF9jdGxfd3JpdGUpLAorCShnc3RfZmRzZXRfZmRfY3RsX3JlYWQpLCAoZ3N0X2Zkc2V0X2ZkX2hhc19jbG9zZWQpLAorCShnc3RfZmRzZXRfZmRfaGFzX2Vycm9yKSwgKGdzdF9mZHNldF9mZF9jYW5fcmVhZCksCisJKGdzdF9mZHNldF9mZF9jYW5fd3JpdGUpLCAoZ3N0X2Zkc2V0X3dhaXQpOgorCSogZ3N0L3RjcC9nc3RmZHNldC5oOgorCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X3VuaXRfdHlwZV9nZXRfdHlwZSksCisJKGdzdF9tdWx0aWZkc2lua19jbGFzc19pbml0KSwgKGdzdF9tdWx0aWZkc2lua19pbml0KSwKKwkoZ3N0X211bHRpZmRzaW5rX2FkZCksIChnc3RfbXVsdGlmZHNpbmtfcmVtb3ZlKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsZWFyKSwgKGdzdF9tdWx0aWZkc2lua19nZXRfc3RhdHMpLAorCShnc3RfbXVsdGlmZHNpbmtfcmVtb3ZlX2NsaWVudF9saW5rKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfcmVhZCksCisJKGdzdF9tdWx0aWZkc2lua19jbGllbnRfcXVldWVfZGF0YSksCisJKGdzdF9tdWx0aWZkc2lua19jbGllbnRfcXVldWVfY2FwcyksCisJKGdzdF9tdWx0aWZkc2lua19jbGllbnRfcXVldWVfYnVmZmVyKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfd3JpdGUpLAorCShnc3RfbXVsdGlmZHNpbmtfcmVjb3Zlcl9jbGllbnQpLCAoZ3N0X211bHRpZmRzaW5rX3F1ZXVlX2J1ZmZlciksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50cyksIChnc3RfbXVsdGlmZHNpbmtfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X211bHRpZmRzaW5rX2dldF9wcm9wZXJ0eSksIChnc3RfbXVsdGlmZHNpbmtfaW5pdF9zZW5kKSwKKwkoZ3N0X211bHRpZmRzaW5rX2Nsb3NlKToKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuaDoKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc2luay5jOiAoZ3N0X3RjcHNlcnZlcnNpbmtfY2xhc3NfaW5pdCksCisJKGdzdF90Y3BzZXJ2ZXJzaW5rX2luaXQpLCAoZ3N0X3RjcHNlcnZlcnNpbmtfaGFuZGxlX3NlcnZlcl9yZWFkKSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfaGFuZGxlX3dhaXQpLCAoZ3N0X3RjcHNlcnZlcnNpbmtfaW5pdF9zZW5kKSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfY2xvc2UpOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzaW5rLmg6CisJQWJzdHJhY3RlZCBhd2F5IHRoZSBzZWxlY3QgY2FsbCwgaW1wbGVtZW50ZWQgcG9sbCAoeWVzIHdlIHJhbiBpbnRvCisJdGhlIDEwMjQgbGltaXQgaW4gcHJvZHVjdGlvbikuCisKKzIwMDQtMDgtMTEgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC90Y3AvZ3N0dGNwLmM6CisJKiBnc3QvdGNwL2dzdHRjcHBsdWdpbi5jOgorCSAgaW1wcm92ZSBkZWJ1Z2dnaW5nLCByZW1vdmUgYXNzZXJ0CisKKzIwMDQtMDgtMTAgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6IChnc3RfdW5pdF90eXBlX2dldF90eXBlKSwKKwkoZ3N0X2NsaWVudF9zdGF0dXNfZ2V0X3R5cGUpLCAoZ3N0X211bHRpZmRzaW5rX2NsYXNzX2luaXQpLAorCShnc3RfbXVsdGlmZHNpbmtfaW5pdCksIChnc3RfbXVsdGlmZHNpbmtfcmVtb3ZlX2NsaWVudF9saW5rKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfcmVhZCksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50X3dyaXRlKSwKKwkoZ3N0X211bHRpZmRzaW5rX3JlY292ZXJfY2xpZW50KSwgKGdzdF9tdWx0aWZkc2lua19xdWV1ZV9idWZmZXIpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudHMpLCAoZ3N0X211bHRpZmRzaW5rX3NldF9wcm9wZXJ0eSksCisJKGdzdF9tdWx0aWZkc2lua19nZXRfcHJvcGVydHkpOgorCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5oOgorCSogZ3N0L3RjcC9nc3R0Y3AtbWFyc2hhbC5saXN0OgorCVN0YXJ0aW5nIHRvIHByZXBhcmUgZm9yIHNwZWNpZnlpbmcgYnVmZmVyIHRpbWUgaW4gb3RoZXIgdW5pdHMKKwl0aGFuIGJ1ZmZlcnMuIEV4cG9zZSByZW1vdmUgcmVhc29uIGluIHNpZ25hbC4KKworMjAwNC0wOC0xMCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuYzogKGdzdF9tdWx0aWZkc2lua19hZGQpLAorCShnc3RfbXVsdGlmZHNpbmtfcmVtb3ZlKSwgKGdzdF9tdWx0aWZkc2lua19jbGVhciksCisJKGdzdF9tdWx0aWZkc2lua19yZW1vdmVfY2xpZW50X2xpbmspLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF9yZWFkKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9xdWV1ZV9kYXRhKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9xdWV1ZV9idWZmZXIpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF93cml0ZSksCisJKGdzdF9tdWx0aWZkc2lua19xdWV1ZV9idWZmZXIpLCAoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRzKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NoYWluKSwgKGdzdF9tdWx0aWZkc2lua19jbG9zZSk6CisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmg6CisJQWRkZWQgbW9yZSBkZWJ1Z2dpbmcgaW5mby4gQ2hhbmdlZCB0aGUgd2F5IGNsaWVudHMgYXJlCisJcmVtb3ZlZCBmcm9tIHRoZSBsaXN0cy4gRml4ZWQgYSBidWcgd2hlcmUgYSBiYWQgZmlsZSBkZXNjcmlwdG9yCisJY291bGQgY2F1c2UgbWFueSBjbGllbnRzIHRvIGJlIHJlbW92ZWQuCisKKzIwMDQtMDgtMDYgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0L3ZpZGVvdGVzdHNyYy9nc3R2aWRlb3Rlc3RzcmMuYzogKGdlbmVyYXRlX2NhcHNsaXN0KToKKwkgIGFsbG93IGFsbCBwaXhlbC1hc3BlY3QtcmF0aW9zLCBub3QganVzdCAxOjEKKworMjAwNC0wOC0wOSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBzeXMvZ2xzaW5rL0FSQl9tdWx0aXRleHR1cmUuaDogIFJlbW92ZSBvbGQgZmlsZXMuCisJKiBzeXMvZ2xzaW5rL0VYVF9wYWxldHRlZF90ZXh0dXJlLmg6CisJKiBzeXMvZ2xzaW5rL05WX3JlZ2lzdGVyX2NvbWJpbmVycy5oOgorCSogc3lzL2dsc2luay9nc3RnbF9udmltYWdlLmM6CisJKiBzeXMvZ2xzaW5rL2dzdGdsX3BkcmltYWdlLmM6CisJKiBzeXMvZ2xzaW5rL2dzdGdsX3JnYmltYWdlLmM6CisJKiBzeXMvZ2xzaW5rL2dzdGdsc2luay5jOgorCSogc3lzL2dsc2luay9nc3RnbHNpbmsuaDoKKwkqIHN5cy9nbHNpbmsvZ3N0Z2x4d2luZG93LmM6CisJKiBzeXMvZ2xzaW5rL3JlZ2NvbWJfeXV2cmdiLmM6CisKKzIwMDQtMDgtMDkgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCVBhdGNoIGZyb20gR2Vybm90IFppZWdsZXIgPGd6QGx5c2F0b3IubGl1LnNlPiByZXdyaXRpbmcgdGhlCisJR0wgc2luayBwbHVnaW4uICAoQnVnICMxNDczMDIpCisKKwkqIGNvbmZpZ3VyZS5hYzogVGVzdCBmb3IgT3BlbkdMCisJKiBzeXMvTWFrZWZpbGUuYW06IFVzZSB0ZXN0IGZvciBPcGVuR0wKKwkqIHN5cy9nbHNpbmsvTWFrZWZpbGUuYW06CisJKiBzeXMvZ2xzaW5rL2dsaW1hZ2VzaW5rLmM6IHJld3JpdGUKKwkqIHN5cy9nbHNpbmsvZ2xpbWFnZXNpbmsuaDogcmV3cml0ZQorCisyMDA0LTA4LTA5ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9zZGwvc2RsdmlkZW9zaW5rLmM6IChnc3Rfc2RsdmlkZW9zaW5rX2Jhc2VfaW5pdCk6ICBPbmx5IGFsbG93CisJc2FuZSBmcmFtZXJhdGVzLgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua194Y29udGV4dF9nZXQpOiBzYW1lCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2dldF94dl9zdXBwb3J0KTogc2FtZQorCSogdGVzdHN1aXRlL2dzdC1saW50OiBUZXN0IGZvciBHX0dVSU5UNjRfRk9STUFUIHVzYWdlIG5lYXIgZ2V0dGV4dC4KKworMjAwNC0wOC0wOSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuYzogKGdzdF9tdWx0aWZkc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X211bHRpZmRzaW5rX2FkZCksIChnc3RfbXVsdGlmZHNpbmtfZ2V0X3N0YXRzKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9yZW1vdmUpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF9yZWFkKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRfd3JpdGUpLAorCShnc3RfbXVsdGlmZHNpbmtfcXVldWVfYnVmZmVyKSwgKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50cyk6CisJRG8gYSBiaXQgbW9yZSBsb2dnaW5nLCBtYWtlIHRoZSBjbGllbnRfcmVhZCBjb2RlIG1vcmUgcm9idXN0LgorCisyMDA0LTA4LTA5ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvanBlZy9nc3RqcGVnZGVjLmM6IChnc3RfanBlZ2RlY19pbml0X3NvdXJjZSksCisJKGdzdF9qcGVnZGVjX2ZpbGxfaW5wdXRfYnVmZmVyKSwgKGdzdF9qcGVnZGVjX3NraXBfaW5wdXRfZGF0YSksCisJKGdzdF9qcGVnZGVjX3Jlc3luY190b19yZXN0YXJ0KSwgKGdzdF9qcGVnZGVjX3Rlcm1fc291cmNlKSwKKwkoZ3N0X2pwZWdkZWNfaW5pdCksIChnc3RfanBlZ2RlY19jaGFpbik6CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmM6IChnc3RfbXVsdGlwYXJ0X2RlbXV4X2luaXQpLAorCShnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYWluKSwgKGdzdF9tdWx0aXBhcnRfZGVtdXhfY2hhbmdlX3N0YXRlKToKKwkgIGNsZWFudXBzLCBkZWJ1Z2dpbmcgZml4ZXMgYW5kIG1lbWxlYWsgcGx1Z2dpbmcKKworMjAwNC0wOC0wOSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6IChnc3RfdGhlb3JhX2RlY19jbGFzc19pbml0KSwKKwkodGhlb3JhX2dldF9mb3JtYXRzKSwgKHRoZW9yYV9kZWNfc3JjX2NvbnZlcnQpLAorCSh0aGVvcmFfZGVjX3NpbmtfY29udmVydCksICh0aGVvcmFfZGVjX3NyY19xdWVyeSksCisJKHRoZW9yYV9kZWNfc3JjX2V2ZW50KSwgKHRoZW9yYV9kZWNfZXZlbnQpLCAodGhlb3JhX2RlY19jaGFpbiksCisJKHRoZW9yYV9kZWNfY2hhbmdlX3N0YXRlKToKKwlEb24ndCBjcmFzaCBvbiBtaXNzaW5nIGhlYWRlciBwYWNrZXRzLgorCisyMDA0LTA4LTA5ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBwby9MSU5HVUFTOgorCSogcG8vc3EucG86CisJICBBZGRlZCBBbGJhbmlhbiB0cmFuc2xhdGlvbiAoTGF1cmVudCBEaGltYSkKKwkqIHBvL2NzLnBvOgorCSAgdXBkYXRlZAorCisyMDA0LTA4LTA5ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvbGFtZS9nc3RsYW1lLmM6CisJICBmaXgvYWRkIGRlYnVnZ2luZworCisyMDA0LTA4LTA5ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzoKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6CisJICBhc3NpZ24gYWxsIFRPT19MQVpZJ3MgdG8gYSByZWFsIGNhdGVnb3J5LiAgVGhhbmtzIHRvIFdhcnRoeSBXYXJ0aG9nLgorCisyMDA0LTA4LTA2ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X211bHRpZmRzaW5rX2NsYXNzX2luaXQpLAorCShnc3RfbXVsdGlmZHNpbmtfYWRkKSwgKGdzdF9tdWx0aWZkc2lua19nZXRfc3RhdHMpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xpZW50X3JlbW92ZSksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50X3JlYWQpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF93cml0ZSksCisJKGdzdF9tdWx0aWZkc2lua19xdWV1ZV9idWZmZXIpLCAoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRzKToKKwlNYWtlIHN1cmUgd2UgZG9uJ3QgdHJ5IHRvIHJlYWQgbW9yZSBmcm9tIGEgY2xpZW50IHRoYXQgd2hhdAorCWlvY3RsIHNheXMgdXMgb3Igd2UgZGVhZGxvY2suCisKKzIwMDQtMDgtMDUgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC92aWRlb3Rlc3RzcmMvZ3N0dmlkZW90ZXN0c3JjLmM6IChnc3RfdmlkZW90ZXN0c3JjX3NyY19saW5rKSwKKwkoZ3N0X3ZpZGVvdGVzdHNyY19jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3ZpZGVvdGVzdHNyY19zcmNfcXVlcnkpLAorCShnc3RfdmlkZW90ZXN0c3JjX2hhbmRsZV9zcmNfZXZlbnQpLCAoZ3N0X3ZpZGVvdGVzdHNyY19nZXQpOgorCSAgZGVjb3VwbGUgcnVubmluZ190aW1lIGFuZCBuX2ZyYW1lcyBzbyBpdCBjYW4gaGFuZGxlIGNoYW5naW5nCisJICBmcmFtZXJhdGUgd2hpbGUgcnVubmluZworCisyMDA0LTA4LTA1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBwby9ubC5wbzoKKwkqIHBvL3N2LnBvOgorCSAgdXBkYXRlZCB0cmFuc2xhdGlvbnMKKworMjAwNC0wOC0wNCAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvdmlkZW90ZXN0c3JjL2dzdHZpZGVvdGVzdHNyYy5jOgorCShnc3RfdmlkZW90ZXN0c3JjX2dldF9jYXBzbGlzdCksIChnZW5lcmF0ZV9jYXBzbGlzdCksCisJKHBsdWdpbl9pbml0KToKKwkgIGdlbmVyYXRlIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBjYXBzIGF0IHN0YXJ0dXAgYW5kIHJldXNlIGl0IGluc3RlYWQKKwkgIG9mIGFsd2F5cyBnZW5lcmF0aW5nIGl0CisKKzIwMDQtMDctMzAgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogKGdzdF9tdWx0aXBhcnRfbXV4X3BhZF9saW5rKToKKwkgIHdob29wcywgbGFzdCBjaGVja2luIGJyb2tlIG5vcm1hbCBidWlsZAorCisyMDA0LTA4LTAzICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FtaXhlci5jOiAoZ3N0X2Fsc2FfbWl4ZXJfZ2V0X3ZvbHVtZSksCisJKGdzdF9hbHNhX21peGVyX3NldF92b2x1bWUpLCAoZ3N0X2Fsc2FfbWl4ZXJfc2V0X211dGUpLAorCShnc3RfYWxzYV9taXhlcl9zZXRfcmVjb3JkKSwgKGdzdF9hbHNhX21peGVyX3NldF9vcHRpb24pLAorCShnc3RfYWxzYV9taXhlcl9nZXRfb3B0aW9uKToKKwkqIGV4dC9kdmRuYXYvZHZkbmF2c3JjLmM6IChkdmRuYXZfZ2V0X2V2ZW50X25hbWUpLAorCShkdmRuYXZzcmNfcHJpbnRfZXZlbnQpOgorCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoX2ZpbmRfY2hhaW5fcHJvY2VzcyksIChnc3Rfb2dnX3ByaW50KToKKwkqIGV4dC9vZ2cvZ3N0b2dnbXV4LmM6IChnc3Rfb2dnX211eF9wYWRfbGluayksCisJKGdzdF9vZ2dfbXV4X3BhZF91bmxpbmspOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogKGdzdF9tdWx0aXBhcnRfbXV4X3BhZF9saW5rKSwKKwkoZ3N0X211bHRpcGFydF9tdXhfcGFkX3VubGluayk6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6CisJKGdzdF92aWRlb2JhbGFuY2VfY29sb3JiYWxhbmNlX3NldF92YWx1ZSk6CisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IChnc3RfdmlkZW9taXhlcl9wYWRfbGluayksCisJKGdzdF92aWRlb21peGVyX3BhZF91bmxpbmspOgorCSogcG8vdWsucG86CisJKiBzeXMvb3NzL2dzdG9zc21peGVyLmM6CisJKiBzeXMvdjRsL2dzdHY0bGNvbG9yYmFsYW5jZS5jOgorCSogc3lzL3Y0bC9nc3R2NGx0dW5lci5jOgorCSogc3lzL3Y0bC92NGxzcmNfY2FsbHMuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuYzoKKwkqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOgorCSAgY29tcGlsZSBmaXhlcyBmb3IgLS1kaXNhYmxlLWdzdC1kZWJ1ZywgR19ESVNBQkxFX0FTU0VSVCBhbmQgZnJpZW5kcworCisyMDA0LTA4LTAzICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4YW1wbGVzL2R5bnBhcmFtcy9maWx0ZXIuYzogKHVpX2NvbnRyb2xfY3JlYXRlKToKKwkqIGV4YW1wbGVzL2dzdHBsYXkvcGxheWVyLmM6IChwcmludF90YWcpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfcmVxdWVzdF9uZXdfcGFkKToKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka2FuaW1hdGlvbi5jOgorCShnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX21heV9hZHZhbmNlKToKKwkqIGV4dC9qYWNrL2dzdGphY2suYzogKGdzdF9qYWNrX3JlcXVlc3RfbmV3X3BhZCk6CisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X21hZF9pZDNfdG9fdGFnX2xpc3QpLAorCSh0YWdfbGlzdF90b19pZDNfdGFnX2ZvcmVhY2gpLCAoZ3N0X2lkM190YWdfaGFuZGxlX2V2ZW50KToKKwkqIGV4dC92b3JiaXMvb2dndm9yYmlzZW5jLmM6IChnc3Rfb2dndm9yYmlzZW5jX2dldF90YWdfdmFsdWUpOgorCSogZXh0L3ZvcmJpcy92b3JiaXNlbmMuYzogKGdzdF92b3JiaXNlbmNfZ2V0X3RhZ192YWx1ZSk6CisJKiBleHQveGluZS94aW5lYXVkaW9kZWMuYzogKGdzdF94aW5lX2F1ZGlvX2RlY19jaGFpbik6CisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLXRlc3QuYzogKHByaW50X3RhZyk6CisJKiBnc3Qvc2luZS9kZW1vLWRwYXJhbXMuYzogKG1haW4pOgorCSogZ3N0L3RhZ3MvZ3N0dm9yYmlzdGFnLmM6IChnc3RfdGFnX3RvX3ZvcmJpc19jb21tZW50cyk6CisJKiB0ZXN0c3VpdGUvYWxzYS9mb3JtYXRzLmM6IChjcmVhdGVfcGlwZWxpbmUpOgorCSogdGVzdHN1aXRlL2Fsc2Evc2luZXNyYy5jOiAoc2luZXNyY19mb3JjZV9jYXBzKSwgKHNpbmVzcmNfZ2V0KToKKwkgIGZpeGVzIGZvciBHX0RJU0FCTEVfQVNTRVJUIGFuZCBmcmllbmRzCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKGFhY190eXBlX2ZpbmQpLAorCShtcDNfdHlwZV9mcmFtZV9sZW5ndGhfZnJvbV9oZWFkZXIpLCAobXAzX3R5cGVfZmluZCksCisJKHBsdWdpbl9pbml0KToKKwkgIHJlcXVpcmUgbXAzIHR5cGVmaW5kaW5nIHRvIGhhdmUgYXQgbGVhc3QgTUlOX0hFQURFUlMgdmFsaWQgaGVhZGVycworCSAgYWRkIHR5cGVmaW5kaW5nIGZvciBBQUMgYWR0cyBmaWxlcworCisyMDA0LTA4LTA0ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOgorCShnc3RfeGltYWdlc2lua19jYWxjdWxhdGVfcGl4ZWxfYXNwZWN0X3JhdGlvKToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6CisJKGdzdF94dmltYWdlc2lua19jYWxjdWxhdGVfcGl4ZWxfYXNwZWN0X3JhdGlvKToKKwlNYWtlIHN1cmUgd2UgY2FsY3VsYXRlIHBpeGVsLWFzcGVjdC1yYXRpbyB1c2luZyBmbG9hdGluZyBwb2ludCBtYXRocworCisyMDA0LTA4LTAzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBwby91ay5wbzoKKwkgIHVwZGF0ZWQgdHJhbnNsYXRpb24KKworMjAwNC0wOC0wMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua194Y29udGV4dF9nZXQpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua194Y29udGV4dF9nZXQpOgorCSAgYWRkIGRlYnVnZ2luZyBmb3IgZGlzcGxheSBQQVIgY2FsY3VsYXRpb24KKworMjAwNC0wOC0wMiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb25maWd1cmUuYWM6IEZpeCBtaWttb2QgQ0ZMQUdTLgorCisyMDA0LTA3LTI3ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9hdWRpb3NjYWxlL2dzdGF1ZGlvc2NhbGUuYzoKKwktIGZpeCB0ZW1wbGF0ZXMgdG8gb25seSBzdXBwb3J0IFMxNiwgaXQncyB0aGUgb25seSBmb3JtYXQgdGhhdCB3b3JrcworCS0gbWFrZSBjYXBzIG5lZ28gY29kZSB1c2UgdHJ5X3NldF9jYXBzX25vbmZpeGVkIGFuZCBmaXhhdGlvbiBpbnN0ZWFkCisJb2YgdHJ5X3NldF9jYXBzIHR3aWNlLCB3aGljaCBpcyBub3QgbmljZSBmb3IgYXV0b3BsdWdnZXJzCisJLSBjaGFuZ2UgcmFuayB0byBzZWNvbmRhcnksIHNvIGF1dG9wbHVnZ2VycyBjYW4gcGljayBpdCB1cCBhZnRlcgorCWF1ZGlvY29udmVydAorCisyMDA0LTA4LTAyICBJYWluIDxpYWluQHByZXR0eXBlb3BsZS5vcmc+CisKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYyAoaW50ZXJsZWF2ZV9pbml0KSwKKwkoaW50ZXJsZWF2ZV9yZXF1ZXN0X25ld19wYWQpLAorCShpbnRlcmxlYXZlX3BhZF9yZW1vdmVkKSwKKwkoaW50ZXJsZWF2ZV9idWZmZXJlZF9sb29wKTogVXNlIHRoZSByZWFsIHBhZCBjb3VudCwgbm90IHRoZSBhcnRpZmljaWFsCisJb25lLgorCisyMDA0LTA4LTAyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6IGJ1bXAgbmFubyBiYWNrIHRvIGRldmVsb3BtZW50CisKKz09PSByZWxlYXNlIDAuOC4zID09PQorCisyMDA0LTA4LTAyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6IHJlbGVhc2luZyAwLjguMywgIldhdGVyIgorCisyMDA0LTA4LTAyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOgorCShnc3RfeHZpbWFnZXNpbmtfY2FsY3VsYXRlX3BpeGVsX2FzcGVjdF9yYXRpbyksCisJKGdzdF94dmltYWdlc2lua194Y29udGV4dF9jbGVhciksIChnc3RfeHZpbWFnZXNpbmtfc2lua19saW5rKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NoYW5nZV9zdGF0ZSksIChnc3RfeHZpbWFnZXNpbmtfYnVmZmVyX2FsbG9jKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3NldF9wcm9wZXJ0eSksIChnc3RfeHZpbWFnZXNpbmtfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2luaXQpLCAoZ3N0X3h2aW1hZ2VzaW5rX2NsYXNzX2luaXQpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuaDoKKwkgIGFwcGx5IHNpbWlsYXIgUEFSIGZpeGVzIGFzIHRvIHhpbWFnZXNpbmsKKworMjAwNC0wOC0wMiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCXBhdGNoIGZyb206IEJlbmphbWluIE90dGUKKworCSogZXh0L2xhbWUvZ3N0bGFtZS5jOiAoZ3N0X2xhbWVfc3JjX2xpbmspLCAoZ3N0X2xhbWVfaW5pdCk6CisJICBhZGQgbGluayBmdW5jdGlvbiB0byBsYW1lLiAgRml4ZXMgIzE0ODk4Ni4KKworMjAwNC0wOC0wMiAgSm9oYW4gRGFobGluICA8am9oYW5AZ25vbWUub3JnPgorCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jIChnc3RfbXVsdGlwYXJ0X211eF9uZXh0X2J1ZmZlcik6CisJZml4IGRlYnVnZ2luZyBsb2cKKworMjAwNC0wNy0zMCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbTogRml4IHRoaW5ncyB0aGF0IHNob3VsZCBoYXZlIGJlZW4KKwlmaXhlZCBpbiB0aGUgbGFzdCBjaGVja2luLgorCisyMDA0LTA3LTMwICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9tdWx0aXBhcnQvTWFrZWZpbGUuYW06IEZpeCB0aGluZ3MgdGhhdCBzaG91bGQgaGF2ZSBiZWVuCisJZml4ZWQgaW4gdGhlIGxhc3QgY2hlY2tpbi4KKworMjAwNC0wNy0zMCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiB0ZXN0c3VpdGUvbXVsdGlmaWxlc2luay9NYWtlZmlsZS5hbTogRml4IHVudXNlZCB2YXJpYWJsZS4KKworMjAwNC0wNy0zMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgYnVtcCBuYW5vIGZvciBwcmVyZWxlYXNlCisJKiBwby9hZi5wbzoKKwkqIHBvL2F6LnBvOgorCSogcG8vY3MucG86CisJKiBwby9lbl9HQi5wbzoKKwkqIHBvL2h1LnBvOgorCSogcG8vbmwucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorCSogcG8vdWsucG86CisJICB1cGRhdGVzCisKKzIwMDQtMDctMzAgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6IChnc3RfbXVsdGlmZHNpbmtfY2xhc3NfaW5pdCksCisJKGdzdF9tdWx0aWZkc2lua19hZGQpLCAoZ3N0X211bHRpZmRzaW5rX3JlbW92ZSksCisJKGdzdF9tdWx0aWZkc2lua19jbGVhciksIChnc3RfbXVsdGlmZHNpbmtfZ2V0X3N0YXRzKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9yZW1vdmUpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF93cml0ZSksCisJKGdzdF9tdWx0aWZkc2lua19xdWV1ZV9idWZmZXIpLCAoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRzKToKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuaDoKKwlSZWNvdmVyIGZyb20gYSBzZWxlY3Qgd2l0aCBhIGJhZCBmaWxlIGRlc2NyaXB0b3IgYnkgcmVtb3ZpbmcKKwl0aGUgY2xpZW50LgorCisyMDA0LTA3LTMwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBmaXggcmVxdWlyZW1lbnQgb2YgY29yZQorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5jOiAoZ3N0X3BsYXlfZXJyb3JfcGx1Z2luKSwKKwkoZ3N0X3BsYXlfcGlwZWxpbmVfc2V0dXApOgorCSAgZG9uJ3QgdXNlIGNvbG9yc3BhY2UgZWxlbWVudC4gIGRvIHVzZSBoZXJtZXNjb2xvcnNwYWNlIGVsZW1lbnQuCisJICBtYWtlIG1hY3JvIHRvIGdldCBhIGNvbG9yc3BhY2UgZWxlbWVudC4KKwkgIG1hcmsgc3RyaW5ncyBmb3IgdHJhbnNsYXRpb24uCisJKiBwby9QT1RGSUxFUy5pbjoKKwkgIGFkZCBwbGF5LmMKKwkqIHBvL2FmLnBvOgorCSogcG8vYXoucG86CisJKiBwby9jcy5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vaHUucG86CisJKiBwby9ubC5wbzoKKwkqIHBvL3NyLnBvOgorCSogcG8vc3YucG86CisJKiBwby91ay5wbzoKKwkgIHVwZGF0ZSB0cmFuc2xhdGlvbnMKKworMjAwNC0wNy0zMCAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5jOiAoZ3N0X3BuZ2VuY19jbGFzc19pbml0KToKKwlmaXggZGVmYXVsdCBmb3IgbmV3bWVkaWEgZmxhZworCisyMDA0LTA3LTMwICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzogKGdzdF90aGVvcmFfZGVjX2NsYXNzX2luaXQpLAorCShnc3RfdGhlb3JhX2RlY19pbml0KSwgKHRoZW9yYV9nZXRfZm9ybWF0cyksCisJKHRoZW9yYV9kZWNfc3JjX2NvbnZlcnQpLCAodGhlb3JhX2RlY19zaW5rX2NvbnZlcnQpLAorCSh0aGVvcmFfZGVjX3NyY19xdWVyeSksICh0aGVvcmFfZGVjX3NyY19ldmVudCksICh0aGVvcmFfZGVjX2V2ZW50KSwKKwkodGhlb3JhX2RlY19jaGFpbiksICh0aGVvcmFfZGVjX3NldF9wcm9wZXJ0eSksCisJKHRoZW9yYV9kZWNfZ2V0X3Byb3BlcnR5KToKKwkqIGV4dC90aGVvcmEvdGhlb3JhZW5jLmM6IChnc3RfYm9yZGVyX21vZGVfZ2V0X3R5cGUpLAorCShnc3RfdGhlb3JhX2VuY19jbGFzc19pbml0KSwgKGdzdF90aGVvcmFfZW5jX2luaXQpLAorCSh0aGVvcmFfZW5jX3NpbmtfbGluayksICh0aGVvcmFfZW5jX2NoYWluKSwKKwkodGhlb3JhX2VuY19zZXRfcHJvcGVydHkpLCAodGhlb3JhX2VuY19nZXRfcHJvcGVydHkpOgorCUFkZGVkIGNyb3BwaW5nIG9wdGlvbiB0byB0aGVvcmEgZGVjb2Rlci4KKwlBZGRlZCBib3JkZXIgb3B0aW9uIHRvIHRoZW9yYSBlbmNvZGVyLgorCisyMDA0LTA3LTMwICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6IChnc3RfcG5nZW5jX2NsYXNzX2luaXQpLAorCShnc3RfcG5nZW5jX2luaXQpLCAoZ3N0X3BuZ2VuY19jaGFpbiksIChnc3RfcG5nZW5jX2dldF9wcm9wZXJ0eSksCisJKGdzdF9wbmdlbmNfc2V0X3Byb3BlcnR5KToKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmg6CisJQWRkZWQgbmV3bWVkaWEgc3VwcG9ydCB0byBwbmdlbmMgc28gbm93IGdzdC1sYXVuY2gtMC44IHZpZGVvdGVzdHNyYyAhIGZmbXBlZ2NvbG9yc3BhY2UgISBwbmdlbmMgc25hcHNob3Q9ZmFsc2UgbmV3bWVkaWE9dHJ1ZSAhIG11bHRpZmlsZXNpbmsgbG9jYXRpb249YmxhaCVkLnBuZyB3b3JrcyBhcyBleHBlY3RlZAorCisyMDA0LTA3LTMwICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L3RoZW9yYS90aGVvcmFlbmMuYzogKGdzdF90aGVvcmFfZW5jX2NsYXNzX2luaXQpLAorCSh0aGVvcmFfZW5jX3NpbmtfbGluayksICh0aGVvcmFfZW5jX2NoYWluKSwKKwkodGhlb3JhX2VuY19zZXRfcHJvcGVydHkpLCAodGhlb3JhX2VuY19nZXRfcHJvcGVydHkpOgorCUZpeCBlbmNvZGluZyBvZiBub24tbXVsdGlwbGUtb2YtMTYgdmlkZW8uCisKKzIwMDQtMDctMjkgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29uZmlndXJlLmFjOiBtYWtlIHRlc3QgZm9yIGF1ZGlvZmlsZSBtb3JlIHN0cmljdAorCisyMDA0LTA3LTI1ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAocGx1Z2luX2luaXQpOgorCSAgZ2l2ZSBkaWZmZXJlbnQgbmFtZXMgdG8gdHlwZWZpbmQgZnVuY3Rpb25zCisKKzIwMDQtMDctMjggIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfcmVuZWdvdGlhdGVfc2l6ZSksCisJKGdzdF94aW1hZ2VzaW5rX2NhbGN1bGF0ZV9waXhlbF9hc3BlY3RfcmF0aW8pLAorCShnc3RfeGltYWdlc2lua194Y29udGV4dF9nZXQpLCAoZ3N0X3hpbWFnZXNpbmtfZ2V0Y2FwcyksCisJKGdzdF94aW1hZ2VzaW5rX3NpbmtfbGluayksIChnc3RfeGltYWdlc2lua19jaGFuZ2Vfc3RhdGUpLAorCShnc3RfeGltYWdlc2lua19zZXRfeHdpbmRvd19pZCksIChnc3RfeGltYWdlc2lua19zZXRfcHJvcGVydHkpLAorCShnc3RfeGltYWdlc2lua19nZXRfcHJvcGVydHkpLCAoZ3N0X3hpbWFnZXNpbmtfaW5pdCk6CisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuaDoKKwkgIGFsbG9jYXRlIFBBUidzIGR5bmFtaWNhbGx5LgorCSAgdXNlIGF1dG9kZXRlY3RlZCBQQVIgaWYgbm8gb2JqZWN0LXNldCBQQVIgaXMgZ2l2ZW4uCisJICBhZGQgd29ya2Fyb3VuZCBmb3IgZGlyZWN0ZmIncyBYIG5vdCBzZXR0aW5nIHBoeXNpY2FsIHNpemUuCisJICBmaXggdG8geHZpbWFnZXNpbmsgd2lsbCBmb2xsb3cgdG9tb3Jyb3cuCisKKzIwMDQtMDctMjggIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogZXh0L2xhbWUvZ3N0bGFtZS5jOiAoZ3N0X2xhbWVfY2hhaW4pOiBzZW5kIHRhZyBldmVudHMgZG93bnN0cmVhbQorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzogKGdzdF9zaG91dDJzZW5kX3Byb3RvY29sX2dldF90eXBlKSwKKwkoZ3N0X3Nob3V0MnNlbmRfZ2V0X3R5cGUpLCAoZ3N0X3Nob3V0MnNlbmRfc2V0X2Nsb2NrKSwKKwkoZ3N0X3Nob3V0MnNlbmRfY2xhc3NfaW5pdCksIChnc3Rfc2hvdXQyc2VuZF9pbml0KSwKKwkoc2V0X3Nob3V0X21ldGFkYXRhKSwgKGdzdF9zaG91dDJzZW5kX3NldF9tZXRhZGF0YSksCisJKGdzdF9zaG91dDJzZW5kX2NoYWluKSwgKGdzdF9zaG91dDJzZW5kX3NldF9wcm9wZXJ0eSksCisJKGdzdF9zaG91dDJzZW5kX2dldF9wcm9wZXJ0eSksIChnc3Rfc2hvdXQyc2VuZF9jb25uZWN0KSwKKwkoZ3N0X3Nob3V0MnNlbmRfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmg6CisJLSBmaXggZm9yIHNlbmRpbmcgbXAzIGF1ZGlvIHRvIGljZWNhc3QyIHNlcnZlciwgaWYgcGFkIGxpbmsgZnVuY3Rpb24gbm90CisJY2FsbGVkIGJlZm9yZSBQQVVTRUQgc3RhdGUKKwktIGFkZGVkIG9wdGlvbiB0byB1c2UgR1N0cmVhbWVyIGNsb2NrIHN5bmMgKGFzIG9wcG9zZWQgdG8gbGlic2hvdXQncyBvd24gc3luYykKKwktIGFkZGVkIHRhZ2dpbmcgc3VwcG9ydCBmb3IgbXAzIGF1ZGlvIGJyb2FkY2FzdGVkCisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOiAoZ3N0X21vbm9zY29wZV9jbGFzc19pbml0KToKKwlkZWJ1ZyBpbmZvCisKKzIwMDQtMDctMjggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X3NyY19xdWVyeSksCisJKGdzdF9vZ2dfZGVtdXhfcHVzaCk6CisJUmV0dXJuIHF1ZXJ5IGZhaWx1cmUgd2hlbiB3ZSBkb24ndCBrbm93IHRoZSBsZW5ndGggb2YKKwlhbiBvZ2cgc3RyZWFtIGluc3RlZGEgb2YgcmV0dXJuaW5nIFRSVUUgd2l0aCBhIGJvZ3VzIHZhbHVlLgorCisyMDA0LTA3LTI4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzogKHRoZW9yYV9nZXRfZm9ybWF0cyksCisJKHRoZW9yYV9kZWNfc3JjX2NvbnZlcnQpLCAodGhlb3JhX2RlY19zaW5rX2NvbnZlcnQpLAorCSh0aGVvcmFfZGVjX3NyY19xdWVyeSksICh0aGVvcmFfZGVjX3NyY19ldmVudCksICh0aGVvcmFfZGVjX2V2ZW50KSwKKwkodGhlb3JhX2RlY19jaGFpbik6CisJRG9uJ3Qgc2NyZXcgdXAgdGhlIDEgQ2hyb21hIGZvciAxIGx1bWEgc2FtcGxlIHNpdHVhdGlvbiB3aGVuIHdlCisJaGF2ZSBhbiBvZGQgb2Zmc2V0L3dpZHRoIGJ5IGFkZGluZyBhIGJsYWNrIGJvcmRlciBpbiB0aG9zZSBjYXNlcy4KKworMjAwNC0wNy0yOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6ICh0aGVvcmFfZ2V0X2Zvcm1hdHMpLAorCSh0aGVvcmFfZGVjX3NyY19jb252ZXJ0KSwgKHRoZW9yYV9kZWNfc2lua19jb252ZXJ0KSwKKwkodGhlb3JhX2RlY19zcmNfcXVlcnkpLCAodGhlb3JhX2RlY19zcmNfZXZlbnQpLCAodGhlb3JhX2RlY19ldmVudCksCisJKHRoZW9yYV9kZWNfY2hhaW4pOgorCSogZXh0L3RoZW9yYS90aGVvcmFlbmMuYzogKHRoZW9yYV9lbmNfc2lua19saW5rKToKKwlBZGRlZCBmaXJzdCBhdHRlbXB0IGF0IGNyb3BwaW5nIG9mIHRoZSBpbWFnZSBhcyByZXF1aXJlZCBieSB0aGUKKwl0aGVvcmEgc3BlYy4gV2UgbmVlZCBtb3JlIHByb3BlcnRpZXMgaW4gdGhlIGNhcHMgKG9mZnNldF94LAorCW9mZnNldF95LHN0cmlkZSkgdG8gaW1wbGVtZW50IHRoaXMgY29ycmVjdGx5LgorCisyMDA0LTA3LTI4ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGV4dC9kdmRuYXYvUkVBRE1FOgorCSAgVXBkYXRlIHRoZSBSRUFETUUgdG8gdXNlIGR2ZGRlbXV4CisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOiAoZ3N0X3BpeGJ1ZnNjYWxlX2dldGNhcHMpOgorCSAgRW5zdXJlIGdldGNhcHMgcmV0dXJucyBhIHN1YnNldCBvZiB0aGUgdGVtcGxhdGUgY2FwcworCSogZ3N0L21wZWcyc3ViL2dzdG1wZWcyc3VidC5jOiAoZ3N0X21wZWcyc3VidF9iYXNlX2luaXQpLAorCShnc3RfbXBlZzJzdWJ0X2luaXQpOgorCSAgRW5zdXJlIGdldGNhcHMgcmV0dXJucyBhIHN1YnNldCBvZiB0aGUgdGVtcGxhdGUgY2FwcworCSogZ3N0L21wZWdzdHJlYW0vZ3N0ZHZkZGVtdXguYzogKGdzdF9kdmRfZGVtdXhfY2xhc3NfaW5pdCksCisJKGdzdF9kdmRfZGVtdXhfaW5pdCksIChnc3RfZHZkX2RlbXV4X2dldF92aWRlb19zdHJlYW0pLAorCShnc3RfZHZkX2RlbXV4X2dldF9zdWJwaWN0dXJlX3N0cmVhbSksCisJKGdzdF9kdmRfZGVtdXhfc2VuZF9zdWJidWZmZXIpLCAoZ3N0X2R2ZF9kZW11eF9zZXRfY3VyX3N1YnBpY3R1cmUpOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0ZHZkZGVtdXguaDoKKwkgIFNldCB0aGUgZXhwbGljaXQgY2FwcyBvbiB0aGUgY3VycmVudF92aWRlbyBwYWQgYmVmb3JlIHB1c2hpbmcKKwkgIGFueXRoaW5nCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguYzogKGdzdF9tcGVnX2RlbXV4X2dldF92aWRlb19zdHJlYW0pLAorCShnc3RfbXBlZ19kZW11eF9nZXRfYXVkaW9fc3RyZWFtKToKKwkgIEZyZWUgY2FwcyB1c2VkIHRvIGdzdF9wYWRfc2V0X2V4cGxpY2l0X2NhcHMsIHdoaWNoIHRha2VzIGEgY29uc3QKKwkgIEdzdENhcHMgKgorCisyMDA0LTA3LTI4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6IHVwZGF0ZSBHU3RyZWFtZXIgcmVxdWlyZW1lbnQgdG8gMC44LjQgYmVjYXVzZSBvZgorCSAgR3N0RnJhY3Rpb24uCisKKzIwMDQtMDctMjggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9mbXQpLAorCShnc3Rfd2F2cGFyc2VfaGFuZGxlX3NlZWspLCAoZ3N0X3dhdnBhcnNlX3NyY3BhZF9ldmVudCk6CisJQWRkIHRoZSBwYWQgdG8gdGhlIGVsZW1lbnQgYWZ0ZXIgc2V0dGluZyB1cCB0aGUgY2Fwcy4gVGhpcworCW1ha2VzIGl0IGEgbG90IGVhc2llciB0byBhdXRvcGx1Zy4KKworMjAwNC0wNy0yNyAgU3RldmUgTGhvbW1lICA8c3RldmUubGhvbW1lQGZyZWUuZnI+CisKKwkqIGdzdC9tZWRpYW4vZ3N0bWVkaWFuLmM6CisJKiBnc3QvbXBlZzJzdWJ0L2dzdG1wZWcyc3VidC5jOgorCSogZ3N0L21wZWdhdWRpb3BhcnNlL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5jOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2RlbXV4LmM6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVncGFja2V0aXplLmM6CisJKiBnc3QvcnRqcGVnL2dzdHJ0anBlZy5jOgorCSogZ3N0L3J0anBlZy9nc3RydGpwZWdkZWMuYzoKKwkqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZW5jLmM6CisJKiBnc3Qvc2luZS9nc3RzaW5lc3JjLmM6CisJKiBnc3Qvc21vb3RoL2dzdHNtb290aC5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuaDoKKwkqIGdzdC9zdGVyZW8vZ3N0c3RlcmVvLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzoKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZpbHRlci5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5jOgorCSogZ3N0L3ZpZGVvc2NhbGUvZ3N0dmlkZW9zY2FsZS5jOgorCSogZ3N0L3ZpZGVvc2NhbGUvdmlkZW9zY2FsZS5jOgorCSogZ3N0L3ZpZGVvdGVzdHNyYy9nc3R2aWRlb3Rlc3RzcmMuYzoKKwkqIGdzdC92aWRlb3Rlc3RzcmMvdmlkZW90ZXN0c3JjLmM6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJICBmaXggbG9jYWwgaW5jbHVkZXMgYW5kIDY0IGJpdHMgY29uc3RhbnRzCisKKzIwMDQtMDctMjcgIFN0ZXZlIExob21tZSAgPHN0ZXZlLmxob21tZUBmcmVlLmZyPgorCisJKiB3aW4zMi9nc3Quc2xuOgorCSogZ3N0LWxpYnMvZ3N0LyovKi52Y3Byb2o6CisJKiBnc3QvKi8qLnZjcHJvajoKKwkgIG1vcmUgd29ya2luZyBwbHVnaW5zCisKKzIwMDQtMDctMjcgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogdGVzdHN1aXRlL2Fsc2EvTWFrZWZpbGUuYW06CisJKiB0ZXN0c3VpdGUvYWxzYS9zcmNzdGF0ZS5jOgorCWFkZCB0ZXN0IGZvciBhbHNhc3JjIGNoYW5naW5nIHN0YXRlCisKKzIwMDQtMDctMjcgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogZ3N0L3NpbGVuY2UvZ3N0c2lsZW5jZS5jOiAoZ3N0X3NpbGVuY2VfaW5pdCksIChnc3Rfc2lsZW5jZV9saW5rKSwKKwkoZ3N0X3NpbGVuY2VfZ2V0KToKKwkqIGdzdC9zaWxlbmNlL2dzdHNpbGVuY2UuaDoKKwlmaXggc2lsZW5jZSBnZW5lcmF0aW9uIGZvciAxNmJpdCByYXcgYXVkaW8KKworMjAwNC0wNy0yNyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9tZXRhZGF0YSksCisJKGdzdF9tYXRyb3NrYV9kZW11eF92aWRlb19jYXBzKSwgKGdzdF9tYXRyb3NrYV9kZW11eF9wbHVnaW5faW5pdCk6CisJKiBnc3QvbXBlZ2F1ZGlvL2NvbW1vbi5jOgorCSogZ3N0L3ZpZGVvc2NhbGUvZ3N0dmlkZW9zY2FsZS5jOiAoZ3N0X3ZpZGVvc2NhbGVfY2xhc3NfaW5pdCksCisJKGdzdF92aWRlb3NjYWxlX2dldGNhcHMpLCAoZ3N0X3ZpZGVvc2NhbGVfbGluayksCisJKGdzdF92aWRlb3NjYWxlX3NyY19maXhhdGUpLCAoZ3N0X3ZpZGVvc2NhbGVfaW5pdCksCisJKGdzdF92aWRlb3NjYWxlX2ZpbmFsaXplKToKKwkqIGdzdC92aWRlb3NjYWxlL2dzdHZpZGVvc2NhbGUuaDoKKwkqIGdzdC92aWRlb3Rlc3RzcmMvZ3N0dmlkZW90ZXN0c3JjLmM6CisJKGdzdF92aWRlb3Rlc3RzcmNfZ2V0X2NhcHNsaXN0KToKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6CisJKiBzeXMvb3NzL2dzdG9zc21peGVyLmM6IChmaWxsX2xhYmVscyk6CisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3JlbmVnb3RpYXRlX3NpemUpLAorCShnc3RfeGltYWdlc2lua19oYW5kbGVfeGV2ZW50cyksCisJKGdzdF94aW1hZ2VzaW5rX2NhbGN1bGF0ZV9waXhlbF9hc3BlY3RfcmF0aW8pLAorCShnc3RfeGltYWdlc2lua194Y29udGV4dF9nZXQpLCAoZ3N0X3hpbWFnZXNpbmtfZml4YXRlKSwKKwkoZ3N0X3hpbWFnZXNpbmtfZ2V0Y2FwcyksIChnc3RfeGltYWdlc2lua19zaW5rX2xpbmspLAorCShnc3RfeGltYWdlc2lua19jaGFpbiksIChnc3RfeGltYWdlc2lua19zZXRfeHdpbmRvd19pZCksCisJKGdzdF94aW1hZ2VzaW5rX3NldF9wcm9wZXJ0eSksIChnc3RfeGltYWdlc2lua19nZXRfcHJvcGVydHkpLAorCShnc3RfeGltYWdlc2lua19pbml0KSwgKGdzdF94aW1hZ2VzaW5rX2NsYXNzX2luaXQpOgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmg6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOgorCShnc3RfeHZpbWFnZXNpbmtfY2FsY3VsYXRlX3BpeGVsX2FzcGVjdF9yYXRpbyksCisJKGdzdF94dmltYWdlc2lua194Y29udGV4dF9nZXQpLCAoZ3N0X3h2aW1hZ2VzaW5rX3NpbmtfbGluayksCisJKGdzdF94dmltYWdlc2lua19jaGFpbiksIChnc3RfeHZpbWFnZXNpbmtfYnVmZmVyX2FsbG9jKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3NldF9wcm9wZXJ0eSksIChnc3RfeHZpbWFnZXNpbmtfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2luaXQpLCAoZ3N0X3h2aW1hZ2VzaW5rX2NsYXNzX2luaXQpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuaDoKKwkgIGZpcnN0IGJhdGNoIG9mIHBpeGVsIGFzcGVjdCByYXRpbyBjb21taXRzLgorCisyMDA0LTA3LTI3ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2xvcnNwYWNlLmM6CisJKGdzdF9mZm1wZWdjb2xvcnNwYWNlX2NsYXNzX2luaXQpLCAoZ3N0X2ZmbXBlZ2NvbG9yc3BhY2VfY2hhaW4pOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvaW1nY29udmVydC5jOiAoYXZwaWN0dXJlX2ZpbGwpOgorCSAgaGFuZGxlIHN0cmlkZSwgbmVlZHMgd29yayBpZiB3ZSB3YW50IHRvIG1vdmUgc3RyaWRlIGhhbmRsaW5nCisJICB1cHN0cmVhbSwgYnV0IHdvcmtzIGNvcnJlY3RseSBmb3Igb3VyIHB1cnBvc2VzLgorCisyMDA0LTA3LTI3ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvdmlkZW9zY2FsZS9SRUFETUU6CisJICBhZGQgdGVzdGluZyBleGFtcGxlcworCSogZ3N0L3ZpZGVvc2NhbGUvZ3N0dmlkZW9zY2FsZS5jOiAoZ3N0X3ZpZGVvc2NhbGVfbGluayksCisJKGdzdF92aWRlb3NjYWxlX2NoYWluKToKKwkqIGdzdC92aWRlb3NjYWxlL3ZpZGVvc2NhbGUuYzogKGdzdF92aWRlb3NjYWxlX3NldHVwKSwKKwkoZ3N0X3ZpZGVvc2NhbGVfZ2V0X3NpemUpOgorCSAgYWRkIGdldF9zaXplIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBzdHJpZGUgbGlrZSB2aWRlb3Rlc3RzcmMuCisJICBmaXhlcyBjb252ZXJzaW9uIGZvciBZVVYgZm9ybWF0cyBmb3IgYXMgbXVjaCBhcyBJIGNhbiB0ZXN0IHRoZW0uCisKKzIwMDQtMDctMjcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfY2hlY2tfeHNobV9jYWxscyksCisJKGdzdF94aW1hZ2VzaW5rX3hpbWFnZV9uZXcpLCAoZ3N0X3hpbWFnZXNpbmtfeGltYWdlX2Rlc3Ryb3kpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19jaGVja194c2htX2NhbGxzKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3h2aW1hZ2VfbmV3KSwgKGdzdF94dmltYWdlc2lua194dmltYWdlX2Rlc3Ryb3kpLAorCShnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9wdXQpOgorCSAgZnVydGhlciBjbGVhbnVwcywgbG9nZ2luZywgZXJyb3IgaGFuZGxpbmcgYW5kIHN5bmNocm9uaXppbmcKKworMjAwNC0wNy0yNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXIuYzogKGdzdF92aWRlb21peGVyX3BhZF9nZXRfdHlwZSksCisJKGdzdF92aWRlb21peGVyX3BhZF9jbGFzc19pbml0KSwgKGdzdF92aWRlb21peGVyX3BhZF9nZXRfcHJvcGVydHkpLAorCShnc3RfdmlkZW9taXhlcl9wYWRfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfcGFkX3Npbmtjb25uZWN0KSwgKGdzdF92aWRlb21peGVyX3BhZF9pbml0KSwKKwkoZ3N0X3ZpZGVvX21peGVyX2JhY2tncm91bmRfZ2V0X3R5cGUpLCAoZ3N0X3ZpZGVvbWl4ZXJfZ2V0X3R5cGUpLAorCShnc3RfdmlkZW9taXhlcl9jbGFzc19pbml0KSwgKGdzdF92aWRlb21peGVyX2luaXQpLAorCShnc3RfdmlkZW9taXhlcl9nZXRjYXBzKSwgKGdzdF92aWRlb21peGVyX3JlcXVlc3RfbmV3X3BhZCksCisJKGdzdF92aWRlb21peGVyX2JsZW5kX2F5dXZfaTQyMCksIChwYWRfem9yZGVyX2NvbXBhcmUpLAorCShnc3RfdmlkZW9taXhlcl9zb3J0X3BhZHMpLCAoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9jaGVja2VyKSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9jb2xvciksIChnc3RfdmlkZW9taXhlcl9maWxsX3F1ZXVlcyksCisJKGdzdF92aWRlb21peGVyX2JsZW5kX2J1ZmZlcnMpLCAoZ3N0X3ZpZGVvbWl4ZXJfdXBkYXRlX3F1ZXVlcyksCisJKGdzdF92aWRlb21peGVyX2xvb3ApLCAocGx1Z2luX2luaXQpOgorCUJlIGEgbmljZXIgbmVnb3RpYXRpb24gY2l0aXplbiBhbmQgcHJvdmlkZSBhIGdldGNhcHMgZnVuY3Rpb24gb24KKwl0aGUgc3JjcGFkLiBUaGlzIGFsc28gZml4ZXMgYSBjcmFzaCB3aGVuIHJlc2l6aW5nLgorCisyMDA0LTA3LTI3ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfY2hlY2tfeHNobV9jYWxscyksCisJKGdzdF94dmltYWdlc2lua194dmltYWdlX25ldyk6IFNvbWUgZml4ZXMgdG8gaW1hZ2Ugc2l6ZSBjYWxjdWxhdGlvbi4KKworMjAwNC0wNy0yNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6IChnc3RfcG5nZGVjX3NyY19nZXRjYXBzKToKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6IChnc3RfcG5nZW5jX2NsYXNzX2luaXQpLAorCShnc3RfcG5nZW5jX2luaXQpLCAoZ3N0X3BuZ2VuY19jaGFpbiksIChnc3RfcG5nZW5jX2dldF9wcm9wZXJ0eSksCisJKGdzdF9wbmdlbmNfc2V0X3Byb3BlcnR5KToKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmg6CisJQWRkZWQgc25hcHNob3QgcHJvcGVydHkgdG8gcG5nZW5jLgorCXJlbW92ZWQgZ19wcmludCBmcm9tIHBuZ2RlYworCisyMDA0LTA3LTI3ICBTdGV2ZSBMaG9tbWUgIDxzdGV2ZS5saG9tbWVAZnJlZS5mcj4KKworCSogZ3N0L2FjM3BhcnNlL2FjM3BhcnNlLnZjcHJvagorCSogZ3N0L2FkZGVyL2FkZGVyLnZjcHJvagorCSogZ3N0L2FscGhhL2FscGhhLnZjcHJvagorCSogZ3N0L2FscGhhL2FscGhhY29sb3IudmNwcm9qCisJKiBnc3QvYXNmZGVtdXgvYXNmLnZjcHJvagorCSogZ3N0L2F1ZGlvY29udmVydC9hdWRpb2NvbnZlcnQudmNwcm9qCisJKiBnc3QvYXVkaW9yYXRlL2F1ZGlvcmF0ZS52Y3Byb2oKKwkqIGdzdC9hdWRpb3NjYWxlL2F1ZGlvc2NhbGUudmNwcm9qCisJKiBnc3QvYXVwYXJzZS9hdXBhcnNlLnZjcHJvagorCSogZ3N0L2F2aS9hdmkudmNwcm9qCisJKiBnc3QvY2R4YXBhcnNlL2NkeGFwYXJzZS52Y3Byb2oKKwkqIGdzdC9jaGFydC9jaGFydC52Y3Byb2oKKwkqIGdzdC9jb2xvcnNwYWNlL2NvbG9yc3BhY2UudmNwcm9qCisJKiBnc3QvY3V0dGVyL2N1dHRlci52Y3Byb2oKKwkqIGdzdC9kZWJ1Zy9kZWJ1Zy52Y3Byb2oKKwkqIGdzdC9kZWJ1Zy9lZmVuY2UudmNwcm9qCisJKiBnc3QvZGVidWcvbmF2aWdhdGlvbnRlc3QudmNwcm9qCisJKiBnc3QvZGVpbnRlcmxhY2UvZGVpbnRlcmxhY2UudmNwcm9qCisJKiBnc3QvZWZmZWN0di9lZmZlY3R2LnZjcHJvagorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZmZtcGVnY29sb3JzcGFjZS52Y3Byb2oKKwkqIGdzdC9maWx0ZXIvZmlsdGVyLnZjcHJvagorCSogZ3N0L2ZseC9mbHhkZWMudmNwcm9qCisJKiBnc3QvZ29vbS9nb29tLnZjcHJvagorCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS52Y3Byb2oKKwkqIGdzdC9sYXcvYWxhdy52Y3Byb2oKKwkqIGdzdC9sYXcvbXVsYXcudmNwcm9qCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EudmNwcm9qCisJKiBnc3QvbWVkaWFuL21lZGlhbi52Y3Byb2oKKwkqIGdzdC9taXhtYXRyaXgvbWl4bWF0cml4LnZjcHJvagorCSogZ3N0L21wZWcxc3lzL21wZWcxc3lzdGVtZW5jb2RlLnZjcHJvagorCSogZ3N0L21wZWcxdmlkZW9wYXJzZS9tcDF2aWRlb3BhcnNlLnZjcHJvagorCSogZ3N0L21wZWcyc3ViL21wZWcyc3VidC52Y3Byb2oKKwkqIGdzdC9tcGVnYXVkaW8vbXBlZ2F1ZGlvLnZjcHJvagorCSogZ3N0L21wZWdhdWRpb3BhcnNlL21wZWdhdWRpb3BhcnNlLnZjcHJvagorCSogZ3N0L21wZWdzdHJlYW0vbXBlZ3N0cmVhbS52Y3Byb2oKKwkqIGdzdC9tdWx0aWZpbGVzaW5rL211bHRpZmlsZXNpbmsudmNwcm9qCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydC52Y3Byb2oKKwkqIGdzdC9vbmV0b24vb25ldG9uLnZjcHJvagorCSogZ3N0L292ZXJsYXkvb3ZlcmxheS52Y3Byb2oKKwkqIGdzdC9wYXNzdGhyb3VnaC9wYXNzdGhyb3VnaC52Y3Byb2oKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXgudmNwcm9qCisJKiBnc3QvcmVhbG1lZGlhL3JtZGVtdXgudmNwcm9qCisJKiBnc3QvcnRqcGVnL3J0anBlZy52Y3Byb2oKKwkqIGdzdC9ydHAvcnRwLnZjcHJvagorCSogZ3N0L3NpbGVuY2Uvc2lsZW5jZS52Y3Byb2oKKwkqIGdzdC9zaW5lL3NpbmVzcmMudmNwcm9qCisJKiBnc3Qvc21vb3RoL3Ntb290aC52Y3Byb2oKKwkqIGdzdC9zbXB0ZS9zbXB0ZS52Y3Byb2oKKwkqIGdzdC9zcGVjdHJ1bS9zcGVjdHJ1bS52Y3Byb2oKKwkqIGdzdC9zcGVlZC9zcGVlZC52Y3Byb2oKKwkqIGdzdC9zdGVyZW8vc3RlcmVvLnZjcHJvagorCSogZ3N0L3N3aXRjaC9zd2l0Y2gudmNwcm9qCisJKiBnc3QvdGFncy90YWdlZGl0LnZjcHJvagorCSogZ3N0L3RjcC90Y3AudmNwcm9qCisJKiBnc3QvdHlwZWZpbmQvdHlwZWZpbmRmdW5jdGlvbnMudmNwcm9qCisJKiBnc3QvdWRwL3VkcC52Y3Byb2oKKwkqIGdzdC92aWRlb2JveC92aWRlb2JveC52Y3Byb2oKKwkqIGdzdC92aWRlb2Nyb3AvdmlkZW9jcm9wLnZjcHJvagorCSogZ3N0L3ZpZGVvZHJvcC92aWRlb2Ryb3AudmNwcm9qCisJKiBnc3QvdmlkZW9maWx0ZXIvZ2FtbWEudmNwcm9qCisJKiBnc3QvdmlkZW9maWx0ZXIvdmlkZW9iYWxhbmNlLnZjcHJvagorCSogZ3N0L3ZpZGVvZmlsdGVyL3ZpZGVvZmlsdGVyLnZjcHJvagorCSogZ3N0L3ZpZGVvZmlsdGVyL3ZpZGVvZmxpcC52Y3Byb2oKKwkqIGdzdC92aWRlb2ZsaXAvdmlkZW9mbGlwLnZjcHJvagorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci52Y3Byb2oKKwkqIGdzdC92aWRlb3JhdGUvdmlkZW9yYXRlLnZjcHJvagorCSogZ3N0L3ZpZGVvc2NhbGUvdmlkZW9zY2FsZS52Y3Byb2oKKwkqIGdzdC92aWRlb3Rlc3RzcmMvdmlkZW90ZXN0c3JjLnZjcHJvagorCSogZ3N0L3ZpcnR1YWxkdWIvdmlydHVhbGR1Yi52Y3Byb2oKKwkqIGdzdC92b2xlbnYvdm9sZW52LnZjcHJvagorCSogZ3N0L3ZvbHVtZS92b2x1bWUudmNwcm9qCisJKiBnc3Qvd2F2ZW5jL3dhdmVuYy52Y3Byb2oKKwkqIGdzdC93YXZwYXJzZS93YXZwYXJzZS52Y3Byb2oKKwkqIGdzdC95NG0veTRtZW5jLnZjcHJvagorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2F1ZGlvLnZjcHJvagorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2F1ZGlvZmlsdGVyLnZjcHJvagorCSogZ3N0LWxpYnMvZ3N0L2NvbG9yYmFsYW5jZS9jb2xvcmJhbGFuY2UudmNwcm9qCisJKiBnc3QtbGlicy9nc3QvaWRjdC9pZHRjLnZjcHJvagorCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby52Y3Byb2oKKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlci52Y3Byb2oKKwkqIGdzdC1saWJzL2dzdC9uYXZpZ2F0aW9uL25hdmlnYXRpb24udmNwcm9qCisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5LnZjcHJvagorCSogZ3N0LWxpYnMvZ3N0L3Byb3BlcnR5cHJvYmUvcHJvcGVydHlwcm9iZS52Y3Byb2oKKwkqIGdzdC1saWJzL2dzdC9yZXNhbXBsZS9yZXNhbXBsZS52Y3Byb2oKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYudmNwcm9qCisJKiBnc3QtbGlicy9nc3QvdHVuZXIvdHVuZXIudmNwcm9qCisJKiBnc3QtbGlicy9nc3QvdmlkZW8vdmlkZW8udmNwcm9qCisJKiBnc3QtbGlicy9nc3QveG92ZXJsYXkveG92ZXJsYXkudmNwcm9qCisJICBhdm9pZCBwcm9ibGVtcyB3aXRoIG1hdGguaCwgZml4IHJlbGVhc2UgZGVwZW5kYW5jeQorCSAgcmVuYW1lIEdTdHJlYW1lci0wLjgubGliIHRvIGxpYmdzdHJlYW1lci5saWIKKworMjAwNC0wNy0yNyAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3h3aW5kb3dfZGVjb3JhdGUpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua194d2luZG93X2RlY29yYXRlKTogV2hlbgorCXRoZSBhdG9tIGlzIG5vdCBhdmFpbGFibGUgd2UgaGF2ZSB0byB1bmxvY2sgdGhlIG11dGV4LiBGaXhlcyAjMTQ4MDIzCisKKzIwMDQtMDctMjYgIFN0ZXZlIExob21tZSAgPHN0ZXZlLmxob21tZUBmcmVlLmZyPgorCisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLmg6CisJICBpc3N1ZSBmb3IgYSB2YXJhcmcgbWFjcm8gd2l0aCBNU1ZDCisKKzIwMDQtMDctMjYgIFN0ZXZlIExob21tZSAgPHN0ZXZlLmxob21tZUBmcmVlLmZyPgorCisJKiBnc3QvZWZmZWN0di9lZmZlY3R2LnZjcHJvagorCSogZ3N0LWxpYnMvZ3N0L2lkY3QvaWRjdC52Y3Byb2o6CisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLnZjcHJvajoKKwkqIGdzdC1saWJzL2dzdC9uYXZpZ2F0aW9uL25hdmlnYXRpb24udmNwcm9qOgorCSogZ3N0LWxpYnMvZ3N0L3Byb3BlcnR5cHJvYmUvcHJvcGVydHlwcm9iZS52Y3Byb2o6CisJKiBnc3QtbGlicy9nc3QvdmlkZW8vdmlkZW8udmNwcm9qOgorCSogZ3N0LWxpYnMvZ3N0L3hvdmVybGF5L3hvdmVybGF5LnZjcHJvajoKKwkgIGZpeGVzIGZvciBidWlsZCBwcm9ibGVtcworCisyMDA0LTA3LTI2ICBTdGV2ZSBMaG9tbWUgIDxzdGV2ZS5saG9tbWVAZnJlZS5mcj4KKworCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2F1ZGlvLmRlZjoKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9yaWZmLmRlZjoKKwkgIGFkZCBzb21lIGRlZmluaXRpb25zIG5lZWRlZCBieSBwbHVnaW5zCisKKzIwMDQtMDctMjYgIFN0ZXZlIExob21tZSAgPHN0ZXZlLmxob21tZUBmcmVlLmZyPgorCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmbXV4LmMKKwkgIEZpeCBzb21lIDY0IGJpdHMgY29uc3RhbnRzIHRvIGJlIGdsaWIgZnJpZW5kbHkKKworMjAwNC0wNy0yNiAgU3RldmUgTGhvbW1lICA8c3RldmUubGhvbW1lQGZyZWUuZnI+CisKKwkqIGdzdC9hYzNwYXJzZS9nc3RhYzNwYXJzZS5jCisJKiBnc3QvYXVkaW9zY2FsZS9nc3RhdWRpb3NjYWxlLmMKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYworCSogZ3N0L2NvbG9yc3BhY2UvZ3N0Y29sb3JzcGFjZS5jCisJKiBnc3QvY29sb3JzcGFjZS95dXYycmdiLmgKKwkgIGxvY2FsIGluY2x1ZGUgZml4ZXMKKworMjAwNC0wNy0yNiAgU3RldmUgTGhvbW1lICA8c3RldmUubGhvbW1lQGZyZWUuZnI+CisKKwkqIHdpbjMyL2dzdC5zbG4KKwkgIGFkZCBtb3JlIHBsdWdpbnMgdG8gdGhlIGJ1aWxkCisKKzIwMDQtMDctMjYgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19jaGVja194c2htX2NhbGxzKSwKKwkoZ3N0X3hpbWFnZXNpbmtfeGltYWdlX25ldyk6IFNvbWUgbW9yZSBmaXhlcyB0byBpbWFnZSBzaXplIGNhbGN1bGF0aW9uLgorCisyMDA0LTA3LTI2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogKGdzdF9sZXZlbF9saW5rKSwgKGdzdF9sZXZlbF9jaGFpbiksCisJKGdzdF9sZXZlbF9zZXRfcHJvcGVydHkpLCAoZ3N0X2xldmVsX2dldF9wcm9wZXJ0eSksCisJKGdzdF9sZXZlbF9iYXNlX2luaXQpLCAoZ3N0X2xldmVsX2NsYXNzX2luaXQpOgorCSAgYWRkIGRlYnVnZ2luZyBjYXRlZ29yaWVzLiAgY2xlYW51cHMuCisKKzIwMDQtMDctMjYgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC92aWRlb3NjYWxlL3ZpZGVvc2NhbGUuYzogKGdzdF92aWRlb3NjYWxlX3NldHVwKSwKKwkoZ3N0X3ZpZGVvc2NhbGVfcGxhbmFyNDExKSwgKGdzdF92aWRlb3NjYWxlX3BsYW5hcjQwMCksCisJKGdzdF92aWRlb3NjYWxlX3BhY2tlZDQyMiksIChnc3RfdmlkZW9zY2FsZV9wYWNrZWQ0MjJyZXYpLAorCShnc3RfdmlkZW9zY2FsZV9zY2FsZV9uZWFyZXN0X3N0cjEpLAorCShnc3RfdmlkZW9zY2FsZV9zY2FsZV9uZWFyZXN0X3N0cjIpLAorCShnc3RfdmlkZW9zY2FsZV9zY2FsZV9uZWFyZXN0X3N0cjQpLAorCShnc3RfdmlkZW9zY2FsZV9zY2FsZV9uZWFyZXN0XzE2Yml0KSwKKwkoZ3N0X3ZpZGVvc2NhbGVfc2NhbGVfbmVhcmVzdF8yNGJpdCk6CisJICBmaXhlZCBzdHJpZGUgaXNzdWVzCisJICB0ZXN0ZWQgd2l0aCAzMjB4MjQwIC0+IDMyMSwgMzIyLCAzMjQgeDI0MAorCSAgdGVzdGVkIHdpdGggWVYxMiwgSTQyMCwgWVVZMiwgVVlWWQorCSAgZml4ZWQgcGFja2VkNDIycmV2IChkb24ndCB0aGluayBpdCBjb3VsZCBoYXZlIHdvcmtlZCBiZWZvcmUpCisJICBieSB0ZXN0aW5nIHdpdGggVVlWWQorCisyMDA0LTA3LTI2ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzogKGdzdF9sYW1lX3NpbmtfbGluayksIChnc3RfbGFtZV9pbml0KSwKKwkoZ3N0X2xhbWVfY2hhaW4pLCAoZ3N0X2xhbWVfc2V0dXApLCAoZ3N0X2xhbWVfY2hhbmdlX3N0YXRlKSwKKwkocGx1Z2luX2luaXQpOgorCSAgYWRkIGRlYnVnZ2luZyBjYXRlZ29yeSwgYWRkIGVycm9yIGNoZWNrcyBsaWtlIGNoZWNraW5nIHJldHVybiB2YWx1ZXMKKwkgIG9mIHNldHVwIGNhbGxzLCBtYWtlIHN1cmUgaXQgc3RpbGwgd29ya3MgYWZ0ZXIKKwkgIFBMQVlJTkc9Pk5VTEw9PlBMQVlJTkcsIGZpeCBlbmNvZGluZyBvZiBtb25vIHN0cmVhbXMKKworMjAwNC0wNy0yNiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdkZW11eC5jOiAoZ3N0X21wZWdfZGVtdXhfZ2V0X3ZpZGVvX3N0cmVhbSksCisJKGdzdF9tcGVnX2RlbXV4X2dldF9hdWRpb19zdHJlYW0pLAorCShnc3RfbXBlZ19kZW11eF9wcm9jZXNzX3ByaXZhdGUpOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ3BhcnNlLmM6IChnc3RfbXBlZ19wYXJzZV9zZW5kX2RhdGEpOgorCUNoZWNrIGZvciBlcnJvciBjb2RlcyBmcm9tIHRoZSBuZWdvdGlhdGlvbiBmdW5jdGlvbnMuIE1ha2Ugc3VyZQorCXdlIHJlYWxseSBzZXQgdGhlIHBhZCBjYXBzIHdoZW4gYSBuZXcgcGFkIGlzIGNyZWF0ZWQuCisKKzIwMDQtMDctMjYgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvZGVjbWFwLmM6CisJKGdzdF9mZm1wZWdfY2Fwc190b19waXhfZm10KToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvZGVjbWFwLmg6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2xvcnNwYWNlLmM6CisJKGdzdF9mZm1wZWdjb2xvcnNwYWNlX3BhZF9saW5rKToKKwkgIGRvbid0IG1ha2UgZnVuY3Rpb24gZG8gdHdvIHRoaW5ncyBhdCB0aGUgc2FtZSB0aW1lIHdpdGhvdXQgcmVhc29uLgorCisyMDA0LTA3LTI2ICBTdGV2ZSBMaG9tbWUgIDxzdGV2ZS5saG9tbWVAZnJlZS5mcj4KKworCSogZ3N0L2FjM3BhcnNlL2FjM3BhcnNlLnZjcHJvagorCSogZ3N0L2FkZGVyL2FkZGVyLnZjcHJvagorCSogZ3N0L2FscGhhL2FscGhhLnZjcHJvagorCSogZ3N0L2FscGhhL2FscGhhY29sb3IudmNwcm9qCisJKiBnc3QvYXNmZGVtdXgvYXNmLnZjcHJvagorCSogZ3N0L2F1ZGlvY29udmVydC9hdWRpb2NvbnZlcnQudmNwcm9qCisJKiBnc3QvYXVkaW9yYXRlL2F1ZGlvcmF0ZS52Y3Byb2oKKwkqIGdzdC9hdWRpb3NjYWxlL2F1ZGlvc2NhbGUudmNwcm9qCisJKiBnc3QvYXVwYXJzZS9hdXBhcnNlLnZjcHJvagorCSogZ3N0L2F2aS9hdmkudmNwcm9qCisJKiBnc3QvY2R4YXBhcnNlL2NkeGFwYXJzZS52Y3Byb2oKKwkqIGdzdC9jaGFydC9jaGFydC52Y3Byb2oKKwkqIGdzdC9jb2xvcnNwYWNlL2NvbG9yc3BhY2UudmNwcm9qCisJKiBnc3QvY3V0dGVyL2N1dHRlci52Y3Byb2oKKwkqIGdzdC9kZWJ1Zy9kZWJ1Zy52Y3Byb2oKKwkqIGdzdC9kZWJ1Zy9lZmVuY2UudmNwcm9qCisJKiBnc3QvZGVidWcvbmF2aWdhdGlvbnRlc3QudmNwcm9qCisJKiBnc3QvZGVpbnRlcmxhY2UvZGVpbnRlcmxhY2UudmNwcm9qCisJKiBnc3QvZWZmZWN0di9lZmZlY3R2LnZjcHJvagorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZmZtcGVnY29sb3JzcGFjZS52Y3Byb2oKKwkqIGdzdC9maWx0ZXIvZmlsdGVyLnZjcHJvagorCSogZ3N0L2ZseC9mbHhkZWMudmNwcm9qCisJKiBnc3QvZ29vbS9nb29tLnZjcHJvagorCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS52Y3Byb2oKKwkqIGdzdC9sYXcvYWxhdy52Y3Byb2oKKwkqIGdzdC9sYXcvbXVsYXcudmNwcm9qCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EudmNwcm9qCisJKiBnc3QvbWVkaWFuL21lZGlhbi52Y3Byb2oKKwkqIGdzdC9taXhtYXRyaXgvbWl4bWF0cml4LnZjcHJvagorCSogZ3N0L21wZWcxc3lzL21wZWcxc3lzdGVtZW5jb2RlLnZjcHJvagorCSogZ3N0L21wZWcxdmlkZW9wYXJzZS9tcDF2aWRlb3BhcnNlLnZjcHJvagorCSogZ3N0L21wZWcyc3ViL21wZWcyc3VidC52Y3Byb2oKKwkqIGdzdC9tcGVnYXVkaW8vbXBlZ2F1ZGlvLnZjcHJvagorCSogZ3N0L21wZWdhdWRpb3BhcnNlL21wZWdhdWRpb3BhcnNlLnZjcHJvagorCSogZ3N0L21wZWdzdHJlYW0vbXBlZ3N0cmVhbS52Y3Byb2oKKwkqIGdzdC9tdWx0aWZpbGVzaW5rL211bHRpZmlsZXNpbmsudmNwcm9qCisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydC52Y3Byb2oKKwkqIGdzdC9vbmV0b24vb25ldG9uLnZjcHJvagorCSogZ3N0L292ZXJsYXkvb3ZlcmxheS52Y3Byb2oKKwkqIGdzdC9wYXNzdGhyb3VnaC9wYXNzdGhyb3VnaC52Y3Byb2oKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXgudmNwcm9qCisJKiBnc3QvcmVhbG1lZGlhL3JtZGVtdXgudmNwcm9qCisJKiBnc3QvcnRqcGVnL3J0anBlZy52Y3Byb2oKKwkqIGdzdC9ydHAvcnRwLnZjcHJvagorCSogZ3N0L3NpbGVuY2Uvc2lsZW5jZS52Y3Byb2oKKwkqIGdzdC9zaW5lL3NpbmVzcmMudmNwcm9qCisJKiBnc3Qvc21vb3RoL3Ntb290aC52Y3Byb2oKKwkqIGdzdC9zbXB0ZS9zbXB0ZS52Y3Byb2oKKwkqIGdzdC9zcGVjdHJ1bS9zcGVjdHJ1bS52Y3Byb2oKKwkqIGdzdC9zcGVlZC9zcGVlZC52Y3Byb2oKKwkqIGdzdC9zdGVyZW8vc3RlcmVvLnZjcHJvagorCSogZ3N0L3N3aXRjaC9zd2l0Y2gudmNwcm9qCisJKiBnc3QvdGFncy90YWdlZGl0LnZjcHJvagorCSogZ3N0L3RjcC90Y3AudmNwcm9qCisJKiBnc3QvdHlwZWZpbmQvdHlwZWZpbmRmdW5jdGlvbnMudmNwcm9qCisJKiBnc3QvdWRwL3VkcC52Y3Byb2oKKwkqIGdzdC92aWRlb2JveC92aWRlb2JveC52Y3Byb2oKKwkqIGdzdC92aWRlb2Nyb3AvdmlkZW9jcm9wLnZjcHJvagorCSogZ3N0L3ZpZGVvZHJvcC92aWRlb2Ryb3AudmNwcm9qCisJKiBnc3QvdmlkZW9maWx0ZXIvZ2FtbWEudmNwcm9qCisJKiBnc3QvdmlkZW9maWx0ZXIvdmlkZW9iYWxhbmNlLnZjcHJvagorCSogZ3N0L3ZpZGVvZmlsdGVyL3ZpZGVvZmlsdGVyLnZjcHJvagorCSogZ3N0L3ZpZGVvZmlsdGVyL3ZpZGVvZmxpcC52Y3Byb2oKKwkqIGdzdC92aWRlb2ZsaXAvdmlkZW9mbGlwLnZjcHJvagorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci52Y3Byb2oKKwkqIGdzdC92aWRlb3JhdGUvdmlkZW9yYXRlLnZjcHJvagorCSogZ3N0L3ZpZGVvc2NhbGUvdmlkZW9zY2FsZS52Y3Byb2oKKwkqIGdzdC92aWRlb3Rlc3RzcmMvdmlkZW90ZXN0c3JjLnZjcHJvagorCSogZ3N0L3ZpcnR1YWxkdWIvdmlydHVhbGR1Yi52Y3Byb2oKKwkqIGdzdC92b2xlbnYvdm9sZW52LnZjcHJvagorCSogZ3N0L3ZvbHVtZS92b2x1bWUudmNwcm9qCisJKiBnc3Qvd2F2ZW5jL3dhdmVuYy52Y3Byb2oKKwkqIGdzdC93YXZwYXJzZS93YXZwYXJzZS52Y3Byb2oKKwkqIGdzdC95NG0veTRtZW5jLnZjcHJvagorCSAgbW9yZSBwbHVnaW5zIHN1cHBvcnRlZCB1bmRlciB3aW5kb3dzCisKKzIwMDQtMDctMjYgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeGltYWdlX25ldyksCisJKGdzdF94aW1hZ2VzaW5rX3hpbWFnZV9wdXQpLCAoZ3N0X3hpbWFnZXNpbmtfcmVuZWdvdGlhdGVfc2l6ZSksCisJKGdzdF94aW1hZ2VzaW5rX2NoYWluKSwgKGdzdF94aW1hZ2VzaW5rX2J1ZmZlcl9hbGxvYyk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3h2aW1hZ2VfbmV3KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NoYWluKSwgKGdzdF94dmltYWdlc2lua19idWZmZXJfYWxsb2MpOgorCSAgQWRkIGRlYnVnZ2luZyBzdGF0ZW1lbnRzLiAgVXNlIHRoZSBzaXplcyBhcyByZXR1cm5lZCBieSB0aGUKKwkgICpDcmVhdGVJbWFnZSBjYWxscy4KKworMjAwNC0wNy0yNiAgSm9oYW4gRGFobGluICA8am9oYW5AZ25vbWUub3JnPgorCisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNyYy5jIChnc3RfdGNwY2xpZW50c3JjX2dldCk6IE1ha2Ugc3VyZSB0aGF0CisJdGhlIHBhZCBpcyBuZWdvdGlhdGVkLgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2xvcnNwYWNlLmMgKGdzdF9mZm1wZWdjb2xvcnNwYWNlX2NoYWluKTogRGl0dG8KKworMjAwNC0wNy0yNiAgU3RldmUgTGhvbW1lICA8c3RldmUubGhvbW1lQGZyZWUuZnI+CisKKwkqIGdzdC1saWJzL2dzdC9jb2xvcmJhbGFuY2UvY29sb3JiYWxhbmNlLnZjcHJvajoKKwkqIGdzdC1saWJzL2dzdC9pZGN0L2lkY3QudmNwcm9qOgorCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby52Y3Byb2o6CisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvbWl4ZXIudmNwcm9qOgorCSogZ3N0LWxpYnMvZ3N0L25hdmlnYXRpb24vbmF2aWdhdGlvbi52Y3Byb2o6CisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5LnZjcHJvajoKKwkqIGdzdC1saWJzL2dzdC9wcm9wZXJ0eXByb2JlL3Byb3BlcnR5cHJvYmUudmNwcm9qOgorCSogZ3N0LWxpYnMvZ3N0L3Jlc2FtcGxlL3Jlc2FtcGxlLnZjcHJvajoKKwkqIGdzdC1saWJzL2dzdC90dW5lci90dW5lci52Y3Byb2o6CisJKiBnc3QtbGlicy9nc3QvdmlkZW8vdmlkZW8udmNwcm9qOgorCSogZ3N0LWxpYnMvZ3N0L3hvdmVybGF5L3hvdmVybGF5LnZjcHJvajoKKwkgIG1vcmUgcGx1Z2lucyBzdXBwb3J0ZWQgdW5kZXIgd2luZG93cworCisyMDA0LTA3LTI1IElhaW4gPGlhaW5AcHJldHR5cGVvcGxlLm9yZz4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmMgKGdzdF93YXZwYXJzZV9mbXQpOiBTZXQgdGhlIGNhcHMgb24gdGhlCisJcGFkIG5vdyByYXRoZXIgdGhhbiB3aGVuIHRoZSBwYWQgaXMgY3JlYXRlZCBiZWNhdXNlIHN0YXRlIGNoYW5nZXMgd2lwZQorCWV4cGxpY2l0IGNhcHMgKGZpeGVzICMxNDgwNDMpLgorCisyMDA0LTA3LTI1ICBTZWJhc3RpZW4gQ290ZSAgPHNjNUBoZXJtZXMudXNoZXJiLmNhPgorCisJcmV2aWV3ZWQgYnkgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvbWFkL2dzdG1hZC5jOgorCSAgZml4IG1hZCBwbHVnaW4gY3Jhc2hpbmcgb24gU3VuIChmaXhlcyAjMTQ4Mjg5KQorCisyMDA0LTA3LTI1ICBTdGV2ZSBMaG9tbWUgIDxzdGV2ZS5saG9tbWVAZnJlZS5mcj4KKworCSogZ3N0L2F2aS9hdmkuZGVmOgorCSogZ3N0L2F2aS9hdmkudmNwcm9qOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLmRlZjoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS52Y3Byb2o6CisJICByZW1vdmUgdW51c2VkIC5kZWYgZmlsZXMKKworMjAwNC0wNy0yNSAgU3RldmUgTGhvbW1lICA8c3RldmUubGhvbW1lQGZyZWUuZnI+CisKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9nc3RhdWRpb2ZpbHRlci5jOgorCSAgQ2xlYW4gdGhlIGxvY2FsIGluY2x1ZGUKKworMjAwNC0wNy0yNSAgU3RldmUgTGhvbW1lICA8c3RldmUubGhvbW1lQGZyZWUuZnI+CisKKwkqIHdpbjMyL2dzdC5zbG46CisJKiBnc3QtbGlicy9nc3QvYXVkaW8vYXVkaW8uZGVmOgorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2F1ZGlvLnZjcHJvajoKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9hdWRpb2ZpbHRlci52Y3Byb2o6CisJKiBnc3QtbGlicy9nc3QvYXVkaW8vcmlmZi5kZWY6CisJKiBnc3QtbGlicy9nc3QvYXVkaW8vcmlmZi52Y3Byb2o6CisJKiBnc3QtbGlicy9nc3QvZ3N0LWxpYnMuZGVmOgorCSogZ3N0LWxpYnMvZ3N0L2dzdC1saWJzLnZjcHJvajoKKwkqIGdzdC9hdmkvYXZpLnZjcHJvajoKKwkqIGdzdC9hdmkvYXZpLnZjcHJvajoKKwkgIENvcHkgdGhlIGZpbGVzIHdoZXJlIG5lZWRlZCBhZnRlciBidWlsZGluZywgY2xlYW5lciBwcm9qZWN0cworCisyMDA0LTA3LTI1ICBTdGV2ZSBMaG9tbWUgIDxzdGV2ZS5saG9tbWVAZnJlZS5mcj4KKworCSogZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYzoKKwkgIEZpeCBzb21lIDY0IGJpdHMgY29uc3RhbnRzIHRvIGJlIGdsaWIgZnJpZW5kbHkKKworMjAwNC0wNy0yNCAgU3RldmUgTGhvbW1lICA8c3RldmUubGhvbW1lQGZyZWUuZnI+CisKKwkqIHdpbjMyL2dzdC5zbG46CisJKiBnc3QtbGlicy9nc3QvZ3N0LWxpYnMuZGVmOgorCSogZ3N0LWxpYnMvZ3N0L2dzdC1saWJzLnZjcHJvajoKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS5kZWY6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EudmNwcm9qOgorCSAgQWRkIHRoZSBwcmVsaW1pbmFyeSBjYW52YXMgdG8gYnVpbGQgcGx1Z2lucyBvbiBXaW4zMgorCisyMDA0LTA3LTIzICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChnc3RfYXVkaW9fY29udmVydF9saW5rKToKKwkgIGRvbid0IGVuZm9yZSBuZWdvdGlhdGlvbiBmcm9tIHNvdXJjZSBzaWRlLCBpdCBicmVha3MKKwkgIHNpbmVzcmMgISBhdWRpb2NvbnZlcnQgISBvc3NzaW5rCisKKzIwMDQtMDctMjIgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChwbHVnaW5faW5pdCk6IEFkZCB0eXBlZmluZAorCWZvciBFTEYgZmlsZXMsIHNpbmNlIHRoZXkgY2FuIGVhc2lseSBiZSByZWNvZ25pemVkIGFzIGF1ZGlvL21wZWcuCisJKGJ1ZyAjMTQ3NDQxKQorCisyMDA0LTA3LTIyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvdmlkZW9zY2FsZS92aWRlb3NjYWxlLmM6IChnc3RfdmlkZW9zY2FsZV9zZXR1cCksCisJKGdzdF92aWRlb3NjYWxlX3BsYW5hcjQxMSksIChnc3RfdmlkZW9zY2FsZV9zY2FsZV9uZWFyZXN0XzMyYml0KSwKKwkoZ3N0X3ZpZGVvc2NhbGVfc2NhbGVfbmVhcmVzdF8yNGJpdCksCisJKGdzdF92aWRlb3NjYWxlX3NjYWxlX25lYXJlc3RfMTZiaXQpOgorCSAgZml4IDE2Yml0IGFuZCAyNGJpdCBmb3Igc3RyaWRlICgyNGJpdCBtaWdodCBuZWVkIHRlc3RpbmcpCisJICBkb24ndCBwcmV0ZW5kIHdlIGRvIG1vcmUgdGhhbiBvbmUgYWxnb3JpdGhtCisKKzIwMDQtMDctMjIgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L01ha2VmaWxlLmFtOgorCSogZ3N0L211bHRpZmlsZXNpbmsvTWFrZWZpbGUuYW06CisJKiBnc3QvbXVsdGlmaWxlc2luay9nc3RtdWx0aWZpbGVzaW5rLmM6CisJKGdzdF9tdWx0aWZpbGVzaW5rX2dldF9mb3JtYXRzKSwKKwkoZ3N0X211bHRpZmlsZXNpbmtfZ2V0X3F1ZXJ5X3R5cGVzKSwgKF9kb19pbml0KSwKKwkoZ3N0X211bHRpZmlsZXNpbmtfYmFzZV9pbml0KSwgKGdzdF9tdWx0aWZpbGVzaW5rX2NsYXNzX2luaXQpLAorCShnc3RfbXVsdGlmaWxlc2lua19pbml0KSwgKGdzdF9tdWx0aWZpbGVzaW5rX2Rpc3Bvc2UpLAorCShnc3RfbXVsdGlmaWxlc2lua19zZXRfbG9jYXRpb24pLCAoZ3N0X211bHRpZmlsZXNpbmtfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X211bHRpZmlsZXNpbmtfZ2V0X3Byb3BlcnR5KSwgKGdzdF9tdWx0aWZpbGVzaW5rX29wZW5fZmlsZSksCisJKGdzdF9tdWx0aWZpbGVzaW5rX2Nsb3NlX2ZpbGUpLCAoZ3N0X211bHRpZmlsZXNpbmtfbmV4dF9maWxlKSwKKwkoZ3N0X211bHRpZmlsZXNpbmtfcGFkX3F1ZXJ5KSwgKGdzdF9tdWx0aWZpbGVzaW5rX2hhbmRsZV9ldmVudCksCisJKGdzdF9tdWx0aWZpbGVzaW5rX2NoYWluKSwgKGdzdF9tdWx0aWZpbGVzaW5rX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9tdWx0aWZpbGVzaW5rX3VyaV9nZXRfdHlwZSksCisJKGdzdF9tdWx0aWZpbGVzaW5rX3VyaV9nZXRfcHJvdG9jb2xzKSwKKwkoZ3N0X211bHRpZmlsZXNpbmtfdXJpX2dldF91cmkpLCAoZ3N0X211bHRpZmlsZXNpbmtfdXJpX3NldF91cmkpLAorCShnc3RfbXVsdGlmaWxlc2lua191cmlfaGFuZGxlcl9pbml0KSwgKHBsdWdpbl9pbml0KToKKwkqIGdzdC9tdWx0aWZpbGVzaW5rL2dzdG11bHRpZmlsZXNpbmsuaDoKKwkqIHRlc3RzdWl0ZS9NYWtlZmlsZS5hbToKKwkqIHRlc3RzdWl0ZS9tdWx0aWZpbGVzaW5rL01ha2VmaWxlLmFtOgorCSogdGVzdHN1aXRlL211bHRpZmlsZXNpbmsvZmFrZXNyY190ZXN0LmM6IChnc3RfbmV3bWVkaWFfYmFzZV9pbml0KSwKKwkoZ3N0X25ld21lZGlhX2NsYXNzX2luaXQpLCAoZ3N0X25ld21lZGlhX2luaXQpLAorCShnc3RfbmV3bWVkaWFfY2hhaW4pLCAoZ3N0X25ld21lZGlhX3RyaWdnZXIpLCAodGVzdF9mb3JtYXQpLAorCShuZXdmaWxlX3NpZ25hbCksICh0ZXN0X3NpZ25hbCksIChtYWluKToKKwltdWx0aWZpbGVzaW5rIHBsdWdpbiBmb3IgY3JlYXRpbmcgbmV3IGZpbGVzIGV2ZXJ5IHRpbWUgYSBuZXcgbWVkaWEKKwlkaXNjb250aW51aXR5IGV2ZW50IG9jY3VycworCisyMDA0LTA3LTIyICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L2FscGhhL01ha2VmaWxlLmFtOgorCSogZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYzogKGdzdF9hbHBoYV9jb2xvcl9nZXRfdHlwZSksCisJKGdzdF9hbHBoYV9jb2xvcl9iYXNlX2luaXQpLCAoZ3N0X2FscGhhX2NvbG9yX2NsYXNzX2luaXQpLAorCShnc3RfYWxwaGFfY29sb3JfaW5pdCksIChnc3RfYWxwaGFfY29sb3Jfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2FscGhhX2NvbG9yX2dldF9wcm9wZXJ0eSksIChnc3RfYWxwaGFfY29sb3Jfc2lua19saW5rKSwKKwkodHJhbnNmb3JtKSwgKGdzdF9hbHBoYV9jb2xvcl9jaGFpbiksCisJKGdzdF9hbHBoYV9jb2xvcl9jaGFuZ2Vfc3RhdGUpLCAocGx1Z2luX2luaXQpOgorCVN0dXBpZCBwbHVnaW4gdG8gdG8gUkdCQSB0byBBWVVWIGNvbnZlcnNpb24gYmVjYXVzZSBub25lIG9mCisJdGhlIGNvbG9yc3BhY2UgcGx1Z2lucyBjYW4gaGFuZGxlIHRoYXQgeWV0LgorCisyMDA0LTA3LTIyICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXhhbXBsZXMvc2Vla2luZy9zZWVrLmM6ICh1cGRhdGVfc2NhbGUpLCAobWFpbik6CisJKiBnc3QvcGxheWJhY2svZ3N0ZGVjb2RlYmluLmM6IChnc3RfZGVjb2RlX2Jpbl9nZXRfdHlwZSksCisJKGdzdF9kZWNvZGVfYmluX2NsYXNzX2luaXQpLCAoZ3N0X2RlY29kZV9iaW5faXNfZHluYW1pYyksCisJKGdzdF9kZWNvZGVfYmluX2ZhY3RvcnlfZmlsdGVyKSwgKGNvbXBhcmVfcmFua3MpLCAocHJpbnRfZmVhdHVyZSksCisJKGdzdF9kZWNvZGVfYmluX2luaXQpLCAoZ3N0X2RlY29kZV9iaW5fZGlzcG9zZSksCisJKGZpbmRfY29tcGF0aWJsZXMpLCAoY2xvc2VfcGFkX2xpbmspLCAodHJ5X3RvX2xpbmtfMSksIChuZXdfcGFkKSwKKwkobm9fbW9yZV9wYWRzKSwgKGNsb3NlX2xpbmspLCAodHlwZV9mb3VuZCksCisJKGdzdF9kZWNvZGVfYmluX3NldF9wcm9wZXJ0eSksIChnc3RfZGVjb2RlX2Jpbl9nZXRfcHJvcGVydHkpLAorCShwbHVnaW5faW5pdCk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdzdF9wbGF5X2Jhc2VfYmluX2dldF90eXBlKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fY2xhc3NfaW5pdCksIChnc3RfcGxheV9iYXNlX2Jpbl9pbml0KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fZGlzcG9zZSksIChxdWV1ZV9vdmVycnVuKSwKKwkoZ2VuX3ByZXJvbGxfZWxlbWVudCksIChyZW1vdmVfcHJlcm9sbHMpLCAodW5rbm93bl90eXBlKSwKKwkobm9fbW9yZV9wYWRzKSwgKG5ld19zdHJlYW0pLCAoc2V0dXBfc291cmNlKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fc2V0X3Byb3BlcnR5KSwgKGdzdF9wbGF5X2Jhc2VfYmluX2dldF9wcm9wZXJ0eSksCisJKHBsYXlfYmFzZV9lb3MpLCAoZ3N0X3BsYXlfYmFzZV9iaW5fY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fYWRkX2VsZW1lbnQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9yZW1vdmVfZWxlbWVudCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX211dGVfc3RyZWFtKSwgKGdzdF9wbGF5X2Jhc2VfYmluX2xpbmtfc3RyZWFtKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fdW5saW5rX3N0cmVhbSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2dldF9zdHJlYW1pbmZvKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmluLmM6IChnZW5fdmlkZW9fZWxlbWVudCksCisJKGdlbl9hdWRpb19lbGVtZW50KToKKwkqIGdzdC9wbGF5YmFjay9nc3RzdHJlYW1pbmZvLmg6CisJTW9yZSBwbGF5YmFjayB1cGRhdGVzLCBhdHRlbXB0IHRvIGZpeCB0aGluZ3MgYWZ0ZXIgdGhlIHN0YXRlIGNoYW5nZQorCWJyZWFrYWdlLgorCisyMDA0LTA3LTIyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvdmlkZW9zY2FsZS92aWRlb3NjYWxlLmM6IChnc3RfdmlkZW9zY2FsZV9wbGFuYXI0MTEpLAorCShnc3RfdmlkZW9zY2FsZV9zY2FsZV9uZWFyZXN0XzE2Yml0KToKKwkgIGNvbW1lbnQgYWxnb3JpdGhtCisKKzIwMDQtMDctMjIgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC92aWRlb3Rlc3RzcmMvZ3N0dmlkZW90ZXN0c3JjLmM6CisJKGdzdF92aWRlb3Rlc3RzcmNfY2xhc3NfaW5pdCksIChnc3RfdmlkZW90ZXN0c3JjX3NyY19saW5rKSwKKwkoZ3N0X3ZpZGVvdGVzdHNyY19pbml0KSwgKGdzdF92aWRlb3Rlc3RzcmNfZ2V0KSwKKwkoZ3N0X3ZpZGVvdGVzdHNyY19zZXRfcGF0dGVybiksIChnc3RfdmlkZW90ZXN0c3JjX3NldF9wcm9wZXJ0eSksCisJKGdzdF92aWRlb3Rlc3RzcmNfZ2V0X3Byb3BlcnR5KToKKwkqIGdzdC92aWRlb3Rlc3RzcmMvZ3N0dmlkZW90ZXN0c3JjLmg6CisJKiBnc3QvdmlkZW90ZXN0c3JjL3ZpZGVvdGVzdHNyYy5jOgorCSogZ3N0L3ZpZGVvdGVzdHNyYy92aWRlb3Rlc3RzcmMuaDoKKwkgIGNsZWFudXAgYW5kIGNvbW1lbnRpbmcKKworMjAwNC0wNy0yMSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfZGVtdXhfaW5pdCksCisJKGdzdF9vZ2dfZGVtdXhfZ2V0X2Zvcm1hdHMpLCAoZ3N0X29nZ19kZW11eF9zcmNfcXVlcnkpLAorCShnc3Rfb2dnX2RlbXV4X3NyY19ldmVudCksIChnc3Rfb2dnX2RlbXV4X3NyY19jb252ZXJ0KSwKKwkoZ3N0X29nZ19kZW11eF9oYW5kbGVfZXZlbnQpLCAoZ3N0X29nZ19kZW11eF9zZWVrX2JlZm9yZSksCisJKF9maW5kX2NoYWluX2dldF91bmtub3duX3BhcnQpLCAoX2ZpbmRfc3RyZWFtc19jaGVjayksCisJKGdzdF9vZ2dfZGVtdXhfcHVzaCksIChnc3Rfb2dnX3BhZF9wdXNoKToKKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6ICh0aGVvcmFfZ2V0X2Zvcm1hdHMpLAorCSh0aGVvcmFfZGVjX3NyY19jb252ZXJ0KSwgKHRoZW9yYV9kZWNfc2lua19jb252ZXJ0KSwKKwkodGhlb3JhX2RlY19zcmNfcXVlcnkpLCAodGhlb3JhX2RlY19zcmNfZXZlbnQpLCAodGhlb3JhX2RlY19ldmVudCksCisJKHRoZW9yYV9kZWNfY2hhaW4pOgorCSogZXh0L3ZvcmJpcy92b3JiaXNkZWMuYzogKHZvcmJpc19kZWNfZ2V0X2Zvcm1hdHMpLAorCSh2b3JiaXNfZGVjX2NvbnZlcnQpLCAodm9yYmlzX2RlY19zcmNfcXVlcnkpLAorCSh2b3JiaXNfZGVjX3NyY19ldmVudCksICh2b3JiaXNfZGVjX2V2ZW50KToKKwlNb3JlIHNlZWtpbmcgZml4ZXMsIG9nZ2RlbXV4IG5vdyBzdXBwb3J0cyBzZWVraW5nIHRvIHRpbWUgYW5kCisJdXNlcyB0aGUgZG93bnN0cmVhbSBlbGVtZW50IHRvIGNvbnZlcnQgZ3JhbnVsZXBvcyB0byB0aW1lLgorCVNlZWtpbmcgaW4gdGhlb3JhLW9ubHkgb2dnIGZpbGVzIG5vdyB3b3Jrcy4KKworMjAwNC0wNy0yMSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6IChnc3RfdGhlb3JhX2RlY19pbml0KSwKKwkodGhlb3JhX2dldF9mb3JtYXRzKSwgKHRoZW9yYV9nZXRfZXZlbnRfbWFza3MpLAorCSh0aGVvcmFfZ2V0X3F1ZXJ5X3R5cGVzKSwgKHRoZW9yYV9kZWNfc3JjX2NvbnZlcnQpLAorCSh0aGVvcmFfZGVjX3NpbmtfY29udmVydCksICh0aGVvcmFfZGVjX3NyY19xdWVyeSksCisJKHRoZW9yYV9kZWNfc3JjX2V2ZW50KSwgKHRoZW9yYV9kZWNfZXZlbnQpLCAodGhlb3JhX2RlY19jaGFpbik6CisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jOiAodm9yYmlzX2RlY19nZXRfZm9ybWF0cyksCisJKHZvcmJpc19nZXRfZXZlbnRfbWFza3MpLCAodm9yYmlzX2dldF9xdWVyeV90eXBlcyksCisJKGdzdF92b3JiaXNfZGVjX2luaXQpLCAodm9yYmlzX2RlY19jb252ZXJ0KSwKKwkodm9yYmlzX2RlY19zcmNfcXVlcnkpLCAodm9yYmlzX2RlY19zcmNfZXZlbnQpLCAodm9yYmlzX2RlY19ldmVudCk6CisJQWRkZWQgcXVlcnkvY29udmVydC9mb3JtYXRzIGZ1bmN0aW9ucyB0byB2b3JiaXMgYW5kIHRoZW9yYSBkZWNvZGVycworCXNvIHRoYXQgdGhlIG91dHNpZGUgd29ybGQgY2FuIHVzZSB0aGVtIHRvby4gRml4ZWQgc2Vla2luZyBvbiBhbgorCW9nZy90aGVvcmEvdm9yYmlzIGZpbGUgYnkgZGlzYWJsaW5nIHRoZSBzZWVraW5nIHNlZWtpbmcgb24gdGhlCisJdGhlb3JhIHNyY3BhZC4KKworMjAwNC0wNy0yMSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3hpbWFnZV9uZXcpLAorCShnc3RfeGltYWdlc2lua19yZW5lZ290aWF0ZV9zaXplKSwgKGdzdF94aW1hZ2VzaW5rX3NpbmtfbGluayksCisJKGdzdF94aW1hZ2VzaW5rX2NoYWluKSwgKGdzdF94aW1hZ2VzaW5rX3NldF94d2luZG93X2lkKTogT3B0aW1pemUKKwlpbWFnZXMgY3JlYXRpb24gZm9yIGJvdGggZWxlbWVudHMuIFdlIGRvbid0IGNyZWF0ZSB0aGUgaW1hZ2Ugb24gY2FwcworCW5lZ28gb3IgcmVuZWdvLCB3ZSBqdXN0IGRlc3Ryb3kgdGhlIGludGVybmFsIG9uZSBpZiBwcmVzZW50IGlmIGl0IGRvZXMKKwlub3QgbWF0Y2ggdGhlIG5lZWRzLiBUaGUgY2hhaW4gZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiBjcmVhdGluZyBhIG5ldworCWltYWdlIHdoZW4gbmVlZGVkLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua194dmltYWdlX25ldyksCisJKGdzdF94dmltYWdlc2lua194d2luZG93X2RlY29yYXRlKSwgKGdzdF94dmltYWdlc2lua19zaW5rX2xpbmspLAorCShnc3RfeHZpbWFnZXNpbmtfY2hhaW4pLCAoZ3N0X3h2aW1hZ2VzaW5rX2J1ZmZlcl9hbGxvYyksCisJKGdzdF94dmltYWdlc2lua19zZXRfeHdpbmRvd19pZCk6IEFkZGl0aW9uYWxseSB4dmltYWdlIG5vdyBjb250YWlucworCXRoZSBpbWFnZSBmb3JtYXQgaW5mb3JtYXRpb24uIFRoZSBidWZmZXIgcG9vbCBjaGVja3MgZm9yIHRoZSBjb250ZXh0CisJaW1hZ2UgZm9ybWF0IGFuZCBkaXNjYXJkIGltYWdlcyB3aXRoIGRpZmZlcmVudCBmb3JtYXRzLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuaDogQWRkaW5nIGltX2Zvcm1hdCBpbiB0aGUgeHZpbWFnZSBzdHJ1Y3R1cmUuCisKKzIwMDQtMDctMjEgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvbG9yc3BhY2UuYzoKKwkoZ3N0X2ZmbXBlZ2NvbG9yc3BhY2VfY2hhaW4pOgorCSAgbm8gcG9pbnQgaW4gZG9pbmcgYW55IGNoYWluaW5nIGlmIHRoZSBwYWQgd2Ugd2FudCB0byBwdXNoIGZyb20KKwkgIGlzbid0IHVzYWJsZS4KKworMjAwNC0wNy0yMCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOgorCShnc3RfcmlmZl9jcmVhdGVfYXVkaW9fY2Fwc193aXRoX2RhdGEpOgorCSAgRml4IGRvdWJsZSBlbmQtdG8tbmF0aXZlIHN5bWJvbCBjb252ZXJzaW9uICgjMTQ4MDIxKS4KKworMjAwNC0wNy0yMCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3h3aW5kb3dfZGVjb3JhdGUpOgorCURvbid0IHVzZSBhbiBBdG9tIHRoYXQgZG9lc24ndCBleGlzdC4KKworMjAwNC0wNy0yMCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuYzogKGdzdF9tdWx0aWZkc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X211bHRpZmRzaW5rX2FkZCksIChnc3RfbXVsdGlmZHNpbmtfZ2V0X3N0YXRzKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9yZW1vdmUpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF93cml0ZSksCisJKGdzdF9tdWx0aWZkc2lua19xdWV1ZV9idWZmZXIpOgorCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5oOgorCU1vcmUgbXVsdGlmZHNpbmsgc3RhdHMuIEF2b2lkIGRlYWRsb2NrIGJ5IHJlbGVhc2luZyBsb2NrcworCWJlZm9yZSBzZW5kaW5nIG91dCBhIHNpZ25hbC4KKworMjAwNC0wNy0yMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogcG8vTElOR1VBUzoKKwkqIHBvL2h1LnBvOgorCSAgYWRkZWQgSHVuZ2FyaWFuIHRyYW5zbGF0aW9uIChMYXN6bG8gRHZvcm5paykKKworMjAwNC0wNy0yMCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuYzogKGdzdF9tdWx0aWZkc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X211bHRpZmRzaW5rX2FkZCksIChnc3RfbXVsdGlmZHNpbmtfY2xpZW50X3JlbW92ZSksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50X3dyaXRlKSwKKwkoZ3N0X211bHRpZmRzaW5rX3F1ZXVlX2J1ZmZlcik6CisJKiBnc3QvdGNwL2dzdHRjcC1tYXJzaGFsLmxpc3Q6CisJRml4ZWQgdGhlIHN0dXBpZCBtYXJzaGFsIGRlZmluaXRpb24uCisKKzIwMDQtMDctMjAgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6IChnc3RfbXVsdGlmZHNpbmtfY2xhc3NfaW5pdCksCisJKGdzdF9tdWx0aWZkc2lua19pbml0KSwgKGdzdF9tdWx0aWZkc2lua19hZGQpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xpZW50X3JlbW92ZSksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50X3dyaXRlKSwKKwkoZ3N0X211bHRpZmRzaW5rX3F1ZXVlX2J1ZmZlciksIChnc3RfbXVsdGlmZHNpbmtfY2hhaW4pLAorCShnc3RfbXVsdGlmZHNpbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF9tdWx0aWZkc2lua19nZXRfcHJvcGVydHkpLAorCShnc3RfbXVsdGlmZHNpbmtfaW5pdF9zZW5kKToKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuaDoKKwlBZGRlZCBtb3JlIHN0YXRzLCBhZGRlZCB0aW1lb3V0IGZvciBhIGNsaWVudCwgZml4ZWQgc29tZSB0eXBvcworCWFuZCBhZGRlZCBzb21lIGNvbW1lbnRzLgorCisyMDA0LTA3LTIwICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X211bHRpZmRzaW5rX2NsYXNzX2luaXQpLAorCShnc3RfbXVsdGlmZHNpbmtfYWRkKSwgKGdzdF9tdWx0aWZkc2lua19nZXRfc3RhdHMpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xpZW50X3JlbW92ZSksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50X3dyaXRlKToKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuaDoKKwkqIGdzdC90Y3AvZ3N0dGNwLW1hcnNoYWwubGlzdDoKKwlBZGRlZCBnZXRfc3RhdHMgbWV0aG9kIHRoYXQgcmV0dXJucyBhIEdWYWx1ZUFycmF5IG9mCisJc3RhdHMgdmFsdWVzLgorCisyMDA0LTA3LTE5ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9sYWRzcGEvZ3N0bGFkc3BhLmM6IChnc3RfbGFkc3BhX2Jhc2VfaW5pdCk6CisJICBtYWtlIHN1cmUgbG9uZ25hbWUsIGRlc2NyaXB0aW9uIGFuZCBhdXRob3IgYXJlIHZhbGlkIFVURi04CisKKzIwMDQtMDctMTkgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3hpbWFnZXNpbmtfc2V0X3Byb3BlcnR5KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3NldF9wcm9wZXJ0eSk6CisJICBtYWtlIHN1cmUgU1lOQ0hST05PVVMgaXMgcmVzcGVjdGVkIGFmdGVyIGdldHRpbmcgdGhlIFggY29udGV4dAorCisyMDA0LTA3LTE4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLAorCShnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cCk6CisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmg6CisJICBhZGQgQmxvY2tSZWZlcmVuY2UgdGFnIGFuZCBpZ25vcmUgaXQgdG8gY2xlYXIgb3V0IGxvZy4KKwkgIGlnbm9yZSBOQVZJR0FUSU9OIGV2ZW50cyB0byBjbGVhciBvdXQgbG9nLgorCisyMDA0LTA3LTE4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9jbGFzc19pbml0KSwKKwkoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9zdHJlYW0pOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jOiAoZ3N0X21hdHJvc2thX211eF9jbGFzc19pbml0KToKKwkgIGFkZCBkZWJ1ZyBjYXRlZ29yaWVzCisKKzIwMDQtMDctMTYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvbGlicG5nL01ha2VmaWxlLmFtOgorCSogZXh0L2xpYnBuZy9nc3RwbmcuYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZGVjLmM6ICh1c2VyX2Vycm9yX2ZuKSwgKHVzZXJfd2FybmluZ19mbiksCisJKGdzdF9wbmdkZWNfZ2V0X3R5cGUpLCAoZ3N0X3BuZ2RlY19iYXNlX2luaXQpLAorCShnc3RfcG5nZGVjX2NsYXNzX2luaXQpLCAoZ3N0X3BuZ2RlY19zaW5rbGluayksIChnc3RfcG5nZGVjX2luaXQpLAorCShnc3RfcG5nZGVjX3NyY19nZXRjYXBzKSwgKHVzZXJfcmVhZF9kYXRhKSwgKGdzdF9wbmdkZWNfY2hhaW4pOgorCSogZXh0L2xpYnBuZy9nc3RwbmdkZWMuaDoKKwlBZGRlZCBwbmcgZGVjb2Rlci4KKworMjAwNC0wNy0xNiAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2hhbmRsZV94ZXJyb3IpLAorCShnc3RfeGltYWdlc2lua19jaGVja194c2htX2NhbGxzKSwgKGdzdF94aW1hZ2VzaW5rX3hpbWFnZV9uZXcpLAorCShnc3RfeGltYWdlc2lua194aW1hZ2VfZGVzdHJveSksIChnc3RfeGltYWdlc2lua19zaW5rX2xpbmspLAorCShnc3RfeGltYWdlc2lua19jaGFpbiksIChnc3RfeGltYWdlc2lua19idWZmZXJfZnJlZSksCisJKGdzdF94aW1hZ2VzaW5rX2J1ZmZlcl9hbGxvYyk6CisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuaDoKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfY2hlY2tfeHNobV9jYWxscyksCisJKGdzdF94dmltYWdlc2lua194dmltYWdlX25ldyksIChnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9kZXN0cm95KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NoYWluKSwgKGdzdF94dmltYWdlc2lua19idWZmZXJfZnJlZSksCisJKGdzdF94dmltYWdlc2lua19idWZmZXJfYWxsb2MpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuaDogR2V0dGluZyB0aGUgMiB2aWRlbyBzaW5rcyBzeW5jaHJvbml6ZWQKKwlhZ2Fpbi4gVXNpbmcgaW50ZXJuYWwgZGF0YSBwb2ludGVyIG9mIHRoZSB4KHYpaW1hZ2UgdG8gc3RvcmUgaW1hZ2UncworCWRhdGEgdG8gYmUgY29oZXJlbnQgd2l0aCB0aGUgYnVmZmVyIGFsbG9jIG1lY2hhbmlzbS4gSW52ZXN0aWdhdGVkIHRoZQorCWltYWdlIGRlc3RydWN0aW9uIGNvZGUgdG8gYmUgc3VyZSB0aGF0IGV2ZXJ5dGhpbmcgZ2V0cyBmcmVlZCBjb3JyZWN0bHkuCisKKzIwMDQtMDctMTYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuYzoKKwkoZ3N0X3JpZmZfcmVhZF9zdHJmX3ZpZHNfd2l0aF9kYXRhKSwKKwkoZ3N0X3JpZmZfcmVhZF9zdHJmX2F1ZHNfd2l0aF9kYXRhKToKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksCisJKGdzdF9hdmlfZGVtdXhfYWRkX3N0cmVhbSksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpOgorCU1ha2Ugc3VyZSB3ZSBkb24ndCBjcmVhdGUgMCBzaXplZCBzdWJidWZmZXJzIGluIHJpZmYtcmVhZC4KKwlTaWduYWwgdGhlIG5vIG1vcmUgcGFkcyBzaWduYWwgYWZ0ZXIgcmVhZGluZyB0aGUgYXZpIGhlYWRlci4KKworMjAwNC0wNy0xNiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9nc3RkZWNvZGViaW4uYzogKGdzdF9kZWNvZGVfYmluX2dldF90eXBlKSwKKwkoZ3N0X2RlY29kZV9iaW5fY2xhc3NfaW5pdCksIChnc3RfZGVjb2RlX2Jpbl9pc19keW5hbWljKSwKKwkoZ3N0X2RlY29kZV9iaW5fZmFjdG9yeV9maWx0ZXIpLCAoY29tcGFyZV9yYW5rcyksIChwcmludF9mZWF0dXJlKSwKKwkoZ3N0X2RlY29kZV9iaW5faW5pdCksIChnc3RfZGVjb2RlX2Jpbl9kaXNwb3NlKSwKKwkoZmluZF9jb21wYXRpYmxlcyksIChjbG9zZV9wYWRfbGluayksICh0cnlfdG9fbGlua18xKSwgKG5ld19wYWQpLAorCShub19tb3JlX3BhZHMpLCAoY2xvc2VfbGluayksICh0eXBlX2ZvdW5kKSwKKwkoZ3N0X2RlY29kZV9iaW5fc2V0X3Byb3BlcnR5KSwgKGdzdF9kZWNvZGVfYmluX2dldF9wcm9wZXJ0eSksCisJKGdzdF9kZWNvZGVfYmluX2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdzdF9wbGF5X2Jhc2VfYmluX2dldF90eXBlKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fY2xhc3NfaW5pdCksIChnc3RfcGxheV9iYXNlX2Jpbl9pbml0KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fZGlzcG9zZSksIChxdWV1ZV9vdmVycnVuKSwKKwkoZ2VuX3ByZXJvbGxfZWxlbWVudCksIChyZW1vdmVfcHJlcm9sbHMpLCAodW5rbm93bl90eXBlKSwKKwkobm9fbW9yZV9wYWRzKSwgKG5ld19zdHJlYW0pLCAoc2V0dXBfc291cmNlKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fc2V0X3Byb3BlcnR5KSwgKGdzdF9wbGF5X2Jhc2VfYmluX2dldF9wcm9wZXJ0eSksCisJKHBsYXlfYmFzZV9lb3MpLCAoZ3N0X3BsYXlfYmFzZV9iaW5fY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fYWRkX2VsZW1lbnQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9yZW1vdmVfZWxlbWVudCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX211dGVfc3RyZWFtKSwgKGdzdF9wbGF5X2Jhc2VfYmluX2xpbmtfc3RyZWFtKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fdW5saW5rX3N0cmVhbSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2dldF9zdHJlYW1pbmZvKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5oOgorCUJldHRlciBlcnJvciByZWNvdmVyeS4gQWRkZWQgY29uZmlndXJhYmxlIHByZXJvbGwgcXVldWUgc2l6ZS4gRmFzdGVyCisJZGV0ZWN0aW9uIG9mIG5vLW1vcmUtcGFkcy4KKworMjAwNC0wNy0xNiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC1saWJzL2dzdC92aWRlby92aWRlby5oOgorCUFkZGVkIDMyIGJpdHMgUkdCQS4gTm90IHN1cmUgaWYgd2Ugc2hvdWxkIHVzZSBhbm90aGVyIG1pbWUtdHlwZQorCWZvciBhbHBoYSByZ2IuIEN1cnJlbnRseSB0aGUgcHJlc2VuY2Ugb2YgdGhlIGFscGhhX21hc2sgcHJvcGVydHkKKwlzaWduYWxzIGFuIGFscGhhIGNoYW5uZWwuCisKKzIwMDQtMDctMTYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3hjb250ZXh0X2dldCk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2dldF94dl9zdXBwb3J0KToKKwlGUFMgc2VlbXMgdG8gYmUgMC4wIHRvIE1BWCBldmVyeXdoZXJlIGVsc2UuCisKKzIwMDQtMDctMTUgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzoKKwkoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX2NhcHNfd2l0aF9kYXRhKToKKwkgIG1wNDIvbXA0MyAobm8gY2FwcykgZXhpc3QgdG9vLgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfdmlkZW9fY2Fwcyk6CisJICBTZXQgcGl4ZWxfd2lkdGgvaGVpZ2h0OyB3ZSd2ZSBnb3QgdGhlbSBpbi1jYXBzLgorCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChwbHVnaW5faW5pdCk6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKHBsdWdpbl9pbml0KToKKwkgIEJvdGggYXJlIHZhbGlkIHByaW1hcnkuCisJKiBzeXMvb3NzL2dzdG9zc21peGVyLmM6CisJICBSZW1vdmUgaTE4biBoYWNrIGFuZCBlbmFibGUgdHJhbnNsYXRpb25zLgorCisyMDA0LTA3LTE1ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfY2hlY2tfeHNobV9jYWxscyksCisJKGdzdF94dmltYWdlc2lua194dmltYWdlX25ldyksIChnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9kZXN0cm95KToKKwkgIGZpeCBmb3Igbm9uLXNobSB4di4gT3JpZ2luYWwgcGF0Y2ggYnkgVGltIFJpbmdlbmJhY2ggKGZpeGVzICMxNDcyNDgpCisKKzIwMDQtMDctMTUgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2Ffb3Blbl9hdWRpbyksCisJKGdzdF9hbHNhX3N3X3BhcmFtc19kdW1wKSwgKGdzdF9hbHNhX2h3X3BhcmFtc19kdW1wKSwKKwkoZ3N0X2Fsc2FfY2xvc2VfYXVkaW8pOgorCSAgZGlzYWJsZSBzb21lIG9mIHRoZSBkZWJ1Z2dpbmcgY29kZSBmb3Igbm93LiBXcml0aW5nIGRlYnVnZ2luZyB0byBhCisJICBidWZmZXIgaXMgYnJva2VuIGluIGN1cnJlbnQgYWxzYWxpYiByZWxlYXNlcy4KKworMjAwNC0wNy0xMiAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvbXBlZzJkZWMvZ3N0bXBlZzJkZWMuYzogKGdzdF9tcGVnMmRlY19hbGxvY19idWZmZXIpOgorCSAgdXNlIGJ1ZmZlcnBvb2xzCisKKzIwMDQtMDctMTQgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC90aGVvcmEvdGhlb3JhZGVjLmM6IChnc3RfdGhlb3JhX2RlY19jbGFzc19pbml0KSwKKwkodGhlb3JhX2RlY19zcmNfcXVlcnkpLCAodGhlb3JhX2RlY19ldmVudCk6CisJKiBleHQvdGhlb3JhL3RoZW9yYWVuYy5jOiAoZ3N0X3RoZW9yYV9lbmNfY2xhc3NfaW5pdCk6CisJICBhZGQgZGVidWdnaW5nIGNhdGVnb3JpZXMuICBSZW1vdmUgXG4ncy4KKworMjAwNC0wNy0xMyAgSm9oYW4gRGFobGluICA8am9oYW5AZ25vbWUub3JnPgorCisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJpbi5jIChnc3RfcGxheV9iaW5fc2V0X3Byb3BlcnR5KQorCShnc3RfcGxheV9iaW5fZ2V0X3Byb3BlcnR5KTogSW1wbC4KKworMjAwNC0wNy0xMyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfZGVtdXhfc2Vla19iZWZvcmUpOgorCVdoZW4gdHJ5aW5nIHRvIGZpbmQgdGhlIHN0cmVhbSBsZW5ndGgsIHNlZWsgYmFjayBOIHBhZ2VzCisJaW5zdGVhZCBvZiBqdXN0IG9uZSwgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIHN0cmVhbXMgaW4KKwl0aGUgY3VycmVudCBjaGFpbi4KKworMjAwNC0wNy0xMyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzoKKwkoZ3N0X3JpZmZfY3JlYXRlX2F1ZGlvX2NhcHNfd2l0aF9kYXRhKSwKKwkoZ3N0X3JpZmZfY3JlYXRlX2F1ZGlvX2NhcHMpLAorCShnc3RfcmlmZl9jcmVhdGVfYXVkaW9fdGVtcGxhdGVfY2Fwcyk6CisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmg6CisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuYzoKKwkoZ3N0X3JpZmZfcmVhZF9zdHJmX3ZpZHNfd2l0aF9kYXRhKSwKKwkoZ3N0X3JpZmZfcmVhZF9zdHJmX2F1ZHNfd2l0aF9kYXRhKSwgKGdzdF9yaWZmX3JlYWRfc3RyZl9hdWRzKToKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5oOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KSwKKwkoZ3N0X2F2aV9kZW11eF9hZGRfc3RyZWFtKToKKwlTZXQgY29kZWNfZGF0YSBvbiBjYXBzIGZvciBhdmlkZW11eGVyLgorCisyMDA0LTA3LTEyICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogRml4IHRlc3QgZm9yIE9iamVjdGl2ZSBDCisKKzIwMDQtMDctMTIgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOiAoZ3N0X2dka19waXhidWZfZ2V0X2NhcHNsaXN0KSwKKwkoZ3N0X2dka19waXhidWZfY2hhaW4pOgorCSAgQWRkIHN2ZyBhbmQgcGN4IHRvIHRlbXBsYXRlIGNhcHMsIGFuZCBlbnN1cmUgdGhhdCBnZXRjYXBzIHJldHVybnMgYQorCSAgc3Vic2V0IG9mIHRoZSB0ZW1wbGF0ZSBjYXBzLgorCSAgQ29weSBlYWNoIHJvdyBtYW51YWxseSBmb3Igb3V0cHV0LCBhcyBnZGtwaXhidWYgbWF5IHBhZCB0aGUKKwkgIHJvd3N0cmlkZSB0byBhIDMyLWJpdCB3b3JkIGJvdW5kYXJ5LgorCisyMDA0LTA3LTEyICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOiAoZ3N0X3JpZmZfY3JlYXRlX2F1ZGlvX2NhcHMpLAorCShnc3RfcmlmZl9jcmVhdGVfdmlkZW9fdGVtcGxhdGVfY2Fwcyk6CisJRml4IHRoZSB0ZW1wbGF0ZSBjYXBzIHRvIGluY2x1ZGUgc29tZSBtb3JlIG1lZGlhIHR5cGVzLgorCisyMDA0LTA3LTEyICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAoZ3N0X2RlY29kZV9iaW5fZ2V0X3R5cGUpLAorCShnc3RfZGVjb2RlX2Jpbl9jbGFzc19pbml0KSwgKGdzdF9kZWNvZGVfYmluX2ZhY3RvcnlfZmlsdGVyKSwKKwkoY29tcGFyZV9yYW5rcyksIChwcmludF9mZWF0dXJlKSwgKGdzdF9kZWNvZGVfYmluX2luaXQpLAorCShnc3RfZGVjb2RlX2Jpbl9kaXNwb3NlKSwgKGZpbmRfY29tcGF0aWJsZXMpLCAoY2xvc2VfcGFkX2xpbmspLAorCSh0cnlfdG9fbGlua18xKSwgKG5ld19wYWQpLCAoY2xvc2VfbGluayksICh0eXBlX2ZvdW5kKSwKKwkoZ3N0X2RlY29kZV9iaW5fc2V0X3Byb3BlcnR5KSwgKGdzdF9kZWNvZGVfYmluX2dldF9wcm9wZXJ0eSksCisJKGdzdF9kZWNvZGVfYmluX2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdzdF9wbGF5X2Jhc2VfYmluX2dldF90eXBlKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fY2xhc3NfaW5pdCksIChnc3RfcGxheV9iYXNlX2Jpbl9pbml0KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fZGlzcG9zZSksIChxdWV1ZV9vdmVycnVuKSwKKwkoZ2VuX3ByZXJvbGxfZWxlbWVudCksIChyZW1vdmVfcHJlcm9sbHMpLCAobm9fbW9yZV9wYWRzKSwKKwkobmV3X3N0cmVhbSksIChzZXR1cF9zb3VyY2UpLCAoZ3N0X3BsYXlfYmFzZV9iaW5fc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fZ2V0X3Byb3BlcnR5KSwgKHBsYXlfYmFzZV9lb3MpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3BsYXlfYmFzZV9iaW5fYWRkX2VsZW1lbnQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9yZW1vdmVfZWxlbWVudCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX211dGVfc3RyZWFtKSwgKGdzdF9wbGF5X2Jhc2VfYmluX2xpbmtfc3RyZWFtKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fdW5saW5rX3N0cmVhbSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2dldF9zdHJlYW1pbmZvKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5oOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdzdF9wbGF5X2Jpbl9nZXRfdHlwZSksCisJKGdzdF9wbGF5X2Jpbl9jbGFzc19pbml0KSwgKGdzdF9wbGF5X2Jpbl9pbml0KSwKKwkoZ3N0X3BsYXlfYmluX2Rpc3Bvc2UpLCAoZ3N0X3BsYXlfYmluX3NldF9wcm9wZXJ0eSksCisJKGdzdF9wbGF5X2Jpbl9nZXRfcHJvcGVydHkpLCAoZ2VuX3ZpZGVvX2VsZW1lbnQpLAorCShnZW5fYXVkaW9fZWxlbWVudCksIChyZW1vdmVfc2lua3MpLCAoc2V0dXBfc2lua3MpLAorCShnc3RfcGxheV9iaW5fY2hhbmdlX3N0YXRlKSwgKGdzdF9wbGF5X2Jpbl9nZXRfZXZlbnRfbWFza3MpLAorCShnc3RfcGxheV9iaW5fc2VuZF9ldmVudCksIChnc3RfcGxheV9iaW5fZ2V0X2Zvcm1hdHMpLAorCShnc3RfcGxheV9iaW5fY29udmVydCksIChnc3RfcGxheV9iaW5fZ2V0X3F1ZXJ5X3R5cGVzKSwKKwkoZ3N0X3BsYXlfYmluX3F1ZXJ5KSwgKHBsdWdpbl9pbml0KToKKwkqIGdzdC9wbGF5YmFjay90ZXN0NC5jOiAobWFpbik6CisJTW9yZSBmaXhlcyBvbiByZXVzaW5nIG9mIHRoZSBlbGVtZW50LgorCisyMDA0LTA3LTExICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChub3JtYWxfc2Vlayk6CisJICBhbGxvdyBzZWVraW5nIGZvciBvdGhlciBtZXRob2RzIHRoYW4ganVzdCBTRVQKKworMjAwNC0wNy0xMSAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYyAoZ3N0X2F1ZGlvX2NvbnZlcnRfbGluayk6IEZvcgorCWZsb2F0LCAiYW55IiBjYXBzIC0+IGJ1ZmZlcl9mcmFtZXM9WzAsTUFYXS4KKworCSogZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jIChpbnRlcmxlYXZlX2dldGNhcHMpOiBTZWVtcyB0aGUgY29yZQorCWRvZXNuJ3QgaW50ZXJzZWN0IG91ciBjYXBzIHdpdGggdGhlIHRlbXBsYXRlIGFueSBtb3JlLiBEbyBpdAorCW91cnNlbHZlcy4KKwkoaW50ZXJsZWF2ZV9idWZmZXJlZF9sb29wKTogVXNlIGdfbmV3YSBpbnN0ZWFkIG9mIG1hbGxvYy9mcmVlLgorCisyMDA0LTA3LTA5ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAoZ3N0X2RlY29kZV9iaW5fZ2V0X3R5cGUpLAorCShnc3RfZGVjb2RlX2Jpbl9jbGFzc19pbml0KSwgKGdzdF9kZWNvZGVfYmluX2ZhY3RvcnlfZmlsdGVyKSwKKwkoY29tcGFyZV9yYW5rcyksIChwcmludF9mZWF0dXJlKSwgKGdzdF9kZWNvZGVfYmluX2luaXQpLAorCShnc3RfZGVjb2RlX2Jpbl9kaXNwb3NlKSwgKGZpbmRfY29tcGF0aWJsZXMpLCAoY2xvc2VfcGFkX2xpbmspLAorCSh0cnlfdG9fbGlua18xKSwgKG5ld19wYWQpLCAoY2xvc2VfbGluayksICh0eXBlX2ZvdW5kKSwKKwkoZ3N0X2RlY29kZV9iaW5fc2V0X3Byb3BlcnR5KSwgKGdzdF9kZWNvZGVfYmluX2dldF9wcm9wZXJ0eSksCisJKGdzdF9kZWNvZGVfYmluX2NoYW5nZV9zdGF0ZSksIChwbHVnaW5faW5pdCk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJhc2ViaW4uYzogKGdzdF9wbGF5X2Jhc2VfYmluX2dldF90eXBlKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fY2xhc3NfaW5pdCksIChnc3RfcGxheV9iYXNlX2Jpbl9pbml0KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fZGlzcG9zZSksIChxdWV1ZV9vdmVycnVuKSwKKwkoZ2VuX3ByZXJvbGxfZWxlbWVudCksIChyZW1vdmVfcHJlcm9sbHMpLCAobm9fbW9yZV9wYWRzKSwKKwkobmV3X3N0cmVhbSksIChzZXR1cF9zb3VyY2UpLCAoZ3N0X3BsYXlfYmFzZV9iaW5fc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fZ2V0X3Byb3BlcnR5KSwgKHBsYXlfYmFzZV9lb3MpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3BsYXlfYmFzZV9iaW5fYWRkX2VsZW1lbnQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9yZW1vdmVfZWxlbWVudCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX211dGVfc3RyZWFtKSwgKGdzdF9wbGF5X2Jhc2VfYmluX2xpbmtfc3RyZWFtKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fdW5saW5rX3N0cmVhbSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2dldF9zdHJlYW1pbmZvKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5oOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdzdF9wbGF5X2Jpbl9nZXRfdHlwZSksCisJKGdzdF9wbGF5X2Jpbl9jbGFzc19pbml0KSwgKGdzdF9wbGF5X2Jpbl9pbml0KSwKKwkoZ3N0X3BsYXlfYmluX2Rpc3Bvc2UpLCAoZ3N0X3BsYXlfYmluX3NldF9wcm9wZXJ0eSksCisJKGdzdF9wbGF5X2Jpbl9nZXRfcHJvcGVydHkpLCAoZ2VuX3ZpZGVvX2VsZW1lbnQpLAorCShnZW5fYXVkaW9fZWxlbWVudCksIChyZW1vdmVfc2lua3MpLCAoc2V0dXBfc2lua3MpLAorCShnc3RfcGxheV9iaW5fY2hhbmdlX3N0YXRlKSwgKGdzdF9wbGF5X2Jpbl9nZXRfZXZlbnRfbWFza3MpLAorCShnc3RfcGxheV9iaW5fc2VuZF9ldmVudCksIChnc3RfcGxheV9iaW5fZ2V0X2Zvcm1hdHMpLAorCShnc3RfcGxheV9iaW5fY29udmVydCksIChnc3RfcGxheV9iaW5fZ2V0X3F1ZXJ5X3R5cGVzKSwKKwkoZ3N0X3BsYXlfYmluX3F1ZXJ5KSwgKHBsdWdpbl9pbml0KToKKwkqIGdzdC9wbGF5YmFjay90ZXN0NC5jOiAobWFpbik6CisJV29yayBvbiBvYmplY3QgcmV1c2UgYW5kIHNlZWtpbmcuCisKKzIwMDQtMDctMDkgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleGFtcGxlcy9zZWVraW5nL3NlZWsuYzogKGl0ZXJhdGUpOgorCURvbid0IGNvbnN1bWUgYWxsIENQVSBpbiB0aGUgaWRsZSBsb29wLgorCisyMDA0LTA3LTA5ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2RlbXV4LmM6IChnc3RfbXBlZ19kZW11eF9uZXdfb3V0cHV0X3BhZCksCisJKGdzdF9tcGVnX2RlbXV4X3BhcnNlX3BhY2tldCksIChnc3RfbXBlZ19kZW11eF9wcm9jZXNzX3ByaXZhdGUpOgorCUFkZCBwYWQgdG8gZWxlbWVudCAqYWZ0ZXIqIHNldHRpbmcgdGhlIHBhZCBmdW5jdGlvbnMgc28gdGhhdAorCXRoZSBzY2hlZHVsZXIgY2FuIHVzZSB0aGUgY29ycmVjdCBvbmVzLgorCisyMDA0LTA3LTA5ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzogKHRoZW9yYV9kZWNfZnJvbV9ncmFudWxlcG9zKSwKKwkodGhlb3JhX2RlY19zcmNfcXVlcnkpLCAodGhlb3JhX2RlY19zcmNfZXZlbnQpLCAodGhlb3JhX2RlY19jaGFpbik6CisJU3luYyB0byBrZXlmcmFtZSBhZnRlciBzZWVrCisKKzIwMDQtMDctMDkgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgKGF0KSBhcGVzdGFhcnQgKGRvdCkgb3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfY2hlY2tfZXZlbnQpLAorCShnc3RfYWxzYV9zaW5rX2xvb3ApLCAoZ3N0X2Fsc2Ffc2lua19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYXNyYy5jOiAoZ3N0X2Fsc2Ffc3JjX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvbGlidmlzdWFsL3Zpc3VhbC5jOiAoZ3N0X3Zpc3VhbF9jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzogKHRoZW9yYV9kZWNfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC90aGVvcmEvdGhlb3JhZW5jLmM6ICh0aGVvcmFfZW5jX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jOiAodm9yYmlzX2RlY19jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0LWxpYnMvZ3N0L25hdmlnYXRpb24vbmF2aWdhdGlvbi5jOgorCSogZ3N0L2FkZGVyL2dzdGFkZGVyLmM6IChnc3RfYWRkZXJfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChnc3RfYXVkaW9fY29udmVydF9jaGFpbiksCisJKGdzdF9hdWRpb19jb252ZXJ0X2dldF9idWZmZXIpOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOgorCShnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvcGxheWJhY2svZ3N0ZGVjb2RlYmluLmM6IChnc3RfZGVjb2RlX2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdzdF9wbGF5X2Jpbl9jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L3ZpZGVvc2NhbGUvZ3N0dmlkZW9zY2FsZS5jOgorCShnc3RfdmlkZW9zY2FsZV9oYW5kbGVfc3JjX2V2ZW50KToKKwkqIGdzdC92b2x1bWUvZ3N0dm9sdW1lLmM6ICh2b2x1bWVfY2hhaW5faW50MTYpOgorCSAgZG9uJ3QgYXNzZXJ0IGluIHN0YXRlIGNoYW5nZSwgdGhpcyBzaG91bGQgYmUgZG9uZSBieSB0aGUgYmFzZQorCSAgR3N0RWxlbWVudCBjbGFzcy4KKwkgIHZhcmlvdXMgZGVidWdnaW5nIGZpeGVzLgorCisyMDA0LTA3LTA4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5jOiAoZ3N0X3BsYXlfcGlwZWxpbmVfc2V0dXApLAorCShnc3RfcGxheV9kaXNwb3NlKSwgKGdzdF9wbGF5X3NldF9sb2NhdGlvbiksCisJKGdzdF9wbGF5X3NldF9kYXRhX3NyYyksIChnc3RfcGxheV9zZXRfdmlkZW9fc2luayksCisJKGdzdF9wbGF5X3NldF9hdWRpb19zaW5rKSwgKGdzdF9wbGF5X3NldF92aXN1YWxpemF0aW9uKSwKKwkoZ3N0X3BsYXlfY29ubmVjdF92aXN1YWxpemF0aW9uKSwgKGdzdF9wbGF5X2dldF9zaW5rX2VsZW1lbnQpLAorCShnc3RfcGxheV9nZXRfYWxsX2J5X2ludGVyZmFjZSk6CisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5Lmg6CisJICBhZGQgbmV3IG1ldGhvZCB0byBnZXQgZWxlbWVudHMgaW1wbGVtZW50aW5nIGFuIGludGVyZmFjZS4KKwkgIGFkZCB2YXJpb3VzIGVycm9yIGxvZ2dpbmcKKworMjAwNC0wNy0wOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4YW1wbGVzL3NlZWtpbmcvc2Vlay5jOiAobWFrZV9kdl9waXBlbGluZSksIChtYWtlX2F2aV9waXBlbGluZSksCisJKG1ha2VfbXBlZ19waXBlbGluZSksIChtYWtlX21wZWdudF9waXBlbGluZSksCisJKG1ha2VfcGxheWVyYmluX3BpcGVsaW5lKSwgKHF1ZXJ5X2R1cmF0aW9uc19lbGVtcyksCisJKHF1ZXJ5X2R1cmF0aW9uc19wYWRzKSwgKHF1ZXJ5X3Bvc2l0aW9uc19lbGVtcyksCisJKHF1ZXJ5X3Bvc2l0aW9uc19wYWRzKSwgKHVwZGF0ZV9zY2FsZSksIChpdGVyYXRlKSwgKHN0b3Bfc2VlayksCisJKG1haW4pOgorCUFkZGVkIHBsYXliaW4gc2Vla2luZyBleGFtcGxlLgorCisyMDA0LTA3LTA4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5jOiAoZ3N0X3BsYXlfc2V0X2xvY2F0aW9uKSwKKwkoZ3N0X3BsYXlfc2V0X2RhdGFfc3JjKSwgKGdzdF9wbGF5X3NldF92aWRlb19zaW5rKSwKKwkoZ3N0X3BsYXlfc2V0X2F1ZGlvX3NpbmspLCAoZ3N0X3BsYXlfc2V0X3Zpc3VhbGl6YXRpb24pLAorCShnc3RfcGxheV9jb25uZWN0X3Zpc3VhbGl6YXRpb24pLCAoZ3N0X3BsYXlfZ2V0X2ZyYW1lcmF0ZSk6CisJICB1c2UgYSBtYWNybyB0byBsb29rIHVwIGVsZW1lbnRzIGZyb20gaGFzaCB0YWJsZQorCisyMDA0LTA3LTA4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5jOiAoZ3N0X3BsYXlfcGlwZWxpbmVfc2V0dXApLAorCShnc3RfcGxheV9nZXRfbGVuZ3RoX2NhbGxiYWNrKSwgKGdzdF9wbGF5X3NldF9sb2NhdGlvbiksCisJKGdzdF9wbGF5X3NlZWtfdG9fdGltZSksIChnc3RfcGxheV9zZXRfZGF0YV9zcmMpLAorCShnc3RfcGxheV9zZXRfdmlkZW9fc2luayksIChnc3RfcGxheV9zZXRfYXVkaW9fc2luayksCisJKGdzdF9wbGF5X3NldF92aXN1YWxpemF0aW9uKSwgKGdzdF9wbGF5X2Nvbm5lY3RfdmlzdWFsaXphdGlvbiksCisJKGdzdF9wbGF5X2dldF9zaW5rX2VsZW1lbnQpOgorCS0gYWRkIGRlYnVnZ2luZyBpbmZvCisJLSBmaXggbG9va2luZyB1cCBzaW5rIGVsZW1lbnRzIGJ5IGl0ZXJhdGluZyBvdmVyIGNvbXBsZXRlIGNhcHMKKwktIHB1dCBldmVyeXRoaW5nIGV4Y2VwdCBmb3Igc291cmNlIGFuZCBhdXRvcGx1Z2dlciBpbiBhIGNvbXBsZXRlIGJpbgorCisyMDA0LTA3LTA4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfZHJhaW5fYXVkaW8pOgorCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfZmx1c2hfb25lX3BhZCksCisJKGdzdF9hbHNhX3NpbmtfY2hlY2tfZXZlbnQpLCAoZ3N0X2Fsc2Ffc2lua19tbWFwKSwKKwkoZ3N0X2Fsc2Ffc2lua193cml0ZSksIChnc3RfYWxzYV9zaW5rX2xvb3ApOgorCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuaDoKKwktIGFkZCBkZWJ1Z2dpbmcgaW5mbworCS0gY2xlYW4gdXAgc2NoaXpvcGhyZW5pYSBvZiBkYXRhL2J1ZmZlci9ldmVudAorCS0gZml4IGRvdWJsZSBldmVudCB1bnJlZiBlcnJvcgorCisyMDA0LTA3LTA4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3BsYXliYWNrL01ha2VmaWxlLmFtOgorCUFkZCBoZWFkZXJzIHRvIG5vaW5zdAorCisyMDA0LTA3LTA4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSogdG9vbHMvZ3N0LWxhdW5jaC1leHQtbS5tOgorCSogdG9vbHMvZ3N0LWxhdW5jaC1leHQuMS5pbjoKKwkgIGNvbnZlcnQgdG8gdGhlIHRoaXJkIG1pbGxlbml1bQorCisyMDA0LTA3LTA3ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIHN5cy9keHIzL01ha2VmaWxlLmFtOiBub2luc3RfU09VUkNFUyBzaG91bGQgYmUgbm9kaXN0X1NPVVJDRVMKKworMjAwNC0wNy0wNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9wbGF5YmFjay9NYWtlZmlsZS5hbToKKwkqIGdzdC9wbGF5YmFjay9SRUFETUU6CisJKiBnc3QvcGxheWJhY2svZ3N0ZGVjb2RlYmluLmM6IChnc3RfZGVjb2RlX2Jpbl9nZXRfdHlwZSksCisJKGdzdF9kZWNvZGVfYmluX2NsYXNzX2luaXQpLCAoZ3N0X2RlY29kZV9iaW5fZmFjdG9yeV9maWx0ZXIpLAorCShjb21wYXJlX3JhbmtzKSwgKHByaW50X2ZlYXR1cmUpLCAoZ3N0X2RlY29kZV9iaW5faW5pdCksCisJKGdzdF9kZWNvZGVfYmluX2Rpc3Bvc2UpLCAoZmluZF9jb21wYXRpYmxlcyksIChjbG9zZV9wYWRfbGluayksCisJKHRyeV90b19saW5rXzEpLCAobmV3X3BhZCksIChjbG9zZV9saW5rKSwgKHR5cGVfZm91bmQpLAorCShnc3RfZGVjb2RlX2Jpbl9zZXRfcHJvcGVydHkpLCAoZ3N0X2RlY29kZV9iaW5fZ2V0X3Byb3BlcnR5KSwKKwkocGx1Z2luX2luaXQpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliYXNlYmluLmM6IChnc3RfcGxheV9iYXNlX2Jpbl9nZXRfdHlwZSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2NsYXNzX2luaXQpLCAoZ3N0X3BsYXlfYmFzZV9iaW5faW5pdCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2Rpc3Bvc2UpLCAocmVidWlsZF9waXBlbGluZSksIChxdWV1ZV9vdmVycnVuKSwKKwkoZ2VuX3ByZXJvbGxfZWxlbWVudCksIChub19tb3JlX3BhZHMpLCAobmV3X3N0cmVhbSksCisJKHNldHVwX3NvdXJjZSksIChnc3RfcGxheV9iYXNlX2Jpbl9zZXRfcHJvcGVydHkpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9nZXRfcHJvcGVydHkpLCAoZ3N0X3BsYXlfYmFzZV9iaW5fY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fYWRkX2VsZW1lbnQpLAorCShnc3RfcGxheV9iYXNlX2Jpbl9yZW1vdmVfZWxlbWVudCksCisJKGdzdF9wbGF5X2Jhc2VfYmluX211dGVfc3RyZWFtKSwgKGdzdF9wbGF5X2Jhc2VfYmluX2xpbmtfc3RyZWFtKSwKKwkoZ3N0X3BsYXlfYmFzZV9iaW5fdW5saW5rX3N0cmVhbSksCisJKGdzdF9wbGF5X2Jhc2VfYmluX2dldF9zdHJlYW1pbmZvKToKKwkqIGdzdC9wbGF5YmFjay9nc3RwbGF5YmFzZWJpbi5oOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdzdF9wbGF5X2Jpbl9nZXRfdHlwZSksCisJKGdzdF9wbGF5X2Jpbl9jbGFzc19pbml0KSwgKGdzdF9wbGF5X2Jpbl9pbml0KSwKKwkoZ3N0X3BsYXlfYmluX2Rpc3Bvc2UpLCAoZ3N0X3BsYXlfYmluX3NldF9wcm9wZXJ0eSksCisJKGdzdF9wbGF5X2Jpbl9nZXRfcHJvcGVydHkpLCAoZ2VuX3ZpZGVvX2VsZW1lbnQpLAorCShnZW5fYXVkaW9fZWxlbWVudCksIChzZXR1cF9zaW5rcyksIChnc3RfcGxheV9iaW5fY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3BsYXlfYmluX2dldF9ldmVudF9tYXNrcyksIChnc3RfcGxheV9iaW5fc2VuZF9ldmVudCksCisJKGdzdF9wbGF5X2Jpbl9nZXRfZm9ybWF0cyksIChnc3RfcGxheV9iaW5fY29udmVydCksCisJKGdzdF9wbGF5X2Jpbl9nZXRfcXVlcnlfdHlwZXMpLCAoZ3N0X3BsYXlfYmluX3F1ZXJ5KSwKKwkocGx1Z2luX2luaXQpOgorCSogZ3N0L3BsYXliYWNrL2dzdHN0cmVhbWluZm8uYzogKGdzdF9zdHJlYW1fdHlwZV9nZXRfdHlwZSksCisJKGdzdF9zdHJlYW1faW5mb19nZXRfdHlwZSksIChnc3Rfc3RyZWFtX2luZm9fY2xhc3NfaW5pdCksCisJKGdzdF9zdHJlYW1faW5mb19pbml0KSwgKGdzdF9zdHJlYW1faW5mb19uZXcpLAorCShnc3Rfc3RyZWFtX2luZm9fZGlzcG9zZSksIChnc3Rfc3RyZWFtX2luZm9fc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3N0cmVhbV9pbmZvX2dldF9wcm9wZXJ0eSk6CisJKiBnc3QvcGxheWJhY2svZ3N0c3RyZWFtaW5mby5oOgorCSogZ3N0L3BsYXliYWNrL3Rlc3QuYzogKGdlbl92aWRlb19lbGVtZW50KSwgKGdlbl9hdWRpb19lbGVtZW50KSwKKwkobWFpbik6CisJKiBnc3QvcGxheWJhY2svdGVzdDIuYzogKG1haW4pOgorCSogZ3N0L3BsYXliYWNrL3Rlc3QzLmM6ICh1cGRhdGVfc2NhbGUpLCAobWFpbik6CisJTW9yZSBwbGF5YmluIGZpeGVzLiBBZGRlZCBSRUFETUUuIERvIGJldHRlciBlbGVtZW50IGZpbHRlcmluZy4KKwlBZGRlZCBiYXNlIGNsYXNzIHRvIHByZXJvbGwgbWVkaWEuIEFkZGVkIHRlc3QgYXBwcy4KKworMjAwNC0wNy0wNyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOiAoZ3N0X21wZWcyZGVjX2ZsdXNoX2RlY29kZXIpOgorCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmg6CisJICB2YXJpb3VzIGRlYnVnZ2luZyBpbXByb3ZlbWVudHMuICBSZXNldCBzdHJlYW0gdG8gbmV4dCBwaWN0dXJlCisJICBpbnN0ZWFkIG9mIHNlcXVlbmNlIGhlYWRlciwgb3RoZXJ3aXNlIHNlZWtzIGNhbm5vdCB3b3JrLgorCisyMDA0LTA3LTA3ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmM6IChnc3RfdmlkZW9fYm94X2ZpbGxfZ2V0X3R5cGUpLAorCShnc3RfdmlkZW9fYm94X2NsYXNzX2luaXQpLCAoZ3N0X3ZpZGVvX2JveF9zZXRfcHJvcGVydHkpLAorCShnc3RfdmlkZW9fYm94X2k0MjApLCAoZ3N0X3ZpZGVvX2JveF9heXV2KSwgKGdzdF92aWRlb19ib3hfY2hhaW4pOgorCVVzZSBwYWRfYWxsb2Mgd2hlcmUgcG9zc2libGUuCisKKzIwMDQtMDctMDcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogKGdzdF9vc3NlbGVtZW50X3Jlc2V0KSwKKwkoZ3N0X29zc2VsZW1lbnRfcGFyc2VfY2Fwcyk6CisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuaDoKKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6IChnc3Rfb3Nzc3JjX2dldCk6CisJRml4IG9mZnNldCBvbiBvc3NzcmMuCisKKzIwMDQtMDctMDcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvdGhlb3JhL3RoZW9yYS5jOiAocGx1Z2luX2luaXQpOgorCSogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzogKHRoZW9yYV9kZWNfZnJvbV9ncmFudWxlcG9zKSwKKwkodGhlb3JhX2RlY19zcmNfcXVlcnkpLCAodGhlb3JhX2RlY19jaGFpbik6CisJKiBleHQvdGhlb3JhL3RoZW9yYWVuYy5jOiAoZ3N0X3RoZW9yYV9lbmNfY2xhc3NfaW5pdCksCisJKHRoZW9yYV9lbmNfc2lua19saW5rKSwgKHRoZW9yYV9idWZmZXJfZnJvbV9wYWNrZXQpLAorCSh0aGVvcmFfcHVzaF9wYWNrZXQpLCAodGhlb3JhX2VuY19jaGFpbik6CisJRml4IHRoZW9yYSBncmFudWxlcG9zIGNhbGN1bGF0aW9uLgorCUZpeCBvdmVyZmxvdyBpbiBkdXJhdGlvbi9wb3NpdGlvbiBjYWxjdWxhdGlvbi4KKwlCdW1wIHJhbmsgdG8gUFJJTUFSWSBmb3IgdGhlb3JhZGVjLgorCVVzZSBncmFudWxlcG9zIG9mIGxhc3QgcGFja2V0IHRvIGNhbGN1bGF0ZSBwb3NpdGlvbi4KKwlTZXQga2V5ZnJhbWUgZmxhZyBvbiBidWZmZXJzIHdoZW4gbmVlZGVkLgorCisyMDA0LTA3LTA2ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9wbGF5YmFjay9NYWtlZmlsZS5hbTogJ3Rlc3QnIGluIGJpbl9QUk9HUkFNUz8gIEFyZSB5b3UKKwlzZXJpb3VzPyAgKEZpeGVkLCBvYnZpb3VzbHkuKQorCisyMDA0LTA3LTA2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBwby9MSU5HVUFTOgorCSogcG8vY3MucG86CisJICBhZGRlZCBDemVjaCB0cmFuc2xhdGlvbiAoTWlsb3NsYXYgVHJtYWMpCisKKzIwMDQtMDctMDUgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvcGxheWJhY2svZ3N0ZGVjb2RlYmluLmM6IChnc3RfZGVjb2RlX2Jpbl9nZXRfdHlwZSksCisJKGdzdF9kZWNvZGVfYmluX2NsYXNzX2luaXQpLCAoZ3N0X2RlY29kZV9iaW5fZmFjdG9yeV9maWx0ZXIpLAorCShjb21wYXJlX3JhbmtzKSwgKGdzdF9kZWNvZGVfYmluX2luaXQpLCAoZ3N0X2RlY29kZV9iaW5fZGlzcG9zZSksCisJKGZpbmRfY29tcGF0aWJsZXMpLCAoY2xvc2VfcGFkX2xpbmspLCAodHJ5X3RvX2xpbmtfMSksIChuZXdfcGFkKSwKKwkoY2xvc2VfbGluayksICh0eXBlX2ZvdW5kKSwgKGdzdF9kZWNvZGVfYmluX3NldF9wcm9wZXJ0eSksCisJKGdzdF9kZWNvZGVfYmluX2dldF9wcm9wZXJ0eSksIChnc3RfZGVjb2RlX2Jpbl9nZXRfZXZlbnRfbWFza3MpLAorCShnc3RfZGVjb2RlX2Jpbl9zZW5kX2V2ZW50KSwgKGdzdF9kZWNvZGVfYmluX2dldF9mb3JtYXRzKSwKKwkoZ3N0X2RlY29kZV9iaW5fY29udmVydCksIChnc3RfZGVjb2RlX2Jpbl9nZXRfcXVlcnlfdHlwZXMpLAorCShnc3RfZGVjb2RlX2Jpbl9xdWVyeSksIChwbHVnaW5faW5pdCk6CisJKiBnc3QvcGxheWJhY2svZ3N0cGxheWJpbi5jOiAoZ3N0X3BsYXlfYmluX2dldF90eXBlKSwKKwkoZ3N0X3BsYXlfYmluX2NsYXNzX2luaXQpLCAoZ3N0X3BsYXlfYmluX2luaXQpLAorCShnc3RfcGxheV9iaW5fZGlzcG9zZSksIChyZWJ1aWxkX3BpcGVsaW5lKSwgKGdldF9hdWRpb19lbGVtZW50KSwKKwkoZ2V0X3ZpZGVvX2VsZW1lbnQpLCAobmV3X3BhZCksIChzZXR1cF9zb3VyY2UpLAorCShnc3RfcGxheV9iaW5fc2V0X3Byb3BlcnR5KSwgKGdzdF9wbGF5X2Jpbl9nZXRfcHJvcGVydHkpLAorCShnc3RfcGxheV9iaW5fY2hhbmdlX3N0YXRlKSwgKGdzdF9wbGF5X2Jpbl9hZGRfZWxlbWVudCksCisJKGdzdF9wbGF5X2Jpbl9yZW1vdmVfZWxlbWVudCksIChnc3RfcGxheV9iaW5fZ2V0X2V2ZW50X21hc2tzKSwKKwkoZ3N0X3BsYXlfYmluX3NlbmRfZXZlbnQpLCAoZ3N0X3BsYXlfYmluX2dldF9mb3JtYXRzKSwKKwkoZ3N0X3BsYXlfYmluX2NvbnZlcnQpLCAoZ3N0X3BsYXlfYmluX2dldF9xdWVyeV90eXBlcyksCisJKGdzdF9wbGF5X2Jpbl9xdWVyeSksIChnc3RfcGxheV9iaW5fZ2V0X2Nsb2NrKSwgKHBsdWdpbl9pbml0KToKKwkqIGdzdC9wbGF5YmFjay90ZXN0LmM6IChtYWluKToKKwlNb3JlIGZpeGVzLCBjbGVhbmVkIHVwIHBsYXliaW4sIG1ha2UgaXQgdXNlIGRlY29kZWJpbi4gQWRkZWQKKwl0aHJlYWRlZCBwcm9wZXJ0eSB0byBwbGF5YmluLgorCisyMDA0LTA3LTA1ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L3BsYXliYWNrL01ha2VmaWxlLmFtOgorCSogZ3N0L3BsYXliYWNrL2RlY29kZXRlc3QuYzogKG1haW4pOgorCSogZ3N0L3BsYXliYWNrL2dzdGRlY29kZWJpbi5jOiAoZ3N0X2RlY29kZV9iaW5fZ2V0X3R5cGUpLAorCShnc3RfZGVjb2RlX2Jpbl9jbGFzc19pbml0KSwgKGdzdF9kZWNvZGVfYmluX2ZhY3RvcnlfZmlsdGVyKSwKKwkoY29tcGFyZV9yYW5rcyksIChnc3RfZGVjb2RlX2Jpbl9pbml0KSwgKGdzdF9kZWNvZGVfYmluX2Rpc3Bvc2UpLAorCShmaW5kX2NvbXBhdGlibGVzKSwgKGNsb3NlX3BhZF9saW5rKSwgKHRyeV90b19saW5rXzEpLCAobmV3X3BhZCksCisJKGNsb3NlX2xpbmspLCAodHlwZV9mb3VuZCksIChnc3RfZGVjb2RlX2Jpbl9zZXRfcHJvcGVydHkpLAorCShnc3RfZGVjb2RlX2Jpbl9nZXRfcHJvcGVydHkpLCAoZ3N0X2RlY29kZV9iaW5fY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X2RlY29kZV9iaW5fZ2V0X2V2ZW50X21hc2tzKSwgKGdzdF9kZWNvZGVfYmluX3NlbmRfZXZlbnQpLAorCShnc3RfZGVjb2RlX2Jpbl9nZXRfZm9ybWF0cyksIChnc3RfZGVjb2RlX2Jpbl9jb252ZXJ0KSwKKwkoZ3N0X2RlY29kZV9iaW5fZ2V0X3F1ZXJ5X3R5cGVzKSwgKGdzdF9kZWNvZGVfYmluX3F1ZXJ5KSwKKwkocGx1Z2luX2luaXQpOgorCSogZ3N0L3BsYXliYWNrL2dzdHBsYXliaW4uYzogKGdzdF9wbGF5X2Jpbl9nZXRfdHlwZSksCisJKGdzdF9wbGF5X2Jpbl9jbGFzc19pbml0KSwgKGdzdF9wbGF5X2Jpbl9pbml0KSwKKwkoZ3N0X3BsYXlfYmluX2Rpc3Bvc2UpLCAoZ2VuX2RlZmF1bHRfb3V0cHV0KSwgKHJlYnVpbGRfcGlwZWxpbmUpLAorCShjb2xsZWN0X3NpbmtfcGFkcyksIChmaW5kX2NvbXBhdGlibGVzKSwgKGNsb3NlX3BhZF9saW5rKSwKKwkodHJ5X3RvX2xpbmtfMSksIChuZXdfcGFkKSwgKGNsb3NlX2xpbmspLCAodHlwZV9mb3VuZCksCisJKHNldHVwX3NvdXJjZSksIChnc3RfcGxheV9iaW5fc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3BsYXlfYmluX2dldF9wcm9wZXJ0eSksIChnc3RfcGxheV9iaW5fZmFjdG9yeV9maWx0ZXIpLAorCShjb21wYXJlX3JhbmtzKSwgKGdzdF9wbGF5X2Jpbl9jb2xsZWN0X2ZhY3RvcmllcyksCisJKGdzdF9wbGF5X2Jpbl9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3BsYXlfYmluX2FkZF9lbGVtZW50KSwKKwkoZ3N0X3BsYXlfYmluX3JlbW92ZV9lbGVtZW50KSwgKGdzdF9wbGF5X2Jpbl9nZXRfZXZlbnRfbWFza3MpLAorCShnc3RfcGxheV9iaW5fc2VuZF9ldmVudCksIChnc3RfcGxheV9iaW5fZ2V0X2Zvcm1hdHMpLAorCShnc3RfcGxheV9iaW5fY29udmVydCksIChnc3RfcGxheV9iaW5fZ2V0X3F1ZXJ5X3R5cGVzKSwKKwkoZ3N0X3BsYXlfYmluX3F1ZXJ5KSwgKGdzdF9wbGF5X2Jpbl9nZXRfY2xvY2spLCAocGx1Z2luX2luaXQpOgorCSogZ3N0L3BsYXliYWNrL3Rlc3QuYzogKG1haW4pOgorCUFkZGVkIHNvbWUgcGxheWJhY2sgaGVscGVyIGVsZW1lbnRzIGFuZCBzb21lIHRlc3QgYXBwcywgdmVyeSBhbHBoYQorCXN0aWxsLgorCisyMDA0LTA3LTA0ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX3hydW5fcmVjb3ZlcnkpOgorCSAgb25seSByZXN0YXJ0IGF1ZGlvIHdoZW4gd2UgaW5kZWVkIGhhdmUgYW4geHJ1biB0byBmaXggcmVwZWF0ZWQKKwkgIHhydW5zLiBGaXggc3VnZ2VzdGVkIGJ5IEdpdWxpYW5vIFBvY2hpbmkuCisKKzIwMDQtMDctMDMgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYXBsdWdpbi5jOiAoZ3N0X2Fsc2FfZXJyb3Jfd3JhcHBlcik6IERpc2FibGUKKwljYWxsIHRvIGdzdF9kZWJ1Z19sb2coKSBpZiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQgKGJ1ZyAjMTQ1MTE4KQorCisyMDA0LTA3LTAzICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX3hydW5fcmVjb3ZlcnkpOgorCSAgdXNlIG91ciBvd24gZnVuY3Rpb25zIGZvciByZXN0YXJ0aW5nIHRoZSBhbHNhIGRldmljZS4KKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2NoZWNrX2V2ZW50KToKKwkgIEkgc2hvdWxkIGFwcGx5IHBhdGNoZXMgbXlzZWxmIC0gdXNlIE1JTiBmb3IgdGhlIHRoaXJkIGFyZ3VtZW50LCBub3QKKwkgIHRoZSBzZWNvbmQsIHRoaXMgZml4ZXMgc2Vla2luZworCisyMDA0LTA3LTAyICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjZGVjX2NsYXNzX2luaXQpLAorCShnc3RfZmxhY2RlY193cml0ZSk6ICBBY3R1YWxseSwgR1NUX1BBRF9DQVBTKCkgaGFzIG5vdGhpbmcgdG8KKwlkbyB3aXRoIHRoZSBsb2dpYy4KKworMjAwNC0wNy0wMiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY2RlY193cml0ZSk6ICBTZXQgZHVyYXRpb24gb24KKwlvdXRwdXQgYnVmZmVycy4gIEZpeCBsb2dpYyBtaXN0YWtlLiAgKGJ1ZyAjMTQ0ODY2KQorCisyMDA0LTA3LTAyICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC1saWJzL2dzdC94b3ZlcmxheS9NYWtlZmlsZS5hbTogeG92ZXJsYXkgbm8gbG9uZ2VyIGRlcGVuZHMKKwlvbiBYLiAgKGJ1ZyAjMTQ0NzUzKQorCisyMDA0LTA3LTAyICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmM6IChnc3Rfd2F2ZW5jX3NldHVwKSwKKwkoZ3N0X3dhdmVuY19zdG9wX2ZpbGUpOiBTd2l0Y2ggdG8gR1NUX1dSSVRFX1VJTlQzMl9MRSBtYWNyb3MKKwkoYnVnICMxNDQ2MjQpCisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogKGdzdF9vc3NlbGVtZW50X3Byb2JlX2NhcHMpLAorCShnc3Rfb3NzZWxlbWVudF9yYXRlX3Byb2JlX2NoZWNrKTogQWRkIGFub3RoZXIgd29ya2Fyb3VuZCBmb3IKKwlidWdneSBkcml2ZXJzIChidWcgIzE0NTMzNikKKworMjAwNC0wNy0wMiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6IChnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF93cml0ZSk6CisJTW9zdCBzeXN0ZW1zIGRvbid0IGhhdmUgTVNHX05PU0lHTkFMLgorCisyMDA0LTA3LTAyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBNYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC9jb2xvcmJhbGFuY2UvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvcGxheS9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC90dW5lci9NYWtlZmlsZS5hbToKKwkgIChob3BlZnVsbHkpIGZpeCBib3RoIGluc3RhbGwgYW5kIGRpc3QgYW5kIG1ha2UgZXJyb3IgbWVzc2FnZSB1c2VmdWwuCisJICBuZWVkcyB0ZXN0aW5nIGFjcm9zcyBhdXRvbWFrZXMuCisKKzIwMDQtMDctMDIgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L29nZy9nc3RvZ2cuYzogKHBsdWdpbl9pbml0KToKKwkgIHdlIHJlcXVpcmUgYnl0ZXN0cmVhbSBub3cKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzoKKwkgIGh1Z2UgZGlmZiB0byBpbXBsZW1lbnQgY2hhaW4gc2V0dXAgaW4gYSBmYXN0IGFuZCBnZW5lcmljIHdheS4gVGhpcworCSAgaW1wcm92ZXMgdGFnIHJlYWRpbmcgYW5kIHN0YXJ0dXAgb2YgaHVnZSBmaWxlcyAocmVhZDogVGhlb3JhIHZpZGVvcykKKwkgIHF1aXRlIGEgYml0LiBJdCBwcm9iYWJseSBjb250YWlucyBidWdzLCB0b28sIHNvIHBsZWFzZSB0ZXN0LgorCSAgU2Vla2luZyBpcyBub3QgaW1wcm92ZWQgdG8gdGhlIGZhc3QgbWV0aG9kLgorCisyMDA0LTA2LTI5ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19wYWRfcHVzaCk6CisJKiBleHQvb2dnL2dzdG9nZ211eC5jOgorCUZpeCBtZW1sZWFrIGluIG9nZ2RlbXV4IHdoZW4gcnVubmluZyB1bmNvbm5lY3RlZCBwYWRzLgorCWRvYyB1cGRhdGUgaW4gbXV4LCBzdGFydCB3b3JraW5nIG9uIGtleWZyYW1lIG1vZGUuCisKKzIwMDQtMDYtMjkgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6CisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOgorCSAgYWR2ZXJ0aXNlIGNvcnJlY3QgdGVtcGxhdGUgY2FwcyAtIHdlIGluZGVlZCBkbyBub24tbmF0aXZlIGVuZGlhbm5lc3MKKwkgIGFuZCA4Yml0IGF1ZGlvIGhhcyBubyBlbmRpYW5uZXNzCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2dldGNhcHMpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19nZXRjYXBzKToKKwkgIGF2b2lkICh3cm9uZykgZHVwbGljYXRpb25zIGluIGdldGNhcHMgZnVuY3Rpb24gYW5kIHJldHVybgorCSAgdGVtcGxhdGUgY2FwcworCisyMDA0LTA2LTI5ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X3JlY292ZXJfcG9saWN5X2dldF90eXBlKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsYXNzX2luaXQpLCAoZ3N0X211bHRpZmRzaW5rX2FkZCksCisJKGdzdF9tdWx0aWZkc2lua19yZW1vdmUpLCAoZ3N0X211bHRpZmRzaW5rX2NsZWFyKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9yZW1vdmUpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF9yZWFkKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9xdWV1ZV9kYXRhKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9xdWV1ZV9jYXBzKSwKKwkoZ3N0X211bHRpZmRzaW5rX2NsaWVudF9xdWV1ZV9idWZmZXIpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudF93cml0ZSksCisJKGdzdF9tdWx0aWZkc2lua19yZWNvdmVyX2NsaWVudCksIChnc3RfbXVsdGlmZHNpbmtfcXVldWVfYnVmZmVyKSwKKwkoZ3N0X211bHRpZmRzaW5rX2hhbmRsZV9jbGllbnRzKSwgKGdzdF9tdWx0aWZkc2lua190aHJlYWQpLAorCShnc3RfbXVsdGlmZHNpbmtfaW5pdF9zZW5kKSwgKGdzdF9tdWx0aWZkc2lua19jbG9zZSk6CisJRml4IHdyb25nIEdMaXN0IGl0ZXJhdGlvbiB0aGF0IGNvdWxkIGNyYXNoIHRoZSBzZXJ2ZXIgd2hlbgorCW1vcmUgdGhlbiAyIGNsaWVudHMgZGlzY29ubmVjdCBhdCB0aGUgc2FtZSB0aW1lLiBSZWFkIGFsbCB0aGUKKwlwZW5kaW5nIGNvbW1hbmRzIGluIG9uZSBiYXRjaCB0byByZWNvdmVyIGZyb20gY29tbWFuZCBzdG9ybXMgdW5kZXIKKwl2ZXJ5IGhlYXZ5IGxvYWQuCisKKzIwMDQtMDYtMjggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdmlkZW9taXhlci92aWRlb21peGVyLmM6IChnc3RfdmlkZW9taXhlcl9wYWRfZ2V0X3R5cGUpLAorCShnc3RfdmlkZW9taXhlcl9wYWRfY2xhc3NfaW5pdCksIChnc3RfdmlkZW9taXhlcl9wYWRfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfcGFkX3NldF9wcm9wZXJ0eSksCisJKGdzdF92aWRlb21peGVyX3BhZF9zaW5rY29ubmVjdCksIChnc3RfdmlkZW9taXhlcl9wYWRfaW5pdCksCisJKGdzdF92aWRlb19taXhlcl9iYWNrZ3JvdW5kX2dldF90eXBlKSwgKGdzdF92aWRlb21peGVyX2dldF90eXBlKSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfY2xhc3NfaW5pdCksIChnc3RfdmlkZW9taXhlcl9pbml0KSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfcmVxdWVzdF9uZXdfcGFkKSwgKGdzdF92aWRlb21peGVyX2JsZW5kX2F5dXZfaTQyMCksCisJKHBhZF96b3JkZXJfY29tcGFyZSksIChnc3RfdmlkZW9taXhlcl9zb3J0X3BhZHMpLAorCShnc3RfdmlkZW9taXhlcl9maWxsX2NoZWNrZXIpLCAoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9jb2xvciksCisJKGdzdF92aWRlb21peGVyX2ZpbGxfcXVldWVzKSwgKGdzdF92aWRlb21peGVyX2JsZW5kX2J1ZmZlcnMpLAorCShnc3RfdmlkZW9taXhlcl91cGRhdGVfcXVldWVzKSwgKGdzdF92aWRlb21peGVyX2xvb3ApLAorCShwbHVnaW5faW5pdCk6CisJQXZvaWQgZGl2aWRlIGJ5IHplcm8sIGNob29zZSBtYXN0ZXJwYWQgYXMgdGhlIHBhZCB3aXRoIHRoZSBoaWdoZXN0CisJZnJhbWVyYXRlLgorCisyMDA0LTA2LTI3ICBKdWxpZW4gTW91dHRlICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeHdpbmRvd19kZWNvcmF0ZSksCisJKGdzdF94aW1hZ2VzaW5rX3h3aW5kb3dfbmV3KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfeHdpbmRvd19kZWNvcmF0ZSksCisJKGdzdF94dmltYWdlc2lua194d2luZG93X25ldyk6IEkgcHJlZmVyIGxvY2tpbmcgdGhlIG11dGV4IGluIHRoZQorCWZ1bmN0aW9uIGRpcmVjdGx5LiBXZSBtaWdodCB3YW50IHRvIGNhbGwgaXQgZnJvbSBzb21ld2hlcmUgZWxzZSBvbmUgZGF5LgorCisyMDA0LTA2LTI3ICBKdWxpZW4gTW91dHRlICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeHdpbmRvd19kZWNvcmF0ZSksCisJKGdzdF94aW1hZ2VzaW5rX3h3aW5kb3dfbmV3KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfeHdpbmRvd19kZWNvcmF0ZSksCisJKGdzdF94dmltYWdlc2lua194d2luZG93X25ldyk6IFRyeWluZyB0byBmaXggdGhlIHJhbmRvbSBiZWhhdmlvdXIgb2YKKwl3aW5kb3cgZGVjb3JhdGlvbnMuCisKKzIwMDQtMDYtMjcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19jbGFzc19pbml0KSwgKGdzdF9kdmRlY19pbml0KSwKKwkoZ3N0X2R2ZGVjX3ZpZGVvX2dldGNhcHMpLCAoZ3N0X2R2ZGVjX3ZpZGVvX2xpbmspLAorCShnc3RfZHZkZWNfcHVzaCksIChnc3RfZHZkZWNfbG9vcCksIChnc3RfZHZkZWNfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X2R2ZGVjX3NldF9wcm9wZXJ0eSksIChnc3RfZHZkZWNfZ2V0X3Byb3BlcnR5KToKKwkqIGV4dC9kdi9nc3RkdmRlYy5oOgorCUltcGxlbWVudCBkcm9wX2ZhY3RvciBwcm9wZXJ0eSB0byBsb3dlciB0aGUgZnJhbWVyYXRlIHdpdGgKKwlhIGZhY3Rvci4KKworMjAwNC0wNi0yNyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L2NvbG9yYmFsYW5jZS9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC9taXhlci9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC9wbGF5L01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L3R1bmVyL01ha2VmaWxlLmFtOgorCSAgdW5icmVhayBDb21wYW55J3MgZml4IHRoYXQgZGlkbid0IGluc3RhbGwgdGhlIC1lbnVtLmggZmlsZXMKKworMjAwNC0wNi0yNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOiAoZ3N0X2R2ZGVjX3B1c2gpLCAoZ3N0X2R2ZGVjX2xvb3ApLAorCShnc3RfZHZkZWNfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9kdi9nc3RkdmRlYy5oOgorCUZpeCB0aW1lc3RhbXAsIGR1cmF0aW9uIGFuZCBvZmZzZXQgb2YgdGhlIGJ1ZmZlcnMuCisKKzIwMDQtMDYtMjcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL2dzdG11bHRpZmRzaW5rLmM6IChnc3RfcmVjb3Zlcl9wb2xpY3lfZ2V0X3R5cGUpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xhc3NfaW5pdCksIChnc3RfbXVsdGlmZHNpbmtfYWRkKSwKKwkoZ3N0X211bHRpZmRzaW5rX3JlbW92ZSksIChnc3RfbXVsdGlmZHNpbmtfY2xlYXIpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xpZW50X3JlbW92ZSksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50X3JlYWQpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xpZW50X3F1ZXVlX2RhdGEpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xpZW50X3F1ZXVlX2NhcHMpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xpZW50X3F1ZXVlX2J1ZmZlciksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50X3dyaXRlKSwKKwkoZ3N0X211bHRpZmRzaW5rX3JlY292ZXJfY2xpZW50KSwgKGdzdF9tdWx0aWZkc2lua19xdWV1ZV9idWZmZXIpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudHMpLCAoZ3N0X211bHRpZmRzaW5rX3RocmVhZCksCisJKGdzdF9tdWx0aWZkc2lua19pbml0X3NlbmQpLCAoZ3N0X211bHRpZmRzaW5rX2Nsb3NlKToKKwkqIGdzdC90Y3AvZ3N0bXVsdGlmZHNpbmsuaDoKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc2luay5jOgorCShnc3RfdGNwc2VydmVyc2lua19oYW5kbGVfc2VydmVyX3JlYWQpLAorCShnc3RfdGNwc2VydmVyc2lua19oYW5kbGVfc2VsZWN0KSwgKGdzdF90Y3BzZXJ2ZXJzaW5rX2Nsb3NlKToKKwlNb3JlIG11bHRpZmRzaW5rIGZpeGVzLCBtb3JlIHJlY292ZXJ5IHBvbGljeSBmaXhlcy4KKwlSZW1vdmVkIHN0dXBpZCBnX3ByaW50CisKKzIwMDQtMDYtMjYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL01ha2VmaWxlLmFtOgorCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5jOiAoZ3N0X3JlY292ZXJfcG9saWN5X2dldF90eXBlKSwKKwkoZ3N0X211bHRpZmRzaW5rX2dldF90eXBlKSwgKGdzdF9tdWx0aWZkc2lua19iYXNlX2luaXQpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xhc3NfaW5pdCksIChnc3RfbXVsdGlmZHNpbmtfaW5pdCksCisJKGdzdF9tdWx0aWZkc2lua19kZWJ1Z19mZHNldCksIChnc3RfbXVsdGlmZHNpbmtfY2xpZW50X3JlbW92ZSksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50X3JlYWQpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xpZW50X3F1ZXVlX2RhdGEpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xpZW50X3F1ZXVlX2NhcHMpLAorCShnc3RfbXVsdGlmZHNpbmtfY2xpZW50X3F1ZXVlX2J1ZmZlciksCisJKGdzdF9tdWx0aWZkc2lua19oYW5kbGVfY2xpZW50X3dyaXRlKSwKKwkoZ3N0X211bHRpZmRzaW5rX3JlY292ZXJfY2xpZW50KSwgKGdzdF9tdWx0aWZkc2lua19xdWV1ZV9idWZmZXIpLAorCShnc3RfbXVsdGlmZHNpbmtfaGFuZGxlX2NsaWVudHMpLCAoZ3N0X211bHRpZmRzaW5rX3RocmVhZCksCisJKGdzdF9tdWx0aWZkc2lua19jaGFpbiksIChnc3RfbXVsdGlmZHNpbmtfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X211bHRpZmRzaW5rX2dldF9wcm9wZXJ0eSksIChnc3RfbXVsdGlmZHNpbmtfaW5pdF9zZW5kKSwKKwkoZ3N0X211bHRpZmRzaW5rX2Nsb3NlKSwgKGdzdF9tdWx0aWZkc2lua19jaGFuZ2Vfc3RhdGUpOgorCSogZ3N0L3RjcC9nc3RtdWx0aWZkc2luay5oOgorCSogZ3N0L3RjcC9nc3R0Y3BwbHVnaW4uYzogKHBsdWdpbl9pbml0KToKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc2luay5jOiAoZ3N0X3RjcHNlcnZlcnNpbmtfZ2V0X3R5cGUpLAorCShnc3RfdGNwc2VydmVyc2lua19jbGFzc19pbml0KSwgKGdzdF90Y3BzZXJ2ZXJzaW5rX2luaXQpLAorCShnc3RfdGNwc2VydmVyc2lua19oYW5kbGVfc2VydmVyX3JlYWQpLAorCShnc3RfdGNwc2VydmVyc2lua19oYW5kbGVfc2VsZWN0KSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF90Y3BzZXJ2ZXJzaW5rX2dldF9wcm9wZXJ0eSksCisJKGdzdF90Y3BzZXJ2ZXJzaW5rX2luaXRfc2VuZCksIChnc3RfdGNwc2VydmVyc2lua19jbG9zZSk6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNpbmsuaDoKKwlBZGRlZCBtdWx0aWZkc2luaywgbWFkZSB0Y3BzZXJ2ZXJzaW5rIGEgc3ViY2xhc3Mgb2YgZmRzaW5rLCByZW1vdmVkCisJb25lIG9mIHRoZSBsb2NrcywgYWRkZWQgcmVjb3ZlcnkgcG9saWN5IHRvIG11bHRpZmRzaW5rLgorCisyMDA0LTA2LTI2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvdmlkZW9yYXRlL2dzdHZpZGVvcmF0ZS5jOiAoZ3N0X3ZpZGVvcmF0ZV9jaGFpbik6CisJICBmaXggZGVjaXNpb24gZm9yIHdoZW4gZ2V0dGluZyBmcmFtZXMgd2l0aCBzYW1lIHRpbWVzdGFtcAorCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzogKGdzdF92NGxzcmNfY2xhc3NfaW5pdCksIChnc3RfdjRsc3JjX2luaXQpLAorCShnc3RfdjRsc3JjX2dldCksIChnc3RfdjRsc3JjX3NldF9wcm9wZXJ0eSksCisJKGdzdF92NGxzcmNfZ2V0X3Byb3BlcnR5KToKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmg6CisJICBhZGQgbGF0ZW5jeSBvZmZzZXQgcHJvcGVydHkKKworMjAwNC0wNi0yNiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L3ZpZGVvcmF0ZS9nc3R2aWRlb3JhdGUuYzogKGdzdF92aWRlb3JhdGVfY2hhaW4pLAorCShwbHVnaW5faW5pdCk6CisJICBmaXggZGVidWdnaW5nLiBhZGQgY2F0ZWdvcnkuCisKKzIwMDQtMDYtMjUgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC9zaW5lL2dzdHNpbmVzcmMuYzogKGdzdF9zaW5lc3JjX2dldCk6CisgICAgICAgICAgZml4IHdyb25nIG9mZnNldHMKKworMjAwNC0wNi0yNSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYXNyYy5jOiAoZ3N0X2Fsc2Ffc3JjX2luaXQpLAorCShnc3RfYWxzYV9zcmNfZ2V0X3RpbWUpLCAoZ3N0X2Fsc2Ffc3JjX2xvb3ApLAorCShnc3RfYWxzYV9zcmNfY2hhbmdlX3N0YXRlKToKKwkgIHJldHVybiBhIHRpbWUgdGhhdCBpcyBpbiBzeW5jIHdpdGggdGhlIGVsZW1lbnQncyBwcm9jZXNzaW5nCisKKzIwMDQtMDYtMjUgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNpbmsuYzogKGdzdF90Y3BzZXJ2ZXJzaW5rX2NsYXNzX2luaXQpLAorCShnc3RfdGNwc2VydmVyc2lua19pbml0KSwgKGdzdF90Y3BzZXJ2ZXJzaW5rX2hhbmRsZV9zZXJ2ZXJfcmVhZCksCisJKGdzdF90Y3BzZXJ2ZXJzaW5rX2NsaWVudF9yZW1vdmUpLAorCShnc3RfdGNwc2VydmVyc2lua19oYW5kbGVfY2xpZW50X3JlYWQpLAorCShnc3RfdGNwc2VydmVyc2lua19jbGllbnRfcXVldWVfZGF0YSksCisJKGdzdF90Y3BzZXJ2ZXJzaW5rX2NsaWVudF9xdWV1ZV9jYXBzKSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfY2xpZW50X3F1ZXVlX2J1ZmZlciksCisJKGdzdF90Y3BzZXJ2ZXJzaW5rX2hhbmRsZV9jbGllbnRfd3JpdGUpLAorCShnc3RfdGNwc2VydmVyc2lua19xdWV1ZV9idWZmZXIpLAorCShnc3RfdGNwc2VydmVyc2lua19oYW5kbGVfY2xpZW50cyksIChnc3RfdGNwc2VydmVyc2lua190aHJlYWQpLAorCShnc3RfdGNwc2VydmVyc2lua19jaGFpbiksIChnc3RfdGNwc2VydmVyc2lua19zZXRfcHJvcGVydHkpLAorCShnc3RfdGNwc2VydmVyc2lua19nZXRfcHJvcGVydHkpLCAoZ3N0X3RjcHNlcnZlcnNpbmtfaW5pdF9zZW5kKSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfY2xvc2UpOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzaW5rLmg6CisJU2VydmVyc2luayByZXdyaXRlLiBSZWFsbHkgZG8gbm9uIGJsb2NraW5nIHdyaXRlcyB0byBjbGllbnRzIGFuZAorCW1haW50YWluIGFuIGludGVybmFsIHF1ZXVlIHRvIGhhbmRsZSBzbG93ZXIgY2xpZW50cyB3aGlsZSBub3QKKwlkaXN0dXJiaW5nIGZhc3QgY2xpZW50cy4KKworMjAwNC0wNi0yNSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuYzogKGdzdF90Y3BjbGllbnRzcmNfZ2V0KToKKwkgIGJldHRlciBkZWJ1ZywgZG9uJ3Qgb3ZlcnJpZGUgT0ZGU0VUIGFuZCBPRkZTRVRfRU5ECisKKzIwMDQtMDYtMjUgIElhaW4gPGlhaW5AcHJldHR5cGVvcGxlLm9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby1wcml2LmMgKGdtaV9zZXRfbWltZSk6IEFkZAorCW5hbWU9c291cmNlIGZvciB0aGUgd2F2cGFyc2UgcGlwZWxpbmUuCisKKzIwMDQtMDYtMjQgIEpvaGFuIERhaGxpbiAgPGpvaGFuQGdub21lLm9yZz4KKworCSogZXh0L3RoZW9yYS90aGVvcmFlbmMuYyAodGhlb3JhX2VuY19jaGFpbik6IENhbGwKKwlnc3RfcGFkX3RyeV9zZXRfY2FwcyBpbnN0ZWFkIG9mIGdzdF9wYWRfc2V0X2V4cGxpY2l0X2NhcHMgc28gdGhlCisJc3RyZWFtaGVhZGVyIGNhcHMgYXJlIHNldCBjb3JyZWN0bHkuCisKKzIwMDQtMDYtMjQgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmM6IChyYXdfY2Fwc19mYWN0b3J5KSwKKwkoZ3N0X3ZvcmJpc2VuY19zZXR1cCksIChnc3Rfdm9yYmlzZW5jX3NldF9wcm9wZXJ0eSk6CisJICByZXNwZWN0IG1pbmltdW0gYml0cmF0ZTsgc2FtZSBjb3VsZCBiZSBkb25lIGZvciBtYXggYml0cmF0ZQorCisyMDA0LTA2LTI0ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvdm9yYmlzL3ZvcmJpc2VuYy5jOiAocmF3X2NhcHNfZmFjdG9yeSksCisJKGdzdF92b3JiaXNlbmNfc2V0dXApOgorCSAgZml4IHNhbXBsZSByYXRlIHJhbmdlCisKKzIwMDQtMDYtMjQgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC92b3JiaXMvb2dndm9yYmlzZW5jLmM6IChnc3Rfb2dndm9yYmlzZW5jX2NsYXNzX2luaXQpLAorCShnc3Rfb2dndm9yYmlzZW5jX3NldHVwKToKKwkqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmM6IChnc3Rfdm9yYmlzZW5jX2NsYXNzX2luaXQpLAorCShnc3Rfdm9yYmlzZW5jX3NldHVwKToKKwkgIHJlc29sdmUgYW1iaWd1aXRpZXMgaW4gY29kZSBhbmQgZGVzY3JpcHRpb24KKworMjAwNC0wNi0yNCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX3N0YXJ0KSwgKGdzdF9hbHNhX3hydW5fcmVjb3ZlcnkpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5oOgorCSogZXh0L2Fsc2EvZ3N0YWxzYXNyYy5jOiAoZ3N0X2Fsc2Ffc3JjX2luaXQpLAorCShnc3RfYWxzYV9zcmNfdXBkYXRlX2F2YWlsKSwgKGdzdF9hbHNhX3NyY19sb29wKToKKwlVc2UgYWxzYSB0cmlnZ2VyX3RzdGFtcCB0byBnZXQgdGhlIHRpbWVzdGFtcCBvZiB0aGUgZmlyc3QKKwlzYW1wbGUgaW4gdGhlIGJ1ZmZlciBmb3IgbW9yZSBwcmVjaXNlIHN5bmMuIFNvbWUgY2xlYW51cHMuCisKKzIwMDQtMDYtMjQgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvYXVkaW9yYXRlL2dzdGF1ZGlvcmF0ZS5jOiAoZ3N0X2F1ZGlvcmF0ZV9saW5rKSwKKwkoZ3N0X2F1ZGlvcmF0ZV9pbml0KSwgKGdzdF9hdWRpb3JhdGVfY2hhaW4pLAorCShnc3RfYXVkaW9yYXRlX3NldF9wcm9wZXJ0eSksIChnc3RfYXVkaW9yYXRlX2dldF9wcm9wZXJ0eSk6CisJKiBnc3QvdmlkZW9yYXRlL2dzdHZpZGVvcmF0ZS5jOiAoZ3N0X3ZpZGVvcmF0ZV9jbGFzc19pbml0KSwKKwkoZ3N0X3ZpZGVvcmF0ZV9jaGFpbik6CisJQWRkZWQgc29tZSBsb2dnaW5nLCBmaXhlZCBhbiBvdmVyZmxvdyBidWcgaW4gdmlkZW9yYXRlLgorCisyMDA0LTA2LTI0ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9raW8vTWFrZWZpbGUuYW06CisJICBmaXggZm9yIGJ1aWxkZGlyICE9IHNyY2RpciBhbmQgZGlzdGNoZWNrCisKKzIwMDQtMDYtMjQgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L2NvbG9yYmFsYW5jZS9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC9taXhlci9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC9wbGF5L01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L3R1bmVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3RjcC9NYWtlZmlsZS5hbToKKwkqIHN5cy9keHIzL01ha2VmaWxlLmFtOgorCSAgZG9uJ3QgaW5jbHVkZSAtZW51bXR5cGVzLltjaF0gb3IgLW1hcnNoYWwuW2NoXSBmaWxlcyBpbiB0aGUgZGlzdGVkCisJICB0YXJiYWxsLgorCSAgQWxzbyBhZGQgYWxsICoubGlzdCBmaWxlcyB0aGF0IHdlcmUgbWlzc2luZy4KKwkqIE1ha2VmaWxlLmFtOgorCSAgYWRkIGEgZGlzdGNoZWNrIGhvb2sgdG8gZW5zdXJlIHRoZSBhYm92ZSBkb2Vzbid0IGhhcHBlbiBhZ2Fpbi4KKworMjAwNC0wNi0yMyAgRGF2aWQgSS4gTGVobiAgPGRsZWhuQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZXh0L01ha2VmaWxlLmFtOiBzL0RUU19ESVI9ZHZkcmVhZC9EVFNfRElSPWR0cy8KKworMjAwNC0wNi0yMyAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAcmVkaGF0LmNvbT4KKworCSogbTQvTWFrZWZpbGUuYW06IERpc3RyaWJ1dGUgZ3N0LWZpb25yZWFkLm00LgorCisyMDA0LTA2LTIzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6IGJhY2sgdG8gZGV2CisKKzIwMDQtMDYtMjMgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X2Fsc2Ffc3RhcnQpLAorCShnc3RfYWxzYV94cnVuX3JlY292ZXJ5KToKKwkqIGV4dC9hbHNhL2dzdGFsc2EuaDoKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2NoZWNrX2V2ZW50KSwKKwkoZ3N0X2Fsc2Ffc2lua19sb29wKSwgKGdzdF9hbHNhX3NpbmtfZ2V0X3RpbWUpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYXNyYy5jOiAoZ3N0X2Fsc2Ffc3JjX2luaXQpLAorCShnc3RfYWxzYV9zcmNfZ2V0X3RpbWUpLCAoZ3N0X2Fsc2Ffc3JjX3VwZGF0ZV9hdmFpbCksCisJKGdzdF9hbHNhX3NyY19sb29wKToKKwlBZGQgY2xvY2sgdG8gYWxzYXNyYy4gVGFrZSBuZXcgY2FwdHVyZSB0aW1lc3RhbXAgd2hlbgorCXJlc3RhcnRpbmcgYWZ0ZXIgYW4gb3ZlcnJ1bi4gU3BsaXQgdXAgc29tZSBmdW5jdGlvbnMgYmV0d2VlbgorCWFsc2FzcmMgYW5kIGFsc2FzaW5rLgorCis9PT0gcmVsZWFzZSAwLjguMiA9PT0KKworMjAwNC0wNi0yMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfaW5pdCksIChnc3RfYWxzYV9kaXNwb3NlKSwKKwkoZ3N0X2Fsc2FfY2hhbmdlX3N0YXRlKSwgKGdzdF9hbHNhX3VwZGF0ZV9hdmFpbCksCisJKGdzdF9hbHNhX3hydW5fcmVjb3ZlcnkpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5oOgorCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfY2hlY2tfZXZlbnQpOgorCSAgbWVyZ2UgYmFjayBjaGFuZ2VzIGZyb20gcmVsZWFzZQorCisyMDA0LTA2LTIzICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L2F1ZGlvcmF0ZS9nc3RhdWRpb3JhdGUuYzogKGdzdF9hdWRpb3JhdGVfY2xhc3NfaW5pdCksCisJKGdzdF9hdWRpb3JhdGVfaW5pdCksIChnc3RfYXVkaW9yYXRlX2NoYWluKSwKKwkoZ3N0X2F1ZGlvcmF0ZV9zZXRfcHJvcGVydHkpLCAoZ3N0X2F1ZGlvcmF0ZV9nZXRfcHJvcGVydHkpOgorCUltcGxlbWVudCBzYW1wbGUgZHJvcHBpbmcgYW5kIG5vdGlmeQorCisyMDA0LTA2LTIyICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L3RoZW9yYS90aGVvcmFlbmMuYzogKGdzdF90aGVvcmFfZW5jX2NsYXNzX2luaXQpLAorCSh0aGVvcmFfZW5jX3NpbmtfbGluayksICh0aGVvcmFfYnVmZmVyX2Zyb21fcGFja2V0KSwKKwkodGhlb3JhX3B1c2hfcGFja2V0KSwgKHRoZW9yYV9lbmNfY2hhaW4pOgorCVNvbWUgY2xlYW51cHMsIG1ha2Ugc3VyZSB0aGUgdGltZXN0YW1wcyBhcmUgY29ycmVjdC4KKworMjAwNC0wNi0yMiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX2dldF90aW1lKSwgKGdzdF9hbHNhX2Nsb2NrX3VwZGF0ZSksCisJKGdzdF9hbHNhX2NoYW5nZV9zdGF0ZSksIChnc3RfYWxzYV91cGRhdGVfYXZhaWwpLAorCShnc3RfYWxzYV94cnVuX3JlY292ZXJ5KToKKwkqIGV4dC9hbHNhL2dzdGFsc2EuaDoKKwkqIGV4dC9hbHNhL2dzdGFsc2FzcmMuYzogKGdzdF9hbHNhX3NyY19sb29wKToKKwlDbGVhbnVwcywgdGFrZSBxdWV1ZWQgc2FtcGxlcyBpbnRvIGFjY291bnQgd2hlbiByZXBvcnRpbmcKKwl0aGUgdGltZS4KKworMjAwNC0wNi0yMiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC92aWRlb3JhdGUvZ3N0dmlkZW9yYXRlLmM6IChnc3RfdmlkZW9yYXRlX2NsYXNzX2luaXQpLAorCShnc3RfdmlkZW9yYXRlX2luaXQpOgorCUluaXRpYWxpemUgdGhlIHByb3BlcnR5IGFzIHdlbGwuCisKKzIwMDQtMDYtMjIgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdmlkZW9yYXRlL2dzdHZpZGVvcmF0ZS5jOiAoZ3N0X3ZpZGVvcmF0ZV9jbGFzc19pbml0KSwKKwkoZ3N0X3ZpZGVvcmF0ZV9pbml0KSwgKGdzdF92aWRlb3JhdGVfY2hhaW4pLAorCShnc3RfdmlkZW9yYXRlX3NldF9wcm9wZXJ0eSksIChnc3RfdmlkZW9yYXRlX2dldF9wcm9wZXJ0eSk6CisJQWRkIHByb3BlcnR5IHRvIG1ha2UgdmlkZW9yYXRlIHNpbGVudC4KKwlBZGQgcHJvcGVydHkgdG8gcHJlZmVyIG5ldyBmcmFtZXMgb3ZlciBvbGQgb25lcy4KKworMjAwNC0wNi0yMiAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBzeXMvb3N4dmlkZW8vTWFrZWZpbGUuYW06CisgICAgICAgIFdvcmthcm91bmQgc28gdGhhdCB0aGUgb3N4dmlkZW8gLnNvIGZpbGUgZ2V0cyBsaW5rZWQgd2l0aCB0aGUKKyAgICAgICAgQ29jb2EsIE9wZW5HTCBhbmQgUXVpY2tUaW1lIGZyYW1ld29ya3MKKworMjAwNC0wNi0yMiAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBzeXMvb3N4YXVkaW8vTWFrZWZpbGUuYW06CisgICAgICAgIFdvcmthcm91bmQgc28gdGhhdCB0aGUgb3N4YXVkaW8gLnNvIGZpbGUgZ2V0cyBsaW5rZWQgd2l0aCB0aGUKKyAgICAgICAgQ29yZUF1ZGlvIGZyYW1ld29yaworCisyMDA0LTA2LTIyICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwlXaG9vcHMsIG15IGZhdWx0Li4uZml4ZWQgYnVpbGQgaXNzdWVzCisKKzIwMDQtMDYtMjIgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorICAgICAgICBBZGQgb2JqZWN0aXZlLWMgc3VwcG9ydCBpZiBydW5uaW5nIGluIERhcndpbi9NYWMgT1MgWAorCSogc3lzL01ha2VmaWxlLmFtOgorICAgICAgICAqIHN5cy9vc3h2aWRlbzoKKyAgICAgICAgKiBzeXMvb3N4dmlkZW8vTWFrZWZpbGUuYW06CisgICAgICAgICogc3lzL29zeHZpZGVvL29zeHZpZGVvc2luay5oOgorICAgICAgICAqIHN5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubToKKyAgICAgICAgKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cuaDoKKyAgICAgICAgKiBzeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cubToKKyAgICAgICAgQWRkIG9zeHZpZGVvc2luaywgYSBjb2NvYS1iYXNlZCBvc3ggdmlkZW8gc2luaworCisKKzIwMDQtMDYtMTkgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKwkqIGV4dC9kdmRuYXYvZ3N0LWR2ZDoKKwlHcmFiIHRoZSBnY29uZiBrZXkgZnJvbSB0aGUgcmlnaHQgc3BvdAorCSogZ3N0L2RlYnVnL2dzdG5hdnNlZWsuYzogKGdzdF9uYXZzZWVrX2luaXQpLAorCShnc3RfbmF2c2Vla19zZWdzZWVrKSwgKGdzdF9uYXZzZWVrX2hhbmRsZV9zcmNfZXZlbnQpLAorCShnc3RfbmF2c2Vla19jaGFpbik6CisJKiBnc3QvZGVidWcvZ3N0bmF2c2Vlay5oOgorCSAgQWRkICdzJywgJ2UnIGFuZCAnbCcga2V5cHJlc3NlcyB0byBuYXZzZWVrIHRvIGRlZmluZSB0aGUgc3RhcnQsZW5kCisJICBhbmQgbG9vcCBwYXJhbWV0ZXJzIG9mIGEgc2VnbWVudCBzZWVrLgorCSogZ3N0L3ZpZGVvdGVzdHNyYy9nc3R2aWRlb3Rlc3RzcmMuYzogKGdzdF92aWRlb3Rlc3RzcmNfaW5pdCksCisJKGdzdF92aWRlb3Rlc3RzcmNfZ2V0X2V2ZW50X21hc2tzKSwKKwkoZ3N0X3ZpZGVvdGVzdHNyY19oYW5kbGVfc3JjX2V2ZW50KSwgKGdzdF92aWRlb3Rlc3RzcmNfZ2V0KToKKwkqIGdzdC92aWRlb3Rlc3RzcmMvZ3N0dmlkZW90ZXN0c3JjLmg6CisJICBBZGQgc2Vla2luZyBzdXBwb3J0IHRvIHZpZGVvdGVzdHNyYworCSAgSW5pdGlhbGlzZSB0aGUgdGltZXN0YW1wX29mZnNldCB2YXJpYWJsZS4KKworMjAwNC0wNi0xOCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9zaWRwbGF5L2dzdHNpZGRlYy5jYzoKKwlGaXggbmVnb3RpYXRpb24gYW5kIHNldCBjb3JyZWN0IGVuZCBvZmZzZXQuCisKKzIwMDQtMDYtMTggIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogYnJhbmNoIGFuZCBwcmVyZWxlYXNlCisKKzIwMDQtMDYtMTcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c3JjLmM6IChnc3RfdGNwY2xpZW50c3JjX2luaXQpLAorCShnc3RfdGNwY2xpZW50c3JjX2dldGNhcHMpLCAoZ3N0X3RjcGNsaWVudHNyY19nZXQpLAorCShnc3RfdGNwY2xpZW50c3JjX2luaXRfcmVjZWl2ZSk6CisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNyYy5oOgorICAgICAgICAgIHJlYWQgY2FwcyB3aGVuIGNvbm5lY3RpbmcgdG8gc2VydmVyIGZvciBHRFAgc28gd2Ugc2V0IHRoZW0gY29ycmVjdGx5CisKKzIwMDQtMDYtMTcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC92aWRlb3JhdGUvZ3N0dmlkZW9yYXRlLmM6IChnc3RfdmlkZW9yYXRlX2NoYWluKToKKwkgIG5vdGlmeSBkcm9wcyBhbmQgZHVwbGljYXRlcworCSogZ3N0L3ZpZGVvc2NhbGUvdmlkZW9zY2FsZS5jOiAodmlkZW9zY2FsZV9nZXRfc3RydWN0dXJlKToKKwkgIG5vIGdvb2QgcmVhc29uIHRvIGxpbWl0IG91cnNlbHZlcyB0byAxMDB4MTAwCisKKzIwMDQtMDYtMTcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3Y0bHNyY19pbml0KSwKKwkoZ3N0X3Y0bHNyY19vcGVuKSwgKGdzdF92NGxzcmNfc3JjX2xpbmspLCAoZ3N0X3Y0bHNyY19nZXRjYXBzKSwKKwkoZ3N0X3Y0bHNyY19nZXQpLCAoZ3N0X3Y0bHNyY19zZXRfcHJvcGVydHkpLAorCShnc3RfdjRsc3JjX2dldF9wcm9wZXJ0eSk6CisJKiBzeXMvdjRsL2dzdHY0bHNyYy5oOgorCSogc3lzL3Y0bC92NGxfY2FsbHMuYzogKGdzdF92NGxfc2V0X3dpbmRvd19wcm9wZXJ0aWVzKSwKKwkoZ3N0X3Y0bF9vcGVuKSwgKGdzdF92NGxfZ2V0X3BpY3R1cmUpLCAoZ3N0X3Y0bF9nZXRfYXVkaW8pLAorCShnc3RfdjRsX3NldF9hdWRpbyk6CisJKiBzeXMvdjRsL3Y0bHNyY19jYWxscy5jOiAoZ3N0X3Y0bHNyY19ncmFiX2ZyYW1lKSwKKwkoZ3N0X3Y0bHNyY190cnlfY2FwdHVyZSk6CisJKiBzeXMvdjRsL3Y0bHNyY19jYWxscy5oOgorCSAgY2hhbmdlIHRyeV9wYWxldHRlIHRvIG1vcmUgZ2VuZXJhbCB0cnlfY2FwdHVyZQorCSAgYWRkIGF1dG9wcm9iZSBvcHRpb24gc28gd2UgY2FuIHR1cm4gb2ZmIGF1dG9wcm9iaW5nCisJICB2YXJpb3VzIGZpeGVzCisKKzIwMDQtMDYtMTcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGFkZCB2aWRlb3JhdGUKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfZmluYWxpemUpLAorCShnc3RfeGltYWdlc2lua19jbGFzc19pbml0KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfZmluYWxpemUpLAorCShnc3RfeHZpbWFnZXNpbmtfY2xhc3NfaW5pdCk6CisgICAgICAgICAgcnVuIHRoZW0gYXMgZmluYWxpemUsIG5vdCBkaXNwb3NlLCBzaW5jZSBkaXNwb3NlIGNhbiBiZSBpbnZva2VkCisgICAgICAgICAgbXVsdGlwbGUgdGltZXMKKworMjAwNC0wNi0xNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX2luaXQpLCAoZ3N0X2Fsc2FfZGlzcG9zZSksCisJKGdzdF9hbHNhX2dldF90aW1lKSwgKGdzdF9hbHNhX3hydW5fcmVjb3ZlcnkpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5oOgorCSogZXh0L2Fsc2EvZ3N0YWxzYWNsb2NrLmM6IChnc3RfYWxzYV9jbG9ja19nZXRfdHlwZSk6CisJKiBleHQvYWxzYS9nc3RhbHNhc3JjLmM6IChnc3RfYWxzYV9zcmNfaW5pdCksIChnc3RfYWxzYV9zcmNfbG9vcCksCisJKGdzdF9hbHNhX3NyY19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYXNyYy5oOgorCU1ha2UgdGhlIHhydW4gY29kZSB0aW1lc3RhbXAgYW5kIG9mZnNldCB0aGUgYnVmZmVycyBjb3JyZWN0bHkuCisJbW92ZWQgdGhlIGNsb2NrIHRvIHRoZSBiYXNlIGNsYXNzLCB1c2UgYWxzYSBtZXRob2RzIHRvIGdldCB0aW1lLgorCURvIGNvcnJlY3QgdGltZXN0YW1waW5nIG9uIG91dGdvaW5nIGJ1ZmZlcnMuCisKKzIwMDQtMDYtMTcgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvYXVkaW9yYXRlL01ha2VmaWxlLmFtOgorCSogZ3N0L2F1ZGlvcmF0ZS9nc3RhdWRpb3JhdGUuYzogKGdzdF9hdWRpb3JhdGVfZ2V0X3R5cGUpLAorCShnc3RfYXVkaW9yYXRlX2Jhc2VfaW5pdCksIChnc3RfYXVkaW9yYXRlX2NsYXNzX2luaXQpLAorCShnc3RfYXVkaW9yYXRlX2xpbmspLCAoZ3N0X2F1ZGlvcmF0ZV9pbml0KSwgKGdzdF9hdWRpb3JhdGVfY2hhaW4pLAorCShnc3RfYXVkaW9yYXRlX3NldF9wcm9wZXJ0eSksIChnc3RfYXVkaW9yYXRlX2dldF9wcm9wZXJ0eSksCisJKGdzdF9hdWRpb3JhdGVfY2hhbmdlX3N0YXRlKSwgKHBsdWdpbl9pbml0KToKKwlBZGRlZCBhbiBhdWRpb3JhdGUgY29udmVydGVyIHRoYXQgZmlsbHMgaW4gZ2Fwcy4KKworMjAwNC0wNi0xNyAgSm9oYW4gRGFobGluICA8am9oYW5AZ25vbWUub3JnPgorCisJKiBleHQvdGNwLyo6IFJldmVydCBaYWhlZXIgY2hhbmdlcywgdG8gbWFrZSB0aGluZ3MgYWN0dWFsbHkgd29yayBhZ2Fpbi4KKworMjAwNC0wNi0xNiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzcmMuYzogKGdzdF92NGxtanBlZ3NyY19nZXQpOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzogKGdzdF92NGxzcmNfc3luY19tb2RlX2dldF90eXBlKSwKKwkoZ3N0X3Y0bHNyY19jbGFzc19pbml0KSwgKGdzdF92NGxzcmNfaW5pdCksIChnc3RfdjRsc3JjX2dldF9mcHMpLAorCShnc3RfdjRsc3JjX2dldCksIChnc3RfdjRsc3JjX3NldF9wcm9wZXJ0eSksCisJKGdzdF92NGxzcmNfZ2V0X3Byb3BlcnR5KToKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmg6CisJQWRkZWQgYSBjb3B5IG1vZGUgdG8gdjRsc3JjIHdoZXJlIGl0IHdpbGwgb3V0cHV0IGEgY29waWVkIHZlcnNpb24KKwlvZiBpdHMgaW50ZXJuYWwgaGFyZHdhcmUgYnVmZmVyLgorCUZpeCB0aGUgd3JvbmcgRkxBR19TRVQgdXNhZ2UuIFRoZSBmbGFncyBhcmUgaW50ZWdlcnMsIG5vdCBiaXRzLCB5b3UKKwljYW4ndCB8IHRoZW0uCisKKzIwMDQtMDYtMTYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOiAoZ3N0X29zc3NyY19nZXQpOgorCVRpbWVzdGFtcCBmaXhlcy4KKworMjAwNC0wNi0xNiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX3N5bmNfbW9kZV9nZXRfdHlwZSksCisJKGdzdF92NGxzcmNfY2xhc3NfaW5pdCksIChnc3RfdjRsc3JjX2luaXQpLCAoZ3N0X3Y0bHNyY19nZXRfZnBzKSwKKwkoZ3N0X3Y0bHNyY19nZXQpLCAoZ3N0X3Y0bHNyY19zZXRfcHJvcGVydHkpLAorCShnc3RfdjRsc3JjX2dldF9wcm9wZXJ0eSk6CisJKiBzeXMvdjRsL2dzdHY0bHNyYy5oOgorCSogc3lzL3Y0bC92NGwtb3ZlcmxheV9jYWxscy5jOiAoZ3N0X3Y0bF9zZXRfb3ZlcmxheSk6CisJQWRkZWQgYSBzeW5jIG1vZGUgZW51bSBwcm9wZXJ0eSB0byBjb250cm9sIHY0bHNyYyB0aW1lc3RhbXAgbWV0aG9kCisJUmVtb3ZlZCB0aGUgdXNlLWZpeGVkLWZwcyBwcm9wZXJ0eSBhbmQgbW92ZWQgZnVuY3Rpb25hbGl0eSBpbgorCXRoZSBlbnVtLgorCURvbid0IGVycm9yIG9uIGFuIGVycm9yIHZhbHVlIGZyb20gdjRsLWNvbmYsIGl0IG1pZ2h0IG5vdCBhbHdheXMKKwliZSBhIHJlYWwgZXJyb3IuCisKKzIwMDQtMDYtMTYgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBnc3QvdmlkZW9yYXRlL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvcmF0ZS9nc3R2aWRlb3JhdGUuYzogKGdzdF92aWRlb3JhdGVfZ2V0X3R5cGUpLAorCShnc3RfdmlkZW9yYXRlX2Jhc2VfaW5pdCksIChnc3RfdmlkZW9yYXRlX2NsYXNzX2luaXQpLAorCShnc3RfdmlkZW9yYXRlX2dldGNhcHMpLCAoZ3N0X3ZpZGVvcmF0ZV9saW5rKSwKKwkoZ3N0X3ZpZGVvcmF0ZV9pbml0KSwgKGdzdF92aWRlb3JhdGVfY2hhaW4pLAorCShnc3RfdmlkZW9yYXRlX3NldF9wcm9wZXJ0eSksIChnc3RfdmlkZW9yYXRlX2dldF9wcm9wZXJ0eSksCisJKGdzdF92aWRlb3JhdGVfY2hhbmdlX3N0YXRlKSwgKHBsdWdpbl9pbml0KToKKwlBZGRlZCBhIHZpZGVvIHRpbWVzdGFtcCBjb3JyZWN0b3IuCisKKzIwMDQtMDYtMTUgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCWZpeGVkIGEgcG90ZW50aWFsIGxlYWsgd2l0aCBwcmV2aW91cyBjb21taXQKKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9wZWVrX2hlYWQpOgorCisyMDA0LTA2LTE1ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOiAoZ3N0X3JpZmZfcGVla19oZWFkKToKKwlBZGRlZCBtaXNzaW5nIHJlZmNvdW50LCBmaXhlcyBidWcgIzE0NDQyNQorCUNoZWVycyBUaW0gZm9yIGZpbmRpbmcgdGhlIGJ1ZworCisyMDA0LTA2LTE1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBzeXMvdjRsL2dzdHY0bC5jOiAocGx1Z2luX2luaXQpOgorCSogc3lzL3Y0bC9nc3R2NGxjb2xvcmJhbGFuY2UuYzoKKwkqIHN5cy92NGwvZ3N0djRsY29sb3JiYWxhbmNlLmg6CisJKiBzeXMvdjRsL2dzdHY0bGVsZW1lbnQuYzoKKwkqIHN5cy92NGwvZ3N0djRsZWxlbWVudC5oOgorCSogc3lzL3Y0bC9nc3R2NGxtanBlZ3NpbmsuYzogKGdzdF92NGxtanBlZ3NpbmtfY2xhc3NfaW5pdCk6CisJKiBzeXMvdjRsL2dzdHY0bG1qcGVnc2luay5oOgorCSogc3lzL3Y0bC9nc3R2NGxtanBlZ3NyYy5jOiAoZ3N0X3Y0bG1qcGVnc3JjX2NsYXNzX2luaXQpOgorCSogc3lzL3Y0bC9nc3R2NGxtanBlZ3NyYy5oOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzogKGdzdF92NGxzcmNfZ2V0X2Zwc19saXN0KSwKKwkoZ3N0X3Y0bHNyY19nZXRfZnBzKSwgKGdzdF92NGxzcmNfc3JjY29ubmVjdCksCisJKGdzdF92NGxzcmNfZ2V0Y2FwcyksIChnc3RfdjRsc3JjX2dldCk6CisJKiBzeXMvdjRsL2dzdHY0bHNyYy5oOgorCSogc3lzL3Y0bC9nc3R2NGx0dW5lci5jOgorCSogc3lzL3Y0bC9nc3R2NGx0dW5lci5oOgorCSogc3lzL3Y0bC9nc3R2NGx4b3ZlcmxheS5jOgorCSogc3lzL3Y0bC9nc3R2NGx4b3ZlcmxheS5oOgorCSogc3lzL3Y0bC92NGwtb3ZlcmxheV9jYWxscy5jOiAoZ3N0X3Y0bF9zZXRfb3ZlcmxheSksCisJKGdzdF92NGxfc2V0X3dpbmRvdyksIChnc3RfdjRsX2VuYWJsZV9vdmVybGF5KToKKwkqIHN5cy92NGwvdjRsX2NhbGxzLmM6IChnc3RfdjRsX3NldF93aW5kb3dfcHJvcGVydGllcyksCisJKGdzdF92NGxfb3BlbiksIChnc3RfdjRsX2dldF9waWN0dXJlKSwgKGdzdF92NGxfZ2V0X2F1ZGlvKSwKKwkoZ3N0X3Y0bF9zZXRfYXVkaW8pOgorCSogc3lzL3Y0bC92NGxfY2FsbHMuaDoKKwkqIHN5cy92NGwvdjRsbWpwZWdzaW5rX2NhbGxzLmM6IChnc3RfdjRsbWpwZWdzaW5rX3N5bmNfdGhyZWFkKSwKKwkoZ3N0X3Y0bG1qcGVnc2lua19xdWV1ZV9mcmFtZSksIChnc3RfdjRsbWpwZWdzaW5rX3N5bmNfZnJhbWUpLAorCShnc3RfdjRsbWpwZWdzaW5rX3NldF9idWZmZXIpLCAoZ3N0X3Y0bG1qcGVnc2lua19zZXRfcGxheWJhY2spLAorCShnc3RfdjRsbWpwZWdzaW5rX3BsYXliYWNrX2luaXQpLAorCShnc3RfdjRsbWpwZWdzaW5rX3BsYXliYWNrX3N0YXJ0KSwgKGdzdF92NGxtanBlZ3NpbmtfZ2V0X2J1ZmZlciksCisJKGdzdF92NGxtanBlZ3NpbmtfcGxheV9mcmFtZSksIChnc3RfdjRsbWpwZWdzaW5rX3dhaXRfZnJhbWUpLAorCShnc3RfdjRsbWpwZWdzaW5rX3BsYXliYWNrX3N0b3ApLAorCShnc3RfdjRsbWpwZWdzaW5rX3BsYXliYWNrX2RlaW5pdCk6CisJKiBzeXMvdjRsL3Y0bG1qcGVnc2lua19jYWxscy5oOgorCSogc3lzL3Y0bC92NGxtanBlZ3NyY19jYWxscy5jOiAoZ3N0X3Y0bG1qcGVnc3JjX3F1ZXVlX2ZyYW1lKSwKKwkoZ3N0X3Y0bG1qcGVnc3JjX3N5bmNfbmV4dF9mcmFtZSksIChnc3RfdjRsbWpwZWdzcmNfc2V0X2J1ZmZlciksCisJKGdzdF92NGxtanBlZ3NyY19zZXRfY2FwdHVyZSksIChnc3RfdjRsbWpwZWdzcmNfc2V0X2NhcHR1cmVfbSksCisJKGdzdF92NGxtanBlZ3NyY19jYXB0dXJlX2luaXQpLCAoZ3N0X3Y0bG1qcGVnc3JjX2NhcHR1cmVfc3RhcnQpLAorCShnc3RfdjRsbWpwZWdzcmNfZ3JhYl9mcmFtZSksIChnc3RfdjRsbWpwZWdzcmNfcmVxdWV1ZV9mcmFtZSksCisJKGdzdF92NGxtanBlZ3NyY19jYXB0dXJlX3N0b3ApLCAoZ3N0X3Y0bG1qcGVnc3JjX2NhcHR1cmVfZGVpbml0KToKKwkqIHN5cy92NGwvdjRsbWpwZWdzcmNfY2FsbHMuaDoKKwkqIHN5cy92NGwvdjRsc3JjX2NhbGxzLmM6IChnc3RfdjRsc3JjX3F1ZXVlX2ZyYW1lKSwKKwkoZ3N0X3Y0bHNyY19zeW5jX2ZyYW1lKSwgKGdzdF92NGxzcmNfc2V0X2NhcHR1cmUpLAorCShnc3RfdjRsc3JjX2NhcHR1cmVfaW5pdCksIChnc3RfdjRsc3JjX2NhcHR1cmVfc3RhcnQpLAorCShnc3RfdjRsc3JjX2dyYWJfZnJhbWUpLCAoZ3N0X3Y0bHNyY19yZXF1ZXVlX2ZyYW1lKSwKKwkoZ3N0X3Y0bHNyY19jYXB0dXJlX3N0b3ApLCAoZ3N0X3Y0bHNyY19jYXB0dXJlX2RlaW5pdCksCisJKGdzdF92NGxzcmNfdHJ5X3BhbGV0dGUpOgorCSogc3lzL3Y0bC92NGxzcmNfY2FsbHMuaDoKKwkgIGJ1bmNoIG9mIHBhcmFub2lhIGNsZWFudXBzCisKKzIwMDQtMDYtMTQgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2NkcGFyYW5vaWEvZ3N0Y2RwYXJhbm9pYS5jOiAoY2RwYXJhbm9pYV9pbml0KSwKKwkoY2RwYXJhbm9pYV9nZXQpLCAoY2RwYXJhbm9pYV9vcGVuKSwgKGNkcGFyYW5vaWFfY2hhbmdlX3N0YXRlKToKKwlTZW5kIGRpc2NvbnQgZXZlbnRzIGFuZCBjaGFuZ2UgdGltZXN0YW1wcyBhcHByb3ByaWF0ZWx5IHdoZW4KKwl3ZSBnZXQgYSBzZWVrIGV2ZW50LiAgKGJ1ZyAjMTQ0MjQwKQorCSogZXh0L2NkcGFyYW5vaWEvZ3N0Y2RwYXJhbm9pYS5oOgorCisyMDA0LTA2LTE0ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogVXNlIHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlIF9uZWFyIGluc3RlYWQgb2YKKwkgIHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlICBzaW5jZSB0aGUgbGF0dGVyIGZhaWxzIGZvciBubyBnb29kCisJICByZWFzb24gb24gc29tZSBzZXR1cHMuCisKKzIwMDQtMDYtMTQgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3ZvbHVtZS9kZW1vLmM6ICh2YWx1ZV9jaGFuZ2VkX2NhbGxiYWNrKTogZXhwMTAoKSBpcyBub3QKKwlzdGFuZGFyZC4gIFRoYW5rIHlvdSBmb3IgcGxheWluZy4KKworMjAwNC0wNi0xNCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2ltZ2NvbnZlcnQuYzogKGltZ19jb252ZXJ0KToKKwlQYXRjaCAxLjMgYnJva2UgdGhlIG9yZGVyaW5nIG9mIHRoZSBjb2xvcnNwYWNlIGluZm8gYW5kCisJbWFkZSB0aGUgcGx1Z2luIGJhc2ljYWxseSB3b3JrIGJ5IGNvaW5jaWRlbmNlLCByZW9yZGVyZWQKKwl0aGUgaW5mby4KKworMjAwNC0wNi0xNCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L2xhbWUvZ3N0bGFtZS5jOgorCSogZXh0L21hZC9nc3RtYWQuYzoKKwkgIHN5bmMgY2Fwcy4gIE1ha2Ugc3VyZSBtYWQgY2FuIG9ubHkgb3V0cHV0IGEgbGlzdCBvZiByYXRlcywgbm90CisJICBhIGZ1bGwgcmFuZ2UuICBJbiB0aGUgZnV0dXJlLCBoYXZlIHRocmVlIGNhcHMgbGlzdHMgZm9yIGVhY2ggb2YgdGhlCisJICBtcGVnIHZlcnNpb25zLiAgQ2hhbmdlIG1wZWd2ZXJzaW9uIHRvIGEgZG91YmxlIGFzIHdlbGwuCisKKzIwMDQtMDYtMTQgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC92b2x1bWUvLmN2c2lnbm9yZToKKwkqIGdzdC92b2x1bWUvTWFrZWZpbGUuYW06CisJKiBnc3Qvdm9sdW1lL2RlbW8uYzogKHZhbHVlX2NoYW5nZWRfY2FsbGJhY2spLCAoaWRsZXIpLAorCShzZXR1cF9ndWkpLCAobWFpbik6CisJICBhZGRlZCBzbWFsbCBkZW1vIGFwcAorCisyMDA0LTA2LTEzICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisJKiBleHQvZXNkL2VzZHNpbmsuYzogKGdzdF9lc2RzaW5rX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvZXNkL2VzZHNpbmsuaDoKKwlDbG9zZSB0aGUgZXNkIGNvbm5lY3Rpb24gb24gcGF1c2UsIGJlY2F1c2UgZXNkIHdpbGwganVzdCB3YWl0IC0KKwlibG9ja2luZyBhbGwgb3RoZXIgZXNkIGNsaWVudHMgaW5kZWZpbml0ZWx5LgorCisyMDA0LTA2LTEyICBDaHJpc3RvcGhlIEZlcmdlYXUgIDx0ZXVmQGdub21lLm9yZz4KKworCSogZ3N0L3RhZ3MvZ3N0dm9yYmlzdGFnLmM6IHJlcGxhY2VkIGEgZ193YXJuaW5nIHdoaWNoIEkgYWRkZWQgaW4gbXkKKwkgIHByZXZpb3VzIGNvbW1pdCB3aXRoIEdTVF9ERUJVRworCisyMDA0LTA2LTEyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBhZGQgYSBoZWFkZXIgY2hlY2sgZm9yIGEgZHZkcmVhZCBoZWFkZXIgaW4gZHZkbmF2LiAgRml4ZXMgIzEzMzAwMgorCisyMDA0LTA2LTEyICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c2luay5jOiAoZ3N0X3RjcGNsaWVudHNpbmtfaW5pdF9zZW5kKToKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c2luay5oOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuYzogKGdzdF90Y3BjbGllbnRzcmNfaW5pdF9yZWNlaXZlKToKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c3JjLmg6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNpbmsuYzogKGdzdF90Y3BzZXJ2ZXJzaW5rX2luaXQpLAorCShnc3RfdGNwc2VydmVyc2lua19oYW5kbGVfc2VydmVyX3JlYWQpLAorCShnc3RfdGNwc2VydmVyc2lua19pbml0X3NlbmQpOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzaW5rLmg6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNyYy5jOiAoZ3N0X3RjcHNlcnZlcnNyY19pbml0X3JlY2VpdmUpOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzcmMuaDoKKwlNb2RpZmllZCB0aGUgdGNwIHBsdWdpbnMgc28gdGhleSBhcmUgcG9ydGFibGUgKElQdjQsSVB2NiwgYW55IGZ1dHVyZQorICAgICAgICB2ZXJzaW9uIG9mIElQKQorCisyMDA0LTA2LTEyICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwlBZGRlZCBvZ2cgbGlicmFyeSBzbyB0aGF0IE9TWCBkZXRlY3RzIGxpYnRoZW9yYSBwcm9wZXJseQorCisyMDA0LTA2LTExICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzogKHRoZW9yYV9kZWNfY2hhaW4pLAorCSh0aGVvcmFfZGVjX2NoYW5nZV9zdGF0ZSk6CisJRG9uJ3QgdHJ5IHRvIGRlY29kZSBmcmFtZXMgYmVmb3JlIHdlIHJlY2VpdmVkIGEga2V5ZnJhbWUuCisKKzIwMDQtMDYtMTEgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvb2dnL2dzdG9nZ211eC5jOiAoZ3N0X29nZ19tdXhfY2xhc3NfaW5pdCksCisJKGdzdF9vZ2dfbXV4X2luaXQpLCAoZ3N0X29nZ19tdXhfbmV4dF9idWZmZXIpLAorCShnc3Rfb2dnX211eF9nZXRfaGVhZGVycyksIChnc3Rfb2dnX211eF9zZXRfaGVhZGVyX29uX2NhcHMpLAorCShnc3Rfb2dnX211eF9zZW5kX2hlYWRlcnMpLCAoZ3N0X29nZ19tdXhfbG9vcCksCisJKGdzdF9vZ2dfbXV4X2dldF9wcm9wZXJ0eSksIChnc3Rfb2dnX211eF9zZXRfcHJvcGVydHkpOgorCUFkZGVkIHByb3BlcnR5IHRvIHNldCB0aGUgbWF4aW11bSBkZWxheSBvZiBhIHBhZ2UuCisKKzIwMDQtMDYtMTAgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvb2dnL2dzdG9nZ211eC5jOiAoZ3N0X29nZ19tdXhfY2xhc3NfaW5pdCksCisJKGdzdF9vZ2dfbXV4X2luaXQpLCAoZ3N0X29nZ19tdXhfbmV4dF9idWZmZXIpLAorCShnc3Rfb2dnX211eF9nZXRfaGVhZGVycyksIChnc3Rfb2dnX211eF9zZXRfaGVhZGVyX29uX2NhcHMpLAorCShnc3Rfb2dnX211eF9zZW5kX2hlYWRlcnMpLCAoZ3N0X29nZ19tdXhfbG9vcCksCisJKGdzdF9vZ2dfbXV4X2dldF9wcm9wZXJ0eSksIChnc3Rfb2dnX211eF9zZXRfcHJvcGVydHkpOgorCUFkZGVkIG1heC1kZWxheSBwcm9wZXJ0eSB0byBjb250cm9sIHRoZSBtYXhpbXVtIGFtb3VudAorCW9mIGRhdGEgdG8gcHV0IGluIG9uZSBwYWdlLgorCisyMDA0LTA2LTEwICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L3RoZW9yYS90aGVvcmFlbmMuYzogKGdzdF90aGVvcmFfZW5jX2NsYXNzX2luaXQpLAorCShnc3RfdGhlb3JhX2VuY19pbml0KSwgKHRoZW9yYV9lbmNfc2lua19saW5rKSwKKwkodGhlb3JhX2J1ZmZlcl9mcm9tX3BhY2tldCksICh0aGVvcmFfZW5jX3NldF9wcm9wZXJ0eSksCisJKHRoZW9yYV9lbmNfZ2V0X3Byb3BlcnR5KToKKwlTZXQgZHVyYXRpb24gb24gZW5jb2RlZCBidWZmZXIsIGFkZGVkIHNvbWUgbW9yZSBwcm9wZXJ0aWVzCisKKzIwMDQtMDYtMTAgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvb2dnL2dzdG9nZ211eC5jOiAoZ3N0X29nZ19tdXhfbmV4dF9idWZmZXIpLAorCShnc3Rfb2dnX211eF9nZXRfaGVhZGVycyksIChnc3Rfb2dnX211eF9zZXRfaGVhZGVyX29uX2NhcHMpLAorCShnc3Rfb2dnX211eF9zZW5kX2hlYWRlcnMpLCAoZ3N0X29nZ19tdXhfbG9vcCk6CisJKiBleHQvdGhlb3JhL3RoZW9yYWVuYy5jOiAodGhlb3JhX2VuY19jaGFpbik6CisJRml4IHJlZmNvdW50aW5nIGJ1Z3MKKworMjAwNC0wNi0xMCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X2luaXQpLAorCShnc3RfYXNmX2RlbXV4X2xvb3ApLCAoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX2ZpbGUpLAorCShnc3RfYXNmX2RlbXV4X3Byb2Nlc3NfZGF0YSksIChnc3RfYXNmX2RlbXV4X2hhbmRsZV9kYXRhKSwKKwkoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX29iamVjdCksIChnc3RfYXNmX2RlbXV4X2dldF9zdHJlYW0pLAorCShnc3RfYXNmX2RlbXV4X3Byb2Nlc3NfY2h1bmspLCAoZ3N0X2FzZl9kZW11eF9oYW5kbGVfc2lua19ldmVudCksCisJKGdzdF9hc2ZfZGVtdXhfaGFuZGxlX3NyY19ldmVudCksIChnc3RfYXNmX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpLAorCShnc3RfYXNmX2RlbXV4X2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguaDoKKwkgIFlvdSBrbm93IENoaW1haXJhPyAiSSAtIEhBVEUgLSBFVkVSWVRISU5HIi4gWWVhaCwgdGhhdCdzIHdoYXQgdGhpcworCSAgZmVlbHMgbGlrZS4gSSB0aGluayB3ZSBzaG91bGQgc2V0IGEgbmV3IHJlcXVpcmVtZW50IGZvciBkZW11eGVycworCSAgZnJvbSBub3cgb24gdG8gaW1wbGVtZW50IHNhbmUgbG9vcCBmdW5jdGlvbnMsIGRhdGEgbG9vcHMsIHF1ZXJ5CisJICBhbmQgc2VlayBmdW5jdGlvbnMgYmVmb3JlIGZpcnN0IGNvbW1pdCBpbnRvIENWUy4gQW5kIHRoaXMgY29tbWl0CisJICBmaXhlcyBhbGwgb2YgdGhlIGFib3ZlLgorCisyMDA0LTA2LTEwICBDaHJpc3RvcGhlIEZlcmdlYXUgIDx0ZXVmQGdub21lLm9yZz4KKworCSogZ3N0L3RhZ3MvZ3N0dm9yYmlzdGFnLmM6IChnc3Rfdm9yYmlzX3RhZ19hZGQpOiBtYWtlIHN1cmUgcGFyc2VkCisJICB2b3JiaXMgY29tbWVudHMgYXJlIHByb3Blcmx5IGVuY29kZWQgaW4gVVRGLTggYmVmb3JlIGFkZGluZyB0aGVtCisJICB0byBhIEdzdFRhZ0xpc3QKKworMjAwNC0wNi0wOSAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChhZGRfY2hhbm5lbHMpOgorCSAgaGFuZGxlIG1pbiA8PSBtYXggY29ycmVjdGx5CisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9maXhhdGVfdG9fbWltZXR5cGUpLAorCShnc3RfYWxzYV9maXhhdGVfZmllbGRfbmVhcmVzdF9pbnQpLCAoZ3N0X2Fsc2FfZml4YXRlKToKKwkgIGFkZCBmaXhhdGlvbiBmdW5jdGlvbnMgc28gd2UgZml4YXRlIGNvcnJlY3RseS4gTm8gcHJlZmVycmluZyBvZiBhbGF3CisJICBhbnltb3JlIGJlY2F1c2UgaXQncyB0aGUgZmlyc3Qgc3RydWN0dXJlLgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5oOgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2Ffc3dfcGFyYW1zX2R1bXApLAorCShnc3RfYWxzYV9od19wYXJhbXNfZHVtcCk6CisJICBhZGQgZnVuY3Rpb25zIHRvIGVhc2UgZGVidWdnaW5nIGluIGFsc2FsaWIKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX3Byb2JlX2h3X3BhcmFtcyksCisJKGdzdF9hbHNhX3NldF9od19wYXJhbXMpLCAoZ3N0X2Fsc2Ffc2V0X3N3X3BhcmFtcyksCisJKGdzdF9hbHNhX3N0YXJ0X2F1ZGlvKToKKwkgIG9ubHkgc3BlY2lmeSBodyBwYXJhbXMgaWYgd2UgcmVhbGx5IHNldHVwIGEgZm9ybWF0IChmaXhlcyAjMTM0MDA3IC0KKwkgIG9yIGF0IGxlYXN0IHdvcmtzIGFyb3VuZCBpdCkKKworMjAwNC0wNi0wOSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnbXV4LmM6IChnc3Rfb2dnX211eF9pbml0KSwKKwkoZ3N0X29nZ19tdXhfbmV4dF9idWZmZXIpLCAoZ3N0X29nZ19tdXhfYnVmZmVyX2Zyb21fcGFnZSksCisJKGdzdF9vZ2dfbXV4X3B1c2hfcGFnZSksIChnc3Rfb2dnX211eF9nZXRfaGVhZGVycyksCisJKGdzdF9vZ2dfbXV4X3NldF9oZWFkZXJfb25fY2FwcyksIChnc3Rfb2dnX211eF9zZW5kX2hlYWRlcnMpLAorCShnc3Rfb2dnX211eF9sb29wKToKKwlVc2Ugc3RyZWFtIGNhcHMgdG8gc2V0dXAgdGhlIGluaXRpYWwgcGFnZXMgaW4gdGhlIG9nZyBzdHJlYW0uCisJQ29ycmVjdGx5IHNldCB0aGUgc3RyZWFtaGVhZGVyIGNhcHMgb24gdGhlIHNyY3BhZC4KKworMjAwNC0wNi0wOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzogKGdzdF92NGxzcmNfZ2V0X2Zwc19saXN0KSwKKwkoZ3N0X3Y0bHNyY19nZXRfZnBzKSwgKGdzdF92NGxzcmNfc3JjY29ubmVjdCksCisJKGdzdF92NGxzcmNfZ2V0Y2Fwcyk6CisJKiBzeXMvdjRsL3Y0bF9jYWxscy5jOiAoZ3N0X3Y0bF9zZXRfd2luZG93X3Byb3BlcnRpZXMpLAorCShnc3RfdjRsX2dldF9waWN0dXJlKSwgKGdzdF92NGxfZ2V0X2F1ZGlvKSwgKGdzdF92NGxfc2V0X2F1ZGlvKToKKwkgIGFkZCBxdWVyeWluZyBvZiBmcHMgbGlzdHMgZm9yIHdlYmNhbXMuICBOZWdvdGlhdGluZyB0byBhIGZyYW1lcmF0ZQorCSAgbm93IHdvcmtzLgorCisyMDA0LTA2LTA4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvdGhlb3JhL3RoZW9yYWVuYy5jOiAodGhlb3JhX2J1ZmZlcl9mcm9tX3BhY2tldCksCisJKHRoZW9yYV9wdXNoX2J1ZmZlciksICh0aGVvcmFfcHVzaF9wYWNrZXQpLAorCSh0aGVvcmFfc2V0X2hlYWRlcl9vbl9jYXBzKSwgKHRoZW9yYV9lbmNfY2hhaW4pOgorCSAgbWFyayBidWZmZXJzIGFuZCBwdXQgb24gc3RyZWFtaGVhZGVyLCByYXcgdGhlb3JhIHN0cmVhbWluZworCSAgbm93IHdvcmtzIHRvbywgd2hlZQorCisyMDA0LTA2LTA4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvdGNwL2dzdHRjcC5jOiAoZ3N0X3RjcF9nZHBfcmVhZF9oZWFkZXIpLAorCShnc3RfdGNwX2dkcF9yZWFkX2NhcHMpOgorICAgICAgICAgIGRvIGEgbG9vcGluZyByZWFkIGZvciBjYXBzIGFuZCBHRFAgaGVhZGVycyB0b28KKworMjAwNC0wNi0wOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuYzogKGdzdF90Y3BjbGllbnRzcmNfZ2V0KToKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc3JjLmM6IChnc3RfdGNwc2VydmVyc3JjX2dldCk6CisgICAgICAgICAgcmV0dXJuIEVPUyBpbnN0ZWFkIG9mIE5VTEwgaW4gX2dldAorCisyMDA0LTA2LTA4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3RjcC9nc3R0Y3AuYzogKGdzdF90Y3BfZ2RwX3JlYWRfaGVhZGVyKSwKKwkoZ3N0X3RjcF9nZHBfcmVhZF9jYXBzKSwgKGdzdF90Y3BfZ2RwX3dyaXRlX2hlYWRlciksCisJKGdzdF90Y3BfZ2RwX3dyaXRlX2NhcHMpOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuYzogKGdzdF90Y3BjbGllbnRzcmNfZ2V0KToKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc3JjLmM6IChnc3RfdGNwc2VydmVyc3JjX2dkcF9yZWFkX2NhcHMpLAorCShnc3RfdGNwc2VydmVyc3JjX2dkcF9yZWFkX2hlYWRlciksIChnc3RfdGNwc2VydmVyc3JjX2dldCk6CisJTWVtb3J5IGxlYWsgZml4ZXMKKworMjAwNC0wNi0wOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L3ZvcmJpcy9NYWtlZmlsZS5hbToKKwkqIGV4dC92b3JiaXMvdm9yYmlzLmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvdm9yYmlzL3ZvcmJpc3BhcnNlLmM6IChnc3Rfdm9yYmlzX3BhcnNlX2Jhc2VfaW5pdCksCisJKGdzdF92b3JiaXNfcGFyc2VfY2xhc3NfaW5pdCksIChnc3Rfdm9yYmlzX3BhcnNlX2luaXQpLAorCSh2b3JiaXNfcGFyc2Vfc2V0X2hlYWRlcl9vbl9jYXBzKSwgKHZvcmJpc19wYXJzZV9jaGFpbiksCisJKHZvcmJpc19wYXJzZV9jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L3ZvcmJpcy92b3JiaXNwYXJzZS5oOgorICAgICAgICAgIGFkZGluZyBhIHZvcmJpc3BhcnNlIGVsZW1lbnQgdGhhdCBtYXJrcyB0aGUgYnVmZmVycywgc3RyZWFtaW5nCisgICAgICAgICAgcmF3IHZvcmJpcyB1c2luZyBHRFAgbm93IHdvcmtzLCB3aGVlCisKKzIwMDQtMDYtMDggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvanBlZy9NYWtlZmlsZS5hbToKKwkqIGV4dC9qcGVnL1JFQURNRToKKwkqIGV4dC9qcGVnL2dzdGpwZWcuYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZGVjLmM6IChnc3Rfc21va2VkZWNfZ2V0X3R5cGUpLAorCShnc3Rfc21va2VkZWNfYmFzZV9pbml0KSwgKGdzdF9zbW9rZWRlY19jbGFzc19pbml0KSwKKwkoZ3N0X3Ntb2tlZGVjX2luaXQpLCAoZ3N0X3Ntb2tlZGVjX2xpbmspLCAoZ3N0X3Ntb2tlZGVjX2NoYWluKToKKwkqIGV4dC9qcGVnL2dzdHNtb2tlZGVjLmg6CisJKiBleHQvanBlZy9nc3RzbW9rZWVuYy5jOiAoZ3N0X3Ntb2tlZW5jX2dldF90eXBlKSwKKwkoZ3N0X3Ntb2tlZW5jX2Jhc2VfaW5pdCksIChnc3Rfc21va2VlbmNfY2xhc3NfaW5pdCksCisJKGdzdF9zbW9rZWVuY19pbml0KSwgKGdzdF9zbW9rZWVuY19nZXRjYXBzKSwgKGdzdF9zbW9rZWVuY19saW5rKSwKKwkoZ3N0X3Ntb2tlZW5jX3Jlc3luYyksIChnc3Rfc21va2VlbmNfY2hhaW4pLAorCShnc3Rfc21va2VlbmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9zbW9rZWVuY19nZXRfcHJvcGVydHkpOgorCSogZXh0L2pwZWcvZ3N0c21va2VlbmMuaDoKKwkqIGV4dC9qcGVnL3Ntb2tlY29kZWMuYzogKHNtb2tlY29kZWNfaW5pdF9kZXN0aW5hdGlvbiksCisJKHNtb2tlY29kZWNfZmx1c2hfZGVzdGluYXRpb24pLCAoc21va2Vjb2RlY190ZXJtX2Rlc3RpbmF0aW9uKSwKKwkoc21va2Vjb2RlY19pbml0X3NvdXJjZSksIChzbW9rZWNvZGVjX2ZpbGxfaW5wdXRfYnVmZmVyKSwKKwkoc21va2Vjb2RlY19za2lwX2lucHV0X2RhdGEpLCAoc21va2Vjb2RlY19yZXN5bmNfdG9fcmVzdGFydCksCisJKHNtb2tlY29kZWNfdGVybV9zb3VyY2UpLCAoc21va2Vjb2RlY19lbmNvZGVfbmV3KSwKKwkoc21va2Vjb2RlY19kZWNvZGVfbmV3KSwgKHNtb2tlY29kZWNfaW5mb19mcmVlKSwKKwkoc21va2Vjb2RlY19zZXRfcXVhbGl0eSksIChzbW9rZWNvZGVjX2dldF9xdWFsaXR5KSwKKwkoc21va2Vjb2RlY19zZXRfdGhyZXNob2xkKSwgKHNtb2tlY29kZWNfZ2V0X3RocmVzaG9sZCksCisJKHNtb2tlY29kZWNfc2V0X2JpdHJhdGUpLCAoc21va2Vjb2RlY19nZXRfYml0cmF0ZSksCisJKGZpbmRfYmVzdF9zaXplKSwgKGFic19kaWZmKSwgKHB1dCksIChzbW9rZWNvZGVjX2VuY29kZSksCisJKHNtb2tlY29kZWNfcGFyc2VfaGVhZGVyKSwgKHNtb2tlY29kZWNfZGVjb2RlKToKKwkqIGV4dC9qcGVnL3Ntb2tlY29kZWMuaDoKKwlBZGRlZCBhIG5ldyBzaW1wbGUganBlZyBiYXNlZCBjb2RlYworCisyMDA0LTA2LTA4ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogKGdzdF9tdWx0aXBhcnRfbXV4X2NsYXNzX2luaXQpLAorCShnc3RfbXVsdGlwYXJ0X211eF9sb29wKToKKwlGaXggbWVtb3J5IGxlYWsKKworMjAwNC0wNi0wOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuYzogKGdzdF90Y3BjbGllbnRzcmNfZ2V0KToKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc2luay5jOiAoZ3N0X3RjcHNlcnZlcnNpbmtfY2xpZW50X3JlbW92ZSksCisJKGdzdF90Y3BzZXJ2ZXJzaW5rX2hhbmRsZV9jbGllbnRfcmVhZCksIChnc3RfdGNwX2J1ZmZlcl93cml0ZSksCisJKGdzdF90Y3BzZXJ2ZXJzaW5rX2hhbmRsZV9jbGllbnRfd3JpdGUpLCAoZ3N0X3RjcHNlcnZlcnNpbmtfY2hhaW4pLAorCShnc3RfdGNwc2VydmVyc2lua19pbml0X3NlbmQpLCAoZ3N0X3RjcHNlcnZlcnNpbmtfY2xvc2UpOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzaW5rLmg6CisgICAgICAgICAgdGFrZSBzdHJlYW1oZWFkZXIgaW50byBhY2NvdW50CisKKzIwMDQtMDYtMDggIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC9sZXZlbC9NYWtlZmlsZS5hbToKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiAoZ3N0X2xldmVsX2NsYXNzX2luaXQpOgorCSAgY2xlYW4gdXAgbWFyc2hhbCBnZW5lcmF0aW9uCisKKzIwMDQtMDYtMDggIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC90Y3AvTWFrZWZpbGUuYW06CisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNpbmsuYzogKGdzdF90Y3BjbGllbnRzaW5rX2dldF90eXBlKSwKKwkoZ3N0X3RjcGNsaWVudHNpbmtfY2xhc3NfaW5pdCksIChnc3RfdGNwY2xpZW50c2lua19pbml0KSwKKwkoZ3N0X3RjcGNsaWVudHNpbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF90Y3BjbGllbnRzaW5rX2dldF9wcm9wZXJ0eSk6CisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNyYy5jOiAoZ3N0X3RjcGNsaWVudHNyY19jbGFzc19pbml0KSwKKwkoZ3N0X3RjcGNsaWVudHNyY19pbml0KSwgKGdzdF90Y3BjbGllbnRzcmNfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3RjcGNsaWVudHNyY19nZXRfcHJvcGVydHkpOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzaW5rLmM6IChnc3RfdGNwc2VydmVyc2lua19jbGFzc19pbml0KSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfaW5pdCksIChnc3RfdGNwc2VydmVyc2lua19oYW5kbGVfc2VydmVyX3JlYWQpLAorCShnc3RfdGNwc2VydmVyc2lua19oYW5kbGVfY2xpZW50X3JlYWQpLAorCShnc3RfdGNwc2VydmVyc2lua19oYW5kbGVfY2xpZW50X3dyaXRlKSwKKwkoZ3N0X3RjcHNlcnZlcnNpbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF90Y3BzZXJ2ZXJzaW5rX2dldF9wcm9wZXJ0eSk6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNpbmsuaDoKKwkgIGFkZCBzaWduYWxzIGNsaWVudC1hZGRlZCBhbmQgY2xpZW50LXJlbW92ZWQKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc3JjLmM6IChnc3RfdGNwc2VydmVyc3JjX2NsYXNzX2luaXQpLAorCShnc3RfdGNwc2VydmVyc3JjX2luaXQpLCAoZ3N0X3RjcHNlcnZlcnNyY19zZXRfcHJvcGVydHkpLAorCShnc3RfdGNwc2VydmVyc3JjX2dldF9wcm9wZXJ0eSk6CisJdW5pZm9ybWl6ZWQsIGNoYW5nZSBkZWZhdWx0IHByb3RvY29sIHRvIE5PTkUKKwkqIGdzdC90Y3AvZ3N0dGNwLW1hcnNoYWwubGlzdDogYWRkZWQKKzIwMDQtMDYtMDcgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfY2hlY2tfZXZlbnQpOgorCSAgaGFuZGxlIGRpc2NvbnQgZXZlbnRzIGlmIHRoZXkgaGFwcGVuIGJlZm9yZSBjYXBzIG5lZ28KKworMjAwNC0wNi0wNyAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYzogKGdzdF9tdWx0aXBhcnRfZGVtdXhfYmFzZV9pbml0KSwKKwkoZ3N0X211bHRpcGFydF9maW5kX3BhZF9ieV9taW1lKSwgKGdzdF9tdWx0aXBhcnRfZGVtdXhfY2hhaW4pLAorCShnc3RfbXVsdGlwYXJ0X2RlbXV4X3BsdWdpbl9pbml0KToKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IChnc3RfbXVsdGlwYXJ0X211eF9jbGFzc19pbml0KSwKKwkoZ3N0X211bHRpcGFydF9tdXhfaW5pdCksIChnc3RfbXVsdGlwYXJ0X211eF9sb29wKSwKKwkoZ3N0X211bHRpcGFydF9tdXhfY2hhbmdlX3N0YXRlKToKKwlTbWFsbCB1cGRhdGVzLCBmaXggYSBtZW1sZWFrCisKKzIwMDQtMDYtMDcgIFN0ZXBoYW5lIExvZXVpbGxldCAgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBjb25maWd1cmUuYWM6IE9TUyBwb3J0YWJpbGl0eQorCSogZXh0L2FydHMvZ3N0X2FydHMuYzogaWRlbQorCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50LmM6IGlkZW0KKwkqIHN5cy9vc3MvZ3N0b3NzbWl4ZXIuYzogaWRlbQorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IGlkZW0KKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6IGlkZW0KKwkqIHN5cy9vc3Mvb3NzX3Byb2JlLmM6IGlkZW0KKwkgIC0gY2hlY2sgZm9yIHNvdW5kY2FyZC5oIGluIGRpZmZlcmVudCBwbGFjZXMgZm9yIHNvbWUgQlNECisKKzIwMDQtMDYtMDcgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBBVVRIT1JTOgorCUFkZCBtZSB0byB0aGUgYXV0aG9ycyBmaWxlCisJKiBjb25maWd1cmUuYWM6CisJSW5jcmVhc2UgdGhlIGxpYmR2IHJlcXVpcmVtZW50IHRvID49IHZlcnNpb24gMC4xMDAKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOiAoZ3N0X2R2ZGVjX2luaXQpLCAoZ3N0X2R2ZGVjX3NyY19jb252ZXJ0KSwKKwkoZ3N0X2R2ZGVjX3NyY19xdWVyeSksIChnc3RfZHZkZWNfaGFuZGxlX3NpbmtfZXZlbnQpLAorCShnc3RfZHZkZWNfcHVzaCksIChnc3RfZHZkZWNfbG9vcCksIChnc3RfZHZkZWNfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9kdi9nc3RkdmRlYy5oOgorCUFkZCBzdXBwb3J0IGZvciB0aGUgbmV3X21lZGlhIGZsYWcgd2hlbiBzZW5kaW5nIERJU0NPTlQgZXZlbnRzCisJTWFrZSB0aGUgcXVlcnlpbmcgd29yayB3aGVuIHZpZGVvIHBhZCBpcyBub3QgbGlua2VkCisKKzIwMDQtMDYtMDcgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0LmkubUB6ZW4uY28udWs+CisKKwlyZXZpZXdlZCBieSBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9taXhtYXRyaXgvbWl4bWF0cml4LmM6IChnc3RfbWl4bWF0cml4X2luaXQpOgorCSAgY3JlYXRlIGEgTlVMTC1pbml0aWFsaXplZCBhcnJheSBvZiBwYWRzLCBzbyB3ZSBkb24ndCB0aGluayB0aGV5CisJICBleGlzdCBhbHJlYWR5LiAoZml4ZXMgIzE0MzEzMCkKKworMjAwNC0wNi0wNyAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvbWl4bWF0cml4L21peG1hdHJpeC5jOiAoZ3N0X21peG1hdHJpeF9pbml0KSwKKwkobWl4bWF0cml4X3Jlc2l6ZSksIChnc3RfbWl4bWF0cml4X3NldF9hbGxfY2FwcyksCisJKGdzdF9taXhtYXRyaXhfcmVxdWVzdF9uZXdfcGFkKSwgKGdzdF9taXhtYXRyaXhfbG9vcCk6CisJICBkb24ndCB1c2UgLy8gY29tZW50cworCisyMDA0LTA2LTA3ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX3NhbXBsZXNfdG9fdGltZXN0YW1wKToKKwkgIGNhc3QgdG8gR3N0Q2xvY2tUaW1lIHRvIGdldCBoaWdoZXIgZ3JhbnVsYXJpdHkKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2NoZWNrX2V2ZW50KToKKwkgIHVzZSBnc3RfZWxlbWVudF9zZXRfdGltZV9kZWxheSB0byBnZXQgdGhlIGV4YWN0IHRpbWUKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2NoYWluKToKKwkgIHVzZSB0aGUgbmVnb3RpYXRlZCByYXRlIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgZnJhbWUncyByYXRlIHdoaWNoCisJICBtaWdodCBiZSB3cm9uZyBiZWNhdXNlIG9mIGJpdCBlcnJvcnMuIFRoaXMgYXZvaWRzIGVtaXR0aW5nIHRvdGFsbHkKKwkgIGJvZ3VzIHRpbWVzdGFtcHMgYW5kIHNjcmV3aW5nIHN5bmMuCisJKGZpeGVzICMxNDM0NTQpCisKKzIwMDQtMDYtMDcgIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0LmkubUB6ZW4uY28udWs+CisKKwlyZXZpZXdlZCBieSBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9hZGRlci9nc3RhZGRlci5jOiAoZ3N0X2FkZGVyX2xvb3ApOgorCSAgcHJvcGVybHkgZXJyb3Igb3V0IHdoZW4gbm8gbmVnb3RpYXRpb24gaGFzIGhhcHBlbmVkIHlldC4gKGZpeGVzCisJICAjMTQzMDMyKQorCisyMDA0LTA2LTA2ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfaWQzX3RhZ19oYW5kbGVfZXZlbnQpOgorCSAgZm9yd2FyZCBjb3JyZWN0bHkgdHJhbnNmb3JtZWQgb2Zmc2V0IGluIGRpc2NvbnQgZXZlbnRzLiBCYXNlZCBvbgorCSAgcGF0Y2ggYnkgQXJ3ZWQgdi4gTWVya2F0ei4gKGZpeGVzICMxNDI4NTEpCisKKzIwMDQtMDYtMDYgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29kZWNtYXAuYzogdGhhdCdzCisJR19IQVZFX0dOVUNfVkFSQVJHUywgbm90IEdfSEFWRV9HTlVfVkFSQVJHUy4gIFNob3VsZCBmaXggY29tcGlsZQorCXByb2JsZW1zIG9uIHNldmVyYWwgc3lzdGVtcy4KKworMjAwNC0wNi0wNiAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jOiAoZ3N0X3ZvcmJpc19kZWNfaW5pdCk6CisJICB1c2UgZXhwbGljaXQgY2FwcyBvbiB0aGUgc3JjcGFkCisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jOiAodm9yYmlzX2RlY19jaGFpbik6CisJICBwcm9wZXJseSBlcnJvciBvdXQgaWYgY2FwcyBjb3VsZG4ndCBiZSBzZXQgKGZpeGVzICMxNDI3NjQpCisKKzIwMDQtMDYtMDYgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfcHJvYmVfaHdfcGFyYW1zKSwKKwkoZ3N0X2Fsc2Ffc2V0X2h3X3BhcmFtcyksIChnc3RfYWxzYV9zZXRfc3dfcGFyYW1zKSwKKwkoZ3N0X2Fsc2Ffc3RhcnRfYXVkaW8pOgorCSAgLSBkb24ndCBjYWxsIHNldF9wZXJpb2RzX2ludGVnZXIgYW55bW9yZSwgaXQgYnJlYWtzIHRoZQorCSAgY29uZmlndXJhdGlvbiByYW5kb21seQorCSAgLSBjYWxsIHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3MgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZyBtYXNrcworCSAgLSBkb24ndCBmYWlsIGlmIHRoZSBzd19wYXJhbXMgY2FuJ3QgYmUgc2V0LCBqdXN0IHVzZSB0aGUgZGVmYXVsdAorCSAgcGFyYW1zIGFuZCBob3BlIGl0IHdvcmtzLiBBbHNhbGliIGhhcyB3ZWlyZCBpc3N1ZXMgd2hlbiB5b3UgdG91Y2gKKwkgIHN3X3BhcmFtcyBhbmQgZG9lcyBubyBwcm9wZXIgZXJyb3IgcmVwb3J0aW5nIGFib3V0IHdoYXQgZmFpbGVkLgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2Ffb3Blbl9hdWRpbyksCisJKGdzdF9hbHNhX2Nsb3NlX2F1ZGlvKToKKwkgIG1ha2Ugb3VyIGFsc2EgZGVidWdnaW5nIGdvIHZpYSBnc3QgZGVidWdnaW5nIGFuZCBub3QgY29uZGl0aW9uYWxseQorCSAgZGVmaW5lZAorCSogZXh0L2Fsc2EvZ3N0YWxzYS5oOgorCSAgYWRkIEFMU0FfREVCVUdfRkxVU0ggbWFjcm8KKwkqIGV4dC9hbHNhL2dzdGFsc2FwbHVnaW4uYzogKGdzdF9hbHNhX2Vycm9yX3dyYXBwZXIpLAorCShwbHVnaW5faW5pdCk6CisJICB3cmFwIGFsc2EgZXJyb3JzIHRvIGJlIHByaW50ZWQgdmlhIHRoZSBnc3QgZGVidWdnaW5nIHN5c3RlbSBhbmQgbm90CisJICBzcGFtbWVkIHRvIHN0ZGVycgorCisyMDA0LTA2LTA0ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9pbml0KSwKKwkoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksIChnc3RfcXRkZW11eF9oYW5kbGVfc3JjX2V2ZW50KSwKKwkoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQpLCAoZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpLCAocXRkZW11eF9kdW1wX212aGQpLAorCShxdGRlbXV4X3BhcnNlX3RyYWspOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5oOgorCSAgQml0Y2guIEFsc28ga25vd24gYXMgc2Vla2luZywgcXVlcnlpbmcgJiBjby4KKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc3NpbmtfaW5pdCksIChnc3Rfb3Nzc2lua19jaGFpbiksCisJKGdzdF9vc3NzaW5rX2NoYW5nZV9zdGF0ZSk6CisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuaDoKKwkgIFJlc3luY2luZyBpcyBmb3Igd2VlbmllcywgdGhpcyBoYWNrIGlzIG5vIGxvbmdlciBuZWVkZWQgYW5kIHdhcworCSAgYnJva2VuIGFueXdheSAoc2luY2UgaXQgLSB1bmludGVuZGVkbHkgLSBhbHdheXMgbGVhdmVzIHJlc3luYyB0bworCSAgVFJVRSkuCisKKzIwMDQtMDYtMDUgIEFuZHJldyBUdXJuZXIgPHp4b21iaWVAaG90cG9wLmNvbT4KKworCSogZ3N0L3RjcC9nc3R0Y3AuYzogcG9ydGFiaWxpdHkgKFNvbGFyaXMgMTAvRnJlZUJTRCkKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c3JjLmg6IGlkZW0KKwkgIC0gZGVmaW5lIE1TR19OT1NJR05BTCBpZiBub3QgZG9uZQorCSAgLSBpbmNsdWRlIHVuaXN0ZC5oIGZvciBvZmZfdAorICAgICAgICAgIChmaXhlcyAjMTQzNzQ5KQorCisyMDA0LTA2LTA1ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9raW8vTWFrZWZpbGUuYW06CisJICBjaGVjayBmb3IgcXQncyBtb2MgcHJlcHJvY2Vzc29yIGV4cGxpY2l0bHkgYW5kIHVzZSBpdAorCisyMDA0LTA2LTAzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSogZ3N0L3RjcC9nc3R0Y3AuYzogKGdzdF90Y3Bfc29ja2V0X3dyaXRlKToKKwkgIGRvbid0IGdldCBhIHNpZ25hbCBmb3IgRVBJUEUgb24gc29ja2V0IHdyaXRlcworCSAgKHNvbWVib2R5IGNoZWNrIGlmIHRoaXMgd29ya3Mgb24gb3RoZXIgcGxhdGZvcm1zKQorCisyMDA0LTA2LTAyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhY2xvY2suYzogKGdzdF9hbHNhX2Nsb2NrX2dldF90eXBlKToKKwkqIGV4dC9hbHNhL2dzdGFsc2FzcmMuYzogKGdzdF9hbHNhX3NyY19sb29wKToKKyAgICAgICAgICBjaGVjayBlcnJvciBjb25kaXRpb24gb24gYXZhaWxhYmxlIHNhbXBsZXMgY29ycmVjdGx5CisKKzIwMDQtMDYtMDIgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FzcmMuYzogKGdzdF9hbHNhX3NyY19nZXRfdGltZSk6CisgICAgICAgICAgYXZvaWQgYSBzZWdmYXVsdAorCSogZ3N0L3RjcC9nc3R0Y3AuYzogKGdzdF90Y3Bfc29ja2V0X3dyaXRlKSwgKGdzdF90Y3Bfc29ja2V0X3JlYWQpLAorCShnc3RfdGNwX2dkcF9yZWFkX2hlYWRlciksIChnc3RfdGNwX2dkcF9yZWFkX2NhcHMpOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzcmMuYzogKGdzdF90Y3BzZXJ2ZXJzcmNfZ2RwX3JlYWRfY2FwcyksCisJKGdzdF90Y3BzZXJ2ZXJzcmNfZ2RwX3JlYWRfaGVhZGVyKToKKyAgICAgICAgIHVzZSBzc2l6ZV90IG92ZXIgc2l6ZV90IHNpbmNlIHRoZSBmb3JtZXIgaXMgc2lnbmVkIGFuZCB0aHVzIHRoZQorICAgICAgICAgY2hlY2sgZm9yIGVycm9yIGNvZGVzIGNhbiB3b3JrCisKKzIwMDQtMDYtMDIgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJcmV2aWV3ZWQgYnk6IEpvaGFuCisKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IChnc3RfbXVsdGlwYXJ0X211eF9jbGFzc19pbml0KSwKKwkoZ3N0X211bHRpcGFydF9tdXhfbG9vcCk6CisJT29wcworCisyMDA0LTA2LTAyICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYzogKGdzdF9tdWx0aXBhcnRfbXV4X2NsYXNzX2luaXQpLAorCShnc3RfbXVsdGlwYXJ0X211eF9pbml0KSwgKGdzdF9tdWx0aXBhcnRfbXV4X2xvb3ApLAorCShnc3RfbXVsdGlwYXJ0X211eF9nZXRfcHJvcGVydHkpLCAoZ3N0X211bHRpcGFydF9tdXhfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X211bHRpcGFydF9tdXhfY2hhbmdlX3N0YXRlKToKKwlBZGRlZCBjb25maWd1cmFibGUgYm91bmRhcnkgc3BlY2lmaWVyLCBhZGRlZCB0aGUgdmFsdWUgYXMgYQorCWNhcHMgZmllbGQgYXMgd2VsbC4KKworMjAwNC0wNi0wMiAgWmFoZWVyIEFiYmFzIE1lcmFsaSAgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorCisJKiBnc3QvdGNwL2dzdHRjcC5jOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuYzoKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c3JjLmg6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNyYy5jOgorCSAgLSBwb3J0YWJpbGl0eSBmaXgsIHRvIGNvbXBpbGUgb24gT1NYCisgICAgICAgICAgICAoZml4ZXMgIzE0MzE0NikKKworCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvZWxlbWVudC5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmM6CisJICAtIGNvbXBpbGF0aW9uIHdhcm5pbmdzIG9uIE9TWAorICAgICAgICAgICAgKGZpeGVzICMxNDMxNTMpCisKKzIwMDQtMDYtMDIgIFN0ZXBoYW5lIExvZXVpbGxldCA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmMgOiBzaWduIHdhcm5pbmcgZml4ZXMKKworCSogZ3N0LWxpYnMvZ3N0L21peGVyL21peGVydHJhY2suYyA6CisJICBkbyBubyB1c2UgZGVmaW5lcyB3aGljaCBhcmUgZ2xpYiAyLjQgc3BlY2lmaWMKKworMjAwNC0wNi0wMSAgQ2hyaXN0b3BoZSBGZXJnZWF1ICA8dGV1ZkBnbm9tZS5vcmc+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzogc3RyaXAgZW5kaW5nIGZyYW1pbmcgYml0IGZyb20gdm9yYmlzY29tbWVudAorCSAgYnVmZmVyIHNpbmNlIGxpYmZsYWMgZG9lc24ndCBleHBlY3QgaXQgKHJlcG9ydHMgYSBzeW5jIGVycm9yIHdoZW4KKwkgIGl0IGVuY291bnRlcnMgdGhhdCkKKworCisyMDA0LTA2LTAxICBPd2VuIEZyYXNlci1HcmVlbiAgPG93ZW5AZGlzY29iYWJlLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L21peGVyL21peGVydHJhY2suaDogQ2hhbmdlZCBzdHJ1Y3Qgc3ludGF4CisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvbWl4ZXJ0cmFjay5jOgorCShnc3RfbWl4ZXJfdHJhY2tfZ2V0X3Byb3BlcnR5KSwgKGdldF9taXhlcl90cmFja19pbml0KSwKKwkoZ2V0X21peGVyX3RyYWNrX2dldF9wcm9wZXJ0eSk6IEFkZGVkIHByb3BlcnR5IGFjY2Vzc29ycworCSogZ3N0LWxpYnMvZ3N0L21peGVyL21peGVyb3B0aW9ucy5oOiBDaGFuZ2VkIHN0cnVjdCBzeW50YXgKKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlcm9wdGlvbnMuYzoKKwkoZ3N0X21peGVyX29wdGlvbnNfZ2V0X3ZhbHVlcyk6IEFkZGVkCisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvbWl4ZXIuaDogQ2hhbmdlZCBHc3RNaXhlckNsYXNzIHN5bnRheAorCSogZ3N0LWxpYnMvZ3N0L21peGVyL21peGVyLmM6IEZpeGVkIGNvbW1lbnQKKworCisyMDA0LTA2LTAxICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2Ffb3Blbl9hdWRpbyk6CisgICAgICAgICAgaW1wcm92ZSBlcnJvciBtZXNzYWdlcyBvbiBvcGVuCisKKworMjAwNC0wNi0wMSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogc3lzL3Y0bC92NGwtb3ZlcmxheV9jYWxscy5jOiAoZ3N0X3Y0bF9zZXRfb3ZlcmxheSk6CisgICAgICAgICAgY2hlY2sgaWYgdjRsLWNvbmYgaXMgaW4gcGF0aAorCisyMDA0LTA2LTAxICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLXByaXYuYzogKGdtaV9zZXRfbWltZSk6CisgICAgICAgICAgY2hhbmdlIGFzc2VydCB0byBhIG1vcmUgcmVhZGFibGUgZXJyb3IgbWVzc2FnZQorCisyMDA0LTA1LTMxICBTdGVwaGFuZSBMb2V1aWxsZXQgIDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZ3N0LWxpYnMvZ3N0L3R1bmVyL3R1bmVyY2hhbm5lbC5oOgorCSAgLSBhZGQgYSBmcmVxX211bHRpcGxpY2F0b3IgZmllbGQgdG8gbWFrZSB0aGUgY29udmVyc2lvbgorCSAgICBiZXR3ZWVuIGludGVybmFsIGZyZXF1ZW5jeSB1bml0IGFuZCBIegorCSogc3lzL3Y0bC9nc3R2NGxlbGVtZW50LmM6CisJKiBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5jOgorCSAgLSBjaGFuZ2UgZGVmYXVsdCB2aWRlbyBkZXZpY2UgdG8gL2Rldi92aWRlbzAKKwkqIHN5cy92NGwvdjRsX2NhbGxzLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6CisJICAtIHdlIG9ubHkgZXhwb3NlIGZyZXF1ZW5jeSB0byB0aGUgdXNlciBpbiBIeiBpbnN0ZWFkIG9mCisJICAgIGJhc3RhcmQgdjRsWCB1bml0IChlaXRoZXIgNjIuNWtIeiBvciA2Mi41SHopCisKKzIwMDQtMDUtMzEgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmM6ICh2b3JiaXNfZGVjX2NoYWluKToKKwkgIEluaXRpYWxpc2UgYl9vX3MgYW5kIGVfb19zIHZhcmlhYmxlcworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOgorCShnc3RfcmlmZl9jcmVhdGVfdmlkZW9fY2Fwc193aXRoX2RhdGEpOgorCSAgQWRkIHNvbWUgdW51c3VhbCBmb3VyY2MncyBmcm9tIG1wbGF5ZXIgYXZpJ3MKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IChnc3RfbXVsdGlwYXJ0X211eF9wbHVnaW5faW5pdCk6CisJICBNYWtlIHRoZSBtdXhlciBoYXZlIHJhbmsgR1NUX1JBTktfTk9ORSwgc28gaXQgZG9lc24ndCBtZXNzIHVwCisJICBhdXRvcGx1Z2dpbmcuCisKKzIwMDQtMDUtMjggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QvYWxwaGEvTWFrZWZpbGUuYW06CisJKiBnc3QvYWxwaGEvZ3N0YWxwaGEuYzogKGdzdF9hbHBoYV9tZXRob2RfZ2V0X3R5cGUpLAorCShnc3RfYWxwaGFfZ2V0X3R5cGUpLCAoZ3N0X2FscGhhX2Jhc2VfaW5pdCksCisJKGdzdF9hbHBoYV9jbGFzc19pbml0KSwgKGdzdF9hbHBoYV9pbml0KSwgKGdzdF9hbHBoYV9zZXRfcHJvcGVydHkpLAorCShnc3RfYWxwaGFfZ2V0X3Byb3BlcnR5KSwgKGdzdF9hbHBoYV9zaW5rX2xpbmspLCAoZ3N0X2FscGhhX2FkZCksCisJKGdzdF9hbHBoYV9jaHJvbWFfa2V5KSwgKGdzdF9hbHBoYV9jaGFpbiksCisJKGdzdF9hbHBoYV9jaGFuZ2Vfc3RhdGUpLCAocGx1Z2luX2luaXQpOgorCUEgcGx1Z2luIHRvIGFkZCBhbiBhbHBoYSBjaGFubmVsIHRvIEk0MjAgdmlkZW8uIENhbiBvcHRpb25hbGx5IGRvCisJY2hyb21hIGtleWluZy4KKwkqIGdzdC9tdWx0aXBhcnQvTWFrZWZpbGUuYW06CisJKiBnc3QvbXVsdGlwYXJ0L211bHRpcGFydC5jOiAocGx1Z2luX2luaXQpOgorCSogZ3N0L211bHRpcGFydC9tdWx0aXBhcnRkZW11eC5jOiAoZ3N0X211bHRpcGFydF9kZW11eF9iYXNlX2luaXQpLAorCShnc3RfbXVsdGlwYXJ0X2RlbXV4X2NsYXNzX2luaXQpLCAoZ3N0X211bHRpcGFydF9kZW11eF9pbml0KSwKKwkoZ3N0X211bHRpcGFydF9kZW11eF9maW5hbGl6ZSksIChnc3RfbXVsdGlwYXJ0X2RlbXV4X2hhbmRsZV9ldmVudCksCisJKGdzdF9tdWx0aXBhcnRfZmluZF9wYWRfYnlfbWltZSksIChnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYWluKSwKKwkoZ3N0X211bHRpcGFydF9kZW11eF9jaGFuZ2Vfc3RhdGUpLAorCShnc3RfbXVsdGlwYXJ0X2RlbXV4X3BsdWdpbl9pbml0KToKKwkqIGdzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0bXV4LmM6IChnc3RfbXVsdGlwYXJ0X211eF9nZXRfdHlwZSksCisJKGdzdF9tdWx0aXBhcnRfbXV4X2Jhc2VfaW5pdCksIChnc3RfbXVsdGlwYXJ0X211eF9jbGFzc19pbml0KSwKKwkoZ3N0X211bHRpcGFydF9tdXhfZ2V0X3NpbmtfZXZlbnRfbWFza3MpLCAoZ3N0X211bHRpcGFydF9tdXhfaW5pdCksCisJKGdzdF9tdWx0aXBhcnRfbXV4X3Npbmtjb25uZWN0KSwgKGdzdF9tdWx0aXBhcnRfbXV4X3BhZF9saW5rKSwKKwkoZ3N0X211bHRpcGFydF9tdXhfcGFkX3VubGluayksCisJKGdzdF9tdWx0aXBhcnRfbXV4X3JlcXVlc3RfbmV3X3BhZCksCisJKGdzdF9tdWx0aXBhcnRfbXV4X2hhbmRsZV9zcmNfZXZlbnQpLAorCShnc3RfbXVsdGlwYXJ0X211eF9uZXh0X2J1ZmZlciksIChnc3RfbXVsdGlwYXJ0X211eF9jb21wYXJlX3BhZHMpLAorCShnc3RfbXVsdGlwYXJ0X211eF9xdWV1ZV9wYWRzKSwgKGdzdF9tdWx0aXBhcnRfbXV4X2xvb3ApLAorCShnc3RfbXVsdGlwYXJ0X211eF9nZXRfcHJvcGVydHkpLCAoZ3N0X211bHRpcGFydF9tdXhfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X211bHRpcGFydF9tdXhfY2hhbmdlX3N0YXRlKSwgKGdzdF9tdWx0aXBhcnRfbXV4X3BsdWdpbl9pbml0KToKKwlBIE11bHRpcGFydCBkZW11eGVyL211eGVyLiBOb3Qgc3VyZSBpZiBpdCB2aW9sYXRlcyBzcGVjcy4gVXNlZCB0bworCXNlbmQgbXVsdGlwYXJ0IGpwZWcgaW1hZ2VzIHRvIGEgYnJvd3Nlci4KKwkqIGdzdC92aWRlb2JveC9NYWtlZmlsZS5hbToKKwkqIGdzdC92aWRlb2JveC9SRUFETUU6CisJKiBnc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guYzogKGdzdF92aWRlb19ib3hfZmlsbF9nZXRfdHlwZSksCisJKGdzdF92aWRlb19ib3hfZ2V0X3R5cGUpLCAoZ3N0X3ZpZGVvX2JveF9iYXNlX2luaXQpLAorCShnc3RfdmlkZW9fYm94X2NsYXNzX2luaXQpLCAoZ3N0X3ZpZGVvX2JveF9pbml0KSwKKwkoZ3N0X3ZpZGVvX2JveF9zZXRfcHJvcGVydHkpLCAoZ3N0X3ZpZGVvX2JveF9nZXRfcHJvcGVydHkpLAorCShnc3RfdmlkZW9fYm94X3NpbmtfbGluayksIChnc3RfdmlkZW9fYm94X2k0MjApLAorCShnc3RfdmlkZW9fYm94X2F5dXYpLCAoZ3N0X3ZpZGVvX2JveF9jaGFpbiksCisJKGdzdF92aWRlb19ib3hfY2hhbmdlX3N0YXRlKSwgKHBsdWdpbl9pbml0KToKKwlDcm9wcyBvciBhZGRzIGJvcmRlcnMgYXJvdW5kIGFuIGltYWdlLiBjYW4gZG8gYWxwaGEgY2hhbm5lbAorCWJvcmRlcnMgYXMgd2VsbC4KKwkqIGdzdC92aWRlb21peGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvbWl4ZXIvUkVBRE1FOgorCSogZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlci5jOiAoZ3N0X3ZpZGVvbWl4ZXJfcGFkX2dldF90eXBlKSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfcGFkX2Jhc2VfaW5pdCksIChnc3RfdmlkZW9taXhlcl9wYWRfY2xhc3NfaW5pdCksCisJKGdzdF92aWRlb21peGVyX3BhZF9nZXRfc2lua19ldmVudF9tYXNrcyksCisJKGdzdF92aWRlb21peGVyX3BhZF9nZXRfcHJvcGVydHkpLAorCShnc3RfdmlkZW9taXhlcl9wYWRfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfcGFkX3Npbmtjb25uZWN0KSwgKGdzdF92aWRlb21peGVyX3BhZF9saW5rKSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfcGFkX3VubGluayksIChnc3RfdmlkZW9taXhlcl9wYWRfaW5pdCksCisJKGdzdF92aWRlb19taXhlcl9iYWNrZ3JvdW5kX2dldF90eXBlKSwgKGdzdF92aWRlb21peGVyX2dldF90eXBlKSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfYmFzZV9pbml0KSwgKGdzdF92aWRlb21peGVyX2NsYXNzX2luaXQpLAorCShnc3RfdmlkZW9taXhlcl9pbml0KSwgKGdzdF92aWRlb21peGVyX3JlcXVlc3RfbmV3X3BhZCksCisJKGdzdF92aWRlb21peGVyX2hhbmRsZV9zcmNfZXZlbnQpLAorCShnc3RfdmlkZW9taXhlcl9ibGVuZF9heXV2X2k0MjApLCAoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9jaGVja2VyKSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfZmlsbF9jb2xvciksIChnc3RfdmlkZW9taXhlcl9maWxsX3F1ZXVlcyksCisJKGdzdF92aWRlb21peGVyX2JsZW5kX2J1ZmZlcnMpLCAoZ3N0X3ZpZGVvbWl4ZXJfdXBkYXRlX3F1ZXVlcyksCisJKGdzdF92aWRlb21peGVyX2xvb3ApLCAoZ3N0X3ZpZGVvbWl4ZXJfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3ZpZGVvbWl4ZXJfc2V0X3Byb3BlcnR5KSwgKGdzdF92aWRlb21peGVyX2NoYW5nZV9zdGF0ZSksCisJKHBsdWdpbl9pbml0KToKKwlHZW5lcmljIHZpZGVvIG1peGVyIHBsdWdpbiwgY2FuIGhhbmRsZSBtdWx0aXBsZSBpbnB1dHMgYWxsIHdpdGgKKwlkaWZmZXJlbnQgZnJhbWVyYXRlcyBhbmQgdmlkZW8gc2l6ZXMuIElzIGZ1bGx5IGFscGhhIGNoYW5uZWwKKwlhd2FyZS4KKworMjAwNC0wNS0yNyAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVyLmM6IChnc3RfYWxzYV9taXhlcl9idWlsZF9saXN0KToKKwkgIFNlbGVjdCBmaXJzdCB0cmFjayBhcyBtYXN0ZXIgdHJhY2suIE5vdCBzdXJlIGhvdyBlbHNlIHRvIGhhbmRsZQorCSAgdGhhdC4uLgorCSogZXh0L29nZy9nc3RvZ2dtdXguYzogKGdzdF9vZ2dfbXV4X25leHRfYnVmZmVyKToKKwkgIERpc2NhcmQgZGlzY29udCBldmVudHMuIFNob3VsZCBmaXggIzE0Mjk2Mi4KKworMjAwNC0wNS0yNiAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvTWFrZWZpbGUuYW06CisJKiBleHQvYWxzYS9nc3RhbHNhbWl4ZXIuYzogKGdzdF9hbHNhX21peGVyX2ludGVyZmFjZV9pbml0KSwKKwkoZ3N0X2Fsc2FfbWl4ZXJfYnVpbGRfbGlzdCksIChnc3RfYWxzYV9taXhlcl9nZXRfdm9sdW1lKSwKKwkoZ3N0X2Fsc2FfbWl4ZXJfc2V0X3ZvbHVtZSksIChnc3RfYWxzYV9taXhlcl9zZXRfbXV0ZSksCisJKGdzdF9hbHNhX21peGVyX3NldF9yZWNvcmQpLCAoZ3N0X2Fsc2FfbWl4ZXJfc2V0X29wdGlvbiksCisJKGdzdF9hbHNhX21peGVyX2dldF9vcHRpb24pOgorCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVyLmg6CisJKiBleHQvYWxzYS9nc3RhbHNhbWl4ZXJvcHRpb25zLmM6CisJKGdzdF9hbHNhX21peGVyX29wdGlvbnNfZ2V0X3R5cGUpLAorCShnc3RfYWxzYV9taXhlcl9vcHRpb25zX2NsYXNzX2luaXQpLCAoZ3N0X2Fsc2FfbWl4ZXJfb3B0aW9uc19pbml0KSwKKwkoZ3N0X2Fsc2FfbWl4ZXJfb3B0aW9uc19uZXcpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVyb3B0aW9ucy5oOgorCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVydHJhY2suYzogKGdzdF9hbHNhX21peGVyX3RyYWNrX25ldyk6CisJKiBleHQvYWxzYS9nc3RhbHNhbWl4ZXJ0cmFjay5oOgorCSAgQWRkIGVudW1lcmF0aW9ucyAoYXMgR3N0TWl4ZXJPcHRpb25zKS4gTWFrZSBjb3JyZWN0IGRpc3RpbmN0aW9uCisJICBiZXR3ZWVuIGlucHV0L291dHB1dCB0cmFja3MuIEFkZCBjYXB0dXJlL3BsYXliYWNrIHByaXZhdGUgZmxhZy4KKwkgIFVzZSBmbGFnIHRvIGRlY2lkZSBvbiB3aGV0aGVyIHRvIHNldCBjYXB0dXJlIG9yIHBsYXliYWNrIHZvbHVtZXMKKwkgIG9yIHN3aXRjaGVzLiBVc2UgcGxheWJhY2sgYW5kIHJlY29yZCBzd2l0Y2hlcy4KKwkqIGdzdC1saWJzL2dzdC9taXhlci9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlci1tYXJzaGFsLmxpc3Q6CisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvbWl4ZXIuYzogKGdzdF9taXhlcl9jbGFzc19pbml0KSwKKwkoZ3N0X21peGVyX3NldF9vcHRpb24pLCAoZ3N0X21peGVyX2dldF9vcHRpb24pLAorCShnc3RfbWl4ZXJfbXV0ZV90b2dnbGVkKSwgKGdzdF9taXhlcl9yZWNvcmRfdG9nZ2xlZCksCisJKGdzdF9taXhlcl92b2x1bWVfY2hhbmdlZCksIChnc3RfbWl4ZXJfb3B0aW9uX2NoYW5nZWQpOgorCSogZ3N0LWxpYnMvZ3N0L21peGVyL21peGVyLmg6CisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvbWl4ZXJvcHRpb25zLmM6IChnc3RfbWl4ZXJfb3B0aW9uc19nZXRfdHlwZSksCisJKGdzdF9taXhlcl9vcHRpb25zX2NsYXNzX2luaXQpLCAoZ3N0X21peGVyX29wdGlvbnNfaW5pdCksCisJKGdzdF9taXhlcl9vcHRpb25zX2Rpc3Bvc2UpOgorCSogZ3N0LWxpYnMvZ3N0L21peGVyL21peGVyb3B0aW9ucy5oOgorCSAgQWRkIEdzdE1peGVyT3B0aW9ucy4KKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiAoZ3N0X29zc2VsZW1lbnRfY2xhc3NfcHJvYmVfZGV2aWNlcyk6CisJICBSZW5hbWUgQXVkaW8gTWl4ZXIgdG8gT1NTIE1peGVyIChzaW1pbGFyIHRvIEFsc2EgTWl4ZXIpLiBGaXgKKwkgIGJyb2tlbiBkZXZpY2UgZGV0ZWN0aW9uIG9uIGNvbXB1dGVycyB3aXRoIG11bHRpcGxlIE9TUyBzb3VuZAorCSAgY2FyZHMuCisKKzIwMDQtMDUtMjYgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKGdzdF9hdWRpb19jb252ZXJ0X2ZpeGF0ZSk6CisJICBmaXhhdGUgbmljZWx5IGV2ZW4gd2hlbiB0aGUgcGVlciBpcyBub3QgbmVnb3RpYXRpbmcKKworMjAwNC0wNS0yNSAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOgorCShnc3RfYXVkaW9fY29udmVydF9wYXJzZV9jYXBzKToKKwkgIG1ha2Ugc3VyZSB3ZSBkb24ndCBhbGxvdyBkZXB0aCA+IHdpZHRoCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiAoZ3N0X2F1ZGlvX2NvbnZlcnRfZml4YXRlKToKKwkgIGZpeGF0ZSBlbmRpYW5uZXNzIHRvIEdfQllURV9PUkRFUiBhcyBkZWZhdWx0CisJKiBnc3QvYXVkaW9zY2FsZS9nc3RhdWRpb3NjYWxlLmM6CisJICB3ZSBkb24ndCBoYW5kbGUgYW5vdGhlciBlbmRpYW5uZXNzIGFzIGhvc3QtZW5kaWFubmVzcworCisyMDA0LTA1LTI1ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL21lbS5jOiAgbWFsbG9jKCkgaXMgaW4gc3RkbGliLmgsIG5vdCBtYWxsb2MuaAorCisyMDA0LTA1LTI0ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC92b3JiaXMvb2dndm9yYmlzZW5jLmM6IChnc3Rfb2dndm9yYmlzZW5jX3Npbmtjb25uZWN0KSwKKwkoZ3N0X29nZ3ZvcmJpc2VuY19zZXR1cCk6CisJICBwcm9wZXJseSBmYWlsIHdoZW4gd2UgY2FuJ3Qgc2V0dXAgdGhlIHZvcmJpcyBlbmNvZGVyIGR1ZSB0bworCSAgdW5zdXBwb3J0ZWQgc2V0dGluZ3MKKwkqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmM6IChnc3Rfdm9yYmlzZW5jX3Npbmtjb25uZWN0KSwKKwkoZ3N0X3ZvcmJpc2VuY19zZXR1cCk6CisJICBzYW1lCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiAoZ3N0X2F1ZGlvX2NvbnZlcnRfbGluayk6CisJICBmaXggY2FzZSB3aGVyZSB3YXJuaW5ncyBvY2N1cmVkIHdoZW4gb25lIHBhZCB3YXMgdW5saW5rZWQgd2hpbGUgdGhlCisJICBvdGhlcidzIGxpbmsgZnVuY3Rpb24gd2FzIGNhbGxlZAorCisyMDA0LTA1LTI0ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvdGNwL01ha2VmaWxlLmFtOgorICAgICAgICAgIHVzZSBHU1RfRU5BQkxFX05FVworCisyMDA0LTA1LTI0ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC1saWJzL2dzdC9yZXNhbXBsZS9wcml2YXRlLmg6CisJICBkb24ndCB1c2Ugb3B0aW1pemF0aW9ucyB0aGF0IGFyZSAjaWYgMCdlZAorCisyMDA0LTA1LTI0ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KToKKwlGaXggcG90ZW50aWFsIGRpdmlzaW9uIGJ5IHplcm8gZXJyb3IgYW5kIGhvcGVmdWxseSBnZXQKKwl0aGUgcG9zaXRpb24gcXVlcnkgcmlnaHQgdG8gZ2V0IGNvcnJlY3QgdGltZXN0YW1wcyBvbiBhdmkKKwlhdWRpby4KKworMjAwNC0wNS0yNCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC92aWRlb3NjYWxlL3ZpZGVvc2NhbGUuYzogKGdzdF92aWRlb3NjYWxlX3NjYWxlX25lYXJlc3QpLAorCShnc3RfdmlkZW9zY2FsZV9zY2FsZV9uZWFyZXN0X3N0cjIpLAorCShnc3RfdmlkZW9zY2FsZV9zY2FsZV9uZWFyZXN0X3N0cjQpLAorCShnc3RfdmlkZW9zY2FsZV9zY2FsZV9uZWFyZXN0XzMyYml0KSwKKwkoZ3N0X3ZpZGVvc2NhbGVfc2NhbGVfbmVhcmVzdF8yNGJpdCksCisJKGdzdF92aWRlb3NjYWxlX3NjYWxlX25lYXJlc3RfMTZiaXQpOgorCUZpeCB0aGUgc2NhbGluZyBhbGdvcml0aG0gYW5kIGF2b2lkIGEgYnVmZmVyIG92ZXJmbG93LgorICAgICAgICByZW1vdmVkIHRoZSB3aGlsZSBsb29wIGluIHRoZSBzY2FsaW5nIGZ1bmN0aW9uIGFzIGl0CisJd2FzIHVzZWQgZm9yIHBvaW50IHNhbXBsaW5nIG9ubHkuCisKKzIwMDQtMDUtMjQgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX2dldF90eXBlKSwKKwkoZ3N0X2lkM190YWdfY2xhc3NfaW5pdCksIChnc3RfaWQzX3RhZ19pbml0KSwKKwkoZ3N0X2lkM190YWdfc2V0X3Byb3BlcnR5KSwgKGdzdF9pZDNfdGFnX2dldF90YWdfdG9fcmVuZGVyKSwKKwkoZ3N0X2lkM190YWdfaGFuZGxlX2V2ZW50KSwgKGdzdF9pZDNfdGFnX2RvX2NhcHNfbmVnbyksCisJKGdzdF9pZDNfdGFnX3NlbmRfdGFnX2V2ZW50KToKKwkgIGxvdHMgb2YgZml4ZXMgdG8gbWFrZSBpZDNtdXggd29yayBhbmQgaWQzZGVtdXggd29yayBjb3JyZWN0bHkKKworMjAwNC0wNS0yNCAgU3RlcGhhbmUgTG9ldWlsbGV0IDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZXh0L01ha2VmaWxlLmFtOgorCSAgYWRkIHJ1bGVzIHRvIGJ1aWxkIHNob3V0MnNlbmQgKHdhcyByZW1vdmVkIGJ5IGFjY2lkZW50CisJICB3aGVuIHRoaXMgbW9kdWxlIHdhcyBubyBtb3JlIG1hcmtlZCBleHBlcmltZW50YWwvYnJva2VuKQorCisyMDA0LTA1LTI0ICBaYWhlZXIgQWJiYXMgTWVyYWxpICA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6CisJKiBleHQvc2hvdXQyL2dzdHNob3V0Mi5oOgorCSAgYWRkaW5nIGEgImNvbm5lY3Rpb24gcHJvYmxlbSIgc2lnbmFsIHRvIHNob3V0MnNlbmQKKwkgIChmaXhlcyAjMTQyOTU0KQorCisyMDA0LTA1LTIxICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQva2lvL2tpb3JlY2VpdmVyLmNwcDoKKwkqIGV4dC9raW8va2lvcmVjZWl2ZXIuaDoKKyAgICAgICAgICBmaXggc2lnbiBjb21wYXJpc29uIGlzc3VlcworCisyMDA0LTA1LTIxICBTdGVwaGFuZSBMb2V1aWxsZXQgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBnc3QvY2R4YXBhcnNlL2dzdGNkeGFwYXJzZS5jOgorCSogZ3N0L2NkeGFwYXJzZS9nc3RjZHhhcGFyc2UuaDoKKwkgIHNvbWUgcmVuYW1pbmcKKwkgIGFkZCBzb21lIGNoZWNrcy9zYW5pdHkKKwkgIHByZXBhcmUgZm9yIHNlZWsgYWRkaXRpb24KKworCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvLmM6CisJICByZW1vdmUgZXhwb3J0ZWQgZHVwZSBpbml0IGZ1bmN0aW9uCisKKzIwMDQtMDUtMjEgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfaW5pdCksIChnc3RfZHZkZWNfZ2V0X2Zvcm1hdHMpLAorCShnc3RfZHZkZWNfc3JjX2NvbnZlcnQpLCAoZ3N0X2R2ZGVjX3NpbmtfY29udmVydCk6CisJICBGaXggZm9ybWF0IGNvbnZlcnNpb24gYW5kIHBvc2l0aW9uIHF1ZXJ5aW5nLgorCSogZ3N0L2RlYnVnL3Byb2dyZXNzcmVwb3J0LmM6IChnc3RfcHJvZ3Jlc3NyZXBvcnRfcmVwb3J0KToKKwkgIERvbid0IG91dHB1dCBhIGJvZ3VzIHRvdGFsIHZhbHVlIHRoYXQgd2UgZGlkbid0IHF1ZXJ5LgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19nZXRfeHZfc3VwcG9ydCk6CisJICBBbHdheXMgc2V0IFhWX0FVVE9QQUlOVF9DT0xPUktFWSB0byB0cnVlLiBGaXhlcyB4dmltYWdlc2luayBzaG93aW5nCisJICBvbmx5IGEgYmxhbmsgd2luZG93IGFmdGVyIHhpbmUgaGFzIGJlZW4gdXNlZC4KKworMjAwNC0wNS0yMSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyAoYXQpIGFwZXN0YWFydCAoZG90KSBvcmc+CisKKwkqIG00L2FzLWFydHMubTQ6CisJICBzeW5jIHdpdGggdXBzdHJlYW0gdmVyc2lvbiB0byBmaXggdGVzdCBvbiBGQzIKKwkgIHJlYWRkIHdpdGggLWtvIHRvIHByZXNlcnZlIElkIGhlYWRlcgorCisyMDA0LTA1LTIwICBTdGVwaGFuZSBMb2V1aWxsZXQgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBjb25maWd1cmUuYWM6CisJICB0ZXN0IGZvciBGSU9OUkVBRCBpb2N0bCBpbiBzeXMvZmlsaW8uaCBmb3IgU29sYXJpcyBjb21wYXQuCisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNyYy5jOiBpZGVtCisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNpbmsuYzogaWRlbQorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzcmMuYzogaWRlbQorCSogbTQvZ3N0LWZpb25yZWFkLm00OiBpZGVtCisKKwkqIHN5cy9zdW5hdWRpby9nc3RzdW5hdWRpby5jOiBjaGFuZ2UgY2F0ZWdvcnkgdG8gU2luay9BdWRpbworCisJKiBjb25maWd1cmUuYWM6IGVuYWJsZSBzcGVleCBwbHVnaW4gZm9yIHNwZWV4IDEuMS41KworCSogZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmM6IGZpeCBjYXN0IHdhcm5pbmcKKworCSogZXh0L2VzZC9SRUFETUU6IGZpeCB0eXBvCisKKzIwMDQtMDUtMjAgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29uZmlndXJlLmFjOiBNaW5vciBjb3NtZXRpYyBjaGFuZ2UgdG8gY29udmluY2UgdGhlIGJ1aWxkYm90IHRvCisJcmVhdXRvZ2VuLgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvLmM6IChnc3Rfc3VuYXVkaW9zaW5rX2NsYXNzX2luaXQpLAorCShnc3Rfc3VuYXVkaW9zaW5rX2luaXQpLCAoZ3N0X3N1bmF1ZGlvc2lua19nZXRjYXBzKSwKKwkoZ3N0X3N1bmF1ZGlvc2lua19wYWRfbGluayksIChnc3Rfc3VuYXVkaW9zaW5rX2NoYWluKSwKKwkoZ3N0X3N1bmF1ZGlvc2lua19zZXRwYXJhbXMpLCAoZ3N0X3N1bmF1ZGlvc2lua19vcGVuKSwKKwkoZ3N0X3N1bmF1ZGlvc2lua19jbG9zZSksIChnc3Rfc3VuYXVkaW9zaW5rX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9zdW5hdWRpb3Npbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF9zdW5hdWRpb3NpbmtfZ2V0X3Byb3BlcnR5KToKKwlNb3JlIGhhY2tpbmcuICBQbGF5cyBhdWRpbyBub3cuCisKKzIwMDQtMDUtMjAgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSogc3lzL01ha2VmaWxlLmFtOgorCisyMDA0LTA1LTIwICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIHN5cy9vc3hhdWRpby9NYWtlZmlsZS5hbTogIE5ldyBPUyBYIGF1ZGlvIHBsdWdpbiBieSBaYWhlZXIgQWJiYXMgTWVyYWxpCisJKiBzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW8uYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYzoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuaDoKKwkqIHN5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jOgorCSogc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmg6CisKKzIwMDQtMDUtMjAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmM6IChnc3Rfdm9yYmlzZW5jX3NldF9oZWFkZXJfb25fY2FwcyksCisJKGdzdF92b3JiaXNlbmNfY2hhaW4pOgorICAgICAgICAgIHB1dCB0aGUgY29kZWMgaGVhZGVycyBvbiB0aGUgY2FwcyBhcyBzdHJlYW1oZWFkZXIgYXMgd2VsbCBhcworICAgICAgICAgIHB1c2hpbmcgdGhlbSBvdXQKKworMjAwNC0wNS0yMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L3ZvcmJpcy92b3JiaXNlbmMuYzogKHZvcmJpc19ncmFudWxlX3RpbWVfY29weSksCisJKGdzdF92b3JiaXNlbmNfYnVmZmVyX2Zyb21fcGFja2V0KSwgKGdzdF92b3JiaXNlbmNfcHVzaF9idWZmZXIpLAorCShnc3Rfdm9yYmlzZW5jX3B1c2hfcGFja2V0KSwgKGdzdF92b3JiaXNlbmNfY2hhaW4pOgorICAgICAgICBzcGxpdCB1cCBwdXNoX3BhY2tldCBpbnRvIHR3byBmdW5jdGlvbnMKKworMjAwNC0wNS0yMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L3RjcC8uY3ZzaWdub3JlOgorCSAgaWdub3JlIGVudW1zCisJKiBnc3QvdGNwL01ha2VmaWxlLmFtOgorCSogZ3N0L3RjcC9SRUFETUU6CisJKiBnc3QvdGNwL2dzdHRjcC5jOgorCSogZ3N0L3RjcC9nc3R0Y3AuaDoKKwkqIGdzdC90Y3AvZ3N0dGNwY2xpZW50c2luay5jOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzaW5rLmg6CisJKiBnc3QvdGNwL2dzdHRjcGNsaWVudHNyYy5jOgorCSogZ3N0L3RjcC9nc3R0Y3BjbGllbnRzcmMuaDoKKwkqIGdzdC90Y3AvZ3N0dGNwcGx1Z2luLmM6CisJKiBnc3QvdGNwL2dzdHRjcHNlcnZlcnNpbmsuYzoKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc2luay5oOgorCSogZ3N0L3RjcC9nc3R0Y3BzZXJ2ZXJzcmMuYzoKKwkqIGdzdC90Y3AvZ3N0dGNwc2VydmVyc3JjLmg6CisgICAgICAgICAgYWRkIG5ldyB0Y3AgZWxlbWVudHMKKworMjAwNC0wNS0xOSAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGdzdC9sYXcvbXVsYXctY29udmVyc2lvbi5jOiAobXVsYXdfZW5jb2RlKToKKwlGaXggb3ZlcmZsb3cgYnVnIGluIHVsYXcgZW5jb2RpbmcuCisKKzIwMDQtMDUtMTkgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfaGFuZGxlX2V2ZW50KToKKwkgIGRvbid0IHVucmVmIHRoZSBldmVudCB0d2ljZQorCisyMDA0LTA1LTE5ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIHJlbW92ZSAtV25vLXNpZ24tY29tcGFyZQorCisyMDA0LTA1LTE5ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIHJlbW92ZSAtREdfRElTQUJMRV9ERVBSRUNBVEVELiBJdCdzIG5vdCB1c2FibGUgd2l0aG91dCB3b3JrYXJvdW5kcworCSAgaWYgeW91IHdhbnQgdG8gd29yayBhZ2FpbnN0IGdsaWIgMi4yIGFuZCAyLjQKKworMjAwNC0wNS0xOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L3RjcC9NYWtlZmlsZS5hbToKKwkqIGdzdC90Y3AvZ3N0dGNwLmM6CisJKiBnc3QvdGNwL2dzdHRjcC5oOgorCSogZ3N0L3RjcC9nc3R0Y3BzaW5rLmg6CisJKiBnc3QvdGNwL2dzdHRjcHNyYy5oOgorICAgICAgICAgIGdzdHRjcCAtPiBnc3R0Y3BwbHVnaW4gKyBDVlMgc3VyZ2VyeSBpbiBwcmVwYXJhdGlvbiBmb3IgdGNwIG1lcmdlCisKKzIwMDQtMDUtMTkgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0L2RlYnVnL3Rlc3RzLmM6IChtZDVfZ2V0X3ZhbHVlKToKKwkgIGZpeCBzZWdmYXVsdCBvbiBnc3QtaW5zcGVjdAorCisyMDA0LTA1LTE5ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC9kZWJ1Zy90ZXN0cGx1Z2luLmM6CisJKiBnc3QvZGVidWcvdGVzdHMuYzoKKwkqIGdzdC9kZWJ1Zy90ZXN0cy5oOgorCSAgYWRkIG5ldyBleHRlbnNpYmxlIGFuZCBjb25maWd1cmFibGUgdGVzdGluZyBlbGVtZW50LiBDdXJyZW50IHRlc3RzCisJICBpbmNsdWRlIGJ1ZmZlciBjb3VudCwgc3RyZWFtIGxlbmd0aCwgdGltZXN0YW1wL2R1cmF0aW9uIG1hdGNoaW5nIGFuZAorCSAgbWQ1LgorCSogZ3N0L2RlYnVnL01ha2VmaWxlLmFtOgorCSogZ3N0L2RlYnVnL2dzdGRlYnVnLmM6IChwbHVnaW5faW5pdCk6CisJICBhZGQgaW5mcmFzdHJ1Y3R1cmUgZm9yIG5ldyBlbGVtZW50CisKKzIwMDQtMDUtMTkgIEpvaGFuIERhaGxpbiAgPGpvaGFuQGdub21lLm9yZz4KKworCSogZXh0L2R2L2dzdGR2ZGVjLmMgKGdzdF9kdmRlY19xdWFsaXR5X2dldF90eXBlKTogQWRkIHByb3BlcgorCWVuZGluZyBvZiB0aGUgYXJyYXkuIEZpeGVzIGdzdC1pbnNwZWN0IHNlZ2ZhdWx0IG9uIHBwYy4KKworMjAwNC0wNS0xOSAgU3RlcGhhbmUgTG9ldWlsbGV0IDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZXh0L2RpcmFjL2dzdGRpcmFjZGVjLmNjIDogY2hhbmdlIGNhdGVnb3J5IHRvIENvZGVjL0RlY29kZXIvVmlkZW8KKworCSogbTQvYTUyLm00IDogZG9uJ3QgZml4IGEgdGVzdCB0aGF0IHNob3VsZCBmYWlsIHdpdGggY3VycmVudCBhNTJkZWMgbGliCisKKzIwMDQtMDUtMTggIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvaW1nY29udmVydC5jOiAoaW1nX2NvbnZlcnQpOiBGaXhlcyBmb3IKKwl3YXJuaW5ncyAoYnVncywgYWN0dWFsbHkpIG5vdGljZWQgYnkgZ2NjIGJ1dCBub3QgZm9ydGUuCisKKzIwMDQtMDUtMTggIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogc3lzL3N1bmF1ZGlvL01ha2VmaWxlLmFtOgorCSogc3lzL3N1bmF1ZGlvL2dzdHN1bmF1ZGlvLmM6IE5ldyBzdW5hdWRpb3NpbmsKKworMjAwNC0wNS0xOCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9jaGFuZ2Vfc3RhdGUpLAorCShnc3RfcXRkZW11eF9sb29wX2hlYWRlcik6ICBQYXRjaCBmcm9tIGRjbUBhY20ub3JnIChEYXZpZCBNb29yZSkKKwl0byBhbGxvdyBxdGRlbXV4IHRvIHVzZSBub24tc2Vla2FibGUgc3RyZWFtcy4gKGJ1ZyAjMTQyMjcyKQorCisyMDA0LTA1LTE4ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC1saWJzL2dzdC9yZXNhbXBsZS9yZXNhbXBsZS5jOiAoZ3N0X3Jlc2FtcGxlX3NpbmNfZnRfczE2KSwKKwkoZ3N0X3Jlc2FtcGxlX3NpbmNfZnRfZmxvYXQpOiBSZW1vdmUgdXNlIG9mIHN0YXRpYyB0ZW1wb3JhcnkKKwlidWZmZXIuICBUaGlzIGNvZGUgd2FzIG9idmlvdXNseSBub3Qgc3VwcG9zZWQgdG8gbGFzdCBsb25nLCBidXQKKwlpdCdzIHN0dWNrIGluIG91ciBBQkksIHNvIGl0IHJlcXVpcmVkIGEgbGl0dGxlIGhhY2sgdG8gbWFrZSBpdAorCUFCSS1jb21wYXRpYmxlLiAgRml4ZXMgIzE0MjU4NS4KKwkqIGdzdC1saWJzL2dzdC9yZXNhbXBsZS9yZXNhbXBsZS5oOiBzYW1lLgorCisyMDA0LTA1LTE4ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogQWRkIHN1bmF1ZGlvCisJKiBleGFtcGxlcy9NYWtlZmlsZS5hbTogbWFrZSBnc3RwbGF5IGRlcGVuZCBvbiBnY29uZgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29kZWNtYXAuYzogUmVtb3ZlIGM5OS1pc21zCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9pbWdjb252ZXJ0LmM6IChidWlsZF9yZ2JfcGFsZXR0ZSksCisJKGNvbnZlcnRfdGFibGVfbG9va3VwKSwgKGltZ19jb252ZXJ0KTogcmVtb3ZlIGM5OS1pc21zCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9pbWdjb252ZXJ0X3RlbXBsYXRlLmg6IG1ha2UgYSBjb25zdGFudAorICAgICAgICAgIHVuc2lnbmVkLCB0byBmaXggYSB3YXJuaW5nIG9uIFNvbGFyaXMKKwkqIGdzdC9tcGVnMXN5cy9zeXN0ZW1zLmM6IGJjb3B5LT5tZW1jcHkKKwkqIGdzdC9ydGpwZWcvUlRqcGVnLmM6IChSVGpwZWdfeXV2cmdiOCk6IGJjb3B5LT5tZW1jcHkKKwkqIHN5cy9NYWtlZmlsZS5hbTogQWRkIHN1bmF1ZGlvCisKKzIwMDQtMDUtMTggIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvb2dnL2dzdG9nZ211eC5jOiAoZ3N0X29nZ19tdXhfZ2V0X3R5cGUpLCAoZ3N0X29nZ19tdXhfaW5pdCksCisJKGdzdF9vZ2dfbXV4X3Npbmtjb25uZWN0KSwgKGdzdF9vZ2dfbXV4X3JlcXVlc3RfbmV3X3BhZCksCisJKGdzdF9vZ2dfbXV4X25leHRfYnVmZmVyKSwgKGdzdF9vZ2dfbXV4X3B1c2hfcGFnZSksCisJKGdzdF9vZ2dfbXV4X2NvbXBhcmVfcGFkcyksIChnc3Rfb2dnX211eF9xdWV1ZV9wYWRzKSwKKwkoZ3N0X29nZ19tdXhfbG9vcCk6CisJRml4IGFuIHVnbHkgbWVtbGVhayB3aGVyZSB0aGUgbXV4ZXIgZGlkbid0IGZsdXNoIGVub3VnaCBvZ2cKKwlwYWdlcy4gVGhpcyBhbHNvIHJlc3VsdGVkIGluIGJhZGx5IG11eGVkIG9nZyBmaWxlcy4KKworMjAwNC0wNS0xOCAgU3RlcGhhbmUgTG9ldWlsbGV0IDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZ3N0L2FzZmRlbXV4L2FzZmhlYWRlcnMuYyA6CisJKiBnc3QvYXNmZGVtdXgvYXNmaGVhZGVycy5oIDoKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jIDoKKwkgIC0gZml4IEFTRl9PQkpfUEFERElORyBndWlkCisJICAtIGFkZCAzIG5ldyBvYmplY3QgZ3VpZHMgKGxhbmd1YWdlIGxpc3QsIG1ldGFkYXRhLAorICAgICAgICAgICAgZXh0ZW5kZWQgc3RyZWFtIHByb3BlcnRpZXMpCisgICAgICAgICAgLSBhZGQgYSBmdW5jdGlvbiB0byBwYXJzZSBleHRlbmRlZCBoZWFkZXIgb2JqZWN0cworCisyMDA0LTA1LTE4ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiAoZ3N0X29zc2VsZW1lbnRfc3luY19wYXJtcyk6CisJICByZW1vdmUgbGVmdG92ZXIgZGVidWdnaW5nIGdfcHJpbnQKKworMjAwNC0wNS0xNyAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfaGFuZGxlX2V2ZW50KToKKwkgIEZpeCBmb3Igd2hlbiB0aGUgZmlyc3QgZm9ybWF0IGluIGEgZGlzY29udCBldmVudCBpcyBub3QgYQorCSAgYnl0ZS1iYXNlZCBvbmUuIFNob3VsZCBmaXggIzEzNzcxMC4KKworMjAwNC0wNS0xOCAgU3RlcGhhbmUgTG9ldWlsbGV0IDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogbTQvYTUyLm00IDogZml4IGNvbXBpbGF0aW9uIHdpdGggLVdhbGwgLVdlcnJvcgorCSogbTQvbGliZmFtZS5tNCA6IGlkZW0KKwkqIG00L2xpYm1pa21vZC5tNCA6IGlkZW0KKworMjAwNC0wNS0xNyAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19jb21tZW50KToKKwkgIHNpZ25hbCB0aGUgbmV3IHRhZ3MgYmVmb3JlIGdpdmluZyB1cCB0aGUgcmVmZXJlbmNlCisKKzIwMDQtMDUtMTcgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuYzoKKwkgIHVzZSBhcHBsaWNhdGlvbi9vZ2cgaW5zdGVhZCBvZiBhcHBsaWNhdGlvbi94LW9nZyAocGF0Y2ggYnkgUGF0cmljaworCSAgR3VpbW9uZCwgZml4ZXMgIzE0MjQzMikKKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiAoZ3N0X29zc2VsZW1lbnRfcmVzZXQpLAorCShnc3Rfb3NzZWxlbWVudF9zeW5jX3Bhcm1zKToKKwkgIGRvbid0IHNldCBmcmFnbWVudCBzaXplIHVubGVzcyBzcGVjaWZpZWQgKGZpeGVzICMxNDI0OTMpCisKKzIwMDQtMDUtMTcgIFN0ZXBoYW5lIExvZXVpbGxldCA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGNvbmZpZ3VyZS5hYyA6IGZpeCBjb21waWxhdGlvbiBvZiB2NGwyc3JjIHdpdGggIi1XYWxsIC1XZXJyb3IiCisJICBmaXhlcyAjMTQyNjY0CisKKzIwMDQtMDUtMTcgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX2NoYWluKToKKwkgIGNvbXB1dGUgb2Zmc2V0cyBjb3JyZWN0bHkgZm9yIGludGVybmFsIGJ1ZmZlcnMgc28gdGltZXN0YW1wcyBhcmUgc2V0CisJICBjb3JyZWN0bHkgd2hlbiB3ZSBjYW4ndCBzZWVrLiBBbHNvIGhhbmRsZSBjYXNlcyB3aGVyZSB0aGVyZSBhcmUgbm8KKwkgIG9mZnNldHMuIChiYXNlZCBvbiBhIHBhdGNoIGJ5IERhdmlkIE1vb3JlLCBmaXhlcyAjMTQyNTA3KQorCisyMDA0LTA1LTE3ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2xvb3ApOgorCSAgdXNlIGNvcnJlY3QgdmFyaWFibGUgd2hlbiBkZXRlcm1pbmluZyBhbW91bnQgb2YgZGF0YSB0byBza2lwIHNvIHdlCisJICBkb24ndCBza2lwIGludG8gdGhlIHZvaWQgYW5kIHNlZ2ZhdWx0CisKKzIwMDQtMDUtMTYgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X2F1ZGlvX2NhcHMpOgorCSAgSGksIEknbSBhIG1lbWxlYWsKKworMjAwNC0wNS0xNiAgU3RlcGhhbmUgTG9ldWlsbGV0IDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6CisJICAtIGZpeCBhIG1lbSBsZWFrIGFuZCBhbHdheXMgcHJvcGFnYXRlIHRhZ3MKKwkgIC0gYWRkIFdNVjMgdG8ga25vd24gdmlkZW8gY29kZWNzIChidXQgbm8gZGVjb2RlciB5ZXQpCisJICAtIHJlcGxhY2UgInN1cnBsdXMgZGF0YSIgYXQgZW5kIG9mIGF1ZGlvIGhlYWRlciBmb3Igd2hhdAorCSAgICBpdCBpcyA6IGNvZGVjIHNwZWNpZmljIGRhdGEKKwkgIC0gZml4IGEgdHlwbworCisyMDA0LTA1LTE2ICBBcndlZCB2LiBNZXJrYXR6ICA8di5tZXJrYXR6QGdteC5uZXQ+CisKKwlyZXZpZXdlZCBieTogUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2F1ZGlvY2xvY2suYzoKKwkgIEZpeCB3cm9uZyByZXR1cm4gdHlwZSAoIzE0MjIwNSkuCisKKzIwMDQtMDUtMTYgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2NsYXNzX2luaXQpLCAoZ3N0X21hZF9pbml0KToKKwkgIElnbm9yZSBDUkNzIGJ5IGRlZmF1bHQgKGZpeGVzICMxNDI1NjYpLgorCisyMDA0LTA1LTE2ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhbWl4ZXIuYzogKGdzdF9hbHNhX21peGVyX29wZW4pLAorCShnc3RfYWxzYV9taXhlcl9jbG9zZSksIChnc3RfYWxzYV9taXhlcl9zdXBwb3J0ZWQpLAorCShnc3RfYWxzYV9taXhlcl9idWlsZF9saXN0KSwgKGdzdF9hbHNhX21peGVyX2ZyZWVfbGlzdCksCisJKGdzdF9hbHNhX21peGVyX2NoYW5nZV9zdGF0ZSksIChnc3RfYWxzYV9taXhlcl9saXN0X3RyYWNrcyksCisJKGdzdF9hbHNhX21peGVyX2dldF92b2x1bWUpLCAoZ3N0X2Fsc2FfbWl4ZXJfc2V0X3ZvbHVtZSksCisJKGdzdF9hbHNhX21peGVyX3NldF9tdXRlKSwgKGdzdF9hbHNhX21peGVyX3NldF9yZWNvcmQpOgorCSAgRml4IGZvciBjYXNlcyB3aGVyZSB3ZSBmYWlsIHRvIGF0dGFjaCB0byBhIG1peGVyLgorCisyMDA0LTA1LTE2ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuYzogKGdzdF9yaWZmX3JlYWRfc2Vlayk6CisJICBEb24ndCB0b3VjaCBldmVudHMgYWZ0ZXIgbm90IG93bmluZyB0aGVtIGFueW1vcmUuCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9iYXNlX2luaXQpLAorCShnc3Rfd2F2cGFyc2VfZm10KSwgKGdzdF93YXZwYXJzZV9vdGhlciksCisJKGdzdF93YXZwYXJzZV9oYW5kbGVfc2VlayksIChnc3Rfd2F2cGFyc2VfbG9vcCksCisJKGdzdF93YXZwYXJzZV9wYWRfY29udmVydCksIChnc3Rfd2F2cGFyc2VfcGFkX3F1ZXJ5KSwKKwkoZ3N0X3dhdnBhcnNlX3NyY3BhZF9ldmVudCk6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwkgIEFkZCBzZWVraW5nLCBmaXggcXVlcnlpbmcuCisKKzIwMDQtMDUtMTYgIFN0ZXBoYW5lIExvZXVpbGxldCA8c3RlcGhhbmUubG9ldWlsbGV0QHRpc2NhbGkuZnI+CisKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX2NvbW1lbnQpOgorCSAgLSBwcm9jZXNzIGNvbW1lbnRzIGV2ZW4gaWYgdGhleSBkb24ndCBlbmQgd2l0aCBcMFwwCisgICAgICAgICAgICBnX2NvbnZlcnQgd291bGQgaWdub3JlIHRoZW0gaWYgcHJlc2VudCBhbmQgd29ya3Mgd2VsbCB3aXRob3V0IHRoZW0KKworMjAwNC0wNS0xNiAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9jYXBzKSwgKGdzdF9hbHNhX2dldF9jYXBzKToKKwkgIHNpbXBsaWZ5IGNhcHMKKworMjAwNC0wNS0xNiAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19jb21tZW50KToKKwkgIGRvbid0IHdyaXRlIHRvIG1lbW9yeSB3ZSBtaWdodCBub3Qgd3JpdGUgdG8gLSBnX2NvbnZlcnQgZG9lcyB0aGF0CisJICBmb3IgdXMgYW55d2F5IChmaXhlcyAjMTQyNjEzKQorCShnc3RfYXNmX2RlbXV4X2F1ZGlvX2NhcHMpOgorCSAgY29tbWVudCBvdXQgZ3N0X3V0aWxfZHVtcF9tZW0KKworMjAwNC0wNS0xNiAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jOiAoZ3N0X2Fsc2Ffc2lua19sb29wKToKKwkgIGNvbXB1dGUgY29ycmVjdCBleHBlY3RlZCB0aW1lc3RhbXBzIGFmdGVyIHNlZWsgKGJyb2tlbiBzaW5jZQorCSAgbGFzdCBjb21taXQpCisJKiBleHQvZ2RrX3BpeGJ1Zi9waXhidWZzY2FsZS5jOiAocGl4YnVmc2NhbGVfaW5pdCk6CisJICByZW5hbWUgZWxlbWVudCBhbmQgZGVidWdnaW5nIGNhdGVnb3J5IHRvIGdka3BpeGJ1ZnNjYWxlCisKKzIwMDQtMDUtMTYgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfbG9vcCk6CisJICBhZGQgZXJyb3IgY2hlY2tpbmcgdG8gc25kX3BjbV9kZWxheSBhbmQgcmVtb3ZlIGR1cGxpY2F0ZSBjYWxsIHRvCisJICBzbmRfcGNtX2RlbGF5IHRoYXQgY2F1c2VkIGlzc3VlcyAoc2VlIGlubGluZSBjb2RlIGNvbW1lbnRzKQorCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfZ2V0X3RpbWUpOgorCSAgbWFrZSBtb3JlIHJlYWRhYmxlIGFuZCBmaXggcmV0dXJuIHZhbHVlIHdoZW4gc25kX3BjbV9kZWxheSBmYWlscworCShmaXhlcyAjMTQyNTg2KQorCisyMDA0LTA1LTE1ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdGkuY29tPgorCSogZXh0L2dka19waXhidWYvcGl4YnVmc2NhbGUuYzogKGdzdF9waXhidWZzY2FsZV9tZXRob2RfZ2V0X3R5cGUpLAorCShnc3RfcGl4YnVmc2NhbGVfZ2V0X3R5cGUpLCAoZ3N0X3BpeGJ1ZnNjYWxlX2Jhc2VfaW5pdCksCisJKGdzdF9waXhidWZzY2FsZV9jbGFzc19pbml0KSwgKGdzdF9waXhidWZzY2FsZV9nZXRjYXBzKSwKKwkoZ3N0X3BpeGJ1ZnNjYWxlX2xpbmspLCAoZ3N0X3BpeGJ1ZnNjYWxlX2luaXQpLAorCShnc3RfcGl4YnVmc2NhbGVfaGFuZGxlX3NyY19ldmVudCksIChwaXhidWZzY2FsZV9zY2FsZSksCisJKGdzdF9waXhidWZzY2FsZV9jaGFpbiksIChnc3RfcGl4YnVmc2NhbGVfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3BpeGJ1ZnNjYWxlX2dldF9wcm9wZXJ0eSksIChwaXhidWZzY2FsZV9pbml0KToKKwkqIGV4dC9nZGtfcGl4YnVmL3BpeGJ1ZnNjYWxlLmg6CisJQWRkIHRoZXNlIGZpbGVzIEkgZm9yZ290IGVhcmxpZXIKKworMjAwNC0wNS0xNSAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCSogZXh0L2dka19waXhidWYvTWFrZWZpbGUuYW06CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5oOgorCUFkZCBuZXcgcGl4YnVmc2NhbGUgZWxlbWVudCB0byBzY2FsZSBSR0IgdmlkZW8KKwl1c2luZyBnZGtfcGl4YnVmLCBiZWNhdXNlIGdka19waXhidWYgZG9lcyBCSUxJTkVBUgorCWFuZCBIWVBFUiBpbnRlcnBvbGF0aW9uIGNvcnJlY3RseS4KKwkqIGV4dC90aGVvcmEvdGhlb3JhZW5jLmM6ICh0aGVvcmFfZW5jX2NoYWluKSwKKwlEaXNjYXJkIGJ1ZmZlciBhbmQgcmV0dXJuIGlmIGV4cGxpY2l0IGNhcHMgY291bGQgbm90IGJlIHNldAorCSh0aGVvcmFfZW5jX2dldF9wcm9wZXJ0eSk6CisJTWFrZSBfZ2V0IHJldHVybiBrYnBzIGZvciB0aGUgYml0cmF0ZSBjb25zaXN0ZW50IHdpdGgKKwl0aGUgX3NldCBmdW5jdGlvbi4KKworCisyMDA0LTA1LTE0ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9saWJ2aXN1YWwvdmlzdWFsLmM6IChnc3RfdmlzdWFsX2NoYWluKToKKwkgIGFkZCBtaXNzaW5nIHZpc3VhbF9hdWRpb19hbmFseXplCisKKzIwMDQtMDUtMTQgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2VzZC9lc2RzaW5rLmM6IChnc3RfZXNkc2lua19jaGFpbik6IEZpeCBjcmFzaCB3aGVuIEVTRAorCWlzIGtpbGxlZCB3aGlsZSB3ZSdyZSBwbGF5aW5nLgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZSk6IGNhbGwKKwlnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMoKS4KKworMjAwNC0wNS0xNCAgU3RlcGhhbmUgTG9ldWlsbGV0IDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmMgOgorCSAgLSBmaXggSU5GTyB0YWcgZXh0cmFjdGlvbiBpbiBSSUZGL0FWSSBmaWxlcworICAgICAgICAgICAgYmVjYXVzZSBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KSBhbHNvIGZyZWVkIHRhZ2xpc3QKKyAgICAgICAgICAtIGF2b2lkIGEgbWVtIGxlYWsKKworMjAwNC0wNS0xMyAgU3RlcGhhbmUgTG9ldWlsbGV0IDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYyA6IG1vdmUgZnJvbSAiQ29kZWMvKERlbS9NKXV4ZXIiIHRvICJDb2RlYy8oRGVtL00pdXhlci9BdWRpbyIKKwkqIGdzdC93YXZlbmMvZ3N0d2F2ZW5jLmMgOiBtb3ZlIGZyb20gIkNvZGVjL0VuY29kZXIvQXVkaW8iIHRvICJDb2RlYy9NdXhlci9BdWRpbyIKKworCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jIDoKKwkgIC0gYWRkIGNvZGUgKGNvbW1lbnRlZCBmb3Igbm93KSB0byBzdXBwb3J0IGF1ZGlvL3gtYWRwY20gb24gc3JjIHBhZAorCSAgICAod2UgaGF2ZSBubyBkZWNvZGVyIGZvciB0aG9zZSBsYXlvdXQgeWV0KQorCisJKiBnc3QvY2R4YXBhcnNlL2dzdGNkeGFwYXJzZS5jIDoKKwkqIGdzdC9jZHhhcGFyc2UvZ3N0Y2R4YXBhcnNlLmggOgorCSAgLSBwYXJ0aWFsIHJld3JpdGUgdXNpbmcgUmlmZlJlYWQgKHJpcHBlZCBpYWluJ3Mgd2F2cGFyc2UgY29kZSkKKworCSogZ3N0L3J0cC9nc3RydHBMMTZlbmMuYyA6IHR5cG8KKwkqIGdzdC9ydHAvZ3N0cnRwZ3NtZW5jLmMgOiB0eXBvCisKKzIwMDQtMDUtMTMgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgY2hlY2sgZm9yIGV4YWN0IHZlcnNpb24gb2YgbGlidmlzdWFsLCBpdCdzIG5vdCBzdXBwb3NlZCB0byBiZQorCSAgQVBJL0FCSSBzdGFibGUgeWV0CisKKzIwMDQtMDUtMTMgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9wdXNoKToKKwkgIHNpZ25hbCBuby1tb3JlLXBhZHMKKworMjAwNC0wNS0xMyAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19zcmNfY29udmVydCkKKwlSZXBvcnQgd2hpY2ggZm9ybWF0IHdhcyB1c2VkIGZvciBHU1RfRk9STUFUX0RFRkFVTFQKKwkqIGdzdC9kZWJ1Zy9NYWtlZmlsZS5hbToKKwkqIGdzdC9kZWJ1Zy9nc3RkZWJ1Zy5jOiAocGx1Z2luX2luaXQpOgorCSogZ3N0L2RlYnVnL3Byb2dyZXNzcmVwb3J0LmM6IChnc3RfcHJvZ3Jlc3NyZXBvcnRfYmFzZV9pbml0KSwKKwkoZ3N0X3Byb2dyZXNzcmVwb3J0X2NsYXNzX2luaXQpLCAoZ3N0X3Byb2dyZXNzcmVwb3J0X2luaXQpLAorCShnc3RfcHJvZ3Jlc3NyZXBvcnRfcmVwb3J0KSwgKGdzdF9wcm9ncmVzc3JlcG9ydF9zZXRfcHJvcGVydHkpLAorCShnc3RfcHJvZ3Jlc3NyZXBvcnRfZ2V0X3Byb3BlcnR5KSwgKGdzdF9wcm9ncmVzc3JlcG9ydF9jaGFpbiksCisJKGdzdF9wcm9ncmVzc3JlcG9ydF9wbHVnaW5faW5pdCk6CisJQWRkIHByb2dyZXNzcmVwb3J0IGVsZW1lbnQgZm9yIHRlc3RpbmcuCisKKzIwMDQtMDUtMTMgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX2dldCksIChnc3RfdjRsc3JjX2NoYW5nZV9zdGF0ZSk6CisJKiBzeXMvdjRsL2dzdHY0bHNyYy5oOgorCSogc3lzL3Y0bC92NGxtanBlZ3NpbmtfY2FsbHMuYzogKGdzdF92NGxtanBlZ3NpbmtfcGxheWJhY2tfaW5pdCk6CisJKiBzeXMvdjRsL3Y0bG1qcGVnc3JjX2NhbGxzLmM6IChnc3RfdjRsbWpwZWdzcmNfY2FwdHVyZV9pbml0KToKKwkqIHN5cy92NGwvdjRsc3JjX2NhbGxzLmM6IChnc3RfdjRsc3JjX2NhcHR1cmVfaW5pdCksCisJKGdzdF92NGxzcmNfZ3JhYl9mcmFtZSk6CisgICAgICAgICAgYWRkIG1vcmUgZGVidWdnaW5nCisgICAgICAgICAgc2VuZCBhIGRpc2NvbnQgYXQgc3RhcnQKKworMjAwNC0wNS0xMiAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAcmVkaGF0LmNvbT4KKworCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmMgKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19zZWdtZW50KTogQXZvaWQKKwlpbmZsb29waW5nIGlmIHdlIGNhbid0IGZpbmQgYSBjaHVuay4gIE9yIGluIG90aGVyIHdvcmRzLCBkb24ndCBibG93CisJY2h1bmtzIGlmIHdlIGRvbid0IGhhdmUgYSBjaHVuayB0byBibG93LgorCisyMDA0LTA1LTEzICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisJKiBleHQvYXVkaW9maWxlL2dzdGFmc3JjLmM6IChnc3RfYWZzcmNfZ2V0KToKKwlSZW1vdmUgb2xkIGRlYnVnIG91dHB1dAorCSogZXh0L2R2L2dzdGR2ZGVjLmM6IChnc3RfZHZkZWNfcXVhbGl0eV9nZXRfdHlwZSksCisJKGdzdF9kdmRlY19jbGFzc19pbml0KSwgKGdzdF9kdmRlY19sb29wKSwgKGdzdF9kdmRlY19jaGFuZ2Vfc3RhdGUpLAorCShnc3RfZHZkZWNfc2V0X3Byb3BlcnR5KSwgKGdzdF9kdmRlY19nZXRfcHJvcGVydHkpOgorCUNoYW5nZSB0aGUgcXVhbGl0eSBzZXR0aW5nIHRvIGFuIGVudW0sIHNvIGl0IHdvcmtzIGZyb20gZ3N0LWxhdW5jaAorCURvbid0IHJlbmVnb3RpYXRlIGEgbm9uLWxpbmtlZCBwYWQuIEFsbG93cyBhdWRpbyBvbmx5IGRlY29kaW5nLgorCSogZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmM6IChnc3RfZGVpbnRlcmxhY2VfZ2V0Y2FwcyksCisJKGdzdF9kZWludGVybGFjZV9saW5rKSwgKGdzdF9kZWludGVybGFjZV9pbml0KToKKwkqIGdzdC92aWRlb2Ryb3AvZ3N0dmlkZW9kcm9wLmM6IChnc3RfdmlkZW9kcm9wX2dldGNhcHMpLAorCShnc3RfdmlkZW9kcm9wX2xpbmspOgorCVNvbWUgY2FwcyBuZWdvdGlhdGlvbiBmaXhlcworCisyMDA0LTA1LTEyICBTdGVwaGFuZSBMb2V1aWxsZXQgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBleHQvdGFya2luL2dzdHRhcmtpbi5jIDoKKwkgIC0gQ2hhbmdlIFJBTksgZnJvbSBOT05FIHRvIFBSSU1BUlkKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jIDoKKwkgIC0gQ2hhbmdlIFJBTksgZnJvbSBOT05FIHRvIE1BUkdJTkFMCisJKiBleHQvZGl2eC9nc3RkaXZ4ZW5jLmMgOgorCSAgLSBDaGFuZ2UgUkFOSyBmcm9tIFBSSU1BUlkgdG8gTk9ORSAoZW5jb2Rlci9zcGlkZXIgaXNzdWUpCisKKzIwMDQtMDUtMTIgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmM6ICh2b3JiaXNfZ3JhbnVsZV90aW1lX2NvcHkpLAorCShnc3Rfdm9yYmlzZW5jX3B1c2hfcGFja2V0KToKKyAgICAgICAgICBjb3B5IGEgZnVuY3Rpb24gdGhhdCB3YXMgYWRkZWQgYmV0d2VlbiAxLjAgYW5kIDEuMC4xIHVudGlsIHdlCisgICAgICAgICAgZGVwZW5kIG9uIHdvcnRod2hpbGUgZmVhdHVyZXMgb2YgcG9zdC0xLjAKKworMjAwNC0wNS0xMiAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBjb25maWd1cmUuYWM6CisJICBlbmFibGUgc2hvdXQyIGJ5IGRlZmF1bHQKKwkqIGV4dC9zaG91dDIvZ3N0c2hvdXQyLmM6IChnc3Rfc2hvdXQyc2VuZF9wcm90b2NvbF9nZXRfdHlwZSksCisJKGdzdF9zaG91dDJzZW5kX2Jhc2VfaW5pdCksIChnc3Rfc2hvdXQyc2VuZF9pbml0KSwKKwkoZ3N0X3Nob3V0MnNlbmRfY29ubmVjdCksIChnc3Rfc2hvdXQyc2VuZF9jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L3Nob3V0Mi9nc3RzaG91dDIuaDoKKwkgIG1ha2UgdGhpcyB3b3JrIGFnYWluLiBCYXNlZCBvbiBhIHBhdGNoIGJ5IFphaGVlciBBYmJhcyBNZXJhbGkgKGZpeGVzCisJICAjMTQyMjYyKQorCSogZXh0L3RoZW9yYS90aGVvcmEuYzogKHBsdWdpbl9pbml0KToKKwkgIGRvbid0IHNldCByYW5rIG9uIGVuY29kZXJzCisKKzIwMDQtMDUtMTEgIEplcmVteSBTaW1vbiAgPGplc2ltb25AbGliZXJ0eXN1cmYuZnI+CisKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoZ3N0X2FzZl9kZW11eF9hdWRpb19jYXBzKToKKwkgIFVzZSBjb2RlY19kYXRhIHByb3BlcnR5IGluc3RlYWQgb2YgZmxhZzEgYW5kIGZsYWcyIGZvciB3bWEKKworMjAwNC0wNS0xMSAgU3RlcGhhbmUgTG9ldWlsbGV0IDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZ3N0L2NkeGFwYXJzZS9nc3RjZHhhcGFyc2UuYyA6CisJICAtIEFkZCBtcGVndmVyc2lvbiB0byBDQVBTIHRvIG1ha2UgaXQgbGluaworCSAgLSBSYW5rIGlzIGFzIEdTVF9SQU5LX1NFQ09OREFSWSBpbnN0ZWFkIG9mIE5PTkUKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYyA6CisJICAtIERvY3VtZW50IGFsbCBhdWRpbyBlbmNvZGluZyB3ZSBjYW4gZW5jb3VudGVyIGZyb20gU29sYXJpcyA5CisJICAgIGhlYWRlcnMgYW5kIGxpYnNuZGZpbGUgaW5mb3JtYXRpb24uCisJICAtIEluY3JlYXNlIG1heC4gcmF0ZSBmcm9tIDQ4MDAwIHRvIDE5MjAwMCAodG8gbWF0Y2ggb3RoZXIgZWxlbWVudHMpCisJICAtIERvbid0IHRyeSB0byBwbGF5IGp1bmsgZGF0YSBiZXR3ZWVuIGhlYWRlciBhbmQgc2FtcGxlcworCisyMDA0LTA1LTExICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9saWJ2aXN1YWwvdmlzdWFsLmM6IChnc3RfdmlzdWFsX2dldGNhcHMpOgorCSAgdXNlIHRoZSByaWdodCBjYXBzIGRlcGVuZGluZyBvbiBlbmRpYW5uZXNzIChJIGhvcGUpCisJKiBleHQvb2dnL2dzdG9nZ211eC5jOiAoZ3N0X29nZ19tdXhfcGx1Z2luX2luaXQpOgorCSAgdXNlIEdTVF9SQU5LX05PTkUgZm9yIGFsbCBub24tZGVjb2RpbmcgZWxlbWVudHMgb3Igc3BpZGVyIGdldHMKKwkgIG1pZ2h0eSBjb25mdXNlZAorCisyMDA0LTA1LTExICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19jb21tZW50KToKKwkgIEZpeCBzb21lIG9kZCBjYXNlcyBhbmQgZml4IEJFIG1ldGFkYXRhIHBhcnNpbmcgb2YgdW5pY29kZTE2IHRleHQuCisKKzIwMDQtMDUtMTEgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0L3N3aXRjaC9nc3Rzd2l0Y2guYzogKGdzdF9zd2l0Y2hfcmVsZWFzZV9wYWQpLAorCShnc3Rfc3dpdGNoX3JlcXVlc3RfbmV3X3BhZCksIChnc3Rfc3dpdGNoX3BvbGxfc2lua3BhZHMpLAorCShnc3Rfc3dpdGNoX2xvb3ApLCAoZ3N0X3N3aXRjaF9nZXRfdHlwZSk6CisJICB3aG9ldmVyIHRoYXQgd2FzOiBETyBOT1QgSU1QT1JUIFBSSVZBVEUgU1lNQk9MUyBUSEFUIEFSRSBOT1QgSU4KKwkgIEhFQURFUlMuIEhhZCB0byBiZSBzYWlkLgorCisyMDA0LTA1LTEwICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogQWRkIHByb3RvdHlwZSBEaXJhYyBzdXBwb3J0LgorCSogZXh0L01ha2VmaWxlLmFtOgorCSogZXh0L2RpcmFjL01ha2VmaWxlLmFtOgorCSogZXh0L2RpcmFjL2dzdGRpcmFjLmNjOgorCSogZXh0L2RpcmFjL2dzdGRpcmFjZGVjLmNjOgorCisyMDA0LTA1LTEwICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6IChnc3RfYXVwYXJzZV9jbGFzc19pbml0KSwKKwkoZ3N0X2F1cGFyc2VfaW5pdCksIChnc3RfYXVwYXJzZV9jaGFpbiksCisJKGdzdF9hdXBhcnNlX2NoYW5nZV9zdGF0ZSk6CisJICBIYWNrIGFyb3VuZCBzcGlkZXIuIFJlbW92ZSBtZSBzb21lIGRheSBwbGVhc2UuCisKKzIwMDQtMDUtMTAgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9hdXBhcnNlL2dzdGF1cGFyc2UuYzogKGdzdF9hdXBhcnNlX2NoYWluKToKKwkgIEZpeCBmb3Igc29tZSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBpbiBwcmV2aW91cyBwYXRjaCwgYWxzbworCSAgbWFrZXMgaXQgd29yay4gRml4ZXMgIzE0MjI4NiB3aGlsZSB3ZSdyZSBhdCBpdC4KKworMjAwNC0wNS0xMSAgU3RlcGhhbmUgTG9ldWlsbGV0IDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOgorCQlmaXhlcyBhLWxhdywgYWRkcyBtdS1sYXcsIGxpbmVhciBwY20gKDgsMTYsMjQsMzIpLCBpZWVlICgzMiwgNjQpCisJCW9ubHkgdW5zdXBwb3J0ZWQgZm9ybWF0cyBhcmUgQURQQ00vQ0NJVFQgRy43MngKKwkJcmV2aWV3ZWQgYnkgUm9uYWxkCisJKiBnc3QtbGlicy9nc3QvYXVkaW8vYXVkaW8uaDogYWRkcyAyNGJpdCBkZXB0aCB0byBQQ00gKHgtcmF3LWludCkKKworMjAwNC0wNS0xMCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC92b3JiaXMvTWFrZWZpbGUuYW06CisJKiBleHQvdm9yYmlzL1JFQURNRToKKwkqIGV4dC92b3JiaXMvb2dndm9yYmlzZW5jLmM6IChnc3Rfb2dndm9yYmlzZW5jX2dldF9mb3JtYXRzKSwKKwkob2dndm9yYmlzZW5jX2dldF90eXBlKSwgKHZvcmJpc19jYXBzX2ZhY3RvcnkpLCAocmF3X2NhcHNfZmFjdG9yeSksCisJKGdzdF9vZ2d2b3JiaXNlbmNfYmFzZV9pbml0KSwgKGdzdF9vZ2d2b3JiaXNlbmNfY2xhc3NfaW5pdCksCisJKGdzdF9vZ2d2b3JiaXNlbmNfc2lua2Nvbm5lY3QpLCAoZ3N0X29nZ3ZvcmJpc2VuY19jb252ZXJ0X3NyYyksCisJKGdzdF9vZ2d2b3JiaXNlbmNfY29udmVydF9zaW5rKSwKKwkoZ3N0X29nZ3ZvcmJpc2VuY19nZXRfcXVlcnlfdHlwZXMpLCAoZ3N0X29nZ3ZvcmJpc2VuY19zcmNfcXVlcnkpLAorCShnc3Rfb2dndm9yYmlzZW5jX2luaXQpLCAoZ3N0X29nZ3ZvcmJpc2VuY19nZXRfdGFnX3ZhbHVlKSwKKwkoZ3N0X29nZ3ZvcmJpc2VuY19tZXRhZGF0YV9zZXQxKSwgKGdzdF9vZ2d2b3JiaXNlbmNfc2V0X21ldGFkYXRhKSwKKwkoZ2V0X2NvbnN0cmFpbnRzX3N0cmluZyksICh1cGRhdGVfc3RhcnRfbWVzc2FnZSksCisJKGdzdF9vZ2d2b3JiaXNlbmNfc2V0dXApLCAoZ3N0X29nZ3ZvcmJpc2VuY193cml0ZV9wYWdlKSwKKwkoZ3N0X29nZ3ZvcmJpc2VuY19jaGFpbiksIChnc3Rfb2dndm9yYmlzZW5jX2dldF9wcm9wZXJ0eSksCisJKGdzdF9vZ2d2b3JiaXNlbmNfc2V0X3Byb3BlcnR5KSwgKGdzdF9vZ2d2b3JiaXNlbmNfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC92b3JiaXMvb2dndm9yYmlzZW5jLmg6CisJKiBleHQvdm9yYmlzL3ZvcmJpcy5jOiAocGx1Z2luX2luaXQpOgorCSogZXh0L3ZvcmJpcy92b3JiaXNlbmMuYzogKHZvcmJpc19jYXBzX2ZhY3RvcnkpLAorCShyYXdfY2Fwc19mYWN0b3J5KSwgKGdzdF92b3JiaXNlbmNfY2xhc3NfaW5pdCksCisJKGdzdF92b3JiaXNlbmNfaW5pdCksIChnc3Rfdm9yYmlzZW5jX3NldHVwKSwKKwkoZ3N0X3ZvcmJpc2VuY19wdXNoX3BhY2tldCksIChnc3Rfdm9yYmlzZW5jX2NoYWluKSwKKwkoZ3N0X3ZvcmJpc2VuY19nZXRfcHJvcGVydHkpLCAoZ3N0X3ZvcmJpc2VuY19zZXRfcHJvcGVydHkpOgorCSogZXh0L3ZvcmJpcy92b3JiaXNlbmMuaDoKKwlBZGRlZCBhIHJhdyB2b3JiaXMgZW5jb2RlciB0byBiZSB1c2VkIHdpdGggdGhlIG9nZ211eGVyLgorCVdlIHN0aWxsIG5lZWQgdGhlIG9sZCBlbmNvZGVyIGZvciBzb21lIGdub21lIGFwcGxpY2F0aW9ucywKKwlyZWFkIHRoZSBSRUFETUUgdG8gZmluZCBvdXQgaG93IHRoYXQgd29ya3MuCisJVGhlIHJhdyBlbmNvZGVyIGlzIGNhbGxlZCAicmF3dm9yYmlzZW5jIiB1bnRpbCAwLjkuCisKKzIwMDQtMDUtMTAgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvb2dnL2dzdG9nZy5jOiAocGx1Z2luX2luaXQpOgorCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9wbHVnaW5faW5pdCksCisJKGdzdF9vZ2dfcHJpbnQpOgorCSogZXh0L29nZy9nc3RvZ2dtdXguYzogKGdzdF9vZ2dfbXV4X2dldF90eXBlKSwKKwkoZ3N0X29nZ19tdXhfYmFzZV9pbml0KSwgKGdzdF9vZ2dfbXV4X2NsYXNzX2luaXQpLAorCShnc3Rfb2dnX211eF9nZXRfc2lua19ldmVudF9tYXNrcyksIChnc3Rfb2dnX211eF9pbml0KSwKKwkoZ3N0X29nZ19tdXhfc2lua2Nvbm5lY3QpLCAoZ3N0X29nZ19tdXhfcGFkX2xpbmspLAorCShnc3Rfb2dnX211eF9wYWRfdW5saW5rKSwgKGdzdF9vZ2dfbXV4X3JlcXVlc3RfbmV3X3BhZCksCisJKGdzdF9vZ2dfbXV4X2hhbmRsZV9zcmNfZXZlbnQpLCAoZ3N0X29nZ19tdXhfbmV4dF9idWZmZXIpLAorCShnc3Rfb2dnX211eF9wdXNoX3BhZ2UpLCAoZ3N0X29nZ19tdXhfY29tcGFyZV9wYWRzKSwKKwkoZ3N0X29nZ19tdXhfcXVldWVfcGFkcyksIChnc3Rfb2dnX211eF9sb29wKSwKKwkoZ3N0X29nZ19tdXhfZ2V0X3Byb3BlcnR5KSwgKGdzdF9vZ2dfbXV4X3NldF9wcm9wZXJ0eSksCisJKGdzdF9vZ2dfbXV4X2NoYW5nZV9zdGF0ZSksIChnc3Rfb2dnX211eF9wbHVnaW5faW5pdCk6CisJQWRkZWQgYW4gb2dnIG11eGVyLgorCVNtYWxsIHR5cG8gZml4ZXMgaW4gdGhlIGRlbXV4ZXIuCisKKzIwMDQtMDUtMTAgIFdpbSBUYXltYW5zICA8d2ltQGZsdWVuZG8uY29tPgorCisJKiBleHQvdGhlb3JhL3RoZW9yYWVuYy5jOiAoZ3N0X3RoZW9yYV9lbmNfY2xhc3NfaW5pdCksCisJKHRoZW9yYV9lbmNfc2lua19saW5rKSwgKHRoZW9yYV9wdXNoX3BhY2tldCksICh0aGVvcmFfZW5jX2NoYWluKSwKKwkodGhlb3JhX2VuY19jaGFuZ2Vfc3RhdGUpLCAodGhlb3JhX2VuY19zZXRfcHJvcGVydHkpLAorCSh0aGVvcmFfZW5jX2dldF9wcm9wZXJ0eSk6CisJTWFyayB0aGUgbGFzdCBwYWNrZXQgd2l0aCBhbiBFT1MgZmxhZyB3aGljaCBpcyBub3QgcmVhbGx5IG5lZWRlZAorCWluIGdzdHJlYW1lci4KKwlEbyBzb21lIGJldHRlciB2aWRlbyBmcmFtZXJhdGUgaW5pdGlhbGlzYXRpb24uCisJVXBkYXRlIHRoZSBidWZmZXIgdGltZXN0YW1wLgorCisyMDA0LTA1LTEwICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOiAoZ3N0X2R2ZGVjX2NoYW5nZV9zdGF0ZSk6CisJUmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIHBhcmVudCBzdGF0ZSBjaGFuZ2UgY2FsbAorCisyMDA0LTA1LTEwICBTdGVwaGFuZSBMb2V1aWxsZXQgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBnc3QvbGF3L2FsYXcuYyA6IGFsYXdkZWMgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgd2l0aCB0eXBlIEFMQVdERUMsIG5vdCBBTEFXRU5DCisJKiBnc3QvbGF3L2FsYXctZGVjb2RlLmMgOiBwdXQgYXVkaW8veC1hbGF3IG9uIHBhZHMsIGluc3RlYWQgb2YgYXVkaW8veC1tdWxhdworCSogZ3N0L2xhdy9hbGF3LWVuY29kZS5jIDogKGlkZW0pCisJKiBleHQvYTUyZGVjL2dzdGE1MmRlYy5jIDogbWFyayBhdWRpby9hNTIsIGF1ZGlvL2FjMyBhcyBkZXByZWNhdGVkIGluIGEgY29tbWVudAorCSogZ3N0L2FjM3BhcnNlL2dzdGFjM3BhcnNlLmMgOiBhdWRpby9hYzMgPT4gYXVkaW8veC1hYzMKKwkqIGdzdC9yZWFsbWVkaWEvcm1kZW11eC5jIDogYXVkaW8vYTUyID0+IGF1ZGlvL3gtYWMzCisKKzIwMDQtMDUtMDkgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYXNyYy5jOiAoZ3N0X2Fsc2Ffc3JjX2xvb3ApOgorCSAgZG9uJ3QgdXNlIGEgZml4ZWQgYnVmZmVyIHNpemUgd2hlbiB3cml0aW5nIHZhcmlhYmxlIGxlbmd0aCBkYXRhIHRvCisJICBpdC4gRml4ZXMgbWVtb3J5IGNvcnJ1cHRpb24gYW5kIG1ha2VzIGFsc2FzcmMgd29yaworCisyMDA0LTA1LTA5ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzaW5rLmM6CisJKF9nc3RfYm9vbGVhbl9hbGxvd19vdmVyd3JpdGVfYWNjdW11bGF0b3IpLAorCShnc3RfZ25vbWV2ZnNzaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2dub21ldmZzc2lua19vcGVuX2ZpbGUpOgorCSAgUnVuIGdsaWIncyBkZWZhdWx0IHNpZ25hbCBoYW5kbGVyICg/PykgaW4gUlVOX0NMRUFOVVAgcmF0aGVyIHRoYW4KKwkgIFJVTl9MQVNULCBhbmQgZG9uJ3QgdXNlIHRoYXQgdG8gc2V0IHRoZSBhY2N1bXVsYXRvciB2YWx1ZSBiZWNhdXNlCisJICB0aGVuIGl0J3MgYWx3YXlzIEZBTFNFLgorCisyMDA0LTA1LTA5ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6CisJKGdzdF9yaWZmX2NyZWF0ZV92aWRlb19jYXBzX3dpdGhfZGF0YSksCisJKGdzdF9yaWZmX2NyZWF0ZV9hdWRpb19jYXBzKSwKKwkoZ3N0X3JpZmZfY3JlYXRlX2F1ZGlvX3RlbXBsYXRlX2NhcHMpOgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9wZWVrX2hlYWQpOgorCSAgRml4IGZvciB1bmFsaWduZWQgUklGRiBmaWxlcyAoaS5lLiB3aGVyZSBhbGwgdGhlIGNodW5rcyB0b2dldGhlcgorCSAgaW4gYSBMSVNUIGNodW5rIGFyZSBub3Qgb2YgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgc2l6ZSBnaXZlbiBpbgorCSAgdGhlIExJU1QgY2h1bmsgaGVhZGVyKS4gRml4ZXMgc2V2ZXJhbCBvZGQgV0FWRSBmaWxlcy4gQWxzbyBmaXgKKwkgIEFEUENNIChibG9ja19hbGlnbiBwcm9wZXJ0eSkgaW4gYXVkaW8sIHNvIHRoYXQgd2F2cGFyc2UgYmFzZWQKKwkgIG9uIHRoaXMgd29ya3Mgbm93IGFzIGl0IHVzZWQgdG8gc3RhbmQtYWxvbmUuCisKKzIwMDQtMDUtMDkgIEVkd2FyZCBIZXJ2ZXkgIDxiaWxib2VkQGJpbGJvZWQuY29tPgorCisJcmV2aWV3ZWQgYnkgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvYTUyZGVjL2dzdGE1MmRlYy5jOgorCSogZXh0L2RpdngvZ3N0ZGl2eGRlYy5jOgorCSogZXh0L2RpdngvZ3N0ZGl2eGVuYy5jOgorCSogZXh0L2R0cy9nc3RkdHNkZWMuYzogKGdzdF9kdHNkZWNfYmFzZV9pbml0KToKKwkqIGV4dC9mYWFjL2dzdGZhYWMuYzogKGdzdF9mYWFjX2Jhc2VfaW5pdCk6CisJKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9iYXNlX2luaXQpOgorCSogZXh0L2l2b3JiaXMvdm9yYmlzZmlsZS5jOgorCSogZXh0L2xhbWUvZ3N0bGFtZS5jOgorCSogZXh0L2xpYmZhbWUvZ3N0bGliZmFtZS5jOgorCSogZXh0L21wZWcyZW5jL2dzdG1wZWcyZW5jLmNjOgorCSogZXh0L211c2ljYnJhaW56L2dzdHRybS5jOiAoZ3N0X211c2ljYnJhaW56X2Jhc2VfaW5pdCk6CisJKiBleHQvc2lkcGxheS9nc3RzaWRkZWMuY2M6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzoKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOgorCSogZXh0L3h2aWQvZ3N0eHZpZGRlYy5jOgorCSogZXh0L3h2aWQvZ3N0eHZpZGVuYy5jOgorCSAgY29ycmVjdCBrbGFzc2VzLiBNb3N0bHkgcyxDb2RlYy8oQXVkaW98VmlkZW8pLFwxL0NvZGVjLAorCSAgKGZpeGVzICMxNDIxOTMpCisKKzIwMDQtMDUtMDggIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGRldmljZV9saXN0KSwKKwkoZ3N0X2Fsc2FfY2xhc3NfcHJvYmVfZGV2aWNlcyk6CisJKiBleHQvYWxzYS9nc3RhbHNhbWl4ZXIuYzogKGdzdF9hbHNhX21peGVyX29wZW4pOgorCSAgRml4IGFsc2Egb2RkbmVzcyBpbiBtaXhlciBhZnRlciB0aGUgY29tYmluYXRpb24gb2YgdXNpbmcgbWl4ZXIKKwkgIGluIHNvdXJjZS9zaW5rIGVsZW1lbnRzIGFuZCB1c2luZyBodzp4LHkgaW5zdGVhZCBvZiBqdXN0IGh3OnguCisKKzIwMDQtMDUtMDkgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfZGVzdHJveV9zb3VyY2VwYWQpLAorCShnc3Rfd2F2cGFyc2VfY3JlYXRlX3NvdXJjZXBhZCk6CisJICBtYWtlIFBBVVNFRD0+UkVBRFk9PlBBVVNFRD1SRUFEWSB3b3JrIGJ5IG5vdCBkZXN0cm95aW5nIE5VTEwKKwkgIHNvdXJjZXBhZHMKKworMjAwNC0wNS0wOSAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jOiAoZ3N0X2Fsc2Ffc2lua19jaGVja19ldmVudCk6CisJICBhbGxvdyBkaXNjb250IGV2ZW50cyBiZWZvcmUgY2FwcyBuZWdvCisKKzIwMDQtMDUtMDggIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L3ZvcmJpcy92b3JiaXNkZWMuYzogKHZvcmJpc19kZWNfZXZlbnQpOgorCSAgZG9uJ3QgbGVhayBldmVudHMKKworMjAwNC0wNS0wOCAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvbGV2ZWwvZ3N0bGV2ZWwuYzogKGdzdF9sZXZlbF9saW5rKSwgKGdzdF9sZXZlbF9jaGFpbiksCisJKGdzdF9sZXZlbF9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X2xldmVsX2luaXQpOgorCSogZ3N0L2xldmVsL2dzdGxldmVsLmg6CisJICBmaWd1cmUgb3V0IGlmIHdlJ3JlIGluaXRpYWxpemVkIGRpcmVjdGx5IGluc3RlYWQgb2Yga2VlcGluZyBhCisJICB2YXJpYWJsZSB0aGF0J3Mgd3JvbmcgaW4gOTAlIG9mIGNhc2VzCisJICBkb24ndCBpbml0aWFsaXplIHBhZHMgYW5kIHRoZW4gbGVhayB0aGVtIGFuZCB1c2UgYSBuZXcgdW5pdGlhbGl6ZWQKKwkgIHBhZC4gKGZpeGVzICMxNDIwODQpCisJICB0aGVzZSB3ZXJlIGJ1Z3Mgc28gbjAwYmlzaCBJIGRpZG4ndCBmaW5kIHRoZW0gZm9yIGFuIGhvdXIgOi8KKworMjAwNC0wNS0wOCBJYWluIDxpYWluQHByZXR0eXBlb3BsZS5vcmc+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5bY2hdOiBSZXdyb3RlIHRvIHVzZSBSaWZmUmVhZCBpbnN0ZWFkLgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmMgKGdzdF9yaWZmX3JlYWRfcGVla19oZWFkKTogVW5zdGF0aWMgaXQKKwkoZ3N0X3JpZmZfcmVhZF9lbGVtZW50X2RhdGEpOiBEaXR0bywgYW5kIGFkZGVkIGEgZ290X2J5dGVzIGFyZ3VtZW50IHRvCisJcmV0dXJuIHRoZSBsZW5ndGggdGhhdCB3YXMgcmVhZC4KKwkoZ3N0X3JpZmZfcmVhZF9zdHJmX2F1ZHMpOiBBbGxvdyBmbXQgdGFncyBhcyB3ZWxsLgorCisyMDA0LTA1LTA3ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9mYWFkL2dzdGZhYWQuYzogKGdzdF9mYWFkX3Npbmtjb25uZWN0KTogSEFDSyB0byBjb3JyZWN0CisJc2lnbmVkIGNoYXIgYXNzdW1wdGlvbiBpbiBmYWFkLmguCisKKzIwMDQtMDUtMDcgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX3Y0bDJmb3VyY2NfdG9fY2Fwcyk6CisJICBNaXNzaW5nIGJyZWFrLCBkZXRlY3RlZCBieSBEYW5pZWwgR2F6YXJkIDxkYW5pZWwuZ2F6YXJkQGZyZWUuZnI+LgorCisyMDA0LTA1LTA3ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0ByZWRoYXQuY29tPgorCisJKiBnc3Qvdm9sdW1lL2dzdHZvbHVtZS5jIChnc3Rfdm9sdW1lX2Rpc3Bvc2UpOiBVbnJlZiBkcG1hbi4KKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYyAoZ3N0X2ZsYWNkZWNfZGlzcG9zZSk6IEFkZCBkaXNwb3NlCisJZnVuY3Rpb24uCisJKiBnc3QvYXVkaW9zY2FsZS9nc3RhdWRpb3NjYWxlLmMgKGdzdF9hdWRpb3NjYWxlX2Rpc3Bvc2UpOgorCUFkZCBkaXNwb3NlIGZ1bmN0aW9uLgorCisyMDA0LTA1LTA4ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisJKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY192aWRlb19saW5rKToKKwkgIEZpeCBjYXBzIG5lZ28gYW5kIHBhZCB0ZW1wbGF0ZXMuIFJHQiBtb2RlIGNhcHMgc2hvdWxkCisJICB3b3JrIG5vdy4KKwkqIGV4dC9kdmRuYXYvZ3N0LWR2ZDoKKwkgIE1vdmUgbXBlZzJkZWMgaW5zaWRlIHRoZSB0aHJlYWQgYmVjYXVzZSBvdGhlcndpc2UgdGhlCisJICBxdWV1ZSByZWplY3RzIGNhcCBjaGFuZ2VzIG1pZC1zdHJlYW0KKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOiAoZ3N0X21wZWcyZGVjX2dldF90eXBlKSwKKwkoZ3N0X21wZWcyZGVjX2ZsdXNoX2RlY29kZXIpOgorCSAgRm9yIG1wZWcyZGVjID4gMC40LjAsIGNhbGwgdGhlIGZsdXNoIGZ1bmN0aW9uIGluc3RlYWQgb2YKKwkgIG1hbnVhbGx5IGV4dHJhY3RpbmcgYWxsIGluLWZsaWdodCBmcmFtZXMuCisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzogKGdzdF9kdjEzOTRzcmNfZmFjdG9yeSksCisJKGdzdF9kdjEzOTRzcmNfaW5pdCksIChnc3RfZHYxMzk0c3JjX2lzb19yZWNlaXZlKToKKwkgIENoYW5nZSBtaW1lIHR5cGUgdmlkZW8vZHYgZ28gdmlkZW8veC1kdiB0byBtYXRjaCB0aGUKKwkgIHJlc3Qgb2YgZ3N0LXBsdWdpbnMKKworMjAwNC0wNS0wNyAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVyLmM6IChnc3RfYWxzYV9taXhlcl9idWlsZF9saXN0KToKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2dldF90eXBlKSwKKwkoZ3N0X2Fsc2Ffc2lua19jbGFzc19pbml0KToKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmg6CisJKiBleHQvYWxzYS9nc3RhbHNhc3JjLmM6IChnc3RfYWxzYV9zcmNfZ2V0X3R5cGUpLAorCShnc3RfYWxzYV9zcmNfY2xhc3NfaW5pdCk6CisJKiBleHQvYWxzYS9nc3RhbHNhc3JjLmg6CisJICBNYWtlIGFsc2FzaW5rL3NyYyBhIHN1YmNsYXNzIG9mIGFsc2FtaXhlciBzbyB0aGF0IG1peGVyIHN0dWZmCisJICBzaG93cyB1cCBpbiBnc3QtcmVjLiBOZWVkcyBzb21lIGZpbmV0dW5pbmcuCisKKzIwMDQtMDUtMDUgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L2xhbWUvZ3N0bGFtZS5jOiAoZ3N0X2xhbWVfY2hhaW4pOgorCSAgc2ltcGxpZnkKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2hhbmRsZV9ldmVudCk6CisJICBmaXggZXZlbnQgbGVhaworCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChtcDNfdHlwZV9maW5kKToKKwkgIGJlIGFibGUgdG8gZGV0ZWN0IG1wMyBmaWxlcyA8IDQwOTYgYnl0ZXMKKworMjAwNC0wNS0wNiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC90aGVvcmEvdGhlb3JhZW5jLmM6IChnc3RfdGhlb3JhX2VuY19jbGFzc19pbml0KSwKKwkodGhlb3JhX2VuY19zaW5rX2xpbmspLCAodGhlb3JhX3B1c2hfcGFja2V0KSwgKHRoZW9yYV9lbmNfY2hhaW4pLAorCSh0aGVvcmFfZW5jX3NldF9wcm9wZXJ0eSksICh0aGVvcmFfZW5jX2dldF9wcm9wZXJ0eSk6CisJQWxzbyBlbmNvZGUgdGhlIGZpcnN0IGZyYW1lLCBjbGVhbnVwIHNvbWUgY29kZS4KKworMjAwNC0wNS0wNiAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9tcGVnMmVuYy9nc3RtcGVnMmVuYy5jYzoKKwlGb3J3YXJkIGV2ZW50cyBmaXJzdCBiZWZvcmUgZGVjaWRpbmcgdGhhdCBuZWdvdGlhdGlvbiB3YXMKKwlub3QgcGVyZm9ybWVkLgorCisyMDA0LTA1LTA2ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzogKGdzdF93YXZlbmNfY2hhaW4pOgorCUZpcnN0IHByb2Nlc3MgdGhlIGV2ZW50cyBiZWZvcmUgZGVjaWRpbmcgdGhhdCBuZWdvdGlhdGlvbgorCXdhcyBub3QgcGVyZm9ybWVkLgorCisyMDA0LTA1LTA2ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L3RoZW9yYS9NYWtlZmlsZS5hbToKKwkqIGV4dC90aGVvcmEvdGhlb3JhLmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOiAodGhlb3JhX2RlY19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L3RoZW9yYS90aGVvcmFlbmMuYzogKGdzdF90aGVvcmFfZW5jX2Jhc2VfaW5pdCksCisJKGdzdF90aGVvcmFfZW5jX2NsYXNzX2luaXQpLCAoZ3N0X3RoZW9yYV9lbmNfaW5pdCksCisJKHRoZW9yYV9lbmNfc2lua19saW5rKSwgKHRoZW9yYV9lbmNfZXZlbnQpLCAodGhlb3JhX3B1c2hfcGFja2V0KSwKKwkodGhlb3JhX2VuY19jaGFpbiksICh0aGVvcmFfZW5jX2NoYW5nZV9zdGF0ZSksCisJKHRoZW9yYV9lbmNfc2V0X3Byb3BlcnR5KSwgKHRoZW9yYV9lbmNfZ2V0X3Byb3BlcnR5KToKKwlBZGRlZCBhIHRoZW9yYSBlbmNvZGVyLCBncm91cGVkIHRoZSBlbmNvZGVyIGFuZCBkZWNvZGVyIGludG8gdGhlCisJc2FtZSBwbHVnaW4uCisKKzIwMDQtMDUtMDUgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzogKGdzdF9qcGVnZW5jX2dldF90eXBlKSwKKwkoZ3N0X2pwZWdlbmNfY2hhaW4pOgorICAgICAgICBmaXggRFVSQVRJT04gb24gb3V0Z29pbmcgYnVmZmVycworCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X2hhbmRsZV9zaW5rX2V2ZW50KToKKyAgICAgICAgZGVidWcgdXNpbmcgdGltZSBmb3JtYXRzCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3hjb250ZXh0X2dldCk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2dldF94dl9zdXBwb3J0KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3NpbmtfbGluayk6CisgICAgICAgIHdpbmRvd3Mgd2l0aCB3aWR0aC9oZWlnaHQgMCBnZW5lcmF0ZSBYIGVycm9ycywgc28gZG9uJ3QgYWxsb3cgdGhlbQorCisyMDA0LTA1LTA1ICBXaW0gVGF5bWFucyAgPHdpbUBmbHVlbmRvLmNvbT4KKworCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmM6IChzcmNfdGVtcGwpLAorCShnc3RfbXBlZzJkZWNfYmFzZV9pbml0KSwgKGdzdF9tcGVnMmRlY19pbml0KSwKKwkoZ3N0X21wZWcyZGVjX25lZ290aWF0ZV9mb3JtYXQpOgorCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmg6CisJICByZW1vdmVkIHRoZSBzdGF0aWMgcGFkIHRlbXBsYXRlIHNvIHRoYXQgd2UgY2FuIGFkZCB0aGUKKwkgIG1vcmUgYWNjdXJhdGUgZnJhbWVyYXRlIHZhbHVlIHRvIHRoZSBjYXBzLgorCisKKzIwMDQtMDUtMDQgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgY2hlY2sgZm9yIGtkZW1hY3Jvcy5oLCB0b28gKHNob3VsZCBmaXggIzE0MTgyMSkKKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmM6ICh2b3JiaXNfZGVjX2V2ZW50KSwgKHZvcmJpc19kZWNfY2hhaW4pOgorCSAgZG9uJ3QgY3Jhc2ggaWYgbm8gaGVhZGVyIHdhcyBzZW50LCBidXQgbmljZWx5IGVycm9yIG91dCAoZml4ZXMgcGFydAorCSAgb2YgIzE0MTU1NCkKKworMjAwNC0wNS0wNCAgV2ltIFRheW1hbnMgIDx3aW1AZmx1ZW5kby5jb20+CisKKwkqIGV4dC9tcGVnMmVuYy9nc3RtcGVnMmVuYy5jYzogKGdzdF9tcGVnMmVuY19kaXNwb3NlKTogY2FsbCB0aGUKKwlwYXJlbnQgZGlzcG9zZSBmdW5jdGlvbiB0byBhdm9pZCBzZWdmYXVsdCBvbiBkZXN0cm95LgorCisyMDA0LTA1LTA0ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3NpbmtfbGluayksCisJKHBsdWdpbl9pbml0KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3NpbmtfbGluayk6CisgICAgICAgIGNsZWFuIHVwIGRlYnVnZ2luZyBjYXBzCisgICAgICAgIGFsc28gcmVjcmVhdGUgeHZpbWFnZSB3aGVuIGZvcm1hdCBoYXMgY2hhbmdlZAorCisyMDA0LTA1LTA0ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9saWJ2aXN1YWwvTWFrZWZpbGUuYW06CisJKiBleHQvbGlidmlzdWFsL3Zpc3VhbC5jOiAoZ3N0X3Zpc3VhbF9jbGFzc19pbml0KSwKKwkoZ3N0X3Zpc3VhbF9pbml0KSwgKGdzdF92aXN1YWxfZGlzcG9zZSksIChnc3RfdmlzdWFsX2dldGNhcHMpLAorCShnc3RfdmlzdWFsX3NyY2xpbmspLCAoZ3N0X3Zpc3VhbF9jaGFpbiksCisJKGdzdF92aXN1YWxfY2hhbmdlX3N0YXRlKSwgKHBsdWdpbl9pbml0KToKKwkgIHVzZSBhIEdzdEFkYXB0ZXIgdG8gY29ycmVjdGx5IGFkYXB0IGJ1ZmZlciBzaXplcyAtIGFsbG93cyB1c2luZyBhCisJICBmcmFtZXJhdGUKKworMjAwNC0wNS0wMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogc3lzL3Y0bC9nc3R2NGxlbGVtZW50Lmg6CisJKiBzeXMvdjRsL2dzdHY0bG1qcGVnc3JjLmM6IChnc3RfdjRsbWpwZWdzcmNfY2xhc3NfaW5pdCk6CisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19nZXRfZnBzKSwgKGdzdF92NGxzcmNfZ2V0Y2FwcyksCisJKGdzdF92NGxzcmNfYnVmZmVyX2ZyZWUpOgorCSogc3lzL3Y0bC92NGxfY2FsbHMuYzogKGdzdF92NGxfZ2V0X2NhcGFiaWxpdGllcyk6CisJKiBzeXMvdjRsL3Y0bHNyY19jYWxscy5jOiAoZ3N0X3Y0bHNyY19xdWV1ZV9mcmFtZSksCisJKGdzdF92NGxzcmNfc3luY19mcmFtZSksIChnc3RfdjRsc3JjX2dyYWJfZnJhbWUpLAorCShnc3RfdjRsc3JjX3JlcXVldWVfZnJhbWUpOgorICAgICAgICBtb3ZlIHNvbWUgZGVidWdnaW5nIGNhdGVnb3JpZXMgYXJvdW5kCisgICAgICAgIHF1ZXJ5IGZvciBmcHMgaW5kZXggYW5kIHNldCBhY2NvcmRpbmdseSBpZiBmb3VuZAorCisyMDA0LTA1LTAzICBTdGVwaGFuZSBMb2V1aWxsZXQgPHN0ZXBoYW5lLmxvZXVpbGxldEB0aXNjYWxpLmZyPgorCisJKiBleHQvbGFtZS9nc3RsYW1lLmM6CisJY29ycmVjdCBkZWZhdWx0cyB0aGF0IGxhbWVfaW5pdCBwdXRzIG91dCBvZiByYW5nZQorCisyMDA0LTA1LTAzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvZGl2eC9nc3RkaXZ4ZW5jLmM6IChnc3RfZGl2eGVuY19nZXRfdHlwZSksCisJKGdzdF9kaXZ4ZW5jX2NsYXNzX2luaXQpOgorICAgICAgICBmaXggcmFuZ2Ugc2luY2UgLTEgaXMgdGhlIGRlZmF1bHQKKwkqIGdzdC9tcGVnMXN5cy9nc3RtcGVnMXN5c3RlbWVuY29kZS5jOgorCShnc3RfbXBlZzFfc3lzdGVtX2VuY29kZV9nZXRfdHlwZSksIChnc3Rfc3lzdGVtX2VuY29kZV9tdWx0aXBsZXgpOgorCSogZ3N0L3J0anBlZy9nc3RydGpwZWdkZWMuYzogKGdzdF9ydGpwZWdkZWNfZ2V0X3R5cGUpLAorCShnc3RfcnRqcGVnZGVjX2NoYWluKToKKwkqIGdzdC9ydGpwZWcvZ3N0cnRqcGVnZW5jLmM6IChnc3RfcnRqcGVnZW5jX2dldF90eXBlKSwKKwkoZ3N0X3J0anBlZ2VuY19jaGFpbik6CisJKiBzeXMvcWNhbS9nc3RxY2Ftc3JjLmM6IChnc3RfYXV0b2V4cF9tb2RlX2dldF90eXBlKSwKKwkoZ3N0X3FjYW1zcmNfZ2V0X3R5cGUpLCAoZ3N0X3FjYW1zcmNfY2hhbmdlX3N0YXRlKToKKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzaW5rLmM6IChnc3RfdjRsbWpwZWdzaW5rX2dldF90eXBlKToKKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzcmMuYzogKGdzdF92NGxtanBlZ3NyY19nZXRfdHlwZSk6CisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOgorCSogc3lzL3Y0bC92NGxfY2FsbHMuYzogKGdzdF92NGxfb3Blbik6CisJKiBzeXMvdjRsL3Y0bG1qcGVnc2lua19jYWxscy5jOiAoZ3N0X3Y0bG1qcGVnc2lua19wbGF5YmFja19pbml0KToKKwkqIHN5cy92NGwvdjRsbWpwZWdzcmNfY2FsbHMuYzogKGdzdF92NGxtanBlZ3NyY19jYXB0dXJlX2luaXQpOgorCSogc3lzL3Y0bC92NGxzcmNfY2FsbHMuYzogKGdzdF92NGxzcmNfY2FwdHVyZV9pbml0KToKKwkqIHN5cy92Y2QvdmNkc3JjLmM6ICh2Y2RzcmNfZ2V0X3R5cGUpLCAodmNkc3JjX2dldCk6CisgICAgICAgICAgcmVtb3ZlIGdzdF9pbmZvIGNhbGxzCisKKzIwMDQtMDUtMDMgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogcG8vYWYucG86CisJKiBwby9hei5wbzoKKwkqIHBvL2VuX0dCLnBvOgorCSogcG8vbmwucG86CisJKiBwby9zci5wbzoKKwkqIHBvL3N2LnBvOgorICAgICAgICAgIFVwZGF0ZWQgdHJhbnNsYXRpb25zCisKKzIwMDQtMDUtMDMgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChfZml4YXRlX2NhcHNfdG9faW50KToKKyAgICAgICAgICByZWZhY3Rvci9jb21tZW50IGNvZGUKKworMjAwNC0wNS0wMiAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2FzZmRlbXV4L01ha2VmaWxlLmFtOgorCSogZ3N0L2FzZmRlbXV4L2FzZmhlYWRlcnMuYzoKKwkqIGdzdC9hc2ZkZW11eC9hc2ZoZWFkZXJzLmg6CisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmLmM6IChwbHVnaW5faW5pdCk6CisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfZ2V0X3R5cGUpLAorCShnc3RfYXNmX2RlbXV4X2Jhc2VfaW5pdCksIChnc3RfYXNmX2RlbXV4X3Byb2Nlc3NfY29tbWVudCksCisJKGdzdF9hc2ZfZGVtdXhfc2V0dXBfcGFkKToKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5oOgorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZm11eC5jOgorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZm11eC5oOgorCSAgQWRkIHRhZ2dpbmcgc3VwcG9ydCB0byBkZW11eGVyLCBzcGxpdCBvdXQgcmVnaXN0cmF0aW9uIGluIGl0cyBvd24KKwkgIGZpbGUgaW5zdGVhZCBvZiBpbiBkZW11eCAoaGFja3kpLCBhbmQgcHJldmVudCBoYXZpbmcgc29tZSB0YWJsZXMKKwkgIGluIG91ciBtZW1vcnkgbXVsdGlwbGUgdGltZXMgKGluIGFzZmhlYWRlcnMuaCkuCisKKzIwMDQtMDUtMDEgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOgorCShnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfbWV0YWRhdGEpOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgQmFzaWMgdGFnIHJlYWRpbmcgc3VwcG9ydC4KKworMjAwNC0wNC0zMCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYXVkaW9fY2Fwcyk6CisJICBSZWFsbHkgZGV0ZWN0IGFjLTMgYXVkaW8uCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKG1hdHJvc2thX3R5cGVfZmluZCk6CisJICByZWFsbHkgZGV0ZWN0IG1hdHJvc2thIGZpbGVzIChvZmYtYnktMSkuCisKKzIwMDQtMDQtMzAgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpLAorCShnc3RfcXRkZW11eF9hZGRfc3RyZWFtKSwgKHF0ZGVtdXhfcGFyc2UpLCAocXRkZW11eF90eXBlX2dldCksCisJKHF0ZGVtdXhfZHVtcF9zdHN6KSwgKHF0ZGVtdXhfZHVtcF9zdGNvKSwgKHF0ZGVtdXhfZHVtcF9jbzY0KSwKKwkocXRkZW11eF9kdW1wX3Vua25vd24pLCAocXRkZW11eF9wYXJzZV90cmVlKSwgKHF0ZGVtdXhfcGFyc2VfdWR0YSksCisJKHF0ZGVtdXhfdGFnX2FkZCksIChnZXRfc2l6ZSksIChnc3RfcXRkZW11eF9oYW5kbGVfZXNkcyk6IE1vcmUgcXRkZW11eAorCWhhY2thZ2UgLS0gcGFyc2UgYSBsb3QgbW9yZSBhdG9tcywgZXh0cmFjdCBhIGZldyB0YWdzLiAgT25lIG1pZ2h0IGV2ZW4KKwltaXN0YWtlIHRoaXMgZm9yIHRhZyBzdXBwb3J0LiAgTWF5YmUgaXQgaXMuCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4Lmg6CisKKzIwMDQtMDQtMzAgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmMgKGdzdF9hbHNhX3NpbmtfbW1hcCk6IFBsdWcgYSBtZW1sZWFrLgorCisyMDA0LTA0LTMwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2xvcnNwYWNlLmM6CisJKGdzdF9mZm1wZWdjb2xvcnNwYWNlX2dldGNhcHMpOgorICAgICAgICAgIHJlbW92ZSBicm9rZW4gbmVnbyBmaXgKKworMjAwNC0wNC0zMCAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvbGlidmlzdWFsL01ha2VmaWxlLmFtOgorCSogZXh0L2xpYnZpc3VhbC92aXN1YWwuYzoKKwkgIGFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIGxpYnZpc3VhbCAoaHR0cDovL2xpYnZpc3VhbC5zb3VyY2Vmb3JnZS5uZXQpCisJICBsaWJ2aXN1YWwgaXMgc3RpbGwgcXVpdGUgYWxwaGEsIHNvIGV4cGVjdCBjcmFzaGVzIGluIHRoZXJlIDopCisKKzIwMDQtMDQtMjkgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfYWRkX3N0cmVhbSksIChxdGRlbXV4X3BhcnNlKSwKKwkocXRkZW11eF9wYXJzZV90cmFrKSwgKGdldF9zaXplKSwgKGdzdF9xdGRlbXV4X2hhbmRsZV9lc2RzKTogSGFja2VkCisJdXAgcXRkZW11eCB0byBtYWtlIGl0IHNwaXQgb3V0IGNvZGVjX2RhdGEuICBEbyBfbm90XyBsb29rIGF0IHRoaXMKKwljb2RlOyB5b3Ugd2lsbCBubyBsb25nZXIgcmVzcGVjdCBtZS4KKworMjAwNC0wNC0yOSAgU3RlcGhhbmUgTG9ldWlsbGV0IDxzdGVwaGFuZS5sb2V1aWxsZXRAdGlzY2FsaS5mcj4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jIDogKGdzdF9hbHNhX2NsYXNzX3Byb2JlX2RldmljZXMpCisJKiBleHQvYWxzYS9nc3RhbHNhLmggOgorCWNoYW5nZSBhbHNhIHBjbSBkZXZpY2UgZGlzY292ZXJ5IHRvIGZpbmQgbW9yZSB0aGFuIDEgZGV2aWNlCisJcGVyIGNhcmQuIGNvZGUgcmV2aWV3IGJ5IFJvbmFsZC4KKworMjAwNC0wNC0yOSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogKGdzdF9vc3NlbGVtZW50X3JhdGVfcHJvYmVfY2hlY2spOgorCUFkZCBhIGNoZWNrIGZvciBhIGRyaXZlciBidWcgb24gRnJlZUJTRC4gIChidWcgIzE0MDU2NSkKKworMjAwNC0wNC0yOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdkZWNfZ2V0X3R5cGUpOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOiAoZ3N0X2pwZWdlbmNfZ2V0X3R5cGUpLAorCShnc3RfanBlZ2VuY19nZXRjYXBzKToKKyAgICAgICAgICBtb3ZlIGZvcm1hdCBzZXR0aW5nIHRvIGlubmVyIGxvb3AKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvbG9yc3BhY2UuYzoKKwkoZ3N0X2ZmbXBlZ2NvbG9yc3BhY2VfZ2V0Y2Fwcyk6CisgICAgICAgICAgdXNlIEdTVF9QQURfQ0FQUyBpZiBhdmFpbGFibGUgc28gdGhhdCB3ZSB1c2UgYWxyZWFkeSBuZWdvdGlhdGVkCisgICAgICAgICAgY2FwcworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfbG9vcF9oZWFkZXIpLAorCShxdGRlbXV4X3BhcnNlX21vb3YpLCAocXRkZW11eF9wYXJzZSk6CisgICAgICAgICAgZXh0cmEgZGVidWdnaW5nCisJKiBzeXMvcWNhbS9xY2FtLUxpbnV4LmM6IChxY19sb2NrX3dhaXQpLCAocWNfdW5sb2NrKToKKwkqIHN5cy9xY2FtL3FjYW0tb3MuYzogKHFjX2xvY2tfd2FpdCksIChxY191bmxvY2spOgorICAgICAgICAgIG1vdmUgaGFyZGNvZGVkIHBhdGggdG8gREVGSU5FCisKKzIwMDQtMDQtMjggIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3NwZWVkL2dzdHNwZWVkLmM6IChzcGVlZF9wYXJzZV9jYXBzKTogIEZpeCBjYXBzIHBhcnNpbmcuCisJKGJ1ZyAjMTQwMDY0KQorCisyMDA0LTA0LTI4ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9jbGFzc19wcm9iZV9kZXZpY2VzKToKKwkgIERvbid0IHByb2JlIGZvciBwbGF5YmFjayBkZXZpY2UgaWYgd2UncmUgYSBzb3VyY2UgZWxlbWVudC4gRml4ZXMKKwkgICMxMzk2NTguCisKKzIwMDQtMDQtMjkgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX2hhbmRsZV9ldmVudCksCisJKGdzdF9pZDNfdGFnX2NoYWluKToKKwkgIHJld3JpdGUgYnVmZmVyIG9mZnNldAorCisyMDA0LTA0LTI4ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvZHRzL01ha2VmaWxlLmFtOgorCSogZXh0L2R0cy9nc3RkdHNkZWMuYzogKGdzdF9kdHNkZWNfZ2V0X3R5cGUpLAorCShnc3RfZHRzZGVjX2Jhc2VfaW5pdCksIChnc3RfZHRzZGVjX2NsYXNzX2luaXQpLCAoZ3N0X2R0c2RlY19pbml0KSwKKwkoZ3N0X2R0c2RlY19jaGFubmVscyksIChnc3RfZHRzZGVjX3JlbmVnb3RpYXRlKSwKKwkoZ3N0X2R0c2RlY19oYW5kbGVfZXZlbnQpLCAoZ3N0X2R0c2RlY191cGRhdGVfc3RyZWFtaW5mbyksCisJKGdzdF9kdHNkZWNfbG9vcCksIChnc3RfZHRzZGVjX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9kdHNkZWNfc2V0X3Byb3BlcnR5KSwgKGdzdF9kdHNkZWNfZ2V0X3Byb3BlcnR5KSwKKwkocGx1Z2luX2luaXQpOgorCSogZXh0L2R0cy9nc3RkdHNkZWMuaDoKKwkgIE5ldyBEVFMgZGVjb2Rlci4KKwkqIGV4dC9mYWFkL2dzdGZhYWQuYzogKGdzdF9mYWFkX3Npbmtjb25uZWN0KSwKKwkoZ3N0X2ZhYWRfc3JjY29ubmVjdCk6CisJICBBZGQgRVNEUyBhdG9tIGhhbmRsaW5nICgubTRhKS4KKworMjAwNC0wNC0yNyAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2RpdngvZ3N0ZGl2eGRlYy5jOiAocGx1Z2luX2luaXQpOgorCSAgUmVtb3ZlIGNvbW1lbnQgdGhhdCBtYWtlcyBubyBzZW5zZS4KKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfaWQzX3RhZ19zZXRfcHJvcGVydHkpOgorCSAgRml4IGZvciBvYnZpb3VzIHR5cG8gdGhhdCByZXN1bHRlZCBpbiB3YXJuaW5ncyBkdXJpbmcgZ3N0LXJlZ2lzdGVyLgorCSogZXh0L3h2aWQvZ3N0eHZpZGRlYy5jOiAoZ3N0X3h2aWRkZWNfc3JjX2xpbmspLAorCShnc3RfeHZpZGRlY19zaW5rX2xpbmspOgorCSAgRml4IGNhcHMgbmVnb3RpYXRpb24gYSBiaXQgYmV0dGVyLgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9wYXJzZV90cmFrKToKKwkgIFdlIGNhbGwgdGhpcyAnY29kZWNfZGF0YScsIG5vdCAnZXNkcycuCisKKzIwMDQtMDQtMjcgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYzoKKwkgIG1ha2Ugc3VyZSB3ZSBvbmx5IHByb3ZpZGUgMjU2eDEyOAorCSogZ3N0L21vbm9zY29wZS9tb25vc2NvcGUuYzogKG1vbm9zY29wZV9pbml0KToKKwkgIGFzc2VydCBzaXplIG9mIDI1NngxMjgKKworMjAwNC0wNC0yNyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19pbml0KSwgKGdzdF92NGxzcmNfZml4YXRlKSwKKwkoZ3N0X3Y0bHNyY19nZXRjYXBzKSwgKGdzdF92NGxzcmNfYnVmZmVyX2ZyZWUpOgorICAgICAgICAgIGZpeGF0ZSB0byBtYXggd2lkdGggYW5kIGhlaWdodCBvZiBkZXZpY2UKKworMjAwNC0wNC0yNyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogTWFrZWZpbGUuYW06CisJKiBzeXMvdjRsL2dzdHY0bC5jOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzoKKwkqIHN5cy92NGwvdjRsX2NhbGxzLmM6CisJKiBzeXMvdjRsL3Y0bHNyY19jYWxscy5jOgorICAgICAgICAgIGZpeCBmb3IgcWMtdXNiIGRyaXZlciB3aGljaCBmYWtlcyBoYXZpbmcgbW9yZSB0aGFuIG9uZSBidWZmZXIKKyAgICAgICAgICBieSBoYW5kaW5nIHRoZSBzYW1lIGJ1ZmZlciB0d2ljZSwgd2hpY2ggY29uZnVzZWQgR1N0cmVhbWVyJ3MvdjRsc3JjCisgICAgICAgICAgYnVmZmVyX2ZyZWUgb3ZlcnJpZGUKKyAgICAgICAgICBhZGQgZGVidWdnaW5nCisKKzIwMDQtMDQtMjcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIE1ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvdGVzdHNyYy9nc3R2aWRlb3Rlc3RzcmMuYzoKKwkoZ3N0X3ZpZGVvdGVzdHNyY19jbGFzc19pbml0KSwgKGdzdF92aWRlb3Rlc3RzcmNfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3ZpZGVvdGVzdHNyY19pbml0KSwgKGdzdF92aWRlb3Rlc3RzcmNfZ2V0KSwKKwkoZ3N0X3ZpZGVvdGVzdHNyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3ZpZGVvdGVzdHNyY19nZXRfcHJvcGVydHkpOgorCSogZ3N0L3ZpZGVvdGVzdHNyYy9nc3R2aWRlb3Rlc3RzcmMuaDoKKyAgICAgICAgICBhZGQgbnVtLWJ1ZmZlcnMgcHJvcGVydHkKKworCTIwMDQtMDQtMjYgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKHBsdWdpbl9pbml0KToKKwkgIHNldCBpZDNtdXggcmFuayB0byBOT05FIHNvIGl0IGRvZXNuJ3QgY29uZnVzZSBzcGlkZXIKKwkgIHJlcXVpcmUgYXVkaW8vbXBlZyxtcGVndmVyc2lvbj0xIGluIGlkM211eAorCisyMDA0LTA0LTI2ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGRldGVjdCBmYWFkIGNvcnJlY3RseSBhcyBub24td29ya2luZyBpZiBpdCdzIGluZGVlZCBub24td29ya2luZworCisyMDA0LTA0LTI2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBNYWtlZmlsZS5hbToKKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzogKGdzdF9qcGVnZW5jX2dldF90eXBlKSwKKwkoZ3N0X2pwZWdlbmNfY2xhc3NfaW5pdCksIChnc3RfanBlZ2VuY19nZXRjYXBzKToKKyAgICAgICAgZml4IF9nZXRjYXBzIHNvIGl0IG9ubHkgbmVnb3RpYXRlcyB0byBpdHMgc3VwcG9ydGVkIGZvcm1hdAorCisyMDA0LTA0LTI1ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChfZml4YXRlX2NhcHNfdG9faW50KToKKwkgIGZpeCBtZW1sZWFrCisKKzIwMDQtMDQtMjMgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOiAoZ3N0X3JpZmZfY3JlYXRlX2F1ZGlvX2NhcHMpOgorCSAgYXVkaW8veC1yYXctaW50IHdpdGggaGVpZ2h0IHJ1bGVzISBub3QuIE5vdyBpdCdzIGRlcHRoLgorCisyMDA0LTA0LTIyICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9jcmVhdGVfc291cmNlcGFkKSwKKwkoZ3N0X3dhdnBhcnNlX3BhcnNlX2ZtdCksIChnc3Rfd2F2cGFyc2VfaGFuZGxlX3NpbmtfZXZlbnQpLAorCShnc3Rfd2F2cGFyc2VfbG9vcCk6CisJICBNaXNzaW5nIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uLiBBZGQgaGFuZGxpbmcgb2YgRFZJIEFEUENNLiBGaXgKKwkgIG1pcy1wYXJzaW5nIG9mIExJU1QgY2h1bmtzLiBUaGlzIHdvcmtzIGFyb3VuZCBhIGJ1ZyB3aGVyZSB3ZSBtaXMtCisJICBwYXJzZSBub24tYWxpZ25pbmcgTElTVCBjaHVua3MgKHNvIExJU1QgY2h1bmtzIHdoZXJlIHRoZSBjb250ZW50cworCSAgZG9uJ3QgYWxpZ24gd2l0aCB0aGUgYWN0dWFsIExJU1Qgc2l6ZSkuIFRoZSBjb3JyZWN0IGZpeCBpcyB0byB1c2UKKwkgIHJpZmZsaWIsIEknbSBub3QgZ29pbmcgdG8gZml4IHdhdnBhcnNlIC0gdG9vIG11Y2ggd29yay4gQWxsIHRoaXMKKwkgIGZpeGVzICMxMDQ4NzguCisKKzIwMDQtMDQtMjIgIFphaGVlciBBYmJhcyBNZXJhbGkgIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKworCXJldmlld2VkIGJ5IEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L3Nob3V0L2dzdHNob3V0LmM6IChnc3RfaWNlY2FzdHNlbmRfY2hhbmdlX3N0YXRlKToKKwkgIGZpeCBzaG91dGNhc3Qgbm90IHdvcmtpbmcgKGZpeGVzICMxNDA4NDQpCisKKzIwMDQtMDQtMjIgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2hlcm1lcy9nc3RoZXJtZXNjb2xvcnNwYWNlLmM6CisJKGdzdF9oZXJtZXNfY29sb3JzcGFjZV9jYXBzX3JlbW92ZV9mb3JtYXRfaW5mbyk6CisJKiBnc3QvY29sb3JzcGFjZS9nc3Rjb2xvcnNwYWNlLmM6CisJKGdzdF9jb2xvcnNwYWNlX2NhcHNfcmVtb3ZlX2Zvcm1hdF9pbmZvKToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvbG9yc3BhY2UuYzoKKwkoZ3N0X2ZmbXBlZ2NvbG9yc3BhY2VfY2Fwc19yZW1vdmVfZm9ybWF0X2luZm8pOgorCSAgcy9nc3RfY2Fwc19zaW1wbGlmeS9nc3RfY2Fwc19kb19zaW1wbGlmeS8KKworMjAwNC0wNC0yMiAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6CisJKGdzdF9yaWZmX2NyZWF0ZV92aWRlb19jYXBzX3dpdGhfZGF0YSk6CisJICBtcGVndmVyc2lvbiBpcyBhbiBpbnQKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX2Jhc2VfaW5pdCk6CisJICBkb24ndCB0cnkgdG8gY3JlYXRlIHBhZCB0ZW1wbGF0ZXMgd2l0aCBOVUxMIGNhcHMsIHVzZSBhbnkgY2FwcworCSAgaW5zdGVhZC4KKworMjAwNC0wNC0yMCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvc2RsL01ha2VmaWxlLmFtOiBMaW5rIGFnYWluc3QgbGliZ3N0aW50ZXJmYWNlcywgbm90CisJbGliZ3N0eG92ZXJsYXkuICBqbW12QG1lbnRhLm5ldCAoSnVsaW8gTS4gTWVyaW5vIFZpZGFsKQorCShidWcgIzE0MDM4NCkKKworMjAwNC0wNC0yMCAgRGFuaWVsIEdhemFyZCAgPGRhbmllbC5nYXphcmRAZXBpdGEuZnI+CisKKwlyZXZpZXdlZCBieSBEYXZpZCBTY2hsZWVmCisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IEFkZCBzdGRsaWIuaAorCSogZ3N0L3J0cC9nc3RydHBnc21lbmMuYzogc2FtZQorCSogZ3N0L3RhZ3MvZ3N0aWQzdGFnLmM6IHNhbWUKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2dldCk6IEZpeCBHU1RfRElTQUJMRV9MT0FEU0FWRQorCSogZ3N0L3RjcC9nc3R0Y3BzaW5rLmM6IChnc3RfdGNwc2lua19zaW5rX2xpbmspOiBBZGp1c3QKKwlHU1RfRElTQUJMRV9MT0FEU0FWRSB1c2UuCisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuYzogKGdzdF91ZHBzaW5rX3NpbmtfbGluayk6IExpa2V3aXNlLgorCSogZ3N0L3RjcC9nc3R0Y3BzcmMuYzogKGdzdF90Y3BzcmNfZ2V0KTogTGlrZXdpc2UuCisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzcmMuYzogSW5jbHVkZSA8c3RkbGliLmg+IChuZWVkZWQgYnkKKwlhdG9sKDMpKS4KKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5oOiBJbmNsdWRlIDxzeXMvdHlwZXMuaD4gKG5lZWRlZCBmb3IgZGV2X3QpLgorCSogZ3N0L3RhZ3MvZ3N0dm9yYmlzdGFnLmM6IEluY2x1ZGUgPHN0ZGxpYi5oPiAobmVlZGVkIGJ5CisJc3RydG91bCgzKSkuCisJKiBnc3QvcnRwL2dzdHJ0cEwxNmVuYy5jOiBJbmNsdWRlIDxzdGRsaWIuaD4gKG5lZWRlZCBieSByYW5kb20oMykpLgorCSogZXh0L21hZC9NYWtlZmlsZS5hbTogKGxpYmdzdG1hZF9sYV9DRkxBR1MpOiBBZGQgJChNQURfQ0ZMQUdTKQorCSQoSUQzX0NGTEFHUykuCisJKiBleHQvbGliZmFtZS9NYWtlZmlsZS5hbTogKGxpYmdzdGxpYmZhbWVfbGFfQ0ZMQUdTKTogQWRkCisJJChMSUJGQU1FX0NGTEFHUykuCisKKzIwMDQtMDQtMjAgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3JlYWxtZWRpYS9ybWRlbXV4LmM6ICBUaGlzIHdhcyBzdXBwb3NlZCB0byBwYXJ0IG9mIHRoZQorCWxhc3QgY2hlY2tpbi4gIFNhbWUgaWRlYS4KKworMjAwNC0wNC0yMCAgRGFuaWVsIEdhemFyZCAgPGRhbmllbC5nYXphcmRAZXBpdGEuZnI+CisKKwlyZXZpZXdlZCBieSBEYXZpZCBTY2hsZWVmCisKKwkqIGNvbmZpZ3VyZS5hYzogYnVtcCByZXF1aXJlZCBnc3RyZWFtZXIgdmVyc2lvbiB0byAwLjguMS4xCisJYmVjYXVzZSBvZiBmb2xsb3dpbmcgY2hhbmdlcyBbLS1kc10KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6ICBJbmNsdWRlIGdzdC9nc3R1dGlscy5oLgorCShnc3RfcmlmZl9wZWVrX2hlYWQsIGdzdF9yaWZmX3BlZWtfbGlzdCwgZ3N0X3JpZmZfcmVhZF9saXN0KQorCShnc3RfcmlmZl9yZWFkX2hlYWRlcik6ICBVc2UgR1NUX1JFQURfVUlOVCoKKwltYWNyb3MgdG8gYWNjZXNzIHBvc3NpYmx5IHVuYWxpZ25lZCBtZW1vcnkuCisKKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiBJbmNsdWRlIGdzdC9nc3R1dGlscy5oLgorCShtcDNfdHlwZV9maW5kKTogIFVzZSBHU1RfUkVBRF9VSU5UKgorCW1hY3JvcyB0byBhY2Nlc3MgcG9zc2libHkgdW5hbGlnbmVkIG1lbW9yeS4KKwkobXAzX3R5cGVfZmluZCwgbXBlZzFfcGFyc2VfaGVhZGVyLCBxdF90eXBlX2ZpbmQpCisJKHNwZWV4X3R5cGVfZmluZCk6IExpa2V3aXNlCisKKwkqIGdzdC90YWdzL2dzdHZvcmJpc3RhZy5jOiAoQURWQU5DRSk6IExpa2V3aXNlCisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogSW5jbHVkZSBzdGRsaWIuaCAobmVlZGVkIGJ5IHJlYWxsb2MpLgorCShRVERFTVVYX0dVSU5UMzJfR0VULCBRVERFTVVYX0dVSU5UMTZfR0VULCBRVERFTVVYX0ZQMzJfR0VUKQorCShRVERFTVVYX0ZQMTZfR0VULCBRVERFTVVYX0ZPVVJDQ19HRVQpCisJKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyLCBnc3RfcXRkZW11eF9sb29wX2hlYWRlcikKKwkocXRkZW11eF9ub2RlX2R1bXBfZm9yZWFjaCwgcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlKQorCShxdGRlbXV4X3RyZWVfZ2V0X3NpYmxpbmdfYnlfdHlwZSk6ICBVc2UgR1NUX1JFQURfVUlOVCoKKwltYWNyb3MgdG8gYWNjZXNzIHBvc3NpYmx5IHVuYWxpZ25lZCBtZW1vcnkuCisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYWNrZXRpemUuYzogKHBhcnNlX2dlbmVyaWMsIHBhcnNlX2NodW5rKToKKwlMaWtld2lzZS4KKworCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2RlbXV4LmM6IChnc3RfbXBlZ19kZW11eF9wYXJzZV9zeXNoZWFkKQorCShnc3RfbXBlZ19kZW11eF9wYXJzZV9wYWNrZXQsIGdzdF9tcGVnX2RlbXV4X3BhcnNlX3Blcyk6IExpa2V3aXNlLgorCisJKiBnc3QvbXBlZ2F1ZGlvcGFyc2UvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzogKGdzdF9tcDNwYXJzZV9jaGFpbik6CisJTGlrZXdpc2UuCisKKwkqIGdzdC9tcGVnMnN1Yi9nc3RtcGVnMnN1YnQuYzogKEdTVF9CVUZGRVJfREFUQSkKKwkoZ3N0X21wZWcyc3VidF9jaGFpbl9zdWJ0aXRsZSk6IExpa2V3aXNlLgorCisJKiBnc3QvbXBlZzF2aWRlb3BhcnNlL2dzdG1wMXZpZGVvcGFyc2UuYzogKG1wMXZpZGVvcGFyc2VfcGFyc2Vfc2VxKQorCShnc3RfbXAxdmlkZW9wYXJzZV90aW1lX2NvZGUsIGdzdF9tcDF2aWRlb3BhcnNlX3JlYWxfY2hhaW4pOgorCUxpa2V3aXNlLgorCisJKiBnc3QvbXBlZzFzeXMvYnVmZmVyLmM6IChtcGVnMW11eF9idWZmZXJfdXBkYXRlX2F1ZGlvX2luZm8pOgorCUxpa2V3aXNlLgorCisJKiBnc3QvY2R4YXBhcnNlL2dzdGNkeGFwYXJzZS5jOiAoZ3N0X2J5dGVzdHJlYW1fcGVla19ieXRlcyk6CisJTGlrZXdpc2UuCisKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoX3JlYWRfdmFyX2xlbmd0aCwgX3JlYWRfdWludCk6CisJTGlrZXdpc2UuCisKKzIwMDQtMDQtMjAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKyAgICAgICAgICB1cGRhdGUgcmVxdWlyZWQgdmVyc2lvbiBvZiBHU3RyZWFtZXIgYmVjYXVzZSBvZiBHU1RfVElNRV9GT1JNQVQKKworMjAwNC0wNC0yMCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfaW5pdCk6CisJICByZW1vdmUgbGVmdG92ZXIgZ19wcmludAorCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKGdzdF9hdWRpb19jb252ZXJ0X2xpbmspOgorCSAgZG9uJ3QgdHJ5IHNldHRpbmcgb25seSBhIHN1YnNldCBvZiB0aGUgY2Fwcy4gV2UgZG9uJ3Qgd2FudCB0byBraWxsCisJICBhdXRvcGx1Z2dpbmcgb24gcHVycG9zZQorCisyMDA0LTA0LTIwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKHBsdWdpbl9pbml0KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChwbHVnaW5faW5pdCk6CisgICAgICAgICAgYWRkIGRlYnVnZ2luZyBjYXRlZ29yaWVzCisKKzIwMDQtMDQtMjAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHBvL2VuX0dCLnBvOgorICAgICAgICAqIHBvL0xJTkdVQVM6CisgICAgICAgICAgQWRkaW5nIGVuX0dCIHRyYW5zbGF0aW9uIChHYXJldGggT3dlbikKKworMjAwNC0wNC0yMCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9oYW5kbGVfc2lua19ldmVudCksCisJKHF0ZGVtdXhfcGFyc2UpLCAocXRkZW11eF90eXBlX2dldCksIChxdGRlbXV4X2R1bXBfbXZoZCksCisJKHF0ZGVtdXhfZHVtcF90a2hkKSwgKHF0ZGVtdXhfZHVtcF9zdHNkKSwgKHF0ZGVtdXhfZHVtcF91bmtub3duKSwKKwkocXRkZW11eF9wYXJzZV90cmFrKSwgKHF0ZGVtdXhfdmlkZW9fY2FwcyksIChxdGRlbXV4X2F1ZGlvX2NhcHMpOgorCUEgbnVtYmVyIG9mIG5ldyBmZWF0dXJlcyBhbmQgaGFja3MgdG8gZXh0cmFjdCB0aGUgZXNkcyBhdG9tIGFuZAorCXB1dCBpdCBpbnRvIHRoZSBjYXBzLiAgKGJ1ZyAjMTM3NzI0KQorCisyMDA0LTA0LTE5ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdjb25mL01ha2VmaWxlLmFtOiBGaXggZm9yIG5vbi1HTlUgbWFrZQorCSogZ3N0LWxpYnMvZ3N0L01ha2VmaWxlLmFtOiBDaGFuZ2UgZGlyZWN0b3J5IG9yZGVyIHRvIGhhbmRsZQorCUdzdFBsYXkgbGlua2luZyB3aXRoIGdzdGludGVyZmFjZXMKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9tYWtlX2ZpbHRlcjogbWFrZSB1c2Ugb2YgdHIgcG9ydGFibGUKKwkqIGdzdC1saWJzL2dzdC9wbGF5L01ha2VmaWxlLmFtOiBBZGQgaW50ZW5kZWQgXAorCSogZ3N0LWxpYnMvZ3N0L3h3aW5kb3dsaXN0ZW5lci94d2luZG93bGlzdGVuZXIuYzoKKwkoZ3N0X3h3aW5fc2V0X2NsaXBzKTogU3dpdGNoIHRvIElTTyB2YXJpYWRpYyBtYWNyby4gVXNlIGEKKwlmdW5jdGlvbiBwcm90b3R5cGUgaW5zdGVhZCBvZiB2b2lkICouCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2RlY21hcC5jOiBTd2l0Y2ggdG8gSVNPIHZhcmlhZGljCisJbWFjcm8uCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2xvcnNwYWNlLmM6CisJKGdzdF9mZm1wZWdjb2xvcnNwYWNlX2NoYWluKTogd3JhcCBOVUxMIGluIEdTVF9FTEVNRU5UX0VSUk9SIGNhbGwKKwkqIGdzdC92aWRlb2ZpbHRlci9tYWtlX2ZpbHRlcjogbWFrZSB1c2Ugb2YgdHIgcG9ydGFibGUKKwkqIHBrZ2NvbmZpZy9NYWtlZmlsZS5hbTogUmVtb3ZlIEdOVSBleHRlbnNpb24gaW4gTWFrZWZpbGUgdGFyZ2V0CisKKzIwMDQtMDQtMTkgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHBvL0xJTkdVQVM6CisJKiBwby91ay5wbzoKKyAgICAgICAgICBBZGRlZCBVa3JhaW5pYW4gdHJhbnNsYXRpb24gKE1heGltIFYuIER6aXVtYW5lbmtvKQorCisyMDA0LTA0LTE4ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZ3NtL2dzdGdzbWRlYy5jOiAoZ3N0X2dzbWRlY19pbml0KSwgKGdzdF9nc21kZWNfZ2V0Y2FwcyksCisJKGdzdF9nc21kZWNfbGluayksIChnc3RfZ3NtZGVjX2NoYWluKToKKwkgIEZpeCBjYXBzbmVnbywgc2ltcGxpZnkgY2hhaW4gZnVuY3Rpb24gc2xpZ2h0bHkuCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChxdGRlbXV4X2F1ZGlvX2NhcHMpOgorCSAgQWRkIEdTTS4KKworMjAwNC0wNC0xOCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfaW5pdCksCisJKGdzdF93YXZwYXJzZV9kZXN0cm95X3NvdXJjZXBhZCksIChnc3Rfd2F2cGFyc2VfY3JlYXRlX3NvdXJjZXBhZCksCisJKGdzdF93YXZwYXJzZV9wYXJzZV9mbXQpLCAoZ3N0X3dhdnBhcnNlX2NoYW5nZV9zdGF0ZSk6CisJICBIYWNrIHRvIG1ha2Ugd2F2cGFyc2Ugd29yayB3aXRoIHNwaWRlciAoYWx3YXlzIC0+IHNvbWV0aW1lcyBwYWQpLgorCSAgRml4ZXMgIzEzNTg2MiAmJiAjMTQwNDExLgorCisyMDA0LTA0LTE4ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiAoZ3N0X29zc2VsZW1lbnRfc3luY19wYXJtcyksCisJKGdzdF9vc3NlbGVtZW50X3JhdGVfcHJvYmVfY2hlY2spLAorCShnc3Rfb3NzZWxlbWVudF9yYXRlX2NoZWNrX3JhdGUpLCAoZ3N0X29zc2VsZW1lbnRfcmF0ZV9hZGRfcmF0ZSk6CisJICBnZXQgcmlkIG9mIFxuIGluIGRlYnVnIG91dHB1dAorCisyMDA0LTA0LTE3ICBJYWluIDxpYWluQHByZXR0eXBlb3BsZS5vcmc+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jIChnc3Rfd2F2cGFyc2VfbG9vcCk6IEFsbG93IGFsbCBldmVudHMsCisJbm90IGp1c3QgRU9TLgorCisyMDA0LTA0LTE3ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfaWQzX3RhZ19nZXRfdHlwZSksCisJKGdzdF9pZDNfdGFnX2NsYXNzX2luaXQpLCAoZ3N0X2lkM190YWdfZ2V0X2NhcHMpLAorCShnc3RfaWQzX3RhZ19hZGRfc3JjX3BhZCksIChnc3RfaWQzX3RhZ19pbml0KSwKKwkoZ3N0X2lkM190YWdfc2V0X3Byb3BlcnR5KSwgKGdzdF9pZDNfdGFnX2RvX2NhcHNfbmVnbyksCisJKGdzdF9pZDNfdGFnX3NyY19saW5rKSwgKGdzdF9pZDNfdGFnX2NoYWluKSwKKwkoZ3N0X2lkM190YWdfY2hhbmdlX3N0YXRlKSwgKHBsdWdpbl9pbml0KToKKwkgIGRlcHJlY2F0ZSBpZDN0YWcgZWxlbWVudCBhbmQgcmVwbGFjZSB3aXRoIGlkM2RlbXV4L2lkM211eC4KKwkgIGdyZWF0IHNpZGUgZWZmZWN0OiB0aGlzIHVnbHkgZmlsZSBpcyBub3cgZXZlbiB1Z2xpZXIsIHlheSEKKwkqIGV4dC9tYWQvZ3N0bWFkLmg6CisJICByZW1vdmUgbm9uLWF2YWlsYWJsZSBmdW5jdGlvbgorCSAgdXBkYXRlIGZvciBuZXcgZ2V0X3R5cGUKKworMjAwNC0wNC0xNyAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBjb25maWd1cmUuYWM6CisJICByZXF1aXJlIG1wZWcyZGVjID49IDAuNC4wCisKKzIwMDQtMDQtMTcgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19nZXRfeHZfc3VwcG9ydCksCisJKGdzdF94dmltYWdlc2lua194Y29udGV4dF9nZXQpLCAoZ3N0X3h2aW1hZ2VzaW5rX2NoYW5nZV9zdGF0ZSksCisJKGdzdF94dmltYWdlc2lua19zZXRfeHdpbmRvd19pZCk6CisJICBjYWxsIEdTVF9FTEVNRU5UX0VSUk9SIHdoZW5ldmVyIGdldF94Y29udGV4dCBmYWlscy4gSW5jbHVkZXMKKwkgIGFzc29ydGVkIGNsZWFudXAgZml4ZXMuCisKKzIwMDQtMDQtMTYgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmg6IENvbXBpbGUgZml4IGZvciBGcmVlQlNELiAoYnVnICMxNDAyNjgpCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5oOiBzYW1lCisKKzIwMDQtMDQtMTYgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3NpbmsuYzogKGdzdF9nbm9tZXZmc3Npbmtfb3Blbl9maWxlKToKKyAgICAgICAgICBGaXggR1NUX0VMRU1FTlRfRVJST1Igd2l0aCAoTlVMTCkKKworMjAwNC0wNC0xNSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOgorCShnc3RfcmlmZl9jcmVhdGVfdmlkZW9fY2Fwc193aXRoX2RhdGEpOgorCSAgQWRkIGRpdlszNDU2XSBhcyBmb3VyY2NzIGZvciBEaXZYIDMgKGZpeGVzICMxNDAxMzcpLgorCisyMDA0LTA0LTE1ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6CisJKGdzdF9yaWZmX2NyZWF0ZV92aWRlb19jYXBzX3dpdGhfZGF0YSksCisJKGdzdF9yaWZmX2NyZWF0ZV92aWRlb19jYXBzKSwgKGdzdF9yaWZmX2NyZWF0ZV9hdWRpb19jYXBzKSwKKwkoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX3RlbXBsYXRlX2NhcHMpLAorCShnc3RfcmlmZl9jcmVhdGVfYXVkaW9fdGVtcGxhdGVfY2Fwcyk6CisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmg6CisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuYzoKKwkoZ3N0X3JpZmZfcmVhZF9zdHJmX3ZpZHNfd2l0aF9kYXRhKSwgKGdzdF9yaWZmX3JlYWRfc3RyZl92aWRzKToKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5oOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9hZGRfc3RyZWFtKToKKwkgIEFkZCBNUyBSTEUgc3VwcG9ydC4gSSBhZGRlZCBzb21lIGZ1bmN0aW9ucyB0byByZWFkIG91dCBzdHJmIGNodW5rcworCSAgaW50byBzdHJmIGNodW5rcyBhbmQgdGhlIGRhdGEgYmVoaW5kIGl0LiBUaGlzIGlzIHVzdWFsbHkgY29sb3IKKwkgIHBhbGV0dGVzIChhcyBpbiBSTEUsIGJ1dCBhbHNvIGluIDgtYml0IFJHQikuIEFsc28gdXNlIHRob3NlIGR1cmluZworCSAgY2FwcyBjcmVhdGlvbi4gTGFzdGx5LCBhZGQgQURQQ00gKHNpbWlsYXIgdG8gd2F2cGFyc2UgLSB3aGljaAorCSAgc2hvdWxkIGV2ZW50dWFsbHkgYmUgcmlmZmxpYiBiYXNlZCkuCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzogKGdzdF9tYXRyb3NrYV9kZW11eF9jbGFzc19pbml0KSwKKwkoZ3N0X21hdHJvc2thX2RlbXV4X2luaXQpLCAoZ3N0X21hdHJvc2thX2RlbXV4X3Jlc2V0KToKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oOgorCSAgUmVtb3ZlIHBsYWNlaG9sZGVycyBmb3Igc29tZSBwcmVoaXN0b3JpYyB0YWdnaW5nIHN5c3RlbS4gRGlkbid0IGFkZAorCSAgc3VwcG9ydCBmb3IgYW55IHRhZyBzeXN0ZW0gcmVhbGx5IGFueXdheS4KKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzoKKwkgIEFkZCBzdXBwb3J0IGZvciBhdWRpby94LW00YSAoTVBFRy00KSB0aHJvdWdoIHNwaWRlci4KKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3BhcnNlX2ZtdCksCisJKGdzdF93YXZwYXJzZV9sb29wKToKKwkgIEFEUENNIHN1cHBvcnQgKCMxMzU4NjIpLiBJbmNyZWFzZSBtYXguIGJ1ZmZlciBzaXplIGJlY2F1c2Ugd2UKKwkgIGNhbm5vdCBzcGxpdCBidWZmZXJzIGZvciBBRFBDTSAoc2NyZXdzIHJlZmVyZW5jZXMpIGFuZCBJJ3ZlIHNlZW4KKwkgIGZpbGVzIHdpdGggMjA0OCBieXRlIGNodW5rcy4gNDA5NiBzZWVtcyBzYWZlIGZvciBub3cuCisKKzIwMDQtMDQtMTUgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogYnVtcCBuYW5vIHRvIDEKKworPT09IHJlbGVhc2UgMC44LjEgPT09CisKKzIwMDQtMDQtMTUgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogcmVsZWFzaW5nIDAuOC4xLCAiQ29tZm9ydGluZyBTb3VuZHMiCisKKzIwMDQtMDQtMTQgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzogKGdzdF9yaWZmX2NyZWF0ZV92aWRlb19jYXBzKToKKwkgIEZpeCB0eXBvIGluIGRpdnh2ZXJzaW9uICgzIGluc3RlYWQgb2YgNCBmb3IgIkRJVlgiIGZvdXJjYykuCisJICBGaXhlcyAjMTQwMDU4CisKKzIwMDQtMDQtMTQgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdGR2ZGRlbXV4LmM6IChnc3RfZHZkX2RlbXV4X3BsdWdpbl9pbml0KToKKyAgICAgICAgICBsb3dlciByYW5rIG9mIGR2ZGRlbXV4IHNvIHRoYXQgaXQncyBub3QgdXNlZCBmb3IgbXBlZyBwbGF5YmFjay4KKworMjAwNC0wNC0xNCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBjb25maWd1cmUuYWM6CisJICBzYXZlIGxpYnMgY29ycmVjdGx5IHdoZW4gY2hlY2tpbmcgbWFkCisKKzIwMDQtMDQtMTQgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChwbHVnaW5faW5pdCk6CisgICAgICAgICAgbG93ZXIgcmFuayBvZiBpZDN0YWcgYXMgcHJvcG9zZWQgYnkgQmVuamFtaW4uICBGaXhlcyAjMTM5OTI2LgorCisyMDA0LTA0LTEzICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGNvbW1vbi9tNC9nc3QtZmVhdHVyZS5tNDogQ2FsbCAtY29uZmlnIHNjcmlwdHMgd2l0aAorCS0tcGx1Z2luLWxpYnMgaWYgaXQgaXMgc3VwcG9ydGVkLgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmltdXhfdmlkc2lua2Nvbm5lY3QpOiBzZXF1ZW5jZXMgb2YKKwlKUEVHIGltYWdlcyBhcmUgaW1hZ2UvanBlZy4KKwkqIGdzdC9kZWJ1Zy9NYWtlZmlsZS5hbToKKwkqIGdzdC9kZWJ1Zy9uZWdvdGlhdGlvbi5jOiAoZ3N0X25lZ290aWF0aW9uX2NsYXNzX2luaXQpLAorCShnc3RfbmVnb3RpYXRpb25fZ2V0Y2FwcyksIChnc3RfbmVnb3RpYXRpb25fcGFkX2xpbmspLAorCShnc3RfbmVnb3RpYXRpb25fdXBkYXRlX2NhcHMpLCAoZ3N0X25lZ290aWF0aW9uX2dldF9wcm9wZXJ0eSksCisJKGdzdF9uZWdvdGlhdGlvbl9wbHVnaW5faW5pdCk6IEFkZCBhIHByb3BlcnR5IHRoYXQgYWN0cyBsaWtlCisJZmlsdGVyIGNhcHMuCisJKiB0ZXN0c3VpdGUvZ3N0LWxpbnQ6ICBNb3ZlIGxpY2Vuc2UgY2hlY2tpbmcgdG8gYmUgYSBzdGFuZGFyZAorCXRlc3QuCisKKzIwMDQtMDQtMTMgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9yZXNldCk6IEZpeCBtZW1sZWFrLgorCXBhdGNoIGZyb20gU2ViYXN0aWVuIENvdGUgKGJ1ZyAjMTM5OTU4KQorCisyMDA0LTA0LTEzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleGFtcGxlcy9nc3RwbGF5L01ha2VmaWxlLmFtOgorCSogZXhhbXBsZXMvZ3N0cGxheS9wbGF5ZXIuYzogKG1haW4pOgorICAgICAgICAgIG1ha2UgdGhlIGNvbW1hbmRsaW5lIHBsYXllciBleGFtcGxlIHVzZSBnY29uZiBzZXR0aW5ncworCisyMDA0LTA0LTEzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOiAoZ3N0X2NhY2FzaW5rX2NsYXNzX2luaXQpLAorCShnc3RfY2FjYXNpbmtfc2lua2Nvbm5lY3QpLCAoZ3N0X2NhY2FzaW5rX2luaXQpLAorCShnc3RfY2FjYXNpbmtfY2hhaW4pLCAoZ3N0X2NhY2FzaW5rX29wZW4pLCAoZ3N0X2NhY2FzaW5rX2Nsb3NlKToKKyAgICAgICAgICBpbml0L2VuZCBsaWJyYXJ5IGR1cmluZyBzdGF0ZSB0cmFuc2l0aW9uLCBub3Qgb2JqZWN0CisgICAgICAgICAgY3JlYXRpb24vZGlzcG9zYWwuICBnZXQgcmlkIG9mIGN1c3RvbSBkaXNwb3NlIGhhbmRsZXIuCisKKworMjAwNC0wNC0xMiAgQ2hyaXN0aWFuIFNjaGFsbGVyIDxVcmFldXNAZ25vbWUub3JnPgorCisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogcy9sc3RhdC9zdGF0LyBmcm9tIGZyZWVCU0QsIHNpbmNlIGl0IGNhbgorCWJlIGEgc3ltbGluaworCisyMDA0LTA0LTExICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3N0cmVhbV9kYXRhKToKKwkgIEhhbmRsZSBKVU5LIGNodW5rcyBpbnNpZGUgZGF0YSBzZWN0aW9uLiBQcmV2ZW50cyB3YXJuaW5ncy4KKworMjAwNC0wNC0xMSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOiAoZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX2NhcHMpLAorCShnc3RfcmlmZl9jcmVhdGVfdmlkZW9fdGVtcGxhdGVfY2Fwcyk6CisJICBBZGQgTVMgdmlkZW8gdjEuCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IChnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleCksCisJKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2RhdGEpOgorCSAgQWRkIHN1cHBvcnQgZm9yICJyZWMtbGlzdCIgY2h1bmtzLgorCisyMDA0LTA0LTExICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6IChnc3RfcmlmZl9jcmVhdGVfYXVkaW9fY2Fwcyk6CisJICBGaXggYW5vdGhlciBjb2RlY25hbWUgbWlzbWF0Y2guCisKKzIwMDQtMDQtMTEgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtbWVkaWEuYzogKGdzdF9yaWZmX2NyZWF0ZV92aWRlb19jYXBzKToKKwkgIEZpeCBkaXZ4IGNhcHMgbWlzbWF0Y2ggYW5kIG1vdmUgZnJvbSB2aWRlby94LWpwZWcgdG8gaW1hZ2UvanBlZworCSAgc28gdGhhdCBNSlBFRyBwbGF5cyBiYWNrLgorCisyMDA0LTA0LTEwICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbXBlZzF2aWRlb3BhcnNlL2dzdG1wMXZpZGVvcGFyc2UuYzogKGdzdF9tcDF2aWRlb3BhcnNlX2luaXQpLAorCShnc3RfbXAxdmlkZW9wYXJzZV9yZWFsX2NoYWluKSwgKGdzdF9tcDF2aWRlb3BhcnNlX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvbXBlZzF2aWRlb3BhcnNlL2dzdG1wMXZpZGVvcGFyc2UuaDoKKwkgIEZpeCBmb3Igc29tZSBzbGlnaHQgbWlzLWN1dHMgaW4gYnVmZmVyIHBhcnNpbmcsIGFuZCBmb3Igc29tZQorCSAgcG90ZW50aWFsIG92ZXJmbG93cyBvciBmYXVsdHMtY2F1c2Vycy4gQWRkcyBkaXNjb250cy4gQWxzbyBmaXhlcworCSAgIzEzOTEwNSB3aGlsZSB3ZSdyZSBhdCBpdC4KKworMjAwNC0wNC0xMCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSogc3lzL3Y0bDIvZ3N0djRsMmVsZW1lbnQuaDoKKwkgIFdvcmthcm91bmQgZm9yIG1pc3Npbmcgc3RydWN0IHY0bDJfYnVmZmVyIGRlY2xhcmF0aW9uIGluIFN1c2UgOQorCSAgYW5kIE1hbmRyYWtlIDEwIGxpbnV4L3ZpZGVvZGV2Mi5oIGhlYWRlciBmaWxlICgjMTM1OTE5KS4KKworMjAwNC0wNC0xMCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc2luay5jOiAoZ3N0X2dub21ldmZzc2lua19vcGVuX2ZpbGUpOgorCSAgQmFpbCBvdXQgaWYgbm8gZmlsZW5hbWUgd2FzIGdpdmVuLgorCisyMDA0LTA0LTEwICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY192NGwyZm91cmNjX3RvX2NhcHMpLAorCShnc3RfdjRsMl9mb3VyY2NfZnJvbV9zdHJ1Y3R1cmUpOgorCSAgQWRkIFk0MUIvWTQyQiBZVVYgZm9ybWF0cyAoc2VlICMxMjU3MzIpLCBmaXggWTQxUCAod2FzIHR5cG8nZWQgdG8KKwkgIFk0MUIgc29tZXdoZXJlKS4KKworMjAwNC0wNC0wOSAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzaW5rLmM6CisJKF9nc3RfYm9vbGVhbl9hbGxvd19vdmVyd3JpdGVfYWNjdW11bGF0b3IpLAorCShnc3RfZ25vbWV2ZnNzaW5rX2NsYXNzX2luaXQpOgorCSAgZml4IGVyYXNlIHNpZ25hbCAtIGlmIGFueSBoYW5kbGVyIHJldHVybnMgZmFsc2UgdGhlIGZpbGUgd2lsbCBub3QgYmUKKwkgIG92ZXJ3cml0dGVuLiBJZiBubyBoYW5kbGVyIGlzIGNvbm5lY3RlZCwgdGhlIGZpbGUgd2lsbCBub3QgYmUKKwkgIG92ZXJ3cml0dGVuIGVpdGhlci4KKwkgIHJlbmFtZWQgc2lnbmFsIHRvICJhbGxvdy1vdmVyd3JpdGUiCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAodGFnX2xpc3RfdG9faWQzX3RhZ19mb3JlYWNoKToKKwkgIGZyZWUgc3RyaW5nIHdoZW4gYWRkaW5nIGl0IHRvIElEMyBmYWlsZWQKKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmM6ICh2b3JiaXNfZGVjX2V2ZW50KToKKwkgIHVucmVmIGV2ZW50IHdoZW4gZG9uZQorCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKF9maXhhdGVfY2Fwc190b19pbnQpOgorCSAgZnJlZSBjYXBzCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzoKKwkobXBlZ192aWRlb19zdHJlYW1fdHlwZV9maW5kKToKKwkgIGZpeCBpbnZhbGlkIHJlYWQKKworMjAwNC0wNC0wOCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2xvcnNwYWNlLmM6CisJKGdzdF9mZm1wZWdjb2xvcnNwYWNlX3JlZ2lzdGVyKTogQ2hhbmdlIHJhbmsgdG8gUFJJTUFSWS4KKworMjAwNC0wNC0wOCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvY29sb3JzcGFjZS9nc3Rjb2xvcnNwYWNlLmM6IERvbid0IGFkdmVydGlzZSBhIGNvbnZlcnNpb24KKwl3ZSBkb24ndCBzdXBwb3J0IChidWcgIzEzOTUzMikKKworMjAwNC0wNC0wNyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfaGFuZGxlX2V2ZW50KSwKKwkoZ3N0X21hZF9jaGVja19jYXBzX3Jlc2V0KSwgKGdzdF9tYWRfY2hhaW4pLAorCShnc3RfbWFkX2NoYW5nZV9zdGF0ZSk6CisgICAgICAgICAgb25seSBzZXQgZXhwbGljaXQgY2FwcyBpZiB0aGV5IGhhdmVuJ3QgYmVlbiBzZXQgYmVmb3JlIGZvcgorICAgICAgICAgIHRoaXMgc3RyZWFtLiAgTVBFRy1hdWRpbyBzYW1wbGUgcmF0ZS9jaGFubmVscyBhcmVuJ3QgYWxsb3dlZAorICAgICAgICAgIHRvIGNoYW5nZSBpbi1zdHJlYW0uCisgICAgICAgICAgRml4ZXMgIzEzOTM4MgorCisyMDA0LTA0LTA2ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzaW5rLmM6IChnc3RfZ25vbWV2ZnNzaW5rX2Jhc2VfaW5pdCksCisJKF9nc3RfYm9vbGVhbl9kaWRfc29tZXRoaW5nX2FjY3VtdWxhdG9yKSwKKwkoZ3N0X2dub21ldmZzc2lua19jbGFzc19pbml0KSwgKGdzdF9nbm9tZXZmc3NpbmtfZGlzcG9zZSksCisJKGdzdF9nbm9tZXZmc3NpbmtfaW5pdCksIChnc3RfZ25vbWV2ZnNzaW5rX3NldF9wcm9wZXJ0eSksCisJKGdzdF9nbm9tZXZmc3NpbmtfZ2V0X3Byb3BlcnR5KSwgKGdzdF9nbm9tZXZmc3Npbmtfb3Blbl9maWxlKSwKKwkoZ3N0X2dub21ldmZzc2lua19jbG9zZV9maWxlKSwgKGdzdF9nbm9tZXZmc3NpbmtfY2hhaW4pLAorCShnc3RfZ25vbWV2ZnNzaW5rX2NoYW5nZV9zdGF0ZSk6CisJICBGaXggZXJhc2Ugc2lnbmFsLiBEb24ndCBlcmFzZSBieSBkZWZhdWx0LiBSZW1vdmUgaGFuZG9mZiBzaWduYWwuCisJICBSZW1vdmUgZXJhc2UgcHJvcGVydHkuIERvbid0IHNlZ2ZhdWx0LiBHZW5lcmFsIGNsZWFudXAuCisKKzIwMDQtMDQtMDcgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L2djb25mL3Rlc3QtZ2NvbmYuYzogKG1haW4pOgorCSAgYWRkIG1pc3NpbmcgZ3N0X2luaXQKKworMjAwNC0wNC0wNyAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzcmMuYzogKGdzdF9nbm9tZXZmc3NyY19kaXNwb3NlKToKKwkgIGZyZWUgdGhlIG11dGV4ZXMsIHRvbworCisyMDA0LTA0LTA3ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3NyYy5jOiAoZ3N0X2dub21ldmZzc3JjX2Rpc3Bvc2UpOgorCSAgYWN0dWFsbHkgZnJlZSB0aGUgVVJJIHN0cmluZworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX3NyY19ldmVudCk6CisJICBjb21wdXRlIG9mZnNldCBjb3JyZWN0bHkgd2hlbiBwYXNzaW5nIGRpc2NvbnQgZXZlbnRzCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfaGFuZGxlX2V2ZW50KToKKwkgIGRvbid0IGxlYWsgZGlzY29udCBldmVudHMKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoZ3N0X2FzZl9kZW11eF92aWRlb19jYXBzKToKKwkgIGFkZCBzb21lIG1pc3NpbmcgYnJlYWtzIHNvIGNhcHMgYXJlbid0IGNvcGllZCByYW5kb21seQorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2RlbXV4LmM6IChnc3RfbXBlZ19kZW11eF9nZXRfdmlkZW9fc3RyZWFtKToKKwkgIGlmIHdlIHJlYWxsb2MgbWVtb3J5LCB3ZSBiZXR0ZXIgdXNlIGl0CisKKzIwMDQtMDQtMDYgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L21hZC9nc3RtYWQuYzogKG5vcm1hbF9zZWVrKToKKwkgIGZpeCBHU1RfRk9STUFUX1RJTUUgdXNhZ2UKKworMjAwNC0wNC0wNSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQva2lvL2tpb3NyYy5jcHA6ICBVbmRlZmluZSBLREVfREVQUkVDQVRFRCBzbyB3ZSBjYW4gdXNlCisJYSBkZXByZWNhdGVkIGZ1bmN0aW9uIChoYWNrISkKKworMjAwNC0wNC0wNSAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvZXNkL2VzZG1vbi5jOiAoZ3N0X2VzZG1vbl9nZXQpOgorCSAgZml4IG5vbnRlcm1pbmF0ZWQgdmFyYXJnIGFuZCBtZW1sZWFrCisKKzIwMDQtMDQtMDUgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2xhZHNwYS9nc3RsYWRzcGEuYzogKGdzdF9sYWRzcGFfY2xhc3NfaW5pdCksCisJKGdzdF9sYWRzcGFfaW5pdCksIChnc3RfbGFkc3BhX2ZvcmNlX3NyY19jYXBzKSwKKwkoZ3N0X2xhZHNwYV9zZXRfcHJvcGVydHkpLCAoZ3N0X2xhZHNwYV9nZXRfcHJvcGVydHkpLAorCShnc3RfbGFkc3BhX2luc3RhbnRpYXRlKSwgKGdzdF9sYWRzcGFfYWN0aXZhdGUpLAorCShnc3RfbGFkc3BhX2RlYWN0aXZhdGUpLCAoZ3N0X2xhZHNwYV9sb29wKSwgKGdzdF9sYWRzcGFfY2hhaW4pOgorCSAgY2xlYW4gdXAgZGVidWdnaW5nCisKKzIwMDQtMDQtMDUgIFN0ZWZhbiBLb3N0IDxrb3N0QGltbi5odHdrLWxlaXB6aWcuZGU+CisKKwlyZXZpZXdlZCBieSBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9sYWRzcGEvZ3N0bGFkc3BhLmM6IChnc3RfbGFkc3BhX2NsYXNzX2luaXQpOgorCSAgY2hlY2sgZm9yIGJyb2tlbiBMQURTUEEgcGFyYW1ldGVycyAoZml4ZXMgIzEzODYzNSkKKworMjAwNC0wNC0wNSAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiAoZ3N0X2F1ZGlvX2NvbnZlcnRfZ2V0Y2Fwcyk6CisJICBhZHZlcnRpc2UgYnVmZmVyLWZyYW1lcyBjb3JyZWN0bHkgb24gc2lua3BhZHMKKworMjAwNC0wNC0wNSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfZ2V0X3R5cGUpLCAoZ3N0X21hZF9sYXllcl9nZXRfdHlwZSksCisJKGdzdF9tYWRfbW9kZV9nZXRfdHlwZSksIChnc3RfbWFkX2VtcGhhc2lzX2dldF90eXBlKSwKKwkoZ3N0X21hZF9nZXRfZXZlbnRfbWFza3MpLCAoZ3N0X21hZF9nZXRfcXVlcnlfdHlwZXMpLCAoaW5kZXhfc2VlayksCisJKG5vcm1hbF9zZWVrKSwgKGdzdF9tYWRfc3JjX2V2ZW50KSwgKGdzdF9tYWRfaGFuZGxlX2V2ZW50KSwKKwkoZ3N0X21hZF9jaGVja19jYXBzX3Jlc2V0KSwgKGdzdF9tYWRfY2hhaW4pOgorICAgICAgICBhZGQgbW9yZSBkZWJ1Z2dpbmcsIG9ubHkgcmVzZXQgY2FwcyB3aGVuIHdlJ3JlIG5vdCBpbiBlcnJvciBzdGF0ZQorCisyMDA0LTA0LTA1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvbWFkL2dzdG1hZC5jOiBhZGQgZGVidWdnaW5nIGNhdGVnb3J5LCBjb21tZW50ICsgY2xlYW51cHMKKworMjAwNC0wNC0wNSAgSnVsaW8gTS4gTWVyaW5vIFZpZGFsICA8am1tdkBtZW50YS5uZXQ+CisKKwlyZXZpZXdlZCBieSBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIGZpeCA9PSBpbiB0ZXN0KDEpIG9wZXJhdG9yCisKKzIwMDQtMDQtMDUgIEp1bGlvIE0uIE1lcmlubyBWaWRhbCAgPGptbXZAbWVudGEubmV0PgorCisJcmV2aWV3ZWQgYnkgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJICBmaXggLS1leHBvcnQtc3ltYmxvcy1yZWdleCB0byBhIHdvcmtpbmcgcmVnZXguCisKKzIwMDQtMDQtMDQgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogc3lzL29zcy8uY3ZzaWdub3JlOgorCSAgYWRkIGZvciBvc3NfcHJvYmUKKworMjAwNC0wNC0wMyAgVGltLVBoaWxsaXAgTcO8bGxlciA8dC5pLm1AemVuLmNvLnVrPgorCisJcmV2aWV3ZWQgYnkgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfaGFuZGxlX2V2ZW50KToKKwkgIGFkZCBtaXNzaW5nICduZXdfbWVkaWEnIGFyZ3VtZW50IChmaXhlcyAjMTM4MTY4KQorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6CisJKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc2Vla19ldmVudCk6CisJICBhZGQgdmFyYXJnIHRlcm1pbmF0b3IgKGZpeGVzICMxMzgxNjkpCisKKzIwMDQtMDQtMDIgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2dka19waXhidWYvTWFrZWZpbGUuYW06ICBNYWtlIHN1cmUgZ3N0Z2RrYW5pbWF0aW9uLmggaXMKKwlkaXN0ZWQgKGJ1ZyAjMTM4OTE0KQorCisyMDA0LTA0LTAxICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9hbHNhX2Nsb3NlX2F1ZGlvKToKKwkgIGhhbmRsZSBjYXNlIGJldHRlciB3aGVyZSBhIHNvdW5kY2FyZCBjYW4ndCBwYXVzZQorCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOgorCSAgZG9uJ3QgY3Jhc2ggd2hlbiB3ZSBnZXQgZXZlbnRzIGJ1dCBkb24ndCBoYXZlIHBhZHMgeWV0CisKKzIwMDQtMDQtMDEgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiAoZ3N0X29zc2VsZW1lbnRfcHJvYmVfY2Fwcyk6CisgICAgICAgICAgdGhyb3cgYW4gZXJyb3IgaWYgd2UgY291bGRuJ3QgcHJvYmUgYW55IGNhcHMuCisKKzIwMDQtMDQtMDEgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZXh0L2R2ZG5hdi9nc3QtZHZkOgorCUFkZCBhIHJlYWxseSBzaW1wbGUgc2FtcGxlIERWRCBwbGF5ZXIKKworMjAwNC0wNC0wMSAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBleHQvYTUyZGVjL2dzdGE1MmRlYy5jOiAoZ3N0X2E1MmRlY19nZXRfdHlwZSksIChnc3RfYTUyZGVjX2luaXQpLAorCShnc3RfYTUyZGVjX3B1c2gpLCAoZ3N0X2E1MmRlY19oYW5kbGVfZXZlbnQpLAorCShnc3RfYTUyZGVjX3VwZGF0ZV9zdHJlYW1pbmZvKSwgKGdzdF9hNTJkZWNfbG9vcCksCisJKGdzdF9hNTJkZWNfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC9hNTJkZWMvZ3N0YTUyZGVjLmg6CisJICBVc2UgYSBkZWJ1ZyBjYXRlZ29yeSwgT3V0cHV0IHRpbWVzdGFtcHMgY29ycmVjdGx5CisJICBFbWl0IHRhZyBpbmZvLCBIYW5kbGUgZXZlbnRzLCB0ZWxsIGxpYmE1MmRlYyBhYm91dCBjcHUKKwkgIGNhcGFiaWxpdGllcyBzbyBpdCBjYW4gdXNlIE1NWCBldGMuCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19sb29wKSwgKGdzdF9kdmRlY19jaGFuZ2Vfc3RhdGUpOgorCSAgRml4IGEgY3Jhc2hlciBhY2Nlc3NpbmcgaW52YWxpZCBtZW1vcnkKKwkqIGV4dC9kdmRuYXYvZHZkbmF2c3JjLmM6IChkdmRuYXZzcmNfaW5pdCksCisJKGR2ZG5hdnNyY191cGRhdGVfaGlnaGxpZ2h0KSwgKGR2ZG5hdnNyY19sb29wKSwKKwkoZHZkbmF2c3JjX2dldF9ldmVudF9tYXNrKSwgKGR2ZG5hdl9oYW5kbGVfbmF2aWdhdGlvbl9ldmVudCksCisJKGR2ZG5hdnNyY19ldmVudCksIChkdmRuYXZzcmNfZ2V0X2Zvcm1hdHMpLCAoZHZkbmF2c3JjX2NvbnZlcnQpLAorCShkdmRuYXZzcmNfcXVlcnkpOgorCSAgU29tZSBzdXBwb3J0IGZvciBieXRlLWZvcm1hdCBzZWVraW5nLgorCSAgU21hbGwgZml4ZXMgZm9yIHN0aWxsIGZyYW1lcyBhbmQgbWVudSBidXR0b24gb3ZlcmxheXMKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOiAoZ3N0X21wZWcyZGVjX2dldF90eXBlKSwKKwkoZ3N0X21wZWcyZGVjX2FsbG9jX2J1ZmZlcik6CisJICBVc2UgYSBkZWJ1ZyBjYXRlZ29yeS4gQWRqdXN0IHRoZSByZXBvcnQgbGV2ZWwgb2Ygc2V2ZXJhbCBpdGVtcyB0bworCSAgTE9HLiBDYWxsIG1wZWcyX2N1c3RvbV9mYnVmIHRvIG1hcmsgb3VyIGJ1ZmZlcnMgYXMgJ2N1c3RvbSBidWZmZXJzJworCSAgc28gaXQgZG9lc24ndCBsb3NlIHRoZSBHc3RCdWZmZXIgcG9pbnRlcgorCSogZ3N0L2RlYnVnL01ha2VmaWxlLmFtOgorCSogZ3N0L2RlYnVnL2dzdGRlYnVnLmM6IChwbHVnaW5faW5pdCk6CisJKiBnc3QvZGVidWcvZ3N0bmF2c2Vlay5jOiAoZ3N0X25hdnNlZWtfZ2V0X3R5cGUpLAorCShnc3RfbmF2c2Vla19iYXNlX2luaXQpLCAoZ3N0X25hdnNlZWtfY2xhc3NfaW5pdCksCisJKGdzdF9uYXZzZWVrX2luaXQpLCAoZ3N0X25hdnNlZWtfc2VlayksCisJKGdzdF9uYXZzZWVrX2hhbmRsZV9zcmNfZXZlbnQpLCAoZ3N0X25hdnNlZWtfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X25hdnNlZWtfZ2V0X3Byb3BlcnR5KSwgKGdzdF9uYXZzZWVrX2NoYWluKSwKKwkoZ3N0X25hdnNlZWtfcGx1Z2luX2luaXQpOgorCSogZ3N0L2RlYnVnL2dzdG5hdnNlZWsuaDoKKwkgIEFkZCB0aGUgbmF2c2VlayBkZWJ1ZyBlbGVtZW50IGZvciBzZWVraW5nIGJhY2sgYW5kIGZvcnRoIGluIGEKKwkgIHZpZGVvIHN0cmVhbSB1c2luZyBhcnJvdyBrZXlzLgorCSogZ3N0L21wZWcyc3ViL2dzdG1wZWcyc3VidC5jOiAoZ3N0X21wZWcyc3VidF9nZXRfdHlwZSksCisJKGdzdF9tcGVnMnN1YnRfYmFzZV9pbml0KSwgKGdzdF9tcGVnMnN1YnRfY2xhc3NfaW5pdCksCisJKGdzdF9tcGVnMnN1YnRfaW5pdCksIChnc3RfbXBlZzJzdWJ0X2ZpbmFsaXplKSwKKwkoZ3N0X21wZWcyc3VidF9nZXRjYXBzX3ZpZGVvKSwgKGdzdF9tcGVnMnN1YnRfbGlua192aWRlbyksCisJKGdzdF9tcGVnMnN1YnRfaGFuZGxlX3ZpZGVvKSwgKGdzdF9tcGVnMnN1YnRfc3JjX2V2ZW50KSwKKwkoZ3N0X21wZWcyc3VidF9wYXJzZV9oZWFkZXIpLCAoZ3N0X2dldF9uaWJibGUpLAorCShnc3Rfc2V0dXBfcGFsZXR0ZSksIChnc3RfZ2V0X3JsZV9jb2RlKSwgKGdzdF9kcmF3X3JsZV9saW5lKSwKKwkoZ3N0X21lcmdlX3V2X2RhdGEpLCAoZ3N0X21wZWcyc3VidF9tZXJnZV90aXRsZSksCisJKGdzdF91cGRhdGVfc3RpbGxfZnJhbWUpLCAoZ3N0X21wZWcyc3VidF9oYW5kbGVfc3VidGl0bGUpLAorCShnc3RfbXBlZzJzdWJ0X2hhbmRsZV9kdmRfZXZlbnQpLCAoZ3N0X21wZWcyc3VidF9sb29wKToKKwkqIGdzdC9tcGVnMnN1Yi9nc3RtcGVnMnN1YnQuaDoKKwkgIFByZXR0eSBtdWNoIGEgY29tcGxldGUgcmV3cml0ZS4gTm93IGEgbG9vcGJhc2VkIGVsZW1lbnQuIE1heSBzdGlsbAorCSAgcmVxdWlyZSB3b3JrIHRvIHByb3Blcmx5IHN5bmNocm9uaXNlIHN1YnRpdGxlIGJ1ZmZlcnMuCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5jOiAoZ3N0X2R2ZF9kZW11eF9wcm9jZXNzX3ByaXZhdGUpLAorCShnc3RfZHZkX2RlbXV4X3NlbmRfc3ViYnVmZmVyKToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdkZW11eC5jOiAoZ3N0X21wZWdfZGVtdXhfc2VuZF9zdWJidWZmZXIpOgorCSAgRG9uJ3QgYXR0ZW1wdCB0byBjcmVhdGUgc3ViYnVmZmVycyBvZiBzaXplIDAKKwkgIFJlZHVjZSBhIGNvdXBsZSBvZiBlcnJvciBvdXRwdXRzIHRvIHdhcm5pbmdzLgorCSogZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYzogKGdzdF95NG1lbmNvZGVfc2lua2Nvbm5lY3QpLAorCShnc3RfeTRtZW5jb2RlX2NoYWluKToKKwlPdXRwdXQgdGhlIHk0bSBmcmFtZSBoZWFkZXIgY29ycmVjdGx5LgorCisyMDA0LTA0LTAxICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvYWRkZXIvZ3N0YWRkZXIuYzogKGdzdF9hZGRlcl9nZXRfdHlwZSksIChnc3RfYWRkZXJfbG9vcCk6CisgICAgICAgICAgdGhyb3cgZXJyb3JzIGluc3RlYWQgb2YgYWxsb3dpbmcgU0lHRlBFCisKKzIwMDQtMDQtMDEgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC1saWJzL2dzdC9nY29uZi9nY29uZi5jOiAoZ3N0X2djb25mX2dldF9zdHJpbmcpLAorCShnc3RfZ2NvbmZfcmVuZGVyX2Jpbl9mcm9tX2tleSk6CisgICAgICAgICAgbGVhayBwbHVnZ2luZyBhbmQgc3R5bGUgZml4aW5nCisKKzIwMDQtMDMtMzEgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2F1ZGlvc2NhbGUvZ3N0YXVkaW9zY2FsZS5jOiAoZ3N0X2F1ZGlvc2NhbGVfZXhwYW5kX3ZhbHVlKSwKKwkoZ3N0X2F1ZGlvc2NhbGVfZ2V0Y2Fwcyk6IEZpeCBnZXRjYXBzIHRvIGV4cGFuZCBhbmQgdW5pb24gbGlzdHMuCisJKGJ1ZyAjMTM4MjI1KQorCSogZ3N0L2RlYnVnL01ha2VmaWxlLmFtOgorCSogZ3N0L2RlYnVnL2JyZWFrbXlkYXRhLmM6IChnc3RfYnJlYWtfbXlfZGF0YV9wbHVnaW5faW5pdCk6CisJKiBnc3QvZGVidWcvZ3N0ZGVidWcuYzogKHBsdWdpbl9pbml0KTogIE1lcmdlIGVsZW1lbnRzIGludG8gb25lCisJcGx1Z2luLgorCSogZ3N0L2RlYnVnL25lZ290aWF0aW9uLmM6IChnc3RfZ3N0X25lZ290aWF0aW9uX2dldF90eXBlKSwKKwkoZ3N0X25lZ290aWF0aW9uX2Jhc2VfaW5pdCksIChnc3RfbmVnb3RpYXRpb25fY2xhc3NfaW5pdCksCisJKGdzdF9uZWdvdGlhdGlvbl9pbml0KSwgKGdzdF9uZWdvdGlhdGlvbl9nZXRjYXBzKSwKKwkoZ3N0X25lZ290aWF0aW9uX3BhZF9saW5rKSwgKGdzdF9uZWdvdGlhdGlvbl9jaGFpbiksCisJKGdzdF9uZWdvdGlhdGlvbl9zZXRfcHJvcGVydHkpLCAoZ3N0X25lZ290aWF0aW9uX2dldF9wcm9wZXJ0eSksCisJKGdzdF9uZWdvdGlhdGlvbl9wbHVnaW5faW5pdCk6ICBOZXcgZWxlbWVudCB0byB0YWxrIGFib3V0IHJhbmRvbQorCW5lZ290aWF0aW9uIHRoaW5ncyBoYXBwZW5pbmcgaW4gYSBwaXBlbGluZS4KKworMjAwNC0wMy0zMSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L2FkZGVyL2dzdGFkZGVyLmM6IChnc3RfYWRkZXJfZ2V0X3R5cGUpLCAoZ3N0X2FkZGVyX2xvb3ApOgorICAgICAgICAgIGZpeCBpbnRlZ2VyIGFkZGl0aW9uIHdpdGggaGVscCBvZiBTdGVmYW4gS29zdAorCisyMDA0LTAzLTMxICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBwby9ubC5wbzogdXBkYXRlZCBEdXRjaCB0cmFuc2xhdGlvbiAoRWxyb3MgQ3lyaWF0YW4pCisKKzIwMDQtMDMtMzAgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmM6IChnc3RfbXBlZzJkZWNfYWxsb2NfYnVmZmVyKSwKKwkoZ3N0X21wZWcyZGVjX25lZ290aWF0ZV9mb3JtYXQpOiAgSGFuZGxlIFk0MkItZm9ybWF0IE1QRUcKKwl2aWRlbywgcGF0Y2ggZnJvbSBNYXR0aGV3LlNwZW5jZXJAZXUuc29ueS5jb20gKE1hdHRoZXcgU3BlbmNlcikKKwkoYnVnICMxMzc1MDQpCisJKiBleHQvbXBlZzJkZWMvZ3N0bXBlZzJkZWMuaDoKKworMjAwNC0wMy0zMCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9NYWtlZmlsZS5hbTogUmVtb3ZlIHNwdXJpb3VzIHJ1bGVzLiAoYnVnICMxMzY1MjcpCisKKzIwMDQtMDMtMzAgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogdG9vbHMvZ3N0LWxhdW5jaC1leHQtbS5tOiAgQXBwbGllZCBwYXRjaCBmcm9tIGdub21lQGZseW4ub3JnIChXLgorCU1pY2hhZWwgUGV0dWxsbykgdG8gaGFuZGxlIC5tb3YKKworMjAwNC0wMy0zMCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzogKGdzdF9vc3NlbGVtZW50X3Byb2JlX2NhcHMpLAorCShnc3Rfb3NzZWxlbWVudF9yYXRlX2NoZWNrX3JhdGUpOgorCSAgcHJvYmUgY2FwcyBjb3JyZWN0bHkgZm9yIHNvdW5kIGNhcmRzIHRoYXQgb25seSBzdXBwb3J0IG9uZSBmb3JtYXQKKworMjAwNC0wMy0zMCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQva2lvL2tpb3NyYy5jcHA6IChwcm9jZXNzX2V2ZW50cyk6CisJICB1cGRhdGUgaGFuZGxpbmcgZXZlbnQgcHJvY2Vzc2luZyBpZiBpbnNpZGUgS0RFIC0gdW50ZXN0ZWQKKworMjAwNC0wMy0yOSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvaGVybWVzL2dzdGhlcm1lc2NvbG9yc3BhY2UuYzogKHBsdWdpbl9pbml0KTogZGVjcmVhc2UgcmFuaworCWJ5IDIgdG8gbm90IGludGVyZmVyZSB3aXRoIG90aGVyIGNvbG9yc3BhY2VzLgorCSogZXh0L3BhbmdvL2dzdHRleHRvdmVybGF5LmM6IChwbHVnaW5faW5pdCk6IGNoYW5nZSByYW5rIHRvIE5PTkUKKwkqIGdzdC9jb2xvcnNwYWNlL2dzdGNvbG9yc3BhY2UuYzogKHBsdWdpbl9pbml0KTogZGVjcmVhc2UgcmFuayBieQorCW9uZSB0byBub3QgaW50ZXJmZXJlIHdpdGggZmZtcGVnX2NvbG9yc3BhY2UuCisKKzIwMDQtMDMtMjkgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfZml4YXRlKTogRG9uJ3QgZml4YXRlIGZpZWxkcyB0aGF0CisJYXJlbid0IGluIHRoZSBjYXBzLgorCSogZ3N0L3NpbmUvZ3N0c2luZXNyYy5jOiBjaGFuZ2UgcmF0ZSBjYXBzIHRvIFsxLE1BWF0KKwkqIGdzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmM6IChwbHVnaW5faW5pdCk6IENoYW5nZSByYW5rIHRvIE5PTkUuCisKKzIwMDQtMDMtMzAgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1tZWRpYS5jOgorCSAgZmFpbCBvbiBlcnJvciwgZG9uJ3QgdHJ5IHRvIHNldCBzdHVmZiBvbiBOVUxMIGNhcHMKKworMjAwNC0wMy0zMCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQva2lvL01ha2VmaWxlLmFtOgorCSogZXh0L2tpby9raW9yZWNlaXZlci5jcHA6CisJKiBleHQva2lvL2tpb3JlY2VpdmVyLmg6CisJKiBleHQva2lvL2tpb3NyYy5jcHA6CisJKiBleHQva2lvL2tpb3NyYy5oOgorCSAgYWRkIGV4cGVyaW1lbnRhbCBraW9zcmMgcGx1Z2luCisJKiBleHQvYWxzYS9nc3RhbHNhcGx1Z2luLmM6IChwbHVnaW5faW5pdCk6CisJICBpbml0aWFsaXplIGRlYnVnZ2luZyBjYXRlZ29yeSBvbmx5IHdoZW4gd2UncmUgc3VyZSByZWdpc3RlcmluZyB0aGUKKwkgIHBsdWdpbnMgd29ya2VkLgorCisyMDA0LTAzLTI5ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleGFtcGxlcy9nc3RwbGF5L3BsYXllci5jOiAobWFpbik6CisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5LmM6IChnc3RfcGxheV9jbGFzc19pbml0KSwKKwkoZ3N0X3BsYXlfc2V0X2xvY2F0aW9uKSwgKGdzdF9wbGF5X3NldF9kYXRhX3NyYyksCisJKGdzdF9wbGF5X3NldF92aWRlb19zaW5rKSwgKGdzdF9wbGF5X3NldF9hdWRpb19zaW5rKSwKKwkoZ3N0X3BsYXlfc2V0X3Zpc3VhbGl6YXRpb24pLCAoZ3N0X3BsYXlfY29ubmVjdF92aXN1YWxpemF0aW9uKToKKyAgICAgICAgICBjaGVjayByZXR1cm4gdmFsdWVzIG9mIGVsZW1lbnRfc2V0X3N0YXRlIGFuZCByZXR1cm4gRkFMU0Ugd2hlcmUKKyAgICAgICAgICBmYWlsZWQKKworMjAwNC0wMy0yOSAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfaGFuZGxlX2V2ZW50KToKKwkgIHRyeSBoYXJkZXIgdG8gY2hlY2sgaWYgYW4gZXZlbnQgaXMgcmVhbGx5IGEgZGlzY29udAorCisyMDA0LTAzLTI5ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBwby9MSU5HVUFTOiBhZGRpbmcgQXplcmJhaWphbmkgKE3JmXRpbiDGj21pcm92KQorCSogcG8vYXoucG86CisKKzIwMDQtMDMtMjggIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L21wZWdzdHJlYW0vZ3N0ZHZkZGVtdXguYzogKGdzdF9kdmRfZGVtdXhfcHJvY2Vzc19wcml2YXRlKToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdkZW11eC5jOiAoZ3N0X21wZWdfZGVtdXhfcGFyc2Vfc3lzaGVhZCksCisJKGdzdF9tcGVnX2RlbXV4X3BhcnNlX3BhY2tldCksIChnc3RfbXBlZ19kZW11eF9wYXJzZV9wZXMpOgorCSAgZ2V0IHJpZCBvZiBub24tc3RhbmRhcmQgIi4uLiIgcmFuZ2VzIGluIGNhc2Ugc3RhdGVtZW50cy4KKworMjAwNC0wMy0yNyAgTWFydGluIFNvdG8gIDxtYXJ0aW5zb3RvQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2RlbXV4LmM6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguaDogQ29tcGxldGUgb3ZlcmhhdWwuIEFsbCBEVkQKKwlzcGVjaWZpYyBmdW5jdGlvbmFsaXR5IHNwbGl0IHRvIHRoZSBuZXcgZHZkZGVtdXggZWxlbWVudC4KKwkqIGdzdC9tcGVnc3RyZWFtL2dzdGR2ZGRlbXV4LmM6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RkdmRkZW11eC5oOiBOZXcgZGVtdWx0aXBsZXhlciBmb3IgRFZEIChWT0IpCisJc3RyZWFtcywgZGVyaXZlZCBmcm9tIG1wZWdkZW11eC4KKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYXJzZS5jOiBEaXNjb250aW51aXR5IGhhbmRsaW5nIGNsZWFuZWQKKwl1cC4gU0NSIGJhc2VkIHRpbWVzdGFtcCByZXdyaXRpbmcgY2FuIGJlIHR1cm5lZCBvZmYgKHdpbGwgcHJvYmFibHkKKwljb21wbGV0ZWx5IGRpc2FwcGVhciBzb29uKS4KKwkqIGV4dC9kdmRuYXYvZHZkbmF2c3JjLmM6IENoYW5nZXMgcmVzdWx0aW5nIGZyb20gYSBmZXcgbW9udGhzCisJaGFja2luZy4gR2VuZXJhbCBjbGVhbnVwLiBBbGwgcHJpbnRmIHN0YXRlbWVudHMgcmVwbGFjZWQgYnkKKwlkZWJ1Z2dpbmcgbWVzc2FnZXMuIEFsbW9zdCBjb21wbGV0ZSBsaWJkdmRuYXYgc3VwcG9ydC4KKwkoZHZkbmF2c3JjX2NsYXNzX2luaXQpOiBHb3QgcmlkIG9mIHVubmVjZXNzYXJ5IHNpZ25hbHMgKHJlcGxhY2VkCisJYnkgZXZlbnRzLiBOZXcgcHJvcGVydGllcyBmb3IgYXVkaW8gYW5kIHN1YnBpY3R1cmUgbGFuZ3VhZ2VzLgorCShkdmRuYXZzcmNfdXBkYXRlX2hpZ2hsaWdodCk6IE5vdyB1c2VzIGV2ZW50cy4KKwkoZHZkbmF2c3JjX3VzZXJfb3ApOiBDbGVhbmVkIHVwLgorCShkdmRuYXZzcmNfZ2V0KTogUmVuYW1lZCB0byBkdmRuYXZzcmNfbG9vcCAoZWxlbWVudCBpcyBub3cgbG9vcAorCWJhc2VkKS4gTG90cyBvZiBjbGVhbnVwLCBhbmQgcHJvcHBlciBzdXBwb3J0IGZvciBtb3N0IGxpYmR2ZG5hdgorCWV2ZW50cy4KKwkoZHZkbmF2c3JjX21ha2VfZHZkX2V2ZW50KTogTmV3IGZ1bmN0aW9uLgorCShkdmRuYXZzcmNfbWFrZV9kdmRfbmF2X3BhY2tldF9ldmVudCk6IE5ldyBmdW5jdGlvbi4KKwkoZHZkbmF2c3JjX21ha2VfY2x1dF9jaGFuZ2VfZXZlbnQpOiBOZXcgZnVuY3Rpb24uCisKKzIwMDQtMDMtMjYgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6ICh0aGVvcmFfdHlwZV9maW5kKToKKwkgIGZpeCBidWcgd2hlcmUgdHlwZWZpbmRpbmcgd291bGQgY2xhaW0gaXQncyB0aGVvcmEgd2hlbmV2ZXIgbGVzcyB0aGVuCisJICA3IGJ5dGVzIG9mIGRhdGEgd2VyZSBhdmFpbGFibGUKKworMjAwNC0wMy0yNSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2xhdy9hbGF3LWRlY29kZS5jOiAoYWxhd2RlY19nZXRjYXBzKSwgKGFsYXdkZWNfbGluayksCisJKGdzdF9hbGF3ZGVjX2Jhc2VfaW5pdCksIChnc3RfYWxhd2RlY19jbGFzc19pbml0KSwKKwkoZ3N0X2FsYXdkZWNfaW5pdCksIChnc3RfYWxhd2RlY19jaGFpbik6CisJKiBnc3QvbGF3L2FsYXctZW5jb2RlLmM6IChhbGF3ZW5jX2dldGNhcHMpLCAoYWxhd2VuY19saW5rKSwKKwkoZ3N0X2FsYXdlbmNfYmFzZV9pbml0KSwgKGdzdF9hbGF3ZW5jX2NsYXNzX2luaXQpLAorCShnc3RfYWxhd2VuY19pbml0KSwgKGdzdF9hbGF3ZW5jX2NoYWluKToKKwkqIGdzdC9sYXcvbXVsYXctZGVjb2RlLmM6IChtdWxhd2RlY19nZXRjYXBzKSwgKG11bGF3ZGVjX2xpbmspLAorCShnc3RfbXVsYXdkZWNfYmFzZV9pbml0KSwgKGdzdF9tdWxhd2RlY19jbGFzc19pbml0KSwKKwkoZ3N0X211bGF3ZGVjX2luaXQpLCAoZ3N0X211bGF3ZGVjX2NoYWluKToKKwkqIGdzdC9sYXcvbXVsYXctZW5jb2RlLmM6IChtdWxhd2VuY19nZXRjYXBzKSwgKG11bGF3ZW5jX2xpbmspLAorCShnc3RfbXVsYXdlbmNfYmFzZV9pbml0KSwgKGdzdF9tdWxhd2VuY19jbGFzc19pbml0KSwKKwkoZ3N0X211bGF3ZW5jX2luaXQpLCAoZ3N0X211bGF3ZW5jX2NoYWluKToKKwkgIEZpeCBjYXBzbmVnbyBpbiBhbGwgZm91ciwgcmVtb3ZlIHRoZSB1bnVzZWQgcHJvcGVydHkgZnVuY3Rpb25zIGFuZAorCSAgc2ltcGxpZnkgdGhlIGNoYWluIGZ1bmN0aW9ucyBzbGlnaHRseS4gSSBndWVzcyB3ZSBjb3VsZCB1c2UgbWFjcm9zCisJICBvciBzb21ldGhpbmcgc2ltaWxhciBmb3IgdGhvc2UsIHNpbmNlIHRoZSBjb2RlIGlzIHNvIHNpbWlsYXIsIGJ1dAorCSAgSSdtIGN1cnJlbnRseSB0b28gbGF6eS4uLgorCisyMDA0LTAzLTI0ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiAoZ3N0X29zc2VsZW1lbnRfc3luY19wYXJtcyksCisJKGdzdF9vc3NlbGVtZW50X2Nsb3NlX2F1ZGlvKSwgKGdzdF9vc3NlbGVtZW50X3Byb2JlX2NhcHMpLAorCShnc3Rfb3NzZWxlbWVudF9nZXRfZm9ybWF0X3N0cnVjdHVyZSksCisJKGdzdF9vc3NlbGVtZW50X3JhdGVfcHJvYmVfY2hlY2spLCAoZ3N0X29zc2VsZW1lbnRfcmF0ZV9hZGRfcmFuZ2UpLAorCShnc3Rfb3NzZWxlbWVudF9yYXRlX2NoZWNrX3JhdGUpLCAoZ3N0X29zc2VsZW1lbnRfcmF0ZV9hZGRfcmF0ZSksCisJKGdzdF9vc3NlbGVtZW50X3JhdGVfaW50X2NvbXBhcmUpOiBBZGQgY29kZSB0byBoYW5kbGUgcmF0ZSBwcm9iaW5nCisJKGJ1ZyAjMTIwODgzKQorCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50Lmg6IHNhbWUKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc3NpbmtfaW5pdCksIChnc3Rfb3Nzc2lua19nZXRjYXBzKToKKwlVc2UgcmF0ZSBwcm9iaW5nIHByb3ZpZGVkIGJ5IG9zc2VsZW1lbnQuCisJKiBzeXMvb3NzL2dzdG9zc3NyYy5jOiAoZ3N0X29zc3NyY19pbml0KSwgKGdzdF9vc3NzcmNfZ2V0Y2Fwcyk6IHNhbWUKKworMjAwNC0wMy0yNCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L3h2aWQvZ3N0eHZpZGVuYy5jOiAoZ3N0X3h2aWRlbmNfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3h2aWRlbmNfZ2V0X3Byb3BlcnR5KToKKwkgIHVsb25nL2ludCBtZXNzLXVwLgorCisyMDA0LTAzLTI0ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9zcGVleC9nc3RzcGVleGRlYy5jOiAoZ3N0X3NwZWV4ZGVjX2Jhc2VfaW5pdCksCisJKGdzdF9zcGVleGRlY19pbml0KToKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiAoZ3N0X3NwZWV4ZW5jX2Jhc2VfaW5pdCksCisJKGdzdF9zcGVleGVuY19pbml0KTogIENyZWF0ZSB0aGUgcGFkIHRlbXBsYXRlIGNvcnJlY3RseSAoZnJvbQorCXRoZSBzdGF0aWMgcGFkIHRlbXBsYXRlLCBub3QgYSBOVUxMIHBvaW50ZXIuKQorCisyMDA0LTAzLTI1ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9kZWJ1Zy9NYWtlZmlsZS5hbToKKwkqIGdzdC9kZWJ1Zy9icmVha215ZGF0YS5jOgorCSAgYWRkIGVsZW1lbnQgdGhhdCBxdWFzaS1yYW5kb21seSBjaGFuZ2VzIGJ5dGVzIGluIHRoZSBzdHJlYW0uCisJICBJbnRlbmRlZCB1c2UgaXMgcm9idXN0bmVzcyBjaGVja2luZyBvZiBkZW11eGVycyBhbmQgZGVjb2RlcnMgaW4KKwkgIG1lZGlhIHRlc3RzLgorCisyMDA0LTAzLTI0ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX29wZW5fYXVkaW8pLAorCShnc3RfYWxzYV9wcm9iZV9od19wYXJhbXMpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5oOgorCSAgZGVidWdnaW5nIG91dHB1dCBmaXhlcworCisyMDA0LTAzLTI0ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3NyYy5jOiAoZ3N0X2dub21ldmZzc3JjX3NldF9wcm9wZXJ0eSk6CisJICBkb24ndCBnX3JldHVybl9pZl9mYWlsIGlmIGVsZW1lbnQgaXMgUExBWUlORywgZmFpbCBzaWxlbnRseSBhcyBldmVyeQorCSAgb3RoZXIgZWxlbWVudC4KKwkqIGdzdC9lZmZlY3R2L2dzdHF1YXJrLmM6IChnc3RfcXVhcmt0dl9jaGFpbik6CisJICBvbmx5IGZpeCBuZWVkZWQgZm9yIGNhc3QgbHZhbHVlIGlzc3VlcyBpbiBnc3QtcGx1Z2lucworCSogZ3N0L3ZvbGVudi9nc3R2b2xlbnYuYzogKGdzdF92b2xlbnZfaW5pdCk6CisJICBhZGQgcHJveHlfZ2V0Y2FwcworCisyMDA0LTAzLTI0ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9sZXZlbC9nc3RsZXZlbC5jOiAoZ3N0X2xldmVsX2luaXQpOgorCSAgYWRkIHByb3h5aW5nIGdldGNhcHMgZnVuY3Rpb24sIHNvIGxldmVsIGRvZXNuJ3QgYWR2ZXJ0aXNlIGltcG9zc2libGUKKwkgIGNhcHMKKworMjAwNC0wMy0yNCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9oYW5kbGVfc2lua19ldmVudCksCisJKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwgKHF0ZGVtdXhfcGFyc2VfbW9vdiksIChxdGRlbXV4X3BhcnNlKSwKKwkocXRkZW11eF9ub2RlX2R1bXBfZm9yZWFjaCksIChxdGRlbXV4X2R1bXBfbXZoZCksCisJKHF0ZGVtdXhfZHVtcF90a2hkKSwgKHF0ZGVtdXhfZHVtcF9lbHN0KSwgKHF0ZGVtdXhfZHVtcF9tZGhkKSwKKwkocXRkZW11eF9kdW1wX2hkbHIpLCAocXRkZW11eF9kdW1wX3ZtaGQpLCAocXRkZW11eF9kdW1wX2RyZWYpLAorCShxdGRlbXV4X2R1bXBfc3RzZCksIChxdGRlbXV4X2R1bXBfc3R0cyksIChxdGRlbXV4X2R1bXBfc3RzcyksCisJKHF0ZGVtdXhfZHVtcF9zdHNjKSwgKHF0ZGVtdXhfZHVtcF9zdHN6KSwgKHF0ZGVtdXhfZHVtcF9zdGNvKSwKKwkocXRkZW11eF9kdW1wX2NvNjQpLCAocXRkZW11eF9kdW1wX2Rjb20pLCAocXRkZW11eF9kdW1wX2NtdmQpLAorCShxdGRlbXV4X3BhcnNlX3RyZWUpLCAocXRkZW11eF9wYXJzZV90cmFrKTogIEZpeCBkZWJ1Z2dpbmcKKwltZXNzYWdlcy4gIERpdmlkZSB0aGUgY2h1bmsgc2l6ZSBieSB0aGUgY29tcHJlc3Npb24gcmF0aW8KKwkobmVlZGVkIGZvciBNQUNFIGF1ZGlvKQorCisyMDA0LTAzLTIzICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbXBlZ2F1ZGlvcGFyc2UvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzogKGdzdF9tcDNwYXJzZV9jaGFpbik6CisJICBGaXggYnVmZmVyIG92ZXJmbG93IHJlYWQgZXJyb3IuCisKKzIwMDQtMDMtMjMgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuaDoKKwkgIFJlbW92ZSB1bnVzZWQgZW50cnkuCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6IChnc3RfcmlmZl9jcmVhdGVfdmlkZW9fY2Fwcyk6CisJICBBZGQgY2luZXBhay4KKwkqIGdzdC92aWRlb2Ryb3AvZ3N0dmlkZW9kcm9wLmM6IChnc3RfdmlkZW9kcm9wX2dldGNhcHMpLAorCShnc3RfdmlkZW9kcm9wX2xpbmspLCAoZ3N0X3ZpZGVvZHJvcF9jaGFpbik6CisJICBGaXgsIHNvcnQgb2YuIFdhcyBob3JyaWJseSBicm9rZW4gd2l0aCBuZXcgY2Fwc25lZ28uIEJhaC4uLgorCisyMDA0LTAzLTIzICBKZXJlbXkgU2ltb24gIDxqZXNpbW9uQGxpYmVydHlzdXJmLmZyPgorCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKGFwZV90eXBlX2ZpbmQpLAorCShwbHVnaW5faW5pdCk6CisJQWRkIGEgbW9ua2V5c2F1ZGlvIHR5cGVmaW5kIGZ1bmN0aW9uCisKKzIwMDQtMDMtMjMgIEpvaGFuIERhaGxpbiAgPGpvaGFuQGdub21lLm9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5jIChnc3RfcGxheV9hdWRpb19maXhhdGUpCisJKGdzdF9wbGF5X3ZpZGVvX2ZpeGF0ZSk6IENoZWNrIHNvIHRoZSBzdHJ1Y3R1cmUgaGFzIHRoZSBmaWVsZAorCWJlZm9yZSB0cnlpbmcgdG8gZml4YXRlIHRoZW0sIHRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gaGF2ZQorCWZha2VzaW5rcyBmb3IgdmlkZW8gYW5kIGF1ZGlvIG91dHB1dCB3aXRob3V0IHByaW50aW5nIGVycm9ycyBvbgorCXRoZSBvdXRwdXQgY29uc29sZS4KKworMjAwNC0wMy0yMiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBzeXMvb3NzL01ha2VmaWxlLmFtOgorCSogc3lzL29zcy9vc3NfcHJvYmUuYzogKG1haW4pLCAocHJvYmVfY2hlY2spLCAoYWRkX3JhbmdlKSwKKwkoY2hlY2tfcmF0ZSksIChhZGRfcmF0ZSk6ICBSYXRlIHByb2JpbmcgdGVzdCBhcHAuCisKKzIwMDQtMDMtMjEgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKGdzdF9hdWRpb19jb252ZXJ0X2xpbmspLAorCShfZml4YXRlX2NhcHNfdG9faW50KSwgKGdzdF9hdWRpb19jb252ZXJ0X2ZpeGF0ZSk6CisJICBhZGQgYSBmaXhhdGlvbiBmdW5jdGlvbiB0aGF0IHByZXR0eSBtdWNoIGRvZXMgdGhlIHJpZ2h0IHRoaW5nIChmaXhlcworCSAgIzEzNzU1NikKKworMjAwNC0wMy0yMCAgRGF2aWQgSS4gTGVobiAgPGRsZWhuQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogY29uZmlndXJlLmFjOiBHU1RfUEFDS0FHRSBkZWZhdWx0OiBzL0dTdHJlYW1lci9HU3RyZWFtZXIgUGx1Z2lucy8KKworMjAwNC0wMy0yMCAgVGltLVBoaWxsaXAgTcO8bGxlciA8dC5pLm1AemVuLmNvLnVrPgorCisJcmV2aWV3ZWQgYnk6IEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19wYWRfcHVzaCk6CisJICB0ZXJtaW5hdGUgZ3N0X2V2ZW50X25ld19kaXNjb250aW51b3VzIGNvcnJlY3RseSAoZml4ZXMgcGFydHMgb2YKKwkgICMxMzc3MTEpCisKKzIwMDQtMDMtMTkgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L01ha2VmaWxlLmFtOiAgRW5hYmxlIHhvdmVybGF5IHVuY29uZGl0aW9uYWxseSwKKwlzaW5jZSBpdCBkb2Vzbid0IGRlcGVuZCBvbiBYLCBhbmQgaXQncyBwYXJ0IG9mIG91ciBBQkkuCisKKzIwMDQtMDMtMTkgIElhaW4gPGlhaW5AcHJldHR5cGVvcGxlLm9yZz4KKworCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmMgKGRlaW50ZXJsZWF2ZV9zaW5rX2xpbmspOiBVc2UgdGhlCisJaXNfaW50IGluIHRoZSBzdHJ1Y3R1cmUsIG5vdCB0aGUgbG9jYWwgdmFyaWFibGUuCisKKzIwMDQtMDMtMTkgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2xpYnJmYi9nc3RyZmJzcmMuYzogKGdzdF9yZmJzcmNfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3JmYnNyY19pbml0KSwgKGdzdF9yZmJzcmNfZ2V0Y2FwcyksIChnc3RfcmZic3JjX2ZpeGF0ZSksCisJKGdzdF9yZmJzcmNfbGluayksIChnc3RfcmZic3JjX3BhaW50X3JlY3QpLCAoZ3N0X3JmYnNyY19nZXQpOgorCUltcHJvdmVtZW50cyBpbiBjYXBzIG5lZ290aWF0aW9uLgorCisyMDA0LTAzLTE4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBwby9MSU5HVUFTOgorCSogcG8vYWYucG86CisgICAgICAgICAgYWRkaW5nIEFmcmlrYWFucyAoUGV0cmkgSm9vc3RlKQorCisyMDA0LTAzLTE4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2xvcnNwYWNlLmM6CisJKGdzdF9mZm1wZWdjb2xvcnNwYWNlX2NoYWluKToKKyAgICAgICAgdGhyb3cgZXJyb3IgaW5zdGVhZCBvZiBnX2NyaXRpY2FsICgjMTM3NTg4KQorCisyMDA0LTAzLTE4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBNYWtlZmlsZS5hbToKKwkqIGNvbmZpZ3VyZS5hYzoKKyAgICAgICAgICBkaXN0IGNvbW1vbiBhbmQgbTQgY29ycmVjdGx5CisJKiBwby9zdi5wbzoKKworMjAwNC0wMy0xNyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBwa2djb25maWcvZ3N0cmVhbWVyLW1lZGlhLWluZm8ucGMuaW46ICBBZGQgVmVyc2lvbi4KKwkoYnVnICMxMzczNDgpCisKKzIwMDQtMDMtMTcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHBvL0xJTkdVQVM6CisJKiBwby9zdi5wbzoKKyAgICAgICAgICBhZGRpbmcgU3dlZGlzaCB0cmFuc2xhdGlvbiAoQ2hyaXN0aWFuIFJvc2UpCisKKzIwMDQtMDMtMTcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIE1ha2VmaWxlLmFtOiB1c2UgcmVsZWFzZS5tYWsKKworMjAwNC0wMy0xNiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29tbW9uL0NoYW5nZUxvZzoKKwkqIGNvbW1vbi9nc3QtYXV0b2dlbi5zaDoKKyAgICAgICAgICBhZGQgc29tZSBleHBsYW5hdGlvbiBhYm91dCB0aGUgdmVyc2lvbiBkZXRlY3Rpb24KKwkqIGNvbmZpZ3VyZS5hYzoKKyAgICAgICAgICBmaXggWCBjaGVjaworCisyMDA0LTAzLTE2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6IGJ1bXAgbmFubyB0byAxCisKKz09PSByZWxlYXNlIDAuOC4wID09PQorCisyMDA0LTAzLTE2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6IHJlbGVhc2UgMC44LjAsICJQaGFybWFjZXV0aWNhbCBJdGNoIgorCisyMDA0LTAzLTE2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisgICAgICAgICAgdXBkYXRlIGxpYnRvb2wgdmVyc2lvbgorCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vTWFrZWZpbGUuYW06CisgICAgICAgICAgYWN0dWFsbHkgdXNlIGxpYnRvb2wgdmVyc2lvbgorCisyMDA0LTAzLTE1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6IGZpeCBzcGVleCBkZXRlY3Rpb24gdG8gd29yayB3aXRoIDEuMCBidXQgbm90IDEuMQorCisyMDA0LTAzLTE1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QtcGx1Z2lucy5zcGVjLmluOgorCSogcGtnY29uZmlnL01ha2VmaWxlLmFtOgorCSogcGtnY29uZmlnL2dzdHJlYW1lci1nY29uZi11bmluc3RhbGxlZC5wYy5pbjoKKwkqIHBrZ2NvbmZpZy9nc3RyZWFtZXItaW50ZXJmYWNlcy11bmluc3RhbGxlZC5wYy5pbjoKKwkqIHBrZ2NvbmZpZy9nc3RyZWFtZXItbGlicy11bmluc3RhbGxlZC5wYy5pbjoKKwkqIHBrZ2NvbmZpZy9nc3RyZWFtZXItbGlicy5wYy5pbjoKKwkqIHBrZ2NvbmZpZy9nc3RyZWFtZXItbWVkaWEtaW5mby11bmluc3RhbGxlZC5wYy5pbjoKKwkqIHBrZ2NvbmZpZy9nc3RyZWFtZXItcGxheS11bmluc3RhbGxlZC5wYy5pbjoKKwkqIHBrZ2NvbmZpZy9nc3RyZWFtZXItcGx1Z2lucy11bmluc3RhbGxlZC5wYy5pbjoKKwkqIHBrZ2NvbmZpZy9nc3RyZWFtZXItcGx1Z2lucy5wYy5pbjoKKyAgICAgICAgICByZW1vdmUgQFZFUlNJT05AIGZyb20gc29tZSBvZiB0aGUgcGMgZmlsZXMgc2luY2UgY29yZSBhbmQgcGx1Z2lucworICAgICAgICAgIGFyZSBkZWNvdXBsZWQuCisgICAgICAgICAgY3JlYXRlZCBnc3RyZWFtZXItcGx1Z2lucy5wYyBhcyBpdCdzIGEgYmV0dGVyIG5hbWUsIGJ1dCBrZWVwaW5nCisgICAgICAgICAgLWxpYnMgYXJvdW5kIGZvciBub3cgdG8gZ2V0IGZpeGVzIHVwc3RyZWFtIGRvbmUgZmlyc3QuCisKKzIwMDQtMDMtMTUgIEp1bGllbiBNT1VUVEUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5LmM6IChnc3RfcGxheV9nZXRfZnJhbWVyYXRlKSwKKwkoZ3N0X3BsYXlfZ2V0X3NpbmtfZWxlbWVudCk6IEZpcnN0IGRyYWZ0IG9mIGdzdF9wbGF5X2dldF9mcmFtZXJhdGUuCisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5Lmg6CisKKzIwMDQtMDMtMTUgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqICouYywgKi5jYzogZG9uJ3QgbWl4IHRhYnMgYW5kIHNwYWNlcworCisyMDA0LTAzLTE1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5LmM6IChnc3RfcGxheV9waXBlbGluZV9zZXR1cCk6CisgICAgICAgICAgdXNlIHRoZSBuZXcgZmZtcGVnY29sb3JzcGFjZQorCSogZ3N0LXBsdWdpbnMuc3BlYy5pbjoKKyAgICAgICAgICBwYWNrYWdlIG5ldyBjb2xvcnNwYWNlIGFuZCBtZWRpYS1pbmZvCisJKiBjb25maWd1cmUuYWM6CisJKiBwa2djb25maWcvTWFrZWZpbGUuYW06CisgICAgICAgICAgZml4IHNvbWUgbW9yZSBkaXN0aW5nIGlzc3VlcworCSogcGtnY29uZmlnL2dzdHJlYW1lci1tZWRpYS1pbmZvLXVuaW5zdGFsbGVkLnBjLmluOgorCSogcGtnY29uZmlnL2dzdHJlYW1lci1tZWRpYS1pbmZvLnBjLmluOgorICAgICAgICAgIGdlbmVyYXRlIG1lZGlhLWluZm8gcGMgZmlsZXMKKworMjAwNC0wMy0xNSAgSm9oYW4gRGFobGluICA8am9oYW5AZ25vbWUub3JnPgorCisJKiAqLmg6IFJldmVydCBpbmRlbnRpbmcKKworMjAwNC0wMy0xNSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorICAgICAgICAgIGFkZGluZyBmZm1wZWdjb2xvcnNwYWNlIGVsZW1lbnQKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL01ha2VmaWxlLmFtOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvYXZjb2RlYy5oOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvY29tbW9uLmg6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9kc3B1dGlsLmM6IChkc3B1dGlsX3N0YXRpY19pbml0KToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2RzcHV0aWwuaDoKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZy5jOiAocGx1Z2luX2luaXQpOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvZ3N0ZmZtcGVnY29kZWNtYXAuYzoKKwkoZ3N0X2ZmbXBlZ19waXhmbXRfdG9fY2FwcyksIChnc3RfZmZtcGVnX3BpeF9mbXRfdG9fY2FwcyksCisJKGdzdF9mZm1wZWdfY2Fwc190b19waXhfZm10KToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2dzdGZmbXBlZ2NvZGVjbWFwLmg6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9nc3RmZm1wZWdjb2xvcnNwYWNlLmM6CisJKGdzdF9mZm1wZWdjb2xvcnNwYWNlX2NhcHNfcmVtb3ZlX2Zvcm1hdF9pbmZvKSwKKwkoZ3N0X2ZmbXBlZ2NvbG9yc3BhY2VfZ2V0Y2FwcyksIChnc3RfZmZtcGVnY29sb3JzcGFjZV9wYWRfbGluayksCisJKGdzdF9mZm1wZWdjb2xvcnNwYWNlX2dldF90eXBlKSwgKGdzdF9mZm1wZWdjb2xvcnNwYWNlX2Jhc2VfaW5pdCksCisJKGdzdF9mZm1wZWdjb2xvcnNwYWNlX2NsYXNzX2luaXQpLCAoZ3N0X2ZmbXBlZ2NvbG9yc3BhY2VfaW5pdCksCisJKGdzdF9mZm1wZWdjb2xvcnNwYWNlX2NoYWluKSwgKGdzdF9mZm1wZWdjb2xvcnNwYWNlX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9mZm1wZWdjb2xvcnNwYWNlX3NldF9wcm9wZXJ0eSksCisJKGdzdF9mZm1wZWdjb2xvcnNwYWNlX2dldF9wcm9wZXJ0eSksCisJKGdzdF9mZm1wZWdjb2xvcnNwYWNlX3JlZ2lzdGVyKToKKwkqIGdzdC9mZm1wZWdjb2xvcnNwYWNlL2ltZ2NvbnZlcnQuYzoKKwkoYXZjb2RlY19nZXRfY2hyb21hX3N1Yl9zYW1wbGUpLCAoYXZjb2RlY19nZXRfcGl4X2ZtdF9uYW1lKSwKKwkoYXZjb2RlY19nZXRfcGl4X2ZtdCksIChhdnBpY3R1cmVfZmlsbCksIChhdnBpY3R1cmVfbGF5b3V0KSwKKwkoYXZwaWN0dXJlX2dldF9zaXplKSwgKGF2Y29kZWNfZ2V0X3BpeF9mbXRfbG9zcyksCisJKGF2Z19iaXRzX3Blcl9waXhlbCksIChhdmNvZGVjX2ZpbmRfYmVzdF9waXhfZm10MSksCisJKGF2Y29kZWNfZmluZF9iZXN0X3BpeF9mbXQpLCAoaW1nX2NvcHlfcGxhbmUpLCAoaW1nX2NvcHkpLAorCSh5dXY0MjJfdG9feXV2NDIwcCksICh5dXY0MjJfdG9feXV2NDIycCksICh5dXY0MjJwX3RvX3l1djQyMiksCisJKENfSlBFR19UT19DQ0lSKSwgKGltZ19jb252ZXJ0X2luaXQpLCAoaW1nX2FwcGx5X3RhYmxlKSwKKwkoc2hyaW5rNDEpLCAoc2hyaW5rMjEpLCAoc2hyaW5rMTIpLCAoc2hyaW5rMjIpLCAoc2hyaW5rNDQpLAorCShncm93MjFfbGluZSksIChncm93NDFfbGluZSksIChncm93MjEpLCAoZ3JvdzIyKSwgKGdyb3c0MSksCisJKGdyb3c0NCksIChjb252NDExKSwgKGdpZl9jbHV0X2luZGV4KSwgKGJ1aWxkX3JnYl9wYWxldHRlKSwKKwkoYml0Y29weV9uKSwgKG1vbm9fdG9fZ3JheSksIChtb25vd2hpdGVfdG9fZ3JheSksCisJKG1vbm9ibGFja190b19ncmF5KSwgKGdyYXlfdG9fbW9ubyksIChncmF5X3RvX21vbm93aGl0ZSksCisJKGdyYXlfdG9fbW9ub2JsYWNrKSwgKGF2cGljdHVyZV9hbGxvYyksIChhdnBpY3R1cmVfZnJlZSksCisJKGlzX3l1dl9wbGFuYXIpLCAoaW1nX2NvbnZlcnQpLCAoZ2V0X2FscGhhX2luZm9fcGFsOCksCisJKGltZ19nZXRfYWxwaGFfaW5mbyksIChkZWludGVybGFjZV9saW5lKSwKKwkoZGVpbnRlcmxhY2VfbGluZV9pbnBsYWNlKSwgKGRlaW50ZXJsYWNlX2JvdHRvbV9maWVsZCksCisJKGRlaW50ZXJsYWNlX2JvdHRvbV9maWVsZF9pbnBsYWNlKSwgKGF2cGljdHVyZV9kZWludGVybGFjZSk6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9pbWdjb252ZXJ0X3RlbXBsYXRlLmg6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS9tZW0uYzogKGF2X21hbGxvYyksIChhdl9yZWFsbG9jKSwgKGF2X2ZyZWUpOgorCSogZ3N0L2ZmbXBlZ2NvbG9yc3BhY2UvbW14Lmg6CisJKiBnc3QvZmZtcGVnY29sb3JzcGFjZS91dGlscy5jOiAoYXZjb2RlY19pbml0KToKKyAgICAgICAgICBhZGRpbmcgZmZtcGVnY29sb3JzcGFjZSBlbGVtZW50IHN1cHBsaWVkIGJ5IFJvbmFsZCBhZnRlciBjbGVhbmluZworICAgICAgICAgIHVwIGFuZCBwdWxsaW5nIGluIHRoZSByaWdodCBiaXRzIG9mIHVwc3RyZWFtIHNvdXJjZS4KKyAgICAgICAgICBJJ20gc3VyZSBhIGJldHRlciBDL2NvbXBpbGVyIHdpemFyZCBjb3VsZCBkbyBzb21lIGNsZWFuaW5nIHVwIChmb3IKKyAgICAgICAgICBleGFtcGxlIHVzZSBHTElCJ3MgbWFsbG9jIHN0dWZmKSwgYnV0IGFzIGEgZmlyc3QgcGFzcyB0aGlzCisgICAgICAgICAgd29ya3MgdmVyeSB3ZWxsCisKKzIwMDQtMDMtMTUgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuaDoKKwkgIEkgYXNzdW1lIFJvbmFsZCBmb3Jnb3QgdG8gY29tbWl0IHRoZSBjaGFuZ2UgdG8gaGF2ZSBjYXJkbmFtZQorICAgICAgICAgIGFzIGEgc3RydWN0IG1lbWJlci4gIEV4cGVjdCBzb21lIHB1YmxpYyBzcGFua2luZyBhdCB0aGUgbmV4dAorICAgICAgICAgIG9wcG9ydHVuaXR5LgorCisyMDA0LTAzLTE1ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9nZXRfcHJvcGVydHkpLAorCShnc3RfYWxzYV9vcGVuX2F1ZGlvKSwgKGdzdF9hbHNhX2Nsb3NlX2F1ZGlvKToKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzoKKwkgIERvbid0IG9wZW4gdGhlIGRldmljZSBpZiB3ZSdyZSBhIG1peGVyICg9IHBhZGxlc3MpLgorCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVyLmM6IChnc3RfYWxzYV9taXhlcl9jbGFzc19pbml0KSwKKwkoZ3N0X2Fsc2FfbWl4ZXJfaW5pdCksIChnc3RfYWxzYV9taXhlcl9vcGVuKSwKKwkoZ3N0X2Fsc2FfbWl4ZXJfY2xvc2UpLCAoZ3N0X2Fsc2FfbWl4ZXJfY2hhbmdlX3N0YXRlKToKKwkgIE9wZW4gbWl4ZXIgZHVyaW5nIHN0YXRlIGNoYW5nZSByYXRoZXIgdGhhbiBkdXJpbmcgb2JqZWN0CisJICBpbml0aWFsaXphdGlvbi4gQWxzbywgZ2V0IGEgZGV2aWNlIG5hbWUuIEN1cnJlbnRseSBpbiBhIHNvbWV3aGF0CisJICBoYWNraXNoIGZhc2hpb24sIGJ1dCBJIGRpZG4ndCByZWFsbHkgZmluZCBzb21ldGhpbmcgYmV0dGVyLgorCisyMDA0LTAzLTE0ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiAqLmMsICouaDogcnVuIGdzdC1pbmRlbnQKKworMjAwNC0wMy0xNCAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvbW9kcGx1Zy9nc3Rtb2RwbHVnLmNjOgorCSogZ3N0L21vZHBsdWcvZ3N0bW9kcGx1Zy5oOgorCSAgc2V0IGNvcnJlY3QgdGltZXN0YW1wcyBvbiBvdXRnb2luZyBidWZmZXJzCisKKzIwMDQtMDMtMTQgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L21vZHBsdWcvZ3N0bW9kcGx1Zy5jYzoKKwkgIGhhbmRsZSBldmVudHMgLSBkb24ndCBkbyBjcmFwIHdoZW4gYSBkaXNjb250IGFycml2ZXMgdGhhdCdzIG5vdAorCSAgbmVjZXNzYXJ5CisJICBUaGlzIGFsbG93cyBjb3JyZWN0IGxvYWRpbmcgYW5kIHBsYXliYWNrIG9mIG1vZHMgaW4gUmh5dGhtYm94CisKKzIwMDQtMDMtMTQgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0LWxpYnMvZ3N0L2djb25mL01ha2VmaWxlLmFtOgorCSogcGtnY29uZmlnL01ha2VmaWxlLmFtOgorCSAgbW92ZSBnc3RyZWFtZXItZ2NvbmYgcGtnY29uZmlnIGZpbGVzIHRvIHBrZ2NvbmZpZy8gZGlyLiBNYWtlIHN1cmUKKwkgIHRoZXkgZ2V0IHJlYnVpbHQgcHJvcGVybHkKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIHdoZW4gY2hlY2tpbmcgZm9yIHZvcmJpcywgdHJ5IHBrZ2NvbmZpZyBmaXJzdC4KKwkqIGdzdC9tb2RwbHVnL2dzdG1vZHBsdWcuY2M6CisJICBhZGQgZml4YXRlIGZ1bmN0aW9uCisKKzIwMDQtMDMtMTQgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBGaXggZm9yIG9idmlvdXMgbWlzdGFrZSwgd2hlcmUgd2UgZmlyc3Qgc2hpZnQgdGhlIG9mZnNldCBhbmQgdGhlbgorCSAgcmVhZCBhIHNhbXBsZXNpemUgZWxlbWVudCBhc3N1bWluZyB0aGUgb2xkIG9mZnNldC4gTm90ZSB0aGF0IHRoaXMKKwkgIHBhcnQgc3RpbGwgaGFzIHNvbWV0aGluZyB3ZWlyZCwgaS5lLiBteSBtb3ZpZXMgY29udGFpbmluZyB0aG9zZQorCSAgZG9uJ3QgYWN0dWFsbHkgcGxheSB3ZWxsLCBidXQgYXQgbGVhc3QgdGhlcmUncyBzb21ldGhpbmcgdGhhdCBsb29rcworCSAgbGlrZSBzb3VuZCBub3cuCisKKzIwMDQtMDMtMTQgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAoc3BlZXhfdHlwZV9maW5kKSwKKwkocGx1Z2luX2luaXQpOgorCUFkZCBhIHR5cGVmaW5kIGZ1bmN0aW9uIGZvciBzcGVleCBmb3JtYXQKKworMjAwNC0wMy0xMyAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X3ZpZGVvX2NhcHMpLAorCShnc3RfYXNmX2RlbXV4X3NldHVwX3BhZCk6CisJICBVc2UgMjVmcHMgYXMgb3VyICJmYWtlIiBmcHMgdmFsdWUgKG1hcmtlZCBmb3IgZml4YWdlIGluIDAuOS54KQorCSAgaW5zdGVhZCBvZiAwLiBSZWFzb24gaXMgc2ltcGxlOiBzb21lIGVsZW1lbnRzIGhhdmUgYSBmcHMgcmFuZ2UKKwkgIG9mIDEtbWF4IGluc3RlYWQgb2YgMC1tYXguIFNvIG5vdyBBU0YgdmlkZW8gYWN0dWFsbHkgd29ya3MuCisKKzIwMDQtMDMtMTMgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHBvL0xJTkdVQVM6CisJKiBwby9zci5wbzoKKwkgIGFkZGluZyBzZXJiaWFuIGFzIGEgbGFuZ3VhZ2UKKworMjAwNC0wMy0xMyAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3Qvc2luZS9nc3RzaW5lc3JjLmM6IChnc3Rfc2luZXNyY19nZXQpOgorCSAgcmV0dXJuIHRhZ2xpc3QgY29ycmVjdGx5IGZyb20gX2dldCBmdW5jdGlvbiwgZG9uJ3QgZ3N0X3BhZF9wdXNoIGl0LgorCSAgKGZpeGVzICMxMzcwNDIpCisKKzIwMDQtMDMtMTMgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX2NsYXNzX3Byb2JlX2RldmljZXMpOgorCisyMDA0LTAzLTEzICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhbWl4ZXIuYzogKGdzdF9hbHNhX21peGVyX2ZyZWVfbGlzdCk6CisJKiBleHQvYWxzYS9nc3RhbHNhbWl4ZXJ0cmFjay5jOiAoZ3N0X2Fsc2FfbWl4ZXJfdHJhY2tfY2xhc3NfaW5pdCksCisJKGdzdF9hbHNhX21peGVyX3RyYWNrX25ldyk6CisJKiBleHQvYWxzYS9nc3RhbHNhbWl4ZXJ0cmFjay5oOgorCSAgRml4IGFuY2llbnQgbGVmdG92ZXJzLi4uIE1peGVyVHJhY2sgaXMgYSBHT2JqZWN0LgorCisyMDA0LTAzLTEzICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9jbGFzc19wcm9iZV9kZXZpY2VzKToKKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiAoZ3N0X29zc2VsZW1lbnRfY2xhc3NfcHJvYmVfZGV2aWNlcyk6CisJICBEb24ndCBibG9jayBkdXJpbmcgcHJvYmluZy4uLgorCisyMDA0LTAzLTEyICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9nZXRfdHlwZSksIChnc3RfYWxzYV9jbGFzc19pbml0KSwKKwkoZ3N0X2Fsc2FfZ2V0X3Byb3BlcnR5KSwgKGdzdF9hbHNhX3Byb2JlX2dldF9wcm9wZXJ0aWVzKSwKKwkoZ3N0X2Fsc2FfY2xhc3NfcHJvYmVfZGV2aWNlcyksIChnc3RfYWxzYV9jbGFzc19saXN0X2RldmljZXMpLAorCShnc3RfYWxzYV9wcm9iZV9wcm9iZV9wcm9wZXJ0eSksIChnc3RfYWxzYV9wcm9iZV9uZWVkc19wcm9iZSksCisJKGdzdF9hbHNhX3Byb2JlX2dldF92YWx1ZXMpLCAoZ3N0X2Fsc2FfcHJvYmVfaW50ZXJmYWNlX2luaXQpLAorCShnc3RfYWxzYV9vcGVuX2F1ZGlvKSwgKGdzdF9hbHNhX2Nsb3NlX2F1ZGlvKToKKwkqIGV4dC9hbHNhL2dzdGFsc2EuaDoKKwkgIEFkZCBwcm9wZXJ0eXByb2JlIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiwgYWRkIHNvbWUgZGV2aWNlLW5hbWUKKwkgIHByb3BlcnR5LCBhbGwgdGhpcyBzbyB0aGF0IGl0IGxvb2tzIGdvb2QgaW4gZ25vbWUtdm9sdW1lLWNvbnRyb2wuCisKKzIwMDQtMDMtMTIgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29uZmlndXJlLmFjOiB0aGUgSGVybWVzIGxpYnJhcnkgY29udHJvbHMgaGVybWVzY29sb3JzcGFjZSwgbm90CisJY29sb3JzcGFjZS4KKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOiAoZ3N0X21wZWcyZGVjX2Jhc2VfaW5pdCksCisJKGdzdF9tcGVnMmRlY19pbml0KTogbWlub3IgcGV0IHBlZXZlOiBkaXNhYmxlIGNvZGUgd2l0aCAjaWZkZWYsCisJbm90IC8qICovCisJKiBleHQvc2RsL3NkbHZpZGVvc2luay5jOiBDaGFuZ2UgWElEIHRvIHVuc2lnbmVkIGxvbmcuCisJKiBleHQvc2RsL3NkbHZpZGVvc2luay5oOiBkaXR0by4KKwkqIGdzdC9jb2xvcnNwYWNlL2dzdGNvbG9yc3BhY2UuYzogRml4IG9sZCBjb21tZW50cyBhYm91dCBIZXJtZXMKKworMjAwNC0wMy0xMiAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QtbGlicy9nc3QveG92ZXJsYXkveG92ZXJsYXkuYzogKGdzdF94X292ZXJsYXlfc2V0X3h3aW5kb3dfaWQpLAorCShnc3RfeF9vdmVybGF5X2dvdF94d2luZG93X2lkKToKKwkqIGdzdC1saWJzL2dzdC94b3ZlcmxheS94b3ZlcmxheS5oOgorCSAgcmVwbGFjZSBYSUQgd2l0aCB1bnNpZ25lZCBsb25nIHRvIGdldCByaWQgb2YgdGhlIHhsaWJzIGRlcGVuZGVuY3kgaW4KKwkgIFhPdmVybGF5IChmaXhlcyAjMTM3MDA0KQorCisyMDA0LTAzLTEzICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisJKiBnc3QvZWZmZWN0di9nc3RhZ2luZy5jOiAoZ3N0X2FnaW5ndHZfYmFzZV9pbml0KSwKKwkoZ3N0X2FnaW5ndHZfc2V0dXApOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jOiAoZ3N0X2RpY2V0dl9nZXRfdHlwZSksCisJKGdzdF9kaWNldHZfYmFzZV9pbml0KSwgKGdzdF9kaWNldHZfY2xhc3NfaW5pdCksCisJKGdzdF9kaWNldHZfc2V0dXApLCAoZ3N0X2RpY2V0dl9pbml0KSwgKGdzdF9kaWNldHZfZHJhdyk6CisJKiBnc3QvZWZmZWN0di9nc3RlZGdlLmM6IChnc3RfZWRnZXR2X2dldF90eXBlKSwKKwkoZ3N0X2VkZ2V0dl9iYXNlX2luaXQpLCAoZ3N0X2VkZ2V0dl9jbGFzc19pbml0KSwgKGdzdF9lZGdldHZfaW5pdCksCisJKGdzdF9lZGdldHZfc2V0dXApLCAoZ3N0X2VkZ2V0dl9yZ2IzMik6CisJKiBnc3QvZWZmZWN0di9nc3RlZmZlY3R2LmM6CisJKiBnc3QvZWZmZWN0di9nc3RxdWFyay5jOiAoZ3N0X3F1YXJrdHZfbGluayksIChnc3RfcXVhcmt0dl9pbml0KSwKKwkoZ3N0X3F1YXJrdHZfc2V0X3Byb3BlcnR5KToKKwkqIGdzdC9lZmZlY3R2L2dzdHJldi5jOiAoZ3N0X3JldnR2X2dldF90eXBlKSwKKwkoZ3N0X3JldnR2X2Jhc2VfaW5pdCksIChnc3RfcmV2dHZfY2xhc3NfaW5pdCksIChnc3RfcmV2dHZfaW5pdCksCisJKGdzdF9yZXZ0dl9zZXR1cCksIChnc3RfcmV2dHZfcmdiMzIpOgorCSogZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5jOiAoZ3N0X3NoYWdhZGVsaWN0dl9nZXRfdHlwZSksCisJKGdzdF9zaGFnYWRlbGljdHZfYmFzZV9pbml0KSwgKGdzdF9zaGFnYWRlbGljdHZfY2xhc3NfaW5pdCksCisJKGdzdF9zaGFnYWRlbGljdHZfaW5pdCksIChnc3Rfc2hhZ2FkZWxpY3R2X3NldHVwKSwKKwkoZ3N0X3NoYWdhZGVsaWN0dl9yZ2IzMik6CisJKiBnc3QvZWZmZWN0di9nc3R2ZXJ0aWdvLmM6IChnc3RfdmVydGlnb3R2X2dldF90eXBlKSwKKwkoZ3N0X3ZlcnRpZ290dl9iYXNlX2luaXQpLCAoZ3N0X3ZlcnRpZ290dl9jbGFzc19pbml0KSwKKwkoZ3N0X3ZlcnRpZ290dl9zZXR1cCksIChnc3RfdmVydGlnb3R2X2luaXQpLCAoZ3N0X3ZlcnRpZ290dl9yZ2IzMik6CisJKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6CisJUG9ydCBldmVyeXRoaW5nIHRoYXQgY2FuIGJlIHBvcnRlZCB0byB2aWRlb2ZpbHRlciBhbmQgZml4IHVwIHRoZSBjYXBzLgorCUNhbiBzb21lb25lIHdpdGggYSBiaWctZW5kaWFuIG1hY2hpbmUgcGxlYXNlIGNoZWNrIHRoZXNlPworCisyMDA0LTAzLTEwICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3NzaW5rX2luaXQpLCAoZ3N0X29zc3NpbmtfZ2V0X3RpbWUpLAorCShnc3Rfb3Nzc2lua19jaGFpbiksIChnc3Rfb3Nzc2lua19jaGFuZ2Vfc3RhdGUpOgorCSAgTGF0ZXN0IGZpeGVzIGZvciBBL1Ygc3luYywgYXVkaW8gcGxheWJhY2sgYW5kIHN1Y2guIFRoaXMgaXMgYWJvdXQKKwkgIGFsbC4uLiBNUEVHIHBsYXliYWNrIGlzc3VlcyBhcmUgbW9zdGx5IHJlbGF0ZWQgdG8gdGhlIGFzeW5jIGJ1aWxkLQorCSAgdXAgb2YgTVBFRyBmaWxlcywgSSBjYW5ub3QgZml4IHRoYXQuIFVzZSBiYXNpY2d0aHJlYWQgdG8gc29sdmUgaXQuCisKKzIwMDQtMDMtMTAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwlwYXRjaCBmcm9tOiBTdGVwaGFuZSBMb2V1aWxsZXQKKworCSogY29uZmlndXJlLmFjOgorCSAgdXNlIHBrZy1jb25maWcgZm9yIHNvbWUgbGlicmFyaWVzLCBmYWxsaW5nIGJhY2sgdG8gdGhlIG9sZCAubTQgd2F5CisgICAgICAgICAgKGZpeGVzICMxMzEyNzApCisJKiBtNC9saWJkdi5tNDoKKyAgICAgICAgICByZW1vdmVkCisKKzIwMDQtMDMtMTAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIHRvb2xzL01ha2VmaWxlLmFtOgorCSogdG9vbHMvTWFrZWZpbGUuaW46CisJKiB0b29scy9nc3QtbGF1bmNoLWV4dC1tLm06CisJKiB0b29scy9nc3QtbGF1bmNoLWV4dC4xLmluOgorCSogdG9vbHMvZ3N0LXZpc3VhbGlzZS1tLm06CisJKiB0b29scy9nc3QtdmlzdWFsaXNlLjE6CisJKiB0b29scy9nc3QtdmlzdWFsaXNlLjEuaW46CisgICAgICAgICAgcmVvcmdhbml6aW5nIGdlbmVyYXRpb24gb2Ygc2NyaXB0IHRvb2xzCisKKzIwMDQtMDMtMTAgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9kaXZ4L2dzdGRpdnhkZWMuYzoKKwkgIERvd25ncmFkZSBwcmlvcml0eS4gV2UgcHJlZmVyIGZmZGVjX21wZWc0LgorCSogZXh0L2ZhYWQvZ3N0ZmFhZC5jOiAoZ3N0X2ZhYWRfc3JjZ2V0Y2FwcyksIChnc3RfZmFhZF9zcmNjb25uZWN0KSwKKwkoZ3N0X2ZhYWRfY2hhaW4pLCAoZ3N0X2ZhYWRfY2hhbmdlX3N0YXRlKToKKwkgIEZpeCBjYXBzbmVnby4gRG9lc24ndCB3b3JrIGZvciBzb21lIHNvdW5kcyBiZWNhdXNlIHdlIGRvbid0IGhhdmUKKwkgIGEgNToxIHRvIHN0ZXJlbyBlbGVtZW50LgorCSogZXh0L3h2aWQvZ3N0eHZpZC5jOiAocGx1Z2luX2luaXQpOgorCSAgQWRkIHByaW9yaXR5LgorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3Nzc2lua19pbml0KSwgKGdzdF9vc3NzaW5rX2NoYWluKSwKKwkoZ3N0X29zc3NpbmtfY2hhbmdlX3N0YXRlKToKKwkgIEFkZCBkaXNjb250IGhhbmRsaW5nLgorCisyMDA0LTAzLTA5ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiBGaXggdHlwbyBpbiB3aWR0aCA4CisJY29udmVyc2lvbi4KKworMjAwNC0wMy0wOSAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvbWl4ZXIuYzogKGdzdF9taXhlcl9jbGFzc19pbml0KToKKwkgIHRoZSBzaWduYWxzIHRha2UgMiBhcmd1bWVudHMKKworMjAwNC0wMy0wOSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9yZXF1ZXN0X25ld19wYWQpLAorCShnc3RfYWxzYV9maXhhdGUpOiBBZGQgZml4YXRlIGZ1bmN0aW9uLiAgKGJ1ZyAjMTM2Njg2KQorCSogZXh0L2Fsc2EvZ3N0YWxzYS5oOgorCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfaW5pdCk6CisKKzIwMDQtMDMtMDkgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L21pa21vZC9nc3RtaWttb2QuYzogKGdzdF9taWttb2RfaW5pdCksIChnc3RfbWlrbW9kX2xvb3ApLAorCShnc3RfbWlrbW9kX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQvbWlrbW9kL2dzdG1pa21vZC5oOgorCSAgbWFrZSBtaWttb2QncyBsb29wIGZ1bmN0aW9uIG5vdCBsb29wIGluZmluaXRlbHkgYW5kIGNhbGwKKwkgIGdzdF9lbGVtZW50X3lpZWxkIGFueW1vcmUKKwkqIGdzdC9tb2RwbHVnL2dzdG1vZHBsdWcuY2M6CisJICBmaXggcGFkIG5lZ290aWF0aW9uIChmaXhlcyAjMTM2NTkwKQorCisyMDA0LTAzLTA5ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9sY3MvTWFrZWZpbGUuYW06ICBGaXggc28gdGhhdCB0aGUgbGNzIGNvbG9yc3BhY2UgcGx1Z2luCisJZG9lc24ndCBjb25mbGljdCB3aXRoIHRoZSBpbnRlcm5hbCBjb2xvcnNwYWNlIHBsdWdpbi4KKwkqIGdzdC1saWJzL2dzdC9hdWRpby9tYWtlX2ZpbHRlcjogIFVzZSBgYCBpbnN0ZWFkIG9mICQoKSB0bworCXNhdGlzZnkgdGhlIGNyYXBweS1hc3Mgc2hlbGwgc2hpcHBlZCBieSBhIGNlcnRhaW4gdmVuZG9yLgorCSogZ3N0L3ZpZGVvZmlsdGVyL21ha2VfZmlsdGVyOiBzYW1lIChidWcgIzEzNTI5OSkKKworMjAwNC0wMy0wOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOiBidW1wIG5hbm8gdG8gMQorCis9PT0gcmVsZWFzZSAwLjcuNiA9PT0KKworMjAwNC0wMy0wOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmluOiByZWxlYXNpbmcgMC43LjYsICJUaGVyZSIKKworMjAwNC0wMy0wOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogcGtnY29uZmlnL2dzdHJlYW1lci1wbGF5LXVuaW5zdGFsbGVkLnBjLmluOgorCSogcGtnY29uZmlnL2dzdHJlYW1lci1wbGF5LnBjLmluOgorICAgICAgICAgIHN5bmNocm9uaXplIHRoZSB0d28KKworMjAwNC0wMy0wOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L2NkcGFyYW5vaWEvZ3N0Y2RwYXJhbm9pYS5jOiAoY2RwYXJhbm9pYV9iYXNlX2luaXQpLAorCShjZHBhcmFub2lhX29wZW4pLCAoY2RwYXJhbm9pYV9ldmVudCk6CisJICBmaXgvYWRkIGVycm9yIGhhbmRsaW5nCisJKiBwby9QT1RGSUxFUy5pbjoKKwkgIGFkZCBjZHBhcmFub2lhIHNvdXJjZQorCSogdG9vbHMvTWFrZWZpbGUuYW06CisJICBtYWtlIHNjcmlwdHMgZXhlY3V0YWJsZQorCisyMDA0LTAzLTA5ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvdm9yYmlzL01ha2VmaWxlLmFtOgorCSogc3lzL01ha2VmaWxlLmFtOgorCSAgcmVtb3ZlIGlkM3R5cGVzLCB2b3JiaXNmaWxlIGFuZCB4dmlkZW9zaW5rIGZyb20gdGhlIGJ1aWxkICgjMTMzNzgzKQorCisyMDA0LTAzLTA4ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuYzogKGdzdF9yaWZmX3JlYWRfaW5mbyk6CisJICBGaXggbWV0YWRhdGEgcmVhZCBjcmFzaCAoIzEzNjUzNykuCisKKzIwMDQtMDMtMDggIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8tcHJpdi5jOiAoZ21pX3NldF9taW1lKToKKwkqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8uYzogKGdzdF9tZWRpYV9pbmZvX3JlYWQpOgorICAgICAgICAgIGFkZGluZyBtaW1lIHR5cGVzLCBmaXhpbmcgdGhlIG9uZS1zdG9wIGZ1bmN0aW9uCisKKzIwMDQtMDMtMDggIENocmlzdGlhbiBTY2hhbGxlciA8VXJhZXVzQGdub21lLm9yZz4KKworCSogZXh0L25hcy9uYXNzaW5rLmMgYW5kIC9leHQvbmFzL25hc3NpbmsuaDoKKwlNb3JlIE5BUyBsb3ZlIGZyb20gQXJ3ZWQgdm9uIE1lcmthdHoKKwlTbyBsZXRzIGFsbCBzaW5nICdDYW4geW91IGZlZWwgdGhlIE5BUyB0b25pZ2h0JworCisyMDA0LTAzLTA4ICBDaHJpc3RpYW4gU2NoYWxsZXIgPFVyYWV1c0Bnbm9tZS5vcmc+CisKKwkqIHRvb2xzL2dzdC1sYXVuY2gtZXh0LmluOgorCVJlcGxhY2Ugdm9yYmlzZmlsZSB3aXRoIG9nZ2RlbXV4L3ZvcmJpc2RlYy9hdWRpb2NvbnZlcnQKKworMjAwNC0wMy0wOCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmM6IChnc3RfbXBlZzJkZWNfYmFzZV9pbml0KSwKKwkoZ3N0X21wZWcyZGVjX2luaXQpOgorICAgICAgICByZW1vdmUgdGhlIHVzZXJfZGF0YSBwYWQgZm9yIG5vdywgYmVjYXVzZSBpdCBpcyBiZWluZyB1c2VkIGluCisgICAgICAgIGZpeGF0aW5nIGNhdXNpbmcgTVBFRyBwbGF5YmFjayB0byBmaXhhdGUgb24gMTAwMCBIeiBmb3IgcGxheWJhY2suCisgICAgICAgIElmIHNvbWVvbmUga25vd3MgaG93IHRvIGZpeCB0aGlzIHByb3Blcmx5LCBwbGVhc2UgZG8uCisKKzIwMDQtMDMtMDggIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc3NpbmtfZ2V0X2RlbGF5KSwKKwkoZ3N0X29zc3NpbmtfZ2V0X3RpbWUpOgorICAgICAgICBhZGQgYSB3YXJuaW5nLCBJTU8gdGhpcyB3b24ndCBnZXQgdHJpZ2dlcmVkIGFueW1vcmUsIHJlbW92ZSBsYXRlcgorCisyMDA0LTAzLTA3ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfdmlkZW9fY2Fwcyk6ICBBZGRlZCBDaW5lcGFrCisJZm9ybWF0IChidWcgIzEzNjQ3MCkKKworMjAwNC0wMy0wNyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0LWxpYnMvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8tcHJpdi5jOiAoZm91bmRfdGFnX2NhbGxiYWNrKSwKKwkoZXJyb3JfY2FsbGJhY2spLCAoZ3N0X21lZGlhX2luZm9fZXJyb3JfY3JlYXRlKSwKKwkoZ3N0X21lZGlhX2luZm9fZXJyb3JfZWxlbWVudCksIChnbWlwX2luaXQpLCAoZ21pcF9yZXNldCksCisJKGdtaV9jbGVhcl9kZWNvZGVyKSwgKGdtaXBfZmluZF90eXBlX3ByZSksIChnbWlwX2ZpbmRfdHlwZSk6CisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLXByaXYuaDoKKwkqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8tdGVzdC5jOiAobWFpbik6CisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLmM6IChnc3RfbWVkaWFfaW5mb19pbml0KSwKKwkoZ3N0X21lZGlhX2luZm9fY2xhc3NfaW5pdCksIChnc3RfbWVkaWFfaW5mb19pbnN0YW5jZV9pbml0KSwKKwkoZ3N0X21lZGlhX2luZm9fc2V0X3NvdXJjZSksIChnc3RfbWVkaWFfaW5mb19yZWFkX3dpdGhfaWRsZXIpLAorCShnc3RfbWVkaWFfaW5mb19yZWFkX2lkbGVyKSwgKGdzdF9tZWRpYV9pbmZvX3JlYWQpOgorCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby5oOgorCWZpeGVkLCBzaG91bGQgd29yayBub3cKKworMjAwNC0wMy0wNyAgQ2hyaXN0aWFuIFNjaGFsbGVyIDxVcmFldXNAZ25vbWUub3JnPgorCisJKiBleHQvbmFzL25hc3NpbmsuYzoKKwlBIGJ1bmNoIG9mIE5BUyBmaXhlcyBmcm9tIEFyd2VkIHZvbiBNZXJrYXR6CisKKzIwMDQtMDMtMDYgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pLAorCShxdGRlbXV4X3BhcnNlX3RyYWspOgorCSAgRml4IGNyYXNoIChqIG1pZ2h0IGJlIGdyZWF0ZXIgdGhhbiBuX3NhbXBsZXMsIGluIHdoaWNoIGNhc2Ugd2UncmUKKwkgIHdyaXRpbmcgb3V0c2lkZSB0aGUgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGUgYXJyYXkpIGFuZCBtZW1sZWFrLgorCisyMDA0LTAzLTA2ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3NzaW5rX2NoYWluKToKKwkgIEFuZCBhbm90aGVyIGNhbGxlciB0aGF0IGNvdWxkbid0IGhhbmRsZSBkZWxheSA8IDAgKHVuc2lnbmVkCisJICBpbnRlZ2VyIG92ZXJmbG93KS4gVmlkZW8gbm93IGNvbnRpbnVlcyBwbGF5aW5nIG9uIGFuIGF1ZGlvCisJICBidWZmZXIgdW5kZXJydW4sIGFuZCB0aGUgY2xvY2sgY29udGludWVzIHdvcmtpbmcuIEF1ZGlvIHN0aWxsCisJICBzdGFsbHMuCisKKzIwMDQtMDMtMDYgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc3NpbmtfZ2V0X2RlbGF5KSwKKwkoZ3N0X29zc3NpbmtfZ2V0X3RpbWUpOgorCSAgZ2V0X2RlbGF5KCkgbWF5IHJldHVybiB2YWx1ZXMgbG93ZXIgdGhhbiAwLiBJbiB0aG9zZSBjYXNlcywgd2UKKwkgIHNob3VsZCBub3QgYWN0dWFsbHkgY2FzdCB0byAqdW5zaWduZWQqIGludDY0LCB0aGF0IHdpbGwgYnJlYWsKKwkgIHN0dWZmIGhvcnJpYmx5LiBJbiBteSBjYXNlLCBpdCBzY3Jld2VkIHVwIEEvViBzeW5jIGluIG1vdmllcworCSAgaW4gdG90ZW0gcmF0aGVyIGJhZGx5LgorCisyMDA0LTAzLTA2ICBDaHJpc3RvcGhlIEZlcmdlYXUgIDx0ZXVmQGdub21lLm9yZz4KKworCSogZXh0L2ZhYWMvZ3N0ZmFhYy5jOiAoZ3N0X2ZhYWNfY2hhaW4pOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOiAoZ3N0X2ZsYWNfdGFnX2NoYWluKToKKwkqIGV4dC9saWJwbmcvZ3N0cG5nZW5jLmM6ICh1c2VyX3dyaXRlX2RhdGEpOgorCSogZXh0L21pa21vZC9nc3RtaWttb2QuYzogKGdzdF9taWttb2RfbG9vcCk6CisJKiBnc3QvYWMzcGFyc2UvZ3N0YWMzcGFyc2UuYzogKGdzdF9hYzNwYXJzZV9jaGFpbik6CisJKiBnc3QvbXBlZzJzdWIvZ3N0bXBlZzJzdWJ0LmM6IChnc3RfbXBlZzJzdWJ0X2NoYWluX3N1YnRpdGxlKToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdHJmYzIyNTBlbmMuYzogKGdzdF9yZmMyMjUwX2VuY19hZGRfc2xpY2UpOgorCUZpeCBzZXZlcmFsIG1pc3VzZSBvZiBnc3RfYnVmZmVyX21lcmdlIChpdCBkb2Vzbid0IHRha2Ugb3duZXJzaGlwCisJb2YgYW55IGJ1ZmZlciksIHNob3VsZCBmaXggc29tZSBsZWFrcy4gSSBob3BlIEkgZGlkbid0IHVucmVmIGJ1ZmZlcnMKKwl0aGF0IHNob3VsZG4ndCBiZS4uLgorCisyMDA0LTAzLTA2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLXByaXYuYzogKGhhdmVfdHlwZV9jYWxsYmFjayksCisJKGRlZXBfbm90aWZ5X2NhbGxiYWNrKSwgKHRhZ19mbGFnX3Njb3JlKSwgKGZvdW5kX3RhZ19jYWxsYmFjayksCisJKGVycm9yX2NhbGxiYWNrKSwgKGdtaV9yZXNldCksIChnbWlfc2Vla190b190cmFjayksCisJKGdtaV9nZXRfZGVjb2RlciksIChnbWlfc2V0X21pbWUpLCAoZ21pcF9maW5kX3R5cGVfcHJlKSwKKwkoZ21pcF9maW5kX3R5cGVfcG9zdCksIChnbWlwX2ZpbmRfc3RyZWFtX3Bvc3QpLAorCShnbWlwX2ZpbmRfdHJhY2tfc3RyZWFtaW5mb19wb3N0KToKKwkqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8tcHJpdi5oOgorCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby10ZXN0LmM6IChwcmludF90YWcpLAorCShpbmZvX3ByaW50KSwgKG1haW4pOgorCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby5jOgorCShnc3RfbWVkaWFfaW5mb19lcnJvcl9jcmVhdGUpLCAoZ3N0X21lZGlhX2luZm9fZXJyb3JfZWxlbWVudCksCisJKGdzdF9tZWRpYV9pbmZvX2luc3RhbmNlX2luaXQpLCAoZ3N0X21lZGlhX2luZm9fZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X21lZGlhX2luZm9fbmV3KSwgKGdzdF9tZWRpYV9pbmZvX3NldF9zb3VyY2UpLAorCShnc3RfbWVkaWFfaW5mb19yZWFkX2lkbGVyKSwgKGdzdF9tZWRpYV9pbmZvX3JlYWQpOgorCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby5oOgorICAgICAgICAgIGZpcnN0IHBhc3MgYXQgbWFraW5nIHRoaXMgd29yayBhZ2Fpbi4gIFRoaXMgc2VlbXMgdG8gd29yayBvbgorICAgICAgICAgIHRhZ2dlZCBvZ2cvdm9yYmlzIGFuZCBtcDMgZmlsZXMuCisKKzIwMDQtMDMtMDYgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX2NoYWluKToKKwkgIGZpeCBodWdlIGxlYWs6IGdzdF9idWZmZXJfbWVyZ2UgZG9lc24ndCB1bnJlZiB0aGUgZmlyc3QgYXJndW1lbnQKKwkgIGl0c2VsZi4KKworMjAwNC0wMy0wNiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfY2xhc3NfaW5pdCksIChnc3RfbWFkX3VwZGF0ZV9pbmZvKToKKyAgICAgICAgICByZXBvcnQgbGF5ZXIvbW9kZS9lbXBoYXNpcworCisyMDA0LTAzLTA2ICBDaHJpc3RvcGhlIEZlcmdlYXUgIDx0ZXVmQGdub21lLm9yZz4KKworCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfY2hhaW4pOiBmaXhlZCBjYXBzIGxlYWsKKworMjAwNC0wMy0wNiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19wYWRfbmV3KToKKyAgICAgICAgICBzaWduYWwgc2VyaWFsCisKKzIwMDQtMDMtMDYgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC92b3JiaXMvdm9yYmlzLmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jOiAodm9yYmlzX2RlY19nZXRfZm9ybWF0cyksCisJKGdzdF92b3JiaXNfZGVjX2luaXQpLCAodm9yYmlzX2RlY19ldmVudCk6CisgICAgICAgIGFkZCBkZWJ1ZyBjYXRlZ29yeQorICAgICAgICBtYWtlIHZvcmJpc2RlYyBoYW5kbGUgX0JZVEUgYW5kIF9USU1FIHF1ZXJpZXMKKworMjAwNC0wMy0wNiAgQ2hyaXN0b3BoZSBGZXJnZWF1ICA8dGV1ZkBnbm9tZS5vcmc+CisKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2NoYWluKTogc2VuZCB0aGUgYXZlcmFnZSBiaXRyYXRlIHJlYWQKKwkgIGZyb20gdGhlIHhpbmcgaGVhZGVyCisKKzIwMDQtMDMtMDYgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKGdzdF9hdWRpb19jb252ZXJ0X2dldGNhcHMpLAorCShnc3RfYXVkaW9fY29udmVydF9saW5rKSwgKGdzdF9hdWRpb19jb252ZXJ0X2NoYW5nZV9zdGF0ZSksCisJKGdzdF9hdWRpb19jb252ZXJ0X2J1ZmZlcl9mcm9tX2RlZmF1bHRfZm9ybWF0KToKKwkgIGRvIGNvbnZlcnNpb25zIGZyb20vdG8gZmxvYXQgY29ycmVjdGx5LCBmaXggc29tZSBjYXBzIG5lZ28gZXJyb3JzLAorCSAgZXhwb3J0IGNvcnJlY3Qgc3VwcG9ydGVkIGNhcHMgaW4gdGVtcGxhdGUgYW5kIGdldGNhcHMsIHVzZSBjb3JyZWN0CisJICBjYXBzIGluIHRyeV9zZXRfY2FwcyBmdW5jdGlvbnMKKworMjAwNC0wMy0wNiAgQ2hyaXN0b3BoZSBGZXJnZWF1ICA8dGV1ZkBnbm9tZS5vcmc+CisKKwlGb3Igc29tZSByZWFzb24sIEkgb25seSBjb21taXR0ZWQgYSBDaGFuZ2VMb2cgZW50cnkgeWVzdGVyZGF5IGFuZAorCW5vdCB0aGUgY29ycmVzcG9uZGluZyBjb2RlLi4uCisJKiBleHQvbWFkL2dzdG1hZC5jOiBGaXggZGV0ZWN0aW9uIG9mIFhpbmcgaGVhZGVycworCSogZ3N0L3RhZ3MvZ3N0aWQzdGFnLmM6IENoYW5nZXMgdG8gc3VwcG9ydCBUTEVOIHRhZ3MKKworMjAwNC0wMy0wNiAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2dldF9wYWRfYnlfcGFkKSwKKwkoZ3N0X29nZ19kZW11eF9zcmNfcXVlcnkpOgorCSAgbWFrZSBzdXJlIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGVyZSdzIG5vIGN1cnJlbnQgY2hhaW4KKwkgIGdyYWNlZnVsbHkuCisKKzIwMDQtMDMtMDUgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2FhbGliL2dzdGFhc2luay5jOiAoZ3N0X2Fhc2lua19maXhhdGUpLCAoZ3N0X2Fhc2lua19pbml0KToKKwlBZGQgZml4YXRlIGZ1bmN0aW9uLiAoYnVnICMxMzExMjgpCisJKiBleHQvc2RsL3NkbHZpZGVvc2luay5jOiAoZ3N0X3NkbHZpZGVvc2lua19pbml0KSwKKwkoZ3N0X3NkbHZpZGVvc2lua19maXhhdGUpOiAgQWRkIGZpeGF0ZSBmdW5jdGlvbi4KKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChnc3RfYXVkaW9fY29udmVydF9saW5rKToKKwlGaXggYXR0ZW1wdCB0byBwcmludCBhIG5vbi1wb2ludGVyIHVzaW5nIEdTVF9QVFJfRk9STUFULgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGFyc2VfZm10KToKKwlGaXggbWlzc2luZyBicmVhayB0aGF0IHdhcyBjYXVzaW5nIHVsYXcgdG8gYmUgaW50ZXJwcmV0ZWQgYXMKKwlyYXcgaW50LgorCisyMDA0LTAzLTA1ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdHJmYzIyNTBlbmMuYzogKGdzdF9yZmMyMjUwX2VuY19hZGRfc2xpY2UpOgorCUZpeCBjb2RlIHRoYXQgaWdub3JlcyByZXR1cm4gdmFsdWUgb2YgZ3N0X2J1ZmZlcl9tZXJnZSgpLgorCShidWcgIzExNDU2MCkKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoZ3N0X2FzZl9kZW11eF9kZXNjcmFtYmxlX3NlZ21lbnQpOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0cmZjMjI1MGVuYy5jOiAoZ3N0X3JmYzIyNTBfZW5jX2FkZF9zbGljZSk6IHNhbWUKKwkqIHRlc3RzdWl0ZS9nc3QtbGludDogIENoZWNrIGZvciBhYm92ZS4KKworMjAwNC0wMy0wNSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19nZXQpOiAgQ2hlY2sgZm9yIHVuZml4ZWQKKwljYXBzIGFuZCB0aHJvdyBhbiBlbGVtZW50IGVycm9yLiAgKGJ1ZyAjMTM2MzM0KQorCisyMDA0LTAzLTA1ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9mYWFkL2dzdGZhYWQuYzogKGdzdF9mYWFkX2luaXQpLCAoZ3N0X2ZhYWRfc3JjZ2V0Y2FwcyksCisJKGdzdF9mYWFkX2NoYWluKTogRml4IG5lZ290aWF0aW9uLgorCSogZXh0L2xpYnJmYi9nc3RyZmJzcmMuYzogKGdzdF9yZmJzcmNfaGFuZGxlX3NyY19ldmVudCk6IEFkZAorCWtleSBhbmQgYnV0dG9uIGV2ZW50cy4KKwkqIGdzdC1saWJzL2dzdC9mbG9hdGNhc3QvZmxvYXRjYXN0Lmg6IEZpeCBhIG1pbm9yIGJ1ZyBpbiB0aGlzCisJZHVuZyBoZWFwIG9mIGNvZGUuCisJKiBnc3QtbGlicy9nc3QvZ2NvbmYvZ3N0cmVhbWVyLWdjb25mLXVuaW5zdGFsbGVkLnBjLmluOiBnc3RnY29uZgorCWRlcGVuZHMgb24gZ2NvbmYKKwkqIGdzdC1saWJzL2dzdC9nY29uZi9nc3RyZWFtZXItZ2NvbmYucGMuaW46IHNhbWUKKwkqIGdzdC1saWJzL2dzdC9wbGF5L3BsYXkuYzogKGdzdF9wbGF5X3BpcGVsaW5lX3NldHVwKSwKKwkoZ3N0X3BsYXlfdmlkZW9fZml4YXRlKSwgKGdzdF9wbGF5X2F1ZGlvX2ZpeGF0ZSk6IEFkZCBhIGZpeGF0ZQorCWZ1bmN0aW9uIHRvIGVuY291cmFnZSBiZXR0ZXIgbmVnb3RpYXRpb24sIHBhcnRpY3VsYXJseSBiZXR3ZWVuCisJYXVkaW9jb252ZXJ0IGFuZCBvc3NzaW5rLgorCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKGdzdF9hdWRpb19jb252ZXJ0X2NoYWluKToKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHF0ZGVtdXhfcGFyc2VfdHJhayk6ICBNYWtlIHNvbWUgZGVidWdnaW5nCisJbW9yZSBpbXBvcnRhbnQuCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogIEZpeCBtaXN0YWtlIGluIGZsYXNoCisJdHlwZWZpbmRpbmcuCisJKiBnc3QvdmJpZGVjL3ZiaXNjcmVlbi5jOiAgQWRkIGdsaWIgaGVhZGVyCisJKiBwa2djb25maWcvZ3N0cmVhbWVyLXBsYXkucGMuaW46ICBEZXBlbmRzIG9uIGdzdC1pbnRlcmZhY2VzLgorCisyMDA0LTAzLTA2ICBDaHJpc3RvcGhlIEZlcmdlYXUgIDx0ZXVmQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZXh0L21hZC9nc3RtYWQuYzogRml4IGRldGVjdGlvbiBvZiBYaW5nIGhlYWRlcnMKKwkqIGdzdC90YWdzL2dzdGlkM3RhZy5jOiBDaGFuZ2VzIHRvIHN1cHBvcnQgVExFTiB0YWdzCisKKzIwMDQtMDMtMDYgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX3BhcnNlX2ZtdCksCisJKGdzdF93YXZwYXJzZV9wYWRfY29udmVydCksIChnc3Rfd2F2cGFyc2VfcGFkX3F1ZXJ5KToKKyAgICAgICAgICBkZWJ1ZyB1cGRhdGVzCisKKzIwMDQtMDMtMDYgIENocmlzdG9waGUgRmVyZ2VhdSAgPHRldWZAZ25vbWUub3JnPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X21hZF9pZDNfdG9fdGFnX2xpc3QpOgorCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfaW5pdCksIChpc194aGVhZCksCisJKG1wZzEyM19wYXJzZV94aW5nX2hlYWRlciksIChnc3RfbWFkX2NoYWluKTogcGFyc2UgWGluZyBoZWFkZXIgaW4gdmJyCisJZmlsZXMsIGFuZCByZXBvcnQgdGhlIHBhcnNlZCBsZW5ndGggYXMgYSBHU1RfVEFHX0RVUkFUSU9OIHRhZy4KKwkqIGdzdC90YWdzL2dzdGlkM3RhZy5jOiBzdXBwb3J0IFRMRU4gKGR1cmF0aW9uKSB0YWcKKworMjAwNC0wMy0wNSAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiAoZ3N0X2F1ZGlvX2NvbnZlcnRfY2hhbm5lbHMpOgorCSAgY29udmVydCBjaGFubmVscyBjb3JyZWN0bHkuIGNvbnZlcnQgY29ycmVjdGx5IHRvIHVuc2lnbmVkLgorCisyMDA0LTAzLTA1ICBKdWxpZW4gTU9VVFRFIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19jaGFuZ2Vfc3RhdGUpOiBDaGVjayBpZgorCXdlIGhhdmUgYSB3aW5kb3cgYmVmb3JlIGNsZWFyaW5nIGl0LgorCisyMDA0LTAzLTA1ICBKdWxpZW4gTU9VVFRFIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19jaGFuZ2Vfc3RhdGUpOiBDaGVjayBpZiB3ZQorCWhhdmUgYSB3aW5kb3cgYmVmb3JlIGNsZWFyaW5nIGl0LgorCisyMDA0LTAzLTA1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnY29uZi9nc3RyZWFtZXIuc2NoZW1hcy5pbjoKKwkqIGdzdC1saWJzL2dzdC9nY29uZi9NYWtlZmlsZS5hbToKKyAgICAgICAgICB2ZXJzaW9uIGluc3RhbGxhdGlvbiBwYXRoIHRoZSBzYW1lIHdheSBhcyBmb3IgMC42CisJKiBwa2djb25maWcvZ3N0cmVhbWVyLWludGVyZmFjZXMtdW5pbnN0YWxsZWQucGMuaW46CisJKiBwa2djb25maWcvZ3N0cmVhbWVyLWxpYnMtdW5pbnN0YWxsZWQucGMuaW46CisJKiBwa2djb25maWcvZ3N0cmVhbWVyLXBsYXktdW5pbnN0YWxsZWQucGMuaW46CisgICAgICAgICAgcmVtb3ZlIGNvbW1lbnQgdGhhdCB3YXMgZml4ZWQKKworMjAwNC0wMy0wNSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9nZXRfc3JjX2Zvcm1hdHMpLAorCShnc3RfcXRkZW11eF9zcmNfY29udmVydCksIChnc3RfcXRkZW11eF9nZXRfc3JjX3F1ZXJ5X3R5cGVzKSwKKwkoZ3N0X3F0ZGVtdXhfZ2V0X2V2ZW50X21hc2spLCAoZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19xdWVyeSksCisJKGdzdF9xdGRlbXV4X2hhbmRsZV9zcmNfZXZlbnQpLCAoZ3N0X3F0ZGVtdXhfYWRkX3N0cmVhbSk6CisJQWRkIHByb3RvdHlwZSBjb2RlIGZvciBoYW5kbGluZyBzZWVraW5nIGFuZCBxdWVyeWluZy4KKworMjAwNC0wMy0wNCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXhhbXBsZXMvZ3N0cGxheS9wbGF5ZXIuYzogKG1haW4pOgorCSAgSW5pdGlhbGl6ZSB2YXJpYWJsZXMgdG8gTlVMTC4gUHJldmVudHMgYSBzZWdmYXVsdCBiZWNhdXNlIHRoZQorCSAgKHVuaW5pdGlhbGl6ZWQpIHZhcmlhYmxlIGlzIG5vdCBOVUxMLCByZXN1bHRpbmcgaW4gYSBjcmFzaCBvbgorCSAgdHJ5aW5nIHRvIHJlYWNoIGVycm9yLT5tZXNzYWdlLgorCisyMDA0LTAzLTA1ICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6CisJKGdzdF9hdWRpb19jb252ZXJ0X2J1ZmZlcl90b19kZWZhdWx0X2Zvcm1hdCk6CisJbWFrZSBmbG9hdD0+aW50IGNvbnZlcnNpb24gd29yayBjb3JyZWN0bHkgZXZlbiBpbiBjb3JuZXJjYXNlcy4KKworMjAwNC0wMy0wNCAgRGF2aWQgSS4gTGVobiAgPGRsZWhuQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZGViaWFuL1JFQURNRS5EZWJpYW46CisJKiBkZWJpYW4vYnVpbGQtZGVwczoKKwkqIGRlYmlhbi9jaGFuZ2Vsb2c6CisJKiBkZWJpYW4vY29udHJvbDoKKwkqIGRlYmlhbi9jb250cm9sLmluOgorCSogZGViaWFuL2NvcHlyaWdodDoKKwkqIGRlYmlhbi9nc3RyZWFtZXItYTUyZGVjLmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci1hYS5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItYWxzYS5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItYWxzYS5tYW5wYWdlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItYXJ0cy5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItYXJ0c2QuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLWF1ZGlvZmlsZS5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItYXZpZmlsZS5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItY2RwYXJhbm9pYS5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItY29sb3JzcGFjZS5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItZG9jLmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci1kdi5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItZHZkLmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci1lc2QuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLWZlc3RpdmFsLmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci1mbGFjLmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci1nY29uZi5jb25mZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLWdjb25mLmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci1nY29uZi5wb3N0aW5zdDoKKwkqIGRlYmlhbi9nc3RyZWFtZXItZ25vbWV2ZnMuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLWdzbS5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItaHR0cC5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItamFjay5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItanBlZy5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItbWFkLmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci1taWttb2QuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLW1pc2MuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLW1wZWcyZGVjLmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci1vc3MuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLXBsdWdpbi1hcHBzLmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci1wbHVnaW4tYXBwcy5tYW5wYWdlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItcGx1Z2luLWxpYnMtZGV2LmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci1wbHVnaW4tbGlicy5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItcGx1Z2luLXRlbXBsYXRlLnBvc3RpbnN0OgorCSogZGViaWFuL2dzdHJlYW1lci1wbHVnaW4tdGVtcGxhdGUucG9zdHJtOgorCSogZGViaWFuL2dzdHJlYW1lci1zZGwuZmlsZXM6CisJKiBkZWJpYW4vZ3N0cmVhbWVyLXNpZC5maWxlczoKKwkqIGRlYmlhbi9nc3RyZWFtZXItdm9yYmlzLmZpbGVzOgorCSogZGViaWFuL2dzdHJlYW1lci14LmZpbGVzOgorCSogZGViaWFuL21rLmNvbnRyb2w6CisJKiBkZWJpYW4vcnVsZXM6CisJRGViaWFuIHBhY2thZ2UgaW5mbyBub3QgbWFpbnRhaW5lZCBoZXJlLgorCisyMDA0LTAzLTA0ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6IChnc3RfYWFzaW5rX2NsYXNzX2luaXQpOgorCSogZXh0L2NkYXVkaW8vZ3N0Y2RhdWRpby5jOiAoZ3N0X2NkYXVkaW9fY2xhc3NfaW5pdCk6CisJKiBleHQvY2RwYXJhbm9pYS9nc3RjZHBhcmFub2lhLmM6IChjZHBhcmFub2lhX2NsYXNzX2luaXQpOgorCSogZXh0L2RpdngvZ3N0ZGl2eGVuYy5jOiAoZ3N0X2RpdnhlbmNfY2xhc3NfaW5pdCk6CisJKiBleHQvZHZkbmF2L2R2ZG5hdnNyYy5jOiAoZHZkbmF2c3JjX2NsYXNzX2luaXQpOgorCSogZXh0L2dzbS9nc3Rnc21lbmMuYzogKGdzdF9nc21lbmNfY2xhc3NfaW5pdCk6CisJKiBleHQvanBlZy9nc3RqcGVnZW5jLmM6IChnc3RfanBlZ2VuY19jbGFzc19pbml0KToKKwkqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uYzogKGdzdF9tdXNpY2JyYWluel9jbGFzc19pbml0KToKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiAoZ3N0X3NwZWV4ZW5jX2NsYXNzX2luaXQpOgorCSogZXh0L3h2aWQvZ3N0eHZpZGVuYy5jOiAoZ3N0X3h2aWRlbmNfY2xhc3NfaW5pdCk6CisJKiBnc3QtbGlicy9nc3QvY29sb3JiYWxhbmNlL2NvbG9yYmFsYW5jZS5jOgorCShnc3RfY29sb3JfYmFsYW5jZV9jbGFzc19pbml0KToKKwkqIGdzdC1saWJzL2dzdC9jb2xvcmJhbGFuY2UvY29sb3JiYWxhbmNlY2hhbm5lbC5jOgorCShnc3RfY29sb3JfYmFsYW5jZV9jaGFubmVsX2NsYXNzX2luaXQpOgorCSogZ3N0LWxpYnMvZ3N0L21peGVyL21peGVyLmM6IChnc3RfbWl4ZXJfY2xhc3NfaW5pdCk6CisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5LmM6IChnc3RfcGxheV9jbGFzc19pbml0KToKKwkqIGdzdC1saWJzL2dzdC9wcm9wZXJ0eXByb2JlL3Byb3BlcnR5cHJvYmUuYzoKKwkoZ3N0X3Byb3BlcnR5X3Byb2JlX2lmYWNlX2luaXQpOgorCSogZ3N0LWxpYnMvZ3N0L3R1bmVyL3R1bmVyLmM6IChnc3RfdHVuZXJfY2xhc3NfaW5pdCk6CisJKiBnc3QtbGlicy9nc3QvdHVuZXIvdHVuZXJjaGFubmVsLmM6CisJKGdzdF90dW5lcl9jaGFubmVsX2NsYXNzX2luaXQpOgorCSogZ3N0LWxpYnMvZ3N0L3hvdmVybGF5L3hvdmVybGF5LmM6IChnc3RfeF9vdmVybGF5X2Jhc2VfaW5pdCk6CisJKiBnc3QvY3V0dGVyL2dzdGN1dHRlci5jOiAoZ3N0X2N1dHRlcl9jbGFzc19pbml0KToKKwkqIGdzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYzogKGdzdF92ZXJ0aWdvdHZfY2xhc3NfaW5pdCk6CisJKiBzeXMvY2Ryb20vZ3N0Y2RwbGF5ZXIuYzogKGNkcGxheWVyX2NsYXNzX2luaXQpOgorCSogc3lzL2R4cjMvZHhyM3NwdXNpbmsuYzogKGR4cjNzcHVzaW5rX2NsYXNzX2luaXQpOgorCSogc3lzL3Y0bC9nc3R2NGxtanBlZ3NpbmsuYzogKGdzdF92NGxtanBlZ3NpbmtfY2xhc3NfaW5pdCk6CisJKiBzeXMvdjRsL2dzdHY0bG1qcGVnc3JjLmM6IChnc3RfdjRsbWpwZWdzcmNfY2xhc3NfaW5pdCk6CisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19jbGFzc19pbml0KToKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX2NsYXNzX2luaXQpOgorICAgICAgICAgIGZpeCBzaWduYWxzIHRvIHVzZSAtIGluc3RlYWQgb2YgXworCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuaDoKKwkqIGV4dC9zZGwvc2RsdmlkZW9zaW5rLmg6CisgICAgICAgICAgZml4IGhlYWRlciByZW5hbWUKKworMjAwNC0wMy0wNCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiB0ZXN0c3VpdGUvZ3N0LWxpbnQ6ICBBZGQgYSBjaGVjayBmb3IgYmFkIHNpZ25hbCBuYW1lcy4KKworMjAwNC0wMy0wNCAgPGtvc3RAaW1uLmh0d2stbGVpcHppZy5kZT4KKworCXJldmlld2VkIGJ5IERhdmlkIFNjaGxlZWYKKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6IChnc3RfZ2FtbWFfcmdiMzIpOiBGaXggdHlwbyB0aGF0CisJbW9kaWZpZWQgdGhlIGFscGhhIGNoYW5uZWwgYW5kIGNhdXNlZCBhIHdhcm5pbmcuIChidWcgIzEzNjE5MikKKworMjAwNC0wNC0wMyAgQ2hyaXN0aWFuIFNjaGFsbGVyIDxVcmFldXNAZ25vbWUub3JnPgorCisJKiBnc3QtcGx1Z2lucy5zcGVjLmluOgorCUNoYW5nZSBuYW1lcyBvZiBwbHVnaW5zIHRvIGFjdHVhbGx5IGJlIGNvcnJlY3QuIFRyeSB0byBrZWVwIHRoaW5ncworCWFscGhhYmV0aWNhbCB0byBhdm9pZCBnZXR0aW5nIGJlYXQgdXAgYnkgVGhvbWFzCisKKzIwMDQtMDMtMDMgIEp1bGllbiBNT1VUVEUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBnc3QtbGlicy9nc3QvZ2NvbmYvZ2NvbmYuYzogKGdzdF9nY29uZl9nZXRfZGVmYXVsdF92aWRlb19zaW5rKToKKwlVc2luZyB4aW1hZ2VzaW5rIGFzIGEgZGVmYXVsdCBpZiBubyBnY29uZiBrZXkgZm91bmQuIFdlIHNob3VsZAorCXByb2JhYmx5IGNvbnNpZGVyIHVzaW5nIGFsc2FzaW5rIGluc3RlYWQgb2Ygb3Nzc2luayBmb3IgdGhlIGF1ZGlvCisJcGFydC4KKworMjAwNC0wMy0wMiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgZml4IC0td2l0aC1wbHVnaW5zLCBkb24ndCB0aGluayBpdCBldmVyIHdvcmtlZCBiZWZvcmUKKwkqIGdzdC1wbHVnaW5zLnNwZWMuaW46CisgICAgICAgICAgZXZlbiBtb3JlIHVwZGF0ZXMKKworMjAwNC0wMy0wMSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L3NkbC9zZGx2aWRlb3NpbmsuaDoKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5oOgorCSogc3lzL3h2aWRlby94dmlkZW9zaW5rLmg6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5oOgorCSAgRml4IGZvciBtb3ZlIG9mIGdzdHZpZGVvc2luay5oIC0+IHZpZGVvc2luay5oLgorCisyMDA0LTAzLTAyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QveHdpbmRvd2xpc3RlbmVyL01ha2VmaWxlLmFtOgorCSAgdGhpcyBpcyBhIHBsdWdpbiBsaWJyYXJ5LCBub3QgYSBsaWJyYXJ5CisKKzIwMDQtMDMtMDEgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogQVVUSE9SUzogIEFkZGVkIHNvbWUgbmFtZXMuICBBZGQgeW91cnNlbGYgaWYgeW91J3JlIHN0aWxsCisJbWlzc2luZy4KKworMjAwNC0wMy0wMSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBNQUlOVEFJTkVSUzogQWRkCisKKzIwMDQtMDMtMDEgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC1wbHVnaW5zLnNwZWMuaW46IGNsZWFuIHVwIHNwZWMgZmlsZQorCisyMDA0LTAzLTAxICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvdmlkZW8vTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvdmlkZW8vZ3N0dmlkZW9zaW5rLmM6CisJKiBnc3QtbGlicy9nc3QvdmlkZW8vZ3N0dmlkZW9zaW5rLmg6CisgICAgICAgICAgcmVuYW1lIGdzdHZpZGVvc2luay5oIHRvIHZpZGVvc2luay5oIHRvIG1hdGNoIG90aGVyIGhlYWRlcnMKKwkqIGdzdC9taXhtYXRyaXgvTWFrZWZpbGUuYW06CisgICAgICAgICAgZml4IHBsdWdpbiBmaWxlbmFtZQorCSogZ3N0L3RhZ3MvTWFrZWZpbGUuYW06IGZpeCBwbHVnaW4gZmlsZW5hbWUKKworMjAwNC0wMy0wMSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L3RhZ3MvTWFrZWZpbGUuYW06IGZpeCBwbHVnaW4gZmlsZW5hbWUKKworMjAwNC0wMy0wMSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXhhbXBsZXMvZ3N0cGxheS9wbGF5ZXIuYzogKGdvdF90aW1lX3RpY2spLCAobWFpbik6CisJICBhZGQgZXJyb3IgaGFuZGxlcgorICAgICAgICAgIGRpc3BsYXkgdGltZV90aWNrIG1vcmUgcmVhZGFibHkKKwkqIGdzdC9taXhtYXRyaXgvTWFrZWZpbGUuYW06CisgICAgICAgICAgZml4IHBsdWdpbiBmaWxlIG5hbWUKKworMjAwNC0wMi0yOSAgQ2hyaXN0b3BoZSBGZXJnZWF1ICA8dGV1ZkBnbm9tZS5vcmc+CisKKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiAoZ3N0X29zc2VsZW1lbnRfcHJvYmUpLAorCShkZXZpY2VfY29tYmluYXRpb25fYXBwZW5kKSwgKGdzdF9vc3NlbGVtZW50X2NsYXNzX3Byb2JlX2RldmljZXMpOgorCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50Lmg6CisJICBSZXdvcmtlZCBlbnVtZXJhdGlvbiBvZiBvc3MgZHNwcyBhbmQgbWl4ZXJzIHNvIHRoYXQgZ3N0LW1peGVyIHdvcmtzCisJICBvbiBteSBzeXN0ZW0gdXNpbmcgYWxzYSBvc3MgZW11bGF0aW9uLCBmaXhlcyBidWcgIzEzNTU5NworCisyMDA0LTAyLTI5ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvdmlkZW9kcm9wL2dzdHZpZGVvZHJvcC5jOiAoZ3N0X3ZpZGVvZHJvcF9pbml0KSwKKwkoZ3N0X3ZpZGVvZHJvcF9jaGFpbiksIChnc3RfdmlkZW9kcm9wX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3QvdmlkZW9kcm9wL2dzdHZpZGVvZHJvcC5oOgorCSAgV29yayBiYXNlZCBvbiB0aW1lc3RhbXAgb2YgaW5wdXQgZGF0YSwgbm90IGJhc2VkIG9uIHRoZSBleHBlY3RlZAorCSAgZnJhbWVyYXRlIGZyb20gdGhlIGlucHV0LiBUaGUgY29uc2VxdWVuY2UgaXMgdGhhdCB0aGlzIGVsZW1lbnQgbm93CisJICBub3Qgb25seSBzY2FsZXMgZnJhbWVyYXRlcywgYnV0IGFsc28gZnVuY3Rpb25zIGFzIGEgZnJhbWVyYXRlCisJICBjb3JyZWN0b3Igb3IgZnJhbWVyYXRlIHN0YWJpbGl6ZXIvY29uc3RhbnRpemVyLgorCisyMDA0LTAyLTI3ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwlwYXRjaGVzIGZyb20gam1tdkBtZW50YS5uZXQgKEp1bGlvIE0uIE1lcmlubyBWaWRhbCkKKworCSogZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmM6IChkZWludGVybGVhdmVfY2hhaW4pOiBGaXgKKwlHU1RfRUxFTUVOVF9FUlJPUiBjYWxsIChidWcgIzEzNTYzNCkKKwkqIGdzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYzogKGludGVybGVhdmVfYnVmZmVyZWRfbG9vcCksCisJKGludGVybGVhdmVfYnl0ZXN0cmVhbV9sb29wKTogRG9uJ3QgdXNlIGFsbG9jYSgpIChidWcgIzEzNTY0MCkKKwkqIHN5cy9jZHJvbS9nc3RjZHBsYXllcl9pb2N0bF9ic2QuaDogRml4IGlvY3RscyBvbiBOZXRCU0QgKGJ1ZyAjMTM1NjQ1KQorCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3Nzc2lua19nZXRfZGVsYXkpLAorCShnc3Rfb3Nzc2lua19jaGFpbik6IEZpeCBpb2N0bHMgb24gTmV0QlNELiAoYnVnICMxMzU2NDQpCisJKiBzeXMvdjRsL3Y0bG1qcGVnc3JjX2NhbGxzLmM6IChnc3RfdjRsbWpwZWdzcmNfc3luY19uZXh0X2ZyYW1lKSwKKwkoZ3N0X3Y0bG1qcGVnc3JjX3NldF9jYXB0dXJlKSwgKGdzdF92NGxtanBlZ3NyY19zZXRfY2FwdHVyZV9tKSwKKwkoZ3N0X3Y0bG1qcGVnc3JjX2NhcHR1cmVfaW5pdCksIChnc3RfdjRsbWpwZWdzcmNfcmVxdWV1ZV9mcmFtZSk6CisJRml4IEdTVF9FTEVNRU5UX0VSUk9SIGNhbGwuCisJKiBzeXMvdjRsL3Y0bHNyY19jYWxscy5jOiAoZ3N0X3Y0bHNyY190cnlfcGFsZXR0ZSk6IEZpeAorCUdTVF9FTEVNRU5UX0VSUk9SIGNhbGwuCisKKzIwMDQtMDItMjcgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2F1ZGlvLmg6CisJICBhZGQgbWFjcm8gdG8gbWFrZSBzdXJlIGhlYWRlciBpc24ndCBpbmNsdWRlZCB0d2ljZQorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X3Byb2Nlc3NfY2h1bmspOgorCSAgZG9uJ3QgdXNlIGdzdF9idWZmZXJfZnJlZQorCSogZ3N0L3BsYXlvbmRlbWFuZC9maWx0ZXIuZnVuYzoKKwkgIGRvbid0IHVzZSBnc3RfZGF0YV9mcmVlLiBGcmVlIGRhdGEgb25seSBvbmNlLgorCisyMDA0LTAyLTI2ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC1saWJzL2dzdC9jb2xvcmJhbGFuY2UvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvdHVuZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvbGV2ZWwvTWFrZWZpbGUuYW06IC1tYXJzaGFsLltjaF0gYW5kIC1lbnVtLltjaF0gZmlsZXMKKwlzaG91bGQgbm90IGJlIGRpc3RlZCwgLW1hcnNoYWwuaCBmaWxlcyBzaG91bGQgbm90IGJlIGluc3RhbGxlZCwKKwlhbmQgLWVudW0uaCBmaWxlcyBfc2hvdWxkXyBiZSBpbnN0YWxsZWQuICBGaXggdG8gbWFrZSB0aGlzIHRoZQorCWNhc2UuCisKKz09PSByZWxlYXNlIDAuNy41ID09PQorCisyMDA0LTAyLTI2ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6IHJlbGVhc2UgMC43LjUsICJVbmRlciBUaGUgU2VhIgorCisyMDA0LTAyLTI1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiAoZ3N0X2F1ZGlvX2NvbnZlcnRfbGluayksCisJKGdzdF9hdWRpb19jb252ZXJ0X2NoYW5nZV9zdGF0ZSksIChnc3RfYXVkaW9fY29udmVydF9nZXRfYnVmZmVyKToKKwkqIGdzdC92aWRlb3NjYWxlL2dzdHZpZGVvc2NhbGUuYzoKKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiAoZ3N0X29zc2VsZW1lbnRfc3luY19wYXJtcyk6CisgICAgICAgICAgYXNzb3J0ZWQgZGVidWcvd2FybmluZyBmaXhlcworCisyMDA0LTAyLTI1ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QvdmlkZW9zY2FsZS9nc3R2aWRlb3NjYWxlLmM6IChnc3RfdmlkZW9zY2FsZV9nZXRjYXBzKSwKKwkoZ3N0X3ZpZGVvc2NhbGVfaW5pdCksIChnc3RfdmlkZW9zY2FsZV9jaGFpbiksCisJKGdzdF92aWRlb3NjYWxlX3NldF9wcm9wZXJ0eSksIChwbHVnaW5faW5pdCk6CisJKiBnc3QvdmlkZW9zY2FsZS9nc3R2aWRlb3NjYWxlLmg6CisJKiBnc3QvdmlkZW9zY2FsZS92aWRlb3NjYWxlLmM6IChnc3RfdmlkZW9zY2FsZV9zZXR1cCksCisJKGdzdF92aWRlb3NjYWxlX3NjYWxlX3JnYiksIChnc3RfdmlkZW9zY2FsZV9wbGFuYXI0MTEpLAorCShnc3RfdmlkZW9zY2FsZV9wbGFuYXI0MDApLCAoZ3N0X3ZpZGVvc2NhbGVfcGFja2VkNDIyKSwKKwkoZ3N0X3ZpZGVvc2NhbGVfcGFja2VkNDIycmV2KSwgKGdzdF92aWRlb3NjYWxlXzMyYml0KSwKKwkoZ3N0X3ZpZGVvc2NhbGVfMjRiaXQpLCAoZ3N0X3ZpZGVvc2NhbGVfMTZiaXQpLAorCShnc3RfdmlkZW9zY2FsZV9iaWxpbmVhciksIChnc3RfdmlkZW9zY2FsZV9iaWN1YmljKSwKKwkoZ3N0X3ZpZGVvc2NhbGVfc2NhbGVfcGxhbmVfc2xvdyksCisJKGdzdF92aWRlb3NjYWxlX3NjYWxlX3BvaW50X3NhbXBsZSksCisJKGdzdF92aWRlb3NjYWxlX3NjYWxlX25lYXJlc3QpLAorCShnc3RfdmlkZW9zY2FsZV9zY2FsZV9uZWFyZXN0X3N0cjIpLAorCShnc3RfdmlkZW9zY2FsZV9zY2FsZV9uZWFyZXN0X3N0cjQpLAorCShnc3RfdmlkZW9zY2FsZV9zY2FsZV9uZWFyZXN0XzMyYml0KSwKKwkoZ3N0X3ZpZGVvc2NhbGVfc2NhbGVfbmVhcmVzdF8yNGJpdCksCisJKGdzdF92aWRlb3NjYWxlX3NjYWxlX25lYXJlc3RfMTZiaXQpOgorICAgICAgICBhZGQgZGVidWdnaW5nIGNhdGVnb3J5IGFuZCB1c2UgaXQgcHJvcGVybHkKKyAgICAgICAgZml4IHVzZSBvZiBHU1RfUFRSX0ZPUk1BVAorCisyMDA0LTAyLTI1ICBBbmR5IFdpbmdvICA8d2luZ29AcG9ib3guY29tPgorCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmMgKGludGVybGVhdmVfYnVmZmVyZWRfbG9vcCk6IEFsd2F5cworCXB1c2ggb25seSB3aGVuIGNoYW5uZWwtPmJ1ZmZlciBpcyBOVUxMLiBQcmV2ZW50cyBzZWdmYXVsdHMgZG9pbmcKKwl0aGUgc3RhdGUgY2hhbmdlIGFmdGVyIGEgbm9ubG9jYWwgZXhpdCwgbGlrZSBhIHNjaGVtZSBleGNlcHRpb24uCisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmMgKGdzdF9hdWRpb19jb252ZXJ0X2dldGNhcHMpOgorCUhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgaW50ZXJzZWN0ZWQgY2FwcyBpcyBlbXB0eS4KKworMjAwNC0wMi0yNSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYzogKG11bGF3ZGVjX2xpbmspOgorCSogZ3N0L2xhdy9tdWxhdy5jOiAocGx1Z2luX2luaXQpOgorICAgICAgICAgIGZpeCBtdWxhd2RlYyBzbyBpdCBhY3R1YWxseSB3b3JrcyBhZ2FpbgorCisyMDA0LTAyLTI0ICBBcndlZCB2LiBNZXJrYXR6ICA8di5tZXJrYXR6QGdteC5uZXQ+CisKKwlyZXZpZXdlZCBieTogRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuYzogKGdzdF9nYW1tYV9jbGFzc19pbml0KSwKKwkoZ3N0X2dhbW1hX2luaXQpLCAoZ3N0X2dhbW1hX3NldF9wcm9wZXJ0eSksCisJKGdzdF9nYW1tYV9nZXRfcHJvcGVydHkpLCAoZ3N0X2dhbW1hX2NhbGN1bGF0ZV90YWJsZXMpLAorCShnc3RfZ2FtbWFfcmdiMjQpLCAoZ3N0X2dhbW1hX3JnYjMyKTogIEFkZHMgZ2FtbWEgY29ycmVjdGlvbgorCWZvciBSR0IsIHdpdGggc2VwYXJhdGUgciBnIGFuZCBiIGNvcnJlY3Rpb24gZmFjdG9ycy4gKCMxMzExNjcpCisKKzIwMDQtMDItMjQgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmM6ICh2b3JiaXNfZGVjX2NoYWluKToKKyAgICAgICAgICBvbmx5IHNpZ25hbCB0YWdzIGZvciBiaXRyYXRlIGlmIHRoZXkncmUgPiAwICgjMTM0ODk0KQorCisyMDA0LTAyLTI0ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguYzogKHBsdWdpbl9pbml0KSwgKGdzdF9xdGRlbXV4X2xvb3BfaGVhZGVyKSwKKwkocXRkZW11eF9wYXJzZV9tb292KSwgKHF0ZGVtdXhfcGFyc2UpLCAocXRkZW11eF9ub2RlX2R1bXBfZm9yZWFjaCksCisJKHF0ZGVtdXhfZHVtcF9tdmhkKSwgKHF0ZGVtdXhfZHVtcF90a2hkKSwgKHF0ZGVtdXhfZHVtcF9lbHN0KSwKKwkocXRkZW11eF9kdW1wX21kaGQpLCAocXRkZW11eF9kdW1wX2hkbHIpLCAocXRkZW11eF9kdW1wX3ZtaGQpLAorCShxdGRlbXV4X2R1bXBfZHJlZiksIChxdGRlbXV4X2R1bXBfc3RzZCksIChxdGRlbXV4X2R1bXBfc3R0cyksCisJKHF0ZGVtdXhfZHVtcF9zdHNzKSwgKHF0ZGVtdXhfZHVtcF9zdHNjKSwgKHF0ZGVtdXhfZHVtcF9zdHN6KSwKKwkocXRkZW11eF9kdW1wX3N0Y28pLCAocXRkZW11eF9kdW1wX2NvNjQpLCAocXRkZW11eF9kdW1wX2Rjb20pLAorCShxdGRlbXV4X2R1bXBfY212ZCksIChxdGRlbXV4X3BhcnNlX3RyZWUpLCAocXRkZW11eF9wYXJzZV90cmFrKToKKwlDbGVhbnVwcy4gIENvbnZlcnQgZ19wcmludHMgdG8gR1NUX0xPR3MuICBBZGQgcXRkZW11eCBkZWJ1ZworCWNhdGVnb3J5LiAgQXR0ZW1wdCB0byBmaXggdGltZXN0YW1wIGNhbGN1bGF0aW9uLgorCisyMDA0LTAyLTI0ICBKb2hhbiBEYWhsaW4gIDxqb2hhbkBnbm9tZS5vcmc+CisKKwkqIGdzdC1saWJzL2dzdC9nY29uZi9nY29uZi5jOiBBZGQgXG4gdG8gZ19wcmludCBlcnJvciBtZXNzYWdlcworCisyMDA0LTAyLTIzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBnY29uZi9NYWtlZmlsZS5hbToKKwkqIGdjb25mL2dzdHJlYW1lci5zY2hlbWFzOgorCSogZ3N0LWxpYnMvZ3N0L2djb25mL01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L2djb25mL2djb25mLmM6CisgICAgICAgICAgdmVyc2lvbiBnY29uZiBzY2hlbWFzIGFuZCBpbnN0YWxsIGxvY2F0aW9ucworCisyMDA0LTAyLTIzICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC94aW5lL3hpbmVpbnB1dC5jOiAoZ3N0X3hpbmVfaW5wdXRfZGlzcG9zZSk6CisJKGdzdF94aW5lX2lucHV0X3N1YmNsYXNzX2luaXQpOgorCSAgY2FsbCBwYXJlbnQgZGlzcG9zZS4KKwkgIGNoYW5nZSBwYWQgdGVtcGxhdGUgZm9yIENEIHJlYWRlciBjb3JyZWN0bHkKKwkqIGV4dC94aW5lL01ha2VmaWxlLmFtOgorCSogZXh0L3hpbmUvZ3N0eGluZS5oOgorCSogZXh0L3hpbmUveGluZS5jOiAocGx1Z2luX2luaXQpOgorCSogZXh0L3hpbmUveGluZWF1ZGlvc2luay5jOgorCSAgd3JhcCBhdWRpbyBzaW5rcywgdG9vCisJKiBnc3QtbGlicy9nc3QvcmVzYW1wbGUvcHJpdmF0ZS5oOgorCSogZ3N0LWxpYnMvZ3N0L3Jlc2FtcGxlL3Jlc2FtcGxlLmM6IChnc3RfcmVzYW1wbGVfaW5pdCksCisJKGdzdF9yZXNhbXBsZV9yZWluaXQpLCAoZ3N0X3Jlc2FtcGxlX3NjYWxlKSwKKwkoZ3N0X3Jlc2FtcGxlX25lYXJlc3RfczE2KSwgKGdzdF9yZXNhbXBsZV9iaWxpbmVhcl9zMTYpLAorCShnc3RfcmVzYW1wbGVfc2luY19zbG93X3MxNiksIChnc3RfcmVzYW1wbGVfc2luY19zMTYpLAorCShnc3RfcmVzYW1wbGVfc2luY19mdF9zMTYpLCAoZ3N0X3Jlc2FtcGxlX25lYXJlc3RfZmxvYXQpLAorCShnc3RfcmVzYW1wbGVfYmlsaW5lYXJfZmxvYXQpLCAoZ3N0X3Jlc2FtcGxlX3NpbmNfc2xvd19mbG9hdCksCisJKGdzdF9yZXNhbXBsZV9zaW5jX2Zsb2F0KSwgKGdzdF9yZXNhbXBsZV9zaW5jX2Z0X2Zsb2F0KToKKwkqIGdzdC1saWJzL2dzdC9yZXNhbXBsZS9yZXNhbXBsZS5oOgorCSogZ3N0L2F1ZGlvc2NhbGUvZ3N0YXVkaW9zY2FsZS5jOiAoZ3N0X2F1ZGlvc2NhbGVfbWV0aG9kX2dldF90eXBlKSwKKwkoZ3N0X2F1ZGlvc2NhbGVfY2xhc3NfaW5pdCksIChnc3RfYXVkaW9zY2FsZV9saW5rKSwKKwkoZ3N0X2F1ZGlvc2NhbGVfZ2V0X2J1ZmZlciksIChnc3RfYXVkaW9zY2FsZV9pbml0KSwKKwkoZ3N0X2F1ZGlvc2NhbGVfY2hhaW4pLCAoZ3N0X2F1ZGlvc2NhbGVfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2F1ZGlvc2NhbGVfZ2V0X3Byb3BlcnR5KToKKwkqIGdzdC9hdWRpb3NjYWxlL2dzdGF1ZGlvc2NhbGUuaDoKKwkgIHMvcmVzYW1wbGVfKi9nc3RfcmVzYW1wbGVfKi9pIHRvIG5vdCBjbG9iYmVyIG5hbWVzcGFjZXMKKworMjAwNC0wMi0yMyAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmM6IChnc3RfcmlmZl9jcmVhdGVfdmlkZW9fY2FwcyksCisJKGdzdF9yaWZmX2NyZWF0ZV9hdWRpb19jYXBzKSwgKGdzdF9yaWZmX2NyZWF0ZV9pYXZzX2NhcHMpLAorCShnc3RfcmlmZl9jcmVhdGVfdmlkZW9fdGVtcGxhdGVfY2FwcyksCisJKGdzdF9yaWZmX2NyZWF0ZV9hdWRpb190ZW1wbGF0ZV9jYXBzKSwKKwkoZ3N0X3JpZmZfY3JlYXRlX2lhdnNfdGVtcGxhdGVfY2Fwcyk6CisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLW1lZGlhLmg6CisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfYmFzZV9pbml0KSwKKwkoZ3N0X2FzZl9kZW11eF9hdWRpb19jYXBzKSwgKGdzdF9hc2ZfZGVtdXhfYWRkX2F1ZGlvX3N0cmVhbSksCisJKGdzdF9hc2ZfZGVtdXhfdmlkZW9fY2FwcyksIChnc3RfYXNmX2RlbXV4X2FkZF92aWRlb19zdHJlYW0pOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9hZGRfc3RyZWFtKToKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9zdHJlYW0pLAorCShnc3RfbWF0cm9za2FfZGVtdXhfdmlkZW9fY2FwcyksIChnc3RfbWF0cm9za2FfZGVtdXhfYXVkaW9fY2FwcyksCisJKGdzdF9tYXRyb3NrYV9kZW11eF9wbHVnaW5faW5pdCk6IEZpcnN0IGJhdGNoIGltcGxlbWVudGluZyBhdWRpbyBhbmQKKwl2aWRlbyBjb2RlYyB0YWdzIGluIGRlbXV4ZXJzLgorCisyMDA0LTAyLTIyICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC94aW5lL01ha2VmaWxlLmFtOgorCSogZXh0L3hpbmUvZ3N0eGluZS5oOgorCSogZXh0L3hpbmUveGluZS5jOiAocGx1Z2luX2luaXQpOgorCSogZXh0L3hpbmUveGluZWlucHV0LmM6CisJICBhZGQgaW5wdXQgcGx1Z2luIHdyYXBwZXIuIFBsYXliYWNrIGZyb20gZmlsZXMsIGh0dHAsIG1tcyBhbmQgY2RkYQorCSAgd29ya3MuCisJKiBleHQveGluZS94aW5lYXVkaW9kZWMuYzogKGdzdF94aW5lX2F1ZGlvX2RlY19jaGFpbik6CisJICByZW1vdmUgbGVmdG92ZXIgR19HTlVDX1VOVVNFRAorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X3Byb2Nlc3Nfc3RyZWFtKSwKKwkoZ3N0X2FzZl9kZW11eF9pZGVudGlmeV9ndWlkKToKKwkgIGltcHJvdmUgZGVidWdnaW5nIG91dHB1dAorCisyMDA0LTAyLTIyICBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwlyZXBvcnRlZCBieTogUGFkcmFpZyBPJ0JyaWFpbiA8cGFkcmFpZy5vYnJpYWluQHN1bi5jb20+CisKKwkqIGF1dG9nZW4uc2g6CisJICByZXBsYWNlIHRlc3QgLWUgd2l0aCB0ZXN0IC14IGZvciBta2luc3RhbGxkaXJzIHRvIGJlIG1vcmUgcG9ydGFibGUuCisJICAoZml4ZXMgIzEzNDgxNikKKworMjAwNC0wMi0yMiAgQmVuamFtaW4gT3R0ZSAgPG90dGVAZ25vbWUub3JnPgorCisJcmVwb3J0ZWQgYnk6IFN0ZWZhbiBLb3N0IDxrb3N0QGltbi5odHdrLWxlaXB6aWcuZGU+CisKKwkqIGdzdC9hdWRpb2NvbnZlcnQvZ3N0YXVkaW9jb252ZXJ0LmM6IChwbHVnaW5faW5pdCk6CisJICBzZXQgcmFuayB0byBQUklNQVJZCisJKiBnc3Qvdm9sdW1lL2dzdHZvbHVtZS5jOiAocGx1Z2luX2luaXQpOgorCSAgc2V0IHJhbmsgdG8gTk9ORQorCWZpeGVzICMxMzQ5NjAKKworMjAwNC0wMi0yMiAgIEp1bGlvIE0uIE1lcmlubyBWaWRhbCA8am1tdkBtZW50YS5uZXQ+CisKKwlyZXZpZXdlZCBieSBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzogKGdzdF9mbGFjZW5jX2NoYWluKToKKwkgIGVzY2FwZSBOVUxMIHN0cmluZ3MgaW4gR1NUX0VMRU1FTlRfRVJST1IgcHJvcGVybHkgKGZpeGVzICMxMzUxMTYpCisKKzIwMDQtMDItMjIgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSAgZXhwb3J0IFtfXSp7Z3N0LEdzdCxHU1R9Liogc3ltYm9scyBmcm9tIHBsdWdpbnMKKworMjAwNC0wMi0yMiAgQ2hyaXN0b3BoZSBGZXJnZWF1IDx0ZXVmQGdub21lLm9yZz4KKworCXJldmlld2VkIGJ5OiBCZW5qYW1pbiBPdHRlICA8b3R0ZUBnbm9tZS5vcmc+CisKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzogKGFkZF9vbmVfdGFnKToKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfbWFkX2lkM190b190YWdfbGlzdCk6CisJKiBleHQvdm9yYmlzL3ZvcmJpc2VuYy5jOiAoZ3N0X3ZvcmJpc2VuY19nZXRfdGFnX3ZhbHVlKSwKKwkoZ3N0X3ZvcmJpc2VuY19tZXRhZGF0YV9zZXQxKToKKwkqIGdzdC90YWdzL2dzdGlkM3RhZy5jOgorCSogZ3N0L3RhZ3MvZ3N0dm9yYmlzdGFnLmM6IChnc3Rfdm9yYmlzX3RhZ19hZGQpOgorCSAgYXBwbHkgZml4ZXMgZnJvbSBidWdzICMxMzUwNDIgKGxhbWUgY2FuJ3Qgd3JpdGUgdGFncykgYW5kICMxMzM4MTcKKwkgIChhZGQgR1NUX0FMQlVNX1ZPTFVNRV97Q09VTlQsTlVNQkVSfSB0YWdzKQorCisyMDA0LTAyLTIyIFJhbW9uIEdhcmNpYSA8cmFtb25fZ2FyY2lhX2ZAeWFob28uY29tPgorCisJKiBjb25maWd1cmUuYWM6IEV4cG9ydCBvbmx5IGdzdF9wbHVnaW5fZGVzYyBmcm9tIHBsdWdpbnMuCisgICAgICAgICBOb3RlIHRoYXQgdGhpcyBjaGFuZ2Ugb25seSBtYWtlcyBhbnkgZWZmZWN0IHdpdGggTGludXggdXNpbmcgbGlidG9vbAorCSAxLjUuMiBvciBoaWdoZXIuIE90aGVyd2lzZSBpdCBpcyBzaWxlbnRseSBpZ25vcmVkLCBidXQgaXQgd291bGQgYnVpbGQKKyAgICAgICAgIGZpbmUuIEFuZCBkb24ndCB0cnkgdG8gaGF2ZSBzZXZlcmFsIHZlcnNpb25zIG9mIGxpYnRvb2wgaW4gZGlmZmVyZW50CisgICAgICAgICBkaXJlY3Rvcmllcy4KKworMjAwNC0wMi0yMCAgQW5keSBXaW5nbyAgPHdpbmdvQHBvYm94LmNvbT4KKworCSogZ3N0L2ludGZsb2F0LywgZ3N0L29uZXRvbjogUmVtb3ZlZCwgcmVwbGFjZWQgYnkgYXVkaW9jb252ZXJ0IGFuZAorCWludGVybGVhdmUgcmVzcGVjdGl2ZWx5LgorCisJKiBnc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYzogTmV3IHBsdWdpbjogZGVpbnRlcmxlYXZlCisJKHJlcGxhY2VzIG9uIG9uZXRvbikuCisJKiBnc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmM6IE5ldyBwbHVnaW46IGludGVybGVhdmUuCisJKiBnc3QvaW50ZXJsZWF2ZS9wbHVnaW4uaDogU3VwcG9ydCBmaWxlLgorCSogZ3N0L2ludGVybGVhdmUvcGx1Z2luLmM6IFN1cHBvcnQgZmlsZS4KKworCSogY29uZmlndXJlLmFjOiBSZW1vdmUgaW50ZmxvYXQgYW5kIG9uZXRvbiwgYWRkIGludGVybGVhdmUuCisKKwkqIGV4dC9zbmRmaWxlL2dzdHNmLmM6IEhhbmRsZSBldmVudHMgYmV0dGVyLgorCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiBDaGFuZ2UgdG8gc3VwcG9ydCBpbnQyZmxvYXQKKwlhbmQgZmxvYXQyaW50IG9wZXJhdGlvbi4gaW50MmZsb2F0IGhhcyBzY2hlZHVsaW5nIHByb2JsZW1zIGFzCisJbm90ZWQgaW4gaW4yZmxvYXRfY2hhaW4uCisKKzIwMDQtMDItMjAgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L3hpbmUvTWFrZWZpbGUuYW06CisJKiBleHQveGluZS9nc3R4aW5lLmg6CisJKiBleHQveGluZS94aW5lLmM6CisJKiBleHQveGluZS94aW5lYXVkaW9kZWMuYzoKKwkqIGV4dC94aW5lL3hpbmVjYXBzLmM6CisJICBhZGQgZmlyc3QgdmVyc2lvbiBvZiB4aW5lIHBsdWdpbiB3cmFwcGVyLiBDdXJyZW50bHkgb25seSB3cmFwcyB0aGUKKwkgIFFETTIgd2luMzIgRExMLCBhbmQgZXZlbiB0aGF0IG9ubHkgaW4gcHJvb2Ytb2YtY29uY2VwdCBxdWFsaXR5LgorCSogY29uZmlndXJlLmFjOgorCSogZXh0L01ha2VmaWxlLmFtOgorCSAgYWRkIHhpbmUgcGx1Z2luIHdyYXBwZXIsIGRpc2FibGVkIGJ5IGRlZmF1bHQuIFVzZSAtLWVuYWJsZS14aW5lIHRvCisJICBidWlsZC4gTm90ZSB0aGF0IGl0J2xsIHNlZ2ZhdWx0IG9uIGdzdC1yZWdpc3RlciBpZiB5b3UgZG9uJ3QgcmVtb3ZlCisJICB0aGUgZ29vbSBhbmQgdHZ0aW1lIHBvc3QgcGx1Z2lucyBmcm9tIHhpbmUuCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9oYW5kbGVfc2lua19ldmVudCksCisJKHF0ZGVtdXhfcGFyc2UpLCAocXRkZW11eF9wYXJzZV90cmFrKSwgKHF0ZGVtdXhfYXVkaW9fY2Fwcyk6CisJICBhZGQgZXh0cmFkYXRhIHBhcnNpbmcgZm9yIFFETTIuCisJICBjaGFuZ2UgYXJvdW5kIGRlYnVnZ2luZyBwcmludHMuCisKKzIwMDQtMDItMTkgIEJlbmphbWluIE90dGUgIDxvdHRlQGdub21lLm9yZz4KKworCSogZXh0L2xhbWUvZ3N0bGFtZS5jOiAoZ3N0X2xhbWVfY2hhaW4pOgorCSogZXh0L3ZvcmJpcy92b3JiaXNlbmMuYzogKGdzdF92b3JiaXNlbmNfY2hhaW4pOgorCSAgdXNlIGdzdF90YWdfbGlzdF9pbnNlcnQgd2hlbiB5b3Ugd2FudCB0byBpbnNlcnQgdGFncworCisyMDA0LTAyLTE4ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogIE1vdmUgbWFzc2luayB0byBnc3Qtcm90dGVuCisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvbWFzL01ha2VmaWxlLmFtOgorCSogZXh0L21hcy9tYXNzaW5rLmM6CisJKiBleHQvbWFzL21hc3NpbmsuaDoKKworMjAwNC0wMi0xOCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKHBsdWdpbl9pbml0KTogRGlzYWJsZSBnZGtfcGl4YnVmCisJdHlwZWZpbmRpbmcsIHNpbmNlIGl0IHNlZW1zIHRvIGJlIHdvcnNlIHRoYW4gbm90aGluZy4KKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAocXRfdHlwZV9maW5kKTogIEFkZCBmdHlwCisJYXRvbSB0byByZWNvZ25pemUgLm1wNCBhbmQgLm00YSBmaWxlcyBhcyB2aWRlby9xdWlja3RpbWUuCisKKzIwMDQtMDItMTggIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3NpbmUvZGVtby1kcGFyYW1zLmM6IChxdWl0X2xpdmUpLAorCShkeW5wYXJtX2xvZ192YWx1ZV9jaGFuZ2VkKSwgKGR5bnBhcm1fdmFsdWVfY2hhbmdlZCksIChtYWluKToKKwlVc2UgZG91YmxlIGRwYXJhbXMsIG5vdCBmbG9hdC4KKwkqIGdzdC9zaW5lL2dzdHNpbmVzcmMuYzogKGdzdF9zaW5lc3JjX2NsYXNzX2luaXQpLAorCShnc3Rfc2luZXNyY19pbml0KTogQ2hhbmdlIHN5bmMgZGVmYXVsdCB0byBGQUxTRSwgc2luY2UgbXVsdGlwbGUKKwlzeW5jJ2QgZWxlbWVudHMgZG9uJ3QgcmVhbGx5IHdvcmsgY29ycmVjdGx5LgorCSogZ3N0L3ZvbHVtZS9nc3R2b2x1bWUuYzogKHZvbHVtZV9jbGFzc19pbml0KSwgKHZvbHVtZV9pbml0KSwKKwkodm9sdW1lX3VwZGF0ZV92b2x1bWUpLCAodm9sdW1lX2dldF9wcm9wZXJ0eSk6ICBDaGFuZ2UgZHBhcmFtCisJdG8gZG91YmxlLgorCisyMDA0LTAyLTE4ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOgorCShnc3RfeGltYWdlc2lua194d2luZG93X3VwZGF0ZV9nZW9tZXRyeSksCisJKGdzdF94aW1hZ2VzaW5rX3JlbmVnb3RpYXRlX3NpemUpLCAoZ3N0X3hpbWFnZXNpbmtfaGFuZGxlX3hldmVudHMpLAorCShnc3RfeGltYWdlc2lua19jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3hpbWFnZXNpbmtfZXhwb3NlKSwKKwkoZ3N0X3hpbWFnZXNpbmtfaW5pdCk6IFJld29yayB0aGUgd2F5IHNvZnR3YXJlIHZpZGVvIHNjYWxpbmcgd29ya3MuIFNvCisJbm93IHdlIGNoZWNrIG9uIGVhY2ggY2hhaW4gY2FsbCBpZiB0aGUgdmlkZW8gZnJhbWVzIGFyZSBmZWVsaW5nIHRoZQorCXdpbmRvdy4gSWYgbm90IHdlIHRyeSB0byByZW5lZ290aWF0ZSBjYXBzLiBPbiBmYWlsdXJlIHdlIG1lbW9yaXplIHRoYXQKKwlhbmQgd2Ugd29uJ3QgdHJ5IGFnYWluIGZvciB0aGF0IFBMQVlJTkcgc2Vzc2lvbnMuCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuaDogQWRkaW5nIGEgYm9vbGVhbiB0byBzdG9yZSB0aGUgY2FwcyByZW5lZ28KKwlmYWlsdXJlLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19pbml0KTogaW5pdGlhbGl6ZSB0aGUKKwlzeW5jaHJvbm91cyBmbGFnLgorCisyMDA0LTAyLTE4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5LmM6IChnc3RfcGxheV9waXBlbGluZV9zZXR1cCk6CisgICAgICAgICAgYnJlYWsgdXAgX2xpbmsgc28gd2UgY2FuIGdpdmUgYSBiZXR0ZXIgZGVidWcgbWVzc2FnZSBmb3IgZXJyb3JzCisKKzIwMDQtMDItMTggIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOiAocGx1Z2luX2luaXQpOgorICAgICAgICAgIHNldCB1cCBkZWJ1ZyBjYXRlZ29yeQorCisyMDA0LTAyLTE4ICBKdWxpZW4gTU9VVFRFIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19yZW5lZ290aWF0ZV9zaXplKSwKKwkoZ3N0X3hpbWFnZXNpbmtfaGFuZGxlX3hldmVudHMpLCAoZ3N0X3hpbWFnZXNpbmtfZXhwb3NlKTogUmVvcmdhbml6aW5nCisJdGhlIHdheSByZW5lZ290aWF0aW9uIHdvcmsuIFRoZSBldmVudCBoYW5kbGluZyBmdW5jdGlvbiBpcyBub3QgdGFraW5nCisJY2FyZSBvZiBleHRlcm5hbCB3aW5kb3dzIGFuZCByZW5lZ290aWF0ZSBtZXRob2QgY2hlY2sgZm9yIHBhZCBmbGFncworCU5FR09USUFUSU5HLiBTaG91bGQgZml4IDogIzEzMzIwOQorCisyMDA0LTAyLTE3ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfZXhwb3NlKTogQ2hlY2tpbmcgaWYgdGhlCisJcGFkIGlzIG5lZ290aWF0aW5nIGJlZm9yZSB0cnlpbmcgcmVuZWdvdGlhdGlvbi4KKworMjAwNC0wMi0xNyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6IChnc3RfZ2RrX3BpeGJ1Zl90eXBlX2ZpbmQpOgorICAgICAgICAgIHBhc3Mgb24gYWxsIHBvc3NpYmxlIG1pbWUgdHlwZXMgYXMgdHlwZWZpbmQgaGludHMKKworMjAwNC0wMi0xNyAgSnVsaWVuIE1PVVRURSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeGltYWdlX25ldyk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3h2aW1hZ2VfbmV3KTogRml4IGEKKwlwb3NzaWJsZSBTSE0gbGVhayBpZiB3ZSBjcmFzaC4gQWxsIG90aGVyIGFwcHMgdXNpbmcgWFNobSBhcmUgZG9pbmcKKwl0aGF0LgorCisyMDA0LTAyLTE3ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfcmVuZWdvdGlhdGVfc2l6ZSksCisJKGdzdF94aW1hZ2VzaW5rX2V4cG9zZSk6IFJlbmVnb3RpYXRlIHNpemUgb24gZXhwb3NlLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19leHBvc2UpOiBVcGRhdGUgd2luZG93CisJc2l6ZSBvbiBleHBvc2UuCisKKzIwMDQtMDItMTYgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogdGVzdHN1aXRlL2Fsc2Evc2luZXNyYy5jOgorCSAgY29zbWV0aWMgZml4IHRvIGZpeCBjb21waWxlIGlzc3VlIHdpdGggZ2NjIDIuOTUuNAorCisyMDA0LTAyLTE2ICBKdWxpZW4gTU9VVFRFIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2Ffb3Blbl9hdWRpbyksCisJKGdzdF9hbHNhX3RpbWVzdGFtcF90b19ieXRlcyk6IEFsc2Egc2hvdWxkIHRyaWdnZXIgYW4gZXJyb3IgaWYgaXQKKwlmYWlsZWQgb3BlbmluZyB0aGUgYXVkaW8gZGV2aWNlLgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua194aW1hZ2VfbmV3KSwKKwkoZ3N0X3hpbWFnZXNpbmtfeGltYWdlX2Rlc3Ryb3kpLCAoZ3N0X3hpbWFnZXNpbmtfeGltYWdlX3B1dCksCisJKGdzdF94aW1hZ2VzaW5rX3h3aW5kb3dfbmV3KSwgKGdzdF94aW1hZ2VzaW5rX3h3aW5kb3dfZGVzdHJveSksCisJKGdzdF94aW1hZ2VzaW5rX3h3aW5kb3dfcmVzaXplKSwgKGdzdF94aW1hZ2VzaW5rX3h3aW5kb3dfY2xlYXIpLAorCShnc3RfeGltYWdlc2lua19yZW5lZ290aWF0ZV9zaXplKSwgKGdzdF94aW1hZ2VzaW5rX2hhbmRsZV94ZXZlbnRzKSwKKwkoZ3N0X3hpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwgKGdzdF94aW1hZ2VzaW5rX3hjb250ZXh0X2NsZWFyKSwKKwkoZ3N0X3hpbWFnZXNpbmtfY2hhbmdlX3N0YXRlKSwgKGdzdF94aW1hZ2VzaW5rX2NoYWluKSwKKwkoZ3N0X3hpbWFnZXNpbmtfc2V0X3h3aW5kb3dfaWQpOiBDbGVhcmluZyB3aW5kb3cgaW4gUkVBRFkgVE8gUEFVU0VELgorCVJlbW92aW5nIHNvbWUgdXNlbGVzcyBnX3JldHVybl9pZl9mYWlsIGxpa2Ugd2luZ28gc3VnZ2VzdGVkLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua194dmltYWdlX25ldyksCisJKGdzdF94dmltYWdlc2lua194dmltYWdlX2Rlc3Ryb3kpLCAoZ3N0X3h2aW1hZ2VzaW5rX3h2aW1hZ2VfcHV0KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3h3aW5kb3dfbmV3KSwgKGdzdF94dmltYWdlc2lua194d2luZG93X2Rlc3Ryb3kpLAorCShnc3RfeHZpbWFnZXNpbmtfeHdpbmRvd19yZXNpemUpLCAoZ3N0X3h2aW1hZ2VzaW5rX3h3aW5kb3dfY2xlYXIpLAorCShnc3RfeHZpbWFnZXNpbmtfdXBkYXRlX2NvbG9yYmFsYW5jZSksCisJKGdzdF94dmltYWdlc2lua19oYW5kbGVfeGV2ZW50cyksIChnc3RfeHZpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3hjb250ZXh0X2NsZWFyKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2dldF9mb3VyY2NfZnJvbV9jYXBzKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NoYW5nZV9zdGF0ZSksIChnc3RfeHZpbWFnZXNpbmtfY2hhaW4pLAorCShnc3RfeHZpbWFnZXNpbmtfc2V0X3h3aW5kb3dfaWQpLAorCShnc3RfeHZpbWFnZXNpbmtfY29sb3JiYWxhbmNlX2xpc3RfY2hhbm5lbHMpLAorCShnc3RfeHZpbWFnZXNpbmtfY29sb3JiYWxhbmNlX3NldF92YWx1ZSksCisJKGdzdF94dmltYWdlc2lua19jb2xvcmJhbGFuY2VfZ2V0X3ZhbHVlKTogQ2xlYXJpbmcgd2luZG93IGluIFJFQURZIFRPCisJUEFVU0VELiBSZW1vdmluZyBzb21lIHVzZWxlc3MgZ19yZXR1cm5faWZfZmFpbCBsaWtlIHdpbmdvIHN1Z2dlc3RlZC4KKworMjAwNC0wMi0xNiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKGdzdF9hdWRpb19jb252ZXJ0X2NoYWluKToKKyAgICAgICAgICB0aHJvdyBlcnJvciB3aGVuIG5vdCBuZWdvdGlhdGVkIGluc3RlYWQgb2YgYXNzZXJ0aW5nCisKKzIwMDQtMDItMTUgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0L3N3aXRjaC9nc3Rzd2l0Y2guYzogKGdzdF9zd2l0Y2hfbG9vcCk6IE1vcmUgZml4ZXMgZm9yCisJY29ycmVjdCBkYXRhIHJlZmNvdW50aW5nLgorCisyMDA0LTAyLTE1ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGdzdC9zd2l0Y2gvZ3N0c3dpdGNoLmM6IChnc3Rfc3dpdGNoX2NoYW5nZV9zdGF0ZSksCisJKGdzdF9zd2l0Y2hfY2xhc3NfaW5pdCk6IENsZWFuaW5nIHRoZSBzaW5rcGFkcyBjb3JyZWN0bHkgb24gc3RhdGUKKwljaGFuZ2UsIG1vc3RseSB0aGUgRU9TIGZsYWcuCisKKzIwMDQtMDItMTUgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZXhhbXBsZXMvZ3N0cGxheS9wbGF5ZXIuYzogKGdvdF9lb3MpLCAobWFpbik6IEFkZGluZyBzb21lCisJb3V0cHV0IGZvciBkZWJ1Z2dpbmcuCisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5LmM6IChnc3RfcGxheV9zdGF0ZV9jaGFuZ2UpOiBTdG9wIG91cgorCXRpbWVvdXRzIGlmIHdlIGdvIHRvIGFueSBzdGF0ZSBkaWZmZXJlbnQgZnJvbSBQTEFZSU5HLgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9yZWFkX3NlZWspOiBGaXggc29tZQorCW1vcmUgRU9TIGJ1Z3MgaW4gcmlmZiBsaWIuCisKKzIwMDQtMDItMTQgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5jOiAoZ3N0X3BsYXlfY29ubmVjdF92aXN1YWxpemF0aW9uKTogRGlzYWJsZQorCXZpc3VhbGl6YXRpb24gdW50aWwgaSBmaW5kIGEgd2F5IHRvIGZpeCBzd2l0Y2ggY29ycmVjdGx5LgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9wZWVrX2hlYWQpOiBGaXggYSBidWcgd2hlbgorCUVPUyBhcnJpdmVzLgorCSogZ3N0L3N3aXRjaC9nc3Rzd2l0Y2guYzogKGdzdF9zd2l0Y2hfcmVsZWFzZV9wYWQpLAorCShnc3Rfc3dpdGNoX3JlcXVlc3RfbmV3X3BhZCksIChnc3Rfc3dpdGNoX3BvbGxfc2lua3BhZHMpLAorCShnc3Rfc3dpdGNoX2xvb3ApLCAoZ3N0X3N3aXRjaF9kaXNwb3NlKSwgKGdzdF9zd2l0Y2hfY2xhc3NfaW5pdCk6CisJUmV3b3JrZWQgc3dpdGNoIHRvIGdldCBhIG1vcmUgY29ycmVjdCBiZWhhdmlvdXIgd2l0aCBldmVudHMgYW5kIHJlZmluZworCW9mIGRhdGEgc3RvcmVkIGluIHNpbmtwYWRzLgorCSogZ3N0L3N3aXRjaC9nc3Rzd2l0Y2guaDogQWRkaW5nIGFuIGVvcyBmbGFnIGZvciBldmVyeSBzaW5rcGFkIHNvIHRoYXQKKwl3ZSBkb24ndCBwdWxsIGZyb20gYSBwYWQgaW4gRU9TLgorCisyMDA0LTAyLTE0ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfaWQzX3RhZ19jaGFpbik6CisJICByZW1vdmUgdjEgdGFnIGV2ZW4gaWYgd2UgY2FuJ3QgcmVhZCBpdCAobWFrZXMgc3VyZSB3ZSBkb24ndCBkZXRlY3QKKwkgIGl0IGFnYWluKQorCisyMDA0LTAyLTE0ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX3BjbV93YWl0KSwKKwkoZ3N0X2Fsc2FfeHJ1bl9yZWNvdmVyeSk6CisJKiBleHQvYWxzYS9nc3RhbHNhLmg6CisJICB0cnkgeHJ1biByZWNvdmVyeSB3aGVuIHdhaXQgZmFpbGVkLiBNYWtlIHhydW4gcmVjb3ZlcnkgZnVuY3Rpb24KKwkgIHJldHVybiBUUlVFL0ZBTFNFIHRvIGluZGljYXRlIHN1Y2Nlc3MuIChtaWdodCBmaXggIzEzNDM1NCkKKworMjAwNC0wMi0xMyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3Qvc2luZS9kZW1vLWRwYXJhbXMuYzogKGR5bnBhcm1fbG9nX3ZhbHVlX2NoYW5nZWQpLAorCShkeW5wYXJtX3ZhbHVlX2NoYW5nZWQpLCAobWFpbik6IENvbnZlcnQgZnJvbSBmbG9hdCB0byBkb3VibGUuCisJKiBnc3Qvc2luZS9nc3RzaW5lc3JjLmM6IChnc3Rfc2luZXNyY19pbml0KTogc2FtZS4KKworMjAwNC0wMi0xMyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3Qvc2lsZW5jZS9nc3RzaWxlbmNlLmM6IChnc3Rfc2lsZW5jZV9jbGFzc19pbml0KSwKKwkoZ3N0X3NpbGVuY2Vfc2V0X2Nsb2NrKSwgKGdzdF9zaWxlbmNlX2dldCksCisJKGdzdF9zaWxlbmNlX3NldF9wcm9wZXJ0eSksIChnc3Rfc2lsZW5jZV9nZXRfcHJvcGVydHkpOgorCSogZ3N0L3NpbGVuY2UvZ3N0c2lsZW5jZS5oOiBBZGQgc3luYyBwcm9wZXJ0eS4KKwkqIGdzdC9zaW5lL2dzdHNpbmVzcmMuYzogKGdzdF9zaW5lc3JjX2NsYXNzX2luaXQpLAorCShnc3Rfc2luZXNyY19pbml0KSwgKGdzdF9zaW5lc3JjX3NldF9jbG9jayksIChnc3Rfc2luZXNyY19nZXQpLAorCShnc3Rfc2luZXNyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3NpbmVzcmNfZ2V0X3Byb3BlcnR5KToKKwkqIGdzdC9zaW5lL2dzdHNpbmVzcmMuaDogQWRkIHN5bmMgcHJvcGVydHkuCisKKzIwMDQtMDItMTMgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2ludGZsb2F0L2dzdGludDJmbG9hdC5jOiAoY29udl9mMzJfczE2KSwKKwkoZ3N0X2ludDJmbG9hdF9jaGFpbl9naW50MTYpOiAgQ2hhbmdlIHN0ZGludCB1c2FnZSB0byBnbGliIHR5cGVzLgorCisyMDA0LTAyLTEzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9leHQvTWFrZWZpbGUuYW06CisgICAgICAgICAgbW92ZSBmZm1wZWcgcGx1Z2luIHRvIGdzdC1mZm1wZWcgbW9kdWxlCisKKzIwMDQtMDItMTMgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGNvbmZpZ3VyZS5hYzogdXNlIEdTVF9BUkNIIHRvIGRldGVjdCBhcmNoaXRlY3R1cmUKKworMjAwNC0wMi0xMiAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBnc3QvdmJpZGVjL3ZiaXNjcmVlbi5jOiBGaXhpbmcgdGhvbWFzdnMgZml4ZXMuIE1pc3NpbmcgaGVhZGVyLgorCisyMDA0LTAyLTEyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvbGFkc3BhL2dzdGxhZHNwYS5jOiAoZ3N0X2xhZHNwYV9iYXNlX2luaXQpOgorICAgICAgICAgIGNsYXNzaWZ5IExBRFNQQSBwbHVnaW5zIGJhc2VkIG9uIG51bWJlciBvZiBzcmMvc2luayBwYWRzCisJICAoIzEzMzY2MywgU3RlZmFuIEtvc3QpCisJKiBnc3Qvc2luZS9nc3RzaW5lc3JjLmM6IChnc3Rfc2luZXNyY19pbml0KToKKyAgICAgICAgICBmaXggZHBhcmFtcyByZWdpc3RyYXRpb24KKwkgICgjMTMzNTI4LCBTdGVmYW4gS29zdCkKKwkqIGdzdC92YmlkZWMvdmJpc2NyZWVuLmM6ICh2YmlzY3JlZW5fc2V0X2N1cnJlbnRfY2VsbCk6CisgICAgICAgICAgZml4IHVzZSBvZiBpc3ByaW50IGFuZCB1c2UgZ19hc2NpaV9pc3ByaW50IGluc3RlYWQKKwkgICgjMTMzMzE2LCBTdGVmYW4gS29zdCkKKworMjAwNC0wMi0xMSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJQ29udmVydCBhIGZldyBpbm5lciBsb29wcyB0byB1c2UgbGlib2lsLiAgVGhpcyBpcyBjdXJyZW50bHkKKwlvcHRpb25hbCwgYW5kIGlzIG9ubHkgZW5hYmxlZCBpZiBsaWJvaWwgaXMgcHJlc2VudCAoZHVoISkuCisJKiBjb25maWd1cmUuYWM6IENoZWNrIGZvciBsaWJvaWwtMC4xCisJKiBnc3QvaW50ZmxvYXQvTWFrZWZpbGUuYW06CisJKiBnc3QvaW50ZmxvYXQvZ3N0aW50MmZsb2F0LmM6IChjb252X2YzMl9zMTYpLCAoc2NhbGFybXVsdF9mMzIpLAorCShnc3RfaW50MmZsb2F0X2NoYWluX2dpbnQxNik6CisJKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmM6IChnc3RfdmlkZW9iYWxhbmNlX2NsYXNzX2luaXQpLAorCSh0YWJsZWxvb2t1cF91OCksIChnc3RfdmlkZW9iYWxhbmNlX3BsYW5hcjQxMSk6CisJKiBnc3QvdmlkZW90ZXN0c3JjL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvdGVzdHNyYy9nc3R2aWRlb3Rlc3RzcmMuYzogKHBsdWdpbl9pbml0KToKKwkqIGdzdC92aWRlb3Rlc3RzcmMvdmlkZW90ZXN0c3JjLmM6IChzcGxhdF91OCksIChwYWludF9obGluZV9ZVVkyKSwKKwkocGFpbnRfaGxpbmVfSVlVMiksIChwYWludF9obGluZV9zdHI0KSwgKHBhaW50X2hsaW5lX3N0cjMpLAorCShwYWludF9obGluZV9SR0I1NjUpLCAocGFpbnRfaGxpbmVfeFJHQjE1NTUpOgorCisyMDA0LTAyLTExICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9sY3MvZ3N0Y29sb3JzcGFjZS5jOiAoY29sb3JzcGFjZV9maW5kX2xjc19mb3JtYXQpLAorCShnc3RfY29sb3JzcGFjZV9jYXBzX2dldF9mb3VyY2MpLCAoY29sb3JzcGFjZV9zZXR1cF9jb252ZXJ0ZXIpLAorCShnc3RfY29sb3JzcGFjZV9nZXRjYXBzKSwgKGdzdF9jb2xvcnNwYWNlX2xpbmspLAorCShnc3RfY29sb3JzcGFjZV9iYXNlX2luaXQpLCAoZ3N0X2NvbG9yc3BhY2VfaW5pdCksCisJKGdzdF9jb2xvcnNwYWNlX2NoYWluKSwgKGdzdF9jb2xvcnNwYWNlX2NoYW5nZV9zdGF0ZSksCisJKHBsdWdpbl9pbml0KTogTWVyZ2UgUm9uYWxkJ3MgcGF0Y2ggKGJ1ZyAjMTE3ODk3KSBhbmQgdXBkYXRlCisJZm9yIG5ldyBjYXBzIGFuZCBuZWdvdGlhdGlvbi4gIFNlZW1zIHRvIHdvcmssIGFsdGhvdWdoIGl0CisJc2hvd3Mgb2ZmIGJ1Z3MgaW4gbGNzLgorCisyMDA0LTAyLTExICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9hbHNhL01ha2VmaWxlLmFtOiBGaXggbGlua2luZyBhZ2FpbnN0IGxpYmdzdGludGVyZmFjZXMuCisJKGJ1ZyAjMTMzODg2KSAgTm90aWNlZCBieSBidWdzQGxlcm91dGllci5uZXQgKFN0ZXBoYW5lIExPRVVJTExFVCkKKworMjAwNC0wMi0xMSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvbGlicmZiL2dzdHJmYnNyYy5jOiAoZ3N0X3JmYnNyY19jbGFzc19pbml0KSwKKwkoZ3N0X3JmYnNyY19jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3JmYnNyY19pbml0KSwKKwkoZ3N0X3JmYnNyY19zZXRfcHJvcGVydHkpLCAoZ3N0X3JmYnNyY19nZXRfcHJvcGVydHkpOgorCUFkZCBzZXJ2ZXIgYW5kIHBvcnQgcHJvcGVydGllcworCisyMDA0LTAyLTExICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBtNC9hNTIubTQ6CisJKiBtNC9hYWxpYi5tNDoKKwkqIG00L2FzLWZmbXBlZy5tNDoKKwkqIG00L2FzLWxpYmxhbWUubTQ6CisJKiBtNC9hcy1zbHVycC1mZm1wZWcubTQ6CisJKiBtNC9jaGVjay1saWJoZWFkZXIubTQ6CisJKiBtNC9lc2QubTQ6CisJKiBtNC9mcmVldHlwZTIubTQ6CisJKiBtNC9nY29uZi0yLm00OgorCSogbTQvZ2xpYi5tNDoKKwkqIG00L2dzdC1hbHNhLm00OgorCSogbTQvZ3N0LWFydHNjLm00OgorCSogbTQvZ3N0LWl2b3JiaXMubTQ6CisJKiBtNC9nc3QtbWF0cm9za2EubTQ6CisJKiBtNC9nc3Qtc2RsLm00OgorCSogbTQvZ3N0LXNob3V0Mi5tNDoKKwkqIG00L2dzdC1zaWQubTQ6CisJKiBtNC9ndGsubTQ6CisJKiBtNC9saWJkdi5tNDoKKwkqIG00L2xpYmZhbWUubTQ6CisJKiBtNC9saWJtaWttb2QubTQ6CisJKiBtNC9vZ2cubTQ6CisJKiBtNC92b3JiaXMubTQ6CisgICAgICAgICAgZml4IHVuZGVycXVvdGVkbmVzcyBvZiBtYWNyb3MgKCMxMzM4MDApCisJKiBtNC9hcy1hdmlmaWxlLm00OgorCSogbTQveG1tcy5tNDoKKyAgICAgICAgICByZW1vdmVkIGJlY2F1c2Ugbm8gbG9uZ2VyIHVzZWQKKworMjAwNC0wMi0xMSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorICAgICAgICAgIHJlcXVpcmUgZ2V0dGV4dCAwLjExLjUgc28gdWxvbmdsb25nLm00IGdldHMgY2hlY2tlZCBvdXQgYW5kIGNvcGllZAorICAgICAgICAgIGJ5IGF1dG9wb2ludCAoZml4ZXMgIzEzMjk5NikKKworMjAwNC0wMi0xMSAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2RlYy5jOiAoZ3N0X2ZmbXBlZ2RlY19iYXNlX2luaXQpOgorCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdkZW11eC5jOiAoZ3N0X2ZmbXBlZ2RlbXV4X2Jhc2VfaW5pdCk6CisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2VuYy5jOiAoZ3N0X2ZmbXBlZ2VuY19iYXNlX2luaXQpOgorCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdtdXguYzogKGdzdF9mZm1wZWdtdXhfYmFzZV9pbml0KToKKwkgIGZpeCBtZW1sZWFrcworCisyMDA0LTAyLTExICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOiAoZ3N0X2dka19waXhidWZfc2lua19saW5rKSwKKwkoZ3N0X2dka19waXhidWZfY2hhaW4pOiBGaXggbG9naWMgYnVnIGNhdXNpbmcgc3B1cmlvdXMgZXJyb3JzLgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdkZWNfYmFzZV9pbml0KSwKKwkoZ3N0X2pwZWdkZWNfaW5pdCksIChnc3RfanBlZ2RlY19jaGFpbik6IEZpeCBuZWdvdGlhdGlvbi4KKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuYzogKGdzdF9qcGVnZW5jX2Jhc2VfaW5pdCksCisJKGdzdF9qcGVnZW5jX2NsYXNzX2luaXQpLCAoZ3N0X2pwZWdlbmNfaW5pdCksCisJKGdzdF9qcGVnZW5jX2dldGNhcHMpLCAoZ3N0X2pwZWdlbmNfbGluayksIChnc3RfanBlZ2VuY19yZXN5bmMpLAorCShnc3RfanBlZ2VuY19jaGFpbiksIChnc3RfanBlZ2VuY19zZXRfcHJvcGVydHkpLAorCShnc3RfanBlZ2VuY19nZXRfcHJvcGVydHkpOiAgRml4IG5lZ290aWF0aW9uLiAgQWRkIHNvbWUgcHJvcGVydGllcy4KKwkqIGV4dC9qcGVnL2dzdGpwZWdlbmMuaDogRml4IG5lZ290aWF0aW9uLgorCisyMDA0LTAyLTEwICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6IChnc3RfbWlrbW9kX2luaXQpLAorCShnc3RfbWlrbW9kX3NyY2ZpeGF0ZSksIChnc3RfbWlrbW9kX3NyY2xpbmspLCAoZ3N0X21pa21vZF9sb29wKToKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmg6CisJICBmaXggY2FwcyBuZWdvdGlhdGlvbiBpbiBtaWttb2QKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfcHJpbnQpOgorCSAgb3V0cHV0IGRlYnVnIGluZm9ybWF0aW9uCisKKzIwMDQtMDItMDggIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0LWxpYnMvZ3N0L2NvbG9yYmFsYW5jZS9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC9uYXZpZ2F0aW9uL01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L3hvdmVybGF5L01ha2VmaWxlLmFtOgorCSAgcmVtb3ZlIHVudXNlZCBHU1RfT1BUX0NGTEFHUyBmcm9tIE1ha2VmaWxlcworCSAgaW5jbHVkZSBYX0NGTEFHUyBhbmQgWF9MSUJTIGluIHhvdmVybGF5LiAoIzEzMTk0OCkKKworMjAwNC0wMi0wNyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X2hhbmRsZV9ldmVudCk6IERvbid0CisJcHVzaCBldmVudHMgdG8gcGFkcyB0aGF0IGhhdmVuJ3QgYmVlbiBjcmVhdGVkICgjMTMzNTA4KQorCisyMDA0LTAyLTA3ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOiAoZ3N0X2R2ZGVjX2luaXQpLCAoZ3N0X2R2ZGVjX3NyY19jb252ZXJ0KSwKKwkoZ3N0X2R2ZGVjX3NpbmtfY29udmVydCksIChnc3RfZHZkZWNfaGFuZGxlX3NpbmtfZXZlbnQpLAorCShnc3RfZHZkZWNfdmlkZW9fZ2V0Y2FwcyksIChnc3RfZHZkZWNfdmlkZW9fbGluayksCisJKGdzdF9kdmRlY19sb29wKSwgKGdzdF9kdmRlY19jaGFuZ2Vfc3RhdGUpOgorCVNlY29uZCBhdHRlbXB0IGF0IGNvbW1pdHRpbmcgYSB3b3JraW5nIGR2ZGVjIGVsZW1lbnQuCisKKzIwMDQtMDItMDYgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCUJ1aWxkIGZpeGVzIGZvciBPUyBYOiAoc2VlICMxMjk2MDApCisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuYzogKGdzdF9yaWZmX3JlYWRfc3RyaCksCisJKGdzdF9yaWZmX3JlYWRfc3RyZl92aWRzKSwgKGdzdF9yaWZmX3JlYWRfc3RyZl9hdWRzKSwKKwkoZ3N0X3JpZmZfcmVhZF9zdHJmX2lhdnMpOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fYXZpaCksCisJKGdzdF9hdmlfZGVtdXhfc3RyZWFtX29kbWwpOgorCSogZ3N0L3BsYXlvbmRlbWFuZC9NYWtlZmlsZS5hbToKKwkqIGdzdC9ydHAvcnRwLXBhY2tldC5jOgorCisyMDA0LTAyLTA1ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOiAoZ3N0X2R2ZGVjX2luaXQpLCAoZ3N0X2R2ZGVjX2xvb3ApOiBSZXZlcnQKKwlsYXN0IGNoYW5nZSwgYmVjYXVzZSBpdCBKdXN0IERvZXNuJ3QgQ29tcGlsZS4KKworMjAwNC0wMi0wNSAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfY2hhaW4pOgorCSAgc2tpcCB1bmRlY29kYWJsZSBpZDN2MiB0YWcgaW5zdGVhZCBvZiBrZWVwaW5nIGl0CisKKzIwMDQtMDItMDUgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L21wZWdhdWRpb3BhcnNlL2dzdG1wZWdhdWRpb3BhcnNlLmM6IChnc3RfbXAzcGFyc2VfY2hhaW4pOgorCVVucmVmIGxlYWtlZCBidWZmZXIuICAoTm90aWNlZCBieSBSb25hbGQpCisKKzIwMDQtMDItMDUgIERhdmlkIEkuIExlaG4gIDxkbGVobkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIHBrZ2NvbmZpZy9nc3RyZWFtZXItbGlicy11bmluc3RhbGxlZC5wYy5pbjoKKwlTeW5jIHJlcXVpcmVzIHdpdGggb3RoZXIgY2hlY2tzLiAgPj0gdnMgPS4KKworMjAwNC0wMi0wNiAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19pbml0KSwgKGdzdF9kdmRlY192aWRlb19nZXRjYXBzKSwKKwkoZ3N0X2R2ZGVjX3ZpZGVvX2xpbmspLCAoZ3N0X2R2ZGVjX2xvb3ApOgorCSogZXh0L2R2L2dzdGR2ZGVjLmg6CisJICByZXdvcmsgdGhlIGNhcHMgbmVnb3RpYXRpb24gc28gdGhhdCBkdmRlYyB3b3JrcyBhZ2FpbiBpbnN0ZWFkCisJICBvZiBqdXN0IHNlZ2ZhdWx0aW5nLgorCis9PT0gcmVsZWFzZSAwLjcuNCA9PT0KKworMjAwNC0wMi0wNiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogTkVXUzogR1N0cmVhbWVyIFBsdWdpbnMgMC43LjQgIkZvciBHcmVhdCBKdXN0aWNlIiByZWxlYXNlZAorCSogY29uZmlndXJlLmFjOiBjaGFuZ2VkIGZvciByZWxlYXNlCisKKzIwMDQtMDItMDUgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC1saWJzL2dzdC9nY29uZi9nc3RyZWFtZXItZ2NvbmYtdW5pbnN0YWxsZWQucGMuaW46CisJKiBwa2djb25maWcvZ3N0cmVhbWVyLWludGVyZmFjZXMtdW5pbnN0YWxsZWQucGMuaW46CisJKiBwa2djb25maWcvZ3N0cmVhbWVyLWxpYnMtdW5pbnN0YWxsZWQucGMuaW46CisJKiBwa2djb25maWcvZ3N0cmVhbWVyLXBsYXktdW5pbnN0YWxsZWQucGMuaW46CisgICAgICAgICAgcmV3b3JrZWQgcGF0Y2ggYnkgRGF2aWQgTGVobiB0byBmaXggbGliZGlyIGFuZCBpbmNsdWRlZGlyIGZvcgorICAgICAgICAgIHVuaW5zdGFsbGVkIGxpYnJhcmllcworICAgICAgICAgIHJlbW92ZWQgcGxheSBhbmQgZ2NvbmYgZnJvbSBnc3RyZWFtZXItbGlicyBzaW5jZSB0aGV5IGhhdmUgdGhlaXIKKyAgICAgICAgICBvd24gcGtnY29uZmlnIGZpbGVzCisKKzIwMDQtMDItMDQgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGFyc2VfZm10KTogRml4IGEgY2FwcworCW1lbWxlYWsuCisKKzIwMDQtMDItMDUgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9yZWFkX2luZm8pOgorCSAgdXNlIGNvcnJlY3QgR1NUX1RBR19FTkNPREVSIHRhZworCisyMDA0LTAyLTA1ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX2NoYW5nZV9zdGF0ZSk6CisJICBiZSBzdXJlIHRvIHN0b3AgdGhlIGNsb2NrIHdoZW4gZ29pbmcgdG8gcGF1c2VkCisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3NzaW5rX2NoYW5nZV9zdGF0ZSk6CisJICByZXNldCBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgd2hlbiBnb2luZyB0byByZWFkeS4KKwlmaXhlcyAjMTMyOTM1CisKKzIwMDQtMDItMDUgIENoYXJsZXMgU2NobWlkdCA8Y3NjaG1pZHQyQGVtaWNoLmVkdT4KKworCXJldmlld2VkIGJ5IEJlbmphbWluIE90dGUKKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9tYWRfaWQzX3RvX3RhZ19saXN0KToKKwkgIGV4dHJhY3QgdHJhY2sgY291bnQgKGZpeGVzICMxMzM0MTApCisKKzIwMDQtMDItMDQgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX2RvX2NhcHNfbmVnbyk6CisJICB0aGF0IHNob3VsZCBiZSAhPSwgbm90ID09IChmaXhlcyAjMTMyNTE5KQorCisyMDA0LTAyLTA0ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwlNYWtlIHN1cmUgc2V0X2V4cGxpY2l0X2NhcHMoKSBpcyBjYWxsZWQgYmVmb3JlIGFkZGluZyBwYWQuCisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2RlbXV4LmM6IChnc3RfZmZtcGVnZGVtdXhfbG9vcCk6CisJKiBnc3QvaWQzL2dzdGlkM3R5cGVzLmM6IChnc3RfaWQzdHlwZXNfbG9vcCk6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguYzogKGdzdF9tcGVnX2RlbXV4X3BhcnNlX3N5c2hlYWQpOgorCSogZ3N0L3JlYWxtZWRpYS9ybWRlbXV4LmM6IChnc3Rfcm1kZW11eF9hZGRfc3RyZWFtKToKKworMjAwNC0wMi0wNCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorICAgICAgICAgIGJ1bXAgbmFubyB0byAyLCBmaXJzdCBwcmVyZWxlYXNlCisgICAgICAgICAgcHV0IGJhY2sgQU1fUFJPR19MSUJUT09MCisKKzIwMDQtMDItMDQgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHRlc3RzdWl0ZS9hbHNhL01ha2VmaWxlLmFtOgorICAgICAgICAgIHRoZXNlIGFyZSB1c2VyIHRlc3QgYXBwcywgbm90IGF1dG9tYXRpYyB0ZXN0c3VpdGUgdGVzdHMKKworMjAwNC0wMi0wNCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJQ29udmVydCBHU1RfREVCVUdfQ0FQUygpIHRvIEdTVF9ERUJVRygpOgorCSogZ3N0L21wZWcxdmlkZW9wYXJzZS9nc3RtcDF2aWRlb3BhcnNlLmM6CisJKG1wMXZpZGVvcGFyc2VfcGFyc2Vfc2VxKToKKwkqIGdzdC9yZWFsbWVkaWEvcm1kZW11eC5jOiAoZ3N0X3JtZGVtdXhfYWRkX3N0cmVhbSk6CisJKiBnc3QvdmlkZW9zY2FsZS9nc3R2aWRlb3NjYWxlLmM6IChnc3RfdmlkZW9zY2FsZV9nZXRjYXBzKToKKwkqIHN5cy94dmlkZW8vZ3N0eHdpbmRvdy5jOiAoX2dzdF94d2luZG93X25ldyk6CisJKiBzeXMveHZpZGVvL3h2aWRlb3NpbmsuYzogKGdzdF94dmlkZW9zaW5rX3Npbmtjb25uZWN0KSwKKwkoZ3N0X3h2aWRlb3NpbmtfZ2V0Y2Fwcyk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2dldF94dl9zdXBwb3J0KToKKwkqIHRlc3RzdWl0ZS9nc3QtbGludDogbW9yZSB0ZXN0cworCisyMDA0LTAyLTA0ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwlSZXBsYWNlIHVzZSBvZiBHU1RfUEFEX0ZPUk1BVFNfRlVOQ1RJT04oKSBhbmQgc2ltaWxhciBtYWNyb3MKKwl3aXRoIHRoZSBjb2RlIHRoYXQgdGhleSB3b3VsZCBleHBhbmQgdG8uCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY2RlY19nZXRfc3JjX2Zvcm1hdHMpLAorCShnc3RfZmxhY2RlY19nZXRfc3JjX3F1ZXJ5X3R5cGVzKSwKKwkoZ3N0X2ZsYWNkZWNfZ2V0X3NyY19ldmVudF9tYXNrcyk6CisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzcmMuYzogKGdzdF9nbm9tZXZmc3NyY19nZXRfZm9ybWF0cyksCisJKGdzdF9nbm9tZXZmc3NyY19nZXRfcXVlcnlfdHlwZXMpLAorCShnc3RfZ25vbWV2ZnNzcmNfZ2V0X2V2ZW50X21hc2spOgorCisyMDA0LTAyLTA0ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC9zaW5lL2dzdHNpbmVzcmMuYzogKGdzdF9zaW5lc3JjX2NsYXNzX2luaXQpLAorCShnc3Rfc2luZXNyY19kaXNwb3NlKToKKwkgIGZpeCBtZW1sZWFrIGJ5IHByb3Blcmx5IGRpc3Bvc2luZyBzaW5lc3JjCisKKzIwMDQtMDItMDQgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3hvdmVybGF5L3hvdmVybGF5LmM6IChnc3RfeF9vdmVybGF5X2V4cG9zZSk6CisJKiBnc3QtbGlicy9nc3QveG92ZXJsYXkveG92ZXJsYXkuaDogQWRkaW5nIHRoZSBfZXhwb3NlIG1ldGhvZCB0byB0ZWxsCisJYW4gb3ZlcmxheSB0byByZWRyYXcgdGhlIGltYWdlIGJlY2F1c2UgaXQgaGFzIGJlZW4gZXhwb3NlZC4KKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeGltYWdlX2Rlc3Ryb3kpLAorCShnc3RfeGltYWdlc2lua194aW1hZ2VfcHV0KSwgKGdzdF94aW1hZ2VzaW5rX2V4cG9zZSksCisJKGdzdF94aW1hZ2VzaW5rX3hvdmVybGF5X2luaXQpLCAoZ3N0X3hpbWFnZXNpbmtfaW5pdCk6CisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuaDogSW1wbGVtZW50IGV4cG9zZSBtZXRob2QgZnJvbSBYT3ZlcmxheQorCWludGVyZmFjZQorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua194dmltYWdlX2Rlc3Ryb3kpLAorCShnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9wdXQpLCAoZ3N0X3h2aW1hZ2VzaW5rX2V4cG9zZSksCisJKGdzdF94dmltYWdlc2lua194b3ZlcmxheV9pbml0KSwgKGdzdF94dmltYWdlc2lua19pbml0KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmg6IEltcGxlbWVudCBleHBvc2UgbWV0aG9kIGZyb20gWE92ZXJsYXkKKwlpbnRlcmZhY2UKKworMjAwNC0wMi0wMyAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKGdzdF9nZGtfcGl4YnVmX3R5cGVfZmluZCk6CisJICBtb3JlIG1lbWxlYWsgZml4YWdlCisKKzIwMDQtMDItMDMgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6IChwbHVnaW5faW5pdCk6CisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzoKKwkgIGZpeCBtZW1sZWFrcyBzaG93biBieSBnc3QtdHlwZWZpbmQKKworMjAwNC0wMi0wMyAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29tbW9uL2dsaWItZ2VuLm1hazoKKyAgICAgICAgICBhZGQgaGFjayBydWxlIHRvIHRvdWNoIC5QbG8gZmlsZXMKKwkqIGdzdC1saWJzL2dzdC9jb2xvcmJhbGFuY2UvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvcGxheS9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC90dW5lci9NYWtlZmlsZS5hbToKKyAgICAgICAgICByZW1vdmUgZ2xpYl9yb290IHZhcmlhYmxlCisKKzIwMDQtMDItMDMgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAoZ3N0X3F0ZGVtdXhfYWRkX3N0cmVhbSk6CisJICBzZXQgZXhwbGljaXQgY2FwcyBiZWZvcmUgYWRkaW5nIHRoZSBlbGVtZW50LCBzbyB0aGUgYXV0b3BsdWdnZXJzIGNhbgorCSAgcGx1ZyBjb3JyZWN0bHkuCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKG1wM190eXBlX2ZpbmQpLAorCShtcGVnMl9zeXNfdHlwZV9maW5kKSwgKG1wZWcxX3N5c190eXBlX2ZpbmQpLAorCShtcGVnX3ZpZGVvX3R5cGVfZmluZCksIChtcGVnX3ZpZGVvX3N0cmVhbV90eXBlX2ZpbmQpLAorCShkdl90eXBlX2ZpbmQpOgorCSAgZml4IG1lbWxlYWtzIGluIHR5cGVmaW5kIGZ1bmN0aW9ucy4gZ3N0X3R5cGVfZmluZF9zdWdnZXN0IHRha2VzIGEgY29uc3QKKwkgIGFyZ3VtZW50LgorCisyMDA0LTAyLTAzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvY29sb3JiYWxhbmNlL01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L2NvbG9yYmFsYW5jZS9jb2xvcmJhbGFuY2UtbWFyc2hhbC5saXN0OgorCSogZ3N0LWxpYnMvZ3N0L2NvbG9yYmFsYW5jZS9jb2xvcmJhbGFuY2UuYzoKKwkqIGdzdC1saWJzL2dzdC9jb2xvcmJhbGFuY2UvY29sb3JiYWxhbmNlLmg6CisJKiBnc3QtbGlicy9nc3QvY29sb3JiYWxhbmNlL2NvbG9yYmFsYW5jZW1hcnNoYWwubGlzdDoKKwkqIGdzdC1saWJzL2dzdC9taXhlci9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlci1tYXJzaGFsLmxpc3Q6CisJKiBnc3QtbGlicy9nc3QvbWl4ZXIvbWl4ZXIuYzoKKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlci5oOgorCSogZ3N0LWxpYnMvZ3N0L21peGVyL21peGVybWFyc2hhbC5saXN0OgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5Lmg6CisJKiBnc3QtbGlicy9nc3QvdHVuZXIvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvdHVuZXIvdHVuZXItbWFyc2hhbC5saXN0OgorCSogZ3N0LWxpYnMvZ3N0L3R1bmVyL3R1bmVyLmM6CisJKiBnc3QtbGlicy9nc3QvdHVuZXIvdHVuZXIuaDoKKwkqIGdzdC1saWJzL2dzdC90dW5lci90dW5lcm1hcnNoYWwubGlzdDoKKyAgICAgICAgICB1c2UgbmV3IGdsaWItZ2VuLm1hayBzbmlwcGV0IHRvIGNsZWFuIHVwIE1ha2VmaWxlLmFtCisgICAgICAgICAgZml4IHZhcmlvdXMgYnVncyBpbiBNYWtlZmlsZS5hbSdzCisKKzIwMDQtMDItMDMgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9jaGFpbik6CisJICBoYW5kbGUgY2hhaW4gcGFyc2luZyBjb3JyZWN0bHkgaW4gdGhlIG11bHRpY2hhaW4gY2FzZQorCSogZXh0L3RoZW9yYS90aGVvcmFkZWMuYzogKGdzdF90aGVvcmFfZGVjX2luaXQpLCAoX3RoZW9yYV9pbG9nKSwKKwkodGhlb3JhX2RlY19mcm9tX2dyYW51bGVwb3MpLCAodGhlb3JhX2RlY190b19ncmFudWxlcG9zKSwKKwkodGhlb3JhX2RlY19zcmNfcXVlcnkpLCAodGhlb3JhX2RlY19zcmNfZXZlbnQpLCAodGhlb3JhX2RlY19ldmVudCksCisJKHRoZW9yYV9kZWNfY2hhaW4pOgorCSAgaGFuZGxlIGV2ZW50cyBhbmQgcXVlcmllcyBjb3JyZWN0bHkKKworMjAwNC0wMi0wMyAgRGF2aWQgSS4gTGVobiAgPGRsZWhuQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogLmN2c2lnbm9yZToKKwlJZ25vcmUgZ2VuZXJhdGVkIGZpbGUgX3N0ZGludC5oLgorCisyMDA0LTAyLTAzICBEYXZpZCBJLiBMZWhuICA8ZGxlaG5AdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBnc3QtbGlicy9nc3QvY29sb3JiYWxhbmNlL01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L2NvbG9yYmFsYW5jZS9jb2xvcmJhbGFuY2UuaDoKKwkqIGdzdC1saWJzL2dzdC9taXhlci9NYWtlZmlsZS5hbToKKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlci5oOgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5Lmg6CisJKiBnc3QtbGlicy9nc3QvdHVuZXIvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvdHVuZXIvdHVuZXIuaDoKKwlHZW5lcmF0ZSBlbnVtIHR5cGUgY29kZSB3aXRoIGdsaWItbWtlbnVtcy4KKwkqIGdzdC1saWJzL2dzdC9jb2xvcmJhbGFuY2UvLmN2c2lnbm9yZToKKwkqIGdzdC1saWJzL2dzdC9taXhlci8uY3ZzaWdub3JlOgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvLmN2c2lnbm9yZToKKwkqIGdzdC1saWJzL2dzdC90dW5lci8uY3ZzaWdub3JlOgorCUlnbm9yZSBnZW5lcmF0ZWQgZmlsZXMuCisKKzIwMDQtMDItMDMgIERhdmlkIEkuIExlaG4gIDxkbGVobkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9hdWRpby8uY3ZzaWdub3JlOgorCUlnbm9yZSBnZW5lcmF0ZWQgZmlsZS4KKwkqIGdzdC1saWJzL2dzdC9hdWRpby9NYWtlZmlsZS5hbToKKwlEbyBub3QgaW5zdGFsbCBleGFtcGxlIGZpbHRlci4KKworMjAwNC0wMi0wMyAgRGF2aWQgSS4gTGVobiAgPGRsZWhuQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworCSogZXhhbXBsZXMvc3dpdGNoLy5jdnNpZ25vcmU6CisJSWdub3JlIGdlbmVyYXRlZCBmaWxlLgorCisyMDA0LTAyLTAzICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGNvbW1vbi9tNC9heF9jcmVhdGVfc3RkaW50X2gubTQ6CisJKiBjb25maWd1cmUuYWM6CisJICBhZGQgQVhfQ1JFQVRFX1NURElOVF9IIHRvIGdldCBjb3JyZWN0IHR5cGUgZGVmaW5pdGlvbnMgZm9yIGE1MmRlYyBpbgorCSAgX3N0ZGludC5oLgorCSogTWFrZWZpbGUuYW06CisJICByZW1vdmUgZ2VuZXJhdGVkIF9zdGRpbnQuaCBpbiBESVNUQ0xFQU5GSUxFUworCSogZXh0L2E1MmRlYy9nc3RhNTJkZWMuYzoKKwkgIGluY2x1ZGUgX3N0ZGludC5oIGZvciBhNTJkZWMuIChzaG91bGQgZml4ICMxMzMwNjQpCisKKzIwMDQtMDItMDIgIEplcmVteSBTaW1vbiAgPGplc2ltb25AbGliZXJ0eXN1cmYuZnI+CisKKwkqIGdzdC90YWdzL2dzdHZvcmJpc3RhZy5jOiAoZ3N0X3ZvcmJpc190YWdfYWRkKSwKKwkoZ3N0X3RhZ190b192b3JiaXNfY29tbWVudHMpOgorCUFkZCByZXBsYXlnYWluIHN1cHBvcnQgdG8gdm9yYmlzdGFnCisKKzIwMDQtMDItMDIgIEplcmVteSBTaW1vbiAgPGplc2ltb25AbGliZXJ0eXN1cmYuZnI+CisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2NvZGVjbWFwLmM6IChnc3RfZmZtcGVnX2NvZGVjaWRfdG9fY2FwcyksCisJKGdzdF9mZm1wZWdfY2Fwc190b19leHRyYWRhdGEpOgorCSAgRml4IFNWUTMgY2FwcyBmbGFnIHByb3BlcnRpZXMKKwkgIFVzZSBnbGliIG1hY3JvIGZvciBieXRlcyBzd2FwCisKKzIwMDQtMDItMDIgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzaW5rLmM6IChnc3RfYWZzaW5rX3BsdWdpbl9pbml0KToKKwkqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzcmMuYzogKGdzdF9hZnNyY19wbHVnaW5faW5pdCk6CisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnMuYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC9zbmRmaWxlL2dzdHNmLmM6IChwbHVnaW5faW5pdCk6CisJKiBnc3QvYXZpL2dzdGF2aS5jOiAocGx1Z2luX2luaXQpOgorCSogc3lzL2R4cjMvZHhyM2luaXQuYzogKHBsdWdpbl9pbml0KToKKwkqIHN5cy9vc3MvZ3N0b3NzYXVkaW8uYzogKHBsdWdpbl9pbml0KToKKwkqIHN5cy92NGwvZ3N0djRsLmM6IChwbHVnaW5faW5pdCk6CisJKiBzeXMvdjRsMi9nc3R2NGwyLmM6IChwbHVnaW5faW5pdCk6CisgICAgICAgICAgcmVtb3ZlIHRleHRkb21haW4gY2FsbHMKKwkqIHBvL25sLnBvOgorICAgICAgICAgIHVwZGF0ZSBEdXRjaCB0cmFuc2xhdGlvbgorCisyMDA0LTAyLTAyICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9wbGF5L3BsYXkuYzogKGdzdF9wbGF5X3BpcGVsaW5lX3NldHVwKSwKKwkoZ3N0X3BsYXlfc2V0X2F1ZGlvX3NpbmspOiBNb3Zpbmcgdm9sdW1lIGluIHRoZSBhdWRpbyB0aHJlYWQgZm9yCisJaW5zdGFudGFuZW91cyB2b2x1bWUgY2hhbmdlLiBNYXliZSBpIHdpbGwgYWRkIGFub3RoZXIgdm9sdW1lIGluIGZyb250CisJb2YgdmlzdWFsaXphdGlvbiBsYXRlciwgbm90IHN1cmUgeWV0IHRob3VnaC4KKworMjAwNC0wMi0wMiAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3JlbmVnb3RpYXRlX3NpemUpLAorCShnc3RfeGltYWdlc2lua19oYW5kbGVfeGV2ZW50cyk6IEJldHRlciBYIGV2ZW50cyBoYW5kbGluZywgb25seSB0YWtlCisJdGhlIGxhdGVzdCBldmVudHMgZm9yIGNvbmZpZ3VyZSBhbmQgbW90aW9uLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19oYW5kbGVfeGV2ZW50cyk6IHNhbWUuCisKKzIwMDQtMDItMDIgIEpvbiBUcm93YnJpZGdlICA8dHJvd0BnbnUub3JnPgorCisJcmV2aWV3ZWQgYnk6IERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCUZpeCBtZW1vcnkgbGVha3M6CisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2RlYy5jOiAoZ3N0X2ZmbXBlZ2RlY19yZWdpc3Rlcik6CisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2VuYy5jOiAoZ3N0X2ZmbXBlZ2VuY19yZWdpc3Rlcik6CisKKzIwMDQtMDItMDIgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCWNvZGUgY2xlYW51cC4gIENoYW5nZSBiemVybygpIHRvIG1lbXNldCgpLiAgUmVtb3ZlIGR1cGxpY2F0ZSA7IGF0IGVuZHMKKwlvZiBsaW5lcy4KKwkqIGV4dC9jZHBhcmFub2lhL2dzdGNkcGFyYW5vaWEuYzogKGNkcGFyYW5vaWFfZXZlbnQpOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jOiAoZ3N0X2ZsYWNfdGFnX2NoYWluKToKKwkqIGV4dC94dmlkL2dzdHh2aWRkZWMuYzogKGdzdF94dmlkZGVjX3NyY19saW5rKToKKwkqIGdzdC1saWJzL2dzdC9wbGF5L3BsYXkuYzogKGdzdF9wbGF5X2dldF9zaW5rX2VsZW1lbnQpOgorCSogZ3N0L2FjM3BhcnNlL2dzdGFjM3BhcnNlLmM6IChnc3RfYWMzcGFyc2VfY2hhaW4pOgorCSogZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5jOiAoZ3N0X2VkZ2V0dl9zaW5rY29ubmVjdCk6CisJKiBnc3QvZWZmZWN0di9nc3R2ZXJ0aWdvLmM6IChnc3RfdmVydGlnb3R2X3Npbmtjb25uZWN0KToKKwkqIGdzdC9pbnRmbG9hdC9mbG9hdDIyaW50LmM6IChnc3RfZmxvYXQyXzJfaW50X2dldGNhcHMpLAorCShnc3RfZmxvYXQyXzJfaW50X2xpbmspOgorCSogZ3N0L21wZWcyc3ViL2dzdG1wZWcyc3VidC5jOiAoZ3N0X21wZWcyc3VidF9jaGFpbl9zdWJ0aXRsZSk6CisJKiBnc3QvcnRqcGVnL1JUanBlZy5jOiAoUlRqcGVnX2luaXRfbWNvbXByZXNzKToKKwkqIGdzdC90Y3AvZ3N0dGNwc2luay5jOiAoZ3N0X3RjcHNpbmtfaW5pdF9zZW5kKToKKwkqIGdzdC90Y3AvZ3N0dGNwc3JjLmM6IChnc3RfdGNwc3JjX2luaXRfcmVjZWl2ZSk6CisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuYzogKGdzdF91ZHBzaW5rX2luaXRfc2VuZCk6CisJKiBnc3QvdWRwL2dzdHVkcHNyYy5jOiAoZ3N0X3VkcHNyY19pbml0X3JlY2VpdmUpOgorCSogc3lzL3Y0bC9nc3R2NGxlbGVtZW50LmM6IChnc3RfdjRsZWxlbWVudF9pbml0KToKKwkqIHN5cy92NGwyL3Y0bDJzcmNfY2FsbHMuYzogKGdzdF92NGwyc3JjX3NldF9jYXB0dXJlKToKKwkqIHRlc3RzdWl0ZS9nc3QtbGludDogQWRkIHRlc3RzIGZvciBiemVybyBhbmQgOzsKKworMjAwNC0wMi0wMiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvZGVidWcvZWZlbmNlLmM6IEFkZCBmYWxsYmFjayBpZiBNQVBfQU5PTllNT1VTIGlzbid0IGRlZmluZWQuCisKKzIwMDQtMDItMDIgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9hYWxpYi9nc3RhYXNpbmsuYzogKGdzdF9hYXNpbmtfb3Blbik6CisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9saW5rKSwgKGdzdF9hbHNhX3hydW5fcmVjb3ZlcnkpOgorCSogZXh0L2Fsc2EvZ3N0YWxzYXNpbmsuYzogKGdzdF9hbHNhX3NpbmtfbG9vcCk6CisJKiBleHQvYWxzYS9nc3RhbHNhc3JjLmM6IChnc3RfYWxzYV9zcmNfbG9vcCk6CisJKiBleHQvYXVkaW9maWxlL2dzdGFmc2luay5jOiAoZ3N0X2Fmc2lua19vcGVuX2ZpbGUpLAorCShnc3RfYWZzaW5rX2Nsb3NlX2ZpbGUpOgorCSogZXh0L2F1ZGlvZmlsZS9nc3RhZnNyYy5jOiAoZ3N0X2Fmc3JjX29wZW5fZmlsZSksCisJKGdzdF9hZnNyY19jbG9zZV9maWxlKToKKwkqIGV4dC9kaXZ4L2dzdGRpdnhkZWMuYzogKGdzdF9kaXZ4ZGVjX3NldHVwKSwgKGdzdF9kaXZ4ZGVjX2NoYWluKToKKwkqIGV4dC9kaXZ4L2dzdGRpdnhlbmMuYzogKGdzdF9kaXZ4ZW5jX3NldHVwKSwgKGdzdF9kaXZ4ZW5jX2NoYWluKToKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOiAoZ3N0X2R2ZGVjX2xvb3ApOgorCSogZXh0L2R2ZG5hdi9kdmRuYXZzcmMuYzogKGR2ZG5hdnNyY191c2VyX29wKSwgKGR2ZG5hdnNyY19nZXQpOgorCSogZXh0L2VzZC9lc2Rtb24uYzogKGdzdF9lc2Rtb25fZ2V0KToKKwkqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfY2hhaW4pLCAoZ3N0X2VzZHNpbmtfb3Blbl9hdWRpbyk6CisJKiBleHQvZmFhYy9nc3RmYWFjLmM6IChnc3RfZmFhY19jaGFpbik6CisJKiBleHQvZmFhZC9nc3RmYWFkLmM6IChnc3RfZmFhZF9jaGFpbik6CisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2RlYy5jOiAoZ3N0X2ZmbXBlZ2RlY19jaGFpbik6CisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2RlbXV4LmM6IChnc3RfZmZtcGVnZGVtdXhfbG9vcCk6CisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ211eC5jOiAoZ3N0X2ZmbXBlZ211eF9sb29wKToKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjZGVjX2Vycm9yX2NhbGxiYWNrKSwKKwkoZ3N0X2ZsYWNkZWNfbG9vcCk6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChnc3RfZmxhY2VuY19jaGFpbik6CisJKiBleHQvZmxhYy9nc3RmbGFjdGFnLmM6IChnc3RfZmxhY190YWdfY2hhaW4pOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6IChnc3RfZ2RrX3BpeGJ1Zl9jaGFpbik6CisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzaW5rLmM6IChnc3RfZ25vbWV2ZnNzaW5rX29wZW5fZmlsZSksCisJKGdzdF9nbm9tZXZmc3NpbmtfY2xvc2VfZmlsZSk6CisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzcmMuYzogKGF1ZGlvY2FzdF9pbml0KSwKKwkoZ3N0X2dub21ldmZzc3JjX29wZW5fZmlsZSk6CisJKiBleHQvaXZvcmJpcy92b3JiaXNmaWxlLmM6IChnc3RfaXZvcmJpc2ZpbGVfbG9vcCk6CisJKiBleHQvbGFtZS9nc3RsYW1lLmM6IChnc3RfbGFtZV9zaW5rX2xpbmspLCAoZ3N0X2xhbWVfY2hhaW4pOgorCSogZXh0L2xjcy9nc3Rjb2xvcnNwYWNlLmM6IChnc3RfY29sb3JzcGFjZV9zcmNjb25uZWN0X2Z1bmMpOgorCSogZXh0L21hZC9nc3RpZDN0YWcuYzogKGdzdF9pZDNfdGFnX2hhbmRsZV9ldmVudCksCisJKGdzdF9pZDNfdGFnX2RvX3R5cGVmaW5kKSwgKGdzdF9pZDNfdGFnX2NoYWluKToKKwkqIGV4dC9tYWQvZ3N0bWFkLmM6IChnc3RfbWFkX2NoYWluKToKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6IChnc3RfbWlrbW9kX2xvb3ApOgorCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmM6CisJKiBleHQvbXBlZzJlbmMvZ3N0bXBlZzJlbmMuY2M6CisJKiBleHQvbXBsZXgvZ3N0bXBsZXguY2M6CisJKiBleHQvbXBsZXgvZ3N0bXBsZXhpYml0c3RyZWFtLmNjOgorCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9jaGFpbiksCisJKGdzdF9vZ2dfZGVtdXhfcHVzaCk6CisJKiBleHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYzoKKwkqIGV4dC9zZGwvc2RsdmlkZW9zaW5rLmM6IChnc3Rfc2RsdmlkZW9zaW5rX2xvY2spLAorCShnc3Rfc2RsdmlkZW9zaW5rX2luaXRzZGwpLCAoZ3N0X3NkbHZpZGVvc2lua19jcmVhdGUpOgorCSogZXh0L3NuZGZpbGUvZ3N0c2YuYzogKGdzdF9zZl9vcGVuX2ZpbGUpLCAoZ3N0X3NmX2Nsb3NlX2ZpbGUpLAorCShnc3Rfc2ZfbG9vcCk6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhlbmMuYzogKGdzdF9zcGVleGVuY19jaGFpbik6CisJKiBleHQvc3dmZGVjL2dzdHN3ZmRlYy5jOiAoZ3N0X3N3ZmRlY19sb29wKToKKwkqIGV4dC90YXJraW4vZ3N0dGFya2luZGVjLmM6IChnc3RfdGFya2luZGVjX2NoYWluKToKKwkqIGV4dC90YXJraW4vZ3N0dGFya2luZW5jLmM6IChnc3RfdGFya2luZW5jX2NoYWluKToKKwkqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmM6IChnc3Rfdm9yYmlzZW5jX2NoYWluKToKKwkqIGV4dC92b3JiaXMvdm9yYmlzZmlsZS5jOiAoZ3N0X3ZvcmJpc2ZpbGVfbG9vcCk6CisJKiBleHQveHZpZC9nc3R4dmlkZGVjLmM6IChnc3RfeHZpZGRlY19zZXR1cCksIChnc3RfeHZpZGRlY19jaGFpbik6CisJKiBleHQveHZpZC9nc3R4dmlkZW5jLmM6IChnc3RfeHZpZGVuY19zZXR1cCksIChnc3RfeHZpZGVuY19jaGFpbik6CisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuYzogKGdzdF9yaWZmX3BlZWtfaGVhZCksCisJKGdzdF9yaWZmX3JlYWRfZWxlbWVudF9kYXRhKSwgKGdzdF9yaWZmX3JlYWRfc2VlayksCisJKGdzdF9yaWZmX3BlZWtfbGlzdCksIChnc3RfcmlmZl9yZWFkX2xpc3QpLCAoZ3N0X3JpZmZfcmVhZF9oZWFkZXIpOgorCSogZ3N0L2FkZGVyL2dzdGFkZGVyLmM6IChnc3RfYWRkZXJfbG9vcCk6CisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19zZWdtZW50KSwKKwkoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX3N0cmVhbSksIChnc3RfYXNmX2RlbXV4X2dldF9zdHJlYW0pOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5pdCksCisJKGdzdF9hdmlfZGVtdXhfYWRkX3N0cmVhbSksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmltdXhfc3RvcF9maWxlKToKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IChnc3RfZmx4ZGVjX2xvb3ApOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOiAoZ3N0X2dvb21fY2hhaW4pOgorCSogZ3N0L2lkMy9nc3RpZDN0eXBlcy5jOiAoZ3N0X2lkM3R5cGVzX2xvb3ApOgorCSogZ3N0L2ludGZsb2F0L2Zsb2F0MjJpbnQuYzogKGdzdF9mbG9hdDJfMl9pbnRfY2hhaW4pOgorCSogZ3N0L2ludGZsb2F0L2dzdGZsb2F0MmludC5jOiAoZ3N0X2Zsb2F0MmludF9sb29wKToKKwkqIGdzdC9pbnRmbG9hdC9nc3RpbnQyZmxvYXQuYzogKGdzdF9pbnQyZmxvYXRfY2hhaW5fZ2ludDE2KToKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9pZCksCisJKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9sZW5ndGgpLCAoZ3N0X2VibWxfcmVhZF9lbGVtZW50X2RhdGEpLAorCShnc3RfZWJtbF9yZWFkX3NlZWspLCAoZ3N0X2VibWxfcmVhZF91aW50KSwgKGdzdF9lYm1sX3JlYWRfc2ludCksCisJKGdzdF9lYm1sX3JlYWRfZmxvYXQpLCAoZ3N0X2VibWxfcmVhZF9oZWFkZXIpOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfaW5pdF9zdHJlYW0pLAorCShnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cCk6CisJKiBnc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jOiAoZ3N0X21vbm9zY29wZV9jaGFpbik6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVncGFyc2UuYzogKGdzdF9tcGVnX3BhcnNlX2xvb3ApOgorCSogZ3N0L29uZXRvbi9nc3RvbmV0b24uYzogKGdzdF9vbmV0b25fY2hhaW4pOgorCSogZ3N0L3NpbGVuY2UvZ3N0c2lsZW5jZS5jOiAoZ3N0X3NpbGVuY2VfZ2V0KToKKwkqIGdzdC9zaW5lL2dzdHNpbmVzcmMuYzogKGdzdF9zaW5lc3JjX2dldCk6CisJKiBnc3Qvc21wdGUvZ3N0c21wdGUuYzogKGdzdF9zbXB0ZV9sb29wKToKKwkqIGdzdC9zcGVlZC9nc3RzcGVlZC5jOiAoc3BlZWRfbG9vcCk6CisJKiBnc3QvdGFncy9nc3R2b3JiaXN0YWcuYzogKGdzdF92b3JiaXNfdGFnX2NoYWluKToKKwkqIGdzdC92aWRlb3Rlc3RzcmMvZ3N0dmlkZW90ZXN0c3JjLmM6IChnc3RfdmlkZW90ZXN0c3JjX2dldCk6CisJKiBnc3Qvdm9sZW52L2dzdHZvbGVudi5jOiAoZ3N0X3ZvbGVudl9jaGFpbik6CisJKiBnc3Qvd2F2ZW5jL2dzdHdhdmVuYy5jOiAoZ3N0X3dhdmVuY19jaGFpbik6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYzogKGdzdF93YXZwYXJzZV9wYXJzZV9mbXQpLAorCShnc3Rfd2F2cGFyc2VfbG9vcCk6CisJKiBzeXMvZHhyMy9keHIzYXVkaW9zaW5rLmM6IChkeHIzYXVkaW9zaW5rX29wZW4pLAorCShkeHIzYXVkaW9zaW5rX3NldF9tb2RlX3BjbSksIChkeHIzYXVkaW9zaW5rX3NldF9tb2RlX2FjMyksCisJKGR4cjNhdWRpb3NpbmtfY2xvc2UpOgorCSogc3lzL2R4cjMvZHhyM3NwdXNpbmsuYzogKGR4cjNzcHVzaW5rX29wZW4pLCAoZHhyM3NwdXNpbmtfY2xvc2UpOgorCSogc3lzL2R4cjMvZHhyM3ZpZGVvc2luay5jOiAoZHhyM3ZpZGVvc2lua19vcGVuKSwKKwkoZHhyM3ZpZGVvc2lua19jbG9zZSksIChkeHIzdmlkZW9zaW5rX3dyaXRlX2RhdGEpOgorCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50LmM6IChnc3Rfb3NzZWxlbWVudF9vcGVuX2F1ZGlvKToKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc3NpbmtfY2hhaW4pOgorCSogc3lzL29zcy9nc3Rvc3NzcmMuYzogKGdzdF9vc3NzcmNfZ2V0KToKKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzaW5rLmM6IChnc3RfdjRsbWpwZWdzaW5rX2NoYWluKToKKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzcmMuYzogKGdzdF92NGxtanBlZ3NyY19idWZmZXJfZnJlZSk6CisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19idWZmZXJfZnJlZSk6CisJKiBzeXMvdjRsL3Y0bC1vdmVybGF5X2NhbGxzLmM6IChnc3RfdjRsX3NldF9vdmVybGF5KSwKKwkoZ3N0X3Y0bF9zZXRfd2luZG93KSwgKGdzdF92NGxfZW5hYmxlX292ZXJsYXkpOgorCSogc3lzL3Y0bC92NGxfY2FsbHMuYzogKGdzdF92NGxfZ2V0X2NhcGFiaWxpdGllcyksIChnc3RfdjRsX29wZW4pLAorCShnc3RfdjRsX3NldF9jaGFuX25vcm0pLCAoZ3N0X3Y0bF9nZXRfc2lnbmFsKSwKKwkoZ3N0X3Y0bF9nZXRfZnJlcXVlbmN5KSwgKGdzdF92NGxfc2V0X2ZyZXF1ZW5jeSksCisJKGdzdF92NGxfZ2V0X3BpY3R1cmUpLCAoZ3N0X3Y0bF9zZXRfcGljdHVyZSksIChnc3RfdjRsX2dldF9hdWRpbyksCisJKGdzdF92NGxfc2V0X2F1ZGlvKToKKwkqIHN5cy92NGwvdjRsX2NhbGxzLmg6CisJKiBzeXMvdjRsL3Y0bG1qcGVnc2lua19jYWxscy5jOiAoZ3N0X3Y0bG1qcGVnc2lua19zeW5jX3RocmVhZCksCisJKGdzdF92NGxtanBlZ3NpbmtfcXVldWVfZnJhbWUpLCAoZ3N0X3Y0bG1qcGVnc2lua19zZXRfcGxheWJhY2spLAorCShnc3RfdjRsbWpwZWdzaW5rX3BsYXliYWNrX2luaXQpLAorCShnc3RfdjRsbWpwZWdzaW5rX3BsYXliYWNrX3N0YXJ0KToKKwkqIHN5cy92NGwvdjRsbWpwZWdzcmNfY2FsbHMuYzogKGdzdF92NGxtanBlZ3NyY19xdWV1ZV9mcmFtZSk6CisJKiBzeXMvdjRsL3Y0bHNyY19jYWxscy5jOiAoZ3N0X3Y0bHNyY19xdWV1ZV9mcmFtZSksCisJKGdzdF92NGxzcmNfc3luY19mcmFtZSksIChnc3RfdjRsc3JjX2NhcHR1cmVfaW5pdCksCisJKGdzdF92NGxzcmNfcmVxdWV1ZV9mcmFtZSksIChnc3RfdjRsc3JjX3RyeV9wYWxldHRlKToKKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX2dldCk6CisJKiBzeXMvdjRsMi92NGwyLW92ZXJsYXlfY2FsbHMuYzogKGdzdF92NGwyX3NldF9kaXNwbGF5KSwKKwkoZ3N0X3Y0bDJfc2V0X3dpbmRvdyksIChnc3RfdjRsMl9lbmFibGVfb3ZlcmxheSk6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6IChnc3RfdjRsMl9nZXRfY2FwYWJpbGl0aWVzKSwKKwkoZ3N0X3Y0bDJfZmlsbF9saXN0cyksIChnc3RfdjRsMl9vcGVuKSwgKGdzdF92NGwyX2dldF9ub3JtKSwKKwkoZ3N0X3Y0bDJfc2V0X25vcm0pLCAoZ3N0X3Y0bDJfZ2V0X2lucHV0KSwgKGdzdF92NGwyX3NldF9pbnB1dCksCisJKGdzdF92NGwyX2dldF9vdXRwdXQpLCAoZ3N0X3Y0bDJfc2V0X291dHB1dCksCisJKGdzdF92NGwyX2dldF9mcmVxdWVuY3kpLCAoZ3N0X3Y0bDJfc2V0X2ZyZXF1ZW5jeSksCisJKGdzdF92NGwyX3NpZ25hbF9zdHJlbmd0aCksIChnc3RfdjRsMl9nZXRfYXR0cmlidXRlKSwKKwkoZ3N0X3Y0bDJfc2V0X2F0dHJpYnV0ZSk6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisJKiBzeXMvdjRsMi92NGwyc3JjX2NhbGxzLmM6IChnc3RfdjRsMnNyY19maWxsX2Zvcm1hdF9saXN0KSwKKwkoZ3N0X3Y0bDJzcmNfcXVldWVfZnJhbWUpLCAoZ3N0X3Y0bDJzcmNfZ3JhYl9mcmFtZSksCisJKGdzdF92NGwyc3JjX2dldF9jYXB0dXJlKSwgKGdzdF92NGwyc3JjX3NldF9jYXB0dXJlKSwKKwkoZ3N0X3Y0bDJzcmNfY2FwdHVyZV9pbml0KSwgKGdzdF92NGwyc3JjX2NhcHR1cmVfc3RhcnQpLAorCShnc3RfdjRsMnNyY19jYXB0dXJlX3N0b3ApOgorCSogc3lzL3ZjZC92Y2RzcmMuYzogKHZjZHNyY19vcGVuX2ZpbGUpOgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua194Y29udGV4dF9nZXQpLAorCShnc3RfeGltYWdlc2lua19jaGFpbik6CisJKiBzeXMveHZpZGVvL3h2aWRlb3NpbmsuYzogKGdzdF94dmlkZW9zaW5rX2J1ZmZlcl9uZXcpLAorCShnc3RfeHZpZGVvc2lua19zaW5rY29ubmVjdCksIChnc3RfeHZpZGVvc2lua19jaGFpbiksCisJKGdzdF94dmlkZW9zaW5rX3h3aW5kb3dfbmV3KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NoYWluKToKKworMjAwNC0wMi0wMiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L3ZvbHVtZS9nc3R2b2x1bWUuYzogKGdzdF92b2x1bWVfc2V0X3ZvbHVtZSksCisJKGdzdF92b2x1bWVfZ2V0X3ZvbHVtZSksICh2b2x1bWVfY2xhc3NfaW5pdCksICh2b2x1bWVfaW5pdCksCisJKHZvbHVtZV9jaGFpbl9pbnQxNiksICh2b2x1bWVfdXBkYXRlX3ZvbHVtZSk6CisJKiBnc3Qvdm9sdW1lL2dzdHZvbHVtZS5oOgorICAgICAgICAgIG1ha2UgY29kZSBtb3JlIHJlYWRhYmxlIGJ5IHJlbW92aW5nIG1hZ2ljIG51bWJlcnMKKyAgICAgICAgICBtYWtlIG1peGVyIGludGVyZmFjZSBleHBvcnQgMC0xMDAgcmFuZ2UKKyAgICAgICAgICBtYWtlIGl0IGludGVybmFsbHkgbWFwIHRvIDAuMC0xLjAgcmFuZ2Ugc28gdXNlcnMgZG9uJ3QgZGlzdG9ydAorICAgICAgICAgIG91dHB1dCBieSBwdXR0aW5nIHRoZSBzbGlkZXJzIGF0IGZ1bGwgdm9sdW1lCisKKzIwMDQtMDItMDIgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC1saWJzL2dzdC9wbGF5L3BsYXkuYzogKGdzdF9wbGF5X3RpY2tfY2FsbGJhY2spLAorCShnc3RfcGxheV9zdGF0ZV9jaGFuZ2UpLCAoZ3N0X3BsYXlfc2Vla190b190aW1lKToKKyAgICAgICAgYmxvY2sgdGhlIHRpY2sgY2FsbGJhY2sgZm9yIDAuNSBzZWNzIGFmdGVyIGRvaW5nIGEgc2VlaworCisyMDA0LTAyLTAyICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5LmM6IChnc3RfcGxheV9uZXcpOgorICAgICAgICAgIGNoZWNrIGZvciBHRXJyb3IKKworMjAwNC0wMi0wMSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5LmM6IChnc3RfcGxheV9zZWVrX3RvX3RpbWUpLAorCShnc3RfcGxheV9uZXcpOiBBY2NlcHRpbmcgTlVMTCBHRXJyb3IsIGJsb2NraW5nIHRpbWUgdGljayB3aGlsZSBzZWVraW5nLgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19zaW5rX2xpbmspLAorCShnc3RfeGltYWdlc2lua19jaGFpbiksIChnc3RfeGltYWdlc2lua19pbml0KTogcy9zaW5rY29ubmVjdC9zaW5rX2xpbmsKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfc2lua19saW5rKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NoYWluKSwgKGdzdF94dmltYWdlc2lua19pbml0KTogcy9zaW5rY29ubmVjdC9zaW5rX2xpbmsKKworMjAwNC0wMi0wMSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSogZXh0L3ZvcmJpcy92b3JiaXNkZWMuYzogKHZvcmJpc19kZWNfZXZlbnQpOgorICAgICAgICAgIGNoZWNrIGZvciBhIGZ1bmN0aW9uIGFkZGVkIGluIHZvcmJpcyAxLjEKKworMjAwNC0wMS0zMSAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvYWxzYS9nc3RhbHNhLmM6IChnc3RfYWxzYV9jaGFuZ2Vfc3RhdGUpLCAoZ3N0X2Fsc2Ffc3RhcnQpLAorCShnc3RfYWxzYV9kcmFpbl9hdWRpbyksIChnc3RfYWxzYV9zdG9wX2F1ZGlvKToKKwkgIHJlYWxseSBzdGFydC9zdG9wIGNsb2NrIG9ubHkgb24gUExBWUlORyA8PT4gUEFVU0VECisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jOiAoZ3N0X2Fsc2Ffc2lua19sb29wKToKKwkgIHJlbW92ZSBcbiBmcm9tIGRlYnVnZ2luZyBsaW5lcworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9jaGFpbik6CisJICBtYWtlIGl0IHdvcmsgd2hlbiBzZWVraW5nIGRvZXMgbm90CisJKiBleHQvdm9yYmlzL3ZvcmJpc2RlYy5jOiAodm9yYmlzX2RlY19ldmVudCk6CisJICByZXNldCBvbiBESVNDT05UCisKKzIwMDQtMDEtMzEgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfY2hhbmdlX3N0YXRlKSwgKGdzdF9hbHNhX3N0YXJ0KToKKwkgIHN0YXJ0IGNsb2NrIG9uIFBBVVNFRD0+UExBWUlORywgbm90IGxhdGVyCisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jOiAoZ3N0X2Fsc2Ffc2lua19jaGVja19ldmVudCk6CisJICBleHRyYWN0IGNvcnJlY3QgdGltZSBmb3IgZGlmZmVyZW50IGRpc2NvbnQgZm9ybWF0cworCShnc3RfYWxzYV9zaW5rX2dldF90aW1lKToKKwkgIGRvbid0IHNlZ2ZhdWx0IHdoZW4gbm8gZm9ybWF0IGlzIG5lZ290aWF0ZWQgeWV0LCBqdXN0IHJldHVybiAwCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6IChnc3Rfb2dnX2RlbXV4X3NyY19ldmVudCksCisJKGdzdF9vZ2dfZGVtdXhfaGFuZGxlX2V2ZW50KSwgKGdzdF9vZ2dfZGVtdXhfcHVzaCksCisJKGdzdF9vZ2dfcGFkX3B1c2gpOgorCSAgaGFuZGxlIGZsdXNoIGFuZCBkaXNjb250IGV2ZW50cyBjb3JyZWN0bHkKKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmM6ICh2b3JiaXNfZGVjX2V2ZW50KSwgKHZvcmJpc19kZWNfY2hhaW4pOgorCSAgaGFuZGxlIGRpc2NvbnQgZXZlbnRzIGNvcnJlY3RseQorCisyMDA0LTAxLTMxICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5LmM6IChnc3RfcGxheV9lcnJvcl9xdWFyayksCisJKGdzdF9wbGF5X2Vycm9yX2NyZWF0ZSksIChnc3RfcGxheV9lcnJvcl9wbHVnaW4pLAorCShnc3RfcGxheV9waXBlbGluZV9zZXR1cCksIChnc3RfcGxheV9pbml0KSwgKGdzdF9wbGF5X25ldyk6CisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5Lmg6CisgICAgICAgICAgYWRkIGVycm9yIGhhbmRsaW5nIGR1cmluZyBjcmVhdGlvbgorCSogZXhhbXBsZXMvZ3N0cGxheS9wbGF5ZXIuYzogKG1haW4pOgorICAgICAgICAgIHVzZSBuZXcgZ3N0X3BsYXlfbmV3CisKKworMjAwNC0wMS0zMSAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOiAodGhlb3JhX2RlY19jaGFpbik6CisJICBtYWtlIGNvbW1lbnRzIHdvcmsKKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmM6ICh2b3JiaXNfZGVjX3NyY19xdWVyeSksCisJKHZvcmJpc19kZWNfc3JjX2V2ZW50KSwgKHZvcmJpc19kZWNfY2hhaW4pOgorCSAgYWRkIGVuY29kZXIgdGFnLCBmaXggdGFnIHJlYWRpbmcgdG8gYmUgbW9yZSBlcnJvciB0b2xlcmFudCwgY2hhbmdlCisJICBCSVRSQVRFIHRvIE5PTUlOQUxfQklUUkFURSwgYWRkIGRlYnVnZ2luZywgZG9uJ3QgdW5yZWYgZXZlbnRzIGFmdGVyCisJICBnc3RfcGFkX2V2ZW50X2RlZmF1bHQuCisJKiBnc3QvdGFncy9nc3R2b3JiaXN0YWcuYzoKKwkoZ3N0X3RhZ19saXN0X2Zyb21fdm9yYmlzY29tbWVudF9idWZmZXIpOgorCSAgdW5kZWZpbmUgZnVuY3Rpb24gc3BlY2lmaWMgZGVmaW5lIGF0IGVuZCBvZiBmdW5jdGlvbgorCisyMDA0LTAxLTMxICBKZXJlbXkgU2ltb24gIDxqZXNpbW9uQGxpYmVydHlzdXJmLmZyPgorCisJKiBleHQvZmxhYy9nc3RmbGFjLmM6IChwbHVnaW5faW5pdCk6CisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6IChnc3RfZmxhY2RlY19jbGFzc19pbml0KToKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuaDoKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuaDoKKwkgIEZpeCB0eXBvcworCisyMDA0LTAxLTMwICBEYXZpZCBJLiBMZWhuICA8ZGxlaG5AdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisJKiBleGFtcGxlcy9nc3RwbGF5L3BsYXllci5jOiBzL2dzdHBsYXkuaC9wbGF5LmgvCisKKzIwMDQtMDEtMzAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC1saWJzL2dzdC9wbGF5L01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvZ3N0cGxheS5jOgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvZ3N0cGxheS5oOgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvcGxheS5jOgorICAgICAgICAgIG1vcmUgc3VyZ2VyeSwgb3BlcmF0aW9uIGNvbXBsZXRlCisKKzIwMDQtMDEtMzAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC1saWJzL2dzdC9wbGF5L3BsYXkub2xkLmM6CisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5Lm9sZC5oOgorICAgICAgICAgIGFmdGVyIENWUyBzdXJnZXJ5IGJ5IG1vdmluZywgcmVtb3ZlCisJKiBnc3QtbGlicy9nc3QvcGxheS9wbGF5cGlwZWxpbmVzLmM6CisgICAgICAgICAgcmVtb3ZlCisKKwkqIGdzdC9pbnRmbG9hdC9mbG9hdDIyaW50LmM6IChnc3RfZmxvYXQyXzJfaW50X2NoYWluKToKKyAgICAgICAgICBhZGQgbmVnb3RpYXRpb24gZXJyb3IKKworMjAwNC0wMS0zMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9zcmNfZXZlbnQpLAorCShnc3Rfb2dnX2RlbXV4X3B1c2gpOgorICAgICAgICAgIGFkZCBzb21lIHNlZWtpbmcgZGVidWcgaW5mbworICAgICAgICAgIHNlbmQgYSBmbHVzaCB3aGVuIHNlZWtpbmcKKworMjAwNC0wMS0zMCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBjb25maWd1cmUuYWM6CisJICB1c2UgQUNfQ19JTkxJTkUKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkqIGV4dC90aGVvcmEvTWFrZWZpbGUuYW06CisJKiBleHQvdGhlb3JhL3RoZW9yYWRlYy5jOgorCSAgYWRkIHRoZW9yYSB2aWRlbyBkZWNvZGVyLiBEb2VzIGp1c3QgZG8gc2ltcGxlIGRlY29kaW5nIGZvciBub3cgYW5kCisJICBoYXMgYmVlbiB0ZXN0ZWQgYWdhaW5zdCBUaGVvcmEgY3ZzIG9ubHkuIEl0IG9ubHkgd29ya3Mgd2hlbiB0aGVvcmEKKwkgIGlzIGNvbXBpbGVkIHdpdGggLS1lbmFibGUtc3RhdGljLgorCSogZXh0L3ZvcmJpcy92b3JiaXNkZWMuYzogKHZvcmJpc19kZWNfZXZlbnQpOgorCSAgYWx3YXlzIHJlc2V0IHBhY2tldG5vIG9uIERJU0NPTlQKKworMjAwNC0wMS0zMCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2RlbXV4LmM6IChnc3RfbXBlZ19kZW11eF9wYXJzZV9zeXNoZWFkKToKKwkgIEZpeCBhdWRpby4KKworMjAwNC0wMS0zMCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21wZWdhdWRpb3BhcnNlL2dzdG1wZWdhdWRpb3BhcnNlLmM6CisJKG1wM190eXBlX2ZyYW1lX2xlbmd0aF9mcm9tX2hlYWRlcik6CisJICBGaXggaGVhZGVyIHBhcnNpbmcgLSBzdG9sZW4gZnJvbSBmZm1wZWcgKHRoYW5rIHlvdSEgOikgKS4KKworMjAwNC0wMS0zMCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2VzZC9lc2RzaW5rLmM6IChnc3RfZXNkc2lua19pbml0KToKKwkgIFNpbmNlIHdlIGhhdmUgc3RhdGljIHBhZCB0ZW1wbGF0ZSBjYXBzLCB3ZSBkb24ndCBuZWVkIHRvIG5lZ290aWF0ZTsKKwkgIGVpdGhlciB0aGUgY29yZSBlcnJvcnMgb3V0IG9yIHdlIGtub3cgdGhlIGZvcm1hdC4KKworMjAwNC0wMS0zMCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9wZWVrX2hlYWQpLAorCShnc3RfcmlmZl9yZWFkX3NlZWspOgorCSogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOiAoZ3N0X2VibWxfcmVhZF9lbGVtZW50X2lkKSwKKwkoZ3N0X2VibWxfcmVhZF9zZWVrKToKKwkgIEZpeCBldmVudCBoYW5kbGluZy4KKworMjAwNC0wMS0zMCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2NvZGVjbWFwLmM6IChnc3RfZmZtcGVnX2NvZGVjaWRfdG9fY2Fwcyk6CisJICByZW1vdmVlIHZpZGVvL3gtdGhlb3JhIGZyb20gdnAzIGRlY29kZXIsIGl0IGRvZXNuJ3QgaGFuZGxlIHJhdworCSAgdGhlb3JhIHN0cmVhbXMKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfZGVtdXhfaW5pdCk6CisJICBmaXggYnVnIHdpdGggZmluYWxpemluZyBlbGVtZW50IHRoYXQgbmV2ZXIgd2VudCB0byBQQVVTRUQKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzogKGdzdF9vZ2dfZGVtdXhfc3JjX3F1ZXJ5KToKKwkgIGxlbmd0aCBhbmQgcG9zaXRpb24gcXVlcmllcyB3ZXJlIHN3YXBwZWQKKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmM6IChnc3Rfdm9yYmlzX2RlY19pbml0KSwKKwkodm9yYmlzX2RlY19mcm9tX2dyYW51bGVwb3MpLCAodm9yYmlzX2RlY19zcmNfcXVlcnkpLAorCSh2b3JiaXNfZGVjX3NyY19ldmVudCk6CisJICBpbXBsZW1lbnQgcXVlcnlpbmcgdGltZSBhbmQgYnl0ZXMKKworMjAwNC0wMS0zMCAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworICAgICAgICAqIGp1c3QgYWJvdXQgZXZlcnkgc291cmNlIGZpbGU6CisgICAgICAgICAgZ3N0X2VsZW1lbnRfZXJyb3IgLT4gR1NUX0VMRU1FTlRfRVJST1IKKworMjAwNC0wMS0yOSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzcmMuYzogKGdzdF9nbm9tZXZmc3NyY19nZXQpOiBGaXhpbmcgc2Vla2luZworCWVtaXRpbmcgRkxVU0ggYW5kIGV2ZW4gYmVmb3JlIERJU0NPTlQuCisJKiBnc3QtbGlicy9nc3QvcGxheS9nc3RwbGF5LmM6IChnc3RfcGxheV9zZWVrX3RvX3RpbWUpOiBGaXggc2Vla2luZyB0bworCWdldCB0aGUgYmVzdCBpbnN0YW50IHNlZWtpbmcgYXMgcG9zc2libGUgeWF5IQorCisyMDA0LTAxLTI5ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbXBlZzF2aWRlb3BhcnNlL2dzdG1wMXZpZGVvcGFyc2UuYzoKKwkoZ3N0X21wMXZpZGVvcGFyc2VfcmVhbF9jaGFpbik6CisJICBDb21taXR0ZWQgd3JvbmcgdmVyc2lvbiBsYXN0IHdlZWsuLi4gR3JyLi4uIERpZG4ndCBub3RpY2UgdW50aWwgbm93LgorCisyMDA0LTAxLTI5ICBKdWxpZW4gTU9VVFRFIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua194d2luZG93X25ldyk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3h3aW5kb3dfbmV3KTogRW1pdCB0aGUKKwloYXZlX3h3aW5kb3dfaWQgc2lnbmFsIGluIHh3aW5kb3dfY3JlYXRlLgorCisyMDA0LTAxLTI5ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9vZ2cvZ3N0b2dnZGVtdXguYzoKKwkgIGxvdHMgb2YgY2hhbmdlcyAtIG1haW5seSBzdXBwb3J0IGZvciBjaGFpbmVkIGJpdHN0cmVhbXMsIHNlZWtpbmcsCisJICBxdWVyeWluZyBhbmQgYnVnZml4ZXMgb2YgY291cnNlCisJKiBleHQvdm9yYmlzL01ha2VmaWxlLmFtOgorCSogZXh0L3ZvcmJpcy92b3JiaXNkZWMuYzoKKwkqIGV4dC92b3JiaXMvdm9yYmlzZGVjLmg6CisJICBhZGQgdm9yYmlzZGVjIHJhdyB2b3JiaXMgZGVjb2RlcgorCSogZXh0L3ZvcmJpcy92b3JiaXMuYzogKHBsdWdpbl9pbml0KToKKwkgIHJlZ2lzdGVyIHZvcmJpc2RlYyBhcyBQUklNQVJZLCB2b3JiaXNmaWxlIGFzIFNFQ09OREFSWQorCSogZ3N0L2ludGZsb2F0L01ha2VmaWxlLmFtOgorCSogZ3N0L2ludGZsb2F0L2Zsb2F0MjJpbnQuYzoKKwkqIGdzdC9pbnRmbG9hdC9mbG9hdDIyaW50Lmg6CisJKiBnc3QvaW50ZmxvYXQvZ3N0aW50ZmxvYXRjb252ZXJ0LmM6IChwbHVnaW5faW5pdCk6CisJICBhZGQgZmxvYXQyaW50bmV3IHBsdWdpbi4gSXQgY29udmVydHMgbXVsdGljaGFubmVsIGludGVybGVhdmVkIGZsb2F0IHRvCisJICBtdWx0aWNoYW5uZWwgaW50ZXJsZWF2ZWQgaW50LiBUaGUgbmFtZSBzaG91bGQgcHJvYmFibHkgYmUgY2hhbmdlZC4KKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAodGhlb3JhX3R5cGVfZmluZCksCisJKHBsdWdpbl9pbml0KToKKwkgIGFkZCB0eXBlZmluZGluZyBmb3IgcmF3IHRoZW9yYSB2aWRlbyBzbyBvZ2dkZW11eCBjYW4gZGV0ZWN0IGl0LgorCisyMDA0LTAxLTI4ICBKdWxpZW4gTU9VVFRFICA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9wbGF5L2dzdHBsYXkuYzogKGdzdF9wbGF5X3NlZWtfdG9fdGltZSk6IHNlZWsgb24gdmlkZW8KKwlzaW5rIGVsZW1lbnQgZmlyc3QuCisJKiBnc3QvdmlkZW9zY2FsZS9nc3R2aWRlb3NjYWxlLmM6CisJKGdzdF92aWRlb3NjYWxlX2hhbmRsZV9zcmNfZXZlbnQpOiBGaXhpbmcgc3JjIGV2ZW50IGhhbmRsZXIuCisKKzIwMDQtMDEtMjggIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX2NsYXNzX2luaXQpLCAoZ3N0X3Y0bHNyY19pbml0KSwKKwkoZ3N0X3Y0bHNyY19vcGVuKSwgKGdzdF92NGxzcmNfY2xvc2UpLAorCShnc3RfdjRsc3JjX3BhbGV0dGVfdG9fY2FwcyksIChnc3RfdjRsc3JjX3NyY2Nvbm5lY3QpLAorCShnc3RfdjRsc3JjX2dldGNhcHMpLCAoZ3N0X3Y0bHNyY19zZXRfY2xvY2spOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuaDoKKwkqIHN5cy92NGwvdjRsc3JjX2NhbGxzLmM6IChnc3RfdjRsc3JjX2NhcHR1cmVfc3RhcnQpLAorCShnc3RfdjRsc3JjX2dyYWJfZnJhbWUpLCAoZ3N0X3Y0bHNyY19jYXB0dXJlX3N0b3ApOgorCSAgSW1wbGVtZW50IHJlc2l6aW5nLi4uIEhhY2suIEJ1dCB0aGF0J3Mgd2h5IHY0bCBpcyBiMHJrZWQuLi4KKworMjAwNC0wMS0yOCAgSnVsaWVuIE1PVVRURSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfY2hlY2tfeHNobV9jYWxscyksCisJKGdzdF94aW1hZ2VzaW5rX3hpbWFnZV9uZXcpLCAoZ3N0X3hpbWFnZXNpbmtfeGltYWdlX2Rlc3Ryb3kpLAorCShnc3RfeGltYWdlc2lua194aW1hZ2VfcHV0KSwgKGdzdF94aW1hZ2VzaW5rX3h3aW5kb3dfbmV3KSwKKwkoZ3N0X3hpbWFnZXNpbmtfeHdpbmRvd19kZXN0cm95KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfY2hlY2tfeHNobV9jYWxscyksCisJKGdzdF94dmltYWdlc2lua194dmltYWdlX25ldyksIChnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9kZXN0cm95KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3h3aW5kb3dfbmV3KSwgKGdzdF94dmltYWdlc2lua194d2luZG93X2Rlc3Ryb3kpLAorCShnc3RfeHZpbWFnZXNpbmtfeHdpbmRvd19yZXNpemUpLCAoZ3N0X3h2aW1hZ2VzaW5rX2dldF94dl9zdXBwb3J0KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3hjb250ZXh0X2dldCk6IFJlbW92aW5nIHNvbWUgdXNlbGVzcyBkZWJ1Z3MgbWVzc2FnZXMsCisJY29ycmVjdGx5IGNsZWFuaW5nIHRoZSBpbWFnZSBjcmVhdGVkIHRvIGNoZWNrIHhzaG0gY2FsbHMgb24gc3VjY2VzLAorCWFkZGVkIGEgbG90IG9mIFhTeW5jIGNhbGxzIGluIFgxMSBmdW5jdGlvbnMsIGFuZCBmaXhlZCBhIHNlZ2ZhdWx0IHdoZW4KKwlubyBpbWFnZSBmb3JtYXQgd2FzIGRlZmluZWQgYmVmb3JlIG5lZ290aWF0aW9uIGhhcHBlbmVkLgorCisyMDA0LTAxLTI4ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX3F1ZXJ5X2Z1bmMpOgorCSAgdXNlIGdzdF9lbGVtZW50X2dldF90aW1lIHRvIGdldCBjb3JyZWN0IHRpbWUKKworMjAwNC0wMS0yOCAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2hhbmRsZV94ZXJyb3IpLAorCShnc3RfeGltYWdlc2lua19jaGVja194c2htX2NhbGxzKSwgKGdzdF94aW1hZ2VzaW5rX3hpbWFnZV9kZXN0cm95KSwKKwkoZ3N0X3hpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwgKGdzdF94aW1hZ2VzaW5rX2NsYXNzX2luaXQpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19oYW5kbGVfeGVycm9yKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NoZWNrX3hzaG1fY2FsbHMpLAorCShnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9kZXN0cm95KSwgKGdzdF94dmltYWdlc2lua194Y29udGV4dF9nZXQpOiBPdXIKKwlYIHBsdWdpbnMgYXJlIG5vdyBhYmxlIHRvIGRldGVjdCB0aGF0IFhTaG0gY2FsbHMgd2lsbCBmYWlsIGV2ZW4gaWYgdGhlCisJc2VydmVyIGNsYWltcyB0aGF0IGl0IGhhcyBYU2htIHN1cHBvcnQgKHJlbW90ZSBkaXNwbGF5cyBtb3N0IG9mIHRoZQorCXRpbWUpLiBXZSB0aGVuIGxvZyB0aGUgZXJyb3IgYXMgYSBHU1RfREVCVUcgYW5kIHNldCB1c2Vfc2htIHRvIEZBTFNFCisJc28gdGhhdCB3ZSB1c2Ugbm9uIFhTaG0gZnVuY3Rpb25zLiBUaGlzIGZlYXR1cmUgaXMgYWxtb3N0IHVzZWxlc3MgZm9yCisJeHZpbWFnZXNpbmsgYXMgWHYgaXMgbm90IHN1cHBvcnRlZCBvbiByZW1vdGUgZGlzcGxheXMgYW55d2F5LCBidXQKKwlpdCBtaWdodCBoYXBwZW4gdGhhbiBldmVuIG9uIHRoZSBsb2NhbCBkaXNwbGF5IFhTaG0gY2FsbHMgZmFpbC4KKworMjAwNC0wMS0yNyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZXNkL2VzZHNpbmsuYzogKGdzdF9lc2RzaW5rX2NsYXNzX2luaXQpLCAoZ3N0X2VzZHNpbmtfaW5pdCksCisJKGdzdF9lc2RzaW5rX2xpbmspLCAoZ3N0X2VzZHNpbmtfZ2V0X3RpbWUpLCAoZ3N0X2VzZHNpbmtfY2hhaW4pLAorCShnc3RfZXNkc2lua19jaGFuZ2Vfc3RhdGUpOiAgRml4IHN5bmMgaXNzdWVzIGluIGVzZHNpbmsuICBBbHNvCisJY2hhbmdlZCBlc2RzaW5rIHRvIG9ubHkgdXNlIDQ0MTAwLDE2LDIsIHNpbmNlIGVzZCBzdWNrcyBhdCByYXRlCisJY29udmVyc2lvbiBhbmQgZXNkc2luayBoYXMgaGFkIGRpZmZpY3VsdHkgbmVnb3RpYXRpbmcuCisKKzIwMDQtMDEtMjcgIEp1bGllbiBNT1VUVEUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcGxheS9nc3RwbGF5LmM6IChnc3RfcGxheV90aWNrX2NhbGxiYWNrKSwKKwkoZ3N0X3BsYXlfc2Vla190b190aW1lKTogRml4aW5nIHRoZSB3YXkgdG8gZ2V0IGN1cnJlbnQgcG9zaXRpb24uCisKKzIwMDQtMDEtMjcgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogc3lzL29zcy9nc3Rvc3NzaW5rLmM6IChnc3Rfb3Nzc2lua19zaW5rX3F1ZXJ5KToKKwkgIHVzZSBnc3RfZWxlbWVudF9nZXRfdGltZSB0byBnZXQgY29ycmVjdCB0aW1lCisKKzIwMDQtMDEtMjcgIEp1bGllbiBNT1VUVEUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcGxheS9nc3RwbGF5LmM6IChnc3RfcGxheV9zZXRfbG9jYXRpb24pOiBUaGUgZWFzaWVzdAorCWZpeCBldmVyLi4uIEludmVydGluZyAyIGxpbmVzIG9mIGNvZGUgbWFrZSBzcGlkZXIgYXV0b3BsdWcgY29ycmVjdGx5CisJdGFnZ2VkIG1wMyAhCisKKzIwMDQtMDEtMjcgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKGdzdF9hdWRpb19jb252ZXJ0X2xpbmspOgorCVVzZSBnc3RfcGFkX3RyeV9zZXRfY2Fwc19ub25maXhlZCgpLgorCisyMDA0LTAxLTI3ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC9hYzNwYXJzZS9nc3RhYzNwYXJzZS5jOiB1cGRhdGUgdG8gY2hlY2tsaXN0IDUKKwkqIGdzdC9hZGRlci9nc3RhZGRlci5jOiByZXdyaXRlIG5lZ290aWF0aW9uLiAgdXBkYXRlIHRvIGNoZWNrbGlzdCA1CisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiB1cGRhdGUgdG8gY2hlY2tsaXN0IDUKKwkqIGdzdC9hdWRpb3NjYWxlL2dzdGF1ZGlvc2NhbGUuYzogc2FtZQorCSogZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jOiBzYW1lCisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4LmM6IHNhbWUKKworMjAwNC0wMS0yNyAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQpOgorCSAgc3RvcCBwcm9jZXNzaW5nIGFmdGVyIEVPUworCisyMDA0LTAxLTI3ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC9hc2ZkZW11eC9hc2ZoZWFkZXJzLmg6CisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzoKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZtdXguYzogKGdzdF9hc2ZtdXhfcHV0X2d1aWQpLAorCShnc3RfYXNmbXV4X3B1dF9zdHJpbmcpLCAoZ3N0X2FzZm11eF9wdXRfd2F2X2hlYWRlciksCisJKGdzdF9hc2ZtdXhfcHV0X3ZpZF9oZWFkZXIpLCAoZ3N0X2FzZm11eF9wdXRfYm1wX2hlYWRlcik6CisJICBsb3QncyBvZiBmaXhlcyB0byBtYWtlIGRhdGEgZXh0cmFjdGlvbiBzaW1wbGVyIGFuZCBnZXQgdGhlIGNvZGUKKwkgIGFyY2hpdGVjdHVyZSBhbmQgY29tcGlsZXIgaW5kZXBlbmRhbnQuIEFkZCBkZWJ1Z2dpbmcgY2F0ZWdvcnkKKwkqIGdzdC9nb29tL2dzdGdvb20uYzogKGdzdF9nb29tX2NoYW5nZV9zdGF0ZSk6CisJICByZXNldCBjaGFubmVsIGNvdW50IG9uIFBBVVNFRD0+UkVBRFksIG5vdCBSRUFEWT0+UEFVU0VECisKKzIwMDQtMDEtMjYgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3NyYy5jIChnc3RfZ25vbWV2ZnNzcmNfZ2V0KTogUmVtb3ZlIHVnbHkKKwljb2RlIHRvIHB1bGwgYSBiaWdnZXIgYnVmZmVyIGluIGlyYWRpbyBtb2RlLiAgVGhpcyBhcyBhIHNpZGUgZWZmZWN0CisJbWFrZXMgdHlwZWZpbmRpbmcgd29yay4KKworMjAwNC0wMS0yNiAgSmVyZW15IFNpbW9uICA8amVzaW1vbkBsaWJlcnR5c3VyZi5mcj4KKworCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdjb2RlY21hcC5jOiAoZ3N0X2ZmbXBlZ19jYXBzX3RvX2V4dHJhZGF0YSk6CisJRml4IFNWUTMgZGVjb2Rpbmcgb24gUFBDCisKKzIwMDQtMDEtMjYgIEp1bGllbiBNT1VUVEUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBnc3QvdmlkZW9zY2FsZS9nc3R2aWRlb3NjYWxlLmM6IChnc3RfdmlkZW9zY2FsZV9jaGFpbik6IER1bm5vIGhvdworCXRoYXQgb25lIG1hbmFnZWQgdG8gc3RheSB0aGVyZS4uLiBGaXhlZC4KKworMjAwNC0wMS0yNiAgSmVyZW15IFNpbW9uICA8amVzaW1vbkBsaWJlcnR5c3VyZi5mcj4KKworCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdjb2RlY21hcC5jOiAoZ3N0X2ZmbXBlZ19jb2RlY2lkX3RvX2NhcHMpLAorCShnc3RfZmZtcGVnX2NhcHNfdG9fZXh0cmFkYXRhKSwgKGdzdF9mZm1wZWdfY2Fwc190b19waXhmbXQpOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocGx1Z2luX2luaXQpLCAocXRkZW11eF9wYXJzZV90cmFrKSwKKwkocXRkZW11eF92aWRlb19jYXBzKToKKwkqIGdzdC9xdGRlbXV4L3F0ZGVtdXguaDoKKwlBZGQgU1ZRMyBzcGVjaWZpYyBmbGFncyB0byBxdGRlbXV4IGFuZCBmZm1wZWcKKworMjAwNC0wMS0yNiAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBnc3QtbGlicy9nc3QvYXVkaW8vYXVkaW8uaDoKKwkgIHJlbW92ZSBidWZmZXItZnJhbWVzIGZyb20gYXVkaW8gY2FwcworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzoKKwkgIGZpeCBwbHVnaW4gdG8gcmVhbGx5IHdvcmsuCisKKzIwMDQtMDEtMjUgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlci5jOgorCSogZ3N0LWxpYnMvZ3N0L3Byb3BlcnR5cHJvYmUvcHJvcGVydHlwcm9iZS5jOgorCSogZ3N0LWxpYnMvZ3N0L3R1bmVyL3R1bmVyLmM6IChnc3RfdHVuZXJfZmluZF9ub3JtX2J5X25hbWUpLAorCShnc3RfdHVuZXJfZmluZF9jaGFubmVsX2J5X25hbWUpOgorCSogZ3N0LWxpYnMvZ3N0L3R1bmVyL3R1bmVyLmg6CisJICBBZGQgZ3RrLWRvYyBzdHlsZSBjb21tZW50cy4gQWxzbyBmaXggYSBmdW5jdGlvbiBuYW1lLgorCisyMDA0LTAxLTI1ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6IChnc3RfZGl2eGRlY19pbml0KSwKKwkoZ3N0X2RpdnhkZWNfbmVnb3RpYXRlKToKKwkgIEZpeCBmb3IgbmV3IGNhcHNuZWdvIC0gYWxzbyBmaXhlcyBnc3QtcGxheWVyIHdpdGggZGl2eGRlYy4KKworMjAwNC0wMS0yNSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBnc3QtbGlicy9nc3QvcGxheS9nc3RwbGF5LmM6IChnc3RfcGxheV9waXBlbGluZV9zZXR1cCksCisJKGdzdF9wbGF5X2lkZW50aXR5X2hhbmRvZmYpLCAoZ3N0X3BsYXlfc2V0X2xvY2F0aW9uKSwKKwkoZ3N0X3BsYXlfc2V0X3Zpc3VhbGl6YXRpb24pLCAoZ3N0X3BsYXlfY29ubmVjdF92aXN1YWxpemF0aW9uKTogQW5vdGhlcgorCXRyeSBpbiB2aXN1YWxpemF0aW9uIGltcGxlbWVudGF0aW9uLiBTdGlsbCBoYXZlIGFuIGlzc3VlIHdpdGggc3dpdGNoCisJYmxvY2tpbmcgd2hlbiBwdWxsaW5nIGZyb20gdmlkZW9fcXVldWUgYW5kIG9ubHkgYXVkaW8gY29tZXMgb3V0IG9mCisJc3BpZGVyLgorCSogZ3N0L3N3aXRjaC9nc3Rzd2l0Y2guYzogKGdzdF9zd2l0Y2hfcmVsZWFzZV9wYWQpLAorCShnc3Rfc3dpdGNoX3BvbGxfc2lua3BhZHMpLCAoZ3N0X3N3aXRjaF9jbGFzc19pbml0KTogSW1wbGVtZW50aW5nIHBhZAorCXJlbGVhc2UgbWV0aG9kLiBBbmQgY2hlY2sgaWYgdGhlIHBhZCBpcyB1c2FibGUgYmVmb3JlIHB1bGxpbmcuCisKKzIwMDQtMDEtMjUgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzogKGdzdF92aWRlb2JhbGFuY2VfZGlzcG9zZSksCisJKGdzdF92aWRlb2JhbGFuY2VfaW5pdCksCisJKGdzdF92aWRlb2JhbGFuY2VfY29sb3JiYWxhbmNlX2xpc3RfY2hhbm5lbHMpLAorCShnc3RfdmlkZW9iYWxhbmNlX2NvbG9yYmFsYW5jZV9zZXRfdmFsdWUpLAorCShnc3RfdmlkZW9iYWxhbmNlX2NvbG9yYmFsYW5jZV9nZXRfdmFsdWUpLAorCShnc3RfdmlkZW9iYWxhbmNlX3VwZGF0ZV9wcm9wZXJ0aWVzKSwKKwkoZ3N0X3ZpZGVvYmFsYW5jZV91cGRhdGVfdGFibGVzX3BsYW5hcjQxMSksCisJKGdzdF92aWRlb2JhbGFuY2VfcGxhbmFyNDExKToKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuaDoKKwkgIEltcGxlbWVudCBsb29rdXAtdGFibGVzLiArLy0gMTB4IGZhc3Rlci4KKworMjAwNC0wMS0yNSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9zdHJlYW1fYXZpaCksCisJKGdzdF9hdmlfZGVtdXhfc3RyZWFtX29kbWwpLCAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5kZXgpOgorCSAgVGhlIGluZGV4IHJlYWRpbmcgd2FzIGJyb2tlbi4gVGhlIHJlc3Qgd29ya2VkIGZpbmUsIGJ1dCB0aGUgd2hvbGUKKwkgIGdvYWwgb2YgbXkgcmV3cml0ZSB3YXMgdG8gbWFrZSBhdmlkZW11eCByZWFkYWJsZSwgYW5kIHRoaXMgd2FzCisJICBub3QgYXQgYWxsIHJlYWRhYmxlLiBQbGVhc2UgdXNlIHR5cGVkIHZhcmlhYmxlcy4KKworMjAwNC0wMS0yNSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9yZWFkX2luZm8pOgorCSAgQWRkaXRpb25hbCBwYWQgdXNhYmlsaXR5IGNoZWNrLgorCSogZ3N0L21wZWcxdmlkZW9wYXJzZS9nc3RtcDF2aWRlb3BhcnNlLmM6IChnc3RfbXAxdmlkZW9wYXJzZV9pbml0KSwKKwkobXAxdmlkZW9wYXJzZV9maW5kX25leHRfZ29wKSwgKGdzdF9tcDF2aWRlb3BhcnNlX3RpbWVfY29kZSksCisJKGdzdF9tcDF2aWRlb3BhcnNlX3JlYWxfY2hhaW4pOgorCSAgRml4IE1QRUcgdmlkZW8gc3RyZWFtIHBhcnNpbmcuIFRoZSBvcmlnaW5hbCBwbHVnaW4gaGFkIHNldmVyYWwKKwkgIGlzc3VlcywgaW5jbHVkaW5nIG5vdCB0aW1lc3RhbXBpbmcgc3RyZWFtcyB3aGVyZSB0aGUgc291cmNlIHdhcworCSAgbm90IHRpbWVzdGFtcGVkICh0aGlzIGhhcHBlbnMgd2l0aCBQVFMgdmFsdWVzIGluIG1wZWcgc3lzdGVtCisJICBzdHJlYW1zLCBidXQgTVBFRyB2aWRlbyBpcyBhbHNvIGEgdmFsaWQgc3RyZWFtIG9uIGl0cyBvd24gc28KKwkgIHRoYXQgbmVlZHMgdGltZXN0YW1wcyB0b28pLiBXZSB1c2UgdGhlIGRpc3BsYXkgdGltZSBjb2RlIGZvciB0aGF0CisJICBmb3Igbm93LiBBbHNvLCBpZiBvbmUgaW5jb21pbmcgYnVmZmVyIGNvbnRhaW5zIG11bHRpcGxlIHZhbGlkCisJICBmcmFtZXMsIHdlIHB1c2ggdGhlbSBhbGwgb24gY29ycmVjdGx5IG5vdywgaW5jbHVkaW5nIHByb3BlciBFT1MKKwkgIGhhbmRsaW5nLiBMYXN0bHksIHNldmVyYWwgcG90ZW50aWFsIHNlZ2ZhdWx0cyB3ZXJlIGZpeGVkLCBhbmQgd2UKKwkgIHByb3Blcmx5IHN5bmMgb24gbmV3IHNlcXVlbmNlL2dvcCBoZWFkZXJzIHRvIGluY2x1ZGUgdGhlbSBpbiBuZXh0LAorCSAgbm90IHByZXZpb3VzIGZyYW1lcyAoc2luY2UgdGhleSdyZSBoZWFkZXIgZm9yIHRoZSBuZXh0IGZyYW1lLCBub3QKKwkgIHRoZSBwcmV2aW91cykuIEFsc28gc2VlICMxMTkyMDYuCisJKiBnc3QvbXBlZ2F1ZGlvcGFyc2UvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzogKGdzdF9tcDNwYXJzZV9jaGFpbiksCisJKGJwZl9mcm9tX2hlYWRlcik6CisJICBNb3ZlIGNhcHMgc2V0dGluZyBzbyB3ZSBvbmx5IGRvIGl0IGFmdGVyIGZpbmRpbmcgc2V2ZXJhbCB2YWxpZAorCSAgTVBFRy0xIGZyYWVzIHNlcXVlbnRpYWxseSwgbm90IHJpZ2h0IGFmdGVyIHRoZSBmaXJzdCBvbmUgKHdoaWNoCisJICBtaWdodCBiZSBjb2luY2lkZW50YWwpLgorCSogZ3N0L3R5cGVmaW5kL2dzdHR5cGVmaW5kZnVuY3Rpb25zLmM6IChtcGVnMV9zeXNfdHlwZV9maW5kKSwKKwkobXBlZ192aWRlb190eXBlX2ZpbmQpLCAobXBlZ192aWRlb19zdHJlYW1fdHlwZV9maW5kKSwKKwkocGx1Z2luX2luaXQpOgorCSAgQWRkIHVuc3luY2VkIE1QRUcgdmlkZW8gc3RyZWFtIHR5cGVmaW5kaW5nLCBhbmQgY2hhbmdlIHNvbWUKKwkgIHByb2JhYmlsaXR5IHZhbHVlcyBzbyB3ZSBkZXRlY3Qgc3RyZWFtcyByaWdodGx5LiBUaGUgaWRlYSBpcyBhcworCSAgZm9sbG93czogSSBjYW4gaGF2ZSBhbiB1bnN5bmNlZCBzeXN0ZW0gc3RyZWFtIHdoaWNoIGNvbnRhaW5zCisJICB2aWRlby4gSW4gdGhlIGN1cnJlbnQgY29kZSwgSSB3b3VsZCByYW5kb21seSBnZXQgYSB0eXBlIGZvciBlaXRoZXIKKwkgIHN5c3RlbSBvciB2aWRlbyBzdHJlYW0gdHlwZSBmb3VuZCwgYmVjYXVzZSB0aGUgcHJvYmFiaWxpdGllcyBhcmUKKwkgIGJlaW5nIGNhbGN1bGF0ZWQgcmF0aGVyIHJhbmRvbWx5LiBJIG5vdyB1c2UgZml4ZWQgdmFsdWVzLCBzbyB3ZQorCSAgYWx3YXlzIHByZWZlciBzeXN0ZW0gc3RyZWFtIGlmIHRoYXQgd2FzIGZvdW5kIChhbmQgdGhhdCBpcyBob3cgaXQKKwkgIHNob3VsZCBiZSkuIElmIG5vIHN5c3RlbSBzdHJlYW0gd2FzIGZvdW5kLCB3ZSBjYW4gc3RpbGwgaWRlbnRpdHkJCSAgdGhlIHN0cmVhbSBhcyB2aWRlby1vbmx5LgorCisyMDA0LTAxLTIzICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC9hdmkvZ3N0YXZpZGVtdXguYzogKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2F2aWgpLAorCShnc3RfYXZpX2RlbXV4X3N0cmVhbV9vZG1sKSwgKGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4KToKKwkgIGRvbid0IHdyaXRlIHRvIGJ1ZmZlci4gRXh0cmFjdCBkYXRhIHdpdGhvdXQgdGhlIG5lZWQgb2YKKwkgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCisyMDA0LTAxLTIzICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKG1wZWcxX3BhcnNlX2hlYWRlciksCisJKG1wZWcxX3N5c190eXBlX2ZpbmQpOgorCSAgRml4IE1QRUctMSBzdHJlYW0gdHlwZWZpbmRpbmcuCisKKzIwMDQtMDEtMjMgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOiAobXBlZzJfc3lzX3R5cGVfZmluZCk6CisJICBGaXggdHlwZWZpbmRpbmcgZm9yIE1QRUctMSBzeXN0ZW0gc3RyZWFtcywgc2ltaWxhciB0byBNUEVHLTIuCisKKzIwMDQtMDEtMjMgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfb3Blbl9hdWRpbyk6CisJKiBleHQvZXNkL2dzdGVzZC5jOiAocGx1Z2luX2luaXQpOgorICAgICAgICAgIHByaXZhdGUgZGVidWdnaW5nLCBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nCisKKzIwMDQtMDEtMjMgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5jOiAoZ3N0X3JpZmZfcmVhZF9jbGFzc19pbml0KSwKKwkoZ3N0X3JpZmZfcmVhZF9pbml0KSwgKGdzdF9yaWZmX3JlYWRfY2hhbmdlX3N0YXRlKToKKwkqIGdzdC1saWJzL2dzdC9yaWZmL3JpZmYtcmVhZC5oOgorCSAgUmVtb3ZlIHN0dWZmIGZyb21vbGQgbWV0YWRhdGEgc3lzdGVtLgorCisyMDA0LTAxLTIzICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvb2dnL2dzdG9nZ2RlbXV4LmM6CisJICBGaXggd3JvbmcgZmlsZSBjb21tZW50LgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9yZWFkX2luZm8pOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyKToKKwkgIEFkZCBtZXRhZGF0YSByZWFkaW5nIHByb3Blcmx5LgorCisyMDA0LTAxLTIzICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvTWFrZWZpbGUuYW06CisgICAgICAgICAgRml4IG5hcyBESVNUX1NVQkRJUlMKKyAgICAgICAgICBVcmFldXM6CisgICAgICAgICAgRml4IGJ1ZyB3aGVyZSBtYWtlIGRpc3RjaGVjayBkb2Vzbid0IGdldCBydW4gb24gYWRkaW5nIHN0dWZmIHRvCisgICAgICAgICAgdGhlIGJ1aWxkLgorCisyMDA0LTAxLTIzICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6IChnc3RfZGl2eGRlY19pbml0KSwgKGdzdF9kaXZ4ZGVjX3NldHVwKToKKwkqIGV4dC9kaXZ4L2dzdGRpdnhkZWMuaDoKKwkgIEZpeCBkaXZ4MyAoIm1zbXBlZzQiKSBwbGF5YmFjayB1c2luZyBkaXZ4ZGVjLgorCisyMDA0LTAxLTIzICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC90eXBlZmluZC9nc3R0eXBlZmluZGZ1bmN0aW9ucy5jOgorCShtcDNfdHlwZV9mcmFtZV9sZW5ndGhfZnJvbV9oZWFkZXIpOiBmaXggYnVnIGluIGxlbmd0aCBjb21wdXRhdGlvbgorCShtcDNfdHlwZV9maW5kKTogaW1wcm92ZSBkZWJ1Z2dpbmcgb3V0cHV0CisKKzIwMDQtMDEtMjMgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3BsYXkvZ3N0cGxheS5jOiAoZ3N0X3BsYXlfcGlwZWxpbmVfc2V0dXApLAorCShnc3RfcGxheV9zZXRfbG9jYXRpb24pLCAoZ3N0X3BsYXlfc2Vla190b190aW1lKSwKKwkoZ3N0X3BsYXlfc2V0X2F1ZGlvX3NpbmspLCAoZ3N0X3BsYXlfc2V0X3Zpc3VhbGl6YXRpb24pLAorCShnc3RfcGxheV9jb25uZWN0X3Zpc3VhbGl6YXRpb24pLCAoZ3N0X3BsYXlfZ2V0X3NpbmtfZWxlbWVudCk6IFJld29ya2VkCisJdGhlIHBpcGVsaW5lIGZyb20gc2NyYXRjaC4gVmlzdWFsaXphdGlvbiBpcyBiYWNrIGFuZCBzd2l0Y2ggd2VudCBvdXQgYXMKKwlpIHJlYWxpemVkIGl0IHdhcyBub3QgcG9zc2libGUgdG8gdXNlIHRoZSB3YXkgaSB3YW50ZWQuCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2ltYWdlcG9vbF9jbGVhciksCisJKGdzdF94aW1hZ2VzaW5rX2NoYW5nZV9zdGF0ZSksIChnc3RfeGltYWdlc2lua19kaXNwb3NlKTogTW92ZSB4Y29udGV4dAorCWNsZWFyaW5nIGluIHN0YXRlIGNoYW5nZSBmcm9tIFJFQURZIHRvIE5VTEwuIFNvIHRoYXQgb25lIGNhbiBjbGVhbiB0aGUKKwlYIHJlc3NvdXJjZXMga2VlcGluZyB0aGUgZWxlbWVudC4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2ltYWdlcG9vbF9jbGVhciksIChnc3RfeHZpbWFnZXNpbmtfY2hhbmdlX3N0YXRlKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NvbG9yYmFsYW5jZV9zZXRfdmFsdWUpLAorCShnc3RfeHZpbWFnZXNpbmtfY29sb3JiYWxhbmNlX2dldF92YWx1ZSksCisJKGdzdF94dmltYWdlc2lua19zZXRfcHJvcGVydHkpLCAoZ3N0X3h2aW1hZ2VzaW5rX2Rpc3Bvc2UpLAorCShnc3RfeHZpbWFnZXNpbmtfaW5pdCk6IFNhbWUgeGNvbnRleHQgY2xlYW5pbmcgdGhhbiB4aW1hZ2VzaW5rIGluIHN0YXRlCisJY2hhbmdlIGZyb20gUkVBRFkgdG8gTlVMTCBhbmQgZml4ZWQgc29tZSBzdHVwaWQgYnVncyBpbiBjb2xvcmJhbGFuY2UKKwlnZXQvc2V0IHZhbHVlcy4gQWxzbyBhZGRlZCB0aGUgZm9sbG93aW5nIGZlYXR1cmUgOiB3aGVuIG5vYm9keSB0cmllcyB0bworCXNldCBzb21lIHZhbHVlcyB0byB0aGUgY29sb3JiYWxhbmNlIGxldmVscyBiZWZvcmUgdGhlIHhjb250ZXh0IGlzCisJZ3JhYmJlZCwgdGhlbiB3aGVuIGNyZWF0aW5nIGNoYW5uZWxzIGxpc3QgZnJvbSBYdiBhdHRyaWJ1dGVzIHdlIHNldCB0aGUKKwlpbnRlcm5hbCB2YWx1ZXMgdG8gdGhlIFh2IGRlZmF1bHRzLiBUaGlzIHdheSB3ZSBoYW5kbGUgYnVnZ3kgWHYgZHJpdmVycworCXRoYXQgc2V0IGRlZmF1bHQgaHVlIHZhbHVlcyBmYXIgZnJvbSB0aGUgbWlkZGxlIG9mIHRoZSByYW5nZSAoVGhhbmtzCisJdG8gSm9uIFRyb3dicmlkZ2UgZm9yIHBvaW50aW5nIHRoYXQgaXNzdWUpLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuaDogQWRkaW5nIGEgY2JfY2hhbmdlZCBib29sZWFuIHRvIGtub3cgaWYKKwljb2xvcmJhbGFuY2UgbGV2ZWxzIGhhdmUgYmVlbiBzZXQgYmVmb3JlIHhjb250ZXh0IGlzIGdyYWJiZWQuCisKKzIwMDQtMDEtMjIgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiAoZ3N0X29zc2VsZW1lbnRfY2xhc3NfcHJvYmVfZGV2aWNlcyk6CisJICBGaXggdGhlIG9zc21peGVyIGNhc2Ugd2hlcmUgd2Ugc2hvdWxkbid0IG9wZW4gL2Rldi9kc3AqIGJlY2F1c2UKKwkgIGl0IG1pZ2h0IGJsb2NrIG9wZXJhdGlvbnMgKHdoaWNoIGlzIGJhZCBmb3IgYSBtaXhlcikuCisKKzIwMDQtMDEtMjIgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8tcHJpdi5jOiAoaGF2ZV90eXBlX2NhbGxiYWNrKSwKKwkoZGVlcF9ub3RpZnlfY2FsbGJhY2spLCAoZ21pX3NldF9kZWNvZGVyKSwgKGdtaV9jbGVhcl9kZWNvZGVyKSwKKwkoZ21pcF9maW5kX3R5cGVfcHJlKToKKwkqIGdzdC1saWJzL2dzdC9tZWRpYS1pbmZvL21lZGlhLWluZm8tcHJpdi5oOgorCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby5jOgorCShnc3RfbWVkaWFfaW5mb19pbnN0YW5jZV9pbml0KSwgKGdzdF9tZWRpYV9pbmZvX3JlYWRfaWRsZXIpOgorICAgICAgICBhZGQgZmFrZXNpbmsgdG8gZ2V0IGNhcHMgb24gZGVjb2RlciBzcmMgcGFkIGFnYWluCisgICAgICAgIGZpeCBjYWxsYmFjayBwcm90b3R5cGUgdG8gbWF0Y2ggbmV3IGhhdmVfdHlwZSBzaWduYWwgc2lnbmF0dXJlCisKKzIwMDQtMDEtMjIgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC9hZGRlci9nc3RhZGRlci5jOiAoZ3N0X2FkZGVyX2xpbmspOgorICAgICAgICAgIGZpeCBub24tY29tcGlsZSBhbmQgY3V0LW4tcGFzdGUgY29kZQorCisyMDA0LTAxLTIxICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9zd2ZkZWMvZ3N0c3dmZGVjLmM6IChnc3Rfc3dmZGVjX3ZpZGVvX2dldGNhcHMpLAorCShnc3Rfc3dmZGVjX3ZpZGVvX2xpbmspLCAoY29weV9pbWFnZSksIChnc3Rfc3dmZGVjX2xvb3ApLAorCShnc3Rfc3dmZGVjX2luaXQpLCAoZ3N0X3N3ZmRlY19jaGFuZ2Vfc3RhdGUpOgorCSogZXh0L3N3ZmRlYy9nc3Rzd2ZkZWMuaDoKKwlGaXggbmVnb3RpYXRpb24uCisJKiBnc3QvYWRkZXIvZ3N0YWRkZXIuYzogKGdzdF9hZGRlcl9saW5rKSwgKGdzdF9hZGRlcl9pbml0KSwKKwkoZ3N0X2FkZGVyX3JlcXVlc3RfbmV3X3BhZCk6IEZpeCBuZWdvdGlhdGlvbi4KKwkqIGdzdC9nb29tL2dzdGdvb20uYzogKGdzdF9nb29tX2luaXQpLCAoZ3N0X2dvb21fc3JjX2ZpeGF0ZSk6CisJQWRkIGEgZml4YXRlIGZ1bmN0aW9uLgorCSogZ3N0L2ludGZsb2F0L2dzdGZsb2F0MmludC5jOgorCSogZ3N0L2ludGZsb2F0L2dzdGZsb2F0MmludC5oOgorCSogZ3N0L2ludGZsb2F0L2dzdGludDJmbG9hdC5jOgorCSogZ3N0L2ludGZsb2F0L2dzdGludDJmbG9hdC5oOgorCUNvbXBsZXRlbHkgcmV3cml0ZSB0aGUgbmVnb3RpYXRpb24uICBEb2Vzbid0IHF1aXRlIHdvcmsgeWV0LAorCWR1ZSB0byBzb21lIGJ1ZmZlci1mcmFtZXMgcHJvYmxlbS4KKworMjAwNC0wMS0yMSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc3JjLmM6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisgICAgICAgICAgZml4IGluY2x1ZGVzIGZvciBkaXN0Y2hlY2sKKworMjAwNC0wMS0yMSAgQ2hyaXN0aWFuIFNjaGFsbGVyIDx1cmFldXNAZ25vbWUub3JnPgorCisJKiBleHQvbmFzLworCUFkZCBsaWJuYXMgKG5ldHdvcmsgYXVkaW8gc3lzdGVtKSBwbHVnaW4sIHBhdGNoIGZyb20gQXJ3ZWQgdm9uIE1lcmthdHoKKwliYXNlZCBvbiBlYXJsaWVyIHBhdGNoIGZyb20gTGF1cmVudCBWaXZpZXIKKworMjAwNC0wMS0yMCAgSmVyZW15IFNpbW9uICA8amVzaW1vbkBsaWJlcnR5c3VyZi5mcj4KKworCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdjb2RlY21hcC5jOiAoZ3N0X2ZmbXBlZ19jYXBzX3RvX2V4dHJhZGF0YSk6CisJRml4IHdtYSBjYXBzIHByb3BlcnR5CisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfYXVkaW9fY2Fwcyk6CisJRml4IHR5cG8gKGZsYWdzMSBhbmQgZmxhZ3MyKQorCisyMDA0LTAxLTIwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLXByaXYuYzoKKwkoZGVlcF9ub3RpZnlfY2FsbGJhY2spLCAoZ21pX3NlZWtfdG9fdHJhY2spLCAoZ21pX2dldF9kZWNvZGVyKSwKKwkoZ21pcF9maW5kX3R5cGVfcHJlKSwgKGdtaXBfZmluZF90eXBlKSwgKGdtaXBfZmluZF9zdHJlYW1fcG9zdCksCisJKGdtaXBfZmluZF9zdHJlYW0pLCAoZ21pcF9maW5kX3RyYWNrX21ldGFkYXRhKSwKKwkoZ21pcF9maW5kX3RyYWNrX3N0cmVhbWluZm9fcG9zdCksIChnbWlwX2ZpbmRfdHJhY2tfc3RyZWFtaW5mbyksCisJKGdtaXBfZmluZF90cmFja19mb3JtYXQpOgorCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby1wcml2Lmg6CisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLXRlc3QuYzogKG1haW4pOgorCSogZ3N0LWxpYnMvZ3N0L21lZGlhLWluZm8vbWVkaWEtaW5mby5jOiAoZ3N0X21lZGlhX2luZm9faW5pdCksCisJKGdzdF9tZWRpYV9pbmZvX3JlYWRfaWRsZXIpLCAoZ3N0X21lZGlhX2luZm9fcmVhZCk6CisJKiBnc3QtbGlicy9nc3QvbWVkaWEtaW5mby9tZWRpYS1pbmZvLmg6CisgICAgICAgICAgcmVnaXN0ZXIgZGVidWdnaW5nIGNhdGVnb3J5IGFuZCB1c2UgaXQgZm9yIGRlYnVnZ2luZworCisyMDA0LTAxLTIwICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleHQvdm9yYmlzL3ZvcmJpc2ZpbGUuYzogKGdzdF92b3JiaXNmaWxlX3VwZGF0ZV9zdHJlYW1pbmZvKSwKKwkoZ3N0X3ZvcmJpc2ZpbGVfbmV3X2xpbmspOgorICAgICAgICAgIHNpZ25hbCBzdHJlYW1pbmZvIHRocm91Z2ggdGFncworCisyMDA0LTAxLTIwICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbXBsZXgvZ3N0bXBsZXguY2M6CisJKiBleHQvbXBsZXgvZ3N0bXBsZXhpYml0c3RyZWFtLmNjOgorCSAgZysrIGRvZXNuJ3QgbGlrZSBOVUxMIGluIG91ciBpMThuL2Vycm9yIG1hY3Jvcywgc2hvdWxkIGJlCisJICBlaXRoZXIgKE5VTEwpIG9yICgiIikuCisKKzIwMDQtMDEtMjAgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy9keHIzL2R4cjNhdWRpb3NpbmsuYzoKKwkqIHN5cy9keHIzL2R4cjNpbml0LmM6CisJKiBzeXMvZHhyMy9keHIzc3B1c2luay5jOiAoZHhyM3NwdXNpbmtfY2xvc2UpOgorCSogc3lzL2R4cjMvZHhyM3ZpZGVvc2luay5jOiAoZHhyM3ZpZGVvc2lua19jbG9zZSk6CisJICBGaXggbW9yZSBlcnJvciBlcnJvciBlcnJvciBlcnJvcnMgKG1pc3NpbmcgaW5jbHVkZXMgaGVyZSkuCisKKzIwMDQtMDEtMjAgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9tcGVnMmVuYy9nc3RtcGVnMmVuY3BpY3R1cmVyZWFkZXIuY2M6CisJICBmaXggdGhvbWFzJyBlcnJvciBlcnJvcnMuCisKKzIwMDQtMDEtMjAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9tcGVnMmVuYy9nc3RtcGVnMmVuYy5jYzoKKyAgICAgICAgICBmaXggZXJyb3IgZXJyb3JzLgorCisyMDA0LTAxLTIwICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6IChnc3RfZGl2eGRlY19zZXR1cCksIChnc3RfZGl2eGRlY19jaGFpbik6CisJKiBleHQvZGl2eC9nc3RkaXZ4ZW5jLmM6IChnc3RfZGl2eGVuY19zZXR1cCksIChnc3RfZGl2eGVuY19jaGFpbik6CisJICBGaXggZm9yIG5ldyBlcnJvciBzeXN0ZW0uCisKKzIwMDQtMDEtMjAgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGV4dC9kaXZ4L2dzdGRpdnhlbmMuYzogKGdzdF9kaXZ4ZW5jX3NldHVwKSwgKGdzdF9kaXZ4ZW5jX2NoYWluKToKKyAgICAgICAgICBmaXggZm9yIG5ldyBlcnJvciByZXBvcnRpbmcKKworMjAwNC0wMS0yMCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2hhbmRsZV94ZXZlbnRzKSwKKwkoZ3N0X3hpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwgKGdzdF94aW1hZ2VzaW5rX2dldGNhcHMpLAorCShnc3RfeGltYWdlc2lua19zZXRfeHdpbmRvd19pZCk6IENoYW5nZSB0byB1c2luZyBhIGZyYW1lcmF0ZQorCW9mIFsxLDEwMF0gaW5zdGVhZCBvZiBbMCxNQVhdLCBzaW5jZSAwIGlzbid0IGhhbmRsZWQgY29ycmVjdGx5LAorCWFuZCBuZWl0aGVyIGlzIDEwMCssIG1vc3QgbGlrZWx5LgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19nZXRfeHZfc3VwcG9ydCksCisJKGdzdF94dmltYWdlc2lua19nZXRjYXBzKTogc2FtZQorCisyMDA0LTAxLTE5ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIFVwIHZlcnNpb24gcmVxdWlyZW1lbnQgdG8gMi4wLjMgKG5vdCB5ZXQgcmVsZWFzZWQpIHRvIGF2b2lkIHN5bWJvbAorCSAgY2xhc2hlcyB3aXRoIGZmbXBlZy4KKworMjAwNC0wMS0yMCAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBnc3Qvc3dpdGNoL2dzdHN3aXRjaC5jOiAoZ3N0X3N3aXRjaF9yZXF1ZXN0X25ld19wYWQpLAorCShnc3Rfc3dpdGNoX2luaXQpOiBGaXhlZCBzd2l0Y2ggZWxlbWVudCA6IHByb3h5aW5nIGxpbmsgYW5kIHNldHRpbmcKKwljYXBzIGZyb20gc3JjIHRvIHNpbmsgb24gcmVxdWVzdC4KKworMjAwNC0wMS0xOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogc3lzL3Y0bC92NGwtb3ZlcmxheV9jYWxscy5jOiAoZ3N0X3Y0bF9zZXRfb3ZlcmxheSk6CisJKiBzeXMvdjRsMi92NGwyLW92ZXJsYXlfY2FsbHMuYzogKGdzdF92NGwyX3NldF9kaXNwbGF5KSwKKwkoZ3N0X3Y0bDJfc2V0X3dpbmRvdyksIChnc3RfdjRsMl9lbmFibGVfb3ZlcmxheSk6CisgICAgICAgIGZpeCBlbGVtZW50X2Vycm9yCisKKzIwMDQtMDEtMTkgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHN5cy92NGwvdjRsX2NhbGxzLmg6CisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmg6CisgICAgICAgICAgZWxlbWVudF9lcnJvciBmaXhlcworCisyMDA0LTAxLTE5ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBnc3QtbGlicy9nc3QvZ3N0LWkxOG4tcGx1Z2luLmg6CisgICAgICAgICAgYWRkIGxvY2FsZS5oCisgICAgICAgICAgcmVtb3ZlIGNvbmZpZy5oIGluY2x1c2lvbgorCisyMDA0LTAxLTE5ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBhdXRvZ2VuLnNoOgorICAgICAgICAgIGFkZGluZyBhdXRvcG9pbnQgaW52b2NhdGlvbgorCSogTWFrZWZpbGUuYW06CisJKiBjb25maWd1cmUuYWM6CisJKiBnc3QtbGlicy9nc3QvZ2V0dGV4dC5oOgorICAgICAgICAgIGFkZGluZyBnZXR0ZXh0IGJpdHMKKwkqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzaW5rLmM6IChnc3RfYWZzaW5rX3BsdWdpbl9pbml0KToKKwkqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzcmMuYzogKGdzdF9hZnNyY19wbHVnaW5faW5pdCk6CisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnMuYzogKHBsdWdpbl9pbml0KToKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3NpbmsuYzogKGdzdF9nbm9tZXZmc3Npbmtfb3Blbl9maWxlKSwKKwkoZ3N0X2dub21ldmZzc2lua19jbG9zZV9maWxlKToKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3NyYy5jOiAoZ3N0X2dub21ldmZzc3JjX29wZW5fZmlsZSk6CisJKiBleHQvc25kZmlsZS9nc3RzZi5jOiAoZ3N0X3NmX2xvb3ApLCAocGx1Z2luX2luaXQpOgorCSogZ3N0LWxpYnMvZ3N0L2dzdC1pMThuLXBsdWdpbi5oOgorCSogZ3N0L2F2aS9nc3RhdmkuYzogKHBsdWdpbl9pbml0KToKKwkqIHN5cy9keHIzL2R4cjNpbml0LmM6IChwbHVnaW5faW5pdCk6CisJKiBzeXMvZHhyMy9keHIzdmlkZW9zaW5rLmM6IChkeHIzdmlkZW9zaW5rX3dyaXRlX2RhdGEpOgorCSogc3lzL29zcy9nc3Rvc3NhdWRpby5jOiAocGx1Z2luX2luaXQpOgorCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50LmM6IChnc3Rfb3NzZWxlbWVudF9vcGVuX2F1ZGlvKToKKwkqIHN5cy92NGwvZ3N0djRsLmM6IChwbHVnaW5faW5pdCk6CisJKiBzeXMvdjRsL3Y0bF9jYWxscy5jOiAoZ3N0X3Y0bF9vcGVuKToKKwkqIHN5cy92NGwyL2dzdHY0bDIuYzogKHBsdWdpbl9pbml0KToKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogKGdzdF92NGwyX2dldF9jYXBhYmlsaXRpZXMpLAorCShnc3RfdjRsMl9maWxsX2xpc3RzKSwgKGdzdF92NGwyX2dldF9ub3JtKSwgKGdzdF92NGwyX3NldF9ub3JtKSwKKwkoZ3N0X3Y0bDJfZ2V0X2lucHV0KSwgKGdzdF92NGwyX3NldF9pbnB1dCksIChnc3RfdjRsMl9nZXRfb3V0cHV0KSwKKwkoZ3N0X3Y0bDJfc2V0X291dHB1dCksIChnc3RfdjRsMl9nZXRfZnJlcXVlbmN5KSwKKwkoZ3N0X3Y0bDJfc2V0X2ZyZXF1ZW5jeSksIChnc3RfdjRsMl9zaWduYWxfc3RyZW5ndGgpLAorCShnc3RfdjRsMl9nZXRfYXR0cmlidXRlKSwgKGdzdF92NGwyX3NldF9hdHRyaWJ1dGUpOgorCSAgbWFrZSBzdXJlIGxvY2FsZSBhbmQgdHJhbnNsYXRpb24gZG9tYWluIGFyZSBzZXQKKyAgICAgICAgICBmaXggdHJhbnNsYXRlZCBzdHJpbmdzCisJKiBwby8uY3ZzaWdub3JlOgorCSogcG8vTElOR1VBUzoKKwkqIHBvL01ha2V2YXJzOgorCSogcG8vUE9URklMRVMuaW46CisJKiBwby9ubC5wbzoKKyAgICAgICAgICBwdXQgdHJhbnNsYXRpb24gZmlsZXMgaW50byBwbGFjZQorCSogc3lzL3h2aWRlby9pbWFnZXRlc3QuYzogKG1haW4pOgorCSogZXh0L2R2L2RlbW8tcGxheS5jOiAobWFpbik6CisgICAgICAgICAgZml4IHVubmVjZXNzYXJ5IHRyYW5zbGF0aW9ucworCisyMDA0LTAxLTE5ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIChhdCkgYXBlc3RhYXJ0IChkb3QpIG9yZz4KKworCSogZXh0L3NuZGZpbGUvZ3N0c2YuYzoKKwkqIGdzdC9hdmkvZ3N0YXZpbXV4LmM6CisJKiBleHQvYXVkaW9maWxlL2dzdGFmc2luay5jOgorCSogZXh0L2F1ZGlvZmlsZS9nc3RhZnNyYy5jOgorCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc2luay5jOgorCSogZXh0L2dub21ldmZzL2dzdGdub21ldmZzc3JjLmM6CisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuYzoKKwkqIHN5cy92NGwvdjRsX2NhbGxzLmg6CisgICAgICAgICAgZml4IGkxOG4gaW5jbHVkZQorCisyMDA0LTAxLTE5ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBzeXMvdjRsMi92NGwyX2NhbGxzLmM6IChnc3RfdjRsMl9nZXRfY2FwYWJpbGl0aWVzKSwKKwkoZ3N0X3Y0bDJfZmlsbF9saXN0cyksIChnc3RfdjRsMl9vcGVuKSwgKGdzdF92NGwyX2dldF9ub3JtKSwKKwkoZ3N0X3Y0bDJfc2V0X25vcm0pLCAoZ3N0X3Y0bDJfZ2V0X2lucHV0KSwgKGdzdF92NGwyX3NldF9pbnB1dCksCisJKGdzdF92NGwyX2dldF9vdXRwdXQpLCAoZ3N0X3Y0bDJfc2V0X291dHB1dCksCisJKGdzdF92NGwyX2dldF9mcmVxdWVuY3kpLCAoZ3N0X3Y0bDJfc2V0X2ZyZXF1ZW5jeSksCisJKGdzdF92NGwyX3NpZ25hbF9zdHJlbmd0aCksIChnc3RfdjRsMl9nZXRfYXR0cmlidXRlKSwKKwkoZ3N0X3Y0bDJfc2V0X2F0dHJpYnV0ZSk6CisgICAgICAgIHVwZGF0ZSB0byBuZXcgZXJyb3IgaGFuZGxpbmcKKworMjAwNC0wMS0xOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZXh0L3NpZHBsYXkvZ3N0c2lkZGVjLmNjOgorCSogZ3N0L21vZHBsdWcvZ3N0bW9kcGx1Zy5jYzoKKyAgICAgICAgICBwYXJlbnRoZXNlIE5VTEwgYmVjYXVzZSBDKysgc2VlbXMgYW5ncnkgYWJvdXQgaXQKKworMjAwNC0wMS0xOSAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L2dzdC1pMThuLXBsdWdpbi5oOgorICAgICAgICAgIGFkZCBza2VsZXRvbiBpMThuIHN0dWZmLCBidXQgbmVlZHMgdG8gYmUgZnVydGhlciBpbXBsZW1lbnRlZAorCisyMDA0LTAxLTE4ICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlICA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorCisJKiBleGFtcGxlcy9nc3RwbGF5L3BsYXllci5jOiAobWFpbik6CisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6IChnc3RfYWFzaW5rX29wZW4pOgorCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfbGluayksIChnc3RfYWxzYV94cnVuX3JlY292ZXJ5KToKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2xvb3ApOgorCSogZXh0L2Fsc2EvZ3N0YWxzYXNyYy5jOiAoZ3N0X2Fsc2Ffc3JjX2xvb3ApOgorCSogZXh0L2F1ZGlvZmlsZS9nc3RhZnNpbmsuYzogKGdzdF9hZnNpbmtfb3Blbl9maWxlKSwKKwkoZ3N0X2Fmc2lua19jbG9zZV9maWxlKToKKwkqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzcmMuYzogKGdzdF9hZnNyY19vcGVuX2ZpbGUpLAorCShnc3RfYWZzcmNfY2xvc2VfZmlsZSk6CisJKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6IChnc3RfZGl2eGRlY19zZXR1cCksIChnc3RfZGl2eGRlY19jaGFpbik6CisJKiBleHQvZHYvZ3N0ZHZkZWMuYzogKGdzdF9kdmRlY19sb29wKToKKwkqIGV4dC9kdmRuYXYvZHZkbmF2c3JjLmM6IChkdmRuYXZzcmNfdXNlcl9vcCksIChkdmRuYXZzcmNfZ2V0KToKKwkqIGV4dC9lc2QvZXNkbW9uLmM6IChnc3RfZXNkbW9uX2dldCk6CisJKiBleHQvZXNkL2VzZHNpbmsuYzogKGdzdF9lc2RzaW5rX2NoYWluKToKKwkqIGV4dC9mYWFjL2dzdGZhYWMuYzogKGdzdF9mYWFjX2NoYWluKToKKwkqIGV4dC9mYWFkL2dzdGZhYWQuYzogKGdzdF9mYWFkX2NoYWluKToKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnZGVjLmM6IChnc3RfZmZtcGVnZGVjX2NoYWluKToKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnZGVtdXguYzogKGdzdF9mZm1wZWdkZW11eF9sb29wKToKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnbXV4LmM6IChnc3RfZmZtcGVnbXV4X2xvb3ApOgorCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNkZWNfZXJyb3JfY2FsbGJhY2spLAorCShnc3RfZmxhY2RlY19sb29wKToKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzogKGdzdF9mbGFjZW5jX2NoYWluKToKKwkqIGV4dC9mbGFjL2dzdGZsYWN0YWcuYzogKGdzdF9mbGFjX3RhZ19jaGFpbik6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKGdzdF9nZGtfcGl4YnVmX2NoYWluKToKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3NpbmsuYzogKGdzdF9nbm9tZXZmc3Npbmtfb3Blbl9maWxlKSwKKwkoZ3N0X2dub21ldmZzc2lua19jbG9zZV9maWxlKToKKwkqIGV4dC9nbm9tZXZmcy9nc3Rnbm9tZXZmc3NyYy5jOiAoYXVkaW9jYXN0X2luaXQpLAorCShnc3RfZ25vbWV2ZnNzcmNfb3Blbl9maWxlKToKKwkqIGV4dC9pdm9yYmlzL3ZvcmJpc2ZpbGUuYzogKGdzdF9pdm9yYmlzZmlsZV9sb29wKToKKwkqIGV4dC9sYW1lL2dzdGxhbWUuYzogKGdzdF9sYW1lX3NpbmtfbGluayksIChnc3RfbGFtZV9jaGFpbik6CisJKiBleHQvbGNzL2dzdGNvbG9yc3BhY2UuYzogKGdzdF9jb2xvcnNwYWNlX3NyY2Nvbm5lY3RfZnVuYyk6CisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfaGFuZGxlX2V2ZW50KSwKKwkoZ3N0X2lkM190YWdfZG9fdHlwZWZpbmQpLCAoZ3N0X2lkM190YWdfY2hhaW4pOgorCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfY2hhaW4pOgorCSogZXh0L21pa21vZC9nc3RtaWttb2QuYzogKGdzdF9taWttb2RfbG9vcCk6CisJKiBleHQvbXBlZzJkZWMvZ3N0bXBlZzJkZWMuYzoKKwkqIGV4dC9tcGVnMmVuYy9nc3RtcGVnMmVuYy5jYzoKKwkqIGV4dC9tcGVnMmVuYy9nc3RtcGVnMmVuY3BpY3R1cmVyZWFkZXIuY2M6CisJKiBleHQvbXBsZXgvZ3N0bXBsZXguY2M6CisJKiBleHQvbXBsZXgvZ3N0bXBsZXhpYml0c3RyZWFtLmNjOgorCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19kZW11eF9jaGFpbiksCisJKGdzdF9vZ2dfZGVtdXhfcHVzaCksIChnc3Rfb2dnX3BhZF9wdXNoKToKKwkqIGV4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jOgorCSogZXh0L3NkbC9zZGx2aWRlb3NpbmsuYzogKGdzdF9zZGx2aWRlb3NpbmtfbG9jayksCisJKGdzdF9zZGx2aWRlb3NpbmtfaW5pdHNkbCksIChnc3Rfc2RsdmlkZW9zaW5rX2NyZWF0ZSk6CisJKiBleHQvc2lkcGxheS9nc3RzaWRkZWMuY2M6CisJKiBleHQvc25kZmlsZS9nc3RzZi5jOiAoZ3N0X3NmX29wZW5fZmlsZSksIChnc3Rfc2ZfY2xvc2VfZmlsZSksCisJKGdzdF9zZl9sb29wKToKKwkqIGV4dC9zcGVleC9nc3RzcGVleGVuYy5jOiAoZ3N0X3NwZWV4ZW5jX2NoYWluKToKKwkqIGV4dC90YXJraW4vZ3N0dGFya2luZGVjLmM6IChnc3RfdGFya2luZGVjX2NoYWluKToKKwkqIGV4dC90YXJraW4vZ3N0dGFya2luZW5jLmM6IChnc3RfdGFya2luZW5jX2NoYWluKToKKwkqIGV4dC92b3JiaXMvdm9yYmlzZW5jLmM6IChnc3Rfdm9yYmlzZW5jX2NoYWluKToKKwkqIGV4dC92b3JiaXMvdm9yYmlzZmlsZS5jOiAoZ3N0X3ZvcmJpc2ZpbGVfbG9vcCk6CisJKiBleHQveHZpZC9nc3R4dmlkZGVjLmM6IChnc3RfeHZpZGRlY19zZXR1cCksIChnc3RfeHZpZGRlY19jaGFpbik6CisJKiBleHQveHZpZC9nc3R4dmlkZW5jLmM6IChnc3RfeHZpZGVuY19zZXR1cCksIChnc3RfeHZpZGVuY19jaGFpbik6CisJKiBnc3QtbGlicy9nc3QvTWFrZWZpbGUuYW06CisJKiBnc3QtbGlicy9nc3QvcmlmZi9yaWZmLXJlYWQuYzogKGdzdF9yaWZmX3BlZWtfaGVhZCksCisJKGdzdF9yaWZmX3JlYWRfZWxlbWVudF9kYXRhKSwgKGdzdF9yaWZmX3JlYWRfc2VlayksCisJKGdzdF9yaWZmX3BlZWtfbGlzdCksIChnc3RfcmlmZl9yZWFkX2xpc3QpLCAoZ3N0X3JpZmZfcmVhZF9oZWFkZXIpOgorCSogZ3N0L2FkZGVyL2dzdGFkZGVyLmM6IChnc3RfYWRkZXJfcGFyc2VfY2FwcyksIChnc3RfYWRkZXJfbG9vcCk6CisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfcHJvY2Vzc19zZWdtZW50KSwKKwkoZ3N0X2FzZl9kZW11eF9wcm9jZXNzX3N0cmVhbSksIChnc3RfYXNmX2RlbXV4X2dldF9zdHJlYW0pOgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5pdCksCisJKGdzdF9hdmlfZGVtdXhfYWRkX3N0cmVhbSksIChnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXIpOgorCSogZ3N0L2F2aS9nc3RhdmltdXguYzogKGdzdF9hdmltdXhfc3RvcF9maWxlKToKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IChnc3RfZmx4ZGVjX2xvb3ApOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOiAoZ3N0X2dvb21fY2hhaW4pOgorCSogZ3N0L2lkMy9nc3RpZDN0eXBlcy5jOiAoZ3N0X2lkM3R5cGVzX2xvb3ApOgorCSogZ3N0L2ludGZsb2F0L2dzdGZsb2F0MmludC5jOiAoZ3N0X2Zsb2F0MmludF9sb29wKToKKwkqIGdzdC9pbnRmbG9hdC9nc3RpbnQyZmxvYXQuYzogKGdzdF9pbnQyZmxvYXRfY2hhaW5fZ2ludDE2KToKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYzogKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9pZCksCisJKGdzdF9lYm1sX3JlYWRfZWxlbWVudF9sZW5ndGgpLCAoZ3N0X2VibWxfcmVhZF9lbGVtZW50X2RhdGEpLAorCShnc3RfZWJtbF9yZWFkX3NlZWspLCAoZ3N0X2VibWxfcmVhZF91aW50KSwgKGdzdF9lYm1sX3JlYWRfc2ludCksCisJKGdzdF9lYm1sX3JlYWRfZmxvYXQpLCAoZ3N0X2VibWxfcmVhZF9oZWFkZXIpOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfaW5pdF9zdHJlYW0pLAorCShnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cCk6CisJKiBnc3QvbW9kcGx1Zy9nc3Rtb2RwbHVnLmNjOgorCSogZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYzogKGdzdF9tb25vc2NvcGVfY2hhaW4pOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ3BhcnNlLmM6IChnc3RfbXBlZ19wYXJzZV9sb29wKToKKwkqIGdzdC9vbmV0b24vZ3N0b25ldG9uLmM6IChnc3Rfb25ldG9uX2NoYWluKToKKwkqIGdzdC9zaWxlbmNlL2dzdHNpbGVuY2UuYzogKGdzdF9zaWxlbmNlX2dldCk6CisJKiBnc3Qvc2luZS9nc3RzaW5lc3JjLmM6IChnc3Rfc2luZXNyY19nZXQpOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6IChnc3Rfc21wdGVfbG9vcCk6CisJKiBnc3Qvc3BlZWQvZ3N0c3BlZWQuYzogKHNwZWVkX2xvb3ApOgorCSogZ3N0L3RhZ3MvZ3N0dm9yYmlzdGFnLmM6IChnc3Rfdm9yYmlzX3RhZ19jaGFpbik6CisJKiBnc3QvdmlkZW90ZXN0c3JjL2dzdHZpZGVvdGVzdHNyYy5jOiAoZ3N0X3ZpZGVvdGVzdHNyY19nZXQpOgorCSogZ3N0L3ZvbGVudi9nc3R2b2xlbnYuYzogKGdzdF92b2xlbnZfY2hhaW4pOgorCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzogKGdzdF93YXZlbmNfY2hhaW4pOgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfcGFyc2VfZm10KSwKKwkoZ3N0X3dhdnBhcnNlX2xvb3ApOgorCSogc3lzL2R4cjMvZHhyM2F1ZGlvc2luay5jOiAoZHhyM2F1ZGlvc2lua19vcGVuKSwKKwkoZHhyM2F1ZGlvc2lua19zZXRfbW9kZV9wY20pLCAoZHhyM2F1ZGlvc2lua19zZXRfbW9kZV9hYzMpLAorCShkeHIzYXVkaW9zaW5rX2Nsb3NlKToKKwkqIHN5cy9keHIzL2R4cjNzcHVzaW5rLmM6IChkeHIzc3B1c2lua19vcGVuKSwgKGR4cjNzcHVzaW5rX2Nsb3NlKToKKwkqIHN5cy9keHIzL2R4cjN2aWRlb3NpbmsuYzogKGR4cjN2aWRlb3Npbmtfb3BlbiksCisJKGR4cjN2aWRlb3NpbmtfY2xvc2UpLCAoZHhyM3ZpZGVvc2lua193cml0ZV9kYXRhKToKKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiAoZ3N0X29zc2VsZW1lbnRfb3Blbl9hdWRpbyk6CisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuaDoKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc3NpbmtfZ2V0X3R5cGUpLCAoZ3N0X29zc3NpbmtfaW5pdCksCisJKGdzdF9vc3NzaW5rX2NoYWluKToKKwkqIHN5cy9vc3MvZ3N0b3Nzc3JjLmM6IChnc3Rfb3Nzc3JjX2dldCk6CisJKiBzeXMvdjRsL2dzdHY0bG1qcGVnc2luay5jOiAoZ3N0X3Y0bG1qcGVnc2lua19jaGFpbik6CisJKiBzeXMvdjRsL2dzdHY0bG1qcGVnc3JjLmM6IChnc3RfdjRsbWpwZWdzcmNfYnVmZmVyX2ZyZWUpOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzogKGdzdF92NGxzcmNfYnVmZmVyX2ZyZWUpOgorCSogc3lzL3Y0bC92NGwtb3ZlcmxheV9jYWxscy5jOiAoZ3N0X3Y0bF9zZXRfd2luZG93KSwKKwkoZ3N0X3Y0bF9lbmFibGVfb3ZlcmxheSk6CisJKiBzeXMvdjRsL3Y0bF9jYWxscy5jOiAoZ3N0X3Y0bF9nZXRfY2FwYWJpbGl0aWVzKSwgKGdzdF92NGxfb3BlbiksCisJKGdzdF92NGxfc2V0X2NoYW5fbm9ybSksIChnc3RfdjRsX2dldF9zaWduYWwpLAorCShnc3RfdjRsX2dldF9mcmVxdWVuY3kpLCAoZ3N0X3Y0bF9zZXRfZnJlcXVlbmN5KSwKKwkoZ3N0X3Y0bF9nZXRfcGljdHVyZSksIChnc3RfdjRsX3NldF9waWN0dXJlKSwgKGdzdF92NGxfZ2V0X2F1ZGlvKSwKKwkoZ3N0X3Y0bF9zZXRfYXVkaW8pOgorCSogc3lzL3Y0bC92NGxfY2FsbHMuaDoKKwkqIHN5cy92NGwvdjRsbWpwZWdzaW5rX2NhbGxzLmM6IChnc3RfdjRsbWpwZWdzaW5rX3N5bmNfdGhyZWFkKSwKKwkoZ3N0X3Y0bG1qcGVnc2lua19xdWV1ZV9mcmFtZSksIChnc3RfdjRsbWpwZWdzaW5rX3NldF9wbGF5YmFjayksCisJKGdzdF92NGxtanBlZ3NpbmtfcGxheWJhY2tfaW5pdCksCisJKGdzdF92NGxtanBlZ3NpbmtfcGxheWJhY2tfc3RhcnQpOgorCSogc3lzL3Y0bC92NGxtanBlZ3NyY19jYWxscy5jOiAoZ3N0X3Y0bG1qcGVnc3JjX3F1ZXVlX2ZyYW1lKSwKKwkoZ3N0X3Y0bG1qcGVnc3JjX3N5bmNfbmV4dF9mcmFtZSksIChnc3RfdjRsbWpwZWdzcmNfc2V0X2NhcHR1cmUpLAorCShnc3RfdjRsbWpwZWdzcmNfc2V0X2NhcHR1cmVfbSksIChnc3RfdjRsbWpwZWdzcmNfY2FwdHVyZV9pbml0KSwKKwkoZ3N0X3Y0bG1qcGVnc3JjX3JlcXVldWVfZnJhbWUpOgorCSogc3lzL3Y0bC92NGxzcmNfY2FsbHMuYzogKGdzdF92NGxzcmNfcXVldWVfZnJhbWUpLAorCShnc3RfdjRsc3JjX3N5bmNfZnJhbWUpLCAoZ3N0X3Y0bHNyY19jYXB0dXJlX2luaXQpLAorCShnc3RfdjRsc3JjX3JlcXVldWVfZnJhbWUpLCAoZ3N0X3Y0bHNyY190cnlfcGFsZXR0ZSk6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19nZXQpOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOiAoZ3N0X3Y0bDJzcmNfZmlsbF9mb3JtYXRfbGlzdCksCisJKGdzdF92NGwyc3JjX3F1ZXVlX2ZyYW1lKSwgKGdzdF92NGwyc3JjX2dyYWJfZnJhbWUpLAorCShnc3RfdjRsMnNyY19nZXRfY2FwdHVyZSksIChnc3RfdjRsMnNyY19zZXRfY2FwdHVyZSksCisJKGdzdF92NGwyc3JjX2NhcHR1cmVfaW5pdCksIChnc3RfdjRsMnNyY19jYXB0dXJlX3N0YXJ0KSwKKwkoZ3N0X3Y0bDJzcmNfY2FwdHVyZV9zdG9wKToKKwkqIHN5cy92Y2QvdmNkc3JjLmM6ICh2Y2RzcmNfb3Blbl9maWxlKToKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwKKwkoZ3N0X3hpbWFnZXNpbmtfY2hhaW4pOgorCSogc3lzL3h2aWRlby94dmlkZW9zaW5rLmM6IChnc3RfeHZpZGVvc2lua19idWZmZXJfbmV3KSwKKwkoZ3N0X3h2aWRlb3Npbmtfc2lua2Nvbm5lY3QpLCAoZ3N0X3h2aWRlb3NpbmtfY2hhaW4pLAorCShnc3RfeHZpZGVvc2lua194d2luZG93X25ldyk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3hjb250ZXh0X2dldCksCisJKGdzdF94dmltYWdlc2lua19jaGFpbik6CisgICAgICAgIHVzZSBuZXcgZXJyb3Igc2lnbmFsLCBmdW5jdGlvbiBhbmQgY2F0ZWdvcmllcworCisyMDA0LTAxLTE4ICBKZXJlbXkgU2ltb24gPGplc2ltb25AbGliZXJ0eXN1cmYuZnI+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkqIGV4dC9NYWtlZmlsZS5hbToKKwkqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uYzoKKwkqIGV4dC9tdXNpY2JyYWluei9nc3R0cm0uaDoKKwkqIGV4dC9tdXNpY2JyYWluei9NYWtlZmlsZS5hbToKKwlBZGQgYSB0cm0gcGx1Z2luCisKKzIwMDQtMDEtMTggIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19zZXRfcHJvcGVydHkpLAorCShnc3RfeGltYWdlc2lua19nZXRfcHJvcGVydHkpLCAoZ3N0X3hpbWFnZXNpbmtfY2xhc3NfaW5pdCk6IEFkZGluZworCXN5bmNocm9ub3VzIHByb3BlcnR5IGZvciBkZWJ1Z2dpbmcuCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuaDogQWRkaW5nIHRoZSBzeW5jaHJvbm91cyBib29sZWFuIGZsYWcuCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3hjb250ZXh0X2dldCksCisJKGdzdF94dmltYWdlc2lua19zZXRfcHJvcGVydHkpOiBNb3ZpbmcgYSBwb2ludGVyIGRlY2xhcmF0aW9uIHRvIGEKKwlzbWFsbGVyIGJsb2NrLCBmaXhpbmcgaW5kZW50LgorCisyMDA0LTAxLTE2ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzogRml4IHJlZ3Jlc3Npb247IGNoYW5naW5nIGEKKwlwcm9wZXJ0eSBhZmZlY3RzIHRoZSB2aWRlbyBzdHJlYW0uCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuaDoKKwlBZGQgc3luY2hyb25vdXMgcHJvcGVydHkgZm9yIGRlYnVnZ2luZy4gIFNob3VsZCBwcm9iYWJseSBiZQorCWRpc2FibGVkIGluIG5vbi1DVlMgYnVpbGRzLiAgTWFrZSBzdXJlIHRoYXQgdGhlIFh2IGF0dHJpYnV0ZQorCWV4aXN0cyBiZWZvcmUgd2Ugc2V0IGl0IChjcmFzaCEpLiAgRml4IGEgc2lsbHkgZmxvYXQgYnVnIHRoYXQKKwljYXVzZWQgY29sb3JiYWxhbmNlIHRvIGp1c3Qgbm90IHdvcmsuCisKKzIwMDQtMDEtMTcgIENocmlzdGlhbiBTY2hhbGxlciA8VXJhZXVzQGdub21lLm9yZz4KKworCSogdG9vbHMvZ3N0LWxhdW5jaC1leHQuaW4gLSB1cGRhdGUgZm9yIG5ldyBwbHVnaW5zCisKKzIwMDQtMDEtMTYgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdlbmMuYzogKGdzdF9mZm1wZWdlbmNfY29ubmVjdCk6IEZpeCB1c2Ugb2YKKwlhbHJlYWR5LWZyZWVkIGNhcHMuCisKKzI5OTQtMDEtMTYgIENocmlzdGlhbiBTY2hhbGxlciA8VXJhZXVzQGdub21lLm9yZz4KKworCSogVXBkYXRlIHNwZWMgZm9yIG5ldyBjb2xvcnNwYWNlIHBsdWdpbiBhbmQgbGliY2FjYSBwbHVnaW4KKwkqIEZpeCBjb21waWxhdGlvbiBvZiBsaWJjYWNhIHBsdWdpbiAoY2xvY2sgLT4gaWQpCisKKzIwMDQtMDEtMTYgIEp1bGllbiBNT1VUVEUgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3VwZGF0ZV9jb2xvcmJhbGFuY2UpLAorCShnc3RfeHZpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwgKGdzdF94dmltYWdlc2lua19jaGFuZ2Vfc3RhdGUpLAorCShnc3RfeHZpbWFnZXNpbmtfc2V0X3h3aW5kb3dfaWQpLAorCShnc3RfeHZpbWFnZXNpbmtfY29sb3JiYWxhbmNlX3NldF92YWx1ZSksCisJKGdzdF94dmltYWdlc2lua19jb2xvcmJhbGFuY2VfZ2V0X3ZhbHVlKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3NldF9wcm9wZXJ0eSksIChnc3RfeHZpbWFnZXNpbmtfZ2V0X3Byb3BlcnR5KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2luaXQpLCAoZ3N0X3h2aW1hZ2VzaW5rX2NsYXNzX2luaXQpOiBJbXBsZW1lbnRpbmcKKwljb3JyZWN0IGNvbG9yYmFsYW5jZSBwcm9wZXJ0aWVzLiBUaGV5IGNhbiBub3cgYmUgc2V0IHdoZW4gdGhlIGVsZW1lbnQKKwlpcyBzdGlsbCBpbiBOVUxMIHN0YXRlLiBUaGUgdmFsdWVzIHdpbGwgYmUgY29tbWl0dGVkIHRvIHRoZSBYdiBQb3J0CisJd2hlbiB4Y29udGV4dCBpcyBpbml0aWFsaXplZC4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmg6IEFkZGVkIGh1ZSwgc2F0dXJhdGlvbiwgY29udHJhc3QsCisJYnJpZ2h0bmVzcyBpbnQgdmFsdWVzIGluIHRoZSBHc3RYdkltYWdlc2luayBzdHJ1Y3R1cmUuCisKKzIwMDQtMDEtMTYgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9NYWtlZmlsZS5hbToKKwkgIHJlc3RydWN0dXJlIHNvIGhhdmluZyBsb2NhbCBwYXRjaGVzIHdvcmtzIGVhc2llci4KKworMjAwNC0wMS0xNiAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L21wZWcyZW5jL01ha2VmaWxlLmFtOgorCSogZXh0L21wZWcyZW5jL2dzdG1wZWcyZW5jLmNjOgorCSogZXh0L21wZWcyZW5jL2dzdG1wZWcyZW5jcGljdHVyZXJlYWRlci5jYzoKKwkgIEJ1Z2ZpeCB3aXRoIHJlc3BlY3QgdG8gRU9TIGhhbmRsaW5nLgorCisyMDA0LTAxLTE2ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2VuYy5jOiAoZ3N0X2ZmbXBlZ2VuY19jb25uZWN0KToKKwkgIExpbmsgd2l0aCByaWdodCBjYXBzIChlbHNlLCBpdCBzZWdmYXVsdHMpLgorCSogZXh0L21wbGV4L2dzdG1wbGV4am9iLmNjOgorCSAgRml4IGZvciBzbGlnaHQgQVBJIGNoYW5nZSBpbiAxLjYuMS45MyByZWxlYXNlIG9mIG1qcGVndG9vbHMuCisKKzIwMDQtMDEtMTUgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL01ha2VmaWxlLmFtOgorCUFkZCBnc3RhdWRpb2ZpbHRlcnRlbXBsYXRlLmMgYW5kIGJ1aWxkaW5nIG9mIGdzdGF1ZGlvZmlsdGVyZXhhbXBsZS5jCisJZnJvbSB0aGUgdGVtcGxhdGUuCisJKiBnc3QtbGlicy9nc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuYzoKKwkqIGdzdC1saWJzL2dzdC9hdWRpby9nc3RhdWRpb2ZpbHRlci5oOgorCUFkZCBieXRlc19wZXJfc2FtcGxlIGFuZCBzaXplIGFuZCBuX3NhbXBsZXMgY2FsY3VsYXRpb24uCisJKiBnc3QtbGlicy9nc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXJleGFtcGxlLmM6CisJUmVtb3ZlLCBub3cgYXV0b2dlbmVyYXRlZC4KKwkqIGdzdC1saWJzL2dzdC9hdWRpby9nc3RhdWRpb2ZpbHRlcnRlbXBsYXRlLmM6CisJTW92ZWQgZnJvbSBnc3RhdWRpb2ZpbHRlcmV4YW1wbGUsIG9iamVjdCBuYW1lIGNoYW5nZWQsIGNvZGUgYWRkZWQKKwlzbyB0aGF0IGl0IGFjdHVhbGx5IHdvcmtzLgorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL21ha2VfZmlsdGVyOgorCVNjcmlwdCB0byBidWlsZCBhbiBhdWRpb2ZpbHRlciBzdWJjbGFzcyBmcm9tIHRoZSB0ZW1wbGF0ZS4KKwkqIGdzdC9jb2xvcnNwYWNlL01ha2VmaWxlLmFtOgorCSogZ3N0L2NvbG9yc3BhY2UveXV2Mnl1di5jOgorCVJlbW92ZSBmaWxlLCBzaW5jZSBpdCdzIEdQTCwgYW5kIHdlIGRvbid0IHVzZSBpdC4KKworMjAwNC0wMS0xNSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2NoYWluKToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfY2hhaW4pOiBNYWtpbmcgYm90aCBvZgorCXRoZW0gdXNlIHRoZSBidWZmZXIgZnJlZSBmdW5jdGlvbiB0byB0ZXN0IGhvdyB0aGUgYnVmZmVyIHdhcyBhbGxvY2F0ZWQuCisKKzIwMDQtMDEtMTUgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2VzZC9lc2RzaW5rLmM6IChnc3RfZXNkc2lua19jbGFzc19pbml0KTogUmVtb3ZlIHByb3BlcnR5CisJdGhhdCBoYW5kbGVzIG9zc3NpbmsgZmFsbGJhY2suCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiAoZ3N0X2F1ZGlvX2NvbnZlcnRfaW5pdCksCisJKGdzdF9hdWRpb19jb252ZXJ0X2dldGNhcHMpOgorCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocXRkZW11eF9hdWRpb19jYXBzKToKKwlBZGQgYXVkaW8veC1xZG0yIGZvciBRRE0yIGF1ZGlvLgorCSogZ3N0L3NpbmUvZ3N0c2luZXNyYy5jOiAoZ3N0X3NpbmVzcmNfZ2V0KToKKwkqIGdzdC9zaW5lL2dzdHNpbmVzcmMuaDogQWRkIGV4YW1wbGUgb2YgaG93IHRvIGltcGxlbWVudCB0YWdzLgorCSogZ3N0L3ZpZGVvc2NhbGUvZ3N0dmlkZW9zY2FsZS5jOiAoZ3N0X3ZpZGVvc2NhbGVfZ2V0Y2Fwcyk6CisJRGVjcmVhc2UgbWluaW11bSBzaXplIHRvIDE2eDE2LgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6CisJQ29udmVydCBkaXNhYmxlZCBwYWQgdGVtcGxhdGUgY2FwcyB0byBuZXcgY2Fwcy4KKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NoYWluKTogVGhyb3cgZWxlbWVudCBlcnJvciB3aGVuIGRpc3BsYXkgY2Fubm90CisJYmUgb3BlbmVkLiAgSW5jcmVhc2UgbWluaW11bSBmcmFtZXJhdGUgdG8gMS4wLiAgQ2hlY2sgdGhlIGRhdGEKKwlmcmVlIGZ1bmN0aW9uIG9uIGEgYnVmZmVyIHRvIG1ha2Ugc3VyZSBpdCBpcyB0aGUgdHlwZSB3ZSBleHBlY3QKKwliZWZvcmUgbWFuaXB1bGF0aW5nIGl0LgorCisyMDA0LTAxLTE1ICBKdWxpZW4gTU9VVFRFIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOiAoZ3N0X3ZpZGVvYmFsYW5jZV9pbml0KSwKKwkoZ3N0X3ZpZGVvYmFsYW5jZV9jb2xvcmJhbGFuY2Vfc2V0X3ZhbHVlKTogSW1wbGVtZW50IHBhc3N0aHJ1IGlmCisJc2V0dGluZ3MgYXJlIGluIHRoZSBtaWRkbGUuCisJKiB0b29scy9nc3QtbGF1bmNoLWV4dC5pbjogU3RvcCB1c2luZyB4dmlkZW9zaW5rLCB1c2UgeGltYWdlc2luay4KKworMjAwNC0wMS0xNSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZvbHVtZS9NYWtlZmlsZS5hbToKKwkgIFNpbmNlIHdlIHVzZSB2aWRlb2ZpbHRlciBzeW1ib2xzLCBsaW5rIHRvIGl0LgorCisyMDA0LTAxLTE1ICBKdWxpZW4gTU9VVFRFIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYW1peGVyLmM6IChnc3RfYWxzYV9taXhlcl9pbnRlcmZhY2VfaW5pdCk6IFNldHRpbmcKKwltaXhlciBpbnRlcmZhY2UgdHlwZSB0byBIQVJEV0FSRS4KKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlci5jOiAoZ3N0X21peGVyX2NsYXNzX2luaXQpOiBBZGRpbmcgYSBkZWZhdWx0CisJdHlwZSB0byBTT0ZUV0FSRS4KKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlci5oOiBBZGRpbmcgbWl4ZXIgaW50ZXJmYWNlIHR5cGUgYW5kIG1hY3JvLgorCSogZ3N0LWxpYnMvZ3N0L21peGVyL21peGVydHJhY2suaDogQWRkaW5nIG1peGVydHJhY2sgZmxhZyBTT0ZUV0FSRS4KKwkqIGdzdC92b2x1bWUvZ3N0dm9sdW1lLmM6IChnc3Rfdm9sdW1lX2ludGVyZmFjZV9zdXBwb3J0ZWQpLAorCShnc3Rfdm9sdW1lX2ludGVyZmFjZV9pbml0KSwgKGdzdF92b2x1bWVfbGlzdF90cmFja3MpLAorCShnc3Rfdm9sdW1lX3NldF92b2x1bWUpLCAoZ3N0X3ZvbHVtZV9nZXRfdm9sdW1lKSwKKwkoZ3N0X3ZvbHVtZV9zZXRfbXV0ZSksIChnc3Rfdm9sdW1lX21peGVyX2luaXQpLAorCShnc3Rfdm9sdW1lX2Rpc3Bvc2UpLCAoZ3N0X3ZvbHVtZV9nZXRfdHlwZSksICh2b2x1bWVfY2xhc3NfaW5pdCksCisJKHZvbHVtZV9pbml0KTogSW1wbGVtZW50aW5nIG1peGVyIGludGVyZmFjZS4KKwkqIGdzdC92b2x1bWUvZ3N0dm9sdW1lLmg6IEFkZGluZyB0cmFja2xpc3QgZm9yIG1peGVyIGludGVyZmFjZS4KKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiAoZ3N0X29zc2VsZW1lbnRfZ2V0X3R5cGUpLAorCShnc3Rfb3NzZWxlbWVudF9jaGFuZ2Vfc3RhdGUpOiBSZW1vdmluZyBzb21lIHRyYWlsaW5nIGNvbW1hcyBpbgorCXN0cnVjdHVyZXMuCisJKiBzeXMvb3NzL2dzdG9zc21peGVyLmM6IChnc3Rfb3NzbWl4ZXJfaW50ZXJmYWNlX2luaXQpOiBTZXR0aW5nIG1peGVyCisJaW50ZXJmYWNlIHR5cGUgdG8gSEFSRFdBUkUuCisJKiBzeXMvdjRsL2dzdHY0bGNvbG9yYmFsYW5jZS5jOgorCShnc3RfdjRsX2NvbG9yX2JhbGFuY2VfaW50ZXJmYWNlX2luaXQpOiBTZXR0aW5nIGNvbG9yYmFsYW5jZSBpbnRlcmZhY2UKKwl0eXBlIHRvIEhBUkRXQVJFLgorCSogc3lzL3Y0bDIvZ3N0djRsMmNvbG9yYmFsYW5jZS5jOgorCShnc3RfdjRsMl9jb2xvcl9iYWxhbmNlX2ludGVyZmFjZV9pbml0KTogU2V0dGluZyBjb2xvcmJhbGFuY2UKKwlpbnRlcmZhY2UgdHlwZSB0byBIQVJEV0FSRS4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfY2hhaW4pOiB1c2UgZXhhY3RseSB0aGUKKwlzYW1lIGNvZGUgdGhhbiB4aW1hZ2VzaW5rIGZvciBldmVudCBoYW5kbGluZy4KKworMjAwNC0wMS0xNSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L3NuYXBzaG90L01ha2VmaWxlLmFtOgorCSogZXh0L3NuYXBzaG90L2dzdHNuYXBzaG90LmM6IChnc3Rfc25hcHNob3Rfc2lua2Nvbm5lY3QpLAorCShnc3Rfc25hcHNob3RfY2hhaW4pOgorCSogZXh0L3NuYXBzaG90L2dzdHNuYXBzaG90Lmg6CisJICBUaGlzIGhhcyB0byBiZSBhIGpva2UuLi4gU25hcHNob3Qgc2hvdWxkIGJlIGNvbm5lY3RlZCB0byBhIHRlZSwKKwkgIGNvbG9yc3BhY2UgZWxlbWVudCBiZWZvcmUgaXQgYW5kIEVPUyBhZnRlciB0aGF0LCB3aGVyZSB0aGUgb3RoZXIKKwkgIHNyYyBvZiB0aGUgdGVlIHJlY2VpdmVzIG5vcm1hbCBkYXRhLgorCSAgVGhlIGN1cnJlbnQgd2F5IGlzICp3cm9uZyouCisKKzIwMDQtMDEtMTUgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9oZXJtZXMvZ3N0aGVybWVzY29sb3JzcGFjZS5jOgorCSAgRml4IGFub3RoZXIgY29tcGlsZSBlcnJvci4gU2FtZSBhcyBiZWxvdy4KKworMjAwNC0wMS0xNSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L2NvbG9yc3BhY2UvZ3N0Y29sb3JzcGFjZS5jOgorCSogZ3N0L2NvbG9yc3BhY2UveXV2Mnl1di5jOiAoZ3N0X2NvbG9yc3BhY2VfeXV5Ml90b19pNDIwKSwKKwkoZ3N0X2NvbG9yc3BhY2VfaTQyMF90b195djEyKToKKwkgIEZpeCBjb21waWxpbmcuLi4gRGlkbid0IHRlc3QgaWYgaXQgYWN0dWFsbHkgd29ya3MuCisKKzIwMDQtMDEtMTUgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogY29uZmlndXJlLmFjOgorCSogZ3N0L2NvbG9yc3BhY2UvTWFrZWZpbGUuYW06CisJKiBnc3QvY29sb3JzcGFjZS9nc3Rjb2xvcnNwYWNlLmM6CisJKiBnc3QvY29sb3JzcGFjZS9nc3Rjb2xvcnNwYWNlLmg6CisJKiBnc3QvY29sb3JzcGFjZS95dXYycmdiLmM6CisJKiBnc3QvY29sb3JzcGFjZS95dXYycmdiLmg6CisJRHVwbGljYXRlIHRoZSBleHQvaGVybWVzIGNvbG9yc3BhY2UgcGx1Z2luLCBhbmQgcmVtb3ZlIEhlcm1lcworCWNvZGUgYW5kIEdQTCBjb2RlLiAgRml4IGZvciBuZXcgY2FwcyBuZWdvdGlhdGlvbi4gIFJld3JpdGUKKwltdWNoIG9mIHRoZSBmb3JtYXQgaGFuZGxpbmcgY29kZSwgYW5kIHNvbWUgb2YgdGhlIGNvbnZlcnNpb24KKwljb2RlLiAgQmFzaWNhbGx5LCByZXdyb3RlIGFsbW9zdCBldmVyeXRoaW5nLiAgVGhpcyBlbGVtZW50CisJaGFuZGxlcyBJNDIwLCBZVjEyIHRvIFJHQiBjb252ZXJzaW9ucy4KKwkqIGV4dC9oZXJtZXMvTWFrZWZpbGUuYW06CisJKiBleHQvaGVybWVzL2dzdGhlcm1lc2NvbG9yc3BhY2UuYzoKKwlSZW5hbWUgY29sb3JzcGFjZSB0byBoZXJtZXNjb2xvcnNwYWNlLiAgRml4IG5lZ290aWF0aW9uIGlzc3Vlcy4KKwlSZW1vdmUgbm9uLUhlcm1lcyByZWxhdGVkIGNvZGUuICBUaGlzIGVsZW1lbnQgaGFuZGxlcyBsb3RzIG9mCisJUkdCIHRvIFJHQiBjb252ZXJzaW9ucywgYnV0IG5vIFlVVi4KKwkqIGV4dC9oZXJtZXMvZ3N0Y29sb3JzcGFjZS5jOgorCSogZXh0L2hlcm1lcy9nc3Rjb2xvcnNwYWNlLmg6CisJKiBleHQvaGVybWVzL3JnYjJ5dXYuYzoKKwkqIGV4dC9oZXJtZXMveXV2MnJnYi5jOgorCSogZXh0L2hlcm1lcy95dXYycmdiLmg6CisJKiBleHQvaGVybWVzL3l1djJyZ2JfbW14MTYuczoKKwkqIGV4dC9oZXJtZXMveXV2Mnl1di5jOgorCSogZXh0L2hlcm1lcy95dXYyeXV2Lmg6CisJUmVtb3ZlIG9sZCBjb2RlLgorCisyMDA0LTAxLTE0ICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jIChnc3RfaWQzX3RhZ19jaGFpbik6IERvbid0IG5lZ28gY2FwcyBpZgorCXRoZXkndmUgYWxyZWFkeSBiZWVuLgorCisyMDA0LTAxLTE1ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfaWQzX3RhZ19kb19jYXBzX25lZ28pOgorCSAgYXNzdW1lIHRhZyBtb2RlIHdoZW4gcGFkIGlzIG5vdCBjb25uZWN0ZWQKKworMjAwNC0wMS0xNSAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvYWxzYS9nc3RhbHNhc2luay5jOiAoZ3N0X2Fsc2Ffc2lua19jaGVja19ldmVudCk6CisJICBEb24ndCB1cGRhdGUgdGhlIHRpbWUgb2YgdGhlIGNsb2NrCisJKGdzdF9hbHNhX3NpbmtfbG9vcCk6CisJICBzeW5jIHRvIHRoZSBjbG9jayBnaXZlbiB0byBhbHNhc2luaywgbm90IHRoZSBvd24gY2xvY2sKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc3NpbmtfY2hhaW4pOgorCSAgc3luYyB0byB0aGUgY2xvY2sKKwkoZ3N0X29zc3NpbmtfY2hhbmdlX3N0YXRlKToKKwkgIGFjdGl2YXRlIHRoZSBjbG9jaworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19jaGFpbik6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2NoYWluKToKKwkgIHJlbW92ZSBib2d1cyBjb2RlIHRoYXQgbWFkZSBESVNDT05UIGV2ZW50cyB1bmhhbmRsZWQKKwkqIGdzdC9hc2ZkZW11eC9nc3Rhc2ZkZW11eC5jOiAoZ3N0X2FzZl9kZW11eF92aWRlb19jYXBzKToKKwkgIGV4cGxpY2l0bHkgY2FzZSB0byBkb3VibGUgaW4gX3NldF9zaW1wbGUuIChmaXhlcyAybmQgd2FybmluZyBpbiBidWcKKwkgICMxMzE1MDIpCisJKiBnc3QvYXNmZGVtdXgvZ3N0YXNmZGVtdXguYzogKGdzdF9hc2ZfZGVtdXhfcmVhZF9vYmplY3RfaGVhZGVyKSwKKwkoZ3N0X2FzZl9kZW11eF9oYW5kbGVfc2lua19ldmVudCksIChnc3RfYXNmX2RlbXV4X2F1ZGlvX2NhcHMpLAorCShnc3RfYXNmX2RlbXV4X2FkZF9hdWRpb19zdHJlYW0pLCAoZ3N0X2FzZl9kZW11eF92aWRlb19jYXBzKToKKwkgIGNvbnZlcnQgZ193YXJuaW5nIGJlY2F1c2Ugb2Ygd3JvbmcgYXNmIGRhdGEgdG8gR1NUX1dBUk5JTkdzIChmaXhlcworCSAgMm5kIHdhcm5pbmcgaW4gYnVnICMxMzE1MDIpCisKKzIwMDQtMDEtMTQgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOiAoZ3N0X3ZpZGVvYmFsYW5jZV9pbml0KSwKKwkoZ3N0X3ZpZGVvYmFsYW5jZV9jb2xvcmJhbGFuY2Vfc2V0X3ZhbHVlKSwKKwkoZ3N0X3ZpZGVvYmFsYW5jZV9jb2xvcmJhbGFuY2VfZ2V0X3ZhbHVlKTogRml4aW5nIHZpZGVvYmFsYW5jZSByYW5nZXMKKwlmb3IgY29sb3JiYWxhbmNlIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbi4KKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwKKwkoZ3N0X3hpbWFnZXNpbmtfc2V0X3Byb3BlcnR5KSwgKGdzdF94aW1hZ2VzaW5rX2dldF9wcm9wZXJ0eSksCisJKGdzdF94aW1hZ2VzaW5rX2Rpc3Bvc2UpLCAoZ3N0X3hpbWFnZXNpbmtfaW5pdCksCisJKGdzdF94aW1hZ2VzaW5rX2NsYXNzX2luaXQpOiBBZGRpbmcgRElTUExBWSBwcm9wZXJ0eS4KKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5oOiBBZGRpbmcgZGlzcGxheV9uYW1lIHRvIHN0b3JlIGRpc3BsYXkuCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3hjb250ZXh0X2dldCksCisJKGdzdF94dmltYWdlc2lua19zZXRfcHJvcGVydHkpLCAoZ3N0X3h2aW1hZ2VzaW5rX2dldF9wcm9wZXJ0eSksCisJKGdzdF94dmltYWdlc2lua19kaXNwb3NlKSwgKGdzdF94dmltYWdlc2lua19pbml0KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NsYXNzX2luaXQpOiBBZGRpbmcgRElTUExBWSBwcm9wZXJ0eSBhbmQgY29sb3JiYWxhbmNlCisJcHJvcGVydGllcyAodGhleSBzdGlsbCBuZWVkIHBvbGlzaGluZyB0aG91Z2ggZm9yIGdzdC1sYXVuY2ggdXNlIDogbm8KKwl4Y29udGV4dCB5ZXQsIGkgbGwgZG8gdGhhdCB0b21vcnJvdykuCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5oOiBBZGRpbmcgZGlzcGxheV9uYW1lIHRvIHN0b3JlIGRpc3BsYXkuCisKKzIwMDQtMDEtMTQgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L3BsYXkvZ3N0cGxheS5jOiAoZ3N0X3BsYXlfcGlwZWxpbmVfc2V0dXApLAorCShnc3RfcGxheV9zZXRfbG9jYXRpb24pLCAoZ3N0X3BsYXlfc2V0X3Zpc3VhbGl6YXRpb24pOiBQcmVwYXJpbmcKKwlzd2l0Y2ggaW50ZWdyYXRpb24sIGFkZGluZyB2aWRlb2JhbGFuY2UgaW4gdGhlIHBpcGVsaW5lLgorCisyMDA0LTAxLTE0ICBKdWxpZW4gTU9VVFRFIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L2NvbG9yYmFsYW5jZS9jb2xvcmJhbGFuY2UuYzoKKwkoZ3N0X2NvbG9yX2JhbGFuY2VfY2xhc3NfaW5pdCk6IEFkZGluZyBhIGRlZmF1bHQgdHlwZS4KKwkqIGdzdC1saWJzL2dzdC9jb2xvcmJhbGFuY2UvY29sb3JiYWxhbmNlLmg6IEFkZGluZyBhIG1hY3JvIHRvIGFjY2VzcworCXRoZSB0eXBlLgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvYmFsYW5jZS5jOiAoZ3N0X3ZpZGVvYmFsYW5jZV9nZXRfdHlwZSksCisJKGdzdF92aWRlb2JhbGFuY2VfZGlzcG9zZSksIChnc3RfdmlkZW9iYWxhbmNlX2NsYXNzX2luaXQpLAorCShnc3RfdmlkZW9iYWxhbmNlX2luaXQpLCAoZ3N0X3ZpZGVvYmFsYW5jZV9pbnRlcmZhY2Vfc3VwcG9ydGVkKSwKKwkoZ3N0X3ZpZGVvYmFsYW5jZV9pbnRlcmZhY2VfaW5pdCksCisJKGdzdF92aWRlb2JhbGFuY2VfY29sb3JiYWxhbmNlX2xpc3RfY2hhbm5lbHMpLAorCShnc3RfdmlkZW9iYWxhbmNlX2NvbG9yYmFsYW5jZV9zZXRfdmFsdWUpLAorCShnc3RfdmlkZW9iYWxhbmNlX2NvbG9yYmFsYW5jZV9nZXRfdmFsdWUpLAorCShnc3RfdmlkZW9iYWxhbmNlX2NvbG9yYmFsYW5jZV9pbml0KTogSW1wbGVtZW50aW5nIGNvbG9yYmFsYW5jZQorCWludGVyZmFjZS4KKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuaDogQWRkaW5nIGNvbG9yYmFsYW5jZSBjaGFubmVscworCWxpc3QuCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3NldF94d2luZG93X2lkKTogRml4aW5nIGEKKwlidWcgd2hpY2ggd2FzIHRyaWdnZXJpbmcgYSBCYWRBY2Nlc3MgWCBlcnJvciB3aGVuIHNldHRpbmcgYW4gb3ZlcmxheQorCWJlZm9yZSBwYWQgd2FzIHJlYWxseSBuZWdvdGlhdGVkLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19jb2xvcmJhbGFuY2VfaW5pdCk6CisJVXNpbmcgdGhlIGNvbG9yYmFsYW5jZSB0eXBlIG1hY3JvLgorCisyMDA0LTAxLTE0ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNlbmMuYzogKGdzdF9mbGFjZW5jX3NldF9tZXRhZGF0YSksCisJKGdzdF9mbGFjZW5jX2NoYWluKToKKwkgIGhhbmRsZSB0YWdzIGNvcnJlY3RseQorCSogZ3N0L3RhZ3MvZ3N0aWQzdGFnLmM6IChnc3RfdGFnX2xpc3RfbmV3X2Zyb21faWQzdjEpOgorCSAgZXh0cmFjdCBJRDN2MSB0YWdzIGNvcnJlY3RseQorCisyMDA0LTAxLTE0ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvdHlwZWZpbmQvZ3N0dHlwZWZpbmRmdW5jdGlvbnMuYzogKG1hdHJvc2thX3R5cGVfZmluZCksCisJKHBsdWdpbl9pbml0KToKKwkgIEltcHJvdmUgbWF0cm9za2EgdHlwZWZpbmRpbmcgZm9yIG9kZC10eXBlZCBoZWFkZXJzLi4uCisKKzIwMDQtMDEtMTQgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9zdHJlYW0pOgorCSAgRml4IGZvciB1c2luZyBpbmNyZW1lbnRhbCBudW1iZXIgb24gcGFkbmFtZXMuCisKKzIwMDQtMDEtMTQgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9kaXZ4L2dzdGRpdnhkZWMuYzoKKwkqIGV4dC9kaXZ4L2dzdGRpdnhlbmMuYzoKKwkgIFNldCBjYXRlZ29yeSB0byBkaXZ4NGxpbnV4IGluc3RlYWQgb2YgZGl2eCAodG9vIGdlbmVyaWMpLgorCSogZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmM6IChnc3Rfd2F2cGFyc2VfaW5pdCksCisJKGdzdF93YXZwYXJzZV9wYXJzZV9mbXQpLCAoZ3N0X3dhdnBhcnNlX2hhbmRsZV9zaW5rX2V2ZW50KSwKKwkoZ3N0X3dhdnBhcnNlX2xvb3ApLCAoZ3N0X3dhdnBhcnNlX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwkgIGZpeCBwYXJzaW5nIG9mIFdBViBmaWxlcyB3aXRoIG5vbi1zdGFuZGFyZCBmbXQtdGFnIHNpemUgYW5kIGZpeAorCSAgc2tpcHBpbmcgb2YgdW5yZWNvZ25pemVkIGNodW5rcy4uLiBTb21lb25lIHBsZWFzZSBmaXggdGhpcyB0aGluZworCSAgdG8gdXNlIHJpZmZsaWIgc28gYWxsIHRoaXMgaXMgYXV0b21hdGVkLgorCSogc3lzL3Y0bC9NYWtlZmlsZS5hbToKKwkqIHN5cy92NGwyL01ha2VmaWxlLmFtOgorCSAgQWRkIFhfQ0ZMQUdTIGJlY2F1c2Ugd2UgZGVwZW5kIG9uIFggKGZvciBvdmVybGF5KS4KKworMjAwNC0wMS0xNCAgSmFuIFNjaG1pZHQgIDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBleHQvbXBlZzJkZWMvZ3N0bXBlZzJkZWMuYzoKKwkgIERvbid0IGlzc3VlIGEgdGltZXN0YW1wIHVubGVzcyB3ZSB0YWdnZWQgdGhlIGZyYW1lCisJICB3aXRoIGEgUFRTLgorCisyMDA0LTAxLTE0ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC1saWJzL2dzdC9wbGF5L2dzdHBsYXkuYzogKGdzdF9wbGF5X3RpY2tfY2FsbGJhY2spOgorCSAgUXVlcnkgdGhlIGF1ZGlvIGVsZW1lbnQgdG8gZ2V0IHRoZSB0aW1lLCBub3QgdGhlIGNsb2NrLiBXZSdyZQorCSAgaW50ZXJlc3RlZCBpbiB0aGUgZWxlbWVudCdzIHRpbWUgaGVyZS4KKworMjAwNC0wMS0xNCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6IChnc3RfYWFzaW5rX2NoYWluKToKKwkqIGV4dC9hbHNhL2dzdGFsc2FzaW5rLmM6IChnc3RfYWxzYV9zaW5rX2NoZWNrX2V2ZW50KToKKwkqIGV4dC9lc2QvZXNkc2luay5jOiAoZ3N0X2VzZHNpbmtfY2hhaW4pOgorCSogZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYzogKGdzdF9jYWNhc2lua19jaGFpbik6CisJKiBleHQvbWFzL21hc3NpbmsuYzogKGdzdF9tYXNzaW5rX2NoYWluKToKKwkqIGV4dC9zZGwvc2RsdmlkZW9zaW5rLmM6IChnc3Rfc2RsdmlkZW9zaW5rX2NoYWluKToKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2luZGV4KSwKKwkoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX21ldGFkYXRhKToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYXJzZS5jOiAoZ3N0X21wZWdfcGFyc2VfbG9vcCksCisJKGdzdF9tcGVnX3BhcnNlX3JlbGVhc2VfbG9ja3MpOgorCSogZ3N0L3RjcC9nc3R0Y3BzaW5rLmM6IChnc3RfdGNwc2lua19jaGFpbik6CisJKiBnc3QvdWRwL2dzdHVkcHNpbmsuYzogKGdzdF91ZHBzaW5rX2NoYWluKToKKwkqIGdzdC92aWRlb3Rlc3RzcmMvZ3N0dmlkZW90ZXN0c3JjLmM6IChnc3RfdmlkZW90ZXN0c3JjX2dldCk6CisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3NzaW5rX2luaXQpLCAoZ3N0X29zc3NpbmtfY2hhaW4pLAorCShnc3Rfb3Nzc2lua19jaGFuZ2Vfc3RhdGUpOgorCSogc3lzL3Y0bC9nc3R2NGxtanBlZ3NpbmsuYzogKGdzdF92NGxtanBlZ3NpbmtfY2hhaW4pOgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19jaGFpbik6CisJKiBzeXMveHZpZGVvL3h2aWRlb3NpbmsuYzogKGdzdF94dmlkZW9zaW5rX2NoYWluKSwKKwkoZ3N0X3h2aWRlb3NpbmtfcmVsZWFzZV9sb2Nrcyk6CisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2NoYWluKToKKwkgIHVzZSBlbGVtZW50IHRpbWUuCisJKiBleHQvYWxzYS9nc3RhbHNhY2xvY2suYzogKGdzdF9hbHNhX2Nsb2NrX3N0YXJ0KSwKKwkoZ3N0X2Fsc2FfY2xvY2tfc3RvcCk6CisJKiBnc3QtbGlicy9nc3QvYXVkaW8vYXVkaW9jbG9jay5jOiAoZ3N0X2F1ZGlvX2Nsb2NrX3NldF9hY3RpdmUpLAorCShnc3RfYXVkaW9fY2xvY2tfZ2V0X2ludGVybmFsX3RpbWUpOgorCSAgc2ltcGxpZnkgZm9yIHVzZSB3aXRoIG5ldyBjbG9ja2luZyBjb2RlLgorCSogdGVzdHN1aXRlL2Fsc2EvTWFrZWZpbGUuYW06CisJKiB0ZXN0c3VpdGUvYWxzYS9zaW5lc3JjLmM6IChzaW5lc3JjX2luaXQpLCAoc2luZXNyY19mb3JjZV9jYXBzKToKKwkgIGZpeCB0ZXN0c3VpdGUgZm9yIG5ldyBjYXBzIHN5c3RlbQorCisyMDA0LTAxLTE0ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjZGVjX3VwZGF0ZV9tZXRhZGF0YSk6CisJKiBleHQvZmxhYy9nc3RmbGFjZW5jLmM6IChhZGRfb25lX3RhZyk6CisJICBsZW5ndGggaXMgYWxyZWFkeSBob3N0IGVuZGlhbiwgbm8gbmVlZCB0byBjb252ZXJ0LiBGaXhlcyBwbGF5YmFjayBvZgorCSAgdGFnZ2VkIGZpbGVzIG9uIFBQQy4gKGJ1ZyAjMTI4Mzg0KQorCisyMDA0LTAxLTEzICBKdWxpZW4gTU9VVFRFIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZ3N0LWxpYnMvZ3N0L2NvbG9yYmFsYW5jZS9jb2xvcmJhbGFuY2UuaDogQWRkaW5nIGEgdHlwZSB0byB0aGUKKwljb2xvcmJhbGFuY2UgaW50ZXJmYWNlIHN0YXRpbmcgaWYgaXQgaXMgaGFyZHdhcmUgYmFzZWQgb3Igc29mdHdhcmUKKwliYXNlZC4KKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYzogKGdzdF92aWRlb2JhbGFuY2VfcGxhbmFyNDExKToKKwlSZW1vdmluZyBhIHRyYWlsaW5nIGNvbW1hLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua194Y29udGV4dF9nZXQpLAorCShnc3RfeHZpbWFnZXNpbmtfY29sb3JiYWxhbmNlX2luaXQpOiBJbnRlZ3JhdGluZyBhIHBhdGNoIGZyb20gSm9uCisJVHJvd2JyaWRnZSA8dHJvd0B4aW1pYW4uY29tPiBxdWVyeWluZyBYdiBhZGFwdG9yIGZvciBtaW4vbWF4IHZhbHVlIGFzCisJdGhlIGRvY3VtZW50YXRpb24gc2VlbXMgdG8gYmUgd3Jvbmcgb24gdGhlIC0xMDAwIHRvIDEwMDAgaW50ZXJ2YWwuCisKKzIwMDQtMDEtMTIgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2RlYnVnL2VmZW5jZS5jOiAoZ3N0X2VmZW5jZV9pbml0KSwgKGdzdF9lZmVuY2VfY2hhaW4pLAorCShnc3RfZWZlbmNlX2J1ZmZlcl9hbGxvYyksIChnc3RfZmVuY2VkX2J1ZmZlcl9uZXcpLAorCShnc3RfZmVuY2VkX2J1ZmZlcl9kZWZhdWx0X2ZyZWUpLCAoZ3N0X2ZlbmNlZF9idWZmZXJfZGVmYXVsdF9jb3B5KToKKwlGaXggbmVnb3RpYXRpb24uICBBZGQgYSBidWZmZXJhbGxvYyBmdW5jdGlvbiBmb3IgdGhlIHNpbmsgcGFkLAorCWFuZCBnZW5lcmFsbHkgY2xlYW4gdXAgc29tZSBvZiB0aGUgY29kZS4KKworMjAwNC0wMS0xMiAgSnVsaWVuIE1PVVRURSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9jb2xvcmJhbGFuY2UvY29sb3JiYWxhbmNlY2hhbm5lbC5jOgorCShnc3RfY29sb3JfYmFsYW5jZV9jaGFubmVsX2Rpc3Bvc2UpOiBBZGRpbmcgc2FmZXR5IGNoZWNrIGluIGRpc3Bvc2UKKwltZXRob2QuCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX3hjb250ZXh0X2dldCksCisJKGdzdF94dmltYWdlc2lua194Y29udGV4dF9jbGVhciksCisJKGdzdF94dmltYWdlc2lua19pbnRlcmZhY2Vfc3VwcG9ydGVkKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NvbG9yYmFsYW5jZV9saXN0X2NoYW5uZWxzKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2NvbG9yYmFsYW5jZV9zZXRfdmFsdWUpLAorCShnc3RfeHZpbWFnZXNpbmtfY29sb3JiYWxhbmNlX2dldF92YWx1ZSksCisJKGdzdF94dmltYWdlc2lua19jb2xvcmJhbGFuY2VfaW5pdCksIChnc3RfeHZpbWFnZXNpbmtfZ2V0X3R5cGUpOgorCUFkZGluZyBjb2xvcmJhbGFuY2UgaW50ZXJmYWNlIHN1cHBvcnQgdG8gc2V0IFhWIHBhcmFtZXRlcnMgc3VjaCBhcworCUhVRSwgQlJJR0hUTkVTUywgQ09OVFJBU1QsIFNBVFVSQVRJT04uCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5oOiBBZGRpbmcgdGhlIGNoYW5uZWxzIGxpc3QgZm9yIGNvbG9yYmFsYW5jZQorCWludGVyZmFjZS4KKworMjAwNC0wMS0xMiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKGdzdF9hdWRpb19jb252ZXJ0X2dldF90eXBlKSwKKwkoZ3N0X2F1ZGlvX2NvbnZlcnRfY2xhc3NfaW5pdCksIChnc3RfYXVkaW9jb252ZXJ0X2dldGNhcHMpLAorCShnc3RfYXVkaW9fY29udmVydF9pbml0KSwgKGdzdF9hdWRpb19jb252ZXJ0X3NldF9wcm9wZXJ0eSksCisJKGdzdF9hdWRpb19jb252ZXJ0X2dldF9wcm9wZXJ0eSksIChnc3RfYXVkaW9fY29udmVydF9jaGFpbiksCisJKGdzdF9hdWRpb19jb252ZXJ0X2xpbmspLAorCShnc3RfYXVkaW9fY29udmVydF9idWZmZXJfdG9fZGVmYXVsdF9mb3JtYXQpLAorCShnc3RfYXVkaW9fY29udmVydF9idWZmZXJfZnJvbV9kZWZhdWx0X2Zvcm1hdCksIChwbHVnaW5faW5pdCk6CisgICAgICAgICAgLSBpbXBsZW1lbnQgX2dldGNhcHMgYW5kIHVzZSBpdAorICAgICAgICAgIC0gaW1wcm92ZSBsaW5raW5nCisgICAgICAgICAgLSByZW1vdmUgZmxvYXQgY2FwcyBzaW5jZSBubyBmbG9hdCBjb252ZXJzaW9uIGlzIGFjdHVhbGx5IGRvbmUKKyAgICAgICAgICAtIHJlbW92ZSBwcm9wZXJ0aWVzIGFuZCBhcmd1bWVudHMgdGhhdCB3ZXJlIHRvIGJlIHVzZWQgZm9yIHJhdGUKKyAgICAgICAgICAgIGNvbnZlcnNpb24KKworMjAwNC0wMS0xMiAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSAgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKworCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2F1ZGlvLmM6IChfZ3N0X2F1ZGlvX3N0cnVjdHVyZV9zZXRfbGlzdCksCisJKGdzdF9hdWRpb19zdHJ1Y3R1cmVfc2V0X2ludCk6CisJKiBnc3QtbGlicy9nc3QvYXVkaW8vYXVkaW8uaDoKKyAgICAgICAgICBhZGQgaGVscGVyIGZ1bmN0aW9ucyBmb3IgX2dldGNhcHMgbWF0Y2hpbmcgdGhlIHN0YW5kYXJkIGF1ZGlvCisgICAgICAgICAgdGVtcGxhdGVzCisKKzIwMDQtMDEtMTIgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L2F1ZGlvY29udmVydC9nc3RhdWRpb2NvbnZlcnQuYzogKGdzdF9hdWRpb19jb252ZXJ0X2xpbmspOgorCVRlc3QgdGhhdCBwYWQgaXMgbmVnb3RpYXRlZCBiZWZvcmUgZ2V0dGluZyBpdHMgY2Fwcy4KKworMjAwNC0wMS0xMiAgSnVsaWVuIE1PVVRURSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGdzdC1saWJzL2dzdC9wbGF5L2dzdHBsYXkuYzogKGdzdF9wbGF5X2dldF9zaW5rX2VsZW1lbnQpOiBXaGVuCisJYW5hbHl6aW5nIHRoZSBwYWRzIG9mIGFuIGVsZW1lbnQgdGhlIGJpbiBpcyBtb3N0bHkgaW4gUkVBRFkgc3RhdGUgc28KKwlubyBjYXBzIHdlcmUgbmVnb3RpYXRlZC4gVGhpcyBoZWxwZXIgZnVuY3Rpb24gbmVlZHMgdG8gd29yayB3aXRoCisJX2dldF9jYXBzIGRpcmVjdGx5IHRoZW4uIEkgd2FzIG5vdCBmcmVlaW5nIHRoZW0gdGhvdWdoLCBhZGRlZCB0aGF0IHRvCisJZml4IHRoZSBtZW0gbGVhay4KKworMjAwNC0wMS0xMiAgSnVsaWVuIE1PVVRURSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfY2hhaW4pOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19jaGFpbik6IEZpeGluZyB0aGUKKwlkaXJlY3QgcHV0IGJ1ZmZlcnMgZGV0ZWN0aW9uLiBJIHByZWZlciBjaGVja2luZyBHU1RfQlVGRkVSX1BSSVZBVEUKKwl0aGFuIHRoZSBmcmVlX2Z1bmMuCisKKzIwMDQtMDEtMTIgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIHN5cy9vc3MvZ3N0b3NzYXVkaW8uYzogKHBsdWdpbl9pbml0KToKKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5jOiAoZ3N0X29zc2VsZW1lbnRfc3luY19wYXJtcyk6CisJKiBzeXMvb3NzL2dzdG9zc2VsZW1lbnQuaDoKKyAgICAgICAgICBtYWtlIGFuIG9zcyBkZWJ1Z2dpbmcgY2F0ZWdvcnkKKyAgICAgICAgICBtYWtlIGZhaWx1cmUgbW9yZSBkZXNjcmlwdGl2ZQorCisyMDA0LTAxLTExICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnLmM6CisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2NvZGVjbWFwLmM6CisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2RlYy5jOgorCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdlbmMuYzoKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVncHJvdG9jb2wuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka2FuaW1hdGlvbi5jOgorCSogZXh0L2pwZWcvZ3N0anBlZy5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmcuYzoKKwkqIGV4dC9tcGVnMmRlYy9wZXJmdGVzdC5jOgorCSogZXh0L3NwZWV4L2dzdHNwZWV4LmM6CisJKiBnc3QtbGlicy9nc3QvcmVzYW1wbGUvZHRvcy5jOgorCSogZ3N0L2ludGZsb2F0L2dzdGludGZsb2F0Y29udmVydC5jOgorCSogZ3N0L29uZXRvbi9nc3RvbmV0b24uYzoKKwkqIGdzdC9ydGpwZWcvUlRqcGVnLmM6CisJKiBnc3QvcnRwL2dzdHJ0cC5jOgorCSogc3lzL2R4cjMvZHhyM2luaXQuYzoKKwkqIHN5cy9nbHNpbmsvZ3N0Z2xfbnZpbWFnZS5jOgorCSogc3lzL2dsc2luay9nc3RnbF9wZHJpbWFnZS5jOgorCSogc3lzL2dsc2luay9nc3RnbHNpbmsuYzoKKwkqIHRlc3RzdWl0ZS9nc3QtbGludDoKKwlNYWtlIHN1cmUgZXZlcnlib2R5IHdyYXBzICNpbmNsdWRlICJjb25maWcuaCIgaW4gI2lmZGVmIEhBVkVfQ09ORklHX0gKKworMjAwNC0wMS0xMSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhc3JjLmM6IChnc3RfYWxzYV9zcmNfc2V0X2NhcHMpOgorCSogZXh0L2ZhYWMvZ3N0ZmFhYy5jOiAoZ3N0X2ZhYWNfc2lua2Nvbm5lY3QpOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrYW5pbWF0aW9uLmM6CisJKGdzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfY3JlYXRlX3BpeGJ1Zik6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzogKGdzdF9nZGtfcGl4YnVmX3NpbmtfbGluayksCisJKGdzdF9nZGtfcGl4YnVmX2NoYWluKToKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5oOgorCSogZXh0L2phY2svZ3N0amFjay5jOiAoZ3N0X2phY2tfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC94dmlkL2dzdHh2aWRkZWMuYzogKGdzdF94dmlkZGVjX3NpbmtfbGluayk6CisJKiBnc3QtbGlicy9nc3QvcGxheS9nc3RwbGF5LmM6IChnc3RfcGxheV9nZXRfc2lua19lbGVtZW50KToKKwkqIGdzdC1saWJzL2dzdC9wbGF5L3BsYXkuYzogKGdzdF9wbGF5X2dldF9zaW5rX2VsZW1lbnQpOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmlsdGVyLmM6CisJKGdzdF92aWRlb2ZpbHRlcl9zZXRfb3V0cHV0X3NpemUpOgorCVJlbW92ZSBhbGwgdXNhZ2Ugb2YgZ3N0X3BhZF9nZXRfY2FwcygpLCBhbmQgcmVwbGFjZSBpdCB3aXRoCisJZ3N0X3BhZF9nZXRfYWxsb3dlZF9jYXBzKCkgb3IgZ3N0X3BhZF9nZXRfbmVnb3RpYXRlZF9jYXAoKS4KKworMjAwNC0wMS0xMSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06IEZpeGVzIHRvIG1ha2UgZXh0L2xpYmNhY2EgY29tcGlsZS4KKwkqIGV4dC9kaXZ4L2dzdGRpdnhkZWMuYzoKKwkqIGV4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1Zi5jOiAoZ3N0X2dka19waXhidWZfc2lua19saW5rKSwKKwkoZ3N0X2dka19waXhidWZfaW5pdCksIChnc3RfZ2RrX3BpeGJ1Zl9jaGFpbik6IE1ha2UgZ2RrcGl4YnVmZGVjCisJaGFuZGxlIGltYWdlcyB0aGF0IHNwYW4gbXVsdGlwbGUgYnVmZmVycy4gIE5vdyB3b3JrIHdpdGggYm90aAorCWZpbGVzcmMgISBnZGtwaXhidWZkZWMgYW5kIHF0ZGVtdXggISBnZGtwaXhidWZkZWMuCisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuaDoKKwkqIGV4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmg6IEZpeGVzIG5lZWRlZCBkdWUgdG8gcmVjZW50CisJdmlkZW8vdmlkZW8uaCBjaGFuZ2VzCisJKiBleHQveHZpZC9nc3R4dmlkLmM6IChnc3RfeHZpZF9jc3BfdG9fY2Fwcyk6IHNhbWUKKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzcmMuYzogKGdzdF92NGxtanBlZ3NyY19nZXQpLAorCShnc3RfdjRsbWpwZWdzcmNfYnVmZmVyX2ZyZWUpOiBVc2UgYnVmZmVyIGZyZWUgZnVuY3Rpb24gaW5zdGVhZAorCW9mIEdzdERhdGEgZnJlZSBmdW5jdGlvbi4KKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX2dldCksIChnc3RfdjRsc3JjX2J1ZmZlcl9mcmVlKToKKwlzYW1lLgorCisyMDA0LTAxLTEyICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIHN5cy92NGwyL2dzdHY0bDJlbGVtZW50LmM6IChnc3RfdjRsMmVsZW1lbnRfY2xhc3NfaW5pdCksCisJKGdzdF92NGwyZWxlbWVudF9kaXNwb3NlKSwgKGdzdF92NGwyZWxlbWVudF9zZXRfcHJvcGVydHkpLAorCShnc3RfdjRsMmVsZW1lbnRfZ2V0X3Byb3BlcnR5KToKKwkqIHN5cy92NGwyL3Y0bDJfY2FsbHMuYzogKGdzdF92NGwyX3NldF9kZWZhdWx0cyksIChnc3RfdjRsMl9vcGVuKToKKwkgIGFkZCBub3JtLCBjaGFubmVsIGFuZCBmcmVxdWVuY3kgcHJvcGVydGllcy4KKwkqIHN5cy92NGwyL2dzdHY0bDJ0dW5lci5jOgorCSAgZml4ZXMgZm9yIHR1bmVyIGludGVyZmFjZSBjaGFuZ2VzCisJKiBzeXMvdjRsMi9nc3R2NGwyZWxlbWVudC5oOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5jOgorCSogc3lzL3Y0bDIvZ3N0djRsMnNyYy5oOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5jOgorCSogc3lzL3Y0bDIvdjRsMnNyY19jYWxscy5oOgorCSAgcmV3b3JrIHY0bDJzcmMgdG8gd29yayB3aXRoIHNhYTE3MzQgY2FyZHMgYW5kIGFsbG93IG1tYXBlZCBidWZmZXJzLgorCisyMDA0LTAxLTEyICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC1saWJzL2dzdC90dW5lci90dW5lci5jOiAoZ3N0X3R1bmVyX2NsYXNzX2luaXQpLAorCShnc3RfdHVuZXJfZmluZF9ub3JtX2J5X25hbWUpLCAoZ3N0X3Y0bDJfZmluZF9jaGFubmVsX2J5X25hbWUpLAorCShnc3RfdHVuZXJfY2hhbm5lbF9jaGFuZ2VkKSwgKGdzdF90dW5lcl9ub3JtX2NoYW5nZWQpLAorCShnc3RfdHVuZXJfZnJlcXVlbmN5X2NoYW5nZWQpLCAoZ3N0X3R1bmVyX3NpZ25hbF9jaGFuZ2VkKToKKwkqIGdzdC1saWJzL2dzdC90dW5lci90dW5lci5oOgorCSAgR09iamVjdHMgYXJlbid0IGNvbnN0LgorCSAgQWRkIGZpbmRfYnlfbmFtZSBmdW5jdGlvbnMuCisJICBBZGQgY2hlY2tzIHRvIF9jaGFuZ2VkIGZ1bmN0aW9ucy4KKwkqIHN5cy92NGwvZ3N0djRsdHVuZXIuYzogKGdzdF92NGxfdHVuZXJfZ2V0X2NoYW5uZWwpLAorCShnc3RfdjRsX3R1bmVyX2dldF9ub3JtKToKKwkgIEZpeGVzIGZvciBhYm92ZS4KKworMjAwNC0wMS0xMiAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBnc3QtbGlicy9nc3QvdmlkZW8vdmlkZW8uaDoKKwkgIEZpeCBjYXBzIHRlbXBsYXRlIG5hbWVzIHRvIGJlIHVuZGVyc3RhbmRhYmxlLgorCSAgUHJlZml4IGV2ZXJ5dGhpbmcgd2l0aCBHU1RfVklERU8uCisJKiBleHQvYWFsaWIvZ3N0YWFzaW5rLmM6CisJKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6CisJKiBleHQvZGl2eC9nc3RkaXZ4ZW5jLmM6CisJKiBleHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWYuYzoKKwkqIGV4dC9oZXJtZXMvZ3N0Y29sb3JzcGFjZS5jOiAoZ3N0X2NvbG9yc3BhY2VfYmFzZV9pbml0KToKKwkqIGV4dC9qcGVnL2dzdGpwZWdkZWMuYzogKHJhd19jYXBzX2ZhY3RvcnkpOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOiAocmF3X2NhcHNfZmFjdG9yeSk6CisJKiBleHQvbGliY2FjYS9nc3RjYWNhc2luay5jOgorCSogZXh0L2xpYnBuZy9nc3RwbmdlbmMuYzogKHJhd19jYXBzX2ZhY3RvcnkpOgorCSogZXh0L3NuYXBzaG90L2dzdHNuYXBzaG90LmM6CisJKiBleHQvc3dmZGVjL2dzdHN3ZmRlYy5jOgorCSogZXh0L3h2aWQvZ3N0eHZpZGRlYy5jOgorCSogZXh0L3h2aWQvZ3N0eHZpZGVuYy5jOgorCSogZ3N0L2NoYXJ0L2dzdGNoYXJ0LmM6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzoKKwkqIGdzdC9lZmZlY3R2L2dzdGVmZmVjdHYuYzoKKwkqIGdzdC9mbHgvZ3N0Zmx4ZGVjLmM6IChnc3RfZmx4ZGVjX2xvb3ApOgorCSogZ3N0L2dvb20vZ3N0Z29vbS5jOgorCSogZ3N0L21lZGlhbi9nc3RtZWRpYW4uYzoKKwkqIGdzdC9tb25vc2NvcGUvZ3N0bW9ub3Njb3BlLmM6IChnc3RfbW9ub3Njb3BlX2luaXQpLAorCShnc3RfbW9ub3Njb3BlX3NyY2Nvbm5lY3QpLCAoZ3N0X21vbm9zY29wZV9jaGFpbik6CisJKiBnc3Qvb3ZlcmxheS9nc3RvdmVybGF5LmM6CisJKiBnc3Qvc21vb3RoL2dzdHNtb290aC5jOgorCSogZ3N0L3NtcHRlL2dzdHNtcHRlLmM6CisJKiBnc3Qvc3luYWVzdGhlc2lhL2dzdHN5bmFlc3RoZXNpYS5jOgorCSogZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYzoKKwkqIGdzdC92aWRlb2Ryb3AvZ3N0dmlkZW9kcm9wLmM6CisJKiBnc3QveTRtL2dzdHk0bWVuY29kZS5jOgorCSogc3lzL3FjYW0vZ3N0cWNhbXNyYy5jOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzogKGdzdF92NGxzcmNfcGFsZXR0ZV90b19jYXBzKToKKwkgIE1ha2UgdGhlbSB3b3JrIHdpdGggbmV3IHZpZGVvLmggZmlsZS4KKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfY2hhaW4pLAorCShnc3RfeGltYWdlc2lua19idWZmZXJfZnJlZSksIChnc3RfeGltYWdlc2lua19idWZmZXJfYWxsb2MpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19jaGFpbiksCisJKGdzdF94dmltYWdlc2lua19idWZmZXJfZnJlZSksIChnc3RfeHZpbWFnZXNpbmtfYnVmZmVyX2FsbG9jKToKKwkgIE1ha2UgaXQgd29yayB3aXRoIG5ldyBidWZmZXIgYWxsb2NhdGlvbiBzeXN0ZW0uCisKKzIwMDQtMDEtMTEgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdjb2xvcnNwYWNlLmM6IChnc3RfZmZtcGVnY3NwX2NoYWluKTogRml4aW5nIHRoZQorCXBhZF9hbGxvY19idWZmZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlIC0+c3JjcGFkCisJKiBleHQvaGVybWVzL2dzdGNvbG9yc3BhY2UuYzogKGdzdF9jb2xvcnNwYWNlX2NoYWluKTogRml4aW5nIHRoZQorICAgICAgICBwYWRfYWxsb2NfYnVmZmVyIGltcGxlbWVudGF0aW9uIHRvIHVzZSAtPnNyY3BhZAorCSogZ3N0L3ZpZGVvc2NhbGUvZ3N0dmlkZW9zY2FsZS5jOiAoZ3N0X3ZpZGVvc2NhbGVfY2hhaW4pOiAgRml4aW5nIHRoZQorICAgICAgICBwYWRfYWxsb2NfYnVmZmVyIGltcGxlbWVudGF0aW9uIHRvIHVzZSAtPnNyY3BhZAorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua194aW1hZ2VfbmV3KSwKKwkoZ3N0X3hpbWFnZXNpbmtfY2hhaW4pLCAoZ3N0X3hpbWFnZXNpbmtfYnVmZmVyX2ZyZWUpLAorCShnc3RfeGltYWdlc2lua19idWZmZXJfYWxsb2MpOiBOb3cgb25seSB1c2UgR1NUX0JVRkZFUl9QUklWQVRFIHRvIGtlZXAKKwlhIHJlZmVyZW5jZSB0byBldmVyeXRoaW5nIHdlIG5lZWQuCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuaDogYWRkaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBzaW5rIGluIHRoZSBpbWFnZS4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfeHZpbWFnZV9uZXcpLAorCShnc3RfeHZpbWFnZXNpbmtfY2hhaW4pLCAoZ3N0X3h2aW1hZ2VzaW5rX2J1ZmZlcl9mcmVlKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2J1ZmZlcl9hbGxvYyk6IE5vdyBvbmx5IHVzZSBHU1RfQlVGRkVSX1BSSVZBVEUgdG8ga2VlcAorICAgICAgICBhIHJlZmVyZW5jZSB0byBldmVyeXRoaW5nIHdlIG5lZWQuCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5oOiBhZGRpbmcgYSByZWZlcmVuY2UgdG8gdGhlIHNpbmsgaW4gdGhlIGltYWdlCisKKzIwMDQtMDEtMTEgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2RpdngvZ3N0ZGl2eGVuYy5jOiByZW1vdmUgYm9ndXMgZ3N0X2NhcHNfaXNfZml4ZWQoKSB0ZXN0CisJKiBnc3QvZGVidWcvZWZlbmNlLmM6IChnc3RfZWZlbmNlX2NoYWluKSwgKGdzdF9mZW5jZWRfYnVmZmVyX25ldyksCisJKGdzdF9mZW5jZWRfYnVmZmVyX2RlZmF1bHRfY29weSk6IEZpeCBmb3IgcmVuYW1lIG9mIGJ1ZmZlciBwcml2YXRlCisJc3RydWN0dXJlIG1lbWJlcnMuCisJKiBnc3QvZWZmZWN0di9nc3R3YXJwLmM6IChnc3Rfd2FycHR2X3NldHVwKTogRG9uJ3QgcmVzZXQgdGhlIHRpbWUKKwl2YWx1ZSBkdXJpbmcgYSByZXNpemUvcmVuZWdvdGlhdGlvbi4KKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZpbHRlci5jOiAoZ3N0X3ZpZGVvZmlsdGVyX2NoYWluKTogdXNlCisJZ3N0X3BhZF9hbGxvY19idWZmZXIoKTsKKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzcmMuYzogKGdzdF92NGxtanBlZ3NyY19nZXQpLAorCShnc3RfdjRsbWpwZWdzcmNfYnVmZmVyX2ZyZWUpOiBGaXggZm9yIHJlbmFtZSBvZiBidWZmZXIgcHJpdmF0ZQorCXN0cnVjdHVyZSBtZW1iZXJzLgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzogKGdzdF92NGxzcmNfZ2V0KSwgKGdzdF92NGxzcmNfYnVmZmVyX2ZyZWUpOgorCUZpeCBmb3IgcmVuYW1lIG9mIGJ1ZmZlciBwcml2YXRlIHN0cnVjdHVyZSBtZW1iZXJzLgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19jaGFpbiksCisJKGdzdF94aW1hZ2VzaW5rX2J1ZmZlcl9mcmVlKSwgKGdzdF94aW1hZ2VzaW5rX2J1ZmZlcl9hbGxvYyk6CisJRml4IGZvciByZW5hbWUgb2YgYnVmZmVyIHByaXZhdGUgc3RydWN0dXJlIG1lbWJlcnMuCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2NoYWluKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2J1ZmZlcl9mcmVlKSwgKGdzdF94dmltYWdlc2lua19idWZmZXJfYWxsb2MpOgorCUZpeCBmb3IgcmVuYW1lIG9mIGJ1ZmZlciBwcml2YXRlIHN0cnVjdHVyZSBtZW1iZXJzLgorCisyMDA0LTAxLTExICBBcndlZCB2LiBNZXJrYXR6IDx2Lm1lcmthdHpAZ214Lm5ldD4KKworCXJldmlld2VkIGJ5OiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3ZpZGVvZmlsdGVyL01ha2VmaWxlLmFtOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmM6IEdhbW1hIGNvcnJlY3Rpb24gZmlsdGVyLiAgTW9kaWZpZWQKKwlmcm9tIHRoZSBwYXRjaCBieSBkcyB0byBmaXQgaW4gd2l0aCByZWNlbnQgbWFrZV9maWx0ZXIgY2hhbmdlcy4KKworMjAwNC0wMS0xMSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBjb25maWd1cmUuYWM6IEFkZGluZyBleGFtcGxlcy9zd2l0Y2gvTWFrZWZpbGUKKwkqIGV4YW1wbGVzL01ha2VmaWxlLmFtOiBBZGRpbmcgZXhhbXBsZXMvc3dpdGNoCisJKiBleGFtcGxlcy9zd2l0Y2gvTWFrZWZpbGUuYW06IEFkZGluZyBzd2l0Y2hlciBleGFtcGxlLgorCSogZXhhbXBsZXMvc3dpdGNoL3N3aXRjaGVyLmM6IChnb3RfZW9zKSwgKGlkbGVfaXRlcmF0ZSksCisJKHN3aXRjaF90aW1lciksIChtYWluKTogQWRkaW5nIGFuIGV4YW1wbGUgZGVtb25zdHJhdGluZyBzd2l0Y2ggdXNhZ2UKKwl3aXRoIDIgdmlkZW90ZXN0c3JjIHNob3dpbmcgZGlmZmVyZW50IHBhdHRlcm5zLgorCSogZ3N0L3N3aXRjaC9nc3Rzd2l0Y2guYzogKGdzdF9zd2l0Y2hfcmVxdWVzdF9uZXdfcGFkKSwKKwkoZ3N0X3N3aXRjaF9pbml0KTogRml4aW5nIHN3aXRjaCB3aXRoIHRoZSBuZXcgY2FwcyBzeXN0ZW0uCisKKzIwMDQtMDEtMTEgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0LWxpYnMvZ3N0L3ZpZGVvL3ZpZGVvLmg6CisJICBGaXggMzJiaXQgY2Fwcy4gSXNzdWUgcmVtYWluaW5nOiBUaGUgbWFjcm8gbmFtZXMgYXJlIGNob3NlbiBwb29ybHkuCisJICBUaGV5IHNob3VsZCBwcm9iYWJseSBiZSBsaWtlCisJICBHU1RfVklERU9fUEFEX1RFTVBMQVRFX0NBUFNfe1JHQixCR1IsUkdCeCxCR1J4fS4KKworMjAwNC0wMS0xMSAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX2hlYWRlciksCisJKHF0ZGVtdXhfcGFyc2VfdHJhayk6CisJICBmaXggYXVkaW8gY2h1bmsgc2l6ZS90aW1lc3RhbXAgY2FsY3VsYXRpb24KKworMjAwNC0wMS0xMSAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2NvZGVjbWFwLmM6IChnc3RfZmZtcGVnX2NvZGVjaWRfdG9fY2Fwcyk6CisJICBmaXggU1ZRMyBjYXBzCisKKzIwMDQtMDEtMTEgIFN0ZXZlIEJha2VyICA8c3RldmVAc3RldmViYWtlci5vcmc+CisKKwkqIGdzdC9lZmZlY3R2L2dzdGFnaW5nLmM6IChnc3RfYWdpbmd0dl9nZXRfdHlwZSksCisJKGdzdF9hZ2luZ3R2X2Jhc2VfaW5pdCksIChnc3RfYWdpbmd0dl9jbGFzc19pbml0KSwKKwkoZ3N0X2FnaW5ndHZfaW5pdCksIChnc3RfYWdpbmd0dl9zZXR1cCksIChnc3RfYWdpbmd0dl9yZ2IzMiksCisJKGdzdF9hZ2luZ3R2X3NldF9wcm9wZXJ0eSksIChnc3RfYWdpbmd0dl9nZXRfcHJvcGVydHkpOgorICAgICAgICBQb3J0IGFnaW5nVFYgdG8gdmlkZW9maWx0ZXIKKworMjAwNC0wMS0wOSAgSnVsaWVuIE1PVVRURSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisKKwkqIGV4dC9oZXJtZXMvZ3N0Y29sb3JzcGFjZS5jOiAoZ3N0X2NvbG9yc3BhY2VfY2hhaW4pOgorCUltcGxlbWVudGluZyBnc3RfcGFkX2FsbG9jX2J1ZmZlciB0byB1c2Ugb3B0aW1pemVkIGJ1ZmZlciBhbGxvY2F0aW9uLgorCisyMDA0LTAxLTA5ICBKdWxpZW4gTU9VVFRFIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdjb2xvcnNwYWNlLmM6IChnc3RfZmZtcGVnY3NwX2NoYWluKToKKwlJbXBsZW1lbnRpbmcgZ3N0X3BhZF9hbGxvY19idWZmZXIgdG8gdXNlIG9wdGltaXplZCBidWZmZXIgYWxsb2NhdGlvbi4KKwkqIGdzdC1saWJzL2dzdC94b3ZlcmxheS94b3ZlcmxheS5jOgorCShnc3RfeF9vdmVybGF5X2dvdF9kZXNpcmVkX3NpemUpOiBVcGRhdGluZyBkb2MgZm9yIHRoZSB4aWQgYmVpbmcgMC4KKwkqIGdzdC92aWRlb3NjYWxlL2dzdHZpZGVvc2NhbGUuYzogKGdzdF92aWRlb3NjYWxlX2NoYWluKToKKwlJbXBsZW1lbnRpbmcgZ3N0X3BhZF9hbGxvY19idWZmZXIgdG8gdXNlIG9wdGltaXplZCBidWZmZXIgYWxsb2NhdGlvbi4KKwkqIGdzdC92aWRlb3Rlc3RzcmMvZ3N0dmlkZW90ZXN0c3JjLmM6IChnc3RfdmlkZW90ZXN0c3JjX2dldCk6CisJSW1wbGVtZW50aW5nIGdzdF9wYWRfYWxsb2NfYnVmZmVyIHRvIHVzZSBvcHRpbWl6ZWQgYnVmZmVyIGFsbG9jYXRpb24uCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2NoYWluKSwKKwkoZ3N0X3hpbWFnZXNpbmtfYnVmZmVyX2ZyZWUpLCAoZ3N0X3hpbWFnZXNpbmtfYnVmZmVyX2FsbG9jKSwKKwkoZ3N0X3hpbWFnZXNpbmtfc2V0X3h3aW5kb3dfaWQpLCAoZ3N0X3hpbWFnZXNpbmtfaW5pdCk6IEltcGxlbWVudGluZworCXRoZSBidWZmZXJhbGxvY19mdW5jdGlvbiB0byByZXBsYWNlIGJ1ZmZlcnBvb2xzLCBmaXhpbmcgdGhlIFhPdmVybGF5CisJaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIHRvIGhhbmRsZSB4aWQgYmVpbmcgMCBhbmQgZml4IHNvbWUgYnVncworCXRyaWdnZXJlZCBieSBCZW5qYW1pbidzIHRlc3RjYXNlLgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19jaGFpbiksCisJKGdzdF94dmltYWdlc2lua19idWZmZXJfZnJlZSksIChnc3RfeHZpbWFnZXNpbmtfYnVmZmVyX2FsbG9jKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3NldF94d2luZG93X2lkKSwgKGdzdF94dmltYWdlc2lua19pbml0KTogSW1wbGVtZW50aW5nCisJdGhlIGJ1ZmZlcmFsbG9jX2Z1bmN0aW9uIHRvIHJlcGxhY2UgYnVmZmVycG9vbHMsIGZpeGluZyB0aGUgWE92ZXJsYXkKKwlpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gdG8gaGFuZGxlIHhpZCBiZWluZyAwIGFuZCBmaXggc29tZSBidWdzCisJdHJpZ2dlcmVkIGJ5IEJlbmphbWluJ3MgdGVzdGNhc2UuCisKKzIwMDQtMDEtMDkgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZXh0L2xpYnJmYi9nc3RyZmJzcmMuYzogIEhhY2tpbmcuICBBZGRlZCBhY3R1YWwgZGVjb2RpbmcgYW5kCisJbW91c2UgcG9pbnRlciBldmVudHMuICBJdCB3b3Jrcy4KKworMjAwNC0wMS0wOSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2RpdngvZ3N0ZGl2eGVuYy5jOiAoZ3N0X2RpdnhlbmNfaW5pdCk6CisJICBVc2UgZXhwbGljaXQgY2FwcyAtIGZpeCBjYXBzbmVnby4KKwkqIGV4dC94dmlkL2dzdHh2aWRkZWMuYzoKKwkqIGV4dC94dmlkL2dzdHh2aWRlbmMuYzoKKwkgIFJlbW92ZSBtYWNyby1pbnNpZGUtbWFjcm8gd2hpY2ggY2F1c2VkIGNvbXBpbGUgZXJyb3JzLgorCSogZ3N0LWxpYnMvZ3N0L3JpZmYvcmlmZi1yZWFkLmM6IChnc3RfcmlmZl9yZWFkX2hlYWRlcik6CisJICBFcnJvciBvdXQgaWYgaXQncyBub3QgYSBSSUZGIGZpbGUuIEVsc2Ugd2UgZXJyb3Igb3V0IHdpdGhvdXQKKwkgIGdzdF9lbGVtZW50X2Vycm9yKCkgd2hpY2ggaXMgbm90IGdvb2QuLi4KKworMjAwNC0wMS0wOCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2VuYy5jOiAoZ3N0X2ZmbXBlZ2VuY19jb25uZWN0KToKKwlGaXggcGFkX2xpbmsgZnVuY3Rpb24gdG8gaGFuZGxlIGZvcm1hdHMgdGhhdCBmZm1wZWcgcmV0dXJucworCWFzIG11bHRpcGxlIGNhcHMgc3RydWN0dXJlcy4KKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZpbHRlci5jOiAoZ3N0X3ZpZGVvZmlsdGVyX2NoYWluKToKKwlPbmx5IGNvbXBsYWluIGlmIHNvdXJjZSBidWZmZXIgaXMgX3NtYWxsZXJfIHRoYW4gZXhwZWN0ZWQuCisJKiBnc3QvdmlkZW9zY2FsZS9nc3R2aWRlb3NjYWxlLmM6IChnc3RfdmlkZW9zY2FsZV9pbml0KSwKKwkoZ3N0X3ZpZGVvc2NhbGVfaGFuZGxlX3NyY19ldmVudCk6IFJlc2l6ZSBuYXZpZ2F0aW9uIGV2ZW50cworCXdoZW4gcGFzc2luZyB0aGVtIHVwc3RyZWFtLgorCSogZ3N0L3ZpZGVvdGVzdHNyYy9nc3R2aWRlb3Rlc3RzcmMuYzoKKwkqIGdzdC92aWRlb3Rlc3RzcmMvZ3N0dmlkZW90ZXN0c3JjLmg6CisJKiBnc3QvdmlkZW90ZXN0c3JjL3ZpZGVvdGVzdHNyYy5jOgorCSogZ3N0L3ZpZGVvdGVzdHNyYy92aWRlb3Rlc3RzcmMuaDoKKwlSZXdyaXRlIG1hbnkgb2YgdGhlIGJ1ZmZlciBwYWludGluZyBmdW5jdGlvbnMgdG8gaGFuZGxlIG9kZAorCXNpemVzIChmb3IgbWFueSBmb3JtYXRzLCBzaXplJTQhPTAgb3Igc2l6ZSU4IT0wKS4gIE1vc3QgaGF2ZQorCWJlZW4gdmVyaWZpZWQgdG8gd29yayB3aXRoIG15IHZpZGVvIGNhcmQuCisJKiB0ZXN0c3VpdGUvZ3N0LWxpbnQ6ICBBZGQgY2hlY2sgZm9yIGVsZW1lbnRzIGNhbGxpbmcKKwlnc3RfcGFkX2dldF9jYXBzKCkgaW5zdGVhZCBvZiBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMoKS4KKworMjAwNC0wMS0wOCAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvdmlkZW9kcm9wL2dzdHZpZGVvZHJvcC5jOiAoZ3N0X3ZpZGVvZHJvcF9nZXRjYXBzKSwKKwkoZ3N0X3ZpZGVvZHJvcF9saW5rKSwgKGdzdF92aWRlb2Ryb3BfaW5pdCk6IEZpeCBuZWdvdGlhdGlvbi4KKworMjAwNC0wMS0wOCAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2hhbmRsZV94ZXZlbnRzKTogQQorCWNvbmZpZ3VyZSBldmVudCBpcyBub3QgZW1pdGluZyB0aGUgZGVzaXJlZCBzaXplIHNpZ25hbC4gVGhhdCBmaXhlcworCWFzcGVjdCByYXRpbyBpc3N1ZXMgd2l0aCBnc3QtcGxheWVyLgorCisyMDA0LTAxLTA4ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbWVkaWFuL2dzdG1lZGlhbi5jOiAoZ3N0X21lZGlhbl9saW5rKSwgKGdzdF9tZWRpYW5faW5pdCk6CisJICBGaXggY2Fwc25lZ28uCisKKzIwMDQtMDEtMDggIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZXh0L3NkbC9zZGx2aWRlb3NpbmsuYzogKGdzdF9zZGx2aWRlb3NpbmtfY3JlYXRlKTogVXNpbmcgWE92ZXJsYXkKKwlwdWJsaWMgbWV0aG9kIHRvIGZpcmUgc2l6ZSBzaWduYWwuCisKKzIwMDQtMDEtMDcgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZXhhbXBsZXMvZ3N0cGxheS9NYWtlZmlsZS5hbTogQWRkaW5nIHRoZSBpbnRlcmZhY2UgbGlicmFyeS4KKwkqIGdzdC1saWJzL2dzdC9wbGF5L01ha2VmaWxlLmFtOiBBZGRpbmcgdGhlIGludGVyZmFjZSBsaWJyYXJ5LgorCSogZ3N0LWxpYnMvZ3N0L3BsYXkvZ3N0cGxheS5jOiAoZ3N0X3BsYXlfc2V0X3ZpZGVvX3NpbmspOiBDb25uZWN0aW5nIHRvIAl0aGUgWE92ZXJsYXkgc2l6ZSBzaWduYWwgaW5zdGVhZCBvZiBHc3RWaWRlb1NpbmsuCisJKiBnc3QtbGlicy9nc3QvcGxheS9nc3RwbGF5Lmg6IEluY2x1ZGluZyB0aGUgWE92ZXJsYXkgaW50ZXJmYWNlIHRvIGNoZWNrCisJR1NUX0lTX1hfT1ZFUkxBWSBiZWZvcmUgc2lnbmFsIGNvbm5lY3QuCisJKiBnc3QtbGlicy9nc3QvdmlkZW8vZ3N0dmlkZW9zaW5rLmM6IChnc3RfdmlkZW9zaW5rX2NsYXNzX2luaXQpOgorCVJlbW92aW5nIHRoZSBoYXZlX3ZpZGVvX3NpemUgc2lnbmFsLgorCSogZ3N0LWxpYnMvZ3N0L3ZpZGVvL2dzdHZpZGVvc2luay5oOiBSZW1vdmluZyB0aGUgaGF2ZV92aWRlb19zaXplIHNpZ25hbAorCWFuZCBhc3NvY2lhdGVkIHB1YmxpYyBtZXRob2QuCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX2hhbmRsZV94ZXZlbnRzKSwKKwkoZ3N0X3hpbWFnZXNpbmtfc2lua2Nvbm5lY3QpOiBVc2luZyBYT3ZlcmxheSBwdWJsaWMgbWV0aG9kIHRvIGZpcmUgc2l6ZQorCXNpZ25hbC4KKwkqIHN5cy94dmlkZW8veHZpZGVvc2luay5jOiAoZ3N0X3h2aWRlb3Npbmtfc2lua2Nvbm5lY3QpLAorCShnc3RfeHZpZGVvc2lua194d2luZG93X25ldyk6IFVzaW5nIFhPdmVybGF5IHB1YmxpYyBtZXRob2QgdG8gZmlyZSBzaXplCisgICAgICAgIHNpZ25hbC4KKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfc2lua2Nvbm5lY3QpOgorCVVzaW5nIFhPdmVybGF5IHB1YmxpYyBtZXRob2QgdG8gZmlyZSBzaXplIHNpZ25hbC4KKworMjAwNC0wMS0wNyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBnc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW06CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW90ZW1wbGF0ZS5jOgorCSogZ3N0L3ZpZGVvZmlsdGVyL21ha2VfZmlsdGVyOgorCUNyZWF0ZSBnc3R2aWRlb2V4YW1wbGUuYyBpbiBhIHNyY2RpciE9YnVpbGRkaXIgZnJpZW5kbHkgd2F5LgorCUNvbnZlcnQgbWFrZV9maWx0ZXIgdG8gL2Jpbi9zaCBzY3JpcHQuCisKKzIwMDQtMDEtMDcgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIGdzdC9tb2RwbHVnL2dzdG1vZHBsdWcuY2M6IGZpeCBlbGVtZW50IGRlc2NyaXB0aW9uCisKKzIwMDQtMDEtMDcgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZXhhbXBsZXMvZ3N0cGxheS9wbGF5ZXIuYzogKGdvdF90aW1lX3RpY2spLCAoZ290X3N0cmVhbV9sZW5ndGgpLAorCShnb3RfdmlkZW9fc2l6ZSk6IEFkZGluZyBzb21lIG5ldyBsaW5lcyBpbiBnX3ByaW50IGNhbGxzLgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua194d2luZG93X25ldyksCisJKGdzdF94aW1hZ2VzaW5rX3h3aW5kb3dfZGVzdHJveSksIChnc3RfeGltYWdlc2lua194d2luZG93X3Jlc2l6ZSksCisJKGdzdF94aW1hZ2VzaW5rX2hhbmRsZV94ZXZlbnRzKSwgKGdzdF94aW1hZ2VzaW5rX2ZpeGF0ZSksCisJKGdzdF94aW1hZ2VzaW5rX3Npbmtjb25uZWN0KSwgKGdzdF94aW1hZ2VzaW5rX2NoYW5nZV9zdGF0ZSksCisJKGdzdF94aW1hZ2VzaW5rX2NoYWluKSwgKGdzdF94aW1hZ2VzaW5rX2J1ZmZlcl9uZXcpLAorCShnc3RfeGltYWdlc2lua19zZXRfeHdpbmRvd19pZCksIChnc3RfeGltYWdlc2lua19nZXRfZGVzaXJlZF9zaXplKToKKwlDb21wbGV0ZSBjb2RlIHJldmlldywgcmV2ZXJ0aW5nIHNvbWUgc3R1ZmYgaSBkaXNhZ3JlZSB3aXRoLCBhZGRpbmcKKwlzb21lIGZpeGVzIDogdGltZSBzeW5jaHJvbml6YXRpb24gb24gaW52YWxpZCB0aW1lc3RhbXBzLCByZW5lZ290aWF0aW9uCisJb2YgcHJpdmF0ZSB3aW5kb3cuCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuaDoKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfeHdpbmRvd19kZXN0cm95KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3h3aW5kb3dfcmVzaXplKSwgKGdzdF94dmltYWdlc2lua19oYW5kbGVfeGV2ZW50cyksCisJKGdzdF94dmltYWdlc2lua19nZXRfeHZfc3VwcG9ydCksIChnc3RfeHZpbWFnZXNpbmtfeGNvbnRleHRfZ2V0KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX2ZpeGF0ZSksIChnc3RfeHZpbWFnZXNpbmtfc2lua2Nvbm5lY3QpLAorCShnc3RfeHZpbWFnZXNpbmtfY2hhbmdlX3N0YXRlKSwgKGdzdF94dmltYWdlc2lua19jaGFpbiksCisJKGdzdF94dmltYWdlc2lua19idWZmZXJfbmV3KSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX25hdmlnYXRpb25fc2VuZF9ldmVudCksCisJKGdzdF94dmltYWdlc2lua19zZXRfeHdpbmRvd19pZCksCisJKGdzdF94dmltYWdlc2lua19nZXRfZGVzaXJlZF9zaXplKSwKKwkoZ3N0X3h2aW1hZ2VzaW5rX3hvdmVybGF5X2luaXQpOiBDb21wbGV0ZSBjb2RlIHJldmlldywgcmV2ZXJ0aW5nIHNvbWUKKwlzdHVmZiBpIGRpc2FncmVlIHdpdGgsIGFkZGluZyBzb21lIGZpeGVzIDogUmVuZWdvdGlhdGlvbiBvZiBwcml2YXRlCisJd2luZG93LCBpbXBsZW1lbnRpbmcgZ2V0X2Rlc2lyZWRfc2l6ZS4KKworMjAwNC0wMS0wNyAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2F1ZGlvZmlsZS9nc3RhZnNpbmsuYzogKGdzdF9hZnNpbmtfaW5pdCksIChnc3RfYWZzaW5rX2NoYWluKSwKKwkoZ3N0X2Fmc2lua19oYW5kbGVfZXZlbnQpOgorCSogZXh0L2pwZWcvZ3N0anBlZ2VuYy5jOiAoZ3N0X2pwZWdlbmNfaW5pdCk6CisJKiBnc3QvYXZpL2dzdGF2aW11eC5jOiAoZ3N0X2F2aW11eF9yZXF1ZXN0X25ld19wYWQpOgorCSogc3lzL2R4cjMvZHhyM2F1ZGlvc2luay5jOiAoZHhyM2F1ZGlvc2lua19pbml0KToKKwkqIHN5cy9keHIzL2R4cjNzcHVzaW5rLmM6IChkeHIzc3B1c2lua19pbml0KToKKwkqIHN5cy9keHIzL2R4cjN2aWRlb3NpbmsuYzogKGR4cjN2aWRlb3NpbmtfaW5pdCk6CisJICBGaXggZm9yIGluc3RhbnRpYXRlLXRlc3QgKHNlZSBjb3JlKS4gQWxzbyByZW1vdmUgZGVhZCBjb2RlIGZyb20KKwkgIGpwZWdlbmMgKHdoaWNoIHN0aWxsIG5lZWRzIGZpeGluZywgYnV0IHRoYXQncyBsb3dlciBvbiBteSBUT0RPCisJICBsaXN0Li4uKS4KKwkqIHN5cy92NGwyL2dzdHY0bDJzcmMuYzogKGdzdF92NGwyc3JjX2dldGNhcHMpOgorCSAgTmV2ZXIgcmV0dXJuIE5VTEwgYXMgY2Fwcy4KKworMjAwNC0wMS0wNyAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQvTWFrZWZpbGUuYW06CisJKiBleHQvbGlicmZiL01ha2VmaWxlLmFtOgorCSogZXh0L2xpYnJmYi9nc3RyZmJzcmMuYzoKKwlOZXcgc291cmNlIHBsdWdpbiBiYXNlZCBvbiBsaWJyZmItMC4xLiAgUkZCIChyZW1vdGUgZnJhbWVidWZmZXIpCisJaXMgdGhlIHByb3RvY29sIHVzZWQgYnkgVk5DLgorCisyMDA0LTAxLTA3ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGdzdC92aWRlb2ZpbHRlci9nc3R2aWRlb3RlbXBsYXRlLmM6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW90ZW1wbGF0ZS5oOgorCSogZ3N0L3ZpZGVvZmlsdGVyL21ha2VfZmlsdGVyOgorCU1lcmdlIHZpZGVvdGVtcGxhdGUgaGVhZGVyIGludG8gc291cmNlIGZpbGUuCisJKiBnc3QvZWZmZWN0di9NYWtlZmlsZS5hbToKKwkqIGdzdC9lZmZlY3R2L2dzdGVmZmVjdHYuYzogKHBsdWdpbl9pbml0KToKKwkqIGdzdC9lZmZlY3R2L2dzdHdhcnAuYzoKKwlNYWtlIHdhcnBUViBhIHN1YmNsYXNzIG9mIHZpZGVvZmlsdGVyLgorCisyMDA0LTAxLTA3ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9tYWQvZ3N0aWQzdGFnLmM6IChnc3RfbWFkX2lkM190b190YWdfbGlzdCk6CisJICBBZGQgZ3VhcmQgYWdhaW5zdCBpbnZhbGlkIHV0Zi04IGNvbnZlcnNpb25zIGluIG1hZC4gSnVzdCBpbiBjYXNlLgorCisyMDA0LTAxLTA3ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc3Npbmtfc2lua19maXhhdGUpOgorCSAgRml4IGZvciBidWcgc2hvd24gYnkgcG9pc29uaW5nCisKKzIwMDQtMDEtMDYgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzcmMuYzogKGdzdF92NGxtanBlZ3NyY19nZXQpLAorCShnc3RfdjRsbWpwZWdzcmNfYnVmZmVyX2ZyZWUpOgorCSogc3lzL3Y0bC9nc3R2NGxzcmMuYzogKGdzdF92NGxzcmNfcGFsZXR0ZV90b19jYXBzKSwKKwkoZ3N0X3Y0bHNyY19zcmNjb25uZWN0KSwgKGdzdF92NGxzcmNfZ2V0Y2FwcyksIChnc3RfdjRsc3JjX2dldCksCisJKGdzdF92NGxzcmNfYnVmZmVyX2ZyZWUpOgorCSAgRml4IGZvciByZW1vdmVkIGJ1ZmZlcnBvb2xzLgorCisyMDA0LTAxLTA3ICBKYW4gU2NobWlkdCAgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisKKwkqIGV4dC9kdi9nc3RkdmRlYy5jOiAoZ3N0X2R2ZGVjX2xvb3ApOgorCUZpeCBjYXBzIG5lZ290aWF0aW9uLgorCisJKiBleHQvZHZkbmF2L2R2ZG5hdnNyYy5jOiAoZHZkbmF2c3JjX2NsYXNzX2luaXQpLAorCShkdmRuYXZzcmNfdXBkYXRlX2J1dHRvbmluZm8pLCAoZHZkbmF2c3JjX2dldCksCisJKGR2ZG5hdnNyY19nZXRfZXZlbnRfbWFzayksIChkdmRuYXZfaGFuZGxlX25hdmlnYXRpb25fZXZlbnQpLAorCShkdmRuYXZzcmNfZXZlbnQpOgorCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmM6CisJKiBnc3QtbGlicy9nc3QvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLmM6CisJKGdzdF9uYXZpZ2F0aW9uX3NlbmRfa2V5X2V2ZW50KSwgKGdzdF9uYXZpZ2F0aW9uX3NlbmRfbW91c2VfZXZlbnQpOgorCSogZ3N0LWxpYnMvZ3N0L25hdmlnYXRpb24vbmF2aWdhdGlvbi5oOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2RlbXV4LmM6IChnc3RfbXBlZ19kZW11eF9oYW5kbGVfc3JjX2V2ZW50KToKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfaGFuZGxlX3hldmVudHMpOgorCSogc3lzL3h2aW1hZ2UveHZpbWFnZXNpbmsuYzogKGdzdF94dmltYWdlc2lua19oYW5kbGVfeGV2ZW50cyk6CisJU3VwZXItc2ltcGxlIGZpcnN0IHZlcnNpb24gb2YgbW91c2UgYW5kIGtleWJvYXJkIGV2ZW50cy4gQ2xpY2tpbmcKKwlvbiBhIERWRCBtZW51IG5vdyB3b3JrcywgYWx0aG91Z2ggaXQgbWF5IG5vdCB0YWtlIHlvdSB3aGVyZSB5b3UKKwlleHBlY3RlZC4KKworCSogZ3N0L3NpbmUvZ3N0c2luZXNyYy5jOiAoZ3N0X3NpbmVzcmNfc3JjX2ZpeGF0ZSk6CisJKiBnc3QvdmlkZW90ZXN0c3JjL2dzdHZpZGVvdGVzdHNyYy5jOgorCShnc3RfdmlkZW90ZXN0c3JjX3NyY19maXhhdGUpOgorCVRoZXNlIGZpeGF0ZSBmdW5jdGlvbnMgd2VyZSBicm9rZW4gLSB0aGV5IG5ldmVyIGFjdHVhbGx5CisJZml4YXRlZCA6KQorCisyMDA0LTAxLTA2ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvc2hvdXQvZ3N0c2hvdXQuYzogKGdzdF9pY2VjYXN0c2VuZF9iYXNlX2luaXQpLAorCShnc3RfaWNlY2FzdHNlbmRfaW5pdCk6CisJICBmaXggZm9yIG5ldyBjYXBzIHN5c3RlbS4KKwkqIGdzdC1saWJzL2dzdC9taXhlci9taXhlcnRyYWNrLmg6CisJKiBzeXMvb3NzL2dzdG9zc21peGVyLmM6IChnc3Rfb3NzbWl4ZXJfYnVpbGRfbGlzdCk6CisJICBBZGQgJ21hc3RlciB0cmFjaycgZmxhZyAoZm9yIHRvb2xzIGxpa2UgQUNNRSB0aGF0IG9ubHkgd2FudCB0bworCSAgY2hhbmdlIHRoZSBtYWluIHZvbHVtZSkuCisKKzIwMDQtMDEtMDcgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZXh0L3h2aWQvZ3N0eHZpZC5jOiAoZ3N0X3h2aWRfc3RydWN0dXJlX3RvX2NzcCksCisJKGdzdF94dmlkX2NzcF90b19jYXBzKToKKwkqIGV4dC94dmlkL2dzdHh2aWRkZWMuYzogKGdzdF94dmlkZGVjX3NyY19nZXRjYXBzKToKKwkqIGV4dC94dmlkL2dzdHh2aWRlbmMuYzoKKwlpZmRlZiBvdXQgQVJHQiB0eXBlIHdoZW4gaXQgaXNuJ3QgYXZhaWxhYmxlCisJaW4geHZpZGNvcmUgMS4wLjBiZXRhMgorCisyMDA0LTAxLTA2ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVncGFyc2UuYzogKGdzdF9tcGVnX3BhcnNlX2xvb3ApOgorCSAgV2hlbiB3ZSBoYXZlIHJlY2VpdmVkIGEgbmV3IFNDUiByaWdodCBpbiB0aGUgZmlyc3QgYnVmZmVyIGFmdGVyCisJICBhIHNlZWsgKHNvIGluIHRoZSBzYW1lIGN5Y2xlIHRoYXQgaGFuZGxlcyB0aGUgZGlzY29udCksIHdlIHNob3VsZAorCSAgaGFuZGxlIHRoZSBidWZmZXIgaW5zdGVhZCBvZiB1bnJlZmZpbmcgaXQsIGVsc2Ugd2UgbG9zZSBkYXRhLgorCisyMDA0LTAxLTA2ICBJYWluIDxpYWluQHByZXR0eXBlb3BsZS5vcmc+CisKKwkqIGdzdC9pbnRmbG9hdC9nc3RpbnQyZmxvYXQuYyAoZ3N0X2ludDJmbG9hdF9saW5rKTogU2V0IHRoZQorCSAgYnVmZmVyLWZyYW1lcyBjYXBzIHRvby4KKworCSogZ3N0L29uZXRvbi9nc3RvbmV0b24uYyAoZ3N0X29uZXRvbl9zaW5rX2Nvbm5lY3QpOiBPbmx5IGNyZWF0ZSB0aGUgbmV3CisJICBjYXBzIHRoYXQgd2UgbmVlZCwgZG9uJ3QgZGVzdHJveSB0aGVtIGFsbCBhbmQgcmVidWlsZCB0aGVtLiBBbmQgd2hlbgorCSAgY3JlYXRpbmcgc3JjIHBhZHMsIHVzZSB0aGUgc3JjIHBhZCB0ZW1wbGF0ZSByYXRoZXIgdGhhbiB0aGUgc2luay4uLgorCisyMDA0LTAxLTA1ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVnZGVtdXguYzogKGdzdF9tcGVnX2RlbXV4X3BhcnNlX3N5c2hlYWQpOgorCSAgQWRkIHBhZCB0byBlbGVtZW50ICphZnRlciogc2V0dGluZyBmdW5jdGlvbnMgc3VjaCBhcyBldmVudCBoYW5kbGVyLgorCSAgV2l0aG91dCB0aGlzLCB0aGUgc2NoZWR1bGVyIChvcHQpIHdpbGwgbGluayBwYWRzLCBzZXQgdGhlIGV2ZW50CisJICBoYW5kbGVyIGZyb20gdGhlIGRlZmF1bHQgZXZlbnQgZnVuY3Rpb24gKGRpc3BhdGNoZXIgaW4gZ3N0cGFkLmMpCisJICBhbmQgKmFmdGVyKiB0aGF0LCB3ZSB3aWxsIHNldCBvdXIgb3duIGV2ZW50IGZ1bmN0aW9uLCB3aGljaCB3aWxsCisJICB0aHVzIG5ldmVyIGJlIHVzZWQgKGFuZCB0aHVzIG1wZWdkZW11eCBkb2Vzbid0IGhhbmRsZSBldmVudHMpLgorCisyMDA0LTAxLTA0ICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwlGaXggdGhlIGZpeGF0ZSBmdW5jdGlvbnMgdG8gaGFuZGxlIG5ldyBwcm90b3R5cGU6CisJKiBnc3Qvc2luZS9nc3RzaW5lc3JjLmM6IChnc3Rfc2luZXNyY19zcmNfZml4YXRlKToKKwkqIGdzdC92aWRlb3Rlc3RzcmMvZ3N0dmlkZW90ZXN0c3JjLmM6CisJKGdzdF92aWRlb3Rlc3RzcmNfc3JjX2ZpeGF0ZSk6CisJKiBzeXMvb3NzL2dzdG9zc3NpbmsuYzogKGdzdF9vc3NzaW5rX3NpbmtfZml4YXRlKToKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfZml4YXRlKToKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfZml4YXRlKToKKworMjAwNC0wMS0wNCAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuaDoKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfeHdpbmRvd19uZXcpLAorCShnc3RfeGltYWdlc2lua194d2luZG93X2Rlc3Ryb3kpLCAoZ3N0X3hpbWFnZXNpbmtfc2lua2Nvbm5lY3QpLAorCShnc3RfeGltYWdlc2lua19jaGFuZ2Vfc3RhdGUpLCAoZ3N0X3hpbWFnZXNpbmtfc2V0X3h3aW5kb3dfaWQpLAorCShnc3RfeGltYWdlc2lua194b3ZlcmxheV9pbml0KToKKwkgIGFzc29ydGVkIGZpeGVzIHRvIG1ha2UgKHJlKWVtYmVkZGluZyB3b3JrCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3Npbmtjb25uZWN0KSwKKwkoZ3N0X3hpbWFnZXNpbmtfZ2V0X2Rlc2lyZWRfc2l6ZSk6CisJICBpbXBsZW1lbnQgZGVzaXJlZCBzaXplIGFkZGl0aW9ucyB0byBYT3ZlcmxheQorCisyMDA0LTAxLTA0ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC1saWJzL2dzdC94b3ZlcmxheS94b3ZlcmxheS5jOiAoZ3N0X3hfb3ZlcmxheV9iYXNlX2luaXQpLAorCShnc3RfeF9vdmVybGF5X2dvdF94d2luZG93X2lkKSwgKGdzdF94X292ZXJsYXlfZ2V0X2Rlc2lyZWRfc2l6ZSksCisJKGdzdF94X292ZXJsYXlfZ290X2Rlc2lyZWRfc2l6ZSk6CisJKiBnc3QtbGlicy9nc3QveG92ZXJsYXkveG92ZXJsYXkuaDoKKwkgIEFkZCBvcHRpb25hbCAiZGVzaXJlZCBzaXplIiBzaWduYWwgYW5kIHF1ZXJ5aW5nLgorCisyMDA0LTAxLTA0ICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2Jsb2NrZ3JvdXApOgorCSAgRml4IEVCTUwtbGFjZWQgYmxvY2sgcGFyc2luZy4gRGlmZnMgYXJlIHJlbGF0aXZlIHRvIHByZXZpb3VzCisJICBsYWNlLCBub3QgdGhlIGZpcnN0IGxhY2UuIFRoYW5rcyB0byBNb3N1IGZyb20gdGhlIE1hdHJvc2thCisJICB0ZWFtIGZvciBkZXRlY3RpbmcgdGhpcy4KKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2luaXQpLAorCShnc3Rfd2F2cGFyc2VfcGFyc2VfZm10KSwgKGdzdF93YXZwYXJzZV9nZXRjYXBzKSwKKwkoZ3N0X3dhdnBhcnNlX2hhbmRsZV9zaW5rX2V2ZW50KSwgKGdzdF93YXZwYXJzZV9sb29wKSwKKwkoZ3N0X3dhdnBhcnNlX2NoYW5nZV9zdGF0ZSk6CisJKiBnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuaDoKKwkgIFF1aWNrZml4IGZvciBjYXBzbmVnby4KKworMjAwNC0wMS0wNCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYzogKHNldF9wcm9wZXJ0eSksIChnc3Rfd2F2ZW5jX2luaXQpOgorCSAgRml4IGluZGVudGluZywgZml4IHBhZCBjcmVhdGlvbi4KKworMjAwNC0wMS0wNCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L3h2aWQvZ3N0eHZpZGRlYy5jOiAoZ3N0X3h2aWRkZWNfaW5pdCksCisJKGdzdF94dmlkZGVjX3NyY19nZXRjYXBzKSwgKGdzdF94dmlkZGVjX3NyY19saW5rKSwKKwkoZ3N0X3h2aWRkZWNfc2lua19saW5rKToKKwkgIEltcGxlbWVudCBzcmNfZ2V0Y2FwcygpIHNvIHByb3BlciBzaXplIGNhcHMgaXMgbmVnb3RpYXRlZC4KKworMjAwNC0wMS0wNCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jOiAoZ3N0X2ZsYWNkZWNfbG9vcCk6CisJICBGaW5pc2ggZmxhYyBkZWNvZGVyIG9uIEVPUy4gU2VlICMxMTYxNzguCisKKzIwMDQtMDEtMDQgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jOiAoZ3N0X21hdHJvc2thX2RlbXV4X3NyY19nZXRjYXBzKSwKKwkoZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9zdHJlYW0pOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5oOgorCSAgQWRkIGdldGNhcHMoKSBmdW5jdGlvbiB0byBmaXggY2Fwc25lZ28uLi4KKworMjAwNC0wMS0wNCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ2RlbXV4LmM6IChnc3RfbXBlZ19kZW11eF9wYXJzZV9zeXNoZWFkKSwKKwkoZ3N0X21wZWdfZGVtdXhfcGFyc2VfcGFja2V0KSwgKGdzdF9tcGVnX2RlbXV4X3BhcnNlX3Blcyk6CisJKiBnc3QvbXBlZ3N0cmVhbS9nc3RtcGVncGFyc2UuYzogKGdzdF9tcGVnX3BhcnNlX3BhcnNlX3BhY2toZWFkKToKKwkgIEZpeCBtb3JlIGludGVnZXIgb3ZlcmZsb3dzLiBBZ2Fpbiwgc2VlICMxMjY5NjcuCisKKzIwMDQtMDEtMDMgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGV4dC9tcGVnMmRlYy9nc3RtcGVnMmRlYy5jOgorCSAgQWRkIHN1cHBvcnQgZm9yIG1wZWcyZGVjLTAuNC4wIChyZWxlYXNlZCB0d28gd2Vla3MgYWdvKS4gU2VlCisJICAjMTMwNDE2LgorCisyMDA0LTAxLTAzICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBjb25maWd1cmUuYWM6CisJKiBleHQveHZpZC9nc3R4dmlkLmM6IChnc3RfeHZpZF9pbml0KSwgKGdzdF94dmlkX2Vycm9yKSwKKwkoZ3N0X3h2aWRfc3RydWN0dXJlX3RvX2NzcCksIChnc3RfeHZpZF9jc3BfdG9fY2Fwcyk6CisJKiBleHQveHZpZC9nc3R4dmlkLmg6CisJKiBleHQveHZpZC9nc3R4dmlkZGVjLmM6IChnc3RfeHZpZGRlY19jbGFzc19pbml0KSwKKwkoZ3N0X3h2aWRkZWNfaW5pdCksIChnc3RfeHZpZGRlY19zZXR1cCksIChnc3RfeHZpZGRlY19jaGFpbiksCisJKGdzdF94dmlkZGVjX3NyY19saW5rKSwgKGdzdF94dmlkZGVjX3NpbmtfbGluayksCisJKGdzdF94dmlkZGVjX2NoYW5nZV9zdGF0ZSk6CisJKiBleHQveHZpZC9nc3R4dmlkZGVjLmg6CisJKiBleHQveHZpZC9nc3R4dmlkZW5jLmM6IChnc3RfeHZpZGVuY19wcm9maWxlX2dldF90eXBlKSwKKwkoZ3N0X3h2aWRlbmNfYmFzZV9pbml0KSwgKGdzdF94dmlkZW5jX2NsYXNzX2luaXQpLAorCShnc3RfeHZpZGVuY19pbml0KSwgKGdzdF94dmlkZW5jX3NldHVwKSwgKGdzdF94dmlkZW5jX2NoYWluKSwKKwkoZ3N0X3h2aWRlbmNfbGluayksIChnc3RfeHZpZGVuY19zZXRfcHJvcGVydHkpLAorCShnc3RfeHZpZGVuY19nZXRfcHJvcGVydHkpLCAoZ3N0X3h2aWRlbmNfY2hhbmdlX3N0YXRlKToKKwkqIGV4dC94dmlkL2dzdHh2aWRlbmMuaDoKKwkgIFVwZGF0ZSB4dmlkIHBsdWdpbiB0byBsYXRlc3QgeHZpZCAoMS4wLjAtYmV0YTMpIEFQSS4KKworMjAwNC0wMS0wMyAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L3J0cC9ydHAtcGFja2V0LmM6CisJICBBZGQgc3lzL3R5cGVzLmggaW5jbHVkZSwgc2luY2UgT1MgWCBkb2Vzbid0IGRlZmluZSBpbl9hZGRyX3QKKwkgIGluIG5ldGluZXQvaW4uaCwgbGlrZSBpdCBkb2VzIG9uIExpbnV4IChzZWUgIzEyOTYwMCkuCisKKzIwMDQtMDEtMDMgIFRob21hcyBDYW50eSA8dG9tbXlkYWxAb3B0dXNob21lLmNvbS5hdT4KKworCXJldmlld2VkIGJ5OiBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvYWxzYS9nc3RhbHNhbWl4ZXIuYzogKGdzdF9hbHNhX21peGVyX2Rpc3Bvc2UpOgorCSAgQ29ycmVjdCBsb2dpYyBvZiBkaXNwb3NlIGZ1bmN0aW9uIChzZWUgIzEyOTMwNikuCisKKzIwMDQtMDEtMDMgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdkZW11eC5jOiAoZ3N0X21wZWdfZGVtdXhfcGFyc2VfcGVzKToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYXJzZS5jOiAoZ3N0X21wZWdfcGFyc2VfY2xhc3NfaW5pdCksCisJKGdzdF9tcGVnX3BhcnNlX2luaXQpOgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ3BhcnNlLmg6CisJICBSZW1vdmUgY2xvY2sgKHdoaWNoIHdhcyBuZXZlciBwcm92aWRlZCwgaS5lLiBkZWFkIGNvZGUpLCBhbmQKKwkgIGFsc28gZml4IGludGVnZXIgb3ZlcmZsb3dzIGF0IGhpZ2ggUFRTIHZhbHVlcyAoc2VlICMxMjY5NjcpLgorCisyMDA0LTAxLTAzICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZmxhYy9nc3RmbGFjZGVjLmM6CisJKiBleHQvbGlicG5nL2dzdHBuZ2VuYy5oOgorCSogZXh0L21pa21vZC9nc3RtaWttb2QuaDoKKwkgIE9TIFggZml4ZXMgKHNlZSAjMTI2NjI4KS4KKworMjAwNC0wMS0wMiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvYWxzYS9nc3RhbHNhc3JjLmM6IChnc3RfYWxzYV9zcmNfcGFkX2ZhY3RvcnkpLAorCShnc3RfYWxzYV9zcmNfYmFzZV9pbml0KTogUmVtb3ZlIGJvZ3VzICJzcmMiIHJlcXVlc3QgcGFkLgorCSogZ3N0L21wZWdzdHJlYW0vZ3N0bXBlZ3BhcnNlLmM6IChnc3RfbXBlZ19wYXJzZV9iYXNlX2luaXQpLAorCShnc3RfbXBlZ19wYXJzZV9jbGFzc19pbml0KTogTW92ZSBwYWQgdGVtcGxhdGUgcmVnaXN0cmF0aW9uCisJdG8gY2xhc3NfaW5pdCwgc2luY2UgdGhlIGRlcml2ZWQgY2xhc3MgKG1wZWdkZW11eCkgZG9lc24ndAorCXdhbnQgdGhlbS4KKworMjAwNC0wMS0wMyAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL3hpbWFnZS9NYWtlZmlsZS5hbToKKwkqIHN5cy94dmlkZW8vTWFrZWZpbGUuYW06CisJKiBzeXMveHZpbWFnZS9NYWtlZmlsZS5hbToKKwkgIE1vdmUgaW50ZXJmYWNlIGxpYnMgZnJvbSBMREZMQUdTIHRvIExJQkFERCwgZml4IHJlbG9jYXRpb24gZXJyb3JzCisJICBhZnRlciBpbnN0YWxsYXRpb24gKHNlZSAjMTI3NjY0KS4KKworMjAwNC0wMS0wMiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2VuYy5jOiAoZ3N0X2ZmbXBlZ2VuY19pbml0KSwKKwkoZ3N0X2ZmbXBlZ2VuY19jb25uZWN0KTogIE5lZ290aWF0aW9uIGZpeGVzLgorCSogZXh0L21wZWcyZGVjL2dzdG1wZWcyZGVjLmM6IChnc3RfbXBlZzJkZWNfbmVnb3RpYXRlX2Zvcm1hdCk6CisJUmVtb3ZlIGluYXBwcm9wcmlhdGUgZ3N0X2NhcHNfZnJlZSgpLgorCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19zaW5rY29ubmVjdCk6CisJUmVlbmFibGUgUm9uYWxkJ3MgaW50ZXJuYWwgcmVzaXplIGNvZGUsIHNpbmNlIHRoZSBjb3JlIGhhbmRsZXMKKwlpdCBjb3JyZWN0bHkgbm93LgorCisyMDA0LTAxLTAyICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBzeXMvdjRsL2dzdHY0bG1qcGVnc2luay5jOiAoZ3N0X3Y0bG1qcGVnc2lua19pbml0KToKKwkqIHN5cy92NGwvZ3N0djRsbWpwZWdzcmMuYzogKGdzdF92NGxtanBlZ3NyY19pbml0KToKKwkqIHN5cy92NGwvZ3N0djRsc3JjLmM6IChnc3RfdjRsc3JjX2Jhc2VfaW5pdCksIChnc3RfdjRsc3JjX2luaXQpOgorCSAgRml4IHBhZCB0ZW1wbGF0ZSBzdHVmZi4KKworMjAwNC0wMS0wMiAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZ3N0L21hdHJvc2thL2VibWwtcmVhZC5jOiAoZ3N0X2VibWxfcmVhZF9zaW50KToKKwkqIGdzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmM6IChnc3RfZWJtbF93cml0ZV9zaW50KToKKwkgIGZpeCBzaWduZWQgaW50ZWdlciByZWFkaW5nL3dyaXRpbmcuCisKKzIwMDQtMDEtMDIgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L2Fsc2EvUkVBRE1FOgorCSAgUmVtb3ZlIG91dGRhdGVkIGRvY3VtZW50CisKKzIwMDQtMDEtMDMgIEphbiBTY2htaWR0ICA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKworCSogZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYzogKGdzdF9jdXR0ZXJfaW5pdCk6CisJICBzcmMgcGFkIHdhcyBiZWluZyBjcmVhdGVkIHR3aWNlIC0gb29wcy4KKworMjAwNC0wMS0wMiAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua19zaW5rY29ubmVjdCk6CisJICBDb21tZW50IG91dCBpbnRlcm5hbCByZXNpemUuIEl0IGRvZXNuJ3QgaGFuZGxlIHRoZSByZXN1bHRpbmcKKwkgIFhFdmVudCBpbnRlcm5hbGx5LCBkb2VzIGFub3RoZXIgdHJ5X3NldF9jYXBzKCkgd2hpY2ggbGVhZHMgdG8KKwkgIGEgcmVhbGx5IG5pY2UgbG9vcC4KKwkgIFJlYWwgZml4IHdpbGwgY29tZSB3aGVuIEp1bGllbiBhbmQgRGF2ZSBhcmUgYXdha2UuIDspLgorCisyMDA0LTAxLTAyICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvbXBlZzJlbmMvZ3N0bXBlZzJlbmMuY2M6CisJICBmaXggY29uc3Qvbm9uY29uc3QgY29tcGlsZSBpc3N1ZS4KKworMjAwNC0wMS0wMiAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJKiBzeXMveHZpbWFnZS94dmltYWdlc2luay5jOiAoZ3N0X3h2aW1hZ2VzaW5rX2ZpeGF0ZSksCisJKGdzdF94dmltYWdlc2lua19zaW5rY29ubmVjdCksIChnc3RfeHZpbWFnZXNpbmtfaW5pdCk6CisJQWRkIGZpeGF0ZSBmdW5jdGlvbiBhbmQgYSBjaGVjayBmb3IgYmFkIGZvcm1hdHMuCisKKzIwMDQtMDEtMDEgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCU5lZ290aWF0aW9uIGZpeGVzOgorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmM6IChnc3RfYXVkaW9maWx0ZXJfbGluayksCisJKGdzdF9hdWRpb2ZpbHRlcl9pbml0KToKKwkqIGdzdC9kZWJ1Zy9lZmVuY2UuYzogKGdzdF9lZmVuY2VfaW5pdCk6CisJKiBnc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYzogKGdzdF9kZWludGVybGFjZV9saW5rKSwKKwkoZ3N0X2RlaW50ZXJsYWNlX2luaXQpOgorCSogZ3N0L3ZvbHVtZS9nc3R2b2x1bWUuYzogKHZvbHVtZV9jb25uZWN0KToKKworMjAwNC0wMS0wMSAgRGF2aWQgU2NobGVlZiAgPGRzQHNjaGxlZWYub3JnPgorCisJQ29udmVydCBlbGVtZW50cyB0byB1c2UgZ3N0X3BhZF91c2VfZXhwbGljaXRfY2FwcygpIHdoZXJlCisJYXBwcm9wcmlhdGU6CisJKiBleHQvYTUyZGVjL2dzdGE1MmRlYy5jOiAoZ3N0X2E1MmRlY19pbml0KSwgKGdzdF9hNTJkZWNfcmVuZWcpOgorCSogZXh0L2F1ZGlvZmlsZS9nc3RhZnBhcnNlLmM6IChnc3RfYWZwYXJzZV9pbml0KSwKKwkoZ3N0X2FmcGFyc2Vfb3Blbl9maWxlKToKKwkqIGV4dC9hdWRpb2ZpbGUvZ3N0YWZzcmMuYzogKGdzdF9hZnNyY19pbml0KSwKKwkoZ3N0X2Fmc3JjX29wZW5fZmlsZSk6CisJKiBleHQvZXNkL2VzZG1vbi5jOiAoZ3N0X2VzZG1vbl9pbml0KSwgKGdzdF9lc2Rtb25fZ2V0KToKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnZGVjLmM6IChnc3RfZmZtcGVnZGVjX2luaXQpLAorCShnc3RfZmZtcGVnZGVjX2NoYWluKToKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnZGVtdXguYzogKGdzdF9mZm1wZWdkZW11eF9sb29wKToKKwkqIGV4dC9mbGFjL2dzdGZsYWNkZWMuYzogKGdzdF9mbGFjZGVjX2luaXQpLCAoZ3N0X2ZsYWNkZWNfd3JpdGUpOgorCSogZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmLmM6IChnc3RfZ2RrX3BpeGJ1Zl9pbml0KSwKKwkoZ3N0X2dka19waXhidWZfY2hhaW4pOgorCSogZXh0L2pwZWcvZ3N0anBlZ2RlYy5jOiAoZ3N0X2pwZWdkZWNfaW5pdCksIChnc3RfanBlZ2RlY19saW5rKSwKKwkoZ3N0X2pwZWdkZWNfY2hhaW4pOgorCSogZXh0L21hZC9nc3RtYWQuYzogKGdzdF9tYWRfaW5pdCksIChnc3RfbWFkX2NoYWluKToKKwkqIGV4dC9taWttb2QvZ3N0bWlrbW9kLmM6IChnc3RfbWlrbW9kX2luaXQpLAorCShnc3RfbWlrbW9kX25lZ290aWF0ZSk6CisJKiBleHQvbXBlZzJkZWMvZ3N0bXBlZzJkZWMuYzogKGdzdF9tcGVnMmRlY19pbml0KSwKKwkoZ3N0X21wZWcyZGVjX25lZ290aWF0ZV9mb3JtYXQpOgorCSogZXh0L21wZWcyZW5jL2dzdG1wZWcyZW5jLmNjOgorCSogZXh0L29nZy9nc3RvZ2dkZW11eC5jOiAoZ3N0X29nZ19wYWRfcHVzaCk6CisJKiBleHQvc3BlZXgvZ3N0c3BlZXhkZWMuYzogKGdzdF9zcGVleGRlY19pbml0KSwKKwkoZ3N0X3NwZWV4ZGVjX3Npbmtjb25uZWN0KToKKwkqIGV4dC9zd2ZkZWMvZ3N0c3dmZGVjLmM6IChnc3Rfc3dmZGVjX2xvb3ApLCAoZ3N0X3N3ZmRlY19pbml0KToKKwkqIGV4dC92b3JiaXMvdm9yYmlzZmlsZS5jOiAoZ3N0X3ZvcmJpc2ZpbGVfaW5pdCksCisJKGdzdF92b3JiaXNmaWxlX25ld19saW5rKToKKwkqIGdzdC9hYzNwYXJzZS9nc3RhYzNwYXJzZS5jOiAoZ3N0X2FjM3BhcnNlX2luaXQpLAorCShnc3RfYWMzcGFyc2VfY2hhaW4pOgorCSogZ3N0L2FzZmRlbXV4L2dzdGFzZmRlbXV4LmM6IChnc3RfYXNmX2RlbXV4X2FkZF9hdWRpb19zdHJlYW0pLAorCShnc3RfYXNmX2RlbXV4X3NldHVwX3BhZCk6CisJKiBnc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmM6IChnc3RfYXVwYXJzZV9pbml0KSwKKwkoZ3N0X2F1cGFyc2VfY2hhaW4pOgorCSogZ3N0L2lkMy9nc3RpZDN0eXBlcy5jOiAoZ3N0X2lkM3R5cGVzX2xvb3ApOgorCSogZ3N0L21hdHJvc2thL21hdHJvc2thLWRlbXV4LmM6IChnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSk6CisJKiBnc3QvbXBlZzF2aWRlb3BhcnNlL2dzdG1wMXZpZGVvcGFyc2UuYzogKGdzdF9tcDF2aWRlb3BhcnNlX2luaXQpLAorCShtcDF2aWRlb3BhcnNlX3BhcnNlX3NlcSk6CisJKiBnc3QvbXBlZ2F1ZGlvcGFyc2UvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzogKGdzdF9tcDNwYXJzZV9pbml0KSwKKwkoYnBmX2Zyb21faGVhZGVyKToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdkZW11eC5jOiAoZ3N0X21wZWdfZGVtdXhfcGFyc2Vfc3lzaGVhZCksCisJKGdzdF9tcGVnX2RlbXV4X3BhcnNlX3BlcyksIChnc3RfbXBlZ19kZW11eF9scGNtX3NldF9jYXBzKToKKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdwYXJzZS5jOiAoZ3N0X21wZWdfcGFyc2VfaW5pdCksCisJKGdzdF9tcGVnX3BhcnNlX3NlbmRfZGF0YSk6CisJKiBnc3QvcXRkZW11eC9xdGRlbXV4LmM6IChnc3RfcXRkZW11eF9sb29wX2hlYWRlciksCisJKGdzdF9xdGRlbXV4X2FkZF9zdHJlYW0pOgorCSogZ3N0L3JlYWxtZWRpYS9ybWRlbXV4LmM6IChnc3Rfcm1kZW11eF9hZGRfc3RyZWFtKToKKwkqIGdzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jOiAoZ3N0X3dhdnBhcnNlX2luaXQpLAorCShnc3Rfd2F2cGFyc2VfcGFyc2VfZm10KToKKworMjAwNC0wMS0wMSAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogY29uZmlndXJlLmFjOgorCSAgRml4IGNvbmZpZ3VyZSBjaGVjayBmb3IgbXBlZzJlbmMuIFdlIG5lZWQgMS42LjEuOTMgaW5zdGVhZCBvZgorCSAgMS42LjEuOTIsIHNpbmNlIHRoZSBwa2ctY29uZmlnIGZpbGUgb2YgMS42LjEuOTIgaXMgYm9ya2VkIGFuZAorCSAgaXQgdGhlcmVmb3JlIHVzZXMgdGhlIHdyb25nIGluY2x1ZGUgcGF0aHMuIFRvbyBiYWQuLi4gTm90ZQorCSAgdGhhdCAxLjYuMS45MyBpcyBub3QgcmVsZWFzZSB5ZXQuIDspLgorCSAgQWxzbyBhZGQgYSBjaGVjayBmb3IgbXBsZXgsIHdoaWNoIGlzIG5vdyB1c2luZyB0aGUgbGliJ2lmaWVkCisJICBtcGxleCBmcm9tIG1qcGVndG9vbHMsIHRvby4KKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnY29kZWNtYXAuYzoKKwkgIEFkZCBjb2RlY190YWcgZm9yIDNpdngveHZpZC4gRm9yIHh2aWQsIHRoaXMgc2hvdWxkIGZpeCBwbGF5YmFjaworCSAgaXNzdWVzLiBJIGRvbid0IHRoaW5rIGZmbXBlZyBoYW5kbGVzIDNpdnggY29ycmVjdGx5LCBzbyB0aGlzCisJICBwcm9iYWJseSB3b24ndCB3b3JrLiBCdXQgaXQgd29uJ3QgaHVydCBlaXRoZXIuCisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2RlYy5jOiAoZ3N0X2ZmbXBlZ2RlY19jb25uZWN0KSwKKwkoZ3N0X2ZmbXBlZ2RlY19jaGFpbik6CisJKiBleHQvZmZtcGVnL2dzdGZmbXBlZ2VuYy5jOiAoZ3N0X2ZmbXBlZ2VuY19jb25uZWN0KSwKKwkoZ3N0X2ZmbXBlZ2VuY19jaGFpbl9hdWRpbyk6CisJICBGaXggbWVtbGVhayBpbiBhdWRpbyBlbmNvZGluZy4gQ2xvc2UgY29kZWMgaWYgb3BlbiBmYWlscywgdGhpcworCSAgY2FsbHMgdGhlIGNsZWFudXAgcm91dGluZXMgc28gd2UgY2FuIHJlLXVzZSB0aGUgY29udGV4dC4KKwkqIGV4dC9tcGVnMmVuYy9nc3RtcGVnMmVuYy5jYzoKKwkgIEZpeCBwYWQgdGVtcGxhdGUgbmFtZXMvdHlwZXMsIGZpeCBtZW1vcnkgaXNzdWUgd2l0aCBnZXRjYXBzKCkuCisJKiBleHQvbXBlZzJlbmMvZ3N0bXBlZzJlbmNvZGVyLmNjOgorCSogZXh0L21wZWcyZW5jL2dzdG1wZWcyZW5jb2Rlci5oaDoKKwkgIEZpeCBjb21waWxlIGlzc3VlIHdpdGggbmV3IGNhcHMgc3lzdGVtIChjb25zdCB0aGluZ3kpLgorCSogZXh0L21wZWcyZW5jL2dzdG1wZWcyZW5jcGljdHVyZXJlYWRlci5jYzoKKwkqIGV4dC9tcGVnMmVuYy9nc3RtcGVnMmVuY3BpY3R1cmVyZWFkZXIuaGg6CisJICBXZSByZWFkIGEgZmlyc3QgZnJhbWUgcmlnaHQgb24gaW5pdGluZywgc28gdGhhdCB3ZSBoYXZlIGEgY2FwcworCSAgd2hlbiB3ZSBpbml0IHRoZSBvdXRwdXQuIFRoaXMgY2FwcyBpcyBjYWNoZWQgaW4gcGFkcHJpdmF0ZSBhbmQKKwkgIHJlYWQgYXMgZmlyc3QgZnJhbWUuCisJKiBleHQvbXBsZXgvTWFrZWZpbGUuYW06CisJKiBleHQvbXBsZXgvZ3N0bXBsZXguY2M6CisJKiBleHQvbXBsZXgvZ3N0bXBsZXguaDoKKwkqIGV4dC9tcGxleC9nc3RtcGxleC5oaDoKKwkqIGV4dC9tcGxleC9nc3RtcGxleGliaXRzdHJlYW0uY2M6CisJKiBleHQvbXBsZXgvZ3N0bXBsZXhpYml0c3RyZWFtLmhoOgorCSogZXh0L21wbGV4L2dzdG1wbGV4am9iLmNjOgorCSogZXh0L21wbGV4L2dzdG1wbGV4am9iLmhoOgorCSogZXh0L21wbGV4L2dzdG1wbGV4b3V0cHV0c3RyZWFtLmNjOgorCSogZXh0L21wbGV4L2dzdG1wbGV4b3V0cHV0c3RyZWFtLmhoOgorCSAgV2Ugd3JhcCBtanBlZ3Rvb2xzIG1wbGV4LiBTbyBJIHJld3JvdGUgdGhlIHBsdWdpbi4gVGhlIG9sZCBwbHVnaW4KKwkgIGhhZCBpc3N1ZXMsIGRpZG4ndCBkbyBjYXBzbmVnbywgc3VwcG9ydGVkIG9ubHkgYSBzdWJzZXQgb2YgdGhlCisJICBtcGxleCBmZWF0dXJlcyBhbmQgcmVxdWlyZWQgYSBtcGxleCBmb3JrIGluIG91ciBsb2NhbCBDVlMuIFBsdXMKKwkgIHRoYXQgaXQgd29ya2VkIGFnYWlzdCBhIHZlcnkgb2xkIG1wbGV4IHZlcnNpb24uIFJld3JpdGluZyB3YXMKKwkgIGZhc3RlciB0aGFuIHVwZGF0aW5nIGl0LgorCSogZ3N0LWxpYnMvZXh0L01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L0lOU1RSVUNUOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L01ha2VmaWxlLmFtOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L1JFQURNRToKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9UT0RPOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L2FjM3N0cm1faW4uY2M6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvYXVkaW9zdHJtLmhoOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L2F1ZGlvc3RybV9vdXQuY2M6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvYXVuaXQuaGg6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvYml0cy5jYzoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9iaXRzLmhoOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L2J1ZmZlci5jYzoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9idWZmZXIuaGg6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvZmFzdGludGZucy5oOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L2Zvcm1hdF9jb2Rlcy5oOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L2lucHV0c3RybS5jYzoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9pbnB1dHN0cm0uaGg6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvbHBjbXN0cm1faW4uY2M6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvbWpwZWdfbG9nZ2luZy5jYzoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9tanBlZ19sb2dnaW5nLmg6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvbWpwZWdfdHlwZXMuaDoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9tcGFzdHJtX2luLmNjOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L21wZWdjb25zdHMuY2M6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvbXBlZ2NvbnN0cy5oOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L21wbGV4Y29uc3RzLmhoOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L211bHRwbGV4LmNjOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L291dHB1dHN0cmVhbS5oaDoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9wYWRzdHJtLmNjOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L3BhZHN0cm0uaGg6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvc3RpbGxzc3RyZWFtLmNjOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L3N0aWxsc3N0cmVhbS5oaDoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC9zeXN0ZW1zLmNjOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L3N5c3RlbXMuaGg6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvdmVjdG9yLmNjOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L3ZlY3Rvci5oaDoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC92aWRlb3N0cm0uaGg6CisJKiBnc3QtbGlicy9leHQvbXBsZXgvdmlkZW9zdHJtX2luLmNjOgorCSogZ3N0LWxpYnMvZXh0L21wbGV4L3ZpZGVvc3RybV9vdXQuY2M6CisJKiBnc3QtbGlicy9leHQvbXBsZXgveXV2NG1wZWcuY2M6CisJKiBnc3QtbGlicy9leHQvbXBsZXgveXV2NG1wZWcuaDoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC95dXY0bXBlZ19pbnRlcm4uaDoKKwkqIGdzdC1saWJzL2V4dC9tcGxleC95dXY0bXBlZ19yYXRpby5jYzoKKwkgIFdlIGRvbid0IGZvcmsgbWpwZWd0b29scycgbXBsZXggaW4gb3VyIENWUyBhbnltb3JlLgorCSogZ3N0L2F2aS9nc3RhdmlkZW11eC5jOiAoZ3N0X2F2aV9kZW11eF9zcmNfZ2V0Y2FwcyksCisJKGdzdF9hdmlfZGVtdXhfYWRkX3N0cmVhbSk6CisJKiBnc3QvYXZpL2dzdGF2aWRlbXV4Lmg6CisJICBBZGQgZ2V0Y2FwcygpIGZ1bmN0aW9uIGZvciBwcm9wZXIgY2FwcyBuZWdvLiBUaGlzIG1ha2VzIHNvbWUKKwkgIHBhcnRzIG9mIEFWSSBwbGF5YmFjay9yZWFkaW5nIHdvcmsuCisJKiBzeXMveGltYWdlL3hpbWFnZXNpbmsuYzogKGdzdF94aW1hZ2VzaW5rX3Npbmtjb25uZWN0KToKKwkgIFJlc2l6ZSB3aW5kb3cgb24gbmV3IGNhcHNuZWdvLiBUaGlzIGlzIHByb2JhYmx5IHdyb25nLCBidXQKKwkgIEknbSBzdGlsbCBjb21taXR0aW5nIGl0IGJlY2F1c2Ugd2l0aCBjdXJyZW50IGNhcHNuZWdvLCB0aGUKKwkgIGZpcnN0IHN1Y2Nlc3NmdWxsIGNhcHNuZWdvIGlzIGF1dG8tZml4YXRlZCwgdGhlcmVmb3JlIHJvdW5kZWQKKwkgIGRvd24gdG8gdGhlIGxvd2VzdCB2YWx1ZXMgaW4gdGhlIGNhcHMuIHRoaXMgcmVzdWx0cyBpbiBhIDE2eDE2CisJICBYV2luZG93IHRoYXQgaXMgbm90IHJlaXplZCB3aGVuIHJlYWwgY2Fwc25lZ28gZmluaXNoZXMuCisJICBEYXZlLCBJIHNlZSBtb3JlIGNhc2VzIG9mIHRoaXMsIGRvIHlvdSBrbm93IGEgcHJvcGVyIHNvbHV0aW9uPworCSogdG9vbHMvZ3N0LWxhdW5jaC1leHQuaW46CisJICBGaXggTVBFRy00IEFBQyAoQXBwbGUgaVBvZC9pVHVuZXMpIGZpbGUgY29tbWFuZGxpbmUuCisKKzIwMDMtMTItMzEgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3RjcC9nc3R0Y3BzcmMuYzogKGdzdF90Y3BzcmNfZ2V0KToKKwkqIGdzdC91ZHAvZ3N0dWRwc3JjLmM6IChnc3RfdWRwc3JjX2dldCk6CisJICBDaGFuZ2UgZ3N0X3BhZF9wcm94eV9saW5rKCkgdG8gZ3N0X3BhZF90cnlfc2V0X2NhcHMoKQorCisyMDAzLTEyLTMwICBEYXZpZCBTY2hsZWVmICA8ZHNAc2NobGVlZi5vcmc+CisKKwkqIGV4dC9mZm1wZWcvZ3N0ZmZtcGVnY29sb3JzcGFjZS5jOgorCShnc3RfZmZtcGVnY3NwX2NhcHNfcmVtb3ZlX2Zvcm1hdF9pbmZvKSwgKGdzdF9mZm1wZWdjc3BfZ2V0Y2FwcyksCisJKGdzdF9mZm1wZWdjc3BfcGFkX2xpbmspLCAoZ3N0X2ZmbXBlZ2NzcF9pbml0KSwKKwkoZ3N0X2ZmbXBlZ2NzcF9jaGFpbik6IE5lZ290aWF0aW9uIGZpeGVzCisJKiBleHQvbWFkL2dzdG1hZC5jOiAoZ3N0X21hZF9jaGFpbik6IE5lZ290aWF0aW9uIGZpeGVzCisJKiBnc3QvYXVkaW9jb252ZXJ0L2dzdGF1ZGlvY29udmVydC5jOiAoZ3N0X2F1ZGlvX2NvbnZlcnRfY2hhaW4pLAorCShnc3RfYXVkaW9fY29udmVydF9saW5rKSwgKGdzdF9hdWRpb19jb252ZXJ0X2NoYW5uZWxzKToKKwkqIGdzdC9hdWRpb3NjYWxlL2dzdGF1ZGlvc2NhbGUuYzogKGdzdF9hdWRpb3NjYWxlX2dldGNhcHMpLAorCShnc3RfYXVkaW9zY2FsZV9saW5rKSwgKGdzdF9hdWRpb3NjYWxlX2dldF9idWZmZXIpLAorCShnc3RfYXVkaW9zY2FsZV9jaGFpbik6IE5lZ290aWF0aW9uIGZpeGVzCisJKiBnc3QvYXVkaW9zY2FsZS9nc3RhdWRpb3NjYWxlLmg6CisJKiBnc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9maWx0ZXIuYzoKKwkoZ3N0X3ZpZGVvZmlsdGVyX2Zvcm1hdF9nZXRfc3RydWN0dXJlKSwgKGdzdF92aWRlb2ZpbHRlcl9nZXRjYXBzKSwKKwkoZ3N0X3ZpZGVvZmlsdGVyX2xpbmspLCAoZ3N0X3ZpZGVvZmlsdGVyX2luaXQpLAorCShnc3RfdmlkZW9maWx0ZXJfc2V0X291dHB1dF9zaXplKSwgKGdzdF92aWRlb2ZpbHRlcl9zZXR1cCksCisJKGdzdF92aWRlb2ZpbHRlcl9maW5kX2Zvcm1hdF9ieV9zdHJ1Y3R1cmUpOgorCSogZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmlsdGVyLmg6IE5lZ290aWF0aW9uIGZpeGVzCisJKiBnc3QvdmlkZW9zY2FsZS9nc3R2aWRlb3NjYWxlLmM6IChnc3RfdmlkZW9zY2FsZV9nZXRjYXBzKSwKKwkoZ3N0X3ZpZGVvc2NhbGVfbGluayk6CisJKiBnc3QvdmlkZW9zY2FsZS92aWRlb3NjYWxlLmM6ICh2aWRlb3NjYWxlX2dldF9zdHJ1Y3R1cmUpLAorCSh2aWRlb3NjYWxlX2ZpbmRfYnlfc3RydWN0dXJlKSwgKGdzdF92aWRlb3NjYWxlX3NldHVwKToKKwkqIGdzdC92aWRlb3NjYWxlL3ZpZGVvc2NhbGUuaDogTmVnb3RpYXRpb24gZml4ZXMKKwkqIHN5cy94aW1hZ2UveGltYWdlc2luay5jOiAoZ3N0X3hpbWFnZXNpbmtfaGFuZGxlX3hldmVudHMpLAorCShnc3RfeGltYWdlc2lua19maXhhdGUpLCAoZ3N0X3hpbWFnZXNpbmtfaW5pdCk6IEFkZCBhIGZpeGF0ZQorCWZ1bmN0aW9uLCByZXN0cmljdCByZXNpemluZyB0byBhIG11bHRpcGxlIG9mIDQgKGhhY2sgdW50aWwKKwlldmVyeW9uZSBzdXBwb3J0cyBvZGQgc2l6ZXMgY29ycmVjdGx5KS4KKworMjAwMy0xMi0yOSAgQ29saW4gV2FsdGVycyAgPHdhbHRlcnNAdmVyYnVtLm9yZz4KKworCSogZXh0L2VzZC9lc2RzaW5rLmMgKGdzdF9lc2RzaW5rX2xpbmspOiBGaXggdHlwbzsgZ2V0IGRlcHRoIGluc3RlYWQgb2YKKwlzaWduZWQuCisKKzIwMDMtMTItMzAgIEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorCisJKiBleHQvc25kZmlsZS9nc3RzZi5jOiAoZ3N0X3NmX2xvb3ApOgorCSAgRml4IHdhcm5pbmcgYWJvdXQgZGlzY2FyZGluZyBjb25zdCBxdWFsaWZpZXIKKworMjAwMy0xMi0yNyAgSmVyZW15IFNpbW9uICAgPGplc2ltb25AbGliZXJ0eXN1cmYuZnI+CisKKwkqIGdzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmM6CisJKiBnc3QvdmlkZW9zY2FsZS9nc3R2aWRlb3NjYWxlLmM6CisJKiBnc3Qvdm9sZW52L2dzdHZvbGVudi5jOgorCSogZ3N0LWxpYnMvZ3N0L2F1ZGlvL2F1ZGlvLmM6CisJKiBnc3QtbGlicy9nc3QvdmlkZW8vdmlkZW8uYzoKKwkgIEZpeCB3YXJuaW5ncworCisyMDAzLTEyLTI3ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9hbHNhL2dzdGFsc2EuYzogKGdzdF9hbHNhX29wZW5fYXVkaW8pOgorCSAgRG9uJ3Qgc2VuZCBBTFNBIGRlYnVnZ2luZyB0byBzdGRlcnIuCisJKiBleHQvYWxzYS9nc3RhbHNhLmg6CisJICBVc2UgR1NUX1dBUk5JTkcgaW5zdGVhZCBvZiBnX3dhcm5pbmcgd2hlbiBBTFNBIGZ1bmN0aW9ucyBmYWlsLgorCisyMDAzLTEyLTI3ICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIHN5cy94dmltYWdlL3h2aW1hZ2VzaW5rLmM6IChnc3RfeHZpbWFnZXNpbmtfZ2V0X3h2X3N1cHBvcnQpOgorCSAgRnJlZSBYVkFkYXB0ZXJJbmZvIGNvcnJlY3RseS4KKworMjAwMy0xMi0yNyAgQmVuamFtaW4gT3R0ZSAgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorCisJKiBleHQvbWFkL2dzdGlkM3RhZy5jOiAoZ3N0X2lkM190YWdfYWRkX3NyY19wYWQpLAorCShnc3RfaWQzX3RhZ19kb19jYXBzX25lZ28pLCAoZ3N0X2lkM190YWdfc3JjX2xpbmspOgorCSAgTWFrZSBpZDN0YWcgdXNlIGNvcnJlY3QgY2FwcyBuZWdvLgorCisyMDAzLTEyLTI3ICBBbWF1cnkgSmFjcXVvdCA8c3hwZXJ0QGVzaXRjb20ub3JnPgorCisJKiBleHQvaXZvcmJpcy92b3JiaXMuYzoKKwkqIGV4dC9pdm9yYmlzL3ZvcmJpc2VuYy5oOgorCSogZXh0L2l2b3JiaXMvdm9yYmlzZmlsZS5jOgorCSAgTW9kaWZ5IHNvIHRoYXQgaXQgdXNlcyB0aGUgbmV3IGNhcHMgdGhpbmdzCisKKzIwMDMtMTItMjcgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogdGVzdHN1aXRlL3NwaWRlci9zcGlkZXIxLmM6IChtYWluKToKKwkqIHRlc3RzdWl0ZS9zcGlkZXIvc3BpZGVyMi5jOiAobWFpbik6CisJKiB0ZXN0c3VpdGUvc3BpZGVyL3NwaWRlcjMuYzogKG1haW4pOgorCSAgTWFrZSB0ZXN0cyBjb21waWxlIGFnYWluLiBUaGV5IHByb2JhYmx5IGRvbid0IHdvcmsuCisKKzIwMDMtMTItMjQgIENvbGluIFdhbHRlcnMgIDx3YWx0ZXJzQHZlcmJ1bS5vcmc+CisKKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jIChnc3Rfb3Nzc2lua19zaW5rX2ZpeGF0ZSk6IFJldHVybiBOVUxMIGlmCisJd2UgY2FuJ3QgZml4YXRlIHRoZSBjYXBzIGFueW1vcmUuCisKKzIwMDMtMTItMjMgIERhdmlkIFNjaGxlZWYgIDxkc0BzY2hsZWVmLm9yZz4KKworCSogZ3N0L3ZvbHVtZS9nc3R2b2x1bWUuYzogKHZvbHVtZV9pbml0KTogUHJveHkgZ2V0Y2Fwcy4KKwkqIHN5cy9vc3MvZ3N0b3Nzc2luay5jOiAoZ3N0X29zc3NpbmtfaW5pdCksCisJKGdzdF9vc3NzaW5rX3NpbmtfZml4YXRlKTogQWRkIGZpeGF0ZSBmdW5jdGlvbi4KKworMjAwMy0xMi0yNCAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdjb2RlY21hcC5jOgorCSogZXh0L2ZmbXBlZy9nc3RmZm1wZWdjb2xvcnNwYWNlLmM6IChnc3RfZmZtcGVnY3NwX2dldGNhcHMpLAorCShnc3RfZmZtcGVnY3NwX3NyY2Nvbm5lY3RfZnVuYyksIChnc3RfZmZtcGVnY3NwX3Npbmtjb25uZWN0KSwKKwkoZ3N0X2ZmbXBlZ2NzcF9zcmNjb25uZWN0KSwgKGdzdF9mZm1wZWdjc3BfZ2V0X3R5cGUpLAorCShnc3RfZmZtcGVnY3NwX2Jhc2VfaW5pdCksIChnc3RfZmZtcGVnY3NwX2NsYXNzX2luaXQpLAorCShnc3RfZmZtcGVnY3NwX2luaXQpLCAoZ3N0X2ZmbXBlZ2NzcF9jaGFpbiksCisJKGdzdF9mZm1wZWdjc3BfY2hhbmdlX3N0YXRlKSwgKGdzdF9mZm1wZWdjc3Bfc2V0X3Byb3BlcnR5KSwKKwkoZ3N0X2ZmbXBlZ2NzcF9nZXRfcHJvcGVydHkpLCAoZ3N0X2ZmbXBlZ2NzcF9yZWdpc3Rlcik6CisJICBmaXggdHlwbyBpbiBSR0IgbWFza3MsIGFuZCBtb3ZlIGJhY2sgdG8gIm9sZCIgY29sb3JzcGFjZQorCSAgY2Fwc25lZ28gY29kZSB1bnRpbCB3aG9ldmVyIHdyb3RlIHRoaXMgbmV3IGNyYXAgaGFzIGFjdHVhbGx5CisJICB0ZXN0ZWQgaXQgc28gdGhhdCBpdCB3b3Jrcy4KKwkgIEFuZCB5ZXMsIHRoaXMgd29ya3MsIGtlZXAgaXQgdGhhdCB3YXkgcGxlYXNlLgorCisyMDAzLTEyLTIzICBSb25hbGQgQnVsdGplICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorCisJKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmM6IChnc3RfZGl2eGRlY19iYXNlX2luaXQpLAorCShnc3RfZGl2eGRlY19pbml0KSwgKGdzdF9kaXZ4ZGVjX25lZ290aWF0ZSk6CisJKiBleHQvZGl2eC9nc3RkaXZ4ZGVjLmg6CisJKiBleHQvZGl2eC9nc3RkaXZ4ZW5jLmM6IChnc3RfZGl2eGVuY19iYXNlX2luaXQpLAorCShnc3RfZGl2eGVuY19pbml0KToKKwkqIGV4dC9mYWFjL2dzdGZhYWMuYzogKGdzdF9mYWFjX2Jhc2VfaW5pdCksIChnc3RfZmFhY19pbml0KSwKKwkoZ3N0X2ZhYWNfc2lua2Nvbm5lY3QpLCAoZ3N0X2ZhYWNfc3JjY29ubmVjdCk6CisJKiBleHQvbXBlZzJlbmMvZ3N0bXBlZzJlbmMuY2M6CisJKiBleHQvbXBlZzJlbmMvZ3N0bXBlZzJlbmNvZGVyLmNjOgorCSogZXh0L21wZWcyZW5jL2dzdG1wZWcyZW5jcGljdHVyZXJlYWRlci5jYzoKKwkqIHN5cy9keHIzL2R4cjNhdWRpb3NpbmsuYzogKGR4cjNhdWRpb3NpbmtfYmFzZV9pbml0KSwKKwkoZHhyM2F1ZGlvc2lua19pbml0KSwgKGR4cjNhdWRpb3NpbmtfcGNtX3NpbmtsaW5rKToKKwkqIHN5cy9keHIzL2R4cjNzcHVzaW5rLmM6IChkeHIzc3B1c2lua19iYXNlX2luaXQpLAorCShkeHIzc3B1c2lua19pbml0KToKKwkqIHN5cy9keHIzL2R4cjN2aWRlb3NpbmsuYzogKGR4cjN2aWRlb3NpbmtfYmFzZV9pbml0KSwKKwkoZHhyM3ZpZGVvc2lua19pbml0KToKKwkgIEZpeCBjYXBzIGJyZWFrYWdlIGFmdGVyIERhdmUncyBjYXBzIGJyYW5jaCBtZXJnZS4KKworMjAwMy0xMi0yMyAgUm9uYWxkIEJ1bHRqZSAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKworCSogc3lzL3hpbWFnZS94aW1hZ2VzaW5rLmM6IChnc3RfeGltYWdlc2lua194Y29udGV4dF9nZXQpOgorCSAgRml4IGZvciAyNGJwcCBkaXNwbGF5LgorCisyMDAzLTEyLTIzICBDb2xpbiBXYWx0ZXJzICA8d2FsdGVyc0B2ZXJidW0ub3JnPgorCisJKiBleHQvZ25vbWV2ZnMvZ3N0Z25vbWV2ZnNzaW5rLmM6IEFkZCBBUkdfSEFORExFIHByb3BlcnR5IHRoYXQgdGFrZXMKKwlhIEdub21lVkZTSGFuZGxlIGRpcmVjdGx5LgorCisyMDAzLTEyLTIyICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGdzdC92b2x1bWUvTWFrZWZpbGUuYW06CisJKiBnc3Qvdm9sdW1lL2dzdHZvbHVtZS5jOiAodm9sdW1lX2Nvbm5lY3QpLCAodm9sdW1lX3BhcnNlX2NhcHMpLAorCSh2b2x1bWVfYmFzZV9pbml0KSwgKHZvbHVtZV9pbml0KToKKwkgIFJlZW5hYmxlIHZvbHVtZSBlbGVtZW50IGFuZCBmaXggdG8gd29yayB3aXRoIG5ldyBjYXBzIHN0dWZmLgorCSAgUmh5dGhtYm94IG5lZWRzIHRoaXMuCisKKzIwMDMtMTItMjIgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZ3N0L3F0ZGVtdXgvcXRkZW11eC5jOiAocGx1Z2luX2luaXQpOgorCSAgcXRkZW11eCByZXF1aXJlcyBieXRlc3RyZWFtCisKKzIwMDMtMTItMjIgIEJlbmphbWluIE90dGUgIDxpbjd5MTE4QHB1YmxpYy51bmktaGFtYnVyZy5kZT4KKworCSogZXh0L2Fsc2EvZ3N0YWxzYS5jOiAoZ3N0X2Fsc2FfZ2V0X2NhcHMpLCAoZ3N0X2Fsc2FfbGluayk6CisJICBGaXggcmVtYWluaW5nIGNhcHMgaGFuZGxpbmcgZXJyb3JzIGR1ZSB0byBDQVBTIG1lcmdlLgorCisyMDAzLTEyLTIyICBCZW5qYW1pbiBPdHRlICA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisKKwkqIGV4dC9mYWFkL2dzdGZhYWQuYzogKGdzdF9mYWFkX2Jhc2VfaW5pdCksIChnc3RfZmFhZF9pbml0KSwKKwkoZ3N0X2ZhYWRfc2lua2Nvbm5lY3QpLCAoZ3N0X2ZhYWRfc3JjZ2V0Y2FwcyksCisJKGdzdF9mYWFkX3NyY2Nvbm5lY3QpOgorCSAgUG9ydCB0byBuZXcgY2FwcyBzeXN0ZW0uCisKKzIwMDMtMTItMjEgIEp1bGllbiBNT1VUVEUgIDxqdWxpZW5AbW91dHRlLm5ldD4KKworCSogZXhhbXBsZXMvZ3N0cGxheS9wbGF5ZXIuYzogKGdvdF90aW1lX3RpY2spLCAoZ290X3N0cmVhbV9sZW5ndGgpLAorCShnb3RfdmlkZW9fc2l6ZSksIChtYWluKTogdXNpbmcgZ19wcmludCBpbnN0ZWFkIG9mIGdfbWVzc2FnZS4KKwkqIGdzdC1saWJzL2dzdC9wbGF5L2dzdHBsYXkuYzogKGdzdF9wbGF5X3BpcGVsaW5lX3NldHVwKTogRml4aW5nIEVPUworCXNpZ25hbCB3aGljaCB3YXMgbm90IGVtaXR0ZWQgYmVjYXVzZSBvZiAic3dpdGNoIiBlbGVtZW50IGFkZGVkIHRvIHRoZQorCWJpbiBidXQgbm90IGNvbm5lY3RlZC4gKFJlbW92aW5nIGZyb20gdGhlIGJpbiB0ZW1wb3JhcmlseSkKKworMjAwMy0xMi0yMSAgSnVsaWVuIE1PVVRURSAgPGp1bGllbkBtb3V0dGUubmV0PgorCisJKiBjb25maWd1cmUuYWM6IFhfRElTUExBWV9NSVNTSU5HIGlzIHNldCB0byAxIGlmIEFDX1BBVEhfWFRSQSBmYWlscyB0bworCWZpbmQgWCBkZXZlbG9wbWVudCBmaWxlcy4gSSBkb24ndCB1bmRlcnN0YW5kIHRoZSBwcmV2aW91cyB0ZXN0cyBhbmQKKwl0aGV5IGZhaWwgb24gbXkgZGViaWFuL3BwYyB1bnN0YWJsZS4gVGhpcyBvbmUgd29ya3MuCisJKiBleGFtcGxlcy9nc3RwbGF5L3BsYXllci5jOiAobWFpbik6IFNldCB0aGUgcGlwZWxpbmUgdG8gUkVBRFkgYmVmb3JlCisJZXhpdGluZy4KKwkqIGdzdC1saWJzL2dzdC9wbGF5L2dzdHBsYXkuYzogKGdzdF9wbGF5X2dldF9sZW5ndGhfY2FsbGJhY2spLAorCShnc3RfcGxheV9zZXRfdmlkZW9fc2luayksIChnc3RfcGxheV9zZXRfYXVkaW9fc2luayksCisJKGdzdF9wbGF5X3NldF92aXN1YWxpemF0aW9uKTogQWRkIHNvbWUgc2FmZXR5IGNoZWNrcyBpbiBzZXRfIG1ldGhvZHMKKwlhbmQgc3RhdGVfY2hhbmdlLiBUaGlzIHdhcyB0aHJvd2luZyBzb21lIHVnbHkgQ1JJVElDQUwgbWVzc2FnZXMgd2hlbgorCXBpcGVsaW5lIHdhcyBnZXR0aW5nIGRpc3Bvc2VkIGFuZCBjYXN0cyB3ZXJlIGZhaWxpbmcuCisKKzIwMDMtMTItMjEgIFJvbmFsZCBCdWx0amUgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisKKwkqIGNvbmZpZ3VyZS5hYzoKKwkgIEltcHJvdmUgbXBlZzJlbmMgZGV0ZWN0aW9uLiBUaGlzIGlzIGZvciBkaXN0cmlidXRpb25zIHRoYXQgZG8KKwkgIHNoaXAgbWpwZWd0b29scywgYnV0IHdpdGhvdXQgbXBlZzJlbmMuIEFsc28gZG9lcyBvYmplY3QgY2hlY2sKKwkgIGZvciBtaWdodCB0aGVyZSBldmVyIGJlIEFCSSBpbmNvbXBhdGliaWxpdHkuCisJKiBleHQvbXBlZzJlbmMvZ3N0bXBlZzJlbmMuY2M6CisJICBBZGQgQW5kcmV3IGFzIHNlY29uZCBtYWludGFpbmVyIChoZSdzIGhlbHBpbmcgbWUpLCBhbmQgYWxzbyBhZGQKKwkgIGFuIGVycm9yIGlmIG5vIGNhcHMgd2FzIHNldC4gVGhpcyBoYXBwZW5zIGlmIEkgcHVsbCBiZWZvcmUgY2Fwc25lZ28KKwkgIGFuZCB0aGF0J3Mgc29tZXRoaW5nIEkgc2hvdWxkIHNvbHZlIHNvbWV0aW1lIGVsc2UuCisJKiBnc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYzoKKwkoZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2Jsb2NrZ3JvdXApOgorCSAgRml4IHRpbWUgcGFyc2luZy4KKwkqIGdzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYzogKGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX2xpbmspLAorCShnc3RfbWF0cm9za2FfbXV4X3RyYWNrX2hlYWRlcik6CisJICBBZGQgY2FwcyB0byB0ZW1wbGF0ZXMuCisJKiBnc3QvbXBlZ2F1ZGlvcGFyc2UvZ3N0bXBlZ2F1ZGlvcGFyc2UuYzogKG1wM19zaW5rX2ZhY3RvcnkpOgorCSAgQWRkIG1wZWd2ZXJzaW9uPTEgdG8gcHJldmVudCBjb25mdXNpb24gd2l0aCBNUEVHL0FBQy4KKwkqIGdzdC9tcGVnc3RyZWFtL2dzdG1wZWdkZW11eC5jOgorCSAgUmVtb3ZlIGxheWVyIHNpbmNlIGl0IGNhdXNlcyB3YXJuaW5ncyBhYm91dCB1bmZpeGVkIGNhcHMuCisJKiBnc3QvdmlkZW90ZXN0c3JjL2dzdHZpZGVvdGVzdHNyYy5jOiAoZ3N0X3ZpZGVvdGVzdHNyY19nZXQpOgorCSAgRml4IG9idmlvdXMgdHlwbyAod2UgZXJyb3Igb3V0IGlmIGNhcHMgd2VyZSBzZXQsIHdlIHNob3VsZCBvZgorCSAgY291cnNlIGVycm9yIG91dCBpZiAqbm8qIGNhcHMgd2VyZSBzZXQpLgorCSogc3lzL29zcy9nc3Rvc3NlbGVtZW50LmM6IChnc3Rfb3NzZWxlbWVudF9jb252ZXJ0KToKKwkgIEZpeCBmb3JtYXQgY29udmVyc2lvbiwgd2UgY29uZnVzZWQgYml0cy9ieXRlcy4KKwkqIHN5cy9vc3MvZ3N0b3NzZWxlbWVudC5oOgorCSAgSW1wcm92ZSBkb2N1bWVudGF0aW9uIGZvciAnYnBzJy4KKwkqIHN5cy92NGwvVE9ETzoKKwkgIFJlbW92ZSBzdHVmZiBhYm91dCBwbHVnaW5zIHRoYXQgbmVlZCByZW1vdmluZyAtIHRoaXMgd2FzIGRvbmUKKwkgIGFnZXMgYWdvLgorCSogc3lzL3Y0bC9nc3R2NGxtanBlZ3NyYy5jOiAoZ3N0X3Y0bG1qcGVnc3JjX2luaXQpLAorCShnc3RfdjRsbWpwZWdzcmNfc3JjX2NvbnZlcnQpLCAoZ3N0X3Y0bG1qcGVnc3JjX3NyY19xdWVyeSk6CisJKiBzeXMvdjRsL2dzdHY0bHNyYy5jOiAoZ3N0X3Y0bHNyY19pbml0KSwgKGdzdF92NGxzcmNfc3JjX2NvbnZlcnQpLAorCShnc3RfdjRsc3JjX3NyY19xdWVyeSk6CisJKiBzeXMvdjRsMi9nc3R2NGwyc3JjLmM6IChnc3RfdjRsMnNyY19pbml0KSwKKwkoZ3N0X3Y0bDJzcmNfc3JjX2NvbnZlcnQpLCAoZ3N0X3Y0bDJzcmNfc3JjX3F1ZXJ5KToKKwkgIEFkZCBnZXRfcXVlcnlfdHlwZXMoKSwgZ2V0X2Zvcm1hdHMoKSBhbmQgcXVlcnkoKSBmdW5jdGlvbnMuCisKKzIwMDMtMTItMjEgIFRob21hcyBWYW5kZXIgU3RpY2hlbGUgIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisKKwkqIENoYW5nZUxvZzogbW92ZWQgdG8gZ3N0cmVhbWVyL2RvY3MvcmFuZG9tL29sZC9DaGFuZ2VMb2cuZ3N0LXBsdWdpbnMKKyAgICAgICAgKiBtb3ZlZCBDVlMgdG8gZnJlZWRlc2t0b3Aub3JnCisKZGlmZiAtLWdpdCBhL2RvY3MvcmFuZG9tL1BPUlRFRF8wOSBiL2RvY3MvcmFuZG9tL1BPUlRFRF8wOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTYyOTdkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9yYW5kb20vUE9SVEVEXzA5CkBAIC0wLDAgKzEsMjAgQEAKK1doZW4gcG9ydGluZyBhIHBsdWdpbiBzdGFydCB3aXRoIDAuOCBDVlMgaGVhZCwgbm90IHRoZSBvbGQgY29kZSBpbiB0aGlzIG1vZHVsZS4gVGhlcmUgYXJlIG1hbnkgYnVnZml4ZXMgd2hpY2ggaGF2ZSBnb25lIGludG8gMC44IHdoaWNoIHlvdSB3YW50IHRvIGtlZXAuCisKK0xpc3Qgb2YgcG9ydGVkIHBsdWdpbnMgKHVwZGF0ZSB3aGVuIHlvdSBjb21taXQgYSBwb3J0ZWQgcGx1Z2luKToKK3NwZWV4ZW5jIChhbGltYSkKK2F1cGFyc2UgKGFsaW1hKQorZWZmZWN0diAod2ltKQorbWFkCSh3aW0pCit2aWRlb2ZpbHRlciAod2ltKQorYWFsaWIJKHdpbSkKK2xpYmNhY2EJKHplZXNoYW4pCitsYXcJKHdpbSkKK3Nob3V0MiAgKHphaGVlcikgLSBub3QgZnVsbHkgdGVzdGVkCitlc2RzaW5rIChhcndlZCkKK211bHRpcGFydCAoZG9scGh5KQorCitvc3NzaW5rIGlzIHBhcnRpYWxseSBkb25lIGluIHRoZSB0aHJlYWRlZCBicmFuY2ggKHdpbSkKKworLSBSZW1lbWJlciB0aGF0IHNvbWUgcGx1Z2lucyBhcmUgYWxyZWFkeSBwb3J0ZWQgYW5kIG5vdyBpbiB0aGUgZ3N0LXBsdWdpbnMtYmFzZSBtb2R1bGUuCisKK1doZW4geW91IGhhdmUgcG9ydGVkIGEgcGx1Z2luIHJlbWVtYmVyIHRvIGNvcHkgdGhlIHJlbGV2YW50IHBhcnRzIGZyb20gY29uZmlndXJlLmFjLm9yaWcgaW50byBjb25maWd1cmUuYWMgYW5kIHJlLWVuYWJsZSBpdCBpbiB0aGUgTWFrZWZpbGUuYW0gZmlsZXMuCmRpZmYgLS1naXQgYS9kb2NzL3ZlcnNpb24uZW50aXRpZXMuaW4gYi9kb2NzL3ZlcnNpb24uZW50aXRpZXMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2OTg5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvdmVyc2lvbi5lbnRpdGllcy5pbgpAQCAtMCwwICsxLDIgQEAKKzwhRU5USVRZIEdTVF9BUElfVkVSU0lPTiAiQEdTVF9BUElfVkVSU0lPTkAiPgorPCFFTlRJVFkgR1NUX1ZFUlNJT04gIkBWRVJTSU9OQCI+CmRpZmYgLS1naXQgYS9leHQvTWFrZWZpbGUuYW0gYi9leHQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QzNDkwMgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE2NyBAQAoraWYgVVNFX0FBTElCCitBQUxJQl9ESVIgPSBhYWxpYgorZWxzZQorQUFMSUJfRElSID0KK2VuZGlmCisKK2lmIFVTRV9DQUlSTworQ0FJUk9fRElSID0gY2Fpcm8KK2Vsc2UKK0NBSVJPX0RJUiA9CitlbmRpZgorCitpZiBVU0VfRkxBQworRkxBQ19ESVIgPSBmbGFjCitlbHNlCitGTEFDX0RJUiA9CitlbmRpZgorCitpZiBVU0VfR0RLX1BJWEJVRgorR0RLX1BJWEJVRl9ESVIgPSBnZGtfcGl4YnVmCitlbHNlCitHREtfUElYQlVGX0RJUiA9CitlbmRpZgorCitpZiBVU0VfSkFDSworSkFDS19ESVI9amFjaworZWxzZQorSkFDS19ESVI9CitlbmRpZgorCitpZiBVU0VfSlBFRworSlBFR19ESVIgPSBqcGVnCitlbHNlCitKUEVHX0RJUiA9CitlbmRpZgorCitpZiBVU0VfTEFNRQorTEFNRV9ESVIgPSBsYW1lCitlbHNlCitMQU1FX0RJUiA9CitlbmRpZgorCitpZiBVU0VfTElCQ0FDQQorTElCQ0FDQV9ESVIgPSBsaWJjYWNhCitlbHNlCitMSUJDQUNBX0RJUiA9CitlbmRpZgorCitpZiBVU0VfTElCRFYKK0xJQkRWX0RJUiA9IGR2CitlbHNlCitMSUJEVl9ESVIgPQorZW5kaWYKKworaWYgVVNFX0xJQlBORworTElCUE5HX0RJUiA9IGxpYnBuZworZWxzZQorTElCUE5HX0RJUiA9CitlbmRpZgorCitpZiBVU0VfTVBHMTIzCitNUEcxMjNfRElSID0gbXBnMTIzCitlbHNlCitNUEcxMjNfRElSID0KK2VuZGlmCisKK2lmIFVTRV9EVjEzOTQKK0RWMTM5NF9ESVIgPSByYXcxMzk0CitlbHNlCitEVjEzOTRfRElSID0KK2VuZGlmCisKK2lmIFVTRV9QVUxTRQorUFVMU0VfRElSID0gcHVsc2UKK2Vsc2UKK1BVTFNFX0RJUiA9CitlbmRpZgorCisKK2lmIFVTRV9TSE9VVDIKK1NIT1VUMl9ESVIgPSBzaG91dDIKK2Vsc2UKK1NIT1VUMl9ESVIgPQorZW5kaWYKKworaWYgVVNFX1NPVVAKK1NPVVBfRElSPXNvdXAKK2Vsc2UKK1NPVVBfRElSPQorZW5kaWYKKworaWYgVVNFX1NQRUVYCitTUEVFWF9ESVIgPSBzcGVleAorZWxzZQorU1BFRVhfRElSID0KK2VuZGlmCisKK2lmIFVTRV9UQUdMSUIKK1RBR0xJQl9ESVIgPSB0YWdsaWIKK2Vsc2UKK1RBR0xJQl9ESVIgPQorZW5kaWYKKworaWYgVVNFX1RXT0xBTUUKK1RXT0xBTUVfRElSID0gdHdvbGFtZQorZWxzZQorVFdPTEFNRV9ESVIgPQorZW5kaWYKKworaWYgVVNFX1ZQWAorVlBYX0RJUj12cHgKK2Vsc2UKK1ZQWF9ESVI9CitlbmRpZgorCitpZiBVU0VfV0FWUEFDSworV0FWUEFDS19ESVI9d2F2cGFjaworZWxzZQorV0FWUEFDS19ESVI9CitlbmRpZgorCitTVUJESVJTID0gXAorCSQoQUFMSUJfRElSKSBcCisJJChDQUlST19ESVIpIFwKKwkkKERWMTM5NF9ESVIpIFwKKwkkKEZMQUNfRElSKSBcCisJJChHREtfUElYQlVGX0RJUikgXAorCSQoSkFDS19ESVIpIFwKKwkkKEpQRUdfRElSKSBcCisJJChMQU1FX0RJUikgXAorCSQoTElCQ0FDQV9ESVIpIFwKKwkkKExJQkRWX0RJUikgXAorCSQoTElCTU5HX0RJUikgXAorCSQoTElCUE5HX0RJUikgXAorCSQoTVBHMTIzX0RJUikgXAorCSQoUFVMU0VfRElSKSBcCisJJChTSE9VVDJfRElSKSBcCisJJChTT1VQX0RJUikgXAorCSQoU1BFRVhfRElSKSBcCisJJChUQUdMSUJfRElSKSBcCisJJChUV09MQU1FX0RJUikgXAorCSQoVlBYX0RJUikgXAorCSQoV0FWUEFDS19ESVIpCisKK0RJU1RfU1VCRElSUyA9IFwKKwlhYWxpYiBcCisJY2Fpcm8gXAorCWR2IFwKKwlmbGFjIFwKKwlnZGtfcGl4YnVmIFwKKwlqYWNrIFwKKwlqcGVnIFwKKwlsYW1lIFwKKwlsaWJjYWNhIFwKKwlsaWJwbmcgXAorCW1wZzEyMyBcCisJcHVsc2UgXAorCXJhdzEzOTQgXAorCXNob3V0MiBcCisJc291cCBcCisJc3BlZXggXAorCXRhZ2xpYiBcCisJdHdvbGFtZSBcCisJdnB4IFwKKwl3YXZwYWNrCisKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9jb21tb24vcGFyYWxsZWwtc3ViZGlycy5tYWsKZGlmZiAtLWdpdCBhL2V4dC9hYWxpYi9NYWtlZmlsZS5hbSBiL2V4dC9hYWxpYi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWI2NmViCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2FhbGliL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOCBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0YWFzaW5rLmxhCisKK2xpYmdzdGFhc2lua19sYV9TT1VSQ0VTID0gZ3N0YWFzaW5rLmMKK2xpYmdzdGFhc2lua19sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKEFBTElCX0NGTEFHUykKK2xpYmdzdGFhc2lua19sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R2aWRlby0kKEdTVF9BUElfVkVSU0lPTikgJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKEFBTElCX0xJQlMpCitsaWJnc3RhYXNpbmtfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdGFhc2luay5oCmRpZmYgLS1naXQgYS9leHQvYWFsaWIvZ3N0YWFzaW5rLmMgYi9leHQvYWFsaWIvZ3N0YWFzaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwZTQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9hYWxpYi9nc3RhYXNpbmsuYwpAQCAtMCwwICsxLDU5NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hYXNpbmsKKyAqIEBzZWVfYWxzbzogI0dzdENBQ0FTaW5rCisgKgorICogRGlzcGxheXMgdmlkZW8gYXMgYi93IGFzY2lpIGFydC4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj10ZXN0LmF2aSAhIGRlY29kZWJpbiAhIHZpZGVvY29udmVydCAhIGFhc2luaworICogXXwgVGhpcyBwaXBlbGluZSByZW5kZXJzIGEgdmlkZW8gdG8gYXNjaWkgYXJ0IGludG8gYSBzZXBhcmF0ZSB3aW5kb3cuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj10ZXN0LmF2aSAhIGRlY29kZWJpbiAhIHZpZGVvY29udmVydCAhIGFhc2luayBkcml2ZXI9Y3Vyc2VzCisgKiBdfCBUaGlzIHBpcGVsaW5lIHJlbmRlcnMgYSB2aWRlbyB0byBhc2NpaSBhcnQgaW50byB0aGUgY3VycmVudCB0ZXJtaW5hbC4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb21ldGEuaD4KKyNpbmNsdWRlICJnc3RhYXNpbmsuaCIKKworLyogYWFzaW5rIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgTEFTVF9TSUdOQUwKK307CisKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfV0lEVEgsCisgIFBST1BfSEVJR0hULAorICBQUk9QX0RSSVZFUiwKKyAgUFJPUF9ESVRIRVIsCisgIFBST1BfQlJJR0hUTkVTUywKKyAgUFJPUF9DT05UUkFTVCwKKyAgUFJPUF9HQU1NQSwKKyAgUFJPUF9JTlZFUlNJT04sCisgIFBST1BfUkFORE9NVkFMLAorICBQUk9QX0ZSQU1FU19ESVNQTEFZRUQsCisgIFBST1BfRlJBTUVfVElNRQorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJJNDIwIikpCisgICAgKTsKKworc3RhdGljIEdzdENhcHMgKmdzdF9hYXNpbmtfZml4YXRlIChHc3RCYXNlU2luayAqIGJzaW5rLCBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2Fhc2lua19zZXRjYXBzIChHc3RCYXNlU2luayAqIGJzaW5rLCBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgdm9pZCBnc3RfYWFzaW5rX2dldF90aW1lcyAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0QnVmZmVyICogYnVmZmVyLAorICAgIEdzdENsb2NrVGltZSAqIHN0YXJ0LCBHc3RDbG9ja1RpbWUgKiBlbmQpOworc3RhdGljIGdib29sZWFuIGdzdF9hYXNpbmtfcHJvcG9zZV9hbGxvY2F0aW9uIChHc3RCYXNlU2luayAqIGJzaW5rLAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2Fhc2lua19zaG93X2ZyYW1lIChHc3RWaWRlb1NpbmsgKiB2aWRlb3NpbmssCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworc3RhdGljIHZvaWQgZ3N0X2Fhc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfYWFzaW5rX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9hYXNpbmtfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworI2RlZmluZSBnc3RfYWFzaW5rX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdEFBU2luaywgZ3N0X2Fhc2luaywgR1NUX1RZUEVfVklERU9fU0lOSyk7CisKKyNkZWZpbmUgR1NUX1RZUEVfQUFEUklWRVJTIChnc3RfYWFzaW5rX2RyaXZlcnNfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X2Fhc2lua19kcml2ZXJzX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZHJpdmVyX3R5cGUgPSAwOworCisgIGlmICghZHJpdmVyX3R5cGUpIHsKKyAgICBHRW51bVZhbHVlICpkcml2ZXJzOworICAgIGNvbnN0IHN0cnVjdCBhYV9kcml2ZXIgKmRyaXZlcjsKKyAgICBnaW50IG5fZHJpdmVyczsKKyAgICBnaW50IGk7CisKKyAgICBmb3IgKG5fZHJpdmVycyA9IDA7IGFhX2RyaXZlcnNbbl9kcml2ZXJzXTsgbl9kcml2ZXJzKyspIHsKKyAgICAgIC8qIGNvdW50IG51bWJlciBvZiBkcml2ZXJzICovCisgICAgfQorCisgICAgZHJpdmVycyA9IGdfbmV3MCAoR0VudW1WYWx1ZSwgbl9kcml2ZXJzICsgMSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbl9kcml2ZXJzOyBpKyspIHsKKyAgICAgIGRyaXZlciA9IGFhX2RyaXZlcnNbaV07CisgICAgICBkcml2ZXJzW2ldLnZhbHVlID0gaTsKKyAgICAgIGRyaXZlcnNbaV0udmFsdWVfbmFtZSA9IGdfc3RyZHVwIChkcml2ZXItPm5hbWUpOworICAgICAgZHJpdmVyc1tpXS52YWx1ZV9uaWNrID0gZ191dGY4X3N0cmRvd24gKGRyaXZlci0+c2hvcnRuYW1lLCAtMSk7CisgICAgfQorICAgIGRyaXZlcnNbaV0udmFsdWUgPSAwOworICAgIGRyaXZlcnNbaV0udmFsdWVfbmFtZSA9IE5VTEw7CisgICAgZHJpdmVyc1tpXS52YWx1ZV9uaWNrID0gTlVMTDsKKworICAgIGRyaXZlcl90eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdEFBU2lua0RyaXZlcnMiLCBkcml2ZXJzKTsKKyAgfQorICByZXR1cm4gZHJpdmVyX3R5cGU7Cit9CisKKyNkZWZpbmUgR1NUX1RZUEVfQUFESVRIRVIgKGdzdF9hYXNpbmtfZGl0aGVyX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9hYXNpbmtfZGl0aGVyX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZGl0aGVyX3R5cGUgPSAwOworCisgIGlmICghZGl0aGVyX3R5cGUpIHsKKyAgICBHRW51bVZhbHVlICpkaXRoZXJlcnM7CisgICAgZ2ludCBuX2RpdGhlcmVyczsKKyAgICBnaW50IGk7CisKKyAgICBmb3IgKG5fZGl0aGVyZXJzID0gMDsgYWFfZGl0aGVybmFtZXNbbl9kaXRoZXJlcnNdOyBuX2RpdGhlcmVycysrKSB7CisgICAgICAvKiBjb3VudCBudW1iZXIgb2YgZGl0aGVyZXJzICovCisgICAgfQorCisgICAgZGl0aGVyZXJzID0gZ19uZXcwIChHRW51bVZhbHVlLCBuX2RpdGhlcmVycyArIDEpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5fZGl0aGVyZXJzOyBpKyspIHsKKyAgICAgIGRpdGhlcmVyc1tpXS52YWx1ZSA9IGk7CisgICAgICBkaXRoZXJlcnNbaV0udmFsdWVfbmFtZSA9IGdfc3RyZHVwIChhYV9kaXRoZXJuYW1lc1tpXSk7CisgICAgICBkaXRoZXJlcnNbaV0udmFsdWVfbmljayA9CisgICAgICAgICAgZ19zdHJkZWxpbWl0IChnX3N0cmR1cCAoYWFfZGl0aGVybmFtZXNbaV0pLCAiIF8iLCAnLScpOworICAgIH0KKyAgICBkaXRoZXJlcnNbaV0udmFsdWUgPSAwOworICAgIGRpdGhlcmVyc1tpXS52YWx1ZV9uYW1lID0gTlVMTDsKKyAgICBkaXRoZXJlcnNbaV0udmFsdWVfbmljayA9IE5VTEw7CisKKyAgICBkaXRoZXJfdHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RBQVNpbmtEaXRoZXJlcnMiLCBkaXRoZXJlcnMpOworICB9CisgIHJldHVybiBkaXRoZXJfdHlwZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hYXNpbmtfY2xhc3NfaW5pdCAoR3N0QUFTaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VTaW5rQ2xhc3MgKmdzdGJhc2VzaW5rX2NsYXNzOworICBHc3RWaWRlb1NpbmtDbGFzcyAqZ3N0dmlkZW9zaW5rX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MgPSAoR3N0QmFzZVNpbmtDbGFzcyAqKSBrbGFzczsKKyAgZ3N0dmlkZW9zaW5rX2NsYXNzID0gKEdzdFZpZGVvU2lua0NsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9hYXNpbmtfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfYWFzaW5rX2dldF9wcm9wZXJ0eTsKKworICAvKiBGSVhNRTogYWRkIGxvbmcgcHJvcGVydHkgZGVzY3JpcHRpb25zICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfV0lEVEgsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgid2lkdGgiLCAid2lkdGgiLCAid2lkdGgiLCBHX01JTklOVCwgR19NQVhJTlQsIDAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfSEVJR0hULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImhlaWdodCIsICJoZWlnaHQiLCAiaGVpZ2h0IiwgR19NSU5JTlQsIEdfTUFYSU5ULCAwLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0RSSVZFUiwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgiZHJpdmVyIiwgImRyaXZlciIsICJkcml2ZXIiLCBHU1RfVFlQRV9BQURSSVZFUlMsIDAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfRElUSEVSLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJkaXRoZXIiLCAiZGl0aGVyIiwgImRpdGhlciIsIEdTVF9UWVBFX0FBRElUSEVSLCAwLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0JSSUdIVE5FU1MsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiYnJpZ2h0bmVzcyIsICJicmlnaHRuZXNzIiwgImJyaWdodG5lc3MiLCBHX01JTklOVCwKKyAgICAgICAgICBHX01BWElOVCwgMCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQ09OVFJBU1QsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiY29udHJhc3QiLCAiY29udHJhc3QiLCAiY29udHJhc3QiLCBHX01JTklOVCwgR19NQVhJTlQsCisgICAgICAgICAgMCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfR0FNTUEsCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJnYW1tYSIsICJnYW1tYSIsICJnYW1tYSIsIDAuMCwgNS4wLCAxLjAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfSU5WRVJTSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJpbnZlcnNpb24iLCAiaW52ZXJzaW9uIiwgImludmVyc2lvbiIsIFRSVUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfUkFORE9NVkFMLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInJhbmRvbXZhbCIsICJyYW5kb212YWwiLCAicmFuZG9tdmFsIiwgR19NSU5JTlQsCisgICAgICAgICAgR19NQVhJTlQsIDAsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgUFJPUF9GUkFNRVNfRElTUExBWUVELCBnX3BhcmFtX3NwZWNfaW50ICgiZnJhbWVzLWRpc3BsYXllZCIsCisgICAgICAgICAgImZyYW1lcyBkaXNwbGF5ZWQiLCAiZnJhbWVzIGRpc3BsYXllZCIsIEdfTUlOSU5ULCBHX01BWElOVCwgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0ZSQU1FX1RJTUUsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiZnJhbWUtdGltZSIsICJmcmFtZSB0aW1lIiwgImZyYW1lIHRpbWUiLCBHX01JTklOVCwKKyAgICAgICAgICBHX01BWElOVCwgMCwgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiQVNDSUkgYXJ0IHZpZGVvIHNpbmsiLCAiU2luay9WaWRlbyIsICJBbiBBU0NJSSBhcnQgdmlkZW9zaW5rIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY2hlbGxvLmJlPiIpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWFzaW5rX2NoYW5nZV9zdGF0ZSk7CisKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPmZpeGF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWFzaW5rX2ZpeGF0ZSk7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5zZXRfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWFzaW5rX3NldGNhcHMpOworICBnc3RiYXNlc2lua19jbGFzcy0+Z2V0X3RpbWVzID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hYXNpbmtfZ2V0X3RpbWVzKTsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnByb3Bvc2VfYWxsb2NhdGlvbiA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Fhc2lua19wcm9wb3NlX2FsbG9jYXRpb24pOworCisgIGdzdHZpZGVvc2lua19jbGFzcy0+c2hvd19mcmFtZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWFzaW5rX3Nob3dfZnJhbWUpOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfYWFzaW5rX2ZpeGF0ZSAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworCisgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAoc3RydWN0dXJlLCAid2lkdGgiLCAzMjApOworICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAoc3RydWN0dXJlLCAiaGVpZ2h0IiwgMjQwKTsKKyAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9mcmFjdGlvbiAoc3RydWN0dXJlLCAiZnJhbWVyYXRlIiwgMzAsIDEpOworCisgIGNhcHMgPSBHU1RfQkFTRV9TSU5LX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maXhhdGUgKGJzaW5rLCBjYXBzKTsKKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYWFzaW5rX3NldGNhcHMgKEdzdEJhc2VTaW5rICogYmFzZXNpbmssIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RBQVNpbmsgKmFhc2luazsKKyAgR3N0VmlkZW9JbmZvIGluZm87CisKKyAgYWFzaW5rID0gR1NUX0FBU0lOSyAoYmFzZXNpbmspOworCisgIGlmICghZ3N0X3ZpZGVvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgY2FwcykpCisgICAgZ290byBpbnZhbGlkX2NhcHM7CisKKyAgYWFzaW5rLT5pbmZvID0gaW5mbzsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfY2FwczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFhc2luaywgImludmFsaWQgY2FwcyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2Fhc2lua19pbml0IChHc3RBQVNpbmsgKiBhYXNpbmspCit7CisgIG1lbWNweSAoJmFhc2luay0+YXNjaWlfc3VyZiwgJmFhX2RlZnBhcmFtcywKKyAgICAgIHNpemVvZiAoc3RydWN0IGFhX2hhcmR3YXJlX3BhcmFtcykpOworICBhYXNpbmstPmFzY2lpX3Bhcm1zLmJyaWdodCA9IDA7CisgIGFhc2luay0+YXNjaWlfcGFybXMuY29udHJhc3QgPSAxNjsKKyAgYWFzaW5rLT5hc2NpaV9wYXJtcy5nYW1tYSA9IDEuMDsKKyAgYWFzaW5rLT5hc2NpaV9wYXJtcy5kaXRoZXIgPSAwOworICBhYXNpbmstPmFzY2lpX3Bhcm1zLmludmVyc2lvbiA9IDA7CisgIGFhc2luay0+YXNjaWlfcGFybXMucmFuZG9tdmFsID0gMDsKKyAgYWFzaW5rLT5hYV9kcml2ZXIgPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2Fhc2lua19zY2FsZSAoR3N0QUFTaW5rICogYWFzaW5rLCBndWNoYXIgKiBzcmMsIGd1Y2hhciAqIGRlc3QsCisgICAgZ2ludCBzdywgZ2ludCBzaCwgZ2ludCBzcywgZ2ludCBkdywgZ2ludCBkaCkKK3sKKyAgZ2ludCB5cG9zLCB5aW5jLCB5OworICBnaW50IHhwb3MsIHhpbmMsIHg7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoKGR3ICE9IDApICYmIChkaCAhPSAwKSk7CisKKyAgeXBvcyA9IDB4MTAwMDA7CisgIHlpbmMgPSAoc2ggPDwgMTYpIC8gZGg7CisgIHhpbmMgPSAoc3cgPDwgMTYpIC8gZHc7CisKKyAgZm9yICh5ID0gZGg7IHk7IHktLSkgeworICAgIHdoaWxlICh5cG9zID4gMHgxMDAwMCkgeworICAgICAgeXBvcyAtPSAweDEwMDAwOworICAgICAgc3JjICs9IHNzOworICAgIH0KKyAgICB4cG9zID0gMHgxMDAwMDsKKyAgICB7CisgICAgICBndWNoYXIgKmRlc3RwID0gZGVzdDsKKyAgICAgIGd1Y2hhciAqc3JjcCA9IHNyYzsKKworICAgICAgZm9yICh4ID0gZHc7IHg7IHgtLSkgeworICAgICAgICB3aGlsZSAoeHBvcyA+PSAweDEwMDAwTCkgeworICAgICAgICAgIHNyY3ArKzsKKyAgICAgICAgICB4cG9zIC09IDB4MTAwMDBMOworICAgICAgICB9CisgICAgICAgICpkZXN0cCsrID0gKnNyY3A7CisgICAgICAgIHhwb3MgKz0geGluYzsKKyAgICAgIH0KKyAgICB9CisgICAgZGVzdCArPSBkdzsKKyAgICB5cG9zICs9IHlpbmM7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hYXNpbmtfZ2V0X3RpbWVzIChHc3RCYXNlU2luayAqIHNpbmssIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBHc3RDbG9ja1RpbWUgKiBzdGFydCwgR3N0Q2xvY2tUaW1lICogZW5kKQoreworICAqc3RhcnQgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKTsKKyAgaWYgKEdTVF9CVUZGRVJfRFVSQVRJT05fSVNfVkFMSUQgKGJ1ZmZlcikpCisgICAgKmVuZCA9ICpzdGFydCArIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2Fhc2lua19wcm9wb3NlX2FsbG9jYXRpb24gKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdFZpZGVvSW5mbyBpbmZvOworICBndWludCBzaXplOworCisgIGdzdF9xdWVyeV9wYXJzZV9hbGxvY2F0aW9uIChxdWVyeSwgJmNhcHMsIE5VTEwpOworCisgIGlmIChjYXBzID09IE5VTEwpCisgICAgZ290byBub19jYXBzOworCisgIGlmICghZ3N0X3ZpZGVvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgY2FwcykpCisgICAgZ290byBpbnZhbGlkX2NhcHM7CisKKyAgc2l6ZSA9IEdTVF9WSURFT19JTkZPX1NJWkUgKCZpbmZvKTsKKworICAvKiB3ZSBuZWVkIGF0IGxlYXN0IDIgYnVmZmVyIGJlY2F1c2Ugd2UgaG9sZCBvbiB0byB0aGUgbGFzdCBvbmUgKi8KKyAgZ3N0X3F1ZXJ5X2FkZF9hbGxvY2F0aW9uX3Bvb2wgKHF1ZXJ5LCBOVUxMLCBzaXplLCAyLCAwKTsKKworICAvKiB3ZSBzdXBwb3J0IHZhcmlvdXMgbWV0YWRhdGEgKi8KKyAgZ3N0X3F1ZXJ5X2FkZF9hbGxvY2F0aW9uX21ldGEgKHF1ZXJ5LCBHU1RfVklERU9fTUVUQV9BUElfVFlQRSwgTlVMTCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19jYXBzOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYnNpbmssICJubyBjYXBzIHNwZWNpZmllZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQoraW52YWxpZF9jYXBzOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYnNpbmssICJpbnZhbGlkIGNhcHMgc3BlY2lmaWVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYWFzaW5rX3Nob3dfZnJhbWUgKEdzdFZpZGVvU2luayAqIHZpZGVvc2luaywgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RBQVNpbmsgKmFhc2luazsKKyAgR3N0VmlkZW9GcmFtZSBmcmFtZTsKKworICBhYXNpbmsgPSBHU1RfQUFTSU5LICh2aWRlb3NpbmspOworCisgIEdTVF9ERUJVRyAoInNob3cgZnJhbWUiKTsKKworICBpZiAoIWdzdF92aWRlb19mcmFtZV9tYXAgKCZmcmFtZSwgJmFhc2luay0+aW5mbywgYnVmZmVyLCBHU1RfTUFQX1JFQUQpKQorICAgIGdvdG8gaW52YWxpZF9mcmFtZTsKKworICBnc3RfYWFzaW5rX3NjYWxlIChhYXNpbmssIEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBICgmZnJhbWUsIDApLCAgICAgLyogc3JjICovCisgICAgICBhYV9pbWFnZSAoYWFzaW5rLT5jb250ZXh0KSwgICAgICAgLyogZGVzdCAqLworICAgICAgR1NUX1ZJREVPX0lORk9fV0lEVEggKCZhYXNpbmstPmluZm8pLCAgICAgLyogc3cgKi8KKyAgICAgIEdTVF9WSURFT19JTkZPX0hFSUdIVCAoJmFhc2luay0+aW5mbyksICAgIC8qIHNoICovCisgICAgICBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFICgmZnJhbWUsIDApLCAvKiBzcyAqLworICAgICAgYWFfaW1nd2lkdGggKGFhc2luay0+Y29udGV4dCksICAgIC8qIGR3ICovCisgICAgICBhYV9pbWdoZWlnaHQgKGFhc2luay0+Y29udGV4dCkpOyAgLyogZGggKi8KKworICBhYV9yZW5kZXIgKGFhc2luay0+Y29udGV4dCwgJmFhc2luay0+YXNjaWlfcGFybXMsCisgICAgICAwLCAwLCBhYV9pbWd3aWR0aCAoYWFzaW5rLT5jb250ZXh0KSwgYWFfaW1naGVpZ2h0IChhYXNpbmstPmNvbnRleHQpKTsKKyAgYWFfZmx1c2ggKGFhc2luay0+Y29udGV4dCk7CisgIGFhX2dldGV2ZW50IChhYXNpbmstPmNvbnRleHQsIEZBTFNFKTsKKyAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmZnJhbWUpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfZnJhbWU6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhYXNpbmssICJpbnZhbGlkIGZyYW1lIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9hYXNpbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEFBU2luayAqYWFzaW5rOworCisgIGFhc2luayA9IEdTVF9BQVNJTksgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1dJRFRIOgorICAgICAgYWFzaW5rLT5hc2NpaV9zdXJmLndpZHRoID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSEVJR0hUOgorICAgICAgYWFzaW5rLT5hc2NpaV9zdXJmLmhlaWdodCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RSSVZFUjp7CisgICAgICBhYXNpbmstPmFhX2RyaXZlciA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfRElUSEVSOnsKKyAgICAgIGFhc2luay0+YXNjaWlfcGFybXMuZGl0aGVyID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9CUklHSFRORVNTOnsKKyAgICAgIGFhc2luay0+YXNjaWlfcGFybXMuYnJpZ2h0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0NPTlRSQVNUOnsKKyAgICAgIGFhc2luay0+YXNjaWlfcGFybXMuY29udHJhc3QgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfR0FNTUE6eworICAgICAgYWFzaW5rLT5hc2NpaV9wYXJtcy5nYW1tYSA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0lOVkVSU0lPTjp7CisgICAgICBhYXNpbmstPmFzY2lpX3Bhcm1zLmludmVyc2lvbiA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfUkFORE9NVkFMOnsKKyAgICAgIGFhc2luay0+YXNjaWlfcGFybXMucmFuZG9tdmFsID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWFzaW5rX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBQVNpbmsgKmFhc2luazsKKworICBhYXNpbmsgPSBHU1RfQUFTSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9XSURUSDp7CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBhYXNpbmstPmFzY2lpX3N1cmYud2lkdGgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9IRUlHSFQ6eworICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgYWFzaW5rLT5hc2NpaV9zdXJmLmhlaWdodCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0RSSVZFUjp7CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgYWFzaW5rLT5hYV9kcml2ZXIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9ESVRIRVI6eworICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGFhc2luay0+YXNjaWlfcGFybXMuZGl0aGVyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfQlJJR0hUTkVTUzp7CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBhYXNpbmstPmFzY2lpX3Bhcm1zLmJyaWdodCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0NPTlRSQVNUOnsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGFhc2luay0+YXNjaWlfcGFybXMuY29udHJhc3QpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9HQU1NQTp7CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIGFhc2luay0+YXNjaWlfcGFybXMuZ2FtbWEpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9JTlZFUlNJT046eworICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIGFhc2luay0+YXNjaWlfcGFybXMuaW52ZXJzaW9uKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfUkFORE9NVkFMOnsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGFhc2luay0+YXNjaWlfcGFybXMucmFuZG9tdmFsKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfRlJBTUVTX0RJU1BMQVlFRDp7CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBhYXNpbmstPmZyYW1lc19kaXNwbGF5ZWQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9GUkFNRV9USU1FOnsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGFhc2luay0+ZnJhbWVfdGltZSAvIDEwMDAwMDApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6eworICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYXNpbmtfb3BlbiAoR3N0QUFTaW5rICogYWFzaW5rKQoreworICBpZiAoIWFhc2luay0+Y29udGV4dCkgeworICAgIGFhX3JlY29tbWVuZGhpZGlzcGxheSAoYWFfZHJpdmVyc1thYXNpbmstPmFhX2RyaXZlcl0tPnNob3J0bmFtZSk7CisKKyAgICBhYXNpbmstPmNvbnRleHQgPSBhYV9hdXRvaW5pdCAoJmFhc2luay0+YXNjaWlfc3VyZik7CisgICAgaWYgKGFhc2luay0+Y29udGV4dCA9PSBOVUxMKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoR1NUX0VMRU1FTlQgKGFhc2luayksIExJQlJBUlksIFRPT19MQVpZLCAoTlVMTCksCisgICAgICAgICAgKCJlcnJvciBvcGVuaW5nIGFhbGliIGNvbnRleHQiKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGFhX2F1dG9pbml0a2JkIChhYXNpbmstPmNvbnRleHQsIDApOworICAgIGFhX3Jlc2l6ZWhhbmRsZXIgKGFhc2luay0+Y29udGV4dCwgKHZvaWQgKikgYWFfcmVzaXplKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYWFzaW5rX2Nsb3NlIChHc3RBQVNpbmsgKiBhYXNpbmspCit7CisgIGFhX2Nsb3NlIChhYXNpbmstPmNvbnRleHQpOworICBhYXNpbmstPmNvbnRleHQgPSBOVUxMOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9hYXNpbmtfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgaWYgKCFnc3RfYWFzaW5rX29wZW4gKEdTVF9BQVNJTksgKGVsZW1lbnQpKSkKKyAgICAgICAgZ290byBvcGVuX2ZhaWxlZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUExBWUlORzoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QTEFZSU5HX1RPX1BBVVNFRDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGdzdF9hYXNpbmtfY2xvc2UgKEdTVF9BQVNJTksgKGVsZW1lbnQpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7CisKK29wZW5fZmFpbGVkOgorICB7CisgICAgcmV0dXJuIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImFhc2luayIsIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX0FBU0lOSykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgYWFzaW5rLAorICAgICJBU0NJSSBBcnQgdmlkZW8gc2luayIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKTsKZGlmZiAtLWdpdCBhL2V4dC9hYWxpYi9nc3RhYXNpbmsuaCBiL2V4dC9hYWxpYi9nc3RhYXNpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzg2YzI1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2FhbGliL2dzdGFhc2luay5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfQUFTSU5LX0hfXworI2RlZmluZSBfX0dTVF9BQVNJTktfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvc2luay5oPgorCisjaW5jbHVkZSA8YWFsaWIuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKyNkZWZpbmUgR1NUX1RZUEVfQUFTSU5LIFwKKyAgKGdzdF9hYXNpbmtfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0FBU0lOSyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0FBU0lOSyxHc3RBQVNpbmspKQorI2RlZmluZSBHU1RfQUFTSU5LX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0FBU0lOSyxHc3RBQVNpbmtDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BQVNJTksob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9BQVNJTkspKQorI2RlZmluZSBHU1RfSVNfQUFTSU5LX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0FBU0lOSykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBQVNpbmsgR3N0QUFTaW5rOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEFBU2lua0NsYXNzIEdzdEFBU2lua0NsYXNzOworCitzdHJ1Y3QgX0dzdEFBU2luayB7CisgIEdzdFZpZGVvU2luayBwYXJlbnQ7CisKKyAgR3N0VmlkZW9JbmZvIGluZm87CisKKyAgZ2ludCBmcmFtZXNfZGlzcGxheWVkOworICBndWludDY0IGZyYW1lX3RpbWU7CisKKyAgYWFfY29udGV4dCAqY29udGV4dDsKKyAgc3RydWN0IGFhX2hhcmR3YXJlX3BhcmFtcyBhc2NpaV9zdXJmOworICBzdHJ1Y3QgYWFfcmVuZGVycGFyYW1zIGFzY2lpX3Bhcm1zOworICBhYV9wYWxldHRlIHBhbGV0dGU7CisgIGdpbnQgYWFfZHJpdmVyOworfTsKKworc3RydWN0IF9Hc3RBQVNpbmtDbGFzcyB7CisgIEdzdFZpZGVvU2lua0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9hYXNpbmtfZ2V0X3R5cGUodm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworI2VuZGlmIC8qIF9fR1NUX0FBU0lOS0VfSF9fICovCmRpZmYgLS1naXQgYS9leHQvYWFsaWIvbWVzb24uYnVpbGQgYi9leHQvYWFsaWIvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjZGY3MgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9hYWxpYi9tZXNvbi5idWlsZApAQCAtMCwwICsxLDE0IEBACisjIFZlcnkgbXVjaCBub3QgZ29pbmcgdG8gaW1wbGVtZW50IGFsbCBraW5kcyBvZiBsb2dpYyBhcm91bmQgYWFsaWItY29uZmlnCisjIG9yIGNhdGVyIGZvciBub24tc3RhbmRhcmQgcHJlZml4ZXMuCitpZiBjYy5oYXNfaGVhZGVyKCdhYWxpYi5oJykKKyAgbGliYWFfZGVwID0gY2MuZmluZF9saWJyYXJ5KCdhYScsIHJlcXVpcmVkIDogZmFsc2UpCisgIGlmIGxpYmFhX2RlcC5mb3VuZCgpCisgICAgbGlicmFyeSgnZ3N0YWFzaW5rJywgJ2dzdGFhc2luay5jJywKKyAgICAgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgICAgIGxpbmtfYXJncyA6IG5vc2VoX2xpbmtfYXJncywKKyAgICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgICAgIGRlcGVuZGVuY2llcyA6IFtnc3R2aWRlb19kZXAsIGdzdGJhc2VfZGVwLCBsaWJhYV9kZXBdLAorICAgICAgaW5zdGFsbCA6IHRydWUsCisgICAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIpCisgIGVuZGlmCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L2NhaXJvL01ha2VmaWxlLmFtIGIvZXh0L2NhaXJvL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMzcxMTAKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2Fpcm8vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNiBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0Y2Fpcm8ubGEKKworbm9pbnN0X0hFQURFUlMgPSBcCisJZ3N0Y2Fpcm9vdmVybGF5LmgKK2xpYmdzdGNhaXJvX2xhX1NPVVJDRVMgPSBcCisJZ3N0Y2Fpcm8uYyBcCisJZ3N0Y2Fpcm9vdmVybGF5LmMKK2xpYmdzdGNhaXJvX2xhX0NGTEFHUyA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9DRkxBR1MpICQoQ0FJUk9fQ0ZMQUdTKQorbGliZ3N0Y2Fpcm9fbGFfTElCQUREID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKENBSVJPX0xJQlMpICQoTElCTSkKK2xpYmdzdGNhaXJvX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKwpkaWZmIC0tZ2l0IGEvZXh0L2NhaXJvL2dzdGNhaXJvLmMgYi9leHQvY2Fpcm8vZ3N0Y2Fpcm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjk0Mzg3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NhaXJvL2dzdGNhaXJvLmMKQEAgLTAsMCArMSw0NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwMywyMDA0PiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3RjYWlyb292ZXJsYXkuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZIChjYWlyb19kZWJ1Zyk7CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImNhaXJvb3ZlcmxheSIsIEdTVF9SQU5LX05PTkUsCisgICAgICBHU1RfVFlQRV9DQUlST19PVkVSTEFZKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoY2Fpcm9fZGVidWcsICJjYWlybyIsIDAsICJDYWlybyBlbGVtZW50cyIpOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsIEdTVF9WRVJTSU9OX01JTk9SLCBjYWlybywKKyAgICAiQ2Fpcm8tYmFzZWQgZWxlbWVudHMiLCBwbHVnaW5faW5pdCwgVkVSU0lPTiwKKyAgICBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKTsKZGlmZiAtLWdpdCBhL2V4dC9jYWlyby9nc3RjYWlyb292ZXJsYXkuYyBiL2V4dC9jYWlyby9nc3RjYWlyb292ZXJsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWE0YzUzCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NhaXJvL2dzdGNhaXJvb3ZlcmxheS5jCkBAIC0wLDAgKzEsMjU1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMTE+IEpvbiBOb3JkYnkgPGpvbm9ub3JAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWNhaXJvb3ZlcmxheQorICoKKyAqIGNhaXJvb3ZlcmxheSByZW5kZXJzIGFuIG92ZXJsYXkgdXNpbmcgYSBhcHBsaWNhdGlvbiBwcm92aWRlZCByZW5kZXIgZnVuY3Rpb24uCisgKgorICogVGhlIGZ1bGwgZXhhbXBsZSBjYW4gYmUgZm91bmQgaW4gdGVzdHMvZXhhbXBsZXMvY2Fpcm8vY2Fpcm9fb3ZlcmxheS5jCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBjb2RlPC90aXRsZT4KKyAqIHxbCisgKgorICogI2luY2x1ZGUgJmx0O2dzdC9nc3QuaCZndDsKKyAqICNpbmNsdWRlICZsdDtnc3QvdmlkZW8vdmlkZW8uaCZndDsKKyAqCisgKiAuLi4KKyAqCisgKiB0eXBlZGVmIHN0cnVjdCB7CisgKiAgIGdib29sZWFuIHZhbGlkOworICogICBpbnQgd2lkdGg7CisgKiAgIGludCBoZWlnaHQ7CisgKiB9IENhaXJvT3ZlcmxheVN0YXRlOworICogCisgKiAuLi4KKyAqCisgKiBzdGF0aWMgdm9pZAorICogcHJlcGFyZV9vdmVybGF5IChHc3RFbGVtZW50ICogb3ZlcmxheSwgR3N0Q2FwcyAqIGNhcHMsIGdwb2ludGVyIHVzZXJfZGF0YSkKKyAqIHsKKyAqICAgQ2Fpcm9PdmVybGF5U3RhdGUgKnN0YXRlID0gKENhaXJvT3ZlcmxheVN0YXRlICopdXNlcl9kYXRhOworICoKKyAqICAgZ3N0X3ZpZGVvX2Zvcm1hdF9wYXJzZV9jYXBzIChjYXBzLCBOVUxMLCAmYW1wO3N0YXRlLSZndDt3aWR0aCwgJmFtcDtzdGF0ZS0mZ3Q7aGVpZ2h0KTsKKyAqICAgc3RhdGUtJmd0O3ZhbGlkID0gVFJVRTsKKyAqIH0KKyAqCisgKiBzdGF0aWMgdm9pZAorICogZHJhd19vdmVybGF5IChHc3RFbGVtZW50ICogb3ZlcmxheSwgY2Fpcm9fdCAqIGNyLCBndWludDY0IHRpbWVzdGFtcCwgCisgKiAgIGd1aW50NjQgZHVyYXRpb24sIGdwb2ludGVyIHVzZXJfZGF0YSkKKyAqIHsKKyAqICAgQ2Fpcm9PdmVybGF5U3RhdGUgKnMgPSAoQ2Fpcm9PdmVybGF5U3RhdGUgKil1c2VyX2RhdGE7CisgKiAgIGRvdWJsZSBzY2FsZTsKKyAqCisgKiAgIGlmICghcy0mZ3Q7dmFsaWQpCisgKiAgICAgcmV0dXJuOworICoKKyAqICAgc2NhbGUgPSAyKigoKHRpbWVzdGFtcC8oaW50KTFlNykgJSA3MCkrMzApLzEwMC4wOworICogICBjYWlyb190cmFuc2xhdGUoY3IsIHMtJmd0O3dpZHRoLzIsIChzLSZndDtoZWlnaHQvMiktMzApOworICogICBjYWlyb19zY2FsZSAoY3IsIHNjYWxlLCBzY2FsZSk7CisgKgorICogICBjYWlyb19tb3ZlX3RvIChjciwgMCwgMCk7CisgKiAgIGNhaXJvX2N1cnZlX3RvIChjciwgMCwtMzAsIC01MCwtMzAsIC01MCwwKTsKKyAqICAgY2Fpcm9fY3VydmVfdG8gKGNyLCAtNTAsMzAsIDAsMzUsIDAsNjAgKTsKKyAqICAgY2Fpcm9fY3VydmVfdG8gKGNyLCAwLDM1LCA1MCwzMCwgNTAsMCApOyAqICAKKyAqICAgY2Fpcm9fY3VydmVfdG8gKGNyLCA1MCwtMzAsIDAsLTMwLCAwLDAgKTsKKyAqICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2JhIChjciwgMC45LCAwLjAsIDAuMSwgMC43KTsKKyAqICAgY2Fpcm9fZmlsbCAoY3IpOworICogfQorICoKKyAqIC4uLgorICoKKyAqIGNhaXJvX292ZXJsYXkgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCZxdW90O2NhaXJvb3ZlcmxheSZxdW90OywgJnF1b3Q7b3ZlcmxheSZxdW90Oyk7CisgKgorICogZ19zaWduYWxfY29ubmVjdCAoY2Fpcm9fb3ZlcmxheSwgJnF1b3Q7ZHJhdyZxdW90OywgR19DQUxMQkFDSyAoZHJhd19vdmVybGF5KSwKKyAqICAgb3ZlcmxheV9zdGF0ZSk7CisgKiBnX3NpZ25hbF9jb25uZWN0IChjYWlyb19vdmVybGF5LCAmcXVvdDtjYXBzLWNoYW5nZWQmcXVvdDssIAorICogICBHX0NBTExCQUNLIChwcmVwYXJlX292ZXJsYXkpLCBvdmVybGF5X3N0YXRlKTsKKyAqIC4uLgorICoKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGNhaXJvb3ZlcmxheS5oIgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlIDxjYWlyby5oPgorCisvKiBSR0IxNiBpcyBuYXRpdmUtZW5kaWFubmVzcyBpbiBHU3RyZWFtZXIgKi8KKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIFRFTVBMQVRFX0NBUFMgR1NUX1ZJREVPX0NBUFNfTUFLRSgieyBCR1J4LCBCR1JBLCBSR0IxNiB9IikKKyNlbHNlCisjZGVmaW5lIFRFTVBMQVRFX0NBUFMgR1NUX1ZJREVPX0NBUFNfTUFLRSgieyB4UkdCLCBBUkdCLCBSR0IxNiB9IikKKyNlbmRpZgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X2NhaXJvX292ZXJsYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFRFTVBMQVRFX0NBUFMpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9jYWlyb19vdmVybGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChURU1QTEFURV9DQVBTKQorICAgICk7CisKK0dfREVGSU5FX1RZUEUgKEdzdENhaXJvT3ZlcmxheSwgZ3N0X2NhaXJvX292ZXJsYXksIEdTVF9UWVBFX1ZJREVPX0ZJTFRFUik7CisKK2VudW0KK3sKKyAgU0lHTkFMX0RSQVcsCisgIFNJR05BTF9DQVBTX0NIQU5HRUQsCisgIE5fU0lHTkFMUworfTsKKworc3RhdGljIGd1aW50IGdzdF9jYWlyb19vdmVybGF5X3NpZ25hbHNbTl9TSUdOQUxTXTsKKworc3RhdGljIGdib29sZWFuCitnc3RfY2Fpcm9fb3ZlcmxheV9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RDYXBzICogaW5fY2FwcywKKyAgICBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLCBHc3RDYXBzICogb3V0X2NhcHMsIEdzdFZpZGVvSW5mbyAqIG91dF9pbmZvKQoreworICBHc3RDYWlyb092ZXJsYXkgKm92ZXJsYXkgPSBHU1RfQ0FJUk9fT1ZFUkxBWSAodmZpbHRlcik7CisKKyAgZ19zaWduYWxfZW1pdCAob3ZlcmxheSwgZ3N0X2NhaXJvX292ZXJsYXlfc2lnbmFsc1tTSUdOQUxfQ0FQU19DSEFOR0VEXSwgMCwKKyAgICAgIGluX2NhcHMsIE5VTEwpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2NhaXJvX292ZXJsYXlfdHJhbnNmb3JtX2ZyYW1lX2lwIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsCisgICAgR3N0VmlkZW9GcmFtZSAqIGZyYW1lKQoreworICBHc3RDYWlyb092ZXJsYXkgKm92ZXJsYXkgPSBHU1RfQ0FJUk9fT1ZFUkxBWSAodmZpbHRlcik7CisgIGNhaXJvX3N1cmZhY2VfdCAqc3VyZmFjZTsKKyAgY2Fpcm9fdCAqY3I7CisgIGNhaXJvX2Zvcm1hdF90IGZvcm1hdDsKKworICBzd2l0Y2ggKEdTVF9WSURFT19GUkFNRV9GT1JNQVQgKGZyYW1lKSkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BUkdCOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1JBOgorICAgICAgZm9ybWF0ID0gQ0FJUk9fRk9STUFUX0FSR0IzMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94UkdCOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1J4OgorICAgICAgZm9ybWF0ID0gQ0FJUk9fRk9STUFUX1JHQjI0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQjE2OgorICAgICAgZm9ybWF0ID0gQ0FJUk9fRk9STUFUX1JHQjE2XzU2NTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgeworICAgICAgR1NUX1dBUk5JTkcgKCJObyBtYXRjaGluZyBjYWlybyBmb3JtYXQgZm9yICVzIiwKKyAgICAgICAgICBnc3RfdmlkZW9fZm9ybWF0X3RvX3N0cmluZyAoR1NUX1ZJREVPX0ZSQU1FX0ZPUk1BVCAoZnJhbWUpKSk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorICB9CisKKyAgc3VyZmFjZSA9CisgICAgICBjYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZV9mb3JfZGF0YSAoR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLAorICAgICAgICAgIDApLCBmb3JtYXQsIEdTVF9WSURFT19GUkFNRV9XSURUSCAoZnJhbWUpLAorICAgICAgR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoZnJhbWUpLCBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMCkpOworCisgIGlmIChHX1VOTElLRUxZICghc3VyZmFjZSkpCisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworCisgIGNyID0gY2Fpcm9fY3JlYXRlIChzdXJmYWNlKTsKKyAgaWYgKEdfVU5MSUtFTFkgKCFjcikpIHsKKyAgICBjYWlyb19zdXJmYWNlX2Rlc3Ryb3kgKHN1cmZhY2UpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIGdfc2lnbmFsX2VtaXQgKG92ZXJsYXksIGdzdF9jYWlyb19vdmVybGF5X3NpZ25hbHNbU0lHTkFMX0RSQVddLCAwLAorICAgICAgY3IsIEdTVF9CVUZGRVJfUFRTIChmcmFtZS0+YnVmZmVyKSwgR1NUX0JVRkZFUl9EVVJBVElPTiAoZnJhbWUtPmJ1ZmZlciksCisgICAgICBOVUxMKTsKKworICBjYWlyb19kZXN0cm95IChjcik7CisgIGNhaXJvX3N1cmZhY2VfZGVzdHJveSAoc3VyZmFjZSk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2NhaXJvX292ZXJsYXlfY2xhc3NfaW5pdCAoR3N0Q2Fpcm9PdmVybGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworCisgIHZmaWx0ZXJfY2xhc3MgPSAoR3N0VmlkZW9GaWx0ZXJDbGFzcyAqKSBrbGFzczsKKyAgZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgdmZpbHRlcl9jbGFzcy0+c2V0X2luZm8gPSBnc3RfY2Fpcm9fb3ZlcmxheV9zZXRfaW5mbzsKKyAgdmZpbHRlcl9jbGFzcy0+dHJhbnNmb3JtX2ZyYW1lX2lwID0gZ3N0X2NhaXJvX292ZXJsYXlfdHJhbnNmb3JtX2ZyYW1lX2lwOworCisgIC8qKgorICAgKiBHc3RDYWlyb092ZXJsYXk6OmRyYXc6CisgICAqIEBvdmVybGF5OiBPdmVybGF5IGVsZW1lbnQgZW1pdHRpbmcgdGhlIHNpZ25hbC4KKyAgICogQGNyOiBDYWlybyBjb250ZXh0IHRvIGRyYXcgdG8uCisgICAqIEB0aW1lc3RhbXA6IFRpbWVzdGFtcCAoc2VlICNHc3RDbG9ja1RpbWUpIG9mIHRoZSBjdXJyZW50IGJ1ZmZlci4KKyAgICogQGR1cmF0aW9uOiBEdXJhdGlvbiAoc2VlICNHc3RDbG9ja1RpbWUpIG9mIHRoZSBjdXJyZW50IGJ1ZmZlci4KKyAgICogCisgICAqIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0aGUgb3ZlcmxheSBzaG91bGQgYmUgZHJhd24uCisgICAqLworICBnc3RfY2Fpcm9fb3ZlcmxheV9zaWduYWxzW1NJR05BTF9EUkFXXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJkcmF3IiwKKyAgICAgIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICAwLAorICAgICAgMCwKKyAgICAgIE5VTEwsCisgICAgICBOVUxMLAorICAgICAgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsCisgICAgICBHX1RZUEVfTk9ORSwgMywgQ0FJUk9fR09CSkVDVF9UWVBFX0NPTlRFWFQsIEdfVFlQRV9VSU5UNjQsIEdfVFlQRV9VSU5UNjQpOworCisgIC8qKgorICAgKiBHc3RDYWlyb092ZXJsYXk6OmNhcHMtY2hhbmdlZDoKKyAgICogQG92ZXJsYXk6IE92ZXJsYXkgZWxlbWVudCBlbWl0dGluZyB0aGUgc2lnbmFsLgorICAgKiBAY2FwczogVGhlICNHc3RDYXBzIG9mIHRoZSBlbGVtZW50LgorICAgKiAKKyAgICogVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBjYXBzIG9mIHRoZSBlbGVtZW50IGhhcyBjaGFuZ2VkLgorICAgKi8KKyAgZ3N0X2NhaXJvX292ZXJsYXlfc2lnbmFsc1tTSUdOQUxfQ0FQU19DSEFOR0VEXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJjYXBzLWNoYW5nZWQiLAorICAgICAgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIDAsCisgICAgICAwLCBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDEsIEdTVF9UWVBFX0NBUFMpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJDYWlybyBvdmVybGF5IiwKKyAgICAgICJGaWx0ZXIvRWRpdG9yL1ZpZGVvIiwKKyAgICAgICJSZW5kZXIgb3ZlcmxheSBvbiBhIHZpZGVvIHN0cmVhbSB1c2luZyBDYWlybyIsCisgICAgICAiSm9uIE5vcmRieSA8am9ub25vckBnbWFpbC5jb20+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X2NhaXJvX292ZXJsYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9jYWlyb19vdmVybGF5X3NyY190ZW1wbGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfY2Fpcm9fb3ZlcmxheV9pbml0IChHc3RDYWlyb092ZXJsYXkgKiBvdmVybGF5KQoreworICAvKiBub3RoaW5nIHRvIGRvICovCit9CmRpZmYgLS1naXQgYS9leHQvY2Fpcm8vZ3N0Y2Fpcm9vdmVybGF5LmggYi9leHQvY2Fpcm8vZ3N0Y2Fpcm9vdmVybGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2N2E3YgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jYWlyby9nc3RjYWlyb292ZXJsYXkuaApAQCAtMCwwICsxLDU4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMTE+IEpvbiBOb3JkYnkgPGpvbm9ub3JAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQ0FJUk9fT1ZFUkxBWV9IX18KKyNkZWZpbmUgX19HU1RfQ0FJUk9fT1ZFUkxBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9maWx0ZXIuaD4KKworI2luY2x1ZGUgPGNhaXJvLmg+CisjaW5jbHVkZSA8Y2Fpcm8tZ29iamVjdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQ0FJUk9fT1ZFUkxBWSBcCisgIChnc3RfY2Fpcm9fb3ZlcmxheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQ0FJUk9fT1ZFUkxBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0NBSVJPX09WRVJMQVksR3N0Q2Fpcm9PdmVybGF5KSkKKyNkZWZpbmUgR1NUX0NBSVJPX09WRVJMQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfQ0FJUk9fT1ZFUkxBWSxHc3RDYWlyb092ZXJsYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19DQUlST19PVkVSTEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQ0FJUk9fT1ZFUkxBWSkpCisjZGVmaW5lIEdTVF9JU19DQUlST19PVkVSTEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0NBSVJPX09WRVJMQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0Q2Fpcm9PdmVybGF5IEdzdENhaXJvT3ZlcmxheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RDYWlyb092ZXJsYXlDbGFzcyBHc3RDYWlyb092ZXJsYXlDbGFzczsKKworc3RydWN0IF9Hc3RDYWlyb092ZXJsYXkgeworICBHc3RWaWRlb0ZpbHRlciB2aWRlb19maWx0ZXI7Cit9OworCitzdHJ1Y3QgX0dzdENhaXJvT3ZlcmxheUNsYXNzIHsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyB2aWRlb19maWx0ZXJfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfY2Fpcm9fb3ZlcmxheV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9DQUlST19PVkVSTEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L2NhaXJvL21lc29uLmJ1aWxkIGIvZXh0L2NhaXJvL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MDFiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2Fpcm8vbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxMyBAQAorY2Fpcm9fZGVwID0gZGVwZW5kZW5jeSgnY2Fpcm8tZ29iamVjdCcsIHZlcnNpb24gOiAnPj0xLjEwLjAnLCByZXF1aXJlZCA6IGZhbHNlKQorCitpZiBjYWlyb19kZXAuZm91bmQoKQorICBnc3RjYWlybyA9IGxpYnJhcnkoJ2dzdGNhaXJvJywKKyAgICAnZ3N0Y2Fpcm8uYycsICdnc3RjYWlyb292ZXJsYXkuYycsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgIGxpbmtfYXJncyA6IG5vc2VoX2xpbmtfYXJncywKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgICAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnc3R2aWRlb19kZXAsIGNhaXJvX2RlcF0sCisgICAgaW5zdGFsbCA6IHRydWUsCisgICAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorICApCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L2R2L01ha2VmaWxlLmFtIGIvZXh0L2R2L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZDE5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZHYvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxOSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0ZHYubGEKKworbGliZ3N0ZHZfbGFfU09VUkNFUyA9IGdzdGR2LmMgZ3N0ZHZkZWMuYyBnc3RkdmRlbXV4LmMgZ3N0c21wdGV0aW1lY29kZS5jCitsaWJnc3Rkdl9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKExJQkRWX0NGTEFHUykKK2xpYmdzdGR2X2xhX0xJQkFERCA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RhdWRpby0kKEdTVF9BUElfVkVSU0lPTikgLWxnc3R2aWRlby0kKEdTVF9BUElfVkVSU0lPTikgXAorCSQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykgJChMSUJEVl9MSUJTKQorbGliZ3N0ZHZfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdGR2ZGVtdXguaCBnc3RkdmRlYy5oIGdzdHNtcHRldGltZWNvZGUuaAorCitFWFRSQV9ESVNUID0gTk9URVMKKworbm9pbnN0X1BST0dSQU1TID0gc21wdGVfdGVzdAorCitzbXB0ZV90ZXN0X1NPVVJDRVMgPSBzbXB0ZV90ZXN0LmMgZ3N0c21wdGV0aW1lY29kZS5jCitzbXB0ZV90ZXN0X0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgJChMSUJEVl9DRkxBR1MpCitzbXB0ZV90ZXN0X0xEQUREID0gJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKQorCmRpZmYgLS1naXQgYS9leHQvZHYvTk9URVMgYi9leHQvZHYvTk9URVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQyMTE1OQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9kdi9OT1RFUwpAQCAtMCwwICsxLDEzIEBACitQYWNrZXRzIGNvbWUgZnJvbSAxMzk0IDQ4MCBieXRlcyBhdCBhIHRpbWUuICBUaGlzIGlzIG5vdCBhIHZpZGVvIHNlZ21lbnQKK2xlbmd0aC4gIFRoaXMgY2F1c2VzIHByb2JsZW1zLCBzaW5jZSBhIHBhY2tldCBib3VuZGFyeSBjcm9zc2luZyBhIHZpZGVvCitzZWdtZW50IGNhbiBzcGxpdCBhIHZpZGVvIHNlZ21lbnQgaWYgd2UgbG9zZSBhbiBpc28gcGFja2V0LiAgV2UgY2FuCityZWNvdmVyIGZyb20gdGhpcywgc29ydGEsIHdpdGggc2lnbmlmaWNhbnQgY2hhbmdlcyB0byB0aGUgcGFyc2VyLiAgV2UgaGF2ZQordG8gZGVhbCB3aXRoIHRoZSBpZGVhIHRoYXQgYSkgc29tZSBtYWNyb2Jsb2NrcyBqdXN0IGRvbid0IGV4aXN0ICh3ZSBoYXZlCit6ZXJvJ3MgZm9yIHRoZW0pIGFuZCBiKSB3aGVuIGFueSBvZiB0aGUgNSBtYWNyb2Jsb2NrcyBkb2Vzbid0IGV4aXN0LCB3ZQorY2FuJ3QgZG8gcGFzcyAzLgorCitTaW5jZSB0aGluZ3MgYXJlIGJpdHN0cmVhbS1iYXNlZCwgd2UgY2FuIGRlYWwgd2l0aCB0aGlzLCBidXQgd2UgaGF2ZSB0bworYWRkIGEgbGF5ZXIgb2YgY29kZSB0aGF0IHRyaWVzIHRvIHNhdmUgdGltZSAobWF5YmUpIGJ5IG5vdCBkZWNvZGluZyB0aGluZ3MKK3RoYXQgZG9uJ3QgZXhpc3QuICBOb3Qgc3VyZSBob3cgdGhpcyBpcyBnb25uYSB3b3JrIHdpdGggdGhlIHBhcnNlIGNvZGUKK2JlaW5nIGJhc2VkIG9uIHZpZGVvIHNlZ21lbnRzLCBhbmQgbm90IGVhc2lseSBzcGxpdHRhYmxlIGludG8KK21hY3JvYmxvY2stbGV2ZWwgcGFyc2luZyAob3IgaXMgaXQ/KS4KZGlmZiAtLWdpdCBhL2V4dC9kdi9nc3Rkdi5jIGIvZXh0L2R2L2dzdGR2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg2MWJmNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9kdi9nc3Rkdi5jCkBAIC0wLDAgKzEsNDggQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0ZHZkZWMuaCIKKyNpbmNsdWRlICJnc3RkdmRlbXV4LmgiCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgZHZfaW5pdCAoMCwgMCk7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiZHZkZW11eCIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICAgZ3N0X2R2ZGVtdXhfZ2V0X3R5cGUgKCkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJkdmRlYyIsIEdTVF9SQU5LX01BUkdJTkFMLAorICAgICAgICAgIGdzdF9kdmRlY19nZXRfdHlwZSAoKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgZHYsCisgICAgIkRWIGRlbXV4ZXIgYW5kIGRlY29kZXIgYmFzZWQgb24gbGliZHYgKGxpYmR2LnNmLm5ldCkiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9leHQvZHYvZ3N0ZHZkZWMuYyBiL2V4dC9kdi9nc3RkdmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YzE5M2QKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZHYvZ3N0ZHZkZWMuYwpAQCAtMCwwICsxLDY5MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1kdmRlYworICoKKyAqIGR2ZGVjIGRlY29kZXMgRFYgdmlkZW8gaW50byByYXcgdmlkZW8uIFRoZSBlbGVtZW50IGV4cGVjdHMgYSBmdWxsIERWIGZyYW1lCisgKiBhcyBpbnB1dCwgd2hpY2ggaXMgMTIwMDAwIGJ5dGVzIGZvciBOVFNDIGFuZCAxNDQwMDAgZm9yIFBBTCB2aWRlby4KKyAqCisgKiBUaGlzIGVsZW1lbnQgY2FuIHBlcmZvcm0gc2ltcGxlIGZyYW1lIGRyb3BwaW5nIHdpdGggdGhlICNHc3REVkRlYzpkcm9wLWZhY3RvcgorICogcHJvcGVydHkuIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0byBhIHZhbHVlIE4gPiAxIHdpbGwgb25seSBkZWNvZGUgZXZlcnkgCisgKiBOdGggZnJhbWUuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGZpbGVzcmMgbG9jYXRpb249dGVzdC5kdiAhIGR2ZGVtdXggbmFtZT1kZW11eCAhIGR2ZGVjICEgeHZpbWFnZXNpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgZGVjb2RlcyBhbmQgcmVuZGVycyB0aGUgcmF3IERWIHN0cmVhbSB0byBhIHZpZGVvc2luay4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9tZXRhLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvcG9vbC5oPgorCisjaW5jbHVkZSAiZ3N0ZHZkZWMuaCIKKworLyogc2l6ZXMgb2Ygb25lIGlucHV0IGJ1ZmZlciAqLworI2RlZmluZSBOVFNDX0hFSUdIVCA0ODAKKyNkZWZpbmUgTlRTQ19CVUZGRVIgMTIwMDAwCisjZGVmaW5lIE5UU0NfRlJBTUVSQVRFX05VTUVSQVRPUiAzMDAwMAorI2RlZmluZSBOVFNDX0ZSQU1FUkFURV9ERU5PTUlOQVRPUiAxMDAxCisKKyNkZWZpbmUgUEFMX0hFSUdIVCA1NzYKKyNkZWZpbmUgUEFMX0JVRkZFUiAxNDQwMDAKKyNkZWZpbmUgUEFMX0ZSQU1FUkFURV9OVU1FUkFUT1IgMjUKKyNkZWZpbmUgUEFMX0ZSQU1FUkFURV9ERU5PTUlOQVRPUiAxCisKKyNkZWZpbmUgUEFMX05PUk1BTF9QQVJfWCAgICAgICAgMTYKKyNkZWZpbmUgUEFMX05PUk1BTF9QQVJfWSAgICAgICAgMTUKKyNkZWZpbmUgUEFMX1dJREVfUEFSX1ggICAgICAgICAgNjQKKyNkZWZpbmUgUEFMX1dJREVfUEFSX1kgICAgICAgICAgNDUKKworI2RlZmluZSBOVFNDX05PUk1BTF9QQVJfWCAgICAgICA4CisjZGVmaW5lIE5UU0NfTk9STUFMX1BBUl9ZICAgICAgIDkKKyNkZWZpbmUgTlRTQ19XSURFX1BBUl9YICAgICAgICAgMzIKKyNkZWZpbmUgTlRTQ19XSURFX1BBUl9ZICAgICAgICAgMjcKKworI2RlZmluZSBEVl9ERUZBVUxUX1FVQUxJVFkgRFZfUVVBTElUWV9CRVNUCisjZGVmaW5lIERWX0RFRkFVTFRfREVDT0RFX05USCAxCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGR2ZGVjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGR2ZGVjX2RlYnVnCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0NMQU1QX0xVTUEsCisgIFBST1BfQ0xBTVBfQ0hST01BLAorICBQUk9QX1FVQUxJVFksCisgIFBST1BfREVDT0RFX05USAorfTsKKworY29uc3QgZ2ludCBxdWFsaXRpZXNbXSA9IHsKKyAgRFZfUVVBTElUWV9EQywKKyAgRFZfUVVBTElUWV9BQ18xLAorICBEVl9RVUFMSVRZX0FDXzIsCisgIERWX1FVQUxJVFlfREMgfCBEVl9RVUFMSVRZX0NPTE9SLAorICBEVl9RVUFMSVRZX0FDXzEgfCBEVl9RVUFMSVRZX0NPTE9SLAorICBEVl9RVUFMSVRZX0FDXzIgfCBEVl9RVUFMSVRZX0NPTE9SCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1kdiwgc3lzdGVtc3RyZWFtID0gKGJvb2xlYW4pIGZhbHNlIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXAgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgWVVZMiwgQkdSeCwgUkdCIH0sICIKKyAgICAgICAgImZyYW1lcmF0ZSA9IChmcmFjdGlvbikgWyAxLzEsIDYwLzEgXSwgIgorICAgICAgICAid2lkdGggPSAoaW50KSA3MjAsICIgImhlaWdodCA9IChpbnQpIHsgNTc2LCA0ODAgfSIpCisgICAgKTsKKworI2RlZmluZSBHU1RfVFlQRV9EVkRFQ19RVUFMSVRZIChnc3RfZHZkZWNfcXVhbGl0eV9nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3RfZHZkZWNfcXVhbGl0eV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHF0eXBlID0gMDsKKworICBpZiAocXR5cGUgPT0gMCkgeworICAgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHZhbHVlc1tdID0geworICAgICAgezAsICJNb25vY2hyb21lLCBEQyAoRmFzdGVzdCkiLCAiZmFzdGVzdCJ9LAorICAgICAgezEsICJNb25vY2hyb21lLCBmaXJzdCBBQyBjb2VmZmljaWVudCIsICJtb25vY2hyb21lLWFjIn0sCisgICAgICB7MiwgIk1vbm9jaHJvbWUsIGhpZ2hlc3QgcXVhbGl0eSIsICJtb25vY2hyb21lLWJlc3QifSwKKyAgICAgIHszLCAiQ29sb3VyLCBEQywgZmFzdGVzdCIsICJjb2xvdXItZmFzdGVzdCJ9LAorICAgICAgezQsICJDb2xvdXIsIHVzaW5nIG9ubHkgdGhlIGZpcnN0IEFDIGNvZWZmaWNpZW50IiwgImNvbG91ci1hYyJ9LAorICAgICAgezUsICJIaWdoZXN0IHF1YWxpdHkgY29sb3VyIGRlY29kaW5nIiwgImJlc3QifSwKKyAgICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgICB9OworCisgICAgcXR5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0RFZEZWNRdWFsaXR5RW51bSIsIHZhbHVlcyk7CisgIH0KKyAgcmV0dXJuIHF0eXBlOworfQorCisjZGVmaW5lIGdzdF9kdmRlY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3REVkRlYywgZ3N0X2R2ZGVjLCBHU1RfVFlQRV9FTEVNRU5UKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2R2ZGVjX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9kdmRlY19zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9kdmRlY19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgdm9pZCBnc3RfZHZkZWNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2R2ZGVjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIHZvaWQKK2dzdF9kdmRlY19jbGFzc19pbml0IChHc3REVkRlY0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfZHZkZWNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfZHZkZWNfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQ0xBTVBfTFVNQSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiY2xhbXAtbHVtYSIsICJDbGFtcCBsdW1hIiwgIkNsYW1wIGx1bWEiLAorICAgICAgICAgIEZBTFNFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9DTEFNUF9DSFJPTUEsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImNsYW1wLWNocm9tYSIsICJDbGFtcCBjaHJvbWEiLCAiQ2xhbXAgY2hyb21hIiwKKyAgICAgICAgICBGQUxTRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfUVVBTElUWSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgicXVhbGl0eSIsICJRdWFsaXR5IiwgIkRlY29kaW5nIHF1YWxpdHkiLAorICAgICAgICAgIEdTVF9UWVBFX0RWREVDX1FVQUxJVFksIERWX0RFRkFVTFRfUVVBTElUWSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9ERUNPREVfTlRILAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImRyb3AtZmFjdG9yIiwgIkRyb3AgRmFjdG9yIiwgIk9ubHkgZGVjb2RlIE50aCBmcmFtZSIsCisgICAgICAgICAgMSwgR19NQVhJTlQsIERWX0RFRkFVTFRfREVDT0RFX05USCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2R2ZGVjX2NoYW5nZV9zdGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXApOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY190ZW1wKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiRFYgdmlkZW8gZGVjb2RlciIsCisgICAgICAiQ29kZWMvRGVjb2Rlci9WaWRlbyIsCisgICAgICAiVXNlcyBsaWJkdiB0byBkZWNvZGUgRFYgdmlkZW8gKHNtcHRlMzE0KSAobGliZHYuc291cmNlZm9yZ2UubmV0KSIsCisgICAgICAiRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4sIiAiV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZHZkZWNfZGVidWcsICJkdmRlYyIsIDAsICJEViBkZWNvZGluZyBlbGVtZW50Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHZkZWNfaW5pdCAoR3N0RFZEZWMgKiBkdmRlYykKK3sKKyAgZHZkZWMtPnNpbmtwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNpbmtfdGVtcCwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKGR2ZGVjLT5zaW5rcGFkLCBnc3RfZHZkZWNfY2hhaW4pOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoZHZkZWMtPnNpbmtwYWQsIGdzdF9kdmRlY19zaW5rX2V2ZW50KTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKGR2ZGVjKSwgZHZkZWMtPnNpbmtwYWQpOworCisgIGR2ZGVjLT5zcmNwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNyY190ZW1wLCAic3JjIik7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKGR2ZGVjLT5zcmNwYWQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoZHZkZWMpLCBkdmRlYy0+c3JjcGFkKTsKKworICBkdmRlYy0+ZnJhbWVyYXRlX251bWVyYXRvciA9IDA7CisgIGR2ZGVjLT5mcmFtZXJhdGVfZGVub21pbmF0b3IgPSAwOworICBkdmRlYy0+d2lkZSA9IEZBTFNFOworICBkdmRlYy0+ZHJvcF9mYWN0b3IgPSAxOworCisgIGR2ZGVjLT5jbGFtcF9sdW1hID0gRkFMU0U7CisgIGR2ZGVjLT5jbGFtcF9jaHJvbWEgPSBGQUxTRTsKKyAgZHZkZWMtPnF1YWxpdHkgPSBEVl9ERUZBVUxUX1FVQUxJVFk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R2ZGVjX3Npbmtfc2V0Y2FwcyAoR3N0RFZEZWMgKiBkdmRlYywgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgY29uc3QgR1ZhbHVlICpwYXIgPSBOVUxMLCAqcmF0ZSA9IE5VTEw7CisKKyAgLyogZmlyc3QgcGFyc2UgdGhlIGNhcHMgKi8KKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIC8qIHdlIGFsbG93IGZyYW1lcmF0ZSBhbmQgUEFSIHRvIGJlIG92ZXJ3cml0dGVuLiBmcmFtZXJhdGUgaXMgbWFuZGF0b3J5LiAqLworICBpZiAoIShyYXRlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJmcmFtZXJhdGUiKSkpCisgICAgZ290byBub19mcmFtZXJhdGU7CisgIHBhciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAicGl4ZWwtYXNwZWN0LXJhdGlvIik7CisKKyAgaWYgKHBhcikgeworICAgIGR2ZGVjLT5wYXJfeCA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fbnVtZXJhdG9yIChwYXIpOworICAgIGR2ZGVjLT5wYXJfeSA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fZGVub21pbmF0b3IgKHBhcik7CisgICAgZHZkZWMtPm5lZWRfcGFyID0gRkFMU0U7CisgIH0gZWxzZSB7CisgICAgZHZkZWMtPnBhcl94ID0gMDsKKyAgICBkdmRlYy0+cGFyX3kgPSAwOworICAgIGR2ZGVjLT5uZWVkX3BhciA9IFRSVUU7CisgIH0KKyAgZHZkZWMtPmZyYW1lcmF0ZV9udW1lcmF0b3IgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAocmF0ZSk7CisgIGR2ZGVjLT5mcmFtZXJhdGVfZGVub21pbmF0b3IgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yIChyYXRlKTsKKyAgZHZkZWMtPnNpbmtfbmVnb3RpYXRlZCA9IFRSVUU7CisgIGR2ZGVjLT5zcmNfbmVnb3RpYXRlZCA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworbm9fZnJhbWVyYXRlOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZHZkZWMsICJubyBmcmFtZXJhdGUgc3BlY2lmaWVkIGluIGNhcHMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9kdmRlY19uZWdvdGlhdGVfcG9vbCAoR3N0RFZEZWMgKiBkZWMsIEdzdENhcHMgKiBjYXBzLCBHc3RWaWRlb0luZm8gKiBpbmZvKQoreworICBHc3RRdWVyeSAqcXVlcnk7CisgIEdzdEJ1ZmZlclBvb2wgKnBvb2w7CisgIGd1aW50IHNpemUsIG1pbiwgbWF4OworICBHc3RTdHJ1Y3R1cmUgKmNvbmZpZzsKKworICAvKiBmaW5kIGEgcG9vbCBmb3IgdGhlIG5lZ290aWF0ZWQgY2FwcyBub3cgKi8KKyAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X2FsbG9jYXRpb24gKGNhcHMsIFRSVUUpOworCisgIGlmICghZ3N0X3BhZF9wZWVyX3F1ZXJ5IChkZWMtPnNyY3BhZCwgcXVlcnkpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVjLCAiZGlkbid0IGdldCBkb3duc3RyZWFtIEFMTE9DQVRJT04gaGludHMiKTsKKyAgfQorCisgIGlmIChnc3RfcXVlcnlfZ2V0X25fYWxsb2NhdGlvbl9wb29scyAocXVlcnkpID4gMCkgeworICAgIC8qIHdlIGdvdCBjb25maWd1cmF0aW9uIGZyb20gb3VyIHBlZXIsIHBhcnNlIHRoZW0gKi8KKyAgICBnc3RfcXVlcnlfcGFyc2VfbnRoX2FsbG9jYXRpb25fcG9vbCAocXVlcnksIDAsICZwb29sLCAmc2l6ZSwgJm1pbiwgJm1heCk7CisgICAgc2l6ZSA9IE1BWCAoc2l6ZSwgaW5mby0+c2l6ZSk7CisgIH0gZWxzZSB7CisgICAgcG9vbCA9IE5VTEw7CisgICAgc2l6ZSA9IGluZm8tPnNpemU7CisgICAgbWluID0gbWF4ID0gMDsKKyAgfQorCisgIGlmIChwb29sID09IE5VTEwpIHsKKyAgICAvKiB3ZSBkaWQgbm90IGdldCBhIHBvb2wsIG1ha2Ugb25lIG91cnNlbHZlcyB0aGVuICovCisgICAgcG9vbCA9IGdzdF92aWRlb19idWZmZXJfcG9vbF9uZXcgKCk7CisgIH0KKworICBpZiAoZGVjLT5wb29sKSB7CisgICAgZ3N0X2J1ZmZlcl9wb29sX3NldF9hY3RpdmUgKGRlYy0+cG9vbCwgRkFMU0UpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGRlYy0+cG9vbCk7CisgIH0KKyAgZGVjLT5wb29sID0gcG9vbDsKKworICBjb25maWcgPSBnc3RfYnVmZmVyX3Bvb2xfZ2V0X2NvbmZpZyAocG9vbCk7CisgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfc2V0X3BhcmFtcyAoY29uZmlnLCBjYXBzLCBzaXplLCBtaW4sIG1heCk7CisKKyAgaWYgKGdzdF9xdWVyeV9maW5kX2FsbG9jYXRpb25fbWV0YSAocXVlcnksIEdTVF9WSURFT19NRVRBX0FQSV9UWVBFLCBOVUxMKSkgeworICAgIC8qIGp1c3Qgc2V0IHRoZSBvcHRpb24sIGlmIHRoZSBwb29sIGNhbiBzdXBwb3J0IGl0IHdlIHdpbGwgdHJhbnNwYXJlbnRseSB1c2UKKyAgICAgKiBpdCB0aHJvdWdoIHRoZSB2aWRlbyBpbmZvIEFQSS4gV2UgY291bGQgYWxzbyBzZWUgaWYgdGhlIHBvb2wgc3VwcG9ydCB0aGlzCisgICAgICogb3B0aW9uIGFuZCBvbmx5IGFjdGl2YXRlIGl0IHRoZW4uICovCisgICAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19hZGRfb3B0aW9uIChjb25maWcsCisgICAgICAgIEdTVF9CVUZGRVJfUE9PTF9PUFRJT05fVklERU9fTUVUQSk7CisgIH0KKyAgZ3N0X2J1ZmZlcl9wb29sX3NldF9jb25maWcgKHBvb2wsIGNvbmZpZyk7CisKKyAgLyogYW5kIGFjdGl2YXRlICovCisgIGdzdF9idWZmZXJfcG9vbF9zZXRfYWN0aXZlIChwb29sLCBUUlVFKTsKKworICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZWNfc3JjX25lZ290aWF0ZSAoR3N0RFZEZWMgKiBkdmRlYykKK3sKKyAgR3N0Q2FwcyAqb3RoZXJjYXBzOworICBnYm9vbGVhbiByZXQ7CisKKyAgLyogbm8gUEFSIHdhcyBzcGVjaWZpZWQgaW4gaW5wdXQsIGRlcml2ZSBmcm9tIGVuY29kZWQgZGF0YSAqLworICBpZiAoZHZkZWMtPm5lZWRfcGFyKSB7CisgICAgaWYgKGR2ZGVjLT5QQUwpIHsKKyAgICAgIGlmIChkdmRlYy0+d2lkZSkgeworICAgICAgICBkdmRlYy0+cGFyX3ggPSBQQUxfV0lERV9QQVJfWDsKKyAgICAgICAgZHZkZWMtPnBhcl95ID0gUEFMX1dJREVfUEFSX1k7CisgICAgICB9IGVsc2UgeworICAgICAgICBkdmRlYy0+cGFyX3ggPSBQQUxfTk9STUFMX1BBUl9YOworICAgICAgICBkdmRlYy0+cGFyX3kgPSBQQUxfTk9STUFMX1BBUl9ZOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoZHZkZWMtPndpZGUpIHsKKyAgICAgICAgZHZkZWMtPnBhcl94ID0gTlRTQ19XSURFX1BBUl9YOworICAgICAgICBkdmRlYy0+cGFyX3kgPSBOVFNDX1dJREVfUEFSX1k7CisgICAgICB9IGVsc2UgeworICAgICAgICBkdmRlYy0+cGFyX3ggPSBOVFNDX05PUk1BTF9QQVJfWDsKKyAgICAgICAgZHZkZWMtPnBhcl95ID0gTlRTQ19OT1JNQUxfUEFSX1k7CisgICAgICB9CisgICAgfQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR2ZGVjLCAiSW5mZXJyZWQgUEFSICVkLyVkIGZyb20gdmlkZW8gZm9ybWF0IiwKKyAgICAgICAgZHZkZWMtPnBhcl94LCBkdmRlYy0+cGFyX3kpOworICB9CisKKyAgLyogaWdub3JpbmcgcmdiLCBiZ3IwIGZvciBub3cgKi8KKyAgZHZkZWMtPmJwcCA9IDI7CisKKyAgZ3N0X3ZpZGVvX2luZm9fc2V0X2Zvcm1hdCAoJmR2ZGVjLT52aW5mbywgR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyLAorICAgICAgNzIwLCBkdmRlYy0+aGVpZ2h0KTsKKyAgZHZkZWMtPnZpbmZvLmZwc19uID0gZHZkZWMtPmZyYW1lcmF0ZV9udW1lcmF0b3I7CisgIGR2ZGVjLT52aW5mby5mcHNfZCA9IGR2ZGVjLT5mcmFtZXJhdGVfZGVub21pbmF0b3I7CisgIGR2ZGVjLT52aW5mby5wYXJfbiA9IGR2ZGVjLT5wYXJfeDsKKyAgZHZkZWMtPnZpbmZvLnBhcl9kID0gZHZkZWMtPnBhcl95OworICBpZiAoZHZkZWMtPmludGVybGFjZWQpIHsKKyAgICBkdmRlYy0+dmluZm8uaW50ZXJsYWNlX21vZGUgPSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfSU5URVJMRUFWRUQ7CisgIH0gZWxzZSB7CisgICAgZHZkZWMtPnZpbmZvLmludGVybGFjZV9tb2RlID0gR1NUX1ZJREVPX0lOVEVSTEFDRV9NT0RFX1BST0dSRVNTSVZFOworICB9CisKKyAgb3RoZXJjYXBzID0gZ3N0X3ZpZGVvX2luZm9fdG9fY2FwcyAoJmR2ZGVjLT52aW5mbyk7CisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKGR2ZGVjLT5zcmNwYWQsIG90aGVyY2Fwcyk7CisKKyAgZ3N0X2R2ZGVjX25lZ290aWF0ZV9wb29sIChkdmRlYywgb3RoZXJjYXBzLCAmZHZkZWMtPnZpbmZvKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKG90aGVyY2Fwcyk7CisKKyAgZHZkZWMtPnNyY19uZWdvdGlhdGVkID0gVFJVRTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdmRlY19zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0RFZEZWMgKmR2ZGVjOworICBnYm9vbGVhbiByZXMgPSBUUlVFOworCisgIGR2ZGVjID0gR1NUX0RWREVDIChwYXJlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmZHZkZWMtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVU5ERUZJTkVEKTsKKyAgICAgIGR2ZGVjLT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6eworICAgICAgY29uc3QgR3N0U2VnbWVudCAqc2VnbWVudDsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3NlZ21lbnQgKGV2ZW50LCAmc2VnbWVudCk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR2ZGVjLCAiR290IFNFR01FTlQgJSIgR1NUX1NFR01FTlRfRk9STUFULCAmc2VnbWVudCk7CisKKyAgICAgIGdzdF9zZWdtZW50X2NvcHlfaW50byAoc2VnbWVudCwgJmR2ZGVjLT5zZWdtZW50KTsKKyAgICAgIGlmICghZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChkdmRlYy0+c3JjcGFkKSkgeworICAgICAgICBkdmRlYy0+bmVlZF9zZWdtZW50ID0gVFJVRTsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIGV2ZW50ID0gTlVMTDsKKyAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGR2ZGVjLT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChldmVudCwgJmNhcHMpOworICAgICAgcmVzID0gZ3N0X2R2ZGVjX3Npbmtfc2V0Y2FwcyAoZHZkZWMsIGNhcHMpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBldmVudCA9IE5VTEw7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoZXZlbnQpCisgICAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChkdmRlYy0+c3JjcGFkLCBldmVudCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9kdmRlY19jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0RFZEZWMgKmR2ZGVjOworICBndWludDggKmluZnJhbWU7CisgIGd1aW50OCAqb3V0ZnJhbWVfcHRyc1szXTsKKyAgZ2ludCBvdXRmcmFtZV9waXRjaGVzWzNdOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR3N0VmlkZW9GcmFtZSBmcmFtZTsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGd1aW50IGxlbmd0aDsKKyAgZ3VpbnQ2NCBjc3RhcnQgPSBHU1RfQ0xPQ0tfVElNRV9OT05FLCBjc3RvcCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGdib29sZWFuIFBBTCwgd2lkZTsKKworICBkdmRlYyA9IEdTVF9EVkRFQyAocGFyZW50KTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBpbmZyYW1lID0gbWFwLmRhdGE7CisKKyAgLyogYnVmZmVyIHNob3VsZCBiZSBhdCBsZWFzdCB0aGUgc2l6ZSBvZiBvbmUgTlRTQyBmcmFtZSwgdGhpcyBzaG91bGQKKyAgICogYmUgZW5vdWdoIHRvIGRlY29kZSB0aGUgaGVhZGVyLiAqLworICBpZiAoR19VTkxJS0VMWSAobWFwLnNpemUgPCBOVFNDX0JVRkZFUikpCisgICAgZ290byB3cm9uZ19zaXplOworCisgIC8qIHByZWxpbWluYXJ5IGRyb3BwaW5nLiB1bnJlZiBhbmQgcmV0dXJuIGlmIG91dHNpZGUgb2YgY29uZmlndXJlZCBzZWdtZW50ICovCisgIGlmICgoZHZkZWMtPnNlZ21lbnQuZm9ybWF0ID09IEdTVF9GT1JNQVRfVElNRSkgJiYKKyAgICAgICghKGdzdF9zZWdtZW50X2NsaXAgKCZkdmRlYy0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgICAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZiksCisgICAgICAgICAgICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKSArIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZiksCisgICAgICAgICAgICAgICAgICAmY3N0YXJ0LCAmY3N0b3ApKSkpCisgICAgZ290byBkcm9wcGluZzsKKworICBpZiAoR19VTkxJS0VMWSAoZHZfcGFyc2VfaGVhZGVyIChkdmRlYy0+ZGVjb2RlciwgaW5mcmFtZSkgPCAwKSkKKyAgICBnb3RvIHBhcnNlX2hlYWRlcl9lcnJvcjsKKworICAvKiBnZXQgc2l6ZSAqLworICBQQUwgPSBkdl9zeXN0ZW1fNTBfZmllbGRzIChkdmRlYy0+ZGVjb2Rlcik7CisgIHdpZGUgPSBkdl9mb3JtYXRfd2lkZSAoZHZkZWMtPmRlY29kZXIpOworCisgIC8qIGNoZWNrIHRoZSBidWZmZXIgaXMgb2YgcmlnaHQgc2l6ZSBhZnRlciB3ZSBrbm93IGlmIHdlIGFyZQorICAgKiBkZWFsaW5nIHdpdGggUEFMIG9yIE5UU0MgKi8KKyAgbGVuZ3RoID0gKFBBTCA/IFBBTF9CVUZGRVIgOiBOVFNDX0JVRkZFUik7CisgIGlmIChHX1VOTElLRUxZIChtYXAuc2l6ZSA8IGxlbmd0aCkpCisgICAgZ290byB3cm9uZ19zaXplOworCisgIGR2X3BhcnNlX3BhY2tzIChkdmRlYy0+ZGVjb2RlciwgaW5mcmFtZSk7CisKKyAgaWYgKGR2ZGVjLT52aWRlb19vZmZzZXQgJSBkdmRlYy0+ZHJvcF9mYWN0b3IgIT0gMCkKKyAgICBnb3RvIHNraXA7CisKKyAgLyogcmVuZWdvdGlhdGUgb24gY2hhbmdlICovCisgIGlmIChQQUwgIT0gZHZkZWMtPlBBTCB8fCB3aWRlICE9IGR2ZGVjLT53aWRlKSB7CisgICAgZHZkZWMtPnNyY19uZWdvdGlhdGVkID0gRkFMU0U7CisgICAgZHZkZWMtPlBBTCA9IFBBTDsKKyAgICBkdmRlYy0+d2lkZSA9IHdpZGU7CisgIH0KKworICBkdmRlYy0+aGVpZ2h0ID0gKGR2ZGVjLT5QQUwgPyBQQUxfSEVJR0hUIDogTlRTQ19IRUlHSFQpOworCisgIGR2ZGVjLT5pbnRlcmxhY2VkID0gIWR2X2lzX3Byb2dyZXNzaXZlIChkdmRlYy0+ZGVjb2Rlcik7CisKKyAgLyogbmVnb3RpYXRlIGlmIG5vdCBkb25lIHlldCAqLworICBpZiAoIWR2ZGVjLT5zcmNfbmVnb3RpYXRlZCkgeworICAgIGlmICghZ3N0X2R2ZGVjX3NyY19uZWdvdGlhdGUgKGR2ZGVjKSkKKyAgICAgIGdvdG8gbm90X25lZ290aWF0ZWQ7CisgIH0KKworICBpZiAoZ3N0X3BhZF9jaGVja19yZWNvbmZpZ3VyZSAoZHZkZWMtPnNyY3BhZCkpIHsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoZHZkZWMtPnNyY3BhZCk7CisgICAgaWYgKCFjYXBzKQorICAgICAgZ290byBmbHVzaGluZzsKKworICAgIGdzdF9kdmRlY19uZWdvdGlhdGVfcG9vbCAoZHZkZWMsIGNhcHMsICZkdmRlYy0+dmluZm8pOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgfQorCisgIGlmIChkdmRlYy0+bmVlZF9zZWdtZW50KSB7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChkdmRlYy0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZkdmRlYy0+c2VnbWVudCkpOworICAgIGR2ZGVjLT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgfQorCisgIHJldCA9IGdzdF9idWZmZXJfcG9vbF9hY3F1aXJlX2J1ZmZlciAoZHZkZWMtPnBvb2wsICZvdXRidWYsIE5VTEwpOworICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkKKyAgICBnb3RvIG5vX2J1ZmZlcjsKKworICBnc3RfdmlkZW9fZnJhbWVfbWFwICgmZnJhbWUsICZkdmRlYy0+dmluZm8sIG91dGJ1ZiwgR1NUX01BUF9XUklURSk7CisKKyAgb3V0ZnJhbWVfcHRyc1swXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKCZmcmFtZSwgMCk7CisgIG91dGZyYW1lX3BpdGNoZXNbMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKCZmcmFtZSwgMCk7CisKKyAgLyogdGhlIHJlc3Qgb25seSBtYXR0ZXJzIGZvciBZVVkyICovCisgIGlmIChkdmRlYy0+YnBwIDwgMykgeworICAgIG91dGZyYW1lX3B0cnNbMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBICgmZnJhbWUsIDEpOworICAgIG91dGZyYW1lX3B0cnNbMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBICgmZnJhbWUsIDIpOworCisgICAgb3V0ZnJhbWVfcGl0Y2hlc1sxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoJmZyYW1lLCAxKTsKKyAgICBvdXRmcmFtZV9waXRjaGVzWzJdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFICgmZnJhbWUsIDIpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZHZkZWMsICJkZWNvZGluZyBhbmQgcHVzaGluZyBidWZmZXIiKTsKKyAgZHZfZGVjb2RlX2Z1bGxfZnJhbWUgKGR2ZGVjLT5kZWNvZGVyLCBpbmZyYW1lLAorICAgICAgZV9kdl9jb2xvcl95dXYsIG91dGZyYW1lX3B0cnMsIG91dGZyYW1lX3BpdGNoZXMpOworCisgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJmZyYW1lKTsKKworICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKG91dGJ1ZiwgR1NUX1ZJREVPX0JVRkZFUl9GTEFHX1RGRik7CisKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKTsKKyAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChvdXRidWYpID0gR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWYpOworCisgIC8qIEZJWE1FIDogQ29tcHV0ZSB2YWx1ZXMgd2hlbiB1c2luZyBub24tVElNRSBzZWdtZW50cywKKyAgICogYnV0IGZvciB0aGUgbW9tZW50IG1ha2Ugc3VyZSB3ZSBhdCBsZWFzdCBkb24ndCBzZXQgYm9ndXMgdmFsdWVzCisgICAqLworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGNzdGFydCkpIHsKKyAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSA9IGNzdGFydDsKKyAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGNzdG9wKSkKKyAgICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPSBjc3RvcCAtIGNzdGFydDsKKyAgfQorCisgIHJldCA9IGdzdF9wYWRfcHVzaCAoZHZkZWMtPnNyY3BhZCwgb3V0YnVmKTsKKworc2tpcDoKKyAgZHZkZWMtPnZpZGVvX29mZnNldCsrOworCitkb25lOgorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCit3cm9uZ19zaXplOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGR2ZGVjLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIklucHV0IGJ1ZmZlciB0b28gc21hbGwiKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBkb25lOworICB9CitwYXJzZV9oZWFkZXJfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZHZkZWMsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiRXJyb3IgcGFyc2luZyBEViBoZWFkZXIiKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBkb25lOworICB9Citub3RfbmVnb3RpYXRlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR2ZGVjLCAiY291bGQgbm90IG5lZ290aWF0ZSBvdXRwdXQiKTsKKyAgICBpZiAoR1NUX1BBRF9JU19GTFVTSElORyAoZHZkZWMtPnNyY3BhZCkpCisgICAgICByZXQgPSBHU1RfRkxPV19GTFVTSElORzsKKyAgICBlbHNlCisgICAgICByZXQgPSBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICBnb3RvIGRvbmU7CisgIH0KK2ZsdXNoaW5nOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZHZkZWMsICJoYXZlIG5vIGN1cnJlbnQgY2FwcyIpOworICAgIHJldCA9IEdTVF9GTE9XX0ZMVVNISU5HOworICAgIGdvdG8gZG9uZTsKKyAgfQorbm9fYnVmZmVyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZHZkZWMsICJjb3VsZCBub3QgYWxsb2NhdGUgYnVmZmVyIik7CisgICAgZ290byBkb25lOworICB9CisKK2Ryb3BwaW5nOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZHZkZWMsCisgICAgICAgICJkcm9wcGluZyBidWZmZXIgc2luY2UgaXQncyBvdXQgb2YgdGhlIGNvbmZpZ3VyZWQgc2VnbWVudCIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9kdmRlY19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3REVkRlYyAqZHZkZWMgPSBHU1RfRFZERUMgKGVsZW1lbnQpOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBkdmRlYy0+ZGVjb2RlciA9CisgICAgICAgICAgZHZfZGVjb2Rlcl9uZXcgKDAsIGR2ZGVjLT5jbGFtcF9sdW1hLCBkdmRlYy0+Y2xhbXBfY2hyb21hKTsKKyAgICAgIGR2ZGVjLT5kZWNvZGVyLT5xdWFsaXR5ID0gcXVhbGl0aWVzW2R2ZGVjLT5xdWFsaXR5XTsKKyAgICAgIGR2X3NldF9lcnJvcl9sb2cgKGR2ZGVjLT5kZWNvZGVyLCBOVUxMKTsKKyAgICAgIGdzdF92aWRlb19pbmZvX2luaXQgKCZkdmRlYy0+dmluZm8pOworICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJmR2ZGVjLT5zZWdtZW50LCBHU1RfRk9STUFUX1VOREVGSU5FRCk7CisgICAgICBkdmRlYy0+c3JjX25lZ290aWF0ZWQgPSBGQUxTRTsKKyAgICAgIGR2ZGVjLT5zaW5rX25lZ290aWF0ZWQgPSBGQUxTRTsKKyAgICAgIGR2ZGVjLT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgICAgIC8qIAorICAgICAgICogRW5hYmxlIHRoaXMgZnVuY3Rpb24gY2FsbCB3aGVuIGxpYmR2MiAwLjEwMCBvciBoaWdoZXIgaXMgbW9yZQorICAgICAgICogY29tbW9uCisgICAgICAgKi8KKyAgICAgIC8qIGR2X3NldF9xdWFsaXR5IChkdmRlYy0+ZGVjb2RlciwgcXVhbGl0aWVzIFtkdmRlYy0+cXVhbGl0eV0pOyAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19QTEFZSU5HOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGR2X2RlY29kZXJfZnJlZSAoZHZkZWMtPmRlY29kZXIpOworICAgICAgZHZkZWMtPmRlY29kZXIgPSBOVUxMOworICAgICAgaWYgKGR2ZGVjLT5wb29sKSB7CisgICAgICAgIGdzdF9idWZmZXJfcG9vbF9zZXRfYWN0aXZlIChkdmRlYy0+cG9vbCwgRkFMU0UpOworICAgICAgICBnc3Rfb2JqZWN0X3VucmVmIChkdmRlYy0+cG9vbCk7CisgICAgICAgIGR2ZGVjLT5wb29sID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHZkZWNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdERWRGVjICpkdmRlYyA9IEdTVF9EVkRFQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ0xBTVBfTFVNQToKKyAgICAgIGR2ZGVjLT5jbGFtcF9sdW1hID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NMQU1QX0NIUk9NQToKKyAgICAgIGR2ZGVjLT5jbGFtcF9jaHJvbWEgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUVVBTElUWToKKyAgICAgIGR2ZGVjLT5xdWFsaXR5ID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgaWYgKChkdmRlYy0+cXVhbGl0eSA8IDApIHx8IChkdmRlYy0+cXVhbGl0eSA+IDUpKQorICAgICAgICBkdmRlYy0+cXVhbGl0eSA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfREVDT0RFX05USDoKKyAgICAgIGR2ZGVjLT5kcm9wX2ZhY3RvciA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2R2ZGVjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REVkRlYyAqZHZkZWMgPSBHU1RfRFZERUMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0NMQU1QX0xVTUE6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZHZkZWMtPmNsYW1wX2x1bWEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NMQU1QX0NIUk9NQToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBkdmRlYy0+Y2xhbXBfY2hyb21hKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9RVUFMSVRZOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGR2ZGVjLT5xdWFsaXR5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERUNPREVfTlRIOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZHZkZWMtPmRyb3BfZmFjdG9yKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9kdi9nc3RkdmRlYy5oIGIvZXh0L2R2L2dzdGR2ZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAzMWVmMAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9kdi9nc3RkdmRlYy5oCkBAIC0wLDAgKzEsOTggQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfRFZERUNfSF9fCisjZGVmaW5lIF9fR1NUX0RWREVDX0hfXworCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlIDxsaWJkdi9kdi5oPgorCisKK0dfQkVHSU5fREVDTFMKKworCisjZGVmaW5lIEdTVF9UWVBFX0RWREVDIFwKKyAgKGdzdF9kdmRlY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfRFZERUMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9EVkRFQyxHc3REVkRlYykpCisjZGVmaW5lIEdTVF9EVkRFQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9EVkRFQyxHc3REVkRlY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0RWREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfRFZERUMpKQorI2RlZmluZSBHU1RfSVNfRFZERUNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfRFZERUMpKQorCisKK3R5cGVkZWYgc3RydWN0IF9Hc3REVkRlYyBHc3REVkRlYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3REVkRlY0NsYXNzIEdzdERWRGVjQ2xhc3M7CisKKworc3RydWN0IF9Hc3REVkRlYyB7CisgIEdzdEVsZW1lbnQgICAgIGVsZW1lbnQ7CisKKyAgR3N0UGFkICAgICAgICAqc2lua3BhZDsKKyAgR3N0UGFkICAgICAgICAqc3JjcGFkOworCisgIGR2X2RlY29kZXJfdCAgKmRlY29kZXI7CisgIGdib29sZWFuICAgICAgIGNsYW1wX2x1bWE7CisgIGdib29sZWFuICAgICAgIGNsYW1wX2Nocm9tYTsKKyAgZ2ludCAgICAgICAgICAgcXVhbGl0eTsKKworICBnYm9vbGVhbiAgICAgICBQQUw7CisgIGdib29sZWFuICAgICAgIGludGVybGFjZWQ7CisgIGdib29sZWFuICAgICAgIHdpZGU7CisKKyAgLyogaW5wdXQgY2FwcyAqLworICBnYm9vbGVhbiAgICAgICBzaW5rX25lZ290aWF0ZWQ7CisgIEdzdFZpZGVvSW5mbyAgIHZpbmZvOworICBnaW50ICAgICAgICAgICBmcmFtZXJhdGVfbnVtZXJhdG9yOworICBnaW50ICAgICAgICAgICBmcmFtZXJhdGVfZGVub21pbmF0b3I7CisgIGdpbnQgICAgICAgICAgIGhlaWdodDsKKyAgZ2ludCAgICAgICAgICAgcGFyX3g7CisgIGdpbnQgICAgICAgICAgIHBhcl95OworICBnYm9vbGVhbiAgICAgICBuZWVkX3BhcjsKKworICAvKiBuZWdvdGlhdGVkIG91dHB1dCAqLworICBnaW50ICAgICAgICAgICBicHA7CisgIGdib29sZWFuICAgICAgIHNyY19uZWdvdGlhdGVkOworICAKKyAgZ2ludCAgICAgICAgICAgdmlkZW9fb2Zmc2V0OworICBnaW50ICAgICAgICAgICBkcm9wX2ZhY3RvcjsKKworICBHc3RCdWZmZXJQb29sICpwb29sOworICBHc3RTZWdtZW50ICAgICBzZWdtZW50OworICBnYm9vbGVhbiAgICAgICBuZWVkX3NlZ21lbnQ7Cit9OworCitzdHJ1Y3QgX0dzdERWRGVjQ2xhc3MgeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworCitHVHlwZSBnc3RfZHZkZWNfZ2V0X3R5cGUgKHZvaWQpOworCisKK0dfRU5EX0RFQ0xTCisKKworI2VuZGlmIC8qIF9fR1NUX0RWREVDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L2R2L2dzdGR2ZGVtdXguYyBiL2V4dC9kdi9nc3RkdmRlbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2ZDdkYQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9kdi9nc3RkdmRlbXV4LmMKQEAgLTAsMCArMSwyMDQ3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgImdzdGR2ZGVtdXguaCIKKyNpbmNsdWRlICJnc3RzbXB0ZXRpbWVjb2RlLmgiCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWR2ZGVtdXgKKyAqCisgKiBkdmRlbXV4IHNwbGl0cyByYXcgRFYgaW50byBpdHMgYXVkaW8gYW5kIHZpZGVvIGNvbXBvbmVudHMuIFRoZSBhdWRpbyB3aWxsIGJlCisgKiBkZWNvZGVkIHJhdyBzYW1wbGVzIGFuZCB0aGUgdmlkZW8gd2lsbCBiZSBlbmNvZGVkIERWIHZpZGVvLgorICoKKyAqIFRoaXMgZWxlbWVudCBjYW4gb3BlcmF0ZSBpbiBib3RoIHB1c2ggYW5kIHB1bGwgbW9kZSBkZXBlbmRpbmcgb24gdGhlCisgKiBjYXBhYmlsaXRpZXMgb2YgdGhlIHVwc3RyZWFtIHBlZXIuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGZpbGVzcmMgbG9jYXRpb249dGVzdC5kdiAhIGR2ZGVtdXggbmFtZT1kZW11eCAhIHF1ZXVlICEgYXVkaW9jb252ZXJ0ICEgYWxzYXNpbmsgZGVtdXguICEgcXVldWUgISBkdmRlYyAhIHh2aW1hZ2VzaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIGRlY29kZXMgYW5kIHJlbmRlcnMgdGhlIHJhdyBEViBzdHJlYW0gdG8gYW4gYXVkaW8gYW5kIGEgdmlkZW9zaW5rLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisvKiBEViBvdXRwdXQgaGFzIHR3byBtb2Rlcywgbm9ybWFsIGFuZCB3aWRlLiBUaGUgcmVzb2x1dGlvbiBpcyB0aGUgc2FtZSBpbiBib3RoCisgKiBjYXNlczogNzIwIHBpeGVscyB3aWRlIGJ5IDU3NiBwaXhlbHMgdGFsbCBpbiBQQUwgZm9ybWF0LCBhbmQgNzIweDQ4MCBmb3IKKyAqIE5UU0MuCisgKgorICogRWFjaCBvZiB0aGUgbW9kZXMgaGFzIGl0cyBvd24gcGl4ZWwgYXNwZWN0IHJhdGlvLCB3aGljaCBpcyBmaXhlZCBpbiBwcmFjdGljZQorICogYnkgSVRVLVIgQlQuNjAxIChhbHNvIGtub3duIGFzICJDQ0lSLTYwMSIgb3IgIlJlYy42MDEiKS4gT3Igc28gY2xhaW1zIGEKKyAqIHJlZmVyZW5jZSB0aGF0IEkgY3VsbGVkIGZyb20gdGhlIHJlbGlhYmxlICJpbnRlcm5ldCIsCisgKiBodHRwOi8vd3d3Lm1pci5jb20vRE1HL2FzcGVjdC5odG1sLiBOb3JtYWwgUEFMIGlzIDU5LzU0IGFuZCBub3JtYWwgTlRTQyBpcworICogMTAvMTEuIEJlY2F1c2UgdGhlIHBpeGVsIHJlc29sdXRpb24gaXMgdGhlIHNhbWUgZm9yIGJvdGggY2FzZXMsIHdlIGNhbiBnZXQKKyAqIHRoZSBwaXhlbCBhc3BlY3QgcmF0aW8gZm9yIHdpZGUgcmVjb3JkaW5ncyBieSBtdWx0aXBseWluZyBieSB0aGUgcmF0aW8gb2YKKyAqIGRpc3BsYXkgYXNwZWN0IHJhdGlvcywgMTYvOSAoZm9yIHdpZGUpIGRpdmlkZWQgYnkgNC8zIChmb3Igbm9ybWFsKToKKyAqCisgKiBXaWRlIE5UU0M6IDEwLzExICogKDE2LzkpLyg0LzMpID0gNDAvMzMKKyAqIFdpZGUgUEFMOiA1OS81NCAqICgxNi85KS8oNC8zKSA9IDExOC84MQorICoKKyAqIEhvd2V2ZXIsIHRoZSBwaXhlbCByZXNvbHV0aW9uIGNvbWluZyBvdXQgb2YgYSBEViBzb3VyY2UgZG9lcyBub3QgY29tYmluZSB3aXRoCisgKiB0aGUgc3RhbmRhcmQgcGl4ZWwgYXNwZWN0IHJhdGlvcyB0byBnaXZlIGEgcHJvcGVyIGRpc3BsYXkgYXNwZWN0IHJhdGlvLiBBbgorICogaW1hZ2UgNDgwIHBpeGVscyB0YWxsLCB3aXRoIGEgNDozIGRpc3BsYXkgYXNwZWN0IHJhdGlvLCB3aWxsIGJlIDc2OCBwaXhlbHMKKyAqIHdpZGUuIEJ1dCwgaWYgd2UgdGFrZSB0aGUgbm9ybWFsIFBBTCBhc3BlY3QgcmF0aW8gb2YgNTkvNTQsIGFuZCBtdWx0aXBseSBpdAorICogd2l0aCB0aGUgd2lkdGggb2YgdGhlIERWIGltYWdlICg3MjAgcGl4ZWxzKSwgd2UgZ2V0IDc4Ni42NjYuLi4sIHdoaWNoIGlzCisgKiBub25pbnRlZ3JhbCBhbmQgdG9vIHdpZGUuIFRoZSBjYW1lcmEgaXMgbm90IG91dHB1dHRpbmcgYSA0OjMgaW1hZ2UuCisgKiAKKyAqIElmIHRoZSB2aWRlbyBzaW5rIGZvciB0aGlzIHN0cmVhbSBoYXMgZml4ZWQgZGltZW5zaW9ucyAoc3VjaCBhcyBmb3IKKyAqIGZ1bGxzY3JlZW4gcGxheWJhY2ssIG9yIGZvciBhIGphdmEgYXBwbGV0IGluIGEgd2ViIHBhZ2UpLCB5b3UgdGhlbiBoYXZlIHR3bworICogY2hvaWNlcy4gRWl0aGVyIHlvdSBzaG93IHRoZSB3aG9sZSBpbWFnZSwgYnV0IHBhZCB0aGUgaW1hZ2Ugd2l0aCBibGFjaworICogYm9yZGVycyBvbiB0aGUgdG9wIGFuZCBib3R0b20gKGxpa2Ugd2F0Y2hpbmcgYSB3aWRlc2NyZWVuIHZpZGVvIG9uIGEgNDozCisgKiBkZXZpY2UpLCBvciB5b3UgY3JvcCB0aGUgdmlkZW8gdG8gdGhlIHByb3BlciByYXRpby4gQXBwYXJlbnRseSB0aGUgbGF0dGVyIGlzCisgKiB0aGUgc3RhbmRhcmQgcHJhY3RpY2UuCisgKgorICogRm9yIGl0cyBwYXJ0LCBHU3RyZWFtZXIgaXMgY29uY2VybmVkIHdpdGggYWNjdXJhY3kgYW5kIHByZXNlcnZhdGlvbiBvZgorICogaW5mb3JtYXRpb24uIFRoaXMgZWxlbWVudCBvdXRwdXRzIHRoZSA3MjB4NTc2IG9yIDcyMHg0ODAgdmlkZW8gdGhhdCBpdAorICogcmVjaWV2ZXMsIG5vdGluZyB0aGUgcHJvcGVyIGFzcGVjdCByYXRpby4gVGhpcyBzaG91bGQgbm90IGJlIGEgcHJvYmxlbSBmb3IKKyAqIHdpbmRvd2VkIGFwcGxpY2F0aW9ucywgd2hpY2ggY2FuIGNoYW5nZSBzaXplIHRvIGZpdCB0aGUgdmlkZW8uIEFwcGxpY2F0aW9ucworICogd2l0aCBmaXhlZCBzaXplIHJlcXVpcmVtZW50cyBzaG91bGQgZGVjaWRlIHdoZXRoZXIgdG8gY3JvcCBvciBwYWQgd2hpY2gKKyAqIGFuIGVsZW1lbnQgc3VjaCBhcyB2aWRlb2JveCBjYW4gZG8uCisgKi8KKworI2RlZmluZSBOVFNDX0hFSUdIVCA0ODAKKyNkZWZpbmUgTlRTQ19CVUZGRVIgMTIwMDAwCisjZGVmaW5lIE5UU0NfRlJBTUVSQVRFX05VTUVSQVRPUiAzMDAwMAorI2RlZmluZSBOVFNDX0ZSQU1FUkFURV9ERU5PTUlOQVRPUiAxMDAxCisKKyNkZWZpbmUgUEFMX0hFSUdIVCA1NzYKKyNkZWZpbmUgUEFMX0JVRkZFUiAxNDQwMDAKKyNkZWZpbmUgUEFMX0ZSQU1FUkFURV9OVU1FUkFUT1IgMjUKKyNkZWZpbmUgUEFMX0ZSQU1FUkFURV9ERU5PTUlOQVRPUiAxCisKKyNkZWZpbmUgUEFMX05PUk1BTF9QQVJfWCAgICAgICAgMTYKKyNkZWZpbmUgUEFMX05PUk1BTF9QQVJfWSAgICAgICAgMTUKKyNkZWZpbmUgUEFMX1dJREVfUEFSX1ggICAgICAgICAgNjQKKyNkZWZpbmUgUEFMX1dJREVfUEFSX1kgICAgICAgICAgNDUKKworI2RlZmluZSBOVFNDX05PUk1BTF9QQVJfWCAgICAgICA4CisjZGVmaW5lIE5UU0NfTk9STUFMX1BBUl9ZICAgICAgIDkKKyNkZWZpbmUgTlRTQ19XSURFX1BBUl9YICAgICAgICAgMzIKKyNkZWZpbmUgTlRTQ19XSURFX1BBUl9ZICAgICAgICAgMjcKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZHZkZW11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBkdmRlbXV4X2RlYnVnCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXAgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWR2LCBzeXN0ZW1zdHJlYW0gPSAoYm9vbGVhbikgdHJ1ZSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHZpZGVvX3NyY190ZW1wID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJ2aWRlbyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1kdiwgc3lzdGVtc3RyZWFtID0gKGJvb2xlYW4pIGZhbHNlIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgYXVkaW9fc3JjX3RlbXAgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoImF1ZGlvIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKFMxNikgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSB7IDMyMDAwLCA0NDEwMCwgNDgwMDAgfSwgIiAiY2hhbm5lbHMgPSAoaW50KSB7MiwgNH0iKQorICAgICk7CisKKworI2RlZmluZSBnc3RfZHZkZW11eF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3REVkRlbXV4LCBnc3RfZHZkZW11eCwgR1NUX1RZUEVfRUxFTUVOVCk7CisKK3N0YXRpYyB2b2lkIGdzdF9kdmRlbXV4X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworLyogcXVlcnkgZnVuY3Rpb25zICovCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2R2ZGVtdXhfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZHZkZW11eF9zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworLyogY29udmVydCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBnYm9vbGVhbiBnc3RfZHZkZW11eF9zaW5rX2NvbnZlcnQgKEdzdERWRGVtdXggKiBkZW11eCwKKyAgICBHc3RGb3JtYXQgc3JjX2Zvcm1hdCwgZ2ludDY0IHNyY192YWx1ZSwgR3N0Rm9ybWF0IGRlc3RfZm9ybWF0LAorICAgIGdpbnQ2NCAqIGRlc3RfdmFsdWUpOworc3RhdGljIGdib29sZWFuIGdzdF9kdmRlbXV4X3NyY19jb252ZXJ0IChHc3REVkRlbXV4ICogZGVtdXgsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RGb3JtYXQgc3JjX2Zvcm1hdCwgZ2ludDY0IHNyY192YWx1ZSwgR3N0Rm9ybWF0IGRlc3RfZm9ybWF0LAorICAgIGdpbnQ2NCAqIGRlc3RfdmFsdWUpOworCisvKiBldmVudCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBnYm9vbGVhbiBnc3RfZHZkZW11eF9zZW5kX2V2ZW50IChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2R2ZGVtdXhfaGFuZGxlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2R2ZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCisvKiBzY2hlZHVsaW5nIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgZ3N0X2R2ZGVtdXhfbG9vcCAoR3N0UGFkICogcGFkKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9kdmRlbXV4X2ZsdXNoIChHc3REVkRlbXV4ICogZHZkZW11eCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZHZkZW11eF9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworLyogc3RhdGUgY2hhbmdlIGZ1bmN0aW9ucyAqLworc3RhdGljIGdib29sZWFuIGdzdF9kdmRlbXV4X3NpbmtfYWN0aXZhdGUgKEdzdFBhZCAqIHNpbmtwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZHZkZW11eF9zaW5rX2FjdGl2YXRlX21vZGUgKEdzdFBhZCAqIHNpbmtwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSk7CitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X2R2ZGVtdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIHZvaWQKK2dzdF9kdmRlbXV4X2NsYXNzX2luaXQgKEdzdERWRGVtdXhDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfZHZkZW11eF9maW5hbGl6ZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2R2ZGVtdXhfY2hhbmdlX3N0YXRlKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+c2VuZF9ldmVudCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZHZkZW11eF9zZW5kX2V2ZW50KTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcCk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmdmlkZW9fc3JjX3RlbXApOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJmF1ZGlvX3NyY190ZW1wKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIkRWIHN5c3RlbSBzdHJlYW0gZGVtdXhlciIsICJDb2RlYy9EZW11eGVyIiwKKyAgICAgICJVc2VzIGxpYmR2IHRvIHNlcGFyYXRlIERWIGF1ZGlvIGZyb20gRFYgdmlkZW8gKGxpYmR2LnNvdXJjZWZvcmdlLm5ldCkiLAorICAgICAgIkVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+LCBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPiIpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChkdmRlbXV4X2RlYnVnLCAiZHZkZW11eCIsIDAsICJEViBkZW11eGVyIGVsZW1lbnQiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kdmRlbXV4X2luaXQgKEdzdERWRGVtdXggKiBkdmRlbXV4KQoreworICBnaW50IGk7CisKKyAgZHZkZW11eC0+c2lua3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua190ZW1wLCAic2luayIpOworICAvKiB3ZSBjYW4gb3BlcmF0ZSBpbiBwdWxsIGFuZCBwdXNoIG1vZGUgc28gd2UgaW5zdGFsbAorICAgKiBhIGN1c3RvbSBhY3RpdmF0ZSBmdW5jdGlvbiAqLworICBnc3RfcGFkX3NldF9hY3RpdmF0ZV9mdW5jdGlvbiAoZHZkZW11eC0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZHZkZW11eF9zaW5rX2FjdGl2YXRlKSk7CisgIC8qIHRoZSBmdW5jdGlvbiB0byBhY3RpdmF0ZSBpbiBwdXNoIG1vZGUgKi8KKyAgZ3N0X3BhZF9zZXRfYWN0aXZhdGVtb2RlX2Z1bmN0aW9uIChkdmRlbXV4LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kdmRlbXV4X3NpbmtfYWN0aXZhdGVfbW9kZSkpOworICAvKiBmb3IgcHVzaCBtb2RlLCB0aGlzIGlzIHRoZSBjaGFpbiBmdW5jdGlvbiAqLworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoZHZkZW11eC0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZHZkZW11eF9jaGFpbikpOworICAvKiBoYW5kbGluZyBldmVudHMgKGluIHB1c2ggbW9kZSBvbmx5KSAqLworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoZHZkZW11eC0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZHZkZW11eF9oYW5kbGVfc2lua19ldmVudCkpOworICAvKiBxdWVyeSBmdW5jdGlvbnMgKi8KKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKGR2ZGVtdXgtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2R2ZGVtdXhfc2lua19xdWVyeSkpOworCisgIC8qIG5vdyBhZGQgdGhlIHBhZCAqLworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoZHZkZW11eCksIGR2ZGVtdXgtPnNpbmtwYWQpOworCisgIGR2ZGVtdXgtPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisKKyAgLyogd2UgbmVlZCA0IHRlbXAgYnVmZmVycyBmb3IgYXVkaW8gZGVjb2Rpbmcgd2hpY2ggYXJlIG9mIGEgc3RhdGljCisgICAqIHNpemUgYW5kIHdoaWNoIHdlIGNhbiBhbGxvY2F0ZSBoZXJlICovCisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICBkdmRlbXV4LT5hdWRpb19idWZmZXJzW2ldID0KKyAgICAgICAgKGdpbnQxNiAqKSBnX21hbGxvYyAoRFZfQVVESU9fTUFYX1NBTVBMRVMgKiBzaXplb2YgKGdpbnQxNikpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHZkZW11eF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0RFZEZW11eCAqZHZkZW11eDsKKyAgZ2ludCBpOworCisgIGR2ZGVtdXggPSBHU1RfRFZERU1VWCAob2JqZWN0KTsKKworICBnX29iamVjdF91bnJlZiAoZHZkZW11eC0+YWRhcHRlcik7CisKKyAgLyogY2xlYW4gdXAgdGVtcCBhdWRpbyBidWZmZXJzICovCisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICBnX2ZyZWUgKGR2ZGVtdXgtPmF1ZGlvX2J1ZmZlcnNbaV0pOworICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCisvKiByZXNldCB0byBkZWZhdWx0IHZhbHVlcyBiZWZvcmUgc3RhcnRpbmcgc3RyZWFtaW5nICovCitzdGF0aWMgdm9pZAorZ3N0X2R2ZGVtdXhfcmVzZXQgKEdzdERWRGVtdXggKiBkdmRlbXV4KQoreworICBkdmRlbXV4LT5mcmFtZV9vZmZzZXQgPSAwOworICBkdmRlbXV4LT5hdWRpb19vZmZzZXQgPSAwOworICBkdmRlbXV4LT52aWRlb19vZmZzZXQgPSAwOworICBkdmRlbXV4LT5kaXNjb250ID0gVFJVRTsKKyAgZ19hdG9taWNfaW50X3NldCAoJmR2ZGVtdXgtPmZvdW5kX2hlYWRlciwgMCk7CisgIGR2ZGVtdXgtPmZyYW1lX2xlbiA9IC0xOworICBkdmRlbXV4LT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgZHZkZW11eC0+bmV3X21lZGlhID0gRkFMU0U7CisgIGR2ZGVtdXgtPmZyYW1lcmF0ZV9udW1lcmF0b3IgPSAwOworICBkdmRlbXV4LT5mcmFtZXJhdGVfZGVub21pbmF0b3IgPSAwOworICBkdmRlbXV4LT5oZWlnaHQgPSAwOworICBkdmRlbXV4LT5mcmVxdWVuY3kgPSAwOworICBkdmRlbXV4LT5jaGFubmVscyA9IDA7CisgIGR2ZGVtdXgtPndpZGUgPSBGQUxTRTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJmR2ZGVtdXgtPmJ5dGVfc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZkdmRlbXV4LT50aW1lX3NlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGR2ZGVtdXgtPnNlZ21lbnRfc2VxbnVtID0gMDsKKyAgZHZkZW11eC0+dXBzdHJlYW1fdGltZV9zZWdtZW50ID0gRkFMU0U7CisgIGR2ZGVtdXgtPmhhdmVfZ3JvdXBfaWQgPSBGQUxTRTsKKyAgZHZkZW11eC0+Z3JvdXBfaWQgPSBHX01BWFVJTlQ7CisgIGR2ZGVtdXgtPnRhZ19ldmVudCA9IE5VTEw7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgoraGF2ZV9ncm91cF9pZCAoR3N0RFZEZW11eCAqIGRlbXV4KQoreworICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgZXZlbnQgPSBnc3RfcGFkX2dldF9zdGlja3lfZXZlbnQgKGRlbXV4LT5zaW5rcGFkLCBHU1RfRVZFTlRfU1RSRUFNX1NUQVJULCAwKTsKKyAgaWYgKGV2ZW50KSB7CisgICAgaWYgKGdzdF9ldmVudF9wYXJzZV9ncm91cF9pZCAoZXZlbnQsICZkZW11eC0+Z3JvdXBfaWQpKQorICAgICAgZGVtdXgtPmhhdmVfZ3JvdXBfaWQgPSBUUlVFOworICAgIGVsc2UKKyAgICAgIGRlbXV4LT5oYXZlX2dyb3VwX2lkID0gRkFMU0U7CisgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgIH0gZWxzZSBpZiAoIWRlbXV4LT5oYXZlX2dyb3VwX2lkKSB7CisgICAgZGVtdXgtPmhhdmVfZ3JvdXBfaWQgPSBUUlVFOworICAgIGRlbXV4LT5ncm91cF9pZCA9IGdzdF91dGlsX2dyb3VwX2lkX25leHQgKCk7CisgIH0KKworICByZXR1cm4gZGVtdXgtPmhhdmVfZ3JvdXBfaWQ7Cit9CisKK3N0YXRpYyBHc3RFdmVudCAqCitnc3RfZHZkZW11eF9jcmVhdGVfZ2xvYmFsX3RhZ19ldmVudCAoR3N0RFZEZW11eCAqIGR2ZGVtdXgpCit7CisgIGdjaGFyIHJlY19kYXRldGltZVs0MF07CisgIEdzdERhdGVUaW1lICpyZWNfZHQ7CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisKKyAgdGFncyA9IGdzdF90YWdfbGlzdF9uZXcgKEdTVF9UQUdfQ09OVEFJTkVSX0ZPUk1BVCwgIkRWIiwgTlVMTCk7CisgIGdzdF90YWdfbGlzdF9zZXRfc2NvcGUgKHRhZ3MsIEdTVF9UQUdfU0NPUEVfR0xPQkFMKTsKKworICBpZiAoZHZfZ2V0X3JlY29yZGluZ19kYXRldGltZSAoZHZkZW11eC0+ZGVjb2RlciwgcmVjX2RhdGV0aW1lKSkgeworICAgIHJlY19kdCA9IGdzdF9kYXRlX3RpbWVfbmV3X2Zyb21faXNvODYwMV9zdHJpbmcgKHJlY19kYXRldGltZSk7CisgICAgaWYgKHJlY19kdCkgeworICAgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLCBHU1RfVEFHX0RBVEVfVElNRSwKKyAgICAgICAgICByZWNfZHQsIE5VTEwpOworICAgICAgZ3N0X2RhdGVfdGltZV91bnJlZiAocmVjX2R0KTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZ3N0X2V2ZW50X25ld190YWcgKHRhZ3MpOworfQorCitzdGF0aWMgR3N0UGFkICoKK2dzdF9kdmRlbXV4X2FkZF9wYWQgKEdzdERWRGVtdXggKiBkdmRlbXV4LCBHc3RTdGF0aWNQYWRUZW1wbGF0ZSAqIHRlbXBsYXRlLAorICAgIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RQYWQgKnBhZDsKKyAgR3N0RXZlbnQgKmV2ZW50OworICBnY2hhciAqc3RyZWFtX2lkOworCisgIHBhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICh0ZW1wbGF0ZSwgdGVtcGxhdGUtPm5hbWVfdGVtcGxhdGUpOworCisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChwYWQsIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZHZkZW11eF9zcmNfcXVlcnkpKTsKKworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAocGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kdmRlbXV4X2hhbmRsZV9zcmNfZXZlbnQpKTsKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAocGFkKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChwYWQsIFRSVUUpOworCisgIHN0cmVhbV9pZCA9CisgICAgICBnc3RfcGFkX2NyZWF0ZV9zdHJlYW1faWQgKHBhZCwKKyAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKGR2ZGVtdXgpLAorICAgICAgdGVtcGxhdGUgPT0gJnZpZGVvX3NyY190ZW1wID8gInZpZGVvIiA6ICJhdWRpbyIpOworICBldmVudCA9IGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0IChzdHJlYW1faWQpOworICBpZiAoaGF2ZV9ncm91cF9pZCAoZHZkZW11eCkpCisgICAgZ3N0X2V2ZW50X3NldF9ncm91cF9pZCAoZXZlbnQsIGR2ZGVtdXgtPmdyb3VwX2lkKTsKKyAgZ3N0X3BhZF9wdXNoX2V2ZW50IChwYWQsIGV2ZW50KTsKKyAgZ19mcmVlIChzdHJlYW1faWQpOworCisgIGdzdF9wYWRfc2V0X2NhcHMgKHBhZCwgY2Fwcyk7CisKKyAgZ3N0X3BhZF9wdXNoX2V2ZW50IChwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmR2ZGVtdXgtPnRpbWVfc2VnbWVudCkpOworCisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChkdmRlbXV4KSwgcGFkKTsKKworICBpZiAoIWR2ZGVtdXgtPnRhZ19ldmVudCkgeworICAgIGR2ZGVtdXgtPnRhZ19ldmVudCA9IGdzdF9kdmRlbXV4X2NyZWF0ZV9nbG9iYWxfdGFnX2V2ZW50IChkdmRlbXV4KTsKKyAgfQorCisgIGlmIChkdmRlbXV4LT50YWdfZXZlbnQpIHsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHBhZCwgZ3N0X2V2ZW50X3JlZiAoZHZkZW11eC0+dGFnX2V2ZW50KSk7CisgIH0KKworICByZXR1cm4gcGFkOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2R2ZGVtdXhfcmVtb3ZlX3BhZHMgKEdzdERWRGVtdXggKiBkdmRlbXV4KQoreworICBpZiAoZHZkZW11eC0+dmlkZW9zcmNwYWQpIHsKKyAgICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVCAoZHZkZW11eCksIGR2ZGVtdXgtPnZpZGVvc3JjcGFkKTsKKyAgICBkdmRlbXV4LT52aWRlb3NyY3BhZCA9IE5VTEw7CisgIH0KKyAgaWYgKGR2ZGVtdXgtPmF1ZGlvc3JjcGFkKSB7CisgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlQgKGR2ZGVtdXgpLCBkdmRlbXV4LT5hdWRpb3NyY3BhZCk7CisgICAgZHZkZW11eC0+YXVkaW9zcmNwYWQgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R2ZGVtdXhfc3JjX2NvbnZlcnQgKEdzdERWRGVtdXggKiBkdmRlbXV4LCBHc3RQYWQgKiBwYWQsCisgICAgR3N0Rm9ybWF0IHNyY19mb3JtYXQsIGdpbnQ2NCBzcmNfdmFsdWUsIEdzdEZvcm1hdCBkZXN0X2Zvcm1hdCwKKyAgICBnaW50NjQgKiBkZXN0X3ZhbHVlKQoreworICBnYm9vbGVhbiByZXMgPSBUUlVFOworCisgIGlmIChkZXN0X2Zvcm1hdCA9PSBzcmNfZm9ybWF0IHx8IHNyY192YWx1ZSA9PSAtMSkgeworICAgICpkZXN0X3ZhbHVlID0gc3JjX3ZhbHVlOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGlmIChkdmRlbXV4LT5mcmFtZV9sZW4gPD0gMCkKKyAgICBnb3RvIGVycm9yOworCisgIGlmIChkdmRlbXV4LT5kZWNvZGVyID09IE5VTEwpCisgICAgZ290byBlcnJvcjsKKworICBHU1RfSU5GT19PQkpFQ1QgKHBhZCwKKyAgICAgICJzcmNfdmFsdWU6JSIgR19HSU5UNjRfRk9STUFUICIsIHNyY19mb3JtYXQ6JWQsIGRlc3RfZm9ybWF0OiVkIiwKKyAgICAgIHNyY192YWx1ZSwgc3JjX2Zvcm1hdCwgZGVzdF9mb3JtYXQpOworCisgIHN3aXRjaCAoc3JjX2Zvcm1hdCkgeworICAgIGNhc2UgR1NUX0ZPUk1BVF9CWVRFUzoKKyAgICAgIHN3aXRjaCAoZGVzdF9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0RFRkFVTFQ6CisgICAgICAgICAgaWYgKHBhZCA9PSBkdmRlbXV4LT52aWRlb3NyY3BhZCkKKyAgICAgICAgICAgICpkZXN0X3ZhbHVlID0gc3JjX3ZhbHVlIC8gZHZkZW11eC0+ZnJhbWVfbGVuOworICAgICAgICAgIGVsc2UgaWYgKHBhZCA9PSBkdmRlbXV4LT5hdWRpb3NyY3BhZCkKKyAgICAgICAgICAgICpkZXN0X3ZhbHVlID0gc3JjX3ZhbHVlIC8gKDIgKiBkdmRlbXV4LT5jaGFubmVscyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9USU1FOgorICAgICAgICAgIGlmIChwYWQgPT0gZHZkZW11eC0+dmlkZW9zcmNwYWQpCisgICAgICAgICAgICAqZGVzdF92YWx1ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoc3JjX3ZhbHVlLAorICAgICAgICAgICAgICAgIEdTVF9TRUNPTkQgKiBkdmRlbXV4LT5mcmFtZXJhdGVfZGVub21pbmF0b3IsCisgICAgICAgICAgICAgICAgZHZkZW11eC0+ZnJhbWVfbGVuICogZHZkZW11eC0+ZnJhbWVyYXRlX251bWVyYXRvcik7CisgICAgICAgICAgZWxzZSBpZiAocGFkID09IGR2ZGVtdXgtPmF1ZGlvc3JjcGFkKQorICAgICAgICAgICAgKmRlc3RfdmFsdWUgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChzcmNfdmFsdWUsIEdTVF9TRUNPTkQsCisgICAgICAgICAgICAgICAgMiAqIGR2ZGVtdXgtPmZyZXF1ZW5jeSAqIGR2ZGVtdXgtPmNoYW5uZWxzKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0ZPUk1BVF9USU1FOgorICAgICAgc3dpdGNoIChkZXN0X2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfQllURVM6CisgICAgICAgICAgaWYgKHBhZCA9PSBkdmRlbXV4LT52aWRlb3NyY3BhZCkKKyAgICAgICAgICAgICpkZXN0X3ZhbHVlID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzcmNfdmFsdWUsCisgICAgICAgICAgICAgICAgZHZkZW11eC0+ZnJhbWVfbGVuICogZHZkZW11eC0+ZnJhbWVyYXRlX251bWVyYXRvciwKKyAgICAgICAgICAgICAgICBkdmRlbXV4LT5mcmFtZXJhdGVfZGVub21pbmF0b3IgKiBHU1RfU0VDT05EKTsKKyAgICAgICAgICBlbHNlIGlmIChwYWQgPT0gZHZkZW11eC0+YXVkaW9zcmNwYWQpCisgICAgICAgICAgICAqZGVzdF92YWx1ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNyY192YWx1ZSwKKyAgICAgICAgICAgICAgICAyICogZHZkZW11eC0+ZnJlcXVlbmN5ICogZHZkZW11eC0+Y2hhbm5lbHMsIEdTVF9TRUNPTkQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfREVGQVVMVDoKKyAgICAgICAgICBpZiAocGFkID09IGR2ZGVtdXgtPnZpZGVvc3JjcGFkKSB7CisgICAgICAgICAgICBpZiAoc3JjX3ZhbHVlKQorICAgICAgICAgICAgICAqZGVzdF92YWx1ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoc3JjX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgZHZkZW11eC0+ZnJhbWVyYXRlX251bWVyYXRvciwKKyAgICAgICAgICAgICAgICAgIGR2ZGVtdXgtPmZyYW1lcmF0ZV9kZW5vbWluYXRvciAqIEdTVF9TRUNPTkQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAqZGVzdF92YWx1ZSA9IDA7CisgICAgICAgICAgfSBlbHNlIGlmIChwYWQgPT0gZHZkZW11eC0+YXVkaW9zcmNwYWQpIHsKKyAgICAgICAgICAgICpkZXN0X3ZhbHVlID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzcmNfdmFsdWUsCisgICAgICAgICAgICAgICAgZHZkZW11eC0+ZnJlcXVlbmN5LCBHU1RfU0VDT05EKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9GT1JNQVRfREVGQVVMVDoKKyAgICAgIHN3aXRjaCAoZGVzdF9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICAgICAgaWYgKHBhZCA9PSBkdmRlbXV4LT52aWRlb3NyY3BhZCkgeworICAgICAgICAgICAgKmRlc3RfdmFsdWUgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNyY192YWx1ZSwKKyAgICAgICAgICAgICAgICBHU1RfU0VDT05EICogZHZkZW11eC0+ZnJhbWVyYXRlX2Rlbm9taW5hdG9yLAorICAgICAgICAgICAgICAgIGR2ZGVtdXgtPmZyYW1lcmF0ZV9udW1lcmF0b3IpOworICAgICAgICAgIH0gZWxzZSBpZiAocGFkID09IGR2ZGVtdXgtPmF1ZGlvc3JjcGFkKSB7CisgICAgICAgICAgICBpZiAoc3JjX3ZhbHVlKQorICAgICAgICAgICAgICAqZGVzdF92YWx1ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoc3JjX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgR1NUX1NFQ09ORCwgZHZkZW11eC0+ZnJlcXVlbmN5KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgKmRlc3RfdmFsdWUgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgICAgIGlmIChwYWQgPT0gZHZkZW11eC0+dmlkZW9zcmNwYWQpIHsKKyAgICAgICAgICAgICpkZXN0X3ZhbHVlID0gc3JjX3ZhbHVlICogZHZkZW11eC0+ZnJhbWVfbGVuOworICAgICAgICAgIH0gZWxzZSBpZiAocGFkID09IGR2ZGVtdXgtPmF1ZGlvc3JjcGFkKSB7CisgICAgICAgICAgICAqZGVzdF92YWx1ZSA9IHNyY192YWx1ZSAqIDIgKiBkdmRlbXV4LT5jaGFubmVsczsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gRkFMU0U7CisgIH0KKworZG9uZToKKyAgR1NUX0lORk9fT0JKRUNUIChwYWQsCisgICAgICAiUmVzdWx0IDogZGVzdF9mb3JtYXQ6JWQsIGRlc3RfdmFsdWU6JSIgR19HSU5UNjRfRk9STUFUICIsIHJlczolZCIsCisgICAgICBkZXN0X2Zvcm1hdCwgKmRlc3RfdmFsdWUsIHJlcyk7CisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitlcnJvcjoKKyAgeworICAgIEdTVF9JTkZPICgic291cmNlIGNvbnZlcnNpb24gZmFpbGVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R2ZGVtdXhfc2lua19jb252ZXJ0IChHc3REVkRlbXV4ICogZHZkZW11eCwgR3N0Rm9ybWF0IHNyY19mb3JtYXQsCisgICAgZ2ludDY0IHNyY192YWx1ZSwgR3N0Rm9ybWF0IGRlc3RfZm9ybWF0LCBnaW50NjQgKiBkZXN0X3ZhbHVlKQoreworICBnYm9vbGVhbiByZXMgPSBUUlVFOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGR2ZGVtdXgsICIlZCAtPiAlZCIsIHNyY19mb3JtYXQsIGRlc3RfZm9ybWF0KTsKKyAgR1NUX0lORk9fT0JKRUNUIChkdmRlbXV4LAorICAgICAgInNyY192YWx1ZTolIiBHX0dJTlQ2NF9GT1JNQVQgIiwgc3JjX2Zvcm1hdDolZCwgZGVzdF9mb3JtYXQ6JWQiLAorICAgICAgc3JjX3ZhbHVlLCBzcmNfZm9ybWF0LCBkZXN0X2Zvcm1hdCk7CisKKyAgaWYgKGRlc3RfZm9ybWF0ID09IHNyY19mb3JtYXQgfHwgc3JjX3ZhbHVlID09IC0xKSB7CisgICAgKmRlc3RfdmFsdWUgPSBzcmNfdmFsdWU7CisgICAgZ290byBkb25lOworICB9CisKKyAgaWYgKGR2ZGVtdXgtPmZyYW1lX2xlbiA8PSAwKQorICAgIGdvdG8gZXJyb3I7CisKKyAgc3dpdGNoIChzcmNfZm9ybWF0KSB7CisgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgc3dpdGNoIChkZXN0X2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfVElNRToKKyAgICAgICAgeworICAgICAgICAgIGd1aW50NjQgZnJhbWU7CisKKyAgICAgICAgICAvKiBnZXQgZnJhbWUgbnVtYmVyLCByb3VuZHMgZG93biBzbyBkb24ndCBjb21iaW5lIHRoaXMKKyAgICAgICAgICAgKiBsaW5lIGFuZCB0aGUgbmV4dCBsaW5lLiAqLworICAgICAgICAgIGZyYW1lID0gc3JjX3ZhbHVlIC8gZHZkZW11eC0+ZnJhbWVfbGVuOworCisgICAgICAgICAgKmRlc3RfdmFsdWUgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGZyYW1lLAorICAgICAgICAgICAgICBHU1RfU0VDT05EICogZHZkZW11eC0+ZnJhbWVyYXRlX2Rlbm9taW5hdG9yLAorICAgICAgICAgICAgICBkdmRlbXV4LT5mcmFtZXJhdGVfbnVtZXJhdG9yKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICBzd2l0Y2ggKGRlc3RfZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9CWVRFUzoKKyAgICAgICAgeworICAgICAgICAgIGd1aW50NjQgZnJhbWU7CisKKyAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIGZyYW1lICovCisgICAgICAgICAgZnJhbWUgPQorICAgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNyY192YWx1ZSwgZHZkZW11eC0+ZnJhbWVyYXRlX251bWVyYXRvciwKKyAgICAgICAgICAgICAgZHZkZW11eC0+ZnJhbWVyYXRlX2Rlbm9taW5hdG9yICogR1NUX1NFQ09ORCk7CisKKyAgICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIG9mZnNldCBmcm9tIHRoZSByb3VuZGVkIGZyYW1lICovCisgICAgICAgICAgKmRlc3RfdmFsdWUgPSBmcmFtZSAqIGR2ZGVtdXgtPmZyYW1lX2xlbjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IEZBTFNFOworICB9CisgIEdTVF9JTkZPX09CSkVDVCAoZHZkZW11eCwKKyAgICAgICJSZXN1bHQgOiBkZXN0X2Zvcm1hdDolZCwgZGVzdF92YWx1ZTolIiBHX0dJTlQ2NF9GT1JNQVQgIiwgcmVzOiVkIiwKKyAgICAgIGRlc3RfZm9ybWF0LCAqZGVzdF92YWx1ZSwgcmVzKTsKKworZG9uZToKKyAgcmV0dXJuIHJlczsKKworZXJyb3I6CisgIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGR2ZGVtdXgsICJzaW5rIGNvbnZlcnNpb24gZmFpbGVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R2ZGVtdXhfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKyAgR3N0RFZEZW11eCAqZHZkZW11eDsKKworICBkdmRlbXV4ID0gR1NUX0RWREVNVVggKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfUE9TSVRJT046CisgICAgeworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgICAgIGdpbnQ2NCBjdXI7CisKKyAgICAgIC8qIGdldCB0YXJnZXQgZm9ybWF0ICovCisgICAgICBnc3RfcXVlcnlfcGFyc2VfcG9zaXRpb24gKHF1ZXJ5LCAmZm9ybWF0LCBOVUxMKTsKKworICAgICAgLyogYnJpbmcgdGhlIHBvc2l0aW9uIHRvIHRoZSByZXF1ZXN0ZWQgZm9ybWF0LiAqLworICAgICAgaWYgKCEocmVzID0gZ3N0X2R2ZGVtdXhfc3JjX2NvbnZlcnQgKGR2ZGVtdXgsIHBhZCwKKyAgICAgICAgICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwgZHZkZW11eC0+dGltZV9zZWdtZW50LnBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgZm9ybWF0LCAmY3VyKSkpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgZm9ybWF0LCBjdXIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX0RVUkFUSU9OOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisgICAgICBnaW50NjQgZW5kOworICAgICAgR3N0UXVlcnkgKnBxdWVyeTsKKworICAgICAgLyogRmlyc3QgYXNrIHRoZSBwZWVyIGluIHRoZSBvcmlnaW5hbCBmb3JtYXQgKi8KKyAgICAgIGlmICghZ3N0X3BhZF9wZWVyX3F1ZXJ5IChkdmRlbXV4LT5zaW5rcGFkLCBxdWVyeSkpIHsKKyAgICAgICAgLyogZ2V0IHRhcmdldCBmb3JtYXQgKi8KKyAgICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2R1cmF0aW9uIChxdWVyeSwgJmZvcm1hdCwgTlVMTCk7CisKKyAgICAgICAgLyogTm93IGFzayB0aGUgcGVlciBpbiBCWVRFUyBmb3JtYXQgYW5kIHRyeSB0byBjb252ZXJ0ICovCisgICAgICAgIHBxdWVyeSA9IGdzdF9xdWVyeV9uZXdfZHVyYXRpb24gKEdTVF9GT1JNQVRfQllURVMpOworICAgICAgICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeSAoZHZkZW11eC0+c2lua3BhZCwgcHF1ZXJ5KSkgeworICAgICAgICAgIGdzdF9xdWVyeV91bnJlZiAocHF1ZXJ5KTsKKyAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgLyogZ2V0IHBlZXIgdG90YWwgbGVuZ3RoICovCisgICAgICAgIGdzdF9xdWVyeV9wYXJzZV9kdXJhdGlvbiAocHF1ZXJ5LCBOVUxMLCAmZW5kKTsKKyAgICAgICAgZ3N0X3F1ZXJ5X3VucmVmIChwcXVlcnkpOworCisgICAgICAgIC8qIGNvbnZlcnQgZW5kIHRvIHJlcXVlc3RlZCBmb3JtYXQgKi8KKyAgICAgICAgaWYgKGVuZCAhPSAtMSkgeworICAgICAgICAgIGlmICghKHJlcyA9IGdzdF9kdmRlbXV4X3NpbmtfY29udmVydCAoZHZkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgICBHU1RfRk9STUFUX0JZVEVTLCBlbmQsIGZvcm1hdCwgJmVuZCkpKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgIH0KKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X2R1cmF0aW9uIChxdWVyeSwgZm9ybWF0LCBlbmQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfQ09OVkVSVDoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgc3JjX2ZtdCwgZGVzdF9mbXQ7CisgICAgICBnaW50NjQgc3JjX3ZhbCwgZGVzdF92YWw7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9jb252ZXJ0IChxdWVyeSwgJnNyY19mbXQsICZzcmNfdmFsLCAmZGVzdF9mbXQsICZkZXN0X3ZhbCk7CisgICAgICBpZiAoIShyZXMgPQorICAgICAgICAgICAgICBnc3RfZHZkZW11eF9zcmNfY29udmVydCAoZHZkZW11eCwgcGFkLCBzcmNfZm10LCBzcmNfdmFsLAorICAgICAgICAgICAgICAgICAgZGVzdF9mbXQsICZkZXN0X3ZhbCkpKQorICAgICAgICBnb3RvIGVycm9yOworICAgICAgZ3N0X3F1ZXJ5X3NldF9jb252ZXJ0IChxdWVyeSwgc3JjX2ZtdCwgc3JjX3ZhbCwgZGVzdF9mbXQsIGRlc3RfdmFsKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9TRUVLSU5HOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmbXQ7CisgICAgICBHc3RRdWVyeSAqcGVlcnF1ZXJ5OworICAgICAgZ2Jvb2xlYW4gc2Vla2FibGU7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9zZWVraW5nIChxdWVyeSwgJmZtdCwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgICAgIC8qIFdlIGNhbiBvbmx5IGhhbmRsZSBUSU1FIHNlZWtzIHJlYWxseSAqLworICAgICAgaWYgKGZtdCAhPSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgZ3N0X3F1ZXJ5X3NldF9zZWVraW5nIChxdWVyeSwgZm10LCBGQUxTRSwgLTEsIC0xKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qIEZpcnN0IGFzayB1cHN0cmVhbSAqLworICAgICAgaWYgKGdzdF9wYWRfcGVlcl9xdWVyeSAoZHZkZW11eC0+c2lua3BhZCwgcXVlcnkpKSB7CisgICAgICAgIGdzdF9xdWVyeV9wYXJzZV9zZWVraW5nIChxdWVyeSwgTlVMTCwgJnNlZWthYmxlLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKHNlZWthYmxlKSB7CisgICAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXMgPSBUUlVFOworCisgICAgICBwZWVycXVlcnkgPSBnc3RfcXVlcnlfbmV3X3NlZWtpbmcgKEdTVF9GT1JNQVRfQllURVMpOworICAgICAgc2Vla2FibGUgPSBnc3RfcGFkX3BlZXJfcXVlcnkgKGR2ZGVtdXgtPnNpbmtwYWQsIHBlZXJxdWVyeSk7CisKKyAgICAgIGlmIChzZWVrYWJsZSkKKyAgICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3NlZWtpbmcgKHBlZXJxdWVyeSwgTlVMTCwgJnNlZWthYmxlLCBOVUxMLCBOVUxMKTsKKyAgICAgIGdzdF9xdWVyeV91bnJlZiAocGVlcnF1ZXJ5KTsKKworICAgICAgaWYgKHNlZWthYmxlKSB7CisgICAgICAgIHBlZXJxdWVyeSA9IGdzdF9xdWVyeV9uZXdfZHVyYXRpb24gKEdTVF9GT1JNQVRfVElNRSk7CisgICAgICAgIHNlZWthYmxlID0gZ3N0X2R2ZGVtdXhfc3JjX3F1ZXJ5IChwYWQsIHBhcmVudCwgcGVlcnF1ZXJ5KTsKKworICAgICAgICBpZiAoc2Vla2FibGUpIHsKKyAgICAgICAgICBnaW50NjQgZHVyYXRpb247CisKKyAgICAgICAgICBnc3RfcXVlcnlfcGFyc2VfZHVyYXRpb24gKHBlZXJxdWVyeSwgTlVMTCwgJmR1cmF0aW9uKTsKKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X3NlZWtpbmcgKHF1ZXJ5LCBHU1RfRk9STUFUX1RJTUUsIHNlZWthYmxlLCAwLCBkdXJhdGlvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3N0X3F1ZXJ5X3NldF9zZWVraW5nIChxdWVyeSwgR1NUX0ZPUk1BVF9USU1FLCBGQUxTRSwgLTEsIC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIGdzdF9xdWVyeV91bnJlZiAocGVlcnF1ZXJ5KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9xdWVyeV9zZXRfc2Vla2luZyAocXVlcnksIEdTVF9GT1JNQVRfVElNRSwgRkFMU0UsIC0xLCAtMSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK2Vycm9yOgorICB7CisgICAgR1NUX0RFQlVHICgiZXJyb3Igc291cmNlIHF1ZXJ5Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R2ZGVtdXhfc2lua19xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIEdzdERWRGVtdXggKmR2ZGVtdXg7CisKKyAgZHZkZW11eCA9IEdTVF9EVkRFTVVYIChwYXJlbnQpOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0NPTlZFUlQ6CisgICAgeworICAgICAgR3N0Rm9ybWF0IHNyY19mbXQsIGRlc3RfZm10OworICAgICAgZ2ludDY0IHNyY192YWwsIGRlc3RfdmFsOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY29udmVydCAocXVlcnksICZzcmNfZm10LCAmc3JjX3ZhbCwgJmRlc3RfZm10LCAmZGVzdF92YWwpOworICAgICAgaWYgKCEocmVzID0KKyAgICAgICAgICAgICAgZ3N0X2R2ZGVtdXhfc2lua19jb252ZXJ0IChkdmRlbXV4LCBzcmNfZm10LCBzcmNfdmFsLCBkZXN0X2ZtdCwKKyAgICAgICAgICAgICAgICAgICZkZXN0X3ZhbCkpKQorICAgICAgICBnb3RvIGVycm9yOworICAgICAgZ3N0X3F1ZXJ5X3NldF9jb252ZXJ0IChxdWVyeSwgc3JjX2ZtdCwgc3JjX3ZhbCwgZGVzdF9mbXQsIGRlc3RfdmFsKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworZXJyb3I6CisgIHsKKyAgICBHU1RfREVCVUcgKCJlcnJvciBoYW5kbGluZyBzaW5rIHF1ZXJ5Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgZXZlbnQgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R2ZGVtdXhfcHVzaF9ldmVudCAoR3N0RFZEZW11eCAqIGR2ZGVtdXgsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIGlmIChkdmRlbXV4LT52aWRlb3NyY3BhZCkgeworICAgIGdzdF9ldmVudF9yZWYgKGV2ZW50KTsKKyAgICByZXMgfD0gZ3N0X3BhZF9wdXNoX2V2ZW50IChkdmRlbXV4LT52aWRlb3NyY3BhZCwgZXZlbnQpOworICB9CisKKyAgaWYgKGR2ZGVtdXgtPmF1ZGlvc3JjcGFkKQorICAgIHJlcyB8PSBnc3RfcGFkX3B1c2hfZXZlbnQgKGR2ZGVtdXgtPmF1ZGlvc3JjcGFkLCBldmVudCk7CisgIGVsc2UgeworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgIHJlcyA9IFRSVUU7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdmRlbXV4X2hhbmRsZV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3REVkRlbXV4ICpkdmRlbXV4ID0gR1NUX0RWREVNVVggKHBhcmVudCk7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RBUlQ6CisgICAgICAvKiB3ZSBhcmUgbm90IGJsb2NraW5nIG9uIGFueXRoaW5nIGV4ZWN0IHRoZSBwdXNoKCkgY2FsbHMKKyAgICAgICAqIHRvIHRoZSBwZWVyIHdoaWNoIHdpbGwgYmUgdW5ibG9ja2VkIGJ5IGZvcndhcmRpbmcgdGhlCisgICAgICAgKiBldmVudC4qLworICAgICAgcmVzID0gZ3N0X2R2ZGVtdXhfcHVzaF9ldmVudCAoZHZkZW11eCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChkdmRlbXV4LT5hZGFwdGVyKTsKKyAgICAgIEdTVF9ERUJVRyAoImNsZWFyZWQgYWRhcHRlciIpOworICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJmR2ZGVtdXgtPmJ5dGVfc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmZHZkZW11eC0+dGltZV9zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICAgICAgZHZkZW11eC0+ZGlzY29udCA9IFRSVUU7CisgICAgICByZXMgPSBnc3RfZHZkZW11eF9wdXNoX2V2ZW50IChkdmRlbXV4LCBldmVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgIHsKKyAgICAgIGNvbnN0IEdzdFNlZ21lbnQgKnNlZ21lbnQ7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9zZWdtZW50IChldmVudCwgJnNlZ21lbnQpOworICAgICAgc3dpdGNoIChzZWdtZW50LT5mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgICAgIGdzdF9zZWdtZW50X2NvcHlfaW50byAoc2VnbWVudCwgJmR2ZGVtdXgtPmJ5dGVfc2VnbWVudCk7CisgICAgICAgICAgZHZkZW11eC0+bmVlZF9zZWdtZW50ID0gVFJVRTsKKyAgICAgICAgICBkdmRlbXV4LT5zZWdtZW50X3NlcW51bSA9IGdzdF9ldmVudF9nZXRfc2VxbnVtIChldmVudCk7CisgICAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9USU1FOgorICAgICAgICAgIGdzdF9zZWdtZW50X2NvcHlfaW50byAoc2VnbWVudCwgJmR2ZGVtdXgtPnRpbWVfc2VnbWVudCk7CisKKyAgICAgICAgICBkdmRlbXV4LT51cHN0cmVhbV90aW1lX3NlZ21lbnQgPSBUUlVFOworICAgICAgICAgIGR2ZGVtdXgtPnNlZ21lbnRfc2VxbnVtID0gZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KTsKKworICAgICAgICAgIC8qIGFuZCB3ZSBjYW4ganVzdCBmb3J3YXJkIHRoaXMgdGltZSBldmVudCAqLworICAgICAgICAgIHJlcyA9IGdzdF9kdmRlbXV4X3B1c2hfZXZlbnQgKGR2ZGVtdXgsIGV2ZW50KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgICAvKiBjYW5ub3QgYWNjZXB0IHRoaXMgZm9ybWF0ICovCisgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRU9TOgorICAgICAgLyogZmx1c2ggYW55IHBlbmRpbmcgZGF0YSwgc2hvdWxkIGJlIG5vdGhpbmcgbGVmdC4gKi8KKyAgICAgIGdzdF9kdmRlbXV4X2ZsdXNoIChkdmRlbXV4KTsKKyAgICAgIC8qIGZvcndhcmQgZXZlbnQgKi8KKyAgICAgIHJlcyA9IGdzdF9kdmRlbXV4X3B1c2hfZXZlbnQgKGR2ZGVtdXgsIGV2ZW50KTsKKyAgICAgIC8qIGFuZCBjbGVhciB0aGUgYWRhcHRlciAqLworICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGR2ZGVtdXgtPmFkYXB0ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfQ0FQUzoKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9kdmRlbXV4X3B1c2hfZXZlbnQgKGR2ZGVtdXgsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworLyogY29udmVydCBhIHBhaXIgb2YgdmFsdWVzIG9uIHRoZSBnaXZlbiBzcmNwYWQgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R2ZGVtdXhfY29udmVydF9zcmNfcGFpciAoR3N0RFZEZW11eCAqIGR2ZGVtdXgsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RGb3JtYXQgc3JjX2Zvcm1hdCwgZ2ludDY0IHNyY19zdGFydCwgZ2ludDY0IHNyY19zdG9wLAorICAgIEdzdEZvcm1hdCBkc3RfZm9ybWF0LCBnaW50NjQgKiBkc3Rfc3RhcnQsIGdpbnQ2NCAqIGRzdF9zdG9wKQoreworICBnYm9vbGVhbiByZXM7CisKKyAgR1NUX0lORk8gKCJzdGFydGluZyBjb252ZXJzaW9uIG9mIHN0YXJ0Iik7CisgIC8qIGJyaW5nIHRoZSBmb3JtYXQgdG8gdGltZSBvbiBzcmNwYWQuICovCisgIGlmICghKHJlcyA9IGdzdF9kdmRlbXV4X3NyY19jb252ZXJ0IChkdmRlbXV4LCBwYWQsCisgICAgICAgICAgICAgIHNyY19mb3JtYXQsIHNyY19zdGFydCwgZHN0X2Zvcm1hdCwgZHN0X3N0YXJ0KSkpIHsKKyAgICBnb3RvIGRvbmU7CisgIH0KKyAgR1NUX0lORk8gKCJGaW5pc2hlZCBjb252ZXJzaW9uIG9mIHN0YXJ0OiAlIiBHX0dJTlQ2NF9GT1JNQVQsICpkc3Rfc3RhcnQpOworCisgIEdTVF9JTkZPICgic3RhcnRpbmcgY29udmVyc2lvbiBvZiBzdG9wIik7CisgIC8qIGJyaW5nIHRoZSBmb3JtYXQgdG8gdGltZSBvbiBzcmNwYWQuICovCisgIGlmICghKHJlcyA9IGdzdF9kdmRlbXV4X3NyY19jb252ZXJ0IChkdmRlbXV4LCBwYWQsCisgICAgICAgICAgICAgIHNyY19mb3JtYXQsIHNyY19zdG9wLCBkc3RfZm9ybWF0LCBkc3Rfc3RvcCkpKSB7CisgICAgLyogY291bGQgbm90IGNvbnZlcnQgc2VlayBmb3JtYXQgdG8gdGltZSBvZmZzZXQgKi8KKyAgICBnb3RvIGRvbmU7CisgIH0KKyAgR1NUX0lORk8gKCJGaW5pc2hlZCBjb252ZXJzaW9uIG9mIHN0b3A6ICUiIEdfR0lOVDY0X0ZPUk1BVCwgKmRzdF9zdG9wKTsKK2RvbmU6CisgIHJldHVybiByZXM7Cit9CisKKy8qIGNvbnZlcnQgYSBwYWlyIG9mIHZhbHVlcyBvbiB0aGUgc2lua3BhZCAqLworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZW11eF9jb252ZXJ0X3NpbmtfcGFpciAoR3N0RFZEZW11eCAqIGR2ZGVtdXgsCisgICAgR3N0Rm9ybWF0IHNyY19mb3JtYXQsIGdpbnQ2NCBzcmNfc3RhcnQsIGdpbnQ2NCBzcmNfc3RvcCwKKyAgICBHc3RGb3JtYXQgZHN0X2Zvcm1hdCwgZ2ludDY0ICogZHN0X3N0YXJ0LCBnaW50NjQgKiBkc3Rfc3RvcCkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworCisgIEdTVF9JTkZPICgic3RhcnRpbmcgY29udmVyc2lvbiBvZiBzdGFydCIpOworICAvKiBicmluZyB0aGUgZm9ybWF0IHRvIHRpbWUgb24gc3JjcGFkLiAqLworICBpZiAoIShyZXMgPSBnc3RfZHZkZW11eF9zaW5rX2NvbnZlcnQgKGR2ZGVtdXgsCisgICAgICAgICAgICAgIHNyY19mb3JtYXQsIHNyY19zdGFydCwgZHN0X2Zvcm1hdCwgZHN0X3N0YXJ0KSkpIHsKKyAgICBnb3RvIGRvbmU7CisgIH0KKyAgR1NUX0lORk8gKCJGaW5pc2hlZCBjb252ZXJzaW9uIG9mIHN0YXJ0OiAlIiBHX0dJTlQ2NF9GT1JNQVQsICpkc3Rfc3RhcnQpOworCisgIEdTVF9JTkZPICgic3RhcnRpbmcgY29udmVyc2lvbiBvZiBzdG9wIik7CisgIC8qIGJyaW5nIHRoZSBmb3JtYXQgdG8gdGltZSBvbiBzcmNwYWQuICovCisgIGlmICghKHJlcyA9IGdzdF9kdmRlbXV4X3NpbmtfY29udmVydCAoZHZkZW11eCwKKyAgICAgICAgICAgICAgc3JjX2Zvcm1hdCwgc3JjX3N0b3AsIGRzdF9mb3JtYXQsIGRzdF9zdG9wKSkpIHsKKyAgICAvKiBjb3VsZCBub3QgY29udmVydCBzZWVrIGZvcm1hdCB0byB0aW1lIG9mZnNldCAqLworICAgIGdvdG8gZG9uZTsKKyAgfQorICBHU1RfSU5GTyAoIkZpbmlzaGVkIGNvbnZlcnNpb24gb2Ygc3RvcDogJSIgR19HSU5UNjRfRk9STUFULCAqZHN0X3N0b3ApOworZG9uZToKKyAgcmV0dXJuIHJlczsKK30KKworLyogY29udmVydCBhIHBhaXIgb2YgdmFsdWVzIG9uIHRoZSBzcmNwYWQgdG8gYSBwYWlyIG9mCisgKiB2YWx1ZXMgb24gdGhlIHNpbmtwYWQgCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R2ZGVtdXhfY29udmVydF9zcmNfdG9fc2luayAoR3N0RFZEZW11eCAqIGR2ZGVtdXgsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RGb3JtYXQgc3JjX2Zvcm1hdCwgZ2ludDY0IHNyY19zdGFydCwgZ2ludDY0IHNyY19zdG9wLAorICAgIEdzdEZvcm1hdCBkc3RfZm9ybWF0LCBnaW50NjQgKiBkc3Rfc3RhcnQsIGdpbnQ2NCAqIGRzdF9zdG9wKQoreworICBHc3RGb3JtYXQgY29udjsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIGNvbnYgPSBHU1RfRk9STUFUX1RJTUU7CisgIC8qIGNvbnZlcnQgdG8gVElNRSBpbnRlcm1lZGlhdGUgZm9ybWF0ICovCisgIGlmICghKHJlcyA9IGdzdF9kdmRlbXV4X2NvbnZlcnRfc3JjX3BhaXIgKGR2ZGVtdXgsIHBhZCwKKyAgICAgICAgICAgICAgc3JjX2Zvcm1hdCwgc3JjX3N0YXJ0LCBzcmNfc3RvcCwgY29udiwgZHN0X3N0YXJ0LCBkc3Rfc3RvcCkpKSB7CisgICAgLyogY291bGQgbm90IGNvbnZlcnQgZm9ybWF0IHRvIHRpbWUgb2Zmc2V0ICovCisgICAgZ290byBkb25lOworICB9CisgIC8qIGNvbnZlcnQgdG8gZHN0IGZvcm1hdCBvbiBzaW5rcGFkICovCisgIGlmICghKHJlcyA9IGdzdF9kdmRlbXV4X2NvbnZlcnRfc2lua19wYWlyIChkdmRlbXV4LAorICAgICAgICAgICAgICBjb252LCAqZHN0X3N0YXJ0LCAqZHN0X3N0b3AsIGRzdF9mb3JtYXQsIGRzdF9zdGFydCwgZHN0X3N0b3ApKSkgeworICAgIC8qIGNvdWxkIG5vdCBjb252ZXJ0IGZvcm1hdCB0byB0aW1lIG9mZnNldCAqLworICAgIGdvdG8gZG9uZTsKKyAgfQorZG9uZToKKyAgcmV0dXJuIHJlczsKK30KKworI2lmIDAKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R2ZGVtdXhfY29udmVydF9zZWdtZW50IChHc3REVkRlbXV4ICogZHZkZW11eCwgR3N0U2VnbWVudCAqIHNyYywKKyAgICBHc3RTZWdtZW50ICogZGVzdCkKK3sKKyAgZGVzdC0+cmF0ZSA9IHNyYy0+cmF0ZTsKKyAgZGVzdC0+YWJzX3JhdGUgPSBzcmMtPmFic19yYXRlOworICBkZXN0LT5mbGFncyA9IHNyYy0+ZmxhZ3M7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYKKworLyogaGFuZGxlIHNlZWsgaW4gcHVzaCBiYXNlIG1vZGUuCisgKgorICogQ29udmVydCB0aGUgdGltZSBzZWVrIHRvIGEgYnl0ZXMgc2VlayBhbmQgc2VuZCBpdAorICogdXBzdHJlYW0KKyAqIERvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZSBldmVudC4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZW11eF9oYW5kbGVfcHVzaF9zZWVrIChHc3REVkRlbXV4ICogZHZkZW11eCwgR3N0UGFkICogcGFkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworICBnZG91YmxlIHJhdGU7CisgIEdzdFNlZWtGbGFncyBmbGFnczsKKyAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgR3N0U2Vla1R5cGUgY3VyX3R5cGUsIHN0b3BfdHlwZTsKKyAgZ2ludDY0IGN1ciwgc3RvcDsKKyAgZ2ludDY0IHN0YXJ0X3Bvc2l0aW9uLCBlbmRfcG9zaXRpb247CisgIEdzdEV2ZW50ICpuZXdldmVudDsKKworICBnc3RfZXZlbnRfcGFyc2Vfc2VlayAoZXZlbnQsICZyYXRlLCAmZm9ybWF0LCAmZmxhZ3MsCisgICAgICAmY3VyX3R5cGUsICZjdXIsICZzdG9wX3R5cGUsICZzdG9wKTsKKworICAvKiBGaXJzdCB0cnkgaWYgdXBzdHJlYW0gY2FuIGhhbmRsZSB0aW1lIGJhc2VkIHNlZWtzICovCisgIGlmIChmb3JtYXQgPT0gR1NUX0ZPUk1BVF9USU1FKQorICAgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAoZHZkZW11eC0+c2lua3BhZCwgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpKTsKKworICBpZiAoIXJlcykgeworICAgIC8qIHdlIGNvbnZlcnQgdGhlIHN0YXJ0L3N0b3Agb24gdGhlIHNyY3BhZCB0byB0aGUgYnl0ZSBmb3JtYXQKKyAgICAgKiBvbiB0aGUgc2lua3BhZCBhbmQgZm9yd2FyZCB0aGUgZXZlbnQgKi8KKyAgICByZXMgPSBnc3RfZHZkZW11eF9jb252ZXJ0X3NyY190b19zaW5rIChkdmRlbXV4LCBwYWQsCisgICAgICAgIGZvcm1hdCwgY3VyLCBzdG9wLCBHU1RfRk9STUFUX0JZVEVTLCAmc3RhcnRfcG9zaXRpb24sICZlbmRfcG9zaXRpb24pOworICAgIGlmICghcmVzKQorICAgICAgZ290byBkb25lOworCisgICAgLyogbm93IHRoaXMgaXMgdGhlIHVwZGF0ZWQgc2VlayBldmVudCBvbiBieXRlcyAqLworICAgIG5ld2V2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWVrIChyYXRlLCBHU1RfRk9STUFUX0JZVEVTLCBmbGFncywKKyAgICAgICAgY3VyX3R5cGUsIHN0YXJ0X3Bvc2l0aW9uLCBzdG9wX3R5cGUsIGVuZF9wb3NpdGlvbik7CisgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKG5ld2V2ZW50LCBnc3RfZXZlbnRfZ2V0X3NlcW51bSAoZXZlbnQpKTsKKworICAgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAoZHZkZW11eC0+c2lua3BhZCwgbmV3ZXZlbnQpOworICB9Citkb25lOgorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2R2ZGVtdXhfdXBkYXRlX2ZyYW1lX29mZnNldHMgKEdzdERWRGVtdXggKiBkdmRlbXV4LCBHc3RDbG9ja1RpbWUgdGltZXN0YW1wKQoreworICAvKiBjYWxjdWxhdGUgY3VycmVudCBmcmFtZSBudW1iZXIgKi8KKyAgZ3N0X2R2ZGVtdXhfc3JjX2NvbnZlcnQgKGR2ZGVtdXgsIGR2ZGVtdXgtPnZpZGVvc3JjcGFkLAorICAgICAgZHZkZW11eC0+dGltZV9zZWdtZW50LmZvcm1hdCwgdGltZXN0YW1wLAorICAgICAgR1NUX0ZPUk1BVF9ERUZBVUxULCAmZHZkZW11eC0+dmlkZW9fb2Zmc2V0KTsKKworICAvKiBjYWxjdWxhdGUgY3VycmVudCBhdWRpbyBudW1iZXIgKi8KKyAgZ3N0X2R2ZGVtdXhfc3JjX2NvbnZlcnQgKGR2ZGVtdXgsIGR2ZGVtdXgtPmF1ZGlvc3JjcGFkLAorICAgICAgZHZkZW11eC0+dGltZV9zZWdtZW50LmZvcm1hdCwgdGltZXN0YW1wLAorICAgICAgR1NUX0ZPUk1BVF9ERUZBVUxULCAmZHZkZW11eC0+YXVkaW9fb2Zmc2V0KTsKKworICAvKiBldmVyeSBEViBmcmFtZSBjb3JyZXNwb250cyB3aXRoIG9uZSB2aWRlbyBmcmFtZSAqLworICBkdmRlbXV4LT5mcmFtZV9vZmZzZXQgPSBkdmRlbXV4LT52aWRlb19vZmZzZXQ7Cit9CisKKy8qIHBvc2l0aW9uIG91cnNlbHZlcyB0byB0aGUgY29uZmlndXJlZCBzZWdtZW50LCB1c2VkIGluIHB1bGwgbW9kZS4KKyAqIFRoZSBpbnB1dCBzZWdtZW50IGlzIGluIFRJTUUgZm9ybWF0LiBXZSBjb252ZXJ0IHRoZSB0aW1lIHZhbHVlcworICogdG8gYnl0ZXMgdmFsdWVzIGludG8gb3VyIGJ5dGVfc2VnbWVudCB3aGljaCB3ZSB1c2UgdG8gcHVsbCBkYXRhIGZyb20KKyAqIHRoZSBzaW5rcGFkIHBlZXIuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R2ZGVtdXhfZG9fc2VlayAoR3N0RFZEZW11eCAqIGRlbXV4LCBHc3RTZWdtZW50ICogc2VnbWVudCkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RGb3JtYXQgZm9ybWF0OworCisgIC8qIHBvc2l0aW9uIHRvIHZhbHVlIGNvbmZpZ3VyZWQgaXMgbGFzdF9zdG9wLCB0aGlzIHdpbGwgcm91bmQgZG93bgorICAgKiB0byB0aGUgYnl0ZSBwb3NpdGlvbiB3aGVyZSB0aGUgZnJhbWUgY29udGFpbmluZyB0aGUgZ2l2ZW4gCisgICAqIHRpbWVzdGFtcCBjYW4gYmUgZm91bmQuICovCisgIGZvcm1hdCA9IEdTVF9GT1JNQVRfQllURVM7CisgIHJlcyA9IGdzdF9kdmRlbXV4X3NpbmtfY29udmVydCAoZGVtdXgsCisgICAgICBzZWdtZW50LT5mb3JtYXQsIHNlZ21lbnQtPnBvc2l0aW9uLAorICAgICAgZm9ybWF0LCAoZ2ludDY0ICopICYgZGVtdXgtPmJ5dGVfc2VnbWVudC5wb3NpdGlvbik7CisgIGlmICghcmVzKQorICAgIGdvdG8gZG9uZTsKKworICAvKiB1cGRhdGUgYnl0ZSBzZWdtZW50IHN0YXJ0ICovCisgIGdzdF9kdmRlbXV4X3NpbmtfY29udmVydCAoZGVtdXgsCisgICAgICBzZWdtZW50LT5mb3JtYXQsIHNlZ21lbnQtPnN0YXJ0LCBmb3JtYXQsCisgICAgICAoZ2ludDY0ICopICYgZGVtdXgtPmJ5dGVfc2VnbWVudC5zdGFydCk7CisKKyAgLyogdXBkYXRlIGJ5dGUgc2VnbWVudCBzdG9wICovCisgIGdzdF9kdmRlbXV4X3NpbmtfY29udmVydCAoZGVtdXgsCisgICAgICBzZWdtZW50LT5mb3JtYXQsIHNlZ21lbnQtPnN0b3AsIGZvcm1hdCwKKyAgICAgIChnaW50NjQgKikgJiBkZW11eC0+Ynl0ZV9zZWdtZW50LnN0b3ApOworCisgIC8qIHVwZGF0ZSBieXRlIHNlZ21lbnQgdGltZSAqLworICBnc3RfZHZkZW11eF9zaW5rX2NvbnZlcnQgKGRlbXV4LAorICAgICAgc2VnbWVudC0+Zm9ybWF0LCBzZWdtZW50LT50aW1lLCBmb3JtYXQsCisgICAgICAoZ2ludDY0ICopICYgZGVtdXgtPmJ5dGVfc2VnbWVudC50aW1lKTsKKworICBnc3RfZHZkZW11eF91cGRhdGVfZnJhbWVfb2Zmc2V0cyAoZGVtdXgsIHNlZ21lbnQtPnN0YXJ0KTsKKworICBkZW11eC0+ZGlzY29udCA9IFRSVUU7CisKK2RvbmU6CisgIHJldHVybiByZXM7Cit9CisKKy8qIGhhbmRsZSBzZWVrIGluIHB1bGwgYmFzZSBtb2RlLgorICoKKyAqIERvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZSBldmVudC4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZW11eF9oYW5kbGVfcHVsbF9zZWVrIChHc3REVkRlbXV4ICogZGVtdXgsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBnYm9vbGVhbiByZXM7CisgIGdkb3VibGUgcmF0ZTsKKyAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgR3N0U2Vla0ZsYWdzIGZsYWdzOworICBHc3RTZWVrVHlwZSBjdXJfdHlwZSwgc3RvcF90eXBlOworICBnaW50NjQgY3VyLCBzdG9wOworICBnYm9vbGVhbiBmbHVzaDsKKyAgZ2Jvb2xlYW4gdXBkYXRlOworICBHc3RTZWdtZW50IHNlZWtzZWdtZW50OworICBHc3RFdmVudCAqbmV3X2V2ZW50OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZG9pbmcgc2VlayIpOworCisgIC8qIGZpcnN0IGJyaW5nIHRoZSBldmVudCBmb3JtYXQgdG8gVElNRSwgb3VyIG5hdGl2ZSBmb3JtYXQKKyAgICogdG8gcGVyZm9ybSB0aGUgc2VlayBvbiAqLworICBpZiAoZXZlbnQpIHsKKyAgICBHc3RGb3JtYXQgY29udjsKKworICAgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgJnJhdGUsICZmb3JtYXQsICZmbGFncywKKyAgICAgICAgJmN1cl90eXBlLCAmY3VyLCAmc3RvcF90eXBlLCAmc3RvcCk7CisKKyAgICAvKiBjYW4ndCBzZWVrIGJhY2t3YXJkcyB5ZXQgKi8KKyAgICBpZiAocmF0ZSA8PSAwLjApCisgICAgICBnb3RvIHdyb25nX3JhdGU7CisKKyAgICAvKiBjb252ZXJ0IGlucHV0IGZvcm1hdCB0byBUSU1FICovCisgICAgY29udiA9IEdTVF9GT1JNQVRfVElNRTsKKyAgICBpZiAoIShnc3RfZHZkZW11eF9jb252ZXJ0X3NyY19wYWlyIChkZW11eCwgcGFkLAorICAgICAgICAgICAgICAgIGZvcm1hdCwgY3VyLCBzdG9wLCBjb252LCAmY3VyLCAmc3RvcCkpKQorICAgICAgZ290byBub19mb3JtYXQ7CisKKyAgICBmb3JtYXQgPSBHU1RfRk9STUFUX1RJTUU7CisgIH0gZWxzZSB7CisgICAgZmxhZ3MgPSAwOworICB9CisKKyAgZGVtdXgtPnNlZ21lbnRfc2VxbnVtID0gZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KTsKKworICBmbHVzaCA9IGZsYWdzICYgR1NUX1NFRUtfRkxBR19GTFVTSDsKKworICAvKiBzZW5kIGZsdXNoIHN0YXJ0ICovCisgIGlmIChmbHVzaCkgeworICAgIG5ld19ldmVudCA9IGdzdF9ldmVudF9uZXdfZmx1c2hfc3RhcnQgKCk7CisgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKG5ld19ldmVudCwgZGVtdXgtPnNlZ21lbnRfc2VxbnVtKTsKKyAgICBnc3RfZHZkZW11eF9wdXNoX2V2ZW50IChkZW11eCwgbmV3X2V2ZW50KTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfcGFkX3BhdXNlX3Rhc2sgKGRlbXV4LT5zaW5rcGFkKTsKKyAgfQorCisgIC8qIGdyYWIgc3RyZWFtaW5nIGxvY2ssIHRoaXMgc2hvdWxkIGV2ZW50dWFsbHkgYmUgcG9zc2libGUsIGVpdGhlcgorICAgKiBiZWNhdXNlIHRoZSB0YXNrIGlzIHBhdXNlZCBvciBvdXIgc3RyZWFtaW5nIHRocmVhZCBzdG9wcGVkCisgICAqIGJlY2F1c2Ugb3VyIHBlZXIgaXMgZmx1c2hpbmcuICovCisgIEdTVF9QQURfU1RSRUFNX0xPQ0sgKGRlbXV4LT5zaW5rcGFkKTsKKworICAvKiBtYWtlIGNvcHkgaW50byB0ZW1wIHN0cnVjdHVyZSwgd2UgY2FuIG9ubHkgdXBkYXRlIHRoZSBtYWluIG9uZQorICAgKiB3aGVuIHRoZSBzdWJjbGFzcyBhY3R1YWxseSBjb3VsZCB0byB0aGUgc2Vlay4gKi8KKyAgbWVtY3B5ICgmc2Vla3NlZ21lbnQsICZkZW11eC0+dGltZV9zZWdtZW50LCBzaXplb2YgKEdzdFNlZ21lbnQpKTsKKworICAvKiBub3cgY29uZmlndXJlIHRoZSBzZWVrIHNlZ21lbnQgKi8KKyAgaWYgKGV2ZW50KSB7CisgICAgZ3N0X3NlZ21lbnRfZG9fc2VlayAoJnNlZWtzZWdtZW50LCByYXRlLCBmb3JtYXQsIGZsYWdzLAorICAgICAgICBjdXJfdHlwZSwgY3VyLCBzdG9wX3R5cGUsIHN0b3AsICZ1cGRhdGUpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzZWdtZW50IGNvbmZpZ3VyZWQgZnJvbSAlIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICIgdG8gJSIgR19HSU5UNjRfRk9STUFUICIsIHBvc2l0aW9uICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgIHNlZWtzZWdtZW50LnN0YXJ0LCBzZWVrc2VnbWVudC5zdG9wLCBzZWVrc2VnbWVudC5wb3NpdGlvbik7CisKKyAgLyogZG8gdGhlIHNlZWssIHNlZ21lbnQucG9zaXRpb24gY29udGFpbnMgbmV3IHBvc2l0aW9uLiAqLworICByZXMgPSBnc3RfZHZkZW11eF9kb19zZWVrIChkZW11eCwgJnNlZWtzZWdtZW50KTsKKworICAvKiBhbmQgcHJlcGFyZSB0byBjb250aW51ZSBzdHJlYW1pbmcgKi8KKyAgaWYgKGZsdXNoKSB7CisgICAgLyogc2VuZCBmbHVzaCBzdG9wLCBwZWVyIHdpbGwgYWNjZXB0IGRhdGEgYW5kIGV2ZW50cyBhZ2Fpbi4gV2UKKyAgICAgKiBhcmUgbm90IHlldCBwcm92aWRpbmcgZGF0YSBhcyB3ZSBzdGlsbCBoYXZlIHRoZSBTVFJFQU1fTE9DSy4gKi8KKyAgICBuZXdfZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0b3AgKFRSVUUpOworICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChuZXdfZXZlbnQsIGRlbXV4LT5zZWdtZW50X3NlcW51bSk7CisgICAgZ3N0X2R2ZGVtdXhfcHVzaF9ldmVudCAoZGVtdXgsIG5ld19ldmVudCk7CisgIH0KKworICAvKiBpZiBzdWNjZXNzZnVsbCBzZWVrLCB3ZSB1cGRhdGUgb3VyIHJlYWwgc2VnbWVudCBhbmQgcHVzaAorICAgKiBvdXQgdGhlIG5ldyBzZWdtZW50LiAqLworICBpZiAocmVzKSB7CisgICAgbWVtY3B5ICgmZGVtdXgtPnRpbWVfc2VnbWVudCwgJnNlZWtzZWdtZW50LCBzaXplb2YgKEdzdFNlZ21lbnQpKTsKKworICAgIGlmIChkZW11eC0+dGltZV9zZWdtZW50LmZsYWdzICYgR1NUX1NFRUtfRkxBR19TRUdNRU5UKSB7CisgICAgICBHc3RNZXNzYWdlICptZXNzYWdlOworCisgICAgICBtZXNzYWdlID0gZ3N0X21lc3NhZ2VfbmV3X3NlZ21lbnRfc3RhcnQgKEdTVF9PQkpFQ1RfQ0FTVCAoZGVtdXgpLAorICAgICAgICAgIGRlbXV4LT50aW1lX3NlZ21lbnQuZm9ybWF0LCBkZW11eC0+dGltZV9zZWdtZW50LnBvc2l0aW9uKTsKKyAgICAgIGdzdF9tZXNzYWdlX3NldF9zZXFudW0gKG1lc3NhZ2UsIGRlbXV4LT5zZWdtZW50X3NlcW51bSk7CisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwgbWVzc2FnZSk7CisgICAgfQorICAgIGlmICgoc3RvcCA9IGRlbXV4LT50aW1lX3NlZ21lbnQuc3RvcCkgPT0gLTEpCisgICAgICBzdG9wID0gZGVtdXgtPnRpbWVfc2VnbWVudC5kdXJhdGlvbjsKKworICAgIEdTVF9JTkZPX09CSkVDVCAoZGVtdXgsCisgICAgICAgICJTYXZpbmcgbmV3c2VnbWVudCBldmVudCB0byBiZSBzZW50IGluIHN0cmVhbWluZyB0aHJlYWQiKTsKKworICAgIGlmIChkZW11eC0+cGVuZGluZ19zZWdtZW50KQorICAgICAgZ3N0X2V2ZW50X3VucmVmIChkZW11eC0+cGVuZGluZ19zZWdtZW50KTsKKworICAgIGRlbXV4LT5wZW5kaW5nX3NlZ21lbnQgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZkZW11eC0+dGltZV9zZWdtZW50KTsKKyAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZGVtdXgtPnBlbmRpbmdfc2VnbWVudCwgZGVtdXgtPnNlZ21lbnRfc2VxbnVtKTsKKworICAgIGRlbXV4LT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgfQorCisgIC8qIGFuZCByZXN0YXJ0IHRoZSB0YXNrIGluIGNhc2UgaXQgZ290IHBhdXNlZCBleHBsaWNpdGVseSBvciBieQorICAgKiB0aGUgRkxVU0hfU1RBUlQgZXZlbnQgd2UgcHVzaGVkIG91dC4gKi8KKyAgZ3N0X3BhZF9zdGFydF90YXNrIChkZW11eC0+c2lua3BhZCwgKEdzdFRhc2tGdW5jdGlvbikgZ3N0X2R2ZGVtdXhfbG9vcCwKKyAgICAgIGRlbXV4LT5zaW5rcGFkLCBOVUxMKTsKKworICAvKiBhbmQgcmVsZWFzZSB0aGUgbG9jayBhZ2FpbiBzbyB3ZSBjYW4gY29udGludWUgc3RyZWFtaW5nICovCisgIEdTVF9QQURfU1RSRUFNX1VOTE9DSyAoZGVtdXgtPnNpbmtwYWQpOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLword3JvbmdfcmF0ZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAibmVnYXRpdmUgcGxheWJhY2sgcmF0ZSAlbGYgbm90IHN1cHBvcnRlZC4iLCByYXRlKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX2Zvcm1hdDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiY2Fubm90IGNvbnZlcnQgdG8gVElNRSBmb3JtYXQsIHNlZWsgYWJvcnRlZC4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZW11eF9zZW5kX2V2ZW50IChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0RFZEZW11eCAqZHZkZW11eCA9IEdTVF9EVkRFTVVYIChlbGVtZW50KTsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICB7CisgICAgICAvKiBjaGVja2luZyBoZWFkZXIgYW5kIGNvbmZpZ3VyaW5nIHRoZSBzZWVrIG11c3QgYmUgYXRvbWljICovCisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGR2ZGVtdXgpOworICAgICAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCZkdmRlbXV4LT5mb3VuZF9oZWFkZXIpID09IDApIHsKKyAgICAgICAgR3N0RXZlbnQgKipldmVudF9wOworCisgICAgICAgIGV2ZW50X3AgPSAmZHZkZW11eC0+c2Vla19ldmVudDsKKworICAgICAgICAvKiBXZSBkb24ndCBoYXZlIHBhZHMgeWV0LiBLZWVwIHRoZSBldmVudC4gKi8KKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChkdmRlbXV4LCAiS2VlcGluZyB0aGUgc2VlayBldmVudCBmb3IgbGF0ZXIiKTsKKworICAgICAgICBnc3RfZXZlbnRfcmVwbGFjZSAoZXZlbnRfcCwgZXZlbnQpOworICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZHZkZW11eCk7CisKKyAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdmRlbXV4KTsKKworICAgICAgICBpZiAoZHZkZW11eC0+c2Vla19oYW5kbGVyKQorICAgICAgICAgIHJlcyA9IGR2ZGVtdXgtPnNlZWtfaGFuZGxlciAoZHZkZW11eCwgZHZkZW11eC0+dmlkZW9zcmNwYWQsIGV2ZW50KTsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zZW5kX2V2ZW50IChlbGVtZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKKy8qIGhhbmRsZSBhbiBldmVudCBvbiB0aGUgc291cmNlIHBhZCwgaXQncyBtb3N0IGxpa2VseSBhIHNlZWsgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R2ZGVtdXhfaGFuZGxlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisgIEdzdERWRGVtdXggKmR2ZGVtdXg7CisKKyAgZHZkZW11eCA9IEdTVF9EVkRFTVVYIChwYXJlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1NFRUs6CisgICAgICAvKiBzZWVrIGhhbmRsZXIgaXMgaW5zdGFsbGVkIGJhc2VkIG9uIHNjaGVkdWxpbmcgbW9kZSAqLworICAgICAgaWYgKGR2ZGVtdXgtPnNlZWtfaGFuZGxlcikKKyAgICAgICAgcmVzID0gZHZkZW11eC0+c2Vla19oYW5kbGVyIChkdmRlbXV4LCBwYWQsIGV2ZW50KTsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAoZHZkZW11eC0+c2lua3BhZCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCisvKiBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiBidWZmZXIgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZHZkZW11eF9kZW11eF9hdWRpbyAoR3N0RFZEZW11eCAqIGR2ZGVtdXgsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBndWludDY0IGR1cmF0aW9uKQoreworICBnaW50IG51bV9zYW1wbGVzOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZHZfZGVjb2RlX2Z1bGxfYXVkaW8gKGR2ZGVtdXgtPmRlY29kZXIsIG1hcC5kYXRhLCBkdmRlbXV4LT5hdWRpb19idWZmZXJzKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICBpZiAoR19MSUtFTFkgKChudW1fc2FtcGxlcyA9IGR2X2dldF9udW1fc2FtcGxlcyAoZHZkZW11eC0+ZGVjb2RlcikpID4gMCkpIHsKKyAgICBnaW50MTYgKmFfcHRyOworICAgIGdpbnQgaSwgajsKKyAgICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgICBnaW50IGZyZXF1ZW5jeSwgY2hhbm5lbHM7CisKKyAgICAvKiBnZXQgaW5pdGlhbCBmb3JtYXQgb3IgY2hlY2sgaWYgZm9ybWF0IGNoYW5nZWQgKi8KKyAgICBmcmVxdWVuY3kgPSBkdl9nZXRfZnJlcXVlbmN5IChkdmRlbXV4LT5kZWNvZGVyKTsKKyAgICBjaGFubmVscyA9IGR2X2dldF9udW1fY2hhbm5lbHMgKGR2ZGVtdXgtPmRlY29kZXIpOworCisgICAgaWYgKEdfVU5MSUtFTFkgKChkdmRlbXV4LT5hdWRpb3NyY3BhZCA9PSBOVUxMKQorICAgICAgICAgICAgfHwgKGZyZXF1ZW5jeSAhPSBkdmRlbXV4LT5mcmVxdWVuY3kpCisgICAgICAgICAgICB8fCAoY2hhbm5lbHMgIT0gZHZkZW11eC0+Y2hhbm5lbHMpKSkgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKyAgICAgIEdzdEF1ZGlvSW5mbyBpbmZvOworCisgICAgICBkdmRlbXV4LT5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7CisgICAgICBkdmRlbXV4LT5jaGFubmVscyA9IGNoYW5uZWxzOworCisgICAgICBnc3RfYXVkaW9faW5mb19pbml0ICgmaW5mbyk7CisgICAgICBnc3RfYXVkaW9faW5mb19zZXRfZm9ybWF0ICgmaW5mbywgR1NUX0FVRElPX0ZPUk1BVF9TMTZMRSwKKyAgICAgICAgICBmcmVxdWVuY3ksIGNoYW5uZWxzLCBOVUxMKTsKKyAgICAgIGNhcHMgPSBnc3RfYXVkaW9faW5mb190b19jYXBzICgmaW5mbyk7CisgICAgICBpZiAoR19VTkxJS0VMWSAoZHZkZW11eC0+YXVkaW9zcmNwYWQgPT0gTlVMTCkpIHsKKyAgICAgICAgZHZkZW11eC0+YXVkaW9zcmNwYWQgPQorICAgICAgICAgICAgZ3N0X2R2ZGVtdXhfYWRkX3BhZCAoZHZkZW11eCwgJmF1ZGlvX3NyY190ZW1wLCBjYXBzKTsKKworICAgICAgICBpZiAoZHZkZW11eC0+dmlkZW9zcmNwYWQgJiYgZHZkZW11eC0+YXVkaW9zcmNwYWQpCisgICAgICAgICAgZ3N0X2VsZW1lbnRfbm9fbW9yZV9wYWRzIChHU1RfRUxFTUVOVCAoZHZkZW11eCkpOworCisgICAgICB9IGVsc2UgeworICAgICAgICBnc3RfcGFkX3NldF9jYXBzIChkdmRlbXV4LT5hdWRpb3NyY3BhZCwgY2Fwcyk7CisgICAgICB9CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgfQorCisgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChudW1fc2FtcGxlcyAqCisgICAgICAgIHNpemVvZiAoZ2ludDE2KSAqIGR2ZGVtdXgtPmNoYW5uZWxzKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgIGFfcHRyID0gKGdpbnQxNiAqKSBtYXAuZGF0YTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc2FtcGxlczsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgZHZkZW11eC0+Y2hhbm5lbHM7IGorKykgeworICAgICAgICAqKGFfcHRyKyspID0gZHZkZW11eC0+YXVkaW9fYnVmZmVyc1tqXVtpXTsKKyAgICAgIH0KKyAgICB9CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgIEdTVF9ERUJVRyAoInB1c2hpbmcgYXVkaW8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChkdmRlbXV4LT50aW1lX3NlZ21lbnQucG9zaXRpb24pKTsKKworICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpID0gZHZkZW11eC0+dGltZV9zZWdtZW50LnBvc2l0aW9uOworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPSBkdXJhdGlvbjsKKyAgICBHU1RfQlVGRkVSX09GRlNFVCAob3V0YnVmKSA9IGR2ZGVtdXgtPmF1ZGlvX29mZnNldDsKKyAgICBkdmRlbXV4LT5hdWRpb19vZmZzZXQgKz0gbnVtX3NhbXBsZXM7CisgICAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChvdXRidWYpID0gZHZkZW11eC0+YXVkaW9fb2Zmc2V0OworCisgICAgaWYgKGR2ZGVtdXgtPm5ld19tZWRpYSB8fCBkdmRlbXV4LT5kaXNjb250KQorICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgcmV0ID0gZ3N0X3BhZF9wdXNoIChkdmRlbXV4LT5hdWRpb3NyY3BhZCwgb3V0YnVmKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBubyBzYW1wbGVzICovCisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKiB0YWtlcyBvd25lcnNoaXAgb2YgYnVmZmVyICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2R2ZGVtdXhfZGVtdXhfdmlkZW8gKEdzdERWRGVtdXggKiBkdmRlbXV4LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgZ3VpbnQ2NCBkdXJhdGlvbikKK3sKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIGdpbnQgaGVpZ2h0OworICBnYm9vbGVhbiB3aWRlOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIC8qIGdldCBwYXJhbXMgKi8KKyAgLyogZnJhbWVyYXRlIGlzIGFscmVhZHkgdXAtdG8tZGF0ZSAqLworICBoZWlnaHQgPSBkdmRlbXV4LT5kZWNvZGVyLT5oZWlnaHQ7CisgIHdpZGUgPSBkdl9mb3JtYXRfd2lkZSAoZHZkZW11eC0+ZGVjb2Rlcik7CisKKyAgLyogc2VlIGlmIGFueXRoaW5nIGNoYW5nZWQgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKChkdmRlbXV4LT52aWRlb3NyY3BhZCA9PSBOVUxMKSB8fCAoZHZkZW11eC0+aGVpZ2h0ICE9IGhlaWdodCkKKyAgICAgICAgICB8fCBkdmRlbXV4LT53aWRlICE9IHdpZGUpKSB7CisgICAgZ2ludCBwYXJfeCwgcGFyX3k7CisgICAgR3N0Q2FwcyAqY2FwczsKKworICAgIGR2ZGVtdXgtPmhlaWdodCA9IGhlaWdodDsKKyAgICBkdmRlbXV4LT53aWRlID0gd2lkZTsKKworICAgIGlmIChkdmRlbXV4LT5kZWNvZGVyLT5zeXN0ZW0gPT0gZV9kdl9zeXN0ZW1fNjI1XzUwKSB7CisgICAgICBpZiAod2lkZSkgeworICAgICAgICBwYXJfeCA9IFBBTF9XSURFX1BBUl9YOworICAgICAgICBwYXJfeSA9IFBBTF9XSURFX1BBUl9ZOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyX3ggPSBQQUxfTk9STUFMX1BBUl9YOworICAgICAgICBwYXJfeSA9IFBBTF9OT1JNQUxfUEFSX1k7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICh3aWRlKSB7CisgICAgICAgIHBhcl94ID0gTlRTQ19XSURFX1BBUl9YOworICAgICAgICBwYXJfeSA9IE5UU0NfV0lERV9QQVJfWTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhcl94ID0gTlRTQ19OT1JNQUxfUEFSX1g7CisgICAgICAgIHBhcl95ID0gTlRTQ19OT1JNQUxfUEFSX1k7CisgICAgICB9CisgICAgfQorCisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWR2IiwKKyAgICAgICAgInN5c3RlbXN0cmVhbSIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwKKyAgICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgNzIwLAorICAgICAgICAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgaGVpZ2h0LAorICAgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sIGR2ZGVtdXgtPmZyYW1lcmF0ZV9udW1lcmF0b3IsCisgICAgICAgIGR2ZGVtdXgtPmZyYW1lcmF0ZV9kZW5vbWluYXRvciwKKyAgICAgICAgInBpeGVsLWFzcGVjdC1yYXRpbyIsIEdTVF9UWVBFX0ZSQUNUSU9OLCBwYXJfeCwgcGFyX3ksIE5VTEwpOworCisgICAgaWYgKEdfVU5MSUtFTFkgKGR2ZGVtdXgtPnZpZGVvc3JjcGFkID09IE5VTEwpKSB7CisgICAgICBkdmRlbXV4LT52aWRlb3NyY3BhZCA9CisgICAgICAgICAgZ3N0X2R2ZGVtdXhfYWRkX3BhZCAoZHZkZW11eCwgJnZpZGVvX3NyY190ZW1wLCBjYXBzKTsKKworICAgICAgaWYgKGR2ZGVtdXgtPnZpZGVvc3JjcGFkICYmIGR2ZGVtdXgtPmF1ZGlvc3JjcGFkKQorICAgICAgICBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgKEdTVF9FTEVNRU5UIChkdmRlbXV4KSk7CisKKyAgICB9IGVsc2UgeworICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAoZHZkZW11eC0+dmlkZW9zcmNwYWQsIGNhcHMpOworICAgIH0KKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIH0KKworICAvKiB0YWtlcyBvd25lcnNoaXAgb2YgYnVmZmVyIGhlcmUsIHdlIGp1c3QgbmVlZCB0byBtb2RpZnkKKyAgICogdGhlIG1ldGFkYXRhLiAqLworICBvdXRidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKGJ1ZmZlcik7CisKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSBkdmRlbXV4LT50aW1lX3NlZ21lbnQucG9zaXRpb247CisgIEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpID0gZHZkZW11eC0+dmlkZW9fb2Zmc2V0OworICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKG91dGJ1ZikgPSBkdmRlbXV4LT52aWRlb19vZmZzZXQgKyAxOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gZHVyYXRpb247CisKKyAgaWYgKGR2ZGVtdXgtPm5ld19tZWRpYSB8fCBkdmRlbXV4LT5kaXNjb250KQorICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworCisgIEdTVF9ERUJVRyAoInB1c2hpbmcgdmlkZW8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoZHZkZW11eC0+dGltZV9zZWdtZW50LnBvc2l0aW9uKSk7CisKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChkdmRlbXV4LT52aWRlb3NyY3BhZCwgb3V0YnVmKTsKKworICBkdmRlbXV4LT52aWRlb19vZmZzZXQrKzsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitnZXRfc3N5Yl9vZmZzZXQgKGludCBkaWYsIGludCBzc3liKQoreworICBpbnQgb2Zmc2V0OworCisgIG9mZnNldCA9IGRpZiAqIDEyMDAwOyAgICAgICAgIC8qIHRvIGRpZiAqLworICBvZmZzZXQgKz0gODAgKiAoMSArIChzc3liIC8gNikpOyAgICAgIC8qIHRvIHN1YmNvZGUgcGFjayAqLworICBvZmZzZXQgKz0gMzsgICAgICAgICAgICAgICAgICAvKiBwYXN0IGhlYWRlciAqLworICBvZmZzZXQgKz0gOCAqIChzc3liICUgNik7ICAgICAvKiB0byBzc3liICovCisKKyAgcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZW11eF9nZXRfdGltZWNvZGUgKEdzdERWRGVtdXggKiBkdmRlbXV4LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgR3N0U01QVEVUaW1lQ29kZSAqIHRpbWVjb2RlKQoreworICBndWludDggKmRhdGE7CisgIEdzdE1hcEluZm8gbWFwOworICBpbnQgb2Zmc2V0OworICBpbnQgZGlmOworICBpbnQgbl9kaWZzID0gZHZkZW11eC0+ZGVjb2Rlci0+bnVtX2RpZl9zZXFzOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgZm9yIChkaWYgPSAwOyBkaWYgPCBuX2RpZnM7IGRpZisrKSB7CisgICAgb2Zmc2V0ID0gZ2V0X3NzeWJfb2Zmc2V0IChkaWYsIDMpOworICAgIGlmIChkYXRhW29mZnNldCArIDNdID09IDB4MTMpIHsKKyAgICAgIHRpbWVjb2RlLT5mcmFtZXMgPSAoKGRhdGFbb2Zmc2V0ICsgNF0gPj4gNCkgJiAweDMpICogMTAgKworICAgICAgICAgIChkYXRhW29mZnNldCArIDRdICYgMHhmKTsKKyAgICAgIHRpbWVjb2RlLT5zZWNvbmRzID0gKChkYXRhW29mZnNldCArIDVdID4+IDQpICYgMHgzKSAqIDEwICsKKyAgICAgICAgICAoZGF0YVtvZmZzZXQgKyA1XSAmIDB4Zik7CisgICAgICB0aW1lY29kZS0+bWludXRlcyA9ICgoZGF0YVtvZmZzZXQgKyA2XSA+PiA0KSAmIDB4MykgKiAxMCArCisgICAgICAgICAgKGRhdGFbb2Zmc2V0ICsgNl0gJiAweGYpOworICAgICAgdGltZWNvZGUtPmhvdXJzID0gKChkYXRhW29mZnNldCArIDddID4+IDQpICYgMHgzKSAqIDEwICsKKyAgICAgICAgICAoZGF0YVtvZmZzZXQgKyA3XSAmIDB4Zik7CisgICAgICBHU1RfREVCVUcgKCJnb3QgdGltZWNvZGUgJSIgR1NUX1NNUFRFX1RJTUVfQ09ERV9GT1JNQVQsCisgICAgICAgICAgR1NUX1NNUFRFX1RJTUVfQ09ERV9BUkdTICh0aW1lY29kZSkpOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZW11eF9pc19uZXdfbWVkaWEgKEdzdERWRGVtdXggKiBkdmRlbXV4LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIGd1aW50OCAqZGF0YTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGludCBhYXV4X29mZnNldDsKKyAgaW50IGRpZjsKKyAgaW50IG5fZGlmczsKKworICBuX2RpZnMgPSBkdmRlbXV4LT5kZWNvZGVyLT5udW1fZGlmX3NlcXM7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBmb3IgKGRpZiA9IDA7IGRpZiA8IG5fZGlmczsgZGlmKyspIHsKKyAgICBpZiAoZGlmICYgMSkgeworICAgICAgYWF1eF9vZmZzZXQgPSAoZGlmICogMTIwMDApICsgKDYgKyAxNiAqIDEpICogODAgKyAzOworICAgIH0gZWxzZSB7CisgICAgICBhYXV4X29mZnNldCA9IChkaWYgKiAxMjAwMCkgKyAoNiArIDE2ICogNCkgKiA4MCArIDM7CisgICAgfQorICAgIGlmIChkYXRhW2FhdXhfb2Zmc2V0ICsgMF0gPT0gMHg1MSkgeworICAgICAgaWYgKChkYXRhW2FhdXhfb2Zmc2V0ICsgMl0gJiAweDgwKSA9PSAwKSB7CisgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyogdGFrZXMgb3duZXJzaGlwIG9mIGJ1ZmZlciAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9kdmRlbXV4X2RlbXV4X2ZyYW1lIChHc3REVkRlbXV4ICogZHZkZW11eCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RDbG9ja1RpbWUgbmV4dF90czsKKyAgR3N0Rmxvd1JldHVybiBhcmV0LCB2cmV0LCByZXQ7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDY0IGR1cmF0aW9uOworICBHc3RTTVBURVRpbWVDb2RlIHRpbWVjb2RlOworICBpbnQgZnJhbWVfbnVtYmVyOworCisgIGlmIChkdmRlbXV4LT5uZWVkX3NlZ21lbnQpIHsKKyAgICBHc3RGb3JtYXQgZm9ybWF0OworICAgIEdzdEV2ZW50ICpldmVudDsKKworICAgIGdfYXNzZXJ0ICghZHZkZW11eC0+dXBzdHJlYW1fdGltZV9zZWdtZW50KTsKKworICAgIC8qIGNvbnZlcnQgdG8gdGltZSBhbmQgc3RvcmUgYXMgc3RhcnQvZW5kX3RpbWVzdGFtcCAqLworICAgIGZvcm1hdCA9IEdTVF9GT1JNQVRfVElNRTsKKyAgICBpZiAoIShnc3RfZHZkZW11eF9jb252ZXJ0X3NpbmtfcGFpciAoZHZkZW11eCwKKyAgICAgICAgICAgICAgICBHU1RfRk9STUFUX0JZVEVTLCBkdmRlbXV4LT5ieXRlX3NlZ21lbnQuc3RhcnQsCisgICAgICAgICAgICAgICAgZHZkZW11eC0+Ynl0ZV9zZWdtZW50LnN0b3AsIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAoZ2ludDY0ICopICYgZHZkZW11eC0+dGltZV9zZWdtZW50LnN0YXJ0LAorICAgICAgICAgICAgICAgIChnaW50NjQgKikgJiBkdmRlbXV4LT50aW1lX3NlZ21lbnQuc3RvcCkpKQorICAgICAgZ290byBzZWdtZW50X2Vycm9yOworCisgICAgZHZkZW11eC0+dGltZV9zZWdtZW50LnRpbWUgPSBkdmRlbXV4LT50aW1lX3NlZ21lbnQuc3RhcnQ7CisgICAgZHZkZW11eC0+dGltZV9zZWdtZW50LnJhdGUgPSBkdmRlbXV4LT5ieXRlX3NlZ21lbnQucmF0ZTsKKworICAgIGdzdF9kdmRlbXV4X3NpbmtfY29udmVydCAoZHZkZW11eCwKKyAgICAgICAgR1NUX0ZPUk1BVF9CWVRFUywgZHZkZW11eC0+Ynl0ZV9zZWdtZW50LnBvc2l0aW9uLAorICAgICAgICBHU1RfRk9STUFUX1RJTUUsIChnaW50NjQgKikgJiBkdmRlbXV4LT50aW1lX3NlZ21lbnQucG9zaXRpb24pOworCisgICAgZ3N0X2R2ZGVtdXhfdXBkYXRlX2ZyYW1lX29mZnNldHMgKGR2ZGVtdXgsIGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5wb3NpdGlvbik7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdmRlbXV4LCAic2VuZGluZyBzZWdtZW50IHN0YXJ0OiAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgIiwgc3RvcDogJSIgR1NUX1RJTUVfRk9STUFUICIsIHRpbWU6ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoZHZkZW11eC0+dGltZV9zZWdtZW50LnN0YXJ0KSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoZHZkZW11eC0+dGltZV9zZWdtZW50LnN0b3ApLAorICAgICAgICBHU1RfVElNRV9BUkdTIChkdmRlbXV4LT50aW1lX3NlZ21lbnQuc3RhcnQpKTsKKworICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmZHZkZW11eC0+dGltZV9zZWdtZW50KTsKKyAgICBpZiAoZHZkZW11eC0+c2VnbWVudF9zZXFudW0pCisgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZXZlbnQsIGR2ZGVtdXgtPnNlZ21lbnRfc2VxbnVtKTsKKyAgICBnc3RfZHZkZW11eF9wdXNoX2V2ZW50IChkdmRlbXV4LCBldmVudCk7CisKKyAgICBkdmRlbXV4LT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgfQorCisgIGdzdF9kdmRlbXV4X2dldF90aW1lY29kZSAoZHZkZW11eCwgYnVmZmVyLCAmdGltZWNvZGUpOworICBnc3Rfc21wdGVfdGltZV9jb2RlX2dldF9mcmFtZV9udW1iZXIgKAorICAgICAgKGR2ZGVtdXgtPmRlY29kZXItPnN5c3RlbSA9PSBlX2R2X3N5c3RlbV82MjVfNTApID8KKyAgICAgIEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzI1IDogR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fMzAsCisgICAgICAmZnJhbWVfbnVtYmVyLCAmdGltZWNvZGUpOworCisgIGlmIChkdmRlbXV4LT50aW1lX3NlZ21lbnQucmF0ZSA8IDApIHsKKyAgICBuZXh0X3RzID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoCisgICAgICAgIChkdmRlbXV4LT5mcmFtZV9vZmZzZXQgPgorICAgICAgICAgICAgMCA/IGR2ZGVtdXgtPmZyYW1lX29mZnNldCAtIDEgOiAwKSAqIEdTVF9TRUNPTkQsCisgICAgICAgIGR2ZGVtdXgtPmZyYW1lcmF0ZV9kZW5vbWluYXRvciwgZHZkZW11eC0+ZnJhbWVyYXRlX251bWVyYXRvcik7CisgICAgZHVyYXRpb24gPSBkdmRlbXV4LT50aW1lX3NlZ21lbnQucG9zaXRpb24gLSBuZXh0X3RzOworICB9IGVsc2UgeworICAgIG5leHRfdHMgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50ICgKKyAgICAgICAgKGR2ZGVtdXgtPmZyYW1lX29mZnNldCArIDEpICogR1NUX1NFQ09ORCwKKyAgICAgICAgZHZkZW11eC0+ZnJhbWVyYXRlX2Rlbm9taW5hdG9yLCBkdmRlbXV4LT5mcmFtZXJhdGVfbnVtZXJhdG9yKTsKKyAgICBkdXJhdGlvbiA9IG5leHRfdHMgLSBkdmRlbXV4LT50aW1lX3NlZ21lbnQucG9zaXRpb247CisgIH0KKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBkdl9wYXJzZV9wYWNrcyAoZHZkZW11eC0+ZGVjb2RlciwgbWFwLmRhdGEpOworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICBkdmRlbXV4LT5uZXdfbWVkaWEgPSBGQUxTRTsKKyAgaWYgKGdzdF9kdmRlbXV4X2lzX25ld19tZWRpYSAoZHZkZW11eCwgYnVmZmVyKSAmJgorICAgICAgZHZkZW11eC0+ZnJhbWVzX3NpbmNlX25ld19tZWRpYSA+IDIpIHsKKyAgICBkdmRlbXV4LT5uZXdfbWVkaWEgPSBUUlVFOworICAgIGR2ZGVtdXgtPmZyYW1lc19zaW5jZV9uZXdfbWVkaWEgPSAwOworICB9CisgIGR2ZGVtdXgtPmZyYW1lc19zaW5jZV9uZXdfbWVkaWErKzsKKworICAvKiBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiBidWZmZXIgKi8KKyAgYXJldCA9IHJldCA9IGdzdF9kdmRlbXV4X2RlbXV4X2F1ZGlvIChkdmRlbXV4LCBidWZmZXIsIGR1cmF0aW9uKTsKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSyAmJiByZXQgIT0gR1NUX0ZMT1dfTk9UX0xJTktFRCkpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIC8qIHRha2VzIG93bmVyc2hpcCBvZiBidWZmZXIgKi8KKyAgdnJldCA9IHJldCA9IGdzdF9kdmRlbXV4X2RlbXV4X3ZpZGVvIChkdmRlbXV4LCBidWZmZXIsIGR1cmF0aW9uKTsKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSyAmJiByZXQgIT0gR1NUX0ZMT1dfTk9UX0xJTktFRCkpCisgICAgZ290byBkb25lOworCisgIC8qIGlmIGJvdGggYXJlIG5vdCBsaW5rZWQsIHdlIHN0b3AgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKGFyZXQgPT0gR1NUX0ZMT1dfTk9UX0xJTktFRCAmJiB2cmV0ID09IEdTVF9GTE9XX05PVF9MSU5LRUQpKSB7CisgICAgcmV0ID0gR1NUX0ZMT1dfTk9UX0xJTktFRDsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBkdmRlbXV4LT5kaXNjb250ID0gRkFMU0U7CisgIGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5wb3NpdGlvbiA9IG5leHRfdHM7CisKKyAgaWYgKGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5yYXRlIDwgMCkgeworICAgIGlmIChkdmRlbXV4LT5mcmFtZV9vZmZzZXQgPiAwKQorICAgICAgZHZkZW11eC0+ZnJhbWVfb2Zmc2V0LS07CisgICAgZWxzZQorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkdmRlbXV4LAorICAgICAgICAgICJHb3QgYmVmb3JlIGZyYW1lIG9mZnNldCAwIGluIHJldmVyc2UgcGxheWJhY2siKTsKKyAgfSBlbHNlIHsKKyAgICBkdmRlbXV4LT5mcmFtZV9vZmZzZXQrKzsKKyAgfQorCisgIC8qIGNoZWNrIGZvciB0aGUgZW5kIG9mIHRoZSBzZWdtZW50ICovCisgIGlmICgoZHZkZW11eC0+dGltZV9zZWdtZW50LnJhdGUgPiAwICYmIGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5zdG9wICE9IC0xCisgICAgICAgICAgJiYgbmV4dF90cyA+IGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5zdG9wKQorICAgICAgfHwgKGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5yYXRlIDwgMAorICAgICAgICAgICYmIGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5zdGFydCA+IG5leHRfdHMpKQorICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgZWxzZQorICAgIHJldCA9IEdTVF9GTE9XX09LOworCitkb25lOgorICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworc2VnbWVudF9lcnJvcjoKKyAgeworICAgIEdTVF9ERUJVRyAoImVycm9yIGdlbmVyYXRpbmcgbmV3X3NlZ21lbnQgZXZlbnQiKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCisvKiBmbHVzaCBhbnkgcmVtYWluaW5nIGRhdGEgaW4gdGhlIGFkYXB0ZXIsIHVzZWQgaW4gY2hhaW4gYmFzZWQgc2NoZWR1bGluZyBtb2RlICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2R2ZGVtdXhfZmx1c2ggKEdzdERWRGVtdXggKiBkdmRlbXV4KQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIHdoaWxlIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGR2ZGVtdXgtPmFkYXB0ZXIpID49IGR2ZGVtdXgtPmZyYW1lX2xlbikgeworICAgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgICBnaW50IGxlbmd0aDsKKworICAgIC8qIGdldCB0aGUgYWNjdW11bGF0ZWQgYnl0ZXMgKi8KKyAgICBkYXRhID0gZ3N0X2FkYXB0ZXJfbWFwIChkdmRlbXV4LT5hZGFwdGVyLCBkdmRlbXV4LT5mcmFtZV9sZW4pOworCisgICAgLyogcGFyc2UgaGVhZGVyIHRvIGtub3cgdGhlIGxlbmd0aCBhbmQgb3RoZXIgcGFyYW1zICovCisgICAgaWYgKEdfVU5MSUtFTFkgKGR2X3BhcnNlX2hlYWRlciAoZHZkZW11eC0+ZGVjb2RlciwgZGF0YSkgPCAwKSkgeworICAgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKGR2ZGVtdXgtPmFkYXB0ZXIpOworICAgICAgZ290byBwYXJzZV9oZWFkZXJfZXJyb3I7CisgICAgfQorICAgIGdzdF9hZGFwdGVyX3VubWFwIChkdmRlbXV4LT5hZGFwdGVyKTsKKworICAgIC8qIGFmdGVyIHBhcnNpbmcgdGhlIGhlYWRlciB3ZSBrbm93IHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgKi8KKyAgICBsZW5ndGggPSBkdmRlbXV4LT5mcmFtZV9sZW4gPSBkdmRlbXV4LT5kZWNvZGVyLT5mcmFtZV9zaXplOworICAgIGlmIChkdmRlbXV4LT5kZWNvZGVyLT5zeXN0ZW0gPT0gZV9kdl9zeXN0ZW1fNjI1XzUwKSB7CisgICAgICBkdmRlbXV4LT5mcmFtZXJhdGVfbnVtZXJhdG9yID0gUEFMX0ZSQU1FUkFURV9OVU1FUkFUT1I7CisgICAgICBkdmRlbXV4LT5mcmFtZXJhdGVfZGVub21pbmF0b3IgPSBQQUxfRlJBTUVSQVRFX0RFTk9NSU5BVE9SOworICAgIH0gZWxzZSB7CisgICAgICBkdmRlbXV4LT5mcmFtZXJhdGVfbnVtZXJhdG9yID0gTlRTQ19GUkFNRVJBVEVfTlVNRVJBVE9SOworICAgICAgZHZkZW11eC0+ZnJhbWVyYXRlX2Rlbm9taW5hdG9yID0gTlRTQ19GUkFNRVJBVEVfREVOT01JTkFUT1I7CisgICAgfQorICAgIGdfYXRvbWljX2ludF9zZXQgKCZkdmRlbXV4LT5mb3VuZF9oZWFkZXIsIDEpOworCisgICAgLyogbGV0IGRlbXV4X3ZpZGVvIHNldCB0aGUgaGVpZ2h0LCBpdCBuZWVkcyB0byBkZXRlY3Qgd2hlbiB0aGluZ3MgY2hhbmdlIHNvCisgICAgICogaXQgY2FuIHJlc2V0IGNhcHMgKi8KKworICAgIC8qIGlmIHdlIHN0aWxsIGhhdmUgZW5vdWdoIGZvciBhIGZyYW1lLCBzdGFydCBkZWNvZGluZyAqLworICAgIGlmIChHX0xJS0VMWSAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkdmRlbXV4LT5hZGFwdGVyKSA+PSBsZW5ndGgpKSB7CisgICAgICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKworICAgICAgYnVmZmVyID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGR2ZGVtdXgtPmFkYXB0ZXIsIGxlbmd0aCk7CisKKyAgICAgIC8qIGFuZCBkZWNvZGUgdGhlIGJ1ZmZlciwgdGFrZXMgb3duZXJzaGlwICovCisgICAgICByZXQgPSBnc3RfZHZkZW11eF9kZW11eF9mcmFtZSAoZHZkZW11eCwgYnVmZmVyKTsKKyAgICAgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICB9Citkb25lOgorICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworcGFyc2VfaGVhZGVyX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGR2ZGVtdXgsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiRXJyb3IgcGFyc2luZyBEViBoZWFkZXIiKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKKy8qIHN0cmVhbWluZyBvcGVyYXRpb246IAorICoKKyAqIGFjY3VtdWxhdGUgZGF0YSB1bnRpbCB3ZSBoYXZlIGEgZnJhbWUsIHRoZW4gZGVjb2RlLiAKKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9kdmRlbXV4X2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3REVkRlbXV4ICpkdmRlbXV4OworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKworICBkdmRlbXV4ID0gR1NUX0RWREVNVVggKHBhcmVudCk7CisKKyAgLyogYSBkaXNjb250aW51aXR5IGluIHRoZSBzdHJlYW0sIHdlIG5lZWQgdG8gZ2V0IHJpZCBvZgorICAgKiBhY2N1bXVsYXRlZCBkYXRhIGluIHRoZSBhZGFwdGVyIGFuZCBhc3N1bWUgYSBuZXcgZnJhbWUKKyAgICogc3RhcnRzIGFmdGVyIHRoZSBkaXNjb250aW51aXR5ICovCisgIGlmIChHX1VOTElLRUxZIChHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKSkpIHsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAoZHZkZW11eC0+YWRhcHRlcik7CisgICAgZHZkZW11eC0+ZGlzY29udCA9IFRSVUU7CisKKyAgICAvKiBTaG91bGQgcmVjaGVjayB3aGVyZSB3ZSBhcmUgKi8KKyAgICBpZiAoIWR2ZGVtdXgtPnVwc3RyZWFtX3RpbWVfc2VnbWVudCkKKyAgICAgIGR2ZGVtdXgtPm5lZWRfc2VnbWVudCA9IFRSVUU7CisgIH0KKworICAvKiBhIHRpbWVzdGFtcCBhbHdheXMgc2hvdWxkIGJlIHJlc3BlY3RlZCAqLworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKTsKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEICh0aW1lc3RhbXApKSB7CisgICAgZHZkZW11eC0+dGltZV9zZWdtZW50LnBvc2l0aW9uID0gdGltZXN0YW1wOworCisgICAgaWYgKGR2ZGVtdXgtPmRpc2NvbnQpCisgICAgICBnc3RfZHZkZW11eF91cGRhdGVfZnJhbWVfb2Zmc2V0cyAoZHZkZW11eCwKKyAgICAgICAgICBkdmRlbXV4LT50aW1lX3NlZ21lbnQucG9zaXRpb24pOworICB9IGVsc2UgaWYgKGR2ZGVtdXgtPnVwc3RyZWFtX3RpbWVfc2VnbWVudCAmJiBkdmRlbXV4LT5kaXNjb250KSB7CisgICAgLyogVGhpcyB3aWxsIHByb2JhYmx5IGZhaWwgbGF0ZXIgdG8gcHJvdmlkZSBjb3JyZWN0CisgICAgICogdGltZXN0YW1wcyBhbmQvb3IgZHVyYXRpb25zIGJ1dCBhbHNvIHNob3VsZCBub3QgaGFwcGVuICovCisgICAgR1NUX0VSUk9SX09CSkVDVCAoZHZkZW11eCwKKyAgICAgICAgIlVwc3RyZWFtIHByb3ZpZGVzIFRJTUUgc2VnbWVudCBidXQgbm8gUFRTIGFmdGVyIGRpc2NvbnQiKTsKKyAgfQorCisgIGdzdF9hZGFwdGVyX3B1c2ggKGR2ZGVtdXgtPmFkYXB0ZXIsIGJ1ZmZlcik7CisKKyAgLyogQXBwYXJlbnRseSBkdl9wYXJzZV9oZWFkZXIgY2FuIHJlYWQgZnJvbSB0aGUgYm9keSBvZiB0aGUgZnJhbWUKKyAgICogdG9vLCBzbyBpdCBuZWVkcyBtb3JlIHRoYW4gaGVhZGVyX3NpemUgYnl0ZXMuIFdhY2t5IQorICAgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKGR2ZGVtdXgtPmZyYW1lX2xlbiA9PSAtMSkpIHsKKyAgICAvKiBpZiB3ZSBkb24ndCBrbm93IHRoZSBsZW5ndGggb2YgYSBmcmFtZSwgd2UgYXNzdW1lIGl0IGlzCisgICAgICogdGhlIE5UU0NfQlVGRkVSIGxlbmd0aCwgYXMgdGhpcyBpcyBlbm91Z2ggdG8gZmlndXJlIG91dCAKKyAgICAgKiBpZiB0aGlzIGlzIFBBTCBvciBOVFNDICovCisgICAgZHZkZW11eC0+ZnJhbWVfbGVuID0gTlRTQ19CVUZGRVI7CisgIH0KKworICAvKiBhbmQgdHJ5IHRvIGZsdXNoIHBlbmRpbmcgZnJhbWVzICovCisgIHJldCA9IGdzdF9kdmRlbXV4X2ZsdXNoIChkdmRlbXV4KTsKKworICByZXR1cm4gcmV0OworfQorCisvKiBwdWxsIGJhc2VkIG9wZXJhdGlvbi4KKyAqCisgKiBSZWFkIGhlYWRlciBmaXJzdCB0byBmaWd1cmUgb3V0IHRoZSBmcmFtZSBzaXplLiBUaGVuIHJlYWQKKyAqIGFuZCBkZWNvZGUgZnVsbCBmcmFtZXMuCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfZHZkZW11eF9sb29wIChHc3RQYWQgKiBwYWQpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3REVkRlbXV4ICpkdmRlbXV4OworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IE5VTEw7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGR2ZGVtdXggPSBHU1RfRFZERU1VWCAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKworICBpZiAoR19VTkxJS0VMWSAoZ19hdG9taWNfaW50X2dldCAoJmR2ZGVtdXgtPmZvdW5kX2hlYWRlcikgPT0gMCkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdmRlbXV4LCAicHVsbGluZyBmaXJzdCBidWZmZXIiKTsKKyAgICAvKiBwdWxsIGluIE5UU0Mgc2l6ZWQgYnVmZmVyIHRvIGZpZ3VyZSBvdXQgdGhlIGZyYW1lCisgICAgICogbGVuZ3RoICovCisgICAgcmV0ID0gZ3N0X3BhZF9wdWxsX3JhbmdlIChkdmRlbXV4LT5zaW5rcGFkLAorICAgICAgICBkdmRlbXV4LT5ieXRlX3NlZ21lbnQucG9zaXRpb24sIE5UU0NfQlVGRkVSLCAmYnVmZmVyKTsKKyAgICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkKKyAgICAgIGdvdG8gcGF1c2U7CisKKyAgICAvKiBjaGVjayBidWZmZXIgc2l6ZSwgZG9uJ3Qgd2FudCB0byByZWFkIHNtYWxsIGJ1ZmZlcnMgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSA8IE5UU0NfQlVGRkVSKSkKKyAgICAgIGdvdG8gc21hbGxfYnVmZmVyOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAvKiBwYXJzZSBoZWFkZXIgdG8ga25vdyB0aGUgbGVuZ3RoIGFuZCBvdGhlciBwYXJhbXMgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAoZHZfcGFyc2VfaGVhZGVyIChkdmRlbXV4LT5kZWNvZGVyLCBtYXAuZGF0YSkgPCAwKSkgeworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICAgIGdvdG8gcGFyc2VfaGVhZGVyX2Vycm9yOworICAgIH0KKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgICAgLyogYWZ0ZXIgcGFyc2luZyB0aGUgaGVhZGVyIHdlIGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSAqLworICAgIGR2ZGVtdXgtPmZyYW1lX2xlbiA9IGR2ZGVtdXgtPmRlY29kZXItPmZyYW1lX3NpemU7CisgICAgaWYgKGR2ZGVtdXgtPmRlY29kZXItPnN5c3RlbSA9PSBlX2R2X3N5c3RlbV82MjVfNTApIHsKKyAgICAgIGR2ZGVtdXgtPmZyYW1lcmF0ZV9udW1lcmF0b3IgPSBQQUxfRlJBTUVSQVRFX05VTUVSQVRPUjsKKyAgICAgIGR2ZGVtdXgtPmZyYW1lcmF0ZV9kZW5vbWluYXRvciA9IFBBTF9GUkFNRVJBVEVfREVOT01JTkFUT1I7CisgICAgfSBlbHNlIHsKKyAgICAgIGR2ZGVtdXgtPmZyYW1lcmF0ZV9udW1lcmF0b3IgPSBOVFNDX0ZSQU1FUkFURV9OVU1FUkFUT1I7CisgICAgICBkdmRlbXV4LT5mcmFtZXJhdGVfZGVub21pbmF0b3IgPSBOVFNDX0ZSQU1FUkFURV9ERU5PTUlOQVRPUjsKKyAgICB9CisgICAgZHZkZW11eC0+bmVlZF9zZWdtZW50ID0gVFJVRTsKKworICAgIC8qIHNlZSBpZiB3ZSBuZWVkIHRvIHJlYWQgYSBsYXJnZXIgcGFydCAqLworICAgIGlmIChkdmRlbXV4LT5mcmFtZV9sZW4gIT0gTlRTQ19CVUZGRVIpIHsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgICBidWZmZXIgPSBOVUxMOworICAgIH0KKworICAgIHsKKyAgICAgIEdzdEV2ZW50ICpldmVudDsKKworICAgICAgLyogc2V0dGluZyBoZWFkZXIgYW5kIHBycmZvcm1pbmcgdGhlIHNlZWsgbXVzdCBiZSBhdG9taWMgKi8KKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZHZkZW11eCk7CisgICAgICAvKiBnb3QgaGVhZGVyIG5vdyAqLworICAgICAgZ19hdG9taWNfaW50X3NldCAoJmR2ZGVtdXgtPmZvdW5kX2hlYWRlciwgMSk7CisKKyAgICAgIC8qIG5vdyBwZXJmb3JtIHBlbmRpbmcgc2VlayBpZiBhbnkuICovCisgICAgICBldmVudCA9IGR2ZGVtdXgtPnNlZWtfZXZlbnQ7CisgICAgICBpZiAoZXZlbnQpCisgICAgICAgIGdzdF9ldmVudF9yZWYgKGV2ZW50KTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdmRlbXV4KTsKKworICAgICAgaWYgKGV2ZW50KSB7CisgICAgICAgIGlmICghZ3N0X2R2ZGVtdXhfaGFuZGxlX3B1bGxfc2VlayAoZHZkZW11eCwgZHZkZW11eC0+dmlkZW9zcmNwYWQsCisgICAgICAgICAgICAgICAgZXZlbnQpKSB7CisgICAgICAgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoZHZkZW11eCwgU1RSRUFNLCBERUNPREUsIChOVUxMKSwKKyAgICAgICAgICAgICAgKCJFcnJvciBwZXJmb21pbmcgaW5pdGlhbCBzZWVrIikpOworICAgICAgICB9CisgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworCisgICAgICAgIC8qIGFuZCB3ZSBuZWVkIHRvIHB1bGwgYSBuZXcgYnVmZmVyIGluIGFsbCBjYXNlcy4gKi8KKyAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChHX1VOTElLRUxZIChkdmRlbXV4LT5wZW5kaW5nX3NlZ21lbnQpKSB7CisKKyAgICAvKiBub3cgc2VuZCB0aGUgbmV3c2VnbWVudCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR2ZGVtdXgsICJTZW5kaW5nIG5ld3NlZ21lbnQgZnJvbSIpOworCisgICAgZ3N0X2R2ZGVtdXhfcHVzaF9ldmVudCAoZHZkZW11eCwgZHZkZW11eC0+cGVuZGluZ19zZWdtZW50KTsKKyAgICBkdmRlbXV4LT5wZW5kaW5nX3NlZ21lbnQgPSBOVUxMOworICB9CisKKyAgaWYgKEdfTElLRUxZIChidWZmZXIgPT0gTlVMTCkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdmRlbXV4LCAicHVsbGluZyBidWZmZXIgYXQgb2Zmc2V0ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgZHZkZW11eC0+Ynl0ZV9zZWdtZW50LnBvc2l0aW9uKTsKKworICAgIHJldCA9IGdzdF9wYWRfcHVsbF9yYW5nZSAoZHZkZW11eC0+c2lua3BhZCwKKyAgICAgICAgZHZkZW11eC0+Ynl0ZV9zZWdtZW50LnBvc2l0aW9uLCBkdmRlbXV4LT5mcmFtZV9sZW4sICZidWZmZXIpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIHBhdXNlOworCisgICAgLyogY2hlY2sgYnVmZmVyIHNpemUsIGRvbid0IHdhbnQgdG8gcmVhZCBzbWFsbCBidWZmZXJzICovCisgICAgaWYgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikgPCBkdmRlbXV4LT5mcmFtZV9sZW4pCisgICAgICBnb3RvIHNtYWxsX2J1ZmZlcjsKKyAgfQorICAvKiBhbmQgZGVjb2RlIHRoZSBidWZmZXIgKi8KKyAgcmV0ID0gZ3N0X2R2ZGVtdXhfZGVtdXhfZnJhbWUgKGR2ZGVtdXgsIGJ1ZmZlcik7CisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKQorICAgIGdvdG8gcGF1c2U7CisKKyAgLyogYW5kIHBvc2l0aW9uIG91cnNlbHZlcyBmb3IgdGhlIG5leHQgYnVmZmVyICovCisgIGR2ZGVtdXgtPmJ5dGVfc2VnbWVudC5wb3NpdGlvbiArPSBkdmRlbXV4LT5mcmFtZV9sZW47CisKK2RvbmU6CisgIGdzdF9vYmplY3RfdW5yZWYgKGR2ZGVtdXgpOworCisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK3BhcnNlX2hlYWRlcl9lcnJvcjoKKyAgeworICAgIEdzdEV2ZW50ICpldmVudDsKKworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkdmRlbXV4LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkVycm9yIHBhcnNpbmcgRFYgaGVhZGVyIikpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChkdmRlbXV4LT5zaW5rcGFkKTsKKyAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfZW9zICgpOworICAgIGlmIChkdmRlbXV4LT5zZWdtZW50X3NlcW51bSkKKyAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgZHZkZW11eC0+c2VnbWVudF9zZXFudW0pOworICAgIGdzdF9kdmRlbXV4X3B1c2hfZXZlbnQgKGR2ZGVtdXgsIGV2ZW50KTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3NtYWxsX2J1ZmZlcjoKKyAgeworICAgIEdzdEV2ZW50ICpldmVudDsKKworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkdmRlbXV4LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkVycm9yIHJlYWRpbmcgYnVmZmVyIikpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChkdmRlbXV4LT5zaW5rcGFkKTsKKyAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfZW9zICgpOworICAgIGlmIChkdmRlbXV4LT5zZWdtZW50X3NlcW51bSkKKyAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgZHZkZW11eC0+c2VnbWVudF9zZXFudW0pOworICAgIGdzdF9kdmRlbXV4X3B1c2hfZXZlbnQgKGR2ZGVtdXgsIGV2ZW50KTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3BhdXNlOgorICB7CisgICAgR1NUX0lORk9fT0JKRUNUIChkdmRlbXV4LCAicGF1c2luZyB0YXNrLCAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICBnc3RfcGFkX3BhdXNlX3Rhc2sgKGR2ZGVtdXgtPnNpbmtwYWQpOworICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRU9TKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZHZkZW11eCwgImdvdCBlb3MiKTsKKyAgICAgIC8qIHNvIGFsaWduIG91ciBwb3NpdGlvbiB3aXRoIHRoZSBlbmQgb2YgaXQsIGlmIHRoZXJlIGlzIG9uZQorICAgICAgICogdGhpcyBlbnN1cmVzIGEgc3Vic2VxdWVudCB3aWxsIGFycml2ZSBhdCBjb3JyZWN0IGJhc2UvYWNjIHRpbWUgKi8KKyAgICAgIGlmIChkdmRlbXV4LT50aW1lX3NlZ21lbnQucmF0ZSA+IDAuMCAmJgorICAgICAgICAgIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkdmRlbXV4LT50aW1lX3NlZ21lbnQuc3RvcCkpCisgICAgICAgIGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5wb3NpdGlvbiA9IGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5zdG9wOworICAgICAgZWxzZSBpZiAoZHZkZW11eC0+dGltZV9zZWdtZW50LnJhdGUgPCAwLjApCisgICAgICAgIGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5wb3NpdGlvbiA9IGR2ZGVtdXgtPnRpbWVfc2VnbWVudC5zdGFydDsKKyAgICAgIC8qIHBlcmZvcm0gRU9TIGxvZ2ljICovCisgICAgICBpZiAoZHZkZW11eC0+dGltZV9zZWdtZW50LmZsYWdzICYgR1NUX1NFRUtfRkxBR19TRUdNRU5UKSB7CisgICAgICAgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisgICAgICAgIEdzdEV2ZW50ICpldmVudDsKKworICAgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudF9kb25lIChkdmRlbXV4LT50aW1lX3NlZ21lbnQuZm9ybWF0LAorICAgICAgICAgICAgZHZkZW11eC0+dGltZV9zZWdtZW50LnBvc2l0aW9uKTsKKyAgICAgICAgaWYgKGR2ZGVtdXgtPnNlZ21lbnRfc2VxbnVtKQorICAgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgZHZkZW11eC0+c2VnbWVudF9zZXFudW0pOworCisgICAgICAgIG1lc3NhZ2UgPSBnc3RfbWVzc2FnZV9uZXdfc2VnbWVudF9kb25lIChHU1RfT0JKRUNUX0NBU1QgKGR2ZGVtdXgpLAorICAgICAgICAgICAgZHZkZW11eC0+dGltZV9zZWdtZW50LmZvcm1hdCwgZHZkZW11eC0+dGltZV9zZWdtZW50LnBvc2l0aW9uKTsKKyAgICAgICAgaWYgKGR2ZGVtdXgtPnNlZ21lbnRfc2VxbnVtKQorICAgICAgICAgIGdzdF9tZXNzYWdlX3NldF9zZXFudW0gKG1lc3NhZ2UsIGR2ZGVtdXgtPnNlZ21lbnRfc2VxbnVtKTsKKworICAgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UIChkdmRlbXV4KSwgbWVzc2FnZSk7CisgICAgICAgIGdzdF9kdmRlbXV4X3B1c2hfZXZlbnQgKGR2ZGVtdXgsIGV2ZW50KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdzdEV2ZW50ICpldmVudCA9IGdzdF9ldmVudF9uZXdfZW9zICgpOworICAgICAgICBpZiAoZHZkZW11eC0+c2VnbWVudF9zZXFudW0pCisgICAgICAgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGV2ZW50LCBkdmRlbXV4LT5zZWdtZW50X3NlcW51bSk7CisgICAgICAgIGdzdF9kdmRlbXV4X3B1c2hfZXZlbnQgKGR2ZGVtdXgsIGV2ZW50KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJldCA9PSBHU1RfRkxPV19OT1RfTElOS0VEIHx8IHJldCA8IEdTVF9GTE9XX0VPUykgeworICAgICAgR3N0RXZlbnQgKmV2ZW50ID0gZ3N0X2V2ZW50X25ld19lb3MgKCk7CisgICAgICAvKiBmb3IgZmF0YWwgZXJyb3JzIG9yIG5vdC1saW5rZWQgd2UgcG9zdCBhbiBlcnJvciBtZXNzYWdlICovCisgICAgICBHU1RfRUxFTUVOVF9GTE9XX0VSUk9SIChkdmRlbXV4LCByZXQpOworICAgICAgaWYgKGR2ZGVtdXgtPnNlZ21lbnRfc2VxbnVtKQorICAgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZXZlbnQsIGR2ZGVtdXgtPnNlZ21lbnRfc2VxbnVtKTsKKyAgICAgIGdzdF9kdmRlbXV4X3B1c2hfZXZlbnQgKGR2ZGVtdXgsIGV2ZW50KTsKKyAgICB9CisgICAgZ290byBkb25lOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R2ZGVtdXhfc2lua19hY3RpdmF0ZV9tb2RlIChHc3RQYWQgKiBzaW5rcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UGFkTW9kZSBtb2RlLCBnYm9vbGVhbiBhY3RpdmUpCit7CisgIGdib29sZWFuIHJlczsKKyAgR3N0RFZEZW11eCAqZGVtdXggPSBHU1RfRFZERU1VWCAocGFyZW50KTsKKworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIEdTVF9QQURfTU9ERV9QVUxMOgorICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICBkZW11eC0+c2Vla19oYW5kbGVyID0gZ3N0X2R2ZGVtdXhfaGFuZGxlX3B1bGxfc2VlazsKKyAgICAgICAgcmVzID0gZ3N0X3BhZF9zdGFydF90YXNrIChzaW5rcGFkLAorICAgICAgICAgICAgKEdzdFRhc2tGdW5jdGlvbikgZ3N0X2R2ZGVtdXhfbG9vcCwgc2lua3BhZCwgTlVMTCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkZW11eC0+c2Vla19oYW5kbGVyID0gTlVMTDsKKyAgICAgICAgcmVzID0gZ3N0X3BhZF9zdG9wX3Rhc2sgKHNpbmtwYWQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUEFEX01PREVfUFVTSDoKKyAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJhY3RpdmF0aW5nIHB1c2gvY2hhaW4gZnVuY3Rpb24iKTsKKyAgICAgICAgZGVtdXgtPnNlZWtfaGFuZGxlciA9IGdzdF9kdmRlbXV4X2hhbmRsZV9wdXNoX3NlZWs7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImRlYWN0aXZhdGluZyBwdXNoL2NoYWluIGZ1bmN0aW9uIik7CisgICAgICAgIGRlbXV4LT5zZWVrX2hhbmRsZXIgPSBOVUxMOworICAgICAgfQorICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKKy8qIGRlY2lkZSBvbiBwdXNoIG9yIHB1bGwgYmFzZWQgc2NoZWR1bGluZyAqLworc3RhdGljIGdib29sZWFuCitnc3RfZHZkZW11eF9zaW5rX2FjdGl2YXRlIChHc3RQYWQgKiBzaW5rcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQpCit7CisgIEdzdFF1ZXJ5ICpxdWVyeTsKKyAgZ2Jvb2xlYW4gcHVsbF9tb2RlOworCisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19zY2hlZHVsaW5nICgpOworCisgIGlmICghZ3N0X3BhZF9wZWVyX3F1ZXJ5IChzaW5rcGFkLCBxdWVyeSkpIHsKKyAgICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKyAgICBnb3RvIGFjdGl2YXRlX3B1c2g7CisgIH0KKworICBwdWxsX21vZGUgPSBnc3RfcXVlcnlfaGFzX3NjaGVkdWxpbmdfbW9kZV93aXRoX2ZsYWdzIChxdWVyeSwKKyAgICAgIEdTVF9QQURfTU9ERV9QVUxMLCBHU1RfU0NIRURVTElOR19GTEFHX1NFRUtBQkxFKTsKKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisKKyAgaWYgKCFwdWxsX21vZGUpCisgICAgZ290byBhY3RpdmF0ZV9wdXNoOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmtwYWQsICJhY3RpdmF0aW5nIHB1bGwiKTsKKyAgcmV0dXJuIGdzdF9wYWRfYWN0aXZhdGVfbW9kZSAoc2lua3BhZCwgR1NUX1BBRF9NT0RFX1BVTEwsIFRSVUUpOworCithY3RpdmF0ZV9wdXNoOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2lua3BhZCwgImFjdGl2YXRpbmcgcHVzaCIpOworICAgIHJldHVybiBnc3RfcGFkX2FjdGl2YXRlX21vZGUgKHNpbmtwYWQsIEdTVF9QQURfTU9ERV9QVVNILCBUUlVFKTsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9kdmRlbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdERWRGVtdXggKmR2ZGVtdXggPSBHU1RfRFZERU1VWCAoZWxlbWVudCk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBkdmRlbXV4LT5kZWNvZGVyID0gZHZfZGVjb2Rlcl9uZXcgKDAsIEZBTFNFLCBGQUxTRSk7CisgICAgICBkdl9zZXRfZXJyb3JfbG9nIChkdmRlbXV4LT5kZWNvZGVyLCBOVUxMKTsKKyAgICAgIGdzdF9kdmRlbXV4X3Jlc2V0IChkdmRlbXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUExBWUlORzoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QTEFZSU5HX1RPX1BBVVNFRDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAoZHZkZW11eC0+YWRhcHRlcik7CisgICAgICBkdl9kZWNvZGVyX2ZyZWUgKGR2ZGVtdXgtPmRlY29kZXIpOworICAgICAgZHZkZW11eC0+ZGVjb2RlciA9IE5VTEw7CisKKyAgICAgIGdzdF9kdmRlbXV4X3JlbW92ZV9wYWRzIChkdmRlbXV4KTsKKworICAgICAgaWYgKGR2ZGVtdXgtPnRhZ19ldmVudCkgeworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGR2ZGVtdXgtPnRhZ19ldmVudCk7CisgICAgICAgIGR2ZGVtdXgtPnRhZ19ldmVudCA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgIHsKKyAgICAgIEdzdEV2ZW50ICoqZXZlbnRfcDsKKworICAgICAgZXZlbnRfcCA9ICZkdmRlbXV4LT5zZWVrX2V2ZW50OworICAgICAgZ3N0X2V2ZW50X3JlcGxhY2UgKGV2ZW50X3AsIE5VTEwpOworICAgICAgaWYgKGR2ZGVtdXgtPnBlbmRpbmdfc2VnbWVudCkKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChkdmRlbXV4LT5wZW5kaW5nX3NlZ21lbnQpOworICAgICAgZHZkZW11eC0+cGVuZGluZ19zZWdtZW50ID0gTlVMTDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2V4dC9kdi9nc3RkdmRlbXV4LmggYi9leHQvZHYvZ3N0ZHZkZW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YzkzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZHYvZ3N0ZHZkZW11eC5oCkBAIC0wLDAgKzEsMTAyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX0RWREVNVVhfSF9fCisjZGVmaW5lIF9fR1NUX0RWREVNVVhfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8bGliZHYvZHYuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9EVkRFTVVYIFwKKyAgKGdzdF9kdmRlbXV4X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9EVkRFTVVYKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfRFZERU1VWCxHc3REVkRlbXV4KSkKKyNkZWZpbmUgR1NUX0RWREVNVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfRFZERU1VWCxHc3REVkRlbXV4Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfRFZERU1VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0RWREVNVVgpKQorI2RlZmluZSBHU1RfSVNfRFZERU1VWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9EVkRFTVVYKSkKKworCit0eXBlZGVmIHN0cnVjdCBfR3N0RFZEZW11eCBHc3REVkRlbXV4OwordHlwZWRlZiBzdHJ1Y3QgX0dzdERWRGVtdXhDbGFzcyBHc3REVkRlbXV4Q2xhc3M7CisKK3R5cGVkZWYgZ2Jvb2xlYW4gKCpHc3REVkRlbXV4U2Vla0hhbmRsZXIpIChHc3REVkRlbXV4ICpkZW11eCwgR3N0UGFkICogcGFkLCBHc3RFdmVudCAqIGV2ZW50KTsKKworCitzdHJ1Y3QgX0dzdERWRGVtdXggeworICBHc3RFbGVtZW50ICAgICBlbGVtZW50OworCisgIEdzdFBhZCAgICAgICAgKnNpbmtwYWQ7CisgIEdzdFBhZCAgICAgICAgKnZpZGVvc3JjcGFkOworICBHc3RQYWQgICAgICAgICphdWRpb3NyY3BhZDsKKworICBnYm9vbGVhbiAgICAgICBoYXZlX2dyb3VwX2lkOworICBndWludCAgICAgICAgICBncm91cF9pZDsKKworICBkdl9kZWNvZGVyX3QgICpkZWNvZGVyOworCisgIEdzdEFkYXB0ZXIgICAgKmFkYXB0ZXI7CisgIGdpbnQgICAgICAgICAgIGZyYW1lX2xlbjsKKworICAvKiB2aWRlbyBwYXJhbXMgKi8KKyAgZ2ludCAgICAgICAgICAgZnJhbWVyYXRlX251bWVyYXRvcjsKKyAgZ2ludCAgICAgICAgICAgZnJhbWVyYXRlX2Rlbm9taW5hdG9yOworICBnaW50ICAgICAgICAgICBoZWlnaHQ7CisgIGdib29sZWFuICAgICAgIHdpZGU7CisgIC8qIGF1ZGlvIHBhcmFtcyAqLworICBnaW50ICAgICAgICAgICBmcmVxdWVuY3k7CisgIGdpbnQgICAgICAgICAgIGNoYW5uZWxzOworCisgIGdib29sZWFuICAgICAgIGRpc2NvbnQ7CisgIGdpbnQ2NCAgICAgICAgIGZyYW1lX29mZnNldDsKKyAgZ2ludDY0ICAgICAgICAgYXVkaW9fb2Zmc2V0OworICBnaW50NjQgICAgICAgICB2aWRlb19vZmZzZXQ7CisKKyAgR3N0RFZEZW11eFNlZWtIYW5kbGVyIHNlZWtfaGFuZGxlcjsKKyAgR3N0U2VnbWVudCAgICAgYnl0ZV9zZWdtZW50OworICBnYm9vbGVhbiAgICAgICB1cHN0cmVhbV90aW1lX3NlZ21lbnQ7CisgIEdzdFNlZ21lbnQgICAgIHRpbWVfc2VnbWVudDsKKyAgZ2Jvb2xlYW4gICAgICAgbmVlZF9zZWdtZW50OworICBndWludDMyICAgICAgICBzZWdtZW50X3NlcW51bTsKKyAgZ2Jvb2xlYW4gICAgICAgbmV3X21lZGlhOworICBpbnQgICAgICAgICAgICBmcmFtZXNfc2luY2VfbmV3X21lZGlhOworICAKKyAgZ2ludCAgICAgICAgICAgZm91bmRfaGVhZGVyOyAvKiBBVE9NSUMgKi8KKyAgR3N0RXZlbnQgICAgICAqc2Vla19ldmVudDsKKyAgR3N0RXZlbnQJKnBlbmRpbmdfc2VnbWVudDsKKyAgR3N0RXZlbnQgICAgICAqdGFnX2V2ZW50OworCisgIGdpbnQxNiAgICAgICAgKmF1ZGlvX2J1ZmZlcnNbNF07Cit9OworCitzdHJ1Y3QgX0dzdERWRGVtdXhDbGFzcyB7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfZHZkZW11eF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9EVkRFTVVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L2R2L2dzdHNtcHRldGltZWNvZGUuYyBiL2V4dC9kdi9nc3RzbXB0ZXRpbWVjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIyMDRlYQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9kdi9nc3RzbXB0ZXRpbWVjb2RlLmMKQEAgLTAsMCArMSwyNDAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA5IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgaGFuZGluZyBTTVBURSBUaW1lIENvZGVzLCBhcyBkZXNjcmliZWQgaW4KKyAqIFNNUFRFIFN0YW5kYXJkIDEyTS0xOTk5LgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdHNtcHRldGltZWNvZGUuaCIKKworI2RlZmluZSBOVFNDX0ZSQU1FU19QRVJfMTBfTUlOUyAoMTAqNjAqMzAgLSAxMCoyICsgMikKKyNkZWZpbmUgTlRTQ19GUkFNRVNfUEVSX0hPVVIgKDYqTlRTQ19GUkFNRVNfUEVSXzEwX01JTlMpCisKKy8qKgorICogZ3N0X3NtcHRlX3RpbWVfY29kZV9mcm9tX2ZyYW1lX251bWJlcjoKKyAqIEBzeXN0ZW06IFNNUFRFIFRpbWUgQ29kZSBzeXN0ZW0KKyAqIEB0aW1lX2NvZGU6IHBvaW50ZXIgdG8gdGltZSBjb2RlIHN0cnVjdHVyZQorICogQGZyYW1lX251bWJlcjogaW50ZWdlciBmcmFtZSBudW1iZXIKKyAqCisgKiBDb252ZXJ0cyBhIGZyYW1lIG51bWJlciB0byBhIHRpbWUgY29kZS4KKyAqCisgKiBSZXR1cm5zOiBUUlVFIGlmIHRoZSBjb252ZXJzaW9uIHdhcyBzdWNjZXNzZnVsCisgKi8KK2dib29sZWFuCitnc3Rfc21wdGVfdGltZV9jb2RlX2Zyb21fZnJhbWVfbnVtYmVyIChHc3RTTVBURVRpbWVDb2RlU3lzdGVtIHN5c3RlbSwKKyAgICBHc3RTTVBURVRpbWVDb2RlICogdGltZV9jb2RlLCBpbnQgZnJhbWVfbnVtYmVyKQoreworICBpbnQgdGVuX21pbnM7CisgIGludCBuOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICh0aW1lX2NvZGUgIT0gTlVMTCwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fSVNfVkFMSUQgKHN5c3RlbSksIEZBTFNFKTsKKworICB0aW1lX2NvZGUtPmhvdXJzID0gOTk7CisgIHRpbWVfY29kZS0+bWludXRlcyA9IDk5OworICB0aW1lX2NvZGUtPnNlY29uZHMgPSA5OTsKKyAgdGltZV9jb2RlLT5mcmFtZXMgPSA5OTsKKworICBpZiAoZnJhbWVfbnVtYmVyIDwgMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgc3dpdGNoIChzeXN0ZW0pIHsKKyAgICBjYXNlIEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzMwOgorICAgICAgaWYgKGZyYW1lX251bWJlciA+PSAyNCAqIE5UU0NfRlJBTUVTX1BFUl9IT1VSKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHRlbl9taW5zID0gZnJhbWVfbnVtYmVyIC8gTlRTQ19GUkFNRVNfUEVSXzEwX01JTlM7CisgICAgICBmcmFtZV9udW1iZXIgLT0gdGVuX21pbnMgKiBOVFNDX0ZSQU1FU19QRVJfMTBfTUlOUzsKKworICAgICAgdGltZV9jb2RlLT5ob3VycyA9IHRlbl9taW5zIC8gNjsKKyAgICAgIHRpbWVfY29kZS0+bWludXRlcyA9IDEwICogKHRlbl9taW5zICUgNik7CisKKyAgICAgIGlmIChmcmFtZV9udW1iZXIgPCAyKSB7CisgICAgICAgIC8qIHRyZWF0IHRoZSBmaXJzdCB0d28gZnJhbWVzIG9mIGVhY2ggdGVuIG1pbnV0ZXMgc3BlY2lhbGx5ICovCisgICAgICAgIHRpbWVfY29kZS0+c2Vjb25kcyA9IDA7CisgICAgICAgIHRpbWVfY29kZS0+ZnJhbWVzID0gZnJhbWVfbnVtYmVyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbiA9IChmcmFtZV9udW1iZXIgLSAyKSAvICg2MCAqIDMwIC0gMik7CisgICAgICAgIHRpbWVfY29kZS0+bWludXRlcyArPSBuOworICAgICAgICBmcmFtZV9udW1iZXIgLT0gbiAqICg2MCAqIDMwIC0gMik7CisKKyAgICAgICAgdGltZV9jb2RlLT5zZWNvbmRzID0gZnJhbWVfbnVtYmVyIC8gMzA7CisgICAgICAgIHRpbWVfY29kZS0+ZnJhbWVzID0gZnJhbWVfbnVtYmVyICUgMzA7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzI1OgorICAgICAgaWYgKGZyYW1lX251bWJlciA+PSAyNCAqIDYwICogNjAgKiAyNSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICB0aW1lX2NvZGUtPmZyYW1lcyA9IGZyYW1lX251bWJlciAlIDI1OworICAgICAgZnJhbWVfbnVtYmVyIC89IDI1OworICAgICAgdGltZV9jb2RlLT5zZWNvbmRzID0gZnJhbWVfbnVtYmVyICUgNjA7CisgICAgICBmcmFtZV9udW1iZXIgLz0gNjA7CisgICAgICB0aW1lX2NvZGUtPm1pbnV0ZXMgPSBmcmFtZV9udW1iZXIgJSA2MDsKKyAgICAgIGZyYW1lX251bWJlciAvPSA2MDsKKyAgICAgIHRpbWVfY29kZS0+aG91cnMgPSBmcmFtZV9udW1iZXI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzI0OgorICAgICAgaWYgKGZyYW1lX251bWJlciA+PSAyNCAqIDYwICogNjAgKiAyNCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICB0aW1lX2NvZGUtPmZyYW1lcyA9IGZyYW1lX251bWJlciAlIDI0OworICAgICAgZnJhbWVfbnVtYmVyIC89IDI0OworICAgICAgdGltZV9jb2RlLT5zZWNvbmRzID0gZnJhbWVfbnVtYmVyICUgNjA7CisgICAgICBmcmFtZV9udW1iZXIgLz0gNjA7CisgICAgICB0aW1lX2NvZGUtPm1pbnV0ZXMgPSBmcmFtZV9udW1iZXIgJSA2MDsKKyAgICAgIGZyYW1lX251bWJlciAvPSA2MDsKKyAgICAgIHRpbWVfY29kZS0+aG91cnMgPSBmcmFtZV9udW1iZXI7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIGdzdF9zbXB0ZV90aW1lX2NvZGVfaXNfdmFsaWQ6CisgKiBAc3lzdGVtOiBTTVBURSBUaW1lIENvZGUgc3lzdGVtCisgKiBAdGltZV9jb2RlOiBwb2ludGVyIHRvIHRpbWUgY29kZSBzdHJ1Y3R1cmUKKyAqCisgKiBDaGVja3MgdGhhdCB0aGUgdGltZSBjb2RlIHJlcHJlc2VudHMgYSB2YWxpZCB0aW1lIGNvZGUuCisgKgorICogUmV0dXJuczogVFJVRSBpZiB0aGUgdGltZSBjb2RlIGlzIHZhbGlkCisgKi8KK2dib29sZWFuCitnc3Rfc21wdGVfdGltZV9jb2RlX2lzX3ZhbGlkIChHc3RTTVBURVRpbWVDb2RlU3lzdGVtIHN5c3RlbSwKKyAgICBHc3RTTVBURVRpbWVDb2RlICogdGltZV9jb2RlKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAodGltZV9jb2RlICE9IE5VTEwsIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNX0lTX1ZBTElEIChzeXN0ZW0pLCBGQUxTRSk7CisKKyAgaWYgKHRpbWVfY29kZS0+aG91cnMgPCAwIHx8IHRpbWVfY29kZS0+aG91cnMgPj0gMjQpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAodGltZV9jb2RlLT5taW51dGVzIDwgMCB8fCB0aW1lX2NvZGUtPm1pbnV0ZXMgPj0gNjApCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAodGltZV9jb2RlLT5zZWNvbmRzIDwgMCB8fCB0aW1lX2NvZGUtPnNlY29uZHMgPj0gNjApCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAodGltZV9jb2RlLT5mcmFtZXMgPCAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBzd2l0Y2ggKHN5c3RlbSkgeworICAgIGNhc2UgR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fMzA6CisgICAgICBpZiAodGltZV9jb2RlLT5mcmFtZXMgPj0gMzApCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGlmICh0aW1lX2NvZGUtPmZyYW1lcyA+PSAyIHx8IHRpbWVfY29kZS0+c2Vjb25kcyA+IDApCisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgaWYgKHRpbWVfY29kZS0+bWludXRlcyAlIDEwICE9IDApCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fMjU6CisgICAgICBpZiAodGltZV9jb2RlLT5mcmFtZXMgPj0gMjUpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fMjQ6CisgICAgICBpZiAodGltZV9jb2RlLT5mcmFtZXMgPj0gMjQpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIGdzdF9zbXB0ZV90aW1lX2dldF9mcmFtZV9udW1iZXI6CisgKiBAc3lzdGVtOiBTTVBURSBUaW1lIENvZGUgc3lzdGVtCisgKiBAZnJhbWVfbnVtYmVyOiBwb2ludGVyIHRvIGZyYW1lIG51bWJlcgorICogQHRpbWVfY29kZTogcG9pbnRlciB0byB0aW1lIGNvZGUgc3RydWN0dXJlCisgKgorICogQ29udmVydHMgdGhlIHRpbWUgY29kZSBzdHJ1Y3R1cmUgdG8gYSBsaW5lYXIgZnJhbWUgbnVtYmVyLgorICoKKyAqIFJldHVybnM6IFRSVUUgaWYgdGhlIHRpbWUgY29kZSBjb3VsZCBiZSBjb252ZXJ0ZWQKKyAqLworZ2Jvb2xlYW4KK2dzdF9zbXB0ZV90aW1lX2NvZGVfZ2V0X2ZyYW1lX251bWJlciAoR3N0U01QVEVUaW1lQ29kZVN5c3RlbSBzeXN0ZW0sCisgICAgaW50ICpmcmFtZV9udW1iZXIsIEdzdFNNUFRFVGltZUNvZGUgKiB0aW1lX2NvZGUpCit7CisgIGludCBmcmFtZSA9IDA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNX0lTX1ZBTElEIChzeXN0ZW0pLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICh0aW1lX2NvZGUgIT0gTlVMTCwgRkFMU0UpOworCisgIGlmICghZ3N0X3NtcHRlX3RpbWVfY29kZV9pc192YWxpZCAoc3lzdGVtLCB0aW1lX2NvZGUpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgc3dpdGNoIChzeXN0ZW0pIHsKKyAgICBjYXNlIEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzMwOgorICAgICAgZnJhbWUgPSB0aW1lX2NvZGUtPmhvdXJzICogTlRTQ19GUkFNRVNfUEVSX0hPVVI7CisgICAgICBmcmFtZSArPSAodGltZV9jb2RlLT5taW51dGVzIC8gMTApICogTlRTQ19GUkFNRVNfUEVSXzEwX01JTlM7CisgICAgICBmcmFtZSArPSAodGltZV9jb2RlLT5taW51dGVzICUgMTApICogKDMwICogNjAgLSAyKTsKKyAgICAgIGZyYW1lICs9IHRpbWVfY29kZS0+c2Vjb25kcyAqIDMwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU01QVEVfVElNRV9DT0RFX1NZU1RFTV8yNToKKyAgICAgIHRpbWVfY29kZS0+ZnJhbWVzID0KKyAgICAgICAgICAyNSAqICgodGltZV9jb2RlLT5ob3VycyAqIDYwICsgdGltZV9jb2RlLT5taW51dGVzKSAqIDYwICsKKyAgICAgICAgICB0aW1lX2NvZGUtPnNlY29uZHMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU01QVEVfVElNRV9DT0RFX1NZU1RFTV8yNDoKKyAgICAgIHRpbWVfY29kZS0+ZnJhbWVzID0KKyAgICAgICAgICAyNCAqICgodGltZV9jb2RlLT5ob3VycyAqIDYwICsgdGltZV9jb2RlLT5taW51dGVzKSAqIDYwICsKKyAgICAgICAgICB0aW1lX2NvZGUtPnNlY29uZHMpOworICAgICAgYnJlYWs7CisgIH0KKyAgZnJhbWUgKz0gdGltZV9jb2RlLT5mcmFtZXM7CisKKyAgaWYgKGZyYW1lX251bWJlcikgeworICAgICpmcmFtZV9udW1iZXIgPSBmcmFtZTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIGdzdF9zbXB0ZV90aW1lX2dldF90aW1lc3RhbXA6CisgKiBAc3lzdGVtOiBTTVBURSBUaW1lIENvZGUgc3lzdGVtCisgKiBAdGltZV9jb2RlOiBwb2ludGVyIHRvIHRpbWUgY29kZSBzdHJ1Y3R1cmUKKyAqCisgKiBDb252ZXJ0cyB0aGUgdGltZSBjb2RlIHN0cnVjdHVyZSB0byBhIHRpbWVzdGFtcC4KKyAqCisgKiBSZXR1cm5zOiBUaW1lIHN0YW1wIGZvciB0aW1lIGNvZGUsIG9yIEdTVF9DTE9DS19USU1FX05PTkUgaWYgdGltZQorICogICBjb2RlIGlzIGludmFsaWQuCisgKi8KK0dzdENsb2NrVGltZQorZ3N0X3NtcHRlX3RpbWVfY29kZV9nZXRfdGltZXN0YW1wIChHc3RTTVBURVRpbWVDb2RlU3lzdGVtIHN5c3RlbSwKKyAgICBHc3RTTVBURVRpbWVDb2RlICogdGltZV9jb2RlKQoreworICBpbnQgZnJhbWVfbnVtYmVyOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfU01QVEVfVElNRV9DT0RFX1NZU1RFTV9JU19WQUxJRCAoc3lzdGVtKSwKKyAgICAgIEdTVF9DTE9DS19USU1FX05PTkUpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAodGltZV9jb2RlICE9IE5VTEwsIEdTVF9DTE9DS19USU1FX05PTkUpOworCisgIGlmIChnc3Rfc21wdGVfdGltZV9jb2RlX2dldF9mcmFtZV9udW1iZXIgKHN5c3RlbSwgJmZyYW1lX251bWJlciwgdGltZV9jb2RlKSkgeworICAgIHN0YXRpYyBjb25zdCBpbnQgZnJhbWVyYXRlX25bM10gPSB7IDMwMDAsIDI1LCAyNCB9OworICAgIHN0YXRpYyBjb25zdCBpbnQgZnJhbWVyYXRlX2RbM10gPSB7IDEwMDEsIDEsIDEgfTsKKworICAgIHJldHVybiBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGZyYW1lX251bWJlciwKKyAgICAgICAgR1NUX1NFQ09ORCAqIGZyYW1lcmF0ZV9kW3N5c3RlbV0sIGZyYW1lcmF0ZV9uW3N5c3RlbV0pOworICB9CisKKyAgcmV0dXJuIEdTVF9DTE9DS19USU1FX05PTkU7Cit9CmRpZmYgLS1naXQgYS9leHQvZHYvZ3N0c21wdGV0aW1lY29kZS5oIGIvZXh0L2R2L2dzdHNtcHRldGltZWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDQyMDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2R2L2dzdHNtcHRldGltZWNvZGUuaApAQCAtMCwwICsxLDcwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOSBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9HU1RfU01QVEVfVElNRV9DT0RFX0hfCisjZGVmaW5lIF9HU1RfU01QVEVfVElNRV9DT0RFX0hfCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK0dfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNNUFRFVGltZUNvZGUgR3N0U01QVEVUaW1lQ29kZTsKKworLyoqCisgKiBHc3RTTVBURVRpbWVDb2RlOgorICogQEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzMwOiAyOS45NyBmcmFtZSBwZXIgc2Vjb25kIHN5c3RlbSAoTlRTQykKKyAqIEBHU1RfU01QVEVfVElNRV9DT0RFX1NZU1RFTV8yNTogMjUgZnJhbWUgcGVyIHNlY29uZCBzeXN0ZW0gKFBBTCkKKyAqIEBHU1RfU01QVEVfVElNRV9DT0RFX1NZU1RFTV8yNDogMjQgZnJhbWUgcGVyIHNlY29uZCBzeXN0ZW0KKyAqCisgKiBFbnVtIHZhbHVlIHJlcHJlc2VudGluZyBTTVBURSBUaW1lIENvZGUgc3lzdGVtLgorICovCit0eXBlZGVmIGVudW0geworICBHU1RfU01QVEVfVElNRV9DT0RFX1NZU1RFTV8zMCA9IDAsCisgIEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzI1LAorICBHU1RfU01QVEVfVElNRV9DT0RFX1NZU1RFTV8yNAorfSBHc3RTTVBURVRpbWVDb2RlU3lzdGVtOworCitzdHJ1Y3QgX0dzdFNNUFRFVGltZUNvZGUgeworICBpbnQgaG91cnM7CisgIGludCBtaW51dGVzOworICBpbnQgc2Vjb25kczsKKyAgaW50IGZyYW1lczsKK307CisKKyNkZWZpbmUgR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fSVNfVkFMSUQoeCkgXAorICAoKHgpID49IEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzMwICYmICh4KSA8PSBHU1RfU01QVEVfVElNRV9DT0RFX1NZU1RFTV8yNCkKKworI2RlZmluZSBHU1RfU01QVEVfVElNRV9DT0RFX0ZPUk1BVCAiMDJkOiUwMmQ6JTAyZDolMDJkIgorI2RlZmluZSBHU1RfU01QVEVfVElNRV9DT0RFX0FSR1ModGltZWNvZGUpIFwKKyAgKHRpbWVjb2RlKS0+aG91cnMsICh0aW1lY29kZSktPm1pbnV0ZXMsIFwKKyAgKHRpbWVjb2RlKS0+c2Vjb25kcywgKHRpbWVjb2RlKS0+ZnJhbWVzCisKK2dib29sZWFuIGdzdF9zbXB0ZV90aW1lX2NvZGVfaXNfdmFsaWQgKEdzdFNNUFRFVGltZUNvZGVTeXN0ZW0gc3lzdGVtLAorICAgIEdzdFNNUFRFVGltZUNvZGUgKnRpbWVfY29kZSk7CitnYm9vbGVhbiBnc3Rfc21wdGVfdGltZV9jb2RlX2Zyb21fZnJhbWVfbnVtYmVyIChHc3RTTVBURVRpbWVDb2RlU3lzdGVtIHN5c3RlbSwKKyAgICBHc3RTTVBURVRpbWVDb2RlICp0aW1lX2NvZGUsIGludCBmcmFtZV9udW1iZXIpOworZ2Jvb2xlYW4gZ3N0X3NtcHRlX3RpbWVfY29kZV9nZXRfZnJhbWVfbnVtYmVyIChHc3RTTVBURVRpbWVDb2RlU3lzdGVtIHN5c3RlbSwKKyAgICBpbnQgKmZyYW1lX251bWJlciwgR3N0U01QVEVUaW1lQ29kZSAqdGltZV9jb2RlKTsKK0dzdENsb2NrVGltZSBnc3Rfc21wdGVfdGltZV9jb2RlX2dldF90aW1lc3RhbXAgKEdzdFNNUFRFVGltZUNvZGVTeXN0ZW0gc3lzdGVtLAorICAgIEdzdFNNUFRFVGltZUNvZGUgKnRpbWVfY29kZSk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9leHQvZHYvbWVzb24uYnVpbGQgYi9leHQvZHYvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwYWEwOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9kdi9tZXNvbi5idWlsZApAQCAtMCwwICsxLDI1IEBACitkdl9zb3VyY2VzID0gWworICAnZ3N0ZHYuYycsCisgICdnc3RkdmRlYy5jJywKKyAgJ2dzdGR2ZGVtdXguYycsCisgICdnc3RzbXB0ZXRpbWVjb2RlLmMnLAorICAnc21wdGVfdGVzdC5jJywKK10KKworZHZfZGVwID0gZGVwZW5kZW5jeSgnbGliZHYnLCB2ZXJzaW9uIDogJz49IDAuMTAwJywgcmVxdWlyZWQgOiBmYWxzZSkKKworaWYgZHZfZGVwLmZvdW5kKCkKKyAgZ3N0ZHYgPSBsaWJyYXJ5KCdnc3RkdicsCisgICAgZHZfc291cmNlcywKKyAgICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICAgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0dGFnX2RlcCwgZ3N0YXVkaW9fZGVwLCBnc3R2aWRlb19kZXAsIGR2X2RlcF0sCisgICAgaW5zdGFsbCA6IHRydWUsCisgICAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorICApCisKKyAgI2V4ZWN1dGFibGUoJ3NtcHRlX3Rlc3QnLAorICAjICAnc21wdGVfdGVzdC5jJywgJ2dzdHNtcHRldGltZWNvZGUuYycsCisgICMgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0dGFnX2RlcCwgZ3N0YXVkaW9fZGVwLCBnc3R2aWRlb19kZXAsIGR2X2RlcF0sCisgICMgIGluc3RhbGwgOiBmYWxzZSkKK2VuZGlmCmRpZmYgLS1naXQgYS9leHQvZHYvc21wdGVfdGVzdC5jIGIvZXh0L2R2L3NtcHRlX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTgxMTNjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2R2L3NtcHRlX3Rlc3QuYwpAQCAtMCwwICsxLDgxIEBACisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgImdzdHNtcHRldGltZWNvZGUuaCIKKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2RlZmluZSBOVFNDX0ZSQU1FU19QRVJfMTBfTUlOUyAoMTAqNjAqMzAgLSAxMCoyICsgMikKKyNkZWZpbmUgTlRTQ19GUkFNRVNfUEVSX0hPVVIgKDYqTlRTQ19GUkFNRVNfUEVSXzEwX01JTlMpCisKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBHc3RTTVBURVRpbWVDb2RlIHRjOworICBpbnQgaTsKKyAgaW50IG1pbjsKKworICBmb3IgKG1pbiA9IDA7IG1pbiA8IDM7IG1pbisrKSB7CisgICAgZ19wcmludCAoIi0tLSBtaW51dGUgJWQgLS0tXG4iLCBtaW4pOworICAgIGZvciAoaSA9IG1pbiAqIDYwICogMzAgLSA1OyBpIDw9IG1pbiAqIDYwICogMzAgKyA1OyBpKyspIHsKKyAgICAgIGdzdF9zbXB0ZV90aW1lX2NvZGVfZnJvbV9mcmFtZV9udW1iZXIgKEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzMwLCAmdGMsCisgICAgICAgICAgaSk7CisgICAgICBnX3ByaW50ICgiJWQgJTAyZDolMDJkOiUwMmQ6JTAyZFxuIiwgaSwgdGMuaG91cnMsIHRjLm1pbnV0ZXMsIHRjLnNlY29uZHMsCisgICAgICAgICAgdGMuZnJhbWVzKTsKKyAgICB9CisgIH0KKworICBmb3IgKG1pbiA9IDk7IG1pbiA8IDEyOyBtaW4rKykgeworICAgIGdfcHJpbnQgKCItLS0gbWludXRlICVkIC0tLVxuIiwgbWluKTsKKyAgICBmb3IgKGkgPSBtaW4gKiA2MCAqIDMwIC0gNSAtIDE4OyBpIDw9IG1pbiAqIDYwICogMzAgKyA1IC0gMTg7IGkrKykgeworICAgICAgZ3N0X3NtcHRlX3RpbWVfY29kZV9mcm9tX2ZyYW1lX251bWJlciAoR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fMzAsICZ0YywKKyAgICAgICAgICBpKTsKKyAgICAgIGdfcHJpbnQgKCIlZCAlMDJkOiUwMmQ6JTAyZDolMDJkXG4iLCBpLCB0Yy5ob3VycywgdGMubWludXRlcywgdGMuc2Vjb25kcywKKyAgICAgICAgICB0Yy5mcmFtZXMpOworICAgIH0KKyAgfQorCisgIGZvciAobWluID0gLTE7IG1pbiA8IDI7IG1pbisrKSB7CisgICAgaW50IG9mZnNldCA9IE5UU0NfRlJBTUVTX1BFUl9IT1VSOworCisgICAgZ19wcmludCAoIi0tLSBtaW51dGUgJWQgLS0tXG4iLCBtaW4pOworICAgIGZvciAoaSA9IG9mZnNldCArIG1pbiAqIDYwICogMzAgLSA1OyBpIDw9IG9mZnNldCArIG1pbiAqIDYwICogMzAgKyA1OyBpKyspIHsKKyAgICAgIGdzdF9zbXB0ZV90aW1lX2NvZGVfZnJvbV9mcmFtZV9udW1iZXIgKEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzMwLCAmdGMsCisgICAgICAgICAgaSk7CisgICAgICBnX3ByaW50ICgiJWQgJTAyZDolMDJkOiUwMmQ6JTAyZFxuIiwgaSwgdGMuaG91cnMsIHRjLm1pbnV0ZXMsIHRjLnNlY29uZHMsCisgICAgICAgICAgdGMuZnJhbWVzKTsKKyAgICB9CisgIH0KKworICBmb3IgKG1pbiA9IDA7IG1pbiA8IDE7IG1pbisrKSB7CisgICAgaW50IG9mZnNldCA9IE5UU0NfRlJBTUVTX1BFUl9IT1VSOworCisgICAgZ19wcmludCAoIi0tLSBtaW51dGUgJWQgLS0tXG4iLCBtaW4pOworICAgIGZvciAoaSA9IDI0ICogb2Zmc2V0IC0gNTsgaSA8PSAyNCAqIG9mZnNldCArIDU7IGkrKykgeworICAgICAgZ3N0X3NtcHRlX3RpbWVfY29kZV9mcm9tX2ZyYW1lX251bWJlciAoR1NUX1NNUFRFX1RJTUVfQ09ERV9TWVNURU1fMzAsICZ0YywKKyAgICAgICAgICBpKTsKKyAgICAgIGdfcHJpbnQgKCIlZCAlMDJkOiUwMmQ6JTAyZDolMDJkXG4iLCBpLCB0Yy5ob3VycywgdGMubWludXRlcywgdGMuc2Vjb25kcywKKyAgICAgICAgICB0Yy5mcmFtZXMpOworICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCAyNCAqIE5UU0NfRlJBTUVTX1BFUl9IT1VSOyBpKyspIHsKKyAgICBpbnQgZm47CisgICAgaW50IHJldDsKKworICAgIGdzdF9zbXB0ZV90aW1lX2NvZGVfZnJvbV9mcmFtZV9udW1iZXIgKEdTVF9TTVBURV9USU1FX0NPREVfU1lTVEVNXzMwLCAmdGMsCisgICAgICAgIGkpOworCisgICAgcmV0ID0gZ3N0X3NtcHRlX3RpbWVfY29kZV9nZXRfZnJhbWVfbnVtYmVyIChHU1RfU01QVEVfVElNRV9DT0RFX1NZU1RFTV8zMCwKKyAgICAgICAgJmZuLCAmdGMpOworICAgIGlmICghcmV0KSB7CisgICAgICBnX3ByaW50ICgiYmFkIHZhbGlkIGF0ICVkXG4iLCBpKTsKKyAgICB9CisgICAgaWYgKGZuICE9IGkpIHsKKyAgICAgIGdfcHJpbnQgKCJpbmRleCBtaXNtYXRjaCAlZCAhPSAlZFxuIiwgZm4sIGkpOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZXh0L2ZsYWMvTWFrZWZpbGUuYW0gYi9leHQvZmxhYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQ5NTVjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2ZsYWMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMiBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0ZmxhYy5sYQorCitsaWJnc3RmbGFjX2xhX1NPVVJDRVMgPSBnc3RmbGFjLmMgZ3N0ZmxhY2RlYy5jIGdzdGZsYWNlbmMuYyBnc3RmbGFjdGFnLmMKK2xpYmdzdGZsYWNfbGFfQ0ZMQUdTID0gLURHU1RfVVNFX1VOU1RBQkxFX0FQSSBcCisJJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgJChGTEFDX0NGTEFHUykKK2xpYmdzdGZsYWNfbGFfTElCQUREID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHRhZy0kKEdTVF9BUElfVkVSU0lPTikgXAorCS1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoRkxBQ19MSUJTKQorbGliZ3N0ZmxhY19sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0ZmxhY2VuYy5oIGdzdGZsYWNkZWMuaCBnc3RmbGFjdGFnLmgKZGlmZiAtLWdpdCBhL2V4dC9mbGFjL2dzdGZsYWMuYyBiL2V4dC9mbGFjL2dzdGZsYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjg4YjJhCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2ZsYWMvZ3N0ZmxhYy5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RmbGFjZW5jLmgiCisjaW5jbHVkZSAiZ3N0ZmxhY2RlYy5oIgorI2luY2x1ZGUgImdzdGZsYWN0YWcuaCIKKworI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC1pMThuLXBsdWdpbi5oPgorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisjaWZkZWYgRU5BQkxFX05MUworICBHU1RfREVCVUcgKCJiaW5kaW5nIHRleHQgZG9tYWluICVzIHRvIGxvY2FsZSBkaXIgJXMiLCBHRVRURVhUX1BBQ0tBR0UsCisgICAgICBMT0NBTEVESVIpOworICBiaW5kdGV4dGRvbWFpbiAoR0VUVEVYVF9QQUNLQUdFLCBMT0NBTEVESVIpOworICBiaW5kX3RleHRkb21haW5fY29kZXNldCAoR0VUVEVYVF9QQUNLQUdFLCAiVVRGLTgiKTsKKyNlbmRpZgorCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImZsYWNlbmMiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX0ZMQUNfRU5DKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImZsYWNkZWMiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX0ZMQUNfREVDKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImZsYWN0YWciLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIGdzdF9mbGFjX3RhZ19nZXRfdHlwZSAoKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGdzdF90YWdfcmVnaXN0ZXJfbXVzaWNicmFpbnpfdGFncyAoKTsKKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGZsYWMsCisgICAgIlRoZSBGTEFDIExvc3NsZXNzIGNvbXByZXNzb3IgQ29kZWMiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2V4dC9mbGFjL2dzdGZsYWNkZWMuYyBiL2V4dC9mbGFjL2dzdGZsYWNkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWYxOWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jCkBAIC0wLDAgKzEsODE2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2LDIwMTE+IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBKYW4gU2NobWlkdCA8dGhheXRhbiBhdCBtYWQgc2NpZW50aXN0IGNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1mbGFjZGVjCisgKiBAc2VlX2Fsc286ICNHc3RGbGFjRW5jCisgKgorICogZmxhY2RlYyBkZWNvZGVzIEZMQUMgc3RyZWFtcy4KKyAqIDx1bGluayB1cmw9Imh0dHA6Ly9mbGFjLnNvdXJjZWZvcmdlLm5ldC8iPkZMQUM8L3VsaW5rPgorICogaXMgYSBGcmVlIExvc3NsZXNzIEF1ZGlvIENvZGVjLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPW1lZGlhL3NtYWxsL2RhcmsuNDQxLTE2LXMuZmxhYyAhIGZsYWNwYXJzZSAhIGZsYWNkZWMgISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgYXV0b2F1ZGlvc2luaworICogXXwKKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBzb3VwaHR0cHNyYyBsb2NhdGlvbj1odHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9tZWRpYS9zbWFsbC9kYXJrLjQ0MS0xNi1zLmZsYWMgISBmbGFjcGFyc2UgISBmbGFjZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIHF1ZXVlIG1pbi10aHJlc2hvbGQtYnVmZmVycz0xMCAhIGF1dG9hdWRpb3NpbmsKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0ZmxhY2RlYy5oIgorI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorCisvKiBUYWtlbiBmcm9tIGh0dHA6Ly9mbGFjLnNvdXJjZWZvcmdlLm5ldC9mb3JtYXQuaHRtbCNmcmFtZV9oZWFkZXIgKi8KK3N0YXRpYyBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBjaGFubmVsX3Bvc2l0aW9uc1s4XVs4XSA9IHsKKyAge0dTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX01PTk99LAorICB7R1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUfSwgeworICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUn0sIHsKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFR9LCB7CisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFR9LCB7CisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0xGRTEsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFR9LAorICAvKiBGSVhNRTogNy84IGNoYW5uZWwgbGF5b3V0cyBhcmUgbm90IGRlZmluZWQgaW4gdGhlIEZMQUMgc3BlY3MgKi8KKyAgeworICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0xGRTEsCisgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0NFTlRFUn0sIHsKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSLAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxLAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQsCisgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hUfQorfTsKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZmxhY2RlY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBmbGFjZGVjX2RlYnVnCisKK3N0YXRpYyBGTEFDX19TdHJlYW1EZWNvZGVyUmVhZFN0YXR1cworZ3N0X2ZsYWNfZGVjX3JlYWRfc3RyZWFtIChjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogZGVjb2RlciwKKyAgICBGTEFDX19ieXRlIGJ1ZmZlcltdLCBzaXplX3QgKiBieXRlcywgdm9pZCAqY2xpZW50X2RhdGEpOworc3RhdGljIEZMQUNfX1N0cmVhbURlY29kZXJXcml0ZVN0YXR1cworZ3N0X2ZsYWNfZGVjX3dyaXRlX3N0cmVhbSAoY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIGRlY29kZXIsCisgICAgY29uc3QgRkxBQ19fRnJhbWUgKiBmcmFtZSwKKyAgICBjb25zdCBGTEFDX19pbnQzMiAqIGNvbnN0IGJ1ZmZlcltdLCB2b2lkICpjbGllbnRfZGF0YSk7CitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbGFjX2RlY19oYW5kbGVfZGVjb2Rlcl9lcnJvciAoR3N0RmxhY0RlYyAqIGRlYywgZ2Jvb2xlYW4gbXNnKTsKK3N0YXRpYyB2b2lkIGdzdF9mbGFjX2RlY19tZXRhZGF0YV9jYiAoY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqCisgICAgZGVjb2RlciwgY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGEgKiBtZXRhZGF0YSwgdm9pZCAqY2xpZW50X2RhdGEpOworc3RhdGljIHZvaWQgZ3N0X2ZsYWNfZGVjX2Vycm9yX2NiIChjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICoKKyAgICBkZWNvZGVyLCBGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMgc3RhdHVzLCB2b2lkICpjbGllbnRfZGF0YSk7CisKK3N0YXRpYyB2b2lkIGdzdF9mbGFjX2RlY19mbHVzaCAoR3N0QXVkaW9EZWNvZGVyICogYXVkaW9fZGVjLCBnYm9vbGVhbiBoYXJkKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZmxhY19kZWNfc2V0X2Zvcm1hdCAoR3N0QXVkaW9EZWNvZGVyICogZGVjLCBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ZsYWNfZGVjX3N0YXJ0IChHc3RBdWRpb0RlY29kZXIgKiBkZWMpOworc3RhdGljIGdib29sZWFuIGdzdF9mbGFjX2RlY19zdG9wIChHc3RBdWRpb0RlY29kZXIgKiBkZWMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2ZsYWNfZGVjX2hhbmRsZV9mcmFtZSAoR3N0QXVkaW9EZWNvZGVyICogYXVkaW9fZGVjLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK0dfREVGSU5FX1RZUEUgKEdzdEZsYWNEZWMsIGdzdF9mbGFjX2RlYywgR1NUX1RZUEVfQVVESU9fREVDT0RFUik7CisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIEZPUk1BVFMgInsgUzgsIFMxNkxFLCBTMjRfMzJMRSwgUzMyTEUgfSAiCisjZWxzZQorI2RlZmluZSBGT1JNQVRTICJ7IFM4LCBTMTZCRSwgUzI0XzMyQkUsIFMzMkJFIH0gIgorI2VuZGlmCisKKyNkZWZpbmUgR1NUX0ZMQUNfREVDX1NSQ19DQVBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImF1ZGlvL3gtcmF3LCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEZPUk1BVFMgIiwgIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJhdGUgPSAoaW50KSBbIDEsIDY1NTM1MCBdLCAiICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgOCBdIgorCisjZGVmaW5lIEdTVF9GTEFDX0RFQ19TSU5LX0NBUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJhdWRpby94LWZsYWMsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZnJhbWVkID0gKGJvb2xlYW4pIHRydWUsICIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJhdGUgPSAoaW50KSBbIDEsIDY1NTM1MCBdLCAiICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgOCBdIgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZmxhY19kZWNfc3JjX2ZhY3RvcnkgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX0ZMQUNfREVDX1NSQ19DQVBTKSk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZmxhY19kZWNfc2lua19mYWN0b3J5ID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX0ZMQUNfREVDX1NJTktfQ0FQUykpOworCitzdGF0aWMgdm9pZAorZ3N0X2ZsYWNfZGVjX2NsYXNzX2luaXQgKEdzdEZsYWNEZWNDbGFzcyAqIGtsYXNzKQoreworICBHc3RBdWRpb0RlY29kZXJDbGFzcyAqYXVkaW9kZWNvZGVyX2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisKKyAgYXVkaW9kZWNvZGVyX2NsYXNzID0gKEdzdEF1ZGlvRGVjb2RlckNsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZmxhY2RlY19kZWJ1ZywgImZsYWNkZWMiLCAwLCAiZmxhYyBkZWNvZGVyIik7CisKKyAgYXVkaW9kZWNvZGVyX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbGFjX2RlY19zdG9wKTsKKyAgYXVkaW9kZWNvZGVyX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmxhY19kZWNfc3RhcnQpOworICBhdWRpb2RlY29kZXJfY2xhc3MtPmZsdXNoID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbGFjX2RlY19mbHVzaCk7CisgIGF1ZGlvZGVjb2Rlcl9jbGFzcy0+c2V0X2Zvcm1hdCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmxhY19kZWNfc2V0X2Zvcm1hdCk7CisgIGF1ZGlvZGVjb2Rlcl9jbGFzcy0+aGFuZGxlX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmxhY19kZWNfaGFuZGxlX2ZyYW1lKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZmbGFjX2RlY19zcmNfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmZsYWNfZGVjX3NpbmtfZmFjdG9yeSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkZMQUMgYXVkaW8gZGVjb2RlciIsCisgICAgICAiQ29kZWMvRGVjb2Rlci9BdWRpbyIsICJEZWNvZGVzIEZMQUMgbG9zc2xlc3MgYXVkaW8gc3RyZWFtcyIsCisgICAgICAiVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLm5ldD4sICIKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2ZsYWNfZGVjX2luaXQgKEdzdEZsYWNEZWMgKiBmbGFjZGVjKQoreworICBmbGFjZGVjLT5kb19yZXN5bmMgPSBGQUxTRTsKKyAgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X25lZWRzX2Zvcm1hdCAoR1NUX0FVRElPX0RFQ09ERVIgKGZsYWNkZWMpLCBUUlVFKTsKKyAgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X3VzZV9kZWZhdWx0X3BhZF9hY2NlcHRjYXBzIChHU1RfQVVESU9fREVDT0RFUl9DQVNUCisgICAgICAoZmxhY2RlYyksIFRSVUUpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9BVURJT19ERUNPREVSX1NJTktfUEFEIChmbGFjZGVjKSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ZsYWNfZGVjX3N0YXJ0IChHc3RBdWRpb0RlY29kZXIgKiBhdWRpb19kZWMpCit7CisgIEZMQUNfX1N0cmVhbURlY29kZXJJbml0U3RhdHVzIHM7CisgIEdzdEZsYWNEZWMgKmRlYzsKKworICBkZWMgPSBHU1RfRkxBQ19ERUMgKGF1ZGlvX2RlYyk7CisKKyAgZGVjLT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworCisgIGRlYy0+ZGVjb2RlciA9IEZMQUNfX3N0cmVhbV9kZWNvZGVyX25ldyAoKTsKKworICBnc3RfYXVkaW9faW5mb19pbml0ICgmZGVjLT5pbmZvKTsKKyAgZGVjLT5kZXB0aCA9IDA7CisKKyAgLyogbm8gcG9pbnQgY2FsY3VsYXRpbmcgTUQ1IHNpbmNlIGl0J3MgbmV2ZXIgY2hlY2tlZCBoZXJlICovCisgIEZMQUNfX3N0cmVhbV9kZWNvZGVyX3NldF9tZDVfY2hlY2tpbmcgKGRlYy0+ZGVjb2RlciwgZmFsc2UpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgImluaXRpYWxpemluZyBkZWNvZGVyIik7CisgIHMgPSBGTEFDX19zdHJlYW1fZGVjb2Rlcl9pbml0X3N0cmVhbSAoZGVjLT5kZWNvZGVyLAorICAgICAgZ3N0X2ZsYWNfZGVjX3JlYWRfc3RyZWFtLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgZ3N0X2ZsYWNfZGVjX3dyaXRlX3N0cmVhbSwgZ3N0X2ZsYWNfZGVjX21ldGFkYXRhX2NiLAorICAgICAgZ3N0X2ZsYWNfZGVjX2Vycm9yX2NiLCBkZWMpOworCisgIGlmIChzICE9IEZMQUNfX1NUUkVBTV9ERUNPREVSX0lOSVRfU1RBVFVTX09LKSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKEdTVF9FTEVNRU5UIChkZWMpLCBMSUJSQVJZLCBJTklULCAoTlVMTCksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgZGVjLT5nb3RfaGVhZGVycyA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbGFjX2RlY19zdG9wIChHc3RBdWRpb0RlY29kZXIgKiBkZWMpCit7CisgIEdzdEZsYWNEZWMgKmZsYWNkZWMgPSBHU1RfRkxBQ19ERUMgKGRlYyk7CisKKyAgaWYgKGZsYWNkZWMtPmRlY29kZXIpIHsKKyAgICBGTEFDX19zdHJlYW1fZGVjb2Rlcl9kZWxldGUgKGZsYWNkZWMtPmRlY29kZXIpOworICAgIGZsYWNkZWMtPmRlY29kZXIgPSBOVUxMOworICB9CisKKyAgaWYgKGZsYWNkZWMtPmFkYXB0ZXIpIHsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAoZmxhY2RlYy0+YWRhcHRlcik7CisgICAgZ19vYmplY3RfdW5yZWYgKGZsYWNkZWMtPmFkYXB0ZXIpOworICAgIGZsYWNkZWMtPmFkYXB0ZXIgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ZsYWNfZGVjX3NldF9mb3JtYXQgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywgR3N0Q2FwcyAqIGNhcHMpCit7CisgIGNvbnN0IEdWYWx1ZSAqaGVhZGVyczsKKyAgR3N0RmxhY0RlYyAqZmxhY2RlYzsKKyAgR3N0U3RydWN0dXJlICpzOworICBndWludCBpLCBudW07CisKKyAgZmxhY2RlYyA9IEdTVF9GTEFDX0RFQyAoZGVjKTsKKworICBHU1RfTE9HX09CSkVDVCAoZGVjLCAic2luayBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBoZWFkZXJzID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJzdHJlYW1oZWFkZXIiKTsKKyAgaWYgKGhlYWRlcnMgPT0gTlVMTCB8fCAhR1NUX1ZBTFVFX0hPTERTX0FSUkFZIChoZWFkZXJzKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVjLCAibm8gJ3N0cmVhbWhlYWRlcicgZmllbGQgaW4gaW5wdXQgY2FwcywgdHJ5ICIKKyAgICAgICAgImFkZGluZyBhIGZsYWNwYXJzZSBlbGVtZW50IHVwc3RyZWFtIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoZmxhY2RlYy0+YWRhcHRlcikgPiAwKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZWMsICJ1bmV4cGVjdGVkIGRhdGEgbGVmdCBpbiBhZGFwdGVyIik7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGZsYWNkZWMtPmFkYXB0ZXIpOworICB9CisKKyAgbnVtID0gZ3N0X3ZhbHVlX2FycmF5X2dldF9zaXplIChoZWFkZXJzKTsKKyAgZm9yIChpID0gMDsgaSA8IG51bTsgKytpKSB7CisgICAgY29uc3QgR1ZhbHVlICpoZWFkZXJfdmFsOworICAgIEdzdEJ1ZmZlciAqaGVhZGVyX2J1ZjsKKworICAgIGhlYWRlcl92YWwgPSBnc3RfdmFsdWVfYXJyYXlfZ2V0X3ZhbHVlIChoZWFkZXJzLCBpKTsKKyAgICBpZiAoaGVhZGVyX3ZhbCA9PSBOVUxMIHx8ICFHU1RfVkFMVUVfSE9MRFNfQlVGRkVSIChoZWFkZXJfdmFsKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGhlYWRlcl9idWYgPSBnX3ZhbHVlX2R1cF9ib3hlZCAoaGVhZGVyX3ZhbCk7CisgICAgR1NUX0lORk9fT0JKRUNUIChkZWMsICJwdXNoaW5nIGhlYWRlciBidWZmZXIgb2YgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyAiCisgICAgICAgICJpbnRvIGFkYXB0ZXIiLCBnc3RfYnVmZmVyX2dldF9zaXplIChoZWFkZXJfYnVmKSk7CisgICAgZ3N0X2FkYXB0ZXJfcHVzaCAoZmxhY2RlYy0+YWRhcHRlciwgaGVhZGVyX2J1Zik7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChkZWMsICJQcm9jZXNzaW5nIGhlYWRlcnMgYW5kIG1ldGFkYXRhIik7CisgIGlmICghRkxBQ19fc3RyZWFtX2RlY29kZXJfcHJvY2Vzc191bnRpbF9lbmRfb2ZfbWV0YWRhdGEgKGZsYWNkZWMtPmRlY29kZXIpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZWMsICJwcm9jZXNzX3VudGlsX2VuZF9vZl9tZXRhZGF0YSBmYWlsZWQiKTsKKyAgICBpZiAoRkxBQ19fc3RyZWFtX2RlY29kZXJfZ2V0X3N0YXRlIChmbGFjZGVjLT5kZWNvZGVyKSA9PQorICAgICAgICBGTEFDX19TVFJFQU1fREVDT0RFUl9BQk9SVEVEKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGZsYWNkZWMsICJSZWFkIGNhbGxiYWNrIGNhdXNlZCBpbnRlcm5hbCBhYm9ydCIpOworICAgICAgLyogYWxsb3cgcmVjb3ZlcnkgKi8KKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChmbGFjZGVjLT5hZGFwdGVyKTsKKyAgICAgIEZMQUNfX3N0cmVhbV9kZWNvZGVyX2ZsdXNoIChmbGFjZGVjLT5kZWNvZGVyKTsKKyAgICAgIGdzdF9mbGFjX2RlY19oYW5kbGVfZGVjb2Rlcl9lcnJvciAoZmxhY2RlYywgVFJVRSk7CisgICAgfQorICB9CisgIEdTVF9JTkZPX09CSkVDVCAoZGVjLCAiaGVhZGVycyBhbmQgbWV0YWRhdGEgYXJlIG5vdyBwcm9jZXNzZWQiKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIENSQy04LCBwb2x5ID0geF44ICsgeF4yICsgeF4xICsgeF4wLCBpbml0ID0gMCAqLworc3RhdGljIGNvbnN0IGd1aW50OCBjcmM4X3RhYmxlWzI1Nl0gPSB7CisgIDB4MDAsIDB4MDcsIDB4MEUsIDB4MDksIDB4MUMsIDB4MUIsIDB4MTIsIDB4MTUsCisgIDB4MzgsIDB4M0YsIDB4MzYsIDB4MzEsIDB4MjQsIDB4MjMsIDB4MkEsIDB4MkQsCisgIDB4NzAsIDB4NzcsIDB4N0UsIDB4NzksIDB4NkMsIDB4NkIsIDB4NjIsIDB4NjUsCisgIDB4NDgsIDB4NEYsIDB4NDYsIDB4NDEsIDB4NTQsIDB4NTMsIDB4NUEsIDB4NUQsCisgIDB4RTAsIDB4RTcsIDB4RUUsIDB4RTksIDB4RkMsIDB4RkIsIDB4RjIsIDB4RjUsCisgIDB4RDgsIDB4REYsIDB4RDYsIDB4RDEsIDB4QzQsIDB4QzMsIDB4Q0EsIDB4Q0QsCisgIDB4OTAsIDB4OTcsIDB4OUUsIDB4OTksIDB4OEMsIDB4OEIsIDB4ODIsIDB4ODUsCisgIDB4QTgsIDB4QUYsIDB4QTYsIDB4QTEsIDB4QjQsIDB4QjMsIDB4QkEsIDB4QkQsCisgIDB4QzcsIDB4QzAsIDB4QzksIDB4Q0UsIDB4REIsIDB4REMsIDB4RDUsIDB4RDIsCisgIDB4RkYsIDB4RjgsIDB4RjEsIDB4RjYsIDB4RTMsIDB4RTQsIDB4RUQsIDB4RUEsCisgIDB4QjcsIDB4QjAsIDB4QjksIDB4QkUsIDB4QUIsIDB4QUMsIDB4QTUsIDB4QTIsCisgIDB4OEYsIDB4ODgsIDB4ODEsIDB4ODYsIDB4OTMsIDB4OTQsIDB4OUQsIDB4OUEsCisgIDB4MjcsIDB4MjAsIDB4MjksIDB4MkUsIDB4M0IsIDB4M0MsIDB4MzUsIDB4MzIsCisgIDB4MUYsIDB4MTgsIDB4MTEsIDB4MTYsIDB4MDMsIDB4MDQsIDB4MEQsIDB4MEEsCisgIDB4NTcsIDB4NTAsIDB4NTksIDB4NUUsIDB4NEIsIDB4NEMsIDB4NDUsIDB4NDIsCisgIDB4NkYsIDB4NjgsIDB4NjEsIDB4NjYsIDB4NzMsIDB4NzQsIDB4N0QsIDB4N0EsCisgIDB4ODksIDB4OEUsIDB4ODcsIDB4ODAsIDB4OTUsIDB4OTIsIDB4OUIsIDB4OUMsCisgIDB4QjEsIDB4QjYsIDB4QkYsIDB4QjgsIDB4QUQsIDB4QUEsIDB4QTMsIDB4QTQsCisgIDB4RjksIDB4RkUsIDB4RjcsIDB4RjAsIDB4RTUsIDB4RTIsIDB4RUIsIDB4RUMsCisgIDB4QzEsIDB4QzYsIDB4Q0YsIDB4QzgsIDB4REQsIDB4REEsIDB4RDMsIDB4RDQsCisgIDB4NjksIDB4NkUsIDB4NjcsIDB4NjAsIDB4NzUsIDB4NzIsIDB4N0IsIDB4N0MsCisgIDB4NTEsIDB4NTYsIDB4NUYsIDB4NTgsIDB4NEQsIDB4NEEsIDB4NDMsIDB4NDQsCisgIDB4MTksIDB4MUUsIDB4MTcsIDB4MTAsIDB4MDUsIDB4MDIsIDB4MEIsIDB4MEMsCisgIDB4MjEsIDB4MjYsIDB4MkYsIDB4MjgsIDB4M0QsIDB4M0EsIDB4MzMsIDB4MzQsCisgIDB4NEUsIDB4NDksIDB4NDAsIDB4NDcsIDB4NTIsIDB4NTUsIDB4NUMsIDB4NUIsCisgIDB4NzYsIDB4NzEsIDB4NzgsIDB4N0YsIDB4NkEsIDB4NkQsIDB4NjQsIDB4NjMsCisgIDB4M0UsIDB4MzksIDB4MzAsIDB4MzcsIDB4MjIsIDB4MjUsIDB4MkMsIDB4MkIsCisgIDB4MDYsIDB4MDEsIDB4MDgsIDB4MEYsIDB4MUEsIDB4MUQsIDB4MTQsIDB4MTMsCisgIDB4QUUsIDB4QTksIDB4QTAsIDB4QTcsIDB4QjIsIDB4QjUsIDB4QkMsIDB4QkIsCisgIDB4OTYsIDB4OTEsIDB4OTgsIDB4OUYsIDB4OEEsIDB4OEQsIDB4ODQsIDB4ODMsCisgIDB4REUsIDB4RDksIDB4RDAsIDB4RDcsIDB4QzIsIDB4QzUsIDB4Q0MsIDB4Q0IsCisgIDB4RTYsIDB4RTEsIDB4RTgsIDB4RUYsIDB4RkEsIDB4RkQsIDB4RjQsIDB4RjMKK307CisKK3N0YXRpYyBndWludDgKK2dzdF9mbGFjX2NhbGN1bGF0ZV9jcmM4IChjb25zdCBndWludDggKiBkYXRhLCBndWludCBsZW5ndGgpCit7CisgIGd1aW50OCBjcmMgPSAwOworCisgIHdoaWxlIChsZW5ndGgtLSkgeworICAgIGNyYyA9IGNyYzhfdGFibGVbY3JjIF4gKmRhdGFdOworICAgICsrZGF0YTsKKyAgfQorCisgIHJldHVybiBjcmM7Cit9CisKKy8qIEZJWE1FOiBmb3Igb3VyIHB1cnBvc2VzIGl0J3MgcHJvYmFibHkgZW5vdWdoIHRvIGp1c3QgY2hlY2sgZm9yIHRoZSBzeW5jCisgKiBtYXJrZXIgLSB3ZSBqdXN0IHdhbnQgdG8ga25vdyBpZiBpdCdzIGEgaGVhZGVyIGZyYW1lIG9yIG5vdCAqLworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19kZWNfc2Nhbl9nb3RfZnJhbWUgKEdzdEZsYWNEZWMgKiBmbGFjZGVjLCBjb25zdCBndWludDggKiBkYXRhLAorICAgIGd1aW50IHNpemUpCit7CisgIGd1aW50IGhlYWRlcmxlbjsKKyAgZ3VpbnQgc3JfZnJvbV9lbmQgPSAwOyAgICAgICAgLyogY2FuIGJlIDAsIDggb3IgMTYgKi8KKyAgZ3VpbnQgYnNfZnJvbV9lbmQgPSAwOyAgICAgICAgLyogY2FuIGJlIDAsIDggb3IgMTYgKi8KKyAgZ3VpbnQzMiB2YWwgPSAwOworICBndWludDggYnMsIHNyLCBjYSwgc3MsIHBiOworICBnYm9vbGVhbiB2YnM7CisKKyAgaWYgKHNpemUgPCAxMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogc3luYyAqLworICBpZiAoZGF0YVswXSAhPSAweEZGIHx8IChkYXRhWzFdICYgMHhGQykgIT0gMHhGOCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgdmJzID0gISAhKGRhdGFbMV0gJiAxKTsgICAgICAgLyogdmFyaWFibGUgYmxvY2tzaXplICovCisgIGJzID0gKGRhdGFbMl0gJiAweEYwKSA+PiA0OyAgIC8qIGJsb2Nrc2l6ZSBtYXJrZXIgICAqLworICBzciA9IChkYXRhWzJdICYgMHgwRik7ICAgICAgICAvKiBzYW1wbGVyYXRlIG1hcmtlciAgKi8KKyAgY2EgPSAoZGF0YVszXSAmIDB4RjApID4+IDQ7ICAgLyogY2hhbm5lbCBhc3NpZ25tZW50ICovCisgIHNzID0gKGRhdGFbM10gJiAweDBGKSA+PiAxOyAgIC8qIHNhbXBsZSBzaXplIG1hcmtlciAqLworICBwYiA9IChkYXRhWzNdICYgMHgwMSk7ICAgICAgICAvKiBwYWRkaW5nIGJpdCAgICAgICAgKi8KKworICBHU1RfTE9HX09CSkVDVCAoZmxhY2RlYywKKyAgICAgICJnb3Qgc3luYywgdmJzPSVkLGJzPSV4LHNyPSV4LGNhPSV4LHNzPSV4LHBiPSV4IiwgdmJzLCBicywgc3IsIGNhLCBzcywKKyAgICAgIHBiKTsKKworICBpZiAoYnMgPT0gMCB8fCBzciA9PSAweDBGIHx8IGNhID49IDB4MEIgfHwgc3MgPT0gMHgwMyB8fCBzcyA9PSAweDA3KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogcmVhZCBibG9jayBzaXplIGZyb20gZW5kIG9mIGhlYWRlcj8gKi8KKyAgaWYgKGJzID09IDYpCisgICAgYnNfZnJvbV9lbmQgPSA4OworICBlbHNlIGlmIChicyA9PSA3KQorICAgIGJzX2Zyb21fZW5kID0gMTY7CisKKyAgLyogcmVhZCBzYW1wbGUgcmF0ZSBmcm9tIGVuZCBvZiBoZWFkZXI/ICovCisgIGlmIChzciA9PSAweDBDKQorICAgIHNyX2Zyb21fZW5kID0gODsKKyAgZWxzZSBpZiAoc3IgPT0gMHgwRCB8fCBzciA9PSAweDBFKQorICAgIHNyX2Zyb21fZW5kID0gMTY7CisKKyAgdmFsID0gZGF0YVs0XTsKKyAgLyogVGhpcyBpcyBzbGlnaHRseSBmYXN0ZXIgdGhhbiBhIGxvb3AgKi8KKyAgaWYgKCEodmFsICYgMHg4MCkpIHsKKyAgICB2YWwgPSAwOworICB9IGVsc2UgaWYgKCh2YWwgJiAweGMwKSAmJiAhKHZhbCAmIDB4MjApKSB7CisgICAgdmFsID0gMTsKKyAgfSBlbHNlIGlmICgodmFsICYgMHhlMCkgJiYgISh2YWwgJiAweDEwKSkgeworICAgIHZhbCA9IDI7CisgIH0gZWxzZSBpZiAoKHZhbCAmIDB4ZjApICYmICEodmFsICYgMHgwOCkpIHsKKyAgICB2YWwgPSAzOworICB9IGVsc2UgaWYgKCh2YWwgJiAweGY4KSAmJiAhKHZhbCAmIDB4MDQpKSB7CisgICAgdmFsID0gNDsKKyAgfSBlbHNlIGlmICgodmFsICYgMHhmYykgJiYgISh2YWwgJiAweDAyKSkgeworICAgIHZhbCA9IDU7CisgIH0gZWxzZSBpZiAoKHZhbCAmIDB4ZmUpICYmICEodmFsICYgMHgwMSkpIHsKKyAgICB2YWwgPSA2OworICB9IGVsc2UgeworICAgIEdTVF9MT0dfT0JKRUNUIChmbGFjZGVjLCAiZmFpbGVkIHRvIHJlYWQgc2FtcGxlL2ZyYW1lIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgdmFsKys7CisgIGhlYWRlcmxlbiA9IDQgKyB2YWwgKyAoYnNfZnJvbV9lbmQgLyA4KSArIChzcl9mcm9tX2VuZCAvIDgpOworCisgIGlmIChnc3RfZmxhY19jYWxjdWxhdGVfY3JjOCAoZGF0YSwgaGVhZGVybGVuKSAhPSBkYXRhW2hlYWRlcmxlbl0pIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoZmxhY2RlYywgImludmFsaWQgY2hlY2tzdW0iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19kZWNfaGFuZGxlX2RlY29kZXJfZXJyb3IgKEdzdEZsYWNEZWMgKiBkZWMsIGdib29sZWFuIG1zZykKK3sKKyAgZ2Jvb2xlYW4gcmV0OworCisgIGRlYy0+ZXJyb3JfY291bnQrKzsKKyAgaWYgKGRlYy0+ZXJyb3JfY291bnQgPiAxMCkgeworICAgIGlmIChtc2cpCisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVjLCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLCAoTlVMTCkpOworICAgIGRlYy0+bGFzdF9mbG93ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgcmV0ID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZWMsICJpZ25vcmluZyBlcnJvciBmb3Igbm93IGF0IGNvdW50ICVkIiwKKyAgICAgICAgZGVjLT5lcnJvcl9jb3VudCk7CisgICAgcmV0ID0gRkFMU0U7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X2ZsYWNfZGVjX21ldGFkYXRhX2NiIChjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogZGVjb2RlciwKKyAgICBjb25zdCBGTEFDX19TdHJlYW1NZXRhZGF0YSAqIG1ldGFkYXRhLCB2b2lkICpjbGllbnRfZGF0YSkKK3sKKyAgR3N0RmxhY0RlYyAqZmxhY2RlYyA9IEdTVF9GTEFDX0RFQyAoY2xpZW50X2RhdGEpOworICBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBwb3NpdGlvbls4XTsKKworICBHU1RfTE9HX09CSkVDVCAoZmxhY2RlYywgIm1ldGFkYXRhIHR5cGU6ICVkIiwgbWV0YWRhdGEtPnR5cGUpOworCisgIHN3aXRjaCAobWV0YWRhdGEtPnR5cGUpIHsKKyAgICBjYXNlIEZMQUNfX01FVEFEQVRBX1RZUEVfU1RSRUFNSU5GTzp7CisgICAgICBnaW50NjQgc2FtcGxlczsKKyAgICAgIGd1aW50IGRlcHRoLCB3aWR0aCwgZ2RlcHRoLCBjaGFubmVsczsKKworICAgICAgc2FtcGxlcyA9IG1ldGFkYXRhLT5kYXRhLnN0cmVhbV9pbmZvLnRvdGFsX3NhbXBsZXM7CisKKyAgICAgIGZsYWNkZWMtPm1pbl9ibG9ja3NpemUgPSBtZXRhZGF0YS0+ZGF0YS5zdHJlYW1faW5mby5taW5fYmxvY2tzaXplOworICAgICAgZmxhY2RlYy0+bWF4X2Jsb2Nrc2l6ZSA9IG1ldGFkYXRhLT5kYXRhLnN0cmVhbV9pbmZvLm1heF9ibG9ja3NpemU7CisgICAgICBmbGFjZGVjLT5kZXB0aCA9IGRlcHRoID0gbWV0YWRhdGEtPmRhdGEuc3RyZWFtX2luZm8uYml0c19wZXJfc2FtcGxlOworCisgICAgICBpZiAoZGVwdGggPCA5KSB7CisgICAgICAgIGdkZXB0aCA9IHdpZHRoID0gODsKKyAgICAgIH0gZWxzZSBpZiAoZGVwdGggPCAxNykgeworICAgICAgICBnZGVwdGggPSB3aWR0aCA9IDE2OworICAgICAgfSBlbHNlIGlmIChkZXB0aCA8IDI1KSB7CisgICAgICAgIGdkZXB0aCA9IDI0OworICAgICAgICB3aWR0aCA9IDMyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2RlcHRoID0gd2lkdGggPSAzMjsKKyAgICAgIH0KKworICAgICAgY2hhbm5lbHMgPSBtZXRhZGF0YS0+ZGF0YS5zdHJlYW1faW5mby5jaGFubmVsczsKKyAgICAgIG1lbWNweSAocG9zaXRpb24sIGNoYW5uZWxfcG9zaXRpb25zW2NoYW5uZWxzIC0gMV0sIHNpemVvZiAocG9zaXRpb24pKTsKKyAgICAgIGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b192YWxpZF9vcmRlciAocG9zaXRpb24sIGNoYW5uZWxzKTsKKyAgICAgIC8qIE5vdGU6IHdlIGNyZWF0ZSB0aGUgaW52ZXJzZSByZW9yZGVyaW5nIG1hcCBoZXJlICovCisgICAgICBnc3RfYXVkaW9fZ2V0X2NoYW5uZWxfcmVvcmRlcl9tYXAgKGNoYW5uZWxzLAorICAgICAgICAgIHBvc2l0aW9uLCBjaGFubmVsX3Bvc2l0aW9uc1tjaGFubmVscyAtIDFdLAorICAgICAgICAgIGZsYWNkZWMtPmNoYW5uZWxfcmVvcmRlcl9tYXApOworCisgICAgICBnc3RfYXVkaW9faW5mb19zZXRfZm9ybWF0ICgmZmxhY2RlYy0+aW5mbywKKyAgICAgICAgICBnc3RfYXVkaW9fZm9ybWF0X2J1aWxkX2ludGVnZXIgKFRSVUUsIEdfQllURV9PUkRFUiwgd2lkdGgsIGdkZXB0aCksCisgICAgICAgICAgbWV0YWRhdGEtPmRhdGEuc3RyZWFtX2luZm8uc2FtcGxlX3JhdGUsCisgICAgICAgICAgbWV0YWRhdGEtPmRhdGEuc3RyZWFtX2luZm8uY2hhbm5lbHMsIHBvc2l0aW9uKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY2RlYywgImJsb2Nrc2l6ZTogbWluPSV1LCBtYXg9JXUiLAorICAgICAgICAgIGZsYWNkZWMtPm1pbl9ibG9ja3NpemUsIGZsYWNkZWMtPm1heF9ibG9ja3NpemUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY2RlYywgInNhbXBsZSByYXRlOiAldSwgY2hhbm5lbHM6ICV1IiwKKyAgICAgICAgICBmbGFjZGVjLT5pbmZvLnJhdGUsIGZsYWNkZWMtPmluZm8uY2hhbm5lbHMpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY2RlYywgImRlcHRoOiAldSwgd2lkdGg6ICV1IiwgZmxhY2RlYy0+ZGVwdGgsCisgICAgICAgICAgZmxhY2RlYy0+aW5mby5maW5mby0+d2lkdGgpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjZGVjLCAidG90YWwgc2FtcGxlcyA9ICUiIEdfR0lOVDY0X0ZPUk1BVCwgc2FtcGxlcyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmxhY19kZWNfZXJyb3JfY2IgKGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiBkLAorICAgIEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBzdGF0dXMsIHZvaWQgKmNsaWVudF9kYXRhKQoreworICBjb25zdCBnY2hhciAqZXJyb3I7CisgIEdzdEZsYWNEZWMgKmRlYzsKKworICBkZWMgPSBHU1RfRkxBQ19ERUMgKGNsaWVudF9kYXRhKTsKKworICBzd2l0Y2ggKHN0YXR1cykgeworICAgIGNhc2UgRkxBQ19fU1RSRUFNX0RFQ09ERVJfRVJST1JfU1RBVFVTX0xPU1RfU1lOQzoKKyAgICAgIGRlYy0+ZG9fcmVzeW5jID0gVFJVRTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIEZMQUNfX1NUUkVBTV9ERUNPREVSX0VSUk9SX1NUQVRVU19CQURfSEVBREVSOgorICAgICAgZXJyb3IgPSAiYmFkIGhlYWRlciI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZMQUNfX1NUUkVBTV9ERUNPREVSX0VSUk9SX1NUQVRVU19GUkFNRV9DUkNfTUlTTUFUQ0g6CisgICAgICBlcnJvciA9ICJDUkMgbWlzbWF0Y2giOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yID0gInVua25vd24gZXJyb3IiOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoZ3N0X2ZsYWNfZGVjX2hhbmRsZV9kZWNvZGVyX2Vycm9yIChkZWMsIEZBTFNFKSkKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVjLCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLCAoIiVzICglZCkiLCBlcnJvciwgc3RhdHVzKSk7Cit9CisKK3N0YXRpYyBGTEFDX19TdHJlYW1EZWNvZGVyUmVhZFN0YXR1cworZ3N0X2ZsYWNfZGVjX3JlYWRfc3RyZWFtIChjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogZGVjb2RlciwKKyAgICBGTEFDX19ieXRlIGJ1ZmZlcltdLCBzaXplX3QgKiBieXRlcywgdm9pZCAqY2xpZW50X2RhdGEpCit7CisgIEdzdEZsYWNEZWMgKmRlYyA9IEdTVF9GTEFDX0RFQyAoY2xpZW50X2RhdGEpOworICBndWludCBsZW47CisKKyAgbGVuID0gTUlOIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGRlYy0+YWRhcHRlciksICpieXRlcyk7CisKKyAgaWYgKGxlbiA9PSAwKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlYywgIjAgYnl0ZXMgYXZhaWxhYmxlIGF0IHRoZSBtb21lbnQiKTsKKyAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0RFQ09ERVJfUkVBRF9TVEFUVVNfQUJPUlQ7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoZGVjLCAiZmVlZGluZyAldSBieXRlcyB0byBkZWNvZGVyICIKKyAgICAgICIoYXZhaWxhYmxlPSUiIEdfR1NJWkVfRk9STUFUICIsIGJ5dGVzPSV1KSIsCisgICAgICBsZW4sIGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoZGVjLT5hZGFwdGVyKSwgKGd1aW50KSAqIGJ5dGVzKTsKKyAgZ3N0X2FkYXB0ZXJfY29weSAoZGVjLT5hZGFwdGVyLCBidWZmZXIsIDAsIGxlbik7CisgICpieXRlcyA9IGxlbjsKKworICBnc3RfYWRhcHRlcl9mbHVzaCAoZGVjLT5hZGFwdGVyLCBsZW4pOworCisgIHJldHVybiBGTEFDX19TVFJFQU1fREVDT0RFUl9SRUFEX1NUQVRVU19DT05USU5VRTsKK30KKworc3RhdGljIEZMQUNfX1N0cmVhbURlY29kZXJXcml0ZVN0YXR1cworZ3N0X2ZsYWNfZGVjX3dyaXRlIChHc3RGbGFjRGVjICogZmxhY2RlYywgY29uc3QgRkxBQ19fRnJhbWUgKiBmcmFtZSwKKyAgICBjb25zdCBGTEFDX19pbnQzMiAqIGNvbnN0IGJ1ZmZlcltdKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ3VpbnQgZGVwdGggPSBmcmFtZS0+aGVhZGVyLmJpdHNfcGVyX3NhbXBsZTsKKyAgZ3VpbnQgd2lkdGgsIGdkZXB0aDsKKyAgZ3VpbnQgc2FtcGxlX3JhdGUgPSBmcmFtZS0+aGVhZGVyLnNhbXBsZV9yYXRlOworICBndWludCBjaGFubmVscyA9IGZyYW1lLT5oZWFkZXIuY2hhbm5lbHM7CisgIGd1aW50IHNhbXBsZXMgPSBmcmFtZS0+aGVhZGVyLmJsb2Nrc2l6ZTsKKyAgZ3VpbnQgaiwgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdib29sZWFuIGNhcHNfY2hhbmdlZDsKKyAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gY2hhbnBvc1s4XTsKKworICBHU1RfTE9HX09CSkVDVCAoZmxhY2RlYywgInNhbXBsZXMgaW4gZnJhbWUgaGVhZGVyOiAlZCIsIHNhbXBsZXMpOworCisgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgaWYgKGZsYWNkZWMtPmRlcHRoIDwgNCB8fCBmbGFjZGVjLT5kZXB0aCA+IDMyKSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChmbGFjZGVjLCAidW5zdXBwb3J0ZWQgZGVwdGggJWQgZnJvbSBTVFJFQU1JTkZPIiwKKyAgICAgICAgICBmbGFjZGVjLT5kZXB0aCk7CisgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBkZXB0aCA9IGZsYWNkZWMtPmRlcHRoOworICB9CisKKyAgc3dpdGNoIChkZXB0aCkgeworICAgIGNhc2UgODoKKyAgICAgIGdkZXB0aCA9IHdpZHRoID0gODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI6CisgICAgY2FzZSAxNjoKKyAgICAgIGdkZXB0aCA9IHdpZHRoID0gMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDIwOgorICAgIGNhc2UgMjQ6CisgICAgICBnZGVwdGggPSAyNDsKKyAgICAgIHdpZHRoID0gMzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMyOgorICAgICAgZ2RlcHRoID0gd2lkdGggPSAzMjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChmbGFjZGVjLCAidW5zdXBwb3J0ZWQgZGVwdGggJWQiLCBkZXB0aCk7CisgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGlmIChzYW1wbGVfcmF0ZSA9PSAwKSB7CisgICAgaWYgKGZsYWNkZWMtPmluZm8ucmF0ZSAhPSAwKSB7CisgICAgICBzYW1wbGVfcmF0ZSA9IGZsYWNkZWMtPmluZm8ucmF0ZTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAoZmxhY2RlYywgInVua25vd24gc2FtcGxlIHJhdGUiKTsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgZ290byBkb25lOworICAgIH0KKyAgfQorCisgIGNhcHNfY2hhbmdlZCA9IChzYW1wbGVfcmF0ZSAhPSBHU1RfQVVESU9fSU5GT19SQVRFICgmZmxhY2RlYy0+aW5mbykpCisgICAgICB8fCAod2lkdGggIT0gR1NUX0FVRElPX0lORk9fV0lEVEggKCZmbGFjZGVjLT5pbmZvKSkKKyAgICAgIHx8IChnZGVwdGggIT0gR1NUX0FVRElPX0lORk9fREVQVEggKCZmbGFjZGVjLT5pbmZvKSkKKyAgICAgIHx8IChjaGFubmVscyAhPSBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJmZsYWNkZWMtPmluZm8pKTsKKworICBpZiAoY2Fwc19jaGFuZ2VkCisgICAgICB8fCAhZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChHU1RfQVVESU9fREVDT0RFUl9TUkNfUEFEIChmbGFjZGVjKSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjZGVjLCAiTmVnb3RpYXRpbmcgJWQgSHogQCAlZCBjaGFubmVscyIsIHNhbXBsZV9yYXRlLAorICAgICAgICBjaGFubmVscyk7CisKKyAgICBtZW1jcHkgKGNoYW5wb3MsIGNoYW5uZWxfcG9zaXRpb25zW2ZsYWNkZWMtPmluZm8uY2hhbm5lbHMgLSAxXSwKKyAgICAgICAgc2l6ZW9mIChjaGFucG9zKSk7CisgICAgZ3N0X2F1ZGlvX2NoYW5uZWxfcG9zaXRpb25zX3RvX3ZhbGlkX29yZGVyIChjaGFucG9zLAorICAgICAgICBmbGFjZGVjLT5pbmZvLmNoYW5uZWxzKTsKKyAgICBnc3RfYXVkaW9faW5mb19zZXRfZm9ybWF0ICgmZmxhY2RlYy0+aW5mbywKKyAgICAgICAgZ3N0X2F1ZGlvX2Zvcm1hdF9idWlsZF9pbnRlZ2VyIChUUlVFLCBHX0JZVEVfT1JERVIsIHdpZHRoLCBnZGVwdGgpLAorICAgICAgICBzYW1wbGVfcmF0ZSwgY2hhbm5lbHMsIGNoYW5wb3MpOworCisgICAgLyogTm90ZTogd2UgY3JlYXRlIHRoZSBpbnZlcnNlIHJlb3JkZXJpbmcgbWFwIGhlcmUgKi8KKyAgICBnc3RfYXVkaW9fZ2V0X2NoYW5uZWxfcmVvcmRlcl9tYXAgKGZsYWNkZWMtPmluZm8uY2hhbm5lbHMsCisgICAgICAgIGZsYWNkZWMtPmluZm8ucG9zaXRpb24sIGNoYW5uZWxfcG9zaXRpb25zW2ZsYWNkZWMtPmluZm8uY2hhbm5lbHMgLSAxXSwKKyAgICAgICAgZmxhY2RlYy0+Y2hhbm5lbF9yZW9yZGVyX21hcCk7CisKKyAgICBmbGFjZGVjLT5kZXB0aCA9IGRlcHRoOworCisgICAgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X291dHB1dF9mb3JtYXQgKEdTVF9BVURJT19ERUNPREVSIChmbGFjZGVjKSwKKyAgICAgICAgJmZsYWNkZWMtPmluZm8pOworICB9CisKKyAgb3V0YnVmID0KKyAgICAgIGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBzYW1wbGVzICogY2hhbm5lbHMgKiAod2lkdGggLyA4KSwgTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGlmICh3aWR0aCA9PSA4KSB7CisgICAgZ2ludDggKm91dGJ1ZmZlciA9IChnaW50OCAqKSBtYXAuZGF0YTsKKyAgICBnaW50ICpyZW9yZGVyX21hcCA9IGZsYWNkZWMtPmNoYW5uZWxfcmVvcmRlcl9tYXA7CisKKyAgICBnX2Fzc2VydCAoZ2RlcHRoID09IDggJiYgZGVwdGggPT0gOCk7CisgICAgZm9yIChpID0gMDsgaSA8IHNhbXBsZXM7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgKm91dGJ1ZmZlcisrID0gKGdpbnQ4KSBidWZmZXJbcmVvcmRlcl9tYXBbal1dW2ldOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICh3aWR0aCA9PSAxNikgeworICAgIGdpbnQxNiAqb3V0YnVmZmVyID0gKGdpbnQxNiAqKSBtYXAuZGF0YTsKKyAgICBnaW50ICpyZW9yZGVyX21hcCA9IGZsYWNkZWMtPmNoYW5uZWxfcmVvcmRlcl9tYXA7CisKKyAgICBpZiAoZ2RlcHRoICE9IGRlcHRoKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlczsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjaGFubmVsczsgaisrKSB7CisgICAgICAgICAgKm91dGJ1ZmZlcisrID0KKyAgICAgICAgICAgICAgKGdpbnQxNikgKGJ1ZmZlcltyZW9yZGVyX21hcFtqXV1baV0gPDwgKGdkZXB0aCAtIGRlcHRoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpID0gMDsgaSA8IHNhbXBsZXM7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeworICAgICAgICAgICpvdXRidWZmZXIrKyA9IChnaW50MTYpIGJ1ZmZlcltyZW9yZGVyX21hcFtqXV1baV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAod2lkdGggPT0gMzIpIHsKKyAgICBnaW50MzIgKm91dGJ1ZmZlciA9IChnaW50MzIgKikgbWFwLmRhdGE7CisgICAgZ2ludCAqcmVvcmRlcl9tYXAgPSBmbGFjZGVjLT5jaGFubmVsX3Jlb3JkZXJfbWFwOworCisgICAgaWYgKGdkZXB0aCAhPSBkZXB0aCkgeworICAgICAgZm9yIChpID0gMDsgaSA8IHNhbXBsZXM7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeworICAgICAgICAgICpvdXRidWZmZXIrKyA9CisgICAgICAgICAgICAgIChnaW50MzIpIChidWZmZXJbcmVvcmRlcl9tYXBbal1dW2ldIDw8IChnZGVwdGggLSBkZXB0aCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVzOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgICAqb3V0YnVmZmVyKysgPSAoZ2ludDMyKSBidWZmZXJbcmVvcmRlcl9tYXBbal1dW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm1hcCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY2RlYywgInB1c2hpbmcgJWQgc2FtcGxlcyIsIHNhbXBsZXMpOworICBpZiAoZmxhY2RlYy0+ZXJyb3JfY291bnQpCisgICAgZmxhY2RlYy0+ZXJyb3JfY291bnQtLTsKKworICByZXQgPSBnc3RfYXVkaW9fZGVjb2Rlcl9maW5pc2hfZnJhbWUgKEdTVF9BVURJT19ERUNPREVSIChmbGFjZGVjKSwgb3V0YnVmLCAxKTsKKworICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNkZWMsICJmaW5pc2hfZnJhbWUgZmxvdyAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgfQorCitkb25lOgorCisgIC8qIHdlIGFjdCBvbiB0aGUgZmxvdyByZXR1cm4gdmFsdWUgbGF0ZXIgaW4gdGhlIGhhbmRsZV9mcmFtZSBmdW5jdGlvbiwgYXMgd2UKKyAgICogZG9uJ3Qgd2FudCB0byBtZXNzIHVwIHRoZSBpbnRlcm5hbCBkZWNvZGVyIHN0YXRlIGJ5IHJldHVybmluZyBBQk9SVCB3aGVuCisgICAqIHRoZSBlcnJvciBpcyBpbiBmYWN0IG5vbi1mYXRhbCAobGlrZSBhIHBhZCBpbiBmbHVzaGluZyBtb2RlKSBhbmQgd2Ugd2FudAorICAgKiB0byBjb250aW51ZSBsYXRlci4gU28ganVzdCBwcmV0ZW5kIGV2ZXJ5dGhpbmcncyBkYW5keSBhbmQgYWN0IGxhdGVyLiAqLworICBmbGFjZGVjLT5sYXN0X2Zsb3cgPSByZXQ7CisKKyAgcmV0dXJuIEZMQUNfX1NUUkVBTV9ERUNPREVSX1dSSVRFX1NUQVRVU19DT05USU5VRTsKK30KKworc3RhdGljIEZMQUNfX1N0cmVhbURlY29kZXJXcml0ZVN0YXR1cworZ3N0X2ZsYWNfZGVjX3dyaXRlX3N0cmVhbSAoY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIGRlY29kZXIsCisgICAgY29uc3QgRkxBQ19fRnJhbWUgKiBmcmFtZSwKKyAgICBjb25zdCBGTEFDX19pbnQzMiAqIGNvbnN0IGJ1ZmZlcltdLCB2b2lkICpjbGllbnRfZGF0YSkKK3sKKyAgcmV0dXJuIGdzdF9mbGFjX2RlY193cml0ZSAoR1NUX0ZMQUNfREVDIChjbGllbnRfZGF0YSksIGZyYW1lLCBidWZmZXIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2ZsYWNfZGVjX2ZsdXNoIChHc3RBdWRpb0RlY29kZXIgKiBhdWRpb19kZWMsIGdib29sZWFuIGhhcmQpCit7CisgIEdzdEZsYWNEZWMgKmRlYyA9IEdTVF9GTEFDX0RFQyAoYXVkaW9fZGVjKTsKKworICBpZiAoIWhhcmQpIHsKKyAgICBndWludCBhdmFpbGFibGUgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGRlYy0+YWRhcHRlcik7CisKKyAgICBpZiAoYXZhaWxhYmxlID4gMCkgeworICAgICAgR1NUX0lORk9fT0JKRUNUIChkZWMsICJkcmFpbmluZywgJXUgYnl0ZXMgbGVmdCBpbiBhZGFwdGVyIiwgYXZhaWxhYmxlKTsKKyAgICAgIEZMQUNfX3N0cmVhbV9kZWNvZGVyX3Byb2Nlc3NfdW50aWxfZW5kX29mX3N0cmVhbSAoZGVjLT5kZWNvZGVyKTsKKyAgICB9CisgIH0KKworICBkZWMtPmRvX3Jlc3luYyA9IEZBTFNFOworICBGTEFDX19zdHJlYW1fZGVjb2Rlcl9mbHVzaCAoZGVjLT5kZWNvZGVyKTsKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGRlYy0+YWRhcHRlcik7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZmxhY19kZWNfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0RlY29kZXIgKiBhdWRpb19kZWMsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0RmxhY0RlYyAqZGVjOworCisgIGRlYyA9IEdTVF9GTEFDX0RFQyAoYXVkaW9fZGVjKTsKKworICAvKiBkcmFpbiByZW1haW5pbmcgZGF0YT8gKi8KKyAgaWYgKEdfVU5MSUtFTFkgKGJ1ZiA9PSBOVUxMKSkgeworICAgIGdzdF9mbGFjX2RlY19mbHVzaCAoYXVkaW9fZGVjLCBGQUxTRSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CisKKyAgaWYgKGRlYy0+ZG9fcmVzeW5jKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZWMsICJMb3N0IHN5bmMsIGZsdXNoaW5nIGRlY29kZXIiKTsKKyAgICBGTEFDX19zdHJlYW1fZGVjb2Rlcl9mbHVzaCAoZGVjLT5kZWNvZGVyKTsKKyAgICBkZWMtPmRvX3Jlc3luYyA9IEZBTFNFOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlYywgImZyYW1lOiB0cyAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZmxhZ3MgMHglMDR4LCAiCisgICAgICAiJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyIsIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpKSwKKyAgICAgIEdTVF9CVUZGRVJfRkxBR1MgKGJ1ZiksIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikpOworCisgIC8qIGRyb3AgYW55IGluLXN0cmVhbSBoZWFkZXJzLCB3ZSd2ZSBwcm9jZXNzZWQgdGhvc2UgaW4gc2V0X2Zvcm1hdCBhbHJlYWR5ICovCisgIGlmIChHX1VOTElLRUxZICghZGVjLT5nb3RfaGVhZGVycykpIHsKKyAgICBnYm9vbGVhbiBnb3RfYXVkaW9fZnJhbWU7CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICAvKiBjaGVjayBpZiB0aGlzIGlzIGEgZmxhYyBhdWRpbyBmcmFtZSAocmF0aGVyIHRoYW4gYSBoZWFkZXIgb3IganVuaykgKi8KKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIGdvdF9hdWRpb19mcmFtZSA9IGdzdF9mbGFjX2RlY19zY2FuX2dvdF9mcmFtZSAoZGVjLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgICBpZiAoIWdvdF9hdWRpb19mcmFtZSkgeworICAgICAgR1NUX0lORk9fT0JKRUNUIChkZWMsICJkcm9wcGluZyBpbi1zdHJlYW0gaGVhZGVyLCAlIiBHX0dTSVpFX0ZPUk1BVCAiICIKKyAgICAgICAgICAiYnl0ZXMiLCBtYXAuc2l6ZSk7CisgICAgICBnc3RfYXVkaW9fZGVjb2Rlcl9maW5pc2hfZnJhbWUgKGF1ZGlvX2RlYywgTlVMTCwgMSk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgfQorCisgICAgR1NUX0lORk9fT0JKRUNUIChkZWMsICJmaXJzdCBhdWRpbyBmcmFtZSwgZ290IGFsbCBpbi1zdHJlYW0gaGVhZGVycyBub3ciKTsKKyAgICBkZWMtPmdvdF9oZWFkZXJzID0gVFJVRTsKKyAgfQorCisgIGdzdF9hZGFwdGVyX3B1c2ggKGRlYy0+YWRhcHRlciwgZ3N0X2J1ZmZlcl9yZWYgKGJ1ZikpOworICBidWYgPSBOVUxMOworCisgIGRlYy0+bGFzdF9mbG93ID0gR1NUX0ZMT1dfT0s7CisKKyAgLyogZnJhbWVkIC0gdGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBlbm91Z2ggZGF0YSB0byBkZWNvZGUgc29tZXRoaW5nICovCisgIEdTVF9MT0dfT0JKRUNUIChkZWMsICIlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIGF2YWlsYWJsZSIsCisgICAgICBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGRlYy0+YWRhcHRlcikpOworCisgIGlmICghRkxBQ19fc3RyZWFtX2RlY29kZXJfcHJvY2Vzc19zaW5nbGUgKGRlYy0+ZGVjb2RlcikpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGRlYywgInByb2Nlc3Nfc2luZ2xlIGZhaWxlZCIpOworICAgIGlmIChGTEFDX19zdHJlYW1fZGVjb2Rlcl9nZXRfc3RhdGUgKGRlYy0+ZGVjb2RlcikgPT0KKyAgICAgICAgRkxBQ19fU1RSRUFNX0RFQ09ERVJfQUJPUlRFRCkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZWMsICJSZWFkIGNhbGxiYWNrIGNhdXNlZCBpbnRlcm5hbCBhYm9ydCIpOworICAgICAgLyogYWxsb3cgcmVjb3ZlcnkgKi8KKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChkZWMtPmFkYXB0ZXIpOworICAgICAgRkxBQ19fc3RyZWFtX2RlY29kZXJfZmx1c2ggKGRlYy0+ZGVjb2Rlcik7CisgICAgICBnc3RfZmxhY19kZWNfaGFuZGxlX2RlY29kZXJfZXJyb3IgKGRlYywgVFJVRSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGRlYy0+bGFzdF9mbG93OworfQpkaWZmIC0tZ2l0IGEvZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oIGIvZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2M2IzMDAKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZmxhYy9nc3RmbGFjZGVjLmgKQEAgLTAsMCArMSw3NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAxMT4gVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfRkxBQ19ERUNfSF9fCisjZGVmaW5lIF9fR1NUX0ZMQUNfREVDX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2RlY29kZXIuaD4KKworI2luY2x1ZGUgPEZMQUMvYWxsLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9GTEFDX0RFQyBnc3RfZmxhY19kZWNfZ2V0X3R5cGUoKQorI2RlZmluZSBHU1RfRkxBQ19ERUMob2JqKSBHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVChvYmosIEdTVF9UWVBFX0ZMQUNfREVDLCBHc3RGbGFjRGVjKQorI2RlZmluZSBHU1RfRkxBQ19ERUNfQ0xBU1Moa2xhc3MpIEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKGtsYXNzLCBHU1RfVFlQRV9GTEFDX0RFQywgR3N0RmxhY0RlY0NsYXNzKQorI2RlZmluZSBHU1RfSVNfRkxBQ19ERUMob2JqKSBHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRShvYmosIEdTVF9UWVBFX0ZMQUNfREVDKQorI2RlZmluZSBHU1RfSVNfRkxBQ19ERUNfQ0xBU1Moa2xhc3MpIEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKGtsYXNzLCBHU1RfVFlQRV9GTEFDX0RFQykKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEZsYWNEZWMgR3N0RmxhY0RlYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RGbGFjRGVjQ2xhc3MgR3N0RmxhY0RlY0NsYXNzOworCitzdHJ1Y3QgX0dzdEZsYWNEZWMgeworICBHc3RBdWRpb0RlY29kZXIgIGF1ZGlvZGVjb2RlcjsKKworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgRkxBQ19fU3RyZWFtRGVjb2RlciAgICAgICAgICpkZWNvZGVyOworICBHc3RBZGFwdGVyICAgICAgICAgICAgICAgICAgKmFkYXB0ZXI7CisKKyAgZ2Jvb2xlYW4gICAgICAgZ290X2hlYWRlcnM7IC8qIGhhdmUgd2UgcmVjZWl2ZWQgYWxsIHRoZSBoZWFkZXIgYnVmZmVycyB5ZXQ/ICovCisKKyAgR3N0Rmxvd1JldHVybiAgbGFzdF9mbG93OyAgIC8qIHRvIG1hcnNoYWwgZmxvdyByZXR1cm4gZnJvbSBmaW5pc19mcmFtZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaGFuZGxlX2ZyYW1lIHZpYSBmbGFjIGNhbGxiYWNrcyAqLworCisgIEdzdEF1ZGlvSW5mbyAgIGluZm87CisgIGdpbnQgICAgICAgICAgIGNoYW5uZWxfcmVvcmRlcl9tYXBbOF07CisgIGdpbnQgICAgICAgICAgIGRlcHRoOworCisgIC8qIGZyb20gdGhlIHN0cmVhbSBpbmZvLCBuZWVkZWQgZm9yIHNjYW5uaW5nICovCisgIGd1aW50MTYgICAgICAgIG1pbl9ibG9ja3NpemU7CisgIGd1aW50MTYgICAgICAgIG1heF9ibG9ja3NpemU7CisKKyAgZ2Jvb2xlYW4gICAgICAgZG9fcmVzeW5jOworICBnaW50ICAgICAgICAgICBlcnJvcl9jb3VudDsKK307CisKK3N0cnVjdCBfR3N0RmxhY0RlY0NsYXNzIHsKKyAgR3N0QXVkaW9EZWNvZGVyQ2xhc3MgIGF1ZGlvZGVjb2RlcjsKK307CisKK0dUeXBlIGdzdF9mbGFjX2RlY19nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9GTEFDX0RFQ19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9mbGFjL2dzdGZsYWNlbmMuYyBiL2V4dC9mbGFjL2dzdGZsYWNlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzFkZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5jCkBAIC0wLDAgKzEsMTU4NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1mbGFjZW5jCisgKiBAc2VlX2Fsc286ICNHc3RGbGFjRGVjCisgKgorICogZmxhY2VuYyBlbmNvZGVzIEZMQUMgc3RyZWFtcy4KKyAqIDx1bGluayB1cmw9Imh0dHA6Ly9mbGFjLnNvdXJjZWZvcmdlLm5ldC8iPkZMQUM8L3VsaW5rPgorICogaXMgYSBGcmVlIExvc3NsZXNzIEF1ZGlvIENvZGVjLiBGTEFDIGF1ZGlvIGNhbiBkaXJlY3RseSBiZSB3cml0dGVuIGludG8KKyAqIGEgZmlsZSwgb3IgZW1iZWRkZWQgaW50byBjb250YWluZXJzIHN1Y2ggYXMgb2dnbXV4IG9yIG1hdHJvc2thbXV4LgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBhdWRpb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MTAwICEgZmxhY2VuYyAhIGZpbGVzaW5rIGxvY2F0aW9uPWJlZXAuZmxhYworICogXXwgRW5jb2RlIGEgc2hvcnQgc2luZSB3YXZlIGludG8gRkxBQworICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGNkcGFyYW5vaWFzcmMgbW9kZT1jb250aW51b3VzICEgcXVldWUgISBhdWRpb2NvbnZlcnQgISBmbGFjZW5jICEgZmlsZXNpbmsgbG9jYXRpb249Y2QuZmxhYworICogXXwgUmlwIGEgd2hvbGUgYXVkaW8gQ0QgaW50byBhIHNpbmdsZSBGTEFDIGZpbGUsIHdpdGggdGhlIHRyYWNrIHRhYmxlIHNhdmVkIGFzIGEgQ1VFIHNoZWV0IGluc2lkZSB0aGUgRkxBQyBmaWxlCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgY2RwYXJhbm9pYXNyYyB0cmFjaz01ICEgcXVldWUgISBhdWRpb2NvbnZlcnQgISBmbGFjZW5jICEgZmlsZXNpbmsgbG9jYXRpb249dHJhY2s1LmZsYWMKKyAqIF18IFJpcCB0cmFjayA1IG9mIGFuIGF1ZGlvIENEIGFuZCBlbmNvZGUgaXQgbG9zc2xlc3NseSB0byBhIEZMQUMgZmlsZQorICogPC9yZWZzZWN0Mj4KKyAqLworCisvKiBUT0RPOiAtIFdlIGN1cnJlbnRseSBkb24ndCBoYW5kbGUgZGlzY29udGludWl0aWVzIGluIHRoZSBzdHJlYW0gaW4gYSB1c2VmdWwKKyAqICAgICAgICAgd2F5IGFuZCBpbnN0ZWFkIHJlbHkgb24gdGhlIGRldmVsb3BlciBwbHVnZ2luZyBpbiBhdWRpb3JhdGUgaWYKKyAqICAgICAgICAgdGhlIHN0cmVhbSBjb250YWlucyBkaXNjb250aW51aXRpZXMuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0ZmxhY2VuYy5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisjaW5jbHVkZSA8Z3N0L2dzdHRhZ3NldHRlci5oPgorCisvKiBUYWtlbiBmcm9tIGh0dHA6Ly9mbGFjLnNvdXJjZWZvcmdlLm5ldC9mb3JtYXQuaHRtbCNmcmFtZV9oZWFkZXIgKi8KK3N0YXRpYyBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBjaGFubmVsX3Bvc2l0aW9uc1s4XVs4XSA9IHsKKyAge0dTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX01PTk99LAorICB7R1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUfSwgeworICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUn0sIHsKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFR9LCB7CisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFR9LCB7CisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0xGRTEsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFR9LAorICAvKiBGSVhNRTogNy84IGNoYW5uZWwgbGF5b3V0cyBhcmUgbm90IGRlZmluZWQgaW4gdGhlIEZMQUMgc3BlY3MgKi8KKyAgeworICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0xGRTEsCisgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0NFTlRFUn0sIHsKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSLAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxLAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQsCisgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hUfQorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtZmxhYyIpCisgICAgKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUVVBTElUWSwKKyAgUFJPUF9TVFJFQU1BQkxFX1NVQlNFVCwKKyAgUFJPUF9NSURfU0lERV9TVEVSRU8sCisgIFBST1BfTE9PU0VfTUlEX1NJREVfU1RFUkVPLAorICBQUk9QX0JMT0NLU0laRSwKKyAgUFJPUF9NQVhfTFBDX09SREVSLAorICBQUk9QX1FMUF9DT0VGRl9QUkVDSVNJT04sCisgIFBST1BfUUxQX0NPRUZGX1BSRUNfU0VBUkNILAorICBQUk9QX0VTQ0FQRV9DT0RJTkcsCisgIFBST1BfRVhIQVVTVElWRV9NT0RFTF9TRUFSQ0gsCisgIFBST1BfTUlOX1JFU0lEVUFMX1BBUlRJVElPTl9PUkRFUiwKKyAgUFJPUF9NQVhfUkVTSURVQUxfUEFSVElUSU9OX09SREVSLAorICBQUk9QX1JJQ0VfUEFSQU1FVEVSX1NFQVJDSF9ESVNULAorICBQUk9QX1BBRERJTkcsCisgIFBST1BfU0VFS1BPSU5UUworfTsKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZmxhY2VuY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBmbGFjZW5jX2RlYnVnCisKKyNkZWZpbmUgZ3N0X2ZsYWNfZW5jX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RGbGFjRW5jLCBnc3RfZmxhY19lbmMsIEdTVF9UWVBFX0FVRElPX0VOQ09ERVIsCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9UQUdfU0VUVEVSLCBOVUxMKQorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfVE9DX1NFVFRFUiwgTlVMTCkKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ZsYWNfZW5jX3N0YXJ0IChHc3RBdWRpb0VuY29kZXIgKiBlbmMpOworc3RhdGljIGdib29sZWFuIGdzdF9mbGFjX2VuY19zdG9wIChHc3RBdWRpb0VuY29kZXIgKiBlbmMpOworc3RhdGljIGdib29sZWFuIGdzdF9mbGFjX2VuY19zZXRfZm9ybWF0IChHc3RBdWRpb0VuY29kZXIgKiBlbmMsCisgICAgR3N0QXVkaW9JbmZvICogaW5mbyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZmxhY19lbmNfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0VuY29kZXIgKiBlbmMsCisgICAgR3N0QnVmZmVyICogaW5fYnVmKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfZmxhY19lbmNfZ2V0Y2FwcyAoR3N0QXVkaW9FbmNvZGVyICogZW5jLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZmxhY19lbmNfc2lua19ldmVudCAoR3N0QXVkaW9FbmNvZGVyICogZW5jLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9mbGFjX2VuY19zaW5rX3F1ZXJ5IChHc3RBdWRpb0VuY29kZXIgKiBlbmMsCisgICAgR3N0UXVlcnkgKiBxdWVyeSk7CisKK3N0YXRpYyB2b2lkIGdzdF9mbGFjX2VuY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RDYXBzICpnc3RfZmxhY19lbmNfZ2VuZXJhdGVfc2lua19jYXBzICh2b2lkKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9mbGFjX2VuY191cGRhdGVfcXVhbGl0eSAoR3N0RmxhY0VuYyAqIGZsYWNlbmMsCisgICAgZ2ludCBxdWFsaXR5KTsKK3N0YXRpYyB2b2lkIGdzdF9mbGFjX2VuY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfZmxhY19lbmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgRkxBQ19fU3RyZWFtRW5jb2RlcldyaXRlU3RhdHVzCitnc3RfZmxhY19lbmNfd3JpdGVfY2FsbGJhY2sgKGNvbnN0IEZMQUNfX1N0cmVhbUVuY29kZXIgKiBlbmNvZGVyLAorICAgIGNvbnN0IEZMQUNfX2J5dGUgYnVmZmVyW10sIHNpemVfdCBieXRlcywKKyAgICB1bnNpZ25lZCBzYW1wbGVzLCB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lLCB2b2lkICpjbGllbnRfZGF0YSk7CitzdGF0aWMgRkxBQ19fU3RyZWFtRW5jb2RlclNlZWtTdGF0dXMKK2dzdF9mbGFjX2VuY19zZWVrX2NhbGxiYWNrIChjb25zdCBGTEFDX19TdHJlYW1FbmNvZGVyICogZW5jb2RlciwKKyAgICBGTEFDX191aW50NjQgYWJzb2x1dGVfYnl0ZV9vZmZzZXQsIHZvaWQgKmNsaWVudF9kYXRhKTsKK3N0YXRpYyBGTEFDX19TdHJlYW1FbmNvZGVyVGVsbFN0YXR1cworZ3N0X2ZsYWNfZW5jX3RlbGxfY2FsbGJhY2sgKGNvbnN0IEZMQUNfX1N0cmVhbUVuY29kZXIgKiBlbmNvZGVyLAorICAgIEZMQUNfX3VpbnQ2NCAqIGFic29sdXRlX2J5dGVfb2Zmc2V0LCB2b2lkICpjbGllbnRfZGF0YSk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGdib29sZWFuIGV4aGF1c3RpdmVfbW9kZWxfc2VhcmNoOworICBnYm9vbGVhbiBlc2NhcGVfY29kaW5nOworICBnYm9vbGVhbiBtaWRfc2lkZTsKKyAgZ2Jvb2xlYW4gbG9vc2VfbWlkX3NpZGU7CisgIGd1aW50IHFscF9jb2VmZl9wcmVjaXNpb247CisgIGdib29sZWFuIHFscF9jb2VmZl9wcmVjX3NlYXJjaDsKKyAgZ3VpbnQgbWluX3Jlc2lkdWFsX3BhcnRpdGlvbl9vcmRlcjsKKyAgZ3VpbnQgbWF4X3Jlc2lkdWFsX3BhcnRpdGlvbl9vcmRlcjsKKyAgZ3VpbnQgcmljZV9wYXJhbWV0ZXJfc2VhcmNoX2Rpc3Q7CisgIGd1aW50IG1heF9scGNfb3JkZXI7CisgIGd1aW50IGJsb2Nrc2l6ZTsKK30KK0dzdEZsYWNFbmNQYXJhbXM7CisKK3N0YXRpYyBjb25zdCBHc3RGbGFjRW5jUGFyYW1zIGZsYWNlbmNfcGFyYW1zW10gPSB7CisgIHtGQUxTRSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgMCwgRkFMU0UsIDIsIDIsIDAsIDAsIDExNTJ9LAorICB7RkFMU0UsIEZBTFNFLCBUUlVFLCBUUlVFLCAwLCBGQUxTRSwgMiwgMiwgMCwgMCwgMTE1Mn0sCisgIHtGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCAwLCBGQUxTRSwgMCwgMywgMCwgMCwgMTE1Mn0sCisgIHtGQUxTRSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgMCwgRkFMU0UsIDMsIDMsIDAsIDYsIDQ2MDh9LAorICB7RkFMU0UsIEZBTFNFLCBUUlVFLCBUUlVFLCAwLCBGQUxTRSwgMywgMywgMCwgOCwgNDYwOH0sCisgIHtGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCAwLCBGQUxTRSwgMywgMywgMCwgOCwgNDYwOH0sCisgIHtGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCAwLCBGQUxTRSwgMCwgNCwgMCwgOCwgNDYwOH0sCisgIHtUUlVFLCBGQUxTRSwgVFJVRSwgRkFMU0UsIDAsIEZBTFNFLCAwLCA2LCAwLCA4LCA0NjA4fSwKKyAge1RSVUUsIEZBTFNFLCBUUlVFLCBGQUxTRSwgMCwgRkFMU0UsIDAsIDYsIDAsIDEyLCA0NjA4fSwKKyAge1RSVUUsIFRSVUUsIFRSVUUsIEZBTFNFLCAwLCBGQUxTRSwgMCwgMTYsIDAsIDMyLCA0NjA4fSwKK307CisKKyNkZWZpbmUgREVGQVVMVF9RVUFMSVRZIDUKKyNkZWZpbmUgREVGQVVMVF9QQURESU5HIDAKKyNkZWZpbmUgREVGQVVMVF9TRUVLUE9JTlRTIC0xMAorCisjZGVmaW5lIEdTVF9UWVBFX0ZMQUNfRU5DX1FVQUxJVFkgKGdzdF9mbGFjX2VuY19xdWFsaXR5X2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfZmxhY19lbmNfcXVhbGl0eV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHF0eXBlID0gMDsKKworICBpZiAocXR5cGUgPT0gMCkgeworICAgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHZhbHVlc1tdID0geworICAgICAgezAsICIwIC0gRmFzdGVzdCBjb21wcmVzc2lvbiIsICIwIn0sCisgICAgICB7MSwgIjEiLCAiMSJ9LAorICAgICAgezIsICIyIiwgIjIifSwKKyAgICAgIHszLCAiMyIsICIzIn0sCisgICAgICB7NCwgIjQiLCAiNCJ9LAorICAgICAgezUsICI1IC0gRGVmYXVsdCIsICI1In0sCisgICAgICB7NiwgIjYiLCAiNiJ9LAorICAgICAgezcsICI3IiwgIjcifSwKKyAgICAgIHs4LCAiOCAtIEhpZ2hlc3QgY29tcHJlc3Npb24iLCAiOCJ9LAorICAgICAgezksICI5IC0gSW5zYW5lIiwgIjkifSwKKyAgICAgIHswLCBOVUxMLCBOVUxMfQorICAgIH07CisKKyAgICBxdHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RGbGFjRW5jUXVhbGl0eSIsIHZhbHVlcyk7CisgIH0KKyAgcmV0dXJuIHF0eXBlOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2ZsYWNfZW5jX2NsYXNzX2luaXQgKEdzdEZsYWNFbmNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0QXVkaW9FbmNvZGVyQ2xhc3MgKmJhc2VfY2xhc3M7CisgIEdzdENhcHMgKnNpbmtfY2FwczsKKyAgR3N0UGFkVGVtcGxhdGUgKnNpbmtfdGVtcGw7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBiYXNlX2NsYXNzID0gKEdzdEF1ZGlvRW5jb2RlckNsYXNzICopIChrbGFzcyk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGZsYWNlbmNfZGVidWcsICJmbGFjZW5jIiwgMCwKKyAgICAgICJGbGFjIGVuY29kaW5nIGVsZW1lbnQiKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfZmxhY19lbmNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfZmxhY19lbmNfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9mbGFjX2VuY19maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1FVQUxJVFksCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoInF1YWxpdHkiLAorICAgICAgICAgICJRdWFsaXR5IiwKKyAgICAgICAgICAiU3BlZWQgdmVyc3VzIGNvbXByZXNzaW9uIHRyYWRlb2ZmIiwKKyAgICAgICAgICBHU1RfVFlQRV9GTEFDX0VOQ19RVUFMSVRZLCBERUZBVUxUX1FVQUxJVFksCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfU1RSRUFNQUJMRV9TVUJTRVQsIGdfcGFyYW1fc3BlY19ib29sZWFuICgic3RyZWFtYWJsZS1zdWJzZXQiLAorICAgICAgICAgICJTdHJlYW1hYmxlIHN1YnNldCIsCisgICAgICAgICAgInRydWUgdG8gbGltaXQgZW5jb2RlciB0byBnZW5lcmF0aW5nIGEgU3Vic2V0IHN0cmVhbSwgZWxzZSBmYWxzZSIsCisgICAgICAgICAgVFJVRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX01JRF9TSURFX1NURVJFTywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgibWlkLXNpZGUtc3RlcmVvIiwgIkRvIG1pZCBzaWRlIHN0ZXJlbyIsCisgICAgICAgICAgIkRvIG1pZCBzaWRlIHN0ZXJlbyAob25seSBmb3Igc3RlcmVvIGlucHV0KSIsCisgICAgICAgICAgZmxhY2VuY19wYXJhbXNbREVGQVVMVF9RVUFMSVRZXS5taWRfc2lkZSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgUFJPUF9MT09TRV9NSURfU0lERV9TVEVSRU8sIGdfcGFyYW1fc3BlY19ib29sZWFuICgibG9vc2UtbWlkLXNpZGUtc3RlcmVvIiwKKyAgICAgICAgICAiTG9vc2UgbWlkIHNpZGUgc3RlcmVvIiwgIkxvb3NlIG1pZCBzaWRlIHN0ZXJlbyIsCisgICAgICAgICAgZmxhY2VuY19wYXJhbXNbREVGQVVMVF9RVUFMSVRZXS5sb29zZV9taWRfc2lkZSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0JMT0NLU0laRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiYmxvY2tzaXplIiwgIkJsb2Nrc2l6ZSIsICJCbG9ja3NpemUgaW4gc2FtcGxlcyIsCisgICAgICAgICAgRkxBQ19fTUlOX0JMT0NLX1NJWkUsIEZMQUNfX01BWF9CTE9DS19TSVpFLAorICAgICAgICAgIGZsYWNlbmNfcGFyYW1zW0RFRkFVTFRfUVVBTElUWV0uYmxvY2tzaXplLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfTUFYX0xQQ19PUkRFUiwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LWxwYy1vcmRlciIsICJNYXggTFBDIG9yZGVyIiwKKyAgICAgICAgICAiTWF4IExQQyBvcmRlcjsgMCA9PiB1c2Ugb25seSBmaXhlZCBwcmVkaWN0b3JzIiwgMCwKKyAgICAgICAgICBGTEFDX19NQVhfTFBDX09SREVSLCBmbGFjZW5jX3BhcmFtc1tERUZBVUxUX1FVQUxJVFldLm1heF9scGNfb3JkZXIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfUUxQX0NPRUZGX1BSRUNJU0lPTiwgZ19wYXJhbV9zcGVjX3VpbnQgKCJxbHAtY29lZmYtcHJlY2lzaW9uIiwKKyAgICAgICAgICAiUUxQIGNvZWZmaWNpZW50cyBwcmVjaXNpb24iLAorICAgICAgICAgICJQcmVjaXNpb24gaW4gYml0cyBvZiBxdWFudGl6ZWQgbGluZWFyLXByZWRpY3RvciBjb2VmZmljaWVudHM7IDAgPSBhdXRvbWF0aWMiLAorICAgICAgICAgIDAsIDMyLCBmbGFjZW5jX3BhcmFtc1tERUZBVUxUX1FVQUxJVFldLnFscF9jb2VmZl9wcmVjaXNpb24sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfUUxQX0NPRUZGX1BSRUNfU0VBUkNILCBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInFscC1jb2VmZi1wcmVjLXNlYXJjaCIsCisgICAgICAgICAgIkRvIFFMUCBjb2VmZmljaWVudHMgcHJlY2lzaW9uIHNlYXJjaCIsCisgICAgICAgICAgImZhbHNlID0gdXNlIHFscF9jb2VmZl9wcmVjaXNpb24sICIKKyAgICAgICAgICAidHJ1ZSA9IHNlYXJjaCBhcm91bmQgcWxwX2NvZWZmX3ByZWNpc2lvbiwgdGFrZSBiZXN0IiwKKyAgICAgICAgICBmbGFjZW5jX3BhcmFtc1tERUZBVUxUX1FVQUxJVFldLnFscF9jb2VmZl9wcmVjX3NlYXJjaCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0VTQ0FQRV9DT0RJTkcsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImVzY2FwZS1jb2RpbmciLCAiRG8gRXNjYXBlIGNvZGluZyIsCisgICAgICAgICAgInNlYXJjaCBmb3IgZXNjYXBlIGNvZGVzIGluIHRoZSBlbnRyb3B5IGNvZGluZyBzdGFnZSAiCisgICAgICAgICAgImZvciBzbGlnaHRseSBiZXR0ZXIgY29tcHJlc3Npb24iLAorICAgICAgICAgIGZsYWNlbmNfcGFyYW1zW0RFRkFVTFRfUVVBTElUWV0uZXNjYXBlX2NvZGluZywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgUFJPUF9FWEhBVVNUSVZFX01PREVMX1NFQVJDSCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZXhoYXVzdGl2ZS1tb2RlbC1zZWFyY2giLAorICAgICAgICAgICJEbyBleGhhdXN0aXZlIG1vZGVsIHNlYXJjaCIsCisgICAgICAgICAgImRvIGV4aGF1c3RpdmUgc2VhcmNoIG9mIExQIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbiAoZXhwZW5zaXZlISkiLAorICAgICAgICAgIGZsYWNlbmNfcGFyYW1zW0RFRkFVTFRfUVVBTElUWV0uZXhoYXVzdGl2ZV9tb2RlbF9zZWFyY2gsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfTUlOX1JFU0lEVUFMX1BBUlRJVElPTl9PUkRFUiwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWluLXJlc2lkdWFsLXBhcnRpdGlvbi1vcmRlciIsCisgICAgICAgICAgIk1pbiByZXNpZHVhbCBwYXJ0aXRpb24gb3JkZXIiLAorICAgICAgICAgICJNaW4gcmVzaWR1YWwgcGFydGl0aW9uIG9yZGVyIChhYm92ZSA0IGRvZXNuJ3QgdXN1YWxseSBoZWxwIG11Y2gpIiwgMCwKKyAgICAgICAgICAxNiwgZmxhY2VuY19wYXJhbXNbREVGQVVMVF9RVUFMSVRZXS5taW5fcmVzaWR1YWxfcGFydGl0aW9uX29yZGVyLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksCisgICAgICBQUk9QX01BWF9SRVNJRFVBTF9QQVJUSVRJT05fT1JERVIsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm1heC1yZXNpZHVhbC1wYXJ0aXRpb24tb3JkZXIiLAorICAgICAgICAgICJNYXggcmVzaWR1YWwgcGFydGl0aW9uIG9yZGVyIiwKKyAgICAgICAgICAiTWF4IHJlc2lkdWFsIHBhcnRpdGlvbiBvcmRlciAoYWJvdmUgNCBkb2Vzbid0IHVzdWFsbHkgaGVscCBtdWNoKSIsIDAsCisgICAgICAgICAgMTYsIGZsYWNlbmNfcGFyYW1zW0RFRkFVTFRfUVVBTElUWV0ubWF4X3Jlc2lkdWFsX3BhcnRpdGlvbl9vcmRlciwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgUFJPUF9SSUNFX1BBUkFNRVRFUl9TRUFSQ0hfRElTVCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgicmljZS1wYXJhbWV0ZXItc2VhcmNoLWRpc3QiLAorICAgICAgICAgICJyaWNlX3BhcmFtZXRlcl9zZWFyY2hfZGlzdCIsCisgICAgICAgICAgIjAgPSB0cnkgb25seSBjYWxjJ2QgcGFyYW1ldGVyIGs7IGVsc2UgdHJ5IGFsbCBbay1kaXN0Li5rK2Rpc3RdICIKKyAgICAgICAgICAicGFyYW1ldGVycywgdXNlIGJlc3QiLCAwLCBGTEFDX19NQVhfUklDRV9QQVJUSVRJT05fT1JERVIsCisgICAgICAgICAgZmxhY2VuY19wYXJhbXNbREVGQVVMVF9RVUFMSVRZXS5yaWNlX3BhcmFtZXRlcl9zZWFyY2hfZGlzdCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgUFJPUF9QQURESU5HLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJwYWRkaW5nIiwKKyAgICAgICAgICAiUGFkZGluZyIsCisgICAgICAgICAgIldyaXRlIGEgUEFERElORyBibG9jayB3aXRoIHRoaXMgbGVuZ3RoIGluIGJ5dGVzIiwgMCwgR19NQVhVSU5ULAorICAgICAgICAgIERFRkFVTFRfUEFERElORywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgUFJPUF9TRUVLUE9JTlRTLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInNlZWtwb2ludHMiLAorICAgICAgICAgICJTZWVrcG9pbnRzIiwKKyAgICAgICAgICAiQWRkIFNFRUtUQUJMRSBtZXRhZGF0YSAoaWYgPiAwLCBudW1iZXIgb2YgZW50cmllcywgaWYgPCAwLCBpbnRlcnZhbCBpbiBzZWMpIiwKKyAgICAgICAgICAtR19NQVhJTlQsIEdfTUFYSU5ULAorICAgICAgICAgIERFRkFVTFRfU0VFS1BPSU5UUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX2ZhY3RvcnkpOworCisgIHNpbmtfY2FwcyA9IGdzdF9mbGFjX2VuY19nZW5lcmF0ZV9zaW5rX2NhcHMgKCk7CisgIHNpbmtfdGVtcGwgPSBnc3RfcGFkX3RlbXBsYXRlX25ldyAoInNpbmsiLAorICAgICAgR1NUX1BBRF9TSU5LLCBHU1RfUEFEX0FMV0FZUywgc2lua19jYXBzKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgc2lua190ZW1wbCk7CisgIGdzdF9jYXBzX3VucmVmIChzaW5rX2NhcHMpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJGTEFDIGF1ZGlvIGVuY29kZXIiLAorICAgICAgIkNvZGVjL0VuY29kZXIvQXVkaW8iLAorICAgICAgIkVuY29kZXMgYXVkaW8gd2l0aCB0aGUgRkxBQyBsb3NzbGVzcyBhdWRpbyBlbmNvZGVyIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY2hlbGxvLmJlPiIpOworCisgIGJhc2VfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbGFjX2VuY19zdGFydCk7CisgIGJhc2VfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ZsYWNfZW5jX3N0b3ApOworICBiYXNlX2NsYXNzLT5zZXRfZm9ybWF0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbGFjX2VuY19zZXRfZm9ybWF0KTsKKyAgYmFzZV9jbGFzcy0+aGFuZGxlX2ZyYW1lID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbGFjX2VuY19oYW5kbGVfZnJhbWUpOworICBiYXNlX2NsYXNzLT5nZXRjYXBzID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbGFjX2VuY19nZXRjYXBzKTsKKyAgYmFzZV9jbGFzcy0+c2lua19ldmVudCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmxhY19lbmNfc2lua19ldmVudCk7CisgIGJhc2VfY2xhc3MtPnNpbmtfcXVlcnkgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ZsYWNfZW5jX3NpbmtfcXVlcnkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2ZsYWNfZW5jX2luaXQgKEdzdEZsYWNFbmMgKiBmbGFjZW5jKQoreworICBHc3RBdWRpb0VuY29kZXIgKmVuYyA9IEdTVF9BVURJT19FTkNPREVSIChmbGFjZW5jKTsKKworICBmbGFjZW5jLT5lbmNvZGVyID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfbmV3ICgpOworICBnc3RfZmxhY19lbmNfdXBkYXRlX3F1YWxpdHkgKGZsYWNlbmMsIERFRkFVTFRfUVVBTElUWSk7CisKKyAgLyogYXJyYW5nZSBncmFudWxlcG9zIG1hcmtpbmcgKGFuZCByZXF1aXJlZCBwZXJmZWN0IHRzKSAqLworICBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfbWFya19ncmFudWxlIChlbmMsIFRSVUUpOworICBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfcGVyZmVjdF90aW1lc3RhbXAgKGVuYywgVFJVRSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmxhY19lbmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEZsYWNFbmMgKmZsYWNlbmMgPSBHU1RfRkxBQ19FTkMgKG9iamVjdCk7CisKKyAgRkxBQ19fc3RyZWFtX2VuY29kZXJfZGVsZXRlIChmbGFjZW5jLT5lbmNvZGVyKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ZsYWNfZW5jX3N0YXJ0IChHc3RBdWRpb0VuY29kZXIgKiBlbmMpCit7CisgIEdzdEZsYWNFbmMgKmZsYWNlbmMgPSBHU1RfRkxBQ19FTkMgKGVuYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAic3RhcnQiKTsKKyAgZmxhY2VuYy0+c3RvcHBlZCA9IFRSVUU7CisgIGZsYWNlbmMtPmdvdF9oZWFkZXJzID0gRkFMU0U7CisgIGZsYWNlbmMtPmxhc3RfZmxvdyA9IEdTVF9GTE9XX09LOworICBmbGFjZW5jLT5vZmZzZXQgPSAwOworICBmbGFjZW5jLT5lb3MgPSBGQUxTRTsKKyAgZmxhY2VuYy0+dGFncyA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIGZsYWNlbmMtPnRvYyA9IE5VTEw7CisgIGZsYWNlbmMtPnNhbXBsZXNfaW4gPSAwOworICBmbGFjZW5jLT5zYW1wbGVzX291dCA9IDA7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ZsYWNfZW5jX3N0b3AgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYykKK3sKKyAgR3N0RmxhY0VuYyAqZmxhY2VuYyA9IEdTVF9GTEFDX0VOQyAoZW5jKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJzdG9wIik7CisgIGdzdF90YWdfbGlzdF91bnJlZiAoZmxhY2VuYy0+dGFncyk7CisgIGZsYWNlbmMtPnRhZ3MgPSBOVUxMOworICBpZiAoZmxhY2VuYy0+dG9jKQorICAgIGdzdF90b2NfdW5yZWYgKGZsYWNlbmMtPnRvYyk7CisgIGZsYWNlbmMtPnRvYyA9IE5VTEw7CisgIGlmIChGTEFDX19zdHJlYW1fZW5jb2Rlcl9nZXRfc3RhdGUgKGZsYWNlbmMtPmVuY29kZXIpICE9CisgICAgICBGTEFDX19TVFJFQU1fRU5DT0RFUl9VTklOSVRJQUxJWkVEKSB7CisgICAgZmxhY2VuYy0+c3RvcHBlZCA9IFRSVUU7CisgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfZmluaXNoIChmbGFjZW5jLT5lbmNvZGVyKTsKKyAgfQorICBpZiAoZmxhY2VuYy0+bWV0YSkgeworICAgIEZMQUNfX21ldGFkYXRhX29iamVjdF9kZWxldGUgKGZsYWNlbmMtPm1ldGFbMF0pOworCisgICAgaWYgKGZsYWNlbmMtPm1ldGFbMV0pCisgICAgICBGTEFDX19tZXRhZGF0YV9vYmplY3RfZGVsZXRlIChmbGFjZW5jLT5tZXRhWzFdKTsKKworICAgIGlmIChmbGFjZW5jLT5tZXRhWzJdKQorICAgICAgRkxBQ19fbWV0YWRhdGFfb2JqZWN0X2RlbGV0ZSAoZmxhY2VuYy0+bWV0YVsyXSk7CisKKyAgICBpZiAoZmxhY2VuYy0+bWV0YVszXSkKKyAgICAgIEZMQUNfX21ldGFkYXRhX29iamVjdF9kZWxldGUgKGZsYWNlbmMtPm1ldGFbM10pOworCisgICAgZ19mcmVlIChmbGFjZW5jLT5tZXRhKTsKKyAgICBmbGFjZW5jLT5tZXRhID0gTlVMTDsKKyAgfQorICBnX2xpc3RfZm9yZWFjaCAoZmxhY2VuYy0+aGVhZGVycywgKEdGdW5jKSBnc3RfbWluaV9vYmplY3RfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoZmxhY2VuYy0+aGVhZGVycyk7CisgIGZsYWNlbmMtPmhlYWRlcnMgPSBOVUxMOworCisgIGdzdF90YWdfc2V0dGVyX3Jlc2V0X3RhZ3MgKEdTVF9UQUdfU0VUVEVSIChlbmMpKTsKKyAgZ3N0X3RvY19zZXR0ZXJfcmVzZXQgKEdTVF9UT0NfU0VUVEVSIChlbmMpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2FkZF9vbmVfdGFnIChjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwgY29uc3QgZ2NoYXIgKiB0YWcsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR0xpc3QgKmNvbW1lbnRzOworICBHTGlzdCAqaXQ7CisgIEdzdEZsYWNFbmMgKmZsYWNlbmMgPSBHU1RfRkxBQ19FTkMgKHVzZXJfZGF0YSk7CisKKyAgLyogSU1BR0UgYW5kIFBSRVZJRVdfSU1BR0UgdGFncyBhcmUgYWxyZWFkeSB3cml0dGVuCisgICAqIGRpZmZlcmVudGx5LCBubyBuZWVkIHRvIHN0b3JlIHRoZW0gaW5zaWRlIHRoZQorICAgKiB2b3JiaXNjb21tZW50cyB0b28gKi8KKyAgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX0lNQUdFKSA9PSAwCisgICAgICB8fCBzdHJjbXAgKHRhZywgR1NUX1RBR19QUkVWSUVXX0lNQUdFKSA9PSAwKQorICAgIHJldHVybjsKKworICBjb21tZW50cyA9IGdzdF90YWdfdG9fdm9yYmlzX2NvbW1lbnRzIChsaXN0LCB0YWcpOworICBmb3IgKGl0ID0gY29tbWVudHM7IGl0ICE9IE5VTEw7IGl0ID0gaXQtPm5leHQpIHsKKyAgICBGTEFDX19TdHJlYW1NZXRhZGF0YV9Wb3JiaXNDb21tZW50X0VudHJ5IGNvbW1tZW50X2VudHJ5OworCisgICAgY29tbW1lbnRfZW50cnkubGVuZ3RoID0gc3RybGVuIChpdC0+ZGF0YSk7CisgICAgY29tbW1lbnRfZW50cnkuZW50cnkgPSBpdC0+ZGF0YTsKKyAgICBGTEFDX19tZXRhZGF0YV9vYmplY3Rfdm9yYmlzY29tbWVudF9pbnNlcnRfY29tbWVudCAoZmxhY2VuYy0+bWV0YVswXSwKKyAgICAgICAgZmxhY2VuYy0+bWV0YVswXS0+ZGF0YS52b3JiaXNfY29tbWVudC5udW1fY29tbWVudHMsCisgICAgICAgIGNvbW1tZW50X2VudHJ5LCBUUlVFKTsKKyAgICBnX2ZyZWUgKGl0LT5kYXRhKTsKKyAgfQorICBnX2xpc3RfZnJlZSAoY29tbWVudHMpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2FkZF9jdWVzaGVldCAoY29uc3QgR3N0VG9jICogdG9jLCBndWludCBzYW1wbGVfcmF0ZSwKKyAgICBGTEFDX19TdHJlYW1NZXRhZGF0YSAqIGN1ZXNoZWV0KQoreworICBnaW50OCB0cmFja19udW0gPSAwOworICBnaW50NjQgc3RhcnQsIHN0b3A7CisgIGdjaGFyICppc3JjID0gTlVMTDsKKyAgY29uc3QgZ2NoYXIgKmlzX2xlZ2FsOworICBHTGlzdCAqbGlzdDsKKyAgR3N0VGFnTGlzdCAqdGFnczsKKyAgR3N0VG9jRW50cnkgKmVudHJ5LCAqc3ViZW50cnkgPSBOVUxMOworICBGTEFDX19TdHJlYW1NZXRhZGF0YV9DdWVTaGVldCAqY3M7CisgIEZMQUNfX1N0cmVhbU1ldGFkYXRhX0N1ZVNoZWV0X1RyYWNrICp0cmFjazsKKworICBjcyA9ICZjdWVzaGVldC0+ZGF0YS5jdWVfc2hlZXQ7CisgIGlmICghY3MpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIGNoZWNrIGlmIHRoZSBUT0MgZW50cmllcyBpcyB2YWxpZCAqLworICBsaXN0ID0gZ3N0X3RvY19nZXRfZW50cmllcyAodG9jKTsKKyAgZW50cnkgPSBsaXN0LT5kYXRhOworICBpZiAoZ3N0X3RvY19lbnRyeV9pc19hbHRlcm5hdGl2ZSAoZW50cnkpKSB7CisgICAgbGlzdCA9IGdzdF90b2NfZW50cnlfZ2V0X3N1Yl9lbnRyaWVzIChlbnRyeSk7CisgICAgd2hpbGUgKGxpc3QpIHsKKyAgICAgIHN1YmVudHJ5ID0gbGlzdC0+ZGF0YTsKKyAgICAgIGlmICghZ3N0X3RvY19lbnRyeV9pc19zZXF1ZW5jZSAoc3ViZW50cnkpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBsaXN0ID0gZ19saXN0X25leHQgKGxpc3QpOworICAgIH0KKyAgICBsaXN0ID0gZ3N0X3RvY19lbnRyeV9nZXRfc3ViX2VudHJpZXMgKGVudHJ5KTsKKyAgfQorICBpZiAoZ3N0X3RvY19lbnRyeV9pc19zZXF1ZW5jZSAoZW50cnkpKSB7CisgICAgd2hpbGUgKGxpc3QpIHsKKyAgICAgIGVudHJ5ID0gbGlzdC0+ZGF0YTsKKyAgICAgIGlmICghZ3N0X3RvY19lbnRyeV9pc19zZXF1ZW5jZSAoZW50cnkpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBsaXN0ID0gZ19saXN0X25leHQgKGxpc3QpOworICAgIH0KKyAgICBsaXN0ID0gZ3N0X3RvY19nZXRfZW50cmllcyAodG9jKTsKKyAgfQorCisgIC8qIGFkZCB0cmFja3MgaW4gY3Vlc2hlZXQgKi8KKyAgd2hpbGUgKGxpc3QpIHsKKyAgICBlbnRyeSA9IGxpc3QtPmRhdGE7CisgICAgZ3N0X3RvY19lbnRyeV9nZXRfc3RhcnRfc3RvcF90aW1lcyAoZW50cnksICZzdGFydCwgJnN0b3ApOworICAgIHRhZ3MgPSBnc3RfdG9jX2VudHJ5X2dldF90YWdzIChlbnRyeSk7CisgICAgaWYgKHRhZ3MpCisgICAgICBnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAodGFncywgR1NUX1RBR19JU1JDLCAmaXNyYyk7CisgICAgdHJhY2sgPSBGTEFDX19tZXRhZGF0YV9vYmplY3RfY3Vlc2hlZXRfdHJhY2tfbmV3ICgpOworICAgIHRyYWNrLT5vZmZzZXQgPQorICAgICAgICAoRkxBQ19fdWludDY0KSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKHN0YXJ0LCBzYW1wbGVfcmF0ZSwKKyAgICAgICAgR1NUX1NFQ09ORCk7CisgICAgdHJhY2stPm51bWJlciA9IChGTEFDX19ieXRlKSB0cmFja19udW0gKyAxOworICAgIGlmIChpc3JjICE9IE5VTEwgJiYgc3RybGVuIChpc3JjKSA8PSAxMikKKyAgICAgIGdfc3RybGNweSAodHJhY2stPmlzcmMsIGlzcmMsIDEzKTsKKyAgICBpZiAodHJhY2stPm51bWJlciA8PSAwKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmICghRkxBQ19fbWV0YWRhdGFfb2JqZWN0X2N1ZXNoZWV0X2luc2VydF90cmFjayAoY3Vlc2hlZXQsIHRyYWNrX251bSwKKyAgICAgICAgICAgIHRyYWNrLCBGQUxTRSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFGTEFDX19tZXRhZGF0YV9vYmplY3RfY3Vlc2hlZXRfdHJhY2tfaW5zZXJ0X2JsYW5rX2luZGV4IChjdWVzaGVldCwKKyAgICAgICAgICAgIHRyYWNrX251bSwgMCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgdHJhY2tfbnVtKys7CisgICAgbGlzdCA9IGdfbGlzdF9uZXh0IChsaXN0KTsKKyAgfQorCisgIGlmIChjcy0+bnVtX3RyYWNrcyA8PSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBhZGQgbGVhZC1vdXQgdHJhY2sgaW4gY3Vlc2hlZXQgKi8KKyAgdHJhY2sgPSBGTEFDX19tZXRhZGF0YV9vYmplY3RfY3Vlc2hlZXRfdHJhY2tfbmV3ICgpOworICB0cmFjay0+b2Zmc2V0ID0KKyAgICAgIChGTEFDX191aW50NjQpIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAoc3RvcCwgc2FtcGxlX3JhdGUsCisgICAgICBHU1RfU0VDT05EKTsKKyAgdHJhY2stPm51bWJlciA9IDI1NTsKKyAgaWYgKCFGTEFDX19tZXRhZGF0YV9vYmplY3RfY3Vlc2hlZXRfaW5zZXJ0X3RyYWNrIChjdWVzaGVldCwgY3MtPm51bV90cmFja3MsCisgICAgICAgICAgdHJhY2ssIEZBTFNFKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogY2hlY2sgaWYgdGhlIGN1ZXNoZWV0IGlzIHZhbGlkICovCisgIGlmICghRkxBQ19fbWV0YWRhdGFfb2JqZWN0X2N1ZXNoZWV0X2lzX2xlZ2FsIChjdWVzaGVldCwgRkFMU0UsICZpc19sZWdhbCkpIHsKKyAgICBnX3dhcm5pbmcgKCIlc1xuIiwgaXNfbGVnYWwpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2ZsYWNfZW5jX3NldF9tZXRhZGF0YSAoR3N0RmxhY0VuYyAqIGZsYWNlbmMsIEdzdEF1ZGlvSW5mbyAqIGluZm8sCisgICAgZ3VpbnQ2NCB0b3RhbF9zYW1wbGVzKQoreworICBjb25zdCBHc3RUYWdMaXN0ICp1c2VyX3RhZ3M7CisgIEdzdFRhZ0xpc3QgKmNvcHk7CisgIGdpbnQgZW50cmllcyA9IDE7CisgIGdpbnQgbl9pbWFnZXMsIG5fcHJldmlld19pbWFnZXM7CisgIEZMQUNfX1N0cmVhbU1ldGFkYXRhICpjdWVzaGVldDsKKworICBnX3JldHVybl9pZl9mYWlsIChmbGFjZW5jICE9IE5VTEwpOworCisgIHVzZXJfdGFncyA9IGdzdF90YWdfc2V0dGVyX2dldF90YWdfbGlzdCAoR1NUX1RBR19TRVRURVIgKGZsYWNlbmMpKTsKKyAgaWYgKChmbGFjZW5jLT50YWdzID09IE5VTEwpICYmICh1c2VyX3RhZ3MgPT0gTlVMTCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgY29weSA9IGdzdF90YWdfbGlzdF9tZXJnZSAodXNlcl90YWdzLCBmbGFjZW5jLT50YWdzLAorICAgICAgZ3N0X3RhZ19zZXR0ZXJfZ2V0X3RhZ19tZXJnZV9tb2RlIChHU1RfVEFHX1NFVFRFUiAoZmxhY2VuYykpKTsKKyAgbl9pbWFnZXMgPSBnc3RfdGFnX2xpc3RfZ2V0X3RhZ19zaXplIChjb3B5LCBHU1RfVEFHX0lNQUdFKTsKKyAgbl9wcmV2aWV3X2ltYWdlcyA9IGdzdF90YWdfbGlzdF9nZXRfdGFnX3NpemUgKGNvcHksIEdTVF9UQUdfUFJFVklFV19JTUFHRSk7CisKKyAgZmxhY2VuYy0+bWV0YSA9CisgICAgICBnX25ldzAgKEZMQUNfX1N0cmVhbU1ldGFkYXRhICosIDQgKyBuX2ltYWdlcyArIG5fcHJldmlld19pbWFnZXMpOworCisgIGZsYWNlbmMtPm1ldGFbMF0gPQorICAgICAgRkxBQ19fbWV0YWRhdGFfb2JqZWN0X25ldyAoRkxBQ19fTUVUQURBVEFfVFlQRV9WT1JCSVNfQ09NTUVOVCk7CisgIGdzdF90YWdfbGlzdF9mb3JlYWNoIChjb3B5LCBhZGRfb25lX3RhZywgZmxhY2VuYyk7CisKKyAgaWYgKCFmbGFjZW5jLT50b2MpCisgICAgZmxhY2VuYy0+dG9jID0gZ3N0X3RvY19zZXR0ZXJfZ2V0X3RvYyAoR1NUX1RPQ19TRVRURVIgKGZsYWNlbmMpKTsKKworICBpZiAoZmxhY2VuYy0+dG9jKSB7CisgICAgY3Vlc2hlZXQgPSBGTEFDX19tZXRhZGF0YV9vYmplY3RfbmV3IChGTEFDX19NRVRBREFUQV9UWVBFX0NVRVNIRUVUKTsKKyAgICBpZiAoYWRkX2N1ZXNoZWV0IChmbGFjZW5jLT50b2MsIEdTVF9BVURJT19JTkZPX1JBVEUgKGluZm8pLCBjdWVzaGVldCkpIHsKKyAgICAgIGZsYWNlbmMtPm1ldGFbZW50cmllc10gPSBjdWVzaGVldDsKKyAgICAgIGVudHJpZXMrKzsKKyAgICB9IGVsc2UgeworICAgICAgRkxBQ19fbWV0YWRhdGFfb2JqZWN0X2RlbGV0ZSAoY3Vlc2hlZXQpOworICAgICAgZmxhY2VuYy0+bWV0YVtlbnRyaWVzXSA9IE5VTEw7CisgICAgfQorICB9CisKKyAgaWYgKG5faW1hZ2VzICsgbl9wcmV2aWV3X2ltYWdlcyA+IDApIHsKKyAgICBHc3RTYW1wbGUgKnNhbXBsZTsKKyAgICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgICBHc3RDYXBzICpjYXBzOworICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICAgIEdzdFRhZ0ltYWdlVHlwZSBpbWFnZV90eXBlID0gR1NUX1RBR19JTUFHRV9UWVBFX05PTkU7CisgICAgZ2ludCBpLCB3aWR0aCA9IDAsIGhlaWdodCA9IDAsIHBuZ19pY29uX2NvdW50ID0gMCwgb3RoZXJfaWNvbl9jb3VudCA9IDA7CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbl9pbWFnZXMgKyBuX3ByZXZpZXdfaW1hZ2VzOyBpKyspIHsKKyAgICAgIGdib29sZWFuIGlzX3ByZXZpZXdfaW1hZ2UgPSAoaSA+PSBuX2ltYWdlcyk7CisKKyAgICAgIGlmIChpIDwgbl9pbWFnZXMpIHsKKyAgICAgICAgaWYgKCFnc3RfdGFnX2xpc3RfZ2V0X3NhbXBsZV9pbmRleCAoY29weSwgR1NUX1RBR19JTUFHRSwgaSwgJnNhbXBsZSkpCisgICAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWdzdF90YWdfbGlzdF9nZXRfc2FtcGxlX2luZGV4IChjb3B5LCBHU1RfVEFHX1BSRVZJRVdfSU1BR0UsCisgICAgICAgICAgICAgICAgaSAtIG5faW1hZ2VzLCAmc2FtcGxlKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgc3RydWN0dXJlID0gZ3N0X3NhbXBsZV9nZXRfaW5mbyAoc2FtcGxlKTsKKyAgICAgIGNhcHMgPSBnc3Rfc2FtcGxlX2dldF9jYXBzIChzYW1wbGUpOworICAgICAgaWYgKCFjYXBzKSB7CisgICAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKGZsYWNlbmMsICJJbWFnZSB0YWcgd2l0aG91dCBjYXBzIik7CisgICAgICAgIGdzdF9zYW1wbGVfdW5yZWYgKHNhbXBsZSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBmbGFjZW5jLT5tZXRhW2VudHJpZXNdID0KKyAgICAgICAgICBGTEFDX19tZXRhZGF0YV9vYmplY3RfbmV3IChGTEFDX19NRVRBREFUQV9UWVBFX1BJQ1RVUkUpOworCisgICAgICBHU1RfTE9HX09CSkVDVCAoZmxhY2VuYywgImltYWdlIGluZm86ICUiIEdTVF9QVFJfRk9STUFULCBzdHJ1Y3R1cmUpOworCisgICAgICBpZiAoc3RydWN0dXJlKQorICAgICAgICBnc3Rfc3RydWN0dXJlX2dldCAoc3RydWN0dXJlLCAiaW1hZ2UtdHlwZSIsIEdTVF9UWVBFX1RBR19JTUFHRV9UWVBFLAorICAgICAgICAgICAgJmltYWdlX3R5cGUsIE5VTEwpOworICAgICAgZWxzZQorICAgICAgICBpbWFnZV90eXBlID0gR1NUX1RBR19JTUFHRV9UWVBFX05PTkU7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChmbGFjZW5jLCAiaW1hZ2UgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgICAgICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0IChzdHJ1Y3R1cmUsICJ3aWR0aCIsIEdfVFlQRV9JTlQsICZ3aWR0aCwKKyAgICAgICAgICAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgJmhlaWdodCwgTlVMTCk7CisKKyAgICAgIC8qIENvbnZlcnQgdG8gSUQzdjIgQVBJQyBpbWFnZSB0eXBlICovCisgICAgICBpZiAoaW1hZ2VfdHlwZSA9PSBHU1RfVEFHX0lNQUdFX1RZUEVfTk9ORSkgeworICAgICAgICBpZiAoaXNfcHJldmlld19pbWFnZSkgeworICAgICAgICAgIC8qIDEgLSAzMngzMiBwaXhlbHMgJ2ZpbGUgaWNvbicgKFBORyBvbmx5KQorICAgICAgICAgICAqIDIgLSBPdGhlciBmaWxlIGljb24KKyAgICAgICAgICAgKiBUaGVyZSBtYXkgb25seSBiZSBvbmUgZWFjaCBvZiBwaWN0dXJlIHR5cGUgMSBhbmQgMiBpbiBhIGZpbGUuICovCisgICAgICAgICAgaWYgKHdpZHRoID09IDMyICYmIGhlaWdodCA9PSAzMgorICAgICAgICAgICAgICAmJiBnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzdHJ1Y3R1cmUsICJpbWFnZS9wbmciKQorICAgICAgICAgICAgICAmJiBwbmdfaWNvbl9jb3VudCsrID09IDApIHsKKyAgICAgICAgICAgIGltYWdlX3R5cGUgPSAxOworICAgICAgICAgIH0gZWxzZSBpZiAod2lkdGggPD0gMzIgJiYgaGVpZ2h0IDw9IDMyICYmIG90aGVyX2ljb25fY291bnQrKyA9PSAwKSB7CisgICAgICAgICAgICBpbWFnZV90eXBlID0gMjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW1hZ2VfdHlwZSA9IDA7ICAgICAvKiBPdGhlciAqLworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbWFnZV90eXBlID0gMDsgICAgICAgLyogT3RoZXIgKi8KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogR1N0cmVhbWVyIGVudW0gaXMgdGhlIHNhbWUgYnV0IHdpdGhvdXQgdGhlIHR3byBpY29uIHR5cGVzIDErMiAqLworICAgICAgICBpbWFnZV90eXBlID0gaW1hZ2VfdHlwZSArIDI7CisgICAgICB9CisKKyAgICAgIGJ1ZmZlciA9IGdzdF9zYW1wbGVfZ2V0X2J1ZmZlciAoc2FtcGxlKTsKKyAgICAgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICBGTEFDX19tZXRhZGF0YV9vYmplY3RfcGljdHVyZV9zZXRfZGF0YSAoZmxhY2VuYy0+bWV0YVtlbnRyaWVzXSwKKyAgICAgICAgICBtYXAuZGF0YSwgbWFwLnNpemUsIFRSVUUpOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKGZsYWNlbmMsICJTZXR0aW5nIHBpY3R1cmUgdHlwZSAlZCIsIGltYWdlX3R5cGUpOworICAgICAgZmxhY2VuYy0+bWV0YVtlbnRyaWVzXS0+ZGF0YS5waWN0dXJlLnR5cGUgPSBpbWFnZV90eXBlOworCisgICAgICBpZiAod2lkdGggPiAwICYmIGhlaWdodCA+IDApIHsKKyAgICAgICAgZmxhY2VuYy0+bWV0YVtlbnRyaWVzXS0+ZGF0YS5waWN0dXJlLndpZHRoID0gd2lkdGg7CisgICAgICAgIGZsYWNlbmMtPm1ldGFbZW50cmllc10tPmRhdGEucGljdHVyZS5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICB9CisKKyAgICAgIEZMQUNfX21ldGFkYXRhX29iamVjdF9waWN0dXJlX3NldF9taW1lX3R5cGUgKGZsYWNlbmMtPm1ldGFbZW50cmllc10sCisgICAgICAgICAgKGNoYXIgKikgZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3RydWN0dXJlKSwgVFJVRSk7CisKKyAgICAgIGdzdF9zYW1wbGVfdW5yZWYgKHNhbXBsZSk7CisgICAgICBlbnRyaWVzKys7CisgICAgfQorICB9CisKKyAgaWYgKGZsYWNlbmMtPnNlZWtwb2ludHMgJiYgdG90YWxfc2FtcGxlcyAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgZ2Jvb2xlYW4gcmVzOworICAgIGd1aW50IHNhbXBsZXM7CisKKyAgICBmbGFjZW5jLT5tZXRhW2VudHJpZXNdID0KKyAgICAgICAgRkxBQ19fbWV0YWRhdGFfb2JqZWN0X25ldyAoRkxBQ19fTUVUQURBVEFfVFlQRV9TRUVLVEFCTEUpOworICAgIGlmIChmbGFjZW5jLT5zZWVrcG9pbnRzID4gMCkgeworICAgICAgcmVzID0KKyAgICAgICAgICBGTEFDX19tZXRhZGF0YV9vYmplY3Rfc2Vla3RhYmxlX3RlbXBsYXRlX2FwcGVuZF9zcGFjZWRfcG9pbnRzCisgICAgICAgICAgKGZsYWNlbmMtPm1ldGFbZW50cmllc10sIGZsYWNlbmMtPnNlZWtwb2ludHMsIHRvdGFsX3NhbXBsZXMpOworICAgIH0gZWxzZSB7CisgICAgICBzYW1wbGVzID0gLWZsYWNlbmMtPnNlZWtwb2ludHMgKiBHU1RfQVVESU9fSU5GT19SQVRFIChpbmZvKTsKKyAgICAgIHJlcyA9CisgICAgICAgICAgRkxBQ19fbWV0YWRhdGFfb2JqZWN0X3NlZWt0YWJsZV90ZW1wbGF0ZV9hcHBlbmRfc3BhY2VkX3BvaW50c19ieV9zYW1wbGVzCisgICAgICAgICAgKGZsYWNlbmMtPm1ldGFbZW50cmllc10sIHNhbXBsZXMsIHRvdGFsX3NhbXBsZXMpOworICAgIH0KKyAgICBpZiAoIXJlcykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY2VuYywgImFkZGluZyBzZWVrcG9pbnQgdGVtcGxhdGUgJWQgZmFpbGVkIiwKKyAgICAgICAgICBmbGFjZW5jLT5zZWVrcG9pbnRzKTsKKyAgICAgIEZMQUNfX21ldGFkYXRhX29iamVjdF9kZWxldGUgKGZsYWNlbmMtPm1ldGFbMV0pOworICAgICAgZmxhY2VuYy0+bWV0YVtlbnRyaWVzXSA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIGVudHJpZXMrKzsKKyAgICB9CisgIH0gZWxzZSBpZiAoZmxhY2VuYy0+c2Vla3BvaW50cyAmJiB0b3RhbF9zYW1wbGVzID09IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGZsYWNlbmMsICJ0b3RhbCB0aW1lIHVua25vd247IGNhbiBub3QgYWRkIHNlZWtwb2ludHMiKTsKKyAgfQorCisgIGlmIChmbGFjZW5jLT5wYWRkaW5nID4gMCkgeworICAgIGZsYWNlbmMtPm1ldGFbZW50cmllc10gPQorICAgICAgICBGTEFDX19tZXRhZGF0YV9vYmplY3RfbmV3IChGTEFDX19NRVRBREFUQV9UWVBFX1BBRERJTkcpOworICAgIGZsYWNlbmMtPm1ldGFbZW50cmllc10tPmxlbmd0aCA9IGZsYWNlbmMtPnBhZGRpbmc7CisgICAgZW50cmllcysrOworICB9CisKKyAgaWYgKEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9tZXRhZGF0YSAoZmxhY2VuYy0+ZW5jb2RlciwKKyAgICAgICAgICBmbGFjZW5jLT5tZXRhLCBlbnRyaWVzKSAhPSB0cnVlKQorICAgIGdfd2FybmluZyAoIkR1ZGUsIGknbSBhbHJlYWR5IGluaXRpYWxpemVkISIpOworCisgIGdzdF90YWdfbGlzdF91bnJlZiAoY29weSk7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9mbGFjX2VuY19nZW5lcmF0ZV9zaW5rX2NhcHMgKHZvaWQpCit7CisgIEdzdENhcHMgKnJldDsKKyAgZ2ludCBpOworICBHVmFsdWUgdl9saXN0ID0geyAwLCB9OworICBHVmFsdWUgdiA9IHsgMCwgfTsKKyAgR3N0U3RydWN0dXJlICpzLCAqczI7CisKKyAgZ192YWx1ZV9pbml0ICgmdl9saXN0LCBHU1RfVFlQRV9MSVNUKTsKKyAgZ192YWx1ZV9pbml0ICgmdiwgR19UWVBFX1NUUklORyk7CisKKyAgLyogVXNlIHN5c3RlbSdzIGVuZGlhbm5lc3MgKi8KKyAgZ192YWx1ZV9zZXRfc3RhdGljX3N0cmluZyAoJnYsICJTOCIpOworICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZ2X2xpc3QsICZ2KTsKKyAgZ192YWx1ZV9zZXRfc3RhdGljX3N0cmluZyAoJnYsIEdTVF9BVURJT19ORSAoUzE2KSk7CisgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJnZfbGlzdCwgJnYpOworICBnX3ZhbHVlX3NldF9zdGF0aWNfc3RyaW5nICgmdiwgR1NUX0FVRElPX05FIChTMjQpKTsKKyAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmdl9saXN0LCAmdik7CisgIGdfdmFsdWVfc2V0X3N0YXRpY19zdHJpbmcgKCZ2LCBHU1RfQVVESU9fTkUgKFMyNF8zMikpOworICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZ2X2xpc3QsICZ2KTsKKyAgZ192YWx1ZV91bnNldCAoJnYpOworCisgIHMgPSBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoImF1ZGlvL3gtcmF3Iik7CisgIGdzdF9zdHJ1Y3R1cmVfdGFrZV92YWx1ZSAocywgImZvcm1hdCIsICZ2X2xpc3QpOworCisgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwKKyAgICAgICJyYXRlIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCA2NTUzNTAsIE5VTEwpOworCisgIHJldCA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKyAgczIgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHMpOworICBnc3Rfc3RydWN0dXJlX3NldCAoczIsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDEsIE5VTEwpOworICBnc3RfY2Fwc19hcHBlbmRfc3RydWN0dXJlIChyZXQsIHMyKTsKKyAgZm9yIChpID0gMjsgaSA8PSA4OyBpKyspIHsKKyAgICBndWludDY0IGNoYW5uZWxfbWFzazsKKworICAgIHMyID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChzKTsKKyAgICBnc3RfYXVkaW9fY2hhbm5lbF9wb3NpdGlvbnNfdG9fbWFzayAoY2hhbm5lbF9wb3NpdGlvbnNbaSAtIDFdLCBpLAorICAgICAgICBGQUxTRSwgJmNoYW5uZWxfbWFzayk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMyLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBpLCAiY2hhbm5lbC1tYXNrIiwKKyAgICAgICAgR1NUX1RZUEVfQklUTUFTSywgY2hhbm5lbF9tYXNrLCBOVUxMKTsKKworICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKHJldCwgczIpOworICB9CisgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2ZsYWNfZW5jX2dldGNhcHMgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqcmV0ID0gTlVMTCwgKmNhcHMgPSBOVUxMOworICBHc3RQYWQgKnBhZDsKKworICBwYWQgPSBHU1RfQVVESU9fRU5DT0RFUl9TSU5LX1BBRCAoZW5jKTsKKworICByZXQgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHBhZCk7CisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIHJldCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChwYWQpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiUmV0dXJuIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIHJldCk7CisKKyAgY2FwcyA9IGdzdF9hdWRpb19lbmNvZGVyX3Byb3h5X2dldGNhcHMgKGVuYywgcmV0LCBmaWx0ZXIpOworICBnc3RfY2Fwc191bnJlZiAocmV0KTsKKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIGd1aW50NjQKK2dzdF9mbGFjX2VuY19wZWVyX3F1ZXJ5X3RvdGFsX3NhbXBsZXMgKEdzdEZsYWNFbmMgKiBmbGFjZW5jLCBHc3RQYWQgKiBwYWQpCit7CisgIGdpbnQ2NCBkdXJhdGlvbjsKKyAgR3N0QXVkaW9JbmZvICppbmZvID0KKyAgICAgIGdzdF9hdWRpb19lbmNvZGVyX2dldF9hdWRpb19pbmZvIChHU1RfQVVESU9fRU5DT0RFUiAoZmxhY2VuYykpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNlbmMsICJxdWVyeWluZyBwZWVyIGZvciBERUZBVUxUIGZvcm1hdCBkdXJhdGlvbiIpOworICBpZiAoZ3N0X3BhZF9wZWVyX3F1ZXJ5X2R1cmF0aW9uIChwYWQsIEdTVF9GT1JNQVRfREVGQVVMVCwgJmR1cmF0aW9uKQorICAgICAgJiYgZHVyYXRpb24gIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICBnb3RvIGRvbmU7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY2VuYywgInF1ZXJ5aW5nIHBlZXIgZm9yIFRJTUUgZm9ybWF0IGR1cmF0aW9uIik7CisKKyAgaWYgKGdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAocGFkLCBHU1RfRk9STUFUX1RJTUUsICZkdXJhdGlvbikKKyAgICAgICYmIGR1cmF0aW9uICE9IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjZW5jLCAicGVlciByZXBvcnRlZCBkdXJhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGR1cmF0aW9uKSk7CisgICAgZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9UT19GUkFNRVMgKGR1cmF0aW9uLCBHU1RfQVVESU9fSU5GT19SQVRFIChpbmZvKSk7CisKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChmbGFjZW5jLCAiVXBzdHJlYW0gcmVwb3J0ZWQgbm8gdG90YWwgc2FtcGxlcyIpOworICByZXR1cm4gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworZG9uZToKKyAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY2VuYywKKyAgICAgICJVcHN0cmVhbSByZXBvcnRlZCAlIiBHX0dVSU5UNjRfRk9STUFUICIgdG90YWwgc2FtcGxlcyIsIGR1cmF0aW9uKTsKKworICByZXR1cm4gZHVyYXRpb247Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ZsYWNfZW5jX3NldF9mb3JtYXQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgR3N0RmxhY0VuYyAqZmxhY2VuYzsKKyAgZ3VpbnQ2NCB0b3RhbF9zYW1wbGVzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgRkxBQ19fU3RyZWFtRW5jb2RlckluaXRTdGF0dXMgaW5pdF9zdGF0dXM7CisKKyAgZmxhY2VuYyA9IEdTVF9GTEFDX0VOQyAoZW5jKTsKKworICAvKiBpZiBjb25maWd1cmVkIGFnYWluLCBtZWFucyBzb21ldGhpbmcgY2hhbmdlZCwgY2FuJ3QgaGFuZGxlIHRoYXQgKi8KKyAgaWYgKEZMQUNfX3N0cmVhbV9lbmNvZGVyX2dldF9zdGF0ZSAoZmxhY2VuYy0+ZW5jb2RlcikgIT0KKyAgICAgIEZMQUNfX1NUUkVBTV9FTkNPREVSX1VOSU5JVElBTElaRUQpCisgICAgZ290byBlbmNvZGVyX2FscmVhZHlfaW5pdGlhbGl6ZWQ7CisKKyAgLyogZGVsYXkgc2V0dGluZyBvdXRwdXQgY2Fwcy9mb3JtYXQgdW50aWwgd2UgaGF2ZSBhbGwgaGVhZGVycyAqLworCisgIGdzdF9hdWRpb19nZXRfY2hhbm5lbF9yZW9yZGVyX21hcCAoR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKGluZm8pLAorICAgICAgY2hhbm5lbF9wb3NpdGlvbnNbR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKGluZm8pIC0gMV0sIGluZm8tPnBvc2l0aW9uLAorICAgICAgZmxhY2VuYy0+Y2hhbm5lbF9yZW9yZGVyX21hcCk7CisKKyAgdG90YWxfc2FtcGxlcyA9IGdzdF9mbGFjX2VuY19wZWVyX3F1ZXJ5X3RvdGFsX3NhbXBsZXMgKGZsYWNlbmMsCisgICAgICBHU1RfQVVESU9fRU5DT0RFUl9TSU5LX1BBRCAoZW5jKSk7CisKKyAgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2JpdHNfcGVyX3NhbXBsZSAoZmxhY2VuYy0+ZW5jb2RlciwKKyAgICAgIEdTVF9BVURJT19JTkZPX0RFUFRIIChpbmZvKSk7CisgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9zYW1wbGVfcmF0ZSAoZmxhY2VuYy0+ZW5jb2RlciwKKyAgICAgIEdTVF9BVURJT19JTkZPX1JBVEUgKGluZm8pKTsKKyAgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2NoYW5uZWxzIChmbGFjZW5jLT5lbmNvZGVyLAorICAgICAgR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKGluZm8pKTsKKworICBpZiAodG90YWxfc2FtcGxlcyAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF90b3RhbF9zYW1wbGVzX2VzdGltYXRlIChmbGFjZW5jLT5lbmNvZGVyLAorICAgICAgICBNSU4gKHRvdGFsX3NhbXBsZXMsIEdfR1VJTlQ2NF9DT05TVEFOVCAoMHgwRkZGRkZGRkZGKSkpOworCisgIGdzdF9mbGFjX2VuY19zZXRfbWV0YWRhdGEgKGZsYWNlbmMsIGluZm8sIHRvdGFsX3NhbXBsZXMpOworCisgIC8qIGNhbGxiYWNrcyBjbGVhciB0byBnbyBub3c7CisgICAqIHdyaXRlIGNhbGxiYWNrcyByZWNlaXZlcyBoZWFkZXJzIGR1cmluZyBpbml0ICovCisgIGZsYWNlbmMtPnN0b3BwZWQgPSBGQUxTRTsKKworICBpbml0X3N0YXR1cyA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX2luaXRfc3RyZWFtIChmbGFjZW5jLT5lbmNvZGVyLAorICAgICAgZ3N0X2ZsYWNfZW5jX3dyaXRlX2NhbGxiYWNrLCBnc3RfZmxhY19lbmNfc2Vla19jYWxsYmFjaywKKyAgICAgIGdzdF9mbGFjX2VuY190ZWxsX2NhbGxiYWNrLCBOVUxMLCBmbGFjZW5jKTsKKyAgaWYgKGluaXRfc3RhdHVzICE9IEZMQUNfX1NUUkVBTV9FTkNPREVSX0lOSVRfU1RBVFVTX09LKQorICAgIGdvdG8gZmFpbGVkX3RvX2luaXRpYWxpemU7CisKKyAgLyogbm8gc3BlY2lhbCBmZWVkYmFjayB0byBiYXNlIGNsYXNzOyBzaG91bGQgcHJvdmlkZSBhbGwgYXZhaWxhYmxlIHNhbXBsZXMgKi8KKworICByZXR1cm4gVFJVRTsKKworZW5jb2Rlcl9hbHJlYWR5X2luaXRpYWxpemVkOgorICB7CisgICAgZ193YXJuaW5nICgiZmxhYyBhbHJlYWR5IGluaXRpYWxpemVkIC0tIGZpeG1lIGFsbG93IHRoaXMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ZhaWxlZF90b19pbml0aWFsaXplOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGZsYWNlbmMsIExJQlJBUlksIElOSVQsIChOVUxMKSwKKyAgICAgICAgKCJjb3VsZCBub3QgaW5pdGlhbGl6ZSBlbmNvZGVyICh3cm9uZyBwYXJhbWV0ZXJzPykgJWQiLCBpbml0X3N0YXR1cykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbGFjX2VuY191cGRhdGVfcXVhbGl0eSAoR3N0RmxhY0VuYyAqIGZsYWNlbmMsIGdpbnQgcXVhbGl0eSkKK3sKKyAgR3N0QXVkaW9JbmZvICppbmZvID0KKyAgICAgIGdzdF9hdWRpb19lbmNvZGVyX2dldF9hdWRpb19pbmZvIChHU1RfQVVESU9fRU5DT0RFUiAoZmxhY2VuYykpOworCisgIGZsYWNlbmMtPnF1YWxpdHkgPSBxdWFsaXR5OworCisjZGVmaW5lIERPX1VQREFURShuYW1lLCB2YWwsIHN0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR19TVE1UX1NUQVJUIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChGTEFDX19zdHJlYW1fZW5jb2Rlcl9nZXRfIyNuYW1lIChmbGFjZW5jLT5lbmNvZGVyKSAhPSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZsYWNlbmNfcGFyYW1zW3F1YWxpdHldLnZhbCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF8jI25hbWUgKGZsYWNlbmMtPmVuY29kZXIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGZsYWNlbmNfcGFyYW1zW3F1YWxpdHldLnZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBnX29iamVjdF9ub3RpZnkgKEdfT0JKRUNUIChmbGFjZW5jKSwgc3RyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IEdfU1RNVF9FTkQKKworICBnX29iamVjdF9mcmVlemVfbm90aWZ5IChHX09CSkVDVCAoZmxhY2VuYykpOworCisgIGlmIChHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoaW5mbykgPT0gMgorICAgICAgfHwgR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKGluZm8pID09IDApIHsKKyAgICBET19VUERBVEUgKGRvX21pZF9zaWRlX3N0ZXJlbywgbWlkX3NpZGUsICJtaWRfc2lkZV9zdGVyZW8iKTsKKyAgICBET19VUERBVEUgKGxvb3NlX21pZF9zaWRlX3N0ZXJlbywgbG9vc2VfbWlkX3NpZGUsICJsb29zZV9taWRfc2lkZSIpOworICB9CisKKyAgRE9fVVBEQVRFIChibG9ja3NpemUsIGJsb2Nrc2l6ZSwgImJsb2Nrc2l6ZSIpOworICBET19VUERBVEUgKG1heF9scGNfb3JkZXIsIG1heF9scGNfb3JkZXIsICJtYXhfbHBjX29yZGVyIik7CisgIERPX1VQREFURSAocWxwX2NvZWZmX3ByZWNpc2lvbiwgcWxwX2NvZWZmX3ByZWNpc2lvbiwgInFscF9jb2VmZl9wcmVjaXNpb24iKTsKKyAgRE9fVVBEQVRFIChkb19xbHBfY29lZmZfcHJlY19zZWFyY2gsIHFscF9jb2VmZl9wcmVjX3NlYXJjaCwKKyAgICAgICJxbHBfY29lZmZfcHJlY19zZWFyY2giKTsKKyAgRE9fVVBEQVRFIChkb19lc2NhcGVfY29kaW5nLCBlc2NhcGVfY29kaW5nLCAiZXNjYXBlX2NvZGluZyIpOworICBET19VUERBVEUgKGRvX2V4aGF1c3RpdmVfbW9kZWxfc2VhcmNoLCBleGhhdXN0aXZlX21vZGVsX3NlYXJjaCwKKyAgICAgICJleGhhdXN0aXZlX21vZGVsX3NlYXJjaCIpOworICBET19VUERBVEUgKG1pbl9yZXNpZHVhbF9wYXJ0aXRpb25fb3JkZXIsIG1pbl9yZXNpZHVhbF9wYXJ0aXRpb25fb3JkZXIsCisgICAgICAibWluX3Jlc2lkdWFsX3BhcnRpdGlvbl9vcmRlciIpOworICBET19VUERBVEUgKG1heF9yZXNpZHVhbF9wYXJ0aXRpb25fb3JkZXIsIG1heF9yZXNpZHVhbF9wYXJ0aXRpb25fb3JkZXIsCisgICAgICAibWF4X3Jlc2lkdWFsX3BhcnRpdGlvbl9vcmRlciIpOworICBET19VUERBVEUgKHJpY2VfcGFyYW1ldGVyX3NlYXJjaF9kaXN0LCByaWNlX3BhcmFtZXRlcl9zZWFyY2hfZGlzdCwKKyAgICAgICJyaWNlX3BhcmFtZXRlcl9zZWFyY2hfZGlzdCIpOworCisjdW5kZWYgRE9fVVBEQVRFCisKKyAgZ19vYmplY3RfdGhhd19ub3RpZnkgKEdfT0JKRUNUIChmbGFjZW5jKSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBGTEFDX19TdHJlYW1FbmNvZGVyU2Vla1N0YXR1cworZ3N0X2ZsYWNfZW5jX3NlZWtfY2FsbGJhY2sgKGNvbnN0IEZMQUNfX1N0cmVhbUVuY29kZXIgKiBlbmNvZGVyLAorICAgIEZMQUNfX3VpbnQ2NCBhYnNvbHV0ZV9ieXRlX29mZnNldCwgdm9pZCAqY2xpZW50X2RhdGEpCit7CisgIEdzdEZsYWNFbmMgKmZsYWNlbmM7CisgIEdzdFBhZCAqcGVlcnBhZDsKKyAgR3N0U2VnbWVudCBzZWc7CisKKyAgZmxhY2VuYyA9IEdTVF9GTEFDX0VOQyAoY2xpZW50X2RhdGEpOworCisgIGlmIChmbGFjZW5jLT5zdG9wcGVkKQorICAgIHJldHVybiBGTEFDX19TVFJFQU1fRU5DT0RFUl9TRUVLX1NUQVRVU19PSzsKKworICBpZiAoKHBlZXJwYWQgPSBnc3RfcGFkX2dldF9wZWVyIChHU1RfQVVESU9fRU5DT0RFUl9TUkNfUEFEIChmbGFjZW5jKSkpKSB7CisgICAgR3N0RXZlbnQgKmV2ZW50OworICAgIGdib29sZWFuIHJldDsKKyAgICBHc3RRdWVyeSAqcXVlcnk7CisgICAgZ2Jvb2xlYW4gc2Vla2FibGUgPSBGQUxTRTsKKworICAgIC8qIHRyeSB0byBzZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCAqLworICAgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19zZWVraW5nIChHU1RfRk9STUFUX0JZVEVTKTsKKyAgICBpZiAoZ3N0X3BhZF9xdWVyeSAocGVlcnBhZCwgcXVlcnkpKSB7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworCisgICAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksICZmb3JtYXQsICZzZWVrYWJsZSwgTlVMTCwgTlVMTCk7CisgICAgICBpZiAoZm9ybWF0ICE9IEdTVF9GT1JNQVRfQllURVMpCisgICAgICAgIHNlZWthYmxlID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChmbGFjZW5jLCAiU0VFS0lORyBxdWVyeSBub3QgaGFuZGxlZCIpOworICAgIH0KKyAgICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKworICAgIGlmICghc2Vla2FibGUpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNlbmMsICJkb3duc3RyZWFtIG5vdCBzZWVrYWJsZTsgbm90IHJld3JpdGluZyIpOworICAgICAgZ3N0X29iamVjdF91bnJlZiAocGVlcnBhZCk7CisgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfU0VFS19TVEFUVVNfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZywgR1NUX0ZPUk1BVF9CWVRFUyk7CisgICAgc2VnLnN0YXJ0ID0gYWJzb2x1dGVfYnl0ZV9vZmZzZXQ7CisgICAgc2VnLnN0b3AgPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FOworICAgIHNlZy50aW1lID0gMDsKKyAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZyk7CisKKyAgICByZXQgPSBnc3RfcGFkX3NlbmRfZXZlbnQgKHBlZXJwYWQsIGV2ZW50KTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwZWVycGFkKTsKKworICAgIGlmIChyZXQpIHsKKyAgICAgIEdTVF9ERUJVRyAoIlNlZWsgdG8gJSIgR19HVUlOVDY0X0ZPUk1BVCAiICVzIiwKKyAgICAgICAgICAoZ3VpbnQ2NCkgYWJzb2x1dGVfYnl0ZV9vZmZzZXQsICJzdWNjZWVkZWQiKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHICgiU2VlayB0byAlIiBHX0dVSU5UNjRfRk9STUFUICIgJXMiLAorICAgICAgICAgIChndWludDY0KSBhYnNvbHV0ZV9ieXRlX29mZnNldCwgImZhaWxlZCIpOworICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1NFRUtfU1RBVFVTX1VOU1VQUE9SVEVEOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUcgKCJTZWVrIHRvICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBmYWlsZWQgKG5vIHBlZXIgcGFkKSIsCisgICAgICAgIChndWludDY0KSBhYnNvbHV0ZV9ieXRlX29mZnNldCk7CisgIH0KKworICBmbGFjZW5jLT5vZmZzZXQgPSBhYnNvbHV0ZV9ieXRlX29mZnNldDsKKyAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1NFRUtfU1RBVFVTX09LOworfQorCitzdGF0aWMgdm9pZAorbm90Z3N0X3ZhbHVlX2FycmF5X2FwcGVuZF9idWZmZXIgKEdWYWx1ZSAqIGFycmF5X3ZhbCwgR3N0QnVmZmVyICogYnVmKQoreworICBHVmFsdWUgdmFsdWUgPSB7IDAsIH07CisKKyAgZ192YWx1ZV9pbml0ICgmdmFsdWUsIEdTVF9UWVBFX0JVRkZFUik7CisgIC8qIGNvcHkgYnVmZmVyIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggY2lyY3VsYXIgcmVmY291bnRzICovCisgIGJ1ZiA9IGdzdF9idWZmZXJfY29weSAoYnVmKTsKKyAgLyogYWdhaW4sIGZvciBnb29kIG1lYXN1cmUgKi8KKyAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKyAgZ3N0X3ZhbHVlX3NldF9idWZmZXIgKCZ2YWx1ZSwgYnVmKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgZ3N0X3ZhbHVlX2FycmF5X2FwcGVuZF92YWx1ZSAoYXJyYXlfdmFsLCAmdmFsdWUpOworICBnX3ZhbHVlX3Vuc2V0ICgmdmFsdWUpOworfQorCisjZGVmaW5lIEhEUl9UWVBFX1NUUkVBTUlORk8gICAgIDAKKyNkZWZpbmUgSERSX1RZUEVfVk9SQklTQ09NTUVOVCAgNAorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2ZsYWNfZW5jX3Byb2Nlc3Nfc3RyZWFtX2hlYWRlcnMgKEdzdEZsYWNFbmMgKiBlbmMpCit7CisgIEdzdEJ1ZmZlciAqdm9yYmlzY29tbWVudCA9IE5VTEw7CisgIEdzdEJ1ZmZlciAqc3RyZWFtaW5mbyA9IE5VTEw7CisgIEdzdEJ1ZmZlciAqbWFya2VyID0gTlVMTDsKKyAgR1ZhbHVlIGFycmF5ID0geyAwLCB9OworICBHc3RDYXBzICpjYXBzOworICBHTGlzdCAqbDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0QXVkaW9JbmZvICppbmZvID0KKyAgICAgIGdzdF9hdWRpb19lbmNvZGVyX2dldF9hdWRpb19pbmZvIChHU1RfQVVESU9fRU5DT0RFUiAoZW5jKSk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LWZsYWMiLAorICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKGluZm8pLAorICAgICAgInJhdGUiLCBHX1RZUEVfSU5ULCBHU1RfQVVESU9fSU5GT19SQVRFIChpbmZvKSwgTlVMTCk7CisKKyAgZm9yIChsID0gZW5jLT5oZWFkZXJzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KSB7CisgICAgR3N0QnVmZmVyICpidWY7CisgICAgR3N0TWFwSW5mbyBtYXA7CisgICAgZ3VpbnQ4ICpkYXRhOworICAgIGdzaXplIHNpemU7CisKKyAgICAvKiBtYXJrIGJ1ZmZlcnMgc28gb2dnbXV4IHdpbGwgaWdub3JlIHRoZW0gaWYgaXQgYWxyZWFkeSBtdXhlZCB0aGUKKyAgICAgKiBoZWFkZXIgYnVmZmVycyBmcm9tIHRoZSBzdHJlYW1oZWFkZXJzIGZpZWxkIGluIHRoZSBjYXBzICovCisgICAgbC0+ZGF0YSA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoR1NUX0JVRkZFUl9DQVNUIChsLT5kYXRhKSk7CisKKyAgICBidWYgPSBHU1RfQlVGRkVSX0NBU1QgKGwtPmRhdGEpOworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0hFQURFUik7CisKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIGRhdGEgPSBtYXAuZGF0YTsKKyAgICBzaXplID0gbWFwLnNpemU7CisKKyAgICAvKiBmaW5kIGluaXRpYWwgNC1ieXRlIG1hcmtlciB3aGljaCB3ZSBuZWVkIHRvIHNraXAgbGF0ZXIgb24gKi8KKyAgICBpZiAoc2l6ZSA9PSA0ICYmIG1lbWNtcCAoZGF0YSwgImZMYUMiLCA0KSA9PSAwKSB7CisgICAgICBtYXJrZXIgPSBidWY7CisgICAgfSBlbHNlIGlmIChzaXplID4gMSAmJiAoZGF0YVswXSAmIDB4N2YpID09IEhEUl9UWVBFX1NUUkVBTUlORk8pIHsKKyAgICAgIHN0cmVhbWluZm8gPSBidWY7CisgICAgfSBlbHNlIGlmIChzaXplID4gMSAmJiAoZGF0YVswXSAmIDB4N2YpID09IEhEUl9UWVBFX1ZPUkJJU0NPTU1FTlQpIHsKKyAgICAgIHZvcmJpc2NvbW1lbnQgPSBidWY7CisgICAgfQorCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgfQorCisgIGlmIChtYXJrZXIgPT0gTlVMTCB8fCBzdHJlYW1pbmZvID09IE5VTEwgfHwgdm9yYmlzY29tbWVudCA9PSBOVUxMKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmMsICJtaXNzaW5nIGhlYWRlciAlcCAlcCAlcCwgbXV4aW5nIGludG8gY29udGFpbmVyICIKKyAgICAgICAgImZvcm1hdHMgbWF5IGJlIGJyb2tlbiIsIG1hcmtlciwgc3RyZWFtaW5mbywgdm9yYmlzY29tbWVudCk7CisgICAgZ290byBwdXNoX2hlYWRlcnM7CisgIH0KKworICBnX3ZhbHVlX2luaXQgKCZhcnJheSwgR1NUX1RZUEVfQVJSQVkpOworCisgIC8qIGFkZCBtYXJrZXIgaW5jbHVkaW5nIFNUUkVBTUlORk8gaGVhZGVyICovCisgIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICBndWludDE2IG51bTsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBndWludDggKmJkYXRhOworICAgIGdzaXplIHNsZW47CisKKyAgICAvKiBtaW51cyBvbmUgZm9yIHRoZSBtYXJrZXIgdGhhdCBpcyBtZXJnZWQgd2l0aCBzdHJlYW1pbmZvIGhlcmUgKi8KKyAgICBudW0gPSBnX2xpc3RfbGVuZ3RoIChlbmMtPmhlYWRlcnMpIC0gMTsKKworICAgIHNsZW4gPSBnc3RfYnVmZmVyX2dldF9zaXplIChzdHJlYW1pbmZvKTsKKyAgICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEzICsgc2xlbik7CisKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBiZGF0YSA9IG1hcC5kYXRhOworICAgIGJkYXRhWzBdID0gMHg3ZjsKKyAgICBtZW1jcHkgKGJkYXRhICsgMSwgIkZMQUMiLCA0KTsKKyAgICBiZGF0YVs1XSA9IDB4MDE7ICAgICAgICAgICAgLyogbWFwcGluZyB2ZXJzaW9uIG1ham9yICovCisgICAgYmRhdGFbNl0gPSAweDAwOyAgICAgICAgICAgIC8qIG1hcHBpbmcgdmVyc2lvbiBtaW5vciAqLworICAgIGJkYXRhWzddID0gKG51bSAmIDB4RkYwMCkgPj4gODsKKyAgICBiZGF0YVs4XSA9IChudW0gJiAweDAwRkYpID4+IDA7CisgICAgbWVtY3B5IChiZGF0YSArIDksICJmTGFDIiwgNCk7CisgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChzdHJlYW1pbmZvLCAwLCBiZGF0YSArIDEzLCBzbGVuKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgICAgbm90Z3N0X3ZhbHVlX2FycmF5X2FwcGVuZF9idWZmZXIgKCZhcnJheSwgYnVmKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICB9CisKKyAgLyogYWRkIFZPUkJJU0NPTU1FTlQgaGVhZGVyICovCisgIG5vdGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfYnVmZmVyICgmYXJyYXksIHZvcmJpc2NvbW1lbnQpOworCisgIC8qIGFkZCBvdGhlciBoZWFkZXJzLCBpZiB0aGVyZSBhcmUgYW55ICovCisgIGZvciAobCA9IGVuYy0+aGVhZGVyczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworICAgIEdzdEJ1ZmZlciAqYnVmID0gR1NUX0JVRkZFUl9DQVNUIChsLT5kYXRhKTsKKworICAgIGlmIChidWYgIT0gbWFya2VyICYmIGJ1ZiAhPSBzdHJlYW1pbmZvICYmIGJ1ZiAhPSB2b3JiaXNjb21tZW50KSB7CisgICAgICBub3Rnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX2J1ZmZlciAoJmFycmF5LCBidWYpOworICAgIH0KKyAgfQorCisgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKSwKKyAgICAgICJzdHJlYW1oZWFkZXIiLCAmYXJyYXkpOworICBnX3ZhbHVlX3Vuc2V0ICgmYXJyYXkpOworCitwdXNoX2hlYWRlcnM6CisgIGdzdF9hdWRpb19lbmNvZGVyX3NldF9vdXRwdXRfZm9ybWF0IChHU1RfQVVESU9fRU5DT0RFUiAoZW5jKSwgY2Fwcyk7CisKKyAgZ3N0X2F1ZGlvX2VuY29kZXJfc2V0X2hlYWRlcnMgKEdTVF9BVURJT19FTkNPREVSIChlbmMpLCBlbmMtPmhlYWRlcnMpOworICBlbmMtPmhlYWRlcnMgPSBOVUxMOworCisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgRkxBQ19fU3RyZWFtRW5jb2RlcldyaXRlU3RhdHVzCitnc3RfZmxhY19lbmNfd3JpdGVfY2FsbGJhY2sgKGNvbnN0IEZMQUNfX1N0cmVhbUVuY29kZXIgKiBlbmNvZGVyLAorICAgIGNvbnN0IEZMQUNfX2J5dGUgYnVmZmVyW10sIHNpemVfdCBieXRlcywKKyAgICB1bnNpZ25lZCBzYW1wbGVzLCB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lLCB2b2lkICpjbGllbnRfZGF0YSkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0RmxhY0VuYyAqZmxhY2VuYzsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIEdzdFNlZ21lbnQgKnNlZ21lbnQ7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKKworICBmbGFjZW5jID0gR1NUX0ZMQUNfRU5DIChjbGllbnRfZGF0YSk7CisKKyAgaWYgKGZsYWNlbmMtPnN0b3BwZWQpCisgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKKworICBvdXRidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGJ5dGVzKTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChvdXRidWYsIDAsIGJ1ZmZlciwgYnl0ZXMpOworCisgIC8qIHdlIGFzc3VtZSBsaWJmbGFjIHBhc3NlcyB1cyBzdHVmZiBuZWF0bHkgZnJhbWVkICovCisgIGlmICghZmxhY2VuYy0+Z290X2hlYWRlcnMpIHsKKyAgICBpZiAoc2FtcGxlcyA9PSAwKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjZW5jLCAiR290IGhlYWRlciwgcXVldWVpbmcgKCV1IGJ5dGVzKSIsCisgICAgICAgICAgKGd1aW50KSBieXRlcyk7CisgICAgICBmbGFjZW5jLT5oZWFkZXJzID0gZ19saXN0X2FwcGVuZCAoZmxhY2VuYy0+aGVhZGVycywgb3V0YnVmKTsKKyAgICAgIC8qIG5vdGU6IGl0J3MgaW1wb3J0YW50IHRoYXQgd2UgaW5jcmVhc2Ugb3VyIGJ5dGUgb2Zmc2V0ICovCisgICAgICBnb3RvIG91dDsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0lORk9fT0JKRUNUIChmbGFjZW5jLCAiTm9uLWhlYWRlciBwYWNrZXQsIHdlIGhhdmUgYWxsIGhlYWRlcnMgbm93Iik7CisgICAgICByZXQgPSBnc3RfZmxhY19lbmNfcHJvY2Vzc19zdHJlYW1faGVhZGVycyAoZmxhY2VuYyk7CisgICAgICBmbGFjZW5jLT5nb3RfaGVhZGVycyA9IFRSVUU7CisgICAgfQorICB9CisKKyAgaWYgKGZsYWNlbmMtPmdvdF9oZWFkZXJzICYmIHNhbXBsZXMgPT0gMCkgeworICAgIC8qIGhlYWRlciBmaXh1cCwgcHVzaCBkb3duc3RyZWFtIGRpcmVjdGx5ICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY2VuYywgIkZpeGluZyB1cCBoZWFkZXJzIGF0IHBvcz0lIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICIsIHNpemU9JXUiLCBmbGFjZW5jLT5vZmZzZXQsIChndWludCkgYnl0ZXMpOworI2lmIDAKKyAgICBHU1RfTUVNRFVNUF9PQkpFQ1QgKGZsYWNlbmMsICJQcmVzdW1lZCBoZWFkZXIgZnJhZ21lbnQiLAorICAgICAgICBHU1RfQlVGRkVSX0RBVEEgKG91dGJ1ZiksIEdTVF9CVUZGRVJfU0laRSAob3V0YnVmKSk7CisjZW5kaWYKKyAgICByZXQgPSBnc3RfcGFkX3B1c2ggKEdTVF9BVURJT19FTkNPREVSX1NSQ19QQUQgKGZsYWNlbmMpLCBvdXRidWYpOworICB9IGVsc2UgeworICAgIC8qIHJlZ3VsYXIgZnJhbWUgZGF0YSwgcGFzcyB0byBiYXNlIGNsYXNzICovCisgICAgaWYgKGZsYWNlbmMtPmVvcyAmJiBmbGFjZW5jLT5zYW1wbGVzX2luID09IGZsYWNlbmMtPnNhbXBsZXNfb3V0ICsgc2FtcGxlcykgeworICAgICAgLyogSWYgZW5jb2RpbmcgcGFydCBvZiBhIGZyYW1lLCBhbmQgd2UgaGF2ZSBubyBzZXQgc3RvcCB0aW1lIG9uCisgICAgICAgKiB0aGUgb3V0cHV0IHNlZ21lbnQsIHdlIHVwZGF0ZSB0aGUgc2VnbWVudCBzdG9wIHRpbWUgdG8gcmVmbGVjdAorICAgICAgICogdGhlIGxhc3Qgc2FtcGxlLiBUaGlzIHdpbGwgbGV0IG9nZ211eCBzZXQgdGhlIGxhc3QgcGFnZSdzCisgICAgICAgKiBncmFucG9zIHRvIHRlbGwgYSBkZWNvZGVyIHRoZSBkdW1teSBzYW1wbGVzIHNob3VsZCBiZSBjbGlwcGVkLgorICAgICAgICovCisgICAgICBzZWdtZW50ID0gJkdTVF9BVURJT19FTkNPREVSX09VVFBVVF9TRUdNRU5UIChmbGFjZW5jKTsKKyAgICAgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHNlZ21lbnQtPnN0b3ApKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNlbmMsCisgICAgICAgICAgICAiTm8gc3RvcCB0aW1lIGFuZCBwYXJ0aWFsIGZyYW1lLCB1cGRhdGluZyBzZWdtZW50Iik7CisgICAgICAgIGR1cmF0aW9uID0KKyAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoZmxhY2VuYy0+c2FtcGxlc19vdXQgKyBzYW1wbGVzLAorICAgICAgICAgICAgR1NUX1NFQ09ORCwKKyAgICAgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2dldF9zYW1wbGVfcmF0ZSAoZmxhY2VuYy0+ZW5jb2RlcikpOworICAgICAgICBzZWdtZW50LT5zdG9wID0gc2VnbWVudC0+c3RhcnQgKyBkdXJhdGlvbjsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY2VuYywgIm5ldyBvdXRwdXQgc2VnbWVudCAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsCisgICAgICAgICAgICBzZWdtZW50KTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChHU1RfQVVESU9fRU5DT0RFUl9TUkNfUEFEIChmbGFjZW5jKSwKKyAgICAgICAgICAgIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoc2VnbWVudCkpOworICAgICAgfQorICAgIH0KKworICAgIEdTVF9MT0cgKCJQdXNoaW5nIGJ1ZmZlcjogc2FtcGxlcz0ldSwgc2l6ZT0ldSwgcG9zPSUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgIHNhbXBsZXMsIChndWludCkgYnl0ZXMsIGZsYWNlbmMtPm9mZnNldCk7CisgICAgcmV0ID0gZ3N0X2F1ZGlvX2VuY29kZXJfZmluaXNoX2ZyYW1lIChHU1RfQVVESU9fRU5DT0RFUiAoZmxhY2VuYyksCisgICAgICAgIG91dGJ1Ziwgc2FtcGxlcyk7CisgIH0KKworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNlbmMsICJmbG93OiAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKworICBmbGFjZW5jLT5sYXN0X2Zsb3cgPSByZXQ7CisKK291dDoKKyAgZmxhY2VuYy0+b2Zmc2V0ICs9IGJ5dGVzOworCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19GQVRBTF9FUlJPUjsKKworICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOworfQorCitzdGF0aWMgRkxBQ19fU3RyZWFtRW5jb2RlclRlbGxTdGF0dXMKK2dzdF9mbGFjX2VuY190ZWxsX2NhbGxiYWNrIChjb25zdCBGTEFDX19TdHJlYW1FbmNvZGVyICogZW5jb2RlciwKKyAgICBGTEFDX191aW50NjQgKiBhYnNvbHV0ZV9ieXRlX29mZnNldCwgdm9pZCAqY2xpZW50X2RhdGEpCit7CisgIEdzdEZsYWNFbmMgKmZsYWNlbmMgPSBHU1RfRkxBQ19FTkMgKGNsaWVudF9kYXRhKTsKKworICAqYWJzb2x1dGVfYnl0ZV9vZmZzZXQgPSBmbGFjZW5jLT5vZmZzZXQ7CisKKyAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1RFTExfU1RBVFVTX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbGFjX2VuY19zaW5rX2V2ZW50IChHc3RBdWRpb0VuY29kZXIgKiBlbmMsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdEZsYWNFbmMgKmZsYWNlbmM7CisgIEdzdFRhZ0xpc3QgKnRhZ2xpc3Q7CisgIEdzdFRvYyAqdG9jOworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBmbGFjZW5jID0gR1NUX0ZMQUNfRU5DIChlbmMpOworCisgIEdTVF9ERUJVRyAoIlJlY2VpdmVkICVzIGV2ZW50IG9uIHNpbmtwYWQsICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpLCBldmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRU9TOgorICAgICAgZmxhY2VuYy0+ZW9zID0gVFJVRTsKKyAgICAgIHJldCA9IEdTVF9BVURJT19FTkNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChlbmMsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX1RBRzoKKyAgICAgIGlmIChmbGFjZW5jLT50YWdzKSB7CisgICAgICAgIGdzdF9ldmVudF9wYXJzZV90YWcgKGV2ZW50LCAmdGFnbGlzdCk7CisgICAgICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKGZsYWNlbmMtPnRhZ3MsIHRhZ2xpc3QsCisgICAgICAgICAgICBnc3RfdGFnX3NldHRlcl9nZXRfdGFnX21lcmdlX21vZGUgKEdTVF9UQUdfU0VUVEVSIChmbGFjZW5jKSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICB9CisgICAgICByZXQgPSBHU1RfQVVESU9fRU5DT0RFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAoZW5jLCBldmVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9UT0M6CisgICAgICBnc3RfZXZlbnRfcGFyc2VfdG9jIChldmVudCwgJnRvYywgTlVMTCk7CisgICAgICBpZiAodG9jKSB7CisgICAgICAgIGlmIChmbGFjZW5jLT50b2MgIT0gdG9jKSB7CisgICAgICAgICAgaWYgKGZsYWNlbmMtPnRvYykKKyAgICAgICAgICAgIGdzdF90b2NfdW5yZWYgKGZsYWNlbmMtPnRvYyk7CisgICAgICAgICAgZmxhY2VuYy0+dG9jID0gdG9jOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXQgPSBHU1RfQVVESU9fRU5DT0RFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAoZW5jLCBldmVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgICAgZmxhY2VuYy0+c2FtcGxlc19pbiA9IDA7CisgICAgICBmbGFjZW5jLT5zYW1wbGVzX291dCA9IDA7CisgICAgICByZXQgPSBHU1RfQVVESU9fRU5DT0RFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAoZW5jLCBldmVudCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gR1NUX0FVRElPX0VOQ09ERVJfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKGVuYywgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbGFjX2VuY19zaW5rX3F1ZXJ5IChHc3RBdWRpb0VuY29kZXIgKiBlbmMsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFBhZCAqcGFkID0gR1NUX0FVRElPX0VOQ09ERVJfU0lOS19QQUQgKGVuYyk7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIEdTVF9ERUJVRyAoIlJlY2VpdmVkICVzIHF1ZXJ5IG9uIHNpbmtwYWQsICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgR1NUX1FVRVJZX1RZUEVfTkFNRSAocXVlcnkpLCBxdWVyeSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQUNDRVBUX0NBUFM6eworICAgICAgR3N0Q2FwcyAqYWNjZXB0YWJsZSwgKmNhcHM7CisKKyAgICAgIGFjY2VwdGFibGUgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHBhZCk7CisgICAgICBpZiAoYWNjZXB0YWJsZSA9PSBOVUxMKSB7CisgICAgICAgIGFjY2VwdGFibGUgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAocGFkKTsKKyAgICAgIH0KKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2FjY2VwdF9jYXBzIChxdWVyeSwgJmNhcHMpOworCisgICAgICBnc3RfcXVlcnlfc2V0X2FjY2VwdF9jYXBzX3Jlc3VsdCAocXVlcnksCisgICAgICAgICAgZ3N0X2NhcHNfaXNfc3Vic2V0IChjYXBzLCBhY2NlcHRhYmxlKSk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoYWNjZXB0YWJsZSk7CisgICAgICByZXQgPSBUUlVFOworICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBHU1RfQVVESU9fRU5DT0RFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19xdWVyeSAoZW5jLCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIFJFQURfSU5UMjQgR1NUX1JFQURfVUlOVDI0X0xFCisjZWxzZQorI2RlZmluZSBSRUFEX0lOVDI0IEdTVF9SRUFEX1VJTlQyNF9CRQorI2VuZGlmCisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZmxhY19lbmNfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0VuY29kZXIgKiBlbmMsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0RmxhY0VuYyAqZmxhY2VuYzsKKyAgRkxBQ19faW50MzIgKmRhdGE7CisgIGdpbnQgc2FtcGxlcywgd2lkdGgsIGNoYW5uZWxzOworICBndWxvbmcgaTsKKyAgZ2ludCBqOworICBGTEFDX19ib29sIHJlczsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdEF1ZGlvSW5mbyAqaW5mbyA9CisgICAgICBnc3RfYXVkaW9fZW5jb2Rlcl9nZXRfYXVkaW9faW5mbyAoR1NUX0FVRElPX0VOQ09ERVIgKGVuYykpOworICBnaW50ICpyZW9yZGVyX21hcDsKKworICBmbGFjZW5jID0gR1NUX0ZMQUNfRU5DIChlbmMpOworCisgIC8qIGJhc2UgY2xhc3MgZW5zdXJlcyBjb25maWd1cmF0aW9uICovCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfQVVESU9fSU5GT19XSURUSCAoaW5mbykgIT0gMCwKKyAgICAgIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEKTsKKworICB3aWR0aCA9IEdTVF9BVURJT19JTkZPX1dJRFRIIChpbmZvKTsKKyAgY2hhbm5lbHMgPSBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoaW5mbyk7CisgIHJlb3JkZXJfbWFwID0gZmxhY2VuYy0+Y2hhbm5lbF9yZW9yZGVyX21hcDsKKworICBpZiAoR19VTkxJS0VMWSAoIWJ1ZmZlcikpIHsKKyAgICBpZiAoZmxhY2VuYy0+ZW9zKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjZW5jLCAiZmluaXNoIGVuY29kaW5nIik7CisgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9maW5pc2ggKGZsYWNlbmMtPmVuY29kZXIpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBjYW4ndCBoYW5kbGUgaW50ZXJtaXR0ZW50IGRyYWluaW5nL3Jlc3luY2luZyAqLworICAgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoZmxhY2VuYywgU1RSRUFNLCBGT1JNQVQsIChOVUxMKSwKKyAgICAgICAgICAoIlN0cmVhbSBkaXNjb250aW51aXR5IGRldGVjdGVkLiAiCisgICAgICAgICAgICAgICJUaGUgb3V0cHV0IG1heSBoYXZlIHdyb25nIHRpbWVzdGFtcHMsICIKKyAgICAgICAgICAgICAgImNvbnNpZGVyIHVzaW5nIGF1ZGlvcmF0ZSB0byBoYW5kbGUgZGlzY29udGludWl0aWVzIikpOworICAgIH0KKyAgICByZXR1cm4gZmxhY2VuYy0+bGFzdF9mbG93OworICB9CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgc2FtcGxlcyA9IG1hcC5zaXplIC8gKHdpZHRoID4+IDMpOworCisgIGRhdGEgPSBnX21hbGxvYyAoc2FtcGxlcyAqIHNpemVvZiAoRkxBQ19faW50MzIpKTsKKworICBzYW1wbGVzIC89IGNoYW5uZWxzOworICBHU1RfTE9HX09CSkVDVCAoZmxhY2VuYywgInByb2Nlc3NpbmcgJWQgc2FtcGxlcywgJWQgY2hhbm5lbHMiLCBzYW1wbGVzLAorICAgICAgY2hhbm5lbHMpOworICBpZiAod2lkdGggPT0gOCkgeworICAgIGdpbnQ4ICppbmRhdGEgPSAoZ2ludDggKikgbWFwLmRhdGE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlczsgaSsrKQorICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspCisgICAgICAgIGRhdGFbaSAqIGNoYW5uZWxzICsgcmVvcmRlcl9tYXBbal1dID0KKyAgICAgICAgICAgIChGTEFDX19pbnQzMikgaW5kYXRhW2kgKiBjaGFubmVscyArIGpdOworICB9IGVsc2UgaWYgKHdpZHRoID09IDE2KSB7CisgICAgZ2ludDE2ICppbmRhdGEgPSAoZ2ludDE2ICopIG1hcC5kYXRhOworCisgICAgZm9yIChpID0gMDsgaSA8IHNhbXBsZXM7IGkrKykKKyAgICAgIGZvciAoaiA9IDA7IGogPCBjaGFubmVsczsgaisrKQorICAgICAgICBkYXRhW2kgKiBjaGFubmVscyArIHJlb3JkZXJfbWFwW2pdXSA9CisgICAgICAgICAgICAoRkxBQ19faW50MzIpIGluZGF0YVtpICogY2hhbm5lbHMgKyBqXTsKKyAgfSBlbHNlIGlmICh3aWR0aCA9PSAyNCkgeworICAgIGd1aW50OCAqaW5kYXRhID0gKGd1aW50OCAqKSBtYXAuZGF0YTsKKyAgICBndWludDMyIHZhbDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVzOyBpKyspCisgICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeworICAgICAgICB2YWwgPSBSRUFEX0lOVDI0ICgmaW5kYXRhWzMgKiAoaSAqIGNoYW5uZWxzICsgaildKTsKKyAgICAgICAgaWYgKHZhbCAmIDB4MDA4MDAwMDApCisgICAgICAgICAgdmFsIHw9IDB4ZmYwMDAwMDA7CisgICAgICAgIGRhdGFbaSAqIGNoYW5uZWxzICsgcmVvcmRlcl9tYXBbal1dID0gKEZMQUNfX2ludDMyKSB2YWw7CisgICAgICB9CisgIH0gZWxzZSBpZiAod2lkdGggPT0gMzIpIHsKKyAgICBnaW50MzIgKmluZGF0YSA9IChnaW50MzIgKikgbWFwLmRhdGE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlczsgaSsrKQorICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspCisgICAgICAgIGRhdGFbaSAqIGNoYW5uZWxzICsgcmVvcmRlcl9tYXBbal1dID0KKyAgICAgICAgICAgIChGTEFDX19pbnQzMikgaW5kYXRhW2kgKiBjaGFubmVscyArIGpdOworICB9IGVsc2UgeworICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgcmVzID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfcHJvY2Vzc19pbnRlcmxlYXZlZCAoZmxhY2VuYy0+ZW5jb2RlciwKKyAgICAgIChjb25zdCBGTEFDX19pbnQzMiAqKSBkYXRhLCBzYW1wbGVzKTsKKyAgZmxhY2VuYy0+c2FtcGxlc19pbiArPSBzYW1wbGVzOworCisgIGdfZnJlZSAoZGF0YSk7CisKKyAgaWYgKCFyZXMpIHsKKyAgICBpZiAoZmxhY2VuYy0+bGFzdF9mbG93ID09IEdTVF9GTE9XX09LKQorICAgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICAgIGVsc2UKKyAgICAgIHJldHVybiBmbGFjZW5jLT5sYXN0X2Zsb3c7CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmxhY19lbmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEZsYWNFbmMgKnRoaXMgPSBHU1RfRkxBQ19FTkMgKG9iamVjdCk7CisKKyAgR1NUX09CSkVDVF9MT0NLICh0aGlzKTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUVVBTElUWToKKyAgICAgIGdzdF9mbGFjX2VuY191cGRhdGVfcXVhbGl0eSAodGhpcywgZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVFJFQU1BQkxFX1NVQlNFVDoKKyAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9zdHJlYW1hYmxlX3N1YnNldCAodGhpcy0+ZW5jb2RlciwKKyAgICAgICAgICBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01JRF9TSURFX1NURVJFTzoKKyAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9kb19taWRfc2lkZV9zdGVyZW8gKHRoaXMtPmVuY29kZXIsCisgICAgICAgICAgZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9MT09TRV9NSURfU0lERV9TVEVSRU86CisgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfbG9vc2VfbWlkX3NpZGVfc3RlcmVvICh0aGlzLT5lbmNvZGVyLAorICAgICAgICAgIGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkxPQ0tTSVpFOgorICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2Jsb2Nrc2l6ZSAodGhpcy0+ZW5jb2RlciwKKyAgICAgICAgICBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9MUENfT1JERVI6CisgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfbWF4X2xwY19vcmRlciAodGhpcy0+ZW5jb2RlciwKKyAgICAgICAgICBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1FMUF9DT0VGRl9QUkVDSVNJT046CisgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfcWxwX2NvZWZmX3ByZWNpc2lvbiAodGhpcy0+ZW5jb2RlciwKKyAgICAgICAgICBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1FMUF9DT0VGRl9QUkVDX1NFQVJDSDoKKyAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9kb19xbHBfY29lZmZfcHJlY19zZWFyY2ggKHRoaXMtPmVuY29kZXIsCisgICAgICAgICAgZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9FU0NBUEVfQ09ESU5HOgorICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2RvX2VzY2FwZV9jb2RpbmcgKHRoaXMtPmVuY29kZXIsCisgICAgICAgICAgZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9FWEhBVVNUSVZFX01PREVMX1NFQVJDSDoKKyAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9kb19leGhhdXN0aXZlX21vZGVsX3NlYXJjaCAodGhpcy0+ZW5jb2RlciwKKyAgICAgICAgICBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01JTl9SRVNJRFVBTF9QQVJUSVRJT05fT1JERVI6CisgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfbWluX3Jlc2lkdWFsX3BhcnRpdGlvbl9vcmRlciAodGhpcy0+ZW5jb2RlciwKKyAgICAgICAgICBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9SRVNJRFVBTF9QQVJUSVRJT05fT1JERVI6CisgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfbWF4X3Jlc2lkdWFsX3BhcnRpdGlvbl9vcmRlciAodGhpcy0+ZW5jb2RlciwKKyAgICAgICAgICBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JJQ0VfUEFSQU1FVEVSX1NFQVJDSF9ESVNUOgorICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X3JpY2VfcGFyYW1ldGVyX3NlYXJjaF9kaXN0ICh0aGlzLT5lbmNvZGVyLAorICAgICAgICAgIGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUEFERElORzoKKyAgICAgIHRoaXMtPnBhZGRpbmcgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0VFS1BPSU5UUzoKKyAgICAgIHRoaXMtPnNlZWtwb2ludHMgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KKworICBHU1RfT0JKRUNUX1VOTE9DSyAodGhpcyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmxhY19lbmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEZsYWNFbmMgKnRoaXMgPSBHU1RfRkxBQ19FTkMgKG9iamVjdCk7CisKKyAgR1NUX09CSkVDVF9MT0NLICh0aGlzKTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUVVBTElUWToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCB0aGlzLT5xdWFsaXR5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVFJFQU1BQkxFX1NVQlNFVDoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLAorICAgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2dldF9zdHJlYW1hYmxlX3N1YnNldCAodGhpcy0+ZW5jb2RlcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01JRF9TSURFX1NURVJFTzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLAorICAgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2dldF9kb19taWRfc2lkZV9zdGVyZW8gKHRoaXMtPmVuY29kZXIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9MT09TRV9NSURfU0lERV9TVEVSRU86CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwKKyAgICAgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9nZXRfbG9vc2VfbWlkX3NpZGVfc3RlcmVvICh0aGlzLT5lbmNvZGVyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkxPQ0tTSVpFOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsCisgICAgICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfZ2V0X2Jsb2Nrc2l6ZSAodGhpcy0+ZW5jb2RlcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9MUENfT1JERVI6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwKKyAgICAgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9nZXRfbWF4X2xwY19vcmRlciAodGhpcy0+ZW5jb2RlcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1FMUF9DT0VGRl9QUkVDSVNJT046CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwKKyAgICAgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9nZXRfcWxwX2NvZWZmX3ByZWNpc2lvbiAodGhpcy0+ZW5jb2RlcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1FMUF9DT0VGRl9QUkVDX1NFQVJDSDoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLAorICAgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2dldF9kb19xbHBfY29lZmZfcHJlY19zZWFyY2ggKHRoaXMtPmVuY29kZXIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9FU0NBUEVfQ09ESU5HOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsCisgICAgICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfZ2V0X2RvX2VzY2FwZV9jb2RpbmcgKHRoaXMtPmVuY29kZXIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9FWEhBVVNUSVZFX01PREVMX1NFQVJDSDoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLAorICAgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2dldF9kb19leGhhdXN0aXZlX21vZGVsX3NlYXJjaCAodGhpcy0+ZW5jb2RlcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01JTl9SRVNJRFVBTF9QQVJUSVRJT05fT1JERVI6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwKKyAgICAgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9nZXRfbWluX3Jlc2lkdWFsX3BhcnRpdGlvbl9vcmRlcgorICAgICAgICAgICh0aGlzLT5lbmNvZGVyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX1JFU0lEVUFMX1BBUlRJVElPTl9PUkRFUjoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLAorICAgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2dldF9tYXhfcmVzaWR1YWxfcGFydGl0aW9uX29yZGVyCisgICAgICAgICAgKHRoaXMtPmVuY29kZXIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SSUNFX1BBUkFNRVRFUl9TRUFSQ0hfRElTVDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLAorICAgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2dldF9yaWNlX3BhcmFtZXRlcl9zZWFyY2hfZGlzdCAodGhpcy0+ZW5jb2RlcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BBRERJTkc6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdGhpcy0+cGFkZGluZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0VFS1BPSU5UUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHRoaXMtPnNlZWtwb2ludHMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorCisgIEdTVF9PQkpFQ1RfVU5MT0NLICh0aGlzKTsKK30KZGlmZiAtLWdpdCBhL2V4dC9mbGFjL2dzdGZsYWNlbmMuaCBiL2V4dC9mbGFjL2dzdGZsYWNlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWFlYzRlCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2ZsYWMvZ3N0ZmxhY2VuYy5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfRkxBQ19FTkNfSF9fCisjZGVmaW5lIF9fR1NUX0ZMQUNfRU5DX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2VuY29kZXIuaD4KKworI2luY2x1ZGUgPEZMQUMvYWxsLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9GTEFDX0VOQyAoZ3N0X2ZsYWNfZW5jX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9GTEFDX0VOQyhvYmopIEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKG9iaiwgR1NUX1RZUEVfRkxBQ19FTkMsIEdzdEZsYWNFbmMpCisjZGVmaW5lIEdTVF9GTEFDX0VOQ19DTEFTUyhrbGFzcykgR19UWVBFX0NIRUNLX0NMQVNTX0NBU1Qoa2xhc3MsIEdTVF9UWVBFX0ZMQUNfRU5DLCBHc3RGbGFjRW5jQ2xhc3MpCisjZGVmaW5lIEdTVF9JU19GTEFDX0VOQyhvYmopIEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKG9iaiwgR1NUX1RZUEVfRkxBQ19FTkMpCisjZGVmaW5lIEdTVF9JU19GTEFDX0VOQ19DTEFTUyhrbGFzcykgR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoa2xhc3MsIEdTVF9UWVBFX0ZMQUNfRU5DKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0RmxhY0VuYyBHc3RGbGFjRW5jOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEZsYWNFbmNDbGFzcyBHc3RGbGFjRW5jQ2xhc3M7CisKK3N0cnVjdCBfR3N0RmxhY0VuYyB7CisgIEdzdEF1ZGlvRW5jb2RlciAgZWxlbWVudDsKKworICAvKiA8IHByaXZhdGUgPiAqLworCisgIEdzdEZsb3dSZXR1cm4gIGxhc3RfZmxvdzsgLyogc2F2ZSBmbG93IGZyb20gbGFzdCBwdXNoIHNvIHdlIGNhbiBwYXNzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvcnJlY3QgZmxvdyByZXR1cm4gdXBzdHJlYW0gaW4gY2FzZSB0aGUgcHVzaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZhaWxzIGZvciBzb21lIHJlYXNvbiAqLworCisgIGd1aW50NjQgICAgICAgIG9mZnNldDsKKyAgZ2ludCAgICAgICAgICAgcXVhbGl0eTsKKyAgZ2Jvb2xlYW4gICAgICAgc3RvcHBlZDsKKyAgZ3VpbnQgICAgICAgICAgIHBhZGRpbmc7CisgIGdpbnQgICAgICAgICAgICBzZWVrcG9pbnRzOworCisgIEZMQUNfX1N0cmVhbUVuY29kZXIgKmVuY29kZXI7CisKKyAgRkxBQ19fU3RyZWFtTWV0YWRhdGEgKiptZXRhOworCisgIEdzdFRhZ0xpc3QgKiAgICAgdGFnczsKKyAgR3N0VG9jICogICAgICAgICB0b2M7CisKKyAgZ3VpbnQ2NCAgICAgICAgICBzYW1wbGVzX2luOworICBndWludDY0ICAgICAgICAgIHNhbXBsZXNfb3V0OworICBnYm9vbGVhbiAgICAgICAgIGVvczsKKyAgLyogcXVldWUgaGVhZGVycyB1bnRpbCB3ZSBoYXZlIHRoZW0gYWxsIHNvIHdlIGNhbiBhZGQgc3RyZWFtaGVhZGVycyB0byBjYXBzICovCisgIGdib29sZWFuICAgICAgICAgZ290X2hlYWRlcnM7CisgIEdMaXN0ICAgICAgICAgICAqaGVhZGVyczsKKworICBnaW50ICAgICAgICAgICAgIGNoYW5uZWxfcmVvcmRlcl9tYXBbOF07Cit9OworCitzdHJ1Y3QgX0dzdEZsYWNFbmNDbGFzcyB7CisgIEdzdEF1ZGlvRW5jb2RlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9mbGFjX2VuY19nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0ZMQUNfRU5DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jIGIvZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZTIzOWYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZmxhYy9nc3RmbGFjdGFnLmMKQEAgLTAsMCArMSw1MDEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDAzIENocmlzdG9waGUgRmVyZ2VhdSA8dGV1ZkBnbm9tZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSm9uYXRoYW4gTWF0dGhldyA8am9uYXRoYW5AZDE0bi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogZ3N0ZmxhY3RhZy5jOiBwbHVnLWluIGZvciByZWFkaW5nL21vZGlmeWluZyB2b3JiaXMgY29tbWVudHMgaW4gZmxhYyBmaWxlcworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWZsYWN0YWcKKyAqIEBzZWVfYWxzbzogI2ZsYWNlbmMsICNmbGFjZGVjLCAjR3N0VGFnU2V0dGVyCisgKgorICogVGhlIGZsYWN0YWcgZWxlbWVudCBjYW4gY2hhbmdlIHRoZSB0YWcgY29udGFpbmVkIHdpdGhpbiBhIHJhdworICogRkxBQyBzdHJlYW0uIFNwZWNpZmljYWxseSwgaXQgbW9kaWZpZXMgdGhlIGNvbW1lbnRzIGhlYWRlciBwYWNrZXQKKyAqIG9mIHRoZSBGTEFDIHN0cmVhbS4KKyAqCisgKiBBcHBsaWNhdGlvbnMgY2FuIHNldCB0aGUgdGFncyB0byB3cml0ZSB1c2luZyB0aGUgI0dzdFRhZ1NldHRlciBpbnRlcmZhY2UuCisgKiBUYWdzIGNvbnRhaW5lZCB3aXRoaW5nIHRoZSBGTEFDIGJpdHN0cmVhbSB3aWxsIGJlIHBpY2tlZCB1cAorICogYXV0b21hdGljYWxseSAoYW5kIG1lcmdlZCBhY2NvcmRpbmcgdG8gdGhlIG1lcmdlIG1vZGUgc2V0IHZpYSB0aGUgdGFnCisgKiBzZXR0ZXIgaW50ZXJmYWNlKS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249Zm9vLmZsYWMgISBmbGFjdGFnICEgZmlsZXNpbmsgbG9jYXRpb249YmFyLmZsYWMKKyAqIF18IFRoaXMgZWxlbWVudCBpcyBub3QgdXNlZnVsIHdpdGggZ3N0LWxhdW5jaCwgYmVjYXVzZSBpdCBkb2VzIG5vdCBzdXBwb3J0CisgKiBzZXR0aW5nIHRoZSB0YWdzIG9uIGEgI0dzdFRhZ1NldHRlciBpbnRlcmZhY2UuIENvbmNlcHR1YWxseSwgdGhlIGVsZW1lbnQKKyAqIHdpbGwgdXN1YWxseSBiZSB1c2VkIGluIHRoaXMgb3JkZXIgdGhvdWdoLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2dzdHRhZ3NldHRlci5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0ZmxhY3RhZy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChmbGFjdGFnX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGZsYWN0YWdfZGVidWcKKworLyogZWxlbWVudGZhY3RvcnkgaW5mb3JtYXRpb24gKi8KK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBmbGFjX3RhZ19zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtZmxhYyIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGZsYWNfdGFnX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1mbGFjIikKKyAgICApOworCisKK3N0YXRpYyB2b2lkIGdzdF9mbGFjX3RhZ19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2ZsYWNfdGFnX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X2ZsYWNfdGFnX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZmxhY190YWdfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CisKKyNkZWZpbmUgZ3N0X2ZsYWNfdGFnX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RGbGFjVGFnLCBnc3RfZmxhY190YWcsIEdTVF9UWVBFX0VMRU1FTlQsCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9UQUdfU0VUVEVSLCBOVUxMKSk7CisKKworc3RhdGljIHZvaWQKK2dzdF9mbGFjX3RhZ19jbGFzc19pbml0IChHc3RGbGFjVGFnQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGZsYWN0YWdfZGVidWcsICJmbGFjdGFnIiwgMCwgImZsYWMgdGFnIHJld3JpdGVyIik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3RfZmxhY190YWdfZGlzcG9zZTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X2ZsYWNfdGFnX2NoYW5nZV9zdGF0ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiRkxBQyB0YWdnZXIiLAorICAgICAgIkZvcm1hdHRlci9NZXRhZGF0YSIsCisgICAgICAiUmV3cml0ZSB0YWdzIGluIGEgRkxBQyBmaWxlIiwgIkNocmlzdG9waGUgRmVyZ2VhdSA8dGV1ZkBnbm9tZS5vcmc+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZmxhY190YWdfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmZsYWNfdGFnX3NyY190ZW1wbGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmxhY190YWdfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0RmxhY1RhZyAqdGFnID0gR1NUX0ZMQUNfVEFHIChvYmplY3QpOworCisgIGlmICh0YWctPmFkYXB0ZXIpIHsKKyAgICBnX29iamVjdF91bnJlZiAodGFnLT5hZGFwdGVyKTsKKyAgICB0YWctPmFkYXB0ZXIgPSBOVUxMOworICB9CisgIGlmICh0YWctPnZvcmJpc2NvbW1lbnQpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmICh0YWctPnZvcmJpc2NvbW1lbnQpOworICAgIHRhZy0+dm9yYmlzY29tbWVudCA9IE5VTEw7CisgIH0KKyAgaWYgKHRhZy0+dGFncykgeworICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnLT50YWdzKTsKKyAgICB0YWctPnRhZ3MgPSBOVUxMOworICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9mbGFjX3RhZ19pbml0IChHc3RGbGFjVGFnICogdGFnKQoreworICAvKiBjcmVhdGUgdGhlIHNpbmsgYW5kIHNyYyBwYWRzICovCisgIHRhZy0+c2lua3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJmZsYWNfdGFnX3NpbmtfdGVtcGxhdGUsICJzaW5rIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uICh0YWctPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ZsYWNfdGFnX2NoYWluKSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uICh0YWctPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ZsYWNfdGFnX3NpbmtfZXZlbnQpKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHRhZyksIHRhZy0+c2lua3BhZCk7CisKKyAgdGFnLT5zcmNwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZmbGFjX3RhZ19zcmNfdGVtcGxhdGUsICJzcmMiKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHRhZyksIHRhZy0+c3JjcGFkKTsKKworICB0YWctPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ZsYWNfdGFnX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RGbGFjVGFnICp0YWc7CisgIGdib29sZWFuIHJldDsKKworICB0YWcgPSBHU1RfRkxBQ19UQUcgKHBhcmVudCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiUmVjZWl2ZWQgJXMgZXZlbnQgb24gc2lua3BhZCwgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCksIGV2ZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOgorICAgICAgLyogRklYTUU6IHBhcnNlIGFuZCBzdG9yZSB0aGUgY2Fwcy4gT25jZSB3ZSBwYXJzZWQgYW5kIGJ1aWx0IHRoZSBoZWFkZXJzLAorICAgICAgICogdXBkYXRlIHRoZSAic3RyZWFtaGVhZGVyIiBmaWVsZCBpbiB0aGUgY2FwcyBhbmQgc2VuZCBhIG5ldyBjYXBzIGV2ZW50CisgICAgICAgKi8KKyAgICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAodGFnLT5zcmNwYWQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgRkxBQ19NQUdJQyAiZkxhQyIKKyNkZWZpbmUgRkxBQ19NQUdJQ19TSVpFIChzaXplb2YgKEZMQUNfTUFHSUMpIC0gMSkKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbGFjX3RhZ19jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0RmxhY1RhZyAqdGFnOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdzaXplIHNpemU7CisKKyAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgIHRhZyA9IEdTVF9GTEFDX1RBRyAocGFyZW50KTsKKworICBnc3RfYWRhcHRlcl9wdXNoICh0YWctPmFkYXB0ZXIsIGJ1ZmZlcik7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgInN0YXRlOiAlZCIsIHRhZy0+c3RhdGUpOworCisgIC8qIEluaXRpYWwgc3RhdGUsIHdlIGRvbid0IGV2ZW4ga25vdyBpZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgZmxhYyBmaWxlICovCisgIGlmICh0YWctPnN0YXRlID09IEdTVF9GTEFDX1RBR19TVEFURV9JTklUKSB7CisgICAgR3N0QnVmZmVyICppZF9idWZmZXI7CisKKyAgICBpZiAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlICh0YWctPmFkYXB0ZXIpIDwgc2l6ZW9mIChGTEFDX01BR0lDKSkKKyAgICAgIGdvdG8gY2xlYW51cDsKKworICAgIGlkX2J1ZmZlciA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyICh0YWctPmFkYXB0ZXIsIEZMQUNfTUFHSUNfU0laRSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodGFnLCAibG9va2luZyBmb3IgIiBGTEFDX01BR0lDICIgaWRlbnRpZmllciIpOworICAgIGlmIChnc3RfYnVmZmVyX21lbWNtcCAoaWRfYnVmZmVyLCAwLCBGTEFDX01BR0lDLCBGTEFDX01BR0lDX1NJWkUpID09IDApIHsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAodGFnLCAicHVzaGluZyAiIEZMQUNfTUFHSUMgIiBpZGVudGlmaWVyIGJ1ZmZlciIpOworICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoICh0YWctPnNyY3BhZCwgaWRfYnVmZmVyKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gY2xlYW51cDsKKworICAgICAgdGFnLT5zdGF0ZSA9IEdTVF9GTEFDX1RBR19TVEFURV9NRVRBREFUQV9CTE9DS1M7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEZJWE1FOiBkb2VzIHRoYXQgd29yayB3ZWxsIHdpdGggRkxBQyBmaWxlcyBjb250YWluaW5nIElEM3YyIHRhZ3MgPyAqLworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoaWRfYnVmZmVyKTsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SICh0YWcsIFNUUkVBTSwgV1JPTkdfVFlQRSwgKE5VTEwpLCAoTlVMTCkpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorICB9CisKKworICAvKiBUaGUgZkxhQyBtYWdpYyBzdHJpbmcgaGFzIGJlZW4gc2tpcHBlZCwgdHJ5IHRvIGRldGVjdCB0aGUgYmVnaW5uaW5nCisgICAqIG9mIGEgbWV0YWRhdGEgYmxvY2sKKyAgICovCisgIGlmICh0YWctPnN0YXRlID09IEdTVF9GTEFDX1RBR19TVEFURV9NRVRBREFUQV9CTE9DS1MpIHsKKyAgICBndWludCB0eXBlOworICAgIGdib29sZWFuIGlzX2xhc3Q7CisgICAgY29uc3QgZ3VpbnQ4ICpibG9ja19oZWFkZXI7CisKKyAgICBnX2Fzc2VydCAodGFnLT5tZXRhZGF0YV9ibG9ja19zaXplID09IDApOworICAgIGdfYXNzZXJ0ICh0YWctPm1ldGFkYXRhX2xhc3RfYmxvY2sgPT0gRkFMU0UpOworCisgICAgLyogVGhlIGhlYWRlciBvZiBhIGZsYWMgbWV0YWRhdGEgYmxvY2sgaXMgNCBieXRlcyBsb25nOgorICAgICAqIDFzdCBiaXQ6IGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgdGhlIGxhc3QgbWV0YWRhdGEgaW5mbyBibG9jaworICAgICAqIDcgbmV4dCBiaXRzOiA0IGlmIHZvcmJpcyBjb21tZW50IGJsb2NrCisgICAgICogMjQgbmV4dCBiaXRzOiBzaXplIG9mIHRoZSBtZXRhZGF0YSB0byBmb2xsb3cgKGJpZyBlbmRpYW4pCisgICAgICovCisgICAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAodGFnLT5hZGFwdGVyKSA8IDQpCisgICAgICBnb3RvIGNsZWFudXA7CisKKyAgICBibG9ja19oZWFkZXIgPSBnc3RfYWRhcHRlcl9tYXAgKHRhZy0+YWRhcHRlciwgNCk7CisKKyAgICBpc19sYXN0ID0gKChibG9ja19oZWFkZXJbMF0gJiAweDgwKSA9PSAweDgwKTsKKyAgICB0eXBlID0gYmxvY2tfaGVhZGVyWzBdICYgMHg3RjsKKyAgICBzaXplID0gKGJsb2NrX2hlYWRlclsxXSA8PCAxNikKKyAgICAgICAgfCAoYmxvY2tfaGVhZGVyWzJdIDw8IDgpCisgICAgICAgIHwgYmxvY2tfaGVhZGVyWzNdOworICAgIGdzdF9hZGFwdGVyX3VubWFwICh0YWctPmFkYXB0ZXIpOworCisgICAgLyogVGhlIDQgYnl0ZXMgbG9uZyBoZWFkZXIgaXNuJ3QgaW5jbHVkZWQgaW4gdGhlIG1ldGFkYXRhIHNpemUgKi8KKyAgICB0YWctPm1ldGFkYXRhX2Jsb2NrX3NpemUgPSBzaXplICsgNDsKKyAgICB0YWctPm1ldGFkYXRhX2xhc3RfYmxvY2sgPSBpc19sYXN0OworCisgICAgR1NUX0RFQlVHX09CSkVDVCAodGFnLAorICAgICAgICAiZ290IG1ldGFkYXRhIGJsb2NrOiAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzLCB0eXBlICVkLCAiCisgICAgICAgICJpcyB2b3JiaXNjb21tZW50OiAlZCwgaXMgbGFzdDogJWQiLAorICAgICAgICBzaXplLCB0eXBlLCAodHlwZSA9PSAweDA0KSwgaXNfbGFzdCk7CisKKyAgICAvKiBNZXRhZGF0YSBibG9ja3Mgb2YgdHlwZSA0IGFyZSB2b3JiaXMgY29tbWVudCBibG9ja3MgKi8KKyAgICBpZiAodHlwZSA9PSAweDA0KSB7CisgICAgICB0YWctPnN0YXRlID0gR1NUX0ZMQUNfVEFHX1NUQVRFX1ZDX01FVEFEQVRBX0JMT0NLOworICAgIH0gZWxzZSB7CisgICAgICB0YWctPnN0YXRlID0gR1NUX0ZMQUNfVEFHX1NUQVRFX1dSSVRJTkdfTUVUQURBVEFfQkxPQ0s7CisgICAgfQorICB9CisKKworICAvKiBSZWFkcyBhIG1ldGFkYXRhIGJsb2NrICovCisgIGlmICgodGFnLT5zdGF0ZSA9PSBHU1RfRkxBQ19UQUdfU1RBVEVfV1JJVElOR19NRVRBREFUQV9CTE9DSykgfHwKKyAgICAgICh0YWctPnN0YXRlID09IEdTVF9GTEFDX1RBR19TVEFURV9WQ19NRVRBREFUQV9CTE9DSykpIHsKKyAgICBHc3RCdWZmZXIgKm1ldGFkYXRhX2J1ZmZlcjsKKworICAgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHRhZy0+YWRhcHRlcikgPCB0YWctPm1ldGFkYXRhX2Jsb2NrX3NpemUpCisgICAgICBnb3RvIGNsZWFudXA7CisKKyAgICBtZXRhZGF0YV9idWZmZXIgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAodGFnLT5hZGFwdGVyLAorICAgICAgICB0YWctPm1ldGFkYXRhX2Jsb2NrX3NpemUpOworICAgIC8qIGNsZWFyIHRoZSBpcy1sYXN0IGZsYWcsIGFzIHRoZSBsYXN0IG1ldGFkYXRhIGJsb2NrIHdpbGwKKyAgICAgKiBiZSB0aGUgdm9yYmlzIGNvbW1lbnQgYmxvY2sgd2hpY2ggd2Ugd2lsbCBidWlsZCBvdXJzZWx2ZXMuCisgICAgICovCisgICAgZ3N0X2J1ZmZlcl9tYXAgKG1ldGFkYXRhX2J1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEV1JJVEUpOworICAgIG1hcC5kYXRhWzBdICY9ICh+MHg4MCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAobWV0YWRhdGFfYnVmZmVyLCAmbWFwKTsKKworICAgIGlmICh0YWctPnN0YXRlID09IEdTVF9GTEFDX1RBR19TVEFURV9XUklUSU5HX01FVEFEQVRBX0JMT0NLKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUICh0YWcsICJwdXNoaW5nIG1ldGFkYXRhIGJsb2NrIGJ1ZmZlciIpOworICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoICh0YWctPnNyY3BhZCwgbWV0YWRhdGFfYnVmZmVyKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9IGVsc2UgeworICAgICAgdGFnLT52b3JiaXNjb21tZW50ID0gbWV0YWRhdGFfYnVmZmVyOworICAgIH0KKyAgICB0YWctPm1ldGFkYXRhX2Jsb2NrX3NpemUgPSAwOworICAgIHRhZy0+c3RhdGUgPSBHU1RfRkxBQ19UQUdfU1RBVEVfTUVUQURBVEFfTkVYVF9CTE9DSzsKKyAgfQorCisgIC8qIFRoaXMgc3RhdGUgaXMgbWFpbmx5IHVzZWQgdG8gYmUgYWJsZSB0byBzdG9wIGFzIHNvb24gYXMgd2UgcmVhZAorICAgKiBhIHZvcmJpc2NvbW1lbnQgYmxvY2sgZnJvbSB0aGUgZmxhYyBmaWxlIGlmIHdlIGFyZSBpbiBhbiBvbmx5IG91dHB1dAorICAgKiB0YWdzIG1vZGUKKyAgICovCisgIGlmICh0YWctPnN0YXRlID09IEdTVF9GTEFDX1RBR19TVEFURV9NRVRBREFUQV9ORVhUX0JMT0NLKSB7CisgICAgLyogQ2hlY2sgaWYgaW4gdGhlIHByZXZpb3VzIGl0ZXJhdGlvbiB3ZSByZWFkIGEgdm9yYmlzIGNvbW1lbnQgbWV0YWRhdGEgCisgICAgICogYmxvY2ssIGFuZCBzdG9wIG5vdyBpZiB0aGUgdXNlciBvbmx5IHdhbnRzIHRvIHJlYWQgdGFncworICAgICAqLworICAgIGlmICh0YWctPnZvcmJpc2NvbW1lbnQgIT0gTlVMTCkgeworICAgICAgZ3VpbnQ4IGlkX2RhdGFbNF07CisgICAgICAvKiBXZSBmb3VuZCBzb21lIHRhZ3MsIHRyeSB0byBwYXJzZSB0aGVtIGFuZCBub3RpZnkgdGhlIG90aGVyIGVsZW1lbnRzCisgICAgICAgKiB0aGF0IHdlIGVuY291bnRlcmVkIHNvbWUgdGFncworICAgICAgICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUICh0YWcsICJlbWl0dGluZyB2b3JiaXNjb21tZW50IHRhZ3MiKTsKKyAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAodGFnLT52b3JiaXNjb21tZW50LCAwLCBpZF9kYXRhLCA0KTsKKyAgICAgIHRhZy0+dGFncyA9IGdzdF90YWdfbGlzdF9mcm9tX3ZvcmJpc2NvbW1lbnRfYnVmZmVyICh0YWctPnZvcmJpc2NvbW1lbnQsCisgICAgICAgICAgaWRfZGF0YSwgNCwgTlVMTCk7CisgICAgICBpZiAodGFnLT50YWdzICE9IE5VTEwpIHsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50ICh0YWctPnNyY3BhZCwKKyAgICAgICAgICAgIGdzdF9ldmVudF9uZXdfdGFnIChnc3RfdGFnX2xpc3RfcmVmICh0YWctPnRhZ3MpKSk7CisgICAgICB9CisKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHRhZy0+dm9yYmlzY29tbWVudCk7CisgICAgICB0YWctPnZvcmJpc2NvbW1lbnQgPSBOVUxMOworICAgIH0KKworICAgIC8qIFNraXAgdG8gbmV4dCBzdGF0ZSAqLworICAgIGlmICh0YWctPm1ldGFkYXRhX2xhc3RfYmxvY2sgPT0gRkFMU0UpIHsKKyAgICAgIHRhZy0+c3RhdGUgPSBHU1RfRkxBQ19UQUdfU1RBVEVfTUVUQURBVEFfQkxPQ0tTOworICAgIH0gZWxzZSB7CisgICAgICB0YWctPnN0YXRlID0gR1NUX0ZMQUNfVEFHX1NUQVRFX0FERF9WT1JCSVNfQ09NTUVOVDsKKyAgICB9CisgIH0KKworCisgIC8qIENyZWF0ZXMgYSB2b3JiaXMgY29tbWVudCBibG9jayBmcm9tIHRoZSBtZXRhZGF0YSB3aGljaCB3YXMgc2V0CisgICAqIG9uIHRoZSBnc3RyZWFtZXIgZWxlbWVudCwgYW5kIGFkZCBpdCB0byB0aGUgZmxhYyBzdHJlYW0KKyAgICovCisgIGlmICh0YWctPnN0YXRlID09IEdTVF9GTEFDX1RBR19TVEFURV9BRERfVk9SQklTX0NPTU1FTlQpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgICBjb25zdCBHc3RUYWdMaXN0ICp1c2VyX3RhZ3M7CisgICAgR3N0VGFnTGlzdCAqbWVyZ2VkX3RhZ3M7CisKKyAgICAvKiBtZXJnZSB0aGUgdGFnIGxpc3RzICovCisgICAgdXNlcl90YWdzID0gZ3N0X3RhZ19zZXR0ZXJfZ2V0X3RhZ19saXN0IChHU1RfVEFHX1NFVFRFUiAodGFnKSk7CisgICAgaWYgKHVzZXJfdGFncyAhPSBOVUxMKSB7CisgICAgICBtZXJnZWRfdGFncyA9IGdzdF90YWdfbGlzdF9tZXJnZSAodXNlcl90YWdzLCB0YWctPnRhZ3MsCisgICAgICAgICAgZ3N0X3RhZ19zZXR0ZXJfZ2V0X3RhZ19tZXJnZV9tb2RlIChHU1RfVEFHX1NFVFRFUiAodGFnKSkpOworICAgIH0gZWxzZSB7CisgICAgICBtZXJnZWRfdGFncyA9IGdzdF90YWdfbGlzdF9jb3B5ICh0YWctPnRhZ3MpOworICAgIH0KKworICAgIGlmIChtZXJnZWRfdGFncyA9PSBOVUxMKSB7CisgICAgICAvKiBJZiB3ZSBnZXQgYSBOVUxMIGxpc3Qgb2YgdGFncywgd2UgbXVzdCBnZW5lcmF0ZSBhIHBhZGRpbmcgYmxvY2sKKyAgICAgICAqIHdoaWNoIGlzIG1hcmtlZCBhcyB0aGUgbGFzdCBtZXRhZGF0YSBibG9jaywgb3RoZXJ3aXNlIHdlJ2xsCisgICAgICAgKiBlbmQgdXAgd2l0aCBhIGNvcnJ1cHRlZCBmbGFjIGZpbGUuCisgICAgICAgKi8KKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodGFnLCAiTm8gdGFncyBmb3VuZCIpOworICAgICAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMik7CisgICAgICBpZiAoYnVmZmVyID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9fYnVmZmVyOworCisgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICAgIG1lbXNldCAobWFwLmRhdGEsIDAsIG1hcC5zaXplKTsKKyAgICAgIG1hcC5kYXRhWzBdID0gMHg4MTsgICAgICAgLyogMHg4MCA9IExhc3QgbWV0YWRhdGEgYmxvY2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAweDAxID0gcGFkZGluZyBibG9jayAqLworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICB9IGVsc2UgeworICAgICAgZ3VjaGFyIGhlYWRlcls0XTsKKyAgICAgIGd1aW50OCBmYml0WzFdOworCisgICAgICBtZW1zZXQgKGhlYWRlciwgMCwgc2l6ZW9mIChoZWFkZXIpKTsKKyAgICAgIGhlYWRlclswXSA9IDB4ODQ7ICAgICAgICAgLyogMHg4MCA9IExhc3QgbWV0YWRhdGEgYmxvY2ssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAweDA0ID0gdm9yYmlzY29tbWVudCBibG9jayAqLworICAgICAgYnVmZmVyID0gZ3N0X3RhZ19saXN0X3RvX3ZvcmJpc2NvbW1lbnRfYnVmZmVyIChtZXJnZWRfdGFncywgaGVhZGVyLAorICAgICAgICAgIHNpemVvZiAoaGVhZGVyKSwgTlVMTCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUICh0YWcsICJXcml0aW5nIHRhZ3MgJSIgR1NUX1BUUl9GT1JNQVQsIG1lcmdlZF90YWdzKTsKKyAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAobWVyZ2VkX3RhZ3MpOworICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vX2NvbW1lbnQ7CisKKyAgICAgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworICAgICAgaWYgKChzaXplIDwgNCkgfHwgKChzaXplIC0gNCkgPiAweEZGRkZGRikpCisgICAgICAgIGdvdG8gY29tbWVudF90b29fbG9uZzsKKworICAgICAgZmJpdFswXSA9IDE7CisgICAgICAvKiBHZXQgcmlkIG9mIHRoZSBmcmFtaW5nIGJpdCBhdCB0aGUgZW5kIG9mIHRoZSB2b3JiaXNjb21tZW50IGJ1ZmZlciAKKyAgICAgICAqIGlmIGl0IGV4aXN0cyBzaW5jZSBsaWJGTEFDIHNlZW1zIHRvIGxvc2Ugc3luYyBiZWNhdXNlIG9mIHRoaXMKKyAgICAgICAqIGJpdCBpbiBnc3RmbGFjZGVjCisgICAgICAgKi8KKyAgICAgIGlmIChnc3RfYnVmZmVyX21lbWNtcCAoYnVmZmVyLCBzaXplIC0gMSwgZmJpdCwgMSkgPT0gMCkgeworICAgICAgICBidWZmZXIgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKGJ1ZmZlcik7CisgICAgICAgIGdzdF9idWZmZXJfcmVzaXplIChidWZmZXIsIDAsIHNpemUgLSAxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUaGUgNCBieXRlIG1ldGFkYXRhIGJsb2NrIGhlYWRlciBpc24ndCBhY2NvdW50ZWQgZm9yIGluIHRoZSB0b3RhbAorICAgICAqIHNpemUgb2YgdGhlIG1ldGFkYXRhIGJsb2NrCisgICAgICovCisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgICAgbWFwLmRhdGFbMV0gPSAoKChtYXAuc2l6ZSAtIDQpICYgMHhGRjAwMDApID4+IDE2KTsKKyAgICBtYXAuZGF0YVsyXSA9ICgoKG1hcC5zaXplIC0gNCkgJiAweDAwRkYwMCkgPj4gOCk7CisgICAgbWFwLmRhdGFbM10gPSAoKG1hcC5zaXplIC0gNCkgJiAweDAwMDBGRik7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHRhZywgInB1c2hpbmcgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlIHZvcmJpc2NvbW1lbnQgIgorICAgICAgICAiYnVmZmVyIiwgbWFwLnNpemUpOworCisgICAgcmV0ID0gZ3N0X3BhZF9wdXNoICh0YWctPnNyY3BhZCwgYnVmZmVyKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorICAgIHRhZy0+c3RhdGUgPSBHU1RfRkxBQ19UQUdfU1RBVEVfQVVESU9fREFUQTsKKyAgfQorCisgIC8qIFRoZSBtZXRhZGF0YSBibG9ja3MgaGF2ZSBiZWVuIHJlYWQsIG5vdyB3ZSBhcmUgcmVhZGluZyBhdWRpbyBkYXRhICovCisgIGlmICh0YWctPnN0YXRlID09IEdTVF9GTEFDX1RBR19TVEFURV9BVURJT19EQVRBKSB7CisgICAgR3N0QnVmZmVyICpidWZmZXI7CisgICAgZ3VpbnQgYXZhaWw7CisKKyAgICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAodGFnLT5hZGFwdGVyKTsKKyAgICBpZiAoYXZhaWwgPiAwKSB7CisgICAgICBidWZmZXIgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAodGFnLT5hZGFwdGVyLCBhdmFpbCk7CisgICAgICByZXQgPSBnc3RfcGFkX3B1c2ggKHRhZy0+c3JjcGFkLCBidWZmZXIpOworICAgIH0KKyAgfQorCitjbGVhbnVwOgorICBHU1RfTE9HX09CSkVDVCAocGFkLCAic3RhdGU6ICVkLCByZXQ6ICVkIiwgdGFnLT5zdGF0ZSwgcmV0KTsKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK25vX2J1ZmZlcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh0YWcsIENPUkUsIFRPT19MQVpZLCAoTlVMTCksCisgICAgICAgICgiRXJyb3IgY3JlYXRpbmcgMTItYnl0ZSBidWZmZXIgZm9yIHBhZGRpbmcgYmxvY2siKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBjbGVhbnVwOworICB9Citub19jb21tZW50OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHRhZywgQ09SRSwgVEFHLCAoTlVMTCksCisgICAgICAgICgiRXJyb3IgY29udmVydGluZyB0YWcgbGlzdCB0byB2b3JiaXNjb21tZW50IGJ1ZmZlciIpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KK2NvbW1lbnRfdG9vX2xvbmc6CisgIHsKKyAgICAvKiBGTEFDIHZvcmJpcyBjb21tZW50IGJsb2NrcyBhcmUgbGltaXRlZCB0byAyXjI0IGJ5dGVzLCAKKyAgICAgKiB3aGlsZSB0aGUgdm9yYmlzIHNwZWNzIGFsbG93IG1vcmUgdGhhbiB0aGF0LiBTaG91bGRuJ3QgCisgICAgICogYmUgYSByZWFsIHdvcmxkIHByb2JsZW0gdGhvdWdoCisgICAgICovCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHRhZywgQ09SRSwgVEFHLCAoTlVMTCksCisgICAgICAgICgiVm9yYmlzIGNvbW1lbnQgb2Ygc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCAiIHRvbyBsb25nIiwgc2l6ZSkpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9mbGFjX3RhZ19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RGbGFjVGFnICp0YWc7CisKKyAgdGFnID0gR1NUX0ZMQUNfVEFHIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgICAvKiBkbyBzb21ldGhpbmcgdG8gZ2V0IG91dCBvZiB0aGUgY2hhaW4gZnVuY3Rpb24gZmFzdGVyICovCisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUExBWUlOR19UT19QQVVTRUQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHRhZy0+YWRhcHRlcik7CisgICAgICBpZiAodGFnLT52b3JiaXNjb21tZW50KSB7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHRhZy0+dm9yYmlzY29tbWVudCk7CisgICAgICAgIHRhZy0+dm9yYmlzY29tbWVudCA9IE5VTEw7CisgICAgICB9CisgICAgICBpZiAodGFnLT50YWdzKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnLT50YWdzKTsKKyAgICAgICAgdGFnLT50YWdzID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIHRhZy0+bWV0YWRhdGFfYmxvY2tfc2l6ZSA9IDA7CisgICAgICB0YWctPm1ldGFkYXRhX2xhc3RfYmxvY2sgPSBGQUxTRTsKKyAgICAgIHRhZy0+c3RhdGUgPSBHU1RfRkxBQ19UQUdfU1RBVEVfSU5JVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworfQpkaWZmIC0tZ2l0IGEvZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5oIGIvZXh0L2ZsYWMvZ3N0ZmxhY3RhZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNjU0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZmxhYy9nc3RmbGFjdGFnLmgKQEAgLTAsMCArMSw3OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQ2hyaXN0b3BoZSBGZXJnZWF1IDx0ZXVmQGdub21lLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBKb25hdGhhbiBNYXR0aGV3IDxqb25hdGhhbkBkMTRuLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBnc3RmbGFjdGFnLmM6IHBsdWctaW4gZm9yIHJlYWRpbmcvbW9kaWZ5aW5nIHZvcmJpcyBjb21tZW50cyBpbiBmbGFjIGZpbGVzCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBHU1RfRkxBQ19UQUdfSAorI2RlZmluZSBHU1RfRkxBQ19UQUdfSAorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworI2RlZmluZSBHU1RfVFlQRV9GTEFDX1RBRyAoZ3N0X2ZsYWNfdGFnX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9GTEFDX1RBRyhvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9GTEFDX1RBRywgR3N0RmxhY1RhZykpCisjZGVmaW5lIEdTVF9GTEFDX1RBR19DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfRkxBQ19UQUcsIEdzdEZsYWNUYWcpKQorI2RlZmluZSBHU1RfSVNfRkxBQ19UQUcob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfRkxBQ19UQUcpKQorI2RlZmluZSBHU1RfSVNfRkxBQ19UQUdfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0ZMQUNfVEFHKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEZsYWNUYWcgR3N0RmxhY1RhZzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RGbGFjVGFnQ2xhc3MgR3N0RmxhY1RhZ0NsYXNzOworCit0eXBlZGVmIGVudW0KK3sKKyAgR1NUX0ZMQUNfVEFHX1NUQVRFX0lOSVQsCisgIEdTVF9GTEFDX1RBR19TVEFURV9NRVRBREFUQV9CTE9DS1MsCisgIEdTVF9GTEFDX1RBR19TVEFURV9NRVRBREFUQV9ORVhUX0JMT0NLLAorICBHU1RfRkxBQ19UQUdfU1RBVEVfV1JJVElOR19NRVRBREFUQV9CTE9DSywKKyAgR1NUX0ZMQUNfVEFHX1NUQVRFX1ZDX01FVEFEQVRBX0JMT0NLLAorICBHU1RfRkxBQ19UQUdfU1RBVEVfQUREX1ZPUkJJU19DT01NRU5ULAorICBHU1RfRkxBQ19UQUdfU1RBVEVfQVVESU9fREFUQQorfQorR3N0RmxhY1RhZ1N0YXRlOworCitzdHJ1Y3QgX0dzdEZsYWNUYWcKK3sKKyAgR3N0RWxlbWVudCBlbGVtZW50OworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisKKyAgLyogcGFkcyAqLworICBHc3RQYWQgKnNpbmtwYWQ7CisgIEdzdFBhZCAqc3JjcGFkOworCisgIEdzdEZsYWNUYWdTdGF0ZSBzdGF0ZTsKKworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBHc3RCdWZmZXIgKnZvcmJpc2NvbW1lbnQ7CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisKKyAgZ3VpbnQgbWV0YWRhdGFfYmxvY2tfc2l6ZTsKKyAgZ2Jvb2xlYW4gbWV0YWRhdGFfbGFzdF9ibG9jazsKK307CisKK3N0cnVjdCBfR3N0RmxhY1RhZ0NsYXNzCit7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfZmxhY190YWdfZ2V0X3R5cGUgKHZvaWQpOworCisjZW5kaWYgLyogR1NUX0ZMQUNfVEFHX0ggKi8KZGlmZiAtLWdpdCBhL2V4dC9mbGFjL21lc29uLmJ1aWxkIGIvZXh0L2ZsYWMvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI2NmQxNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9mbGFjL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMjAgQEAKK2ZsYWNfc291cmNlcyA9IFsKKyAgJ2dzdGZsYWMuYycsCisgICdnc3RmbGFjZGVjLmMnLAorICAnZ3N0ZmxhY2VuYy5jJywKKyAgJ2dzdGZsYWN0YWcuYycsCitdCisKK2ZsYWNfZGVwID0gZGVwZW5kZW5jeSgnZmxhYycsIHZlcnNpb24gOiAnPj0xLjEuNCcsIHJlcXVpcmVkIDogZmFsc2UpCisKK2lmIGZsYWNfZGVwLmZvdW5kKCkKKyAgZ3N0ZmxhYyA9IGxpYnJhcnkoJ2dzdGZsYWMnLAorICAgIGZsYWNfc291cmNlcywKKyAgICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MgKyBbJy1ER1NUX1VTRV9VTlNUQUJMRV9BUEknXSwKKyAgICBsaW5rX2FyZ3MgOiBub3NlaF9saW5rX2FyZ3MsCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICAgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0dGFnX2RlcCwgZ3N0YXVkaW9fZGVwLCBmbGFjX2RlcF0sCisgICAgaW5zdGFsbCA6IHRydWUsCisgICAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorICApCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L2dka19waXhidWYvTWFrZWZpbGUuYW0gYi9leHQvZ2RrX3BpeGJ1Zi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODQwMDg2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2dka19waXhidWYvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyNiBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0Z2RrcGl4YnVmLmxhCisKKyMgZ3N0Z2RrYW5pbWF0aW9uLltjaF0gLSBHZGtQaXhidWYgYW5pbWF0aW9ucyBkZWNvZGUgZXZlcnl0aGluZyBmcm9tIHRoZSBzdGFydCwKKyMgd2hpY2ggbWVhbnMgaXQncyBlYXN5IHRvIG1ha2UgdXMgZ28gT09NIHdpdGggbWFuaXB1bGF0ZWQgaW5wdXQsIGRpc2FibGVkCisKK2xpYmdzdGdka3BpeGJ1Zl9sYV9TT1VSQ0VTID0gXAorCWdzdGdka3BpeGJ1ZmRlYy5jIFwKKwlnc3RnZGtwaXhidWZvdmVybGF5LmMgXAorCWdzdGdka3BpeGJ1ZnBsdWdpbi5jIFwKKwlnc3RnZGtwaXhidWZzaW5rLmMKK2xpYmdzdGdka3BpeGJ1Zl9sYV9DRkxBR1MgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgXAorCSQoR1NUX0NPTlRST0xMRVJfQ0ZMQUdTKSBcCisJJChHU1RfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9DRkxBR1MpICQoR0RLX1BJWEJVRl9DRkxBR1MpCitsaWJnc3RnZGtwaXhidWZfbGFfTElCQUREID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJJChHU1RfQ09OVFJPTExFUl9MSUJTKSBcCisJJChHU1RfQkFTRV9MSUJTKSBcCisJJChHU1RfTElCUykgJChHREtfUElYQlVGX0xJQlMpCitsaWJnc3RnZGtwaXhidWZfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IFwKKwlnc3RnZGtwaXhidWZkZWMuaCBcCisJZ3N0Z2RrcGl4YnVmb3ZlcmxheS5oIFwKKwlnc3RnZGtwaXhidWZzaW5rLmgKZGlmZiAtLWdpdCBhL2V4dC9nZGtfcGl4YnVmL2dzdGdka2FuaW1hdGlvbi5jIGIvZXh0L2dka19waXhidWYvZ3N0Z2RrYW5pbWF0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwMzdmZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9nZGtfcGl4YnVmL2dzdGdka2FuaW1hdGlvbi5jCkBAIC0wLDAgKzEsNjYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzIEJlbmphbWluIE90dGUgPGluN3kxMThAcHVibGljLnVuaS1oYW1idXJnLmRlPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGdka2FuaW1hdGlvbi5oIgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfZ2RrX2FuaW1hdGlvbl9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfZ2RrX2FuaW1hdGlvbl9kZWJ1ZworCitzdGF0aWMgdm9pZCBnc3RfZ2RrX2FuaW1hdGlvbl9jbGFzc19pbml0IChncG9pbnRlciBnX2NsYXNzLAorICAgIGdwb2ludGVyIGNsYXNzX2RhdGEpOworc3RhdGljIHZvaWQgZ3N0X2dka19hbmltYXRpb25fZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2dka19hbmltYXRpb25faXNfc3RhdGljX2ltYWdlIChHZGtQaXhidWZBbmltYXRpb24gKgorICAgIGFuaW1hdGlvbik7CitzdGF0aWMgR2RrUGl4YnVmICpnc3RfZ2RrX2FuaW1hdGlvbl9nZXRfc3RhdGljX2ltYWdlIChHZGtQaXhidWZBbmltYXRpb24gKgorICAgIGFuaW1hdGlvbik7CitzdGF0aWMgdm9pZCBnc3RfZ2RrX2FuaW1hdGlvbl9nZXRfc2l6ZSAoR2RrUGl4YnVmQW5pbWF0aW9uICogYW5pbSwgZ2ludCAqIHdpZHRoLAorICAgIGdpbnQgKiBoZWlnaHQpOworc3RhdGljIEdka1BpeGJ1ZkFuaW1hdGlvbkl0ZXIgKmdzdF9nZGtfYW5pbWF0aW9uX2dldF9pdGVyIChHZGtQaXhidWZBbmltYXRpb24gKgorICAgIGFuaW0sIGNvbnN0IEdUaW1lVmFsICogc3RhcnRfdGltZSk7CisKKworc3RhdGljIGdwb2ludGVyIHBhcmVudF9jbGFzczsKKworR1R5cGUKK2dzdF9nZGtfYW5pbWF0aW9uX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgb2JqZWN0X3R5cGUgPSAwOworCisgIGlmICghb2JqZWN0X3R5cGUpIHsKKyAgICBzdGF0aWMgY29uc3QgR1R5cGVJbmZvIG9iamVjdF9pbmZvID0geworICAgICAgc2l6ZW9mIChHc3RHZGtBbmltYXRpb25DbGFzcyksCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICAgIGdzdF9nZGtfYW5pbWF0aW9uX2NsYXNzX2luaXQsCisgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIGNsYXNzX2ZpbmFsaXplICovCisgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIGNsYXNzX2RhdGEgKi8KKyAgICAgIHNpemVvZiAoR3N0R2RrQW5pbWF0aW9uKSwKKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogbl9wcmVhbGxvY3MgKi8KKyAgICAgIE5VTEwsCisgICAgfTsKKworICAgIG9iamVjdF90eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoR0RLX1RZUEVfUElYQlVGX0FOSU1BVElPTiwKKyAgICAgICAgIkdzdEdka0FuaW1hdGlvbiIsICZvYmplY3RfaW5mbywgMCk7CisKKyAgICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X2dka19hbmltYXRpb25fZGVidWcsICJnc3Rsb2FkZXJfYW5pbWF0aW9uIiwgMCwKKyAgICAgICAgIkdTdHJlYW1lciBHZGtQaXhidWYgbG9hZGVyIC0gR2RrQW5pbWF0aW9uIGNsYXNzIik7CisgIH0KKworICByZXR1cm4gb2JqZWN0X3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ2RrX2FuaW1hdGlvbl9jbGFzc19pbml0IChncG9pbnRlciBnX2NsYXNzLCBncG9pbnRlciBjbGFzc19kYXRhKQoreworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChnX2NsYXNzKTsKKyAgR2RrUGl4YnVmQW5pbWF0aW9uQ2xhc3MgKmFuaW1fY2xhc3MgPSBHREtfUElYQlVGX0FOSU1BVElPTl9DTEFTUyAoZ19jbGFzcyk7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChnX2NsYXNzKTsKKworICBvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2dka19hbmltYXRpb25fZmluYWxpemU7CisKKyAgYW5pbV9jbGFzcy0+aXNfc3RhdGljX2ltYWdlID0gZ3N0X2dka19hbmltYXRpb25faXNfc3RhdGljX2ltYWdlOworICBhbmltX2NsYXNzLT5nZXRfc3RhdGljX2ltYWdlID0gZ3N0X2dka19hbmltYXRpb25fZ2V0X3N0YXRpY19pbWFnZTsKKyAgYW5pbV9jbGFzcy0+Z2V0X3NpemUgPSBnc3RfZ2RrX2FuaW1hdGlvbl9nZXRfc2l6ZTsKKyAgYW5pbV9jbGFzcy0+Z2V0X2l0ZXIgPSBnc3RfZ2RrX2FuaW1hdGlvbl9nZXRfaXRlcjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9nZGtfYW5pbWF0aW9uX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RHZGtBbmltYXRpb24gKmFuaSA9IEdTVF9HREtfQU5JTUFUSU9OIChvYmplY3QpOworCisgIGlmIChhbmktPnRlbXBfZmQpIHsKKyAgICBjbG9zZSAoYW5pLT50ZW1wX2ZkKTsKKyAgfQorICBpZiAoYW5pLT50ZW1wX2xvY2F0aW9uKSB7CisgICAgcmVtb3ZlIChhbmktPnRlbXBfbG9jYXRpb24pOworICAgIGdfZnJlZSAoYW5pLT50ZW1wX2xvY2F0aW9uKTsKKyAgfQorICBpZiAoYW5pLT5waXhidWYpIHsKKyAgICBnX29iamVjdF91bnJlZiAoYW5pLT5waXhidWYpOworICAgIGFuaS0+cGl4YnVmID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworR3N0R2RrQW5pbWF0aW9uICoKK2dzdF9nZGtfYW5pbWF0aW9uX25ldyAoR0Vycm9yICoqIGVycm9yKQoreworICBHc3RHZGtBbmltYXRpb24gKmFuaSA9CisgICAgICBHU1RfR0RLX0FOSU1BVElPTiAoZ19vYmplY3RfbmV3IChHU1RfVFlQRV9HREtfQU5JTUFUSU9OLCBOVUxMKSk7CisKKyAgcmV0dXJuIGFuaTsKK30KKworZ2Jvb2xlYW4KK2dzdF9nZGtfYW5pbWF0aW9uX2FkZF9kYXRhIChHc3RHZGtBbmltYXRpb24gKiBhbmksIGNvbnN0IGd1aW50OCAqIGRhdGEsCisgICAgZ3VpbnQgc2l6ZSkKK3sKKyAgcmV0dXJuICh3cml0ZSAoYW5pLT50ZW1wX2ZkLCBkYXRhLCBzaXplKSA9PSBzaXplKTsKK30KKwordm9pZAorZ3N0X2dka19hbmltYXRpb25fZG9uZV9hZGRpbmcgKEdzdEdka0FuaW1hdGlvbiAqIGFuaSkKK3sKKyAgY2xvc2UgKGFuaS0+dGVtcF9mZCk7CisgIGFuaS0+dGVtcF9mZCA9IDA7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2dka19hbmltYXRpb25faXNfc3RhdGljX2ltYWdlIChHZGtQaXhidWZBbmltYXRpb24gKiBhbmltYXRpb24pCit7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9nZGtfYW5pbWF0aW9uX2dldF9zaXplIChHZGtQaXhidWZBbmltYXRpb24gKiBhbmltLCBnaW50ICogd2lkdGgsCisgICAgaW50ICpoZWlnaHQpCit7CisgIEdzdEdka0FuaW1hdGlvbiAqYW5pID0gR1NUX0dES19BTklNQVRJT04gKGFuaW0pOworCisgIEdTVF9MT0dfT0JKRUNUIChhbmksICJnZXRfc2l6ZSBjYWxsZWQgKCVwLCAlcCkgJWQgeCAlZCIsIHdpZHRoLCBoZWlnaHQsCisgICAgICBhbmktPndpZHRoLCBhbmktPmhlaWdodCk7CisgIGlmICh3aWR0aCkKKyAgICAqd2lkdGggPSBhbmktPndpZHRoOworCisgIGlmIChoZWlnaHQpCisgICAgKmhlaWdodCA9IGFuaS0+aGVpZ2h0OworfQorCisKK3N0YXRpYyB2b2lkIGdzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfY2xhc3NfaW5pdCAoZ3BvaW50ZXIgZ19jbGFzcywKKyAgICBncG9pbnRlciBjbGFzc19kYXRhKTsKK3N0YXRpYyB2b2lkIGdzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfaW5pdCAoR1R5cGVJbnN0YW5jZSAqIGluc3RhbmNlLAorICAgIGdwb2ludGVyIGdfY2xhc3MpOworc3RhdGljIHZvaWQgZ3N0X2dka19hbmltYXRpb25faXRlcl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnaW50IGdzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfZ2V0X2RlbGF5X3RpbWUgKEdka1BpeGJ1ZkFuaW1hdGlvbkl0ZXIgKgorICAgIGl0ZXIpOworc3RhdGljIEdka1BpeGJ1ZiAqZ3N0X2dka19hbmltYXRpb25faXRlcl9nZXRfcGl4YnVmIChHZGtQaXhidWZBbmltYXRpb25JdGVyICoKKyAgICBpdGVyKTsKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2dka19hbmltYXRpb25faXRlcl9vbl9jdXJyZW50bHlfbG9hZGluZ19mcmFtZSAoR2RrUGl4YnVmQW5pbWF0aW9uSXRlciAqCisgICAgaXRlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2dka19hbmltYXRpb25faXRlcl9hZHZhbmNlIChHZGtQaXhidWZBbmltYXRpb25JdGVyICogaXRlciwKKyAgICBjb25zdCBHVGltZVZhbCAqIGN1cnJlbnRfdGltZSk7CisKK3N0YXRpYyBncG9pbnRlciBpdGVyX3BhcmVudF9jbGFzczsKKworR1R5cGUKK2dzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBvYmplY3RfdHlwZSA9IDA7CisKKyAgaWYgKCFvYmplY3RfdHlwZSkgeworICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gb2JqZWN0X2luZm8gPSB7CisgICAgICBzaXplb2YgKEdzdEdka0FuaW1hdGlvbkl0ZXJDbGFzcyksCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICAgIGdzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfY2xhc3NfaW5pdCwKKyAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogY2xhc3NfZmluYWxpemUgKi8KKyAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogY2xhc3NfZGF0YSAqLworICAgICAgc2l6ZW9mIChHc3RHZGtBbmltYXRpb25JdGVyKSwKKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogbl9wcmVhbGxvY3MgKi8KKyAgICAgIGdzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfaW5pdCwKKyAgICB9OworCisgICAgb2JqZWN0X3R5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChHREtfVFlQRV9QSVhCVUZfQU5JTUFUSU9OX0lURVIsCisgICAgICAgICJHZGtQaXhidWZBbmlBbmltSXRlciIsICZvYmplY3RfaW5mbywgMCk7CisgIH0KKworICByZXR1cm4gb2JqZWN0X3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX2NsYXNzX2luaXQgKGdwb2ludGVyIGdfY2xhc3MsIGdwb2ludGVyIGNsYXNzX2RhdGEpCit7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGdfY2xhc3MpOworICBHZGtQaXhidWZBbmltYXRpb25JdGVyQ2xhc3MgKmFuaW1faXRlcl9jbGFzcyA9CisgICAgICBHREtfUElYQlVGX0FOSU1BVElPTl9JVEVSX0NMQVNTIChnX2NsYXNzKTsKKworICBpdGVyX3BhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoZ19jbGFzcyk7CisKKyAgb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfZmluYWxpemU7CisKKyAgYW5pbV9pdGVyX2NsYXNzLT5nZXRfZGVsYXlfdGltZSA9IGdzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfZ2V0X2RlbGF5X3RpbWU7CisgIGFuaW1faXRlcl9jbGFzcy0+Z2V0X3BpeGJ1ZiA9IGdzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfZ2V0X3BpeGJ1ZjsKKyAgYW5pbV9pdGVyX2NsYXNzLT5vbl9jdXJyZW50bHlfbG9hZGluZ19mcmFtZSA9CisgICAgICBnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX29uX2N1cnJlbnRseV9sb2FkaW5nX2ZyYW1lOworICBhbmltX2l0ZXJfY2xhc3MtPmFkdmFuY2UgPSBnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX2FkdmFuY2U7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX2luaXQgKEdUeXBlSW5zdGFuY2UgKiBpbnN0YW5jZSwgZ3BvaW50ZXIgZ19jbGFzcykKK3sKKyAgR3N0R2RrQW5pbWF0aW9uSXRlciAqaXRlciA9IEdTVF9HREtfQU5JTUFUSU9OX0lURVIgKGluc3RhbmNlKTsKKworICBpdGVyLT5idWZmZXJzID0gZ19xdWV1ZV9uZXcgKCk7CisgIGl0ZXItPmVvcyA9IEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2dka19hbmltYXRpb25faXRlcl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0R2RrQW5pbWF0aW9uSXRlciAqaXRlciA9IEdTVF9HREtfQU5JTUFUSU9OX0lURVIgKG9iamVjdCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGl0ZXItPmFuaSk7CisKKyAgaWYgKGl0ZXItPnBpcGVsaW5lKQorICAgIGdfb2JqZWN0X3VucmVmIChpdGVyLT5waXBlbGluZSk7CisgIGlmIChpdGVyLT5waXhidWYpCisgICAgZ19vYmplY3RfdW5yZWYgKGl0ZXItPnBpeGJ1Zik7CisgIHdoaWxlIChpdGVyLT5idWZmZXJzKSB7CisgICAgR3N0QnVmZmVyICpidWZmZXIgPSBHU1RfQlVGRkVSIChnX3F1ZXVlX3BvcF9oZWFkIChpdGVyLT5idWZmZXJzKSk7CisKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAoaXRlciwgInVucmVmZmluZyBidWZmZXIgJXAgb24gZmluYWxpemUiLCBidWZmZXIpOworICAgICAgZ3N0X2RhdGFfdW5yZWYgKEdTVF9EQVRBIChidWZmZXIpKTsKKyAgICB9IGVsc2UgeworICAgICAgZ19xdWV1ZV9mcmVlIChpdGVyLT5idWZmZXJzKTsKKyAgICAgIGl0ZXItPmJ1ZmZlcnMgPSBOVUxMOworICAgIH0KKyAgfQorICBHX09CSkVDVF9DTEFTUyAoaXRlcl9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dvdF9oYW5kb2ZmIChHc3RFbGVtZW50ICogZmFrZXNpbmssIEdzdEJ1ZmZlciAqIGJ1ZmZlciwgR3N0UGFkICogcGFkLAorICAgIEdzdEdka0FuaW1hdGlvbkl0ZXIgKiBpdGVyKQoreworICBHU1RfTE9HX09CSkVDVCAoaXRlciwgImVucXVlaW5nIGJ1ZmZlciAlcCAodGltZXN0YW1wICUiIEdfR1VJTlQ2NF9GT1JNQVQgIikiLAorICAgICAgYnVmZmVyLCBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSk7CisgIGdzdF9kYXRhX3JlZiAoR1NUX0RBVEEgKGJ1ZmZlcikpOworICBnX3F1ZXVlX3B1c2hfdGFpbCAoaXRlci0+YnVmZmVycywgYnVmZmVyKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX2NyZWF0ZV9waXBlbGluZSAoR3N0R2RrQW5pbWF0aW9uSXRlciAqIGl0ZXIpCit7CisgIEdzdEVsZW1lbnQgKnNyYywgKnR5cGVmaW5kLCAqYXV0b3BsdWdnZXIsICpzaW5rLCAqY29sb3JzcGFjZTsKKyAgR3N0Q2FwcyAqY2FwcyA9IEdTVF9DQVBTX05FVyAoInBpeGJ1Zl9maWx0ZXIzMiIsCisgICAgICAidmlkZW8veC1yYXctcmdiIiwKKyAgICAgICJlbmRpYW5uZXNzIiwgR1NUX1BST1BTX0lOVCAoR19CSUdfRU5ESUFOKSwKKyAgICAgICJicHAiLCBHU1RfUFJPUFNfSU5UICgzMiksCisgICAgICAicmVkX21hc2siLCBHU1RfUFJPUFNfSU5UICgweEZGMDAwMDAwKSwKKyAgICAgICJncmVlbl9tYXNrIiwgR1NUX1BST1BTX0lOVCAoMHgwMEZGMDAwMCksCisgICAgICAiYmx1ZV9tYXNrIiwgR1NUX1BST1BTX0lOVCAoMHgwMDAwRkYwMCkKKyAgICAgICk7CisKKyAgZ3N0X2NhcHNfYXBwZW5kIChjYXBzLCBHU1RfQ0FQU19ORVcgKCJwaXhidWZfZmlsdGVyMjQiLAorICAgICAgICAgICJ2aWRlby94LXJhdy1yZ2IiLAorICAgICAgICAgICJlbmRpYW5uZXNzIiwgR1NUX1BST1BTX0lOVCAoR19CSUdfRU5ESUFOKSwKKyAgICAgICAgICAiYnBwIiwgR1NUX1BST1BTX0lOVCAoMjQpLAorICAgICAgICAgICJyZWRfbWFzayIsIEdTVF9QUk9QU19JTlQgKDB4RkYwMDAwKSwKKyAgICAgICAgICAiZ3JlZW5fbWFzayIsIEdTVF9QUk9QU19JTlQgKDB4MDBGRjAwKSwKKyAgICAgICAgICAiYmx1ZV9tYXNrIiwgR1NUX1BST1BTX0lOVCAoMHgwMDAwRkYpCisgICAgICApKTsKKworICBpdGVyLT5waXBlbGluZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInBpcGVsaW5lIiwgIm1haW5fcGlwZWxpbmUiKTsKKyAgaWYgKGl0ZXItPnBpcGVsaW5lID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghKHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZpbGVzcmMiLCAic291cmNlIikpKQorICAgIGdvdG8gZXJyb3I7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChpdGVyLT5waXBlbGluZSksIHNyYyk7CisgIGlmIChpdGVyLT5hbmktPnRlbXBfbG9jYXRpb24pIHsKKyAgICBnX29iamVjdF9zZXQgKHNyYywgImxvY2F0aW9uIiwgaXRlci0+YW5pLT50ZW1wX2xvY2F0aW9uLCBOVUxMKTsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGl0ZXIsICJ1c2luZyBmaWxlICclcyciLCBpdGVyLT5hbmktPnRlbXBfbG9jYXRpb24pOworICB9IGVsc2UgeworICAgIGdjaGFyICpmaWxlbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoIi9wcm9jL3NlbGYvZmQvJWQiLCBpdGVyLT5hbmktPnRlbXBfZmQpOworCisgICAgZ19vYmplY3Rfc2V0IChzcmMsICJsb2NhdGlvbiIsIGZpbGVuYW1lLCBOVUxMKTsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGl0ZXIsICJ1c2luZyBmaWxlICclcyciLCBmaWxlbmFtZSk7CisgICAgZ19mcmVlIChmaWxlbmFtZSk7CisgIH0KKworICAvKiBhZGQgdHlwZWZpbmQgZm9yIGNvcnJlY3QgdHlwZWZpbmRpbmcgKi8KKyAgaWYgKCh0eXBlZmluZCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInR5cGVmaW5kIiwgInR5cGVmaW5kIikpKSB7CisgICAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKGl0ZXItPnBpcGVsaW5lKSwgdHlwZWZpbmQpOworICAgIGlmICghZ3N0X2VsZW1lbnRfbGluayAoc3JjLCB0eXBlZmluZCkpCisgICAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKCEoYXV0b3BsdWdnZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJzcGlkZXIiLCAiYXV0b3BsdWdnZXIiKSkpCisgICAgZ290byBlcnJvcjsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKGl0ZXItPnBpcGVsaW5lKSwgYXV0b3BsdWdnZXIpOworICBpZiAoIWdzdF9lbGVtZW50X2xpbmsgKHR5cGVmaW5kLCBhdXRvcGx1Z2dlcikpCisgICAgZ290byBlcnJvcjsKKworICAvKiB0cnkgZmZjb2xvcnNwYWNlIGlmIGF2YWlsYWJsZSBzbyB3ZSBnZXQgc3ZxMSwgdG9vICovCisgIGNvbG9yc3BhY2UgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmZmNvbG9yc3BhY2UiLCAiZmZjb2xvcnNwYWNlIik7CisgIGlmICghY29sb3JzcGFjZSkKKyAgICBjb2xvcnNwYWNlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiY29sb3JzcGFjZSIsICJjb2xvcnNwYWNlIik7CisgIGlmICghY29sb3JzcGFjZSkKKyAgICBnb3RvIGVycm9yOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAoaXRlci0+cGlwZWxpbmUpLCBjb2xvcnNwYWNlKTsKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rIChhdXRvcGx1Z2dlciwgY29sb3JzcGFjZSkpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoIShzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpKSkKKyAgICBnb3RvIGVycm9yOworICBnX29iamVjdF9zZXQgKHNpbmssICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoc2luaywgImhhbmRvZmYiLCAoR0NhbGxiYWNrKSBnb3RfaGFuZG9mZiwgaXRlcik7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChpdGVyLT5waXBlbGluZSksIHNpbmspOworICBpZiAoIWdzdF9lbGVtZW50X2xpbmtfZmlsdGVyZWQgKGNvbG9yc3BhY2UsIHNpbmssIGNhcHMpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGl0ZXItPnBpcGVsaW5lLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSAhPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpCisgICAgZ290byBlcnJvcjsKKworICByZXR1cm4gVFJVRTsKK2Vycm9yOgorICBnX29iamVjdF91bnJlZiAoaXRlci0+cGlwZWxpbmUpOworICBpdGVyLT5waXBlbGluZSA9IE5VTEw7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX21heV9hZHZhbmNlIChHc3RHZGtBbmltYXRpb25JdGVyICogaXRlcikKK3sKKyAgR3N0Rm9ybWF0IGJ5dGVzID0gR1NUX0ZPUk1BVF9CWVRFUzsKKyAgZ2ludDY0IG9mZnNldDsKKyAgZ2ludDY0IGRhdGFfYW1vdW50OworCisgIGlmIChpdGVyLT5hbmktPnRlbXBfZmQgPT0gMCB8fCBpdGVyLT5hbmktPnRlbXBfbG9jYXRpb24gPT0gTlVMTCkKKyAgICByZXR1cm4gVFJVRTsKKworICBkYXRhX2Ftb3VudCA9IGxzZWVrIChpdGVyLT5hbmktPnRlbXBfZmQsIDAsIFNFRUtfQ1VSKTsKKyAgZ19hc3NlcnQgKGRhdGFfYW1vdW50ID49IDApOworICBpZiAoIWdzdF9lbGVtZW50X3F1ZXJ5IChnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChpdGVyLT5waXBlbGluZSksCisgICAgICAgICAgICAgICJzb3VyY2UiKSwgR1NUX1FVRVJZX1BPU0lUSU9OLCAmYnl0ZXMsICZvZmZzZXQpKQorICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICBpZiAoZGF0YV9hbW91bnQgLSBvZmZzZXQgPiBHU1RfR0RLX0JVRkZFUl9TSVpFKQorICAgIHJldHVybiBUUlVFOworCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ2RrX2FuaW1hdGlvbl9nZXRfbW9yZV9idWZmZXJzIChHc3RHZGtBbmltYXRpb25JdGVyICogaXRlcikKK3sKKyAgR3N0QnVmZmVyICpsYXN0ID0gZ19xdWV1ZV9wZWVrX3RhaWwgKGl0ZXItPmJ1ZmZlcnMpOworCisgIGRvIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoaXRlciwgIml0ZXJhdGluZy4uLiIpOworICAgIGlmICghZ3N0X2dka19hbmltYXRpb25faXRlcl9tYXlfYWR2YW5jZSAoaXRlcikpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChpdGVyLCAibm8gbW9yZSBkYXRhIGF2YWlsYWJsZSIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghZ3N0X2Jpbl9pdGVyYXRlIChHU1RfQklOIChpdGVyLT5waXBlbGluZSkpKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAoaXRlciwgIml0ZXJhdGluZyBkb25lLCBzZXR0aW5nIEVPUyIpOworICAgICAgaXRlci0+ZW9zID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfSB3aGlsZSAobGFzdCA9PSBnX3F1ZXVlX3BlZWtfdGFpbCAoaXRlci0+YnVmZmVycykpOworICByZXR1cm4gbGFzdCAhPSBnX3F1ZXVlX3BlZWtfdGFpbCAoaXRlci0+YnVmZmVycyk7Cit9CisKK3N0YXRpYyB2b2lkCitwaXhidWZfZGVzdHJveV9ub3RpZnkgKGd1Y2hhciAqIHBpeGVscywgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR1NUX0xPRyAoInVucmVmZmluZyBidWZmZXIgJXAgYmVjYXVzZSBwaXhidWYgd2FzIGRlc3Ryb3llZCIsIGRhdGEpOworICBnc3RfZGF0YV91bnJlZiAoR1NUX0RBVEEgKGRhdGEpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfY3JlYXRlX3BpeGJ1ZiAoR3N0R2RrQW5pbWF0aW9uSXRlciAqIGl0ZXIpCit7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RHZGtBbmltYXRpb24gKmFuaSA9IGl0ZXItPmFuaTsKKworICBidWYgPSBnX3F1ZXVlX3BvcF9oZWFkIChpdGVyLT5idWZmZXJzKTsKKyAgZ19hc3NlcnQgKGJ1Zik7CisgIGlmIChpdGVyLT5waXhidWYpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoaXRlciwgInVucmVmZmluZyBwaXhidWYgJXAiLCBpdGVyLT5waXhidWYpOworICAgIGdfb2JqZWN0X3VucmVmIChpdGVyLT5waXhidWYpOworICB9CisgIGlmIChhbmktPndpZHRoID09IDApIHsKKyAgICBHc3RQYWQgKnBhZDsKKyAgICBHc3RDYXBzICpjYXBzOworICAgIEdzdEVsZW1lbnQgKmZha2VzaW5rID0KKyAgICAgICAgZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAoaXRlci0+cGlwZWxpbmUpLCAic2luayIpOworICAgIGdfYXNzZXJ0IChmYWtlc2luayk7CisgICAgcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3BhZCAoZmFrZXNpbmssICJzaW5rIik7CisgICAgZ19hc3NlcnQgKHBhZCk7CisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X25lZ290aWF0ZWRfY2FwcyAocGFkKTsKKyAgICBnX2Fzc2VydCAoY2Fwcyk7CisgICAgZ19hc3NlcnQgKEdTVF9DQVBTX0lTX0ZJWEVEIChjYXBzKSk7CisgICAgZ19hc3NlcnQgKGdzdF9jYXBzX2hhc19maXhlZF9wcm9wZXJ0eSAoY2FwcywgImJwcCIpICYmCisgICAgICAgIGdzdF9jYXBzX2hhc19maXhlZF9wcm9wZXJ0eSAoY2FwcywgIndpZHRoIikgJiYKKyAgICAgICAgZ3N0X2NhcHNfaGFzX2ZpeGVkX3Byb3BlcnR5IChjYXBzLCAiaGVpZ2h0IikpOworICAgIGdzdF9jYXBzX2dldF9pbnQgKGNhcHMsICJ3aWR0aCIsICZhbmktPndpZHRoKTsKKyAgICBnc3RfY2Fwc19nZXRfaW50IChjYXBzLCAiaGVpZ2h0IiwgJmFuaS0+aGVpZ2h0KTsKKyAgICBnc3RfY2Fwc19nZXRfaW50IChjYXBzLCAiYnBwIiwgJmFuaS0+YnBwKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhbmksICJmb3VuZCBmb3JtYXQgKHdpZHRoICVkLCBoZWlnaHQgJWQsIGJwcCAlZCkiLAorICAgICAgICBhbmktPndpZHRoLCBhbmktPmhlaWdodCwgYW5pLT5icHApOworICB9CisgIGdfYXNzZXJ0IChHU1RfQlVGRkVSX1NJWkUgKGJ1ZikgPT0gYW5pLT53aWR0aCAqIGFuaS0+aGVpZ2h0ICogYW5pLT5icHAgLyA4KTsKKyAgaWYgKGFuaS0+YnBwID09IDMyKSB7CisgICAgZ2ludCBpOworICAgIGd1aW50MzIgKmRhdGEgPSAoZ3VpbnQzMiAqKSBHU1RfQlVGRkVSX0RBVEEgKGJ1Zik7CisKKyAgICAvKiBlbnN1cmUgb3BhY2l0eSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBhbmktPndpZHRoICogYW5pLT5oZWlnaHQ7IGkrKykgeworICAgICAgZGF0YVtpXSB8PSAweEZGMDAwMDAwOworICAgIH0KKyAgfQorICBpdGVyLT5waXhidWYgPSBnZGtfcGl4YnVmX25ld19mcm9tX2RhdGEgKEdTVF9CVUZGRVJfREFUQSAoYnVmKSwKKyAgICAgIEdES19DT0xPUlNQQUNFX1JHQiwgYW5pLT5icHAgPT0gMzIsIDgsIGFuaS0+d2lkdGgsIGFuaS0+aGVpZ2h0LAorICAgICAgYW5pLT53aWR0aCAqIGFuaS0+YnBwIC8gOCwgcGl4YnVmX2Rlc3Ryb3lfbm90aWZ5LCBidWYpOworICBHU1RfTE9HX09CSkVDVCAoaXRlciwgImNyZWF0ZWQgcGl4YnVmICVwIGZyb20gYnVmZmVyICVwIChyZWZjb3VudCAlZCkiLAorICAgICAgaXRlci0+cGl4YnVmLCBidWYsIEdTVF9EQVRBX1JFRkNPVU5UX1ZBTFVFIChidWYpKTsKK30KKworc3RhdGljIEdka1BpeGJ1ZkFuaW1hdGlvbkl0ZXIgKgorZ3N0X2dka19hbmltYXRpb25fZ2V0X2l0ZXIgKEdka1BpeGJ1ZkFuaW1hdGlvbiAqIGFuaW0sCisgICAgY29uc3QgR1RpbWVWYWwgKiBzdGFydF90aW1lKQoreworICBHc3RHZGtBbmltYXRpb24gKmFuaSA9IEdTVF9HREtfQU5JTUFUSU9OIChhbmltKTsKKyAgR3N0R2RrQW5pbWF0aW9uSXRlciAqaXRlcjsKKworICBpZiAoYW5pLT50ZW1wX2ZkICE9IDAgJiYgYW5pLT50ZW1wX2xvY2F0aW9uICE9IE5VTEwgJiYKKyAgICAgIGxzZWVrIChhbmktPnRlbXBfZmQsIDAsIFNFRUtfQ1VSKSA8IEdTVF9HREtfQlVGRkVSX1NJWkUpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhbmksICJOb3QgZW5vdWdoIGRhdGEgdG8gY3JlYXRlIGl0ZXJhdG9yLiIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaXRlciA9IGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfR0RLX0FOSU1BVElPTl9JVEVSLCBOVUxMKTsKKworICBpdGVyLT5zdGFydCA9ICpzdGFydF90aW1lOworCisgIGl0ZXItPmFuaSA9IGFuaTsKKyAgZ19vYmplY3RfcmVmIChhbmkpOworICBpZiAoIWdzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfY3JlYXRlX3BpcGVsaW5lIChpdGVyKSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmICghZ3N0X2dka19hbmltYXRpb25fZ2V0X21vcmVfYnVmZmVycyAoaXRlcikpCisgICAgZ290byBlcnJvcjsKKworICBnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX2NyZWF0ZV9waXhidWYgKGl0ZXIpOworCisgIHJldHVybiBHREtfUElYQlVGX0FOSU1BVElPTl9JVEVSIChpdGVyKTsKKworZXJyb3I6CisgIGdfb2JqZWN0X3VucmVmIChpdGVyKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2dka19hbmltYXRpb25faXRlcl9hZHZhbmNlIChHZGtQaXhidWZBbmltYXRpb25JdGVyICogYW5pbV9pdGVyLAorICAgIGNvbnN0IEdUaW1lVmFsICogY3VycmVudF90aW1lKQoreworICBHc3RDbG9ja1RpbWUgb2Zmc2V0OworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IE5VTEw7CisgIEdzdEdka0FuaW1hdGlvbkl0ZXIgKml0ZXIgPSBHU1RfR0RLX0FOSU1BVElPTl9JVEVSIChhbmltX2l0ZXIpOworCisgIC8qIGNvbXB1dGUgdGltZXN0YW1wIHRoYXQgbmV4dCBidWZmZXIgbXVzdCBtYXRjaCAqLworICBvZmZzZXQgPQorICAgICAgKChHc3RDbG9ja1RpbWUpIGN1cnJlbnRfdGltZS0+dHZfc2VjIC0gaXRlci0+c3RhcnQudHZfc2VjKSAqIEdTVF9TRUNPTkQ7CisgIGlmIChpdGVyLT5zdGFydC50dl91c2VjID4gY3VycmVudF90aW1lLT50dl91c2VjKSB7CisgICAgb2Zmc2V0IC09CisgICAgICAgICgoR3N0Q2xvY2tUaW1lKSBpdGVyLT5zdGFydC50dl91c2VjIC0KKyAgICAgICAgY3VycmVudF90aW1lLT50dl91c2VjKSAqIEdTVF9TRUNPTkQgLyBHX1VTRUNfUEVSX1NFQzsKKyAgfSBlbHNlIHsKKyAgICBvZmZzZXQgKz0KKyAgICAgICAgKChHc3RDbG9ja1RpbWUpIGN1cnJlbnRfdGltZS0+dHZfdXNlYyAtCisgICAgICAgIGl0ZXItPnN0YXJ0LnR2X3VzZWMpICogR1NUX1NFQ09ORCAvIEdfVVNFQ19QRVJfU0VDOworICB9CisgIEdTVF9ERUJVR19PQkpFQ1QgKGl0ZXIsCisgICAgICAiYWR2YW5jaW5nIHRvICVsZDolbGQgKHN0YXJ0ZWQgYXQgJWxkOiVsZCkgbmVlZCBvZmZzZXQgJSIKKyAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGN1cnJlbnRfdGltZS0+dHZfc2VjLCBjdXJyZW50X3RpbWUtPnR2X3VzZWMsCisgICAgICBpdGVyLT5zdGFydC50dl9zZWMsIGl0ZXItPnN0YXJ0LnR2X3VzZWMsIG9mZnNldCk7CisgIGlmICghaXRlci0+anVzdF9zZWVrZWQKKyAgICAgICYmIG9mZnNldCAtIGl0ZXItPmxhc3RfdGltZXN0YW1wID4gR1NUX0dES19NQVhfREVMQVlfVE9fU0VFSykgeworICAgIEdTVF9JTkZPX09CSkVDVCAoaXRlciwKKyAgICAgICAgImN1cnJlbnQgcGlwZWxpbmUgdGltZXN0YW1wIGlzIHRvbyBvbGQgKCUiIEdfR1VJTlQ2NF9GT1JNQVQgIiB2cyAlIgorICAgICAgICBHX0dVSU5UNjRfRk9STUFUICIpLCBzZWVraW5nIHRoZXJlIiwgaXRlci0+bGFzdF90aW1lc3RhbXAsIG9mZnNldCk7CisgICAgaWYgKGdzdF9lbGVtZW50X3NlbmRfZXZlbnQgKGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKGl0ZXItPnBpcGVsaW5lKSwKKyAgICAgICAgICAgICAgICAic2luayIpLAorICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19zZWVrIChHU1RfRk9STUFUX1RJTUUgfCBHU1RfU0VFS19NRVRIT0RfU0VUIHwKKyAgICAgICAgICAgICAgICBHU1RfU0VFS19GTEFHX0ZMVVNIIHwgR1NUX1NFRUtfRkxBR19BQ0NVUkFURSwgb2Zmc2V0KSkpIHsKKyAgICAgIGl0ZXItPmxhc3RfdGltZXN0YW1wID0gb2Zmc2V0OworICAgICAgaXRlci0+anVzdF9zZWVrZWQgPSBUUlVFOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGl0ZXIsCisgICAgICAgICAgInNlZWsgdG8gJSIgR19HVUlOVDY0X0ZPUk1BVCAiIGRpZG4ndCB3b3JrLiBJdGVyYXRpbmcgdGhlcmUuLi4iLAorICAgICAgICAgIG9mZnNldCk7CisgICAgfQorICB9IGVsc2UgaWYgKGl0ZXItPmp1c3Rfc2Vla2VkKSB7CisgICAgaXRlci0+anVzdF9zZWVrZWQgPSBGQUxTRTsKKyAgfQorCisgIHdoaWxlIChUUlVFKSB7CisgICAgaWYgKGdfcXVldWVfaXNfZW1wdHkgKGl0ZXItPmJ1ZmZlcnMpKSB7CisgICAgICBpZiAoaXRlci0+ZW9zKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBpZiAoZ3N0X2dka19hbmltYXRpb25fZ2V0X21vcmVfYnVmZmVycyAoaXRlcikpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoZ19xdWV1ZV9wZWVrX2hlYWQgKGl0ZXItPmJ1ZmZlcnMpKSA+IG9mZnNldCkKKyAgICAgIGJyZWFrOworICAgIGlmIChidWZmZXIpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChpdGVyLCAidW5yZWZmaW5nIGJ1ZmZlciAlcCwgYmVjYXVzZSB0aW1lc3RhbXAgdG9vIGxvdyAoJSIKKyAgICAgICAgICBHX0dVSU5UNjRfRk9STUFUICIgdnMgJSIgR19HVUlOVDY0X0ZPUk1BVCAiKSIsCisgICAgICAgICAgYnVmZmVyLCBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSwgb2Zmc2V0KTsKKyAgICAgIGdzdF9kYXRhX3VucmVmIChHU1RfREFUQSAoYnVmZmVyKSk7CisgICAgfQorICAgIGJ1ZmZlciA9IEdTVF9CVUZGRVIgKGdfcXVldWVfcG9wX2hlYWQgKGl0ZXItPmJ1ZmZlcnMpKTsKKyAgfQorICBpZiAoIWJ1ZmZlcikKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSA8IGl0ZXItPmxhc3RfdGltZXN0YW1wKSB7CisgICAgZ3N0X2RhdGFfdW5yZWYgKEdTVF9EQVRBIChidWZmZXIpKTsKKyAgICBpdGVyLT5sYXN0X3RpbWVzdGFtcCA9IG9mZnNldDsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaXRlci0+bGFzdF90aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKTsKKyAgZ19xdWV1ZV9wdXNoX2hlYWQgKGl0ZXItPmJ1ZmZlcnMsIGJ1ZmZlcik7CisgIGdzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfY3JlYXRlX3BpeGJ1ZiAoaXRlcik7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2ludAorZ3N0X2dka19hbmltYXRpb25faXRlcl9nZXRfZGVsYXlfdGltZSAoR2RrUGl4YnVmQW5pbWF0aW9uSXRlciAqIGFuaW1faXRlcikKK3sKKyAgZ2ludCBkZWxheTsKKyAgR3N0R2RrQW5pbWF0aW9uSXRlciAqaXRlciA9IEdTVF9HREtfQU5JTUFUSU9OX0lURVIgKGFuaW1faXRlcik7CisKKyAgd2hpbGUgKGdfcXVldWVfaXNfZW1wdHkgKGl0ZXItPmJ1ZmZlcnMpKSB7CisgICAgaWYgKGl0ZXItPmVvcykgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKGl0ZXIsICJyZXR1cm5pbmcgZGVsYXkgb2YgaW5maW5pdGUsIHdlJ3JlIEVPUyIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIWdzdF9nZGtfYW5pbWF0aW9uX2dldF9tb3JlX2J1ZmZlcnMgKGl0ZXIpKQorICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAvKiBGSVhNRT8gKi8KKyAgfQorCisgIGRlbGF5ID0KKyAgICAgIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoZ19xdWV1ZV9wZWVrX2hlYWQgKGl0ZXItPmJ1ZmZlcnMpKSAtCisgICAgICBpdGVyLT5sYXN0X3RpbWVzdGFtcCkgKiAxMDAwIC8gR1NUX1NFQ09ORDsKKyAgR1NUX0xPR19PQkpFQ1QgKGl0ZXIsICJyZXR1cm5pbmcgZGVsYXkgb2YgJWQgbXMiLCBkZWxheSk7CisgIHJldHVybiBkZWxheTsKK30KKworR2RrUGl4YnVmICoKK2dzdF9nZGtfYW5pbWF0aW9uX2l0ZXJfZ2V0X3BpeGJ1ZiAoR2RrUGl4YnVmQW5pbWF0aW9uSXRlciAqIGFuaW1faXRlcikKK3sKKyAgR3N0R2RrQW5pbWF0aW9uSXRlciAqaXRlciA9IEdTVF9HREtfQU5JTUFUSU9OX0lURVIgKGFuaW1faXRlcik7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGl0ZXIsICJyZXR1cm5pbmcgcGl4YnVmICVwIiwgaXRlci0+cGl4YnVmKTsKKyAgcmV0dXJuIGl0ZXItPnBpeGJ1ZjsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX29uX2N1cnJlbnRseV9sb2FkaW5nX2ZyYW1lIChHZGtQaXhidWZBbmltYXRpb25JdGVyICoKKyAgICBhbmltX2l0ZXIpCit7CisgIEdzdEdka0FuaW1hdGlvbkl0ZXIgKml0ZXIgPSBHU1RfR0RLX0FOSU1BVElPTl9JVEVSIChhbmltX2l0ZXIpOworCisgIC8qIEVPUyAtIGxhc3QgZnJhbWUgKi8KKyAgaWYgKGl0ZXItPmVvcyAmJiBnX3F1ZXVlX2lzX2VtcHR5IChpdGVyLT5idWZmZXJzKSkKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBjYW4ndCBsb2FkIG1vcmUgZnJhbWVzICovCisgIGlmICghZ3N0X2dka19hbmltYXRpb25faXRlcl9tYXlfYWR2YW5jZSAoaXRlcikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR2RrUGl4YnVmICoKK2dzdF9nZGtfYW5pbWF0aW9uX2dldF9zdGF0aWNfaW1hZ2UgKEdka1BpeGJ1ZkFuaW1hdGlvbiAqIGFuaW1hdGlvbikKK3sKKyAgR3N0R2RrQW5pbWF0aW9uICphbmkgPSBHU1RfR0RLX0FOSU1BVElPTiAoYW5pbWF0aW9uKTsKKyAgR1RpbWVWYWwgdHY7CisgIEdzdEdka0FuaW1hdGlvbkl0ZXIgKml0ZXI7CisKKyAgaWYgKCFhbmktPnBpeGJ1ZikgeworICAgIEdTVF9MT0dfT0JKRUNUIChhbmksICJ0cnlpbmcgdG8gY3JlYXRlIHBpeGJ1ZiIpOworICAgIGdfZ2V0X2N1cnJlbnRfdGltZSAoJnR2KTsKKyAgICBpdGVyID0KKyAgICAgICAgR1NUX0dES19BTklNQVRJT05fSVRFUiAoZ2RrX3BpeGJ1Zl9hbmltYXRpb25fZ2V0X2l0ZXIgKGFuaW1hdGlvbiwgJnR2KSk7CisgICAgaWYgKGl0ZXIpIHsKKyAgICAgIGd1aW50NjQgb2Zmc2V0OworICAgICAgR3N0QnVmZmVyICpidWY7CisgICAgICBHc3RGb3JtYXQgdGltZSA9IEdTVF9GT1JNQVRfVElNRTsKKworICAgICAgaWYgKCFnc3RfZWxlbWVudF9xdWVyeSAoZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAoaXRlci0+cGlwZWxpbmUpLAorICAgICAgICAgICAgICAgICAgInNpbmsiKSwgR1NUX1FVRVJZX1RPVEFMLCAmdGltZSwgJm9mZnNldCkpIHsKKyAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgIH0KKyAgICAgIGlmIChvZmZzZXQgPiAxMjAgKiBHU1RfU0VDT05EKSB7CisgICAgICAgIG9mZnNldCA9IDEyMCAqIEdTVF9TRUNPTkQ7CisgICAgICB9IGVsc2UgaWYgKG9mZnNldCA8IDEyMCAqIEdTVF9TRUNPTkQgJiYgb2Zmc2V0ID49IDEwICogR1NUX1NFQ09ORCkgeworICAgICAgICBvZmZzZXQgPSBvZmZzZXQgLyAyOworICAgICAgfQorICAgICAgZ19hc3NlcnQgKHRpbWUgPT0gR1NUX0ZPUk1BVF9USU1FKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChhbmksCisgICAgICAgICAgInVzaW5nIHRpbWUgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBmb3IgY3JlYXRpbmcgc3RhdGljIGltYWdlIiwKKyAgICAgICAgICBvZmZzZXQpOworICAgICAgd2hpbGUgKChidWYgPSBnX3F1ZXVlX3BvcF9oZWFkIChpdGVyLT5idWZmZXJzKSkgIT0gTlVMTCkgeworICAgICAgICBnc3RfZGF0YV91bnJlZiAoR1NUX0RBVEEgKGJ1ZikpOworICAgICAgfQorICAgICAgLyogbm93IHdlIGRvIGV2aWwgc3R1ZmYsIGJlIHN1cmUgdG8gZ2V0IHJpZCBvZiB0aGUgaXRlcmF0b3IgYWZ0ZXJ3YXJkcyAqLworICAgICAgaWYgKCFnc3RfZWxlbWVudF9zZW5kX2V2ZW50IChnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOCisgICAgICAgICAgICAgICAgICAoaXRlci0+cGlwZWxpbmUpLCAic2luayIpLAorICAgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZWsgKEdTVF9GT1JNQVRfVElNRSB8IEdTVF9TRUVLX01FVEhPRF9TRVQgfAorICAgICAgICAgICAgICAgICAgR1NUX1NFRUtfRkxBR19GTFVTSCB8IEdTVF9TRUVLX0ZMQUdfQUNDVVJBVEUsIG9mZnNldCkpKSB7CisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoYW5pLCAic2Vla2luZyBkaWRuJ3Qgd29yay4gVXNpbmcgbmV4dCBpbWFnZSIpOworICAgICAgfQorCisgICAgICBkbyB7CisgICAgICAgIGlmIChnX3F1ZXVlX2lzX2VtcHR5IChpdGVyLT5idWZmZXJzKSkgeworICAgICAgICAgIGlmIChpdGVyLT5lb3MpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgaWYgKGdzdF9nZGtfYW5pbWF0aW9uX2dldF9tb3JlX2J1ZmZlcnMgKGl0ZXIpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKEZBTFNFKTsKKyAgICAgIGlmICghZ19xdWV1ZV9pc19lbXB0eSAoaXRlci0+YnVmZmVycykpIHsKKyAgICAgICAgZ3N0X2dka19hbmltYXRpb25faXRlcl9jcmVhdGVfcGl4YnVmIChpdGVyKTsKKyAgICAgICAgYW5pLT5waXhidWYgPQorICAgICAgICAgICAgZ3N0X2dka19hbmltYXRpb25faXRlcl9nZXRfcGl4YnVmIChHREtfUElYQlVGX0FOSU1BVElPTl9JVEVSCisgICAgICAgICAgICAoaXRlcikpOworICAgICAgICBnX29iamVjdF9yZWYgKGFuaS0+cGl4YnVmKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdfYXNzZXJ0IChhbmktPnBpeGJ1ZiA9PSBOVUxMKTsKKyAgICAgIH0KKyAgICAgIC8qIERpRSBpdGVyYXRvciwgRGlFICovCisgICAgICBnX29iamVjdF91bnJlZiAoaXRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFuaSwgIkNvdWxkIG5vdCBnZXQgYW4gaXRlcmF0b3IuIE5vIHBpeGJ1ZiBhdmFpbGFibGUiKTsKKyAgICB9CisgIH0KKyAgR1NUX0xPR19PQkpFQ1QgKGFuaSwgIlJldHVybmluZyBwaXhidWYgJXBcbiIsIGFuaS0+cGl4YnVmKTsKKyAgcmV0dXJuIGFuaS0+cGl4YnVmOworfQpkaWZmIC0tZ2l0IGEvZXh0L2dka19waXhidWYvZ3N0Z2RrYW5pbWF0aW9uLmggYi9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGthbmltYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTU4NGRjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2dka19waXhidWYvZ3N0Z2RrYW5pbWF0aW9uLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQmVuamFtaW4gT3R0ZSA8aW43eTExOEBwdWJsaWMudW5pLWhhbWJ1cmcuZGU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9MT0FERVJfSF9fCisjZGVmaW5lIF9fR1NUX0xPQURFUl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnZGstcGl4YnVmL2dkay1waXhidWYuaD4KKyNpbmNsdWRlIDxnZGstcGl4YnVmL2dkay1waXhidWYtYW5pbWF0aW9uLmg+CisjaW5jbHVkZSA8Z2RrLXBpeGJ1Zi9nZGstcGl4YnVmLWlvLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworR19CRUdJTl9ERUNMUworCisvKiBob3cgbWFueSBieXRlcyB3ZSBuZWVkIHRvIGhhdmUgYXZhaWxhYmxlIGJlZm9yZSB3ZSBkYXJlIHRvIHN0YXJ0IGEgbmV3IGl0ZXJhdGlvbiAqLworI2RlZmluZSBHU1RfR0RLX0JVRkZFUl9TSVpFICgxMDI0MDApCisvKiBob3cgZmFyIGJlaGluZCB3ZSBuZWVkIHRvIGJlIGJlZm9yZSB3ZSBhdHRlbXB0IHRvIHNlZWsgKi8KKyNkZWZpbmUgR1NUX0dES19NQVhfREVMQVlfVE9fU0VFSyAoR1NUX1NFQ09ORCAvIDQpCisKKworI2RlZmluZSBHU1RfVFlQRV9HREtfQU5JTUFUSU9OICAgICAgICAgICAgICAgICAgKGdzdF9nZGtfYW5pbWF0aW9uX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9HREtfQU5JTUFUSU9OKG9iaikgICAgICAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfR0RLX0FOSU1BVElPTixHc3RHZGtBbmltYXRpb24pKQorI2RlZmluZSBHU1RfR0RLX0FOSU1BVElPTl9DTEFTUyhrbGFzcykgICAgICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfR0RLX0FOSU1BVElPTixHc3RHZGtBbmltYXRpb25DbGFzcykpCisjZGVmaW5lIEdTVF9JU19HREtfQU5JTUFUSU9OKG9iaikgICAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfR0RLX0FOSU1BVElPTikpCisjZGVmaW5lIEdTVF9JU19HREtfQU5JTUFUSU9OX0NMQVNTKGtsYXNzKSAgICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9HREtfQU5JTUFUSU9OKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEdka0FuaW1hdGlvbiAgICAgIEdzdEdka0FuaW1hdGlvbjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RHZGtBbmltYXRpb25DbGFzcyBHc3RHZGtBbmltYXRpb25DbGFzczsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEdka0FuaW1hdGlvbkl0ZXIgR3N0R2RrQW5pbWF0aW9uSXRlcjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RHZGtBbmltYXRpb25JdGVyQ2xhc3MgR3N0R2RrQW5pbWF0aW9uSXRlckNsYXNzOworCitzdHJ1Y3QgX0dzdEdka0FuaW1hdGlvbgoreworICBHZGtQaXhidWZBbmltYXRpb24gICAgICAgICAgICBwYXJlbnQ7CisKKyAgLyogbmFtZSBvZiB0ZW1wb3JhcnkgYnVmZmVyIGZpbGUgKi8KKyAgZ2NoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9sb2NhdGlvbjsKKyAgLyogZmlsZSBkZXNjcmlwdG9yIHRvIHRlbXBvcmFyeSBmaWxlIG9yIDAgaWYgd2UncmUgZG9uZSB3cml0aW5nICovCisgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfZmQ7CisKKyAgLyogc2l6ZSBvZiBpbWFnZSAqLworICBnaW50ICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OworICBnaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBicHA7CisgIC8qIHN0YXRpYyBpbWFnZSB3ZSB1c2UgKi8KKyAgR2RrUGl4YnVmICogICAgICAgICAgICAgICAgICAgcGl4YnVmOworfTsKKworc3RydWN0IF9Hc3RHZGtBbmltYXRpb25DbGFzcyAKK3sKKyAgR2RrUGl4YnVmQW5pbWF0aW9uQ2xhc3MgICAgICAgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgICAgICAgICAgICAgICAgICAgZ3N0X2dka19hbmltYXRpb25fZ2V0X3R5cGUgICAgICAodm9pZCk7CisKK0dzdEdka0FuaW1hdGlvbiAqICAgICAgIGdzdF9nZGtfYW5pbWF0aW9uX25ldyAgICAgICAgICAgKEdFcnJvciAqKmVycm9yKTsKKworZ2Jvb2xlYW4gICAgICAgICAgICAgICAgZ3N0X2dka19hbmltYXRpb25fYWRkX2RhdGEgICAgICAoR3N0R2RrQW5pbWF0aW9uICogICAgICBhbmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDggKiAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludCAgICAgICAgICAgICAgICAgIHNpemUpOwordm9pZCAgICAgICAgICAgICAgICAgICAgZ3N0X2dka19hbmltYXRpb25fZG9uZV9hZGRpbmcgICAoR3N0R2RrQW5pbWF0aW9uICogICAgICBhbmkpOworCisKKyNkZWZpbmUgR1NUX1RZUEVfR0RLX0FOSU1BVElPTl9JVEVSICAgICAgICAgICAgIChnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfR0RLX0FOSU1BVElPTl9JVEVSKG9iamVjdCkgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqZWN0KSwgR1NUX1RZUEVfR0RLX0FOSU1BVElPTl9JVEVSLCBHc3RHZGtBbmltYXRpb25JdGVyKSkKKyNkZWZpbmUgR1NUX0lTX0dES19BTklNQVRJT05fSVRFUihvYmplY3QpICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iamVjdCksIEdTVF9UWVBFX0dES19BTklNQVRJT05fSVRFUikpCisKKyNkZWZpbmUgR1NUX0dES19BTklNQVRJT05fSVRFUl9DTEFTUyhrbGFzcykgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfR0RLX0FOSU1BVElPTl9JVEVSLCBHc3RHZGtBbmltYXRpb25JdGVyQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfR0RLX0FOSU1BVElPTl9JVEVSX0NMQVNTKGtsYXNzKSAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9HREtfQU5JTUFUSU9OX0lURVIpKQorI2RlZmluZSBHU1RfR0RLX0FOSU1BVElPTl9JVEVSX0dFVF9DTEFTUyhvYmopICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9HREtfQU5JTUFUSU9OX0lURVIsIEdzdEdka0FuaW1hdGlvbkl0ZXJDbGFzcykpCisKK3N0cnVjdCBfR3N0R2RrQW5pbWF0aW9uSXRlciB7CisgIEdka1BpeGJ1ZkFuaW1hdGlvbkl0ZXIgICAgICAgIHBhcmVudDsKKyAgICAgICAgCisgIC8qIG91ciBhbmltYXRpb24gKi8KKyAgR3N0R2RrQW5pbWF0aW9uICogICAgICAgICAgICAgYW5pOworICAvKiBzdGFydCB0aW1ldmFsICovCisgIEdUaW1lVmFsICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OworICAvKiB0aW1lc3RhbXAgb2YgbGFzdCBidWZmZXIgKi8KKyAgR3N0Q2xvY2tUaW1lICAgICAgICAgICAgICAgICAgbGFzdF90aW1lc3RhbXA7CisgIAorICAvKiBwaXBlbGluZSB3ZSdyZSB1c2luZyAqLworICBHc3RFbGVtZW50ICogICAgICAgICAgICAgICAgICBwaXBlbGluZTsKKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgZW9zOworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICBqdXN0X3NlZWtlZDsKKyAgCisgIC8qIGN1cnJlbnQgaW1hZ2UgYW5kIHRoZSBidWZmZXJzIGNvbnRhaW5pbmcgdGhlIGRhdGEgKi8KKyAgR2RrUGl4YnVmICogICAgICAgICAgICAgICAgICAgcGl4YnVmOworICBHUXVldWUgKiAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzOworfTsKKworc3RydWN0IF9Hc3RHZGtBbmltYXRpb25JdGVyQ2xhc3MgeworICBHZGtQaXhidWZBbmltYXRpb25JdGVyQ2xhc3MgICBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfZ2RrX2FuaW1hdGlvbl9pdGVyX2dldF90eXBlICh2b2lkKSBHX0dOVUNfQ09OU1Q7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9HREtfQU5JTUFUSU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmZGVjLmMgYi9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTIxMWJmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmZGVjLmMKQEAgLTAsMCArMSw1NjIgQEAKKy8qIEdTdHJlYW1lciBHZGtQaXhidWYtYmFzZWQgaW1hZ2UgZGVjb2RlcgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z2RrLXBpeGJ1Zi9nZGstcGl4YnVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RnZGtwaXhidWZkZWMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ2RrcGl4YnVmZGVjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdka3BpeGJ1ZmRlY19kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X2dka19waXhidWZfZGVjX3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImltYWdlL3BuZzsgIgorICAgICAgICAvKiAiaW1hZ2UvanBlZzsgIiBkaXNhYmxlZCBiZWNhdXNlIHdlIGNhbid0IGhhbmRsZSBNSlBFRyAqLworICAgICAgICAvKiJpbWFnZS9naWY7ICIgZGlzYWJsZWQgYmVjYXVzZSB3ZSBjYW4ndCBoYW5kbGUgYW5pbWF0ZWQgZ2lmcyAqLworICAgICAgICAiaW1hZ2UveC1pY29uOyAiCisgICAgICAgICJhcHBsaWNhdGlvbi94LW5hdmktYW5pbWF0aW9uOyAiCisgICAgICAgICJpbWFnZS94LWNtdS1yYXN0ZXI7ICIKKyAgICAgICAgImltYWdlL3gtc3VuLXJhc3RlcjsgIgorICAgICAgICAiaW1hZ2UveC1waXhtYXA7ICIKKyAgICAgICAgImltYWdlL3RpZmY7ICIKKyAgICAgICAgImltYWdlL3gtcG9ydGFibGUtYW55bWFwOyAiCisgICAgICAgICJpbWFnZS94LXBvcnRhYmxlLWJpdG1hcDsgIgorICAgICAgICAiaW1hZ2UveC1wb3J0YWJsZS1ncmF5bWFwOyAiCisgICAgICAgICJpbWFnZS94LXBvcnRhYmxlLXBpeG1hcDsgIgorICAgICAgICAiaW1hZ2UvYm1wOyAiCisgICAgICAgICJpbWFnZS94LWJtcDsgIgorICAgICAgICAiaW1hZ2UveC1NUy1ibXA7ICIKKyAgICAgICAgImltYWdlL3ZuZC53YXAud2JtcDsgIiAiaW1hZ2UveC1iaXRtYXA7ICIgImltYWdlL3gtdGdhOyAiCisgICAgICAgICJpbWFnZS94LXBjeDsgaW1hZ2Uvc3ZnOyBpbWFnZS9zdmcreG1sIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X2dka19waXhidWZfZGVjX3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoIlJHQiIpICI7ICIKKyAgICAgICAgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIlJHQkEiKSkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9nZGtfcGl4YnVmX2RlY19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2dka19waXhidWZfZGVjX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9nZGtfcGl4YnVmX2RlY19zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworI2RlZmluZSBnc3RfZ2RrX3BpeGJ1Zl9kZWNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0R2RrUGl4YnVmRGVjLCBnc3RfZ2RrX3BpeGJ1Zl9kZWMsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9nZGtfcGl4YnVmX2RlY19zaW5rX3NldGNhcHMgKEdzdEdka1BpeGJ1ZkRlYyAqIGZpbHRlciwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIGNvbnN0IEdWYWx1ZSAqZnJhbWVyYXRlOworICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGlmICgoZnJhbWVyYXRlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJmcmFtZXJhdGUiKSkgIT0gTlVMTCkgeworICAgIGZpbHRlci0+aW5fZnBzX24gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAoZnJhbWVyYXRlKTsKKyAgICBmaWx0ZXItPmluX2Zwc19kID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9kZW5vbWluYXRvciAoZnJhbWVyYXRlKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJnb3QgZnJhbWVyYXRlIG9mICVkLyVkIGZwcyA9PiBwYWNrZXRpemVkIG1vZGUiLAorICAgICAgICBmaWx0ZXItPmluX2Zwc19uLCBmaWx0ZXItPmluX2Zwc19kKTsKKyAgfSBlbHNlIHsKKyAgICBmaWx0ZXItPmluX2Zwc19uID0gMDsKKyAgICBmaWx0ZXItPmluX2Zwc19kID0gMTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJubyBmcmFtZXJhdGUsIGFzc3VtaW5nIHNpbmdsZSBpbWFnZSIpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9nZGtfcGl4YnVmX2RlY19nZXRfY2Fwc2xpc3QgKEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdTTGlzdCAqc2xpc3Q7CisgIEdTTGlzdCAqc2xpc3QwOworICBHc3RDYXBzICpjYXBzbGlzdCA9IE5VTEw7CisgIEdzdENhcHMgKnJldHVybl9jYXBzID0gTlVMTDsKKyAgR3N0Q2FwcyAqdG1wbF9jYXBzOworCisgIGNhcHNsaXN0ID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworICBzbGlzdDAgPSBnZGtfcGl4YnVmX2dldF9mb3JtYXRzICgpOworCisgIGZvciAoc2xpc3QgPSBzbGlzdDA7IHNsaXN0OyBzbGlzdCA9IGdfc2xpc3RfbmV4dCAoc2xpc3QpKSB7CisgICAgR2RrUGl4YnVmRm9ybWF0ICpwaXhidWZfZm9ybWF0OworICAgIGNoYXIgKiptaW1ldHlwZXM7CisgICAgY2hhciAqKm1pbWV0eXBlOworCisgICAgcGl4YnVmX2Zvcm1hdCA9IHNsaXN0LT5kYXRhOworICAgIG1pbWV0eXBlcyA9IGdka19waXhidWZfZm9ybWF0X2dldF9taW1lX3R5cGVzIChwaXhidWZfZm9ybWF0KTsKKworICAgIGZvciAobWltZXR5cGUgPSBtaW1ldHlwZXM7ICptaW1ldHlwZTsgbWltZXR5cGUrKykgeworICAgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2Fwc2xpc3QsIGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgqbWltZXR5cGUpKTsKKyAgICB9CisgICAgZ19zdHJmcmVldiAobWltZXR5cGVzKTsKKyAgfQorICBnX3NsaXN0X2ZyZWUgKHNsaXN0MCk7CisKKyAgdG1wbF9jYXBzID0KKyAgICAgIGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZnc3RfZ2RrX3BpeGJ1Zl9kZWNfc2lua190ZW1wbGF0ZS5zdGF0aWNfY2Fwcyk7CisgIHJldHVybl9jYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChjYXBzbGlzdCwgdG1wbF9jYXBzKTsKKworICBnc3RfY2Fwc191bnJlZiAodG1wbF9jYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHNsaXN0KTsKKworICBpZiAoZmlsdGVyICYmIHJldHVybl9jYXBzKSB7CisgICAgR3N0Q2FwcyAqdGVtcDsKKworICAgIHRlbXAgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHJldHVybl9jYXBzLCBmaWx0ZXIpOworICAgIGdzdF9jYXBzX3VucmVmIChyZXR1cm5fY2Fwcyk7CisgICAgcmV0dXJuX2NhcHMgPSB0ZW1wOworICB9CisKKyAgcmV0dXJuIHJldHVybl9jYXBzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9nZGtfcGl4YnVmX2RlY19zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXM7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpmaWx0ZXIsICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZmaWx0ZXIpOworICAgICAgY2FwcyA9IGdzdF9nZGtfcGl4YnVmX2RlY19nZXRfY2Fwc2xpc3QgKGZpbHRlcik7CisgICAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKKworLyogaW5pdGlhbGl6ZSB0aGUgcGx1Z2luJ3MgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCitnc3RfZ2RrX3BpeGJ1Zl9kZWNfY2xhc3NfaW5pdCAoR3N0R2RrUGl4YnVmRGVjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2dka19waXhidWZfZGVjX2NoYW5nZV9zdGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X2dka19waXhidWZfZGVjX3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9nZGtfcGl4YnVmX2RlY19zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJHZGtQaXhidWYgaW1hZ2UgZGVjb2RlciIsICJDb2RlYy9EZWNvZGVyL0ltYWdlIiwKKyAgICAgICJEZWNvZGVzIGltYWdlcyBpbiBhIHZpZGVvIHN0cmVhbSB1c2luZyBHZGtQaXhidWYiLAorICAgICAgIkRhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPiwgUmVuYXRvIEZpbGhvIDxyZW5hdG8uZmlsaG9AaW5kdC5vcmcuYnI+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdka3BpeGJ1ZmRlY19kZWJ1ZywgImdka3BpeGJ1ZiIsIDAsCisgICAgICAiR2RrUGl4YnVmIGltYWdlIGRlY29kZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9nZGtfcGl4YnVmX2RlY19pbml0IChHc3RHZGtQaXhidWZEZWMgKiBmaWx0ZXIpCit7CisgIGZpbHRlci0+c2lua3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJmdzdF9nZGtfcGl4YnVmX2RlY19zaW5rX3RlbXBsYXRlLAorICAgICAgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKGZpbHRlci0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZ2RrX3BpeGJ1Zl9kZWNfc2lua19xdWVyeSkpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoZmlsdGVyLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nZGtfcGl4YnVmX2RlY19jaGFpbikpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoZmlsdGVyLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nZGtfcGl4YnVmX2RlY19zaW5rX2V2ZW50KSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChmaWx0ZXIpLCBmaWx0ZXItPnNpbmtwYWQpOworCisgIGZpbHRlci0+c3JjcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZ3N0X2dka19waXhidWZfZGVjX3NyY190ZW1wbGF0ZSwKKyAgICAgICJzcmMiKTsKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoZmlsdGVyLT5zcmNwYWQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoZmlsdGVyKSwgZmlsdGVyLT5zcmNwYWQpOworCisgIGZpbHRlci0+bGFzdF90aW1lc3RhbXAgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBmaWx0ZXItPnBpeGJ1Zl9sb2FkZXIgPSBOVUxMOworICBmaWx0ZXItPnBhY2tldGl6ZWQgPSBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ2RrX3BpeGJ1Zl9kZWNfc2V0dXBfcG9vbCAoR3N0R2RrUGl4YnVmRGVjICogZmlsdGVyLCBHc3RWaWRlb0luZm8gKiBpbmZvKQoreworICBHc3RDYXBzICp0YXJnZXQ7CisgIEdzdFF1ZXJ5ICpxdWVyeTsKKyAgR3N0QnVmZmVyUG9vbCAqcG9vbDsKKyAgR3N0U3RydWN0dXJlICpjb25maWc7CisgIGd1aW50IHNpemUsIG1pbiwgbWF4OworCisgIHRhcmdldCA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoZmlsdGVyLT5zcmNwYWQpOworICBpZiAoIXRhcmdldCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogdHJ5IHRvIGdldCBhIGJ1ZmZlcnBvb2wgbm93ICovCisgIC8qIGZpbmQgYSBwb29sIGZvciB0aGUgbmVnb3RpYXRlZCBjYXBzIG5vdyAqLworICBxdWVyeSA9IGdzdF9xdWVyeV9uZXdfYWxsb2NhdGlvbiAodGFyZ2V0LCBUUlVFKTsKKworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeSAoZmlsdGVyLT5zcmNwYWQsIHF1ZXJ5KSkgeworICAgIC8qIG5vdCBhIHByb2JsZW0sIHdlIHVzZSB0aGUgcXVlcnkgZGVmYXVsdHMgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJBTExPQ0FUSU9OIHF1ZXJ5IGZhaWxlZCIpOworICB9CisKKyAgaWYgKGdzdF9xdWVyeV9nZXRfbl9hbGxvY2F0aW9uX3Bvb2xzIChxdWVyeSkgPiAwKSB7CisgICAgLyogd2UgZ290IGNvbmZpZ3VyYXRpb24gZnJvbSBvdXIgcGVlciwgcGFyc2UgdGhlbSAqLworICAgIGdzdF9xdWVyeV9wYXJzZV9udGhfYWxsb2NhdGlvbl9wb29sIChxdWVyeSwgMCwgJnBvb2wsICZzaXplLCAmbWluLCAmbWF4KTsKKyAgfSBlbHNlIHsKKyAgICBwb29sID0gTlVMTDsKKyAgICBzaXplID0gaW5mby0+c2l6ZTsKKyAgICBtaW4gPSBtYXggPSAwOworICB9CisKKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisKKyAgaWYgKHBvb2wgPT0gTlVMTCkgeworICAgIC8qIHdlIGRpZCBub3QgZ2V0IGEgcG9vbCwgbWFrZSBvbmUgb3Vyc2VsdmVzIHRoZW4gKi8KKyAgICBwb29sID0gZ3N0X2J1ZmZlcl9wb29sX25ldyAoKTsKKyAgfQorCisgIC8qIGFuZCBjb25maWd1cmUgKi8KKyAgY29uZmlnID0gZ3N0X2J1ZmZlcl9wb29sX2dldF9jb25maWcgKHBvb2wpOworICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX3NldF9wYXJhbXMgKGNvbmZpZywgdGFyZ2V0LCBzaXplLCBtaW4sIG1heCk7CisgIGdzdF9idWZmZXJfcG9vbF9zZXRfY29uZmlnIChwb29sLCBjb25maWcpOworCisgIGlmIChmaWx0ZXItPnBvb2wpIHsKKyAgICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAoZmlsdGVyLT5wb29sLCBGQUxTRSk7CisgICAgZ3N0X29iamVjdF91bnJlZiAoZmlsdGVyLT5wb29sKTsKKyAgfQorICBmaWx0ZXItPnBvb2wgPSBwb29sOworCisgIC8qIGFuZCBhY3RpdmF0ZSAqLworICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAoZmlsdGVyLT5wb29sLCBUUlVFKTsKKworICBnc3RfY2Fwc191bnJlZiAodGFyZ2V0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9nZGtfcGl4YnVmX2RlY19mbHVzaCAoR3N0R2RrUGl4YnVmRGVjICogZmlsdGVyKQoreworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR2RrUGl4YnVmICpwaXhidWY7CisgIGludCB5OworICBndWludDggKm91dF9waXg7CisgIGd1aW50OCAqaW5fcGl4OworICBpbnQgaW5fcm93c3RyaWRlLCBvdXRfcm93c3RyaWRlOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBuX2NoYW5uZWxzOworICBHc3RWaWRlb0ZyYW1lIGZyYW1lOworCisgIHBpeGJ1ZiA9IGdka19waXhidWZfbG9hZGVyX2dldF9waXhidWYgKGZpbHRlci0+cGl4YnVmX2xvYWRlcik7CisgIGlmIChwaXhidWYgPT0gTlVMTCkKKyAgICBnb3RvIG5vX3BpeGJ1ZjsKKworICB3aWR0aCA9IGdka19waXhidWZfZ2V0X3dpZHRoIChwaXhidWYpOworICBoZWlnaHQgPSBnZGtfcGl4YnVmX2dldF9oZWlnaHQgKHBpeGJ1Zik7CisKKyAgaWYgKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJmZpbHRlci0+aW5mbykgPT0gR1NUX1ZJREVPX0ZPUk1BVF9VTktOT1dOKSB7CisgICAgR3N0VmlkZW9JbmZvIGluZm87CisgICAgR3N0VmlkZW9Gb3JtYXQgZm10OworICAgIEdMaXN0ICpsOworCisgICAgR1NUX0RFQlVHICgiU2V0IHNpemUgdG8gJWR4JWQiLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIG5fY2hhbm5lbHMgPSBnZGtfcGl4YnVmX2dldF9uX2NoYW5uZWxzIChwaXhidWYpOworICAgIHN3aXRjaCAobl9jaGFubmVscykgeworICAgICAgY2FzZSAzOgorICAgICAgICBmbXQgPSBHU1RfVklERU9fRk9STUFUX1JHQjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ6CisgICAgICAgIGZtdCA9IEdTVF9WSURFT19GT1JNQVRfUkdCQTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGNoYW5uZWxzX25vdF9zdXBwb3J0ZWQ7CisgICAgfQorCisKKyAgICBnc3RfdmlkZW9faW5mb19pbml0ICgmaW5mbyk7CisgICAgZ3N0X3ZpZGVvX2luZm9fc2V0X2Zvcm1hdCAoJmluZm8sIGZtdCwgd2lkdGgsIGhlaWdodCk7CisgICAgaW5mby5mcHNfbiA9IGZpbHRlci0+aW5fZnBzX247CisgICAgaW5mby5mcHNfZCA9IGZpbHRlci0+aW5fZnBzX2Q7CisgICAgY2FwcyA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZpbmZvKTsKKworICAgIGZpbHRlci0+aW5mbyA9IGluZm87CisKKyAgICBnc3RfcGFkX3NldF9jYXBzIChmaWx0ZXItPnNyY3BhZCwgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgZ3N0X2dka19waXhidWZfZGVjX3NldHVwX3Bvb2wgKGZpbHRlciwgJmluZm8pOworCisgICAgZm9yIChsID0gZmlsdGVyLT5wZW5kaW5nX2V2ZW50czsgbDsgbCA9IGwtPm5leHQpCisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKGZpbHRlci0+c3JjcGFkLCBsLT5kYXRhKTsKKyAgICBnX2xpc3RfZnJlZSAoZmlsdGVyLT5wZW5kaW5nX2V2ZW50cyk7CisgICAgZmlsdGVyLT5wZW5kaW5nX2V2ZW50cyA9IE5VTEw7CisgIH0KKworICByZXQgPSBnc3RfYnVmZmVyX3Bvb2xfYWNxdWlyZV9idWZmZXIgKGZpbHRlci0+cG9vbCwgJm91dGJ1ZiwgTlVMTCk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBub19idWZmZXI7CisKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSBmaWx0ZXItPmxhc3RfdGltZXN0YW1wOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBpbl9waXggPSBnZGtfcGl4YnVmX2dldF9waXhlbHMgKHBpeGJ1Zik7CisgIGluX3Jvd3N0cmlkZSA9IGdka19waXhidWZfZ2V0X3Jvd3N0cmlkZSAocGl4YnVmKTsKKworICBnc3RfdmlkZW9fZnJhbWVfbWFwICgmZnJhbWUsICZmaWx0ZXItPmluZm8sIG91dGJ1ZiwgR1NUX01BUF9XUklURSk7CisgIG91dF9waXggPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoJmZyYW1lLCAwKTsKKyAgb3V0X3Jvd3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKCZmcmFtZSwgMCk7CisKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgbWVtY3B5IChvdXRfcGl4LCBpbl9waXgsIHdpZHRoICogR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUFNUUklERSAoJmZyYW1lLCAwKSk7CisgICAgaW5fcGl4ICs9IGluX3Jvd3N0cmlkZTsKKyAgICBvdXRfcGl4ICs9IG91dF9yb3dzdHJpZGU7CisgIH0KKworICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZmcmFtZSk7CisKKyAgR1NUX0RFQlVHICgicHVzaGluZy4uLiAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZikpOworICByZXQgPSBnc3RfcGFkX3B1c2ggKGZpbHRlci0+c3JjcGFkLCBvdXRidWYpOworCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAiZmxvdzogJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmV0KSk7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK25vX3BpeGJ1ZjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChmaWx0ZXIsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksICgiZXJyb3IgZ2V0aW5nIHBpeGJ1ZiIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2NoYW5uZWxzX25vdF9zdXBwb3J0ZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZmlsdGVyLCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAoIiVkIGNoYW5uZWxzIG5vdCBzdXBwb3J0ZWQiLCBuX2NoYW5uZWxzKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Citub19idWZmZXI6CisgIHsKKyAgICBHU1RfREVCVUcgKCJGYWlsZWQgdG8gY3JlYXRlIG91dGJ1ZmZlciAtICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICAgIHJldHVybiByZXQ7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ2RrX3BpeGJ1Zl9kZWNfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXMgPSBHU1RfRkxPV19PSzsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRSwgZm9yd2FyZCA9IFRSVUU7CisgIEdzdEdka1BpeGJ1ZkRlYyAqcGl4YnVmOworCisgIHBpeGJ1ZiA9IEdTVF9HREtfUElYQlVGX0RFQyAocGFyZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChldmVudCwgJmNhcHMpOworICAgICAgcmV0ID0gZ3N0X2dka19waXhidWZfZGVjX3Npbmtfc2V0Y2FwcyAocGl4YnVmLCBjYXBzKTsKKyAgICAgIGZvcndhcmQgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgICBpZiAocGl4YnVmLT5waXhidWZfbG9hZGVyICE9IE5VTEwpIHsKKyAgICAgICAgZ2RrX3BpeGJ1Zl9sb2FkZXJfY2xvc2UgKHBpeGJ1Zi0+cGl4YnVmX2xvYWRlciwgTlVMTCk7CisgICAgICAgIHJlcyA9IGdzdF9nZGtfcGl4YnVmX2RlY19mbHVzaCAocGl4YnVmKTsKKyAgICAgICAgZ19vYmplY3RfdW5yZWYgKEdfT0JKRUNUIChwaXhidWYtPnBpeGJ1Zl9sb2FkZXIpKTsKKyAgICAgICAgcGl4YnVmLT5waXhidWZfbG9hZGVyID0gTlVMTDsKKyAgICAgICAgLyogYXMgbG9uZyBhcyB3ZSBkb24ndCBoYXZlIGZsb3cgcmV0dXJucyBmb3IgZXZlbnQgZnVuY3Rpb25zIHdlIG5lZWQKKyAgICAgICAgICogdG8gcG9zdCBhbiBlcnJvciBoZXJlLCBvciB0aGUgYXBwbGljYXRpb24gbWlnaHQgbmV2ZXIga25vdyB0aGF0CisgICAgICAgICAqIHRoaW5ncyBmYWlsZWQgKi8KKyAgICAgICAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSyAmJiByZXMgIT0gR1NUX0ZMT1dfRkxVU0hJTkcKKyAgICAgICAgICAgICYmIHJlcyAhPSBHU1RfRkxPV19FT1MgJiYgcmVzICE9IEdTVF9GTE9XX05PVF9MSU5LRUQpIHsKKyAgICAgICAgICBHU1RfRUxFTUVOVF9GTE9XX0VSUk9SIChwaXhidWYsIHJlcyk7CisgICAgICAgICAgZm9yd2FyZCA9IEZBTFNFOworICAgICAgICAgIHJldCA9IEZBTFNFOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ19saXN0X2ZyZWVfZnVsbCAocGl4YnVmLT5wZW5kaW5nX2V2ZW50cywKKyAgICAgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9ldmVudF91bnJlZik7CisgICAgICBwaXhidWYtPnBlbmRpbmdfZXZlbnRzID0gTlVMTDsKKyAgICAgIC8qIEZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgeworICAgICAgY29uc3QgR3N0U2VnbWVudCAqc2VnbWVudDsKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9zZWdtZW50IChldmVudCwgJnNlZ21lbnQpOworICAgICAgaWYgKHNlZ21lbnQtPmZvcm1hdCA9PSBHU1RfRk9STUFUX0JZVEVTKQorICAgICAgICBwaXhidWYtPnBhY2tldGl6ZWQgPSBGQUxTRTsKKyAgICAgIGVsc2UKKyAgICAgICAgcGl4YnVmLT5wYWNrZXRpemVkID0gVFJVRTsKKyAgICAgIGlmIChwaXhidWYtPnBpeGJ1Zl9sb2FkZXIgIT0gTlVMTCkgeworICAgICAgICBnZGtfcGl4YnVmX2xvYWRlcl9jbG9zZSAocGl4YnVmLT5waXhidWZfbG9hZGVyLCBOVUxMKTsKKyAgICAgICAgZ19vYmplY3RfdW5yZWYgKEdfT0JKRUNUIChwaXhidWYtPnBpeGJ1Zl9sb2FkZXIpKTsKKyAgICAgICAgcGl4YnVmLT5waXhidWZfbG9hZGVyID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKGZvcndhcmQpIHsKKyAgICBpZiAoIWdzdF9wYWRfaGFzX2N1cnJlbnRfY2FwcyAocGl4YnVmLT5zcmNwYWQpICYmCisgICAgICAgIEdTVF9FVkVOVF9JU19TRVJJQUxJWkVEIChldmVudCkKKyAgICAgICAgJiYgR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSA+IEdTVF9FVkVOVF9DQVBTCisgICAgICAgICYmIEdTVF9FVkVOVF9UWVBFIChldmVudCkgIT0gR1NUX0VWRU5UX0ZMVVNIX1NUT1AKKyAgICAgICAgJiYgR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSAhPSBHU1RfRVZFTlRfRU9TKSB7CisgICAgICByZXQgPSBUUlVFOworICAgICAgcGl4YnVmLT5wZW5kaW5nX2V2ZW50cyA9IGdfbGlzdF9wcmVwZW5kIChwaXhidWYtPnBlbmRpbmdfZXZlbnRzLCBldmVudCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldCA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9nZGtfcGl4YnVmX2RlY19jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0R2RrUGl4YnVmRGVjICpmaWx0ZXI7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworICBHc3RNYXBJbmZvIG1hcDsKKworICBmaWx0ZXIgPSBHU1RfR0RLX1BJWEJVRl9ERUMgKHBhcmVudCk7CisKKyAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1Zik7CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEICh0aW1lc3RhbXApKQorICAgIGZpbHRlci0+bGFzdF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwgImJ1ZmZlciB3aXRoIHRzOiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICBpZiAoZmlsdGVyLT5waXhidWZfbG9hZGVyID09IE5VTEwpCisgICAgZmlsdGVyLT5waXhidWZfbG9hZGVyID0gZ2RrX3BpeGJ1Zl9sb2FkZXJfbmV3ICgpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwgIldyaXRpbmcgYnVmZmVyIHNpemUgJWQiLCAoZ2ludCkgbWFwLnNpemUpOworICBpZiAoIWdka19waXhidWZfbG9hZGVyX3dyaXRlIChmaWx0ZXItPnBpeGJ1Zl9sb2FkZXIsIG1hcC5kYXRhLCBtYXAuc2l6ZSwKKyAgICAgICAgICAmZXJyb3IpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKGZpbHRlci0+cGFja2V0aXplZCA9PSBUUlVFKSB7CisgICAgZ2RrX3BpeGJ1Zl9sb2FkZXJfY2xvc2UgKGZpbHRlci0+cGl4YnVmX2xvYWRlciwgTlVMTCk7CisgICAgcmV0ID0gZ3N0X2dka19waXhidWZfZGVjX2ZsdXNoIChmaWx0ZXIpOworICAgIGdfb2JqZWN0X3VucmVmIChmaWx0ZXItPnBpeGJ1Zl9sb2FkZXIpOworICAgIGZpbHRlci0+cGl4YnVmX2xvYWRlciA9IE5VTEw7CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCitlcnJvcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChmaWx0ZXIsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksCisgICAgICAgICgiZ2RrX3BpeGJ1Zl9sb2FkZXJfd3JpdGUgZXJyb3I6ICVzIiwgZXJyb3ItPm1lc3NhZ2UpKTsKKyAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2dka19waXhidWZfZGVjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTOworICBHc3RHZGtQaXhidWZEZWMgKmRlYyA9IEdTVF9HREtfUElYQlVGX0RFQyAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIC8qIGRlZmF1bHQgdG8gc2luZ2xlIGltYWdlIG1vZGUsIHNldGNhcHMgZnVuY3Rpb24gbWlnaHQgbm90IGJlIGNhbGxlZCAqLworICAgICAgZGVjLT5pbl9mcHNfbiA9IDA7CisgICAgICBkZWMtPmluX2Zwc19kID0gMTsKKyAgICAgIGdzdF92aWRlb19pbmZvX2luaXQgKCZkZWMtPmluZm8pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKQorICAgIHJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGRlYy0+aW5fZnBzX24gPSAwOworICAgICAgZGVjLT5pbl9mcHNfZCA9IDA7CisgICAgICBpZiAoZGVjLT5wb29sKSB7CisgICAgICAgIGdzdF9idWZmZXJfcG9vbF9zZXRfYWN0aXZlIChkZWMtPnBvb2wsIEZBTFNFKTsKKyAgICAgICAgZ3N0X29iamVjdF9yZXBsYWNlICgoR3N0T2JqZWN0ICoqKSAmIGRlYy0+cG9vbCwgTlVMTCk7CisgICAgICB9CisgICAgICBnX2xpc3RfZnJlZV9mdWxsIChkZWMtPnBlbmRpbmdfZXZlbnRzLCAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9ldmVudF91bnJlZik7CisgICAgICBkZWMtPnBlbmRpbmdfZXZlbnRzID0gTlVMTDsKKyAgICAgIGlmIChkZWMtPnBpeGJ1Zl9sb2FkZXIgIT0gTlVMTCkgeworICAgICAgICBnZGtfcGl4YnVmX2xvYWRlcl9jbG9zZSAoZGVjLT5waXhidWZfbG9hZGVyLCBOVUxMKTsKKyAgICAgICAgZ19vYmplY3RfdW5yZWYgKEdfT0JKRUNUIChkZWMtPnBpeGJ1Zl9sb2FkZXIpKTsKKyAgICAgICAgZGVjLT5waXhidWZfbG9hZGVyID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZkZWMuaCBiL2V4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZmRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTJmNDgKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZkZWMuaApAQCAtMCwwICsxLDcwIEBACisvKiBHU3RyZWFtZXIgR2RrUGl4YnVmLWJhc2VkIGltYWdlIGRlY29kZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9HREtfUElYQlVGX0RFQ19IX18KKyNkZWZpbmUgX19HU1RfR0RLX1BJWEJVRl9ERUNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z2RrLXBpeGJ1Zi9nZGstcGl4YnVmLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9HREtfUElYQlVGX0RFQwkJCVwKKyAgKGdzdF9nZGtfcGl4YnVmX2RlY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfR0RLX1BJWEJVRl9ERUMob2JqKQkJCQkJCVwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0dES19QSVhCVUZfREVDLEdzdEdka1BpeGJ1ZkRlYykpCisjZGVmaW5lIEdTVF9HREtfUElYQlVGX0RFQ19DTEFTUyhrbGFzcykJCQkJCVwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfR0RLX1BJWEJVRl9ERUMsR3N0R2RrUGl4YnVmRGVjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfR0RLX1BJWEJVRl9ERUMob2JqKQkJCQkJXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfR0RLX1BJWEJVRl9ERUMpKQorI2RlZmluZSBHU1RfSVNfR0RLX1BJWEJVRl9ERUNfQ0xBU1Moa2xhc3MpCQkJCVwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfR0RLX1BJWEJVRl9ERUMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0R2RrUGl4YnVmRGVjICAgICAgR3N0R2RrUGl4YnVmRGVjOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEdka1BpeGJ1ZkRlY0NsYXNzIEdzdEdka1BpeGJ1ZkRlY0NsYXNzOworCitzdHJ1Y3QgX0dzdEdka1BpeGJ1ZkRlYworeworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgR3N0UGFkICpzaW5rcGFkLCAqc3JjcGFkOworCisgIEdzdENsb2NrVGltZSAgICAgIGxhc3RfdGltZXN0YW1wOworICBHZGtQaXhidWZMb2FkZXIgICpwaXhidWZfbG9hZGVyOworCisgIGdpbnQgaW5fZnBzX24sIGluX2Zwc19kOworCisgIEdzdFZpZGVvSW5mbyAgIGluZm87CisgIEdzdEJ1ZmZlclBvb2wgKnBvb2w7CisgIEdMaXN0ICAgICAgICAgKnBlbmRpbmdfZXZlbnRzOworICBnYm9vbGVhbiAgICAgICBwYWNrZXRpemVkOworfTsKKworc3RydWN0IF9Hc3RHZGtQaXhidWZEZWNDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2dka19waXhidWZfZGVjX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0dES19QSVhCVUZfREVDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5jIGIvZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjhlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmMKQEAgLTAsMCArMSw3MTIgQEAKKy8qIEdTdHJlYW1lciBHZGtQaXhidWYgb3ZlcmxheQorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTQgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIFN1aXRlIDUwMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMzNSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWdka3BpeGJ1Zm92ZXJsYXkKKyAqCisgKiBUaGUgZ2RrcGl4YnVmb3ZlcmxheSBlbGVtZW50IG92ZXJsYXlzIGFuIGltYWdlIGxvYWRlZCBmcm9tIGZpbGUgb250bworICogYSB2aWRlbyBzdHJlYW0uCisgKgorICogQ2hhbmdpbmcgdGhlIHBvc2l0aW9uaW5nIG9yIG92ZXJsYXkgd2lkdGggYW5kIGhlaWdodCBwcm9wZXJ0aWVzIGF0IHJ1bnRpbWUKKyAqIGlzIHN1cHBvcnRlZCwgYnV0IGl0IG1pZ2h0IGJlIHBydWRlbnQgdG8gdG8gcHJvdGVjdCB0aGUgcHJvcGVydHkgc2V0dGluZworICogY29kZSB3aXRoIEdTVF9CQVNFX1RSQU5TRk9STV9MT0NLIGFuZCBHU1RfQkFTRV9UUkFOU0ZPUk1fVU5MT0NLLCBhcworICogZ19vYmplY3Rfc2V0KCkgaXMgbm90IGF0b21pYyBmb3IgbXVsdGlwbGUgcHJvcGVydGllcyBwYXNzZWQgaW4gb25lIGdvLgorICoKKyAqIENoYW5naW5nIHRoZSBpbWFnZSBhdCBydW50aW1lIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLgorICoKKyAqIE5lZ2F0aXZlIG9mZnNldHMgYXJlIGFsc28gbm90IHlldCBzdXBwb3J0ZWQuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIGdka3BpeGJ1Zm92ZXJsYXkgbG9jYXRpb249aW1hZ2UucG5nICEgYXV0b3ZpZGVvc2luaworICogXXwKKyAqIE92ZXJsYXlzIHRoZSBpbWFnZSBpbiBpbWFnZS5wbmcgb250byB0aGUgdGVzdCB2aWRlbyBwaWN0dXJlIHByb2R1Y2VkIGJ5CisgKiB2aWRlb3Rlc3RzcmMuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlICJnc3RnZGtwaXhidWZvdmVybGF5LmgiCisKKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9tZXRhLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdka3BpeGJ1Zm92ZXJsYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ2RrcGl4YnVmb3ZlcmxheV9kZWJ1ZworCitzdGF0aWMgdm9pZCBnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wZXJ0eV9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wZXJ0eV9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9nZGtfcGl4YnVmX292ZXJsYXlfc3RhcnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2dka19waXhidWZfb3ZlcmxheV9zdG9wIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9nZGtfcGl4YnVmX292ZXJsYXlfdHJhbnNmb3JtX2ZyYW1lX2lwIChHc3RWaWRlb0ZpbHRlciAqIGZpbHRlciwKKyAgICBHc3RWaWRlb0ZyYW1lICogZnJhbWUpOworc3RhdGljIHZvaWQgZ3N0X2dka19waXhidWZfb3ZlcmxheV9iZWZvcmVfdHJhbnNmb3JtIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0QnVmZmVyICogb3V0YnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X3NldF9pbmZvIChHc3RWaWRlb0ZpbHRlciAqIGZpbHRlciwKKyAgICBHc3RDYXBzICogaW5jYXBzLCBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLCBHc3RDYXBzICogb3V0Y2FwcywKKyAgICBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbyk7CitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9nZGtfcGl4YnVmX292ZXJsYXlfbG9hZF9pbWFnZSAoR3N0R2RrUGl4YnVmT3ZlcmxheSAqIG92ZXJsYXksCisgICAgR0Vycm9yICoqIGVycik7CitzdGF0aWMgdm9pZCBnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X3NldF9waXhidWYgKEdzdEdka1BpeGJ1Zk92ZXJsYXkgKiBvdmVybGF5LAorICAgIEdka1BpeGJ1ZiAqIHBpeGJ1Zik7CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0xPQ0FUSU9OLAorICBQUk9QX1BJWEJVRiwKKyAgUFJPUF9QT1NJVElPTklOR19NT0RFLAorICBQUk9QX09GRlNFVF9YLAorICBQUk9QX09GRlNFVF9ZLAorICBQUk9QX1JFTEFUSVZFX1gsCisgIFBST1BfUkVMQVRJVkVfWSwKKyAgUFJPUF9DT0VGX1gsCisgIFBST1BfQ09FRl9ZLAorICBQUk9QX09WRVJMQVlfV0lEVEgsCisgIFBST1BfT1ZFUkxBWV9IRUlHSFQsCisgIFBST1BfQUxQSEEKK307CisKKyNkZWZpbmUgVklERU9fRk9STUFUUyAieyBSR0J4LCBSR0IsIEJHUiwgQkdSeCwgeFJHQiwgeEJHUiwgIiBcCisgICAgIlJHQkEsIEJHUkEsIEFSR0IsIEFCR1IsIEk0MjAsIFlWMTIsIEFZVVYsIFlVWTIsIFVZVlksICIgXAorICAgICJ2MzA4LCB2MjEwLCB2MjE2LCBZNDFCLCBZNDJCLCBZNDQ0LCBZVllVLCBOVjEyLCBOVjIxLCBVWVZQLCAiIFwKKyAgICAiUkdCMTYsIEJHUjE2LCBSR0IxNSwgQkdSMTUsIFVZVlAsIEE0MjAsIFlVVjksIFlWVTksICIgXAorICAgICJJWVUxLCBBUkdCNjQsIEFZVVY2NCwgcjIxMCwgSTQyMF8xMExFLCBJNDIwXzEwQkUsICIgXAorICAgICJHUkFZOCwgR1JBWTE2X0JFLCBHUkFZMTZfTEUgfSIKKworLyogRklYTUUgMi4wOiBjaGFuZ2UgdG8gYWJzb2x1dGUgcG9zaXRpb25pbmcgKi8KKyNkZWZpbmUgREVGQVVMVF9QT1NJVElPTklOR19NT0RFIFwKKyAgICBHU1RfR0RLX1BJWEJVRl9QT1NJVElPTklOR19QSVhFTFNfUkVMQVRJVkVfVE9fRURHRVMKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKFZJREVPX0ZPUk1BVFMpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFIChWSURFT19GT1JNQVRTKSkKKyAgICApOworCitHX0RFRklORV9UWVBFIChHc3RHZGtQaXhidWZPdmVybGF5LCBnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5LAorICAgIEdTVF9UWVBFX1ZJREVPX0ZJTFRFUik7CisKKyNkZWZpbmUgR1NUX1RZUEVfR0RLX1BJWEJVRl9QT1NJVElPTklOR19NT0RFIFwKKyAgICAoZ3N0X2dka19waXhidWZfcG9zaXRpb25pbmdfbW9kZV9nZXRfdHlwZSgpKQorCitzdGF0aWMgR1R5cGUKK2dzdF9nZGtfcGl4YnVmX3Bvc2l0aW9uaW5nX21vZGVfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHBvc19tb2Rlc1tdID0geworICAgIHtHU1RfR0RLX1BJWEJVRl9QT1NJVElPTklOR19QSVhFTFNfUkVMQVRJVkVfVE9fRURHRVMsCisgICAgICAgICJwaXhlbHMtcmVsYXRpdmUtdG8tZWRnZXMiLCAicGl4ZWxzLXJlbGF0aXZlLXRvLWVkZ2VzIn0sCisgICAge0dTVF9HREtfUElYQlVGX1BPU0lUSU9OSU5HX1BJWEVMU19BQlNPTFVURSwgInBpeGVscy1hYnNvbHV0ZSIsCisgICAgICAgICJwaXhlbHMtYWJzb2x1dGUifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0sCisgIH07CisKKyAgc3RhdGljIEdUeXBlIHR5cGU7ICAgICAgICAgICAgLyogMCAqLworCisgIGlmICghdHlwZSkgeworICAgIHR5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0R2RrUGl4YnVmUG9zaXRpb25pbmdNb2RlIiwgcG9zX21vZGVzKTsKKyAgfQorCisgIHJldHVybiB0eXBlOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2dka19waXhidWZfb3ZlcmxheV9jbGFzc19pbml0IChHc3RHZGtQaXhidWZPdmVybGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmlkZW9maWx0ZXJfY2xhc3MgPSBHU1RfVklERU9fRklMVEVSX0NMQVNTIChrbGFzcyk7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqYmFzZXRyYW5zX2NsYXNzID0gR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2dka19waXhidWZfb3ZlcmxheV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9nZGtfcGl4YnVmX292ZXJsYXlfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9nZGtfcGl4YnVmX292ZXJsYXlfZmluYWxpemU7CisKKyAgYmFzZXRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X3N0YXJ0KTsKKyAgYmFzZXRyYW5zX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nZGtfcGl4YnVmX292ZXJsYXlfc3RvcCk7CisKKyAgYmFzZXRyYW5zX2NsYXNzLT5iZWZvcmVfdHJhbnNmb3JtID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X2JlZm9yZV90cmFuc2Zvcm0pOworCisgIHZpZGVvZmlsdGVyX2NsYXNzLT5zZXRfaW5mbyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2dka19waXhidWZfb3ZlcmxheV9zZXRfaW5mbyk7CisgIHZpZGVvZmlsdGVyX2NsYXNzLT50cmFuc2Zvcm1fZnJhbWVfaXAgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nZGtfcGl4YnVmX292ZXJsYXlfdHJhbnNmb3JtX2ZyYW1lX2lwKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0xPQ0FUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImxvY2F0aW9uIiwgImxvY2F0aW9uIiwKKyAgICAgICAgICAiTG9jYXRpb24gb2YgaW1hZ2UgZmlsZSB0byBvdmVybGF5IiwgTlVMTCwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRQorICAgICAgICAgIHwgR1NUX1BBUkFNX01VVEFCTEVfUExBWUlORyB8IEdfUEFSQU1fUkVBRFdSSVRFCisgICAgICAgICAgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfT0ZGU0VUX1gsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgib2Zmc2V0LXgiLCAiWCBPZmZzZXQiLAorICAgICAgICAgICJGb3IgcG9zaXRpdmUgdmFsdWUsIGhvcml6b250YWwgb2Zmc2V0IG9mIG92ZXJsYXkgaW1hZ2UgaW4gcGl4ZWxzIGZyb20iCisgICAgICAgICAgIiBsZWZ0IG9mIHZpZGVvIGltYWdlLiBGb3IgbmVnYXRpdmUgdmFsdWUsIGhvcml6b250YWwgb2Zmc2V0IG9mIG92ZXJsYXkiCisgICAgICAgICAgIiBpbWFnZSBpbiBwaXhlbHMgZnJvbSByaWdodCBvZiB2aWRlbyBpbWFnZSIsIEdfTUlOSU5ULCBHX01BWElOVCwgMCwKKyAgICAgICAgICBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR1NUX1BBUkFNX01VVEFCTEVfUExBWUlORyB8IEdfUEFSQU1fUkVBRFdSSVRFCisgICAgICAgICAgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfT0ZGU0VUX1ksCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgib2Zmc2V0LXkiLCAiWSBPZmZzZXQiLAorICAgICAgICAgICJGb3IgcG9zaXRpdmUgdmFsdWUsIHZlcnRpY2FsIG9mZnNldCBvZiBvdmVybGF5IGltYWdlIGluIHBpeGVscyBmcm9tIgorICAgICAgICAgICIgdG9wIG9mIHZpZGVvIGltYWdlLiBGb3IgbmVnYXRpdmUgdmFsdWUsIHZlcnRpY2FsIG9mZnNldCBvZiBvdmVybGF5IgorICAgICAgICAgICIgaW1hZ2UgaW4gcGl4ZWxzIGZyb20gYm90dG9tIG9mIHZpZGVvIGltYWdlIiwgR19NSU5JTlQsIEdfTUFYSU5ULCAwLAorICAgICAgICAgIEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHU1RfUEFSQU1fTVVUQUJMRV9QTEFZSU5HIHwgR19QQVJBTV9SRUFEV1JJVEUKKyAgICAgICAgICB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SRUxBVElWRV9YLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoInJlbGF0aXZlLXgiLCAiUmVsYXRpdmUgWCBPZmZzZXQiLAorICAgICAgICAgICJIb3Jpem9udGFsIG9mZnNldCBvZiBvdmVybGF5IGltYWdlIGluIGZyYWN0aW9ucyBvZiB2aWRlbyBpbWFnZSAiCisgICAgICAgICAgIndpZHRoLCBmcm9tIHRvcC1sZWZ0IGNvcm5lciBvZiB2aWRlbyBpbWFnZSIKKyAgICAgICAgICAiIChpbiByZWxhdGl2ZSBwb3NpdGlvbmluZykiLCAtMS4wLCAxLjAsIDAuMCwKKyAgICAgICAgICBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR1NUX1BBUkFNX01VVEFCTEVfUExBWUlORyB8IEdfUEFSQU1fUkVBRFdSSVRFCisgICAgICAgICAgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkVMQVRJVkVfWSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJyZWxhdGl2ZS15IiwgIlJlbGF0aXZlIFkgT2Zmc2V0IiwKKyAgICAgICAgICAiVmVydGljYWwgb2Zmc2V0IG9mIG92ZXJsYXkgaW1hZ2UgaW4gZnJhY3Rpb25zIG9mIHZpZGVvIGltYWdlICIKKyAgICAgICAgICAiaGVpZ2h0LCBmcm9tIHRvcC1sZWZ0IGNvcm5lciBvZiB2aWRlbyBpbWFnZSIKKyAgICAgICAgICAiIChpbiByZWxhdGl2ZSBwb3NpdGlvbmluZykiLCAtMS4wLCAxLjAsIDAuMCwKKyAgICAgICAgICBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR1NUX1BBUkFNX01VVEFCTEVfUExBWUlORyB8IEdfUEFSQU1fUkVBRFdSSVRFCisgICAgICAgICAgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfT1ZFUkxBWV9XSURUSCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJvdmVybGF5LXdpZHRoIiwgIk92ZXJsYXkgV2lkdGgiLAorICAgICAgICAgICJXaWR0aCBvZiBvdmVybGF5IGltYWdlIGluIHBpeGVscyAoMCA9IHNhbWUgYXMgb3ZlcmxheSBpbWFnZSkiLCAwLAorICAgICAgICAgIEdfTUFYSU5ULCAwLAorICAgICAgICAgIEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHU1RfUEFSQU1fTVVUQUJMRV9QTEFZSU5HIHwgR19QQVJBTV9SRUFEV1JJVEUKKyAgICAgICAgICB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9PVkVSTEFZX0hFSUdIVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJvdmVybGF5LWhlaWdodCIsICJPdmVybGF5IEhlaWdodCIsCisgICAgICAgICAgIkhlaWdodCBvZiBvdmVybGF5IGltYWdlIGluIHBpeGVscyAoMCA9IHNhbWUgYXMgb3ZlcmxheSBpbWFnZSkiLCAwLAorICAgICAgICAgIEdfTUFYSU5ULCAwLAorICAgICAgICAgIEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHU1RfUEFSQU1fTVVUQUJMRV9QTEFZSU5HIHwgR19QQVJBTV9SRUFEV1JJVEUKKyAgICAgICAgICB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9BTFBIQSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJhbHBoYSIsICJBbHBoYSIsICJHbG9iYWwgYWxwaGEgb2Ygb3ZlcmxheSBpbWFnZSIsCisgICAgICAgICAgMC4wLCAxLjAsIDEuMCwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdTVF9QQVJBTV9NVVRBQkxFX1BMQVlJTkcKKyAgICAgICAgICB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0R2RrUGl4YnVmT3ZlcmxheTpwaXhidWY6CisgICAqCisgICAqIEdka1BpeGJ1ZiBvYmplY3QgdG8gcmVuZGVyLgorICAgKgorICAgKiBTaW5jZTogMS42CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BJWEJVRiwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJwaXhidWYiLCAiUGl4YnVmIiwgIkdka1BpeGJ1ZiBvYmplY3QgdG8gcmVuZGVyIiwKKyAgICAgICAgICBHREtfVFlQRV9QSVhCVUYsIEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHU1RfUEFSQU1fTVVUQUJMRV9QTEFZSU5HCisgICAgICAgICAgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgLyoqCisgICAqIEdzdEdka1BpeGJ1Zk92ZXJsYXk6cG9zaXRpb25pbmctbW9kZToKKyAgICoKKyAgICogUG9zaXRpb25pbmcgbW9kZSBvZiBvZmZzZXQteCBhbmQgb2Zmc2V0LXkgcHJvcGVydGllcy4gRGV0ZXJtaW5lcyBob3cKKyAgICogbmVnYXRpdmUgeC95IG9mZnNldHMgd2lsbCBiZSBpbnRlcnByZXRlZC4gQnkgZGVmYXVsdCBuZWdhdGl2ZSB2YWx1ZXMKKyAgICogYXJlIGZvciBwb3NpdGlvbmluZyByZWxhdGl2ZSB0byB0aGUgcmlnaHQvYm90dG9tIGVkZ2Ugb2YgdGhlIHZpZGVvCisgICAqIGltYWdlLCBidXQgeW91IGNhbiB1c2UgdGhpcyBwcm9wZXJ0eSB0byBzZWxlY3QgYWJzb2x1dGUgcG9zaXRpb25pbmcKKyAgICogcmVsYXRpdmUgdG8gYSAoMCwgMCkgb3JpZ2luIGluIHRoZSB0b3AtbGVmdCBjb3JuZXIuIFRoYXQgd2F5IG5lZ2F0aXZlCisgICAqIG9mZnNldHMgd2lsbCBiZSB0byB0aGUgbGVmdC9hYm92ZSB0aGUgdmlkZW8gaW1hZ2UsIHdoaWNoIGFsbG93cyB5b3UgdG8KKyAgICogc21vb3RobHkgc2xpZGUgbG9nb3MgaW50byBhbmQgb3V0IG9mIHRoZSBmcmFtZSBpZiBkZXNpcmVkLgorICAgKgorICAgKiBTaW5jZTogMS42CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BPU0lUSU9OSU5HX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoInBvc2l0aW9uaW5nLW1vZGUiLCAiUG9zaXRpb25pbmcgbW9kZSIsCisgICAgICAgICAgIlBvc2l0aW9uaW5nIG1vZGUgb2Ygb2Zmc2V0LXggYW5kIG9mZnNldC15IHByb3BlcnRpZXMiLAorICAgICAgICAgIEdTVF9UWVBFX0dES19QSVhCVUZfUE9TSVRJT05JTkdfTU9ERSwgREVGQVVMVF9QT1NJVElPTklOR19NT0RFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qIEZJWE1FIHRoZSBmb2xsb3dpbmcgYWN0dWFsbHkgYWN0IGFzIGEgUkVMQVRJVkVfWC9SRUxBVElWRV9ZLAorICAgKiBidXQgdGhvc2Ugd2VyZSBhbHJlYWR5IHNsaWdodGx5IG11dGF0ZWQvYWJ1c2VkIHdpdGggQUJTT0xVVEUgcG9zaXRpb25pbmcsCisgICAqIHNvIGxldCdzIGtlZXAgdGhhdCBhbmQgZm9sbG93IHN1aXQKKyAgICogU3VmZmljZSBpdCB0byBzYXkgYWxsIHRoYXQgY291bGQgZG8gd2l0aCBjbGVhbnVwICgyLjAgPz8pICovCisgIC8qKgorICAgKiBHc3RHZGtQaXhidWZPdmVybGF5OmNvZWYteDoKKyAgICoKKyAgICogSW4gYWJzb2x1dGUgcG9zaXRpb25pbmcgbW9kZSwgdGhlIHggY29vcmRpbmF0ZSBvZiBvdmVybGF5IGltYWdlJ3MKKyAgICogdG9wLWxlZnQgY29ybmVyIGlzIG5vdyBnaXZlbiBieQorICAgKiBvZmZzZXQteCArIChyZWxhdGl2ZS14ICogb3ZlcmxheV93aWR0aCkgKyAoY29lZi14ICogdmlkZW9fd2lkdGgpLgorICAgKiBUaGlzIGFsbG93cyB0byBhbGlnbiB0aGUgaW1hZ2UgYWJzb2x1dGVseSBhbmQgcmVsYXRpdmVseQorICAgKiB0byBhbnkgZWRnZSBvciBjZW50ZXIgcG9zaXRpb24uCisgICAqCisgICAqIFNpbmNlOiAxLjEyCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NPRUZfWCwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJjb2VmLXgiLCAiUmVsYXRpdmUgWCBPZmZzZXQiLAorICAgICAgICAgICJIb3Jpem9udGFsIG9mZnNldCBvZiBvdmVybGF5IGltYWdlIGluIGZyYWN0aW9ucyBvZiB2aWRlbyBpbWFnZSAiCisgICAgICAgICAgIndpZHRoLCBmcm9tIHRvcC1sZWZ0IGNvcm5lciBvZiB2aWRlbyBpbWFnZSAoYWJzb2x1dGUgcG9zaXRpb25pbmcpIiwKKyAgICAgICAgICAtMS4wLCAxLjAsIDAuMCwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdTVF9QQVJBTV9NVVRBQkxFX1BMQVlJTkcKKyAgICAgICAgICB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0R2RrUGl4YnVmT3ZlcmxheTpjb2VmLXk6CisgICAqCisgICAqIEluIGFic29sdXRlIHBvc2l0aW9uaW5nIG1vZGUsIHRoZSB5IGNvb3JkaW5hdGUgb2Ygb3ZlcmxheSBpbWFnZSdzCisgICAqIHRvcC1sZWZ0IGNvcm5lciBpcyBub3cgZ2l2ZW4gYnkKKyAgICogb2Zmc2V0LXkgKyAocmVsYXRpdmUteSAqIG92ZXJsYXlfaGVpZ2h0KSArIChjb2VmLXkgKiB2aWRlb19oZWlnaHQpLgorICAgKiBUaGlzIGFsbG93cyB0byBhbGlnbiB0aGUgaW1hZ2UgYWJzb2x1dGVseSBhbmQgcmVsYXRpdmVseQorICAgKiB0byBhbnkgZWRnZSBvciBjZW50ZXIgcG9zaXRpb24uCisgICAqCisgICAqIFNpbmNlOiAxLjEyCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NPRUZfWSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJjb2VmLXkiLCAiUmVsYXRpdmUgWSBPZmZzZXQiLAorICAgICAgICAgICJWZXJ0aWNhbCBvZmZzZXQgb2Ygb3ZlcmxheSBpbWFnZSBpbiBmcmFjdGlvbnMgb2YgdmlkZW8gaW1hZ2UgIgorICAgICAgICAgICJoZWlnaHQsIGZyb20gdG9wLWxlZnQgY29ybmVyIG9mIHZpZGVvIGltYWdlIChhYnNvbHV0ZSBwb3NpdGlvbmluZykiLAorICAgICAgICAgIC0xLjAsIDEuMCwgMC4wLCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR1NUX1BBUkFNX01VVEFCTEVfUExBWUlORworICAgICAgICAgIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiR2RrUGl4YnVmIE92ZXJsYXkiLCAiRmlsdGVyL0VmZmVjdC9WaWRlbyIsCisgICAgICAiT3ZlcmxheSBhbiBpbWFnZSBvbnRvIGEgdmlkZW8gc3RyZWFtIiwKKyAgICAgICJUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PiIpOworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ2RrcGl4YnVmb3ZlcmxheV9kZWJ1ZywgImdka3BpeGJ1Zm92ZXJsYXkiLCAwLAorICAgICAgImRlYnVnIGNhdGVnb3J5IGZvciBnZGtwaXhidWZvdmVybGF5IGVsZW1lbnQiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9nZGtfcGl4YnVmX292ZXJsYXlfaW5pdCAoR3N0R2RrUGl4YnVmT3ZlcmxheSAqIG92ZXJsYXkpCit7CisgIG92ZXJsYXktPm9mZnNldF94ID0gMDsKKyAgb3ZlcmxheS0+b2Zmc2V0X3kgPSAwOworCisgIG92ZXJsYXktPnJlbGF0aXZlX3ggPSAwLjA7CisgIG92ZXJsYXktPnJlbGF0aXZlX3kgPSAwLjA7CisKKyAgb3ZlcmxheS0+Y29lZl94ID0gMC4wOworICBvdmVybGF5LT5jb2VmX3kgPSAwLjA7CisKKyAgb3ZlcmxheS0+cG9zaXRpb25pbmdfbW9kZSA9IERFRkFVTFRfUE9TSVRJT05JTkdfTU9ERTsKKworICBvdmVybGF5LT5vdmVybGF5X3dpZHRoID0gMDsKKyAgb3ZlcmxheS0+b3ZlcmxheV9oZWlnaHQgPSAwOworCisgIG92ZXJsYXktPmFscGhhID0gMS4wOworCisgIG92ZXJsYXktPnBpeGJ1ZiA9IE5VTEw7Cit9CisKK3ZvaWQKK2dzdF9nZGtfcGl4YnVmX292ZXJsYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RHZGtQaXhidWZPdmVybGF5ICpvdmVybGF5ID0gR1NUX0dES19QSVhCVUZfT1ZFUkxBWSAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKG92ZXJsYXkpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKKyAgICBjYXNlIFBST1BfTE9DQVRJT046eworICAgICAgR0Vycm9yICplcnIgPSBOVUxMOworICAgICAgZ19mcmVlIChvdmVybGF5LT5sb2NhdGlvbik7CisgICAgICBvdmVybGF5LT5sb2NhdGlvbiA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgaWYgKCFnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X2xvYWRfaW1hZ2UgKG92ZXJsYXksICZlcnIpKSB7CisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKG92ZXJsYXksICJDb3VsZCBub3QgbG9hZCBvdmVybGF5IGltYWdlOiAlcyIsCisgICAgICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX1BJWEJVRjp7CisgICAgICBHZGtQaXhidWYgKnBpeGJ1ZiA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOworCisgICAgICBpZiAob3ZlcmxheS0+cGl4YnVmICE9IE5VTEwpCisgICAgICAgIGdfb2JqZWN0X3VucmVmIChvdmVybGF5LT5waXhidWYpOworICAgICAgaWYgKHBpeGJ1ZikgeworICAgICAgICBvdmVybGF5LT5waXhidWYgPSBnX29iamVjdF9yZWYgKHBpeGJ1Zik7CisgICAgICAgIGdzdF9nZGtfcGl4YnVmX292ZXJsYXlfc2V0X3BpeGJ1ZiAob3ZlcmxheSwgZ19vYmplY3RfcmVmIChwaXhidWYpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG92ZXJsYXktPnBpeGJ1ZiA9IE5VTEw7CisgICAgICAgIGdzdF9idWZmZXJfcmVwbGFjZSAoJm92ZXJsYXktPnBpeGVscywgTlVMTCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX09GRlNFVF9YOgorICAgICAgb3ZlcmxheS0+b2Zmc2V0X3ggPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIG92ZXJsYXktPnVwZGF0ZV9jb21wb3NpdGlvbiA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfT0ZGU0VUX1k6CisgICAgICBvdmVybGF5LT5vZmZzZXRfeSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgb3ZlcmxheS0+dXBkYXRlX2NvbXBvc2l0aW9uID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRUxBVElWRV9YOgorICAgICAgb3ZlcmxheS0+cmVsYXRpdmVfeCA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgb3ZlcmxheS0+dXBkYXRlX2NvbXBvc2l0aW9uID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRUxBVElWRV9ZOgorICAgICAgb3ZlcmxheS0+cmVsYXRpdmVfeSA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgb3ZlcmxheS0+dXBkYXRlX2NvbXBvc2l0aW9uID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT0VGX1g6CisgICAgICBvdmVybGF5LT5jb2VmX3ggPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIG92ZXJsYXktPnVwZGF0ZV9jb21wb3NpdGlvbiA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ09FRl9ZOgorICAgICAgb3ZlcmxheS0+Y29lZl95ID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBvdmVybGF5LT51cGRhdGVfY29tcG9zaXRpb24gPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX09WRVJMQVlfV0lEVEg6CisgICAgICBvdmVybGF5LT5vdmVybGF5X3dpZHRoID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBvdmVybGF5LT51cGRhdGVfY29tcG9zaXRpb24gPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX09WRVJMQVlfSEVJR0hUOgorICAgICAgb3ZlcmxheS0+b3ZlcmxheV9oZWlnaHQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIG92ZXJsYXktPnVwZGF0ZV9jb21wb3NpdGlvbiA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQUxQSEE6CisgICAgICBvdmVybGF5LT5hbHBoYSA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgb3ZlcmxheS0+dXBkYXRlX2NvbXBvc2l0aW9uID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QT1NJVElPTklOR19NT0RFOgorICAgICAgb3ZlcmxheS0+cG9zaXRpb25pbmdfbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIG92ZXJsYXktPnVwZGF0ZV9jb21wb3NpdGlvbiA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChvdmVybGF5KTsKK30KKwordm9pZAorZ3N0X2dka19waXhidWZfb3ZlcmxheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEdka1BpeGJ1Zk92ZXJsYXkgKm92ZXJsYXkgPSBHU1RfR0RLX1BJWEJVRl9PVkVSTEFZIChvYmplY3QpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAob3ZlcmxheSk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIG92ZXJsYXktPmxvY2F0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QSVhCVUY6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBvdmVybGF5LT5waXhidWYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX09GRlNFVF9YOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgb3ZlcmxheS0+b2Zmc2V0X3gpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX09GRlNFVF9ZOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgb3ZlcmxheS0+b2Zmc2V0X3kpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFTEFUSVZFX1g6CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBvdmVybGF5LT5yZWxhdGl2ZV94KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRUxBVElWRV9ZOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgb3ZlcmxheS0+cmVsYXRpdmVfeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ09FRl9YOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgb3ZlcmxheS0+Y29lZl94KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT0VGX1k6CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBvdmVybGF5LT5jb2VmX3kpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX09WRVJMQVlfV0lEVEg6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBvdmVybGF5LT5vdmVybGF5X3dpZHRoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9PVkVSTEFZX0hFSUdIVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIG92ZXJsYXktPm92ZXJsYXlfaGVpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BTFBIQToKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIG92ZXJsYXktPmFscGhhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QT1NJVElPTklOR19NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIG92ZXJsYXktPnBvc2l0aW9uaW5nX21vZGUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KKworICBHU1RfT0JKRUNUX1VOTE9DSyAob3ZlcmxheSk7Cit9CisKK3ZvaWQKK2dzdF9nZGtfcGl4YnVmX292ZXJsYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEdka1BpeGJ1Zk92ZXJsYXkgKm92ZXJsYXkgPSBHU1RfR0RLX1BJWEJVRl9PVkVSTEFZIChvYmplY3QpOworCisgIGdfZnJlZSAob3ZlcmxheS0+bG9jYXRpb24pOworICBvdmVybGF5LT5sb2NhdGlvbiA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF9nZGtfcGl4YnVmX292ZXJsYXlfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2dka19waXhidWZfb3ZlcmxheV9sb2FkX2ltYWdlIChHc3RHZGtQaXhidWZPdmVybGF5ICogb3ZlcmxheSwgR0Vycm9yICoqIGVycikKK3sKKyAgR2RrUGl4YnVmICpwaXhidWY7CisKKyAgcGl4YnVmID0gZ2RrX3BpeGJ1Zl9uZXdfZnJvbV9maWxlIChvdmVybGF5LT5sb2NhdGlvbiwgZXJyKTsKKworICBpZiAocGl4YnVmID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGdzdF9nZGtfcGl4YnVmX292ZXJsYXlfc2V0X3BpeGJ1ZiAob3ZlcmxheSwgcGl4YnVmKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFRha2VzIG93bmVyc2hpcCBvZiBwaXhidWY7IGNhbGwgd2l0aCBPQkpFQ1RfTE9DSyAqLworc3RhdGljIHZvaWQKK2dzdF9nZGtfcGl4YnVmX292ZXJsYXlfc2V0X3BpeGJ1ZiAoR3N0R2RrUGl4YnVmT3ZlcmxheSAqIG92ZXJsYXksCisgICAgR2RrUGl4YnVmICogcGl4YnVmKQoreworICBHc3RWaWRlb01ldGEgKnZpZGVvX21ldGE7CisgIGd1aW50OCAqcGl4ZWxzLCAqcDsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHcsIGgsIHBsYW5lOworCisgIGlmICghZ2RrX3BpeGJ1Zl9nZXRfaGFzX2FscGhhIChwaXhidWYpKSB7CisgICAgR2RrUGl4YnVmICphbHBoYV9waXhidWY7CisKKyAgICAvKiBGSVhNRTogd2UgY291bGQgZG8gdGhpcyBtdWNoIG1vcmUgZWZmaWNpZW50bHkgb3Vyc2VsdmVzIGJlbG93LCBidXQKKyAgICAgKiB3ZSdyZSBsYXp5IGZvciBub3cgKi8KKyAgICAvKiBGSVhNRTogcGVyaGFwcyBleHBvc2Ugc3Vic3RpdHV0ZV9jb2xvciB2aWEgcHJvcGVydGllcyAqLworICAgIGFscGhhX3BpeGJ1ZiA9IGdka19waXhidWZfYWRkX2FscGhhIChwaXhidWYsIEZBTFNFLCAwLCAwLCAwKTsKKyAgICBnX29iamVjdF91bnJlZiAocGl4YnVmKTsKKyAgICBwaXhidWYgPSBhbHBoYV9waXhidWY7CisgIH0KKworICB3aWR0aCA9IGdka19waXhidWZfZ2V0X3dpZHRoIChwaXhidWYpOworICBoZWlnaHQgPSBnZGtfcGl4YnVmX2dldF9oZWlnaHQgKHBpeGJ1Zik7CisgIHN0cmlkZSA9IGdka19waXhidWZfZ2V0X3Jvd3N0cmlkZSAocGl4YnVmKTsKKyAgcGl4ZWxzID0gZ2RrX3BpeGJ1Zl9nZXRfcGl4ZWxzIChwaXhidWYpOworCisgIC8qIHRoZSBtZW1vcnkgbGF5b3V0IGluIEdka1BpeGJ1ZiBpcyBSLUctQi1BLCB3ZSB3YW50OgorICAgKiAgLSBCLUctUi1BIG9uIGxpdHRsZS1lbmRpYW4gcGxhdGZvcm1zCisgICAqICAtIEEtUi1HLUIgb24gYmlnLWVuZGlhbiBwbGF0Zm9ybXMKKyAgICovCisgIGZvciAoaCA9IDA7IGggPCBoZWlnaHQ7ICsraCkgeworICAgIHAgPSBwaXhlbHMgKyAoaCAqIHN0cmlkZSk7CisgICAgZm9yICh3ID0gMDsgdyA8IHdpZHRoOyArK3cpIHsKKyAgICAgIGd1aW50OCB0bXA7CisKKyAgICAgIC8qIFItRy1CLUEgPT0+IEItRy1SLUEgKi8KKyAgICAgIHRtcCA9IHBbMF07CisgICAgICBwWzBdID0gcFsyXTsKKyAgICAgIHBbMl0gPSB0bXA7CisKKyAgICAgIGlmIChHX0JZVEVfT1JERVIgPT0gR19CSUdfRU5ESUFOKSB7CisgICAgICAgIC8qIEItRy1SLUEgPT0+IEEtUi1HLUIgKi8KKyAgICAgICAgLyogd2UgY2FuIHByb2JhYmx5IGFzc3VtZSBzYW5lIGFsaWdubWVudCAqLworICAgICAgICAqKChndWludDMyICopIHApID0gR1VJTlQzMl9TV0FQX0xFX0JFICgqKChndWludDMyICopIHApKTsKKyAgICAgIH0KKworICAgICAgcCArPSA0OworICAgIH0KKyAgfQorCisgIGlmIChvdmVybGF5LT5waXhlbHMpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3ZlcmxheS0+cGl4ZWxzKTsKKworICAvKiBhc3N1bWUgd2UgaGF2ZSByb3cgcGFkZGluZyBldmVuIGZvciB0aGUgbGFzdCByb3cgKi8KKyAgLyogdHJhbnNmZXIgb3duZXJzaGlwIG9mIHBpeGJ1ZiB0byB0aGUgYnVmZmVyICovCisgIG92ZXJsYXktPnBpeGVscyA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWRfZnVsbCAoR1NUX01FTU9SWV9GTEFHX1JFQURPTkxZLAorICAgICAgcGl4ZWxzLCBoZWlnaHQgKiBzdHJpZGUsIDAsIGhlaWdodCAqIHN0cmlkZSwgcGl4YnVmLAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnX29iamVjdF91bnJlZik7CisKKyAgdmlkZW9fbWV0YSA9IGdzdF9idWZmZXJfYWRkX3ZpZGVvX21ldGEgKG92ZXJsYXktPnBpeGVscywKKyAgICAgIEdTVF9WSURFT19GUkFNRV9GTEFHX05PTkUsIEdTVF9WSURFT19PVkVSTEFZX0NPTVBPU0lUSU9OX0ZPUk1BVF9SR0IsCisgICAgICB3aWR0aCwgaGVpZ2h0KTsKKworICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCB2aWRlb19tZXRhLT5uX3BsYW5lczsgKytwbGFuZSkKKyAgICB2aWRlb19tZXRhLT5zdHJpZGVbcGxhbmVdID0gc3RyaWRlOworCisgIG92ZXJsYXktPnVwZGF0ZV9jb21wb3NpdGlvbiA9IFRSVUU7CisKKyAgR1NUX0lORk9fT0JKRUNUIChvdmVybGF5LCAiVXBkYXRlZCBwaXhidWYsICVkIHggJWQiLCB3aWR0aCwgaGVpZ2h0KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpCit7CisgIEdzdEdka1BpeGJ1Zk92ZXJsYXkgKm92ZXJsYXkgPSBHU1RfR0RLX1BJWEJVRl9PVkVSTEFZICh0cmFucyk7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICBpZiAob3ZlcmxheS0+bG9jYXRpb24gIT0gTlVMTCkgeworICAgIGlmICghZ3N0X2dka19waXhidWZfb3ZlcmxheV9sb2FkX2ltYWdlIChvdmVybGF5LCAmZXJyKSkKKyAgICAgIGdvdG8gZXJyb3JfbG9hZGluZ19pbWFnZTsKKworICAgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfcGFzc3Rocm91Z2ggKHRyYW5zLCBGQUxTRSk7CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChvdmVybGF5LCAibm8gaW1hZ2UgbG9jYXRpb24gc2V0LCBkb2luZyBub3RoaW5nIik7CisgICAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAodHJhbnMsIFRSVUUpOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKy8qIEVSUk9SUyAqLworZXJyb3JfbG9hZGluZ19pbWFnZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvdmVybGF5LCBSRVNPVVJDRSwgT1BFTl9SRUFELAorICAgICAgICAoIkNvdWxkIG5vdCBsb2FkIG92ZXJsYXkgaW1hZ2UuIiksICgiJXMiLCBlcnItPm1lc3NhZ2UpKTsKKyAgICBnX2Vycm9yX2ZyZWUgKGVycik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2dka19waXhidWZfb3ZlcmxheV9zdG9wIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpCit7CisgIEdzdEdka1BpeGJ1Zk92ZXJsYXkgKm92ZXJsYXkgPSBHU1RfR0RLX1BJWEJVRl9PVkVSTEFZICh0cmFucyk7CisKKyAgaWYgKG92ZXJsYXktPmNvbXApIHsKKyAgICBnc3RfdmlkZW9fb3ZlcmxheV9jb21wb3NpdGlvbl91bnJlZiAob3ZlcmxheS0+Y29tcCk7CisgICAgb3ZlcmxheS0+Y29tcCA9IE5VTEw7CisgIH0KKworICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZvdmVybGF5LT5waXhlbHMsIE5VTEwpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9nZGtfcGl4YnVmX292ZXJsYXlfc2V0X2luZm8gKEdzdFZpZGVvRmlsdGVyICogZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR1NUX0lORk9fT0JKRUNUIChmaWx0ZXIsICJjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgaW5jYXBzKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X3VwZGF0ZV9jb21wb3NpdGlvbiAoR3N0R2RrUGl4YnVmT3ZlcmxheSAqIG92ZXJsYXkpCit7CisgIEdzdEdka1BpeGJ1ZlBvc2l0aW9uaW5nTW9kZSBwb3NpdGlvbmluZ19tb2RlOworICBHc3RWaWRlb092ZXJsYXlDb21wb3NpdGlvbiAqY29tcDsKKyAgR3N0VmlkZW9PdmVybGF5UmVjdGFuZ2xlICpyZWN0OworICBHc3RWaWRlb01ldGEgKm92ZXJsYXlfbWV0YTsKKyAgZ2ludCB4LCB5LCB3aWR0aCwgaGVpZ2h0OworICBnaW50IHZpZGVvX3dpZHRoID0KKyAgICAgIEdTVF9WSURFT19JTkZPX1dJRFRIICgmR1NUX1ZJREVPX0ZJTFRFUiAob3ZlcmxheSktPmluX2luZm8pOworICBnaW50IHZpZGVvX2hlaWdodCA9CisgICAgICBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZHU1RfVklERU9fRklMVEVSIChvdmVybGF5KS0+aW5faW5mbyk7CisKKyAgaWYgKG92ZXJsYXktPmNvbXApIHsKKyAgICBnc3RfdmlkZW9fb3ZlcmxheV9jb21wb3NpdGlvbl91bnJlZiAob3ZlcmxheS0+Y29tcCk7CisgICAgb3ZlcmxheS0+Y29tcCA9IE5VTEw7CisgIH0KKworICBpZiAob3ZlcmxheS0+YWxwaGEgPT0gMC4wIHx8IG92ZXJsYXktPnBpeGVscyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBvdmVybGF5X21ldGEgPSBnc3RfYnVmZmVyX2dldF92aWRlb19tZXRhIChvdmVybGF5LT5waXhlbHMpOworCisgIHBvc2l0aW9uaW5nX21vZGUgPSBvdmVybGF5LT5wb3NpdGlvbmluZ19tb2RlOworICBHU1RfREVCVUdfT0JKRUNUIChvdmVybGF5LCAib3ZlcmxheSBwb3NpdGlvbmluZyBtb2RlICVkIiwgcG9zaXRpb25pbmdfbW9kZSk7CisKKyAgd2lkdGggPSBvdmVybGF5LT5vdmVybGF5X3dpZHRoOworICBpZiAod2lkdGggPT0gMCkKKyAgICB3aWR0aCA9IG92ZXJsYXlfbWV0YS0+d2lkdGg7CisKKyAgaGVpZ2h0ID0gb3ZlcmxheS0+b3ZlcmxheV9oZWlnaHQ7CisgIGlmIChoZWlnaHQgPT0gMCkKKyAgICBoZWlnaHQgPSBvdmVybGF5X21ldGEtPmhlaWdodDsKKworICBpZiAocG9zaXRpb25pbmdfbW9kZSA9PSBHU1RfR0RLX1BJWEJVRl9QT1NJVElPTklOR19QSVhFTFNfQUJTT0xVVEUpIHsKKyAgICB4ID0gb3ZlcmxheS0+b2Zmc2V0X3ggKyAob3ZlcmxheS0+cmVsYXRpdmVfeCAqIHdpZHRoKSArCisgICAgICAgIChvdmVybGF5LT5jb2VmX3ggKiB2aWRlb193aWR0aCk7CisgICAgeSA9IG92ZXJsYXktPm9mZnNldF95ICsgKG92ZXJsYXktPnJlbGF0aXZlX3kgKiBoZWlnaHQpICsKKyAgICAgICAgKG92ZXJsYXktPmNvZWZfeSAqIHZpZGVvX2hlaWdodCk7CisgIH0gZWxzZSB7CisgICAgeCA9IG92ZXJsYXktPm9mZnNldF94IDwgMCA/CisgICAgICAgIHZpZGVvX3dpZHRoICsgb3ZlcmxheS0+b2Zmc2V0X3ggLSB3aWR0aCArCisgICAgICAgIChvdmVybGF5LT5yZWxhdGl2ZV94ICogdmlkZW9fd2lkdGgpIDoKKyAgICAgICAgb3ZlcmxheS0+b2Zmc2V0X3ggKyAob3ZlcmxheS0+cmVsYXRpdmVfeCAqIHZpZGVvX3dpZHRoKTsKKyAgICB5ID0gb3ZlcmxheS0+b2Zmc2V0X3kgPCAwID8KKyAgICAgICAgdmlkZW9faGVpZ2h0ICsgb3ZlcmxheS0+b2Zmc2V0X3kgLSBoZWlnaHQgKworICAgICAgICAob3ZlcmxheS0+cmVsYXRpdmVfeSAqIHZpZGVvX2hlaWdodCkgOgorICAgICAgICBvdmVybGF5LT5vZmZzZXRfeSArIChvdmVybGF5LT5yZWxhdGl2ZV95ICogdmlkZW9faGVpZ2h0KTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKG92ZXJsYXksICJvdmVybGF5IGltYWdlIGRpbWVuc2lvbnM6ICVkIHggJWQsIGFscGhhPSUuMmYiLAorICAgICAgb3ZlcmxheV9tZXRhLT53aWR0aCwgb3ZlcmxheV9tZXRhLT5oZWlnaHQsIG92ZXJsYXktPmFscGhhKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAob3ZlcmxheSwgInByb3BlcnRpZXM6IHgseTogJWQsJWQgIgorICAgICAgIiglZyUlLCVnJSUpIGNvZWYgKCVnJSUsJWclJSkgLSBXeEg6ICVkeCVkIiwKKyAgICAgIG92ZXJsYXktPm9mZnNldF94LCBvdmVybGF5LT5vZmZzZXRfeSwKKyAgICAgIG92ZXJsYXktPnJlbGF0aXZlX3ggKiAxMDAuMCwgb3ZlcmxheS0+cmVsYXRpdmVfeSAqIDEwMC4wLAorICAgICAgb3ZlcmxheS0+Y29lZl94ICogMTAwLjAsIG92ZXJsYXktPmNvZWZfeSAqIDEwMC4wLAorICAgICAgb3ZlcmxheS0+b3ZlcmxheV9oZWlnaHQsIG92ZXJsYXktPm92ZXJsYXlfd2lkdGgpOworICBHU1RfREVCVUdfT0JKRUNUIChvdmVybGF5LCAib3ZlcmxheSByZW5kZXJlZDogJWQgeCAlZCBAICVkLCVkIChvbnRvICVkIHggJWQpIiwKKyAgICAgIHdpZHRoLCBoZWlnaHQsIHgsIHksIHZpZGVvX3dpZHRoLCB2aWRlb19oZWlnaHQpOworCisgIHJlY3QgPSBnc3RfdmlkZW9fb3ZlcmxheV9yZWN0YW5nbGVfbmV3X3JhdyAob3ZlcmxheS0+cGl4ZWxzLAorICAgICAgeCwgeSwgd2lkdGgsIGhlaWdodCwgR1NUX1ZJREVPX09WRVJMQVlfRk9STUFUX0ZMQUdfTk9ORSk7CisKKyAgaWYgKG92ZXJsYXktPmFscGhhICE9IDEuMCkKKyAgICBnc3RfdmlkZW9fb3ZlcmxheV9yZWN0YW5nbGVfc2V0X2dsb2JhbF9hbHBoYSAocmVjdCwgb3ZlcmxheS0+YWxwaGEpOworCisgIGNvbXAgPSBnc3RfdmlkZW9fb3ZlcmxheV9jb21wb3NpdGlvbl9uZXcgKHJlY3QpOworICBnc3RfdmlkZW9fb3ZlcmxheV9yZWN0YW5nbGVfdW5yZWYgKHJlY3QpOworCisgIG92ZXJsYXktPmNvbXAgPSBjb21wOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2dka19waXhidWZfb3ZlcmxheV9iZWZvcmVfdHJhbnNmb3JtIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0QnVmZmVyICogb3V0YnVmKQoreworICBHc3RDbG9ja1RpbWUgc3RyZWFtX3RpbWU7CisgIEdzdEdka1BpeGJ1Zk92ZXJsYXkgKm92ZXJsYXkgPSBHU1RfR0RLX1BJWEJVRl9PVkVSTEFZICh0cmFucyk7CisgIGdib29sZWFuIHNldF9wYXNzdGhyb3VnaCA9IEZBTFNFOworCisgIHN0cmVhbV90aW1lID0gZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZ0cmFucy0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKHRyYW5zKSwgc3RyZWFtX3RpbWUpOworCisgIC8qIG5vdyBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzeW5jJ2VkOyBtYXliZSBuZWVkIHRvIHVwZGF0ZSBjb21wb3NpdGlvbiAqLworICBHU1RfT0JKRUNUX0xPQ0sgKG92ZXJsYXkpOworICBpZiAoR19VTkxJS0VMWSAob3ZlcmxheS0+dXBkYXRlX2NvbXBvc2l0aW9uKSkgeworICAgIGdzdF9nZGtfcGl4YnVmX292ZXJsYXlfdXBkYXRlX2NvbXBvc2l0aW9uIChvdmVybGF5KTsKKyAgICBvdmVybGF5LT51cGRhdGVfY29tcG9zaXRpb24gPSBGQUxTRTsKKyAgICBzZXRfcGFzc3Rocm91Z2ggPSBUUlVFOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChvdmVybGF5KTsKKworICAvKiBkZXRlcm1pbmUgcGFzc3Rocm91Z2ggbW9kZSBzbyB0aGUgYnVmZmVyIGlzIHdyaXRhYmxlIGlmIG5lZWRlZAorICAgKiB3aGVuIHBhc3NlZCBpbnRvIF90cmFuc2Zvcm1faXAgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHNldF9wYXNzdGhyb3VnaCkpCisgICAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAodHJhbnMsIG92ZXJsYXktPmNvbXAgPT0gTlVMTCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X3RyYW5zZm9ybV9mcmFtZV9pcCAoR3N0VmlkZW9GaWx0ZXIgKiBmaWx0ZXIsCisgICAgR3N0VmlkZW9GcmFtZSAqIGZyYW1lKQoreworICBHc3RHZGtQaXhidWZPdmVybGF5ICpvdmVybGF5ID0gR1NUX0dES19QSVhCVUZfT1ZFUkxBWSAoZmlsdGVyKTsKKworICBpZiAob3ZlcmxheS0+Y29tcCAhPSBOVUxMKQorICAgIGdzdF92aWRlb19vdmVybGF5X2NvbXBvc2l0aW9uX2JsZW5kIChvdmVybGF5LT5jb21wLCBmcmFtZSk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQpkaWZmIC0tZ2l0IGEvZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5oIGIvZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmb3ZlcmxheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkODBiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZvdmVybGF5LmgKQEAgLTAsMCArMSw5NCBAQAorLyogR1N0cmVhbWVyIEdka1BpeGJ1ZiBvdmVybGF5CisgKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNCBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0dTVF9HREtfUElYQlVGX09WRVJMQVlfSF8KKyNkZWZpbmUgX0dTVF9HREtfUElYQlVGX09WRVJMQVlfSF8KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2ZpbHRlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby1vdmVybGF5LWNvbXBvc2l0aW9uLmg+CisKKyNpbmNsdWRlIDxnZGstcGl4YnVmL2dkay1waXhidWYuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0dES19QSVhCVUZfT1ZFUkxBWSAgIChnc3RfZ2RrX3BpeGJ1Zl9vdmVybGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9HREtfUElYQlVGX09WRVJMQVkob2JqKSAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9HREtfUElYQlVGX09WRVJMQVksR3N0R2RrUGl4YnVmT3ZlcmxheSkpCisjZGVmaW5lIEdTVF9HREtfUElYQlVGX09WRVJMQVlfQ0xBU1Moa2xhc3MpICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfR0RLX1BJWEJVRl9PVkVSTEFZLEdzdEdka1BpeGJ1Zk92ZXJsYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19HREtfUElYQlVGX09WRVJMQVkob2JqKSAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9HREtfUElYQlVGX09WRVJMQVkpKQorI2RlZmluZSBHU1RfSVNfR0RLX1BJWEJVRl9PVkVSTEFZX0NMQVNTKG9iaikgICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9HREtfUElYQlVGX09WRVJMQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0R2RrUGl4YnVmT3ZlcmxheSBHc3RHZGtQaXhidWZPdmVybGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdEdka1BpeGJ1Zk92ZXJsYXlDbGFzcyBHc3RHZGtQaXhidWZPdmVybGF5Q2xhc3M7CisKK3R5cGVkZWYgZW51bSB7CisgIEdTVF9HREtfUElYQlVGX1BPU0lUSU9OSU5HX1BJWEVMU19SRUxBVElWRV9UT19FREdFUywKKyAgR1NUX0dES19QSVhCVUZfUE9TSVRJT05JTkdfUElYRUxTX0FCU09MVVRFCit9IEdzdEdka1BpeGJ1ZlBvc2l0aW9uaW5nTW9kZTsKKworLyoqCisgKiBHc3RHZGtQaXhidWZPdmVybGF5OgorICoKKyAqIFRoZSBvcGFxdWUgZWxlbWVudCBpbnN0YW5jZSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0R2RrUGl4YnVmT3ZlcmxheQoreworICBHc3RWaWRlb0ZpbHRlciAgICAgICAgICAgICAgIHZpZGVvZmlsdGVyOworCisgIC8qIHByb3BlcnRpZXMgKi8KKyAgZ2NoYXIgICAgICAgICAgICAgICAgICAgICAgKiBsb2NhdGlvbjsKKworICAvKiBwaXhidWYgc2V0IHZpYSBwaXhidWYgcHJvcGVydHkgKi8KKyAgR2RrUGl4YnVmICAgICAgICAgICAgICAgICAgKiBwaXhidWY7CisKKyAgZ2ludCAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfeDsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfeTsKKworICBnZG91YmxlICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlX3g7CisgIGdkb3VibGUgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVfeTsKKworICBnZG91YmxlICAgICAgICAgICAgICAgICAgICAgIGNvZWZfeDsKKyAgZ2RvdWJsZSAgICAgICAgICAgICAgICAgICAgICBjb2VmX3k7CisKKyAgR3N0R2RrUGl4YnVmUG9zaXRpb25pbmdNb2RlICBwb3NpdGlvbmluZ19tb2RlOworCisgIGdpbnQgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheV93aWR0aDsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5X2hlaWdodDsKKworICBnZG91YmxlICAgICAgICAgICAgICAgICAgICAgIGFscGhhOworCisgIC8qIHRoZSBsb2FkZWQgaW1hZ2UsIGFzIEJHUkEvQVJHQiBwaXhlbHMsIHdpdGggR3N0VmlkZW9NZXRhICovCisgIEdzdEJ1ZmZlciAgICAgICAgICAgICAgICAgICogcGl4ZWxzOyAgICAgICAgICAgICAgIC8qIE9CSkVDVF9MT0NLICovCisKKyAgR3N0VmlkZW9PdmVybGF5Q29tcG9zaXRpb24gKiBjb21wOworCisgIC8qIHJlbmRlciBwb3NpdGlvbiBvciBkaW1lbnNpb24gaGFzIGNoYW5nZWQgKi8KKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgICAgICB1cGRhdGVfY29tcG9zaXRpb247Cit9OworCitzdHJ1Y3QgX0dzdEdka1BpeGJ1Zk92ZXJsYXlDbGFzcworeworICBHc3RWaWRlb0ZpbHRlckNsYXNzICB2aWRlb2ZpbHRlcl9jbGFzczsKK307CisKK0dUeXBlIGdzdF9nZGtfcGl4YnVmX292ZXJsYXlfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZnBsdWdpbi5jIGIvZXh0L2dka19waXhidWYvZ3N0Z2RrcGl4YnVmcGx1Z2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1OGI5ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZnBsdWdpbi5jCkBAIC0wLDAgKzEsMTA4IEBACisvKiBHU3RyZWFtZXIgR2RrUGl4YnVmIHBsdWdpbgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnc3RnZGtwaXhidWZkZWMuaCIKKyNpbmNsdWRlICJnc3RnZGtwaXhidWZvdmVybGF5LmgiCisjaW5jbHVkZSAiZ3N0Z2RrcGl4YnVmc2luay5oIgorCisKKyNpZiAwCitzdGF0aWMgdm9pZCBnc3RfZ2RrX3BpeGJ1Zl90eXBlX2ZpbmQgKEdzdFR5cGVGaW5kICogdGYsIGdwb2ludGVyIGlnbm9yZSk7CisKKyNkZWZpbmUgR1NUX0dES19QSVhCVUZfVFlQRV9GSU5EX1NJWkUgMTAyNAorCitzdGF0aWMgdm9pZAorZ3N0X2dka19waXhidWZfdHlwZV9maW5kIChHc3RUeXBlRmluZCAqIHRmLCBncG9pbnRlciBpZ25vcmUpCit7CisgIGd1aW50OCAqZGF0YTsKKyAgR2RrUGl4YnVmTG9hZGVyICpwaXhidWZfbG9hZGVyOworICBHZGtQaXhidWZGb3JtYXQgKmZvcm1hdDsKKworICBkYXRhID0gZ3N0X3R5cGVfZmluZF9wZWVrICh0ZiwgMCwgR1NUX0dES19QSVhCVUZfVFlQRV9GSU5EX1NJWkUpOworICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBHU1RfREVCVUcgKCJjcmVhdGluZyBuZXcgbG9hZGVyIik7CisKKyAgcGl4YnVmX2xvYWRlciA9IGdka19waXhidWZfbG9hZGVyX25ldyAoKTsKKworICBnZGtfcGl4YnVmX2xvYWRlcl93cml0ZSAocGl4YnVmX2xvYWRlciwgZGF0YSwgR1NUX0dES19QSVhCVUZfVFlQRV9GSU5EX1NJWkUsCisgICAgICBOVUxMKTsKKworICBmb3JtYXQgPSBnZGtfcGl4YnVmX2xvYWRlcl9nZXRfZm9ybWF0IChwaXhidWZfbG9hZGVyKTsKKworICBpZiAoZm9ybWF0ICE9IE5VTEwpIHsKKyAgICBHc3RDYXBzICpjYXBzOworICAgIGdjaGFyICoqcDsKKyAgICBnY2hhciAqKm1saXN0ID0gZ2RrX3BpeGJ1Zl9mb3JtYXRfZ2V0X21pbWVfdHlwZXMgKGZvcm1hdCk7CisKKyAgICBmb3IgKHAgPSBtbGlzdDsgKnA7ICsrcCkgeworICAgICAgR1NUX0RFQlVHICgic3VnZ2VzdGluZyBtaW1lIHR5cGUgJXMiLCAqcCk7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoKnAsIE5VTEwpOworICAgICAgZ3N0X3R5cGVfZmluZF9zdWdnZXN0ICh0ZiwgR1NUX1RZUEVfRklORF9NSU5JTVVNLCBjYXBzKTsKKyAgICAgIGdzdF9jYXBzX2ZyZWUgKGNhcHMpOworICAgIH0KKyAgICBnX3N0cmZyZWV2IChtbGlzdCk7CisgIH0KKworICBHU1RfREVCVUcgKCJjbG9zaW5nIHBpeGJ1ZiBsb2FkZXIsIGhvcGUgaXQgZG9lc24ndCBoYW5nIC4uLiIpOworICAvKiBsaWJyc3ZnIDIuNC54IGhhcyBhIGJ1ZyB3aGVyZSBpdCB0cmlnZ2VycyBhbiBlbmRsZXNzIGxvb3AgaW4gdHJ5aW5nCisgICAgIHRvIGNsb3NlIGEgZ3ppcCB0aGF0J3Mgbm90IGFuIHN2ZzsgZml4ZWQgdXBzdHJlYW0gYnV0IG5vIGdvb2Qgd2F5CisgICAgIHRvIHdvcmsgYXJvdW5kIGl0ICovCisgIGdka19waXhidWZfbG9hZGVyX2Nsb3NlIChwaXhidWZfbG9hZGVyLCBOVUxMKTsKKyAgR1NUX0RFQlVHICgiY2xvc2VkIHBpeGJ1ZiBsb2FkZXIiKTsKKyAgZ19vYmplY3RfdW5yZWYgKEdfT0JKRUNUIChwaXhidWZfbG9hZGVyKSk7Cit9CisjZW5kaWYKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJnZGtwaXhidWZkZWMiLCBHU1RfUkFOS19TRUNPTkRBUlksCisgICAgICAgICAgR1NUX1RZUEVfR0RLX1BJWEJVRl9ERUMpKQorICAgIHJldHVybiBGQUxTRTsKKworI2lmIDAKKyAgZ3N0X3R5cGVfZmluZF9yZWdpc3RlciAocGx1Z2luLCAiaW1hZ2UvKiIsIEdTVF9SQU5LX01BUkdJTkFMLAorICAgICAgZ3N0X2dka19waXhidWZfdHlwZV9maW5kLCBOVUxMLCBHU1RfQ0FQU19BTlksIE5VTEwpOworI2VuZGlmCisKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiZ2RrcGl4YnVmb3ZlcmxheSIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfR0RLX1BJWEJVRl9PVkVSTEFZKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiZ2RrcGl4YnVmc2luayIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfR0RLX1BJWEJVRl9TSU5LKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBnZGtwaXhidWYsCisgICAgIkdka1BpeGJ1Zi1iYXNlZCBpbWFnZSBkZWNvZGVyLCBvdmVybGF5IGFuZCBzaW5rIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmMgYi9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM0Y2YzZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZnNpbmsuYwpAQCAtMCwwICsxLDQzOSBAQAorLyogR1N0cmVhbWVyIEdka1BpeGJ1ZiBzaW5rCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1nZGtwaXhidWZzaW5rCisgKgorICogVGhpcyBzaW5rIGVsZW1lbnQgdGFrZXMgUkdCIG9yIFJHQkEgaW1hZ2VzIGFzIGlucHV0IGFuZCB3cmFwcyB0aGVtIGludG8KKyAqICNHZGtQaXhidWYgb2JqZWN0cywgZm9yIGVhc3kgc2F2aW5nIHRvIGZpbGUgdmlhIHRoZQorICogR2RrUGl4YnVmIGxpYnJhcnkgQVBJIG9yIGRpc3BsYXlpbmcgaW4gR3RrKyBhcHBsaWNhdGlvbnMgKGUuZy4gdXNpbmcKKyAqIHRoZSAjR3RrSW1hZ2Ugd2lkZ2V0KS4KKyAqCisgKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gdXNlIHRoaXMgZWxlbWVudCBhbmQgb2J0YWluIHRoZSAjR2RrUGl4YnVmIG9iamVjdHMKKyAqIGNyZWF0ZWQ6CisgKiA8aXRlbWl6ZWRsaXN0PgorICogPGxpc3RpdGVtPgorICogV2F0Y2hpbmcgZm9yIGVsZW1lbnQgbWVzc2FnZXMgbmFtZWQgPGNsYXNzbmFtZT4mcXVvdDtwcmVyb2xsLXBpeGJ1ZiZxdW90OworICogPC9jbGFzc25hbWU+IG9yIDxjbGFzc25hbWU+JnF1b3Q7cGl4YnVmJnF1b3Q7PC9jbGFzc25hbWU+IG9uIHRoZSBidXMsIHdoaWNoCisgKiB3aWxsIGJlIHBvc3RlZCB3aGVuZXZlciBhbiBpbWFnZSB3b3VsZCB1c3VhbGx5IGJlIHJlbmRlcmVkLiBTZWUgYmVsb3cgZm9yCisgKiBtb3JlIGRldGFpbHMgb24gdGhlc2UgbWVzc2FnZXMgYW5kIGhvdyB0byBleHRyYWN0IHRoZSBwaXhidWYgb2JqZWN0CisgKiBjb250YWluZWQgaW4gdGhlbS4KKyAqIDwvbGlzdGl0ZW0+CisgKiA8bGlzdGl0ZW0+CisgKiBSZXRyaWV2aW5nIHRoZSBjdXJyZW50IHBpeGJ1ZiB2aWEgdGhlICNHc3RHZGtQaXhidWZTaW5rOmxhc3QtcGl4YnVmIHByb3BlcnR5CisgKiB3aGVuIG5lZWRlZC4gVGhpcyBpcyB0aGUgZWFzaWVzdCB3YXkgdG8gZ2V0IGF0IHBpeGJ1ZnMgZm9yIHNuYXBzaG90dGluZworICogcHVycG9zZXMgLSBqdXN0IHdhaXQgdW50aWwgdGhlIHBpcGVsaW5lIGlzIHByZXJvbGxlZCAoQVNZTkNfRE9ORSBtZXNzYWdlCisgKiBvbiB0aGUgYnVzKSwgdGhlbiByZWFkIHRoZSBwcm9wZXJ0eS4gSWYgeW91IHVzZSB0aGlzIG1ldGhvZCwgeW91IG1heSB3YW50CisgKiB0byBkaXNhYmxlIG1lc3NhZ2UgcG9zdGluZyBieSBzZXR0aW5nIHRoZSAjR3N0R2RrUGl4YnVmU2luazpwb3N0LW1lc3NhZ2VzCisgKiBwcm9wZXJ0eSB0byAlRkFMU0UuIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJ5IG1lbW9yeSBvdmVyaGVhZC4KKyAqIDwvbGlzdGl0ZW0+CisgKiA8L2l0ZW1pemVkbGlzdD4KKyAqCisgKiBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoaXMgZWxlbWVudCBpcyB0byBhYnN0cmFjdCBhd2F5IHRoZSAjR3N0QnVmZmVyIHRvCisgKiAjR2RrUGl4YnVmIGNvbnZlcnNpb24uIE90aGVyIHRoYW4gdGhhdCBpdCdzIHZlcnkgc2ltaWxhciB0byB0aGUgZmFrZXNpbmsKKyAqIGVsZW1lbnQuCisgKgorICogVGhpcyBlbGVtZW50IGlzIG1lYW50IGZvciBlYXN5IG5vLWhhc3NsZSB2aWRlbyBzbmFwc2hvdHRpbmcuIEl0IGlzIG5vdAorICogc3VpdGFibGUgZm9yIHZpZGVvIHBsYXliYWNrIG9yIHZpZGVvIGRpc3BsYXkgYXQgaGlnaCBmcmFtZXJhdGVzLiBVc2UKKyAqIHhpbWFnZXNpbmssIHh2aW1hZ2VzaW5rIG9yIHNvbWUgb3RoZXIgc3VpdGFibGUgdmlkZW8gc2luayBpbiBjb25uZWN0aW9uCisgKiB3aXRoIHRoZSAjR3N0WE92ZXJsYXkgaW50ZXJmYWNlIGluc3RlYWQgaWYgeW91IHdhbnQgdG8gZG8gdmlkZW8gcGxheWJhY2suCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPk1lc3NhZ2UgZGV0YWlsczwvdGl0bGU+CisgKiBBcyBtZW50aW9uZWQgYWJvdmUsIHRoaXMgZWxlbWVudCB3aWxsIGJ5IGRlZmF1bHQgcG9zdCBlbGVtZW50IG1lc3NhZ2VzCisgKiBjb250YWluaW5nIHN0cnVjdHVyZXMgbmFtZWQgPGNsYXNzbmFtZT4mcXVvdDtwcmVyb2xsLXBpeGJ1ZiZxdW90OworICogPC9jbGFzc25hbWU+IG9yIDxjbGFzc25hbWU+JnF1b3Q7cGl4YnVmJnF1b3Q7PC9jbGFzc25hbWU+IG9uIHRoZSBidXMgKHRoaXMKKyAqIGNhbiBiZSBkaXNhYmxlZCBieSBzZXR0aW5nIHRoZSAjR3N0R2RrUGl4YnVmU2luazpwb3N0LW1lc3NhZ2VzIHByb3BlcnR5CisgKiB0byAlRkFMU0UgdGhvdWdoKS4gVGhlIGVsZW1lbnQgbWVzc2FnZSBzdHJ1Y3R1cmUgaGFzIHRoZSBmb2xsb3dpbmcgZmllbGRzOgorICogPGl0ZW1pemVkbGlzdD4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPGNsYXNzbmFtZT4mcXVvdDtwaXhidWYmcXVvdDs8L2NsYXNzbmFtZT46IHRoZSAjR2RrUGl4YnVmIG9iamVjdAorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPGNsYXNzbmFtZT4mcXVvdDtwaXhlbC1hc3BlY3QtcmF0aW8mcXVvdDs8L2NsYXNzbmFtZT46IHRoZSBwaXhlbCBhc3BlY3QKKyAqICAgcmF0aW8gKFBBUikgb2YgdGhlIGlucHV0IGltYWdlICh0aGlzIGZpZWxkIGNvbnRhaW5zIGEgI0dzdEZyYWN0aW9uKTsgdGhlCisgKiAgIFBBUiBpcyB1c3VhbGx5IDE6MSBmb3IgaW1hZ2VzLCBidXQgaXMgb2Z0ZW4gc29tZXRoaW5nIG5vbi0xOjEgaW4gdGhlIGNhc2UKKyAqICAgb2YgdmlkZW8gaW5wdXQuIEluIHRoaXMgY2FzZSB0aGUgaW1hZ2UgbWF5IGJlIGRpc3RvcnRlZCBhbmQgeW91IG1heSBuZWVkCisgKiAgIHRvIHJlc2NhbGUgaXQgYWNjb3JkaW5nbHkgYmVmb3JlIHNhdmluZyBpdCB0byBmaWxlIG9yIGRpc3BsYXlpbmcgaXQuIFRoaXMKKyAqICAgY2FuIGVhc2lseSBiZSBkb25lIHVzaW5nIGdka19waXhidWZfc2NhbGUoKSAodGhlIHJlYXNvbiB0aGlzIGlzIG5vdCBkb25lCisgKiAgIGF1dG9tYXRpY2FsbHkgaXMgdGhhdCB0aGUgYXBwbGljYXRpb24gd2lsbCBvZnRlbiBzY2FsZSB0aGUgaW1hZ2UgYW55d2F5CisgKiAgIGFjY29yZGluZyB0byB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IHdpbmRvdywgaW4gd2hpY2ggY2FzZSBpdCBpcyBtdWNoIG1vcmUKKyAqICAgZWZmaWNpZW50IHRvIG9ubHkgc2NhbGUgb25jZSByYXRoZXIgdGhhbiB0d2ljZSkuIFlvdSBjYW4gcHV0IGEgdmlkZW9zY2FsZQorICogICBlbGVtZW50IGFuZCBhIGNhcHNmaWx0ZXIgZWxlbWVudCB3aXRoCisgKiAgIDxsaXRlcmFsPnZpZGVvL3gtcmF3LXJnYixwaXhlbC1hc3BlY3QtcmF0aW89KGZyYWN0aW9uKTEvMTwvbGl0ZXJhbD4gY2FwcworICogICBpbiBmcm9udCBvZiB0aGlzIGVsZW1lbnQgdG8gbWFrZSBzdXJlIHRoZSBwaXhidWZzIGFsd2F5cyBoYXZlIGEgMToxIFBBUi4KKyAqIDwvbGlzdGl0ZW0+CisgKiA8L2l0ZW1pemVkbGlzdD4KKyAqIDwvcmVmc2VjdDI+CisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC1tIC12IHZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0xICEgZ2RrcGl4YnVmc2luaworICogXXwgUHJvY2VzcyBvbmUgc2luZ2xlIHRlc3QgaW1hZ2UgYXMgcGl4YnVmIChub3RlIHRoYXQgdGhlIG91dHB1dCB5b3Ugc2VlIHdpbGwKKyAqIGJlIHNsaWdodGx5IG1pc2xlYWRpbmcuIFRoZSBtZXNzYWdlIHN0cnVjdHVyZSBkb2VzIGNvbnRhaW4gYSB2YWxpZCBwaXhidWYKKyAqIG9iamVjdCBldmVuIGlmIHRoZSBzdHJ1Y3R1cmUgc3RyaW5nIHNheXMgJmFwb3M7KE5VTEwpJmFwb3M7KS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0Z2RrcGl4YnVmc2luay5oIgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNkZWZpbmUgREVGQVVMVF9TRU5EX01FU1NBR0VTIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9QT1NUX01FU1NBR0VTIFRSVUUKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUE9TVF9NRVNTQUdFUywKKyAgUFJPUF9MQVNUX1BJWEJVRiwKKyAgUFJPUF9MQVNUCit9OworCisKK0dfREVGSU5FX1RZUEUgKEdzdEdka1BpeGJ1ZlNpbmssIGdzdF9nZGtfcGl4YnVmX3NpbmssIEdTVF9UWVBFX1ZJREVPX1NJTkspOworCitzdGF0aWMgdm9pZCBnc3RfZ2RrX3BpeGJ1Zl9zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9nZGtfcGl4YnVmX3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2dka19waXhidWZfc2lua19zdGFydCAoR3N0QmFzZVNpbmsgKiBiYXNlc2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2dka19waXhidWZfc2lua19zdG9wIChHc3RCYXNlU2luayAqIGJhc2VzaW5rKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZ2RrX3BpeGJ1Zl9zaW5rX3NldF9jYXBzIChHc3RCYXNlU2luayAqIGJhc2VzaW5rLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9nZGtfcGl4YnVmX3NpbmtfcmVuZGVyIChHc3RCYXNlU2luayAqIGJzaW5rLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZ2RrX3BpeGJ1Zl9zaW5rX3ByZXJvbGwgKEdzdEJhc2VTaW5rICogYnNpbmssCisgICAgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBHZGtQaXhidWYgKmdzdF9nZGtfcGl4YnVmX3NpbmtfZ2V0X3BpeGJ1Zl9mcm9tX2J1ZmZlciAoR3N0R2RrUGl4YnVmU2luayAqCisgICAgc2luaywgR3N0QnVmZmVyICogYnVmKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHBpeGJ1ZnNpbmtfc2lua19mYWN0b3J5ID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJSR0IiKSAiOyIKKyAgICAgICAgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIlJHQkEiKSkKKyAgICApOworCitzdGF0aWMgdm9pZAorZ3N0X2dka19waXhidWZfc2lua19jbGFzc19pbml0IChHc3RHZGtQaXhidWZTaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0QmFzZVNpbmtDbGFzcyAqYmFzZXNpbmtfY2xhc3MgPSBHU1RfQkFTRV9TSU5LX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIkdka1BpeGJ1ZiBzaW5rIiwKKyAgICAgICJTaW5rL1ZpZGVvIiwgIk91dHB1dCBpbWFnZXMgYXMgR2RrUGl4YnVmIG9iamVjdHMgaW4gYnVzIG1lc3NhZ2VzIiwKKyAgICAgICJUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJnBpeGJ1ZnNpbmtfc2lua19mYWN0b3J5KTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfZ2RrX3BpeGJ1Zl9zaW5rX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2dka19waXhidWZfc2lua19nZXRfcHJvcGVydHk7CisKKyAgLyoqCisgICAqIEdzdEdka1BpeGJ1Zjpwb3N0LW1lc3NhZ2VzOgorICAgKgorICAgKiBQb3N0IG1lc3NhZ2VzIG9uIHRoZSBidXMgY29udGFpbmluZyBwaXhidWZzLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QT1NUX01FU1NBR0VTLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJwb3N0LW1lc3NhZ2VzIiwgIlBvc3QgTWVzc2FnZXMiLAorICAgICAgICAgICJXaGV0aGVyIHRvIHBvc3QgbWVzc2FnZXMgY29udGFpbmluZyBwaXhidWZzIG9uIHRoZSBidXMiLAorICAgICAgICAgIERFRkFVTFRfUE9TVF9NRVNTQUdFUywgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MQVNUX1BJWEJVRiwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJsYXN0LXBpeGJ1ZiIsICJMYXN0IFBpeGJ1ZiIsCisgICAgICAgICAgIkxhc3QgR2RrUGl4YnVmIG9iamVjdCByZW5kZXJlZCIsIEdES19UWVBFX1BJWEJVRiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGJhc2VzaW5rX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZ2RrX3BpeGJ1Zl9zaW5rX3N0YXJ0KTsKKyAgYmFzZXNpbmtfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2dka19waXhidWZfc2lua19zdG9wKTsKKyAgYmFzZXNpbmtfY2xhc3MtPnJlbmRlciA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZ2RrX3BpeGJ1Zl9zaW5rX3JlbmRlcik7CisgIGJhc2VzaW5rX2NsYXNzLT5wcmVyb2xsID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nZGtfcGl4YnVmX3NpbmtfcHJlcm9sbCk7CisgIGJhc2VzaW5rX2NsYXNzLT5zZXRfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZ2RrX3BpeGJ1Zl9zaW5rX3NldF9jYXBzKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9nZGtfcGl4YnVmX3NpbmtfaW5pdCAoR3N0R2RrUGl4YnVmU2luayAqIHNpbmspCit7CisgIHNpbmstPnBhcl9uID0gMDsKKyAgc2luay0+cGFyX2QgPSAwOworICBzaW5rLT5oYXNfYWxwaGEgPSBGQUxTRTsKKyAgc2luay0+bGFzdF9waXhidWYgPSBOVUxMOworICBzaW5rLT5wb3N0X21lc3NhZ2VzID0gREVGQVVMVF9QT1NUX01FU1NBR0VTOworCisgIC8qIHdlJ3JlIG5vdCBhIHJlYWwgdmlkZW8gc2luaywgd2UganVzdCBkZXJpdmUgZnJvbSBHc3RWaWRlb1NpbmsgaW4gY2FzZQorICAgKiBhbnl0aGluZyBpbnRlcmVzdGluZyBpcyBhZGRlZCB0byBpdCBpbiBmdXR1cmUgKi8KKyAgZ3N0X2Jhc2Vfc2lua19zZXRfbWF4X2xhdGVuZXNzIChHU1RfQkFTRV9TSU5LIChzaW5rKSwgLTEpOworICBnc3RfYmFzZV9zaW5rX3NldF9xb3NfZW5hYmxlZCAoR1NUX0JBU0VfU0lOSyAoc2luayksIEZBTFNFKTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9nZGtfcGl4YnVmX3Npbmtfc3RhcnQgKEdzdEJhc2VTaW5rICogYmFzZXNpbmspCit7CisgIEdTVF9MT0dfT0JKRUNUIChiYXNlc2luaywgInN0YXJ0Iik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2dka19waXhidWZfc2lua19zdG9wIChHc3RCYXNlU2luayAqIGJhc2VzaW5rKQoreworICBHc3RHZGtQaXhidWZTaW5rICpzaW5rID0gR1NUX0dES19QSVhCVUZfU0lOSyAoYmFzZXNpbmspOworCisgIEdTVF9WSURFT19TSU5LX1dJRFRIIChzaW5rKSA9IDA7CisgIEdTVF9WSURFT19TSU5LX0hFSUdIVCAoc2luaykgPSAwOworCisgIHNpbmstPnBhcl9uID0gMDsKKyAgc2luay0+cGFyX2QgPSAwOworICBzaW5rLT5oYXNfYWxwaGEgPSBGQUxTRTsKKworICBpZiAoc2luay0+bGFzdF9waXhidWYpIHsKKyAgICBnX29iamVjdF91bnJlZiAoc2luay0+bGFzdF9waXhidWYpOworICAgIHNpbmstPmxhc3RfcGl4YnVmID0gTlVMTDsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChzaW5rLCAic3RvcCIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9nZGtfcGl4YnVmX3Npbmtfc2V0X2NhcHMgKEdzdEJhc2VTaW5rICogYmFzZXNpbmssIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RHZGtQaXhidWZTaW5rICpzaW5rID0gR1NUX0dES19QSVhCVUZfU0lOSyAoYmFzZXNpbmspOworICBHc3RWaWRlb0luZm8gaW5mbzsKKyAgR3N0VmlkZW9Gb3JtYXQgZm10OworICBnaW50IHcsIGgsIHBhcl9uLCBwYXJfZDsKKworICBHU1RfTE9HX09CSkVDVCAoc2luaywgImNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICBpZiAoIWdzdF92aWRlb19pbmZvX2Zyb21fY2FwcyAoJmluZm8sIGNhcHMpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzaW5rLCAicGFyc2VfY2FwcyBmYWlsZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBmbXQgPSBHU1RfVklERU9fSU5GT19GT1JNQVQgKCZpbmZvKTsKKyAgdyA9IEdTVF9WSURFT19JTkZPX1dJRFRIICgmaW5mbyk7CisgIGggPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZpbmZvKTsKKyAgcGFyX24gPSBHU1RfVklERU9fSU5GT19QQVJfTiAoJmluZm8pOworICBwYXJfZCA9IEdTVF9WSURFT19JTkZPX1BBUl9OICgmaW5mbyk7CisKKyNpZm5kZWYgR19ESVNBQkxFX0FTU0VSVAorICB7CisgICAgZ2ludCBzOworICAgIHMgPSBHU1RfVklERU9fSU5GT19DT01QX1BTVFJJREUgKCZpbmZvLCAwKTsKKyAgICBnX2Fzc2VydCAoKGZtdCA9PSBHU1RfVklERU9fRk9STUFUX1JHQiAmJiBzID09IDMpIHx8CisgICAgICAgIChmbXQgPT0gR1NUX1ZJREVPX0ZPUk1BVF9SR0JBICYmIHMgPT0gNCkpOworICB9CisjZW5kaWYKKworICBHU1RfVklERU9fU0lOS19XSURUSCAoc2luaykgPSB3OworICBHU1RfVklERU9fU0lOS19IRUlHSFQgKHNpbmspID0gaDsKKworICBzaW5rLT5wYXJfbiA9IHBhcl9uOworICBzaW5rLT5wYXJfZCA9IHBhcl9kOworCisgIHNpbmstPmhhc19hbHBoYSA9IEdTVF9WSURFT19JTkZPX0hBU19BTFBIQSAoJmluZm8pOworCisgIEdTVF9JTkZPX09CSkVDVCAoc2luaywgImZvcm1hdCAgICAgICAgICAgICA6ICVkIiwgZm10KTsKKyAgR1NUX0lORk9fT0JKRUNUIChzaW5rLCAid2lkdGggeCBoZWlnaHQgICAgIDogJWQgeCAlZCIsIHcsIGgpOworICBHU1RfSU5GT19PQkpFQ1QgKHNpbmssICJwaXhlbC1hc3BlY3QtcmF0aW8gOiAlZC8lZCIsIHBhcl9uLCBwYXJfZCk7CisKKyAgc2luay0+aW5mbyA9IGluZm87CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ2RrX3BpeGJ1Zl9zaW5rX3BpeGJ1Zl9kZXN0cm95X25vdGlmeSAoZ3VjaGFyICogcGl4ZWxzLAorICAgIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSkKK3sKKyAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwIChmcmFtZSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGZyYW1lLT5idWZmZXIpOworICBnX3NsaWNlX2ZyZWUgKEdzdFZpZGVvRnJhbWUsIGZyYW1lKTsKK30KKworc3RhdGljIEdka1BpeGJ1ZiAqCitnc3RfZ2RrX3BpeGJ1Zl9zaW5rX2dldF9waXhidWZfZnJvbV9idWZmZXIgKEdzdEdka1BpeGJ1ZlNpbmsgKiBzaW5rLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR2RrUGl4YnVmICpwaXggPSBOVUxMOworICBHc3RWaWRlb0ZyYW1lICpmcmFtZTsKKyAgZ2ludCBtaW5zaXplLCBieXRlc19wZXJfcGl4ZWw7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9WSURFT19TSU5LX1dJRFRIIChzaW5rKSA+IDAsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX1ZJREVPX1NJTktfSEVJR0hUIChzaW5rKSA+IDAsIE5VTEwpOworCisgIGZyYW1lID0gZ19zbGljZV9uZXcwIChHc3RWaWRlb0ZyYW1lKTsKKyAgZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoZnJhbWUsICZzaW5rLT5pbmZvLCBidWYsIEdTVF9NQVBfUkVBRCk7CisKKyAgYnl0ZXNfcGVyX3BpeGVsID0gKHNpbmstPmhhc19hbHBoYSkgPyA0IDogMzsKKworICAvKiBsYXN0IHJvdyBuZWVkbid0IGhhdmUgcm93IHBhZGRpbmcgKi8KKyAgbWluc2l6ZSA9IChHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKSAqCisgICAgICAoR1NUX1ZJREVPX1NJTktfSEVJR0hUIChzaW5rKSAtIDEpKSArCisgICAgICAoYnl0ZXNfcGVyX3BpeGVsICogR1NUX1ZJREVPX1NJTktfV0lEVEggKHNpbmspKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSA+PSBtaW5zaXplLCBOVUxMKTsKKworICBnc3RfYnVmZmVyX3JlZiAoYnVmKTsKKyAgcGl4ID0gZ2RrX3BpeGJ1Zl9uZXdfZnJvbV9kYXRhIChHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgMCksCisgICAgICBHREtfQ09MT1JTUEFDRV9SR0IsIHNpbmstPmhhc19hbHBoYSwgOCwgR1NUX1ZJREVPX1NJTktfV0lEVEggKHNpbmspLAorICAgICAgR1NUX1ZJREVPX1NJTktfSEVJR0hUIChzaW5rKSwgR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZSwgMCksCisgICAgICAoR2RrUGl4YnVmRGVzdHJveU5vdGlmeSkgZ3N0X2dka19waXhidWZfc2lua19waXhidWZfZGVzdHJveV9ub3RpZnksCisgICAgICBmcmFtZSk7CisKKyAgcmV0dXJuIHBpeDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9nZGtfcGl4YnVmX3NpbmtfaGFuZGxlX2J1ZmZlciAoR3N0QmFzZVNpbmsgKiBiYXNlc2luaywgR3N0QnVmZmVyICogYnVmLAorICAgIGNvbnN0IGdjaGFyICogbXNnX25hbWUpCit7CisgIEdzdEdka1BpeGJ1ZlNpbmsgKnNpbms7CisgIEdka1BpeGJ1ZiAqcGl4YnVmOworICBnYm9vbGVhbiBkb19wb3N0OworCisgIHNpbmsgPSBHU1RfR0RLX1BJWEJVRl9TSU5LIChiYXNlc2luayk7CisKKyAgcGl4YnVmID0gZ3N0X2dka19waXhidWZfc2lua19nZXRfcGl4YnVmX2Zyb21fYnVmZmVyIChzaW5rLCBidWYpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoc2luayk7CisKKyAgZG9fcG9zdCA9IHNpbmstPnBvc3RfbWVzc2FnZXM7CisKKyAgaWYgKHNpbmstPmxhc3RfcGl4YnVmKQorICAgIGdfb2JqZWN0X3VucmVmIChzaW5rLT5sYXN0X3BpeGJ1Zik7CisKKyAgc2luay0+bGFzdF9waXhidWYgPSBwaXhidWY7ICAgLyogdGFrZSBvd25lcnNoaXAgKi8KKworICBHU1RfT0JKRUNUX1VOTE9DSyAoc2luayk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHBpeGJ1ZiA9PSBOVUxMKSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmIChkb19wb3N0KSB7CisgICAgR3N0U3RydWN0dXJlICpzOworICAgIEdzdE1lc3NhZ2UgKm1zZzsKKyAgICBHc3RGb3JtYXQgZm9ybWF0OworICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisgICAgR3N0Q2xvY2tUaW1lIHJ1bm5pbmdfdGltZSwgc3RyZWFtX3RpbWU7CisKKyAgICBHc3RTZWdtZW50ICpzZWdtZW50ID0gJmJhc2VzaW5rLT5zZWdtZW50OworICAgIGZvcm1hdCA9IHNlZ21lbnQtPmZvcm1hdDsKKworICAgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWYpOworICAgIHJ1bm5pbmdfdGltZSA9IGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoc2VnbWVudCwgZm9ybWF0LCB0aW1lc3RhbXApOworICAgIHN0cmVhbV90aW1lID0gZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKHNlZ21lbnQsIGZvcm1hdCwgdGltZXN0YW1wKTsKKworICAgIC8qIGl0J3Mgb2theSB0byBrZWVwIHVzaW5nIHBpeGJ1ZiBoZXJlLCB3ZSBjYW4gYmUgc3VyZSBubyBvbmUgaXMgZ29pbmcgdG8KKyAgICAgKiB1bnJlZiBvciBjaGFuZ2Ugc2luay0+bGFzdF9waXhidWYgYmVmb3JlIHdlIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24uCisgICAgICogVGhlIHN0cnVjdHVyZSB3aWxsIHRha2UgaXRzIG93biByZWYgdG8gdGhlIHBpeGJ1Zi4gKi8KKyAgICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKG1zZ19uYW1lLAorICAgICAgICAicGl4YnVmIiwgR0RLX1RZUEVfUElYQlVGLCBwaXhidWYsCisgICAgICAgICJwaXhlbC1hc3BlY3QtcmF0aW8iLCBHU1RfVFlQRV9GUkFDVElPTiwgc2luay0+cGFyX24sIHNpbmstPnBhcl9kLAorICAgICAgICAidGltZXN0YW1wIiwgR19UWVBFX1VJTlQ2NCwgdGltZXN0YW1wLAorICAgICAgICAic3RyZWFtLXRpbWUiLCBHX1RZUEVfVUlOVDY0LCBzdHJlYW1fdGltZSwKKyAgICAgICAgInJ1bm5pbmctdGltZSIsIEdfVFlQRV9VSU5UNjQsIHJ1bm5pbmdfdGltZSwgTlVMTCk7CisKKyAgICBtc2cgPSBnc3RfbWVzc2FnZV9uZXdfZWxlbWVudCAoR1NUX09CSkVDVF9DQVNUIChzaW5rKSwgcyk7CisgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChzaW5rKSwgbXNnKTsKKyAgfQorCisgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKHNpbmspLCAibGFzdC1waXhidWYiKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKy8qIEVSUk9SUyAqLworZXJyb3I6CisgIHsKKyAgICAvKiBUaGlzIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuICovCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNpbmssIExJQlJBUlksIEZBSUxFRCwKKyAgICAgICAgKCJDb3VsZG4ndCBjcmVhdGUgcGl4YnVmIGZyb20gUkdCIGltYWdlLiIpLAorICAgICAgICAoIlByb2JhYmx5IG5vdCBlbm91Z2ggZnJlZSBtZW1vcnkiKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZ2RrX3BpeGJ1Zl9zaW5rX3ByZXJvbGwgKEdzdEJhc2VTaW5rICogYmFzZXNpbmssIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgcmV0dXJuIGdzdF9nZGtfcGl4YnVmX3NpbmtfaGFuZGxlX2J1ZmZlciAoYmFzZXNpbmssIGJ1ZiwgInByZXJvbGwtcGl4YnVmIik7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZ2RrX3BpeGJ1Zl9zaW5rX3JlbmRlciAoR3N0QmFzZVNpbmsgKiBiYXNlc2luaywgR3N0QnVmZmVyICogYnVmKQoreworICByZXR1cm4gZ3N0X2dka19waXhidWZfc2lua19oYW5kbGVfYnVmZmVyIChiYXNlc2luaywgYnVmLCAicGl4YnVmIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ2RrX3BpeGJ1Zl9zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RHZGtQaXhidWZTaW5rICpzaW5rOworCisgIHNpbmsgPSBHU1RfR0RLX1BJWEJVRl9TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QT1NUX01FU1NBR0VTOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzaW5rKTsKKyAgICAgIHNpbmstPnBvc3RfbWVzc2FnZXMgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc2luayk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ2RrX3BpeGJ1Zl9zaW5rX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RHZGtQaXhidWZTaW5rICpzaW5rOworCisgIHNpbmsgPSBHU1RfR0RLX1BJWEJVRl9TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QT1NUX01FU1NBR0VTOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzaW5rKTsKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzaW5rLT5wb3N0X21lc3NhZ2VzKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzaW5rKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9MQVNUX1BJWEJVRjoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc2luayk7CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzaW5rLT5sYXN0X3BpeGJ1Zik7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc2luayk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmggYi9leHQvZ2RrX3BpeGJ1Zi9nc3RnZGtwaXhidWZzaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0NDM3YQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9nZGtfcGl4YnVmL2dzdGdka3BpeGJ1ZnNpbmsuaApAQCAtMCwwICsxLDc1IEBACisvKiBHU3RyZWFtZXIgR2RrUGl4YnVmIHNpbmsKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBHU1RfR0RLX1BJWEJVRl9TSU5LX0gKKyNkZWZpbmUgR1NUX0dES19QSVhCVUZfU0lOS19ICisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvc2luay5oPgorCisjaW5jbHVkZSA8Z2RrLXBpeGJ1Zi9nZGstcGl4YnVmLmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfR0RLX1BJWEJVRl9TSU5LICAgICAgICAgICAgKGdzdF9nZGtfcGl4YnVmX3NpbmtfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0dES19QSVhCVUZfU0lOSyhvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0dES19QSVhCVUZfU0lOSyxHc3RHZGtQaXhidWZTaW5rKSkKKyNkZWZpbmUgR1NUX0dES19QSVhCVUZfU0lOS19DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfR0RLX1BJWEJVRl9TSU5LLEdzdEdka1BpeGJ1ZlNpbmtDbGFzcykpCisjZGVmaW5lIEdTVF9JU19HREtfUElYQlVGX1NJTksob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9HREtfUElYQlVGX1NJTkspKQorI2RlZmluZSBHU1RfSVNfR0RLX1BJWEJVRl9TSU5LX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9HREtfUElYQlVGX1NJTkspKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0R2RrUGl4YnVmU2luayAgICAgICBHc3RHZGtQaXhidWZTaW5rOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEdka1BpeGJ1ZlNpbmtDbGFzcyAgR3N0R2RrUGl4YnVmU2lua0NsYXNzOworCisvKioKKyAqIEdzdEdka1BpeGJ1ZlNpbms6CisgKgorICogT3BhcXVlIGVsZW1lbnQgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdEdka1BpeGJ1ZlNpbmsKK3sKKyAgR3N0VmlkZW9TaW5rICBiYXNlc2luazsKKworICAvKjwgcHJpdmF0ZSA+Ki8KKworICAvKiBjdXJyZW50IGNhcHMgKi8KKyAgR3N0VmlkZW9JbmZvIGluZm87CisgIGdpbnQgICAgICAgICB3aWR0aDsKKyAgZ2ludCAgICAgICAgIGhlaWdodDsKKyAgZ2ludCAgICAgICAgIHBhcl9uOworICBnaW50ICAgICAgICAgcGFyX2Q7CisgIGdib29sZWFuICAgICBoYXNfYWxwaGE7CisKKyAgLyogcHJvcGVydGllcyAqLworICBnYm9vbGVhbiAgICAgcG9zdF9tZXNzYWdlczsKKyAgR2RrUGl4YnVmICAqIGxhc3RfcGl4YnVmOworfTsKKworLyoqCisgKiBHc3RHZGtQaXhidWZTaW5rQ2xhc3M6CisgKgorICogT3BhcXVlIGVsZW1lbnQgY2xhc3Mgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdEdka1BpeGJ1ZlNpbmtDbGFzcyAKK3sKKyAgR3N0VmlkZW9TaW5rQ2xhc3MgIGJhc2VzaW5rY2xhc3M7Cit9OworCitHVHlwZSAgIGdzdF9nZGtfcGl4YnVmX3NpbmtfZ2V0X3R5cGUgKHZvaWQpOworCisjZW5kaWYgLyogR1NUX0dES19QSVhCVUZfU0lOS19IICovCisKZGlmZiAtLWdpdCBhL2V4dC9nZGtfcGl4YnVmL21lc29uLmJ1aWxkIGIvZXh0L2dka19waXhidWYvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3OWE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9nZGtfcGl4YnVmL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMjAgQEAKK3BpeGJ1Zl9zb3VyY2VzID0gWworICAnZ3N0Z2RrcGl4YnVmZGVjLmMnLAorICAnZ3N0Z2RrcGl4YnVmb3ZlcmxheS5jJywKKyAgJ2dzdGdka3BpeGJ1ZnBsdWdpbi5jJywKKyAgJ2dzdGdka3BpeGJ1ZnNpbmsuYycsCitdCisKK2dka3BpeGJ1Zl9kZXAgPSBkZXBlbmRlbmN5KCdnZGstcGl4YnVmLTIuMCcsIHZlcnNpb24gOiAnPj0yLjguMCcsIHJlcXVpcmVkIDogZmFsc2UpCisKK2lmIGdka3BpeGJ1Zl9kZXAuZm91bmQoKQorICBnc3RnZGtwaXhidWYgPSBsaWJyYXJ5KCdnc3RnZGtwaXhidWYnLAorICAgIHBpeGJ1Zl9zb3VyY2VzLAorICAgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgICBsaW5rX2FyZ3MgOiBub3NlaF9saW5rX2FyZ3MsCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICAgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0dmlkZW9fZGVwLCBnc3Rjb250cm9sbGVyX2RlcCwgZ2RrcGl4YnVmX2RlcF0sCisgICAgaW5zdGFsbCA6IHRydWUsCisgICAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorICApCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L2phY2svLmdpdGlnbm9yZSBiL2V4dC9qYWNrLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2ZjI2NQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorKi5sb1QKZGlmZiAtLWdpdCBhL2V4dC9qYWNrL01ha2VmaWxlLmFtIGIvZXh0L2phY2svTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlZjI3YQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOSBAQAorCitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RqYWNrLmxhCisKK2xpYmdzdGphY2tfbGFfU09VUkNFUyA9IGdzdGphY2t1dGlsLmMgZ3N0amFjay5jIGdzdGphY2thdWRpb3NyYy5jIGdzdGphY2thdWRpb3NpbmsuYyBnc3RqYWNrYXVkaW9jbGllbnQuYworbGliZ3N0amFja19sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoSkFDS19DRkxBR1MpCitsaWJnc3RqYWNrX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEpBQ0tfTElCUykKK2xpYmdzdGphY2tfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdGphY2t1dGlsLmggZ3N0amFja2F1ZGlvc3JjLmggZ3N0amFja2F1ZGlvc2luay5oIGdzdGphY2thdWRpb2NsaWVudC5oIGdzdGphY2suaCBnc3RqYWNrcmluZ2J1ZmZlci5oCmRpZmYgLS1naXQgYS9leHQvamFjay9nc3RqYWNrLmMgYi9leHQvamFjay9nc3RqYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5OGRjNAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrL2dzdGphY2suYwpAQCAtMCwwICsxLDExNyBAQAorLyogR1N0cmVhbWVyIEphY2sgcGx1Z2lucworICogQ29weXJpZ2h0IChDKSAyMDA2IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0amFjay5oIgorI2luY2x1ZGUgImdzdGphY2thdWRpb3NyYy5oIgorI2luY2x1ZGUgImdzdGphY2thdWRpb3NpbmsuaCIKKworR1R5cGUKK2dzdF9qYWNrX2Nvbm5lY3RfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyB2b2xhdGlsZSBnc2l6ZSBqYWNrX2Nvbm5lY3RfdHlwZSA9IDA7CisKKyAgaWYgKGdfb25jZV9pbml0X2VudGVyICgmamFja19jb25uZWN0X3R5cGUpKSB7CisgICAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgamFja19jb25uZWN0X2VudW1zW10gPSB7CisgICAgICB7R1NUX0pBQ0tfQ09OTkVDVF9OT05FLAorICAgICAgICAgICJEb24ndCBhdXRvbWF0aWNhbGx5IGNvbm5lY3QgcG9ydHMgdG8gcGh5c2ljYWwgcG9ydHMiLCAibm9uZSJ9LAorICAgICAge0dTVF9KQUNLX0NPTk5FQ1RfQVVUTywKKyAgICAgICAgICAiQXV0b21hdGljYWxseSBjb25uZWN0IHBvcnRzIHRvIHBoeXNpY2FsIHBvcnRzIiwgImF1dG8ifSwKKyAgICAgIHtHU1RfSkFDS19DT05ORUNUX0FVVE9fRk9SQ0VELAorICAgICAgICAgICAgIkF1dG9tYXRpY2FsbHkgY29ubmVjdCBwb3J0cyB0byBhcyBtYW55IHBoeXNpY2FsIHBvcnRzIGFzIHBvc3NpYmxlIiwKKyAgICAgICAgICAiYXV0by1mb3JjZWQifSwKKyAgICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgICB9OworICAgIEdUeXBlIHRtcCA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RKYWNrQ29ubmVjdCIsIGphY2tfY29ubmVjdF9lbnVtcyk7CisgICAgZ19vbmNlX2luaXRfbGVhdmUgKCZqYWNrX2Nvbm5lY3RfdHlwZSwgdG1wKTsKKyAgfQorICByZXR1cm4gKEdUeXBlKSBqYWNrX2Nvbm5lY3RfdHlwZTsKK30KKworR1R5cGUKK2dzdF9qYWNrX3RyYW5zcG9ydF9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIHZvbGF0aWxlIGdzaXplIHR5cGUgPSAwOworCisgIGlmIChnX29uY2VfaW5pdF9lbnRlciAoJnR5cGUpKSB7CisgICAgc3RhdGljIGNvbnN0IEdGbGFnc1ZhbHVlIGZsYWdfdmFsdWVzW10gPSB7CisgICAgICB7R1NUX0pBQ0tfVFJBTlNQT1JUX01BU1RFUiwKKyAgICAgICAgICAiU3RhcnQgYW5kIHN0b3AgdHJhbnNwb3J0IHdpdGggc3RhdGUgY2hhbmdlcyIsICJtYXN0ZXIifSwKKyAgICAgIHtHU1RfSkFDS19UUkFOU1BPUlRfU0xBVkUsCisgICAgICAgICAgIkZvbGxvdyB0cmFuc3BvcnQgc3RhdGUgY2hhbmdlcyIsICJzbGF2ZSJ9LAorICAgICAgezAsIE5VTEwsIE5VTEx9LAorICAgIH07CisgICAgR1R5cGUgdG1wID0gZ19mbGFnc19yZWdpc3Rlcl9zdGF0aWMgKCJHc3RKYWNrVHJhbnNwb3J0IiwgZmxhZ192YWx1ZXMpOworICAgIGdfb25jZV9pbml0X2xlYXZlICgmdHlwZSwgdG1wKTsKKyAgfQorICByZXR1cm4gKEdUeXBlKSB0eXBlOworfQorCisKK3N0YXRpYyBncG9pbnRlcgorZ3N0X2phY2tfY2xpZW50X2NvcHkgKGdwb2ludGVyIGpjbGllbnQpCit7CisgIHJldHVybiBqY2xpZW50OworfQorCisKK3N0YXRpYyB2b2lkCitnc3RfamFja19jbGllbnRfZnJlZSAoZ3BvaW50ZXIgamNsaWVudCkKK3sKKyAgcmV0dXJuOworfQorCisKK0dUeXBlCitnc3RfamFja19jbGllbnRfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyB2b2xhdGlsZSBnc2l6ZSBqYWNrX2NsaWVudF90eXBlID0gMDsKKworICBpZiAoZ19vbmNlX2luaXRfZW50ZXIgKCZqYWNrX2NsaWVudF90eXBlKSkgeworICAgIC8qIGhhY2tpc2gsIGJ1dCBtYWtlcyBpdCBzaG93IHVwIG5pY2VseSBpbiBnc3QtaW5zcGVjdCAqLworICAgIEdUeXBlIHRtcCA9IGdfYm94ZWRfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKCJKYWNrQ2xpZW50IiwKKyAgICAgICAgKEdCb3hlZENvcHlGdW5jKSBnc3RfamFja19jbGllbnRfY29weSwKKyAgICAgICAgKEdCb3hlZEZyZWVGdW5jKSBnc3RfamFja19jbGllbnRfZnJlZSk7CisgICAgZ19vbmNlX2luaXRfbGVhdmUgKCZqYWNrX2NsaWVudF90eXBlLCB0bXApOworICB9CisKKyAgcmV0dXJuIChHVHlwZSkgamFja19jbGllbnRfdHlwZTsKK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJqYWNrYXVkaW9zcmMiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX0pBQ0tfQVVESU9fU1JDKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImphY2thdWRpb3NpbmsiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX0pBQ0tfQVVESU9fU0lOSykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgamFjaywKKyAgICAiSkFDSyBhdWRpbyBlbGVtZW50cyIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9leHQvamFjay9nc3RqYWNrLmggYi9leHQvamFjay9nc3RqYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViMDQwZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrL2dzdGphY2suaApAQCAtMCwwICsxLDc5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIGdzdGphY2suaDoKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9HU1RfSkFDS19IXworI2RlZmluZSBfR1NUX0pBQ0tfSF8KKworI2luY2x1ZGUgPGphY2svamFjay5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisvKioKKyAqIEdzdEphY2tDb25uZWN0OgorICogQEdTVF9KQUNLX0NPTk5FQ1RfTk9ORTogRG9uJ3QgYXV0b21hdGljYWxseSBjb25uZWN0IHRvIHBoeXNpY2FsIHBvcnRzLgorICogICAgIEluIHRoaXMgbW9kZSwgdGhlIGVsZW1lbnQgd2lsbCBhY2NlcHQgYW55IG51bWJlciBvZiBpbnB1dCBjaGFubmVscyBhbmQgd2lsbAorICogICAgIGNyZWF0ZSAoYnV0IG5vdCBjb25uZWN0KSBhbiBvdXRwdXQgcG9ydCBmb3IgZWFjaCBjaGFubmVsLgorICogQEdTVF9KQUNLX0NPTk5FQ1RfQVVUTzogSW4gdGhpcyBtb2RlLCB0aGUgZWxlbWVudCB3aWxsIHRyeSB0byBjb25uZWN0IGVhY2gKKyAqICAgICBvdXRwdXQgcG9ydCB0byBhIHJhbmRvbSBwaHlzaWNhbCBqYWNrIGlucHV0IHBpbi4gVGhlIHNpbmsgd2lsbAorICogICAgIGV4cG9zZSB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGNoYW5uZWxzIG9uIGl0cyBwYWQgY2Fwcy4KKyAqIEBHU1RfSkFDS19DT05ORUNUX0FVVE9fRk9SQ0VEOiBJbiB0aGlzIG1vZGUsIHRoZSBlbGVtZW50IHdpbGwgdHJ5IHRvIGNvbm5lY3QgZWFjaAorICogICAgIG91dHB1dCBwb3J0IHRvIGEgcmFuZG9tIHBoeXNpY2FsIGphY2sgaW5wdXQgcGluLiBUaGUgIGVsZW1lbnQgd2lsbCBhY2NlcHQgYW55IG51bWJlcgorICogICAgIG9mIGlucHV0IGNoYW5uZWxzLgorICoKKyAqIFNwZWNpZnkgaG93IHRoZSBvdXRwdXQgcG9ydHMgd2lsbCBiZSBjb25uZWN0ZWQuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEdTVF9KQUNLX0NPTk5FQ1RfTk9ORSwKKyAgR1NUX0pBQ0tfQ09OTkVDVF9BVVRPLAorICBHU1RfSkFDS19DT05ORUNUX0FVVE9fRk9SQ0VECit9IEdzdEphY2tDb25uZWN0OworCisvKioKKyAqIEdzdEphY2tUcmFuc3BvcnQ6CisgKiBAR1NUX0pBQ0tfVFJBTlNQT1JUX0FVVE9OT01PVVM6IG5vIHRyYW5zcG9ydCBzdXBwb3J0CisgKiBAR1NUX0pBQ0tfVFJBTlNQT1JUX01BU1RFUjogc3RhcnQgYW5kIHN0b3AgdHJhbnNwb3J0IHdpdGggc3RhdGUtY2hhbmdlcworICogQEdTVF9KQUNLX1RSQU5TUE9SVF9TTEFWRTogZm9sbG93IHRyYW5zcG9ydCBzdGF0ZSBjaGFuZ2VzCisgKgorICogVGhlIGphY2sgdHJhbnNwb3J0IHN0YXRlIGFsbG93IHRvIHN5bmMgbXVsdGlwbGUgY2xpZW50cy4gVGhpcyBlbnVtIGRlZmluZXMgYQorICogY2xpZW50IGJlaGF2aW91ciByZWdhcmRpbmcgdG8gdGhlIHRyYW5zcG9ydCBtZWNoYW5pc20uCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEdTVF9KQUNLX1RSQU5TUE9SVF9BVVRPTk9NT1VTID0gMCwKKyAgR1NUX0pBQ0tfVFJBTlNQT1JUX01BU1RFUiA9ICgxIDw8IDApLAorICBHU1RfSkFDS19UUkFOU1BPUlRfU0xBVkUgPSAoMSA8PCAxKSwKK30gR3N0SmFja1RyYW5zcG9ydDsKKwordHlwZWRlZiBqYWNrX2RlZmF1bHRfYXVkaW9fc2FtcGxlX3Qgc2FtcGxlX3Q7CisKKyNkZWZpbmUgR1NUX1RZUEVfSkFDS19DT05ORUNUICAgKGdzdF9qYWNrX2Nvbm5lY3RfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9UWVBFX0pBQ0tfVFJBTlNQT1JUIChnc3RfamFja190cmFuc3BvcnRfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9UWVBFX0pBQ0tfQ0xJRU5UICAgIChnc3RfamFja19jbGllbnRfZ2V0X3R5cGUgKCkpCisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIEdTVF9KQUNLX0ZPUk1BVF9TVFIgIkYzMkxFIgorI2Vsc2UKKyNkZWZpbmUgR1NUX0pBQ0tfRk9STUFUX1NUUiAiRjMyQkUiCisjZW5kaWYKKworR1R5cGUgZ3N0X2phY2tfY2xpZW50X2dldF90eXBlKHZvaWQpOworR1R5cGUgZ3N0X2phY2tfY29ubmVjdF9nZXRfdHlwZSh2b2lkKTsKK0dUeXBlIGdzdF9qYWNrX3RyYW5zcG9ydF9nZXRfdHlwZSh2b2lkKTsKKworI2VuZGlmICAvLyBfR1NUX0pBQ0tfSF8KZGlmZiAtLWdpdCBhL2V4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jIGIvZXh0L2phY2svZ3N0amFja2F1ZGlvY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwMjJjMAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5jCkBAIC0wLDAgKzEsNjM3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIGdzdGphY2thdWRpb2NsaWVudC5jOiBqYWNrIGF1ZGlvIGNsaWVudCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdGphY2thdWRpb2NsaWVudC5oIgorI2luY2x1ZGUgImdzdGphY2suaCIKKworI2luY2x1ZGUgPGdzdC9nbGliLWNvbXBhdC1wcml2YXRlLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfamFja19hdWRpb19jbGllbnRfZGVidWcKKworc3RhdGljIHZvaWQKK2phY2tfbG9nX2Vycm9yIChjb25zdCBnY2hhciAqIG1zZykKK3sKKyAgR1NUX0VSUk9SICgiJXMiLCBtc2cpOworfQorCitzdGF0aWMgdm9pZAoramFja19pbmZvX2Vycm9yIChjb25zdCBnY2hhciAqIG1zZykKK3sKKyAgR1NUX0lORk8gKCIlcyIsIG1zZyk7Cit9CisKK3ZvaWQKK2dzdF9qYWNrX2F1ZGlvX2NsaWVudF9pbml0ICh2b2lkKQoreworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X2phY2tfYXVkaW9fY2xpZW50X2RlYnVnLCAiamFja2NsaWVudCIsIDAsCisgICAgICAiamFja2NsaWVudCBoZWxwZXJzIik7CisKKyAgamFja19zZXRfZXJyb3JfZnVuY3Rpb24gKGphY2tfbG9nX2Vycm9yKTsKKyAgamFja19zZXRfaW5mb19mdW5jdGlvbiAoamFja19pbmZvX2Vycm9yKTsKK30KKworLyogYSBsaXN0IG9mIGdsb2JhbCBjb25uZWN0aW9ucyBpbmRleGVkIGJ5IGlkIGFuZCBzZXJ2ZXIuICovCitHX0xPQ0tfREVGSU5FX1NUQVRJQyAoY29ubmVjdGlvbnNfbG9jayk7CitzdGF0aWMgR0xpc3QgKmNvbm5lY3Rpb25zOworCisvKiB0aGUgY29ubmVjdGlvbiB0byBhIHNlcnZlciAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGdpbnQgcmVmY291bnQ7CisgIEdNdXRleCBsb2NrOworICBHQ29uZCBmbHVzaF9jb25kOworCisgIC8qIGlkL3NlcnZlciBwYWlyIGFuZCB0aGUgY29ubmVjdGlvbiAqLworICBnY2hhciAqaWQ7CisgIGdjaGFyICpzZXJ2ZXI7CisgIGphY2tfY2xpZW50X3QgKmNsaWVudDsKKworICAvKiBsaXN0cyBvZiBHc3RKYWNrQXVkaW9DbGllbnRzICovCisgIGdpbnQgbl9jbGllbnRzOworICBHTGlzdCAqc3JjX2NsaWVudHM7CisgIEdMaXN0ICpzaW5rX2NsaWVudHM7CisKKyAgLyogdHJhbnNwb3J0IHN0YXRlIGhhbmRsaW5nICovCisgIGdpbnQgY3VyX3RzOworICBHc3RTdGF0ZSB0cmFuc3BvcnRfc3RhdGU7Cit9IEdzdEphY2tBdWRpb0Nvbm5lY3Rpb247CisKKy8qIGFuIG9iamVjdCBzaGFyaW5nIGEgamFja19jbGllbnRfdCBjb25uZWN0aW9uLiAqLworc3RydWN0IF9Hc3RKYWNrQXVkaW9DbGllbnQKK3sKKyAgR3N0SmFja0F1ZGlvQ29ubmVjdGlvbiAqY29ubjsKKworICBHc3RKYWNrQ2xpZW50VHlwZSB0eXBlOworICBnYm9vbGVhbiBhY3RpdmU7CisgIGdib29sZWFuIGRlYWN0aXZhdGU7CisgIGdib29sZWFuIHNlcnZlcl9kb3duOworCisgIEphY2tTaHV0ZG93bkNhbGxiYWNrIHNodXRkb3duOworICBKYWNrUHJvY2Vzc0NhbGxiYWNrIHByb2Nlc3M7CisgIEphY2tCdWZmZXJTaXplQ2FsbGJhY2sgYnVmZmVyX3NpemU7CisgIEphY2tTYW1wbGVSYXRlQ2FsbGJhY2sgc2FtcGxlX3JhdGU7CisgIGdwb2ludGVyIHVzZXJfZGF0YTsKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGphY2tfbmZyYW1lc190IG5mcmFtZXM7CisgIGdwb2ludGVyIHVzZXJfZGF0YTsKK30gSmFja0NCOworCitzdGF0aWMgZ2Jvb2xlYW4KK2phY2tfaGFuZGxlX3RyYW5zcG9ydF9jaGFuZ2UgKEdzdEphY2tBdWRpb0NsaWVudCAqIGNsaWVudCwgR3N0U3RhdGUgc3RhdGUpCit7CisgIEdzdE9iamVjdCAqb2JqID0gR1NUX09CSkVDVF9QQVJFTlQgKGNsaWVudC0+dXNlcl9kYXRhKTsKKyAgZ3VpbnQgbW9kZTsKKworICBnX29iamVjdF9nZXQgKG9iaiwgInRyYW5zcG9ydCIsICZtb2RlLCBOVUxMKTsKKyAgaWYgKChtb2RlICYgR1NUX0pBQ0tfVFJBTlNQT1JUX1NMQVZFKSAmJiAoR1NUX1NUQVRFIChvYmopICE9IHN0YXRlKSkgeworICAgIEdTVF9JTkZPX09CSkVDVCAob2JqLCAicmVxdWVzdGluZyBzdGF0ZSBjaGFuZ2U6ICVzIiwKKyAgICAgICAgZ3N0X2VsZW1lbnRfc3RhdGVfZ2V0X25hbWUgKHN0YXRlKSk7CisgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVCAob2JqKSwKKyAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X3JlcXVlc3Rfc3RhdGUgKG9iaiwgc3RhdGUpKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQKK2phY2tfcHJvY2Vzc19jYiAoamFja19uZnJhbWVzX3QgbmZyYW1lcywgdm9pZCAqYXJnKQoreworICBHc3RKYWNrQXVkaW9Db25uZWN0aW9uICpjb25uID0gKEdzdEphY2tBdWRpb0Nvbm5lY3Rpb24gKikgYXJnOworICBHTGlzdCAqd2FsazsKKyAgaW50IHJlcyA9IDA7CisgIGphY2tfdHJhbnNwb3J0X3N0YXRlX3QgdHMgPSBqYWNrX3RyYW5zcG9ydF9xdWVyeSAoY29ubi0+Y2xpZW50LCBOVUxMKTsKKworICBpZiAodHMgIT0gY29ubi0+Y3VyX3RzKSB7CisgICAgY29ubi0+Y3VyX3RzID0gdHM7CisgICAgc3dpdGNoICh0cykgeworICAgICAgY2FzZSBKYWNrVHJhbnNwb3J0U3RvcHBlZDoKKyAgICAgICAgR1NUX0RFQlVHICgidHJhbnNwb3J0IHN0YXRlIGlzICdzdG9wcGVkJyIpOworICAgICAgICBjb25uLT50cmFuc3BvcnRfc3RhdGUgPSBHU1RfU1RBVEVfUEFVU0VEOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSmFja1RyYW5zcG9ydFN0YXJ0aW5nOgorICAgICAgICBHU1RfREVCVUcgKCJ0cmFuc3BvcnQgc3RhdGUgaXMgJ3N0YXJ0aW5nJyIpOworICAgICAgICBjb25uLT50cmFuc3BvcnRfc3RhdGUgPSBHU1RfU1RBVEVfUkVBRFk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKYWNrVHJhbnNwb3J0Um9sbGluZzoKKyAgICAgICAgR1NUX0RFQlVHICgidHJhbnNwb3J0IHN0YXRlIGlzICdyb2xsaW5nJyIpOworICAgICAgICBjb25uLT50cmFuc3BvcnRfc3RhdGUgPSBHU1RfU1RBVEVfUExBWUlORzsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgR1NUX0RFQlVHICgibnVtIG9mIGNsaWVudHM6IHNyYz0lZCwgc2luaz0lZCIsCisgICAgICAgIGdfbGlzdF9sZW5ndGggKGNvbm4tPnNyY19jbGllbnRzKSwgZ19saXN0X2xlbmd0aCAoY29ubi0+c2lua19jbGllbnRzKSk7CisgIH0KKworICBnX211dGV4X2xvY2sgKCZjb25uLT5sb2NrKTsKKyAgLyogY2FsbCBzb3VyY2VzIGZpcnN0LCB0aGVuIHNpbmtzLiBTb3VyY2VzIHdpbGwgZWl0aGVyIHB1c2ggZGF0YSBpbnRvIHRoZQorICAgKiByaW5nYnVmZmVyIG9mIHRoZSBzaW5rcywgd2hpY2ggd2lsbCB0aGVuIHB1bGwgdGhlIGRhdGEgb3V0IG9mIGl0LCBvcgorICAgKiBzaW5rcyB3aWxsIHB1bGwgdGhlIGRhdGEgZnJvbSB0aGUgc291cmNlcy4gKi8KKyAgZm9yICh3YWxrID0gY29ubi0+c3JjX2NsaWVudHM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RKYWNrQXVkaW9DbGllbnQgKmNsaWVudCA9IChHc3RKYWNrQXVkaW9DbGllbnQgKikgd2Fsay0+ZGF0YTsKKworICAgIC8qIG9ubHkgY2FsbCBhY3RpdmUgY2xpZW50cyAqLworICAgIGlmICgoY2xpZW50LT5hY3RpdmUgfHwgY2xpZW50LT5kZWFjdGl2YXRlKSAmJiBjbGllbnQtPnByb2Nlc3MpIHsKKyAgICAgIHJlcyA9IGNsaWVudC0+cHJvY2VzcyAobmZyYW1lcywgY2xpZW50LT51c2VyX2RhdGEpOworICAgICAgaWYgKGNsaWVudC0+ZGVhY3RpdmF0ZSkgeworICAgICAgICBjbGllbnQtPmRlYWN0aXZhdGUgPSBGQUxTRTsKKyAgICAgICAgZ19jb25kX3NpZ25hbCAoJmNvbm4tPmZsdXNoX2NvbmQpOworICAgICAgfQorICAgIH0KKyAgfQorICBmb3IgKHdhbGsgPSBjb25uLT5zaW5rX2NsaWVudHM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RKYWNrQXVkaW9DbGllbnQgKmNsaWVudCA9IChHc3RKYWNrQXVkaW9DbGllbnQgKikgd2Fsay0+ZGF0YTsKKworICAgIC8qIG9ubHkgY2FsbCBhY3RpdmUgY2xpZW50cyAqLworICAgIGlmICgoY2xpZW50LT5hY3RpdmUgfHwgY2xpZW50LT5kZWFjdGl2YXRlKSAmJiBjbGllbnQtPnByb2Nlc3MpIHsKKyAgICAgIHJlcyA9IGNsaWVudC0+cHJvY2VzcyAobmZyYW1lcywgY2xpZW50LT51c2VyX2RhdGEpOworICAgICAgaWYgKGNsaWVudC0+ZGVhY3RpdmF0ZSkgeworICAgICAgICBjbGllbnQtPmRlYWN0aXZhdGUgPSBGQUxTRTsKKyAgICAgICAgZ19jb25kX3NpZ25hbCAoJmNvbm4tPmZsdXNoX2NvbmQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGhhbmRsZSB0cmFuc3BvcnQgc3RhdGUgcmVxdWlzaXRpb24sIGRvIHNpbmtzIGZpcnN0LCBzdG9wIGFmdGVyIHRoZSBmaXJzdAorICAgKiBlbGVtZW50IHRoYXQgaGFuZGxlZCBpdCAqLworICBpZiAoY29ubi0+dHJhbnNwb3J0X3N0YXRlICE9IEdTVF9TVEFURV9WT0lEX1BFTkRJTkcpIHsKKyAgICBmb3IgKHdhbGsgPSBjb25uLT5zaW5rX2NsaWVudHM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICAgIGlmIChqYWNrX2hhbmRsZV90cmFuc3BvcnRfY2hhbmdlICgoR3N0SmFja0F1ZGlvQ2xpZW50ICopIHdhbGstPmRhdGEsCisgICAgICAgICAgICAgIGNvbm4tPnRyYW5zcG9ydF9zdGF0ZSkpIHsKKyAgICAgICAgY29ubi0+dHJhbnNwb3J0X3N0YXRlID0gR1NUX1NUQVRFX1ZPSURfUEVORElORzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChjb25uLT50cmFuc3BvcnRfc3RhdGUgIT0gR1NUX1NUQVRFX1ZPSURfUEVORElORykgeworICAgIGZvciAod2FsayA9IGNvbm4tPnNyY19jbGllbnRzOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgICBpZiAoamFja19oYW5kbGVfdHJhbnNwb3J0X2NoYW5nZSAoKEdzdEphY2tBdWRpb0NsaWVudCAqKSB3YWxrLT5kYXRhLAorICAgICAgICAgICAgICBjb25uLT50cmFuc3BvcnRfc3RhdGUpKSB7CisgICAgICAgIGNvbm4tPnRyYW5zcG9ydF9zdGF0ZSA9IEdTVF9TVEFURV9WT0lEX1BFTkRJTkc7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBnX211dGV4X3VubG9jayAoJmNvbm4tPmxvY2spOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitqYWNrX3NodXRkb3duX2NiICh2b2lkICphcmcpCit7CisgIEdzdEphY2tBdWRpb0Nvbm5lY3Rpb24gKmNvbm4gPSAoR3N0SmFja0F1ZGlvQ29ubmVjdGlvbiAqKSBhcmc7CisgIEdMaXN0ICp3YWxrOworCisgIEdTVF9ERUJVRyAoImRpc2Nvbm5lY3QgY2xpZW50ICVzIGZyb20gc2VydmVyICVzIiwgY29ubi0+aWQsCisgICAgICBHU1RfU1RSX05VTEwgKGNvbm4tPnNlcnZlcikpOworCisgIGdfbXV0ZXhfbG9jayAoJmNvbm4tPmxvY2spOworICBmb3IgKHdhbGsgPSBjb25uLT5zcmNfY2xpZW50czsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdEphY2tBdWRpb0NsaWVudCAqY2xpZW50ID0gKEdzdEphY2tBdWRpb0NsaWVudCAqKSB3YWxrLT5kYXRhOworCisgICAgY2xpZW50LT5zZXJ2ZXJfZG93biA9IFRSVUU7CisgICAgZ19jb25kX3NpZ25hbCAoJmNvbm4tPmZsdXNoX2NvbmQpOworICAgIGlmIChjbGllbnQtPnNodXRkb3duKQorICAgICAgY2xpZW50LT5zaHV0ZG93biAoY2xpZW50LT51c2VyX2RhdGEpOworICB9CisgIGZvciAod2FsayA9IGNvbm4tPnNpbmtfY2xpZW50czsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdEphY2tBdWRpb0NsaWVudCAqY2xpZW50ID0gKEdzdEphY2tBdWRpb0NsaWVudCAqKSB3YWxrLT5kYXRhOworCisgICAgY2xpZW50LT5zZXJ2ZXJfZG93biA9IFRSVUU7CisgICAgZ19jb25kX3NpZ25hbCAoJmNvbm4tPmZsdXNoX2NvbmQpOworICAgIGlmIChjbGllbnQtPnNodXRkb3duKQorICAgICAgY2xpZW50LT5zaHV0ZG93biAoY2xpZW50LT51c2VyX2RhdGEpOworICB9CisgIGdfbXV0ZXhfdW5sb2NrICgmY29ubi0+bG9jayk7Cit9CisKKy8qIHdlIGVycm9yIG91dCAqLworc3RhdGljIGludAoramFja19zYW1wbGVfcmF0ZV9jYiAoamFja19uZnJhbWVzX3QgbmZyYW1lcywgdm9pZCAqYXJnKQoreworICBqYWNrX3NodXRkb3duX2NiIChhcmcpOworICByZXR1cm4gMDsKK30KKworLyogd2UgZXJyb3Igb3V0ICovCitzdGF0aWMgaW50CitqYWNrX2J1ZmZlcl9zaXplX2NiIChqYWNrX25mcmFtZXNfdCBuZnJhbWVzLCB2b2lkICphcmcpCit7CisgIGphY2tfc2h1dGRvd25fY2IgKGFyZyk7CisgIHJldHVybiAwOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBnY2hhciAqaWQ7CisgIGNvbnN0IGdjaGFyICpzZXJ2ZXI7Cit9IEZpbmREYXRhOworCitzdGF0aWMgZ2ludAorY29ubmVjdGlvbl9maW5kIChHc3RKYWNrQXVkaW9Db25uZWN0aW9uICogY29ubiwgRmluZERhdGEgKiBkYXRhKQoreworICAvKiBpZCdzIG11c3QgbWF0Y2ggKi8KKyAgaWYgKHN0cmNtcCAoY29ubi0+aWQsIGRhdGEtPmlkKSkKKyAgICByZXR1cm4gMTsKKworICAvKiBib3RoIHRoZSBzYW1lIG9yIE5VTEwgKi8KKyAgaWYgKGNvbm4tPnNlcnZlciA9PSBkYXRhLT5zZXJ2ZXIpCisgICAgcmV0dXJuIDA7CisKKyAgLyogd2UgY2Fubm90IGNvbXBhcmUgTlVMTCAqLworICBpZiAoY29ubi0+c2VydmVyID09IE5VTEwgfHwgZGF0YS0+c2VydmVyID09IE5VTEwpCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKHN0cmNtcCAoY29ubi0+c2VydmVyLCBkYXRhLT5zZXJ2ZXIpKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCisvKiBtYWtlIGEgY29ubmVjdGlvbiB3aXRoIEBpZCBhbmQgQHNlcnZlci4gUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUgd2l0aCB0aGUKKyAqIHN0YXR1cyBzZXQuICovCitzdGF0aWMgR3N0SmFja0F1ZGlvQ29ubmVjdGlvbiAqCitnc3RfamFja19hdWRpb19tYWtlX2Nvbm5lY3Rpb24gKGNvbnN0IGdjaGFyICogaWQsIGNvbnN0IGdjaGFyICogc2VydmVyLAorICAgIGphY2tfY2xpZW50X3QgKiBqY2xpZW50LCBqYWNrX3N0YXR1c190ICogc3RhdHVzKQoreworICBHc3RKYWNrQXVkaW9Db25uZWN0aW9uICpjb25uOworICBqYWNrX29wdGlvbnNfdCBvcHRpb25zOworICBnaW50IHJlczsKKworICAqc3RhdHVzID0gMDsKKworICBHU1RfREVCVUcgKCJuZXcgY2xpZW50ICVzLCBjb25uZWN0aW5nIHRvIHNlcnZlciAlcyIsIGlkLAorICAgICAgR1NUX1NUUl9OVUxMIChzZXJ2ZXIpKTsKKworICAvKiBuZXZlciBzdGFydCBhIHNlcnZlciAqLworICBvcHRpb25zID0gSmFja05vU3RhcnRTZXJ2ZXI7CisgIC8qIGlmIHdlIGhhdmUgYSBzZXJ2ZXJuYW1lLCB1c2UgaXQgKi8KKyAgaWYgKHNlcnZlciAhPSBOVUxMKQorICAgIG9wdGlvbnMgfD0gSmFja1NlcnZlck5hbWU7CisgIC8qIG9wZW4gdGhlIGNsaWVudCAqLworICBpZiAoamNsaWVudCA9PSBOVUxMKQorICAgIGpjbGllbnQgPSBqYWNrX2NsaWVudF9vcGVuIChpZCwgb3B0aW9ucywgc3RhdHVzLCBzZXJ2ZXIpOworICBpZiAoamNsaWVudCA9PSBOVUxMKQorICAgIGdvdG8gY291bGRfbm90X29wZW47CisKKyAgLyogbm93IGNyZWF0ZSBvYmplY3QgKi8KKyAgY29ubiA9IGdfbmV3IChHc3RKYWNrQXVkaW9Db25uZWN0aW9uLCAxKTsKKyAgY29ubi0+cmVmY291bnQgPSAxOworICBnX211dGV4X2luaXQgKCZjb25uLT5sb2NrKTsKKyAgZ19jb25kX2luaXQgKCZjb25uLT5mbHVzaF9jb25kKTsKKyAgY29ubi0+aWQgPSBnX3N0cmR1cCAoaWQpOworICBjb25uLT5zZXJ2ZXIgPSBnX3N0cmR1cCAoc2VydmVyKTsKKyAgY29ubi0+Y2xpZW50ID0gamNsaWVudDsKKyAgY29ubi0+bl9jbGllbnRzID0gMDsKKyAgY29ubi0+c3JjX2NsaWVudHMgPSBOVUxMOworICBjb25uLT5zaW5rX2NsaWVudHMgPSBOVUxMOworICBjb25uLT5jdXJfdHMgPSAtMTsKKyAgY29ubi0+dHJhbnNwb3J0X3N0YXRlID0gR1NUX1NUQVRFX1ZPSURfUEVORElORzsKKworICAvKiBzZXQgb3VyIGNhbGxiYWNrcyAgKi8KKyAgamFja19zZXRfcHJvY2Vzc19jYWxsYmFjayAoamNsaWVudCwgamFja19wcm9jZXNzX2NiLCBjb25uKTsKKyAgLyogdGhlc2UgY2FsbGJhY2tzIGNhdXNlIHVzIHRvIGVycm9yICovCisgIGphY2tfc2V0X2J1ZmZlcl9zaXplX2NhbGxiYWNrIChqY2xpZW50LCBqYWNrX2J1ZmZlcl9zaXplX2NiLCBjb25uKTsKKyAgamFja19zZXRfc2FtcGxlX3JhdGVfY2FsbGJhY2sgKGpjbGllbnQsIGphY2tfc2FtcGxlX3JhdGVfY2IsIGNvbm4pOworICBqYWNrX29uX3NodXRkb3duIChqY2xpZW50LCBqYWNrX3NodXRkb3duX2NiLCBjb25uKTsKKworICAvKiBhbGwgY2FsbGJhY2tzIGFyZSBzZXQsIGFjdGl2YXRlIHRoZSBjbGllbnQgKi8KKyAgR1NUX0lORk8gKCJhY3RpdmF0ZSBqYWNrX2NsaWVudCAlcCIsIGpjbGllbnQpOworICBpZiAoKHJlcyA9IGphY2tfYWN0aXZhdGUgKGpjbGllbnQpKSkKKyAgICBnb3RvIGNvdWxkX25vdF9hY3RpdmF0ZTsKKworICBHU1RfREVCVUcgKCJvcGVuZWQgY29ubmVjdGlvbiAlcCIsIGNvbm4pOworCisgIHJldHVybiBjb25uOworCisgIC8qIEVSUk9SUyAqLworY291bGRfbm90X29wZW46CisgIHsKKyAgICBHU1RfREVCVUcgKCJmYWlsZWQgdG8gb3BlbiBqYWNrIGNsaWVudCwgJWQiLCAqc3RhdHVzKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorY291bGRfbm90X2FjdGl2YXRlOgorICB7CisgICAgR1NUX0VSUk9SICgiQ291bGQgbm90IGFjdGl2YXRlIGNsaWVudCAoJWQpIiwgcmVzKTsKKyAgICAqc3RhdHVzID0gSmFja0ZhaWx1cmU7CisgICAgZ19tdXRleF9jbGVhciAoJmNvbm4tPmxvY2spOworICAgIGdfZnJlZSAoY29ubi0+aWQpOworICAgIGdfZnJlZSAoY29ubi0+c2VydmVyKTsKKyAgICBnX2ZyZWUgKGNvbm4pOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBHc3RKYWNrQXVkaW9Db25uZWN0aW9uICoKK2dzdF9qYWNrX2F1ZGlvX2dldF9jb25uZWN0aW9uIChjb25zdCBnY2hhciAqIGlkLCBjb25zdCBnY2hhciAqIHNlcnZlciwKKyAgICBqYWNrX2NsaWVudF90ICogamNsaWVudCwgamFja19zdGF0dXNfdCAqIHN0YXR1cykKK3sKKyAgR3N0SmFja0F1ZGlvQ29ubmVjdGlvbiAqY29ubjsKKyAgR0xpc3QgKmZvdW5kOworICBGaW5kRGF0YSBkYXRhOworCisgIEdTVF9ERUJVRyAoImdldHRpbmcgY29ubmVjdGlvbiBmb3IgaWQgJXMsIHNlcnZlciAlcyIsIGlkLAorICAgICAgR1NUX1NUUl9OVUxMIChzZXJ2ZXIpKTsKKworICBkYXRhLmlkID0gaWQ7CisgIGRhdGEuc2VydmVyID0gc2VydmVyOworCisgIEdfTE9DSyAoY29ubmVjdGlvbnNfbG9jayk7CisgIGZvdW5kID0KKyAgICAgIGdfbGlzdF9maW5kX2N1c3RvbSAoY29ubmVjdGlvbnMsICZkYXRhLCAoR0NvbXBhcmVGdW5jKSBjb25uZWN0aW9uX2ZpbmQpOworICBpZiAoZm91bmQgIT0gTlVMTCAmJiBqY2xpZW50ICE9IE5VTEwpIHsKKyAgICAvKiB3ZSBmb3VuZCBpdCwgaW5jcmVhc2UgcmVmY291bnQgYW5kIHJldHVybiBpdCAqLworICAgIGNvbm4gPSAoR3N0SmFja0F1ZGlvQ29ubmVjdGlvbiAqKSBmb3VuZC0+ZGF0YTsKKyAgICBjb25uLT5yZWZjb3VudCsrOworCisgICAgR1NUX0RFQlVHICgiZm91bmQgY29ubmVjdGlvbiAlcCIsIGNvbm4pOworICB9IGVsc2UgeworICAgIC8qIG1ha2UgbmV3IGNvbm5lY3Rpb24gKi8KKyAgICBjb25uID0gZ3N0X2phY2tfYXVkaW9fbWFrZV9jb25uZWN0aW9uIChpZCwgc2VydmVyLCBqY2xpZW50LCBzdGF0dXMpOworICAgIGlmIChjb25uICE9IE5VTEwpIHsKKyAgICAgIEdTVF9ERUJVRyAoImNyZWF0ZWQgY29ubmVjdGlvbiAlcCIsIGNvbm4pOworICAgICAgLyogYWRkIHRvIGxpc3Qgb24gc3VjY2VzcyAqLworICAgICAgY29ubmVjdGlvbnMgPSBnX2xpc3RfcHJlcGVuZCAoY29ubmVjdGlvbnMsIGNvbm4pOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklORyAoImNvdWxkIG5vdCBjcmVhdGUgY29ubmVjdGlvbiIpOworICAgIH0KKyAgfQorICBHX1VOTE9DSyAoY29ubmVjdGlvbnNfbG9jayk7CisKKyAgcmV0dXJuIGNvbm47Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfamFja19hdWRpb191bnJlZl9jb25uZWN0aW9uIChHc3RKYWNrQXVkaW9Db25uZWN0aW9uICogY29ubikKK3sKKyAgZ2ludCByZXM7CisgIGdib29sZWFuIHplcm87CisKKyAgR1NUX0RFQlVHICgidW5yZWYgY29ubmVjdGlvbiAlcCByZWZjbnQgJWQiLCBjb25uLCBjb25uLT5yZWZjb3VudCk7CisKKyAgR19MT0NLIChjb25uZWN0aW9uc19sb2NrKTsKKyAgY29ubi0+cmVmY291bnQtLTsKKyAgaWYgKCh6ZXJvID0gKGNvbm4tPnJlZmNvdW50ID09IDApKSkgeworICAgIEdTVF9ERUJVRyAoImNsb3NpbmcgY29ubmVjdGlvbiAlcCIsIGNvbm4pOworICAgIC8qIHJlbW92ZSBmcm9tIGxpc3QsIHdlIGNhbiByZWxlYXNlIHRoZSBtdXRleCBhZnRlciByZW1vdmluZyB0aGUgY29ubmVjdGlvbgorICAgICAqIGZyb20gdGhlIGxpc3QgYmVjYXVzZSBhZnRlciB0aGF0LCBub2JvZHkgY2FuIGFjY2VzcyB0aGUgY29ubmVjdGlvbiBhbnltb3JlLiAqLworICAgIGNvbm5lY3Rpb25zID0gZ19saXN0X3JlbW92ZSAoY29ubmVjdGlvbnMsIGNvbm4pOworICB9CisgIEdfVU5MT0NLIChjb25uZWN0aW9uc19sb2NrKTsKKworICAvKiBpZiB3ZSBhcmUgemVybywgY2xvc2UgYW5kIGNsZWFudXAgdGhlIGNvbm5lY3Rpb24gKi8KKyAgaWYgKHplcm8pIHsKKyAgICAvKiBkb24ndCB1c2UgY29ubi0+bG9jayBoZXJlLiB0d28gcmVhc29uczoKKyAgICAgKgorICAgICAqICAxKSBpdHMgbm90IG5lY2Vzc2FyeTogamFja19kZWFjdGl2YXRlKCkgd2lsbCBub3QgcmV0dXJuIHVudGlsIHRoZSBKQUNLIHRocmVhZAorICAgICAqICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29ubmVjdGlvbiBpcyBjbGVhbmVkIHVwIGJ5IGEgdGhyZWFkIGpvaW4sIGhlbmNlIAorICAgICAqICAgICAgbm8gbW9yZSBjYWxsYmFja3MgY2FuIG9jY3VyIG9yIGJlIGluIHByb2dyZXNzLgorICAgICAqCisgICAgICogMikgaXQgd291bGQgZGVhZGxvY2sgYW55d2F5LCBiZWNhdXNlIGphY2tfZGVhY3RpdmF0ZSgpIHdpbGwgc2xlZXAKKyAgICAgKiAgICAgIHdhaXRpbmcgZm9yIHRoZSBKQUNLIHRocmVhZCwgYW5kIGNhbiB0aHVzIGNhdXNlIGRlYWRsb2NrIGluIAorICAgICAqICAgICAgamFja19wcm9jZXNzX2NiKCkKKyAgICAgKi8KKyAgICBHU1RfSU5GTyAoImRlYWN0aXZhdGUgamFja19jbGllbnQgJXAiLCBjb25uLT5jbGllbnQpOworICAgIGlmICgocmVzID0gamFja19kZWFjdGl2YXRlIChjb25uLT5jbGllbnQpKSkgeworICAgICAgLyogd2Ugb25seSB3YXJuLCB0aGlzIG1lYW5zIHRoZSBzZXJ2ZXIgaXMgcHJvYmFibHkgc2h1dCBkb3duIGFuZCB0aGUgY2xpZW50CisgICAgICAgKiBpcyBnb25lIGFueXdheS4gKi8KKyAgICAgIEdTVF9XQVJOSU5HICgiQ291bGQgbm90IGRlYWN0aXZhdGUgSmFjayBjbGllbnQgKCVkKSIsIHJlcyk7CisgICAgfQorICAgIC8qIGNsb3NlIGNvbm5lY3Rpb24gKi8KKyAgICBpZiAoKHJlcyA9IGphY2tfY2xpZW50X2Nsb3NlIChjb25uLT5jbGllbnQpKSkgeworICAgICAgLyogd2UgYXNzdW1lIHRoZSBjbGllbnQgaXMgZ29uZS4gKi8KKyAgICAgIEdTVF9XQVJOSU5HICgiY2xvc2UgZmFpbGVkICglZCkiLCByZXMpOworICAgIH0KKworICAgIC8qIGZyZWUgcmVzb3VyY2VzICovCisgICAgZ19tdXRleF9jbGVhciAoJmNvbm4tPmxvY2spOworICAgIGdfY29uZF9jbGVhciAoJmNvbm4tPmZsdXNoX2NvbmQpOworICAgIGdfZnJlZSAoY29ubi0+aWQpOworICAgIGdfZnJlZSAoY29ubi0+c2VydmVyKTsKKyAgICBnX2ZyZWUgKGNvbm4pOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfamFja19hdWRpb19jb25uZWN0aW9uX2FkZF9jbGllbnQgKEdzdEphY2tBdWRpb0Nvbm5lY3Rpb24gKiBjb25uLAorICAgIEdzdEphY2tBdWRpb0NsaWVudCAqIGNsaWVudCkKK3sKKyAgZ19tdXRleF9sb2NrICgmY29ubi0+bG9jayk7CisgIHN3aXRjaCAoY2xpZW50LT50eXBlKSB7CisgICAgY2FzZSBHU1RfSkFDS19DTElFTlRfU09VUkNFOgorICAgICAgY29ubi0+c3JjX2NsaWVudHMgPSBnX2xpc3RfYXBwZW5kIChjb25uLT5zcmNfY2xpZW50cywgY2xpZW50KTsKKyAgICAgIGNvbm4tPm5fY2xpZW50cysrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfSkFDS19DTElFTlRfU0lOSzoKKyAgICAgIGNvbm4tPnNpbmtfY2xpZW50cyA9IGdfbGlzdF9hcHBlbmQgKGNvbm4tPnNpbmtfY2xpZW50cywgY2xpZW50KTsKKyAgICAgIGNvbm4tPm5fY2xpZW50cysrOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfd2FybmluZyAoInRyeWluZyB0byBhZGQgdW5rbm93biBjbGllbnQgdHlwZSIpOworICAgICAgYnJlYWs7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZjb25uLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9qYWNrX2F1ZGlvX2Nvbm5lY3Rpb25fcmVtb3ZlX2NsaWVudCAoR3N0SmFja0F1ZGlvQ29ubmVjdGlvbiAqIGNvbm4sCisgICAgR3N0SmFja0F1ZGlvQ2xpZW50ICogY2xpZW50KQoreworICBnX211dGV4X2xvY2sgKCZjb25uLT5sb2NrKTsKKyAgc3dpdGNoIChjbGllbnQtPnR5cGUpIHsKKyAgICBjYXNlIEdTVF9KQUNLX0NMSUVOVF9TT1VSQ0U6CisgICAgICBjb25uLT5zcmNfY2xpZW50cyA9IGdfbGlzdF9yZW1vdmUgKGNvbm4tPnNyY19jbGllbnRzLCBjbGllbnQpOworICAgICAgY29ubi0+bl9jbGllbnRzLS07CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9KQUNLX0NMSUVOVF9TSU5LOgorICAgICAgY29ubi0+c2lua19jbGllbnRzID0gZ19saXN0X3JlbW92ZSAoY29ubi0+c2lua19jbGllbnRzLCBjbGllbnQpOworICAgICAgY29ubi0+bl9jbGllbnRzLS07CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ193YXJuaW5nICgidHJ5aW5nIHRvIHJlbW92ZSB1bmtub3duIGNsaWVudCB0eXBlIik7CisgICAgICBicmVhazsKKyAgfQorICBnX211dGV4X3VubG9jayAoJmNvbm4tPmxvY2spOworfQorCisvKioKKyAqIGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9nZXQ6CisgKiBAaWQ6IHRoZSBjbGllbnQgaWQKKyAqIEBzZXJ2ZXI6IHRoZSBzZXJ2ZXIgdG8gY29ubmVjdCB0byBvciBOVUxMIGZvciB0aGUgZGVmYXVsdCBzZXJ2ZXIKKyAqIEB0eXBlOiB0aGUgY2xpZW50IHR5cGUKKyAqIEBzaHV0ZG93bjogYSBjYWxsYmFjayB3aGVuIHRoZSBqYWNrIHNlcnZlciBzaHV0cyBkb3duCisgKiBAcHJvY2VzczogYSBjYWxsYmFjayB3aGVuIHNhbXBsZXMgYXJlIGF2YWlsYWJsZQorICogQGJ1ZmZlcl9zaXplOiBhIGNhbGxiYWNrIHdoZW4gdGhlIGJ1ZmZlcl9zaXplIGNoYW5nZXMKKyAqIEBzYW1wbGVfcmF0ZTogYSBjYWxsYmFjayB3aGVuIHRoZSBzYW1wbGVfcmF0ZSBjaGFuZ2VzCisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgcGFzc2VkIHRvIHRoZSBjYWxsYmFja3MKKyAqIEBzdGF0dXM6IHBvaW50ZXIgdG8gaG9sZCB0aGUgamFjayBzdGF0dXMgY29kZSBpbiBjYXNlIG9mIGVycm9ycworICoKKyAqIEdldCB0aGUgamFjayBjbGllbnQgY29ubmVjdGlvbiBmb3IgQGlkIGFuZCBAc2VydmVyLiBDb25uZWN0aW9ucyB0byB0aGUgc2FtZQorICogQGlkIGFuZCBAc2VydmVyIHdpbGwgcmVjZWl2ZSB0aGUgc2FtZSBwaHlzaWNhbCBKYWNrIGNsaWVudCBjb25uZWN0aW9uIGFuZAorICogd2lsbCB0aGVyZWZvcmUgYmUgc2NoZWR1bGVkIGluIHRoZSBzYW1lIHByb2Nlc3MgY2FsbGJhY2suCisgKiAKKyAqIFJldHVybnM6IGEgI0dzdEphY2tBdWRpb0NsaWVudC4KKyAqLworR3N0SmFja0F1ZGlvQ2xpZW50ICoKK2dzdF9qYWNrX2F1ZGlvX2NsaWVudF9uZXcgKGNvbnN0IGdjaGFyICogaWQsIGNvbnN0IGdjaGFyICogc2VydmVyLAorICAgIGphY2tfY2xpZW50X3QgKiBqY2xpZW50LCBHc3RKYWNrQ2xpZW50VHlwZSB0eXBlLAorICAgIHZvaWQgKCpzaHV0ZG93bikgKHZvaWQgKmFyZyksIEphY2tQcm9jZXNzQ2FsbGJhY2sgcHJvY2VzcywKKyAgICBKYWNrQnVmZmVyU2l6ZUNhbGxiYWNrIGJ1ZmZlcl9zaXplLCBKYWNrU2FtcGxlUmF0ZUNhbGxiYWNrIHNhbXBsZV9yYXRlLAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSwgamFja19zdGF0dXNfdCAqIHN0YXR1cykKK3sKKyAgR3N0SmFja0F1ZGlvQ2xpZW50ICpjbGllbnQ7CisgIEdzdEphY2tBdWRpb0Nvbm5lY3Rpb24gKmNvbm47CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGlkICE9IE5VTEwsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc3RhdHVzICE9IE5VTEwsIE5VTEwpOworCisgIC8qIGZpcnN0IGdldCBhIGNvbm5lY3Rpb24gZm9yIHRoZSBpZC9zZXJ2ZXIgcGFpciAqLworICBjb25uID0gZ3N0X2phY2tfYXVkaW9fZ2V0X2Nvbm5lY3Rpb24gKGlkLCBzZXJ2ZXIsIGpjbGllbnQsIHN0YXR1cyk7CisgIGlmIChjb25uID09IE5VTEwpCisgICAgZ290byBub19jb25uZWN0aW9uOworCisgIEdTVF9JTkZPICgibmV3IGNsaWVudCAlcyIsIGlkKTsKKworICAvKiBtYWtlIG5ldyBjbGllbnQgdXNpbmcgdGhlIGNvbm5lY3Rpb24gKi8KKyAgY2xpZW50ID0gZ19uZXcgKEdzdEphY2tBdWRpb0NsaWVudCwgMSk7CisgIGNsaWVudC0+YWN0aXZlID0gY2xpZW50LT5kZWFjdGl2YXRlID0gRkFMU0U7CisgIGNsaWVudC0+Y29ubiA9IGNvbm47CisgIGNsaWVudC0+dHlwZSA9IHR5cGU7CisgIGNsaWVudC0+c2h1dGRvd24gPSBzaHV0ZG93bjsKKyAgY2xpZW50LT5wcm9jZXNzID0gcHJvY2VzczsKKyAgY2xpZW50LT5idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplOworICBjbGllbnQtPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CisgIGNsaWVudC0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworICBjbGllbnQtPnNlcnZlcl9kb3duID0gRkFMU0U7CisKKyAgLyogYWRkIHRoZSBjbGllbnQgdG8gdGhlIGNvbm5lY3Rpb24gKi8KKyAgZ3N0X2phY2tfYXVkaW9fY29ubmVjdGlvbl9hZGRfY2xpZW50IChjb25uLCBjbGllbnQpOworCisgIHJldHVybiBjbGllbnQ7CisKKyAgLyogRVJST1JTICovCitub19jb25uZWN0aW9uOgorICB7CisgICAgR1NUX0RFQlVHICgiQ291bGQgbm90IGdldCBzZXJ2ZXIgY29ubmVjdGlvbiAoJWQpIiwgKnN0YXR1cyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLyoqCisgKiBnc3RfamFja19hdWRpb19jbGllbnRfZnJlZToKKyAqIEBjbGllbnQ6IGEgI0dzdEphY2tBdWRpb0NsaWVudAorICoKKyAqIEZyZWUgdGhlIHJlc291cmNlcyB1c2VkIGJ5IEBjbGllbnQuCisgKi8KK3ZvaWQKK2dzdF9qYWNrX2F1ZGlvX2NsaWVudF9mcmVlIChHc3RKYWNrQXVkaW9DbGllbnQgKiBjbGllbnQpCit7CisgIEdzdEphY2tBdWRpb0Nvbm5lY3Rpb24gKmNvbm47CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoY2xpZW50ICE9IE5VTEwpOworCisgIEdTVF9JTkZPICgiZnJlZSBjbGllbnQiKTsKKworICBjb25uID0gY2xpZW50LT5jb25uOworCisgIC8qIHJlbW92ZSBmcm9tIGNvbm5lY3Rpb24gZmlyc3Qgc28gdGhhdCBpdCdzIG5vdCBzY2hlZHVsZWQgYW55bW9yZSBhZnRlciB0aGlzCisgICAqIGNhbGwgKi8KKyAgZ3N0X2phY2tfYXVkaW9fY29ubmVjdGlvbl9yZW1vdmVfY2xpZW50IChjb25uLCBjbGllbnQpOworICBnc3RfamFja19hdWRpb191bnJlZl9jb25uZWN0aW9uIChjb25uKTsKKworICBnX2ZyZWUgKGNsaWVudCk7Cit9CisKKy8qKgorICogZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF9jbGllbnQ6CisgKiBAY2xpZW50OiBhICNHc3RKYWNrQXVkaW9DbGllbnQKKyAqCisgKiBHZXQgdGhlIGphY2sgYXVkaW8gY2xpZW50IGZvciBAY2xpZW50LiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGVyZm9ybQorICogb3BlcmF0aW9ucyBvbiB0aGUgamFjayBzZXJ2ZXIgZnJvbSB0aGlzIGNsaWVudC4KKyAqCisgKiBSZXR1cm5zOiBUaGUgamFjayBhdWRpbyBjbGllbnQuCisgKi8KK2phY2tfY2xpZW50X3QgKgorZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF9jbGllbnQgKEdzdEphY2tBdWRpb0NsaWVudCAqIGNsaWVudCkKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNsaWVudCAhPSBOVUxMLCBOVUxMKTsKKworICAvKiBubyBsb2NrIG5lZWRlZCwgdGhlIGNvbm5lY3Rpb24gYW5kIHRoZSBjbGllbnQgZG9lcyBub3QgY2hhbmdlIAorICAgKiBvbmNlIHRoZSBjbGllbnQgaXMgY3JlYXRlZC4gKi8KKyAgcmV0dXJuIGNsaWVudC0+Y29ubi0+Y2xpZW50OworfQorCisvKioKKyAqIGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9zZXRfYWN0aXZlOgorICogQGNsaWVudDogYSAjR3N0SmFja0F1ZGlvQ2xpZW50CisgKiBAYWN0aXZlOiBuZXcgbW9kZSBmb3IgdGhlIGNsaWVudAorICoKKyAqIEFjdGl2YXRlIG9yIGRlYWN0aXZlIEBjbGllbnQuIFdoZW4gYSBjbGllbnQgaXMgYWN0aXZhdGVkIGl0IHdpbGwgcmVjZWl2ZQorICogY2FsbGJhY2tzIHdoZW4gZGF0YSBzaG91bGQgYmUgcHJvY2Vzc2VkLgorICoKKyAqIFJldHVybnM6IDAgaWYgYWxsIG9rLgorICovCitnaW50Citnc3RfamFja19hdWRpb19jbGllbnRfc2V0X2FjdGl2ZSAoR3N0SmFja0F1ZGlvQ2xpZW50ICogY2xpZW50LCBnYm9vbGVhbiBhY3RpdmUpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChjbGllbnQgIT0gTlVMTCwgLTEpOworCisgIC8qIG1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBub3QgZGlzcGF0Y2hpbmcgdGhlIGNsaWVudCAqLworICBnX211dGV4X2xvY2sgKCZjbGllbnQtPmNvbm4tPmxvY2spOworICBpZiAoY2xpZW50LT5hY3RpdmUgJiYgIWFjdGl2ZSkgeworICAgIC8qIHdlIG5lZWQgdG8gcHJvY2VzcyBvbmNlIG1vcmUgdG8gZmx1c2ggdGhlIHBvcnQgKi8KKyAgICBjbGllbnQtPmRlYWN0aXZhdGUgPSBUUlVFOworCisgICAgLyogbmVlZCB0byB3YWl0IGZvciBwcm9jZXNzX2NiIHJ1biBvbmNlIG1vcmUgKi8KKyAgICB3aGlsZSAoY2xpZW50LT5kZWFjdGl2YXRlICYmICFjbGllbnQtPnNlcnZlcl9kb3duKQorICAgICAgZ19jb25kX3dhaXQgKCZjbGllbnQtPmNvbm4tPmZsdXNoX2NvbmQsICZjbGllbnQtPmNvbm4tPmxvY2spOworICB9CisgIGNsaWVudC0+YWN0aXZlID0gYWN0aXZlOworICBnX211dGV4X3VubG9jayAoJmNsaWVudC0+Y29ubi0+bG9jayk7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF90cmFuc3BvcnRfc3RhdGU6CisgKiBAY2xpZW50OiBhICNHc3RKYWNrQXVkaW9DbGllbnQKKyAqCisgKiBDaGVjayB0aGUgY3VycmVudCB0cmFuc3BvcnQgc3RhdGUuIFRoZSBjbGllbnQgY2FuIHVzZSB0aGlzIHRvIHJlcXVlc3QgYSBzdGF0ZQorICogY2hhbmdlIGZyb20gdGhlIGFwcGxpY2F0aW9uLgorICoKKyAqIFJldHVybnM6IHRoZSBzdGF0ZSwgJUdTVF9TVEFURV9WT0lEX1BFTkRJTkcgZm9yIG5vIGNoYW5nZSBpbiB0aGUgdHJhbnNwb3J0CisgKiBzdGF0ZQorICovCitHc3RTdGF0ZQorZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF90cmFuc3BvcnRfc3RhdGUgKEdzdEphY2tBdWRpb0NsaWVudCAqIGNsaWVudCkKK3sKKyAgR3N0U3RhdGUgc3RhdGUgPSBjbGllbnQtPmNvbm4tPnRyYW5zcG9ydF9zdGF0ZTsKKworICBjbGllbnQtPmNvbm4tPnRyYW5zcG9ydF9zdGF0ZSA9IEdTVF9TVEFURV9WT0lEX1BFTkRJTkc7CisgIHJldHVybiBzdGF0ZTsKK30KZGlmZiAtLWdpdCBhL2V4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5oIGIvZXh0L2phY2svZ3N0amFja2F1ZGlvY2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRjZDcwYwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrL2dzdGphY2thdWRpb2NsaWVudC5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA2IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogZ3N0amFja2F1ZGlvY2xpZW50Lmg6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9KQUNLX0FVRElPX0NMSUVOVF9IX18KKyNkZWZpbmUgX19HU1RfSkFDS19BVURJT19DTElFTlRfSF9fCisKKyNpbmNsdWRlIDxqYWNrL2phY2suaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIGVudW0gCit7CisgIEdTVF9KQUNLX0NMSUVOVF9TT1VSQ0UsCisgIEdTVF9KQUNLX0NMSUVOVF9TSU5LCit9IEdzdEphY2tDbGllbnRUeXBlOworCit0eXBlZGVmIHN0cnVjdCBfR3N0SmFja0F1ZGlvQ2xpZW50IEdzdEphY2tBdWRpb0NsaWVudDsKKwordm9pZCAgICAgICAgICAgICAgICAgIGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9pbml0ICAgICAgICAgICAodm9pZCk7CisKKworR3N0SmFja0F1ZGlvQ2xpZW50ICogIGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9uZXcgICAgICAgICAgICAoY29uc3QgZ2NoYXIgKmlkLCBjb25zdCBnY2hhciAqc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFja19jbGllbnRfdCAqamNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdEphY2tDbGllbnRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqc2h1dGRvd24pICh2b2lkICphcmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFja1Byb2Nlc3NDYWxsYmFjayAgICBwcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFja0J1ZmZlclNpemVDYWxsYmFjayBidWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphY2tTYW1wbGVSYXRlQ2FsbGJhY2sgc2FtcGxlX3JhdGUsCisJCQkJCQkJICAgIGdwb2ludGVyIHVzZXJfZGF0YSwKKwkJCQkJCQkgICAgamFja19zdGF0dXNfdCAqc3RhdHVzKTsKK3ZvaWQgICAgICAgICAgICAgICAgICBnc3RfamFja19hdWRpb19jbGllbnRfZnJlZSAgICAgICAgICAgKEdzdEphY2tBdWRpb0NsaWVudCAqY2xpZW50KTsKKworamFja19jbGllbnRfdCAqICAgICAgIGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9nZXRfY2xpZW50ICAgICAoR3N0SmFja0F1ZGlvQ2xpZW50ICpjbGllbnQpOworCitnYm9vbGVhbiAgICAgICAgICAgICAgZ3N0X2phY2tfYXVkaW9fY2xpZW50X3NldF9hY3RpdmUgICAgIChHc3RKYWNrQXVkaW9DbGllbnQgKmNsaWVudCwgZ2Jvb2xlYW4gYWN0aXZlKTsKKworR3N0U3RhdGUgICAgICAgICAgICAgIGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9nZXRfdHJhbnNwb3J0X3N0YXRlIChHc3RKYWNrQXVkaW9DbGllbnQgKmNsaWVudCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9KQUNLX0FVRElPX0NMSUVOVF9IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYyBiL2V4dC9qYWNrL2dzdGphY2thdWRpb3NpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjQ5ZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5jCkBAIC0wLDAgKzEsOTczIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIGdzdGphY2thdWRpb3NpbmsuYzogamFjayBhdWRpbyBzaW5rIGltcGxlbWVudGF0aW9uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtamFja2F1ZGlvc2luaworICogQHNlZV9hbHNvOiAjR3N0QXVkaW9CYXNlU2luaywgI0dzdEF1ZGlvUmluZ0J1ZmZlcgorICoKKyAqIEEgU2luayB0aGF0IG91dHB1dHMgZGF0YSB0byBKYWNrIHBvcnRzLgorICogCisgKiBJdCB3aWxsIGNyZWF0ZSBOIEphY2sgcG9ydHMgbmFtZWQgb3V0XyZsdDtuYW1lJmd0O18mbHQ7bnVtJmd0OyB3aGVyZSAKKyAqICZsdDtuYW1lJmd0OyBpcyB0aGUgZWxlbWVudCBuYW1lIGFuZCAmbHQ7bnVtJmd0OyBpcyBzdGFydGluZyBmcm9tIDEuCisgKiBFYWNoIHBvcnQgY29ycmVzcG9uZHMgdG8gYSBnc3RyZWFtZXIgY2hhbm5lbC4KKyAqIAorICogVGhlIHNhbXBsZXJhdGUgYXMgZXhwb3NlZCBvbiB0aGUgY2FwcyBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIHNhbXBsZXJhdGUgb2YKKyAqIHRoZSBqYWNrIHNlcnZlci4KKyAqIAorICogV2hlbiB0aGUgI0dzdEphY2tBdWRpb1Npbms6Y29ubmVjdCBwcm9wZXJ0eSBpcyBzZXQgdG8gYXV0bywgdGhpcyBlbGVtZW50CisgKiB3aWxsIHRyeSB0byBjb25uZWN0IGVhY2ggb3V0cHV0IHBvcnQgdG8gYSByYW5kb20gcGh5c2ljYWwgamFjayBpbnB1dCBwaW4uIEluCisgKiB0aGlzIG1vZGUsIHRoZSBzaW5rIHdpbGwgZXhwb3NlIHRoZSBudW1iZXIgb2YgcGh5c2ljYWwgY2hhbm5lbHMgb24gaXRzIHBhZAorICogY2Fwcy4KKyAqIAorICogV2hlbiB0aGUgI0dzdEphY2tBdWRpb1Npbms6Y29ubmVjdCBwcm9wZXJ0eSBpcyBzZXQgdG8gbm9uZSwgdGhlIGVsZW1lbnQgd2lsbAorICogYWNjZXB0IGFueSBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMgYW5kIHdpbGwgY3JlYXRlIChidXQgbm90IGNvbm5lY3QpIGFuCisgKiBvdXRwdXQgcG9ydCBmb3IgZWFjaCBjaGFubmVsLgorICogCisgKiBUaGUgZWxlbWVudCB3aWxsIGdlbmVyYXRlIGFuIGVycm9yIHdoZW4gdGhlIEphY2sgc2VydmVyIGlzIHNodXQgZG93biB3aGVuIGl0CisgKiB3YXMgUEFVU0VEIG9yIFBMQVlJTkcuIFRoaXMgZWxlbWVudCBkb2VzIG5vdCBzdXBwb3J0IGR5bmFtaWMgcmF0ZSBhbmQgYnVmZmVyCisgKiBzaXplIGNoYW5nZXMgYXQgcnVudGltZS4KKyAqIAorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyAhIGphY2thdWRpb3NpbmsKKyAqIF18IFBsYXkgYSBzaW5lIHdhdmUgdG8gdXNpbmcgamFjay4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC1pMThuLXBsdWdpbi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSAiZ3N0amFja2F1ZGlvc2luay5oIgorI2luY2x1ZGUgImdzdGphY2tyaW5nYnVmZmVyLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9qYWNrX2F1ZGlvX3NpbmtfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2phY2tfYXVkaW9fc2lua19kZWJ1ZworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9qYWNrX2F1ZGlvX3NpbmtfYWxsb2NhdGVfY2hhbm5lbHMgKEdzdEphY2tBdWRpb1NpbmsgKiBzaW5rLCBnaW50IGNoYW5uZWxzKQoreworICBqYWNrX2NsaWVudF90ICpjbGllbnQ7CisKKyAgY2xpZW50ID0gZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF9jbGllbnQgKHNpbmstPmNsaWVudCk7CisKKyAgLyogcmVtb3ZlIHBvcnRzIHdlIGRvbid0IG5lZWQgKi8KKyAgd2hpbGUgKHNpbmstPnBvcnRfY291bnQgPiBjaGFubmVscykgeworICAgIGphY2tfcG9ydF91bnJlZ2lzdGVyIChjbGllbnQsIHNpbmstPnBvcnRzWy0tc2luay0+cG9ydF9jb3VudF0pOworICB9CisKKyAgLyogYWxsb2MgZW5vdWdoIG91dHB1dCBwb3J0cyAqLworICBzaW5rLT5wb3J0cyA9IGdfcmVhbGxvYyAoc2luay0+cG9ydHMsIHNpemVvZiAoamFja19wb3J0X3QgKikgKiBjaGFubmVscyk7CisgIHNpbmstPmJ1ZmZlcnMgPSBnX3JlYWxsb2MgKHNpbmstPmJ1ZmZlcnMsIHNpemVvZiAoc2FtcGxlX3QgKikgKiBjaGFubmVscyk7CisKKyAgLyogY3JlYXRlIGFuIG91dHB1dCBwb3J0IGZvciBlYWNoIGNoYW5uZWwgKi8KKyAgd2hpbGUgKHNpbmstPnBvcnRfY291bnQgPCBjaGFubmVscykgeworICAgIGdjaGFyICpuYW1lOworCisgICAgLyogcG9ydCBuYW1lcyBzdGFydCBmcm9tIDEgYW5kIGFyZSBsb2NhbCB0byB0aGUgZWxlbWVudCAqLworICAgIG5hbWUgPQorICAgICAgICBnX3N0cmR1cF9wcmludGYgKCJvdXRfJXNfJWQiLCBHU1RfRUxFTUVOVF9OQU1FIChzaW5rKSwKKyAgICAgICAgc2luay0+cG9ydF9jb3VudCArIDEpOworICAgIHNpbmstPnBvcnRzW3NpbmstPnBvcnRfY291bnRdID0KKyAgICAgICAgamFja19wb3J0X3JlZ2lzdGVyIChjbGllbnQsIG5hbWUsIEpBQ0tfREVGQVVMVF9BVURJT19UWVBFLAorICAgICAgICBKYWNrUG9ydElzT3V0cHV0LCAwKTsKKyAgICBpZiAoc2luay0+cG9ydHNbc2luay0+cG9ydF9jb3VudF0gPT0gTlVMTCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHNpbmstPnBvcnRfY291bnQrKzsKKworICAgIGdfZnJlZSAobmFtZSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfamFja19hdWRpb19zaW5rX2ZyZWVfY2hhbm5lbHMgKEdzdEphY2tBdWRpb1NpbmsgKiBzaW5rKQoreworICBnaW50IHJlcywgaSA9IDA7CisgIGphY2tfY2xpZW50X3QgKmNsaWVudDsKKworICBjbGllbnQgPSBnc3RfamFja19hdWRpb19jbGllbnRfZ2V0X2NsaWVudCAoc2luay0+Y2xpZW50KTsKKworICAvKiBnZXQgcmlkIG9mIGFsbCBwb3J0cyAqLworICB3aGlsZSAoc2luay0+cG9ydF9jb3VudCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChzaW5rLCAidW5yZWdpc3RlciBwb3J0ICVkIiwgaSk7CisgICAgaWYgKChyZXMgPSBqYWNrX3BvcnRfdW5yZWdpc3RlciAoY2xpZW50LCBzaW5rLT5wb3J0c1tpKytdKSkpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJ1bnJlZ2lzdGVyIG9mIHBvcnQgZmFpbGVkICglZCkiLCByZXMpOworICAgIH0KKyAgICBzaW5rLT5wb3J0X2NvdW50LS07CisgIH0KKyAgZ19mcmVlIChzaW5rLT5wb3J0cyk7CisgIHNpbmstPnBvcnRzID0gTlVMTDsKKyAgZ19mcmVlIChzaW5rLT5idWZmZXJzKTsKKyAgc2luay0+YnVmZmVycyA9IE5VTEw7Cit9CisKKy8qIHJpbmdidWZmZXIgYWJzdHJhY3QgYmFzZSBjbGFzcyAqLworc3RhdGljIEdUeXBlCitnc3RfamFja19yaW5nX2J1ZmZlcl9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIHZvbGF0aWxlIGdzaXplIHJpbmdidWZmZXJfdHlwZSA9IDA7CisKKyAgaWYgKGdfb25jZV9pbml0X2VudGVyICgmcmluZ2J1ZmZlcl90eXBlKSkgeworICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gcmluZ2J1ZmZlcl9pbmZvID0geworICAgICAgc2l6ZW9mIChHc3RKYWNrUmluZ0J1ZmZlckNsYXNzKSwKKyAgICAgIE5VTEwsCisgICAgICBOVUxMLAorICAgICAgKEdDbGFzc0luaXRGdW5jKSBnc3RfamFja19yaW5nX2J1ZmZlcl9jbGFzc19pbml0LAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgICBzaXplb2YgKEdzdEphY2tSaW5nQnVmZmVyKSwKKyAgICAgIDAsCisgICAgICAoR0luc3RhbmNlSW5pdEZ1bmMpIGdzdF9qYWNrX3JpbmdfYnVmZmVyX2luaXQsCisgICAgICBOVUxMCisgICAgfTsKKyAgICBHVHlwZSB0bXAgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChHU1RfVFlQRV9BVURJT19SSU5HX0JVRkZFUiwKKyAgICAgICAgIkdzdEphY2tBdWRpb1NpbmtSaW5nQnVmZmVyIiwgJnJpbmdidWZmZXJfaW5mbywgMCk7CisgICAgZ19vbmNlX2luaXRfbGVhdmUgKCZyaW5nYnVmZmVyX3R5cGUsIHRtcCk7CisgIH0KKworICByZXR1cm4gKEdUeXBlKSByaW5nYnVmZmVyX3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfamFja19yaW5nX2J1ZmZlcl9jbGFzc19pbml0IChHc3RKYWNrUmluZ0J1ZmZlckNsYXNzICoga2xhc3MpCit7CisgIEdzdEF1ZGlvUmluZ0J1ZmZlckNsYXNzICpnc3RyaW5nYnVmZmVyX2NsYXNzOworCisgIGdzdHJpbmdidWZmZXJfY2xhc3MgPSAoR3N0QXVkaW9SaW5nQnVmZmVyQ2xhc3MgKikga2xhc3M7CisKKyAgcmluZ19wYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGtsYXNzKTsKKworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5vcGVuX2RldmljZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2phY2tfcmluZ19idWZmZXJfb3Blbl9kZXZpY2UpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5jbG9zZV9kZXZpY2UgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX2Nsb3NlX2RldmljZSk7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPmFjcXVpcmUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX2FjcXVpcmUpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5yZWxlYXNlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfamFja19yaW5nX2J1ZmZlcl9yZWxlYXNlKTsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2phY2tfcmluZ19idWZmZXJfc3RhcnQpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5wYXVzZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfamFja19yaW5nX2J1ZmZlcl9wYXVzZSk7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPnJlc3VtZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfamFja19yaW5nX2J1ZmZlcl9zdGFydCk7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2phY2tfcmluZ19idWZmZXJfc3RvcCk7CisKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+ZGVsYXkgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2phY2tfcmluZ19idWZmZXJfZGVsYXkpOworfQorCisvKiB0aGlzIGlzIHRoZSBjYWxsYmFjayBvZiBqYWNrLiBUaGlzIHNob3VsZCBSVC1zYWZlLgorICovCitzdGF0aWMgaW50CitqYWNrX3Byb2Nlc3NfY2IgKGphY2tfbmZyYW1lc190IG5mcmFtZXMsIHZvaWQgKmFyZykKK3sKKyAgR3N0SmFja0F1ZGlvU2luayAqc2luazsKKyAgR3N0QXVkaW9SaW5nQnVmZmVyICpidWY7CisgIGdpbnQgcmVhZHNlZywgbGVuOworICBndWludDggKnJlYWRwdHI7CisgIGdpbnQgaSwgaiwgZmxlbiwgY2hhbm5lbHM7CisgIHNhbXBsZV90ICpkYXRhOworCisgIGJ1ZiA9IEdTVF9BVURJT19SSU5HX0JVRkZFUl9DQVNUIChhcmcpOworICBzaW5rID0gR1NUX0pBQ0tfQVVESU9fU0lOSyAoR1NUX09CSkVDVF9QQVJFTlQgKGJ1ZikpOworCisgIGNoYW5uZWxzID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZidWYtPnNwZWMuaW5mbyk7CisKKyAgLyogZ2V0IHRhcmdldCBidWZmZXJzICovCisgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisgICAgc2luay0+YnVmZmVyc1tpXSA9CisgICAgICAgIChzYW1wbGVfdCAqKSBqYWNrX3BvcnRfZ2V0X2J1ZmZlciAoc2luay0+cG9ydHNbaV0sIG5mcmFtZXMpOworICB9CisKKyAgaWYgKGdzdF9hdWRpb19yaW5nX2J1ZmZlcl9wcmVwYXJlX3JlYWQgKGJ1ZiwgJnJlYWRzZWcsICZyZWFkcHRyLCAmbGVuKSkgeworICAgIGZsZW4gPSBsZW4gLyBjaGFubmVsczsKKworICAgIC8qIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBtdXN0IGJlIGV4YWN0bHkgdGhlIHNlZ21lbnQgc2l6ZSAqLworICAgIGlmIChuZnJhbWVzICogc2l6ZW9mIChzYW1wbGVfdCkgIT0gZmxlbikKKyAgICAgIGdvdG8gd3Jvbmdfc2l6ZTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJjb3B5ICVkIGZyYW1lczogJXAsICVkIGJ5dGVzLCAlZCBjaGFubmVscyIsCisgICAgICAgIG5mcmFtZXMsIHJlYWRwdHIsIGZsZW4sIGNoYW5uZWxzKTsKKyAgICBkYXRhID0gKHNhbXBsZV90ICopIHJlYWRwdHI7CisKKyAgICAvKiB0aGUgc2FtcGxlcyBpbiB0aGUgcmluZ2J1ZmZlciBoYXZlIHRoZSBjaGFubmVscyBpbnRlcmxlYXZlZCwgd2UgbmVlZCB0bworICAgICAqIGRlaW50ZXJsZWF2ZSBpbnRvIHRoZSBqYWNrIHRhcmdldCBidWZmZXJzICovCisgICAgZm9yIChpID0gMDsgaSA8IG5mcmFtZXM7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgc2luay0+YnVmZmVyc1tqXVtpXSA9ICpkYXRhKys7CisgICAgICB9CisgICAgfQorCisgICAgLyogY2xlYXIgd3JpdHRlbiBzYW1wbGVzIGluIHRoZSByaW5nYnVmZmVyICovCisgICAgZ3N0X2F1ZGlvX3JpbmdfYnVmZmVyX2NsZWFyIChidWYsIHJlYWRzZWcpOworCisgICAgLyogd2Ugd3JvdGUgb25lIHNlZ21lbnQgKi8KKyAgICBnc3RfYXVkaW9fcmluZ19idWZmZXJfYWR2YW5jZSAoYnVmLCAxKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAid3JpdGUgJWQgZnJhbWVzIHNpbGVuY2UiLCBuZnJhbWVzKTsKKyAgICAvKiBXZSBhcmUgbm90IGFsbG93ZWQgdG8gcmVhZCBmcm9tIHRoZSByaW5nYnVmZmVyLCB3cml0ZSBzaWxlbmNlIHRvIGFsbAorICAgICAqIGphY2sgb3V0cHV0IGJ1ZmZlcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgeworICAgICAgbWVtc2V0IChzaW5rLT5idWZmZXJzW2ldLCAwLCBuZnJhbWVzICogc2l6ZW9mIChzYW1wbGVfdCkpOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX3NpemU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzaW5rLCAibmJ5dGVzICglZCkgIT0gZmxlbiAoJWQpIiwKKyAgICAgICAgKGdpbnQpIChuZnJhbWVzICogc2l6ZW9mIChzYW1wbGVfdCkpLCBmbGVuKTsKKyAgICByZXR1cm4gMTsKKyAgfQorfQorCisvKiB3ZSBlcnJvciBvdXQgKi8KK3N0YXRpYyBpbnQKK2phY2tfc2FtcGxlX3JhdGVfY2IgKGphY2tfbmZyYW1lc190IG5mcmFtZXMsIHZvaWQgKmFyZykKK3sKKyAgR3N0SmFja0F1ZGlvU2luayAqc2luazsKKyAgR3N0SmFja1JpbmdCdWZmZXIgKmFidWY7CisKKyAgYWJ1ZiA9IEdTVF9KQUNLX1JJTkdfQlVGRkVSX0NBU1QgKGFyZyk7CisgIHNpbmsgPSBHU1RfSkFDS19BVURJT19TSU5LIChHU1RfT0JKRUNUX1BBUkVOVCAoYXJnKSk7CisKKyAgaWYgKGFidWYtPnNhbXBsZV9yYXRlICE9IC0xICYmIGFidWYtPnNhbXBsZV9yYXRlICE9IG5mcmFtZXMpCisgICAgZ290byBub3Rfc3VwcG9ydGVkOworCisgIHJldHVybiAwOworCisgIC8qIEVSUk9SUyAqLworbm90X3N1cHBvcnRlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChOVUxMKSwgKCJKYWNrIGNoYW5nZWQgdGhlIHNhbXBsZSByYXRlLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIikpOworICAgIHJldHVybiAxOworICB9Cit9CisKKy8qIHdlIGVycm9yIG91dCAqLworc3RhdGljIGludAoramFja19idWZmZXJfc2l6ZV9jYiAoamFja19uZnJhbWVzX3QgbmZyYW1lcywgdm9pZCAqYXJnKQoreworICBHc3RKYWNrQXVkaW9TaW5rICpzaW5rOworICBHc3RKYWNrUmluZ0J1ZmZlciAqYWJ1ZjsKKworICBhYnVmID0gR1NUX0pBQ0tfUklOR19CVUZGRVJfQ0FTVCAoYXJnKTsKKyAgc2luayA9IEdTVF9KQUNLX0FVRElPX1NJTksgKEdTVF9PQkpFQ1RfUEFSRU5UIChhcmcpKTsKKworICBpZiAoYWJ1Zi0+YnVmZmVyX3NpemUgIT0gLTEgJiYgYWJ1Zi0+YnVmZmVyX3NpemUgIT0gbmZyYW1lcykKKyAgICBnb3RvIG5vdF9zdXBwb3J0ZWQ7CisKKyAgcmV0dXJuIDA7CisKKyAgLyogRVJST1JTICovCitub3Rfc3VwcG9ydGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNpbmssIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKE5VTEwpLCAoIkphY2sgY2hhbmdlZCB0aGUgYnVmZmVyIHNpemUsIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQiKSk7CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2phY2tfc2h1dGRvd25fY2IgKHZvaWQgKmFyZykKK3sKKyAgR3N0SmFja0F1ZGlvU2luayAqc2luazsKKworICBzaW5rID0gR1NUX0pBQ0tfQVVESU9fU0lOSyAoR1NUX09CSkVDVF9QQVJFTlQgKGFyZykpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJzaHV0ZG93biIpOworCisgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgTk9UX0ZPVU5ELAorICAgICAgKE5VTEwpLCAoIkphY2sgc2VydmVyIHNodXRkb3duIikpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2phY2tfcmluZ19idWZmZXJfaW5pdCAoR3N0SmFja1JpbmdCdWZmZXIgKiBidWYsCisgICAgR3N0SmFja1JpbmdCdWZmZXJDbGFzcyAqIGdfY2xhc3MpCit7CisgIGJ1Zi0+Y2hhbm5lbHMgPSAtMTsKKyAgYnVmLT5idWZmZXJfc2l6ZSA9IC0xOworICBidWYtPnNhbXBsZV9yYXRlID0gLTE7Cit9CisKKy8qIHRoZSBfb3Blbl9kZXZpY2UgbWV0aG9kIHNob3VsZCBtYWtlIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBzZXJ2ZXIKKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfamFja19yaW5nX2J1ZmZlcl9vcGVuX2RldmljZSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RKYWNrQXVkaW9TaW5rICpzaW5rOworICBqYWNrX3N0YXR1c190IHN0YXR1cyA9IDA7CisgIGNvbnN0IGdjaGFyICpuYW1lOworCisgIHNpbmsgPSBHU1RfSkFDS19BVURJT19TSU5LIChHU1RfT0JKRUNUX1BBUkVOVCAoYnVmKSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgIm9wZW4iKTsKKworICBpZiAoc2luay0+Y2xpZW50X25hbWUpIHsKKyAgICBuYW1lID0gc2luay0+Y2xpZW50X25hbWU7CisgIH0gZWxzZSB7CisgICAgbmFtZSA9IGdfZ2V0X2FwcGxpY2F0aW9uX25hbWUgKCk7CisgIH0KKyAgaWYgKCFuYW1lKQorICAgIG5hbWUgPSAiR1N0cmVhbWVyIjsKKworICBzaW5rLT5jbGllbnQgPSBnc3RfamFja19hdWRpb19jbGllbnRfbmV3IChuYW1lLCBzaW5rLT5zZXJ2ZXIsCisgICAgICBzaW5rLT5qY2xpZW50LAorICAgICAgR1NUX0pBQ0tfQ0xJRU5UX1NJTkssCisgICAgICBqYWNrX3NodXRkb3duX2NiLAorICAgICAgamFja19wcm9jZXNzX2NiLCBqYWNrX2J1ZmZlcl9zaXplX2NiLCBqYWNrX3NhbXBsZV9yYXRlX2NiLCBidWYsICZzdGF0dXMpOworICBpZiAoc2luay0+Y2xpZW50ID09IE5VTEwpCisgICAgZ290byBjb3VsZF9ub3Rfb3BlbjsKKworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAib3BlbmVkIik7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitjb3VsZF9ub3Rfb3BlbjoKKyAgeworICAgIGlmIChzdGF0dXMgJiBKYWNrU2VydmVyRmFpbGVkKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2luaywgUkVTT1VSQ0UsIE5PVF9GT1VORCwKKyAgICAgICAgICAoXygiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIikpLAorICAgICAgICAgICgiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIEphY2sgc2VydmVyIChzdGF0dXMgJWQpIiwgc3RhdHVzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgT1BFTl9XUklURSwKKyAgICAgICAgICAoTlVMTCksICgiSmFjayBjbGllbnQgb3BlbiBlcnJvciAoc3RhdHVzICVkKSIsIHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogY2xvc2UgdGhlIGNvbm5lY3Rpb24gd2l0aCB0aGUgc2VydmVyCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2phY2tfcmluZ19idWZmZXJfY2xvc2VfZGV2aWNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdEphY2tBdWRpb1NpbmsgKnNpbms7CisKKyAgc2luayA9IEdTVF9KQUNLX0FVRElPX1NJTksgKEdTVF9PQkpFQ1RfUEFSRU5UIChidWYpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiY2xvc2UiKTsKKworICBnc3RfamFja19hdWRpb19zaW5rX2ZyZWVfY2hhbm5lbHMgKHNpbmspOworICBnc3RfamFja19hdWRpb19jbGllbnRfZnJlZSAoc2luay0+Y2xpZW50KTsKKyAgc2luay0+Y2xpZW50ID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogYWxsb2NhdGUgYSBidWZmZXIgYW5kIHNldHVwIHJlc291cmNlcyB0byBwcm9jZXNzIHRoZSBhdWRpbyBzYW1wbGVzIG9mCisgKiB0aGUgZm9ybWF0IGFzIHNwZWNpZmllZCBpbiBAc3BlYy4KKyAqCisgKiBXZSBhbGxvY2F0ZSBOIGphY2sgcG9ydHMsIG9uZSBmb3IgZWFjaCBjaGFubmVsLiBJZiB3ZSBhcmUgYXNrZWQgdG8KKyAqIGF1dG9tYXRpY2FsbHkgbWFrZSBhIGNvbm5lY3Rpb24gd2l0aCBwaHlzaWNhbCBwb3J0cywgd2UgY29ubmVjdCBhcyBtYW55CisgKiBwb3J0cyBhcyB0aGVyZSBhcmUgcGh5c2ljYWwgcG9ydHMsIGxlYXZpbmcgbGVmdG92ZXIgcG9ydHMgdW5jb25uZWN0ZWQuCisgKgorICogSXQgaXMgYXNzdW1lZCB0aGF0IHNhbXBsZXJhdGUgYW5kIG51bWJlciBvZiBjaGFubmVscyBhcmUgYWNjZXB0YWJsZSBzaW5jZSBvdXIKKyAqIGdldGNhcHMgbWV0aG9kIHdpbGwgYWx3YXlzIHByb3ZpZGUgY29ycmVjdCB2YWx1ZXMuIElmIHVuYWNjZXB0YWJsZSBjYXBzIGFyZQorICogcmVjZWl2ZWQgZm9yIHNvbWUgcmVhc29uLCB3ZSBmYWlsIGhlcmUuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2phY2tfcmluZ19idWZmZXJfYWNxdWlyZSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmLAorICAgIEdzdEF1ZGlvUmluZ0J1ZmZlclNwZWMgKiBzcGVjKQoreworICBHc3RKYWNrQXVkaW9TaW5rICpzaW5rOworICBHc3RKYWNrUmluZ0J1ZmZlciAqYWJ1ZjsKKyAgY29uc3QgY2hhciAqKnBvcnRzOworICBnaW50IHNhbXBsZV9yYXRlLCBidWZmZXJfc2l6ZTsKKyAgZ2ludCBpLCByYXRlLCBicGYsIGNoYW5uZWxzLCByZXM7CisgIGphY2tfY2xpZW50X3QgKmNsaWVudDsKKworICBzaW5rID0gR1NUX0pBQ0tfQVVESU9fU0lOSyAoR1NUX09CSkVDVF9QQVJFTlQgKGJ1ZikpOworICBhYnVmID0gR1NUX0pBQ0tfUklOR19CVUZGRVJfQ0FTVCAoYnVmKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiYWNxdWlyZSIpOworCisgIGNsaWVudCA9IGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9nZXRfY2xpZW50IChzaW5rLT5jbGllbnQpOworCisgIHJhdGUgPSBHU1RfQVVESU9fSU5GT19SQVRFICgmc3BlYy0+aW5mbyk7CisKKyAgLyogc2FtcGxlIHJhdGUgbXVzdCBiZSB0aGF0IG9mIHRoZSBzZXJ2ZXIgKi8KKyAgc2FtcGxlX3JhdGUgPSBqYWNrX2dldF9zYW1wbGVfcmF0ZSAoY2xpZW50KTsKKyAgaWYgKHNhbXBsZV9yYXRlICE9IHJhdGUpCisgICAgZ290byB3cm9uZ19zYW1wbGVyYXRlOworCisgIGNoYW5uZWxzID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZzcGVjLT5pbmZvKTsKKyAgYnBmID0gR1NUX0FVRElPX0lORk9fQlBGICgmc3BlYy0+aW5mbyk7CisKKyAgaWYgKCFnc3RfamFja19hdWRpb19zaW5rX2FsbG9jYXRlX2NoYW5uZWxzIChzaW5rLCBjaGFubmVscykpCisgICAgZ290byBvdXRfb2ZfcG9ydHM7CisKKyAgYnVmZmVyX3NpemUgPSBqYWNrX2dldF9idWZmZXJfc2l6ZSAoY2xpZW50KTsKKworICAvKiB0aGUgc2VnbWVudCBzaXplIGluIGJ5dGVzLCB0aGlzIGlzIGxhcmdlIGVub3VnaCB0byBob2xkIGEgYnVmZmVyIG9mIDMyYml0IGZsb2F0cworICAgKiBmb3IgYWxsIGNoYW5uZWxzICAqLworICBzcGVjLT5zZWdzaXplID0gYnVmZmVyX3NpemUgKiBzaXplb2YgKGdmbG9hdCkgKiBjaGFubmVsczsKKyAgc3BlYy0+bGF0ZW5jeV90aW1lID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzcGVjLT5zZWdzaXplLAorICAgICAgKEdTVF9TRUNPTkQgLyBHU1RfVVNFQ09ORCksIHJhdGUgKiBicGYpOworICAvKiBzZWd0b3RhbCBiYXNlZCBvbiBidWZmZXItdGltZSBsYXRlbmN5ICovCisgIHNwZWMtPnNlZ3RvdGFsID0gc3BlYy0+YnVmZmVyX3RpbWUgLyBzcGVjLT5sYXRlbmN5X3RpbWU7CisgIGlmIChzcGVjLT5zZWd0b3RhbCA8IDIpIHsKKyAgICBzcGVjLT5zZWd0b3RhbCA9IDI7CisgICAgc3BlYy0+YnVmZmVyX3RpbWUgPSBzcGVjLT5sYXRlbmN5X3RpbWUgKiBzcGVjLT5zZWd0b3RhbDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJidWZmZXIgdGltZTogJSIgR19HSU5UNjRfRk9STUFUICIgdXNlYyIsCisgICAgICBzcGVjLT5idWZmZXJfdGltZSk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJsYXRlbmN5IHRpbWU6ICUiIEdfR0lOVDY0X0ZPUk1BVCAiIHVzZWMiLAorICAgICAgc3BlYy0+bGF0ZW5jeV90aW1lKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgImJ1ZmZlcl9zaXplICVkLCBzZWdzaXplICVkLCBzZWd0b3RhbCAlZCIsCisgICAgICBidWZmZXJfc2l6ZSwgc3BlYy0+c2Vnc2l6ZSwgc3BlYy0+c2VndG90YWwpOworCisgIC8qIGFsbG9jYXRlIHRoZSByaW5nYnVmZmVyIG1lbW9yeSBub3cgKi8KKyAgYnVmLT5zaXplID0gc3BlYy0+c2VndG90YWwgKiBzcGVjLT5zZWdzaXplOworICBidWYtPm1lbW9yeSA9IGdfbWFsbG9jMCAoYnVmLT5zaXplKTsKKworICBpZiAoKHJlcyA9IGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9zZXRfYWN0aXZlIChzaW5rLT5jbGllbnQsIFRSVUUpKSkKKyAgICBnb3RvIGNvdWxkX25vdF9hY3RpdmF0ZTsKKworICAvKiBpZiB3ZSBuZWVkIHRvIGF1dG9tYXRpY2FsbHkgY29ubmVjdCB0aGUgcG9ydHMsIGRvIHNvIG5vdy4gV2UgbXVzdCBkbyB0aGlzCisgICAqIGFmdGVyIGFjdGl2YXRpbmcgdGhlIGNsaWVudC4gKi8KKyAgaWYgKHNpbmstPmNvbm5lY3QgPT0gR1NUX0pBQ0tfQ09OTkVDVF9BVVRPCisgICAgICB8fCBzaW5rLT5jb25uZWN0ID09IEdTVF9KQUNLX0NPTk5FQ1RfQVVUT19GT1JDRUQpIHsKKyAgICAvKiBmaW5kIGFsbCB0aGUgcGh5c2ljYWwgaW5wdXQgcG9ydHMuIEEgcGh5c2ljYWwgaW5wdXQgcG9ydCBpcyBhIHBvcnQKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggYSBoYXJkd2FyZSBkZXZpY2UuIFNvbWVvbmUgbmVlZHMgY29ubmVjdCB0byBhIHBoeXNpY2FsCisgICAgICogcG9ydCBpbiBvcmRlciB0byBoZWFyIHNvbWV0aGluZy4gKi8KKyAgICBpZiAoc2luay0+cG9ydF9wYXR0ZXJuID09IE5VTEwpIHsKKyAgICAgIHBvcnRzID0gamFja19nZXRfcG9ydHMgKGNsaWVudCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICBKYWNrUG9ydElzUGh5c2ljYWwgfCBKYWNrUG9ydElzSW5wdXQpOworICAgIH0gZWxzZSB7CisgICAgICBwb3J0cyA9IGphY2tfZ2V0X3BvcnRzIChjbGllbnQsIHNpbmstPnBvcnRfcGF0dGVybiwgTlVMTCwKKyAgICAgICAgICBKYWNrUG9ydElzSW5wdXQpOworICAgIH0KKyAgICBpZiAocG9ydHMgPT0gTlVMTCkgeworICAgICAgLyogbm8gcG9ydHM/IGZpbmUgdGhlbiB3ZSBkb24ndCBkbyBhbnl0aGluZyBleGNlcHQgZm9yIHBvc3RpbmcgYSB3YXJuaW5nCisgICAgICAgKiBtZXNzYWdlLiAqLworICAgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoc2luaywgUkVTT1VSQ0UsIE5PVF9GT1VORCwgKE5VTEwpLAorICAgICAgICAgICgiTm8gcGh5c2ljYWwgaW5wdXQgcG9ydHMgZm91bmQsIGxlYXZpbmcgcG9ydHMgdW5jb25uZWN0ZWQiKSk7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKKyAgICAgIC8qIHN0b3Agd2hlbiBhbGwgaW5wdXQgcG9ydHMgYXJlIGV4aGF1c3RlZCAqLworICAgICAgaWYgKHBvcnRzW2ldID09IE5VTEwpIHsKKyAgICAgICAgLyogcG9zdCBhIHdhcm5pbmcgdGhhdCB3ZSBjb3VsZCBub3QgY29ubmVjdCBhbGwgcG9ydHMgKi8KKyAgICAgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoc2luaywgUkVTT1VSQ0UsIE5PVF9GT1VORCwgKE5VTEwpLAorICAgICAgICAgICAgKCJObyBtb3JlIHBoeXNpY2FsIHBvcnRzLCBsZWF2aW5nIHNvbWUgcG9ydHMgdW5jb25uZWN0ZWQiKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgInRyeSBjb25uZWN0aW5nIHRvICVzIiwKKyAgICAgICAgICBqYWNrX3BvcnRfbmFtZSAoc2luay0+cG9ydHNbaV0pKTsKKyAgICAgIC8qIGNvbm5lY3QgdGhlIHBvcnQgdG8gYSBwaHlzaWNhbCBwb3J0ICovCisgICAgICByZXMgPSBqYWNrX2Nvbm5lY3QgKGNsaWVudCwgamFja19wb3J0X25hbWUgKHNpbmstPnBvcnRzW2ldKSwgcG9ydHNbaV0pOworICAgICAgaWYgKHJlcyAhPSAwICYmIHJlcyAhPSBFRVhJU1QpCisgICAgICAgIGdvdG8gY2Fubm90X2Nvbm5lY3Q7CisgICAgfQorICAgIGZyZWUgKHBvcnRzKTsKKyAgfQorZG9uZToKKworICBhYnVmLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworICBhYnVmLT5idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplOworICBhYnVmLT5jaGFubmVscyA9IGNoYW5uZWxzOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLword3Jvbmdfc2FtcGxlcmF0ZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJXcm9uZyBzYW1wbGVyYXRlLCBzZXJ2ZXIgaXMgcnVubmluZyBhdCAlZCBhbmQgd2UgcmVjZWl2ZWQgJWQiLAorICAgICAgICAgICAgc2FtcGxlX3JhdGUsIHJhdGUpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK291dF9vZl9wb3J0czoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJDYW5ub3QgYWxsb2NhdGUgbW9yZSBKYWNrIHBvcnRzIikpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorY291bGRfbm90X2FjdGl2YXRlOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNpbmssIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCBhY3RpdmF0ZSBjbGllbnQgKCVkOiVzKSIsIHJlcywgZ19zdHJlcnJvciAocmVzKSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorY2Fubm90X2Nvbm5lY3Q6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2luaywgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiQ291bGQgbm90IGNvbm5lY3Qgb3V0cHV0IHBvcnRzIHRvIHBoeXNpY2FsIHBvcnRzICglZDolcykiLAorICAgICAgICAgICAgcmVzLCBnX3N0cmVycm9yIChyZXMpKSk7CisgICAgZnJlZSAocG9ydHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKiBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBMT0NLICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9qYWNrX3JpbmdfYnVmZmVyX3JlbGVhc2UgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0SmFja0F1ZGlvU2luayAqc2luazsKKyAgR3N0SmFja1JpbmdCdWZmZXIgKmFidWY7CisgIGdpbnQgcmVzOworCisgIGFidWYgPSBHU1RfSkFDS19SSU5HX0JVRkZFUl9DQVNUIChidWYpOworICBzaW5rID0gR1NUX0pBQ0tfQVVESU9fU0lOSyAoR1NUX09CSkVDVF9QQVJFTlQgKGJ1ZikpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJyZWxlYXNlIik7CisKKyAgaWYgKChyZXMgPSBnc3RfamFja19hdWRpb19jbGllbnRfc2V0X2FjdGl2ZSAoc2luay0+Y2xpZW50LCBGQUxTRSkpKSB7CisgICAgLyogd2Ugb25seSB3YXJuLCB0aGlzIG1lYW5zIHRoZSBzZXJ2ZXIgaXMgcHJvYmFibHkgc2h1dCBkb3duIGFuZCB0aGUgY2xpZW50CisgICAgICogaXMgZ29uZSBhbnl3YXkuICovCisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoc2luaywgUkVTT1VSQ0UsIENMT1NFLCAoTlVMTCksCisgICAgICAgICgiQ291bGQgbm90IGRlYWN0aXZhdGUgSmFjayBjbGllbnQgKCVkKSIsIHJlcykpOworICB9CisKKyAgYWJ1Zi0+Y2hhbm5lbHMgPSAtMTsKKyAgYWJ1Zi0+YnVmZmVyX3NpemUgPSAtMTsKKyAgYWJ1Zi0+c2FtcGxlX3JhdGUgPSAtMTsKKworICAvKiBmcmVlIHRoZSBidWZmZXIgKi8KKyAgZ19mcmVlIChidWYtPm1lbW9yeSk7CisgIGJ1Zi0+bWVtb3J5ID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfamFja19yaW5nX2J1ZmZlcl9zdGFydCAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RKYWNrQXVkaW9TaW5rICpzaW5rOworCisgIHNpbmsgPSBHU1RfSkFDS19BVURJT19TSU5LIChHU1RfT0JKRUNUX1BBUkVOVCAoYnVmKSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgInN0YXJ0Iik7CisKKyAgaWYgKHNpbmstPnRyYW5zcG9ydCAmIEdTVF9KQUNLX1RSQU5TUE9SVF9NQVNURVIpIHsKKyAgICBqYWNrX2NsaWVudF90ICpjbGllbnQ7CisKKyAgICBjbGllbnQgPSBnc3RfamFja19hdWRpb19jbGllbnRfZ2V0X2NsaWVudCAoc2luay0+Y2xpZW50KTsKKyAgICBqYWNrX3RyYW5zcG9ydF9zdGFydCAoY2xpZW50KTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9qYWNrX3JpbmdfYnVmZmVyX3BhdXNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdEphY2tBdWRpb1NpbmsgKnNpbms7CisKKyAgc2luayA9IEdTVF9KQUNLX0FVRElPX1NJTksgKEdTVF9PQkpFQ1RfUEFSRU5UIChidWYpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAicGF1c2UiKTsKKworICBpZiAoc2luay0+dHJhbnNwb3J0ICYgR1NUX0pBQ0tfVFJBTlNQT1JUX01BU1RFUikgeworICAgIGphY2tfY2xpZW50X3QgKmNsaWVudDsKKworICAgIGNsaWVudCA9IGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9nZXRfY2xpZW50IChzaW5rLT5jbGllbnQpOworICAgIGphY2tfdHJhbnNwb3J0X3N0b3AgKGNsaWVudCk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfamFja19yaW5nX2J1ZmZlcl9zdG9wIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdEphY2tBdWRpb1NpbmsgKnNpbms7CisKKyAgc2luayA9IEdTVF9KQUNLX0FVRElPX1NJTksgKEdTVF9PQkpFQ1RfUEFSRU5UIChidWYpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic3RvcCIpOworCisgIGlmIChzaW5rLT50cmFuc3BvcnQgJiBHU1RfSkFDS19UUkFOU1BPUlRfTUFTVEVSKSB7CisgICAgamFja19jbGllbnRfdCAqY2xpZW50OworCisgICAgY2xpZW50ID0gZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF9jbGllbnQgKHNpbmstPmNsaWVudCk7CisgICAgamFja190cmFuc3BvcnRfc3RvcCAoY2xpZW50KTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjaWYgZGVmaW5lZCAoSEFWRV9KQUNLXzBfMTIwXzEpIHx8IGRlZmluZWQoSEFWRV9KQUNLXzFfOV83KQorc3RhdGljIGd1aW50Citnc3RfamFja19yaW5nX2J1ZmZlcl9kZWxheSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RKYWNrQXVkaW9TaW5rICpzaW5rOworICBndWludCBpLCByZXMgPSAwOworICBqYWNrX2xhdGVuY3lfcmFuZ2VfdCByYW5nZTsKKworICBzaW5rID0gR1NUX0pBQ0tfQVVESU9fU0lOSyAoR1NUX09CSkVDVF9QQVJFTlQgKGJ1ZikpOworCisgIGZvciAoaSA9IDA7IGkgPCBzaW5rLT5wb3J0X2NvdW50OyBpKyspIHsKKyAgICBqYWNrX3BvcnRfZ2V0X2xhdGVuY3lfcmFuZ2UgKHNpbmstPnBvcnRzW2ldLCBKYWNrUGxheWJhY2tMYXRlbmN5LCAmcmFuZ2UpOworICAgIGlmIChyYW5nZS5tYXggPiByZXMpCisgICAgICByZXMgPSByYW5nZS5tYXg7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoc2luaywgImRlbGF5ICV1IiwgcmVzKTsKKworICByZXR1cm4gcmVzOworfQorI2Vsc2UgLyogIShkZWZpbmVkIChIQVZFX0pBQ0tfMF8xMjBfMSkgfHwgZGVmaW5lZChIQVZFX0pBQ0tfMV85XzcpKSAqLworc3RhdGljIGd1aW50Citnc3RfamFja19yaW5nX2J1ZmZlcl9kZWxheSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RKYWNrQXVkaW9TaW5rICpzaW5rOworICBndWludCBpLCByZXMgPSAwOworICBndWludCBsYXRlbmN5OworICBqYWNrX2NsaWVudF90ICpjbGllbnQ7CisKKyAgc2luayA9IEdTVF9KQUNLX0FVRElPX1NJTksgKEdTVF9PQkpFQ1RfUEFSRU5UIChidWYpKTsKKyAgY2xpZW50ID0gZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF9jbGllbnQgKHNpbmstPmNsaWVudCk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpbmstPnBvcnRfY291bnQ7IGkrKykgeworICAgIGxhdGVuY3kgPSBqYWNrX3BvcnRfZ2V0X3RvdGFsX2xhdGVuY3kgKGNsaWVudCwgc2luay0+cG9ydHNbaV0pOworICAgIGlmIChsYXRlbmN5ID4gcmVzKQorICAgICAgcmVzID0gbGF0ZW5jeTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChzaW5rLCAiZGVsYXkgJXUiLCByZXMpOworCisgIHJldHVybiByZXM7Cit9CisjZW5kaWYKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGphY2thdWRpb3Npbmtfc2lua19mYWN0b3J5ID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9KQUNLX0ZPUk1BVF9TVFIgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgTUFYIF0iKQorICAgICk7CisKKy8qIEF1ZGlvU2luayBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgU0lHTkFMX0xBU1QKK307CisKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0NPTk5FQ1QgCQlHU1RfSkFDS19DT05ORUNUX0FVVE8KKyNkZWZpbmUgREVGQVVMVF9QUk9QX1NFUlZFUiAJCU5VTEwKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0NMSUVOVF9OQU1FCU5VTEwKKyNkZWZpbmUgREVGQVVMVF9QUk9QX1BPUlRfUEFUVEVSTiAgICAgIAlOVUxMCisjZGVmaW5lIERFRkFVTFRfUFJPUF9UUkFOU1BPUlQJR1NUX0pBQ0tfVFJBTlNQT1JUX0FVVE9OT01PVVMKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQ09OTkVDVCwKKyAgUFJPUF9TRVJWRVIsCisgIFBST1BfQ0xJRU5ULAorICBQUk9QX0NMSUVOVF9OQU1FLAorICBQUk9QX1BPUlRfUEFUVEVSTiwKKyAgUFJPUF9UUkFOU1BPUlQsCisgIFBST1BfTEFTVAorfTsKKworI2RlZmluZSBnc3RfamFja19hdWRpb19zaW5rX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdEphY2tBdWRpb1NpbmssIGdzdF9qYWNrX2F1ZGlvX3NpbmssIEdTVF9UWVBFX0FVRElPX0JBU0VfU0lOSyk7CisKK3N0YXRpYyB2b2lkIGdzdF9qYWNrX2F1ZGlvX3NpbmtfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3RfamFja19hdWRpb19zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9qYWNrX2F1ZGlvX3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0Q2FwcyAqZ3N0X2phY2tfYXVkaW9fc2lua19nZXRjYXBzIChHc3RCYXNlU2luayAqIGJzaW5rLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIEdzdEF1ZGlvUmluZ0J1ZmZlcgorICAgICogZ3N0X2phY2tfYXVkaW9fc2lua19jcmVhdGVfcmluZ2J1ZmZlciAoR3N0QXVkaW9CYXNlU2luayAqIHNpbmspOworCitzdGF0aWMgdm9pZAorZ3N0X2phY2tfYXVkaW9fc2lua19jbGFzc19pbml0IChHc3RKYWNrQXVkaW9TaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VTaW5rQ2xhc3MgKmdzdGJhc2VzaW5rX2NsYXNzOworICBHc3RBdWRpb0Jhc2VTaW5rQ2xhc3MgKmdzdGF1ZGlvYmFzZXNpbmtfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9qYWNrX2F1ZGlvX3NpbmtfZGVidWcsICJqYWNrc2luayIsIDAsCisgICAgICAiamFja3NpbmsgZWxlbWVudCIpOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MgPSAoR3N0QmFzZVNpbmtDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YXVkaW9iYXNlc2lua19jbGFzcyA9IChHc3RBdWRpb0Jhc2VTaW5rQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9qYWNrX2F1ZGlvX3NpbmtfZGlzcG9zZTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2phY2tfYXVkaW9fc2lua19nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9qYWNrX2F1ZGlvX3Npbmtfc2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ09OTkVDVCwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgiY29ubmVjdCIsICJDb25uZWN0IiwKKyAgICAgICAgICAiU3BlY2lmeSBob3cgdGhlIG91dHB1dCBwb3J0cyB3aWxsIGJlIGNvbm5lY3RlZCIsCisgICAgICAgICAgR1NUX1RZUEVfSkFDS19DT05ORUNULCBERUZBVUxUX1BST1BfQ09OTkVDVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NFUlZFUiwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJzZXJ2ZXIiLCAiU2VydmVyIiwKKyAgICAgICAgICAiVGhlIEphY2sgc2VydmVyIHRvIGNvbm5lY3QgdG8gKE5VTEwgPSBkZWZhdWx0KSIsCisgICAgICAgICAgREVGQVVMVF9QUk9QX1NFUlZFUiwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdEphY2tBdWRpb1Npbms6Y2xpZW50LW5hbWU6CisgICAqCisgICAqIFRoZSBjbGllbnQgbmFtZSB0byB1c2UuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NMSUVOVF9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImNsaWVudC1uYW1lIiwgIkNsaWVudCBuYW1lIiwKKyAgICAgICAgICAiVGhlIGNsaWVudCBuYW1lIG9mIHRoZSBKYWNrIGluc3RhbmNlIChOVUxMID0gZGVmYXVsdCkiLAorICAgICAgICAgIERFRkFVTFRfUFJPUF9DTElFTlRfTkFNRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NMSUVOVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoImNsaWVudCIsICJKYWNrQ2xpZW50IiwgIkhhbmRsZSBmb3IgamFjayBjbGllbnQiLAorICAgICAgICAgIEdTVF9UWVBFX0pBQ0tfQ0xJRU5ULAorICAgICAgICAgIEdTVF9QQVJBTV9NVVRBQkxFX1JFQURZIHwgR19QQVJBTV9SRUFEV1JJVEUgfAorICAgICAgICAgIEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAgLyoqCisgICAqIEdzdEphY2tBdWRpb1Npbms6cG9ydC1wYXR0ZXJuCisgICAqCisgICAqIGF1dG9jb25uZWN0IHRvIHBvcnRzIG1hdGNoaW5nIHBhdHRlcm4sIHdoZW4gTlVMTCBjb25uZWN0IHRvIHBoeXNpY2FsIHBvcnRzCisgICAqCisgICAqIFNpbmNlOiAxLjYKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUE9SVF9QQVRURVJOLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInBvcnQtcGF0dGVybiIsICJwb3J0IHBhdHRlcm4iLAorICAgICAgICAgICJBIHBhdHRlcm4gdG8gc2VsZWN0IHdoaWNoIHBvcnRzIHRvIGNvbm5lY3QgdG8gKE5VTEwgPSBmaXJzdCBwaHlzaWNhbCBwb3J0cykiLAorICAgICAgICAgIERFRkFVTFRfUFJPUF9QT1JUX1BBVFRFUk4sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdEphY2tBdWRpb1Npbms6dHJhbnNwb3J0OgorICAgKgorICAgKiBUaGUgamFjayB0cmFuc3BvcnQgYmVoYXZpb3VyIGZvciB0aGUgY2xpZW50LgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UUkFOU1BPUlQsCisgICAgICBnX3BhcmFtX3NwZWNfZmxhZ3MgKCJ0cmFuc3BvcnQiLCAiVHJhbnNwb3J0IG1vZGUiLAorICAgICAgICAgICJKYWNrIHRyYW5zcG9ydCBiZWhhdmlvdXIgb2YgdGhlIGNsaWVudCIsCisgICAgICAgICAgR1NUX1RZUEVfSkFDS19UUkFOU1BPUlQsIERFRkFVTFRfUFJPUF9UUkFOU1BPUlQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkF1ZGlvIFNpbmsgKEphY2spIiwKKyAgICAgICJTaW5rL0F1ZGlvIiwgIk91dHB1dCBhdWRpbyB0byBhIEpBQ0sgc2VydmVyIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmphY2thdWRpb3Npbmtfc2lua19mYWN0b3J5KTsKKworICBnc3RiYXNlc2lua19jbGFzcy0+Z2V0X2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2phY2tfYXVkaW9fc2lua19nZXRjYXBzKTsKKworICBnc3RhdWRpb2Jhc2VzaW5rX2NsYXNzLT5jcmVhdGVfcmluZ2J1ZmZlciA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2phY2tfYXVkaW9fc2lua19jcmVhdGVfcmluZ2J1ZmZlcik7CisKKyAgLyogcmVmIGNsYXNzIGZyb20gYSB0aHJlYWQtc2FmZSBjb250ZXh0IHRvIHdvcmsgYXJvdW5kIG1pc3NpbmcgYml0IG9mCisgICAqIHRocmVhZC1zYWZldHkgaW4gR09iamVjdCAqLworICBnX3R5cGVfY2xhc3NfcmVmIChHU1RfVFlQRV9KQUNLX1JJTkdfQlVGRkVSKTsKKworICBnc3RfamFja19hdWRpb19jbGllbnRfaW5pdCAoKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9qYWNrX2F1ZGlvX3NpbmtfaW5pdCAoR3N0SmFja0F1ZGlvU2luayAqIHNpbmspCit7CisgIHNpbmstPmNvbm5lY3QgPSBERUZBVUxUX1BST1BfQ09OTkVDVDsKKyAgc2luay0+c2VydmVyID0gZ19zdHJkdXAgKERFRkFVTFRfUFJPUF9TRVJWRVIpOworICBzaW5rLT5qY2xpZW50ID0gTlVMTDsKKyAgc2luay0+cG9ydHMgPSBOVUxMOworICBzaW5rLT5wb3J0X2NvdW50ID0gMDsKKyAgc2luay0+YnVmZmVycyA9IE5VTEw7CisgIHNpbmstPmNsaWVudF9uYW1lID0gZ19zdHJkdXAgKERFRkFVTFRfUFJPUF9DTElFTlRfTkFNRSk7CisgIHNpbmstPnRyYW5zcG9ydCA9IERFRkFVTFRfUFJPUF9UUkFOU1BPUlQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfamFja19hdWRpb19zaW5rX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEphY2tBdWRpb1NpbmsgKnNpbmsgPSBHU1RfSkFDS19BVURJT19TSU5LIChvYmplY3QpOworCisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzaW5rLT5jYXBzLCBOVUxMKTsKKworICBpZiAoc2luay0+Y2xpZW50X25hbWUgIT0gTlVMTCkgeworICAgIGdfZnJlZSAoc2luay0+Y2xpZW50X25hbWUpOworICAgIHNpbmstPmNsaWVudF9uYW1lID0gTlVMTDsKKyAgfQorCisgIGlmIChzaW5rLT5wb3J0X3BhdHRlcm4gIT0gTlVMTCkgeworICAgIGdfZnJlZSAoc2luay0+cG9ydF9wYXR0ZXJuKTsKKyAgICBzaW5rLT5wb3J0X3BhdHRlcm4gPSBOVUxMOworICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfamFja19hdWRpb19zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RKYWNrQXVkaW9TaW5rICpzaW5rOworCisgIHNpbmsgPSBHU1RfSkFDS19BVURJT19TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DTElFTlRfTkFNRToKKyAgICAgIGdfZnJlZSAoc2luay0+Y2xpZW50X25hbWUpOworICAgICAgc2luay0+Y2xpZW50X25hbWUgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QT1JUX1BBVFRFUk46CisgICAgICBnX2ZyZWUgKHNpbmstPnBvcnRfcGF0dGVybik7CisgICAgICBzaW5rLT5wb3J0X3BhdHRlcm4gPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT05ORUNUOgorICAgICAgc2luay0+Y29ubmVjdCA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TRVJWRVI6CisgICAgICBnX2ZyZWUgKHNpbmstPnNlcnZlcik7CisgICAgICBzaW5rLT5zZXJ2ZXIgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTElFTlQ6CisgICAgICBpZiAoR1NUX1NUQVRFIChzaW5rKSA9PSBHU1RfU1RBVEVfTlVMTCB8fAorICAgICAgICAgIEdTVF9TVEFURSAoc2luaykgPT0gR1NUX1NUQVRFX1JFQURZKSB7CisgICAgICAgIHNpbmstPmpjbGllbnQgPSBnX3ZhbHVlX2dldF9ib3hlZCAodmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RSQU5TUE9SVDoKKyAgICAgIHNpbmstPnRyYW5zcG9ydCA9IGdfdmFsdWVfZ2V0X2ZsYWdzICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfamFja19hdWRpb19zaW5rX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RKYWNrQXVkaW9TaW5rICpzaW5rOworCisgIHNpbmsgPSBHU1RfSkFDS19BVURJT19TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DTElFTlRfTkFNRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNpbmstPmNsaWVudF9uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QT1JUX1BBVFRFUk46CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzaW5rLT5wb3J0X3BhdHRlcm4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NPTk5FQ1Q6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgc2luay0+Y29ubmVjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0VSVkVSOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc2luay0+c2VydmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTElFTlQ6CisgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIHNpbmstPmpjbGllbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RSQU5TUE9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ZsYWdzICh2YWx1ZSwgc2luay0+dHJhbnNwb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2phY2tfYXVkaW9fc2lua19nZXRjYXBzIChHc3RCYXNlU2luayAqIGJzaW5rLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RKYWNrQXVkaW9TaW5rICpzaW5rID0gR1NUX0pBQ0tfQVVESU9fU0lOSyAoYnNpbmspOworICBjb25zdCBjaGFyICoqcG9ydHM7CisgIGdpbnQgbWluLCBtYXg7CisgIGdpbnQgcmF0ZTsKKyAgamFja19jbGllbnRfdCAqY2xpZW50OworCisgIGlmIChzaW5rLT5jbGllbnQgPT0gTlVMTCkKKyAgICBnb3RvIG5vX2NsaWVudDsKKworICBjbGllbnQgPSBnc3RfamFja19hdWRpb19jbGllbnRfZ2V0X2NsaWVudCAoc2luay0+Y2xpZW50KTsKKworICBpZiAoc2luay0+Y29ubmVjdCA9PSBHU1RfSkFDS19DT05ORUNUX0FVVE8pIHsKKyAgICAvKiBnZXQgYSBwb3J0IGNvdW50LCB0aGlzIGlzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgd2UgY2FuIGF1dG9tYXRpY2FsbHkKKyAgICAgKiBjb25uZWN0LiAqLworICAgIHBvcnRzID0gamFja19nZXRfcG9ydHMgKGNsaWVudCwgTlVMTCwgTlVMTCwKKyAgICAgICAgSmFja1BvcnRJc1BoeXNpY2FsIHwgSmFja1BvcnRJc0lucHV0KTsKKyAgICBtYXggPSAwOworICAgIGlmIChwb3J0cyAhPSBOVUxMKSB7CisgICAgICBmb3IgKDsgcG9ydHNbbWF4XTsgbWF4KyspOworICAgICAgZnJlZSAocG9ydHMpOworICAgIH0gZWxzZQorICAgICAgbWF4ID0gMDsKKyAgfSBlbHNlIHsKKyAgICAvKiB3ZSBhbGxvdyBhbnkgbnVtYmVyIG9mIHBhZHMsIHNvbWV0aGluZyBlbHNlIGlzIGdvaW5nIHRvIGNvbm5lY3QgdGhlCisgICAgICogcGFkcy4gKi8KKyAgICBtYXggPSBHX01BWElOVDsKKyAgfQorICBtaW4gPSBNSU4gKDEsIG1heCk7CisKKyAgcmF0ZSA9IGphY2tfZ2V0X3NhbXBsZV9yYXRlIChjbGllbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJnb3QgJWQtJWQgcG9ydHMsIHNhbXBsZXJhdGU6ICVkIiwgbWluLCBtYXgsIHJhdGUpOworCisgIGlmICghc2luay0+Y2FwcykgeworICAgIHNpbmstPmNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgR1NUX0pBQ0tfRk9STUFUX1NUUiwKKyAgICAgICAgImxheW91dCIsIEdfVFlQRV9TVFJJTkcsICJpbnRlcmxlYXZlZCIsCisgICAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgcmF0ZSwKKyAgICAgICAgImNoYW5uZWxzIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCBtaW4sIG1heCwgTlVMTCk7CisgIH0KKyAgR1NUX0lORk9fT0JKRUNUIChzaW5rLCAicmV0dXJuaW5nIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIHNpbmstPmNhcHMpOworCisgIHJldHVybiBnc3RfY2Fwc19yZWYgKHNpbmstPmNhcHMpOworCisgIC8qIEVSUk9SUyAqLworbm9fY2xpZW50OgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgImRldmljZSBub3Qgb3BlbiwgdXNpbmcgdGVtcGxhdGUgY2FwcyIpOworICAgIC8qIGJhc2UgY2xhc3Mgd2lsbCBnZXQgdGVtcGxhdGUgY2FwcyBmb3IgdXMgd2hlbiB3ZSByZXR1cm4gTlVMTCAqLworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBHc3RBdWRpb1JpbmdCdWZmZXIgKgorZ3N0X2phY2tfYXVkaW9fc2lua19jcmVhdGVfcmluZ2J1ZmZlciAoR3N0QXVkaW9CYXNlU2luayAqIHNpbmspCit7CisgIEdzdEF1ZGlvUmluZ0J1ZmZlciAqYnVmZmVyOworCisgIGJ1ZmZlciA9IGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfSkFDS19SSU5HX0JVRkZFUiwgTlVMTCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJjcmVhdGVkIHJpbmdidWZmZXIgQCVwIiwgYnVmZmVyKTsKKworICByZXR1cm4gYnVmZmVyOworfQpkaWZmIC0tZ2l0IGEvZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5oIGIvZXh0L2phY2svZ3N0amFja2F1ZGlvc2luay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmY2NjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmgKQEAgLTAsMCArMSw4MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBnc3RqYWNrc2luay5oOgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfSkFDS19BVURJT19TSU5LX0hfXworI2RlZmluZSBfX0dTVF9KQUNLX0FVRElPX1NJTktfSF9fCisKKyNpbmNsdWRlIDxqYWNrL2phY2suaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9iYXNlc2luay5oPgorCisjaW5jbHVkZSAiZ3N0amFjay5oIgorI2luY2x1ZGUgImdzdGphY2thdWRpb2NsaWVudC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfSkFDS19BVURJT19TSU5LICAgICAgICAgICAgIChnc3RfamFja19hdWRpb19zaW5rX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9KQUNLX0FVRElPX1NJTksob2JqKSAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfSkFDS19BVURJT19TSU5LLEdzdEphY2tBdWRpb1NpbmspKQorI2RlZmluZSBHU1RfSkFDS19BVURJT19TSU5LX0NMQVNTKGtsYXNzKSAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfSkFDS19BVURJT19TSU5LLEdzdEphY2tBdWRpb1NpbmtDbGFzcykpCisjZGVmaW5lIEdTVF9KQUNLX0FVRElPX1NJTktfR0VUX0NMQVNTKG9iaikgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksR1NUX1RZUEVfSkFDS19BVURJT19TSU5LLEdzdEphY2tBdWRpb1NpbmtDbGFzcykpCisjZGVmaW5lIEdTVF9JU19KQUNLX0FVRElPX1NJTksob2JqKSAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfSkFDS19BVURJT19TSU5LKSkKKyNkZWZpbmUgR1NUX0lTX0pBQ0tfQVVESU9fU0lOS19DTEFTUyhrbGFzcykgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0pBQ0tfQVVESU9fU0lOSykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RKYWNrQXVkaW9TaW5rIEdzdEphY2tBdWRpb1Npbms7Cit0eXBlZGVmIHN0cnVjdCBfR3N0SmFja0F1ZGlvU2lua0NsYXNzIEdzdEphY2tBdWRpb1NpbmtDbGFzczsKKworLyoqCisgKiBHc3RKYWNrQXVkaW9TaW5rOgorICogCisgKiBPcGFxdWUgI0dzdEphY2tBdWRpb1NpbmsuCisgKi8KK3N0cnVjdCBfR3N0SmFja0F1ZGlvU2luayB7CisgIEdzdEF1ZGlvQmFzZVNpbmsgZWxlbWVudDsKKworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgLyogY2FjaGVkIGNhcHMgKi8KKyAgR3N0Q2FwcyAgICAgICAgICpjYXBzOworCisgIC8qIHByb3BlcnRpZXMgKi8KKyAgR3N0SmFja0Nvbm5lY3QgICBjb25uZWN0OworICBnY2hhciAgICAgICAgICAgKnNlcnZlcjsKKyAgamFja19jbGllbnRfdCAgICpqY2xpZW50OworICBnY2hhciAgICAgICAgICAgKmNsaWVudF9uYW1lOworICBnY2hhciAgICAgICAgICAgKnBvcnRfcGF0dGVybjsKKyAgZ3VpbnQgICAgICAgICAgICB0cmFuc3BvcnQ7CisKKyAgLyogb3VyIGNsaWVudCAqLworICBHc3RKYWNrQXVkaW9DbGllbnQgKmNsaWVudDsKKworICAvKiBvdXIgcG9ydHMgKi8KKyAgamFja19wb3J0X3QgICAgKipwb3J0czsKKyAgaW50ICAgICAgICAgICAgICBwb3J0X2NvdW50OworICBzYW1wbGVfdCAgICAgICAqKmJ1ZmZlcnM7Cit9OworCitzdHJ1Y3QgX0dzdEphY2tBdWRpb1NpbmtDbGFzcyB7CisgIEdzdEF1ZGlvQmFzZVNpbmtDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfamFja19hdWRpb19zaW5rX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0pBQ0tfQVVESU9fU0lOS19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jIGIvZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNlYmVlNwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jCkBAIC0wLDAgKzEsOTkwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUcmlzdGFuIE1hdHRoZXdzIDx0cmlzdGFuQHNhdC5xYy5jYT4KKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgKHRoZSAiTEdQTCIpLCBpbgorICogd2hpY2ggY2FzZSB0aGUgZm9sbG93aW5nIHByb3Zpc2lvbnMgYXBwbHkgaW5zdGVhZCBvZiB0aGUgb25lcworICogbWVudGlvbmVkIGFib3ZlOgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWphY2thdWRpb3NyYworICogQHNlZV9hbHNvOiAjR3N0QXVkaW9CYXNlU3JjLCAjR3N0QXVkaW9SaW5nQnVmZmVyCisgKgorICogQSBTcmMgdGhhdCBpbnB1dHMgZGF0YSBmcm9tIEphY2sgcG9ydHMuCisgKiAKKyAqIEl0IHdpbGwgY3JlYXRlIE4gSmFjayBwb3J0cyBuYW1lZCBpbl8mbHQ7bmFtZSZndDtfJmx0O251bSZndDsgd2hlcmUgCisgKiAmbHQ7bmFtZSZndDsgaXMgdGhlIGVsZW1lbnQgbmFtZSBhbmQgJmx0O251bSZndDsgaXMgc3RhcnRpbmcgZnJvbSAxLgorICogRWFjaCBwb3J0IGNvcnJlc3BvbmRzIHRvIGEgZ3N0cmVhbWVyIGNoYW5uZWwuCisgKiAKKyAqIFRoZSBzYW1wbGVyYXRlIGFzIGV4cG9zZWQgb24gdGhlIGNhcHMgaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBzYW1wbGVyYXRlIG9mCisgKiB0aGUgamFjayBzZXJ2ZXIuCisgKiAKKyAqIFdoZW4gdGhlICNHc3RKYWNrQXVkaW9TcmM6Y29ubmVjdCBwcm9wZXJ0eSBpcyBzZXQgdG8gYXV0bywgdGhpcyBlbGVtZW50CisgKiB3aWxsIHRyeSB0byBjb25uZWN0IGVhY2ggaW5wdXQgcG9ydCB0byBhIHJhbmRvbSBwaHlzaWNhbCBqYWNrIG91dHB1dCBwaW4uIAorICogCisgKiBXaGVuIHRoZSAjR3N0SmFja0F1ZGlvU3JjOmNvbm5lY3QgcHJvcGVydHkgaXMgc2V0IHRvIG5vbmUsIHRoZSBlbGVtZW50IHdpbGwKKyAqIGFjY2VwdCBhbnkgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyBhbmQgd2lsbCBjcmVhdGUgKGJ1dCBub3QgY29ubmVjdCkgYW4KKyAqIGlucHV0IHBvcnQgZm9yIGVhY2ggY2hhbm5lbC4KKyAqIAorICogVGhlIGVsZW1lbnQgd2lsbCBnZW5lcmF0ZSBhbiBlcnJvciB3aGVuIHRoZSBKYWNrIHNlcnZlciBpcyBzaHV0IGRvd24gd2hlbiBpdAorICogd2FzIFBBVVNFRCBvciBQTEFZSU5HLiBUaGlzIGVsZW1lbnQgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIHJhdGUgYW5kIGJ1ZmZlcgorICogc2l6ZSBjaGFuZ2VzIGF0IHJ1bnRpbWUuCisgKiAKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBqYWNrYXVkaW9zcmMgY29ubmVjdD0wICEgamFja2F1ZGlvc2luayBjb25uZWN0PTAKKyAqIF18IEdldCBhdWRpbyBpbnB1dCBpbnRvIGdzdHJlYW1lciBmcm9tIGphY2suCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSAiZ3N0amFja2F1ZGlvc3JjLmgiCisjaW5jbHVkZSAiZ3N0amFja3JpbmdidWZmZXIuaCIKKyNpbmNsdWRlICJnc3RqYWNrdXRpbC5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfamFja19hdWRpb19zcmNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2phY2tfYXVkaW9fc3JjX2RlYnVnCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2phY2tfYXVkaW9fc3JjX2FsbG9jYXRlX2NoYW5uZWxzIChHc3RKYWNrQXVkaW9TcmMgKiBzcmMsIGdpbnQgY2hhbm5lbHMpCit7CisgIGphY2tfY2xpZW50X3QgKmNsaWVudDsKKworICBjbGllbnQgPSBnc3RfamFja19hdWRpb19jbGllbnRfZ2V0X2NsaWVudCAoc3JjLT5jbGllbnQpOworCisgIC8qIHJlbW92ZSBwb3J0cyB3ZSBkb24ndCBuZWVkICovCisgIHdoaWxlIChzcmMtPnBvcnRfY291bnQgPiBjaGFubmVscykKKyAgICBqYWNrX3BvcnRfdW5yZWdpc3RlciAoY2xpZW50LCBzcmMtPnBvcnRzWy0tc3JjLT5wb3J0X2NvdW50XSk7CisKKyAgLyogYWxsb2MgZW5vdWdoIGlucHV0IHBvcnRzICovCisgIHNyYy0+cG9ydHMgPSBnX3JlYWxsb2MgKHNyYy0+cG9ydHMsIHNpemVvZiAoamFja19wb3J0X3QgKikgKiBjaGFubmVscyk7CisgIHNyYy0+YnVmZmVycyA9IGdfcmVhbGxvYyAoc3JjLT5idWZmZXJzLCBzaXplb2YgKHNhbXBsZV90ICopICogY2hhbm5lbHMpOworCisgIC8qIGNyZWF0ZSBhbiBpbnB1dCBwb3J0IGZvciBlYWNoIGNoYW5uZWwgKi8KKyAgd2hpbGUgKHNyYy0+cG9ydF9jb3VudCA8IGNoYW5uZWxzKSB7CisgICAgZ2NoYXIgKm5hbWU7CisKKyAgICAvKiBwb3J0IG5hbWVzIHN0YXJ0IGZyb20gMSBhbmQgYXJlIGxvY2FsIHRvIHRoZSBlbGVtZW50ICovCisgICAgbmFtZSA9CisgICAgICAgIGdfc3RyZHVwX3ByaW50ZiAoImluXyVzXyVkIiwgR1NUX0VMRU1FTlRfTkFNRSAoc3JjKSwKKyAgICAgICAgc3JjLT5wb3J0X2NvdW50ICsgMSk7CisgICAgc3JjLT5wb3J0c1tzcmMtPnBvcnRfY291bnRdID0KKyAgICAgICAgamFja19wb3J0X3JlZ2lzdGVyIChjbGllbnQsIG5hbWUsIEpBQ0tfREVGQVVMVF9BVURJT19UWVBFLAorICAgICAgICBKYWNrUG9ydElzSW5wdXQsIDApOworICAgIGlmIChzcmMtPnBvcnRzW3NyYy0+cG9ydF9jb3VudF0gPT0gTlVMTCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHNyYy0+cG9ydF9jb3VudCsrOworCisgICAgZ19mcmVlIChuYW1lKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9qYWNrX2F1ZGlvX3NyY19mcmVlX2NoYW5uZWxzIChHc3RKYWNrQXVkaW9TcmMgKiBzcmMpCit7CisgIGdpbnQgcmVzLCBpID0gMDsKKyAgamFja19jbGllbnRfdCAqY2xpZW50OworCisgIGNsaWVudCA9IGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9nZXRfY2xpZW50IChzcmMtPmNsaWVudCk7CisKKyAgLyogZ2V0IHJpZCBvZiBhbGwgcG9ydHMgKi8KKyAgd2hpbGUgKHNyYy0+cG9ydF9jb3VudCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICJ1bnJlZ2lzdGVyIHBvcnQgJWQiLCBpKTsKKyAgICBpZiAoKHJlcyA9IGphY2tfcG9ydF91bnJlZ2lzdGVyIChjbGllbnQsIHNyYy0+cG9ydHNbaSsrXSkpKQorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAidW5yZWdpc3RlciBvZiBwb3J0IGZhaWxlZCAoJWQpIiwgcmVzKTsKKworICAgIHNyYy0+cG9ydF9jb3VudC0tOworICB9CisgIGdfZnJlZSAoc3JjLT5wb3J0cyk7CisgIHNyYy0+cG9ydHMgPSBOVUxMOworICBnX2ZyZWUgKHNyYy0+YnVmZmVycyk7CisgIHNyYy0+YnVmZmVycyA9IE5VTEw7Cit9CisKKy8qIHJpbmdidWZmZXIgYWJzdHJhY3QgYmFzZSBjbGFzcyAqLworc3RhdGljIEdUeXBlCitnc3RfamFja19yaW5nX2J1ZmZlcl9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIHZvbGF0aWxlIGdzaXplIHJpbmdidWZmZXJfdHlwZSA9IDA7CisKKyAgaWYgKGdfb25jZV9pbml0X2VudGVyICgmcmluZ2J1ZmZlcl90eXBlKSkgeworICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gcmluZ2J1ZmZlcl9pbmZvID0geyBzaXplb2YgKEdzdEphY2tSaW5nQnVmZmVyQ2xhc3MpLAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgICAoR0NsYXNzSW5pdEZ1bmMpIGdzdF9qYWNrX3JpbmdfYnVmZmVyX2NsYXNzX2luaXQsCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICAgIHNpemVvZiAoR3N0SmFja1JpbmdCdWZmZXIpLAorICAgICAgMCwKKyAgICAgIChHSW5zdGFuY2VJbml0RnVuYykgZ3N0X2phY2tfcmluZ19idWZmZXJfaW5pdCwKKyAgICAgIE5VTEwKKyAgICB9OworICAgIEdUeXBlIHRtcCA9IGdfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKEdTVF9UWVBFX0FVRElPX1JJTkdfQlVGRkVSLAorICAgICAgICAiR3N0SmFja0F1ZGlvU3JjUmluZ0J1ZmZlciIsICZyaW5nYnVmZmVyX2luZm8sIDApOworICAgIGdfb25jZV9pbml0X2xlYXZlICgmcmluZ2J1ZmZlcl90eXBlLCB0bXApOworICB9CisKKyAgcmV0dXJuIChHVHlwZSkgcmluZ2J1ZmZlcl90eXBlOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2phY2tfcmluZ19idWZmZXJfY2xhc3NfaW5pdCAoR3N0SmFja1JpbmdCdWZmZXJDbGFzcyAqIGtsYXNzKQoreworICBHc3RBdWRpb1JpbmdCdWZmZXJDbGFzcyAqZ3N0cmluZ2J1ZmZlcl9jbGFzczsKKworICBnc3RyaW5nYnVmZmVyX2NsYXNzID0gKEdzdEF1ZGlvUmluZ0J1ZmZlckNsYXNzICopIGtsYXNzOworCisgIHJpbmdfcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+b3Blbl9kZXZpY2UgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX29wZW5fZGV2aWNlKTsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+Y2xvc2VfZGV2aWNlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfamFja19yaW5nX2J1ZmZlcl9jbG9zZV9kZXZpY2UpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5hY3F1aXJlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfamFja19yaW5nX2J1ZmZlcl9hY3F1aXJlKTsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+cmVsZWFzZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2phY2tfcmluZ19idWZmZXJfcmVsZWFzZSk7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX3N0YXJ0KTsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+cGF1c2UgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2phY2tfcmluZ19idWZmZXJfcGF1c2UpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5yZXN1bWUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2phY2tfcmluZ19idWZmZXJfc3RhcnQpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX3N0b3ApOworCisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPmRlbGF5ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9qYWNrX3JpbmdfYnVmZmVyX2RlbGF5KTsKK30KKworLyogdGhpcyBpcyB0aGUgY2FsbGJhY2sgb2YgamFjay4gVGhpcyBzaG91bGQgYmUgUlQtc2FmZS4KKyAqIFdyaXRlcyBzYW1wbGVzIGZyb20gdGhlIGphY2sgaW5wdXQgcG9ydCdzIGJ1ZmZlciB0byB0aGUgZ3N0IHJpbmcgYnVmZmVyLgorICovCitzdGF0aWMgaW50CitqYWNrX3Byb2Nlc3NfY2IgKGphY2tfbmZyYW1lc190IG5mcmFtZXMsIHZvaWQgKmFyZykKK3sKKyAgR3N0SmFja0F1ZGlvU3JjICpzcmM7CisgIEdzdEF1ZGlvUmluZ0J1ZmZlciAqYnVmOworICBnaW50IGxlbjsKKyAgZ3VpbnQ4ICp3cml0ZXB0cjsKKyAgZ2ludCB3cml0ZXNlZzsKKyAgZ2ludCBjaGFubmVscywgaSwgaiwgZmxlbjsKKyAgc2FtcGxlX3QgKmRhdGE7CisKKyAgYnVmID0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0NBU1QgKGFyZyk7CisgIHNyYyA9IEdTVF9KQUNLX0FVRElPX1NSQyAoR1NUX09CSkVDVF9QQVJFTlQgKGJ1ZikpOworCisgIGNoYW5uZWxzID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZidWYtPnNwZWMuaW5mbyk7CisKKyAgLyogZ2V0IGlucHV0IGJ1ZmZlcnMgKi8KKyAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspCisgICAgc3JjLT5idWZmZXJzW2ldID0KKyAgICAgICAgKHNhbXBsZV90ICopIGphY2tfcG9ydF9nZXRfYnVmZmVyIChzcmMtPnBvcnRzW2ldLCBuZnJhbWVzKTsKKworICBpZiAoZ3N0X2F1ZGlvX3JpbmdfYnVmZmVyX3ByZXBhcmVfcmVhZCAoYnVmLCAmd3JpdGVzZWcsICZ3cml0ZXB0ciwgJmxlbikpIHsKKyAgICBmbGVuID0gbGVuIC8gY2hhbm5lbHM7CisKKyAgICAvKiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgbXVzdCBiZSBleGFjdGx5IHRoZSBzZWdtZW50IHNpemUgKi8KKyAgICBpZiAobmZyYW1lcyAqIHNpemVvZiAoc2FtcGxlX3QpICE9IGZsZW4pCisgICAgICBnb3RvIHdyb25nX3NpemU7CisKKyAgICAvKiB0aGUgc2FtcGxlcyBpbiB0aGUgamFjayBpbnB1dCBidWZmZXJzIGhhdmUgdG8gYmUgaW50ZXJsZWF2ZWQgaW50byB0aGUKKyAgICAgKiByaW5nYnVmZmVyICovCisgICAgZGF0YSA9IChzYW1wbGVfdCAqKSB3cml0ZXB0cjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmZyYW1lczsgKytpKQorICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyArK2opCisgICAgICAgICpkYXRhKysgPSBzcmMtPmJ1ZmZlcnNbal1baV07CisKKyAgICBHU1RfREVCVUcgKCJjb3B5ICVkIGZyYW1lczogJXAsICVkIGJ5dGVzLCAlZCBjaGFubmVscyIsIG5mcmFtZXMsIHdyaXRlcHRyLAorICAgICAgICBsZW4gLyBjaGFubmVscywgY2hhbm5lbHMpOworCisgICAgLyogd2Ugd3JvdGUgb25lIHNlZ21lbnQgKi8KKyAgICBnc3RfYXVkaW9fcmluZ19idWZmZXJfYWR2YW5jZSAoYnVmLCAxKTsKKyAgfQorICByZXR1cm4gMDsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX3NpemU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzcmMsICJuYnl0ZXMgKCVkKSAhPSBmbGVuICglZCkiLAorICAgICAgICAoZ2ludCkgKG5mcmFtZXMgKiBzaXplb2YgKHNhbXBsZV90KSksIGZsZW4pOworICAgIHJldHVybiAxOworICB9Cit9CisKKy8qIHdlIGVycm9yIG91dCAqLworc3RhdGljIGludAoramFja19zYW1wbGVfcmF0ZV9jYiAoamFja19uZnJhbWVzX3QgbmZyYW1lcywgdm9pZCAqYXJnKQoreworICBHc3RKYWNrQXVkaW9TcmMgKnNyYzsKKyAgR3N0SmFja1JpbmdCdWZmZXIgKmFidWY7CisKKyAgYWJ1ZiA9IEdTVF9KQUNLX1JJTkdfQlVGRkVSX0NBU1QgKGFyZyk7CisgIHNyYyA9IEdTVF9KQUNLX0FVRElPX1NSQyAoR1NUX09CSkVDVF9QQVJFTlQgKGFyZykpOworCisgIGlmIChhYnVmLT5zYW1wbGVfcmF0ZSAhPSAtMSAmJiBhYnVmLT5zYW1wbGVfcmF0ZSAhPSBuZnJhbWVzKQorICAgIGdvdG8gbm90X3N1cHBvcnRlZDsKKworICByZXR1cm4gMDsKKworICAvKiBFUlJPUlMgKi8KK25vdF9zdXBwb3J0ZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChOVUxMKSwgKCJKYWNrIGNoYW5nZWQgdGhlIHNhbXBsZSByYXRlLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIikpOworICAgIHJldHVybiAxOworICB9Cit9CisKKy8qIHdlIGVycm9yIG91dCAqLworc3RhdGljIGludAoramFja19idWZmZXJfc2l6ZV9jYiAoamFja19uZnJhbWVzX3QgbmZyYW1lcywgdm9pZCAqYXJnKQoreworICBHc3RKYWNrQXVkaW9TcmMgKnNyYzsKKyAgR3N0SmFja1JpbmdCdWZmZXIgKmFidWY7CisKKyAgYWJ1ZiA9IEdTVF9KQUNLX1JJTkdfQlVGRkVSX0NBU1QgKGFyZyk7CisgIHNyYyA9IEdTVF9KQUNLX0FVRElPX1NSQyAoR1NUX09CSkVDVF9QQVJFTlQgKGFyZykpOworCisgIGlmIChhYnVmLT5idWZmZXJfc2l6ZSAhPSAtMSAmJiBhYnVmLT5idWZmZXJfc2l6ZSAhPSBuZnJhbWVzKQorICAgIGdvdG8gbm90X3N1cHBvcnRlZDsKKworICByZXR1cm4gMDsKKworICAvKiBFUlJPUlMgKi8KK25vdF9zdXBwb3J0ZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChOVUxMKSwgKCJKYWNrIGNoYW5nZWQgdGhlIGJ1ZmZlciBzaXplLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIikpOworICAgIHJldHVybiAxOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitqYWNrX3NodXRkb3duX2NiICh2b2lkICphcmcpCit7CisgIEdzdEphY2tBdWRpb1NyYyAqc3JjOworCisgIHNyYyA9IEdTVF9KQUNLX0FVRElPX1NSQyAoR1NUX09CSkVDVF9QQVJFTlQgKGFyZykpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNodXRkb3duIik7CisKKyAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE5PVF9GT1VORCwKKyAgICAgIChOVUxMKSwgKCJKYWNrIHNlcnZlciBzaHV0ZG93biIpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9qYWNrX3JpbmdfYnVmZmVyX2luaXQgKEdzdEphY2tSaW5nQnVmZmVyICogYnVmLAorICAgIEdzdEphY2tSaW5nQnVmZmVyQ2xhc3MgKiBnX2NsYXNzKQoreworICBidWYtPmNoYW5uZWxzID0gLTE7CisgIGJ1Zi0+YnVmZmVyX3NpemUgPSAtMTsKKyAgYnVmLT5zYW1wbGVfcmF0ZSA9IC0xOworfQorCisvKiB0aGUgX29wZW5fZGV2aWNlIG1ldGhvZCBzaG91bGQgbWFrZSBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgc2VydmVyCisqLworc3RhdGljIGdib29sZWFuCitnc3RfamFja19yaW5nX2J1ZmZlcl9vcGVuX2RldmljZSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RKYWNrQXVkaW9TcmMgKnNyYzsKKyAgamFja19zdGF0dXNfdCBzdGF0dXMgPSAwOworICBjb25zdCBnY2hhciAqbmFtZTsKKworICBzcmMgPSBHU1RfSkFDS19BVURJT19TUkMgKEdTVF9PQkpFQ1RfUEFSRU5UIChidWYpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJvcGVuIik7CisKKyAgaWYgKHNyYy0+Y2xpZW50X25hbWUpIHsKKyAgICBuYW1lID0gc3JjLT5jbGllbnRfbmFtZTsKKyAgfSBlbHNlIHsKKyAgICBuYW1lID0gZ19nZXRfYXBwbGljYXRpb25fbmFtZSAoKTsKKyAgfQorICBpZiAoIW5hbWUpCisgICAgbmFtZSA9ICJHU3RyZWFtZXIiOworCisgIHNyYy0+Y2xpZW50ID0gZ3N0X2phY2tfYXVkaW9fY2xpZW50X25ldyAobmFtZSwgc3JjLT5zZXJ2ZXIsCisgICAgICBzcmMtPmpjbGllbnQsCisgICAgICBHU1RfSkFDS19DTElFTlRfU09VUkNFLAorICAgICAgamFja19zaHV0ZG93bl9jYiwKKyAgICAgIGphY2tfcHJvY2Vzc19jYiwgamFja19idWZmZXJfc2l6ZV9jYiwgamFja19zYW1wbGVfcmF0ZV9jYiwgYnVmLCAmc3RhdHVzKTsKKyAgaWYgKHNyYy0+Y2xpZW50ID09IE5VTEwpCisgICAgZ290byBjb3VsZF9ub3Rfb3BlbjsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJvcGVuZWQiKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2NvdWxkX25vdF9vcGVuOgorICB7CisgICAgaWYgKHN0YXR1cyAmIChKYWNrU2VydmVyRmFpbGVkIHwgSmFja0ZhaWx1cmUpKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgTk9UX0ZPVU5ELAorICAgICAgICAgIChfKCJKYWNrIHNlcnZlciBub3QgZm91bmQiKSksCisgICAgICAgICAgKCJDYW5ub3QgY29ubmVjdCB0byB0aGUgSmFjayBzZXJ2ZXIgKHN0YXR1cyAlZCkiLCBzdGF0dXMpKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwKKyAgICAgICAgICAoTlVMTCksICgiSmFjayBjbGllbnQgb3BlbiBlcnJvciAoc3RhdHVzICVkKSIsIHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogY2xvc2UgdGhlIGNvbm5lY3Rpb24gd2l0aCB0aGUgc2VydmVyCisqLworc3RhdGljIGdib29sZWFuCitnc3RfamFja19yaW5nX2J1ZmZlcl9jbG9zZV9kZXZpY2UgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0SmFja0F1ZGlvU3JjICpzcmM7CisKKyAgc3JjID0gR1NUX0pBQ0tfQVVESU9fU1JDIChHU1RfT0JKRUNUX1BBUkVOVCAoYnVmKSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY2xvc2UiKTsKKworICBnc3RfamFja19hdWRpb19zcmNfZnJlZV9jaGFubmVscyAoc3JjKTsKKyAgZ3N0X2phY2tfYXVkaW9fY2xpZW50X2ZyZWUgKHNyYy0+Y2xpZW50KTsKKyAgc3JjLT5jbGllbnQgPSBOVUxMOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qIGFsbG9jYXRlIGEgYnVmZmVyIGFuZCBzZXR1cCByZXNvdXJjZXMgdG8gcHJvY2VzcyB0aGUgYXVkaW8gc2FtcGxlcyBvZgorICogdGhlIGZvcm1hdCBhcyBzcGVjaWZpZWQgaW4gQHNwZWMuCisgKgorICogV2UgYWxsb2NhdGUgTiBqYWNrIHBvcnRzLCBvbmUgZm9yIGVhY2ggY2hhbm5lbC4gSWYgd2UgYXJlIGFza2VkIHRvCisgKiBhdXRvbWF0aWNhbGx5IG1ha2UgYSBjb25uZWN0aW9uIHdpdGggcGh5c2ljYWwgcG9ydHMsIHdlIGNvbm5lY3QgYXMgbWFueQorICogcG9ydHMgYXMgdGhlcmUgYXJlIHBoeXNpY2FsIHBvcnRzLCBsZWF2aW5nIGxlZnRvdmVyIHBvcnRzIHVuY29ubmVjdGVkLgorICoKKyAqIEl0IGlzIGFzc3VtZWQgdGhhdCBzYW1wbGVyYXRlIGFuZCBudW1iZXIgb2YgY2hhbm5lbHMgYXJlIGFjY2VwdGFibGUgc2luY2Ugb3VyCisgKiBnZXRjYXBzIG1ldGhvZCB3aWxsIGFsd2F5cyBwcm92aWRlIGNvcnJlY3QgdmFsdWVzLiBJZiB1bmFjY2VwdGFibGUgY2FwcyBhcmUKKyAqIHJlY2VpdmVkIGZvciBzb21lIHJlYXNvbiwgd2UgZmFpbCBoZXJlLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9qYWNrX3JpbmdfYnVmZmVyX2FjcXVpcmUgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZiwKKyAgICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYykKK3sKKyAgR3N0SmFja0F1ZGlvU3JjICpzcmM7CisgIEdzdEphY2tSaW5nQnVmZmVyICphYnVmOworICBjb25zdCBjaGFyICoqcG9ydHM7CisgIGdpbnQgc2FtcGxlX3JhdGUsIGJ1ZmZlcl9zaXplOworICBnaW50IGksIGJwZiwgcmF0ZSwgY2hhbm5lbHMsIHJlczsKKyAgamFja19jbGllbnRfdCAqY2xpZW50OworCisgIHNyYyA9IEdTVF9KQUNLX0FVRElPX1NSQyAoR1NUX09CSkVDVF9QQVJFTlQgKGJ1ZikpOworICBhYnVmID0gR1NUX0pBQ0tfUklOR19CVUZGRVJfQ0FTVCAoYnVmKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJhY3F1aXJlIik7CisKKyAgY2xpZW50ID0gZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF9jbGllbnQgKHNyYy0+Y2xpZW50KTsKKworICByYXRlID0gR1NUX0FVRElPX0lORk9fUkFURSAoJnNwZWMtPmluZm8pOworCisgIC8qIHNhbXBsZSByYXRlIG11c3QgYmUgdGhhdCBvZiB0aGUgc2VydmVyICovCisgIHNhbXBsZV9yYXRlID0gamFja19nZXRfc2FtcGxlX3JhdGUgKGNsaWVudCk7CisgIGlmIChzYW1wbGVfcmF0ZSAhPSByYXRlKQorICAgIGdvdG8gd3Jvbmdfc2FtcGxlcmF0ZTsKKworICBicGYgPSBHU1RfQVVESU9fSU5GT19CUEYgKCZzcGVjLT5pbmZvKTsKKyAgY2hhbm5lbHMgPSBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJnNwZWMtPmluZm8pOworCisgIGlmICghZ3N0X2phY2tfYXVkaW9fc3JjX2FsbG9jYXRlX2NoYW5uZWxzIChzcmMsIGNoYW5uZWxzKSkKKyAgICBnb3RvIG91dF9vZl9wb3J0czsKKworICBnc3RfamFja19zZXRfbGF5b3V0IChidWYsIHNwZWMpOworCisgIGJ1ZmZlcl9zaXplID0gamFja19nZXRfYnVmZmVyX3NpemUgKGNsaWVudCk7CisKKyAgLyogdGhlIHNlZ21lbnQgc2l6ZSBpbiBieXRlcywgdGhpcyBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhIGJ1ZmZlciBvZiAzMmJpdCBmbG9hdHMKKyAgICogZm9yIGFsbCBjaGFubmVscyAgKi8KKyAgc3BlYy0+c2Vnc2l6ZSA9IGJ1ZmZlcl9zaXplICogc2l6ZW9mIChnZmxvYXQpICogY2hhbm5lbHM7CisgIHNwZWMtPmxhdGVuY3lfdGltZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoc3BlYy0+c2Vnc2l6ZSwKKyAgICAgIChHU1RfU0VDT05EIC8gR1NUX1VTRUNPTkQpLCByYXRlICogYnBmKTsKKyAgLyogc2VndG90YWwgYmFzZWQgb24gYnVmZmVyLXRpbWUgbGF0ZW5jeSAqLworICBzcGVjLT5zZWd0b3RhbCA9IHNwZWMtPmJ1ZmZlcl90aW1lIC8gc3BlYy0+bGF0ZW5jeV90aW1lOworICBpZiAoc3BlYy0+c2VndG90YWwgPCAyKSB7CisgICAgc3BlYy0+c2VndG90YWwgPSAyOworICAgIHNwZWMtPmJ1ZmZlcl90aW1lID0gc3BlYy0+bGF0ZW5jeV90aW1lICogc3BlYy0+c2VndG90YWw7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJidWZmZXIgdGltZTogJSIgR19HSU5UNjRfRk9STUFUICIgdXNlYyIsCisgICAgICBzcGVjLT5idWZmZXJfdGltZSk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImxhdGVuY3kgdGltZTogJSIgR19HSU5UNjRfRk9STUFUICIgdXNlYyIsCisgICAgICBzcGVjLT5sYXRlbmN5X3RpbWUpOworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJidWZmZXJfc2l6ZSAlZCwgc2Vnc2l6ZSAlZCwgc2VndG90YWwgJWQiLAorICAgICAgYnVmZmVyX3NpemUsIHNwZWMtPnNlZ3NpemUsIHNwZWMtPnNlZ3RvdGFsKTsKKworICAvKiBhbGxvY2F0ZSB0aGUgcmluZ2J1ZmZlciBtZW1vcnkgbm93ICovCisgIGJ1Zi0+c2l6ZSA9IHNwZWMtPnNlZ3RvdGFsICogc3BlYy0+c2Vnc2l6ZTsKKyAgYnVmLT5tZW1vcnkgPSBnX21hbGxvYzAgKGJ1Zi0+c2l6ZSk7CisKKyAgaWYgKChyZXMgPSBnc3RfamFja19hdWRpb19jbGllbnRfc2V0X2FjdGl2ZSAoc3JjLT5jbGllbnQsIFRSVUUpKSkKKyAgICBnb3RvIGNvdWxkX25vdF9hY3RpdmF0ZTsKKworICAvKiBpZiB3ZSBuZWVkIHRvIGF1dG9tYXRpY2FsbHkgY29ubmVjdCB0aGUgcG9ydHMsIGRvIHNvIG5vdy4gV2UgbXVzdCBkbyB0aGlzCisgICAqIGFmdGVyIGFjdGl2YXRpbmcgdGhlIGNsaWVudC4gKi8KKyAgaWYgKHNyYy0+Y29ubmVjdCA9PSBHU1RfSkFDS19DT05ORUNUX0FVVE8KKyAgICAgIHx8IHNyYy0+Y29ubmVjdCA9PSBHU1RfSkFDS19DT05ORUNUX0FVVE9fRk9SQ0VEKSB7CisgICAgLyogZmluZCBhbGwgdGhlIHBoeXNpY2FsIG91dHB1dCBwb3J0cy4gQSBwaHlzaWNhbCBvdXRwdXQgcG9ydCBpcyBhIHBvcnQKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggYSBoYXJkd2FyZSBkZXZpY2UuIFNvbWVvbmUgbmVlZHMgY29ubmVjdCB0byBhIHBoeXNpY2FsCisgICAgICogcG9ydCBpbiBvcmRlciB0byBjYXB0dXJlIHNvbWV0aGluZy4gKi8KKworICAgIGlmIChzcmMtPnBvcnRfcGF0dGVybiA9PSBOVUxMKSB7CisgICAgICBwb3J0cyA9IGphY2tfZ2V0X3BvcnRzIChjbGllbnQsIE5VTEwsIE5VTEwsCisgICAgICAgICAgSmFja1BvcnRJc1BoeXNpY2FsIHwgSmFja1BvcnRJc091dHB1dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBvcnRzID0gamFja19nZXRfcG9ydHMgKGNsaWVudCwgc3JjLT5wb3J0X3BhdHRlcm4sIE5VTEwsCisgICAgICAgICAgSmFja1BvcnRJc091dHB1dCk7CisgICAgfQorCisgICAgaWYgKHBvcnRzID09IE5VTEwpIHsKKyAgICAgIC8qIG5vIHBvcnRzPyBmaW5lIHRoZW4gd2UgZG9uJ3QgZG8gYW55dGhpbmcgZXhjZXB0IGZvciBwb3N0aW5nIGEgd2FybmluZworICAgICAgICogbWVzc2FnZS4gKi8KKyAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNyYywgUkVTT1VSQ0UsIE5PVF9GT1VORCwgKE5VTEwpLAorICAgICAgICAgICgiTm8gcGh5c2ljYWwgb3V0cHV0IHBvcnRzIGZvdW5kLCBsZWF2aW5nIHBvcnRzIHVuY29ubmVjdGVkIikpOworICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisgICAgICAvKiBzdG9wIHdoZW4gYWxsIG91dHB1dCBwb3J0cyBhcmUgZXhoYXVzdGVkICovCisgICAgICBpZiAocG9ydHNbaV0gPT0gTlVMTCkgeworICAgICAgICAvKiBwb3N0IGEgd2FybmluZyB0aGF0IHdlIGNvdWxkIG5vdCBjb25uZWN0IGFsbCBwb3J0cyAqLworICAgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChzcmMsIFJFU09VUkNFLCBOT1RfRk9VTkQsIChOVUxMKSwKKyAgICAgICAgICAgICgiTm8gbW9yZSBwaHlzaWNhbCBwb3J0cywgbGVhdmluZyBzb21lIHBvcnRzIHVuY29ubmVjdGVkIikpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInRyeSBjb25uZWN0aW5nIHRvICVzIiwKKyAgICAgICAgICBqYWNrX3BvcnRfbmFtZSAoc3JjLT5wb3J0c1tpXSkpOworCisgICAgICAvKiBjb25uZWN0IHRoZSBwaHlzaWNhbCBwb3J0IHRvIGEgcG9ydCAqLworICAgICAgcmVzID0gamFja19jb25uZWN0IChjbGllbnQsIHBvcnRzW2ldLCBqYWNrX3BvcnRfbmFtZSAoc3JjLT5wb3J0c1tpXSkpOworICAgICAgaWYgKHJlcyAhPSAwICYmIHJlcyAhPSBFRVhJU1QpCisgICAgICAgIGdvdG8gY2Fubm90X2Nvbm5lY3Q7CisgICAgfQorICAgIGZyZWUgKHBvcnRzKTsKKyAgfQorZG9uZToKKworICBhYnVmLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworICBhYnVmLT5idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplOworICBhYnVmLT5jaGFubmVscyA9IGNoYW5uZWxzOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLword3Jvbmdfc2FtcGxlcmF0ZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoIldyb25nIHNhbXBsZXJhdGUsIHNlcnZlciBpcyBydW5uaW5nIGF0ICVkIGFuZCB3ZSByZWNlaXZlZCAlZCIsCisgICAgICAgICAgICBzYW1wbGVfcmF0ZSwgcmF0ZSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorb3V0X29mX3BvcnRzOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiQ2Fubm90IGFsbG9jYXRlIG1vcmUgSmFjayBwb3J0cyIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2NvdWxkX25vdF9hY3RpdmF0ZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCBhY3RpdmF0ZSBjbGllbnQgKCVkOiVzKSIsIHJlcywgZ19zdHJlcnJvciAocmVzKSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorY2Fubm90X2Nvbm5lY3Q6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJDb3VsZCBub3QgY29ubmVjdCBpbnB1dCBwb3J0cyB0byBwaHlzaWNhbCBwb3J0cyAoJWQ6JXMpIiwKKyAgICAgICAgICAgIHJlcywgZ19zdHJlcnJvciAocmVzKSkpOworICAgIGZyZWUgKHBvcnRzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggTE9DSyAqLworc3RhdGljIGdib29sZWFuCitnc3RfamFja19yaW5nX2J1ZmZlcl9yZWxlYXNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdEphY2tBdWRpb1NyYyAqc3JjOworICBHc3RKYWNrUmluZ0J1ZmZlciAqYWJ1ZjsKKyAgZ2ludCByZXM7CisKKyAgYWJ1ZiA9IEdTVF9KQUNLX1JJTkdfQlVGRkVSX0NBU1QgKGJ1Zik7CisgIHNyYyA9IEdTVF9KQUNLX0FVRElPX1NSQyAoR1NUX09CSkVDVF9QQVJFTlQgKGJ1ZikpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInJlbGVhc2UiKTsKKworICBpZiAoKHJlcyA9IGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9zZXRfYWN0aXZlIChzcmMtPmNsaWVudCwgRkFMU0UpKSkgeworICAgIC8qIHdlIG9ubHkgd2FybiwgdGhpcyBtZWFucyB0aGUgc2VydmVyIGlzIHByb2JhYmx5IHNodXQgZG93biBhbmQgdGhlIGNsaWVudAorICAgICAqIGlzIGdvbmUgYW55d2F5LiAqLworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNyYywgUkVTT1VSQ0UsIENMT1NFLCAoTlVMTCksCisgICAgICAgICgiQ291bGQgbm90IGRlYWN0aXZhdGUgSmFjayBjbGllbnQgKCVkKSIsIHJlcykpOworICB9CisKKyAgYWJ1Zi0+Y2hhbm5lbHMgPSAtMTsKKyAgYWJ1Zi0+YnVmZmVyX3NpemUgPSAtMTsKKyAgYWJ1Zi0+c2FtcGxlX3JhdGUgPSAtMTsKKworICAvKiBmcmVlIHRoZSBidWZmZXIgKi8KKyAgZ19mcmVlIChidWYtPm1lbW9yeSk7CisgIGJ1Zi0+bWVtb3J5ID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfamFja19yaW5nX2J1ZmZlcl9zdGFydCAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RKYWNrQXVkaW9TcmMgKnNyYzsKKworICBzcmMgPSBHU1RfSkFDS19BVURJT19TUkMgKEdTVF9PQkpFQ1RfUEFSRU5UIChidWYpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdGFydCIpOworCisgIGlmIChzcmMtPnRyYW5zcG9ydCAmIEdTVF9KQUNLX1RSQU5TUE9SVF9NQVNURVIpIHsKKyAgICBqYWNrX2NsaWVudF90ICpjbGllbnQ7CisKKyAgICBjbGllbnQgPSBnc3RfamFja19hdWRpb19jbGllbnRfZ2V0X2NsaWVudCAoc3JjLT5jbGllbnQpOworICAgIGphY2tfdHJhbnNwb3J0X3N0YXJ0IChjbGllbnQpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2phY2tfcmluZ19idWZmZXJfcGF1c2UgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0SmFja0F1ZGlvU3JjICpzcmM7CisKKyAgc3JjID0gR1NUX0pBQ0tfQVVESU9fU1JDIChHU1RfT0JKRUNUX1BBUkVOVCAoYnVmKSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicGF1c2UiKTsKKworICBpZiAoc3JjLT50cmFuc3BvcnQgJiBHU1RfSkFDS19UUkFOU1BPUlRfTUFTVEVSKSB7CisgICAgamFja19jbGllbnRfdCAqY2xpZW50OworCisgICAgY2xpZW50ID0gZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF9jbGllbnQgKHNyYy0+Y2xpZW50KTsKKyAgICBqYWNrX3RyYW5zcG9ydF9zdG9wIChjbGllbnQpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2phY2tfcmluZ19idWZmZXJfc3RvcCAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RKYWNrQXVkaW9TcmMgKnNyYzsKKworICBzcmMgPSBHU1RfSkFDS19BVURJT19TUkMgKEdTVF9PQkpFQ1RfUEFSRU5UIChidWYpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdG9wIik7CisKKyAgaWYgKHNyYy0+dHJhbnNwb3J0ICYgR1NUX0pBQ0tfVFJBTlNQT1JUX01BU1RFUikgeworICAgIGphY2tfY2xpZW50X3QgKmNsaWVudDsKKworICAgIGNsaWVudCA9IGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9nZXRfY2xpZW50IChzcmMtPmNsaWVudCk7CisgICAgamFja190cmFuc3BvcnRfc3RvcCAoY2xpZW50KTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjaWYgZGVmaW5lZCAoSEFWRV9KQUNLXzBfMTIwXzEpIHx8IGRlZmluZWQoSEFWRV9KQUNLXzFfOV83KQorc3RhdGljIGd1aW50Citnc3RfamFja19yaW5nX2J1ZmZlcl9kZWxheSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RKYWNrQXVkaW9TcmMgKnNyYzsKKyAgZ3VpbnQgaSwgcmVzID0gMDsKKyAgamFja19sYXRlbmN5X3JhbmdlX3QgcmFuZ2U7CisKKyAgc3JjID0gR1NUX0pBQ0tfQVVESU9fU1JDIChHU1RfT0JKRUNUX1BBUkVOVCAoYnVmKSk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNyYy0+cG9ydF9jb3VudDsgaSsrKSB7CisgICAgamFja19wb3J0X2dldF9sYXRlbmN5X3JhbmdlIChzcmMtPnBvcnRzW2ldLCBKYWNrQ2FwdHVyZUxhdGVuY3ksICZyYW5nZSk7CisgICAgaWYgKHJhbmdlLm1heCA+IHJlcykKKyAgICAgIHJlcyA9IHJhbmdlLm1heDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImRlbGF5ICV1IiwgcmVzKTsKKworICByZXR1cm4gcmVzOworfQorI2Vsc2UgLyogIShkZWZpbmVkIChIQVZFX0pBQ0tfMF8xMjBfMSkgfHwgZGVmaW5lZChIQVZFX0pBQ0tfMV85XzcpKSAqLworc3RhdGljIGd1aW50Citnc3RfamFja19yaW5nX2J1ZmZlcl9kZWxheSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RKYWNrQXVkaW9TcmMgKnNyYzsKKyAgZ3VpbnQgaSwgcmVzID0gMDsKKyAgZ3VpbnQgbGF0ZW5jeTsKKyAgamFja19jbGllbnRfdCAqY2xpZW50OworCisgIHNyYyA9IEdTVF9KQUNLX0FVRElPX1NSQyAoR1NUX09CSkVDVF9QQVJFTlQgKGJ1ZikpOworCisgIGNsaWVudCA9IGdzdF9qYWNrX2F1ZGlvX2NsaWVudF9nZXRfY2xpZW50IChzcmMtPmNsaWVudCk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNyYy0+cG9ydF9jb3VudDsgaSsrKSB7CisgICAgbGF0ZW5jeSA9IGphY2tfcG9ydF9nZXRfdG90YWxfbGF0ZW5jeSAoY2xpZW50LCBzcmMtPnBvcnRzW2ldKTsKKyAgICBpZiAobGF0ZW5jeSA+IHJlcykKKyAgICAgIHJlcyA9IGxhdGVuY3k7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJkZWxheSAldSIsIHJlcyk7CisKKyAgcmV0dXJuIHJlczsKK30KKyNlbmRpZgorCisvKiBBdWRpb3NyYyBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0NPTk5FQ1QgCQlHU1RfSkFDS19DT05ORUNUX0FVVE8KKyNkZWZpbmUgREVGQVVMVF9QUk9QX1NFUlZFUiAJCU5VTEwKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0NMSUVOVF9OQU1FCU5VTEwKKyNkZWZpbmUgREVGQVVMVF9QUk9QX1RSQU5TUE9SVAlHU1RfSkFDS19UUkFOU1BPUlRfQVVUT05PTU9VUworI2RlZmluZSBERUZBVUxUX1BST1BfUE9SVF9QQVRURVJOICAgICAJTlVMTAorZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQ09OTkVDVCwKKyAgUFJPUF9TRVJWRVIsCisgIFBST1BfQ0xJRU5ULAorICBQUk9QX0NMSUVOVF9OQU1FLAorICBQUk9QX1BPUlRfUEFUVEVSTiwKKyAgUFJPUF9UUkFOU1BPUlQsCisgIFBST1BfTEFTVAorfTsKKworLyogdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgaW5wdXRzIGFuZCBvdXRwdXRzLgorICoKKyAqIGRlc2NyaWJlIHRoZSByZWFsIGZvcm1hdHMgaGVyZS4KKyAqLworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0pBQ0tfRk9STUFUX1NUUiAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIgImNoYW5uZWxzID0gKGludCkgWyAxLCBNQVggXSIpCisgICAgKTsKKworI2RlZmluZSBnc3RfamFja19hdWRpb19zcmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0SmFja0F1ZGlvU3JjLCBnc3RfamFja19hdWRpb19zcmMsIEdTVF9UWVBFX0FVRElPX0JBU0VfU1JDKTsKKworc3RhdGljIHZvaWQgZ3N0X2phY2tfYXVkaW9fc3JjX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X2phY2tfYXVkaW9fc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9qYWNrX2F1ZGlvX3NyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBHc3RDYXBzICpnc3RfamFja19hdWRpb19zcmNfZ2V0Y2FwcyAoR3N0QmFzZVNyYyAqIGJzcmMsCisgICAgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgR3N0QXVkaW9SaW5nQnVmZmVyICpnc3RfamFja19hdWRpb19zcmNfY3JlYXRlX3JpbmdidWZmZXIgKEdzdEF1ZGlvQmFzZVNyYworICAgICogc3JjKTsKKworLyogR09iamVjdCB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCisvKiBpbml0aWFsaXplIHRoZSBqYWNrX2F1ZGlvX3NyYydzIGNsYXNzICovCitzdGF0aWMgdm9pZAorZ3N0X2phY2tfYXVkaW9fc3JjX2NsYXNzX2luaXQgKEdzdEphY2tBdWRpb1NyY0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCYXNlU3JjQ2xhc3MgKmdzdGJhc2VzcmNfY2xhc3M7CisgIEdzdEF1ZGlvQmFzZVNyY0NsYXNzICpnc3RhdWRpb2Jhc2VzcmNfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9qYWNrX2F1ZGlvX3NyY19kZWJ1ZywgImphY2tzcmMiLCAwLAorICAgICAgImphY2tzcmMgZWxlbWVudCIpOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmFzZXNyY19jbGFzcyA9IChHc3RCYXNlU3JjQ2xhc3MgKikga2xhc3M7CisgIGdzdGF1ZGlvYmFzZXNyY19jbGFzcyA9IChHc3RBdWRpb0Jhc2VTcmNDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X2phY2tfYXVkaW9fc3JjX2Rpc3Bvc2U7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9qYWNrX2F1ZGlvX3NyY19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9qYWNrX2F1ZGlvX3NyY19nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DT05ORUNULAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJjb25uZWN0IiwgIkNvbm5lY3QiLAorICAgICAgICAgICJTcGVjaWZ5IGhvdyB0aGUgaW5wdXQgcG9ydHMgd2lsbCBiZSBjb25uZWN0ZWQiLAorICAgICAgICAgIEdTVF9UWVBFX0pBQ0tfQ09OTkVDVCwgREVGQVVMVF9QUk9QX0NPTk5FQ1QsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TRVJWRVIsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgic2VydmVyIiwgIlNlcnZlciIsCisgICAgICAgICAgIlRoZSBKYWNrIHNlcnZlciB0byBjb25uZWN0IHRvIChOVUxMID0gZGVmYXVsdCkiLAorICAgICAgICAgIERFRkFVTFRfUFJPUF9TRVJWRVIsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RKYWNrQXVkaW9TcmM6Y2xpZW50LW5hbWU6CisgICAqCisgICAqIFRoZSBjbGllbnQgbmFtZSB0byB1c2UuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NMSUVOVF9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImNsaWVudC1uYW1lIiwgIkNsaWVudCBuYW1lIiwKKyAgICAgICAgICAiVGhlIGNsaWVudCBuYW1lIG9mIHRoZSBKYWNrIGluc3RhbmNlIChOVUxMID0gZGVmYXVsdCkiLAorICAgICAgICAgIERFRkFVTFRfUFJPUF9DTElFTlRfTkFNRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NMSUVOVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoImNsaWVudCIsICJKYWNrQ2xpZW50IiwgIkhhbmRsZSBmb3IgamFjayBjbGllbnQiLAorICAgICAgICAgIEdTVF9UWVBFX0pBQ0tfQ0xJRU5ULAorICAgICAgICAgIEdTVF9QQVJBTV9NVVRBQkxFX1JFQURZIHwgR19QQVJBTV9SRUFEV1JJVEUgfAorICAgICAgICAgIEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgIC8qKgorICAgICogR3N0SmFja0F1ZGlvU3JjOnBvcnQtcGF0dGVybgorICAgICoKKyAgICAqIGF1dG9jb25uZWN0IHRvIHBvcnRzIG1hdGNoaW5nIHBhdHRlcm4sIHdoZW4gTlVMTCBjb25uZWN0IHRvIHBoeXNpY2FsIHBvcnRzCisgICAgKgorICAgICogU2luY2U6IDEuNgorICAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUE9SVF9QQVRURVJOLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInBvcnQtcGF0dGVybiIsICJwb3J0IHBhdHRlcm4iLAorICAgICAgICAgICJBIHBhdHRlcm4gdG8gc2VsZWN0IHdoaWNoIHBvcnRzIHRvIGNvbm5lY3QgdG8gKE5VTEwgPSBmaXJzdCBwaHlzaWNhbCBwb3J0cykiLAorICAgICAgICAgIERFRkFVTFRfUFJPUF9QT1JUX1BBVFRFUk4sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdEphY2tBdWRpb1Npbms6dHJhbnNwb3J0OgorICAgKgorICAgKiBUaGUgamFjayB0cmFuc3BvcnQgYmVoYXZpb3VyIGZvciB0aGUgY2xpZW50LgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UUkFOU1BPUlQsCisgICAgICBnX3BhcmFtX3NwZWNfZmxhZ3MgKCJ0cmFuc3BvcnQiLCAiVHJhbnNwb3J0IG1vZGUiLAorICAgICAgICAgICJKYWNrIHRyYW5zcG9ydCBiZWhhdmlvdXIgb2YgdGhlIGNsaWVudCIsCisgICAgICAgICAgR1NUX1RZUEVfSkFDS19UUkFOU1BPUlQsIERFRkFVTFRfUFJPUF9UUkFOU1BPUlQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfZmFjdG9yeSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJBdWRpbyBTb3VyY2UgKEphY2spIiwgIlNvdXJjZS9BdWRpbyIsCisgICAgICAiQ2FwdHVyZXMgYXVkaW8gZnJvbSBhIEpBQ0sgc2VydmVyIiwKKyAgICAgICJUcmlzdGFuIE1hdHRoZXdzIDx0cmlzdGFuQHNhdC5xYy5jYT4iKTsKKworICBnc3RiYXNlc3JjX2NsYXNzLT5nZXRfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfamFja19hdWRpb19zcmNfZ2V0Y2Fwcyk7CisgIGdzdGF1ZGlvYmFzZXNyY19jbGFzcy0+Y3JlYXRlX3JpbmdidWZmZXIgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9qYWNrX2F1ZGlvX3NyY19jcmVhdGVfcmluZ2J1ZmZlcik7CisKKyAgLyogcmVmIGNsYXNzIGZyb20gYSB0aHJlYWQtc2FmZSBjb250ZXh0IHRvIHdvcmsgYXJvdW5kIG1pc3NpbmcgYml0IG9mCisgICAqIHRocmVhZC1zYWZldHkgaW4gR09iamVjdCAqLworICBnX3R5cGVfY2xhc3NfcmVmIChHU1RfVFlQRV9KQUNLX1JJTkdfQlVGRkVSKTsKKworICBnc3RfamFja19hdWRpb19jbGllbnRfaW5pdCAoKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9qYWNrX2F1ZGlvX3NyY19pbml0IChHc3RKYWNrQXVkaW9TcmMgKiBzcmMpCit7CisgIC8vZ3N0X2Jhc2Vfc3JjX3NldF9saXZlKEdTVF9CQVNFX1NSQyAoc3JjKSwgVFJVRSk7CisgIHNyYy0+Y29ubmVjdCA9IERFRkFVTFRfUFJPUF9DT05ORUNUOworICBzcmMtPnNlcnZlciA9IGdfc3RyZHVwIChERUZBVUxUX1BST1BfU0VSVkVSKTsKKyAgc3JjLT5qY2xpZW50ID0gTlVMTDsKKyAgc3JjLT5wb3J0cyA9IE5VTEw7CisgIHNyYy0+cG9ydF9jb3VudCA9IDA7CisgIHNyYy0+YnVmZmVycyA9IE5VTEw7CisgIHNyYy0+Y2xpZW50X25hbWUgPSBnX3N0cmR1cCAoREVGQVVMVF9QUk9QX0NMSUVOVF9OQU1FKTsKKyAgc3JjLT50cmFuc3BvcnQgPSBERUZBVUxUX1BST1BfVFJBTlNQT1JUOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2phY2tfYXVkaW9fc3JjX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEphY2tBdWRpb1NyYyAqc3JjID0gR1NUX0pBQ0tfQVVESU9fU1JDIChvYmplY3QpOworCisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzcmMtPmNhcHMsIE5VTEwpOworCisgIGlmIChzcmMtPmNsaWVudF9uYW1lICE9IE5VTEwpIHsKKyAgICBnX2ZyZWUgKHNyYy0+Y2xpZW50X25hbWUpOworICAgIHNyYy0+Y2xpZW50X25hbWUgPSBOVUxMOworICB9CisKKyAgaWYgKHNyYy0+cG9ydF9wYXR0ZXJuICE9IE5VTEwpIHsKKyAgICBnX2ZyZWUgKHNyYy0+cG9ydF9wYXR0ZXJuKTsKKyAgICBzcmMtPnBvcnRfcGF0dGVybiA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9qYWNrX2F1ZGlvX3NyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0SmFja0F1ZGlvU3JjICpzcmMgPSBHU1RfSkFDS19BVURJT19TUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0NMSUVOVF9OQU1FOgorICAgICAgZ19mcmVlIChzcmMtPmNsaWVudF9uYW1lKTsKKyAgICAgIHNyYy0+Y2xpZW50X25hbWUgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QT1JUX1BBVFRFUk46CisgICAgICBnX2ZyZWUgKHNyYy0+cG9ydF9wYXR0ZXJuKTsKKyAgICAgIHNyYy0+cG9ydF9wYXR0ZXJuID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ09OTkVDVDoKKyAgICAgIHNyYy0+Y29ubmVjdCA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TRVJWRVI6CisgICAgICBnX2ZyZWUgKHNyYy0+c2VydmVyKTsKKyAgICAgIHNyYy0+c2VydmVyID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0xJRU5UOgorICAgICAgaWYgKEdTVF9TVEFURSAoc3JjKSA9PSBHU1RfU1RBVEVfTlVMTCB8fAorICAgICAgICAgIEdTVF9TVEFURSAoc3JjKSA9PSBHU1RfU1RBVEVfUkVBRFkpIHsKKyAgICAgICAgc3JjLT5qY2xpZW50ID0gZ192YWx1ZV9nZXRfYm94ZWQgKHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UUkFOU1BPUlQ6CisgICAgICBzcmMtPnRyYW5zcG9ydCA9IGdfdmFsdWVfZ2V0X2ZsYWdzICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfamFja19hdWRpb19zcmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEphY2tBdWRpb1NyYyAqc3JjID0gR1NUX0pBQ0tfQVVESU9fU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DTElFTlRfTkFNRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNyYy0+Y2xpZW50X25hbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BPUlRfUEFUVEVSTjoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNyYy0+cG9ydF9wYXR0ZXJuKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT05ORUNUOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHNyYy0+Y29ubmVjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0VSVkVSOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc3JjLT5zZXJ2ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NMSUVOVDoKKyAgICAgIGdfdmFsdWVfc2V0X2JveGVkICh2YWx1ZSwgc3JjLT5qY2xpZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UUkFOU1BPUlQ6CisgICAgICBnX3ZhbHVlX3NldF9mbGFncyAodmFsdWUsIHNyYy0+dHJhbnNwb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2phY2tfYXVkaW9fc3JjX2dldGNhcHMgKEdzdEJhc2VTcmMgKiBic3JjLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RKYWNrQXVkaW9TcmMgKnNyYyA9IEdTVF9KQUNLX0FVRElPX1NSQyAoYnNyYyk7CisgIGNvbnN0IGNoYXIgKipwb3J0czsKKyAgZ2ludCBtaW4sIG1heDsKKyAgZ2ludCByYXRlOworICBqYWNrX2NsaWVudF90ICpjbGllbnQ7CisKKyAgaWYgKHNyYy0+Y2xpZW50ID09IE5VTEwpCisgICAgZ290byBub19jbGllbnQ7CisKKyAgY2xpZW50ID0gZ3N0X2phY2tfYXVkaW9fY2xpZW50X2dldF9jbGllbnQgKHNyYy0+Y2xpZW50KTsKKworICBpZiAoc3JjLT5jb25uZWN0ID09IEdTVF9KQUNLX0NPTk5FQ1RfQVVUTykgeworICAgIC8qIGdldCBhIHBvcnQgY291bnQsIHRoaXMgaXMgdGhlIG51bWJlciBvZiBjaGFubmVscyB3ZSBjYW4gYXV0b21hdGljYWxseQorICAgICAqIGNvbm5lY3QuICovCisgICAgcG9ydHMgPSBqYWNrX2dldF9wb3J0cyAoY2xpZW50LCBOVUxMLCBOVUxMLAorICAgICAgICBKYWNrUG9ydElzUGh5c2ljYWwgfCBKYWNrUG9ydElzT3V0cHV0KTsKKyAgICBtYXggPSAwOworICAgIGlmIChwb3J0cyAhPSBOVUxMKSB7CisgICAgICBmb3IgKDsgcG9ydHNbbWF4XTsgbWF4KyspOworCisgICAgICBmcmVlIChwb3J0cyk7CisgICAgfSBlbHNlCisgICAgICBtYXggPSAwOworICB9IGVsc2UgeworICAgIC8qIHdlIGFsbG93IGFueSBudW1iZXIgb2YgcGFkcywgc29tZXRoaW5nIGVsc2UgaXMgZ29pbmcgdG8gY29ubmVjdCB0aGUKKyAgICAgKiBwYWRzLiAqLworICAgIG1heCA9IEdfTUFYSU5UOworICB9CisgIG1pbiA9IE1JTiAoMSwgbWF4KTsKKworICByYXRlID0gamFja19nZXRfc2FtcGxlX3JhdGUgKGNsaWVudCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZ290ICVkLSVkIHBvcnRzLCBzYW1wbGVyYXRlOiAlZCIsIG1pbiwgbWF4LCByYXRlKTsKKworICBpZiAoIXNyYy0+Y2FwcykgeworICAgIHNyYy0+Y2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBHU1RfSkFDS19GT1JNQVRfU1RSLAorICAgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwKKyAgICAgICAgInJhdGUiLCBHX1RZUEVfSU5ULCByYXRlLAorICAgICAgICAiY2hhbm5lbHMiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIG1pbiwgbWF4LCBOVUxMKTsKKyAgfQorICBHU1RfSU5GT19PQkpFQ1QgKHNyYywgInJldHVybmluZyBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBzcmMtPmNhcHMpOworCisgIHJldHVybiBnc3RfY2Fwc19yZWYgKHNyYy0+Y2Fwcyk7CisKKyAgLyogRVJST1JTICovCitub19jbGllbnQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJkZXZpY2Ugbm90IG9wZW4sIHVzaW5nIHRlbXBsYXRlIGNhcHMiKTsKKyAgICAvKiBiYXNlIGNsYXNzIHdpbGwgZ2V0IHRlbXBsYXRlIGNhcHMgZm9yIHVzIHdoZW4gd2UgcmV0dXJuIE5VTEwgKi8KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgR3N0QXVkaW9SaW5nQnVmZmVyICoKK2dzdF9qYWNrX2F1ZGlvX3NyY19jcmVhdGVfcmluZ2J1ZmZlciAoR3N0QXVkaW9CYXNlU3JjICogc3JjKQoreworICBHc3RBdWRpb1JpbmdCdWZmZXIgKmJ1ZmZlcjsKKworICBidWZmZXIgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX0pBQ0tfUklOR19CVUZGRVIsIE5VTEwpOworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjcmVhdGVkIHJpbmdidWZmZXIgQCVwIiwgYnVmZmVyKTsKKworICByZXR1cm4gYnVmZmVyOworfQpkaWZmIC0tZ2l0IGEvZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmggYi9leHQvamFjay9nc3RqYWNrYXVkaW9zcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2ZmZTNmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2phY2svZ3N0amFja2F1ZGlvc3JjLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRyaXN0YW4gTWF0dGhld3MgPHRyaXN0YW5Ac2F0LnFjLmNhPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xICh0aGUgIkxHUEwiKSwgaW4KKyAqIHdoaWNoIGNhc2UgdGhlIGZvbGxvd2luZyBwcm92aXNpb25zIGFwcGx5IGluc3RlYWQgb2YgdGhlIG9uZXMKKyAqIG1lbnRpb25lZCBhYm92ZToKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0pBQ0tfQVVESU9fU1JDX0hfXworI2RlZmluZSBfX0dTVF9KQUNLX0FVRElPX1NSQ19IX18KKworI2luY2x1ZGUgPGphY2svamFjay5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb3NyYy5oPgorCisjaW5jbHVkZSAiZ3N0amFja2F1ZGlvY2xpZW50LmgiCisjaW5jbHVkZSAiZ3N0amFjay5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfSkFDS19BVURJT19TUkMgICAgICAgICAgICAgKGdzdF9qYWNrX2F1ZGlvX3NyY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfSkFDS19BVURJT19TUkMob2JqKSAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfSkFDS19BVURJT19TUkMsR3N0SmFja0F1ZGlvU3JjKSkKKyNkZWZpbmUgR1NUX0pBQ0tfQVVESU9fU1JDX0NMQVNTKGtsYXNzKSAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfSkFDS19BVURJT19TUkMsR3N0SmFja0F1ZGlvU3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSkFDS19BVURJT19TUkNfR0VUX0NMQVNTKG9iaikgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksR1NUX1RZUEVfSkFDS19BVURJT19TUkMsR3N0SmFja0F1ZGlvU3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfSkFDS19BVURJT19TUkMob2JqKSAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfSkFDS19BVURJT19TUkMpKQorI2RlZmluZSBHU1RfSVNfSkFDS19BVURJT19TUkNfQ0xBU1Moa2xhc3MpICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9KQUNLX0FVRElPX1NSQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RKYWNrQXVkaW9TcmMgR3N0SmFja0F1ZGlvU3JjOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEphY2tBdWRpb1NyY0NsYXNzIEdzdEphY2tBdWRpb1NyY0NsYXNzOworCitzdHJ1Y3QgX0dzdEphY2tBdWRpb1NyYworeworICAgIEdzdEF1ZGlvQmFzZVNyYyBzcmM7CisKKyAgICAvKjwgcHJpdmF0ZSA+Ki8KKyAgICAvKiBjYWNoZWQgY2FwcyAqLworICAgIEdzdENhcHMgICAgICAgICAqY2FwczsKKworICAgIC8qIHByb3BlcnRpZXMgKi8KKyAgICBHc3RKYWNrQ29ubmVjdCAgIGNvbm5lY3Q7CisgICAgZ2NoYXIgICAgICAgICAgICpzZXJ2ZXI7CisgICAgamFja19jbGllbnRfdCAgICpqY2xpZW50OworICAgIGdjaGFyICAgICAgICAgICAqY2xpZW50X25hbWU7CisgICAgZ2NoYXIgICAgICAgICAgICpwb3J0X3BhdHRlcm47CisgICAgZ3VpbnQgICAgICAgICAgICB0cmFuc3BvcnQ7CisKKyAgICAvKiBvdXIgY2xpZW50ICovCisgICAgR3N0SmFja0F1ZGlvQ2xpZW50ICpjbGllbnQ7CisKKyAgICAvKiBvdXIgcG9ydHMgKi8KKyAgICBqYWNrX3BvcnRfdCAgICAqKnBvcnRzOworICAgIGludCBwb3J0X2NvdW50OworICAgIHNhbXBsZV90ICoqYnVmZmVyczsKK307CisKK3N0cnVjdCBfR3N0SmFja0F1ZGlvU3JjQ2xhc3MKK3sKKyAgICBHc3RBdWRpb0Jhc2VTcmNDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfamFja19hdWRpb19zcmNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfSkFDS19BVURJT19TUkNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvamFjay9nc3RqYWNrcmluZ2J1ZmZlci5oIGIvZXh0L2phY2svZ3N0amFja3JpbmdidWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGRlNGI4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2phY2svZ3N0amFja3JpbmdidWZmZXIuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBUcmlzdGFuIE1hdHRoZXdzIDx0cmlzdGFuQHNhdC5xYy5jYT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSAodGhlICJMR1BMIiksIGluCisgKiB3aGljaCBjYXNlIHRoZSBmb2xsb3dpbmcgcHJvdmlzaW9ucyBhcHBseSBpbnN0ZWFkIG9mIHRoZSBvbmVzCisgKiBtZW50aW9uZWQgYWJvdmU6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9KQUNLX1JJTkdfQlVGRkVSX0hfXworI2RlZmluZSBfX0dTVF9KQUNLX1JJTkdfQlVGRkVSX0hfXworCisjZGVmaW5lIEdTVF9UWVBFX0pBQ0tfUklOR19CVUZGRVIgICAgICAgICAgICAgICAoZ3N0X2phY2tfcmluZ19idWZmZXJfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0pBQ0tfUklOR19CVUZGRVIob2JqKSAgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9KQUNLX1JJTkdfQlVGRkVSLEdzdEphY2tSaW5nQnVmZmVyKSkKKyNkZWZpbmUgR1NUX0pBQ0tfUklOR19CVUZGRVJfQ0xBU1Moa2xhc3MpICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0pBQ0tfUklOR19CVUZGRVIsR3N0SmFja1JpbmdCdWZmZXJDbGFzcykpCisjZGVmaW5lIEdTVF9KQUNLX1JJTkdfQlVGRkVSX0dFVF9DTEFTUyhvYmopICAgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX0pBQ0tfUklOR19CVUZGRVIsR3N0SmFja1JpbmdCdWZmZXJDbGFzcykpCisjZGVmaW5lIEdTVF9KQUNLX1JJTkdfQlVGRkVSX0NBU1Qob2JqKSAgICAgICAgICAoKEdzdEphY2tSaW5nQnVmZmVyICopb2JqKQorI2RlZmluZSBHU1RfSVNfSkFDS19SSU5HX0JVRkZFUihvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0pBQ0tfUklOR19CVUZGRVIpKQorI2RlZmluZSBHU1RfSVNfSkFDS19SSU5HX0JVRkZFUl9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfSkFDS19SSU5HX0JVRkZFUikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RKYWNrUmluZ0J1ZmZlciBHc3RKYWNrUmluZ0J1ZmZlcjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RKYWNrUmluZ0J1ZmZlckNsYXNzIEdzdEphY2tSaW5nQnVmZmVyQ2xhc3M7CisKK3N0cnVjdCBfR3N0SmFja1JpbmdCdWZmZXIKK3sKKyAgR3N0QXVkaW9SaW5nQnVmZmVyIG9iamVjdDsKKworICBnaW50IHNhbXBsZV9yYXRlOworICBnaW50IGJ1ZmZlcl9zaXplOworICBnaW50IGNoYW5uZWxzOworfTsKKworc3RydWN0IF9Hc3RKYWNrUmluZ0J1ZmZlckNsYXNzCit7CisgIEdzdEF1ZGlvUmluZ0J1ZmZlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK3N0YXRpYyB2b2lkIGdzdF9qYWNrX3JpbmdfYnVmZmVyX2NsYXNzX2luaXQoR3N0SmFja1JpbmdCdWZmZXJDbGFzcyAqIGtsYXNzKTsKK3N0YXRpYyB2b2lkIGdzdF9qYWNrX3JpbmdfYnVmZmVyX2luaXQoR3N0SmFja1JpbmdCdWZmZXIgKiByaW5nYnVmZmVyLAorICAgIEdzdEphY2tSaW5nQnVmZmVyQ2xhc3MgKiBrbGFzcyk7CisKK3N0YXRpYyBHc3RBdWRpb1JpbmdCdWZmZXJDbGFzcyAqcmluZ19wYXJlbnRfY2xhc3MgPSBOVUxMOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2phY2tfcmluZ19idWZmZXJfb3Blbl9kZXZpY2UoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfamFja19yaW5nX2J1ZmZlcl9jbG9zZV9kZXZpY2UoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfamFja19yaW5nX2J1ZmZlcl9hY3F1aXJlKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZixHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2phY2tfcmluZ19idWZmZXJfcmVsZWFzZShHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpOworc3RhdGljIGdib29sZWFuIGdzdF9qYWNrX3JpbmdfYnVmZmVyX3N0YXJ0KEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2phY2tfcmluZ19idWZmZXJfcGF1c2UoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfamFja19yaW5nX2J1ZmZlcl9zdG9wKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ3VpbnQgZ3N0X2phY2tfcmluZ19idWZmZXJfZGVsYXkoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKTsKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEvZXh0L2phY2svZ3N0amFja3V0aWwuYyBiL2V4dC9qYWNrL2dzdGphY2t1dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwZTE0YQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrL2dzdGphY2t1dGlsLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qIEdTdHJlYW1lciBKYWNrIHV0aWxpdHkgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVHJpc3RhbiBNYXR0aGV3cyA8dHJpc3RhbkBzYXQucWMuY2E+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImdzdGphY2t1dGlsLmgiCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKK3N0YXRpYyBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBkZWZhdWx0X3Bvc2l0aW9uc1s4XVs4XSA9IHsKKyAgLyogMSBjaGFubmVsICovCisgIHsKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTU9OTywKKyAgICAgIH0sCisgIC8qIDIgY2hhbm5lbHMgKi8KKyAgeworICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgICAgIH0sCisgIC8qIDMgY2hhbm5lbHMgKDIuMSkgKi8KKyAgeworICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMSwgICAgICAgIC8qIG9yIEZST05UX0NFTlRFUiBmb3IgMy4wPyAqLworICAgICAgfSwKKyAgLyogNCBjaGFubmVscyAoNC4wIG9yIDMuMT8pICovCisgIHsKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVCwKKyAgICAgIH0sCisgIC8qIDUgY2hhbm5lbHMgKi8KKyAgeworICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsCisgICAgICB9LAorICAvKiA2IGNoYW5uZWxzICovCisgIHsKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSLAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxLAorICAgICAgfSwKKyAgLyogNyBjaGFubmVscyAqLworICB7CisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0xFRlQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMSwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9DRU5URVIsCisgICAgICB9LAorICAvKiA4IGNoYW5uZWxzICovCisgIHsKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVCwKKyAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSLAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxLAorICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfUklHSFQsCisgICAgICB9Cit9OworCisKKy8qIGlmIGNoYW5uZWxzIGFyZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gOCwgd2Ugc2V0IGEgZGVmYXVsdCBsYXlvdXQsCisgKiBvdGhlcndpc2Ugc2V0IGxheW91dCB0byBhbiBhcnJheSBvZiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FICovCit2b2lkCitnc3RfamFja19zZXRfbGF5b3V0IChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWZmZXIsIEdzdEF1ZGlvUmluZ0J1ZmZlclNwZWMgKiBzcGVjKQoreworICBnaW50IGk7CisKKyAgaWYgKHNwZWMtPmluZm8uY2hhbm5lbHMgPD0gOCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBzcGVjLT5pbmZvLmNoYW5uZWxzOyBpKyspCisgICAgICBzcGVjLT5pbmZvLnBvc2l0aW9uW2ldID0gZGVmYXVsdF9wb3NpdGlvbnNbc3BlYy0+aW5mby5jaGFubmVscyAtIDFdW2ldOworICAgIGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b192YWxpZF9vcmRlciAoc3BlYy0+aW5mby5wb3NpdGlvbiwKKyAgICAgICAgc3BlYy0+aW5mby5jaGFubmVscyk7CisgICAgZ3N0X2F1ZGlvX3JpbmdfYnVmZmVyX3NldF9jaGFubmVsX3Bvc2l0aW9ucyAoYnVmZmVyLAorICAgICAgICBkZWZhdWx0X3Bvc2l0aW9uc1tzcGVjLT5pbmZvLmNoYW5uZWxzIC0gMV0pOworICB9IGVsc2UgeworICAgIHNwZWMtPmluZm8uZmxhZ3MgfD0gR1NUX0FVRElPX0ZMQUdfVU5QT1NJVElPTkVEOworICAgIGZvciAoaSA9IDA7IGkgPCBHX05fRUxFTUVOVFMgKHNwZWMtPmluZm8ucG9zaXRpb24pOyBpKyspCisgICAgICBzcGVjLT5pbmZvLnBvc2l0aW9uW2ldID0gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORTsKKyAgICBnc3RfYXVkaW9fcmluZ19idWZmZXJfc2V0X2NoYW5uZWxfcG9zaXRpb25zIChidWZmZXIsIHNwZWMtPmluZm8ucG9zaXRpb24pOworICB9CisKKyAgZ3N0X2NhcHNfdW5yZWYgKHNwZWMtPmNhcHMpOworICBzcGVjLT5jYXBzID0gZ3N0X2F1ZGlvX2luZm9fdG9fY2FwcyAoJnNwZWMtPmluZm8pOworfQpkaWZmIC0tZ2l0IGEvZXh0L2phY2svZ3N0amFja3V0aWwuaCBiL2V4dC9qYWNrL2dzdGphY2t1dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0YmNjNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrL2dzdGphY2t1dGlsLmgKQEAgLTAsMCArMSwzMSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVHJpc3RhbiBNYXR0aGV3cyA8dHJpc3RhbkBzYXQucWMuY2E+CisgKgorICogZ3N0amFja3V0aWwuaDoKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9HU1RfSkFDS19VVElMX0hfCisjZGVmaW5lIF9HU1RfSkFDS19VVElMX0hfCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKK3ZvaWQKK2dzdF9qYWNrX3NldF9sYXlvdXQgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZmZlciwgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqc3BlYyk7CisKKyNlbmRpZiAgLy8gX0dTVF9KQUNLX1VUSUxfSF8KZGlmZiAtLWdpdCBhL2V4dC9qYWNrL21lc29uLmJ1aWxkIGIvZXh0L2phY2svbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE5OGEwNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qYWNrL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMjAgQEAKK2phY2tfc291cmNlcyA9IFsKKyAgJ2dzdGphY2thdWRpb2NsaWVudC5jJywKKyAgJ2dzdGphY2thdWRpb3NpbmsuYycsCisgICdnc3RqYWNrYXVkaW9zcmMuYycsCisgICdnc3RqYWNrLmMnLAorICAnZ3N0amFja3V0aWwuYycsCitdCisKK2xpYmphY2tfZGVwID0gZGVwZW5kZW5jeSgnamFjaycsIHZlcnNpb24gOiAnPj0gMS45LjcnLCByZXF1aXJlZCA6IGZhbHNlKQorCitpZiBsaWJqYWNrX2RlcC5mb3VuZCgpCisgIGdzdGphY2sgPSBsaWJyYXJ5KCdnc3RqYWNrJywKKyAgICBqYWNrX3NvdXJjZXMsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzICsgWyctREhBVkVfSkFDS18xXzlfNyddLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3N0X2RlcCwgZ3N0YmFzZV9kZXAsIGdzdGF1ZGlvX2RlcCwgbGliamFja19kZXBdLAorICAgIGluc3RhbGwgOiB0cnVlLAorICAgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKyAgKQorZW5kaWYKZGlmZiAtLWdpdCBhL2V4dC9qcGVnL01ha2VmaWxlLmFtIGIvZXh0L2pwZWcvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3NTQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qcGVnL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTcgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGpwZWcubGEKKworbGliZ3N0anBlZ19sYV9TT1VSQ0VTID0gXAorCWdzdGpwZWcuYyBcCisJZ3N0anBlZ2VuYy5jIFwKKwlnc3RqcGVnZGVjLmMKKyMgZGVwcmVjdGVkIGdzdHNtb2tlZW5jLmMgc21va2Vjb2RlYy5jIGdzdHNtb2tlZGVjLmMKKworbGliZ3N0anBlZ19sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQorbGliZ3N0anBlZ19sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAtbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJJChKUEVHX0xJQlMpICQoTElCTSkKK2xpYmdzdGpwZWdfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IFwKKwlnc3RqcGVnLmggXAorCWdzdGpwZWdkZWMuaCBnc3RqcGVnZW5jLmgKKyMgZGVwcmVjYXRlZCBnc3RzbW9rZWVuYy5oIGdzdHNtb2tlZGVjLmggc21va2Vjb2RlYy5oIHNtb2tlZm9ybWF0LmgKZGlmZiAtLWdpdCBhL2V4dC9qcGVnL1JFQURNRSBiL2V4dC9qcGVnL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmExZDBjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2pwZWcvUkVBRE1FCkBAIC0wLDAgKzEsMjAgQEAKK1RoZSBTbW9rZSBDb2RlYworLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgaXMgYSB2ZXJ5IHNpbXBsZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gSSB3YXMgdG95aW5nIHdpdGggd2hlbiBkb2luZyBhCitKYXZhIGJhc2VkIHBsYXllci4gRGVjb2RpbmcgYSBKUEVHIGluIEphdmEgaGFzIGFjY2VwdGFibGUgc3BlZWQgc28gdGhpcyBjb2RlYwordHJpZXMgdG8gZXhwbG9pdCB0aGF0IGZlYXR1cmUuIFRoZSBhbGdvcml0aG0gZmlyc3QgY29tcGFyZXMgdGhlIGxhc3QgYW5kIHRoZSAKK25ldyBpbWFnZSBhbmQgZmluZHMgYWxsIDE2eDE2IGJsb2NrcyB0aGF0IGhhdmUgYSBzcXVhcmVkIGRpZmZlcmVuY2UgYmlnZ2VyIHRoYW4KK2EgY29uZmlndXJhYmxlIHRocmVzaG9sZC4gVGhlbiBhbGwgdGhlc2UgYmxvY2tzIGFyZSBjb21wcmVzc2VkIGludG8gYW4gTnhNIEpQRUcuCitUaGUgcXVhbGl0eSBvZiB0aGUgSlBFRyBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgYmxvY2tzLCB0aGlzCit3YXksIHRoZSBwaWN0dXJlIHF1YWxpdHkgZGVncmFkZXMgd2l0aCBoZWF2eSBtb3Rpb24gc2NlbmVzIGJ1dCB0aGUgYml0cmF0ZSBzdGF5cworbW9yZSBvciBsZXNzIGNvbnN0YW50LgorRGVjb2RpbmcgZGVjb21wcmVzc2VzIHRoZSBKUEVHIGFuZCB0aGVuIHVwZGF0ZXMgdGhlIG9sZCBwaWN0dXJlIHdpdGggdGhlIG5ldworYmxvY2tzLgorCisKK1RPRE86CistLS0tCistIG1ha2UgZm9ybWF0IGV4dGVuc2libGUKKy0gbW90aW9uIHZlY3RvcnMKKy0gZG8gc29tZSByZWFsIGJpdHJhdGUgY29udHJvbApkaWZmIC0tZ2l0IGEvZXh0L2pwZWcvZ3N0anBlZy5jIGIvZXh0L2pwZWcvZ3N0anBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllY2RkNWQKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvanBlZy9nc3RqcGVnLmMKQEAgLTAsMCArMSw4MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImdzdGpwZWcuaCIKKyNpbmNsdWRlICJnc3RqcGVnZGVjLmgiCisjaW5jbHVkZSAiZ3N0anBlZ2VuYy5oIgorI2lmIDAKKyNpbmNsdWRlICJnc3RzbW9rZWVuYy5oIgorI2luY2x1ZGUgImdzdHNtb2tlZGVjLmgiCisjZW5kaWYKKworR1R5cGUKK2dzdF9pZGN0X21ldGhvZF9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGlkY3RfbWV0aG9kX3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBpZGN0X21ldGhvZFtdID0geworICAgIHtKRENUX0lTTE9XLCAiU2xvdyBidXQgYWNjdXJhdGUgaW50ZWdlciBhbGdvcml0aG0iLCAiaXNsb3cifSwKKyAgICB7SkRDVF9JRkFTVCwgIkZhc3RlciwgbGVzcyBhY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZCIsICJpZmFzdCJ9LAorICAgIHtKRENUX0ZMT0FULCAiRmxvYXRpbmctcG9pbnQ6IGFjY3VyYXRlLCBmYXN0IG9uIGZhc3QgSFciLCAiZmxvYXQifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0sCisgIH07CisKKyAgaWYgKCFpZGN0X21ldGhvZF90eXBlKSB7CisgICAgaWRjdF9tZXRob2RfdHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RJRENUTWV0aG9kIiwgaWRjdF9tZXRob2QpOworICB9CisgIHJldHVybiBpZGN0X21ldGhvZF90eXBlOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAianBlZ2VuYyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICAgR1NUX1RZUEVfSlBFR0VOQykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImpwZWdkZWMiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX0pQRUdfREVDKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyNpZiAwCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInNtb2tlZW5jIiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgICAgICBHU1RfVFlQRV9TTU9LRUVOQykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInNtb2tlZGVjIiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgICAgICBHU1RfVFlQRV9TTU9LRURFQykpCisgICAgcmV0dXJuIEZBTFNFOworI2VuZGlmCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBqcGVnLAorICAgICJKUGVnIHBsdWdpbiBsaWJyYXJ5IiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9leHQvanBlZy9nc3RqcGVnLmggYi9leHQvanBlZy9nc3RqcGVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhMzBhMgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9qcGVnL2dzdGpwZWcuaApAQCAtMCwwICsxLDM1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX0pQRUdfSF9fCisjZGVmaW5lIF9fR1NUX0pQRUdfSF9fCisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKworI2RlZmluZSBHU1RfVFlQRV9JRENUX01FVEhPRCAoZ3N0X2lkY3RfbWV0aG9kX2dldF90eXBlKCkpCitHVHlwZSBnc3RfaWRjdF9tZXRob2RfZ2V0X3R5cGUgKHZvaWQpOworCisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9KUEVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L2pwZWcvZ3N0anBlZ2RlYy5jIGIvZXh0L2pwZWcvZ3N0anBlZ2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OGIyNTgKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvanBlZy9nc3RqcGVnZGVjLmMKQEAgLTAsMCArMSwxNTU1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICogQ29weXJpZ2h0IChDKSAyMDEyIENvbGxhYm9yYSBMdGQuCisgKglBdXRob3IgOiBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1qcGVnZGVjCisgKgorICogRGVjb2RlcyBqcGVnIGltYWdlcy4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgZmlsZXNyYyBsb2NhdGlvbj1tanBlZy5hdmkgISBhdmlkZW11eCAhICBxdWV1ZSAhIGpwZWdkZWMgISB2aWRlb2NvbnZlcnQgISB2aWRlb3NjYWxlICEgYXV0b3ZpZGVvc2luaworICogXXwgVGhlIGFib3ZlIHBpcGVsaW5lIGRlY29kZSB0aGUgbWpwZWcgc3RyZWFtIGFuZCByZW5kZXJzIGl0IHRvIHRoZSBzY3JlZW4uCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdGpwZWdkZWMuaCIKKyNpbmNsdWRlICJnc3RqcGVnLmgiCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvbWV0YS5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb3Bvb2wuaD4KKyNpbmNsdWRlICJnc3QvZ3N0LWkxOG4tcGx1Z2luLmgiCisjaW5jbHVkZSA8amVycm9yLmg+CisKKyNkZWZpbmUgTUlOX1dJRFRIICAxCisjZGVmaW5lIE1BWF9XSURUSCAgNjU1MzUKKyNkZWZpbmUgTUlOX0hFSUdIVCAxCisjZGVmaW5lIE1BWF9IRUlHSFQgNjU1MzUKKworI2RlZmluZSBDSU5GT19HRVRfSlBFR0RFQyhjaW5mb19wdHIpIFwKKyAgICAgICAgKCgoc3RydWN0IEdzdEpwZWdEZWNTb3VyY2VNZ3IqKSgoY2luZm9fcHRyKS0+c3JjKSktPmRlYykKKworI2RlZmluZSBKUEVHX0RFRkFVTFRfSURDVF9NRVRIT0QJSkRDVF9GQVNURVNUCisjZGVmaW5lIEpQRUdfREVGQVVMVF9NQVhfRVJST1JTIAkwCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0lEQ1RfTUVUSE9ELAorICBQUk9QX01BWF9FUlJPUlMKK307CisKKy8qICpJTkRFTlQtT0ZGKiAqLworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9qcGVnX2RlY19zcmNfcGFkX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UKKyAgICAgICAgKCJ7IEk0MjAsIFJHQiwgQkdSLCBSR0J4LCB4UkdCLCBCR1J4LCB4QkdSLCBHUkFZOCB9IikpCisgICAgKTsKKy8qICpJTkRFTlQtT04qICovCisKKy8qIEZJWE1FOiBzb2YtbWFya2VyIGlzIGZvciBJSkcgbGlianBlZyA4LCBzaG91bGQgYmUgZGlmZmVyZW50IGZvciA2LjIgKi8KKy8qIEZJWE1FOiBhZGQgYmFjayAic29mLW1hcmtlciA9IChpbnQpIHsgMCwgMSwgMiwgNSwgNiwgNywgOSwgMTAsIDEzLCAxNCB9IgorICogb25jZSB3ZSBoYXZlIGEgcGFyc2VyIGFuZC9vciBkZW11eGVyIHNldCBjYXBzIHByb3Blcmx5ICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X2pwZWdfZGVjX3NpbmtfcGFkX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImltYWdlL2pwZWciKQorICAgICk7CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGpwZWdfZGVjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGpwZWdfZGVjX2RlYnVnCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChHU1RfQ0FUX1BFUkZPUk1BTkNFKTsKKworc3RhdGljIHZvaWQgZ3N0X2pwZWdfZGVjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9qcGVnX2RlY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfanBlZ19kZWNfc2V0X2Zvcm1hdCAoR3N0VmlkZW9EZWNvZGVyICogZGVjLAorICAgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqIHN0YXRlKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfanBlZ19kZWNfc3RhcnQgKEdzdFZpZGVvRGVjb2RlciAqIGJkZWMpOworc3RhdGljIGdib29sZWFuIGdzdF9qcGVnX2RlY19zdG9wIChHc3RWaWRlb0RlY29kZXIgKiBiZGVjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfanBlZ19kZWNfZmx1c2ggKEdzdFZpZGVvRGVjb2RlciAqIGJkZWMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2pwZWdfZGVjX3BhcnNlIChHc3RWaWRlb0RlY29kZXIgKiBiZGVjLAorICAgIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lLCBHc3RBZGFwdGVyICogYWRhcHRlciwgZ2Jvb2xlYW4gYXRfZW9zKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9qcGVnX2RlY19oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRGVjb2RlciAqIGJkZWMsCisgICAgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUpOworc3RhdGljIGdib29sZWFuIGdzdF9qcGVnX2RlY19kZWNpZGVfYWxsb2NhdGlvbiAoR3N0VmlkZW9EZWNvZGVyICogYmRlYywKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfanBlZ19kZWNfc2lua19ldmVudCAoR3N0VmlkZW9EZWNvZGVyICogYmRlYywKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworI2RlZmluZSBnc3RfanBlZ19kZWNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0SnBlZ0RlYywgZ3N0X2pwZWdfZGVjLCBHU1RfVFlQRV9WSURFT19ERUNPREVSKTsKKworc3RhdGljIHZvaWQKK2dzdF9qcGVnX2RlY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0SnBlZ0RlYyAqZGVjID0gR1NUX0pQRUdfREVDIChvYmplY3QpOworCisgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzICgmZGVjLT5jaW5mbyk7CisgIGlmIChkZWMtPmlucHV0X3N0YXRlKQorICAgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAoZGVjLT5pbnB1dF9zdGF0ZSk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdfZGVjX2NsYXNzX2luaXQgKEdzdEpwZWdEZWNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR3N0VmlkZW9EZWNvZGVyQ2xhc3MgKnZkZWNfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICB2ZGVjX2NsYXNzID0gKEdzdFZpZGVvRGVjb2RlckNsYXNzICopIGtsYXNzOworCisgIHBhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2pwZWdfZGVjX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfanBlZ19kZWNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfanBlZ19kZWNfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSURDVF9NRVRIT0QsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoImlkY3QtbWV0aG9kIiwgIklEQ1QgTWV0aG9kIiwKKyAgICAgICAgICAiVGhlIElEQ1QgYWxnb3JpdGhtIHRvIHVzZSIsIEdTVF9UWVBFX0lEQ1RfTUVUSE9ELAorICAgICAgICAgIEpQRUdfREVGQVVMVF9JRENUX01FVEhPRCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0SnBlZ0RlYzptYXgtZXJyb3JzOgorICAgKgorICAgKiBFcnJvciBvdXQgYWZ0ZXIgcmVjZWl2aW5nIE4gY29uc2VjdXRpdmUgZGVjb2RpbmcgZXJyb3JzCisgICAqICgtMSA9IG5ldmVyIGVycm9yIG91dCwgMCA9IGF1dG9tYXRpYywgMSA9IGZhaWwgb24gZmlyc3QgZXJyb3IsIGV0Yy4pCisgICAqCisgICAqIERlcHJlY2F0ZWQ6IDEuMy4xOiBQcm9wZXJ0eSB3YXNuJ3QgdXNlZCBpbnRlcm5hbGx5CisgICAqLworI2lmbmRlZiBHU1RfUkVNT1ZFX0RFUFJFQ0FURUQKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfRVJST1JTLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoIm1heC1lcnJvcnMiLCAiTWF4aW11bSBDb25zZWN1dGl2ZSBEZWNvZGluZyBFcnJvcnMiLAorICAgICAgICAgICIoRGVwcmVjYXRlZCkgRXJyb3Igb3V0IGFmdGVyIHJlY2VpdmluZyBOIGNvbnNlY3V0aXZlIGRlY29kaW5nIGVycm9ycyIKKyAgICAgICAgICAiICgtMSA9IG5ldmVyIGZhaWwsIDAgPSBhdXRvbWF0aWMsIDEgPSBmYWlsIG9uIGZpcnN0IGVycm9yKSIsCisgICAgICAgICAgLTEsIEdfTUFYSU5ULCBKUEVHX0RFRkFVTFRfTUFYX0VSUk9SUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHX1BBUkFNX0RFUFJFQ0FURUQpKTsKKyNlbmRpZgorCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9qcGVnX2RlY19zcmNfcGFkX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X2pwZWdfZGVjX3NpbmtfcGFkX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIkpQRUcgaW1hZ2UgZGVjb2RlciIsCisgICAgICAiQ29kZWMvRGVjb2Rlci9JbWFnZSIsICJEZWNvZGUgaW1hZ2VzIGZyb20gSlBFRyBmb3JtYXQiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+Iik7CisKKyAgdmRlY19jbGFzcy0+c3RhcnQgPSBnc3RfanBlZ19kZWNfc3RhcnQ7CisgIHZkZWNfY2xhc3MtPnN0b3AgPSBnc3RfanBlZ19kZWNfc3RvcDsKKyAgdmRlY19jbGFzcy0+Zmx1c2ggPSBnc3RfanBlZ19kZWNfZmx1c2g7CisgIHZkZWNfY2xhc3MtPnBhcnNlID0gZ3N0X2pwZWdfZGVjX3BhcnNlOworICB2ZGVjX2NsYXNzLT5zZXRfZm9ybWF0ID0gZ3N0X2pwZWdfZGVjX3NldF9mb3JtYXQ7CisgIHZkZWNfY2xhc3MtPmhhbmRsZV9mcmFtZSA9IGdzdF9qcGVnX2RlY19oYW5kbGVfZnJhbWU7CisgIHZkZWNfY2xhc3MtPmRlY2lkZV9hbGxvY2F0aW9uID0gZ3N0X2pwZWdfZGVjX2RlY2lkZV9hbGxvY2F0aW9uOworICB2ZGVjX2NsYXNzLT5zaW5rX2V2ZW50ID0gZ3N0X2pwZWdfZGVjX3NpbmtfZXZlbnQ7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGpwZWdfZGVjX2RlYnVnLCAianBlZ2RlYyIsIDAsICJKUEVHIGRlY29kZXIiKTsKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0dFVCAoR1NUX0NBVF9QRVJGT1JNQU5DRSwgIkdTVF9QRVJGT1JNQU5DRSIpOworfQorCitzdGF0aWMgYm9vbGVhbgorZ3N0X2pwZWdfZGVjX2ZpbGxfaW5wdXRfYnVmZmVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBXZSBwYXNzIGluIGZ1bGwgZnJhbWUgaW5pdGlhbGx5LCBpZiB0aGlzIGdldCBjYWxsZWQsIHRoZSBmcmFtZSBpcyBtb3N0IGxpa2VseQorICAgKiBjb3JydXB0ZWQgKi8KKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdfZGVjX2luaXRfc291cmNlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBHU1RfTE9HX09CSkVDVCAoQ0lORk9fR0VUX0pQRUdERUMgKGNpbmZvKSwgImluaXRfc291cmNlIik7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9qcGVnX2RlY19za2lwX2lucHV0X2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGdsb25nIG51bV9ieXRlcykKK3sKKyAgR3N0SnBlZ0RlYyAqZGVjID0gQ0lORk9fR0VUX0pQRUdERUMgKGNpbmZvKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZWMsICJza2lwICVsZCBieXRlcyIsIG51bV9ieXRlcyk7CisKKyAgaWYgKG51bV9ieXRlcyA+IDAgJiYgY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyID49IG51bV9ieXRlcykgeworICAgIGNpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZSArPSAoc2l6ZV90KSBudW1fYnl0ZXM7CisgICAgY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyIC09IChzaXplX3QpIG51bV9ieXRlczsKKyAgfQorfQorCitzdGF0aWMgYm9vbGVhbgorZ3N0X2pwZWdfZGVjX3Jlc3luY190b19yZXN0YXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBnaW50IGRlc2lyZWQpCit7CisgIEdTVF9MT0dfT0JKRUNUIChDSU5GT19HRVRfSlBFR0RFQyAoY2luZm8pLCAicmVzeW5jX3RvX3N0YXJ0Iik7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdfZGVjX3Rlcm1fc291cmNlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBHU1RfTE9HX09CSkVDVCAoQ0lORk9fR0VUX0pQRUdERUMgKGNpbmZvKSwgInRlcm1fc291cmNlIik7CisgIHJldHVybjsKK30KKworTUVUSE9EREVGICh2b2lkKQorICAgIGdzdF9qcGVnX2RlY19teV9vdXRwdXRfbWVzc2FnZSAoal9jb21tb25fcHRyIGNpbmZvKQoreworICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBub3RoaW5nICovCit9CisKK01FVEhPRERFRiAodm9pZCkKKyAgICBnc3RfanBlZ19kZWNfbXlfZW1pdF9tZXNzYWdlIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBtc2dfbGV2ZWwpCit7CisgIC8qIEdTVF9MT0dfT0JKRUNUIChDSU5GT19HRVRfSlBFR0RFQyAoJmNpbmZvKSwgIm1zZ19sZXZlbD0lZCIsIG1zZ19sZXZlbCk7ICovCisgIHJldHVybjsKK30KKworTUVUSE9EREVGICh2b2lkKQorICAgIGdzdF9qcGVnX2RlY19teV9lcnJvcl9leGl0IChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIHN0cnVjdCBHc3RKcGVnRGVjRXJyb3JNZ3IgKmVycl9tZ3IgPSAoc3RydWN0IEdzdEpwZWdEZWNFcnJvck1nciAqKSBjaW5mby0+ZXJyOworCisgICgqY2luZm8tPmVyci0+b3V0cHV0X21lc3NhZ2UpIChjaW5mbyk7CisgIGxvbmdqbXAgKGVycl9tZ3ItPnNldGptcF9idWZmZXIsIDEpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdfZGVjX2luaXQgKEdzdEpwZWdEZWMgKiBkZWMpCit7CisgIEdTVF9ERUJVRyAoImluaXRpYWxpemluZyIpOworCisgIC8qIHNldHVwIGpwZWdsaWIgKi8KKyAgbWVtc2V0ICgmZGVjLT5jaW5mbywgMCwgc2l6ZW9mIChkZWMtPmNpbmZvKSk7CisgIG1lbXNldCAoJmRlYy0+amVyciwgMCwgc2l6ZW9mIChkZWMtPmplcnIpKTsKKyAgZGVjLT5jaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvciAoJmRlYy0+amVyci5wdWIpOworICBkZWMtPmplcnIucHViLm91dHB1dF9tZXNzYWdlID0gZ3N0X2pwZWdfZGVjX215X291dHB1dF9tZXNzYWdlOworICBkZWMtPmplcnIucHViLmVtaXRfbWVzc2FnZSA9IGdzdF9qcGVnX2RlY19teV9lbWl0X21lc3NhZ2U7CisgIGRlYy0+amVyci5wdWIuZXJyb3JfZXhpdCA9IGdzdF9qcGVnX2RlY19teV9lcnJvcl9leGl0OworCisgIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MgKCZkZWMtPmNpbmZvKTsKKworICBkZWMtPmNpbmZvLnNyYyA9IChzdHJ1Y3QganBlZ19zb3VyY2VfbWdyICopICZkZWMtPmpzcmM7CisgIGRlYy0+Y2luZm8uc3JjLT5pbml0X3NvdXJjZSA9IGdzdF9qcGVnX2RlY19pbml0X3NvdXJjZTsKKyAgZGVjLT5jaW5mby5zcmMtPmZpbGxfaW5wdXRfYnVmZmVyID0gZ3N0X2pwZWdfZGVjX2ZpbGxfaW5wdXRfYnVmZmVyOworICBkZWMtPmNpbmZvLnNyYy0+c2tpcF9pbnB1dF9kYXRhID0gZ3N0X2pwZWdfZGVjX3NraXBfaW5wdXRfZGF0YTsKKyAgZGVjLT5jaW5mby5zcmMtPnJlc3luY190b19yZXN0YXJ0ID0gZ3N0X2pwZWdfZGVjX3Jlc3luY190b19yZXN0YXJ0OworICBkZWMtPmNpbmZvLnNyYy0+dGVybV9zb3VyY2UgPSBnc3RfanBlZ19kZWNfdGVybV9zb3VyY2U7CisgIGRlYy0+anNyYy5kZWMgPSBkZWM7CisKKyAgLyogaW5pdCBwcm9wZXJ0aWVzICovCisgIGRlYy0+aWRjdF9tZXRob2QgPSBKUEVHX0RFRkFVTFRfSURDVF9NRVRIT0Q7CisgIGRlYy0+bWF4X2Vycm9ycyA9IEpQRUdfREVGQVVMVF9NQVhfRVJST1JTOworCisgIGdzdF92aWRlb19kZWNvZGVyX3NldF91c2VfZGVmYXVsdF9wYWRfYWNjZXB0Y2FwcyAoR1NUX1ZJREVPX0RFQ09ERVJfQ0FTVAorICAgICAgKGRlYyksIFRSVUUpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9WSURFT19ERUNPREVSX1NJTktfUEFEIChkZWMpKTsKK30KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorZ3N0X2pwZWdfZGVjX3BhcnNlX3RhZ19oYXNfZW50cm9weV9zZWdtZW50IChndWludDggdGFnKQoreworICBpZiAodGFnID09IDB4ZGEgfHwgKHRhZyA+PSAweGQwICYmIHRhZyA8PSAweGQ3KSkKKyAgICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2pwZWdfZGVjX3BhcnNlIChHc3RWaWRlb0RlY29kZXIgKiBiZGVjLCBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSwKKyAgICBHc3RBZGFwdGVyICogYWRhcHRlciwgZ2Jvb2xlYW4gYXRfZW9zKQoreworICBndWludCBzaXplOworICBnaW50IHRvYWRkID0gMDsKKyAgZ2Jvb2xlYW4gcmVzeW5jOworICBnaW50IG9mZnNldCA9IDAsIG5vZmZzZXQ7CisgIEdzdEpwZWdEZWMgKmRlYyA9IChHc3RKcGVnRGVjICopIGJkZWM7CisKKyAgR1NUX1ZJREVPX0NPREVDX0ZSQU1FX1NFVF9TWU5DX1BPSU5UIChmcmFtZSk7CisKKyAgLyogRklYTUUgOiBUaGUgb3ZlcmhlYWQgb2YgdXNpbmcgc2Nhbl91aW50MzIgaXMgbWFzc2l2ZSAqLworCisgIHNpemUgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGFkYXB0ZXIpOworICBHU1RfREVCVUcgKCJQYXJzaW5nIGpwZWcgaW1hZ2UgZGF0YSAoJXUgYnl0ZXMpIiwgc2l6ZSk7CisKKyAgaWYgKGF0X2VvcykgeworICAgIEdTVF9ERUJVRyAoIkZsdXNoaW5nIGFsbCBkYXRhIG91dCIpOworICAgIHRvYWRkID0gc2l6ZTsKKworICAgIC8qIElmIHdlIGhhdmUgbGVmdG92ZXIgZGF0YSwgdGhyb3cgaXQgYXdheSAqLworICAgIGlmICghZGVjLT5zYXdfaGVhZGVyKQorICAgICAgZ290byBkcm9wX2ZyYW1lOworICAgIGdvdG8gaGF2ZV9mdWxsX2ZyYW1lOworICB9CisKKyAgaWYgKHNpemUgPCA4KQorICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisKKyAgaWYgKCFkZWMtPnNhd19oZWFkZXIpIHsKKyAgICBnaW50IHJldDsKKyAgICAvKiB3ZSBleHBlY3QgYXQgbGVhc3QgNCBieXRlcywgZmlyc3Qgb2Ygd2hpY2ggc3RhcnQgbWFya2VyICovCisgICAgcmV0ID0KKyAgICAgICAgZ3N0X2FkYXB0ZXJfbWFza2VkX3NjYW5fdWludDMyIChhZGFwdGVyLCAweGZmZmYwMDAwLCAweGZmZDgwMDAwLCAwLAorICAgICAgICBzaXplIC0gNCk7CisKKyAgICBHU1RfREVCVUcgKCJyZXQ6JWQiLCByZXQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgZ290byBuZWVkX21vcmVfZGF0YTsKKworICAgIGlmIChyZXQpIHsKKyAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChhZGFwdGVyLCByZXQpOworICAgICAgc2l6ZSAtPSByZXQ7CisgICAgfQorICAgIGRlYy0+c2F3X2hlYWRlciA9IFRSVUU7CisgIH0KKworICB3aGlsZSAoMSkgeworICAgIGd1aW50IGZyYW1lX2xlbjsKKyAgICBndWludDMyIHZhbHVlOworCisgICAgR1NUX0RFQlVHICgib2Zmc2V0OiVkLCBzaXplOiVkIiwgb2Zmc2V0LCBzaXplKTsKKworICAgIG5vZmZzZXQgPQorICAgICAgICBnc3RfYWRhcHRlcl9tYXNrZWRfc2Nhbl91aW50MzJfcGVlayAoYWRhcHRlciwgMHgwMDAwZmYwMCwgMHgwMDAwZmYwMCwKKyAgICAgICAgb2Zmc2V0LCBzaXplIC0gb2Zmc2V0LCAmdmFsdWUpOworCisgICAgLyogbG9zdCBzeW5jIGlmIDB4ZmYgbWFya2VyIG5vdCB3aGVyZSBleHBlY3RlZCAqLworICAgIGlmICgocmVzeW5jID0gKG5vZmZzZXQgIT0gb2Zmc2V0KSkpIHsKKyAgICAgIEdTVF9ERUJVRyAoIkxvc3Qgc3luYyBhdCAweCUwOHgsIHJlc3luY2luZyIsIG9mZnNldCArIDIpOworICAgIH0KKyAgICAvKiBtYXkgaGF2ZSBtYXJrZXIsIGJ1dCBjb3VsZCBoYXZlIGJlZW4gcmVzeW5jbmcgKi8KKyAgICByZXN5bmMgPSByZXN5bmMgfHwgZGVjLT5wYXJzZV9yZXN5bmM7CisgICAgLyogU2tpcCBvdmVyIGV4dHJhIDB4ZmYgKi8KKyAgICB3aGlsZSAoKG5vZmZzZXQgPj0gMCkgJiYgKCh2YWx1ZSAmIDB4ZmYpID09IDB4ZmYpKSB7CisgICAgICBub2Zmc2V0Kys7CisgICAgICBub2Zmc2V0ID0KKyAgICAgICAgICBnc3RfYWRhcHRlcl9tYXNrZWRfc2Nhbl91aW50MzJfcGVlayAoYWRhcHRlciwgMHgwMDAwZmYwMCwgMHgwMDAwZmYwMCwKKyAgICAgICAgICBub2Zmc2V0LCBzaXplIC0gbm9mZnNldCwgJnZhbHVlKTsKKyAgICB9CisgICAgLyogZW5vdWdoIGJ5dGVzIGxlZnQgZm9yIG1hcmtlcj8gKHdlIG5lZWQgMHhOTiBhZnRlciB0aGUgMHhmZikgKi8KKyAgICBpZiAobm9mZnNldCA8IDApIHsKKyAgICAgIEdTVF9ERUJVRyAoImF0IGVuZCBvZiBpbnB1dCBhbmQgbm8gRU9JIG1hcmtlciBmb3VuZCwgbmVlZCBtb3JlIGRhdGEiKTsKKyAgICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisgICAgfQorCisgICAgLyogbm93IGxvY2sgb24gdGhlIG1hcmtlciB3ZSBmb3VuZCAqLworICAgIG9mZnNldCA9IG5vZmZzZXQ7CisgICAgdmFsdWUgPSB2YWx1ZSAmIDB4ZmY7CisgICAgaWYgKHZhbHVlID09IDB4ZDkpIHsKKyAgICAgIEdTVF9ERUJVRyAoIjB4JTA4eDogRU9JIG1hcmtlciIsIG9mZnNldCArIDIpOworICAgICAgLyogY2xlYXIgcGFyc2Ugc3RhdGUgKi8KKyAgICAgIGRlYy0+c2F3X2hlYWRlciA9IEZBTFNFOworICAgICAgZGVjLT5wYXJzZV9yZXN5bmMgPSBGQUxTRTsKKyAgICAgIHRvYWRkID0gb2Zmc2V0ICsgNDsKKyAgICAgIGdvdG8gaGF2ZV9mdWxsX2ZyYW1lOworICAgIH0KKyAgICBpZiAodmFsdWUgPT0gMHhkOCkgeworICAgICAgR1NUX0RFQlVHICgiMHglMDh4OiBTT0kgbWFya2VyIGJlZm9yZSBFT0kgbWFya2VyIiwgb2Zmc2V0ICsgMik7CisKKyAgICAgIC8qIGNsZWFyIHBhcnNlIHN0YXRlICovCisgICAgICBkZWMtPnNhd19oZWFkZXIgPSBGQUxTRTsKKyAgICAgIGRlYy0+cGFyc2VfcmVzeW5jID0gRkFMU0U7CisgICAgICB0b2FkZCA9IG9mZnNldDsKKyAgICAgIGdvdG8gaGF2ZV9mdWxsX2ZyYW1lOworICAgIH0KKworCisgICAgaWYgKHZhbHVlID49IDB4ZDAgJiYgdmFsdWUgPD0gMHhkNykKKyAgICAgIGZyYW1lX2xlbiA9IDA7CisgICAgZWxzZSB7CisgICAgICAvKiBwZWVrIHRhZyBhbmQgc3Vic2VxdWVudCBsZW5ndGggKi8KKyAgICAgIGlmIChvZmZzZXQgKyAyICsgNCA+IHNpemUpCisgICAgICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisgICAgICBlbHNlCisgICAgICAgIGdzdF9hZGFwdGVyX21hc2tlZF9zY2FuX3VpbnQzMl9wZWVrIChhZGFwdGVyLCAweDAsIDB4MCwgb2Zmc2V0ICsgMiwgNCwKKyAgICAgICAgICAgICZmcmFtZV9sZW4pOworICAgICAgZnJhbWVfbGVuID0gZnJhbWVfbGVuICYgMHhmZmZmOworICAgIH0KKyAgICBHU1RfREVCVUcgKCIweCUwOHg6IHRhZyAlMDJ4LCBmcmFtZV9sZW49JXUiLCBvZmZzZXQgKyAyLCB2YWx1ZSwgZnJhbWVfbGVuKTsKKyAgICAvKiB0aGUgZnJhbWUgbGVuZ3RoIGluY2x1ZGVzIHRoZSAyIGJ5dGVzIGZvciB0aGUgbGVuZ3RoOyBoZXJlIHdlIHdhbnQgYXQKKyAgICAgKiBsZWFzdCAyIG1vcmUgYnl0ZXMgYXQgdGhlIGVuZCBmb3IgYW4gZW5kIG1hcmtlciAqLworICAgIGlmIChvZmZzZXQgKyAyICsgMiArIGZyYW1lX2xlbiArIDIgPiBzaXplKSB7CisgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworICAgIH0KKworICAgIGlmIChnc3RfanBlZ19kZWNfcGFyc2VfdGFnX2hhc19lbnRyb3B5X3NlZ21lbnQgKHZhbHVlKSkgeworICAgICAgZ3VpbnQgZXNlZ2xlbiA9IGRlYy0+cGFyc2VfZW50cm9weV9sZW47CisKKyAgICAgIEdTVF9ERUJVRyAoIjB4JTA4eDogZmluZGluZyBlbnRyb3B5IHNlZ21lbnQgbGVuZ3RoIChlc2VnbGVuOiVkKSIsCisgICAgICAgICAgb2Zmc2V0ICsgMiwgZXNlZ2xlbik7CisgICAgICBpZiAoc2l6ZSA8IG9mZnNldCArIDIgKyBmcmFtZV9sZW4gKyBlc2VnbGVuKQorICAgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworICAgICAgbm9mZnNldCA9IG9mZnNldCArIDIgKyBmcmFtZV9sZW4gKyBkZWMtPnBhcnNlX2VudHJvcHlfbGVuOworICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgR1NUX0RFQlVHICgibm9mZnNldDolZCwgc2l6ZTolZCwgc2l6ZSAtIG5vZmZzZXQ6JWQiLAorICAgICAgICAgICAgbm9mZnNldCwgc2l6ZSwgc2l6ZSAtIG5vZmZzZXQpOworICAgICAgICBub2Zmc2V0ID0gZ3N0X2FkYXB0ZXJfbWFza2VkX3NjYW5fdWludDMyX3BlZWsgKGFkYXB0ZXIsIDB4MDAwMGZmMDAsCisgICAgICAgICAgICAweDAwMDBmZjAwLCBub2Zmc2V0LCBzaXplIC0gbm9mZnNldCwgJnZhbHVlKTsKKyAgICAgICAgaWYgKG5vZmZzZXQgPCAwKSB7CisgICAgICAgICAgLyogbmVlZCBtb3JlIGRhdGEgKi8KKyAgICAgICAgICBkZWMtPnBhcnNlX2VudHJvcHlfbGVuID0gc2l6ZSAtIG9mZnNldCAtIDQgLSBmcmFtZV9sZW4gLSAyOworICAgICAgICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh2YWx1ZSAmIDB4ZmYpICE9IDB4MDApIHsKKyAgICAgICAgICBlc2VnbGVuID0gbm9mZnNldCAtIG9mZnNldCAtIGZyYW1lX2xlbiAtIDI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbm9mZnNldCsrOworICAgICAgfQorICAgICAgZGVjLT5wYXJzZV9lbnRyb3B5X2xlbiA9IDA7CisgICAgICBmcmFtZV9sZW4gKz0gZXNlZ2xlbjsKKyAgICAgIEdTVF9ERUJVRyAoImVudHJvcHkgc2VnbWVudCBsZW5ndGg9JXUgPT4gZnJhbWVfbGVuPSV1IiwgZXNlZ2xlbiwKKyAgICAgICAgICBmcmFtZV9sZW4pOworICAgIH0KKyAgICBpZiAocmVzeW5jKSB7CisgICAgICAvKiBjaGVjayBpZiB3ZSB3aWxsIHN0aWxsIGJlIGluIHN5bmMgaWYgd2UgaW50ZXJwcmV0CisgICAgICAgKiB0aGlzIGFzIGEgc3luYyBwb2ludCBhbmQgc2tpcCB0aGlzIGZyYW1lICovCisgICAgICBub2Zmc2V0ID0gb2Zmc2V0ICsgZnJhbWVfbGVuICsgMjsKKyAgICAgIG5vZmZzZXQgPSBnc3RfYWRhcHRlcl9tYXNrZWRfc2Nhbl91aW50MzIgKGFkYXB0ZXIsIDB4MDAwMGZmMDAsIDB4MDAwMGZmMDAsCisgICAgICAgICAgbm9mZnNldCwgNCk7CisgICAgICBpZiAobm9mZnNldCA8IDApIHsKKyAgICAgICAgLyogaWdub3JlIGFuZCBjb250aW51ZSByZXN5bmNpbmcgdW50aWwgd2UgaGl0IHRoZSBlbmQKKyAgICAgICAgICogb2Ygb3VyIGRhdGEgb3IgZmluZCBhIHN5bmMgcG9pbnQgdGhhdCBsb29rcyBva2F5ICovCisgICAgICAgIG9mZnNldCsrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIEdTVF9ERUJVRyAoImZvdW5kIHN5bmMgYXQgMHgleCIsIG9mZnNldCArIDIpOworICAgIH0KKworICAgIC8qIEFkZCBjdXJyZW50IGRhdGEgdG8gb3V0cHV0IGJ1ZmZlciAqLworICAgIHRvYWRkICs9IGZyYW1lX2xlbiArIDI7CisgICAgb2Zmc2V0ICs9IGZyYW1lX2xlbiArIDI7CisgIH0KKworbmVlZF9tb3JlX2RhdGE6CisgIGlmICh0b2FkZCkKKyAgICBnc3RfdmlkZW9fZGVjb2Rlcl9hZGRfdG9fZnJhbWUgKGJkZWMsIHRvYWRkKTsKKyAgcmV0dXJuIEdTVF9WSURFT19ERUNPREVSX0ZMT1dfTkVFRF9EQVRBOworCitoYXZlX2Z1bGxfZnJhbWU6CisgIGlmICh0b2FkZCkKKyAgICBnc3RfdmlkZW9fZGVjb2Rlcl9hZGRfdG9fZnJhbWUgKGJkZWMsIHRvYWRkKTsKKyAgR1NUX1ZJREVPX0NPREVDX0ZSQU1FX1NFVF9TWU5DX1BPSU5UIChmcmFtZSk7CisgIHJldHVybiBnc3RfdmlkZW9fZGVjb2Rlcl9oYXZlX2ZyYW1lIChiZGVjKTsKKworZHJvcF9mcmFtZToKKyAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGFkYXB0ZXIsIHNpemUpOworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKKworLyogc2hhbWVsZXNzbHkgcmlwcGVkIGZyb20ganBlZ3V0aWxzLmMgaW4gbWpwZWd0b29scyAqLworc3RhdGljIHZvaWQKK2FkZF9odWZmX3RhYmxlIChqX2RlY29tcHJlc3NfcHRyIGRpbmZvLAorICAgIEpIVUZGX1RCTCAqKiBodGJscHRyLCBjb25zdCBVSU5UOCAqIGJpdHMsIGNvbnN0IFVJTlQ4ICogdmFsKQorLyogRGVmaW5lIGEgSHVmZm1hbiB0YWJsZSAqLworeworICBpbnQgbnN5bWJvbHMsIGxlbjsKKworICBpZiAoKmh0YmxwdHIgPT0gTlVMTCkKKyAgICAqaHRibHB0ciA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSAoKGpfY29tbW9uX3B0cikgZGluZm8pOworCisgIGdfYXNzZXJ0ICgqaHRibHB0cik7CisKKyAgLyogQ29weSB0aGUgbnVtYmVyLW9mLXN5bWJvbHMtb2YtZWFjaC1jb2RlLWxlbmd0aCBjb3VudHMgKi8KKyAgbWVtY3B5ICgoKmh0YmxwdHIpLT5iaXRzLCBiaXRzLCBzaXplb2YgKCgqaHRibHB0ciktPmJpdHMpKTsKKworICAvKiBWYWxpZGF0ZSB0aGUgY291bnRzLiAgV2UgZG8gdGhpcyBoZXJlIG1haW5seSBzbyB3ZSBjYW4gY29weSB0aGUgcmlnaHQKKyAgICogbnVtYmVyIG9mIHN5bWJvbHMgZnJvbSB0aGUgdmFsW10gYXJyYXksIHdpdGhvdXQgcmlza2luZyBtYXJjaGluZyBvZmYKKyAgICogdGhlIGVuZCBvZiBtZW1vcnkuICBqY2h1ZmYuYyB3aWxsIGRvIGEgbW9yZSB0aG9yb3VnaCB0ZXN0IGxhdGVyLgorICAgKi8KKyAgbnN5bWJvbHMgPSAwOworICBmb3IgKGxlbiA9IDE7IGxlbiA8PSAxNjsgbGVuKyspCisgICAgbnN5bWJvbHMgKz0gYml0c1tsZW5dOworICBpZiAobnN5bWJvbHMgPCAxIHx8IG5zeW1ib2xzID4gMjU2KQorICAgIGdfZXJyb3IgKCJqcGVndXRpbHMuYzogIGFkZF9odWZmX3RhYmxlIGZhaWxlZCBiYWRseS4gIik7CisKKyAgbWVtY3B5ICgoKmh0YmxwdHIpLT5odWZmdmFsLCB2YWwsIG5zeW1ib2xzICogc2l6ZW9mIChVSU5UOCkpOworfQorCisKKworc3RhdGljIHZvaWQKK3N0ZF9odWZmX3RhYmxlcyAoal9kZWNvbXByZXNzX3B0ciBkaW5mbykKKy8qIFNldCB1cCB0aGUgc3RhbmRhcmQgSHVmZm1hbiB0YWJsZXMgKGNmLiBKUEVHIHN0YW5kYXJkIHNlY3Rpb24gSy4zKSAqLworLyogSU1QT1JUQU5UOiB0aGVzZSBhcmUgb25seSB2YWxpZCBmb3IgOC1iaXQgZGF0YSBwcmVjaXNpb24hICovCit7CisgIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2RjX2x1bWluYW5jZVsxN10gPQorICAgICAgeyAvKiAwLWJhc2UgKi8gMCwgMCwgMSwgNSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworICBzdGF0aWMgY29uc3QgVUlOVDggdmFsX2RjX2x1bWluYW5jZVtdID0KKyAgICAgIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExIH07CisKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfZGNfY2hyb21pbmFuY2VbMTddID0KKyAgICAgIHsgLyogMC1iYXNlICovIDAsIDAsIDMsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgfTsKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IHZhbF9kY19jaHJvbWluYW5jZVtdID0KKyAgICAgIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExIH07CisKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfYWNfbHVtaW5hbmNlWzE3XSA9CisgICAgICB7IC8qIDAtYmFzZSAqLyAwLCAwLCAyLCAxLCAzLCAzLCAyLCA0LCAzLCA1LCA1LCA0LCA0LCAwLCAwLCAxLCAweDdkIH07CisgIHN0YXRpYyBjb25zdCBVSU5UOCB2YWxfYWNfbHVtaW5hbmNlW10gPQorICAgICAgeyAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLAorICAgIDB4MjEsIDB4MzEsIDB4NDEsIDB4MDYsIDB4MTMsIDB4NTEsIDB4NjEsIDB4MDcsCisgICAgMHgyMiwgMHg3MSwgMHgxNCwgMHgzMiwgMHg4MSwgMHg5MSwgMHhhMSwgMHgwOCwKKyAgICAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLAorICAgIDB4MjQsIDB4MzMsIDB4NjIsIDB4NzIsIDB4ODIsIDB4MDksIDB4MGEsIDB4MTYsCisgICAgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwKKyAgICAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAorICAgIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksCisgICAgMHg0YSwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwKKyAgICAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LAorICAgIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksCisgICAgMHg3YSwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwKKyAgICAweDhhLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LAorICAgIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsCisgICAgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwKKyAgICAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LAorICAgIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4ZDIsIDB4ZDMsIDB4ZDQsCisgICAgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhlMSwgMHhlMiwKKyAgICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLAorICAgIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsCisgICAgMHhmOSwgMHhmYQorICB9OworCisgIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2FjX2Nocm9taW5hbmNlWzE3XSA9CisgICAgICB7IC8qIDAtYmFzZSAqLyAwLCAwLCAyLCAxLCAyLCA0LCA0LCAzLCA0LCA3LCA1LCA0LCA0LCAwLCAxLCAyLCAweDc3IH07CisgIHN0YXRpYyBjb25zdCBVSU5UOCB2YWxfYWNfY2hyb21pbmFuY2VbXSA9CisgICAgICB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MTEsIDB4MDQsIDB4MDUsIDB4MjEsCisgICAgMHgzMSwgMHgwNiwgMHgxMiwgMHg0MSwgMHg1MSwgMHgwNywgMHg2MSwgMHg3MSwKKyAgICAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LCAweDQyLCAweDkxLAorICAgIDB4YTEsIDB4YjEsIDB4YzEsIDB4MDksIDB4MjMsIDB4MzMsIDB4NTIsIDB4ZjAsCisgICAgMHgxNSwgMHg2MiwgMHg3MiwgMHhkMSwgMHgwYSwgMHgxNiwgMHgyNCwgMHgzNCwKKyAgICAweGUxLCAweDI1LCAweGYxLCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDI2LAorICAgIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsCisgICAgMHgzOSwgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwKKyAgICAweDQ5LCAweDRhLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LAorICAgIDB4NTksIDB4NWEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsCisgICAgMHg2OSwgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwKKyAgICAweDc5LCAweDdhLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAorICAgIDB4ODgsIDB4ODksIDB4OGEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsCisgICAgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwKKyAgICAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LAorICAgIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YjksIDB4YmEsIDB4YzIsIDB4YzMsCisgICAgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwgMHhkMiwKKyAgICAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLAorICAgIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksCisgICAgMHhlYSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwKKyAgICAweGY5LCAweGZhCisgIH07CisKKyAgYWRkX2h1ZmZfdGFibGUgKGRpbmZvLCAmZGluZm8tPmRjX2h1ZmZfdGJsX3B0cnNbMF0sCisgICAgICBiaXRzX2RjX2x1bWluYW5jZSwgdmFsX2RjX2x1bWluYW5jZSk7CisgIGFkZF9odWZmX3RhYmxlIChkaW5mbywgJmRpbmZvLT5hY19odWZmX3RibF9wdHJzWzBdLAorICAgICAgYml0c19hY19sdW1pbmFuY2UsIHZhbF9hY19sdW1pbmFuY2UpOworICBhZGRfaHVmZl90YWJsZSAoZGluZm8sICZkaW5mby0+ZGNfaHVmZl90YmxfcHRyc1sxXSwKKyAgICAgIGJpdHNfZGNfY2hyb21pbmFuY2UsIHZhbF9kY19jaHJvbWluYW5jZSk7CisgIGFkZF9odWZmX3RhYmxlIChkaW5mbywgJmRpbmZvLT5hY19odWZmX3RibF9wdHJzWzFdLAorICAgICAgYml0c19hY19jaHJvbWluYW5jZSwgdmFsX2FjX2Nocm9taW5hbmNlKTsKK30KKworCisKK3N0YXRpYyB2b2lkCitndWFyYW50ZWVfaHVmZl90YWJsZXMgKGpfZGVjb21wcmVzc19wdHIgZGluZm8pCit7CisgIGlmICgoZGluZm8tPmRjX2h1ZmZfdGJsX3B0cnNbMF0gPT0gTlVMTCkgJiYKKyAgICAgIChkaW5mby0+ZGNfaHVmZl90YmxfcHRyc1sxXSA9PSBOVUxMKSAmJgorICAgICAgKGRpbmZvLT5hY19odWZmX3RibF9wdHJzWzBdID09IE5VTEwpICYmCisgICAgICAoZGluZm8tPmFjX2h1ZmZfdGJsX3B0cnNbMV0gPT0gTlVMTCkpIHsKKyAgICBHU1RfREVCVUcgKCJHZW5lcmF0aW5nIHN0YW5kYXJkIEh1ZmZtYW4gdGFibGVzIGZvciB0aGlzIGZyYW1lLiIpOworICAgIHN0ZF9odWZmX3RhYmxlcyAoZGluZm8pOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2pwZWdfZGVjX3NldF9mb3JtYXQgKEdzdFZpZGVvRGVjb2RlciAqIGRlYywgR3N0VmlkZW9Db2RlY1N0YXRlICogc3RhdGUpCit7CisgIEdzdEpwZWdEZWMgKmpwZWcgPSBHU1RfSlBFR19ERUMgKGRlYyk7CisKKyAgaWYgKGpwZWctPmlucHV0X3N0YXRlKQorICAgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAoanBlZy0+aW5wdXRfc3RhdGUpOworICBqcGVnLT5pbnB1dF9zdGF0ZSA9IGdzdF92aWRlb19jb2RlY19zdGF0ZV9yZWYgKHN0YXRlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKiB5dWsgKi8KK3N0YXRpYyB2b2lkCitocmVzYW1wbGVjcHkxIChndWludDggKiBkZXN0LCBjb25zdCBndWludDggKiBzcmMsIGd1aW50IGxlbikKK3sKKyAgZ2ludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgIC8qIGVxdWl2YWxlbnQgdG86IGRlc3RbaV0gPSBzcmNbaSA8PCAxXSAqLworICAgICpkZXN0ID0gKnNyYzsKKyAgICArK2Rlc3Q7CisgICAgKytzcmM7CisgICAgKytzcmM7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9qcGVnX2RlY19mcmVlX2J1ZmZlcnMgKEdzdEpwZWdEZWMgKiBkZWMpCit7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgIGdfZnJlZSAoZGVjLT5pZHJfeVtpXSk7CisgICAgZ19mcmVlIChkZWMtPmlkcl91W2ldKTsKKyAgICBnX2ZyZWUgKGRlYy0+aWRyX3ZbaV0pOworICAgIGRlYy0+aWRyX3lbaV0gPSBOVUxMOworICAgIGRlYy0+aWRyX3VbaV0gPSBOVUxMOworICAgIGRlYy0+aWRyX3ZbaV0gPSBOVUxMOworICB9CisKKyAgZGVjLT5pZHJfd2lkdGhfYWxsb2NhdGVkID0gMDsKK30KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorZ3N0X2pwZWdfZGVjX2Vuc3VyZV9idWZmZXJzIChHc3RKcGVnRGVjICogZGVjLCBndWludCBtYXhyb3dieXRlcykKK3sKKyAgZ2ludCBpOworCisgIGlmIChHX0xJS0VMWSAoZGVjLT5pZHJfd2lkdGhfYWxsb2NhdGVkID09IG1heHJvd2J5dGVzKSkKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBGSVhNRTogbWF5YmUganVzdCBhbGxvYyBvbmUgb3IgdGhyZWUgYmxvY2tzIGFsdG9nZXRoZXI/ICovCisgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgZGVjLT5pZHJfeVtpXSA9IGdfdHJ5X3JlYWxsb2MgKGRlYy0+aWRyX3lbaV0sIG1heHJvd2J5dGVzKTsKKyAgICBkZWMtPmlkcl91W2ldID0gZ190cnlfcmVhbGxvYyAoZGVjLT5pZHJfdVtpXSwgbWF4cm93Ynl0ZXMpOworICAgIGRlYy0+aWRyX3ZbaV0gPSBnX3RyeV9yZWFsbG9jIChkZWMtPmlkcl92W2ldLCBtYXhyb3dieXRlcyk7CisKKyAgICBpZiAoR19VTkxJS0VMWSAoIWRlYy0+aWRyX3lbaV0gfHwgIWRlYy0+aWRyX3VbaV0gfHwgIWRlYy0+aWRyX3ZbaV0pKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlYywgIm91dCBvZiBtZW1vcnksIGk9JWQsIGJ5dGVzPSV1IiwgaSwgbWF4cm93Ynl0ZXMpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorCisgIGRlYy0+aWRyX3dpZHRoX2FsbG9jYXRlZCA9IG1heHJvd2J5dGVzOworICBHU1RfTE9HX09CSkVDVCAoZGVjLCAiYWxsb2NhdGVkIHRlbXAgbWVtb3J5LCAldSBieXRlcy9yb3ciLCBtYXhyb3dieXRlcyk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdfZGVjX2RlY29kZV9ncmF5c2NhbGUgKEdzdEpwZWdEZWMgKiBkZWMsIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSwKKyAgICBndWludCBmaWVsZCwgZ3VpbnQgbnVtX2ZpZWxkcykKK3sKKyAgZ3VjaGFyICpyb3dzWzE2XTsKKyAgZ3VjaGFyICoqc2NhbmFycmF5WzFdID0geyByb3dzIH07CisgIGdpbnQgaSwgaiwgazsKKyAgZ2ludCBsaW5lczsKKyAgZ3VpbnQ4ICpiYXNlWzFdOworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgcHN0cmlkZSwgcnN0cmlkZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZWMsICJpbmRpcmVjdCBkZWNvZGluZyBvZiBncmF5c2NhbGUiKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChmcmFtZSkgLyBudW1fZmllbGRzOworCisgIGlmIChHX1VOTElLRUxZICghZ3N0X2pwZWdfZGVjX2Vuc3VyZV9idWZmZXJzIChkZWMsIEdTVF9ST1VORF9VUF8zMiAod2lkdGgpKSkpCisgICAgcmV0dXJuOworCisgIGJhc2VbMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgMCk7CisgIGlmIChmaWVsZCA9PSAyKSB7CisgICAgYmFzZVswXSArPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKTsKKyAgfQorCisgIHBzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChmcmFtZSwgMCk7CisgIHJzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKSAqIG51bV9maWVsZHM7CisKKyAgbWVtY3B5IChyb3dzLCBkZWMtPmlkcl95LCAxNiAqIHNpemVvZiAoZ3BvaW50ZXIpKTsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBoZWlnaHQpIHsKKyAgICBsaW5lcyA9IGpwZWdfcmVhZF9yYXdfZGF0YSAoJmRlYy0+Y2luZm8sIHNjYW5hcnJheSwgRENUU0laRSk7CisgICAgaWYgKEdfTElLRUxZIChsaW5lcyA+IDApKSB7CisgICAgICBmb3IgKGogPSAwOyAoaiA8IERDVFNJWkUpICYmIChpIDwgaGVpZ2h0KTsgaisrLCBpKyspIHsKKyAgICAgICAgZ2ludCBwOworCisgICAgICAgIHAgPSAwOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgd2lkdGg7IGsrKykgeworICAgICAgICAgIGJhc2VbMF1bcF0gPSByb3dzW2pdW2tdOworICAgICAgICAgIHAgKz0gcHN0cmlkZTsKKyAgICAgICAgfQorICAgICAgICBiYXNlWzBdICs9IHJzdHJpZGU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoZGVjLCAianBlZ19yZWFkX3Jhd19kYXRhKCkgcmV0dXJuZWQgMCIpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdfZGVjX2RlY29kZV9yZ2IgKEdzdEpwZWdEZWMgKiBkZWMsIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSwKKyAgICBndWludCBmaWVsZCwgZ3VpbnQgbnVtX2ZpZWxkcykKK3sKKyAgZ3VjaGFyICpyX3Jvd3NbMTZdLCAqZ19yb3dzWzE2XSwgKmJfcm93c1sxNl07CisgIGd1Y2hhciAqKnNjYW5hcnJheVszXSA9IHsgcl9yb3dzLCBnX3Jvd3MsIGJfcm93cyB9OworICBnaW50IGksIGosIGs7CisgIGdpbnQgbGluZXM7CisgIGd1aW50OCAqYmFzZVszXTsKKyAgZ3VpbnQgcHN0cmlkZSwgcnN0cmlkZTsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgImluZGlyZWN0IGRlY29kaW5nIG9mIFJHQiIpOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKSAvIG51bV9maWVsZHM7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFnc3RfanBlZ19kZWNfZW5zdXJlX2J1ZmZlcnMgKGRlYywgR1NUX1JPVU5EX1VQXzMyICh3aWR0aCkpKSkKKyAgICByZXR1cm47CisKKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgIGJhc2VbaV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgaSk7CisgICAgaWYgKGZpZWxkID09IDIpCisgICAgICBiYXNlW2ldICs9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIGkpOworICB9CisKKyAgcHN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BTVFJJREUgKGZyYW1lLCAwKTsKKyAgcnN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIDApICogbnVtX2ZpZWxkczsKKworICBtZW1jcHkgKHJfcm93cywgZGVjLT5pZHJfeSwgMTYgKiBzaXplb2YgKGdwb2ludGVyKSk7CisgIG1lbWNweSAoZ19yb3dzLCBkZWMtPmlkcl91LCAxNiAqIHNpemVvZiAoZ3BvaW50ZXIpKTsKKyAgbWVtY3B5IChiX3Jvd3MsIGRlYy0+aWRyX3YsIDE2ICogc2l6ZW9mIChncG9pbnRlcikpOworCisgIGkgPSAwOworICB3aGlsZSAoaSA8IGhlaWdodCkgeworICAgIGxpbmVzID0ganBlZ19yZWFkX3Jhd19kYXRhICgmZGVjLT5jaW5mbywgc2NhbmFycmF5LCBEQ1RTSVpFKTsKKyAgICBpZiAoR19MSUtFTFkgKGxpbmVzID4gMCkpIHsKKyAgICAgIGZvciAoaiA9IDA7IChqIDwgRENUU0laRSkgJiYgKGkgPCBoZWlnaHQpOyBqKyssIGkrKykgeworICAgICAgICBnaW50IHA7CisKKyAgICAgICAgcCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCB3aWR0aDsgaysrKSB7CisgICAgICAgICAgYmFzZVswXVtwXSA9IHJfcm93c1tqXVtrXTsKKyAgICAgICAgICBiYXNlWzFdW3BdID0gZ19yb3dzW2pdW2tdOworICAgICAgICAgIGJhc2VbMl1bcF0gPSBiX3Jvd3Nbal1ba107CisgICAgICAgICAgcCArPSBwc3RyaWRlOworICAgICAgICB9CisgICAgICAgIGJhc2VbMF0gKz0gcnN0cmlkZTsKKyAgICAgICAgYmFzZVsxXSArPSByc3RyaWRlOworICAgICAgICBiYXNlWzJdICs9IHJzdHJpZGU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoZGVjLCAianBlZ19yZWFkX3Jhd19kYXRhKCkgcmV0dXJuZWQgMCIpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdfZGVjX2RlY29kZV9pbmRpcmVjdCAoR3N0SnBlZ0RlYyAqIGRlYywgR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBnaW50IHJfdiwKKyAgICBnaW50IHJfaCwgZ2ludCBjb21wLCBndWludCBmaWVsZCwgZ3VpbnQgbnVtX2ZpZWxkcykKK3sKKyAgZ3VjaGFyICp5X3Jvd3NbMTZdLCAqdV9yb3dzWzE2XSwgKnZfcm93c1sxNl07CisgIGd1Y2hhciAqKnNjYW5hcnJheVszXSA9IHsgeV9yb3dzLCB1X3Jvd3MsIHZfcm93cyB9OworICBnaW50IGksIGosIGs7CisgIGdpbnQgbGluZXM7CisgIGd1Y2hhciAqYmFzZVszXSwgKmxhc3RbM107CisgIGdpbnQgcm93c2l6ZVszXSwgc3RyaWRlWzNdOworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVjLAorICAgICAgInVuYWR2YW50YWdlb3VzIHdpZHRoIG9yIHJfaCwgdGFraW5nIHNsb3cgcm91dGUgaW52b2x2aW5nIG1lbWNweSIpOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKTsKKworICBpZiAoR19VTkxJS0VMWSAoIWdzdF9qcGVnX2RlY19lbnN1cmVfYnVmZmVycyAoZGVjLCBHU1RfUk9VTkRfVVBfMzIgKHdpZHRoKSkpKQorICAgIHJldHVybjsKKworICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgYmFzZVtpXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCBpKTsKKyAgICBzdHJpZGVbaV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCBpKSAqIG51bV9maWVsZHM7CisgICAgcm93c2l6ZVtpXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIGkpOworICAgIC8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBtYWtlIGpwZWdsaWIgd3JpdGUgYmV5b25kIG91ciBidWZmZXIsCisgICAgICogd2hpY2ggbWlnaHQgaGFwcGVuIGlmIChoZWlnaHQgJSAocl92KkRDVFNJWkUpKSAhPSAwICovCisgICAgbGFzdFtpXSA9IGJhc2VbaV0gKyAoR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZSwgaSkgKgorICAgICAgICAoR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgaSkgLSAxKSk7CisKKyAgICBpZiAoZmllbGQgPT0gMikgeworICAgICAgYmFzZVtpXSArPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCBpKTsKKyAgICB9CisgIH0KKworICBtZW1jcHkgKHlfcm93cywgZGVjLT5pZHJfeSwgMTYgKiBzaXplb2YgKGdwb2ludGVyKSk7CisgIG1lbWNweSAodV9yb3dzLCBkZWMtPmlkcl91LCAxNiAqIHNpemVvZiAoZ3BvaW50ZXIpKTsKKyAgbWVtY3B5ICh2X3Jvd3MsIGRlYy0+aWRyX3YsIDE2ICogc2l6ZW9mIChncG9pbnRlcikpOworCisgIC8qIGZpbGwgY2hyb21hIGNvbXBvbmVudHMgZm9yIGdyYXlzY2FsZSAqLworICBpZiAoY29tcCA9PSAxKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVjLCAiZ3JheXNjYWxlLCBmaWxsaW5nIGNocm9tYSIpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICBtZW1zZXQgKHVfcm93c1tpXSwgR1NUX1JPVU5EX1VQXzMyICh3aWR0aCksIDB4ODApOworICAgICAgbWVtc2V0ICh2X3Jvd3NbaV0sIEdTVF9ST1VORF9VUF8zMiAod2lkdGgpLCAweDgwKTsKKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpICs9IHJfdiAqIERDVFNJWkUpIHsKKyAgICBsaW5lcyA9IGpwZWdfcmVhZF9yYXdfZGF0YSAoJmRlYy0+Y2luZm8sIHNjYW5hcnJheSwgcl92ICogRENUU0laRSk7CisgICAgaWYgKEdfTElLRUxZIChsaW5lcyA+IDApKSB7CisgICAgICBmb3IgKGogPSAwLCBrID0gMDsgaiA8IChyX3YgKiBEQ1RTSVpFKTsgaiArPSByX3YsIGsrKykgeworICAgICAgICBpZiAoR19MSUtFTFkgKGJhc2VbMF0gPD0gbGFzdFswXSkpIHsKKyAgICAgICAgICBtZW1jcHkgKGJhc2VbMF0sIHlfcm93c1tqXSwgcm93c2l6ZVswXSk7CisgICAgICAgICAgYmFzZVswXSArPSBzdHJpZGVbMF07CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJfdiA9PSAyKSB7CisgICAgICAgICAgaWYgKEdfTElLRUxZIChiYXNlWzBdIDw9IGxhc3RbMF0pKSB7CisgICAgICAgICAgICBtZW1jcHkgKGJhc2VbMF0sIHlfcm93c1tqICsgMV0sIHJvd3NpemVbMF0pOworICAgICAgICAgICAgYmFzZVswXSArPSBzdHJpZGVbMF07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChHX0xJS0VMWSAoYmFzZVsxXSA8PSBsYXN0WzFdICYmIGJhc2VbMl0gPD0gbGFzdFsyXSkpIHsKKyAgICAgICAgICBpZiAocl9oID09IDIpIHsKKyAgICAgICAgICAgIG1lbWNweSAoYmFzZVsxXSwgdV9yb3dzW2tdLCByb3dzaXplWzFdKTsKKyAgICAgICAgICAgIG1lbWNweSAoYmFzZVsyXSwgdl9yb3dzW2tdLCByb3dzaXplWzJdKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHJfaCA9PSAxKSB7CisgICAgICAgICAgICBocmVzYW1wbGVjcHkxIChiYXNlWzFdLCB1X3Jvd3Nba10sIHJvd3NpemVbMV0pOworICAgICAgICAgICAgaHJlc2FtcGxlY3B5MSAoYmFzZVsyXSwgdl9yb3dzW2tdLCByb3dzaXplWzJdKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogRklYTUU6IGltcGxlbWVudCAoYXQgbGVhc3Qgd2UgYXZvaWQgY3Jhc2hpbmcgYnkgZG9pbmcgbm90aGluZykgKi8KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocl92ID09IDIgfHwgKGsgJiAxKSAhPSAwKSB7CisgICAgICAgICAgYmFzZVsxXSArPSBzdHJpZGVbMV07CisgICAgICAgICAgYmFzZVsyXSArPSBzdHJpZGVbMl07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgR1NUX0lORk9fT0JKRUNUIChkZWMsICJqcGVnX3JlYWRfcmF3X2RhdGEoKSByZXR1cm5lZCAwIik7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfanBlZ19kZWNfZGVjb2RlX2RpcmVjdCAoR3N0SnBlZ0RlYyAqIGRlYywgR3N0VmlkZW9GcmFtZSAqIGZyYW1lLAorICAgIGd1aW50IGZpZWxkLCBndWludCBudW1fZmllbGRzKQoreworICBndWNoYXIgKipsaW5lWzNdOyAgICAgICAgICAgICAvKiB0aGUganBlZyBsaW5lIGJ1ZmZlciAgICAgICAgICovCisgIGd1Y2hhciAqeVs0ICogRENUU0laRV0gPSB7IE5VTEwsIH07ICAgLyogYWxsb2MgZW5vdWdoIGZvciB0aGUgbGluZXMgICAqLworICBndWNoYXIgKnVbNCAqIERDVFNJWkVdID0geyBOVUxMLCB9OyAgIC8qIHJfdiB3aWxsIGJlIDw0ICAgICAgICAgICAgICAgKi8KKyAgZ3VjaGFyICp2WzQgKiBEQ1RTSVpFXSA9IHsgTlVMTCwgfTsKKyAgZ2ludCBpLCBqOworICBnaW50IGxpbmVzLCB2X3NhbXBbM107CisgIGd1Y2hhciAqYmFzZVszXSwgKmxhc3RbM107CisgIGdpbnQgc3RyaWRlWzNdOworICBndWludCBoZWlnaHQ7CisKKyAgbGluZVswXSA9IHk7CisgIGxpbmVbMV0gPSB1OworICBsaW5lWzJdID0gdjsKKworICB2X3NhbXBbMF0gPSBkZWMtPmNpbmZvLmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yOworICB2X3NhbXBbMV0gPSBkZWMtPmNpbmZvLmNvbXBfaW5mb1sxXS52X3NhbXBfZmFjdG9yOworICB2X3NhbXBbMl0gPSBkZWMtPmNpbmZvLmNvbXBfaW5mb1syXS52X3NhbXBfZmFjdG9yOworCisgIGlmIChHX1VOTElLRUxZICh2X3NhbXBbMF0gPiAyIHx8IHZfc2FtcFsxXSA+IDIgfHwgdl9zYW1wWzJdID4gMikpCisgICAgZ290byBmb3JtYXRfbm90X3N1cHBvcnRlZDsKKworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChmcmFtZSk7CisKKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgIGJhc2VbaV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgaSk7CisgICAgc3RyaWRlW2ldID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZSwgaSkgKiBudW1fZmllbGRzOworICAgIC8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBtYWtlIGpwZWdsaWIgd3JpdGUgYmV5b25kIG91ciBidWZmZXIsCisgICAgICogd2hpY2ggbWlnaHQgaGFwcGVuIGlmIChoZWlnaHQgJSAocl92KkRDVFNJWkUpKSAhPSAwICovCisgICAgbGFzdFtpXSA9IGJhc2VbaV0gKyAoR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZSwgaSkgKgorICAgICAgICAoR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgaSkgLSAxKSk7CisKKyAgICBpZiAoZmllbGQgPT0gMikgeworICAgICAgYmFzZVtpXSArPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCBpKTsKKyAgICB9CisgIH0KKworICAvKiBsZXQganBlZ2xpYiBkZWNvZGUgZGlyZWN0bHkgaW50byBvdXIgZmluYWwgYnVmZmVyICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgImRlY29kaW5nIGRpcmVjdGx5IGludG8gb3V0cHV0IGJ1ZmZlciIpOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkgKz0gdl9zYW1wWzBdICogRENUU0laRSkgeworICAgIGZvciAoaiA9IDA7IGogPCAodl9zYW1wWzBdICogRENUU0laRSk7ICsraikgeworICAgICAgLyogWSAqLworICAgICAgbGluZVswXVtqXSA9IGJhc2VbMF0gKyAoaSArIGopICogc3RyaWRlWzBdOworICAgICAgaWYgKEdfVU5MSUtFTFkgKGxpbmVbMF1bal0gPiBsYXN0WzBdKSkKKyAgICAgICAgbGluZVswXVtqXSA9IGxhc3RbMF07CisgICAgICAvKiBVICovCisgICAgICBpZiAodl9zYW1wWzFdID09IHZfc2FtcFswXSkgeworICAgICAgICBsaW5lWzFdW2pdID0gYmFzZVsxXSArICgoaSArIGopIC8gMikgKiBzdHJpZGVbMV07CisgICAgICB9IGVsc2UgaWYgKGogPCAodl9zYW1wWzFdICogRENUU0laRSkpIHsKKyAgICAgICAgbGluZVsxXVtqXSA9IGJhc2VbMV0gKyAoKGkgLyAyKSArIGopICogc3RyaWRlWzFdOworICAgICAgfQorICAgICAgaWYgKEdfVU5MSUtFTFkgKGxpbmVbMV1bal0gPiBsYXN0WzFdKSkKKyAgICAgICAgbGluZVsxXVtqXSA9IGxhc3RbMV07CisgICAgICAvKiBWICovCisgICAgICBpZiAodl9zYW1wWzJdID09IHZfc2FtcFswXSkgeworICAgICAgICBsaW5lWzJdW2pdID0gYmFzZVsyXSArICgoaSArIGopIC8gMikgKiBzdHJpZGVbMl07CisgICAgICB9IGVsc2UgaWYgKGogPCAodl9zYW1wWzJdICogRENUU0laRSkpIHsKKyAgICAgICAgbGluZVsyXVtqXSA9IGJhc2VbMl0gKyAoKGkgLyAyKSArIGopICogc3RyaWRlWzJdOworICAgICAgfQorICAgICAgaWYgKEdfVU5MSUtFTFkgKGxpbmVbMl1bal0gPiBsYXN0WzJdKSkKKyAgICAgICAgbGluZVsyXVtqXSA9IGxhc3RbMl07CisgICAgfQorCisgICAgbGluZXMgPSBqcGVnX3JlYWRfcmF3X2RhdGEgKCZkZWMtPmNpbmZvLCBsaW5lLCB2X3NhbXBbMF0gKiBEQ1RTSVpFKTsKKyAgICBpZiAoR19VTkxJS0VMWSAoIWxpbmVzKSkgeworICAgICAgR1NUX0lORk9fT0JKRUNUIChkZWMsICJqcGVnX3JlYWRfcmF3X2RhdGEoKSByZXR1cm5lZCAwIik7CisgICAgfQorICB9CisgIHJldHVybiBHU1RfRkxPV19PSzsKKworZm9ybWF0X25vdF9zdXBwb3J0ZWQ6CisgIHsKKyAgICBnYm9vbGVhbiByZXQgPSBHU1RfRkxPV19PSzsKKworICAgIEdTVF9WSURFT19ERUNPREVSX0VSUk9SIChkZWMsIDEsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoXygiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIikpLAorICAgICAgICAoIlVuc3VwcG9ydGVkIHN1YnNhbXBsaW5nIHNjaGVtYTogdl9zYW1wIGZhY3RvcnM6ICV1ICV1ICV1Iiwgdl9zYW1wWzBdLAorICAgICAgICAgICAgdl9zYW1wWzFdLCB2X3NhbXBbMl0pLCByZXQpOworCisgICAgcmV0dXJuIHJldDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdfZGVjX25lZ290aWF0ZSAoR3N0SnBlZ0RlYyAqIGRlYywgZ2ludCB3aWR0aCwgZ2ludCBoZWlnaHQsIGdpbnQgY2xyc3BjLAorICAgIGdib29sZWFuIGludGVybGFjZWQpCit7CisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqb3V0c3RhdGU7CisgIEdzdFZpZGVvSW5mbyAqaW5mbzsKKyAgR3N0VmlkZW9Gb3JtYXQgZm9ybWF0OworCisgIHN3aXRjaCAoY2xyc3BjKSB7CisgICAgY2FzZSBKQ1NfUkdCOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9SR0I7CisgICAgICBicmVhazsKKyAgICBjYXNlIEpDU19HUkFZU0NBTEU6CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX0dSQVk4OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfSTQyMDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogQ29tcGFyZSB0byBjdXJyZW50bHkgY29uZmlndXJlZCBvdXRwdXQgc3RhdGUgKi8KKyAgb3V0c3RhdGUgPSBnc3RfdmlkZW9fZGVjb2Rlcl9nZXRfb3V0cHV0X3N0YXRlIChHU1RfVklERU9fREVDT0RFUiAoZGVjKSk7CisgIGlmIChvdXRzdGF0ZSkgeworICAgIGluZm8gPSAmb3V0c3RhdGUtPmluZm87CisKKyAgICBpZiAod2lkdGggPT0gR1NUX1ZJREVPX0lORk9fV0lEVEggKGluZm8pICYmCisgICAgICAgIGhlaWdodCA9PSBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluZm8pICYmCisgICAgICAgIGZvcm1hdCA9PSBHU1RfVklERU9fSU5GT19GT1JNQVQgKGluZm8pKSB7CisgICAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKG91dHN0YXRlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChvdXRzdGF0ZSk7CisgIH0KKworICBvdXRzdGF0ZSA9CisgICAgICBnc3RfdmlkZW9fZGVjb2Rlcl9zZXRfb3V0cHV0X3N0YXRlIChHU1RfVklERU9fREVDT0RFUiAoZGVjKSwgZm9ybWF0LAorICAgICAgd2lkdGgsIGhlaWdodCwgZGVjLT5pbnB1dF9zdGF0ZSk7CisKKyAgc3dpdGNoIChjbHJzcGMpIHsKKyAgICBjYXNlIEpDU19SR0I6CisgICAgY2FzZSBKQ1NfR1JBWVNDQUxFOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG91dHN0YXRlLT5pbmZvLmNvbG9yaW1ldHJ5LnJhbmdlID0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFXzBfMjU1OworICAgICAgb3V0c3RhdGUtPmluZm8uY29sb3JpbWV0cnkubWF0cml4ID0gR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9CVDYwMTsKKyAgICAgIG91dHN0YXRlLT5pbmZvLmNvbG9yaW1ldHJ5LnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX1VOS05PV047CisgICAgICBvdXRzdGF0ZS0+aW5mby5jb2xvcmltZXRyeS5wcmltYXJpZXMgPSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX1VOS05PV047CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChpbnRlcmxhY2VkKSB7CisgICAgb3V0c3RhdGUtPmluZm8uaW50ZXJsYWNlX21vZGUgPSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfSU5URVJMRUFWRUQ7CisgICAgR1NUX1ZJREVPX0lORk9fRklFTERfT1JERVIgKCZvdXRzdGF0ZS0+aW5mbykgPQorICAgICAgICBHU1RfVklERU9fRklFTERfT1JERVJfVE9QX0ZJRUxEX0ZJUlNUOworICB9CisKKyAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChvdXRzdGF0ZSk7CisKKyAgZ3N0X3ZpZGVvX2RlY29kZXJfbmVnb3RpYXRlIChHU1RfVklERU9fREVDT0RFUiAoZGVjKSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVjLCAibWF4X3Zfc2FtcF9mYWN0b3I9JWQiLCBkZWMtPmNpbmZvLm1heF92X3NhbXBfZmFjdG9yKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVjLCAibWF4X2hfc2FtcF9mYWN0b3I9JWQiLCBkZWMtPmNpbmZvLm1heF9oX3NhbXBfZmFjdG9yKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9qcGVnX2RlY19wcmVwYXJlX2RlY29kZSAoR3N0SnBlZ0RlYyAqIGRlYykKK3sKKyAgR19HTlVDX1VOVVNFRCBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ3VpbnQgcl9oLCByX3YsIGhkcl9vazsKKworICAvKiByZWFkIGhlYWRlciAqLworICBoZHJfb2sgPSBqcGVnX3JlYWRfaGVhZGVyICgmZGVjLT5jaW5mbywgVFJVRSk7CisgIGlmIChHX1VOTElLRUxZIChoZHJfb2sgIT0gSlBFR19IRUFERVJfT0spKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZWMsICJyZWFkaW5nIHRoZSBoZWFkZXIgZmFpbGVkLCAlZCIsIGhkcl9vayk7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoZGVjLCAibnVtX2NvbXBvbmVudHM9JWQiLCBkZWMtPmNpbmZvLm51bV9jb21wb25lbnRzKTsKKyAgR1NUX0xPR19PQkpFQ1QgKGRlYywgImpwZWdfY29sb3Jfc3BhY2U9JWQiLCBkZWMtPmNpbmZvLmpwZWdfY29sb3Jfc3BhY2UpOworCisgIGlmICghZGVjLT5jaW5mby5udW1fY29tcG9uZW50cyB8fCAhZGVjLT5jaW5mby5jb21wX2luZm8pCisgICAgZ290byBjb21wb25lbnRzX25vdF9zdXBwb3J0ZWQ7CisKKyAgcl9oID0gZGVjLT5jaW5mby5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvcjsKKyAgcl92ID0gZGVjLT5jaW5mby5jb21wX2luZm9bMF0udl9zYW1wX2ZhY3RvcjsKKworICBHU1RfTE9HX09CSkVDVCAoZGVjLCAicl9oID0gJWQsIHJfdiA9ICVkIiwgcl9oLCByX3YpOworCisgIGlmIChkZWMtPmNpbmZvLm51bV9jb21wb25lbnRzID4gMykKKyAgICBnb3RvIGNvbXBvbmVudHNfbm90X3N1cHBvcnRlZDsKKworICAvKiB2ZXJpZnkgY29sb3Igc3BhY2UgZXhwZWN0YXRpb24gdG8gYXZvaWQgZ29pbmcgKmJvb20qIG9yIGJvZ3VzIG91dHB1dCAqLworICBpZiAoZGVjLT5jaW5mby5qcGVnX2NvbG9yX3NwYWNlICE9IEpDU19ZQ2JDciAmJgorICAgICAgZGVjLT5jaW5mby5qcGVnX2NvbG9yX3NwYWNlICE9IEpDU19HUkFZU0NBTEUgJiYKKyAgICAgIGRlYy0+Y2luZm8uanBlZ19jb2xvcl9zcGFjZSAhPSBKQ1NfUkdCKQorICAgIGdvdG8gdW5zdXBwb3J0ZWRfY29sb3JzcGFjZTsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgeworICAgIGdpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBkZWMtPmNpbmZvLm51bV9jb21wb25lbnRzOyArK2kpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkZWMsICJbJWRdIGhfc2FtcF9mYWN0b3I9JWQsIHZfc2FtcF9mYWN0b3I9JWQsIGNpZD0lZCIsCisgICAgICAgICAgaSwgZGVjLT5jaW5mby5jb21wX2luZm9baV0uaF9zYW1wX2ZhY3RvciwKKyAgICAgICAgICBkZWMtPmNpbmZvLmNvbXBfaW5mb1tpXS52X3NhbXBfZmFjdG9yLAorICAgICAgICAgIGRlYy0+Y2luZm8uY29tcF9pbmZvW2ldLmNvbXBvbmVudF9pZCk7CisgICAgfQorICB9CisjZW5kaWYKKworICAvKiBwcmVwYXJlIGZvciByYXcgb3V0cHV0ICovCisgIGRlYy0+Y2luZm8uZG9fZmFuY3lfdXBzYW1wbGluZyA9IEZBTFNFOworICBkZWMtPmNpbmZvLmRvX2Jsb2NrX3Ntb290aGluZyA9IEZBTFNFOworICBkZWMtPmNpbmZvLm91dF9jb2xvcl9zcGFjZSA9IGRlYy0+Y2luZm8uanBlZ19jb2xvcl9zcGFjZTsKKyAgZGVjLT5jaW5mby5kY3RfbWV0aG9kID0gZGVjLT5pZGN0X21ldGhvZDsKKyAgZGVjLT5jaW5mby5yYXdfZGF0YV9vdXQgPSBUUlVFOworCisgIEdTVF9MT0dfT0JKRUNUIChkZWMsICJzdGFydGluZyBkZWNvbXByZXNzIik7CisgIGd1YXJhbnRlZV9odWZmX3RhYmxlcyAoJmRlYy0+Y2luZm8pOworICBpZiAoIWpwZWdfc3RhcnRfZGVjb21wcmVzcyAoJmRlYy0+Y2luZm8pKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZWMsICJmYWlsZWQgdG8gc3RhcnQgZGVjb21wcmVzc2lvbiBjeWNsZSIpOworICB9CisKKyAgLyogc2FuaXR5IGNoZWNrcyB0byBnZXQgc2FmZSBhbmQgcmVhc29uYWJsZSBvdXRwdXQgKi8KKyAgc3dpdGNoIChkZWMtPmNpbmZvLmpwZWdfY29sb3Jfc3BhY2UpIHsKKyAgICBjYXNlIEpDU19HUkFZU0NBTEU6CisgICAgICBpZiAoZGVjLT5jaW5mby5udW1fY29tcG9uZW50cyAhPSAxKQorICAgICAgICBnb3RvIGludmFsaWRfeXV2cmdiZ3JheXNjYWxlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBKQ1NfUkdCOgorICAgICAgaWYgKGRlYy0+Y2luZm8ubnVtX2NvbXBvbmVudHMgIT0gMyB8fCBkZWMtPmNpbmZvLm1heF92X3NhbXBfZmFjdG9yID4gMSB8fAorICAgICAgICAgIGRlYy0+Y2luZm8ubWF4X2hfc2FtcF9mYWN0b3IgPiAxKQorICAgICAgICBnb3RvIGludmFsaWRfeXV2cmdiZ3JheXNjYWxlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBKQ1NfWUNiQ3I6CisgICAgICBpZiAoZGVjLT5jaW5mby5udW1fY29tcG9uZW50cyAhPSAzIHx8CisgICAgICAgICAgcl92ID4gMiB8fCByX3YgPCBkZWMtPmNpbmZvLmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yIHx8CisgICAgICAgICAgcl92IDwgZGVjLT5jaW5mby5jb21wX2luZm9bMV0udl9zYW1wX2ZhY3RvciB8fAorICAgICAgICAgIHJfaCA8IGRlYy0+Y2luZm8uY29tcF9pbmZvWzBdLmhfc2FtcF9mYWN0b3IgfHwKKyAgICAgICAgICByX2ggPCBkZWMtPmNpbmZvLmNvbXBfaW5mb1sxXS5oX3NhbXBfZmFjdG9yKQorICAgICAgICBnb3RvIGludmFsaWRfeXV2cmdiZ3JheXNjYWxlOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoZGVjLT5jaW5mby5vdXRwdXRfd2lkdGggPCBNSU5fV0lEVEggfHwKKyAgICAgICAgICBkZWMtPmNpbmZvLm91dHB1dF93aWR0aCA+IE1BWF9XSURUSCB8fAorICAgICAgICAgIGRlYy0+Y2luZm8ub3V0cHV0X2hlaWdodCA8IE1JTl9IRUlHSFQgfHwKKyAgICAgICAgICBkZWMtPmNpbmZvLm91dHB1dF9oZWlnaHQgPiBNQVhfSEVJR0hUKSkKKyAgICBnb3RvIHdyb25nX3NpemU7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCisvKiBFUlJPUlMgKi8KK3dyb25nX3NpemU6CisgIHsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBHU1RfVklERU9fREVDT0RFUl9FUlJPUiAoZGVjLCAxLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKF8oIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIpKSwKKyAgICAgICAgKCJQaWN0dXJlIGlzIHRvbyBzbWFsbCBvciB0b28gYmlnICgldXgldSkiLCBkZWMtPmNpbmZvLm91dHB1dF93aWR0aCwKKyAgICAgICAgICAgIGRlYy0+Y2luZm8ub3V0cHV0X2hlaWdodCksIHJldCk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Citjb21wb25lbnRzX25vdF9zdXBwb3J0ZWQ6CisgIHsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBHU1RfVklERU9fREVDT0RFUl9FUlJPUiAoZGVjLCAxLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKF8oIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIpKSwKKyAgICAgICAgKCJudW1iZXIgb2YgY29tcG9uZW50cyBub3Qgc3VwcG9ydGVkOiAlZCAobWF4IDMpIiwKKyAgICAgICAgICAgIGRlYy0+Y2luZm8ubnVtX2NvbXBvbmVudHMpLCByZXQpOworICAgIGpwZWdfYWJvcnRfZGVjb21wcmVzcyAoJmRlYy0+Y2luZm8pOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQordW5zdXBwb3J0ZWRfY29sb3JzcGFjZToKKyAgeworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIEdTVF9WSURFT19ERUNPREVSX0VSUk9SIChkZWMsIDEsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoXygiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIikpLAorICAgICAgICAoIlBpY3R1cmUgaGFzIHVua25vd24gb3IgdW5zdXBwb3J0ZWQgY29sb3Vyc3BhY2UiKSwgcmV0KTsKKyAgICBqcGVnX2Fib3J0X2RlY29tcHJlc3MgKCZkZWMtPmNpbmZvKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2ludmFsaWRfeXV2cmdiZ3JheXNjYWxlOgorICB7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgR1NUX1ZJREVPX0RFQ09ERVJfRVJST1IgKGRlYywgMSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChfKCJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiKSksCisgICAgICAgICgiUGljdHVyZSBpcyBjb3JydXB0IG9yIHVuaGFuZGxlZCBZVVYvUkdCL2dyYXlzY2FsZSBsYXlvdXQiKSwgcmV0KTsKKyAgICBqcGVnX2Fib3J0X2RlY29tcHJlc3MgKCZkZWMtPmNpbmZvKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9qcGVnX2RlY19kZWNvZGUgKEdzdEpwZWdEZWMgKiBkZWMsIEdzdFZpZGVvRnJhbWUgKiB2ZnJhbWUsIGd1aW50IHdpZHRoLAorICAgIGd1aW50IGhlaWdodCwgZ3VpbnQgZmllbGQsIGd1aW50IG51bV9maWVsZHMpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgaWYgKGRlYy0+Y2luZm8uanBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7CisgICAgZ3N0X2pwZWdfZGVjX2RlY29kZV9yZ2IgKGRlYywgdmZyYW1lLCBmaWVsZCwgbnVtX2ZpZWxkcyk7CisgIH0gZWxzZSBpZiAoZGVjLT5jaW5mby5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpIHsKKyAgICBnc3RfanBlZ19kZWNfZGVjb2RlX2dyYXlzY2FsZSAoZGVjLCB2ZnJhbWUsIGZpZWxkLCBudW1fZmllbGRzKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoZGVjLCAiZGVjb21wcmVzc2luZyAocmVxdWlyZWQgc2NhbmxpbmUgYnVmZmVyIGhlaWdodCA9ICV1KSIsCisgICAgICAgIGRlYy0+Y2luZm8ucmVjX291dGJ1Zl9oZWlnaHQpOworCisgICAgLyogRm9yIHNvbWUgd2lkdGhzIGpwZWdsaWIgcmVxdWlyZXMgbW9yZSBob3Jpem9udGFsIHBhZGRpbmcgdGhhbiBJNDIwIAorICAgICAqIHByb3ZpZGVzLiBJbiB0aG9zZSBjYXNlcyB3ZSBuZWVkIHRvIGRlY29kZSBpbnRvIHNlcGFyYXRlIGJ1ZmZlcnMgYW5kIHRoZW4KKyAgICAgKiBjb3B5IG92ZXIgdGhlIGRhdGEgaW50byBvdXIgZmluYWwgcGljdHVyZSBidWZmZXIsIG90aGVyd2lzZSBqcGVnbGliIG1pZ2h0CisgICAgICogd3JpdGUgb3ZlciB0aGUgZW5kIG9mIGEgbGluZSBpbnRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgbGluZSwKKyAgICAgKiByZXN1bHRpbmcgaW4gYmxvY2t5IGFydGlmYWN0cyBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBwaWN0dXJlLiAqLworICAgIGlmIChHX1VOTElLRUxZICh3aWR0aCAlIChkZWMtPmNpbmZvLm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSkgIT0gMAorICAgICAgICAgICAgfHwgZGVjLT5jaW5mby5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvciAhPSAyCisgICAgICAgICAgICB8fCBkZWMtPmNpbmZvLmNvbXBfaW5mb1sxXS5oX3NhbXBfZmFjdG9yICE9IDEKKyAgICAgICAgICAgIHx8IGRlYy0+Y2luZm8uY29tcF9pbmZvWzJdLmhfc2FtcF9mYWN0b3IgIT0gMSkpIHsKKyAgICAgIEdTVF9DQVRfTE9HX09CSkVDVCAoR1NUX0NBVF9QRVJGT1JNQU5DRSwgZGVjLAorICAgICAgICAgICJpbmRpcmVjdCBkZWNvZGluZyB1c2luZyBleHRyYSBidWZmZXIgY29weSIpOworICAgICAgZ3N0X2pwZWdfZGVjX2RlY29kZV9pbmRpcmVjdCAoZGVjLCB2ZnJhbWUsCisgICAgICAgICAgZGVjLT5jaW5mby5jb21wX2luZm9bMF0udl9zYW1wX2ZhY3RvciwKKyAgICAgICAgICBkZWMtPmNpbmZvLmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yLCBkZWMtPmNpbmZvLm51bV9jb21wb25lbnRzLAorICAgICAgICAgIGZpZWxkLCBudW1fZmllbGRzKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0ID0gZ3N0X2pwZWdfZGVjX2RlY29kZV9kaXJlY3QgKGRlYywgdmZyYW1lLCBmaWVsZCwgbnVtX2ZpZWxkcyk7CisgICAgfQorICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlYywgImRlY29tcHJlc3NpbmcgZmluaXNoZWQ6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworCisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKSB7CisgICAganBlZ19hYm9ydF9kZWNvbXByZXNzICgmZGVjLT5jaW5mbyk7CisgIH0gZWxzZSB7CisgICAganBlZ19maW5pc2hfZGVjb21wcmVzcyAoJmRlYy0+Y2luZm8pOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9qcGVnX2RlY19oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRGVjb2RlciAqIGJkZWMsIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RKcGVnRGVjICpkZWMgPSAoR3N0SnBlZ0RlYyAqKSBiZGVjOworICBHc3RWaWRlb0ZyYW1lIHZmcmFtZTsKKyAgZ2ludCBudW1fZmllbGRzOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGZpZWxkcyAoMSBvciAyKSAqLworICBnaW50IG91dHB1dF9oZWlnaHQ7ICAgICAgICAgICAvKiBoZWlnaHQgb2Ygb3V0cHV0IGltYWdlIChvbmUgb3IgdHdvIGZpZWxkcykgKi8KKyAgZ2ludCBoZWlnaHQ7ICAgICAgICAgICAgICAgICAgLyogaGVpZ2h0IG9mIGN1cnJlbnQgZnJhbWUgKHdob2xlIGltYWdlIG9yIGEgZmllbGQpICovCisgIGdpbnQgd2lkdGg7CisgIGd1aW50IGNvZGU7CisgIGdib29sZWFuIG5lZWRfdW5tYXAgPSBUUlVFOworICBHc3RWaWRlb0NvZGVjU3RhdGUgKnN0YXRlID0gTlVMTDsKKyAgZ2Jvb2xlYW4gcmVsZWFzZV9mcmFtZSA9IFRSVUU7CisgIGdib29sZWFuIGhhc19lb2k7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgbmJ5dGVzOworCisgIGdzdF9idWZmZXJfbWFwIChmcmFtZS0+aW5wdXRfYnVmZmVyLCAmZGVjLT5jdXJyZW50X2ZyYW1lX21hcCwgR1NUX01BUF9SRUFEKTsKKworICBkYXRhID0gZGVjLT5jdXJyZW50X2ZyYW1lX21hcC5kYXRhOworICBuYnl0ZXMgPSBkZWMtPmN1cnJlbnRfZnJhbWVfbWFwLnNpemU7CisgIGhhc19lb2kgPSAoKGRhdGFbbmJ5dGVzIC0gMl0gIT0gMHhmZikgfHwgKGRhdGFbbmJ5dGVzIC0gMV0gIT0gMHhkOSkpOworCisgIC8qIHNvbWUgY2FtZXJhcyBmYWlsIHRvIHNlbmQgYW4gZW5kLW9mLWltYWdlIG1hcmtlciAoRU9JKSwKKyAgICogYWRkIGl0IGlmIHRoYXQgaXMgdGhlIGNhc2UuICovCisgIGlmICghaGFzX2VvaSkgeworICAgIEdzdE1hcEluZm8gbWFwOworICAgIEdzdEJ1ZmZlciAqZW9pYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgyKTsKKworICAgIC8qIHVubWFwLCB3aWxsIGFkZCBFT0kgYW5kIHJlbWFwIGF0IHRoZSBlbmQgKi8KKyAgICBnc3RfYnVmZmVyX3VubWFwIChmcmFtZS0+aW5wdXRfYnVmZmVyLCAmZGVjLT5jdXJyZW50X2ZyYW1lX21hcCk7CisKKyAgICBnc3RfYnVmZmVyX21hcCAoZW9pYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBtYXAuZGF0YVswXSA9IDB4ZmY7CisgICAgbWFwLmRhdGFbMV0gPSAweGQ5OworICAgIGdzdF9idWZmZXJfdW5tYXAgKGVvaWJ1ZiwgJm1hcCk7CisKKyAgICAvKiBhcHBlbmQgdG8gaW5wdXQgYnVmZmVyLCBhbmQgcmVtYXAgKi8KKyAgICBmcmFtZS0+aW5wdXRfYnVmZmVyID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKGZyYW1lLT5pbnB1dF9idWZmZXIsIGVvaWJ1Zik7CisKKyAgICBnc3RfYnVmZmVyX21hcCAoZnJhbWUtPmlucHV0X2J1ZmZlciwgJmRlYy0+Y3VycmVudF9mcmFtZV9tYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgR1NUX0RFQlVHICgiZml4dXAgRU9JIG1hcmtlciBhZGRlZCIpOworICB9CisKKyAgZGVjLT5jdXJyZW50X2ZyYW1lID0gZnJhbWU7CisgIGRlYy0+Y2luZm8uc3JjLT5uZXh0X2lucHV0X2J5dGUgPSBkZWMtPmN1cnJlbnRfZnJhbWVfbWFwLmRhdGE7CisgIGRlYy0+Y2luZm8uc3JjLT5ieXRlc19pbl9idWZmZXIgPSBkZWMtPmN1cnJlbnRfZnJhbWVfbWFwLnNpemU7CisKKyAgaWYgKHNldGptcCAoZGVjLT5qZXJyLnNldGptcF9idWZmZXIpKSB7CisgICAgY29kZSA9IGRlYy0+amVyci5wdWIubXNnX2NvZGU7CisKKyAgICBpZiAoY29kZSA9PSBKRVJSX0lOUFVUX0VPRikgeworICAgICAgR1NUX0RFQlVHICgianBlZyBpbnB1dCBFT0YgZXJyb3IsIHdlIHByb2JhYmx5IG5lZWQgbW9yZSBkYXRhIik7CisgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworICAgIH0KKyAgICBnb3RvIGRlY29kZV9lcnJvcjsKKyAgfQorCisgIC8qIHJlYWQgaGVhZGVyIGFuZCBjaGVjayB2YWx1ZXMgKi8KKyAgcmV0ID0gZ3N0X2pwZWdfZGVjX3ByZXBhcmVfZGVjb2RlIChkZWMpOworICBpZiAoR19VTkxJS0VMWSAocmV0ID09IEdTVF9GTE9XX0VSUk9SKSkKKyAgICBnb3RvIGRvbmU7CisKKyAgd2lkdGggPSBkZWMtPmNpbmZvLm91dHB1dF93aWR0aDsKKyAgaGVpZ2h0ID0gZGVjLT5jaW5mby5vdXRwdXRfaGVpZ2h0OworCisgIC8qIGlzIGl0IGludGVybGFjZWQgTUpQRUc/ICh3ZSByZWFsbHkgZG9uJ3Qgd2FudCB0byBzY2FuIHRoZSBqcGVnIGRhdGEKKyAgICogdG8gc2VlIGlmIHRoZXJlIGFyZSB0d28gU09GIG1hcmtlcnMgaW4gdGhlIHBhY2tldCB0byBkZXRlY3QgdGhpcykgKi8KKyAgaWYgKGdzdF92aWRlb19kZWNvZGVyX2dldF9wYWNrZXRpemVkIChiZGVjKSAmJgorICAgICAgZGVjLT5pbnB1dF9zdGF0ZS0+aW5mby5oZWlnaHQgPiBoZWlnaHQgJiYKKyAgICAgIGRlYy0+aW5wdXRfc3RhdGUtPmluZm8uaGVpZ2h0IDw9IChoZWlnaHQgKiAyKQorICAgICAgJiYgZGVjLT5pbnB1dF9zdGF0ZS0+aW5mby53aWR0aCA9PSB3aWR0aCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChkZWMsCisgICAgICAgICJsb29rcyBsaWtlIGFuIGludGVybGFjZWQgaW1hZ2U6ICIKKyAgICAgICAgImlucHV0IHdpZHRoL2hlaWdodCBvZiAlZHglZCB3aXRoIEpQRUcgZnJhbWUgd2lkdGgvaGVpZ2h0IG9mICVkeCVkIiwKKyAgICAgICAgZGVjLT5pbnB1dF9zdGF0ZS0+aW5mby53aWR0aCwgZGVjLT5pbnB1dF9zdGF0ZS0+aW5mby5oZWlnaHQsIHdpZHRoLAorICAgICAgICBoZWlnaHQpOworICAgIG91dHB1dF9oZWlnaHQgPSBkZWMtPmlucHV0X3N0YXRlLT5pbmZvLmhlaWdodDsKKyAgICBoZWlnaHQgPSBkZWMtPmlucHV0X3N0YXRlLT5pbmZvLmhlaWdodCAvIDI7CisgICAgbnVtX2ZpZWxkcyA9IDI7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlYywgImZpZWxkIGhlaWdodD0lZCIsIGhlaWdodCk7CisgIH0gZWxzZSB7CisgICAgb3V0cHV0X2hlaWdodCA9IGhlaWdodDsKKyAgICBudW1fZmllbGRzID0gMTsKKyAgfQorCisgIGdzdF9qcGVnX2RlY19uZWdvdGlhdGUgKGRlYywgd2lkdGgsIG91dHB1dF9oZWlnaHQsCisgICAgICBkZWMtPmNpbmZvLmpwZWdfY29sb3Jfc3BhY2UsIG51bV9maWVsZHMgPT0gMik7CisKKyAgc3RhdGUgPSBnc3RfdmlkZW9fZGVjb2Rlcl9nZXRfb3V0cHV0X3N0YXRlIChiZGVjKTsKKyAgcmV0ID0gZ3N0X3ZpZGVvX2RlY29kZXJfYWxsb2NhdGVfb3V0cHV0X2ZyYW1lIChiZGVjLCBmcmFtZSk7CisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKQorICAgIGdvdG8gYWxsb2NfZmFpbGVkOworCisgIGlmICghZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJnZmcmFtZSwgJnN0YXRlLT5pbmZvLCBmcmFtZS0+b3V0cHV0X2J1ZmZlciwKKyAgICAgICAgICBHU1RfTUFQX1JFQURXUklURSkpCisgICAgZ290byBhbGxvY19mYWlsZWQ7CisKKyAgaWYgKHNldGptcCAoZGVjLT5qZXJyLnNldGptcF9idWZmZXIpKSB7CisgICAgY29kZSA9IGRlYy0+amVyci5wdWIubXNnX2NvZGU7CisgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmdmZyYW1lKTsKKyAgICBnb3RvIGRlY29kZV9lcnJvcjsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChkZWMsICJ3aWR0aCAlZCwgaGVpZ2h0ICVkLCBmaWVsZHMgJWQiLCB3aWR0aCwgb3V0cHV0X2hlaWdodCwKKyAgICAgIG51bV9maWVsZHMpOworCisgIHJldCA9IGdzdF9qcGVnX2RlY19kZWNvZGUgKGRlYywgJnZmcmFtZSwgd2lkdGgsIGhlaWdodCwgMSwgbnVtX2ZpZWxkcyk7CisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKSB7CisgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmdmZyYW1lKTsKKyAgICBnb3RvIGRlY29kZV9mYWlsZWQ7CisgIH0KKworICBpZiAoc2V0am1wIChkZWMtPmplcnIuc2V0am1wX2J1ZmZlcikpIHsKKyAgICBjb2RlID0gZGVjLT5qZXJyLnB1Yi5tc2dfY29kZTsKKyAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZ2ZnJhbWUpOworICAgIGdvdG8gZGVjb2RlX2Vycm9yOworICB9CisKKyAgLyogZGVjb2RlIHNlY29uZCBmaWVsZCBpZiB0aGVyZSBpcyBvbmUgKi8KKyAgaWYgKG51bV9maWVsZHMgPT0gMikgeworICAgIEdzdFZpZGVvRm9ybWF0IGZpZWxkMl9mb3JtYXQ7CisKKyAgICAvKiBza2lwIGFueSBjaHVuayBvciBwYWRkaW5nIGJ5dGVzIGJlZm9yZSB0aGUgbmV4dCBTT0kgbWFya2VyOyBib3RoIGZpZWxkcworICAgICAqIGFyZSBpbiBvbmUgc2luZ2xlIGJ1ZmZlciBoZXJlLCBzbyBkaXJlY3QgYWNjZXNzIHNob3VsZCBiZSBmaW5lIGhlcmUgKi8KKyAgICB3aGlsZSAoZGVjLT5qc3JjLnB1Yi5ieXRlc19pbl9idWZmZXIgPiAyICYmCisgICAgICAgIEdTVF9SRUFEX1VJTlQxNl9CRSAoZGVjLT5qc3JjLnB1Yi5uZXh0X2lucHV0X2J5dGUpICE9IDB4ZmZkOCkgeworICAgICAgLS1kZWMtPmpzcmMucHViLmJ5dGVzX2luX2J1ZmZlcjsKKyAgICAgICsrZGVjLT5qc3JjLnB1Yi5uZXh0X2lucHV0X2J5dGU7CisgICAgfQorCisgICAgaWYgKGdzdF9qcGVnX2RlY19wcmVwYXJlX2RlY29kZSAoZGVjKSAhPSBHU1RfRkxPV19PSykgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZWMsICJwcm9ibGVtIHJlYWRpbmcganBlZyBoZWFkZXIgb2YgMm5kIGZpZWxkIik7CisgICAgICAvKiBGSVhNRTogcG9zdCBhIHdhcm5pbmcgbWVzc2FnZSBoZXJlPyAqLworICAgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmdmZyYW1lKTsKKyAgICAgIGdvdG8gZGVjb2RlX2ZhaWxlZDsKKyAgICB9CisKKyAgICAvKiBjaGVjayBpZiBmb3JtYXQgaGFzIGNoYW5nZWQgZm9yIHRoZSBzZWNvbmQgZmllbGQgKi8KKyAgICBzd2l0Y2ggKGRlYy0+Y2luZm8uanBlZ19jb2xvcl9zcGFjZSkgeworICAgICAgY2FzZSBKQ1NfUkdCOgorICAgICAgICBmaWVsZDJfZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9SR0I7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKQ1NfR1JBWVNDQUxFOgorICAgICAgICBmaWVsZDJfZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9HUkFZODsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWVsZDJfZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZGVjLAorICAgICAgICAiZ290IGZvciBzZWNvbmQgZmllbGQgb2YgaW50ZXJsYWNlZCBpbWFnZTogIgorICAgICAgICAiaW5wdXQgd2lkdGgvaGVpZ2h0IG9mICVkeCVkIHdpdGggSlBFRyBmcmFtZSB3aWR0aC9oZWlnaHQgb2YgJWR4JWQiLAorICAgICAgICBkZWMtPmlucHV0X3N0YXRlLT5pbmZvLndpZHRoLCBkZWMtPmlucHV0X3N0YXRlLT5pbmZvLmhlaWdodCwKKyAgICAgICAgZGVjLT5jaW5mby5vdXRwdXRfd2lkdGgsIGRlYy0+Y2luZm8ub3V0cHV0X2hlaWdodCk7CisKKyAgICBpZiAoZGVjLT5jaW5mby5vdXRwdXRfd2lkdGggIT0gR1NUX1ZJREVPX0lORk9fV0lEVEggKCZzdGF0ZS0+aW5mbykgfHwKKyAgICAgICAgR1NUX1ZJREVPX0lORk9fSEVJR0hUICgmc3RhdGUtPmluZm8pIDw9IGRlYy0+Y2luZm8ub3V0cHV0X2hlaWdodCB8fAorICAgICAgICBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZzdGF0ZS0+aW5mbykgPiAoZGVjLT5jaW5mby5vdXRwdXRfaGVpZ2h0ICogMikgfHwKKyAgICAgICAgZmllbGQyX2Zvcm1hdCAhPSBHU1RfVklERU9fSU5GT19GT1JNQVQgKCZzdGF0ZS0+aW5mbykpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVjLCAic2Vjb25kIGZpZWxkIGhhcyBkaWZmZXJlbnQgZm9ybWF0IHRoYW4gZmlyc3QiKTsKKyAgICAgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJnZmcmFtZSk7CisgICAgICBnb3RvIGRlY29kZV9mYWlsZWQ7CisgICAgfQorCisgICAgcmV0ID0gZ3N0X2pwZWdfZGVjX2RlY29kZSAoZGVjLCAmdmZyYW1lLCB3aWR0aCwgaGVpZ2h0LCAyLCAyKTsKKyAgICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkgeworICAgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmdmZyYW1lKTsKKyAgICAgIGdvdG8gZGVjb2RlX2ZhaWxlZDsKKyAgICB9CisgIH0KKyAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmdmZyYW1lKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChmcmFtZS0+aW5wdXRfYnVmZmVyLCAmZGVjLT5jdXJyZW50X2ZyYW1lX21hcCk7CisgIHJldCA9IGdzdF92aWRlb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoYmRlYywgZnJhbWUpOworICByZWxlYXNlX2ZyYW1lID0gRkFMU0U7CisgIG5lZWRfdW5tYXAgPSBGQUxTRTsKKworZG9uZToKKworZXhpdDoKKworICBpZiAobmVlZF91bm1hcCkKKyAgICBnc3RfYnVmZmVyX3VubWFwIChmcmFtZS0+aW5wdXRfYnVmZmVyLCAmZGVjLT5jdXJyZW50X2ZyYW1lX21hcCk7CisKKyAgaWYgKHJlbGVhc2VfZnJhbWUpCisgICAgZ3N0X3ZpZGVvX2RlY29kZXJfcmVsZWFzZV9mcmFtZSAoYmRlYywgZnJhbWUpOworCisgIGlmIChzdGF0ZSkKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKHN0YXRlKTsKKworICByZXR1cm4gcmV0OworCisgIC8qIHNwZWNpYWwgY2FzZXMgKi8KK25lZWRfbW9yZV9kYXRhOgorICB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlYywgIndlIG5lZWQgbW9yZSBkYXRhIik7CisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBleGl0OworICB9CisgIC8qIEVSUk9SUyAqLworZGVjb2RlX2Vycm9yOgorICB7CisgICAgZ2NoYXIgZXJyX21zZ1tKTVNHX0xFTkdUSF9NQVhdOworCisgICAgZGVjLT5qZXJyLnB1Yi5mb3JtYXRfbWVzc2FnZSAoKGpfY29tbW9uX3B0cikgKCZkZWMtPmNpbmZvKSwgZXJyX21zZyk7CisKKyAgICBHU1RfVklERU9fREVDT0RFUl9FUlJPUiAoZGVjLCAxLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKF8oIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIpKSwgKCJEZWNvZGUgZXJyb3IgIyV1OiAlcyIsIGNvZGUsCisgICAgICAgICAgICBlcnJfbXNnKSwgcmV0KTsKKworICAgIGdzdF9idWZmZXJfdW5tYXAgKGZyYW1lLT5pbnB1dF9idWZmZXIsICZkZWMtPmN1cnJlbnRfZnJhbWVfbWFwKTsKKyAgICBnc3RfdmlkZW9fZGVjb2Rlcl9kcm9wX2ZyYW1lIChiZGVjLCBmcmFtZSk7CisgICAgcmVsZWFzZV9mcmFtZSA9IEZBTFNFOworICAgIG5lZWRfdW5tYXAgPSBGQUxTRTsKKyAgICBqcGVnX2Fib3J0X2RlY29tcHJlc3MgKCZkZWMtPmNpbmZvKTsKKworICAgIGdvdG8gZG9uZTsKKyAgfQorZGVjb2RlX2ZhaWxlZDoKKyAgeworICAgIC8qIGFscmVhZHkgcG9zdGVkIGFuIGVycm9yIG1lc3NhZ2UgKi8KKyAgICBnb3RvIGRvbmU7CisgIH0KK2FsbG9jX2ZhaWxlZDoKKyAgeworICAgIGNvbnN0IGdjaGFyICpyZWFzb247CisKKyAgICByZWFzb24gPSBnc3RfZmxvd19nZXRfbmFtZSAocmV0KTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgImZhaWxlZCB0byBhbGxvYyBidWZmZXIsIHJlYXNvbiAlcyIsIHJlYXNvbik7CisgICAgLyogUmVzZXQgZm9yIG5leHQgdGltZSAqLworICAgIGpwZWdfYWJvcnRfZGVjb21wcmVzcyAoJmRlYy0+Y2luZm8pOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfRU9TICYmIHJldCAhPSBHU1RfRkxPV19GTFVTSElORyAmJgorICAgICAgICByZXQgIT0gR1NUX0ZMT1dfTk9UX0xJTktFRCkgeworICAgICAgR1NUX1ZJREVPX0RFQ09ERVJfRVJST1IgKGRlYywgMSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgICAgKF8oIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIpKSwKKyAgICAgICAgICAoIkJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCwgcmVhc29uOiAlcyIsIHJlYXNvbiksIHJldCk7CisgICAgICBqcGVnX2Fib3J0X2RlY29tcHJlc3MgKCZkZWMtPmNpbmZvKTsKKyAgICB9CisgICAgZ290byBleGl0OworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2pwZWdfZGVjX2RlY2lkZV9hbGxvY2F0aW9uIChHc3RWaWRlb0RlY29kZXIgKiBiZGVjLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RCdWZmZXJQb29sICpwb29sID0gTlVMTDsKKyAgR3N0U3RydWN0dXJlICpjb25maWc7CisKKyAgaWYgKCFHU1RfVklERU9fREVDT0RFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGVjaWRlX2FsbG9jYXRpb24gKGJkZWMsIHF1ZXJ5KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGdzdF9xdWVyeV9nZXRfbl9hbGxvY2F0aW9uX3Bvb2xzIChxdWVyeSkgPiAwKQorICAgIGdzdF9xdWVyeV9wYXJzZV9udGhfYWxsb2NhdGlvbl9wb29sIChxdWVyeSwgMCwgJnBvb2wsIE5VTEwsIE5VTEwsIE5VTEwpOworCisgIGlmIChwb29sID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGNvbmZpZyA9IGdzdF9idWZmZXJfcG9vbF9nZXRfY29uZmlnIChwb29sKTsKKyAgaWYgKGdzdF9xdWVyeV9maW5kX2FsbG9jYXRpb25fbWV0YSAocXVlcnksIEdTVF9WSURFT19NRVRBX0FQSV9UWVBFLCBOVUxMKSkgeworICAgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfYWRkX29wdGlvbiAoY29uZmlnLAorICAgICAgICBHU1RfQlVGRkVSX1BPT0xfT1BUSU9OX1ZJREVPX01FVEEpOworICB9CisgIGdzdF9idWZmZXJfcG9vbF9zZXRfY29uZmlnIChwb29sLCBjb25maWcpOworICBnc3Rfb2JqZWN0X3VucmVmIChwb29sKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfanBlZ19kZWNfc2lua19ldmVudCAoR3N0VmlkZW9EZWNvZGVyICogYmRlYywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgY29uc3QgR3N0U2VnbWVudCAqc2VnbWVudDsKKworICBpZiAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSAhPSBHU1RfRVZFTlRfU0VHTUVOVCkKKyAgICBnb3RvIGRvbmU7CisKKyAgZ3N0X2V2ZW50X3BhcnNlX3NlZ21lbnQgKGV2ZW50LCAmc2VnbWVudCk7CisKKyAgaWYgKHNlZ21lbnQtPmZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpCisgICAgZ3N0X3ZpZGVvX2RlY29kZXJfc2V0X3BhY2tldGl6ZWQgKGJkZWMsIFRSVUUpOworICBlbHNlCisgICAgZ3N0X3ZpZGVvX2RlY29kZXJfc2V0X3BhY2tldGl6ZWQgKGJkZWMsIEZBTFNFKTsKKworZG9uZToKKyAgcmV0dXJuIEdTVF9WSURFT19ERUNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChiZGVjLCBldmVudCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2pwZWdfZGVjX3N0YXJ0IChHc3RWaWRlb0RlY29kZXIgKiBiZGVjKQoreworICBHc3RKcGVnRGVjICpkZWMgPSAoR3N0SnBlZ0RlYyAqKSBiZGVjOworCisgIGRlYy0+c2F3X2hlYWRlciA9IEZBTFNFOworICBkZWMtPnBhcnNlX2VudHJvcHlfbGVuID0gMDsKKyAgZGVjLT5wYXJzZV9yZXN5bmMgPSBGQUxTRTsKKworICBnc3RfdmlkZW9fZGVjb2Rlcl9zZXRfcGFja2V0aXplZCAoYmRlYywgRkFMU0UpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9qcGVnX2RlY19mbHVzaCAoR3N0VmlkZW9EZWNvZGVyICogYmRlYykKK3sKKyAgR3N0SnBlZ0RlYyAqZGVjID0gKEdzdEpwZWdEZWMgKikgYmRlYzsKKworICBqcGVnX2Fib3J0X2RlY29tcHJlc3MgKCZkZWMtPmNpbmZvKTsKKyAgZGVjLT5wYXJzZV9lbnRyb3B5X2xlbiA9IDA7CisgIGRlYy0+cGFyc2VfcmVzeW5jID0gRkFMU0U7CisgIGRlYy0+c2F3X2hlYWRlciA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdfZGVjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RKcGVnRGVjICpkZWM7CisKKyAgZGVjID0gR1NUX0pQRUdfREVDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9JRENUX01FVEhPRDoKKyAgICAgIGRlYy0+aWRjdF9tZXRob2QgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyNpZm5kZWYgR1NUX1JFTU9WRV9ERVBSRUNBVEVECisgICAgY2FzZSBQUk9QX01BWF9FUlJPUlM6CisgICAgICBnX2F0b21pY19pbnRfc2V0ICgmZGVjLT5tYXhfZXJyb3JzLCBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9qcGVnX2RlY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0SnBlZ0RlYyAqZGVjOworCisgIGRlYyA9IEdTVF9KUEVHX0RFQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfSURDVF9NRVRIT0Q6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgZGVjLT5pZGN0X21ldGhvZCk7CisgICAgICBicmVhazsKKyNpZm5kZWYgR1NUX1JFTU9WRV9ERVBSRUNBVEVECisgICAgY2FzZSBQUk9QX01BWF9FUlJPUlM6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBnX2F0b21pY19pbnRfZ2V0ICgmZGVjLT5tYXhfZXJyb3JzKSk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfanBlZ19kZWNfc3RvcCAoR3N0VmlkZW9EZWNvZGVyICogYmRlYykKK3sKKyAgR3N0SnBlZ0RlYyAqZGVjID0gKEdzdEpwZWdEZWMgKikgYmRlYzsKKworICBnc3RfanBlZ19kZWNfZnJlZV9idWZmZXJzIChkZWMpOworCisgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvZXh0L2pwZWcvZ3N0anBlZ2RlYy5oIGIvZXh0L2pwZWcvZ3N0anBlZ2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZmEyZmMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvanBlZy9nc3RqcGVnZGVjLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBDb2xsYWJvcmEgTHRkLgorICoJQXV0aG9yIDogRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNvbGxhYm9yYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX0pQRUdfREVDX0hfXworI2RlZmluZSBfX0dTVF9KUEVHX0RFQ19IX18KKworCisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2RlY29kZXIuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisKKy8qIHRoaXMgaXMgYSBoYWNrIGhhY2sgaGFjayB0byBnZXQgYXJvdW5kIGpwZWdsaWIgaGVhZGVyIGJ1Z3MuLi4gKi8KKyNpZmRlZiBIQVZFX1NURExJQl9ICisjIHVuZGVmIEhBVkVfU1RETElCX0gKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8anBlZ2xpYi5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfSlBFR19ERUMgXAorICAoZ3N0X2pwZWdfZGVjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9KUEVHX0RFQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0pQRUdfREVDLEdzdEpwZWdEZWMpKQorI2RlZmluZSBHU1RfSlBFR19ERUNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfSlBFR19ERUMsR3N0SnBlZ0RlY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0pQRUdfREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfSlBFR19ERUMpKQorI2RlZmluZSBHU1RfSVNfSlBFR19ERUNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfSlBFR19ERUMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0SnBlZ0RlYyAgICAgICAgICAgR3N0SnBlZ0RlYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RKcGVnRGVjQ2xhc3MgICAgICBHc3RKcGVnRGVjQ2xhc3M7CisKK3N0cnVjdCBHc3RKcGVnRGVjRXJyb3JNZ3IgeworICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgICAgcHViOyAgIC8qIHB1YmxpYyBmaWVsZHMgKi8KKyAgam1wX2J1ZiAgICAgICAgICAgICAgICAgIHNldGptcF9idWZmZXI7Cit9OworCitzdHJ1Y3QgR3N0SnBlZ0RlY1NvdXJjZU1nciB7CisgIHN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgICBwdWI7ICAgLyogcHVibGljIGZpZWxkcyAqLworICBHc3RKcGVnRGVjICAgICAgICAgICAgICAqZGVjOworfTsKKworLyogQ2FuJ3QgdXNlIEdzdEJhc2VUcmFuc2Zvcm0sIGJlY2F1c2UgR3N0QmFzZVRyYW5zZm9ybQorICogZG9lc24ndCBoYW5kbGUgdGhlIE4gYnVmZmVycyBpbiwgMSBidWZmZXIgb3V0IGNhc2UsCisgKiBidXQgb25seSB0aGUgMS1pbiAxLW91dCBjYXNlICovCitzdHJ1Y3QgX0dzdEpwZWdEZWMgeworICBHc3RWaWRlb0RlY29kZXIgZGVjb2RlcjsKKworICAvKiBuZWdvdGlhdGVkIHN0YXRlICovCisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqaW5wdXRfc3RhdGU7CisgIEdzdFZpZGVvQ29kZWNGcmFtZSAqY3VycmVudF9mcmFtZTsKKyAgR3N0TWFwSW5mbyBjdXJyZW50X2ZyYW1lX21hcDsKKworICAvKiBwYXJzZSBzdGF0ZSAqLworICBnYm9vbGVhbiBzYXdfaGVhZGVyOworICBnaW50ICAgICBwYXJzZV9lbnRyb3B5X2xlbjsKKyAgZ2ludCAgICAgcGFyc2VfcmVzeW5jOworCisgIC8qIHByb3BlcnRpZXMgKi8KKyAgZ2ludCAgICAgaWRjdF9tZXRob2Q7CisgIGdpbnQgICAgIG1heF9lcnJvcnM7ICAvKiBBVE9NSUMgKi8KKworICBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBjaW5mbzsKKyAgc3RydWN0IEdzdEpwZWdEZWNFcnJvck1nciAgICAgamVycjsKKyAgc3RydWN0IEdzdEpwZWdEZWNTb3VyY2VNZ3IgICAganNyYzsKKworICAvKiBhcnJheXMgZm9yIGluZGlyZWN0IGRlY29kaW5nICovCisgIGdib29sZWFuIGlkcl93aWR0aF9hbGxvY2F0ZWQ7CisgIGd1Y2hhciAqaWRyX3lbMTZdLCppZHJfdVsxNl0sKmlkcl92WzE2XTsKKyAgLyogY3VycmVudCAocGFyc2VkKSBpbWFnZSBzaXplICovCisgIGd1aW50ICAgIHJlbV9pbWdfbGVuOworfTsKKworc3RydWN0IF9Hc3RKcGVnRGVjQ2xhc3MgeworICBHc3RWaWRlb0RlY29kZXJDbGFzcyBkZWNvZGVyX2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2pwZWdfZGVjX2dldF90eXBlKHZvaWQpOworCisKK0dfRU5EX0RFQ0xTCisKKworI2VuZGlmIC8qIF9fR1NUX0pQRUdfREVDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L2pwZWcvZ3N0anBlZ2VuYy5jIGIvZXh0L2pwZWcvZ3N0anBlZ2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNGJlMDYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvanBlZy9nc3RqcGVnZW5jLmMKQEAgLTAsMCArMSw2NTkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBDb2xsYWJvcmEgTHRkLgorICoJQXV0aG9yIDogRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNvbGxhYm9yYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LWpwZWdlbmMKKyAqCisgKiBFbmNvZGVzIGpwZWcgaW1hZ2VzLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB2aWRlb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9NTAgISB2aWRlby94LXJhdywgZnJhbWVyYXRlPScoZnJhY3Rpb24pJzUvMSAhIGpwZWdlbmMgISBhdmltdXggISBmaWxlc2luayBsb2NhdGlvbj1tanBlZy5hdmkKKyAqIF18IGEgcGlwZWxpbmUgdG8gbXV4IDUgSlBFRyBmcmFtZXMgcGVyIHNlY29uZCBpbnRvIGEgMTAgc2VjLiBsb25nIG1vdGlvbiBqcGVnCisgKiBhdmkuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdGpwZWdlbmMuaCIKKyNpbmNsdWRlICJnc3RqcGVnLmgiCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvbWV0YS5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2Jhc2UuaD4KKworLyogZXhwZXJpbWVudGFsICovCisvKiBzZXR0aW5nIHNtb290aGlnIHNlZW1zIHRvIGhhdmUgbm8gZWZmZWN0IGluIGxpYmplcGVnCisjZGVmaW5lIEVOQUJMRV9TTU9PVEhJTkcgMQorKi8KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoanBlZ2VuY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBqcGVnZW5jX2RlYnVnCisKKyNkZWZpbmUgSlBFR19ERUZBVUxUX1FVQUxJVFkgODUKKyNkZWZpbmUgSlBFR19ERUZBVUxUX1NNT09USElORyAwCisjZGVmaW5lIEpQRUdfREVGQVVMVF9JRENUX01FVEhPRAlKRENUX0ZBU1RFU1QKKyNkZWZpbmUgSlBFR19ERUZBVUxUX1NOQVBTSE9UCQlGQUxTRQorCisvKiBKcGVnRW5jIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUVVBTElUWSwKKyAgUFJPUF9TTU9PVEhJTkcsCisgIFBST1BfSURDVF9NRVRIT0QsCisgIFBST1BfU05BUFNIT1QKK307CisKK3N0YXRpYyB2b2lkIGdzdF9qcGVnZW5jX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIHZvaWQgZ3N0X2pwZWdlbmNfcmVzeW5jIChHc3RKcGVnRW5jICoganBlZ2VuYyk7CitzdGF0aWMgdm9pZCBnc3RfanBlZ2VuY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfanBlZ2VuY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfanBlZ2VuY19zdGFydCAoR3N0VmlkZW9FbmNvZGVyICogYmVuYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2pwZWdlbmNfc3RvcCAoR3N0VmlkZW9FbmNvZGVyICogYmVuYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2pwZWdlbmNfc2V0X2Zvcm1hdCAoR3N0VmlkZW9FbmNvZGVyICogZW5jb2RlciwKKyAgICBHc3RWaWRlb0NvZGVjU3RhdGUgKiBzdGF0ZSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfanBlZ2VuY19oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsCisgICAgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUpOworc3RhdGljIGdib29sZWFuIGdzdF9qcGVnZW5jX3Byb3Bvc2VfYWxsb2NhdGlvbiAoR3N0VmlkZW9FbmNvZGVyICogZW5jb2RlciwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworLyogc3RhdGljIGd1aW50IGdzdF9qcGVnZW5jX3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07ICovCisKKyNkZWZpbmUgZ3N0X2pwZWdlbmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0SnBlZ0VuYywgZ3N0X2pwZWdlbmMsIEdTVF9UWVBFX1ZJREVPX0VOQ09ERVIpOworCisvKiAqSU5ERU5ULU9GRiogKi8KK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfanBlZ2VuY19zaW5rX3BhZF90ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UKKyAgICAgICAgKCJ7IEk0MjAsIFlWMTIsIFlVWTIsIFVZVlksIFk0MUIsIFk0MkIsIFlWWVUsIFk0NDQsIE5WMjEsICIKKyAgICAgICAgICJOVjEyLCBSR0IsIEJHUiwgUkdCeCwgeFJHQiwgQkdSeCwgeEJHUiwgR1JBWTggfSIpKQorICAgICk7CisvKiAqSU5ERU5ULU9OKiAqLworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X2pwZWdlbmNfc3JjX3BhZF90ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiaW1hZ2UvanBlZywgIgorICAgICAgICAid2lkdGggPSAoaW50KSBbIDE2LCA2NTUzNSBdLCAiCisgICAgICAgICJoZWlnaHQgPSAoaW50KSBbIDE2LCA2NTUzNSBdLCAiCisgICAgICAgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMC8xLCBNQVggXSwgIgorICAgICAgICAic29mLW1hcmtlciA9IChpbnQpIHsgMCwgMSwgMiwgOSB9IikKKyAgICApOworCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdlbmNfY2xhc3NfaW5pdCAoR3N0SnBlZ0VuY0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHc3RWaWRlb0VuY29kZXJDbGFzcyAqdmVuY19jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIHZlbmNfY2xhc3MgPSAoR3N0VmlkZW9FbmNvZGVyQ2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfanBlZ2VuY19maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2pwZWdlbmNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfanBlZ2VuY19nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9RVUFMSVRZLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInF1YWxpdHkiLCAiUXVhbGl0eSIsICJRdWFsaXR5IG9mIGVuY29kaW5nIiwKKyAgICAgICAgICAwLCAxMDAsIEpQRUdfREVGQVVMVF9RVUFMSVRZLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8CisgICAgICAgICAgR1NUX1BBUkFNX01VVEFCTEVfUExBWUlORykpOworCisjaWZkZWYgRU5BQkxFX1NNT09USElORworICAvKiBkaXNhYmxlZCwgc2luY2UgaXQgZG9lc24ndCBzZWVtIHRvIHdvcmsgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TTU9PVEhJTkcsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgic21vb3RoaW5nIiwgIlNtb290aGluZyIsICJTbW9vdGhpbmcgZmFjdG9yIiwKKyAgICAgICAgICAwLCAxMDAsIEpQRUdfREVGQVVMVF9TTU9PVEhJTkcsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisjZW5kaWYKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lEQ1RfTUVUSE9ELAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJpZGN0LW1ldGhvZCIsICJJRENUIE1ldGhvZCIsCisgICAgICAgICAgIlRoZSBJRENUIGFsZ29yaXRobSB0byB1c2UiLCBHU1RfVFlQRV9JRENUX01FVEhPRCwKKyAgICAgICAgICBKUEVHX0RFRkFVTFRfSURDVF9NRVRIT0QsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RKcGVnRW5jOnNuYXBzaG90OgorICAgKgorICAgKiBTZW5kIEVPUyBhZnRlciBlbmNvZGluZyBhIGZyYW1lLCB1c2VmdWwgZm9yIHNuYXBzaG90cy4KKyAgICoKKyAgICogU2luY2U6IDEuMTQKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU05BUFNIT1QsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInNuYXBzaG90IiwgIlNuYXBzaG90IiwKKyAgICAgICAgICAiU2VuZCBFT1MgYWZ0ZXIgZW5jb2RpbmcgYSBmcmFtZSwgdXNlZnVsIGZvciBzbmFwc2hvdHMiLAorICAgICAgICAgIEpQRUdfREVGQVVMVF9TTkFQU0hPVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X2pwZWdlbmNfc2lua19wYWRfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfanBlZ2VuY19zcmNfcGFkX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiSlBFRyBpbWFnZSBlbmNvZGVyIiwKKyAgICAgICJDb2RlYy9FbmNvZGVyL0ltYWdlIiwgIkVuY29kZSBpbWFnZXMgaW4gSlBFRyBmb3JtYXQiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0B0dmQuYmU+Iik7CisKKyAgdmVuY19jbGFzcy0+c3RhcnQgPSBnc3RfanBlZ2VuY19zdGFydDsKKyAgdmVuY19jbGFzcy0+c3RvcCA9IGdzdF9qcGVnZW5jX3N0b3A7CisgIHZlbmNfY2xhc3MtPnNldF9mb3JtYXQgPSBnc3RfanBlZ2VuY19zZXRfZm9ybWF0OworICB2ZW5jX2NsYXNzLT5oYW5kbGVfZnJhbWUgPSBnc3RfanBlZ2VuY19oYW5kbGVfZnJhbWU7CisgIHZlbmNfY2xhc3MtPnByb3Bvc2VfYWxsb2NhdGlvbiA9IGdzdF9qcGVnZW5jX3Byb3Bvc2VfYWxsb2NhdGlvbjsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoanBlZ2VuY19kZWJ1ZywgImpwZWdlbmMiLCAwLAorICAgICAgIkpQRUcgZW5jb2RpbmcgZWxlbWVudCIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdlbmNfaW5pdF9kZXN0aW5hdGlvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIEdTVF9ERUJVRyAoImdzdF9qcGVnZW5jX2NoYWluOiBpbml0X2Rlc3RpbmF0aW9uIik7Cit9CisKK3N0YXRpYyB2b2lkCitlbnN1cmVfbWVtb3J5IChHc3RKcGVnRW5jICoganBlZ2VuYykKK3sKKyAgR3N0TWVtb3J5ICpuZXdfbWVtb3J5OworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3NpemUgb2xkX3NpemUsIGRlc2lyZWRfc2l6ZSwgbmV3X3NpemU7CisgIGd1aW50OCAqbmV3X2RhdGE7CisgIHN0YXRpYyBHc3RBbGxvY2F0aW9uUGFyYW1zIHBhcmFtcyA9IHsgMCwgMywgMCwgMCwgfTsKKworICBvbGRfc2l6ZSA9IGpwZWdlbmMtPm91dHB1dF9tYXAuc2l6ZTsKKyAgaWYgKG9sZF9zaXplID09IDApCisgICAgZGVzaXJlZF9zaXplID0ganBlZ2VuYy0+YnVmc2l6ZTsKKyAgZWxzZQorICAgIGRlc2lyZWRfc2l6ZSA9IG9sZF9zaXplICogMjsKKworICAvKiBPdXIgb3V0cHV0IG1lbW9yeSB3YXNuJ3QgYmlnIGVub3VnaC4KKyAgICogTWFrZSBhIG5ldyBtZW1vcnkgdGhhdCdzIHR3aWNlIHRoZSBzaXplLCAqLworICBuZXdfbWVtb3J5ID0gZ3N0X2FsbG9jYXRvcl9hbGxvYyAoTlVMTCwgZGVzaXJlZF9zaXplLCAmcGFyYW1zKTsKKyAgZ3N0X21lbW9yeV9tYXAgKG5ld19tZW1vcnksICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgbmV3X2RhdGEgPSBtYXAuZGF0YTsKKyAgbmV3X3NpemUgPSBtYXAuc2l6ZTsKKworICAvKiBjb3B5IHByZXZpb3VzIGRhdGEgaWYgYW55ICovCisgIGlmIChqcGVnZW5jLT5vdXRwdXRfbWVtKSB7CisgICAgbWVtY3B5IChuZXdfZGF0YSwganBlZ2VuYy0+b3V0cHV0X21hcC5kYXRhLCBvbGRfc2l6ZSk7CisgICAgZ3N0X21lbW9yeV91bm1hcCAoanBlZ2VuYy0+b3V0cHV0X21lbSwgJmpwZWdlbmMtPm91dHB1dF9tYXApOworICAgIGdzdF9tZW1vcnlfdW5yZWYgKGpwZWdlbmMtPm91dHB1dF9tZW0pOworICB9CisKKyAgLyogZHJvcCBpdCBpbnRvIHBsYWNlLCAqLworICBqcGVnZW5jLT5vdXRwdXRfbWVtID0gbmV3X21lbW9yeTsKKyAganBlZ2VuYy0+b3V0cHV0X21hcCA9IG1hcDsKKworICAvKiBhbmQgbGFzdCwgdXBkYXRlIGxpYmpwZWcgb24gd2hlcmUgdG8gd29yay4gKi8KKyAganBlZ2VuYy0+amRlc3QubmV4dF9vdXRwdXRfYnl0ZSA9IG5ld19kYXRhICsgb2xkX3NpemU7CisgIGpwZWdlbmMtPmpkZXN0LmZyZWVfaW5fYnVmZmVyID0gbmV3X3NpemUgLSBvbGRfc2l6ZTsKK30KKworc3RhdGljIGJvb2xlYW4KK2dzdF9qcGVnZW5jX2ZsdXNoX2Rlc3RpbmF0aW9uIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgR3N0SnBlZ0VuYyAqanBlZ2VuYyA9IChHc3RKcGVnRW5jICopIChjaW5mby0+Y2xpZW50X2RhdGEpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGpwZWdlbmMsCisgICAgICAiZ3N0X2pwZWdlbmNfY2hhaW46IGZsdXNoX2Rlc3RpbmF0aW9uOiBidWZmZXIgdG9vIHNtYWxsIik7CisKKyAgZW5zdXJlX21lbW9yeSAoanBlZ2VuYyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfanBlZ2VuY190ZXJtX2Rlc3RpbmF0aW9uIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIEdzdEpwZWdFbmMgKmpwZWdlbmMgPSAoR3N0SnBlZ0VuYyAqKSAoY2luZm8tPmNsaWVudF9kYXRhKTsKKyAgZ3NpemUgbWVtb3J5X3NpemUgPSBqcGVnZW5jLT5vdXRwdXRfbWFwLnNpemUgLSBqcGVnZW5jLT5qZGVzdC5mcmVlX2luX2J1ZmZlcjsKKyAgR3N0Qnl0ZVJlYWRlciByZWFkZXIgPQorICAgICAgR1NUX0JZVEVfUkVBREVSX0lOSVQgKGpwZWdlbmMtPm91dHB1dF9tYXAuZGF0YSwgbWVtb3J5X3NpemUpOworICBndWludDE2IG1hcmtlcjsKKyAgZ2ludCBzb2ZfbWFya2VyID0gLTE7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoanBlZ2VuYywgImdzdF9qcGVnZW5jX2NoYWluOiB0ZXJtX3NvdXJjZSIpOworCisgIC8qIEZpbmQgdGhlIFNPRiBtYXJrZXIgKi8KKyAgd2hpbGUgKGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2JlICgmcmVhZGVyLCAmbWFya2VyKSkgeworICAgIC8qIFNPRiBtYXJrZXIgKi8KKyAgICBpZiAobWFya2VyID4+IDQgPT0gMHgwZmZjKSB7CisgICAgICBzb2ZfbWFya2VyID0gbWFya2VyICYgMHg0OworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgZ3N0X21lbW9yeV91bm1hcCAoanBlZ2VuYy0+b3V0cHV0X21lbSwgJmpwZWdlbmMtPm91dHB1dF9tYXApOworICAvKiBUcmltIHRoZSBidWZmZXIgc2l6ZS4gd2Ugd2lsbCBwdXNoIGl0IGluIHRoZSBjaGFpbiBmdW5jdGlvbiAqLworICBnc3RfbWVtb3J5X3Jlc2l6ZSAoanBlZ2VuYy0+b3V0cHV0X21lbSwgMCwgbWVtb3J5X3NpemUpOworICBqcGVnZW5jLT5vdXRwdXRfbWFwLmRhdGEgPSBOVUxMOworICBqcGVnZW5jLT5vdXRwdXRfbWFwLnNpemUgPSAwOworCisgIGlmIChqcGVnZW5jLT5zb2ZfbWFya2VyICE9IHNvZl9tYXJrZXIgfHwganBlZ2VuYy0+aW5wdXRfY2Fwc19jaGFuZ2VkKSB7CisgICAgR3N0VmlkZW9Db2RlY1N0YXRlICpvdXRwdXQ7CisgICAgb3V0cHV0ID0KKyAgICAgICAgZ3N0X3ZpZGVvX2VuY29kZXJfc2V0X291dHB1dF9zdGF0ZSAoR1NUX1ZJREVPX0VOQ09ERVIgKGpwZWdlbmMpLAorICAgICAgICBnc3RfY2Fwc19uZXdfc2ltcGxlICgiaW1hZ2UvanBlZyIsICJzb2YtbWFya2VyIiwgR19UWVBFX0lOVCwgc29mX21hcmtlciwKKyAgICAgICAgICAgIE5VTEwpLCBqcGVnZW5jLT5pbnB1dF9zdGF0ZSk7CisgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChvdXRwdXQpOworICAgIGpwZWdlbmMtPnNvZl9tYXJrZXIgPSBzb2ZfbWFya2VyOworICAgIGpwZWdlbmMtPmlucHV0X2NhcHNfY2hhbmdlZCA9IEZBTFNFOworICB9CisKKyAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgIGdzdF9idWZmZXJfY29weV9pbnRvIChvdXRidWYsIGpwZWdlbmMtPmN1cnJlbnRfZnJhbWUtPmlucHV0X2J1ZmZlciwKKyAgICAgIEdTVF9CVUZGRVJfQ09QWV9NRVRBREFUQSwgMCwgLTEpOworICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKG91dGJ1ZiwganBlZ2VuYy0+b3V0cHV0X21lbSk7CisgIGpwZWdlbmMtPm91dHB1dF9tZW0gPSBOVUxMOworCisgIGpwZWdlbmMtPmN1cnJlbnRfZnJhbWUtPm91dHB1dF9idWZmZXIgPSBvdXRidWY7CisKKyAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmanBlZ2VuYy0+Y3VycmVudF92ZnJhbWUpOworCisgIEdTVF9WSURFT19DT0RFQ19GUkFNRV9TRVRfU1lOQ19QT0lOVCAoanBlZ2VuYy0+Y3VycmVudF9mcmFtZSk7CisKKyAganBlZ2VuYy0+cmVzID0gZ3N0X3ZpZGVvX2VuY29kZXJfZmluaXNoX2ZyYW1lIChHU1RfVklERU9fRU5DT0RFUiAoanBlZ2VuYyksCisgICAgICBqcGVnZW5jLT5jdXJyZW50X2ZyYW1lKTsKKyAganBlZ2VuYy0+Y3VycmVudF9mcmFtZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfanBlZ2VuY19pbml0IChHc3RKcGVnRW5jICoganBlZ2VuYykKK3sKKyAgR1NUX1BBRF9TRVRfQUNDRVBUX1RFTVBMQVRFIChHU1RfVklERU9fRU5DT0RFUl9TSU5LX1BBRCAoanBlZ2VuYykpOworCisgIC8qIHNldHVwIGpwZWdsaWIgKi8KKyAgbWVtc2V0ICgmanBlZ2VuYy0+Y2luZm8sIDAsIHNpemVvZiAoanBlZ2VuYy0+Y2luZm8pKTsKKyAgbWVtc2V0ICgmanBlZ2VuYy0+amVyciwgMCwgc2l6ZW9mIChqcGVnZW5jLT5qZXJyKSk7CisgIGpwZWdlbmMtPmNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yICgmanBlZ2VuYy0+amVycik7CisgIGpwZWdfY3JlYXRlX2NvbXByZXNzICgmanBlZ2VuYy0+Y2luZm8pOworCisgIGpwZWdlbmMtPmpkZXN0LmluaXRfZGVzdGluYXRpb24gPSBnc3RfanBlZ2VuY19pbml0X2Rlc3RpbmF0aW9uOworICBqcGVnZW5jLT5qZGVzdC5lbXB0eV9vdXRwdXRfYnVmZmVyID0gZ3N0X2pwZWdlbmNfZmx1c2hfZGVzdGluYXRpb247CisgIGpwZWdlbmMtPmpkZXN0LnRlcm1fZGVzdGluYXRpb24gPSBnc3RfanBlZ2VuY190ZXJtX2Rlc3RpbmF0aW9uOworICBqcGVnZW5jLT5jaW5mby5kZXN0ID0gJmpwZWdlbmMtPmpkZXN0OworICBqcGVnZW5jLT5jaW5mby5jbGllbnRfZGF0YSA9IGpwZWdlbmM7CisKKyAgLyogaW5pdCBwcm9wZXJ0aWVzICovCisgIGpwZWdlbmMtPnF1YWxpdHkgPSBKUEVHX0RFRkFVTFRfUVVBTElUWTsKKyAganBlZ2VuYy0+c21vb3RoaW5nID0gSlBFR19ERUZBVUxUX1NNT09USElORzsKKyAganBlZ2VuYy0+aWRjdF9tZXRob2QgPSBKUEVHX0RFRkFVTFRfSURDVF9NRVRIT0Q7CisgIGpwZWdlbmMtPnNuYXBzaG90ID0gSlBFR19ERUZBVUxUX1NOQVBTSE9UOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdlbmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEpwZWdFbmMgKmZpbHRlciA9IEdTVF9KUEVHRU5DIChvYmplY3QpOworCisgIGpwZWdfZGVzdHJveV9jb21wcmVzcyAoJmZpbHRlci0+Y2luZm8pOworCisgIGlmIChmaWx0ZXItPmlucHV0X3N0YXRlKQorICAgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAoZmlsdGVyLT5pbnB1dF9zdGF0ZSk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9qcGVnZW5jX3NldF9mb3JtYXQgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsIEdzdFZpZGVvQ29kZWNTdGF0ZSAqIHN0YXRlKQoreworICBHc3RKcGVnRW5jICplbmMgPSBHU1RfSlBFR0VOQyAoZW5jb2Rlcik7CisgIGdpbnQgaTsKKyAgR3N0VmlkZW9JbmZvICppbmZvID0gJnN0YXRlLT5pbmZvOworCisgIGlmIChlbmMtPmlucHV0X3N0YXRlKQorICAgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAoZW5jLT5pbnB1dF9zdGF0ZSk7CisgIGVuYy0+aW5wdXRfc3RhdGUgPSBnc3RfdmlkZW9fY29kZWNfc3RhdGVfcmVmIChzdGF0ZSk7CisKKyAgLyogcHJlcGFyZSBhIGNhY2hlZCBpbWFnZSBkZXNjcmlwdGlvbiAgKi8KKyAgZW5jLT5jaGFubmVscyA9IEdTVF9WSURFT19JTkZPX05fQ09NUE9ORU5UUyAoaW5mbyk7CisKKyAgLyogLi4uIGJ1dCBhbnkgYWxwaGEgaXMgZGlzcmVnYXJkZWQgaW4gZW5jb2RpbmcgKi8KKyAgaWYgKEdTVF9WSURFT19JTkZPX0lTX0dSQVkgKGluZm8pKQorICAgIGVuYy0+Y2hhbm5lbHMgPSAxOworCisgIGVuYy0+aF9tYXhfc2FtcCA9IDA7CisgIGVuYy0+dl9tYXhfc2FtcCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBlbmMtPmNoYW5uZWxzOyArK2kpIHsKKyAgICBlbmMtPmN3aWR0aFtpXSA9IEdTVF9WSURFT19JTkZPX0NPTVBfV0lEVEggKGluZm8sIGkpOworICAgIGVuYy0+Y2hlaWdodFtpXSA9IEdTVF9WSURFT19JTkZPX0NPTVBfSEVJR0hUIChpbmZvLCBpKTsKKyAgICBlbmMtPmluY1tpXSA9IEdTVF9WSURFT19JTkZPX0NPTVBfUFNUUklERSAoaW5mbywgaSk7CisgICAgZW5jLT5oX3NhbXBbaV0gPQorICAgICAgICBHU1RfUk9VTkRfVVBfNCAoR1NUX1ZJREVPX0lORk9fV0lEVEggKGluZm8pKSAvIGVuYy0+Y3dpZHRoW2ldOworICAgIGVuYy0+aF9tYXhfc2FtcCA9IE1BWCAoZW5jLT5oX21heF9zYW1wLCBlbmMtPmhfc2FtcFtpXSk7CisgICAgZW5jLT52X3NhbXBbaV0gPQorICAgICAgICBHU1RfUk9VTkRfVVBfNCAoR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbmZvKSkgLyBlbmMtPmNoZWlnaHRbaV07CisgICAgZW5jLT52X21heF9zYW1wID0gTUFYIChlbmMtPnZfbWF4X3NhbXAsIGVuYy0+dl9zYW1wW2ldKTsKKyAgfQorICAvKiBzYW1wIHNob3VsZCBvbmx5IGJlIDEsIDIgb3IgNCAqLworICBnX2Fzc2VydCAoZW5jLT5oX21heF9zYW1wIDw9IDQpOworICBnX2Fzc2VydCAoZW5jLT52X21heF9zYW1wIDw9IDQpOworCisgIC8qIG5vdyBpbnZlcnQgKi8KKyAgLyogbWF4aW11bSBpcyBpbnZhcmlhbnQsIGFzIG9uZSBvZiB0aGUgY29tcG9uZW50cyBzaG91bGQgaGF2ZSBzYW1wIDEgKi8KKyAgZm9yIChpID0gMDsgaSA8IGVuYy0+Y2hhbm5lbHM7ICsraSkgeworICAgIEdTVF9ERUJVRyAoIiVkICVkIiwgZW5jLT5oX3NhbXBbaV0sIGVuYy0+aF9tYXhfc2FtcCk7CisgICAgZW5jLT5oX3NhbXBbaV0gPSBlbmMtPmhfbWF4X3NhbXAgLyBlbmMtPmhfc2FtcFtpXTsKKyAgICBlbmMtPnZfc2FtcFtpXSA9IGVuYy0+dl9tYXhfc2FtcCAvIGVuYy0+dl9zYW1wW2ldOworICB9CisgIGVuYy0+cGxhbmFyID0gKGVuYy0+aW5jWzBdID09IDEgJiYgZW5jLT5pbmNbMV0gPT0gMSAmJiBlbmMtPmluY1syXSA9PSAxKTsKKworICBlbmMtPmlucHV0X2NhcHNfY2hhbmdlZCA9IFRSVUU7CisgIGdzdF9qcGVnZW5jX3Jlc3luYyAoZW5jKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9qcGVnZW5jX3Jlc3luYyAoR3N0SnBlZ0VuYyAqIGpwZWdlbmMpCit7CisgIEdzdFZpZGVvSW5mbyAqaW5mbzsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IGksIGo7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoanBlZ2VuYywgInJlc3luYyIpOworCisgIGlmICghanBlZ2VuYy0+aW5wdXRfc3RhdGUpCisgICAgcmV0dXJuOworCisgIGluZm8gPSAmanBlZ2VuYy0+aW5wdXRfc3RhdGUtPmluZm87CisKKyAganBlZ2VuYy0+Y2luZm8uaW1hZ2Vfd2lkdGggPSB3aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIIChpbmZvKTsKKyAganBlZ2VuYy0+Y2luZm8uaW1hZ2VfaGVpZ2h0ID0gaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbmZvKTsKKyAganBlZ2VuYy0+Y2luZm8uaW5wdXRfY29tcG9uZW50cyA9IGpwZWdlbmMtPmNoYW5uZWxzOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGpwZWdlbmMsICJ3aWR0aCAlZCwgaGVpZ2h0ICVkIiwgd2lkdGgsIGhlaWdodCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGpwZWdlbmMsICJmb3JtYXQgJWQiLCBHU1RfVklERU9fSU5GT19GT1JNQVQgKGluZm8pKTsKKworICBpZiAoR1NUX1ZJREVPX0lORk9fSVNfUkdCIChpbmZvKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGpwZWdlbmMsICJSR0IiKTsKKyAgICBqcGVnZW5jLT5jaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7CisgIH0gZWxzZSBpZiAoR1NUX1ZJREVPX0lORk9fSVNfR1JBWSAoaW5mbykpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqcGVnZW5jLCAiZ3JheSIpOworICAgIGpwZWdlbmMtPmNpbmZvLmluX2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqcGVnZW5jLCAiWVVWIik7CisgICAganBlZ2VuYy0+Y2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7CisgIH0KKworICAvKiBpbnB1dCBidWZmZXIgc2l6ZSBhcyBtYXggb3V0cHV0ICovCisgIGpwZWdlbmMtPmJ1ZnNpemUgPSBHU1RfVklERU9fSU5GT19TSVpFIChpbmZvKTsKKyAganBlZ19zZXRfZGVmYXVsdHMgKCZqcGVnZW5jLT5jaW5mbyk7CisgIGpwZWdlbmMtPmNpbmZvLnJhd19kYXRhX2luID0gVFJVRTsKKyAgLyogZHVoLCBsaWJqcGVnIG1hcHMgUkdCIHRvIFlVViAuLi4gYW5kIGRvbid0IGV4cGVjdCBzb21lIGNvbnZlcnNpb24gKi8KKyAgaWYgKGpwZWdlbmMtPmNpbmZvLmluX2NvbG9yX3NwYWNlID09IEpDU19SR0IpCisgICAganBlZ19zZXRfY29sb3JzcGFjZSAoJmpwZWdlbmMtPmNpbmZvLCBKQ1NfUkdCKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChqcGVnZW5jLCAiaF9tYXhfc2FtcD0lZCwgdl9tYXhfc2FtcD0lZCIsCisgICAgICBqcGVnZW5jLT5oX21heF9zYW1wLCBqcGVnZW5jLT52X21heF9zYW1wKTsKKyAgLyogaW1hZ2UgZGltZW5zaW9uIGluZm8gKi8KKyAgZm9yIChpID0gMDsgaSA8IGpwZWdlbmMtPmNoYW5uZWxzOyBpKyspIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqcGVnZW5jLCAiY29tcCAlaTogaF9zYW1wPSVkLCB2X3NhbXA9JWQiLCBpLAorICAgICAgICBqcGVnZW5jLT5oX3NhbXBbaV0sIGpwZWdlbmMtPnZfc2FtcFtpXSk7CisgICAganBlZ2VuYy0+Y2luZm8uY29tcF9pbmZvW2ldLmhfc2FtcF9mYWN0b3IgPSBqcGVnZW5jLT5oX3NhbXBbaV07CisgICAganBlZ2VuYy0+Y2luZm8uY29tcF9pbmZvW2ldLnZfc2FtcF9mYWN0b3IgPSBqcGVnZW5jLT52X3NhbXBbaV07CisgICAgZ19mcmVlIChqcGVnZW5jLT5saW5lW2ldKTsKKyAgICBqcGVnZW5jLT5saW5lW2ldID0gZ19uZXcgKGd1Y2hhciAqLCBqcGVnZW5jLT52X21heF9zYW1wICogRENUU0laRSk7CisgICAgaWYgKCFqcGVnZW5jLT5wbGFuYXIpIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBqcGVnZW5jLT52X21heF9zYW1wICogRENUU0laRTsgaisrKSB7CisgICAgICAgIGdfZnJlZSAoanBlZ2VuYy0+cm93W2ldW2pdKTsKKyAgICAgICAganBlZ2VuYy0+cm93W2ldW2pdID0gZ19tYWxsb2MgKHdpZHRoKTsKKyAgICAgICAganBlZ2VuYy0+bGluZVtpXVtqXSA9IGpwZWdlbmMtPnJvd1tpXVtqXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBndWFyZCBhZ2FpbnN0IGEgcG90ZW50aWFsIGVycm9yIGluIGdzdF9qcGVnZW5jX3Rlcm1fZGVzdGluYXRpb24KKyAgICAgd2hpY2ggb2NjdXJzIGlmZiBidWZzaXplICUgNCA8IGZyZWVfc3BhY2VfcmVtYWluaW5nICovCisgIGpwZWdlbmMtPmJ1ZnNpemUgPSBHU1RfUk9VTkRfVVBfNCAoanBlZ2VuYy0+YnVmc2l6ZSk7CisKKyAganBlZ19zdXBwcmVzc190YWJsZXMgKCZqcGVnZW5jLT5jaW5mbywgVFJVRSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoanBlZ2VuYywgInJlc3luYyBkb25lIik7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfanBlZ2VuY19oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKQoreworICBHc3RKcGVnRW5jICpqcGVnZW5jOworICBndWludCBoZWlnaHQ7CisgIGd1Y2hhciAqYmFzZVszXSwgKmVuZFszXTsKKyAgZ3VpbnQgc3RyaWRlWzNdOworICBnaW50IGksIGosIGs7CisgIHN0YXRpYyBHc3RBbGxvY2F0aW9uUGFyYW1zIHBhcmFtcyA9IHsgMCwgMCwgMCwgMywgfTsKKworICBqcGVnZW5jID0gR1NUX0pQRUdFTkMgKGVuY29kZXIpOworCisgIEdTVF9MT0dfT0JKRUNUIChqcGVnZW5jLCAiZ290IG5ldyBmcmFtZSIpOworCisgIGlmICghZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJmpwZWdlbmMtPmN1cnJlbnRfdmZyYW1lLAorICAgICAgICAgICZqcGVnZW5jLT5pbnB1dF9zdGF0ZS0+aW5mbywgZnJhbWUtPmlucHV0X2J1ZmZlciwgR1NUX01BUF9SRUFEKSkKKyAgICBnb3RvIGludmFsaWRfZnJhbWU7CisKKyAganBlZ2VuYy0+Y3VycmVudF9mcmFtZSA9IGZyYW1lOworCisgIGhlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoJmpwZWdlbmMtPmlucHV0X3N0YXRlLT5pbmZvKTsKKworICBmb3IgKGkgPSAwOyBpIDwganBlZ2VuYy0+Y2hhbm5lbHM7IGkrKykgeworICAgIGJhc2VbaV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBICgmanBlZ2VuYy0+Y3VycmVudF92ZnJhbWUsIGkpOworICAgIHN0cmlkZVtpXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoJmpwZWdlbmMtPmN1cnJlbnRfdmZyYW1lLCBpKTsKKyAgICBlbmRbaV0gPQorICAgICAgICBiYXNlW2ldICsgR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUICgmanBlZ2VuYy0+Y3VycmVudF92ZnJhbWUsCisgICAgICAgIGkpICogc3RyaWRlW2ldOworICB9CisKKyAganBlZ2VuYy0+cmVzID0gR1NUX0ZMT1dfT0s7CisgIGpwZWdlbmMtPm91dHB1dF9tZW0gPSBnc3RfYWxsb2NhdG9yX2FsbG9jIChOVUxMLCBqcGVnZW5jLT5idWZzaXplLCAmcGFyYW1zKTsKKyAgZ3N0X21lbW9yeV9tYXAgKGpwZWdlbmMtPm91dHB1dF9tZW0sICZqcGVnZW5jLT5vdXRwdXRfbWFwLCBHU1RfTUFQX1JFQURXUklURSk7CisKKyAganBlZ2VuYy0+amRlc3QubmV4dF9vdXRwdXRfYnl0ZSA9IGpwZWdlbmMtPm91dHB1dF9tYXAuZGF0YTsKKyAganBlZ2VuYy0+amRlc3QuZnJlZV9pbl9idWZmZXIgPSBqcGVnZW5jLT5vdXRwdXRfbWFwLnNpemU7CisKKyAgLyogcHJlcGFyZSBmb3IgcmF3IGlucHV0ICovCisjaWYgSlBFR19MSUJfVkVSU0lPTiA+PSA3MAorICBqcGVnZW5jLT5jaW5mby5kb19mYW5jeV9kb3duc2FtcGxpbmcgPSBGQUxTRTsKKyNlbmRpZgorCisgIEdTVF9PQkpFQ1RfTE9DSyAoanBlZ2VuYyk7CisgIGpwZWdlbmMtPmNpbmZvLnNtb290aGluZ19mYWN0b3IgPSBqcGVnZW5jLT5zbW9vdGhpbmc7CisgIGpwZWdlbmMtPmNpbmZvLmRjdF9tZXRob2QgPSBqcGVnZW5jLT5pZGN0X21ldGhvZDsKKyAganBlZ19zZXRfcXVhbGl0eSAoJmpwZWdlbmMtPmNpbmZvLCBqcGVnZW5jLT5xdWFsaXR5LCBUUlVFKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGpwZWdlbmMpOworCisgIGpwZWdfc3RhcnRfY29tcHJlc3MgKCZqcGVnZW5jLT5jaW5mbywgVFJVRSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGpwZWdlbmMsICJjb21wcmVzc2luZyIpOworCisgIGlmIChqcGVnZW5jLT5wbGFuYXIpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpICs9IGpwZWdlbmMtPnZfbWF4X3NhbXAgKiBEQ1RTSVpFKSB7CisgICAgICBmb3IgKGsgPSAwOyBrIDwganBlZ2VuYy0+Y2hhbm5lbHM7IGsrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwganBlZ2VuYy0+dl9zYW1wW2tdICogRENUU0laRTsgaisrKSB7CisgICAgICAgICAganBlZ2VuYy0+bGluZVtrXVtqXSA9IGJhc2Vba107CisgICAgICAgICAgaWYgKGJhc2Vba10gKyBzdHJpZGVba10gPCBlbmRba10pCisgICAgICAgICAgICBiYXNlW2tdICs9IHN0cmlkZVtrXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAganBlZ193cml0ZV9yYXdfZGF0YSAoJmpwZWdlbmMtPmNpbmZvLCBqcGVnZW5jLT5saW5lLAorICAgICAgICAgIGpwZWdlbmMtPnZfbWF4X3NhbXAgKiBEQ1RTSVpFKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSArPSBqcGVnZW5jLT52X21heF9zYW1wICogRENUU0laRSkgeworICAgICAgZm9yIChrID0gMDsgayA8IGpwZWdlbmMtPmNoYW5uZWxzOyBrKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGpwZWdlbmMtPnZfc2FtcFtrXSAqIERDVFNJWkU7IGorKykgeworICAgICAgICAgIGd1Y2hhciAqc3JjLCAqZHN0OworICAgICAgICAgIGdpbnQgbDsKKworICAgICAgICAgIC8qIG91Y2gsIGNvcHkgbGluZSAqLworICAgICAgICAgIHNyYyA9IGJhc2Vba107CisgICAgICAgICAgZHN0ID0ganBlZ2VuYy0+bGluZVtrXVtqXTsKKyAgICAgICAgICBmb3IgKGwgPSBqcGVnZW5jLT5jd2lkdGhba107IGwgPiAwOyBsLS0pIHsKKyAgICAgICAgICAgICpkc3QgPSAqc3JjOworICAgICAgICAgICAgc3JjICs9IGpwZWdlbmMtPmluY1trXTsKKyAgICAgICAgICAgIGRzdCsrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoYmFzZVtrXSArIHN0cmlkZVtrXSA8IGVuZFtrXSkKKyAgICAgICAgICAgIGJhc2Vba10gKz0gc3RyaWRlW2tdOworICAgICAgICB9CisgICAgICB9CisgICAgICBqcGVnX3dyaXRlX3Jhd19kYXRhICgmanBlZ2VuYy0+Y2luZm8sIGpwZWdlbmMtPmxpbmUsCisgICAgICAgICAganBlZ2VuYy0+dl9tYXhfc2FtcCAqIERDVFNJWkUpOworICAgIH0KKyAgfQorCisgIC8qIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCBnc3RfanBlZ2VuY190ZXJtX2Rlc3RpbmF0aW9uIGlzIGNhbGxlZCAqLworICBqcGVnX2ZpbmlzaF9jb21wcmVzcyAoJmpwZWdlbmMtPmNpbmZvKTsKKyAgR1NUX0xPR19PQkpFQ1QgKGpwZWdlbmMsICJjb21wcmVzc2luZyBkb25lIik7CisKKyAgcmV0dXJuIChqcGVnZW5jLT5zbmFwc2hvdCkgPyBHU1RfRkxPV19FT1MgOiBqcGVnZW5jLT5yZXM7CisKK2ludmFsaWRfZnJhbWU6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGpwZWdlbmMsICJpbnZhbGlkIGZyYW1lIHJlY2VpdmVkIik7CisgICAgcmV0dXJuIGdzdF92aWRlb19lbmNvZGVyX2ZpbmlzaF9mcmFtZSAoZW5jb2RlciwgZnJhbWUpOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2pwZWdlbmNfcHJvcG9zZV9hbGxvY2F0aW9uIChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnc3RfcXVlcnlfYWRkX2FsbG9jYXRpb25fbWV0YSAocXVlcnksIEdTVF9WSURFT19NRVRBX0FQSV9UWVBFLCBOVUxMKTsKKworICByZXR1cm4gR1NUX1ZJREVPX0VOQ09ERVJfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnByb3Bvc2VfYWxsb2NhdGlvbiAoZW5jb2RlciwKKyAgICAgIHF1ZXJ5KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9qcGVnZW5jX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RKcGVnRW5jICpqcGVnZW5jID0gR1NUX0pQRUdFTkMgKG9iamVjdCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChqcGVnZW5jKTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUVVBTElUWToKKyAgICAgIGpwZWdlbmMtPnF1YWxpdHkgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworI2lmZGVmIEVOQUJMRV9TTU9PVEhJTkcKKyAgICBjYXNlIFBST1BfU01PT1RISU5HOgorICAgICAganBlZ2VuYy0+c21vb3RoaW5nID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgUFJPUF9JRENUX01FVEhPRDoKKyAgICAgIGpwZWdlbmMtPmlkY3RfbWV0aG9kID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NOQVBTSE9UOgorICAgICAganBlZ2VuYy0+c25hcHNob3QgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGpwZWdlbmMpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2pwZWdlbmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEpwZWdFbmMgKmpwZWdlbmMgPSBHU1RfSlBFR0VOQyAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGpwZWdlbmMpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9RVUFMSVRZOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwganBlZ2VuYy0+cXVhbGl0eSk7CisgICAgICBicmVhazsKKyNpZmRlZiBFTkFCTEVfU01PT1RISU5HCisgICAgY2FzZSBQUk9QX1NNT09USElORzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGpwZWdlbmMtPnNtb290aGluZyk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgUFJPUF9JRENUX01FVEhPRDoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBqcGVnZW5jLT5pZGN0X21ldGhvZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU05BUFNIT1Q6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwganBlZ2VuYy0+c25hcHNob3QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChqcGVnZW5jKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfanBlZ2VuY19zdGFydCAoR3N0VmlkZW9FbmNvZGVyICogYmVuYykKK3sKKyAgR3N0SnBlZ0VuYyAqZW5jID0gKEdzdEpwZWdFbmMgKikgYmVuYzsKKworICBlbmMtPmxpbmVbMF0gPSBOVUxMOworICBlbmMtPmxpbmVbMV0gPSBOVUxMOworICBlbmMtPmxpbmVbMl0gPSBOVUxMOworICBlbmMtPnNvZl9tYXJrZXIgPSAtMTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfanBlZ2VuY19zdG9wIChHc3RWaWRlb0VuY29kZXIgKiBiZW5jKQoreworICBHc3RKcGVnRW5jICplbmMgPSAoR3N0SnBlZ0VuYyAqKSBiZW5jOworICBnaW50IGksIGo7CisKKyAgZ19mcmVlIChlbmMtPmxpbmVbMF0pOworICBnX2ZyZWUgKGVuYy0+bGluZVsxXSk7CisgIGdfZnJlZSAoZW5jLT5saW5lWzJdKTsKKyAgZW5jLT5saW5lWzBdID0gTlVMTDsKKyAgZW5jLT5saW5lWzFdID0gTlVMTDsKKyAgZW5jLT5saW5lWzJdID0gTlVMTDsKKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCA0ICogRENUU0laRTsgaisrKSB7CisgICAgICBnX2ZyZWUgKGVuYy0+cm93W2ldW2pdKTsKKyAgICAgIGVuYy0+cm93W2ldW2pdID0gTlVMTDsKKyAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2V4dC9qcGVnL2dzdGpwZWdlbmMuaCBiL2V4dC9qcGVnL2dzdGpwZWdlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjc1Mjk5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2pwZWcvZ3N0anBlZ2VuYy5oCkBAIC0wLDAgKzEsMTAzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgQ29sbGFib3JhIEx0ZC4KKyAqCUF1dGhvciA6IEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9KUEVHRU5DX0hfXworI2RlZmluZSBfX0dTVF9KUEVHRU5DX0hfXworCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZW5jb2Rlci5oPgorLyogdGhpcyBpcyBhIGhhY2sgaGFjayBoYWNrIHRvIGdldCBhcm91bmQganBlZ2xpYiBoZWFkZXIgYnVncy4uLiAqLworI2lmZGVmIEhBVkVfU1RETElCX0gKKyMgdW5kZWYgSEFWRV9TVERMSUJfSAorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxqcGVnbGliLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfSlBFR0VOQyBcCisgIChnc3RfanBlZ2VuY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfSlBFR0VOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0pQRUdFTkMsR3N0SnBlZ0VuYykpCisjZGVmaW5lIEdTVF9KUEVHRU5DX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0pQRUdFTkMsR3N0SnBlZ0VuY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0pQRUdFTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9KUEVHRU5DKSkKKyNkZWZpbmUgR1NUX0lTX0pQRUdFTkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfSlBFR0VOQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RKcGVnRW5jIEdzdEpwZWdFbmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0SnBlZ0VuY0NsYXNzIEdzdEpwZWdFbmNDbGFzczsKKworc3RydWN0IF9Hc3RKcGVnRW5jCit7CisgIEdzdFZpZGVvRW5jb2RlciBlbmNvZGVyOworCisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqaW5wdXRfc3RhdGU7CisgIEdzdFZpZGVvRnJhbWUgY3VycmVudF92ZnJhbWU7CisgIEdzdFZpZGVvQ29kZWNGcmFtZSAqY3VycmVudF9mcmFtZTsKKyAgR3N0Rmxvd1JldHVybiByZXM7CisKKyAgZ2Jvb2xlYW4gaW5wdXRfY2Fwc19jaGFuZ2VkOworCisgIGd1aW50IGNoYW5uZWxzOworCisgIGdpbnQgaW5jW0dTVF9WSURFT19NQVhfQ09NUE9ORU5UU107CisgIGdpbnQgY3dpZHRoW0dTVF9WSURFT19NQVhfQ09NUE9ORU5UU107CisgIGdpbnQgY2hlaWdodFtHU1RfVklERU9fTUFYX0NPTVBPTkVOVFNdOworICBnaW50IGhfc2FtcFtHU1RfVklERU9fTUFYX0NPTVBPTkVOVFNdOworICBnaW50IHZfc2FtcFtHU1RfVklERU9fTUFYX0NPTVBPTkVOVFNdOworICBnaW50IGhfbWF4X3NhbXA7CisgIGdpbnQgdl9tYXhfc2FtcDsKKyAgZ2Jvb2xlYW4gcGxhbmFyOworICBnaW50IHNvZl9tYXJrZXI7CisgIC8qIHRoZSB2aWRlbyBidWZmZXIgKi8KKyAgZ2ludCBidWZzaXplOworICAvKiB0aGUganBlZyBsaW5lIGJ1ZmZlciAqLworICBndWNoYXIgKipsaW5lWzNdOworICAvKiBpbmRpcmVjdCBlbmNvZGluZyBsaW5lIGJ1ZmZlcnMgKi8KKyAgZ3VjaGFyICpyb3dbM11bNCAqIERDVFNJWkVdOworCisgIHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKKyAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7CisgIHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciBqZGVzdDsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIGdpbnQgcXVhbGl0eTsKKyAgZ2ludCBzbW9vdGhpbmc7CisgIGdpbnQgaWRjdF9tZXRob2Q7CisgIGdib29sZWFuIHNuYXBzaG90OworCisgIEdzdE1lbW9yeSAqb3V0cHV0X21lbTsKKyAgR3N0TWFwSW5mbyBvdXRwdXRfbWFwOworfTsKKworc3RydWN0IF9Hc3RKcGVnRW5jQ2xhc3MKK3sKKyAgR3N0VmlkZW9FbmNvZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2pwZWdlbmNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX0pQRUdFTkNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvanBlZy9nc3RzbW9rZWRlYy5jIGIvZXh0L2pwZWcvZ3N0c21va2VkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTZkOTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2pwZWcvZ3N0c21va2VkZWMuYwpAQCAtMCwwICsxLDMzMiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXNtb2tlZGVjCisgKgorICogRGVjb2RlcyBpbWFnZXMgaW4gc21va2UgZm9ybWF0LgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyojZGVmaW5lIERFQlVHX0VOQUJMRUQqLworI2luY2x1ZGUgImdzdHNtb2tlZGVjLmgiCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHNtb2tlZGVjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHNtb2tlZGVjX2RlYnVnCisKKy8qIFNtb2tlRGVjIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgUFJPUF8wCit9OworCitzdGF0aWMgdm9pZCBnc3Rfc21va2VkZWNfYmFzZV9pbml0IChncG9pbnRlciBnX2NsYXNzKTsKK3N0YXRpYyB2b2lkIGdzdF9zbW9rZWRlY19jbGFzc19pbml0IChHc3RTbW9rZURlYyAqIGtsYXNzKTsKK3N0YXRpYyB2b2lkIGdzdF9zbW9rZWRlY19pbml0IChHc3RTbW9rZURlYyAqIHNtb2tlZGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9zbW9rZWRlY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3Ntb2tlZGVjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc21va2VkZWNfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0QnVmZmVyICogYnVmKTsKKworc3RhdGljIEdzdEVsZW1lbnRDbGFzcyAqcGFyZW50X2NsYXNzID0gTlVMTDsKKworLypzdGF0aWMgZ3VpbnQgZ3N0X3Ntb2tlZGVjX3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07ICovCisKK0dUeXBlCitnc3Rfc21va2VkZWNfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBzbW9rZWRlY190eXBlID0gMDsKKworICBpZiAoIXNtb2tlZGVjX3R5cGUpIHsKKyAgICBzdGF0aWMgY29uc3QgR1R5cGVJbmZvIHNtb2tlZGVjX2luZm8gPSB7CisgICAgICBzaXplb2YgKEdzdFNtb2tlRGVjQ2xhc3MpLAorICAgICAgZ3N0X3Ntb2tlZGVjX2Jhc2VfaW5pdCwKKyAgICAgIE5VTEwsCisgICAgICAoR0NsYXNzSW5pdEZ1bmMpIGdzdF9zbW9rZWRlY19jbGFzc19pbml0LAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgICBzaXplb2YgKEdzdFNtb2tlRGVjKSwKKyAgICAgIDAsCisgICAgICAoR0luc3RhbmNlSW5pdEZ1bmMpIGdzdF9zbW9rZWRlY19pbml0LAorICAgIH07CisKKyAgICBzbW9rZWRlY190eXBlID0KKyAgICAgICAgZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoR1NUX1RZUEVfRUxFTUVOVCwgIkdzdFNtb2tlRGVjIiwgJnNtb2tlZGVjX2luZm8sCisgICAgICAgIDApOworICB9CisgIHJldHVybiBzbW9rZWRlY190eXBlOworfQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3Ntb2tlZGVjX3NyY19wYWRfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfWVVWICgiSTQyMCIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3Rfc21va2VkZWNfc2lua19wYWRfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1zbW9rZSwgIgorICAgICAgICAid2lkdGggPSAoaW50KSBbIDE2LCA0MDk2IF0sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIiAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbIDAvMSwgTUFYIF0iKQorICAgICk7CisKK3N0YXRpYyB2b2lkCitnc3Rfc21va2VkZWNfYmFzZV9pbml0IChncG9pbnRlciBnX2NsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoZ19jbGFzcyk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3Ntb2tlZGVjX3NyY19wYWRfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc21va2VkZWNfc2lua19wYWRfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiU21va2UgdmlkZW8gZGVjb2RlciIsCisgICAgICAiQ29kZWMvRGVjb2Rlci9WaWRlbyIsICJEZWNvZGUgdmlkZW8gZnJvbSBTbW9rZSBmb3JtYXQiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc21va2VkZWNfY2xhc3NfaW5pdCAoR3N0U21va2VEZWMgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIHBhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3Ntb2tlZGVjX2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Ntb2tlZGVjX2NoYW5nZV9zdGF0ZSk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHNtb2tlZGVjX2RlYnVnLCAic21va2VkZWMiLCAwLCAiU21va2UgZGVjb2RlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Ntb2tlZGVjX2luaXQgKEdzdFNtb2tlRGVjICogc21va2VkZWMpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNtb2tlZGVjLCAiZ3N0X3Ntb2tlZGVjX2luaXQ6IGluaXRpYWxpemluZyIpOworICAvKiBjcmVhdGUgdGhlIHNpbmsgYW5kIHNyYyBwYWRzICovCisKKyAgc21va2VkZWMtPnNpbmtwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZnc3Rfc21va2VkZWNfc2lua19wYWRfdGVtcGxhdGUsCisgICAgICAic2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoc21va2VkZWMtPnNpbmtwYWQsIGdzdF9zbW9rZWRlY19jaGFpbik7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzbW9rZWRlYyksIHNtb2tlZGVjLT5zaW5rcGFkKTsKKworICBzbW9rZWRlYy0+c3JjcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZ3N0X3Ntb2tlZGVjX3NyY19wYWRfdGVtcGxhdGUsICJzcmMiKTsKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoc21va2VkZWMtPnNyY3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzbW9rZWRlYyksIHNtb2tlZGVjLT5zcmNwYWQpOworCisgIHNtb2tlY29kZWNfZGVjb2RlX25ldyAoJnNtb2tlZGVjLT5pbmZvKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zbW9rZWRlY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0U21va2VEZWMgKmRlYyA9IEdTVF9TTU9LRURFQyAob2JqZWN0KTsKKworICBzbW9rZWNvZGVjX2luZm9fZnJlZSAoZGVjLT5pbmZvKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfc21va2VkZWNfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RTbW9rZURlYyAqc21va2VkZWM7CisgIGd1aW50OCAqZGF0YSwgKm91dGRhdGE7CisgIGd1bG9uZyBzaXplLCBvdXRzaXplOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgU21va2VDb2RlY0ZsYWdzIGZsYWdzOworICBHc3RDbG9ja1RpbWUgdGltZTsKKyAgZ3VpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ3VpbnQgZnBzX251bSwgZnBzX2Rlbm9tOworICBnaW50IHNtb2tlcmV0OworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBzbW9rZWRlYyA9IEdTVF9TTU9LRURFQyAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKworICBkYXRhID0gR1NUX0JVRkZFUl9EQVRBIChidWYpOworICBzaXplID0gR1NUX0JVRkZFUl9TSVpFIChidWYpOworICB0aW1lID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1Zik7CisKKyAgaWYgKHNpemUgPCAxKQorICAgIGdvdG8gdG9vX3NtYWxsOworCisgIEdTVF9MT0dfT0JKRUNUIChzbW9rZWRlYywgImdvdCBidWZmZXIgb2YgJWx1IGJ5dGVzIiwgc2l6ZSk7CisKKyAgLyogaGF2ZSB0aGUgSUQgcGFja2V0LiAqLworICBpZiAoZGF0YVswXSA9PSBTTU9LRUNPREVDX1RZUEVfSUQpIHsKKyAgICBzbW9rZXJldCA9IHNtb2tlY29kZWNfcGFyc2VfaWQgKHNtb2tlZGVjLT5pbmZvLCBkYXRhLCBzaXplKTsKKyAgICBpZiAoc21va2VyZXQgIT0gU01PS0VDT0RFQ19PSykKKyAgICAgIGdvdG8gaGVhZGVyX2Vycm9yOworCisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBkb25lOworICB9CisKKyAgLyogbm93IGhhbmRsZSBkYXRhIHBhY2tldHMgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoc21va2VkZWMsICJyZWFkaW5nIGhlYWRlciAlMDhseCIsICooZ3Vsb25nICopIGRhdGEpOworICBzbW9rZWNvZGVjX3BhcnNlX2hlYWRlciAoc21va2VkZWMtPmluZm8sIGRhdGEsIHNpemUsICZmbGFncywgJndpZHRoLCAmaGVpZ2h0LAorICAgICAgJmZwc19udW0sICZmcHNfZGVub20pOworCisgIGlmIChzbW9rZWRlYy0+aGVpZ2h0ICE9IGhlaWdodCB8fCBzbW9rZWRlYy0+d2lkdGggIT0gd2lkdGggfHwKKyAgICAgIHNtb2tlZGVjLT5mcHNfbnVtICE9IGZwc19udW0gfHwgc21va2VkZWMtPmZwc19kZW5vbSAhPSBmcHNfZGVub20pIHsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc21va2VkZWMsICJwYXJhbWV0ZXIgY2hhbmdlOiAlZHglZCBAICVkLyVkZnBzIiwKKyAgICAgICAgd2lkdGgsIGhlaWdodCwgZnBzX251bSwgZnBzX2Rlbm9tKTsKKworICAgIHNtb2tlZGVjLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgc21va2VkZWMtPndpZHRoID0gd2lkdGg7CisKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcmF3LXl1diIsCisgICAgICAgICJmb3JtYXQiLCBHU1RfVFlQRV9GT1VSQ0MsIEdTVF9NQUtFX0ZPVVJDQyAoJ0knLCAnNCcsICcyJywgJzAnKSwKKyAgICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgd2lkdGgsCisgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBoZWlnaHQsCisgICAgICAgICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwgZnBzX251bSwgZnBzX2Rlbm9tLCBOVUxMKTsKKworICAgIGdzdF9wYWRfc2V0X2NhcHMgKHNtb2tlZGVjLT5zcmNwYWQsIGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgfQorCisgIGlmIChzbW9rZWRlYy0+bmVlZF9rZXlmcmFtZSkgeworICAgIGlmICghKGZsYWdzICYgU01PS0VDT0RFQ19LRVlGUkFNRSkpCisgICAgICBnb3RvIGtleWZyYW1lX3NraXA7CisKKyAgICBzbW9rZWRlYy0+bmVlZF9rZXlmcmFtZSA9IEZBTFNFOworICB9CisKKyAgb3V0c2l6ZSA9IHdpZHRoICogaGVpZ2h0ICsgd2lkdGggKiBoZWlnaHQgLyAyOworICBvdXRidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG91dHNpemUpOworICBvdXRkYXRhID0gR1NUX0JVRkZFUl9EQVRBIChvdXRidWYpOworCisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPQorICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoR1NUX1NFQ09ORCwgZnBzX2Rlbm9tLCBmcHNfbnVtKTsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKTsKKyAgZ3N0X2J1ZmZlcl9zZXRfY2FwcyAob3V0YnVmLCBHU1RfUEFEX0NBUFMgKHNtb2tlZGVjLT5zcmNwYWQpKTsKKworICBpZiAodGltZSA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgaWYgKEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpID09IC0xKSB7CisgICAgICB0aW1lID0gc21va2VkZWMtPm5leHRfdGltZTsKKyAgICB9IGVsc2UgeworICAgICAgdGltZSA9IEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpICogR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKTsKKyAgICB9CisgIH0KKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSB0aW1lOworICBpZiAodGltZSAhPSAtMSkKKyAgICBzbW9rZWRlYy0+bmV4dF90aW1lID0gdGltZSArIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1Zik7CisgIGVsc2UKKyAgICBzbW9rZWRlYy0+bmV4dF90aW1lID0gLTE7CisKKyAgc21va2VyZXQgPSBzbW9rZWNvZGVjX2RlY29kZSAoc21va2VkZWMtPmluZm8sIGRhdGEsIHNpemUsIG91dGRhdGEpOworICBpZiAoc21va2VyZXQgIT0gU01PS0VDT0RFQ19PSykKKyAgICBnb3RvIGRlY29kZV9lcnJvcjsKKworICBHU1RfREVCVUdfT0JKRUNUIChzbW9rZWRlYywgImdzdF9zbW9rZWRlY19jaGFpbjogc2VuZGluZyBidWZmZXIiKTsKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChzbW9rZWRlYy0+c3JjcGFkLCBvdXRidWYpOworCitkb25lOgorICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICBnc3Rfb2JqZWN0X3VucmVmIChzbW9rZWRlYyk7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzbW9rZWRlYywgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJJbnB1dCBidWZmZXIgdG9vIHNtYWxsIikpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZG9uZTsKKyAgfQoraGVhZGVyX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNtb2tlZGVjLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkNvdWxkIG5vdCBwYXJzZSBzbW9rZSBoZWFkZXIsIHJlYXNvbjogJWQiLCBzbW9rZXJldCkpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZG9uZTsKKyAgfQora2V5ZnJhbWVfc2tpcDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNtb2tlZGVjLCAiZHJvcHBpbmcgYnVmZmVyIHdoaWxlIHdhaXRpbmcgZm9yIGtleWZyYW1lIik7CisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBkb25lOworICB9CitkZWNvZGVfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc21va2VkZWMsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiQ291bGQgbm90IGRlY29kZSBzbW9rZSBmcmFtZSwgcmVhc29uOiAlZCIsIHNtb2tlcmV0KSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBkb25lOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3Ntb2tlZGVjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0U21va2VEZWMgKmRlYzsKKworICBkZWMgPSBHU1RfU01PS0VERUMgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICAvKiByZXNldCB0aGUgaW5pdGlhbCB2aWRlbyBzdGF0ZSAqLworICAgICAgZGVjLT5mb3JtYXQgPSAtMTsKKyAgICAgIGRlYy0+d2lkdGggPSAtMTsKKyAgICAgIGRlYy0+aGVpZ2h0ID0gLTE7CisgICAgICBkZWMtPmZwc19udW0gPSAtMTsKKyAgICAgIGRlYy0+ZnBzX2Rlbm9tID0gLTE7CisgICAgICBkZWMtPm5leHRfdGltZSA9IDA7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisgIGlmIChyZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKQorICAgIHJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9leHQvanBlZy9nc3RzbW9rZWRlYy5oIGIvZXh0L2pwZWcvZ3N0c21va2VkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzE5MDc3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2pwZWcvZ3N0c21va2VkZWMuaApAQCAtMCwwICsxLDc1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1NNT0tFREVDX0hfXworI2RlZmluZSBfX0dTVF9TTU9LRURFQ19IX18KKworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgInNtb2tlY29kZWMuaCIKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1NNT0tFREVDIFwKKyAgKGdzdF9zbW9rZWRlY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfU01PS0VERUMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9TTU9LRURFQyxHc3RTbW9rZURlYykpCisjZGVmaW5lIEdTVF9TTU9LRURFQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9TTU9LRURFQyxHc3RTbW9rZURlY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1NNT0tFREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfU01PS0VERUMpKQorI2RlZmluZSBHU1RfSVNfU01PS0VERUNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfU01PS0VERUMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0U21va2VEZWMgR3N0U21va2VEZWM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0U21va2VEZWNDbGFzcyBHc3RTbW9rZURlY0NsYXNzOworCitzdHJ1Y3QgX0dzdFNtb2tlRGVjIHsKKyAgR3N0RWxlbWVudCBlbGVtZW50OworCisgIC8qIHBhZHMgKi8KKyAgR3N0UGFkICpzaW5rcGFkLCpzcmNwYWQ7CisKKyAgLyogdmlkZW8gc3RhdGUgKi8KKyAgZ2ludCBmb3JtYXQ7CisgIGdpbnQgd2lkdGg7CisgIGdpbnQgaGVpZ2h0OworICBnaW50IGZwc19udW07CisgIGdpbnQgZnBzX2Rlbm9tOworICBHc3RDbG9ja1RpbWUgbmV4dF90aW1lOworCisgIFNtb2tlQ29kZWNJbmZvICppbmZvOworCisgIGdpbnQgdGhyZXNob2xkOworICBnaW50IHF1YWxpdHk7CisgIGdpbnQgc21vb3RoaW5nOworCisgIGdib29sZWFuIG5lZWRfa2V5ZnJhbWU7Cit9OworCitzdHJ1Y3QgX0dzdFNtb2tlRGVjQ2xhc3MgeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3Ntb2tlZGVjX2dldF90eXBlKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfU01PS0VERUNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvanBlZy9nc3RzbW9rZWVuYy5jIGIvZXh0L2pwZWcvZ3N0c21va2VlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmIwNjg3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2pwZWcvZ3N0c21va2VlbmMuYwpAQCAtMCwwICsxLDUwOSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1zbW9rZWVuYworICoKKyAqIEVuY29kZXMgaW1hZ2VzIGluIHNtb2tlIGZvcm1hdC4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RzbW9rZWVuYy5oIgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChzbW9rZWVuY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBzbW9rZWVuY19kZWJ1ZworCisKKy8qIFNtb2tlRW5jIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgRlJBTUVfRU5DT0RFRCwKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworI2RlZmluZSBERUZBVUxUX1BST1BfTUlOX1FVQUxJVFkgMTAKKyNkZWZpbmUgREVGQVVMVF9QUk9QX01BWF9RVUFMSVRZIDg1CisjZGVmaW5lIERFRkFVTFRfUFJPUF9USFJFU0hPTEQgMzAwMAorI2RlZmluZSBERUZBVUxUX1BST1BfS0VZRlJBTUUgMjAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTUlOX1FVQUxJVFksCisgIFBST1BfTUFYX1FVQUxJVFksCisgIFBST1BfVEhSRVNIT0xELAorICBQUk9QX0tFWUZSQU1FCisgICAgICAvKiBGSUxMIE1FICovCit9OworCitzdGF0aWMgdm9pZCBnc3Rfc21va2VlbmNfYmFzZV9pbml0IChncG9pbnRlciBnX2NsYXNzKTsKK3N0YXRpYyB2b2lkIGdzdF9zbW9rZWVuY19jbGFzc19pbml0IChHc3RTbW9rZUVuYyAqIGtsYXNzKTsKK3N0YXRpYyB2b2lkIGdzdF9zbW9rZWVuY19pbml0IChHc3RTbW9rZUVuYyAqIHNtb2tlZW5jKTsKK3N0YXRpYyB2b2lkIGdzdF9zbW9rZWVuY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3Ntb2tlZW5jX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc21va2VlbmNfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBHc3RDYXBzICpnc3Rfc21va2VlbmNfZ2V0Y2FwcyAoR3N0UGFkICogcGFkKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc21va2VlbmNfc2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RDYXBzICogY2Fwcyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc21va2VlbmNfcmVzeW5jIChHc3RTbW9rZUVuYyAqIHNtb2tlZW5jKTsKK3N0YXRpYyB2b2lkIGdzdF9zbW9rZWVuY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfc21va2VlbmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0RWxlbWVudENsYXNzICpwYXJlbnRfY2xhc3MgPSBOVUxMOworCitHVHlwZQorZ3N0X3Ntb2tlZW5jX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgc21va2VlbmNfdHlwZSA9IDA7CisKKyAgaWYgKCFzbW9rZWVuY190eXBlKSB7CisgICAgc3RhdGljIGNvbnN0IEdUeXBlSW5mbyBzbW9rZWVuY19pbmZvID0geworICAgICAgc2l6ZW9mIChHc3RTbW9rZUVuY0NsYXNzKSwKKyAgICAgIChHQmFzZUluaXRGdW5jKSBnc3Rfc21va2VlbmNfYmFzZV9pbml0LAorICAgICAgTlVMTCwKKyAgICAgIChHQ2xhc3NJbml0RnVuYykgZ3N0X3Ntb2tlZW5jX2NsYXNzX2luaXQsCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICAgIHNpemVvZiAoR3N0U21va2VFbmMpLAorICAgICAgMCwKKyAgICAgIChHSW5zdGFuY2VJbml0RnVuYykgZ3N0X3Ntb2tlZW5jX2luaXQsCisgICAgfTsKKworICAgIHNtb2tlZW5jX3R5cGUgPQorICAgICAgICBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChHU1RfVFlQRV9FTEVNRU5ULCAiR3N0U21va2VFbmMiLCAmc21va2VlbmNfaW5mbywKKyAgICAgICAgMCk7CisgIH0KKyAgcmV0dXJuIHNtb2tlZW5jX3R5cGU7Cit9CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3Rfc21va2VlbmNfc2lua19wYWRfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19ZVVYgKCJJNDIwIikpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9zbW9rZWVuY19zcmNfcGFkX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXNtb2tlLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgWyAxNiwgNDA5NiBdLCAiICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMC8xLCBNQVggXSIpCisgICAgKTsKKworc3RhdGljIHZvaWQKK2dzdF9zbW9rZWVuY19iYXNlX2luaXQgKGdwb2ludGVyIGdfY2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChnX2NsYXNzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc21va2VlbmNfc2lua19wYWRfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc21va2VlbmNfc3JjX3BhZF90ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJTbW9rZSB2aWRlbyBlbmNvZGVyIiwKKyAgICAgICJDb2RlYy9FbmNvZGVyL1ZpZGVvIiwgIkVuY29kZSBpbWFnZXMgaW50byB0aGUgU21va2UgZm9ybWF0IiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Ntb2tlZW5jX2NsYXNzX2luaXQgKEdzdFNtb2tlRW5jICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBwYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9zbW9rZWVuY19maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3Ntb2tlZW5jX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3Ntb2tlZW5jX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01JTl9RVUFMSVRZLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInFtaW4iLCAiUW1pbiIsICJNaW5pbXVtIHF1YWxpdHkiLAorICAgICAgICAgIDAsIDEwMCwgREVGQVVMVF9QUk9QX01JTl9RVUFMSVRZLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01BWF9RVUFMSVRZLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInFtYXgiLCAiUW1heCIsICJNYXhpbXVtIHF1YWxpdHkiLAorICAgICAgICAgIDAsIDEwMCwgREVGQVVMVF9QUk9QX01BWF9RVUFMSVRZLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RIUkVTSE9MRCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0aHJlc2hvbGQiLCAiVGhyZXNob2xkIiwgIk1vdGlvbiBlc3RpbWF0aW9uIHRocmVzaG9sZCIsCisgICAgICAgICAgMCwgMTAwMDAwMDAwLCBERUZBVUxUX1BST1BfVEhSRVNIT0xELAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0tFWUZSQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImtleWZyYW1lIiwgIktleWZyYW1lIiwKKyAgICAgICAgICAiSW5zZXJ0IGtleWZyYW1lIGV2ZXJ5IE4gZnJhbWVzIiwgMSwgMTAwMDAwLAorICAgICAgICAgIERFRkFVTFRfUFJPUF9LRVlGUkFNRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc21va2VlbmNfY2hhbmdlX3N0YXRlKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoc21va2VlbmNfZGVidWcsICJzbW9rZWVuYyIsIDAsCisgICAgICAiU21va2UgZW5jb2RpbmcgZWxlbWVudCIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Ntb2tlZW5jX2luaXQgKEdzdFNtb2tlRW5jICogc21va2VlbmMpCit7CisgIC8qIGNyZWF0ZSB0aGUgc2luayBhbmQgc3JjIHBhZHMgKi8KKyAgc21va2VlbmMtPnNpbmtwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZnc3Rfc21va2VlbmNfc2lua19wYWRfdGVtcGxhdGUsCisgICAgICAic2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoc21va2VlbmMtPnNpbmtwYWQsIGdzdF9zbW9rZWVuY19jaGFpbik7CisgIGdzdF9wYWRfc2V0X2dldGNhcHNfZnVuY3Rpb24gKHNtb2tlZW5jLT5zaW5rcGFkLCBnc3Rfc21va2VlbmNfZ2V0Y2Fwcyk7CisgIGdzdF9wYWRfc2V0X3NldGNhcHNfZnVuY3Rpb24gKHNtb2tlZW5jLT5zaW5rcGFkLCBnc3Rfc21va2VlbmNfc2V0Y2Fwcyk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzbW9rZWVuYyksIHNtb2tlZW5jLT5zaW5rcGFkKTsKKworICBzbW9rZWVuYy0+c3JjcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZ3N0X3Ntb2tlZW5jX3NyY19wYWRfdGVtcGxhdGUsICJzcmMiKTsKKyAgZ3N0X3BhZF9zZXRfZ2V0Y2Fwc19mdW5jdGlvbiAoc21va2VlbmMtPnNyY3BhZCwgZ3N0X3Ntb2tlZW5jX2dldGNhcHMpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChzbW9rZWVuYy0+c3JjcGFkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHNtb2tlZW5jKSwgc21va2VlbmMtPnNyY3BhZCk7CisKKyAgc21va2VlbmMtPm1pbl9xdWFsaXR5ID0gREVGQVVMVF9QUk9QX01JTl9RVUFMSVRZOworICBzbW9rZWVuYy0+bWF4X3F1YWxpdHkgPSBERUZBVUxUX1BST1BfTUFYX1FVQUxJVFk7CisgIHNtb2tlZW5jLT50aHJlc2hvbGQgPSBERUZBVUxUX1BST1BfVEhSRVNIT0xEOworICBzbW9rZWVuYy0+a2V5ZnJhbWUgPSBERUZBVUxUX1BST1BfS0VZRlJBTUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc21va2VlbmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFNtb2tlRW5jICplbmMgPSBHU1RfU01PS0VFTkMgKG9iamVjdCk7CisKKyAgaWYgKGVuYy0+aW5mbykKKyAgICBzbW9rZWNvZGVjX2luZm9fZnJlZSAoZW5jLT5pbmZvKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9zbW9rZWVuY19nZXRjYXBzIChHc3RQYWQgKiBwYWQpCit7CisgIEdzdFNtb2tlRW5jICpzbW9rZWVuYyA9IEdTVF9TTU9LRUVOQyAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKyAgR3N0UGFkICpvdGhlcnBhZDsKKyAgR3N0Q2FwcyAqcmVzdWx0LCAqY2FwczsKKyAgY29uc3QgR3N0Q2FwcyAqdGNhcHM7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGludCBpOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSA9IE5VTEw7CisKKyAgLyogd2Ugd2FudCB0byBwcm94eSBwcm9wZXJ0aWVzIGxpa2Ugd2lkdGgsIGhlaWdodCBhbmQgZnJhbWVyYXRlIGZyb20gdGhlCisgICAgIG90aGVyIGVuZCBvZiB0aGUgZWxlbWVudCAqLworICBvdGhlcnBhZCA9IChwYWQgPT0gc21va2VlbmMtPnNyY3BhZCkgPyBzbW9rZWVuYy0+c2lua3BhZCA6IHNtb2tlZW5jLT5zcmNwYWQ7CisKKyAgLyogZ2V0IHRlbXBsYXRlIGNhcHMsIHdlIGFsd2F5cyBuZWVkIHRoaXMgdG8gZml0ZXIgdGhlIHBlZXIgY2FwcyAqLworICB0Y2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChvdGhlcnBhZCk7CisKKyAgLyogZ2V0IGFueSBjb25zdHJhaW50cyBvbiB0aGUgcGVlciBwYWQgKi8KKyAgY2FwcyA9IGdzdF9wYWRfcGVlcl9nZXRfY2FwcyAob3RoZXJwYWQpOworCisgIGlmIChjYXBzID09IE5VTEwpCisgICAgY2FwcyA9IGdzdF9jYXBzX2NvcHkgKHRjYXBzKTsKKyAgZWxzZQorICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKworICAvKiBpbnRlcnNlY3Qgd2l0aCB0aGUgdGVtcGxhdGUgKi8KKyAgcmVzdWx0ID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChjYXBzLCB0Y2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBpZiAocGFkID09IHNtb2tlZW5jLT5zcmNwYWQpIHsKKyAgICBuYW1lID0gInZpZGVvL3gtc21va2UiOworICB9IGVsc2UgeworICAgIG5hbWUgPSAidmlkZW8veC1yYXcteXV2IjsKKyAgfQorCisgIC8qIHdlIGNhbiBvbmx5IGNvcHkgd2lkdGgsIGhlaWdodCwgZnJhbWVyYXRlIGZyb20gb25lIHNpZGUgdG8gdGhlIG90aGVyICovCisgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAocmVzdWx0KTsgaSsrKSB7CisgICAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAocmVzdWx0LCBpKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgbmFtZSk7CisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHN0cnVjdHVyZSwgImZvcm1hdCIpOworICAgIC8qIC4uLiBidXQgZm9yIHRoZSBzaW5rIHBhZCwgd2Ugb25seSBkbyBJNDIwIGFueXdheSwgc28gYWRkIHRoYXQgKi8KKyAgICBpZiAocGFkID09IHNtb2tlZW5jLT5zaW5rcGFkKSB7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLCAiZm9ybWF0IiwgR1NUX1RZUEVfRk9VUkNDLAorICAgICAgICAgIEdTVF9TVFJfRk9VUkNDICgiSTQyMCIpLCBOVUxMKTsKKyAgICB9CisgIH0KKworICBnc3Rfb2JqZWN0X3VucmVmIChzbW9rZWVuYyk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc21va2VlbmNfc2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U21va2VFbmMgKnNtb2tlZW5jOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgY29uc3QgR1ZhbHVlICpmcmFtZXJhdGU7CisgIGdib29sZWFuIHJldDsKKyAgR3N0Q2FwcyAqc3JjY2FwczsKKworICBzbW9rZWVuYyA9IEdTVF9TTU9LRUVOQyAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgZnJhbWVyYXRlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImZyYW1lcmF0ZSIpOworICBpZiAoZnJhbWVyYXRlKSB7CisgICAgc21va2VlbmMtPmZwc19udW0gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAoZnJhbWVyYXRlKTsKKyAgICBzbW9rZWVuYy0+ZnBzX2Rlbm9tID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9kZW5vbWluYXRvciAoZnJhbWVyYXRlKTsKKyAgfSBlbHNlIHsKKyAgICBzbW9rZWVuYy0+ZnBzX251bSA9IDA7CisgICAgc21va2VlbmMtPmZwc19kZW5vbSA9IDE7CisgIH0KKworICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIndpZHRoIiwgJnNtb2tlZW5jLT53aWR0aCk7CisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiaGVpZ2h0IiwgJnNtb2tlZW5jLT5oZWlnaHQpOworCisgIGlmICgoc21va2VlbmMtPndpZHRoICYgMHgwZikgIT0gMCB8fCAoc21va2VlbmMtPmhlaWdodCAmIDB4MGYpICE9IDApCisgICAgZ290byB3aWR0aF9vcl9oZWlnaHRfbm90eDE2OworCisgIGlmICghZ3N0X3Ntb2tlZW5jX3Jlc3luYyAoc21va2VlbmMpKQorICAgIGdvdG8gaW5pdF9mYWlsZWQ7CisKKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LXNtb2tlIiwKKyAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHNtb2tlZW5jLT53aWR0aCwKKyAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBzbW9rZWVuYy0+aGVpZ2h0LAorICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLCBzbW9rZWVuYy0+ZnBzX251bSwgc21va2VlbmMtPmZwc19kZW5vbSwKKyAgICAgIE5VTEwpOworCisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKHNtb2tlZW5jLT5zcmNwYWQsIHNyY2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoc21va2VlbmMpOworCisgIHJldHVybiByZXQ7CisKK3dpZHRoX29yX2hlaWdodF9ub3R4MTY6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNtb2tlZW5jLCAid2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIG11bHRpcGxlcyBvZiAxNiIKKyAgICAgICAgIiwgJWR4JWQgbm90IGFsbG93ZWQiLCBzbW9rZWVuYy0+d2lkdGgsIHNtb2tlZW5jLT5oZWlnaHQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNtb2tlZW5jKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2luaXRfZmFpbGVkOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzbW9rZWVuYywgImNvdWxkIG5vdCBpbml0IGRlY29kZXIiKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzbW9rZWVuYyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Ntb2tlZW5jX3Jlc3luYyAoR3N0U21va2VFbmMgKiBzbW9rZWVuYykKK3sKKyAgaW50IHJldDsKKworICBHU1RfREVCVUcgKCJyZXN5bmM6ICVkeCVkQCVkLyVkZnBzIiwgc21va2VlbmMtPndpZHRoLCBzbW9rZWVuYy0+aGVpZ2h0LAorICAgICAgc21va2VlbmMtPmZwc19udW0sIHNtb2tlZW5jLT5mcHNfZGVub20pOworCisgIGlmIChzbW9rZWVuYy0+aW5mbykKKyAgICBzbW9rZWNvZGVjX2luZm9fZnJlZSAoc21va2VlbmMtPmluZm8pOworCisgIHJldCA9IHNtb2tlY29kZWNfZW5jb2RlX25ldyAoJnNtb2tlZW5jLT5pbmZvLCBzbW9rZWVuYy0+d2lkdGgsCisgICAgICBzbW9rZWVuYy0+aGVpZ2h0LCBzbW9rZWVuYy0+ZnBzX251bSwgc21va2VlbmMtPmZwc19kZW5vbSk7CisKKyAgaWYgKHJldCAhPSBTTU9LRUNPREVDX09LKQorICAgIGdvdG8gaW5pdF9mYWlsZWQ7CisKKyAgc21va2Vjb2RlY19zZXRfcXVhbGl0eSAoc21va2VlbmMtPmluZm8sIHNtb2tlZW5jLT5taW5fcXVhbGl0eSwKKyAgICAgIHNtb2tlZW5jLT5tYXhfcXVhbGl0eSk7CisKKyAgR1NUX0RFQlVHICgicmVzeW5jIGRvbmUiKTsKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitpbml0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc21va2VlbmMsICJzbW9rZWNvZGVjX2VuY29kZV9uZXcoKSBmYWlsZWQ6ICVkIiwgcmV0KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9zbW9rZWVuY19jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFNtb2tlRW5jICpzbW9rZWVuYzsKKyAgZ3VjaGFyICpkYXRhLCAqb3V0ZGF0YTsKKyAgZ3Vsb25nIHNpemU7CisgIGdpbnQgb3V0c2l6ZTsKKyAgZ3VpbnQgZW5jc2l6ZTsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIFNtb2tlQ29kZWNGbGFncyBmbGFnczsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgc21va2VlbmMgPSBHU1RfU01PS0VFTkMgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYWQpKTsKKworICBkYXRhID0gR1NUX0JVRkZFUl9EQVRBIChidWYpOworICBzaXplID0gR1NUX0JVRkZFUl9TSVpFIChidWYpOworCisgIEdTVF9MT0dfT0JKRUNUIChzbW9rZWVuYywgImdvdCBidWZmZXIgb2YgJWx1IGJ5dGVzIiwgc2l6ZSk7CisKKyAgaWYgKHNtb2tlZW5jLT5uZWVkX2hlYWRlcikgeworICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMjU2KTsKKyAgICBvdXRkYXRhID0gR1NUX0JVRkZFUl9EQVRBIChvdXRidWYpOworCisgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKTsKKworICAgIHNtb2tlY29kZWNfZW5jb2RlX2lkIChzbW9rZWVuYy0+aW5mbywgb3V0ZGF0YSwgJmVuY3NpemUpOworCisgICAgR1NUX0JVRkZFUl9TSVpFIChvdXRidWYpID0gZW5jc2l6ZTsKKyAgICBnc3RfYnVmZmVyX3NldF9jYXBzIChvdXRidWYsIEdTVF9QQURfQ0FQUyAoc21va2VlbmMtPnNyY3BhZCkpOworCisgICAgcmV0ID0gZ3N0X3BhZF9wdXNoIChzbW9rZWVuYy0+c3JjcGFkLCBvdXRidWYpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIGRvbmU7CisKKyAgICBzbW9rZWVuYy0+bmVlZF9oZWFkZXIgPSBGQUxTRTsKKyAgfQorCisgIGVuY3NpemUgPSBvdXRzaXplID0gc21va2VlbmMtPndpZHRoICogc21va2VlbmMtPmhlaWdodCAqIDM7CisgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAob3V0c2l6ZSk7CisgIG91dGRhdGEgPSBHU1RfQlVGRkVSX0RBVEEgKG91dGJ1Zik7CisKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9CisgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChHU1RfU0VDT05ELCBzbW9rZWVuYy0+ZnBzX2Rlbm9tLAorICAgICAgc21va2VlbmMtPmZwc19udW0pOworICBnc3RfYnVmZmVyX3NldF9jYXBzIChvdXRidWYsIEdTVF9QQURfQ0FQUyAoc21va2VlbmMtPnNyY3BhZCkpOworCisgIGZsYWdzID0gMDsKKyAgaWYgKChzbW9rZWVuYy0+ZnJhbWUgJSBzbW9rZWVuYy0+a2V5ZnJhbWUpID09IDApIHsKKyAgICBmbGFncyB8PSBTTU9LRUNPREVDX0tFWUZSQU1FOworICB9CisgIHNtb2tlY29kZWNfc2V0X3F1YWxpdHkgKHNtb2tlZW5jLT5pbmZvLCBzbW9rZWVuYy0+bWluX3F1YWxpdHksCisgICAgICBzbW9rZWVuYy0+bWF4X3F1YWxpdHkpOworICBzbW9rZWNvZGVjX3NldF90aHJlc2hvbGQgKHNtb2tlZW5jLT5pbmZvLCBzbW9rZWVuYy0+dGhyZXNob2xkKTsKKyAgc21va2Vjb2RlY19lbmNvZGUgKHNtb2tlZW5jLT5pbmZvLCBkYXRhLCBmbGFncywgb3V0ZGF0YSwgJmVuY3NpemUpOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIEdTVF9CVUZGRVJfU0laRSAob3V0YnVmKSA9IGVuY3NpemU7CisgIEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpID0gc21va2VlbmMtPmZyYW1lOworICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKG91dGJ1ZikgPSBzbW9rZWVuYy0+ZnJhbWUgKyAxOworCisgIHJldCA9IGdzdF9wYWRfcHVzaCAoc21va2VlbmMtPnNyY3BhZCwgb3V0YnVmKTsKKworICBzbW9rZWVuYy0+ZnJhbWUrKzsKKworZG9uZToKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Ntb2tlZW5jX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTbW9rZUVuYyAqc21va2VlbmM7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1NNT0tFRU5DIChvYmplY3QpKTsKKyAgc21va2VlbmMgPSBHU1RfU01PS0VFTkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01JTl9RVUFMSVRZOgorICAgICAgc21va2VlbmMtPm1pbl9xdWFsaXR5ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX1FVQUxJVFk6CisgICAgICBzbW9rZWVuYy0+bWF4X3F1YWxpdHkgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJFU0hPTEQ6CisgICAgICBzbW9rZWVuYy0+dGhyZXNob2xkID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfS0VZRlJBTUU6CisgICAgICBzbW9rZWVuYy0+a2V5ZnJhbWUgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3Ntb2tlZW5jX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTbW9rZUVuYyAqc21va2VlbmM7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1NNT0tFRU5DIChvYmplY3QpKTsKKyAgc21va2VlbmMgPSBHU1RfU01PS0VFTkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01JTl9RVUFMSVRZOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgc21va2VlbmMtPm1pbl9xdWFsaXR5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfUVVBTElUWToKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHNtb2tlZW5jLT5tYXhfcXVhbGl0eSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSRVNIT0xEOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgc21va2VlbmMtPnRocmVzaG9sZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfS0VZRlJBTUU6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBzbW9rZWVuYy0+a2V5ZnJhbWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9zbW9rZWVuY19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdFNtb2tlRW5jICplbmM7CisKKyAgZW5jID0gR1NUX1NNT0tFRU5DIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgLyogcmVzZXQgdGhlIGluaXRpYWwgdmlkZW8gc3RhdGUgKi8KKyAgICAgIGVuYy0+d2lkdGggPSAwOworICAgICAgZW5jLT5oZWlnaHQgPSAwOworICAgICAgZW5jLT5mcmFtZSA9IDA7CisgICAgICBlbmMtPm5lZWRfaGVhZGVyID0gVFJVRTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKyAgaWYgKHJldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpCisgICAgcmV0dXJuIHJldDsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2V4dC9qcGVnL2dzdHNtb2tlZW5jLmggYi9leHQvanBlZy9nc3RzbW9rZWVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxM2IyOGMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvanBlZy9nc3RzbW9rZWVuYy5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfU01PS0VFTkNfSF9fCisjZGVmaW5lIF9fR1NUX1NNT0tFRU5DX0hfXworCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAic21va2Vjb2RlYy5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfU01PS0VFTkMgXAorICAoZ3N0X3Ntb2tlZW5jX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9TTU9LRUVOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1NNT0tFRU5DLEdzdFNtb2tlRW5jKSkKKyNkZWZpbmUgR1NUX1NNT0tFRU5DX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1NNT0tFRU5DLEdzdFNtb2tlRW5jQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfU01PS0VFTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9TTU9LRUVOQykpCisjZGVmaW5lIEdTVF9JU19TTU9LRUVOQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9TTU9LRUVOQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RTbW9rZUVuYyBHc3RTbW9rZUVuYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RTbW9rZUVuY0NsYXNzIEdzdFNtb2tlRW5jQ2xhc3M7CisKK3N0cnVjdCBfR3N0U21va2VFbmMgeworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgLyogcGFkcyAqLworICBHc3RQYWQgKnNpbmtwYWQsKnNyY3BhZDsKKworICAvKiB2aWRlbyBzdGF0ZSAqLworICBnaW50IGZvcm1hdDsKKyAgZ2ludCB3aWR0aDsKKyAgZ2ludCBoZWlnaHQ7CisgIGdpbnQgZnJhbWU7CisgIGdpbnQga2V5ZnJhbWU7CisgIGdpbnQgZnBzX251bSwgZnBzX2Rlbm9tOworCisgIFNtb2tlQ29kZWNJbmZvICppbmZvOworCisgIGdpbnQgdGhyZXNob2xkOworICBnaW50IG1pbl9xdWFsaXR5OworICBnaW50IG1heF9xdWFsaXR5OworCisgIGdib29sZWFuIG5lZWRfaGVhZGVyOworfTsKKworc3RydWN0IF9Hc3RTbW9rZUVuY0NsYXNzIHsKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9zbW9rZWVuY19nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1NNT0tFRU5DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L2pwZWcvbWVzb24uYnVpbGQgYi9leHQvanBlZy9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzYyOGNiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2pwZWcvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxOSBAQAoranBlZ19zb3VyY2VzID0gWworICAnZ3N0anBlZy5jJywKKyAgJ2dzdGpwZWdlbmMuYycsCisgICdnc3RqcGVnZGVjLmMnLAorXQorCitqcGVnbGliID0gY2MuZmluZF9saWJyYXJ5KCdqcGVnJywgcmVxdWlyZWQgOiBmYWxzZSkKKworaWYganBlZ2xpYi5mb3VuZCgpCisgIGdzdGpwZWcgPSBsaWJyYXJ5KCdnc3RqcGVnJywKKyAgICBqcGVnX3NvdXJjZXMsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgIGxpbmtfYXJncyA6IG5vc2VoX2xpbmtfYXJncywKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgICAgZGVwZW5kZW5jaWVzIDogW2dzdF9kZXAsIGdzdGJhc2VfZGVwLCBnc3R2aWRlb19kZXAsIGpwZWdsaWIsIGxpYm1dLAorICAgIGluc3RhbGwgOiB0cnVlLAorICAgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKyAgKQorZW5kaWYKZGlmZiAtLWdpdCBhL2V4dC9qcGVnL3Ntb2tlY29kZWMuYyBiL2V4dC9qcGVnL3Ntb2tlY29kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTMxNTJkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2pwZWcvc21va2Vjb2RlYy5jCkBAIC0wLDAgKzEsNzA5IEBACisvKiBTbW9rZSBjb2RlYworICogQ29weXJpZ2h0IChDKSA8MjAwND4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4gCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworLyogdGhpcyBpcyBhIGhhY2sgaGFjayBoYWNrIHRvIGdldCBhcm91bmQganBlZ2xpYiBoZWFkZXIgYnVncy4uLiAqLworI2lmZGVmIEhBVkVfU1RETElCX0gKKyMgdW5kZWYgSEFWRV9TVERMSUJfSAorI2VuZGlmCisjaW5jbHVkZSA8anBlZ2xpYi5oPgorCisjaW5jbHVkZSAic21va2Vjb2RlYy5oIgorI2luY2x1ZGUgInNtb2tlZm9ybWF0LmgiCisKKyNpbmNsdWRlIDxnc3QvZ3N0aW5mby5oPgorCitzdHJ1Y3QgX1Ntb2tlQ29kZWNJbmZvCit7CisgIHVuc2lnbmVkIGludCB3aWR0aDsKKyAgdW5zaWduZWQgaW50IGhlaWdodDsKKyAgdW5zaWduZWQgaW50IGZwc19udW07CisgIHVuc2lnbmVkIGludCBmcHNfZGVub207CisKKyAgdW5zaWduZWQgaW50IG1pbnF1YWxpdHk7CisgIHVuc2lnbmVkIGludCBtYXhxdWFsaXR5OworICB1bnNpZ25lZCBpbnQgYml0cmF0ZTsKKyAgdW5zaWduZWQgaW50IHRocmVzaG9sZDsKKworICB1bnNpZ25lZCBpbnQgcmVmZGVjOworCisgIHVuc2lnbmVkIGNoYXIgKipsaW5lWzNdOworICB1bnNpZ25lZCBjaGFyICpjb21wYnVmWzNdOworCisgIHN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOworCisgIHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIGpkZXN0OworCisgIHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IGRpbmZvOworICBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyIGpzcmM7CisKKyAgaW50IG5lZWRfa2V5ZnJhbWU7CisgIHVuc2lnbmVkIGNoYXIgKnJlZmVyZW5jZTsKK307CisKK3N0YXRpYyB2b2lkCitzbW9rZWNvZGVjX2luaXRfZGVzdGluYXRpb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworfQorCitzdGF0aWMgYm9vbGVhbgorc21va2Vjb2RlY19mbHVzaF9kZXN0aW5hdGlvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorc21va2Vjb2RlY190ZXJtX2Rlc3RpbmF0aW9uIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKK30KKworc3RhdGljIHZvaWQKK3Ntb2tlY29kZWNfaW5pdF9zb3VyY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7Cit9CisKK3N0YXRpYyBib29sZWFuCitzbW9rZWNvZGVjX2ZpbGxfaW5wdXRfYnVmZmVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3Ntb2tlY29kZWNfc2tpcF9pbnB1dF9kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBsb25nIG51bV9ieXRlcykKK3sKK30KKworc3RhdGljIGJvb2xlYW4KK3Ntb2tlY29kZWNfcmVzeW5jX3RvX3Jlc3RhcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBkZXNpcmVkKQoreworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3Ntb2tlY29kZWNfdGVybV9zb3VyY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7Cit9CisKKworaW50CitzbW9rZWNvZGVjX2VuY29kZV9uZXcgKFNtb2tlQ29kZWNJbmZvICoqIGluZm8sCisgICAgY29uc3QgdW5zaWduZWQgaW50IHdpZHRoLAorICAgIGNvbnN0IHVuc2lnbmVkIGludCBoZWlnaHQsCisgICAgY29uc3QgdW5zaWduZWQgaW50IGZwc19udW0sIGNvbnN0IHVuc2lnbmVkIGludCBmcHNfZGVub20pCit7CisgIFNtb2tlQ29kZWNJbmZvICpuZXdpbmZvOworICBpbnQgaSwgajsKKyAgdW5zaWduZWQgY2hhciAqYmFzZVszXTsKKworICBpZiAoIWluZm8pCisgICAgcmV0dXJuIFNNT0tFQ09ERUNfTlVMTFBUUjsKKyAgaWYgKCh3aWR0aCAmIDB4ZikgfHwgKGhlaWdodCAmIDB4ZikpCisgICAgcmV0dXJuIFNNT0tFQ09ERUNfV1JPTkdTSVpFOworCisgIG5ld2luZm8gPSBtYWxsb2MgKHNpemVvZiAoU21va2VDb2RlY0luZm8pKTsKKyAgaWYgKCFuZXdpbmZvKSB7CisgICAgcmV0dXJuIFNNT0tFQ09ERUNfTk9NRU07CisgIH0KKyAgbmV3aW5mby0+d2lkdGggPSB3aWR0aDsKKyAgbmV3aW5mby0+aGVpZ2h0ID0gaGVpZ2h0OworICBuZXdpbmZvLT5mcHNfbnVtID0gZnBzX251bTsKKyAgbmV3aW5mby0+ZnBzX2Rlbm9tID0gZnBzX2Rlbm9tOworCisgIC8qIHNldHVwIGpwZWdsaWIgKi8KKyAgbWVtc2V0ICgmbmV3aW5mby0+Y2luZm8sIDAsIHNpemVvZiAobmV3aW5mby0+Y2luZm8pKTsKKyAgbWVtc2V0ICgmbmV3aW5mby0+amVyciwgMCwgc2l6ZW9mIChuZXdpbmZvLT5qZXJyKSk7CisgIG5ld2luZm8tPmNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yICgmbmV3aW5mby0+amVycik7CisgIGpwZWdfY3JlYXRlX2NvbXByZXNzICgmbmV3aW5mby0+Y2luZm8pOworICBuZXdpbmZvLT5jaW5mby5pbnB1dF9jb21wb25lbnRzID0gMzsKKyAganBlZ19zZXRfZGVmYXVsdHMgKCZuZXdpbmZvLT5jaW5mbyk7CisKKyAgbmV3aW5mby0+Y2luZm8uZGN0X21ldGhvZCA9IEpEQ1RfRkFTVEVTVDsKKworICAvKiBwcmVwYXJlIGZvciByYXcgaW5wdXQgKi8KKyNpZiBKUEVHX0xJQl9WRVJTSU9OID49IDcwCisgIG5ld2luZm8tPmNpbmZvLmRvX2ZhbmN5X2Rvd25zYW1wbGluZyA9IEZBTFNFOworI2VuZGlmCisKKyAgbmV3aW5mby0+Y2luZm8ucmF3X2RhdGFfaW4gPSBUUlVFOworICBuZXdpbmZvLT5jaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19ZQ2JDcjsKKyAgbmV3aW5mby0+Y2luZm8uY29tcF9pbmZvWzBdLmhfc2FtcF9mYWN0b3IgPSAyOworICBuZXdpbmZvLT5jaW5mby5jb21wX2luZm9bMF0udl9zYW1wX2ZhY3RvciA9IDI7CisgIG5ld2luZm8tPmNpbmZvLmNvbXBfaW5mb1sxXS5oX3NhbXBfZmFjdG9yID0gMTsKKyAgbmV3aW5mby0+Y2luZm8uY29tcF9pbmZvWzFdLnZfc2FtcF9mYWN0b3IgPSAxOworICBuZXdpbmZvLT5jaW5mby5jb21wX2luZm9bMl0uaF9zYW1wX2ZhY3RvciA9IDE7CisgIG5ld2luZm8tPmNpbmZvLmNvbXBfaW5mb1syXS52X3NhbXBfZmFjdG9yID0gMTsKKworICBuZXdpbmZvLT5saW5lWzBdID0gbWFsbG9jIChEQ1RTSVpFICogMiAqIHNpemVvZiAoY2hhciAqKSk7CisgIG5ld2luZm8tPmxpbmVbMV0gPSBtYWxsb2MgKERDVFNJWkUgKiBzaXplb2YgKGNoYXIgKikpOworICBuZXdpbmZvLT5saW5lWzJdID0gbWFsbG9jIChEQ1RTSVpFICogc2l6ZW9mIChjaGFyICopKTsKKyAgYmFzZVswXSA9IG5ld2luZm8tPmNvbXBidWZbMF0gPSBtYWxsb2MgKDI1NiAqIDIgKiBEQ1RTSVpFICogMiAqIERDVFNJWkUpOworICBiYXNlWzFdID0gbmV3aW5mby0+Y29tcGJ1ZlsxXSA9IG1hbGxvYyAoMjU2ICogRENUU0laRSAqIERDVFNJWkUpOworICBiYXNlWzJdID0gbmV3aW5mby0+Y29tcGJ1ZlsyXSA9IG1hbGxvYyAoMjU2ICogRENUU0laRSAqIERDVFNJWkUpOworCisgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgMiAqIERDVFNJWkU7IGkgKz0gMiwgaisrKSB7CisgICAgbmV3aW5mby0+bGluZVswXVtpXSA9IGJhc2VbMF07CisgICAgYmFzZVswXSArPSAyICogRENUU0laRSAqIDI1NjsKKyAgICBuZXdpbmZvLT5saW5lWzBdW2kgKyAxXSA9IGJhc2VbMF07CisgICAgYmFzZVswXSArPSAyICogRENUU0laRSAqIDI1NjsKKyAgICBuZXdpbmZvLT5saW5lWzFdW2pdID0gYmFzZVsxXTsKKyAgICBiYXNlWzFdICs9IERDVFNJWkUgKiAyNTY7CisgICAgbmV3aW5mby0+bGluZVsyXVtqXSA9IGJhc2VbMl07CisgICAgYmFzZVsyXSArPSBEQ1RTSVpFICogMjU2OworICB9CisKKyAgbmV3aW5mby0+amRlc3QuaW5pdF9kZXN0aW5hdGlvbiA9IHNtb2tlY29kZWNfaW5pdF9kZXN0aW5hdGlvbjsKKyAgbmV3aW5mby0+amRlc3QuZW1wdHlfb3V0cHV0X2J1ZmZlciA9IHNtb2tlY29kZWNfZmx1c2hfZGVzdGluYXRpb247CisgIG5ld2luZm8tPmpkZXN0LnRlcm1fZGVzdGluYXRpb24gPSBzbW9rZWNvZGVjX3Rlcm1fZGVzdGluYXRpb247CisgIG5ld2luZm8tPmNpbmZvLmRlc3QgPSAmbmV3aW5mby0+amRlc3Q7CisKKyAganBlZ19zdXBwcmVzc190YWJsZXMgKCZuZXdpbmZvLT5jaW5mbywgRkFMU0UpOworCisgIG1lbXNldCAoJm5ld2luZm8tPmRpbmZvLCAwLCBzaXplb2YgKG5ld2luZm8tPmRpbmZvKSk7CisgIG5ld2luZm8tPmRpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yICgmbmV3aW5mby0+amVycik7CisgIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MgKCZuZXdpbmZvLT5kaW5mbyk7CisKKyAgbmV3aW5mby0+anNyYy5pbml0X3NvdXJjZSA9IHNtb2tlY29kZWNfaW5pdF9zb3VyY2U7CisgIG5ld2luZm8tPmpzcmMuZmlsbF9pbnB1dF9idWZmZXIgPSBzbW9rZWNvZGVjX2ZpbGxfaW5wdXRfYnVmZmVyOworICBuZXdpbmZvLT5qc3JjLnNraXBfaW5wdXRfZGF0YSA9IHNtb2tlY29kZWNfc2tpcF9pbnB1dF9kYXRhOworICBuZXdpbmZvLT5qc3JjLnJlc3luY190b19yZXN0YXJ0ID0gc21va2Vjb2RlY19yZXN5bmNfdG9fcmVzdGFydDsKKyAgbmV3aW5mby0+anNyYy50ZXJtX3NvdXJjZSA9IHNtb2tlY29kZWNfdGVybV9zb3VyY2U7CisgIG5ld2luZm8tPmRpbmZvLnNyYyA9ICZuZXdpbmZvLT5qc3JjOworCisgIG5ld2luZm8tPm5lZWRfa2V5ZnJhbWUgPSAxOworICBuZXdpbmZvLT50aHJlc2hvbGQgPSA0MDAwOworICBuZXdpbmZvLT5taW5xdWFsaXR5ID0gMTA7CisgIG5ld2luZm8tPm1heHF1YWxpdHkgPSA4NTsKKyAgbmV3aW5mby0+cmVmZXJlbmNlID0gbWFsbG9jICgzICogKHdpZHRoICogaGVpZ2h0KSAvIDIpOworICBuZXdpbmZvLT5yZWZkZWMgPSAwOworCisgICppbmZvID0gbmV3aW5mbzsKKworICByZXR1cm4gU01PS0VDT0RFQ19PSzsKK30KKworaW50CitzbW9rZWNvZGVjX2RlY29kZV9uZXcgKFNtb2tlQ29kZWNJbmZvICoqIGluZm8pCit7CisgIHJldHVybiBzbW9rZWNvZGVjX2VuY29kZV9uZXcgKGluZm8sIDE2LCAxNiwgMSwgMSk7Cit9CisKK2ludAorc21va2Vjb2RlY19pbmZvX2ZyZWUgKFNtb2tlQ29kZWNJbmZvICogaW5mbykKK3sKKyAgZnJlZSAoaW5mby0+bGluZVswXSk7CisgIGZyZWUgKGluZm8tPmxpbmVbMV0pOworICBmcmVlIChpbmZvLT5saW5lWzJdKTsKKyAgZnJlZSAoaW5mby0+Y29tcGJ1ZlswXSk7CisgIGZyZWUgKGluZm8tPmNvbXBidWZbMV0pOworICBmcmVlIChpbmZvLT5jb21wYnVmWzJdKTsKKyAgZnJlZSAoaW5mby0+cmVmZXJlbmNlKTsKKyAganBlZ19kZXN0cm95X2NvbXByZXNzICgmaW5mby0+Y2luZm8pOworICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcyAoJmluZm8tPmRpbmZvKTsKKyAgZnJlZSAoaW5mbyk7CisKKyAgcmV0dXJuIFNNT0tFQ09ERUNfT0s7Cit9CisKK1Ntb2tlQ29kZWNSZXN1bHQKK3Ntb2tlY29kZWNfc2V0X3F1YWxpdHkgKFNtb2tlQ29kZWNJbmZvICogaW5mbywKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgbWluLCBjb25zdCB1bnNpZ25lZCBpbnQgbWF4KQoreworICBpbmZvLT5taW5xdWFsaXR5ID0gbWluOworICBpbmZvLT5tYXhxdWFsaXR5ID0gbWF4OworCisgIHJldHVybiBTTU9LRUNPREVDX09LOworfQorCitTbW9rZUNvZGVjUmVzdWx0CitzbW9rZWNvZGVjX2dldF9xdWFsaXR5IChTbW9rZUNvZGVjSW5mbyAqIGluZm8sCisgICAgdW5zaWduZWQgaW50ICptaW4sIHVuc2lnbmVkIGludCAqbWF4KQoreworICAqbWluID0gaW5mby0+bWlucXVhbGl0eTsKKyAgKm1heCA9IGluZm8tPm1heHF1YWxpdHk7CisKKyAgcmV0dXJuIFNNT0tFQ09ERUNfT0s7Cit9CisKK1Ntb2tlQ29kZWNSZXN1bHQKK3Ntb2tlY29kZWNfc2V0X3RocmVzaG9sZCAoU21va2VDb2RlY0luZm8gKiBpbmZvLCBjb25zdCB1bnNpZ25lZCBpbnQgdGhyZXNob2xkKQoreworICBpbmZvLT50aHJlc2hvbGQgPSB0aHJlc2hvbGQ7CisKKyAgcmV0dXJuIFNNT0tFQ09ERUNfT0s7Cit9CisKK1Ntb2tlQ29kZWNSZXN1bHQKK3Ntb2tlY29kZWNfZ2V0X3RocmVzaG9sZCAoU21va2VDb2RlY0luZm8gKiBpbmZvLCB1bnNpZ25lZCBpbnQgKnRocmVzaG9sZCkKK3sKKyAgKnRocmVzaG9sZCA9IGluZm8tPnRocmVzaG9sZDsKKworICByZXR1cm4gU01PS0VDT0RFQ19PSzsKK30KKworU21va2VDb2RlY1Jlc3VsdAorc21va2Vjb2RlY19zZXRfYml0cmF0ZSAoU21va2VDb2RlY0luZm8gKiBpbmZvLCBjb25zdCB1bnNpZ25lZCBpbnQgYml0cmF0ZSkKK3sKKyAgaW5mby0+Yml0cmF0ZSA9IGJpdHJhdGU7CisKKyAgcmV0dXJuIFNNT0tFQ09ERUNfT0s7Cit9CisKK1Ntb2tlQ29kZWNSZXN1bHQKK3Ntb2tlY29kZWNfZ2V0X2JpdHJhdGUgKFNtb2tlQ29kZWNJbmZvICogaW5mbywgdW5zaWduZWQgaW50ICpiaXRyYXRlKQoreworICAqYml0cmF0ZSA9IGluZm8tPmJpdHJhdGU7CisKKyAgcmV0dXJuIFNNT0tFQ09ERUNfT0s7Cit9CisKK3N0YXRpYyB2b2lkCitmaW5kX2Jlc3Rfc2l6ZSAoaW50IGJsb2NrcywgdW5zaWduZWQgaW50ICp3aWR0aCwgdW5zaWduZWQgaW50ICpoZWlnaHQpCit7CisgIGludCBzcWNobmc7CisgIGludCB3LCBoOworICBpbnQgYmVzdCwgYmVzdHc7CisgIGludCBmcmVlOworCisgIHNxY2huZyA9IGNlaWwgKHNxcnQgKGJsb2NrcykpOworICB3ID0gc3FjaG5nOworICBoID0gc3FjaG5nOworCisgIEdTVF9ERUJVRyAoImd1ZXNzOiAlZCAlZCIsIHcsIGgpOworCisgIGZyZWUgPSB3ICogaCAtIGJsb2NrczsKKyAgYmVzdCA9IGZyZWU7CisgIGJlc3R3ID0gdzsKKworICB3aGlsZSAodyA8IDI1NikgeworICAgIEdTVF9ERUJVRyAoImN1cnJlbnQ6ICVkICVkIiwgdywgaCk7CisgICAgaWYgKGZyZWUgPCBiZXN0KSB7CisgICAgICBiZXN0ID0gZnJlZTsKKyAgICAgIGJlc3R3ID0gdzsKKyAgICAgIGlmIChmcmVlID09IDApCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBpZiB3ZSBjYW5ub3QgcmVkdWNlIHRoZSBoZWlnaHQsIGluY3JlYXNlIHdpZHRoCisgICAgaWYgKGZyZWUgPCB3KSB7CisgICAgICB3Kys7CisgICAgICBmcmVlICs9IGg7CisgICAgfQorICAgIC8vIHJlZHVjZSBoZWlnaHQgd2hpbGUgcG9zc2libGUKKyAgICB3aGlsZSAoZnJlZSA+PSB3KSB7CisgICAgICBoLS07CisgICAgICBmcmVlIC09IHc7CisgICAgfQorICB9CisgICp3aWR0aCA9IGJlc3R3OworICAqaGVpZ2h0ID0gKGJsb2NrcyArIGJlc3QpIC8gYmVzdHc7Cit9CisKK3N0YXRpYyBpbnQKK2Fic19kaWZmIChjb25zdCB1bnNpZ25lZCBjaGFyICppbjEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluMiwgY29uc3QgaW50IHN0cmlkZSkKK3sKKyAgaW50IHM7CisgIGludCBpLCBqLCBkaWZmOworCisgIHMgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCAyICogRENUU0laRTsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IDIgKiBEQ1RTSVpFOyBqKyspIHsKKyAgICAgIGRpZmYgPSBpbjFbal0gLSBpbjJbal07CisgICAgICBzICs9IGRpZmYgKiBkaWZmOworICAgIH0KKyAgICBpbjEgKz0gc3RyaWRlOworICAgIGluMiArPSBzdHJpZGU7CisgIH0KKyAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyB2b2lkCitwdXQgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZGVzdCwKKyAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzcmNzdHJpZGUsIGludCBkZXN0c3RyaWRlKQoreworICBpbnQgaSwgajsKKworICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgZGVzdFtqXSA9IHNyY1tqXTsKKyAgICB9CisgICAgc3JjICs9IHNyY3N0cmlkZTsKKyAgICBkZXN0ICs9IGRlc3RzdHJpZGU7CisgIH0KK30KKworLyogZW5jb2RpbmcgKi8KK1Ntb2tlQ29kZWNSZXN1bHQKK3Ntb2tlY29kZWNfZW5jb2RlX2lkIChTbW9rZUNvZGVjSW5mbyAqIGluZm8sCisgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBpbnQgKm91dHNpemUpCit7CisgIGludCBpOworCisgICpvdXQrKyA9IFNNT0tFQ09ERUNfVFlQRV9JRDsKKyAgZm9yIChpID0gMDsgaSA8IHN0cmxlbiAoU01PS0VDT0RFQ19JRF9TVFJJTkcpOyBpKyspIHsKKyAgICAqb3V0KysgPSBTTU9LRUNPREVDX0lEX1NUUklOR1tpXTsKKyAgfQorICAqb3V0KysgPSAwOworICAqb3V0KysgPSAxOworICAqb3V0KysgPSAwOworCisgICpvdXRzaXplID0gOTsKKworICByZXR1cm4gU01PS0VDT0RFQ19PSzsKK30KKworU21va2VDb2RlY1Jlc3VsdAorc21va2Vjb2RlY19lbmNvZGUgKFNtb2tlQ29kZWNJbmZvICogaW5mbywKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwKKyAgICBTbW9rZUNvZGVjRmxhZ3MgZmxhZ3MsIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgaW50ICpvdXRzaXplKQoreworICB1bnNpZ25lZCBpbnQgaSwgaiwgczsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqaXA7CisgIHVuc2lnbmVkIGNoYXIgKm9wOworICB1bnNpZ25lZCBpbnQgYmxvY2tzLCBlbmNvZGluZzsKKyAgdW5zaWduZWQgaW50IHNpemU7CisgIHVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0OworICB1bnNpZ25lZCBpbnQgYmxvY2tzX3csIGJsb2Nrc19oOworICB1bnNpZ25lZCBpbnQgdGhyZXNob2xkOworICB1bnNpZ25lZCBpbnQgbWF4OworCisgIGlmIChpbmZvLT5uZWVkX2tleWZyYW1lKSB7CisgICAgZmxhZ3MgfD0gU01PS0VDT0RFQ19LRVlGUkFNRTsKKyAgICBpbmZvLT5uZWVkX2tleWZyYW1lID0gMDsKKyAgfQorCisgIGlmIChmbGFncyAmIFNNT0tFQ09ERUNfS0VZRlJBTUUpCisgICAgdGhyZXNob2xkID0gMDsKKyAgZWxzZQorICAgIHRocmVzaG9sZCA9IGluZm8tPnRocmVzaG9sZDsKKworICBpcCA9IGluOworICBvcCA9IGluZm8tPnJlZmVyZW5jZTsKKworICB3aWR0aCA9IGluZm8tPndpZHRoOworICBoZWlnaHQgPSBpbmZvLT5oZWlnaHQ7CisKKyAgYmxvY2tzX3cgPSB3aWR0aCAvIChEQ1RTSVpFICogMik7CisgIGJsb2Nrc19oID0gaGVpZ2h0IC8gKERDVFNJWkUgKiAyKTsKKworICBtYXggPSBibG9ja3NfdyAqIGJsb2Nrc19oOworCisgIG91dFtJRFhfVFlQRV0gPSBTTU9LRUNPREVDX1RZUEVfREFUQTsKKworI2RlZmluZSBTVE9SRTE2KHZhciwgcG9zLCB4KSBcCisgICB2YXJbcG9zXSAgID0gKHggPj4gOCk7IFwKKyAgIHZhcltwb3MrMV0gPSAoeCAmIDB4ZmYpOworI2RlZmluZSBTVE9SRTMyKHZhciwgcG9zLCB4KSBcCisgICB2YXJbcG9zXSAgID0gKCh4ID4+IDI0KSAmIDB4ZmYpOyBcCisgICB2YXJbcG9zKzFdID0gKCh4ID4+IDE2KSAmIDB4ZmYpOyBcCisgICB2YXJbcG9zKzJdID0gKCh4ID4+IDgpICYgMHhmZik7IFwKKyAgIHZhcltwb3MrM10gPSAgKHggJiAweGZmKTsKKworICAvKiB3cml0ZSBkaW1lbnNpb24gKi8KKyAgU1RPUkUxNiAob3V0LCBJRFhfV0lEVEgsIHdpZHRoKTsKKyAgU1RPUkUxNiAob3V0LCBJRFhfSEVJR0hULCBoZWlnaHQpOworCisgIC8qIHdyaXRlIGZyYW1lcmF0ZSAqLworICBTVE9SRTMyIChvdXQsIElEWF9GUFNfTlVNLCBpbmZvLT5mcHNfbnVtKTsKKyAgU1RPUkUzMiAob3V0LCBJRFhfRlBTX0RFTk9NLCBpbmZvLT5mcHNfZGVub20pOworCisgIGlmICghKGZsYWdzICYgU01PS0VDT0RFQ19LRVlGUkFNRSkpIHsKKyAgICBpbnQgYmxvY2sgPSAwOworCisgICAgYmxvY2tzID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpICs9IDIgKiBEQ1RTSVpFKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGogKz0gMiAqIERDVFNJWkUpIHsKKyAgICAgICAgcyA9IGFic19kaWZmIChpcCwgb3AsIHdpZHRoKTsKKyAgICAgICAgaWYgKHMgPj0gdGhyZXNob2xkKSB7CisgICAgICAgICAgU1RPUkUxNiAob3V0LCBibG9ja3MgKiAyICsgSURYX0JMT0NLUywgYmxvY2spOworICAgICAgICAgIGJsb2NrcysrOworICAgICAgICB9CisKKyAgICAgICAgaXAgKz0gMiAqIERDVFNJWkU7CisgICAgICAgIG9wICs9IDIgKiBEQ1RTSVpFOworICAgICAgICBibG9jaysrOworICAgICAgfQorICAgICAgaXAgKz0gKDIgKiBEQ1RTSVpFIC0gMSkgKiB3aWR0aDsKKyAgICAgIG9wICs9ICgyICogRENUU0laRSAtIDEpICogd2lkdGg7CisgICAgfQorICAgIGlmIChibG9ja3MgPT0gbWF4KSB7CisgICAgICBmbGFncyB8PSBTTU9LRUNPREVDX0tFWUZSQU1FOworICAgICAgYmxvY2tzID0gMDsKKyAgICAgIGVuY29kaW5nID0gbWF4OworICAgIH0gZWxzZSB7CisgICAgICBlbmNvZGluZyA9IGJsb2NrczsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgYmxvY2tzID0gMDsKKyAgICBlbmNvZGluZyA9IG1heDsKKyAgfQorICBTVE9SRTE2IChvdXQsIElEWF9OVU1fQkxPQ0tTLCBibG9ja3MpOworICBvdXRbSURYX0ZMQUdTXSA9IChmbGFncyAmIDB4ZmYpOworCisgIEdTVF9ERUJVRyAoImJsb2NrcyAlZCwgZW5jb2RpbmcgJWQiLCBibG9ja3MsIGVuY29kaW5nKTsKKworICBpbmZvLT5qZGVzdC5uZXh0X291dHB1dF9ieXRlID0gJm91dFtibG9ja3MgKiAyICsgT0ZGU19QSUNUXTsKKyAgaW5mby0+amRlc3QuZnJlZV9pbl9idWZmZXIgPSAoKm91dHNpemUpIC0gT0ZGU19QSUNUOworCisgIGlmIChlbmNvZGluZyA+IDApIHsKKyAgICBpbnQgcXVhbGl0eTsKKworICAgIGlmICghKGZsYWdzICYgU01PS0VDT0RFQ19LRVlGUkFNRSkpCisgICAgICBmaW5kX2Jlc3Rfc2l6ZSAoZW5jb2RpbmcsICZibG9ja3NfdywgJmJsb2Nrc19oKTsKKworICAgIEdTVF9ERUJVRyAoImJlc3Q6ICVkICVkIiwgYmxvY2tzX3csIGJsb2Nrc19oKTsKKworICAgIGluZm8tPmNpbmZvLmltYWdlX3dpZHRoID0gYmxvY2tzX3cgKiBEQ1RTSVpFICogMjsKKyAgICBpbmZvLT5jaW5mby5pbWFnZV9oZWlnaHQgPSBibG9ja3NfaCAqIERDVFNJWkUgKiAyOworCisgICAgaWYgKGZsYWdzICYgU01PS0VDT0RFQ19LRVlGUkFNRSkgeworICAgICAgcXVhbGl0eSA9IChpbmZvLT5tYXhxdWFsaXR5ICogNjApIC8gMTAwOworICAgIH0gZWxzZSB7CisgICAgICBxdWFsaXR5ID0KKyAgICAgICAgICBpbmZvLT5tYXhxdWFsaXR5IC0gKChpbmZvLT5tYXhxdWFsaXR5IC0KKyAgICAgICAgICAgICAgaW5mby0+bWlucXVhbGl0eSkgKiBibG9ja3MpIC8gbWF4OworICAgIH0KKworICAgIEdTVF9ERUJVRyAoInNldCBxICVkICVkICVkIiwgcXVhbGl0eSwgZW5jb2RpbmcsIG1heCk7CisgICAganBlZ19zZXRfcXVhbGl0eSAoJmluZm8tPmNpbmZvLCBxdWFsaXR5LCBUUlVFKTsKKyAgICBHU1RfREVCVUcgKCJzdGFydCIpOworICAgIGpwZWdfc3RhcnRfY29tcHJlc3MgKCZpbmZvLT5jaW5mbywgVFJVRSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZW5jb2Rpbmc7IGkrKykgeworICAgICAgaW50IHBvczsKKyAgICAgIGludCB4LCB5OworCisgICAgICBpZiAoZmxhZ3MgJiBTTU9LRUNPREVDX0tFWUZSQU1FKQorICAgICAgICBwb3MgPSBpOworICAgICAgZWxzZQorICAgICAgICBwb3MgPSAob3V0W2kgKiAyICsgSURYX0JMT0NLU10gPDwgOCkgfCAob3V0W2kgKiAyICsgSURYX0JMT0NLUyArIDFdKTsKKworICAgICAgeCA9IHBvcyAlICh3aWR0aCAvIChEQ1RTSVpFICogMikpOworICAgICAgeSA9IHBvcyAvICh3aWR0aCAvIChEQ1RTSVpFICogMikpOworCisgICAgICBpcCA9IGluICsgKHggKiAoRENUU0laRSAqIDIpKSArICh5ICogKERDVFNJWkUgKiAyKSAqIHdpZHRoKTsKKyAgICAgIG9wID0gaW5mby0+Y29tcGJ1ZlswXSArIChpICUgYmxvY2tzX3cpICogKERDVFNJWkUgKiAyKTsKKyAgICAgIHB1dCAoaXAsIG9wLCAyICogRENUU0laRSwgMiAqIERDVFNJWkUsIHdpZHRoLCAyNTYgKiAoRENUU0laRSAqIDIpKTsKKworICAgICAgaXAgPSBpbiArIHdpZHRoICogaGVpZ2h0ICsgKHggKiBEQ1RTSVpFKSArICh5ICogRENUU0laRSAqIHdpZHRoIC8gMik7CisgICAgICBvcCA9IGluZm8tPmNvbXBidWZbMV0gKyAoaSAlIGJsb2Nrc193KSAqIChEQ1RTSVpFKTsKKyAgICAgIHB1dCAoaXAsIG9wLCBEQ1RTSVpFLCBEQ1RTSVpFLCB3aWR0aCAvIDIsIDI1NiAqIERDVFNJWkUpOworCisgICAgICBpcCA9IGluICsgNSAqICh3aWR0aCAqIGhlaWdodCkgLyA0ICsgKHggKiBEQ1RTSVpFKSArCisgICAgICAgICAgKHkgKiBEQ1RTSVpFICogd2lkdGggLyAyKTsKKyAgICAgIG9wID0gaW5mby0+Y29tcGJ1ZlsyXSArIChpICUgYmxvY2tzX3cpICogKERDVFNJWkUpOworICAgICAgcHV0IChpcCwgb3AsIERDVFNJWkUsIERDVFNJWkUsIHdpZHRoIC8gMiwgMjU2ICogRENUU0laRSk7CisKKyAgICAgIGlmICgoaSAlIGJsb2Nrc193KSA9PSAoYmxvY2tzX3cgLSAxKSB8fCAoaSA9PSBlbmNvZGluZyAtIDEpKSB7CisgICAgICAgIEdTVF9ERUJVRyAoIndyaXRlICVkIiwgcG9zKTsKKyAgICAgICAganBlZ193cml0ZV9yYXdfZGF0YSAoJmluZm8tPmNpbmZvLCBpbmZvLT5saW5lLCAyICogRENUU0laRSk7CisgICAgICB9CisgICAgfQorICAgIEdTVF9ERUJVRyAoImZpbmlzaCIpOworICAgIGpwZWdfZmluaXNoX2NvbXByZXNzICgmaW5mby0+Y2luZm8pOworICB9CisKKyAgc2l6ZSA9ICgoKCgqb3V0c2l6ZSkgLSBPRkZTX1BJQ1QgLSBpbmZvLT5qZGVzdC5mcmVlX2luX2J1ZmZlcikgKyAzKSAmIH4zKTsKKyAgU1RPUkUxNiAob3V0LCBJRFhfU0laRSwgc2l6ZSk7CisKKyAgKm91dHNpemUgPSBzaXplICsgYmxvY2tzICogMiArIE9GRlNfUElDVDsKKyAgR1NUX0RFQlVHICgib3V0c2l6ZSAlZCIsICpvdXRzaXplKTsKKworICAvLyBhbmQgZGVjb2RlIGluIHJlZmVyZW5jZSBmcmFtZSBhZ2FpbgorICBpZiAoaW5mby0+cmVmZGVjKSB7CisgICAgc21va2Vjb2RlY19kZWNvZGUgKGluZm8sIG91dCwgKm91dHNpemUsIGluZm8tPnJlZmVyZW5jZSk7CisgIH0gZWxzZSB7CisgICAgbWVtY3B5IChpbmZvLT5yZWZlcmVuY2UsIGluLCAzICogKHdpZHRoICogaGVpZ2h0KSAvIDIpOworICB9CisKKyAgcmV0dXJuIFNNT0tFQ09ERUNfT0s7Cit9CisKK1Ntb2tlQ29kZWNSZXN1bHQKK3Ntb2tlY29kZWNfcGFyc2VfaWQgKFNtb2tlQ29kZWNJbmZvICogaW5mbywKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgY29uc3QgdW5zaWduZWQgaW50IGluc2l6ZSkKK3sKKyAgaW50IGk7CisKKyAgaWYgKGluc2l6ZSA8IDQgKyBzdHJsZW4gKFNNT0tFQ09ERUNfSURfU1RSSU5HKSkgeworICAgIHJldHVybiBTTU9LRUNPREVDX1dST05HVkVSU0lPTjsKKyAgfQorCisgIGlmICgqaW4rKyAhPSBTTU9LRUNPREVDX1RZUEVfSUQpCisgICAgcmV0dXJuIFNNT0tFQ09ERUNfRVJST1I7CisKKyAgZm9yIChpID0gMDsgaSA8IHN0cmxlbiAoU01PS0VDT0RFQ19JRF9TVFJJTkcpOyBpKyspIHsKKyAgICBpZiAoKmluKysgIT0gU01PS0VDT0RFQ19JRF9TVFJJTkdbaV0pCisgICAgICByZXR1cm4gU01PS0VDT0RFQ19FUlJPUjsKKyAgfQorICBpZiAoKmluKysgIT0gMCB8fCAqaW4rKyAhPSAxIHx8ICppbisrICE9IDApCisgICAgcmV0dXJuIFNNT0tFQ09ERUNfRVJST1I7CisKKyAgcmV0dXJuIFNNT0tFQ09ERUNfT0s7Cit9CisKKyNkZWZpbmUgUkVBRDE2KHZhciwgcG9zLCB4KSBcCisgeCA9IHZhcltwb3NdPDw4IHwgdmFyW3BvcysxXTsKKworI2RlZmluZSBSRUFEMzIodmFyLCBwb3MsIHgpIFwKKyB4ID0gdmFyW3Bvc108PDI0IHwgdmFyW3BvcysxXTw8MTYgfCBcCisgICAgIHZhcltwb3MrMl08PDggfCB2YXJbcG9zKzNdOworCisvKiBkZWNvZGluZyAqLworU21va2VDb2RlY1Jlc3VsdAorc21va2Vjb2RlY19wYXJzZV9oZWFkZXIgKFNtb2tlQ29kZWNJbmZvICogaW5mbywKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgaW5zaXplLAorICAgIFNtb2tlQ29kZWNGbGFncyAqIGZsYWdzLAorICAgIHVuc2lnbmVkIGludCAqd2lkdGgsCisgICAgdW5zaWduZWQgaW50ICpoZWlnaHQsIHVuc2lnbmVkIGludCAqZnBzX251bSwgdW5zaWduZWQgaW50ICpmcHNfZGVub20pCit7CisKKyAgUkVBRDE2IChpbiwgSURYX1dJRFRILCAqd2lkdGgpOworICBSRUFEMTYgKGluLCBJRFhfSEVJR0hULCAqaGVpZ2h0KTsKKyAgKmZsYWdzID0gaW5bSURYX0ZMQUdTXTsKKyAgUkVBRDMyIChpbiwgSURYX0ZQU19OVU0sICpmcHNfbnVtKTsKKyAgUkVBRDMyIChpbiwgSURYX0ZQU19ERU5PTSwgKmZwc19kZW5vbSk7CisKKyAgaWYgKGluZm8tPndpZHRoICE9ICp3aWR0aCB8fAorICAgICAgaW5mby0+aGVpZ2h0ICE9ICpoZWlnaHQgfHwKKyAgICAgIGluZm8tPmZwc19udW0gIT0gKmZwc19udW0gfHwgaW5mby0+ZnBzX2Rlbm9tICE9ICpmcHNfZGVub20pIHsKKyAgICBHU1RfREVCVUcgKCJuZXcgd2lkdGg6ICVkICVkIiwgKndpZHRoLCAqaGVpZ2h0KTsKKworICAgIGluZm8tPnJlZmVyZW5jZSA9IHJlYWxsb2MgKGluZm8tPnJlZmVyZW5jZSwgMyAqICgoKndpZHRoKSAqICgqaGVpZ2h0KSkgLyAyKTsKKyAgICBpbmZvLT53aWR0aCA9ICp3aWR0aDsKKyAgICBpbmZvLT5oZWlnaHQgPSAqaGVpZ2h0OworICAgIGluZm8tPmZwc19udW0gPSAqZnBzX251bTsKKyAgICBpbmZvLT5mcHNfZGVub20gPSAqZnBzX2Rlbm9tOworICB9CisKKyAgcmV0dXJuIFNNT0tFQ09ERUNfT0s7Cit9CisKK1Ntb2tlQ29kZWNSZXN1bHQKK3Ntb2tlY29kZWNfZGVjb2RlIChTbW9rZUNvZGVjSW5mbyAqIGluZm8sCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIGNvbnN0IHVuc2lnbmVkIGludCBpbnNpemUsIHVuc2lnbmVkIGNoYXIgKm91dCkKK3sKKyAgdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQ7CisgIHVuc2lnbmVkIGludCBmcHNfbnVtLCBmcHNfZGVub207CisgIFNtb2tlQ29kZWNGbGFncyBmbGFnczsKKyAgaW50IGksIGo7CisgIGludCBibG9ja3NfdywgYmxvY2tzX2g7CisgIGludCBibG9ja3B0cjsKKyAgaW50IGJsb2NrcywgZGVjb2Rpbmc7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlwOworICB1bnNpZ25lZCBjaGFyICpvcDsKKyAgaW50IHJlczsKKworICBzbW9rZWNvZGVjX3BhcnNlX2hlYWRlciAoaW5mbywgaW4sIGluc2l6ZSwgJmZsYWdzLCAmd2lkdGgsICZoZWlnaHQsCisgICAgICAmZnBzX251bSwgJmZwc19kZW5vbSk7CisKKyAgUkVBRDE2IChpbiwgSURYX05VTV9CTE9DS1MsIGJsb2Nrcyk7CisgIEdTVF9ERUJVRyAoImJsb2NrcyAlZCIsIGJsb2Nrcyk7CisKKyAgaWYgKGZsYWdzICYgU01PS0VDT0RFQ19LRVlGUkFNRSkKKyAgICBkZWNvZGluZyA9IHdpZHRoIC8gKERDVFNJWkUgKiAyKSAqIGhlaWdodCAvIChEQ1RTSVpFICogMik7CisgIGVsc2UKKyAgICBkZWNvZGluZyA9IGJsb2NrczsKKworICBpZiAoZGVjb2RpbmcgPiAwKSB7CisgICAgaW5mby0+anNyYy5uZXh0X2lucHV0X2J5dGUgPSAmaW5bYmxvY2tzICogMiArIE9GRlNfUElDVF07CisgICAgaW5mby0+anNyYy5ieXRlc19pbl9idWZmZXIgPSBpbnNpemUgLSAoYmxvY2tzICogMiArIE9GRlNfUElDVCk7CisKKyAgICBHU1RfREVCVUcgKCJoZWFkZXIgJTAyeCAlZCIsIGluW2Jsb2NrcyAqIDIgKyBPRkZTX1BJQ1RdLCBpbnNpemUpOworICAgIHJlcyA9IGpwZWdfcmVhZF9oZWFkZXIgKCZpbmZvLT5kaW5mbywgVFJVRSk7CisgICAgR1NUX0RFQlVHICgiaGVhZGVyICVkICVkICVkIiwgcmVzLCBpbmZvLT5kaW5mby5pbWFnZV93aWR0aCwKKyAgICAgICAgaW5mby0+ZGluZm8uaW1hZ2VfaGVpZ2h0KTsKKworICAgIGJsb2Nrc193ID0gaW5mby0+ZGluZm8uaW1hZ2Vfd2lkdGggLyAoMiAqIERDVFNJWkUpOworICAgIGJsb2Nrc19oID0gaW5mby0+ZGluZm8uaW1hZ2VfaGVpZ2h0IC8gKDIgKiBEQ1RTSVpFKTsKKworICAgIGluZm8tPmRpbmZvLm91dHB1dF93aWR0aCA9IGluZm8tPmRpbmZvLmltYWdlX3dpZHRoOworICAgIGluZm8tPmRpbmZvLm91dHB1dF9oZWlnaHQgPSBpbmZvLT5kaW5mby5pbWFnZV9oZWlnaHQ7CisKKyAgICBHU1RfREVCVUcgKCJzdGFydCIpOworICAgIGluZm8tPmRpbmZvLmRvX2ZhbmN5X3Vwc2FtcGxpbmcgPSBGQUxTRTsKKyAgICBpbmZvLT5kaW5mby5kb19ibG9ja19zbW9vdGhpbmcgPSBGQUxTRTsKKyAgICBpbmZvLT5kaW5mby5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7CisgICAgaW5mby0+ZGluZm8uZGN0X21ldGhvZCA9IEpEQ1RfSUZBU1Q7CisgICAgaW5mby0+ZGluZm8ucmF3X2RhdGFfb3V0ID0gVFJVRTsKKyAgICBqcGVnX3N0YXJ0X2RlY29tcHJlc3MgKCZpbmZvLT5kaW5mbyk7CisKKyAgICBibG9ja3B0ciA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tzX2g7IGkrKykgeworICAgICAgR1NUX0RFQlVHICgicmVhZCIpOworICAgICAganBlZ19yZWFkX3Jhd19kYXRhICgmaW5mby0+ZGluZm8sIGluZm8tPmxpbmUsIDIgKiBEQ1RTSVpFKTsKKworICAgICAgR1NUX0RFQlVHICgiY29weSAlZCIsIGJsb2Nrc193KTsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBibG9ja3NfdzsgaisrKSB7CisgICAgICAgIGludCBwb3M7CisgICAgICAgIGludCB4LCB5OworCisgICAgICAgIGlmIChmbGFncyAmIFNNT0tFQ09ERUNfS0VZRlJBTUUpCisgICAgICAgICAgcG9zID0gYmxvY2twdHI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBSRUFEMTYgKGluLCBibG9ja3B0ciAqIDIgKyBJRFhfQkxPQ0tTLCBwb3MpOworCisgICAgICAgIHggPSBwb3MgJSAod2lkdGggLyAoRENUU0laRSAqIDIpKTsKKyAgICAgICAgeSA9IHBvcyAvICh3aWR0aCAvIChEQ1RTSVpFICogMikpOworCisgICAgICAgIEdTVF9ERUJVRyAoImJsb2NrICVkICVkICVkIiwgcG9zLCB4LCB5KTsKKworICAgICAgICBpcCA9IGluZm8tPmNvbXBidWZbMF0gKyBqICogKERDVFNJWkUgKiAyKTsKKyAgICAgICAgb3AgPSBpbmZvLT5yZWZlcmVuY2UgKyAoeCAqIChEQ1RTSVpFICogMikpICsKKyAgICAgICAgICAgICh5ICogKERDVFNJWkUgKiAyKSAqIHdpZHRoKTsKKyAgICAgICAgcHV0IChpcCwgb3AsIDIgKiBEQ1RTSVpFLCAyICogRENUU0laRSwgMjU2ICogKERDVFNJWkUgKiAyKSwgd2lkdGgpOworCisgICAgICAgIGlwID0gaW5mby0+Y29tcGJ1ZlsxXSArIGogKiAoRENUU0laRSk7CisgICAgICAgIG9wID0gaW5mby0+cmVmZXJlbmNlICsgd2lkdGggKiBoZWlnaHQgKyAoeCAqIERDVFNJWkUpICsKKyAgICAgICAgICAgICh5ICogRENUU0laRSAqIHdpZHRoIC8gMik7CisgICAgICAgIHB1dCAoaXAsIG9wLCBEQ1RTSVpFLCBEQ1RTSVpFLCAyNTYgKiBEQ1RTSVpFLCB3aWR0aCAvIDIpOworCisgICAgICAgIGlwID0gaW5mby0+Y29tcGJ1ZlsyXSArIGogKiAoRENUU0laRSk7CisgICAgICAgIG9wID0gaW5mby0+cmVmZXJlbmNlICsgNSAqICh3aWR0aCAqIGhlaWdodCkgLyA0ICsgKHggKiBEQ1RTSVpFKSArCisgICAgICAgICAgICAoeSAqIERDVFNJWkUgKiB3aWR0aCAvIDIpOworICAgICAgICBwdXQgKGlwLCBvcCwgRENUU0laRSwgRENUU0laRSwgMjU2ICogRENUU0laRSwgd2lkdGggLyAyKTsKKworICAgICAgICBHU1RfREVCVUcgKCJibG9jayBkb25lICVkICVkICVkIiwgcG9zLCB4LCB5KTsKKyAgICAgICAgYmxvY2twdHIrKzsKKyAgICAgICAgaWYgKGJsb2NrcHRyID49IGRlY29kaW5nKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBHU1RfREVCVUcgKCJmaW5pc2giKTsKKyAgICBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzICgmaW5mby0+ZGluZm8pOworICB9CisKKyAgR1NUX0RFQlVHICgiY29weSIpOworICBpZiAob3V0ICE9IGluZm8tPnJlZmVyZW5jZSkKKyAgICBtZW1jcHkgKG91dCwgaW5mby0+cmVmZXJlbmNlLCAzICogKHdpZHRoICogaGVpZ2h0KSAvIDIpOworICBHU1RfREVCVUcgKCJjb3B5IGRvbmUiKTsKKworICByZXR1cm4gU01PS0VDT0RFQ19PSzsKK30KZGlmZiAtLWdpdCBhL2V4dC9qcGVnL3Ntb2tlY29kZWMuaCBiL2V4dC9qcGVnL3Ntb2tlY29kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2Q4YTMyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2pwZWcvc21va2Vjb2RlYy5oCkBAIC0wLDAgKzEsMTE5IEBACisvKiBTbW9rZSBDb2RlYworICogQ29weXJpZ2h0IChDKSA8MjAwND4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19TTU9LRUNPREVDX0hfXworI2RlZmluZSBfX1NNT0tFQ09ERUNfSF9fCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKK3R5cGVkZWYgc3RydWN0IF9TbW9rZUNvZGVjSW5mbyBTbW9rZUNvZGVjSW5mbzsKKwordHlwZWRlZiBlbnVtIHsKKyAgU01PS0VDT0RFQ19XUk9OR1ZFUlNJT04gICAgICAgPSAtNSwKKyAgU01PS0VDT0RFQ19XUk9OR1NJWkUgICAgICAgICAgPSAtNCwKKyAgU01PS0VDT0RFQ19FUlJPUiAgICAgICAgICAgICAgPSAtMywKKyAgU01PS0VDT0RFQ19OT01FTSAgICAgICAgICAgICAgPSAtMiwKKyAgU01PS0VDT0RFQ19OVUxMUFRSICAgICAgICAgICAgPSAtMSwKKyAgU01PS0VDT0RFQ19PSyAgICAgICAgICAgICAgICAgPSAgMCAKK30gU21va2VDb2RlY1Jlc3VsdDsKKyAgICAgICAgCit0eXBlZGVmIGVudW0geworICBTTU9LRUNPREVDX0tFWUZSQU1FICAgICAgICAgICA9ICgxPDwwKSwKKyAgU01PS0VDT0RFQ19NT1RJT05fVkVDVE9SUyAgICAgPSAoMTw8MSkKK30gU21va2VDb2RlY0ZsYWdzOworICAgICAgICAKKyNkZWZpbmUgU01PS0VDT0RFQ19JRF9TVFJJTkcgInNtb2tlIgorCit0eXBlZGVmIGVudW0geworICBTTU9LRUNPREVDX1RZUEVfSUQgICAgICAgICAgICA9IDB4ODAsCisgIFNNT0tFQ09ERUNfVFlQRV9DT01NRU5UICAgICAgID0gMHg4MSwKKyAgU01PS0VDT0RFQ19UWVBFX0VYVFJBICAgICAgICAgPSAweDgzLAorICBTTU9LRUNPREVDX1RZUEVfREFUQSAgICAgICAgICA9IDB4NDAgCit9IFNtb2tlUGFja2V0VHlwZTsKKworLyogaW5pdCAqLworaW50ICAgICAgICAgICAgICAgICAgICAgc21va2Vjb2RlY19lbmNvZGVfbmV3ICAgKFNtb2tlQ29kZWNJbmZvICoqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgZnBzX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgZnBzX2Rlbm9tKTsKKworaW50ICAgICAgICAgICAgICAgICAgICAgc21va2Vjb2RlY19kZWNvZGVfbmV3ICAgKFNtb2tlQ29kZWNJbmZvICoqaW5mbyk7CisKK2ludCAgICAgICAgICAgICAgICAgICAgIHNtb2tlY29kZWNfaW5mb19mcmVlICAgIChTbW9rZUNvZGVjSW5mbyAqIGluZm8pOworCisvKiBjb25maWcgKi8KK1Ntb2tlQ29kZWNSZXN1bHQgICAgICAgIHNtb2tlY29kZWNfc2V0X3F1YWxpdHkgIChTbW9rZUNvZGVjSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBtYXgpOworU21va2VDb2RlY1Jlc3VsdCAgICAgICAgc21va2Vjb2RlY19nZXRfcXVhbGl0eSAgKFNtb2tlQ29kZWNJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbWF4KTsKKworU21va2VDb2RlY1Jlc3VsdCAgICAgICAgc21va2Vjb2RlY19zZXRfdGhyZXNob2xkIChTbW9rZUNvZGVjSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgdGhyZXNob2xkKTsKK1Ntb2tlQ29kZWNSZXN1bHQgICAgICAgIHNtb2tlY29kZWNfZ2V0X3RocmVzaG9sZCAoU21va2VDb2RlY0luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICp0aHJlc2hvbGQpOworCitTbW9rZUNvZGVjUmVzdWx0ICAgICAgICBzbW9rZWNvZGVjX3NldF9iaXRyYXRlICAoU21va2VDb2RlY0luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGJpdHJhdGUpOworU21va2VDb2RlY1Jlc3VsdCAgICAgICAgc21va2Vjb2RlY19nZXRfYml0cmF0ZSAgKFNtb2tlQ29kZWNJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqYml0cmF0ZSk7CisKKy8qIGVuY29kaW5nICovCitTbW9rZUNvZGVjUmVzdWx0ICAgICAgICBzbW9rZWNvZGVjX2VuY29kZV9pZCAgICAoU21va2VDb2RlY0luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqb3V0c2l6ZSk7CisKK1Ntb2tlQ29kZWNSZXN1bHQgICAgICAgIHNtb2tlY29kZWNfZW5jb2RlICAgICAgIChTbW9rZUNvZGVjSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbW9rZUNvZGVjRmxhZ3MgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqb3V0c2l6ZSk7CisKKy8qIGRlY29kaW5nICovCitTbW9rZUNvZGVjUmVzdWx0ICAgICAgICBzbW9rZWNvZGVjX3BhcnNlX2lkICAgICAoU21va2VDb2RlY0luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGluc2l6ZSk7CisKK1Ntb2tlQ29kZWNSZXN1bHQgICAgICAgIHNtb2tlY29kZWNfcGFyc2VfaGVhZGVyIChTbW9rZUNvZGVjSW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgaW5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtb2tlQ29kZWNGbGFncyAqZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICp3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmZwc19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpmcHNfZGVub20pOworCitTbW9rZUNvZGVjUmVzdWx0ICAgICAgICBzbW9rZWNvZGVjX2RlY29kZSAgICAgICAoU21va2VDb2RlY0luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGluc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKyNlbmRpZiAvKiBfX1NNT0tFQ09ERUNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvanBlZy9zbW9rZWZvcm1hdC5oIGIvZXh0L2pwZWcvc21va2Vmb3JtYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWM3NTZkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2pwZWcvc21va2Vmb3JtYXQuaApAQCAtMCwwICsxLDQ2IEBACisvKiBTbW9rZSBDb2RlYworICogQ29weXJpZ2h0IChDKSA8MjAwND4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19TTU9LRUZPUk1BVF9IX18KKyNkZWZpbmUgX19TTU9LRUZPUk1BVF9IX18KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNkZWZpbmUgSURYX1RZUEUgICAgICAgIDAKKyNkZWZpbmUgSURYX1dJRFRIICAgICAgIDEKKyNkZWZpbmUgSURYX0hFSUdIVCAgICAgIDMKKyNkZWZpbmUgSURYX0ZQU19OVU0gICAgIDUKKyNkZWZpbmUgSURYX0ZQU19ERU5PTSAgIDkKKyNkZWZpbmUgSURYX0ZMQUdTICAgICAgIDEzCisjZGVmaW5lIElEWF9OVU1fQkxPQ0tTICAxNAorI2RlZmluZSBJRFhfU0laRSAgICAgICAgMTYKKyNkZWZpbmUgSURYX0JMT0NLUyAgICAgIDE4CisjZGVmaW5lIE9GRlNfUElDVCAgICAgICAxOAorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworI2VuZGlmIC8qIF9fU01PS0VGT1JNQVRfSF9fICovCmRpZmYgLS1naXQgYS9leHQvbGFtZS9NYWtlZmlsZS5hbSBiL2V4dC9sYW1lL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MTk4YzgKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbGFtZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEwIEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RsYW1lLmxhCisKK2xpYmdzdGxhbWVfbGFfU09VUkNFUyA9IGdzdGxhbWVtcDNlbmMuYyBwbHVnaW4uYworbGliZ3N0bGFtZV9sYV9DRkxBR1MgPSBcCisgICAgICAgICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoTEFNRV9DRkxBR1MpCitsaWJnc3RsYW1lX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKExBTUVfTElCUykKK2xpYmdzdGxhbWVfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdGxhbWVtcDNlbmMuaApkaWZmIC0tZ2l0IGEvZXh0L2xhbWUvZ3N0bGFtZW1wM2VuYy5jIGIvZXh0L2xhbWUvZ3N0bGFtZW1wM2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YTYzN2EKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbGFtZS9nc3RsYW1lbXAzZW5jLmMKQEAgLTAsMCArMSw5MzQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDQ+IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1sYW1lbXAzZW5jCisgKiBAc2VlX2Fsc286IGxhbWUsIG1hZCwgdm9yYmlzZW5jCisgKgorICogVGhpcyBlbGVtZW50IGVuY29kZXMgcmF3IGludGVnZXIgYXVkaW8gaW50byBhbiBNUEVHLTEgbGF5ZXIgMyAoTVAzKSBzdHJlYW0uCisgKiBOb3RlIHRoYXQgPHVsaW5rIHVybD0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NUDMiPk1QMzwvdWxpbms+IGlzIG5vdAorICogYSBmcmVlIGZvcm1hdCwgdGhlcmUgYXJlIGxpY2Vuc2luZyBhbmQgcGF0ZW50IGlzc3VlcyB0byB0YWtlIGludG8KKyAqIGNvbnNpZGVyYXRpb24uIFNlZSA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LnZvcmJpcy5jb20vIj5PZ2cvVm9yYmlzPC91bGluaz4KKyAqIGZvciBhIHJveWFsdHkgZnJlZSAoYW5kIG9mdGVuIGhpZ2hlciBxdWFsaXR5KSBhbHRlcm5hdGl2ZS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+T3V0cHV0IHNhbXBsZSByYXRlPC90aXRsZT4KKyAqIElmIG5vIGZpeGVkIG91dHB1dCBzYW1wbGUgcmF0ZSBpcyBuZWdvdGlhdGVkIG9uIHRoZSBlbGVtZW50J3Mgc3JjIHBhZCwKKyAqIHRoZSBlbGVtZW50IHdpbGwgY2hvb3NlIGFuIG9wdGltYWwgc2FtcGxlIHJhdGUgdG8gcmVzYW1wbGUgdG8gaW50ZXJuYWxseS4KKyAqIEZvciBleGFtcGxlLCBhIDE2LWJpdCA0NC4xIEtIeiBtb25vIGF1ZGlvIHN0cmVhbSBlbmNvZGVkIGF0IDQ4IGtiaXQgd2lsbAorICogZ2V0IHJlc2FtcGxlZCB0byAzMiBLSHouICBVc2UgZmlsdGVyIGNhcHMgb24gdGhlIHNyYyBwYWQgdG8gZm9yY2UgYQorICogcGFydGljdWxhciBzYW1wbGUgcmF0ZS4KKyAqIDwvcmVmc2VjdDI+CisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyB3YXZlPXNpbmUgbnVtLWJ1ZmZlcnM9MTAwICEgYXVkaW9jb252ZXJ0ICEgbGFtZW1wM2VuYyAhIGZpbGVzaW5rIGxvY2F0aW9uPXNpbmUubXAzCisgKiBdfCBFbmNvZGUgYSB0ZXN0IHNpbmUgc2lnbmFsIHRvIE1QMy4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBhdXRvYXVkaW9zcmMgISBhdWRpb2NvbnZlcnQgISBsYW1lbXAzZW5jIHRhcmdldD1iaXRyYXRlIGJpdHJhdGU9MTkyICEgZmlsZXNpbmsgbG9jYXRpb249YWxzYXNyYy5tcDMKKyAqIF18IFJlY29yZCBmcm9tIGEgc291bmQgY2FyZCB1c2luZyBBTFNBIGFuZCBlbmNvZGUgdG8gTVAzIHdpdGggYW4gYXZlcmFnZSBiaXRyYXRlIG9mIDE5MmticHMKKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBmaWxlc3JjIGxvY2F0aW9uPW11c2ljLndhdiAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBsYW1lbXAzZW5jIHRhcmdldD1xdWFsaXR5IHF1YWxpdHk9MCAhIGlkM3YybXV4ICEgZmlsZXNpbmsgbG9jYXRpb249bXVzaWMubXAzCisgKiBdfCBUcmFuc2NvZGUgZnJvbSBhIC53YXYgZmlsZSB0byBNUDMgKHRoZSBpZDN2Mm11eCBlbGVtZW50IGlzIG9wdGlvbmFsKSB3aXRoIGJlc3QgVkJSIHF1YWxpdHkKKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBjZGRhOi8vNSAhIGF1ZGlvY29udmVydCAhIGxhbWVtcDNlbmMgdGFyZ2V0PWJpdHJhdGUgY2JyPXRydWUgYml0cmF0ZT0xOTIgISBmaWxlc2luayBsb2NhdGlvbj10cmFjazUubXAzCisgKiBdfCBFbmNvZGUgQXVkaW8gQ0QgdHJhY2sgNSB0byBNUDMgd2l0aCBhIGNvbnN0YW50IGJpdHJhdGUgb2YgMTkya2JwcworICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyBudW0tYnVmZmVycz0xMCAhIGF1ZGlvL3gtcmF3LHJhdGU9NDQxMDAsY2hhbm5lbHM9MSAhIGxhbWVtcDNlbmMgdGFyZ2V0PWJpdHJhdGUgY2JyPXRydWUgYml0cmF0ZT00OCAhIGZpbGVzaW5rIGxvY2F0aW9uPXRlc3QubXAzCisgKiBdfCBFbmNvZGUgdG8gYSBmaXhlZCBzYW1wbGUgcmF0ZQorICogPC9yZWZzZWN0Mj4KKyAqCisgKiBTaW5jZTogMC4xMC4xMgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdzdGxhbWVtcDNlbmMuaCIKKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisKKy8qIGxhbWUgPCAzLjk4ICovCisjaWZuZGVmIEhBVkVfTEFNRV9TRVRfVkJSX1FVQUxJVFkKKyNkZWZpbmUgbGFtZV9zZXRfVkJSX3F1YWxpdHkoZmxhZ3MscSkgbGFtZV9zZXRfVkJSX3EoKGZsYWdzKSwoaW50KShxKSkKKyNlbmRpZgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChkZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBkZWJ1ZworCisvKiBlbGVtZW50ZmFjdG9yeSBpbmZvcm1hdGlvbiAqLworCisvKiBMQU1FTVAzRU5DIGNhbiBkbyBNUEVHLTEsIE1QRUctMiwgYW5kIE1QRUctMi41LCBzbyBpdCBoYXMgOSBwb3NzaWJsZQorICogc2FtcGxlIHJhdGVzIGl0IHN1cHBvcnRzICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X2xhbWVtcDNlbmNfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChTMTYpICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJyYXRlID0gKGludCkgeyA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAgfSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxOyAiCisgICAgICAgICJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKFMxNikgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSB7IDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDIsICIgImNoYW5uZWwtbWFzayA9IChiaXRtYXNrKSAweDMiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfbGFtZW1wM2VuY19zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL21wZWcsICIKKyAgICAgICAgIm1wZWd2ZXJzaW9uID0gKGludCkgMSwgIgorICAgICAgICAibGF5ZXIgPSAoaW50KSAzLCAiCisgICAgICAgICJyYXRlID0gKGludCkgeyA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAgfSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXSIpCisgICAgKTsKKworLyoqKioqKioqKiogRGVmaW5lIHVzZWZ1bCB0eXBlcyBmb3Igbm9uLXByb2dyYW1tYXRpYyBpbnRlcmZhY2VzICoqKioqKioqKiovCitlbnVtCit7CisgIExBTUVNUDNFTkNfVEFSR0VUX1FVQUxJVFkgPSAwLAorICBMQU1FTVAzRU5DX1RBUkdFVF9CSVRSQVRFCit9OworCisjZGVmaW5lIEdTVF9UWVBFX0xBTUVNUDNFTkNfVEFSR0VUIChnc3RfbGFtZW1wM2VuY190YXJnZXRfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X2xhbWVtcDNlbmNfdGFyZ2V0X2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgbGFtZV90YXJnZXRfdHlwZSA9IDA7CisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGxhbWVfdGFyZ2V0c1tdID0geworICAgIHtMQU1FTVAzRU5DX1RBUkdFVF9RVUFMSVRZLCAiUXVhbGl0eSIsICJxdWFsaXR5In0sCisgICAge0xBTUVNUDNFTkNfVEFSR0VUX0JJVFJBVEUsICJCaXRyYXRlIiwgImJpdHJhdGUifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0KKyAgfTsKKworICBpZiAoIWxhbWVfdGFyZ2V0X3R5cGUpIHsKKyAgICBsYW1lX3RhcmdldF90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdExhbWVNUDNFbmNUYXJnZXQiLCBsYW1lX3RhcmdldHMpOworICB9CisgIHJldHVybiBsYW1lX3RhcmdldF90eXBlOworfQorCitlbnVtCit7CisgIExBTUVNUDNFTkNfRU5DT0RJTkdfRU5HSU5FX1FVQUxJVFlfRkFTVCA9IDAsCisgIExBTUVNUDNFTkNfRU5DT0RJTkdfRU5HSU5FX1FVQUxJVFlfU1RBTkRBUkQsCisgIExBTUVNUDNFTkNfRU5DT0RJTkdfRU5HSU5FX1FVQUxJVFlfSElHSAorfTsKKworI2RlZmluZSBHU1RfVFlQRV9MQU1FTVAzRU5DX0VOQ09ESU5HX0VOR0lORV9RVUFMSVRZIChnc3RfbGFtZW1wM2VuY19lbmNvZGluZ19lbmdpbmVfcXVhbGl0eV9nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3RfbGFtZW1wM2VuY19lbmNvZGluZ19lbmdpbmVfcXVhbGl0eV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGxhbWVfZW5jb2RpbmdfZW5naW5lX3F1YWxpdHlfdHlwZSA9IDA7CisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGxhbWVfZW5jb2RpbmdfZW5naW5lX3F1YWxpdHlbXSA9IHsKKyAgICB7MCwgIkZhc3QiLCAiZmFzdCJ9LAorICAgIHsxLCAiU3RhbmRhcmQiLCAic3RhbmRhcmQifSwKKyAgICB7MiwgIkhpZ2giLCAiaGlnaCJ9LAorICAgIHswLCBOVUxMLCBOVUxMfQorICB9OworCisgIGlmICghbGFtZV9lbmNvZGluZ19lbmdpbmVfcXVhbGl0eV90eXBlKSB7CisgICAgbGFtZV9lbmNvZGluZ19lbmdpbmVfcXVhbGl0eV90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdExhbWVNUDNFbmNFbmNvZGluZ0VuZ2luZVF1YWxpdHkiLAorICAgICAgICBsYW1lX2VuY29kaW5nX2VuZ2luZV9xdWFsaXR5KTsKKyAgfQorICByZXR1cm4gbGFtZV9lbmNvZGluZ19lbmdpbmVfcXVhbGl0eV90eXBlOworfQorCisvKioqKioqKioqKiBTdGFuZGFyZCBzdHVmZiBmb3Igc2lnbmFscyBhbmQgYXJndW1lbnRzICoqKioqKioqKiovCisKK2VudW0KK3sKKyAgQVJHXzAsCisgIEFSR19UQVJHRVQsCisgIEFSR19CSVRSQVRFLAorICBBUkdfQ0JSLAorICBBUkdfUVVBTElUWSwKKyAgQVJHX0VOQ09ESU5HX0VOR0lORV9RVUFMSVRZLAorICBBUkdfTU9OTworfTsKKworI2RlZmluZSBERUZBVUxUX1RBUkdFVCBMQU1FTVAzRU5DX1RBUkdFVF9RVUFMSVRZCisjZGVmaW5lIERFRkFVTFRfQklUUkFURSAxMjgKKyNkZWZpbmUgREVGQVVMVF9DQlIgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9RVUFMSVRZIDQKKyNkZWZpbmUgREVGQVVMVF9FTkNPRElOR19FTkdJTkVfUVVBTElUWSBMQU1FTVAzRU5DX0VOQ09ESU5HX0VOR0lORV9RVUFMSVRZX1NUQU5EQVJECisjZGVmaW5lIERFRkFVTFRfTU9OTyBGQUxTRQorCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2xhbWVtcDNlbmNfc3RhcnQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2xhbWVtcDNlbmNfc3RvcCAoR3N0QXVkaW9FbmNvZGVyICogZW5jKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbGFtZW1wM2VuY19zZXRfZm9ybWF0IChHc3RBdWRpb0VuY29kZXIgKiBlbmMsCisgICAgR3N0QXVkaW9JbmZvICogaW5mbyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfbGFtZW1wM2VuY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywKKyAgICBHc3RCdWZmZXIgKiBpbl9idWYpOworc3RhdGljIHZvaWQgZ3N0X2xhbWVtcDNlbmNfZmx1c2ggKEdzdEF1ZGlvRW5jb2RlciAqIGVuYyk7CisKK3N0YXRpYyB2b2lkIGdzdF9sYW1lbXAzZW5jX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9sYW1lbXAzZW5jX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbGFtZW1wM2VuY19zZXR1cCAoR3N0TGFtZU1QM0VuYyAqIGxhbWUsIEdzdFRhZ0xpc3QgKiogdGFncyk7CisKKyNkZWZpbmUgZ3N0X2xhbWVtcDNlbmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0TGFtZU1QM0VuYywgZ3N0X2xhbWVtcDNlbmMsIEdTVF9UWVBFX0FVRElPX0VOQ09ERVIpOworCitzdGF0aWMgdm9pZAorZ3N0X2xhbWVtcDNlbmNfcmVsZWFzZV9tZW1vcnkgKEdzdExhbWVNUDNFbmMgKiBsYW1lKQoreworICBpZiAobGFtZS0+bGdmKSB7CisgICAgbGFtZV9jbG9zZSAobGFtZS0+bGdmKTsKKyAgICBsYW1lLT5sZ2YgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbGFtZW1wM2VuY19maW5hbGl6ZSAoR09iamVjdCAqIG9iaikKK3sKKyAgZ3N0X2xhbWVtcDNlbmNfcmVsZWFzZV9tZW1vcnkgKEdTVF9MQU1FTVAzRU5DIChvYmopKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iaik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbGFtZW1wM2VuY19jbGFzc19pbml0IChHc3RMYW1lTVAzRW5jQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEF1ZGlvRW5jb2RlckNsYXNzICpiYXNlX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgYmFzZV9jbGFzcyA9IChHc3RBdWRpb0VuY29kZXJDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfbGFtZW1wM2VuY19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9sYW1lbXAzZW5jX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfbGFtZW1wM2VuY19maW5hbGl6ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfbGFtZW1wM2VuY19zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfbGFtZW1wM2VuY19zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIkwuQS5NLkUuIG1wMyBlbmNvZGVyIiwgIkNvZGVjL0VuY29kZXIvQXVkaW8iLAorICAgICAgIkhpZ2gtcXVhbGl0eSBmcmVlIE1QMyBlbmNvZGVyIiwKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKKworICBiYXNlX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbGFtZW1wM2VuY19zdGFydCk7CisgIGJhc2VfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2xhbWVtcDNlbmNfc3RvcCk7CisgIGJhc2VfY2xhc3MtPnNldF9mb3JtYXQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2xhbWVtcDNlbmNfc2V0X2Zvcm1hdCk7CisgIGJhc2VfY2xhc3MtPmhhbmRsZV9mcmFtZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbGFtZW1wM2VuY19oYW5kbGVfZnJhbWUpOworICBiYXNlX2NsYXNzLT5mbHVzaCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbGFtZW1wM2VuY19mbHVzaCk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX1RBUkdFVCwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgidGFyZ2V0IiwgIlRhcmdldCIsCisgICAgICAgICAgIk9wdGltaXplIGZvciBxdWFsaXR5IG9yIGJpdHJhdGUiLCBHU1RfVFlQRV9MQU1FTVAzRU5DX1RBUkdFVCwKKyAgICAgICAgICBERUZBVUxUX1RBUkdFVCwKKyAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBBUkdfQklUUkFURSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJiaXRyYXRlIiwgIkJpdHJhdGUgKGtiL3MpIiwKKyAgICAgICAgICAiQml0cmF0ZSBpbiBrYml0L3NlYyAoT25seSB2YWxpZCBpZiB0YXJnZXQgaXMgYml0cmF0ZSwgZm9yIENCUiBvbmUgIgorICAgICAgICAgICJvZiA4LCAxNiwgMjQsIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgIgorICAgICAgICAgICIyNTYgb3IgMzIwKSIsIDgsIDMyMCwgREVGQVVMVF9CSVRSQVRFLAorICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19DQlIsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImNiciIsICJDQlIiLCAiRW5mb3JjZSBjb25zdGFudCBiaXRyYXRlIGVuY29kaW5nICIKKyAgICAgICAgICAiKE9ubHkgdmFsaWQgaWYgdGFyZ2V0IGlzIGJpdHJhdGUpIiwgREVGQVVMVF9DQlIsCisgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX1FVQUxJVFksCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJxdWFsaXR5IiwgIlF1YWxpdHkiLAorICAgICAgICAgICJWQlIgUXVhbGl0eSBmcm9tIDAgdG8gMTAsIDAgYmVpbmcgdGhlIGJlc3QgIgorICAgICAgICAgICIoT25seSB2YWxpZCBpZiB0YXJnZXQgaXMgcXVhbGl0eSkiLCAwLjAsIDkuOTk5LAorICAgICAgICAgIERFRkFVTFRfUVVBTElUWSwKKyAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgQVJHX0VOQ09ESU5HX0VOR0lORV9RVUFMSVRZLCBnX3BhcmFtX3NwZWNfZW51bSAoImVuY29kaW5nLWVuZ2luZS1xdWFsaXR5IiwKKyAgICAgICAgICAiRW5jb2RpbmcgRW5naW5lIFF1YWxpdHkiLCAiUXVhbGl0eS9zcGVlZCBvZiB0aGUgZW5jb2RpbmcgZW5naW5lLCAiCisgICAgICAgICAgInRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBiaXRyYXRlISIsCisgICAgICAgICAgR1NUX1RZUEVfTEFNRU1QM0VOQ19FTkNPRElOR19FTkdJTkVfUVVBTElUWSwKKyAgICAgICAgICBERUZBVUxUX0VOQ09ESU5HX0VOR0lORV9RVUFMSVRZLAorICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19NT05PLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJtb25vIiwgIk1vbm8iLCAiRW5mb3JjZSBtb25vIGVuY29kaW5nIiwKKyAgICAgICAgICBERUZBVUxUX01PTk8sCisgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9sYW1lbXAzZW5jX2luaXQgKEdzdExhbWVNUDNFbmMgKiBsYW1lKQoreworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9BVURJT19FTkNPREVSX1NJTktfUEFEIChsYW1lKSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2xhbWVtcDNlbmNfc3RhcnQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYykKK3sKKyAgR3N0TGFtZU1QM0VuYyAqbGFtZSA9IEdTVF9MQU1FTVAzRU5DIChlbmMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGxhbWUsICJzdGFydCIpOworCisgIGlmICghbGFtZS0+YWRhcHRlcikKKyAgICBsYW1lLT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICBnc3RfYWRhcHRlcl9jbGVhciAobGFtZS0+YWRhcHRlcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2xhbWVtcDNlbmNfc3RvcCAoR3N0QXVkaW9FbmNvZGVyICogZW5jKQoreworICBHc3RMYW1lTVAzRW5jICpsYW1lID0gR1NUX0xBTUVNUDNFTkMgKGVuYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAobGFtZSwgInN0b3AiKTsKKworICBpZiAobGFtZS0+YWRhcHRlcikgeworICAgIGdfb2JqZWN0X3VucmVmIChsYW1lLT5hZGFwdGVyKTsKKyAgICBsYW1lLT5hZGFwdGVyID0gTlVMTDsKKyAgfQorCisgIGdzdF9sYW1lbXAzZW5jX3JlbGVhc2VfbWVtb3J5IChsYW1lKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2xhbWVtcDNlbmNfc2V0X2Zvcm1hdCAoR3N0QXVkaW9FbmNvZGVyICogZW5jLCBHc3RBdWRpb0luZm8gKiBpbmZvKQoreworICBHc3RMYW1lTVAzRW5jICpsYW1lOworICBnaW50IG91dF9zYW1wbGVyYXRlOworICBnaW50IHZlcnNpb247CisgIEdzdENhcHMgKm90aGVyY2FwczsKKyAgR3N0Q2xvY2tUaW1lIGxhdGVuY3k7CisgIEdzdFRhZ0xpc3QgKnRhZ3MgPSBOVUxMOworCisgIGxhbWUgPSBHU1RfTEFNRU1QM0VOQyAoZW5jKTsKKworICAvKiBwYXJhbWV0ZXJzIGFscmVhZHkgcGFyc2VkIGZvciB1cyAqLworICBsYW1lLT5zYW1wbGVyYXRlID0gR1NUX0FVRElPX0lORk9fUkFURSAoaW5mbyk7CisgIGxhbWUtPm51bV9jaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChpbmZvKTsKKworICAvKiBidXQgd2UgbWlnaHQgYmUgYXNrZWQgdG8gcmVjb25maWd1cmUsIHNvIHJlc2V0ICovCisgIGdzdF9sYW1lbXAzZW5jX3JlbGVhc2VfbWVtb3J5IChsYW1lKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChsYW1lLCAic2V0dGluZyB1cCBsYW1lIik7CisgIGlmICghZ3N0X2xhbWVtcDNlbmNfc2V0dXAgKGxhbWUsICZ0YWdzKSkKKyAgICBnb3RvIHNldHVwX2ZhaWxlZDsKKworICBvdXRfc2FtcGxlcmF0ZSA9IGxhbWVfZ2V0X291dF9zYW1wbGVyYXRlIChsYW1lLT5sZ2YpOworICBpZiAob3V0X3NhbXBsZXJhdGUgPT0gMCkKKyAgICBnb3RvIHplcm9fb3V0cHV0X3JhdGU7CisgIGlmIChvdXRfc2FtcGxlcmF0ZSAhPSBsYW1lLT5zYW1wbGVyYXRlKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChsYW1lLAorICAgICAgICAib3V0cHV0IHNhbXBsZXJhdGUgJWQgaXMgZGlmZmVyZW50IGZyb20gaW5jb21pbmcgc2FtcGxlcmF0ZSAlZCIsCisgICAgICAgIG91dF9zYW1wbGVyYXRlLCBsYW1lLT5zYW1wbGVyYXRlKTsKKyAgfQorICBsYW1lLT5vdXRfc2FtcGxlcmF0ZSA9IG91dF9zYW1wbGVyYXRlOworCisgIHZlcnNpb24gPSBsYW1lX2dldF92ZXJzaW9uIChsYW1lLT5sZ2YpOworICBpZiAodmVyc2lvbiA9PSAwKQorICAgIHZlcnNpb24gPSAyOworICBlbHNlIGlmICh2ZXJzaW9uID09IDEpCisgICAgdmVyc2lvbiA9IDE7CisgIGVsc2UgaWYgKHZlcnNpb24gPT0gMikKKyAgICB2ZXJzaW9uID0gMzsKKworICBvdGhlcmNhcHMgPQorICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL21wZWciLAorICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMSwKKyAgICAgICJtcGVnYXVkaW92ZXJzaW9uIiwgR19UWVBFX0lOVCwgdmVyc2lvbiwKKyAgICAgICJsYXllciIsIEdfVFlQRV9JTlQsIDMsCisgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBsYW1lLT5tb25vID8gMSA6IGxhbWUtPm51bV9jaGFubmVscywKKyAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgb3V0X3NhbXBsZXJhdGUsIE5VTEwpOworCisgIC8qIGFuZCB1c2UgdGhlc2UgY2FwcyAqLworICBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfb3V0cHV0X2Zvcm1hdCAoR1NUX0FVRElPX0VOQ09ERVIgKGVuYyksIG90aGVyY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChvdGhlcmNhcHMpOworCisgIC8qIGJhc2UgY2xhc3MgZmVlZGJhY2s6CisgICAqIC0gd2Ugd2lsbCBoYW5kbGUgYnVmZmVycywganVzdCBoYW5kIHVzIGFsbCBhdmFpbGFibGUKKyAgICogLSByZXBvcnQgbGF0ZW5jeSAqLworICBsYXRlbmN5ID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAobGFtZV9nZXRfZnJhbWVzaXplIChsYW1lLT5sZ2YpLAorICAgICAgR1NUX1NFQ09ORCwgbGFtZS0+c2FtcGxlcmF0ZSk7CisgIGdzdF9hdWRpb19lbmNvZGVyX3NldF9sYXRlbmN5IChlbmMsIGxhdGVuY3ksIGxhdGVuY3kpOworCisgIGlmICh0YWdzKSB7CisgICAgZ3N0X2F1ZGlvX2VuY29kZXJfbWVyZ2VfdGFncyAoZW5jLCB0YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UpOworICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFncyk7CisgIH0KKworICByZXR1cm4gVFJVRTsKKworemVyb19vdXRwdXRfcmF0ZToKKyAgeworICAgIGlmICh0YWdzKQorICAgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdzKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAobGFtZSwgTElCUkFSWSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJMQU1FIG1wMyBhdWRpbyBkZWNpZGVkIG9uIGEgemVybyBzYW1wbGUgcmF0ZSIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3NldHVwX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChsYW1lLCBMSUJSQVJZLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkZhaWxlZCB0byBjb25maWd1cmUgTEFNRSBtcDMgYXVkaW8gZW5jb2Rlci4gQ2hlY2sgeW91ciBlbmNvZGluZyBwYXJhbWV0ZXJzLiIpKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogPHBocC1lbXVsYXRpb24tbW9kZT50aHJlZSB1bmRlcnNjb3JlcyBmb3IgX19fcmF0ZSBpcyByZWFsbHkgcmVhbGx5IHJlYWxseQorICogcHJpdmF0ZSBhcyBvcHBvc2VkIHRvIG9uZSB1bmRlcnNjb3JlPHBocC1lbXVsYXRpb24tbW9kZT4gKi8KKy8qIGNhbGwgdGhpcyBNQUNSTyBvdXRzaWRlIG9mIHRoZSBOVUxMIHN0YXRlIHNvIHRoYXQgd2UgaGF2ZSBhIGhpZ2hlciBjaGFuY2UKKyAqIG9mIGFjdHVhbGx5IGhhdmluZyBhIHBpcGVsaW5lIGFuZCBidXMgdG8gZ2V0IHRoZSBtZXNzYWdlIHRocm91Z2ggKi8KKworI2RlZmluZSBDSEVDS19BTkRfRklYVVBfQklUUkFURShvYmoscGFyYW0scmF0ZSkJCSAJCSAgXAorR19TVE1UX1NUQVJUIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdpbnQgX19fcmF0ZSA9IHJhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2ludCBtYXhyYXRlID0gMzIwOwkJCQkJCQkgIFwKKyAgZ2ludCBtdWx0aXBsaWVyID0gNjQ7CQkJCQkJCSAgXAorICBpZiAocmF0ZSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19fcmF0ZSA9IHJhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIGlmIChyYXRlIDw9IDY0KSB7CQkJCSAgICAgICAgICAgICAgICAgIFwKKyAgICBtYXhyYXRlID0gNjQ7IG11bHRpcGxpZXIgPSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgocmF0ZSAlIDgpICE9IDApIF9fX3JhdGUgPSBHU1RfUk9VTkRfVVBfOCAocmF0ZSk7IAkJICBcCisgIH0gZWxzZSBpZiAocmF0ZSA8PSAxMjgpIHsJCQkJCQkgIFwKKyAgICBtYXhyYXRlID0gMTI4OyBtdWx0aXBsaWVyID0gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgocmF0ZSAlIDE2KSAhPSAwKSBfX19yYXRlID0gR1NUX1JPVU5EX1VQXzE2IChyYXRlKTsgICAgICAgICAgICAgICBcCisgIH0gZWxzZSBpZiAocmF0ZSA8PSAyNTYpIHsJCQkJCQkgIFwKKyAgICBtYXhyYXRlID0gMjU2OyBtdWx0aXBsaWVyID0gMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgocmF0ZSAlIDMyKSAhPSAwKSBfX19yYXRlID0gR1NUX1JPVU5EX1VQXzMyIChyYXRlKTsgICAgICAgICAgICAgICBcCisgIH0gZWxzZSBpZiAocmF0ZSA8PSAzMjApIHsgCQkJCQkJICBcCisgICAgbWF4cmF0ZSA9IDMyMDsgbXVsdGlwbGllciA9IDY0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKHJhdGUgJSA2NCkgIT0gMCkgX19fcmF0ZSA9IEdTVF9ST1VORF9VUF82NCAocmF0ZSk7ICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChfX19yYXRlICE9IHJhdGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChvYmosIExJQlJBUlksIFNFVFRJTkdTLAkJCSAgXAorICAgICAgKF8oIlRoZSByZXF1ZXN0ZWQgYml0cmF0ZSAlZCBrYml0L3MgZm9yIHByb3BlcnR5ICclcycgIiAgICAgICAgICAgICBcCisgICAgICAgImlzIG5vdCBhbGxvd2VkLiAiICAJCQkJCSAgICAgICAgICBcCisgICAgICAgIlRoZSBiaXRyYXRlIHdhcyBjaGFuZ2VkIHRvICVkIGtiaXQvcy4iKSwgcmF0ZSwJCSAgICAgICAgICBcCisgICAgICAgICBwYXJhbSwgIF9fX3JhdGUpLCAJCQkJCSAgICAgICAgICBcCisgICAgICAgKCJBIGJpdHJhdGUgYmVsb3cgJWQgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgJWQuIiwgCQkgIFwKKyAgICAgICAgICBtYXhyYXRlLCBtdWx0aXBsaWVyKSk7CQkgIAkJCSAgXAorICAgIHJhdGUgPSBfX19yYXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gR19TVE1UX0VORAorCitzdGF0aWMgdm9pZAorZ3N0X2xhbWVtcDNlbmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdExhbWVNUDNFbmMgKmxhbWU7CisKKyAgbGFtZSA9IEdTVF9MQU1FTVAzRU5DIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgQVJHX1RBUkdFVDoKKyAgICAgIGxhbWUtPnRhcmdldCA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0JJVFJBVEU6CisgICAgICBsYW1lLT5iaXRyYXRlID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19DQlI6CisgICAgICBsYW1lLT5jYnIgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19RVUFMSVRZOgorICAgICAgbGFtZS0+cXVhbGl0eSA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19FTkNPRElOR19FTkdJTkVfUVVBTElUWToKKyAgICAgIGxhbWUtPmVuY29kaW5nX2VuZ2luZV9xdWFsaXR5ID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfTU9OTzoKKyAgICAgIGxhbWUtPm1vbm8gPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbGFtZW1wM2VuY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0TGFtZU1QM0VuYyAqbGFtZTsKKworICBsYW1lID0gR1NUX0xBTUVNUDNFTkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBBUkdfVEFSR0VUOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGxhbWUtPnRhcmdldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19CSVRSQVRFOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgbGFtZS0+Yml0cmF0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19DQlI6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgbGFtZS0+Y2JyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1FVQUxJVFk6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIGxhbWUtPnF1YWxpdHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfRU5DT0RJTkdfRU5HSU5FX1FVQUxJVFk6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgbGFtZS0+ZW5jb2RpbmdfZW5naW5lX3F1YWxpdHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfTU9OTzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBsYW1lLT5tb25vKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogKioqKiBjcmVkaXRzIGdvIHRvIG1wZWdhdWRpb3BhcnNlICoqKiogKi8KKworc3RhdGljIGNvbnN0IGd1aW50IG1wM3R5cGVzX2JpdHJhdGVzWzJdWzNdWzE2XSA9IHsKKyAgeworICAgICAgICB7MCwgMzIsIDY0LCA5NiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDI4OCwgMzIwLCAzNTIsIDM4NCwgNDE2LCA0NDgsfSwKKyAgICAgICAgezAsIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMCwgMzg0LH0sCisgICAgICAgIHswLCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLH0KKyAgICAgIH0sCisgIHsKKyAgICAgICAgezAsIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MCwgMTc2LCAxOTIsIDIyNCwgMjU2LH0sCisgICAgICAgIHswLCA4LCAxNiwgMjQsIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTQ0LCAxNjAsfSwKKyAgICAgICAgezAsIDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MCx9CisgICAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IGd1aW50IG1wM3R5cGVzX2ZyZXFzWzNdWzNdID0geyB7NDQxMDAsIDQ4MDAwLCAzMjAwMH0sCit7MjIwNTAsIDI0MDAwLCAxNjAwMH0sCit7MTEwMjUsIDEyMDAwLCA4MDAwfQorfTsKKworc3RhdGljIGlubGluZSBndWludAorbXAzX3R5cGVfZnJhbWVfbGVuZ3RoX2Zyb21faGVhZGVyIChHc3RMYW1lTVAzRW5jICogbGFtZSwgZ3VpbnQzMiBoZWFkZXIsCisgICAgZ3VpbnQgKiBwdXRfdmVyc2lvbiwgZ3VpbnQgKiBwdXRfbGF5ZXIsIGd1aW50ICogcHV0X2NoYW5uZWxzLAorICAgIGd1aW50ICogcHV0X2JpdHJhdGUsIGd1aW50ICogcHV0X3NhbXBsZXJhdGUsIGd1aW50ICogcHV0X21vZGUsCisgICAgZ3VpbnQgKiBwdXRfY3JjKQoreworICBndWludCBsZW5ndGg7CisgIGd1bG9uZyBtb2RlLCBzYW1wbGVyYXRlLCBiaXRyYXRlLCBsYXllciwgY2hhbm5lbHMsIHBhZGRpbmcsIGNyYzsKKyAgZ3Vsb25nIHZlcnNpb247CisgIGdpbnQgbHNmLCBtcGcyNTsKKworICBpZiAoaGVhZGVyICYgKDEgPDwgMjApKSB7CisgICAgbHNmID0gKGhlYWRlciAmICgxIDw8IDE5KSkgPyAwIDogMTsKKyAgICBtcGcyNSA9IDA7CisgIH0gZWxzZSB7CisgICAgbHNmID0gMTsKKyAgICBtcGcyNSA9IDE7CisgIH0KKworICB2ZXJzaW9uID0gMSArIGxzZiArIG1wZzI1OworCisgIGxheWVyID0gNCAtICgoaGVhZGVyID4+IDE3KSAmIDB4Myk7CisKKyAgY3JjID0gKGhlYWRlciA+PiAxNikgJiAweDE7CisKKyAgYml0cmF0ZSA9IChoZWFkZXIgPj4gMTIpICYgMHhGOworICBiaXRyYXRlID0gbXAzdHlwZXNfYml0cmF0ZXNbbHNmXVtsYXllciAtIDFdW2JpdHJhdGVdICogMTAwMDsKKyAgLyogVGhlIGNhbGxlciBoYXMgZW5zdXJlZCB3ZSBoYXZlIGEgdmFsaWQgaGVhZGVyLCBzbyBiaXRyYXRlIGNhbid0IGJlCisgICAgIHplcm8gaGVyZS4gKi8KKyAgZ19hc3NlcnQgKGJpdHJhdGUgIT0gMCk7CisKKyAgc2FtcGxlcmF0ZSA9IChoZWFkZXIgPj4gMTApICYgMHgzOworICBzYW1wbGVyYXRlID0gbXAzdHlwZXNfZnJlcXNbbHNmICsgbXBnMjVdW3NhbXBsZXJhdGVdOworCisgIHBhZGRpbmcgPSAoaGVhZGVyID4+IDkpICYgMHgxOworCisgIG1vZGUgPSAoaGVhZGVyID4+IDYpICYgMHgzOworICBjaGFubmVscyA9IChtb2RlID09IDMpID8gMSA6IDI7CisKKyAgc3dpdGNoIChsYXllcikgeworICAgIGNhc2UgMToKKyAgICAgIGxlbmd0aCA9IDQgKiAoKGJpdHJhdGUgKiAxMikgLyBzYW1wbGVyYXRlICsgcGFkZGluZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBsZW5ndGggPSAoYml0cmF0ZSAqIDE0NCkgLyBzYW1wbGVyYXRlICsgcGFkZGluZzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgY2FzZSAzOgorICAgICAgbGVuZ3RoID0gKGJpdHJhdGUgKiAxNDQpIC8gKHNhbXBsZXJhdGUgPDwgbHNmKSArIHBhZGRpbmc7CisgICAgICBicmVhazsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGxhbWUsICJDYWxjdWxhdGVkIG1wMyBmcmFtZSBsZW5ndGggb2YgJXUgYnl0ZXMiLCBsZW5ndGgpOworICBHU1RfREVCVUdfT0JKRUNUIChsYW1lLCAic2FtcGxlcmF0ZSA9ICVsdSwgYml0cmF0ZSA9ICVsdSwgdmVyc2lvbiA9ICVsdSwgIgorICAgICAgImxheWVyID0gJWx1LCBjaGFubmVscyA9ICVsdSIsIHNhbXBsZXJhdGUsIGJpdHJhdGUsIHZlcnNpb24sCisgICAgICBsYXllciwgY2hhbm5lbHMpOworCisgIGlmIChwdXRfdmVyc2lvbikKKyAgICAqcHV0X3ZlcnNpb24gPSB2ZXJzaW9uOworICBpZiAocHV0X2xheWVyKQorICAgICpwdXRfbGF5ZXIgPSBsYXllcjsKKyAgaWYgKHB1dF9jaGFubmVscykKKyAgICAqcHV0X2NoYW5uZWxzID0gY2hhbm5lbHM7CisgIGlmIChwdXRfYml0cmF0ZSkKKyAgICAqcHV0X2JpdHJhdGUgPSBiaXRyYXRlOworICBpZiAocHV0X3NhbXBsZXJhdGUpCisgICAgKnB1dF9zYW1wbGVyYXRlID0gc2FtcGxlcmF0ZTsKKyAgaWYgKHB1dF9tb2RlKQorICAgICpwdXRfbW9kZSA9IG1vZGU7CisgIGlmIChwdXRfY3JjKQorICAgICpwdXRfY3JjID0gY3JjOworCisgIHJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorbXAzX3N5bmNfY2hlY2sgKEdzdExhbWVNUDNFbmMgKiBsYW1lLCB1bnNpZ25lZCBsb25nIGhlYWQpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGxhbWUsICJjaGVja2luZyBtcDMgaGVhZGVyIDB4JTA4bHgiLCBoZWFkKTsKKyAgLyogaWYgaXQncyBub3QgYSB2YWxpZCBzeW5jICovCisgIGlmICgoaGVhZCAmIDB4ZmZlMDAwMDApICE9IDB4ZmZlMDAwMDApIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGxhbWUsICJpbnZhbGlkIHN5bmMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgLyogaWYgaXQncyBhbiBpbnZhbGlkIE1QRUcgdmVyc2lvbiAqLworICBpZiAoKChoZWFkID4+IDE5KSAmIDMpID09IDB4MSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobGFtZSwgImludmFsaWQgTVBFRyB2ZXJzaW9uOiAweCVseCIsIChoZWFkID4+IDE5KSAmIDMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICAvKiBpZiBpdCdzIGFuIGludmFsaWQgbGF5ZXIgKi8KKyAgaWYgKCEoKGhlYWQgPj4gMTcpICYgMykpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGxhbWUsICJpbnZhbGlkIGxheWVyOiAweCVseCIsIChoZWFkID4+IDE3KSAmIDMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICAvKiBpZiBpdCdzIGFuIGludmFsaWQgYml0cmF0ZSAqLworICBpZiAoKChoZWFkID4+IDEyKSAmIDB4ZikgPT0gMHgwKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChsYW1lLCAiaW52YWxpZCBiaXRyYXRlOiAweCVseC4iCisgICAgICAgICJGcmVlIGZvcm1hdCBmaWxlcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQiLCAoaGVhZCA+PiAxMikgJiAweGYpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoKChoZWFkID4+IDEyKSAmIDB4ZikgPT0gMHhmKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChsYW1lLCAiaW52YWxpZCBiaXRyYXRlOiAweCVseCIsIChoZWFkID4+IDEyKSAmIDB4Zik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIC8qIGlmIGl0J3MgYW4gaW52YWxpZCBzYW1wbGVyYXRlICovCisgIGlmICgoKGhlYWQgPj4gMTApICYgMHgzKSA9PSAweDMpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGxhbWUsICJpbnZhbGlkIHNhbXBsZXJhdGU6IDB4JWx4IiwgKGhlYWQgPj4gMTApICYgMHgzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoKGhlYWQgJiAweDMpID09IDB4MikgeworICAgIC8qIElnbm9yZSB0aGlzIGFzIHRoZXJlIGFyZSBzb21lIGZpbGVzIHdpdGggZW1waGFzaXMgMHgyIHRoYXQgY2FuCisgICAgICogYmUgcGxheWVkIGZpbmUuIFNlZSBCR08gIzUzNzIzNSAqLworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobGFtZSwgImludmFsaWQgZW1waGFzaXM6IDB4JWx4IiwgaGVhZCAmIDB4Myk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyogKioqKiBlbmQgbXBlZ2F1ZGlvcGFyc2UgKioqKiAqLworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2xhbWVtcDNlbmNfZmluaXNoX2ZyYW1lcyAoR3N0TGFtZU1QM0VuYyAqIGxhbWUpCit7CisgIGdpbnQgYXY7CisgIGd1aW50IGhlYWRlcjsKKyAgR3N0Rmxvd1JldHVybiByZXN1bHQgPSBHU1RfRkxPV19PSzsKKworICAvKiBsaW1pdGVkIHBhcnNpbmcsIHdlIGRvbid0IGV4cGVjdCB0byBsb3NlIHN5bmMgaGVyZSAqLworICB3aGlsZSAoKHJlc3VsdCA9PSBHU1RfRkxPV19PSykgJiYKKyAgICAgICgoYXYgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGxhbWUtPmFkYXB0ZXIpKSA+IDQpKSB7CisgICAgZ3VpbnQgcmF0ZSwgdmVyc2lvbiwgbGF5ZXIsIHNpemU7CisgICAgR3N0QnVmZmVyICptcDNfYnVmOworICAgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgICBndWludCBzYW1wbGVzX3Blcl9mcmFtZTsKKworICAgIGRhdGEgPSBnc3RfYWRhcHRlcl9tYXAgKGxhbWUtPmFkYXB0ZXIsIDQpOworICAgIGhlYWRlciA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoZGF0YSk7CisgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKGxhbWUtPmFkYXB0ZXIpOworCisgICAgaWYgKCFtcDNfc3luY19jaGVjayAobGFtZSwgaGVhZGVyKSkKKyAgICAgIGdvdG8gaW52YWxpZF9oZWFkZXI7CisKKyAgICBzaXplID0gbXAzX3R5cGVfZnJhbWVfbGVuZ3RoX2Zyb21faGVhZGVyIChsYW1lLCBoZWFkZXIsICZ2ZXJzaW9uLCAmbGF5ZXIsCisgICAgICAgIE5VTEwsIE5VTEwsICZyYXRlLCBOVUxMLCBOVUxMKTsKKworICAgIGlmIChHX1VOTElLRUxZIChsYXllciAhPSAzIHx8IHJhdGUgIT0gbGFtZS0+b3V0X3NhbXBsZXJhdGUpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChsYW1lLAorICAgICAgICAgICJ1bmV4cGVjdGVkIG1wMyBoZWFkZXIgd2l0aCByYXRlICV1LCB2ZXJzaW9uICV1LCBsYXllciAldSIsCisgICAgICAgICAgcmF0ZSwgdmVyc2lvbiwgbGF5ZXIpOworICAgICAgZ290byBpbnZhbGlkX2hlYWRlcjsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSA+IGF2KSB7CisgICAgICAvKiBwcmV0dHkgbGlrZWx5IHRvIG9jY3VyIHdoZW4gbGFtZSBpcyBob2xkaW5nIGJhY2sgb24gdXMgKi8KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChsYW1lLCAiZnJhbWUgc2l6ZSAldSAoPiAlZCkiLCBzaXplLCBhdik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBBY2NvdW50IGZvciB0aGUgaW50ZXJuYWwgcmVzYW1wbGluZywgZmluaXNoIGZyYW1lIHJlYWxseSB3YW50cyB0bworICAgICAqIGtub3cgYWJvdXQgdGhlIG51bWJlciBvZiBpbmNvbWluZyBzYW1wbGVzCisgICAgICovCisgICAgc2FtcGxlc19wZXJfZnJhbWUgPSAodmVyc2lvbiA9PSAxKSA/IDExNTIgOiA1NzY7CisgICAgc2FtcGxlc19wZXJfZnJhbWUgKj0gbGFtZS0+c2FtcGxlcmF0ZTsKKyAgICBzYW1wbGVzX3Blcl9mcmFtZSAvPSBsYW1lLT5vdXRfc2FtcGxlcmF0ZTsKKworICAgIC8qIHNob3VsZCBiZSBvayBub3cgKi8KKyAgICBtcDNfYnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGxhbWUtPmFkYXB0ZXIsIHNpemUpOworICAgIC8qIG51bWJlciBvZiBzYW1wbGVzIGZvciBNUEVHLTEsIGxheWVyIDMgKi8KKyAgICByZXN1bHQgPSBnc3RfYXVkaW9fZW5jb2Rlcl9maW5pc2hfZnJhbWUgKEdTVF9BVURJT19FTkNPREVSIChsYW1lKSwKKyAgICAgICAgbXAzX2J1Ziwgc2FtcGxlc19wZXJfZnJhbWUpOworICB9CisKK2V4aXQ6CisgIHJldHVybiByZXN1bHQ7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX2hlYWRlcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChsYW1lLCBTVFJFQU0sIEVOQ09ERSwKKyAgICAgICAgKCJpbnZhbGlkIGxhbWUgbXAzIHN5bmMgaGVhZGVyICUwOFgiLCBoZWFkZXIpLCAoTlVMTCkpOworICAgIHJlc3VsdCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2xhbWVtcDNlbmNfZmx1c2hfZnVsbCAoR3N0TGFtZU1QM0VuYyAqIGxhbWUsIGdib29sZWFuIHB1c2gpCit7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2ludCBzaXplOworICBHc3RGbG93UmV0dXJuIHJlc3VsdCA9IEdTVF9GTE9XX09LOworICBnaW50IGF2OworCisgIGlmICghbGFtZS0+bGdmKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDcyMDApOworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgc2l6ZSA9IGxhbWVfZW5jb2RlX2ZsdXNoIChsYW1lLT5sZ2YsIG1hcC5kYXRhLCA3MjAwKTsKKworICBpZiAoc2l6ZSA+IDApIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfcmVzaXplIChidWYsIDAsIHNpemUpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGxhbWUsICJjb2xsZWN0aW5nIGZpbmFsICVkIGJ5dGVzIiwgc2l6ZSk7CisgICAgZ3N0X2FkYXB0ZXJfcHVzaCAobGFtZS0+YWRhcHRlciwgYnVmKTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGxhbWUsICJubyBmaW5hbCBwYWNrZXQgKHNpemU9JWQsIHB1c2g9JWQpIiwgc2l6ZSwgcHVzaCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXN1bHQgPSBHU1RfRkxPV19PSzsKKyAgfQorCisgIGlmIChwdXNoKSB7CisgICAgcmVzdWx0ID0gZ3N0X2xhbWVtcDNlbmNfZmluaXNoX2ZyYW1lcyAobGFtZSk7CisgIH0gZWxzZSB7CisgICAgLyogbmV2ZXIgbWluZCAqLworICAgIGdzdF9hZGFwdGVyX2NsZWFyIChsYW1lLT5hZGFwdGVyKTsKKyAgfQorCisgIC8qIGVpdGhlciB3YXksIHdlIGV4cGVjdCBub3RoaW5nIGxlZnQgKi8KKyAgaWYgKChhdiA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAobGFtZS0+YWRhcHRlcikpKSB7CisgICAgLyogc2hvdWxkIHRoaXMgYmUgbW9yZSBmYXRhbCA/PyAqLworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobGFtZSwgInVucGFyc2VkICVkIGJ5dGVzIGxlZnQgYWZ0ZXIgZmx1c2hpbmciLCBhdik7CisgICAgLyogY2xlYW4gdXAgYW55d2F5ICovCisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGxhbWUtPmFkYXB0ZXIpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9sYW1lbXAzZW5jX2ZsdXNoIChHc3RBdWRpb0VuY29kZXIgKiBlbmMpCit7CisgIGdzdF9sYW1lbXAzZW5jX2ZsdXNoX2Z1bGwgKEdTVF9MQU1FTVAzRU5DIChlbmMpLCBGQUxTRSk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbGFtZW1wM2VuY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywgR3N0QnVmZmVyICogaW5fYnVmKQoreworICBHc3RMYW1lTVAzRW5jICpsYW1lOworICBnaW50IG1wM19idWZmZXJfc2l6ZSwgbXAzX3NpemU7CisgIEdzdEJ1ZmZlciAqbXAzX2J1ZjsKKyAgR3N0Rmxvd1JldHVybiByZXN1bHQ7CisgIGdpbnQgbnVtX3NhbXBsZXM7CisgIEdzdE1hcEluZm8gaW5fbWFwLCBtcDNfbWFwOworCisgIGxhbWUgPSBHU1RfTEFNRU1QM0VOQyAoZW5jKTsKKworICAvKiBzcXVlZXplIHJlbWFpbmluZyBhbmQgcHVzaCAqLworICBpZiAoR19VTkxJS0VMWSAoaW5fYnVmID09IE5VTEwpKQorICAgIHJldHVybiBnc3RfbGFtZW1wM2VuY19mbHVzaF9mdWxsIChsYW1lLCBUUlVFKTsKKworICBnc3RfYnVmZmVyX21hcCAoaW5fYnVmLCAmaW5fbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIG51bV9zYW1wbGVzID0gaW5fbWFwLnNpemUgLyAyOworCisgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciBvdXRwdXQgKi8KKyAgbXAzX2J1ZmZlcl9zaXplID0gMS4yNSAqIG51bV9zYW1wbGVzICsgNzIwMDsKKyAgbXAzX2J1ZiA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBtcDNfYnVmZmVyX3NpemUsIE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAobXAzX2J1ZiwgJm1wM19tYXAsIEdTVF9NQVBfV1JJVEUpOworCisgIC8qIGxhbWUgc2VlbXMgdG8gYmUgdG9vIHN0dXBpZCB0byBnZXQgbW9ubyBpbnRlcmxlYXZlZCBnb2luZyAqLworICBpZiAobGFtZS0+bnVtX2NoYW5uZWxzID09IDEpIHsKKyAgICBtcDNfc2l6ZSA9IGxhbWVfZW5jb2RlX2J1ZmZlciAobGFtZS0+bGdmLAorICAgICAgICAoc2hvcnQgaW50ICopIGluX21hcC5kYXRhLAorICAgICAgICAoc2hvcnQgaW50ICopIGluX21hcC5kYXRhLCBudW1fc2FtcGxlcywgbXAzX21hcC5kYXRhLCBtcDNfYnVmZmVyX3NpemUpOworICB9IGVsc2UgeworICAgIG1wM19zaXplID0gbGFtZV9lbmNvZGVfYnVmZmVyX2ludGVybGVhdmVkIChsYW1lLT5sZ2YsCisgICAgICAgIChzaG9ydCBpbnQgKikgaW5fbWFwLmRhdGEsCisgICAgICAgIG51bV9zYW1wbGVzIC8gbGFtZS0+bnVtX2NoYW5uZWxzLCBtcDNfbWFwLmRhdGEsIG1wM19idWZmZXJfc2l6ZSk7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5fYnVmLCAmaW5fbWFwKTsKKworICBHU1RfTE9HX09CSkVDVCAobGFtZSwgImVuY29kZWQgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyBvZiBhdWRpbyAiCisgICAgICAidG8gJWQgYnl0ZXMgb2YgbXAzIiwgaW5fbWFwLnNpemUsIG1wM19zaXplKTsKKworICBpZiAoR19MSUtFTFkgKG1wM19zaXplID4gMCkpIHsKKyAgICAvKiB1bmZvcnR1bmF0ZWx5IGxhbWUgZG9lcyBub3QgcHJvdmlkZSBmcmFtZSBkZWxpbmVhdGVkIG91dHB1dCwKKyAgICAgKiBzbyBjb2xsZWN0IG91dHB1dCBhbmQgcGFyc2UgaW50byBmcmFtZXMgLi4uICovCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAobXAzX2J1ZiwgJm1wM19tYXApOworICAgIGdzdF9idWZmZXJfcmVzaXplIChtcDNfYnVmLCAwLCBtcDNfc2l6ZSk7CisgICAgZ3N0X2FkYXB0ZXJfcHVzaCAobGFtZS0+YWRhcHRlciwgbXAzX2J1Zik7CisgICAgcmVzdWx0ID0gZ3N0X2xhbWVtcDNlbmNfZmluaXNoX2ZyYW1lcyAobGFtZSk7CisgIH0gZWxzZSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAobXAzX2J1ZiwgJm1wM19tYXApOworICAgIGlmIChtcDNfc2l6ZSA8IDApIHsKKyAgICAgIC8qIGVhdCBlcnJvciA/ICovCisgICAgICBnX3dhcm5pbmcgKCJlcnJvciAlZCIsIG1wM19zaXplKTsKKyAgICB9CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAobXAzX2J1Zik7CisgICAgcmVzdWx0ID0gR1NUX0ZMT1dfT0s7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBzZXQgdXAgdGhlIGVuY29kZXIgc3RhdGUgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2xhbWVtcDNlbmNfc2V0dXAgKEdzdExhbWVNUDNFbmMgKiBsYW1lLCBHc3RUYWdMaXN0ICoqIHRhZ3MpCit7CisgIGdib29sZWFuIHJlczsKKworI2RlZmluZSBDSEVDS19FUlJPUihjb21tYW5kKSBHX1NUTVRfU1RBUlQge1wKKyAgaWYgKChjb21tYW5kKSA8IDApIHsgXAorICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGxhbWUsICJzZXR1cCBmYWlsZWQ6ICIgR19TVFJJTkdJRlkgKGNvbW1hbmQpKTsgXAorICAgIGlmICgqdGFncykgeyBcCisgICAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKCp0YWdzKTsgXAorICAgICAgKnRhZ3MgPSBOVUxMOyBcCisgICAgfSBcCisgICAgcmV0dXJuIEZBTFNFOyBcCisgIH0gXAorfUdfU1RNVF9FTkQKKworICBpbnQgcmV0dmFsOworICBHc3RDYXBzICphbGxvd2VkX2NhcHM7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAobGFtZSwgInN0YXJ0aW5nIHNldHVwIik7CisKKyAgbGFtZS0+bGdmID0gbGFtZV9pbml0ICgpOworCisgIGlmIChsYW1lLT5sZ2YgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgKnRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgIC8qIGNvcHkgdGhlIHBhcmFtZXRlcnMgb3ZlciAqLworICBsYW1lX3NldF9pbl9zYW1wbGVyYXRlIChsYW1lLT5sZ2YsIGxhbWUtPnNhbXBsZXJhdGUpOworCisgIC8qIGxldCBsYW1lIGNob29zZSBkZWZhdWx0IHNhbXBsZXJhdGUgdW5sZXNzIG91dGdvaW5nIHNhbXBsZSByYXRlIGlzIGZpeGVkICovCisgIGFsbG93ZWRfY2FwcyA9IGdzdF9wYWRfZ2V0X2FsbG93ZWRfY2FwcyAoR1NUX0FVRElPX0VOQ09ERVJfU1JDX1BBRCAobGFtZSkpOworCisgIGlmIChhbGxvd2VkX2NhcHMgIT0gTlVMTCkgeworICAgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICAgIGdpbnQgc2FtcGxlcmF0ZTsKKworICAgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFsbG93ZWRfY2FwcywgMCk7CisKKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJyYXRlIiwgJnNhbXBsZXJhdGUpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChsYW1lLCAiU2V0dGluZyBzYW1wbGUgcmF0ZSB0byAlZCBhcyBmaXhlZCBpbiBzcmMgY2FwcyIsCisgICAgICAgICAgc2FtcGxlcmF0ZSk7CisgICAgICBsYW1lX3NldF9vdXRfc2FtcGxlcmF0ZSAobGFtZS0+bGdmLCBzYW1wbGVyYXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAobGFtZSwgIkxldHRpbmcgbGFtZSBjaG9vc2Ugc2FtcGxlIHJhdGUiKTsKKyAgICAgIGxhbWVfc2V0X291dF9zYW1wbGVyYXRlIChsYW1lLT5sZ2YsIDApOworICAgIH0KKyAgICBnc3RfY2Fwc191bnJlZiAoYWxsb3dlZF9jYXBzKTsKKyAgICBhbGxvd2VkX2NhcHMgPSBOVUxMOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGxhbWUsICJObyBwZWVyIHlldCwgbGV0dGluZyBsYW1lIGNob29zZSBzYW1wbGUgcmF0ZSIpOworICAgIGxhbWVfc2V0X291dF9zYW1wbGVyYXRlIChsYW1lLT5sZ2YsIDApOworICB9CisKKyAgQ0hFQ0tfRVJST1IgKGxhbWVfc2V0X251bV9jaGFubmVscyAobGFtZS0+bGdmLCBsYW1lLT5udW1fY2hhbm5lbHMpKTsKKyAgQ0hFQ0tfRVJST1IgKGxhbWVfc2V0X2JXcml0ZVZiclRhZyAobGFtZS0+bGdmLCAwKSk7CisKKyAgaWYgKGxhbWUtPnRhcmdldCA9PSBMQU1FTVAzRU5DX1RBUkdFVF9RVUFMSVRZKSB7CisgICAgQ0hFQ0tfRVJST1IgKGxhbWVfc2V0X1ZCUiAobGFtZS0+bGdmLCB2YnJfZGVmYXVsdCkpOworICAgIENIRUNLX0VSUk9SIChsYW1lX3NldF9WQlJfcXVhbGl0eSAobGFtZS0+bGdmLCBsYW1lLT5xdWFsaXR5KSk7CisgIH0gZWxzZSB7CisgICAgaWYgKGxhbWUtPmNicikgeworICAgICAgQ0hFQ0tfQU5EX0ZJWFVQX0JJVFJBVEUgKGxhbWUsICJiaXRyYXRlIiwgbGFtZS0+Yml0cmF0ZSk7CisgICAgICBDSEVDS19FUlJPUiAobGFtZV9zZXRfVkJSIChsYW1lLT5sZ2YsIHZicl9vZmYpKTsKKyAgICAgIENIRUNLX0VSUk9SIChsYW1lX3NldF9icmF0ZSAobGFtZS0+bGdmLCBsYW1lLT5iaXRyYXRlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENIRUNLX0VSUk9SIChsYW1lX3NldF9WQlIgKGxhbWUtPmxnZiwgdmJyX2FicikpOworICAgICAgQ0hFQ0tfRVJST1IgKGxhbWVfc2V0X1ZCUl9tZWFuX2JpdHJhdGVfa2JwcyAobGFtZS0+bGdmLCBsYW1lLT5iaXRyYXRlKSk7CisgICAgfQorICAgIGdzdF90YWdfbGlzdF9hZGQgKCp0YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIEdTVF9UQUdfQklUUkFURSwKKyAgICAgICAgbGFtZS0+Yml0cmF0ZSAqIDEwMDAsIE5VTEwpOworICB9CisKKyAgaWYgKGxhbWUtPmVuY29kaW5nX2VuZ2luZV9xdWFsaXR5ID09IExBTUVNUDNFTkNfRU5DT0RJTkdfRU5HSU5FX1FVQUxJVFlfRkFTVCkKKyAgICBDSEVDS19FUlJPUiAobGFtZV9zZXRfcXVhbGl0eSAobGFtZS0+bGdmLCA3KSk7CisgIGVsc2UgaWYgKGxhbWUtPmVuY29kaW5nX2VuZ2luZV9xdWFsaXR5ID09CisgICAgICBMQU1FTVAzRU5DX0VOQ09ESU5HX0VOR0lORV9RVUFMSVRZX0hJR0gpCisgICAgQ0hFQ0tfRVJST1IgKGxhbWVfc2V0X3F1YWxpdHkgKGxhbWUtPmxnZiwgMikpOworICAvKiBlbHNlIGRlZmF1bHQgKi8KKworICBpZiAobGFtZS0+bW9ubykKKyAgICBDSEVDS19FUlJPUiAobGFtZV9zZXRfbW9kZSAobGFtZS0+bGdmLCBNT05PKSk7CisKKyAgLyogaW5pdGlhbGl6ZSB0aGUgbGFtZSBlbmNvZGVyICovCisgIGlmICgocmV0dmFsID0gbGFtZV9pbml0X3BhcmFtcyAobGFtZS0+bGdmKSkgPj0gMCkgeworICAgIC8qIEZJWE1FOiBpdCB3b3VsZCBiZSBuaWNlIHRvIHByaW50IG91dCB0aGUgbW9kZSBoZXJlICovCisgICAgR1NUX0lORk8KKyAgICAgICAgKCJsYW1lIGVuY29kZXIgc2V0dXAgKHRhcmdldCAlcywgcXVhbGl0eSAlZiwgYml0cmF0ZSAlZCwgJWQgSHosICVkIGNoYW5uZWxzKSIsCisgICAgICAgIChsYW1lLT50YXJnZXQgPT0gTEFNRU1QM0VOQ19UQVJHRVRfUVVBTElUWSkgPyAicXVhbGl0eSIgOiAiYml0cmF0ZSIsCisgICAgICAgIGxhbWUtPnF1YWxpdHksIGxhbWUtPmJpdHJhdGUsIGxhbWUtPnNhbXBsZXJhdGUsIGxhbWUtPm51bV9jaGFubmVscyk7CisgICAgcmVzID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChsYW1lLCAibGFtZV9pbml0X3BhcmFtcyByZXR1cm5lZCAlZCIsIHJldHZhbCk7CisgICAgcmVzID0gRkFMU0U7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChsYW1lLCAiZG9uZSB3aXRoIHNldHVwIik7CisgIHJldHVybiByZXM7CisjdW5kZWYgQ0hFQ0tfRVJST1IKK30KKworZ2Jvb2xlYW4KK2dzdF9sYW1lbXAzZW5jX3JlZ2lzdGVyIChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChkZWJ1ZywgImxhbWVtcDNlbmMiLCAwLCAibGFtZSBtcDMgZW5jb2RlciIpOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImxhbWVtcDNlbmMiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX0xBTUVNUDNFTkMpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2V4dC9sYW1lL2dzdGxhbWVtcDNlbmMuaCBiL2V4dC9sYW1lL2dzdGxhbWVtcDNlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWRiYzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2xhbWUvZ3N0bGFtZW1wM2VuYy5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9MQU1FTVAzRU5DX0hfXworI2RlZmluZSBfX0dTVF9MQU1FTVAzRU5DX0hfXworCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZW5jb2Rlci5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8bGFtZS9sYW1lLmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfTEFNRU1QM0VOQyBcCisgIChnc3RfbGFtZW1wM2VuY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfTEFNRU1QM0VOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0xBTUVNUDNFTkMsR3N0TGFtZU1QM0VuYykpCisjZGVmaW5lIEdTVF9MQU1FTVAzRU5DX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0xBTUVNUDNFTkMsR3N0TGFtZU1QM0VuY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0xBTUVNUDNFTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9MQU1FTVAzRU5DKSkKKyNkZWZpbmUgR1NUX0lTX0xBTUVNUDNFTkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfTEFNRU1QM0VOQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RMYW1lTVAzRW5jIEdzdExhbWVNUDNFbmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0TGFtZU1QM0VuY0NsYXNzIEdzdExhbWVNUDNFbmNDbGFzczsKKworLyoqCisgKiBHc3RMYW1lTVAzRW5jOgorICoKKyAqIE9wYXF1ZSBkYXRhIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RMYW1lTVAzRW5jIHsKKyAgR3N0QXVkaW9FbmNvZGVyIGVsZW1lbnQ7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIGdpbnQgc2FtcGxlcmF0ZTsKKyAgZ2ludCBvdXRfc2FtcGxlcmF0ZTsKKyAgZ2ludCBudW1fY2hhbm5lbHM7CisKKyAgLyogcHJvcGVydGllcyAqLworICBnaW50IHRhcmdldDsKKyAgZ2ludCBiaXRyYXRlOworICBnYm9vbGVhbiBjYnI7CisgIGdmbG9hdCBxdWFsaXR5OworICBnaW50IGVuY29kaW5nX2VuZ2luZV9xdWFsaXR5OworICBnYm9vbGVhbiBtb25vOworCisgIGxhbWVfZ2xvYmFsX2ZsYWdzICpsZ2Y7CisKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKK307CisKK3N0cnVjdCBfR3N0TGFtZU1QM0VuY0NsYXNzIHsKKyAgR3N0QXVkaW9FbmNvZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2xhbWVtcDNlbmNfZ2V0X3R5cGUodm9pZCk7CitnYm9vbGVhbiBnc3RfbGFtZW1wM2VuY19yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0xBTUVNUDNFTkNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvbGFtZS9tZXNvbi5idWlsZCBiL2V4dC9sYW1lL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZTYxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbGFtZS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDE5IEBACitsYW1lX2RlcCA9IGNjLmZpbmRfbGlicmFyeSgnbXAzbGFtZScsIHJlcXVpcmVkIDogZmFsc2UpCisKK2lmIGxhbWVfZGVwLmZvdW5kKCkgYW5kIGNjLmhhc19oZWFkZXJfc3ltYm9sKCdsYW1lL2xhbWUuaCcsICdsYW1lX2luaXQnKQorICBsYW1lX2V4dHJhX2NfYXJncyA9IFtdCisgIGlmIGNjLmhhc19oZWFkZXJfc3ltYm9sKCdsYW1lL2xhbWUuaCcsICdsYW1lX3NldF9WQlJfcXVhbGl0eScpCisgICAgbGFtZV9leHRyYV9jX2FyZ3MgKz0gWyctREhBVkVfTEFNRV9TRVRfVkJSX1FVQUxJVFknXQorICBlbmRpZgorICBpZiBjYy5oYXNfaGVhZGVyX3N5bWJvbCgnbGFtZS9sYW1lLmgnLCAnTUVESVVNJykKKyAgICBsYW1lX2V4dHJhX2NfYXJncyArPSBbJy1ER1NUTEFNRV9QUkVTRVQnXQorICBlbmRpZgorICBsYW1lID0gbGlicmFyeSgnZ3N0bGFtZScsCisgICAgWydnc3RsYW1lbXAzZW5jLmMnLCAncGx1Z2luLmMnXSwKKyAgICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MgKyBsYW1lX2V4dHJhX2NfYXJncywKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgICAgZGVwZW5kZW5jaWVzIDogW2dzdGF1ZGlvX2RlcCwgbGFtZV9kZXBdLAorICAgIGluc3RhbGwgOiB0cnVlLAorICAgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKyAgKQorZW5kaWYKZGlmZiAtLWdpdCBhL2V4dC9sYW1lL3BsdWdpbi5jIGIvZXh0L2xhbWUvcGx1Z2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhZTIxZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9sYW1lL3BsdWdpbi5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworI2luY2x1ZGUgImdzdGxhbWVtcDNlbmMuaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworI2lmZGVmIEVOQUJMRV9OTFMKKyAgYmluZHRleHRkb21haW4gKEdFVFRFWFRfUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKEdFVFRFWFRfUEFDS0FHRSwgIlVURi04Iik7CisjZW5kaWYgLyogRU5BQkxFX05MUyAqLworCisgIHJldHVybiBnc3RfbGFtZW1wM2VuY19yZWdpc3RlciAocGx1Z2luKTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGxhbWUsCisgICAgIkVuY29kZSBNUDNzIHdpdGggTEFNRSIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKTsKZGlmZiAtLWdpdCBhL2V4dC9saWJjYWNhL01ha2VmaWxlLmFtIGIvZXh0L2xpYmNhY2EvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzNzFlMwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9saWJjYWNhL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTcgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGNhY2FzaW5rLmxhCisKK2xpYmdzdGNhY2FzaW5rX2xhX1NPVVJDRVMgPSBnc3RjYWNhc2luay5jCitsaWJnc3RjYWNhc2lua19sYV9DRkxBR1MgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgXAorCSQoR1NUX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQ0ZMQUdTKSBcCisJJChMSUJDQUNBX0NGTEFHUykKK2xpYmdzdGNhY2FzaW5rX2xhX0xJQkFERCA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgXAorCS1sZ3N0dmlkZW8tJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9CQVNFX0xJQlMpIFwKKwkkKEdTVF9MSUJTKSBcCisJJChMSUJDQUNBX0xJQlMpCitsaWJnc3RjYWNhc2lua19sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0Y2FjYXNpbmsuaApkaWZmIC0tZ2l0IGEvZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuYyBiL2V4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmYjUyYQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmMKQEAgLTAsMCArMSw0MTkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtY2FjYXNpbmsKKyAqIEBzZWVfYWxzbzogI0dzdEFBU2luaworICoKKyAqIERpc3BsYXlzIHZpZGVvIGFzIGNvbG9yIGFzY2lpIGFydC4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogQ0FDQV9HRU9NRVRSWT0xNjB4NjAgQ0FDQV9GT05UPTV4NyBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXRlc3QuYXZpICEgZGVjb2RlYmluICEgdmlkZW9jb252ZXJ0ICEgY2FjYXNpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgcmVuZGVycyBhIHZpZGVvIHRvIGFzY2lpIGFydCBpbnRvIGEgc2VwYXJhdGUgd2luZG93IHVzaW5nIGEKKyAqIHNtYWxsIGZvbnQgYW5kIHNwZWNpZnlpbmcgdGhlIGFzY2lpIHJlc29sdXRpb24uCisgKiB8WworICogQ0FDQV9EUklWRVI9bmN1cnNlcyBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXRlc3QuYXZpICEgZGVjb2RlYmluICEgdmlkZW9jb252ZXJ0ICEgY2FjYXNpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgcmVuZGVycyBhIHZpZGVvIHRvIGFzY2lpIGFydCBpbnRvIHRoZSBjdXJyZW50IHRlcm1pbmFsLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnc3RjYWNhc2luay5oIgorCisKKy8vI2RlZmluZSBHU1RfQ0FDQV9ERUZBVUxUX1JFRF9NQVNLIFJfTUFTS18zMl9SRVZFUlNFX0lOVAorLy8jZGVmaW5lIEdTVF9DQUNBX0RFRkFVTFRfR1JFRU5fTUFTSyBHX01BU0tfMzJfUkVWRVJTRV9JTlQKKy8vI2RlZmluZSBHU1RfQ0FDQV9ERUZBVUxUX0JMVUVfTUFTSyBCX01BU0tfMzJfUkVWRVJTRV9JTlQKKworLyogY2FjYXNpbmsgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICBMQVNUX1NJR05BTAorfTsKKworI2RlZmluZSBHU1RfQ0FDQV9ERUZBVUxUX1NDUkVFTl9XSURUSCA4MAorI2RlZmluZSBHU1RfQ0FDQV9ERUZBVUxUX1NDUkVFTl9IRUlHSFQgMjUKKyNkZWZpbmUgR1NUX0NBQ0FfREVGQVVMVF9ESVRIRVIgQ0FDQV9ESVRIRVJJTkdfTk9ORQorI2RlZmluZSBHU1RfQ0FDQV9ERUZBVUxUX0FOVElBTElBU0lORyBUUlVFCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX1NDUkVFTl9XSURUSCwKKyAgUFJPUF9TQ1JFRU5fSEVJR0hULAorICBQUk9QX0RJVEhFUiwKKyAgUFJPUF9BTlRJQUxJQVNJTkcKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFCisgICAgICAgICgieyBSR0IsIEJHUiwgUkdCeCwgeFJHQiwgQkdSeCwgeEJHUiwgUkdCMTYsIFJHQjE1IH0iKSkKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2NhY2FzaW5rX3NldGNhcHMgKEdzdEJhc2VTaW5rICogcGFkLCBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgdm9pZCBnc3RfY2FjYXNpbmtfZ2V0X3RpbWVzIChHc3RCYXNlU2luayAqIHNpbmssIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBHc3RDbG9ja1RpbWUgKiBzdGFydCwgR3N0Q2xvY2tUaW1lICogZW5kKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9jYWNhc2lua19yZW5kZXIgKEdzdEJhc2VTaW5rICogYmFzZXNpbmssCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworc3RhdGljIHZvaWQgZ3N0X2NhY2FzaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9jYWNhc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfY2FjYXNpbmtfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworI2RlZmluZSBnc3RfY2FjYXNpbmtfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0Q0FDQVNpbmssIGdzdF9jYWNhc2luaywgR1NUX1RZUEVfQkFTRV9TSU5LKTsKKworI2RlZmluZSBHU1RfVFlQRV9DQUNBRElUSEVSIChnc3RfY2FjYXNpbmtfZGl0aGVyX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9jYWNhc2lua19kaXRoZXJfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBkaXRoZXJfdHlwZSA9IDA7CisKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgZGl0aGVyX3R5cGVzW10gPSB7CisgICAge0NBQ0FfRElUSEVSSU5HX05PTkUsICJObyBkaXRoZXJpbmciLCAibm9uZSJ9LAorICAgIHtDQUNBX0RJVEhFUklOR19PUkRFUkVEMiwgIk9yZGVyZWQgMngyIEJheWVyIGRpdGhlcmluZyIsICIyeDIifSwKKyAgICB7Q0FDQV9ESVRIRVJJTkdfT1JERVJFRDQsICJPcmRlcmVkIDR4NCBCYXllciBkaXRoZXJpbmciLCAiNHg0In0sCisgICAge0NBQ0FfRElUSEVSSU5HX09SREVSRUQ4LCAiT3JkZXJlZCA4eDggQmF5ZXIgZGl0aGVyaW5nIiwgIjh4OCJ9LAorICAgIHtDQUNBX0RJVEhFUklOR19SQU5ET00sICJSYW5kb20gZGl0aGVyaW5nIiwgInJhbmRvbSJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIWRpdGhlcl90eXBlKSB7CisgICAgZGl0aGVyX3R5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0Q0FDQVNpbmtEaXRoZXJpbmciLCBkaXRoZXJfdHlwZXMpOworICB9CisgIHJldHVybiBkaXRoZXJfdHlwZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9jYWNhc2lua19jbGFzc19pbml0IChHc3RDQUNBU2lua0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCYXNlU2lua0NsYXNzICpnc3RiYXNlc2lua19jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdGJhc2VzaW5rX2NsYXNzID0gKEdzdEJhc2VTaW5rQ2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2NhY2FzaW5rX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2NhY2FzaW5rX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1NDUkVFTl9XSURUSCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJzY3JlZW4td2lkdGgiLCAiU2NyZWVuIFdpZHRoIiwKKyAgICAgICAgICAiVGhlIHdpZHRoIG9mIHRoZSBzY3JlZW4iLCAwLCBHX01BWElOVCwgR1NUX0NBQ0FfREVGQVVMVF9TQ1JFRU5fV0lEVEgsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9TQ1JFRU5fSEVJR0hULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInNjcmVlbi1oZWlnaHQiLCAiU2NyZWVuIEhlaWdodCIsCisgICAgICAgICAgIlRoZSBoZWlnaHQgb2YgdGhlIHNjcmVlbiIsIDAsIEdfTUFYSU5ULAorICAgICAgICAgIEdTVF9DQUNBX0RFRkFVTFRfU0NSRUVOX0hFSUdIVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0RJVEhFUiwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgiZGl0aGVyIiwgIkRpdGhlciBUeXBlIiwgIlNldCB0eXBlIG9mIERpdGhlciIsCisgICAgICAgICAgR1NUX1RZUEVfQ0FDQURJVEhFUiwgR1NUX0NBQ0FfREVGQVVMVF9ESVRIRVIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQU5USUFMSUFTSU5HLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJhbnRpLWFsaWFzaW5nIiwgIkFudGkgQWxpYXNpbmciLAorICAgICAgICAgICJFbmFibGVzIEFudGktQWxpYXNpbmciLCBHU1RfQ0FDQV9ERUZBVUxUX0FOVElBTElBU0lORywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfY2FjYXNpbmtfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiQSBjb2xvcmVkIEFTQ0lJIGFydCB2aWRlbyBzaW5rIiwgIlNpbmsvVmlkZW8iLAorICAgICAgIkEgY29sb3JlZCBBU0NJSSBhcnQgdmlkZW9zaW5rIiwgIlplZXNoYW4gQWxpIDx6YWsxNDdAeWFob28uY29tPiIpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworCisgIGdzdGJhc2VzaW5rX2NsYXNzLT5zZXRfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfY2FjYXNpbmtfc2V0Y2Fwcyk7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5nZXRfdGltZXMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2NhY2FzaW5rX2dldF90aW1lcyk7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5wcmVyb2xsID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9jYWNhc2lua19yZW5kZXIpOworICBnc3RiYXNlc2lua19jbGFzcy0+cmVuZGVyID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9jYWNhc2lua19yZW5kZXIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2NhY2FzaW5rX2dldF90aW1lcyAoR3N0QmFzZVNpbmsgKiBzaW5rLCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgR3N0Q2xvY2tUaW1lICogc3RhcnQsIEdzdENsb2NrVGltZSAqIGVuZCkKK3sKKyAgKnN0YXJ0ID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcik7CisgICplbmQgPSAqc3RhcnQgKyBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9jYWNhc2lua19zZXRjYXBzIChHc3RCYXNlU2luayAqIGJhc2VzaW5rLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0Q0FDQVNpbmsgKmNhY2FzaW5rOworICBHc3RWaWRlb0luZm8gaW5mbzsKKyAgZ3VpbnQgYnBwLCByZWRfbWFzaywgZ3JlZW5fbWFzaywgYmx1ZV9tYXNrOworCisgIGNhY2FzaW5rID0gR1NUX0NBQ0FTSU5LIChiYXNlc2luayk7CisKKyAgaWYgKCFnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKSkKKyAgICBnb3RvIGNhcHNfZXJyb3I7CisKKyAgc3dpdGNoIChHU1RfVklERU9fSU5GT19GT1JNQVQgKCZpbmZvKSkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCeDoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeFJHQjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSeDoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeEJHUjoKKyAgICAgIGJwcCA9IDggKiBpbmZvLmZpbmZvLT5waXhlbF9zdHJpZGVbMF07CisgICAgICByZWRfbWFzayA9IDB4ZmYgPDwgKDggKiBpbmZvLmZpbmZvLT5wb2Zmc2V0W0dTVF9WSURFT19DT01QX1JdKTsKKyAgICAgIGdyZWVuX21hc2sgPSAweGZmIDw8ICg4ICogaW5mby5maW5mby0+cG9mZnNldFtHU1RfVklERU9fQ09NUF9HXSk7CisgICAgICBibHVlX21hc2sgPSAweGZmIDw8ICg4ICogaW5mby5maW5mby0+cG9mZnNldFtHU1RfVklERU9fQ09NUF9CXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCMTY6CisgICAgICBicHAgPSAxNjsKKyAgICAgIHJlZF9tYXNrID0gMHhmODAwOworICAgICAgZ3JlZW5fbWFzayA9IDB4MDdlMDsKKyAgICAgIGJsdWVfbWFzayA9IDB4MDAxZjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0IxNToKKyAgICAgIGJwcCA9IDE2OworICAgICAgcmVkX21hc2sgPSAweDdjMDA7CisgICAgICBncmVlbl9tYXNrID0gMHgwM2UwOworICAgICAgYmx1ZV9tYXNrID0gMHgwMDFmOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdvdG8gaW52YWxpZF9mb3JtYXQ7CisgIH0KKworICBpZiAoY2FjYXNpbmstPmJpdG1hcCkgeworICAgIGNhY2FfZnJlZV9iaXRtYXAgKGNhY2FzaW5rLT5iaXRtYXApOworICB9CisgIGNhY2FzaW5rLT5iaXRtYXAgPSBjYWNhX2NyZWF0ZV9iaXRtYXAgKGJwcCwKKyAgICAgIEdTVF9WSURFT19JTkZPX1dJRFRIICgmaW5mbyksCisgICAgICBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZpbmZvKSwKKyAgICAgIEdTVF9ST1VORF9VUF80IChHU1RfVklERU9fSU5GT19XSURUSCAoJmluZm8pICogYnBwIC8gOCksCisgICAgICByZWRfbWFzaywgZ3JlZW5fbWFzaywgYmx1ZV9tYXNrLCAwKTsKKyAgaWYgKCFjYWNhc2luay0+Yml0bWFwKQorICAgIGdvdG8gbm9fYml0bWFwOworCisgIGNhY2FzaW5rLT5pbmZvID0gaW5mbzsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUyAqLworY2Fwc19lcnJvcjoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNhY2FzaW5rLCAiZXJyb3IgcGFyc2luZyBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbnZhbGlkX2Zvcm1hdDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNhY2FzaW5rLCAiaW52YWxpZCBmb3JtYXQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX2JpdG1hcDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNhY2FzaW5rLCAiY291bGQgbm90IGNyZWF0ZSBiaXRtYXAiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9jYWNhc2lua19pbml0IChHc3RDQUNBU2luayAqIGNhY2FzaW5rKQoreworICBjYWNhc2luay0+c2NyZWVuX3dpZHRoID0gR1NUX0NBQ0FfREVGQVVMVF9TQ1JFRU5fV0lEVEg7CisgIGNhY2FzaW5rLT5zY3JlZW5faGVpZ2h0ID0gR1NUX0NBQ0FfREVGQVVMVF9TQ1JFRU5fSEVJR0hUOworCisgIGNhY2FzaW5rLT5kaXRoZXIgPSBHU1RfQ0FDQV9ERUZBVUxUX0RJVEhFUjsKKyAgY2FjYXNpbmstPmFudGlhbGlhc2luZyA9IEdTVF9DQUNBX0RFRkFVTFRfQU5USUFMSUFTSU5HOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2NhY2FzaW5rX3JlbmRlciAoR3N0QmFzZVNpbmsgKiBiYXNlc2luaywgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RDQUNBU2luayAqY2FjYXNpbmsgPSBHU1RfQ0FDQVNJTksgKGJhc2VzaW5rKTsKKyAgR3N0VmlkZW9GcmFtZSBmcmFtZTsKKworICBHU1RfREVCVUcgKCJyZW5kZXIiKTsKKworICBpZiAoIWdzdF92aWRlb19mcmFtZV9tYXAgKCZmcmFtZSwgJmNhY2FzaW5rLT5pbmZvLCBidWZmZXIsIEdTVF9NQVBfUkVBRCkpCisgICAgZ290byBpbnZhbGlkX2ZyYW1lOworCisgIGNhY2FfY2xlYXIgKCk7CisgIGNhY2FfZHJhd19iaXRtYXAgKDAsIDAsIGNhY2FzaW5rLT5zY3JlZW5fd2lkdGggLSAxLAorICAgICAgY2FjYXNpbmstPnNjcmVlbl9oZWlnaHQgLSAxLCBjYWNhc2luay0+Yml0bWFwLAorICAgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKCZmcmFtZSwgMCkpOworICBjYWNhX3JlZnJlc2ggKCk7CisKKyAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmZnJhbWUpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfZnJhbWU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChjYWNhc2luaywgImludmFsaWQgZnJhbWUgcmVjZWl2ZWQiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9jYWNhc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0Q0FDQVNpbmsgKmNhY2FzaW5rOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19DQUNBU0lOSyAob2JqZWN0KSk7CisKKyAgY2FjYXNpbmsgPSBHU1RfQ0FDQVNJTksgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RJVEhFUjp7CisgICAgICBjYWNhc2luay0+ZGl0aGVyID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgY2FjYV9zZXRfZGl0aGVyaW5nIChjYWNhc2luay0+ZGl0aGVyICsgQ0FDQV9ESVRIRVJJTkdfTk9ORSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0FOVElBTElBU0lORzp7CisgICAgICBjYWNhc2luay0+YW50aWFsaWFzaW5nID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgaWYgKGNhY2FzaW5rLT5hbnRpYWxpYXNpbmcpIHsKKyAgICAgICAgY2FjYV9zZXRfZmVhdHVyZSAoQ0FDQV9BTlRJQUxJQVNJTkdfTUFYKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNhY2Ffc2V0X2ZlYXR1cmUgKENBQ0FfQU5USUFMSUFTSU5HX01JTik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfY2FjYXNpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdENBQ0FTaW5rICpjYWNhc2luazsKKworICBjYWNhc2luayA9IEdTVF9DQUNBU0lOSyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU0NSRUVOX1dJRFRIOnsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGNhY2FzaW5rLT5zY3JlZW5fd2lkdGgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9TQ1JFRU5fSEVJR0hUOnsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGNhY2FzaW5rLT5zY3JlZW5faGVpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfRElUSEVSOnsKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBjYWNhc2luay0+ZGl0aGVyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfQU5USUFMSUFTSU5HOnsKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBjYWNhc2luay0+YW50aWFsaWFzaW5nKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OnsKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfY2FjYXNpbmtfb3BlbiAoR3N0Q0FDQVNpbmsgKiBjYWNhc2luaykKK3sKKyAgY2FjYXNpbmstPmJpdG1hcCA9IE5VTEw7CisKKyAgaWYgKGNhY2FfaW5pdCAoKSA8IDApCisgICAgZ290byBpbml0X2ZhaWxlZDsKKworICBjYWNhc2luay0+c2NyZWVuX3dpZHRoID0gY2FjYV9nZXRfd2lkdGggKCk7CisgIGNhY2FzaW5rLT5zY3JlZW5faGVpZ2h0ID0gY2FjYV9nZXRfaGVpZ2h0ICgpOworICBjYWNhc2luay0+YW50aWFsaWFzaW5nID0gVFJVRTsKKyAgY2FjYV9zZXRfZmVhdHVyZSAoQ0FDQV9BTlRJQUxJQVNJTkdfTUFYKTsKKyAgY2FjYXNpbmstPmRpdGhlciA9IDA7CisgIGNhY2Ffc2V0X2RpdGhlcmluZyAoQ0FDQV9ESVRIRVJJTkdfTk9ORSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitpbml0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChjYWNhc2luaywgUkVTT1VSQ0UsIE9QRU5fV1JJVEUsIChOVUxMKSwKKyAgICAgICAgKCJjYWNhX2luaXQoKSBmYWlsZWQiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfY2FjYXNpbmtfY2xvc2UgKEdzdENBQ0FTaW5rICogY2FjYXNpbmspCit7CisgIGlmIChjYWNhc2luay0+Yml0bWFwKSB7CisgICAgY2FjYV9mcmVlX2JpdG1hcCAoY2FjYXNpbmstPmJpdG1hcCk7CisgICAgY2FjYXNpbmstPmJpdG1hcCA9IE5VTEw7CisgIH0KKyAgY2FjYV9lbmQgKCk7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2NhY2FzaW5rX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgaWYgKCFnc3RfY2FjYXNpbmtfb3BlbiAoR1NUX0NBQ0FTSU5LIChlbGVtZW50KSkpCisgICAgICAgIHJldHVybiBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X2NhY2FzaW5rX2Nsb3NlIChHU1RfQ0FDQVNJTksgKGVsZW1lbnQpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImNhY2FzaW5rIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9DQUNBU0lOSykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgY2FjYXNpbmssCisgICAgIkNvbG9yZWQgQVNDSUkgQXJ0IHZpZGVvIHNpbmsiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZXh0L2xpYmNhY2EvZ3N0Y2FjYXNpbmsuaCBiL2V4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI3YTZhOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9saWJjYWNhL2dzdGNhY2FzaW5rLmgKQEAgLTAsMCArMSw3MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9DQUNBU0lOS19IX18KKyNkZWZpbmUgX19HU1RfQ0FDQVNJTktfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXNpbmsuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworI2luY2x1ZGUgPGNhY2EuaD4KKyNpZmRlZiBDQUNBX0FQSV9WRVJTSU9OXzEKKyMgICBpbmNsdWRlIDxjYWNhMC5oPgorI2VuZGlmCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9DQUNBU0lOSyBcCisgIChnc3RfY2FjYXNpbmtfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0NBQ0FTSU5LKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQ0FDQVNJTkssR3N0Q0FDQVNpbmspKQorI2RlZmluZSBHU1RfQ0FDQVNJTktfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfQ0FDQVNJTkssR3N0Q0FDQVNpbmtDbGFzcykpCisjZGVmaW5lIEdTVF9JU19DQUNBU0lOSyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0NBQ0FTSU5LKSkKKyNkZWZpbmUgR1NUX0lTX0NBQ0FTSU5LX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0NBQ0FTSU5LKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdENBQ0FTaW5rIEdzdENBQ0FTaW5rOwordHlwZWRlZiBzdHJ1Y3QgX0dzdENBQ0FTaW5rQ2xhc3MgR3N0Q0FDQVNpbmtDbGFzczsKKworc3RydWN0IF9Hc3RDQUNBU2luayB7CisgIEdzdEJhc2VTaW5rIHBhcmVudDsKKworICBHc3RWaWRlb0luZm8gaW5mbzsKKyAgZ2ludCBzY3JlZW5fd2lkdGgsIHNjcmVlbl9oZWlnaHQ7CisKKyAgZ3VpbnQgZGl0aGVyOworICBnYm9vbGVhbiBhbnRpYWxpYXNpbmc7CisKKyAgc3RydWN0IGNhY2FfYml0bWFwICpiaXRtYXA7Cit9OworCitzdHJ1Y3QgX0dzdENBQ0FTaW5rQ2xhc3MgeworICBHc3RCYXNlU2lua0NsYXNzIHBhcmVudF9jbGFzczsKKworICAvKiBzaWduYWxzICovCit9OworCitHVHlwZSBnc3RfY2FjYXNpbmtfZ2V0X3R5cGUodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9DQUNBU0lOS19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9saWJjYWNhL21lc29uLmJ1aWxkIGIvZXh0L2xpYmNhY2EvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZmODcxNAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9saWJjYWNhL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTEgQEAKK2xpYmNhY2FfZGVwID0gZGVwZW5kZW5jeSgnY2FjYScsIHJlcXVpcmVkIDogZmFsc2UpCisKK2lmIGxpYmNhY2FfZGVwLmZvdW5kKCkKKyAgbGlicmFyeSgnZ3N0Y2FjYXNpbmsnLCAnZ3N0Y2FjYXNpbmsuYycsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgIGxpbmtfYXJncyA6IG5vc2VoX2xpbmtfYXJncywKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgICAgZGVwZW5kZW5jaWVzIDogW2dzdHZpZGVvX2RlcCwgZ3N0YmFzZV9kZXAsIGxpYmNhY2FfZGVwXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIpCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L2xpYnBuZy9NYWtlZmlsZS5hbSBiL2V4dC9saWJwbmcvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk4YzhlMwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9saWJwbmcvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw5IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RwbmcubGEKKworbGliZ3N0cG5nX2xhX1NPVVJDRVMgPSBnc3RwbmcuYyBnc3RwbmdlbmMuYyBnc3RwbmdkZWMuYworbGliZ3N0cG5nX2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoTElCUE5HX0NGTEFHUykKK2xpYmdzdHBuZ19sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R2aWRlby1AR1NUX0FQSV9WRVJTSU9OQCBcCisJJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKExJQlBOR19MSUJTKQorbGliZ3N0cG5nX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RwbmdkZWMuaCBnc3RwbmdlbmMuaApkaWZmIC0tZ2l0IGEvZXh0L2xpYnBuZy9nc3RwbmcuYyBiL2V4dC9saWJwbmcvZ3N0cG5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmZjQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9saWJwbmcvZ3N0cG5nLmMKQEAgLTAsMCArMSw0NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIEZpbHRlcjoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBEb25hbGQgQS4gR3JhZnQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnc3RwbmdkZWMuaCIKKyNpbmNsdWRlICJnc3RwbmdlbmMuaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJwbmdkZWMiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX1BOR0RFQykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInBuZ2VuYyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICAgR1NUX1RZUEVfUE5HRU5DKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBwbmcsCisgICAgIlBORyBwbHVnaW4gbGlicmFyeSIsIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsCisgICAgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZXh0L2xpYnBuZy9nc3RwbmcuaCBiL2V4dC9saWJwbmcvZ3N0cG5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNjOGFmYwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9saWJwbmcvZ3N0cG5nLmgKQEAgLTAsMCArMSwyNSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIEZpbHRlcjoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBEb25hbGQgQS4gR3JhZnQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPHBuZy5oPgorCitHVHlwZSBnc3RfcG5nZW5jX2dldF90eXBlICh2b2lkKTsKKworZXh0ZXJuIEdzdFBhZFRlbXBsYXRlICpnc3RfcG5nX3NpbmtfZmFjdG9yeSAoKTsKK2V4dGVybiBHc3RQYWRUZW1wbGF0ZSAqZ3N0X3BuZ19zcmNfZmFjdG9yeSAoKTsKZGlmZiAtLWdpdCBhL2V4dC9saWJwbmcvZ3N0cG5nZGVjLmMgYi9leHQvbGlicG5nL2dzdHBuZ2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MWUzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbGlicG5nL2dzdHBuZ2RlYy5jCkBAIC0wLDAgKzEsNzA4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgQ29sbGFib3JhIEx0ZC4KKyAqCUF1dGhvciA6IEVkd2FyZCBIZXJ2ZXkgPGVkd2FyZEBjb2xsYWJvcmEuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIENvbGxhYm9yYSBMdGQuCisgKglBdXRob3IgOiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCSAgICAgICAgIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcG5nZGVjCisgKgorICogRGVjb2RlcyBwbmcgaW1hZ2VzLiBJZiB0aGVyZSBpcyBubyBmcmFtZXJhdGUgc2V0IG9uIHNpbmsgY2FwcywgaXQgc2VuZHMgRU9TCisgKiBhZnRlciB0aGUgZmlyc3QgcGljdHVyZS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RwbmdkZWMuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJ5dGVyZWFkZXIuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9tZXRhLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvcG9vbC5oPgorI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocG5nZGVjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHBuZ2RlY19kZWJ1ZworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3BuZ2RlY19saWJwbmdfaW5pdCAoR3N0UG5nRGVjICogcG5nZGVjKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3BuZ2RlY19jYXBzX2NyZWF0ZV9hbmRfc2V0IChHc3RQbmdEZWMgKiBwbmdkZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3BuZ2RlY19zdGFydCAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2Rlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3BuZ2RlY19zdG9wIChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcG5nZGVjX2ZsdXNoIChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcG5nZGVjX3NldF9mb3JtYXQgKEdzdFZpZGVvRGVjb2RlciAqIERlY29kZXIsCisgICAgR3N0VmlkZW9Db2RlY1N0YXRlICogc3RhdGUpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3BuZ2RlY19wYXJzZSAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlciwKKyAgICBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSwgR3N0QWRhcHRlciAqIGFkYXB0ZXIsIGdib29sZWFuIGF0X2Vvcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcG5nZGVjX2hhbmRsZV9mcmFtZSAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlciwKKyAgICBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3BuZ2RlY19kZWNpZGVfYWxsb2NhdGlvbiAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlciwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcG5nZGVjX3NpbmtfZXZlbnQgKEdzdFZpZGVvRGVjb2RlciAqIGJkZWMsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CisKKyNkZWZpbmUgcGFyZW50X2NsYXNzIGdzdF9wbmdkZWNfcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RQbmdEZWMsIGdzdF9wbmdkZWMsIEdTVF9UWVBFX1ZJREVPX0RFQ09ERVIpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3BuZ2RlY19zcmNfcGFkX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UKKyAgICAgICAgKCJ7IFJHQkEsIFJHQiwgQVJHQjY0LCBHUkFZOCwgR1JBWTE2X0JFIH0iKSkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3BuZ2RlY19zaW5rX3BhZF90ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJpbWFnZS9wbmciKQorICAgICk7CisKK3N0YXRpYyB2b2lkCitnc3RfcG5nZGVjX2NsYXNzX2luaXQgKEdzdFBuZ0RlY0NsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdFZpZGVvRGVjb2RlckNsYXNzICp2ZGVjX2NsYXNzID0gKEdzdFZpZGVvRGVjb2RlckNsYXNzICopIGtsYXNzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9wbmdkZWNfc3JjX3BhZF90ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9wbmdkZWNfc2lua19wYWRfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiUE5HIGltYWdlIGRlY29kZXIiLAorICAgICAgIkNvZGVjL0RlY29kZXIvSW1hZ2UiLCAiRGVjb2RlIGEgcG5nIHZpZGVvIGZyYW1lIHRvIGEgcmF3IGltYWdlIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPiIpOworCisgIHZkZWNfY2xhc3MtPnN0YXJ0ID0gZ3N0X3BuZ2RlY19zdGFydDsKKyAgdmRlY19jbGFzcy0+c3RvcCA9IGdzdF9wbmdkZWNfc3RvcDsKKyAgdmRlY19jbGFzcy0+Zmx1c2ggPSBnc3RfcG5nZGVjX2ZsdXNoOworICB2ZGVjX2NsYXNzLT5zZXRfZm9ybWF0ID0gZ3N0X3BuZ2RlY19zZXRfZm9ybWF0OworICB2ZGVjX2NsYXNzLT5wYXJzZSA9IGdzdF9wbmdkZWNfcGFyc2U7CisgIHZkZWNfY2xhc3MtPmhhbmRsZV9mcmFtZSA9IGdzdF9wbmdkZWNfaGFuZGxlX2ZyYW1lOworICB2ZGVjX2NsYXNzLT5kZWNpZGVfYWxsb2NhdGlvbiA9IGdzdF9wbmdkZWNfZGVjaWRlX2FsbG9jYXRpb247CisgIHZkZWNfY2xhc3MtPnNpbmtfZXZlbnQgPSBnc3RfcG5nZGVjX3NpbmtfZXZlbnQ7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHBuZ2RlY19kZWJ1ZywgInBuZ2RlYyIsIDAsICJQTkcgaW1hZ2UgZGVjb2RlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3BuZ2RlY19pbml0IChHc3RQbmdEZWMgKiBwbmdkZWMpCit7CisgIHBuZ2RlYy0+cG5nID0gTlVMTDsKKyAgcG5nZGVjLT5pbmZvID0gTlVMTDsKKyAgcG5nZGVjLT5lbmRpbmZvID0gTlVMTDsKKworICBwbmdkZWMtPmNvbG9yX3R5cGUgPSAtMTsKKworICBwbmdkZWMtPmltYWdlX3JlYWR5ID0gRkFMU0U7CisgIHBuZ2RlYy0+cmVhZF9kYXRhID0gMDsKKworICBnc3RfdmlkZW9fZGVjb2Rlcl9zZXRfdXNlX2RlZmF1bHRfcGFkX2FjY2VwdGNhcHMgKEdTVF9WSURFT19ERUNPREVSX0NBU1QKKyAgICAgIChwbmdkZWMpLCBUUlVFKTsKKyAgR1NUX1BBRF9TRVRfQUNDRVBUX1RFTVBMQVRFIChHU1RfVklERU9fREVDT0RFUl9TSU5LX1BBRCAocG5nZGVjKSk7Cit9CisKK3N0YXRpYyB2b2lkCit1c2VyX2Vycm9yX2ZuIChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbXNnKQoreworICBHU1RfRVJST1IgKCIlcyIsIGVycm9yX21zZyk7Cit9CisKK3N0YXRpYyB2b2lkCit1c2VyX3dhcm5pbmdfZm4gKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCB3YXJuaW5nX21zZykKK3sKKyAgR1NUX1dBUk5JTkcgKCIlcyIsIHdhcm5pbmdfbXNnKTsKK30KKworc3RhdGljIHZvaWQKK3VzZXJfaW5mb19jYWxsYmFjayAocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm8pCit7CisgIEdzdFBuZ0RlYyAqcG5nZGVjID0gTlVMTDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgR1NUX0xPRyAoImluZm8gcmVhZHkiKTsKKworICBwbmdkZWMgPSBHU1RfUE5HREVDIChwbmdfZ2V0X2lvX3B0ciAocG5nX3B0cikpOworICAvKiBHZW5lcmF0ZSB0aGUgY2FwcyBhbmQgY29uZmlndXJlICovCisgIHJldCA9IGdzdF9wbmdkZWNfY2Fwc19jcmVhdGVfYW5kX3NldCAocG5nZGVjKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgIGdvdG8gYmVhY2g7CisgIH0KKworICAvKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyICovCisgIHJldCA9CisgICAgICBnc3RfdmlkZW9fZGVjb2Rlcl9hbGxvY2F0ZV9vdXRwdXRfZnJhbWUgKEdTVF9WSURFT19ERUNPREVSIChwbmdkZWMpLAorICAgICAgcG5nZGVjLT5jdXJyZW50X2ZyYW1lKTsKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykpCisgICAgR1NUX0RFQlVHX09CSkVDVCAocG5nZGVjLCAiZmFpbGVkIHRvIGFjcXVpcmUgYnVmZmVyIik7CisKK2JlYWNoOgorICBwbmdkZWMtPnJldCA9IHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcG5nZGVjX3NldF9mb3JtYXQgKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIsIEdzdFZpZGVvQ29kZWNTdGF0ZSAqIHN0YXRlKQoreworICBHc3RQbmdEZWMgKnBuZ2RlYyA9IChHc3RQbmdEZWMgKikgZGVjb2RlcjsKKworICBpZiAocG5nZGVjLT5pbnB1dF9zdGF0ZSkKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKHBuZ2RlYy0+aW5wdXRfc3RhdGUpOworICBwbmdkZWMtPmlucHV0X3N0YXRlID0gZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3JlZiAoc3RhdGUpOworCisgIC8qIFdlJ2xsIHNldCBmb3JtYXQgbGF0ZXIgb24gKi8KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3VzZXJfZW5kcm93X2NhbGxiYWNrIChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgbmV3X3JvdywKKyAgICBwbmdfdWludF8zMiByb3dfbnVtLCBpbnQgcGFzcykKK3sKKyAgR3N0UG5nRGVjICpwbmdkZWMgPSBOVUxMOworCisgIHBuZ2RlYyA9IEdTVF9QTkdERUMgKHBuZ19nZXRfaW9fcHRyIChwbmdfcHRyKSk7CisKKyAgLyogSWYgYnVmZmVyX291dCBkb2Vzbid0IGV4aXN0LCBpdCBtZWFucyBidWZmZXJfYWxsb2MgZmFpbGVkLCB3aGljaCAKKyAgICogd2lsbCBhbHJlYWR5IGhhdmUgc2V0IHRoZSByZXR1cm4gY29kZSAqLworICBpZiAobmV3X3JvdyAmJiBHU1RfSVNfQlVGRkVSIChwbmdkZWMtPmN1cnJlbnRfZnJhbWUtPm91dHB1dF9idWZmZXIpKSB7CisgICAgR3N0VmlkZW9GcmFtZSBmcmFtZTsKKyAgICBHc3RCdWZmZXIgKmJ1ZmZlciA9IHBuZ2RlYy0+Y3VycmVudF9mcmFtZS0+b3V0cHV0X2J1ZmZlcjsKKyAgICBzaXplX3Qgb2Zmc2V0OworICAgIGd1aW50OCAqZGF0YTsKKworICAgIGlmICghZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJmZyYW1lLCAmcG5nZGVjLT5vdXRwdXRfc3RhdGUtPmluZm8sIGJ1ZmZlciwKKyAgICAgICAgICAgIEdTVF9NQVBfV1JJVEUpKSB7CisgICAgICBwbmdkZWMtPnJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRhdGEgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBICgmZnJhbWUsIDApOworICAgIG9mZnNldCA9IHJvd19udW0gKiBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKCZmcmFtZSwgMCk7CisgICAgR1NUX0xPRyAoImdvdCByb3cgJXUgYXQgcGFzcyAlZCwgY29weWluZyBpbiBidWZmZXIgJXAgYXQgb2Zmc2V0ICUiCisgICAgICAgIEdfR1NJWkVfRk9STUFULCAoZ3VpbnQpIHJvd19udW0sIHBhc3MsCisgICAgICAgIHBuZ2RlYy0+Y3VycmVudF9mcmFtZS0+b3V0cHV0X2J1ZmZlciwgb2Zmc2V0KTsKKyAgICBwbmdfcHJvZ3Jlc3NpdmVfY29tYmluZV9yb3cgKHBuZ2RlYy0+cG5nLCBkYXRhICsgb2Zmc2V0LCBuZXdfcm93KTsKKyAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZmcmFtZSk7CisgICAgcG5nZGVjLT5yZXQgPSBHU1RfRkxPV19PSzsKKyAgfSBlbHNlCisgICAgcG5nZGVjLT5yZXQgPSBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK3VzZXJfZW5kX2NhbGxiYWNrIChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfaW5mb3AgaW5mbykKK3sKKyAgR3N0UG5nRGVjICpwbmdkZWMgPSBOVUxMOworCisgIHBuZ2RlYyA9IEdTVF9QTkdERUMgKHBuZ19nZXRfaW9fcHRyIChwbmdfcHRyKSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBuZ2RlYywgImFuZCB3ZSBhcmUgZG9uZSByZWFkaW5nIHRoaXMgaW1hZ2UiKTsKKworICBpZiAoIXBuZ2RlYy0+Y3VycmVudF9mcmFtZS0+b3V0cHV0X2J1ZmZlcikKKyAgICByZXR1cm47CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAocG5nZGVjLT5jdXJyZW50X2ZyYW1lLT5pbnB1dF9idWZmZXIsCisgICAgICAmcG5nZGVjLT5jdXJyZW50X2ZyYW1lX21hcCk7CisKKyAgcG5nZGVjLT5yZXQgPQorICAgICAgZ3N0X3ZpZGVvX2RlY29kZXJfZmluaXNoX2ZyYW1lIChHU1RfVklERU9fREVDT0RFUiAocG5nZGVjKSwKKyAgICAgIHBuZ2RlYy0+Y3VycmVudF9mcmFtZSk7CisKKyAgcG5nZGVjLT5pbWFnZV9yZWFkeSA9IFRSVUU7Cit9CisKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9wbmdkZWNfY2Fwc19jcmVhdGVfYW5kX3NldCAoR3N0UG5nRGVjICogcG5nZGVjKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBnaW50IGJwYyA9IDAsIGNvbG9yX3R5cGU7CisgIHBuZ191aW50XzMyIHdpZHRoLCBoZWlnaHQ7CisgIEdzdFZpZGVvRm9ybWF0IGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX1BOR0RFQyAocG5nZGVjKSwgR1NUX0ZMT1dfRVJST1IpOworCisgIC8qIEdldCBiaXRzIHBlciBjaGFubmVsICovCisgIGJwYyA9IHBuZ19nZXRfYml0X2RlcHRoIChwbmdkZWMtPnBuZywgcG5nZGVjLT5pbmZvKTsKKworICAvKiBHZXQgQ29sb3IgdHlwZSAqLworICBjb2xvcl90eXBlID0gcG5nX2dldF9jb2xvcl90eXBlIChwbmdkZWMtPnBuZywgcG5nZGVjLT5pbmZvKTsKKworICAvKiBBZGQgYWxwaGEgY2hhbm5lbCBpZiAxNi1iaXQgZGVwdGgsIGJ1dCBub3QgZm9yIEdSQVkgaW1hZ2VzICovCisgIGlmICgoYnBjID4gOCkgJiYgKGNvbG9yX3R5cGUgIT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkpIHsKKyAgICBwbmdfc2V0X2FkZF9hbHBoYSAocG5nZGVjLT5wbmcsIDB4ZmZmZiwgUE5HX0ZJTExFUl9CRUZPUkUpOworICAgIHBuZ19zZXRfc3dhcCAocG5nZGVjLT5wbmcpOworICB9CisjaWYgMAorICAvKiBXZSB1c2VkIHRvIGhhdmUgdGhpcyBIQUNLIHRvIHJldmVyc2UgdGhlIG91dGdvaW5nIGJ5dGVzLCBidXQgdGhlIHByb2JsZW0KKyAgICogdGhhdCBvcmlnaW5hbGx5IHJlcXVpcmVkIHRoZSBoYWNrIHNlZW1zIHRvIGhhdmUgYmVlbiBpbiB2aWRlb2NvbnZlcnQncworICAgKiBSR0JBIGRlc2NyaXB0aW9ucy4gSXQgZG9lc24ndCBzZWVtIG5lZWRlZCBub3cgdGhhdCdzIGZpeGVkLCBidXQgbWlnaHQKKyAgICogc3RpbGwgYmUgbmVlZGVkIG9uIGJpZy1lbmRpYW4gc3lzdGVtcywgSSdtIG5vdCBzdXJlLiBKLlMuIDYvNy8yMDA3ICovCisgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSkKKyAgICBwbmdfc2V0X2JnciAocG5nZGVjLT5wbmcpOworI2VuZGlmCisKKyAgLyogR3JheSBzY2FsZSB3aXRoIGFscGhhIGNoYW5uZWwgY29udmVydGVkIHRvIFJHQiAqLworICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHBuZ2RlYywKKyAgICAgICAgImNvbnZlcnRpbmcgZ3JheXNjYWxlIHBuZyB3aXRoIGFscGhhIGNoYW5uZWwgdG8gUkdCIik7CisgICAgcG5nX3NldF9ncmF5X3RvX3JnYiAocG5nZGVjLT5wbmcpOworICB9CisKKyAgLyogR3JheSBzY2FsZSBjb252ZXJ0ZWQgdG8gdXBzY2FsZWQgdG8gOCBiaXRzICovCisgIGlmICgoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKSB8fAorICAgICAgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSkpIHsKKyAgICBpZiAoYnBjIDwgOCkgeyAgICAgICAgICAgICAgLyogQ29udmVydCB0byA4IGJpdHMgKi8KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChwbmdkZWMsICJjb252ZXJ0aW5nIGdyYXlzY2FsZSBpbWFnZSB0byA4IGJpdHMiKTsKKyNpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNDAwCisgICAgICBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCAocG5nZGVjLT5wbmcpOworI2Vsc2UKKyAgICAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOCAocG5nZGVjLT5wbmcpOworI2VuZGlmCisgICAgfQorICB9CisKKyAgLyogUGFsZXR0ZSBjb252ZXJ0ZWQgdG8gUkdCICovCisgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocG5nZGVjLCAiY29udmVydGluZyBwYWxldHRlIHBuZyB0byBSR0IiKTsKKyAgICBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiIChwbmdkZWMtPnBuZyk7CisgIH0KKworICBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyAocG5nZGVjLT5wbmcpOworCisgIC8qIFVwZGF0ZSB0aGUgaW5mbyBzdHJ1Y3R1cmUgKi8KKyAgcG5nX3JlYWRfdXBkYXRlX2luZm8gKHBuZ2RlYy0+cG5nLCBwbmdkZWMtPmluZm8pOworCisgIC8qIEdldCBJSERSIGhlYWRlciBhZ2FpbiBhZnRlciB0cmFuc2Zvcm1hdGlvbiBzZXR0aW5ncyAqLworICBwbmdfZ2V0X0lIRFIgKHBuZ2RlYy0+cG5nLCBwbmdkZWMtPmluZm8sICZ3aWR0aCwgJmhlaWdodCwKKyAgICAgICZicGMsICZwbmdkZWMtPmNvbG9yX3R5cGUsIE5VTEwsIE5VTEwsIE5VTEwpOworCisgIEdTVF9MT0dfT0JKRUNUIChwbmdkZWMsICJ0aGlzIGlzIGEgJWR4JWQgUE5HIGltYWdlIiwgKGdpbnQpIHdpZHRoLAorICAgICAgKGdpbnQpIGhlaWdodCk7CisKKyAgc3dpdGNoIChwbmdkZWMtPmNvbG9yX3R5cGUpIHsKKyAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChwbmdkZWMsICJ3ZSBoYXZlIG5vIGFscGhhIGNoYW5uZWwsIGRlcHRoIGlzIDI0IGJpdHMiKTsKKyAgICAgIGlmIChicGMgPT0gOCkKKyAgICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9SR0I7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQToKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChwbmdkZWMsCisgICAgICAgICAgIndlIGhhdmUgYW4gYWxwaGEgY2hhbm5lbCwgZGVwdGggaXMgMzIgb3IgNjQgYml0cyIpOworICAgICAgaWYgKGJwYyA9PSA4KQorICAgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1JHQkE7CisgICAgICBlbHNlIGlmIChicGMgPT0gMTYpCisgICAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfQVJHQjY0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZOgorICAgICAgR1NUX0xPR19PQkpFQ1QgKHBuZ2RlYywKKyAgICAgICAgICAiV2UgaGF2ZSBhbiBncmF5IGltYWdlLCBkZXB0aCBpcyA4IG9yIDE2IChiZSkgYml0cyIpOworICAgICAgaWYgKGJwYyA9PSA4KQorICAgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX0dSQVk4OworICAgICAgZWxzZSBpZiAoYnBjID09IDE2KQorICAgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX0dSQVkxNl9CRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChmb3JtYXQgPT0gR1NUX1ZJREVPX0ZPUk1BVF9VTktOT1dOKSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBuZ2RlYywgU1RSRUFNLCBOT1RfSU1QTEVNRU5URUQsIChOVUxMKSwKKyAgICAgICAgKCJwbmdkZWMgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGNvbG9yIHR5cGUiKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfTk9UX1NVUFBPUlRFRDsKKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgLyogQ2hlY2sgaWYgb3V0cHV0IHN0YXRlIGNoYW5nZWQgKi8KKyAgaWYgKHBuZ2RlYy0+b3V0cHV0X3N0YXRlKSB7CisgICAgR3N0VmlkZW9JbmZvICppbmZvID0gJnBuZ2RlYy0+b3V0cHV0X3N0YXRlLT5pbmZvOworCisgICAgaWYgKHdpZHRoID09IEdTVF9WSURFT19JTkZPX1dJRFRIIChpbmZvKSAmJgorICAgICAgICBoZWlnaHQgPT0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbmZvKSAmJgorICAgICAgICBHU1RfVklERU9fSU5GT19GT1JNQVQgKGluZm8pID09IGZvcm1hdCkgeworICAgICAgZ290byBiZWFjaDsKKyAgICB9CisgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChwbmdkZWMtPm91dHB1dF9zdGF0ZSk7CisgIH0KKyNpZmRlZiBIQVZFX0xJQlBOR18xXzUKKyAgaWYgKChwbmdkZWMtPmNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19DT0xPUikKKyAgICAgICYmICEocG5nZGVjLT5jb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfUEFMRVRURSkKKyAgICAgICYmIHBuZ19nZXRfdmFsaWQgKHBuZ2RlYy0+cG5nLCBwbmdkZWMtPmluZm8sIFBOR19JTkZPX2lDQ1ApKSB7CisgICAgcG5nX2NoYXJwIGljY19uYW1lOworICAgIHBuZ19ieXRlcCBpY2NfcHJvZmlsZTsKKyAgICBpbnQgaWNjX2NvbXByZXNzaW9uX3R5cGU7CisgICAgcG5nX3VpbnRfMzIgaWNjX3Byb2ZsZW4gPSAwOworICAgIHBuZ191aW50XzMyIHJldCA9IHBuZ19nZXRfaUNDUCAocG5nZGVjLT5wbmcsIHBuZ2RlYy0+aW5mbywgJmljY19uYW1lLAorICAgICAgICAmaWNjX2NvbXByZXNzaW9uX3R5cGUsICZpY2NfcHJvZmlsZSwgJmljY19wcm9mbGVuKTsKKworICAgIGlmICgocmV0ICYgUE5HX0lORk9faUNDUCkpIHsKKyAgICAgIGdwb2ludGVyIGdzdF9pY2NfcHJvZiA9IGdfbWVtZHVwIChpY2NfcHJvZmlsZSwgaWNjX3Byb2ZsZW4pOworICAgICAgR3N0QnVmZmVyICp0YWdidWZmZXIgPSBOVUxMOworICAgICAgR3N0U2FtcGxlICp0YWdzYW1wbGUgPSBOVUxMOworICAgICAgR3N0VGFnTGlzdCAqdGFnbGlzdCA9IE5VTEw7CisgICAgICBHc3RTdHJ1Y3R1cmUgKmluZm8gPSBOVUxMOworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocG5nZGVjLCAiZXh0cmFjdGVkIElDQyBwcm9maWxlICclcycgbGVuZ3RoPSVpIiwKKyAgICAgICAgICBpY2NfbmFtZSwgKGd1aW50MzIpIGljY19wcm9mbGVuKTsKKworICAgICAgdGFnYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ3N0X2ljY19wcm9mLCBpY2NfcHJvZmxlbik7CisKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXBwbGljYXRpb24vdm5kLmljY3Byb2ZpbGUiKTsKKyAgICAgIGluZm8gPSBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoImFwcGxpY2F0aW9uL3ZuZC5pY2Nwcm9maWxlIik7CisKKyAgICAgIGlmIChpY2NfbmFtZSkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKGluZm8sICJpY2MtbmFtZSIsIEdfVFlQRV9TVFJJTkcsIGljY19uYW1lLCBOVUxMKTsKKworICAgICAgdGFnc2FtcGxlID0gZ3N0X3NhbXBsZV9uZXcgKHRhZ2J1ZmZlciwgY2FwcywgTlVMTCwgaW5mbyk7CisKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHRhZ2J1ZmZlcik7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICAgIHRhZ2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFnbGlzdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsIEdTVF9UQUdfQVRUQUNITUVOVCwKKyAgICAgICAgICB0YWdzYW1wbGUsIE5VTEwpOworICAgICAgZ3N0X3NhbXBsZV91bnJlZiAodGFnc2FtcGxlKTsKKworICAgICAgZ3N0X3ZpZGVvX2RlY29kZXJfbWVyZ2VfdGFncyAoR1NUX1ZJREVPX0RFQ09ERVIgKHBuZ2RlYyksIHRhZ2xpc3QsCisgICAgICAgICAgR1NUX1RBR19NRVJHRV9BUFBFTkQpOworICAgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdsaXN0KTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIHBuZ2RlYy0+b3V0cHV0X3N0YXRlID0KKyAgICAgIGdzdF92aWRlb19kZWNvZGVyX3NldF9vdXRwdXRfc3RhdGUgKEdTVF9WSURFT19ERUNPREVSIChwbmdkZWMpLCBmb3JtYXQsCisgICAgICB3aWR0aCwgaGVpZ2h0LCBwbmdkZWMtPmlucHV0X3N0YXRlKTsKKyAgZ3N0X3ZpZGVvX2RlY29kZXJfbmVnb3RpYXRlIChHU1RfVklERU9fREVDT0RFUiAocG5nZGVjKSk7CisgIEdTVF9ERUJVRyAoIkZpbmFsICVkICVkIiwgR1NUX1ZJREVPX0lORk9fV0lEVEggKCZwbmdkZWMtPm91dHB1dF9zdGF0ZS0+aW5mbyksCisgICAgICBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZwbmdkZWMtPm91dHB1dF9zdGF0ZS0+aW5mbykpOworCitiZWFjaDoKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9wbmdkZWNfaGFuZGxlX2ZyYW1lIChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyLCBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0UG5nRGVjICpwbmdkZWMgPSAoR3N0UG5nRGVjICopIGRlY29kZXI7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBuZ2RlYywgIkdvdCBidWZmZXIsIHNpemU9JXUiLAorICAgICAgKGd1aW50KSBnc3RfYnVmZmVyX2dldF9zaXplIChmcmFtZS0+aW5wdXRfYnVmZmVyKSk7CisKKyAgLyogTGV0IGxpYnBuZyBjb21lIGJhY2sgaGVyZSBvbiBlcnJvciAqLworICBpZiAoc2V0am1wIChwbmdfam1wYnVmIChwbmdkZWMtPnBuZykpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwbmdkZWMsICJlcnJvciBkdXJpbmcgZGVjb2RpbmciKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgcG5nZGVjLT5jdXJyZW50X2ZyYW1lID0gZnJhbWU7CisKKyAgLyogUHJvZ3Jlc3NpdmUgbG9hZGluZyBvZiB0aGUgUE5HIGltYWdlICovCisgIGlmICghZ3N0X2J1ZmZlcl9tYXAgKGZyYW1lLT5pbnB1dF9idWZmZXIsICZwbmdkZWMtPmN1cnJlbnRfZnJhbWVfbWFwLAorICAgICAgICAgIEdTVF9NQVBfUkVBRCkpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBuZ2RlYywgIkZhaWxlZCB0byBtYXAgaW5wdXQgYnVmZmVyIik7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIHBuZ19wcm9jZXNzX2RhdGEgKHBuZ2RlYy0+cG5nLCBwbmdkZWMtPmluZm8sCisgICAgICBwbmdkZWMtPmN1cnJlbnRfZnJhbWVfbWFwLmRhdGEsIHBuZ2RlYy0+Y3VycmVudF9mcmFtZV9tYXAuc2l6ZSk7CisKKyAgaWYgKHBuZ2RlYy0+aW1hZ2VfcmVhZHkpIHsKKyAgICAvKiBSZXNldCBvdXJzZWx2ZXMgZm9yIHRoZSBuZXh0IGZyYW1lICovCisgICAgZ3N0X3BuZ2RlY19mbHVzaCAoZGVjb2Rlcik7CisgICAgR1NUX0xPR19PQkpFQ1QgKHBuZ2RlYywgInNldHRpbmcgdXAgY2FsbGJhY2tzIGZvciBuZXh0IGZyYW1lIik7CisgICAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuIChwbmdkZWMtPnBuZywgcG5nZGVjLAorICAgICAgICB1c2VyX2luZm9fY2FsbGJhY2ssIHVzZXJfZW5kcm93X2NhbGxiYWNrLCB1c2VyX2VuZF9jYWxsYmFjayk7CisgICAgcG5nZGVjLT5pbWFnZV9yZWFkeSA9IEZBTFNFOworICB9IGVsc2UgeworICAgIC8qIEFuIGVycm9yIGhhcHBlbmVkIGFuZCB3ZSBoYXZlIHRvIHVubWFwICovCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAocG5nZGVjLT5jdXJyZW50X2ZyYW1lLT5pbnB1dF9idWZmZXIsCisgICAgICAgICZwbmdkZWMtPmN1cnJlbnRfZnJhbWVfbWFwKTsKKyAgfQorCisgIHJldCA9IHBuZ2RlYy0+cmV0OworYmVhY2g6CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogQmFzZWQgb24gcG5ncGFyc2UgKi8KKyNkZWZpbmUgUE5HX1NJR05BVFVSRSBHX0dVSU5UNjRfQ09OU1RBTlQgKDB4ODk1MDRFNDcwRDBBMUEwQSkKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9wbmdkZWNfcGFyc2UgKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIsIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lLAorICAgIEdzdEFkYXB0ZXIgKiBhZGFwdGVyLCBnYm9vbGVhbiBhdF9lb3MpCit7CisgIGdzaXplIHRvYWRkID0gMDsKKyAgR3N0Qnl0ZVJlYWRlciByZWFkZXI7CisgIGdjb25zdHBvaW50ZXIgZGF0YTsKKyAgZ3VpbnQ2NCBzaWduYXR1cmU7CisgIGdzaXplIHNpemU7CisgIEdzdFBuZ0RlYyAqcG5nZGVjID0gKEdzdFBuZ0RlYyAqKSBkZWNvZGVyOworCisgIEdTVF9WSURFT19DT0RFQ19GUkFNRV9TRVRfU1lOQ19QT0lOVCAoZnJhbWUpOworCisgIC8qIEZJWE1FIDogVGhlIG92ZXJoZWFkIG9mIHVzaW5nIHNjYW5fdWludDMyIGlzIG1hc3NpdmUgKi8KKworICBzaXplID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChhZGFwdGVyKTsKKyAgR1NUX0RFQlVHICgiUGFyc2luZyBQTkcgaW1hZ2UgZGF0YSAoJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcykiLCBzaXplKTsKKworICBpZiAoc2l6ZSA8IDgpCisgICAgZ290byBuZWVkX21vcmVfZGF0YTsKKworICBkYXRhID0gZ3N0X2FkYXB0ZXJfbWFwIChhZGFwdGVyLCBzaXplKTsKKyAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZyZWFkZXIsIGRhdGEsIHNpemUpOworCisgIGlmIChwbmdkZWMtPnJlYWRfZGF0YSA9PSAwKSB7CisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfcGVla191aW50NjRfYmUgKCZyZWFkZXIsICZzaWduYXR1cmUpKQorICAgICAgZ290byBuZWVkX21vcmVfZGF0YTsKKworICAgIGlmIChzaWduYXR1cmUgIT0gUE5HX1NJR05BVFVSRSkgeworICAgICAgZm9yICg7OykgeworICAgICAgICBndWludCBvZmZzZXQ7CisKKyAgICAgICAgb2Zmc2V0ID0gZ3N0X2J5dGVfcmVhZGVyX21hc2tlZF9zY2FuX3VpbnQzMiAoJnJlYWRlciwgMHhmZmZmZmZmZiwKKyAgICAgICAgICAgIDB4ODk1MDRFNDcsIDAsIGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nICgmcmVhZGVyKSk7CisKKyAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkgeworICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChhZGFwdGVyLAorICAgICAgICAgICAgICBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoJnJlYWRlcikgLSA0KTsKKyAgICAgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJnJlYWRlciwgb2Zmc2V0KSkKKyAgICAgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworCisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3BlZWtfdWludDY0X2JlICgmcmVhZGVyLCAmc2lnbmF0dXJlKSkKKyAgICAgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworCisgICAgICAgIGlmIChzaWduYXR1cmUgPT0gUE5HX1NJR05BVFVSRSkgeworICAgICAgICAgIC8qIFdlJ3JlIHNraXBwaW5nLCBnbyBvdXQsIHdlJ2xsIGJlIGJhY2sgKi8KKyAgICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAoYWRhcHRlciwgZ3N0X2J5dGVfcmVhZGVyX2dldF9wb3MgKCZyZWFkZXIpKTsKKyAgICAgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworICAgICAgICB9CisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZyZWFkZXIsIDQpKQorICAgICAgICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisgICAgICB9CisgICAgfQorICAgIHBuZ2RlYy0+cmVhZF9kYXRhID0gODsKKyAgfQorCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZyZWFkZXIsIHBuZ2RlYy0+cmVhZF9kYXRhKSkKKyAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworCisgIGZvciAoOzspIHsKKyAgICBndWludDMyIGxlbmd0aDsKKyAgICBndWludDMyIGNvZGU7CisKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmcmVhZGVyLCAmbGVuZ3RoKSkKKyAgICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9sZSAoJnJlYWRlciwgJmNvZGUpKQorICAgICAgZ290byBuZWVkX21vcmVfZGF0YTsKKworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZyZWFkZXIsIGxlbmd0aCArIDQpKQorICAgICAgZ290byBuZWVkX21vcmVfZGF0YTsKKworICAgIGlmIChjb2RlID09IEdTVF9NQUtFX0ZPVVJDQyAoJ0knLCAnRScsICdOJywgJ0QnKSkgeworICAgICAgLyogSGF2ZSBjb21wbGV0ZSBmcmFtZSAqLworICAgICAgdG9hZGQgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3BvcyAoJnJlYWRlcik7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZWNvZGVyLCAiSGF2ZSBjb21wbGV0ZSBmcmFtZSBvZiBzaXplICUiIEdfR1NJWkVfRk9STUFULAorICAgICAgICAgIHRvYWRkKTsKKyAgICAgIHBuZ2RlYy0+cmVhZF9kYXRhID0gMDsKKyAgICAgIGdvdG8gaGF2ZV9mdWxsX2ZyYW1lOworICAgIH0gZWxzZQorICAgICAgcG5nZGVjLT5yZWFkX2RhdGEgKz0gbGVuZ3RoICsgMTI7CisgIH0KKworICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworCituZWVkX21vcmVfZGF0YToKKyAgcmV0dXJuIEdTVF9WSURFT19ERUNPREVSX0ZMT1dfTkVFRF9EQVRBOworCitoYXZlX2Z1bGxfZnJhbWU6CisgIGlmICh0b2FkZCkKKyAgICBnc3RfdmlkZW9fZGVjb2Rlcl9hZGRfdG9fZnJhbWUgKGRlY29kZXIsIHRvYWRkKTsKKyAgcmV0dXJuIGdzdF92aWRlb19kZWNvZGVyX2hhdmVfZnJhbWUgKGRlY29kZXIpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wbmdkZWNfZGVjaWRlX2FsbG9jYXRpb24gKEdzdFZpZGVvRGVjb2RlciAqIGJkZWMsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdEJ1ZmZlclBvb2wgKnBvb2wgPSBOVUxMOworICBHc3RTdHJ1Y3R1cmUgKmNvbmZpZzsKKworICBpZiAoIUdTVF9WSURFT19ERUNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kZWNpZGVfYWxsb2NhdGlvbiAoYmRlYywgcXVlcnkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoZ3N0X3F1ZXJ5X2dldF9uX2FsbG9jYXRpb25fcG9vbHMgKHF1ZXJ5KSA+IDApCisgICAgZ3N0X3F1ZXJ5X3BhcnNlX250aF9hbGxvY2F0aW9uX3Bvb2wgKHF1ZXJ5LCAwLCAmcG9vbCwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKHBvb2wgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgY29uZmlnID0gZ3N0X2J1ZmZlcl9wb29sX2dldF9jb25maWcgKHBvb2wpOworICBpZiAoZ3N0X3F1ZXJ5X2ZpbmRfYWxsb2NhdGlvbl9tZXRhIChxdWVyeSwgR1NUX1ZJREVPX01FVEFfQVBJX1RZUEUsIE5VTEwpKSB7CisgICAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19hZGRfb3B0aW9uIChjb25maWcsCisgICAgICAgIEdTVF9CVUZGRVJfUE9PTF9PUFRJT05fVklERU9fTUVUQSk7CisgIH0KKyAgZ3N0X2J1ZmZlcl9wb29sX3NldF9jb25maWcgKHBvb2wsIGNvbmZpZyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBvb2wpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wbmdkZWNfc2lua19ldmVudCAoR3N0VmlkZW9EZWNvZGVyICogYmRlYywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgY29uc3QgR3N0U2VnbWVudCAqc2VnbWVudDsKKworICBpZiAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSAhPSBHU1RfRVZFTlRfU0VHTUVOVCkKKyAgICBnb3RvIGRvbmU7CisKKyAgZ3N0X2V2ZW50X3BhcnNlX3NlZ21lbnQgKGV2ZW50LCAmc2VnbWVudCk7CisKKyAgaWYgKHNlZ21lbnQtPmZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpCisgICAgZ3N0X3ZpZGVvX2RlY29kZXJfc2V0X3BhY2tldGl6ZWQgKGJkZWMsIFRSVUUpOworICBlbHNlCisgICAgZ3N0X3ZpZGVvX2RlY29kZXJfc2V0X3BhY2tldGl6ZWQgKGJkZWMsIEZBTFNFKTsKKworZG9uZToKKyAgcmV0dXJuIEdTVF9WSURFT19ERUNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChiZGVjLCBldmVudCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3BuZ2RlY19saWJwbmdfaW5pdCAoR3N0UG5nRGVjICogcG5nZGVjKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX1BOR0RFQyAocG5nZGVjKSwgRkFMU0UpOworCisgIEdTVF9MT0cgKCJpbml0IGxpYnBuZyBzdHJ1Y3R1cmVzIik7CisKKyAgLyogaW5pdGlhbGl6ZSBwbmcgc3RydWN0IHN0dWZmICovCisgIHBuZ2RlYy0+cG5nID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAorICAgICAgKHBuZ192b2lkcCkgTlVMTCwgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKKworICBpZiAocG5nZGVjLT5wbmcgPT0gTlVMTCkKKyAgICBnb3RvIGluaXRfZmFpbGVkOworCisgIHBuZ2RlYy0+aW5mbyA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QgKHBuZ2RlYy0+cG5nKTsKKyAgaWYgKHBuZ2RlYy0+aW5mbyA9PSBOVUxMKQorICAgIGdvdG8gaW5mb19mYWlsZWQ7CisKKyAgcG5nZGVjLT5lbmRpbmZvID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCAocG5nZGVjLT5wbmcpOworICBpZiAocG5nZGVjLT5lbmRpbmZvID09IE5VTEwpCisgICAgZ290byBlbmRpbmZvX2ZhaWxlZDsKKworICBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4gKHBuZ2RlYy0+cG5nLCBwbmdkZWMsCisgICAgICB1c2VyX2luZm9fY2FsbGJhY2ssIHVzZXJfZW5kcm93X2NhbGxiYWNrLCB1c2VyX2VuZF9jYWxsYmFjayk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitpbml0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwbmdkZWMsIExJQlJBUlksIElOSVQsIChOVUxMKSwKKyAgICAgICAgKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwbmcgc3RydWN0dXJlIikpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQoraW5mb19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocG5nZGVjLCBMSUJSQVJZLCBJTklULCAoTlVMTCksCisgICAgICAgICgiRmFpbGVkIHRvIGluaXRpYWxpemUgaW5mbyBzdHJ1Y3R1cmUiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitlbmRpbmZvX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwbmdkZWMsIExJQlJBUlksIElOSVQsIChOVUxMKSwKKyAgICAgICAgKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmRpbmZvIHN0cnVjdHVyZSIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3BuZ2RlY19saWJwbmdfY2xlYXIgKEdzdFBuZ0RlYyAqIHBuZ2RlYykKK3sKKyAgcG5nX2luZm9wcCBpbmZvID0gTlVMTCwgZW5kaW5mbyA9IE5VTEw7CisKKyAgR1NUX0xPRyAoImNsZWFuaW5nIHVwIGxpYnBuZyBzdHJ1Y3R1cmVzIik7CisKKyAgaWYgKHBuZ2RlYy0+aW5mbykgeworICAgIGluZm8gPSAmcG5nZGVjLT5pbmZvOworICB9CisKKyAgaWYgKHBuZ2RlYy0+ZW5kaW5mbykgeworICAgIGVuZGluZm8gPSAmcG5nZGVjLT5lbmRpbmZvOworICB9CisKKyAgaWYgKHBuZ2RlYy0+cG5nKSB7CisgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QgKCYocG5nZGVjLT5wbmcpLCBpbmZvLCBlbmRpbmZvKTsKKyAgICBwbmdkZWMtPnBuZyA9IE5VTEw7CisgICAgcG5nZGVjLT5pbmZvID0gTlVMTDsKKyAgICBwbmdkZWMtPmVuZGluZm8gPSBOVUxMOworICB9CisKKyAgcG5nZGVjLT5jb2xvcl90eXBlID0gLTE7CisgIHBuZ2RlYy0+cmVhZF9kYXRhID0gMDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcG5nZGVjX3N0YXJ0IChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyKQoreworICBHc3RQbmdEZWMgKnBuZ2RlYyA9IChHc3RQbmdEZWMgKikgZGVjb2RlcjsKKworICBnc3RfdmlkZW9fZGVjb2Rlcl9zZXRfcGFja2V0aXplZCAoR1NUX1ZJREVPX0RFQ09ERVIgKHBuZ2RlYyksIEZBTFNFKTsKKyAgZ3N0X3BuZ2RlY19saWJwbmdfaW5pdCAocG5nZGVjKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcG5nZGVjX3N0b3AgKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIpCit7CisgIEdzdFBuZ0RlYyAqcG5nZGVjID0gKEdzdFBuZ0RlYyAqKSBkZWNvZGVyOworCisgIGdzdF9wbmdkZWNfbGlicG5nX2NsZWFyIChwbmdkZWMpOworCisgIGlmIChwbmdkZWMtPmlucHV0X3N0YXRlKSB7CisgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChwbmdkZWMtPmlucHV0X3N0YXRlKTsKKyAgICBwbmdkZWMtPmlucHV0X3N0YXRlID0gTlVMTDsKKyAgfQorICBpZiAocG5nZGVjLT5vdXRwdXRfc3RhdGUpIHsKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKHBuZ2RlYy0+b3V0cHV0X3N0YXRlKTsKKyAgICBwbmdkZWMtPm91dHB1dF9zdGF0ZSA9IE5VTEw7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyogQ2xlYW4gdXAgdGhlIGxpYnBuZyBzdHJ1Y3R1cmVzICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wbmdkZWNfZmx1c2ggKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIpCit7CisgIGdzdF9wbmdkZWNfbGlicG5nX2NsZWFyICgoR3N0UG5nRGVjICopIGRlY29kZXIpOworICBnc3RfcG5nZGVjX2xpYnBuZ19pbml0ICgoR3N0UG5nRGVjICopIGRlY29kZXIpOworCisgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvZXh0L2xpYnBuZy9nc3RwbmdkZWMuaCBiL2V4dC9saWJwbmcvZ3N0cG5nZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5NTg1MQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9saWJwbmcvZ3N0cG5nZGVjLmgKQEAgLTAsMCArMSw3MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSAyMDEyIENvbGxhYm9yYSBMdGQuCisgKglBdXRob3IgOiBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfUE5HREVDX0hfXworI2RlZmluZSBfX0dTVF9QTkdERUNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZGVjb2Rlci5oPgorI2luY2x1ZGUgPHBuZy5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUE5HREVDIChnc3RfcG5nZGVjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9QTkdERUMob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUE5HREVDLEdzdFBuZ0RlYykpCisjZGVmaW5lIEdTVF9QTkdERUNfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1BOR0RFQyxHc3RQbmdEZWNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19QTkdERUMob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUE5HREVDKSkKKyNkZWZpbmUgR1NUX0lTX1BOR0RFQ19DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUE5HREVDKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFBuZ0RlYyBHc3RQbmdEZWM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UG5nRGVjQ2xhc3MgR3N0UG5nRGVjQ2xhc3M7CisKK3N0cnVjdCBfR3N0UG5nRGVjCit7CisgIEdzdFZpZGVvRGVjb2RlciBwYXJlbnQ7CisKKyAgR3N0VmlkZW9Db2RlY1N0YXRlICppbnB1dF9zdGF0ZTsKKyAgR3N0VmlkZW9Db2RlY1N0YXRlICpvdXRwdXRfc3RhdGU7CisgIEdzdE1hcEluZm8gY3VycmVudF9mcmFtZV9tYXA7CisgIEdzdFZpZGVvQ29kZWNGcmFtZSAqY3VycmVudF9mcmFtZTsKKworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBwbmdfc3RydWN0cCBwbmc7CisgIHBuZ19pbmZvcCBpbmZvOworICBwbmdfaW5mb3AgZW5kaW5mbzsKKworICBnaW50IGNvbG9yX3R5cGU7CisKKyAgZ2Jvb2xlYW4gaW1hZ2VfcmVhZHk7CisgIGdzaXplIHJlYWRfZGF0YTsKK307CisKK3N0cnVjdCBfR3N0UG5nRGVjQ2xhc3MKK3sKKyAgR3N0VmlkZW9EZWNvZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3BuZ2RlY19nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1BOR0RFQ19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9saWJwbmcvZ3N0cG5nZW5jLmMgYi9leHQvbGlicG5nL2dzdHBuZ2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MDUwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbGlicG5nL2dzdHBuZ2VuYy5jCkBAIC0wLDAgKzEsNDI2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogRmlsdGVyOgorICogQ29weXJpZ2h0IChDKSAyMDAwIERvbmFsZCBBLiBHcmFmdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBDb2xsYWJvcmEgTHRkLgorICoJQXV0aG9yIDogRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNvbGxhYm9yYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LXBuZ2VuYworICoKKyAqIEVuY29kZXMgcG5nIGltYWdlcy4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb21ldGEuaD4KKyNpbmNsdWRlIDx6bGliLmg+CisKKyNpbmNsdWRlICJnc3RwbmdlbmMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocG5nZW5jX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHBuZ2VuY19kZWJ1ZworCisvKiBGaWx0ZXIgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCisjZGVmaW5lIERFRkFVTFRfU05BUFNIT1QgICAgICAgICAgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9DT01QUkVTU0lPTl9MRVZFTCAgICAgICA2CisKK2VudW0KK3sKKyAgQVJHXzAsCisgIEFSR19TTkFQU0hPVCwKKyAgQVJHX0NPTVBSRVNTSU9OX0xFVkVMCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcG5nZW5jX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiaW1hZ2UvcG5nLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsgMTYsIDEwMDAwMDAgXSwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgWyAxNiwgMTAwMDAwMCBdLCAiICJmcmFtZXJhdGUgPSAiIEdTVF9WSURFT19GUFNfUkFOR0UpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHBuZ2VuY19zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgUkdCQSwgUkdCLCBHUkFZOCwgR1JBWTE2X0JFIH0iKSkKKyAgICApOworCisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfcG5nZW5jX3BhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UG5nRW5jLCBnc3RfcG5nZW5jLCBHU1RfVFlQRV9WSURFT19FTkNPREVSKTsKKworc3RhdGljIHZvaWQgZ3N0X3BuZ2VuY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcG5nZW5jX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3BuZ2VuY19oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsCisgICAgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUpOworc3RhdGljIGdib29sZWFuIGdzdF9wbmdlbmNfc2V0X2Zvcm1hdCAoR3N0VmlkZW9FbmNvZGVyICogZW5jb2RlciwKKyAgICBHc3RWaWRlb0NvZGVjU3RhdGUgKiBzdGF0ZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3BuZ2VuY19wcm9wb3NlX2FsbG9jYXRpb24gKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsCisgICAgR3N0UXVlcnkgKiBxdWVyeSk7CisKK3N0YXRpYyB2b2lkIGdzdF9wbmdlbmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZAordXNlcl9lcnJvcl9mbiAocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21zZykKK3sKKyAgZ193YXJuaW5nICgiJXMiLCBlcnJvcl9tc2cpOworfQorCitzdGF0aWMgdm9pZAordXNlcl93YXJuaW5nX2ZuIChwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tc2cpCit7CisgIGdfd2FybmluZyAoIiVzIiwgd2FybmluZ19tc2cpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3BuZ2VuY19jbGFzc19pbml0IChHc3RQbmdFbmNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR3N0VmlkZW9FbmNvZGVyQ2xhc3MgKnZlbmNfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICB2ZW5jX2NsYXNzID0gKEdzdFZpZGVvRW5jb2RlckNsYXNzICopIGtsYXNzOworCisgIHBhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9wbmdlbmNfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcG5nZW5jX3NldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBBUkdfU05BUFNIT1QsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInNuYXBzaG90IiwgIlNuYXBzaG90IiwKKyAgICAgICAgICAiU2VuZCBFT1MgYWZ0ZXIgZW5jb2RpbmcgYSBmcmFtZSwgdXNlZnVsIGZvciBzbmFwc2hvdHMiLAorICAgICAgICAgIERFRkFVTFRfU05BUFNIT1QsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIEFSR19DT01QUkVTU0lPTl9MRVZFTCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiY29tcHJlc3Npb24tbGV2ZWwiLCAiY29tcHJlc3Npb24tbGV2ZWwiLAorICAgICAgICAgICJQTkcgY29tcHJlc3Npb24gbGV2ZWwiLAorICAgICAgICAgIFpfTk9fQ09NUFJFU1NJT04sIFpfQkVTVF9DT01QUkVTU0lPTiwKKyAgICAgICAgICBERUZBVUxUX0NPTVBSRVNTSU9OX0xFVkVMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlCisgICAgICAoZWxlbWVudF9jbGFzcywgJnBuZ2VuY19zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUKKyAgICAgIChlbGVtZW50X2NsYXNzLCAmcG5nZW5jX3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJQTkcgaW1hZ2UgZW5jb2RlciIsCisgICAgICAiQ29kZWMvRW5jb2Rlci9JbWFnZSIsCisgICAgICAiRW5jb2RlIGEgdmlkZW8gZnJhbWUgdG8gYSAucG5nIGltYWdlIiwKKyAgICAgICJKZXJlbXkgU0lNT04gPGpzaW1vbjEzQHlhaG9vLmZyPiIpOworCisgIHZlbmNfY2xhc3MtPnNldF9mb3JtYXQgPSBnc3RfcG5nZW5jX3NldF9mb3JtYXQ7CisgIHZlbmNfY2xhc3MtPmhhbmRsZV9mcmFtZSA9IGdzdF9wbmdlbmNfaGFuZGxlX2ZyYW1lOworICB2ZW5jX2NsYXNzLT5wcm9wb3NlX2FsbG9jYXRpb24gPSBnc3RfcG5nZW5jX3Byb3Bvc2VfYWxsb2NhdGlvbjsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcG5nZW5jX2ZpbmFsaXplOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChwbmdlbmNfZGVidWcsICJwbmdlbmMiLCAwLCAiUE5HIGltYWdlIGVuY29kZXIiKTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wbmdlbmNfc2V0X2Zvcm1hdCAoR3N0VmlkZW9FbmNvZGVyICogZW5jb2RlciwgR3N0VmlkZW9Db2RlY1N0YXRlICogc3RhdGUpCit7CisgIEdzdFBuZ0VuYyAqcG5nZW5jOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworICBHc3RWaWRlb0luZm8gKmluZm87CisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqb3V0cHV0X3N0YXRlOworCisgIHBuZ2VuYyA9IEdTVF9QTkdFTkMgKGVuY29kZXIpOworICBpbmZvID0gJnN0YXRlLT5pbmZvOworCisgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUIChpbmZvKSkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgcG5nZW5jLT5wbmdfY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQkE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCOgorICAgICAgcG5nZW5jLT5wbmdfY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9HUkFZODoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfR1JBWTE2X0JFOgorICAgICAgcG5nZW5jLT5wbmdfY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX0dSQVk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gRkFMU0U7CisgICAgICBnb3RvIGRvbmU7CisgIH0KKworICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoaW5mbykpIHsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfR1JBWTE2X0JFOgorICAgICAgcG5nZW5jLT5kZXB0aCA9IDE2OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgLyogR1NUX1ZJREVPX0ZPUk1BVF9SR0IgYW5kIEdTVF9WSURFT19GT1JNQVRfR1JBWTggKi8KKyAgICAgIHBuZ2VuYy0+ZGVwdGggPSA4OworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAocG5nZW5jLT5pbnB1dF9zdGF0ZSkKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKHBuZ2VuYy0+aW5wdXRfc3RhdGUpOworICBwbmdlbmMtPmlucHV0X3N0YXRlID0gZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3JlZiAoc3RhdGUpOworCisgIG91dHB1dF9zdGF0ZSA9CisgICAgICBnc3RfdmlkZW9fZW5jb2Rlcl9zZXRfb3V0cHV0X3N0YXRlIChlbmNvZGVyLAorICAgICAgZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImltYWdlL3BuZyIpLCBzdGF0ZSk7CisgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAob3V0cHV0X3N0YXRlKTsKKworZG9uZToKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3BuZ2VuY19pbml0IChHc3RQbmdFbmMgKiBwbmdlbmMpCit7CisgIEdTVF9QQURfU0VUX0FDQ0VQVF9URU1QTEFURSAoR1NUX1ZJREVPX0VOQ09ERVJfU0lOS19QQUQgKHBuZ2VuYykpOworCisgIC8qIGluaXQgc2V0dGluZ3MgKi8KKyAgcG5nZW5jLT5wbmdfc3RydWN0X3B0ciA9IE5VTEw7CisgIHBuZ2VuYy0+cG5nX2luZm9fcHRyID0gTlVMTDsKKworICBwbmdlbmMtPnNuYXBzaG90ID0gREVGQVVMVF9TTkFQU0hPVDsKKyAgcG5nZW5jLT5jb21wcmVzc2lvbl9sZXZlbCA9IERFRkFVTFRfQ09NUFJFU1NJT05fTEVWRUw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcG5nZW5jX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RQbmdFbmMgKnBuZ2VuYyA9IEdTVF9QTkdFTkMgKG9iamVjdCk7CisKKyAgaWYgKHBuZ2VuYy0+aW5wdXRfc3RhdGUpCisgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChwbmdlbmMtPmlucHV0X3N0YXRlKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit1c2VyX2ZsdXNoX2RhdGEgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIgR19HTlVDX1VOVVNFRCkKK3sKK30KKworc3RhdGljIHZvaWQKK3VzZXJfd3JpdGVfZGF0YSAocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsIHBuZ191aW50XzMyIGxlbmd0aCkKK3sKKyAgR3N0UG5nRW5jICpwbmdlbmM7CisgIEdzdE1lbW9yeSAqbWVtOworICBHc3RNYXBJbmZvIG1pbmZvOworCisgIHBuZ2VuYyA9IChHc3RQbmdFbmMgKikgcG5nX2dldF9pb19wdHIgKHBuZ19wdHIpOworCisgIG1lbSA9IGdzdF9hbGxvY2F0b3JfYWxsb2MgKE5VTEwsIGxlbmd0aCwgTlVMTCk7CisgIGlmICghbWVtKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG5nZW5jLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSIpOworICAgIHBuZ19lcnJvciAocG5nX3B0ciwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkiKTsKKworICAgIC8qIG5ldmVyIHJlYWNoZWQgKi8KKyAgICByZXR1cm47CisgIH0KKworICBpZiAoIWdzdF9tZW1vcnlfbWFwIChtZW0sICZtaW5mbywgR1NUX01BUF9XUklURSkpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwbmdlbmMsICJGYWlsZWQgdG8gbWFwIG1lbW9yeSIpOworICAgIGdzdF9tZW1vcnlfdW5yZWYgKG1lbSk7CisKKyAgICBwbmdfZXJyb3IgKHBuZ19wdHIsICJGYWlsZWQgdG8gbWFwIG1lbW9yeSIpOworCisgICAgLyogbmV2ZXIgcmVhY2hlZCAqLworICAgIHJldHVybjsKKyAgfQorCisgIG1lbWNweSAobWluZm8uZGF0YSwgZGF0YSwgbGVuZ3RoKTsKKyAgZ3N0X21lbW9yeV91bm1hcCAobWVtLCAmbWluZm8pOworCisgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAocG5nZW5jLT5idWZmZXJfb3V0LCBtZW0pOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3BuZ2VuY19oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKQoreworICBHc3RQbmdFbmMgKnBuZ2VuYzsKKyAgZ2ludCByb3dfaW5kZXg7CisgIHBuZ19ieXRlICoqcm93X3BvaW50ZXJzOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RWaWRlb0luZm8gKmluZm87CisgIEdzdFZpZGVvRnJhbWUgdmZyYW1lOworCisgIHBuZ2VuYyA9IEdTVF9QTkdFTkMgKGVuY29kZXIpOworICBpbmZvID0gJnBuZ2VuYy0+aW5wdXRfc3RhdGUtPmluZm87CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocG5nZW5jLCAiQkVHSU5OSU5HIik7CisKKyAgLyogaW5pdGlhbGl6ZSBwbmcgc3RydWN0IHN0dWZmICovCisgIHBuZ2VuYy0+cG5nX3N0cnVjdF9wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCAoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAorICAgICAgKHBuZ192b2lkcCkgTlVMTCwgdXNlcl9lcnJvcl9mbiwgdXNlcl93YXJuaW5nX2ZuKTsKKyAgaWYgKHBuZ2VuYy0+cG5nX3N0cnVjdF9wdHIgPT0gTlVMTCkKKyAgICBnb3RvIHN0cnVjdF9pbml0X2ZhaWw7CisKKyAgcG5nZW5jLT5wbmdfaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0IChwbmdlbmMtPnBuZ19zdHJ1Y3RfcHRyKTsKKyAgaWYgKCFwbmdlbmMtPnBuZ19pbmZvX3B0cikKKyAgICBnb3RvIHBuZ19pbmZvX2ZhaWw7CisKKyAgLyogbm9uLTAgcmV0dXJuIGlzIGZyb20gYSBsb25nam1wIGluc2lkZSBvZiBsaWJwbmcgKi8KKyAgaWYgKHNldGptcCAocG5nX2ptcGJ1ZiAocG5nZW5jLT5wbmdfc3RydWN0X3B0cikpICE9IDApCisgICAgZ290byBsb25nam1wX2ZhaWw7CisKKyAgcG5nX3NldF9maWx0ZXIgKHBuZ2VuYy0+cG5nX3N0cnVjdF9wdHIsIDAsCisgICAgICBQTkdfRklMVEVSX05PTkUgfCBQTkdfRklMVEVSX1ZBTFVFX05PTkUpOworICBwbmdfc2V0X2NvbXByZXNzaW9uX2xldmVsIChwbmdlbmMtPnBuZ19zdHJ1Y3RfcHRyLCBwbmdlbmMtPmNvbXByZXNzaW9uX2xldmVsKTsKKworICBwbmdfc2V0X0lIRFIgKHBuZ2VuYy0+cG5nX3N0cnVjdF9wdHIsCisgICAgICBwbmdlbmMtPnBuZ19pbmZvX3B0ciwKKyAgICAgIEdTVF9WSURFT19JTkZPX1dJRFRIIChpbmZvKSwKKyAgICAgIEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5mbyksCisgICAgICBwbmdlbmMtPmRlcHRoLAorICAgICAgcG5nZW5jLT5wbmdfY29sb3JfdHlwZSwKKyAgICAgIFBOR19JTlRFUkxBQ0VfTk9ORSwKKyAgICAgIFBOR19DT01QUkVTU0lPTl9UWVBFX0RFRkFVTFQsIFBOR19GSUxURVJfVFlQRV9ERUZBVUxUKTsKKworICBwbmdfc2V0X3dyaXRlX2ZuIChwbmdlbmMtPnBuZ19zdHJ1Y3RfcHRyLCBwbmdlbmMsCisgICAgICAocG5nX3J3X3B0cikgdXNlcl93cml0ZV9kYXRhLCB1c2VyX2ZsdXNoX2RhdGEpOworCisgIGlmICghZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJnZmcmFtZSwgJnBuZ2VuYy0+aW5wdXRfc3RhdGUtPmluZm8sCisgICAgICAgICAgZnJhbWUtPmlucHV0X2J1ZmZlciwgR1NUX01BUF9SRUFEKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwbmdlbmMsIFNUUkVBTSwgRk9STUFULCAoTlVMTCksCisgICAgICAgICgiRmFpbGVkIHRvIG1hcCB2aWRlbyBmcmFtZSwgY2FwcyBwcm9ibGVtPyIpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICByb3dfcG9pbnRlcnMgPSBnX25ldyAocG5nX2J5dGUgKiwgR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbmZvKSk7CisKKyAgZm9yIChyb3dfaW5kZXggPSAwOyByb3dfaW5kZXggPCBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluZm8pOyByb3dfaW5kZXgrKykgeworICAgIHJvd19wb2ludGVyc1tyb3dfaW5kZXhdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoJnZmcmFtZSwgMCkgKworICAgICAgICAocm93X2luZGV4ICogR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFICgmdmZyYW1lLCAwKSk7CisgIH0KKworICAvKiBhbGxvY2F0ZSB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICBwbmdlbmMtPmJ1ZmZlcl9vdXQgPSBnc3RfYnVmZmVyX25ldyAoKTsKKworICBwbmdfd3JpdGVfaW5mbyAocG5nZW5jLT5wbmdfc3RydWN0X3B0ciwgcG5nZW5jLT5wbmdfaW5mb19wdHIpOworICBwbmdfd3JpdGVfaW1hZ2UgKHBuZ2VuYy0+cG5nX3N0cnVjdF9wdHIsIHJvd19wb2ludGVycyk7CisgIHBuZ193cml0ZV9lbmQgKHBuZ2VuYy0+cG5nX3N0cnVjdF9wdHIsIE5VTEwpOworCisgIGdfZnJlZSAocm93X3BvaW50ZXJzKTsKKyAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmdmZyYW1lKTsKKworICBwbmdfZGVzdHJveV9pbmZvX3N0cnVjdCAocG5nZW5jLT5wbmdfc3RydWN0X3B0ciwgJnBuZ2VuYy0+cG5nX2luZm9fcHRyKTsKKyAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0ICgmcG5nZW5jLT5wbmdfc3RydWN0X3B0ciwgKHBuZ19pbmZvcHApIE5VTEwpOworCisgIC8qIFNldCBmaW5hbCBzaXplIGFuZCBzdG9yZSAqLworICBmcmFtZS0+b3V0cHV0X2J1ZmZlciA9IHBuZ2VuYy0+YnVmZmVyX291dDsKKworICBwbmdlbmMtPmJ1ZmZlcl9vdXQgPSBOVUxMOworCisgIGlmICgocmV0ID0gZ3N0X3ZpZGVvX2VuY29kZXJfZmluaXNoX2ZyYW1lIChlbmNvZGVyLCBmcmFtZSkpICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZG9uZTsKKworICBpZiAocG5nZW5jLT5zbmFwc2hvdCkKKyAgICByZXQgPSBHU1RfRkxPV19FT1M7CisKK2RvbmU6CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBuZ2VuYywgIkVORCwgcmV0OiVkIiwgcmV0KTsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworc3RydWN0X2luaXRfZmFpbDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwbmdlbmMsIExJQlJBUlksIElOSVQsIChOVUxMKSwKKyAgICAgICAgKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwbmcgc3RydWN0dXJlIikpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCitwbmdfaW5mb19mYWlsOgorICB7CisgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0ICgmKHBuZ2VuYy0+cG5nX3N0cnVjdF9wdHIpLCAocG5nX2luZm9wcCkgTlVMTCk7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBuZ2VuYywgTElCUkFSWSwgSU5JVCwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBwbmcgaW5mbyBzdHJ1Y3R1cmUiKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKK2xvbmdqbXBfZmFpbDoKKyAgeworICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCAoJnBuZ2VuYy0+cG5nX3N0cnVjdF9wdHIsICZwbmdlbmMtPnBuZ19pbmZvX3B0cik7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBuZ2VuYywgTElCUkFSWSwgRkFJTEVELCAoTlVMTCksCisgICAgICAgICgicmV0dXJuaW5nIGZyb20gbG9uZ2ptcCIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcG5nZW5jX3Byb3Bvc2VfYWxsb2NhdGlvbiAoR3N0VmlkZW9FbmNvZGVyICogZW5jb2RlciwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgZ3N0X3F1ZXJ5X2FkZF9hbGxvY2F0aW9uX21ldGEgKHF1ZXJ5LCBHU1RfVklERU9fTUVUQV9BUElfVFlQRSwgTlVMTCk7CisKKyAgcmV0dXJuIEdTVF9WSURFT19FTkNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5wcm9wb3NlX2FsbG9jYXRpb24gKGVuY29kZXIsCisgICAgICBxdWVyeSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcG5nZW5jX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RQbmdFbmMgKnBuZ2VuYzsKKworICBwbmdlbmMgPSBHU1RfUE5HRU5DIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgQVJHX1NOQVBTSE9UOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHBuZ2VuYy0+c25hcHNob3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfQ09NUFJFU1NJT05fTEVWRUw6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcG5nZW5jLT5jb21wcmVzc2lvbl9sZXZlbCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9wbmdlbmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFBuZ0VuYyAqcG5nZW5jOworCisgIHBuZ2VuYyA9IEdTVF9QTkdFTkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBBUkdfU05BUFNIT1Q6CisgICAgICBwbmdlbmMtPnNuYXBzaG90ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfQ09NUFJFU1NJT05fTEVWRUw6CisgICAgICBwbmdlbmMtPmNvbXByZXNzaW9uX2xldmVsID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2xpYnBuZy9nc3RwbmdlbmMuaCBiL2V4dC9saWJwbmcvZ3N0cG5nZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxZDk3YwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9saWJwbmcvZ3N0cG5nZW5jLmgKQEAgLTAsMCArMSw3NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSAyMDEyIENvbGxhYm9yYSBMdGQuCisgKglBdXRob3IgOiBFZHdhcmQgSGVydmV5IDxlZHdhcmRAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfUE5HRU5DX0hfXworI2RlZmluZSBfX0dTVF9QTkdFTkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZW5jb2Rlci5oPgorI2luY2x1ZGUgPHBuZy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworI2RlZmluZSBHU1RfVFlQRV9QTkdFTkMgICAgICAgICAgICAoZ3N0X3BuZ2VuY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUE5HRU5DKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUE5HRU5DLEdzdFBuZ0VuYykpCisjZGVmaW5lIEdTVF9QTkdFTkNfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1BOR0VOQyxHc3RQbmdFbmNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19QTkdFTkMob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9QTkdFTkMpKQorI2RlZmluZSBHU1RfSVNfUE5HRU5DX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9QTkdFTkMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UG5nRW5jIEdzdFBuZ0VuYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RQbmdFbmNDbGFzcyBHc3RQbmdFbmNDbGFzczsKKworc3RydWN0IF9Hc3RQbmdFbmMKK3sKKyAgR3N0VmlkZW9FbmNvZGVyIHBhcmVudDsKKworICBHc3RWaWRlb0NvZGVjU3RhdGUgKmlucHV0X3N0YXRlOworICBHc3RCdWZmZXIgKmJ1ZmZlcl9vdXQ7CisKKyAgcG5nX3N0cnVjdHAgcG5nX3N0cnVjdF9wdHI7CisgIHBuZ19pbmZvcCBwbmdfaW5mb19wdHI7CisKKyAgZ2ludCBwbmdfY29sb3JfdHlwZTsKKyAgZ2ludCBkZXB0aDsKKyAgZ3VpbnQgY29tcHJlc3Npb25fbGV2ZWw7CisKKyAgZ2Jvb2xlYW4gc25hcHNob3Q7CisgIGdib29sZWFuIG5ld21lZGlhOworfTsKKworc3RydWN0IF9Hc3RQbmdFbmNDbGFzcworeworICBHc3RWaWRlb0VuY29kZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcG5nZW5jX2dldF90eXBlKHZvaWQpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworI2VuZGlmIC8qIF9fR1NUX1BOR0VOQ19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9saWJwbmcvbWVzb24uYnVpbGQgYi9leHQvbGlicG5nL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMDFlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbGlicG5nL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTkgQEAKK3BuZ19zb3VyY2VzID0gWworICAnZ3N0cG5nLmMnLAorICAnZ3N0cG5nZW5jLmMnLAorICAnZ3N0cG5nZGVjLmMnLAorXQorCitsaWJwbmdfZGVwID0gZGVwZW5kZW5jeSgnbGlicG5nJywgdmVyc2lvbiA6ICc+PTEuMicsIHJlcXVpcmVkIDogZmFsc2UpCisKK2lmIGxpYnBuZ19kZXAuZm91bmQoKQorICBnc3RwbmcgPSBsaWJyYXJ5KCdnc3RwbmcnLAorICAgIHBuZ19zb3VyY2VzLAorICAgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgICBsaW5rX2FyZ3MgOiBub3NlaF9saW5rX2FyZ3MsCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICAgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0dmlkZW9fZGVwLCBsaWJwbmdfZGVwXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCisgICkKK2VuZGlmCmRpZmYgLS1naXQgYS9leHQvbWVzb24uYnVpbGQgYi9leHQvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc1ODg3NwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDI4IEBACitzdWJkaXIoJ2FhbGliJykKK3N1YmRpcignY2Fpcm8nKQorc3ViZGlyKCdmbGFjJykKK3N1YmRpcignZ2RrX3BpeGJ1ZicpCitzdWJkaXIoJ2phY2snKQorc3ViZGlyKCdqcGVnJykKK3N1YmRpcignbGFtZScpCitzdWJkaXIoJ2xpYmNhY2EnKQorIyBGSVhNRTogZHYgcGx1Z2luIGZhaWxzIHRvIGxpbmsgd2l0aCBtc3ZjLCB3YW50cyBwdGhyZWFkLmxpYgoraWYgY2MuZ2V0X2lkKCkgIT0gJ21zdmMnCisgIHN1YmRpcignZHYnKQorZW5kaWYKK3N1YmRpcignbGlicG5nJykKK3N1YmRpcignbXBnMTIzJykKK3N1YmRpcigncmF3MTM5NCcpCitzdWJkaXIoJ3B1bHNlJykKK3N1YmRpcignc2hvdXQyJykKK3N1YmRpcignc291cCcpCitzdWJkaXIoJ3NwZWV4JykKKyMgRklYTUU6IHRhZ2xpYiBmYWlscyB0byBjb21waWxlIGFuZCBsaW5rIHdpdGggbXN2YworaWYgY2MuZ2V0X2lkKCkgPT0gJ21zdmMnCisgIG1lc3NhZ2UoJ0J1aWxkaW5nIHdpdGggTVNWQywgZGlzYWJsaW5nIHRhZ2xpYiBzdXBwb3J0LiBQYXRjaGVzIHdlbGNvbWUhJykKK2Vsc2UKKyAgc3ViZGlyKCd0YWdsaWInKQorZW5kaWYKK3N1YmRpcigndHdvbGFtZScpCitzdWJkaXIoJ3ZweCcpCitzdWJkaXIoJ3dhdnBhY2snKQpkaWZmIC0tZ2l0IGEvZXh0L21wZzEyMy9NYWtlZmlsZS5hbSBiL2V4dC9tcGcxMjMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1ZjMyNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tcGcxMjMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0bXBnMTIzLmxhCisKK2xpYmdzdG1wZzEyM19sYV9TT1VSQ0VTID0gZ3N0bXBnMTIzYXVkaW9kZWMuYworbGliZ3N0bXBnMTIzX2xhX0NGTEFHUyA9IC1ER1NUX1VTRV9VTlNUQUJMRV9BUEkgXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKE1QRzEyM19DRkxBR1MpCitsaWJnc3RtcGcxMjNfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tQEdTVF9BUElfVkVSU0lPTkAgXAorCSQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykgJChNUEcxMjNfTElCUykKK2xpYmdzdG1wZzEyM19sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0bXBnMTIzYXVkaW9kZWMuaApkaWZmIC0tZ2l0IGEvZXh0L21wZzEyMy9nc3RtcGcxMjNhdWRpb2RlYy5jIGIvZXh0L21wZzEyMy9nc3RtcGcxMjNhdWRpb2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNjc0M2MKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXBnMTIzL2dzdG1wZzEyM2F1ZGlvZGVjLmMKQEAgLTAsMCArMSw2MzQgQEAKKy8qICBNUDMgZGVjb2RpbmcgcGx1Z2luIGZvciBHU3RyZWFtZXIgdXNpbmcgdGhlIG1wZzEyMyBsaWJyYXJ5CisgKiAgQ29weXJpZ2h0IChDKSAyMDEyIENhcmxvcyBSYWZhZWwgR2lhbmkKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisvKioKKyAqIFNFQ1RJT046IGVsZW1lbnQtbXBnMTIzYXVkaW9kZWMKKyAqIEBzZWVfYWxzbzogbGFtZW1wM2VuYywgbWFkCisgKgorICogQXVkaW8gZGVjb2RlciBmb3IgTVBFRy0xIGxheWVyIDEvMi8zIGF1ZGlvIGRhdGEuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPW11c2ljLm1wMyAhIG1wZWdhdWRpb3BhcnNlICEgbXBnMTIzYXVkaW9kZWMgISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgYXV0b2F1ZGlvc2luaworICogXXwgRGVjb2RlIGFuZCBwbGF5IHRoZSBtcDMgZmlsZQorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RtcGcxMjNhdWRpb2RlYy5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKG1wZzEyM19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBtcGcxMjNfZGVidWcKKworLyogT21pdHRlZCBzYW1wbGUgZm9ybWF0cyB0aGF0IG1wZzEyMyBzdXBwb3J0cyAob3IgYXQgbGVhc3QgY2FuIHN1cHBvcnQpOgorICogIC0gOGJpdCBpbnRlZ2VyIHNpZ25lZAorICogIC0gOGJpdCBpbnRlZ2VyIHVuc2lnbmVkCisgKiAgLSBhLWxhdworICogIC0gbXUtbGF3CisgKiAgLSA2NGJpdCBmbG9hdAorICoKKyAqIFRoZSBmaXJzdCBmb3VyIGZvcm1hdHMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIEdzdEF1ZGlvRGVjb2RlciBiYXNlIGNsYXNzLgorICogKFRoZSBpbnRlcm5hbCBnc3RfYXVkaW9fZm9ybWF0X2Zyb21fY2Fwc19zdHJ1Y3R1cmUoKSBjYWxsIGZhaWxzLikKKyAqCisgKiBUaGUgNjRiaXQgZmxvYXQgaXNzdWUgaXMgdHJpY2t5LiBtcGcxMjMgYWN0dWFsbHkgZGVjb2RlcyB0byAicmVhbCIsCisgKiBub3QgbmVjZXNzYXJpbHkgdG8gImZsb2F0Ii4KKyAqCisgKiAicmVhbCIgY2FuIGJlIGZpeGVkIHBvaW50LCAzMmJpdCBmbG9hdCwgNjRiaXQgZmxvYXQuIFRoZXJlIHNlZW1zIHRvIGJlCisgKiBubyB3YXkgaG93IHRvIGZpbmQgb3V0IHdoaWNoIG9uZSBvZiB0aGVtIGlzIGFjdHVhbGx5IHVzZWQuCisgKgorICogSG93ZXZlciwgaW4gYWxsIGtub3duIGluc3RhbGxhdGlvbnMsICJyZWFsIiBlcXVhbHMgMzJiaXQgZmxvYXQsIHNvIHRoYXQncworICogd2hhdCBpcyB1c2VkLiAqLworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3RhdGljX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8vbXBlZywgIgorICAgICAgICAibXBlZ3ZlcnNpb24gPSAoaW50KSAxLCAiCisgICAgICAgICJsYXllciA9IChpbnQpIFsgMSwgMyBdLCAiCisgICAgICAgICJyYXRlID0gKGludCkgeyA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAgfSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXSwgIiAicGFyc2VkID0gKGJvb2xlYW4pIHRydWUgIikKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21wZzEyM19hdWRpb19kZWNfc3RhcnQgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21wZzEyM19hdWRpb19kZWNfc3RvcCAoR3N0QXVkaW9EZWNvZGVyICogZGVjKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9tcGcxMjNfYXVkaW9fZGVjX3B1c2hfZGVjb2RlZF9ieXRlcyAoR3N0TXBnMTIzQXVkaW9EZWMKKyAgICAqIG1wZzEyM19kZWNvZGVyLCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpkZWNvZGVkX2J5dGVzLAorICAgIHNpemVfdCBjb25zdCBudW1fZGVjb2RlZF9ieXRlcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfbXBnMTIzX2F1ZGlvX2RlY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywKKyAgICBHc3RCdWZmZXIgKiBpbnB1dF9idWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9tcGcxMjNfYXVkaW9fZGVjX3NldF9mb3JtYXQgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywKKyAgICBHc3RDYXBzICogaW5wdXRfY2Fwcyk7CitzdGF0aWMgdm9pZCBnc3RfbXBnMTIzX2F1ZGlvX2RlY19mbHVzaCAoR3N0QXVkaW9EZWNvZGVyICogZGVjLCBnYm9vbGVhbiBoYXJkKTsKKworR19ERUZJTkVfVFlQRSAoR3N0TXBnMTIzQXVkaW9EZWMsIGdzdF9tcGcxMjNfYXVkaW9fZGVjLCBHU1RfVFlQRV9BVURJT19ERUNPREVSKTsKKworc3RhdGljIHZvaWQKK2dzdF9tcGcxMjNfYXVkaW9fZGVjX2NsYXNzX2luaXQgKEdzdE1wZzEyM0F1ZGlvRGVjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0QXVkaW9EZWNvZGVyQ2xhc3MgKmJhc2VfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR3N0UGFkVGVtcGxhdGUgKnNyY190ZW1wbGF0ZSwgKnNpbmtfdGVtcGxhdGU7CisgIGludCBlcnJvcjsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAobXBnMTIzX2RlYnVnLCAibXBnMTIzIiwgMCwgIm1wZzEyMyBtcDMgZGVjb2RlciIpOworCisgIGJhc2VfY2xhc3MgPSBHU1RfQVVESU9fREVDT0RFUl9DTEFTUyAoa2xhc3MpOworICBlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIm1wZzEyMyBtcDMgZGVjb2RlciIsCisgICAgICAiQ29kZWMvRGVjb2Rlci9BdWRpbyIsCisgICAgICAiRGVjb2RlcyBtcDMgc3RyZWFtcyB1c2luZyB0aGUgbXBnMTIzIGxpYnJhcnkiLAorICAgICAgIkNhcmxvcyBSYWZhZWwgR2lhbmkgPGR2QHBzZXVkb3Rlcm1pbmFsLm9yZz4iKTsKKworICAvKiBOb3QgdXNpbmcgc3RhdGljIHBhZCB0ZW1wbGF0ZSBmb3Igc3JjY2Fwcywgc2luY2UgdGhlIGNvbW1hLXNlcGFyYXRlZCBsaXN0CisgICAqIG9mIGZvcm1hdHMgbmVlZHMgdG8gYmUgY3JlYXRlZCBkZXBlbmRpbmcgb24gd2hhdGV2ZXIgbXBnMTIzIHN1cHBvcnRzICovCisgIHsKKyAgICBjb25zdCBpbnQgKmZvcm1hdF9saXN0OworICAgIGNvbnN0IGxvbmcgKnJhdGVzX2xpc3Q7CisgICAgc2l6ZV90IG51bSwgaTsKKyAgICBHU3RyaW5nICpzOworICAgIEdzdENhcHMgKnNyY190ZW1wbGF0ZV9jYXBzOworCisgICAgcyA9IGdfc3RyaW5nX25ldyAoImF1ZGlvL3gtcmF3LCAiKTsKKworICAgIG1wZzEyM19lbmNvZGluZ3MgKCZmb3JtYXRfbGlzdCwgJm51bSk7CisgICAgZ19zdHJpbmdfYXBwZW5kIChzLCAiZm9ybWF0ID0geyAiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKyAgICAgIHN3aXRjaCAoZm9ybWF0X2xpc3RbaV0pIHsKKyAgICAgICAgY2FzZSBNUEcxMjNfRU5DX1NJR05FRF8xNjoKKyAgICAgICAgICBnX3N0cmluZ19hcHBlbmQgKHMsIChpID4gMCkgPyAiLCAiIDogIiIpOworICAgICAgICAgIGdfc3RyaW5nX2FwcGVuZCAocywgR1NUX0FVRElPX05FIChTMTYpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNUEcxMjNfRU5DX1VOU0lHTkVEXzE2OgorICAgICAgICAgIGdfc3RyaW5nX2FwcGVuZCAocywgKGkgPiAwKSA/ICIsICIgOiAiIik7CisgICAgICAgICAgZ19zdHJpbmdfYXBwZW5kIChzLCBHU1RfQVVESU9fTkUgKFUxNikpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1QRzEyM19FTkNfU0lHTkVEXzI0OgorICAgICAgICAgIGdfc3RyaW5nX2FwcGVuZCAocywgKGkgPiAwKSA/ICIsICIgOiAiIik7CisgICAgICAgICAgZ19zdHJpbmdfYXBwZW5kIChzLCBHU1RfQVVESU9fTkUgKFMyNCkpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1QRzEyM19FTkNfVU5TSUdORURfMjQ6CisgICAgICAgICAgZ19zdHJpbmdfYXBwZW5kIChzLCAoaSA+IDApID8gIiwgIiA6ICIiKTsKKyAgICAgICAgICBnX3N0cmluZ19hcHBlbmQgKHMsIEdTVF9BVURJT19ORSAoVTI0KSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVBHMTIzX0VOQ19TSUdORURfMzI6CisgICAgICAgICAgZ19zdHJpbmdfYXBwZW5kIChzLCAoaSA+IDApID8gIiwgIiA6ICIiKTsKKyAgICAgICAgICBnX3N0cmluZ19hcHBlbmQgKHMsIEdTVF9BVURJT19ORSAoUzMyKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVBHMTIzX0VOQ19VTlNJR05FRF8zMjoKKyAgICAgICAgICBnX3N0cmluZ19hcHBlbmQgKHMsIChpID4gMCkgPyAiLCAiIDogIiIpOworICAgICAgICAgIGdfc3RyaW5nX2FwcGVuZCAocywgR1NUX0FVRElPX05FIChVMzIpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNUEcxMjNfRU5DX0ZMT0FUXzMyOgorICAgICAgICAgIGdfc3RyaW5nX2FwcGVuZCAocywgKGkgPiAwKSA/ICIsICIgOiAiIik7CisgICAgICAgICAgZ19zdHJpbmdfYXBwZW5kIChzLCBHU1RfQVVESU9fTkUgKEYzMikpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEdTVF9ERUJVRyAoIklnbm9yaW5nIG1wZzEyMyBmb3JtYXQgJWQiLCBmb3JtYXRfbGlzdFtpXSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGdfc3RyaW5nX2FwcGVuZCAocywgIiB9LCAiKTsKKworICAgIG1wZzEyM19yYXRlcyAoJnJhdGVzX2xpc3QsICZudW0pOworICAgIGdfc3RyaW5nX2FwcGVuZCAocywgInJhdGUgPSAoaW50KSB7ICIpOworICAgIGZvciAoaSA9IDA7IGkgPCBudW07ICsraSkgeworICAgICAgZ19zdHJpbmdfYXBwZW5kX3ByaW50ZiAocywgIiVzJWx1IiwgKGkgPiAwKSA/ICIsICIgOiAiIiwgcmF0ZXNfbGlzdFtpXSk7CisgICAgfQorICAgIGdfc3RyaW5nX2FwcGVuZCAocywgIn0sICIpOworCisgICAgZ19zdHJpbmdfYXBwZW5kIChzLCAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXSwgIik7CisgICAgZ19zdHJpbmdfYXBwZW5kIChzLCAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQiKTsKKworICAgIHNyY190ZW1wbGF0ZV9jYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKHMtPnN0cik7CisgICAgc3JjX3RlbXBsYXRlID0gZ3N0X3BhZF90ZW1wbGF0ZV9uZXcgKCJzcmMiLCBHU1RfUEFEX1NSQywgR1NUX1BBRF9BTFdBWVMsCisgICAgICAgIHNyY190ZW1wbGF0ZV9jYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjX3RlbXBsYXRlX2NhcHMpOworCisgICAgZ19zdHJpbmdfZnJlZSAocywgVFJVRSk7CisgIH0KKworICBzaW5rX3RlbXBsYXRlID0gZ3N0X3N0YXRpY19wYWRfdGVtcGxhdGVfZ2V0ICgmc3RhdGljX3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsIHNpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCBzcmNfdGVtcGxhdGUpOworCisgIGJhc2VfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tcGcxMjNfYXVkaW9fZGVjX3N0YXJ0KTsKKyAgYmFzZV9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXBnMTIzX2F1ZGlvX2RlY19zdG9wKTsKKyAgYmFzZV9jbGFzcy0+aGFuZGxlX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXBnMTIzX2F1ZGlvX2RlY19oYW5kbGVfZnJhbWUpOworICBiYXNlX2NsYXNzLT5zZXRfZm9ybWF0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tcGcxMjNfYXVkaW9fZGVjX3NldF9mb3JtYXQpOworICBiYXNlX2NsYXNzLT5mbHVzaCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXBnMTIzX2F1ZGlvX2RlY19mbHVzaCk7CisKKyAgZXJyb3IgPSBtcGcxMjNfaW5pdCAoKTsKKyAgaWYgKEdfVU5MSUtFTFkgKGVycm9yICE9IE1QRzEyM19PSykpCisgICAgR1NUX0VSUk9SICgiQ291bGQgbm90IGluaXRpYWxpemUgbXBnMTIzIGxpYnJhcnk6ICVzIiwKKyAgICAgICAgbXBnMTIzX3BsYWluX3N0cmVycm9yIChlcnJvcikpOworICBlbHNlCisgICAgR1NUX0lORk8gKCJtcGcxMjMgbGlicmFyeSBpbml0aWFsaXplZCIpOworfQorCisKK3ZvaWQKK2dzdF9tcGcxMjNfYXVkaW9fZGVjX2luaXQgKEdzdE1wZzEyM0F1ZGlvRGVjICogbXBnMTIzX2RlY29kZXIpCit7CisgIG1wZzEyM19kZWNvZGVyLT5oYW5kbGUgPSBOVUxMOworICBnc3RfYXVkaW9fZGVjb2Rlcl9zZXRfbmVlZHNfZm9ybWF0IChHU1RfQVVESU9fREVDT0RFUiAobXBnMTIzX2RlY29kZXIpLCBUUlVFKTsKKyAgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X3VzZV9kZWZhdWx0X3BhZF9hY2NlcHRjYXBzIChHU1RfQVVESU9fREVDT0RFUl9DQVNUCisgICAgICAobXBnMTIzX2RlY29kZXIpLCBUUlVFKTsKKyAgR1NUX1BBRF9TRVRfQUNDRVBUX1RFTVBMQVRFIChHU1RfQVVESU9fREVDT0RFUl9TSU5LX1BBRCAobXBnMTIzX2RlY29kZXIpKTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tcGcxMjNfYXVkaW9fZGVjX3N0YXJ0IChHc3RBdWRpb0RlY29kZXIgKiBkZWMpCit7CisgIEdzdE1wZzEyM0F1ZGlvRGVjICptcGcxMjNfZGVjb2RlcjsKKyAgaW50IGVycm9yOworCisgIG1wZzEyM19kZWNvZGVyID0gR1NUX01QRzEyM19BVURJT19ERUMgKGRlYyk7CisgIGVycm9yID0gMDsKKworICBtcGcxMjNfZGVjb2Rlci0+aGFuZGxlID0gbXBnMTIzX25ldyAoTlVMTCwgJmVycm9yKTsKKyAgbXBnMTIzX2RlY29kZXItPmhhc19uZXh0X2F1ZGlvaW5mbyA9IEZBTFNFOworICBtcGcxMjNfZGVjb2Rlci0+ZnJhbWVfb2Zmc2V0ID0gMDsKKworICAvKiBJbml0aWFsbHksIHRoZSBtcGcxMjMgaGFuZGxlIGNvbWVzIHdpdGggYSBzZXQgb2YgZGVmYXVsdCBmb3JtYXRzCisgICAqIHN1cHBvcnRlZC4gVGhpcyBjbGVhcnMgdGhpcyBzZXQuICBUaGlzIGlzIG5lY2Vzc2FyeSwgc2luY2Ugb25seSBvbmUKKyAgICogZm9ybWF0IHNoYWxsIGJlIHN1cHBvcnRlZCAoc2VlIHNldF9mb3JtYXQgZm9yIG1vcmUpLiAqLworICBtcGcxMjNfZm9ybWF0X25vbmUgKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUpOworCisgIC8qIEJ1aWx0LWluIG1wZzEyMyBzdXBwb3J0IGZvciBnYXBsZXNzIGRlY29kaW5nIGlzIGRpc2FibGVkIGZvciBub3csCisgICAqIHNpbmNlIGl0IGRvZXMgbm90IHdvcmsgd2VsbCB3aXRoIHNlZWtpbmcgKi8KKyAgbXBnMTIzX3BhcmFtIChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlLCBNUEcxMjNfUkVNT1ZFX0ZMQUdTLCBNUEcxMjNfR0FQTEVTUywgMCk7CisgIC8qIFRlbGxzIG1wZzEyMyB0byB1c2UgYSBzbWFsbCByZWFkLWFoZWFkIGJ1ZmZlciBmb3IgYmV0dGVyIE1QRUcgc3luYzsKKyAgICogZXNzZW50aWFsIGZvciBNUDMgcmFkaW8gc3RyZWFtcyAqLworICBtcGcxMjNfcGFyYW0gKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUsIE1QRzEyM19BRERfRkxBR1MsIE1QRzEyM19TRUVLQlVGRkVSLCAwKTsKKyAgLyogU2V0cyB0aGUgcmVzeW5jIGxpbWl0IHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSAob3RoZXJ3aXNlIG1wZzEyMyBtYXkgZ2l2ZQorICAgKiB1cCBvbiBkZWNvZGluZyBwcmVtYXR1cmVseSwgZXNwZWNpYWxseSB3aXRoIG1wMyB3ZWIgcmFkaW9zKSAqLworICBtcGcxMjNfcGFyYW0gKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUsIE1QRzEyM19SRVNZTkNfTElNSVQsIC0xLCAwKTsKKyNpZiBNUEcxMjNfQVBJX1ZFUlNJT04gPj0gMzYKKyAgLyogVGhlIHByZWNpc2UgQVBJIHZlcnNpb24gd2hlcmUgTVBHMTIzX0FVVE9fUkVTQU1QTEUgYXBwZWFyZWQgaXMKKyAgICogc29tZXdoZXJlIGJldHdlZW4gMjkgYW5kIDM2ICovCisgIC8qIERvbid0IGxldCBtcGcxMjMgcmVzYW1wbGUgb3V0cHV0ICovCisgIG1wZzEyM19wYXJhbSAobXBnMTIzX2RlY29kZXItPmhhbmRsZSwgTVBHMTIzX1JFTU9WRV9GTEFHUywKKyAgICAgIE1QRzEyM19BVVRPX1JFU0FNUExFLCAwKTsKKyNlbmRpZgorICAvKiBEb24ndCBsZXQgbXBnMTIzIHByaW50IG1lc3NhZ2VzIHRvIHN0ZG91dC9zdGRlcnIgKi8KKyAgbXBnMTIzX3BhcmFtIChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlLCBNUEcxMjNfQUREX0ZMQUdTLCBNUEcxMjNfUVVJRVQsIDApOworCisgIC8qIE9wZW4gaW4gZmVlZCBtb2RlICg9IGVuY29kZWQgZGF0YSBpcyBmZWQgbWFudWFsbHkgaW50byB0aGUgaGFuZGxlKS4gKi8KKyAgZXJyb3IgPSBtcGcxMjNfb3Blbl9mZWVkIChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlKTsKKworICBpZiAoR19VTkxJS0VMWSAoZXJyb3IgIT0gTVBHMTIzX09LKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZWMsIExJQlJBUlksIElOSVQsIChOVUxMKSwKKyAgICAgICAgKCIlcyIsIG1wZzEyM19zdHJlcnJvciAobXBnMTIzX2RlY29kZXItPmhhbmRsZSkpKTsKKyAgICBtcGcxMjNfY2xvc2UgKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUpOworICAgIG1wZzEyM19kZWxldGUgKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUpOworICAgIG1wZzEyM19kZWNvZGVyLT5oYW5kbGUgPSBOVUxMOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIEdTVF9JTkZPX09CSkVDVCAoZGVjLCAibXBnMTIzIGRlY29kZXIgc3RhcnRlZCIpOworCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21wZzEyM19hdWRpb19kZWNfc3RvcCAoR3N0QXVkaW9EZWNvZGVyICogZGVjKQoreworICBHc3RNcGcxMjNBdWRpb0RlYyAqbXBnMTIzX2RlY29kZXIgPSBHU1RfTVBHMTIzX0FVRElPX0RFQyAoZGVjKTsKKworICBpZiAoR19MSUtFTFkgKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUgIT0gTlVMTCkpIHsKKyAgICBtcGcxMjNfY2xvc2UgKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUpOworICAgIG1wZzEyM19kZWxldGUgKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUpOworICAgIG1wZzEyM19kZWNvZGVyLT5oYW5kbGUgPSBOVUxMOworICB9CisKKyAgR1NUX0lORk9fT0JKRUNUIChkZWMsICJtcGcxMjMgZGVjb2RlciBzdG9wcGVkIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tcGcxMjNfYXVkaW9fZGVjX3B1c2hfZGVjb2RlZF9ieXRlcyAoR3N0TXBnMTIzQXVkaW9EZWMgKiBtcGcxMjNfZGVjb2RlciwKKyAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpkZWNvZGVkX2J5dGVzLCBzaXplX3QgY29uc3QgbnVtX2RlY29kZWRfYnl0ZXMpCit7CisgIEdzdEJ1ZmZlciAqb3V0cHV0X2J1ZmZlcjsKKyAgR3N0QXVkaW9EZWNvZGVyICpkZWM7CisKKyAgb3V0cHV0X2J1ZmZlciA9IE5VTEw7CisgIGRlYyA9IEdTVF9BVURJT19ERUNPREVSIChtcGcxMjNfZGVjb2Rlcik7CisKKyAgaWYgKChudW1fZGVjb2RlZF9ieXRlcyA9PSAwKSB8fCAoZGVjb2RlZF9ieXRlcyA9PSBOVUxMKSkgeworICAgIC8qIFRoaXMgb2NjdXJzIGluIHRoZSBmaXJzdCBmZXcgZnJhbWVzLCB3aGljaCBkbyBub3QgY2FycnkgZGF0YTsgb25jZQorICAgICAqIE1QRzEyM19BVURJT19ERUNfTkVXX0ZPUk1BVCBpcyByZWNlaXZlZCwgdGhlIGVtcHR5IGZyYW1lcyBzdG9wIG9jY3VycmluZyAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wZzEyM19kZWNvZGVyLAorICAgICAgICAiY2Fubm90IGRlY29kZSB5ZXQsIG5lZWQgbW9yZSBkYXRhIC0+IG5vIG91dHB1dCBidWZmZXIgdG8gcHVzaCIpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorCisgIG91dHB1dF9idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgbnVtX2RlY29kZWRfYnl0ZXMsIE5VTEwpOworCisgIGlmIChvdXRwdXRfYnVmZmVyID09IE5VTEwpIHsKKyAgICAvKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhZHZhbmNlIHBsYXliYWNrIGluIHRpbWUsCisgICAgICogZXZlbiB3aGVuIG5vdGhpbmcgd2FzIGRlY29kZWQuICovCisgICAgcmV0dXJuIGdzdF9hdWRpb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoZGVjLCBOVUxMLCAxKTsKKyAgfSBlbHNlIHsKKyAgICBHc3RNYXBJbmZvIGluZm87CisKKyAgICBpZiAoZ3N0X2J1ZmZlcl9tYXAgKG91dHB1dF9idWZmZXIsICZpbmZvLCBHU1RfTUFQX1dSSVRFKSkgeworICAgICAgbWVtY3B5IChpbmZvLmRhdGEsIGRlY29kZWRfYnl0ZXMsIG51bV9kZWNvZGVkX2J5dGVzKTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dHB1dF9idWZmZXIsICZpbmZvKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAobXBnMTIzX2RlY29kZXIsICJnc3RfYnVmZmVyX21hcCgpIHJldHVybmVkIE5VTEwiKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dHB1dF9idWZmZXIpOworICAgICAgb3V0cHV0X2J1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGdzdF9hdWRpb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoZGVjLCBvdXRwdXRfYnVmZmVyLCAxKTsKKyAgfQorfQorCisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbXBnMTIzX2F1ZGlvX2RlY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywKKyAgICBHc3RCdWZmZXIgKiBpbnB1dF9idWZmZXIpCit7CisgIEdzdE1wZzEyM0F1ZGlvRGVjICptcGcxMjNfZGVjb2RlcjsKKyAgaW50IGRlY29kZV9lcnJvcjsKKyAgdW5zaWduZWQgY2hhciAqZGVjb2RlZF9ieXRlczsKKyAgc2l6ZV90IG51bV9kZWNvZGVkX2J5dGVzOworICBHc3RGbG93UmV0dXJuIHJldHZhbDsKKworICBtcGcxMjNfZGVjb2RlciA9IEdTVF9NUEcxMjNfQVVESU9fREVDIChkZWMpOworCisgIGdfYXNzZXJ0IChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlICE9IE5VTEwpOworCisgIC8qIFRoZSBhY3R1YWwgZGVjb2RpbmcgKi8KKyAgeworICAgIC8qIGZlZWQgaW5wdXQgZGF0YSAoaWYgdGhlcmUgaXMgYW55KSAqLworICAgIGlmIChHX0xJS0VMWSAoaW5wdXRfYnVmZmVyICE9IE5VTEwpKSB7CisgICAgICBHc3RNYXBJbmZvIGluZm87CisKKyAgICAgIGlmIChnc3RfYnVmZmVyX21hcCAoaW5wdXRfYnVmZmVyLCAmaW5mbywgR1NUX01BUF9SRUFEKSkgeworICAgICAgICBtcGcxMjNfZmVlZCAobXBnMTIzX2RlY29kZXItPmhhbmRsZSwgaW5mby5kYXRhLCBpbmZvLnNpemUpOworICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChpbnB1dF9idWZmZXIsICZpbmZvKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9BVURJT19ERUNPREVSX0VSUk9SIChtcGcxMjNfZGVjb2RlciwgMSwgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICAgICAgICgiZ3N0X21lbW9yeV9tYXAoKSBmYWlsZWQiKSwgcmV0dmFsKTsKKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUcnkgdG8gZGVjb2RlIGEgZnJhbWUgKi8KKyAgICBkZWNvZGVkX2J5dGVzID0gTlVMTDsKKyAgICBudW1fZGVjb2RlZF9ieXRlcyA9IDA7CisgICAgZGVjb2RlX2Vycm9yID0gbXBnMTIzX2RlY29kZV9mcmFtZSAobXBnMTIzX2RlY29kZXItPmhhbmRsZSwKKyAgICAgICAgJm1wZzEyM19kZWNvZGVyLT5mcmFtZV9vZmZzZXQsICZkZWNvZGVkX2J5dGVzLCAmbnVtX2RlY29kZWRfYnl0ZXMpOworICB9CisKKyAgcmV0dmFsID0gR1NUX0ZMT1dfT0s7CisKKyAgc3dpdGNoIChkZWNvZGVfZXJyb3IpIHsKKyAgICBjYXNlIE1QRzEyM19ORVdfRk9STUFUOgorICAgICAgLyogQXMgbWVudGlvbmVkIGluIGdzdF9tcGcxMjNfYXVkaW9fZGVjX3NldF9mb3JtYXQoKSwgdGhlIG5leHQgYXVkaW9pbmZvCisgICAgICAgKiBpcyBub3Qgc2V0IGltbWVkaWF0ZWx5OyBpbnN0ZWFkLCB0aGUgY29kZSB3YWl0cyBmb3IgbXBnMTIzIHRvIHRha2UKKyAgICAgICAqIG5vdGUgb2YgdGhlIG5ldyBmb3JtYXQsIGFuZCB0aGVuIHNldHMgdGhlIGF1ZGlvaW5mby4gVGhpcyBmaXhlcyBnbGl0Y2hlcworICAgICAgICogd2l0aCBtcDNzIGNvbnRhaW5pbmcgc2V2ZXJhbCBmb3JtYXQgaGVhZGVycyAoZm9yIGV4YW1wbGUsIGZpcnN0IGhhbGYKKyAgICAgICAqIHVzaW5nIDQ0LjFrSHosIHNlY29uZCBoYWxmIDMyIGtIeikgKi8KKworICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlYywKKyAgICAgICAgICAibXBnMTIzIHJlcG9ydGVkIGEgbmV3IGZvcm1hdCAtPiBzZXR0aW5nIG5leHQgc3JjY2FwcyIpOworCisgICAgICBnc3RfbXBnMTIzX2F1ZGlvX2RlY19wdXNoX2RlY29kZWRfYnl0ZXMgKG1wZzEyM19kZWNvZGVyLCBkZWNvZGVkX2J5dGVzLAorICAgICAgICAgIG51bV9kZWNvZGVkX2J5dGVzKTsKKworICAgICAgLyogSWYgdGhlcmUgaXMgYSBuZXh0IGF1ZGlvaW5mbywgdXNlIGl0LCB0aGVuIHNldCBoYXNfbmV4dF9hdWRpb2luZm8gdG8KKyAgICAgICAqIEZBTFNFLCB0byBtYWtlIHN1cmUgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X291dHB1dF9mb3JtYXQoKSBpc24ndCBjYWxsZWQKKyAgICAgICAqIGFnYWluIHVudGlsIHNldF9mb3JtYXQgaXMgY2FsbGVkIGJ5IHRoZSBiYXNlIGNsYXNzICovCisgICAgICBpZiAobXBnMTIzX2RlY29kZXItPmhhc19uZXh0X2F1ZGlvaW5mbykgeworICAgICAgICBpZiAoIWdzdF9hdWRpb19kZWNvZGVyX3NldF9vdXRwdXRfZm9ybWF0IChkZWMsCisgICAgICAgICAgICAgICAgJihtcGcxMjNfZGVjb2Rlci0+bmV4dF9hdWRpb2luZm8pKSkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVjLCAiVW5hYmxlIHRvIHNldCBvdXRwdXQgZm9ybWF0Iik7CisgICAgICAgICAgcmV0dmFsID0gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgICAgICAgIH0KKyAgICAgICAgbXBnMTIzX2RlY29kZXItPmhhc19uZXh0X2F1ZGlvaW5mbyA9IEZBTFNFOworICAgICAgfQorCisgICAgICBicmVhazsKKworICAgIGNhc2UgTVBHMTIzX05FRURfTU9SRToKKyAgICBjYXNlIE1QRzEyM19PSzoKKyAgICAgIHJldHZhbCA9IGdzdF9tcGcxMjNfYXVkaW9fZGVjX3B1c2hfZGVjb2RlZF9ieXRlcyAobXBnMTIzX2RlY29kZXIsCisgICAgICAgICAgZGVjb2RlZF9ieXRlcywgbnVtX2RlY29kZWRfYnl0ZXMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1QRzEyM19ET05FOgorICAgICAgLyogSWYgdGhpcyBoYXBwZW5zLCB0aGVuIHRoZSB1cHN0cmVhbSBwYXJzZXIgc29tZWhvdyBtaXNzZWQgdGhlIGVuZGluZworICAgICAgICogb2YgdGhlIGJpdHN0cmVhbSAqLworICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlYywgIm1wZzEyMyBpcyBkb25lIGRlY29kaW5nIik7CisgICAgICBnc3RfbXBnMTIzX2F1ZGlvX2RlY19wdXNoX2RlY29kZWRfYnl0ZXMgKG1wZzEyM19kZWNvZGVyLCBkZWNvZGVkX2J5dGVzLAorICAgICAgICAgIG51bV9kZWNvZGVkX2J5dGVzKTsKKyAgICAgIHJldHZhbCA9IEdTVF9GTE9XX0VPUzsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICAvKiBBbnl0aGluZyBlbHNlIGlzIGNvbnNpZGVyZWQgYW4gZXJyb3IgKi8KKyAgICAgIGludCBlcnJjb2RlOworICAgICAgcmV0dmFsID0gR1NUX0ZMT1dfRVJST1I7ICAvKiB1c2UgZXJyb3IgYnkgZGVmYXVsdCAqLworICAgICAgc3dpdGNoIChkZWNvZGVfZXJyb3IpIHsKKyAgICAgICAgY2FzZSBNUEcxMjNfRVJSOgorICAgICAgICAgIGVycmNvZGUgPSBtcGcxMjNfZXJyY29kZSAobXBnMTIzX2RlY29kZXItPmhhbmRsZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZXJyY29kZSA9IGRlY29kZV9lcnJvcjsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoZXJyY29kZSkgeworICAgICAgICBjYXNlIE1QRzEyM19CQURfT1VURk9STUFUOnsKKyAgICAgICAgICBHc3RDYXBzICppbnB1dF9jYXBzID0KKyAgICAgICAgICAgICAgZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChHU1RfQVVESU9fREVDT0RFUl9TSU5LX1BBRCAoZGVjKSk7CisgICAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlYywgU1RSRUFNLCBGT1JNQVQsIChOVUxMKSwKKyAgICAgICAgICAgICAgKCJPdXRwdXQgc2FtcGxlIGZvcm1hdCBjb3VsZCBub3QgYmUgdXNlZCB3aGVuIHRyeWluZyB0byBkZWNvZGUgZnJhbWUuICIKKyAgICAgICAgICAgICAgICAgICJUaGlzIGlzIHR5cGljYWxseSBjYXVzZWQgd2hlbiB0aGUgaW5wdXQgY2FwcyAob2Z0ZW4gdGhlIHNhbXBsZSAiCisgICAgICAgICAgICAgICAgICAicmF0ZSkgZG8gbm90IG1hdGNoIHRoZSBhY3R1YWwgZm9ybWF0IG9mIHRoZSBhdWRpbyBkYXRhLiAiCisgICAgICAgICAgICAgICAgICAiSW5wdXQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGlucHV0X2NhcHMpCisgICAgICAgICAgICAgICk7CisgICAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKGlucHV0X2NhcHMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6eworICAgICAgICAgIGNoYXIgY29uc3QgKmVycm1zZyA9IG1wZzEyM19wbGFpbl9zdHJlcnJvciAoZXJyY29kZSk7CisgICAgICAgICAgLyogR1NUX0FVRElPX0RFQ09ERVJfRVJST1Igc2V0cyBhIG5ldyByZXR1cm4gdmFsdWUgYWNjb3JkaW5nIHRvCisgICAgICAgICAgICogaXRzIGVzdGltYXRpb25zICovCisgICAgICAgICAgR1NUX0FVRElPX0RFQ09ERVJfRVJST1IgKG1wZzEyM19kZWNvZGVyLCAxLCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAgICAgICAoIm1wZzEyMyBkZWNvZGluZyBlcnJvcjogJXMiLCBlcnJtc2cpLCByZXR2YWwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tcGcxMjNfYXVkaW9fZGVjX3NldF9mb3JtYXQgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywgR3N0Q2FwcyAqIGlucHV0X2NhcHMpCit7CisgIC8qICJlbmNvZGluZyIgaXMgdGhlIHNhbXBsZSBmb3JtYXQgc3BlY2lmaWVyIGZvciBtcGcxMjMgKi8KKyAgaW50IGVuY29kaW5nOworICBpbnQgc2FtcGxlX3JhdGUsIG51bV9jaGFubmVsczsKKyAgR3N0QXVkaW9Gb3JtYXQgZm9ybWF0OworICBHc3RNcGcxMjNBdWRpb0RlYyAqbXBnMTIzX2RlY29kZXI7CisgIGdib29sZWFuIHJldHZhbCA9IEZBTFNFOworCisgIG1wZzEyM19kZWNvZGVyID0gR1NUX01QRzEyM19BVURJT19ERUMgKGRlYyk7CisKKyAgZ19hc3NlcnQgKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUgIT0gTlVMTCk7CisKKyAgbXBnMTIzX2RlY29kZXItPmhhc19uZXh0X2F1ZGlvaW5mbyA9IEZBTFNFOworCisgIC8qIEdldCBzYW1wbGUgcmF0ZSBhbmQgbnVtYmVyIG9mIGNoYW5uZWxzIGZyb20gaW5wdXRfY2FwcyAqLworICB7CisgICAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgICAgZ2Jvb2xlYW4gZXJyID0gRkFMU0U7CisKKyAgICAvKiBPbmx5IHRoZSBmaXJzdCBzdHJ1Y3R1cmUgaXMgdXNlZCAobXVsdGlwbGUKKyAgICAgKiBpbnB1dCBjYXBzIHN0cnVjdHVyZXMgZG9uJ3QgbWFrZSBzZW5zZSAqLworICAgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGlucHV0X2NhcHMsIDApOworCisgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgInJhdGUiLCAmc2FtcGxlX3JhdGUpKSB7CisgICAgICBlcnIgPSBUUlVFOworICAgICAgR1NUX0VSUk9SX09CSkVDVCAoZGVjLCAiSW5wdXQgY2FwcyBkbyBub3QgaGF2ZSBhIHJhdGUgdmFsdWUiKTsKKyAgICB9CisgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNoYW5uZWxzIiwgJm51bV9jaGFubmVscykpIHsKKyAgICAgIGVyciA9IFRSVUU7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChkZWMsICJJbnB1dCBjYXBzIGRvIG5vdCBoYXZlIGEgY2hhbm5lbCB2YWx1ZSIpOworICAgIH0KKworICAgIGlmIChHX1VOTElLRUxZIChlcnIpKQorICAgICAgZ290byBkb25lOworICB9CisKKyAgLyogR2V0IHNhbXBsZSBmb3JtYXQgZnJvbSB0aGUgYWxsb3dlZCBzcmMgY2FwcyAqLworICB7CisgICAgR3N0Q2FwcyAqYWxsb3dlZF9zcmNjYXBzID0KKyAgICAgICAgZ3N0X3BhZF9nZXRfYWxsb3dlZF9jYXBzIChHU1RfQVVESU9fREVDT0RFUl9TUkNfUEFEIChkZWMpKTsKKworICAgIGlmIChhbGxvd2VkX3NyY2NhcHMgPT0gTlVMTCkgeworICAgICAgLyogc3JjcGFkIGlzIG5vdCBsaW5rZWQgKHlldCksIHNvIG5vIHBlZXIgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlOworICAgICAgICoganVzdCB1c2UgdGhlIGRlZmF1bHQgc2FtcGxlIGZvcm1hdCAoMTYgYml0IHNpZ25lZCBpbnRlZ2VyKSAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXBnMTIzX2RlY29kZXIsCisgICAgICAgICAgInNyY3BhZCBpcyBub3QgbGlua2VkICh5ZXQpIC0+IHVzaW5nIFMxNiBzYW1wbGUgZm9ybWF0Iik7CisgICAgICBmb3JtYXQgPSBHU1RfQVVESU9fRk9STUFUX1MxNjsKKyAgICAgIGVuY29kaW5nID0gTVBHMTIzX0VOQ19TSUdORURfMTY7CisgICAgfSBlbHNlIGlmIChnc3RfY2Fwc19pc19lbXB0eSAoYWxsb3dlZF9zcmNjYXBzKSkgeworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGFsbG93ZWRfc3JjY2Fwcyk7CisgICAgICBnb3RvIGRvbmU7CisgICAgfSBlbHNlIHsKKyAgICAgIGdjaGFyIGNvbnN0ICpmb3JtYXRfc3RyOworICAgICAgR1ZhbHVlIGNvbnN0ICpmb3JtYXRfdmFsdWU7CisKKyAgICAgIC8qIExvb2sgYXQgdGhlIHNhbXBsZSBmb3JtYXQgdmFsdWVzIGZyb20gdGhlIGZpcnN0IHN0cnVjdHVyZSAqLworICAgICAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhbGxvd2VkX3NyY2NhcHMsIDApOworICAgICAgZm9ybWF0X3ZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImZvcm1hdCIpOworCisgICAgICBpZiAoZm9ybWF0X3ZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKGFsbG93ZWRfc3JjY2Fwcyk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0gZWxzZSBpZiAoR1NUX1ZBTFVFX0hPTERTX0xJU1QgKGZvcm1hdF92YWx1ZSkpIHsKKyAgICAgICAgLyogaWYgdmFsdWUgaXMgYSBmb3JtYXQgbGlzdCwgcGljayB0aGUgZmlyc3QgZW50cnkgKi8KKyAgICAgICAgR1ZhbHVlIGNvbnN0ICpmbXRfbGlzdF92YWx1ZSA9CisgICAgICAgICAgICBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKGZvcm1hdF92YWx1ZSwgMCk7CisgICAgICAgIGZvcm1hdF9zdHIgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKGZtdF9saXN0X3ZhbHVlKTsKKyAgICAgIH0gZWxzZSBpZiAoR19WQUxVRV9IT0xEU19TVFJJTkcgKGZvcm1hdF92YWx1ZSkpIHsKKyAgICAgICAgLyogaWYgdmFsdWUgaXMgYSBzdHJpbmcsIHVzZSBpdCBkaXJlY3RseSAqLworICAgICAgICBmb3JtYXRfc3RyID0gZ192YWx1ZV9nZXRfc3RyaW5nIChmb3JtYXRfdmFsdWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAobXBnMTIzX2RlY29kZXIsICJ1bmV4cGVjdGVkIHR5cGUgZm9yICdmb3JtYXQnIGZpZWxkICIKKyAgICAgICAgICAgICJpbiBjYXBzIHN0cnVjdHVyZSAlIiBHU1RfUFRSX0ZPUk1BVCwgc3RydWN0dXJlKTsKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKGFsbG93ZWRfc3JjY2Fwcyk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKworICAgICAgLyogZ2V0IHRoZSBmb3JtYXQgdmFsdWUgZnJvbSB0aGUgc3RyaW5nICovCisgICAgICBmb3JtYXQgPSBnc3RfYXVkaW9fZm9ybWF0X2Zyb21fc3RyaW5nIChmb3JtYXRfc3RyKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChhbGxvd2VkX3NyY2NhcHMpOworCisgICAgICBnX2Fzc2VydCAoZm9ybWF0ICE9IEdTVF9BVURJT19GT1JNQVRfVU5LTk9XTik7CisKKyAgICAgIC8qIGNvbnZlcnQgZm9ybWF0IHRvIG1wZzEyMyBlbmNvZGluZyAqLworICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MxNjoKKyAgICAgICAgICBlbmNvZGluZyA9IE1QRzEyM19FTkNfU0lHTkVEXzE2OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzI0OgorICAgICAgICAgIGVuY29kaW5nID0gTVBHMTIzX0VOQ19TSUdORURfMjQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMzI6CisgICAgICAgICAgZW5jb2RpbmcgPSBNUEcxMjNfRU5DX1NJR05FRF8zMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1UxNjoKKyAgICAgICAgICBlbmNvZGluZyA9IE1QRzEyM19FTkNfVU5TSUdORURfMTY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9VMjQ6CisgICAgICAgICAgZW5jb2RpbmcgPSBNUEcxMjNfRU5DX1VOU0lHTkVEXzI0OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfVTMyOgorICAgICAgICAgIGVuY29kaW5nID0gTVBHMTIzX0VOQ19VTlNJR05FRF8zMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX0YzMjoKKyAgICAgICAgICBlbmNvZGluZyA9IE1QRzEyM19FTkNfRkxPQVRfMzI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICAgICAgZ290byBkb25lOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFNhbXBsZSByYXRlLCBudW1iZXIgb2YgY2hhbm5lbHMsIGFuZCBzYW1wbGUgZm9ybWF0IGFyZSBrbm93biBhdCB0aGlzIHBvaW50LgorICAgKiBTZXQgdGhlIGF1ZGlvaW5mbyBzdHJ1Y3R1cmUncyB2YWx1ZXMgYW5kIHRoZSBtcGcxMjMgZm9ybWF0LiAqLworICB7CisgICAgaW50IGVycjsKKworICAgIC8qIGNsZWFyIGFsbCBleGlzdGluZyBmb3JtYXQgc2V0dGluZ3MgZnJvbSB0aGUgbXBnMTIzIGluc3RhbmNlICovCisgICAgbXBnMTIzX2Zvcm1hdF9ub25lIChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlKTsKKyAgICAvKiBzZXQgdGhlIGNob3NlbiBmb3JtYXQgKi8KKyAgICBlcnIgPQorICAgICAgICBtcGcxMjNfZm9ybWF0IChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlLCBzYW1wbGVfcmF0ZSwgbnVtX2NoYW5uZWxzLAorICAgICAgICBlbmNvZGluZyk7CisKKyAgICBpZiAoZXJyICE9IE1QRzEyM19PSykgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZWMsCisgICAgICAgICAgIm1wZzEyM19mb3JtYXQoKSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICBtcGcxMjNfc3RyZXJyb3IgKG1wZzEyM19kZWNvZGVyLT5oYW5kbGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJihtcGcxMjNfZGVjb2Rlci0+bmV4dF9hdWRpb2luZm8pKTsKKyAgICAgIGdzdF9hdWRpb19pbmZvX3NldF9mb3JtYXQgKCYobXBnMTIzX2RlY29kZXItPm5leHRfYXVkaW9pbmZvKSwgZm9ybWF0LAorICAgICAgICAgIHNhbXBsZV9yYXRlLCBudW1fY2hhbm5lbHMsIE5VTEwpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlYywgIlRoZSBuZXh0IGF1ZGlvIGZvcm1hdCBpczogJXMsICV1IEh6LCAldSBjaGFubmVscyIsCisgICAgICAgICAgZ3N0X2F1ZGlvX2Zvcm1hdF90b19zdHJpbmcgKGZvcm1hdCksIHNhbXBsZV9yYXRlLCBudW1fY2hhbm5lbHMpOworICAgICAgbXBnMTIzX2RlY29kZXItPmhhc19uZXh0X2F1ZGlvaW5mbyA9IFRSVUU7CisKKyAgICAgIHJldHZhbCA9IFRSVUU7CisgICAgfQorICB9CisKK2RvbmU6CisgIHJldHVybiByZXR2YWw7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9tcGcxMjNfYXVkaW9fZGVjX2ZsdXNoIChHc3RBdWRpb0RlY29kZXIgKiBkZWMsIGdib29sZWFuIGhhcmQpCit7CisgIGludCBlcnJvcjsKKyAgR3N0TXBnMTIzQXVkaW9EZWMgKm1wZzEyM19kZWNvZGVyOworCisgIEdTVF9MT0dfT0JKRUNUIChkZWMsICJGbHVzaGluZyBkZWNvZGVyIik7CisKKyAgbXBnMTIzX2RlY29kZXIgPSBHU1RfTVBHMTIzX0FVRElPX0RFQyAoZGVjKTsKKworICBnX2Fzc2VydCAobXBnMTIzX2RlY29kZXItPmhhbmRsZSAhPSBOVUxMKTsKKworICAvKiBGbHVzaCBieSByZW9wZW5pbmcgdGhlIGZlZWQgKi8KKyAgbXBnMTIzX2Nsb3NlIChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlKTsKKyAgZXJyb3IgPSBtcGcxMjNfb3Blbl9mZWVkIChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlKTsKKworICBpZiAoR19VTkxJS0VMWSAoZXJyb3IgIT0gTVBHMTIzX09LKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZWMsIExJQlJBUlksIElOSVQsIChOVUxMKSwKKyAgICAgICAgKCJFcnJvciB3aGlsZSByZW9wZW5pbmcgbXBnMTIzIGZlZWQ6ICVzIiwKKyAgICAgICAgICAgIG1wZzEyM19wbGFpbl9zdHJlcnJvciAoZXJyb3IpKSk7CisgICAgbXBnMTIzX2Nsb3NlIChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlKTsKKyAgICBtcGcxMjNfZGVsZXRlIChtcGcxMjNfZGVjb2Rlci0+aGFuZGxlKTsKKyAgICBtcGcxMjNfZGVjb2Rlci0+aGFuZGxlID0gTlVMTDsKKyAgfQorCisgIGlmIChoYXJkKQorICAgIG1wZzEyM19kZWNvZGVyLT5oYXNfbmV4dF9hdWRpb2luZm8gPSBGQUxTRTsKKworICAvKiBvcGVuaW5nL2Nsb3NpbmcgZmVlZHMgZG8gbm90IGFmZmVjdCB0aGUgZm9ybWF0IGRlZmluZWQgYnkgdGhlCisgICAqIG1wZzEyM19mb3JtYXQoKSBjYWxsIHRoYXQgd2FzIG1hZGUgaW4gZ3N0X21wZzEyM19hdWRpb19kZWNfc2V0X2Zvcm1hdCgpLAorICAgKiBhbmQgc2luY2UgdGhlIHVwL2Rvd25zdHJlYW0gY2FwcyBhcmUgbm90IGV4cGVjdGVkIHRvIGNoYW5nZSBoZXJlLCBubworICAgKiBtcGcxMjNfZm9ybWF0KCkgY2FsbHMgYXJlIGRvbmUgKi8KK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm1wZzEyM2F1ZGlvZGVjIiwKKyAgICAgIEdTVF9SQU5LX01BUkdJTkFMLCBnc3RfbXBnMTIzX2F1ZGlvX2RlY19nZXRfdHlwZSAoKSk7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBtcGcxMjMsICJtcDMgZGVjb2RpbmcgYmFzZWQgb24gdGhlIG1wZzEyMyBsaWJyYXJ5IiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9leHQvbXBnMTIzL2dzdG1wZzEyM2F1ZGlvZGVjLmggYi9leHQvbXBnMTIzL2dzdG1wZzEyM2F1ZGlvZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2NWM0MQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tcGcxMjMvZ3N0bXBnMTIzYXVkaW9kZWMuaApAQCAtMCwwICsxLDc0IEBACisvKiAgTVAzIGRlY29kaW5nIHBsdWdpbiBmb3IgR1N0cmVhbWVyIHVzaW5nIHRoZSBtcGcxMjMgbGlicmFyeQorICogIENvcHlyaWdodCAoQykgMjAxMiBDYXJsb3MgUmFmYWVsIEdpYW5pCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBfX0dTVF9NUEcxMjNfQVVESU9fREVDX0hfXworI2RlZmluZSBfX0dTVF9NUEcxMjNfQVVESU9fREVDX0hfXworCisvKiBUaGlzIGlzIHdoYXQgdGhlIHZpc3VhbCBzdHVkaW8gYnVpbGQgaW4gbXBnMTIzIGRvZXMgYmVmb3JlIGluY2x1ZGluZyB0aGUKKyAqIG9yaWdpbmFsIGhlYWRlciBmaWxlLiBXaXRob3V0IHRoaXMgd2UgZ2V0IHN5bnRheCBlcnJvcnMgaW4gdGhlCisgKiByZXBsYWNlX3JlYWRlciBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgYmVjYXVzZSBpdCBkb2Vzbid0IGtub3cgc3NpemVfdCBldGMuCisgKiBJdCBkb2Vzbid0IHJlYWx5IG1hdHRlciBmb3IgdXMgaWYgdGhlIHNzaXplX3QgdHlwZWRlZiBoZXJlIGlzIGNvcnJlY3QuICovCisjaWZkZWYgX01TQ19WRVIKKyNpbmNsdWRlIDx0Y2hhci5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgordHlwZWRlZiBsb25nIHNzaXplX3Q7CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9kZWNvZGVyLmg+CisjaW5jbHVkZSA8bXBnMTIzLmg+CisKKworR19CRUdJTl9ERUNMUworCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RNcGcxMjNBdWRpb0RlYyBHc3RNcGcxMjNBdWRpb0RlYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RNcGcxMjNBdWRpb0RlY0NsYXNzIEdzdE1wZzEyM0F1ZGlvRGVjQ2xhc3M7CisKKworI2RlZmluZSBHU1RfVFlQRV9NUEcxMjNfQVVESU9fREVDICAgICAgICAgICAgIChnc3RfbXBnMTIzX2F1ZGlvX2RlY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfTVBHMTIzX0FVRElPX0RFQyhvYmopICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSwgR1NUX1RZUEVfTVBHMTIzX0FVRElPX0RFQyxHc3RNcGcxMjNBdWRpb0RlYykpCisjZGVmaW5lIEdTVF9NUEcxMjNfQVVESU9fREVDX0NMQVNTKGtsYXNzKSAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksIEdTVF9UWVBFX01QRzEyM19BVURJT19ERUMsR3N0TXBnMTIzQXVkaW9EZWNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19NUEcxMjNfQVVESU9fREVDKG9iaikgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLCBHU1RfVFlQRV9NUEcxMjNfQVVESU9fREVDKSkKKyNkZWZpbmUgR1NUX0lTX01QRzEyM19BVURJT19ERUNfQ0xBU1Moa2xhc3MpICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSwgR1NUX1RZUEVfTVBHMTIzX0FVRElPX0RFQykpCisKK3N0cnVjdCBfR3N0TXBnMTIzQXVkaW9EZWMKK3sKKyAgR3N0QXVkaW9EZWNvZGVyIHBhcmVudDsKKworICBtcGcxMjNfaGFuZGxlICpoYW5kbGU7CisKKyAgR3N0QXVkaW9JbmZvIG5leHRfYXVkaW9pbmZvOworICBnYm9vbGVhbiBoYXNfbmV4dF9hdWRpb2luZm87CisKKyAgb2ZmX3QgZnJhbWVfb2Zmc2V0OworfTsKKworCitzdHJ1Y3QgX0dzdE1wZzEyM0F1ZGlvRGVjQ2xhc3MKK3sKKyAgR3N0QXVkaW9EZWNvZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR19HTlVDX0lOVEVSTkFMIEdUeXBlIGdzdF9tcGcxMjNfYXVkaW9fZGVjX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHQvbXBnMTIzL21lc29uLmJ1aWxkIGIvZXh0L21wZzEyMy9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODkxZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L21wZzEyMy9tZXNvbi5idWlsZApAQCAtMCwwICsxLDEyIEBACittcGcxMjNfZGVwID0gZGVwZW5kZW5jeSgnbGlibXBnMTIzJywgdmVyc2lvbiA6ICc+PSAxLjMnLCByZXF1aXJlZCA6IGZhbHNlKQorCitpZiBtcGcxMjNfZGVwLmZvdW5kKCkKKyAgZ3N0bXBnMTIzID0gbGlicmFyeSgnZ3N0bXBnMTIzJywKKyAgICAnZ3N0bXBnMTIzYXVkaW9kZWMuYycsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3N0YXVkaW9fZGVwLCBtcGcxMjNfZGVwXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCisgICkKK2VuZGlmCmRpZmYgLS1naXQgYS9leHQvcHVsc2UvTWFrZWZpbGUuYW0gYi9leHQvcHVsc2UvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlMDAwMgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9wdWxzZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIxIEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RwdWxzZWF1ZGlvLmxhCisKK2xpYmdzdHB1bHNlYXVkaW9fbGFfU09VUkNFUyA9IFwKKwlwbHVnaW4uYyBcCisJcHVsc2VzaW5rLmMgXAorCXB1bHNlc3JjLmMgXAorCXB1bHNlZGV2aWNlcHJvdmlkZXIuYyBcCisJcHVsc2V1dGlsLmMKKworbGliZ3N0cHVsc2VhdWRpb19sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKFBVTFNFX0NGTEFHUykKK2xpYmdzdHB1bHNlYXVkaW9fbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pIFwKKwktbGdzdHBidXRpbHMtJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoUFVMU0VfTElCUykKK2xpYmdzdHB1bHNlYXVkaW9fbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IFwKKwlwdWxzZXNpbmsuaCBcCisJcHVsc2VzcmMuaCBcCisJcHVsc2VkZXZpY2Vwcm92aWRlci5oIFwKKwlwdWxzZXV0aWwuaAorCmRpZmYgLS1naXQgYS9leHQvcHVsc2UvbWVzb24uYnVpbGQgYi9leHQvcHVsc2UvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4NWY5MQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9wdWxzZS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDIwIEBACitwdWxzZV9zb3VyY2VzID0gWworICAncGx1Z2luLmMnLAorICAncHVsc2VzaW5rLmMnLAorICAncHVsc2VzcmMuYycsCisgICdwdWxzZWRldmljZXByb3ZpZGVyLmMnLAorICAncHVsc2V1dGlsLmMnLAorXQorCitsaWJwdWxzZV9kZXAgPSBkZXBlbmRlbmN5KCdsaWJwdWxzZScsIHZlcnNpb24gOiAnPj0yLjAnLCByZXF1aXJlZCA6IGZhbHNlKQorCitpZiBsaWJwdWxzZV9kZXAuZm91bmQoKQorICBnc3RwdWxzZSA9IGxpYnJhcnkoJ2dzdHB1bHNlYXVkaW8nLAorICAgIHB1bHNlX3NvdXJjZXMsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3N0X2RlcCwgZ3N0YmFzZV9kZXAsIGdzdGF1ZGlvX2RlcCwgZ3N0cGJ1dGlsc19kZXAsIGxpYnB1bHNlX2RlcF0sCisgICAgaW5zdGFsbCA6IHRydWUsCisgICAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorICApCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L3B1bHNlL3BsdWdpbi5jIGIvZXh0L3B1bHNlL3BsdWdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYzhmZTUKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcHVsc2UvcGx1Z2luLmMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqICBHU3RyZWFtZXIgcHVsc2VhdWRpbyBwbHVnaW4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA0LTIwMDggTGVubmFydCBQb2V0dGVyaW5nCisgKgorICogIGdzdC1wdWxzZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICogIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIGdzdC1wdWxzZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggZ3N0LXB1bHNlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEKKyAqICBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC1pMThuLXBsdWdpbi5oPgorCisjaW5jbHVkZSAicHVsc2VzaW5rLmgiCisjaW5jbHVkZSAicHVsc2VzcmMuaCIKKyNpbmNsdWRlICJwdWxzZWRldmljZXByb3ZpZGVyLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWSAocHVsc2VfZGVidWcpOworCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisjaWZkZWYgRU5BQkxFX05MUworICBHU1RfREVCVUcgKCJiaW5kaW5nIHRleHQgZG9tYWluICVzIHRvIGxvY2FsZSBkaXIgJXMiLCBHRVRURVhUX1BBQ0tBR0UsCisgICAgICBMT0NBTEVESVIpOworICBiaW5kdGV4dGRvbWFpbiAoR0VUVEVYVF9QQUNLQUdFLCBMT0NBTEVESVIpOworICBiaW5kX3RleHRkb21haW5fY29kZXNldCAoR0VUVEVYVF9QQUNLQUdFLCAiVVRGLTgiKTsKKyNlbmRpZgorCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInB1bHNlc2luayIsIEdTVF9SQU5LX1BSSU1BUlkgKyAxMCwKKyAgICAgICAgICBHU1RfVFlQRV9QVUxTRVNJTkspKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJwdWxzZXNyYyIsIEdTVF9SQU5LX1BSSU1BUlkgKyAxMCwKKyAgICAgICAgICBHU1RfVFlQRV9QVUxTRVNSQykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X2RldmljZV9wcm92aWRlcl9yZWdpc3RlciAocGx1Z2luLCAicHVsc2VkZXZpY2Vwcm92aWRlciIsCisgICAgICAgICAgR1NUX1JBTktfUFJJTUFSWSwgR1NUX1RZUEVfUFVMU0VfREVWSUNFX1BST1ZJREVSKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHB1bHNlX2RlYnVnLCAicHVsc2UiLCAwLCAiUHVsc2VBdWRpbyBlbGVtZW50cyIpOworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHB1bHNlYXVkaW8sCisgICAgIlB1bHNlQXVkaW8gcGx1Z2luIGxpYnJhcnkiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2V4dC9wdWxzZS9wdWxzZWRldmljZXByb3ZpZGVyLmMgYi9leHQvcHVsc2UvcHVsc2VkZXZpY2Vwcm92aWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOTY0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcHVsc2UvcHVsc2VkZXZpY2Vwcm92aWRlci5jCkBAIC0wLDAgKzEsNjkwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMiBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+CisgKgorICogcHVsc2VkZXZpY2Vwcm92aWRlci5jOiBwdWxzZWF1ZGlvIGRldmljZSBwcm9iaW5nIGFuZCBtb25pdG9yaW5nCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAicHVsc2VkZXZpY2Vwcm92aWRlci5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJwdWxzZXNyYy5oIgorI2luY2x1ZGUgInB1bHNlc2luay5oIgorI2luY2x1ZGUgInB1bHNldXRpbC5oIgorCisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKHB1bHNlX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHB1bHNlX2RlYnVnCisKKworc3RhdGljIEdzdERldmljZSAqZ3N0X3B1bHNlX2RldmljZV9uZXcgKGd1aW50IGlkLAorICAgIGNvbnN0IGdjaGFyICogZGV2aWNlX25hbWUsIEdzdENhcHMgKiBjYXBzLCBjb25zdCBnY2hhciAqIGludGVybmFsX25hbWUsCisgICAgR3N0UHVsc2VEZXZpY2VUeXBlIHR5cGUsIEdzdFN0cnVjdHVyZSAqIHByb3BlcnRpZXMpOworCitHX0RFRklORV9UWVBFIChHc3RQdWxzZURldmljZVByb3ZpZGVyLCBnc3RfcHVsc2VfZGV2aWNlX3Byb3ZpZGVyLAorICAgIEdTVF9UWVBFX0RFVklDRV9QUk9WSURFUik7CisKK3N0YXRpYyB2b2lkIGdzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X3B1bHNlX2RldmljZV9wcm92aWRlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcHVsc2VfZGV2aWNlX3Byb3ZpZGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworCitzdGF0aWMgR0xpc3QgKmdzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfcHJvYmUgKEdzdERldmljZVByb3ZpZGVyICogcHJvdmlkZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfc3RhcnQgKEdzdERldmljZVByb3ZpZGVyICogcHJvdmlkZXIpOworc3RhdGljIHZvaWQgZ3N0X3B1bHNlX2RldmljZV9wcm92aWRlcl9zdG9wIChHc3REZXZpY2VQcm92aWRlciAqIHByb3ZpZGVyKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfU0VSVkVSLAorICBQUk9QX0NMSUVOVF9OQU1FLAorICBQUk9QX0xBU1QKK307CisKKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfY2xhc3NfaW5pdCAoR3N0UHVsc2VEZXZpY2VQcm92aWRlckNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdERldmljZVByb3ZpZGVyQ2xhc3MgKmRtX2NsYXNzID0gR1NUX0RFVklDRV9QUk9WSURFUl9DTEFTUyAoa2xhc3MpOworICBnY2hhciAqY2xpZW50X25hbWU7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3B1bHNlX2RldmljZV9wcm92aWRlcl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfZmluYWxpemU7CisKKyAgZG1fY2xhc3MtPnByb2JlID0gZ3N0X3B1bHNlX2RldmljZV9wcm92aWRlcl9wcm9iZTsKKyAgZG1fY2xhc3MtPnN0YXJ0ID0gZ3N0X3B1bHNlX2RldmljZV9wcm92aWRlcl9zdGFydDsKKyAgZG1fY2xhc3MtPnN0b3AgPSBnc3RfcHVsc2VfZGV2aWNlX3Byb3ZpZGVyX3N0b3A7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfU0VSVkVSLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInNlcnZlciIsICJTZXJ2ZXIiLAorICAgICAgICAgICJUaGUgUHVsc2VBdWRpbyBzZXJ2ZXIgdG8gY29ubmVjdCB0byIsIE5VTEwsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgY2xpZW50X25hbWUgPSBnc3RfcHVsc2VfY2xpZW50X25hbWUgKCk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0NMSUVOVF9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImNsaWVudC1uYW1lIiwgIkNsaWVudCBOYW1lIiwKKyAgICAgICAgICAiVGhlIFB1bHNlQXVkaW8gY2xpZW50X25hbWVfdG9fdXNlIiwgY2xpZW50X25hbWUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwKKyAgICAgICAgICBHU1RfUEFSQU1fTVVUQUJMRV9SRUFEWSkpOworICBnX2ZyZWUgKGNsaWVudF9uYW1lKTsKKworICBnc3RfZGV2aWNlX3Byb3ZpZGVyX2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGRtX2NsYXNzLAorICAgICAgIlB1bHNlQXVkaW8gRGV2aWNlIFByb3ZpZGVyIiwgIlNpbmsvU291cmNlL0F1ZGlvIiwKKyAgICAgICJMaXN0IGFuZCBwcm92aWRlciBQdWxzZUF1ZGlvIHNvdXJjZSBhbmQgc2luayBkZXZpY2VzIiwKKyAgICAgICJPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jb20+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VfZGV2aWNlX3Byb3ZpZGVyX2luaXQgKEdzdFB1bHNlRGV2aWNlUHJvdmlkZXIgKiBzZWxmKQoreworICBzZWxmLT5jbGllbnRfbmFtZSA9IGdzdF9wdWxzZV9jbGllbnRfbmFtZSAoKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFB1bHNlRGV2aWNlUHJvdmlkZXIgKnNlbGYgPSBHU1RfUFVMU0VfREVWSUNFX1BST1ZJREVSIChvYmplY3QpOworCisgIGdfZnJlZSAoc2VsZi0+Y2xpZW50X25hbWUpOworICBnX2ZyZWUgKHNlbGYtPnNlcnZlcik7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFB1bHNlRGV2aWNlUHJvdmlkZXIgKnNlbGYgPSBHU1RfUFVMU0VfREVWSUNFX1BST1ZJREVSIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TRVJWRVI6CisgICAgICBnX2ZyZWUgKHNlbGYtPnNlcnZlcik7CisgICAgICBzZWxmLT5zZXJ2ZXIgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTElFTlRfTkFNRToKKyAgICAgIGdfZnJlZSAoc2VsZi0+Y2xpZW50X25hbWUpOworICAgICAgaWYgKCFnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICAgICAiRW1wdHkgUHVsc2VBdWRpbyBjbGllbnQgbmFtZSBub3QgYWxsb3dlZC4gIgorICAgICAgICAgICAgIlJlc2V0dGluZyB0byBkZWZhdWx0IHZhbHVlIik7CisgICAgICAgIHNlbGYtPmNsaWVudF9uYW1lID0gZ3N0X3B1bHNlX2NsaWVudF9uYW1lICgpOworICAgICAgfSBlbHNlCisgICAgICAgIHNlbGYtPmNsaWVudF9uYW1lID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VfZGV2aWNlX3Byb3ZpZGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RQdWxzZURldmljZVByb3ZpZGVyICpzZWxmID0gR1NUX1BVTFNFX0RFVklDRV9QUk9WSURFUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU0VSVkVSOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc2VsZi0+c2VydmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTElFTlRfTkFNRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNlbGYtPmNsaWVudF9uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NvbnRleHRfc3RhdGVfY2IgKHBhX2NvbnRleHQgKiBjLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgR3N0UHVsc2VEZXZpY2VQcm92aWRlciAqc2VsZiA9IHVzZXJkYXRhOworCisgIHN3aXRjaCAocGFfY29udGV4dF9nZXRfc3RhdGUgKGMpKSB7CisgICAgY2FzZSBQQV9DT05URVhUX1JFQURZOgorICAgIGNhc2UgUEFfQ09OVEVYVF9URVJNSU5BVEVEOgorICAgIGNhc2UgUEFfQ09OVEVYVF9GQUlMRUQ6CisgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwgKHNlbGYtPm1haW5sb29wLCAwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQQV9DT05URVhUX1VOQ09OTkVDVEVEOgorICAgIGNhc2UgUEFfQ09OVEVYVF9DT05ORUNUSU5HOgorICAgIGNhc2UgUEFfQ09OVEVYVF9BVVRIT1JJWklORzoKKyAgICBjYXNlIFBBX0NPTlRFWFRfU0VUVElOR19OQU1FOgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdERldmljZSAqCituZXdfc291cmNlIChjb25zdCBwYV9zb3VyY2VfaW5mbyAqIGluZm8pCit7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdFN0cnVjdHVyZSAqcHJvcHM7CisgIGd1aW50IGk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKworICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+bl9mb3JtYXRzOyBpKyspCisgICAgZ3N0X2NhcHNfYXBwZW5kIChjYXBzLCBnc3RfcHVsc2VfZm9ybWF0X2luZm9fdG9fY2FwcyAoaW5mby0+Zm9ybWF0c1tpXSkpOworCisgIHByb3BzID0gZ3N0X3B1bHNlX21ha2Vfc3RydWN0dXJlIChpbmZvLT5wcm9wbGlzdCk7CisKKyAgcmV0dXJuIGdzdF9wdWxzZV9kZXZpY2VfbmV3IChpbmZvLT5pbmRleCwgaW5mby0+ZGVzY3JpcHRpb24sCisgICAgICBjYXBzLCBpbmZvLT5uYW1lLCBHU1RfUFVMU0VfREVWSUNFX1RZUEVfU09VUkNFLCBwcm9wcyk7Cit9CisKK3N0YXRpYyBHc3REZXZpY2UgKgorbmV3X3NpbmsgKGNvbnN0IHBhX3NpbmtfaW5mbyAqIGluZm8pCit7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdFN0cnVjdHVyZSAqcHJvcHM7CisgIGd1aW50IGk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKworICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+bl9mb3JtYXRzOyBpKyspCisgICAgZ3N0X2NhcHNfYXBwZW5kIChjYXBzLCBnc3RfcHVsc2VfZm9ybWF0X2luZm9fdG9fY2FwcyAoaW5mby0+Zm9ybWF0c1tpXSkpOworCisgIHByb3BzID0gZ3N0X3B1bHNlX21ha2Vfc3RydWN0dXJlIChpbmZvLT5wcm9wbGlzdCk7CisKKyAgcmV0dXJuIGdzdF9wdWxzZV9kZXZpY2VfbmV3IChpbmZvLT5pbmRleCwgaW5mby0+ZGVzY3JpcHRpb24sCisgICAgICBjYXBzLCBpbmZvLT5uYW1lLCBHU1RfUFVMU0VfREVWSUNFX1RZUEVfU0lOSywgcHJvcHMpOworfQorCitzdGF0aWMgdm9pZAorZ2V0X3NvdXJjZV9pbmZvX2NiIChwYV9jb250ZXh0ICogY29udGV4dCwKKyAgICBjb25zdCBwYV9zb3VyY2VfaW5mbyAqIGluZm8sIGludCBlb2wsIHZvaWQgKnVzZXJkYXRhKQoreworICBHc3RQdWxzZURldmljZVByb3ZpZGVyICpzZWxmID0gdXNlcmRhdGE7CisgIEdzdERldmljZSAqZGV2OworCisgIGlmIChlb2wpIHsKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwgKHNlbGYtPm1haW5sb29wLCAwKTsKKyAgICByZXR1cm47CisgIH0KKworICBkZXYgPSBuZXdfc291cmNlIChpbmZvKTsKKworICBpZiAoZGV2KQorICAgIGdzdF9kZXZpY2VfcHJvdmlkZXJfZGV2aWNlX2FkZCAoR1NUX0RFVklDRV9QUk9WSURFUiAoc2VsZiksIGRldik7Cit9CisKK3N0YXRpYyB2b2lkCitnZXRfc2lua19pbmZvX2NiIChwYV9jb250ZXh0ICogY29udGV4dCwKKyAgICBjb25zdCBwYV9zaW5rX2luZm8gKiBpbmZvLCBpbnQgZW9sLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgR3N0UHVsc2VEZXZpY2VQcm92aWRlciAqc2VsZiA9IHVzZXJkYXRhOworICBHc3REZXZpY2UgKmRldjsKKworICBpZiAoZW9sKSB7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChzZWxmLT5tYWlubG9vcCwgMCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZGV2ID0gbmV3X3NpbmsgKGluZm8pOworCisgIGlmIChkZXYpCisgICAgZ3N0X2RldmljZV9wcm92aWRlcl9kZXZpY2VfYWRkIChHU1RfREVWSUNFX1BST1ZJREVSIChzZWxmKSwgZGV2KTsKK30KKworc3RhdGljIHZvaWQKK2NvbnRleHRfc3Vic2NyaWJlX2NiIChwYV9jb250ZXh0ICogY29udGV4dCwgcGFfc3Vic2NyaXB0aW9uX2V2ZW50X3R5cGVfdCB0eXBlLAorICAgIHVpbnQzMl90IGlkeCwgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlRGV2aWNlUHJvdmlkZXIgKnNlbGYgPSB1c2VyZGF0YTsKKyAgR3N0RGV2aWNlUHJvdmlkZXIgKnByb3ZpZGVyID0gdXNlcmRhdGE7CisgIHBhX3N1YnNjcmlwdGlvbl9ldmVudF90eXBlX3QgZmFjaWxpdHkgPQorICAgICAgdHlwZSAmIFBBX1NVQlNDUklQVElPTl9FVkVOVF9GQUNJTElUWV9NQVNLOworICBwYV9zdWJzY3JpcHRpb25fZXZlbnRfdHlwZV90IGV2ZW50X3R5cGUgPQorICAgICAgdHlwZSAmIFBBX1NVQlNDUklQVElPTl9FVkVOVF9UWVBFX01BU0s7CisKKyAgaWYgKGZhY2lsaXR5ICE9IFBBX1NVQlNDUklQVElPTl9FVkVOVF9TT1VSQ0UgJiYKKyAgICAgIGZhY2lsaXR5ICE9IFBBX1NVQlNDUklQVElPTl9FVkVOVF9TSU5LKQorICAgIHJldHVybjsKKworICBpZiAoZXZlbnRfdHlwZSA9PSBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfTkVXKSB7CisgICAgLyogTWljcm9waG9uZSBpbiB0aGUgc291cmNlIG91dHB1dCBoYXMgY2hhbmdlZCAqLworCisgICAgaWYgKGZhY2lsaXR5ID09IFBBX1NVQlNDUklQVElPTl9FVkVOVF9TT1VSQ0UpCisgICAgICBwYV9jb250ZXh0X2dldF9zb3VyY2VfaW5mb19ieV9pbmRleCAoY29udGV4dCwgaWR4LCBnZXRfc291cmNlX2luZm9fY2IsCisgICAgICAgICAgc2VsZik7CisgICAgZWxzZSBpZiAoZmFjaWxpdHkgPT0gUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NJTkspCisgICAgICBwYV9jb250ZXh0X2dldF9zaW5rX2luZm9fYnlfaW5kZXggKGNvbnRleHQsIGlkeCwgZ2V0X3NpbmtfaW5mb19jYiwgc2VsZik7CisgIH0gZWxzZSBpZiAoZXZlbnRfdHlwZSA9PSBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfUkVNT1ZFKSB7CisgICAgR3N0UHVsc2VEZXZpY2UgKmRldiA9IE5VTEw7CisgICAgR0xpc3QgKml0ZW07CisKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKHNlbGYpOworICAgIGZvciAoaXRlbSA9IHByb3ZpZGVyLT5kZXZpY2VzOyBpdGVtOyBpdGVtID0gaXRlbS0+bmV4dCkgeworICAgICAgZGV2ID0gaXRlbS0+ZGF0YTsKKworICAgICAgaWYgKCgoZmFjaWxpdHkgPT0gUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NPVVJDRSAmJgorICAgICAgICAgICAgICAgICAgZGV2LT50eXBlID09IEdTVF9QVUxTRV9ERVZJQ0VfVFlQRV9TT1VSQ0UpIHx8CisgICAgICAgICAgICAgIChmYWNpbGl0eSA9PSBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU0lOSyAmJgorICAgICAgICAgICAgICAgICAgZGV2LT50eXBlID09IEdTVF9QVUxTRV9ERVZJQ0VfVFlQRV9TSU5LKSkgJiYKKyAgICAgICAgICBkZXYtPmRldmljZV9pbmRleCA9PSBpZHgpIHsKKyAgICAgICAgZ3N0X29iamVjdF9yZWYgKGRldik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGV2ID0gTlVMTDsKKyAgICB9CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNlbGYpOworCisgICAgaWYgKGRldikgeworICAgICAgZ3N0X2RldmljZV9wcm92aWRlcl9kZXZpY2VfcmVtb3ZlIChHU1RfREVWSUNFX1BST1ZJREVSIChzZWxmKSwKKyAgICAgICAgICBHU1RfREVWSUNFIChkZXYpKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGRldik7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnZXRfc291cmNlX2luZm9fbGlzdF9jYiAocGFfY29udGV4dCAqIGNvbnRleHQsIGNvbnN0IHBhX3NvdXJjZV9pbmZvICogaW5mbywKKyAgICBpbnQgZW9sLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgR0xpc3QgKipkZXZpY2VzID0gdXNlcmRhdGE7CisKKyAgaWYgKGVvbCkKKyAgICByZXR1cm47CisKKyAgKmRldmljZXMgPSBnX2xpc3RfcHJlcGVuZCAoKmRldmljZXMsIGdzdF9vYmplY3RfcmVmX3NpbmsgKG5ld19zb3VyY2UgKGluZm8pKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnZXRfc2lua19pbmZvX2xpc3RfY2IgKHBhX2NvbnRleHQgKiBjb250ZXh0LCBjb25zdCBwYV9zaW5rX2luZm8gKiBpbmZvLAorICAgIGludCBlb2wsIHZvaWQgKnVzZXJkYXRhKQoreworICBHTGlzdCAqKmRldmljZXMgPSB1c2VyZGF0YTsKKworICBpZiAoZW9sKQorICAgIHJldHVybjsKKworICAqZGV2aWNlcyA9IGdfbGlzdF9wcmVwZW5kICgqZGV2aWNlcywgZ3N0X29iamVjdF9yZWZfc2luayAobmV3X3NpbmsgKGluZm8pKSk7Cit9CisKK3N0YXRpYyBHTGlzdCAqCitnc3RfcHVsc2VfZGV2aWNlX3Byb3ZpZGVyX3Byb2JlIChHc3REZXZpY2VQcm92aWRlciAqIHByb3ZpZGVyKQoreworICBHc3RQdWxzZURldmljZVByb3ZpZGVyICpzZWxmID0gR1NUX1BVTFNFX0RFVklDRV9QUk9WSURFUiAocHJvdmlkZXIpOworICBHTGlzdCAqZGV2aWNlcyA9IE5VTEw7CisgIHBhX21haW5sb29wICptID0gTlVMTDsKKyAgcGFfY29udGV4dCAqYyA9IE5VTEw7CisgIHBhX29wZXJhdGlvbiAqbzsKKworICBpZiAoIShtID0gcGFfbWFpbmxvb3BfbmV3ICgpKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIShjID0gcGFfY29udGV4dF9uZXcgKHBhX21haW5sb29wX2dldF9hcGkgKG0pLCBzZWxmLT5jbGllbnRfbmFtZSkpKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoc2VsZiwgIkZhaWxlZCB0byBjcmVhdGUgY29udGV4dCIpOworICAgIGdvdG8gZmFpbGVkOworICB9CisKKyAgaWYgKHBhX2NvbnRleHRfY29ubmVjdCAoYywgc2VsZi0+c2VydmVyLCAwLCBOVUxMKSA8IDApIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiRmFpbGVkIHRvIGNvbm5lY3Q6ICVzIiwKKyAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHNlbGYtPmNvbnRleHQpKSk7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKworICBmb3IgKDs7KSB7CisgICAgcGFfY29udGV4dF9zdGF0ZV90IHN0YXRlOworCisgICAgc3RhdGUgPSBwYV9jb250ZXh0X2dldF9zdGF0ZSAoYyk7CisKKyAgICBpZiAoIVBBX0NPTlRFWFRfSVNfR09PRCAoc3RhdGUpKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2VsZiwgUkVTT1VSQ0UsIEZBSUxFRCwgKCJGYWlsZWQgdG8gY29ubmVjdDogJXMiLAorICAgICAgICAgICAgICBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAoYykpKSwgKE5VTEwpKTsKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSBQQV9DT05URVhUX1JFQURZKQorICAgICAgYnJlYWs7CisKKyAgICAvKiBXYWl0IHVudGlsIHRoZSBjb250ZXh0IGlzIHJlYWR5ICovCisgICAgaWYgKHBhX21haW5sb29wX2l0ZXJhdGUgKG0sIFRSVUUsIE5VTEwpIDwgMCkKKyAgICAgIGdvdG8gZmFpbGVkOworCisgIH0KKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImNvbm5lY3RlZCIpOworCisgIG8gPSBwYV9jb250ZXh0X2dldF9zaW5rX2luZm9fbGlzdCAoYywgZ2V0X3NpbmtfaW5mb19saXN0X2NiLCAmZGV2aWNlcyk7CisgIHdoaWxlIChwYV9vcGVyYXRpb25fZ2V0X3N0YXRlIChvKSA9PSBQQV9PUEVSQVRJT05fUlVOTklORyAmJgorICAgICAgcGFfb3BlcmF0aW9uX2dldF9zdGF0ZSAobykgPT0gUEFfT1BFUkFUSU9OX1JVTk5JTkcpIHsKKyAgICBpZiAocGFfbWFpbmxvb3BfaXRlcmF0ZSAobSwgVFJVRSwgTlVMTCkgPCAwKQorICAgICAgYnJlYWs7CisgIH0KKyAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKworICBvID0gcGFfY29udGV4dF9nZXRfc291cmNlX2luZm9fbGlzdCAoYywgZ2V0X3NvdXJjZV9pbmZvX2xpc3RfY2IsICZkZXZpY2VzKTsKKyAgd2hpbGUgKHBhX29wZXJhdGlvbl9nZXRfc3RhdGUgKG8pID09IFBBX09QRVJBVElPTl9SVU5OSU5HICYmCisgICAgICBwYV9vcGVyYXRpb25fZ2V0X3N0YXRlIChvKSA9PSBQQV9PUEVSQVRJT05fUlVOTklORykgeworICAgIGlmIChwYV9tYWlubG9vcF9pdGVyYXRlIChtLCBUUlVFLCBOVUxMKSA8IDApCisgICAgICBicmVhazsKKyAgfQorICBwYV9vcGVyYXRpb25fdW5yZWYgKG8pOworCisgIHBhX2NvbnRleHRfZGlzY29ubmVjdCAoYyk7CisgIHBhX21haW5sb29wX2ZyZWUgKG0pOworCisgIHJldHVybiBkZXZpY2VzOworCitmYWlsZWQ6CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3B1bHNlX2RldmljZV9wcm92aWRlcl9zdGFydCAoR3N0RGV2aWNlUHJvdmlkZXIgKiBwcm92aWRlcikKK3sKKyAgR3N0UHVsc2VEZXZpY2VQcm92aWRlciAqc2VsZiA9IEdTVF9QVUxTRV9ERVZJQ0VfUFJPVklERVIgKHByb3ZpZGVyKTsKKyAgcGFfb3BlcmF0aW9uICppbml0aWFsX29wZXJhdGlvbjsKKworICBpZiAoIShzZWxmLT5tYWlubG9vcCA9IHBhX3RocmVhZGVkX21haW5sb29wX25ldyAoKSkpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiQ291bGQgbm90IGNyZWF0ZSBwdWxzZWF1ZGlvIG1haW5sb29wIik7CisgICAgZ290byBtYWlubG9vcF9mYWlsZWQ7CisgIH0KKyAgaWYgKHBhX3RocmVhZGVkX21haW5sb29wX3N0YXJ0IChzZWxmLT5tYWlubG9vcCkgPCAwKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoc2VsZiwgIkNvdWxkIG5vdCBzdGFydCBwdWxzZWF1ZGlvIG1haW5sb29wIik7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfZnJlZSAoc2VsZi0+bWFpbmxvb3ApOworICAgIHNlbGYtPm1haW5sb29wID0gTlVMTDsKKyAgICBnb3RvIG1haW5sb29wX2ZhaWxlZDsKKyAgfQorCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKHNlbGYtPm1haW5sb29wKTsKKworICBpZiAoIShzZWxmLT5jb250ZXh0ID0KKyAgICAgICAgICBwYV9jb250ZXh0X25ldyAocGFfdGhyZWFkZWRfbWFpbmxvb3BfZ2V0X2FwaSAoc2VsZi0+bWFpbmxvb3ApLAorICAgICAgICAgICAgICBzZWxmLT5jbGllbnRfbmFtZSkpKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoc2VsZiwgIkZhaWxlZCB0byBjcmVhdGUgY29udGV4dCIpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9CisKKyAgcGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2sgKHNlbGYtPmNvbnRleHQsIGNvbnRleHRfc3RhdGVfY2IsIHNlbGYpOworICBwYV9jb250ZXh0X3NldF9zdWJzY3JpYmVfY2FsbGJhY2sgKHNlbGYtPmNvbnRleHQsIGNvbnRleHRfc3Vic2NyaWJlX2NiLCBzZWxmKTsKKworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJjb25uZWN0IHRvIHNlcnZlciAlcyIsIEdTVF9TVFJfTlVMTCAoc2VsZi0+c2VydmVyKSk7CisKKyAgaWYgKHBhX2NvbnRleHRfY29ubmVjdCAoc2VsZi0+Y29udGV4dCwgc2VsZi0+c2VydmVyLCAwLCBOVUxMKSA8IDApIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiRmFpbGVkIHRvIGNvbm5lY3Q6ICVzIiwKKyAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHNlbGYtPmNvbnRleHQpKSk7CisgICAgZ290byB1bmxvY2tfYW5kX2ZhaWw7CisgIH0KKworICBmb3IgKDs7KSB7CisgICAgcGFfY29udGV4dF9zdGF0ZV90IHN0YXRlOworCisgICAgc3RhdGUgPSBwYV9jb250ZXh0X2dldF9zdGF0ZSAoc2VsZi0+Y29udGV4dCk7CisKKyAgICBpZiAoIVBBX0NPTlRFWFRfSVNfR09PRCAoc3RhdGUpKSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiRmFpbGVkIHRvIGNvbm5lY3Q6ICVzIiwKKyAgICAgICAgICBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAoc2VsZi0+Y29udGV4dCkpKTsKKyAgICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSBQQV9DT05URVhUX1JFQURZKQorICAgICAgYnJlYWs7CisKKyAgICAvKiBXYWl0IHVudGlsIHRoZSBjb250ZXh0IGlzIHJlYWR5ICovCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAoc2VsZi0+bWFpbmxvb3ApOworICB9CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJjb25uZWN0ZWQiKTsKKworICBwYV9jb250ZXh0X3N1YnNjcmliZSAoc2VsZi0+Y29udGV4dCwKKyAgICAgIFBBX1NVQlNDUklQVElPTl9NQVNLX1NPVVJDRSB8IFBBX1NVQlNDUklQVElPTl9NQVNLX1NJTkssIE5VTEwsIE5VTEwpOworCisgIGluaXRpYWxfb3BlcmF0aW9uID0gcGFfY29udGV4dF9nZXRfc291cmNlX2luZm9fbGlzdCAoc2VsZi0+Y29udGV4dCwKKyAgICAgIGdldF9zb3VyY2VfaW5mb19jYiwgc2VsZik7CisgIHdoaWxlIChwYV9vcGVyYXRpb25fZ2V0X3N0YXRlIChpbml0aWFsX29wZXJhdGlvbikgPT0gUEFfT1BFUkFUSU9OX1JVTk5JTkcpIHsKKyAgICBpZiAoIVBBX0NPTlRFWFRfSVNfR09PRCAocGFfY29udGV4dF9nZXRfc3RhdGUgKChzZWxmLT5jb250ZXh0KSkpKQorICAgICAgZ290byBjYW5jZWxfYW5kX2ZhaWw7CisKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0IChzZWxmLT5tYWlubG9vcCk7CisgIH0KKyAgcGFfb3BlcmF0aW9uX3VucmVmIChpbml0aWFsX29wZXJhdGlvbik7CisKKyAgaW5pdGlhbF9vcGVyYXRpb24gPSBwYV9jb250ZXh0X2dldF9zaW5rX2luZm9fbGlzdCAoc2VsZi0+Y29udGV4dCwKKyAgICAgIGdldF9zaW5rX2luZm9fY2IsIHNlbGYpOworICBpZiAoIWluaXRpYWxfb3BlcmF0aW9uKQorICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB3aGlsZSAocGFfb3BlcmF0aW9uX2dldF9zdGF0ZSAoaW5pdGlhbF9vcGVyYXRpb24pID09IFBBX09QRVJBVElPTl9SVU5OSU5HKSB7CisgICAgaWYgKCFQQV9DT05URVhUX0lTX0dPT0QgKHBhX2NvbnRleHRfZ2V0X3N0YXRlICgoc2VsZi0+Y29udGV4dCkpKSkKKyAgICAgIGdvdG8gY2FuY2VsX2FuZF9mYWlsOworCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAoc2VsZi0+bWFpbmxvb3ApOworICB9CisgIHBhX29wZXJhdGlvbl91bnJlZiAoaW5pdGlhbF9vcGVyYXRpb24pOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAoc2VsZi0+bWFpbmxvb3ApOworCisgIHJldHVybiBUUlVFOworCit1bmxvY2tfYW5kX2ZhaWw6CisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAoc2VsZi0+bWFpbmxvb3ApOworICBnc3RfcHVsc2VfZGV2aWNlX3Byb3ZpZGVyX3N0b3AgKHByb3ZpZGVyKTsKKyAgcmV0dXJuIEZBTFNFOworCittYWlubG9vcF9mYWlsZWQ6CisgIHJldHVybiBGQUxTRTsKKworY2FuY2VsX2FuZF9mYWlsOgorICBwYV9vcGVyYXRpb25fY2FuY2VsIChpbml0aWFsX29wZXJhdGlvbik7CisgIHBhX29wZXJhdGlvbl91bnJlZiAoaW5pdGlhbF9vcGVyYXRpb24pOworICBnb3RvIHVubG9ja19hbmRfZmFpbDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZV9kZXZpY2VfcHJvdmlkZXJfc3RvcCAoR3N0RGV2aWNlUHJvdmlkZXIgKiBwcm92aWRlcikKK3sKKyAgR3N0UHVsc2VEZXZpY2VQcm92aWRlciAqc2VsZiA9IEdTVF9QVUxTRV9ERVZJQ0VfUFJPVklERVIgKHByb3ZpZGVyKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9zdG9wIChzZWxmLT5tYWlubG9vcCk7CisKKyAgaWYgKHNlbGYtPmNvbnRleHQpIHsKKyAgICBwYV9jb250ZXh0X2Rpc2Nvbm5lY3QgKHNlbGYtPmNvbnRleHQpOworCisgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IGdldCBhbnkgZnVydGhlciBjYWxsYmFja3MgKi8KKyAgICBwYV9jb250ZXh0X3NldF9zdGF0ZV9jYWxsYmFjayAoc2VsZi0+Y29udGV4dCwgTlVMTCwgTlVMTCk7CisgICAgcGFfY29udGV4dF9zZXRfc3Vic2NyaWJlX2NhbGxiYWNrIChzZWxmLT5jb250ZXh0LCBOVUxMLCBOVUxMKTsKKworICAgIHBhX2NvbnRleHRfdW5yZWYgKHNlbGYtPmNvbnRleHQpOworICAgIHNlbGYtPmNvbnRleHQgPSBOVUxMOworICB9CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfZnJlZSAoc2VsZi0+bWFpbmxvb3ApOworICBzZWxmLT5tYWlubG9vcCA9IE5VTEw7Cit9CisKK2VudW0KK3sKKyAgUFJPUF9JTlRFUk5BTF9OQU1FID0gMSwKK307CisKK0dfREVGSU5FX1RZUEUgKEdzdFB1bHNlRGV2aWNlLCBnc3RfcHVsc2VfZGV2aWNlLCBHU1RfVFlQRV9ERVZJQ0UpOworCitzdGF0aWMgdm9pZCBnc3RfcHVsc2VfZGV2aWNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9wdWxzZV9kZXZpY2Vfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3B1bHNlX2RldmljZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgR3N0RWxlbWVudCAqZ3N0X3B1bHNlX2RldmljZV9jcmVhdGVfZWxlbWVudCAoR3N0RGV2aWNlICogZGV2aWNlLAorICAgIGNvbnN0IGdjaGFyICogbmFtZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3B1bHNlX2RldmljZV9yZWNvbmZpZ3VyZV9lbGVtZW50IChHc3REZXZpY2UgKiBkZXZpY2UsCisgICAgR3N0RWxlbWVudCAqIGVsZW1lbnQpOworCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlX2RldmljZV9jbGFzc19pbml0IChHc3RQdWxzZURldmljZUNsYXNzICoga2xhc3MpCit7CisgIEdzdERldmljZUNsYXNzICpkZXZfY2xhc3MgPSBHU1RfREVWSUNFX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBkZXZfY2xhc3MtPmNyZWF0ZV9lbGVtZW50ID0gZ3N0X3B1bHNlX2RldmljZV9jcmVhdGVfZWxlbWVudDsKKyAgZGV2X2NsYXNzLT5yZWNvbmZpZ3VyZV9lbGVtZW50ID0gZ3N0X3B1bHNlX2RldmljZV9yZWNvbmZpZ3VyZV9lbGVtZW50OworCisgIG9iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3B1bHNlX2RldmljZV9nZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3B1bHNlX2RldmljZV9zZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcHVsc2VfZGV2aWNlX2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKG9iamVjdF9jbGFzcywgUFJPUF9JTlRFUk5BTF9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImludGVybmFsLW5hbWUiLCAiSW50ZXJuYWwgUHVsc2VBdWRpbyBkZXZpY2UgbmFtZSIsCisgICAgICAgICAgIlRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBQdWxzZUF1ZGlvIGRldmljZSIsICIiLAorICAgICAgICAgIEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZV9kZXZpY2VfaW5pdCAoR3N0UHVsc2VEZXZpY2UgKiBkZXZpY2UpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VfZGV2aWNlX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RQdWxzZURldmljZSAqZGV2aWNlID0gR1NUX1BVTFNFX0RFVklDRSAob2JqZWN0KTsKKworICBnX2ZyZWUgKGRldmljZS0+aW50ZXJuYWxfbmFtZSk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF9wdWxzZV9kZXZpY2VfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK2dzdF9wdWxzZV9kZXZpY2VfY3JlYXRlX2VsZW1lbnQgKEdzdERldmljZSAqIGRldmljZSwgY29uc3QgZ2NoYXIgKiBuYW1lKQoreworICBHc3RQdWxzZURldmljZSAqcHVsc2VfZGV2ID0gR1NUX1BVTFNFX0RFVklDRSAoZGV2aWNlKTsKKyAgR3N0RWxlbWVudCAqZWxlbTsKKworICBlbGVtID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlIChwdWxzZV9kZXYtPmVsZW1lbnQsIG5hbWUpOworICBnX29iamVjdF9zZXQgKGVsZW0sICJkZXZpY2UiLCBwdWxzZV9kZXYtPmludGVybmFsX25hbWUsIE5VTEwpOworCisgIHJldHVybiBlbGVtOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wdWxzZV9kZXZpY2VfcmVjb25maWd1cmVfZWxlbWVudCAoR3N0RGV2aWNlICogZGV2aWNlLCBHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgR3N0UHVsc2VEZXZpY2UgKnB1bHNlX2RldiA9IEdTVF9QVUxTRV9ERVZJQ0UgKGRldmljZSk7CisKKyAgaWYgKCFzdHJjbXAgKHB1bHNlX2Rldi0+ZWxlbWVudCwgInB1bHNlc3JjIikpIHsKKyAgICBpZiAoIUdTVF9JU19QVUxTRVNSQyAoZWxlbWVudCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAocHVsc2VfZGV2LT5lbGVtZW50LCAicHVsc2VzaW5rIikpIHsKKyAgICBpZiAoIUdTVF9JU19QVUxTRVNJTksgKGVsZW1lbnQpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9IGVsc2UgeworICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICB9CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAiZGV2aWNlIiwgcHVsc2VfZGV2LT5pbnRlcm5hbF9uYW1lLCBOVUxMKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogVGFrZXMgb3duZXJzaGlwIG9mIEBjYXBzIGFuZCBAcHJvcHMgKi8KK3N0YXRpYyBHc3REZXZpY2UgKgorZ3N0X3B1bHNlX2RldmljZV9uZXcgKGd1aW50IGRldmljZV9pbmRleCwgY29uc3QgZ2NoYXIgKiBkZXZpY2VfbmFtZSwKKyAgICBHc3RDYXBzICogY2FwcywgY29uc3QgZ2NoYXIgKiBpbnRlcm5hbF9uYW1lLCBHc3RQdWxzZURldmljZVR5cGUgdHlwZSwKKyAgICBHc3RTdHJ1Y3R1cmUgKiBwcm9wcykKK3sKKyAgR3N0UHVsc2VEZXZpY2UgKmdzdGRldjsKKyAgY29uc3QgZ2NoYXIgKmVsZW1lbnQgPSBOVUxMOworICBjb25zdCBnY2hhciAqa2xhc3MgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChkZXZpY2VfbmFtZSwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChpbnRlcm5hbF9uYW1lLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNhcHMsIE5VTEwpOworCisKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBHU1RfUFVMU0VfREVWSUNFX1RZUEVfU09VUkNFOgorICAgICAgZWxlbWVudCA9ICJwdWxzZXNyYyI7CisgICAgICBrbGFzcyA9ICJBdWRpby9Tb3VyY2UiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUFVMU0VfREVWSUNFX1RZUEVfU0lOSzoKKyAgICAgIGVsZW1lbnQgPSAicHVsc2VzaW5rIjsKKyAgICAgIGtsYXNzID0gIkF1ZGlvL1NpbmsiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgYnJlYWs7CisgIH0KKworCisgIGdzdGRldiA9IGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfUFVMU0VfREVWSUNFLAorICAgICAgImRpc3BsYXktbmFtZSIsIGRldmljZV9uYW1lLCAiY2FwcyIsIGNhcHMsICJkZXZpY2UtY2xhc3MiLCBrbGFzcywKKyAgICAgICJpbnRlcm5hbC1uYW1lIiwgaW50ZXJuYWxfbmFtZSwgInByb3BlcnRpZXMiLCBwcm9wcywgTlVMTCk7CisKKyAgZ3N0ZGV2LT50eXBlID0gdHlwZTsKKyAgZ3N0ZGV2LT5kZXZpY2VfaW5kZXggPSBkZXZpY2VfaW5kZXg7CisgIGdzdGRldi0+ZWxlbWVudCA9IGVsZW1lbnQ7CisKKyAgZ3N0X3N0cnVjdHVyZV9mcmVlIChwcm9wcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICByZXR1cm4gR1NUX0RFVklDRSAoZ3N0ZGV2KTsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlX2RldmljZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UHVsc2VEZXZpY2UgKmRldmljZTsKKworICBkZXZpY2UgPSBHU1RfUFVMU0VfREVWSUNFX0NBU1QgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0lOVEVSTkFMX05BTUU6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBkZXZpY2UtPmludGVybmFsX25hbWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VfZGV2aWNlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RQdWxzZURldmljZSAqZGV2aWNlOworCisgIGRldmljZSA9IEdTVF9QVUxTRV9ERVZJQ0VfQ0FTVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfSU5URVJOQUxfTkFNRToKKyAgICAgIGRldmljZS0+aW50ZXJuYWxfbmFtZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L3B1bHNlL3B1bHNlZGV2aWNlcHJvdmlkZXIuaCBiL2V4dC9wdWxzZS9wdWxzZWRldmljZXByb3ZpZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg5MmFkNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9wdWxzZS9wdWxzZWRldmljZXByb3ZpZGVyLmgKQEAgLTAsMCArMSw5OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPgorICoKKyAqIHB1bHNlZGV2aWNlcHJvdmlkZXIuaDogRGV2aWNlIHByb2JpbmcgYW5kIG1vbml0b3JpbmcKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfUFVMU0VfREVWSUNFX1BST1ZJREVSX0hfXworI2RlZmluZSBfX0dTVF9QVUxTRV9ERVZJQ0VfUFJPVklERVJfSF9fCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHB1bHNlL3B1bHNlYXVkaW8uaD4KKyNpbmNsdWRlIDxwdWxzZS90aHJlYWQtbWFpbmxvb3AuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UHVsc2VEZXZpY2VQcm92aWRlciBHc3RQdWxzZURldmljZVByb3ZpZGVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFB1bHNlRGV2aWNlUHJvdmlkZXJDbGFzcyBHc3RQdWxzZURldmljZVByb3ZpZGVyQ2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfUFVMU0VfREVWSUNFX1BST1ZJREVSICAgICAgICAgICAgICAgICAoZ3N0X3B1bHNlX2RldmljZV9wcm92aWRlcl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfSVNfUFVMU0VfREVWSUNFX1BST1ZJREVSKG9iaikgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX1BVTFNFX0RFVklDRV9QUk9WSURFUikpCisjZGVmaW5lIEdTVF9JU19QVUxTRV9ERVZJQ0VfUFJPVklERVJfQ0xBU1Moa2xhc3MpICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9QVUxTRV9ERVZJQ0VfUFJPVklERVIpKQorI2RlZmluZSBHU1RfUFVMU0VfREVWSUNFX1BST1ZJREVSX0dFVF9DTEFTUyhvYmopICAgICAgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfUFVMU0VfREVWSUNFX1BST1ZJREVSLCBHc3RQdWxzZURldmljZVByb3ZpZGVyQ2xhc3MpKQorI2RlZmluZSBHU1RfUFVMU0VfREVWSUNFX1BST1ZJREVSKG9iaikgICAgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX1BVTFNFX0RFVklDRV9QUk9WSURFUiwgR3N0UHVsc2VEZXZpY2VQcm92aWRlcikpCisjZGVmaW5lIEdTVF9QVUxTRV9ERVZJQ0VfUFJPVklERVJfQ0xBU1Moa2xhc3MpICAgICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9ERVZJQ0VfUFJPVklERVIsIEdzdFB1bHNlRGV2aWNlUHJvdmlkZXJDbGFzcykpCisjZGVmaW5lIEdTVF9QVUxTRV9ERVZJQ0VfUFJPVklERVJfQ0FTVChvYmopICAgICAgICAgICAgKChHc3RQdWxzZURldmljZVByb3ZpZGVyICopKG9iaikpCisKK3N0cnVjdCBfR3N0UHVsc2VEZXZpY2VQcm92aWRlciB7CisgIEdzdERldmljZVByb3ZpZGVyICAgICAgICAgcGFyZW50OworCisgIGdjaGFyICpzZXJ2ZXI7CisgIGdjaGFyICpjbGllbnRfbmFtZTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcCAqbWFpbmxvb3A7CisgIHBhX2NvbnRleHQgKmNvbnRleHQ7Cit9OworCit0eXBlZGVmIGVudW0geworICBHU1RfUFVMU0VfREVWSUNFX1RZUEVfU09VUkNFLAorICBHU1RfUFVMU0VfREVWSUNFX1RZUEVfU0lOSworfSBHc3RQdWxzZURldmljZVR5cGU7CisKK3N0cnVjdCBfR3N0UHVsc2VEZXZpY2VQcm92aWRlckNsYXNzIHsKKyAgR3N0RGV2aWNlUHJvdmlkZXJDbGFzcyAgICBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSAgICAgICAgZ3N0X3B1bHNlX2RldmljZV9wcm92aWRlcl9nZXRfdHlwZSAodm9pZCk7CisKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFB1bHNlRGV2aWNlIEdzdFB1bHNlRGV2aWNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFB1bHNlRGV2aWNlQ2xhc3MgR3N0UHVsc2VEZXZpY2VDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9QVUxTRV9ERVZJQ0UgICAgICAgICAgICAgICAgIChnc3RfcHVsc2VfZGV2aWNlX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9JU19QVUxTRV9ERVZJQ0Uob2JqKSAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfUFVMU0VfREVWSUNFKSkKKyNkZWZpbmUgR1NUX0lTX1BVTFNFX0RFVklDRV9DTEFTUyhrbGFzcykgICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX1BVTFNFX0RFVklDRSkpCisjZGVmaW5lIEdTVF9QVUxTRV9ERVZJQ0VfR0VUX0NMQVNTKG9iaikgICAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9QVUxTRV9ERVZJQ0UsIEdzdFB1bHNlRGV2aWNlQ2xhc3MpKQorI2RlZmluZSBHU1RfUFVMU0VfREVWSUNFKG9iaikgICAgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX1BVTFNFX0RFVklDRSwgR3N0UHVsc2VEZXZpY2UpKQorI2RlZmluZSBHU1RfUFVMU0VfREVWSUNFX0NMQVNTKGtsYXNzKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfREVWSUNFLCBHc3RQdWxzZURldmljZUNsYXNzKSkKKyNkZWZpbmUgR1NUX1BVTFNFX0RFVklDRV9DQVNUKG9iaikgICAgICAgICAgICAoKEdzdFB1bHNlRGV2aWNlICopKG9iaikpCisKK3N0cnVjdCBfR3N0UHVsc2VEZXZpY2UgeworICBHc3REZXZpY2UgICAgICAgICBwYXJlbnQ7CisKKyAgR3N0UHVsc2VEZXZpY2VUeXBlIHR5cGU7CisgIGd1aW50ICAgICAgICAgICAgIGRldmljZV9pbmRleDsKKyAgZ2NoYXIgICAgICAgICAgICAqaW50ZXJuYWxfbmFtZTsKKyAgY29uc3QgZ2NoYXIgICAgICAqZWxlbWVudDsKK307CisKK3N0cnVjdCBfR3N0UHVsc2VEZXZpY2VDbGFzcyB7CisgIEdzdERldmljZUNsYXNzICAgIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlICAgICAgICBnc3RfcHVsc2VfZGV2aWNlX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1BVTFNFX0RFVklDRV9QUk9WSURFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9wdWxzZS9wdWxzZXNpbmsuYyBiL2V4dC9wdWxzZS9wdWxzZXNpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjFjNGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3B1bHNlL3B1bHNlc2luay5jCkBAIC0wLDAgKzEsMzMwNyBAQAorLyotKi0gTW9kZTogQzsgYy1iYXNpYy1vZmZzZXQ6IDIgLSotKi8KKworLyogIEdTdHJlYW1lciBwdWxzZWF1ZGlvIHBsdWdpbgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOCBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAqICAgICAgICAgICAgKGMpIDIwMDkgICAgICBXaW0gVGF5bWFucworICoKKyAqICBnc3QtcHVsc2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAqICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBnc3QtcHVsc2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIGdzdC1wdWxzZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxCisgKiAgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXB1bHNlc2luaworICogQHNlZV9hbHNvOiBwdWxzZXNyYworICoKKyAqIFRoaXMgZWxlbWVudCBvdXRwdXRzIGF1ZGlvIHRvIGEKKyAqIDx1bGluayBocmVmPSJodHRwOi8vd3d3LnB1bHNlYXVkaW8ub3JnIj5QdWxzZUF1ZGlvIHNvdW5kIHNlcnZlcjwvdWxpbms+LgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgZmlsZXNyYyBsb2NhdGlvbj1zaW5lLm9nZyAhIG9nZ2RlbXV4ICEgdm9yYmlzZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIHB1bHNlc2luaworICogXXwgUGxheSBhbiBPZ2cvVm9yYmlzIGZpbGUuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgYXVkaW90ZXN0c3JjICEgYXVkaW9jb252ZXJ0ICEgdm9sdW1lIHZvbHVtZT0wLjQgISBwdWxzZXNpbmsKKyAqIF18IFBsYXkgYSA0NDBIeiBzaW5lIHdhdmUuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgYXVkaW90ZXN0c3JjICEgcHVsc2VzaW5rIHN0cmVhbS1wcm9wZXJ0aWVzPSJwcm9wcyxtZWRpYS50aXRsZT10ZXN0IgorICogXXwgUGxheSBhIHNpbmUgd2F2ZSBhbmQgc2V0IGEgc3RyZWFtIHByb3BlcnR5LiBUaGUgcHJvcGVydHkgY2FuIGJlIGNoZWNrZWQKKyAqIHdpdGggInBhY3RsIGxpc3QiLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXNpbmsuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0dGFnbGlzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworI2luY2x1ZGUgPGdzdC9wYnV0aWxzL3BidXRpbHMuaD4gICAgICAgIC8qIG9ubHkgdXNlZCBmb3IgR1NUX1BMVUdJTlNfQkFTRV9WRVJTSU9OXyogKi8KKworI2luY2x1ZGUgPGdzdC9nbGliLWNvbXBhdC1wcml2YXRlLmg+CisKKyNpbmNsdWRlICJwdWxzZXNpbmsuaCIKKyNpbmNsdWRlICJwdWxzZXV0aWwuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX0VYVEVSTiAocHVsc2VfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgcHVsc2VfZGVidWcKKworI2RlZmluZSBERUZBVUxUX1NFUlZFUiAgICAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfREVWSUNFICAgICAgICAgIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9DVVJSRU5UX0RFVklDRSAgTlVMTAorI2RlZmluZSBERUZBVUxUX0RFVklDRV9OQU1FICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfVk9MVU1FICAgICAgICAgIDEuMAorI2RlZmluZSBERUZBVUxUX01VVEUgICAgICAgICAgICBGQUxTRQorI2RlZmluZSBNQVhfVk9MVU1FICAgICAgICAgICAgICAxMC4wCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX1NFUlZFUiwKKyAgUFJPUF9ERVZJQ0UsCisgIFBST1BfQ1VSUkVOVF9ERVZJQ0UsCisgIFBST1BfREVWSUNFX05BTUUsCisgIFBST1BfVk9MVU1FLAorICBQUk9QX01VVEUsCisgIFBST1BfQ0xJRU5UX05BTUUsCisgIFBST1BfU1RSRUFNX1BST1BFUlRJRVMsCisgIFBST1BfTEFTVAorfTsKKworI2RlZmluZSBHU1RfVFlQRV9QVUxTRVJJTkdfQlVGRkVSICAgICAgICBcCisgICAgICAgIChnc3RfcHVsc2VyaW5nYnVmZmVyX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9QVUxTRVJJTkdfQlVGRkVSKG9iaikgICAgICAgIFwKKyAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1BVTFNFUklOR19CVUZGRVIsR3N0UHVsc2VSaW5nQnVmZmVyKSkKKyNkZWZpbmUgR1NUX1BVTFNFUklOR19CVUZGRVJfQ0xBU1Moa2xhc3MpIFwKKyAgICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUFVMU0VSSU5HX0JVRkZFUixHc3RQdWxzZVJpbmdCdWZmZXJDbGFzcykpCisjZGVmaW5lIEdTVF9QVUxTRVJJTkdfQlVGRkVSX0dFVF9DTEFTUyhvYmopIFwKKyAgICAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9QVUxTRVJJTkdfQlVGRkVSLCBHc3RQdWxzZVJpbmdCdWZmZXJDbGFzcykpCisjZGVmaW5lIEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1Qob2JqKSAgICAgICAgXAorICAgICAgICAoKEdzdFB1bHNlUmluZ0J1ZmZlciAqKW9iaikKKyNkZWZpbmUgR1NUX0lTX1BVTFNFUklOR19CVUZGRVIob2JqKSAgICAgXAorICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUFVMU0VSSU5HX0JVRkZFUikpCisjZGVmaW5lIEdTVF9JU19QVUxTRVJJTkdfQlVGRkVSX0NMQVNTKGtsYXNzKVwKKyAgICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUFVMU0VSSU5HX0JVRkZFUikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RQdWxzZVJpbmdCdWZmZXIgR3N0UHVsc2VSaW5nQnVmZmVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFB1bHNlUmluZ0J1ZmZlckNsYXNzIEdzdFB1bHNlUmluZ0J1ZmZlckNsYXNzOworCit0eXBlZGVmIHN0cnVjdCBfR3N0UHVsc2VDb250ZXh0IEdzdFB1bHNlQ29udGV4dDsKKworLyogQSBub3RlIG9uIHRocmVhZGluZy4KKyAqCisgKiBXZSB1c2UgYSBwYV90aHJlYWRlZF9tYWlubG9vcCB0byBpbnRlcmFjdCB3aXRoIHRoZSBQdWxzZUF1ZGlvIHNlcnZlci4gVGhpcworICogc3RhcnRzIHVwIGEgc2VwYXJhdGUgdGhyZWFkIHRoYXQgcnVucyBhIG1haW5sb29wIHRvIGNhcnJ5IGJhY2sgZXZlbnRzLAorICogbWVzc2FnZXMgYW5kIHRpbWluZyB1cGRhdGVzIGZyb20gdGhlIFB1bHNlQXVkaW8gc2VydmVyLgorICoKKyAqIEluIG1vc3QgY2FzZXMsIHRoZSBQdWxzZUF1ZGlvIEFQSSB3ZSB1c2UgY29tbXVuaWNhdGVzIHdpdGggdGhlIHNlcnZlciBhbmQKKyAqIHByb2Nlc3NlcyByZXBsaWVzIGFzeW5jaHJvbm91c2x5LiBPcGVyYXRpb25zIG9uIFBBIG9iamVjdHMgdGhhdCByZXN1bHQgaW4KKyAqIHN1Y2ggY29tbXVuaWNhdGlvbiBhcmUgcHJvdGVjdGVkIHdpdGggYSBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKCkgYW5kCisgKiBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2soKS4gVGhlc2UgZ3VhcmFudGVlIG11dHVhbCBleGNsdXNpb24gd2l0aCB0aGUKKyAqIG1haW5sb29wIHRocmVhZCAtLSB3aGVuIGFuIGl0ZXJhdGlvbiBvZiB0aGUgbWFpbmxvb3AgdGhyZWFkIGJlZ2lucywgaXQgZmlyc3QKKyAqIHRyaWVzIHRvIGFjcXVpcmUgdGhpcyBsb2NrLCBhbmQgY2Fubm90IGRvIHNvIGlmIG91ciBjb2RlIGFsc28gaG9sZHMgdGhhdAorICogbG9jay4KKyAqCisgKiBXaGVuIHdlIG5lZWQgdG8gY29tcGxldGUgYW4gb3BlcmF0aW9uIHN5bmNocm9ub3VzbHksIHdlIHVzZQorICogcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCgpIGFuZCBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwoKS4gVGhlc2Ugd29yaworICogbXVjaCBhcyBwdGhyZWFkIGNvbmRpdGlvbmFscyBkby4gcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCgpIGlzIGNhbGxlZCB3aXRoCisgKiB0aGUgbWFpbmxvb3AgbG9jayBoZWxkLiBJdCByZWxlYXNlcyB0aGUgbG9jayAodGhlcmVieSBhbGxvd2luZyB0aGUgbWFpbmxvb3AKKyAqIHRvIGV4ZWN1dGUpLCBhbmQgd2FpdHMgdGlsbCBvbmUgb2Ygb3VyIGNhbGxiYWNrcyB0byBiZSBleGVjdXRlZCBieSB0aGUKKyAqIG1haW5sb29wIHRocmVhZCBjYWxscyBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwoKS4gQXQgdGhlIGVuZCBvZiB0aGUKKyAqIG1haW5sb29wIGl0ZXJhdGlvbiwgdGhlIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQoKSB3aWxsIHJlYWNxdWlyZSB0aGUKKyAqIG1haW5sb29wIGxvY2sgYW5kIHJldHVybiBjb250cm9sIHRvIHRoZSBjYWxsZXIuCisgKi8KKworLyogU3RvcmUgdGhlIFBBIGNvbnRleHRzIGluIGEgaGFzaCB0YWJsZSB0byBhbGxvdyBlYXN5IHNoYXJpbmcgYW1vbmcKKyAqIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2luay4gS2V5cyBhcmUgJGNvbnRleHRfbmFtZUAkc2VydmVyX25hbWUKKyAqIChzdHJpbmdzKSBhbmQgdmFsdWVzIHNob3VsZCBiZSBHc3RQdWxzZUNvbnRleHQgcG9pbnRlcnMuCisgKi8KK3N0cnVjdCBfR3N0UHVsc2VDb250ZXh0Cit7CisgIHBhX2NvbnRleHQgKmNvbnRleHQ7CisgIEdTTGlzdCAqcmluZ19idWZmZXJzOworfTsKKworc3RhdGljIEdIYXNoVGFibGUgKmdzdF9wdWxzZV9zaGFyZWRfY29udGV4dHMgPSBOVUxMOworCisvKiB1c2Ugb25lIHN0YXRpYyBtYWluLWxvb3AgZm9yIGFsbCBpbnN0YW5jZXMKKyAqIHRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgdGhlIGNvbnRleHQgc2hhcmluZyB3b3JrIGFzIHRoZSBjb250ZXh0cyBhcmUKKyAqIHJlbGVhc2VkIHdoZW4gcmVsZWFzaW5nIHRoZWlyIHBhcmVudCBtYWluLWxvb3AKKyAqLworc3RhdGljIHBhX3RocmVhZGVkX21haW5sb29wICptYWlubG9vcCA9IE5VTEw7CitzdGF0aWMgZ3VpbnQgbWFpbmxvb3BfcmVmX2N0ID0gMDsKKworLyogbG9jayBmb3IgYWNjZXNzIHRvIHNoYXJlZCByZXNvdXJjZXMgKi8KK3N0YXRpYyBHTXV0ZXggcGFfc2hhcmVkX3Jlc291cmNlX211dGV4OworCisvKiBXZSBrZWVwIGEgY3VzdG9tIHJpbmdidWZmZXIgdGhhdCBpcyBiYWNrZWQgdXAgYnkgZGF0YSBhbGxvY2F0ZWQgYnkKKyAqIHB1bHNlYXVkaW8uIFdlIG11c3QgYWxzbyBvdmVyaWRlIHRoZSBjb21taXQgZnVuY3Rpb24gdG8gd3JpdGUgaW50bworICogcHVsc2VhdWRpbyBtZW1vcnkgaW5zdGVhZC4gKi8KK3N0cnVjdCBfR3N0UHVsc2VSaW5nQnVmZmVyCit7CisgIEdzdEF1ZGlvUmluZ0J1ZmZlciBvYmplY3Q7CisKKyAgZ2NoYXIgKmNvbnRleHRfbmFtZTsKKyAgZ2NoYXIgKnN0cmVhbV9uYW1lOworCisgIHBhX2NvbnRleHQgKmNvbnRleHQ7CisgIHBhX3N0cmVhbSAqc3RyZWFtOworICBwYV9zdHJlYW0gKnByb2JlX3N0cmVhbTsKKworICBwYV9mb3JtYXRfaW5mbyAqZm9ybWF0OworICBndWludCBjaGFubmVsczsKKyAgZ2Jvb2xlYW4gaXNfcGNtOworCisgIHZvaWQgKm1fZGF0YTsKKyAgc2l6ZV90IG1fdG93cml0ZTsKKyAgc2l6ZV90IG1fd3JpdGFibGU7CisgIGdpbnQ2NCBtX29mZnNldDsKKyAgZ2ludDY0IG1fbGFzdG9mZnNldDsKKworICBnYm9vbGVhbiBjb3JrZWQ6MTsKKyAgZ2Jvb2xlYW4gaW5fY29tbWl0OjE7CisgIGdib29sZWFuIHBhdXNlZDoxOworfTsKK3N0cnVjdCBfR3N0UHVsc2VSaW5nQnVmZmVyQ2xhc3MKK3sKKyAgR3N0QXVkaW9SaW5nQnVmZmVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworc3RhdGljIEdUeXBlIGdzdF9wdWxzZXJpbmdidWZmZXJfZ2V0X3R5cGUgKHZvaWQpOworc3RhdGljIHZvaWQgZ3N0X3B1bHNlcmluZ2J1ZmZlcl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RBdWRpb1JpbmdCdWZmZXJDbGFzcyAqcmluZ19wYXJlbnRfY2xhc3MgPSBOVUxMOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3B1bHNlcmluZ2J1ZmZlcl9vcGVuX2RldmljZSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcHVsc2VyaW5nYnVmZmVyX2Nsb3NlX2RldmljZSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcHVsc2VyaW5nYnVmZmVyX2FjcXVpcmUgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZiwKKyAgICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3B1bHNlcmluZ2J1ZmZlcl9yZWxlYXNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpOworc3RhdGljIGdib29sZWFuIGdzdF9wdWxzZXJpbmdidWZmZXJfc3RhcnQgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3B1bHNlcmluZ2J1ZmZlcl9wYXVzZSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcHVsc2VyaW5nYnVmZmVyX3N0b3AgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1Zik7CitzdGF0aWMgdm9pZCBnc3RfcHVsc2VyaW5nYnVmZmVyX2NsZWFyIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpOworc3RhdGljIGd1aW50IGdzdF9wdWxzZXJpbmdidWZmZXJfY29tbWl0IChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYsCisgICAgZ3VpbnQ2NCAqIHNhbXBsZSwgZ3VjaGFyICogZGF0YSwgZ2ludCBpbl9zYW1wbGVzLCBnaW50IG91dF9zYW1wbGVzLAorICAgIGdpbnQgKiBhY2N1bSk7CisKK0dfREVGSU5FX1RZUEUgKEdzdFB1bHNlUmluZ0J1ZmZlciwgZ3N0X3B1bHNlcmluZ2J1ZmZlciwKKyAgICBHU1RfVFlQRV9BVURJT19SSU5HX0JVRkZFUik7CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzaW5rX2luaXRfY29udGV4dHMgKHZvaWQpCit7CisgIGdfbXV0ZXhfaW5pdCAoJnBhX3NoYXJlZF9yZXNvdXJjZV9tdXRleCk7CisgIGdzdF9wdWxzZV9zaGFyZWRfY29udGV4dHMgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfc3RyX2hhc2gsIGdfc3RyX2VxdWFsLAorICAgICAgZ19mcmVlLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXJpbmdidWZmZXJfY2xhc3NfaW5pdCAoR3N0UHVsc2VSaW5nQnVmZmVyQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RBdWRpb1JpbmdCdWZmZXJDbGFzcyAqZ3N0cmluZ2J1ZmZlcl9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcyA9IChHc3RBdWRpb1JpbmdCdWZmZXJDbGFzcyAqKSBrbGFzczsKKworICByaW5nX3BhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3B1bHNlcmluZ2J1ZmZlcl9maW5hbGl6ZTsKKworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5vcGVuX2RldmljZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3B1bHNlcmluZ2J1ZmZlcl9vcGVuX2RldmljZSk7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPmNsb3NlX2RldmljZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3B1bHNlcmluZ2J1ZmZlcl9jbG9zZV9kZXZpY2UpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5hY3F1aXJlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VyaW5nYnVmZmVyX2FjcXVpcmUpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5yZWxlYXNlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VyaW5nYnVmZmVyX3JlbGVhc2UpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VyaW5nYnVmZmVyX3N0YXJ0KTsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+cGF1c2UgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3B1bHNlcmluZ2J1ZmZlcl9wYXVzZSk7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPnJlc3VtZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VyaW5nYnVmZmVyX3N0YXJ0KTsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VyaW5nYnVmZmVyX3N0b3ApOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5jbGVhcl9hbGwgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wdWxzZXJpbmdidWZmZXJfY2xlYXIpOworCisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPmNvbW1pdCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VyaW5nYnVmZmVyX2NvbW1pdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VyaW5nYnVmZmVyX2luaXQgKEdzdFB1bHNlUmluZ0J1ZmZlciAqIHBidWYpCit7CisgIHBidWYtPnN0cmVhbV9uYW1lID0gTlVMTDsKKyAgcGJ1Zi0+Y29udGV4dCA9IE5VTEw7CisgIHBidWYtPnN0cmVhbSA9IE5VTEw7CisgIHBidWYtPnByb2JlX3N0cmVhbSA9IE5VTEw7CisKKyAgcGJ1Zi0+Zm9ybWF0ID0gTlVMTDsKKyAgcGJ1Zi0+Y2hhbm5lbHMgPSAwOworICBwYnVmLT5pc19wY20gPSBGQUxTRTsKKworICBwYnVmLT5tX2RhdGEgPSBOVUxMOworICBwYnVmLT5tX3Rvd3JpdGUgPSAwOworICBwYnVmLT5tX3dyaXRhYmxlID0gMDsKKyAgcGJ1Zi0+bV9vZmZzZXQgPSAwOworICBwYnVmLT5tX2xhc3RvZmZzZXQgPSAwOworCisgIHBidWYtPmNvcmtlZCA9IFRSVUU7CisgIHBidWYtPmluX2NvbW1pdCA9IEZBTFNFOworICBwYnVmLT5wYXVzZWQgPSBGQUxTRTsKK30KKworLyogQ2FsbCB3aXRoIG1haW5sb29wIGxvY2sgaGVsZCBpZiB3YWl0ID09IFRSVUUpICovCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlX2Rlc3Ryb3lfc3RyZWFtIChwYV9zdHJlYW0gKiBzdHJlYW0sIGdib29sZWFuIHdhaXQpCit7CisgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYW55IGZ1cnRoZXIgY2FsbGJhY2tzICovCisgIHBhX3N0cmVhbV9zZXRfd3JpdGVfY2FsbGJhY2sgKHN0cmVhbSwgTlVMTCwgTlVMTCk7CisgIHBhX3N0cmVhbV9zZXRfdW5kZXJmbG93X2NhbGxiYWNrIChzdHJlYW0sIE5VTEwsIE5VTEwpOworICBwYV9zdHJlYW1fc2V0X292ZXJmbG93X2NhbGxiYWNrIChzdHJlYW0sIE5VTEwsIE5VTEwpOworCisgIHBhX3N0cmVhbV9kaXNjb25uZWN0IChzdHJlYW0pOworCisgIGlmICh3YWl0KQorICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQgKG1haW5sb29wKTsKKworICBwYV9zdHJlYW1fc2V0X3N0YXRlX2NhbGxiYWNrIChzdHJlYW0sIE5VTEwsIE5VTEwpOworICBwYV9zdHJlYW1fdW5yZWYgKHN0cmVhbSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VyaW5nX2Rlc3Ryb3lfc3RyZWFtIChHc3RQdWxzZVJpbmdCdWZmZXIgKiBwYnVmKQoreworICBpZiAocGJ1Zi0+cHJvYmVfc3RyZWFtKSB7CisgICAgZ3N0X3B1bHNlX2Rlc3Ryb3lfc3RyZWFtIChwYnVmLT5wcm9iZV9zdHJlYW0sIEZBTFNFKTsKKyAgICBwYnVmLT5wcm9iZV9zdHJlYW0gPSBOVUxMOworICB9CisKKyAgaWYgKHBidWYtPnN0cmVhbSkgeworCisgICAgaWYgKHBidWYtPm1fZGF0YSkgeworICAgICAgLyogZHJvcCBzaG0gbWVtb3J5IGJ1ZmZlciAqLworICAgICAgcGFfc3RyZWFtX2NhbmNlbF93cml0ZSAocGJ1Zi0+c3RyZWFtKTsKKworICAgICAgLyogcmVzZXQgaW50ZXJuYWwgdmFyaWFibGVzICovCisgICAgICBwYnVmLT5tX2RhdGEgPSBOVUxMOworICAgICAgcGJ1Zi0+bV90b3dyaXRlID0gMDsKKyAgICAgIHBidWYtPm1fd3JpdGFibGUgPSAwOworICAgICAgcGJ1Zi0+bV9vZmZzZXQgPSAwOworICAgICAgcGJ1Zi0+bV9sYXN0b2Zmc2V0ID0gMDsKKyAgICB9CisgICAgaWYgKHBidWYtPmZvcm1hdCkgeworICAgICAgcGFfZm9ybWF0X2luZm9fZnJlZSAocGJ1Zi0+Zm9ybWF0KTsKKyAgICAgIHBidWYtPmZvcm1hdCA9IE5VTEw7CisgICAgICBwYnVmLT5jaGFubmVscyA9IDA7CisgICAgICBwYnVmLT5pc19wY20gPSBGQUxTRTsKKyAgICB9CisKKyAgICBwYV9zdHJlYW1fZGlzY29ubmVjdCAocGJ1Zi0+c3RyZWFtKTsKKworICAgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYW55IGZ1cnRoZXIgY2FsbGJhY2tzICovCisgICAgcGFfc3RyZWFtX3NldF9zdGF0ZV9jYWxsYmFjayAocGJ1Zi0+c3RyZWFtLCBOVUxMLCBOVUxMKTsKKyAgICBwYV9zdHJlYW1fc2V0X3dyaXRlX2NhbGxiYWNrIChwYnVmLT5zdHJlYW0sIE5VTEwsIE5VTEwpOworICAgIHBhX3N0cmVhbV9zZXRfdW5kZXJmbG93X2NhbGxiYWNrIChwYnVmLT5zdHJlYW0sIE5VTEwsIE5VTEwpOworICAgIHBhX3N0cmVhbV9zZXRfb3ZlcmZsb3dfY2FsbGJhY2sgKHBidWYtPnN0cmVhbSwgTlVMTCwgTlVMTCk7CisKKyAgICBwYV9zdHJlYW1fdW5yZWYgKHBidWYtPnN0cmVhbSk7CisgICAgcGJ1Zi0+c3RyZWFtID0gTlVMTDsKKyAgfQorCisgIGdfZnJlZSAocGJ1Zi0+c3RyZWFtX25hbWUpOworICBwYnVmLT5zdHJlYW1fbmFtZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VyaW5nX2Rlc3Ryb3lfY29udGV4dCAoR3N0UHVsc2VSaW5nQnVmZmVyICogcGJ1ZikKK3sKKyAgZ19tdXRleF9sb2NrICgmcGFfc2hhcmVkX3Jlc291cmNlX211dGV4KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYnVmLCAiZGVzdHJveWluZyByaW5nYnVmZmVyICVwIiwgcGJ1Zik7CisKKyAgZ3N0X3B1bHNlcmluZ19kZXN0cm95X3N0cmVhbSAocGJ1Zik7CisKKyAgaWYgKHBidWYtPmNvbnRleHQpIHsKKyAgICBwYV9jb250ZXh0X3VucmVmIChwYnVmLT5jb250ZXh0KTsKKyAgICBwYnVmLT5jb250ZXh0ID0gTlVMTDsKKyAgfQorCisgIGlmIChwYnVmLT5jb250ZXh0X25hbWUpIHsKKyAgICBHc3RQdWxzZUNvbnRleHQgKnBjdHg7CisKKyAgICBwY3R4ID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAoZ3N0X3B1bHNlX3NoYXJlZF9jb250ZXh0cywgcGJ1Zi0+Y29udGV4dF9uYW1lKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBidWYsICJyZWxlYXNpbmcgY29udGV4dCB3aXRoIG5hbWUgJXMsIHBidWY9JXAsIHBjdHg9JXAiLAorICAgICAgICBwYnVmLT5jb250ZXh0X25hbWUsIHBidWYsIHBjdHgpOworCisgICAgaWYgKHBjdHgpIHsKKyAgICAgIHBjdHgtPnJpbmdfYnVmZmVycyA9IGdfc2xpc3RfcmVtb3ZlIChwY3R4LT5yaW5nX2J1ZmZlcnMsIHBidWYpOworICAgICAgaWYgKHBjdHgtPnJpbmdfYnVmZmVycyA9PSBOVUxMKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBidWYsCisgICAgICAgICAgICAiZGVzdHJveWluZyBmaW5hbCBjb250ZXh0IHdpdGggbmFtZSAlcywgcGJ1Zj0lcCwgcGN0eD0lcCIsCisgICAgICAgICAgICBwYnVmLT5jb250ZXh0X25hbWUsIHBidWYsIHBjdHgpOworCisgICAgICAgIHBhX2NvbnRleHRfZGlzY29ubmVjdCAocGN0eC0+Y29udGV4dCk7CisKKyAgICAgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IGdldCBhbnkgZnVydGhlciBjYWxsYmFja3MgKi8KKyAgICAgICAgcGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2sgKHBjdHgtPmNvbnRleHQsIE5VTEwsIE5VTEwpOworICAgICAgICBwYV9jb250ZXh0X3NldF9zdWJzY3JpYmVfY2FsbGJhY2sgKHBjdHgtPmNvbnRleHQsIE5VTEwsIE5VTEwpOworCisgICAgICAgIGdfaGFzaF90YWJsZV9yZW1vdmUgKGdzdF9wdWxzZV9zaGFyZWRfY29udGV4dHMsIHBidWYtPmNvbnRleHRfbmFtZSk7CisKKyAgICAgICAgcGFfY29udGV4dF91bnJlZiAocGN0eC0+Y29udGV4dCk7CisgICAgICAgIGdfc2xpY2VfZnJlZSAoR3N0UHVsc2VDb250ZXh0LCBwY3R4KTsKKyAgICAgIH0KKyAgICB9CisgICAgZ19mcmVlIChwYnVmLT5jb250ZXh0X25hbWUpOworICAgIHBidWYtPmNvbnRleHRfbmFtZSA9IE5VTEw7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZwYV9zaGFyZWRfcmVzb3VyY2VfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlcmluZ2J1ZmZlcl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpyaW5nYnVmZmVyOworCisgIHJpbmdidWZmZXIgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUIChvYmplY3QpOworCisgIGdzdF9wdWxzZXJpbmdfZGVzdHJveV9jb250ZXh0IChyaW5nYnVmZmVyKTsKKyAgR19PQkpFQ1RfQ0xBU1MgKHJpbmdfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKworI2RlZmluZSBDT05URVhUX09LKGMpICgoYykgJiYgUEFfQ09OVEVYVF9JU19HT09EIChwYV9jb250ZXh0X2dldF9zdGF0ZSAoKGMpKSkpCisjZGVmaW5lIFNUUkVBTV9PSyhzKSAoKHMpICYmIFBBX1NUUkVBTV9JU19HT09EIChwYV9zdHJlYW1fZ2V0X3N0YXRlICgocykpKSkKKworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VyaW5nX2lzX2RlYWQgKEdzdFB1bHNlU2luayAqIHBzaW5rLCBHc3RQdWxzZVJpbmdCdWZmZXIgKiBwYnVmLAorICAgIGdib29sZWFuIGNoZWNrX3N0cmVhbSkKK3sKKyAgaWYgKCFDT05URVhUX09LIChwYnVmLT5jb250ZXh0KSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmIChjaGVja19zdHJlYW0gJiYgIVNUUkVBTV9PSyAocGJ1Zi0+c3RyZWFtKSkKKyAgICBnb3RvIGVycm9yOworCisgIHJldHVybiBGQUxTRTsKKworZXJyb3I6CisgIHsKKyAgICBjb25zdCBnY2hhciAqZXJyX3N0ciA9CisgICAgICAgIHBidWYtPmNvbnRleHQgPyBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAocGJ1Zi0+Y29udGV4dCkpIDogTlVMTDsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHNpbmssIFJFU09VUkNFLCBGQUlMRUQsICgiRGlzY29ubmVjdGVkOiAlcyIsCisgICAgICAgICAgICBlcnJfc3RyKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlcmluZ19jb250ZXh0X3N0YXRlX2NiIChwYV9jb250ZXh0ICogYywgdm9pZCAqdXNlcmRhdGEpCit7CisgIHBhX2NvbnRleHRfc3RhdGVfdCBzdGF0ZTsKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3AgKm1haW5sb29wID0gKHBhX3RocmVhZGVkX21haW5sb29wICopIHVzZXJkYXRhOworCisgIHN0YXRlID0gcGFfY29udGV4dF9nZXRfc3RhdGUgKGMpOworCisgIEdTVF9MT0cgKCJnb3QgbmV3IGNvbnRleHQgc3RhdGUgJWQiLCBzdGF0ZSk7CisKKyAgc3dpdGNoIChzdGF0ZSkgeworICAgIGNhc2UgUEFfQ09OVEVYVF9SRUFEWToKKyAgICBjYXNlIFBBX0NPTlRFWFRfVEVSTUlOQVRFRDoKKyAgICBjYXNlIFBBX0NPTlRFWFRfRkFJTEVEOgorICAgICAgR1NUX0xPRyAoInNpZ25hbGluZyIpOworICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChtYWlubG9vcCwgMCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUEFfQ09OVEVYVF9VTkNPTk5FQ1RFRDoKKyAgICBjYXNlIFBBX0NPTlRFWFRfQ09OTkVDVElORzoKKyAgICBjYXNlIFBBX0NPTlRFWFRfQVVUSE9SSVpJTkc6CisgICAgY2FzZSBQQV9DT05URVhUX1NFVFRJTkdfTkFNRToKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VyaW5nX2NvbnRleHRfc3Vic2NyaWJlX2NiIChwYV9jb250ZXh0ICogYywKKyAgICBwYV9zdWJzY3JpcHRpb25fZXZlbnRfdHlwZV90IHQsIHVpbnQzMl90IGlkeCwgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlQ29udGV4dCAqcGN0eCA9IChHc3RQdWxzZUNvbnRleHQgKikgdXNlcmRhdGE7CisgIEdTTGlzdCAqd2FsazsKKworICBpZiAodCAhPSAoUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NJTktfSU5QVVQgfCBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfQ0hBTkdFKSAmJgorICAgICAgdCAhPSAoUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NJTktfSU5QVVQgfCBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfTkVXKSkKKyAgICByZXR1cm47CisKKyAgZm9yICh3YWxrID0gcGN0eC0+cmluZ19idWZmZXJzOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZiA9IChHc3RQdWxzZVJpbmdCdWZmZXIgKikgd2Fsay0+ZGF0YTsKKyAgICBwc2luayA9IEdTVF9QVUxTRVNJTktfQ0FTVCAoR1NUX09CSkVDVF9QQVJFTlQgKHBidWYpKTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgInR5cGUgJTA0eCwgaWR4ICV1IiwgdCwgaWR4KTsKKworICAgIGlmICghcGJ1Zi0+c3RyZWFtKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoaWR4ICE9IHBhX3N0cmVhbV9nZXRfaW5kZXggKHBidWYtPnN0cmVhbSkpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChwc2luay0+ZGV2aWNlICYmIHBidWYtPmlzX3BjbSAmJgorICAgICAgICAhZ19zdHJfZXF1YWwgKHBzaW5rLT5kZXZpY2UsCisgICAgICAgICAgICBwYV9zdHJlYW1fZ2V0X2RldmljZV9uYW1lIChwYnVmLT5zdHJlYW0pKSkgeworICAgICAgLyogVW5kZXJseWluZyBzaW5rIGNoYW5nZWQuIEFuZCB0aGlzIGlzIG5vdCBhIHBhc3N0aHJvdWdoIHN0cmVhbS4gTGV0J3MKKyAgICAgICAqIHNlZSBpZiBzb21lb25lIHVwc3RyZWFtIHdhbnRzIHRvIHRyeSB0byByZW5lZ290aWF0ZS4gKi8KKyAgICAgIEdzdEV2ZW50ICpyZW5lZ287CisKKyAgICAgIGdfZnJlZSAocHNpbmstPmRldmljZSk7CisgICAgICBwc2luay0+ZGV2aWNlID0gZ19zdHJkdXAgKHBhX3N0cmVhbV9nZXRfZGV2aWNlX25hbWUgKHBidWYtPnN0cmVhbSkpOworCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHBzaW5rLCAiZW1pdHRpbmcgc2luay1jaGFuZ2VkIik7CisKKyAgICAgIC8qIEZJWE1FOiBzZW5kIHJlY29uZmlndXJlIGV2ZW50IGluc3RlYWQgYW5kIGxldCBkZWNvZGViaW4vcGxheWJpbgorICAgICAgICogaGFuZGxlIHRoYXQuIEFsc28gdGFrZSBjYXJlIG9mIGFjMyBhbGlnbm1lbnQuIFNlZSAicHVsc2UtZm9ybWF0LWxvc3QiICovCisgICAgICByZW5lZ28gPSBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoInB1bHNlLXNpbmstY2hhbmdlZCIpKTsKKworICAgICAgaWYgKCFnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9CQVNFX1NJTksgKHBzaW5rKS0+c2lua3BhZCwgcmVuZWdvKSkKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJFbWl0dGVkIHNpbmstY2hhbmdlZCAtIG5vYm9keSB3YXMgbGlzdGVuaW5nIik7CisgICAgfQorCisgICAgLyogQWN0dWFsbHkgdGhpcyBldmVudCBpcyBhbHNvIHRyaWdnZXJlZCB3aGVuIG90aGVyIHByb3BlcnRpZXMgb2YKKyAgICAgKiB0aGUgc3RyZWFtIGNoYW5nZSB0aGF0IGFyZSB1bnJlbGF0ZWQgdG8gdGhlIHZvbHVtZS4gSG93ZXZlciBpdCBpcworICAgICAqIHByb2JhYmx5IGNoZWFwZXIgdG8gc2lnbmFsIHRoZSBjaGFuZ2UgaGVyZSBhbmQgY2hlY2sgZm9yIHRoZQorICAgICAqIHZvbHVtZSB3aGVuIHRoZSBHT2JqZWN0IHByb3BlcnR5IGlzIHJlYWQgaW5zdGVhZCBvZiBxdWVyeWluZyBpdCBhbHdheXMuICovCisKKyAgICAvKiBpbmZvcm0gc3RyZWFtaW5nIHRocmVhZCB0byBub3RpZnkgKi8KKyAgICBnX2F0b21pY19pbnRfY29tcGFyZV9hbmRfZXhjaGFuZ2UgKCZwc2luay0+bm90aWZ5LCAwLCAxKTsKKyAgfQorfQorCisvKiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBkZXZpY2Ugc2hvdWxkIGJlIG9wZW5lZC4gSW4gdGhpcyBjYXNlIHdlIHdpbGwgY29ubmVjdAorICogdG8gdGhlIHNlcnZlci4gV2Ugc2hvdWxkIG5vdCB0cnkgdG8gb3BlbiBhbnkgc3RyZWFtcyBpbiB0aGlzIHN0YXRlLiAqLworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VyaW5nYnVmZmVyX29wZW5fZGV2aWNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKyAgR3N0UHVsc2VDb250ZXh0ICpwY3R4OworICBwYV9tYWlubG9vcF9hcGkgKmFwaTsKKyAgZ2Jvb2xlYW4gbmVlZF91bmxvY2tfc2hhcmVkOworCisgIHBzaW5rID0gR1NUX1BVTFNFU0lOS19DQVNUIChHU1RfT0JKRUNUX1BBUkVOVCAoYnVmKSk7CisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUIChidWYpOworCisgIGdfYXNzZXJ0ICghcGJ1Zi0+c3RyZWFtKTsKKyAgZ19hc3NlcnQgKHBzaW5rLT5jbGllbnRfbmFtZSk7CisKKyAgaWYgKHBzaW5rLT5zZXJ2ZXIpCisgICAgcGJ1Zi0+Y29udGV4dF9uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiJXNAJXMiLCBwc2luay0+Y2xpZW50X25hbWUsCisgICAgICAgIHBzaW5rLT5zZXJ2ZXIpOworICBlbHNlCisgICAgcGJ1Zi0+Y29udGV4dF9uYW1lID0gZ19zdHJkdXAgKHBzaW5rLT5jbGllbnRfbmFtZSk7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworCisgIGdfbXV0ZXhfbG9jayAoJnBhX3NoYXJlZF9yZXNvdXJjZV9tdXRleCk7CisgIG5lZWRfdW5sb2NrX3NoYXJlZCA9IFRSVUU7CisKKyAgcGN0eCA9IGdfaGFzaF90YWJsZV9sb29rdXAgKGdzdF9wdWxzZV9zaGFyZWRfY29udGV4dHMsIHBidWYtPmNvbnRleHRfbmFtZSk7CisgIGlmIChwY3R4ID09IE5VTEwpIHsKKyAgICBwY3R4ID0gZ19zbGljZV9uZXcwIChHc3RQdWxzZUNvbnRleHQpOworCisgICAgLyogZ2V0IHRoZSBtYWlubG9vcCBhcGkgYW5kIGNyZWF0ZSBhIGNvbnRleHQgKi8KKyAgICBHU1RfSU5GT19PQkpFQ1QgKHBzaW5rLCAibmV3IGNvbnRleHQgd2l0aCBuYW1lICVzLCBwYnVmPSVwLCBwY3R4PSVwIiwKKyAgICAgICAgcGJ1Zi0+Y29udGV4dF9uYW1lLCBwYnVmLCBwY3R4KTsKKyAgICBhcGkgPSBwYV90aHJlYWRlZF9tYWlubG9vcF9nZXRfYXBpIChtYWlubG9vcCk7CisgICAgaWYgKCEocGN0eC0+Y29udGV4dCA9IHBhX2NvbnRleHRfbmV3IChhcGksIHBidWYtPmNvbnRleHRfbmFtZSkpKQorICAgICAgZ290byBjcmVhdGVfZmFpbGVkOworCisgICAgcGN0eC0+cmluZ19idWZmZXJzID0gZ19zbGlzdF9wcmVwZW5kIChwY3R4LT5yaW5nX2J1ZmZlcnMsIHBidWYpOworICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGdzdF9wdWxzZV9zaGFyZWRfY29udGV4dHMsCisgICAgICAgIGdfc3RyZHVwIChwYnVmLT5jb250ZXh0X25hbWUpLCAoZ3BvaW50ZXIpIHBjdHgpOworICAgIC8qIHJlZ2lzdGVyIHNvbWUgZXNzZW50aWFsIGNhbGxiYWNrcyAqLworICAgIHBhX2NvbnRleHRfc2V0X3N0YXRlX2NhbGxiYWNrIChwY3R4LT5jb250ZXh0LAorICAgICAgICBnc3RfcHVsc2VyaW5nX2NvbnRleHRfc3RhdGVfY2IsIG1haW5sb29wKTsKKyAgICBwYV9jb250ZXh0X3NldF9zdWJzY3JpYmVfY2FsbGJhY2sgKHBjdHgtPmNvbnRleHQsCisgICAgICAgIGdzdF9wdWxzZXJpbmdfY29udGV4dF9zdWJzY3JpYmVfY2IsIHBjdHgpOworCisgICAgLyogdHJ5IHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlciBhbmQgd2FpdCBmb3IgY29tcGxldGlvbiwgd2UgZG9uJ3Qgd2FudCB0bworICAgICAqIGF1dG9zcGF3biBhIGRlYW1vbiAqLworICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgImNvbm5lY3QgdG8gc2VydmVyICVzIiwKKyAgICAgICAgR1NUX1NUUl9OVUxMIChwc2luay0+c2VydmVyKSk7CisgICAgaWYgKHBhX2NvbnRleHRfY29ubmVjdCAocGN0eC0+Y29udGV4dCwgcHNpbmstPnNlcnZlciwKKyAgICAgICAgICAgIFBBX0NPTlRFWFRfTk9BVVRPU1BBV04sIE5VTEwpIDwgMCkKKyAgICAgIGdvdG8gY29ubmVjdF9mYWlsZWQ7CisgIH0gZWxzZSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChwc2luaywKKyAgICAgICAgInJldXNpbmcgc2hhcmVkIGNvbnRleHQgd2l0aCBuYW1lICVzLCBwYnVmPSVwLCBwY3R4PSVwIiwKKyAgICAgICAgcGJ1Zi0+Y29udGV4dF9uYW1lLCBwYnVmLCBwY3R4KTsKKyAgICBwY3R4LT5yaW5nX2J1ZmZlcnMgPSBnX3NsaXN0X3ByZXBlbmQgKHBjdHgtPnJpbmdfYnVmZmVycywgcGJ1Zik7CisgIH0KKworICBnX211dGV4X3VubG9jayAoJnBhX3NoYXJlZF9yZXNvdXJjZV9tdXRleCk7CisgIG5lZWRfdW5sb2NrX3NoYXJlZCA9IEZBTFNFOworCisgIC8qIGNvbnRleHQgY3JlYXRlZCBvciBzaGFyZWQgb2theSAqLworICBwYnVmLT5jb250ZXh0ID0gcGFfY29udGV4dF9yZWYgKHBjdHgtPmNvbnRleHQpOworCisgIGZvciAoOzspIHsKKyAgICBwYV9jb250ZXh0X3N0YXRlX3Qgc3RhdGU7CisKKyAgICBzdGF0ZSA9IHBhX2NvbnRleHRfZ2V0X3N0YXRlIChwYnVmLT5jb250ZXh0KTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgImNvbnRleHQgc3RhdGUgaXMgbm93ICVkIiwgc3RhdGUpOworCisgICAgaWYgKCFQQV9DT05URVhUX0lTX0dPT0QgKHN0YXRlKSkKKyAgICAgIGdvdG8gY29ubmVjdF9mYWlsZWQ7CisKKyAgICBpZiAoc3RhdGUgPT0gUEFfQ09OVEVYVF9SRUFEWSkKKyAgICAgIGJyZWFrOworCisgICAgLyogV2FpdCB1bnRpbCB0aGUgY29udGV4dCBpcyByZWFkeSAqLworICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgIndhaXRpbmcuLiIpOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQgKG1haW5sb29wKTsKKyAgfQorCisgIGlmIChwYV9jb250ZXh0X2dldF9zZXJ2ZXJfcHJvdG9jb2xfdmVyc2lvbiAocGJ1Zi0+Y29udGV4dCkgPCAyMikgeworICAgIC8qIFdlIG5lZWQgUHVsc2VBdWRpbyA+PSAxLjAgb24gdGhlIHNlcnZlciBzaWRlIGZvciB0aGUgZXh0ZW5kZWQgQVBJICovCisgICAgZ290byBiYWRfc2VydmVyX3ZlcnNpb247CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocHNpbmssICJvcGVuZWQgdGhlIGRldmljZSIpOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAobWFpbmxvb3ApOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLwordW5sb2NrX2FuZF9mYWlsOgorICB7CisgICAgaWYgKG5lZWRfdW5sb2NrX3NoYXJlZCkKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmcGFfc2hhcmVkX3Jlc291cmNlX211dGV4KTsKKyAgICBnc3RfcHVsc2VyaW5nX2Rlc3Ryb3lfY29udGV4dCAocGJ1Zik7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChtYWlubG9vcCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitjcmVhdGVfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBzaW5rLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoIkZhaWxlZCB0byBjcmVhdGUgY29udGV4dCIpLCAoTlVMTCkpOworICAgIGdfc2xpY2VfZnJlZSAoR3N0UHVsc2VDb250ZXh0LCBwY3R4KTsKKyAgICBnb3RvIHVubG9ja19hbmRfZmFpbDsKKyAgfQorY29ubmVjdF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHNpbmssIFJFU09VUkNFLCBGQUlMRUQsICgiRmFpbGVkIHRvIGNvbm5lY3Q6ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwY3R4LT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9CitiYWRfc2VydmVyX3ZlcnNpb246CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHNpbmssIFJFU09VUkNFLCBGQUlMRUQsICgiUHVsc2VBdWRpbyBzZXJ2ZXIgdmVyc2lvbiAiCisgICAgICAgICAgICAiaXMgdG9vIG9sZC4iKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9ja19hbmRfZmFpbDsKKyAgfQorfQorCisvKiBjbG9zZSB0aGUgZGV2aWNlICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wdWxzZXJpbmdidWZmZXJfY2xvc2VfZGV2aWNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAoYnVmKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChidWYpKTsKKworICBHU1RfTE9HX09CSkVDVCAocHNpbmssICJjbG9zaW5nIGRldmljZSIpOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKG1haW5sb29wKTsKKyAgZ3N0X3B1bHNlcmluZ19kZXN0cm95X2NvbnRleHQgKHBidWYpOworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKworICBHU1RfTE9HX09CSkVDVCAocHNpbmssICJjbG9zZWQgZGV2aWNlIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VyaW5nX3N0cmVhbV9zdGF0ZV9jYiAocGFfc3RyZWFtICogcywgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKyAgcGFfc3RyZWFtX3N0YXRlX3Qgc3RhdGU7CisKKyAgcGJ1ZiA9IEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1QgKHVzZXJkYXRhKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisKKyAgc3RhdGUgPSBwYV9zdHJlYW1fZ2V0X3N0YXRlIChzKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLCAiZ290IG5ldyBzdHJlYW0gc3RhdGUgJWQiLCBzdGF0ZSk7CisKKyAgc3dpdGNoIChzdGF0ZSkgeworICAgIGNhc2UgUEFfU1RSRUFNX1JFQURZOgorICAgIGNhc2UgUEFfU1RSRUFNX0ZBSUxFRDoKKyAgICBjYXNlIFBBX1NUUkVBTV9URVJNSU5BVEVEOgorICAgICAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLCAic2lnbmFsaW5nIik7CisgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwgKG1haW5sb29wLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUEFfU1RSRUFNX1VOQ09OTkVDVEVEOgorICAgIGNhc2UgUEFfU1RSRUFNX0NSRUFUSU5HOgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXJpbmdfc3RyZWFtX3JlcXVlc3RfY2IgKHBhX3N0cmVhbSAqIHMsIHNpemVfdCBsZW5ndGgsIHZvaWQgKnVzZXJkYXRhKQoreworICBHc3RQdWxzZVNpbmsgKnBzaW5rOworICBHc3RBdWRpb1JpbmdCdWZmZXIgKnJidWY7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKworICByYnVmID0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0NBU1QgKHVzZXJkYXRhKTsKKyAgcGJ1ZiA9IEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1QgKHVzZXJkYXRhKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLCAiZ290IHJlcXVlc3QgZm9yIGxlbmd0aCAlIiBHX0dTSVpFX0ZPUk1BVCwgbGVuZ3RoKTsKKworICBpZiAocGJ1Zi0+aW5fY29tbWl0ICYmIChsZW5ndGggPj0gcmJ1Zi0+c3BlYy5zZWdzaXplKSkgeworICAgIC8qIG9ubHkgc2lnbmFsIHdoZW4gd2UgYXJlIHdhaXRpbmcgaW4gdGhlIGNvbW1pdCB0aHJlYWQKKyAgICAgKiBhbmQgZ290IHJlcXVlc3QgZm9yIGF0bGVhc3QgYSBzZWdtZW50ICovCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChtYWlubG9vcCwgMCk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXJpbmdfc3RyZWFtX3VuZGVyZmxvd19jYiAocGFfc3RyZWFtICogcywgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAodXNlcmRhdGEpOworICBwc2luayA9IEdTVF9QVUxTRVNJTktfQ0FTVCAoR1NUX09CSkVDVF9QQVJFTlQgKHBidWYpKTsKKworICBHU1RfV0FSTklOR19PQkpFQ1QgKHBzaW5rLCAiR290IHVuZGVyZmxvdyIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlcmluZ19zdHJlYW1fb3ZlcmZsb3dfY2IgKHBhX3N0cmVhbSAqIHMsIHZvaWQgKnVzZXJkYXRhKQoreworICBHc3RQdWxzZVNpbmsgKnBzaW5rOworICBHc3RQdWxzZVJpbmdCdWZmZXIgKnBidWY7CisKKyAgcGJ1ZiA9IEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1QgKHVzZXJkYXRhKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisKKyAgR1NUX1dBUk5JTkdfT0JKRUNUIChwc2luaywgIkdvdCBvdmVyZmxvdyIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlcmluZ19zdHJlYW1fbGF0ZW5jeV9jYiAocGFfc3RyZWFtICogcywgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKyAgR3N0QXVkaW9SaW5nQnVmZmVyICpyaW5nYnVmOworICBjb25zdCBwYV90aW1pbmdfaW5mbyAqaW5mbzsKKyAgcGFfdXNlY190IHNpbmtfdXNlYzsKKworICBpbmZvID0gcGFfc3RyZWFtX2dldF90aW1pbmdfaW5mbyAocyk7CisKKyAgcGJ1ZiA9IEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1QgKHVzZXJkYXRhKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisgIHJpbmdidWYgPSBHU1RfQVVESU9fUklOR19CVUZGRVIgKHBidWYpOworCisgIGlmICghaW5mbykgeworICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgImxhdGVuY3kgdXBkYXRlIChpbmZvcm1hdGlvbiB1bmtub3duKSIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmICghaW5mby0+cmVhZF9pbmRleF9jb3JydXB0KSB7CisgICAgLyogVXBkYXRlIHNlZ2RvbmUgYmFzZWQgb24gdGhlIHJlYWQgaW5kZXguIHNlZ2RvbmUgaXMgb2Ygc2VnbWVudAorICAgICAqIGdyYW51bGFyaXR5LCB3aGlsZSB0aGUgcmVhZCBpbmRleCBpcyBhdCBieXRlIGdyYW51bGFyaXR5LiBXZSB0YWtlIHRoZQorICAgICAqIGNlaWxpbmcgd2hpbGUgY29udmVydGluZyB0aGUgbGF0dGVyIHRvIHRoZSBmb3JtZXIgc2luY2UgaXQgaXMgbW9yZQorICAgICAqIGNvbnNlcnZhdGl2ZSB0byByZXBvcnQgdGhhdCB3ZSd2ZSByZWFkIG1vcmUgdGhhbiB3ZSBoYXZlIHRoYW4gdG8gcmVwb3J0CisgICAgICogbGVzcy4gT25lIGNvbmNlcm4gaGVyZSBpcyB0aGF0IGxhdGVuY3kgdXBkYXRlcyBoYXBwZW4gZXZlcnkgMTAwbXMsIHdoaWNoCisgICAgICogbWVhbnMgc2VnZG9uZSBpcyBub3QgdXBkYXRlZCB2ZXJ5IG9mdGVuLCBidXQgaW5jcmVhc2luZyB0aGUgdXBkYXRlCisgICAgICogZnJlcXVlbmN5IHdvdWxkIG1lYW4gbW9yZSBjb21tdW5pY2F0aW9uIG92ZXJoZWFkLiAqLworICAgIGdfYXRvbWljX2ludF9zZXQgKCZyaW5nYnVmLT5zZWdkb25lLAorICAgICAgICAoaW50KSBnc3RfdXRpbF91aW50NjRfc2NhbGVfY2VpbCAoaW5mby0+cmVhZF9pbmRleCwgMSwKKyAgICAgICAgICAgIHJpbmdidWYtPnNwZWMuc2Vnc2l6ZSkpOworICB9CisKKyAgc2lua191c2VjID0gaW5mby0+Y29uZmlndXJlZF9zaW5rX3VzZWM7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLAorICAgICAgImxhdGVuY3lfdXBkYXRlLCAlIiBHX0dVSU5UNjRfRk9STUFUICIsICVkOiUiIEdfR0lOVDY0X0ZPUk1BVCAiLCAlZDolIgorICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiLCAlIiBHX0dVSU5UNjRfRk9STUFUICIsICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBHU1RfVElNRVZBTF9UT19USU1FIChpbmZvLT50aW1lc3RhbXApLCBpbmZvLT53cml0ZV9pbmRleF9jb3JydXB0LAorICAgICAgaW5mby0+d3JpdGVfaW5kZXgsIGluZm8tPnJlYWRfaW5kZXhfY29ycnVwdCwgaW5mby0+cmVhZF9pbmRleCwKKyAgICAgIGluZm8tPnNpbmtfdXNlYywgc2lua191c2VjKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXJpbmdfc3RyZWFtX3N1c3BlbmRlZF9jYiAocGFfc3RyZWFtICogcCwgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAodXNlcmRhdGEpOworICBwc2luayA9IEdTVF9QVUxTRVNJTktfQ0FTVCAoR1NUX09CSkVDVF9QQVJFTlQgKHBidWYpKTsKKworICBpZiAocGFfc3RyZWFtX2lzX3N1c3BlbmRlZCAocCkpCisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJzdHJlYW0gc3VzcGVuZGVkIik7CisgIGVsc2UKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgInN0cmVhbSByZXN1bWVkIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VyaW5nX3N0cmVhbV9zdGFydGVkX2NiIChwYV9zdHJlYW0gKiBwLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgR3N0UHVsc2VTaW5rICpwc2luazsKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworCisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUICh1c2VyZGF0YSk7CisgIHBzaW5rID0gR1NUX1BVTFNFU0lOS19DQVNUIChHU1RfT0JKRUNUX1BBUkVOVCAocGJ1ZikpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAic3RyZWFtIHN0YXJ0ZWQiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXJpbmdfc3RyZWFtX2V2ZW50X2NiIChwYV9zdHJlYW0gKiBwLCBjb25zdCBjaGFyICpuYW1lLAorICAgIHBhX3Byb3BsaXN0ICogcGwsIHZvaWQgKnVzZXJkYXRhKQoreworICBHc3RQdWxzZVNpbmsgKnBzaW5rOworICBHc3RQdWxzZVJpbmdCdWZmZXIgKnBidWY7CisKKyAgcGJ1ZiA9IEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1QgKHVzZXJkYXRhKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisKKyAgaWYgKCFzdHJjbXAgKG5hbWUsIFBBX1NUUkVBTV9FVkVOVF9SRVFVRVNUX0NPUkspKSB7CisgICAgLyogdGhlIHN0cmVhbSB3YW50cyB0byBQQVVTRSwgcG9zdCBhIG1lc3NhZ2UgZm9yIHRoZSBhcHBsaWNhdGlvbi4gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgImdvdCByZXF1ZXN0IGZvciBDT1JLIik7CisgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChwc2luayksCisgICAgICAgIGdzdF9tZXNzYWdlX25ld19yZXF1ZXN0X3N0YXRlIChHU1RfT0JKRUNUX0NBU1QgKHBzaW5rKSwKKyAgICAgICAgICAgIEdTVF9TVEFURV9QQVVTRUQpKTsKKworICB9IGVsc2UgaWYgKCFzdHJjbXAgKG5hbWUsIFBBX1NUUkVBTV9FVkVOVF9SRVFVRVNUX1VOQ09SSykpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgImdvdCByZXF1ZXN0IGZvciBVTkNPUksiKTsKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHBzaW5rKSwKKyAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X3JlcXVlc3Rfc3RhdGUgKEdTVF9PQkpFQ1RfQ0FTVCAocHNpbmspLAorICAgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChuYW1lLCBQQV9TVFJFQU1fRVZFTlRfRk9STUFUX0xPU1QpKSB7CisgICAgR3N0RXZlbnQgKnJlbmVnbzsKKworICAgIGlmIChnX2F0b21pY19pbnRfZ2V0ICgmcHNpbmstPmZvcm1hdF9sb3N0KSkgeworICAgICAgLyogRHVwbGljYXRlIGV2ZW50IGJlZm9yZSB3ZSdyZSBkb25lIHJlY29uZmlndXJpbmcsIGRpc2NhcmQgKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgImdvdCBGT1JNQVQgTE9TVCIpOworICAgIGdfYXRvbWljX2ludF9zZXQgKCZwc2luay0+Zm9ybWF0X2xvc3QsIDEpOworICAgIHBzaW5rLT5mb3JtYXRfbG9zdF90aW1lID0gZ19hc2NpaV9zdHJ0b3VsbCAocGFfcHJvcGxpc3RfZ2V0cyAocGwsCisgICAgICAgICAgICAic3RyZWFtLXRpbWUiKSwgTlVMTCwgMCkgKiAxMDAwOworCisgICAgZ19mcmVlIChwc2luay0+ZGV2aWNlKTsKKyAgICBwc2luay0+ZGV2aWNlID0gZ19zdHJkdXAgKHBhX3Byb3BsaXN0X2dldHMgKHBsLCAiZGV2aWNlIikpOworCisgICAgLyogRklYTUU6IHNlbmQgcmVjb25maWd1cmUgZXZlbnQgaW5zdGVhZCBhbmQgbGV0IGRlY29kZWJpbi9wbGF5YmluCisgICAgICogaGFuZGxlIHRoYXQuIEFsc28gdGFrZSBjYXJlIG9mIGFjMyBhbGlnbm1lbnQgKi8KKyAgICByZW5lZ28gPSBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCJwdWxzZS1mb3JtYXQtbG9zdCIpKTsKKworI2lmIDAKKyAgICBpZiAoZ19zdHJfZXF1YWwgKGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0KSwgImF1ZGlvL3gtZWFjMyIpKSB7CisgICAgICBHc3RTdHJ1Y3R1cmUgKmV2ZW50X3N0ID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJhYzNwYXJzZS1zZXQtYWxpZ25tZW50IiwKKyAgICAgICAgICAiYWxpZ25tZW50IiwgR19UWVBFX1NUUklORywgcGJpbi0+ZGJpbiA/ICJmcmFtZSIgOiAiaWVjNjE5MzciLCBOVUxMKTsKKworICAgICAgaWYgKCFnc3RfcGFkX3B1c2hfZXZlbnQgKHBiaW4tPnNpbmtwYWQsCisgICAgICAgICAgICAgIGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNLCBldmVudF9zdCkpKQorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBiaW4tPnNpbmtwYWQsICJDb3VsZCBub3QgdXBkYXRlIGFsaWdubWVudCIpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCFnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9CQVNFX1NJTksgKHBzaW5rKS0+c2lua3BhZCwgcmVuZWdvKSkgeworICAgICAgLyogTm9ib2R5IGhhbmRsZWQgdGhlIGZvcm1hdCBjaGFuZ2UgLSBlbWl0IGFuIGVycm9yICovCisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHNpbmssIFNUUkVBTSwgRk9STUFULCAoIlNpbmsgZm9ybWF0IGNoYW5nZWQiKSwKKyAgICAgICAgICAoIlNpbmsgZm9ybWF0IGNoYW5nZWQiKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAiZ290IHVua25vd24gZXZlbnQgJXMiLCBuYW1lKTsKKyAgfQorfQorCisvKiBDYWxsZWQgd2l0aCB0aGUgbWFpbmxvb3AgbG9ja2VkICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wdWxzZXJpbmdfd2FpdF9mb3Jfc3RyZWFtX3JlYWR5IChHc3RQdWxzZVNpbmsgKiBwc2luaywgcGFfc3RyZWFtICogc3RyZWFtKQoreworICBwYV9zdHJlYW1fc3RhdGVfdCBzdGF0ZTsKKworICBmb3IgKDs7KSB7CisgICAgc3RhdGUgPSBwYV9zdHJlYW1fZ2V0X3N0YXRlIChzdHJlYW0pOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLCAic3RyZWFtIHN0YXRlIGlzIG5vdyAlZCIsIHN0YXRlKTsKKworICAgIGlmICghUEFfU1RSRUFNX0lTX0dPT0QgKHN0YXRlKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChzdGF0ZSA9PSBQQV9TVFJFQU1fUkVBRFkpCisgICAgICByZXR1cm4gVFJVRTsKKworICAgIC8qIFdhaXQgdW50aWwgdGhlIHN0cmVhbSBpcyByZWFkeSAqLworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQgKG1haW5sb29wKTsKKyAgfQorfQorCisKKy8qIFRoaXMgbWV0aG9kIHNob3VsZCBjcmVhdGUgYSBuZXcgc3RyZWFtIG9mIHRoZSBnaXZlbiBAc3BlYy4gTm8gcGxheWJhY2sgc2hvdWxkCisgKiBzdGFydCB5ZXQgc28gd2Ugc3RhcnQgaW4gdGhlIGNvcmtlZCBzdGF0ZS4gKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3B1bHNlcmluZ2J1ZmZlcl9hY3F1aXJlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYsCisgICAgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKyAgcGFfYnVmZmVyX2F0dHIgd2FudGVkOworICBjb25zdCBwYV9idWZmZXJfYXR0ciAqYWN0dWFsOworICBwYV9jaGFubmVsX21hcCBjaGFubmVsX21hcDsKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKyAgcGFfY3ZvbHVtZSB2OworICBwYV9jdm9sdW1lICpwdiA9IE5VTEw7CisgIHBhX3N0cmVhbV9mbGFnc190IGZsYWdzOworICBjb25zdCBnY2hhciAqbmFtZTsKKyAgR3N0QXVkaW9DbG9jayAqY2xvY2s7CisgIHBhX2Zvcm1hdF9pbmZvICpmb3JtYXRzWzFdOworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgZ2NoYXIgcHJpbnRfYnVmW1BBX0ZPUk1BVF9JTkZPX1NOUFJJTlRfTUFYXTsKKyNlbmRpZgorCisgIHBzaW5rID0gR1NUX1BVTFNFU0lOS19DQVNUIChHU1RfT0JKRUNUX1BBUkVOVCAoYnVmKSk7CisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUIChidWYpOworCisgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgImNyZWF0aW5nIHNhbXBsZSBzcGVjIik7CisgIC8qIGNvbnZlcnQgdGhlIGdzdHJlYW1lciBzYW1wbGUgc3BlYyB0byB0aGUgcHVsc2VhdWRpbyBmb3JtYXQgKi8KKyAgaWYgKCFnc3RfcHVsc2VfZmlsbF9mb3JtYXRfaW5mbyAoc3BlYywgJnBidWYtPmZvcm1hdCwgJnBidWYtPmNoYW5uZWxzKSkKKyAgICBnb3RvIGludmFsaWRfc3BlYzsKKyAgcGJ1Zi0+aXNfcGNtID0gcGFfZm9ybWF0X2luZm9faXNfcGNtIChwYnVmLT5mb3JtYXQpOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKG1haW5sb29wKTsKKworICAvKiB3ZSBuZWVkIGEgY29udGV4dCBhbmQgYSBubyBzdHJlYW0gKi8KKyAgZ19hc3NlcnQgKHBidWYtPmNvbnRleHQpOworICBnX2Fzc2VydCAoIXBidWYtPnN0cmVhbSk7CisKKyAgLyogaWYgd2UgaGF2ZSBhIHByb2JlLCBkaXNjb25uZWN0IGl0IGZpcnN0IHNvIHRoYXQgaWYgd2UncmUgY3JlYXRpbmcgYQorICAgKiBjb21wcmVzc2VkIHN0cmVhbSwgaXQgZG9lc24ndCBnZXQgYmxvY2tlZCBieSBhIFBDTSBzdHJlYW0gKi8KKyAgaWYgKHBidWYtPnByb2JlX3N0cmVhbSkgeworICAgIGdzdF9wdWxzZV9kZXN0cm95X3N0cmVhbSAocGJ1Zi0+cHJvYmVfc3RyZWFtLCBUUlVFKTsKKyAgICBwYnVmLT5wcm9iZV9zdHJlYW0gPSBOVUxMOworICB9CisKKyAgLyogZW5hYmxlIGV2ZW50IG5vdGlmaWNhdGlvbnMgKi8KKyAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLCAic3Vic2NyaWJpbmcgdG8gY29udGV4dCBldmVudHMiKTsKKyAgaWYgKCEobyA9IHBhX2NvbnRleHRfc3Vic2NyaWJlIChwYnVmLT5jb250ZXh0LAorICAgICAgICAgICAgICBQQV9TVUJTQ1JJUFRJT05fTUFTS19TSU5LX0lOUFVULCBOVUxMLCBOVUxMKSkpCisgICAgZ290byBzdWJzY3JpYmVfZmFpbGVkOworCisgIHBhX29wZXJhdGlvbl91bnJlZiAobyk7CisKKyAgLyogaW5pdGlhbGl6ZSB0aGUgY2hhbm5lbCBtYXAgKi8KKyAgaWYgKHBidWYtPmlzX3BjbSAmJiBnc3RfcHVsc2VfZ3N0X3RvX2NoYW5uZWxfbWFwICgmY2hhbm5lbF9tYXAsIHNwZWMpKQorICAgIHBhX2Zvcm1hdF9pbmZvX3NldF9jaGFubmVsX21hcCAocGJ1Zi0+Zm9ybWF0LCAmY2hhbm5lbF9tYXApOworCisgIC8qIGZpbmQgYSBnb29kIG5hbWUgZm9yIHRoZSBzdHJlYW0gKi8KKyAgaWYgKHBzaW5rLT5zdHJlYW1fbmFtZSkKKyAgICBuYW1lID0gcHNpbmstPnN0cmVhbV9uYW1lOworICBlbHNlCisgICAgbmFtZSA9ICJQbGF5YmFjayBTdHJlYW0iOworCisgIC8qIGNyZWF0ZSBhIHN0cmVhbSAqLworICBmb3JtYXRzWzBdID0gcGJ1Zi0+Zm9ybWF0OworICBpZiAoIShwYnVmLT5zdHJlYW0gPSBwYV9zdHJlYW1fbmV3X2V4dGVuZGVkIChwYnVmLT5jb250ZXh0LCBuYW1lLCBmb3JtYXRzLCAxLAorICAgICAgICAgICAgICBwc2luay0+cHJvcGxpc3QpKSkKKyAgICBnb3RvIHN0cmVhbV9mYWlsZWQ7CisKKyAgLyogaW5zdGFsbCBlc3NlbnRpYWwgY2FsbGJhY2tzICovCisgIHBhX3N0cmVhbV9zZXRfc3RhdGVfY2FsbGJhY2sgKHBidWYtPnN0cmVhbSwKKyAgICAgIGdzdF9wdWxzZXJpbmdfc3RyZWFtX3N0YXRlX2NiLCBwYnVmKTsKKyAgcGFfc3RyZWFtX3NldF93cml0ZV9jYWxsYmFjayAocGJ1Zi0+c3RyZWFtLAorICAgICAgZ3N0X3B1bHNlcmluZ19zdHJlYW1fcmVxdWVzdF9jYiwgcGJ1Zik7CisgIHBhX3N0cmVhbV9zZXRfdW5kZXJmbG93X2NhbGxiYWNrIChwYnVmLT5zdHJlYW0sCisgICAgICBnc3RfcHVsc2VyaW5nX3N0cmVhbV91bmRlcmZsb3dfY2IsIHBidWYpOworICBwYV9zdHJlYW1fc2V0X292ZXJmbG93X2NhbGxiYWNrIChwYnVmLT5zdHJlYW0sCisgICAgICBnc3RfcHVsc2VyaW5nX3N0cmVhbV9vdmVyZmxvd19jYiwgcGJ1Zik7CisgIHBhX3N0cmVhbV9zZXRfbGF0ZW5jeV91cGRhdGVfY2FsbGJhY2sgKHBidWYtPnN0cmVhbSwKKyAgICAgIGdzdF9wdWxzZXJpbmdfc3RyZWFtX2xhdGVuY3lfY2IsIHBidWYpOworICBwYV9zdHJlYW1fc2V0X3N1c3BlbmRlZF9jYWxsYmFjayAocGJ1Zi0+c3RyZWFtLAorICAgICAgZ3N0X3B1bHNlcmluZ19zdHJlYW1fc3VzcGVuZGVkX2NiLCBwYnVmKTsKKyAgcGFfc3RyZWFtX3NldF9zdGFydGVkX2NhbGxiYWNrIChwYnVmLT5zdHJlYW0sCisgICAgICBnc3RfcHVsc2VyaW5nX3N0cmVhbV9zdGFydGVkX2NiLCBwYnVmKTsKKyAgcGFfc3RyZWFtX3NldF9ldmVudF9jYWxsYmFjayAocGJ1Zi0+c3RyZWFtLAorICAgICAgZ3N0X3B1bHNlcmluZ19zdHJlYW1fZXZlbnRfY2IsIHBidWYpOworCisgIC8qIGJ1ZmZlcmluZyByZXF1aXJlbWVudHMuIFdoZW4gc2V0dGluZyBwcmVidWYgdG8gMCwgdGhlIHN0cmVhbSB3aWxsIG5vdCBwYXVzZQorICAgKiB3aGVuIHdlIGNhdXNlIGFuIHVuZGVycnVuLCB3aGljaCBjYXVzZXMgdGltZSB0byBjb250aW51ZS4gKi8KKyAgbWVtc2V0ICgmd2FudGVkLCAwLCBzaXplb2YgKHdhbnRlZCkpOworICB3YW50ZWQudGxlbmd0aCA9IHNwZWMtPnNlZ3RvdGFsICogc3BlYy0+c2Vnc2l6ZTsKKyAgd2FudGVkLm1heGxlbmd0aCA9IC0xOworICB3YW50ZWQucHJlYnVmID0gMDsKKyAgd2FudGVkLm1pbnJlcSA9IHNwZWMtPnNlZ3NpemU7CisKKyAgR1NUX0lORk9fT0JKRUNUIChwc2luaywgInRsZW5ndGg6ICAgJWQiLCB3YW50ZWQudGxlbmd0aCk7CisgIEdTVF9JTkZPX09CSkVDVCAocHNpbmssICJtYXhsZW5ndGg6ICVkIiwgd2FudGVkLm1heGxlbmd0aCk7CisgIEdTVF9JTkZPX09CSkVDVCAocHNpbmssICJwcmVidWY6ICAgICVkIiwgd2FudGVkLnByZWJ1Zik7CisgIEdTVF9JTkZPX09CSkVDVCAocHNpbmssICJtaW5yZXE6ICAgICVkIiwgd2FudGVkLm1pbnJlcSk7CisKKyAgLyogY29uZmlndXJlIHZvbHVtZSB3aGVuIHdlIGNoYW5nZWQgaXQsIGVsc2Ugd2UgbGVhdmUgdGhlIGRlZmF1bHQgKi8KKyAgaWYgKHBzaW5rLT52b2x1bWVfc2V0KSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLCAiaGF2ZSB2b2x1bWUgb2YgJWYiLCBwc2luay0+dm9sdW1lKTsKKyAgICBwdiA9ICZ2OworICAgIGlmIChwYnVmLT5pc19wY20pCisgICAgICBnc3RfcHVsc2VfY3ZvbHVtZV9mcm9tX2xpbmVhciAocHYsIHBidWYtPmNoYW5uZWxzLCBwc2luay0+dm9sdW1lKTsKKyAgICBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAicGFzc3Rocm91Z2ggc3RyZWFtLCBub3Qgc2V0dGluZyB2b2x1bWUiKTsKKyAgICAgIHB2ID0gTlVMTDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcHYgPSBOVUxMOworICB9CisKKyAgLyogY29uc3RydWN0IHRoZSBmbGFncyAqLworICBmbGFncyA9IFBBX1NUUkVBTV9JTlRFUlBPTEFURV9USU1JTkcgfCBQQV9TVFJFQU1fQVVUT19USU1JTkdfVVBEQVRFIHwKKyAgICAgIFBBX1NUUkVBTV9BREpVU1RfTEFURU5DWSB8IFBBX1NUUkVBTV9TVEFSVF9DT1JLRUQ7CisKKyAgaWYgKHBzaW5rLT5tdXRlX3NldCkgeworICAgIGlmIChwc2luay0+bXV0ZSkKKyAgICAgIGZsYWdzIHw9IFBBX1NUUkVBTV9TVEFSVF9NVVRFRDsKKyAgICBlbHNlCisgICAgICBmbGFncyB8PSBQQV9TVFJFQU1fU1RBUlRfVU5NVVRFRDsKKyAgfQorCisgIC8qIHdlIGFsd2F5cyBzdGFydCBjb3JrZWQgKHNlZSBmbGFncyBhYm92ZSkgKi8KKyAgcGJ1Zi0+Y29ya2VkID0gVFJVRTsKKworICAvKiB0cnkgdG8gY29ubmVjdCBub3cgKi8KKyAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLCAiY29ubmVjdCBmb3IgcGxheWJhY2sgdG8gZGV2aWNlICVzIiwKKyAgICAgIEdTVF9TVFJfTlVMTCAocHNpbmstPmRldmljZSkpOworICBpZiAocGFfc3RyZWFtX2Nvbm5lY3RfcGxheWJhY2sgKHBidWYtPnN0cmVhbSwgcHNpbmstPmRldmljZSwKKyAgICAgICAgICAmd2FudGVkLCBmbGFncywgcHYsIE5VTEwpIDwgMCkKKyAgICBnb3RvIGNvbm5lY3RfZmFpbGVkOworCisgIC8qIG91ciBjbG9jayB3aWxsIG5vdyBzdGFydCBmcm9tIDAgYWdhaW4gKi8KKyAgY2xvY2sgPSBHU1RfQVVESU9fQ0xPQ0sgKEdTVF9BVURJT19CQVNFX1NJTksgKHBzaW5rKS0+cHJvdmlkZWRfY2xvY2spOworICBnc3RfYXVkaW9fY2xvY2tfcmVzZXQgKGNsb2NrLCAwKTsKKworICBpZiAoIWdzdF9wdWxzZXJpbmdfd2FpdF9mb3Jfc3RyZWFtX3JlYWR5IChwc2luaywgcGJ1Zi0+c3RyZWFtKSkKKyAgICBnb3RvIGNvbm5lY3RfZmFpbGVkOworCisgIGdfZnJlZSAocHNpbmstPmRldmljZSk7CisgIHBzaW5rLT5kZXZpY2UgPSBnX3N0cmR1cCAocGFfc3RyZWFtX2dldF9kZXZpY2VfbmFtZSAocGJ1Zi0+c3RyZWFtKSk7CisKKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgIHBhX2Zvcm1hdF9pbmZvX3NucHJpbnQgKHByaW50X2J1Ziwgc2l6ZW9mIChwcmludF9idWYpLAorICAgICAgcGFfc3RyZWFtX2dldF9mb3JtYXRfaW5mbyAocGJ1Zi0+c3RyZWFtKSk7CisgIEdTVF9JTkZPX09CSkVDVCAocHNpbmssICJuZWdvdGlhdGVkIHRvOiAlcyIsIHByaW50X2J1Zik7CisjZW5kaWYKKworICAvKiBBZnRlciB3ZSBwYXNzZWQgdGhlIHZvbHVtZSBvZmYgb2YgdG8gUEEgd2UgbmV2ZXIgd2FudCB0byBzZXQgaXQKKyAgICAgYWdhaW4sIHNpbmNlIGl0IGlzIFBBJ3Mgam9iIHRvIHNhdmUvcmVzdG9yZSB2b2x1bWVzLiAgKi8KKyAgcHNpbmstPnZvbHVtZV9zZXQgPSBwc2luay0+bXV0ZV9zZXQgPSBGQUxTRTsKKworICBHU1RfTE9HX09CSkVDVCAocHNpbmssICJzdHJlYW0gaXMgYWNxdWlyZWQgbm93Iik7CisKKyAgLyogZ2V0IHRoZSBhY3R1YWwgYnVmZmVyaW5nIHByb3BlcnRpZXMgbm93ICovCisgIGFjdHVhbCA9IHBhX3N0cmVhbV9nZXRfYnVmZmVyX2F0dHIgKHBidWYtPnN0cmVhbSk7CisKKyAgR1NUX0lORk9fT0JKRUNUIChwc2luaywgInRsZW5ndGg6ICAgJWQgKHdhbnRlZDogJWQpIiwgYWN0dWFsLT50bGVuZ3RoLAorICAgICAgd2FudGVkLnRsZW5ndGgpOworICBHU1RfSU5GT19PQkpFQ1QgKHBzaW5rLCAibWF4bGVuZ3RoOiAlZCIsIGFjdHVhbC0+bWF4bGVuZ3RoKTsKKyAgR1NUX0lORk9fT0JKRUNUIChwc2luaywgInByZWJ1ZjogICAgJWQiLCBhY3R1YWwtPnByZWJ1Zik7CisgIEdTVF9JTkZPX09CSkVDVCAocHNpbmssICJtaW5yZXE6ICAgICVkICh3YW50ZWQgJWQpIiwgYWN0dWFsLT5taW5yZXEsCisgICAgICB3YW50ZWQubWlucmVxKTsKKworICBzcGVjLT5zZWdzaXplID0gYWN0dWFsLT5taW5yZXE7CisgIHNwZWMtPnNlZ3RvdGFsID0gYWN0dWFsLT50bGVuZ3RoIC8gc3BlYy0+c2Vnc2l6ZTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3VubG9ja19hbmRfZmFpbDoKKyAgeworICAgIGdzdF9wdWxzZXJpbmdfZGVzdHJveV9zdHJlYW0gKHBidWYpOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAobWFpbmxvb3ApOworCisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbnZhbGlkX3NwZWM6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHNpbmssIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKCJJbnZhbGlkIHNhbXBsZSBzcGVjaWZpY2F0aW9uLiIpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorc3Vic2NyaWJlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwc2luaywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9jb250ZXh0X3N1YnNjcmliZSgpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHBidWYtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2tfYW5kX2ZhaWw7CisgIH0KK3N0cmVhbV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHNpbmssIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgiRmFpbGVkIHRvIGNyZWF0ZSBzdHJlYW06ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwYnVmLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9Citjb25uZWN0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwc2luaywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJGYWlsZWQgdG8gY29ubmVjdCBzdHJlYW06ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwYnVmLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9Cit9CisKKy8qIGZyZWUgdGhlIHN0cmVhbSB0aGF0IHdlIGFjcXVpcmVkIGJlZm9yZSAqLworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VyaW5nYnVmZmVyX3JlbGVhc2UgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworCisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUIChidWYpOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKG1haW5sb29wKTsKKyAgZ3N0X3B1bHNlcmluZ19kZXN0cm95X3N0cmVhbSAocGJ1Zik7CisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAobWFpbmxvb3ApOworCisgIHsKKyAgICBHc3RQdWxzZVNpbmsgKnBzaW5rOworCisgICAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisgICAgZ19hdG9taWNfaW50X3NldCAoJnBzaW5rLT5mb3JtYXRfbG9zdCwgRkFMU0UpOworICAgIHBzaW5rLT5mb3JtYXRfbG9zdF90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlcmluZ19zdWNjZXNzX2NiIChwYV9zdHJlYW0gKiBzLCBpbnQgc3VjY2Vzcywgdm9pZCAqdXNlcmRhdGEpCit7CisgIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCAobWFpbmxvb3AsIDApOworfQorCisvKiB1cGRhdGUgdGhlIGNvcmtlZCBzdGF0ZSBvZiBhIHN0cmVhbSwgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbWFpbmxvb3AKKyAqIGxvY2sgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3B1bHNlcmluZ19zZXRfY29ya2VkIChHc3RQdWxzZVJpbmdCdWZmZXIgKiBwYnVmLCBnYm9vbGVhbiBjb3JrZWQsCisgICAgZ2Jvb2xlYW4gd2FpdCkKK3sKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKyAgR3N0UHVsc2VTaW5rICpwc2luazsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisKKyAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCZwc2luay0+Zm9ybWF0X2xvc3QpKSB7CisgICAgLyogU2luayBmb3JtYXQgY2hhbmdlZCwgc3RyZWFtJ3MgZ29uZSBzbyBmYWtlIGJlaW5nIHBhdXNlZCAqLworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJzZXR0aW5nIGNvcmtlZCBzdGF0ZSB0byAlZCIsIGNvcmtlZCk7CisgIGlmIChwYnVmLT5jb3JrZWQgIT0gY29ya2VkKSB7CisgICAgaWYgKCEobyA9IHBhX3N0cmVhbV9jb3JrIChwYnVmLT5zdHJlYW0sIGNvcmtlZCwKKyAgICAgICAgICAgICAgICBnc3RfcHVsc2VyaW5nX3N1Y2Nlc3NfY2IsIHBidWYpKSkKKyAgICAgIGdvdG8gY29ya19mYWlsZWQ7CisKKyAgICB3aGlsZSAod2FpdCAmJiBwYV9vcGVyYXRpb25fZ2V0X3N0YXRlIChvKSA9PSBQQV9PUEVSQVRJT05fUlVOTklORykgeworICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAobWFpbmxvb3ApOworICAgICAgaWYgKGdzdF9wdWxzZXJpbmdfaXNfZGVhZCAocHNpbmssIHBidWYsIFRSVUUpKQorICAgICAgICBnb3RvIHNlcnZlcl9kZWFkOworICAgIH0KKyAgICBwYnVmLT5jb3JrZWQgPSBjb3JrZWQ7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJza2lwcGluZywgYWxyZWFkeSBpbiByZXF1ZXN0ZWQgc3RhdGUiKTsKKyAgfQorICByZXMgPSBUUlVFOworCitjbGVhbnVwOgorICBpZiAobykKKyAgICBwYV9vcGVyYXRpb25fdW5yZWYgKG8pOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitzZXJ2ZXJfZGVhZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAidGhlIHNlcnZlciBpcyBkZWFkIik7CisgICAgZ290byBjbGVhbnVwOworICB9Citjb3JrX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwc2luaywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9zdHJlYW1fY29yaygpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHBidWYtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byBjbGVhbnVwOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VyaW5nYnVmZmVyX2NsZWFyIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAoYnVmKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgImNsZWFyaW5nIik7CisgIGlmIChwYnVmLT5zdHJlYW0pIHsKKyAgICAvKiBkb24ndCB3YWl0IGZvciB0aGUgZmx1c2ggdG8gY29tcGxldGUgKi8KKyAgICBpZiAoKG8gPSBwYV9zdHJlYW1fZmx1c2ggKHBidWYtPnN0cmVhbSwgTlVMTCwgcGJ1ZikpKQorICAgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKyAgfQorICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKK30KKworI2lmIDAKKy8qIGNhbGxlZCBmcm9tIHB1bHNlIHRocmVhZCB3aXRoIHRoZSBtYWlubG9vcCBsb2NrICovCitzdGF0aWMgdm9pZAorbWFpbmxvb3BfZW50ZXJfZGVmZXJfY2IgKHBhX21haW5sb29wX2FwaSAqIGFwaSwgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU2luayAqcHVsc2VzaW5rID0gR1NUX1BVTFNFU0lOSyAodXNlcmRhdGEpOworICBHc3RNZXNzYWdlICptZXNzYWdlOworICBHVmFsdWUgdmFsID0geyAwIH07CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocHVsc2VzaW5rLCAicG9zdGluZyBFTlRFUiBzdHJlYW0gc3RhdHVzIik7CisgIG1lc3NhZ2UgPSBnc3RfbWVzc2FnZV9uZXdfc3RyZWFtX3N0YXR1cyAoR1NUX09CSkVDVCAocHVsc2VzaW5rKSwKKyAgICAgIEdTVF9TVFJFQU1fU1RBVFVTX1RZUEVfRU5URVIsIEdTVF9FTEVNRU5UIChwdWxzZXNpbmspKTsKKyAgZ192YWx1ZV9pbml0ICgmdmFsLCBHU1RfVFlQRV9HX1RIUkVBRCk7CisgIGdfdmFsdWVfc2V0X2JveGVkICgmdmFsLCBnX3RocmVhZF9zZWxmICgpKTsKKyAgZ3N0X21lc3NhZ2Vfc2V0X3N0cmVhbV9zdGF0dXNfb2JqZWN0IChtZXNzYWdlLCAmdmFsKTsKKyAgZ192YWx1ZV91bnNldCAoJnZhbCk7CisKKyAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVCAocHVsc2VzaW5rKSwgbWVzc2FnZSk7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAocHVsc2VzaW5rLT5kZWZlcl9wZW5kaW5nKTsKKyAgcHVsc2VzaW5rLT5kZWZlcl9wZW5kaW5nLS07CisgIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCAobWFpbmxvb3AsIDApOworfQorI2VuZGlmCisKKy8qIHN0YXJ0L3Jlc3VtZSBwbGF5YmFjayBBU0FQLCB3ZSBkb24ndCB1bmNvcmsgaGVyZSBidXQgaW4gdGhlIGNvbW1pdCBtZXRob2QgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3B1bHNlcmluZ2J1ZmZlcl9zdGFydCAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RQdWxzZVNpbmsgKnBzaW5rOworICBHc3RQdWxzZVJpbmdCdWZmZXIgKnBidWY7CisKKyAgcGJ1ZiA9IEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1QgKGJ1Zik7CisgIHBzaW5rID0gR1NUX1BVTFNFU0lOS19DQVNUIChHU1RfT0JKRUNUX1BBUkVOVCAocGJ1ZikpOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKG1haW5sb29wKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgInN0YXJ0aW5nIik7CisgIHBidWYtPnBhdXNlZCA9IEZBTFNFOworCisgIC8qIEVPUyBuZWVkcyBydW5uaW5nIGNsb2NrICovCisgIGlmIChHU1RfQkFTRV9TSU5LX0NBU1QgKHBzaW5rKS0+ZW9zIHx8CisgICAgICBnX2F0b21pY19pbnRfZ2V0ICgmR1NUX0FVRElPX0JBU0VfU0lOSyAocHNpbmspLT5lb3NfcmVuZGVyaW5nKSkKKyAgICBnc3RfcHVsc2VyaW5nX3NldF9jb3JrZWQgKHBidWYsIEZBTFNFLCBGQUxTRSk7CisKKyNpZiAwCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAic2NoZWR1bGluZyBzdHJlYW0gc3RhdHVzIik7CisgIHBzaW5rLT5kZWZlcl9wZW5kaW5nKys7CisgIHBhX21haW5sb29wX2FwaV9vbmNlIChwYV90aHJlYWRlZF9tYWlubG9vcF9nZXRfYXBpIChtYWlubG9vcCksCisgICAgICBtYWlubG9vcF9lbnRlcl9kZWZlcl9jYiwgcHNpbmspOworCisgIC8qIFdhaXQgZm9yIHRoZSBzdHJlYW0gc3RhdHVzIG1lc3NhZ2UgdG8gYmUgcG9zdGVkLiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUKKyAgICogc3luY2hyb25vdXNseSBiZWNhdXNlIHRoZSBjYWxsYmFjayB3aWxsIHRha2UgdGhlIG1haW5sb29wIGxvY2sKKyAgICogKGltcGxpY2l0bHkpIGFuZCB0aGVuIHRha2UgdGhlIEdTVF9PQkpFQ1RfTE9DSy4gRXZlcnl3aGVyZSBlbHNlLCB3ZSB0YWtlCisgICAqIHRoZSBsb2NrcyBpbiB0aGUgcmV2ZXJzZSBvcmRlciwgc28gbm90IGRvaW5nIHRoaXMgc3luY2hyb25vdXNseSBjb3VsZAorICAgKiBjYXVzZSBhIGRlYWRsb2NrLiAqLworICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgIndhaXRpbmcgZm9yIHN0cmVhbSBzdGF0dXMgKEVOVEVSKSB0byBiZSBwb3N0ZWQiKTsKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAobWFpbmxvb3ApOworI2VuZGlmCisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChtYWlubG9vcCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIHBhdXNlL3N0b3AgcGxheWJhY2sgQVNBUCAqLworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VyaW5nYnVmZmVyX3BhdXNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUIChidWYpOworICBwc2luayA9IEdTVF9QVUxTRVNJTktfQ0FTVCAoR1NUX09CSkVDVF9QQVJFTlQgKHBidWYpKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChtYWlubG9vcCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAicGF1c2luZyBhbmQgY29ya2luZyIpOworICAvKiBtYWtlIHN1cmUgdGhlIGNvbW1pdCBtZXRob2Qgc3RvcHMgd3JpdGluZyAqLworICBwYnVmLT5wYXVzZWQgPSBUUlVFOworICByZXMgPSBnc3RfcHVsc2VyaW5nX3NldF9jb3JrZWQgKHBidWYsIFRSVUUsIFRSVUUpOworICBpZiAocGJ1Zi0+aW5fY29tbWl0KSB7CisgICAgLyogd2UgYXJlIHdhaXRpbmcgaW4gYSBjb21taXQsIHNpZ25hbCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAic2lnbmFsIGNvbW1pdCIpOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCAobWFpbmxvb3AsIDApOworICB9CisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAobWFpbmxvb3ApOworCisgIHJldHVybiByZXM7Cit9CisKKyNpZiAwCisvKiBjYWxsZWQgZnJvbSBwdWxzZSB0aHJlYWQgd2l0aCB0aGUgbWFpbmxvb3AgbG9jayAqLworc3RhdGljIHZvaWQKK21haW5sb29wX2xlYXZlX2RlZmVyX2NiIChwYV9tYWlubG9vcF9hcGkgKiBhcGksIHZvaWQgKnVzZXJkYXRhKQoreworICBHc3RQdWxzZVNpbmsgKnB1bHNlc2luayA9IEdTVF9QVUxTRVNJTksgKHVzZXJkYXRhKTsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgR1ZhbHVlIHZhbCA9IHsgMCB9OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHB1bHNlc2luaywgInBvc3RpbmcgTEVBVkUgc3RyZWFtIHN0YXR1cyIpOworICBtZXNzYWdlID0gZ3N0X21lc3NhZ2VfbmV3X3N0cmVhbV9zdGF0dXMgKEdTVF9PQkpFQ1QgKHB1bHNlc2luayksCisgICAgICBHU1RfU1RSRUFNX1NUQVRVU19UWVBFX0xFQVZFLCBHU1RfRUxFTUVOVCAocHVsc2VzaW5rKSk7CisgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR1NUX1RZUEVfR19USFJFQUQpOworICBnX3ZhbHVlX3NldF9ib3hlZCAoJnZhbCwgZ190aHJlYWRfc2VsZiAoKSk7CisgIGdzdF9tZXNzYWdlX3NldF9zdHJlYW1fc3RhdHVzX29iamVjdCAobWVzc2FnZSwgJnZhbCk7CisgIGdfdmFsdWVfdW5zZXQgKCZ2YWwpOworCisgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKHB1bHNlc2luayksIG1lc3NhZ2UpOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKHB1bHNlc2luay0+ZGVmZXJfcGVuZGluZyk7CisgIHB1bHNlc2luay0+ZGVmZXJfcGVuZGluZy0tOworICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwgKG1haW5sb29wLCAwKTsKK30KKyNlbmRpZgorCisvKiBzdG9wIHBsYXliYWNrLCB3ZSBmbHVzaCBldmVyeXRoaW5nLiAqLworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VyaW5nYnVmZmVyX3N0b3AgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0UHVsc2VTaW5rICpwc2luazsKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAoYnVmKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworCisgIHBidWYtPnBhdXNlZCA9IFRSVUU7CisgIHJlcyA9IGdzdF9wdWxzZXJpbmdfc2V0X2NvcmtlZCAocGJ1ZiwgVFJVRSwgVFJVRSk7CisKKyAgLyogSW5mb3JtIGFueW9uZSB3YWl0aW5nIGluIF9jb21taXQoKSBjYWxsIHRoYXQgaXQgc2hhbGwgd2FrZXVwICovCisgIGlmIChwYnVmLT5pbl9jb21taXQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgInNpZ25hbCBjb21taXQgdGhyZWFkIik7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChtYWlubG9vcCwgMCk7CisgIH0KKyAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCZwc2luay0+Zm9ybWF0X2xvc3QpKSB7CisgICAgLyogRG9uJ3QgdHJ5IHRvIGZsdXNoLCB0aGUgc3RyZWFtJ3MgcHJvYmFibHkgZ29uZSBieSBub3cgKi8KKyAgICByZXMgPSBUUlVFOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorCisgIC8qIHRoZW4gdHJ5IHRvIGZsdXNoLCBpdCdzIG5vdCBmYXRhbCB3aGVuIHRoaXMgZmFpbHMgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJmbHVzaGluZyIpOworICBpZiAoKG8gPSBwYV9zdHJlYW1fZmx1c2ggKHBidWYtPnN0cmVhbSwgZ3N0X3B1bHNlcmluZ19zdWNjZXNzX2NiLCBwYnVmKSkpIHsKKyAgICB3aGlsZSAocGFfb3BlcmF0aW9uX2dldF9zdGF0ZSAobykgPT0gUEFfT1BFUkFUSU9OX1JVTk5JTkcpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAid2FpdCBmb3IgY29tcGxldGlvbiIpOworICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAobWFpbmxvb3ApOworICAgICAgaWYgKGdzdF9wdWxzZXJpbmdfaXNfZGVhZCAocHNpbmssIHBidWYsIFRSVUUpKQorICAgICAgICBnb3RvIHNlcnZlcl9kZWFkOworICAgIH0KKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgImZsdXNoIGNvbXBsZXRlZCIpOworICB9CisgIHJlcyA9IFRSVUU7CisKK2NsZWFudXA6CisgIGlmIChvKSB7CisgICAgcGFfb3BlcmF0aW9uX2NhbmNlbCAobyk7CisgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKyAgfQorI2lmIDAKKyAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJzY2hlZHVsaW5nIHN0cmVhbSBzdGF0dXMiKTsKKyAgcHNpbmstPmRlZmVyX3BlbmRpbmcrKzsKKyAgcGFfbWFpbmxvb3BfYXBpX29uY2UgKHBhX3RocmVhZGVkX21haW5sb29wX2dldF9hcGkgKG1haW5sb29wKSwKKyAgICAgIG1haW5sb29wX2xlYXZlX2RlZmVyX2NiLCBwc2luayk7CisKKyAgLyogV2FpdCBmb3IgdGhlIHN0cmVhbSBzdGF0dXMgbWVzc2FnZSB0byBiZSBwb3N0ZWQuIFRoaXMgbmVlZHMgdG8gYmUgZG9uZQorICAgKiBzeW5jaHJvbm91c2x5IGJlY2F1c2UgdGhlIGNhbGxiYWNrIHdpbGwgdGFrZSB0aGUgbWFpbmxvb3AgbG9jaworICAgKiAoaW1wbGljaXRseSkgYW5kIHRoZW4gdGFrZSB0aGUgR1NUX09CSkVDVF9MT0NLLiBFdmVyeXdoZXJlIGVsc2UsIHdlIHRha2UKKyAgICogdGhlIGxvY2tzIGluIHRoZSByZXZlcnNlIG9yZGVyLCBzbyBub3QgZG9pbmcgdGhpcyBzeW5jaHJvbm91c2x5IGNvdWxkCisgICAqIGNhdXNlIGEgZGVhZGxvY2suICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAid2FpdGluZyBmb3Igc3RyZWFtIHN0YXR1cyAoTEVBVkUpIHRvIGJlIHBvc3RlZCIpOworICBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0IChtYWlubG9vcCk7CisjZW5kaWYKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworc2VydmVyX2RlYWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgInRoZSBzZXJ2ZXIgaXMgZGVhZCIpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorfQorCisvKiBpbl9zYW1wbGVzID49IG91dF9zYW1wbGVzLCByYXRlID4gMS4wICovCisjZGVmaW5lIEZXRF9VUF9TQU1QTEVTKHMsc2UsZCxkZSkgICAgICAgICAgICAgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGd1aW50OCAqc2IgPSBzLCAqZGIgPSBkOyAgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlIChzIDw9IHNlICYmIGQgPCBkZSkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgbWVtY3B5IChkLCBzLCBicGYpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcyArPSBicGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmFjY3VtICs9IG91dHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCgqYWNjdW0gPDwgMSkgPj0gaW5yKSB7ICAgICAgICAgICAgICAgICBcCisgICAgICAqYWNjdW0gLT0gaW5yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBkICs9IGJwZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGluX3NhbXBsZXMgLT0gKHMgLSBzYikvYnBmOyAgICAgICAgICAgICAgICAgICBcCisgIG91dF9zYW1wbGVzIC09IChkIC0gZGIpL2JwZjsgICAgICAgICAgICAgICAgICBcCisgIEdTVF9ERUJVRyAoImZ3ZF91cCBlbmQgJWQvJWQiLCphY2N1bSwqdG9wcm9jZXNzKTsgICAgIFwKK30gR19TVE1UX0VORAorCisvKiBvdXRfc2FtcGxlcyA+IGluX3NhbXBsZXMsIGZvciByYXRlcyBzbWFsbGVyIHRoYW4gMS4wICovCisjZGVmaW5lIEZXRF9ET1dOX1NBTVBMRVMocyxzZSxkLGRlKSAgICAgICAgICAgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGd1aW50OCAqc2IgPSBzLCAqZGIgPSBkOyAgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlIChzIDw9IHNlICYmIGQgPCBkZSkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgbWVtY3B5IChkLCBzLCBicGYpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZCArPSBicGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmFjY3VtICs9IGlucjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCgqYWNjdW0gPDwgMSkgPj0gb3V0cikgeyAgICAgICAgICAgICAgICBcCisgICAgICAqYWNjdW0gLT0gb3V0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzICs9IGJwZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGluX3NhbXBsZXMgLT0gKHMgLSBzYikvYnBmOyAgICAgICAgICAgICAgICAgICBcCisgIG91dF9zYW1wbGVzIC09IChkIC0gZGIpL2JwZjsgICAgICAgICAgICAgICAgICBcCisgIEdTVF9ERUJVRyAoImZ3ZF9kb3duIGVuZCAlZC8lZCIsKmFjY3VtLCp0b3Byb2Nlc3MpOyAgIFwKK30gR19TVE1UX0VORAorCisjZGVmaW5lIFJFVl9VUF9TQU1QTEVTKHMsc2UsZCxkZSkgICAgICAgICAgICAgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGd1aW50OCAqc2IgPSBzZSwgKmRiID0gZDsgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlIChzIDw9IHNlICYmIGQgPCBkZSkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgbWVtY3B5IChkLCBzZSwgYnBmKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2UgLT0gYnBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmFjY3VtICs9IG91dHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKGQgPCBkZSAmJiAoKmFjY3VtIDw8IDEpID49IGlucikgeyAgICBcCisgICAgICAqYWNjdW0gLT0gaW5yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBkICs9IGJwZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGluX3NhbXBsZXMgLT0gKHNiIC0gc2UpL2JwZjsgICAgICAgICAgICAgICAgICBcCisgIG91dF9zYW1wbGVzIC09IChkIC0gZGIpL2JwZjsgICAgICAgICAgICAgICAgICBcCisgIEdTVF9ERUJVRyAoInJldl91cCBlbmQgJWQvJWQiLCphY2N1bSwqdG9wcm9jZXNzKTsgICAgIFwKK30gR19TVE1UX0VORAorCisjZGVmaW5lIFJFVl9ET1dOX1NBTVBMRVMocyxzZSxkLGRlKSAgICAgICAgICAgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGd1aW50OCAqc2IgPSBzZSwgKmRiID0gZDsgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlIChzIDw9IHNlICYmIGQgPCBkZSkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgbWVtY3B5IChkLCBzZSwgYnBmKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZCArPSBicGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmFjY3VtICs9IGlucjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKHMgPD0gc2UgJiYgKCphY2N1bSA8PCAxKSA+PSBvdXRyKSB7ICBcCisgICAgICAqYWNjdW0gLT0gb3V0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzZSAtPSBicGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGluX3NhbXBsZXMgLT0gKHNiIC0gc2UpL2JwZjsgICAgICAgICAgICAgICAgICBcCisgIG91dF9zYW1wbGVzIC09IChkIC0gZGIpL2JwZjsgICAgICAgICAgICAgICAgICBcCisgIEdTVF9ERUJVRyAoInJldl9kb3duIGVuZCAlZC8lZCIsKmFjY3VtLCp0b3Byb2Nlc3MpOyAgIFwKK30gR19TVE1UX0VORAorCisvKiBvdXIgY3VzdG9tIGNvbW1pdCBmdW5jdGlvbiBiZWNhdXNlIHdlIHdyaXRlIGludG8gdGhlIGJ1ZmZlciBvZiBwdWxzZWF1ZGlvCisgKiBpbnN0ZWFkIG9mIGtlZXBpbmcgb3VyIG93biBidWZmZXIgKi8KK3N0YXRpYyBndWludAorZ3N0X3B1bHNlcmluZ2J1ZmZlcl9jb21taXQgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZiwgZ3VpbnQ2NCAqIHNhbXBsZSwKKyAgICBndWNoYXIgKiBkYXRhLCBnaW50IGluX3NhbXBsZXMsIGdpbnQgb3V0X3NhbXBsZXMsIGdpbnQgKiBhY2N1bSkKK3sKKyAgR3N0UHVsc2VTaW5rICpwc2luazsKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworICBndWludCByZXN1bHQ7CisgIGd1aW50OCAqZGF0YV9lbmQ7CisgIGdib29sZWFuIHJldmVyc2U7CisgIGdpbnQgKnRvcHJvY2VzczsKKyAgZ2ludCBpbnIsIG91dHIsIGJwZjsKKyAgZ2ludDY0IG9mZnNldDsKKyAgZ3VpbnQgYnVmc2l6ZTsKKworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAoYnVmKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisKKyAgLyogRklYTUUgcG9zdCBtZXNzYWdlIHJhdGhlciB0aGFuIHVzaW5nIGEgc2lnbmFsIChhcyBtaXhlciBpbnRlcmZhY2UpICovCisgIGlmIChnX2F0b21pY19pbnRfY29tcGFyZV9hbmRfZXhjaGFuZ2UgKCZwc2luay0+bm90aWZ5LCAxLCAwKSkgeworICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKHBzaW5rKSwgInZvbHVtZSIpOworICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKHBzaW5rKSwgIm11dGUiKTsKKyAgICBnX29iamVjdF9ub3RpZnkgKEdfT0JKRUNUIChwc2luayksICJjdXJyZW50LWRldmljZSIpOworICB9CisKKyAgLyogbWFrZSBzdXJlIHRoZSByaW5nYnVmZmVyIGlzIHN0YXJ0ZWQgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKGdfYXRvbWljX2ludF9nZXQgKCZidWYtPnN0YXRlKSAhPQorICAgICAgICAgIEdTVF9BVURJT19SSU5HX0JVRkZFUl9TVEFURV9TVEFSVEVEKSkgeworICAgIC8qIHNlZSBpZiB3ZSBhcmUgYWxsb3dlZCB0byBzdGFydCBpdCAqLworICAgIGlmIChHX1VOTElLRUxZIChnX2F0b21pY19pbnRfZ2V0ICgmYnVmLT5tYXlfc3RhcnQpID09IEZBTFNFKSkKKyAgICAgIGdvdG8gbm9fc3RhcnQ7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChidWYsICJzdGFydCEiKTsKKyAgICBpZiAoIWdzdF9hdWRpb19yaW5nX2J1ZmZlcl9zdGFydCAoYnVmKSkKKyAgICAgIGdvdG8gc3RhcnRfZmFpbGVkOworICB9CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAiZW50ZXJpbmcgY29tbWl0Iik7CisgIHBidWYtPmluX2NvbW1pdCA9IFRSVUU7CisKKyAgYnBmID0gR1NUX0FVRElPX0lORk9fQlBGICgmYnVmLT5zcGVjLmluZm8pOworICBidWZzaXplID0gYnVmLT5zcGVjLnNlZ3NpemUgKiBidWYtPnNwZWMuc2VndG90YWw7CisKKyAgLyogb3VyIHRveSByZXNhbXBsZXIgZm9yIHRyaWNrIG1vZGVzICovCisgIHJldmVyc2UgPSBvdXRfc2FtcGxlcyA8IDA7CisgIG91dF9zYW1wbGVzID0gQUJTIChvdXRfc2FtcGxlcyk7CisKKyAgaWYgKGluX3NhbXBsZXMgPj0gb3V0X3NhbXBsZXMpCisgICAgdG9wcm9jZXNzID0gJmluX3NhbXBsZXM7CisgIGVsc2UKKyAgICB0b3Byb2Nlc3MgPSAmb3V0X3NhbXBsZXM7CisKKyAgaW5yID0gaW5fc2FtcGxlcyAtIDE7CisgIG91dHIgPSBvdXRfc2FtcGxlcyAtIDE7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJpbiAlZCwgb3V0ICVkIiwgaW5yLCBvdXRyKTsKKworICAvKiBkYXRhX2VuZCBwb2ludHMgdG8gdGhlIGxhc3Qgc2FtcGxlIHdlIGhhdmUgdG8gd3JpdGUsIG5vdCBwYXN0IGl0LiBUaGlzIGlzCisgICAqIG5lZWRlZCB0byBwcm9wZXJseSBoYW5kbGUgcmV2ZXJzZSBwbGF5YmFjazogaXQgcG9pbnRzIHRvIHRoZSBsYXN0IHNhbXBsZS4gKi8KKyAgZGF0YV9lbmQgPSBkYXRhICsgKGJwZiAqIGlucik7CisKKyAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCZwc2luay0+Zm9ybWF0X2xvc3QpKSB7CisgICAgLyogU2luayBmb3JtYXQgY2hhbmdlZCwgZHJvcCB0aGUgZGF0YSBhbmQgaG9wZSB1cHN0cmVhbSByZW5lZ290aWF0ZXMgKi8KKyAgICBnb3RvIGZha2VfZG9uZTsKKyAgfQorCisgIGlmIChwYnVmLT5wYXVzZWQpCisgICAgZ290byB3YXNfcGF1c2VkOworCisgIC8qIG9mZnNldCBpcyBpbiBieXRlcyAqLworICBvZmZzZXQgPSAqc2FtcGxlICogYnBmOworCisgIHdoaWxlICgqdG9wcm9jZXNzID4gMCkgeworICAgIHNpemVfdCBhdmFpbDsKKyAgICBndWludCB0b3dyaXRlOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLAorICAgICAgICAibmVlZCB0byB3cml0ZSAlZCBzYW1wbGVzIGF0IG9mZnNldCAlIiBHX0dJTlQ2NF9GT1JNQVQsICp0b3Byb2Nlc3MsCisgICAgICAgIG9mZnNldCk7CisKKyAgICBpZiAob2Zmc2V0ICE9IHBidWYtPm1fbGFzdG9mZnNldCkKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgImRpc2NvbnRpbnVpdHksIG9mZnNldCBpcyAlIiBHX0dJTlQ2NF9GT1JNQVQgIiwgIgorICAgICAgICAgICJsYXN0IG9mZnNldCB3YXMgJSIgR19HSU5UNjRfRk9STUFULCBvZmZzZXQsIHBidWYtPm1fbGFzdG9mZnNldCk7CisKKyAgICB0b3dyaXRlID0gb3V0X3NhbXBsZXMgKiBicGY7CisKKyAgICAvKiBXYWl0IGZvciBhdCBsZWFzdCBzZWdzaXplIGJ5dGVzIHRvIGJlY29tZSBhdmFpbGFibGUgKi8KKyAgICBpZiAodG93cml0ZSA+IGJ1Zi0+c3BlYy5zZWdzaXplKQorICAgICAgdG93cml0ZSA9IGJ1Zi0+c3BlYy5zZWdzaXplOworCisgICAgaWYgKChwYnVmLT5tX3dyaXRhYmxlIDwgdG93cml0ZSkgfHwgKG9mZnNldCAhPSBwYnVmLT5tX2xhc3RvZmZzZXQpKSB7CisgICAgICAvKiBpZiBubyByb29tIGxlZnQgb3IgZGlzY29udGludWl0eSBpbiBvZmZzZXQsCisgICAgICAgICB3ZSBuZWVkIHRvIGZsdXNoIGRhdGEgYW5kIGdldCBhIG5ldyBidWZmZXIgKi8KKworICAgICAgLyogZmx1c2ggdGhlIGJ1ZmZlciBpZiBwb3NzaWJsZSAqLworICAgICAgaWYgKChwYnVmLT5tX2RhdGEgIT0gTlVMTCkgJiYgKHBidWYtPm1fdG93cml0ZSA+IDApKSB7CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLAorICAgICAgICAgICAgImZsdXNoaW5nICV1IHNhbXBsZXMgYXQgb2Zmc2V0ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIChndWludCkgcGJ1Zi0+bV90b3dyaXRlIC8gYnBmLCBwYnVmLT5tX29mZnNldCk7CisKKyAgICAgICAgaWYgKHBhX3N0cmVhbV93cml0ZSAocGJ1Zi0+c3RyZWFtLCAodWludDhfdCAqKSBwYnVmLT5tX2RhdGEsCisgICAgICAgICAgICAgICAgcGJ1Zi0+bV90b3dyaXRlLCBOVUxMLCBwYnVmLT5tX29mZnNldCwgUEFfU0VFS19BQlNPTFVURSkgPCAwKSB7CisgICAgICAgICAgZ290byB3cml0ZV9mYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBidWYtPm1fdG93cml0ZSA9IDA7CisgICAgICBwYnVmLT5tX29mZnNldCA9IG9mZnNldDsgIC8qIGtlZXAgdHJhY2sgb2YgY3VycmVudCBvZmZzZXQgKi8KKworICAgICAgLyogZ2V0IGEgYnVmZmVyIHRvIHdyaXRlIGluIGZvciBub3cgb24gKi8KKyAgICAgIGZvciAoOzspIHsKKyAgICAgICAgcGJ1Zi0+bV93cml0YWJsZSA9IHBhX3N0cmVhbV93cml0YWJsZV9zaXplIChwYnVmLT5zdHJlYW0pOworCisgICAgICAgIGlmIChnX2F0b21pY19pbnRfZ2V0ICgmcHNpbmstPmZvcm1hdF9sb3N0KSkgeworICAgICAgICAgIC8qIFNpbmsgZm9ybWF0IGNoYW5nZWQsIGdpdmUgdXAgYW5kIGhvcGUgdXBzdHJlYW0gcmVuZWdvdGlhdGVzICovCisgICAgICAgICAgZ290byBmYWtlX2RvbmU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGJ1Zi0+bV93cml0YWJsZSA9PSAoc2l6ZV90KSAtIDEpCisgICAgICAgICAgZ290byB3cml0YWJsZV9zaXplX2ZhaWxlZDsKKworICAgICAgICBwYnVmLT5tX3dyaXRhYmxlIC89IGJwZjsKKyAgICAgICAgcGJ1Zi0+bV93cml0YWJsZSAqPSBicGY7ICAgICAgICAvKiBoYW5kbGUgb25seSBjb21wbGV0ZSBzYW1wbGVzICovCisKKyAgICAgICAgaWYgKHBidWYtPm1fd3JpdGFibGUgPj0gdG93cml0ZSkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBzZWUgaWYgd2UgbmVlZCB0byB1bmNvcmsgYmVjYXVzZSB3ZSBoYXZlIG5vIGZyZWUgc3BhY2UgKi8KKyAgICAgICAgaWYgKHBidWYtPmNvcmtlZCkgeworICAgICAgICAgIGlmICghZ3N0X3B1bHNlcmluZ19zZXRfY29ya2VkIChwYnVmLCBGQUxTRSwgRkFMU0UpKQorICAgICAgICAgICAgZ290byB1bmNvcmtfZmFpbGVkOworICAgICAgICB9CisKKyAgICAgICAgLyogd2UgY2FuJ3Qgd3JpdGUgc2Vnc2l6ZSBieXRlcywgd2FpdCBhIGJpdCAqLworICAgICAgICBHU1RfTE9HX09CSkVDVCAocHNpbmssICJ3YWl0aW5nIGZvciBmcmVlIHNwYWNlIik7CisgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQgKG1haW5sb29wKTsKKworICAgICAgICBpZiAocGJ1Zi0+cGF1c2VkKQorICAgICAgICAgIGdvdG8gd2FzX3BhdXNlZDsKKyAgICAgIH0KKworICAgICAgLyogUmVjYWxjdWxhdGUgd2hhdCB3ZSBjYW4gd3JpdGUgaW4gdGhlIG5leHQgY2h1bmsgKi8KKyAgICAgIHRvd3JpdGUgPSBvdXRfc2FtcGxlcyAqIGJwZjsKKyAgICAgIGlmIChwYnVmLT5tX3dyaXRhYmxlID4gdG93cml0ZSkKKyAgICAgICAgcGJ1Zi0+bV93cml0YWJsZSA9IHRvd3JpdGU7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgInJlcXVlc3RpbmcgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyBvZiAiCisgICAgICAgICAgInNoYXJlZCBtZW1vcnkiLCBwYnVmLT5tX3dyaXRhYmxlKTsKKworICAgICAgaWYgKHBhX3N0cmVhbV9iZWdpbl93cml0ZSAocGJ1Zi0+c3RyZWFtLCAmcGJ1Zi0+bV9kYXRhLAorICAgICAgICAgICAgICAmcGJ1Zi0+bV93cml0YWJsZSkgPCAwKSB7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgInBhX3N0cmVhbV9iZWdpbl93cml0ZSgpIGZhaWxlZCIpOworICAgICAgICBnb3RvIHdyaXRhYmxlX3NpemVfZmFpbGVkOworICAgICAgfQorCisgICAgICBHU1RfTE9HX09CSkVDVCAocHNpbmssICJnb3QgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyBvZiBzaGFyZWQgbWVtb3J5IiwKKyAgICAgICAgICBwYnVmLT5tX3dyaXRhYmxlKTsKKworICAgIH0KKworICAgIGlmICh0b3dyaXRlID4gcGJ1Zi0+bV93cml0YWJsZSkKKyAgICAgIHRvd3JpdGUgPSBwYnVmLT5tX3dyaXRhYmxlOworICAgIGF2YWlsID0gdG93cml0ZSAvIGJwZjsKKworICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgIndyaXRpbmcgJXUgc2FtcGxlcyBhdCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgKGd1aW50KSBhdmFpbCwgb2Zmc2V0KTsKKworICAgIC8qIE5vIHRyaWNrIG1vZGVzIGZvciBwYXNzdGhyb3VnaCBzdHJlYW1zICovCisgICAgaWYgKEdfVU5MSUtFTFkgKCFwYnVmLT5pc19wY20gJiYgKGluciAhPSBvdXRyIHx8IHJldmVyc2UpKSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwc2luaywgIlBhc3N0aHJvdWdoIHN0cmVhbSBjYW4ndCBydW4gaW4gdHJpY2sgbW9kZSIpOworICAgICAgZ290byB1bmxvY2tfYW5kX2ZhaWw7CisgICAgfQorCisgICAgaWYgKEdfTElLRUxZIChpbnIgPT0gb3V0ciAmJiAhcmV2ZXJzZSkpIHsKKyAgICAgIC8qIG5vIHJhdGUgY29udmVyc2lvbiwgc2ltcGx5IHdyaXRlIG91dCB0aGUgc2FtcGxlcyAqLworICAgICAgLyogY29weSB0aGUgZGF0YSBpbnRvIGludGVybmFsIGJ1ZmZlciAqLworCisgICAgICBtZW1jcHkgKChndWludDggKikgcGJ1Zi0+bV9kYXRhICsgcGJ1Zi0+bV90b3dyaXRlLCBkYXRhLCB0b3dyaXRlKTsKKyAgICAgIHBidWYtPm1fdG93cml0ZSArPSB0b3dyaXRlOworICAgICAgcGJ1Zi0+bV93cml0YWJsZSAtPSB0b3dyaXRlOworCisgICAgICBkYXRhICs9IHRvd3JpdGU7CisgICAgICBpbl9zYW1wbGVzIC09IGF2YWlsOworICAgICAgb3V0X3NhbXBsZXMgLT0gYXZhaWw7CisgICAgfSBlbHNlIHsKKyAgICAgIGd1aW50OCAqZGVzdCwgKmQsICpkX2VuZDsKKworICAgICAgLyogd3JpdGUgaW50byB0aGUgUHVsc2VBdWRpbyBzaG0gYnVmZmVyICovCisgICAgICBkZXN0ID0gZCA9IChndWludDggKikgcGJ1Zi0+bV9kYXRhICsgcGJ1Zi0+bV90b3dyaXRlOworICAgICAgZF9lbmQgPSBkICsgdG93cml0ZTsKKworICAgICAgaWYgKCFyZXZlcnNlKSB7CisgICAgICAgIGlmIChpbnIgPj0gb3V0cikKKyAgICAgICAgICAvKiBmb3J3YXJkIHNwZWVkIHVwICovCisgICAgICAgICAgRldEX1VQX1NBTVBMRVMgKGRhdGEsIGRhdGFfZW5kLCBkLCBkX2VuZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAvKiBmb3J3YXJkIHNsb3cgZG93biAqLworICAgICAgICAgIEZXRF9ET1dOX1NBTVBMRVMgKGRhdGEsIGRhdGFfZW5kLCBkLCBkX2VuZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoaW5yID49IG91dHIpCisgICAgICAgICAgLyogcmV2ZXJzZSBzcGVlZCB1cCAqLworICAgICAgICAgIFJFVl9VUF9TQU1QTEVTIChkYXRhLCBkYXRhX2VuZCwgZCwgZF9lbmQpOworICAgICAgICBlbHNlCisgICAgICAgICAgLyogcmV2ZXJzZSBzbG93IGRvd24gKi8KKyAgICAgICAgICBSRVZfRE9XTl9TQU1QTEVTIChkYXRhLCBkYXRhX2VuZCwgZCwgZF9lbmQpOworICAgICAgfQorICAgICAgLyogc2VlIHdoYXQgd2UgaGF2ZSBsZWZ0IHRvIHdyaXRlICovCisgICAgICB0b3dyaXRlID0gKGQgLSBkZXN0KTsKKyAgICAgIHBidWYtPm1fdG93cml0ZSArPSB0b3dyaXRlOworICAgICAgcGJ1Zi0+bV93cml0YWJsZSAtPSB0b3dyaXRlOworCisgICAgICBhdmFpbCA9IHRvd3JpdGUgLyBicGY7CisgICAgfQorCisgICAgLyogZmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCdzIGZ1bGwgKi8KKyAgICBpZiAoKHBidWYtPm1fZGF0YSAhPSBOVUxMKSAmJiAocGJ1Zi0+bV90b3dyaXRlID4gMCkKKyAgICAgICAgJiYgKHBidWYtPm1fd3JpdGFibGUgPT0gMCkpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgImZsdXNoaW5nICV1IHNhbXBsZXMgYXQgb2Zmc2V0ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAoZ3VpbnQpIHBidWYtPm1fdG93cml0ZSAvIGJwZiwgcGJ1Zi0+bV9vZmZzZXQpOworCisgICAgICBpZiAocGFfc3RyZWFtX3dyaXRlIChwYnVmLT5zdHJlYW0sICh1aW50OF90ICopIHBidWYtPm1fZGF0YSwKKyAgICAgICAgICAgICAgcGJ1Zi0+bV90b3dyaXRlLCBOVUxMLCBwYnVmLT5tX29mZnNldCwgUEFfU0VFS19BQlNPTFVURSkgPCAwKSB7CisgICAgICAgIGdvdG8gd3JpdGVfZmFpbGVkOworICAgICAgfQorICAgICAgcGJ1Zi0+bV90b3dyaXRlID0gMDsKKyAgICAgIHBidWYtPm1fb2Zmc2V0ID0gb2Zmc2V0ICsgdG93cml0ZTsgICAgICAgIC8qIGtlZXAgdHJhY2sgb2YgY3VycmVudCBvZmZzZXQgKi8KKyAgICB9CisKKyAgICAqc2FtcGxlICs9IGF2YWlsOworICAgIG9mZnNldCArPSBhdmFpbCAqIGJwZjsKKyAgICBwYnVmLT5tX2xhc3RvZmZzZXQgPSBvZmZzZXQ7CisKKyAgICAvKiBjaGVjayBpZiB3ZSBuZWVkIHRvIHVuY29yayBhZnRlciB3cml0aW5nIHRoZSBzYW1wbGVzICovCisgICAgaWYgKHBidWYtPmNvcmtlZCkgeworICAgICAgY29uc3QgcGFfdGltaW5nX2luZm8gKmluZm87CisKKyAgICAgIGlmICgoaW5mbyA9IHBhX3N0cmVhbV9nZXRfdGltaW5nX2luZm8gKHBidWYtPnN0cmVhbSkpKSB7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywKKyAgICAgICAgICAgICJyZWFkX2luZGV4IGF0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgb2Zmc2V0ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIGluZm8tPnJlYWRfaW5kZXgsIG9mZnNldCk7CisKKyAgICAgICAgLyogd2UgdW5jb3JrIHdoZW4gdGhlIHJlYWRfaW5kZXggaXMgdG9vIGZhciBiZWhpbmQgdGhlIG9mZnNldCB3ZSBuZWVkCisgICAgICAgICAqIHRvIHdyaXRlIHRvLiAqLworICAgICAgICBpZiAoaW5mby0+cmVhZF9pbmRleCArIGJ1ZnNpemUgPD0gb2Zmc2V0KSB7CisgICAgICAgICAgaWYgKCFnc3RfcHVsc2VyaW5nX3NldF9jb3JrZWQgKHBidWYsIEZBTFNFLCBGQUxTRSkpCisgICAgICAgICAgICBnb3RvIHVuY29ya19mYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgIm5vIHRpbWluZyBpbmZvIGF2YWlsYWJsZSB5ZXQiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworZmFrZV9kb25lOgorICAvKiB3ZSBjb25zdW1lZCBhbGwgc2FtcGxlcyBoZXJlICovCisgIGRhdGEgPSBkYXRhX2VuZCArIGJwZjsKKworICBwYnVmLT5pbl9jb21taXQgPSBGQUxTRTsKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChtYWlubG9vcCk7CisKK2RvbmU6CisgIHJlc3VsdCA9IGluciAtICgoZGF0YV9lbmQgLSBkYXRhKSAvIGJwZik7CisgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgIndyb3RlICVkIHNhbXBsZXMiLCByZXN1bHQpOworCisgIHJldHVybiByZXN1bHQ7CisKKyAgLyogRVJST1JTICovCit1bmxvY2tfYW5kX2ZhaWw6CisgIHsKKyAgICBwYnVmLT5pbl9jb21taXQgPSBGQUxTRTsKKyAgICBHU1RfTE9HX09CSkVDVCAocHNpbmssICJ3ZSBhcmUgcmVzZXQiKTsKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK25vX3N0YXJ0OgorICB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHBzaW5rLCAid2UgY2FuIG5vdCBzdGFydCIpOworICAgIHJldHVybiAwOworICB9CitzdGFydF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocHNpbmssICJmYWlsZWQgdG8gc3RhcnQgdGhlIHJpbmdidWZmZXIiKTsKKyAgICByZXR1cm4gMDsKKyAgfQordW5jb3JrX2ZhaWxlZDoKKyAgeworICAgIHBidWYtPmluX2NvbW1pdCA9IEZBTFNFOworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBzaW5rLCAidW5jb3JrIGZhaWxlZCIpOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAobWFpbmxvb3ApOworICAgIGdvdG8gZG9uZTsKKyAgfQord2FzX3BhdXNlZDoKKyAgeworICAgIHBidWYtPmluX2NvbW1pdCA9IEZBTFNFOworICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgIndlIGFyZSBwYXVzZWQiKTsKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3dyaXRhYmxlX3NpemVfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBzaW5rLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoInBhX3N0cmVhbV93cml0YWJsZV9zaXplKCkgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAocGJ1Zi0+Y29udGV4dCkpKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9ja19hbmRfZmFpbDsKKyAgfQord3JpdGVfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBzaW5rLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoInBhX3N0cmVhbV93cml0ZSgpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHBidWYtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2tfYW5kX2ZhaWw7CisgIH0KK30KKworLyogd3JpdGUgcGVuZGluZyBsb2NhbCBzYW1wbGVzLCBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBtYWlubG9vcCBsb2NrICovCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlcmluZ19mbHVzaCAoR3N0UHVsc2VSaW5nQnVmZmVyICogcGJ1ZikKK3sKKyAgR3N0UHVsc2VTaW5rICpwc2luazsKKworICBwc2luayA9IEdTVF9QVUxTRVNJTktfQ0FTVCAoR1NUX09CSkVDVF9QQVJFTlQgKHBidWYpKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJlbnRlcmluZyBmbHVzaCIpOworCisgIC8qIGZsdXNoIHRoZSBidWZmZXIgaWYgcG9zc2libGUgKi8KKyAgaWYgKHBidWYtPnN0cmVhbSAmJiAocGJ1Zi0+bV9kYXRhICE9IE5VTEwpICYmIChwYnVmLT5tX3Rvd3JpdGUgPiAwKSkgeworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgICBnaW50IGJwZjsKKworICAgIGJwZiA9IChHU1RfQVVESU9fUklOR19CVUZGRVJfQ0FTVCAocGJ1ZikpLT5zcGVjLmluZm8uYnBmOworICAgIEdTVF9MT0dfT0JKRUNUIChwc2luaywKKyAgICAgICAgImZsdXNoaW5nICV1IHNhbXBsZXMgYXQgb2Zmc2V0ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgKGd1aW50KSBwYnVmLT5tX3Rvd3JpdGUgLyBicGYsIHBidWYtPm1fb2Zmc2V0KTsKKyNlbmRpZgorCisgICAgaWYgKHBhX3N0cmVhbV93cml0ZSAocGJ1Zi0+c3RyZWFtLCAodWludDhfdCAqKSBwYnVmLT5tX2RhdGEsCisgICAgICAgICAgICBwYnVmLT5tX3Rvd3JpdGUsIE5VTEwsIHBidWYtPm1fb2Zmc2V0LCBQQV9TRUVLX0FCU09MVVRFKSA8IDApIHsKKyAgICAgIGdvdG8gd3JpdGVfZmFpbGVkOworICAgIH0KKworICAgIHBidWYtPm1fdG93cml0ZSA9IDA7CisgICAgcGJ1Zi0+bV9vZmZzZXQgKz0gcGJ1Zi0+bV90b3dyaXRlOyAgLyoga2VlcCB0cmFjayBvZiBjdXJyZW50IG9mZnNldCAqLworICB9CisKK2RvbmU6CisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK3dyaXRlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwc2luaywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9zdHJlYW1fd3JpdGUoKSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwYnVmLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBnc3RfcHVsc2VzaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9wdWxzZXNpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3B1bHNlc2lua19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcHVsc2VzaW5rX2V2ZW50IChHc3RCYXNlU2luayAqIHNpbmssIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9wdWxzZXNpbmtfcXVlcnkgKEdzdEJhc2VTaW5rICogc2luaywgR3N0UXVlcnkgKiBxdWVyeSk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcHVsc2VzaW5rX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBwYWRfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFBVTFNFX1NJTktfVEVNUExBVEVfQ0FQUykpOworCisjZGVmaW5lIGdzdF9wdWxzZXNpbmtfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdFB1bHNlU2luaywgZ3N0X3B1bHNlc2luaywgR1NUX1RZUEVfQVVESU9fQkFTRV9TSU5LLAorICAgIGdzdF9wdWxzZXNpbmtfaW5pdF9jb250ZXh0cyAoKTsKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1NUUkVBTV9WT0xVTUUsIE5VTEwpCisgICAgKTsKKworc3RhdGljIEdzdEF1ZGlvUmluZ0J1ZmZlciAqCitnc3RfcHVsc2VzaW5rX2NyZWF0ZV9yaW5nYnVmZmVyIChHc3RBdWRpb0Jhc2VTaW5rICogc2luaykKK3sKKyAgR3N0QXVkaW9SaW5nQnVmZmVyICpidWZmZXI7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgImNyZWF0aW5nIHJpbmdidWZmZXIiKTsKKyAgYnVmZmVyID0gZ19vYmplY3RfbmV3IChHU1RfVFlQRV9QVUxTRVJJTkdfQlVGRkVSLCBOVUxMKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgImNyZWF0ZWQgcmluZ2J1ZmZlciBAJXAiLCBidWZmZXIpOworCisgIHJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3B1bHNlc2lua19wYXlsb2FkIChHc3RBdWRpb0Jhc2VTaW5rICogc2luaywgR3N0QnVmZmVyICogYnVmKQoreworICBzd2l0Y2ggKHNpbmstPnJpbmdidWZmZXItPnNwZWMudHlwZSkgeworICAgIGNhc2UgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX0FDMzoKKyAgICBjYXNlIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9FQUMzOgorICAgIGNhc2UgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX0RUUzoKKyAgICBjYXNlIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9NUEVHOgorICAgIGNhc2UgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX01QRUcyX0FBQzoKKyAgICBjYXNlIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9NUEVHNF9BQUM6CisgICAgeworICAgICAgLyogRklYTUU6IGFsbG9jIG1lbW9yeSBmcm9tIFBBIGlmIHBvc3NpYmxlICovCisgICAgICBnaW50IGZyYW1lc2l6ZSA9IGdzdF9hdWRpb19pZWM2MTkzN19mcmFtZV9zaXplICgmc2luay0+cmluZ2J1ZmZlci0+c3BlYyk7CisgICAgICBHc3RCdWZmZXIgKm91dDsKKyAgICAgIEdzdE1hcEluZm8gaW5tYXAsIG91dG1hcDsKKyAgICAgIGdib29sZWFuIHJlczsKKworICAgICAgaWYgKGZyYW1lc2l6ZSA8PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgb3V0ID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChmcmFtZXNpemUpOworCisgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmaW5tYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICBnc3RfYnVmZmVyX21hcCAob3V0LCAmb3V0bWFwLCBHU1RfTUFQX1dSSVRFKTsKKworICAgICAgcmVzID0gZ3N0X2F1ZGlvX2llYzYxOTM3X3BheWxvYWQgKGlubWFwLmRhdGEsIGlubWFwLnNpemUsCisgICAgICAgICAgb3V0bWFwLmRhdGEsIG91dG1hcC5zaXplLCAmc2luay0+cmluZ2J1ZmZlci0+c3BlYywgR19CSUdfRU5ESUFOKTsKKworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmaW5tYXApOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0LCAmb3V0bWFwKTsKKworICAgICAgaWYgKCFyZXMpIHsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICAgIGdzdF9idWZmZXJfY29weV9pbnRvIChvdXQsIGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX01FVEFEQVRBLCAwLCAtMSk7CisgICAgICByZXR1cm4gb3V0OworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZ3N0X2J1ZmZlcl9yZWYgKGJ1Zik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNpbmtfY2xhc3NfaW5pdCAoR3N0UHVsc2VTaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QmFzZVNpbmtDbGFzcyAqZ3N0YmFzZXNpbmtfY2xhc3MgPSBHU1RfQkFTRV9TSU5LX0NMQVNTIChrbGFzcyk7CisgIEdzdEJhc2VTaW5rQ2xhc3MgKmJjOworICBHc3RBdWRpb0Jhc2VTaW5rQ2xhc3MgKmdzdGF1ZGlvc2lua19jbGFzcyA9IEdTVF9BVURJT19CQVNFX1NJTktfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgZ2NoYXIgKmNsaWVudG5hbWU7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcHVsc2VzaW5rX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcHVsc2VzaW5rX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3B1bHNlc2lua19nZXRfcHJvcGVydHk7CisKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPmV2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wdWxzZXNpbmtfZXZlbnQpOworICBnc3RiYXNlc2lua19jbGFzcy0+cXVlcnkgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3B1bHNlc2lua19xdWVyeSk7CisKKyAgLyogcmVzdG9yZSB0aGUgb3JpZ2luYWwgYmFzZXNpbmsgcHVsbCBtZXRob2RzICovCisgIGJjID0gZ190eXBlX2NsYXNzX3BlZWsgKEdTVF9UWVBFX0JBU0VfU0lOSyk7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5hY3RpdmF0ZV9wdWxsID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGJjLT5hY3RpdmF0ZV9wdWxsKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wdWxzZXNpbmtfY2hhbmdlX3N0YXRlKTsKKworICBnc3RhdWRpb3NpbmtfY2xhc3MtPmNyZWF0ZV9yaW5nYnVmZmVyID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VzaW5rX2NyZWF0ZV9yaW5nYnVmZmVyKTsKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzLT5wYXlsb2FkID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wdWxzZXNpbmtfcGF5bG9hZCk7CisKKyAgLyogT3ZlcndyaXRlIEdPYmplY3QgZmllbGRzICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1NFUlZFUiwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJzZXJ2ZXIiLCAiU2VydmVyIiwKKyAgICAgICAgICAiVGhlIFB1bHNlQXVkaW8gc2VydmVyIHRvIGNvbm5lY3QgdG8iLCBERUZBVUxUX1NFUlZFUiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RFVklDRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJkZXZpY2UiLCAiRGV2aWNlIiwKKyAgICAgICAgICAiVGhlIFB1bHNlQXVkaW8gc2luayBkZXZpY2UgdG8gY29ubmVjdCB0byIsIERFRkFVTFRfREVWSUNFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ1VSUkVOVF9ERVZJQ0UsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiY3VycmVudC1kZXZpY2UiLCAiQ3VycmVudCBEZXZpY2UiLAorICAgICAgICAgICJUaGUgY3VycmVudCBQdWxzZUF1ZGlvIHNpbmsgZGV2aWNlIiwgREVGQVVMVF9DVVJSRU5UX0RFVklDRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0RFVklDRV9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRldmljZS1uYW1lIiwgIkRldmljZSBuYW1lIiwKKyAgICAgICAgICAiSHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgc291bmQgZGV2aWNlIiwgREVGQVVMVF9ERVZJQ0VfTkFNRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1ZPTFVNRSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJ2b2x1bWUiLCAiVm9sdW1lIiwKKyAgICAgICAgICAiTGluZWFyIHZvbHVtZSBvZiB0aGlzIHN0cmVhbSwgMS4wPTEwMCUiLCAwLjAsIE1BWF9WT0xVTUUsCisgICAgICAgICAgREVGQVVMVF9WT0xVTUUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9NVVRFLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJtdXRlIiwgIk11dGUiLAorICAgICAgICAgICJNdXRlIHN0YXRlIG9mIHRoaXMgc3RyZWFtIiwgREVGQVVMVF9NVVRFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RQdWxzZVNpbms6Y2xpZW50LW5hbWU6CisgICAqCisgICAqIFRoZSBQdWxzZUF1ZGlvIGNsaWVudCBuYW1lIHRvIHVzZS4KKyAgICovCisgIGNsaWVudG5hbWUgPSBnc3RfcHVsc2VfY2xpZW50X25hbWUgKCk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0NMSUVOVF9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImNsaWVudC1uYW1lIiwgIkNsaWVudCBOYW1lIiwKKyAgICAgICAgICAiVGhlIFB1bHNlQXVkaW8gY2xpZW50IG5hbWUgdG8gdXNlIiwgY2xpZW50bmFtZSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfAorICAgICAgICAgIEdTVF9QQVJBTV9NVVRBQkxFX1JFQURZKSk7CisgIGdfZnJlZSAoY2xpZW50bmFtZSk7CisKKyAgLyoqCisgICAqIEdzdFB1bHNlU2luazpzdHJlYW0tcHJvcGVydGllczoKKyAgICoKKyAgICogTGlzdCBvZiBwdWxzZWF1ZGlvIHN0cmVhbSBwcm9wZXJ0aWVzLiBBIGxpc3Qgb2YgZGVmaW5lZCBwcm9wZXJ0aWVzIGNhbiBiZQorICAgKiBmb3VuZCBpbiB0aGUgPHVsaW5rIHVybD0iaHR0cDovLzBwb2ludGVyLmRlL2xlbm5hcnQvcHJvamVjdHMvcHVsc2VhdWRpby9kb3h5Z2VuL3Byb3BsaXN0XzhoLmh0bWwiPnB1bHNlYXVkaW8gYXBpIGRvY3M8L3VsaW5rPi4KKyAgICoKKyAgICogQmVsb3cgaXMgYW4gZXhhbXBsZSBmb3IgcmVnaXN0ZXJpbmcgYXMgYSBtdXNpYyBhcHBsaWNhdGlvbiB0byBwdWxzZWF1ZGlvLgorICAgKiB8WworICAgKiBHc3RTdHJ1Y3R1cmUgKnByb3BzOworICAgKgorICAgKiBwcm9wcyA9IGdzdF9zdHJ1Y3R1cmVfZnJvbV9zdHJpbmcgKCJwcm9wcyxtZWRpYS5yb2xlPW11c2ljIiwgTlVMTCk7CisgICAqIGdfb2JqZWN0X3NldCAocHVsc2UsICJzdHJlYW0tcHJvcGVydGllcyIsIHByb3BzLCBOVUxMKTsKKyAgICogZ3N0X3N0cnVjdHVyZV9mcmVlCisgICAqIF18CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9TVFJFQU1fUFJPUEVSVElFUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoInN0cmVhbS1wcm9wZXJ0aWVzIiwgInN0cmVhbSBwcm9wZXJ0aWVzIiwKKyAgICAgICAgICAibGlzdCBvZiBwdWxzZWF1ZGlvIHN0cmVhbSBwcm9wZXJ0aWVzIiwKKyAgICAgICAgICBHU1RfVFlQRV9TVFJVQ1RVUkUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUHVsc2VBdWRpbyBBdWRpbyBTaW5rIiwKKyAgICAgICJTaW5rL0F1ZGlvIiwgIlBsYXlzIGF1ZGlvIHRvIGEgUHVsc2VBdWRpbyBzZXJ2ZXIiLCAiTGVubmFydCBQb2V0dGVyaW5nIik7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmcGFkX3RlbXBsYXRlKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfZGV2aWNlX2luZm8gKEdzdFB1bHNlRGV2aWNlSW5mbyAqIGRldmljZV9pbmZvKQoreworICBHTGlzdCAqbDsKKworICBnX2ZyZWUgKGRldmljZV9pbmZvLT5kZXNjcmlwdGlvbik7CisKKyAgZm9yIChsID0gZ19saXN0X2ZpcnN0IChkZXZpY2VfaW5mby0+Zm9ybWF0cyk7IGw7IGwgPSBnX2xpc3RfbmV4dCAobCkpCisgICAgcGFfZm9ybWF0X2luZm9fZnJlZSAoKHBhX2Zvcm1hdF9pbmZvICopIGwtPmRhdGEpOworCisgIGdfbGlzdF9mcmVlIChkZXZpY2VfaW5mby0+Zm9ybWF0cyk7Cit9CisKKy8qIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBvZiB0aGUgc2luayByaW5nYnVmZmVyLiBUaGUgdGltaW5nX2luZm8gaXMgdXBkYXRlZAorICogb24gZXZlcnkgZGF0YSB3cml0ZS9mbHVzaCBhbmQgZXZlcnkgMTAwbXMgKFBBX1NUUkVBTV9BVVRPX1RJTUlOR19VUERBVEUpLgorICovCitzdGF0aWMgR3N0Q2xvY2tUaW1lCitnc3RfcHVsc2VzaW5rX2dldF90aW1lIChHc3RDbG9jayAqIGNsb2NrLCBHc3RBdWRpb0Jhc2VTaW5rICogc2luaykKK3sKKyAgR3N0UHVsc2VTaW5rICpwc2luazsKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworICBwYV91c2VjX3QgdGltZTsKKworICBpZiAoIXNpbmstPnJpbmdidWZmZXIgfHwgIXNpbmstPnJpbmdidWZmZXItPmFjcXVpcmVkKQorICAgIHJldHVybiBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUIChzaW5rLT5yaW5nYnVmZmVyKTsKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKEdTVF9PQkpFQ1RfUEFSRU5UIChwYnVmKSk7CisKKyAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCZwc2luay0+Zm9ybWF0X2xvc3QpKSB7CisgICAgLyogU3RyZWFtIHdhcyBsb3N0IGluIGEgZm9ybWF0IGNoYW5nZSwgaXQnbGwgZ2V0IHNldCB1cCBhZ2FpbiBvbmNlCisgICAgICogdXBzdHJlYW0gcmVuZWdvdGlhdGVzICovCisgICAgcmV0dXJuIHBzaW5rLT5mb3JtYXRfbG9zdF90aW1lOworICB9CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworICBpZiAoZ3N0X3B1bHNlcmluZ19pc19kZWFkIChwc2luaywgcGJ1ZiwgVFJVRSkpCisgICAgZ290byBzZXJ2ZXJfZGVhZDsKKworICAvKiBpZiB3ZSBkb24ndCBoYXZlIGVub3VnaCBkYXRhIHRvIGdldCBhIHRpbWVzdGFtcCwganVzdCByZXR1cm4gTk9ORSwgd2hpY2gKKyAgICogd2lsbCByZXR1cm4gdGhlIGxhc3QgcmVwb3J0ZWQgdGltZSAqLworICBpZiAocGFfc3RyZWFtX2dldF90aW1lIChwYnVmLT5zdHJlYW0sICZ0aW1lKSA8IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgImNvdWxkIG5vdCBnZXQgdGltZSIpOworICAgIHRpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9IGVsc2UKKyAgICB0aW1lICo9IDEwMDA7CisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAobWFpbmxvb3ApOworCisgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgImN1cnJlbnQgdGltZSBpcyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lKSk7CisKKyAgcmV0dXJuIHRpbWU7CisKKyAgLyogRVJST1JTICovCitzZXJ2ZXJfZGVhZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAidGhlIHNlcnZlciBpcyBkZWFkIik7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChtYWlubG9vcCk7CisKKyAgICByZXR1cm4gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc2lua19zaW5rX2luZm9fY2IgKHBhX2NvbnRleHQgKiBjLCBjb25zdCBwYV9zaW5rX2luZm8gKiBpLCBpbnQgZW9sLAorICAgIHZvaWQgKnVzZXJkYXRhKQoreworICBHc3RQdWxzZURldmljZUluZm8gKmRldmljZV9pbmZvID0gKEdzdFB1bHNlRGV2aWNlSW5mbyAqKSB1c2VyZGF0YTsKKyAgZ3VpbnQ4IGo7CisKKyAgaWYgKCFpKQorICAgIGdvdG8gZG9uZTsKKworICBkZXZpY2VfaW5mby0+ZGVzY3JpcHRpb24gPSBnX3N0cmR1cCAoaS0+ZGVzY3JpcHRpb24pOworCisgIGRldmljZV9pbmZvLT5mb3JtYXRzID0gTlVMTDsKKyAgZm9yIChqID0gMDsgaiA8IGktPm5fZm9ybWF0czsgaisrKQorICAgIGRldmljZV9pbmZvLT5mb3JtYXRzID0gZ19saXN0X3ByZXBlbmQgKGRldmljZV9pbmZvLT5mb3JtYXRzLAorICAgICAgICBwYV9mb3JtYXRfaW5mb19jb3B5IChpLT5mb3JtYXRzW2pdKSk7CisKK2RvbmU6CisgIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCAobWFpbmxvb3AsIDApOworfQorCisvKiBDYWxsIHdpdGggbWFpbmxvb3AgbG9jayBoZWxkICovCitzdGF0aWMgcGFfc3RyZWFtICoKK2dzdF9wdWxzZXNpbmtfY3JlYXRlX3Byb2JlX3N0cmVhbSAoR3N0UHVsc2VTaW5rICogcHNpbmssCisgICAgR3N0UHVsc2VSaW5nQnVmZmVyICogcGJ1ZiwgcGFfZm9ybWF0X2luZm8gKiBmb3JtYXQpCit7CisgIHBhX2Zvcm1hdF9pbmZvICpmb3JtYXRzWzFdID0geyBmb3JtYXQgfTsKKyAgcGFfc3RyZWFtICpzdHJlYW07CisgIHBhX3N0cmVhbV9mbGFnc190IGZsYWdzOworCisgIEdTVF9MT0dfT0JKRUNUIChwc2luaywgIkNyZWF0aW5nIHByb2JlIHN0cmVhbSIpOworCisgIGlmICghKHN0cmVhbSA9IHBhX3N0cmVhbV9uZXdfZXh0ZW5kZWQgKHBidWYtPmNvbnRleHQsICJwdWxzZXNpbmsgcHJvYmUiLAorICAgICAgICAgICAgICBmb3JtYXRzLCAxLCBwc2luay0+cHJvcGxpc3QpKSkKKyAgICBnb3RvIGVycm9yOworCisgIC8qIGNvbnN0cnVjdCB0aGUgZmxhZ3MgKi8KKyAgZmxhZ3MgPSBQQV9TVFJFQU1fSU5URVJQT0xBVEVfVElNSU5HIHwgUEFfU1RSRUFNX0FVVE9fVElNSU5HX1VQREFURSB8CisgICAgICBQQV9TVFJFQU1fQURKVVNUX0xBVEVOQ1kgfCBQQV9TVFJFQU1fU1RBUlRfQ09SS0VEOworCisgIHBhX3N0cmVhbV9zZXRfc3RhdGVfY2FsbGJhY2sgKHN0cmVhbSwgZ3N0X3B1bHNlcmluZ19zdHJlYW1fc3RhdGVfY2IsIHBidWYpOworCisgIGlmIChwYV9zdHJlYW1fY29ubmVjdF9wbGF5YmFjayAoc3RyZWFtLCBwc2luay0+ZGV2aWNlLCBOVUxMLCBmbGFncywgTlVMTCwKKyAgICAgICAgICBOVUxMKSA8IDApCisgICAgZ290byBlcnJvcjsKKworICBpZiAoIWdzdF9wdWxzZXJpbmdfd2FpdF9mb3Jfc3RyZWFtX3JlYWR5IChwc2luaywgc3RyZWFtKSkKKyAgICBnb3RvIGVycm9yOworCisgIHJldHVybiBzdHJlYW07CisKK2Vycm9yOgorICBpZiAoc3RyZWFtKQorICAgIHBhX3N0cmVhbV91bnJlZiAoc3RyZWFtKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9wdWxzZXNpbmtfcXVlcnlfZ2V0Y2FwcyAoR3N0UHVsc2VTaW5rICogcHNpbmssIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZiA9IE5VTEw7CisgIEdzdFB1bHNlRGV2aWNlSW5mbyBkZXZpY2VfaW5mbyA9IHsgTlVMTCwgTlVMTCB9OworICBHc3RDYXBzICpyZXQgPSBOVUxMOworICBHTGlzdCAqaTsKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKyAgcGFfc3RyZWFtICpzdHJlYW07CisKKyAgR1NUX09CSkVDVF9MT0NLIChwc2luayk7CisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUIChHU1RfQVVESU9fQkFTRV9TSU5LIChwc2luayktPnJpbmdidWZmZXIpOworICBpZiAocGJ1ZiAhPSBOVUxMKQorICAgIGdzdF9vYmplY3RfcmVmIChwYnVmKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHBzaW5rKTsKKworICBpZiAoIXBidWYpIHsKKyAgICByZXQgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0FVRElPX0JBU0VfU0lOS19QQUQgKHBzaW5rKSk7CisgICAgZ290byBvdXQ7CisgIH0KKworICBHU1RfT0JKRUNUX0xPQ0sgKHBidWYpOworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChtYWlubG9vcCk7CisKKyAgaWYgKCFwYnVmLT5jb250ZXh0KSB7CisgICAgcmV0ID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9BVURJT19CQVNFX1NJTktfUEFEIChwc2luaykpOworICAgIGdvdG8gdW5sb2NrOworICB9CisKKyAgcmV0ID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIGlmIChwYnVmLT5zdHJlYW0pIHsKKyAgICAvKiBXZSdyZSBpbiBQQVVTRUQgb3IgaGlnaGVyICovCisgICAgc3RyZWFtID0gcGJ1Zi0+c3RyZWFtOworCisgIH0gZWxzZSBpZiAocGJ1Zi0+cHJvYmVfc3RyZWFtKSB7CisgICAgLyogV2UncmUgbm90IHBhdXNlZCwgYnV0IGhhdmUgYSBjYWNoZWQgcHJvYmUgc3RyZWFtICovCisgICAgc3RyZWFtID0gcGJ1Zi0+cHJvYmVfc3RyZWFtOworCisgIH0gZWxzZSB7CisgICAgLyogV2UncmUgbm90IHlldCBpbiBQQVVTRUQgYW5kIHN0aWxsIG5lZWQgdG8gY3JlYXRlIGEgcHJvYmUgc3RyZWFtLgorICAgICAqCisgICAgICogRklYTUU6IFBBIGRvZXNuJ3QgYWNjZXB0ICJhbnkiIGZvcm1hdC4gV2UgZml4IHNvbWV0aGluZyByZWFzb25hYmxlIHNpbmNlCisgICAgICogdGhpcyBpcyBtZXJlbHkgYSBwcm9iZS4gVGhpcyBzaG91bGQgZXZlbnR1YWxseSBiZSBmaXhlZCBpbiBQQSBhbmQKKyAgICAgKiBoYXJkLWNvZGluZyB0aGUgZm9ybWF0IHNob3VsZCBiZSBkcm9wcGVkLiAqLworICAgIHBhX2Zvcm1hdF9pbmZvICpmb3JtYXQgPSBwYV9mb3JtYXRfaW5mb19uZXcgKCk7CisgICAgZm9ybWF0LT5lbmNvZGluZyA9IFBBX0VOQ09ESU5HX1BDTTsKKyAgICBwYV9mb3JtYXRfaW5mb19zZXRfc2FtcGxlX2Zvcm1hdCAoZm9ybWF0LCBQQV9TQU1QTEVfUzE2TEUpOworICAgIHBhX2Zvcm1hdF9pbmZvX3NldF9yYXRlIChmb3JtYXQsIEdTVF9BVURJT19ERUZfUkFURSk7CisgICAgcGFfZm9ybWF0X2luZm9fc2V0X2NoYW5uZWxzIChmb3JtYXQsIEdTVF9BVURJT19ERUZfQ0hBTk5FTFMpOworCisgICAgcGJ1Zi0+cHJvYmVfc3RyZWFtID0gZ3N0X3B1bHNlc2lua19jcmVhdGVfcHJvYmVfc3RyZWFtIChwc2luaywgcGJ1ZiwKKyAgICAgICAgZm9ybWF0KTsKKworICAgIHBhX2Zvcm1hdF9pbmZvX2ZyZWUgKGZvcm1hdCk7CisKKyAgICBpZiAoIXBidWYtPnByb2JlX3N0cmVhbSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwc2luaywgIkNvdWxkIG5vdCBjcmVhdGUgcHJvYmUgc3RyZWFtIik7CisgICAgICBnb3RvIHVubG9jazsKKyAgICB9CisKKyAgICBzdHJlYW0gPSBwYnVmLT5wcm9iZV9zdHJlYW07CisgIH0KKworICBpZiAoIShvID0gcGFfY29udGV4dF9nZXRfc2lua19pbmZvX2J5X25hbWUgKHBidWYtPmNvbnRleHQsCisgICAgICAgICAgICAgIHBhX3N0cmVhbV9nZXRfZGV2aWNlX25hbWUgKHN0cmVhbSksIGdzdF9wdWxzZXNpbmtfc2lua19pbmZvX2NiLAorICAgICAgICAgICAgICAmZGV2aWNlX2luZm8pKSkKKyAgICBnb3RvIGluZm9fZmFpbGVkOworCisgIHdoaWxlIChwYV9vcGVyYXRpb25fZ2V0X3N0YXRlIChvKSA9PSBQQV9PUEVSQVRJT05fUlVOTklORykgeworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQgKG1haW5sb29wKTsKKyAgICBpZiAoZ3N0X3B1bHNlcmluZ19pc19kZWFkIChwc2luaywgcGJ1ZiwgRkFMU0UpKQorICAgICAgZ290byB1bmxvY2s7CisgIH0KKworICBmb3IgKGkgPSBnX2xpc3RfZmlyc3QgKGRldmljZV9pbmZvLmZvcm1hdHMpOyBpOyBpID0gZ19saXN0X25leHQgKGkpKSB7CisgICAgZ3N0X2NhcHNfYXBwZW5kIChyZXQsCisgICAgICAgIGdzdF9wdWxzZV9mb3JtYXRfaW5mb190b19jYXBzICgocGFfZm9ybWF0X2luZm8gKikgaS0+ZGF0YSkpOworICB9CisKK3VubG9jazoKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChtYWlubG9vcCk7CisgIC8qIEZJWE1FOiB0aGlzIGNvdWxkIGJlIGZyZWVkIGFmdGVyIGRldmljZV9uYW1lIGlzIGdvdCAqLworICBHU1RfT0JKRUNUX1VOTE9DSyAocGJ1Zik7CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKnRtcCA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHJldCwKKyAgICAgICAgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmV0KTsKKyAgICByZXQgPSB0bXA7CisgIH0KKworb3V0OgorICBmcmVlX2RldmljZV9pbmZvICgmZGV2aWNlX2luZm8pOworCisgIGlmIChvKQorICAgIHBhX29wZXJhdGlvbl91bnJlZiAobyk7CisKKyAgaWYgKHBidWYpCisgICAgZ3N0X29iamVjdF91bnJlZiAocGJ1Zik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJjYXBzICUiIEdTVF9QVFJfRk9STUFULCByZXQpOworCisgIHJldHVybiByZXQ7CisKK2luZm9fZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBzaW5rLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoInBhX2NvbnRleHRfZ2V0X3NpbmtfaW5wdXRfaW5mbygpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHBidWYtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2s7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VzaW5rX3F1ZXJ5X2FjY2VwdGNhcHMgKEdzdFB1bHNlU2luayAqIHBzaW5rLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmID0gTlVMTDsKKyAgR3N0UHVsc2VEZXZpY2VJbmZvIGRldmljZV9pbmZvID0geyBOVUxMLCBOVUxMIH07CisgIEdzdENhcHMgKnBhZF9jYXBzOworICBHc3RTdHJ1Y3R1cmUgKnN0OworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjIHNwZWMgPSB7IDAgfTsKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKyAgcGFfY2hhbm5lbF9tYXAgY2hhbm5lbF9tYXA7CisgIHBhX2Zvcm1hdF9pbmZvICpmb3JtYXQgPSBOVUxMOworICBndWludCBjaGFubmVsczsKKworICBwYWRfY2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChHU1RfQkFTRV9TSU5LX1BBRCAocHNpbmspKTsKKyAgcmV0ID0gZ3N0X2NhcHNfaXNfc3Vic2V0IChjYXBzLCBwYWRfY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChwYWRfY2Fwcyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJjYXBzICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICAvKiBUZW1wbGF0ZSBjYXBzIGRpZG4ndCBtYXRjaCAqLworICBpZiAoIXJldCkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogSWYgd2UndmUgbm90IGdvdCBmaXhlZCBjYXBzLCBjcmVhdGluZyBhIHN0cmVhbSBtaWdodCBmYWlsLCBzbyBsZXQncyBqdXN0CisgICAqIHJldHVybiBmcm9tIGhlcmUgd2l0aCBkZWZhdWx0IGFjY2VwdGNhcHMgYmVoYXZpb3VyICovCisgIGlmICghZ3N0X2NhcHNfaXNfZml4ZWQgKGNhcHMpKQorICAgIGdvdG8gZG9uZTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHBzaW5rKTsKKyAgcGJ1ZiA9IEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1QgKEdTVF9BVURJT19CQVNFX1NJTksgKHBzaW5rKS0+cmluZ2J1ZmZlcik7CisgIGlmIChwYnVmICE9IE5VTEwpCisgICAgZ3N0X29iamVjdF9yZWYgKHBidWYpOworICBHU1RfT0JKRUNUX1VOTE9DSyAocHNpbmspOworCisgIC8qIFdlJ3JlIHN0aWxsIGluIE5VTEwgc3RhdGUgKi8KKyAgaWYgKHBidWYgPT0gTlVMTCkKKyAgICBnb3RvIGRvbmU7CisKKyAgR1NUX09CSkVDVF9MT0NLIChwYnVmKTsKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworCisgIGlmIChwYnVmLT5jb250ZXh0ID09IE5VTEwpCisgICAgZ290byBvdXQ7CisKKyAgcmV0ID0gRkFMU0U7CisKKyAgc3BlYy5sYXRlbmN5X3RpbWUgPSBHU1RfQVVESU9fQkFTRV9TSU5LIChwc2luayktPmxhdGVuY3lfdGltZTsKKyAgaWYgKCFnc3RfYXVkaW9fcmluZ19idWZmZXJfcGFyc2VfY2FwcyAoJnNwZWMsIGNhcHMpKQorICAgIGdvdG8gb3V0OworCisgIGlmICghZ3N0X3B1bHNlX2ZpbGxfZm9ybWF0X2luZm8gKCZzcGVjLCAmZm9ybWF0LCAmY2hhbm5lbHMpKQorICAgIGdvdG8gb3V0OworCisgIC8qIE1ha2Ugc3VyZSBpbnB1dCBpcyBmcmFtZWQgKG9uZSBmcmFtZSBwZXIgYnVmZmVyKSBhbmQgY2FuIGJlIHBheWxvYWRlZCAqLworICBpZiAoIXBhX2Zvcm1hdF9pbmZvX2lzX3BjbSAoZm9ybWF0KSkgeworICAgIGdib29sZWFuIGZyYW1lZCA9IEZBTFNFLCBwYXJzZWQgPSBGQUxTRTsKKyAgICBzdCA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfYm9vbGVhbiAoc3QsICJmcmFtZWQiLCAmZnJhbWVkKTsKKyAgICBnc3Rfc3RydWN0dXJlX2dldF9ib29sZWFuIChzdCwgInBhcnNlZCIsICZwYXJzZWQpOworICAgIGlmICgoIWZyYW1lZCAmJiAhcGFyc2VkKSB8fCBnc3RfYXVkaW9faWVjNjE5MzdfZnJhbWVfc2l6ZSAoJnNwZWMpIDw9IDApCisgICAgICBnb3RvIG91dDsKKyAgfQorCisgIC8qIGluaXRpYWxpemUgdGhlIGNoYW5uZWwgbWFwICovCisgIGlmIChwYV9mb3JtYXRfaW5mb19pc19wY20gKGZvcm1hdCkgJiYKKyAgICAgIGdzdF9wdWxzZV9nc3RfdG9fY2hhbm5lbF9tYXAgKCZjaGFubmVsX21hcCwgJnNwZWMpKQorICAgIHBhX2Zvcm1hdF9pbmZvX3NldF9jaGFubmVsX21hcCAoZm9ybWF0LCAmY2hhbm5lbF9tYXApOworCisgIGlmIChwYnVmLT5zdHJlYW0gfHwgcGJ1Zi0+cHJvYmVfc3RyZWFtKSB7CisgICAgLyogV2UncmUgYWxyZWFkeSBpbiBQQVVTRUQgb3IgYWJvdmUsIHNvIGp1c3QgcmV1c2UgdGhpcyBzdHJlYW0gdG8gcXVlcnkKKyAgICAgKiBzaW5rIGZvcm1hdHMgYW5kIHVzZSB0aG9zZS4gKi8KKyAgICBHTGlzdCAqaTsKKyAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSA9IHBhX3N0cmVhbV9nZXRfZGV2aWNlX25hbWUgKHBidWYtPnN0cmVhbSA/CisgICAgICAgIHBidWYtPnN0cmVhbSA6IHBidWYtPnByb2JlX3N0cmVhbSk7CisKKyAgICBpZiAoIShvID0gcGFfY29udGV4dF9nZXRfc2lua19pbmZvX2J5X25hbWUgKHBidWYtPmNvbnRleHQsIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgIGdzdF9wdWxzZXNpbmtfc2lua19pbmZvX2NiLCAmZGV2aWNlX2luZm8pKSkKKyAgICAgIGdvdG8gaW5mb19mYWlsZWQ7CisKKyAgICB3aGlsZSAocGFfb3BlcmF0aW9uX2dldF9zdGF0ZSAobykgPT0gUEFfT1BFUkFUSU9OX1JVTk5JTkcpIHsKKyAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQgKG1haW5sb29wKTsKKyAgICAgIGlmIChnc3RfcHVsc2VyaW5nX2lzX2RlYWQgKHBzaW5rLCBwYnVmLCBGQUxTRSkpCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGZvciAoaSA9IGdfbGlzdF9maXJzdCAoZGV2aWNlX2luZm8uZm9ybWF0cyk7IGk7IGkgPSBnX2xpc3RfbmV4dCAoaSkpIHsKKyAgICAgIGlmIChwYV9mb3JtYXRfaW5mb19pc19jb21wYXRpYmxlICgocGFfZm9ybWF0X2luZm8gKikgaS0+ZGF0YSwgZm9ybWF0KSkgeworICAgICAgICByZXQgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogV2UncmUgaW4gUkVBRFksIGxldCdzIGNvbm5lY3QgYSBzdHJlYW0gdG8gc2VlIGlmIHRoZSBmb3JtYXQgaXMKKyAgICAgKiBhY2NlcHRlZCBieSB3aGF0ZXZlciBzaW5rIHdlJ3JlIHJvdXRlZCB0byAqLworICAgIHBidWYtPnByb2JlX3N0cmVhbSA9IGdzdF9wdWxzZXNpbmtfY3JlYXRlX3Byb2JlX3N0cmVhbSAocHNpbmssIHBidWYsCisgICAgICAgIGZvcm1hdCk7CisgICAgaWYgKHBidWYtPnByb2JlX3N0cmVhbSkKKyAgICAgIHJldCA9IFRSVUU7CisgIH0KKworb3V0OgorICBpZiAoZm9ybWF0KQorICAgIHBhX2Zvcm1hdF9pbmZvX2ZyZWUgKGZvcm1hdCk7CisKKyAgZnJlZV9kZXZpY2VfaW5mbyAoJmRldmljZV9pbmZvKTsKKworICBpZiAobykKKyAgICBwYV9vcGVyYXRpb25fdW5yZWYgKG8pOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAobWFpbmxvb3ApOworICBHU1RfT0JKRUNUX1VOTE9DSyAocGJ1Zik7CisKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNwZWMuY2FwcywgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBidWYpOworCitkb25lOgorCisgIHJldHVybiByZXQ7CisKK2luZm9fZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBzaW5rLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoInBhX2NvbnRleHRfZ2V0X3NpbmtfaW5wdXRfaW5mbygpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHBidWYtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byBvdXQ7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNpbmtfaW5pdCAoR3N0UHVsc2VTaW5rICogcHVsc2VzaW5rKQoreworICBwdWxzZXNpbmstPnNlcnZlciA9IE5VTEw7CisgIHB1bHNlc2luay0+ZGV2aWNlID0gTlVMTDsKKyAgcHVsc2VzaW5rLT5kZXZpY2VfaW5mby5kZXNjcmlwdGlvbiA9IE5VTEw7CisgIHB1bHNlc2luay0+Y2xpZW50X25hbWUgPSBnc3RfcHVsc2VfY2xpZW50X25hbWUgKCk7CisKKyAgcHVsc2VzaW5rLT5kZXZpY2VfaW5mby5mb3JtYXRzID0gTlVMTDsKKworICBwdWxzZXNpbmstPnZvbHVtZSA9IERFRkFVTFRfVk9MVU1FOworICBwdWxzZXNpbmstPnZvbHVtZV9zZXQgPSBGQUxTRTsKKworICBwdWxzZXNpbmstPm11dGUgPSBERUZBVUxUX01VVEU7CisgIHB1bHNlc2luay0+bXV0ZV9zZXQgPSBGQUxTRTsKKworICBwdWxzZXNpbmstPm5vdGlmeSA9IDA7CisKKyAgZ19hdG9taWNfaW50X3NldCAoJnB1bHNlc2luay0+Zm9ybWF0X2xvc3QsIEZBTFNFKTsKKyAgcHVsc2VzaW5rLT5mb3JtYXRfbG9zdF90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBwdWxzZXNpbmstPnByb3BlcnRpZXMgPSBOVUxMOworICBwdWxzZXNpbmstPnByb3BsaXN0ID0gTlVMTDsKKworICAvKiBvdmVycmlkZSB3aXRoIGEgY3VzdG9tIGNsb2NrICovCisgIGlmIChHU1RfQVVESU9fQkFTRV9TSU5LIChwdWxzZXNpbmspLT5wcm92aWRlZF9jbG9jaykKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChHU1RfQVVESU9fQkFTRV9TSU5LIChwdWxzZXNpbmspLT5wcm92aWRlZF9jbG9jayk7CisKKyAgR1NUX0FVRElPX0JBU0VfU0lOSyAocHVsc2VzaW5rKS0+cHJvdmlkZWRfY2xvY2sgPQorICAgICAgZ3N0X2F1ZGlvX2Nsb2NrX25ldyAoIkdzdFB1bHNlU2lua0Nsb2NrIiwKKyAgICAgIChHc3RBdWRpb0Nsb2NrR2V0VGltZUZ1bmMpIGdzdF9wdWxzZXNpbmtfZ2V0X3RpbWUsIHB1bHNlc2luaywgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzaW5rX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RQdWxzZVNpbmsgKnB1bHNlc2luayA9IEdTVF9QVUxTRVNJTktfQ0FTVCAob2JqZWN0KTsKKworICBnX2ZyZWUgKHB1bHNlc2luay0+c2VydmVyKTsKKyAgZ19mcmVlIChwdWxzZXNpbmstPmRldmljZSk7CisgIGdfZnJlZSAocHVsc2VzaW5rLT5jbGllbnRfbmFtZSk7CisgIGdfZnJlZSAocHVsc2VzaW5rLT5jdXJyZW50X3NpbmtfbmFtZSk7CisKKyAgZnJlZV9kZXZpY2VfaW5mbyAoJnB1bHNlc2luay0+ZGV2aWNlX2luZm8pOworCisgIGlmIChwdWxzZXNpbmstPnByb3BlcnRpZXMpCisgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChwdWxzZXNpbmstPnByb3BlcnRpZXMpOworICBpZiAocHVsc2VzaW5rLT5wcm9wbGlzdCkKKyAgICBwYV9wcm9wbGlzdF9mcmVlIChwdWxzZXNpbmstPnByb3BsaXN0KTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzaW5rX3NldF92b2x1bWUgKEdzdFB1bHNlU2luayAqIHBzaW5rLCBnZG91YmxlIHZvbHVtZSkKK3sKKyAgcGFfY3ZvbHVtZSB2OworICBwYV9vcGVyYXRpb24gKm8gPSBOVUxMOworICBHc3RQdWxzZVJpbmdCdWZmZXIgKnBidWY7CisgIHVpbnQzMl90IGlkeDsKKworICBpZiAoIW1haW5sb29wKQorICAgIGdvdG8gbm9fbWFpbmxvb3A7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAic2V0dGluZyB2b2x1bWUgdG8gJWYiLCB2b2x1bWUpOworCisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUIChHU1RfQVVESU9fQkFTRV9TSU5LIChwc2luayktPnJpbmdidWZmZXIpOworICBpZiAocGJ1ZiA9PSBOVUxMIHx8IHBidWYtPnN0cmVhbSA9PSBOVUxMKQorICAgIGdvdG8gbm9fYnVmZmVyOworCisgIGlmICgoaWR4ID0gcGFfc3RyZWFtX2dldF9pbmRleCAocGJ1Zi0+c3RyZWFtKSkgPT0gUEFfSU5WQUxJRF9JTkRFWCkKKyAgICBnb3RvIG5vX2luZGV4OworCisgIGlmIChwYnVmLT5pc19wY20pCisgICAgZ3N0X3B1bHNlX2N2b2x1bWVfZnJvbV9saW5lYXIgKCZ2LCBwYnVmLT5jaGFubmVscywgdm9sdW1lKTsKKyAgZWxzZQorICAgIC8qIEZJWE1FOiB0aGlzIHdpbGwgZXZlbnR1YWxseSBiZSBzdXBlcmNlZGVkIGJ5IGNoZWNrcyB0byBzZWUgaWYgdGhlIHZvbHVtZQorICAgICAqIGlzIHJlYWRhYmxlL3dyaXRhYmxlICovCisgICAgZ290byB1bmxvY2s7CisKKyAgaWYgKCEobyA9IHBhX2NvbnRleHRfc2V0X3NpbmtfaW5wdXRfdm9sdW1lIChwYnVmLT5jb250ZXh0LCBpZHgsCisgICAgICAgICAgICAgICZ2LCBOVUxMLCBOVUxMKSkpCisgICAgZ290byB2b2x1bWVfZmFpbGVkOworCisgIC8qIFdlIGRvbid0IHJlYWxseSBjYXJlIGFib3V0IHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsICovCit1bmxvY2s6CisKKyAgaWYgKG8pCisgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKworICByZXR1cm47CisKKyAgLyogRVJST1JTICovCitub19tYWlubG9vcDoKKyAgeworICAgIHBzaW5rLT52b2x1bWUgPSB2b2x1bWU7CisgICAgcHNpbmstPnZvbHVtZV9zZXQgPSBUUlVFOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJ3ZSBoYXZlIG5vIG1haW5sb29wIik7CisgICAgcmV0dXJuOworICB9Citub19idWZmZXI6CisgIHsKKyAgICBwc2luay0+dm9sdW1lID0gdm9sdW1lOworICAgIHBzaW5rLT52b2x1bWVfc2V0ID0gVFJVRTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAid2UgaGF2ZSBubyByaW5nYnVmZmVyIik7CisgICAgZ290byB1bmxvY2s7CisgIH0KK25vX2luZGV4OgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJ3ZSBkb24ndCBoYXZlIGEgc3RyZWFtIGluZGV4Iik7CisgICAgZ290byB1bmxvY2s7CisgIH0KK3ZvbHVtZV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHNpbmssIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgicGFfc3RyZWFtX3NldF9zaW5rX2lucHV0X3ZvbHVtZSgpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHBidWYtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2s7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNpbmtfc2V0X211dGUgKEdzdFB1bHNlU2luayAqIHBzaW5rLCBnYm9vbGVhbiBtdXRlKQoreworICBwYV9vcGVyYXRpb24gKm8gPSBOVUxMOworICBHc3RQdWxzZVJpbmdCdWZmZXIgKnBidWY7CisgIHVpbnQzMl90IGlkeDsKKworICBpZiAoIW1haW5sb29wKQorICAgIGdvdG8gbm9fbWFpbmxvb3A7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAic2V0dGluZyBtdXRlIHN0YXRlIHRvICVkIiwgbXV0ZSk7CisKKyAgcGJ1ZiA9IEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1QgKEdTVF9BVURJT19CQVNFX1NJTksgKHBzaW5rKS0+cmluZ2J1ZmZlcik7CisgIGlmIChwYnVmID09IE5VTEwgfHwgcGJ1Zi0+c3RyZWFtID09IE5VTEwpCisgICAgZ290byBub19idWZmZXI7CisKKyAgaWYgKChpZHggPSBwYV9zdHJlYW1fZ2V0X2luZGV4IChwYnVmLT5zdHJlYW0pKSA9PSBQQV9JTlZBTElEX0lOREVYKQorICAgIGdvdG8gbm9faW5kZXg7CisKKyAgaWYgKCEobyA9IHBhX2NvbnRleHRfc2V0X3NpbmtfaW5wdXRfbXV0ZSAocGJ1Zi0+Y29udGV4dCwgaWR4LAorICAgICAgICAgICAgICBtdXRlLCBOVUxMLCBOVUxMKSkpCisgICAgZ290byBtdXRlX2ZhaWxlZDsKKworICAvKiBXZSBkb24ndCByZWFsbHkgY2FyZSBhYm91dCB0aGUgcmVzdWx0IG9mIHRoaXMgY2FsbCAqLwordW5sb2NrOgorCisgIGlmIChvKQorICAgIHBhX29wZXJhdGlvbl91bnJlZiAobyk7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChtYWlubG9vcCk7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworbm9fbWFpbmxvb3A6CisgIHsKKyAgICBwc2luay0+bXV0ZSA9IG11dGU7CisgICAgcHNpbmstPm11dGVfc2V0ID0gVFJVRTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAid2UgaGF2ZSBubyBtYWlubG9vcCIpOworICAgIHJldHVybjsKKyAgfQorbm9fYnVmZmVyOgorICB7CisgICAgcHNpbmstPm11dGUgPSBtdXRlOworICAgIHBzaW5rLT5tdXRlX3NldCA9IFRSVUU7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgIndlIGhhdmUgbm8gcmluZ2J1ZmZlciIpOworICAgIGdvdG8gdW5sb2NrOworICB9Citub19pbmRleDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAid2UgZG9uJ3QgaGF2ZSBhIHN0cmVhbSBpbmRleCIpOworICAgIGdvdG8gdW5sb2NrOworICB9CittdXRlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwc2luaywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9zdHJlYW1fc2V0X3NpbmtfaW5wdXRfbXV0ZSgpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHBidWYtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2s7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNpbmtfc2lua19pbnB1dF9pbmZvX2NiIChwYV9jb250ZXh0ICogYywgY29uc3QgcGFfc2lua19pbnB1dF9pbmZvICogaSwKKyAgICBpbnQgZW9sLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworICBHc3RQdWxzZVNpbmsgKnBzaW5rOworCisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUICh1c2VyZGF0YSk7CisgIHBzaW5rID0gR1NUX1BVTFNFU0lOS19DQVNUIChHU1RfT0JKRUNUX1BBUkVOVCAocGJ1ZikpOworCisgIGlmICghaSkKKyAgICBnb3RvIGRvbmU7CisKKyAgaWYgKCFwYnVmLT5zdHJlYW0pCisgICAgZ290byBkb25lOworCisgIC8qIElmIHRoZSBpbmRleCBkb2Vzbid0IG1hdGNoIG91ciBjdXJyZW50IHN0cmVhbSwKKyAgICogaXQgaW1wbGllcyB3ZSBqdXN0IHJlY3JlYXRlZCB0aGUgc3RyZWFtIChjYXBzIGNoYW5nZSkKKyAgICovCisgIGlmIChpLT5pbmRleCA9PSBwYV9zdHJlYW1fZ2V0X2luZGV4IChwYnVmLT5zdHJlYW0pKSB7CisgICAgcHNpbmstPnZvbHVtZSA9IHBhX3N3X3ZvbHVtZV90b19saW5lYXIgKHBhX2N2b2x1bWVfbWF4ICgmaS0+dm9sdW1lKSk7CisgICAgcHNpbmstPm11dGUgPSBpLT5tdXRlOworICAgIHBzaW5rLT5jdXJyZW50X3NpbmtfaWR4ID0gaS0+c2luazsKKworICAgIGlmIChwc2luay0+dm9sdW1lID4gTUFYX1ZPTFVNRSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwc2luaywgIkNsaXBwZWQgdm9sdW1lIGZyb20gJWYgdG8gJWYiLCBwc2luay0+dm9sdW1lLAorICAgICAgICAgIE1BWF9WT0xVTUUpOworICAgICAgcHNpbmstPnZvbHVtZSA9IE1BWF9WT0xVTUU7CisgICAgfQorICB9CisKK2RvbmU6CisgIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCAobWFpbmxvb3AsIDApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc2lua19nZXRfc2lua19pbnB1dF9pbmZvIChHc3RQdWxzZVNpbmsgKiBwc2luaywgZ2RvdWJsZSAqIHZvbHVtZSwKKyAgICBnYm9vbGVhbiAqIG11dGUpCit7CisgIEdzdFB1bHNlUmluZ0J1ZmZlciAqcGJ1ZjsKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKyAgdWludDMyX3QgaWR4OworCisgIGlmICghbWFpbmxvb3ApCisgICAgZ290byBub19tYWlubG9vcDsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChtYWlubG9vcCk7CisKKyAgcGJ1ZiA9IEdTVF9QVUxTRVJJTkdfQlVGRkVSX0NBU1QgKEdTVF9BVURJT19CQVNFX1NJTksgKHBzaW5rKS0+cmluZ2J1ZmZlcik7CisgIGlmIChwYnVmID09IE5VTEwgfHwgcGJ1Zi0+c3RyZWFtID09IE5VTEwpCisgICAgZ290byBub19idWZmZXI7CisKKyAgaWYgKChpZHggPSBwYV9zdHJlYW1fZ2V0X2luZGV4IChwYnVmLT5zdHJlYW0pKSA9PSBQQV9JTlZBTElEX0lOREVYKQorICAgIGdvdG8gbm9faW5kZXg7CisKKyAgaWYgKCEobyA9IHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5wdXRfaW5mbyAocGJ1Zi0+Y29udGV4dCwgaWR4LAorICAgICAgICAgICAgICBnc3RfcHVsc2VzaW5rX3NpbmtfaW5wdXRfaW5mb19jYiwgcGJ1ZikpKQorICAgIGdvdG8gaW5mb19mYWlsZWQ7CisKKyAgd2hpbGUgKHBhX29wZXJhdGlvbl9nZXRfc3RhdGUgKG8pID09IFBBX09QRVJBVElPTl9SVU5OSU5HKSB7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAobWFpbmxvb3ApOworICAgIGlmIChnc3RfcHVsc2VyaW5nX2lzX2RlYWQgKHBzaW5rLCBwYnVmLCBUUlVFKSkKKyAgICAgIGdvdG8gdW5sb2NrOworICB9CisKK3VubG9jazoKKyAgaWYgKHZvbHVtZSkKKyAgICAqdm9sdW1lID0gcHNpbmstPnZvbHVtZTsKKyAgaWYgKG11dGUpCisgICAgKm11dGUgPSBwc2luay0+bXV0ZTsKKworICBpZiAobykKKyAgICBwYV9vcGVyYXRpb25fdW5yZWYgKG8pOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAobWFpbmxvb3ApOworCisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK25vX21haW5sb29wOgorICB7CisgICAgaWYgKHZvbHVtZSkKKyAgICAgICp2b2x1bWUgPSBwc2luay0+dm9sdW1lOworICAgIGlmIChtdXRlKQorICAgICAgKm11dGUgPSBwc2luay0+bXV0ZTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAid2UgaGF2ZSBubyBtYWlubG9vcCIpOworICAgIHJldHVybjsKKyAgfQorbm9fYnVmZmVyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJ3ZSBoYXZlIG5vIHJpbmdidWZmZXIiKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorbm9faW5kZXg6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgIndlIGRvbid0IGhhdmUgYSBzdHJlYW0gaW5kZXgiKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQoraW5mb19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHNpbmssIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgicGFfY29udGV4dF9nZXRfc2lua19pbnB1dF9pbmZvKCkgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAocGJ1Zi0+Y29udGV4dCkpKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc2lua19jdXJyZW50X3NpbmtfaW5mb19jYiAocGFfY29udGV4dCAqIGMsIGNvbnN0IHBhX3NpbmtfaW5mbyAqIGksCisgICAgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU2luayAqcHNpbms7CisKKyAgcHNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKHVzZXJkYXRhKTsKKworICBpZiAoIWkpCisgICAgZ290byBkb25lOworCisgIC8qIElmIHRoZSBpbmRleCBkb2Vzbid0IG1hdGNoIG91ciBjdXJyZW50IHN0cmVhbSwKKyAgICogaXQgaW1wbGllcyB3ZSBqdXN0IHJlY3JlYXRlZCB0aGUgc3RyZWFtIChjYXBzIGNoYW5nZSkKKyAgICovCisgIGlmIChpLT5pbmRleCA9PSBwc2luay0+Y3VycmVudF9zaW5rX2lkeCkgeworICAgIGdfZnJlZSAocHNpbmstPmN1cnJlbnRfc2lua19uYW1lKTsKKyAgICBwc2luay0+Y3VycmVudF9zaW5rX25hbWUgPSBnX3N0cmR1cCAoaS0+bmFtZSk7CisgIH0KKworZG9uZToKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChtYWlubG9vcCwgMCk7Cit9CisKK3N0YXRpYyBnY2hhciAqCitnc3RfcHVsc2VzaW5rX2dldF9jdXJyZW50X2RldmljZSAoR3N0UHVsc2VTaW5rICogcHVsc2VzaW5rKQoreworICBwYV9vcGVyYXRpb24gKm8gPSBOVUxMOworICBHc3RQdWxzZVJpbmdCdWZmZXIgKnBidWY7CisgIGdjaGFyICpjdXJyZW50X3Npbms7CisKKyAgaWYgKCFtYWlubG9vcCkKKyAgICBnb3RvIG5vX21haW5sb29wOworCisgIHBidWYgPQorICAgICAgR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAoR1NUX0FVRElPX0JBU0VfU0lOSyAocHVsc2VzaW5rKS0+cmluZ2J1ZmZlcik7CisgIGlmIChwYnVmID09IE5VTEwgfHwgcGJ1Zi0+c3RyZWFtID09IE5VTEwpCisgICAgZ290byBub19idWZmZXI7CisKKyAgZ3N0X3B1bHNlc2lua19nZXRfc2lua19pbnB1dF9pbmZvIChwdWxzZXNpbmssIE5VTEwsIE5VTEwpOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKG1haW5sb29wKTsKKworICBpZiAoIShvID0gcGFfY29udGV4dF9nZXRfc2lua19pbmZvX2J5X2luZGV4IChwYnVmLT5jb250ZXh0LAorICAgICAgICAgICAgICBwdWxzZXNpbmstPmN1cnJlbnRfc2lua19pZHgsIGdzdF9wdWxzZXNpbmtfY3VycmVudF9zaW5rX2luZm9fY2IsCisgICAgICAgICAgICAgIHB1bHNlc2luaykpKQorICAgIGdvdG8gaW5mb19mYWlsZWQ7CisKKyAgd2hpbGUgKHBhX29wZXJhdGlvbl9nZXRfc3RhdGUgKG8pID09IFBBX09QRVJBVElPTl9SVU5OSU5HKSB7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAobWFpbmxvb3ApOworICAgIGlmIChnc3RfcHVsc2VyaW5nX2lzX2RlYWQgKHB1bHNlc2luaywgcGJ1ZiwgVFJVRSkpCisgICAgICBnb3RvIHVubG9jazsKKyAgfQorCit1bmxvY2s6CisKKyAgY3VycmVudF9zaW5rID0gZ19zdHJkdXAgKHB1bHNlc2luay0+Y3VycmVudF9zaW5rX25hbWUpOworCisgIGlmIChvKQorICAgIHBhX29wZXJhdGlvbl91bnJlZiAobyk7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChtYWlubG9vcCk7CisKKyAgcmV0dXJuIGN1cnJlbnRfc2luazsKKworICAvKiBFUlJPUlMgKi8KK25vX21haW5sb29wOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHVsc2VzaW5rLCAid2UgaGF2ZSBubyBtYWlubG9vcCIpOworICAgIHJldHVybiBOVUxMOworICB9Citub19idWZmZXI6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNpbmssICJ3ZSBoYXZlIG5vIHJpbmdidWZmZXIiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQoraW5mb19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHVsc2VzaW5rLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoInBhX2NvbnRleHRfZ2V0X3NpbmtfaW5wdXRfaW5mbygpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHBidWYtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2s7CisgIH0KK30KKworc3RhdGljIGdjaGFyICoKK2dzdF9wdWxzZXNpbmtfZGV2aWNlX2Rlc2NyaXB0aW9uIChHc3RQdWxzZVNpbmsgKiBwc2luaykKK3sKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworICBwYV9vcGVyYXRpb24gKm8gPSBOVUxMOworICBnY2hhciAqdDsKKworICBpZiAoIW1haW5sb29wKQorICAgIGdvdG8gbm9fbWFpbmxvb3A7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAoR1NUX0FVRElPX0JBU0VfU0lOSyAocHNpbmspLT5yaW5nYnVmZmVyKTsKKyAgaWYgKHBidWYgPT0gTlVMTCkKKyAgICBnb3RvIG5vX2J1ZmZlcjsKKworICBmcmVlX2RldmljZV9pbmZvICgmcHNpbmstPmRldmljZV9pbmZvKTsKKyAgaWYgKCEobyA9IHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5mb19ieV9uYW1lIChwYnVmLT5jb250ZXh0LAorICAgICAgICAgICAgICBwc2luay0+ZGV2aWNlLCBnc3RfcHVsc2VzaW5rX3NpbmtfaW5mb19jYiwgJnBzaW5rLT5kZXZpY2VfaW5mbykpKQorICAgIGdvdG8gaW5mb19mYWlsZWQ7CisKKyAgd2hpbGUgKHBhX29wZXJhdGlvbl9nZXRfc3RhdGUgKG8pID09IFBBX09QRVJBVElPTl9SVU5OSU5HKSB7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAobWFpbmxvb3ApOworICAgIGlmIChnc3RfcHVsc2VyaW5nX2lzX2RlYWQgKHBzaW5rLCBwYnVmLCBGQUxTRSkpCisgICAgICBnb3RvIHVubG9jazsKKyAgfQorCit1bmxvY2s6CisgIGlmIChvKQorICAgIHBhX29wZXJhdGlvbl91bnJlZiAobyk7CisKKyAgdCA9IGdfc3RyZHVwIChwc2luay0+ZGV2aWNlX2luZm8uZGVzY3JpcHRpb24pOworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKworICByZXR1cm4gdDsKKworICAvKiBFUlJPUlMgKi8KK25vX21haW5sb29wOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJ3ZSBoYXZlIG5vIG1haW5sb29wIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK25vX2J1ZmZlcjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAid2UgaGF2ZSBubyByaW5nYnVmZmVyIik7CisgICAgZ290byB1bmxvY2s7CisgIH0KK2luZm9fZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBzaW5rLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoInBhX2NvbnRleHRfZ2V0X3NpbmtfaW5mb19ieV9pbmRleCgpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHBidWYtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2s7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNpbmtfc2V0X3N0cmVhbV9kZXZpY2UgKEdzdFB1bHNlU2luayAqIHBzaW5rLCBjb25zdCBnY2hhciAqIGRldmljZSkKK3sKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworICB1aW50MzJfdCBpZHg7CisKKyAgaWYgKCFtYWlubG9vcCkKKyAgICBnb3RvIG5vX21haW5sb29wOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKG1haW5sb29wKTsKKworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAoR1NUX0FVRElPX0JBU0VfU0lOSyAocHNpbmspLT5yaW5nYnVmZmVyKTsKKyAgaWYgKHBidWYgPT0gTlVMTCB8fCBwYnVmLT5zdHJlYW0gPT0gTlVMTCkKKyAgICBnb3RvIG5vX2J1ZmZlcjsKKworICBpZiAoKGlkeCA9IHBhX3N0cmVhbV9nZXRfaW5kZXggKHBidWYtPnN0cmVhbSkpID09IFBBX0lOVkFMSURfSU5ERVgpCisgICAgZ290byBub19pbmRleDsKKworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAic2V0dGluZyBzdHJlYW0gZGV2aWNlIHRvICVzIiwgZGV2aWNlKTsKKworICBpZiAoIShvID0gcGFfY29udGV4dF9tb3ZlX3NpbmtfaW5wdXRfYnlfbmFtZSAocGJ1Zi0+Y29udGV4dCwgaWR4LCBkZXZpY2UsCisgICAgICAgICAgICAgIE5VTEwsIE5VTEwpKSkKKyAgICBnb3RvIG1vdmVfZmFpbGVkOworCit1bmxvY2s6CisKKyAgaWYgKG8pCisgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKworICByZXR1cm47CisKKyAgLyogRVJST1JTICovCitub19tYWlubG9vcDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzaW5rLCAid2UgaGF2ZSBubyBtYWlubG9vcCIpOworICAgIHJldHVybjsKKyAgfQorbm9fYnVmZmVyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJ3ZSBoYXZlIG5vIHJpbmdidWZmZXIiKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorbm9faW5kZXg6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgIndlIGRvbid0IGhhdmUgYSBzdHJlYW0gaW5kZXgiKTsKKyAgICByZXR1cm47CisgIH0KK21vdmVfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBzaW5rLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoInBhX2NvbnRleHRfbW92ZV9zaW5rX2lucHV0X2J5X25hbWUoJXMpIGZhaWxlZDogJXMiLCBkZXZpY2UsCisgICAgICAgICAgICBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAocGJ1Zi0+Y29udGV4dCkpKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RQdWxzZVNpbmsgKnB1bHNlc2luayA9IEdTVF9QVUxTRVNJTktfQ0FTVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU0VSVkVSOgorICAgICAgZ19mcmVlIChwdWxzZXNpbmstPnNlcnZlcik7CisgICAgICBwdWxzZXNpbmstPnNlcnZlciA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RFVklDRToKKyAgICAgIGdfZnJlZSAocHVsc2VzaW5rLT5kZXZpY2UpOworICAgICAgcHVsc2VzaW5rLT5kZXZpY2UgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGdzdF9wdWxzZXNpbmtfc2V0X3N0cmVhbV9kZXZpY2UgKHB1bHNlc2luaywgcHVsc2VzaW5rLT5kZXZpY2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1ZPTFVNRToKKyAgICAgIGdzdF9wdWxzZXNpbmtfc2V0X3ZvbHVtZSAocHVsc2VzaW5rLCBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTVVURToKKyAgICAgIGdzdF9wdWxzZXNpbmtfc2V0X211dGUgKHB1bHNlc2luaywgZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTElFTlRfTkFNRToKKyAgICAgIGdfZnJlZSAocHVsc2VzaW5rLT5jbGllbnRfbmFtZSk7CisgICAgICBpZiAoIWdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocHVsc2VzaW5rLAorICAgICAgICAgICAgIkVtcHR5IFB1bHNlQXVkaW8gY2xpZW50IG5hbWUgbm90IGFsbG93ZWQuIFJlc2V0dGluZyB0byBkZWZhdWx0IHZhbHVlIik7CisgICAgICAgIHB1bHNlc2luay0+Y2xpZW50X25hbWUgPSBnc3RfcHVsc2VfY2xpZW50X25hbWUgKCk7CisgICAgICB9IGVsc2UKKyAgICAgICAgcHVsc2VzaW5rLT5jbGllbnRfbmFtZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUUkVBTV9QUk9QRVJUSUVTOgorICAgICAgaWYgKHB1bHNlc2luay0+cHJvcGVydGllcykKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChwdWxzZXNpbmstPnByb3BlcnRpZXMpOworICAgICAgcHVsc2VzaW5rLT5wcm9wZXJ0aWVzID0KKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX2NvcHkgKGdzdF92YWx1ZV9nZXRfc3RydWN0dXJlICh2YWx1ZSkpOworICAgICAgaWYgKHB1bHNlc2luay0+cHJvcGxpc3QpCisgICAgICAgIHBhX3Byb3BsaXN0X2ZyZWUgKHB1bHNlc2luay0+cHJvcGxpc3QpOworICAgICAgcHVsc2VzaW5rLT5wcm9wbGlzdCA9IGdzdF9wdWxzZV9tYWtlX3Byb3BsaXN0IChwdWxzZXNpbmstPnByb3BlcnRpZXMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKworICBHc3RQdWxzZVNpbmsgKnB1bHNlc2luayA9IEdTVF9QVUxTRVNJTktfQ0FTVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU0VSVkVSOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgcHVsc2VzaW5rLT5zZXJ2ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RFVklDRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHB1bHNlc2luay0+ZGV2aWNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DVVJSRU5UX0RFVklDRToKKyAgICB7CisgICAgICBnY2hhciAqY3VycmVudF9kZXZpY2UgPSBnc3RfcHVsc2VzaW5rX2dldF9jdXJyZW50X2RldmljZSAocHVsc2VzaW5rKTsKKyAgICAgIGlmIChjdXJyZW50X2RldmljZSkKKyAgICAgICAgZ192YWx1ZV90YWtlX3N0cmluZyAodmFsdWUsIGN1cnJlbnRfZGV2aWNlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgIiIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9ERVZJQ0VfTkFNRToKKyAgICAgIGdfdmFsdWVfdGFrZV9zdHJpbmcgKHZhbHVlLCBnc3RfcHVsc2VzaW5rX2RldmljZV9kZXNjcmlwdGlvbiAocHVsc2VzaW5rKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVk9MVU1FOgorICAgIHsKKyAgICAgIGdkb3VibGUgdm9sdW1lOworCisgICAgICBnc3RfcHVsc2VzaW5rX2dldF9zaW5rX2lucHV0X2luZm8gKHB1bHNlc2luaywgJnZvbHVtZSwgTlVMTCk7CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCB2b2x1bWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9NVVRFOgorICAgIHsKKyAgICAgIGdib29sZWFuIG11dGU7CisKKyAgICAgIGdzdF9wdWxzZXNpbmtfZ2V0X3NpbmtfaW5wdXRfaW5mbyAocHVsc2VzaW5rLCBOVUxMLCAmbXV0ZSk7CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgbXV0ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0NMSUVOVF9OQU1FOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgcHVsc2VzaW5rLT5jbGllbnRfbmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1RSRUFNX1BST1BFUlRJRVM6CisgICAgICBnc3RfdmFsdWVfc2V0X3N0cnVjdHVyZSAodmFsdWUsIHB1bHNlc2luay0+cHJvcGVydGllcyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzaW5rX2NoYW5nZV90aXRsZSAoR3N0UHVsc2VTaW5rICogcHNpbmssIGNvbnN0IGdjaGFyICogdCkKK3sKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKG1haW5sb29wKTsKKworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAoR1NUX0FVRElPX0JBU0VfU0lOSyAocHNpbmspLT5yaW5nYnVmZmVyKTsKKworICBpZiAocGJ1ZiA9PSBOVUxMIHx8IHBidWYtPnN0cmVhbSA9PSBOVUxMKQorICAgIGdvdG8gbm9fYnVmZmVyOworCisgIGdfZnJlZSAocGJ1Zi0+c3RyZWFtX25hbWUpOworICBwYnVmLT5zdHJlYW1fbmFtZSA9IGdfc3RyZHVwICh0KTsKKworICBpZiAoIShvID0gcGFfc3RyZWFtX3NldF9uYW1lIChwYnVmLT5zdHJlYW0sIHBidWYtPnN0cmVhbV9uYW1lLCBOVUxMLCBOVUxMKSkpCisgICAgZ290byBuYW1lX2ZhaWxlZDsKKworICAvKiBXZSdyZSBub3QgaW50ZXJlc3RlZCBpZiB0aGlzIG9wZXJhdGlvbiBmYWlsZWQgb3Igbm90ICovCit1bmxvY2s6CisKKyAgaWYgKG8pCisgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChtYWlubG9vcCk7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworbm9fYnVmZmVyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJ3ZSBoYXZlIG5vIHJpbmdidWZmZXIiKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorbmFtZV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHNpbmssIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgicGFfc3RyZWFtX3NldF9uYW1lKCkgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAocGJ1Zi0+Y29udGV4dCkpKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc2lua19jaGFuZ2VfcHJvcHMgKEdzdFB1bHNlU2luayAqIHBzaW5rLCBHc3RUYWdMaXN0ICogbCkKK3sKKyAgc3RhdGljIGNvbnN0IGdjaGFyICpjb25zdCBtYXBbXSA9IHsKKyAgICBHU1RfVEFHX1RJVExFLCBQQV9QUk9QX01FRElBX1RJVExFLAorCisgICAgLyogbWlnaHQgZ2V0IG92ZXJyaWRlbiBpbiB0aGUgbmV4dCBpdGVyYXRpb24gYnkgR1NUX1RBR19BUlRJU1QgKi8KKyAgICBHU1RfVEFHX1BFUkZPUk1FUiwgUEFfUFJPUF9NRURJQV9BUlRJU1QsCisKKyAgICBHU1RfVEFHX0FSVElTVCwgUEFfUFJPUF9NRURJQV9BUlRJU1QsCisgICAgR1NUX1RBR19MQU5HVUFHRV9DT0RFLCBQQV9QUk9QX01FRElBX0xBTkdVQUdFLAorICAgIEdTVF9UQUdfTE9DQVRJT04sIFBBX1BST1BfTUVESUFfRklMRU5BTUUsCisgICAgLyogV2UgbWlnaHQgYWRkIG1vcmUgaGVyZSBsYXRlciBvbiAuLi4gKi8KKyAgICBOVUxMCisgIH07CisgIHBhX3Byb3BsaXN0ICpwbCA9IE5VTEw7CisgIGNvbnN0IGdjaGFyICpjb25zdCAqdDsKKyAgZ2Jvb2xlYW4gZW1wdHkgPSBUUlVFOworICBwYV9vcGVyYXRpb24gKm8gPSBOVUxMOworICBHc3RQdWxzZVJpbmdCdWZmZXIgKnBidWY7CisKKyAgcGwgPSBwYV9wcm9wbGlzdF9uZXcgKCk7CisKKyAgZm9yICh0ID0gbWFwOyAqdDsgdCArPSAyKSB7CisgICAgZ2NoYXIgKm4gPSBOVUxMOworCisgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChsLCAqdCwgJm4pKSB7CisKKyAgICAgIGlmIChuICYmICpuKSB7CisgICAgICAgIHBhX3Byb3BsaXN0X3NldHMgKHBsLCAqKHQgKyAxKSwgbik7CisgICAgICAgIGVtcHR5ID0gRkFMU0U7CisgICAgICB9CisKKyAgICAgIGdfZnJlZSAobik7CisgICAgfQorICB9CisgIGlmIChlbXB0eSkKKyAgICBnb3RvIGZpbmlzaDsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChtYWlubG9vcCk7CisgIHBidWYgPSBHU1RfUFVMU0VSSU5HX0JVRkZFUl9DQVNUIChHU1RfQVVESU9fQkFTRV9TSU5LIChwc2luayktPnJpbmdidWZmZXIpOworICBpZiAocGJ1ZiA9PSBOVUxMIHx8IHBidWYtPnN0cmVhbSA9PSBOVUxMKQorICAgIGdvdG8gbm9fYnVmZmVyOworCisgIC8qIFdlJ3JlIG5vdCBpbnRlcmVzdGVkIGlmIHRoaXMgb3BlcmF0aW9uIGZhaWxlZCBvciBub3QgKi8KKyAgaWYgKCEobyA9IHBhX3N0cmVhbV9wcm9wbGlzdF91cGRhdGUgKHBidWYtPnN0cmVhbSwgUEFfVVBEQVRFX1JFUExBQ0UsCisgICAgICAgICAgICAgIHBsLCBOVUxMLCBOVUxMKSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgInBhX3N0cmVhbV9wcm9wbGlzdF91cGRhdGUoKSBmYWlsZWQiKTsKKyAgfQorCit1bmxvY2s6CisKKyAgaWYgKG8pCisgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKworZmluaXNoOgorCisgIGlmIChwbCkKKyAgICBwYV9wcm9wbGlzdF9mcmVlIChwbCk7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworbm9fYnVmZmVyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNpbmssICJ3ZSBoYXZlIG5vIHJpbmdidWZmZXIiKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc2lua19mbHVzaF9yaW5nYnVmZmVyIChHc3RQdWxzZVNpbmsgKiBwc2luaykKK3sKKyAgR3N0UHVsc2VSaW5nQnVmZmVyICpwYnVmOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKG1haW5sb29wKTsKKworICBwYnVmID0gR1NUX1BVTFNFUklOR19CVUZGRVJfQ0FTVCAoR1NUX0FVRElPX0JBU0VfU0lOSyAocHNpbmspLT5yaW5nYnVmZmVyKTsKKworICBpZiAocGJ1ZiA9PSBOVUxMIHx8IHBidWYtPnN0cmVhbSA9PSBOVUxMKQorICAgIGdvdG8gbm9fYnVmZmVyOworCisgIGdzdF9wdWxzZXJpbmdfZmx1c2ggKHBidWYpOworCisgIC8qIFVuY29yayBpZiB3ZSBoYXZlbid0IGFscmVhZHkgKGhhcHBlbnMgd2hlbiB3YWl0aW5nIHRvIGdldCBlbm91Z2ggZGF0YQorICAgKiB0byBzZW5kIG91dCB0aGUgZmlyc3QgdGltZSkgKi8KKyAgaWYgKHBidWYtPmNvcmtlZCkKKyAgICBnc3RfcHVsc2VyaW5nX3NldF9jb3JrZWQgKHBidWYsIEZBTFNFLCBGQUxTRSk7CisKKyAgLyogV2UncmUgbm90IGludGVyZXN0ZWQgaWYgdGhpcyBvcGVyYXRpb24gZmFpbGVkIG9yIG5vdCAqLwordW5sb2NrOgorICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKworICByZXR1cm47CisKKyAgLyogRVJST1JTICovCitub19idWZmZXI6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgIndlIGhhdmUgbm8gcmluZ2J1ZmZlciIpOworICAgIGdvdG8gdW5sb2NrOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3B1bHNlc2lua19ldmVudCAoR3N0QmFzZVNpbmsgKiBzaW5rLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RQdWxzZVNpbmsgKnB1bHNlc2luayA9IEdTVF9QVUxTRVNJTktfQ0FTVCAoc2luayk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfVEFHOnsKKyAgICAgIGdjaGFyICp0aXRsZSA9IE5VTEwsICphcnRpc3QgPSBOVUxMLCAqbG9jYXRpb24gPSBOVUxMLCAqZGVzY3JpcHRpb24gPQorICAgICAgICAgIE5VTEwsICp0ID0gTlVMTCwgKmJ1ZiA9IE5VTEw7CisgICAgICBHc3RUYWdMaXN0ICpsOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfdGFnIChldmVudCwgJmwpOworCisgICAgICBnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAobCwgR1NUX1RBR19USVRMRSwgJnRpdGxlKTsKKyAgICAgIGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChsLCBHU1RfVEFHX0FSVElTVCwgJmFydGlzdCk7CisgICAgICBnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAobCwgR1NUX1RBR19MT0NBVElPTiwgJmxvY2F0aW9uKTsKKyAgICAgIGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChsLCBHU1RfVEFHX0RFU0NSSVBUSU9OLCAmZGVzY3JpcHRpb24pOworCisgICAgICBpZiAoIWFydGlzdCkKKyAgICAgICAgZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKGwsIEdTVF9UQUdfUEVSRk9STUVSLCAmYXJ0aXN0KTsKKworICAgICAgaWYgKHRpdGxlICYmIGFydGlzdCkKKyAgICAgICAgLyogVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnICovCisgICAgICAgIHQgPSBidWYgPSBnX3N0cmR1cF9wcmludGYgKF8oIiclcycgYnkgJyVzJyIpLCBnX3N0cnN0cmlwICh0aXRsZSksCisgICAgICAgICAgICBnX3N0cnN0cmlwIChhcnRpc3QpKTsKKyAgICAgIGVsc2UgaWYgKHRpdGxlKQorICAgICAgICB0ID0gZ19zdHJzdHJpcCAodGl0bGUpOworICAgICAgZWxzZSBpZiAoZGVzY3JpcHRpb24pCisgICAgICAgIHQgPSBnX3N0cnN0cmlwIChkZXNjcmlwdGlvbik7CisgICAgICBlbHNlIGlmIChsb2NhdGlvbikKKyAgICAgICAgdCA9IGdfc3Ryc3RyaXAgKGxvY2F0aW9uKTsKKworICAgICAgaWYgKHQpCisgICAgICAgIGdzdF9wdWxzZXNpbmtfY2hhbmdlX3RpdGxlIChwdWxzZXNpbmssIHQpOworCisgICAgICBnX2ZyZWUgKHRpdGxlKTsKKyAgICAgIGdfZnJlZSAoYXJ0aXN0KTsKKyAgICAgIGdfZnJlZSAobG9jYXRpb24pOworICAgICAgZ19mcmVlIChkZXNjcmlwdGlvbik7CisgICAgICBnX2ZyZWUgKGJ1Zik7CisKKyAgICAgIGdzdF9wdWxzZXNpbmtfY2hhbmdlX3Byb3BzIChwdWxzZXNpbmssIGwpOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfR0FQOnsKKyAgICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIGR1cmF0aW9uOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfZ2FwIChldmVudCwgJnRpbWVzdGFtcCwgJmR1cmF0aW9uKTsKKyAgICAgIGlmIChkdXJhdGlvbiA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgICAgICBnc3RfcHVsc2VzaW5rX2ZsdXNoX3JpbmdidWZmZXIgKHB1bHNlc2luayk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRU9TOgorICAgICAgZ3N0X3B1bHNlc2lua19mbHVzaF9yaW5nYnVmZmVyIChwdWxzZXNpbmspOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIDsKKyAgfQorCisgIHJldHVybiBHU1RfQkFTRV9TSU5LX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5ldmVudCAoc2luaywgZXZlbnQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wdWxzZXNpbmtfcXVlcnkgKEdzdEJhc2VTaW5rICogc2luaywgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0UHVsc2VTaW5rICpwdWxzZXNpbmsgPSBHU1RfUFVMU0VTSU5LX0NBU1QgKHNpbmspOworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmNhcHMsICpmaWx0ZXI7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9jYXBzIChxdWVyeSwgJmZpbHRlcik7CisgICAgICBjYXBzID0gZ3N0X3B1bHNlc2lua19xdWVyeV9nZXRjYXBzIChwdWxzZXNpbmssIGZpbHRlcik7CisKKyAgICAgIGlmIChjYXBzKSB7CisgICAgICAgIGdzdF9xdWVyeV9zZXRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCBjYXBzKTsKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgICByZXQgPSBUUlVFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX0FDQ0VQVF9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9hY2NlcHRfY2FwcyAocXVlcnksICZjYXBzKTsKKyAgICAgIHJldCA9IGdzdF9wdWxzZXNpbmtfcXVlcnlfYWNjZXB0Y2FwcyAocHVsc2VzaW5rLCBjYXBzKTsKKyAgICAgIGdzdF9xdWVyeV9zZXRfYWNjZXB0X2NhcHNfcmVzdWx0IChxdWVyeSwgcmV0KTsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IEdTVF9CQVNFX1NJTktfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnF1ZXJ5IChzaW5rLCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc2lua19yZWxlYXNlX21haW5sb29wIChHc3RQdWxzZVNpbmsgKiBwc2luaykKK3sKKyAgaWYgKCFtYWlubG9vcCkKKyAgICByZXR1cm47CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAobWFpbmxvb3ApOworICB3aGlsZSAocHNpbmstPmRlZmVyX3BlbmRpbmcpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwc2luaywgIndhaXRpbmcgZm9yIHN0cmVhbSBzdGF0dXMgbWVzc2FnZSBlbWlzc2lvbiIpOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQgKG1haW5sb29wKTsKKyAgfQorICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKG1haW5sb29wKTsKKworICBnX211dGV4X2xvY2sgKCZwYV9zaGFyZWRfcmVzb3VyY2VfbXV0ZXgpOworICBtYWlubG9vcF9yZWZfY3QtLTsKKyAgaWYgKCFtYWlubG9vcF9yZWZfY3QpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHBzaW5rLCAidGVybWluYXRpbmcgcGEgbWFpbiBsb29wIHRocmVhZCIpOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3N0b3AgKG1haW5sb29wKTsKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9mcmVlIChtYWlubG9vcCk7CisgICAgbWFpbmxvb3AgPSBOVUxMOworICB9CisgIGdfbXV0ZXhfdW5sb2NrICgmcGFfc2hhcmVkX3Jlc291cmNlX211dGV4KTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcHVsc2VzaW5rX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFB1bHNlU2luayAqcHVsc2VzaW5rID0gR1NUX1BVTFNFU0lOSyAoZWxlbWVudCk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnBhX3NoYXJlZF9yZXNvdXJjZV9tdXRleCk7CisgICAgICBpZiAoIW1haW5sb29wX3JlZl9jdCkgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKGVsZW1lbnQsICJuZXcgcGEgbWFpbiBsb29wIHRocmVhZCIpOworICAgICAgICBpZiAoIShtYWlubG9vcCA9IHBhX3RocmVhZGVkX21haW5sb29wX25ldyAoKSkpCisgICAgICAgICAgZ290byBtYWlubG9vcF9mYWlsZWQ7CisgICAgICAgIGlmIChwYV90aHJlYWRlZF9tYWlubG9vcF9zdGFydCAobWFpbmxvb3ApIDwgMCkgeworICAgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX2ZyZWUgKG1haW5sb29wKTsKKyAgICAgICAgICBnb3RvIG1haW5sb29wX3N0YXJ0X2ZhaWxlZDsKKyAgICAgICAgfQorICAgICAgICBtYWlubG9vcF9yZWZfY3QgPSAxOworICAgICAgICBnX211dGV4X3VubG9jayAoJnBhX3NoYXJlZF9yZXNvdXJjZV9tdXRleCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKGVsZW1lbnQsICJyZXVzaW5nIHBhIG1haW4gbG9vcCB0aHJlYWQiKTsKKyAgICAgICAgbWFpbmxvb3BfcmVmX2N0Kys7CisgICAgICAgIGdfbXV0ZXhfdW5sb2NrICgmcGFfc2hhcmVkX3Jlc291cmNlX211dGV4KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKGVsZW1lbnQsCisgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2Nsb2NrX3Byb3ZpZGUgKEdTVF9PQkpFQ1RfQ0FTVCAoZWxlbWVudCksCisgICAgICAgICAgICAgIEdTVF9BVURJT19CQVNFX1NJTksgKHB1bHNlc2luayktPnByb3ZpZGVkX2Nsb2NrLCBUUlVFKSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICBnb3RvIHN0YXRlX2ZhaWx1cmU7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIC8qIGZvcm1hdF9sb3N0IGlzIHJlc2V0IGluIHJlbGVhc2UoKSBpbiBhdWRpb2Jhc2VzaW5rICovCisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKGVsZW1lbnQsCisgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2Nsb2NrX2xvc3QgKEdTVF9PQkpFQ1RfQ0FTVCAoZWxlbWVudCksCisgICAgICAgICAgICAgIEdTVF9BVURJT19CQVNFX1NJTksgKHB1bHNlc2luayktPnByb3ZpZGVkX2Nsb2NrKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGdzdF9wdWxzZXNpbmtfcmVsZWFzZV9tYWlubG9vcCAocHVsc2VzaW5rKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCittYWlubG9vcF9mYWlsZWQ6CisgIHsKKyAgICBnX211dGV4X3VubG9jayAoJnBhX3NoYXJlZF9yZXNvdXJjZV9tdXRleCk7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHB1bHNlc2luaywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV90aHJlYWRlZF9tYWlubG9vcF9uZXcoKSBmYWlsZWQiKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICB9CittYWlubG9vcF9zdGFydF9mYWlsZWQ6CisgIHsKKyAgICBnX211dGV4X3VubG9jayAoJnBhX3NoYXJlZF9yZXNvdXJjZV9tdXRleCk7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHB1bHNlc2luaywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV90aHJlYWRlZF9tYWlubG9vcF9zdGFydCgpIGZhaWxlZCIpLCAoTlVMTCkpOworICAgIHJldHVybiBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgIH0KK3N0YXRlX2ZhaWx1cmU6CisgIHsKKyAgICBpZiAodHJhbnNpdGlvbiA9PSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFkpIHsKKyAgICAgIC8qIENsZWFyIHRoZSBQQSBtYWlubG9vcCBpZiBhdWRpb2Jhc2VzaW5rIGZhaWxlZCB0byBvcGVuIHRoZSByaW5nX2J1ZmZlciAqLworICAgICAgZ19hc3NlcnQgKG1haW5sb29wKTsKKyAgICAgIGdzdF9wdWxzZXNpbmtfcmVsZWFzZV9tYWlubG9vcCAocHVsc2VzaW5rKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L3B1bHNlL3B1bHNlc2luay5oIGIvZXh0L3B1bHNlL3B1bHNlc2luay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlM2I5MzIKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcHVsc2UvcHVsc2VzaW5rLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qLSotIE1vZGU6IEM7IGMtYmFzaWMtb2Zmc2V0OiAyIC0qLSovCisKKy8qCisgKiAgR1N0cmVhbWVyIHB1bHNlYXVkaW8gcGx1Z2luCisgKgorICogIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IExlbm5hcnQgUG9ldHRlcmluZworICoKKyAqICBnc3QtcHVsc2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAqICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBnc3QtcHVsc2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIGdzdC1wdWxzZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxCisgKiAgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUFVMU0VTSU5LX0hfXworI2RlZmluZSBfX0dTVF9QVUxTRVNJTktfSF9fCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9zaW5rLmg+CisKKyNpbmNsdWRlIDxwdWxzZS9wdWxzZWF1ZGlvLmg+CisjaW5jbHVkZSA8cHVsc2UvdGhyZWFkLW1haW5sb29wLmg+CisKKyNpbmNsdWRlICJwdWxzZXV0aWwuaCIKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1BVTFNFU0lOSyBcCisgIChnc3RfcHVsc2VzaW5rX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9QVUxTRVNJTksob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9QVUxTRVNJTkssR3N0UHVsc2VTaW5rKSkKKyNkZWZpbmUgR1NUX1BVTFNFU0lOS19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9QVUxTRVNJTkssR3N0UHVsc2VTaW5rQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUFVMU0VTSU5LKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUFVMU0VTSU5LKSkKKyNkZWZpbmUgR1NUX0lTX1BVTFNFU0lOS19DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUFVMU0VTSU5LKSkKKyNkZWZpbmUgR1NUX1BVTFNFU0lOS19DQVNUKG9iaikgXAorICAoKEdzdFB1bHNlU2luayAqKShvYmopKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UHVsc2VTaW5rIEdzdFB1bHNlU2luazsKK3R5cGVkZWYgc3RydWN0IF9Hc3RQdWxzZVNpbmtDbGFzcyBHc3RQdWxzZVNpbmtDbGFzczsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFB1bHNlRGV2aWNlSW5mbyB7CisgIGdjaGFyICpkZXNjcmlwdGlvbjsKKyAgR0xpc3QgKmZvcm1hdHM7Cit9IEdzdFB1bHNlRGV2aWNlSW5mbzsKKworc3RydWN0IF9Hc3RQdWxzZVNpbmsKK3sKKyAgR3N0QXVkaW9CYXNlU2luayBzaW5rOworCisgIGdjaGFyICpzZXJ2ZXIsICpkZXZpY2UsICpzdHJlYW1fbmFtZSwgKmNsaWVudF9uYW1lOworICBHc3RQdWxzZURldmljZUluZm8gZGV2aWNlX2luZm87CisKKyAgZ2RvdWJsZSB2b2x1bWU7CisgIGdib29sZWFuIHZvbHVtZV9zZXQ6MTsKKyAgZ2Jvb2xlYW4gbXV0ZToxOworICBnYm9vbGVhbiBtdXRlX3NldDoxOworICBndWludDMyIGN1cnJlbnRfc2lua19pZHg7CisgIGdjaGFyICpjdXJyZW50X3NpbmtfbmFtZTsKKworICBndWludCBkZWZlcl9wZW5kaW5nOworCisgIGdpbnQgbm90aWZ5OyAvKiBhdG9taWMgKi8KKworICBjb25zdCBnY2hhciAqcGFfdmVyc2lvbjsKKworICBHc3RTdHJ1Y3R1cmUgKnByb3BlcnRpZXM7CisgIHBhX3Byb3BsaXN0ICpwcm9wbGlzdDsKKworICB2b2xhdGlsZSBnaW50IGZvcm1hdF9sb3N0OworICBHc3RDbG9ja1RpbWUgZm9ybWF0X2xvc3RfdGltZTsKK307CisKK3N0cnVjdCBfR3N0UHVsc2VTaW5rQ2xhc3MKK3sKKyAgR3N0QXVkaW9CYXNlU2lua0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9wdWxzZXNpbmtfZ2V0X3R5cGUgKHZvaWQpOworCisjZGVmaW5lIFBVTFNFX1NJTktfVEVNUExBVEVfQ0FQUyBcCisgIF9QVUxTRV9DQVBTX1BDTSBcCisgIF9QVUxTRV9DQVBTX0FDMyBcCisgIF9QVUxTRV9DQVBTX0VBQzMgXAorICBfUFVMU0VfQ0FQU19EVFMgXAorICBfUFVMU0VfQ0FQU19NUDMgXAorICBfUFVMU0VfQ0FQU19BQUMKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1BVTFNFU0lOS19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9wdWxzZS9wdWxzZXNyYy5jIGIvZXh0L3B1bHNlL3B1bHNlc3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FmNzRlZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9wdWxzZS9wdWxzZXNyYy5jCkBAIC0wLDAgKzEsMTg4NCBAQAorLyoKKyAqICBHU3RyZWFtZXIgcHVsc2VhdWRpbyBwbHVnaW4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA0LTIwMDggTGVubmFydCBQb2V0dGVyaW5nCisgKgorICogIGdzdC1wdWxzZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICogIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIGdzdC1wdWxzZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggZ3N0LXB1bHNlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEKKyAqICBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcHVsc2VzcmMKKyAqIEBzZWVfYWxzbzogcHVsc2VzaW5rCisgKgorICogVGhpcyBlbGVtZW50IGNhcHR1cmVzIGF1ZGlvIGZyb20gYQorICogPHVsaW5rIGhyZWY9Imh0dHA6Ly93d3cucHVsc2VhdWRpby5vcmciPlB1bHNlQXVkaW8gc291bmQgc2VydmVyPC91bGluaz4uCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBwdWxzZXNyYyAhIGF1ZGlvY29udmVydCAhIHZvcmJpc2VuYyAhIG9nZ211eCAhIGZpbGVzaW5rIGxvY2F0aW9uPWFsc2FzcmMub2dnCisgKiBdfCBSZWNvcmQgZnJvbSBhIHNvdW5kIGNhcmQgdXNpbmcgcHVsc2VhdWRpbyBhbmQgZW5jb2RlIHRvIE9nZy9Wb3JiaXMuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlc3JjLmg+CisjaW5jbHVkZSA8Z3N0L2dzdHRhZ2xpc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgInB1bHNlc3JjLmgiCisjaW5jbHVkZSAicHVsc2V1dGlsLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKHB1bHNlX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHB1bHNlX2RlYnVnCisKKyNkZWZpbmUgREVGQVVMVF9TRVJWRVIgICAgICAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfREVWSUNFICAgICAgICAgICAgTlVMTAorI2RlZmluZSBERUZBVUxUX0NVUlJFTlRfREVWSUNFICAgIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9ERVZJQ0VfTkFNRSAgICAgICBOVUxMCisKKyNkZWZpbmUgREVGQVVMVF9WT0xVTUUgICAgICAgICAgMS4wCisjZGVmaW5lIERFRkFVTFRfTVVURSAgICAgICAgICAgIEZBTFNFCisjZGVmaW5lIE1BWF9WT0xVTUUgICAgICAgICAgICAgIDEwLjAKKworLyogU2VlIHRoZSBwdWxzZXNpbmsgY29kZSBmb3Igbm90ZXMgb24gaG93IHdlIGludGVyYWN0IHdpdGggdGhlIFBBIG1haW5sb29wCisgKiB0aHJlYWQuICovCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX1NFUlZFUiwKKyAgUFJPUF9ERVZJQ0UsCisgIFBST1BfREVWSUNFX05BTUUsCisgIFBST1BfQ1VSUkVOVF9ERVZJQ0UsCisgIFBST1BfQ0xJRU5UX05BTUUsCisgIFBST1BfU1RSRUFNX1BST1BFUlRJRVMsCisgIFBST1BfU09VUkNFX09VVFBVVF9JTkRFWCwKKyAgUFJPUF9WT0xVTUUsCisgIFBST1BfTVVURSwKKyAgUFJPUF9MQVNUCit9OworCitzdGF0aWMgdm9pZCBnc3RfcHVsc2VzcmNfZGVzdHJveV9zdHJlYW0gKEdzdFB1bHNlU3JjICogcHVsc2VzcmMpOworc3RhdGljIHZvaWQgZ3N0X3B1bHNlc3JjX2Rlc3Ryb3lfY29udGV4dCAoR3N0UHVsc2VTcmMgKiBwdWxzZXNyYyk7CisKK3N0YXRpYyB2b2lkIGdzdF9wdWxzZXNyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcHVsc2VzcmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3B1bHNlc3JjX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9wdWxzZXNyY19zZXRfY29ya2VkIChHc3RQdWxzZVNyYyAqIHBzcmMsIGdib29sZWFuIGNvcmtlZCwKKyAgICBnYm9vbGVhbiB3YWl0KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcHVsc2VzcmNfb3BlbiAoR3N0QXVkaW9TcmMgKiBhc3JjKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9wdWxzZXNyY19jbG9zZSAoR3N0QXVkaW9TcmMgKiBhc3JjKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9wdWxzZXNyY19wcmVwYXJlIChHc3RBdWRpb1NyYyAqIGFzcmMsCisgICAgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3B1bHNlc3JjX3VucHJlcGFyZSAoR3N0QXVkaW9TcmMgKiBhc3JjKTsKKworc3RhdGljIGd1aW50IGdzdF9wdWxzZXNyY19yZWFkIChHc3RBdWRpb1NyYyAqIGFzcmMsIGdwb2ludGVyIGRhdGEsCisgICAgZ3VpbnQgbGVuZ3RoLCBHc3RDbG9ja1RpbWUgKiB0aW1lc3RhbXApOworc3RhdGljIGd1aW50IGdzdF9wdWxzZXNyY19kZWxheSAoR3N0QXVkaW9TcmMgKiBhc3JjKTsKKworc3RhdGljIHZvaWQgZ3N0X3B1bHNlc3JjX3Jlc2V0IChHc3RBdWRpb1NyYyAqIHNyYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcHVsc2VzcmNfbmVnb3RpYXRlIChHc3RCYXNlU3JjICogYmFzZXNyYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3B1bHNlc3JjX2V2ZW50IChHc3RCYXNlU3JjICogYmFzZXNyYywgR3N0RXZlbnQgKiBldmVudCk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcHVsc2VzcmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIEdzdENsb2NrVGltZSBnc3RfcHVsc2VzcmNfZ2V0X3RpbWUgKEdzdENsb2NrICogY2xvY2ssIEdzdFB1bHNlU3JjICogc3JjKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHBhZF90ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKF9QVUxTRV9DQVBTX1BDTSkKKyAgICApOworCisjZGVmaW5lIGdzdF9wdWxzZXNyY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoR3N0UHVsc2VTcmMsIGdzdF9wdWxzZXNyYywgR1NUX1RZUEVfQVVESU9fU1JDLAorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfU1RSRUFNX1ZPTFVNRSwgTlVMTCkpOworCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX2NsYXNzX2luaXQgKEdzdFB1bHNlU3JjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QXVkaW9TcmNDbGFzcyAqZ3N0YXVkaW9zcmNfY2xhc3MgPSBHU1RfQVVESU9fU1JDX0NMQVNTIChrbGFzcyk7CisgIEdzdEJhc2VTcmNDbGFzcyAqZ3N0YmFzZXNyY19jbGFzcyA9IEdTVF9CQVNFX1NSQ19DTEFTUyAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBnY2hhciAqY2xpZW50bmFtZTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9wdWxzZXNyY19maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3B1bHNlc3JjX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3B1bHNlc3JjX2dldF9wcm9wZXJ0eTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wdWxzZXNyY19jaGFuZ2Vfc3RhdGUpOworCisgIGdzdGJhc2VzcmNfY2xhc3MtPmV2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wdWxzZXNyY19ldmVudCk7CisgIGdzdGJhc2VzcmNfY2xhc3MtPm5lZ290aWF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VzcmNfbmVnb3RpYXRlKTsKKworICBnc3RhdWRpb3NyY19jbGFzcy0+b3BlbiA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VzcmNfb3Blbik7CisgIGdzdGF1ZGlvc3JjX2NsYXNzLT5jbG9zZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VzcmNfY2xvc2UpOworICBnc3RhdWRpb3NyY19jbGFzcy0+cHJlcGFyZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VzcmNfcHJlcGFyZSk7CisgIGdzdGF1ZGlvc3JjX2NsYXNzLT51bnByZXBhcmUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3B1bHNlc3JjX3VucHJlcGFyZSk7CisgIGdzdGF1ZGlvc3JjX2NsYXNzLT5yZWFkID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wdWxzZXNyY19yZWFkKTsKKyAgZ3N0YXVkaW9zcmNfY2xhc3MtPmRlbGF5ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wdWxzZXNyY19kZWxheSk7CisgIGdzdGF1ZGlvc3JjX2NsYXNzLT5yZXNldCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHVsc2VzcmNfcmVzZXQpOworCisgIC8qIE92ZXJ3cml0ZSBHT2JqZWN0IGZpZWxkcyAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9TRVJWRVIsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgic2VydmVyIiwgIlNlcnZlciIsCisgICAgICAgICAgIlRoZSBQdWxzZUF1ZGlvIHNlcnZlciB0byBjb25uZWN0IHRvIiwgREVGQVVMVF9TRVJWRVIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ERVZJQ0UsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZGV2aWNlIiwgIkRldmljZSIsCisgICAgICAgICAgIlRoZSBQdWxzZUF1ZGlvIHNvdXJjZSBkZXZpY2UgdG8gY29ubmVjdCB0byIsIERFRkFVTFRfREVWSUNFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ1VSUkVOVF9ERVZJQ0UsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiY3VycmVudC1kZXZpY2UiLCAiQ3VycmVudCBEZXZpY2UiLAorICAgICAgICAgICJUaGUgY3VycmVudCBQdWxzZUF1ZGlvIHNvdXJjZSBkZXZpY2UiLCBERUZBVUxUX0NVUlJFTlRfREVWSUNFLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfREVWSUNFX05BTUUsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZGV2aWNlLW5hbWUiLCAiRGV2aWNlIG5hbWUiLAorICAgICAgICAgICJIdW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBzb3VuZCBkZXZpY2UiLCBERUZBVUxUX0RFVklDRV9OQU1FLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgY2xpZW50bmFtZSA9IGdzdF9wdWxzZV9jbGllbnRfbmFtZSAoKTsKKyAgLyoqCisgICAqIEdzdFB1bHNlU3JjOmNsaWVudC1uYW1lCisgICAqCisgICAqIFRoZSBQdWxzZUF1ZGlvIGNsaWVudCBuYW1lIHRvIHVzZS4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0NMSUVOVF9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImNsaWVudC1uYW1lIiwgIkNsaWVudCBOYW1lIiwKKyAgICAgICAgICAiVGhlIFB1bHNlQXVkaW8gY2xpZW50X25hbWVfdG9fdXNlIiwgY2xpZW50bmFtZSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfAorICAgICAgICAgIEdTVF9QQVJBTV9NVVRBQkxFX1JFQURZKSk7CisgIGdfZnJlZSAoY2xpZW50bmFtZSk7CisKKyAgLyoqCisgICAqIEdzdFB1bHNlU3JjOnN0cmVhbS1wcm9wZXJ0aWVzOgorICAgKgorICAgKiBMaXN0IG9mIHB1bHNlYXVkaW8gc3RyZWFtIHByb3BlcnRpZXMuIEEgbGlzdCBvZiBkZWZpbmVkIHByb3BlcnRpZXMgY2FuIGJlCisgICAqIGZvdW5kIGluIHRoZSA8dWxpbmsgaHJlZj0iaHR0cDovLzBwb2ludGVyLmRlL2xlbm5hcnQvcHJvamVjdHMvcHVsc2VhdWRpby9kb3h5Z2VuL3Byb3BsaXN0XzhoLmh0bWwiPnB1bHNlYXVkaW8gYXBpIGRvY3M8L3VsaW5rPi4KKyAgICoKKyAgICogQmVsb3cgaXMgYW4gZXhhbXBsZSBmb3IgcmVnaXN0ZXJpbmcgYXMgYSBtdXNpYyBhcHBsaWNhdGlvbiB0byBwdWxzZWF1ZGlvLgorICAgKiB8WworICAgKiBHc3RTdHJ1Y3R1cmUgKnByb3BzOworICAgKgorICAgKiBwcm9wcyA9IGdzdF9zdHJ1Y3R1cmVfZnJvbV9zdHJpbmcgKCJwcm9wcyxtZWRpYS5yb2xlPW11c2ljIiwgTlVMTCk7CisgICAqIGdfb2JqZWN0X3NldCAocHVsc2UsICJzdHJlYW0tcHJvcGVydGllcyIsIHByb3BzLCBOVUxMKTsKKyAgICogZ3N0X3N0cnVjdHVyZV9mcmVlIChwcm9wcyk7CisgICAqIF18CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9TVFJFQU1fUFJPUEVSVElFUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoInN0cmVhbS1wcm9wZXJ0aWVzIiwgInN0cmVhbSBwcm9wZXJ0aWVzIiwKKyAgICAgICAgICAibGlzdCBvZiBwdWxzZWF1ZGlvIHN0cmVhbSBwcm9wZXJ0aWVzIiwKKyAgICAgICAgICBHU1RfVFlQRV9TVFJVQ1RVUkUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0UHVsc2VTcmM6c291cmNlLW91dHB1dC1pbmRleDoKKyAgICoKKyAgICogVGhlIGluZGV4IG9mIHRoZSBQdWxzZUF1ZGlvIHNvdXJjZSBvdXRwdXQgY29ycmVzcG9uZGluZyB0byB0aGlzIGVsZW1lbnQuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9TT1VSQ0VfT1VUUFVUX0lOREVYLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJzb3VyY2Utb3V0cHV0LWluZGV4IiwgInNvdXJjZSBvdXRwdXQgaW5kZXgiLAorICAgICAgICAgICJUaGUgaW5kZXggb2YgdGhlIFB1bHNlQXVkaW8gc291cmNlIG91dHB1dCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgIgorICAgICAgICAgICJyZWNvcmQgc3RyZWFtIiwgMCwgR19NQVhVSU5ULCBQQV9JTlZBTElEX0lOREVYLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJQdWxzZUF1ZGlvIEF1ZGlvIFNvdXJjZSIsCisgICAgICAiU291cmNlL0F1ZGlvIiwKKyAgICAgICJDYXB0dXJlcyBhdWRpbyBmcm9tIGEgUHVsc2VBdWRpbyBzZXJ2ZXIiLCAiTGVubmFydCBQb2V0dGVyaW5nIik7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmcGFkX3RlbXBsYXRlKTsKKworICAvKioKKyAgICogR3N0UHVsc2VTcmM6dm9sdW1lOgorICAgKgorICAgKiBUaGUgdm9sdW1lIG9mIHRoZSByZWNvcmQgc3RyZWFtLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVk9MVU1FLCBnX3BhcmFtX3NwZWNfZG91YmxlICgidm9sdW1lIiwgIlZvbHVtZSIsCisgICAgICAgICAgIkxpbmVhciB2b2x1bWUgb2YgdGhpcyBzdHJlYW0sIDEuMD0xMDAlIiwKKyAgICAgICAgICAwLjAsIE1BWF9WT0xVTUUsIERFRkFVTFRfVk9MVU1FLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RQdWxzZVNyYzptdXRlOgorICAgKgorICAgKiBXaGV0aGVyIHRoZSBzdHJlYW0gaXMgbXV0ZWQgb3Igbm90LgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfTVVURSwgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJtdXRlIiwgIk11dGUiLAorICAgICAgICAgICJNdXRlIHN0YXRlIG9mIHRoaXMgc3RyZWFtIiwKKyAgICAgICAgICBERUZBVUxUX01VVEUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX2luaXQgKEdzdFB1bHNlU3JjICogcHVsc2VzcmMpCit7CisgIHB1bHNlc3JjLT5zZXJ2ZXIgPSBOVUxMOworICBwdWxzZXNyYy0+ZGV2aWNlID0gTlVMTDsKKyAgcHVsc2VzcmMtPmNsaWVudF9uYW1lID0gZ3N0X3B1bHNlX2NsaWVudF9uYW1lICgpOworICBwdWxzZXNyYy0+ZGV2aWNlX2Rlc2NyaXB0aW9uID0gTlVMTDsKKworICBwdWxzZXNyYy0+Y29udGV4dCA9IE5VTEw7CisgIHB1bHNlc3JjLT5zdHJlYW0gPSBOVUxMOworICBwdWxzZXNyYy0+c3RyZWFtX2Nvbm5lY3RlZCA9IEZBTFNFOworICBwdWxzZXNyYy0+c291cmNlX291dHB1dF9pZHggPSBQQV9JTlZBTElEX0lOREVYOworCisgIHB1bHNlc3JjLT5yZWFkX2J1ZmZlciA9IE5VTEw7CisgIHB1bHNlc3JjLT5yZWFkX2J1ZmZlcl9sZW5ndGggPSAwOworCisgIHBhX3NhbXBsZV9zcGVjX2luaXQgKCZwdWxzZXNyYy0+c2FtcGxlX3NwZWMpOworCisgIHB1bHNlc3JjLT5vcGVyYXRpb25fc3VjY2VzcyA9IEZBTFNFOworICBwdWxzZXNyYy0+cGF1c2VkID0gVFJVRTsKKyAgcHVsc2VzcmMtPmluX3JlYWQgPSBGQUxTRTsKKworICBwdWxzZXNyYy0+dm9sdW1lID0gREVGQVVMVF9WT0xVTUU7CisgIHB1bHNlc3JjLT52b2x1bWVfc2V0ID0gRkFMU0U7CisKKyAgcHVsc2VzcmMtPm11dGUgPSBERUZBVUxUX01VVEU7CisgIHB1bHNlc3JjLT5tdXRlX3NldCA9IEZBTFNFOworCisgIHB1bHNlc3JjLT5ub3RpZnkgPSAwOworCisgIHB1bHNlc3JjLT5wcm9wZXJ0aWVzID0gTlVMTDsKKyAgcHVsc2VzcmMtPnByb3BsaXN0ID0gTlVMTDsKKworICAvKiB0aGlzIHNob3VsZCBiZSB0aGUgZGVmYXVsdCBidXQgaXQgaXNuJ3QgeWV0ICovCisgIGdzdF9hdWRpb19iYXNlX3NyY19zZXRfc2xhdmVfbWV0aG9kIChHU1RfQVVESU9fQkFTRV9TUkMgKHB1bHNlc3JjKSwKKyAgICAgIEdTVF9BVURJT19CQVNFX1NSQ19TTEFWRV9TS0VXKTsKKworICAvKiBvdmVycmlkZSB3aXRoIGEgY3VzdG9tIGNsb2NrICovCisgIGlmIChHU1RfQVVESU9fQkFTRV9TUkMgKHB1bHNlc3JjKS0+Y2xvY2spCisgICAgZ3N0X29iamVjdF91bnJlZiAoR1NUX0FVRElPX0JBU0VfU1JDIChwdWxzZXNyYyktPmNsb2NrKTsKKworICBHU1RfQVVESU9fQkFTRV9TUkMgKHB1bHNlc3JjKS0+Y2xvY2sgPQorICAgICAgZ3N0X2F1ZGlvX2Nsb2NrX25ldyAoIkdzdFB1bHNlU3JjQ2xvY2siLAorICAgICAgKEdzdEF1ZGlvQ2xvY2tHZXRUaW1lRnVuYykgZ3N0X3B1bHNlc3JjX2dldF90aW1lLCBwdWxzZXNyYywgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzcmNfZGVzdHJveV9zdHJlYW0gKEdzdFB1bHNlU3JjICogcHVsc2VzcmMpCit7CisgIGlmIChwdWxzZXNyYy0+c3RyZWFtKSB7CisgICAgcGFfc3RyZWFtX2Rpc2Nvbm5lY3QgKHB1bHNlc3JjLT5zdHJlYW0pOworICAgIHBhX3N0cmVhbV91bnJlZiAocHVsc2VzcmMtPnN0cmVhbSk7CisgICAgcHVsc2VzcmMtPnN0cmVhbSA9IE5VTEw7CisgICAgcHVsc2VzcmMtPnN0cmVhbV9jb25uZWN0ZWQgPSBGQUxTRTsKKyAgICBwdWxzZXNyYy0+c291cmNlX291dHB1dF9pZHggPSBQQV9JTlZBTElEX0lOREVYOworICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKHB1bHNlc3JjKSwgInNvdXJjZS1vdXRwdXQtaW5kZXgiKTsKKyAgfQorCisgIGdfZnJlZSAocHVsc2VzcmMtPmRldmljZV9kZXNjcmlwdGlvbik7CisgIHB1bHNlc3JjLT5kZXZpY2VfZGVzY3JpcHRpb24gPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX2Rlc3Ryb3lfY29udGV4dCAoR3N0UHVsc2VTcmMgKiBwdWxzZXNyYykKK3sKKworICBnc3RfcHVsc2VzcmNfZGVzdHJveV9zdHJlYW0gKHB1bHNlc3JjKTsKKworICBpZiAocHVsc2VzcmMtPmNvbnRleHQpIHsKKyAgICBwYV9jb250ZXh0X2Rpc2Nvbm5lY3QgKHB1bHNlc3JjLT5jb250ZXh0KTsKKworICAgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYW55IGZ1cnRoZXIgY2FsbGJhY2tzICovCisgICAgcGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2sgKHB1bHNlc3JjLT5jb250ZXh0LCBOVUxMLCBOVUxMKTsKKyAgICBwYV9jb250ZXh0X3NldF9zdWJzY3JpYmVfY2FsbGJhY2sgKHB1bHNlc3JjLT5jb250ZXh0LCBOVUxMLCBOVUxMKTsKKworICAgIHBhX2NvbnRleHRfdW5yZWYgKHB1bHNlc3JjLT5jb250ZXh0KTsKKworICAgIHB1bHNlc3JjLT5jb250ZXh0ID0gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RQdWxzZVNyYyAqcHVsc2VzcmMgPSBHU1RfUFVMU0VTUkNfQ0FTVCAob2JqZWN0KTsKKworICBnX2ZyZWUgKHB1bHNlc3JjLT5zZXJ2ZXIpOworICBnX2ZyZWUgKHB1bHNlc3JjLT5kZXZpY2UpOworICBnX2ZyZWUgKHB1bHNlc3JjLT5jbGllbnRfbmFtZSk7CisgIGdfZnJlZSAocHVsc2VzcmMtPmN1cnJlbnRfc291cmNlX25hbWUpOworCisgIGlmIChwdWxzZXNyYy0+cHJvcGVydGllcykKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHB1bHNlc3JjLT5wcm9wZXJ0aWVzKTsKKyAgaWYgKHB1bHNlc3JjLT5wcm9wbGlzdCkKKyAgICBwYV9wcm9wbGlzdF9mcmVlIChwdWxzZXNyYy0+cHJvcGxpc3QpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworI2RlZmluZSBDT05URVhUX09LKGMpICgoYykgJiYgUEFfQ09OVEVYVF9JU19HT09EIChwYV9jb250ZXh0X2dldF9zdGF0ZSAoKGMpKSkpCisjZGVmaW5lIFNUUkVBTV9PSyhzKSAoKHMpICYmIFBBX1NUUkVBTV9JU19HT09EIChwYV9zdHJlYW1fZ2V0X3N0YXRlICgocykpKSkKKworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VzcmNfaXNfZGVhZCAoR3N0UHVsc2VTcmMgKiBwdWxzZXNyYywgZ2Jvb2xlYW4gY2hlY2tfc3RyZWFtKQoreworICBpZiAoIXB1bHNlc3JjLT5zdHJlYW1fY29ubmVjdGVkKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghQ09OVEVYVF9PSyAocHVsc2VzcmMtPmNvbnRleHQpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKGNoZWNrX3N0cmVhbSAmJiAhU1RSRUFNX09LIChwdWxzZXNyYy0+c3RyZWFtKSkKKyAgICBnb3RvIGVycm9yOworCisgIHJldHVybiBGQUxTRTsKKworZXJyb3I6CisgIHsKKyAgICBjb25zdCBnY2hhciAqZXJyX3N0ciA9IHB1bHNlc3JjLT5jb250ZXh0ID8KKyAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHB1bHNlc3JjLT5jb250ZXh0KSkgOiBOVUxMOworICAgIEdTVF9FTEVNRU5UX0VSUk9SICgocHVsc2VzcmMpLCBSRVNPVVJDRSwgRkFJTEVELCAoIkRpc2Nvbm5lY3RlZDogJXMiLAorICAgICAgICAgICAgZXJyX3N0ciksIChOVUxMKSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNyY19zb3VyY2VfaW5mb19jYiAocGFfY29udGV4dCAqIGMsIGNvbnN0IHBhX3NvdXJjZV9pbmZvICogaSwgaW50IGVvbCwKKyAgICB2b2lkICp1c2VyZGF0YSkKK3sKKyAgR3N0UHVsc2VTcmMgKnB1bHNlc3JjID0gR1NUX1BVTFNFU1JDX0NBU1QgKHVzZXJkYXRhKTsKKworICBpZiAoIWkpCisgICAgZ290byBkb25lOworCisgIGdfZnJlZSAocHVsc2VzcmMtPmRldmljZV9kZXNjcmlwdGlvbik7CisgIHB1bHNlc3JjLT5kZXZpY2VfZGVzY3JpcHRpb24gPSBnX3N0cmR1cCAoaS0+ZGVzY3JpcHRpb24pOworCitkb25lOgorICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwgKHB1bHNlc3JjLT5tYWlubG9vcCwgMCk7Cit9CisKK3N0YXRpYyBnY2hhciAqCitnc3RfcHVsc2VzcmNfZGV2aWNlX2Rlc2NyaXB0aW9uIChHc3RQdWxzZVNyYyAqIHB1bHNlc3JjKQoreworICBwYV9vcGVyYXRpb24gKm8gPSBOVUxMOworICBnY2hhciAqdDsKKworICBpZiAoIXB1bHNlc3JjLT5tYWlubG9vcCkKKyAgICBnb3RvIG5vX21haW5sb29wOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKHB1bHNlc3JjLT5tYWlubG9vcCk7CisKKyAgaWYgKCEobyA9IHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9pbmZvX2J5X25hbWUgKHB1bHNlc3JjLT5jb250ZXh0LAorICAgICAgICAgICAgICBwdWxzZXNyYy0+ZGV2aWNlLCBnc3RfcHVsc2VzcmNfc291cmNlX2luZm9fY2IsIHB1bHNlc3JjKSkpIHsKKworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwdWxzZXNyYywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9zdHJlYW1fZ2V0X3NvdXJjZV9pbmZvKCkgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAocHVsc2VzcmMtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2s7CisgIH0KKworICB3aGlsZSAocGFfb3BlcmF0aW9uX2dldF9zdGF0ZSAobykgPT0gUEFfT1BFUkFUSU9OX1JVTk5JTkcpIHsKKworICAgIGlmIChnc3RfcHVsc2VzcmNfaXNfZGVhZCAocHVsc2VzcmMsIEZBTFNFKSkKKyAgICAgIGdvdG8gdW5sb2NrOworCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAocHVsc2VzcmMtPm1haW5sb29wKTsKKyAgfQorCit1bmxvY2s6CisKKyAgaWYgKG8pCisgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKworICB0ID0gZ19zdHJkdXAgKHB1bHNlc3JjLT5kZXZpY2VfZGVzY3JpcHRpb24pOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICByZXR1cm4gdDsKKworbm9fbWFpbmxvb3A6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgImhhdmUgbm8gbWFpbmxvb3AiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX3NvdXJjZV9vdXRwdXRfaW5mb19jYiAocGFfY29udGV4dCAqIGMsCisgICAgY29uc3QgcGFfc291cmNlX291dHB1dF9pbmZvICogaSwgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU3JjICpwc3JjOworCisgIHBzcmMgPSBHU1RfUFVMU0VTUkNfQ0FTVCAodXNlcmRhdGEpOworCisgIGlmICghaSkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogSWYgdGhlIGluZGV4IGRvZXNuJ3QgbWF0Y2ggb3VyIGN1cnJlbnQgc3RyZWFtLAorICAgKiBpdCBpbXBsaWVzIHdlIGp1c3QgcmVjcmVhdGVkIHRoZSBzdHJlYW0gKGNhcHMgY2hhbmdlKQorICAgKi8KKyAgaWYgKGktPmluZGV4ID09IHBzcmMtPnNvdXJjZV9vdXRwdXRfaWR4KSB7CisgICAgcHNyYy0+dm9sdW1lID0gcGFfc3dfdm9sdW1lX3RvX2xpbmVhciAocGFfY3ZvbHVtZV9tYXggKCZpLT52b2x1bWUpKTsKKyAgICBwc3JjLT5tdXRlID0gaS0+bXV0ZTsKKyAgICBwc3JjLT5jdXJyZW50X3NvdXJjZV9pZHggPSBpLT5zb3VyY2U7CisKKyAgICBpZiAoR19VTkxJS0VMWSAocHNyYy0+dm9sdW1lID4gTUFYX1ZPTFVNRSkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocHNyYywgIkNsaXBwZWQgdm9sdW1lIGZyb20gJWYgdG8gJWYiLAorICAgICAgICAgIHBzcmMtPnZvbHVtZSwgTUFYX1ZPTFVNRSk7CisgICAgICBwc3JjLT52b2x1bWUgPSBNQVhfVk9MVU1FOworICAgIH0KKyAgfQorCitkb25lOgorICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwgKHBzcmMtPm1haW5sb29wLCAwKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNyY19nZXRfc291cmNlX291dHB1dF9pbmZvIChHc3RQdWxzZVNyYyAqIHB1bHNlc3JjLCBnZG91YmxlICogdm9sdW1lLAorICAgIGdib29sZWFuICogbXV0ZSkKK3sKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKworICBpZiAoIXB1bHNlc3JjLT5tYWlubG9vcCkKKyAgICBnb3RvIG5vX21haW5sb29wOworCisgIGlmIChwdWxzZXNyYy0+c291cmNlX291dHB1dF9pZHggPT0gUEFfSU5WQUxJRF9JTkRFWCkKKyAgICBnb3RvIG5vX2luZGV4OworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKHB1bHNlc3JjLT5tYWlubG9vcCk7CisKKyAgaWYgKCEobyA9IHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9vdXRwdXRfaW5mbyAocHVsc2VzcmMtPmNvbnRleHQsCisgICAgICAgICAgICAgIHB1bHNlc3JjLT5zb3VyY2Vfb3V0cHV0X2lkeCwgZ3N0X3B1bHNlc3JjX3NvdXJjZV9vdXRwdXRfaW5mb19jYiwKKyAgICAgICAgICAgICAgcHVsc2VzcmMpKSkKKyAgICBnb3RvIGluZm9fZmFpbGVkOworCisgIHdoaWxlIChwYV9vcGVyYXRpb25fZ2V0X3N0YXRlIChvKSA9PSBQQV9PUEVSQVRJT05fUlVOTklORykgeworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQgKHB1bHNlc3JjLT5tYWlubG9vcCk7CisgICAgaWYgKGdzdF9wdWxzZXNyY19pc19kZWFkIChwdWxzZXNyYywgVFJVRSkpCisgICAgICBnb3RvIHVubG9jazsKKyAgfQorCit1bmxvY2s6CisKKyAgaWYgKHZvbHVtZSkKKyAgICAqdm9sdW1lID0gcHVsc2VzcmMtPnZvbHVtZTsKKyAgaWYgKG11dGUpCisgICAgKm11dGUgPSBwdWxzZXNyYy0+bXV0ZTsKKworICBpZiAobykKKyAgICBwYV9vcGVyYXRpb25fdW5yZWYgKG8pOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICByZXR1cm47CisKKyAgLyogRVJST1JTICovCitub19tYWlubG9vcDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHB1bHNlc3JjLCAid2UgaGF2ZSBubyBtYWlubG9vcCIpOworICAgIGlmICh2b2x1bWUpCisgICAgICAqdm9sdW1lID0gcHVsc2VzcmMtPnZvbHVtZTsKKyAgICBpZiAobXV0ZSkKKyAgICAgICptdXRlID0gcHVsc2VzcmMtPm11dGU7CisgICAgcmV0dXJuOworICB9Citub19pbmRleDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHB1bHNlc3JjLCAid2UgZG9uJ3QgaGF2ZSBhIHN0cmVhbSBpbmRleCIpOworICAgIGlmICh2b2x1bWUpCisgICAgICAqdm9sdW1lID0gcHVsc2VzcmMtPnZvbHVtZTsKKyAgICBpZiAobXV0ZSkKKyAgICAgICptdXRlID0gcHVsc2VzcmMtPm11dGU7CisgICAgcmV0dXJuOworICB9CitpbmZvX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwdWxzZXNyYywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9jb250ZXh0X2dldF9zb3VyY2Vfb3V0cHV0X2luZm8oKSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwdWxzZXNyYy0+Y29udGV4dCkpKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX2N1cnJlbnRfc291cmNlX2luZm9fY2IgKHBhX2NvbnRleHQgKiBjLCBjb25zdCBwYV9zb3VyY2VfaW5mbyAqIGksCisgICAgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU3JjICpwc3JjOworCisgIHBzcmMgPSBHU1RfUFVMU0VTUkNfQ0FTVCAodXNlcmRhdGEpOworCisgIGlmICghaSkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogSWYgdGhlIGluZGV4IGRvZXNuJ3QgbWF0Y2ggb3VyIGN1cnJlbnQgc3RyZWFtLAorICAgKiBpdCBpbXBsaWVzIHdlIGp1c3QgcmVjcmVhdGVkIHRoZSBzdHJlYW0gKGNhcHMgY2hhbmdlKQorICAgKi8KKyAgaWYgKGktPmluZGV4ID09IHBzcmMtPmN1cnJlbnRfc291cmNlX2lkeCkgeworICAgIGdfZnJlZSAocHNyYy0+Y3VycmVudF9zb3VyY2VfbmFtZSk7CisgICAgcHNyYy0+Y3VycmVudF9zb3VyY2VfbmFtZSA9IGdfc3RyZHVwIChpLT5uYW1lKTsKKyAgfQorCitkb25lOgorICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwgKHBzcmMtPm1haW5sb29wLCAwKTsKK30KKworc3RhdGljIGdjaGFyICoKK2dzdF9wdWxzZXNyY19nZXRfY3VycmVudF9kZXZpY2UgKEdzdFB1bHNlU3JjICogcHVsc2VzcmMpCit7CisgIHBhX29wZXJhdGlvbiAqbyA9IE5VTEw7CisgIGdjaGFyICpjdXJyZW50X3NyYzsKKworICBpZiAoIXB1bHNlc3JjLT5tYWlubG9vcCkKKyAgICBnb3RvIG5vX21haW5sb29wOworCisgIGlmIChwdWxzZXNyYy0+c291cmNlX291dHB1dF9pZHggPT0gUEFfSU5WQUxJRF9JTkRFWCkKKyAgICBnb3RvIG5vX2luZGV4OworCisgIGdzdF9wdWxzZXNyY19nZXRfc291cmNlX291dHB1dF9pbmZvIChwdWxzZXNyYywgTlVMTCwgTlVMTCk7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworCisgIGlmICghKG8gPSBwYV9jb250ZXh0X2dldF9zb3VyY2VfaW5mb19ieV9pbmRleCAocHVsc2VzcmMtPmNvbnRleHQsCisgICAgICAgICAgICAgIHB1bHNlc3JjLT5jdXJyZW50X3NvdXJjZV9pZHgsIGdzdF9wdWxzZXNyY19jdXJyZW50X3NvdXJjZV9pbmZvX2NiLAorICAgICAgICAgICAgICBwdWxzZXNyYykpKQorICAgIGdvdG8gaW5mb19mYWlsZWQ7CisKKyAgd2hpbGUgKHBhX29wZXJhdGlvbl9nZXRfc3RhdGUgKG8pID09IFBBX09QRVJBVElPTl9SVU5OSU5HKSB7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAocHVsc2VzcmMtPm1haW5sb29wKTsKKyAgICBpZiAoZ3N0X3B1bHNlc3JjX2lzX2RlYWQgKHB1bHNlc3JjLCBUUlVFKSkKKyAgICAgIGdvdG8gdW5sb2NrOworICB9CisKK3VubG9jazoKKworICBjdXJyZW50X3NyYyA9IGdfc3RyZHVwIChwdWxzZXNyYy0+Y3VycmVudF9zb3VyY2VfbmFtZSk7CisKKyAgaWYgKG8pCisgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKHB1bHNlc3JjLT5tYWlubG9vcCk7CisKKyAgcmV0dXJuIGN1cnJlbnRfc3JjOworCisgIC8qIEVSUk9SUyAqLworbm9fbWFpbmxvb3A6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgIndlIGhhdmUgbm8gbWFpbmxvb3AiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorbm9faW5kZXg6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgIndlIGRvbid0IGhhdmUgYSBzdHJlYW0gaW5kZXgiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQoraW5mb19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHVsc2VzcmMsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgicGFfY29udGV4dF9nZXRfc291cmNlX291dHB1dF9pbmZvKCkgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAocHVsc2VzcmMtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2s7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNyY19zZXRfc3RyZWFtX3ZvbHVtZSAoR3N0UHVsc2VTcmMgKiBwdWxzZXNyYywgZ2RvdWJsZSB2b2x1bWUpCit7CisgIHBhX2N2b2x1bWUgdjsKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKworICBpZiAoIXB1bHNlc3JjLT5tYWlubG9vcCkKKyAgICBnb3RvIG5vX21haW5sb29wOworCisgIGlmICghcHVsc2VzcmMtPnNvdXJjZV9vdXRwdXRfaWR4KQorICAgIGdvdG8gbm9faW5kZXg7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgInNldHRpbmcgdm9sdW1lIHRvICVmIiwgdm9sdW1lKTsKKworICBnc3RfcHVsc2VfY3ZvbHVtZV9mcm9tX2xpbmVhciAoJnYsIHB1bHNlc3JjLT5zYW1wbGVfc3BlYy5jaGFubmVscywgdm9sdW1lKTsKKworICBpZiAoIShvID0gcGFfY29udGV4dF9zZXRfc291cmNlX291dHB1dF92b2x1bWUgKHB1bHNlc3JjLT5jb250ZXh0LAorICAgICAgICAgICAgICBwdWxzZXNyYy0+c291cmNlX291dHB1dF9pZHgsICZ2LCBOVUxMLCBOVUxMKSkpCisgICAgZ290byB2b2x1bWVfZmFpbGVkOworCisgIC8qIFdlIGRvbid0IHJlYWxseSBjYXJlIGFib3V0IHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsICovCit1bmxvY2s6CisKKyAgaWYgKG8pCisgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKHB1bHNlc3JjLT5tYWlubG9vcCk7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworbm9fbWFpbmxvb3A6CisgIHsKKyAgICBwdWxzZXNyYy0+dm9sdW1lID0gdm9sdW1lOworICAgIHB1bHNlc3JjLT52b2x1bWVfc2V0ID0gVFJVRTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgIndlIGhhdmUgbm8gbWFpbmxvb3AiKTsKKyAgICByZXR1cm47CisgIH0KK25vX2luZGV4OgorICB7CisgICAgcHVsc2VzcmMtPnZvbHVtZSA9IHZvbHVtZTsKKyAgICBwdWxzZXNyYy0+dm9sdW1lX3NldCA9IFRSVUU7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHVsc2VzcmMsICJ3ZSBkb24ndCBoYXZlIGEgc3RyZWFtIGluZGV4Iik7CisgICAgcmV0dXJuOworICB9Cit2b2x1bWVfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHB1bHNlc3JjLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoInBhX3N0cmVhbV9zZXRfc291cmNlX291dHB1dF92b2x1bWUoKSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwdWxzZXNyYy0+Y29udGV4dCkpKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX3NldF9zdHJlYW1fbXV0ZSAoR3N0UHVsc2VTcmMgKiBwdWxzZXNyYywgZ2Jvb2xlYW4gbXV0ZSkKK3sKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKworICBpZiAoIXB1bHNlc3JjLT5tYWlubG9vcCkKKyAgICBnb3RvIG5vX21haW5sb29wOworCisgIGlmICghcHVsc2VzcmMtPnNvdXJjZV9vdXRwdXRfaWR4KQorICAgIGdvdG8gbm9faW5kZXg7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgInNldHRpbmcgbXV0ZSBzdGF0ZSB0byAlZCIsIG11dGUpOworCisgIGlmICghKG8gPSBwYV9jb250ZXh0X3NldF9zb3VyY2Vfb3V0cHV0X211dGUgKHB1bHNlc3JjLT5jb250ZXh0LAorICAgICAgICAgICAgICBwdWxzZXNyYy0+c291cmNlX291dHB1dF9pZHgsIG11dGUsIE5VTEwsIE5VTEwpKSkKKyAgICBnb3RvIG11dGVfZmFpbGVkOworCisgIC8qIFdlIGRvbid0IHJlYWxseSBjYXJlIGFib3V0IHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsICovCit1bmxvY2s6CisKKyAgaWYgKG8pCisgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKHB1bHNlc3JjLT5tYWlubG9vcCk7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworbm9fbWFpbmxvb3A6CisgIHsKKyAgICBwdWxzZXNyYy0+bXV0ZSA9IG11dGU7CisgICAgcHVsc2VzcmMtPm11dGVfc2V0ID0gVFJVRTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgIndlIGhhdmUgbm8gbWFpbmxvb3AiKTsKKyAgICByZXR1cm47CisgIH0KK25vX2luZGV4OgorICB7CisgICAgcHVsc2VzcmMtPm11dGUgPSBtdXRlOworICAgIHB1bHNlc3JjLT5tdXRlX3NldCA9IFRSVUU7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHVsc2VzcmMsICJ3ZSBkb24ndCBoYXZlIGEgc3RyZWFtIGluZGV4Iik7CisgICAgcmV0dXJuOworICB9CittdXRlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwdWxzZXNyYywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9zdHJlYW1fc2V0X3NvdXJjZV9vdXRwdXRfbXV0ZSgpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHB1bHNlc3JjLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzcmNfc2V0X3N0cmVhbV9kZXZpY2UgKEdzdFB1bHNlU3JjICogcHVsc2VzcmMsIGNvbnN0IGdjaGFyICogZGV2aWNlKQoreworICBwYV9vcGVyYXRpb24gKm8gPSBOVUxMOworCisgIGlmICghcHVsc2VzcmMtPm1haW5sb29wKQorICAgIGdvdG8gbm9fbWFpbmxvb3A7CisKKyAgaWYgKCFwdWxzZXNyYy0+c291cmNlX291dHB1dF9pZHgpCisgICAgZ290byBub19pbmRleDsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHB1bHNlc3JjLCAic2V0dGluZyBzdHJlYW0gZGV2aWNlIHRvICVzIiwgZGV2aWNlKTsKKworICBpZiAoIShvID0gcGFfY29udGV4dF9tb3ZlX3NvdXJjZV9vdXRwdXRfYnlfbmFtZSAocHVsc2VzcmMtPmNvbnRleHQsCisgICAgICAgICAgICAgIHB1bHNlc3JjLT5zb3VyY2Vfb3V0cHV0X2lkeCwgZGV2aWNlLCBOVUxMLCBOVUxMKSkpCisgICAgZ290byBtb3ZlX2ZhaWxlZDsKKwordW5sb2NrOgorCisgIGlmIChvKQorICAgIHBhX29wZXJhdGlvbl91bnJlZiAobyk7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworCisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK25vX21haW5sb29wOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocHVsc2VzcmMsICJ3ZSBoYXZlIG5vIG1haW5sb29wIik7CisgICAgcmV0dXJuOworICB9Citub19pbmRleDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHB1bHNlc3JjLCAid2UgZG9uJ3QgaGF2ZSBhIHN0cmVhbSBpbmRleCIpOworICAgIHJldHVybjsKKyAgfQorbW92ZV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHVsc2VzcmMsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgicGFfY29udGV4dF9tb3ZlX3NvdXJjZV9vdXRwdXRfYnlfbmFtZSglcykgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICBkZXZpY2UsIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwdWxzZXNyYy0+Y29udGV4dCkpKSwKKyAgICAgICAgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9jazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworCisgIEdzdFB1bHNlU3JjICpwdWxzZXNyYyA9IEdTVF9QVUxTRVNSQ19DQVNUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TRVJWRVI6CisgICAgICBnX2ZyZWUgKHB1bHNlc3JjLT5zZXJ2ZXIpOworICAgICAgcHVsc2VzcmMtPnNlcnZlciA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RFVklDRToKKyAgICAgIGdfZnJlZSAocHVsc2VzcmMtPmRldmljZSk7CisgICAgICBwdWxzZXNyYy0+ZGV2aWNlID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBnc3RfcHVsc2VzcmNfc2V0X3N0cmVhbV9kZXZpY2UgKHB1bHNlc3JjLCBwdWxzZXNyYy0+ZGV2aWNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTElFTlRfTkFNRToKKyAgICAgIGdfZnJlZSAocHVsc2VzcmMtPmNsaWVudF9uYW1lKTsKKyAgICAgIGlmICghZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwdWxzZXNyYywKKyAgICAgICAgICAgICJFbXB0eSBQdWxzZUF1ZGlvIGNsaWVudCBuYW1lIG5vdCBhbGxvd2VkLiBSZXNldHRpbmcgdG8gZGVmYXVsdCB2YWx1ZSIpOworICAgICAgICBwdWxzZXNyYy0+Y2xpZW50X25hbWUgPSBnc3RfcHVsc2VfY2xpZW50X25hbWUgKCk7CisgICAgICB9IGVsc2UKKyAgICAgICAgcHVsc2VzcmMtPmNsaWVudF9uYW1lID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1RSRUFNX1BST1BFUlRJRVM6CisgICAgICBpZiAocHVsc2VzcmMtPnByb3BlcnRpZXMpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocHVsc2VzcmMtPnByb3BlcnRpZXMpOworICAgICAgcHVsc2VzcmMtPnByb3BlcnRpZXMgPQorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfY29weSAoZ3N0X3ZhbHVlX2dldF9zdHJ1Y3R1cmUgKHZhbHVlKSk7CisgICAgICBpZiAocHVsc2VzcmMtPnByb3BsaXN0KQorICAgICAgICBwYV9wcm9wbGlzdF9mcmVlIChwdWxzZXNyYy0+cHJvcGxpc3QpOworICAgICAgcHVsc2VzcmMtPnByb3BsaXN0ID0gZ3N0X3B1bHNlX21ha2VfcHJvcGxpc3QgKHB1bHNlc3JjLT5wcm9wZXJ0aWVzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9WT0xVTUU6CisgICAgICBnc3RfcHVsc2VzcmNfc2V0X3N0cmVhbV92b2x1bWUgKHB1bHNlc3JjLCBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTVVURToKKyAgICAgIGdzdF9wdWxzZXNyY19zZXRfc3RyZWFtX211dGUgKHB1bHNlc3JjLCBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworCisgIEdzdFB1bHNlU3JjICpwdWxzZXNyYyA9IEdTVF9QVUxTRVNSQ19DQVNUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TRVJWRVI6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBwdWxzZXNyYy0+c2VydmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERVZJQ0U6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBwdWxzZXNyYy0+ZGV2aWNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DVVJSRU5UX0RFVklDRToKKyAgICB7CisgICAgICBnY2hhciAqY3VycmVudF9kZXZpY2UgPSBnc3RfcHVsc2VzcmNfZ2V0X2N1cnJlbnRfZGV2aWNlIChwdWxzZXNyYyk7CisgICAgICBpZiAoY3VycmVudF9kZXZpY2UpCisgICAgICAgIGdfdmFsdWVfdGFrZV9zdHJpbmcgKHZhbHVlLCBjdXJyZW50X2RldmljZSk7CisgICAgICBlbHNlCisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsICIiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfREVWSUNFX05BTUU6CisgICAgICBnX3ZhbHVlX3Rha2Vfc3RyaW5nICh2YWx1ZSwgZ3N0X3B1bHNlc3JjX2RldmljZV9kZXNjcmlwdGlvbiAocHVsc2VzcmMpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTElFTlRfTkFNRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHB1bHNlc3JjLT5jbGllbnRfbmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1RSRUFNX1BST1BFUlRJRVM6CisgICAgICBnc3RfdmFsdWVfc2V0X3N0cnVjdHVyZSAodmFsdWUsIHB1bHNlc3JjLT5wcm9wZXJ0aWVzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TT1VSQ0VfT1VUUFVUX0lOREVYOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHB1bHNlc3JjLT5zb3VyY2Vfb3V0cHV0X2lkeCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVk9MVU1FOgorICAgIHsKKyAgICAgIGdkb3VibGUgdm9sdW1lOworICAgICAgZ3N0X3B1bHNlc3JjX2dldF9zb3VyY2Vfb3V0cHV0X2luZm8gKHB1bHNlc3JjLCAmdm9sdW1lLCBOVUxMKTsKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIHZvbHVtZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX01VVEU6CisgICAgeworICAgICAgZ2Jvb2xlYW4gbXV0ZTsKKyAgICAgIGdzdF9wdWxzZXNyY19nZXRfc291cmNlX291dHB1dF9pbmZvIChwdWxzZXNyYywgTlVMTCwgJm11dGUpOworICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIG11dGUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNyY19jb250ZXh0X3N0YXRlX2NiIChwYV9jb250ZXh0ICogYywgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU3JjICpwdWxzZXNyYyA9IEdTVF9QVUxTRVNSQ19DQVNUICh1c2VyZGF0YSk7CisKKyAgc3dpdGNoIChwYV9jb250ZXh0X2dldF9zdGF0ZSAoYykpIHsKKyAgICBjYXNlIFBBX0NPTlRFWFRfUkVBRFk6CisgICAgY2FzZSBQQV9DT05URVhUX1RFUk1JTkFURUQ6CisgICAgY2FzZSBQQV9DT05URVhUX0ZBSUxFRDoKKyAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCAocHVsc2VzcmMtPm1haW5sb29wLCAwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQQV9DT05URVhUX1VOQ09OTkVDVEVEOgorICAgIGNhc2UgUEFfQ09OVEVYVF9DT05ORUNUSU5HOgorICAgIGNhc2UgUEFfQ09OVEVYVF9BVVRIT1JJWklORzoKKyAgICBjYXNlIFBBX0NPTlRFWFRfU0VUVElOR19OQU1FOgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNyY19zdHJlYW1fc3RhdGVfY2IgKHBhX3N0cmVhbSAqIHMsIHZvaWQgKnVzZXJkYXRhKQoreworICBHc3RQdWxzZVNyYyAqcHVsc2VzcmMgPSBHU1RfUFVMU0VTUkNfQ0FTVCAodXNlcmRhdGEpOworCisgIHN3aXRjaCAocGFfc3RyZWFtX2dldF9zdGF0ZSAocykpIHsKKworICAgIGNhc2UgUEFfU1RSRUFNX1JFQURZOgorICAgIGNhc2UgUEFfU1RSRUFNX0ZBSUxFRDoKKyAgICBjYXNlIFBBX1NUUkVBTV9URVJNSU5BVEVEOgorICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChwdWxzZXNyYy0+bWFpbmxvb3AsIDApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBBX1NUUkVBTV9VTkNPTk5FQ1RFRDoKKyAgICBjYXNlIFBBX1NUUkVBTV9DUkVBVElORzoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzcmNfc3RyZWFtX3JlcXVlc3RfY2IgKHBhX3N0cmVhbSAqIHMsIHNpemVfdCBsZW5ndGgsIHZvaWQgKnVzZXJkYXRhKQoreworICBHc3RQdWxzZVNyYyAqcHVsc2VzcmMgPSBHU1RfUFVMU0VTUkNfQ0FTVCAodXNlcmRhdGEpOworCisgIEdTVF9MT0dfT0JKRUNUIChwdWxzZXNyYywgImdvdCByZXF1ZXN0IGZvciBsZW5ndGggJSIgR19HU0laRV9GT1JNQVQsIGxlbmd0aCk7CisKKyAgaWYgKHB1bHNlc3JjLT5pbl9yZWFkKSB7CisgICAgLyogb25seSBzaWduYWwgd2hlbiByZWFkaW5nICovCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChwdWxzZXNyYy0+bWFpbmxvb3AsIDApOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzcmNfc3RyZWFtX2xhdGVuY3lfdXBkYXRlX2NiIChwYV9zdHJlYW0gKiBzLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgY29uc3QgcGFfdGltaW5nX2luZm8gKmluZm87CisgIHBhX3VzZWNfdCBzb3VyY2VfdXNlYzsKKworICBpbmZvID0gcGFfc3RyZWFtX2dldF90aW1pbmdfaW5mbyAocyk7CisKKyAgaWYgKCFpbmZvKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKEdTVF9QVUxTRVNSQ19DQVNUICh1c2VyZGF0YSksCisgICAgICAgICJsYXRlbmN5IHVwZGF0ZSAoaW5mb3JtYXRpb24gdW5rbm93bikiKTsKKyAgICByZXR1cm47CisgIH0KKyAgc291cmNlX3VzZWMgPSBpbmZvLT5jb25maWd1cmVkX3NvdXJjZV91c2VjOworCisgIEdTVF9MT0dfT0JKRUNUIChHU1RfUFVMU0VTUkNfQ0FTVCAodXNlcmRhdGEpLAorICAgICAgImxhdGVuY3lfdXBkYXRlLCAlIiBHX0dVSU5UNjRfRk9STUFUICIsICVkOiUiIEdfR0lOVDY0X0ZPUk1BVCAiLCAlZDolIgorICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiLCAlIiBHX0dVSU5UNjRfRk9STUFUICIsICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBHU1RfVElNRVZBTF9UT19USU1FIChpbmZvLT50aW1lc3RhbXApLCBpbmZvLT53cml0ZV9pbmRleF9jb3JydXB0LAorICAgICAgaW5mby0+d3JpdGVfaW5kZXgsIGluZm8tPnJlYWRfaW5kZXhfY29ycnVwdCwgaW5mby0+cmVhZF9pbmRleCwKKyAgICAgIGluZm8tPnNvdXJjZV91c2VjLCBzb3VyY2VfdXNlYyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHVsc2VzcmNfc3RyZWFtX3VuZGVyZmxvd19jYiAocGFfc3RyZWFtICogcywgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdTVF9XQVJOSU5HX09CSkVDVCAoR1NUX1BVTFNFU1JDX0NBU1QgKHVzZXJkYXRhKSwgIkdvdCB1bmRlcmZsb3ciKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNyY19zdHJlYW1fb3ZlcmZsb3dfY2IgKHBhX3N0cmVhbSAqIHMsIHZvaWQgKnVzZXJkYXRhKQoreworICBHU1RfV0FSTklOR19PQkpFQ1QgKEdTVF9QVUxTRVNSQ19DQVNUICh1c2VyZGF0YSksICJHb3Qgb3ZlcmZsb3ciKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNyY19jb250ZXh0X3N1YnNjcmliZV9jYiAocGFfY29udGV4dCAqIGMsCisgICAgcGFfc3Vic2NyaXB0aW9uX2V2ZW50X3R5cGVfdCB0LCB1aW50MzJfdCBpZHgsIHZvaWQgKnVzZXJkYXRhKQoreworICBHc3RQdWxzZVNyYyAqcHNyYyA9IEdTVF9QVUxTRVNSQyAodXNlcmRhdGEpOworCisgIGlmICh0ICE9IChQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU09VUkNFX09VVFBVVCB8IFBBX1NVQlNDUklQVElPTl9FVkVOVF9DSEFOR0UpCisgICAgICAmJiB0ICE9IChQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU09VUkNFX09VVFBVVCB8IFBBX1NVQlNDUklQVElPTl9FVkVOVF9ORVcpKQorICAgIHJldHVybjsKKworICBpZiAoaWR4ICE9IHBzcmMtPnNvdXJjZV9vdXRwdXRfaWR4KQorICAgIHJldHVybjsKKworICAvKiBBY3R1YWxseSB0aGlzIGV2ZW50IGlzIGFsc28gdHJpZ2dlcmVkIHdoZW4gb3RoZXIgcHJvcGVydGllcyBvZiB0aGUgc3RyZWFtCisgICAqIGNoYW5nZSB0aGF0IGFyZSB1bnJlbGF0ZWQgdG8gdGhlIHZvbHVtZS4gSG93ZXZlciBpdCBpcyBwcm9iYWJseSBjaGVhcGVyIHRvCisgICAqIHNpZ25hbCB0aGUgY2hhbmdlIGhlcmUgYW5kIGNoZWNrIGZvciB0aGUgdm9sdW1lIHdoZW4gdGhlIEdPYmplY3QgcHJvcGVydHkKKyAgICogaXMgcmVhZCBpbnN0ZWFkIG9mIHF1ZXJ5aW5nIGl0IGFsd2F5cy4gKi8KKworICAvKiBpbmZvcm0gc3RyZWFtaW5nIHRocmVhZCB0byBub3RpZnkgKi8KKyAgZ19hdG9taWNfaW50X2NvbXBhcmVfYW5kX2V4Y2hhbmdlICgmcHNyYy0+bm90aWZ5LCAwLCAxKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VzcmNfb3BlbiAoR3N0QXVkaW9TcmMgKiBhc3JjKQoreworICBHc3RQdWxzZVNyYyAqcHVsc2VzcmMgPSBHU1RfUFVMU0VTUkNfQ0FTVCAoYXNyYyk7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICBnX2Fzc2VydCAoIXB1bHNlc3JjLT5jb250ZXh0KTsKKyAgZ19hc3NlcnQgKCFwdWxzZXNyYy0+c3RyZWFtKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgIm9wZW5pbmcgZGV2aWNlIik7CisKKyAgaWYgKCEocHVsc2VzcmMtPmNvbnRleHQgPQorICAgICAgICAgIHBhX2NvbnRleHRfbmV3IChwYV90aHJlYWRlZF9tYWlubG9vcF9nZXRfYXBpIChwdWxzZXNyYy0+bWFpbmxvb3ApLAorICAgICAgICAgICAgICBwdWxzZXNyYy0+Y2xpZW50X25hbWUpKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwdWxzZXNyYywgUkVTT1VSQ0UsIEZBSUxFRCwgKCJGYWlsZWQgdG8gY3JlYXRlIGNvbnRleHQiKSwKKyAgICAgICAgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9ja19hbmRfZmFpbDsKKyAgfQorCisgIHBhX2NvbnRleHRfc2V0X3N0YXRlX2NhbGxiYWNrIChwdWxzZXNyYy0+Y29udGV4dCwKKyAgICAgIGdzdF9wdWxzZXNyY19jb250ZXh0X3N0YXRlX2NiLCBwdWxzZXNyYyk7CisgIHBhX2NvbnRleHRfc2V0X3N1YnNjcmliZV9jYWxsYmFjayAocHVsc2VzcmMtPmNvbnRleHQsCisgICAgICBnc3RfcHVsc2VzcmNfY29udGV4dF9zdWJzY3JpYmVfY2IsIHB1bHNlc3JjKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgImNvbm5lY3QgdG8gc2VydmVyICVzIiwKKyAgICAgIEdTVF9TVFJfTlVMTCAocHVsc2VzcmMtPnNlcnZlcikpOworCisgIGlmIChwYV9jb250ZXh0X2Nvbm5lY3QgKHB1bHNlc3JjLT5jb250ZXh0LCBwdWxzZXNyYy0+c2VydmVyLCAwLCBOVUxMKSA8IDApIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHVsc2VzcmMsIFJFU09VUkNFLCBGQUlMRUQsICgiRmFpbGVkIHRvIGNvbm5lY3Q6ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwdWxzZXNyYy0+Y29udGV4dCkpKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9ja19hbmRfZmFpbDsKKyAgfQorCisgIGZvciAoOzspIHsKKyAgICBwYV9jb250ZXh0X3N0YXRlX3Qgc3RhdGU7CisKKyAgICBzdGF0ZSA9IHBhX2NvbnRleHRfZ2V0X3N0YXRlIChwdWxzZXNyYy0+Y29udGV4dCk7CisKKyAgICBpZiAoIVBBX0NPTlRFWFRfSVNfR09PRCAoc3RhdGUpKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHVsc2VzcmMsIFJFU09VUkNFLCBGQUlMRUQsICgiRmFpbGVkIHRvIGNvbm5lY3Q6ICVzIiwKKyAgICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHB1bHNlc3JjLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgICAgZ290byB1bmxvY2tfYW5kX2ZhaWw7CisgICAgfQorCisgICAgaWYgKHN0YXRlID09IFBBX0NPTlRFWFRfUkVBRFkpCisgICAgICBicmVhazsKKworICAgIC8qIFdhaXQgdW50aWwgdGhlIGNvbnRleHQgaXMgcmVhZHkgKi8KKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0IChwdWxzZXNyYy0+bWFpbmxvb3ApOworICB9CisgIEdTVF9ERUJVR19PQkpFQ1QgKHB1bHNlc3JjLCAiY29ubmVjdGVkIik7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLwordW5sb2NrX2FuZF9mYWlsOgorICB7CisgICAgZ3N0X3B1bHNlc3JjX2Rlc3Ryb3lfY29udGV4dCAocHVsc2VzcmMpOworCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworCisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3B1bHNlc3JjX2Nsb3NlIChHc3RBdWRpb1NyYyAqIGFzcmMpCit7CisgIEdzdFB1bHNlU3JjICpwdWxzZXNyYyA9IEdTVF9QVUxTRVNSQ19DQVNUIChhc3JjKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworICBnc3RfcHVsc2VzcmNfZGVzdHJveV9jb250ZXh0IChwdWxzZXNyYyk7CisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VzcmNfdW5wcmVwYXJlIChHc3RBdWRpb1NyYyAqIGFzcmMpCit7CisgIEdzdFB1bHNlU3JjICpwdWxzZXNyYyA9IEdTVF9QVUxTRVNSQ19DQVNUIChhc3JjKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworICBnc3RfcHVsc2VzcmNfZGVzdHJveV9zdHJlYW0gKHB1bHNlc3JjKTsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKHB1bHNlc3JjLT5tYWlubG9vcCk7CisKKyAgcHVsc2VzcmMtPnJlYWRfYnVmZmVyID0gTlVMTDsKKyAgcHVsc2VzcmMtPnJlYWRfYnVmZmVyX2xlbmd0aCA9IDA7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBndWludAorZ3N0X3B1bHNlc3JjX3JlYWQgKEdzdEF1ZGlvU3JjICogYXNyYywgZ3BvaW50ZXIgZGF0YSwgZ3VpbnQgbGVuZ3RoLAorICAgIEdzdENsb2NrVGltZSAqIHRpbWVzdGFtcCkKK3sKKyAgR3N0UHVsc2VTcmMgKnB1bHNlc3JjID0gR1NUX1BVTFNFU1JDX0NBU1QgKGFzcmMpOworICBzaXplX3Qgc3VtID0gMDsKKworICBpZiAoZ19hdG9taWNfaW50X2NvbXBhcmVfYW5kX2V4Y2hhbmdlICgmcHVsc2VzcmMtPm5vdGlmeSwgMSwgMCkpIHsKKyAgICBnX29iamVjdF9ub3RpZnkgKEdfT0JKRUNUIChwdWxzZXNyYyksICJ2b2x1bWUiKTsKKyAgICBnX29iamVjdF9ub3RpZnkgKEdfT0JKRUNUIChwdWxzZXNyYyksICJtdXRlIik7CisgICAgZ19vYmplY3Rfbm90aWZ5IChHX09CSkVDVCAocHVsc2VzcmMpLCAiY3VycmVudC1kZXZpY2UiKTsKKyAgfQorCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKHB1bHNlc3JjLT5tYWlubG9vcCk7CisgIHB1bHNlc3JjLT5pbl9yZWFkID0gVFJVRTsKKworICBpZiAoIXB1bHNlc3JjLT5zdHJlYW1fY29ubmVjdGVkKQorICAgIGdvdG8gbm90X2Nvbm5lY3RlZDsKKworICBpZiAocHVsc2VzcmMtPnBhdXNlZCkKKyAgICBnb3RvIHdhc19wYXVzZWQ7CisKKyAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICBzaXplX3QgbDsKKworICAgIEdTVF9MT0dfT0JKRUNUIChwdWxzZXNyYywgInJlYWRpbmcgJXUgYnl0ZXMiLCBsZW5ndGgpOworCisgICAgLypjaGVjayBpZiB3ZSBoYXZlIGEgbGVmdG92ZXIgYnVmZmVyICovCisgICAgaWYgKCFwdWxzZXNyYy0+cmVhZF9idWZmZXIpIHsKKyAgICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKGdzdF9wdWxzZXNyY19pc19kZWFkIChwdWxzZXNyYywgVFJVRSkpCisgICAgICAgICAgZ290byB1bmxvY2tfYW5kX2ZhaWw7CisKKyAgICAgICAgLyogcmVhZCBhbGwgYXZhaWxhYmxlIGRhdGEsIHdlIGtlZXAgYSBwb2ludGVyIHRvIHRoZSBkYXRhIGFuZCB0aGUgbGVuZ3RoCisgICAgICAgICAqIGFuZCB0YWtlIGZyb20gaXQgd2hhdCB3ZSBuZWVkLiAqLworICAgICAgICBpZiAocGFfc3RyZWFtX3BlZWsgKHB1bHNlc3JjLT5zdHJlYW0sICZwdWxzZXNyYy0+cmVhZF9idWZmZXIsCisgICAgICAgICAgICAgICAgJnB1bHNlc3JjLT5yZWFkX2J1ZmZlcl9sZW5ndGgpIDwgMCkKKyAgICAgICAgICBnb3RvIHBlZWtfZmFpbGVkOworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwdWxzZXNyYywgImhhdmUgZGF0YSBvZiAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwKKyAgICAgICAgICAgIHB1bHNlc3JjLT5yZWFkX2J1ZmZlcl9sZW5ndGgpOworCisgICAgICAgIC8qIGlmIHdlIGhhdmUgZGF0YSwgcHJvY2VzcyBpZiAqLworICAgICAgICBpZiAocHVsc2VzcmMtPnJlYWRfYnVmZmVyICYmIHB1bHNlc3JjLT5yZWFkX2J1ZmZlcl9sZW5ndGgpCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogbm93IHdhaXQgZm9yIG1vcmUgZGF0YSB0byBiZWNvbWUgYXZhaWxhYmxlICovCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwdWxzZXNyYywgIndhaXRpbmcgZm9yIGRhdGEiKTsKKyAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICAgICAgICBpZiAocHVsc2VzcmMtPnBhdXNlZCkKKyAgICAgICAgICBnb3RvIHdhc19wYXVzZWQ7CisgICAgICB9CisgICAgfQorCisgICAgbCA9IHB1bHNlc3JjLT5yZWFkX2J1ZmZlcl9sZW5ndGggPgorICAgICAgICBsZW5ndGggPyBsZW5ndGggOiBwdWxzZXNyYy0+cmVhZF9idWZmZXJfbGVuZ3RoOworCisgICAgbWVtY3B5IChkYXRhLCBwdWxzZXNyYy0+cmVhZF9idWZmZXIsIGwpOworCisgICAgcHVsc2VzcmMtPnJlYWRfYnVmZmVyID0gKGNvbnN0IGd1aW50OCAqKSBwdWxzZXNyYy0+cmVhZF9idWZmZXIgKyBsOworICAgIHB1bHNlc3JjLT5yZWFkX2J1ZmZlcl9sZW5ndGggLT0gbDsKKworICAgIGRhdGEgPSAoZ3VpbnQ4ICopIGRhdGEgKyBsOworICAgIGxlbmd0aCAtPSBsOworICAgIHN1bSArPSBsOworCisgICAgaWYgKHB1bHNlc3JjLT5yZWFkX2J1ZmZlcl9sZW5ndGggPD0gMCkgeworICAgICAgLyogd2UgY29waWVkIGFsbCBvZiB0aGUgZGF0YSwgZHJvcCBpdCBub3cgKi8KKyAgICAgIGlmIChwYV9zdHJlYW1fZHJvcCAocHVsc2VzcmMtPnN0cmVhbSkgPCAwKQorICAgICAgICBnb3RvIGRyb3BfZmFpbGVkOworCisgICAgICAvKiByZXNldCBwb2ludGVyIHRvIGRhdGEgKi8KKyAgICAgIHB1bHNlc3JjLT5yZWFkX2J1ZmZlciA9IE5VTEw7CisgICAgICBwdWxzZXNyYy0+cmVhZF9idWZmZXJfbGVuZ3RoID0gMDsKKyAgICB9CisgIH0KKworICBwdWxzZXNyYy0+aW5fcmVhZCA9IEZBTFNFOworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKHB1bHNlc3JjLT5tYWlubG9vcCk7CisKKyAgcmV0dXJuIHN1bTsKKworICAvKiBFUlJPUlMgKi8KK25vdF9jb25uZWN0ZWQ6CisgIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocHVsc2VzcmMsICJ3ZSBhcmUgbm90IGNvbm5lY3RlZCIpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9Cit3YXNfcGF1c2VkOgorICB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHB1bHNlc3JjLCAid2UgYXJlIHBhdXNlZCIpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9CitwZWVrX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwdWxzZXNyYywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9zdHJlYW1fcGVlaygpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHB1bHNlc3JjLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9Citkcm9wX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwdWxzZXNyYywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9zdHJlYW1fZHJvcCgpIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHB1bHNlc3JjLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9Cit1bmxvY2tfYW5kX2ZhaWw6CisgIHsKKyAgICBwdWxzZXNyYy0+aW5fcmVhZCA9IEZBTFNFOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICAgIHJldHVybiAoZ3VpbnQpIC0gMTsKKyAgfQorfQorCisvKiByZXR1cm4gdGhlIGRlbGF5IGluIHNhbXBsZXMgKi8KK3N0YXRpYyBndWludAorZ3N0X3B1bHNlc3JjX2RlbGF5IChHc3RBdWRpb1NyYyAqIGFzcmMpCit7CisgIEdzdFB1bHNlU3JjICpwdWxzZXNyYyA9IEdTVF9QVUxTRVNSQ19DQVNUIChhc3JjKTsKKyAgcGFfdXNlY190IHQ7CisgIGludCBuZWdhdGl2ZSwgcmVzOworICBndWludCByZXN1bHQ7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKyAgaWYgKGdzdF9wdWxzZXNyY19pc19kZWFkIChwdWxzZXNyYywgVFJVRSkpCisgICAgZ290byBzZXJ2ZXJfZGVhZDsKKworICAvKiBnZXQgdGhlIGxhdGVuY3ksIHRoaXMgY2FuIGZhaWwgd2hlbiB3ZSBkb24ndCBoYXZlIGEgbGF0ZW5jeSB1cGRhdGUgeWV0LgorICAgKiBXZSBkb24ndCB3YW50IHRvIHdhaXQgZm9yIGxhdGVuY3kgdXBkYXRlcyBoZXJlIGJ1dCB3ZSBqdXN0IHJldHVybiAwLiAqLworICByZXMgPSBwYV9zdHJlYW1fZ2V0X2xhdGVuY3kgKHB1bHNlc3JjLT5zdHJlYW0sICZ0LCAmbmVnYXRpdmUpOworCisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICBpZiAocmVzIDwgMCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHB1bHNlc3JjLCAiY291bGQgbm90IGdldCBsYXRlbmN5Iik7CisgICAgcmVzdWx0ID0gMDsKKyAgfSBlbHNlIHsKKyAgICBpZiAobmVnYXRpdmUpCisgICAgICByZXN1bHQgPSAwOworICAgIGVsc2UKKyAgICAgIHJlc3VsdCA9IChndWludCkgKCh0ICogcHVsc2VzcmMtPnNhbXBsZV9zcGVjLnJhdGUpIC8gMTAwMDAwMExMKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworCisgIC8qIEVSUk9SUyAqLworc2VydmVyX2RlYWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgInRoZSBzZXJ2ZXIgaXMgZGVhZCIpOworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wdWxzZXNyY19jcmVhdGVfc3RyZWFtIChHc3RQdWxzZVNyYyAqIHB1bHNlc3JjLCBHc3RDYXBzICoqIGNhcHMsCisgICAgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHJzcGVjKQoreworICBwYV9jaGFubmVsX21hcCBjaGFubmVsX21hcDsKKyAgY29uc3QgcGFfY2hhbm5lbF9tYXAgKm07CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgZ2Jvb2xlYW4gbmVlZF9jaGFubmVsX2xheW91dCA9IEZBTFNFOworICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjIG5ld19zcGVjLCAqc3BlYyA9IE5VTEw7CisgIGNvbnN0IGdjaGFyICpuYW1lOworICBpbnQgaTsKKworICAvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBzdHJlYW0gKHJlbmVnb3RpYXRpb24pLCBmcmVlIGl0IGZpcnN0ICovCisgIGlmIChwdWxzZXNyYy0+c3RyZWFtKQorICAgIGdzdF9wdWxzZXNyY19kZXN0cm95X3N0cmVhbSAocHVsc2VzcmMpOworCisgIGlmIChyc3BlYykgeworICAgIC8qIFBvc3QtbmVnb3RpYXRpb24sIHdlIGFscmVhZHkgaGF2ZSBhIHJpbmdidWZmZXIgc3BlYywgc28gd2UganVzdCBuZWVkIHRvCisgICAgICogdXNlIGl0IHRvIGNyZWF0ZSBhIHN0cmVhbS4gKi8KKyAgICBzcGVjID0gcnNwZWM7CisKKyAgICAvKiBBdCB0aGlzIHBvaW50LCB3ZSBleHBlY3QgdGhlIGNoYW5uZWwtbWFzayB0byBiZSBzZXQgaW4gY2Fwcywgc28gd2UganVzdAorICAgICAqIHVzZSB0aGF0ICovCisgICAgaWYgKCFnc3RfcHVsc2VfZ3N0X3RvX2NoYW5uZWxfbWFwICgmY2hhbm5lbF9tYXAsIHNwZWMpKQorICAgICAgZ290byBpbnZhbGlkX3NwZWM7CisKKyAgfSBlbHNlIGlmIChjYXBzKSB7CisgICAgLyogQXQgbmVnb3RpYXRpb24gdGltZSwgd2UgZ2V0IGEgZml4ZWQgY2FwcyBhbmQgdXNlIGl0IHRvIHNldCB1cCBhIHN0cmVhbSAqLworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlICgqY2FwcywgMCk7CisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAiY2hhbm5lbHMiLCAmbmV3X3NwZWMuaW5mby5jaGFubmVscyk7CisgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgImNoYW5uZWwtbWFzayIpKSB7CisgICAgICBpZiAobmV3X3NwZWMuaW5mby5jaGFubmVscyA9PSAxKSB7CisgICAgICAgIHBhX2NoYW5uZWxfbWFwX2luaXRfbW9ubyAoJmNoYW5uZWxfbWFwKTsKKyAgICAgIH0gZWxzZSBpZiAobmV3X3NwZWMuaW5mby5jaGFubmVscyA9PSAyKSB7CisgICAgICAgIHBhX2NoYW5uZWxfbWFwX2luaXRfc3RlcmVvICgmY2hhbm5lbF9tYXApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmVlZF9jaGFubmVsX2xheW91dCA9IFRSVUU7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiY2hhbm5lbC1tYXNrIiwgR1NUX1RZUEVfQklUTUFTSywKKyAgICAgICAgICAgIEdfR1VJTlQ2NF9DT05TVEFOVCAoMCksIE5VTEwpOworICAgICAgfQorICAgIH0KKworICAgIG1lbXNldCAoJm5ld19zcGVjLCAwLCBzaXplb2YgKEdzdEF1ZGlvUmluZ0J1ZmZlclNwZWMpKTsKKyAgICBuZXdfc3BlYy5sYXRlbmN5X3RpbWUgPSBHU1RfU0VDT05EOworICAgIGlmICghZ3N0X2F1ZGlvX3JpbmdfYnVmZmVyX3BhcnNlX2NhcHMgKCZuZXdfc3BlYywgKmNhcHMpKQorICAgICAgZ290byBpbnZhbGlkX2NhcHM7CisKKyAgICAvKiBLZWVwIHRoZSByZWZjb3VudCBvZiB0aGUgY2FwcyBhdCAxIHRvIG1ha2UgdGhlbSB3cml0YWJsZSAqLworICAgIGdzdF9jYXBzX3VucmVmIChuZXdfc3BlYy5jYXBzKTsKKworICAgIGlmICghbmVlZF9jaGFubmVsX2xheW91dAorICAgICAgICAmJiAhZ3N0X3B1bHNlX2dzdF90b19jaGFubmVsX21hcCAoJmNoYW5uZWxfbWFwLCAmbmV3X3NwZWMpKSB7CisgICAgICBuZWVkX2NoYW5uZWxfbGF5b3V0ID0gVFJVRTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiY2hhbm5lbC1tYXNrIiwgR1NUX1RZUEVfQklUTUFTSywKKyAgICAgICAgICBHX0dVSU5UNjRfQ09OU1RBTlQgKDApLCBOVUxMKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBHX05fRUxFTUVOVFMgKG5ld19zcGVjLmluZm8ucG9zaXRpb24pOyBpKyspCisgICAgICAgIG5ld19zcGVjLmluZm8ucG9zaXRpb25baV0gPSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9JTlZBTElEOworICAgIH0KKworICAgIHNwZWMgPSAmbmV3X3NwZWM7CisgIH0gZWxzZSB7CisgICAgLyogIXJzcGVjICYmICFjYXBzICovCisgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgIH0KKworICBpZiAoIWdzdF9wdWxzZV9maWxsX3NhbXBsZV9zcGVjIChzcGVjLCAmcHVsc2VzcmMtPnNhbXBsZV9zcGVjKSkKKyAgICBnb3RvIGludmFsaWRfc3BlYzsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworCisgIGlmICghcHVsc2VzcmMtPmNvbnRleHQpCisgICAgZ290byBiYWRfY29udGV4dDsKKworICBuYW1lID0gIlJlY29yZCBTdHJlYW0iOworICBpZiAocHVsc2VzcmMtPnByb3BsaXN0KSB7CisgICAgaWYgKCEocHVsc2VzcmMtPnN0cmVhbSA9IHBhX3N0cmVhbV9uZXdfd2l0aF9wcm9wbGlzdCAocHVsc2VzcmMtPmNvbnRleHQsCisgICAgICAgICAgICAgICAgbmFtZSwgJnB1bHNlc3JjLT5zYW1wbGVfc3BlYywKKyAgICAgICAgICAgICAgICAobmVlZF9jaGFubmVsX2xheW91dCkgPyBOVUxMIDogJmNoYW5uZWxfbWFwLAorICAgICAgICAgICAgICAgIHB1bHNlc3JjLT5wcm9wbGlzdCkpKQorICAgICAgZ290byBjcmVhdGVfZmFpbGVkOworCisgIH0gZWxzZSBpZiAoIShwdWxzZXNyYy0+c3RyZWFtID0gcGFfc3RyZWFtX25ldyAocHVsc2VzcmMtPmNvbnRleHQsCisgICAgICAgICAgICAgIG5hbWUsICZwdWxzZXNyYy0+c2FtcGxlX3NwZWMsCisgICAgICAgICAgICAgIChuZWVkX2NoYW5uZWxfbGF5b3V0KSA/IE5VTEwgOiAmY2hhbm5lbF9tYXApKSkKKyAgICBnb3RvIGNyZWF0ZV9mYWlsZWQ7CisKKyAgaWYgKGNhcHMpIHsKKyAgICBtID0gcGFfc3RyZWFtX2dldF9jaGFubmVsX21hcCAocHVsc2VzcmMtPnN0cmVhbSk7CisgICAgZ3N0X3B1bHNlX2NoYW5uZWxfbWFwX3RvX2dzdCAobSwgJm5ld19zcGVjKTsKKyAgICBnc3RfYXVkaW9fY2hhbm5lbF9wb3NpdGlvbnNfdG9fdmFsaWRfb3JkZXIgKG5ld19zcGVjLmluZm8ucG9zaXRpb24sCisgICAgICAgIG5ld19zcGVjLmluZm8uY2hhbm5lbHMpOworICAgIGdzdF9jYXBzX3VucmVmICgqY2Fwcyk7CisgICAgKmNhcHMgPSBnc3RfYXVkaW9faW5mb190b19jYXBzICgmbmV3X3NwZWMuaW5mbyk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgIkNhcHMgYXJlICUiIEdTVF9QVFJfRk9STUFULCAqY2Fwcyk7CisgIH0KKworCisgIHBhX3N0cmVhbV9zZXRfc3RhdGVfY2FsbGJhY2sgKHB1bHNlc3JjLT5zdHJlYW0sIGdzdF9wdWxzZXNyY19zdHJlYW1fc3RhdGVfY2IsCisgICAgICBwdWxzZXNyYyk7CisgIHBhX3N0cmVhbV9zZXRfcmVhZF9jYWxsYmFjayAocHVsc2VzcmMtPnN0cmVhbSwgZ3N0X3B1bHNlc3JjX3N0cmVhbV9yZXF1ZXN0X2NiLAorICAgICAgcHVsc2VzcmMpOworICBwYV9zdHJlYW1fc2V0X3VuZGVyZmxvd19jYWxsYmFjayAocHVsc2VzcmMtPnN0cmVhbSwKKyAgICAgIGdzdF9wdWxzZXNyY19zdHJlYW1fdW5kZXJmbG93X2NiLCBwdWxzZXNyYyk7CisgIHBhX3N0cmVhbV9zZXRfb3ZlcmZsb3dfY2FsbGJhY2sgKHB1bHNlc3JjLT5zdHJlYW0sCisgICAgICBnc3RfcHVsc2VzcmNfc3RyZWFtX292ZXJmbG93X2NiLCBwdWxzZXNyYyk7CisgIHBhX3N0cmVhbV9zZXRfbGF0ZW5jeV91cGRhdGVfY2FsbGJhY2sgKHB1bHNlc3JjLT5zdHJlYW0sCisgICAgICBnc3RfcHVsc2VzcmNfc3RyZWFtX2xhdGVuY3lfdXBkYXRlX2NiLCBwdWxzZXNyYyk7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworaW52YWxpZF9jYXBzOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHB1bHNlc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgICgiQ2FuJ3QgcGFyc2UgY2Fwcy4iKSwgKE5VTEwpKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KK2ludmFsaWRfc3BlYzoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwdWxzZXNyYywgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoIkludmFsaWQgc2FtcGxlIHNwZWNpZmljYXRpb24uIiksIChOVUxMKSk7CisgICAgZ290byBmYWlsOworICB9CitiYWRfY29udGV4dDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwdWxzZXNyYywgUkVTT1VSQ0UsIEZBSUxFRCwgKCJCYWQgY29udGV4dCIpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9CitjcmVhdGVfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHB1bHNlc3JjLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoIkZhaWxlZCB0byBjcmVhdGUgc3RyZWFtOiAlcyIsCisgICAgICAgICAgICBwYV9zdHJlcnJvciAocGFfY29udGV4dF9lcnJubyAocHVsc2VzcmMtPmNvbnRleHQpKSksIChOVUxMKSk7CisgICAgZ290byB1bmxvY2tfYW5kX2ZhaWw7CisgIH0KK3VubG9ja19hbmRfZmFpbDoKKyAgeworICAgIGdzdF9wdWxzZXNyY19kZXN0cm95X3N0cmVhbSAocHVsc2VzcmMpOworCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworCisgIGZhaWw6CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3B1bHNlc3JjX2V2ZW50IChHc3RCYXNlU3JjICogYmFzZXNyYywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXNyYywgImhhbmRsZSBldmVudCAlIiBHU1RfUFRSX0ZPUk1BVCwgZXZlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1JFQ09ORklHVVJFOgorICAgICAgZ3N0X3BhZF9jaGVja19yZWNvbmZpZ3VyZSAoR1NUX0JBU0VfU1JDX1BBRCAoYmFzZXNyYykpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBHU1RfQkFTRV9TUkNfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmV2ZW50IChiYXNlc3JjLCBldmVudCk7Cit9CisKKy8qIFRoaXMgaXMgZXNzZW50aWFsbHkgZ3N0X2Jhc2Vfc3JjX25lZ290aWF0ZV9kZWZhdWx0KCkgYnV0IHRoZSBjYXBzCisgKiBhcmUgZ3VhcmFudGVlZCB0byBoYXZlIGEgY2hhbm5lbCBsYXlvdXQgZm9yID4gMiBjaGFubmVscworICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wdWxzZXNyY19uZWdvdGlhdGUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKQoreworICBHc3RQdWxzZVNyYyAqcHVsc2VzcmMgPSBHU1RfUFVMU0VTUkNfQ0FTVCAoYmFzZXNyYyk7CisgIEdzdENhcHMgKnRoaXNjYXBzOworICBHc3RDYXBzICpjYXBzID0gTlVMTDsKKyAgR3N0Q2FwcyAqcGVlcmNhcHMgPSBOVUxMOworICBnYm9vbGVhbiByZXN1bHQgPSBGQUxTRTsKKworICAvKiBmaXJzdCBzZWUgd2hhdCBpcyBwb3NzaWJsZSBvbiBvdXIgc291cmNlIHBhZCAqLworICB0aGlzY2FwcyA9IGdzdF9wYWRfcXVlcnlfY2FwcyAoR1NUX0JBU0VfU1JDX1BBRCAoYmFzZXNyYyksIE5VTEwpOworICBHU1RfREVCVUdfT0JKRUNUIChiYXNlc3JjLCAiY2FwcyBvZiBzcmM6ICUiIEdTVF9QVFJfRk9STUFULCB0aGlzY2Fwcyk7CisgIC8qIG5vdGhpbmcgb3IgYW55dGhpbmcgaXMgYWxsb3dlZCwgd2UncmUgZG9uZSAqLworICBpZiAodGhpc2NhcHMgPT0gTlVMTCB8fCBnc3RfY2Fwc19pc19hbnkgKHRoaXNjYXBzKSkKKyAgICBnb3RvIG5vX25lZ29fbmVlZGVkOworCisgIC8qIGdldCB0aGUgcGVlciBjYXBzICovCisgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1NSQ19QQUQgKGJhc2VzcmMpLCBOVUxMKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXNyYywgImNhcHMgb2YgcGVlcjogJSIgR1NUX1BUUl9GT1JNQVQsIHBlZXJjYXBzKTsKKyAgaWYgKHBlZXJjYXBzKSB7CisgICAgLyogZ2V0IGludGVyc2VjdGlvbiAqLworICAgIGNhcHMgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHRoaXNjYXBzLCBwZWVyY2Fwcyk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXNyYywgImludGVyc2VjdDogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmICh0aGlzY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBubyBwZWVyLCB3b3JrIHdpdGggb3VyIG93biBjYXBzIHRoZW4gKi8KKyAgICBjYXBzID0gdGhpc2NhcHM7CisgIH0KKyAgaWYgKGNhcHMpIHsKKyAgICAvKiB0YWtlIGZpcnN0IChhbmQgYmVzdCwgc2luY2UgdGhleSBhcmUgc29ydGVkKSBwb3NzaWJpbGl0eSAqLworICAgIGNhcHMgPSBnc3RfY2Fwc190cnVuY2F0ZSAoY2Fwcyk7CisKKyAgICAvKiBub3cgZml4YXRlICovCisgICAgaWYgKCFnc3RfY2Fwc19pc19lbXB0eSAoY2FwcykpIHsKKyAgICAgIGNhcHMgPSBHU1RfQkFTRV9TUkNfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpeGF0ZSAoYmFzZXNyYywgY2Fwcyk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChiYXNlc3JjLCAiZml4YXRlZCB0bzogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgICAgICBpZiAoZ3N0X2NhcHNfaXNfYW55IChjYXBzKSkgeworICAgICAgICAvKiBobW0sIHN0aWxsIGFueXRoaW5nLCBzbyBlbGVtZW50IGNhbiBkbyBhbnl0aGluZyBhbmQKKyAgICAgICAgICogbmVnbyBpcyBub3QgbmVlZGVkICovCisgICAgICAgIHJlc3VsdCA9IFRSVUU7CisgICAgICB9IGVsc2UgaWYgKGdzdF9jYXBzX2lzX2ZpeGVkIChjYXBzKSkgeworICAgICAgICAvKiB5YXksIGZpeGVkIGNhcHMsIHVzZSB0aG9zZSB0aGVuICovCisgICAgICAgIHJlc3VsdCA9IGdzdF9wdWxzZXNyY19jcmVhdGVfc3RyZWFtIChwdWxzZXNyYywgJmNhcHMsIE5VTEwpOworICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgIHJlc3VsdCA9IGdzdF9iYXNlX3NyY19zZXRfY2FwcyAoYmFzZXNyYywgY2Fwcyk7CisgICAgICB9CisgICAgfQorICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworCitub19uZWdvX25lZWRlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VzcmMsICJubyBuZWdvdGlhdGlvbiBuZWVkZWQiKTsKKyAgICBpZiAodGhpc2NhcHMpCisgICAgICBnc3RfY2Fwc191bnJlZiAodGhpc2NhcHMpOworICAgIHJldHVybiBUUlVFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3B1bHNlc3JjX3ByZXBhcmUgKEdzdEF1ZGlvU3JjICogYXNyYywgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpCit7CisgIHBhX2J1ZmZlcl9hdHRyIHdhbnRlZDsKKyAgY29uc3QgcGFfYnVmZmVyX2F0dHIgKmFjdHVhbDsKKyAgR3N0UHVsc2VTcmMgKnB1bHNlc3JjID0gR1NUX1BVTFNFU1JDX0NBU1QgKGFzcmMpOworICBwYV9zdHJlYW1fZmxhZ3NfdCBmbGFnczsKKyAgcGFfb3BlcmF0aW9uICpvOworICBHc3RBdWRpb0Nsb2NrICpjbG9jazsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworCisgIGlmICghcHVsc2VzcmMtPnN0cmVhbSkKKyAgICBnc3RfcHVsc2VzcmNfY3JlYXRlX3N0cmVhbSAocHVsc2VzcmMsIE5VTEwsIHNwZWMpOworCisgIHsKKyAgICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjIHMgPSAqc3BlYzsKKyAgICBjb25zdCBwYV9jaGFubmVsX21hcCAqbTsKKworICAgIG0gPSBwYV9zdHJlYW1fZ2V0X2NoYW5uZWxfbWFwIChwdWxzZXNyYy0+c3RyZWFtKTsKKyAgICBnc3RfcHVsc2VfY2hhbm5lbF9tYXBfdG9fZ3N0IChtLCAmcyk7CisgICAgZ3N0X2F1ZGlvX3JpbmdfYnVmZmVyX3NldF9jaGFubmVsX3Bvc2l0aW9ucyAoR1NUX0FVRElPX0JBU0VfU1JDCisgICAgICAgIChwdWxzZXNyYyktPnJpbmdidWZmZXIsIHMuaW5mby5wb3NpdGlvbik7CisgIH0KKworICAvKiBlbmFibGUgZXZlbnQgbm90aWZpY2F0aW9ucyAqLworICBHU1RfTE9HX09CSkVDVCAocHVsc2VzcmMsICJzdWJzY3JpYmluZyB0byBjb250ZXh0IGV2ZW50cyIpOworICBpZiAoIShvID0gcGFfY29udGV4dF9zdWJzY3JpYmUgKHB1bHNlc3JjLT5jb250ZXh0LAorICAgICAgICAgICAgICBQQV9TVUJTQ1JJUFRJT05fTUFTS19TT1VSQ0VfT1VUUFVULCBOVUxMLCBOVUxMKSkpIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocHVsc2VzcmMsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgicGFfY29udGV4dF9zdWJzY3JpYmUoKSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwdWxzZXNyYy0+Y29udGV4dCkpKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9ja19hbmRfZmFpbDsKKyAgfQorCisgIHBhX29wZXJhdGlvbl91bnJlZiAobyk7CisKKyAgLyogVGhlcmUncyBhIGJpdCBvZiBhIGRpc2Nvbm5lY3QgaGVyZSBiZXR3ZWVuIHRoZSBhdWRpbyByaW5nYnVmZmVyIGFuZCB3aGF0CisgICAqIFB1bHNlQXVkaW8gcHJvdmlkZXMuIFRoZSBhdWRpbyByaW5nYnVmZmVyIHByb3ZpZGUgYSB0b3RhbCBvZiBidWZmZXJfdGltZQorICAgKiB3b3J0aCBvZiBidWZmZXJpbmcsIGRpdmlkZWQgaW50byBzZWdtZW50cyBvZiBsYXRlbmN5X3RpbWUgc2l6ZS4gV2UncmUKKyAgICogYXNraW5nIFB1bHNlQXVkaW8gdG8gcHJvdmlkZSBhIHRvdGFsIGxhdGVuY3kgb2YgbGF0ZW5jeV90aW1lLCB3aGljaCwgd2l0aAorICAgKiBQQV9TVFJFQU1fQURKVVNUX0xBVEVOQ1ksIGVmZmVjdGl2ZWx5IHNldHMgaXRzZWxmIHVwIGFzIGEgcmluZ2J1ZmZlciB3aXRoCisgICAqIG9uZSBzZWdtZW50IGJlaW5nIHRoZSBoYXJkd2FyZSBidWZmZXIsIGFuZCB0aGUgb3RoZXIgdGhlIHNvZnR3YXJlIGJ1ZmZlci4KKyAgICogVGhpcyBzZWdtZW50IHNpemUgaXMgcmV0dXJuZWQgYXMgdGhlIGZyYWdzaXplLgorICAgKgorICAgKiBTaW5jZSB0aGUgdHdvIGNvbmNlcHRzIGRvbid0IG1hcCB2ZXJ5IHdlbGwsIHdoYXQgd2UgZG8gaXMga2VlcCBzZWdzaXplIGFzCisgICAqIGl0IGlzICh1bmxlc3MgZnJhZ3NpemUgaXMgZXZlbiBsYXJnZXIsIGluIHdoaWNoIGNhc2Ugd2UgdXNlIHRoYXQpLiBXZSdsbAorICAgKiBnZXQgZGF0YSBmcm9tIFB1bHNlQXVkaW8gaW4gc21hbGxlciBjaHVua3MgdGhhbiB3ZSB3YW50IHRvIHBhc3Mgb24gYXMgYW4KKyAgICogZWxlbWVudCwgYW5kIHdlIGNvYWxlc2NlIHRob3NlIGNodW5rcyBpbiB0aGUgcmluZ2J1ZmZlciBtZW1vcnkgYW5kIHBhc3MgaXQKKyAgICogb24gaW4gdGhlIGV4cGVjdGVkIGNodW5rIHNpemUuICovCisgIHdhbnRlZC5tYXhsZW5ndGggPSBzcGVjLT5zZWdzaXplICogc3BlYy0+c2VndG90YWw7CisgIHdhbnRlZC50bGVuZ3RoID0gLTE7CisgIHdhbnRlZC5wcmVidWYgPSAwOworICB3YW50ZWQubWlucmVxID0gLTE7CisgIHdhbnRlZC5mcmFnc2l6ZSA9IHNwZWMtPnNlZ3NpemU7CisKKyAgR1NUX0lORk9fT0JKRUNUIChwdWxzZXNyYywgIm1heGxlbmd0aDogJWQiLCB3YW50ZWQubWF4bGVuZ3RoKTsKKyAgR1NUX0lORk9fT0JKRUNUIChwdWxzZXNyYywgInRsZW5ndGg6ICAgJWQiLCB3YW50ZWQudGxlbmd0aCk7CisgIEdTVF9JTkZPX09CSkVDVCAocHVsc2VzcmMsICJwcmVidWY6ICAgICVkIiwgd2FudGVkLnByZWJ1Zik7CisgIEdTVF9JTkZPX09CSkVDVCAocHVsc2VzcmMsICJtaW5yZXE6ICAgICVkIiwgd2FudGVkLm1pbnJlcSk7CisgIEdTVF9JTkZPX09CSkVDVCAocHVsc2VzcmMsICJmcmFnc2l6ZTogICVkIiwgd2FudGVkLmZyYWdzaXplKTsKKworICBmbGFncyA9IFBBX1NUUkVBTV9JTlRFUlBPTEFURV9USU1JTkcgfCBQQV9TVFJFQU1fQVVUT19USU1JTkdfVVBEQVRFIHwKKyAgICAgIFBBX1NUUkVBTV9OT1RfTU9OT1RPTklDIHwgUEFfU1RSRUFNX0FESlVTVF9MQVRFTkNZIHwKKyAgICAgIFBBX1NUUkVBTV9TVEFSVF9DT1JLRUQ7CisKKyAgaWYgKHBhX3N0cmVhbV9jb25uZWN0X3JlY29yZCAocHVsc2VzcmMtPnN0cmVhbSwgcHVsc2VzcmMtPmRldmljZSwgJndhbnRlZCwKKyAgICAgICAgICBmbGFncykgPCAwKSB7CisgICAgZ290byBjb25uZWN0X2ZhaWxlZDsKKyAgfQorCisgIC8qIG91ciBjbG9jayB3aWxsIG5vdyBzdGFydCBmcm9tIDAgYWdhaW4gKi8KKyAgY2xvY2sgPSBHU1RfQVVESU9fQ0xPQ0sgKEdTVF9BVURJT19CQVNFX1NSQyAocHVsc2VzcmMpLT5jbG9jayk7CisgIGdzdF9hdWRpb19jbG9ja19yZXNldCAoY2xvY2ssIDApOworCisgIHB1bHNlc3JjLT5jb3JrZWQgPSBUUlVFOworCisgIGZvciAoOzspIHsKKyAgICBwYV9zdHJlYW1fc3RhdGVfdCBzdGF0ZTsKKworICAgIHN0YXRlID0gcGFfc3RyZWFtX2dldF9zdGF0ZSAocHVsc2VzcmMtPnN0cmVhbSk7CisKKyAgICBpZiAoIVBBX1NUUkVBTV9JU19HT09EIChzdGF0ZSkpCisgICAgICBnb3RvIHN0cmVhbV9pc19iYWQ7CisKKyAgICBpZiAoc3RhdGUgPT0gUEFfU1RSRUFNX1JFQURZKQorICAgICAgYnJlYWs7CisKKyAgICAvKiBXYWl0IHVudGlsIHRoZSBzdHJlYW0gaXMgcmVhZHkgKi8KKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0IChwdWxzZXNyYy0+bWFpbmxvb3ApOworICB9CisgIHB1bHNlc3JjLT5zdHJlYW1fY29ubmVjdGVkID0gVFJVRTsKKworICAvKiBzdG9yZSB0aGUgc291cmNlIG91dHB1dCBpbmRleCBzbyBpdCBjYW4gYmUgYWNjZXNzZWQgdmlhIGEgcHJvcGVydHkgKi8KKyAgcHVsc2VzcmMtPnNvdXJjZV9vdXRwdXRfaWR4ID0gcGFfc3RyZWFtX2dldF9pbmRleCAocHVsc2VzcmMtPnN0cmVhbSk7CisgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKHB1bHNlc3JjKSwgInNvdXJjZS1vdXRwdXQtaW5kZXgiKTsKKworICAvKiBBbHRob3VnaCBzb3VyY2Ugb3V0cHV0IHN0cmVhbSBtdXRpbmcgaXMgc3VwcG9ydGVkLCB0aGVyZSBpcyBhIGJ1ZyBpbgorICAgKiBQdWxzZUF1ZGlvIHRoYXQgZG9lc24ndCBhbGxvdyB1cyB0byBkbyB0aGlzIGF0IHN0YXJ0dXAsIHNvIHdlIG11dGUKKyAgICogbWFudWFsbHkgcG9zdC1jb25uZWN0LiBUaGlzIHNob3VsZCBiZSBtb3ZlZCBiYWNrIHByZS1jb25uZWN0IG9uY2UgdGhpbmdzCisgICAqIGFyZSBmaXhlZCBvbiB0aGUgUHVsc2VBdWRpbyBzaWRlLiAqLworICBpZiAocHVsc2VzcmMtPm11dGVfc2V0ICYmIHB1bHNlc3JjLT5tdXRlKSB7CisgICAgZ3N0X3B1bHNlc3JjX3NldF9zdHJlYW1fbXV0ZSAocHVsc2VzcmMsIHB1bHNlc3JjLT5tdXRlKTsKKyAgICBwdWxzZXNyYy0+bXV0ZV9zZXQgPSBGQUxTRTsKKyAgfQorCisgIGlmIChwdWxzZXNyYy0+dm9sdW1lX3NldCkgeworICAgIGdzdF9wdWxzZXNyY19zZXRfc3RyZWFtX3ZvbHVtZSAocHVsc2VzcmMsIHB1bHNlc3JjLT52b2x1bWUpOworICAgIHB1bHNlc3JjLT52b2x1bWVfc2V0ID0gRkFMU0U7CisgIH0KKworICAvKiBnZXQgdGhlIGFjdHVhbCBidWZmZXJpbmcgcHJvcGVydGllcyBub3cgKi8KKyAgYWN0dWFsID0gcGFfc3RyZWFtX2dldF9idWZmZXJfYXR0ciAocHVsc2VzcmMtPnN0cmVhbSk7CisKKyAgR1NUX0lORk9fT0JKRUNUIChwdWxzZXNyYywgIm1heGxlbmd0aDogJWQiLCBhY3R1YWwtPm1heGxlbmd0aCk7CisgIEdTVF9JTkZPX09CSkVDVCAocHVsc2VzcmMsICJ0bGVuZ3RoOiAgICVkICh3YW50ZWQ6ICVkKSIsCisgICAgICBhY3R1YWwtPnRsZW5ndGgsIHdhbnRlZC50bGVuZ3RoKTsKKyAgR1NUX0lORk9fT0JKRUNUIChwdWxzZXNyYywgInByZWJ1ZjogICAgJWQiLCBhY3R1YWwtPnByZWJ1Zik7CisgIEdTVF9JTkZPX09CSkVDVCAocHVsc2VzcmMsICJtaW5yZXE6ICAgICVkICh3YW50ZWQgJWQpIiwgYWN0dWFsLT5taW5yZXEsCisgICAgICB3YW50ZWQubWlucmVxKTsKKyAgR1NUX0lORk9fT0JKRUNUIChwdWxzZXNyYywgImZyYWdzaXplOiAgJWQgKHdhbnRlZCAlZCkiLAorICAgICAgYWN0dWFsLT5mcmFnc2l6ZSwgd2FudGVkLmZyYWdzaXplKTsKKworICBpZiAoYWN0dWFsLT5mcmFnc2l6ZSA+PSBzcGVjLT5zZWdzaXplKSB7CisgICAgc3BlYy0+c2Vnc2l6ZSA9IGFjdHVhbC0+ZnJhZ3NpemU7CisgIH0gZWxzZSB7CisgICAgLyogZnJhZ3NpemUgaXMgc21hbGxlciB0aGFuIHdoYXQgd2Ugd2FudGVkLCBzbyBsZXQgdGhlIHJlYWQgZnVuY3Rpb24KKyAgICAgKiBjb2FsZXNjZSB0aGUgc21hbGxlciBjaHVua3MgYXMgdGhleSBjb21lIGluICovCisgIH0KKworICAvKiBGaXggdXAgdGhlIHRvdGFsIHJpbmdidWZmZXIgc2l6ZSBiYXNlZCBvbiB3aGF0IHdlIGFjdHVhbGx5IGdvdCAqLworICBzcGVjLT5zZWd0b3RhbCA9IGFjdHVhbC0+bWF4bGVuZ3RoIC8gc3BlYy0+c2Vnc2l6ZTsKKyAgLyogRG9uJ3QgYnVmZmVyIGxlc3MgdGhhbiAyIHNlZ21lbnRzIGFzIHRoZSByaW5nYnVmZmVyIGNhbid0IGRlYWwgd2l0aCBpdCAqLworICBpZiAoc3BlYy0+c2VndG90YWwgPCAyKQorICAgIHNwZWMtPnNlZ3RvdGFsID0gMjsKKworICBpZiAoIXB1bHNlc3JjLT5wYXVzZWQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgInVuY29ya2luZyBiZWNhdXNlIHdlIGFyZSBwbGF5aW5nIik7CisgICAgZ3N0X3B1bHNlc3JjX3NldF9jb3JrZWQgKHB1bHNlc3JjLCBGQUxTRSwgRkFMU0UpOworICB9CisgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2Nvbm5lY3RfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHB1bHNlc3JjLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoIkZhaWxlZCB0byBjb25uZWN0IHN0cmVhbTogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHB1bHNlc3JjLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9CitzdHJlYW1faXNfYmFkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHB1bHNlc3JjLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoIkZhaWxlZCB0byBjb25uZWN0IHN0cmVhbTogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHB1bHNlc3JjLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9Cit1bmxvY2tfYW5kX2ZhaWw6CisgIHsKKyAgICBnc3RfcHVsc2VzcmNfZGVzdHJveV9zdHJlYW0gKHB1bHNlc3JjKTsKKworICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAocHVsc2VzcmMtPm1haW5sb29wKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdWxzZXNyY19zdWNjZXNzX2NiIChwYV9zdHJlYW0gKiBzLCBpbnQgc3VjY2Vzcywgdm9pZCAqdXNlcmRhdGEpCit7CisgIEdzdFB1bHNlU3JjICpwdWxzZXNyYyA9IEdTVF9QVUxTRVNSQ19DQVNUICh1c2VyZGF0YSk7CisKKyAgcHVsc2VzcmMtPm9wZXJhdGlvbl9zdWNjZXNzID0gISAhc3VjY2VzczsKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChwdWxzZXNyYy0+bWFpbmxvb3AsIDApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3B1bHNlc3JjX3Jlc2V0IChHc3RBdWRpb1NyYyAqIGFzcmMpCit7CisgIEdzdFB1bHNlU3JjICpwdWxzZXNyYyA9IEdTVF9QVUxTRVNSQ19DQVNUIChhc3JjKTsKKyAgcGFfb3BlcmF0aW9uICpvID0gTlVMTDsKKworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChwdWxzZXNyYy0+bWFpbmxvb3ApOworICBHU1RfREVCVUdfT0JKRUNUIChwdWxzZXNyYywgInJlc2V0Iik7CisKKyAgaWYgKGdzdF9wdWxzZXNyY19pc19kZWFkIChwdWxzZXNyYywgVFJVRSkpCisgICAgZ290byB1bmxvY2tfYW5kX2ZhaWw7CisKKyAgaWYgKCEobyA9CisgICAgICAgICAgcGFfc3RyZWFtX2ZsdXNoIChwdWxzZXNyYy0+c3RyZWFtLCBnc3RfcHVsc2VzcmNfc3VjY2Vzc19jYiwKKyAgICAgICAgICAgICAgcHVsc2VzcmMpKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwdWxzZXNyYywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKCJwYV9zdHJlYW1fZmx1c2goKSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwdWxzZXNyYy0+Y29udGV4dCkpKSwgKE5VTEwpKTsKKyAgICBnb3RvIHVubG9ja19hbmRfZmFpbDsKKyAgfQorCisgIHB1bHNlc3JjLT5wYXVzZWQgPSBUUlVFOworICAvKiBJbmZvcm0gYW55b25lIHdhaXRpbmcgaW4gX3dyaXRlKCkgY2FsbCB0aGF0IGl0IHNoYWxsIHdha2V1cCAqLworICBpZiAocHVsc2VzcmMtPmluX3JlYWQpIHsKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwgKHB1bHNlc3JjLT5tYWlubG9vcCwgMCk7CisgIH0KKworICBwdWxzZXNyYy0+b3BlcmF0aW9uX3N1Y2Nlc3MgPSBGQUxTRTsKKyAgd2hpbGUgKHBhX29wZXJhdGlvbl9nZXRfc3RhdGUgKG8pID09IFBBX09QRVJBVElPTl9SVU5OSU5HKSB7CisKKyAgICBpZiAoZ3N0X3B1bHNlc3JjX2lzX2RlYWQgKHB1bHNlc3JjLCBUUlVFKSkKKyAgICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAocHVsc2VzcmMtPm1haW5sb29wKTsKKyAgfQorCisgIGlmICghcHVsc2VzcmMtPm9wZXJhdGlvbl9zdWNjZXNzKSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHB1bHNlc3JjLCBSRVNPVVJDRSwgRkFJTEVELCAoIkZsdXNoIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgcGFfc3RyZXJyb3IgKHBhX2NvbnRleHRfZXJybm8gKHB1bHNlc3JjLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICB9CisKK3VubG9ja19hbmRfZmFpbDoKKworICBpZiAobykgeworICAgIHBhX29wZXJhdGlvbl9jYW5jZWwgKG8pOworICAgIHBhX29wZXJhdGlvbl91bnJlZiAobyk7CisgIH0KKworICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKHB1bHNlc3JjLT5tYWlubG9vcCk7Cit9CisKKy8qIHVwZGF0ZSB0aGUgY29ya2VkIHN0YXRlIG9mIGEgc3RyZWFtLCBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBtYWlubG9vcAorICogbG9jayAqLworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VzcmNfc2V0X2NvcmtlZCAoR3N0UHVsc2VTcmMgKiBwc3JjLCBnYm9vbGVhbiBjb3JrZWQsIGdib29sZWFuIHdhaXQpCit7CisgIHBhX29wZXJhdGlvbiAqbyA9IE5VTEw7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzcmMsICJzZXR0aW5nIGNvcmtlZCBzdGF0ZSB0byAlZCIsIGNvcmtlZCk7CisgIGlmICghcHNyYy0+c3RyZWFtX2Nvbm5lY3RlZCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAocHNyYy0+Y29ya2VkICE9IGNvcmtlZCkgeworICAgIGlmICghKG8gPSBwYV9zdHJlYW1fY29yayAocHNyYy0+c3RyZWFtLCBjb3JrZWQsCisgICAgICAgICAgICAgICAgZ3N0X3B1bHNlc3JjX3N1Y2Nlc3NfY2IsIHBzcmMpKSkKKyAgICAgIGdvdG8gY29ya19mYWlsZWQ7CisKKyAgICB3aGlsZSAod2FpdCAmJiBwYV9vcGVyYXRpb25fZ2V0X3N0YXRlIChvKSA9PSBQQV9PUEVSQVRJT05fUlVOTklORykgeworICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAocHNyYy0+bWFpbmxvb3ApOworICAgICAgaWYgKGdzdF9wdWxzZXNyY19pc19kZWFkIChwc3JjLCBUUlVFKSkKKyAgICAgICAgZ290byBzZXJ2ZXJfZGVhZDsKKyAgICB9CisgICAgcHNyYy0+Y29ya2VkID0gY29ya2VkOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzcmMsICJza2lwcGluZywgYWxyZWFkeSBpbiByZXF1ZXN0ZWQgc3RhdGUiKTsKKyAgfQorICByZXMgPSBUUlVFOworCitjbGVhbnVwOgorICBpZiAobykKKyAgICBwYV9vcGVyYXRpb25fdW5yZWYgKG8pOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitzZXJ2ZXJfZGVhZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBzcmMsICJ0aGUgc2VydmVyIGlzIGRlYWQiKTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KK2NvcmtfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBzcmMsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgicGFfc3RyZWFtX2NvcmsoKSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgIHBhX3N0cmVycm9yIChwYV9jb250ZXh0X2Vycm5vIChwc3JjLT5jb250ZXh0KSkpLCAoTlVMTCkpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorfQorCisvKiBzdGFydC9yZXN1bWUgcGxheWJhY2sgQVNBUCAqLworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VzcmNfcGxheSAoR3N0UHVsc2VTcmMgKiBwc3JjKQoreworICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChwc3JjLT5tYWlubG9vcCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBzcmMsICJwbGF5aW5nIik7CisgIHBzcmMtPnBhdXNlZCA9IEZBTFNFOworICBnc3RfcHVsc2VzcmNfc2V0X2NvcmtlZCAocHNyYywgRkFMU0UsIEZBTFNFKTsKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChwc3JjLT5tYWlubG9vcCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIHBhdXNlL3N0b3AgcGxheWJhY2sgQVNBUCAqLworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VzcmNfcGF1c2UgKEdzdFB1bHNlU3JjICogcHNyYykKK3sKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAocHNyYy0+bWFpbmxvb3ApOworICBHU1RfREVCVUdfT0JKRUNUIChwc3JjLCAicGF1c2luZyIpOworICAvKiBtYWtlIHN1cmUgdGhlIGNvbW1pdCBtZXRob2Qgc3RvcHMgd3JpdGluZyAqLworICBwc3JjLT5wYXVzZWQgPSBUUlVFOworICBpZiAocHNyYy0+aW5fcmVhZCkgeworICAgIC8qIHdlIGFyZSB3YWl0aW5nIGluIGEgcmVhZCwgc2lnbmFsICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAocHNyYywgInNpZ25hbCByZWFkIik7CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChwc3JjLT5tYWlubG9vcCwgMCk7CisgIH0KKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChwc3JjLT5tYWlubG9vcCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3B1bHNlc3JjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0UHVsc2VTcmMgKnRoaXMgPSBHU1RfUFVMU0VTUkNfQ0FTVCAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBpZiAoISh0aGlzLT5tYWlubG9vcCA9IHBhX3RocmVhZGVkX21haW5sb29wX25ldyAoKSkpCisgICAgICAgIGdvdG8gbWFpbmxvb3BfZmFpbGVkOworICAgICAgaWYgKHBhX3RocmVhZGVkX21haW5sb29wX3N0YXJ0ICh0aGlzLT5tYWlubG9vcCkgPCAwKSB7CisgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX2ZyZWUgKHRoaXMtPm1haW5sb29wKTsKKyAgICAgICAgdGhpcy0+bWFpbmxvb3AgPSBOVUxMOworICAgICAgICBnb3RvIG1haW5sb29wX3N0YXJ0X2ZhaWxlZDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKGVsZW1lbnQsCisgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2Nsb2NrX3Byb3ZpZGUgKEdTVF9PQkpFQ1RfQ0FTVCAoZWxlbWVudCksCisgICAgICAgICAgICAgIEdTVF9BVURJT19CQVNFX1NSQyAodGhpcyktPmNsb2NrLCBUUlVFKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgICAvKiB1bmNvcmsgYW5kIHN0YXJ0IHJlY29yZGluZyAqLworICAgICAgZ3N0X3B1bHNlc3JjX3BsYXkgKHRoaXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgLyogc3RvcCByZWNvcmRpbmcgQVNBUCBieSBjb3JraW5nICovCisgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrICh0aGlzLT5tYWlubG9vcCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUICh0aGlzLCAiY29ya2luZyIpOworICAgICAgZ3N0X3B1bHNlc3JjX3NldF9jb3JrZWQgKHRoaXMsIFRSVUUsIEZBTFNFKTsKKyAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAodGhpcy0+bWFpbmxvb3ApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgLyogbm93IG1ha2Ugc3VyZSB3ZSBnZXQgb3V0IG9mIHRoZSBfcmVhZCBtZXRob2QgKi8KKyAgICAgIGdzdF9wdWxzZXNyY19wYXVzZSAodGhpcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGlmICh0aGlzLT5tYWlubG9vcCkKKyAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc3RvcCAodGhpcy0+bWFpbmxvb3ApOworCisgICAgICBnc3RfcHVsc2VzcmNfZGVzdHJveV9jb250ZXh0ICh0aGlzKTsKKworICAgICAgaWYgKHRoaXMtPm1haW5sb29wKSB7CisgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX2ZyZWUgKHRoaXMtPm1haW5sb29wKTsKKyAgICAgICAgdGhpcy0+bWFpbmxvb3AgPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIC8qIGZvcm1hdF9sb3N0IGlzIHJlc2V0IGluIHJlbGVhc2UoKSBpbiBiYXNlYXVkaW9zaW5rICovCisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKGVsZW1lbnQsCisgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2Nsb2NrX2xvc3QgKEdTVF9PQkpFQ1RfQ0FTVCAoZWxlbWVudCksCisgICAgICAgICAgICAgIEdTVF9BVURJT19CQVNFX1NSQyAodGhpcyktPmNsb2NrKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworbWFpbmxvb3BfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHRoaXMsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgicGFfdGhyZWFkZWRfbWFpbmxvb3BfbmV3KCkgZmFpbGVkIiksIChOVUxMKSk7CisgICAgcmV0dXJuIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKyAgfQorbWFpbmxvb3Bfc3RhcnRfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHRoaXMsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgicGFfdGhyZWFkZWRfbWFpbmxvb3Bfc3RhcnQoKSBmYWlsZWQiKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICB9Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2dzdF9wdWxzZXNyY19nZXRfdGltZSAoR3N0Q2xvY2sgKiBjbG9jaywgR3N0UHVsc2VTcmMgKiBzcmMpCit7CisgIHBhX3VzZWNfdCB0aW1lID0gMDsKKworICBpZiAoc3JjLT5tYWlubG9vcCA9PSBOVUxMKQorICAgIGdvdG8gb3V0OworCisgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKHNyYy0+bWFpbmxvb3ApOworICBpZiAoIXNyYy0+c3RyZWFtKQorICAgIGdvdG8gdW5sb2NrX2FuZF9vdXQ7CisKKyAgaWYgKGdzdF9wdWxzZXNyY19pc19kZWFkIChzcmMsIFRSVUUpKQorICAgIGdvdG8gdW5sb2NrX2FuZF9vdXQ7CisKKyAgaWYgKHBhX3N0cmVhbV9nZXRfdGltZSAoc3JjLT5zdHJlYW0sICZ0aW1lKSA8IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb3VsZCBub3QgZ2V0IHRpbWUiKTsKKyAgICB0aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgfSBlbHNlIHsKKyAgICB0aW1lICo9IDEwMDA7CisgIH0KKworCit1bmxvY2tfYW5kX291dDoKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChzcmMtPm1haW5sb29wKTsKKworb3V0OgorICByZXR1cm4gdGltZTsKK30KZGlmZiAtLWdpdCBhL2V4dC9wdWxzZS9wdWxzZXNyYy5oIGIvZXh0L3B1bHNlL3B1bHNlc3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhN2Q5NwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9wdWxzZS9wdWxzZXNyYy5oCkBAIC0wLDAgKzEsOTggQEAKKy8qLSotIE1vZGU6IEM7IGMtYmFzaWMtb2Zmc2V0OiAyIC0qLSovCisKKy8qCisgKiAgR1N0cmVhbWVyIHB1bHNlYXVkaW8gcGx1Z2luCisgKgorICogIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IExlbm5hcnQgUG9ldHRlcmluZworICoKKyAqICBnc3QtcHVsc2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAqICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBnc3QtcHVsc2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIGdzdC1wdWxzZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxCisgKiAgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUFVMU0VTUkNfSF9fCisjZGVmaW5lIF9fR1NUX1BVTFNFU1JDX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb3NyYy5oPgorCisjaW5jbHVkZSA8cHVsc2UvcHVsc2VhdWRpby5oPgorI2luY2x1ZGUgPHB1bHNlL3RocmVhZC1tYWlubG9vcC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUFVMU0VTUkMgXAorICAoZ3N0X3B1bHNlc3JjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9QVUxTRVNSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1BVTFNFU1JDLEdzdFB1bHNlU3JjKSkKKyNkZWZpbmUgR1NUX1BVTFNFU1JDX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1BVTFNFU1JDLEdzdFB1bHNlU3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUFVMU0VTUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9QVUxTRVNSQykpCisjZGVmaW5lIEdTVF9JU19QVUxTRVNSQ19DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUFVMU0VTUkMpKQorI2RlZmluZSBHU1RfUFVMU0VTUkNfQ0FTVChvYmopIFwKKyAgKChHc3RQdWxzZVNyYyAqKShvYmopKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UHVsc2VTcmMgR3N0UHVsc2VTcmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UHVsc2VTcmNDbGFzcyBHc3RQdWxzZVNyY0NsYXNzOworCitzdHJ1Y3QgX0dzdFB1bHNlU3JjCit7CisgIEdzdEF1ZGlvU3JjIHNyYzsKKworICBnY2hhciAqc2VydmVyLCAqZGV2aWNlLCAqY2xpZW50X25hbWU7CisKKyAgcGFfdGhyZWFkZWRfbWFpbmxvb3AgKm1haW5sb29wOworCisgIHBhX2NvbnRleHQgKmNvbnRleHQ7CisgIHBhX3N0cmVhbSAqc3RyZWFtOworICBndWludDMyIHNvdXJjZV9vdXRwdXRfaWR4OworCisgIHBhX3NhbXBsZV9zcGVjIHNhbXBsZV9zcGVjOworCisgIGNvbnN0IHZvaWQgKnJlYWRfYnVmZmVyOworICBzaXplX3QgcmVhZF9idWZmZXJfbGVuZ3RoOworCisgIGdjaGFyICpkZXZpY2VfZGVzY3JpcHRpb247CisKKyAgZ2RvdWJsZSB2b2x1bWU7CisgIGdib29sZWFuIHZvbHVtZV9zZXQ6MTsKKyAgZ2Jvb2xlYW4gbXV0ZToxOworICBnYm9vbGVhbiBtdXRlX3NldDoxOworICBndWludDMyIGN1cnJlbnRfc291cmNlX2lkeDsKKyAgZ2NoYXIgKmN1cnJlbnRfc291cmNlX25hbWU7CisKKyAgZ2ludCBub3RpZnk7IC8qIGF0b21pYyAqLworCisgIGdib29sZWFuIGNvcmtlZDoxOworICBnYm9vbGVhbiBzdHJlYW1fY29ubmVjdGVkOjE7CisgIGdib29sZWFuIG9wZXJhdGlvbl9zdWNjZXNzOjE7CisgIGdib29sZWFuIHBhdXNlZDoxOworICBnYm9vbGVhbiBpbl9yZWFkOjE7CisKKyAgR3N0U3RydWN0dXJlICpwcm9wZXJ0aWVzOworICBwYV9wcm9wbGlzdCAqcHJvcGxpc3Q7Cit9OworCitzdHJ1Y3QgX0dzdFB1bHNlU3JjQ2xhc3MKK3sKKyAgR3N0QXVkaW9TcmNDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcHVsc2VzcmNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUFVMU0VTUkNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvcHVsc2UvcHVsc2V1dGlsLmMgYi9leHQvcHVsc2UvcHVsc2V1dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNhYTRiNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9wdWxzZS9wdWxzZXV0aWwuYwpAQCAtMCwwICsxLDUwOSBAQAorLyoKKyAqICBHU3RyZWFtZXIgcHVsc2VhdWRpbyBwbHVnaW4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA0LTIwMDggTGVubmFydCBQb2V0dGVyaW5nCisgKgorICogIGdzdC1wdWxzZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICogIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIGdzdC1wdWxzZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggZ3N0LXB1bHNlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEKKyAqICBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJwdWxzZXV0aWwuaCIKKworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyMgaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgICAgICAgLyogZ2V0cGlkIG9uIFVOSVggKi8KKyNlbmRpZgorI2lmZGVmIEhBVkVfUFJPQ0VTU19ICisjIGluY2x1ZGUgPHByb2Nlc3MuaD4gICAgICAgICAgIC8qIGdldHBpZCBvbiB3aW4zMiAqLworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QKK3sKKyAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gZ3N0X3BvczsKKyAgcGFfY2hhbm5lbF9wb3NpdGlvbl90IHBhX3BvczsKK30gZ3N0X3BhX3Bvc190YWJsZVtdID0geworICB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX01PTk8sIFBBX0NIQU5ORUxfUE9TSVRJT05fTU9OT30sIHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUfSwgeworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVH0sIHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9DRU5URVIsIFBBX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9DRU5URVJ9LCB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwgUEFfQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0xFRlR9LCB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFQsIFBBX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVH0sIHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMSwgUEFfQ0hBTk5FTF9QT1NJVElPTl9MRkV9LCB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVJ9LCB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlRfT0ZfQ0VOVEVSLAorICAgICAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlRfT0ZfQ0VOVEVSfSwgeworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVF9PRl9DRU5URVIsCisgICAgICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFRfT0ZfQ0VOVEVSfSwgeworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQsIFBBX0NIQU5ORUxfUE9TSVRJT05fU0lERV9MRUZUfSwgeworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hULCBQQV9DSEFOTkVMX1BPU0lUSU9OX1NJREVfUklHSFR9LCB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9DRU5URVIsIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX0NFTlRFUn0sIHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX0xFRlQsCisgICAgICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX0xFRlR9LCB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9SSUdIVCwKKyAgICAgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfUklHSFR9LCB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9DRU5URVIsCisgICAgICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX0NFTlRFUn0sIHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfTEVGVCwgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9MRUZUfSwgeworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9SSUdIVCwKKyAgICAgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9SSUdIVH0sIHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfQ0VOVEVSLAorICAgICAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX0NFTlRFUn0sIHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORSwgUEFfQ0hBTk5FTF9QT1NJVElPTl9JTlZBTElEfQorfTsKKworc3RhdGljIGdib29sZWFuCitnc3RhdWRpb2Zvcm1hdF90b19wYXNhbXBsZWZvcm1hdCAoR3N0QXVkaW9Gb3JtYXQgZm9ybWF0LAorICAgIHBhX3NhbXBsZV9mb3JtYXRfdCAqIHNmKQoreworICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9VODoKKyAgICAgICpzZiA9IFBBX1NBTVBMRV9VODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMTZMRToKKyAgICAgICpzZiA9IFBBX1NBTVBMRV9TMTZMRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMTZCRToKKyAgICAgICpzZiA9IFBBX1NBTVBMRV9TMTZCRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GMzJMRToKKyAgICAgICpzZiA9IFBBX1NBTVBMRV9GTE9BVDMyTEU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfRjMyQkU6CisgICAgICAqc2YgPSBQQV9TQU1QTEVfRkxPQVQzMkJFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MzMkxFOgorICAgICAgKnNmID0gUEFfU0FNUExFX1MzMkxFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MzMkJFOgorICAgICAgKnNmID0gUEFfU0FNUExFX1MzMkJFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MyNExFOgorICAgICAgKnNmID0gUEFfU0FNUExFX1MyNExFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MyNEJFOgorICAgICAgKnNmID0gUEFfU0FNUExFX1MyNEJFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MyNF8zMkxFOgorICAgICAgKnNmID0gUEFfU0FNUExFX1MyNF8zMkxFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MyNF8zMkJFOgorICAgICAgKnNmID0gUEFfU0FNUExFX1MyNF8zMkJFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK2dzdF9wdWxzZV9maWxsX3NhbXBsZV9zcGVjIChHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYywgcGFfc2FtcGxlX3NwZWMgKiBzcykKK3sKKyAgaWYgKHNwZWMtPnR5cGUgPT0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX1JBVykgeworICAgIGlmICghZ3N0YXVkaW9mb3JtYXRfdG9fcGFzYW1wbGVmb3JtYXQgKEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoJnNwZWMtPmluZm8pLAorICAgICAgICAgICAgJnNzLT5mb3JtYXQpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9IGVsc2UgaWYgKHNwZWMtPnR5cGUgPT0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX01VX0xBVykgeworICAgIHNzLT5mb3JtYXQgPSBQQV9TQU1QTEVfVUxBVzsKKyAgfSBlbHNlIGlmIChzcGVjLT50eXBlID09IEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9BX0xBVykgeworICAgIHNzLT5mb3JtYXQgPSBQQV9TQU1QTEVfQUxBVzsKKyAgfSBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworCisgIHNzLT5jaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTICgmc3BlYy0+aW5mbyk7CisgIHNzLT5yYXRlID0gR1NUX0FVRElPX0lORk9fUkFURSAoJnNwZWMtPmluZm8pOworCisgIGlmICghcGFfc2FtcGxlX3NwZWNfdmFsaWQgKHNzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitnc3RfcHVsc2VfZmlsbF9mb3JtYXRfaW5mbyAoR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMsIHBhX2Zvcm1hdF9pbmZvICoqIGYsCisgICAgZ3VpbnQgKiBjaGFubmVscykKK3sKKyAgcGFfZm9ybWF0X2luZm8gKmZvcm1hdDsKKyAgcGFfc2FtcGxlX2Zvcm1hdF90IHNmID0gUEFfU0FNUExFX0lOVkFMSUQ7CisgIEdzdEF1ZGlvSW5mbyAqYWluZm8gPSAmc3BlYy0+aW5mbzsKKworICBmb3JtYXQgPSBwYV9mb3JtYXRfaW5mb19uZXcgKCk7CisKKyAgaWYgKHNwZWMtPnR5cGUgPT0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX01VX0xBVykgeworICAgIGZvcm1hdC0+ZW5jb2RpbmcgPSBQQV9FTkNPRElOR19QQ007CisgICAgc2YgPSBQQV9TQU1QTEVfVUxBVzsKKyAgfSBlbHNlIGlmIChzcGVjLT50eXBlID09IEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9BX0xBVykgeworICAgIGZvcm1hdC0+ZW5jb2RpbmcgPSBQQV9FTkNPRElOR19QQ007CisgICAgc2YgPSBQQV9TQU1QTEVfQUxBVzsKKyAgfSBlbHNlIGlmIChzcGVjLT50eXBlID09IEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9SQVcpIHsKKyAgICBmb3JtYXQtPmVuY29kaW5nID0gUEFfRU5DT0RJTkdfUENNOworICAgIGlmICghZ3N0YXVkaW9mb3JtYXRfdG9fcGFzYW1wbGVmb3JtYXQgKEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoYWluZm8pLCAmc2YpKQorICAgICAgZ290byBmYWlsOworICB9IGVsc2UgaWYgKHNwZWMtPnR5cGUgPT0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX0FDMykgeworICAgIGZvcm1hdC0+ZW5jb2RpbmcgPSBQQV9FTkNPRElOR19BQzNfSUVDNjE5Mzc7CisgIH0gZWxzZSBpZiAoc3BlYy0+dHlwZSA9PSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfRUFDMykgeworICAgIGZvcm1hdC0+ZW5jb2RpbmcgPSBQQV9FTkNPRElOR19FQUMzX0lFQzYxOTM3OworICB9IGVsc2UgaWYgKHNwZWMtPnR5cGUgPT0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX0RUUykgeworICAgIGZvcm1hdC0+ZW5jb2RpbmcgPSBQQV9FTkNPRElOR19EVFNfSUVDNjE5Mzc7CisgIH0gZWxzZSBpZiAoc3BlYy0+dHlwZSA9PSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfTVBFRykgeworICAgIGZvcm1hdC0+ZW5jb2RpbmcgPSBQQV9FTkNPRElOR19NUEVHX0lFQzYxOTM3OworI2lmIFBBX0NIRUNLX1ZFUlNJT04oMyw5OSwwKQorICB9IGVsc2UgaWYgKHNwZWMtPnR5cGUgPT0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX01QRUcyX0FBQykgeworICAgIGZvcm1hdC0+ZW5jb2RpbmcgPSBQQV9FTkNPRElOR19NUEVHMl9BQUNfSUVDNjE5Mzc7CisgIH0gZWxzZSBpZiAoc3BlYy0+dHlwZSA9PSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfTVBFRzRfQUFDKSB7CisgICAgLyogSEFDSy4gdHJlYXQgTVBFRzQgQUFDIGFzIE1QRUcyIEFBQyBmb3IgdGhlIG1vbWVudCAqLworICAgIGZvcm1hdC0+ZW5jb2RpbmcgPSBQQV9FTkNPRElOR19NUEVHMl9BQUNfSUVDNjE5Mzc7CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICBnb3RvIGZhaWw7CisgIH0KKworICBpZiAoZm9ybWF0LT5lbmNvZGluZyA9PSBQQV9FTkNPRElOR19QQ00pIHsKKyAgICBwYV9mb3JtYXRfaW5mb19zZXRfc2FtcGxlX2Zvcm1hdCAoZm9ybWF0LCBzZik7CisgICAgcGFfZm9ybWF0X2luZm9fc2V0X2NoYW5uZWxzIChmb3JtYXQsIEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChhaW5mbykpOworICB9CisKKyAgcGFfZm9ybWF0X2luZm9fc2V0X3JhdGUgKGZvcm1hdCwgR1NUX0FVRElPX0lORk9fUkFURSAoYWluZm8pKTsKKworICBpZiAoIXBhX2Zvcm1hdF9pbmZvX3ZhbGlkIChmb3JtYXQpKQorICAgIGdvdG8gZmFpbDsKKworICAqZiA9IGZvcm1hdDsKKyAgKmNoYW5uZWxzID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKGFpbmZvKTsKKworICByZXR1cm4gVFJVRTsKKworZmFpbDoKKyAgaWYgKGZvcm1hdCkKKyAgICBwYV9mb3JtYXRfaW5mb19mcmVlIChmb3JtYXQpOworICByZXR1cm4gRkFMU0U7Cit9CisKK2NvbnN0IGNoYXIgKgorZ3N0X3B1bHNlX3NhbXBsZV9mb3JtYXRfdG9fY2Fwc19mb3JtYXQgKHBhX3NhbXBsZV9mb3JtYXRfdCBzZikKK3sKKyAgc3dpdGNoIChzZikgeworICAgIGNhc2UgUEFfU0FNUExFX1U4OgorICAgICAgcmV0dXJuICJVOCI7CisKKyAgICBjYXNlIFBBX1NBTVBMRV9TMTZMRToKKyAgICAgIHJldHVybiAiUzE2TEUiOworCisgICAgY2FzZSBQQV9TQU1QTEVfUzE2QkU6CisgICAgICByZXR1cm4gIlMxNkJFIjsKKworICAgIGNhc2UgUEFfU0FNUExFX0ZMT0FUMzJMRToKKyAgICAgIHJldHVybiAiRjMyTEUiOworCisgICAgY2FzZSBQQV9TQU1QTEVfRkxPQVQzMkJFOgorICAgICAgcmV0dXJuICJGMzJCRSI7CisKKyAgICBjYXNlIFBBX1NBTVBMRV9TMzJMRToKKyAgICAgIHJldHVybiAiUzMyTEUiOworCisgICAgY2FzZSBQQV9TQU1QTEVfUzMyQkU6CisgICAgICByZXR1cm4gIlMzMkJFIjsKKworICAgIGNhc2UgUEFfU0FNUExFX1MyNExFOgorICAgICAgcmV0dXJuICJTMjRMRSI7CisKKyAgICBjYXNlIFBBX1NBTVBMRV9TMjRCRToKKyAgICAgIHJldHVybiAiUzI0QkUiOworCisgICAgY2FzZSBQQV9TQU1QTEVfUzI0XzMyTEU6CisgICAgICByZXR1cm4gIlMyNF8zMkxFIjsKKworICAgIGNhc2UgUEFfU0FNUExFX1MyNF8zMkJFOgorICAgICAgcmV0dXJuICJTMjRfMzJCRSI7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLyogUEFUSF9NQVggaXMgbm90IGRlZmluZWQgZXZlcnl3aGVyZSwgZS5nLiBvbiBHTlUgSHVyZCAqLworI2lmbmRlZiBQQVRIX01BWAorI2RlZmluZSBQQVRIX01BWCA0MDk2CisjZW5kaWYKKworZ2NoYXIgKgorZ3N0X3B1bHNlX2NsaWVudF9uYW1lICh2b2lkKQoreworICBnY2hhciBidWZbUEFUSF9NQVhdOworCisgIGNvbnN0IGNoYXIgKmM7CisKKyAgaWYgKChjID0gZ19nZXRfYXBwbGljYXRpb25fbmFtZSAoKSkpCisgICAgcmV0dXJuIGdfc3RyZHVwIChjKTsKKyAgZWxzZSBpZiAocGFfZ2V0X2JpbmFyeV9uYW1lIChidWYsIHNpemVvZiAoYnVmKSkpCisgICAgcmV0dXJuIGdfc3RyZHVwIChidWYpOworICBlbHNlCisgICAgcmV0dXJuIGdfc3RyZHVwX3ByaW50ZiAoIkdTdHJlYW1lci1waWQtJWx1IiwgKGd1bG9uZykgZ2V0cGlkICgpKTsKK30KKworcGFfY2hhbm5lbF9tYXAgKgorZ3N0X3B1bHNlX2dzdF90b19jaGFubmVsX21hcCAocGFfY2hhbm5lbF9tYXAgKiBtYXAsCisgICAgY29uc3QgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpCit7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBjaGFubmVsczsKKyAgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gKnBvczsKKworICBwYV9jaGFubmVsX21hcF9pbml0IChtYXApOworCisgIGNoYW5uZWxzID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZzcGVjLT5pbmZvKTsKKyAgcG9zID0gc3BlYy0+aW5mby5wb3NpdGlvbjsKKworICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBHX05fRUxFTUVOVFMgKGdzdF9wYV9wb3NfdGFibGUpOyBpKyspIHsKKyAgICAgIGlmIChwb3Nbal0gPT0gZ3N0X3BhX3Bvc190YWJsZVtpXS5nc3RfcG9zKSB7CisgICAgICAgIG1hcC0+bWFwW2pdID0gZ3N0X3BhX3Bvc190YWJsZVtpXS5wYV9wb3M7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA9PSBHX05fRUxFTUVOVFMgKGdzdF9wYV9wb3NfdGFibGUpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAoaiAhPSBzcGVjLT5pbmZvLmNoYW5uZWxzKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBtYXAtPmNoYW5uZWxzID0gc3BlYy0+aW5mby5jaGFubmVsczsKKworICBpZiAoIXBhX2NoYW5uZWxfbWFwX3ZhbGlkIChtYXApKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gbWFwOworfQorCitHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICoKK2dzdF9wdWxzZV9jaGFubmVsX21hcF90b19nc3QgKGNvbnN0IHBhX2NoYW5uZWxfbWFwICogbWFwLAorICAgIEdzdEF1ZGlvUmluZ0J1ZmZlclNwZWMgKiBzcGVjKQoreworICBnaW50IGksIGo7CisgIGdib29sZWFuIGludmFsaWQgPSBGQUxTRTsKKyAgZ2ludCBjaGFubmVsczsKKyAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gKnBvczsKKworICBjaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTICgmc3BlYy0+aW5mbyk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKG1hcC0+Y2hhbm5lbHMgPT0gY2hhbm5lbHMsIE5VTEwpOworCisgIHBvcyA9IHNwZWMtPmluZm8ucG9zaXRpb247CisKKyAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsKKyAgICBmb3IgKGkgPSAwOyBqIDwgY2hhbm5lbHMgJiYgaSA8IEdfTl9FTEVNRU5UUyAoZ3N0X3BhX3Bvc190YWJsZSk7IGkrKykgeworICAgICAgaWYgKG1hcC0+bWFwW2pdID09IGdzdF9wYV9wb3NfdGFibGVbaV0ucGFfcG9zKSB7CisgICAgICAgIHBvc1tqXSA9IGdzdF9wYV9wb3NfdGFibGVbaV0uZ3N0X3BvczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChpID09IEdfTl9FTEVNRU5UUyAoZ3N0X3BhX3Bvc190YWJsZSkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmICghaW52YWxpZAorICAgICAgJiYgIWdzdF9hdWRpb19jaGVja192YWxpZF9jaGFubmVsX3Bvc2l0aW9ucyAocG9zLCBjaGFubmVscywgRkFMU0UpKQorICAgIGludmFsaWQgPSBUUlVFOworCisgIGlmIChpbnZhbGlkKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspCisgICAgICBwb3NbaV0gPSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FOworICB9IGVsc2UgeworICAgIGlmIChwb3NbMF0gIT0gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORSkKKyAgICAgIHNwZWMtPmluZm8uZmxhZ3MgJj0gfkdTVF9BVURJT19GTEFHX1VOUE9TSVRJT05FRDsKKyAgfQorCisgIHJldHVybiBzcGVjOworfQorCit2b2lkCitnc3RfcHVsc2VfY3ZvbHVtZV9mcm9tX2xpbmVhciAocGFfY3ZvbHVtZSAqIHYsIHVuc2lnbmVkIGNoYW5uZWxzLAorICAgIGdkb3VibGUgdm9sdW1lKQoreworICBwYV9jdm9sdW1lX3NldCAodiwgY2hhbm5lbHMsIHBhX3N3X3ZvbHVtZV9mcm9tX2xpbmVhciAodm9sdW1lKSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorbWFrZV9wcm9wbGlzdF9pdGVtIChHUXVhcmsgZmllbGRfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIHBhX3Byb3BsaXN0ICpwID0gKHBhX3Byb3BsaXN0ICopIHVzZXJfZGF0YTsKKyAgZ2NoYXIgKnByb3BfaWQgPSAoZ2NoYXIgKikgZ19xdWFya190b19zdHJpbmcgKGZpZWxkX2lkKTsKKworICAvKiBodHRwOi8vMHBvaW50ZXIuZGUvbGVubmFydC9wcm9qZWN0cy9wdWxzZWF1ZGlvL2RveHlnZW4vcHJvcGxpc3RfOGguaHRtbCAqLworCisgIC8qIG1hdGNoIHByb3AgaWQgKi8KKworICAvKiBjaGVjayB0eXBlICovCisgIHN3aXRjaCAoR19WQUxVRV9UWVBFICh2YWx1ZSkpIHsKKyAgICBjYXNlIEdfVFlQRV9TVFJJTkc6CisgICAgICBwYV9wcm9wbGlzdF9zZXRzIChwLCBwcm9wX2lkLCBnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX1dBUk5JTkcgKCJ1bm1hcHBlZCBwcm9wZXJ0eSB0eXBlICVzIiwgR19WQUxVRV9UWVBFX05BTUUgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitwYV9wcm9wbGlzdCAqCitnc3RfcHVsc2VfbWFrZV9wcm9wbGlzdCAoY29uc3QgR3N0U3RydWN0dXJlICogcHJvcGVydGllcykKK3sKKyAgcGFfcHJvcGxpc3QgKnByb3BsaXN0ID0gcGFfcHJvcGxpc3RfbmV3ICgpOworCisgIC8qIGl0ZXJhdGUgdGhlIHN0cnVjdHVyZSBhbmQgZmlsbCB0aGUgcHJvcGxpc3QgKi8KKyAgZ3N0X3N0cnVjdHVyZV9mb3JlYWNoIChwcm9wZXJ0aWVzLCBtYWtlX3Byb3BsaXN0X2l0ZW0sIHByb3BsaXN0KTsKKyAgcmV0dXJuIHByb3BsaXN0OworfQorCitHc3RTdHJ1Y3R1cmUgKgorZ3N0X3B1bHNlX21ha2Vfc3RydWN0dXJlIChwYV9wcm9wbGlzdCAqIHByb3BlcnRpZXMpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RyOworICB2b2lkICpzdGF0ZSA9IE5VTEw7CisKKyAgc3RyID0gZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCJwdWxzZS1wcm9wbGlzdCIpOworCisgIHdoaWxlIChUUlVFKSB7CisgICAgY29uc3QgY2hhciAqa2V5LCAqdmFsOworCisgICAga2V5ID0gcGFfcHJvcGxpc3RfaXRlcmF0ZSAocHJvcGVydGllcywgJnN0YXRlKTsKKyAgICBpZiAoa2V5ID09IE5VTEwpCisgICAgICBicmVhazsKKworICAgIHZhbCA9IHBhX3Byb3BsaXN0X2dldHMgKHByb3BlcnRpZXMsIGtleSk7CisKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAoc3RyLCBrZXksIEdfVFlQRV9TVFJJTkcsIHZhbCwgTlVMTCk7CisgIH0KKyAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcHVsc2VfZm9ybWF0X2luZm9faW50X3Byb3BfdG9fdmFsdWUgKHBhX2Zvcm1hdF9pbmZvICogZm9ybWF0LAorICAgIGNvbnN0IGNoYXIgKmtleSwgR1ZhbHVlICogdmFsdWUpCit7CisgIEdWYWx1ZSB2ID0geyAwLCB9OworICBpbnQgaTsKKyAgaW50ICphLCBuOworICBpbnQgbWluLCBtYXg7CisKKyAgaWYgKHBhX2Zvcm1hdF9pbmZvX2dldF9wcm9wX2ludCAoZm9ybWF0LCBrZXksICZpKSA9PSAwKSB7CisgICAgZ192YWx1ZV9pbml0ICh2YWx1ZSwgR19UWVBFX0lOVCk7CisgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgaSk7CisKKyAgfSBlbHNlIGlmIChwYV9mb3JtYXRfaW5mb19nZXRfcHJvcF9pbnRfYXJyYXkgKGZvcm1hdCwga2V5LCAmYSwgJm4pID09IDApIHsKKyAgICBnX3ZhbHVlX2luaXQgKHZhbHVlLCBHU1RfVFlQRV9MSVNUKTsKKyAgICBnX3ZhbHVlX2luaXQgKCZ2LCBHX1RZUEVfSU5UKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAoJnYsIGFbaV0pOworICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICh2YWx1ZSwgJnYpOworICAgIH0KKworICAgIHBhX3hmcmVlIChhKTsKKworICB9IGVsc2UgaWYgKHBhX2Zvcm1hdF9pbmZvX2dldF9wcm9wX2ludF9yYW5nZSAoZm9ybWF0LCBrZXksICZtaW4sICZtYXgpID09IDApIHsKKyAgICBnX3ZhbHVlX2luaXQgKHZhbHVlLCBHU1RfVFlQRV9JTlRfUkFOR0UpOworICAgIGdzdF92YWx1ZV9zZXRfaW50X3JhbmdlICh2YWx1ZSwgbWluLCBtYXgpOworCisgIH0gZWxzZSB7CisgICAgLyogUHJvcGVydHkgbm90IGF2YWlsYWJsZSBvciBpcyBub3QgYW4gaW50IHR5cGUgKi8KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworR3N0Q2FwcyAqCitnc3RfcHVsc2VfZm9ybWF0X2luZm9fdG9fY2FwcyAocGFfZm9ybWF0X2luZm8gKiBmb3JtYXQpCit7CisgIEdzdENhcHMgKnJldCA9IE5VTEw7CisgIEdWYWx1ZSB2ID0geyAwLCB9OworICBwYV9zYW1wbGVfc3BlYyBzczsKKworICBzd2l0Y2ggKGZvcm1hdC0+ZW5jb2RpbmcpIHsKKyAgICBjYXNlIFBBX0VOQ09ESU5HX1BDTTp7CisgICAgICBjaGFyICp0bXAgPSBOVUxMOworCisgICAgICBwYV9mb3JtYXRfaW5mb190b19zYW1wbGVfc3BlYyAoZm9ybWF0LCAmc3MsIE5VTEwpOworCisgICAgICBpZiAocGFfZm9ybWF0X2luZm9fZ2V0X3Byb3Bfc3RyaW5nIChmb3JtYXQsCisgICAgICAgICAgICAgIFBBX1BST1BfRk9STUFUX1NBTVBMRV9GT1JNQVQsICZ0bXApKSB7CisgICAgICAgIC8qIE5vIHNwZWNpZmljIHNhbXBsZSBmb3JtYXQgbWVhbnMgYW55IHNhbXBsZSBmb3JtYXQgKi8KKyAgICAgICAgcmV0ID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKF9QVUxTRV9DQVBTX1BDTSk7CisgICAgICAgIGdvdG8gb3V0OworCisgICAgICB9IGVsc2UgaWYgKHNzLmZvcm1hdCA9PSBQQV9TQU1QTEVfQUxBVykgeworICAgICAgICByZXQgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoX1BVTFNFX0NBUFNfQUxBVyk7CisKKyAgICAgIH0gZWxzZSBpZiAoc3MuZm9ybWF0ID09IFBBX1NBTVBMRV9VTEFXKSB7CisgICAgICAgIHJldCA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChfUFVMU0VfQ0FQU19NVUxBVyk7CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIExpbmVhciBQQ00gZm9ybWF0ICovCisgICAgICAgIGNvbnN0IGNoYXIgKnNmb3JtYXQgPQorICAgICAgICAgICAgZ3N0X3B1bHNlX3NhbXBsZV9mb3JtYXRfdG9fY2Fwc19mb3JtYXQgKHNzLmZvcm1hdCk7CisKKyAgICAgICAgcmV0ID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKF9QVUxTRV9DQVBTX0xJTkVBUik7CisKKyAgICAgICAgaWYgKHNmb3JtYXQpCisgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAocmV0LCAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgTlVMTCk7CisgICAgICB9CisKKyAgICAgIHBhX3hmcmVlICh0bXApOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBQQV9FTkNPRElOR19BQzNfSUVDNjE5Mzc6CisgICAgICByZXQgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoX1BVTFNFX0NBUFNfQUMzKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQQV9FTkNPRElOR19FQUMzX0lFQzYxOTM3OgorICAgICAgcmV0ID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKF9QVUxTRV9DQVBTX0VBQzMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBBX0VOQ09ESU5HX0RUU19JRUM2MTkzNzoKKyAgICAgIHJldCA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChfUFVMU0VfQ0FQU19EVFMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBBX0VOQ09ESU5HX01QRUdfSUVDNjE5Mzc6CisgICAgICByZXQgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoX1BVTFNFX0NBUFNfTVAzKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HICgiRm91bmQgYSBQQSBmb3JtYXQgdGhhdCB3ZSBkb24ndCBzdXBwb3J0IHlldCIpOworICAgICAgZ290byBvdXQ7CisgIH0KKworICBpZiAoZ3N0X3B1bHNlX2Zvcm1hdF9pbmZvX2ludF9wcm9wX3RvX3ZhbHVlIChmb3JtYXQsIFBBX1BST1BfRk9STUFUX1JBVEUsICZ2KSkKKyAgICBnc3RfY2Fwc19zZXRfdmFsdWUgKHJldCwgInJhdGUiLCAmdik7CisKKyAgZ192YWx1ZV91bnNldCAoJnYpOworCisgIGlmIChnc3RfcHVsc2VfZm9ybWF0X2luZm9faW50X3Byb3BfdG9fdmFsdWUgKGZvcm1hdCwgUEFfUFJPUF9GT1JNQVRfQ0hBTk5FTFMsCisgICAgICAgICAgJnYpKQorICAgIGdzdF9jYXBzX3NldF92YWx1ZSAocmV0LCAiY2hhbm5lbHMiLCAmdik7CisKK291dDoKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2V4dC9wdWxzZS9wdWxzZXV0aWwuaCBiL2V4dC9wdWxzZS9wdWxzZXV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjExNDI0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3B1bHNlL3B1bHNldXRpbC5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiAgR1N0cmVhbWVyIHB1bHNlYXVkaW8gcGx1Z2luCisgKgorICogIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IExlbm5hcnQgUG9ldHRlcmluZworICoKKyAqICBnc3QtcHVsc2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAqICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBnc3QtcHVsc2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIGdzdC1wdWxzZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxCisgKiAgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUFVMU0VVVElMX0hfXworI2RlZmluZSBfX0dTVF9QVUxTRVVUSUxfSF9fCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxwdWxzZS9wdWxzZWF1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvcmluZ2J1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb3NpbmsuaD4KKworCisjaWYgKEdfQllURV9PUkRFUiA9PSBHX0xJVFRMRV9FTkRJQU4pCisjIGRlZmluZSBfUFVMU0VfRk9STUFUUyAgICJ7IFMxNkxFLCBTMTZCRSwgRjMyTEUsIEYzMkJFLCBTMzJMRSwgUzMyQkUsICIgXAorICAgICAgICAgICAgICAgICAgICAgIlMyNExFLCBTMjRCRSwgUzI0XzMyTEUsIFMyNF8zMkJFLCBVOCB9IgorI2Vsc2UKKyMgZGVmaW5lIF9QVUxTRV9GT1JNQVRTICAgInsgUzE2QkUsIFMxNkxFLCBGMzJCRSwgRjMyTEUsIFMzMkJFLCBTMzJMRSwgIiBcCisgICAgICAgICAgICAgICAgICAgICAiUzI0QkUsIFMyNExFLCBTMjRfMzJCRSwgUzI0XzMyTEUsIFU4IH0iCisjZW5kaWYKKworI2RlZmluZSBfUFVMU0VfQ0FQU19MSU5FQVIgXAorICAgICJhdWRpby94LXJhdywgIiBcCisgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBfUFVMU0VfRk9STUFUUyAiLCAiIFwKKyAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiBcCisgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIgXAorICAgICAgImNoYW5uZWxzID0gKGludCkgWyAxLCAzMiBdOyAiCisjZGVmaW5lIF9QVUxTRV9DQVBTX0FMQVcgXAorICAgICJhdWRpby94LWFsYXcsICIgXAorICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWF0sICIgXAorICAgICAgImNoYW5uZWxzID0gKGludCkgWyAxLCAzMiBdOyAiCisjZGVmaW5lIF9QVUxTRV9DQVBTX01VTEFXIFwKKyAgICAiYXVkaW8veC1tdWxhdywgIiBcCisgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYXSwgIiBcCisgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDMyIF07ICIKKworI2RlZmluZSBfUFVMU0VfQ0FQU19BQzMgImF1ZGlvL3gtYWMzLCBmcmFtZWQgPSAoYm9vbGVhbikgdHJ1ZTsgIgorI2RlZmluZSBfUFVMU0VfQ0FQU19FQUMzICJhdWRpby94LWVhYzMsIGZyYW1lZCA9IChib29sZWFuKSB0cnVlOyAiCisjZGVmaW5lIF9QVUxTRV9DQVBTX0RUUyAiYXVkaW8veC1kdHMsIGZyYW1lZCA9IChib29sZWFuKSB0cnVlLCAiIFwKKyAgICAiYmxvY2stc2l6ZSA9IChpbnQpIHsgNTEyLCAxMDI0LCAyMDQ4IH07ICIKKyNkZWZpbmUgX1BVTFNFX0NBUFNfTVAzICJhdWRpby9tcGVnLCBtcGVndmVyc2lvbiA9IChpbnQpIDEsICIgXAorICAgICJtcGVnYXVkaW92ZXJzaW9uID0gKGludCkgWyAxLCAzIF0sIHBhcnNlZCA9IChib29sZWFuKSB0cnVlOyIKKyNkZWZpbmUgX1BVTFNFX0NBUFNfQUFDICJhdWRpby9tcGVnLCBtcGVndmVyc2lvbiA9IChpbnQpIHsgMiwgNCB9LCAiIFwKKyAgICAiZnJhbWVkID0gKGJvb2xlYW4pIHRydWUsIHN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSBhZHRzOyIKKworI2RlZmluZSBfUFVMU0VfQ0FQU19QQ00gXAorICBfUFVMU0VfQ0FQU19MSU5FQVIgXAorICBfUFVMU0VfQ0FQU19BTEFXIFwKKyAgX1BVTFNFX0NBUFNfTVVMQVcKKworCitnYm9vbGVhbiBnc3RfcHVsc2VfZmlsbF9zYW1wbGVfc3BlYyAoR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMsCisgICAgcGFfc2FtcGxlX3NwZWMgKiBzcyk7CitnYm9vbGVhbiBnc3RfcHVsc2VfZmlsbF9mb3JtYXRfaW5mbyAoR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMsCisgICAgcGFfZm9ybWF0X2luZm8gKiogZiwgZ3VpbnQgKiBjaGFubmVscyk7Citjb25zdCBjaGFyICogZ3N0X3B1bHNlX3NhbXBsZV9mb3JtYXRfdG9fY2Fwc19mb3JtYXQgKHBhX3NhbXBsZV9mb3JtYXRfdCBzZik7CisKK2djaGFyICpnc3RfcHVsc2VfY2xpZW50X25hbWUgKHZvaWQpOworCitwYV9jaGFubmVsX21hcCAqZ3N0X3B1bHNlX2dzdF90b19jaGFubmVsX21hcCAocGFfY2hhbm5lbF9tYXAgKiBtYXAsCisgICAgY29uc3QgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpOworCitHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICpnc3RfcHVsc2VfY2hhbm5lbF9tYXBfdG9fZ3N0IChjb25zdCBwYV9jaGFubmVsX21hcCAqIG1hcCwKKyAgICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYyk7CisKK3ZvaWQgZ3N0X3B1bHNlX2N2b2x1bWVfZnJvbV9saW5lYXIgKHBhX2N2b2x1bWUgKnYsIHVuc2lnbmVkIGNoYW5uZWxzLCBnZG91YmxlIHZvbHVtZSk7CisKK3BhX3Byb3BsaXN0ICpnc3RfcHVsc2VfbWFrZV9wcm9wbGlzdCAoY29uc3QgR3N0U3RydWN0dXJlICpwcm9wZXJ0aWVzKTsKK0dzdFN0cnVjdHVyZSAqZ3N0X3B1bHNlX21ha2Vfc3RydWN0dXJlIChwYV9wcm9wbGlzdCAqcHJvcGVydGllcyk7CisKK0dzdENhcHMgKiBnc3RfcHVsc2VfZm9ybWF0X2luZm9fdG9fY2FwcyAocGFfZm9ybWF0X2luZm8gKiBmb3JtYXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4dC9yYXcxMzk0Ly5naXRpZ25vcmUgYi9leHQvcmF3MTM5NC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YjUxODYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcmF3MTM5NC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKK2xpYmdzdDEzOTRfbGEtZ3N0ZHYxMzk0c3JjLmxvVApkaWZmIC0tZ2l0IGEvZXh0L3JhdzEzOTQvTWFrZWZpbGUuYW0gYi9leHQvcmF3MTM5NC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWI2YTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3JhdzEzOTQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyOCBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0MTM5NC5sYQorCitpZiBVU0VfTElCSUVDNjE4ODMKK2hkdnNvdXJjZSA9IGdzdGhkdjEzOTRzcmMuYworaGR2aGVhZGVycyA9IGdzdGhkdjEzOTRzcmMuaAorZWxzZQoraGR2c291cmNlID0gCitoZHZoZWFkZXJzID0gCitlbmRpZgorCitsaWJnc3QxMzk0X2xhX1NPVVJDRVMgPSBcCisJZ3N0MTM5NC5jIGdzdDEzOTRwcm9iZS5jIGdzdGR2MTM5NHNyYy5jICQoaGR2c291cmNlKSBcCisJZ3N0MTM5NGNsb2NrLmMKK2xpYmdzdDEzOTRfbGFfQ0ZMQUdTID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9CQVNFX0NGTEFHUykgXAorCSQoR1NUX0NGTEFHUykgXAorCSQoRFYxMzk0X0NGTEFHUykKK2xpYmdzdDEzOTRfbGFfTElCQUREID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSBcCisJJChHU1RfQkFTRV9MSUJTKSBcCisJJChHU1RfTElCUykgXAorCSQoRFYxMzk0X0xJQlMpCitsaWJnc3QxMzk0X2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RkdjEzOTRzcmMuaCBnc3QxMzk0cHJvYmUuaCAkKGhkdmhlYWRlcnMpIFwKKwlnc3QxMzk0Y2xvY2suaAorCmRpZmYgLS1naXQgYS9leHQvcmF3MTM5NC9nc3QxMzk0LmMgYi9leHQvcmF3MTM5NC9nc3QxMzk0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdhOWU5MwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9yYXcxMzk0L2dzdDEzOTQuYwpAQCAtMCwwICsxLDUxIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisKKyNpbmNsdWRlICJnc3RkdjEzOTRzcmMuaCIKKyNpZmRlZiBIQVZFX0xJQklFQzYxODgzCisjaW5jbHVkZSAiZ3N0aGR2MTM5NHNyYy5oIgorI2VuZGlmCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiZHYxMzk0c3JjIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9EVjEzOTRTUkMpKQorICAgIHJldHVybiBGQUxTRTsKKyNpZmRlZiBIQVZFX0xJQklFQzYxODgzCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImhkdjEzOTRzcmMiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX0hEVjEzOTRTUkMpKQorICAgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgMTM5NCwKKyAgICAiU291cmNlIGZvciB2aWRlbyBkYXRhIHZpYSBJRUVFMTM5NCBpbnRlcmZhY2UiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9leHQvcmF3MTM5NC9nc3QxMzk0Y2xvY2suYyBiL2V4dC9yYXcxMzk0L2dzdDEzOTRjbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMzQxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcmF3MTM5NC9nc3QxMzk0Y2xvY2suYwpAQCAtMCwwICsxLDE1OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAgICAgIDIwMDAgV2ltIFRheW1hbnMgPHd0YXlAY2hlbGxvLmJlPgorICogQ29weXJpZ2h0IChDKSAyMDA5ICAgICAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogZ3N0MTM5NGNsb2NrLmM6IENsb2NrIGZvciB1c2UgYnkgSUVFRSAxMzk0IHBsdWdpbnMKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3QxMzk0Y2xvY2suaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0XzEzOTRfY2xvY2tfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0XzEzOTRfY2xvY2tfZGVidWcKKworc3RhdGljIHZvaWQgZ3N0XzEzOTRfY2xvY2tfY2xhc3NfaW5pdCAoR3N0MTM5NENsb2NrQ2xhc3MgKiBrbGFzcyk7CitzdGF0aWMgdm9pZCBnc3RfMTM5NF9jbG9ja19pbml0IChHc3QxMzk0Q2xvY2sgKiBjbG9jayk7CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUgZ3N0XzEzOTRfY2xvY2tfZ2V0X2ludGVybmFsX3RpbWUgKEdzdENsb2NrICogY2xvY2spOworCitzdGF0aWMgR3N0U3lzdGVtQ2xvY2tDbGFzcyAqcGFyZW50X2NsYXNzID0gTlVMTDsKKworLyogc3RhdGljIGd1aW50IGdzdF8xMzk0X2Nsb2NrX3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07ICovCisKK0dUeXBlCitnc3RfMTM5NF9jbG9ja19nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGNsb2NrX3R5cGUgPSAwOworCisgIGlmICghY2xvY2tfdHlwZSkgeworICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gY2xvY2tfaW5mbyA9IHsKKyAgICAgIHNpemVvZiAoR3N0MTM5NENsb2NrQ2xhc3MpLAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgICAoR0NsYXNzSW5pdEZ1bmMpIGdzdF8xMzk0X2Nsb2NrX2NsYXNzX2luaXQsCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICAgIHNpemVvZiAoR3N0MTM5NENsb2NrKSwKKyAgICAgIDQsCisgICAgICAoR0luc3RhbmNlSW5pdEZ1bmMpIGdzdF8xMzk0X2Nsb2NrX2luaXQsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIGNsb2NrX3R5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChHU1RfVFlQRV9TWVNURU1fQ0xPQ0ssICJHc3QxMzk0Q2xvY2siLAorICAgICAgICAmY2xvY2tfaW5mbywgMCk7CisgIH0KKyAgcmV0dXJuIGNsb2NrX3R5cGU7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF8xMzk0X2Nsb2NrX2NsYXNzX2luaXQgKEdzdDEzOTRDbG9ja0NsYXNzICoga2xhc3MpCit7CisgIEdzdENsb2NrQ2xhc3MgKmdzdGNsb2NrX2NsYXNzOworCisgIGdzdGNsb2NrX2NsYXNzID0gKEdzdENsb2NrQ2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ3N0Y2xvY2tfY2xhc3MtPmdldF9pbnRlcm5hbF90aW1lID0gZ3N0XzEzOTRfY2xvY2tfZ2V0X2ludGVybmFsX3RpbWU7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF8xMzk0X2Nsb2NrX2RlYnVnLCAiMTM5NGNsb2NrIiwgMCwgIjEzOTRjbG9jayIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0XzEzOTRfY2xvY2tfaW5pdCAoR3N0MTM5NENsb2NrICogY2xvY2spCit7CisgIEdTVF9PQkpFQ1RfRkxBR19TRVQgKGNsb2NrLCBHU1RfQ0xPQ0tfRkxBR19DQU5fU0VUX01BU1RFUik7Cit9CisKKy8qKgorICogZ3N0XzEzOTRfY2xvY2tfbmV3OgorICogQG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBjbG9jaworICoKKyAqIENyZWF0ZSBhIG5ldyAjR3N0MTM5NENsb2NrIGluc3RhbmNlLgorICoKKyAqIFJldHVybnM6IGEgbmV3ICNHc3QxMzk0Q2xvY2sKKyAqLworR3N0MTM5NENsb2NrICoKK2dzdF8xMzk0X2Nsb2NrX25ldyAoY29uc3QgZ2NoYXIgKiBuYW1lKQoreworICBHc3QxMzk0Q2xvY2sgKl8xMzk0Y2xvY2sgPQorICAgICAgR1NUXzEzOTRfQ0xPQ0sgKGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfMTM5NF9DTE9DSywgIm5hbWUiLCBuYW1lLAorICAgICAgICAgICJjbG9jay10eXBlIiwgR1NUX0NMT0NLX1RZUEVfT1RIRVIsIE5VTEwpKTsKKworICAvKiBDbGVhciBmbG9hdGluZyBmbGFnICovCisgIGdzdF9vYmplY3RfcmVmX3NpbmsgKF8xMzk0Y2xvY2spOworCisgIHJldHVybiBfMTM5NGNsb2NrOworfQorCitzdGF0aWMgR3N0Q2xvY2tUaW1lCitnc3RfMTM5NF9jbG9ja19nZXRfaW50ZXJuYWxfdGltZSAoR3N0Q2xvY2sgKiBjbG9jaykKK3sKKyAgR3N0MTM5NENsb2NrICpfMTM5NGNsb2NrOworICBHc3RDbG9ja1RpbWUgcmVzdWx0OworICBndWludDMyIGN5Y2xlX3RpbWVyOworICBndWludDY0IGxvY2FsX3RpbWU7CisKKyAgXzEzOTRjbG9jayA9IEdTVF8xMzk0X0NMT0NLX0NBU1QgKGNsb2NrKTsKKworICBpZiAoXzEzOTRjbG9jay0+aGFuZGxlICE9IE5VTEwpIHsKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKGNsb2NrKTsKKyAgICByYXcxMzk0X3JlYWRfY3ljbGVfdGltZXIgKF8xMzk0Y2xvY2stPmhhbmRsZSwgJmN5Y2xlX3RpbWVyLCAmbG9jYWxfdGltZSk7CisKKyAgICBpZiAoY3ljbGVfdGltZXIgPCBfMTM5NGNsb2NrLT5jeWNsZV90aW1lcl9sbykgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKGNsb2NrLCAib3ZlcmZsb3cgJXUgdG8gJXUiLAorICAgICAgICAgIF8xMzk0Y2xvY2stPmN5Y2xlX3RpbWVyX2xvLCBjeWNsZV90aW1lcik7CisKKyAgICAgIF8xMzk0Y2xvY2stPmN5Y2xlX3RpbWVyX2hpKys7CisgICAgfQorICAgIF8xMzk0Y2xvY2stPmN5Y2xlX3RpbWVyX2xvID0gY3ljbGVfdGltZXI7CisKKyAgICAvKiBnZXQgdGhlIHNlY29uZHMgZnJvbSB0aGUgY3ljbGVTZWNvbmRzIGNvdW50ZXIgKi8KKyAgICByZXN1bHQgPSAoKCgoKGd1aW50NjQpIF8xMzk0Y2xvY2stPmN5Y2xlX3RpbWVyX2hpKSA8PCAzMikgfAorICAgICAgICAgICAgY3ljbGVfdGltZXIpID4+IDI1KSAqIEdTVF9TRUNPTkQ7CisgICAgLyogYWRkIHRoZSBtaWNyb3NlY29uZHMgZnJvbSB0aGUgY3ljbGVDb3VudCBjb3VudGVyICovCisgICAgcmVzdWx0ICs9ICgoKGN5Y2xlX3RpbWVyID4+IDEyKSAmIDB4MWZmZikgKiAxMjUpICogR1NUX1VTRUNPTkQ7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoY2xvY2ssICJyZXN1bHQgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChyZXN1bHQpKTsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAoY2xvY2spOworICB9IGVsc2UgeworICAgIHJlc3VsdCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkCitnc3RfMTM5NF9jbG9ja19zZXRfaGFuZGxlIChHc3QxMzk0Q2xvY2sgKiBjbG9jaywgcmF3MTM5NGhhbmRsZV90IGhhbmRsZSkKK3sKKyAgY2xvY2stPmhhbmRsZSA9IGhhbmRsZTsKKyAgY2xvY2stPmN5Y2xlX3RpbWVyX2xvID0gMDsKKyAgY2xvY2stPmN5Y2xlX3RpbWVyX2hpID0gMDsKK30KKwordm9pZAorZ3N0XzEzOTRfY2xvY2tfdW5zZXRfaGFuZGxlIChHc3QxMzk0Q2xvY2sgKiBjbG9jaykKK3sKKyAgY2xvY2stPmhhbmRsZSA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9leHQvcmF3MTM5NC9nc3QxMzk0Y2xvY2suaCBiL2V4dC9yYXcxMzk0L2dzdDEzOTRjbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMTI1MWUKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcmF3MTM5NC9nc3QxMzk0Y2xvY2suaApAQCAtMCwwICsxLDc3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwNSBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5ICAgICAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogZ3N0MTM5NGNsb2NrLmg6IENsb2NrIGZvciB1c2UgYnkgdGhlIElFRUUgMTM5NAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfMTM5NF9DTE9DS19IX18KKyNkZWZpbmUgX19HU1RfMTM5NF9DTE9DS19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0c3lzdGVtY2xvY2suaD4KKworI2luY2x1ZGUgPGxpYnJhdzEzOTQvcmF3MTM5NC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfMTM5NF9DTE9DSyBcCisgIChnc3RfMTM5NF9jbG9ja19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfMTM5NF9DTE9DSyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFXzEzOTRfQ0xPQ0ssR3N0MTM5NENsb2NrKSkKKyNkZWZpbmUgR1NUXzEzOTRfQ0xPQ0tfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfMTM5NF9DTE9DSyxHc3QxMzk0Q2xvY2tDbGFzcykpCisjZGVmaW5lIEdTVF9JU18xMzk0X0NMT0NLKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfMTM5NF9DTE9DSykpCisjZGVmaW5lIEdTVF9JU18xMzk0X0NMT0NLX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFXzEzOTRfQ0xPQ0spKQorI2RlZmluZSBHU1RfMTM5NF9DTE9DS19DQVNUKG9iaikgXAorICAoKEdzdDEzOTRDbG9jayopKG9iaikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3QxMzk0Q2xvY2sgR3N0MTM5NENsb2NrOwordHlwZWRlZiBzdHJ1Y3QgX0dzdDEzOTRDbG9ja0NsYXNzIEdzdDEzOTRDbG9ja0NsYXNzOworCisvKioKKyAqIEdzdDEzOTRDbG9jazoKKyAqIEBjbG9jazogcGFyZW50ICNHc3RTeXN0ZW1DbG9jaworICoKKyAqIE9wYXF1ZSAjR3N0MTM5NENsb2NrLgorICovCitzdHJ1Y3QgX0dzdDEzOTRDbG9jayB7CisgIEdzdFN5c3RlbUNsb2NrIGNsb2NrOworCisgIHJhdzEzOTRoYW5kbGVfdCBoYW5kbGU7CisKKyAgZ3VpbnQzMiBjeWNsZV90aW1lcl9sbzsKKyAgZ3VpbnQzMiBjeWNsZV90aW1lcl9oaTsKK307CisKK3N0cnVjdCBfR3N0MTM5NENsb2NrQ2xhc3MgeworICBHc3RTeXN0ZW1DbG9ja0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlICAgICAgICAgICBnc3RfMTM5NF9jbG9ja19nZXRfdHlwZSAgICAgICAgKHZvaWQpOworR3N0MTM5NENsb2NrKiAgIGdzdF8xMzk0X2Nsb2NrX25ldyAgICAgICAgICAgICAoY29uc3QgZ2NoYXIgKm5hbWUpOwordm9pZCAgICAgICAgICAgIGdzdF8xMzk0X2Nsb2NrX3NldF9oYW5kbGUgICAgICAoR3N0MTM5NENsb2NrICpjbG9jaywKKyAgICByYXcxMzk0aGFuZGxlX3QgaGFuZGxlKTsKK3ZvaWQgICAgICAgICAgICBnc3RfMTM5NF9jbG9ja191bnNldF9oYW5kbGUgICAgICAoR3N0MTM5NENsb2NrICpjbG9jayk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF8xMzk0X0NMT0NLX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L3JhdzEzOTQvZ3N0MTM5NHByb2JlLmMgYi9leHQvcmF3MTM5NC9nc3QxMzk0cHJvYmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDExYTAxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3JhdzEzOTQvZ3N0MTM5NHByb2JlLmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA3IEp1bGllbiBQdXlkdCA8anB1eWR0QGZyZWUuZnI+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpYmF2YzEzOTQvYXZjMTM5NC5oPgorI2luY2x1ZGUgPGxpYmF2YzEzOTQvYXZjMTM5NF92Y3IuaD4KKyNpbmNsdWRlIDxsaWJhdmMxMzk0L3JvbTEzOTQuaD4KKyNpbmNsdWRlIDxsaWJyYXcxMzk0L3JhdzEzOTQuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImdzdDEzOTRwcm9iZS5oIgorCisjaWYgMAorCitzdGF0aWMgR1ZhbHVlQXJyYXkgKgorZ3N0XzEzOTRfZ2V0X2d1aWRfYXJyYXkgKHZvaWQpCit7CisgIEdWYWx1ZUFycmF5ICpyZXN1bHQgPSBOVUxMOworICByYXcxMzk0aGFuZGxlX3QgaGFuZGxlID0gTlVMTDsKKyAgaW50IG51bV9wb3J0cyA9IDA7CisgIGludCBwb3J0ID0gMDsKKyAgaW50IG51bV9ub2RlcyA9IDA7CisgIGludCBub2RlID0gMDsKKyAgcm9tMTM5NF9kaXJlY3RvcnkgZGlyZWN0b3J5OworICBHVmFsdWUgdmFsdWUgPSB7IDAsIH07CisKKyAgaGFuZGxlID0gcmF3MTM5NF9uZXdfaGFuZGxlICgpOworCisgIGlmIChoYW5kbGUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBudW1fcG9ydHMgPSByYXcxMzk0X2dldF9wb3J0X2luZm8gKGhhbmRsZSwgTlVMTCwgMCk7CisgIGZvciAocG9ydCA9IDA7IHBvcnQgPCBudW1fcG9ydHM7IHBvcnQrKykgeworICAgIGlmIChyYXcxMzk0X3NldF9wb3J0IChoYW5kbGUsIHBvcnQpID49IDApIHsKKyAgICAgIG51bV9ub2RlcyA9IHJhdzEzOTRfZ2V0X25vZGVjb3VudCAoaGFuZGxlKTsKKyAgICAgIGZvciAobm9kZSA9IDA7IG5vZGUgPCBudW1fbm9kZXM7IG5vZGUrKykgeworICAgICAgICByb20xMzk0X2dldF9kaXJlY3RvcnkgKGhhbmRsZSwgbm9kZSwgJmRpcmVjdG9yeSk7CisgICAgICAgIGlmIChyb20xMzk0X2dldF9ub2RlX3R5cGUgKCZkaXJlY3RvcnkpID09IFJPTTEzOTRfTk9ERV9UWVBFX0FWQyAmJgorICAgICAgICAgICAgYXZjMTM5NF9jaGVja19zdWJ1bml0X3R5cGUgKGhhbmRsZSwgbm9kZSwKKyAgICAgICAgICAgICAgICBBVkMxMzk0X1NVQlVOSVRfVFlQRV9WQ1IpKSB7CisgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgcmVzdWx0ID0gZ192YWx1ZV9hcnJheV9uZXcgKDMpOyAgICAgLyogbG9va3MgbGlrZSBhIHNlbnNpYmxlIGRlZmF1bHQgKi8KKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZ2YWx1ZSwgR19UWVBFX1VJTlQ2NCk7CisgICAgICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICgmdmFsdWUsIHJvbTEzOTRfZ2V0X2d1aWQgKGhhbmRsZSwgbm9kZSkpOworICAgICAgICAgIGdfdmFsdWVfYXJyYXlfYXBwZW5kIChyZXN1bHQsICZ2YWx1ZSk7CisgICAgICAgICAgZ192YWx1ZV91bnNldCAoJnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBjb25zdCBHTGlzdCAqCitnc3RfMTM5NF9wcm9wZXJ0eV9wcm9iZV9nZXRfcHJvcGVydGllcyAoR3N0UHJvcGVydHlQcm9iZSAqIHByb2JlKQoreworICBzdGF0aWMgR0xpc3QgKnJlc3VsdCA9IE5VTEw7CisgIEdPYmplY3RDbGFzcyAqa2xhc3MgPSBOVUxMOworICBHUGFyYW1TcGVjICpzcGVjID0gTlVMTDsKKworICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICBrbGFzcyA9IEdfT0JKRUNUX0dFVF9DTEFTUyAocHJvYmUpOworICAgIHNwZWMgPSBnX29iamVjdF9jbGFzc19maW5kX3Byb3BlcnR5IChrbGFzcywgImd1aWQiKTsKKyAgICByZXN1bHQgPSBnX2xpc3RfYXBwZW5kIChyZXN1bHQsIHNwZWMpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2dzdF8xMzk0X3Byb3BlcnR5X3Byb2JlX3Byb2JlX3Byb3BlcnR5IChHc3RQcm9wZXJ0eVByb2JlICogcHJvYmUsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBpZiAoIWdfc3RyX2VxdWFsIChwc3BlYy0+bmFtZSwgImd1aWQiKSkKKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKHByb2JlLCBwcm9wX2lkLCBwc3BlYyk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0XzEzOTRfcHJvcGVydHlfcHJvYmVfbmVlZHNfcHJvYmUgKEdzdFByb3BlcnR5UHJvYmUgKiBwcm9iZSwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR1ZhbHVlQXJyYXkgKgorZ3N0XzEzOTRfcHJvcGVydHlfcHJvYmVfZ2V0X3ZhbHVlcyAoR3N0UHJvcGVydHlQcm9iZSAqIHByb2JlLCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR1ZhbHVlQXJyYXkgKnJlc3VsdCA9IE5VTEw7CisKKyAgaWYgKCFnX3N0cl9lcXVhbCAocHNwZWMtPm5hbWUsICJndWlkIikpIHsKKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKHByb2JlLCBwcm9wX2lkLCBwc3BlYyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXN1bHQgPSBnc3RfMTM5NF9nZXRfZ3VpZF9hcnJheSAoKTsKKworICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgR1NUX0xPR19PQkpFQ1QgKHByb2JlLCAiTm8gZ3VpZCBmb3VuZCIpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfMTM5NF9wcm9wZXJ0eV9wcm9iZV9pbnRlcmZhY2VfaW5pdCAoR3N0UHJvcGVydHlQcm9iZUludGVyZmFjZSAqIGlmYWNlKQoreworICBpZmFjZS0+Z2V0X3Byb3BlcnRpZXMgPSBnc3RfMTM5NF9wcm9wZXJ0eV9wcm9iZV9nZXRfcHJvcGVydGllczsKKyAgaWZhY2UtPnByb2JlX3Byb3BlcnR5ID0gZ3N0XzEzOTRfcHJvcGVydHlfcHJvYmVfcHJvYmVfcHJvcGVydHk7CisgIGlmYWNlLT5uZWVkc19wcm9iZSA9IGdzdF8xMzk0X3Byb3BlcnR5X3Byb2JlX25lZWRzX3Byb2JlOworICBpZmFjZS0+Z2V0X3ZhbHVlcyA9IGdzdF8xMzk0X3Byb3BlcnR5X3Byb2JlX2dldF92YWx1ZXM7Cit9CisKK3ZvaWQKK2dzdF8xMzk0X3R5cGVfYWRkX3Byb3BlcnR5X3Byb2JlX2ludGVyZmFjZSAoR1R5cGUgdHlwZSkKK3sKKyAgc3RhdGljIGNvbnN0IEdJbnRlcmZhY2VJbmZvIHByb2JlX2lmYWNlX2luZm8gPSB7CisgICAgKEdJbnRlcmZhY2VJbml0RnVuYykgZ3N0XzEzOTRfcHJvcGVydHlfcHJvYmVfaW50ZXJmYWNlX2luaXQsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICB9OworCisgIGdfdHlwZV9hZGRfaW50ZXJmYWNlX3N0YXRpYyAodHlwZSwgR1NUX1RZUEVfUFJPUEVSVFlfUFJPQkUsCisgICAgICAmcHJvYmVfaWZhY2VfaW5mbyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L3JhdzEzOTQvZ3N0MTM5NHByb2JlLmggYi9leHQvcmF3MTM5NC9nc3QxMzk0cHJvYmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGEzMjMyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3JhdzEzOTQvZ3N0MTM5NHByb2JlLmgKQEAgLTAsMCArMSwzNCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgSnVsaWVuIFB1eWR0IDxqcHV5ZHRAZnJlZS5mcj4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIEdTVF8xMzk0X1BST0JFX0gKKyNkZWZpbmUgR1NUXzEzOTRfUFJPQkVfSAorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNpZiAwCit2b2lkIGdzdF8xMzk0X3R5cGVfYWRkX3Byb3BlcnR5X3Byb2JlX2ludGVyZmFjZSAoR1R5cGUgdHlwZSk7CisjZW5kaWYKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUXzEzOTRfUFJPQkVfSCAqLworCmRpZmYgLS1naXQgYS9leHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYyBiL2V4dC9yYXcxMzk0L2dzdGR2MTM5NHNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZTFhZjEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuYwpAQCAtMCwwICsxLDExMTIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgPDIwMDA+IERhbmllbCBGaXNjaGVyIDxkYW5AZjNjLmNvbT4KKyAqICAgICAgICAgICAgICAgPDIwMDQ+IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKiAgICAgICAgICAgICAgIDwyMDA2PiBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZHYxMzk0c3JjCisgKgorICogUmVhZCBEViAoZGlnaXRhbCB2aWRlbykgZGF0YSBmcm9tIGZpcmV3aXJlIHBvcnQuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGR2MTM5NHNyYyAhIHF1ZXVlICEgZHZkZW11eCBuYW1lPWQgISBxdWV1ZSAhIGR2ZGVjICEgeHZpbWFnZXNpbmsgZC4gISBxdWV1ZSAhIGFsc2FzaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIGNhcHR1cmVzIGZyb20gdGhlIGZpcmV3aXJlIHBvcnQgYW5kIGRpc3BsYXlzIGl0IChtaWdodCBuZWVkCisgKiBmb3JtYXQgY29udmVydGVycyBmb3IgYXVkaW8vdmlkZW8pLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8bGliYXZjMTM5NC9hdmMxMzk0Lmg+CisjaW5jbHVkZSA8bGliYXZjMTM5NC9hdmMxMzk0X3Zjci5oPgorI2luY2x1ZGUgPGxpYmF2YzEzOTQvcm9tMTM5NC5oPgorI2luY2x1ZGUgPGxpYnJhdzEzOTQvcmF3MTM5NC5oPgorI2lmZGVmIEhBVkVfTElCSUVDNjE4ODMKKyNpbmNsdWRlIDxsaWJpZWM2MTg4My9pZWM2MTg4My5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnc3RkdjEzOTRzcmMuaCIKKyNpbmNsdWRlICJnc3QxMzk0cHJvYmUuaCIKKyNpbmNsdWRlICJnc3QxMzk0Y2xvY2suaCIKKworCisjZGVmaW5lIENPTlRST0xfU1RPUCAgICAgICAgICAgICdTJyAgICAgLyogc3RvcCB0aGUgc2VsZWN0IGNhbGwgKi8KKyNkZWZpbmUgQ09OVFJPTF9TT0NLRVRTKHNyYykgICBzcmMtPmNvbnRyb2xfc29jaworI2RlZmluZSBXUklURV9TT0NLRVQoc3JjKSAgICAgIHNyYy0+Y29udHJvbF9zb2NrWzFdCisjZGVmaW5lIFJFQURfU09DS0VUKHNyYykgICAgICAgc3JjLT5jb250cm9sX3NvY2tbMF0KKworI2RlZmluZSBTRU5EX0NPTU1BTkQoc3JjLCBjb21tYW5kKSAgICAgICAgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IEdfR05VQ19VTlVTRUQgX3JlczsgdW5zaWduZWQgY2hhciBjOyBjID0gY29tbWFuZDsgICBcCisgIF9yZXMgPSB3cml0ZSAoV1JJVEVfU09DS0VUKHNyYyksICZjLCAxKTsgIFwKK30gR19TVE1UX0VORAorCisjZGVmaW5lIFJFQURfQ09NTUFORChzcmMsIGNvbW1hbmQsIHJlcykgICAgICAgIFwKK0dfU1RNVF9TVEFSVCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXMgPSByZWFkKFJFQURfU09DS0VUKHNyYyksICZjb21tYW5kLCAxKTsgICBcCit9IEdfU1RNVF9FTkQKKworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChkdjEzOTRzcmNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKGR2MTM5NHNyY19kZWJ1ZykKKworI2RlZmluZSBQQUxfRlJBTUVTSVpFIDE0NDAwMAorI2RlZmluZSBQQUxfRlJBTUVSQVRFIDI1CisKKyNkZWZpbmUgTlRTQ19GUkFNRVNJWkUgMTIwMDAwCisjZGVmaW5lIE5UU0NfRlJBTUVSQVRFIDMwCisKK2VudW0KK3sKKyAgU0lHTkFMX0ZSQU1FX0RST1BQRUQsCisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKKyNkZWZpbmUgREVGQVVMVF9QT1JUICAgIC0xCisjZGVmaW5lIERFRkFVTFRfQ0hBTk5FTCAgIDYzCisjZGVmaW5lIERFRkFVTFRfQ09OU0VDVVRJVkUgMQorI2RlZmluZSBERUZBVUxUX1NLSVAgICAgMAorI2RlZmluZSBERUZBVUxUX0RST1BfSU5DT01QTEVURSBUUlVFCisjZGVmaW5lIERFRkFVTFRfVVNFX0FWQyAgIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9HVUlEICAgIDAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUE9SVCwKKyAgUFJPUF9DSEFOTkVMLAorICBQUk9QX0NPTlNFQ1VUSVZFLAorICBQUk9QX1NLSVAsCisgIFBST1BfRFJPUF9JTkNPTVBMRVRFLAorICBQUk9QX1VTRV9BVkMsCisgIFBST1BfR1VJRCwKKyAgUFJPUF9ERVZJQ0VfTkFNRQorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtZHYsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgTlRTQywgUEFMIH0sICIgInN5c3RlbXN0cmVhbSA9IChib29sZWFuKSB0cnVlIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfZHYxMzk0c3JjX3VyaV9oYW5kbGVyX2luaXQgKGdwb2ludGVyIGdfaWZhY2UsCisgICAgZ3BvaW50ZXIgaWZhY2VfZGF0YSk7CisKK3N0YXRpYyB2b2lkIGdzdF9kdjEzOTRzcmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2R2MTM5NHNyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfZHYxMzk0c3JjX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0Q2xvY2sgKmdzdF9kdjEzOTRzcmNfcHJvdmlkZV9jbG9jayAoR3N0RWxlbWVudCAqIGVsZW1lbnQpOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9kdjEzOTRfc3JjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZHYxMzk0c3JjX3N0YXJ0IChHc3RCYXNlU3JjICogYnNyYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2R2MTM5NHNyY19zdG9wIChHc3RCYXNlU3JjICogYnNyYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2R2MTM5NHNyY191bmxvY2sgKEdzdEJhc2VTcmMgKiBic3JjKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2R2MTM5NHNyY19jcmVhdGUgKEdzdFB1c2hTcmMgKiBwc3JjLCBHc3RCdWZmZXIgKiogYnVmKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9kdjEzOTRzcmNfcXVlcnkgKEdzdEJhc2VTcmMgKiBzcmMsIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIHZvaWQgZ3N0X2R2MTM5NHNyY191cGRhdGVfZGV2aWNlX25hbWUgKEdzdERWMTM5NFNyYyAqIHNyYyk7CisKKyNkZWZpbmUgZ3N0X2R2MTM5NHNyY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoR3N0RFYxMzk0U3JjLCBnc3RfZHYxMzk0c3JjLCBHU1RfVFlQRV9QVVNIX1NSQywKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1VSSV9IQU5ETEVSLAorICAgICAgICBnc3RfZHYxMzk0c3JjX3VyaV9oYW5kbGVyX2luaXQpKTsKKworc3RhdGljIGd1aW50IGdzdF9kdjEzOTRzcmNfc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsKKworc3RhdGljIHZvaWQKK2dzdF9kdjEzOTRzcmNfY2xhc3NfaW5pdCAoR3N0RFYxMzk0U3JjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VTcmNDbGFzcyAqZ3N0YmFzZXNyY19jbGFzczsKKyAgR3N0UHVzaFNyY0NsYXNzICpnc3RwdXNoc3JjX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmFzZXNyY19jbGFzcyA9IChHc3RCYXNlU3JjQ2xhc3MgKikga2xhc3M7CisgIGdzdHB1c2hzcmNfY2xhc3MgPSAoR3N0UHVzaFNyY0NsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9kdjEzOTRzcmNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfZHYxMzk0c3JjX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9kdjEzOTRzcmNfZGlzcG9zZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5wcm92aWRlX2Nsb2NrID0gZ3N0X2R2MTM5NHNyY19wcm92aWRlX2Nsb2NrOworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfZHYxMzk0X3NyY19jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0X2R2MTM5NHNyY19zaWduYWxzW1NJR05BTF9GUkFNRV9EUk9QUEVEXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJmcmFtZS1kcm9wcGVkIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdERWMTM5NFNyY0NsYXNzLCBmcmFtZV9kcm9wcGVkKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19WT0lELCBHX1RZUEVfTk9ORSwgMCk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9QT1JULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInBvcnQiLCAiUG9ydCIsICJQb3J0IG51bWJlciAoLTEgYXV0b21hdGljKSIsCisgICAgICAgICAgLTEsIDE2LCBERUZBVUxUX1BPUlQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0NIQU5ORUwsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiY2hhbm5lbCIsICJDaGFubmVsIiwgIkNoYW5uZWwgbnVtYmVyIGZvciBsaXN0ZW5pbmciLAorICAgICAgICAgIDAsIDY0LCBERUZBVUxUX0NIQU5ORUwsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0NPTlNFQ1VUSVZFLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImNvbnNlY3V0aXZlIiwgImNvbnNlY3V0aXZlIGZyYW1lcyIsCisgICAgICAgICAgInNlbmQgbiBjb25zZWN1dGl2ZSBmcmFtZXMgYWZ0ZXIgc2tpcHBpbmciLCAxLCBHX01BWElOVCwKKyAgICAgICAgICBERUZBVUxUX0NPTlNFQ1VUSVZFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9TS0lQLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInNraXAiLCAic2tpcCBmcmFtZXMiLCAic2tpcCBuIGZyYW1lcyIsCisgICAgICAgICAgMCwgR19NQVhJTlQsIERFRkFVTFRfU0tJUCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9EUk9QX0lOQ09NUExFVEUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImRyb3AtaW5jb21wbGV0ZSIsICJkcm9wIGluY29tcGxldGUiLAorICAgICAgICAgICJkcm9wIGluY29tcGxldGUgZnJhbWVzIiwgREVGQVVMVF9EUk9QX0lOQ09NUExFVEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfVVNFX0FWQywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgidXNlLWF2YyIsICJVc2UgQVYvQyIsICJVc2UgQVYvQyBWVFIgY29udHJvbCIsCisgICAgICAgICAgREVGQVVMVF9VU0VfQVZDLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9HVUlELAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoImd1aWQiLCAiR1VJRCIsCisgICAgICAgICAgInNlbGVjdCBvbmUgb2YgbXVsdGlwbGUgRFYgZGV2aWNlcyBieSBpdHMgR1VJRC4gdXNlIGEgaGV4YWRlY2ltYWwgIgorICAgICAgICAgICJsaWtlIDB4aGhoaGhoaGhoaGhoaGhoaC4gKDAgPSBubyBndWlkKSIsIDAsIEdfTUFYVUlOVDY0LAorICAgICAgICAgIERFRkFVTFRfR1VJRCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3REVjEzOTRTcmM6ZGV2aWNlLW5hbWU6CisgICAqCisgICAqIERlc2NyaXB0aXZlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBvcGVuZWQgZGV2aWNlCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0RFVklDRV9OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRldmljZS1uYW1lIiwgImRldmljZSBuYW1lIiwKKyAgICAgICAgICAidXNlci1mcmllbmRseSBuYW1lIG9mIHRoZSBkZXZpY2UiLCAiRGVmYXVsdCIsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RiYXNlc3JjX2NsYXNzLT5uZWdvdGlhdGUgPSBOVUxMOworICBnc3RiYXNlc3JjX2NsYXNzLT5zdGFydCA9IGdzdF9kdjEzOTRzcmNfc3RhcnQ7CisgIGdzdGJhc2VzcmNfY2xhc3MtPnN0b3AgPSBnc3RfZHYxMzk0c3JjX3N0b3A7CisgIGdzdGJhc2VzcmNfY2xhc3MtPnVubG9jayA9IGdzdF9kdjEzOTRzcmNfdW5sb2NrOworICBnc3RiYXNlc3JjX2NsYXNzLT5xdWVyeSA9IGdzdF9kdjEzOTRzcmNfcXVlcnk7CisKKyAgZ3N0cHVzaHNyY19jbGFzcy0+Y3JlYXRlID0gZ3N0X2R2MTM5NHNyY19jcmVhdGU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfZmFjdG9yeSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJGaXJld2lyZSAoMTM5NCkgRFYgdmlkZW8gc291cmNlIiwgIlNvdXJjZS9WaWRlbyIsCisgICAgICAiU291cmNlIGZvciBEViB2aWRlbyBkYXRhIGZyb20gZmlyZXdpcmUgcG9ydCIsCisgICAgICAiRXJpayBXYWx0aGluc2VuIDxvbWVnYUB0ZW1wbGUtYmFwdGlzdC5jb20+LCAiCisgICAgICAiRGFuaWVsIEZpc2NoZXIgPGRhbkBmM2MuY29tPiwgIiAiV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4sICIKKyAgICAgICJaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZHYxMzk0c3JjX2RlYnVnLCAiZHYxMzk0c3JjIiwgMCwKKyAgICAgICJEViBmaXJld2lyZSBzb3VyY2UiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kdjEzOTRzcmNfaW5pdCAoR3N0RFYxMzk0U3JjICogZHYxMzk0c3JjKQoreworICBHc3RQYWQgKnNyY3BhZCA9IEdTVF9CQVNFX1NSQ19QQUQgKGR2MTM5NHNyYyk7CisKKyAgZ3N0X2Jhc2Vfc3JjX3NldF9saXZlIChHU1RfQkFTRV9TUkMgKGR2MTM5NHNyYyksIFRSVUUpOworICBnc3RfYmFzZV9zcmNfc2V0X2Zvcm1hdCAoR1NUX0JBU0VfU1JDIChkdjEzOTRzcmMpLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfYmFzZV9zcmNfc2V0X2RvX3RpbWVzdGFtcCAoR1NUX0JBU0VfU1JDIChkdjEzOTRzcmMpLCBUUlVFKTsKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoc3JjcGFkKTsKKworICBkdjEzOTRzcmMtPnBvcnQgPSBERUZBVUxUX1BPUlQ7CisgIGR2MTM5NHNyYy0+Y2hhbm5lbCA9IERFRkFVTFRfQ0hBTk5FTDsKKworICBkdjEzOTRzcmMtPmNvbnNlY3V0aXZlID0gREVGQVVMVF9DT05TRUNVVElWRTsKKyAgZHYxMzk0c3JjLT5za2lwID0gREVGQVVMVF9TS0lQOworICBkdjEzOTRzcmMtPmRyb3BfaW5jb21wbGV0ZSA9IERFRkFVTFRfRFJPUF9JTkNPTVBMRVRFOworICBkdjEzOTRzcmMtPnVzZV9hdmMgPSBERUZBVUxUX1VTRV9BVkM7CisgIGR2MTM5NHNyYy0+Z3VpZCA9IERFRkFVTFRfR1VJRDsKKyAgZHYxMzk0c3JjLT51cmkgPSBnX3N0cmR1cF9wcmludGYgKCJkdjovLyVkIiwgZHYxMzk0c3JjLT5wb3J0KTsKKyAgZHYxMzk0c3JjLT5kZXZpY2VfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoIkRlZmF1bHQiKTsKKworICBSRUFEX1NPQ0tFVCAoZHYxMzk0c3JjKSA9IC0xOworICBXUklURV9TT0NLRVQgKGR2MTM5NHNyYykgPSAtMTsKKworICAvKiBpbml0aWFsaXplZCB3aGVuIGZpcnN0IGhlYWRlciByZWNlaXZlZCAqLworICBkdjEzOTRzcmMtPmZyYW1lX3NpemUgPSAwOworCisgIGR2MTM5NHNyYy0+YnVmID0gTlVMTDsKKyAgZHYxMzk0c3JjLT5mcmFtZSA9IE5VTEw7CisgIGR2MTM5NHNyYy0+ZnJhbWVfc2VxdWVuY2UgPSAwOworCisgIGR2MTM5NHNyYy0+cHJvdmlkZWRfY2xvY2sgPSBnc3RfMTM5NF9jbG9ja19uZXcgKCJkdjEzOTRjbG9jayIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2R2MTM5NHNyY19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3REVjEzOTRTcmMgKnNyYyA9IEdTVF9EVjEzOTRTUkMgKG9iamVjdCk7CisKKyAgaWYgKHNyYy0+cHJvdmlkZWRfY2xvY2spIHsKKyAgICBnX29iamVjdF91bnJlZiAoc3JjLT5wcm92aWRlZF9jbG9jayk7CisgIH0KKworICBnX2ZyZWUgKHNyYy0+dXJpKTsKKyAgc3JjLT51cmkgPSBOVUxMOworCisgIGdfZnJlZSAoc3JjLT5kZXZpY2VfbmFtZSk7CisgIHNyYy0+ZGV2aWNlX25hbWUgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2R2MTM5NHNyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0RFYxMzk0U3JjICpmaWx0ZXIgPSBHU1RfRFYxMzk0U1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QT1JUOgorICAgICAgZmlsdGVyLT5wb3J0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnX2ZyZWUgKGZpbHRlci0+dXJpKTsKKyAgICAgIGZpbHRlci0+dXJpID0gZ19zdHJkdXBfcHJpbnRmICgiZHY6Ly8lZCIsIGZpbHRlci0+cG9ydCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0hBTk5FTDoKKyAgICAgIGZpbHRlci0+Y2hhbm5lbCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NLSVA6CisgICAgICBmaWx0ZXItPnNraXAgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT05TRUNVVElWRToKKyAgICAgIGZpbHRlci0+Y29uc2VjdXRpdmUgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9EUk9QX0lOQ09NUExFVEU6CisgICAgICBmaWx0ZXItPmRyb3BfaW5jb21wbGV0ZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VfQVZDOgorICAgICAgZmlsdGVyLT51c2VfYXZjID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0dVSUQ6CisgICAgICBmaWx0ZXItPmd1aWQgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGdzdF9kdjEzOTRzcmNfdXBkYXRlX2RldmljZV9uYW1lIChmaWx0ZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHYxMzk0c3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REVjEzOTRTcmMgKmZpbHRlciA9IEdTVF9EVjEzOTRTUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BPUlQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBmaWx0ZXItPnBvcnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NIQU5ORUw6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBmaWx0ZXItPmNoYW5uZWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NLSVA6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBmaWx0ZXItPnNraXApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NPTlNFQ1VUSVZFOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZmlsdGVyLT5jb25zZWN1dGl2ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRFJPUF9JTkNPTVBMRVRFOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIGZpbHRlci0+ZHJvcF9pbmNvbXBsZXRlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VfQVZDOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIGZpbHRlci0+dXNlX2F2Yyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfR1VJRDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIGZpbHRlci0+Z3VpZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfREVWSUNFX05BTUU6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBmaWx0ZXItPmRldmljZV9uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdENsb2NrICoKK2dzdF9kdjEzOTRzcmNfcHJvdmlkZV9jbG9jayAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdERWMTM5NFNyYyAqZHYxMzk0c3JjID0gR1NUX0RWMTM5NFNSQyAoZWxlbWVudCk7CisKKyAgcmV0dXJuIEdTVF9DTE9DS19DQVNUIChnc3Rfb2JqZWN0X3JlZiAoZHYxMzk0c3JjLT5wcm92aWRlZF9jbG9jaykpOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9kdjEzOTRfc3JjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUzsKKyAgR3N0RFYxMzk0U3JjICpzcmMgPSBHU1RfRFYxMzk0U1JDIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUExBWUlOR19UT19QQVVTRUQ6CisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKGVsZW1lbnQsCisgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2Nsb2NrX2xvc3QgKEdTVF9PQkpFQ1RfQ0FTVCAoZWxlbWVudCksCisgICAgICAgICAgICAgIEdTVF9DTE9DS19DQVNUIChzcmMtPnByb3ZpZGVkX2Nsb2NrKSkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKQorICAgIHJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19QTEFZSU5HOgorICAgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChlbGVtZW50LAorICAgICAgICAgIGdzdF9tZXNzYWdlX25ld19jbG9ja19wcm92aWRlIChHU1RfT0JKRUNUX0NBU1QgKGVsZW1lbnQpLAorICAgICAgICAgICAgICBHU1RfQ0xPQ0tfQ0FTVCAoc3JjLT5wcm92aWRlZF9jbG9jayksIFRSVUUpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBIQVZFX0xJQklFQzYxODgzCitzdGF0aWMgR3N0RFYxMzk0U3JjICoKK2dzdF9kdjEzOTRzcmNfZnJvbV9yYXcxMzk0aGFuZGxlIChyYXcxMzk0aGFuZGxlX3QgaGFuZGxlKQoreworICBpZWM2MTg4M19kdl90IGR2ID0gKGllYzYxODgzX2R2X3QpIHJhdzEzOTRfZ2V0X3VzZXJkYXRhIChoYW5kbGUpOworICBpZWM2MTg4M19kdl9mYl90IGR2X2ZiID0KKyAgICAgIChpZWM2MTg4M19kdl9mYl90KSBpZWM2MTg4M19kdl9nZXRfY2FsbGJhY2tfZGF0YSAoZHYpOworICByZXR1cm4gR1NUX0RWMTM5NFNSQyAoaWVjNjE4ODNfZHZfZmJfZ2V0X2NhbGxiYWNrX2RhdGEgKGR2X2ZiKSk7Cit9CisjZWxzZSAvKiBIQVZFX0xJQklFQzYxODgzICovCitzdGF0aWMgR3N0RFYxMzk0U3JjICoKK2dzdF9kdjEzOTRzcmNfZnJvbV9yYXcxMzk0aGFuZGxlIChyYXcxMzk0aGFuZGxlX3QgaGFuZGxlKQoreworICByZXR1cm4gR1NUX0RWMTM5NFNSQyAocmF3MTM5NF9nZXRfdXNlcmRhdGEgKGhhbmRsZSkpOworfQorI2VuZGlmIC8qIEhBVkVfTElCSUVDNjE4ODMgKi8KKworI2lmZGVmIEhBVkVfTElCSUVDNjE4ODMKK3N0YXRpYyBpbnQKK2dzdF9kdjEzOTRzcmNfaWVjNjE4ODNfcmVjZWl2ZSAodW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbiwKKyAgICBpbnQgY29tcGxldGUsIHZvaWQgKmNiZGF0YSkKK3sKKyAgR3N0RFYxMzk0U3JjICpkdjEzOTRzcmMgPSBHU1RfRFYxMzk0U1JDIChjYmRhdGEpOworCisgIGlmIChHX1VOTElLRUxZICghZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChHU1RfQkFTRV9TUkNfUEFEIChkdjEzOTRzcmMpKSkpIHsKKyAgICBHc3RDYXBzICpjYXBzOworICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBkYXRhOworCisgICAgLy8gZmlndXJlIGZvcm1hdCAoTlRTQy9QQUwpCisgICAgaWYgKHBbM10gJiAweDgwKSB7CisgICAgICAvLyBQQUwKKyAgICAgIGR2MTM5NHNyYy0+ZnJhbWVfc2l6ZSA9IFBBTF9GUkFNRVNJWkU7CisgICAgICBkdjEzOTRzcmMtPmZyYW1lX3JhdGUgPSBQQUxfRlJBTUVSQVRFOworICAgICAgR1NUX0RFQlVHICgiUEFMIGRhdGEiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1kdiIsCisgICAgICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJQQUwiLAorICAgICAgICAgICJzeXN0ZW1zdHJlYW0iLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5UU0MgKHVudGVzdGVkKQorICAgICAgZHYxMzk0c3JjLT5mcmFtZV9zaXplID0gTlRTQ19GUkFNRVNJWkU7CisgICAgICBkdjEzOTRzcmMtPmZyYW1lX3JhdGUgPSBOVFNDX0ZSQU1FUkFURTsKKyAgICAgIEdTVF9ERUJVRworICAgICAgICAgICgiTlRTQyBkYXRhIFt1bnRlc3RlZF0gLSBwbGVhc2UgcmVwb3J0IHN1Y2Nlc3MvZmFpbHVyZSB0byA8ZGFuQGYzYy5jb20+Iik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtZHYiLAorICAgICAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiTlRTQyIsCisgICAgICAgICAgInN5c3RlbXN0cmVhbSIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAgICB9CisgICAgZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX0JBU0VfU1JDX1BBRCAoZHYxMzk0c3JjKSwgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9CisKKyAgZHYxMzk0c3JjLT5mcmFtZSA9IE5VTEw7CisgIGlmIChHX0xJS0VMWSAoKGR2MTM5NHNyYy0+ZnJhbWVfc2VxdWVuY2UgKyAxKSAlIChkdjEzOTRzcmMtPnNraXAgKworICAgICAgICAgICAgICBkdjEzOTRzcmMtPmNvbnNlY3V0aXZlKSA8IGR2MTM5NHNyYy0+Y29uc2VjdXRpdmUpKSB7CisgICAgaWYgKGNvbXBsZXRlICYmIGxlbiA9PSBkdjEzOTRzcmMtPmZyYW1lX3NpemUpIHsKKyAgICAgIEdzdEJ1ZmZlciAqYnVmOworCisgICAgICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGR2MTM5NHNyYy0+ZnJhbWVfc2l6ZSk7CisKKyAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpID0gZHYxMzk0c3JjLT5mcmFtZV9zZXF1ZW5jZTsKKyAgICAgIGdzdF9idWZmZXJfZmlsbCAoYnVmLCAwLCBkYXRhLCBsZW4pOworICAgICAgZHYxMzk0c3JjLT5idWYgPSBidWY7CisgICAgfQorICB9CisgIGR2MTM5NHNyYy0+ZnJhbWVfc2VxdWVuY2UrKzsKKyAgcmV0dXJuIDA7Cit9CisKKyNlbHNlCitzdGF0aWMgaW50Citnc3RfZHYxMzk0c3JjX2lzb19yZWNlaXZlIChyYXcxMzk0aGFuZGxlX3QgaGFuZGxlLCBpbnQgY2hhbm5lbCwgc2l6ZV90IGxlbiwKKyAgICBxdWFkbGV0X3QgKiBkYXRhKQoreworICBHc3REVjEzOTRTcmMgKmR2MTM5NHNyYyA9IGdzdF9kdjEzOTRzcmNfZnJvbV9yYXcxMzk0aGFuZGxlIChoYW5kbGUpOworCisgIGlmIChsZW4gPiAxNikgeworICAgIC8qCisgICAgICAgdGhlIGZvbGxvd2luZyBjb2RlIHRha2VuIGZyb20ga2luby0wLjUxIChEYW4gRGVubmVkeS9DaGFybGVzIFlhdGVzKQorICAgICAgIEtpbmRseSByZWxpY2Vuc2VkIHVuZGVyIHRoZSBMR1BMLiBTZWUgdGhlIGNvbW1pdCBsb2cgZm9yIHZlcnNpb24gMS42IG9mCisgICAgICAgdGhpcyBmaWxlIGluIENWUy4KKyAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikgJmRhdGFbM107CisKKyAgICBpbnQgc2VjdGlvbl90eXBlID0gcFswXSA+PiA1OyAgICAgICAvKiBzZWN0aW9uIHR5cGUgaXMgaW4gYml0cyA1IC0gNyAqLworICAgIGludCBkaWZfc2VxdWVuY2UgPSBwWzFdID4+IDQ7ICAgICAgIC8qIGRpZiBzZXF1ZW5jZSBudW1iZXIgaXMgaW4gYml0cyA0IC0gNyAqLworICAgIGludCBkaWZfYmxvY2sgPSBwWzJdOworCisgICAgLyogaWYgd2UgYXJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBmcmFtZSwgCisgICAgICAgd2Ugc2V0IGJ1Zj1mcmFtZSwgYW5kIGFsbG9jIGEgbmV3IGJ1ZmZlciBmb3IgZnJhbWUKKyAgICAgKi8KKyAgICBpZiAoc2VjdGlvbl90eXBlID09IDAgJiYgZGlmX3NlcXVlbmNlID09IDApIHsgICAgICAgLy8gZGlmIGhlYWRlcgorICAgICAgaWYgKCFHU1RfUEFEX0NBUFMgKEdTVF9CQVNFX1NSQ19QQUQgKGR2MTM5NHNyYykpKSB7CisgICAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgICAgLy8gZmlndXJlIGZvcm1hdCAoTlRTQy9QQUwpCisgICAgICAgIGlmIChwWzNdICYgMHg4MCkgeworICAgICAgICAgIC8vIFBBTAorICAgICAgICAgIGR2MTM5NHNyYy0+ZnJhbWVfc2l6ZSA9IFBBTF9GUkFNRVNJWkU7CisgICAgICAgICAgZHYxMzk0c3JjLT5mcmFtZV9yYXRlID0gUEFMX0ZSQU1FUkFURTsKKyAgICAgICAgICBHU1RfREVCVUcgKCJQQUwgZGF0YSIpOworICAgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1kdiIsCisgICAgICAgICAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiUEFMIiwKKyAgICAgICAgICAgICAgInN5c3RlbXN0cmVhbSIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBOVFNDICh1bnRlc3RlZCkKKyAgICAgICAgICBkdjEzOTRzcmMtPmZyYW1lX3NpemUgPSBOVFNDX0ZSQU1FU0laRTsKKyAgICAgICAgICBkdjEzOTRzcmMtPmZyYW1lX3JhdGUgPSBOVFNDX0ZSQU1FUkFURTsKKyAgICAgICAgICBHU1RfREVCVUcKKyAgICAgICAgICAgICAgKCJOVFNDIGRhdGEgW3VudGVzdGVkXSAtIHBsZWFzZSByZXBvcnQgc3VjY2Vzcy9mYWlsdXJlIHRvIDxkYW5AZjNjLmNvbT4iKTsKKyAgICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtZHYiLAorICAgICAgICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIk5UU0MiLAorICAgICAgICAgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICAgICAgICB9CisgICAgICAgIGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9CQVNFX1NSQ19QQUQgKGR2MTM5NHNyYyksIGNhcHMpOworICAgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICB9CisgICAgICAvLyBkcm9wIGxhc3QgZnJhbWUgd2hlbiBub3QgY29tcGxldGUKKyAgICAgIGlmICghZHYxMzk0c3JjLT5kcm9wX2luY29tcGxldGUKKyAgICAgICAgICB8fCBkdjEzOTRzcmMtPmJ5dGVzX2luX2ZyYW1lID09IGR2MTM5NHNyYy0+ZnJhbWVfc2l6ZSkgeworICAgICAgICBkdjEzOTRzcmMtPmJ1ZiA9IGR2MTM5NHNyYy0+ZnJhbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKEdTVF9FTEVNRU5UIChkdjEzOTRzcmMpLCAiaW5jb21wbGV0ZSBmcmFtZSBkcm9wcGVkIik7CisgICAgICAgIGdfc2lnbmFsX2VtaXQgKEdfT0JKRUNUIChkdjEzOTRzcmMpLAorICAgICAgICAgICAgZ3N0X2R2MTM5NHNyY19zaWduYWxzW1NJR05BTF9GUkFNRV9EUk9QUEVEXSwgMCk7CisgICAgICAgIGlmIChkdjEzOTRzcmMtPmZyYW1lKSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoZHYxMzk0c3JjLT5mcmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICgoZHYxMzk0c3JjLT5mcmFtZV9zZXF1ZW5jZSArIDEpICUgKGR2MTM5NHNyYy0+c2tpcCArCisgICAgICAgICAgICAgIGR2MTM5NHNyYy0+Y29uc2VjdXRpdmUpIDwgZHYxMzk0c3JjLT5jb25zZWN1dGl2ZSkgeworICAgICAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICAgICAgZ2ludDY0IGk2NDsKKworICAgICAgICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGR2MTM5NHNyYy0+ZnJhbWVfc2l6ZSk7CisKKyAgICAgICAgLyogZmlsbCBpbiBvZmZzZXQsIGR1cmF0aW9uLCB0aW1lc3RhbXAgKi8KKyAgICAgICAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPSBkdjEzOTRzcmMtPmZyYW1lX3NlcXVlbmNlOworICAgICAgICBkdjEzOTRzcmMtPmZyYW1lID0gYnVmOworICAgICAgfQorICAgICAgZHYxMzk0c3JjLT5mcmFtZV9zZXF1ZW5jZSsrOworICAgICAgZHYxMzk0c3JjLT5ieXRlc19pbl9mcmFtZSA9IDA7CisgICAgfQorCisgICAgaWYgKGR2MTM5NHNyYy0+ZnJhbWUgIT0gTlVMTCkgeworICAgICAgZ3VpbnQ4ICpkYXRhID0gR1NUX0JVRkZFUl9EQVRBIChkdjEzOTRzcmMtPmZyYW1lKTsKKworICAgICAgc3dpdGNoIChzZWN0aW9uX3R5cGUpIHsKKyAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAvKiAxIEhlYWRlciBibG9jayAqLworICAgICAgICAgIC8qIHBbM10gfD0gMHg4MDsgLy8gaGFjayB0byBmb3JjZSBQQUwgZGF0YSAqLworICAgICAgICAgIG1lbWNweSAoZGF0YSArIGRpZl9zZXF1ZW5jZSAqIDE1MCAqIDgwLCBwLCA0ODApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgLyogMiBTdWJjb2RlIGJsb2NrcyAqLworICAgICAgICAgIG1lbWNweSAoZGF0YSArIGRpZl9zZXF1ZW5jZSAqIDE1MCAqIDgwICsgKDEgKyBkaWZfYmxvY2spICogODAsIHAsCisgICAgICAgICAgICAgIDQ4MCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAvKiAzIFZBVVggYmxvY2tzICovCisgICAgICAgICAgbWVtY3B5IChkYXRhICsgZGlmX3NlcXVlbmNlICogMTUwICogODAgKyAoMyArIGRpZl9ibG9jaykgKiA4MCwgcCwKKyAgICAgICAgICAgICAgNDgwKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgIC8qIDkgQXVkaW8gYmxvY2tzIGludGVybGVhdmVkIHdpdGggdmlkZW8gKi8KKyAgICAgICAgICBtZW1jcHkgKGRhdGEgKyBkaWZfc2VxdWVuY2UgKiAxNTAgKiA4MCArICg2ICsgZGlmX2Jsb2NrICogMTYpICogODAsIHAsCisgICAgICAgICAgICAgIDQ4MCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0OiAgICAgICAgICAgICAgICAvKiAxMzUgVmlkZW8gYmxvY2tzIGludGVybGVhdmVkIHdpdGggYXVkaW8gKi8KKyAgICAgICAgICBtZW1jcHkgKGRhdGEgKyBkaWZfc2VxdWVuY2UgKiAxNTAgKiA4MCArICg3ICsgKGRpZl9ibG9jayAvIDE1KSArCisgICAgICAgICAgICAgICAgICBkaWZfYmxvY2spICogODAsIHAsIDQ4MCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAvKiB3ZSBjYW4ndCBoYW5kbGUgYW55IG90aGVyIGRhdGEgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGR2MTM5NHNyYy0+Ynl0ZXNfaW5fZnJhbWUgKz0gNDgwOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorI2VuZGlmCisvKgorICogV2hlbiBhbiBpZWVlMTM5NCBidXMgcmVzZXQgaGFwcGVucywgdXN1YWxseSBhIGRldmljZSBoYXMgYmVlbiByZW1vdmVkCisgKiBvciBhZGRlZC4gIFdlIHNlbmQgYSBtZXNzYWdlIG9uIHRoZSBtZXNzYWdlIGJ1cyB3aXRoIHRoZSBub2RlIGNvdW50IAorICogYW5kIHdoZXRoZXIgdGhlIGNhcHR1cmUgZGV2aWNlIHVzZWQgaW4gdGhpcyBlbGVtZW50IGNvbm5lY3RlZCwgZGlzY29ubmVjdGVkIAorICogb3Igd2FzIHVuY2hhbmdlZAorICogTWVzc2FnZSBzdHJ1Y3R1cmU6CisgKiBub2RlY291bnQgLSBpbnRlZ2VyIHdpdGggbnVtYmVyIG9mIG5vZGVzIG9uIGJ1cworICogY3VycmVudC1kZXZpY2UtY2hhbmdlIC0gaW50ZWdlciAoMSBpZiBkZXZpY2UgY29ubmVjdGVkLCAwIGlmIG5vIGNoYW5nZSB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBkZXZpY2Ugc3RhdHVzLCAtMSBpZiBkZXZpY2UgZGlzY29ubmVjdGVkKQorICovCitzdGF0aWMgaW50Citnc3RfZHYxMzk0c3JjX2J1c19yZXNldCAocmF3MTM5NGhhbmRsZV90IGhhbmRsZSwgdW5zaWduZWQgaW50IGdlbmVyYXRpb24pCit7CisgIEdzdERWMTM5NFNyYyAqc3JjOworICBnaW50IG5vZGVjb3VudDsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdpbnQgY3VycmVudF9kZXZpY2VfY2hhbmdlOworICBnaW50IGk7CisKKyAgc3JjID0gZ3N0X2R2MTM5NHNyY19mcm9tX3JhdzEzOTRoYW5kbGUgKGhhbmRsZSk7CisKKyAgR1NUX0lORk9fT0JKRUNUIChzcmMsICJoYXZlIGJ1cyByZXNldCIpOworCisgIC8qIHVwZGF0ZSBnZW5lcmF0aW9uIC0gdG9sZCB0byBkbyBzbyBieSBkb2NzICovCisgIHJhdzEzOTRfdXBkYXRlX2dlbmVyYXRpb24gKGhhbmRsZSwgZ2VuZXJhdGlvbik7CisgIG5vZGVjb3VudCA9IHJhdzEzOTRfZ2V0X25vZGVjb3VudCAoaGFuZGxlKTsKKyAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBwb3J0aW5mbyAqLworCisgIC8qIGN1cnJlbnRfZGV2aWNlX2NoYW5nZSBpcyAtMSBpZiBjYW1lcmEgZGlzY29ubmVjdGVkLCAwIGlmIG90aGVyIGRldmljZQorICAgKiBjb25uZWN0ZWQgb3IgMSBpZiBjYW1lcmEgaGFzIG5vdyBjb25uZWN0ZWQgKi8KKyAgY3VycmVudF9kZXZpY2VfY2hhbmdlID0gLTE7CisgIGZvciAoaSA9IDA7IGkgPCBub2RlY291bnQ7IGkrKykgeworICAgIGlmIChzcmMtPmd1aWQgPT0gcm9tMTM5NF9nZXRfZ3VpZCAoaGFuZGxlLCBpKSkgeworICAgICAgLyogQ2FtZXJhIGlzIHdpdGggdXMgKi8KKyAgICAgIEdTVF9ERUJVRyAoIkNhbWVyYSBpcyB3aXRoIHVzIik7CisgICAgICBpZiAoIXNyYy0+Y29ubmVjdGVkKSB7CisgICAgICAgIGN1cnJlbnRfZGV2aWNlX2NoYW5nZSA9IDE7CisgICAgICAgIHNyYy0+Y29ubmVjdGVkID0gVFJVRTsKKyAgICAgIH0gZWxzZQorICAgICAgICBjdXJyZW50X2RldmljZV9jaGFuZ2UgPSAwOworICAgIH0KKyAgfQorICBpZiAoc3JjLT5jb25uZWN0ZWQgJiYgY3VycmVudF9kZXZpY2VfY2hhbmdlID09IC0xKSB7CisgICAgR1NUX0RFQlVHICgiQ2FtZXJhIGhhcyBkaXNjb25uZWN0ZWQiKTsKKyAgICBzcmMtPmNvbm5lY3RlZCA9IEZBTFNFOworICB9IGVsc2UgaWYgKCFzcmMtPmNvbm5lY3RlZCAmJiBjdXJyZW50X2RldmljZV9jaGFuZ2UgPT0gLTEpIHsKKyAgICBHU1RfREVCVUcgKCJDYW1lcmEgaXMgc3RpbGwgbm90IHdpdGggdXMiKTsKKyAgICBjdXJyZW50X2RldmljZV9jaGFuZ2UgPSAwOworICB9CisKKyAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJpZWVlMTM5NC1idXMtcmVzZXQiLCAibm9kZWNvdW50IiwgR19UWVBFX0lOVCwKKyAgICAgIG5vZGVjb3VudCwgImN1cnJlbnQtZGV2aWNlLWNoYW5nZSIsIEdfVFlQRV9JTlQsIGN1cnJlbnRfZGV2aWNlX2NoYW5nZSwKKyAgICAgIE5VTEwpOworICBtZXNzYWdlID0gZ3N0X21lc3NhZ2VfbmV3X2VsZW1lbnQgKEdTVF9PQkpFQ1QgKHNyYyksIHN0cnVjdHVyZSk7CisgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKHNyYyksIG1lc3NhZ2UpOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2R2MTM5NHNyY19jcmVhdGUgKEdzdFB1c2hTcmMgKiBwc3JjLCBHc3RCdWZmZXIgKiogYnVmKQoreworICBHc3REVjEzOTRTcmMgKmR2MTM5NHNyYyA9IEdTVF9EVjEzOTRTUkMgKHBzcmMpOworICBzdHJ1Y3QgcG9sbGZkIHBvbGxmZHNbMl07CisKKyAgcG9sbGZkc1swXS5mZCA9IHJhdzEzOTRfZ2V0X2ZkIChkdjEzOTRzcmMtPmhhbmRsZSk7CisgIHBvbGxmZHNbMF0uZXZlbnRzID0gUE9MTElOIHwgUE9MTEVSUiB8IFBPTExIVVAgfCBQT0xMUFJJOworICBwb2xsZmRzWzFdLmZkID0gUkVBRF9TT0NLRVQgKGR2MTM5NHNyYyk7CisgIHBvbGxmZHNbMV0uZXZlbnRzID0gUE9MTElOIHwgUE9MTEVSUiB8IFBPTExIVVAgfCBQT0xMUFJJOworCisgIGlmIChHX1VOTElLRUxZIChkdjEzOTRzcmMtPmJ1ZikpIHsKKyAgICAvKiBtYXliZSB3ZSBoYWQgYW4gZXJyb3IgYmVmb3JlLCBhbmQgdGhlcmUncyBhIHN0YWxlIGJ1ZmZlcj8gKi8KKyAgICBnc3RfYnVmZmVyX3VucmVmIChkdjEzOTRzcmMtPmJ1Zik7CisgICAgZHYxMzk0c3JjLT5idWYgPSBOVUxMOworICB9CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBpbnQgcmVzID0gcG9sbCAocG9sbGZkcywgMiwgLTEpOworCisgICAgaWYgKEdfVU5MSUtFTFkgKHJlcyA8IDApKSB7CisgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVJTlRSKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGVsc2UKKyAgICAgICAgZ290byBlcnJvcl93aGlsZV9wb2xsaW5nOworICAgIH0KKworICAgIGlmIChHX1VOTElLRUxZIChwb2xsZmRzWzFdLnJldmVudHMpKSB7CisgICAgICBjaGFyIGNvbW1hbmQ7CisKKyAgICAgIGlmIChwb2xsZmRzWzFdLnJldmVudHMgJiBQT0xMSU4pCisgICAgICAgIFJFQURfQ09NTUFORCAoZHYxMzk0c3JjLCBjb21tYW5kLCByZXMpOworCisgICAgICBnb3RvIHRvbGRfdG9fc3RvcDsKKyAgICB9IGVsc2UgaWYgKEdfTElLRUxZIChwb2xsZmRzWzBdLnJldmVudHMgJiBQT0xMSU4pKSB7CisgICAgICAvKiBzaG91bGRuJ3QgYmxvY2sgaW4gdGhlb3J5ICovCisgICAgICByYXcxMzk0X2xvb3BfaXRlcmF0ZSAoZHYxMzk0c3JjLT5oYW5kbGUpOworCisgICAgICBpZiAoZHYxMzk0c3JjLT5idWYpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGdfYXNzZXJ0IChkdjEzOTRzcmMtPmJ1Zik7CisKKyAgKmJ1ZiA9IGR2MTM5NHNyYy0+YnVmOworICBkdjEzOTRzcmMtPmJ1ZiA9IE5VTEw7CisgIHJldHVybiBHU1RfRkxPV19PSzsKKworZXJyb3Jfd2hpbGVfcG9sbGluZzoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkdjEzOTRzcmMsIFJFU09VUkNFLCBSRUFELCAoTlVMTCksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisgIH0KK3RvbGRfdG9fc3RvcDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR2MTM5NHNyYywgInRvbGQgdG8gc3RvcCwgc2h1dHRpbmcgZG93biIpOworICAgIHJldHVybiBHU1RfRkxPV19GTFVTSElORzsKKyAgfQorfQorCitzdGF0aWMgaW50Citnc3RfZHYxMzk0c3JjX2Rpc2NvdmVyX2F2Y19ub2RlIChHc3REVjEzOTRTcmMgKiBzcmMpCit7CisgIGludCBub2RlID0gLTE7CisgIGludCBpLCBqID0gMDsKKyAgaW50IG0gPSBzcmMtPm51bV9wb3J0czsKKworICBpZiAoc3JjLT5wb3J0ID49IDApIHsKKyAgICAvKiBzZWFyY2ggb24gZXhwbGljaXQgcG9ydCAqLworICAgIGogPSBzcmMtPnBvcnQ7CisgICAgbSA9IGogKyAxOworICB9CisKKyAgLyogbG9vcCBvdmVyIGFsbCBvdXIgcG9ydHMgKi8KKyAgZm9yICg7IGogPCBtICYmIG5vZGUgPT0gLTE7IGorKykgeworICAgIHJhdzEzOTRoYW5kbGVfdCBoYW5kbGU7CisgICAgc3RydWN0IHJhdzEzOTRfcG9ydGluZm8gcGluZlsxNl07CisKKyAgICAvKiBvcGVuIHRoZSBwb3J0ICovCisgICAgaGFuZGxlID0gcmF3MTM5NF9uZXdfaGFuZGxlICgpOworICAgIGlmICghaGFuZGxlKSB7CisgICAgICBHU1RfV0FSTklORyAoInJhdzEzOTQgLSBmYWlsZWQgdG8gZ2V0IGhhbmRsZTogJXMuXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAocmF3MTM5NF9nZXRfcG9ydF9pbmZvIChoYW5kbGUsIHBpbmYsIDE2KSA8IDApIHsKKyAgICAgIEdTVF9XQVJOSU5HICgicmF3MTM5NCAtIGZhaWxlZCB0byBnZXQgcG9ydCBpbmZvOiAlcy5cbiIsCisgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBnb3RvIG5leHQ7CisgICAgfQorCisgICAgLyogdGVsbCByYXcxMzk0IHdoaWNoIGhvc3QgYWRhcHRlciB0byB1c2UgKi8KKyAgICBpZiAocmF3MTM5NF9zZXRfcG9ydCAoaGFuZGxlLCBqKSA8IDApIHsKKyAgICAgIEdTVF9XQVJOSU5HICgicmF3MTM5NCAtIGZhaWxlZCB0byBzZXQgc2V0IHBvcnQ6ICVzLlxuIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBnb3RvIG5leHQ7CisgICAgfQorCisgICAgLyogbm93IGxvb3Agb3ZlciBhbGwgdGhlIG5vZGVzICovCisgICAgZm9yIChpID0gMDsgaSA8IHJhdzEzOTRfZ2V0X25vZGVjb3VudCAoaGFuZGxlKTsgaSsrKSB7CisgICAgICAvKiBhcmUgd2UgbG9va2luZyBmb3IgYW4gZXhwbGljaXQgR1VJRCA/ICovCisgICAgICBpZiAoc3JjLT5ndWlkICE9IDApIHsKKyAgICAgICAgaWYgKHNyYy0+Z3VpZCA9PSByb20xMzk0X2dldF9ndWlkIChoYW5kbGUsIGkpKSB7CisgICAgICAgICAgbm9kZSA9IGk7CisgICAgICAgICAgc3JjLT5wb3J0ID0gajsKKyAgICAgICAgICBnX2ZyZWUgKHNyYy0+dXJpKTsKKyAgICAgICAgICBzcmMtPnVyaSA9IGdfc3RyZHVwX3ByaW50ZiAoImR2Oi8vJWQiLCBzcmMtPnBvcnQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByb20xMzk0X2RpcmVjdG9yeSByb21fZGlyOworCisgICAgICAgIC8qIHNlbGVjdCBmaXJzdCBBVi9DIFRhcGUgUmVjb3JkZXIgUGxheWVyIG5vZGUgKi8KKyAgICAgICAgaWYgKHJvbTEzOTRfZ2V0X2RpcmVjdG9yeSAoaGFuZGxlLCBpLCAmcm9tX2RpcikgPCAwKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkcgKCJlcnJvciByZWFkaW5nIGNvbmZpZyByb20gZGlyZWN0b3J5IGZvciBub2RlICVkXG4iLCBpKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJvbTEzOTRfZ2V0X25vZGVfdHlwZSAoJnJvbV9kaXIpID09IFJPTTEzOTRfTk9ERV9UWVBFX0FWQykgJiYKKyAgICAgICAgICAgIGF2YzEzOTRfY2hlY2tfc3VidW5pdF90eXBlIChoYW5kbGUsIGksIEFWQzEzOTRfU1VCVU5JVF9UWVBFX1ZDUikpIHsKKyAgICAgICAgICBub2RlID0gaTsKKyAgICAgICAgICBzcmMtPnBvcnQgPSBqOworICAgICAgICAgIHNyYy0+Z3VpZCA9IHJvbTEzOTRfZ2V0X2d1aWQgKGhhbmRsZSwgaSk7CisgICAgICAgICAgZ19mcmVlIChzcmMtPnVyaSk7CisgICAgICAgICAgc3JjLT51cmkgPSBnX3N0cmR1cF9wcmludGYgKCJkdjovLyVkIiwgc3JjLT5wb3J0KTsKKyAgICAgICAgICBnX2ZyZWUgKHNyYy0+ZGV2aWNlX25hbWUpOworICAgICAgICAgIHNyYy0+ZGV2aWNlX25hbWUgPSBnX3N0cmR1cCAocm9tX2Rpci5sYWJlbCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcm9tMTM5NF9mcmVlX2RpcmVjdG9yeSAoJnJvbV9kaXIpOworICAgICAgfQorICAgIH0KKyAgbmV4dDoKKyAgICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChoYW5kbGUpOworICB9CisgIHJldHVybiBub2RlOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdjEzOTRzcmNfc3RhcnQgKEdzdEJhc2VTcmMgKiBic3JjKQoreworICBHc3REVjEzOTRTcmMgKnNyYyA9IEdTVF9EVjEzOTRTUkMgKGJzcmMpOworICBpbnQgY29udHJvbF9zb2NrWzJdOworCisgIHNyYy0+Y29ubmVjdGVkID0gRkFMU0U7CisKKyAgaWYgKHNvY2tldHBhaXIgKFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBjb250cm9sX3NvY2spIDwgMCkKKyAgICBnb3RvIHNvY2tldF9wYWlyOworCisgIFJFQURfU09DS0VUIChzcmMpID0gY29udHJvbF9zb2NrWzBdOworICBXUklURV9TT0NLRVQgKHNyYykgPSBjb250cm9sX3NvY2tbMV07CisKKyAgaWYgKGZjbnRsIChSRUFEX1NPQ0tFVCAoc3JjKSwgRl9TRVRGTCwgT19OT05CTE9DSykgPCAwKQorICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNyYywgImZhaWxlZCB0byBtYWtlIHJlYWQgc29ja2V0IG5vbi1ibG9ja2luZzogJXMiLAorICAgICAgICBnX3N0cmVycm9yIChlcnJubykpOworICBpZiAoZmNudGwgKFdSSVRFX1NPQ0tFVCAoc3JjKSwgRl9TRVRGTCwgT19OT05CTE9DSykgPCAwKQorICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNyYywgImZhaWxlZCB0byBtYWtlIHdyaXRlIHNvY2tldCBub24tYmxvY2tpbmc6ICVzIiwKKyAgICAgICAgZ19zdHJlcnJvciAoZXJybm8pKTsKKworICBzcmMtPmhhbmRsZSA9IHJhdzEzOTRfbmV3X2hhbmRsZSAoKTsKKworICBpZiAoIXNyYy0+aGFuZGxlKSB7CisgICAgaWYgKGVycm5vID09IEVBQ0NFUykKKyAgICAgIGdvdG8gcGVybWlzc2lvbl9kZW5pZWQ7CisgICAgZWxzZSBpZiAoZXJybm8gPT0gRU5PRU5UKQorICAgICAgZ290byBub3RfZm91bmQ7CisgICAgZWxzZQorICAgICAgZ290byBub19oYW5kbGU7CisgIH0KKworICBzcmMtPm51bV9wb3J0cyA9IHJhdzEzOTRfZ2V0X3BvcnRfaW5mbyAoc3JjLT5oYW5kbGUsIHNyYy0+cGluZm8sIDE2KTsKKworICBpZiAoc3JjLT5udW1fcG9ydHMgPT0gMCkKKyAgICBnb3RvIG5vX3BvcnRzOworCisgIGlmIChzcmMtPnVzZV9hdmMgfHwgc3JjLT5wb3J0ID09IC0xKQorICAgIHNyYy0+YXZjX25vZGUgPSBnc3RfZHYxMzk0c3JjX2Rpc2NvdmVyX2F2Y19ub2RlIChzcmMpOworCisgIC8qIGxldHMgZGVzdHJveSBoYW5kbGUgYW5kIGNyZWF0ZSBvbmUgb24gcG9ydAorICAgICB0aGlzIGlzIG1vcmUgcmVsaWFibGUgdGhhbiBzZXR0aW5nIHBvcnQgb24KKyAgICAgdGhlIGV4aXN0aW5nIGhhbmRsZSAqLworICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChzcmMtPmhhbmRsZSk7CisgIHNyYy0+aGFuZGxlID0gcmF3MTM5NF9uZXdfaGFuZGxlX29uX3BvcnQgKHNyYy0+cG9ydCk7CisgIGlmICghc3JjLT5oYW5kbGUpCisgICAgZ290byBjYW5ub3Rfc2V0X3BvcnQ7CisKKyAgcmF3MTM5NF9zZXRfdXNlcmRhdGEgKHNyYy0+aGFuZGxlLCBzcmMpOworICByYXcxMzk0X3NldF9idXNfcmVzZXRfaGFuZGxlciAoc3JjLT5oYW5kbGUsIGdzdF9kdjEzOTRzcmNfYnVzX3Jlc2V0KTsKKworI2lmZGVmIEhBVkVfTElCSUVDNjE4ODMKKyAgaWYgKChzcmMtPmllYzYxODgzZHYgPQorICAgICAgICAgIGllYzYxODgzX2R2X2ZiX2luaXQgKHNyYy0+aGFuZGxlLAorICAgICAgICAgICAgICBnc3RfZHYxMzk0c3JjX2llYzYxODgzX3JlY2VpdmUsIHNyYykpID09IE5VTEwpCisgICAgZ290byBjYW5ub3RfaW5pdGlhbGlzZV9kdjsKKworI2Vsc2UKKyAgcmF3MTM5NF9zZXRfaXNvX2hhbmRsZXIgKHNyYy0+aGFuZGxlLCBzcmMtPmNoYW5uZWwsCisgICAgICBnc3RfZHYxMzk0c3JjX2lzb19yZWNlaXZlKTsKKyNlbmRpZgorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN1Y2Nlc3NmdWxseSBvcGVuZWQgdXAgMTM5NCBjb25uZWN0aW9uIik7CisgIHNyYy0+Y29ubmVjdGVkID0gVFJVRTsKKworI2lmZGVmIEhBVkVfTElCSUVDNjE4ODMKKyAgaWYgKGllYzYxODgzX2R2X2ZiX3N0YXJ0IChzcmMtPmllYzYxODgzZHYsIHNyYy0+Y2hhbm5lbCkgIT0gMCkKKyAgICBnb3RvIGNhbm5vdF9zdGFydDsKKyNlbHNlCisgIGlmIChyYXcxMzk0X3N0YXJ0X2lzb19yY3YgKHNyYy0+aGFuZGxlLCBzcmMtPmNoYW5uZWwpIDwgMCkKKyAgICBnb3RvIGNhbm5vdF9zdGFydDsKKyNlbmRpZgorCisgIGlmIChzcmMtPnVzZV9hdmMpIHsKKyAgICByYXcxMzk0aGFuZGxlX3QgYXZjX2hhbmRsZSA9IHJhdzEzOTRfbmV3X2hhbmRsZV9vbl9wb3J0IChzcmMtPnBvcnQpOworCisgICAgLyogc3RhcnQgdGhlIFZDUiAqLworICAgIGlmIChhdmNfaGFuZGxlKSB7CisgICAgICBpZiAoIWF2YzEzOTRfdmNyX2lzX3JlY29yZGluZyAoYXZjX2hhbmRsZSwgc3JjLT5hdmNfbm9kZSkKKyAgICAgICAgICAmJiBhdmMxMzk0X3Zjcl9pc19wbGF5aW5nIChhdmNfaGFuZGxlLCBzcmMtPmF2Y19ub2RlKQorICAgICAgICAgICE9IEFWQzEzOTRfVkNSX09QRVJBTkRfUExBWV9GT1JXQVJEKQorICAgICAgICBhdmMxMzk0X3Zjcl9wbGF5IChhdmNfaGFuZGxlLCBzcmMtPmF2Y19ub2RlKTsKKyAgICAgIHJhdzEzOTRfZGVzdHJveV9oYW5kbGUgKGF2Y19oYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgIlN0YXJ0aW5nIFZDUiB2aWEgYXZjMTM5NCBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICBnX3N0cmVycm9yIChlcnJubykpOworICAgIH0KKyAgfQorCisgIGdzdF8xMzk0X2Nsb2NrX3NldF9oYW5kbGUgKHNyYy0+cHJvdmlkZWRfY2xvY2ssIHNyYy0+aGFuZGxlKTsKKworICByZXR1cm4gVFJVRTsKKworc29ja2V0X3BhaXI6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgT1BFTl9SRUFEX1dSSVRFLCAoTlVMTCksCisgICAgICAgIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorcGVybWlzc2lvbl9kZW5pZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgT1BFTl9SRUFELCAoTlVMTCksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm90X2ZvdW5kOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE5PVF9GT1VORCwgKE5VTEwpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX2hhbmRsZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBPUEVOX1JFQUQsIChOVUxMKSwKKyAgICAgICAgKCJjYW4ndCBnZXQgcmF3MTM5NCBoYW5kbGUgKCVzKSIsIGdfc3RyZXJyb3IgKGVycm5vKSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fcG9ydHM6CisgIHsKKyAgICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChzcmMtPmhhbmRsZSk7CisgICAgc3JjLT5oYW5kbGUgPSBOVUxMOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBOT1RfRk9VTkQsIChOVUxMKSwKKyAgICAgICAgKCJubyBwb3J0cyBhdmFpbGFibGUgZm9yIHJhdzEzOTQiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitjYW5ub3Rfc2V0X3BvcnQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJjYW4ndCBzZXQgMTM5NCBwb3J0ICVkIiwgc3JjLT5wb3J0KSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitjYW5ub3Rfc3RhcnQ6CisgIHsKKyAgICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChzcmMtPmhhbmRsZSk7CisgICAgc3JjLT5oYW5kbGUgPSBOVUxMOworI2lmZGVmIEhBVkVfTElCSUVDNjE4ODMKKyAgICBpZWM2MTg4M19kdl9mYl9jbG9zZSAoc3JjLT5pZWM2MTg4M2R2KTsKKyAgICBzcmMtPmllYzYxODgzZHYgPSBOVUxMOworI2VuZGlmCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICAgKCJjYW4ndCBzdGFydCAxMzk0IGlzbyByZWNlaXZlIikpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorI2lmZGVmIEhBVkVfTElCSUVDNjE4ODMKK2Nhbm5vdF9pbml0aWFsaXNlX2R2OgorICB7CisgICAgcmF3MTM5NF9kZXN0cm95X2hhbmRsZSAoc3JjLT5oYW5kbGUpOworICAgIHNyYy0+aGFuZGxlID0gTlVMTDsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgICAoImNhbid0IGluaXRpYWxpc2UgaWVjNjE4ODMgZHYiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisjZW5kaWYKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHYxMzk0c3JjX3N0b3AgKEdzdEJhc2VTcmMgKiBic3JjKQoreworICBHc3REVjEzOTRTcmMgKnNyYyA9IEdTVF9EVjEzOTRTUkMgKGJzcmMpOworCisgIGNsb3NlIChSRUFEX1NPQ0tFVCAoc3JjKSk7CisgIGNsb3NlIChXUklURV9TT0NLRVQgKHNyYykpOworICBSRUFEX1NPQ0tFVCAoc3JjKSA9IC0xOworICBXUklURV9TT0NLRVQgKHNyYykgPSAtMTsKKyNpZmRlZiBIQVZFX0xJQklFQzYxODgzCisgIGllYzYxODgzX2R2X2ZiX2Nsb3NlIChzcmMtPmllYzYxODgzZHYpOworI2Vsc2UKKyAgcmF3MTM5NF9zdG9wX2lzb19yY3YgKHNyYy0+aGFuZGxlLCBzcmMtPmNoYW5uZWwpOworI2VuZGlmCisKKyAgaWYgKHNyYy0+dXNlX2F2YykgeworICAgIHJhdzEzOTRoYW5kbGVfdCBhdmNfaGFuZGxlID0gcmF3MTM5NF9uZXdfaGFuZGxlX29uX3BvcnQgKHNyYy0+cG9ydCk7CisKKyAgICAvKiBwYXVzZSBhbmQgc3RvcCB0aGUgVkNSICovCisgICAgaWYgKGF2Y19oYW5kbGUpIHsKKyAgICAgIGlmICghYXZjMTM5NF92Y3JfaXNfcmVjb3JkaW5nIChhdmNfaGFuZGxlLCBzcmMtPmF2Y19ub2RlKQorICAgICAgICAgICYmIChhdmMxMzk0X3Zjcl9pc19wbGF5aW5nIChhdmNfaGFuZGxlLCBzcmMtPmF2Y19ub2RlKQorICAgICAgICAgICAgICAhPSBBVkMxMzk0X1ZDUl9PUEVSQU5EX1BMQVlfRk9SV0FSRF9QQVVTRSkpCisgICAgICAgIGF2YzEzOTRfdmNyX3BhdXNlIChhdmNfaGFuZGxlLCBzcmMtPmF2Y19ub2RlKTsKKyAgICAgIGF2YzEzOTRfdmNyX3N0b3AgKGF2Y19oYW5kbGUsIHNyYy0+YXZjX25vZGUpOworICAgICAgcmF3MTM5NF9kZXN0cm95X2hhbmRsZSAoYXZjX2hhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiU3RhcnRpbmcgVkNSIHZpYSBhdmMxMzk0IGZhaWxlZDogJXMiLAorICAgICAgICAgIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgfQorICB9CisKKyAgZ3N0XzEzOTRfY2xvY2tfdW5zZXRfaGFuZGxlIChzcmMtPnByb3ZpZGVkX2Nsb2NrKTsKKworICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChzcmMtPmhhbmRsZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R2MTM5NHNyY191bmxvY2sgKEdzdEJhc2VTcmMgKiBic3JjKQoreworICBHc3REVjEzOTRTcmMgKnNyYyA9IEdTVF9EVjEzOTRTUkMgKGJzcmMpOworCisgIFNFTkRfQ09NTUFORCAoc3JjLCBDT05UUk9MX1NUT1ApOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdjEzOTRzcmNfcXVlcnkgKEdzdEJhc2VTcmMgKiBiYXNlc3JjLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9MQVRFTkNZOgorICAgIHsKKyAgICAgIGdzdF9xdWVyeV9zZXRfbGF0ZW5jeSAocXVlcnksIFRSVUUsIEdTVF9TRUNPTkQgLyAyNSwgR1NUX1NFQ09ORCAvIDI1KTsKKyAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ290byBub3Rfc3VwcG9ydGVkOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKK25vdF9zdXBwb3J0ZWQ6CisgIHJldHVybiBHU1RfQkFTRV9TUkNfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnF1ZXJ5IChiYXNlc3JjLCBxdWVyeSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHYxMzk0c3JjX3VwZGF0ZV9kZXZpY2VfbmFtZSAoR3N0RFYxMzk0U3JjICogc3JjKQoreworICByYXcxMzk0aGFuZGxlX3QgaGFuZGxlOworICBnaW50IHBvcnRjb3VudCwgcG9ydCwgbm9kZWNvdW50LCBub2RlOworICByb20xMzk0X2RpcmVjdG9yeSBkaXJlY3Rvcnk7CisKKyAgZ19mcmVlIChzcmMtPmRldmljZV9uYW1lKTsKKyAgc3JjLT5kZXZpY2VfbmFtZSA9IE5VTEw7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgInVwZGF0aW5nIGRldmljZSBuYW1lIGZvciBjdXJyZW50IEdVSUQiKTsKKworICBoYW5kbGUgPSByYXcxMzk0X25ld19oYW5kbGUgKCk7CisKKyAgaWYgKGhhbmRsZSA9PSBOVUxMKQorICAgIGdvdG8gZ2V0aGFuZGxlX2ZhaWxlZDsKKworICBwb3J0Y291bnQgPSByYXcxMzk0X2dldF9wb3J0X2luZm8gKGhhbmRsZSwgTlVMTCwgMCk7CisgIGZvciAocG9ydCA9IDA7IHBvcnQgPCBwb3J0Y291bnQ7IHBvcnQrKykgeworICAgIGlmIChyYXcxMzk0X3NldF9wb3J0IChoYW5kbGUsIHBvcnQpID49IDApIHsKKyAgICAgIG5vZGVjb3VudCA9IHJhdzEzOTRfZ2V0X25vZGVjb3VudCAoaGFuZGxlKTsKKyAgICAgIGZvciAobm9kZSA9IDA7IG5vZGUgPCBub2RlY291bnQ7IG5vZGUrKykgeworICAgICAgICBpZiAoc3JjLT5ndWlkID09IHJvbTEzOTRfZ2V0X2d1aWQgKGhhbmRsZSwgbm9kZSkpIHsKKyAgICAgICAgICBpZiAocm9tMTM5NF9nZXRfZGlyZWN0b3J5IChoYW5kbGUsIG5vZGUsICZkaXJlY3RvcnkpID49IDApIHsKKyAgICAgICAgICAgIGdfZnJlZSAoc3JjLT5kZXZpY2VfbmFtZSk7CisgICAgICAgICAgICBzcmMtPmRldmljZV9uYW1lID0gZ19zdHJkdXAgKGRpcmVjdG9yeS5sYWJlbCk7CisgICAgICAgICAgICByb20xMzk0X2ZyZWVfZGlyZWN0b3J5ICgmZGlyZWN0b3J5KTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR1NUX1dBUk5JTkcgKCJlcnJvciByZWFkaW5nIHJvbSBkaXJlY3RvcnkgZm9yIG5vZGUgJWQiLCBub2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzcmMtPmRldmljZV9uYW1lID0gZ19zdHJkdXAgKCJVbmtub3duIik7ICAgICAgLyogRklYTUU6IHRyYW5zbGF0ZT8gKi8KKworZG9uZToKKworICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChoYW5kbGUpOworICByZXR1cm47CisKKy8qIEVSUk9SUyAqLworZ2V0aGFuZGxlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HICgiZmFpbGVkIHRvIGdldCByYXcxMzk0IGhhbmRsZTogJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworICAgIHNyYy0+ZGV2aWNlX25hbWUgPSBnX3N0cmR1cCAoIlVua25vd24iKTsgICAgLyogRklYTUU6IHRyYW5zbGF0ZT8gKi8KKyAgICByZXR1cm47CisgIH0KK30KKworLyoqKiBHU1RVUklIQU5ETEVSIElOVEVSRkFDRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgR3N0VVJJVHlwZQorZ3N0X2R2MTM5NHNyY191cmlfZ2V0X3R5cGUgKEdUeXBlIHR5cGUpCit7CisgIHJldHVybiBHU1RfVVJJX1NSQzsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICpjb25zdCAqCitnc3RfZHYxMzk0c3JjX3VyaV9nZXRfcHJvdG9jb2xzIChHVHlwZSB0eXBlKQoreworICBzdGF0aWMgY29uc3QgZ2NoYXIgKnByb3RvY29sc1tdID0geyAoY2hhciAqKSAiZHYiLCBOVUxMIH07CisKKyAgcmV0dXJuIHByb3RvY29sczsKK30KKworc3RhdGljIGdjaGFyICoKK2dzdF9kdjEzOTRzcmNfdXJpX2dldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyKQoreworICBHc3REVjEzOTRTcmMgKmdzdF9kdjEzOTRzcmMgPSBHU1RfRFYxMzk0U1JDIChoYW5kbGVyKTsKKworICByZXR1cm4gZ3N0X2R2MTM5NHNyYy0+dXJpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdjEzOTRzcmNfdXJpX3NldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyLCBjb25zdCBnY2hhciAqIHVyaSwKKyAgICBHRXJyb3IgKiogZXJyb3IpCit7CisgIGdjaGFyICpwcm90b2NvbCwgKmxvY2F0aW9uOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworICBHc3REVjEzOTRTcmMgKmdzdF9kdjEzOTRzcmMgPSBHU1RfRFYxMzk0U1JDIChoYW5kbGVyKTsKKworICBwcm90b2NvbCA9IGdzdF91cmlfZ2V0X3Byb3RvY29sICh1cmkpOworICBpZiAoc3RyY21wIChwcm90b2NvbCwgImR2IikgIT0gMCkgeworICAgIGdfZnJlZSAocHJvdG9jb2wpOworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgR1NUX1VSSV9FUlJPUiwgR1NUX1VSSV9FUlJPUl9CQURfVVJJLCAiSW52YWxpZCBEViBVUkkiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZ19mcmVlIChwcm90b2NvbCk7CisKKyAgbG9jYXRpb24gPSBnc3RfdXJpX2dldF9sb2NhdGlvbiAodXJpKTsKKyAgaWYgKGxvY2F0aW9uICYmICpsb2NhdGlvbiAhPSAnXDAnKQorICAgIGdzdF9kdjEzOTRzcmMtPnBvcnQgPSBzdHJ0b2wgKGxvY2F0aW9uLCBOVUxMLCAxMCk7CisgIGVsc2UKKyAgICBnc3RfZHYxMzk0c3JjLT5wb3J0ID0gREVGQVVMVF9QT1JUOworICBnX2ZyZWUgKGxvY2F0aW9uKTsKKyAgZ19mcmVlIChnc3RfZHYxMzk0c3JjLT51cmkpOworICBnc3RfZHYxMzk0c3JjLT51cmkgPSBnX3N0cmR1cF9wcmludGYgKCJkdjovLyVkIiwgZ3N0X2R2MTM5NHNyYy0+cG9ydCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kdjEzOTRzcmNfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0VVJJSGFuZGxlckludGVyZmFjZSAqaWZhY2UgPSAoR3N0VVJJSGFuZGxlckludGVyZmFjZSAqKSBnX2lmYWNlOworCisgIGlmYWNlLT5nZXRfdHlwZSA9IGdzdF9kdjEzOTRzcmNfdXJpX2dldF90eXBlOworICBpZmFjZS0+Z2V0X3Byb3RvY29scyA9IGdzdF9kdjEzOTRzcmNfdXJpX2dldF9wcm90b2NvbHM7CisgIGlmYWNlLT5nZXRfdXJpID0gZ3N0X2R2MTM5NHNyY191cmlfZ2V0X3VyaTsKKyAgaWZhY2UtPnNldF91cmkgPSBnc3RfZHYxMzk0c3JjX3VyaV9zZXRfdXJpOworfQpkaWZmIC0tZ2l0IGEvZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmggYi9leHQvcmF3MTM5NC9nc3RkdjEzOTRzcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmYzMzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3JhdzEzOTQvZ3N0ZHYxMzk0c3JjLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfR1NUMTM5NF9IX18KKyNkZWZpbmUgX19HU1RfR1NUMTM5NF9IX18KKworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdHB1c2hzcmMuaD4KKyNpbmNsdWRlICJnc3QxMzk0Y2xvY2suaCIKKworI2luY2x1ZGUgPGxpYnJhdzEzOTQvcmF3MTM5NC5oPgorI2lmZGVmIEhBVkVfTElCSUVDNjE4ODMKKyNpbmNsdWRlIDxsaWJpZWM2MTg4My9pZWM2MTg4My5oPgorI2VuZGlmCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9EVjEzOTRTUkMgXAorICAoZ3N0X2R2MTM5NHNyY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfRFYxMzk0U1JDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfRFYxMzk0U1JDLEdzdERWMTM5NFNyYykpCisjZGVmaW5lIEdTVF9EVjEzOTRTUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfRFYxMzk0U1JDLEdzdERWMTM5NFNyY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0RWMTM5NFNSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0RWMTM5NFNSQykpCisjZGVmaW5lIEdTVF9JU19EVjEzOTRTUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfRFYxMzk0U1JDKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdERWMTM5NFNyYyBHc3REVjEzOTRTcmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0RFYxMzk0U3JjQ2xhc3MgR3N0RFYxMzk0U3JjQ2xhc3M7CisKK3N0cnVjdCBfR3N0RFYxMzk0U3JjIHsKKyAgR3N0UHVzaFNyYyBlbGVtZW50OworCisgIC8vIGNvbnNlY3V0aXZlPTIsIHNraXA9NCB3aWxsIHNraXAgNCBmcmFtZXMsIHRoZW4gbGV0IDIgY29uc2VjdXRpdmUgb25lcyB0aHJ1CisgIGdpbnQgY29uc2VjdXRpdmU7CisgIGdpbnQgc2tpcDsKKyAgZ2Jvb2xlYW4gZHJvcF9pbmNvbXBsZXRlOworCisgIGdpbnQgbnVtX3BvcnRzOworICBnaW50IHBvcnQ7CisgIGdpbnQgY2hhbm5lbDsKKyAgb2N0bGV0X3QgZ3VpZDsKKyAgZ2ludCBhdmNfbm9kZTsKKyAgZ2Jvb2xlYW4gdXNlX2F2YzsKKworICBzdHJ1Y3QgcmF3MTM5NF9wb3J0aW5mbyBwaW5mb1sxNl07CisgIHJhdzEzOTRoYW5kbGVfdCBoYW5kbGU7CisKKyAgR3N0QnVmZmVyICpidWY7CisgIAorICBHc3RCdWZmZXIgKmZyYW1lOworICBndWludCBmcmFtZV9zaXplOworICBndWludCBmcmFtZV9yYXRlOworICBndWludCBieXRlc19pbl9mcmFtZTsKKyAgZ3VpbnQgZnJhbWVfc2VxdWVuY2U7CisKKyAgaW50IGNvbnRyb2xfc29ja1syXTsKKworICBnY2hhciAqdXJpOworCisgIGdjaGFyICpkZXZpY2VfbmFtZTsKKworICBnYm9vbGVhbiBjb25uZWN0ZWQ7CisgICNpZmRlZiBIQVZFX0xJQklFQzYxODgzCisgIGllYzYxODgzX2R2X2ZiX3QgaWVjNjE4ODNkdjsKKyAgI2VuZGlmCisKKyAgR3N0MTM5NENsb2NrICpwcm92aWRlZF9jbG9jazsKK307CisKK3N0cnVjdCBfR3N0RFYxMzk0U3JjQ2xhc3MgeworICBHc3RQdXNoU3JjQ2xhc3MgcGFyZW50X2NsYXNzOworCisgIC8qIHNpZ25hbCAqLworICB2b2lkICgqZnJhbWVfZHJvcHBlZCkgIChHc3RFbGVtZW50ICplbGVtKTsKK307CisKK0dUeXBlIGdzdF9kdjEzOTRzcmNfZ2V0X3R5cGUodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9HU1QxMzk0X0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jIGIvZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Y2ViNGYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcmF3MTM5NC9nc3RoZHYxMzk0c3JjLmMKQEAgLTAsMCArMSw4NDEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOD4gRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtaGR2MTM5NHNyYworICoKKyAqIFJlYWQgTVBFRy1UUyBkYXRhIGZyb20gZmlyZXdpcmUgcG9ydC4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgaGR2MTM5NHNyYyAhIHF1ZXVlICEgZGVjb2RlYmluIG5hbWU9ZCAhIHF1ZXVlICEgeHZpbWFnZXNpbmsgZC4gISBxdWV1ZSAhIGFsc2FzaW5rCisgKiBdfCBjYXB0dXJlcyBmcm9tIHRoZSBmaXJld2lyZSBwb3J0IGFuZCBwbGF5cyB0aGUgc3RyZWFtcy4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBoZHYxMzk0c3JjICEgcXVldWUgISBmaWxlc2luayBsb2NhdGlvbj1teWR1bXAudHMKKyAqIF18IGNhcHR1cmUgdG8gYSBkaXNrIGZpbGUKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGxpYmF2YzEzOTQvYXZjMTM5NC5oPgorI2luY2x1ZGUgPGxpYmF2YzEzOTQvYXZjMTM5NF92Y3IuaD4KKyNpbmNsdWRlIDxsaWJhdmMxMzk0L3JvbTEzOTQuaD4KKyNpbmNsdWRlIDxsaWJyYXcxMzk0L3JhdzEzOTQuaD4KKyNpbmNsdWRlIDxsaWJpZWM2MTg4My9pZWM2MTg4My5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaW5jbHVkZSAiZ3N0aGR2MTM5NHNyYy5oIgorI2luY2x1ZGUgImdzdDEzOTRwcm9iZS5oIgorCisKKyNkZWZpbmUgQ09OVFJPTF9TVE9QICAgICAgICAgICAgJ1MnICAgICAvKiBzdG9wIHRoZSBzZWxlY3QgY2FsbCAqLworI2RlZmluZSBDT05UUk9MX1NPQ0tFVFMoc3JjKSAgIHNyYy0+Y29udHJvbF9zb2NrCisjZGVmaW5lIFdSSVRFX1NPQ0tFVChzcmMpICAgICAgc3JjLT5jb250cm9sX3NvY2tbMV0KKyNkZWZpbmUgUkVBRF9TT0NLRVQoc3JjKSAgICAgICBzcmMtPmNvbnRyb2xfc29ja1swXQorCisjZGVmaW5lIFNFTkRfQ09NTUFORChzcmMsIGNvbW1hbmQpICAgICAgICAgIFwKK0dfU1RNVF9TVEFSVCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgR19HTlVDX1VOVVNFRCBfcmVzOyB1bnNpZ25lZCBjaGFyIGM7IGMgPSBjb21tYW5kOyAgIFwKKyAgX3JlcyA9IHdyaXRlIChXUklURV9TT0NLRVQoc3JjKSwgJmMsIDEpOyAgXAorfSBHX1NUTVRfRU5ECisKKyNkZWZpbmUgUkVBRF9DT01NQU5EKHNyYywgY29tbWFuZCwgcmVzKSAgICAgICAgXAorR19TVE1UX1NUQVJUIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJlcyA9IHJlYWQoUkVBRF9TT0NLRVQoc3JjKSwgJmNvbW1hbmQsIDEpOyAgIFwKK30gR19TVE1UX0VORAorCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGhkdjEzOTRzcmNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKGhkdjEzOTRzcmNfZGVidWcpCisKKyNkZWZpbmUgREVGQVVMVF9QT1JUICAgIC0xCisjZGVmaW5lIERFRkFVTFRfQ0hBTk5FTCAgIDYzCisjZGVmaW5lIERFRkFVTFRfVVNFX0FWQyAgIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9HVUlEICAgIDAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUE9SVCwKKyAgUFJPUF9DSEFOTkVMLAorICBQUk9QX1VTRV9BVkMsCisgIFBST1BfR1VJRCwKKyAgUFJPUF9ERVZJQ0VfTkFNRQorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUworICAgICgidmlkZW8vbXBlZ3RzLHN5c3RlbXN0cmVhbT0oYm9vbGVhbil0cnVlLHBhY2tldHNpemU9KGludCkxODgiKQorICAgICk7CisKK3N0YXRpYyB2b2lkIGdzdF9oZHYxMzk0c3JjX3VyaV9oYW5kbGVyX2luaXQgKGdwb2ludGVyIGdfaWZhY2UsCisgICAgZ3BvaW50ZXIgaWZhY2VfZGF0YSk7CisKK3N0YXRpYyB2b2lkIGdzdF9oZHYxMzk0c3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9oZHYxMzk0c3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9oZHYxMzk0c3JjX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2hkdjEzOTRzcmNfc3RhcnQgKEdzdEJhc2VTcmMgKiBic3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfaGR2MTM5NHNyY19zdG9wIChHc3RCYXNlU3JjICogYnNyYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2hkdjEzOTRzcmNfdW5sb2NrIChHc3RCYXNlU3JjICogYnNyYyk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9oZHYxMzk0c3JjX2NyZWF0ZSAoR3N0UHVzaFNyYyAqIHBzcmMsCisgICAgR3N0QnVmZmVyICoqIGJ1Zik7CisKK3N0YXRpYyB2b2lkIGdzdF9oZHYxMzk0c3JjX3VwZGF0ZV9kZXZpY2VfbmFtZSAoR3N0SERWMTM5NFNyYyAqIHNyYyk7CisKKyNkZWZpbmUgZ3N0X2hkdjEzOTRzcmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdEhEVjEzOTRTcmMsIGdzdF9oZHYxMzk0c3JjLCBHU1RfVFlQRV9QVVNIX1NSQywKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1VSSV9IQU5ETEVSLAorICAgICAgICBnc3RfaGR2MTM5NHNyY191cmlfaGFuZGxlcl9pbml0KSk7CisKK3N0YXRpYyB2b2lkCitnc3RfaGR2MTM5NHNyY19jbGFzc19pbml0IChHc3RIRFYxMzk0U3JjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VTcmNDbGFzcyAqZ3N0YmFzZXNyY19jbGFzczsKKyAgR3N0UHVzaFNyY0NsYXNzICpnc3RwdXNoc3JjX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmFzZXNyY19jbGFzcyA9IChHc3RCYXNlU3JjQ2xhc3MgKikga2xhc3M7CisgIGdzdHB1c2hzcmNfY2xhc3MgPSAoR3N0UHVzaFNyY0NsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9oZHYxMzk0c3JjX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2hkdjEzOTRzcmNfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X2hkdjEzOTRzcmNfZGlzcG9zZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1BPUlQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicG9ydCIsICJQb3J0IiwgIlBvcnQgbnVtYmVyICgtMSBhdXRvbWF0aWMpIiwKKyAgICAgICAgICAtMSwgMTYsIERFRkFVTFRfUE9SVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQ0hBTk5FTCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJjaGFubmVsIiwgIkNoYW5uZWwiLCAiQ2hhbm5lbCBudW1iZXIgZm9yIGxpc3RlbmluZyIsCisgICAgICAgICAgMCwgNjQsIERFRkFVTFRfQ0hBTk5FTCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfVVNFX0FWQywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgidXNlLWF2YyIsICJVc2UgQVYvQyIsICJVc2UgQVYvQyBWVFIgY29udHJvbCIsCisgICAgICAgICAgREVGQVVMVF9VU0VfQVZDLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9HVUlELAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoImd1aWQiLCAiR1VJRCIsCisgICAgICAgICAgInNlbGVjdCBvbmUgb2YgbXVsdGlwbGUgRFYgZGV2aWNlcyBieSBpdHMgR1VJRC4gdXNlIGEgaGV4YWRlY2ltYWwgIgorICAgICAgICAgICJsaWtlIDB4aGhoaGhoaGhoaGhoaGhoaC4gKDAgPSBubyBndWlkKSIsIDAsIEdfTUFYVUlOVDY0LAorICAgICAgICAgIERFRkFVTFRfR1VJRCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RIRFYxMzk0U3JjOmRldmljZS1uYW1lOgorICAgKgorICAgKiBEZXNjcmlwdGl2ZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgb3BlbmVkIGRldmljZQorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9ERVZJQ0VfTkFNRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJkZXZpY2UtbmFtZSIsICJkZXZpY2UgbmFtZSIsCisgICAgICAgICAgInVzZXItZnJpZW5kbHkgbmFtZSBvZiB0aGUgZGV2aWNlIiwgIkRlZmF1bHQiLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0YmFzZXNyY19jbGFzcy0+bmVnb3RpYXRlID0gTlVMTDsKKyAgZ3N0YmFzZXNyY19jbGFzcy0+c3RhcnQgPSBnc3RfaGR2MTM5NHNyY19zdGFydDsKKyAgZ3N0YmFzZXNyY19jbGFzcy0+c3RvcCA9IGdzdF9oZHYxMzk0c3JjX3N0b3A7CisgIGdzdGJhc2VzcmNfY2xhc3MtPnVubG9jayA9IGdzdF9oZHYxMzk0c3JjX3VubG9jazsKKworICBnc3RwdXNoc3JjX2NsYXNzLT5jcmVhdGUgPSBnc3RfaGR2MTM5NHNyY19jcmVhdGU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfZmFjdG9yeSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJGaXJld2lyZSAoMTM5NCkgSERWIHZpZGVvIHNvdXJjZSIsICJTb3VyY2UvVmlkZW8iLAorICAgICAgIlNvdXJjZSBmb3IgTVBFRy1UUyB2aWRlbyBkYXRhIGZyb20gZmlyZXdpcmUgcG9ydCIsCisgICAgICAiRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoaGR2MTM5NHNyY19kZWJ1ZywgImhkdjEzOTRzcmMiLCAwLAorICAgICAgIk1QRUctVFMgZmlyZXdpcmUgc291cmNlIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaGR2MTM5NHNyY19pbml0IChHc3RIRFYxMzk0U3JjICogZHYxMzk0c3JjKQoreworICBHc3RQYWQgKnNyY3BhZCA9IEdTVF9CQVNFX1NSQ19QQUQgKGR2MTM5NHNyYyk7CisKKyAgZ3N0X2Jhc2Vfc3JjX3NldF9saXZlIChHU1RfQkFTRV9TUkMgKGR2MTM5NHNyYyksIFRSVUUpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChzcmNwYWQpOworCisgIGR2MTM5NHNyYy0+cG9ydCA9IERFRkFVTFRfUE9SVDsKKyAgZHYxMzk0c3JjLT5jaGFubmVsID0gREVGQVVMVF9DSEFOTkVMOworCisgIGR2MTM5NHNyYy0+dXNlX2F2YyA9IERFRkFVTFRfVVNFX0FWQzsKKyAgZHYxMzk0c3JjLT5ndWlkID0gREVGQVVMVF9HVUlEOworICBkdjEzOTRzcmMtPnVyaSA9IGdfc3RyZHVwX3ByaW50ZiAoImhkdjovLyVkIiwgZHYxMzk0c3JjLT5wb3J0KTsKKyAgZHYxMzk0c3JjLT5kZXZpY2VfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoIkRlZmF1bHQiKTsKKworICBSRUFEX1NPQ0tFVCAoZHYxMzk0c3JjKSA9IC0xOworICBXUklURV9TT0NLRVQgKGR2MTM5NHNyYykgPSAtMTsKKworICBkdjEzOTRzcmMtPmZyYW1lX3NlcXVlbmNlID0gMDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9oZHYxMzk0c3JjX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEhEVjEzOTRTcmMgKnNyYyA9IEdTVF9IRFYxMzk0U1JDIChvYmplY3QpOworCisgIGdfZnJlZSAoc3JjLT51cmkpOworICBzcmMtPnVyaSA9IE5VTEw7CisKKyAgZ19mcmVlIChzcmMtPmRldmljZV9uYW1lKTsKKyAgc3JjLT5kZXZpY2VfbmFtZSA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaGR2MTM5NHNyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0SERWMTM5NFNyYyAqZmlsdGVyID0gR1NUX0hEVjEzOTRTUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BPUlQ6CisgICAgICBmaWx0ZXItPnBvcnQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdfZnJlZSAoZmlsdGVyLT51cmkpOworICAgICAgZmlsdGVyLT51cmkgPSBnX3N0cmR1cF9wcmludGYgKCJoZHY6Ly8lZCIsIGZpbHRlci0+cG9ydCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0hBTk5FTDoKKyAgICAgIGZpbHRlci0+Y2hhbm5lbCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRV9BVkM6CisgICAgICBmaWx0ZXItPnVzZV9hdmMgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfR1VJRDoKKyAgICAgIGZpbHRlci0+Z3VpZCA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpOworICAgICAgZ3N0X2hkdjEzOTRzcmNfdXBkYXRlX2RldmljZV9uYW1lIChmaWx0ZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaGR2MTM5NHNyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0SERWMTM5NFNyYyAqZmlsdGVyID0gR1NUX0hEVjEzOTRTUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BPUlQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBmaWx0ZXItPnBvcnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NIQU5ORUw6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBmaWx0ZXItPmNoYW5uZWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRV9BVkM6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmlsdGVyLT51c2VfYXZjKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9HVUlEOgorICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgZmlsdGVyLT5ndWlkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERVZJQ0VfTkFNRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIGZpbHRlci0+ZGV2aWNlX25hbWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgR3N0SERWMTM5NFNyYyAqCitnc3RfaGR2MTM5NHNyY19mcm9tX3JhdzEzOTRoYW5kbGUgKHJhdzEzOTRoYW5kbGVfdCBoYW5kbGUpCit7CisgIGllYzYxODgzX21wZWcyX3QgbXBlZzIgPSAoaWVjNjE4ODNfbXBlZzJfdCkgcmF3MTM5NF9nZXRfdXNlcmRhdGEgKGhhbmRsZSk7CisgIHJldHVybiBHU1RfSERWMTM5NFNSQyAoaWVjNjE4ODNfbXBlZzJfZ2V0X2NhbGxiYWNrX2RhdGEgKG1wZWcyKSk7Cit9CisKKy8qIFdpdGhpbiBvbmUgbG9vcCBpdGVyYXRpb24gKHdoaWNoIG1heSBjYWxsIF9yZWNlaXZlKCkgbWFueSB0aW1lcyksIGl0IHNlZW1zCisgKiBhcyB0aG91Z2ggJypkYXRhJyB3aWxsIGFsd2F5cyBiZSBkaWZmZXJlbnQuCisgKgorICogV2UgY2FuIHRoZXJlZm9yZSBhc3N1bWUgdGhhdCBhbnkgJypkYXRhJyBnaXZlbiB0byB1cyB3aWxsIHN0YXkgYWxsb2NhdGVkIHVudGlsCisgKiB0aGUgbmV4dCBsb29wIGl0ZXJhdGlvbi4KKyAqLworCitzdGF0aWMgaW50Citnc3RfaGR2MTM5NHNyY19pZWM2MTg4M19yZWNlaXZlICh1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuLAorICAgIHVuc2lnbmVkIGludCBkcm9wcGVkLCB2b2lkICpjYmRhdGEpCit7CisgIEdzdEhEVjEzOTRTcmMgKmR2MTM5NHNyYyA9IEdTVF9IRFYxMzk0U1JDIChjYmRhdGEpOworCisgIEdTVF9MT0cgKCJkYXRhOiVwLCBsZW46JWQsIGRyb3BwZWQ6JWQiLCBkYXRhLCBsZW4sIGRyb3BwZWQpOworCisgIC8qIGVycm9yIG91dCBpZiB3ZSBkb24ndCBoYXZlIGVub3VnaCByb29tICEgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKGR2MTM5NHNyYy0+b3V0b2Zmc2V0ID4gKDIwNDggKiAxODggLSBsZW4pKSkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKEdfTElLRUxZIChsZW4gPT0gSUVDNjE4ODNfTVBFRzJfVFNQX1NJWkUpKSB7CisgICAgbWVtY3B5ICgoZ3VpbnQ4ICopIGR2MTM5NHNyYy0+b3V0ZGF0YSArIGR2MTM5NHNyYy0+b3V0b2Zmc2V0LCBkYXRhLCBsZW4pOworICAgIGR2MTM5NHNyYy0+b3V0b2Zmc2V0ICs9IGxlbjsKKyAgfQorICBkdjEzOTRzcmMtPmZyYW1lX3NlcXVlbmNlKys7CisgIHJldHVybiAwOworfQorCisvKgorICogV2hlbiBhbiBpZWVlMTM5NCBidXMgcmVzZXQgaGFwcGVucywgdXN1YWxseSBhIGRldmljZSBoYXMgYmVlbiByZW1vdmVkCisgKiBvciBhZGRlZC4gIFdlIHNlbmQgYSBtZXNzYWdlIG9uIHRoZSBtZXNzYWdlIGJ1cyB3aXRoIHRoZSBub2RlIGNvdW50IAorICogYW5kIHdoZXRoZXIgdGhlIGNhcHR1cmUgZGV2aWNlIHVzZWQgaW4gdGhpcyBlbGVtZW50IGNvbm5lY3RlZCwgZGlzY29ubmVjdGVkIAorICogb3Igd2FzIHVuY2hhbmdlZAorICogTWVzc2FnZSBzdHJ1Y3R1cmU6CisgKiBub2RlY291bnQgLSBpbnRlZ2VyIHdpdGggbnVtYmVyIG9mIG5vZGVzIG9uIGJ1cworICogY3VycmVudC1kZXZpY2UtY2hhbmdlIC0gaW50ZWdlciAoMSBpZiBkZXZpY2UgY29ubmVjdGVkLCAwIGlmIG5vIGNoYW5nZSB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBkZXZpY2Ugc3RhdHVzLCAtMSBpZiBkZXZpY2UgZGlzY29ubmVjdGVkKQorICovCitzdGF0aWMgaW50Citnc3RfaGR2MTM5NHNyY19idXNfcmVzZXQgKHJhdzEzOTRoYW5kbGVfdCBoYW5kbGUsIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uKQoreworICBHc3RIRFYxMzk0U3JjICpzcmM7CisgIGdpbnQgbm9kZWNvdW50OworICBHc3RNZXNzYWdlICptZXNzYWdlOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2ludCBjdXJyZW50X2RldmljZV9jaGFuZ2U7CisgIGdpbnQgaTsKKworICBzcmMgPSBnc3RfaGR2MTM5NHNyY19mcm9tX3JhdzEzOTRoYW5kbGUgKGhhbmRsZSk7CisKKyAgR1NUX0lORk9fT0JKRUNUIChzcmMsICJoYXZlIGJ1cyByZXNldCIpOworCisgIC8qIHVwZGF0ZSBnZW5lcmF0aW9uIC0gdG9sZCB0byBkbyBzbyBieSBkb2NzICovCisgIHJhdzEzOTRfdXBkYXRlX2dlbmVyYXRpb24gKGhhbmRsZSwgZ2VuZXJhdGlvbik7CisgIG5vZGVjb3VudCA9IHJhdzEzOTRfZ2V0X25vZGVjb3VudCAoaGFuZGxlKTsKKyAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBwb3J0aW5mbyAqLworCisgIC8qIGN1cnJlbnRfZGV2aWNlX2NoYW5nZSBpcyAtMSBpZiBjYW1lcmEgZGlzY29ubmVjdGVkLCAwIGlmIG90aGVyIGRldmljZQorICAgKiBjb25uZWN0ZWQgb3IgMSBpZiBjYW1lcmEgaGFzIG5vdyBjb25uZWN0ZWQgKi8KKyAgY3VycmVudF9kZXZpY2VfY2hhbmdlID0gLTE7CisgIGZvciAoaSA9IDA7IGkgPCBub2RlY291bnQ7IGkrKykgeworICAgIGlmIChzcmMtPmd1aWQgPT0gcm9tMTM5NF9nZXRfZ3VpZCAoaGFuZGxlLCBpKSkgeworICAgICAgLyogQ2FtZXJhIGlzIHdpdGggdXMgKi8KKyAgICAgIEdTVF9ERUJVRyAoIkNhbWVyYSBpcyB3aXRoIHVzIik7CisgICAgICBpZiAoIXNyYy0+Y29ubmVjdGVkKSB7CisgICAgICAgIGN1cnJlbnRfZGV2aWNlX2NoYW5nZSA9IDE7CisgICAgICAgIHNyYy0+Y29ubmVjdGVkID0gVFJVRTsKKyAgICAgIH0gZWxzZQorICAgICAgICBjdXJyZW50X2RldmljZV9jaGFuZ2UgPSAwOworICAgIH0KKyAgfQorICBpZiAoc3JjLT5jb25uZWN0ZWQgJiYgY3VycmVudF9kZXZpY2VfY2hhbmdlID09IC0xKSB7CisgICAgR1NUX0RFQlVHICgiQ2FtZXJhIGhhcyBkaXNjb25uZWN0ZWQiKTsKKyAgICBzcmMtPmNvbm5lY3RlZCA9IEZBTFNFOworICB9IGVsc2UgaWYgKCFzcmMtPmNvbm5lY3RlZCAmJiBjdXJyZW50X2RldmljZV9jaGFuZ2UgPT0gLTEpIHsKKyAgICBHU1RfREVCVUcgKCJDYW1lcmEgaXMgc3RpbGwgbm90IHdpdGggdXMiKTsKKyAgICBjdXJyZW50X2RldmljZV9jaGFuZ2UgPSAwOworICB9CisKKyAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJpZWVlMTM5NC1idXMtcmVzZXQiLCAibm9kZWNvdW50IiwgR19UWVBFX0lOVCwKKyAgICAgIG5vZGVjb3VudCwgImN1cnJlbnQtZGV2aWNlLWNoYW5nZSIsIEdfVFlQRV9JTlQsIGN1cnJlbnRfZGV2aWNlX2NoYW5nZSwKKyAgICAgIE5VTEwpOworICBtZXNzYWdlID0gZ3N0X21lc3NhZ2VfbmV3X2VsZW1lbnQgKEdTVF9PQkpFQ1QgKHNyYyksIHN0cnVjdHVyZSk7CisgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKHNyYyksIG1lc3NhZ2UpOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2hkdjEzOTRzcmNfY3JlYXRlIChHc3RQdXNoU3JjICogcHNyYywgR3N0QnVmZmVyICoqIGJ1ZikKK3sKKyAgR3N0SERWMTM5NFNyYyAqZHYxMzk0c3JjID0gR1NUX0hEVjEzOTRTUkMgKHBzcmMpOworICBzdHJ1Y3QgcG9sbGZkIHBvbGxmZHNbMl07CisKKyAgcG9sbGZkc1swXS5mZCA9IHJhdzEzOTRfZ2V0X2ZkIChkdjEzOTRzcmMtPmhhbmRsZSk7CisgIHBvbGxmZHNbMF0uZXZlbnRzID0gUE9MTElOIHwgUE9MTEVSUiB8IFBPTExIVVAgfCBQT0xMUFJJOworICBwb2xsZmRzWzFdLmZkID0gUkVBRF9TT0NLRVQgKGR2MTM5NHNyYyk7CisgIHBvbGxmZHNbMV0uZXZlbnRzID0gUE9MTElOIHwgUE9MTEVSUiB8IFBPTExIVVAgfCBQT0xMUFJJOworCisgIC8qIGFsbG9jYXRlIGEgMjA0OCBzYW1wbGVzIGJ1ZmZlciAqLworICBkdjEzOTRzcmMtPm91dGRhdGEgPSBnX21hbGxvYyAoMjA0OCAqIDE4OCk7CisgIGR2MTM5NHNyYy0+b3V0b2Zmc2V0ID0gMDsKKworICBHU1RfREVCVUcgKCJDcmVhdGUuLi4iKTsKKworICB3aGlsZSAoVFJVRSkgeworICAgIGludCByZXMgPSBwb2xsIChwb2xsZmRzLCAyLCAtMSk7CisKKyAgICBHU1RfTE9HICgicmVzOiVkIiwgcmVzKTsKKworICAgIGlmIChHX1VOTElLRUxZIChyZXMgPCAwKSkgeworICAgICAgaWYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgY29udGludWU7CisgICAgICBlbHNlCisgICAgICAgIGdvdG8gZXJyb3Jfd2hpbGVfcG9sbGluZzsKKyAgICB9CisKKyAgICBpZiAoR19VTkxJS0VMWSAocG9sbGZkc1sxXS5yZXZlbnRzKSkgeworICAgICAgY2hhciBjb21tYW5kOworCisgICAgICBpZiAocG9sbGZkc1sxXS5yZXZlbnRzICYgUE9MTElOKQorICAgICAgICBSRUFEX0NPTU1BTkQgKGR2MTM5NHNyYywgY29tbWFuZCwgcmVzKTsKKworICAgICAgZ290byB0b2xkX3RvX3N0b3A7CisgICAgfSBlbHNlIGlmIChHX0xJS0VMWSAocG9sbGZkc1swXS5yZXZlbnRzICYgUE9MTElOKSkgeworICAgICAgaW50IHB0OworCisgICAgICBwdCA9IGR2MTM5NHNyYy0+ZnJhbWVfc2VxdWVuY2U7CisgICAgICAvKiBzaG91bGRuJ3QgYmxvY2sgaW4gdGhlb3J5ICovCisgICAgICBHU1RfTE9HICgiSXRlcmF0aW5nICEgKCVkKSIsIGR2MTM5NHNyYy0+ZnJhbWVfc2VxdWVuY2UpOworICAgICAgcmF3MTM5NF9sb29wX2l0ZXJhdGUgKGR2MTM5NHNyYy0+aGFuZGxlKTsKKyAgICAgIEdTVF9MT0cgKCJBZnRlciBpdGVyYXRpb24gOiAlZCAoZGlmZjolZCkiLAorICAgICAgICAgIGR2MTM5NHNyYy0+ZnJhbWVfc2VxdWVuY2UsIGR2MTM5NHNyYy0+ZnJhbWVfc2VxdWVuY2UgLSBwdCk7CisgICAgICBpZiAoZHYxMzk0c3JjLT5vdXRvZmZzZXQpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGdfYXNzZXJ0IChkdjEzOTRzcmMtPm91dG9mZnNldCk7CisKKyAgR1NUX0xPRyAoIldlIGhhdmUgc29tZSBmcmFtZXMgKCV1IGJ5dGVzKSIsIChndWludCkgZHYxMzk0c3JjLT5vdXRvZmZzZXQpOworCisgIC8qIENyZWF0ZSB0aGUgYnVmZmVyICovCisgICpidWYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChkdjEzOTRzcmMtPm91dGRhdGEsIGR2MTM5NHNyYy0+b3V0b2Zmc2V0KTsKKyAgZHYxMzk0c3JjLT5vdXRkYXRhID0gTlVMTDsKKyAgZHYxMzk0c3JjLT5vdXRvZmZzZXQgPSAwOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworZXJyb3Jfd2hpbGVfcG9sbGluZzoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkdjEzOTRzcmMsIFJFU09VUkNFLCBSRUFELCAoTlVMTCksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisgIH0KK3RvbGRfdG9fc3RvcDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR2MTM5NHNyYywgInRvbGQgdG8gc3RvcCwgc2h1dHRpbmcgZG93biIpOworICAgIHJldHVybiBHU1RfRkxPV19GTFVTSElORzsKKyAgfQorfQorCitzdGF0aWMgaW50Citnc3RfaGR2MTM5NHNyY19kaXNjb3Zlcl9hdmNfbm9kZSAoR3N0SERWMTM5NFNyYyAqIHNyYykKK3sKKyAgaW50IG5vZGUgPSAtMTsKKyAgaW50IGksIGogPSAwOworICBpbnQgbSA9IHNyYy0+bnVtX3BvcnRzOworCisgIGlmIChzcmMtPnBvcnQgPj0gMCkgeworICAgIC8qIHNlYXJjaCBvbiBleHBsaWNpdCBwb3J0ICovCisgICAgaiA9IHNyYy0+cG9ydDsKKyAgICBtID0gaiArIDE7CisgIH0KKworICAvKiBsb29wIG92ZXIgYWxsIG91ciBwb3J0cyAqLworICBmb3IgKDsgaiA8IG0gJiYgbm9kZSA9PSAtMTsgaisrKSB7CisgICAgcmF3MTM5NGhhbmRsZV90IGhhbmRsZTsKKyAgICBzdHJ1Y3QgcmF3MTM5NF9wb3J0aW5mbyBwaW5mWzE2XTsKKworICAgIC8qIG9wZW4gdGhlIHBvcnQgKi8KKyAgICBoYW5kbGUgPSByYXcxMzk0X25ld19oYW5kbGUgKCk7CisgICAgaWYgKCFoYW5kbGUpIHsKKyAgICAgIEdTVF9XQVJOSU5HICgicmF3MTM5NCAtIGZhaWxlZCB0byBnZXQgaGFuZGxlOiAlcy5cbiIsIHN0cmVycm9yIChlcnJubykpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChyYXcxMzk0X2dldF9wb3J0X2luZm8gKGhhbmRsZSwgcGluZiwgMTYpIDwgMCkgeworICAgICAgR1NUX1dBUk5JTkcgKCJyYXcxMzk0IC0gZmFpbGVkIHRvIGdldCBwb3J0IGluZm86ICVzLlxuIiwKKyAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdvdG8gbmV4dDsKKyAgICB9CisKKyAgICAvKiB0ZWxsIHJhdzEzOTQgd2hpY2ggaG9zdCBhZGFwdGVyIHRvIHVzZSAqLworICAgIGlmIChyYXcxMzk0X3NldF9wb3J0IChoYW5kbGUsIGopIDwgMCkgeworICAgICAgR1NUX1dBUk5JTkcgKCJyYXcxMzk0IC0gZmFpbGVkIHRvIHNldCBzZXQgcG9ydDogJXMuXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdvdG8gbmV4dDsKKyAgICB9CisKKyAgICAvKiBub3cgbG9vcCBvdmVyIGFsbCB0aGUgbm9kZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcmF3MTM5NF9nZXRfbm9kZWNvdW50IChoYW5kbGUpOyBpKyspIHsKKyAgICAgIC8qIGFyZSB3ZSBsb29raW5nIGZvciBhbiBleHBsaWNpdCBHVUlEID8gKi8KKyAgICAgIGlmIChzcmMtPmd1aWQgIT0gMCkgeworICAgICAgICBpZiAoc3JjLT5ndWlkID09IHJvbTEzOTRfZ2V0X2d1aWQgKGhhbmRsZSwgaSkpIHsKKyAgICAgICAgICBub2RlID0gaTsKKyAgICAgICAgICBzcmMtPnBvcnQgPSBqOworICAgICAgICAgIGdfZnJlZSAoc3JjLT51cmkpOworICAgICAgICAgIHNyYy0+dXJpID0gZ19zdHJkdXBfcHJpbnRmICgiZHY6Ly8lZCIsIHNyYy0+cG9ydCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJvbTEzOTRfZGlyZWN0b3J5IHJvbV9kaXI7CisKKyAgICAgICAgLyogc2VsZWN0IGZpcnN0IEFWL0MgVGFwZSBSZWNvcmRlciBQbGF5ZXIgbm9kZSAqLworICAgICAgICBpZiAocm9tMTM5NF9nZXRfZGlyZWN0b3J5IChoYW5kbGUsIGksICZyb21fZGlyKSA8IDApIHsKKyAgICAgICAgICBHU1RfV0FSTklORyAoImVycm9yIHJlYWRpbmcgY29uZmlnIHJvbSBkaXJlY3RvcnkgZm9yIG5vZGUgJWRcbiIsIGkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgocm9tMTM5NF9nZXRfbm9kZV90eXBlICgmcm9tX2RpcikgPT0gUk9NMTM5NF9OT0RFX1RZUEVfQVZDKSAmJgorICAgICAgICAgICAgYXZjMTM5NF9jaGVja19zdWJ1bml0X3R5cGUgKGhhbmRsZSwgaSwgQVZDMTM5NF9TVUJVTklUX1RZUEVfVkNSKSkgeworICAgICAgICAgIG5vZGUgPSBpOworICAgICAgICAgIHNyYy0+cG9ydCA9IGo7CisgICAgICAgICAgc3JjLT5ndWlkID0gcm9tMTM5NF9nZXRfZ3VpZCAoaGFuZGxlLCBpKTsKKyAgICAgICAgICBnX2ZyZWUgKHNyYy0+dXJpKTsKKyAgICAgICAgICBzcmMtPnVyaSA9IGdfc3RyZHVwX3ByaW50ZiAoImR2Oi8vJWQiLCBzcmMtPnBvcnQpOworICAgICAgICAgIGdfZnJlZSAoc3JjLT5kZXZpY2VfbmFtZSk7CisgICAgICAgICAgc3JjLT5kZXZpY2VfbmFtZSA9IGdfc3RyZHVwIChyb21fZGlyLmxhYmVsKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByb20xMzk0X2ZyZWVfZGlyZWN0b3J5ICgmcm9tX2Rpcik7CisgICAgICB9CisgICAgfQorICBuZXh0OgorICAgIHJhdzEzOTRfZGVzdHJveV9oYW5kbGUgKGhhbmRsZSk7CisgIH0KKyAgcmV0dXJuIG5vZGU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2hkdjEzOTRzcmNfc3RhcnQgKEdzdEJhc2VTcmMgKiBic3JjKQoreworICBHc3RIRFYxMzk0U3JjICpzcmMgPSBHU1RfSERWMTM5NFNSQyAoYnNyYyk7CisgIGludCBjb250cm9sX3NvY2tbMl07CisKKyAgc3JjLT5jb25uZWN0ZWQgPSBGQUxTRTsKKworICBpZiAoc29ja2V0cGFpciAoUEZfVU5JWCwgU09DS19TVFJFQU0sIDAsIGNvbnRyb2xfc29jaykgPCAwKQorICAgIGdvdG8gc29ja2V0X3BhaXI7CisKKyAgUkVBRF9TT0NLRVQgKHNyYykgPSBjb250cm9sX3NvY2tbMF07CisgIFdSSVRFX1NPQ0tFVCAoc3JjKSA9IGNvbnRyb2xfc29ja1sxXTsKKworICBpZiAoZmNudGwgKFJFQURfU09DS0VUIChzcmMpLCBGX1NFVEZMLCBPX05PTkJMT0NLKSA8IDApCisgICAgR1NUX0VSUk9SX09CSkVDVCAoc3JjLCAiZmFpbGVkIHRvIG1ha2UgcmVhZCBzb2NrZXQgbm9uLWJsb2NraW5nOiAlcyIsCisgICAgICAgIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgIGlmIChmY250bCAoV1JJVEVfU09DS0VUIChzcmMpLCBGX1NFVEZMLCBPX05PTkJMT0NLKSA8IDApCisgICAgR1NUX0VSUk9SX09CSkVDVCAoc3JjLCAiZmFpbGVkIHRvIG1ha2Ugd3JpdGUgc29ja2V0IG5vbi1ibG9ja2luZzogJXMiLAorICAgICAgICBnX3N0cmVycm9yIChlcnJubykpOworCisgIHNyYy0+aGFuZGxlID0gcmF3MTM5NF9uZXdfaGFuZGxlICgpOworCisgIGlmICghc3JjLT5oYW5kbGUpIHsKKyAgICBpZiAoZXJybm8gPT0gRUFDQ0VTKQorICAgICAgZ290byBwZXJtaXNzaW9uX2RlbmllZDsKKyAgICBlbHNlIGlmIChlcnJubyA9PSBFTk9FTlQpCisgICAgICBnb3RvIG5vdF9mb3VuZDsKKyAgICBlbHNlCisgICAgICBnb3RvIG5vX2hhbmRsZTsKKyAgfQorCisgIHNyYy0+bnVtX3BvcnRzID0gcmF3MTM5NF9nZXRfcG9ydF9pbmZvIChzcmMtPmhhbmRsZSwgc3JjLT5waW5mbywgMTYpOworCisgIGlmIChzcmMtPm51bV9wb3J0cyA9PSAwKQorICAgIGdvdG8gbm9fcG9ydHM7CisKKyAgaWYgKHNyYy0+dXNlX2F2YyB8fCBzcmMtPnBvcnQgPT0gLTEpCisgICAgc3JjLT5hdmNfbm9kZSA9IGdzdF9oZHYxMzk0c3JjX2Rpc2NvdmVyX2F2Y19ub2RlIChzcmMpOworCisgIC8qIGxldHMgZGVzdHJveSBoYW5kbGUgYW5kIGNyZWF0ZSBvbmUgb24gcG9ydAorICAgICB0aGlzIGlzIG1vcmUgcmVsaWFibGUgdGhhbiBzZXR0aW5nIHBvcnQgb24KKyAgICAgdGhlIGV4aXN0aW5nIGhhbmRsZSAqLworICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChzcmMtPmhhbmRsZSk7CisgIHNyYy0+aGFuZGxlID0gcmF3MTM5NF9uZXdfaGFuZGxlX29uX3BvcnQgKHNyYy0+cG9ydCk7CisgIGlmICghc3JjLT5oYW5kbGUpCisgICAgZ290byBjYW5ub3Rfc2V0X3BvcnQ7CisKKyAgcmF3MTM5NF9zZXRfdXNlcmRhdGEgKHNyYy0+aGFuZGxlLCBzcmMpOworICByYXcxMzk0X3NldF9idXNfcmVzZXRfaGFuZGxlciAoc3JjLT5oYW5kbGUsIGdzdF9oZHYxMzk0c3JjX2J1c19yZXNldCk7CisKKyAgeworICAgIG5vZGVpZF90IG1fbm9kZSA9IChzcmMtPmF2Y19ub2RlIHwgMHhmZmMwKTsKKyAgICBpbnQgbV9jaGFubmVsID0gLTE7CisgICAgaW50IG1fYmFuZHdpZHRoID0gMDsKKyAgICBpbnQgbV9vdXRwdXRQb3J0ID0gLTE7CisgICAgaW50IG1faW5wdXRQb3J0ID0gLTE7CisKKyAgICBtX2NoYW5uZWwgPSBpZWM2MTg4M19jbXBfY29ubmVjdCAoc3JjLT5oYW5kbGUsIG1fbm9kZSwgJm1fb3V0cHV0UG9ydCwKKyAgICAgICAgcmF3MTM5NF9nZXRfbG9jYWxfaWQgKHNyYy0+aGFuZGxlKSwgJm1faW5wdXRQb3J0LCAmbV9iYW5kd2lkdGgpOworCisgICAgaWYgKG1fY2hhbm5lbCA+PSAwKSB7CisgICAgICBzcmMtPmNoYW5uZWwgPSBtX2NoYW5uZWw7CisgICAgfQorICB9CisKKworICBpZiAoKHNyYy0+aWVjNjE4ODNtcGVnMiA9CisgICAgICAgICAgaWVjNjE4ODNfbXBlZzJfcmVjdl9pbml0IChzcmMtPmhhbmRsZSwKKyAgICAgICAgICAgICAgZ3N0X2hkdjEzOTRzcmNfaWVjNjE4ODNfcmVjZWl2ZSwgc3JjKSkgPT0gTlVMTCkKKyAgICBnb3RvIGNhbm5vdF9pbml0aWFsaXNlX2R2OworCisjaWYgMAorICByYXcxMzk0X3NldF9pc29faGFuZGxlciAoc3JjLT5oYW5kbGUsIHNyYy0+Y2hhbm5lbCwKKyAgICAgIGdzdF9oZHYxMzk0c3JjX2lzb19yZWNlaXZlKTsKKyNlbmRpZgorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN1Y2Nlc3NmdWxseSBvcGVuZWQgdXAgMTM5NCBjb25uZWN0aW9uIik7CisgIHNyYy0+Y29ubmVjdGVkID0gVFJVRTsKKworICBpZiAoaWVjNjE4ODNfbXBlZzJfcmVjdl9zdGFydCAoc3JjLT5pZWM2MTg4M21wZWcyLCBzcmMtPmNoYW5uZWwpICE9IDApCisgICAgZ290byBjYW5ub3Rfc3RhcnQ7CisjaWYgMAorICBpZiAocmF3MTM5NF9zdGFydF9pc29fcmN2IChzcmMtPmhhbmRsZSwgc3JjLT5jaGFubmVsKSA8IDApCisgICAgZ290byBjYW5ub3Rfc3RhcnQ7CisjZW5kaWYKKworICBpZiAoc3JjLT51c2VfYXZjKSB7CisgICAgcmF3MTM5NGhhbmRsZV90IGF2Y19oYW5kbGUgPSByYXcxMzk0X25ld19oYW5kbGVfb25fcG9ydCAoc3JjLT5wb3J0KTsKKworICAgIEdTVF9MT0cgKCJXZSBoYXZlIGFuIGF2Y19oYW5kbGUiKTsKKworICAgIC8qIHN0YXJ0IHRoZSBWQ1IgKi8KKyAgICBpZiAoYXZjX2hhbmRsZSkgeworICAgICAgaWYgKCFhdmMxMzk0X3Zjcl9pc19yZWNvcmRpbmcgKGF2Y19oYW5kbGUsIHNyYy0+YXZjX25vZGUpCisgICAgICAgICAgJiYgYXZjMTM5NF92Y3JfaXNfcGxheWluZyAoYXZjX2hhbmRsZSwgc3JjLT5hdmNfbm9kZSkKKyAgICAgICAgICAhPSBBVkMxMzk0X1ZDUl9PUEVSQU5EX1BMQVlfRk9SV0FSRCkgeworICAgICAgICBHU1RfTE9HICgiQ2FsbGluZyBhdmMxMzk0X3Zjcl9wbGF5KCkiKTsKKyAgICAgICAgYXZjMTM5NF92Y3JfcGxheSAoYXZjX2hhbmRsZSwgc3JjLT5hdmNfbm9kZSk7CisgICAgICB9CisgICAgICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChhdmNfaGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJTdGFydGluZyBWQ1IgdmlhIGF2YzEzOTQgZmFpbGVkOiAlcyIsCisgICAgICAgICAgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKKworc29ja2V0X3BhaXI6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgT1BFTl9SRUFEX1dSSVRFLCAoTlVMTCksCisgICAgICAgIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorcGVybWlzc2lvbl9kZW5pZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgT1BFTl9SRUFELCAoTlVMTCksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm90X2ZvdW5kOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE5PVF9GT1VORCwgKE5VTEwpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX2hhbmRsZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBPUEVOX1JFQUQsIChOVUxMKSwKKyAgICAgICAgKCJjYW4ndCBnZXQgcmF3MTM5NCBoYW5kbGUgKCVzKSIsIGdfc3RyZXJyb3IgKGVycm5vKSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fcG9ydHM6CisgIHsKKyAgICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChzcmMtPmhhbmRsZSk7CisgICAgc3JjLT5oYW5kbGUgPSBOVUxMOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBOT1RfRk9VTkQsIChOVUxMKSwKKyAgICAgICAgKCJubyBwb3J0cyBhdmFpbGFibGUgZm9yIHJhdzEzOTQiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitjYW5ub3Rfc2V0X3BvcnQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJjYW4ndCBzZXQgMTM5NCBwb3J0ICVkIiwgc3JjLT5wb3J0KSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitjYW5ub3Rfc3RhcnQ6CisgIHsKKyAgICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChzcmMtPmhhbmRsZSk7CisgICAgc3JjLT5oYW5kbGUgPSBOVUxMOworICAgIGllYzYxODgzX21wZWcyX2Nsb3NlIChzcmMtPmllYzYxODgzbXBlZzIpOworICAgIHNyYy0+aWVjNjE4ODNtcGVnMiA9IE5VTEw7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICAgKCJjYW4ndCBzdGFydCAxMzk0IGlzbyByZWNlaXZlIikpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorY2Fubm90X2luaXRpYWxpc2VfZHY6CisgIHsKKyAgICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChzcmMtPmhhbmRsZSk7CisgICAgc3JjLT5oYW5kbGUgPSBOVUxMOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBSRUFELCAoTlVMTCksCisgICAgICAgICgiY2FuJ3QgaW5pdGlhbGlzZSBpZWM2MTg4MyBoZHYiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2hkdjEzOTRzcmNfc3RvcCAoR3N0QmFzZVNyYyAqIGJzcmMpCit7CisgIEdzdEhEVjEzOTRTcmMgKnNyYyA9IEdTVF9IRFYxMzk0U1JDIChic3JjKTsKKworICBjbG9zZSAoUkVBRF9TT0NLRVQgKHNyYykpOworICBjbG9zZSAoV1JJVEVfU09DS0VUIChzcmMpKTsKKyAgUkVBRF9TT0NLRVQgKHNyYykgPSAtMTsKKyAgV1JJVEVfU09DS0VUIChzcmMpID0gLTE7CisKKyAgaWVjNjE4ODNfbXBlZzJfY2xvc2UgKHNyYy0+aWVjNjE4ODNtcGVnMik7CisjaWYgMAorICByYXcxMzk0X3N0b3BfaXNvX3JjdiAoc3JjLT5oYW5kbGUsIHNyYy0+Y2hhbm5lbCk7CisjZW5kaWYKKworICBpZiAoc3JjLT51c2VfYXZjKSB7CisgICAgcmF3MTM5NGhhbmRsZV90IGF2Y19oYW5kbGUgPSByYXcxMzk0X25ld19oYW5kbGVfb25fcG9ydCAoc3JjLT5wb3J0KTsKKworICAgIC8qIHBhdXNlIGFuZCBzdG9wIHRoZSBWQ1IgKi8KKyAgICBpZiAoYXZjX2hhbmRsZSkgeworICAgICAgaWYgKCFhdmMxMzk0X3Zjcl9pc19yZWNvcmRpbmcgKGF2Y19oYW5kbGUsIHNyYy0+YXZjX25vZGUpCisgICAgICAgICAgJiYgKGF2YzEzOTRfdmNyX2lzX3BsYXlpbmcgKGF2Y19oYW5kbGUsIHNyYy0+YXZjX25vZGUpCisgICAgICAgICAgICAgICE9IEFWQzEzOTRfVkNSX09QRVJBTkRfUExBWV9GT1JXQVJEX1BBVVNFKSkKKyAgICAgICAgYXZjMTM5NF92Y3JfcGF1c2UgKGF2Y19oYW5kbGUsIHNyYy0+YXZjX25vZGUpOworICAgICAgYXZjMTM5NF92Y3Jfc3RvcCAoYXZjX2hhbmRsZSwgc3JjLT5hdmNfbm9kZSk7CisgICAgICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChhdmNfaGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJTdGFydGluZyBWQ1IgdmlhIGF2YzEzOTQgZmFpbGVkOiAlcyIsCisgICAgICAgICAgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICB9CisgIH0KKworICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChzcmMtPmhhbmRsZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2hkdjEzOTRzcmNfdW5sb2NrIChHc3RCYXNlU3JjICogYnNyYykKK3sKKyAgR3N0SERWMTM5NFNyYyAqc3JjID0gR1NUX0hEVjEzOTRTUkMgKGJzcmMpOworCisgIFNFTkRfQ09NTUFORCAoc3JjLCBDT05UUk9MX1NUT1ApOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2hkdjEzOTRzcmNfdXBkYXRlX2RldmljZV9uYW1lIChHc3RIRFYxMzk0U3JjICogc3JjKQoreworICByYXcxMzk0aGFuZGxlX3QgaGFuZGxlOworICBnaW50IHBvcnRjb3VudCwgcG9ydCwgbm9kZWNvdW50LCBub2RlOworICByb20xMzk0X2RpcmVjdG9yeSBkaXJlY3Rvcnk7CisKKyAgZ19mcmVlIChzcmMtPmRldmljZV9uYW1lKTsKKyAgc3JjLT5kZXZpY2VfbmFtZSA9IE5VTEw7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgInVwZGF0aW5nIGRldmljZSBuYW1lIGZvciBjdXJyZW50IEdVSUQiKTsKKworICBoYW5kbGUgPSByYXcxMzk0X25ld19oYW5kbGUgKCk7CisKKyAgaWYgKGhhbmRsZSA9PSBOVUxMKQorICAgIGdvdG8gZ2V0aGFuZGxlX2ZhaWxlZDsKKworICBwb3J0Y291bnQgPSByYXcxMzk0X2dldF9wb3J0X2luZm8gKGhhbmRsZSwgTlVMTCwgMCk7CisgIGZvciAocG9ydCA9IDA7IHBvcnQgPCBwb3J0Y291bnQ7IHBvcnQrKykgeworICAgIGlmIChyYXcxMzk0X3NldF9wb3J0IChoYW5kbGUsIHBvcnQpID49IDApIHsKKyAgICAgIG5vZGVjb3VudCA9IHJhdzEzOTRfZ2V0X25vZGVjb3VudCAoaGFuZGxlKTsKKyAgICAgIGZvciAobm9kZSA9IDA7IG5vZGUgPCBub2RlY291bnQ7IG5vZGUrKykgeworICAgICAgICBpZiAoc3JjLT5ndWlkID09IHJvbTEzOTRfZ2V0X2d1aWQgKGhhbmRsZSwgbm9kZSkpIHsKKyAgICAgICAgICBpZiAocm9tMTM5NF9nZXRfZGlyZWN0b3J5IChoYW5kbGUsIG5vZGUsICZkaXJlY3RvcnkpID49IDApIHsKKyAgICAgICAgICAgIGdfZnJlZSAoc3JjLT5kZXZpY2VfbmFtZSk7CisgICAgICAgICAgICBzcmMtPmRldmljZV9uYW1lID0gZ19zdHJkdXAgKGRpcmVjdG9yeS5sYWJlbCk7CisgICAgICAgICAgICByb20xMzk0X2ZyZWVfZGlyZWN0b3J5ICgmZGlyZWN0b3J5KTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR1NUX1dBUk5JTkcgKCJlcnJvciByZWFkaW5nIHJvbSBkaXJlY3RvcnkgZm9yIG5vZGUgJWQiLCBub2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzcmMtPmRldmljZV9uYW1lID0gZ19zdHJkdXAgKCJVbmtub3duIik7ICAgICAgLyogRklYTUU6IHRyYW5zbGF0ZT8gKi8KKworZG9uZToKKworICByYXcxMzk0X2Rlc3Ryb3lfaGFuZGxlIChoYW5kbGUpOworICByZXR1cm47CisKKy8qIEVSUk9SUyAqLworZ2V0aGFuZGxlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HICgiZmFpbGVkIHRvIGdldCByYXcxMzk0IGhhbmRsZTogJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworICAgIHNyYy0+ZGV2aWNlX25hbWUgPSBnX3N0cmR1cCAoIlVua25vd24iKTsgICAgLyogRklYTUU6IHRyYW5zbGF0ZT8gKi8KKyAgICByZXR1cm47CisgIH0KK30KKworLyoqKiBHU1RVUklIQU5ETEVSIElOVEVSRkFDRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgR3N0VVJJVHlwZQorZ3N0X2hkdjEzOTRzcmNfdXJpX2dldF90eXBlIChHVHlwZSB0eXBlKQoreworICByZXR1cm4gR1NUX1VSSV9TUkM7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqY29uc3QgKgorZ3N0X2hkdjEzOTRzcmNfdXJpX2dldF9wcm90b2NvbHMgKEdUeXBlIHR5cGUpCit7CisgIHN0YXRpYyBjb25zdCBnY2hhciAqcHJvdG9jb2xzW10gPSB7IChjaGFyICopICJoZHYiLCBOVUxMIH07CisKKyAgcmV0dXJuIHByb3RvY29sczsKK30KKworc3RhdGljIGdjaGFyICoKK2dzdF9oZHYxMzk0c3JjX3VyaV9nZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlcikKK3sKKyAgR3N0SERWMTM5NFNyYyAqZ3N0X2hkdjEzOTRzcmMgPSBHU1RfSERWMTM5NFNSQyAoaGFuZGxlcik7CisKKyAgcmV0dXJuIGdzdF9oZHYxMzk0c3JjLT51cmk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2hkdjEzOTRzcmNfdXJpX3NldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyLCBjb25zdCBnY2hhciAqIHVyaSwKKyAgICBHRXJyb3IgKiogZXJyb3IpCit7CisgIGdjaGFyICpwcm90b2NvbCwgKmxvY2F0aW9uOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworICBHc3RIRFYxMzk0U3JjICpnc3RfaGR2MTM5NHNyYyA9IEdTVF9IRFYxMzk0U1JDIChoYW5kbGVyKTsKKworICBwcm90b2NvbCA9IGdzdF91cmlfZ2V0X3Byb3RvY29sICh1cmkpOworICBpZiAoc3RyY21wIChwcm90b2NvbCwgImhkdiIpICE9IDApIHsKKyAgICBnX2ZyZWUgKHByb3RvY29sKTsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIEdTVF9VUklfRVJST1IsIEdTVF9VUklfRVJST1JfQkFEX1VSSSwKKyAgICAgICAgIkludmFsaWQgSERWIFVSSSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBnX2ZyZWUgKHByb3RvY29sKTsKKworICBsb2NhdGlvbiA9IGdzdF91cmlfZ2V0X2xvY2F0aW9uICh1cmkpOworICBpZiAobG9jYXRpb24gJiYgKmxvY2F0aW9uICE9ICdcMCcpCisgICAgZ3N0X2hkdjEzOTRzcmMtPnBvcnQgPSBzdHJ0b2wgKGxvY2F0aW9uLCBOVUxMLCAxMCk7CisgIGVsc2UKKyAgICBnc3RfaGR2MTM5NHNyYy0+cG9ydCA9IERFRkFVTFRfUE9SVDsKKyAgZ19mcmVlIChsb2NhdGlvbik7CisgIGdfZnJlZSAoZ3N0X2hkdjEzOTRzcmMtPnVyaSk7CisgIGdzdF9oZHYxMzk0c3JjLT51cmkgPSBnX3N0cmR1cF9wcmludGYgKCJoZHY6Ly8lZCIsIGdzdF9oZHYxMzk0c3JjLT5wb3J0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X2hkdjEzOTRzcmNfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0VVJJSGFuZGxlckludGVyZmFjZSAqaWZhY2UgPSAoR3N0VVJJSGFuZGxlckludGVyZmFjZSAqKSBnX2lmYWNlOworCisgIGlmYWNlLT5nZXRfdHlwZSA9IGdzdF9oZHYxMzk0c3JjX3VyaV9nZXRfdHlwZTsKKyAgaWZhY2UtPmdldF9wcm90b2NvbHMgPSBnc3RfaGR2MTM5NHNyY191cmlfZ2V0X3Byb3RvY29sczsKKyAgaWZhY2UtPmdldF91cmkgPSBnc3RfaGR2MTM5NHNyY191cmlfZ2V0X3VyaTsKKyAgaWZhY2UtPnNldF91cmkgPSBnc3RfaGR2MTM5NHNyY191cmlfc2V0X3VyaTsKK30KZGlmZiAtLWdpdCBhL2V4dC9yYXcxMzk0L2dzdGhkdjEzOTRzcmMuaCBiL2V4dC9yYXcxMzk0L2dzdGhkdjEzOTRzcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWU4NjNjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3JhdzEzOTQvZ3N0aGR2MTM5NHNyYy5oCkBAIC0wLDAgKzEsODUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOD4gRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfR1NUSERWMTM5NF9IX18KKyNkZWZpbmUgX19HU1RfR1NUSERWMTM5NF9IX18KKworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdHB1c2hzcmMuaD4KKworI2luY2x1ZGUgPGxpYnJhdzEzOTQvcmF3MTM5NC5oPgorI2lmZGVmIEhBVkVfTElCSUVDNjE4ODMKKyNpbmNsdWRlIDxsaWJpZWM2MTg4My9pZWM2MTg4My5oPgorI2VuZGlmCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9IRFYxMzk0U1JDIFwKKyAgKGdzdF9oZHYxMzk0c3JjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9IRFYxMzk0U1JDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfSERWMTM5NFNSQyxHc3RIRFYxMzk0U3JjKSkKKyNkZWZpbmUgR1NUX0hEVjEzOTRTUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfSERWMTM5NFNSQyxHc3RIRFYxMzk0U3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfSERWMTM5NFNSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0hEVjEzOTRTUkMpKQorI2RlZmluZSBHU1RfSVNfSERWMTM5NFNSQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9IRFYxMzk0U1JDKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEhEVjEzOTRTcmMgR3N0SERWMTM5NFNyYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RIRFYxMzk0U3JjQ2xhc3MgR3N0SERWMTM5NFNyY0NsYXNzOworCitzdHJ1Y3QgX0dzdEhEVjEzOTRTcmMgeworICBHc3RQdXNoU3JjIGVsZW1lbnQ7CisKKyAgZ2ludCBudW1fcG9ydHM7CisgIGdpbnQgcG9ydDsKKyAgZ2ludCBjaGFubmVsOworICBvY3RsZXRfdCBndWlkOworICBnaW50IGF2Y19ub2RlOworICBnYm9vbGVhbiB1c2VfYXZjOworCisgIHN0cnVjdCByYXcxMzk0X3BvcnRpbmZvIHBpbmZvWzE2XTsKKyAgcmF3MTM5NGhhbmRsZV90IGhhbmRsZTsKKworICBncG9pbnRlciBvdXRkYXRhOworICBnc2l6ZSBvdXRvZmZzZXQ7CisgIGd1aW50IGZyYW1lX3NpemU7CisgIGd1aW50IGZyYW1lX3NlcXVlbmNlOworCisgIGludCBjb250cm9sX3NvY2tbMl07CisKKyAgZ2NoYXIgKnVyaTsKKworICBnY2hhciAqZGV2aWNlX25hbWU7CisKKyAgZ2Jvb2xlYW4gY29ubmVjdGVkOworICBpZWM2MTg4M19tcGVnMl90IGllYzYxODgzbXBlZzI7Cit9OworCitzdHJ1Y3QgX0dzdEhEVjEzOTRTcmNDbGFzcyB7CisgIEdzdFB1c2hTcmNDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfaGR2MTM5NHNyY19nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0dTVDEzOTRfSF9fICovCmRpZmYgLS1naXQgYS9leHQvcmF3MTM5NC9tZXNvbi5idWlsZCBiL2V4dC9yYXcxMzk0L21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YTZhNWEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcmF3MTM5NC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDIyIEBACityYXcxMzk0X2RlcCA9IGRlcGVuZGVuY3koJ2xpYnJhdzEzOTQnLCB2ZXJzaW9uOiAnPj0gMi4wLjAnLCByZXF1aXJlZDogZmFsc2UpCithdmMxMzk0X2RlcCA9IGRlcGVuZGVuY3koJ2xpYmF2YzEzOTQnLCB2ZXJzaW9uOiAnPj0gMC41LjQnLCByZXF1aXJlZDogZmFsc2UpCitpZWM2MTg4M19kZXAgPSBkZXBlbmRlbmN5KCdsaWJpZWM2MTg4MycsIHZlcnNpb246ICc+PSAxLjAuMCcsIHJlcXVpcmVkOiBmYWxzZSkKKworaGF2ZV8xMzk0ID0gZmFsc2UKK2lmIHJhdzEzOTRfZGVwLmZvdW5kKCkgYW5kIGllYzYxODgzX2RlcC5mb3VuZCgpIGFuZCBhdmMxMzk0X2RlcC5mb3VuZCgpCisgIGlmIGNjLmhhc19mdW5jdGlvbignYXZjMTM5NF9zZW5kX2NvbW1hbmQnLCBkZXBlbmRlbmNpZXM6IGF2YzEzOTRfZGVwKQorICAgIGlmIGNjLmhhc19mdW5jdGlvbigncm9tMTM5NF9mcmVlX2RpcmVjdG9yeScsIGRlcGVuZGVuY2llczogYXZjMTM5NF9kZXApCisgICAgICBoYXZlXzEzOTQgPSB0cnVlCisgICAgZW5kaWYKKyAgZW5kaWYKK2VuZGlmCisKK2lmIGhhdmVfMTM5NAorICBsaWJyYXJ5KCdnc3QxMzk0JywKKyAgICAnZ3N0MTM5NC5jJywgJ2dzdDEzOTRwcm9iZS5jJywgJ2dzdGR2MTM5NHNyYy5jJywgJ2dzdGhkdjEzOTRzcmMuYycsICdnc3QxMzk0Y2xvY2suYycsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzICsgWyctREhBVkVfTElCSUVDNjE4ODMnXSwKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgICAgZGVwZW5kZW5jaWVzIDogW2dzdHZpZGVvX2RlcCwgZ3N0YmFzZV9kZXAsIHJhdzEzOTRfZGVwLCBhdmMxMzk0X2RlcCwgaWVjNjE4ODNfZGVwXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIpCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L3Nob3V0Mi9NYWtlZmlsZS5hbSBiL2V4dC9zaG91dDIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3MDVmYgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zaG91dDIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RzaG91dDIubGEKKworbGliZ3N0c2hvdXQyX2xhX1NPVVJDRVMgPSBnc3RzaG91dDIuYyAKK2xpYmdzdHNob3V0Ml9sYV9DRkxBR1MgPSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKFNIT1VUMl9DRkxBR1MpCitsaWJnc3RzaG91dDJfbGFfTElCQUREID0gJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKFNIT1VUMl9MSUJTKQorbGliZ3N0c2hvdXQyX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RzaG91dDIuaApkaWZmIC0tZ2l0IGEvZXh0L3Nob3V0Mi9nc3RzaG91dDIuYyBiL2V4dC9zaG91dDIvZ3N0c2hvdXQyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzZjY1MgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zaG91dDIvZ3N0c2hvdXQyLmMKQEAgLTAsMCArMSw5NDggQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDEyPiBSYWxwaCBHaWxlcyA8Z2lsZXNAbW96aWxsYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtc2hvdXQyc2VuZAorICoKKyAqIHNob3V0MnNlbmQgcHVzaGVzIGEgbWVkaWEgc3RyZWFtIHRvIGFuIEljZWNhc3Qgc2VydmVyCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHVyaWRlY29kZWJpbiB1cmk9ZmlsZTovLy9wYXRoL3RvL2F1ZGlvZmlsZSAhIGF1ZGlvY29udmVydCAhIHZvcmJpc2VuYyAhIG9nZ211eCAhIHNob3V0MnNlbmQgbW91bnQ9L3N0cmVhbS5vZ2cgcG9ydD04MDAwIHVzZXJuYW1lPXNvdXJjZSBwYXNzd29yZD1zb21lcGFzc3dvcmQgaXA9c2VydmVyX0lQX2FkZHJlc3Nfb3JfaG9zdG5hbWUKKyAqIF18IFRoaXMgcGlwZWxpbmUgZGVtdXhlcywgZGVjb2RlcywgcmUtZW5jb2RlcyBhbmQgcmUtbXV4ZXMgYW4gYXVkaW8KKyAqIG1lZGlhIGZpbGUgaW50byBvZ2d2b3JiaXMgYW5kIHNlbmRzIHRoZSByZXN1bHRpbmcgc3RyZWFtIHRvIGFuIEljZWNhc3QKKyAqIHNlcnZlci4gUHJvcGVydGllcyBtb3VudCwgcG9ydCwgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFyZSBhbGwgc2VydmVyLWNvbmZpZworICogZGVwZW5kZW50LgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RzaG91dDIuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdC9nc3QtaTE4bi1wbHVnaW4uaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoc2hvdXQyX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHNob3V0Ml9kZWJ1ZworCisKK2VudW0KK3sKKyAgU0lHTkFMX0NPTk5FQ1RJT05fUFJPQkxFTSwgICAgLyogRklYTUUgMi4wOiByZW1vdmUgdGhpcyAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBBUkdfMCwKKyAgQVJHX0lQLCAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIElQIGFkZHJlc3Mgb3IgaG9zdG5hbWUgb2YgdGhlIHNlcnZlciAqLworICBBUkdfUE9SVCwgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgZW5jb2RlciBwb3J0IG51bWJlciBvbiB0aGUgc2VydmVyICovCisgIEFSR19QQVNTV09SRCwgICAgICAgICAgICAgICAgIC8qIHRoZSBlbmNvZGVyIHBhc3N3b3JkIG9uIHRoZSBzZXJ2ZXIgKi8KKyAgQVJHX1VTRVJOQU1FLCAgICAgICAgICAgICAgICAgLyogdGhlIGVuY29kZXIgdXNlcm5hbWUgb24gdGhlIHNlcnZlciAqLworICBBUkdfUFVCTElDLCAgICAgICAgICAgICAgICAgICAvKiBpcyB0aGlzIHN0cmVhbSBwdWJsaWM/ICovCisgIEFSR19TVFJFQU1OQU1FLCAgICAgICAgICAgICAgIC8qIE5hbWUgb2YgdGhlIHN0cmVhbSAqLworICBBUkdfREVTQ1JJUFRJT04sICAgICAgICAgICAgICAvKiBEZXNjcmlwdGlvbiBvZiB0aGUgc3RyZWFtICovCisgIEFSR19HRU5SRSwgICAgICAgICAgICAgICAgICAgIC8qIEdlbnJlIG9mIHRoZSBzdHJlYW0gKi8KKworICBBUkdfUFJPVE9DT0wsICAgICAgICAgICAgICAgICAvKiBQcm90b2NvbCB0byBjb25uZWN0IHdpdGggKi8KKworICBBUkdfTU9VTlQsICAgICAgICAgICAgICAgICAgICAvKiBtb3VudHBvaW50IG9mIHN0cmVhbSAoaWNlY2FzdCBvbmx5KSAqLworICBBUkdfVVJMLCAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgc3RyZWFtJ3MgaG9tZXBhZ2UgVVJMICovCisKKyAgQVJHX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgLyogVGhlIG1heCBhbW91bnQgb2YgdGltZSB0byB3YWl0IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrIGFjdGl2aXR5ICovCit9OworCisjZGVmaW5lIERFRkFVTFRfSVAgICAgICAgICAgICIxMjcuMC4wLjEiCisjZGVmaW5lIERFRkFVTFRfUE9SVCAgICAgICAgIDgwMDAKKyNkZWZpbmUgREVGQVVMVF9QQVNTV09SRCAgICAgImhhY2ttZSIKKyNkZWZpbmUgREVGQVVMVF9VU0VSTkFNRSAgICAgInNvdXJjZSIKKyNkZWZpbmUgREVGQVVMVF9QVUJMSUMgICAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfU1RSRUFNTkFNRSAgICIiCisjZGVmaW5lIERFRkFVTFRfREVTQ1JJUFRJT04gICIiCisjZGVmaW5lIERFRkFVTFRfR0VOUkUgICAgICAgICIiCisjZGVmaW5lIERFRkFVTFRfTU9VTlQgICAgICAgICIiCisjZGVmaW5lIERFRkFVTFRfVVJMICAgICAgICAgICIiCisjZGVmaW5lIERFRkFVTFRfUFJPVE9DT0wgICAgIFNIT1VUMlNFTkRfUFJPVE9DT0xfSFRUUAorI2RlZmluZSBERUZBVUxUX1RJTUVPVVQgICAgICAxMDAwMAorCisjaWZkZWYgU0hPVVRfRk9STUFUX1dFQk0KKyNkZWZpbmUgV0VCTV9DQVBTICI7IHZpZGVvL3dlYm07IGF1ZGlvL3dlYm0iCisjZWxzZQorI2RlZmluZSBXRUJNX0NBUFMgIiIKKyNlbmRpZgorc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi9vZ2c7IGF1ZGlvL29nZzsgdmlkZW8vb2dnOyAiCisgICAgICAgICJhdWRpby9tcGVnLCBtcGVndmVyc2lvbiA9IChpbnQpIDEsIGxheWVyID0gKGludCkgWyAxLCAzIF0iIFdFQk1fQ0FQUykpOworCitzdGF0aWMgdm9pZCBnc3Rfc2hvdXQyc2VuZF9maW5hbGl6ZSAoR3N0U2hvdXQyc2VuZCAqIHNob3V0MnNlbmQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Nob3V0MnNlbmRfZXZlbnQgKEdzdEJhc2VTaW5rICogc2luaywgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Nob3V0MnNlbmRfdW5sb2NrIChHc3RCYXNlU2luayAqIGJhc2VzaW5rKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc2hvdXQyc2VuZF91bmxvY2tfc3RvcCAoR3N0QmFzZVNpbmsgKiBiYXNlc2luayk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc2hvdXQyc2VuZF9yZW5kZXIgKEdzdEJhc2VTaW5rICogc2luaywKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9zaG91dDJzZW5kX3N0YXJ0IChHc3RCYXNlU2luayAqIGJhc2VzaW5rKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc2hvdXQyc2VuZF9zdG9wIChHc3RCYXNlU2luayAqIGJhc2VzaW5rKTsKKworc3RhdGljIHZvaWQgZ3N0X3Nob3V0MnNlbmRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3Nob3V0MnNlbmRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Nob3V0MnNlbmRfc2V0Y2FwcyAoR3N0QmFzZVNpbmsgKiBiYXNlc2luaywgR3N0Q2FwcyAqIGNhcHMpOworCitzdGF0aWMgZ3VpbnQgZ3N0X3Nob3V0MnNlbmRfc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsKKworI2RlZmluZSBHU1RfVFlQRV9TSE9VVF9QUk9UT0NPTCAoZ3N0X3Nob3V0MnNlbmRfcHJvdG9jb2xfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3Nob3V0MnNlbmRfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBzaG91dDJzZW5kX3Byb3RvY29sX3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBzaG91dDJzZW5kX3Byb3RvY29sW10gPSB7CisgICAge1NIT1VUMlNFTkRfUFJPVE9DT0xfWEFVRElPQ0FTVCwKKyAgICAgICAgIlhhdWRpb2Nhc3QgUHJvdG9jb2wgKGljZWNhc3QgMS4zLngpIiwgInhhdWRpb2Nhc3QifSwKKyAgICB7U0hPVVQyU0VORF9QUk9UT0NPTF9JQ1ksICJJY3kgUHJvdG9jb2wgKFNob3V0Q2FzdCkiLCAiaWN5In0sCisgICAge1NIT1VUMlNFTkRfUFJPVE9DT0xfSFRUUCwgIkh0dHAgUHJvdG9jb2wgKGljZWNhc3QgMi54KSIsICJodHRwIn0sCisgICAgezAsIE5VTEwsIE5VTEx9LAorICB9OworCisgIGlmICghc2hvdXQyc2VuZF9wcm90b2NvbF90eXBlKSB7CisgICAgc2hvdXQyc2VuZF9wcm90b2NvbF90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFNob3V0MlNlbmRQcm90b2NvbCIsIHNob3V0MnNlbmRfcHJvdG9jb2wpOworICB9CisKKworICByZXR1cm4gc2hvdXQyc2VuZF9wcm90b2NvbF90eXBlOworfQorCisjZGVmaW5lIGdzdF9zaG91dDJzZW5kX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RTaG91dDJzZW5kLCBnc3Rfc2hvdXQyc2VuZCwgR1NUX1RZUEVfQkFTRV9TSU5LLAorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfVEFHX1NFVFRFUiwgTlVMTCkpOworCitzdGF0aWMgdm9pZAorZ3N0X3Nob3V0MnNlbmRfY2xhc3NfaW5pdCAoR3N0U2hvdXQyc2VuZENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCYXNlU2lua0NsYXNzICpnc3RiYXNlc2lua19jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdGJhc2VzaW5rX2NsYXNzID0gKEdzdEJhc2VTaW5rQ2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3Nob3V0MnNlbmRfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfc2hvdXQyc2VuZF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gKEdPYmplY3RGaW5hbGl6ZUZ1bmMpIGdzdF9zaG91dDJzZW5kX2ZpbmFsaXplOworCisgIC8qIEZJWE1FOiAyLjAgU2hvdWxkIHByb2JhYmx5IGNoYW5nZSB0aGlzIHByb3AgbmFtZSB0byAic2VydmVyIiAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBBUkdfSVAsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiaXAiLCAiaXAiLCAiSVAgYWRkcmVzcyBvciBob3N0bmFtZSIsIERFRkFVTFRfSVAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19QT1JULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInBvcnQiLCAicG9ydCIsICJwb3J0IiwgMSwgR19NQVhVU0hPUlQsIERFRkFVTFRfUE9SVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBBUkdfUEFTU1dPUkQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgicGFzc3dvcmQiLCAicGFzc3dvcmQiLCAicGFzc3dvcmQiLCBERUZBVUxUX1BBU1NXT1JELAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19VU0VSTkFNRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJ1c2VybmFtZSIsICJ1c2VybmFtZSIsICJ1c2VybmFtZSIsIERFRkFVTFRfVVNFUk5BTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyogbWV0YWRhdGEgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX1BVQkxJQywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgicHVibGljIiwgInB1YmxpYyIsCisgICAgICAgICAgIklmIHRoZSBzdHJlYW0gc2hvdWxkIGJlIGxpc3RlZCBvbiB0aGUgc2VydmVyJ3Mgc3RyZWFtIGRpcmVjdG9yeSIsCisgICAgICAgICAgREVGQVVMVF9QVUJMSUMsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19TVFJFQU1OQU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInN0cmVhbW5hbWUiLCAic3RyZWFtbmFtZSIsICJuYW1lIG9mIHRoZSBzdHJlYW0iLAorICAgICAgICAgIERFRkFVTFRfU1RSRUFNTkFNRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX0RFU0NSSVBUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRlc2NyaXB0aW9uIiwgImRlc2NyaXB0aW9uIiwgImRlc2NyaXB0aW9uIiwKKyAgICAgICAgICBERUZBVUxUX0RFU0NSSVBUSU9OLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBBUkdfR0VOUkUsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZ2VucmUiLCAiZ2VucmUiLCAiZ2VucmUiLCBERUZBVUxUX0dFTlJFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19QUk9UT0NPTCwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgicHJvdG9jb2wiLCAicHJvdG9jb2wiLCAiQ29ubmVjdGlvbiBQcm90b2NvbCB0byB1c2UiLAorICAgICAgICAgIEdTVF9UWVBFX1NIT1VUX1BST1RPQ09MLCBERUZBVUxUX1BST1RPQ09MLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisKKyAgLyogaWNlY2FzdCBvbmx5ICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19NT1VOVCwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJtb3VudCIsICJtb3VudCIsICJtb3VudCIsIERFRkFVTFRfTU9VTlQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX1VSTCwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJ1cmwiLCAidXJsIiwgInRoZSBzdHJlYW0ncyBob21lcGFnZSBVUkwiLAorICAgICAgICAgIERFRkFVTFRfVVJMLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBBUkdfVElNRU9VVCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgidGltZW91dCIsICJ0aW1lb3V0IiwKKyAgICAgICAgICAiTWF4IGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgZm9yIG5ldHdvcmsgYWN0aXZpdHksIGluIG1pbGxpc2Vjb25kcyIsCisgICAgICAgICAgMSwgR19NQVhVSU5ULCBERUZBVUxUX1RJTUVPVVQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyogc2lnbmFscyAqLworICBnc3Rfc2hvdXQyc2VuZF9zaWduYWxzW1NJR05BTF9DT05ORUNUSU9OX1BST0JMRU1dID0KKyAgICAgIGdfc2lnbmFsX25ldyAoImNvbm5lY3Rpb24tcHJvYmxlbSIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fQ0xFQU5VUCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RTaG91dDJzZW5kQ2xhc3MsCisgICAgICAgICAgY29ubmVjdGlvbl9wcm9ibGVtKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX0lOVCwKKyAgICAgIEdfVFlQRV9OT05FLCAxLCBHX1RZUEVfSU5UKTsKKworICBnc3RiYXNlc2lua19jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Nob3V0MnNlbmRfc3RhcnQpOworICBnc3RiYXNlc2lua19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2hvdXQyc2VuZF9zdG9wKTsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnVubG9jayA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2hvdXQyc2VuZF91bmxvY2spOworICBnc3RiYXNlc2lua19jbGFzcy0+dW5sb2NrX3N0b3AgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zaG91dDJzZW5kX3VubG9ja19zdG9wKTsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnJlbmRlciA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2hvdXQyc2VuZF9yZW5kZXIpOworICBnc3RiYXNlc2lua19jbGFzcy0+ZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Nob3V0MnNlbmRfZXZlbnQpOworICBnc3RiYXNlc2lua19jbGFzcy0+c2V0X2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Nob3V0MnNlbmRfc2V0Y2Fwcyk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIkljZWNhc3QgbmV0d29yayBzaW5rIiwKKyAgICAgICJTaW5rL05ldHdvcmsiLCAiU2VuZHMgZGF0YSB0byBhbiBpY2VjYXN0IHNlcnZlciIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNoZWxsby5iZT4sICIKKyAgICAgICJQZWRybyBDb3J0ZS1SZWFsIDx0eXBvQG5ldGNhYm8ucHQ+LCAiCisgICAgICAiWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHNob3V0Ml9kZWJ1ZywgInNob3V0MiIsIDAsICJzaG91dDJzZW5kIGVsZW1lbnQiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zaG91dDJzZW5kX2luaXQgKEdzdFNob3V0MnNlbmQgKiBzaG91dDJzZW5kKQoreworICBnc3RfYmFzZV9zaW5rX3NldF9zeW5jIChHU1RfQkFTRV9TSU5LIChzaG91dDJzZW5kKSwgRkFMU0UpOworCisgIHNob3V0MnNlbmQtPnRpbWVyID0gZ3N0X3BvbGxfbmV3IChUUlVFKTsKKworICBzaG91dDJzZW5kLT5pcCA9IGdfc3RyZHVwIChERUZBVUxUX0lQKTsKKyAgc2hvdXQyc2VuZC0+cG9ydCA9IERFRkFVTFRfUE9SVDsKKyAgc2hvdXQyc2VuZC0+cGFzc3dvcmQgPSBnX3N0cmR1cCAoREVGQVVMVF9QQVNTV09SRCk7CisgIHNob3V0MnNlbmQtPnVzZXJuYW1lID0gZ19zdHJkdXAgKERFRkFVTFRfVVNFUk5BTUUpOworICBzaG91dDJzZW5kLT5zdHJlYW1uYW1lID0gZ19zdHJkdXAgKERFRkFVTFRfU1RSRUFNTkFNRSk7CisgIHNob3V0MnNlbmQtPmRlc2NyaXB0aW9uID0gZ19zdHJkdXAgKERFRkFVTFRfREVTQ1JJUFRJT04pOworICBzaG91dDJzZW5kLT5nZW5yZSA9IGdfc3RyZHVwIChERUZBVUxUX0dFTlJFKTsKKyAgc2hvdXQyc2VuZC0+bW91bnQgPSBnX3N0cmR1cCAoREVGQVVMVF9NT1VOVCk7CisgIHNob3V0MnNlbmQtPnVybCA9IGdfc3RyZHVwIChERUZBVUxUX1VSTCk7CisgIHNob3V0MnNlbmQtPnByb3RvY29sID0gREVGQVVMVF9QUk9UT0NPTDsKKyAgc2hvdXQyc2VuZC0+aXNwdWJsaWMgPSBERUZBVUxUX1BVQkxJQzsKKyAgc2hvdXQyc2VuZC0+dGltZW91dCA9IERFRkFVTFRfVElNRU9VVDsKKworICBzaG91dDJzZW5kLT5mb3JtYXQgPSAtMTsKKyAgc2hvdXQyc2VuZC0+dGFncyA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIHNob3V0MnNlbmQtPmNvbm4gPSBOVUxMOworICBzaG91dDJzZW5kLT5jb25uZWN0ZWQgPSBGQUxTRTsKKyAgc2hvdXQyc2VuZC0+c29uZ21ldGFkYXRhID0gTlVMTDsKKyAgc2hvdXQyc2VuZC0+c29uZ2FydGlzdCA9IE5VTEw7CisgIHNob3V0MnNlbmQtPnNvbmd0aXRsZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc2hvdXQyc2VuZF9maW5hbGl6ZSAoR3N0U2hvdXQyc2VuZCAqIHNob3V0MnNlbmQpCit7CisgIGdfZnJlZSAoc2hvdXQyc2VuZC0+aXApOworICBnX2ZyZWUgKHNob3V0MnNlbmQtPnBhc3N3b3JkKTsKKyAgZ19mcmVlIChzaG91dDJzZW5kLT51c2VybmFtZSk7CisgIGdfZnJlZSAoc2hvdXQyc2VuZC0+c3RyZWFtbmFtZSk7CisgIGdfZnJlZSAoc2hvdXQyc2VuZC0+ZGVzY3JpcHRpb24pOworICBnX2ZyZWUgKHNob3V0MnNlbmQtPmdlbnJlKTsKKyAgZ19mcmVlIChzaG91dDJzZW5kLT5tb3VudCk7CisgIGdfZnJlZSAoc2hvdXQyc2VuZC0+dXJsKTsKKworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHNob3V0MnNlbmQtPnRhZ3MpOworCisgIGdzdF9wb2xsX2ZyZWUgKHNob3V0MnNlbmQtPnRpbWVyKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKChHT2JqZWN0ICopIChzaG91dDJzZW5kKSk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfc2hvdXRfbWV0YWRhdGEgKGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LCBjb25zdCBnY2hhciAqIHRhZywKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFNob3V0MnNlbmQgKnNob3V0MnNlbmQgPSAoR3N0U2hvdXQyc2VuZCAqKSB1c2VyX2RhdGE7CisgIGNoYXIgKipzaG91dF9tZXRhZGF0YSA9ICYoc2hvdXQyc2VuZC0+c29uZ21ldGFkYXRhKTsKKyAgY2hhciAqKnNvbmdfYXJ0aXN0ID0gJihzaG91dDJzZW5kLT5zb25nYXJ0aXN0KTsKKyAgY2hhciAqKnNvbmdfdGl0bGUgPSAmKHNob3V0MnNlbmQtPnNvbmd0aXRsZSk7CisKKyAgZ2NoYXIgKnZhbHVlOworCisgIEdTVF9ERUJVRyAoInRhZzogJXMgYmVpbmcgYWRkZWQiLCB0YWcpOworICBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfQVJUSVNUKSA9PSAwKSB7CisgICAgaWYgKGdzdF90YWdfZ2V0X3R5cGUgKHRhZykgPT0gR19UWVBFX1NUUklORykgeworICAgICAgaWYgKCFnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAobGlzdCwgdGFnLCAmdmFsdWUpKSB7CisgICAgICAgIEdTVF9ERUJVRyAoIkVycm9yIHJlYWRpbmcgXCIlc1wiIHRhZyB2YWx1ZSIsIHRhZyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKCpzb25nX2FydGlzdCAhPSBOVUxMKQorICAgICAgICBnX2ZyZWUgKCpzb25nX2FydGlzdCk7CisKKyAgICAgICpzb25nX2FydGlzdCA9IGdfc3RyZHVwICh2YWx1ZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX1RJVExFKSA9PSAwKSB7CisgICAgaWYgKGdzdF90YWdfZ2V0X3R5cGUgKHRhZykgPT0gR19UWVBFX1NUUklORykgeworICAgICAgaWYgKCFnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAobGlzdCwgdGFnLCAmdmFsdWUpKSB7CisgICAgICAgIEdTVF9ERUJVRyAoIkVycm9yIHJlYWRpbmcgXCIlc1wiIHRhZyB2YWx1ZSIsIHRhZyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKCpzb25nX3RpdGxlICE9IE5VTEwpCisgICAgICAgIGdfZnJlZSAoKnNvbmdfdGl0bGUpOworCisgICAgICAqc29uZ190aXRsZSA9IGdfc3RyZHVwICh2YWx1ZSk7CisgICAgfQorICB9CisKKyAgaWYgKCpzaG91dF9tZXRhZGF0YSAhPSBOVUxMKQorICAgIGdfZnJlZSAoKnNob3V0X21ldGFkYXRhKTsKKworCisgIGlmICgqc29uZ190aXRsZSAmJiAqc29uZ19hcnRpc3QpIHsKKyAgICAqc2hvdXRfbWV0YWRhdGEgPSBnX3N0cmR1cF9wcmludGYgKCIlcyAtICVzIiwgKnNvbmdfYXJ0aXN0LCAqc29uZ190aXRsZSk7CisgIH0gZWxzZSBpZiAoKnNvbmdfdGl0bGUgJiYgKnNvbmdfYXJ0aXN0ID09IE5VTEwpIHsKKyAgICAqc2hvdXRfbWV0YWRhdGEgPSBnX3N0cmR1cF9wcmludGYgKCJVbmtub3duIC0gJXMiLCAqc29uZ190aXRsZSk7CisgIH0gZWxzZSBpZiAoKnNvbmdfdGl0bGUgPT0gTlVMTCAmJiAqc29uZ19hcnRpc3QpIHsKKyAgICAqc2hvdXRfbWV0YWRhdGEgPSBnX3N0cmR1cF9wcmludGYgKCIlcyAtIFVua25vd24iLCAqc29uZ19hcnRpc3QpOworICB9IGVsc2UgeworICAgICpzaG91dF9tZXRhZGF0YSA9IGdfc3RyZHVwX3ByaW50ZiAoIlVua25vd24gLSBVbmtub3duIik7CisgIH0KKworICBHU1RfTE9HICgic2hvdXQgbWV0YWRhdGEgaXMgbm93OiAlcyIsICpzaG91dF9tZXRhZGF0YSk7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorZ3N0X3Nob3V0MnNlbmRfc2V0X21ldGFkYXRhIChHc3RTaG91dDJzZW5kICogc2hvdXQyc2VuZCkKK3sKKyAgY29uc3QgR3N0VGFnTGlzdCAqdXNlcl90YWdzOworICBHc3RUYWdMaXN0ICpjb3B5OworICBjaGFyICp0ZW1wbWV0YWRhdGE7CisgIHNob3V0X21ldGFkYXRhX3QgKnBtZXRhZGF0YTsKKworICBnX3JldHVybl9pZl9mYWlsIChzaG91dDJzZW5kICE9IE5VTEwpOworICB1c2VyX3RhZ3MgPSBnc3RfdGFnX3NldHRlcl9nZXRfdGFnX2xpc3QgKEdTVF9UQUdfU0VUVEVSIChzaG91dDJzZW5kKSk7CisgIGlmICgoc2hvdXQyc2VuZC0+dGFncyA9PSBOVUxMKSAmJiAodXNlcl90YWdzID09IE5VTEwpKSB7CisgICAgcmV0dXJuOworICB9CisgIGNvcHkgPSBnc3RfdGFnX2xpc3RfbWVyZ2UgKHVzZXJfdGFncywgc2hvdXQyc2VuZC0+dGFncywKKyAgICAgIGdzdF90YWdfc2V0dGVyX2dldF90YWdfbWVyZ2VfbW9kZSAoR1NUX1RBR19TRVRURVIgKHNob3V0MnNlbmQpKSk7CisgIC8qIGxldHMgZ2V0IHRoZSBhcnRpc3QgYW5kIHNvbmcgdGFncyAqLworICB0ZW1wbWV0YWRhdGEgPSBOVUxMOworICBnc3RfdGFnX2xpc3RfZm9yZWFjaCAoKEdzdFRhZ0xpc3QgKikgY29weSwgc2V0X3Nob3V0X21ldGFkYXRhLAorICAgICAgKGdwb2ludGVyKSAmIHRlbXBtZXRhZGF0YSk7CisgIGlmICh0ZW1wbWV0YWRhdGEpIHsKKyAgICBwbWV0YWRhdGEgPSBzaG91dF9tZXRhZGF0YV9uZXcgKCk7CisgICAgc2hvdXRfbWV0YWRhdGFfYWRkIChwbWV0YWRhdGEsICJzb25nIiwgdGVtcG1ldGFkYXRhKTsKKyAgICBzaG91dF9zZXRfbWV0YWRhdGEgKHNob3V0MnNlbmQtPmNvbm4sIHBtZXRhZGF0YSk7CisgICAgc2hvdXRfbWV0YWRhdGFfZnJlZSAocG1ldGFkYXRhKTsKKyAgfQorCisgIGdzdF90YWdfbGlzdF91bnJlZiAoY29weSk7Cit9CisjZW5kaWYKKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zaG91dDJzZW5kX2V2ZW50IChHc3RCYXNlU2luayAqIHNpbmssIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFNob3V0MnNlbmQgKnNob3V0MnNlbmQ7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgc2hvdXQyc2VuZCA9IEdTVF9TSE9VVDJTRU5EIChzaW5rKTsKKworICBHU1RfTE9HX09CSkVDVCAoc2hvdXQyc2VuZCwgImdvdCAlcyBldmVudCIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfVEFHOnsKKyAgICAgIC8qIHZvcmJpcyBhdWRpbyBkb2Vzbid0IG5lZWQgbWV0YWRhdGEgc2V0dGluZyBvbiB0aGUgaWNlY2FzdCBsZXZlbCwgb25seSBtcDMgKi8KKyAgICAgIGlmIChzaG91dDJzZW5kLT50YWdzICYmIHNob3V0MnNlbmQtPmZvcm1hdCA9PSBTSE9VVF9GT1JNQVRfTVAzKSB7CisgICAgICAgIEdzdFRhZ0xpc3QgKmxpc3Q7CisKKyAgICAgICAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAoZXZlbnQsICZsaXN0KTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2hvdXQyc2VuZCwgInRhZ3M9JSIgR1NUX1BUUl9GT1JNQVQsIGxpc3QpOworICAgICAgICBnc3RfdGFnX2xpc3RfaW5zZXJ0IChzaG91dDJzZW5kLT50YWdzLAorICAgICAgICAgICAgbGlzdCwKKyAgICAgICAgICAgIGdzdF90YWdfc2V0dGVyX2dldF90YWdfbWVyZ2VfbW9kZSAoR1NUX1RBR19TRVRURVIgKHNob3V0MnNlbmQpKSk7CisgICAgICAgIC8qIGxldHMgZ2V0IHRoZSBhcnRpc3QgYW5kIHNvbmcgdGFncyAqLworICAgICAgICBnc3RfdGFnX2xpc3RfZm9yZWFjaCAoKEdzdFRhZ0xpc3QgKikgbGlzdCwKKyAgICAgICAgICAgIHNldF9zaG91dF9tZXRhZGF0YSwgc2hvdXQyc2VuZCk7CisgICAgICAgIGlmIChzaG91dDJzZW5kLT5zb25nbWV0YWRhdGEgJiYgc2hvdXQyc2VuZC0+Y29ubmVjdGVkKSB7CisgICAgICAgICAgc2hvdXRfbWV0YWRhdGFfdCAqcG1ldGFkYXRhOworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2hvdXQyc2VuZCwgIm1ldGFkYXRhIG5vdzogJXMiLAorICAgICAgICAgICAgICBzaG91dDJzZW5kLT5zb25nbWV0YWRhdGEpOworCisgICAgICAgICAgcG1ldGFkYXRhID0gc2hvdXRfbWV0YWRhdGFfbmV3ICgpOworICAgICAgICAgIHNob3V0X21ldGFkYXRhX2FkZCAocG1ldGFkYXRhLCAic29uZyIsIHNob3V0MnNlbmQtPnNvbmdtZXRhZGF0YSk7CisgICAgICAgICAgc2hvdXRfc2V0X21ldGFkYXRhIChzaG91dDJzZW5kLT5jb25uLCBwbWV0YWRhdGEpOworICAgICAgICAgIHNob3V0X21ldGFkYXRhX2ZyZWUgKHBtZXRhZGF0YSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OnsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzaG91dDJzZW5kLCAibGV0IGJhc2UgY2xhc3MgaGFuZGxlIGV2ZW50Iik7CisgICAgICBpZiAoR1NUX0JBU0VfU0lOS19DTEFTUyAocGFyZW50X2NsYXNzKS0+ZXZlbnQpIHsKKyAgICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfcmVmIChldmVudCk7CisgICAgICAgIHJldCA9IEdTVF9CQVNFX1NJTktfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmV2ZW50IChzaW5rLCBldmVudCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zaG91dDJzZW5kX3N0YXJ0IChHc3RCYXNlU2luayAqIGJhc2VzaW5rKQoreworICBHc3RTaG91dDJzZW5kICpzaW5rID0gR1NUX1NIT1VUMlNFTkQgKGJhc2VzaW5rKTsKKyAgY29uc3QgZ2NoYXIgKmN1cl9wcm9wOworICBnc2hvcnQgcHJvdG8gPSAzOworICBnY2hhciAqdmVyc2lvbl9zdHJpbmc7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgInN0YXJ0aW5nIik7CisKKyAgc2luay0+Y29ubiA9IHNob3V0X25ldyAoKTsKKworICBzd2l0Y2ggKHNpbmstPnByb3RvY29sKSB7CisgICAgY2FzZSBTSE9VVDJTRU5EX1BST1RPQ09MX1hBVURJT0NBU1Q6CisgICAgICBwcm90byA9IFNIT1VUX1BST1RPQ09MX1hBVURJT0NBU1Q7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNIT1VUMlNFTkRfUFJPVE9DT0xfSUNZOgorICAgICAgcHJvdG8gPSBTSE9VVF9QUk9UT0NPTF9JQ1k7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNIT1VUMlNFTkRfUFJPVE9DT0xfSFRUUDoKKyAgICAgIHByb3RvID0gU0hPVVRfUFJPVE9DT0xfSFRUUDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgY3VyX3Byb3AgPSAicHJvdG9jb2wiOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyBwcm90b2NvbDogJWQiLCBzaW5rLT5wcm90b2NvbCk7CisgIGlmIChzaG91dF9zZXRfcHJvdG9jb2wgKHNpbmstPmNvbm4sIHByb3RvKSAhPSBTSE9VVEVSUl9TVUNDRVNTKQorICAgIGdvdG8gc2V0X2ZhaWxlZDsKKworICBjdXJfcHJvcCA9ICJpcCI7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJzZXR0aW5nIElQL2hvc3RuYW1lOiAlcyIsIHNpbmstPmlwKTsKKyAgaWYgKHNob3V0X3NldF9ob3N0IChzaW5rLT5jb25uLCBzaW5rLT5pcCkgIT0gU0hPVVRFUlJfU1VDQ0VTUykKKyAgICBnb3RvIHNldF9mYWlsZWQ7CisKKyAgY3VyX3Byb3AgPSAicG9ydCI7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJzZXR0aW5nIHBvcnQ6ICV1Iiwgc2luay0+cG9ydCk7CisgIGlmIChzaG91dF9zZXRfcG9ydCAoc2luay0+Y29ubiwgc2luay0+cG9ydCkgIT0gU0hPVVRFUlJfU1VDQ0VTUykKKyAgICBnb3RvIHNldF9mYWlsZWQ7CisKKyAgY3VyX3Byb3AgPSAicGFzc3dvcmQiOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyBwYXNzd29yZDogJXMiLCBzaW5rLT5wYXNzd29yZCk7CisgIGlmIChzaG91dF9zZXRfcGFzc3dvcmQgKHNpbmstPmNvbm4sIHNpbmstPnBhc3N3b3JkKSAhPSBTSE9VVEVSUl9TVUNDRVNTKQorICAgIGdvdG8gc2V0X2ZhaWxlZDsKKworICBjdXJfcHJvcCA9ICJwdWJsaWMiOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyAlczogJXUiLCBjdXJfcHJvcCwgc2luay0+aXNwdWJsaWMpOworICBpZiAoc2hvdXRfc2V0X3B1YmxpYyAoc2luay0+Y29ubiwKKyAgICAgICAgICAoc2luay0+aXNwdWJsaWMgPyAxIDogMCkpICE9IFNIT1VURVJSX1NVQ0NFU1MpCisgICAgZ290byBzZXRfZmFpbGVkOworCisgIGN1cl9wcm9wID0gInN0cmVhbW5hbWUiOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyAlczogJXMiLCBjdXJfcHJvcCwgc2luay0+c3RyZWFtbmFtZSk7CisgIGlmIChzaG91dF9zZXRfbmFtZSAoc2luay0+Y29ubiwgc2luay0+c3RyZWFtbmFtZSkgIT0gU0hPVVRFUlJfU1VDQ0VTUykKKyAgICBnb3RvIHNldF9mYWlsZWQ7CisKKyAgY3VyX3Byb3AgPSAiZGVzY3JpcHRpb24iOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyAlczogJXMiLCBjdXJfcHJvcCwgc2luay0+ZGVzY3JpcHRpb24pOworICBpZiAoc2hvdXRfc2V0X2Rlc2NyaXB0aW9uIChzaW5rLT5jb25uLCBzaW5rLT5kZXNjcmlwdGlvbikgIT0gU0hPVVRFUlJfU1VDQ0VTUykKKyAgICBnb3RvIHNldF9mYWlsZWQ7CisKKyAgY3VyX3Byb3AgPSAiZ2VucmUiOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyAlczogJXMiLCBjdXJfcHJvcCwgc2luay0+Z2VucmUpOworICBpZiAoc2hvdXRfc2V0X2dlbnJlIChzaW5rLT5jb25uLCBzaW5rLT5nZW5yZSkgIT0gU0hPVVRFUlJfU1VDQ0VTUykKKyAgICBnb3RvIHNldF9mYWlsZWQ7CisKKyAgY3VyX3Byb3AgPSAibW91bnQiOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyAlczogJXMiLCBjdXJfcHJvcCwgc2luay0+bW91bnQpOworICBpZiAoc2hvdXRfc2V0X21vdW50IChzaW5rLT5jb25uLCBzaW5rLT5tb3VudCkgIT0gU0hPVVRFUlJfU1VDQ0VTUykKKyAgICBnb3RvIHNldF9mYWlsZWQ7CisKKyAgY3VyX3Byb3AgPSAidXNlcm5hbWUiOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyAlczogJXMiLCBjdXJfcHJvcCwgc2luay0+dXNlcm5hbWUpOworICBpZiAoc2hvdXRfc2V0X3VzZXIgKHNpbmstPmNvbm4sIHNpbmstPnVzZXJuYW1lKSAhPSBTSE9VVEVSUl9TVUNDRVNTKQorICAgIGdvdG8gc2V0X2ZhaWxlZDsKKworICB2ZXJzaW9uX3N0cmluZyA9IGdzdF92ZXJzaW9uX3N0cmluZyAoKTsKKyAgY3VyX3Byb3AgPSAiYWdlbnQiOworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyAlczogJXMiLCBjdXJfcHJvcCwgdmVyc2lvbl9zdHJpbmcpOworICBpZiAoc2hvdXRfc2V0X2FnZW50IChzaW5rLT5jb25uLCB2ZXJzaW9uX3N0cmluZykgIT0gU0hPVVRFUlJfU1VDQ0VTUykgeworICAgIGdfZnJlZSAodmVyc2lvbl9zdHJpbmcpOworICAgIGdvdG8gc2V0X2ZhaWxlZDsKKyAgfQorCisgIGdfZnJlZSAodmVyc2lvbl9zdHJpbmcpOworICByZXR1cm4gVFJVRTsKKworLyogRVJST1IgKi8KK3NldF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2luaywgTElCUkFSWSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJFcnJvciBzZXR0aW5nICVzOiAlcyIsIGN1cl9wcm9wLCBzaG91dF9nZXRfZXJyb3IgKHNpbmstPmNvbm4pKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfc2hvdXQyc2VuZF9jb25uZWN0IChHc3RTaG91dDJzZW5kICogc2luaykKK3sKKyAgR3N0Rmxvd1JldHVybiBmcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGdpbnQgcmV0OworICBHc3RDbG9ja1RpbWUgc3RhcnRfdHM7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgIkNvbm5lY3Rpb24gZm9ybWF0IGlzOiAlZCIsIHNpbmstPmZvcm1hdCk7CisKKyAgaWYgKHNpbmstPmZvcm1hdCA9PSAtMSkKKyAgICBnb3RvIG5vX2NhcHM7CisKKyAgaWYgKHNob3V0X3NldF9ub25ibG9ja2luZyAoc2luay0+Y29ubiwgMSkgIT0gU0hPVVRFUlJfU1VDQ0VTUykKKyAgICBnb3RvIGNvdWxkX25vdF9zZXRfbm9uYmxvY2tpbmc7CisKKyAgaWYgKHNob3V0X3NldF9mb3JtYXQgKHNpbmstPmNvbm4sIHNpbmstPmZvcm1hdCkgIT0gU0hPVVRFUlJfU1VDQ0VTUykKKyAgICBnb3RvIGNvdWxkX25vdF9zZXRfZm9ybWF0OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJjb25uZWN0aW5nIik7CisKKyAgc3RhcnRfdHMgPSBnc3RfdXRpbF9nZXRfdGltZXN0YW1wICgpOworICByZXQgPSBzaG91dF9vcGVuIChzaW5rLT5jb25uKTsKKworICAvKiB3YWl0IGZvciBjb25uZWN0aW9uIG9yIHRpbWVvdXQgKi8KKyAgd2hpbGUgKHJldCA9PSBTSE9VVEVSUl9CVVNZKSB7CisgICAgaWYgKGdzdF91dGlsX2dldF90aW1lc3RhbXAgKCkgLSBzdGFydF90cyA+IHNpbmstPnRpbWVvdXQgKiBHU1RfTVNFQ09ORCkgeworICAgICAgZ290byBjb25uZWN0aW9uX3RpbWVvdXQ7CisgICAgfQorICAgIGlmIChnc3RfcG9sbF93YWl0IChzaW5rLT50aW1lciwgMTAgKiBHU1RfTVNFQ09ORCkgPT0gLTEpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzaW5rLCAidW5sb2NrZWQiKTsKKworICAgICAgZnJldCA9IGdzdF9iYXNlX3Npbmtfd2FpdF9wcmVyb2xsIChHU1RfQkFTRV9TSU5LIChzaW5rKSk7CisgICAgICBpZiAoZnJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICByZXQgPSBzaG91dF9nZXRfY29ubmVjdGVkIChzaW5rLT5jb25uKTsKKyAgfQorCisgIGlmIChyZXQgIT0gU0hPVVRFUlJfQ09OTkVDVEVEICYmIHJldCAhPSBTSE9VVEVSUl9TVUNDRVNTKQorICAgIGdvdG8gY291bGRfbm90X2Nvbm5lY3Q7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgImNvbm5lY3RlZCB0byBzZXJ2ZXIiKTsKKyAgc2luay0+Y29ubmVjdGVkID0gVFJVRTsKKworICAvKiBpbml0aWFsaXplIHNlbmRpbmcgcmF0ZSBtb25pdG9yaW5nICovCisgIHNpbmstPnByZXZfcXVldWVsZW4gPSAwOworICBzaW5rLT5kYXRhX3NlbnQgPSAwOworICBzaW5rLT5zdGFsbGVkID0gVFJVRTsKKyAgc2luay0+ZGF0YXNlbnRfcmVzZXRfdHMgPSBzaW5rLT5zdGFsbGVkX3RzID0gZ3N0X3V0aWxfZ2V0X3RpbWVzdGFtcCAoKTsKKworICAvKiBsZXQncyBzZXQgbWV0YWRhdGEgKi8KKyAgaWYgKHNpbmstPnNvbmdtZXRhZGF0YSkgeworICAgIHNob3V0X21ldGFkYXRhX3QgKnBtZXRhZGF0YTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJzaG91dCBtZXRhZGF0YSBub3c6ICVzIiwgc2luay0+c29uZ21ldGFkYXRhKTsKKyAgICBwbWV0YWRhdGEgPSBzaG91dF9tZXRhZGF0YV9uZXcgKCk7CisgICAgc2hvdXRfbWV0YWRhdGFfYWRkIChwbWV0YWRhdGEsICJzb25nIiwgc2luay0+c29uZ21ldGFkYXRhKTsKKyAgICBzaG91dF9zZXRfbWV0YWRhdGEgKHNpbmstPmNvbm4sIHBtZXRhZGF0YSk7CisgICAgc2hvdXRfbWV0YWRhdGFfZnJlZSAocG1ldGFkYXRhKTsKKyAgfQorCitkb25lOgorICByZXR1cm4gZnJldDsKKworLyogRVJST1JTICovCitub19jYXBzOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNpbmssIENPUkUsIE5FR09USUFUSU9OLCAoTlVMTCksCisgICAgICAgICgiTm8gaW5wdXQgY2FwcyByZWNlaXZlZC4iKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICB9CisKK2NvdWxkX25vdF9zZXRfbm9uYmxvY2tpbmc6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2luaywgTElCUkFSWSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJFcnJvciBjb25maWd1cmluZyBsaWJzaG91dCB0byB1c2Ugbm9uLWJsb2NraW5nIGkvbzogJXMiLAorICAgICAgICAgICAgc2hvdXRfZ2V0X2Vycm9yIChzaW5rLT5jb25uKSkpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCitjb3VsZF9ub3Rfc2V0X2Zvcm1hdDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBMSUJSQVJZLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoIkVycm9yIHNldHRpbmcgY29ubmVjdGlvbiBmb3JtYXQ6ICVzIiwgc2hvdXRfZ2V0X2Vycm9yIChzaW5rLT5jb25uKSkpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCitjb3VsZF9ub3RfY29ubmVjdDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgT1BFTl9XUklURSwKKyAgICAgICAgKF8oIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIpKSwKKyAgICAgICAgKCJzaG91dF9vcGVuKCkgZmFpbGVkOiBlcnI9JXMiLCBzaG91dF9nZXRfZXJyb3IgKHNpbmstPmNvbm4pKSk7CisgICAgZ19zaWduYWxfZW1pdCAoc2luaywgZ3N0X3Nob3V0MnNlbmRfc2lnbmFsc1tTSUdOQUxfQ09OTkVDVElPTl9QUk9CTEVNXSwgMCwKKyAgICAgICAgc2hvdXRfZ2V0X2Vycm5vIChzaW5rLT5jb25uKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKK2Nvbm5lY3Rpb25fdGltZW91dDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgT1BFTl9XUklURSwKKyAgICAgICAgKF8oIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIpKSwgKCJjb25uZWN0aW9uIHRpbWVkIG91dCIpKTsKKyAgICBnX3NpZ25hbF9lbWl0IChzaW5rLCBnc3Rfc2hvdXQyc2VuZF9zaWduYWxzW1NJR05BTF9DT05ORUNUSU9OX1BST0JMRU1dLCAwLAorICAgICAgICBzaG91dF9nZXRfZXJybm8gKHNpbmstPmNvbm4pKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2hvdXQyc2VuZF9zdG9wIChHc3RCYXNlU2luayAqIGJhc2VzaW5rKQoreworICBHc3RTaG91dDJzZW5kICpzaW5rID0gR1NUX1NIT1VUMlNFTkQgKGJhc2VzaW5rKTsKKworICBpZiAoc2luay0+Y29ubikgeworICAgIGlmIChzaW5rLT5jb25uZWN0ZWQpCisgICAgICBzaG91dF9jbG9zZSAoc2luay0+Y29ubik7CisgICAgc2hvdXRfZnJlZSAoc2luay0+Y29ubik7CisgICAgc2luay0+Y29ubiA9IE5VTEw7CisgIH0KKworICBpZiAoc2luay0+c29uZ21ldGFkYXRhKSB7CisgICAgZ19mcmVlIChzaW5rLT5zb25nbWV0YWRhdGEpOworICAgIHNpbmstPnNvbmdtZXRhZGF0YSA9IE5VTEw7CisgIH0KKworICBzaW5rLT5jb25uZWN0ZWQgPSBGQUxTRTsKKyAgc2luay0+Zm9ybWF0ID0gLTE7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Nob3V0MnNlbmRfdW5sb2NrIChHc3RCYXNlU2luayAqIGJhc2VzaW5rKQoreworICBHc3RTaG91dDJzZW5kICpzaW5rOworCisgIHNpbmsgPSBHU1RfU0hPVVQyU0VORCAoYmFzZXNpbmspOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VzaW5rLCAidW5sb2NrIik7CisgIGdzdF9wb2xsX3NldF9mbHVzaGluZyAoc2luay0+dGltZXIsIFRSVUUpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zaG91dDJzZW5kX3VubG9ja19zdG9wIChHc3RCYXNlU2luayAqIGJhc2VzaW5rKQoreworICBHc3RTaG91dDJzZW5kICpzaW5rOworCisgIHNpbmsgPSBHU1RfU0hPVVQyU0VORCAoYmFzZXNpbmspOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VzaW5rLCAidW5sb2NrX3N0b3AiKTsKKyAgZ3N0X3BvbGxfc2V0X2ZsdXNoaW5nIChzaW5rLT50aW1lciwgRkFMU0UpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3Nob3V0MnNlbmRfcmVuZGVyIChHc3RCYXNlU2luayAqIGJhc2VzaW5rLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFNob3V0MnNlbmQgKnNpbms7CisgIGdsb25nIHJldDsKKyAgZ2ludCBkZWxheTsKKyAgR3N0Rmxvd1JldHVybiBmcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdE1hcEluZm8gbWFwOworICBHc3RDbG9ja1RpbWUgbm93OworICBzc2l6ZV90IHF1ZXVlbGVuOworCisgIHNpbmsgPSBHU1RfU0hPVVQyU0VORCAoYmFzZXNpbmspOworCisgIC8qIHdlIGNvbm5lY3QgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdG8ga25vdyB0aGUgZm9ybWF0IGJlZm9yZSB3ZSBjYW4gc2V0IHVwCisgICAqIHRoZSBjb25uZWN0aW9uLCB3aGljaCB3ZSBkb24ndCBrbm93IHlldCBpbiBfc3RhcnQoKSwgYW5kIGFsc28gYmVjYXVzZSB3ZQorICAgKiBkb24ndCB3YW50IHRvIGJsb2NrIHRoZSBhcHBsaWNhdGlvbiB0aHJlYWQgKi8KKyAgaWYgKCFzaW5rLT5jb25uZWN0ZWQpIHsKKyAgICBmcmV0ID0gZ3N0X3Nob3V0MnNlbmRfY29ubmVjdCAoc2luayk7CisgICAgaWYgKGZyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIGRvbmU7CisgIH0KKworICBkZWxheSA9IHNob3V0X2RlbGF5IChzaW5rLT5jb25uKTsKKworICBpZiAoZGVsYXkgPiAwKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNpbmssICJ3YWl0aW5nICVkIG1zZWMiLCBkZWxheSk7CisgICAgaWYgKGdzdF9wb2xsX3dhaXQgKHNpbmstPnRpbWVyLCBHU1RfTVNFQ09ORCAqIGRlbGF5KSA9PSAtMSkgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNpbmssICJ1bmxvY2tlZCIpOworCisgICAgICBmcmV0ID0gZ3N0X2Jhc2Vfc2lua193YWl0X3ByZXJvbGwgKGJhc2VzaW5rKTsKKyAgICAgIGlmIChmcmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9MT0dfT0JKRUNUIChzaW5rLCAid2UncmUgJWQgbXNlYyBsYXRlIiwgLWRlbGF5KTsKKyAgfQorCisgIC8qIGFjY3VtdWxhdGUgaG93IG11Y2ggZGF0YSBoYXZlIGFjdHVhbGx5IGJlZW4gc2VudAorICAgKiB0byB0aGUgbmV0d29yayBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIHNob3V0X3NlbmQoKSAqLworICBxdWV1ZWxlbiA9IHNob3V0X3F1ZXVlbGVuIChzaW5rLT5jb25uKTsKKyAgaWYgKHNpbmstPnByZXZfcXVldWVsZW4gPiAwKQorICAgIHNpbmstPmRhdGFfc2VudCArPSBzaW5rLT5wcmV2X3F1ZXVlbGVuIC0gcXVldWVsZW47CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICAvKiBhZGQgbWFwLnNpemUgaW5zdGVhZCBvZiByZS1yZWFkaW5nIHRoZSBxdWV1ZSBsZW5ndGggYmVjYXVzZQorICAgKiB0aGUgZGF0YSBtYXkgYWN0dWFsbHkgYmUgc2VudCBpbW1lZGlhdGVseSAqLworICBzaW5rLT5wcmV2X3F1ZXVlbGVuID0gcXVldWVsZW4gKyBtYXAuc2l6ZTsKKworICBHU1RfTE9HX09CSkVDVCAoc2luaywgInNlbmRpbmcgJXUgYnl0ZXMgb2YgZGF0YSwgcXVldWUgbGVuZ3RoIG5vdyBpcyAlIgorICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgKGd1aW50KSBtYXAuc2l6ZSwgc2luay0+cHJldl9xdWV1ZWxlbik7CisKKyAgcmV0ID0gc2hvdXRfc2VuZCAoc2luay0+Y29ubiwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBpZiAocmV0ICE9IFNIT1VURVJSX1NVQ0NFU1MpCisgICAgZ290byBzZW5kX2Vycm9yOworCisgIG5vdyA9IGdzdF91dGlsX2dldF90aW1lc3RhbXAgKCk7CisgIGlmIChub3cgLSBzaW5rLT5kYXRhc2VudF9yZXNldF90cyA+PSA1MDAgKiBHU1RfTVNFQ09ORCkgeworICAgIGd1aW50NjQgc2VuZF9yYXRlOworCisgICAgc2VuZF9yYXRlID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzaW5rLT5kYXRhX3NlbnQsIEdTVF9TRUNPTkQsCisgICAgICAgIG5vdyAtIHNpbmstPmRhdGFzZW50X3Jlc2V0X3RzKTsKKworICAgIGlmIChzZW5kX3JhdGUgPT0gMCAmJiAhc2luay0+c3RhbGxlZCkgeworICAgICAgc2luay0+c3RhbGxlZCA9IFRSVUU7CisgICAgICBzaW5rLT5zdGFsbGVkX3RzID0gbm93OworICAgIH0gZWxzZSBpZiAoc2VuZF9yYXRlID4gMCAmJiBzaW5rLT5zdGFsbGVkKSB7CisgICAgICBzaW5rLT5zdGFsbGVkID0gRkFMU0U7CisgICAgfQorCisgICAgc2luay0+ZGF0YV9zZW50ID0gMDsKKyAgICBzaW5rLT5kYXRhc2VudF9yZXNldF90cyA9IG5vdzsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJzZW5kaW5nIHJhdGUgaXMgJSIgR19HVUlOVDY0X0ZPUk1BVCAiIGJwcywgIgorICAgICAgICAic3RhbGxlZCAlZCwgc3RhbGxlZF90cyAlIiBHU1RfVElNRV9GT1JNQVQsIHNlbmRfcmF0ZSwgc2luay0+c3RhbGxlZCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoc2luay0+c3RhbGxlZF90cykpOworCisgICAgaWYgKHNpbmstPnN0YWxsZWQgJiYgbm93IC0gc2luay0+c3RhbGxlZF90cyA+PSBzaW5rLT50aW1lb3V0ICogR1NUX01TRUNPTkQpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2luaywgIm5ldHdvcmsgc2VuZCBxdWV1ZSBpcyBzdGFsbGVkIGZvciB0b28gbG9uZyIpOworICAgICAgZ290byBuZXR3b3JrX2Vycm9yOworICAgIH0KKyAgfQorCitkb25lOgorCisgIHJldHVybiBmcmV0OworCisvKiBFUlJPUlMgKi8KK3NlbmRfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2luaywgUkVTT1VSQ0UsIFdSSVRFLCAoTlVMTCksCisgICAgICAgICgic2hvdXRfc2VuZCgpIGZhaWxlZDogJXMiLCBzaG91dF9nZXRfZXJyb3IgKHNpbmstPmNvbm4pKSk7CisgICAgZ19zaWduYWxfZW1pdCAoc2luaywgZ3N0X3Nob3V0MnNlbmRfc2lnbmFsc1tTSUdOQUxfQ09OTkVDVElPTl9QUk9CTEVNXSwgMCwKKyAgICAgICAgc2hvdXRfZ2V0X2Vycm5vIChzaW5rLT5jb25uKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKK25ldHdvcmtfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2luaywgUkVTT1VSQ0UsIFdSSVRFLCAoTlVMTCksCisgICAgICAgICgibmV0d29yayB0aW1lb3V0IHJlYWNoZWQiKSk7CisgICAgZ19zaWduYWxfZW1pdCAoc2luaywgZ3N0X3Nob3V0MnNlbmRfc2lnbmFsc1tTSUdOQUxfQ09OTkVDVElPTl9QUk9CTEVNXSwgMCwKKyAgICAgICAgU0hPVVRFUlJfQlVTWSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc2hvdXQyc2VuZF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0U2hvdXQyc2VuZCAqc2hvdXQyc2VuZDsKKworICBzaG91dDJzZW5kID0gR1NUX1NIT1VUMlNFTkQgKG9iamVjdCk7CisgIHN3aXRjaCAocHJvcF9pZCkgeworCisgICAgY2FzZSBBUkdfSVA6CisgICAgICBnX2ZyZWUgKHNob3V0MnNlbmQtPmlwKTsKKyAgICAgIHNob3V0MnNlbmQtPmlwID0gZ19zdHJkdXAgKGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1BPUlQ6CisgICAgICBzaG91dDJzZW5kLT5wb3J0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19QQVNTV09SRDoKKyAgICAgIGdfZnJlZSAoc2hvdXQyc2VuZC0+cGFzc3dvcmQpOworICAgICAgc2hvdXQyc2VuZC0+cGFzc3dvcmQgPSBnX3N0cmR1cCAoZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfVVNFUk5BTUU6CisgICAgICBnX2ZyZWUgKHNob3V0MnNlbmQtPnVzZXJuYW1lKTsKKyAgICAgIHNob3V0MnNlbmQtPnVzZXJuYW1lID0gZ19zdHJkdXAgKGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1BVQkxJQzoKKyAgICAgIHNob3V0MnNlbmQtPmlzcHVibGljID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfU1RSRUFNTkFNRTogICAgICAgLyogTmFtZSBvZiB0aGUgc3RyZWFtICovCisgICAgICBnX2ZyZWUgKHNob3V0MnNlbmQtPnN0cmVhbW5hbWUpOworICAgICAgc2hvdXQyc2VuZC0+c3RyZWFtbmFtZSA9IGdfc3RyZHVwIChnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19ERVNDUklQVElPTjogICAgICAvKiBEZXNjcmlwdGlvbiBvZiB0aGUgc3RyZWFtICovCisgICAgICBnX2ZyZWUgKHNob3V0MnNlbmQtPmRlc2NyaXB0aW9uKTsKKyAgICAgIHNob3V0MnNlbmQtPmRlc2NyaXB0aW9uID0gZ19zdHJkdXAgKGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0dFTlJFOiAgICAgICAgICAgIC8qIEdlbnJlIG9mIHRoZSBzdHJlYW0gKi8KKyAgICAgIGdfZnJlZSAoc2hvdXQyc2VuZC0+Z2VucmUpOworICAgICAgc2hvdXQyc2VuZC0+Z2VucmUgPSBnX3N0cmR1cCAoZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfUFJPVE9DT0w6ICAgICAgICAgLyogcHJvdG9jb2wgdG8gY29ubmVjdCB3aXRoICovCisgICAgICBzaG91dDJzZW5kLT5wcm90b2NvbCA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX01PVU5UOiAgICAgICAgICAgIC8qIG1vdW50cG9pbnQgb2Ygc3RyZWFtIChpY2VjYXN0IG9ubHkpICovCisgICAgICBnX2ZyZWUgKHNob3V0MnNlbmQtPm1vdW50KTsKKyAgICAgIHNob3V0MnNlbmQtPm1vdW50ID0gZ19zdHJkdXAgKGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1VSTDogICAgICAgICAgICAgIC8qIHRoZSBzdHJlYW0ncyBob21lcGFnZSBVUkwgKi8KKyAgICAgIGdfZnJlZSAoc2hvdXQyc2VuZC0+dXJsKTsKKyAgICAgIHNob3V0MnNlbmQtPnVybCA9IGdfc3RyZHVwIChnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19USU1FT1VUOgorICAgICAgc2hvdXQyc2VuZC0+dGltZW91dCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9zaG91dDJzZW5kX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTaG91dDJzZW5kICpzaG91dDJzZW5kOworCisgIHNob3V0MnNlbmQgPSBHU1RfU0hPVVQyU0VORCAob2JqZWN0KTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisKKyAgICBjYXNlIEFSR19JUDoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNob3V0MnNlbmQtPmlwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1BPUlQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBzaG91dDJzZW5kLT5wb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1BBU1NXT1JEOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc2hvdXQyc2VuZC0+cGFzc3dvcmQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfVVNFUk5BTUU6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzaG91dDJzZW5kLT51c2VybmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19QVUJMSUM6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc2hvdXQyc2VuZC0+aXNwdWJsaWMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfU1RSRUFNTkFNRTogICAgICAgLyogTmFtZSBvZiB0aGUgc3RyZWFtICovCisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzaG91dDJzZW5kLT5zdHJlYW1uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0RFU0NSSVBUSU9OOiAgICAgIC8qIERlc2NyaXB0aW9uIG9mIHRoZSBzdHJlYW0gKi8KKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNob3V0MnNlbmQtPmRlc2NyaXB0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0dFTlJFOiAgICAgICAgICAgIC8qIEdlbnJlIG9mIHRoZSBzdHJlYW0gKi8KKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNob3V0MnNlbmQtPmdlbnJlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1BST1RPQ09MOiAgICAgICAgIC8qIHByb3RvY29sIHRvIGNvbm5lY3Qgd2l0aCAqLworICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHNob3V0MnNlbmQtPnByb3RvY29sKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX01PVU5UOiAgICAgICAgICAgIC8qIG1vdW50cG9pbnQgb2Ygc3RyZWFtIChpY2VjYXN0IG9ubHkpICovCisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzaG91dDJzZW5kLT5tb3VudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19VUkw6ICAgICAgICAgICAgICAvKiB0aGUgc3RyZWFtJ3MgaG9tZXBhZ2UgVVJMICovCisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzaG91dDJzZW5kLT51cmwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfVElNRU9VVDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzaG91dDJzZW5kLT50aW1lb3V0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2hvdXQyc2VuZF9zZXRjYXBzIChHc3RCYXNlU2luayAqIGJhc2VzaW5rLCBHc3RDYXBzICogY2FwcykKK3sKKyAgY29uc3QgZ2NoYXIgKm1pbWV0eXBlOworICBHc3RTaG91dDJzZW5kICpzaG91dDJzZW5kOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIHNob3V0MnNlbmQgPSBHU1RfU0hPVVQyU0VORCAoYmFzZXNpbmspOworCisgIG1pbWV0eXBlID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCkpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNob3V0MnNlbmQsICJtaW1ldHlwZSBvZiBjYXBzIGdpdmVuIGlzOiAlcyIsIG1pbWV0eXBlKTsKKworICBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJhdWRpby9tcGVnIikpIHsKKyAgICBzaG91dDJzZW5kLT5mb3JtYXQgPSBTSE9VVF9GT1JNQVRfTVAzOworICB9IGVsc2UgaWYgKGdfc3RyX2hhc19zdWZmaXggKG1pbWV0eXBlLCAiL29nZyIpKSB7CisgICAgc2hvdXQyc2VuZC0+Zm9ybWF0ID0gU0hPVVRfRk9STUFUX09HRzsKKyNpZmRlZiBTSE9VVF9GT1JNQVRfV0VCTQorICB9IGVsc2UgaWYgKGdfc3RyX2hhc19zdWZmaXggKG1pbWV0eXBlLCAiL3dlYm0iKSkgeworICAgIHNob3V0MnNlbmQtPmZvcm1hdCA9IFNIT1VUX0ZPUk1BVF9XRUJNOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgcmV0ID0gRkFMU0U7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisjaWZkZWYgRU5BQkxFX05MUworICBiaW5kdGV4dGRvbWFpbiAoR0VUVEVYVF9QQUNLQUdFLCBMT0NBTEVESVIpOworICBiaW5kX3RleHRkb21haW5fY29kZXNldCAoR0VUVEVYVF9QQUNLQUdFLCAiVVRGLTgiKTsKKyNlbmRpZiAvKiBFTkFCTEVfTkxTICovCisKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJzaG91dDJzZW5kIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIEdTVF9UWVBFX1NIT1VUMlNFTkQpOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgc2hvdXQyLAorICAgICJTZW5kcyBkYXRhIHRvIGFuIGljZWNhc3Qgc2VydmVyIHVzaW5nIGxpYnNob3V0MiIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9leHQvc2hvdXQyL2dzdHNob3V0Mi5oIGIvZXh0L3Nob3V0Mi9nc3RzaG91dDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDg3MTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3Nob3V0Mi9nc3RzaG91dDIuaApAQCAtMCwwICsxLDEwNCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9TSE9VVDJTRU5EX0hfXworI2RlZmluZSBfX0dTVF9TSE9VVDJTRU5EX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2VzaW5rLmg+CisjaW5jbHVkZSA8c2hvdXQvc2hvdXQuaD4KKworR19CRUdJTl9ERUNMUworCisgIC8qIFByb3RvY29sIHR5cGUgZW51bSAqLwordHlwZWRlZiBlbnVtIHsKKyAgU0hPVVQyU0VORF9QUk9UT0NPTF9YQVVESU9DQVNUID0gMSwKKyAgU0hPVVQyU0VORF9QUk9UT0NPTF9JQ1ksCisgIFNIT1VUMlNFTkRfUFJPVE9DT0xfSFRUUAorfSBHc3RTaG91dDJTZW5kUHJvdG9jb2w7CisKKworLyogRGVmaW5pdGlvbiBvZiBzdHJ1Y3R1cmUgc3RvcmluZyBkYXRhIGZvciB0aGlzIGVsZW1lbnQuICovCit0eXBlZGVmIHN0cnVjdCBfR3N0U2hvdXQyc2VuZCBHc3RTaG91dDJzZW5kOworc3RydWN0IF9Hc3RTaG91dDJzZW5kIHsKKyAgR3N0QmFzZVNpbmsgcGFyZW50OworCisgIEdzdFNob3V0MlNlbmRQcm90b2NvbCBwcm90b2NvbDsKKworICBHc3RQb2xsICp0aW1lcjsKKworICBzaG91dF90ICpjb25uOworCisgIGd1aW50NjQgcHJldl9xdWV1ZWxlbjsKKyAgZ3VpbnQ2NCBkYXRhX3NlbnQ7CisgIEdzdENsb2NrVGltZSBkYXRhc2VudF9yZXNldF90czsKKyAgZ2Jvb2xlYW4gc3RhbGxlZDsKKyAgR3N0Q2xvY2tUaW1lIHN0YWxsZWRfdHM7CisKKyAgZ2NoYXIgKmlwOworICBndWludCBwb3J0OworICBnY2hhciAqcGFzc3dvcmQ7CisgIGdjaGFyICp1c2VybmFtZTsKKyAgZ2NoYXIgKnN0cmVhbW5hbWU7CisgIGdjaGFyICpkZXNjcmlwdGlvbjsKKyAgZ2NoYXIgKmdlbnJlOworICBnY2hhciAqbW91bnQ7CisgIGdjaGFyICp1cmw7CisgIGdib29sZWFuIGNvbm5lY3RlZDsKKyAgZ2Jvb2xlYW4gaXNwdWJsaWM7CisgIGdjaGFyICpzb25nbWV0YWRhdGE7CisgIGdjaGFyICpzb25nYXJ0aXN0OworICBnY2hhciAqc29uZ3RpdGxlOworICBnaW50ICBmb3JtYXQ7CisgIGd1aW50IHRpbWVvdXQ7CisKKyAgR3N0VGFnTGlzdCogdGFnczsKK307CisKKworCisvKiBTdGFuZGFyZCBkZWZpbml0aW9uIGRlZmluaW5nIGEgY2xhc3MgZm9yIHRoaXMgZWxlbWVudC4gKi8KK3R5cGVkZWYgc3RydWN0IF9Hc3RTaG91dDJzZW5kQ2xhc3MgR3N0U2hvdXQyc2VuZENsYXNzOworc3RydWN0IF9Hc3RTaG91dDJzZW5kQ2xhc3MgeworICBHc3RCYXNlU2lua0NsYXNzIHBhcmVudF9jbGFzczsKKworICAvKiBzaWduYWwgY2FsbGJhY2tzICovCisgIHZvaWQgKCpjb25uZWN0aW9uX3Byb2JsZW0pIChHc3RFbGVtZW50ICplbGVtZW50LGd1aW50IGVycm5vKTsKK307CisKKy8qIFN0YW5kYXJkIG1hY3JvcyBmb3IgZGVmaW5pbmcgdHlwZXMgZm9yIHRoaXMgZWxlbWVudC4gICovCisjZGVmaW5lIEdTVF9UWVBFX1NIT1VUMlNFTkQgXAorICAoZ3N0X3Nob3V0MnNlbmRfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1NIT1VUMlNFTkQob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9TSE9VVDJTRU5ELEdzdFNob3V0MnNlbmQpKQorI2RlZmluZSBHU1RfU0hPVVQyU0VORF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9TSE9VVDJTRU5ELEdzdFNob3V0MnNlbmRDbGFzcykpCisjZGVmaW5lIEdTVF9JU19TSE9VVDJTRU5EKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfU0hPVVQyU0VORCkpCisjZGVmaW5lIEdTVF9JU19TSE9VVDJTRU5EX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1NIT1VUMlNFTkQpKQorCisvKiBTdGFuZGFyZCBmdW5jdGlvbiByZXR1cm5pbmcgdHlwZSBpbmZvcm1hdGlvbi4gKi8KK0dUeXBlIGdzdF9zaG91dDJzZW5kX2dldF90eXBlKHZvaWQpOworCisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9TSE9VVDJTRU5EX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L3Nob3V0Mi9tZXNvbi5idWlsZCBiL2V4dC9zaG91dDIvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3Nzk1OAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zaG91dDIvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxNCBAQAorc2hvdXQyX3NvdXJjZXMgPSBbJ2dzdHNob3V0Mi5jJ10KKworc2hvdXQyX2RlcCA9IGRlcGVuZGVuY3koJ3Nob3V0JywgdmVyc2lvbiA6ICc+PSAyLjAnLCByZXF1aXJlZCA6IGZhbHNlKQorCitpZiBzaG91dDJfZGVwLmZvdW5kKCkKKyAgZ3N0c2hvdXQyID0gbGlicmFyeSgnZ3N0c2hvdXQyJywKKyAgICBzaG91dDJfc291cmNlcywKKyAgICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICAgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgc2hvdXQyX2RlcF0sCisgICAgaW5zdGFsbCA6IHRydWUsCisgICAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorICApCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L3NvdXAvTWFrZWZpbGUuYW0gYi9leHQvc291cC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzUxNTk0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NvdXAvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMiBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0c291cC5sYQorCitsaWJnc3Rzb3VwX2xhX1NPVVJDRVMgPSBnc3Rzb3VwaHR0cHNyYy5jIGdzdHNvdXBodHRwY2xpZW50c2luay5jIGdzdHNvdXB1dGlscy5jIGdzdHNvdXAuYworCitsaWJnc3Rzb3VwX2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQ0ZMQUdTKSAkKFNPVVBfQ0ZMQUdTKSBcCisJLURTT1VQX1ZFUlNJT05fTUlOX1JFUVVJUkVEPVNPVVBfVkVSU0lPTl8yXzQ4IFwKKwktRFNPVVBfVkVSU0lPTl9NQVhfQUxMT1dFRD1TT1VQX0RFUFJFQ0FURURfSU5fMl80OAorbGliZ3N0c291cF9sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R0YWctQEdTVF9BUElfVkVSU0lPTkAgJChHU1RfQkFTRV9MSUJTKSAkKFNPVVBfTElCUykKK2xpYmdzdHNvdXBfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdHNvdXBodHRwc3JjLmggZ3N0c291cGh0dHBjbGllbnRzaW5rLmggZ3N0c291cHV0aWxzLmgKZGlmZiAtLWdpdCBhL2V4dC9zb3VwL2dzdHNvdXAuYyBiL2V4dC9zb3VwL2dzdHNvdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmU0OTFkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NvdXAvZ3N0c291cC5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworI2luY2x1ZGUgImdzdHNvdXBodHRwc3JjLmgiCisjaW5jbHVkZSAiZ3N0c291cGh0dHBjbGllbnRzaW5rLmgiCisjaW5jbHVkZSAiZ3N0c291cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWSAoc291cF91dGlsc19kZWJ1Zyk7CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyNpZmRlZiBFTkFCTEVfTkxTCisgIEdTVF9ERUJVRyAoImJpbmRpbmcgdGV4dCBkb21haW4gJXMgdG8gbG9jYWxlIGRpciAlcyIsIEdFVFRFWFRfUEFDS0FHRSwKKyAgICAgIExPQ0FMRURJUik7CisgIGJpbmR0ZXh0ZG9tYWluIChHRVRURVhUX1BBQ0tBR0UsIExPQ0FMRURJUik7CisgIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChHRVRURVhUX1BBQ0tBR0UsICJVVEYtOCIpOworI2VuZGlmCisKKyAgLyogc2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzQ4ODUgKi8KKyAgZ190eXBlX2Vuc3VyZSAoR19UWVBFX1NPQ0tFVCk7CisgIGdfdHlwZV9lbnN1cmUgKEdfVFlQRV9TT0NLRVRfQUREUkVTUyk7CisgIGdfdHlwZV9lbnN1cmUgKEdfVFlQRV9TT0NLRVRfU0VSVklDRSk7CisgIGdfdHlwZV9lbnN1cmUgKEdfVFlQRV9TT0NLRVRfRkFNSUxZKTsKKyAgZ190eXBlX2Vuc3VyZSAoR19UWVBFX1NPQ0tFVF9DTElFTlQpOworICBnX3R5cGVfZW5zdXJlIChHX1RZUEVfUkVTT0xWRVIpOworICBnX3R5cGVfZW5zdXJlIChHX1RZUEVfUFJPWFlfUkVTT0xWRVIpOworICBnX3R5cGVfZW5zdXJlIChHX1RZUEVfUFJPWFlfQUREUkVTUyk7CisgIGdfdHlwZV9lbnN1cmUgKEdfVFlQRV9UTFNfQ0VSVElGSUNBVEUpOworICBnX3R5cGVfZW5zdXJlIChHX1RZUEVfVExTX0NPTk5FQ1RJT04pOworICBnX3R5cGVfZW5zdXJlIChHX1RZUEVfVExTX0RBVEFCQVNFKTsKKyAgZ190eXBlX2Vuc3VyZSAoR19UWVBFX1RMU19JTlRFUkFDVElPTik7CisKKyAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInNvdXBodHRwc3JjIiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgIEdTVF9UWVBFX1NPVVBfSFRUUF9TUkMpOworICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAic291cGh0dHBjbGllbnRzaW5rIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIEdTVF9UWVBFX1NPVVBfSFRUUF9DTElFTlRfU0lOSyk7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChzb3VwX3V0aWxzX2RlYnVnLCAic291cHV0aWxzIiwgMCwgIlNvdXAgdXRpbHMiKTsKKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHNvdXAsCisgICAgImxpYnNvdXAgSFRUUCBjbGllbnQgc3JjL3NpbmsiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmMgYi9leHQvc291cC9nc3Rzb3VwaHR0cGNsaWVudHNpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODEyNDg4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmMKQEAgLTAsMCArMSw5MjEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDExIERhdmlkIFNjaGxlZWYgPGRzQGVudHJvcHl3YXZlLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIFN1aXRlIDUwMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMzNSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1nc3Rzb3VwaHR0cGNsaWVudHNpbmsKKyAqCisgKiBUaGUgc291cGh0dHBjbGllbnRzaW5rIGVsZW1lbnQgc2VuZHMgcGlwZWxpbmUgZGF0YSB0byBhbiBIVFRQIHNlcnZlcgorICogdXNpbmcgSFRUUCBQVVQgY29tbWFuZHMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0zMDAgISB0aGVvcmFlbmMgISBvZ2dtdXggIQorICogICBzb3VwaHR0cGNsaWVudHNpbmsgbG9jYXRpb249aHR0cDovL3NlcnZlci9maWxlbmFtZS5vZ3YKKyAqIF18CisgKiAKKyAqIFRoaXMgZXhhbXBsZSBlbmNvZGVzIDEwIHNlY29uZHMgb2YgdmlkZW8gYW5kIHNlbmRzIGl0IHRvIHRoZSBIVFRQCisgKiBzZXJ2ZXIgInNlcnZlciIgdXNpbmcgSFRUUCBQVVQgY29tbWFuZHMuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlc2luay5oPgorI2luY2x1ZGUgImdzdHNvdXBodHRwY2xpZW50c2luay5oIgorI2luY2x1ZGUgImdzdHNvdXB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChzb3VwaHR0cGNsaWVudHNpbmtfZGJnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHNvdXBodHRwY2xpZW50c2lua19kYmcKKworLyogcHJvdG90eXBlcyAqLworCisKK3N0YXRpYyB2b2lkIGdzdF9zb3VwX2h0dHBfY2xpZW50X3Npbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BlcnR5X2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BlcnR5X2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9zb3VwX2h0dHBfY2xpZW50X3Npbmtfc2V0X2NhcHMgKEdzdEJhc2VTaW5rICogc2luaywKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgdm9pZCBnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX2dldF90aW1lcyAoR3N0QmFzZVNpbmsgKiBzaW5rLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlciwgR3N0Q2xvY2tUaW1lICogc3RhcnQsIEdzdENsb2NrVGltZSAqIGVuZCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19zdGFydCAoR3N0QmFzZVNpbmsgKiBzaW5rKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX3N0b3AgKEdzdEJhc2VTaW5rICogc2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua191bmxvY2sgKEdzdEJhc2VTaW5rICogc2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19ldmVudCAoR3N0QmFzZVNpbmsgKiBzaW5rLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19wcmVyb2xsIChHc3RCYXNlU2luayAqIHNpbmssCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfcmVuZGVyIChHc3RCYXNlU2luayAqIHNpbmssCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworc3RhdGljIHZvaWQgZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19yZXNldCAoR3N0U291cEh0dHBDbGllbnRTaW5rICoKKyAgICBzb3VwaHR0cHNpbmspOworc3RhdGljIHZvaWQgYXV0aGVudGljYXRlIChTb3VwU2Vzc2lvbiAqIHNlc3Npb24sIFNvdXBNZXNzYWdlICogbXNnLAorICAgIFNvdXBBdXRoICogYXV0aCwgZ2Jvb2xlYW4gcmV0cnlpbmcsIGdwb2ludGVyIHVzZXJfZGF0YSk7CitzdGF0aWMgdm9pZCBjYWxsYmFjayAoU291cFNlc3Npb24gKiBzZXNzaW9uLCBTb3VwTWVzc2FnZSAqIG1zZywKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpOworc3RhdGljIGdib29sZWFuIGdzdF9zb3VwX2h0dHBfY2xpZW50X3Npbmtfc2V0X3Byb3h5IChHc3RTb3VwSHR0cENsaWVudFNpbmsgKgorICAgIHNvdXBodHRwc2luaywgY29uc3QgZ2NoYXIgKiB1cmkpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MT0NBVElPTiwKKyAgUFJPUF9VU0VSX0FHRU5ULAorICBQUk9QX0FVVE9NQVRJQ19SRURJUkVDVCwKKyAgUFJPUF9QUk9YWSwKKyAgUFJPUF9VU0VSX0lELAorICBQUk9QX1VTRVJfUFcsCisgIFBST1BfUFJPWFlfSUQsCisgIFBST1BfUFJPWFlfUFcsCisgIFBST1BfQ09PS0lFUywKKyAgUFJPUF9TRVNTSU9OLAorICBQUk9QX1NPVVBfTE9HX0xFVkVMLAorICBQUk9QX1JFVFJZX0RFTEFZLAorICBQUk9QX1JFVFJJRVMKK307CisKKyNkZWZpbmUgREVGQVVMVF9VU0VSX0FHRU5UICAgICAgICAgICAiR1N0cmVhbWVyIHNvdXBodHRwY2xpZW50c2luayAiCisjZGVmaW5lIERFRkFVTFRfU09VUF9MT0dfTEVWRUwgICAgICAgU09VUF9MT0dHRVJfTE9HX05PTkUKKworLyogcGFkIHRlbXBsYXRlcyAqLworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCisKKy8qIGNsYXNzIGluaXRpYWxpemF0aW9uICovCisKKyNkZWZpbmUgZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RTb3VwSHR0cENsaWVudFNpbmssIGdzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmssCisgICAgR1NUX1RZUEVfQkFTRV9TSU5LKTsKKworc3RhdGljIHZvaWQKK2dzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfY2xhc3NfaW5pdCAoR3N0U291cEh0dHBDbGllbnRTaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QmFzZVNpbmtDbGFzcyAqYmFzZV9zaW5rX2NsYXNzID0gR1NUX0JBU0VfU0lOS19DTEFTUyAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9zb3VwX2h0dHBfY2xpZW50X3Npbmtfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfZGlzcG9zZTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0xPQ0FUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImxvY2F0aW9uIiwgIkxvY2F0aW9uIiwKKyAgICAgICAgICAiVVJJIHRvIHNlbmQgdG8iLCAiIiwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1VTRVJfQUdFTlQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgidXNlci1hZ2VudCIsICJVc2VyLUFnZW50IiwKKyAgICAgICAgICAiVmFsdWUgb2YgdGhlIFVzZXItQWdlbnQgSFRUUCByZXF1ZXN0IGhlYWRlciBmaWVsZCIsCisgICAgICAgICAgREVGQVVMVF9VU0VSX0FHRU5ULCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfQVVUT01BVElDX1JFRElSRUNULAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJhdXRvbWF0aWMtcmVkaXJlY3QiLCAiYXV0b21hdGljLXJlZGlyZWN0IiwKKyAgICAgICAgICAiQXV0b21hdGljYWxseSBmb2xsb3cgSFRUUCByZWRpcmVjdHMgKEhUVFAgU3RhdHVzIENvZGUgM3h4KSIsCisgICAgICAgICAgVFJVRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1BST1hZLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInByb3h5IiwgIlByb3h5IiwKKyAgICAgICAgICAiSFRUUCBwcm94eSBzZXJ2ZXIgVVJJIiwgIiIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1VTRVJfSUQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgidXNlci1pZCIsICJ1c2VyLWlkIiwKKyAgICAgICAgICAidXNlciBpZCBmb3IgYXV0aGVudGljYXRpb24iLCAiIiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9VU0VSX1BXLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInVzZXItcHciLCAidXNlci1wdyIsCisgICAgICAgICAgInVzZXIgcGFzc3dvcmQgZm9yIGF1dGhlbnRpY2F0aW9uIiwgIiIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUFJPWFlfSUQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgicHJveHktaWQiLCAicHJveHktaWQiLAorICAgICAgICAgICJ1c2VyIGlkIGZvciBwcm94eSBhdXRoZW50aWNhdGlvbiIsICIiLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BST1hZX1BXLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInByb3h5LXB3IiwgInByb3h5LXB3IiwKKyAgICAgICAgICAidXNlciBwYXNzd29yZCBmb3IgcHJveHkgYXV0aGVudGljYXRpb24iLCAiIiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TRVNTSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInNlc3Npb24iLCAic2Vzc2lvbiIsCisgICAgICAgICAgIlNvdXBTZXNzaW9uIG9iamVjdCB0byB1c2UgZm9yIGNvbW11bmljYXRpb24iLAorICAgICAgICAgIFNPVVBfVFlQRV9TRVNTSU9OLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DT09LSUVTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgiY29va2llcyIsICJDb29raWVzIiwgIkhUVFAgcmVxdWVzdCBjb29raWVzIiwKKyAgICAgICAgICBHX1RZUEVfU1RSViwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkVUUllfREVMQVksCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicmV0cnktZGVsYXkiLCAiUmV0cnkgRGVsYXkiLAorICAgICAgICAgICJEZWxheSBpbiBzZWNvbmRzIGJldHdlZW4gcmV0cmllcyBhZnRlciBhIGZhaWx1cmUiLCAxLCBHX01BWElOVCwgNSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SRVRSSUVTLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInJldHJpZXMiLCAiUmV0cmllcyIsCisgICAgICAgICAgIk1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMsIHplcm8gdG8gZGlzYWJsZSwgLTEgdG8gcmV0cnkgZm9yZXZlciIsCisgICAgICAgICAgLTEsIEdfTUFYSU5ULCAwLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAvKioKKyAgICogR3N0U291cEh0dHBDbGllbnRTaW5rOjpodHRwLWxvZy1sZXZlbDoKKyAgICoKKyAgICogSWYgc2V0IGFuZCA+IDAsIGNhcHR1cmVzIGFuZCBkdW1wcyBIVFRQIHNlc3Npb24gZGF0YSBhcworICAgKiBsb2cgbWVzc2FnZXMgaWYgbG9nIGxldmVsID49IEdTVF9MRVZFTF9UUkFDRQorICAgKgorICAgKiBTaW5jZTogMS40CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NPVVBfTE9HX0xFVkVMLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJodHRwLWxvZy1sZXZlbCIsICJIVFRQIGxvZyBsZXZlbCIsCisgICAgICAgICAgIlNldCBsb2cgbGV2ZWwgZm9yIHNvdXAncyBIVFRQIHNlc3Npb24gbG9nIiwKKyAgICAgICAgICBTT1VQX1RZUEVfTE9HR0VSX0xPR19MRVZFTCwgREVGQVVMVF9TT1VQX0xPR19MRVZFTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJIVFRQIGNsaWVudCBzaW5rIiwKKyAgICAgICJHZW5lcmljIiwgIlNlbmRzIHN0cmVhbXMgdG8gSFRUUCBzZXJ2ZXIgdmlhIFBVVCIsCisgICAgICAiRGF2aWQgU2NobGVlZiA8ZHNAZW50cm9weXdhdmUuY29tPiIpOworCisgIGJhc2Vfc2lua19jbGFzcy0+c2V0X2NhcHMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zb3VwX2h0dHBfY2xpZW50X3Npbmtfc2V0X2NhcHMpOworICBpZiAoMCkKKyAgICBiYXNlX3NpbmtfY2xhc3MtPmdldF90aW1lcyA9CisgICAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX2dldF90aW1lcyk7CisgIGJhc2Vfc2lua19jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19zdGFydCk7CisgIGJhc2Vfc2lua19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX3N0b3ApOworICBiYXNlX3NpbmtfY2xhc3MtPnVubG9jayA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua191bmxvY2spOworICBiYXNlX3NpbmtfY2xhc3MtPmV2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfZXZlbnQpOworICBpZiAoMCkKKyAgICBiYXNlX3NpbmtfY2xhc3MtPnByZXJvbGwgPQorICAgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19wcmVyb2xsKTsKKyAgYmFzZV9zaW5rX2NsYXNzLT5yZW5kZXIgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfcmVuZGVyKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoc291cGh0dHBjbGllbnRzaW5rX2RiZywgInNvdXBodHRwY2xpZW50c2luayIsIDAsCisgICAgICAic291cGh0dHBjbGllbnRzaW5rIGVsZW1lbnQiKTsKKworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19pbml0IChHc3RTb3VwSHR0cENsaWVudFNpbmsgKiBzb3VwaHR0cHNpbmspCit7CisgIGNvbnN0IGNoYXIgKnByb3h5OworCisgIGdfbXV0ZXhfaW5pdCAoJnNvdXBodHRwc2luay0+bXV0ZXgpOworICBnX2NvbmRfaW5pdCAoJnNvdXBodHRwc2luay0+Y29uZCk7CisKKyAgc291cGh0dHBzaW5rLT5sb2NhdGlvbiA9IE5VTEw7CisgIHNvdXBodHRwc2luay0+YXV0b21hdGljX3JlZGlyZWN0ID0gVFJVRTsKKyAgc291cGh0dHBzaW5rLT51c2VyX2FnZW50ID0gZ19zdHJkdXAgKERFRkFVTFRfVVNFUl9BR0VOVCk7CisgIHNvdXBodHRwc2luay0+dXNlcl9pZCA9IE5VTEw7CisgIHNvdXBodHRwc2luay0+dXNlcl9wdyA9IE5VTEw7CisgIHNvdXBodHRwc2luay0+cHJveHlfaWQgPSBOVUxMOworICBzb3VwaHR0cHNpbmstPnByb3h5X3B3ID0gTlVMTDsKKyAgc291cGh0dHBzaW5rLT5wcm9wX3Nlc3Npb24gPSBOVUxMOworICBzb3VwaHR0cHNpbmstPnRpbWVvdXQgPSAxOworICBzb3VwaHR0cHNpbmstPmxvZ19sZXZlbCA9IERFRkFVTFRfU09VUF9MT0dfTEVWRUw7CisgIHNvdXBodHRwc2luay0+cmV0cnlfZGVsYXkgPSA1OworICBzb3VwaHR0cHNpbmstPnJldHJpZXMgPSAwOworICBwcm94eSA9IGdfZ2V0ZW52ICgiaHR0cF9wcm94eSIpOworICBpZiAocHJveHkgJiYgIWdzdF9zb3VwX2h0dHBfY2xpZW50X3Npbmtfc2V0X3Byb3h5IChzb3VwaHR0cHNpbmssIHByb3h5KSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc291cGh0dHBzaW5rLAorICAgICAgICAiVGhlIHByb3h5IGluIHRoZSBodHRwX3Byb3h5IGVudiB2YXIgKFwiJXNcIikgY2Fubm90IGJlIHBhcnNlZC4iLAorICAgICAgICBwcm94eSk7CisgIH0KKworICBnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX3Jlc2V0IChzb3VwaHR0cHNpbmspOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19yZXNldCAoR3N0U291cEh0dHBDbGllbnRTaW5rICogc291cGh0dHBzaW5rKQoreworICBnX2xpc3RfZnJlZV9mdWxsIChzb3VwaHR0cHNpbmstPnF1ZXVlZF9idWZmZXJzLAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX3VucmVmKTsKKyAgc291cGh0dHBzaW5rLT5xdWV1ZWRfYnVmZmVycyA9IE5VTEw7CisgIGdfZnJlZSAoc291cGh0dHBzaW5rLT5yZWFzb25fcGhyYXNlKTsKKyAgc291cGh0dHBzaW5rLT5yZWFzb25fcGhyYXNlID0gTlVMTDsKKyAgc291cGh0dHBzaW5rLT5zdGF0dXNfY29kZSA9IDA7CisgIHNvdXBodHRwc2luay0+b2Zmc2V0ID0gMDsKKyAgc291cGh0dHBzaW5rLT5mYWlsdXJlcyA9IDA7CisKKyAgZ19saXN0X2ZyZWVfZnVsbCAoc291cGh0dHBzaW5rLT5zdHJlYW1oZWFkZXJfYnVmZmVycywKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgIHNvdXBodHRwc2luay0+c3RyZWFtaGVhZGVyX2J1ZmZlcnMgPSBOVUxMOworICBnX2xpc3RfZnJlZV9mdWxsIChzb3VwaHR0cHNpbmstPnNlbnRfYnVmZmVycywKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgIHNvdXBodHRwc2luay0+c2VudF9idWZmZXJzID0gTlVMTDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX3NldF9wcm94eSAoR3N0U291cEh0dHBDbGllbnRTaW5rICogc291cGh0dHBzaW5rLAorICAgIGNvbnN0IGdjaGFyICogdXJpKQoreworICBpZiAoc291cGh0dHBzaW5rLT5wcm94eSkgeworICAgIHNvdXBfdXJpX2ZyZWUgKHNvdXBodHRwc2luay0+cHJveHkpOworICAgIHNvdXBodHRwc2luay0+cHJveHkgPSBOVUxMOworICB9CisgIGlmIChnX3N0cl9oYXNfcHJlZml4ICh1cmksICJodHRwOi8vIikpIHsKKyAgICBzb3VwaHR0cHNpbmstPnByb3h5ID0gc291cF91cmlfbmV3ICh1cmkpOworICB9IGVsc2UgeworICAgIGdjaGFyICpuZXdfdXJpID0gZ19zdHJjb25jYXQgKCJodHRwOi8vIiwgdXJpLCBOVUxMKTsKKworICAgIHNvdXBodHRwc2luay0+cHJveHkgPSBzb3VwX3VyaV9uZXcgKG5ld191cmkpOworICAgIGdfZnJlZSAobmV3X3VyaSk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFNvdXBIdHRwQ2xpZW50U2luayAqc291cGh0dHBzaW5rID0gR1NUX1NPVVBfSFRUUF9DTElFTlRfU0lOSyAob2JqZWN0KTsKKworICBnX211dGV4X2xvY2sgKCZzb3VwaHR0cHNpbmstPm11dGV4KTsKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9TRVNTSU9OOgorICAgICAgaWYgKHNvdXBodHRwc2luay0+cHJvcF9zZXNzaW9uKSB7CisgICAgICAgIGdfb2JqZWN0X3VucmVmIChzb3VwaHR0cHNpbmstPnByb3Bfc2Vzc2lvbik7CisgICAgICB9CisgICAgICBzb3VwaHR0cHNpbmstPnByb3Bfc2Vzc2lvbiA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xPQ0FUSU9OOgorICAgICAgZ19mcmVlIChzb3VwaHR0cHNpbmstPmxvY2F0aW9uKTsKKyAgICAgIHNvdXBodHRwc2luay0+bG9jYXRpb24gPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIHNvdXBodHRwc2luay0+b2Zmc2V0ID0gMDsKKyAgICAgIGlmICgoc291cGh0dHBzaW5rLT5sb2NhdGlvbiA9PSBOVUxMKQorICAgICAgICAgIHx8ICFnc3RfdXJpX2lzX3ZhbGlkIChzb3VwaHR0cHNpbmstPmxvY2F0aW9uKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNvdXBodHRwc2luaywKKyAgICAgICAgICAgICJUaGUgbG9jYXRpb24gKFwiJXNcIikgc2V0LCBpcyBub3QgYSB2YWxpZCB1cmkuIiwKKyAgICAgICAgICAgIHNvdXBodHRwc2luay0+bG9jYXRpb24pOworICAgICAgICBnX2ZyZWUgKHNvdXBodHRwc2luay0+bG9jYXRpb24pOworICAgICAgICBzb3VwaHR0cHNpbmstPmxvY2F0aW9uID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VSX0FHRU5UOgorICAgICAgZ19mcmVlIChzb3VwaHR0cHNpbmstPnVzZXJfYWdlbnQpOworICAgICAgc291cGh0dHBzaW5rLT51c2VyX2FnZW50ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQVVUT01BVElDX1JFRElSRUNUOgorICAgICAgc291cGh0dHBzaW5rLT5hdXRvbWF0aWNfcmVkaXJlY3QgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFUl9JRDoKKyAgICAgIGdfZnJlZSAoc291cGh0dHBzaW5rLT51c2VyX2lkKTsKKyAgICAgIHNvdXBodHRwc2luay0+dXNlcl9pZCA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRVJfUFc6CisgICAgICBnX2ZyZWUgKHNvdXBodHRwc2luay0+dXNlcl9wdyk7CisgICAgICBzb3VwaHR0cHNpbmstPnVzZXJfcHcgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9YWV9JRDoKKyAgICAgIGdfZnJlZSAoc291cGh0dHBzaW5rLT5wcm94eV9pZCk7CisgICAgICBzb3VwaHR0cHNpbmstPnByb3h5X2lkID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUFJPWFlfUFc6CisgICAgICBnX2ZyZWUgKHNvdXBodHRwc2luay0+cHJveHlfcHcpOworICAgICAgc291cGh0dHBzaW5rLT5wcm94eV9wdyA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST1hZOgorICAgIHsKKyAgICAgIGNvbnN0IGdjaGFyICpwcm94eTsKKworICAgICAgcHJveHkgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKTsKKworICAgICAgaWYgKHByb3h5ID09IE5VTEwpIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJwcm94eSBwcm9wZXJ0eSBjYW5ub3QgYmUgTlVMTCIpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgICBpZiAoIWdzdF9zb3VwX2h0dHBfY2xpZW50X3Npbmtfc2V0X3Byb3h5IChzb3VwaHR0cHNpbmssIHByb3h5KSkgeworICAgICAgICBHU1RfV0FSTklORyAoImJhZGx5IGZvcm1hdHRlZCBwcm94eSBVUkkiKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9DT09LSUVTOgorICAgICAgZ19zdHJmcmVldiAoc291cGh0dHBzaW5rLT5jb29raWVzKTsKKyAgICAgIHNvdXBodHRwc2luay0+Y29va2llcyA9IGdfc3RyZHVwdiAoZ192YWx1ZV9nZXRfYm94ZWQgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU09VUF9MT0dfTEVWRUw6CisgICAgICBzb3VwaHR0cHNpbmstPmxvZ19sZXZlbCA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVRSWV9ERUxBWToKKyAgICAgIHNvdXBodHRwc2luay0+cmV0cnlfZGVsYXkgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVRSSUVTOgorICAgICAgc291cGh0dHBzaW5rLT5yZXRyaWVzID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorZG9uZToKKyAgZ19tdXRleF91bmxvY2sgKCZzb3VwaHR0cHNpbmstPm11dGV4KTsKK30KKwordm9pZAorZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFNvdXBIdHRwQ2xpZW50U2luayAqc291cGh0dHBzaW5rID0gR1NUX1NPVVBfSFRUUF9DTElFTlRfU0lOSyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKSB7CisgICAgY2FzZSBQUk9QX1NFU1NJT046CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzb3VwaHR0cHNpbmstPnByb3Bfc2Vzc2lvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTE9DQVRJT046CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzb3VwaHR0cHNpbmstPmxvY2F0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BVVRPTUFUSUNfUkVESVJFQ1Q6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc291cGh0dHBzaW5rLT5hdXRvbWF0aWNfcmVkaXJlY3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRVJfQUdFTlQ6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzb3VwaHR0cHNpbmstPnVzZXJfYWdlbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRVJfSUQ6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzb3VwaHR0cHNpbmstPnVzZXJfaWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRVJfUFc6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzb3VwaHR0cHNpbmstPnVzZXJfcHcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST1hZX0lEOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc291cGh0dHBzaW5rLT5wcm94eV9pZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUFJPWFlfUFc6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzb3VwaHR0cHNpbmstPnByb3h5X3B3KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9YWToKKyAgICAgIGlmIChzb3VwaHR0cHNpbmstPnByb3h5ID09IE5VTEwpCisgICAgICAgIGdfdmFsdWVfc2V0X3N0YXRpY19zdHJpbmcgKHZhbHVlLCAiIik7CisgICAgICBlbHNlIHsKKyAgICAgICAgY2hhciAqcHJveHkgPSBzb3VwX3VyaV90b19zdHJpbmcgKHNvdXBodHRwc2luay0+cHJveHksIEZBTFNFKTsKKworICAgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBwcm94eSk7CisgICAgICAgIGdfZnJlZSAocHJveHkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NPT0tJRVM6CisgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIGdfc3RyZHVwdiAoc291cGh0dHBzaW5rLT5jb29raWVzKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU09VUF9MT0dfTEVWRUw6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgc291cGh0dHBzaW5rLT5sb2dfbGV2ZWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFVFJZX0RFTEFZOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgc291cGh0dHBzaW5rLT5yZXRyeV9kZWxheSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVUUklFUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHNvdXBodHRwc2luay0+cmV0cmllcyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkCitnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFNvdXBIdHRwQ2xpZW50U2luayAqc291cGh0dHBzaW5rID0gR1NUX1NPVVBfSFRUUF9DTElFTlRfU0lOSyAob2JqZWN0KTsKKworICAvKiBjbGVhbiB1cCBhcyBwb3NzaWJsZS4gIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgKi8KKyAgaWYgKHNvdXBodHRwc2luay0+cHJvcF9zZXNzaW9uKQorICAgIGdfb2JqZWN0X3VucmVmIChzb3VwaHR0cHNpbmstPnByb3Bfc2Vzc2lvbik7CisgIHNvdXBodHRwc2luay0+cHJvcF9zZXNzaW9uID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKwordm9pZAorZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0U291cEh0dHBDbGllbnRTaW5rICpzb3VwaHR0cHNpbmsgPSBHU1RfU09VUF9IVFRQX0NMSUVOVF9TSU5LIChvYmplY3QpOworCisgIC8qIGNsZWFuIHVwIG9iamVjdCBoZXJlICovCisKKyAgZ19mcmVlIChzb3VwaHR0cHNpbmstPnVzZXJfYWdlbnQpOworICBnX2ZyZWUgKHNvdXBodHRwc2luay0+dXNlcl9pZCk7CisgIGdfZnJlZSAoc291cGh0dHBzaW5rLT51c2VyX3B3KTsKKyAgZ19mcmVlIChzb3VwaHR0cHNpbmstPnByb3h5X2lkKTsKKyAgZ19mcmVlIChzb3VwaHR0cHNpbmstPnByb3h5X3B3KTsKKyAgaWYgKHNvdXBodHRwc2luay0+cHJveHkpCisgICAgc291cF91cmlfZnJlZSAoc291cGh0dHBzaW5rLT5wcm94eSk7CisgIGdfZnJlZSAoc291cGh0dHBzaW5rLT5sb2NhdGlvbik7CisgIGdfc3RyZnJlZXYgKHNvdXBodHRwc2luay0+Y29va2llcyk7CisKKyAgZ19jb25kX2NsZWFyICgmc291cGh0dHBzaW5rLT5jb25kKTsKKyAgZ19tdXRleF9jbGVhciAoJnNvdXBodHRwc2luay0+bXV0ZXgpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19zZXRfY2FwcyAoR3N0QmFzZVNpbmsgKiBzaW5rLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U291cEh0dHBDbGllbnRTaW5rICpzb3VwaHR0cHNpbmsgPSBHU1RfU09VUF9IVFRQX0NMSUVOVF9TSU5LIChzaW5rKTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IEdWYWx1ZSAqdmFsdWVfYXJyYXk7CisgIGludCBpLCBuOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNvdXBodHRwc2luaywgIm5ldyBzdHJlYW0gaGVhZGVycyBzZXQiKTsKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIHZhbHVlX2FycmF5ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgInN0cmVhbWhlYWRlciIpOworICBpZiAodmFsdWVfYXJyYXkpIHsKKyAgICBnX2xpc3RfZnJlZV9mdWxsIChzb3VwaHR0cHNpbmstPnN0cmVhbWhlYWRlcl9idWZmZXJzLAorICAgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9idWZmZXJfdW5yZWYpOworICAgIHNvdXBodHRwc2luay0+c3RyZWFtaGVhZGVyX2J1ZmZlcnMgPSBOVUxMOworCisgICAgbiA9IGdzdF92YWx1ZV9hcnJheV9nZXRfc2l6ZSAodmFsdWVfYXJyYXkpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWU7CisgICAgICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgICAgIHZhbHVlID0gZ3N0X3ZhbHVlX2FycmF5X2dldF92YWx1ZSAodmFsdWVfYXJyYXksIGkpOworICAgICAgYnVmZmVyID0gR1NUX0JVRkZFUiAoZ3N0X3ZhbHVlX2dldF9idWZmZXIgKHZhbHVlKSk7CisgICAgICBzb3VwaHR0cHNpbmstPnN0cmVhbWhlYWRlcl9idWZmZXJzID0KKyAgICAgICAgICBnX2xpc3RfYXBwZW5kIChzb3VwaHR0cHNpbmstPnN0cmVhbWhlYWRlcl9idWZmZXJzLAorICAgICAgICAgIGdzdF9idWZmZXJfcmVmIChidWZmZXIpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfZ2V0X3RpbWVzIChHc3RCYXNlU2luayAqIHNpbmssIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBHc3RDbG9ja1RpbWUgKiBzdGFydCwgR3N0Q2xvY2tUaW1lICogZW5kKQoreworCit9CisKK3N0YXRpYyBnYm9vbGVhbgordGhyZWFkX3JlYWR5X2lkbGVfY2IgKGdwb2ludGVyIGRhdGEpCit7CisgIEdzdFNvdXBIdHRwQ2xpZW50U2luayAqc291cGh0dHBzaW5rID0gR1NUX1NPVVBfSFRUUF9DTElFTlRfU0lOSyAoZGF0YSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNvdXBodHRwc2luaywgInRocmVhZCByZWFkeSIpOworCisgIGdfbXV0ZXhfbG9jayAoJnNvdXBodHRwc2luay0+bXV0ZXgpOworICBnX2NvbmRfc2lnbmFsICgmc291cGh0dHBzaW5rLT5jb25kKTsKKyAgZ19tdXRleF91bmxvY2sgKCZzb3VwaHR0cHNpbmstPm11dGV4KTsKKworICByZXR1cm4gRkFMU0U7ICAgICAgICAgICAgICAgICAvKiBvbmx5IHJ1biBvbmNlICovCit9CisKK3N0YXRpYyBncG9pbnRlcgordGhyZWFkX2Z1bmMgKGdwb2ludGVyIHB0cikKK3sKKyAgR3N0U291cEh0dHBDbGllbnRTaW5rICpzb3VwaHR0cHNpbmsgPSBHU1RfU09VUF9IVFRQX0NMSUVOVF9TSU5LIChwdHIpOworCisgIEdTVF9ERUJVRyAoInRocmVhZCBzdGFydCIpOworCisgIGdfbWFpbl9sb29wX3J1biAoc291cGh0dHBzaW5rLT5sb29wKTsKKworICBHU1RfREVCVUcgKCJ0aHJlYWQgcXVpdCIpOworCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zb3VwX2h0dHBfY2xpZW50X3Npbmtfc3RhcnQgKEdzdEJhc2VTaW5rICogc2luaykKK3sKKyAgR3N0U291cEh0dHBDbGllbnRTaW5rICpzb3VwaHR0cHNpbmsgPSBHU1RfU09VUF9IVFRQX0NMSUVOVF9TSU5LIChzaW5rKTsKKworICBpZiAoc291cGh0dHBzaW5rLT5wcm9wX3Nlc3Npb24pIHsKKyAgICBzb3VwaHR0cHNpbmstPnNlc3Npb24gPSBzb3VwaHR0cHNpbmstPnByb3Bfc2Vzc2lvbjsKKyAgfSBlbHNlIHsKKyAgICBHU291cmNlICpzb3VyY2U7CisgICAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgICBzb3VwaHR0cHNpbmstPmNvbnRleHQgPSBnX21haW5fY29udGV4dF9uZXcgKCk7CisKKyAgICAvKiBzZXQgdXAgaWRsZSBzb3VyY2UgdG8gc2lnbmFsIHdoZW4gdGhlIG1haW4gbG9vcCBpcyBydW5uaW5nIGFuZAorICAgICAqIGl0J3Mgc2FmZSBmb3IgOjpzdG9wKCkgdG8gY2FsbCBnX21haW5fbG9vcF9xdWl0KCkgKi8KKyAgICBzb3VyY2UgPSBnX2lkbGVfc291cmNlX25ldyAoKTsKKyAgICBnX3NvdXJjZV9zZXRfY2FsbGJhY2sgKHNvdXJjZSwgdGhyZWFkX3JlYWR5X2lkbGVfY2IsIHNpbmssIE5VTEwpOworICAgIGdfc291cmNlX2F0dGFjaCAoc291cmNlLCBzb3VwaHR0cHNpbmstPmNvbnRleHQpOworICAgIGdfc291cmNlX3VucmVmIChzb3VyY2UpOworCisgICAgc291cGh0dHBzaW5rLT5sb29wID0gZ19tYWluX2xvb3BfbmV3IChzb3VwaHR0cHNpbmstPmNvbnRleHQsIFRSVUUpOworCisgICAgZ19tdXRleF9sb2NrICgmc291cGh0dHBzaW5rLT5tdXRleCk7CisKKyAgICBzb3VwaHR0cHNpbmstPnRocmVhZCA9IGdfdGhyZWFkX3RyeV9uZXcgKCJzb3VwaHR0cGNsaWVudHNpbmstdGhyZWFkIiwKKyAgICAgICAgdGhyZWFkX2Z1bmMsIHNvdXBodHRwc2luaywgJmVycm9yKTsKKworICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzb3VwaHR0cHNpbmssICJmYWlsZWQgdG8gc3RhcnQgdGhyZWFkLCAlcyIsCisgICAgICAgICAgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICBnX211dGV4X3VubG9jayAoJnNvdXBodHRwc2luay0+bXV0ZXgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIEdTVF9MT0dfT0JKRUNUIChzb3VwaHR0cHNpbmssICJ3YWl0aW5nIGZvciBtYWluIGxvb3AgdGhyZWFkIHRvIHN0YXJ0IHVwIik7CisgICAgZ19jb25kX3dhaXQgKCZzb3VwaHR0cHNpbmstPmNvbmQsICZzb3VwaHR0cHNpbmstPm11dGV4KTsKKyAgICBnX211dGV4X3VubG9jayAoJnNvdXBodHRwc2luay0+bXV0ZXgpOworICAgIEdTVF9MT0dfT0JKRUNUIChzb3VwaHR0cHNpbmssICJtYWluIGxvb3AgdGhyZWFkIHJ1bm5pbmciKTsKKworICAgIGlmIChzb3VwaHR0cHNpbmstPnByb3h5ID09IE5VTEwpIHsKKyAgICAgIHNvdXBodHRwc2luay0+c2Vzc2lvbiA9CisgICAgICAgICAgc291cF9zZXNzaW9uX2FzeW5jX25ld193aXRoX29wdGlvbnMgKFNPVVBfU0VTU0lPTl9BU1lOQ19DT05URVhULAorICAgICAgICAgIHNvdXBodHRwc2luay0+Y29udGV4dCwgU09VUF9TRVNTSU9OX1VTRVJfQUdFTlQsCisgICAgICAgICAgc291cGh0dHBzaW5rLT51c2VyX2FnZW50LCBTT1VQX1NFU1NJT05fVElNRU9VVCwgc291cGh0dHBzaW5rLT50aW1lb3V0LAorICAgICAgICAgIFNPVVBfU0VTU0lPTl9BRERfRkVBVFVSRV9CWV9UWVBFLCBTT1VQX1RZUEVfUFJPWFlfUkVTT0xWRVJfREVGQVVMVCwKKyAgICAgICAgICBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgc291cGh0dHBzaW5rLT5zZXNzaW9uID0KKyAgICAgICAgICBzb3VwX3Nlc3Npb25fYXN5bmNfbmV3X3dpdGhfb3B0aW9ucyAoU09VUF9TRVNTSU9OX0FTWU5DX0NPTlRFWFQsCisgICAgICAgICAgc291cGh0dHBzaW5rLT5jb250ZXh0LCBTT1VQX1NFU1NJT05fVVNFUl9BR0VOVCwKKyAgICAgICAgICBzb3VwaHR0cHNpbmstPnVzZXJfYWdlbnQsIFNPVVBfU0VTU0lPTl9USU1FT1VULCBzb3VwaHR0cHNpbmstPnRpbWVvdXQsCisgICAgICAgICAgU09VUF9TRVNTSU9OX1BST1hZX1VSSSwgc291cGh0dHBzaW5rLT5wcm94eSwgTlVMTCk7CisgICAgfQorCisgICAgZ19zaWduYWxfY29ubmVjdCAoc291cGh0dHBzaW5rLT5zZXNzaW9uLCAiYXV0aGVudGljYXRlIiwKKyAgICAgICAgR19DQUxMQkFDSyAoYXV0aGVudGljYXRlKSwgc291cGh0dHBzaW5rKTsKKyAgfQorCisgIC8qIFNldCB1cCBsb2dnaW5nICovCisgIGdzdF9zb3VwX3V0aWxfbG9nX3NldHVwIChzb3VwaHR0cHNpbmstPnNlc3Npb24sIHNvdXBodHRwc2luay0+bG9nX2xldmVsLAorICAgICAgR1NUX0VMRU1FTlQgKHNvdXBodHRwc2luaykpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zb3VwX2h0dHBfY2xpZW50X3Npbmtfc3RvcCAoR3N0QmFzZVNpbmsgKiBzaW5rKQoreworICBHc3RTb3VwSHR0cENsaWVudFNpbmsgKnNvdXBodHRwc2luayA9IEdTVF9TT1VQX0hUVFBfQ0xJRU5UX1NJTksgKHNpbmspOworCisgIEdTVF9ERUJVRyAoInN0b3AiKTsKKworICBpZiAoc291cGh0dHBzaW5rLT5wcm9wX3Nlc3Npb24gPT0gTlVMTCkgeworICAgIHNvdXBfc2Vzc2lvbl9hYm9ydCAoc291cGh0dHBzaW5rLT5zZXNzaW9uKTsKKyAgICBnX29iamVjdF91bnJlZiAoc291cGh0dHBzaW5rLT5zZXNzaW9uKTsKKyAgfQorCisgIGdfbXV0ZXhfbG9jayAoJnNvdXBodHRwc2luay0+bXV0ZXgpOworICBpZiAoc291cGh0dHBzaW5rLT50aW1lcikgeworICAgIGdfc291cmNlX2Rlc3Ryb3kgKHNvdXBodHRwc2luay0+dGltZXIpOworICAgIGdfc291cmNlX3VucmVmIChzb3VwaHR0cHNpbmstPnRpbWVyKTsKKyAgICBzb3VwaHR0cHNpbmstPnRpbWVyID0gTlVMTDsKKyAgfQorICBnX211dGV4X3VubG9jayAoJnNvdXBodHRwc2luay0+bXV0ZXgpOworCisgIGlmIChzb3VwaHR0cHNpbmstPmxvb3ApIHsKKyAgICBnX21haW5fbG9vcF9xdWl0IChzb3VwaHR0cHNpbmstPmxvb3ApOworICAgIGdfbXV0ZXhfbG9jayAoJnNvdXBodHRwc2luay0+bXV0ZXgpOworICAgIGdfY29uZF9zaWduYWwgKCZzb3VwaHR0cHNpbmstPmNvbmQpOworICAgIGdfbXV0ZXhfdW5sb2NrICgmc291cGh0dHBzaW5rLT5tdXRleCk7CisgICAgZ190aHJlYWRfam9pbiAoc291cGh0dHBzaW5rLT50aHJlYWQpOworICAgIGdfbWFpbl9sb29wX3VucmVmIChzb3VwaHR0cHNpbmstPmxvb3ApOworICAgIHNvdXBodHRwc2luay0+bG9vcCA9IE5VTEw7CisgIH0KKyAgaWYgKHNvdXBodHRwc2luay0+Y29udGV4dCkgeworICAgIGdfbWFpbl9jb250ZXh0X3VucmVmIChzb3VwaHR0cHNpbmstPmNvbnRleHQpOworICAgIHNvdXBodHRwc2luay0+Y29udGV4dCA9IE5VTEw7CisgIH0KKworICBnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX3Jlc2V0IChzb3VwaHR0cHNpbmspOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfdW5sb2NrIChHc3RCYXNlU2luayAqIHNpbmspCit7CisgIEdTVF9ERUJVRyAoInVubG9jayIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfZXZlbnQgKEdzdEJhc2VTaW5rICogc2luaywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0U291cEh0dHBDbGllbnRTaW5rICpzb3VwaHR0cHNpbmsgPSBHU1RfU09VUF9IVFRQX0NMSUVOVF9TSU5LIChzaW5rKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzb3VwaHR0cHNpbmssICJldmVudCIpOworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9FT1MpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzb3VwaHR0cHNpbmssICJnb3QgZW9zIik7CisgICAgZ19tdXRleF9sb2NrICgmc291cGh0dHBzaW5rLT5tdXRleCk7CisgICAgd2hpbGUgKHNvdXBodHRwc2luay0+bWVzc2FnZSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc291cGh0dHBzaW5rLCAid2FpdGluZyIpOworICAgICAgZ19jb25kX3dhaXQgKCZzb3VwaHR0cHNpbmstPmNvbmQsICZzb3VwaHR0cHNpbmstPm11dGV4KTsKKyAgICB9CisgICAgZ19tdXRleF91bmxvY2sgKCZzb3VwaHR0cHNpbmstPm11dGV4KTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzb3VwaHR0cHNpbmssICJmaW5pc2hlZCBlb3MiKTsKKyAgfQorCisgIHJldHVybiBHU1RfQkFTRV9TSU5LX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5ldmVudCAoc2luaywgZXZlbnQpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19wcmVyb2xsIChHc3RCYXNlU2luayAqIHNpbmssIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR1NUX0RFQlVHICgicHJlcm9sbCIpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfbWVzc2FnZV9sb2NrZWQgKEdzdFNvdXBIdHRwQ2xpZW50U2luayAqIHNvdXBodHRwc2luaykKK3sKKyAgR0xpc3QgKmc7CisgIGd1aW50NjQgbjsKKworICBpZiAoc291cGh0dHBzaW5rLT5xdWV1ZWRfYnVmZmVycyA9PSBOVUxMIHx8IHNvdXBodHRwc2luay0+bWVzc2FnZSkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8qIElmIHRoZSBVUkkgd2VudCBhd2F5LCBkcm9wIGFsbCB0aGVzZSBidWZmZXJzICovCisgIGlmIChzb3VwaHR0cHNpbmstPmxvY2F0aW9uID09IE5VTEwpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzb3VwaHR0cHNpbmssICJVUkkgd2VudCBhd2F5LCBkcm9wcGluZyBxdWV1ZWQgYnVmZmVycyIpOworICAgIGdfbGlzdF9mcmVlX2Z1bGwgKHNvdXBodHRwc2luay0+cXVldWVkX2J1ZmZlcnMsCisgICAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgICAgc291cGh0dHBzaW5rLT5xdWV1ZWRfYnVmZmVycyA9IE5VTEw7CisgICAgcmV0dXJuOworICB9CisKKyAgc291cGh0dHBzaW5rLT5tZXNzYWdlID0gc291cF9tZXNzYWdlX25ldyAoIlBVVCIsIHNvdXBodHRwc2luay0+bG9jYXRpb24pOworICBpZiAoc291cGh0dHBzaW5rLT5tZXNzYWdlID09IE5VTEwpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNvdXBodHRwc2luaywKKyAgICAgICAgIlVSSSBjb3VsZCBub3QgYmUgcGFyc2VkIHdoaWxlIGNyZWF0aW5nIG1lc3NhZ2UuIik7CisgICAgZ19saXN0X2ZyZWVfZnVsbCAoc291cGh0dHBzaW5rLT5xdWV1ZWRfYnVmZmVycywKKyAgICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX3VucmVmKTsKKyAgICBzb3VwaHR0cHNpbmstPnF1ZXVlZF9idWZmZXJzID0gTlVMTDsKKyAgICByZXR1cm47CisgIH0KKworICBzb3VwX21lc3NhZ2Vfc2V0X2ZsYWdzIChzb3VwaHR0cHNpbmstPm1lc3NhZ2UsCisgICAgICAoc291cGh0dHBzaW5rLT5hdXRvbWF0aWNfcmVkaXJlY3QgPyAwIDogU09VUF9NRVNTQUdFX05PX1JFRElSRUNUKSk7CisKKyAgaWYgKHNvdXBodHRwc2luay0+Y29va2llcykgeworICAgIGdjaGFyICoqY29va2llOworCisgICAgZm9yIChjb29raWUgPSBzb3VwaHR0cHNpbmstPmNvb2tpZXM7ICpjb29raWUgIT0gTlVMTDsgY29va2llKyspIHsKKyAgICAgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2FwcGVuZCAoc291cGh0dHBzaW5rLT5tZXNzYWdlLT5yZXF1ZXN0X2hlYWRlcnMsCisgICAgICAgICAgIkNvb2tpZSIsICpjb29raWUpOworICAgIH0KKyAgfQorCisgIG4gPSAwOworICBpZiAoc291cGh0dHBzaW5rLT5vZmZzZXQgPT0gMCkgeworICAgIGZvciAoZyA9IHNvdXBodHRwc2luay0+c3RyZWFtaGVhZGVyX2J1ZmZlcnM7IGc7IGcgPSBnX2xpc3RfbmV4dCAoZykpIHsKKyAgICAgIEdzdEJ1ZmZlciAqYnVmZmVyID0gZy0+ZGF0YTsKKyAgICAgIEdzdE1hcEluZm8gbWFwOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzb3VwaHR0cHNpbmssICJxdWV1ZWluZyBzdHJlYW0gaGVhZGVycyIpOworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIC8qIFN0cmVhbSBoZWFkZXJzIGFyZSB1cGRhdGVkIHdoZW5ldmVyIDo6c2V0X2NhcHMgaXMgY2FsbGVkLCBzbyB0aGVyZSdzCisgICAgICAgKiBubyBndWFyYW50ZWVzIGFib3V0IHRoZWlyIGxpZmV0aW1lIGFuZCB3ZSBhc2sgbGlic291cCB0byBjb3B5IHRoZW0gCisgICAgICAgKiBpbnRvIHRoZSBtZXNzYWdlIGJvZHkgd2l0aCBTT1VQX01FTU9SWV9DT1BZLiAqLworICAgICAgc291cF9tZXNzYWdlX2JvZHlfYXBwZW5kIChzb3VwaHR0cHNpbmstPm1lc3NhZ2UtPnJlcXVlc3RfYm9keSwKKyAgICAgICAgICBTT1VQX01FTU9SWV9DT1BZLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAgICAgbiArPSBtYXAuc2l6ZTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgfQorICB9CisKKyAgZm9yIChnID0gc291cGh0dHBzaW5rLT5xdWV1ZWRfYnVmZmVyczsgZzsgZyA9IGdfbGlzdF9uZXh0IChnKSkgeworICAgIEdzdEJ1ZmZlciAqYnVmZmVyID0gZy0+ZGF0YTsKKyAgICBpZiAoIUdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0hFQURFUikpIHsKKyAgICAgIEdzdE1hcEluZm8gbWFwOworCisgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgLyogUXVldWVkIGJ1ZmZlcnMgYXJlIG9ubHkgZnJlZWQgaW4gdGhlIG5leHQgaXRlcmF0aW9uIG9mIHRoZSBtYWlubG9vcAorICAgICAgICogYWZ0ZXIgdGhlIG1lc3NhZ2UgYm9keSBoYXMgYmVlbiB3cml0dGVuIG91dCwgc28gd2UgZG9uJ3QgbmVlZCBsaWJzb3VwCisgICAgICAgKiB0byBjb3B5IHRob3NlIHdoaWxlIGFwcGVuZGluZyB0byB0aGUgYm9keS4gSG93ZXZlciwgaWYgdGhlIGJ1ZmZlciBpcworICAgICAgICogdXNlZCBlbHNld2hlcmUsIGl0IHNob3VsZCBiZSBjb3BpZWQuIEhlbmNlLCBTT1VQX01FTU9SWV9URU1QT1JBUlkuICovCisgICAgICBzb3VwX21lc3NhZ2VfYm9keV9hcHBlbmQgKHNvdXBodHRwc2luay0+bWVzc2FnZS0+cmVxdWVzdF9ib2R5LAorICAgICAgICAgIFNPVVBfTUVNT1JZX1RFTVBPUkFSWSwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICAgIG4gKz0gbWFwLnNpemU7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIH0KKyAgfQorCisgIGlmIChzb3VwaHR0cHNpbmstPm9mZnNldCAhPSAwKSB7CisgICAgY2hhciAqczsKKyAgICBzID0gZ19zdHJkdXBfcHJpbnRmICgiYnl0ZXMgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLSUiIEdfR1VJTlQ2NF9GT1JNQVQgIi8qIiwKKyAgICAgICAgc291cGh0dHBzaW5rLT5vZmZzZXQsIHNvdXBodHRwc2luay0+b2Zmc2V0ICsgbiAtIDEpOworICAgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2FwcGVuZCAoc291cGh0dHBzaW5rLT5tZXNzYWdlLT5yZXF1ZXN0X2hlYWRlcnMsCisgICAgICAgICJDb250ZW50LVJhbmdlIiwgcyk7CisgICAgZ19mcmVlIChzKTsKKyAgfQorCisgIGlmIChuID09IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzb3VwaHR0cHNpbmssCisgICAgICAgICJ0b3RhbCBzaXplIG9mIGJ1ZmZlcnMgcXVldWVkIGlzIDAsIGZyZWVpbmcgZXZlcnl0aGluZyIpOworICAgIGdfbGlzdF9mcmVlX2Z1bGwgKHNvdXBodHRwc2luay0+cXVldWVkX2J1ZmZlcnMsCisgICAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgICAgc291cGh0dHBzaW5rLT5xdWV1ZWRfYnVmZmVycyA9IE5VTEw7CisgICAgZ19vYmplY3RfdW5yZWYgKHNvdXBodHRwc2luay0+bWVzc2FnZSk7CisgICAgc291cGh0dHBzaW5rLT5tZXNzYWdlID0gTlVMTDsKKyAgICByZXR1cm47CisgIH0KKworICBzb3VwaHR0cHNpbmstPnNlbnRfYnVmZmVycyA9IHNvdXBodHRwc2luay0+cXVldWVkX2J1ZmZlcnM7CisgIHNvdXBodHRwc2luay0+cXVldWVkX2J1ZmZlcnMgPSBOVUxMOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNvdXBodHRwc2luaywKKyAgICAgICJxdWV1ZSBtZXNzYWdlICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgc291cGh0dHBzaW5rLT5vZmZzZXQsIG4pOworICBzb3VwX3Nlc3Npb25fcXVldWVfbWVzc2FnZSAoc291cGh0dHBzaW5rLT5zZXNzaW9uLCBzb3VwaHR0cHNpbmstPm1lc3NhZ2UsCisgICAgICBjYWxsYmFjaywgc291cGh0dHBzaW5rKTsKKworICBzb3VwaHR0cHNpbmstPm9mZnNldCArPSBuOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3NlbmRfbWVzc2FnZSAoR3N0U291cEh0dHBDbGllbnRTaW5rICogc291cGh0dHBzaW5rKQoreworICBnX211dGV4X2xvY2sgKCZzb3VwaHR0cHNpbmstPm11dGV4KTsKKyAgc2VuZF9tZXNzYWdlX2xvY2tlZCAoc291cGh0dHBzaW5rKTsKKyAgaWYgKHNvdXBodHRwc2luay0+dGltZXIpIHsKKyAgICBnX3NvdXJjZV9kZXN0cm95IChzb3VwaHR0cHNpbmstPnRpbWVyKTsKKyAgICBnX3NvdXJjZV91bnJlZiAoc291cGh0dHBzaW5rLT50aW1lcik7CisgICAgc291cGh0dHBzaW5rLT50aW1lciA9IE5VTEw7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZzb3VwaHR0cHNpbmstPm11dGV4KTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitjYWxsYmFjayAoU291cFNlc3Npb24gKiBzZXNzaW9uLCBTb3VwTWVzc2FnZSAqIG1zZywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RTb3VwSHR0cENsaWVudFNpbmsgKnNvdXBodHRwc2luayA9IEdTVF9TT1VQX0hUVFBfQ0xJRU5UX1NJTksgKHVzZXJfZGF0YSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc291cGh0dHBzaW5rLCAiY2FsbGJhY2sgc3RhdHVzPSVkICVzIiwKKyAgICAgIG1zZy0+c3RhdHVzX2NvZGUsIG1zZy0+cmVhc29uX3BocmFzZSk7CisKKyAgZ19tdXRleF9sb2NrICgmc291cGh0dHBzaW5rLT5tdXRleCk7CisgIGdfY29uZF9zaWduYWwgKCZzb3VwaHR0cHNpbmstPmNvbmQpOworICBzb3VwaHR0cHNpbmstPm1lc3NhZ2UgPSBOVUxMOworCisgIGlmICghU09VUF9TVEFUVVNfSVNfU1VDQ0VTU0ZVTCAobXNnLT5zdGF0dXNfY29kZSkpIHsKKyAgICBzb3VwaHR0cHNpbmstPmZhaWx1cmVzKys7CisgICAgaWYgKHNvdXBodHRwc2luay0+cmV0cmllcyAmJgorICAgICAgICAoc291cGh0dHBzaW5rLT5yZXRyaWVzIDwgMCB8fAorICAgICAgICAgICAgc291cGh0dHBzaW5rLT5yZXRyaWVzID49IHNvdXBodHRwc2luay0+ZmFpbHVyZXMpKSB7CisgICAgICBndWludDY0IHJldHJ5X2RlbGF5OworICAgICAgY29uc3QgY2hhciAqcmV0cnlfYWZ0ZXIgPQorICAgICAgICAgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2dldF9vbmUgKG1zZy0+cmVzcG9uc2VfaGVhZGVycywKKyAgICAgICAgICAiUmV0cnktQWZ0ZXIiKTsKKyAgICAgIGlmIChyZXRyeV9hZnRlcikgeworICAgICAgICBnY2hhciAqZW5kID0gTlVMTDsKKyAgICAgICAgcmV0cnlfZGVsYXkgPSBnX2FzY2lpX3N0cnRvdWxsIChyZXRyeV9hZnRlciwgJmVuZCwgMTApOworICAgICAgICBpZiAoZW5kIHx8IGVycm5vKSB7CisgICAgICAgICAgcmV0cnlfZGVsYXkgPSBzb3VwaHR0cHNpbmstPnJldHJ5X2RlbGF5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHJ5X2RlbGF5ID0gTUFYIChyZXRyeV9kZWxheSwgc291cGh0dHBzaW5rLT5yZXRyeV9kZWxheSk7CisgICAgICAgIH0KKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzb3VwaHR0cHNpbmssICJDb3VsZCBub3Qgd3JpdGUgdG8gSFRUUCBVUkk6ICIKKyAgICAgICAgICAgICJzdGF0dXM6ICVkICVzIChyZXRyeWluZyBQVVQgYWZ0ZXIgJSIgR19HSU5UNjRfRk9STUFUCisgICAgICAgICAgICAiIHNlY29uZHMgd2l0aCBSZXRyeS1BZnRlcjogJXMpIiwgbXNnLT5zdGF0dXNfY29kZSwKKyAgICAgICAgICAgIG1zZy0+cmVhc29uX3BocmFzZSwgcmV0cnlfZGVsYXksIHJldHJ5X2FmdGVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHJ5X2RlbGF5ID0gc291cGh0dHBzaW5rLT5yZXRyeV9kZWxheTsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzb3VwaHR0cHNpbmssICJDb3VsZCBub3Qgd3JpdGUgdG8gSFRUUCBVUkk6ICIKKyAgICAgICAgICAgICJzdGF0dXM6ICVkICVzIChyZXRyeWluZyBQVVQgYWZ0ZXIgJSIgR19HSU5UNjRfRk9STUFUCisgICAgICAgICAgICAiIHNlY29uZHMpIiwgbXNnLT5zdGF0dXNfY29kZSwgbXNnLT5yZWFzb25fcGhyYXNlLCByZXRyeV9kZWxheSk7CisgICAgICB9CisgICAgICBzb3VwaHR0cHNpbmstPnRpbWVyID0gZ190aW1lb3V0X3NvdXJjZV9uZXdfc2Vjb25kcyAocmV0cnlfZGVsYXkpOworICAgICAgZ19zb3VyY2Vfc2V0X2NhbGxiYWNrIChzb3VwaHR0cHNpbmstPnRpbWVyLCAoR1NvdXJjZUZ1bmMpIChzZW5kX21lc3NhZ2UpLAorICAgICAgICAgIHNvdXBodHRwc2luaywgTlVMTCk7CisgICAgICBnX3NvdXJjZV9hdHRhY2ggKHNvdXBodHRwc2luay0+dGltZXIsIHNvdXBodHRwc2luay0+Y29udGV4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNvdXBodHRwc2luay0+c3RhdHVzX2NvZGUgPSBtc2ctPnN0YXR1c19jb2RlOworICAgICAgc291cGh0dHBzaW5rLT5yZWFzb25fcGhyYXNlID0gZ19zdHJkdXAgKG1zZy0+cmVhc29uX3BocmFzZSk7CisgICAgfQorICAgIGdfbXV0ZXhfdW5sb2NrICgmc291cGh0dHBzaW5rLT5tdXRleCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZ19saXN0X2ZyZWVfZnVsbCAoc291cGh0dHBzaW5rLT5zZW50X2J1ZmZlcnMsCisgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9idWZmZXJfdW5yZWYpOworICBzb3VwaHR0cHNpbmstPnNlbnRfYnVmZmVycyA9IE5VTEw7CisgIHNvdXBodHRwc2luay0+ZmFpbHVyZXMgPSAwOworCisgIHNlbmRfbWVzc2FnZV9sb2NrZWQgKHNvdXBodHRwc2luayk7CisgIGdfbXV0ZXhfdW5sb2NrICgmc291cGh0dHBzaW5rLT5tdXRleCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfc291cF9odHRwX2NsaWVudF9zaW5rX3JlbmRlciAoR3N0QmFzZVNpbmsgKiBzaW5rLCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFNvdXBIdHRwQ2xpZW50U2luayAqc291cGh0dHBzaW5rID0gR1NUX1NPVVBfSFRUUF9DTElFTlRfU0lOSyAoc2luayk7CisgIEdTb3VyY2UgKnNvdXJjZTsKKyAgZ2Jvb2xlYW4gd2FrZTsKKworICBpZiAoc291cGh0dHBzaW5rLT5zdGF0dXNfY29kZSAhPSAwKSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNvdXBodHRwc2luaywgUkVTT1VSQ0UsIFdSSVRFLAorICAgICAgICAoIkNvdWxkIG5vdCB3cml0ZSB0byBIVFRQIFVSSSIpLAorICAgICAgICAoInN0YXR1czogJWQgJXMiLCBzb3VwaHR0cHNpbmstPnN0YXR1c19jb2RlLAorICAgICAgICAgICAgc291cGh0dHBzaW5rLT5yZWFzb25fcGhyYXNlKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgZ19tdXRleF9sb2NrICgmc291cGh0dHBzaW5rLT5tdXRleCk7CisgIGlmIChzb3VwaHR0cHNpbmstPmxvY2F0aW9uICE9IE5VTEwpIHsKKyAgICB3YWtlID0gKHNvdXBodHRwc2luay0+cXVldWVkX2J1ZmZlcnMgPT0gTlVMTCk7CisgICAgc291cGh0dHBzaW5rLT5xdWV1ZWRfYnVmZmVycyA9CisgICAgICAgIGdfbGlzdF9hcHBlbmQgKHNvdXBodHRwc2luay0+cXVldWVkX2J1ZmZlcnMsIGdzdF9idWZmZXJfcmVmIChidWZmZXIpKTsKKworICAgIGlmICh3YWtlKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzb3VwaHR0cHNpbmssICJzZXR0aW5nIGNhbGxiYWNrIGZvciBuZXcgYnVmZmVycyIpOworICAgICAgc291cmNlID0gZ19pZGxlX3NvdXJjZV9uZXcgKCk7CisgICAgICBnX3NvdXJjZV9zZXRfY2FsbGJhY2sgKHNvdXJjZSwgKEdTb3VyY2VGdW5jKSAoc2VuZF9tZXNzYWdlKSwKKyAgICAgICAgICBzb3VwaHR0cHNpbmssIE5VTEwpOworICAgICAgZ19zb3VyY2VfYXR0YWNoIChzb3VyY2UsIHNvdXBodHRwc2luay0+Y29udGV4dCk7CisgICAgICBnX3NvdXJjZV91bnJlZiAoc291cmNlKTsKKyAgICB9CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZzb3VwaHR0cHNpbmstPm11dGV4KTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyB2b2lkCithdXRoZW50aWNhdGUgKFNvdXBTZXNzaW9uICogc2Vzc2lvbiwgU291cE1lc3NhZ2UgKiBtc2csCisgICAgU291cEF1dGggKiBhdXRoLCBnYm9vbGVhbiByZXRyeWluZywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RTb3VwSHR0cENsaWVudFNpbmsgKnNvdXBodHRwc2luayA9IEdTVF9TT1VQX0hUVFBfQ0xJRU5UX1NJTksgKHVzZXJfZGF0YSk7CisKKyAgaWYgKCFyZXRyeWluZykgeworICAgIC8qIEZpcnN0IHRpbWUgYXV0aGVudGljYXRpb24gb25seSwgaWYgd2UgZmFpbCBhbmQgYXJlIGNhbGxlZCBhZ2FpbiB3aXRoIHJldHJ5IHRydWUgZmFsbCB0aHJvdWdoICovCisgICAgaWYgKG1zZy0+c3RhdHVzX2NvZGUgPT0gU09VUF9TVEFUVVNfVU5BVVRIT1JJWkVEKSB7CisgICAgICBpZiAoc291cGh0dHBzaW5rLT51c2VyX2lkICYmIHNvdXBodHRwc2luay0+dXNlcl9wdykKKyAgICAgICAgc291cF9hdXRoX2F1dGhlbnRpY2F0ZSAoYXV0aCwgc291cGh0dHBzaW5rLT51c2VyX2lkLAorICAgICAgICAgICAgc291cGh0dHBzaW5rLT51c2VyX3B3KTsKKyAgICB9IGVsc2UgaWYgKG1zZy0+c3RhdHVzX2NvZGUgPT0gU09VUF9TVEFUVVNfUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQpIHsKKyAgICAgIGlmIChzb3VwaHR0cHNpbmstPnByb3h5X2lkICYmIHNvdXBodHRwc2luay0+cHJveHlfcHcpCisgICAgICAgIHNvdXBfYXV0aF9hdXRoZW50aWNhdGUgKGF1dGgsIHNvdXBodHRwc2luay0+cHJveHlfaWQsCisgICAgICAgICAgICBzb3VwaHR0cHNpbmstPnByb3h5X3B3KTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5oIGIvZXh0L3NvdXAvZ3N0c291cGh0dHBjbGllbnRzaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljNDUwMAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zb3VwL2dzdHNvdXBodHRwY2xpZW50c2luay5oCkBAIC0wLDAgKzEsODUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDExIERhdmlkIFNjaGxlZWYgPGRzQGVudHJvcHl3YXZlLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9HU1RfU09VUF9IVFRQX0NMSUVOVF9TSU5LX0hfCisjZGVmaW5lIF9HU1RfU09VUF9IVFRQX0NMSUVOVF9TSU5LX0hfCisKKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlc2luay5oPgorI2luY2x1ZGUgPGxpYnNvdXAvc291cC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfU09VUF9IVFRQX0NMSUVOVF9TSU5LICAgICAgICAgICAoZ3N0X3NvdXBfaHR0cF9jbGllbnRfc2lua19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfU09VUF9IVFRQX0NMSUVOVF9TSU5LKG9iaikgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9TT1VQX0hUVFBfQ0xJRU5UX1NJTkssR3N0U291cEh0dHBDbGllbnRTaW5rKSkKKyNkZWZpbmUgR1NUX1NPVVBfSFRUUF9DTElFTlRfU0lOS19DTEFTUyhrbGFzcykgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9TT1VQX0hUVFBfQ0xJRU5UX1NJTkssR3N0U291cEh0dHBDbGllbnRTaW5rQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfU09VUF9IVFRQX0NMSUVOVF9TSU5LKG9iaikgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9TT1VQX0hUVFBfQ0xJRU5UX1NJTkspKQorI2RlZmluZSBHU1RfSVNfU09VUF9IVFRQX0NMSUVOVF9TSU5LX0NMQVNTKG9iaikgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1NPVVBfSFRUUF9DTElFTlRfU0lOSykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RTb3VwSHR0cENsaWVudFNpbmsgR3N0U291cEh0dHBDbGllbnRTaW5rOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNvdXBIdHRwQ2xpZW50U2lua0NsYXNzIEdzdFNvdXBIdHRwQ2xpZW50U2lua0NsYXNzOworCitzdHJ1Y3QgX0dzdFNvdXBIdHRwQ2xpZW50U2luaworeworICBHc3RCYXNlU2luayBiYXNlX3NvdXBodHRwc2luazsKKworICBHTXV0ZXggbXV0ZXg7CisgIEdDb25kIGNvbmQ7CisgIEdNYWluQ29udGV4dCAqY29udGV4dDsKKyAgR01haW5Mb29wICpsb29wOworICBHVGhyZWFkICp0aHJlYWQ7CisgIEdTb3VyY2UgKnRpbWVyOworICBTb3VwTWVzc2FnZSAqbWVzc2FnZTsKKyAgU291cFNlc3Npb24gKnNlc3Npb247CisgIEdMaXN0ICpxdWV1ZWRfYnVmZmVyczsKKyAgR0xpc3QgKnNlbnRfYnVmZmVyczsKKyAgR0xpc3QgKnN0cmVhbWhlYWRlcl9idWZmZXJzOworCisgIGludCBzdGF0dXNfY29kZTsKKyAgY2hhciAqcmVhc29uX3BocmFzZTsKKworICBndWludDY0IG9mZnNldDsKKyAgaW50IHRpbWVvdXQ7CisgIGdpbnQgZmFpbHVyZXM7CisKKyAgLyogcHJvcGVydGllcyAqLworICBTb3VwU2Vzc2lvbiAqcHJvcF9zZXNzaW9uOworICBjaGFyICpsb2NhdGlvbjsKKyAgY2hhciAqdXNlcl9pZDsKKyAgY2hhciAqdXNlcl9wdzsKKyAgU291cFVSSSAqcHJveHk7CisgIGNoYXIgKnByb3h5X2lkOworICBjaGFyICpwcm94eV9wdzsKKyAgY2hhciAqdXNlcl9hZ2VudDsKKyAgZ2Jvb2xlYW4gYXV0b21hdGljX3JlZGlyZWN0OworICBnY2hhciAqKmNvb2tpZXM7CisgIFNvdXBMb2dnZXJMb2dMZXZlbCBsb2dfbGV2ZWw7CisgIGdpbnQgcmV0cnlfZGVsYXk7CisgIGdpbnQgcmV0cmllczsKK307CisKK3N0cnVjdCBfR3N0U291cEh0dHBDbGllbnRTaW5rQ2xhc3MKK3sKKyAgR3N0QmFzZVNpbmtDbGFzcyBiYXNlX3NvdXBodHRwc2lua19jbGFzczsKK307CisKK0dUeXBlIGdzdF9zb3VwX2h0dHBfY2xpZW50X3NpbmtfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmMgYi9leHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NjQyZTMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jCkBAIC0wLDAgKzEsMjE3OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBXb3V0ZXIgQ2xvZXRlbnMgPHdvdXRlckBtaW5kLmJlPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtc291cGh0dHBzcmMKKyAqCisgKiBUaGlzIHBsdWdpbiByZWFkcyBkYXRhIGZyb20gYSByZW1vdGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IGEgVVJJLgorICogU3VwcG9ydGVkIHByb3RvY29scyBhcmUgJ2h0dHAnLCAnaHR0cHMnLgorICoKKyAqIEFuIEhUVFAgcHJveHkgbXVzdCBiZSBzcGVjaWZpZWQgYnkgaXRzIFVSTC4KKyAqIElmIHRoZSAiaHR0cF9wcm94eSIgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LCBpdHMgdmFsdWUgaXMgdXNlZC4KKyAqIElmIGJ1aWx0IHdpdGggbGlic291cCdzIEdOT01FIGludGVncmF0aW9uIGZlYXR1cmVzLCB0aGUgR05PTUUgcHJveHkKKyAqIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSB1c2VkLCBvciBmYWlsaW5nIHRoYXQsIHByb3h5IGF1dG9kZXRlY3Rpb24uCisgKiBUaGUgI0dzdFNvdXBIVFRQU3JjOnByb3h5IHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0LgorICoKKyAqIEluIGNhc2UgdGhlICNHc3RTb3VwSFRUUFNyYzppcmFkaW8tbW9kZSBwcm9wZXJ0eSBpcyBzZXQgYW5kIHRoZSBsb2NhdGlvbiBpcworICogYW4gSFRUUCByZXNvdXJjZSwgc291cGh0dHBzcmMgd2lsbCBzZW5kIHNwZWNpYWwgSWNlY2FzdCBIVFRQIGhlYWRlcnMgdG8gdGhlCisgKiBzZXJ2ZXIgdG8gcmVxdWVzdCBhZGRpdGlvbmFsIEljZWNhc3QgbWV0YS1pbmZvcm1hdGlvbi4KKyAqIElmIHRoZSBzZXJ2ZXIgaXMgbm90IGFuIEljZWNhc3Qgc2VydmVyLCBpdCB3aWxsIGJlaGF2ZSBhcyBpZiB0aGUKKyAqICNHc3RTb3VwSFRUUFNyYzppcmFkaW8tbW9kZSBwcm9wZXJ0eSB3ZXJlIG5vdCBzZXQuIElmIGl0IGlzLCBzb3VwaHR0cHNyYyB3aWxsCisgKiBvdXRwdXQgZGF0YSB3aXRoIGEgbWVkaWEgdHlwZSBvZiBhcHBsaWNhdGlvbi94LWljeSwgaW4gd2hpY2ggY2FzZSB5b3Ugd2lsbAorICogbmVlZCB0byB1c2UgdGhlICNJQ1lEZW11eCBlbGVtZW50IGFzIGZvbGxvdy11cCBlbGVtZW50IHRvIGV4dHJhY3QgdGhlIEljZWNhc3QKKyAqIG1ldGFkYXRhIGFuZCB0byBkZXRlcm1pbmUgdGhlIHVuZGVybHlpbmcgbWVkaWEgdHlwZS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgc291cGh0dHBzcmMgbG9jYXRpb249aHR0cHM6Ly9zb21lLnNlcnZlci5vcmcvaW5kZXguaHRtbAorICogICAgICEgZmlsZXNpbmsgbG9jYXRpb249L2hvbWUvam9lL3NlcnZlci5odG1sCisgKiBdfCBUaGUgYWJvdmUgcGlwZWxpbmUgcmVhZHMgYSB3ZWIgcGFnZSBmcm9tIGEgc2VydmVyIHVzaW5nIHRoZSBIVFRQUyBwcm90b2NvbAorICogYW5kIHdyaXRlcyBpdCB0byBhIGxvY2FsIGZpbGUuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgc291cGh0dHBzcmMgdXNlci1hZ2VudD0iRm9vUGxheWVyIDAuOTkgYmV0YSIKKyAqICAgICBhdXRvbWF0aWMtcmVkaXJlY3Q9ZmFsc2UgcHJveHk9aHR0cDovL3Byb3h5LmludHJhbmV0LmxvY2FsOjgwODAKKyAqICAgICBsb2NhdGlvbj1odHRwOi8vbXVzaWMuZm9vYmFyLmNvbS9kZW1vLm1wMyAhIG1wZ2F1ZGlvcGFyc2UKKyAqICAgICAhIG1wZzEyM2F1ZGlvZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIGF1dG9hdWRpb3NpbmsKKyAqIF18IFRoZSBhYm92ZSBwaXBlbGluZSB3aWxsIHJlYWQgYW5kIGRlY29kZSBhbmQgcGxheSBhbiBtcDMgZmlsZSBmcm9tIGEKKyAqIHdlYiBzZXJ2ZXIgdXNpbmcgdGhlIEhUVFAgcHJvdG9jb2wuIElmIHRoZSBzZXJ2ZXIgc2VuZHMgcmVkaXJlY3RzLAorICogdGhlIHJlcXVlc3QgZmFpbHMgaW5zdGVhZCBvZiBmb2xsb3dpbmcgdGhlIHJlZGlyZWN0LiBUaGUgc3BlY2lmaWVkCisgKiBIVFRQIHByb3h5IHNlcnZlciBpcyB1c2VkLiBUaGUgVXNlci1BZ2VudCBIVFRQIHJlcXVlc3QgaGVhZGVyCisgKiBpcyBzZXQgdG8gYSBjdXN0b20gc3RyaW5nIGluc3RlYWQgb2YgIkdTdHJlYW1lciBzb3VwaHR0cHNyYy4iCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgc291cGh0dHBzcmMgbG9jYXRpb249aHR0cDovLzEwLjExLjEyLjEzL21qcGVnCisgKiAgICAgZG8tdGltZXN0YW1wPXRydWUgISBtdWx0aXBhcnRkZW11eAorICogICAgICEgaW1hZ2UvanBlZyx3aWR0aD02NDAsaGVpZ2h0PTQ4MCAhIG1hdHJvc2thbXV4CisgKiAgICAgISBmaWxlc2luayBsb2NhdGlvbj1tanBlZy5ta3YKKyAqIF18IFRoZSBhYm92ZSBwaXBlbGluZSByZWFkcyBhIG1vdGlvbiBKUEVHIHN0cmVhbSBmcm9tIGFuIElQIGNhbWVyYQorICogdXNpbmcgdGhlIEhUVFAgcHJvdG9jb2wsIGVuY29kZWQgYXMgbWltZS9tdWx0aXBhcnQgaW1hZ2UvanBlZworICogcGFydHMsIGFuZCB3cml0ZXMgYSBNYXRyb3NrYSBtb3Rpb24gSlBFRyBmaWxlLiBUaGUgd2lkdGggYW5kCisgKiBoZWlnaHQgcHJvcGVydGllcyBhcmUgc2V0IGluIHRoZSBjYXBzIHRvIHByb3ZpZGUgdGhlIE1hdHJvc2thCisgKiBtdWx0aXBsZXhlciB3aXRoIHRoZSBpbmZvcm1hdGlvbiB0byBzZXQgdGhpcyBpbiB0aGUgaGVhZGVyLgorICogVGltZXN0YW1wcyBhcmUgc2V0IG9uIHRoZSBidWZmZXJzIGFzIHRoZXkgYXJyaXZlIGZyb20gdGhlIGNhbWVyYS4KKyAqIFRoZXNlIGFyZSB1c2VkIGJ5IHRoZSBtaW1lL211bHRpcGFydCBkZW11bHRpcGxleGVyIHRvIGVtaXQgdGltZXN0YW1wcworICogb24gdGhlIEpQRUctZW5jb2RlZCB2aWRlbyBmcmFtZSBidWZmZXJzLiBUaGlzIGFsbG93cyB0aGUgTWF0cm9za2EKKyAqIG11bHRpcGxleGVyIHRvIHRpbWVzdGFtcCB0aGUgZnJhbWVzIGluIHRoZSByZXN1bHRpbmcgZmlsZS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgICAgICAgICAgICAvKiBhdG9pKCkgKi8KKyNlbmRpZgorI2luY2x1ZGUgPGdzdC9nc3RlbGVtZW50Lmg+CisjaW5jbHVkZSA8Z3N0L2dzdC1pMThuLXBsdWdpbi5oPgorI2luY2x1ZGUgPGxpYnNvdXAvc291cC5oPgorI2luY2x1ZGUgImdzdHNvdXBodHRwc3JjLmgiCisjaW5jbHVkZSAiZ3N0c291cHV0aWxzLmgiCisKKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChzb3VwaHR0cHNyY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBzb3VwaHR0cHNyY19kZWJ1ZworCisjZGVmaW5lIEdTVF9TT1VQX1NFU1NJT05fQ09OVEVYVCAiZ3N0LnNvdXAuc2Vzc2lvbiIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MT0NBVElPTiwKKyAgUFJPUF9JU19MSVZFLAorICBQUk9QX1VTRVJfQUdFTlQsCisgIFBST1BfQVVUT01BVElDX1JFRElSRUNULAorICBQUk9QX1BST1hZLAorICBQUk9QX1VTRVJfSUQsCisgIFBST1BfVVNFUl9QVywKKyAgUFJPUF9QUk9YWV9JRCwKKyAgUFJPUF9QUk9YWV9QVywKKyAgUFJPUF9DT09LSUVTLAorICBQUk9QX0lSQURJT19NT0RFLAorICBQUk9QX1RJTUVPVVQsCisgIFBST1BfRVhUUkFfSEVBREVSUywKKyAgUFJPUF9TT1VQX0xPR19MRVZFTCwKKyAgUFJPUF9DT01QUkVTUywKKyAgUFJPUF9LRUVQX0FMSVZFLAorICBQUk9QX1NTTF9TVFJJQ1QsCisgIFBST1BfU1NMX0NBX0ZJTEUsCisgIFBST1BfU1NMX1VTRV9TWVNURU1fQ0FfRklMRSwKKyAgUFJPUF9UTFNfREFUQUJBU0UsCisgIFBST1BfUkVUUklFUywKKyAgUFJPUF9NRVRIT0QsCisgIFBST1BfVExTX0lOVEVSQUNUSU9OLAorfTsKKworI2RlZmluZSBERUZBVUxUX1VTRVJfQUdFTlQgICAgICAgICAgICJHU3RyZWFtZXIgc291cGh0dHBzcmMgIiBQQUNLQUdFX1ZFUlNJT04gIiAiCisjZGVmaW5lIERFRkFVTFRfSVJBRElPX01PREUgICAgICAgICAgVFJVRQorI2RlZmluZSBERUZBVUxUX1NPVVBfTE9HX0xFVkVMICAgICAgIFNPVVBfTE9HR0VSX0xPR19IRUFERVJTCisjZGVmaW5lIERFRkFVTFRfQ09NUFJFU1MgICAgICAgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9LRUVQX0FMSVZFICAgICAgICAgICBUUlVFCisjZGVmaW5lIERFRkFVTFRfU1NMX1NUUklDVCAgICAgICAgICAgVFJVRQorI2RlZmluZSBERUZBVUxUX1NTTF9DQV9GSUxFICAgICAgICAgIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9TU0xfVVNFX1NZU1RFTV9DQV9GSUxFIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9UTFNfREFUQUJBU0UgICAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfVExTX0lOVEVSQUNUSU9OICAgICAgTlVMTAorI2RlZmluZSBERUZBVUxUX1RJTUVPVVQgICAgICAgICAgICAgIDE1CisjZGVmaW5lIERFRkFVTFRfUkVUUklFUyAgICAgICAgICAgICAgMworI2RlZmluZSBERUZBVUxUX1NPVVBfTUVUSE9EICAgICAgICAgIE5VTEwKKworI2RlZmluZSBHUk9XX0JMT0NLU0laRV9MSU1JVCAxCisjZGVmaW5lIEdST1dfQkxPQ0tTSVpFX0NPVU5UIDEKKyNkZWZpbmUgR1JPV19CTE9DS1NJWkVfRkFDVE9SIDIKKyNkZWZpbmUgUkVEVUNFX0JMT0NLU0laRV9MSU1JVCAwLjIwCisjZGVmaW5lIFJFRFVDRV9CTE9DS1NJWkVfQ09VTlQgMgorI2RlZmluZSBSRURVQ0VfQkxPQ0tTSVpFX0ZBQ1RPUiAwLjUKKworc3RhdGljIHZvaWQgZ3N0X3NvdXBfaHR0cF9zcmNfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwKKyAgICBncG9pbnRlciBpZmFjZV9kYXRhKTsKK3N0YXRpYyB2b2lkIGdzdF9zb3VwX2h0dHBfc3JjX2ZpbmFsaXplIChHT2JqZWN0ICogZ29iamVjdCk7CitzdGF0aWMgdm9pZCBnc3Rfc291cF9odHRwX3NyY19kaXNwb3NlIChHT2JqZWN0ICogZ29iamVjdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9zb3VwX2h0dHBfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9zb3VwX2h0dHBfc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9zb3VwX2h0dHBfc3JjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgdm9pZCBnc3Rfc291cF9odHRwX3NyY19zZXRfY29udGV4dCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0Q29udGV4dCAqIGNvbnRleHQpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3NvdXBfaHR0cF9zcmNfY3JlYXRlIChHc3RQdXNoU3JjICogcHNyYywKKyAgICBHc3RCdWZmZXIgKiogb3V0YnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc291cF9odHRwX3NyY19zdGFydCAoR3N0QmFzZVNyYyAqIGJzcmMpOworc3RhdGljIGdib29sZWFuIGdzdF9zb3VwX2h0dHBfc3JjX3N0b3AgKEdzdEJhc2VTcmMgKiBic3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc291cF9odHRwX3NyY19nZXRfc2l6ZSAoR3N0QmFzZVNyYyAqIGJzcmMsIGd1aW50NjQgKiBzaXplKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc291cF9odHRwX3NyY19pc19zZWVrYWJsZSAoR3N0QmFzZVNyYyAqIGJzcmMpOworc3RhdGljIGdib29sZWFuIGdzdF9zb3VwX2h0dHBfc3JjX2RvX3NlZWsgKEdzdEJhc2VTcmMgKiBic3JjLAorICAgIEdzdFNlZ21lbnQgKiBzZWdtZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc291cF9odHRwX3NyY19xdWVyeSAoR3N0QmFzZVNyYyAqIGJzcmMsIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIGdib29sZWFuIGdzdF9zb3VwX2h0dHBfc3JjX3VubG9jayAoR3N0QmFzZVNyYyAqIGJzcmMpOworc3RhdGljIGdib29sZWFuIGdzdF9zb3VwX2h0dHBfc3JjX3VubG9ja19zdG9wIChHc3RCYXNlU3JjICogYnNyYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NvdXBfaHR0cF9zcmNfc2V0X2xvY2F0aW9uIChHc3RTb3VwSFRUUFNyYyAqIHNyYywKKyAgICBjb25zdCBnY2hhciAqIHVyaSwgR0Vycm9yICoqIGVycm9yKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc291cF9odHRwX3NyY19zZXRfcHJveHkgKEdzdFNvdXBIVFRQU3JjICogc3JjLAorICAgIGNvbnN0IGdjaGFyICogdXJpKTsKK3N0YXRpYyBjaGFyICpnc3Rfc291cF9odHRwX3NyY191bmljb2RpZnkgKGNvbnN0IGNoYXIgKnN0cik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NvdXBfaHR0cF9zcmNfYnVpbGRfbWVzc2FnZSAoR3N0U291cEhUVFBTcmMgKiBzcmMsCisgICAgY29uc3QgZ2NoYXIgKiBtZXRob2QpOworc3RhdGljIHZvaWQgZ3N0X3NvdXBfaHR0cF9zcmNfY2FuY2VsX21lc3NhZ2UgKEdzdFNvdXBIVFRQU3JjICogc3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc291cF9odHRwX3NyY19hZGRfcmFuZ2VfaGVhZGVyIChHc3RTb3VwSFRUUFNyYyAqIHNyYywKKyAgICBndWludDY0IG9mZnNldCwgZ3VpbnQ2NCBzdG9wX29mZnNldCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NvdXBfaHR0cF9zcmNfc2Vzc2lvbl9vcGVuIChHc3RTb3VwSFRUUFNyYyAqIHNyYyk7CitzdGF0aWMgdm9pZCBnc3Rfc291cF9odHRwX3NyY19zZXNzaW9uX2Nsb3NlIChHc3RTb3VwSFRUUFNyYyAqIHNyYyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc291cF9odHRwX3NyY19wYXJzZV9zdGF0dXMgKFNvdXBNZXNzYWdlICogbXNnLAorICAgIEdzdFNvdXBIVFRQU3JjICogc3JjKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9zb3VwX2h0dHBfc3JjX2dvdF9oZWFkZXJzIChHc3RTb3VwSFRUUFNyYyAqIHNyYywKKyAgICBTb3VwTWVzc2FnZSAqIG1zZyk7CitzdGF0aWMgdm9pZCBnc3Rfc291cF9odHRwX3NyY19hdXRoZW50aWNhdGVfY2IgKFNvdXBTZXNzaW9uICogc2Vzc2lvbiwKKyAgICBTb3VwTWVzc2FnZSAqIG1zZywgU291cEF1dGggKiBhdXRoLCBnYm9vbGVhbiByZXRyeWluZywKKyAgICBHc3RTb3VwSFRUUFNyYyAqIHNyYyk7CisKKyNkZWZpbmUgZ3N0X3NvdXBfaHR0cF9zcmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdFNvdXBIVFRQU3JjLCBnc3Rfc291cF9odHRwX3NyYywgR1NUX1RZUEVfUFVTSF9TUkMsCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9VUklfSEFORExFUiwKKyAgICAgICAgZ3N0X3NvdXBfaHR0cF9zcmNfdXJpX2hhbmRsZXJfaW5pdCkpOworCitzdGF0aWMgdm9pZAorZ3N0X3NvdXBfaHR0cF9zcmNfY2xhc3NfaW5pdCAoR3N0U291cEhUVFBTcmNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0QmFzZVNyY0NsYXNzICpnc3RiYXNlc3JjX2NsYXNzOworICBHc3RQdXNoU3JjQ2xhc3MgKmdzdHB1c2hzcmNfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RiYXNlc3JjX2NsYXNzID0gKEdzdEJhc2VTcmNDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cHVzaHNyY19jbGFzcyA9IChHc3RQdXNoU3JjQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3NvdXBfaHR0cF9zcmNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfc291cF9odHRwX3NyY19nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3NvdXBfaHR0cF9zcmNfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3Rfc291cF9odHRwX3NyY19kaXNwb3NlOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0xPQ0FUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImxvY2F0aW9uIiwgIkxvY2F0aW9uIiwKKyAgICAgICAgICAiTG9jYXRpb24gdG8gcmVhZCBmcm9tIiwgIiIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1VTRVJfQUdFTlQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgidXNlci1hZ2VudCIsICJVc2VyLUFnZW50IiwKKyAgICAgICAgICAiVmFsdWUgb2YgdGhlIFVzZXItQWdlbnQgSFRUUCByZXF1ZXN0IGhlYWRlciBmaWVsZCIsCisgICAgICAgICAgREVGQVVMVF9VU0VSX0FHRU5ULCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfQVVUT01BVElDX1JFRElSRUNULAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJhdXRvbWF0aWMtcmVkaXJlY3QiLCAiYXV0b21hdGljLXJlZGlyZWN0IiwKKyAgICAgICAgICAiQXV0b21hdGljYWxseSBmb2xsb3cgSFRUUCByZWRpcmVjdHMgKEhUVFAgU3RhdHVzIENvZGUgM3h4KSIsCisgICAgICAgICAgVFJVRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1BST1hZLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInByb3h5IiwgIlByb3h5IiwKKyAgICAgICAgICAiSFRUUCBwcm94eSBzZXJ2ZXIgVVJJIiwgIiIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1VTRVJfSUQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgidXNlci1pZCIsICJ1c2VyLWlkIiwKKyAgICAgICAgICAiSFRUUCBsb2NhdGlvbiBVUkkgdXNlciBpZCBmb3IgYXV0aGVudGljYXRpb24iLCAiIiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9VU0VSX1BXLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInVzZXItcHciLCAidXNlci1wdyIsCisgICAgICAgICAgIkhUVFAgbG9jYXRpb24gVVJJIHVzZXIgcGFzc3dvcmQgZm9yIGF1dGhlbnRpY2F0aW9uIiwgIiIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUFJPWFlfSUQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgicHJveHktaWQiLCAicHJveHktaWQiLAorICAgICAgICAgICJIVFRQIHByb3h5IFVSSSB1c2VyIGlkIGZvciBhdXRoZW50aWNhdGlvbiIsICIiLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BST1hZX1BXLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInByb3h5LXB3IiwgInByb3h5LXB3IiwKKyAgICAgICAgICAiSFRUUCBwcm94eSBVUkkgdXNlciBwYXNzd29yZCBmb3IgYXV0aGVudGljYXRpb24iLCAiIiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DT09LSUVTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgiY29va2llcyIsICJDb29raWVzIiwgIkhUVFAgcmVxdWVzdCBjb29raWVzIiwKKyAgICAgICAgICBHX1RZUEVfU1RSViwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSVNfTElWRSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiaXMtbGl2ZSIsICJpcy1saXZlIiwgIkFjdCBsaWtlIGEgbGl2ZSBzb3VyY2UiLAorICAgICAgICAgIEZBTFNFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USU1FT1VULAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJ0aW1lb3V0IiwgInRpbWVvdXQiLAorICAgICAgICAgICJWYWx1ZSBpbiBzZWNvbmRzIHRvIHRpbWVvdXQgYSBibG9ja2luZyBJL08gKDAgPSBObyB0aW1lb3V0KS4iLCAwLAorICAgICAgICAgIDM2MDAsIERFRkFVTFRfVElNRU9VVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRVhUUkFfSEVBREVSUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoImV4dHJhLWhlYWRlcnMiLCAiRXh0cmEgSGVhZGVycyIsCisgICAgICAgICAgIkV4dHJhIGhlYWRlcnMgdG8gYXBwZW5kIHRvIHRoZSBIVFRQIHJlcXVlc3QiLAorICAgICAgICAgIEdTVF9UWVBFX1NUUlVDVFVSRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSVJBRElPX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImlyYWRpby1tb2RlIiwgImlyYWRpby1tb2RlIiwKKyAgICAgICAgICAiRW5hYmxlIGludGVybmV0IHJhZGlvIG1vZGUgKGFzayBzZXJ2ZXIgdG8gc2VuZCBzaG91dGNhc3QvaWNlY2FzdCAiCisgICAgICAgICAgIm1ldGFkYXRhIGludGVybGVhdmVkIHdpdGggdGhlIGFjdHVhbCBzdHJlYW0gZGF0YSkiLAorICAgICAgICAgIERFRkFVTFRfSVJBRElPX01PREUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgLyoqCisgICAqIEdzdFNvdXBIVFRQU3JjOjpodHRwLWxvZy1sZXZlbDoKKyAgICoKKyAgICogSWYgc2V0IGFuZCA+IDAsIGNhcHR1cmVzIGFuZCBkdW1wcyBIVFRQIHNlc3Npb24gZGF0YSBhcworICAgKiBsb2cgbWVzc2FnZXMgaWYgbG9nIGxldmVsID49IEdTVF9MRVZFTF9UUkFDRQorICAgKgorICAgKiBTaW5jZTogMS40CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NPVVBfTE9HX0xFVkVMLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJodHRwLWxvZy1sZXZlbCIsICJIVFRQIGxvZyBsZXZlbCIsCisgICAgICAgICAgIlNldCBsb2cgbGV2ZWwgZm9yIHNvdXAncyBIVFRQIHNlc3Npb24gbG9nIiwKKyAgICAgICAgICBTT1VQX1RZUEVfTE9HR0VSX0xPR19MRVZFTCwgREVGQVVMVF9TT1VQX0xPR19MRVZFTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworIC8qKgorICAgKiBHc3RTb3VwSFRUUFNyYzo6Y29tcHJlc3M6CisgICAqCisgICAqIElmIHNldCB0byAlVFJVRSwgc291cGh0dHBzcmMgd2lsbCBhdXRvbWF0aWNhbGx5IGhhbmRsZSBnemlwCisgICAqIGFuZCBkZWZsYXRlIENvbnRlbnQtRW5jb2RpbmdzLiBUaGlzIGRvZXMgbm90IG1ha2UgbXVjaCBkaWZmZXJlbmNlCisgICAqIGFuZCBjYXVzZXMgbW9yZSBsb2FkIGZvciBub3JtYWwgbWVkaWEgZmlsZXMsIGJ1dCBtYWtlcyBhIHJlYWwKKyAgICogZGlmZmVyZW5jZSBpbiBzaXplIGZvciBwbGFpbnRleHQgZmlsZXMuCisgICAqCisgICAqIFNpbmNlOiAxLjQKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ09NUFJFU1MsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImNvbXByZXNzIiwgIkNvbXByZXNzIiwKKyAgICAgICAgICAiQWxsb3cgY29tcHJlc3NlZCBjb250ZW50IGVuY29kaW5ncyIsCisgICAgICAgICAgREVGQVVMVF9DT01QUkVTUywgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAvKioKKyAgICogR3N0U291cEhUVFBTcmM6OmtlZXAtYWxpdmU6CisgICAqCisgICAqIElmIHNldCB0byAlVFJVRSwgc291cGh0dHBzcmMgd2lsbCBrZWVwIGFsaXZlIGNvbm5lY3Rpb25zIHdoZW4gYmVpbmcKKyAgICogc2V0IHRvIFJFQURZIHN0YXRlIGFuZCBvbmx5IHdpbGwgY2xvc2UgY29ubmVjdGlvbnMgd2hlbiBjb25uZWN0aW5nCisgICAqIHRvIGEgZGlmZmVyZW50IHNlcnZlciBvciB3aGVuIGdvaW5nIHRvIE5VTEwgc3RhdGUuLgorICAgKgorICAgKiBTaW5jZTogMS40CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0tFRVBfQUxJVkUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImtlZXAtYWxpdmUiLCAia2VlcC1hbGl2ZSIsCisgICAgICAgICAgIlVzZSBIVFRQIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMiLCBERUZBVUxUX0tFRVBfQUxJVkUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAvKioKKyAgICogR3N0U291cEhUVFBTcmM6OnNzbC1zdHJpY3Q6CisgICAqCisgICAqIElmIHNldCB0byAlVFJVRSwgc291cGh0dHBzcmMgd2lsbCByZWplY3QgYWxsIFNTTCBjZXJ0aWZpY2F0ZXMgdGhhdAorICAgKiBhcmUgY29uc2lkZXJlZCBpbnZhbGlkLgorICAgKgorICAgKiBTaW5jZTogMS40CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NTTF9TVFJJQ1QsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInNzbC1zdHJpY3QiLCAiU1NMIFN0cmljdCIsCisgICAgICAgICAgIlN0cmljdCBTU0wgY2VydGlmaWNhdGUgY2hlY2tpbmciLCBERUZBVUxUX1NTTF9TVFJJQ1QsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAvKioKKyAgICogR3N0U291cEhUVFBTcmM6OnNzbC1jYS1maWxlOgorICAgKgorICAgKiBBIFNTTCBhbmNob3IgQ0EgZmlsZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBjaGVja2luZyBjZXJ0aWZpY2F0ZXMKKyAgICogaW5zdGVhZCBvZiB0aGUgc3lzdGVtIENBIGZpbGUuCisgICAqCisgICAqIElmIHRoaXMgcHJvcGVydHkgaXMgbm9uLSVOVUxMLCAjR3N0U291cEhUVFBTcmM6OnNzbC11c2Utc3lzdGVtLWNhLWZpbGUKKyAgICogdmFsdWUgd2lsbCBiZSBpZ25vcmVkLgorICAgKgorICAgKiBEZXByZWNhdGVkOiBVc2UgI0dzdFNvdXBIVFRQU3JjOjp0bHMtZGF0YWJhc2UgcHJvcGVydHkgaW5zdGVhZC4KKyAgICogU2luY2U6IDEuNAorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TU0xfQ0FfRklMRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJzc2wtY2EtZmlsZSIsICJTU0wgQ0EgRmlsZSIsCisgICAgICAgICAgIkxvY2F0aW9uIG9mIGEgU1NMIGFuY2hvciBDQSBmaWxlIHRvIHVzZSIsIERFRkFVTFRfU1NMX0NBX0ZJTEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAvKioKKyAgICogR3N0U291cEhUVFBTcmM6OnNzbC11c2Utc3lzdGVtLWNhLWZpbGU6CisgICAqCisgICAqIElmIHNldCB0byAlVFJVRSwgc291cGh0dHBzcmMgd2lsbCB1c2UgdGhlIHN5c3RlbSdzIENBIGZpbGUgZm9yCisgICAqIGNoZWNraW5nIGNlcnRpZmljYXRlcywgdW5sZXNzICNHc3RTb3VwSFRUUFNyYzo6c3NsLWNhLWZpbGUgb3IKKyAgICogI0dzdFNvdXBIVFRQU3JjOjp0bHMtZGF0YWJhc2UgYXJlIG5vbi0lTlVMTC4KKyAgICoKKyAgICogU2luY2U6IDEuNAorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TU0xfVVNFX1NZU1RFTV9DQV9GSUxFLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzc2wtdXNlLXN5c3RlbS1jYS1maWxlIiwgIlVzZSBTeXN0ZW0gQ0EgRmlsZSIsCisgICAgICAgICAgIlVzZSBzeXN0ZW0gQ0EgZmlsZSIsIERFRkFVTFRfU1NMX1VTRV9TWVNURU1fQ0FfRklMRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0U291cEhUVFBTcmM6OnRscy1kYXRhYmFzZToKKyAgICoKKyAgICogVExTIGRhdGFiYXNlIHdpdGggYW5jaG9yIGNlcnRpZmljYXRlIGF1dGhvcml0aWVzIHVzZWQgdG8gdmFsaWRhdGUKKyAgICogdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZS4KKyAgICoKKyAgICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBub24tJU5VTEwsICNHc3RTb3VwSFRUUFNyYzo6c3NsLXVzZS1zeXN0ZW0tY2EtZmlsZQorICAgKiBhbmQgI0dzdFNvdXBIVFRQU3JjOjpzc2wtY2EtZmlsZSB2YWx1ZXMgd2lsbCBiZSBpZ25vcmVkLgorICAgKgorICAgKiBTaW5jZTogMS42CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RMU19EQVRBQkFTRSwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJ0bHMtZGF0YWJhc2UiLCAiVExTIGRhdGFiYXNlIiwKKyAgICAgICAgICAiVExTIGRhdGFiYXNlIHdpdGggYW5jaG9yIGNlcnRpZmljYXRlIGF1dGhvcml0aWVzIHVzZWQgdG8gdmFsaWRhdGUgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgR19UWVBFX1RMU19EQVRBQkFTRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFNvdXBIVFRQU3JjOjp0bHMtaW50ZXJhY3Rpb246CisgICAqCisgICAqIEEgI0dUbHNJbnRlcmFjdGlvbiBvYmplY3QgdG8gYmUgdXNlZCB3aGVuIHRoZSBjb25uZWN0aW9uIG9yIGNlcnRpZmljYXRlCisgICAqIGRhdGFiYXNlIG5lZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgdXNlci4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gcHJvbXB0IHRoZQorICAgKiB1c2VyIGZvciBwYXNzd29yZHMgb3IgY2VydGlmaWNhdGUgd2hlcmUgbmVjZXNzYXJ5LgorICAgKgorICAgKiBTaW5jZTogMS44CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RMU19JTlRFUkFDVElPTiwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJ0bHMtaW50ZXJhY3Rpb24iLCAiVExTIGludGVyYWN0aW9uIiwKKyAgICAgICAgICAiQSBHVGxzSW50ZXJhY3Rpb24gb2JqZWN0IHRvIGJlIHVzZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBvciBjZXJ0aWZpY2F0ZSBkYXRhYmFzZSBuZWVkIHRvIGludGVyYWN0IHdpdGggdGhlIHVzZXIuIiwKKyAgICAgICAgICBHX1RZUEVfVExTX0lOVEVSQUNUSU9OLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworIC8qKgorICAgKiBHc3RTb3VwSFRUUFNyYzo6cmV0cmllczoKKyAgICoKKyAgICogTWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyB1bnRpbCBnaXZpbmcgdXAuCisgICAqCisgICAqIFNpbmNlOiAxLjQKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkVUUklFUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJyZXRyaWVzIiwgIlJldHJpZXMiLAorICAgICAgICAgICJNYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIHVudGlsIGdpdmluZyB1cCAoLTE9aW5maW5pdGUpIiwgLTEsCisgICAgICAgICAgR19NQVhJTlQsIERFRkFVTFRfUkVUUklFUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworIC8qKgorICAgKiBHc3RTb3VwSFRUUFNyYzo6bWV0aG9kCisgICAqCisgICAqIFRoZSBIVFRQIG1ldGhvZCB0byB1c2Ugd2hlbiBtYWtpbmcgYSByZXF1ZXN0CisgICAqCisgICAqIFNpbmNlOiAxLjYKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUVUSE9ELAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoIm1ldGhvZCIsICJIVFRQIG1ldGhvZCIsCisgICAgICAgICAgIlRoZSBIVFRQIG1ldGhvZCB0byB1c2UgKEdFVCwgSEVBRCwgT1BUSU9OUywgZXRjKSIsCisgICAgICAgICAgREVGQVVMVF9TT1VQX01FVEhPRCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmN0ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkhUVFAgY2xpZW50IHNvdXJjZSIsCisgICAgICAiU291cmNlL05ldHdvcmsiLAorICAgICAgIlJlY2VpdmUgZGF0YSBhcyBhIGNsaWVudCBvdmVyIHRoZSBuZXR3b3JrIHZpYSBIVFRQIHVzaW5nIFNPVVAiLAorICAgICAgIldvdXRlciBDbG9ldGVucyA8d291dGVyQG1pbmQuYmU+Iik7CisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NvdXBfaHR0cF9zcmNfY2hhbmdlX3N0YXRlKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+c2V0X2NvbnRleHQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zb3VwX2h0dHBfc3JjX3NldF9jb250ZXh0KTsKKworICBnc3RiYXNlc3JjX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc291cF9odHRwX3NyY19zdGFydCk7CisgIGdzdGJhc2VzcmNfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NvdXBfaHR0cF9zcmNfc3RvcCk7CisgIGdzdGJhc2VzcmNfY2xhc3MtPnVubG9jayA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc291cF9odHRwX3NyY191bmxvY2spOworICBnc3RiYXNlc3JjX2NsYXNzLT51bmxvY2tfc3RvcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NvdXBfaHR0cF9zcmNfdW5sb2NrX3N0b3ApOworICBnc3RiYXNlc3JjX2NsYXNzLT5nZXRfc2l6ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc291cF9odHRwX3NyY19nZXRfc2l6ZSk7CisgIGdzdGJhc2VzcmNfY2xhc3MtPmlzX3NlZWthYmxlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc291cF9odHRwX3NyY19pc19zZWVrYWJsZSk7CisgIGdzdGJhc2VzcmNfY2xhc3MtPmRvX3NlZWsgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NvdXBfaHR0cF9zcmNfZG9fc2Vlayk7CisgIGdzdGJhc2VzcmNfY2xhc3MtPnF1ZXJ5ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zb3VwX2h0dHBfc3JjX3F1ZXJ5KTsKKworICBnc3RwdXNoc3JjX2NsYXNzLT5jcmVhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NvdXBfaHR0cF9zcmNfY3JlYXRlKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoc291cGh0dHBzcmNfZGVidWcsICJzb3VwaHR0cHNyYyIsIDAsCisgICAgICAiU09VUCBIVFRQIHNyYyIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NvdXBfaHR0cF9zcmNfcmVzZXQgKEdzdFNvdXBIVFRQU3JjICogc3JjKQoreworICBzcmMtPnJldHJ5X2NvdW50ID0gMDsKKyAgc3JjLT5oYXZlX3NpemUgPSBGQUxTRTsKKyAgc3JjLT5nb3RfaGVhZGVycyA9IEZBTFNFOworICBzcmMtPnNlZWthYmxlID0gRkFMU0U7CisgIHNyYy0+cmVhZF9wb3NpdGlvbiA9IDA7CisgIHNyYy0+cmVxdWVzdF9wb3NpdGlvbiA9IDA7CisgIHNyYy0+c3RvcF9wb3NpdGlvbiA9IC0xOworICBzcmMtPmNvbnRlbnRfc2l6ZSA9IDA7CisgIHNyYy0+aGF2ZV9ib2R5ID0gRkFMU0U7CisKKyAgc3JjLT5yZWR1Y2VfYmxvY2tzaXplX2NvdW50ID0gMDsKKyAgc3JjLT5pbmNyZWFzZV9ibG9ja3NpemVfY291bnQgPSAwOworCisgIGdfY2FuY2VsbGFibGVfcmVzZXQgKHNyYy0+Y2FuY2VsbGFibGUpOworICBpZiAoc3JjLT5pbnB1dF9zdHJlYW0pIHsKKyAgICBnX29iamVjdF91bnJlZiAoc3JjLT5pbnB1dF9zdHJlYW0pOworICAgIHNyYy0+aW5wdXRfc3RyZWFtID0gTlVMTDsKKyAgfQorCisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzcmMtPnNyY19jYXBzLCBOVUxMKTsKKyAgZ19mcmVlIChzcmMtPmlyYWRpb19uYW1lKTsKKyAgc3JjLT5pcmFkaW9fbmFtZSA9IE5VTEw7CisgIGdfZnJlZSAoc3JjLT5pcmFkaW9fZ2VucmUpOworICBzcmMtPmlyYWRpb19nZW5yZSA9IE5VTEw7CisgIGdfZnJlZSAoc3JjLT5pcmFkaW9fdXJsKTsKKyAgc3JjLT5pcmFkaW9fdXJsID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zb3VwX2h0dHBfc3JjX2luaXQgKEdzdFNvdXBIVFRQU3JjICogc3JjKQoreworICBjb25zdCBnY2hhciAqcHJveHk7CisKKyAgZ19tdXRleF9pbml0ICgmc3JjLT5tdXRleCk7CisgIGdfY29uZF9pbml0ICgmc3JjLT5oYXZlX2hlYWRlcnNfY29uZCk7CisgIHNyYy0+Y2FuY2VsbGFibGUgPSBnX2NhbmNlbGxhYmxlX25ldyAoKTsKKyAgc3JjLT5sb2NhdGlvbiA9IE5VTEw7CisgIHNyYy0+cmVkaXJlY3Rpb25fdXJpID0gTlVMTDsKKyAgc3JjLT5hdXRvbWF0aWNfcmVkaXJlY3QgPSBUUlVFOworICBzcmMtPnVzZXJfYWdlbnQgPSBnX3N0cmR1cCAoREVGQVVMVF9VU0VSX0FHRU5UKTsKKyAgc3JjLT51c2VyX2lkID0gTlVMTDsKKyAgc3JjLT51c2VyX3B3ID0gTlVMTDsKKyAgc3JjLT5wcm94eV9pZCA9IE5VTEw7CisgIHNyYy0+cHJveHlfcHcgPSBOVUxMOworICBzcmMtPmNvb2tpZXMgPSBOVUxMOworICBzcmMtPmlyYWRpb19tb2RlID0gREVGQVVMVF9JUkFESU9fTU9ERTsKKyAgc3JjLT5zZXNzaW9uID0gTlVMTDsKKyAgc3JjLT5leHRlcm5hbF9zZXNzaW9uID0gTlVMTDsKKyAgc3JjLT5mb3JjZWRfZXh0ZXJuYWxfc2Vzc2lvbiA9IEZBTFNFOworICBzcmMtPm1zZyA9IE5VTEw7CisgIHNyYy0+dGltZW91dCA9IERFRkFVTFRfVElNRU9VVDsKKyAgc3JjLT5sb2dfbGV2ZWwgPSBERUZBVUxUX1NPVVBfTE9HX0xFVkVMOworICBzcmMtPmNvbXByZXNzID0gREVGQVVMVF9DT01QUkVTUzsKKyAgc3JjLT5rZWVwX2FsaXZlID0gREVGQVVMVF9LRUVQX0FMSVZFOworICBzcmMtPnNzbF9zdHJpY3QgPSBERUZBVUxUX1NTTF9TVFJJQ1Q7CisgIHNyYy0+c3NsX3VzZV9zeXN0ZW1fY2FfZmlsZSA9IERFRkFVTFRfU1NMX1VTRV9TWVNURU1fQ0FfRklMRTsKKyAgc3JjLT50bHNfZGF0YWJhc2UgPSBERUZBVUxUX1RMU19EQVRBQkFTRTsKKyAgc3JjLT50bHNfaW50ZXJhY3Rpb24gPSBERUZBVUxUX1RMU19JTlRFUkFDVElPTjsKKyAgc3JjLT5tYXhfcmV0cmllcyA9IERFRkFVTFRfUkVUUklFUzsKKyAgc3JjLT5tZXRob2QgPSBERUZBVUxUX1NPVVBfTUVUSE9EOworICBzcmMtPm1pbmltdW1fYmxvY2tzaXplID0gZ3N0X2Jhc2Vfc3JjX2dldF9ibG9ja3NpemUgKEdTVF9CQVNFX1NSQ19DQVNUIChzcmMpKTsKKyAgcHJveHkgPSBnX2dldGVudiAoImh0dHBfcHJveHkiKTsKKyAgaWYgKCFnc3Rfc291cF9odHRwX3NyY19zZXRfcHJveHkgKHNyYywgcHJveHkpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsCisgICAgICAgICJUaGUgcHJveHkgaW4gdGhlIGh0dHBfcHJveHkgZW52IHZhciAoXCIlc1wiKSBjYW5ub3QgYmUgcGFyc2VkLiIsCisgICAgICAgIHByb3h5KTsKKyAgfQorCisgIGdzdF9iYXNlX3NyY19zZXRfYXV0b21hdGljX2VvcyAoR1NUX0JBU0VfU1JDIChzcmMpLCBGQUxTRSk7CisKKyAgZ3N0X3NvdXBfaHR0cF9zcmNfcmVzZXQgKHNyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc291cF9odHRwX3NyY19kaXNwb3NlIChHT2JqZWN0ICogZ29iamVjdCkKK3sKKyAgR3N0U291cEhUVFBTcmMgKnNyYyA9IEdTVF9TT1VQX0hUVFBfU1JDIChnb2JqZWN0KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJkaXNwb3NlIik7CisKKyAgZ3N0X3NvdXBfaHR0cF9zcmNfc2Vzc2lvbl9jbG9zZSAoc3JjKTsKKworICBpZiAoc3JjLT5leHRlcm5hbF9zZXNzaW9uKSB7CisgICAgZ19vYmplY3RfdW5yZWYgKHNyYy0+ZXh0ZXJuYWxfc2Vzc2lvbik7CisgICAgc3JjLT5leHRlcm5hbF9zZXNzaW9uID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChnb2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zb3VwX2h0dHBfc3JjX2ZpbmFsaXplIChHT2JqZWN0ICogZ29iamVjdCkKK3sKKyAgR3N0U291cEhUVFBTcmMgKnNyYyA9IEdTVF9TT1VQX0hUVFBfU1JDIChnb2JqZWN0KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJmaW5hbGl6ZSIpOworCisgIGdfbXV0ZXhfY2xlYXIgKCZzcmMtPm11dGV4KTsKKyAgZ19jb25kX2NsZWFyICgmc3JjLT5oYXZlX2hlYWRlcnNfY29uZCk7CisgIGdfb2JqZWN0X3VucmVmIChzcmMtPmNhbmNlbGxhYmxlKTsKKyAgZ19mcmVlIChzcmMtPmxvY2F0aW9uKTsKKyAgZ19mcmVlIChzcmMtPnJlZGlyZWN0aW9uX3VyaSk7CisgIGdfZnJlZSAoc3JjLT51c2VyX2FnZW50KTsKKyAgaWYgKHNyYy0+cHJveHkgIT0gTlVMTCkgeworICAgIHNvdXBfdXJpX2ZyZWUgKHNyYy0+cHJveHkpOworICB9CisgIGdfZnJlZSAoc3JjLT51c2VyX2lkKTsKKyAgZ19mcmVlIChzcmMtPnVzZXJfcHcpOworICBnX2ZyZWUgKHNyYy0+cHJveHlfaWQpOworICBnX2ZyZWUgKHNyYy0+cHJveHlfcHcpOworICBnX3N0cmZyZWV2IChzcmMtPmNvb2tpZXMpOworCisgIGlmIChzcmMtPmV4dHJhX2hlYWRlcnMpIHsKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHNyYy0+ZXh0cmFfaGVhZGVycyk7CisgICAgc3JjLT5leHRyYV9oZWFkZXJzID0gTlVMTDsKKyAgfQorCisgIGdfZnJlZSAoc3JjLT5zc2xfY2FfZmlsZSk7CisKKyAgaWYgKHNyYy0+dGxzX2RhdGFiYXNlKQorICAgIGdfb2JqZWN0X3VucmVmIChzcmMtPnRsc19kYXRhYmFzZSk7CisgIGdfZnJlZSAoc3JjLT5tZXRob2QpOworCisgIGlmIChzcmMtPnRsc19pbnRlcmFjdGlvbikKKyAgICBnX29iamVjdF91bnJlZiAoc3JjLT50bHNfaW50ZXJhY3Rpb24pOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAoZ29iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc291cF9odHRwX3NyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0U291cEhUVFBTcmMgKnNyYyA9IEdTVF9TT1VQX0hUVFBfU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjoKKyAgICB7CisgICAgICBjb25zdCBnY2hhciAqbG9jYXRpb247CisKKyAgICAgIGxvY2F0aW9uID0gZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSk7CisKKyAgICAgIGlmIChsb2NhdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIEdTVF9XQVJOSU5HICgibG9jYXRpb24gcHJvcGVydHkgY2Fubm90IGJlIE5VTEwiKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorICAgICAgaWYgKCFnc3Rfc291cF9odHRwX3NyY19zZXRfbG9jYXRpb24gKHNyYywgbG9jYXRpb24sIE5VTEwpKSB7CisgICAgICAgIEdTVF9XQVJOSU5HICgiYmFkbHkgZm9ybWF0dGVkIGxvY2F0aW9uIik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfVVNFUl9BR0VOVDoKKyAgICAgIGdfZnJlZSAoc3JjLT51c2VyX2FnZW50KTsKKyAgICAgIHNyYy0+dXNlcl9hZ2VudCA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lSQURJT19NT0RFOgorICAgICAgc3JjLT5pcmFkaW9fbW9kZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BVVRPTUFUSUNfUkVESVJFQ1Q6CisgICAgICBzcmMtPmF1dG9tYXRpY19yZWRpcmVjdCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9YWToKKyAgICB7CisgICAgICBjb25zdCBnY2hhciAqcHJveHk7CisKKyAgICAgIHByb3h5ID0gZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSk7CisgICAgICBpZiAoIWdzdF9zb3VwX2h0dHBfc3JjX3NldF9wcm94eSAoc3JjLCBwcm94eSkpIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJiYWRseSBmb3JtYXR0ZWQgcHJveHkgVVJJIik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfQ09PS0lFUzoKKyAgICAgIGdfc3RyZnJlZXYgKHNyYy0+Y29va2llcyk7CisgICAgICBzcmMtPmNvb2tpZXMgPSBnX3N0cmR1cHYgKGdfdmFsdWVfZ2V0X2JveGVkICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lTX0xJVkU6CisgICAgICBnc3RfYmFzZV9zcmNfc2V0X2xpdmUgKEdTVF9CQVNFX1NSQyAoc3JjKSwgZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VSX0lEOgorICAgICAgZ19mcmVlIChzcmMtPnVzZXJfaWQpOworICAgICAgc3JjLT51c2VyX2lkID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFUl9QVzoKKyAgICAgIGdfZnJlZSAoc3JjLT51c2VyX3B3KTsKKyAgICAgIHNyYy0+dXNlcl9wdyA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST1hZX0lEOgorICAgICAgZ19mcmVlIChzcmMtPnByb3h5X2lkKTsKKyAgICAgIHNyYy0+cHJveHlfaWQgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9YWV9QVzoKKyAgICAgIGdfZnJlZSAoc3JjLT5wcm94eV9wdyk7CisgICAgICBzcmMtPnByb3h5X3B3ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVElNRU9VVDoKKyAgICAgIHNyYy0+dGltZW91dCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9FWFRSQV9IRUFERVJTOnsKKyAgICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF92YWx1ZV9nZXRfc3RydWN0dXJlICh2YWx1ZSk7CisKKyAgICAgIGlmIChzcmMtPmV4dHJhX2hlYWRlcnMpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoc3JjLT5leHRyYV9oZWFkZXJzKTsKKworICAgICAgc3JjLT5leHRyYV9oZWFkZXJzID0gcyA/IGdzdF9zdHJ1Y3R1cmVfY29weSAocykgOiBOVUxMOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9TT1VQX0xPR19MRVZFTDoKKyAgICAgIHNyYy0+bG9nX2xldmVsID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NPTVBSRVNTOgorICAgICAgc3JjLT5jb21wcmVzcyA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9LRUVQX0FMSVZFOgorICAgICAgc3JjLT5rZWVwX2FsaXZlID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NTTF9TVFJJQ1Q6CisgICAgICBzcmMtPnNzbF9zdHJpY3QgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1NMX0NBX0ZJTEU6CisgICAgICBnX2ZyZWUgKHNyYy0+c3NsX2NhX2ZpbGUpOworICAgICAgc3JjLT5zc2xfY2FfZmlsZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NTTF9VU0VfU1lTVEVNX0NBX0ZJTEU6CisgICAgICBzcmMtPnNzbF91c2Vfc3lzdGVtX2NhX2ZpbGUgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVExTX0RBVEFCQVNFOgorICAgICAgZ19jbGVhcl9vYmplY3QgKCZzcmMtPnRsc19kYXRhYmFzZSk7CisgICAgICBzcmMtPnRsc19kYXRhYmFzZSA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RMU19JTlRFUkFDVElPTjoKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmc3JjLT50bHNfaW50ZXJhY3Rpb24pOworICAgICAgc3JjLT50bHNfaW50ZXJhY3Rpb24gPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVRSSUVTOgorICAgICAgc3JjLT5tYXhfcmV0cmllcyA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01FVEhPRDoKKyAgICAgIGdfZnJlZSAoc3JjLT5tZXRob2QpOworICAgICAgc3JjLT5tZXRob2QgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK2RvbmU6CisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zb3VwX2h0dHBfc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTb3VwSFRUUFNyYyAqc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xPQ0FUSU9OOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc3JjLT5sb2NhdGlvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFUl9BR0VOVDoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNyYy0+dXNlcl9hZ2VudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQVVUT01BVElDX1JFRElSRUNUOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNyYy0+YXV0b21hdGljX3JlZGlyZWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9YWToKKyAgICAgIGlmIChzcmMtPnByb3h5ID09IE5VTEwpCisgICAgICAgIGdfdmFsdWVfc2V0X3N0YXRpY19zdHJpbmcgKHZhbHVlLCAiIik7CisgICAgICBlbHNlIHsKKyAgICAgICAgY2hhciAqcHJveHkgPSBzb3VwX3VyaV90b19zdHJpbmcgKHNyYy0+cHJveHksIEZBTFNFKTsKKworICAgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBwcm94eSk7CisgICAgICAgIGdfZnJlZSAocHJveHkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NPT0tJRVM6CisgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIGdfc3RyZHVwdiAoc3JjLT5jb29raWVzKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSVNfTElWRToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBnc3RfYmFzZV9zcmNfaXNfbGl2ZSAoR1NUX0JBU0VfU1JDIChzcmMpKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSVJBRElPX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc3JjLT5pcmFkaW9fbW9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFUl9JRDoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNyYy0+dXNlcl9pZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFUl9QVzoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNyYy0+dXNlcl9wdyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUFJPWFlfSUQ6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzcmMtPnByb3h5X2lkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9YWV9QVzoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNyYy0+cHJveHlfcHcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RJTUVPVVQ6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc3JjLT50aW1lb3V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9FWFRSQV9IRUFERVJTOgorICAgICAgZ3N0X3ZhbHVlX3NldF9zdHJ1Y3R1cmUgKHZhbHVlLCBzcmMtPmV4dHJhX2hlYWRlcnMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NPVVBfTE9HX0xFVkVMOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHNyYy0+bG9nX2xldmVsKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT01QUkVTUzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzcmMtPmNvbXByZXNzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9LRUVQX0FMSVZFOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNyYy0+a2VlcF9hbGl2ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1NMX1NUUklDVDoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzcmMtPnNzbF9zdHJpY3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NTTF9DQV9GSUxFOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc3JjLT5zc2xfY2FfZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1NMX1VTRV9TWVNURU1fQ0FfRklMRToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzcmMtPnNzbF91c2Vfc3lzdGVtX2NhX2ZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RMU19EQVRBQkFTRToKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNyYy0+dGxzX2RhdGFiYXNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UTFNfSU5URVJBQ1RJT046CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzcmMtPnRsc19pbnRlcmFjdGlvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVUUklFUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHNyYy0+bWF4X3JldHJpZXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01FVEhPRDoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNyYy0+bWV0aG9kKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdjaGFyICoKK2dzdF9zb3VwX2h0dHBfc3JjX3VuaWNvZGlmeSAoY29uc3QgZ2NoYXIgKiBzdHIpCit7CisgIGNvbnN0IGdjaGFyICplbnZfdmFyc1tdID0geyAiR1NUX0lDWV9UQUdfRU5DT0RJTkciLAorICAgICJHU1RfVEFHX0VOQ09ESU5HIiwgTlVMTAorICB9OworCisgIHJldHVybiBnc3RfdGFnX2ZyZWVmb3JtX3N0cmluZ190b191dGY4IChzdHIsIC0xLCBlbnZfdmFycyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc291cF9odHRwX3NyY19jYW5jZWxfbWVzc2FnZSAoR3N0U291cEhUVFBTcmMgKiBzcmMpCit7CisgIGdfY2FuY2VsbGFibGVfY2FuY2VsIChzcmMtPmNhbmNlbGxhYmxlKTsKKyAgZ19jb25kX3NpZ25hbCAoJnNyYy0+aGF2ZV9oZWFkZXJzX2NvbmQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zb3VwX2h0dHBfc3JjX2FkZF9yYW5nZV9oZWFkZXIgKEdzdFNvdXBIVFRQU3JjICogc3JjLCBndWludDY0IG9mZnNldCwKKyAgICBndWludDY0IHN0b3Bfb2Zmc2V0KQoreworICBnY2hhciBidWZbNjRdOworICBnaW50IHJjOworCisgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX3JlbW92ZSAoc3JjLT5tc2ctPnJlcXVlc3RfaGVhZGVycywgIlJhbmdlIik7CisgIGlmIChvZmZzZXQgfHwgc3RvcF9vZmZzZXQgIT0gLTEpIHsKKyAgICBpZiAoc3RvcF9vZmZzZXQgIT0gLTEpIHsKKyAgICAgIGdfYXNzZXJ0IChvZmZzZXQgIT0gc3RvcF9vZmZzZXQpOworCisgICAgICByYyA9IGdfc25wcmludGYgKGJ1Ziwgc2l6ZW9mIChidWYpLCAiYnl0ZXM9JSIgR19HVUlOVDY0X0ZPUk1BVCAiLSUiCisgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgb2Zmc2V0LCAoc3RvcF9vZmZzZXQgPiAwKSA/IHN0b3Bfb2Zmc2V0IC0gMSA6CisgICAgICAgICAgc3RvcF9vZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICByYyA9IGdfc25wcmludGYgKGJ1Ziwgc2l6ZW9mIChidWYpLCAiYnl0ZXM9JSIgR19HVUlOVDY0X0ZPUk1BVCAiLSIsCisgICAgICAgICAgb2Zmc2V0KTsKKyAgICB9CisgICAgaWYgKHJjID4gc2l6ZW9mIChidWYpIHx8IHJjIDwgMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBzb3VwX21lc3NhZ2VfaGVhZGVyc19hcHBlbmQgKHNyYy0+bXNnLT5yZXF1ZXN0X2hlYWRlcnMsICJSYW5nZSIsIGJ1Zik7CisgIH0KKyAgc3JjLT5yZWFkX3Bvc2l0aW9uID0gb2Zmc2V0OworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitfYXBwZW5kX2V4dHJhX2hlYWRlciAoR1F1YXJrIGZpZWxkX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RTb3VwSFRUUFNyYyAqc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKHVzZXJfZGF0YSk7CisgIGNvbnN0IGdjaGFyICpmaWVsZF9uYW1lID0gZ19xdWFya190b19zdHJpbmcgKGZpZWxkX2lkKTsKKyAgZ2NoYXIgKmZpZWxkX2NvbnRlbnQgPSBOVUxMOworCisgIGlmIChHX1ZBTFVFX1RZUEUgKHZhbHVlKSA9PSBHX1RZUEVfU1RSSU5HKSB7CisgICAgZmllbGRfY29udGVudCA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICB9IGVsc2UgeworICAgIEdWYWx1ZSBkZXN0ID0geyAwLCB9OworCisgICAgZ192YWx1ZV9pbml0ICgmZGVzdCwgR19UWVBFX1NUUklORyk7CisgICAgaWYgKGdfdmFsdWVfdHJhbnNmb3JtICh2YWx1ZSwgJmRlc3QpKSB7CisgICAgICBmaWVsZF9jb250ZW50ID0gZ192YWx1ZV9kdXBfc3RyaW5nICgmZGVzdCk7CisgICAgfQorICB9CisKKyAgaWYgKGZpZWxkX2NvbnRlbnQgPT0gTlVMTCkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNyYywgImV4dHJhLWhlYWRlcnMgZmllbGQgJyVzJyBjb250YWlucyBubyB2YWx1ZSAiCisgICAgICAgICJvciBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmciLCBmaWVsZF9uYW1lKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJBcHBlbmRpbmcgZXh0cmEgaGVhZGVyOiBcIiVzOiAlc1wiIiwgZmllbGRfbmFtZSwKKyAgICAgIGZpZWxkX2NvbnRlbnQpOworICBzb3VwX21lc3NhZ2VfaGVhZGVyc19hcHBlbmQgKHNyYy0+bXNnLT5yZXF1ZXN0X2hlYWRlcnMsIGZpZWxkX25hbWUsCisgICAgICBmaWVsZF9jb250ZW50KTsKKworICBnX2ZyZWUgKGZpZWxkX2NvbnRlbnQpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK19hcHBlbmRfZXh0cmFfaGVhZGVycyAoR1F1YXJrIGZpZWxkX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGlmIChHX1ZBTFVFX1RZUEUgKHZhbHVlKSA9PSBHU1RfVFlQRV9BUlJBWSkgeworICAgIGd1aW50IG4gPSBnc3RfdmFsdWVfYXJyYXlfZ2V0X3NpemUgKHZhbHVlKTsKKyAgICBndWludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgY29uc3QgR1ZhbHVlICp2ID0gZ3N0X3ZhbHVlX2FycmF5X2dldF92YWx1ZSAodmFsdWUsIGkpOworCisgICAgICBpZiAoIV9hcHBlbmRfZXh0cmFfaGVhZGVyIChmaWVsZF9pZCwgdiwgdXNlcl9kYXRhKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfSBlbHNlIGlmIChHX1ZBTFVFX1RZUEUgKHZhbHVlKSA9PSBHU1RfVFlQRV9MSVNUKSB7CisgICAgZ3VpbnQgbiA9IGdzdF92YWx1ZV9saXN0X2dldF9zaXplICh2YWx1ZSk7CisgICAgZ3VpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqdiA9IGdzdF92YWx1ZV9saXN0X2dldF92YWx1ZSAodmFsdWUsIGkpOworCisgICAgICBpZiAoIV9hcHBlbmRfZXh0cmFfaGVhZGVyIChmaWVsZF9pZCwgdiwgdXNlcl9kYXRhKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gX2FwcGVuZF9leHRyYV9oZWFkZXIgKGZpZWxkX2lkLCB2YWx1ZSwgdXNlcl9kYXRhKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NvdXBfaHR0cF9zcmNfYWRkX2V4dHJhX2hlYWRlcnMgKEdzdFNvdXBIVFRQU3JjICogc3JjKQoreworICBpZiAoIXNyYy0+ZXh0cmFfaGVhZGVycykKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gZ3N0X3N0cnVjdHVyZV9mb3JlYWNoIChzcmMtPmV4dHJhX2hlYWRlcnMsIF9hcHBlbmRfZXh0cmFfaGVhZGVycywgc3JjKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc291cF9odHRwX3NyY19zZXNzaW9uX29wZW4gKEdzdFNvdXBIVFRQU3JjICogc3JjKQoreworICBpZiAoc3JjLT5zZXNzaW9uKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiU2Vzc2lvbiBpcyBhbHJlYWR5IG9wZW4iKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGlmICghc3JjLT5sb2NhdGlvbikgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBPUEVOX1JFQUQsIChfKCJObyBVUkwgc2V0LiIpKSwKKyAgICAgICAgKCJNaXNzaW5nIGxvY2F0aW9uIHByb3BlcnR5IikpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICghc3JjLT5zZXNzaW9uKSB7CisgICAgR3N0UXVlcnkgKnF1ZXJ5OworICAgIGdib29sZWFuIGNhbl9zaGFyZSA9IChzcmMtPnRpbWVvdXQgPT0gREVGQVVMVF9USU1FT1VUKQorICAgICAgICAmJiAoc3JjLT5zc2xfc3RyaWN0ID09IERFRkFVTFRfU1NMX1NUUklDVCkKKyAgICAgICAgJiYgKHNyYy0+dGxzX2ludGVyYWN0aW9uID09IE5VTEwpICYmIChzcmMtPnByb3h5ID09IE5VTEwpCisgICAgICAgICYmIChzcmMtPnRsc19kYXRhYmFzZSA9PSBERUZBVUxUX1RMU19EQVRBQkFTRSkKKyAgICAgICAgJiYgKHNyYy0+c3NsX2NhX2ZpbGUgPT0gREVGQVVMVF9TU0xfQ0FfRklMRSkKKyAgICAgICAgJiYgKHNyYy0+c3NsX3VzZV9zeXN0ZW1fY2FfZmlsZSA9PSBERUZBVUxUX1NTTF9VU0VfU1lTVEVNX0NBX0ZJTEUpOworCisgICAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X2NvbnRleHQgKEdTVF9TT1VQX1NFU1NJT05fQ09OVEVYVCk7CisgICAgaWYgKGdzdF9wYWRfcGVlcl9xdWVyeSAoR1NUX0JBU0VfU1JDX1BBRCAoc3JjKSwgcXVlcnkpKSB7CisgICAgICBHc3RDb250ZXh0ICpjb250ZXh0OworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY29udGV4dCAocXVlcnksICZjb250ZXh0KTsKKyAgICAgIGdzdF9lbGVtZW50X3NldF9jb250ZXh0IChHU1RfRUxFTUVOVF9DQVNUIChzcmMpLCBjb250ZXh0KTsKKyAgICB9IGVsc2UgeworICAgICAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKworICAgICAgbWVzc2FnZSA9CisgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X25lZWRfY29udGV4dCAoR1NUX09CSkVDVF9DQVNUIChzcmMpLAorICAgICAgICAgIEdTVF9TT1VQX1NFU1NJT05fQ09OVEVYVCk7CisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHNyYyksIG1lc3NhZ2UpOworICAgIH0KKyAgICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKworICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3JjKTsKKyAgICBpZiAoc3JjLT5leHRlcm5hbF9zZXNzaW9uICYmIChjYW5fc2hhcmUgfHwgc3JjLT5mb3JjZWRfZXh0ZXJuYWxfc2Vzc2lvbikpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIlVzaW5nIGV4dGVybmFsIHNlc3Npb24gJXAiLAorICAgICAgICAgIHNyYy0+ZXh0ZXJuYWxfc2Vzc2lvbik7CisgICAgICBzcmMtPnNlc3Npb24gPSBnX29iamVjdF9yZWYgKHNyYy0+ZXh0ZXJuYWxfc2Vzc2lvbik7CisgICAgICBzcmMtPnNlc3Npb25faXNfc2hhcmVkID0gVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiQ3JlYXRpbmcgc2Vzc2lvbiAoY2FuIHNoYXJlICVkKSIsIGNhbl9zaGFyZSk7CisKKyAgICAgIC8qIFdlIGV4cGxpY2l0bHkgc2V0IFVzZXItQWdlbnQgdG8gTlVMTCBoZXJlIGFuZCBvdmVyd3JpdGUgaXQgcGVyIG1lc3NhZ2UKKyAgICAgICAqIHRvIGJlIGFibGUgdG8gaGF2ZSB0aGUgc2FtZSBzZXNzaW9uIHdpdGggZGlmZmVyZW50IFVzZXItQWdlbnRzIHBlcgorICAgICAgICogc291cmNlICovCisgICAgICBpZiAoc3JjLT5wcm94eSA9PSBOVUxMKSB7CisgICAgICAgIHNyYy0+c2Vzc2lvbiA9CisgICAgICAgICAgICBzb3VwX3Nlc3Npb25fbmV3X3dpdGhfb3B0aW9ucyAoU09VUF9TRVNTSU9OX1VTRVJfQUdFTlQsCisgICAgICAgICAgICBOVUxMLCBTT1VQX1NFU1NJT05fVElNRU9VVCwgc3JjLT50aW1lb3V0LAorICAgICAgICAgICAgU09VUF9TRVNTSU9OX1NTTF9TVFJJQ1QsIHNyYy0+c3NsX3N0cmljdCwKKyAgICAgICAgICAgIFNPVVBfU0VTU0lPTl9UTFNfSU5URVJBQ1RJT04sIHNyYy0+dGxzX2ludGVyYWN0aW9uLCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyYy0+c2Vzc2lvbiA9CisgICAgICAgICAgICBzb3VwX3Nlc3Npb25fbmV3X3dpdGhfb3B0aW9ucyAoU09VUF9TRVNTSU9OX1BST1hZX1VSSSwgc3JjLT5wcm94eSwKKyAgICAgICAgICAgIFNPVVBfU0VTU0lPTl9USU1FT1VULCBzcmMtPnRpbWVvdXQsCisgICAgICAgICAgICBTT1VQX1NFU1NJT05fU1NMX1NUUklDVCwgc3JjLT5zc2xfc3RyaWN0LAorICAgICAgICAgICAgU09VUF9TRVNTSU9OX1VTRVJfQUdFTlQsIE5VTEwsCisgICAgICAgICAgICBTT1VQX1NFU1NJT05fVExTX0lOVEVSQUNUSU9OLCBzcmMtPnRsc19pbnRlcmFjdGlvbiwgTlVMTCk7CisgICAgICB9CisKKyAgICAgIGlmIChzcmMtPnNlc3Npb24pIHsKKyAgICAgICAgZ3N0X3NvdXBfdXRpbF9sb2dfc2V0dXAgKHNyYy0+c2Vzc2lvbiwgc3JjLT5sb2dfbGV2ZWwsCisgICAgICAgICAgICBHU1RfRUxFTUVOVCAoc3JjKSk7CisgICAgICAgIHNvdXBfc2Vzc2lvbl9hZGRfZmVhdHVyZV9ieV90eXBlIChzcmMtPnNlc3Npb24sCisgICAgICAgICAgICBTT1VQX1RZUEVfQ09OVEVOVF9ERUNPREVSKTsKKyAgICAgICAgc291cF9zZXNzaW9uX2FkZF9mZWF0dXJlX2J5X3R5cGUgKHNyYy0+c2Vzc2lvbiwgU09VUF9UWVBFX0NPT0tJRV9KQVIpOworCisgICAgICAgIGlmIChjYW5fc2hhcmUpIHsKKyAgICAgICAgICBHc3RDb250ZXh0ICpjb250ZXh0OworICAgICAgICAgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisgICAgICAgICAgR3N0U3RydWN0dXJlICpzOworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiU2hhcmluZyBzZXNzaW9uICVwIiwgc3JjLT5zZXNzaW9uKTsKKyAgICAgICAgICBzcmMtPnNlc3Npb25faXNfc2hhcmVkID0gVFJVRTsKKworICAgICAgICAgIC8qIFVuc2V0IHRoZSBsaW1pdCB0aGUgbnVtYmVyIG9mIG1heGltdW0gYWxsb3dlZCBjb25uZWN0aW9uICovCisgICAgICAgICAgZ19vYmplY3Rfc2V0IChzcmMtPnNlc3Npb24sIFNPVVBfU0VTU0lPTl9NQVhfQ09OTlMsIEdfTUFYSU5ULAorICAgICAgICAgICAgICBTT1VQX1NFU1NJT05fTUFYX0NPTk5TX1BFUl9IT1NULCBHX01BWElOVCwgTlVMTCk7CisKKyAgICAgICAgICBjb250ZXh0ID0gZ3N0X2NvbnRleHRfbmV3IChHU1RfU09VUF9TRVNTSU9OX0NPTlRFWFQsIFRSVUUpOworICAgICAgICAgIHMgPSBnc3RfY29udGV4dF93cml0YWJsZV9zdHJ1Y3R1cmUgKGNvbnRleHQpOworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAic2Vzc2lvbiIsIFNPVVBfVFlQRV9TRVNTSU9OLCBzcmMtPnNlc3Npb24sCisgICAgICAgICAgICAgICJmb3JjZSIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwgTlVMTCk7CisKKyAgICAgICAgICBnc3Rfb2JqZWN0X3JlZiAoc3JjLT5zZXNzaW9uKTsKKyAgICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc3JjKTsKKyAgICAgICAgICBnc3RfZWxlbWVudF9zZXRfY29udGV4dCAoR1NUX0VMRU1FTlRfQ0FTVCAoc3JjKSwgY29udGV4dCk7CisgICAgICAgICAgbWVzc2FnZSA9CisgICAgICAgICAgICAgIGdzdF9tZXNzYWdlX25ld19oYXZlX2NvbnRleHQgKEdTVF9PQkpFQ1RfQ0FTVCAoc3JjKSwgY29udGV4dCk7CisgICAgICAgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChzcmMpLCBtZXNzYWdlKTsKKyAgICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNyYyk7CisgICAgICAgICAgZ3N0X29iamVjdF91bnJlZiAoc3JjLT5zZXNzaW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzcmMtPnNlc3Npb25faXNfc2hhcmVkID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXNyYy0+c2Vzc2lvbikgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgTElCUkFSWSwgSU5JVCwKKyAgICAgICAgICAoTlVMTCksICgiRmFpbGVkIHRvIGNyZWF0ZSBzZXNzaW9uIikpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgZ19zaWduYWxfY29ubmVjdCAoc3JjLT5zZXNzaW9uLCAiYXV0aGVudGljYXRlIiwKKyAgICAgICAgR19DQUxMQkFDSyAoZ3N0X3NvdXBfaHR0cF9zcmNfYXV0aGVudGljYXRlX2NiKSwgc3JjKTsKKworICAgIGlmICghc3JjLT5zZXNzaW9uX2lzX3NoYXJlZCkgeworICAgICAgaWYgKHNyYy0+dGxzX2RhdGFiYXNlKQorICAgICAgICBnX29iamVjdF9zZXQgKHNyYy0+c2Vzc2lvbiwgInRscy1kYXRhYmFzZSIsIHNyYy0+dGxzX2RhdGFiYXNlLCBOVUxMKTsKKyAgICAgIGVsc2UgaWYgKHNyYy0+c3NsX2NhX2ZpbGUpCisgICAgICAgIGdfb2JqZWN0X3NldCAoc3JjLT5zZXNzaW9uLCAic3NsLWNhLWZpbGUiLCBzcmMtPnNzbF9jYV9maWxlLCBOVUxMKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZ19vYmplY3Rfc2V0IChzcmMtPnNlc3Npb24sICJzc2wtdXNlLXN5c3RlbS1jYS1maWxlIiwKKyAgICAgICAgICAgIHNyYy0+c3NsX3VzZV9zeXN0ZW1fY2FfZmlsZSwgTlVMTCk7CisgICAgfQorICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcmMpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIlJlLXVzaW5nIHNlc3Npb24iKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NvdXBfaHR0cF9zcmNfc2Vzc2lvbl9jbG9zZSAoR3N0U291cEhUVFBTcmMgKiBzcmMpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIkNsb3Npbmcgc2Vzc2lvbiIpOworCisgIGdfbXV0ZXhfbG9jayAoJnNyYy0+bXV0ZXgpOworICBpZiAoc3JjLT5tc2cpIHsKKyAgICBzb3VwX3Nlc3Npb25fY2FuY2VsX21lc3NhZ2UgKHNyYy0+c2Vzc2lvbiwgc3JjLT5tc2csIFNPVVBfU1RBVFVTX0NBTkNFTExFRCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHNyYy0+bXNnKTsKKyAgICBzcmMtPm1zZyA9IE5VTEw7CisgIH0KKworICBpZiAoc3JjLT5zZXNzaW9uKSB7CisgICAgaWYgKCFzcmMtPnNlc3Npb25faXNfc2hhcmVkKQorICAgICAgc291cF9zZXNzaW9uX2Fib3J0IChzcmMtPnNlc3Npb24pOworICAgIGdfc2lnbmFsX2hhbmRsZXJzX2Rpc2Nvbm5lY3RfYnlfZnVuYyAoc3JjLT5zZXNzaW9uLAorICAgICAgICBHX0NBTExCQUNLIChnc3Rfc291cF9odHRwX3NyY19hdXRoZW50aWNhdGVfY2IpLCBzcmMpOworICAgIGdfb2JqZWN0X3VucmVmIChzcmMtPnNlc3Npb24pOworICAgIHNyYy0+c2Vzc2lvbiA9IE5VTEw7CisgIH0KKworICBnX211dGV4X3VubG9jayAoJnNyYy0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NvdXBfaHR0cF9zcmNfYXV0aGVudGljYXRlX2NiIChTb3VwU2Vzc2lvbiAqIHNlc3Npb24sIFNvdXBNZXNzYWdlICogbXNnLAorICAgIFNvdXBBdXRoICogYXV0aCwgZ2Jvb2xlYW4gcmV0cnlpbmcsIEdzdFNvdXBIVFRQU3JjICogc3JjKQoreworICAvKiBNaWdodCBiZSBmcm9tIGFub3RoZXIgdXNlciBvZiB0aGUgc2hhcmVkIHNlc3Npb24gKi8KKyAgaWYgKCFHU1RfSVNfU09VUF9IVFRQX1NSQyAoc3JjKSB8fCBtc2cgIT0gc3JjLT5tc2cpCisgICAgcmV0dXJuOworCisgIGlmICghcmV0cnlpbmcpIHsKKyAgICAvKiBGaXJzdCB0aW1lIGF1dGhlbnRpY2F0aW9uIG9ubHksIGlmIHdlIGZhaWwgYW5kIGFyZSBjYWxsZWQgYWdhaW4gd2l0aCByZXRyeSB0cnVlIGZhbGwgdGhyb3VnaCAqLworICAgIGlmIChtc2ctPnN0YXR1c19jb2RlID09IFNPVVBfU1RBVFVTX1VOQVVUSE9SSVpFRCkgeworICAgICAgaWYgKHNyYy0+dXNlcl9pZCAmJiBzcmMtPnVzZXJfcHcpCisgICAgICAgIHNvdXBfYXV0aF9hdXRoZW50aWNhdGUgKGF1dGgsIHNyYy0+dXNlcl9pZCwgc3JjLT51c2VyX3B3KTsKKyAgICB9IGVsc2UgaWYgKG1zZy0+c3RhdHVzX2NvZGUgPT0gU09VUF9TVEFUVVNfUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQpIHsKKyAgICAgIGlmIChzcmMtPnByb3h5X2lkICYmIHNyYy0+cHJveHlfcHcpCisgICAgICAgIHNvdXBfYXV0aF9hdXRoZW50aWNhdGUgKGF1dGgsIHNyYy0+cHJveHlfaWQsIHNyYy0+cHJveHlfcHcpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAoraW5zZXJ0X2h0dHBfaGVhZGVyIChjb25zdCBnY2hhciAqIG5hbWUsIGNvbnN0IGdjaGFyICogdmFsdWUsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0U3RydWN0dXJlICpoZWFkZXJzID0gdXNlcl9kYXRhOworICBjb25zdCBHVmFsdWUgKmd2OworCisgIGlmICghZ191dGY4X3ZhbGlkYXRlIChuYW1lLCAtMSwgTlVMTCkgfHwgIWdfdXRmOF92YWxpZGF0ZSAodmFsdWUsIC0xLCBOVUxMKSkKKyAgICByZXR1cm47CisKKyAgZ3YgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoaGVhZGVycywgbmFtZSk7CisgIGlmIChndiAmJiBHU1RfVkFMVUVfSE9MRFNfQVJSQVkgKGd2KSkgeworICAgIEdWYWx1ZSB2ID0gR19WQUxVRV9JTklUOworCisgICAgZ192YWx1ZV9pbml0ICgmdiwgR19UWVBFX1NUUklORyk7CisgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmdiwgdmFsdWUpOworICAgIGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfdmFsdWUgKChHVmFsdWUgKikgZ3YsICZ2KTsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisgIH0gZWxzZSBpZiAoZ3YgJiYgR19WQUxVRV9IT0xEU19TVFJJTkcgKGd2KSkgeworICAgIEdWYWx1ZSBhcnIgPSBHX1ZBTFVFX0lOSVQ7CisgICAgR1ZhbHVlIHYgPSBHX1ZBTFVFX0lOSVQ7CisgICAgY29uc3QgZ2NoYXIgKm9sZF92YWx1ZSA9IGdfdmFsdWVfZ2V0X3N0cmluZyAoZ3YpOworCisgICAgZ192YWx1ZV9pbml0ICgmYXJyLCBHU1RfVFlQRV9BUlJBWSk7CisgICAgZ192YWx1ZV9pbml0ICgmdiwgR19UWVBFX1NUUklORyk7CisgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmdiwgb2xkX3ZhbHVlKTsKKyAgICBnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX3ZhbHVlICgmYXJyLCAmdik7CisgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmdiwgdmFsdWUpOworICAgIGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfdmFsdWUgKCZhcnIsICZ2KTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChoZWFkZXJzLCBuYW1lLCAmYXJyKTsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisgICAgZ192YWx1ZV91bnNldCAoJmFycik7CisgIH0gZWxzZSB7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKGhlYWRlcnMsIG5hbWUsIEdfVFlQRV9TVFJJTkcsIHZhbHVlLCBOVUxMKTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NvdXBfaHR0cF9zcmNfZ290X2hlYWRlcnMgKEdzdFNvdXBIVFRQU3JjICogc3JjLCBTb3VwTWVzc2FnZSAqIG1zZykKK3sKKyAgY29uc3QgY2hhciAqdmFsdWU7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworICBHc3RCYXNlU3JjICpiYXNlc3JjOworICBndWludDY0IG5ld3NpemU7CisgIEdIYXNoVGFibGUgKnBhcmFtcyA9IE5VTEw7CisgIEdzdEV2ZW50ICpodHRwX2hlYWRlcnNfZXZlbnQ7CisgIEdzdFN0cnVjdHVyZSAqaHR0cF9oZWFkZXJzLCAqaGVhZGVyczsKKyAgY29uc3QgZ2NoYXIgKmFjY2VwdF9yYW5nZXM7CisKKyAgR1NUX0lORk9fT0JKRUNUIChzcmMsICJnb3QgaGVhZGVycyIpOworCisgIGlmIChtc2ctPnN0YXR1c19jb2RlID09IFNPVVBfU1RBVFVTX1BST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEICYmCisgICAgICBzcmMtPnByb3h5X2lkICYmIHNyYy0+cHJveHlfcHcpIHsKKyAgICAvKiB3YWl0IGZvciBhdXRoZW50aWNhdGUgY2FsbGJhY2sgKi8KKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICBodHRwX2hlYWRlcnMgPSBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoImh0dHAtaGVhZGVycyIpOworICBnc3Rfc3RydWN0dXJlX3NldCAoaHR0cF9oZWFkZXJzLCAidXJpIiwgR19UWVBFX1NUUklORywgc3JjLT5sb2NhdGlvbiwKKyAgICAgICJodHRwLXN0YXR1cy1jb2RlIiwgR19UWVBFX1VJTlQsIG1zZy0+c3RhdHVzX2NvZGUsIE5VTEwpOworICBpZiAoc3JjLT5yZWRpcmVjdGlvbl91cmkpCisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKGh0dHBfaGVhZGVycywgInJlZGlyZWN0aW9uLXVyaSIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgIHNyYy0+cmVkaXJlY3Rpb25fdXJpLCBOVUxMKTsKKyAgaGVhZGVycyA9IGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgicmVxdWVzdC1oZWFkZXJzIik7CisgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2ZvcmVhY2ggKG1zZy0+cmVxdWVzdF9oZWFkZXJzLCBpbnNlcnRfaHR0cF9oZWFkZXIsCisgICAgICBoZWFkZXJzKTsKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKGh0dHBfaGVhZGVycywgInJlcXVlc3QtaGVhZGVycyIsIEdTVF9UWVBFX1NUUlVDVFVSRSwKKyAgICAgIGhlYWRlcnMsIE5VTEwpOworICBnc3Rfc3RydWN0dXJlX2ZyZWUgKGhlYWRlcnMpOworICBoZWFkZXJzID0gZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCJyZXNwb25zZS1oZWFkZXJzIik7CisgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2ZvcmVhY2ggKG1zZy0+cmVzcG9uc2VfaGVhZGVycywgaW5zZXJ0X2h0dHBfaGVhZGVyLAorICAgICAgaGVhZGVycyk7CisgIGdzdF9zdHJ1Y3R1cmVfc2V0IChodHRwX2hlYWRlcnMsICJyZXNwb25zZS1oZWFkZXJzIiwgR1NUX1RZUEVfU1RSVUNUVVJFLAorICAgICAgaGVhZGVycywgTlVMTCk7CisgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoaGVhZGVycyk7CisKKyAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChzcmMpLAorICAgICAgZ3N0X21lc3NhZ2VfbmV3X2VsZW1lbnQgKEdTVF9PQkpFQ1RfQ0FTVCAoc3JjKSwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX2NvcHkgKGh0dHBfaGVhZGVycykpKTsKKworICBpZiAobXNnLT5zdGF0dXNfY29kZSA9PSBTT1VQX1NUQVRVU19VTkFVVEhPUklaRUQpIHsKKyAgICAvKiBmb3JjZSBhbiBlcnJvciAqLworICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoaHR0cF9oZWFkZXJzKTsKKyAgICByZXR1cm4gZ3N0X3NvdXBfaHR0cF9zcmNfcGFyc2Vfc3RhdHVzIChtc2csIHNyYyk7CisgIH0KKworICBzcmMtPmdvdF9oZWFkZXJzID0gVFJVRTsKKyAgZ19jb25kX2Jyb2FkY2FzdCAoJnNyYy0+aGF2ZV9oZWFkZXJzX2NvbmQpOworCisgIGh0dHBfaGVhZGVyc19ldmVudCA9CisgICAgICBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNX1NUSUNLWSwgaHR0cF9oZWFkZXJzKTsKKyAgZ3N0X2V2ZW50X3JlcGxhY2UgKCZzcmMtPmh0dHBfaGVhZGVyc19ldmVudCwgaHR0cF9oZWFkZXJzX2V2ZW50KTsKKyAgZ3N0X2V2ZW50X3VucmVmIChodHRwX2hlYWRlcnNfZXZlbnQpOworCisgIC8qIFBhcnNlIENvbnRlbnQtTGVuZ3RoLiAqLworICBpZiAoc291cF9tZXNzYWdlX2hlYWRlcnNfZ2V0X2VuY29kaW5nIChtc2ctPnJlc3BvbnNlX2hlYWRlcnMpID09CisgICAgICBTT1VQX0VOQ09ESU5HX0NPTlRFTlRfTEVOR1RIKSB7CisgICAgbmV3c2l6ZSA9IHNyYy0+cmVxdWVzdF9wb3NpdGlvbiArCisgICAgICAgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2dldF9jb250ZW50X2xlbmd0aCAobXNnLT5yZXNwb25zZV9oZWFkZXJzKTsKKyAgICBpZiAoIXNyYy0+aGF2ZV9zaXplIHx8IChzcmMtPmNvbnRlbnRfc2l6ZSAhPSBuZXdzaXplKSkgeworICAgICAgc3JjLT5jb250ZW50X3NpemUgPSBuZXdzaXplOworICAgICAgc3JjLT5oYXZlX3NpemUgPSBUUlVFOworICAgICAgc3JjLT5zZWVrYWJsZSA9IFRSVUU7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzaXplID0gJSIgR19HVUlOVDY0X0ZPUk1BVCwgc3JjLT5jb250ZW50X3NpemUpOworCisgICAgICBiYXNlc3JjID0gR1NUX0JBU0VfU1JDX0NBU1QgKHNyYyk7CisgICAgICBiYXNlc3JjLT5zZWdtZW50LmR1cmF0aW9uID0gc3JjLT5jb250ZW50X3NpemU7CisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UIChzcmMpLAorICAgICAgICAgIGdzdF9tZXNzYWdlX25ld19kdXJhdGlvbl9jaGFuZ2VkIChHU1RfT0JKRUNUIChzcmMpKSk7CisgICAgfQorICB9CisKKyAgLyogSWYgdGhlIHNlcnZlciByZXBvcnRzIEFjY2VwdC1SYW5nZXM6IG5vbmUgd2UgZG9uJ3QgaGF2ZSB0byB0cnkKKyAgICogZG9pbmcgcmFuZ2UgcmVxdWVzdHMgYXQgYWxsCisgICAqLworICBpZiAoKGFjY2VwdF9yYW5nZXMgPQorICAgICAgICAgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2dldF9vbmUgKG1zZy0+cmVzcG9uc2VfaGVhZGVycywKKyAgICAgICAgICAgICAgIkFjY2VwdC1SYW5nZXMiKSkpIHsKKyAgICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wIChhY2NlcHRfcmFuZ2VzLCAibm9uZSIpID09IDApCisgICAgICBzcmMtPnNlZWthYmxlID0gRkFMU0U7CisgIH0KKworICAvKiBJY2VjYXN0IHN0dWZmICovCisgIHRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKworICBpZiAoKHZhbHVlID0KKyAgICAgICAgICBzb3VwX21lc3NhZ2VfaGVhZGVyc19nZXRfb25lIChtc2ctPnJlc3BvbnNlX2hlYWRlcnMsCisgICAgICAgICAgICAgICJpY3ktbWV0YWludCIpKSAhPSBOVUxMKSB7CisgICAgZ2ludCBpY3lfbWV0YWludDsKKworICAgIGlmIChnX3V0ZjhfdmFsaWRhdGUgKHZhbHVlLCAtMSwgTlVMTCkpIHsKKyAgICAgIGljeV9tZXRhaW50ID0gYXRvaSAodmFsdWUpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJpY3ktbWV0YWludDogJXMgKHBhcnNlZDogJWQpIiwgdmFsdWUsCisgICAgICAgICAgaWN5X21ldGFpbnQpOworICAgICAgaWYgKGljeV9tZXRhaW50ID4gMCkgeworICAgICAgICBpZiAoc3JjLT5zcmNfY2FwcykKKyAgICAgICAgICBnc3RfY2Fwc191bnJlZiAoc3JjLT5zcmNfY2Fwcyk7CisKKyAgICAgICAgc3JjLT5zcmNfY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhcHBsaWNhdGlvbi94LWljeSIsCisgICAgICAgICAgICAibWV0YWRhdGEtaW50ZXJ2YWwiLCBHX1RZUEVfSU5ULCBpY3lfbWV0YWludCwgTlVMTCk7CisKKyAgICAgICAgZ3N0X2Jhc2Vfc3JjX3NldF9jYXBzIChHU1RfQkFTRV9TUkMgKHNyYyksIHNyYy0+c3JjX2NhcHMpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoKHZhbHVlID0KKyAgICAgICAgICBzb3VwX21lc3NhZ2VfaGVhZGVyc19nZXRfY29udGVudF90eXBlIChtc2ctPnJlc3BvbnNlX2hlYWRlcnMsCisgICAgICAgICAgICAgICZwYXJhbXMpKSAhPSBOVUxMKSB7CisgICAgaWYgKCFnX3V0ZjhfdmFsaWRhdGUgKHZhbHVlLCAtMSwgTlVMTCkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiQ29udGVudC1UeXBlIGlzIGludmFsaWQgVVRGLTgiKTsKKyAgICB9IGVsc2UgaWYgKGdfYXNjaWlfc3RyY2FzZWNtcCAodmFsdWUsICJhdWRpby9MMTYiKSA9PSAwKSB7CisgICAgICBnaW50IGNoYW5uZWxzID0gMjsKKyAgICAgIGdpbnQgcmF0ZSA9IDQ0MTAwOworICAgICAgY2hhciAqcGFyYW07CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIkNvbnRlbnQtVHlwZTogJXMiLCB2YWx1ZSk7CisKKyAgICAgIGlmIChzcmMtPnNyY19jYXBzKSB7CisgICAgICAgIGdzdF9jYXBzX3VucmVmIChzcmMtPnNyY19jYXBzKTsKKyAgICAgICAgc3JjLT5zcmNfY2FwcyA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIHBhcmFtID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAocGFyYW1zLCAiY2hhbm5lbHMiKTsKKyAgICAgIGlmIChwYXJhbSAhPSBOVUxMKSB7CisgICAgICAgIGd1aW50NjQgdmFsID0gZ19hc2NpaV9zdHJ0b3VsbCAocGFyYW0sIE5VTEwsIDEwKTsKKyAgICAgICAgaWYgKHZhbCA8IDY0KQorICAgICAgICAgIGNoYW5uZWxzID0gdmFsOworICAgICAgICBlbHNlCisgICAgICAgICAgY2hhbm5lbHMgPSAwOworICAgICAgfQorCisgICAgICBwYXJhbSA9IGdfaGFzaF90YWJsZV9sb29rdXAgKHBhcmFtcywgInJhdGUiKTsKKyAgICAgIGlmIChwYXJhbSAhPSBOVUxMKSB7CisgICAgICAgIGd1aW50NjQgdmFsID0gZ19hc2NpaV9zdHJ0b3VsbCAocGFyYW0sIE5VTEwsIDEwKTsKKyAgICAgICAgaWYgKHZhbCA8IEdfTUFYSU5UKQorICAgICAgICAgIHJhdGUgPSB2YWw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByYXRlID0gMDsKKyAgICAgIH0KKworICAgICAgaWYgKHJhdGUgPiAwICYmIGNoYW5uZWxzID4gMCkgeworICAgICAgICBzcmMtPnNyY19jYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtdW5hbGlnbmVkLXJhdyIsCisgICAgICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIlMxNkJFIiwKKyAgICAgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAiaW50ZXJsZWF2ZWQiLAorICAgICAgICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgY2hhbm5lbHMsICJyYXRlIiwgR19UWVBFX0lOVCwgcmF0ZSwgTlVMTCk7CisKKyAgICAgICAgZ3N0X2Jhc2Vfc3JjX3NldF9jYXBzIChHU1RfQkFTRV9TUkMgKHNyYyksIHNyYy0+c3JjX2NhcHMpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJDb250ZW50LVR5cGU6ICVzIiwgdmFsdWUpOworCisgICAgICAvKiBTZXQgdGhlIENvbnRlbnQtVHlwZSBmaWVsZCBvbiB0aGUgY2FwcyAqLworICAgICAgaWYgKHNyYy0+c3JjX2NhcHMpIHsKKyAgICAgICAgc3JjLT5zcmNfY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKHNyYy0+c3JjX2NhcHMpOworICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChzcmMtPnNyY19jYXBzLCAiY29udGVudC10eXBlIiwgR19UWVBFX1NUUklORywKKyAgICAgICAgICAgIHZhbHVlLCBOVUxMKTsKKyAgICAgICAgZ3N0X2Jhc2Vfc3JjX3NldF9jYXBzIChHU1RfQkFTRV9TUkMgKHNyYyksIHNyYy0+c3JjX2NhcHMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChwYXJhbXMgIT0gTlVMTCkKKyAgICBnX2hhc2hfdGFibGVfZGVzdHJveSAocGFyYW1zKTsKKworICBpZiAoKHZhbHVlID0KKyAgICAgICAgICBzb3VwX21lc3NhZ2VfaGVhZGVyc19nZXRfb25lIChtc2ctPnJlc3BvbnNlX2hlYWRlcnMsCisgICAgICAgICAgICAgICJpY3ktbmFtZSIpKSAhPSBOVUxMKSB7CisgICAgaWYgKGdfdXRmOF92YWxpZGF0ZSAodmFsdWUsIC0xLCBOVUxMKSkgeworICAgICAgZ19mcmVlIChzcmMtPmlyYWRpb19uYW1lKTsKKyAgICAgIHNyYy0+aXJhZGlvX25hbWUgPSBnc3Rfc291cF9odHRwX3NyY191bmljb2RpZnkgKHZhbHVlKTsKKyAgICAgIGlmIChzcmMtPmlyYWRpb19uYW1lKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIEdTVF9UQUdfT1JHQU5JWkFUSU9OLAorICAgICAgICAgICAgc3JjLT5pcmFkaW9fbmFtZSwgTlVMTCk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmICgodmFsdWUgPQorICAgICAgICAgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2dldF9vbmUgKG1zZy0+cmVzcG9uc2VfaGVhZGVycywKKyAgICAgICAgICAgICAgImljeS1nZW5yZSIpKSAhPSBOVUxMKSB7CisgICAgaWYgKGdfdXRmOF92YWxpZGF0ZSAodmFsdWUsIC0xLCBOVUxMKSkgeworICAgICAgZ19mcmVlIChzcmMtPmlyYWRpb19nZW5yZSk7CisgICAgICBzcmMtPmlyYWRpb19nZW5yZSA9IGdzdF9zb3VwX2h0dHBfc3JjX3VuaWNvZGlmeSAodmFsdWUpOworICAgICAgaWYgKHNyYy0+aXJhZGlvX2dlbnJlKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIEdTVF9UQUdfR0VOUkUsCisgICAgICAgICAgICBzcmMtPmlyYWRpb19nZW5yZSwgTlVMTCk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmICgodmFsdWUgPSBzb3VwX21lc3NhZ2VfaGVhZGVyc19nZXRfb25lIChtc2ctPnJlc3BvbnNlX2hlYWRlcnMsICJpY3ktdXJsIikpCisgICAgICAhPSBOVUxMKSB7CisgICAgaWYgKGdfdXRmOF92YWxpZGF0ZSAodmFsdWUsIC0xLCBOVUxMKSkgeworICAgICAgZ19mcmVlIChzcmMtPmlyYWRpb191cmwpOworICAgICAgc3JjLT5pcmFkaW9fdXJsID0gZ3N0X3NvdXBfaHR0cF9zcmNfdW5pY29kaWZ5ICh2YWx1ZSk7CisgICAgICBpZiAoc3JjLT5pcmFkaW9fdXJsKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIEdTVF9UQUdfTE9DQVRJT04sCisgICAgICAgICAgICBzcmMtPmlyYWRpb191cmwsIE5VTEwpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoIWdzdF90YWdfbGlzdF9pc19lbXB0eSAodGFnX2xpc3QpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLAorICAgICAgICAiY2FsbGluZyBnc3RfZWxlbWVudF9mb3VuZF90YWdzIHdpdGggJSIgR1NUX1BUUl9GT1JNQVQsIHRhZ19saXN0KTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9CQVNFX1NSQ19QQUQgKHNyYyksIGdzdF9ldmVudF9uZXdfdGFnICh0YWdfbGlzdCkpOworICB9IGVsc2UgeworICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworICB9CisKKyAgLyogSGFuZGxlIEhUVFAgZXJyb3JzLiAqLworICByZXR1cm4gZ3N0X3NvdXBfaHR0cF9zcmNfcGFyc2Vfc3RhdHVzIChtc2csIHNyYyk7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3NvdXBfaHR0cF9zcmNfYWxsb2NfYnVmZmVyIChHc3RTb3VwSFRUUFNyYyAqIHNyYykKK3sKKyAgR3N0QmFzZVNyYyAqYmFzZXNyYyA9IEdTVF9CQVNFX1NSQ19DQVNUIChzcmMpOworICBHc3RGbG93UmV0dXJuIHJjOworICBHc3RCdWZmZXIgKmdzdGJ1ZjsKKworICByYyA9IEdTVF9CQVNFX1NSQ19DTEFTUyAocGFyZW50X2NsYXNzKS0+YWxsb2MgKGJhc2VzcmMsIC0xLAorICAgICAgYmFzZXNyYy0+YmxvY2tzaXplLCAmZ3N0YnVmKTsKKyAgaWYgKEdfVU5MSUtFTFkgKHJjICE9IEdTVF9GTE9XX09LKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIGdzdGJ1ZjsKK30KKworI2RlZmluZSBTT1VQX0hUVFBfU1JDX0VSUk9SKHNyYyxzb3VwX21zZyxjYXQsY29kZSxlcnJvcl9tZXNzYWdlKSAgICAgXAorICBkbyB7IFwKKyAgICBHU1RfRUxFTUVOVF9FUlJPUl9XSVRIX0RFVEFJTFMgKChzcmMpLCBjYXQsIGNvZGUsICgiJXMiLCBlcnJvcl9tZXNzYWdlKSwgXAorICAgICAgICAoIiVzICglZCksIFVSTDogJXMsIFJlZGlyZWN0IHRvOiAlcyIsIChzb3VwX21zZyktPnJlYXNvbl9waHJhc2UsIFwKKyAgICAgICAgICAgIChzb3VwX21zZyktPnN0YXR1c19jb2RlLCAoc3JjKS0+bG9jYXRpb24sIEdTVF9TVFJfTlVMTCAoKHNyYyktPnJlZGlyZWN0aW9uX3VyaSkpLCBcCisgICAgICAgICAgICAoImh0dHAtc3RhdHVzLWNvZGUiLCBHX1RZUEVfVUlOVCwgKHNvdXBfbXNnKS0+c3RhdHVzX2NvZGUsIFwKKyAgICAgICAgICAgICAiaHR0cC1yZWRpcmVjdC11cmkiLCBHX1RZUEVfU1RSSU5HLCBHU1RfU1RSX05VTEwgKChzcmMpLT5yZWRpcmVjdGlvbl91cmkpLCBOVUxMKSk7IFwKKyAgfSB3aGlsZSgwKQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NvdXBfaHR0cF9zcmNfcGFyc2Vfc3RhdHVzIChTb3VwTWVzc2FnZSAqIG1zZywgR3N0U291cEhUVFBTcmMgKiBzcmMpCit7CisgIGlmIChtc2ctPm1ldGhvZCA9PSBTT1VQX01FVEhPRF9IRUFEKSB7CisgICAgaWYgKCFTT1VQX1NUQVRVU19JU19TVUNDRVNTRlVMIChtc2ctPnN0YXR1c19jb2RlKSkKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIklnbm9yaW5nIGVycm9yICVkIGR1cmluZyBIRUFEIHJlcXVlc3QiLAorICAgICAgICAgIG1zZy0+c3RhdHVzX2NvZGUpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorCisgIGlmIChTT1VQX1NUQVRVU19JU19UUkFOU1BPUlRfRVJST1IgKG1zZy0+c3RhdHVzX2NvZGUpKSB7CisgICAgc3dpdGNoIChtc2ctPnN0YXR1c19jb2RlKSB7CisgICAgICBjYXNlIFNPVVBfU1RBVFVTX0NBTlRfUkVTT0xWRToKKyAgICAgIGNhc2UgU09VUF9TVEFUVVNfQ0FOVF9SRVNPTFZFX1BST1hZOgorICAgICAgICBTT1VQX0hUVFBfU1JDX0VSUk9SIChzcmMsIG1zZywgUkVTT1VSQ0UsIE5PVF9GT1VORCwKKyAgICAgICAgICAgIF8oIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIpKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICAgICAgY2FzZSBTT1VQX1NUQVRVU19DQU5UX0NPTk5FQ1Q6CisgICAgICBjYXNlIFNPVVBfU1RBVFVTX0NBTlRfQ09OTkVDVF9QUk9YWToKKyAgICAgICAgU09VUF9IVFRQX1NSQ19FUlJPUiAoc3JjLCBtc2csIFJFU09VUkNFLCBPUEVOX1JFQUQsCisgICAgICAgICAgICBfKCJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIpKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICAgICAgY2FzZSBTT1VQX1NUQVRVU19TU0xfRkFJTEVEOgorICAgICAgICBTT1VQX0hUVFBfU1JDX0VSUk9SIChzcmMsIG1zZywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwKKyAgICAgICAgICAgIF8oIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iKSk7CisgICAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgICAgIGNhc2UgU09VUF9TVEFUVVNfSU9fRVJST1I6CisgICAgICAgIGlmIChzcmMtPm1heF9yZXRyaWVzID09IC0xIHx8IHNyYy0+cmV0cnlfY291bnQgPCBzcmMtPm1heF9yZXRyaWVzKQorICAgICAgICAgIHJldHVybiBHU1RfRkxPV19DVVNUT01fRVJST1I7CisgICAgICAgIFNPVVBfSFRUUF9TUkNfRVJST1IgKHNyYywgbXNnLCBSRVNPVVJDRSwgUkVBRCwKKyAgICAgICAgICAgIF8oIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gIgorICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkbHkuIikpOworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgICBjYXNlIFNPVVBfU1RBVFVTX01BTEZPUk1FRDoKKyAgICAgICAgU09VUF9IVFRQX1NSQ19FUlJPUiAoc3JjLCBtc2csIFJFU09VUkNFLCBSRUFELAorICAgICAgICAgICAgXygiU2VydmVyIHNlbnQgYmFkIGRhdGEuIikpOworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgICBjYXNlIFNPVVBfU1RBVFVTX0NBTkNFTExFRDoKKyAgICAgICAgLyogTm8gZXJyb3IgbWVzc2FnZSB3aGVuIGludGVycnVwdGVkIGJ5IHByb2dyYW0uICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICBpZiAoU09VUF9TVEFUVVNfSVNfQ0xJRU5UX0VSUk9SIChtc2ctPnN0YXR1c19jb2RlKSB8fAorICAgICAgU09VUF9TVEFUVVNfSVNfUkVESVJFQ1RJT04gKG1zZy0+c3RhdHVzX2NvZGUpIHx8CisgICAgICBTT1VQX1NUQVRVU19JU19TRVJWRVJfRVJST1IgKG1zZy0+c3RhdHVzX2NvZGUpKSB7CisgICAgY29uc3QgZ2NoYXIgKnJlYXNvbl9waHJhc2U7CisKKyAgICByZWFzb25fcGhyYXNlID0gbXNnLT5yZWFzb25fcGhyYXNlOworICAgIGlmIChyZWFzb25fcGhyYXNlICYmICFnX3V0ZjhfdmFsaWRhdGUgKHJlYXNvbl9waHJhc2UsIC0xLCBOVUxMKSkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAoc3JjLCAiSW52YWxpZCBVVEYtOCBpbiByZWFzb24iKTsKKyAgICAgIHJlYXNvbl9waHJhc2UgPSAiKGludmFsaWQpIjsKKyAgICB9CisKKyAgICAvKiBSZXBvcnQgSFRUUCBlcnJvci4gKi8KKworICAgIC8qIHdoZW4gY29udGVudF9zaXplIGlzIHVua25vd24gYW5kIHdlIGhhdmUganVzdCBmaW5pc2hlZCByZWNlaXZpbmcKKyAgICAgKiBhIGJvZHkgbWVzc2FnZSwgcmVxdWVzdHMgdGhhdCBnbyBiZXlvbmQgdGhlIGNvbnRlbnQgbGltaXRzIHdpbGwgcmVzdWx0CisgICAgICogaW4gYW4gZXJyb3IuIEhlcmUgd2UgY29udmVydCB0aG9zZSB0byBFT1MgKi8KKyAgICBpZiAobXNnLT5zdGF0dXNfY29kZSA9PSBTT1VQX1NUQVRVU19SRVFVRVNURURfUkFOR0VfTk9UX1NBVElTRklBQkxFICYmCisgICAgICAgIHNyYy0+aGF2ZV9ib2R5ICYmICFzcmMtPmhhdmVfc2l6ZSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiUmVxdWVzdGVkIHJhbmdlIG91dCBvZiBsaW1pdHMgYW5kIHJlY2VpdmVkIGZ1bGwgIgorICAgICAgICAgICJib2R5LCByZXR1cm5pbmcgRU9TIik7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworICAgIH0KKworICAgIC8qIEZJWE1FOiByZWFzb25fcGhyYXNlIGlzIG5vdCB0cmFuc2xhdGVkIGFuZCBub3Qgc3VpdGFibGUgZm9yIHVzZXIKKyAgICAgKiBlcnJvciBkaWFsb2cgYWNjb3JkaW5nIHRvIGxpYnNvdXAgZG9jdW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBpZiAobXNnLT5zdGF0dXNfY29kZSA9PSBTT1VQX1NUQVRVU19OT1RfRk9VTkQpIHsKKyAgICAgIFNPVVBfSFRUUF9TUkNfRVJST1IgKHNyYywgbXNnLCBSRVNPVVJDRSwgTk9UX0ZPVU5ELCAocmVhc29uX3BocmFzZSkpOworICAgIH0gZWxzZSBpZiAobXNnLT5zdGF0dXNfY29kZSA9PSBTT1VQX1NUQVRVU19VTkFVVEhPUklaRUQKKyAgICAgICAgfHwgbXNnLT5zdGF0dXNfY29kZSA9PSBTT1VQX1NUQVRVU19QQVlNRU5UX1JFUVVJUkVECisgICAgICAgIHx8IG1zZy0+c3RhdHVzX2NvZGUgPT0gU09VUF9TVEFUVVNfRk9SQklEREVOCisgICAgICAgIHx8IG1zZy0+c3RhdHVzX2NvZGUgPT0gU09VUF9TVEFUVVNfUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQpIHsKKyAgICAgIFNPVVBfSFRUUF9TUkNfRVJST1IgKHNyYywgbXNnLCBSRVNPVVJDRSwgTk9UX0FVVEhPUklaRUQsIChyZWFzb25fcGhyYXNlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFNPVVBfSFRUUF9TUkNfRVJST1IgKHNyYywgbXNnLCBSRVNPVVJDRSwgT1BFTl9SRUFELCAocmVhc29uX3BocmFzZSkpOworICAgIH0KKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc291cF9odHRwX3NyY19yZXN0YXJ0ZWRfY2IgKFNvdXBNZXNzYWdlICogbXNnLCBHc3RTb3VwSFRUUFNyYyAqIHNyYykKK3sKKyAgaWYgKHNvdXBfc2Vzc2lvbl93b3VsZF9yZWRpcmVjdCAoc3JjLT5zZXNzaW9uLCBtc2cpKSB7CisgICAgc3JjLT5yZWRpcmVjdGlvbl91cmkgPQorICAgICAgICBzb3VwX3VyaV90b19zdHJpbmcgKHNvdXBfbWVzc2FnZV9nZXRfdXJpIChtc2cpLCBGQUxTRSk7CisgICAgc3JjLT5yZWRpcmVjdGlvbl9wZXJtYW5lbnQgPQorICAgICAgICAobXNnLT5zdGF0dXNfY29kZSA9PSBTT1VQX1NUQVRVU19NT1ZFRF9QRVJNQU5FTlRMWSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiJXUgcmVkaXJlY3QgdG8gXCIlc1wiIChwZXJtYW5lbnQgJWQpIiwKKyAgICAgICAgbXNnLT5zdGF0dXNfY29kZSwgc3JjLT5yZWRpcmVjdGlvbl91cmksIHNyYy0+cmVkaXJlY3Rpb25fcGVybWFuZW50KTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zb3VwX2h0dHBfc3JjX2J1aWxkX21lc3NhZ2UgKEdzdFNvdXBIVFRQU3JjICogc3JjLCBjb25zdCBnY2hhciAqIG1ldGhvZCkKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNyYy0+bXNnID09IE5VTEwsIEZBTFNFKTsKKworICBzcmMtPm1zZyA9IHNvdXBfbWVzc2FnZV9uZXcgKG1ldGhvZCwgc3JjLT5sb2NhdGlvbik7CisgIGlmICghc3JjLT5tc2cpIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgT1BFTl9SRUFELAorICAgICAgICAoIkVycm9yIHBhcnNpbmcgVVJMLiIpLCAoIlVSTDogJXMiLCBzcmMtPmxvY2F0aW9uKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogRHVwbGljYXRpbmcgdGhlIGRlZmF1bHRzIG9mIGxpYnNvdXAgaGVyZS4gV2UgZG9uJ3Qgd2FudCB0byBzZXQgYQorICAgKiBVc2VyLUFnZW50IGluIHRoZSBzZXNzaW9uIGFzIGVhY2ggc291cmNlIG1pZ2h0IGhhdmUgaXRzIG93biBVc2VyLUFnZW50CisgICAqIHNldCAqLworICBpZiAoIXNyYy0+dXNlcl9hZ2VudCB8fCAhKnNyYy0+dXNlcl9hZ2VudCkgeworICAgIGdjaGFyICp1c2VyX2FnZW50ID0KKyAgICAgICAgZ19zdHJkdXBfcHJpbnRmICgibGlic291cC8ldS4ldS4ldSIsIHNvdXBfZ2V0X21ham9yX3ZlcnNpb24gKCksCisgICAgICAgIHNvdXBfZ2V0X21pbm9yX3ZlcnNpb24gKCksIHNvdXBfZ2V0X21pY3JvX3ZlcnNpb24gKCkpOworICAgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2FwcGVuZCAoc3JjLT5tc2ctPnJlcXVlc3RfaGVhZGVycywgIlVzZXItQWdlbnQiLAorICAgICAgICB1c2VyX2FnZW50KTsKKyAgICBnX2ZyZWUgKHVzZXJfYWdlbnQpOworICB9IGVsc2UgaWYgKGdfc3RyX2hhc19zdWZmaXggKHNyYy0+dXNlcl9hZ2VudCwgIiAiKSkgeworICAgIGdjaGFyICp1c2VyX2FnZW50ID0gZ19zdHJkdXBfcHJpbnRmICgiJXNsaWJzb3VwLyV1LiV1LiV1Iiwgc3JjLT51c2VyX2FnZW50LAorICAgICAgICBzb3VwX2dldF9tYWpvcl92ZXJzaW9uICgpLAorICAgICAgICBzb3VwX2dldF9taW5vcl92ZXJzaW9uICgpLCBzb3VwX2dldF9taWNyb192ZXJzaW9uICgpKTsKKyAgICBzb3VwX21lc3NhZ2VfaGVhZGVyc19hcHBlbmQgKHNyYy0+bXNnLT5yZXF1ZXN0X2hlYWRlcnMsICJVc2VyLUFnZW50IiwKKyAgICAgICAgdXNlcl9hZ2VudCk7CisgICAgZ19mcmVlICh1c2VyX2FnZW50KTsKKyAgfSBlbHNlIHsKKyAgICBzb3VwX21lc3NhZ2VfaGVhZGVyc19hcHBlbmQgKHNyYy0+bXNnLT5yZXF1ZXN0X2hlYWRlcnMsICJVc2VyLUFnZW50IiwKKyAgICAgICAgc3JjLT51c2VyX2FnZW50KTsKKyAgfQorCisgIGlmICghc3JjLT5rZWVwX2FsaXZlKSB7CisgICAgc291cF9tZXNzYWdlX2hlYWRlcnNfYXBwZW5kIChzcmMtPm1zZy0+cmVxdWVzdF9oZWFkZXJzLCAiQ29ubmVjdGlvbiIsCisgICAgICAgICJjbG9zZSIpOworICB9CisgIGlmIChzcmMtPmlyYWRpb19tb2RlKSB7CisgICAgc291cF9tZXNzYWdlX2hlYWRlcnNfYXBwZW5kIChzcmMtPm1zZy0+cmVxdWVzdF9oZWFkZXJzLCAiaWN5LW1ldGFkYXRhIiwKKyAgICAgICAgIjEiKTsKKyAgfQorICBpZiAoc3JjLT5jb29raWVzKSB7CisgICAgZ2NoYXIgKipjb29raWU7CisKKyAgICBmb3IgKGNvb2tpZSA9IHNyYy0+Y29va2llczsgKmNvb2tpZSAhPSBOVUxMOyBjb29raWUrKykgeworICAgICAgc291cF9tZXNzYWdlX2hlYWRlcnNfYXBwZW5kIChzcmMtPm1zZy0+cmVxdWVzdF9oZWFkZXJzLCAiQ29va2llIiwKKyAgICAgICAgICAqY29va2llKTsKKyAgICB9CisgIH0KKworICBpZiAoIXNyYy0+Y29tcHJlc3MpCisgICAgc291cF9tZXNzYWdlX2Rpc2FibGVfZmVhdHVyZSAoc3JjLT5tc2csIFNPVVBfVFlQRV9DT05URU5UX0RFQ09ERVIpOworCisgIHNvdXBfbWVzc2FnZV9zZXRfZmxhZ3MgKHNyYy0+bXNnLCBTT1VQX01FU1NBR0VfT1ZFUldSSVRFX0NIVU5LUyB8CisgICAgICAoc3JjLT5hdXRvbWF0aWNfcmVkaXJlY3QgPyAwIDogU09VUF9NRVNTQUdFX05PX1JFRElSRUNUKSk7CisKKyAgaWYgKHNyYy0+YXV0b21hdGljX3JlZGlyZWN0KSB7CisgICAgZ19zaWduYWxfY29ubmVjdCAoc3JjLT5tc2csICJyZXN0YXJ0ZWQiLAorICAgICAgICBHX0NBTExCQUNLIChnc3Rfc291cF9odHRwX3NyY19yZXN0YXJ0ZWRfY2IpLCBzcmMpOworICB9CisKKyAgZ3N0X3NvdXBfaHR0cF9zcmNfYWRkX3JhbmdlX2hlYWRlciAoc3JjLCBzcmMtPnJlcXVlc3RfcG9zaXRpb24sCisgICAgICBzcmMtPnN0b3BfcG9zaXRpb24pOworCisgIGdzdF9zb3VwX2h0dHBfc3JjX2FkZF9leHRyYV9oZWFkZXJzIChzcmMpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NvdXBfaHR0cF9zcmNfc2VuZF9tZXNzYWdlIChHc3RTb3VwSFRUUFNyYyAqIHNyYykKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzcmMtPm1zZyAhPSBOVUxMLCBHU1RfRkxPV19FUlJPUik7CisKKyAgc3JjLT5pbnB1dF9zdHJlYW0gPQorICAgICAgc291cF9zZXNzaW9uX3NlbmQgKHNyYy0+c2Vzc2lvbiwgc3JjLT5tc2csIHNyYy0+Y2FuY2VsbGFibGUsICZlcnJvcik7CisKKyAgaWYgKGdfY2FuY2VsbGFibGVfaXNfY2FuY2VsbGVkIChzcmMtPmNhbmNlbGxhYmxlKSkgeworICAgIHJldCA9IEdTVF9GTE9XX0ZMVVNISU5HOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIHJldCA9IGdzdF9zb3VwX2h0dHBfc3JjX2dvdF9oZWFkZXJzIChzcmMsIHNyYy0+bXNnKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGlmICghc3JjLT5pbnB1dF9zdHJlYW0pIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJEaWRuJ3QgZ2V0IGFuIGlucHV0IHN0cmVhbTogJXMiLCBlcnJvci0+bWVzc2FnZSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBkb25lOworICB9CisKKyAgaWYgKFNPVVBfU1RBVFVTX0lTX1NVQ0NFU1NGVUwgKHNyYy0+bXNnLT5zdGF0dXNfY29kZSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJTdWNjZXNzZnVsbHkgZ290IGEgcmVwbHkiKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBGSVhNRSAtIGJlIG1vcmUgaGVscGZ1bCB0byBwZW9wbGUgZGVidWdnaW5nICovCisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworZG9uZToKKyAgaWYgKGVycm9yKQorICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NvdXBfaHR0cF9zcmNfZG9fcmVxdWVzdCAoR3N0U291cEhUVFBTcmMgKiBzcmMsIGNvbnN0IGdjaGFyICogbWV0aG9kKQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBpZiAoc3JjLT5tYXhfcmV0cmllcyAhPSAtMSAmJiBzcmMtPnJldHJ5X2NvdW50ID4gc3JjLT5tYXhfcmV0cmllcykgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIk1heCByZXRyaWVzIHJlYWNoZWQiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICBzcmMtPnJldHJ5X2NvdW50Kys7CisgIC8qIEVPUyBpbW1lZGlhdGVseSBpZiB3ZSBoYXZlIGFuIGVtcHR5IHNlZ21lbnQgKi8KKyAgaWYgKHNyYy0+cmVxdWVzdF9wb3NpdGlvbiA9PSBzcmMtPnN0b3BfcG9zaXRpb24pCisgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKworICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiUnVubmluZyByZXF1ZXN0IGZvciBtZXRob2Q6ICVzIiwgbWV0aG9kKTsKKworICAvKiBVcGRhdGUgdGhlIHBvc2l0aW9uIGlmIHdlIGFyZSByZXRyeWluZyAqLworICBpZiAoc3JjLT5tc2cgJiYgc3JjLT5yZXF1ZXN0X3Bvc2l0aW9uID4gMCkgeworICAgIGdzdF9zb3VwX2h0dHBfc3JjX2FkZF9yYW5nZV9oZWFkZXIgKHNyYywgc3JjLT5yZXF1ZXN0X3Bvc2l0aW9uLAorICAgICAgICBzcmMtPnN0b3BfcG9zaXRpb24pOworICB9IGVsc2UgaWYgKHNyYy0+bXNnICYmIHNyYy0+cmVxdWVzdF9wb3NpdGlvbiA9PSAwKQorICAgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX3JlbW92ZSAoc3JjLT5tc2ctPnJlcXVlc3RfaGVhZGVycywgIlJhbmdlIik7CisKKyAgLyogYWRkX3JhbmdlX2hlYWRlcigpIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2Ygc2V0dGluZyByZWFkX3Bvc2l0aW9uIHRvCisgICAqIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24uIFRoaXMgKm5lZWRzKiB0byBiZSBzZXQgcmVnYXJkbGVzcyBvZiBoYXZpbmcKKyAgICogYSBtZXNzYWdlIG9yIG5vdC4gRmFpbHVyZSB0byBkbyBzbyB3b3VsZCByZXN1bHQgaW4gY2FsY3VsYXRpb24gYmVpbmcKKyAgICogZG9uZSB3aXRoIHN0YWxlL3dyb25nIHJlYWQgcG9zaXRpb24gKi8KKyAgc3JjLT5yZWFkX3Bvc2l0aW9uID0gc3JjLT5yZXF1ZXN0X3Bvc2l0aW9uOworCisgIGlmICghc3JjLT5tc2cpIHsKKyAgICBpZiAoIWdzdF9zb3VwX2h0dHBfc3JjX2J1aWxkX21lc3NhZ2UgKHNyYywgbWV0aG9kKSkgeworICAgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICAgIH0KKyAgfQorCisgIGlmIChnX2NhbmNlbGxhYmxlX2lzX2NhbmNlbGxlZCAoc3JjLT5jYW5jZWxsYWJsZSkpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHNyYywgImludGVycnVwdGVkIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICB9CisKKyAgcmV0ID0gZ3N0X3NvdXBfaHR0cF9zcmNfc2VuZF9tZXNzYWdlIChzcmMpOworCisgIC8qIENoZWNrIGlmIFJhbmdlIGhlYWRlciB3YXMgcmVzcGVjdGVkLiAqLworICBpZiAocmV0ID09IEdTVF9GTE9XX09LICYmIHNyYy0+cmVxdWVzdF9wb3NpdGlvbiA+IDAgJiYKKyAgICAgIHNyYy0+bXNnLT5zdGF0dXNfY29kZSAhPSBTT1VQX1NUQVRVU19QQVJUSUFMX0NPTlRFTlQpIHsKKyAgICBzcmMtPnNlZWthYmxlID0gRkFMU0U7CisgICAgR1NUX0VMRU1FTlRfRVJST1JfV0lUSF9ERVRBSUxTIChzcmMsIFJFU09VUkNFLCBTRUVLLAorICAgICAgICAoXygiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iKSksCisgICAgICAgICgiU2VydmVyIGRvZXMgbm90IGFjY2VwdCBSYW5nZSBIVFRQIGhlYWRlciwgVVJMOiAlcywgUmVkaXJlY3QgdG86ICVzIiwKKyAgICAgICAgICAgIHNyYy0+bG9jYXRpb24sIEdTVF9TVFJfTlVMTCAoc3JjLT5yZWRpcmVjdGlvbl91cmkpKSwKKyAgICAgICAgKCJodHRwLXN0YXR1cy1jb2RlIiwgR19UWVBFX1VJTlQsIHNyYy0+bXNnLT5zdGF0dXNfY29kZSwKKyAgICAgICAgICAgICJodHRwLXJlZGlyZWN0aW9uLXVyaSIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICBHU1RfU1RSX05VTEwgKHNyYy0+cmVkaXJlY3Rpb25fdXJpKSwgTlVMTCkpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZSBieXRlc19yZWFkIGlzIGFib3ZlIGEgY2VydGFpbiB0aHJlc2hvbGQgb2YgdGhlIGJsb2Nrc2l6ZSwgaWYKKyAqIHRoYXQgaGFwcGVucyBhIGZldyB0aW1lcyBpbiBhIHJvdywgaW5jcmVhc2UgdGhlIGJsb2Nrc2l6ZTsgRG8gdGhlIHNhbWUgaW4KKyAqIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24gdG8gcmVkdWNlIHRoZSBibG9ja3NpemUuCisgKi8KK3N0YXRpYyB2b2lkCitnc3Rfc291cF9odHRwX3NyY19jaGVja191cGRhdGVfYmxvY2tzaXplIChHc3RTb3VwSFRUUFNyYyAqIHNyYywKKyAgICBnaW50NjQgYnl0ZXNfcmVhZCkKK3sKKyAgZ3VpbnQgYmxvY2tzaXplID0gZ3N0X2Jhc2Vfc3JjX2dldF9ibG9ja3NpemUgKEdTVF9CQVNFX1NSQ19DQVNUIChzcmMpKTsKKworICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiQ2hlY2tpbmcgdG8gdXBkYXRlIGJsb2Nrc2l6ZS4gUmVhZDolIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICIgYmxvY2tzaXplOiV1IiwgYnl0ZXNfcmVhZCwgYmxvY2tzaXplKTsKKworICBpZiAoYnl0ZXNfcmVhZCA+PSBibG9ja3NpemUgKiBHUk9XX0JMT0NLU0laRV9MSU1JVCkgeworICAgIHNyYy0+cmVkdWNlX2Jsb2Nrc2l6ZV9jb3VudCA9IDA7CisgICAgc3JjLT5pbmNyZWFzZV9ibG9ja3NpemVfY291bnQrKzsKKworICAgIGlmIChzcmMtPmluY3JlYXNlX2Jsb2Nrc2l6ZV9jb3VudCA+PSBHUk9XX0JMT0NLU0laRV9DT1VOVCkgeworICAgICAgYmxvY2tzaXplICo9IEdST1dfQkxPQ0tTSVpFX0ZBQ1RPUjsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIkluY3JlYXNlZCBibG9ja3NpemUgdG8gJXUiLCBibG9ja3NpemUpOworICAgICAgZ3N0X2Jhc2Vfc3JjX3NldF9ibG9ja3NpemUgKEdTVF9CQVNFX1NSQ19DQVNUIChzcmMpLCBibG9ja3NpemUpOworICAgICAgc3JjLT5pbmNyZWFzZV9ibG9ja3NpemVfY291bnQgPSAwOworICAgIH0KKyAgfSBlbHNlIGlmIChieXRlc19yZWFkIDwgYmxvY2tzaXplICogUkVEVUNFX0JMT0NLU0laRV9MSU1JVCkgeworICAgIHNyYy0+cmVkdWNlX2Jsb2Nrc2l6ZV9jb3VudCsrOworICAgIHNyYy0+aW5jcmVhc2VfYmxvY2tzaXplX2NvdW50ID0gMDsKKworICAgIGlmIChzcmMtPnJlZHVjZV9ibG9ja3NpemVfY291bnQgPj0gUkVEVUNFX0JMT0NLU0laRV9DT1VOVCkgeworICAgICAgYmxvY2tzaXplICo9IFJFRFVDRV9CTE9DS1NJWkVfRkFDVE9SOworICAgICAgYmxvY2tzaXplID0gTUFYIChibG9ja3NpemUsIHNyYy0+bWluaW11bV9ibG9ja3NpemUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiRGVjcmVhc2VkIGJsb2Nrc2l6ZSB0byAldSIsIGJsb2Nrc2l6ZSk7CisgICAgICBnc3RfYmFzZV9zcmNfc2V0X2Jsb2Nrc2l6ZSAoR1NUX0JBU0VfU1JDX0NBU1QgKHNyYyksIGJsb2Nrc2l6ZSk7CisgICAgICBzcmMtPnJlZHVjZV9ibG9ja3NpemVfY291bnQgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzcmMtPnJlZHVjZV9ibG9ja3NpemVfY291bnQgPSBzcmMtPmluY3JlYXNlX2Jsb2Nrc2l6ZV9jb3VudCA9IDA7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9zb3VwX2h0dHBfc3JjX3VwZGF0ZV9wb3NpdGlvbiAoR3N0U291cEhUVFBTcmMgKiBzcmMsIGdpbnQ2NCBieXRlc19yZWFkKQoreworICBHc3RCYXNlU3JjICpiYXNlc3JjID0gR1NUX0JBU0VfU1JDX0NBU1QgKHNyYyk7CisgIGd1aW50NjQgbmV3X3Bvc2l0aW9uOworCisgIG5ld19wb3NpdGlvbiA9IHNyYy0+cmVhZF9wb3NpdGlvbiArIGJ5dGVzX3JlYWQ7CisgIGlmIChHX0xJS0VMWSAoc3JjLT5yZXF1ZXN0X3Bvc2l0aW9uID09IHNyYy0+cmVhZF9wb3NpdGlvbikpCisgICAgc3JjLT5yZXF1ZXN0X3Bvc2l0aW9uID0gbmV3X3Bvc2l0aW9uOworICBzcmMtPnJlYWRfcG9zaXRpb24gPSBuZXdfcG9zaXRpb247CisKKyAgaWYgKHNyYy0+aGF2ZV9zaXplKSB7CisgICAgaWYgKG5ld19wb3NpdGlvbiA+IHNyYy0+Y29udGVudF9zaXplKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJHb3QgcG9zaXRpb24gcHJldmlvdXMgZXN0aW1hdGVkIGNvbnRlbnQgc2l6ZSAiCisgICAgICAgICAgIiglIiBHX0dJTlQ2NF9GT1JNQVQgIiA+ICUiIEdfR0lOVDY0X0ZPUk1BVCAiKSIsIG5ld19wb3NpdGlvbiwKKyAgICAgICAgICBzcmMtPmNvbnRlbnRfc2l6ZSk7CisgICAgICBzcmMtPmNvbnRlbnRfc2l6ZSA9IG5ld19wb3NpdGlvbjsKKyAgICAgIGJhc2VzcmMtPnNlZ21lbnQuZHVyYXRpb24gPSBzcmMtPmNvbnRlbnRfc2l6ZTsKKyAgICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKHNyYyksCisgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2R1cmF0aW9uX2NoYW5nZWQgKEdTVF9PQkpFQ1QgKHNyYykpKTsKKyAgICB9IGVsc2UgaWYgKG5ld19wb3NpdGlvbiA9PSBzcmMtPmNvbnRlbnRfc2l6ZSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiV2UncmUgRU9TIG5vdyIpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NvdXBfaHR0cF9zcmNfcmVhZF9idWZmZXIgKEdzdFNvdXBIVFRQU3JjICogc3JjLCBHc3RCdWZmZXIgKiogb3V0YnVmKQoreworICBnc3NpemUgcmVhZF9ieXRlczsKKyAgR3N0TWFwSW5mbyBtYXBpbmZvOworICBHc3RCYXNlU3JjICpic3JjOworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBic3JjID0gR1NUX0JBU0VfU1JDX0NBU1QgKHNyYyk7CisKKyAgKm91dGJ1ZiA9IGdzdF9zb3VwX2h0dHBfc3JjX2FsbG9jX2J1ZmZlciAoc3JjKTsKKyAgaWYgKCEqb3V0YnVmKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAoKm91dGJ1ZiwgJm1hcGluZm8sIEdTVF9NQVBfV1JJVEUpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJGYWlsZWQgdG8gbWFwIGJ1ZmZlciIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIHJlYWRfYnl0ZXMgPQorICAgICAgZ19pbnB1dF9zdHJlYW1fcmVhZCAoc3JjLT5pbnB1dF9zdHJlYW0sIG1hcGluZm8uZGF0YSwgbWFwaW5mby5zaXplLAorICAgICAgc3JjLT5jYW5jZWxsYWJsZSwgTlVMTCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIlJlYWQgJSIgR19HU1NJWkVfRk9STUFUICIgYnl0ZXMgZnJvbSBodHRwIGlucHV0IiwKKyAgICAgIHJlYWRfYnl0ZXMpOworCisgIGdfbXV0ZXhfbG9jayAoJnNyYy0+bXV0ZXgpOworICBpZiAoZ19jYW5jZWxsYWJsZV9pc19jYW5jZWxsZWQgKHNyYy0+Y2FuY2VsbGFibGUpKSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoKm91dGJ1ZiwgJm1hcGluZm8pOworICAgIGdzdF9idWZmZXJfdW5yZWYgKCpvdXRidWYpOworICAgIGdfbXV0ZXhfdW5sb2NrICgmc3JjLT5tdXRleCk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICB9CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoKm91dGJ1ZiwgJm1hcGluZm8pOworICBpZiAocmVhZF9ieXRlcyA+IDApIHsKKyAgICBnc3RfYnVmZmVyX3NldF9zaXplICgqb3V0YnVmLCByZWFkX2J5dGVzKTsKKyAgICBHU1RfQlVGRkVSX09GRlNFVCAoKm91dGJ1ZikgPSBic3JjLT5zZWdtZW50LnBvc2l0aW9uOworICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIGdzdF9zb3VwX2h0dHBfc3JjX3VwZGF0ZV9wb3NpdGlvbiAoc3JjLCByZWFkX2J5dGVzKTsKKworICAgIC8qIEdvdCBzb21lIGRhdGEsIHJlc2V0IHJldHJ5IGNvdW50ZXIgKi8KKyAgICBzcmMtPnJldHJ5X2NvdW50ID0gMDsKKworICAgIGdzdF9zb3VwX2h0dHBfc3JjX2NoZWNrX3VwZGF0ZV9ibG9ja3NpemUgKHNyYywgcmVhZF9ieXRlcyk7CisKKyAgICAvKiBJZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIGEgcmFuZ2UgcmVxdWVzdCwgcmVhZCBhZ2FpbiB0byBsZXQgbGlic291cAorICAgICAqIGZpbmFsaXplIHRoZSByZXF1ZXN0LiBUaGlzIGFsbG93cyB0byByZXVzZSB0aGUgY29ubmVjdGlvbiBhZ2FpbiBsYXRlciwKKyAgICAgKiBvdGhlcndpc2Ugd2Ugd291bGQgaGF2ZSB0byBjYW5jZWwgdGhlIG1lc3NhZ2UgYW5kIGNsb3NlIHRoZSBjb25uZWN0aW9uCisgICAgICovCisgICAgaWYgKGJzcmMtPnNlZ21lbnQuc3RvcCAhPSAtMQorICAgICAgICAmJiBic3JjLT5zZWdtZW50LnBvc2l0aW9uICsgcmVhZF9ieXRlcyA+PSBic3JjLT5zZWdtZW50LnN0b3ApIHsKKyAgICAgIGd1aW50OCB0bXBbMTI4XTsKKworICAgICAgZ19vYmplY3RfdW5yZWYgKHNyYy0+bXNnKTsKKyAgICAgIHNyYy0+bXNnID0gTlVMTDsKKyAgICAgIHNyYy0+aGF2ZV9ib2R5ID0gVFJVRTsKKworICAgICAgLyogVGhpcyBzaG91bGQgcmV0dXJuIGltbWVkaWF0ZWx5IGFzIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIHJhbmdlICovCisgICAgICByZWFkX2J5dGVzID0KKyAgICAgICAgICBnX2lucHV0X3N0cmVhbV9yZWFkIChzcmMtPmlucHV0X3N0cmVhbSwgdG1wLCBzaXplb2YgKHRtcCksCisgICAgICAgICAgc3JjLT5jYW5jZWxsYWJsZSwgTlVMTCk7CisgICAgICBpZiAocmVhZF9ieXRlcyA+IDApCisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNyYywKKyAgICAgICAgICAgICJSZWFkICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgYWZ0ZXIgZW5kIG9mIHJhbmdlIiwgcmVhZF9ieXRlcyk7CisgICAgfQorICB9IGVsc2UgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKCpvdXRidWYpOworICAgIGlmIChyZWFkX2J5dGVzIDwgMCB8fAorICAgICAgICAoc3JjLT5oYXZlX3NpemUgJiYgc3JjLT5yZWFkX3Bvc2l0aW9uIDwgc3JjLT5jb250ZW50X3NpemUpKSB7CisgICAgICAvKiBNYXliZSB0aGUgc2VydmVyIGRpc2Nvbm5lY3RlZCwgcmV0cnkgKi8KKyAgICAgIHJldCA9IEdTVF9GTE9XX0NVU1RPTV9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgZ19vYmplY3RfdW5yZWYgKHNyYy0+bXNnKTsKKyAgICAgIHNyYy0+bXNnID0gTlVMTDsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgICAgIHNyYy0+aGF2ZV9ib2R5ID0gVFJVRTsKKyAgICB9CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZzcmMtPm11dGV4KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NvdXBfaHR0cF9zcmNfY3JlYXRlIChHc3RQdXNoU3JjICogcHNyYywgR3N0QnVmZmVyICoqIG91dGJ1ZikKK3sKKyAgR3N0U291cEhUVFBTcmMgKnNyYzsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0RXZlbnQgKmh0dHBfaGVhZGVyc19ldmVudCA9IE5VTEw7CisKKyAgc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKHBzcmMpOworCityZXRyeToKKyAgZ19tdXRleF9sb2NrICgmc3JjLT5tdXRleCk7CisKKyAgLyogQ2hlY2sgZm9yIHBlbmRpbmcgcG9zaXRpb24gY2hhbmdlICovCisgIGlmIChzcmMtPnJlcXVlc3RfcG9zaXRpb24gIT0gc3JjLT5yZWFkX3Bvc2l0aW9uKSB7CisgICAgaWYgKHNyYy0+aW5wdXRfc3RyZWFtKSB7CisgICAgICBnX2lucHV0X3N0cmVhbV9jbG9zZSAoc3JjLT5pbnB1dF9zdHJlYW0sIHNyYy0+Y2FuY2VsbGFibGUsIE5VTEwpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHNyYy0+aW5wdXRfc3RyZWFtKTsKKyAgICAgIHNyYy0+aW5wdXRfc3RyZWFtID0gTlVMTDsKKyAgICB9CisgIH0KKworICBpZiAoZ19jYW5jZWxsYWJsZV9pc19jYW5jZWxsZWQgKHNyYy0+Y2FuY2VsbGFibGUpKSB7CisgICAgcmV0ID0gR1NUX0ZMT1dfRkxVU0hJTkc7CisgICAgZ19tdXRleF91bmxvY2sgKCZzcmMtPm11dGV4KTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiBJZiB3ZSBoYXZlIG5vIG9wZW4gY29ubmVjdGlvbiB0byB0aGUgc2VydmVyLCBzdGFydCBvbmUgKi8KKyAgaWYgKCFzcmMtPmlucHV0X3N0cmVhbSkgeworICAgICpvdXRidWYgPSBOVUxMOworICAgIHJldCA9CisgICAgICAgIGdzdF9zb3VwX2h0dHBfc3JjX2RvX3JlcXVlc3QgKHNyYywKKyAgICAgICAgc3JjLT5tZXRob2QgPyBzcmMtPm1ldGhvZCA6IFNPVVBfTUVUSE9EX0dFVCk7CisgICAgaHR0cF9oZWFkZXJzX2V2ZW50ID0gc3JjLT5odHRwX2hlYWRlcnNfZXZlbnQ7CisgICAgc3JjLT5odHRwX2hlYWRlcnNfZXZlbnQgPSBOVUxMOworICB9CisgIGdfbXV0ZXhfdW5sb2NrICgmc3JjLT5tdXRleCk7CisKKyAgaWYgKHJldCA9PSBHU1RfRkxPV19PSyB8fCByZXQgPT0gR1NUX0ZMT1dfQ1VTVE9NX0VSUk9SKSB7CisgICAgaWYgKGh0dHBfaGVhZGVyc19ldmVudCkgeworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChHU1RfQkFTRV9TUkNfUEFEIChzcmMpLCBodHRwX2hlYWRlcnNfZXZlbnQpOworICAgICAgaHR0cF9oZWFkZXJzX2V2ZW50ID0gTlVMTDsKKyAgICB9CisgIH0KKworICBpZiAocmV0ID09IEdTVF9GTE9XX09LKQorICAgIHJldCA9IGdzdF9zb3VwX2h0dHBfc3JjX3JlYWRfYnVmZmVyIChzcmMsIG91dGJ1Zik7CisKK2RvbmU6CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIlJldHVybmluZyAlZCAlcyIsIHJldCwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgaWYgKGh0dHBfaGVhZGVyc19ldmVudCkKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoaHR0cF9oZWFkZXJzX2V2ZW50KTsKKworICAgIGdfbXV0ZXhfbG9jayAoJnNyYy0+bXV0ZXgpOworICAgIGlmIChzcmMtPmlucHV0X3N0cmVhbSkgeworICAgICAgZ19vYmplY3RfdW5yZWYgKHNyYy0+aW5wdXRfc3RyZWFtKTsKKyAgICAgIHNyYy0+aW5wdXRfc3RyZWFtID0gTlVMTDsKKyAgICB9CisgICAgZ19tdXRleF91bmxvY2sgKCZzcmMtPm11dGV4KTsKKyAgICBpZiAocmV0ID09IEdTVF9GTE9XX0NVU1RPTV9FUlJPUikgeworICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICBnb3RvIHJldHJ5OworICAgIH0KKyAgfQorCisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRkxVU0hJTkcpIHsKKyAgICBnX211dGV4X2xvY2sgKCZzcmMtPm11dGV4KTsKKyAgICBzcmMtPnJldHJ5X2NvdW50ID0gMDsKKyAgICBnX211dGV4X3VubG9jayAoJnNyYy0+bXV0ZXgpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc291cF9odHRwX3NyY19zdGFydCAoR3N0QmFzZVNyYyAqIGJzcmMpCit7CisgIEdzdFNvdXBIVFRQU3JjICpzcmMgPSBHU1RfU09VUF9IVFRQX1NSQyAoYnNyYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic3RhcnQoXCIlc1wiKSIsIHNyYy0+bG9jYXRpb24pOworCisgIHJldHVybiBnc3Rfc291cF9odHRwX3NyY19zZXNzaW9uX29wZW4gKHNyYyk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NvdXBfaHR0cF9zcmNfc3RvcCAoR3N0QmFzZVNyYyAqIGJzcmMpCit7CisgIEdzdFNvdXBIVFRQU3JjICpzcmM7CisKKyAgc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKGJzcmMpOworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdG9wKCkiKTsKKyAgaWYgKHNyYy0+a2VlcF9hbGl2ZSAmJiAhc3JjLT5tc2cgJiYgIXNyYy0+c2Vzc2lvbl9pc19zaGFyZWQpCisgICAgZ3N0X3NvdXBfaHR0cF9zcmNfY2FuY2VsX21lc3NhZ2UgKHNyYyk7CisgIGVsc2UKKyAgICBnc3Rfc291cF9odHRwX3NyY19zZXNzaW9uX2Nsb3NlIChzcmMpOworCisgIGdzdF9zb3VwX2h0dHBfc3JjX3Jlc2V0IChzcmMpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3Rfc291cF9odHRwX3NyY19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdFNvdXBIVFRQU3JjICpzcmM7CisKKyAgc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgZ3N0X3NvdXBfaHR0cF9zcmNfc2Vzc2lvbl9jbG9zZSAoc3JjKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc291cF9odHRwX3NyY19zZXRfY29udGV4dCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdENvbnRleHQgKiBjb250ZXh0KQoreworICBHc3RTb3VwSFRUUFNyYyAqc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKGVsZW1lbnQpOworCisgIGlmIChnX3N0cmNtcDAgKGdzdF9jb250ZXh0X2dldF9jb250ZXh0X3R5cGUgKGNvbnRleHQpLAorICAgICAgICAgIEdTVF9TT1VQX1NFU1NJT05fQ09OVEVYVCkgPT0gMCkgeworICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jb250ZXh0X2dldF9zdHJ1Y3R1cmUgKGNvbnRleHQpOworCisgICAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworICAgIGlmIChzcmMtPmV4dGVybmFsX3Nlc3Npb24pCisgICAgICBnX29iamVjdF91bnJlZiAoc3JjLT5leHRlcm5hbF9zZXNzaW9uKTsKKyAgICBzcmMtPmV4dGVybmFsX3Nlc3Npb24gPSBOVUxMOworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0IChzLCAic2Vzc2lvbiIsIFNPVVBfVFlQRV9TRVNTSU9OLCAmc3JjLT5leHRlcm5hbF9zZXNzaW9uLAorICAgICAgICBOVUxMKTsKKyAgICBzcmMtPmZvcmNlZF9leHRlcm5hbF9zZXNzaW9uID0gRkFMU0U7CisgICAgZ3N0X3N0cnVjdHVyZV9nZXQgKHMsICJmb3JjZSIsIEdfVFlQRV9CT09MRUFOLAorICAgICAgICAmc3JjLT5mb3JjZWRfZXh0ZXJuYWxfc2Vzc2lvbiwgTlVMTCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJTZXR0aW5nIGV4dGVybmFsIHNlc3Npb24gJXAgKGZvcmNlOiAlZCkiLAorICAgICAgICBzcmMtPmV4dGVybmFsX3Nlc3Npb24sIHNyYy0+Zm9yY2VkX2V4dGVybmFsX3Nlc3Npb24pOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcmMpOworICB9CisKKyAgR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNldF9jb250ZXh0IChlbGVtZW50LCBjb250ZXh0KTsKK30KKworLyogSW50ZXJydXB0IGEgYmxvY2tpbmcgcmVxdWVzdC4gKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NvdXBfaHR0cF9zcmNfdW5sb2NrIChHc3RCYXNlU3JjICogYnNyYykKK3sKKyAgR3N0U291cEhUVFBTcmMgKnNyYzsKKworICBzcmMgPSBHU1RfU09VUF9IVFRQX1NSQyAoYnNyYyk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInVubG9jaygpIik7CisKKyAgZ3N0X3NvdXBfaHR0cF9zcmNfY2FuY2VsX21lc3NhZ2UgKHNyYyk7CisgIHJldHVybiBUUlVFOworfQorCisvKiBJbnRlcnJ1cHQgaW50ZXJydXB0LiAqLworc3RhdGljIGdib29sZWFuCitnc3Rfc291cF9odHRwX3NyY191bmxvY2tfc3RvcCAoR3N0QmFzZVNyYyAqIGJzcmMpCit7CisgIEdzdFNvdXBIVFRQU3JjICpzcmM7CisKKyAgc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKGJzcmMpOworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJ1bmxvY2tfc3RvcCgpIik7CisKKyAgZ19jYW5jZWxsYWJsZV9yZXNldCAoc3JjLT5jYW5jZWxsYWJsZSk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zb3VwX2h0dHBfc3JjX2dldF9zaXplIChHc3RCYXNlU3JjICogYnNyYywgZ3VpbnQ2NCAqIHNpemUpCit7CisgIEdzdFNvdXBIVFRQU3JjICpzcmM7CisKKyAgc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKGJzcmMpOworCisgIGlmIChzcmMtPmhhdmVfc2l6ZSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImdldF9zaXplKCkgPSAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICBzcmMtPmNvbnRlbnRfc2l6ZSk7CisgICAgKnNpemUgPSBzcmMtPmNvbnRlbnRfc2l6ZTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJnZXRfc2l6ZSgpID0gRkFMU0UiKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NvdXBfaHR0cF9zcmNfY2hlY2tfc2Vla2FibGUgKEdzdFNvdXBIVFRQU3JjICogc3JjKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIC8qIFNwZWNpYWwgY2FzZSB0byBjaGVjayBpZiB0aGUgc2VydmVyIGFsbG93cyByYW5nZSByZXF1ZXN0cworICAgKiBiZWZvcmUgcmVhbGx5IHN0YXJ0aW5nIHRvIGdldCBkYXRhIGluIHRoZSBidWZmZXIgY3JlYXRpb24KKyAgICogbG9vcHMuCisgICAqLworICBpZiAoIXNyYy0+Z290X2hlYWRlcnMgJiYgR1NUX1NUQVRFIChzcmMpID49IEdTVF9TVEFURV9QQVVTRUQpIHsKKyAgICBnX211dGV4X2xvY2sgKCZzcmMtPm11dGV4KTsKKyAgICB3aGlsZSAoIXNyYy0+Z290X2hlYWRlcnMgJiYgIWdfY2FuY2VsbGFibGVfaXNfY2FuY2VsbGVkIChzcmMtPmNhbmNlbGxhYmxlKQorICAgICAgICAmJiByZXQgPT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgIGlmICgoc3JjLT5tc2cgJiYgc3JjLT5tc2ctPm1ldGhvZCAhPSBTT1VQX01FVEhPRF9IRUFEKSkgeworICAgICAgICAvKiB3YWl0IGZvciB0aGUgY3VycmVudCByZXF1ZXN0IHRvIGZpbmlzaCAqLworICAgICAgICBnX2NvbmRfd2FpdCAoJnNyYy0+aGF2ZV9oZWFkZXJzX2NvbmQsICZzcmMtPm11dGV4KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChnc3Rfc291cF9odHRwX3NyY19zZXNzaW9uX29wZW4gKHNyYykpIHsKKyAgICAgICAgICByZXQgPSBnc3Rfc291cF9odHRwX3NyY19kb19yZXF1ZXN0IChzcmMsIFNPVVBfTUVUSE9EX0hFQUQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGdfbXV0ZXhfdW5sb2NrICgmc3JjLT5tdXRleCk7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc291cF9odHRwX3NyY19pc19zZWVrYWJsZSAoR3N0QmFzZVNyYyAqIGJzcmMpCit7CisgIEdzdFNvdXBIVFRQU3JjICpzcmMgPSBHU1RfU09VUF9IVFRQX1NSQyAoYnNyYyk7CisKKyAgZ3N0X3NvdXBfaHR0cF9zcmNfY2hlY2tfc2Vla2FibGUgKHNyYyk7CisKKyAgcmV0dXJuIHNyYy0+c2Vla2FibGU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NvdXBfaHR0cF9zcmNfZG9fc2VlayAoR3N0QmFzZVNyYyAqIGJzcmMsIEdzdFNlZ21lbnQgKiBzZWdtZW50KQoreworICBHc3RTb3VwSFRUUFNyYyAqc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKGJzcmMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImRvX3NlZWsoJSIgR19HVUlOVDY0X0ZPUk1BVCAiLSUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICIpIiwgc2VnbWVudC0+c3RhcnQsIHNlZ21lbnQtPnN0b3ApOworICBpZiAoc3JjLT5yZWFkX3Bvc2l0aW9uID09IHNlZ21lbnQtPnN0YXJ0ICYmCisgICAgICBzcmMtPnJlcXVlc3RfcG9zaXRpb24gPT0gc3JjLT5yZWFkX3Bvc2l0aW9uICYmCisgICAgICBzcmMtPnN0b3BfcG9zaXRpb24gPT0gc2VnbWVudC0+c3RvcCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywKKyAgICAgICAgIlNlZWsgdG8gY3VycmVudCByZWFkL2VuZCBwb3NpdGlvbiBhbmQgbm8gc2VlayBwZW5kaW5nIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBnc3Rfc291cF9odHRwX3NyY19jaGVja19zZWVrYWJsZSAoc3JjKTsKKworICAvKiBJZiB3ZSBoYXZlIG5vIGhlYWRlcnMgd2UgZG9uJ3Qga25vdyB5ZXQgaWYgaXQgaXMgc2Vla2FibGUgb3Igbm90LgorICAgKiBTdG9yZSB0aGUgc3RhcnQgcG9zaXRpb24gYW5kIGVycm9yIG91dCBsYXRlciBpZiBpdCBpc24ndCAqLworICBpZiAoc3JjLT5nb3RfaGVhZGVycyAmJiAhc3JjLT5zZWVrYWJsZSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiTm90IHNlZWthYmxlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKHNlZ21lbnQtPnJhdGUgPCAwLjAgfHwgc2VnbWVudC0+Zm9ybWF0ICE9IEdTVF9GT1JNQVRfQllURVMpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgIkludmFsaWQgc2VlayBzZWdtZW50Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKHNyYy0+aGF2ZV9zaXplICYmIHNlZ21lbnQtPnN0YXJ0ID49IHNyYy0+Y29udGVudF9zaXplKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsCisgICAgICAgICJQb3RlbnRpYWxseSBzZWVraW5nIGJlaGluZCBlbmQgb2YgZmlsZSwgbWlnaHQgRU9TIGltbWVkaWF0ZWx5Iik7CisgIH0KKworICAvKiBXYWl0IGZvciBjcmVhdGUoKSB0byBoYW5kbGUgdGhlIGp1bXAgaW4gb2Zmc2V0LiAqLworICBzcmMtPnJlcXVlc3RfcG9zaXRpb24gPSBzZWdtZW50LT5zdGFydDsKKyAgc3JjLT5zdG9wX3Bvc2l0aW9uID0gc2VnbWVudC0+c3RvcDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc291cF9odHRwX3NyY19xdWVyeSAoR3N0QmFzZVNyYyAqIGJzcmMsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFNvdXBIVFRQU3JjICpzcmMgPSBHU1RfU09VUF9IVFRQX1NSQyAoYnNyYyk7CisgIGdib29sZWFuIHJldDsKKyAgR3N0U2NoZWR1bGluZ0ZsYWdzIGZsYWdzOworICBnaW50IG1pbnNpemUsIG1heHNpemUsIGFsaWduOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX1VSSToKKyAgICAgIGdzdF9xdWVyeV9zZXRfdXJpIChxdWVyeSwgc3JjLT5sb2NhdGlvbik7CisgICAgICBpZiAoc3JjLT5yZWRpcmVjdGlvbl91cmkgIT0gTlVMTCkgeworICAgICAgICBnc3RfcXVlcnlfc2V0X3VyaV9yZWRpcmVjdGlvbiAocXVlcnksIHNyYy0+cmVkaXJlY3Rpb25fdXJpKTsKKyAgICAgICAgZ3N0X3F1ZXJ5X3NldF91cmlfcmVkaXJlY3Rpb25fcGVybWFuZW50IChxdWVyeSwKKyAgICAgICAgICAgIHNyYy0+cmVkaXJlY3Rpb25fcGVybWFuZW50KTsKKyAgICAgIH0KKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmICghcmV0KQorICAgIHJldCA9IEdTVF9CQVNFX1NSQ19DTEFTUyAocGFyZW50X2NsYXNzKS0+cXVlcnkgKGJzcmMsIHF1ZXJ5KTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9TQ0hFRFVMSU5HOgorICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3NjaGVkdWxpbmcgKHF1ZXJ5LCAmZmxhZ3MsICZtaW5zaXplLCAmbWF4c2l6ZSwgJmFsaWduKTsKKyAgICAgIGZsYWdzIHw9IEdTVF9TQ0hFRFVMSU5HX0ZMQUdfQkFORFdJRFRIX0xJTUlURUQ7CisgICAgICBnc3RfcXVlcnlfc2V0X3NjaGVkdWxpbmcgKHF1ZXJ5LCBmbGFncywgbWluc2l6ZSwgbWF4c2l6ZSwgYWxpZ24pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc291cF9odHRwX3NyY19zZXRfbG9jYXRpb24gKEdzdFNvdXBIVFRQU3JjICogc3JjLCBjb25zdCBnY2hhciAqIHVyaSwKKyAgICBHRXJyb3IgKiogZXJyb3IpCit7CisgIGNvbnN0IGNoYXIgKmFsdF9zY2hlbWVzW10gPSB7ICJpY3k6Ly8iLCAiaWN5eDovLyIgfTsKKyAgZ3VpbnQgaTsKKworICBpZiAoc3JjLT5sb2NhdGlvbikgeworICAgIGdfZnJlZSAoc3JjLT5sb2NhdGlvbik7CisgICAgc3JjLT5sb2NhdGlvbiA9IE5VTEw7CisgIH0KKworICBpZiAodXJpID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGZvciAoaSA9IDA7IGkgPCBHX05fRUxFTUVOVFMgKGFsdF9zY2hlbWVzKTsgaSsrKSB7CisgICAgaWYgKGdfc3RyX2hhc19wcmVmaXggKHVyaSwgYWx0X3NjaGVtZXNbaV0pKSB7CisgICAgICBzcmMtPmxvY2F0aW9uID0KKyAgICAgICAgICBnX3N0cmR1cF9wcmludGYgKCJodHRwOi8vJXMiLCB1cmkgKyBzdHJsZW4gKGFsdF9zY2hlbWVzW2ldKSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKworICBpZiAoc3JjLT5yZWRpcmVjdGlvbl91cmkpIHsKKyAgICBnX2ZyZWUgKHNyYy0+cmVkaXJlY3Rpb25fdXJpKTsKKyAgICBzcmMtPnJlZGlyZWN0aW9uX3VyaSA9IE5VTEw7CisgIH0KKworICBzcmMtPmxvY2F0aW9uID0gZ19zdHJkdXAgKHVyaSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NvdXBfaHR0cF9zcmNfc2V0X3Byb3h5IChHc3RTb3VwSFRUUFNyYyAqIHNyYywgY29uc3QgZ2NoYXIgKiB1cmkpCit7CisgIGlmIChzcmMtPnByb3h5KSB7CisgICAgc291cF91cmlfZnJlZSAoc3JjLT5wcm94eSk7CisgICAgc3JjLT5wcm94eSA9IE5VTEw7CisgIH0KKworICBpZiAodXJpID09IE5VTEwgfHwgKnVyaSA9PSAnXDAnKQorICAgIHJldHVybiBUUlVFOworCisgIGlmIChnX3N0cnN0cl9sZW4gKHVyaSwgLTEsICI6Ly8iKSkgeworICAgIHNyYy0+cHJveHkgPSBzb3VwX3VyaV9uZXcgKHVyaSk7CisgIH0gZWxzZSB7CisgICAgZ2NoYXIgKm5ld191cmkgPSBnX3N0cmNvbmNhdCAoImh0dHA6Ly8iLCB1cmksIE5VTEwpOworCisgICAgc3JjLT5wcm94eSA9IHNvdXBfdXJpX25ldyAobmV3X3VyaSk7CisgICAgZ19mcmVlIChuZXdfdXJpKTsKKyAgfQorCisgIHJldHVybiAoc3JjLT5wcm94eSAhPSBOVUxMKTsKK30KKworc3RhdGljIGd1aW50Citnc3Rfc291cF9odHRwX3NyY191cmlfZ2V0X3R5cGUgKEdUeXBlIHR5cGUpCit7CisgIHJldHVybiBHU1RfVVJJX1NSQzsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICpjb25zdCAqCitnc3Rfc291cF9odHRwX3NyY191cmlfZ2V0X3Byb3RvY29scyAoR1R5cGUgdHlwZSkKK3sKKyAgc3RhdGljIGNvbnN0IGdjaGFyICpwcm90b2NvbHNbXSA9IHsgImh0dHAiLCAiaHR0cHMiLCAiaWN5IiwgImljeXgiLCBOVUxMIH07CisKKyAgcmV0dXJuIHByb3RvY29sczsKK30KKworc3RhdGljIGdjaGFyICoKK2dzdF9zb3VwX2h0dHBfc3JjX3VyaV9nZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlcikKK3sKKyAgR3N0U291cEhUVFBTcmMgKnNyYyA9IEdTVF9TT1VQX0hUVFBfU1JDIChoYW5kbGVyKTsKKworICAvKiBGSVhNRTogbWFrZSB0aHJlYWQtc2FmZSAqLworICByZXR1cm4gZ19zdHJkdXAgKHNyYy0+bG9jYXRpb24pOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zb3VwX2h0dHBfc3JjX3VyaV9zZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlciwgY29uc3QgZ2NoYXIgKiB1cmksCisgICAgR0Vycm9yICoqIGVycm9yKQoreworICBHc3RTb3VwSFRUUFNyYyAqc3JjID0gR1NUX1NPVVBfSFRUUF9TUkMgKGhhbmRsZXIpOworCisgIHJldHVybiBnc3Rfc291cF9odHRwX3NyY19zZXRfbG9jYXRpb24gKHNyYywgdXJpLCBlcnJvcik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc291cF9odHRwX3NyY191cmlfaGFuZGxlcl9pbml0IChncG9pbnRlciBnX2lmYWNlLCBncG9pbnRlciBpZmFjZV9kYXRhKQoreworICBHc3RVUklIYW5kbGVySW50ZXJmYWNlICppZmFjZSA9IChHc3RVUklIYW5kbGVySW50ZXJmYWNlICopIGdfaWZhY2U7CisKKyAgaWZhY2UtPmdldF90eXBlID0gZ3N0X3NvdXBfaHR0cF9zcmNfdXJpX2dldF90eXBlOworICBpZmFjZS0+Z2V0X3Byb3RvY29scyA9IGdzdF9zb3VwX2h0dHBfc3JjX3VyaV9nZXRfcHJvdG9jb2xzOworICBpZmFjZS0+Z2V0X3VyaSA9IGdzdF9zb3VwX2h0dHBfc3JjX3VyaV9nZXRfdXJpOworICBpZmFjZS0+c2V0X3VyaSA9IGdzdF9zb3VwX2h0dHBfc3JjX3VyaV9zZXRfdXJpOworfQpkaWZmIC0tZ2l0IGEvZXh0L3NvdXAvZ3N0c291cGh0dHBzcmMuaCBiL2V4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4NTFkZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zb3VwL2dzdHNvdXBodHRwc3JjLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggV291dGVyIENsb2V0ZW5zIDx3b3V0ZXJAbWluZC5iZT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSAKKyAqLworCisjaWZuZGVmIF9fR1NUX1NPVVBfSFRUUF9TUkNfSF9fCisjZGVmaW5lIF9fR1NUX1NPVVBfSFRUUF9TUkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0cHVzaHNyYy5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKworR19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8bGlic291cC9zb3VwLmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfU09VUF9IVFRQX1NSQyBcCisgIChnc3Rfc291cF9odHRwX3NyY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfU09VUF9IVFRQX1NSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1NPVVBfSFRUUF9TUkMsR3N0U291cEhUVFBTcmMpKQorI2RlZmluZSBHU1RfU09VUF9IVFRQX1NSQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSwgXAorICAgICAgR1NUX1RZUEVfU09VUF9IVFRQX1NSQyxHc3RTb3VwSFRUUFNyY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1NPVVBfSFRUUF9TUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9TT1VQX0hUVFBfU1JDKSkKKyNkZWZpbmUgR1NUX0lTX1NPVVBfSFRUUF9TUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfU09VUF9IVFRQX1NSQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RTb3VwSFRUUFNyYyBHc3RTb3VwSFRUUFNyYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RTb3VwSFRUUFNyY0NsYXNzIEdzdFNvdXBIVFRQU3JjQ2xhc3M7CisKK3R5cGVkZWYgZW51bSB7CisgIEdTVF9TT1VQX0hUVFBfU1JDX1NFU1NJT05fSU9fU1RBVFVTX0lETEUsCisgIEdTVF9TT1VQX0hUVFBfU1JDX1NFU1NJT05fSU9fU1RBVFVTX1FVRVVFRCwKKyAgR1NUX1NPVVBfSFRUUF9TUkNfU0VTU0lPTl9JT19TVEFUVVNfUlVOTklORywKKyAgR1NUX1NPVVBfSFRUUF9TUkNfU0VTU0lPTl9JT19TVEFUVVNfQ0FOQ0VMTEVELAorfSBHc3RTb3VwSFRUUFNyY1Nlc3Npb25JT1N0YXR1czsKKworc3RydWN0IF9Hc3RTb3VwSFRUUFNyYyB7CisgIEdzdFB1c2hTcmMgZWxlbWVudDsKKworICBnY2hhciAqbG9jYXRpb247ICAgICAgICAgICAgIC8qIEZ1bGwgVVJJLiAqLworICBnY2hhciAqcmVkaXJlY3Rpb25fdXJpOyAgICAgIC8qIEZ1bGwgVVJJIGFmdGVyIHJlZGlyZWN0aW9ucy4gKi8KKyAgZ2Jvb2xlYW4gcmVkaXJlY3Rpb25fcGVybWFuZW50OyAvKiBQZXJtYW5lbnQgb3IgdGVtcG9yYXJ5IHJlZGlyZWN0PyAqLworICBnY2hhciAqdXNlcl9hZ2VudDsgICAgICAgICAgIC8qIFVzZXItQWdlbnQgSFRUUCBoZWFkZXIuICovCisgIGdib29sZWFuIGF1dG9tYXRpY19yZWRpcmVjdDsgLyogRm9sbG93IHJlZGlyZWN0cy4gKi8KKyAgU291cFVSSSAqcHJveHk7ICAgICAgICAgICAgICAvKiBIVFRQIHByb3h5IFVSSS4gKi8KKyAgZ2NoYXIgKnVzZXJfaWQ7ICAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiB1c2VyIGlkIGZvciBsb2NhdGlvbiBVUkkuICovCisgIGdjaGFyICp1c2VyX3B3OyAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gdXNlciBwYXNzd29yZCBmb3IgbG9jYXRpb24gVVJJLiAqLworICBnY2hhciAqcHJveHlfaWQ7ICAgICAgICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIHVzZXIgaWQgZm9yIHByb3h5IFVSSS4gKi8KKyAgZ2NoYXIgKnByb3h5X3B3OyAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiB1c2VyIHBhc3N3b3JkIGZvciBwcm94eSBVUkkuICovCisgIGdjaGFyICoqY29va2llczsgICAgICAgICAgICAgLyogSFRUUCByZXF1ZXN0IGNvb2tpZXMuICovCisgIFNvdXBTZXNzaW9uICpzZXNzaW9uOyAgICAgICAgLyogQXN5bmMgY29udGV4dC4gKi8KKyAgZ2Jvb2xlYW4gc2Vzc2lvbl9pc19zaGFyZWQ7CisgIFNvdXBTZXNzaW9uICpleHRlcm5hbF9zZXNzaW9uOyAvKiBTaGFyZWQgdmlhIEdzdENvbnRleHQgKi8KKyAgZ2Jvb2xlYW4gZm9yY2VkX2V4dGVybmFsX3Nlc3Npb247IC8qIElmIHNlc3Npb24gd2FzIGV4cGxpY2l0bHkgc2V0IGZyb20gYXBwbGljYXRpb24gKi8KKyAgU291cE1lc3NhZ2UgKm1zZzsgICAgICAgICAgICAvKiBSZXF1ZXN0IG1lc3NhZ2UuICovCisgIGdpbnQgcmV0cnlfY291bnQ7ICAgICAgICAgICAgLyogTnVtYmVyIG9mIHJldHJpZXMgc2luY2Ugd2UgcmVjZWl2ZWQgZGF0YSAqLworICBnaW50IG1heF9yZXRyaWVzOyAgICAgICAgICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgKi8KKyAgZ2NoYXIgKm1ldGhvZDsgICAgICAgICAgICAgICAvKiBIVFRQIG1ldGhvZCAqLworCisgIGdib29sZWFuIGdvdF9oZWFkZXJzOyAgICAgICAgLyogQWxyZWFkeSByZWNlaXZlZCBoZWFkZXJzIGZyb20gdGhlIHNlcnZlciAqLworICBnYm9vbGVhbiBoYXZlX3NpemU7ICAgICAgICAgIC8qIFJlY2VpdmVkIGFuZCBwYXJzZWQgQ29udGVudC1MZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIuICovCisgIGd1aW50NjQgY29udGVudF9zaXplOyAgICAgICAgLyogVmFsdWUgb2YgQ29udGVudC1MZW5ndGggaGVhZGVyLiAqLworICBndWludDY0IHJlYWRfcG9zaXRpb247ICAgICAgIC8qIEN1cnJlbnQgcG9zaXRpb24uICovCisgIGdib29sZWFuIHNlZWthYmxlOyAgICAgICAgICAgLyogRkFMU0UgaWYgdGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFuZ2UuICovCisgIGd1aW50NjQgcmVxdWVzdF9wb3NpdGlvbjsgICAgLyogU2VlayB0byB0aGlzIHBvc2l0aW9uLiAqLworICBndWludDY0IHN0b3BfcG9zaXRpb247ICAgICAgIC8qIFN0b3AgYXQgdGhpcyBwb3NpdGlvbi4gKi8KKyAgZ2Jvb2xlYW4gaGF2ZV9ib2R5OyAgICAgICAgICAvKiBJbmRpY2F0ZXMgaWYgaXQgaGFzIGp1c3QgYmVlbiBzaWduYWxlZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBlbmQgb2YgdGhlIG1lc3NhZ2UgYm9keS4gVGhpcyBpcyB1c2VkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGVjaWRlIGlmIGFuIG91dCBvZiByYW5nZSByZXF1ZXN0IHNob3VsZCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGhhbmRsZWQgYXMgYW4gZXJyb3Igb3IgRU9TIHdoZW4gdGhlIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplIGlzIHVua25vd24gKi8KKyAgZ2Jvb2xlYW4ga2VlcF9hbGl2ZTsgICAgICAgICAvKiBVc2Uga2VlcC1hbGl2ZSBzZXNzaW9ucyAqLworICBnYm9vbGVhbiBzc2xfc3RyaWN0OworICBnY2hhciAqc3NsX2NhX2ZpbGU7CisgIGdib29sZWFuIHNzbF91c2Vfc3lzdGVtX2NhX2ZpbGU7CisgIEdUbHNEYXRhYmFzZSAqdGxzX2RhdGFiYXNlOworICBHVGxzSW50ZXJhY3Rpb24gKnRsc19pbnRlcmFjdGlvbjsKKworICBHQ2FuY2VsbGFibGUgKmNhbmNlbGxhYmxlOworICBHSW5wdXRTdHJlYW0gKmlucHV0X3N0cmVhbTsKKworICBnaW50IHJlZHVjZV9ibG9ja3NpemVfY291bnQ7CisgIGdpbnQgaW5jcmVhc2VfYmxvY2tzaXplX2NvdW50OworICBndWludCBtaW5pbXVtX2Jsb2Nrc2l6ZTsKKworICAvKiBTaG91dGNhc3QvaWNlY2FzdCBtZXRhZGF0YSBleHRyYWN0aW9uIGhhbmRsaW5nLiAqLworICBnYm9vbGVhbiBpcmFkaW9fbW9kZTsKKyAgR3N0Q2FwcyAqc3JjX2NhcHM7CisgIGdjaGFyICppcmFkaW9fbmFtZTsKKyAgZ2NoYXIgKmlyYWRpb19nZW5yZTsKKyAgZ2NoYXIgKmlyYWRpb191cmw7CisKKyAgR3N0U3RydWN0dXJlICpleHRyYV9oZWFkZXJzOworCisgIFNvdXBMb2dnZXJMb2dMZXZlbCBsb2dfbGV2ZWw7LyogU291cCBIVFRQIHNlc3Npb24gbG9nZ2VyIGxldmVsICovCisKKyAgZ2Jvb2xlYW4gY29tcHJlc3M7CisKKyAgZ3VpbnQgdGltZW91dDsKKworICBHTXV0ZXggbXV0ZXg7CisgIEdDb25kIGhhdmVfaGVhZGVyc19jb25kOworCisgIEdzdEV2ZW50ICpodHRwX2hlYWRlcnNfZXZlbnQ7Cit9OworCitzdHJ1Y3QgX0dzdFNvdXBIVFRQU3JjQ2xhc3MgeworICBHc3RQdXNoU3JjQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3NvdXBfaHR0cF9zcmNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfU09VUF9IVFRQX1NSQ19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZXh0L3NvdXAvZ3N0c291cHV0aWxzLmMgYi9leHQvc291cC9nc3Rzb3VwdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmMxZWYxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NvdXAvZ3N0c291cHV0aWxzLmMKQEAgLTAsMCArMSw5NyBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFNhbXN1bmcgRWxlY3Ryb25pY3MuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgICAgQEF1dGhvcjogUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldCA8ci52ZXJkZWpvQHNpc2Euc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqLworCisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGxpYnNvdXAvc291cC5oPgorI2luY2x1ZGUgImdzdHNvdXB1dGlscy5oIgorCisvKioKKyAqIFNvdXAgbG9nZ2VyIGZ1bmNzCisgKi8KKworR1NUX0RFQlVHX0NBVEVHT1JZX0VYVEVSTiAoc291cF91dGlsc19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBzb3VwX3V0aWxzX2RlYnVnCisKK3N0YXRpYyBpbmxpbmUgZ2NoYXIKK2dzdF9zb3VwX3V0aWxfbG9nX21ha2VfbGV2ZWxfdGFnIChTb3VwTG9nZ2VyTG9nTGV2ZWwgbGV2ZWwpCit7CisgIGdjaGFyIGM7CisKKyAgaWYgKEdfVU5MSUtFTFkgKChnaW50KSBsZXZlbCA+IDkpKQorICAgIHJldHVybiAnPyc7CisKKyAgc3dpdGNoIChsZXZlbCkgeworICAgIGNhc2UgU09VUF9MT0dHRVJfTE9HX01JTklNQUw6CisgICAgICBjID0gJ00nOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTT1VQX0xPR0dFUl9MT0dfSEVBREVSUzoKKyAgICAgIGMgPSAnSCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNPVVBfTE9HR0VSX0xPR19CT0RZOgorICAgICAgYyA9ICdCJzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBVbmtub3duIGxldmVsLiBJZiB0aGlzIGlzIGhpdCBsaWJzb3VwIGxpa2VseSBhZGRlZCBhIG5ldworICAgICAgICogbG9nIGxldmVsIHRvIFNvdXBMb2dnZXJMb2dMZXZlbCBhbmQgaXQgc2hvdWxkIGJlIGFkZGVkCisgICAgICAgKiBhcyBhIGNhc2UgKi8KKyAgICAgIGMgPSBsZXZlbCArICcwJzsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBjOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NvdXBfdXRpbF9sb2dfcHJpbnRlcl9jYiAoU291cExvZ2dlciBHX0dOVUNfVU5VU0VEICogbG9nZ2VyLAorICAgIFNvdXBMb2dnZXJMb2dMZXZlbCBsZXZlbCwgY2hhciBkaXJlY3Rpb24sIGNvbnN0IGNoYXIgKmRhdGEsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBnY2hhciBjOworICBjID0gZ3N0X3NvdXBfdXRpbF9sb2dfbWFrZV9sZXZlbF90YWcgKGxldmVsKTsKKyAgR1NUX1RSQUNFX09CSkVDVCAoR1NUX0VMRU1FTlQgKHVzZXJfZGF0YSksICJIVFRQX1NFU1NJT04oJWMpOiAlYyAlcyIsIGMsCisgICAgICBkaXJlY3Rpb24sIGRhdGEpOworfQorCit2b2lkCitnc3Rfc291cF91dGlsX2xvZ19zZXR1cCAoU291cFNlc3Npb24gKiBzZXNzaW9uLCBTb3VwTG9nZ2VyTG9nTGV2ZWwgbGV2ZWwsCisgICAgR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIFNvdXBMb2dnZXIgKmxvZ2dlcjsKKworICBpZiAoIWxldmVsKSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiTm90IGF0dGFjaGluZyBhIGxvZ2dlciB3aXRoIGxldmVsIDAiKTsKKyAgICByZXR1cm47CisgIH0KKworICBnX2Fzc2VydCAoc2Vzc2lvbiAmJiBlbGVtZW50KTsKKworICBpZiAoZ3N0X2RlYnVnX2NhdGVnb3J5X2dldF90aHJlc2hvbGQgKEdTVF9DQVRfREVGQVVMVCkKKyAgICAgIDwgR1NUX0xFVkVMX1RSQUNFKSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiTm90IHNldHRpbmcgdXAgSFRUUCBzZXNzaW9uIGxvZ2dlci4gIgorICAgICAgICAiTmVlZCBhdCBsZWFzdCBHU1RfTEVWRUxfVFJBQ0UiKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBDcmVhdGUgYSBuZXcgbG9nZ2VyIGFuZCBzZXQgYm9keV9zaXplX2xpbWl0IHRvIC0xIChubyBsaW1pdCkgKi8KKyAgbG9nZ2VyID0gc291cF9sb2dnZXJfbmV3IChsZXZlbCwgLTEpOworICBzb3VwX2xvZ2dlcl9zZXRfcHJpbnRlciAobG9nZ2VyLCBnc3Rfc291cF91dGlsX2xvZ19wcmludGVyX2NiLAorICAgICAgZ3N0X29iamVjdF9yZWYgKGVsZW1lbnQpLCAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9vYmplY3RfdW5yZWYpOworCisgIC8qIEF0dGFjaCBsb2dnZXIgdG8gc2Vzc2lvbiAqLworICBzb3VwX3Nlc3Npb25fYWRkX2ZlYXR1cmUgKHNlc3Npb24sIFNPVVBfU0VTU0lPTl9GRUFUVVJFIChsb2dnZXIpKTsKKyAgZ19vYmplY3RfdW5yZWYgKGxvZ2dlcik7Cit9CmRpZmYgLS1naXQgYS9leHQvc291cC9nc3Rzb3VwdXRpbHMuaCBiL2V4dC9zb3VwL2dzdHNvdXB1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MzUyNWQKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc291cC9nc3Rzb3VwdXRpbHMuaApAQCAtMCwwICsxLDMxIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgU2Ftc3VuZyBFbGVjdHJvbmljcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgICBAQXV0aG9yOiBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0IDxyLnZlcmRlam9Ac2lzYS5zYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICovCisKKyNpZm5kZWYgX19HU1RfU09VUF9VVElMU19IX18KKyNkZWZpbmUgX19HU1RfU09VUF9VVElMU19IX18KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8bGlic291cC9zb3VwLmg+CisKK0dfQkVHSU5fREVDTFMKKwordm9pZCBnc3Rfc291cF91dGlsX2xvZ19zZXR1cCAoU291cFNlc3Npb24gKiBzZXNzaW9uLCBTb3VwTG9nZ2VyTG9nTGV2ZWwgbGV2ZWwsCisgICAgR3N0RWxlbWVudCAqIGVsZW1lbnQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4dC9zb3VwL21lc29uLmJ1aWxkIGIvZXh0L3NvdXAvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkNzEyOQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zb3VwL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMjUgQEAKK3NvdXBfc291cmNlcyA9IFsKKyAgJ2dzdHNvdXBodHRwc3JjLmMnLAorICAnZ3N0c291cGh0dHBjbGllbnRzaW5rLmMnLAorICAnZ3N0c291cHV0aWxzLmMnLAorICAnZ3N0c291cC5jJywKK10KKworc291cF9hcmdzID0gWworICAnLURTT1VQX1ZFUlNJT05fTUlOX1JFUVVJUkVEPVNPVVBfVkVSU0lPTl8yXzQ4JywKKyAgJy1EU09VUF9WRVJTSU9OX01BWF9BTExPV0VEPVNPVVBfREVQUkVDQVRFRF9JTl8yXzQ4JywKK10KKworbGlic291cF9kZXAgPSBkZXBlbmRlbmN5KCdsaWJzb3VwLTIuNCcsIHZlcnNpb24gOiAnPj0yLjQ4JywgcmVxdWlyZWQgOiBmYWxzZSkKKworaWYgbGlic291cF9kZXAuZm91bmQoKQorICBnc3Rzb3VwaHR0cHNyYyA9IGxpYnJhcnkoJ2dzdHNvdXAnLAorICAgIHNvdXBfc291cmNlcywKKyAgICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MgKyBzb3VwX2FyZ3MsCisgICAgbGlua19hcmdzIDogbm9zZWhfbGlua19hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3N0X2RlcCwgZ3N0YmFzZV9kZXAsIGdzdHRhZ19kZXAsIGxpYnNvdXBfZGVwXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCisgICkKK2VuZGlmCmRpZmYgLS1naXQgYS9leHQvc3BlZXgvTWFrZWZpbGUuYW0gYi9leHQvc3BlZXgvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwZjU5NAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcGVleC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE3IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RzcGVleC5sYQorCitsaWJnc3RzcGVleF9sYV9TT1VSQ0VTID0gZ3N0c3BlZXguYyBnc3RzcGVleGRlYy5jIGdzdHNwZWV4ZW5jLmMKK2xpYmdzdHNwZWV4X2xhX0NGTEFHUyA9IC1ER1NUX1VTRV9VTlNUQUJMRV9BUEkgXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9CQVNFX0NGTEFHUykgXAorCSQoR1NUX0NGTEFHUykgXAorCSQoU1BFRVhfQ0ZMQUdTKQorbGliZ3N0c3BlZXhfbGFfTElCQUREID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSBcCisJLWxnc3R0YWctJChHU1RfQVBJX1ZFUlNJT04pIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9CQVNFX0xJQlMpIFwKKwkkKEdTVF9MSUJTKSBcCisJJChTUEVFWF9MSUJTKQorbGliZ3N0c3BlZXhfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKSAkKExJQk0pCisKK25vaW5zdF9IRUFERVJTID0gZ3N0c3BlZXhlbmMuaCBnc3RzcGVleGRlYy5oIApkaWZmIC0tZ2l0IGEvZXh0L3NwZWV4L2dzdHNwZWV4LmMgYi9leHQvc3BlZXgvZ3N0c3BlZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njg4Y2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwZWV4L2dzdHNwZWV4LmMKQEAgLTAsMCArMSw0OSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RzcGVleGRlYy5oIgorI2luY2x1ZGUgImdzdHNwZWV4ZW5jLmgiCisKKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAic3BlZXhlbmMiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX1NQRUVYX0VOQykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInNwZWV4ZGVjIiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgICAgICBHU1RfVFlQRV9TUEVFWF9ERUMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBnc3RfdGFnX3JlZ2lzdGVyX211c2ljYnJhaW56X3RhZ3MgKCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBzcGVleCwKKyAgICAiU3BlZXggcGx1Z2luIGxpYnJhcnkiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2V4dC9zcGVleC9nc3RzcGVleGRlYy5jIGIvZXh0L3NwZWV4L2dzdHNwZWV4ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MxMjNjZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcGVleC9nc3RzcGVleGRlYy5jCkBAIC0wLDAgKzEsNTc0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtc3BlZXhkZWMKKyAqIEBzZWVfYWxzbzogc3BlZXhlbmMsIG9nZ2RlbXV4CisgKgorICogVGhpcyBlbGVtZW50IGRlY29kZXMgYSBTcGVleCBzdHJlYW0gdG8gcmF3IGludGVnZXIgYXVkaW8uCisgKiA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LnNwZWV4Lm9yZy8iPlNwZWV4PC91bGluaz4gaXMgYSByb3lhbHR5LWZyZWUKKyAqIGF1ZGlvIGNvZGVjIG1haW50YWluZWQgYnkgdGhlIDx1bGluayB1cmw9Imh0dHA6Ly93d3cueGlwaC5vcmcvIj5YaXBoLm9yZworICogRm91bmRhdGlvbjwvdWxpbms+LgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgZmlsZXNyYyBsb2NhdGlvbj1zcGVleC5vZ2cgISBvZ2dkZW11eCAhIHNwZWV4ZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIGFsc2FzaW5rCisgKiBdfCBEZWNvZGUgYW4gT2dnL1NwZWV4IGZpbGUuIFRvIGNyZWF0ZSBhbiBPZ2cvU3BlZXggZmlsZSByZWZlciB0byB0aGUKKyAqIGRvY3VtZW50YXRpb24gb2Ygc3BlZXhlbmMuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0c3BlZXhkZWMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChzcGVleGRlY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBzcGVleGRlY19kZWJ1ZworCisjZGVmaW5lIERFRkFVTFRfRU5IICAgVFJVRQorCitlbnVtCit7CisgIEFSR18wLAorICBBUkdfRU5ICit9OworCisjZGVmaW5lIEZPUk1BVF9TVFIgR1NUX0FVRElPX05FKFMxNikKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNwZWV4X2RlY19zcmNfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgRk9STUFUX1NUUiAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgNjAwMCwgNDgwMDAgXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNwZWV4X2RlY19zaW5rX2ZhY3RvcnkgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1zcGVleCIpCisgICAgKTsKKworI2RlZmluZSBnc3Rfc3BlZXhfZGVjX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFNwZWV4RGVjLCBnc3Rfc3BlZXhfZGVjLCBHU1RfVFlQRV9BVURJT19ERUNPREVSKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9zcGVleF9kZWNfc3RhcnQgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NwZWV4X2RlY19zdG9wIChHc3RBdWRpb0RlY29kZXIgKiBkZWMpOworc3RhdGljIGdib29sZWFuIGdzdF9zcGVleF9kZWNfc2V0X2Zvcm1hdCAoR3N0QXVkaW9EZWNvZGVyICogYmRlYywKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc3BlZXhfZGVjX2hhbmRsZV9mcmFtZSAoR3N0QXVkaW9EZWNvZGVyICogZGVjLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKK3N0YXRpYyB2b2lkIGdzdF9zcGVleF9kZWNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3NwZWV4X2RlY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BlZXhfZGVjX2NsYXNzX2luaXQgKEdzdFNwZWV4RGVjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEF1ZGlvRGVjb2RlckNsYXNzICpiYXNlX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgYmFzZV9jbGFzcyA9IChHc3RBdWRpb0RlY29kZXJDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3Rfc3BlZXhfZGVjX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3NwZWV4X2RlY19nZXRfcHJvcGVydHk7CisKKyAgYmFzZV9jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NwZWV4X2RlY19zdGFydCk7CisgIGJhc2VfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NwZWV4X2RlY19zdG9wKTsKKyAgYmFzZV9jbGFzcy0+c2V0X2Zvcm1hdCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BlZXhfZGVjX3NldF9mb3JtYXQpOworICBiYXNlX2NsYXNzLT5oYW5kbGVfZnJhbWUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NwZWV4X2RlY19oYW5kbGVfZnJhbWUpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19FTkgsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImVuaCIsICJFbmgiLCAiRW5hYmxlIHBlcmNlcHR1YWwgZW5oYW5jZW1lbnQiLAorICAgICAgICAgIERFRkFVTFRfRU5ILCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZzcGVleF9kZWNfc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZzcGVleF9kZWNfc2lua19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJTcGVleCBhdWRpbyBkZWNvZGVyIiwgIkNvZGVjL0RlY29kZXIvQXVkaW8iLAorICAgICAgImRlY29kZSBzcGVleCBzdHJlYW1zIHRvIGF1ZGlvIiwgIldpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHNwZWV4ZGVjX2RlYnVnLCAic3BlZXhkZWMiLCAwLAorICAgICAgInNwZWV4IGRlY29kaW5nIGVsZW1lbnQiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGVleF9kZWNfcmVzZXQgKEdzdFNwZWV4RGVjICogZGVjKQoreworICBkZWMtPnBhY2tldG5vID0gMDsKKyAgZGVjLT5mcmFtZV9zaXplID0gMDsKKyAgZGVjLT5mcmFtZV9kdXJhdGlvbiA9IDA7CisgIGRlYy0+bW9kZSA9IE5VTEw7CisgIGZyZWUgKGRlYy0+aGVhZGVyKTsKKyAgZGVjLT5oZWFkZXIgPSBOVUxMOworICBzcGVleF9iaXRzX2Rlc3Ryb3kgKCZkZWMtPmJpdHMpOworICBzcGVleF9iaXRzX3NldF9iaXRfYnVmZmVyICgmZGVjLT5iaXRzLCBOVUxMLCAwKTsKKworICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZkZWMtPnN0cmVhbWhlYWRlciwgTlVMTCk7CisgIGdzdF9idWZmZXJfcmVwbGFjZSAoJmRlYy0+dm9yYmlzY29tbWVudCwgTlVMTCk7CisKKyAgaWYgKGRlYy0+c3RlcmVvKSB7CisgICAgc3BlZXhfc3RlcmVvX3N0YXRlX2Rlc3Ryb3kgKGRlYy0+c3RlcmVvKTsKKyAgICBkZWMtPnN0ZXJlbyA9IE5VTEw7CisgIH0KKworICBpZiAoZGVjLT5zdGF0ZSkgeworICAgIHNwZWV4X2RlY29kZXJfZGVzdHJveSAoZGVjLT5zdGF0ZSk7CisgICAgZGVjLT5zdGF0ZSA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGVleF9kZWNfaW5pdCAoR3N0U3BlZXhEZWMgKiBkZWMpCit7CisgIGdzdF9hdWRpb19kZWNvZGVyX3NldF9uZWVkc19mb3JtYXQgKEdTVF9BVURJT19ERUNPREVSIChkZWMpLCBUUlVFKTsKKyAgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X3VzZV9kZWZhdWx0X3BhZF9hY2NlcHRjYXBzIChHU1RfQVVESU9fREVDT0RFUl9DQVNUCisgICAgICAoZGVjKSwgVFJVRSk7CisgIEdTVF9QQURfU0VUX0FDQ0VQVF9URU1QTEFURSAoR1NUX0FVRElPX0RFQ09ERVJfU0lOS19QQUQgKGRlYykpOworCisgIGRlYy0+ZW5oID0gREVGQVVMVF9FTkg7CisKKyAgZ3N0X3NwZWV4X2RlY19yZXNldCAoZGVjKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BlZXhfZGVjX3N0YXJ0IChHc3RBdWRpb0RlY29kZXIgKiBkZWMpCit7CisgIEdzdFNwZWV4RGVjICpzZCA9IEdTVF9TUEVFWF9ERUMgKGRlYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVjLCAic3RhcnQiKTsKKyAgZ3N0X3NwZWV4X2RlY19yZXNldCAoc2QpOworCisgIC8qIHdlIGtub3cgYWJvdXQgY29uY2VhbG1lbnQgKi8KKyAgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X3BsY19hd2FyZSAoZGVjLCBUUlVFKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BlZXhfZGVjX3N0b3AgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYykKK3sKKyAgR3N0U3BlZXhEZWMgKnNkID0gR1NUX1NQRUVYX0RFQyAoZGVjKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZWMsICJzdG9wIik7CisgIGdzdF9zcGVleF9kZWNfcmVzZXQgKHNkKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9zcGVleF9kZWNfcGFyc2VfaGVhZGVyIChHc3RTcGVleERlYyAqIGRlYywgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RNYXBJbmZvIG1hcDsKKyAgR3N0QXVkaW9JbmZvIGluZm87CisgIHN0YXRpYyBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBjaGFuX3Bvc1syXVsyXSA9IHsKKyAgICB7R1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTU9OT30sCisgICAge0dTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUfQorICB9OworCisgIC8qIGdldCB0aGUgaGVhZGVyICovCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRlYy0+aGVhZGVyID0gc3BlZXhfcGFja2V0X3RvX2hlYWRlciAoKGdjaGFyICopIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgaWYgKCFkZWMtPmhlYWRlcikKKyAgICBnb3RvIG5vX2hlYWRlcjsKKworICBpZiAoZGVjLT5oZWFkZXItPm1vZGUgPj0gU1BFRVhfTkJfTU9ERVMgfHwgZGVjLT5oZWFkZXItPm1vZGUgPCAwKQorICAgIGdvdG8gbW9kZV90b29fb2xkOworCisgIGRlYy0+bW9kZSA9IHNwZWV4X2xpYl9nZXRfbW9kZSAoZGVjLT5oZWFkZXItPm1vZGUpOworCisgIC8qIGluaXRpYWxpemUgdGhlIGRlY29kZXIgKi8KKyAgZGVjLT5zdGF0ZSA9IHNwZWV4X2RlY29kZXJfaW5pdCAoZGVjLT5tb2RlKTsKKyAgaWYgKCFkZWMtPnN0YXRlKQorICAgIGdvdG8gaW5pdF9mYWlsZWQ7CisKKyAgc3BlZXhfZGVjb2Rlcl9jdGwgKGRlYy0+c3RhdGUsIFNQRUVYX1NFVF9FTkgsICZkZWMtPmVuaCk7CisgIHNwZWV4X2RlY29kZXJfY3RsIChkZWMtPnN0YXRlLCBTUEVFWF9HRVRfRlJBTUVfU0laRSwgJmRlYy0+ZnJhbWVfc2l6ZSk7CisKKyAgaWYgKGRlYy0+aGVhZGVyLT5uYl9jaGFubmVscyAhPSAxKSB7CisgICAgZGVjLT5zdGVyZW8gPSBzcGVleF9zdGVyZW9fc3RhdGVfaW5pdCAoKTsKKyAgICBkZWMtPmNhbGxiYWNrLmNhbGxiYWNrX2lkID0gU1BFRVhfSU5CQU5EX1NURVJFTzsKKyAgICBkZWMtPmNhbGxiYWNrLmZ1bmMgPSBzcGVleF9zdGRfc3RlcmVvX3JlcXVlc3RfaGFuZGxlcjsKKyAgICBkZWMtPmNhbGxiYWNrLmRhdGEgPSBkZWMtPnN0ZXJlbzsKKyAgICBzcGVleF9kZWNvZGVyX2N0bCAoZGVjLT5zdGF0ZSwgU1BFRVhfU0VUX0hBTkRMRVIsICZkZWMtPmNhbGxiYWNrKTsKKyAgfQorCisgIHNwZWV4X2RlY29kZXJfY3RsIChkZWMtPnN0YXRlLCBTUEVFWF9TRVRfU0FNUExJTkdfUkFURSwgJmRlYy0+aGVhZGVyLT5yYXRlKTsKKworICBkZWMtPmZyYW1lX2R1cmF0aW9uID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoZGVjLT5mcmFtZV9zaXplLAorICAgICAgR1NUX1NFQ09ORCwgZGVjLT5oZWFkZXItPnJhdGUpOworCisgIHNwZWV4X2JpdHNfaW5pdCAoJmRlYy0+Yml0cyk7CisKKyAgLyogc2V0IGNhcHMgKi8KKyAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJmluZm8pOworICBnc3RfYXVkaW9faW5mb19zZXRfZm9ybWF0ICgmaW5mbywKKyAgICAgIEdTVF9BVURJT19GT1JNQVRfUzE2LAorICAgICAgZGVjLT5oZWFkZXItPnJhdGUsCisgICAgICBkZWMtPmhlYWRlci0+bmJfY2hhbm5lbHMsIGNoYW5fcG9zW2RlYy0+aGVhZGVyLT5uYl9jaGFubmVscyAtIDFdKTsKKworICBpZiAoIWdzdF9hdWRpb19kZWNvZGVyX3NldF9vdXRwdXRfZm9ybWF0IChHU1RfQVVESU9fREVDT0RFUiAoZGVjKSwgJmluZm8pKQorICAgIGdvdG8gbmVnb19mYWlsZWQ7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIC8qIEVSUk9SUyAqLworbm9faGVhZGVyOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKEdTVF9FTEVNRU5UIChkZWMpLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoImNvdWxkbid0IHJlYWQgaGVhZGVyIikpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorbW9kZV90b29fb2xkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKEdTVF9FTEVNRU5UIChkZWMpLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLAorICAgICAgICAoIk1vZGUgbnVtYmVyICVkIGRvZXMgbm90ICh5ZXQvYW55IGxvbmdlcikgZXhpc3QgaW4gdGhpcyB2ZXJzaW9uIiwKKyAgICAgICAgICAgIGRlYy0+aGVhZGVyLT5tb2RlKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Citpbml0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChHU1RfRUxFTUVOVCAoZGVjKSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJjb3VsZG4ndCBpbml0aWFsaXplIGRlY29kZXIiKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CituZWdvX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChHU1RfRUxFTUVOVCAoZGVjKSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJjb3VsZG4ndCBuZWdvdGlhdGUgZm9ybWF0IikpOworICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NwZWV4X2RlY19wYXJzZV9jb21tZW50cyAoR3N0U3BlZXhEZWMgKiBkZWMsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0VGFnTGlzdCAqbGlzdDsKKyAgZ2NoYXIgKnZlciwgKmVuY29kZXIgPSBOVUxMOworCisgIGxpc3QgPSBnc3RfdGFnX2xpc3RfZnJvbV92b3JiaXNjb21tZW50X2J1ZmZlciAoYnVmLCBOVUxMLCAwLCAmZW5jb2Rlcik7CisKKyAgaWYgKCFsaXN0KSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZWMsICJjb3VsZG4ndCBkZWNvZGUgY29tbWVudHMiKTsKKyAgICBsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgfQorCisgIGlmIChlbmNvZGVyKSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAobGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICBHU1RfVEFHX0VOQ09ERVIsIGVuY29kZXIsIE5VTEwpOworICB9CisKKyAgZ3N0X3RhZ19saXN0X2FkZCAobGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgR1NUX1RBR19BVURJT19DT0RFQywgIlNwZWV4IiwgTlVMTCk7CisKKyAgdmVyID0gZ19zdHJuZHVwIChkZWMtPmhlYWRlci0+c3BlZXhfdmVyc2lvbiwgU1BFRVhfSEVBREVSX1ZFUlNJT05fTEVOR1RIKTsKKyAgZ19zdHJzdHJpcCAodmVyKTsKKworICBpZiAodmVyICE9IE5VTEwgJiYgKnZlciAhPSAnXDAnKSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAobGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICBHU1RfVEFHX0VOQ09ERVJfVkVSU0lPTiwgdmVyLCBOVUxMKTsKKyAgfQorCisgIGlmIChkZWMtPmhlYWRlci0+Yml0cmF0ZSA+IDApIHsKKyAgICBnc3RfdGFnX2xpc3RfYWRkIChsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgIEdTVF9UQUdfQklUUkFURSwgKGd1aW50KSBkZWMtPmhlYWRlci0+Yml0cmF0ZSwgTlVMTCk7CisgIH0KKworICBHU1RfSU5GT19PQkpFQ1QgKGRlYywgInRhZ3M6ICUiIEdTVF9QVFJfRk9STUFULCBsaXN0KTsKKworICBnc3RfYXVkaW9fZGVjb2Rlcl9tZXJnZV90YWdzIChHU1RfQVVESU9fREVDT0RFUiAoZGVjKSwgbGlzdCwKKyAgICAgIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAobGlzdCk7CisKKyAgZ19mcmVlIChlbmNvZGVyKTsKKyAgZ19mcmVlICh2ZXIpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BlZXhfZGVjX3NldF9mb3JtYXQgKEdzdEF1ZGlvRGVjb2RlciAqIGJkZWMsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTcGVleERlYyAqZGVjID0gR1NUX1NQRUVYX0RFQyAoYmRlYyk7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgY29uc3QgR1ZhbHVlICpzdHJlYW1oZWFkZXI7CisKKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBpZiAoKHN0cmVhbWhlYWRlciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAic3RyZWFtaGVhZGVyIikpICYmCisgICAgICBHX1ZBTFVFX0hPTERTIChzdHJlYW1oZWFkZXIsIEdTVF9UWVBFX0FSUkFZKSAmJgorICAgICAgZ3N0X3ZhbHVlX2FycmF5X2dldF9zaXplIChzdHJlYW1oZWFkZXIpID49IDIpIHsKKyAgICBjb25zdCBHVmFsdWUgKmhlYWRlciwgKnZvcmJpc2NvbW1lbnQ7CisgICAgR3N0QnVmZmVyICpidWY7CisgICAgR3N0Rmxvd1JldHVybiByZXMgPSBHU1RfRkxPV19PSzsKKworICAgIGhlYWRlciA9IGdzdF92YWx1ZV9hcnJheV9nZXRfdmFsdWUgKHN0cmVhbWhlYWRlciwgMCk7CisgICAgaWYgKGhlYWRlciAmJiBHX1ZBTFVFX0hPTERTIChoZWFkZXIsIEdTVF9UWVBFX0JVRkZFUikpIHsKKyAgICAgIGJ1ZiA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyIChoZWFkZXIpOworICAgICAgcmVzID0gZ3N0X3NwZWV4X2RlY19wYXJzZV9oZWFkZXIgKGRlYywgYnVmKTsKKyAgICAgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIGdzdF9idWZmZXJfcmVwbGFjZSAoJmRlYy0+c3RyZWFtaGVhZGVyLCBidWYpOworICAgIH0KKworICAgIHZvcmJpc2NvbW1lbnQgPSBnc3RfdmFsdWVfYXJyYXlfZ2V0X3ZhbHVlIChzdHJlYW1oZWFkZXIsIDEpOworICAgIGlmICh2b3JiaXNjb21tZW50ICYmIEdfVkFMVUVfSE9MRFMgKHZvcmJpc2NvbW1lbnQsIEdTVF9UWVBFX0JVRkZFUikpIHsKKyAgICAgIGJ1ZiA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyICh2b3JiaXNjb21tZW50KTsKKyAgICAgIHJlcyA9IGdzdF9zcGVleF9kZWNfcGFyc2VfY29tbWVudHMgKGRlYywgYnVmKTsKKyAgICAgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIGdzdF9idWZmZXJfcmVwbGFjZSAoJmRlYy0+dm9yYmlzY29tbWVudCwgYnVmKTsKKyAgICB9CisgIH0KKworZG9uZToKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9zcGVleF9kZWNfcGFyc2VfZGF0YSAoR3N0U3BlZXhEZWMgKiBkZWMsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXMgPSBHU1RfRkxPV19PSzsKKyAgZ2ludCBpLCBmcHA7CisgIFNwZWV4Qml0cyAqYml0czsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgaWYgKCFkZWMtPmZyYW1lX2R1cmF0aW9uKQorICAgIGdvdG8gbm90X25lZ290aWF0ZWQ7CisKKyAgaWYgKEdfTElLRUxZIChnc3RfYnVmZmVyX2dldF9zaXplIChidWYpKSkgeworICAgIC8qIHNlbmQgZGF0YSB0byB0aGUgYml0c3RyZWFtICovCisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBzcGVleF9iaXRzX3JlYWRfZnJvbSAoJmRlYy0+Yml0cywgKGdjaGFyICopIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICAgIGZwcCA9IGRlYy0+aGVhZGVyLT5mcmFtZXNfcGVyX3BhY2tldDsKKyAgICBiaXRzID0gJmRlYy0+Yml0czsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgInJlY2VpdmVkIGJ1ZmZlciBvZiBzaXplICUiIEdfR1NJWkVfRk9STUFUCisgICAgICAgICIsIGZwcCAlZCwgJWQgYml0cyIsIG1hcC5zaXplLCBmcHAsIHNwZWV4X2JpdHNfcmVtYWluaW5nIChiaXRzKSk7CisgIH0gZWxzZSB7CisgICAgLyogRklYTUUgPyBhY3R1YWxseSBjb25zaWRlciBob3cgbXVjaCBjb25jZWFsbWVudCBpcyBuZWVkZWQgKi8KKyAgICAvKiBjb25jZWFsbWVudCBkYXRhLCBwYXNzIE5VTEwgYXMgdGhlIGJpdHMgcGFyYW1ldGVycyAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgImNyZWF0aW5nIGNvbmNlYWxtZW50IGRhdGEiKTsKKyAgICBmcHAgPSBkZWMtPmhlYWRlci0+ZnJhbWVzX3Blcl9wYWNrZXQ7CisgICAgYml0cyA9IE5VTEw7CisgIH0KKworICAvKiBub3cgZGVjb2RlIGVhY2ggZnJhbWUsIGNhdGVyaW5nIGZvciB1bmtub3duIG51bWJlciBvZiB0aGVtIChlLmcuIHJ0cCkgKi8KKyAgZm9yIChpID0gMDsgaSA8IGZwcDsgaSsrKSB7CisgICAgR3N0QnVmZmVyICpvdXRidWY7CisgICAgZ2Jvb2xlYW4gY29ycnVwdGVkID0gRkFMU0U7CisgICAgZ2ludCByZXQ7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZGVjLCAiZGVjb2RpbmcgZnJhbWUgJWQvJWQsICVkIGJpdHMgcmVtYWluaW5nIiwgaSwgZnBwLAorICAgICAgICBiaXRzID8gc3BlZXhfYml0c19yZW1haW5pbmcgKGJpdHMpIDogLTEpOworI2lmIDAKKyAgICByZXMgPQorICAgICAgICBnc3RfcGFkX2FsbG9jX2J1ZmZlcl9hbmRfc2V0X2NhcHMgKEdTVF9BVURJT19ERUNPREVSX1NSQ19QQUQgKGRlYyksCisgICAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUX05PTkUsIGRlYy0+ZnJhbWVfc2l6ZSAqIGRlYy0+aGVhZGVyLT5uYl9jaGFubmVscyAqIDIsCisgICAgICAgIEdTVF9QQURfQ0FQUyAoR1NUX0FVRElPX0RFQ09ERVJfU1JDX1BBRCAoZGVjKSksICZvdXRidWYpOworCisgICAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVjLCAiYnVmIGFsbG9jIGZsb3c6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJlcykpOworICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisjZW5kaWYKKyAgICAvKiBGSVhNRSwgd2UgY2FuIHVzZSBhIGJ1ZmZlcnBvb2wgYmVjYXVzZSB3ZSBoYXZlIGZpeGVkIHNpemUgYnVmZmVycy4gV2UKKyAgICAgKiBjb3VsZCBhbHNvIHVzZSBhbiBhbGxvY2F0b3IgKi8KKyAgICBvdXRidWYgPQorICAgICAgICBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwKKyAgICAgICAgZGVjLT5mcmFtZV9zaXplICogZGVjLT5oZWFkZXItPm5iX2NoYW5uZWxzICogMiwgTlVMTCk7CisKKyAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICByZXQgPSBzcGVleF9kZWNvZGVfaW50IChkZWMtPnN0YXRlLCBiaXRzLCAoc3B4X2ludDE2X3QgKikgbWFwLmRhdGEpOworCisgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgLyogdWg/IGVuZCBvZiBzdHJlYW0gKi8KKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVjLCAiVW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtIGZvdW5kIik7CisgICAgICBjb3JydXB0ZWQgPSBUUlVFOworICAgIH0gZWxzZSBpZiAocmV0ID09IC0yKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlYywgIkRlY29kaW5nIGVycm9yOiBjb3JydXB0ZWQgc3RyZWFtPyIpOworICAgICAgY29ycnVwdGVkID0gVFJVRTsKKyAgICB9CisKKyAgICBpZiAoYml0cyAmJiBzcGVleF9iaXRzX3JlbWFpbmluZyAoYml0cykgPCAwKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlYywgIkRlY29kaW5nIG92ZXJmbG93OiBjb3JydXB0ZWQgc3RyZWFtPyIpOworICAgICAgY29ycnVwdGVkID0gVFJVRTsKKyAgICB9CisgICAgaWYgKGRlYy0+aGVhZGVyLT5uYl9jaGFubmVscyA9PSAyKQorICAgICAgc3BlZXhfZGVjb2RlX3N0ZXJlb19pbnQgKChzcHhfaW50MTZfdCAqKSBtYXAuZGF0YSwgZGVjLT5mcmFtZV9zaXplLAorICAgICAgICAgIGRlYy0+c3RlcmVvKTsKKworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm1hcCk7CisKKyAgICBpZiAoIWNvcnJ1cHRlZCkgeworICAgICAgcmVzID0gZ3N0X2F1ZGlvX2RlY29kZXJfZmluaXNoX2ZyYW1lIChHU1RfQVVESU9fREVDT0RFUiAoZGVjKSwgb3V0YnVmLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzID0gZ3N0X2F1ZGlvX2RlY29kZXJfZmluaXNoX2ZyYW1lIChHU1RfQVVESU9fREVDT0RFUiAoZGVjKSwgTlVMTCwgMSk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWYpOworICAgIH0KKworICAgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgImZsb3c6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJlcykpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK25vdF9uZWdvdGlhdGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlYywgQ09SRSwgTkVHT1RJQVRJT04sIChOVUxMKSwKKyAgICAgICAgKCJkZWNvZGVyIG5vdCBpbml0aWFsaXplZCIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCittZW1jbXBfYnVmZmVycyAoR3N0QnVmZmVyICogYnVmMSwgR3N0QnVmZmVyICogYnVmMikKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdzaXplIHNpemUxLCBzaXplMjsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHNpemUxID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmMSk7CisgIHNpemUyID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmMik7CisKKyAgaWYgKHNpemUxICE9IHNpemUyKQorICAgIHJldHVybiBGQUxTRTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmMSwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gZ3N0X2J1ZmZlcl9tZW1jbXAgKGJ1ZjIsIDAsIG1hcC5kYXRhLCBtYXAuc2l6ZSkgPT0gMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmMSwgJm1hcCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9zcGVleF9kZWNfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0RlY29kZXIgKiBiZGVjLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzOworICBHc3RTcGVleERlYyAqZGVjOworCisgIC8qIG5vIGZhbmN5IGRyYWluaW5nICovCisgIGlmIChHX1VOTElLRUxZICghYnVmKSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgZGVjID0gR1NUX1NQRUVYX0RFQyAoYmRlYyk7CisKKyAgLyogSWYgd2UgaGF2ZSB0aGUgc3RyZWFtaGVhZGVyIGFuZCB2b3JiaXNjb21tZW50IGZyb20gdGhlIGNhcHMgYWxyZWFkeQorICAgKiBpZ25vcmUgdGhlbSBoZXJlICovCisgIGlmIChkZWMtPnN0cmVhbWhlYWRlciAmJiBkZWMtPnZvcmJpc2NvbW1lbnQpIHsKKyAgICBpZiAobWVtY21wX2J1ZmZlcnMgKGRlYy0+c3RyZWFtaGVhZGVyLCBidWYpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZWMsICJmb3VuZCBzdHJlYW1oZWFkZXIiKTsKKyAgICAgIGdzdF9hdWRpb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoYmRlYywgTlVMTCwgMSk7CisgICAgICByZXMgPSBHU1RfRkxPV19PSzsKKyAgICB9IGVsc2UgaWYgKG1lbWNtcF9idWZmZXJzIChkZWMtPnZvcmJpc2NvbW1lbnQsIGJ1ZikpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgImZvdW5kIHZvcmJpc2NvbW1lbnRzIik7CisgICAgICBnc3RfYXVkaW9fZGVjb2Rlcl9maW5pc2hfZnJhbWUgKGJkZWMsIE5VTEwsIDEpOworICAgICAgcmVzID0gR1NUX0ZMT1dfT0s7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlcyA9IGdzdF9zcGVleF9kZWNfcGFyc2VfZGF0YSAoZGVjLCBidWYpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBPdGhlcndpc2UgZmFsbCBiYWNrIHRvIHBhY2tldCBjb3VudGluZyBhbmQgYXNzdW1lIHRoYXQgdGhlCisgICAgICogZmlyc3QgdHdvIHBhY2tldHMgYXJlIHRoZSBoZWFkZXJzLiAqLworICAgIHN3aXRjaCAoZGVjLT5wYWNrZXRubykgeworICAgICAgY2FzZSAwOgorICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZWMsICJjb3VudGVkIHN0cmVhbWhlYWRlciIpOworICAgICAgICByZXMgPSBnc3Rfc3BlZXhfZGVjX3BhcnNlX2hlYWRlciAoZGVjLCBidWYpOworICAgICAgICBnc3RfYXVkaW9fZGVjb2Rlcl9maW5pc2hfZnJhbWUgKGJkZWMsIE5VTEwsIDEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVjLCAiY291bnRlZCB2b3JiaXNjb21tZW50cyIpOworICAgICAgICByZXMgPSBnc3Rfc3BlZXhfZGVjX3BhcnNlX2NvbW1lbnRzIChkZWMsIGJ1Zik7CisgICAgICAgIGdzdF9hdWRpb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoYmRlYywgTlVMTCwgMSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgIHsKKyAgICAgICAgcmVzID0gZ3N0X3NwZWV4X2RlY19wYXJzZV9kYXRhIChkZWMsIGJ1Zik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGRlYy0+cGFja2V0bm8rKzsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwZWV4X2RlY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0U3BlZXhEZWMgKnNwZWV4ZGVjOworCisgIHNwZWV4ZGVjID0gR1NUX1NQRUVYX0RFQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIEFSR19FTkg6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc3BlZXhkZWMtPmVuaCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BlZXhfZGVjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTcGVleERlYyAqc3BlZXhkZWM7CisKKyAgc3BlZXhkZWMgPSBHU1RfU1BFRVhfREVDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgQVJHX0VOSDoKKyAgICAgIHNwZWV4ZGVjLT5lbmggPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9leHQvc3BlZXgvZ3N0c3BlZXhkZWMuaCBiL2V4dC9zcGVleC9nc3RzcGVleGRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMWUxNzEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3BlZXgvZ3N0c3BlZXhkZWMuaApAQCAtMCwwICsxLDc2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1NQRUVYX0RFQ19IX18KKyNkZWZpbmUgX19HU1RfU1BFRVhfREVDX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2RlY29kZXIuaD4KKworI2luY2x1ZGUgPHNwZWV4L3NwZWV4Lmg+CisjaW5jbHVkZSA8c3BlZXgvc3BlZXhfY2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8c3BlZXgvc3BlZXhfaGVhZGVyLmg+CisjaW5jbHVkZSA8c3BlZXgvc3BlZXhfc3RlcmVvLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9TUEVFWF9ERUMgXAorICAoZ3N0X3NwZWV4X2RlY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfU1BFRVhfREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfU1BFRVhfREVDLEdzdFNwZWV4RGVjKSkKKyNkZWZpbmUgR1NUX1NQRUVYX0RFQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9TUEVFWF9ERUMsR3N0U3BlZXhEZWNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19TUEVFWF9ERUMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9TUEVFWF9ERUMpKQorI2RlZmluZSBHU1RfSVNfU1BFRVhfREVDX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1NQRUVYX0RFQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RTcGVleERlYyBHc3RTcGVleERlYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RTcGVleERlY0NsYXNzIEdzdFNwZWV4RGVjQ2xhc3M7CisKK3N0cnVjdCBfR3N0U3BlZXhEZWMgeworICBHc3RBdWRpb0RlY29kZXIgICBlbGVtZW50OworCisgIHZvaWQgICAgICAgICAgICAgICAgICAqc3RhdGU7CisgIFNwZWV4U3RlcmVvU3RhdGUgICAgICAqc3RlcmVvOworICBjb25zdCBTcGVleE1vZGUgICAgICAgKm1vZGU7CisgIFNwZWV4SGVhZGVyICAgICAgICAgICAqaGVhZGVyOworICBTcGVleENhbGxiYWNrICAgICAgICAgY2FsbGJhY2s7CisgIFNwZWV4Qml0cyAgICAgICAgICAgICBiaXRzOworCisgIGdib29sZWFuICAgICAgICAgICAgICBlbmg7CisKKyAgZ2ludCAgICAgICAgICAgICAgICAgIGZyYW1lX3NpemU7CisgIEdzdENsb2NrVGltZSAgICAgICAgICBmcmFtZV9kdXJhdGlvbjsKKyAgZ3VpbnQ2NCAgICAgICAgICAgICAgIHBhY2tldG5vOworCisgIEdzdEJ1ZmZlciAgICAgICAgICAgICAqc3RyZWFtaGVhZGVyOworICBHc3RCdWZmZXIgICAgICAgICAgICAgKnZvcmJpc2NvbW1lbnQ7Cit9OworCitzdHJ1Y3QgX0dzdFNwZWV4RGVjQ2xhc3MgeworICBHc3RBdWRpb0RlY29kZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3Rfc3BlZXhfZGVjX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1NQRUVYX0RFQ19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC9zcGVleC9nc3RzcGVleGVuYy5jIGIvZXh0L3NwZWV4L2dzdHNwZWV4ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2NmFmNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcGVleC9nc3RzcGVleGVuYy5jCkBAIC0wLDAgKzEsODQ0IEBACisvKiBHU3RyZWFtZXIgU3BlZXggRW5jb2RlcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1zcGVleGVuYworICogQHNlZV9hbHNvOiBzcGVleGRlYywgb2dnbXV4CisgKgorICogVGhpcyBlbGVtZW50IGVuY29kZXMgYXVkaW8gYXMgYSBTcGVleCBzdHJlYW0uCisgKiA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LnNwZWV4Lm9yZy8iPlNwZWV4PC91bGluaz4gaXMgYSByb3lhbHR5LWZyZWUKKyAqIGF1ZGlvIGNvZGVjIG1haW50YWluZWQgYnkgdGhlIDx1bGluayB1cmw9Imh0dHA6Ly93d3cueGlwaC5vcmcvIj5YaXBoLm9yZworICogRm91bmRhdGlvbjwvdWxpbms+LgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjIG51bS1idWZmZXJzPTEwMCAhIHNwZWV4ZW5jICEgb2dnbXV4ICEgZmlsZXNpbmsgbG9jYXRpb249YmVlcC5vZ2cKKyAqIF18IEVuY29kZSBhbiBPZ2cvU3BlZXggZmlsZS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3BlZXgvc3BlZXguaD4KKyNpbmNsdWRlIDxzcGVleC9zcGVleF9zdGVyZW8uaD4KKworI2luY2x1ZGUgPGdzdC9nc3R0YWdzZXR0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgImdzdHNwZWV4ZW5jLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHNwZWV4ZW5jX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHNwZWV4ZW5jX2RlYnVnCisKKyNkZWZpbmUgRk9STUFUX1NUUiBHU1RfQVVESU9fTkUoUzE2KQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgRk9STUFUX1NUUiAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgNjAwMCwgNDgwMDAgXSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxOyAiCisgICAgICAgICJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBGT1JNQVRfU1RSICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyA2MDAwLCA0ODAwMCBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDIsICIgImNoYW5uZWwtbWFzayA9IChiaXRtYXNrKSAweDMiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXNwZWV4LCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyA2MDAwLCA0ODAwMCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgMl0iKQorICAgICk7CisKKyNkZWZpbmUgREVGQVVMVF9RVUFMSVRZICAgICAgICAgOC4wCisjZGVmaW5lIERFRkFVTFRfQklUUkFURSAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9NT0RFICAgICAgICAgICAgR1NUX1NQRUVYX0VOQ19NT0RFX0FVVE8KKyNkZWZpbmUgREVGQVVMVF9WQlIgICAgICAgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9BQlIgICAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1ZBRCAgICAgICAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX0RUWCAgICAgICAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX0NPTVBMRVhJVFkgICAgICAzCisjZGVmaW5lIERFRkFVTFRfTkZSQU1FUyAgICAgICAgIDEKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUVVBTElUWSwKKyAgUFJPUF9CSVRSQVRFLAorICBQUk9QX01PREUsCisgIFBST1BfVkJSLAorICBQUk9QX0FCUiwKKyAgUFJPUF9WQUQsCisgIFBST1BfRFRYLAorICBQUk9QX0NPTVBMRVhJVFksCisgIFBST1BfTkZSQU1FUywKKyAgUFJPUF9MQVNUX01FU1NBR0UKK307CisKKyNkZWZpbmUgR1NUX1RZUEVfU1BFRVhfRU5DX01PREUgKGdzdF9zcGVleF9lbmNfbW9kZV9nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3Rfc3BlZXhfZW5jX21vZGVfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBzcGVleF9lbmNfbW9kZV90eXBlID0gMDsKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgc3BlZXhfZW5jX21vZGVzW10gPSB7CisgICAge0dTVF9TUEVFWF9FTkNfTU9ERV9BVVRPLCAiQXV0byIsICJhdXRvIn0sCisgICAge0dTVF9TUEVFWF9FTkNfTU9ERV9VV0IsICJVbHRyYSBXaWRlIEJhbmQiLCAidXdiIn0sCisgICAge0dTVF9TUEVFWF9FTkNfTU9ERV9XQiwgIldpZGUgQmFuZCIsICJ3YiJ9LAorICAgIHtHU1RfU1BFRVhfRU5DX01PREVfTkIsICJOYXJyb3cgQmFuZCIsICJuYiJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKyAgaWYgKEdfVU5MSUtFTFkgKHNwZWV4X2VuY19tb2RlX3R5cGUgPT0gMCkpIHsKKyAgICBzcGVleF9lbmNfbW9kZV90eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFNwZWV4RW5jTW9kZSIsCisgICAgICAgIHNwZWV4X2VuY19tb2Rlcyk7CisgIH0KKyAgcmV0dXJuIHNwZWV4X2VuY19tb2RlX3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkIGdzdF9zcGVleF9lbmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NwZWV4X2VuY19zZXR1cCAoR3N0U3BlZXhFbmMgKiBlbmMpOworCitzdGF0aWMgdm9pZCBnc3Rfc3BlZXhfZW5jX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9zcGVleF9lbmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc3BlZXhfZW5jX2VuY29kZSAoR3N0U3BlZXhFbmMgKiBlbmMsIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc3BlZXhfZW5jX3N0YXJ0IChHc3RBdWRpb0VuY29kZXIgKiBlbmMpOworc3RhdGljIGdib29sZWFuIGdzdF9zcGVleF9lbmNfc3RvcCAoR3N0QXVkaW9FbmNvZGVyICogZW5jKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc3BlZXhfZW5jX3NldF9mb3JtYXQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywKKyAgICBHc3RBdWRpb0luZm8gKiBpbmZvKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9zcGVleF9lbmNfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0VuY29kZXIgKiBlbmMsCisgICAgR3N0QnVmZmVyICogaW5fYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc3BlZXhfZW5jX3NpbmtfZXZlbnQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworI2RlZmluZSBnc3Rfc3BlZXhfZW5jX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RTcGVleEVuYywgZ3N0X3NwZWV4X2VuYywgR1NUX1RZUEVfQVVESU9fRU5DT0RFUiwKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1RBR19TRVRURVIsIE5VTEwpOworICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfUFJFU0VULCBOVUxMKSk7CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BlZXhfZW5jX2NsYXNzX2luaXQgKEdzdFNwZWV4RW5jQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEF1ZGlvRW5jb2RlckNsYXNzICpiYXNlX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgYmFzZV9jbGFzcyA9IChHc3RBdWRpb0VuY29kZXJDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9zcGVleF9lbmNfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9zcGVleF9lbmNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfc3BlZXhfZW5jX2dldF9wcm9wZXJ0eTsKKworICBiYXNlX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BlZXhfZW5jX3N0YXJ0KTsKKyAgYmFzZV9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BlZXhfZW5jX3N0b3ApOworICBiYXNlX2NsYXNzLT5zZXRfZm9ybWF0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zcGVleF9lbmNfc2V0X2Zvcm1hdCk7CisgIGJhc2VfY2xhc3MtPmhhbmRsZV9mcmFtZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BlZXhfZW5jX2hhbmRsZV9mcmFtZSk7CisgIGJhc2VfY2xhc3MtPnNpbmtfZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NwZWV4X2VuY19zaW5rX2V2ZW50KTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1FVQUxJVFksCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJxdWFsaXR5IiwgIlF1YWxpdHkiLCAiRW5jb2RpbmcgcXVhbGl0eSIsCisgICAgICAgICAgMC4wLCAxMC4wLCBERUZBVUxUX1FVQUxJVFksCisgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9CSVRSQVRFLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImJpdHJhdGUiLCAiRW5jb2RpbmcgQml0LXJhdGUiLAorICAgICAgICAgICJTcGVjaWZ5IGFuIGVuY29kaW5nIGJpdC1yYXRlIChpbiBicHMpLiAoMCA9IGF1dG9tYXRpYykiLAorICAgICAgICAgIDAsIEdfTUFYSU5ULCBERUZBVUxUX0JJVFJBVEUsCisgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJtb2RlIiwgIk1vZGUiLCAiVGhlIGVuY29kaW5nIG1vZGUiLAorICAgICAgICAgIEdTVF9UWVBFX1NQRUVYX0VOQ19NT0RFLCBHU1RfU1BFRVhfRU5DX01PREVfQVVUTywKKyAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1ZCUiwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgidmJyIiwgIlZCUiIsCisgICAgICAgICAgIkVuYWJsZSB2YXJpYWJsZSBiaXQtcmF0ZSIsIERFRkFVTFRfVkJSLAorICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQUJSLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImFiciIsICJBQlIiLAorICAgICAgICAgICJFbmFibGUgYXZlcmFnZSBiaXQtcmF0ZSAoMCA9IGRpc2FibGVkKSIsCisgICAgICAgICAgMCwgR19NQVhJTlQsIERFRkFVTFRfQUJSLAorICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfVkFELAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJ2YWQiLCAiVkFEIiwKKyAgICAgICAgICAiRW5hYmxlIHZvaWNlIGFjdGl2aXR5IGRldGVjdGlvbiIsIERFRkFVTFRfVkFELAorICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfRFRYLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJkdHgiLCAiRFRYIiwKKyAgICAgICAgICAiRW5hYmxlIGRpc2NvbnRpbnVvdXMgdHJhbnNtaXNzaW9uIiwgREVGQVVMVF9EVFgsCisgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9DT01QTEVYSVRZLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImNvbXBsZXhpdHkiLCAiQ29tcGxleGl0eSIsCisgICAgICAgICAgIlNldCBlbmNvZGluZyBjb21wbGV4aXR5IiwKKyAgICAgICAgICAwLCBHX01BWElOVCwgREVGQVVMVF9DT01QTEVYSVRZLAorICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfTkZSQU1FUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJuZnJhbWVzIiwgIk5GcmFtZXMiLAorICAgICAgICAgICJOdW1iZXIgb2YgZnJhbWVzIHBlciBidWZmZXIiLAorICAgICAgICAgIDAsIEdfTUFYSU5ULCBERUZBVUxUX05GUkFNRVMsCisgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9MQVNUX01FU1NBR0UsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibGFzdC1tZXNzYWdlIiwgImxhc3QtbWVzc2FnZSIsCisgICAgICAgICAgIlRoZSBsYXN0IHN0YXR1cyBtZXNzYWdlIiwgTlVMTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiU3BlZXggYXVkaW8gZW5jb2RlciIsICJDb2RlYy9FbmNvZGVyL0F1ZGlvIiwKKyAgICAgICJFbmNvZGVzIGF1ZGlvIGluIFNwZWV4IGZvcm1hdCIsICJXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPiIpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChzcGVleGVuY19kZWJ1ZywgInNwZWV4ZW5jIiwgMCwgIlNwZWV4IGVuY29kZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGVleF9lbmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFNwZWV4RW5jICplbmM7CisKKyAgZW5jID0gR1NUX1NQRUVYX0VOQyAob2JqZWN0KTsKKworICBnX2ZyZWUgKGVuYy0+bGFzdF9tZXNzYWdlKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BlZXhfZW5jX2luaXQgKEdzdFNwZWV4RW5jICogZW5jKQoreworICBHc3RBdWRpb0VuY29kZXIgKmJlbmMgPSBHU1RfQVVESU9fRU5DT0RFUiAoZW5jKTsKKworICAvKiBhcnJhbmdlIGdyYW51bGVwb3MgbWFya2luZyAoYW5kIHJlcXVpcmVkIHBlcmZlY3QgdHMpICovCisgIGdzdF9hdWRpb19lbmNvZGVyX3NldF9tYXJrX2dyYW51bGUgKGJlbmMsIFRSVUUpOworICBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfcGVyZmVjdF90aW1lc3RhbXAgKGJlbmMsIFRSVUUpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9BVURJT19FTkNPREVSX1NJTktfUEFEIChlbmMpKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BlZXhfZW5jX3N0YXJ0IChHc3RBdWRpb0VuY29kZXIgKiBiZW5jKQoreworICBHc3RTcGVleEVuYyAqZW5jID0gR1NUX1NQRUVYX0VOQyAoYmVuYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAic3RhcnQiKTsKKyAgc3BlZXhfYml0c19pbml0ICgmZW5jLT5iaXRzKTsKKyAgZW5jLT50YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZW5jLT5oZWFkZXJfc2VudCA9IEZBTFNFOworICBlbmMtPmVuY29kZWRfc2FtcGxlcyA9IDA7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NwZWV4X2VuY19zdG9wIChHc3RBdWRpb0VuY29kZXIgKiBiZW5jKQoreworICBHc3RTcGVleEVuYyAqZW5jID0gR1NUX1NQRUVYX0VOQyAoYmVuYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAic3RvcCIpOworICBlbmMtPmhlYWRlcl9zZW50ID0gRkFMU0U7CisgIGlmIChlbmMtPnN0YXRlKSB7CisgICAgc3BlZXhfZW5jb2Rlcl9kZXN0cm95IChlbmMtPnN0YXRlKTsKKyAgICBlbmMtPnN0YXRlID0gTlVMTDsKKyAgfQorICBzcGVleF9iaXRzX2Rlc3Ryb3kgKCZlbmMtPmJpdHMpOworICBzcGVleF9iaXRzX3NldF9iaXRfYnVmZmVyICgmZW5jLT5iaXRzLCBOVUxMLCAwKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmIChlbmMtPnRhZ3MpOworICBlbmMtPnRhZ3MgPSBOVUxMOworCisgIGdzdF90YWdfc2V0dGVyX3Jlc2V0X3RhZ3MgKEdTVF9UQUdfU0VUVEVSIChlbmMpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdpbnQ2NAorZ3N0X3NwZWV4X2VuY19nZXRfbGF0ZW5jeSAoR3N0U3BlZXhFbmMgKiBlbmMpCit7CisgIC8qIFNlZSB0aGUgU3BlZXggbWFudWFsIHNlY3Rpb24gIkxhdGVuY3kgYW5kIGFsZ29yaXRobWljIGRlbGF5IiAqLworICBpZiAoZW5jLT5yYXRlID09IDgwMDApCisgICAgcmV0dXJuIDMwICogR1NUX01TRUNPTkQ7CisgIGVsc2UKKyAgICByZXR1cm4gMzQgKiBHU1RfTVNFQ09ORDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BlZXhfZW5jX3NldF9mb3JtYXQgKEdzdEF1ZGlvRW5jb2RlciAqIGJlbmMsIEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIEdzdFNwZWV4RW5jICplbmM7CisKKyAgZW5jID0gR1NUX1NQRUVYX0VOQyAoYmVuYyk7CisKKyAgZW5jLT5jaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChpbmZvKTsKKyAgZW5jLT5yYXRlID0gR1NUX0FVRElPX0lORk9fUkFURSAoaW5mbyk7CisKKyAgLyogaGFuZGxlIHJlY29uZmlndXJlICovCisgIGlmIChlbmMtPnN0YXRlKSB7CisgICAgc3BlZXhfZW5jb2Rlcl9kZXN0cm95IChlbmMtPnN0YXRlKTsKKyAgICBlbmMtPnN0YXRlID0gTlVMTDsKKyAgfQorCisgIGlmICghZ3N0X3NwZWV4X2VuY19zZXR1cCAoZW5jKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogZmVlZGJhY2sgdG8gYmFzZSBjbGFzcyAqLworICBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfbGF0ZW5jeSAoYmVuYywKKyAgICAgIGdzdF9zcGVleF9lbmNfZ2V0X2xhdGVuY3kgKGVuYyksIGdzdF9zcGVleF9lbmNfZ2V0X2xhdGVuY3kgKGVuYykpOworICBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfbG9va2FoZWFkIChiZW5jLCBlbmMtPmxvb2thaGVhZCk7CisKKyAgaWYgKGVuYy0+bmZyYW1lcyA9PSAwKSB7CisgICAgLyogYXMgbWFueSBmcmFtZXMgYXMgYXZhaWxhYmxlIGlucHV0IGFsbG93cyAqLworICAgIGdzdF9hdWRpb19lbmNvZGVyX3NldF9mcmFtZV9zYW1wbGVzX21pbiAoYmVuYywgZW5jLT5mcmFtZV9zaXplKTsKKyAgICBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfZnJhbWVfc2FtcGxlc19tYXggKGJlbmMsIGVuYy0+ZnJhbWVfc2l6ZSk7CisgICAgZ3N0X2F1ZGlvX2VuY29kZXJfc2V0X2ZyYW1lX21heCAoYmVuYywgMCk7CisgIH0gZWxzZSB7CisgICAgLyogZXhhY3RseSBhcyBtYW55IGZyYW1lcyBhcyBjb25maWd1cmVkICovCisgICAgZ3N0X2F1ZGlvX2VuY29kZXJfc2V0X2ZyYW1lX3NhbXBsZXNfbWluIChiZW5jLAorICAgICAgICBlbmMtPmZyYW1lX3NpemUgKiBlbmMtPm5mcmFtZXMpOworICAgIGdzdF9hdWRpb19lbmNvZGVyX3NldF9mcmFtZV9zYW1wbGVzX21heCAoYmVuYywKKyAgICAgICAgZW5jLT5mcmFtZV9zaXplICogZW5jLT5uZnJhbWVzKTsKKyAgICBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfZnJhbWVfbWF4IChiZW5jLCAxKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9zcGVleF9lbmNfY3JlYXRlX21ldGFkYXRhX2J1ZmZlciAoR3N0U3BlZXhFbmMgKiBlbmMpCit7CisgIGNvbnN0IEdzdFRhZ0xpc3QgKnVzZXJfdGFnczsKKyAgR3N0VGFnTGlzdCAqbWVyZ2VkX3RhZ3M7CisgIEdzdEJ1ZmZlciAqY29tbWVudHMgPSBOVUxMOworCisgIHVzZXJfdGFncyA9IGdzdF90YWdfc2V0dGVyX2dldF90YWdfbGlzdCAoR1NUX1RBR19TRVRURVIgKGVuYykpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgInVwc3RyZWFtIHRhZ3MgPSAlIiBHU1RfUFRSX0ZPUk1BVCwgZW5jLT50YWdzKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAidXNlci1zZXQgdGFncyA9ICUiIEdTVF9QVFJfRk9STUFULCB1c2VyX3RhZ3MpOworCisgIC8qIGdzdF90YWdfbGlzdF9tZXJnZSgpIHdpbGwgaGFuZGxlIE5VTEwgZm9yIGVpdGhlciBvciBib3RoIGxpc3RzIGZpbmUgKi8KKyAgbWVyZ2VkX3RhZ3MgPSBnc3RfdGFnX2xpc3RfbWVyZ2UgKHVzZXJfdGFncywgZW5jLT50YWdzLAorICAgICAgZ3N0X3RhZ19zZXR0ZXJfZ2V0X3RhZ19tZXJnZV9tb2RlIChHU1RfVEFHX1NFVFRFUiAoZW5jKSkpOworCisgIGlmIChtZXJnZWRfdGFncyA9PSBOVUxMKQorICAgIG1lcmdlZF90YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJtZXJnZWQgICB0YWdzID0gJSIgR1NUX1BUUl9GT1JNQVQsIG1lcmdlZF90YWdzKTsKKyAgY29tbWVudHMgPSBnc3RfdGFnX2xpc3RfdG9fdm9yYmlzY29tbWVudF9idWZmZXIgKG1lcmdlZF90YWdzLCBOVUxMLAorICAgICAgMCwgIkVuY29kZWQgd2l0aCBHU3RyZWFtZXIgU3BlZXhlbmMiKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmIChtZXJnZWRfdGFncyk7CisKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGNvbW1lbnRzKSA9IDA7CisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoY29tbWVudHMpID0gMDsKKworICByZXR1cm4gY29tbWVudHM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BlZXhfZW5jX3NldF9sYXN0X21zZyAoR3N0U3BlZXhFbmMgKiBlbmMsIGNvbnN0IGdjaGFyICogbXNnKQoreworICBnX2ZyZWUgKGVuYy0+bGFzdF9tZXNzYWdlKTsKKyAgZW5jLT5sYXN0X21lc3NhZ2UgPSBnX3N0cmR1cCAobXNnKTsKKyAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmMsICIlcyIsIG1zZyk7CisgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKGVuYyksICJsYXN0LW1lc3NhZ2UiKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BlZXhfZW5jX3NldHVwIChHc3RTcGVleEVuYyAqIGVuYykKK3sKKyAgc3dpdGNoIChlbmMtPm1vZGUpIHsKKyAgICBjYXNlIEdTVF9TUEVFWF9FTkNfTU9ERV9VV0I6CisgICAgICBHU1RfTE9HX09CSkVDVCAoZW5jLCAiY29uZmlndXJpbmcgZm9yIHJlcXVlc3RlZCBVV0IgbW9kZSIpOworICAgICAgZW5jLT5zcGVleF9tb2RlID0gc3BlZXhfbGliX2dldF9tb2RlIChTUEVFWF9NT0RFSURfVVdCKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NQRUVYX0VOQ19NT0RFX1dCOgorICAgICAgR1NUX0xPR19PQkpFQ1QgKGVuYywgImNvbmZpZ3VyaW5nIGZvciByZXF1ZXN0ZWQgV0IgbW9kZSIpOworICAgICAgZW5jLT5zcGVleF9tb2RlID0gc3BlZXhfbGliX2dldF9tb2RlIChTUEVFWF9NT0RFSURfV0IpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1BFRVhfRU5DX01PREVfTkI6CisgICAgICBHU1RfTE9HX09CSkVDVCAoZW5jLCAiY29uZmlndXJpbmcgZm9yIHJlcXVlc3RlZCBOQiBtb2RlIik7CisgICAgICBlbmMtPnNwZWV4X21vZGUgPSBzcGVleF9saWJfZ2V0X21vZGUgKFNQRUVYX01PREVJRF9OQik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TUEVFWF9FTkNfTU9ERV9BVVRPOgorICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICBHU1RfTE9HX09CSkVDVCAoZW5jLCAiZmluZGluZyBiZXN0IG1vZGUiKTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoZW5jLT5yYXRlID4gMjUwMDApIHsKKyAgICBpZiAoZW5jLT5tb2RlID09IEdTVF9TUEVFWF9FTkNfTU9ERV9BVVRPKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZW5jLCAic2VsZWN0ZWQgVVdCIG1vZGUgZm9yIHNhbXBsZXJhdGUgJWQiLCBlbmMtPnJhdGUpOworICAgICAgZW5jLT5zcGVleF9tb2RlID0gc3BlZXhfbGliX2dldF9tb2RlIChTUEVFWF9NT0RFSURfVVdCKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGVuYy0+c3BlZXhfbW9kZSAhPSBzcGVleF9saWJfZ2V0X21vZGUgKFNQRUVYX01PREVJRF9VV0IpKSB7CisgICAgICAgIGdzdF9zcGVleF9lbmNfc2V0X2xhc3RfbXNnIChlbmMsCisgICAgICAgICAgICAiV2FybmluZzogc3VnZ2VzdCB0byB1c2UgdWx0cmEgd2lkZSBiYW5kIG1vZGUgZm9yIHRoaXMgcmF0ZSIpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmIChlbmMtPnJhdGUgPiAxMjUwMCkgeworICAgIGlmIChlbmMtPm1vZGUgPT0gR1NUX1NQRUVYX0VOQ19NT0RFX0FVVE8pIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChlbmMsICJzZWxlY3RlZCBXQiBtb2RlIGZvciBzYW1wbGVyYXRlICVkIiwgZW5jLT5yYXRlKTsKKyAgICAgIGVuYy0+c3BlZXhfbW9kZSA9IHNwZWV4X2xpYl9nZXRfbW9kZSAoU1BFRVhfTU9ERUlEX1dCKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGVuYy0+c3BlZXhfbW9kZSAhPSBzcGVleF9saWJfZ2V0X21vZGUgKFNQRUVYX01PREVJRF9XQikpIHsKKyAgICAgICAgZ3N0X3NwZWV4X2VuY19zZXRfbGFzdF9tc2cgKGVuYywKKyAgICAgICAgICAgICJXYXJuaW5nOiBzdWdnZXN0IHRvIHVzZSB3aWRlIGJhbmQgbW9kZSBmb3IgdGhpcyByYXRlIik7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChlbmMtPm1vZGUgPT0gR1NUX1NQRUVYX0VOQ19NT0RFX0FVVE8pIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChlbmMsICJzZWxlY3RlZCBOQiBtb2RlIGZvciBzYW1wbGVyYXRlICVkIiwgZW5jLT5yYXRlKTsKKyAgICAgIGVuYy0+c3BlZXhfbW9kZSA9IHNwZWV4X2xpYl9nZXRfbW9kZSAoU1BFRVhfTU9ERUlEX05CKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGVuYy0+c3BlZXhfbW9kZSAhPSBzcGVleF9saWJfZ2V0X21vZGUgKFNQRUVYX01PREVJRF9OQikpIHsKKyAgICAgICAgZ3N0X3NwZWV4X2VuY19zZXRfbGFzdF9tc2cgKGVuYywKKyAgICAgICAgICAgICJXYXJuaW5nOiBzdWdnZXN0IHRvIHVzZSBuYXJyb3cgYmFuZCBtb2RlIGZvciB0aGlzIHJhdGUiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoZW5jLT5yYXRlICE9IDgwMDAgJiYgZW5jLT5yYXRlICE9IDE2MDAwICYmIGVuYy0+cmF0ZSAhPSAzMjAwMCkgeworICAgIGdzdF9zcGVleF9lbmNfc2V0X2xhc3RfbXNnIChlbmMsCisgICAgICAgICJXYXJuaW5nOiBzcGVleCBpcyBvcHRpbWl6ZWQgZm9yIDgsIDE2IGFuZCAzMiBLSHoiKTsKKyAgfQorCisgIHNwZWV4X2luaXRfaGVhZGVyICgmZW5jLT5oZWFkZXIsIGVuYy0+cmF0ZSwgMSwgZW5jLT5zcGVleF9tb2RlKTsKKyAgZW5jLT5oZWFkZXIuZnJhbWVzX3Blcl9wYWNrZXQgPSBlbmMtPm5mcmFtZXM7CisgIGVuYy0+aGVhZGVyLnZiciA9IGVuYy0+dmJyOworICBlbmMtPmhlYWRlci5uYl9jaGFubmVscyA9IGVuYy0+Y2hhbm5lbHM7CisKKyAgLypJbml0aWFsaXplIFNwZWV4IGVuY29kZXIgKi8KKyAgZW5jLT5zdGF0ZSA9IHNwZWV4X2VuY29kZXJfaW5pdCAoZW5jLT5zcGVleF9tb2RlKTsKKworICBzcGVleF9lbmNvZGVyX2N0bCAoZW5jLT5zdGF0ZSwgU1BFRVhfR0VUX0ZSQU1FX1NJWkUsICZlbmMtPmZyYW1lX3NpemUpOworICBzcGVleF9lbmNvZGVyX2N0bCAoZW5jLT5zdGF0ZSwgU1BFRVhfU0VUX0NPTVBMRVhJVFksICZlbmMtPmNvbXBsZXhpdHkpOworICBzcGVleF9lbmNvZGVyX2N0bCAoZW5jLT5zdGF0ZSwgU1BFRVhfU0VUX1NBTVBMSU5HX1JBVEUsICZlbmMtPnJhdGUpOworCisgIGlmIChlbmMtPnZicikKKyAgICBzcGVleF9lbmNvZGVyX2N0bCAoZW5jLT5zdGF0ZSwgU1BFRVhfU0VUX1ZCUl9RVUFMSVRZLCAmZW5jLT5xdWFsaXR5KTsKKyAgZWxzZSB7CisgICAgZ2ludCB0bXAgPSBmbG9vciAoZW5jLT5xdWFsaXR5KTsKKworICAgIHNwZWV4X2VuY29kZXJfY3RsIChlbmMtPnN0YXRlLCBTUEVFWF9TRVRfUVVBTElUWSwgJnRtcCk7CisgIH0KKyAgaWYgKGVuYy0+Yml0cmF0ZSkgeworICAgIGlmIChlbmMtPnF1YWxpdHkgPj0gMC4wICYmIGVuYy0+dmJyKSB7CisgICAgICBnc3Rfc3BlZXhfZW5jX3NldF9sYXN0X21zZyAoZW5jLAorICAgICAgICAgICJXYXJuaW5nOiBiaXRyYXRlIG9wdGlvbiBpcyBvdmVycmlkaW5nIHF1YWxpdHkiKTsKKyAgICB9CisgICAgc3BlZXhfZW5jb2Rlcl9jdGwgKGVuYy0+c3RhdGUsIFNQRUVYX1NFVF9CSVRSQVRFLCAmZW5jLT5iaXRyYXRlKTsKKyAgfQorICBpZiAoZW5jLT52YnIpIHsKKyAgICBnaW50IHRtcCA9IDE7CisKKyAgICBzcGVleF9lbmNvZGVyX2N0bCAoZW5jLT5zdGF0ZSwgU1BFRVhfU0VUX1ZCUiwgJnRtcCk7CisgIH0gZWxzZSBpZiAoZW5jLT52YWQpIHsKKyAgICBnaW50IHRtcCA9IDE7CisKKyAgICBzcGVleF9lbmNvZGVyX2N0bCAoZW5jLT5zdGF0ZSwgU1BFRVhfU0VUX1ZBRCwgJnRtcCk7CisgIH0KKworICBpZiAoZW5jLT5kdHgpIHsKKyAgICBnaW50IHRtcCA9IDE7CisKKyAgICBzcGVleF9lbmNvZGVyX2N0bCAoZW5jLT5zdGF0ZSwgU1BFRVhfU0VUX0RUWCwgJnRtcCk7CisgIH0KKworICBpZiAoZW5jLT5kdHggJiYgIShlbmMtPnZiciB8fCBlbmMtPmFiciB8fCBlbmMtPnZhZCkpIHsKKyAgICBnc3Rfc3BlZXhfZW5jX3NldF9sYXN0X21zZyAoZW5jLAorICAgICAgICAiV2FybmluZzogZHR4IGlzIHVzZWxlc3Mgd2l0aG91dCB2YWQsIHZiciBvciBhYnIiKTsKKyAgfSBlbHNlIGlmICgoZW5jLT52YnIgfHwgZW5jLT5hYnIpICYmIChlbmMtPnZhZCkpIHsKKyAgICBnc3Rfc3BlZXhfZW5jX3NldF9sYXN0X21zZyAoZW5jLAorICAgICAgICAiV2FybmluZzogdmFkIGlzIGFscmVhZHkgaW1wbGllZCBieSB2YnIgb3IgYWJyIik7CisgIH0KKworICBpZiAoZW5jLT5hYnIpIHsKKyAgICBzcGVleF9lbmNvZGVyX2N0bCAoZW5jLT5zdGF0ZSwgU1BFRVhfU0VUX0FCUiwgJmVuYy0+YWJyKTsKKyAgfQorCisgIHNwZWV4X2VuY29kZXJfY3RsIChlbmMtPnN0YXRlLCBTUEVFWF9HRVRfTE9PS0FIRUFELCAmZW5jLT5sb29rYWhlYWQpOworCisgIEdTVF9MT0dfT0JKRUNUIChlbmMsICJ3ZSBoYXZlIGZyYW1lIHNpemUgJWQsIGxvb2thaGVhZCAlZCIsIGVuYy0+ZnJhbWVfc2l6ZSwKKyAgICAgIGVuYy0+bG9va2FoZWFkKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BlZXhfZW5jX3NpbmtfZXZlbnQgKEdzdEF1ZGlvRW5jb2RlciAqIGJlbmMsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFNwZWV4RW5jICplbmM7CisKKyAgZW5jID0gR1NUX1NQRUVYX0VOQyAoYmVuYyk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfVEFHOgorICAgIHsKKyAgICAgIGlmIChlbmMtPnRhZ3MpIHsKKyAgICAgICAgR3N0VGFnTGlzdCAqbGlzdDsKKworICAgICAgICBnc3RfZXZlbnRfcGFyc2VfdGFnIChldmVudCwgJmxpc3QpOworICAgICAgICBnc3RfdGFnX2xpc3RfaW5zZXJ0IChlbmMtPnRhZ3MsIGxpc3QsCisgICAgICAgICAgICBnc3RfdGFnX3NldHRlcl9nZXRfdGFnX21lcmdlX21vZGUgKEdTVF9UQUdfU0VUVEVSIChlbmMpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgICAgZW5jLT5lbmNvZGVkX3NhbXBsZXMgPSAwOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogd2Ugb25seSBwZWVrZWQsIGxldCBiYXNlIGNsYXNzIGhhbmRsZSBpdCAqLworICByZXR1cm4gR1NUX0FVRElPX0VOQ09ERVJfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKGJlbmMsIGV2ZW50KTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9zcGVleF9lbmNfZW5jb2RlIChHc3RTcGVleEVuYyAqIGVuYywgR3N0QnVmZmVyICogYnVmKQoreworICBnaW50IGZyYW1lX3NpemUgPSBlbmMtPmZyYW1lX3NpemU7CisgIGdpbnQgYnl0ZXMgPSBmcmFtZV9zaXplICogMiAqIGVuYy0+Y2hhbm5lbHMsIHNhbXBsZXM7CisgIGdpbnQgb3V0c2l6ZSwgd3JpdHRlbiwgZHR4X3JldCA9IDA7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmRhdGEsICpkYXRhMCA9IE5VTEwsICpiZGF0YTsKKyAgZ3NpemUgYnNpemUsIHNpemU7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RTZWdtZW50ICpzZWdtZW50OworICBHc3RDbG9ja1RpbWUgZHVyYXRpb247CisKKyAgaWYgKEdfTElLRUxZIChidWYpKSB7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBiZGF0YSA9IG1hcC5kYXRhOworICAgIGJzaXplID0gbWFwLnNpemU7CisKKyAgICBpZiAoR19VTkxJS0VMWSAoYnNpemUgJSBieXRlcykpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgImRyYWluaW5nOyBhZGRpbmcgc2lsZW5jZSBzYW1wbGVzIik7CisKKyAgICAgIC8qIElmIGVuY29kaW5nIHBhcnQgb2YgYSBmcmFtZSwgYW5kIHdlIGhhdmUgbm8gc2V0IHN0b3AgdGltZSBvbgorICAgICAgICogdGhlIG91dHB1dCBzZWdtZW50LCB3ZSB1cGRhdGUgdGhlIHNlZ21lbnQgc3RvcCB0aW1lIHRvIHJlZmxlY3QKKyAgICAgICAqIHRoZSBsYXN0IHNhbXBsZS4gVGhpcyB3aWxsIGxldCBvZ2dtdXggc2V0IHRoZSBsYXN0IHBhZ2UncworICAgICAgICogZ3JhbnBvcyB0byB0ZWxsIGEgZGVjb2RlciB0aGUgZHVtbXkgc2FtcGxlcyBzaG91bGQgYmUgY2xpcHBlZC4KKyAgICAgICAqLworICAgICAgc2VnbWVudCA9ICZHU1RfQVVESU9fRU5DT0RFUl9PVVRQVVRfU0VHTUVOVCAoZW5jKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgImV4aXN0aW5nIG91dHB1dCBzZWdtZW50ICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwKKyAgICAgICAgICBzZWdtZW50KTsKKyAgICAgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHNlZ21lbnQtPnN0b3ApKSB7CisgICAgICAgIGludCBpbnB1dF9zYW1wbGVzID0gYnNpemUgLyAoZW5jLT5jaGFubmVscyAqIDIpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsCisgICAgICAgICAgICAiTm8gc3RvcCB0aW1lIGFuZCBwYXJ0aWFsIGZyYW1lLCB1cGRhdGluZyBzZWdtZW50Iik7CisgICAgICAgIGR1cmF0aW9uID0KKyAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoZW5jLT5lbmNvZGVkX3NhbXBsZXMgKyBpbnB1dF9zYW1wbGVzLAorICAgICAgICAgICAgR1NUX1NFQ09ORCwgZW5jLT5yYXRlKTsKKyAgICAgICAgc2VnbWVudC0+c3RvcCA9IHNlZ21lbnQtPnN0YXJ0ICsgZHVyYXRpb247CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgIm5ldyBvdXRwdXQgc2VnbWVudCAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsCisgICAgICAgICAgICBzZWdtZW50KTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChHU1RfQVVESU9fRU5DT0RFUl9TUkNfUEFEIChlbmMpLAorICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19zZWdtZW50IChzZWdtZW50KSk7CisgICAgICB9CisKKyAgICAgIHNpemUgPSAoKGJzaXplIC8gYnl0ZXMpICsgMSkgKiBieXRlczsKKyAgICAgIGRhdGEwID0gZGF0YSA9IGdfbWFsbG9jMCAoc2l6ZSk7CisgICAgICBtZW1jcHkgKGRhdGEsIGJkYXRhLCBic2l6ZSk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgICAgYmRhdGEgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICBkYXRhID0gYmRhdGE7CisgICAgICBzaXplID0gYnNpemU7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgIm5vdGhpbmcgdG8gZHJhaW4iKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBzYW1wbGVzID0gc2l6ZSAvICgyICogZW5jLT5jaGFubmVscyk7CisgIHNwZWV4X2JpdHNfcmVzZXQgKCZlbmMtPmJpdHMpOworCisgIC8qIEZJWE1FIHdoYXQgYWJvdXQgZHJvcHBlZCBzYW1wbGVzIGlmIERUUyBlbmFibGVkID8/ICovCisKKyAgd2hpbGUgKHNpemUpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJlbmNvZGluZyAlZCBzYW1wbGVzICglZCBieXRlcykiLCBmcmFtZV9zaXplLCBieXRlcyk7CisKKyAgICBpZiAoZW5jLT5jaGFubmVscyA9PSAyKSB7CisgICAgICBzcGVleF9lbmNvZGVfc3RlcmVvX2ludCAoKGdpbnQxNiAqKSBkYXRhLCBmcmFtZV9zaXplLCAmZW5jLT5iaXRzKTsKKyAgICB9CisgICAgZHR4X3JldCArPSBzcGVleF9lbmNvZGVfaW50IChlbmMtPnN0YXRlLCAoZ2ludDE2ICopIGRhdGEsICZlbmMtPmJpdHMpOworCisgICAgZGF0YSArPSBieXRlczsKKyAgICBzaXplIC09IGJ5dGVzOworICB9CisKKyAgc3BlZXhfYml0c19pbnNlcnRfdGVybWluYXRvciAoJmVuYy0+Yml0cyk7CisgIG91dHNpemUgPSBzcGVleF9iaXRzX25ieXRlcyAoJmVuYy0+Yml0cyk7CisKKyAgaWYgKGJkYXRhKQorICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyNpZiAwCisgIHJldCA9IGdzdF9wYWRfYWxsb2NfYnVmZmVyX2FuZF9zZXRfY2FwcyAoR1NUX0FVRElPX0VOQ09ERVJfU1JDX1BBRCAoZW5jKSwKKyAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUX05PTkUsIG91dHNpemUsCisgICAgICBHU1RfUEFEX0NBUFMgKEdTVF9BVURJT19FTkNPREVSX1NSQ19QQUQgKGVuYykpLCAmb3V0YnVmKTsKKworICBpZiAoKEdTVF9GTE9XX09LICE9IHJldCkpCisgICAgZ290byBkb25lOworI2VuZGlmCisgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBvdXRzaXplLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisKKyAgd3JpdHRlbiA9IHNwZWV4X2JpdHNfd3JpdGUgKCZlbmMtPmJpdHMsIChnY2hhciAqKSBtYXAuZGF0YSwgb3V0c2l6ZSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHdyaXR0ZW4gPCBvdXRzaXplKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGVuYywgInNob3J0IHdyaXRlOiAlZCA8ICVkIGJ5dGVzIiwgd3JpdHRlbiwgb3V0c2l6ZSk7CisgIH0gZWxzZSBpZiAoR19VTkxJS0VMWSAod3JpdHRlbiA+IG91dHNpemUpKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZW5jLCAib3ZlcnJ1bjogJWQgPiAlZCBieXRlcyIsIHdyaXR0ZW4sIG91dHNpemUpOworICAgIHdyaXR0ZW4gPSBvdXRzaXplOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfcmVzaXplIChvdXRidWYsIDAsIHdyaXR0ZW4pOworCisgIGlmICghZHR4X3JldCkKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19HQVApOworCisgIHJldCA9IGdzdF9hdWRpb19lbmNvZGVyX2ZpbmlzaF9mcmFtZSAoR1NUX0FVRElPX0VOQ09ERVIgKGVuYyksCisgICAgICBvdXRidWYsIHNhbXBsZXMpOworICBlbmMtPmVuY29kZWRfc2FtcGxlcyArPSBmcmFtZV9zaXplOworCitkb25lOgorICBnX2ZyZWUgKGRhdGEwKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIChyZWFsbHkgcmVhbGx5KSBGSVhNRTogbW92ZSBpbnRvIGNvcmUgKGRpeGl0IHRwbSkKKyAqLworLyoKKyAqIF9nc3RfY2Fwc19zZXRfYnVmZmVyX2FycmF5OgorICogQGNhcHM6ICh0cmFuc2ZlciBmdWxsKTogYSAjR3N0Q2FwcworICogQGZpZWxkOiBmaWVsZCBpbiBjYXBzIHRvIHNldAorICogQGJ1ZjogaGVhZGVyIGJ1ZmZlcnMKKyAqCisgKiBBZGRzIGdpdmVuIGJ1ZmZlcnMgdG8gYW4gYXJyYXkgb2YgYnVmZmVycyBzZXQgYXMgdGhlIGdpdmVuIEBmaWVsZAorICogb24gdGhlIGdpdmVuIEBjYXBzLiAgTGlzdCBvZiBidWZmZXIgYXJndW1lbnRzIG11c3QgYmUgTlVMTC10ZXJtaW5hdGVkLgorICoKKyAqIFJldHVybnM6ICh0cmFuc2ZlciBmdWxsKTogaW5wdXQgY2FwcyB3aXRoIGEgc3RyZWFtaGVhZGVyIGZpZWxkIGFkZGVkLCBvciBOVUxMCisgKiAgICAgaWYgc29tZSBlcnJvciBvY2N1cnJlZAorICovCitzdGF0aWMgR3N0Q2FwcyAqCitfZ3N0X2NhcHNfc2V0X2J1ZmZlcl9hcnJheSAoR3N0Q2FwcyAqIGNhcHMsIGNvbnN0IGdjaGFyICogZmllbGQsCisgICAgR3N0QnVmZmVyICogYnVmLCAuLi4pCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlID0gTlVMTDsKKyAgdmFfbGlzdCB2YTsKKyAgR1ZhbHVlIGFycmF5ID0geyAwIH07CisgIEdWYWx1ZSB2YWx1ZSA9IHsgMCB9OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChjYXBzICE9IE5VTEwsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ3N0X2NhcHNfaXNfZml4ZWQgKGNhcHMpLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGZpZWxkICE9IE5VTEwsIE5VTEwpOworCisgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgZ192YWx1ZV9pbml0ICgmYXJyYXksIEdTVF9UWVBFX0FSUkFZKTsKKworICB2YV9zdGFydCAodmEsIGJ1Zik7CisgIC8qIHB1dCBidWZmZXJzIGluIGEgZml4ZWQgbGlzdCAqLworICB3aGlsZSAoYnVmKSB7CisgICAgZ19hc3NlcnQgKGdzdF9idWZmZXJfaXNfd3JpdGFibGUgKGJ1ZikpOworCisgICAgLyogbWFyayBidWZmZXIgKi8KKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19IRUFERVIpOworCisgICAgZ192YWx1ZV9pbml0ICgmdmFsdWUsIEdTVF9UWVBFX0JVRkZFUik7CisgICAgYnVmID0gZ3N0X2J1ZmZlcl9jb3B5IChidWYpOworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0hFQURFUik7CisgICAgZ3N0X3ZhbHVlX3NldF9idWZmZXIgKCZ2YWx1ZSwgYnVmKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfdmFsdWUgKCZhcnJheSwgJnZhbHVlKTsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmdmFsdWUpOworCisgICAgYnVmID0gdmFfYXJnICh2YSwgR3N0QnVmZmVyICopOworICB9CisgIHZhX2VuZCAodmEpOworCisgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzdHJ1Y3R1cmUsIGZpZWxkLCAmYXJyYXkpOworICBnX3ZhbHVlX3Vuc2V0ICgmYXJyYXkpOworCisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NwZWV4X2VuY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRW5jb2RlciAqIGJlbmMsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0U3BlZXhFbmMgKmVuYzsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICBlbmMgPSBHU1RfU1BFRVhfRU5DIChiZW5jKTsKKworICBpZiAoIWVuYy0+aGVhZGVyX3NlbnQpIHsKKyAgICAvKiBTcGVleCBzdHJlYW1zIGJlZ2luIHdpdGggdHdvIGhlYWRlcnM7IHRoZSBpbml0aWFsIGhlYWRlciAod2l0aAorICAgICAgIG1vc3Qgb2YgdGhlIGNvZGVjIHNldHVwIHBhcmFtZXRlcnMpIHdoaWNoIGlzIG1hbmRhdGVkIGJ5IHRoZSBPZ2cKKyAgICAgICBiaXRzdHJlYW0gc3BlYy4gIFRoZSBzZWNvbmQgaGVhZGVyIGhvbGRzIGFueSBjb21tZW50IGZpZWxkcy4KKyAgICAgICBXZSBtZXJlbHkgbmVlZCB0byBtYWtlIHRoZSBoZWFkZXJzLCB0aGVuIHBhc3MgdGhlbSB0byBsaWJzcGVleCAKKyAgICAgICBvbmUgYXQgYSB0aW1lOyBsaWJzcGVleCBoYW5kbGVzIHRoZSBhZGRpdGlvbmFsIE9nZyBiaXRzdHJlYW0gCisgICAgICAgY29uc3RyYWludHMgKi8KKyAgICBHc3RCdWZmZXIgKmJ1ZjEsICpidWYyOworICAgIEdzdENhcHMgKmNhcHM7CisgICAgZ3VjaGFyICpkYXRhOworICAgIGdpbnQgZGF0YV9sZW47CisgICAgR0xpc3QgKmhlYWRlcnM7CisKKyAgICAvKiBjcmVhdGUgaGVhZGVyIGJ1ZmZlciAqLworICAgIGRhdGEgPSAoZ3VpbnQ4ICopIHNwZWV4X2hlYWRlcl90b19wYWNrZXQgKCZlbmMtPmhlYWRlciwgJmRhdGFfbGVuKTsKKyAgICBidWYxID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZGF0YSwgZGF0YV9sZW4pOworICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmMSkgPSAwOworICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYxKSA9IDA7CisKKyAgICAvKiBjcmVhdGUgY29tbWVudCBidWZmZXIgKi8KKyAgICBidWYyID0gZ3N0X3NwZWV4X2VuY19jcmVhdGVfbWV0YWRhdGFfYnVmZmVyIChlbmMpOworCisgICAgLyogbWFyayBhbmQgcHV0IG9uIGNhcHMgKi8KKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtc3BlZXgiLCAicmF0ZSIsIEdfVFlQRV9JTlQsIGVuYy0+cmF0ZSwKKyAgICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgZW5jLT5jaGFubmVscywgTlVMTCk7CisgICAgY2FwcyA9IF9nc3RfY2Fwc19zZXRfYnVmZmVyX2FycmF5IChjYXBzLCAic3RyZWFtaGVhZGVyIiwgYnVmMSwgYnVmMiwgTlVMTCk7CisKKyAgICAvKiBuZWdvdGlhdGUgd2l0aCB0aGVzZSBjYXBzICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAiaGVyZSBhcmUgdGhlIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICAgIGdzdF9hdWRpb19lbmNvZGVyX3NldF9vdXRwdXRfZm9ybWF0IChHU1RfQVVESU9fRU5DT0RFUiAoZW5jKSwgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgLyogcHVzaCBvdXQgYnVmZmVycyAqLworICAgIC8qIHN0b3JlIGJ1ZmZlcnMgZm9yIGxhdGVyIHByZV9wdXNoIHNlbmRpbmcgKi8KKyAgICBoZWFkZXJzID0gTlVMTDsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJzdG9yaW5nIGhlYWRlciBidWZmZXJzIik7CisgICAgaGVhZGVycyA9IGdfbGlzdF9wcmVwZW5kIChoZWFkZXJzLCBidWYyKTsKKyAgICBoZWFkZXJzID0gZ19saXN0X3ByZXBlbmQgKGhlYWRlcnMsIGJ1ZjEpOworICAgIGdzdF9hdWRpb19lbmNvZGVyX3NldF9oZWFkZXJzIChiZW5jLCBoZWFkZXJzKTsKKworICAgIGVuYy0+aGVhZGVyX3NlbnQgPSBUUlVFOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAicmVjZWl2ZWQgYnVmZmVyICVwIG9mICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMiLCBidWYsCisgICAgICBidWYgPyBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpIDogMCk7CisKKyAgcmV0ID0gZ3N0X3NwZWV4X2VuY19lbmNvZGUgKGVuYywgYnVmKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwZWV4X2VuY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0U3BlZXhFbmMgKmVuYzsKKworICBlbmMgPSBHU1RfU1BFRVhfRU5DIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9RVUFMSVRZOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBlbmMtPnF1YWxpdHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JJVFJBVEU6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBlbmMtPmJpdHJhdGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgZW5jLT5tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9WQlI6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZW5jLT52YnIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FCUjoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGVuYy0+YWJyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9WQUQ6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZW5jLT52YWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RUWDoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBlbmMtPmR0eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ09NUExFWElUWToKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGVuYy0+Y29tcGxleGl0eSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTkZSQU1FUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGVuYy0+bmZyYW1lcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTEFTVF9NRVNTQUdFOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgZW5jLT5sYXN0X21lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwZWV4X2VuY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0U3BlZXhFbmMgKmVuYzsKKworICBlbmMgPSBHU1RfU1BFRVhfRU5DIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9RVUFMSVRZOgorICAgICAgZW5jLT5xdWFsaXR5ID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CSVRSQVRFOgorICAgICAgZW5jLT5iaXRyYXRlID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTU9ERToKKyAgICAgIGVuYy0+bW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9WQlI6CisgICAgICBlbmMtPnZiciA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BQlI6CisgICAgICBlbmMtPmFiciA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1ZBRDoKKyAgICAgIGVuYy0+dmFkID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RUWDoKKyAgICAgIGVuYy0+ZHR4ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NPTVBMRVhJVFk6CisgICAgICBlbmMtPmNvbXBsZXhpdHkgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ORlJBTUVTOgorICAgICAgZW5jLT5uZnJhbWVzID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9leHQvc3BlZXgvZ3N0c3BlZXhlbmMuaCBiL2V4dC9zcGVleC9nc3RzcGVleGVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZmNjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3BlZXgvZ3N0c3BlZXhlbmMuaApAQCAtMCwwICsxLDk4IEBACisvKiBHU3RyZWFtZXIgU3BlZXggRW5jb2RlcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfU1BFRVhfRU5DX0hfXworI2RlZmluZSBfX0dTVF9TUEVFWF9FTkNfSF9fCisKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9lbmNvZGVyLmg+CisKKyNpbmNsdWRlIDxzcGVleC9zcGVleC5oPgorI2luY2x1ZGUgPHNwZWV4L3NwZWV4X2hlYWRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfU1BFRVhfRU5DIFwKKyAgKGdzdF9zcGVleF9lbmNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1NQRUVYX0VOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1NQRUVYX0VOQyxHc3RTcGVleEVuYykpCisjZGVmaW5lIEdTVF9TUEVFWF9FTkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfU1BFRVhfRU5DLEdzdFNwZWV4RW5jQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfU1BFRVhfRU5DKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfU1BFRVhfRU5DKSkKKyNkZWZpbmUgR1NUX0lTX1NQRUVYX0VOQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9TUEVFWF9FTkMpKQorCit0eXBlZGVmIGVudW0KK3sKKyAgR1NUX1NQRUVYX0VOQ19NT0RFX0FVVE8sCisgIEdTVF9TUEVFWF9FTkNfTU9ERV9VV0IsCisgIEdTVF9TUEVFWF9FTkNfTU9ERV9XQiwKKyAgR1NUX1NQRUVYX0VOQ19NT0RFX05CCit9IEdzdFNwZWV4TW9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNwZWV4RW5jIEdzdFNwZWV4RW5jOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNwZWV4RW5jQ2xhc3MgR3N0U3BlZXhFbmNDbGFzczsKKworc3RydWN0IF9Hc3RTcGVleEVuYyB7CisgIEdzdEF1ZGlvRW5jb2RlciAgIGVsZW1lbnQ7CisKKyAgU3BlZXhCaXRzICAgICAgICAgICAgIGJpdHM7CisgIFNwZWV4SGVhZGVyICAgICAgICAgICBoZWFkZXI7CisgIGNvbnN0IFNwZWV4TW9kZSAgICAgICAqc3BlZXhfbW9kZTsKKyAgdm9pZCAgICAgICAgICAgICAgICAgICpzdGF0ZTsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIEdzdFNwZWV4TW9kZSAgICAgICAgICBtb2RlOworICBnZmxvYXQgICAgICAgICAgICAgICAgcXVhbGl0eTsKKyAgZ2ludCAgICAgICAgICAgICAgICAgIGJpdHJhdGU7CisgIGdib29sZWFuICAgICAgICAgICAgICB2YnI7CisgIGdpbnQgICAgICAgICAgICAgICAgICBhYnI7CisgIGdib29sZWFuICAgICAgICAgICAgICB2YWQ7CisgIGdib29sZWFuICAgICAgICAgICAgICBkdHg7CisgIGdpbnQgICAgICAgICAgICAgICAgICBjb21wbGV4aXR5OworICBnaW50ICAgICAgICAgICAgICAgICAgbmZyYW1lczsKKyAgZ2NoYXIgICAgICAgICAgICAgICAgICpsYXN0X21lc3NhZ2U7CisKKyAgZ2ludCAgICAgICAgICAgICAgICAgIGNoYW5uZWxzOworICBnaW50ICAgICAgICAgICAgICAgICAgcmF0ZTsKKworICBnYm9vbGVhbiAgICAgICAgICAgICAgaGVhZGVyX3NlbnQ7CisgIGd1aW50NjQgICAgICAgICAgICAgICBlbmNvZGVkX3NhbXBsZXM7CisKKyAgR3N0VGFnTGlzdCAgICAgICAgICAgICp0YWdzOworCisgIGdpbnQgICAgICAgICAgICAgICAgICBmcmFtZV9zaXplOworICBnaW50ICAgICAgICAgICAgICAgICAgbG9va2FoZWFkOworCisgIGd1aW50OCAgICAgICAgICAgICAgICAqY29tbWVudHM7CisgIGdpbnQgICAgICAgICAgICAgICAgICBjb21tZW50X2xlbjsKK307CisKK3N0cnVjdCBfR3N0U3BlZXhFbmNDbGFzcyB7CisgIEdzdEF1ZGlvRW5jb2RlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9zcGVleF9lbmNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfU1BFRVhFTkNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvc3BlZXgvbWVzb24uYnVpbGQgYi9leHQvc3BlZXgvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4MmYwOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcGVleC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDE5IEBACitzcGVleF9zb3VyY2VzID0gWworICAnZ3N0c3BlZXguYycsCisgICdnc3RzcGVleGRlYy5jJywKKyAgJ2dzdHNwZWV4ZW5jLmMnLAorXQorCitzcGVleF9kZXAgPSBkZXBlbmRlbmN5KCdzcGVleCcsIHZlcnNpb24gOiAnPj0xLjEuNicsIHJlcXVpcmVkIDogZmFsc2UpCisKK2lmIHNwZWV4X2RlcC5mb3VuZCgpCisgIGdzdHNwZWV4ID0gbGlicmFyeSgnZ3N0c3BlZXgnLAorICAgIHNwZWV4X3NvdXJjZXMsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzICsgWyctREdTVF9VU0VfVU5TVEFCTEVfQVBJJ10sCisgICAgbGlua19hcmdzIDogbm9zZWhfbGlua19hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3N0YmFzZV9kZXAsIGdzdHRhZ19kZXAsIGdzdGF1ZGlvX2RlcCwgc3BlZXhfZGVwLCBsaWJtXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCisgICkKK2VuZGlmCmRpZmYgLS1naXQgYS9leHQvdGFnbGliLy5naXRpZ25vcmUgYi9leHQvdGFnbGliLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY4Mjk4MgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC90YWdsaWIvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACitnc3R0YWdsaWJtdXgubG9UCmRpZmYgLS1naXQgYS9leHQvdGFnbGliL01ha2VmaWxlLmFtIGIvZXh0L3RhZ2xpYi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTViMzQyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3RhZ2xpYi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE4IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3R0YWdsaWIubGEKKworbGliZ3N0dGFnbGliX2xhX1NPVVJDRVMgPSBnc3R0YWdsaWJwbHVnaW4uYyBnc3RpZDN2Mm11eC5jYyBnc3RhcGV2Mm11eC5jYworbGliZ3N0dGFnbGliX2xhX0NGTEFHUyA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQ0ZMQUdTKSBcCisJJChUQUdMSUJfQ0ZMQUdTKQorbGliZ3N0dGFnbGliX2xhX0NYWEZMQUdTID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9DWFhGTEFHUykgXAorCSQoVEFHTElCX0NYWEZMQUdTKQorbGliZ3N0dGFnbGliX2xhX0xJQkFERCA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R0YWctJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9MSUJTKSBcCisJJChUQUdMSUJfTElCUykKK2xpYmdzdHRhZ2xpYl9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0aWQzdjJtdXguaCBnc3RhcGV2Mm11eC5oCmRpZmYgLS1naXQgYS9leHQvdGFnbGliL2dzdGFwZXYybXV4LmNjIGIvZXh0L3RhZ2xpYi9nc3RhcGV2Mm11eC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjU5ZGFmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3RhZ2xpYi9nc3RhcGV2Mm11eC5jYwpAQCAtMCwwICsxLDQwOCBAQAorLyogR1N0cmVhbWVyIHRhZ2xpYi1iYXNlZCBBUEV2MiBtdXhlcgorICogQ29weXJpZ2h0IChDKSAyMDA2IENocmlzdG9waGUgRmVyZ2VhdSA8dGV1ZkBnbm9tZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXBldjJtdXgKKyAqIEBzZWVfYWxzbzogI0dzdFRhZ1NldHRlcgorICoKKyAqIFRoaXMgZWxlbWVudCBhZGRzIEFQRXYyIHRhZ3MgdG8gdGhlIGJlZ2lubmluZyBvZiBhIHN0cmVhbSB1c2luZyB0aGUgdGFnbGliCisgKiBsaWJyYXJ5LgorICoKKyAqIEFwcGxpY2F0aW9ucyBjYW4gc2V0IHRoZSB0YWdzIHRvIHdyaXRlIHVzaW5nIHRoZSAjR3N0VGFnU2V0dGVyIGludGVyZmFjZS4KKyAqIFRhZ3Mgc2VudCBieSB1cHN0cmVhbSBlbGVtZW50cyB3aWxsIGJlIHBpY2tlZCB1cCBhdXRvbWF0aWNhbGx5IChhbmQgbWVyZ2VkCisgKiBhY2NvcmRpbmcgdG8gdGhlIG1lcmdlIG1vZGUgc2V0IHZpYSB0aGUgdGFnIHNldHRlciBpbnRlcmZhY2UpLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgZmlsZXNyYyBsb2NhdGlvbj1mb28ub2dnICEgZGVjb2RlYmluICEgYXVkaW9jb252ZXJ0ICEgbGFtZSAhIGFwZXYybXV4ICEgZmlsZXNpbmsgbG9jYXRpb249Zm9vLm1wMworICogXXwgQSBwaXBlbGluZSB0aGF0IHRyYW5zY29kZXMgYSBmaWxlIGZyb20gT2dnL1ZvcmJpcyB0byBtcDMgZm9ybWF0IHdpdGggYW4KKyAqIEFQRXYyIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgYXMgdGhlIHRoZSBPZ2cvVm9yYmlzIGZpbGUuIE1ha2Ugc3VyZSB0aGUKKyAqIE9nZy9Wb3JiaXMgZmlsZSBhY3R1YWxseSBoYXMgY29tbWVudHMgdG8gcHJlc2VydmUuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLW0gZmlsZXNyYyBsb2NhdGlvbj1mb28ubXAzICEgYXBlZGVtdXggISBmYWtlc2luayBzaWxlbnQ9VFJVRSAyJmd0OyAvZGV2L251bGwgfCBncmVwIHRhZ2xpc3QKKyAqIF18IFZlcmlmeSB0aGF0IHRhZ3MgaGF2ZSBiZWVuIHdyaXR0ZW4uCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdzdGFwZXYybXV4LmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGFwZXRhZy5oPgorI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBUYWdMaWI7CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9hcGV2Ml9tdXhfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2FwZXYyX211eF9kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtYXBldGFnIikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoIkFOWSIpKTsKKworR19ERUZJTkVfVFlQRSAoR3N0QXBldjJNdXgsIGdzdF9hcGV2Ml9tdXgsIEdTVF9UWVBFX1RBR19NVVgpOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3RfYXBldjJfbXV4X3JlbmRlcl9zdGFydF90YWcgKEdzdFRhZ011eCAqIG11eCwKKyAgICBjb25zdCBHc3RUYWdMaXN0ICogdGFnbGlzdCk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfYXBldjJfbXV4X3JlbmRlcl9lbmRfdGFnIChHc3RUYWdNdXggKiBtdXgsCisgICAgY29uc3QgR3N0VGFnTGlzdCAqIHRhZ2xpc3QpOworCitzdGF0aWMgdm9pZAorZ3N0X2FwZXYyX211eF9jbGFzc19pbml0IChHc3RBcGV2Mk11eENsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisKKyAgR1NUX1RBR19NVVhfQ0xBU1MgKGtsYXNzKS0+cmVuZGVyX3N0YXJ0X3RhZyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FwZXYyX211eF9yZW5kZXJfc3RhcnRfdGFnKTsKKyAgR1NUX1RBR19NVVhfQ0xBU1MgKGtsYXNzKS0+cmVuZGVyX2VuZF90YWcgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hcGV2Ml9tdXhfcmVuZGVyX2VuZF90YWcpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIlRhZ0xpYi1iYXNlZCBBUEV2MiBNdXhlciIsICJGb3JtYXR0ZXIvTWV0YWRhdGEiLAorICAgICAgIkFkZHMgYW4gQVBFdjIgaGVhZGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgZmlsZXMgdXNpbmcgdGFnbGliIiwKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9hcGV2Ml9tdXhfZGVidWcsICJhcGV2Mm11eCIsIDAsCisgICAgICAidGFnbGliLWJhc2VkIEFQRXYyIHRhZyBtdXhlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FwZXYyX211eF9pbml0IChHc3RBcGV2Mk11eCAqIGFwZXYybXV4KQoreworICAvKiBub3RoaW5nIHRvIGRvICovCit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FwZXYyX211eF9oYXZlX3dhdnBhY2sgKEdzdEFwZXYyTXV4ICogYXBldjJtdXgpCit7CisgIGNvbnN0IEdzdFN0cnVjdHVyZSAqczsKKyAgZ2Jvb2xlYW4gcmV0OworICBHc3RDYXBzICpjYXBzOworICBHc3RQYWQgKnNpbms7CisKKyAgc2luayA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChhcGV2Mm11eCksICJzaW5rIik7CisgIGNhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHNpbmspOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rKTsKKworICBpZiAoY2FwcyA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIHJldCA9IGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJhdWRpby94LXdhdnBhY2siKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIEdTVF9MT0dfT0JKRUNUIChhcGV2Mm11eCwgImdvdCB3YXZwYWNrIGlucHV0OiAlcyIsIHJldCA/ICJ5ZXMiIDogIm5vIik7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfb25lX3RhZyAoY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsIGNvbnN0IGdjaGFyICogdGFnLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEFQRTo6VGFnICogYXBldjJ0YWcgPSAoQVBFOjpUYWcgKikgdXNlcl9kYXRhOworICBnYm9vbGVhbiByZXN1bHQ7CisKKyAgLyogRklYTUU6IGlmIHRoZXJlIGFyZSBzZXZlcmFsIHZhbHVlcyBzZXQgZm9yIHRoZSBzYW1lIHRhZywgdGhpcyB3b24ndAorICAgKiB3b3JrLCBvbmx5IHRoZSBmaXJzdCB2YWx1ZSB3aWxsIGJlIHRha2VuIGludG8gYWNjb3VudAorICAgKi8KKyAgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX1RJVExFKSA9PSAwKSB7CisgICAgY29uc3QgY2hhciAqdGl0bGU7CisKKyAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfcGVla19zdHJpbmdfaW5kZXggKGxpc3QsIHRhZywgMCwgJnRpdGxlKTsKKyAgICBpZiAocmVzdWx0ICE9IEZBTFNFKSB7CisgICAgICBHU1RfREVCVUcgKCJTZXR0aW5nIHRpdGxlIHRvICVzIiwgdGl0bGUpOworICAgICAgYXBldjJ0YWctPnNldFRpdGxlIChTdHJpbmcgKHRpdGxlLCBTdHJpbmc6OlVURjgpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfQUxCVU0pID09IDApIHsKKyAgICBjb25zdCBjaGFyICphbGJ1bTsKKworICAgIHJlc3VsdCA9IGdzdF90YWdfbGlzdF9wZWVrX3N0cmluZ19pbmRleCAobGlzdCwgdGFnLCAwLCAmYWxidW0pOworICAgIGlmIChyZXN1bHQgIT0gRkFMU0UpIHsKKyAgICAgIEdTVF9ERUJVRyAoIlNldHRpbmcgYWxidW0gdG8gJXMiLCBhbGJ1bSk7CisgICAgICBhcGV2MnRhZy0+c2V0QWxidW0gKFN0cmluZyAoYWxidW0sIFN0cmluZzo6VVRGOCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKHRhZywgR1NUX1RBR19BUlRJU1QpID09IDApIHsKKyAgICBjb25zdCBjaGFyICphcnRpc3Q7CisKKyAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfcGVla19zdHJpbmdfaW5kZXggKGxpc3QsIHRhZywgMCwgJmFydGlzdCk7CisgICAgaWYgKHJlc3VsdCAhPSBGQUxTRSkgeworICAgICAgR1NUX0RFQlVHICgiU2V0dGluZyBhcnRpc3QgdG8gJXMiLCBhcnRpc3QpOworICAgICAgYXBldjJ0YWctPnNldEFydGlzdCAoU3RyaW5nIChhcnRpc3QsIFN0cmluZzo6VVRGOCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKHRhZywgR1NUX1RBR19DT01QT1NFUikgPT0gMCkgeworICAgIGNvbnN0IGNoYXIgKmNvbXBvc2VyOworCisgICAgcmVzdWx0ID0gZ3N0X3RhZ19saXN0X3BlZWtfc3RyaW5nX2luZGV4IChsaXN0LCB0YWcsIDAsICZjb21wb3Nlcik7CisgICAgaWYgKHJlc3VsdCAhPSBGQUxTRSkgeworICAgICAgR1NUX0RFQlVHICgiU2V0dGluZyBjb21wb3NlciB0byAlcyIsIGNvbXBvc2VyKTsKKyAgICAgIGFwZXYydGFnLT5hZGRWYWx1ZSAoU3RyaW5nICgiQ09NUE9TRVIiLCBTdHJpbmc6OlVURjgpLAorICAgICAgICAgIFN0cmluZyAoY29tcG9zZXIsIFN0cmluZzo6VVRGOCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKHRhZywgR1NUX1RBR19HRU5SRSkgPT0gMCkgeworICAgIGNvbnN0IGNoYXIgKmdlbnJlOworCisgICAgcmVzdWx0ID0gZ3N0X3RhZ19saXN0X3BlZWtfc3RyaW5nX2luZGV4IChsaXN0LCB0YWcsIDAsICZnZW5yZSk7CisgICAgaWYgKHJlc3VsdCAhPSBGQUxTRSkgeworICAgICAgR1NUX0RFQlVHICgiU2V0dGluZyBnZW5yZSB0byAlcyIsIGdlbnJlKTsKKyAgICAgIGFwZXYydGFnLT5zZXRHZW5yZSAoU3RyaW5nIChnZW5yZSwgU3RyaW5nOjpVVEY4KSk7CisgICAgfQorICB9IGVsc2UgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX0NPTU1FTlQpID09IDApIHsKKyAgICBjb25zdCBjaGFyICpjb21tZW50OworCisgICAgcmVzdWx0ID0gZ3N0X3RhZ19saXN0X3BlZWtfc3RyaW5nX2luZGV4IChsaXN0LCB0YWcsIDAsICZjb21tZW50KTsKKyAgICBpZiAocmVzdWx0ICE9IEZBTFNFKSB7CisgICAgICBHU1RfREVCVUcgKCJTZXR0aW5nIGNvbW1lbnQgdG8gJXMiLCBjb21tZW50KTsKKyAgICAgIGFwZXYydGFnLT5zZXRDb21tZW50IChTdHJpbmcgKGNvbW1lbnQsIFN0cmluZzo6VVRGOCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKHRhZywgR1NUX1RBR19EQVRFKSA9PSAwKSB7CisgICAgR0RhdGUgKmRhdGU7CisKKyAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfZ2V0X2RhdGVfaW5kZXggKGxpc3QsIHRhZywgMCwgJmRhdGUpOworICAgIGlmIChyZXN1bHQgIT0gRkFMU0UpIHsKKyAgICAgIEdEYXRlWWVhciB5ZWFyOworCisgICAgICB5ZWFyID0gZ19kYXRlX2dldF95ZWFyIChkYXRlKTsKKyAgICAgIEdTVF9ERUJVRyAoIlNldHRpbmcgdHJhY2sgeWVhciB0byAlZCIsIHllYXIpOworICAgICAgYXBldjJ0YWctPnNldFllYXIgKHllYXIpOworICAgICAgZ19kYXRlX2ZyZWUgKGRhdGUpOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKHRhZywgR1NUX1RBR19UUkFDS19OVU1CRVIpID09IDApIHsKKyAgICBndWludCB0cmFja19udW1iZXI7CisKKyAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfZ2V0X3VpbnRfaW5kZXggKGxpc3QsIHRhZywgMCwgJnRyYWNrX251bWJlcik7CisgICAgaWYgKHJlc3VsdCAhPSBGQUxTRSkgeworICAgICAgZ3VpbnQgdG90YWxfdHJhY2tzOworCisgICAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfZ2V0X3VpbnRfaW5kZXggKGxpc3QsIEdTVF9UQUdfVFJBQ0tfQ09VTlQsCisgICAgICAgICAgMCwgJnRvdGFsX3RyYWNrcyk7CisgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgIGdjaGFyICp0YWdfc3RyOworCisgICAgICAgIHRhZ19zdHIgPSBnX3N0cmR1cF9wcmludGYgKCIlZC8lZCIsIHRyYWNrX251bWJlciwgdG90YWxfdHJhY2tzKTsKKyAgICAgICAgR1NUX0RFQlVHICgiU2V0dGluZyB0cmFjayBudW1iZXIgdG8gJXMiLCB0YWdfc3RyKTsKKyAgICAgICAgYXBldjJ0YWctPmFkZFZhbHVlIChTdHJpbmcgKCJUUkFDSyIsIFN0cmluZzo6VVRGOCksCisgICAgICAgICAgICBTdHJpbmcgKHRhZ19zdHIsIFN0cmluZzo6VVRGOCksIHRydWUpOworICAgICAgICBnX2ZyZWUgKHRhZ19zdHIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHICgiU2V0dGluZyB0cmFjayBudW1iZXIgdG8gJWQiLCB0cmFja19udW1iZXIpOworICAgICAgICBhcGV2MnRhZy0+c2V0VHJhY2sgKHRyYWNrX251bWJlcik7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX1RSQUNLX0NPVU5UKSA9PSAwKSB7CisgICAgZ3VpbnQgbjsKKworICAgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X3VpbnRfaW5kZXggKGxpc3QsIEdTVF9UQUdfVFJBQ0tfTlVNQkVSLCAwLCAmbikpIHsKKyAgICAgIEdTVF9ERUJVRyAoInRyYWNrLWNvdW50IGhhbmRsZWQgd2l0aCB0cmFjay1udW1iZXIsIHNraXBwaW5nIik7CisgICAgfSBlbHNlIGlmIChnc3RfdGFnX2xpc3RfZ2V0X3VpbnRfaW5kZXggKGxpc3QsIEdTVF9UQUdfVFJBQ0tfQ09VTlQsIDAsICZuKSkgeworICAgICAgZ2NoYXIgKnRhZ19zdHI7CisKKyAgICAgIHRhZ19zdHIgPSBnX3N0cmR1cF9wcmludGYgKCIwLyVkIiwgbik7CisgICAgICBHU1RfREVCVUcgKCJTZXR0aW5nIHRyYWNrIG51bWJlciB0byAlcyIsIHRhZ19zdHIpOworICAgICAgYXBldjJ0YWctPmFkZFZhbHVlIChTdHJpbmcgKCJUUkFDSyIsIFN0cmluZzo6VVRGOCksCisgICAgICAgICAgU3RyaW5nICh0YWdfc3RyLCBTdHJpbmc6OlVURjgpLCB0cnVlKTsKKyAgICAgIGdfZnJlZSAodGFnX3N0cik7CisgICAgfQorI2lmIDAKKyAgfSBlbHNlIGlmIChzdHJjbXAgKHRhZywgR1NUX1RBR19BTEJVTV9WT0xVTUVfTlVNQkVSKSA9PSAwKSB7CisgICAgZ3VpbnQgdm9sdW1lX251bWJlcjsKKworICAgIHJlc3VsdCA9IGdzdF90YWdfbGlzdF9nZXRfdWludF9pbmRleCAobGlzdCwgdGFnLCAwLCAmdm9sdW1lX251bWJlcik7CisKKyAgICBpZiAocmVzdWx0ICE9IEZBTFNFKSB7CisgICAgICBndWludCB2b2x1bWVfY291bnQ7CisgICAgICBnY2hhciAqdGFnX3N0cjsKKworICAgICAgcmVzdWx0ID0gZ3N0X3RhZ19saXN0X2dldF91aW50X2luZGV4IChsaXN0LCBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9DT1VOVCwKKyAgICAgICAgICAwLCAmdm9sdW1lX2NvdW50KTsKKworICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICB0YWdfc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiQ0QgJWQvJWQiLCB2b2x1bWVfbnVtYmVyLCB2b2x1bWVfY291bnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGFnX3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIkNEICVkIiwgdm9sdW1lX251bWJlcik7CisgICAgICB9CisKKyAgICAgIEdTVF9ERUJVRyAoIlNldHRpbmcgYWxidW0gbnVtYmVyIHRvICVzIiwgdGFnX3N0cik7CisKKyAgICAgIGFwZXYydGFnLT5hZGRWYWx1ZSAoU3RyaW5nICgiTUVESUEiLCBTdHJpbmc6OlVURjgpLAorICAgICAgICAgIFN0cmluZyAodGFnX3N0ciwgU3RyaW5nOjpVVEY4KSwgdHJ1ZSk7CisgICAgICBnX2ZyZWUgKHRhZ19zdHIpOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKHRhZywgR1NUX1RBR19BTEJVTV9WT0xVTUVfQ09VTlQpID09IDApIHsKKyAgICBndWludCBuOworCisgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfdWludF9pbmRleCAobGlzdCwgR1NUX1RBR19BTEJVTV9WT0xVTUVfTlVNQkVSLCAwLCAmbikpIHsKKyAgICAgIEdTVF9ERUJVRyAoInZvbHVtZS1jb3VudCBoYW5kbGVkIHdpdGggdm9sdW1lLW51bWJlciwgc2tpcHBpbmciKTsKKyAgICB9IGVsc2UgaWYgKGdzdF90YWdfbGlzdF9nZXRfdWludF9pbmRleCAobGlzdCwgR1NUX1RBR19BTEJVTV9WT0xVTUVfQ09VTlQsCisgICAgICAgICAgICAwLCAmbikpIHsKKyAgICAgIGdjaGFyICp0YWdfc3RyOworCisgICAgICB0YWdfc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiQ0QgMC8ldSIsIG4pOworICAgICAgR1NUX0RFQlVHICgiU2V0dGluZyBhbGJ1bSB2b2x1bWUgbnVtYmVyL2NvdW50IHRvICVzIiwgdGFnX3N0cik7CisKKyAgICAgIGFwZXYydGFnLT5hZGRWYWx1ZSAoU3RyaW5nICgiTUVESUEiLCBTdHJpbmc6OlVURjgpLAorICAgICAgICAgIFN0cmluZyAodGFnX3N0ciwgU3RyaW5nOjpVVEY4KSwgdHJ1ZSk7CisgICAgICBnX2ZyZWUgKHRhZ19zdHIpOworICAgIH0KKyNlbmRpZgorICB9IGVsc2UgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX0NPUFlSSUdIVCkgPT0gMCkgeworICAgIGNvbnN0IGdjaGFyICpjb3B5cmlnaHQ7CisKKyAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfcGVla19zdHJpbmdfaW5kZXggKGxpc3QsIHRhZywgMCwgJmNvcHlyaWdodCk7CisKKyAgICBpZiAocmVzdWx0ICE9IEZBTFNFKSB7CisgICAgICBHU1RfREVCVUcgKCJTZXR0aW5nIGNvcHlyaWdodCB0byAlcyIsIGNvcHlyaWdodCk7CisgICAgICBhcGV2MnRhZy0+YWRkVmFsdWUgKFN0cmluZyAoIkNPUFlSSUdIVCIsIFN0cmluZzo6VVRGOCksCisgICAgICAgICAgU3RyaW5nIChjb3B5cmlnaHQsIFN0cmluZzo6VVRGOCksIHRydWUpOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKHRhZywgR1NUX1RBR19MT0NBVElPTikgPT0gMCkgeworICAgIGNvbnN0IGdjaGFyICpsb2NhdGlvbjsKKworICAgIHJlc3VsdCA9IGdzdF90YWdfbGlzdF9wZWVrX3N0cmluZ19pbmRleCAobGlzdCwgdGFnLCAwLCAmbG9jYXRpb24pOworCisgICAgaWYgKHJlc3VsdCAhPSBGQUxTRSkgeworICAgICAgR1NUX0RFQlVHICgiU2V0dGluZyBsb2NhdGlvbiB0byAlcyIsIGxvY2F0aW9uKTsKKyAgICAgIGFwZXYydGFnLT5hZGRWYWx1ZSAoU3RyaW5nICgiRklMRSIsIFN0cmluZzo6VVRGOCksCisgICAgICAgICAgU3RyaW5nIChsb2NhdGlvbiwgU3RyaW5nOjpVVEY4KSwgdHJ1ZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX0lTUkMpID09IDApIHsKKyAgICBjb25zdCBnY2hhciAqaXNyYzsKKworICAgIHJlc3VsdCA9IGdzdF90YWdfbGlzdF9wZWVrX3N0cmluZ19pbmRleCAobGlzdCwgdGFnLCAwLCAmaXNyYyk7CisKKyAgICBpZiAocmVzdWx0ICE9IEZBTFNFKSB7CisgICAgICBHU1RfREVCVUcgKCJTZXR0aW5nIElTUkMgdG8gJXMiLCBpc3JjKTsKKyAgICAgIGFwZXYydGFnLT5hZGRWYWx1ZSAoU3RyaW5nICgiSVNSQyIsIFN0cmluZzo6VVRGOCksCisgICAgICAgICAgU3RyaW5nIChpc3JjLCBTdHJpbmc6OlVURjgpLCB0cnVlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfVFJBQ0tfR0FJTikgPT0gMCkgeworICAgIGdkb3VibGUgdmFsdWU7CisKKyAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZV9pbmRleCAobGlzdCwgdGFnLCAwLCAmdmFsdWUpOworCisgICAgaWYgKHJlc3VsdCAhPSBGQUxTRSkgeworICAgICAgZ2NoYXIgKnRyYWNrX2dhaW4gPSAoZ2NoYXIgKikgZ19tYWxsb2MwIChHX0FTQ0lJX0RUT1NUUl9CVUZfU0laRSk7CisKKyAgICAgIHRyYWNrX2dhaW4gPSBnX2FzY2lpX2R0b3N0ciAodHJhY2tfZ2FpbiwgR19BU0NJSV9EVE9TVFJfQlVGX1NJWkUsIHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVRyAoIlNldHRpbmcgdHJhY2sgZ2FpbiB0byAlcyIsIHRyYWNrX2dhaW4pOworICAgICAgYXBldjJ0YWctPmFkZFZhbHVlIChTdHJpbmcgKCJSRVBMQVlHQUlOX1RSQUNLX0dBSU4iLAorICAgICAgICAgICAgICBTdHJpbmc6OlVURjgpLCBTdHJpbmcgKHRyYWNrX2dhaW4sIFN0cmluZzo6VVRGOCksIHRydWUpOworICAgICAgZ19mcmVlICh0cmFja19nYWluKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfVFJBQ0tfUEVBSykgPT0gMCkgeworICAgIGdkb3VibGUgdmFsdWU7CisKKyAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZV9pbmRleCAobGlzdCwgdGFnLCAwLCAmdmFsdWUpOworCisgICAgaWYgKHJlc3VsdCAhPSBGQUxTRSkgeworICAgICAgZ2NoYXIgKnRyYWNrX3BlYWsgPSAoZ2NoYXIgKikgZ19tYWxsb2MwIChHX0FTQ0lJX0RUT1NUUl9CVUZfU0laRSk7CisKKyAgICAgIHRyYWNrX3BlYWsgPSBnX2FzY2lpX2R0b3N0ciAodHJhY2tfcGVhaywgR19BU0NJSV9EVE9TVFJfQlVGX1NJWkUsIHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVRyAoIlNldHRpbmcgdHJhY2sgcGVhayB0byAlcyIsIHRyYWNrX3BlYWspOworICAgICAgYXBldjJ0YWctPmFkZFZhbHVlIChTdHJpbmcgKCJSRVBMQVlHQUlOX1RSQUNLX1BFQUsiLAorICAgICAgICAgICAgICBTdHJpbmc6OlVURjgpLCBTdHJpbmcgKHRyYWNrX3BlYWssIFN0cmluZzo6VVRGOCksIHRydWUpOworICAgICAgZ19mcmVlICh0cmFja19wZWFrKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfQUxCVU1fR0FJTikgPT0gMCkgeworICAgIGdkb3VibGUgdmFsdWU7CisKKyAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZV9pbmRleCAobGlzdCwgdGFnLCAwLCAmdmFsdWUpOworCisgICAgaWYgKHJlc3VsdCAhPSBGQUxTRSkgeworICAgICAgZ2NoYXIgKmFsYnVtX2dhaW4gPSAoZ2NoYXIgKikgZ19tYWxsb2MwIChHX0FTQ0lJX0RUT1NUUl9CVUZfU0laRSk7CisKKyAgICAgIGFsYnVtX2dhaW4gPSBnX2FzY2lpX2R0b3N0ciAoYWxidW1fZ2FpbiwgR19BU0NJSV9EVE9TVFJfQlVGX1NJWkUsIHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVRyAoIlNldHRpbmcgYWxidW0gZ2FpbiB0byAlcyIsIGFsYnVtX2dhaW4pOworICAgICAgYXBldjJ0YWctPmFkZFZhbHVlIChTdHJpbmcgKCJSRVBMQVlHQUlOX0FMQlVNX0dBSU4iLAorICAgICAgICAgICAgICBTdHJpbmc6OlVURjgpLCBTdHJpbmcgKGFsYnVtX2dhaW4sIFN0cmluZzo6VVRGOCksIHRydWUpOworICAgICAgZ19mcmVlIChhbGJ1bV9nYWluKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfQUxCVU1fUEVBSykgPT0gMCkgeworICAgIGdkb3VibGUgdmFsdWU7CisKKyAgICByZXN1bHQgPSBnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZV9pbmRleCAobGlzdCwgdGFnLCAwLCAmdmFsdWUpOworCisgICAgaWYgKHJlc3VsdCAhPSBGQUxTRSkgeworICAgICAgZ2NoYXIgKmFsYnVtX3BlYWsgPSAoZ2NoYXIgKikgZ19tYWxsb2MwIChHX0FTQ0lJX0RUT1NUUl9CVUZfU0laRSk7CisKKyAgICAgIGFsYnVtX3BlYWsgPSBnX2FzY2lpX2R0b3N0ciAoYWxidW1fcGVhaywgR19BU0NJSV9EVE9TVFJfQlVGX1NJWkUsIHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVRyAoIlNldHRpbmcgYWxidW0gcGVhayB0byAlcyIsIGFsYnVtX3BlYWspOworICAgICAgYXBldjJ0YWctPmFkZFZhbHVlIChTdHJpbmcgKCJSRVBMQVlHQUlOX0FMQlVNX1BFQUsiLAorICAgICAgICAgICAgICBTdHJpbmc6OlVURjgpLCBTdHJpbmcgKGFsYnVtX3BlYWssIFN0cmluZzo6VVRGOCksIHRydWUpOworICAgICAgZ19mcmVlIChhbGJ1bV9wZWFrKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkcgKCJVbnN1cHBvcnRlZCB0YWc6ICVzIiwgdGFnKTsKKyAgfQorfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9hcGV2Ml9tdXhfcmVuZGVyX3RhZyAoR3N0VGFnTXV4ICogbXV4LCBjb25zdCBHc3RUYWdMaXN0ICogdGFnbGlzdCkKK3sKKyAgQVBFOjpUYWcgYXBldjJ0YWc7CisgIEJ5dGVWZWN0b3IgcmVuZGVyZWRfdGFnOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgZ3VpbnQgdGFnX3NpemU7CisKKyAgLyogUmVuZGVyIHRoZSB0YWcgKi8KKyAgZ3N0X3RhZ19saXN0X2ZvcmVhY2ggKHRhZ2xpc3QsIGFkZF9vbmVfdGFnLCAmYXBldjJ0YWcpOworCisgIHJlbmRlcmVkX3RhZyA9IGFwZXYydGFnLnJlbmRlciAoKTsKKyAgdGFnX3NpemUgPSByZW5kZXJlZF90YWcuc2l6ZSAoKTsKKworICBHU1RfTE9HX09CSkVDVCAobXV4LCAidGFnIHNpemUgPSAlZCBieXRlcyIsIHRhZ19zaXplKTsKKworICAvKiBDcmVhdGUgYnVmZmVyIHdpdGggdGFnICovCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAodGFnX3NpemUpOworICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgcmVuZGVyZWRfdGFnLmRhdGEgKCksIHRhZ19zaXplKTsKKworICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9hcGV2Ml9tdXhfcmVuZGVyX3N0YXJ0X3RhZyAoR3N0VGFnTXV4ICogbXV4LCBjb25zdCBHc3RUYWdMaXN0ICogdGFnbGlzdCkKK3sKKyAgaWYgKGdzdF9hcGV2Ml9tdXhfaGF2ZV93YXZwYWNrIChHU1RfQVBFVjJfTVVYIChtdXgpKSkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gZ3N0X2FwZXYyX211eF9yZW5kZXJfdGFnIChtdXgsIHRhZ2xpc3QpOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9hcGV2Ml9tdXhfcmVuZGVyX2VuZF90YWcgKEdzdFRhZ011eCAqIG11eCwgY29uc3QgR3N0VGFnTGlzdCAqIHRhZ2xpc3QpCit7CisgIGlmIChnc3RfYXBldjJfbXV4X2hhdmVfd2F2cGFjayAoR1NUX0FQRVYyX01VWCAobXV4KSkpCisgICAgcmV0dXJuIGdzdF9hcGV2Ml9tdXhfcmVuZGVyX3RhZyAobXV4LCB0YWdsaXN0KTsKKworICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2V4dC90YWdsaWIvZ3N0YXBldjJtdXguaCBiL2V4dC90YWdsaWIvZ3N0YXBldjJtdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWNlYjU3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3RhZ2xpYi9nc3RhcGV2Mm11eC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIEdTdHJlYW1lciB0YWdsaWItYmFzZWQgQVBFdjIgbXV4ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBDaHJpc3RvcGhlIEZlcmdlYXUgPHRldWZAZ25vbWUub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgR1NUX0FQRVYyX01VWF9ICisjZGVmaW5lIEdTVF9BUEVWMl9NVVhfSAorCisjaW5jbHVkZSA8Z3N0L3RhZy9nc3R0YWdtdXguaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0QXBldjJNdXggR3N0QXBldjJNdXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXBldjJNdXhDbGFzcyBHc3RBcGV2Mk11eENsYXNzOworCitzdHJ1Y3QgX0dzdEFwZXYyTXV4IHsKKyAgR3N0VGFnTXV4ICB0YWdtdXg7Cit9OworCitzdHJ1Y3QgX0dzdEFwZXYyTXV4Q2xhc3MgeworICBHc3RUYWdNdXhDbGFzcyAgdGFnbXV4X2NsYXNzOworfTsKKworI2RlZmluZSBHU1RfVFlQRV9BUEVWMl9NVVggXAorICAoZ3N0X2FwZXYyX211eF9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVBFVjJfTVVYKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVBFVjJfTVVYLEdzdEFwZXYyTXV4KSkKKyNkZWZpbmUgR1NUX0FQRVYyX01VWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9BUEVWMl9NVVgsR3N0QXBldjJNdXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BUEVWMl9NVVgob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9BUEVWMl9NVVgpKQorI2RlZmluZSBHU1RfSVNfQVBFVjJfTVVYX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0FQRVYyX01VWCkpCisKK0dUeXBlIGdzdF9hcGV2Ml9tdXhfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogR1NUX0FQRVYyX01VWF9IICovCmRpZmYgLS1naXQgYS9leHQvdGFnbGliL2dzdGlkM3YybXV4LmNjIGIvZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWM5MTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5jYwpAQCAtMCwwICsxLDgwNCBAQAorLyogR1N0cmVhbWVyIHRhZ2xpYi1iYXNlZCBJRDN2MiBtdXhlcgorICogQ29weXJpZ2h0IChDKSAyMDA2IENocmlzdG9waGUgRmVyZ2VhdSA8dGV1ZkBnbm9tZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1pZDN2Mm11eAorICogQHNlZV9hbHNvOiAjR3N0SUQzRGVtdXgsICNHc3RUYWdTZXR0ZXIKKyAqCisgKiBUaGlzIGVsZW1lbnQgYWRkcyBJRDN2MiB0YWdzIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJlYW0gdXNpbmcgdGhlIHRhZ2xpYgorICogbGlicmFyeS4gTW9yZSBwcmVjaXNlbHksIHRoZSB0YWdzIHdyaXR0ZW4gYXJlIElEMyB2ZXJzaW9uIDIuNC4wIHRhZ3MgKHdoaWNoCisgKiBtZWFucyBpbiBwcmFjdGljZSB0aGF0IHNvbWUgaGFyZHdhcmUgcGxheWVycyBvciBvdXRkYXRlZCBwcm9ncmFtcyBtaWdodCBub3QKKyAqIGJlIGFibGUgdG8gcmVhZCB0aGVtIHByb3Blcmx5KS4KKyAqCisgKiBBcHBsaWNhdGlvbnMgY2FuIHNldCB0aGUgdGFncyB0byB3cml0ZSB1c2luZyB0aGUgI0dzdFRhZ1NldHRlciBpbnRlcmZhY2UuCisgKiBUYWdzIHNlbnQgYnkgdXBzdHJlYW0gZWxlbWVudHMgd2lsbCBiZSBwaWNrZWQgdXAgYXV0b21hdGljYWxseSAoYW5kIG1lcmdlZAorICogYWNjb3JkaW5nIHRvIHRoZSBtZXJnZSBtb2RlIHNldCB2aWEgdGhlIHRhZyBzZXR0ZXIgaW50ZXJmYWNlKS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249Zm9vLm9nZyAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhIGxhbWUgISBpZDN2Mm11eCAhIGZpbGVzaW5rIGxvY2F0aW9uPWZvby5tcDMKKyAqIF18IEEgcGlwZWxpbmUgdGhhdCB0cmFuc2NvZGVzIGEgZmlsZSBmcm9tIE9nZy9Wb3JiaXMgdG8gbXAzIGZvcm1hdCB3aXRoIGFuCisgKiBJRDN2MiB0aGF0IGNvbnRhaW5zIHRoZSBzYW1lIGFzIHRoZSB0aGUgT2dnL1ZvcmJpcyBmaWxlLiBNYWtlIHN1cmUgdGhlCisgKiBPZ2cvVm9yYmlzIGZpbGUgYWN0dWFsbHkgaGFzIGNvbW1lbnRzIHRvIHByZXNlcnZlLgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC1tIGZpbGVzcmMgbG9jYXRpb249Zm9vLm1wMyAhIGlkM2RlbXV4ICEgZmFrZXNpbmsgc2lsZW50PVRSVUUgMiZndDsgL2Rldi9udWxsIHwgZ3JlcCB0YWdsaXN0CisgKiBdfCBWZXJpZnkgdGhhdCB0YWdzIGhhdmUgYmVlbiB3cml0dGVuLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RpZDN2Mm11eC5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDx0ZXh0aWRlbnRpZmljYXRpb25mcmFtZS5oPgorI2luY2x1ZGUgPHVuaXF1ZWZpbGVpZGVudGlmaWVyZnJhbWUuaD4KKyNpbmNsdWRlIDxhdHRhY2hlZHBpY3R1cmVmcmFtZS5oPgorI2luY2x1ZGUgPHJlbGF0aXZldm9sdW1lZnJhbWUuaD4KKyNpbmNsdWRlIDxjb21tZW50c2ZyYW1lLmg+CisjaW5jbHVkZSA8dW5rbm93bmZyYW1lLmg+CisjaW5jbHVkZSA8aWQzdjJzeW5jaGRhdGEuaD4KKyNpbmNsdWRlIDxpZDN2MnRhZy5oPgorI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBUYWdMaWI7CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9pZDN2Ml9tdXhfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2lkM3YyX211eF9kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtaWQzIikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoIkFOWSIpKTsKKworR19ERUZJTkVfVFlQRSAoR3N0SWQzdjJNdXgsIGdzdF9pZDN2Ml9tdXgsIEdTVF9UWVBFX1RBR19NVVgpOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3RfaWQzdjJfbXV4X3JlbmRlcl90YWcgKEdzdFRhZ011eCAqIG11eCwKKyAgICBjb25zdCBHc3RUYWdMaXN0ICogdGFnbGlzdCk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfaWQzdjJfbXV4X3JlbmRlcl9lbmRfdGFnIChHc3RUYWdNdXggKiBtdXgsCisgICAgY29uc3QgR3N0VGFnTGlzdCAqIHRhZ2xpc3QpOworCitzdGF0aWMgdm9pZAorZ3N0X2lkM3YyX211eF9jbGFzc19pbml0IChHc3RJZDN2Mk11eENsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisKKyAgR1NUX1RBR19NVVhfQ0xBU1MgKGtsYXNzKS0+cmVuZGVyX3N0YXJ0X3RhZyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2lkM3YyX211eF9yZW5kZXJfdGFnKTsKKyAgR1NUX1RBR19NVVhfQ0xBU1MgKGtsYXNzKS0+cmVuZGVyX2VuZF90YWcgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9pZDN2Ml9tdXhfcmVuZGVyX2VuZF90YWcpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIlRhZ0xpYi1iYXNlZCBJRDN2MiBNdXhlciIsICJGb3JtYXR0ZXIvTWV0YWRhdGEiLAorICAgICAgIkFkZHMgYW4gSUQzdjIgaGVhZGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgTVAzIGZpbGVzIHVzaW5nIHRhZ2xpYiIsCisgICAgICAiQ2hyaXN0b3BoZSBGZXJnZWF1IDx0ZXVmQGdub21lLm9yZz4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X2lkM3YyX211eF9kZWJ1ZywgImlkM3YybXV4IiwgMCwKKyAgICAgICJ0YWdsaWItYmFzZWQgSUQzdjIgdGFnIG11eGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaWQzdjJfbXV4X2luaXQgKEdzdElkM3YyTXV4ICogaWQzdjJtdXgpCit7CisgIC8qIG5vdGhpbmcgdG8gZG8gKi8KK30KKworI2lmIDAKK3N0YXRpYyB2b2lkCithZGRfb25lX3R4eHhfdGFnIChJRDN2Mjo6VGFnICogaWQzdjJ0YWcsIGNvbnN0IGdjaGFyICoga2V5LCBjb25zdCBnY2hhciAqIHZhbCkKK3sKKyAgSUQzdjI6OlVzZXJUZXh0SWRlbnRpZmljYXRpb25GcmFtZSAqIGZyYW1lOworCisgIGlmICh2YWwgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgR1NUX0RFQlVHICgiU2V0dGluZyAlcyB0byAlcyIsIGtleSwgdmFsKTsKKyAgZnJhbWUgPSBuZXcgSUQzdjI6OlVzZXJUZXh0SWRlbnRpZmljYXRpb25GcmFtZSAoU3RyaW5nOjpVVEY4KTsKKyAgaWQzdjJ0YWctPmFkZEZyYW1lIChmcmFtZSk7CisgIGZyYW1lLT5zZXREZXNjcmlwdGlvbiAoa2V5KTsKKyAgZnJhbWUtPnNldFRleHQgKHZhbCk7Cit9CisjZW5kaWYKKwordHlwZWRlZiB2b2lkICgqR3N0SWQzdjJNdXhBZGRUYWdGdW5jKSAoSUQzdjI6OlRhZyAqIGlkM3YydGFnLAorICAgIGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LAorICAgIGNvbnN0IGdjaGFyICogdGFnLCBndWludCBudW1fdGFncywgY29uc3QgZ2NoYXIgKiBkYXRhKTsKKworc3RhdGljIHZvaWQKK2FkZF9lbmNvZGVyX3RhZyAoSUQzdjI6OlRhZyAqIGlkM3YydGFnLCBjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwKKyAgICBjb25zdCBnY2hhciAqIHRhZywgZ3VpbnQgbnVtX3RhZ3MsIGNvbnN0IGdjaGFyICogdW51c2VkKQoreworICBUYWdMaWI6OlN0cmluZ0xpc3Qgc3RyaW5nX2xpc3Q7CisgIGd1aW50IG47CisKKyAgLyogRU5DT0RFUl9WRVJTSU9OIGlzIGVpdGhlciBoYW5kbGVkIHdpdGggdGhlIEVOQ09ERVIgdGFnIG9yIG5vdCBhdCBhbGwgKi8KKyAgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX0VOQ09ERVJfVkVSU0lPTikgPT0gMCkKKyAgICByZXR1cm47CisKKyAgZm9yIChuID0gMDsgbiA8IG51bV90YWdzOyArK24pIHsKKyAgICBnY2hhciAqZW5jb2RlciA9IE5VTEw7CisKKyAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmdfaW5kZXggKGxpc3QsIHRhZywgbiwgJmVuY29kZXIpICYmIGVuY29kZXIpIHsKKyAgICAgIGd1aW50IGVuY29kZXJfdmVyc2lvbjsKKyAgICAgIGdjaGFyICpzOworCisgICAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF91aW50X2luZGV4IChsaXN0LCBHU1RfVEFHX0VOQ09ERVJfVkVSU0lPTiwgbiwKKyAgICAgICAgICAgICAgJmVuY29kZXJfdmVyc2lvbikgJiYgZW5jb2Rlcl92ZXJzaW9uID4gMCkgeworICAgICAgICBzID0gZ19zdHJkdXBfcHJpbnRmICgiJXMgJXUiLCBlbmNvZGVyLCBlbmNvZGVyX3ZlcnNpb24pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcyA9IGdfc3RyZHVwIChlbmNvZGVyKTsKKyAgICAgIH0KKworICAgICAgR1NUX0xPRyAoImVuY29kZXJbJXVdID0gJyVzJyIsIG4sIHMpOworICAgICAgc3RyaW5nX2xpc3QuYXBwZW5kIChTdHJpbmcgKHMsIFN0cmluZzo6VVRGOCkpOworICAgICAgZ19mcmVlIChzKTsKKyAgICAgIGdfZnJlZSAoZW5jb2Rlcik7CisgICAgfQorICB9CisKKyAgaWYgKCFzdHJpbmdfbGlzdC5pc0VtcHR5ICgpKSB7CisgICAgSUQzdjI6OlRleHRJZGVudGlmaWNhdGlvbkZyYW1lICogZjsKKworICAgIGYgPSBuZXcgSUQzdjI6OlRleHRJZGVudGlmaWNhdGlvbkZyYW1lICgiVFNTRSIsIFN0cmluZzo6VVRGOCk7CisgICAgaWQzdjJ0YWctPmFkZEZyYW1lIChmKTsKKyAgICBmLT5zZXRUZXh0IChzdHJpbmdfbGlzdCk7CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkcgKCJFbXB0eSBsaXN0IGZvciB0YWcgJXMsIHNraXBwaW5nIiwgdGFnKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorYWRkX2RhdGVfdGFnIChJRDN2Mjo6VGFnICogaWQzdjJ0YWcsIGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LAorICAgIGNvbnN0IGdjaGFyICogdGFnLCBndWludCBudW1fdGFncywgY29uc3QgZ2NoYXIgKiB1bnVzZWQpCit7CisgIFRhZ0xpYjo6U3RyaW5nTGlzdCBzdHJpbmdfbGlzdDsKKyAgZ3VpbnQgbjsKKworICBHU1RfTE9HICgiQWRkaW5nIGRhdGUgZnJhbWUiKTsKKworICBmb3IgKG4gPSAwOyBuIDwgbnVtX3RhZ3M7ICsrbikgeworICAgIEdEYXRlICpkYXRlID0gTlVMTDsKKworICAgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X2RhdGVfaW5kZXggKGxpc3QsIHRhZywgbiwgJmRhdGUpICYmIGRhdGUgIT0gTlVMTCkgeworICAgICAgR0RhdGVZZWFyIHllYXI7CisgICAgICBnY2hhciAqczsKKworICAgICAgeWVhciA9IGdfZGF0ZV9nZXRfeWVhciAoZGF0ZSk7CisgICAgICBpZiAoeWVhciA+IDUwMCAmJiB5ZWFyIDwgMjEwMCkgeworICAgICAgICBzID0gZ19zdHJkdXBfcHJpbnRmICgiJXUiLCB5ZWFyKTsKKyAgICAgICAgR1NUX0xPRyAoIiVzWyV1XSA9ICclcyciLCB0YWcsIG4sIHMpOworICAgICAgICBzdHJpbmdfbGlzdC5hcHBlbmQgKFN0cmluZyAocywgU3RyaW5nOjpVVEY4KSk7CisgICAgICAgIGdfZnJlZSAocyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfV0FSTklORyAoImludmFsaWQgeWVhciAldSwgc2tpcHBpbmciLCB5ZWFyKTsKKyAgICAgIH0KKworICAgICAgZ19kYXRlX2ZyZWUgKGRhdGUpOworICAgIH0KKyAgfQorCisgIGlmICghc3RyaW5nX2xpc3QuaXNFbXB0eSAoKSkgeworICAgIElEM3YyOjpUZXh0SWRlbnRpZmljYXRpb25GcmFtZSAqIGY7CisKKyAgICBmID0gbmV3IElEM3YyOjpUZXh0SWRlbnRpZmljYXRpb25GcmFtZSAoIlREUkMiLCBTdHJpbmc6OlVURjgpOworICAgIGlkM3YydGFnLT5hZGRGcmFtZSAoZik7CisgICAgZi0+c2V0VGV4dCAoc3RyaW5nX2xpc3QpOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HICgiRW1wdHkgbGlzdCBmb3IgdGFnICVzLCBza2lwcGluZyIsIHRhZyk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2FkZF9jb3VudF9vcl9udW1fdGFnIChJRDN2Mjo6VGFnICogaWQzdjJ0YWcsIGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LAorICAgIGNvbnN0IGdjaGFyICogdGFnLCBndWludCBudW1fdGFncywgY29uc3QgZ2NoYXIgKiBmcmFtZV9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IHN0cnVjdAorICB7CisgICAgY29uc3QgZ2NoYXIgKmdzdF90YWc7CisgICAgY29uc3QgZ2NoYXIgKmNvcnJfY291bnQ7ICAgIC8qIGNvcnJlc3BvbmRpbmcgQ09VTlQgdGFnIChpZiBudW1iZXIpICovCisgICAgY29uc3QgZ2NoYXIgKmNvcnJfbnVtOyAgICAgIC8qIGNvcnJlc3BvbmRpbmcgTlVNQkVSIHRhZyAoaWYgY291bnQpICovCisgIH0gY29ycltdID0geworICAgIHsKKyAgICBHU1RfVEFHX1RSQUNLX05VTUJFUiwgR1NUX1RBR19UUkFDS19DT1VOVCwgTlVMTH0sIHsKKyAgICBHU1RfVEFHX1RSQUNLX0NPVU5ULCBOVUxMLCBHU1RfVEFHX1RSQUNLX05VTUJFUn0sIHsKKyAgICBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9OVU1CRVIsIEdTVF9UQUdfQUxCVU1fVk9MVU1FX0NPVU5ULCBOVUxMfSwgeworICAgIEdTVF9UQUdfQUxCVU1fVk9MVU1FX0NPVU5ULCBOVUxMLCBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9OVU1CRVJ9CisgIH07CisgIGd1aW50IGlkeDsKKworICBmb3IgKGlkeCA9IDA7IGlkeCA8IEdfTl9FTEVNRU5UUyAoY29ycik7ICsraWR4KSB7CisgICAgaWYgKHN0cmNtcCAoY29ycltpZHhdLmdzdF90YWcsIHRhZykgPT0gMCkKKyAgICAgIGJyZWFrOworICB9CisKKyAgZ19hc3NlcnQgKGlkeCA8IEdfTl9FTEVNRU5UUyAoY29ycikpOworICBnX2Fzc2VydCAoZnJhbWVfaWQgJiYgc3RybGVuIChmcmFtZV9pZCkgPT0gNCk7CisKKyAgaWYgKGNvcnJbaWR4XS5jb3JyX251bSA9PSBOVUxMKSB7CisgICAgZ3VpbnQgbnVtYmVyOworCisgICAgLyogbnVtYmVyIHRhZyAqLworICAgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X3VpbnRfaW5kZXggKGxpc3QsIHRhZywgMCwgJm51bWJlcikpIHsKKyAgICAgIElEM3YyOjpUZXh0SWRlbnRpZmljYXRpb25GcmFtZSAqIGZyYW1lOworICAgICAgZ2NoYXIgKnRhZ19zdHI7CisgICAgICBndWludCBjb3VudDsKKworICAgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfdWludF9pbmRleCAobGlzdCwgY29ycltpZHhdLmNvcnJfY291bnQsIDAsICZjb3VudCkpCisgICAgICAgIHRhZ19zdHIgPSBnX3N0cmR1cF9wcmludGYgKCIldS8ldSIsIG51bWJlciwgY291bnQpOworICAgICAgZWxzZQorICAgICAgICB0YWdfc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiJXUiLCBudW1iZXIpOworCisgICAgICBHU1RfREVCVUcgKCJTZXR0aW5nICVzIHRvICVzIChmcmFtZV9pZCA9ICVzKSIsIHRhZywgdGFnX3N0ciwgZnJhbWVfaWQpOworICAgICAgZnJhbWUgPSBuZXcgSUQzdjI6OlRleHRJZGVudGlmaWNhdGlvbkZyYW1lIChmcmFtZV9pZCwgU3RyaW5nOjpVVEY4KTsKKyAgICAgIGlkM3YydGFnLT5hZGRGcmFtZSAoZnJhbWUpOworICAgICAgZnJhbWUtPnNldFRleHQgKHRhZ19zdHIpOworICAgICAgZ19mcmVlICh0YWdfc3RyKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoY29ycltpZHhdLmNvcnJfY291bnQgPT0gTlVMTCkgeworICAgIGd1aW50IGNvdW50OworCisgICAgLyogY291bnQgdGFnICovCisgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfdWludF9pbmRleCAobGlzdCwgY29ycltpZHhdLmNvcnJfbnVtLCAwLCAmY291bnQpKSB7CisgICAgICBHU1RfREVCVUcgKCIlcyBoYW5kbGVkIHdpdGggJXMsIHNraXBwaW5nIiwgdGFnLCBjb3JyW2lkeF0uY29ycl9udW0pOworICAgIH0gZWxzZSBpZiAoZ3N0X3RhZ19saXN0X2dldF91aW50X2luZGV4IChsaXN0LCB0YWcsIDAsICZjb3VudCkpIHsKKyAgICAgIElEM3YyOjpUZXh0SWRlbnRpZmljYXRpb25GcmFtZSAqIGZyYW1lOworICAgICAgZ2NoYXIgKnRhZ19zdHI7CisKKyAgICAgIHRhZ19zdHIgPSBnX3N0cmR1cF9wcmludGYgKCIwLyV1IiwgY291bnQpOworICAgICAgR1NUX0RFQlVHICgiU2V0dGluZyAlcyB0byAlcyAoZnJhbWVfaWQgPSAlcykiLCB0YWcsIHRhZ19zdHIsIGZyYW1lX2lkKTsKKyAgICAgIGZyYW1lID0gbmV3IElEM3YyOjpUZXh0SWRlbnRpZmljYXRpb25GcmFtZSAoZnJhbWVfaWQsIFN0cmluZzo6VVRGOCk7CisgICAgICBpZDN2MnRhZy0+YWRkRnJhbWUgKGZyYW1lKTsKKyAgICAgIGZyYW1lLT5zZXRUZXh0ICh0YWdfc3RyKTsKKyAgICAgIGdfZnJlZSAodGFnX3N0cik7CisgICAgfQorICB9CisKKyAgaWYgKG51bV90YWdzID4gMSkgeworICAgIEdTVF9XQVJOSU5HICgibW9yZSB0aGFuIG9uZSAlcywgY2FuIG9ubHkgaGFuZGxlIG9uZSIsIHRhZyk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2FkZF91bmlxdWVfZmlsZV9pZF90YWcgKElEM3YyOjpUYWcgKiBpZDN2MnRhZywgY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgY29uc3QgZ2NoYXIgKiB0YWcsIGd1aW50IG51bV90YWdzLCBjb25zdCBnY2hhciAqIHVudXNlZCkKK3sKKyAgY29uc3QgZ2NoYXIgKm9yaWdpbiA9ICJodHRwOi8vbXVzaWNicmFpbnoub3JnIjsKKyAgZ2NoYXIgKmlkX3N0ciA9IE5VTEw7CisKKyAgaWYgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nX2luZGV4IChsaXN0LCB0YWcsIDAsICZpZF9zdHIpICYmIGlkX3N0cikgeworICAgIElEM3YyOjpVbmlxdWVGaWxlSWRlbnRpZmllckZyYW1lICogZnJhbWU7CisKKyAgICBHU1RfTE9HICgiQWRkaW5nICVzICglcyk6ICVzIiwgdGFnLCBvcmlnaW4sIGlkX3N0cik7CisgICAgZnJhbWUgPSBuZXcgSUQzdjI6OlVuaXF1ZUZpbGVJZGVudGlmaWVyRnJhbWUgKG9yaWdpbiwgaWRfc3RyKTsKKyAgICBpZDN2MnRhZy0+YWRkRnJhbWUgKGZyYW1lKTsKKyAgICBnX2ZyZWUgKGlkX3N0cik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2FkZF9tdXNpY2JyYWluel90YWcgKElEM3YyOjpUYWcgKiBpZDN2MnRhZywgY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgY29uc3QgZ2NoYXIgKiB0YWcsIGd1aW50IG51bV90YWdzLCBjb25zdCBnY2hhciAqIGRhdGEpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QKKyAgeworICAgIGNvbnN0IGdjaGFyIGdzdF90YWdbMjhdOworICAgIGNvbnN0IGdjaGFyIHNwZWNfaWRbMjhdOworICAgIGNvbnN0IGdjaGFyIHJlYWx3b3JsZF9pZFsyOF07CisgIH0gbWJfaWRzW10gPSB7CisgICAgeworICAgIEdTVF9UQUdfTVVTSUNCUkFJTlpfQVJUSVNUSUQsICJNdXNpY0JyYWlueiBBcnRpc3QgSWQiLAorICAgICAgICAgICJtdXNpY2JyYWluel9hcnRpc3RpZCJ9LCB7CisgICAgR1NUX1RBR19NVVNJQ0JSQUlOWl9BTEJVTUlELCAiTXVzaWNCcmFpbnogQWxidW0gSWQiLCAibXVzaWNicmFpbnpfYWxidW1pZCJ9LCB7CisgICAgR1NUX1RBR19NVVNJQ0JSQUlOWl9BTEJVTUFSVElTVElELCAiTXVzaWNCcmFpbnogQWxidW0gQXJ0aXN0IElkIiwKKyAgICAgICAgICAibXVzaWNicmFpbnpfYWxidW1hcnRpc3RpZCJ9LCB7CisgICAgR1NUX1RBR19NVVNJQ0JSQUlOWl9UUk1JRCwgIk11c2ljQnJhaW56IFRSTSBJZCIsICJtdXNpY2JyYWluel90cm1pZCJ9LCB7CisgICAgR1NUX1RBR19DRERBX01VU0lDQlJBSU5aX0RJU0NJRCwgIk11c2ljQnJhaW56IERpc2NJRCIsCisgICAgICAgICAgIm11c2ljYnJhaW56X2Rpc2NpZCJ9LCB7CisgICAgICAvKiB0aGUgZm9sbG93aW5nIG9uZSBpcyBtb3JlIG9yIGxlc3MgbWFkZSB1cCwgdGhlcmUgc2VlbXMgdG8gYmUgbGl0dGxlCisgICAgICAgKiBldmlkZW5jZSB0aGF0IGFueSBwb3B1bGFyIGFwcGxpY2F0aW9uIGlzIGFjdHVhbGx5IHB1dHRpbmcgdGhpcyBpbmZvCisgICAgICAgKiBpbnRvIFRYWFggZnJhbWVzOyB0aGUgZmlyc3Qgb25lIGNvbWVzIGZyb20gYSBtdXNpY2JyYWlueiB3aWtpICdwcm9wb3NlZAorICAgICAgICogdGFncycgcGFnZSwgdGhlIHNlY29uZCBvbmUgaXMgYW5hbG9ndWUgdG8gdGhlIHZvcmJpcy9hcGUvZmxhYyB0YWcuICovCisgICAgR1NUX1RBR19DRERBX0NEREJfRElTQ0lELCAiQ0REQiBEaXNjSUQiLCAiZGlzY2lkIn0KKyAgfTsKKyAgZ3VpbnQgaSwgaWR4OworCisgIGlkeCA9IChndWludDgpIGRhdGFbMF07CisgIGdfYXNzZXJ0IChpZHggPCBHX05fRUxFTUVOVFMgKG1iX2lkcykpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fdGFnczsgKytpKSB7CisgICAgSUQzdjI6OlVzZXJUZXh0SWRlbnRpZmljYXRpb25GcmFtZSAqIGZyYW1lOworICAgIGdjaGFyICppZF9zdHI7CisKKyAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmdfaW5kZXggKGxpc3QsIHRhZywgMCwgJmlkX3N0cikgJiYgaWRfc3RyKSB7CisgICAgICBHU1RfREVCVUcgKCJTZXR0aW5nICclcycgdG8gJyVzJyIsIG1iX2lkc1tpZHhdLnNwZWNfaWQsIGlkX3N0cik7CisKKyAgICAgIC8qIGFkZCB0d28gZnJhbWVzLCBvbmUgd2l0aCB0aGUgSUQgdGhlIG11c2ljYnJhaW56Lm9yZyBzcGVjIG1lbnRpb25zCisgICAgICAgKiBhbmQgb25lIHdpdGggdGhlIElEIHRoYXQgYXBwbGljYXRpb25zIHVzZSBpbiB0aGUgcmVhbCB3b3JsZCAqLworICAgICAgZnJhbWUgPSBuZXcgSUQzdjI6OlVzZXJUZXh0SWRlbnRpZmljYXRpb25GcmFtZSAoU3RyaW5nOjpMYXRpbjEpOworICAgICAgaWQzdjJ0YWctPmFkZEZyYW1lIChmcmFtZSk7CisgICAgICBmcmFtZS0+c2V0RGVzY3JpcHRpb24gKG1iX2lkc1tpZHhdLnNwZWNfaWQpOworICAgICAgZnJhbWUtPnNldFRleHQgKGlkX3N0cik7CisKKyAgICAgIGZyYW1lID0gbmV3IElEM3YyOjpVc2VyVGV4dElkZW50aWZpY2F0aW9uRnJhbWUgKFN0cmluZzo6TGF0aW4xKTsKKyAgICAgIGlkM3YydGFnLT5hZGRGcmFtZSAoZnJhbWUpOworICAgICAgZnJhbWUtPnNldERlc2NyaXB0aW9uIChtYl9pZHNbaWR4XS5yZWFsd29ybGRfaWQpOworICAgICAgZnJhbWUtPnNldFRleHQgKGlkX3N0cik7CisKKyAgICAgIGdfZnJlZSAoaWRfc3RyKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2FkZF9pZDN2MmZyYW1lX3RhZyAoSUQzdjI6OlRhZyAqIGlkM3YydGFnLCBjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwKKyAgICBjb25zdCBnY2hhciAqIHRhZywgZ3VpbnQgbnVtX3RhZ3MsIGNvbnN0IGdjaGFyICogZnJhbWVfaWQpCit7CisgIElEM3YyOjpGcmFtZUZhY3RvcnkgKiBmYWN0b3J5ID0gSUQzdjI6OkZyYW1lRmFjdG9yeTo6aW5zdGFuY2UgKCk7CisgIGd1aW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV90YWdzOyArK2kpIHsKKyAgICBJRDN2Mjo6RnJhbWUgKiBmcmFtZTsKKyAgICBjb25zdCBHVmFsdWUgKnZhbDsKKyAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICBHc3RTYW1wbGUgKnNhbXBsZTsKKworICAgIHZhbCA9IGdzdF90YWdfbGlzdF9nZXRfdmFsdWVfaW5kZXggKGxpc3QsIHRhZywgaSk7CisgICAgc2FtcGxlID0gKEdzdFNhbXBsZSAqKSBnX3ZhbHVlX2dldF9ib3hlZCAodmFsKTsKKworICAgIGlmIChzYW1wbGUgJiYgKGJ1ZiA9IGdzdF9zYW1wbGVfZ2V0X2J1ZmZlciAoc2FtcGxlKSkgJiYKKyAgICAgICAgZ3N0X3NhbXBsZV9nZXRfY2FwcyAoc2FtcGxlKSkgeworICAgICAgR3N0U3RydWN0dXJlICpzOworICAgICAgZ2ludCB2ZXJzaW9uID0gMDsKKworICAgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGdzdF9zYW1wbGVfZ2V0X2NhcHMgKHNhbXBsZSksIDApOworICAgICAgaWYgKHMgJiYgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAidmVyc2lvbiIsICZ2ZXJzaW9uKSAmJiB2ZXJzaW9uID4gMCkgeworICAgICAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgICBHU1RfREVCVUcgKCJJbmplY3RpbmcgSUQzdjIuJXUgZnJhbWUgJXUvJXUgb2YgbGVuZ3RoICUiIEdfR1NJWkVfRk9STUFUICIgYW5kIHR5cGUgJSIKKyAgICAgICAgICAgIEdTVF9QVFJfRk9STUFULCB2ZXJzaW9uLCBpLCBudW1fdGFncywgbWFwLnNpemUsIHMpOworCisgICAgICAgIGZyYW1lID0gZmFjdG9yeS0+Y3JlYXRlRnJhbWUgKEJ5dGVWZWN0b3IgKChjb25zdCBjaGFyICopIG1hcC5kYXRhLAorICAgICAgICAgICAgICAgIG1hcC5zaXplKSwgKFRhZ0xpYjo6dWludCkgdmVyc2lvbik7CisgICAgICAgIGlmIChmcmFtZSkKKyAgICAgICAgICBpZDN2MnRhZy0+YWRkRnJhbWUgKGZyYW1lKTsKKworICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorYWRkX2ltYWdlX3RhZyAoSUQzdjI6OlRhZyAqIGlkM3YydGFnLCBjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwKKyAgICBjb25zdCBnY2hhciAqIHRhZywgZ3VpbnQgbnVtX3RhZ3MsIGNvbnN0IGdjaGFyICogdW51c2VkKQoreworICBndWludCBuOworCisgIGZvciAobiA9IDA7IG4gPCBudW1fdGFnczsgKytuKSB7CisgICAgY29uc3QgR1ZhbHVlICp2YWw7CisgICAgR3N0U2FtcGxlICpzYW1wbGU7CisgICAgR3N0QnVmZmVyICppbWFnZTsKKworICAgIEdTVF9ERUJVRyAoImltYWdlICV1LyV1IiwgbiArIDEsIG51bV90YWdzKTsKKworICAgIHZhbCA9IGdzdF90YWdfbGlzdF9nZXRfdmFsdWVfaW5kZXggKGxpc3QsIHRhZywgbik7CisgICAgc2FtcGxlID0gKEdzdFNhbXBsZSAqKSBnX3ZhbHVlX2dldF9ib3hlZCAodmFsKTsKKworICAgIGlmIChHU1RfSVNfU0FNUExFIChzYW1wbGUpICYmIChpbWFnZSA9IGdzdF9zYW1wbGVfZ2V0X2J1ZmZlciAoc2FtcGxlKSkgJiYKKyAgICAgICAgR1NUX0lTX0JVRkZFUiAoaW1hZ2UpICYmIGdzdF9idWZmZXJfZ2V0X3NpemUgKGltYWdlKSA+IDAgJiYKKyAgICAgICAgZ3N0X3NhbXBsZV9nZXRfY2FwcyAoc2FtcGxlKSAhPSBOVUxMICYmCisgICAgICAgICFnc3RfY2Fwc19pc19lbXB0eSAoZ3N0X3NhbXBsZV9nZXRfY2FwcyAoc2FtcGxlKSkpIHsKKyAgICAgIGNvbnN0IGdjaGFyICptaW1lX3R5cGU7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChnc3Rfc2FtcGxlX2dldF9jYXBzIChzYW1wbGUpLCAwKTsKKyAgICAgIG1pbWVfdHlwZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHMpOworICAgICAgaWYgKG1pbWVfdHlwZSAhPSBOVUxMKSB7CisgICAgICAgIElEM3YyOjpBdHRhY2hlZFBpY3R1cmVGcmFtZSAqIGZyYW1lOworICAgICAgICBjb25zdCBnY2hhciAqZGVzYyA9IE5VTEw7CisgICAgICAgIEdzdE1hcEluZm8gbWFwOworICAgICAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKmluZm9fc3RydWN0OworCisgICAgICAgIGluZm9fc3RydWN0ID0gZ3N0X3NhbXBsZV9nZXRfaW5mbyAoc2FtcGxlKTsKKyAgICAgICAgaWYgKCFpbmZvX3N0cnVjdAorICAgICAgICAgICAgfHwgIWdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKGluZm9fc3RydWN0LCAiR3N0VGFnSW1hZ2VJbmZvIikpCisgICAgICAgICAgaW5mb19zdHJ1Y3QgPSBOVUxMOworCisgICAgICAgIGlmIChzdHJjbXAgKG1pbWVfdHlwZSwgInRleHQvdXJpLWxpc3QiKSA9PSAwKQorICAgICAgICAgIG1pbWVfdHlwZSA9ICItLT4iOworCisgICAgICAgIGZyYW1lID0gbmV3IElEM3YyOjpBdHRhY2hlZFBpY3R1cmVGcmFtZSAoKTsKKworICAgICAgICBnc3RfYnVmZmVyX21hcCAoaW1hZ2UsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgICAgICAgR1NUX0RFQlVHICgiQXR0YWNoaW5nIHBpY3R1cmUgb2YgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyBhbmQgbWltZSB0eXBlICVzIiwKKyAgICAgICAgICAgIG1hcC5zaXplLCBtaW1lX3R5cGUpOworCisgICAgICAgIGlkM3YydGFnLT5hZGRGcmFtZSAoZnJhbWUpOworICAgICAgICBmcmFtZS0+c2V0UGljdHVyZSAoQnl0ZVZlY3RvciAoKGNvbnN0IGNoYXIgKikgbWFwLmRhdGEsIG1hcC5zaXplKSk7CisgICAgICAgIGZyYW1lLT5zZXRUZXh0RW5jb2RpbmcgKFN0cmluZzo6VVRGOCk7CisgICAgICAgIGZyYW1lLT5zZXRNaW1lVHlwZSAobWltZV90eXBlKTsKKworICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChpbWFnZSwgJm1hcCk7CisKKyAgICAgICAgaWYgKGluZm9fc3RydWN0KQorICAgICAgICAgIGRlc2MgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKGluZm9fc3RydWN0LCAiaW1hZ2UtZGVzY3JpcHRpb24iKTsKKworICAgICAgICBmcmFtZS0+c2V0RGVzY3JpcHRpb24gKChkZXNjKSA/IGRlc2MgOiAiIik7CisKKyAgICAgICAgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX1BSRVZJRVdfSU1BR0UpID09IDApIHsKKyAgICAgICAgICBmcmFtZS0+c2V0VHlwZSAoSUQzdjI6OkF0dGFjaGVkUGljdHVyZUZyYW1lOjpGaWxlSWNvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW50IGltYWdlX3R5cGUgPSBJRDN2Mjo6QXR0YWNoZWRQaWN0dXJlRnJhbWU6Ok90aGVyOworCisgICAgICAgICAgaWYgKGluZm9fc3RydWN0KSB7CisgICAgICAgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXQgKGluZm9fc3RydWN0LCAiaW1hZ2UtdHlwZSIsCisgICAgICAgICAgICAgICAgICAgIEdTVF9UWVBFX1RBR19JTUFHRV9UWVBFLCAmaW1hZ2VfdHlwZSwgTlVMTCkpIHsKKyAgICAgICAgICAgICAgaWYgKGltYWdlX3R5cGUgPiAwICYmIGltYWdlX3R5cGUgPD0gMTgpIHsKKyAgICAgICAgICAgICAgICBpbWFnZV90eXBlICs9IDI7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW1hZ2VfdHlwZSA9IElEM3YyOjpBdHRhY2hlZFBpY3R1cmVGcmFtZTo6T3RoZXI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBmcmFtZS0+c2V0VHlwZSAoKFRhZ0xpYjo6SUQzdjI6OkF0dGFjaGVkUGljdHVyZUZyYW1lOjpUeXBlKSBpbWFnZV90eXBlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklORyAoIk5VTEwgaW1hZ2Ugb3Igbm8gY2FwcyBvbiBpbWFnZSBzYW1wbGUgKCVwLCBjYXBzPSUiCisgICAgICAgICAgR1NUX1BUUl9GT1JNQVQgIikiLCBzYW1wbGUsCisgICAgICAgICAgKHNhbXBsZSkgPyBnc3Rfc2FtcGxlX2dldF9jYXBzIChzYW1wbGUpIDogTlVMTCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCithZGRfY29tbWVudF90YWcgKElEM3YyOjpUYWcgKiBpZDN2MnRhZywgY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgY29uc3QgZ2NoYXIgKiB0YWcsIGd1aW50IG51bV90YWdzLCBjb25zdCBnY2hhciAqIHVudXNlZCkKK3sKKyAgVGFnTGliOjpTdHJpbmdMaXN0IHN0cmluZ19saXN0OworICBndWludCBuOworCisgIEdTVF9MT0cgKCJBZGRpbmcgY29tbWVudCBmcmFtZXMiKTsKKyAgZm9yIChuID0gMDsgbiA8IG51bV90YWdzOyArK24pIHsKKyAgICBnY2hhciAqcyA9IE5VTEw7CisKKyAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmdfaW5kZXggKGxpc3QsIHRhZywgbiwgJnMpICYmIHMgIT0gTlVMTCkgeworICAgICAgSUQzdjI6OkNvbW1lbnRzRnJhbWUgKiBmOworICAgICAgZ2NoYXIgKmRlc2MgPSBOVUxMLCAqdmFsID0gTlVMTCwgKmxhbmcgPSBOVUxMOworCisgICAgICBmID0gbmV3IElEM3YyOjpDb21tZW50c0ZyYW1lIChTdHJpbmc6OlVURjgpOworCisgICAgICBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfQ09NTUVOVCkgPT0gMCB8fAorICAgICAgICAgICFnc3RfdGFnX3BhcnNlX2V4dGVuZGVkX2NvbW1lbnQgKHMsICZkZXNjLCAmbGFuZywgJnZhbCwgVFJVRSkpIHsKKyAgICAgICAgLyogY3JlYXRlIGR1bW15IGRlc2NyaXB0aW9uIHRvIGFsbG93IGZvciBtdWx0aXBsZSBjb21tZW50IGZyYW1lcworICAgICAgICAgKiAodGFnbGliIHdpbGwgZHJvcCBjb21tZW50IGZyYW1lcyBpZiBkZXNjcmlwdGlvbnMgYXJlIG5vdCB1bmlxdWUpICovCisgICAgICAgIGRlc2MgPSBnX3N0cmR1cF9wcmludGYgKCJjJXUiLCBuKTsKKyAgICAgICAgdmFsID0gZ19zdHJkdXAgKHMpOworICAgICAgfQorCisgICAgICBHU1RfTE9HICgiJXNbJXVdID0gJyVzJyAoJXN8JXN8JXMpIiwgdGFnLCBuLCBzLCBHU1RfU1RSX05VTEwgKGRlc2MpLAorICAgICAgICAgIEdTVF9TVFJfTlVMTCAobGFuZyksIEdTVF9TVFJfTlVMTCAodmFsKSk7CisKKyAgICAgIGYtPnNldERlc2NyaXB0aW9uIChkZXNjKTsKKyAgICAgIGYtPnNldFRleHQgKHZhbCk7CisgICAgICBpZiAobGFuZykgeworICAgICAgICBmLT5zZXRMYW5ndWFnZSAobGFuZyk7CisgICAgICB9CisKKyAgICAgIGdfZnJlZSAobGFuZyk7CisgICAgICBnX2ZyZWUgKGRlc2MpOworICAgICAgZ19mcmVlICh2YWwpOworCisgICAgICBpZDN2MnRhZy0+YWRkRnJhbWUgKGYpOworICAgIH0KKyAgICBnX2ZyZWUgKHMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCithZGRfdGV4dF90YWcgKElEM3YyOjpUYWcgKiBpZDN2MnRhZywgY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgY29uc3QgZ2NoYXIgKiB0YWcsIGd1aW50IG51bV90YWdzLCBjb25zdCBnY2hhciAqIGZyYW1lX2lkKQoreworICBJRDN2Mjo6VGV4dElkZW50aWZpY2F0aW9uRnJhbWUgKiBmOworICBUYWdMaWI6OlN0cmluZ0xpc3Qgc3RyaW5nX2xpc3Q7CisgIGd1aW50IG47CisKKyAgR1NUX0xPRyAoIkFkZGluZyAnJXMnIGZyYW1lIiwgZnJhbWVfaWQpOworICBmb3IgKG4gPSAwOyBuIDwgbnVtX3RhZ3M7ICsrbikgeworICAgIGdjaGFyICpzID0gTlVMTDsKKworICAgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZ19pbmRleCAobGlzdCwgdGFnLCBuLCAmcykgJiYgcyAhPSBOVUxMKSB7CisgICAgICBHU1RfTE9HICgiJXM6ICVzWyV1XSA9ICclcyciLCBmcmFtZV9pZCwgdGFnLCBuLCBzKTsKKyAgICAgIHN0cmluZ19saXN0LmFwcGVuZCAoU3RyaW5nIChzLCBTdHJpbmc6OlVURjgpKTsKKyAgICAgIGdfZnJlZSAocyk7CisgICAgfQorICB9CisKKyAgaWYgKCFzdHJpbmdfbGlzdC5pc0VtcHR5ICgpKSB7CisgICAgZiA9IG5ldyBJRDN2Mjo6VGV4dElkZW50aWZpY2F0aW9uRnJhbWUgKGZyYW1lX2lkLCBTdHJpbmc6OlVURjgpOworICAgIGlkM3YydGFnLT5hZGRGcmFtZSAoZik7CisgICAgZi0+c2V0VGV4dCAoc3RyaW5nX2xpc3QpOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HICgiRW1wdHkgbGlzdCBmb3IgdGFnICVzLCBza2lwcGluZyIsIHRhZyk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2FkZF91cmlfdGFnIChJRDN2Mjo6VGFnICogaWQzdjJ0YWcsIGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LAorICAgIGNvbnN0IGdjaGFyICogdGFnLCBndWludCBudW1fdGFncywgY29uc3QgZ2NoYXIgKiBmcmFtZV9pZCkKK3sKKyAgZ2NoYXIgKnVybCA9IE5VTEw7CisKKyAgZ19hc3NlcnQgKGZyYW1lX2lkICE9IE5VTEwpOworCisgIC8qIFVSSSB0YWdzIGFyZSBsaW1pdGVkIHRvIG9uZSBvZiBlYWNoIHBlciB0YWdsaXN0ICovCisgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZ19pbmRleCAobGlzdCwgdGFnLCAwLCAmdXJsKSAmJiB1cmwgIT0gTlVMTCkgeworICAgIGd1aW50IHVybF9sZW47CisKKyAgICB1cmxfbGVuID0gc3RybGVuICh1cmwpOworICAgIGlmICh1cmxfbGVuID4gMCAmJiBnc3RfdXJpX2lzX3ZhbGlkICh1cmwpKSB7CisgICAgICBJRDN2Mjo6RnJhbWVGYWN0b3J5ICogZmFjdG9yeSA9IElEM3YyOjpGcmFtZUZhY3Rvcnk6Omluc3RhbmNlICgpOworICAgICAgSUQzdjI6OkZyYW1lICogZnJhbWU7CisgICAgICBjaGFyICpkYXRhOworCisgICAgICBkYXRhID0gZ19uZXcwIChjaGFyLCAxMCArIHVybF9sZW4pOworCisgICAgICBtZW1jcHkgKGRhdGEsIGZyYW1lX2lkLCA0KTsKKyAgICAgIG1lbWNweSAoZGF0YSArIDQsIElEM3YyOjpTeW5jaERhdGE6OmZyb21VSW50ICh1cmxfbGVuKS5kYXRhICgpLCA0KTsKKyAgICAgIG1lbWNweSAoZGF0YSArIDEwLCB1cmwsIHVybF9sZW4pOworICAgICAgQnl0ZVZlY3RvciBieXRlcyAoZGF0YSwgMTAgKyB1cmxfbGVuKTsKKworICAgICAgZ19mcmVlIChkYXRhKTsKKworICAgICAgZnJhbWUgPSBmYWN0b3J5LT5jcmVhdGVGcmFtZSAoYnl0ZXMsIChUYWdMaWI6OnVpbnQpIDQpOworICAgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIGlkM3YydGFnLT5hZGRGcmFtZSAoZnJhbWUpOworCisgICAgICAgIEdTVF9MT0cgKCIlczogJXMgPSAnJXMnIiwgZnJhbWVfaWQsIHRhZywgdXJsKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkcgKCJUYWcgJXMgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIFVSSSAoJXMpIiwgdGFnLCB1cmwpOworICAgIH0KKworICAgIGdfZnJlZSAodXJsKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorYWRkX3JlbGF0aXZlX3ZvbHVtZV90YWcgKElEM3YyOjpUYWcgKiBpZDN2MnRhZywgY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgY29uc3QgZ2NoYXIgKiB0YWcsIGd1aW50IG51bV90YWdzLCBjb25zdCBnY2hhciAqIGZyYW1lX2lkKQoreworICBjb25zdCBjaGFyICpnYWluX3RhZ19uYW1lOworICBjb25zdCBjaGFyICpwZWFrX3RhZ19uYW1lOworICBnZG91YmxlIHBlYWtfdmFsOworICBnZG91YmxlIGdhaW5fdmFsOworICBJRDN2Mjo6UmVsYXRpdmVWb2x1bWVGcmFtZSAqIGZyYW1lOworCisgIGZyYW1lID0gbmV3IElEM3YyOjpSZWxhdGl2ZVZvbHVtZUZyYW1lICgpOworCisgIC8qIGZpZ3VyZSBvdXQgdGFnIG5hbWVzIGFuZCB0aGUgaWRlbnRpZmljYXRpb24gc3RyaW5nIHRvIHVzZSAqLworICBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfVFJBQ0tfUEVBSykgPT0gMCB8fAorICAgICAgc3RyY21wICh0YWcsIEdTVF9UQUdfVFJBQ0tfR0FJTikgPT0gMCkgeworICAgIGdhaW5fdGFnX25hbWUgPSBHU1RfVEFHX1RSQUNLX0dBSU47CisgICAgcGVha190YWdfbmFtZSA9IEdTVF9UQUdfVFJBQ0tfUEVBSzsKKyAgICBmcmFtZS0+c2V0SWRlbnRpZmljYXRpb24gKCJ0cmFjayIpOworICAgIEdTVF9ERUJVRyAoImFkZGluZyB0cmFjayByZWxhdGl2ZS12b2x1bWUgZnJhbWUiKTsKKyAgfSBlbHNlIHsKKyAgICBnYWluX3RhZ19uYW1lID0gR1NUX1RBR19BTEJVTV9HQUlOOworICAgIHBlYWtfdGFnX25hbWUgPSBHU1RfVEFHX0FMQlVNX1BFQUs7CisgICAgZnJhbWUtPnNldElkZW50aWZpY2F0aW9uICgiYWxidW0iKTsKKyAgICBHU1RfREVCVUcgKCJhZGRpbmcgYWxidW0gcmVsYXRpdmUtdm9sdW1lIGZyYW1lIik7CisgIH0KKworICAvKiBmaW5kIHRoZSB2YWx1ZSBmb3IgdGhlIHBhaXJlZCB0YWcgKGdhaW4sIGlmIHRoaXMgaXMgcGVhaywgYW5kCisgICAqIHZpY2UgdmVyc2EpLiAgaWYgYm90aCB0YWdzIGV4aXN0LCBvbmx5IHdyaXRlIHRoZSBmcmFtZSB3aGVuCisgICAqIHdlJ3JlIHByb2Nlc3NpbmcgdGhlIHBlYWsgdGFnLgorICAgKi8KKyAgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX1RSQUNLX1BFQUspID09IDAgfHwKKyAgICAgIHN0cmNtcCAodGFnLCBHU1RfVEFHX0FMQlVNX1BFQUspID09IDApIHsKKyAgICBJRDN2Mjo6UmVsYXRpdmVWb2x1bWVGcmFtZTo6UGVha1ZvbHVtZSBlbmNvZGVkX3BlYWs7CisgICAgc2hvcnQgcGVha19pbnQ7CisKKyAgICBnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAobGlzdCwgdGFnLCAmcGVha192YWwpOworCisgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfdGFnX3NpemUgKGxpc3QsIGdhaW5fdGFnX25hbWUpID4gMCkgeworICAgICAgZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKGxpc3QsIGdhaW5fdGFnX25hbWUsICZnYWluX3ZhbCk7CisgICAgICBHU1RfREVCVUcgKCJzZXR0aW5nIHZvbHVtZSBhZGp1c3RtZW50ICVnIiwgZ2Fpbl92YWwpOworICAgICAgZnJhbWUtPnNldFZvbHVtZUFkanVzdG1lbnQgKGdhaW5fdmFsKTsKKyAgICB9CisKKyAgICAvKiBjb3B5aW5nIG11dGFnZW46IGFsd2F5cyB3cml0ZSBhcyAxNiBiaXRzIGZvciBzYW5pdHkuICovCisgICAgcGVha19pbnQgPSAoc2hvcnQpKHBlYWtfdmFsICogR19NQVhTSE9SVCk7CisgICAgZW5jb2RlZF9wZWFrLmJpdHNSZXByZXNlbnRpbmdQZWFrID0gMTY7CisgICAgZW5jb2RlZF9wZWFrLnBlYWtWb2x1bWUgPSBCeXRlVmVjdG9yOjpmcm9tU2hvcnQocGVha19pbnQsIHRydWUpOworICAgIEdTVF9ERUJVRyAoInNldHRpbmcgcGVhayB2YWx1ZSAlZyIsIHBlYWtfdmFsKTsKKyAgICBmcmFtZS0+c2V0UGVha1ZvbHVtZShlbmNvZGVkX3BlYWspOworCisgIH0gZWxzZSB7CisgICAgZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKGxpc3QsIHRhZywgJmdhaW5fdmFsKTsKKyAgICBHU1RfREVCVUcgKCJzZXR0aW5nIHZvbHVtZSBhZGp1c3RtZW50ICVnIiwgZ2Fpbl92YWwpOworICAgIGZyYW1lLT5zZXRWb2x1bWVBZGp1c3RtZW50IChnYWluX3ZhbCk7CisKKyAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF90YWdfc2l6ZSAobGlzdCwgcGVha190YWdfbmFtZSkgIT0gMCkgeworICAgICAgR1NUX0RFQlVHICgiYm90aCBnYWluIGFuZCBwZWFrIHRhZ3MgZXhpc3QsIG5vdCBhZGRpbmcgZnJhbWUgdGhpcyB0aW1lIGFyb3VuZCIpOworICAgICAgZGVsZXRlIGZyYW1lOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIGlkM3YydGFnLT5hZGRGcmFtZSAoZnJhbWUpOworfQorCitzdGF0aWMgdm9pZAorYWRkX2JwbV90YWcgKElEM3YyOjpUYWcgKiBpZDN2MnRhZywgY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgY29uc3QgZ2NoYXIgKiB0YWcsIGd1aW50IG51bV90YWdzLCBjb25zdCBnY2hhciAqIGZyYW1lX2lkKQoreworICBnZG91YmxlIGJwbTsKKworICBpZiAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGVfaW5kZXggKGxpc3QsIHRhZywgMCwgJmJwbSkpIHsKKyAgICBJRDN2Mjo6VGV4dElkZW50aWZpY2F0aW9uRnJhbWUgKiBmcmFtZTsKKyAgICBnY2hhciAqdGFnX3N0cjsKKworICAgIHRhZ19zdHIgPSBnX3N0cmR1cF9wcmludGYgKCIldSIsIChndWludClicG0pOworCisgICAgR1NUX0RFQlVHICgiU2V0dGluZyAlcyB0byAlcyIsIHRhZywgdGFnX3N0cik7CisgICAgZnJhbWUgPSBuZXcgSUQzdjI6OlRleHRJZGVudGlmaWNhdGlvbkZyYW1lICgiVEJQTSIsIFN0cmluZzo6VVRGOCk7CisgICAgaWQzdjJ0YWctPmFkZEZyYW1lIChmcmFtZSk7CisgICAgZnJhbWUtPnNldFRleHQgKHRhZ19zdHIpOworICAgIGdfZnJlZSAodGFnX3N0cik7CisgIH0KK30KKworLyogaWQzZGVtdXggcHJvZHVjZXMgdGhlc2UgZm9yIGZyYW1lcyBpdCBjYW5ub3QgcGFyc2UgKi8KKyNkZWZpbmUgR1NUX0lEM19ERU1VWF9UQUdfSUQzVjJfRlJBTUUgInByaXZhdGUtaWQzdjItZnJhbWUiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QKK3sKKyAgY29uc3QgZ2NoYXIgKmdzdF90YWc7CisgIGNvbnN0IEdzdElkM3YyTXV4QWRkVGFnRnVuYyBmdW5jOworICBjb25zdCBnY2hhciBkYXRhWzVdOworfSBhZGRfZnVuY3NbXSA9IHsKKyAgeworICBHU1RfVEFHX0FSVElTVCwgYWRkX3RleHRfdGFnLCAiVFBFMSJ9LCB7CisgIEdTVF9UQUdfQUxCVU1fQVJUSVNULCBhZGRfdGV4dF90YWcsICJUUEUyIn0sIHsKKyAgR1NUX1RBR19USVRMRSwgYWRkX3RleHRfdGFnLCAiVElUMiJ9LCB7CisgIEdTVF9UQUdfQUxCVU0sIGFkZF90ZXh0X3RhZywgIlRBTEIifSwgeworICBHU1RfVEFHX0NPUFlSSUdIVCwgYWRkX3RleHRfdGFnLCAiVENPUCJ9LCB7CisgIEdTVF9UQUdfQ09NUE9TRVIsIGFkZF90ZXh0X3RhZywgIlRDT00ifSwgeworICBHU1RfVEFHX0dFTlJFLCBhZGRfdGV4dF90YWcsICJUQ09OIn0sIHsKKyAgR1NUX1RBR19DT01NRU5ULCBhZGRfY29tbWVudF90YWcsICIifSwgeworICBHU1RfVEFHX0VYVEVOREVEX0NPTU1FTlQsIGFkZF9jb21tZW50X3RhZywgIiJ9LCB7CisgIEdTVF9UQUdfREFURSwgYWRkX2RhdGVfdGFnLCAiIn0sIHsKKyAgR1NUX1RBR19JTUFHRSwgYWRkX2ltYWdlX3RhZywgIiJ9LCB7CisgIEdTVF9UQUdfUFJFVklFV19JTUFHRSwgYWRkX2ltYWdlX3RhZywgIiJ9LCB7CisgIEdTVF9JRDNfREVNVVhfVEFHX0lEM1YyX0ZSQU1FLCBhZGRfaWQzdjJmcmFtZV90YWcsICIifSwgeworICBHU1RfVEFHX01VU0lDQlJBSU5aX0FSVElTVElELCBhZGRfbXVzaWNicmFpbnpfdGFnLCAiXDAwMCJ9LCB7CisgIEdTVF9UQUdfTVVTSUNCUkFJTlpfQUxCVU1JRCwgYWRkX211c2ljYnJhaW56X3RhZywgIlwwMDEifSwgeworICBHU1RfVEFHX01VU0lDQlJBSU5aX0FMQlVNQVJUSVNUSUQsIGFkZF9tdXNpY2JyYWluel90YWcsICJcMDAyIn0sIHsKKyAgR1NUX1RBR19NVVNJQ0JSQUlOWl9UUk1JRCwgYWRkX211c2ljYnJhaW56X3RhZywgIlwwMDMifSwgeworICBHU1RfVEFHX0NEREFfTVVTSUNCUkFJTlpfRElTQ0lELCBhZGRfbXVzaWNicmFpbnpfdGFnLCAiXDAwNCJ9LCB7CisgIEdTVF9UQUdfQ0REQV9DRERCX0RJU0NJRCwgYWRkX211c2ljYnJhaW56X3RhZywgIlwwMDUifSwgeworICBHU1RfVEFHX01VU0lDQlJBSU5aX1RSQUNLSUQsIGFkZF91bmlxdWVfZmlsZV9pZF90YWcsICIifSwgeworICBHU1RfVEFHX0FSVElTVF9TT1JUTkFNRSwgYWRkX3RleHRfdGFnLCAiVFNPUCJ9LCB7CisgIEdTVF9UQUdfQUxCVU1fU09SVE5BTUUsIGFkZF90ZXh0X3RhZywgIlRTT0EifSwgeworICBHU1RfVEFHX1RJVExFX1NPUlROQU1FLCBhZGRfdGV4dF90YWcsICJUU09UIn0sIHsKKyAgR1NUX1RBR19UUkFDS19OVU1CRVIsIGFkZF9jb3VudF9vcl9udW1fdGFnLCAiVFJDSyJ9LCB7CisgIEdTVF9UQUdfVFJBQ0tfQ09VTlQsIGFkZF9jb3VudF9vcl9udW1fdGFnLCAiVFJDSyJ9LCB7CisgIEdTVF9UQUdfQUxCVU1fVk9MVU1FX05VTUJFUiwgYWRkX2NvdW50X29yX251bV90YWcsICJUUE9TIn0sIHsKKyAgR1NUX1RBR19BTEJVTV9WT0xVTUVfQ09VTlQsIGFkZF9jb3VudF9vcl9udW1fdGFnLCAiVFBPUyJ9LCB7CisgIEdTVF9UQUdfRU5DT0RFUiwgYWRkX2VuY29kZXJfdGFnLCAiIn0sIHsKKyAgR1NUX1RBR19FTkNPREVSX1ZFUlNJT04sIGFkZF9lbmNvZGVyX3RhZywgIiJ9LCB7CisgIEdTVF9UQUdfQ09QWVJJR0hUX1VSSSwgYWRkX3VyaV90YWcsICJXQ09QIn0sIHsKKyAgR1NUX1RBR19MSUNFTlNFX1VSSSwgYWRkX3VyaV90YWcsICJXQ09QIn0sIHsKKyAgR1NUX1RBR19UUkFDS19QRUFLLCBhZGRfcmVsYXRpdmVfdm9sdW1lX3RhZywgIiJ9LCB7CisgIEdTVF9UQUdfVFJBQ0tfR0FJTiwgYWRkX3JlbGF0aXZlX3ZvbHVtZV90YWcsICIifSwgeworICBHU1RfVEFHX0FMQlVNX1BFQUssIGFkZF9yZWxhdGl2ZV92b2x1bWVfdGFnLCAiIn0sIHsKKyAgR1NUX1RBR19BTEJVTV9HQUlOLCBhZGRfcmVsYXRpdmVfdm9sdW1lX3RhZywgIiJ9LCB7CisgIEdTVF9UQUdfQkVBVFNfUEVSX01JTlVURSwgYWRkX2JwbV90YWcsICIifQorfTsKKworCitzdGF0aWMgdm9pZAorZm9yZWFjaF9hZGRfdGFnIChjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwgY29uc3QgZ2NoYXIgKiB0YWcsIGdwb2ludGVyIHVzZXJkYXRhKQoreworICBJRDN2Mjo6VGFnICogaWQzdjJ0YWcgPSAoSUQzdjI6OlRhZyAqKSB1c2VyZGF0YTsKKyAgVGFnTGliOjpTdHJpbmdMaXN0IHN0cmluZ19saXN0OworICBndWludCBudW1fdGFncywgaTsKKworICBudW1fdGFncyA9IGdzdF90YWdfbGlzdF9nZXRfdGFnX3NpemUgKGxpc3QsIHRhZyk7CisKKyAgR1NUX0xPRyAoIlByb2Nlc3NpbmcgdGFnICVzIChudW09JXUpIiwgdGFnLCBudW1fdGFncyk7CisKKyAgaWYgKG51bV90YWdzID4gMSAmJiBnc3RfdGFnX2lzX2ZpeGVkICh0YWcpKSB7CisgICAgR1NUX1dBUk5JTkcgKCJNdWx0aXBsZSBvY2N1cmVuY2VzIG9mIGZpeGVkIHRhZyAnJXMnLCBpZ25vcmluZyBzb21lIiwgdGFnKTsKKyAgICBudW1fdGFncyA9IDE7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChhZGRfZnVuY3MpOyArK2kpIHsKKyAgICBpZiAoc3RyY21wIChhZGRfZnVuY3NbaV0uZ3N0X3RhZywgdGFnKSA9PSAwKSB7CisgICAgICBhZGRfZnVuY3NbaV0uZnVuYyAoaWQzdjJ0YWcsIGxpc3QsIHRhZywgbnVtX3RhZ3MsIGFkZF9mdW5jc1tpXS5kYXRhKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChpID09IEdfTl9FTEVNRU5UUyAoYWRkX2Z1bmNzKSkgeworICAgIEdTVF9XQVJOSU5HICgiVW5zdXBwb3J0ZWQgdGFnICclcycgLSBub3Qgd3JpdHRlbiIsIHRhZyk7CisgIH0KK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfaWQzdjJfbXV4X3JlbmRlcl90YWcgKEdzdFRhZ011eCAqIG11eCwgY29uc3QgR3N0VGFnTGlzdCAqIHRhZ2xpc3QpCit7CisgIElEM3YyOjpUYWcgaWQzdjJ0YWc7CisgIEJ5dGVWZWN0b3IgcmVuZGVyZWRfdGFnOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgZ3VpbnQgdGFnX3NpemU7CisKKyAgLyogd3JpdGUgYWxsIHN0cmluZ3MgYXMgVVRGLTggYnkgZGVmYXVsdCAqLworICBUYWdMaWI6OklEM3YyOjpGcmFtZUZhY3Rvcnk6Omluc3RhbmNlICgpLT4KKyAgICAgIHNldERlZmF1bHRUZXh0RW5jb2RpbmcgKFRhZ0xpYjo6U3RyaW5nOjpVVEY4KTsKKworICAvKiBSZW5kZXIgdGhlIHRhZyAqLworICBnc3RfdGFnX2xpc3RfZm9yZWFjaCAodGFnbGlzdCwgZm9yZWFjaF9hZGRfdGFnLCAmaWQzdjJ0YWcpOworCisjaWYgMAorICAvKiBEbyB3ZSB3YW50IHRvIGFkZCBvdXIgb3duIHNpZ25hdHVyZSB0byB0aGUgdGFnIHNvbWV3aGVyZT8gKi8KKyAgeworICAgIGdjaGFyICp0YWdfcHJvZHVjZXJfc3RyOworCisgICAgdGFnX3Byb2R1Y2VyX3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIihHU3RyZWFtZXIgaWQzdjJtdXggJXMsIHVzaW5nICIKKyAgICAgICAgInRhZ2xpYiAldS4ldSkiLCBWRVJTSU9OLCBUQUdMSUJfTUFKT1JfVkVSU0lPTiwgVEFHTElCX01JTk9SX1ZFUlNJT04pOworICAgIGFkZF9vbmVfdHh4eF90YWcgKGlkM3YydGFnLCAidGFnX2VuY29kZXIiLCB0YWdfcHJvZHVjZXJfc3RyKTsKKyAgICBnX2ZyZWUgKHRhZ19wcm9kdWNlcl9zdHIpOworICB9CisjZW5kaWYKKworICByZW5kZXJlZF90YWcgPSBpZDN2MnRhZy5yZW5kZXIgKCk7CisgIHRhZ19zaXplID0gcmVuZGVyZWRfdGFnLnNpemUgKCk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKG11eCwgInRhZyBzaXplID0gJWQgYnl0ZXMiLCB0YWdfc2l6ZSk7CisKKyAgLyogQ3JlYXRlIGJ1ZmZlciB3aXRoIHRhZyAqLworICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHRhZ19zaXplKTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIHJlbmRlcmVkX3RhZy5kYXRhICgpLCB0YWdfc2l6ZSk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfaWQzdjJfbXV4X3JlbmRlcl9lbmRfdGFnIChHc3RUYWdNdXggKiBtdXgsIGNvbnN0IEdzdFRhZ0xpc3QgKiB0YWdsaXN0KQoreworICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2V4dC90YWdsaWIvZ3N0aWQzdjJtdXguaCBiL2V4dC90YWdsaWIvZ3N0aWQzdjJtdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmM3NDhmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3RhZ2xpYi9nc3RpZDN2Mm11eC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIEdTdHJlYW1lciB0YWdsaWItYmFzZWQgSUQzdjIgbXV4ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBDaHJpc3RvcGhlIEZlcmdlYXUgPHRldWZAZ25vbWUub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBHU1RfSUQzVjJfTVVYX0gKKyNkZWZpbmUgR1NUX0lEM1YyX01VWF9ICisKKyNpbmNsdWRlIDxnc3QvdGFnL2dzdHRhZ211eC5oPgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RJZDN2Mk11eCBHc3RJZDN2Mk11eDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RJZDN2Mk11eENsYXNzIEdzdElkM3YyTXV4Q2xhc3M7CisKK3N0cnVjdCBfR3N0SWQzdjJNdXggeworICBHc3RUYWdNdXggIHRhZ211eDsKK307CisKK3N0cnVjdCBfR3N0SWQzdjJNdXhDbGFzcyB7CisgIEdzdFRhZ011eENsYXNzICB0YWdtdXhfY2xhc3M7Cit9OworCisjZGVmaW5lIEdTVF9UWVBFX0lEM1YyX01VWCBcCisgIChnc3RfaWQzdjJfbXV4X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9JRDNWMl9NVVgob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9JRDNWMl9NVVgsR3N0SWQzdjJNdXgpKQorI2RlZmluZSBHU1RfSUQzVjJfTVVYX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0lEM1YyX01VWCxHc3RJZDN2Mk11eENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0lEM1YyX01VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0lEM1YyX01VWCkpCisjZGVmaW5lIEdTVF9JU19JRDNWMl9NVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfSUQzVjJfTVVYKSkKKworR1R5cGUgZ3N0X2lkM3YyX211eF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBHU1RfSUQzVjJfTVVYX0ggKi8KZGlmZiAtLWdpdCBhL2V4dC90YWdsaWIvZ3N0dGFnbGlicGx1Z2luLmMgYi9leHQvdGFnbGliL2dzdHRhZ2xpYnBsdWdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZTZiZjYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdGFnbGliL2dzdHRhZ2xpYnBsdWdpbi5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qIEdTdHJlYW1lciB0YWdsaWItYmFzZWQgbXV4ZXIgYmFzZSBjbGFzcworICogQ29weXJpZ2h0IChDKSAyMDA2IENocmlzdG9waGUgRmVyZ2VhdSAgPHRldWZAZ25vbWUub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RhcGV2Mm11eC5oIgorI2luY2x1ZGUgImdzdGlkM3YybXV4LmgiCisKKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImlkM3YybXV4IiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9JRDNWMl9NVVgpIHx8CisgICAgICAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImFwZXYybXV4IiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9BUEVWMl9NVVgpKQorICAgIHJldHVybiBGQUxTRTsKKworICBnc3RfdGFnX3JlZ2lzdGVyX211c2ljYnJhaW56X3RhZ3MgKCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICB0YWdsaWIsCisgICAgIlRhZyB3cml0aW5nIHBsdWctaW4gYmFzZWQgb24gdGFnbGliIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pOwpkaWZmIC0tZ2l0IGEvZXh0L3RhZ2xpYi9tZXNvbi5idWlsZCBiL2V4dC90YWdsaWIvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxZjliNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC90YWdsaWIvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwyOCBAQAordGFnbGliX3NvdXJjZXMgPSBbCisgICdnc3RhcGV2Mm11eC5jYycsCisgICdnc3RpZDN2Mm11eC5jYycsCisgICdnc3R0YWdsaWJwbHVnaW4uYycsCitdCisKK3RhZ2xpYl9kZXAgPSBkZXBlbmRlbmN5KCd0YWdsaWInLCB2ZXJzaW9uIDogJz49IDEuNScsIHJlcXVpcmVkIDogZmFsc2UpCisKK2lmIHRhZ2xpYl9kZXAuZm91bmQoKSBhbmQgYWRkX2xhbmd1YWdlcygnY3BwJywgcmVxdWlyZWQgOiBmYWxzZSkKKyAgZXh0cmFfYXJncyA9IFtdCisgIGN4eCA9IG1lc29uLmdldF9jb21waWxlcignY3BwJykKKyAgaWYgY3h4Lmhhc19hcmd1bWVudCgnLWZ2aXNpYmlsaXR5PWhpZGRlbicpCisgICAgZXh0cmFfYXJncyArPSBbJy1mdmlzaWJpbGl0eT1oaWRkZW4nXQorICBlbmRpZgorICBpZiBjeHguaGFzX2FyZ3VtZW50KCctZm5vLXN0cmljdC1hbGlhc2luZycpCisgICAgZXh0cmFfYXJncyArPSBbJy1mbm8tc3RyaWN0LWFsaWFzaW5nJ10KKyAgZW5kaWYKKworICBnc3R0YWdsaWIgPSBsaWJyYXJ5KCdnc3R0YWdsaWInLAorICAgIHRhZ2xpYl9zb3VyY2VzLAorICAgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncyArIFsnLURHU1RfVVNFX1VOU1RBQkxFX0FQSSddLAorICAgIGNwcF9hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzICsgWyctREdTVF9VU0VfVU5TVEFCTEVfQVBJJ10gKyBleHRyYV9hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3N0dGFnX2RlcCwgdGFnbGliX2RlcF0sCisgICAgaW5zdGFsbCA6IHRydWUsCisgICAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorICApCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L3R3b2xhbWUvTWFrZWZpbGUuYW0gYi9leHQvdHdvbGFtZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjJlZTIwCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3R3b2xhbWUvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0dHdvbGFtZS5sYQorCitsaWJnc3R0d29sYW1lX2xhX1NPVVJDRVMgPSBnc3R0d29sYW1lbXAyZW5jLmMKK2xpYmdzdHR3b2xhbWVfbGFfQ0ZMQUdTID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgJChUV09MQU1FX0NGTEFHUykKK2xpYmdzdHR3b2xhbWVfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwktbGdzdGF1ZGlvLUBHU1RfQVBJX1ZFUlNJT05AIC1sZ3N0cGJ1dGlscy1AR1NUX0FQSV9WRVJTSU9OQCBcCisJJChHU1RfTElCUykgJChUV09MQU1FX0xJQlMpCitsaWJnc3R0d29sYW1lX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3R0d29sYW1lbXAyZW5jLmgKZGlmZiAtLWdpdCBhL2V4dC90d29sYW1lL2dzdHR3b2xhbWVtcDJlbmMuYyBiL2V4dC90d29sYW1lL2dzdHR3b2xhbWVtcDJlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWJlYzZiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3R3b2xhbWUvZ3N0dHdvbGFtZW1wMmVuYy5jCkBAIC0wLDAgKzEsODkzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA0PiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorICogQ29weXJpZ2h0IChDKSA8MjAwOD4gU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIEJhc2VkIG9uIHRoZSBsYW1lIGVsZW1lbnQuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtdHdvbGFtZQorICogQHNlZV9hbHNvOiBtYWQsIGxhbWUKKyAqCisgKiBUaGlzIGVsZW1lbnQgZW5jb2RlcyByYXcgaW50ZWdlciBhdWRpbyBpbnRvIGFuIE1QRUctMSBsYXllciAyIChNUDIpIHN0cmVhbS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyB3YXZlPXNpbmUgbnVtLWJ1ZmZlcnM9MTAwICEgYXVkaW9jb252ZXJ0ICEgdHdvbGFtZSAhIGZpbGVzaW5rIGxvY2F0aW9uPXNpbmUubXAyCisgKiBdfCBFbmNvZGUgYSB0ZXN0IHNpbmUgc2lnbmFsIHRvIE1QMi4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBhbHNhc3JjICEgYXVkaW9jb252ZXJ0ICEgdHdvbGFtZSBiaXRyYXRlPTE5MiAhIGZpbGVzaW5rIGxvY2F0aW9uPWFsc2FzcmMubXAyCisgKiBdfCBSZWNvcmQgZnJvbSBhIHNvdW5kIGNhcmQgdXNpbmcgQUxTQSBhbmQgZW5jb2RlIHRvIE1QMgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249bXVzaWMud2F2ICEgZGVjb2RlYmluICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIHR3b2xhbWUgYml0cmF0ZT0xOTIgISBpZDN2Mm11eCAhIGZpbGVzaW5rIGxvY2F0aW9uPW11c2ljLm1wMgorICogXXwgVHJhbnNjb2RlIGZyb20gYSAud2F2IGZpbGUgdG8gTVAyICh0aGUgaWQzdjJtdXggZWxlbWVudCBpcyBvcHRpb25hbCkKKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBjZGRhOi8vNSAhIGF1ZGlvY29udmVydCAhIHR3b2xhbWUgYml0cmF0ZT0xOTIgISBmaWxlc2luayBsb2NhdGlvbj10cmFjazUubXAyCisgKiBdfCBFbmNvZGUgQXVkaW8gQ0QgdHJhY2sgNSB0byBNUDIKKyAqIDwvcmVmc2VjdDI+CisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgImdzdHR3b2xhbWVtcDJlbmMuaCIKKyNpbmNsdWRlICJnc3QvZ3N0LWkxOG4tcGx1Z2luLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGRlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGRlYnVnCisKKy8qIFR3b0xBTUUgY2FuIGRvIE1QRUctMSwgTVBFRy0yIHNvIGl0IGhhcyA2IHBvc3NpYmxlCisgKiBzYW1wbGUgcmF0ZXMgaXQgc3VwcG9ydHMgKi8KK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfdHdvX2xhbWVfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgIiBHU1RfQVVESU9fTkUgKEYzMikgIiwgIiBHU1RfQVVESU9fTkUgKFMxNikgIiB9LCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIHsgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDE7ICIKKyAgICAgICAgImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSB7ICIgR1NUX0FVRElPX05FIChGMzIpICIsICIgR1NUX0FVRElPX05FIChTMTYpICIgfSwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSB7IDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAgfSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAyLCIgImNoYW5uZWwtbWFzayA9IChiaXRtYXNrKSAweDMiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfdHdvX2xhbWVfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby9tcGVnLCAiCisgICAgICAgICJtcGVndmVyc2lvbiA9IChpbnQpIDEsICIKKyAgICAgICAgImxheWVyID0gKGludCkgMiwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIHsgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdIikKKyAgICApOworCitzdGF0aWMgc3RydWN0Cit7CisgIGdpbnQgbW9kZTsKKyAgZ2ludCBwc3ltb2RlbDsKKyAgZ2ludCBiaXRyYXRlOworICBnaW50IHBhZGRpbmc7CisgIGdib29sZWFuIGVuZXJneV9sZXZlbF9leHRlbnNpb247CisgIGdpbnQgZW1waGFzaXM7CisgIGdib29sZWFuIGVycm9yX3Byb3RlY3Rpb247CisgIGdib29sZWFuIGNvcHlyaWdodDsKKyAgZ2Jvb2xlYW4gb3JpZ2luYWw7CisgIGdib29sZWFuIHZicjsKKyAgZ2Zsb2F0IHZicl9sZXZlbDsKKyAgZ2Zsb2F0IGF0aF9sZXZlbDsKKyAgZ2ludCB2YnJfbWF4X2JpdHJhdGU7CisgIGdib29sZWFuIHF1aWNrX21vZGU7CisgIGdpbnQgcXVpY2tfbW9kZV9jb3VudDsKK30gZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3M7CisKKy8qKioqKioqKioqIERlZmluZSB1c2VmdWwgdHlwZXMgZm9yIG5vbi1wcm9ncmFtbWF0aWMgaW50ZXJmYWNlcyAqKioqKioqKioqLworI2RlZmluZSBHU1RfVFlQRV9UV09fTEFNRV9NT0RFIChnc3RfdHdvX2xhbWVfbW9kZV9nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3RfdHdvX2xhbWVfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHR3b19sYW1lX21vZGVfdHlwZSA9IDA7CisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHR3b19sYW1lX21vZGVzW10gPSB7CisgICAge1RXT0xBTUVfQVVUT19NT0RFLCAiQXV0byIsICJhdXRvIn0sCisgICAge1RXT0xBTUVfU1RFUkVPLCAiU3RlcmVvIiwgInN0ZXJlbyJ9LAorICAgIHtUV09MQU1FX0pPSU5UX1NURVJFTywgIkpvaW50IFN0ZXJlbyIsICJqb2ludCJ9LAorICAgIHtUV09MQU1FX0RVQUxfQ0hBTk5FTCwgIkR1YWwgQ2hhbm5lbCIsICJkdWFsIn0sCisgICAge1RXT0xBTUVfTU9OTywgIk1vbm8iLCAibW9ubyJ9LAorICAgIHswLCBOVUxMLCBOVUxMfQorICB9OworCisgIGlmICghdHdvX2xhbWVfbW9kZV90eXBlKSB7CisgICAgdHdvX2xhbWVfbW9kZV90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFR3b0xhbWVNb2RlIiwgdHdvX2xhbWVfbW9kZXMpOworICB9CisgIHJldHVybiB0d29fbGFtZV9tb2RlX3R5cGU7Cit9CisKKyNkZWZpbmUgR1NUX1RZUEVfVFdPX0xBTUVfUEFERElORyAoZ3N0X3R3b19sYW1lX3BhZGRpbmdfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3R3b19sYW1lX3BhZGRpbmdfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB0d29fbGFtZV9wYWRkaW5nX3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSB0d29fbGFtZV9wYWRkaW5nW10gPSB7CisgICAge1RXT0xBTUVfUEFEX05PLCAiTm8gUGFkZGluZyIsICJuZXZlciJ9LAorICAgIHtUV09MQU1FX1BBRF9BTEwsICJBbHdheXMgUGFkIiwgImFsd2F5cyJ9LAorICAgIHswLCBOVUxMLCBOVUxMfQorICB9OworCisgIGlmICghdHdvX2xhbWVfcGFkZGluZ190eXBlKSB7CisgICAgdHdvX2xhbWVfcGFkZGluZ190eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFR3b0xhbWVQYWRkaW5nIiwgdHdvX2xhbWVfcGFkZGluZyk7CisgIH0KKyAgcmV0dXJuIHR3b19sYW1lX3BhZGRpbmdfdHlwZTsKK30KKworI2RlZmluZSBHU1RfVFlQRV9UV09fTEFNRV9FTVBIQVNJUyAoZ3N0X3R3b19sYW1lX2VtcGhhc2lzX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF90d29fbGFtZV9lbXBoYXNpc19nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHR3b19sYW1lX2VtcGhhc2lzX3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSB0d29fbGFtZV9lbXBoYXNpc1tdID0geworICAgIHtUV09MQU1FX0VNUEhBU0lTX04sICJObyBlbXBoYXNpcyIsICJub25lIn0sCisgICAge1RXT0xBTUVfRU1QSEFTSVNfNSwgIjUwLzE1IG1zIiwgIjUifSwKKyAgICB7VFdPTEFNRV9FTVBIQVNJU19DLCAiQ0NJVCBKLjE3IiwgImNjaXQifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0KKyAgfTsKKworICBpZiAoIXR3b19sYW1lX2VtcGhhc2lzX3R5cGUpIHsKKyAgICB0d29fbGFtZV9lbXBoYXNpc190eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFR3b0xhbWVFbXBoYXNpcyIsIHR3b19sYW1lX2VtcGhhc2lzKTsKKyAgfQorCisgIHJldHVybiB0d29fbGFtZV9lbXBoYXNpc190eXBlOworfQorCisvKioqKioqKioqKiBTdGFuZGFyZCBzdHVmZiBmb3Igc2lnbmFscyBhbmQgYXJndW1lbnRzICoqKioqKioqKiovCisKK2VudW0KK3sKKyAgQVJHXzAsCisgIEFSR19NT0RFLAorICBBUkdfUFNZTU9ERUwsCisgIEFSR19CSVRSQVRFLAorICBBUkdfUEFERElORywKKyAgQVJHX0VORVJHWV9MRVZFTF9FWFRFTlNJT04sCisgIEFSR19FTVBIQVNJUywKKyAgQVJHX0VSUk9SX1BST1RFQ1RJT04sCisgIEFSR19DT1BZUklHSFQsCisgIEFSR19PUklHSU5BTCwKKyAgQVJHX1ZCUiwKKyAgQVJHX1ZCUl9MRVZFTCwKKyAgQVJHX0FUSF9MRVZFTCwKKyAgQVJHX1ZCUl9NQVhfQklUUkFURSwKKyAgQVJHX1FVSUNLX01PREUsCisgIEFSR19RVUlDS19NT0RFX0NPVU5UCit9OworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3R3b19sYW1lX3N0YXJ0IChHc3RBdWRpb0VuY29kZXIgKiBlbmMpOworc3RhdGljIGdib29sZWFuIGdzdF90d29fbGFtZV9zdG9wIChHc3RBdWRpb0VuY29kZXIgKiBlbmMpOworc3RhdGljIGdib29sZWFuIGdzdF90d29fbGFtZV9zZXRfZm9ybWF0IChHc3RBdWRpb0VuY29kZXIgKiBlbmMsCisgICAgR3N0QXVkaW9JbmZvICogaW5mbyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfdHdvX2xhbWVfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0VuY29kZXIgKiBlbmMsCisgICAgR3N0QnVmZmVyICogaW5fYnVmKTsKK3N0YXRpYyB2b2lkIGdzdF90d29fbGFtZV9mbHVzaCAoR3N0QXVkaW9FbmNvZGVyICogZW5jKTsKKworc3RhdGljIHZvaWQgZ3N0X3R3b19sYW1lX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF90d29fbGFtZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3R3b19sYW1lX3NldHVwIChHc3RUd29MYW1lICogdHdvbGFtZSk7CisKK0dfREVGSU5FX1RZUEUgKEdzdFR3b0xhbWUsIGdzdF90d29fbGFtZSwgR1NUX1RZUEVfQVVESU9fRU5DT0RFUik7CisKK3N0YXRpYyB2b2lkCitnc3RfdHdvX2xhbWVfcmVsZWFzZV9tZW1vcnkgKEdzdFR3b0xhbWUgKiB0d29sYW1lKQoreworICBpZiAodHdvbGFtZS0+Z2xvcHRzKSB7CisgICAgdHdvbGFtZV9jbG9zZSAoJnR3b2xhbWUtPmdsb3B0cyk7CisgICAgdHdvbGFtZS0+Z2xvcHRzID0gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3R3b19sYW1lX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqKQoreworICBnc3RfdHdvX2xhbWVfcmVsZWFzZV9tZW1vcnkgKEdTVF9UV09fTEFNRSAob2JqKSk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF90d29fbGFtZV9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF90d29fbGFtZV9jbGFzc19pbml0IChHc3RUd29MYW1lQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RBdWRpb0VuY29kZXJDbGFzcyAqZ3N0YmFzZV9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmFzZV9jbGFzcyA9IChHc3RBdWRpb0VuY29kZXJDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdHdvX2xhbWVfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfdHdvX2xhbWVfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF90d29fbGFtZV9maW5hbGl6ZTsKKworICBnc3RiYXNlX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdHdvX2xhbWVfc3RhcnQpOworICBnc3RiYXNlX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF90d29fbGFtZV9zdG9wKTsKKyAgZ3N0YmFzZV9jbGFzcy0+c2V0X2Zvcm1hdCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdHdvX2xhbWVfc2V0X2Zvcm1hdCk7CisgIGdzdGJhc2VfY2xhc3MtPmhhbmRsZV9mcmFtZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdHdvX2xhbWVfaGFuZGxlX2ZyYW1lKTsKKyAgZ3N0YmFzZV9jbGFzcy0+Zmx1c2ggPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3R3b19sYW1lX2ZsdXNoKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBBUkdfTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgibW9kZSIsICJNb2RlIiwgIkVuY29kaW5nIG1vZGUiLAorICAgICAgICAgIEdTVF9UWVBFX1RXT19MQU1FX01PREUsIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLm1vZGUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX1BTWU1PREVMLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInBzeW1vZGVsIiwgIlBzeWNob2Fjb3VzdGljIE1vZGVsIiwKKyAgICAgICAgICAiUHN5Y2hvYWNvdXN0aWMgbW9kZWwgdXNlZCB0byBlbmNvZGUgdGhlIGF1ZGlvIiwKKyAgICAgICAgICAtMSwgNCwgZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MucHN5bW9kZWwsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX0JJVFJBVEUsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiYml0cmF0ZSIsICJCaXRyYXRlIChrYi9zKSIsCisgICAgICAgICAgIkJpdHJhdGUgaW4ga2JpdC9zZWMgKDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsICIKKyAgICAgICAgICAiMTEyLCAxMjgsIDE0NCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAsIDM4NCkiLAorICAgICAgICAgIDgsIDM4NCwgZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MuYml0cmF0ZSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBBUkdfUEFERElORywKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgicGFkZGluZyIsICJQYWRkaW5nIiwgIlBhZGRpbmcgdHlwZSIsCisgICAgICAgICAgR1NUX1RZUEVfVFdPX0xBTUVfUEFERElORywgZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MucGFkZGluZywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgQVJHX0VORVJHWV9MRVZFTF9FWFRFTlNJT04sCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImVuZXJneS1sZXZlbC1leHRlbnNpb24iLCAiRW5lcmd5IExldmVsIEV4dGVuc2lvbiIsCisgICAgICAgICAgIldyaXRlIHBlYWsgUENNIGxldmVsIHRvIGVhY2ggZnJhbWUiLAorICAgICAgICAgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLmVuZXJneV9sZXZlbF9leHRlbnNpb24sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX0VNUEhBU0lTLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJlbXBoYXNpcyIsICJFbXBoYXNpcyIsCisgICAgICAgICAgIlByZS1lbXBoYXNpcyB0byBhcHBseSB0byB0aGUgZGVjb2RlZCBhdWRpbyIsCisgICAgICAgICAgR1NUX1RZUEVfVFdPX0xBTUVfRU1QSEFTSVMsIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLmVtcGhhc2lzLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19FUlJPUl9QUk9URUNUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJlcnJvci1wcm90ZWN0aW9uIiwgIkVycm9yIHByb3RlY3Rpb24iLAorICAgICAgICAgICJBZGRzIGNoZWNrc3VtIHRvIGV2ZXJ5IGZyYW1lIiwKKyAgICAgICAgICBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy5lcnJvcl9wcm90ZWN0aW9uLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19DT1BZUklHSFQsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImNvcHlyaWdodCIsICJDb3B5cmlnaHQiLCAiTWFyayBhcyBjb3B5cmlnaHQiLAorICAgICAgICAgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLmNvcHlyaWdodCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBBUkdfT1JJR0lOQUwsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoIm9yaWdpbmFsIiwgIk9yaWdpbmFsIiwgIk1hcmsgYXMgb3JpZ2luYWwiLAorICAgICAgICAgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLm9yaWdpbmFsLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19WQlIsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInZiciIsICJWQlIiLCAiRW5hYmxlIHZhcmlhYmxlIGJpdHJhdGUgbW9kZSIsCisgICAgICAgICAgZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MudmJyLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIEFSR19WQlJfTEVWRUwsCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJ2YnItbGV2ZWwiLCAiVkJSIExldmVsIiwgIlZCUiBMZXZlbCIsCisgICAgICAgICAgLTEwLjAsIDEwLjAsIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLnZicl9sZXZlbCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBBUkdfQVRIX0xFVkVMLAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgiYXRoLWxldmVsIiwgIkFUSCBMZXZlbCIsICJBVEggTGV2ZWwgaW4gZEIiLAorICAgICAgICAgIC1HX01BWEZMT0FULCBHX01BWEZMT0FULCBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy5hdGhfbGV2ZWwsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX1ZCUl9NQVhfQklUUkFURSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ2YnItbWF4LWJpdHJhdGUiLCAiVkJSIG1heCBiaXRyYXRlIiwKKyAgICAgICAgICAiU3BlY2lmeSBtYXhpbXVtIFZCUiBiaXRyYXRlICgwPW9mZiwgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgIgorICAgICAgICAgICIxMTIsIDEyOCwgMTQ0LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMCwgMzg0KSIsCisgICAgICAgICAgMCwgMzg0LCBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy52YnJfbWF4X2JpdHJhdGUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX1FVSUNLX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInF1aWNrLW1vZGUiLCAiUXVpY2sgbW9kZSIsCisgICAgICAgICAgIkNhbGN1bGF0ZSBQc3ltb2RlbCBldmVyeSBmcmFtZXMiLAorICAgICAgICAgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLnF1aWNrX21vZGUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgQVJHX1FVSUNLX01PREVfQ09VTlQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicXVpY2stbW9kZS1jb3VudCIsICJRdWljayBtb2RlIGNvdW50IiwKKyAgICAgICAgICAiQ2FsY3VsYXRlIFBzeW1vZGVsIGV2ZXJ5IG4gZnJhbWVzIiwKKyAgICAgICAgICAwLCBHX01BWElOVCwgZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MucXVpY2tfbW9kZV9jb3VudCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKSwKKyAgICAgICZnc3RfdHdvX2xhbWVfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyksCisgICAgICAmZ3N0X3R3b19sYW1lX3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyksCisgICAgICAiVHdvTEFNRSBtcDIgZW5jb2RlciIsICJDb2RlYy9FbmNvZGVyL0F1ZGlvIiwKKyAgICAgICJIaWdoLXF1YWxpdHkgZnJlZSBNUDIgZW5jb2RlciIsCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+Iik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3R3b19sYW1lX3NldF9mb3JtYXQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgR3N0VHdvTGFtZSAqdHdvbGFtZTsKKyAgZ2ludCBvdXRfc2FtcGxlcmF0ZTsKKyAgZ2ludCB2ZXJzaW9uOworICBHc3RDYXBzICpvdGhlcmNhcHM7CisKKyAgdHdvbGFtZSA9IEdTVF9UV09fTEFNRSAoZW5jKTsKKworICAvKiBwYXJhbWV0ZXJzIGFscmVhZHkgcGFyc2VkIGZvciB1cyAqLworICB0d29sYW1lLT5zYW1wbGVyYXRlID0gR1NUX0FVRElPX0lORk9fUkFURSAoaW5mbyk7CisgIHR3b2xhbWUtPm51bV9jaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChpbmZvKTsKKyAgdHdvbGFtZS0+ZmxvYXRfaW5wdXQgPSAhR1NUX0FVRElPX0lORk9fSVNfSU5URUdFUiAoaW5mbyk7CisKKyAgLyogYnV0IHdlIG1pZ2h0IGJlIGFza2VkIHRvIHJlY29uZmlndXJlLCBzbyByZXNldCAqLworICBnc3RfdHdvX2xhbWVfcmVsZWFzZV9tZW1vcnkgKHR3b2xhbWUpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHR3b2xhbWUsICJzZXR0aW5nIHVwIHR3b2xhbWUiKTsKKyAgaWYgKCFnc3RfdHdvX2xhbWVfc2V0dXAgKHR3b2xhbWUpKQorICAgIGdvdG8gc2V0dXBfZmFpbGVkOworCisgIG91dF9zYW1wbGVyYXRlID0gdHdvbGFtZV9nZXRfb3V0X3NhbXBsZXJhdGUgKHR3b2xhbWUtPmdsb3B0cyk7CisgIGlmIChvdXRfc2FtcGxlcmF0ZSA9PSAwKQorICAgIGdvdG8gemVyb19vdXRwdXRfcmF0ZTsKKworICBpZiAob3V0X3NhbXBsZXJhdGUgIT0gdHdvbGFtZS0+c2FtcGxlcmF0ZSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodHdvbGFtZSwKKyAgICAgICAgIm91dHB1dCBzYW1wbGVyYXRlICVkIGlzIGRpZmZlcmVudCBmcm9tIGluY29taW5nIHNhbXBsZXJhdGUgJWQiLAorICAgICAgICBvdXRfc2FtcGxlcmF0ZSwgdHdvbGFtZS0+c2FtcGxlcmF0ZSk7CisgIH0KKworICB2ZXJzaW9uID0gdHdvbGFtZV9nZXRfdmVyc2lvbiAodHdvbGFtZS0+Z2xvcHRzKTsKKyAgaWYgKHZlcnNpb24gPT0gVFdPTEFNRV9NUEVHMikKKyAgICB2ZXJzaW9uID0gMjsKKyAgZWxzZQorICAgIHZlcnNpb24gPSAxOworCisgIG90aGVyY2FwcyA9CisgICAgICBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8vbXBlZyIsCisgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLAorICAgICAgIm1wZWdhdWRpb3ZlcnNpb24iLCBHX1RZUEVfSU5ULCB2ZXJzaW9uLAorICAgICAgImxheWVyIiwgR19UWVBFX0lOVCwgMiwKKyAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsCisgICAgICB0d29sYW1lLT5tb2RlID09IFRXT0xBTUVfTU9OTyA/IDEgOiB0d29sYW1lLT5udW1fY2hhbm5lbHMsICJyYXRlIiwKKyAgICAgIEdfVFlQRV9JTlQsIG91dF9zYW1wbGVyYXRlLCBOVUxMKTsKKworICAvKiBhbmQgdXNlIHRoZXNlIGNhcHMgKi8KKyAgZ3N0X2F1ZGlvX2VuY29kZXJfc2V0X291dHB1dF9mb3JtYXQgKEdTVF9BVURJT19FTkNPREVSICh0d29sYW1lKSwgb3RoZXJjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKG90aGVyY2Fwcyk7CisKKyAgLyogcmVwb3J0IG5lZWRzIHRvIGJhc2UgY2xhc3M6CisgICAqIGhhbmQgb25lIGZyYW1lIGF0IGEgdGltZSwgaWYgd2UgYXJlIHByZXR0eSBzdXJlIHdoYXQgYSBmcmFtZSBpcyAqLworICBpZiAob3V0X3NhbXBsZXJhdGUgPT0gdHdvbGFtZS0+c2FtcGxlcmF0ZSkgeworICAgIGdzdF9hdWRpb19lbmNvZGVyX3NldF9mcmFtZV9zYW1wbGVzX21pbiAoZW5jLCAxMTUyKTsKKyAgICBnc3RfYXVkaW9fZW5jb2Rlcl9zZXRfZnJhbWVfc2FtcGxlc19tYXggKGVuYywgMTE1Mik7CisgICAgZ3N0X2F1ZGlvX2VuY29kZXJfc2V0X2ZyYW1lX21heCAoZW5jLCAxKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworCit6ZXJvX291dHB1dF9yYXRlOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHR3b2xhbWUsIExJQlJBUlksIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiVHdvTEFNRSBkZWNpZGVkIG9uIGEgemVybyBzYW1wbGUgcmF0ZSIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3NldHVwX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh0d29sYW1lLCBMSUJSQVJZLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkZhaWxlZCB0byBjb25maWd1cmUgVHdvTEFNRSBlbmNvZGVyLiBDaGVjayB5b3VyIGVuY29kaW5nIHBhcmFtZXRlcnMuIikpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3R3b19sYW1lX2luaXQgKEdzdFR3b0xhbWUgKiB0d29sYW1lKQoreworICBHU1RfREVCVUdfT0JKRUNUICh0d29sYW1lLCAic3RhcnRpbmcgaW5pdGlhbGl6YXRpb24iKTsKKworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9BVURJT19FTkNPREVSX1NJTktfUEFEICh0d29sYW1lKSk7CisKKyAgdHdvbGFtZS0+bW9kZSA9IGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLm1vZGU7CisgIHR3b2xhbWUtPnBzeW1vZGVsID0gZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MucHN5bW9kZWw7CisgIHR3b2xhbWUtPmJpdHJhdGUgPSBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy5iaXRyYXRlOworICB0d29sYW1lLT5wYWRkaW5nID0gZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MucGFkZGluZzsKKyAgdHdvbGFtZS0+ZW5lcmd5X2xldmVsX2V4dGVuc2lvbiA9CisgICAgICBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy5lbmVyZ3lfbGV2ZWxfZXh0ZW5zaW9uOworICB0d29sYW1lLT5lbXBoYXNpcyA9IGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLmVtcGhhc2lzOworICB0d29sYW1lLT5lcnJvcl9wcm90ZWN0aW9uID0gZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MuZXJyb3JfcHJvdGVjdGlvbjsKKyAgdHdvbGFtZS0+Y29weXJpZ2h0ID0gZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MuY29weXJpZ2h0OworICB0d29sYW1lLT5vcmlnaW5hbCA9IGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLm9yaWdpbmFsOworICB0d29sYW1lLT52YnIgPSBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy52YnI7CisgIHR3b2xhbWUtPnZicl9sZXZlbCA9IGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLnZicl9sZXZlbDsKKyAgdHdvbGFtZS0+YXRoX2xldmVsID0gZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MuYXRoX2xldmVsOworICB0d29sYW1lLT52YnJfbWF4X2JpdHJhdGUgPSBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy52YnJfbWF4X2JpdHJhdGU7CisgIHR3b2xhbWUtPnF1aWNrX21vZGUgPSBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy5xdWlja19tb2RlOworICB0d29sYW1lLT5xdWlja19tb2RlX2NvdW50ID0gZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MucXVpY2tfbW9kZV9jb3VudDsKKworICBHU1RfREVCVUdfT0JKRUNUICh0d29sYW1lLCAiZG9uZSBpbml0aWFsaXppbmciKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdHdvX2xhbWVfc3RhcnQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYykKK3sKKyAgR3N0VHdvTGFtZSAqdHdvbGFtZSA9IEdTVF9UV09fTEFNRSAoZW5jKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh0d29sYW1lLCAic3RhcnQiKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3R3b19sYW1lX3N0b3AgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYykKK3sKKyAgR3N0VHdvTGFtZSAqdHdvbGFtZSA9IEdTVF9UV09fTEFNRSAoZW5jKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh0d29sYW1lLCAic3RvcCIpOworCisgIGdzdF90d29fbGFtZV9yZWxlYXNlX21lbW9yeSAodHdvbGFtZSk7CisgIHJldHVybiBUUlVFOworfQorCisvKiA8cGhwLWVtdWxhdGlvbi1tb2RlPnRocmVlIHVuZGVyc2NvcmVzIGZvciBfX19yYXRlIGlzIHJlYWxseSByZWFsbHkgcmVhbGx5CisgKiBwcml2YXRlIGFzIG9wcG9zZWQgdG8gb25lIHVuZGVyc2NvcmU8cGhwLWVtdWxhdGlvbi1tb2RlPiAqLworLyogY2FsbCB0aGlzIE1BQ1JPIG91dHNpZGUgb2YgdGhlIE5VTEwgc3RhdGUgc28gdGhhdCB3ZSBoYXZlIGEgaGlnaGVyIGNoYW5jZQorICogb2YgYWN0dWFsbHkgaGF2aW5nIGEgcGlwZWxpbmUgYW5kIGJ1cyB0byBnZXQgdGhlIG1lc3NhZ2UgdGhyb3VnaCAqLworCisjZGVmaW5lIENIRUNLX0FORF9GSVhVUF9CSVRSQVRFKG9iaixwYXJhbSxyYXRlKSAgICAgICAgIAkJICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2ludCBfX19yYXRlID0gcmF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnaW50IG1heHJhdGUgPSAzMjA7CQkJCQkJCSAgXAorICBnaW50IG11bHRpcGxpZXIgPSA2NDsJCQkJCQkJICBcCisgIGlmIChyYXRlIDw9IDY0KSB7CQkJCQkJCSAgXAorICAgIG1heHJhdGUgPSA2NDsgbXVsdGlwbGllciA9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChyYXRlICUgOCkgIT0gMCkgX19fcmF0ZSA9IEdTVF9ST1VORF9VUF84IChyYXRlKTsgCQkgIFwKKyAgfSBlbHNlIGlmIChyYXRlIDw9IDE0NCkgewkJCQkJCSAgXAorICAgIG1heHJhdGUgPSAxNDQ7IG11bHRpcGxpZXIgPSAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChyYXRlICUgMTYpICE9IDApIF9fX3JhdGUgPSBHU1RfUk9VTkRfVVBfMTYgKHJhdGUpOyAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIGlmIChyYXRlIDw9IDI1NikgewkJCQkJCSAgXAorICAgIG1heHJhdGUgPSAyNTY7IG11bHRpcGxpZXIgPSAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChyYXRlICUgMzIpICE9IDApIF9fX3JhdGUgPSBHU1RfUk9VTkRfVVBfMzIgKHJhdGUpOyAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIGlmIChyYXRlIDw9IDM4NCkgeyAJCQkJCQkgIFwKKyAgICBtYXhyYXRlID0gMzg0OyBtdWx0aXBsaWVyID0gNjQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgocmF0ZSAlIDY0KSAhPSAwKSBfX19yYXRlID0gR1NUX1JPVU5EX1VQXzY0IChyYXRlKTsgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKF9fX3JhdGUgIT0gcmF0ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKG9iaiwgTElCUkFSWSwgU0VUVElOR1MsCQkJICBcCisgICAgICAgIChfKCJUaGUgcmVxdWVzdGVkIGJpdHJhdGUgJWQga2JpdC9zIGZvciBwcm9wZXJ0eSAnJXMnICIgICAgICAgICAgIFwKKyAgICAgICAgICAgImlzIG5vdCBhbGxvd2VkLiAiICAJCQkJCSAgICAgICAgICBcCisgICAgICAgICAgICJUaGUgYml0cmF0ZSB3YXMgY2hhbmdlZCB0byAlZCBrYml0L3MuIiksIHJhdGUsCQkgIFwKKyAgICAgICAgIHBhcmFtLCAgX19fcmF0ZSksIAkJCQkJICAgICAgICAgIFwKKyAgICAgICAgKCJBIGJpdHJhdGUgYmVsb3cgJWQgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgJWQuIiwgCQkgIFwKKyAgICAgICAgICAgIG1heHJhdGUsIG11bHRpcGxpZXIpKTsJCSAgCQkJICBcCisgICAgcmF0ZSA9IF9fX3JhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSBHX1NUTVRfRU5ECisKK3N0YXRpYyB2b2lkCitnc3RfdHdvX2xhbWVfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFR3b0xhbWUgKnR3b2xhbWUgPSBHU1RfVFdPX0xBTUUgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBBUkdfTU9ERToKKyAgICAgIHR3b2xhbWUtPm1vZGUgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19QU1lNT0RFTDoKKyAgICAgIHR3b2xhbWUtPnBzeW1vZGVsID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19CSVRSQVRFOgorICAgICAgdHdvbGFtZS0+Yml0cmF0ZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfUEFERElORzoKKyAgICAgIHR3b2xhbWUtPnBhZGRpbmcgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19FTkVSR1lfTEVWRUxfRVhURU5TSU9OOgorICAgICAgdHdvbGFtZS0+ZW5lcmd5X2xldmVsX2V4dGVuc2lvbiA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0VNUEhBU0lTOgorICAgICAgdHdvbGFtZS0+ZW1waGFzaXMgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19FUlJPUl9QUk9URUNUSU9OOgorICAgICAgdHdvbGFtZS0+ZXJyb3JfcHJvdGVjdGlvbiA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0NPUFlSSUdIVDoKKyAgICAgIHR3b2xhbWUtPmNvcHlyaWdodCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX09SSUdJTkFMOgorICAgICAgdHdvbGFtZS0+b3JpZ2luYWwgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19WQlI6CisgICAgICB0d29sYW1lLT52YnIgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19WQlJfTEVWRUw6CisgICAgICB0d29sYW1lLT52YnJfbGV2ZWwgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfQVRIX0xFVkVMOgorICAgICAgdHdvbGFtZS0+YXRoX2xldmVsID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1ZCUl9NQVhfQklUUkFURToKKyAgICAgIHR3b2xhbWUtPnZicl9tYXhfYml0cmF0ZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfUVVJQ0tfTU9ERToKKyAgICAgIHR3b2xhbWUtPnF1aWNrX21vZGUgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19RVUlDS19NT0RFX0NPVU5UOgorICAgICAgdHdvbGFtZS0+cXVpY2tfbW9kZV9jb3VudCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3R3b19sYW1lX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RUd29MYW1lICp0d29sYW1lID0gR1NUX1RXT19MQU1FIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgQVJHX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgdHdvbGFtZS0+bW9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19QU1lNT0RFTDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHR3b2xhbWUtPnBzeW1vZGVsKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0JJVFJBVEU6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB0d29sYW1lLT5iaXRyYXRlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1BBRERJTkc6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgdHdvbGFtZS0+cGFkZGluZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19FTkVSR1lfTEVWRUxfRVhURU5TSU9OOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHR3b2xhbWUtPmVuZXJneV9sZXZlbF9leHRlbnNpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfRU1QSEFTSVM6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgdHdvbGFtZS0+ZW1waGFzaXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfRVJST1JfUFJPVEVDVElPTjoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB0d29sYW1lLT5lcnJvcl9wcm90ZWN0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0NPUFlSSUdIVDoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB0d29sYW1lLT5jb3B5cmlnaHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfT1JJR0lOQUw6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgdHdvbGFtZS0+b3JpZ2luYWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfVkJSOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHR3b2xhbWUtPnZicik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19WQlJfTEVWRUw6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIHR3b2xhbWUtPnZicl9sZXZlbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19BVEhfTEVWRUw6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIHR3b2xhbWUtPmF0aF9sZXZlbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19WQlJfTUFYX0JJVFJBVEU6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB0d29sYW1lLT52YnJfbWF4X2JpdHJhdGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfUVVJQ0tfTU9ERToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB0d29sYW1lLT5xdWlja19tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX1FVSUNLX01PREVfQ09VTlQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB0d29sYW1lLT5xdWlja19tb2RlX2NvdW50KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF90d29fbGFtZV9mbHVzaF9mdWxsIChHc3RUd29MYW1lICogbGFtZSwgZ2Jvb2xlYW4gcHVzaCkKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdE1hcEluZm8gbWFwOworICBnaW50IHNpemU7CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0ID0gR1NUX0ZMT1dfT0s7CisKKyAgaWYgKCFsYW1lLT5nbG9wdHMpCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTYzODQpOworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgc2l6ZSA9IHR3b2xhbWVfZW5jb2RlX2ZsdXNoIChsYW1lLT5nbG9wdHMsIG1hcC5kYXRhLCAxNjM4NCk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgaWYgKHNpemUgPiAwICYmIHB1c2gpIHsKKyAgICBnc3RfYnVmZmVyX3NldF9zaXplIChidWYsIHNpemUpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGxhbWUsICJwdXNoaW5nIGZpbmFsIHBhY2tldCBvZiAldSBieXRlcyIsIHNpemUpOworICAgIHJlc3VsdCA9IGdzdF9hdWRpb19lbmNvZGVyX2ZpbmlzaF9mcmFtZSAoR1NUX0FVRElPX0VOQ09ERVIgKGxhbWUpLCBidWYsIC0xKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChsYW1lLCAibm8gZmluYWwgcGFja2V0IChzaXplPSVkLCBwdXNoPSVkKSIsIHNpemUsIHB1c2gpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmVzdWx0ID0gR1NUX0ZMT1dfT0s7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2dzdF90d29fbGFtZV9mbHVzaCAoR3N0QXVkaW9FbmNvZGVyICogZW5jKQoreworICBnc3RfdHdvX2xhbWVfZmx1c2hfZnVsbCAoR1NUX1RXT19MQU1FIChlbmMpLCBGQUxTRSk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdHdvX2xhbWVfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0VuY29kZXIgKiBlbmMsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0VHdvTGFtZSAqdHdvbGFtZTsKKyAgZ2ludCBtcDNfYnVmZmVyX3NpemUsIG1wM19zaXplOworICBHc3RCdWZmZXIgKm1wM19idWY7CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0OworICBnaW50IG51bV9zYW1wbGVzOworICBHc3RNYXBJbmZvIG1hcCwgbXAzX21hcDsKKworICB0d29sYW1lID0gR1NUX1RXT19MQU1FIChlbmMpOworCisgIC8qIHNxdWVlemUgcmVtYWluaW5nIGFuZCBwdXNoICovCisgIGlmIChHX1VOTElLRUxZIChidWYgPT0gTlVMTCkpCisgICAgcmV0dXJuIGdzdF90d29fbGFtZV9mbHVzaF9mdWxsICh0d29sYW1lLCBUUlVFKTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIGlmICh0d29sYW1lLT5mbG9hdF9pbnB1dCkKKyAgICBudW1fc2FtcGxlcyA9IG1hcC5zaXplIC8gNDsKKyAgZWxzZQorICAgIG51bV9zYW1wbGVzID0gbWFwLnNpemUgLyAyOworCisgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciBvdXRwdXQgKi8KKyAgbXAzX2J1ZmZlcl9zaXplID0gMS4yNSAqIG51bV9zYW1wbGVzICsgMTYzODQ7CisgIG1wM19idWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG1wM19idWZmZXJfc2l6ZSk7CisgIGdzdF9idWZmZXJfbWFwIChtcDNfYnVmLCAmbXAzX21hcCwgR1NUX01BUF9XUklURSk7CisKKyAgaWYgKHR3b2xhbWUtPm51bV9jaGFubmVscyA9PSAxKSB7CisgICAgaWYgKHR3b2xhbWUtPmZsb2F0X2lucHV0KQorICAgICAgbXAzX3NpemUgPSB0d29sYW1lX2VuY29kZV9idWZmZXJfZmxvYXQzMiAodHdvbGFtZS0+Z2xvcHRzLAorICAgICAgICAgIChmbG9hdCAqKSBtYXAuZGF0YSwKKyAgICAgICAgICAoZmxvYXQgKikgbWFwLmRhdGEsIG51bV9zYW1wbGVzLCBtcDNfbWFwLmRhdGEsIG1wM19idWZmZXJfc2l6ZSk7CisgICAgZWxzZQorICAgICAgbXAzX3NpemUgPSB0d29sYW1lX2VuY29kZV9idWZmZXIgKHR3b2xhbWUtPmdsb3B0cywKKyAgICAgICAgICAoc2hvcnQgaW50ICopIG1hcC5kYXRhLAorICAgICAgICAgIChzaG9ydCBpbnQgKikgbWFwLmRhdGEsIG51bV9zYW1wbGVzLCBtcDNfbWFwLmRhdGEsIG1wM19idWZmZXJfc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgaWYgKHR3b2xhbWUtPmZsb2F0X2lucHV0KQorICAgICAgbXAzX3NpemUgPSB0d29sYW1lX2VuY29kZV9idWZmZXJfZmxvYXQzMl9pbnRlcmxlYXZlZCAodHdvbGFtZS0+Z2xvcHRzLAorICAgICAgICAgIChmbG9hdCAqKSBtYXAuZGF0YSwKKyAgICAgICAgICBudW1fc2FtcGxlcyAvIHR3b2xhbWUtPm51bV9jaGFubmVscywgbXAzX21hcC5kYXRhLCBtcDNfYnVmZmVyX3NpemUpOworICAgIGVsc2UKKyAgICAgIG1wM19zaXplID0gdHdvbGFtZV9lbmNvZGVfYnVmZmVyX2ludGVybGVhdmVkICh0d29sYW1lLT5nbG9wdHMsCisgICAgICAgICAgKHNob3J0IGludCAqKSBtYXAuZGF0YSwKKyAgICAgICAgICBudW1fc2FtcGxlcyAvIHR3b2xhbWUtPm51bV9jaGFubmVscywgbXAzX21hcC5kYXRhLCBtcDNfYnVmZmVyX3NpemUpOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHR3b2xhbWUsICJlbmNvZGVkICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgb2YgYXVkaW8gIgorICAgICAgInRvICVkIGJ5dGVzIG9mIG1wMyIsIG1hcC5zaXplLCBtcDNfc2l6ZSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAobXAzX2J1ZiwgJm1wM19tYXApOworCisgIGlmIChtcDNfc2l6ZSA+IDApIHsKKyAgICBnc3RfYnVmZmVyX3NldF9zaXplIChtcDNfYnVmLCBtcDNfc2l6ZSk7CisgICAgcmVzdWx0ID0gZ3N0X2F1ZGlvX2VuY29kZXJfZmluaXNoX2ZyYW1lIChlbmMsIG1wM19idWYsIC0xKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAobXAzX3NpemUgPCAwKSB7CisgICAgICAvKiBlYXQgZXJyb3IgPyAqLworICAgICAgZ193YXJuaW5nICgiZXJyb3IgJWQiLCBtcDNfc2l6ZSk7CisgICAgfQorICAgIGdzdF9idWZmZXJfdW5yZWYgKG1wM19idWYpOworICAgIHJlc3VsdCA9IEdTVF9GTE9XX09LOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogc2V0IHVwIHRoZSBlbmNvZGVyIHN0YXRlICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF90d29fbGFtZV9zZXR1cCAoR3N0VHdvTGFtZSAqIHR3b2xhbWUpCit7CisKKyNkZWZpbmUgQ0hFQ0tfRVJST1IoY29tbWFuZCkgR19TVE1UX1NUQVJUIHtcCisgIGlmICgoY29tbWFuZCkgPCAwKSB7IFwKKyAgICBHU1RfRVJST1JfT0JKRUNUICh0d29sYW1lLCAic2V0dXAgZmFpbGVkOiAiIEdfU1RSSU5HSUZZIChjb21tYW5kKSk7IFwKKyAgICByZXR1cm4gRkFMU0U7IFwKKyAgfSBcCit9R19TVE1UX0VORAorCisgIGludCByZXR2YWw7CisgIEdzdENhcHMgKmFsbG93ZWRfY2FwczsKKworICBHU1RfREVCVUdfT0JKRUNUICh0d29sYW1lLCAic3RhcnRpbmcgc2V0dXAiKTsKKworICAvKiBjaGVjayBpZiB3ZSdyZSBhbHJlYWR5IHNldHVwOyBpZiB3ZSBhcmUsIHdlIG1pZ2h0IHdhbnQgdG8gY2hlY2sKKyAgICogaWYgdGhpcyBpbml0aWFsaXphdGlvbiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHByZXZpb3VzIG9uZSAqLworICAvKiBGSVhNRTogZG8gdGhpcyAqLworICBpZiAodHdvbGFtZS0+c2V0dXApIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHR3b2xhbWUsICJhbHJlYWR5IHNldHVwIik7CisgICAgdHdvbGFtZS0+c2V0dXAgPSBGQUxTRTsKKyAgfQorCisgIHR3b2xhbWUtPmdsb3B0cyA9IHR3b2xhbWVfaW5pdCAoKTsKKworICBpZiAodHdvbGFtZS0+Z2xvcHRzID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIGNvcHkgdGhlIHBhcmFtZXRlcnMgb3ZlciAqLworICB0d29sYW1lX3NldF9pbl9zYW1wbGVyYXRlICh0d29sYW1lLT5nbG9wdHMsIHR3b2xhbWUtPnNhbXBsZXJhdGUpOworCisgIC8qIGxldCB0d29sYW1lIGNob29zZSBkZWZhdWx0IHNhbXBsZXJhdGUgdW5sZXNzIG91dGdvaW5nIHNhbXBsZSByYXRlIGlzIGZpeGVkICovCisgIGFsbG93ZWRfY2FwcyA9IGdzdF9wYWRfZ2V0X2FsbG93ZWRfY2FwcyAoR1NUX0FVRElPX0VOQ09ERVJfU1JDX1BBRCAodHdvbGFtZSkpOworCisgIGlmIChhbGxvd2VkX2NhcHMgIT0gTlVMTCkgeworICAgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICAgIGdpbnQgc2FtcGxlcmF0ZTsKKworICAgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFsbG93ZWRfY2FwcywgMCk7CisKKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJyYXRlIiwgJnNhbXBsZXJhdGUpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUICh0d29sYW1lLAorICAgICAgICAgICJTZXR0aW5nIHNhbXBsZSByYXRlIHRvICVkIGFzIGZpeGVkIGluIHNyYyBjYXBzIiwgc2FtcGxlcmF0ZSk7CisgICAgICB0d29sYW1lX3NldF9vdXRfc2FtcGxlcmF0ZSAodHdvbGFtZS0+Z2xvcHRzLCBzYW1wbGVyYXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAodHdvbGFtZSwgIkxldHRpbmcgdHdvbGFtZSBjaG9vc2Ugc2FtcGxlIHJhdGUiKTsKKyAgICAgIHR3b2xhbWVfc2V0X291dF9zYW1wbGVyYXRlICh0d29sYW1lLT5nbG9wdHMsIDApOworICAgIH0KKyAgICBnc3RfY2Fwc191bnJlZiAoYWxsb3dlZF9jYXBzKTsKKyAgICBhbGxvd2VkX2NhcHMgPSBOVUxMOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHR3b2xhbWUsCisgICAgICAgICJObyBwZWVyIHlldCwgbGV0dGluZyB0d29sYW1lIGNob29zZSBzYW1wbGUgcmF0ZSIpOworICAgIHR3b2xhbWVfc2V0X291dF9zYW1wbGVyYXRlICh0d29sYW1lLT5nbG9wdHMsIDApOworICB9CisKKyAgLyogZm9yY2UgbW9ubyBlbmNvZGluZyBpZiB3ZSBvbmx5IGhhdmUgb25lIGNoYW5uZWwgKi8KKyAgaWYgKHR3b2xhbWUtPm51bV9jaGFubmVscyA9PSAxKQorICAgIHR3b2xhbWUtPm1vZGUgPSAzOworCisgIC8qIEZpeCBiaXRyYXRlcyBhbmQgTVBFRyB2ZXJzaW9uICovCisKKyAgQ0hFQ0tfRVJST1IgKHR3b2xhbWVfc2V0X251bV9jaGFubmVscyAodHdvbGFtZS0+Z2xvcHRzLAorICAgICAgICAgIHR3b2xhbWUtPm51bV9jaGFubmVscykpOworCisgIENIRUNLX0VSUk9SICh0d29sYW1lX3NldF9tb2RlICh0d29sYW1lLT5nbG9wdHMsIHR3b2xhbWUtPm1vZGUpKTsKKyAgQ0hFQ0tfRVJST1IgKHR3b2xhbWVfc2V0X3BzeW1vZGVsICh0d29sYW1lLT5nbG9wdHMsIHR3b2xhbWUtPnBzeW1vZGVsKSk7CisgIENIRUNLX0FORF9GSVhVUF9CSVRSQVRFICh0d29sYW1lLCAiYml0cmF0ZSIsIHR3b2xhbWUtPmJpdHJhdGUpOworICBDSEVDS19FUlJPUiAodHdvbGFtZV9zZXRfYml0cmF0ZSAodHdvbGFtZS0+Z2xvcHRzLCB0d29sYW1lLT5iaXRyYXRlKSk7CisgIENIRUNLX0VSUk9SICh0d29sYW1lX3NldF9wYWRkaW5nICh0d29sYW1lLT5nbG9wdHMsIHR3b2xhbWUtPnBhZGRpbmcpKTsKKyAgQ0hFQ0tfRVJST1IgKHR3b2xhbWVfc2V0X2VuZXJneV9sZXZlbHMgKHR3b2xhbWUtPmdsb3B0cywKKyAgICAgICAgICB0d29sYW1lLT5lbmVyZ3lfbGV2ZWxfZXh0ZW5zaW9uKSk7CisgIENIRUNLX0VSUk9SICh0d29sYW1lX3NldF9lbXBoYXNpcyAodHdvbGFtZS0+Z2xvcHRzLCB0d29sYW1lLT5lbXBoYXNpcykpOworICBDSEVDS19FUlJPUiAodHdvbGFtZV9zZXRfZXJyb3JfcHJvdGVjdGlvbiAodHdvbGFtZS0+Z2xvcHRzLAorICAgICAgICAgIHR3b2xhbWUtPmVycm9yX3Byb3RlY3Rpb24pKTsKKyAgQ0hFQ0tfRVJST1IgKHR3b2xhbWVfc2V0X2NvcHlyaWdodCAodHdvbGFtZS0+Z2xvcHRzLCB0d29sYW1lLT5jb3B5cmlnaHQpKTsKKyAgQ0hFQ0tfRVJST1IgKHR3b2xhbWVfc2V0X29yaWdpbmFsICh0d29sYW1lLT5nbG9wdHMsIHR3b2xhbWUtPm9yaWdpbmFsKSk7CisgIENIRUNLX0VSUk9SICh0d29sYW1lX3NldF9WQlIgKHR3b2xhbWUtPmdsb3B0cywgdHdvbGFtZS0+dmJyKSk7CisgIENIRUNLX0VSUk9SICh0d29sYW1lX3NldF9WQlJfbGV2ZWwgKHR3b2xhbWUtPmdsb3B0cywgdHdvbGFtZS0+dmJyX2xldmVsKSk7CisgIENIRUNLX0VSUk9SICh0d29sYW1lX3NldF9BVEhfbGV2ZWwgKHR3b2xhbWUtPmdsb3B0cywgdHdvbGFtZS0+YXRoX2xldmVsKSk7CisgIENIRUNLX0FORF9GSVhVUF9CSVRSQVRFICh0d29sYW1lLCAidmJyLW1heC1iaXRyYXRlIiwKKyAgICAgIHR3b2xhbWUtPnZicl9tYXhfYml0cmF0ZSk7CisgIENIRUNLX0VSUk9SICh0d29sYW1lX3NldF9WQlJfbWF4X2JpdHJhdGVfa2JwcyAodHdvbGFtZS0+Z2xvcHRzLAorICAgICAgICAgIHR3b2xhbWUtPnZicl9tYXhfYml0cmF0ZSkpOworICBDSEVDS19FUlJPUiAodHdvbGFtZV9zZXRfcXVpY2tfbW9kZSAodHdvbGFtZS0+Z2xvcHRzLCB0d29sYW1lLT5xdWlja19tb2RlKSk7CisgIENIRUNLX0VSUk9SICh0d29sYW1lX3NldF9xdWlja19jb3VudCAodHdvbGFtZS0+Z2xvcHRzLAorICAgICAgICAgIHR3b2xhbWUtPnF1aWNrX21vZGVfY291bnQpKTsKKworICAvKiBpbml0aWFsaXplIHRoZSB0d29sYW1lIGVuY29kZXIgKi8KKyAgaWYgKChyZXR2YWwgPSB0d29sYW1lX2luaXRfcGFyYW1zICh0d29sYW1lLT5nbG9wdHMpKSA+PSAwKSB7CisgICAgdHdvbGFtZS0+c2V0dXAgPSBUUlVFOworICAgIC8qIEZJWE1FOiBpdCB3b3VsZCBiZSBuaWNlIHRvIHByaW50IG91dCB0aGUgbW9kZSBoZXJlICovCisgICAgR1NUX0lORk8gKCJ0d29sYW1lIGVuY29kZXIgc2V0dXAgKCVkIGtiaXQvcywgJWQgSHosICVkIGNoYW5uZWxzKSIsCisgICAgICAgIHR3b2xhbWUtPmJpdHJhdGUsIHR3b2xhbWUtPnNhbXBsZXJhdGUsIHR3b2xhbWUtPm51bV9jaGFubmVscyk7CisgIH0gZWxzZSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAodHdvbGFtZSwgInR3b2xhbWVfaW5pdF9wYXJhbXMgcmV0dXJuZWQgJWQiLCByZXR2YWwpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodHdvbGFtZSwgImRvbmUgd2l0aCBzZXR1cCIpOworCisgIHJldHVybiB0d29sYW1lLT5zZXR1cDsKKyN1bmRlZiBDSEVDS19FUlJPUgorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF90d29fbGFtZV9nZXRfZGVmYXVsdF9zZXR0aW5ncyAodm9pZCkKK3sKKyAgdHdvbGFtZV9vcHRpb25zICpnbG9wdHMgPSBOVUxMOworCisgIGdsb3B0cyA9IHR3b2xhbWVfaW5pdCAoKTsKKyAgaWYgKGdsb3B0cyA9PSBOVUxMKSB7CisgICAgR1NUX0VSUk9SICgiQ291bGRuJ3QgaW5pdGlhbGl6ZSBUd29MQU1FIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgdHdvbGFtZV9zZXRfbnVtX2NoYW5uZWxzIChnbG9wdHMsIDIpOworICB0d29sYW1lX3NldF9pbl9zYW1wbGVyYXRlIChnbG9wdHMsIDQ0MTAwKTsKKworICBpZiAodHdvbGFtZV9pbml0X3BhcmFtcyAoZ2xvcHRzKSAhPSAwKSB7CisgICAgR1NUX0VSUk9SICgiQ291bGRuJ3Qgc2V0IGRlZmF1bHQgcGFyYW1ldGVycyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLm1vZGUgPSBUV09MQU1FX0pPSU5UX1NURVJFTzsgICAgLyogdHdvbGFtZV9nZXRfbW9kZSAoZ2xvcHRzKTsgKi8KKyAgZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MucHN5bW9kZWwgPSB0d29sYW1lX2dldF9wc3ltb2RlbCAoZ2xvcHRzKTsKKyAgZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MuYml0cmF0ZSA9IHR3b2xhbWVfZ2V0X2JpdHJhdGUgKGdsb3B0cyk7CisgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLnBhZGRpbmcgPSB0d29sYW1lX2dldF9wYWRkaW5nIChnbG9wdHMpOworICBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy5lbmVyZ3lfbGV2ZWxfZXh0ZW5zaW9uID0KKyAgICAgIHR3b2xhbWVfZ2V0X2VuZXJneV9sZXZlbHMgKGdsb3B0cyk7CisgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLmVtcGhhc2lzID0gdHdvbGFtZV9nZXRfZW1waGFzaXMgKGdsb3B0cyk7CisgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLmVycm9yX3Byb3RlY3Rpb24gPQorICAgICAgdHdvbGFtZV9nZXRfZXJyb3JfcHJvdGVjdGlvbiAoZ2xvcHRzKTsKKyAgZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MuY29weXJpZ2h0ID0gdHdvbGFtZV9nZXRfY29weXJpZ2h0IChnbG9wdHMpOworICBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy5vcmlnaW5hbCA9IHR3b2xhbWVfZ2V0X29yaWdpbmFsIChnbG9wdHMpOworICBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy52YnIgPSB0d29sYW1lX2dldF9WQlIgKGdsb3B0cyk7CisgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLnZicl9sZXZlbCA9IHR3b2xhbWVfZ2V0X1ZCUl9sZXZlbCAoZ2xvcHRzKTsKKyAgZ3N0X3R3b19sYW1lX2RlZmF1bHRfc2V0dGluZ3MuYXRoX2xldmVsID0gdHdvbGFtZV9nZXRfQVRIX2xldmVsIChnbG9wdHMpOworICBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy52YnJfbWF4X2JpdHJhdGUgPQorICAgICAgdHdvbGFtZV9nZXRfVkJSX21heF9iaXRyYXRlX2ticHMgKGdsb3B0cyk7CisgIGdzdF90d29fbGFtZV9kZWZhdWx0X3NldHRpbmdzLnF1aWNrX21vZGUgPSB0d29sYW1lX2dldF9xdWlja19tb2RlIChnbG9wdHMpOworICBnc3RfdHdvX2xhbWVfZGVmYXVsdF9zZXR0aW5ncy5xdWlja19tb2RlX2NvdW50ID0KKyAgICAgIHR3b2xhbWVfZ2V0X3F1aWNrX2NvdW50IChnbG9wdHMpOworCisgIHR3b2xhbWVfY2xvc2UgKCZnbG9wdHMpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChkZWJ1ZywgInR3b2xhbWUiLCAwLCAidHdvbGFtZSBtcDIgZW5jb2RlciIpOworCisgIGlmICghZ3N0X3R3b19sYW1lX2dldF9kZWZhdWx0X3NldHRpbmdzICgpKQorICAgIHJldHVybiBGQUxTRTsKKworI2lmZGVmIEVOQUJMRV9OTFMKKyAgR1NUX0RFQlVHICgiYmluZGluZyB0ZXh0IGRvbWFpbiAlcyB0byBsb2NhbGUgZGlyICVzIiwgR0VUVEVYVF9QQUNLQUdFLAorICAgICAgTE9DQUxFRElSKTsKKyAgYmluZHRleHRkb21haW4gKEdFVFRFWFRfUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKEdFVFRFWFRfUEFDS0FHRSwgIlVURi04Iik7CisjZW5kaWYgLyogRU5BQkxFX05MUyAqLworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInR3b2xhbWVtcDJlbmMiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX1RXT19MQU1FKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICB0d29sYW1lLAorICAgICJFbmNvZGUgTVAycyB3aXRoIFR3b0xBTUUiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9leHQvdHdvbGFtZS9nc3R0d29sYW1lbXAyZW5jLmggYi9leHQvdHdvbGFtZS9nc3R0d29sYW1lbXAyZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJhNmJlYQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC90d29sYW1lL2dzdHR3b2xhbWVtcDJlbmMuaApAQCAtMCwwICsxLDg4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA4PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfVFdPX0xBTUVfSF9fCisjZGVmaW5lIF9fR1NUX1RXT19MQU1FX0hfXworCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZW5jb2Rlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlIDx0d29sYW1lLmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfVFdPX0xBTUUgXAorICAoZ3N0X3R3b19sYW1lX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9UV09fTEFNRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1RXT19MQU1FLEdzdFR3b0xhbWUpKQorI2RlZmluZSBHU1RfVFdPX0xBTUVfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVFdPX0xBTUUsR3N0VHdvTGFtZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1RXT19MQU1FKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVFdPX0xBTUUpKQorI2RlZmluZSBHU1RfSVNfVFdPX0xBTUVfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVFdPX0xBTUUpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VHdvTGFtZSBHc3RUd29MYW1lOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFR3b0xhbWVDbGFzcyBHc3RUd29MYW1lQ2xhc3M7CisKKy8qKgorICogR3N0VHdvTGFtZToKKyAqCisgKiBPcGFxdWUgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0VHdvTGFtZSB7CisgIEdzdEF1ZGlvRW5jb2RlciBlbGVtZW50OworCisgIGdpbnQgc2FtcGxlcmF0ZTsKKyAgZ2ludCBudW1fY2hhbm5lbHM7CisgIGdib29sZWFuIGZsb2F0X2lucHV0OworICBnYm9vbGVhbiBzZXR1cDsKKworICBnaW50IG1vZGU7CisgIGdpbnQgcHN5bW9kZWw7CisgIGdpbnQgYml0cmF0ZTsKKyAgZ2ludCBwYWRkaW5nOworICBnYm9vbGVhbiBlbmVyZ3lfbGV2ZWxfZXh0ZW5zaW9uOworICBnaW50IGVtcGhhc2lzOworICBnYm9vbGVhbiBlcnJvcl9wcm90ZWN0aW9uOworICBnYm9vbGVhbiBjb3B5cmlnaHQ7CisgIGdib29sZWFuIG9yaWdpbmFsOworICBnYm9vbGVhbiB2YnI7CisgIGdmbG9hdCB2YnJfbGV2ZWw7CisgIGdmbG9hdCBhdGhfbGV2ZWw7CisgIGdpbnQgdmJyX21heF9iaXRyYXRlOworICBnYm9vbGVhbiBxdWlja19tb2RlOworICBnaW50IHF1aWNrX21vZGVfY291bnQ7CisKKyAgdHdvbGFtZV9vcHRpb25zICpnbG9wdHM7Cit9OworCitzdHJ1Y3QgX0dzdFR3b0xhbWVDbGFzcyB7CisgIEdzdEF1ZGlvRW5jb2RlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF90d29fbGFtZV9nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworCisjZW5kaWYgLyogX19HU1RfVFdPX0xBTUVfSF9fICovCmRpZmYgLS1naXQgYS9leHQvdHdvbGFtZS9tZXNvbi5idWlsZCBiL2V4dC90d29sYW1lL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYmFiNjMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdHdvbGFtZS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDEyIEBACit0d29sYW1lX2RlcCA9IGRlcGVuZGVuY3koJ3R3b2xhbWUnLCB2ZXJzaW9uIDogJz49IDAuMy4xMCcsIHJlcXVpcmVkIDogZmFsc2UpCisKK2lmIHR3b2xhbWVfZGVwLmZvdW5kKCkKKyAgdHdvbGFtZSA9IGxpYnJhcnkoJ2dzdHR3b2xhbWUnLAorICAgIFsnZ3N0dHdvbGFtZW1wMmVuYy5jJ10sCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3N0YXVkaW9fZGVwLCB0d29sYW1lX2RlcF0sCisgICAgaW5zdGFsbCA6IHRydWUsCisgICAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorICApCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L3ZweC9Hc3RWUDhFbmMucHJzIGIvZXh0L3ZweC9Hc3RWUDhFbmMucHJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMTM5NTkKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdnB4L0dzdFZQOEVuYy5wcnMKQEAgLTAsMCArMSw4IEBACitbX3ByZXNldHNfXQordmVyc2lvbj0wLjEwCitlbGVtZW50LW5hbWU9R3N0VlA4RW5jCisKK1tQcm9maWxlIFJlYWx0aW1lXQorZGVhZGxpbmU9MQorY3B1LXVzZWQ9NAorbGFnLWluLWZyYW1lcz0wCmRpZmYgLS1naXQgYS9leHQvdnB4L01ha2VmaWxlLmFtIGIvZXh0L3ZweC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWNlNmRlCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3ZweC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM3IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBcCisJbGliZ3N0dnB4LmxhCisKK2xpYmdzdHZweF9sYV9TT1VSQ0VTID0gXAorICAgIGdzdHZweGRlYy5jIFwKKyAgICBnc3R2cHhlbmMuYyBcCisJZ3N0dnA4ZGVjLmMgXAorCWdzdHZwOGVuYy5jIFwKKwlnc3R2cDh1dGlscy5jIFwKKwlnc3R2cDlkZWMuYyBcCisJZ3N0dnA5ZW5jLmMgXAorCXBsdWdpbi5jCisKK2xpYmdzdHZweF9sYV9DRkxBR1MgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgXAorCSQoR1NUX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQ0ZMQUdTKSBcCisJJChWUFhfQ0ZMQUdTKSBcCisJLURHU1RfVVNFX1VOU1RBQkxFX0FQSQorbGliZ3N0dnB4X2xhX0xJQkFERCA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R0YWctQEdTVF9BUElfVkVSU0lPTkAgLWxnc3R2aWRlby1AR1NUX0FQSV9WRVJTSU9OQCBcCisJJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKFZQWF9MSUJTKQorbGliZ3N0dnB4X2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBcCisgICAgZ3N0dnB4ZGVjLmggXAorICAgIGdzdHZweGVuYy5oIFwKKwlnc3R2cDhkZWMuaCBcCisJZ3N0dnA4ZW5jLmggXAorCWdzdHZwOWRlYy5oIFwKKwlnc3R2cDllbmMuaCBcCisJZ3N0dnA4dXRpbHMuaAorCitwcmVzZXRkaXIgPSAkKGRhdGFkaXIpL2dzdHJlYW1lci0kKEdTVF9BUElfVkVSU0lPTikvcHJlc2V0cworcHJlc2V0X0RBVEEgPSBHc3RWUDhFbmMucHJzCisKK0VYVFJBX0RJU1QgPSAkKHByZXNldF9EQVRBKQpkaWZmIC0tZ2l0IGEvZXh0L3ZweC9nc3R2cDhkZWMuYyBiL2V4dC92cHgvZ3N0dnA4ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5NjI1YwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC92cHgvZ3N0dnA4ZGVjLmMKQEAgLTAsMCArMSwxNTcgQEAKKy8qIFZQOAorICogQ29weXJpZ2h0IChDKSAyMDA2IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LDIwMDksMjAxMCBFbnRyb3B5IFdhdmUgSW5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LXZwOGRlYworICogQHNlZV9hbHNvOiB2cDhlbmMsIG1hdHJvc2thZGVtdXgKKyAqCisgKiBUaGlzIGVsZW1lbnQgZGVjb2RlcyBWUDggc3RyZWFtcyBpbnRvIHJhdyB2aWRlby4KKyAqIDx1bGluayB1cmw9Imh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnIj5WUDg8L3VsaW5rPiBpcyBhIHJveWFsdHktZnJlZQorICogdmlkZW8gY29kZWMgbWFpbnRhaW5lZCBieSA8dWxpbmsgdXJsPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vIj5Hb29nbGUKKyAqIDwvdWxpbms+LiBJdCdzIHRoZSBzdWNjZXNzb3Igb2YgT24yIFZQMywgd2hpY2ggd2FzIHRoZSBiYXNlIG9mIHRoZQorICogVGhlb3JhIHZpZGVvIGNvZGVjLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBmaWxlc3JjIGxvY2F0aW9uPXZpZGVvdGVzdHNyYy53ZWJtICEgbWF0cm9za2FkZW11eCAhIHZwOGRlYyAhIHZpZGVvY29udmVydCAhIHZpZGVvc2NhbGUgISBhdXRvdmlkZW9zaW5rCisgKiBdfCBUaGlzIGV4YW1wbGUgcGlwZWxpbmUgd2lsbCBkZWNvZGUgYSBXZWJNIHN0cmVhbSBhbmQgZGVjb2RlcyB0aGUgVlA4IHZpZGVvLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1ZQOF9ERUNPREVSCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHZwOGRlYy5oIgorI2luY2x1ZGUgImdzdHZwOHV0aWxzLmgiCisKKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9tZXRhLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvcG9vbC5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfdnA4ZGVjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF92cDhkZWNfZGVidWcKKworI2RlZmluZSBWUDhfREVDT0RFUl9WSURFT19UQUcgIlZQOCB2aWRlbyIKKworc3RhdGljIHZvaWQgZ3N0X3ZwOF9kZWNfc2V0X2RlZmF1bHRfZm9ybWF0IChHc3RWUFhEZWMgKiBkZWMsIEdzdFZpZGVvRm9ybWF0IGZtdCwKKyAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworc3RhdGljIHZvaWQgZ3N0X3ZwOF9kZWNfaGFuZGxlX3Jlc29sdXRpb25fY2hhbmdlIChHc3RWUFhEZWMgKiBkZWMsCisgICAgdnB4X2ltYWdlX3QgKiBpbWcsIEdzdFZpZGVvRm9ybWF0IGZtdCk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfdnA4X2RlY19zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtdnA4IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3ZwOF9kZWNfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJJNDIwIikpCisgICAgKTsKKworI2RlZmluZSBwYXJlbnRfY2xhc3MgZ3N0X3ZwOF9kZWNfcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RWUDhEZWMsIGdzdF92cDhfZGVjLCBHU1RfVFlQRV9WUFhfREVDKTsKKworc3RhdGljIHZvaWQKK2dzdF92cDhfZGVjX2NsYXNzX2luaXQgKEdzdFZQOERlY0NsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR3N0VlBYRGVjQ2xhc3MgKnZweF9jbGFzczsKKworICBlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgdnB4X2NsYXNzID0gR1NUX1ZQWF9ERUNfQ0xBU1MgKGtsYXNzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfdnA4X2RlY19zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3ZwOF9kZWNfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIk9uMiBWUDggRGVjb2RlciIsCisgICAgICAiQ29kZWMvRGVjb2Rlci9WaWRlbyIsCisgICAgICAiRGVjb2RlIFZQOCB2aWRlbyBzdHJlYW1zIiwgIkRhdmlkIFNjaGxlZWYgPGRzQGVudHJvcHl3YXZlLmNvbT4sICIKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKKworICB2cHhfY2xhc3MtPnZpZGVvX2NvZGVjX3RhZyA9IFZQOF9ERUNPREVSX1ZJREVPX1RBRzsKKyAgdnB4X2NsYXNzLT5jb2RlY19hbGdvID0gJnZweF9jb2RlY192cDhfZHhfYWxnbzsKKyAgdnB4X2NsYXNzLT5zZXRfZGVmYXVsdF9mb3JtYXQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92cDhfZGVjX3NldF9kZWZhdWx0X2Zvcm1hdCk7CisgIHZweF9jbGFzcy0+aGFuZGxlX3Jlc29sdXRpb25fY2hhbmdlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdnA4X2RlY19oYW5kbGVfcmVzb2x1dGlvbl9jaGFuZ2UpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfdnA4ZGVjX2RlYnVnLCAidnA4ZGVjIiwgMCwgIlZQOCBEZWNvZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnA4X2RlY19pbml0IChHc3RWUDhEZWMgKiBnc3RfdnA4X2RlYykKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAoZ3N0X3ZwOF9kZWMsICJnc3RfdnA4X2RlY19pbml0Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnA4X2RlY19zZXRfZGVmYXVsdF9mb3JtYXQgKEdzdFZQWERlYyAqIGRlYywgR3N0VmlkZW9Gb3JtYXQgZm10LCBpbnQgd2lkdGgsCisgICAgaW50IGhlaWdodCkKK3sKKyAgR3N0VlBYRGVjQ2xhc3MgKnZweGNsYXNzID0gR1NUX1ZQWF9ERUNfR0VUX0NMQVNTIChkZWMpOworICBnX2Fzc2VydCAoZGVjLT5vdXRwdXRfc3RhdGUgPT0gTlVMTCk7CisgIGRlYy0+b3V0cHV0X3N0YXRlID0KKyAgICAgIGdzdF92aWRlb19kZWNvZGVyX3NldF9vdXRwdXRfc3RhdGUgKEdTVF9WSURFT19ERUNPREVSIChkZWMpLAorICAgICAgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwLCB3aWR0aCwgaGVpZ2h0LCBkZWMtPmlucHV0X3N0YXRlKTsKKyAgZ3N0X3ZpZGVvX2RlY29kZXJfbmVnb3RpYXRlIChHU1RfVklERU9fREVDT0RFUiAoZGVjKSk7CisgIHZweGNsYXNzLT5zZW5kX3RhZ3MgKGRlYyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnA4X2RlY19oYW5kbGVfcmVzb2x1dGlvbl9jaGFuZ2UgKEdzdFZQWERlYyAqIGRlYywgdnB4X2ltYWdlX3QgKiBpbWcsCisgICAgR3N0VmlkZW9Gb3JtYXQgZm10KQoreworICBHc3RWaWRlb0luZm8gKmluZm87CisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqbmV3X291dHB1dF9zdGF0ZTsKKworICBpbmZvID0gJmRlYy0+b3V0cHV0X3N0YXRlLT5pbmZvOworICBpZiAoR1NUX1ZJREVPX0lORk9fV0lEVEggKGluZm8pICE9IGltZy0+ZF93CisgICAgICB8fCBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluZm8pICE9IGltZy0+ZF9oKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVjLAorICAgICAgICAiQ2hhbmdlZCBvdXRwdXQgcmVzb2x1dGlvbiB3YXMgJWQgeCAlZCBub3cgaXMgZ290ICV1IHggJXUgKGRpc3BsYXkgJXUgeCAldSkiLAorICAgICAgICBHU1RfVklERU9fSU5GT19XSURUSCAoaW5mbyksIEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5mbyksIGltZy0+dywKKyAgICAgICAgaW1nLT5oLCBpbWctPmRfdywgaW1nLT5kX2gpOworCisgICAgbmV3X291dHB1dF9zdGF0ZSA9CisgICAgICAgIGdzdF92aWRlb19kZWNvZGVyX3NldF9vdXRwdXRfc3RhdGUgKEdTVF9WSURFT19ERUNPREVSIChkZWMpLAorICAgICAgICBHU1RfVklERU9fRk9STUFUX0k0MjAsIGltZy0+ZF93LCBpbWctPmRfaCwgZGVjLT5vdXRwdXRfc3RhdGUpOworICAgIGlmIChkZWMtPm91dHB1dF9zdGF0ZSkgeworICAgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChkZWMtPm91dHB1dF9zdGF0ZSk7CisgICAgfQorICAgIGRlYy0+b3V0cHV0X3N0YXRlID0gbmV3X291dHB1dF9zdGF0ZTsKKyAgICAvKiBObyBuZWVkIHRvIGNhbGwgbmVnb3RpYXRlKCkgaGVyZSwgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNhbGxlZAorICAgICAqIGJ5IGFsbG9jYXRlX291dHB1dF9mcmFtZSgpKi8KKyAgfQorfQorCisjZW5kaWYgLyogSEFWRV9WUDhfREVDT0RFUiAqLwpkaWZmIC0tZ2l0IGEvZXh0L3ZweC9nc3R2cDhkZWMuaCBiL2V4dC92cHgvZ3N0dnA4ZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMzYjE2MQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC92cHgvZ3N0dnA4ZGVjLmgKQEAgLTAsMCArMSw3NyBAQAorLyogVlA4CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsMjAwOSwyMDEwIEVudHJvcHkgV2F2ZSBJbmMKKyAqIENvcHlyaWdodCAoQykgMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0dTVF9WUDhfREVDX0hfXworI2RlZmluZSBfX0dTVF9WUDhfREVDX0hfXworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1ZQOF9ERUNPREVSCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZGVjb2Rlci5oPgorI2luY2x1ZGUgPGdzdHZweGRlYy5oPgorCisvKiBGSVhNRTogVW5kZWYgSEFWRV9DT05GSUdfSCBiZWNhdXNlIHZweF9jb2RlYy5oIHVzZXMgaXQsCisgKiB3aGljaCBjYXVzZXMgY29tcGlsYXRpb24gZmFpbHVyZXMgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjdW5kZWYgSEFWRV9DT05GSUdfSAorI2VuZGlmCisKKyNpbmNsdWRlIDx2cHgvdnB4X2RlY29kZXIuaD4KKyNpbmNsdWRlIDx2cHgvdnA4ZHguaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1ZQOF9ERUMgXAorICAoZ3N0X3ZwOF9kZWNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1ZQOF9ERUMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9WUDhfREVDLEdzdFZQOERlYykpCisjZGVmaW5lIEdTVF9WUDhfREVDX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1ZQOF9ERUMsR3N0VlA4RGVjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVlA4X0RFQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1ZQOF9ERUMpKQorI2RlZmluZSBHU1RfSVNfVlA4X0RFQ19DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVlA4X0RFQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWUDhEZWMgR3N0VlA4RGVjOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZQOERlY0NsYXNzIEdzdFZQOERlY0NsYXNzOworCitzdHJ1Y3QgX0dzdFZQOERlYworeworICBHc3RWUFhEZWMgYmFzZV92cHhfZGVjb2RlcjsKK307CisKK3N0cnVjdCBfR3N0VlA4RGVjQ2xhc3MKK3sKKyAgR3N0VlBYRGVjQ2xhc3MgYmFzZV92cHhfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfdnA4X2RlY19nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgorCisjZW5kaWYgLyogX19HU1RfVlA4X0RFQ19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC92cHgvZ3N0dnA4ZW5jLmMgYi9leHQvdnB4L2dzdHZwOGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOWIzODgKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdnB4L2dzdHZwOGVuYy5jCkBAIC0wLDAgKzEsNDM2IEBACisvKiBWUDgKKyAqIENvcHlyaWdodCAoQykgMjAwNiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBFbnRyb3B5IFdhdmUgSW5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LXZwOGVuYworICogQHNlZV9hbHNvOiB2cDhkZWMsIHdlYm1tdXgsIG9nZ211eAorICoKKyAqIFRoaXMgZWxlbWVudCBlbmNvZGVzIHJhdyB2aWRlbyBpbnRvIGEgVlA4IHN0cmVhbS4KKyAqIDx1bGluayB1cmw9Imh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnIj5WUDg8L3VsaW5rPiBpcyBhIHJveWFsdHktZnJlZQorICogdmlkZW8gY29kZWMgbWFpbnRhaW5lZCBieSA8dWxpbmsgdXJsPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vIj5Hb29nbGUKKyAqIDwvdWxpbms+LiBJdCdzIHRoZSBzdWNjZXNzb3Igb2YgT24yIFZQMywgd2hpY2ggd2FzIHRoZSBiYXNlIG9mIHRoZQorICogVGhlb3JhIHZpZGVvIGNvZGVjLgorICoKKyAqIFRvIGNvbnRyb2wgdGhlIHF1YWxpdHkgb2YgdGhlIGVuY29kaW5nLCB0aGUgI0dzdFZQOEVuYzo6dGFyZ2V0LWJpdHJhdGUsCisgKiAjR3N0VlA4RW5jOjptaW4tcXVhbnRpemVyLCAjR3N0VlA4RW5jOjptYXgtcXVhbnRpemVyIG9yICNHc3RWUDhFbmM6OmNxLWxldmVsCisgKiBwcm9wZXJ0aWVzIGNhbiBiZSB1c2VkLiBXaGljaCBvbmUgaXMgdXNlZCBkZXBlbmRzIG9uIHRoZSBtb2RlIHNlbGVjdGVkIGJ5CisgKiB0aGUgI0dzdFZQOEVuYzo6ZW5kLXVzYWdlIHByb3BlcnR5LgorICogU2VlIDx1bGluayB1cmw9Imh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL2RvY3MvZW5jb2Rlci1wYXJhbWV0ZXJzLyI+RW5jb2RlciBQYXJhbWV0ZXJzPC91bGluaz4KKyAqIGZvciBleHBsYW5hdGlvbiwgZXhhbXBsZXMgZm9yIHVzZWZ1bCBlbmNvZGluZyBwYXJhbWV0ZXJzIGFuZCBtb3JlIGRldGFpbHMKKyAqIG9uIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiB2aWRlb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MTAwMCAhIHZwOGVuYyAhIHdlYm1tdXggISBmaWxlc2luayBsb2NhdGlvbj12aWRlb3Rlc3RzcmMud2VibQorICogXXwgVGhpcyBleGFtcGxlIHBpcGVsaW5lIHdpbGwgZW5jb2RlIGEgdGVzdCB2aWRlbyBzb3VyY2UgdG8gVlA4IG11eGVkIGluIGFuCisgKiBXZWJNIGNvbnRhaW5lci4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9WUDhfRU5DT0RFUgorCisvKiBnbGliIGRlY2lkZWQgaW4gMi4zMiBpdCB3b3VsZCBiZSBhIGdyZWF0IGlkZWEgdG8gZGVwcmVjYXRlZCBHVmFsdWVBcnJheSB3aXRob3V0CisgKiBwcm92aWRpbmcgYW4gYWx0ZXJuYXRpdmUKKyAqCisgKiBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY2NzIyOAorICogKi8KKyNkZWZpbmUgR0xJQl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisKKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0dnA4dXRpbHMuaCIKKyNpbmNsdWRlICJnc3R2cDhlbmMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3ZwOGVuY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfdnA4ZW5jX2RlYnVnCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHZweF9pbWFnZV90ICppbWFnZTsKKyAgR0xpc3QgKmludmlzaWJsZTsKK30gR3N0VlA4RW5jVXNlckRhdGE7CisKK3N0YXRpYyB2b2lkCitfZ3N0X21pbmlfb2JqZWN0X3VucmVmMCAoR3N0TWluaU9iamVjdCAqIG9iaikKK3sKKyAgaWYgKG9iaikKKyAgICBnc3RfbWluaV9vYmplY3RfdW5yZWYgKG9iaik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnA4X2VuY191c2VyX2RhdGFfZnJlZSAoR3N0VlA4RW5jVXNlckRhdGEgKiB1c2VyX2RhdGEpCit7CisgIGlmICh1c2VyX2RhdGEtPmltYWdlKQorICAgIGdfc2xpY2VfZnJlZSAodnB4X2ltYWdlX3QsIHVzZXJfZGF0YS0+aW1hZ2UpOworCisgIGdfbGlzdF9mb3JlYWNoICh1c2VyX2RhdGEtPmludmlzaWJsZSwgKEdGdW5jKSBfZ3N0X21pbmlfb2JqZWN0X3VucmVmMCwgTlVMTCk7CisgIGdfbGlzdF9mcmVlICh1c2VyX2RhdGEtPmludmlzaWJsZSk7CisgIGdfc2xpY2VfZnJlZSAoR3N0VlA4RW5jVXNlckRhdGEsIHVzZXJfZGF0YSk7Cit9CisKK3N0YXRpYyB2cHhfY29kZWNfaWZhY2VfdCAqZ3N0X3ZwOF9lbmNfZ2V0X2FsZ28gKEdzdFZQWEVuYyAqIGVuYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZwOF9lbmNfZW5hYmxlX3NjYWxpbmcgKEdzdFZQWEVuYyAqIGVuYyk7CitzdGF0aWMgdm9pZCBnc3RfdnA4X2VuY19zZXRfaW1hZ2VfZm9ybWF0IChHc3RWUFhFbmMgKiBlbmMsIHZweF9pbWFnZV90ICogaW1hZ2UpOworc3RhdGljIEdzdENhcHMgKmdzdF92cDhfZW5jX2dldF9uZXdfc2ltcGxlX2NhcHMgKEdzdFZQWEVuYyAqIGVuYyk7CitzdGF0aWMgdm9pZCBnc3RfdnA4X2VuY19zZXRfc3RyZWFtX2luZm8gKEdzdFZQWEVuYyAqIGVuYywgR3N0Q2FwcyAqIGNhcHMsCisgICAgR3N0VmlkZW9JbmZvICogaW5mbyk7CitzdGF0aWMgdm9pZCAqZ3N0X3ZwOF9lbmNfcHJvY2Vzc19mcmFtZV91c2VyX2RhdGEgKEdzdFZQWEVuYyAqIGVuYywKKyAgICBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfdnA4X2VuY19oYW5kbGVfaW52aXNpYmxlX2ZyYW1lX2J1ZmZlciAoR3N0VlBYRW5jICogZW5jLAorICAgIHZvaWQgKnVzZXJfZGF0YSwgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyB2b2lkIGdzdF92cDhfZW5jX3NldF9mcmFtZV91c2VyX2RhdGEgKEdzdFZQWEVuYyAqIGVuYywKKyAgICBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSwgdnB4X2ltYWdlX3QgKiBpbWFnZSk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF92cDhfZW5jX3ByZV9wdXNoIChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyLAorICAgIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF92cDhfZW5jX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIFwiSTQyMFwiLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsxLCAxNjM4M10sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsxLCAxNjM4M10sIGZyYW1lcmF0ZSA9IChmcmFjdGlvbikgWyAwLzEsIE1BWCBdIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3ZwOF9lbmNfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXZwOCwgIiAicHJvZmlsZSA9IChzdHJpbmcpIHswLCAxLCAyLCAzfSIpCisgICAgKTsKKworI2RlZmluZSBwYXJlbnRfY2xhc3MgZ3N0X3ZwOF9lbmNfcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RWUDhFbmMsIGdzdF92cDhfZW5jLCBHU1RfVFlQRV9WUFhfRU5DKTsKKworc3RhdGljIHZvaWQKK2dzdF92cDhfZW5jX2NsYXNzX2luaXQgKEdzdFZQOEVuY0NsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR3N0VmlkZW9FbmNvZGVyQ2xhc3MgKnZpZGVvX2VuY29kZXJfY2xhc3M7CisgIEdzdFZQWEVuY0NsYXNzICp2cHhfZW5jb2Rlcl9jbGFzczsKKworICBlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcyA9IEdTVF9WSURFT19FTkNPREVSX0NMQVNTIChrbGFzcyk7CisgIHZweF9lbmNvZGVyX2NsYXNzID0gR1NUX1ZQWF9FTkNfQ0xBU1MgKGtsYXNzKTsKKworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF92cDhfZW5jX3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF92cDhfZW5jX3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiT24yIFZQOCBFbmNvZGVyIiwKKyAgICAgICJDb2RlYy9FbmNvZGVyL1ZpZGVvIiwKKyAgICAgICJFbmNvZGUgVlA4IHZpZGVvIHN0cmVhbXMiLCAiRGF2aWQgU2NobGVlZiA8ZHNAZW50cm9weXdhdmUuY29tPiwgIgorICAgICAgIlNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPiIpOworCisgIHZpZGVvX2VuY29kZXJfY2xhc3MtPnByZV9wdXNoID0gZ3N0X3ZwOF9lbmNfcHJlX3B1c2g7CisKKyAgdnB4X2VuY29kZXJfY2xhc3MtPmdldF9hbGdvID0gZ3N0X3ZwOF9lbmNfZ2V0X2FsZ287CisgIHZweF9lbmNvZGVyX2NsYXNzLT5lbmFibGVfc2NhbGluZyA9IGdzdF92cDhfZW5jX2VuYWJsZV9zY2FsaW5nOworICB2cHhfZW5jb2Rlcl9jbGFzcy0+c2V0X2ltYWdlX2Zvcm1hdCA9IGdzdF92cDhfZW5jX3NldF9pbWFnZV9mb3JtYXQ7CisgIHZweF9lbmNvZGVyX2NsYXNzLT5nZXRfbmV3X3ZweF9jYXBzID0gZ3N0X3ZwOF9lbmNfZ2V0X25ld19zaW1wbGVfY2FwczsKKyAgdnB4X2VuY29kZXJfY2xhc3MtPnNldF9zdHJlYW1faW5mbyA9IGdzdF92cDhfZW5jX3NldF9zdHJlYW1faW5mbzsKKyAgdnB4X2VuY29kZXJfY2xhc3MtPnByb2Nlc3NfZnJhbWVfdXNlcl9kYXRhID0KKyAgICAgIGdzdF92cDhfZW5jX3Byb2Nlc3NfZnJhbWVfdXNlcl9kYXRhOworICB2cHhfZW5jb2Rlcl9jbGFzcy0+aGFuZGxlX2ludmlzaWJsZV9mcmFtZV9idWZmZXIgPQorICAgICAgZ3N0X3ZwOF9lbmNfaGFuZGxlX2ludmlzaWJsZV9mcmFtZV9idWZmZXI7CisgIHZweF9lbmNvZGVyX2NsYXNzLT5zZXRfZnJhbWVfdXNlcl9kYXRhID0gZ3N0X3ZwOF9lbmNfc2V0X2ZyYW1lX3VzZXJfZGF0YTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3ZwOGVuY19kZWJ1ZywgInZwOGVuYyIsIDAsICJWUDggRW5jb2RlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZwOF9lbmNfaW5pdCAoR3N0VlA4RW5jICogZ3N0X3ZwOF9lbmMpCit7CisgIHZweF9jb2RlY19lcnJfdCBzdGF0dXM7CisgIEdzdFZQWEVuYyAqZ3N0X3ZweF9lbmMgPSBHU1RfVlBYX0VOQyAoZ3N0X3ZwOF9lbmMpOworICBHU1RfREVCVUdfT0JKRUNUIChnc3RfdnA4X2VuYywgImdzdF92cDhfZW5jX2luaXQiKTsKKyAgc3RhdHVzID0KKyAgICAgIHZweF9jb2RlY19lbmNfY29uZmlnX2RlZmF1bHQgKGdzdF92cDhfZW5jX2dldF9hbGdvIChnc3RfdnB4X2VuYyksCisgICAgICAmZ3N0X3ZweF9lbmMtPmNmZywgMCk7CisgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZ3N0X3ZweF9lbmMsCisgICAgICAgICJGYWlsZWQgdG8gZ2V0IGRlZmF1bHQgZW5jb2RlciBjb25maWd1cmF0aW9uOiAlcyIsCisgICAgICAgIGdzdF92cHhfZXJyb3JfbmFtZSAoc3RhdHVzKSk7CisgICAgZ3N0X3ZweF9lbmMtPmhhdmVfZGVmYXVsdF9jb25maWcgPSBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfdnB4X2VuYy0+aGF2ZV9kZWZhdWx0X2NvbmZpZyA9IFRSVUU7CisgIH0KK30KKworc3RhdGljIHZweF9jb2RlY19pZmFjZV90ICoKK2dzdF92cDhfZW5jX2dldF9hbGdvIChHc3RWUFhFbmMgKiBlbmMpCit7CisgIHJldHVybiAmdnB4X2NvZGVjX3ZwOF9jeF9hbGdvOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92cDhfZW5jX2VuYWJsZV9zY2FsaW5nIChHc3RWUFhFbmMgKiBlbmMpCit7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZwOF9lbmNfc2V0X2ltYWdlX2Zvcm1hdCAoR3N0VlBYRW5jICogZW5jLCB2cHhfaW1hZ2VfdCAqIGltYWdlKQoreworICBpbWFnZS0+Zm10ID0gVlBYX0lNR19GTVRfSTQyMDsKKyAgaW1hZ2UtPmJwcyA9IDEyOworICBpbWFnZS0+eF9jaHJvbWFfc2hpZnQgPSBpbWFnZS0+eV9jaHJvbWFfc2hpZnQgPSAxOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfdnA4X2VuY19nZXRfbmV3X3NpbXBsZV9jYXBzIChHc3RWUFhFbmMgKiBlbmMpCit7CisgIEdzdENhcHMgKmNhcHM7CisgIGdjaGFyICpwcm9maWxlX3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgZW5jLT5jZmcuZ19wcm9maWxlKTsKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LXZwOCIsCisgICAgICAicHJvZmlsZSIsIEdfVFlQRV9TVFJJTkcsIHByb2ZpbGVfc3RyLCBOVUxMKTsKKyAgZ19mcmVlIChwcm9maWxlX3N0cik7CisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZwOF9lbmNfc2V0X3N0cmVhbV9pbmZvIChHc3RWUFhFbmMgKiBlbmMsIEdzdENhcHMgKiBjYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluZm8pCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgR3N0VmlkZW9FbmNvZGVyICp2aWRlb19lbmNvZGVyOworICBHc3RCdWZmZXIgKnN0cmVhbV9oZHIsICp2b3JiaXNjb21tZW50OworICBjb25zdCBHc3RUYWdMaXN0ICppZmFjZV90YWdzOworICBHVmFsdWUgYXJyYXkgPSB7IDAsIH07CisgIEdWYWx1ZSB2YWx1ZSA9IHsgMCwgfTsKKyAgZ3VpbnQ4ICpkYXRhID0gTlVMTDsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgdmlkZW9fZW5jb2RlciA9IEdTVF9WSURFT19FTkNPREVSIChlbmMpOworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgLyogcHV0IGJ1ZmZlcnMgaW4gYSBmaXhlZCBsaXN0ICovCisgIGdfdmFsdWVfaW5pdCAoJmFycmF5LCBHU1RfVFlQRV9BUlJBWSk7CisgIGdfdmFsdWVfaW5pdCAoJnZhbHVlLCBHU1RfVFlQRV9CVUZGRVIpOworCisgIC8qIENyZWF0ZSBPZ2cgc3RyZWFtLWluZm8gKi8KKyAgc3RyZWFtX2hkciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMjYpOworICBnc3RfYnVmZmVyX21hcCAoc3RyZWFtX2hkciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKworICBHU1RfV1JJVEVfVUlOVDggKGRhdGEsIDB4NEYpOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgMSwgMHg1NjUwMzgzMCk7ICAgLyogIlZQODAiICovCisgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDUsIDB4MDEpOyAgICAgLyogc3RyZWFtIGluZm8gaGVhZGVyICovCisgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDYsIDEpOyAgICAgICAgLyogTWFqb3IgdmVyc2lvbiAxICovCisgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDcsIDApOyAgICAgICAgLyogTWlub3IgdmVyc2lvbiAwICovCisgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEgKyA4LCBHU1RfVklERU9fSU5GT19XSURUSCAoaW5mbykpOworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhICsgMTAsIEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5mbykpOworICBHU1RfV1JJVEVfVUlOVDI0X0JFIChkYXRhICsgMTIsIEdTVF9WSURFT19JTkZPX1BBUl9OIChpbmZvKSk7CisgIEdTVF9XUklURV9VSU5UMjRfQkUgKGRhdGEgKyAxNSwgR1NUX1ZJREVPX0lORk9fUEFSX0QgKGluZm8pKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDE4LCBHU1RfVklERU9fSU5GT19GUFNfTiAoaW5mbykpOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgMjIsIEdTVF9WSURFT19JTkZPX0ZQU19EIChpbmZvKSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoc3RyZWFtX2hkciwgJm1hcCk7CisKKyAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoc3RyZWFtX2hkciwgR1NUX0JVRkZFUl9GTEFHX0hFQURFUik7CisgIGdzdF92YWx1ZV9zZXRfYnVmZmVyICgmdmFsdWUsIHN0cmVhbV9oZHIpOworICBnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX3ZhbHVlICgmYXJyYXksICZ2YWx1ZSk7CisgIGdfdmFsdWVfdW5zZXQgKCZ2YWx1ZSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKHN0cmVhbV9oZHIpOworCisgIGlmYWNlX3RhZ3MgPSBnc3RfdGFnX3NldHRlcl9nZXRfdGFnX2xpc3QgKEdTVF9UQUdfU0VUVEVSICh2aWRlb19lbmNvZGVyKSk7CisgIGlmIChpZmFjZV90YWdzKSB7CisgICAgdm9yYmlzY29tbWVudCA9CisgICAgICAgIGdzdF90YWdfbGlzdF90b192b3JiaXNjb21tZW50X2J1ZmZlciAoaWZhY2VfdGFncywKKyAgICAgICAgKGNvbnN0IGd1aW50OCAqKSAiT1ZQODBcMiAiLCA3LAorICAgICAgICAiRW5jb2RlZCB3aXRoIEdTdHJlYW1lciB2cDhlbmMgIiBQQUNLQUdFX1ZFUlNJT04pOworCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAodm9yYmlzY29tbWVudCwgR1NUX0JVRkZFUl9GTEFHX0hFQURFUik7CisKKyAgICBnX3ZhbHVlX2luaXQgKCZ2YWx1ZSwgR1NUX1RZUEVfQlVGRkVSKTsKKyAgICBnc3RfdmFsdWVfc2V0X2J1ZmZlciAoJnZhbHVlLCB2b3JiaXNjb21tZW50KTsKKyAgICBnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX3ZhbHVlICgmYXJyYXksICZ2YWx1ZSk7CisgICAgZ192YWx1ZV91bnNldCAoJnZhbHVlKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmICh2b3JiaXNjb21tZW50KTsKKyAgfQorCisgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzLCAic3RyZWFtaGVhZGVyIiwgJmFycmF5KTsKKyAgZ192YWx1ZV91bnNldCAoJmFycmF5KTsKKworfQorCitzdGF0aWMgdm9pZCAqCitnc3RfdnA4X2VuY19wcm9jZXNzX2ZyYW1lX3VzZXJfZGF0YSAoR3N0VlBYRW5jICogZW5jLAorICAgIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKQoreworICBHc3RWUDhFbmNVc2VyRGF0YSAqdXNlcl9kYXRhOworCisgIHVzZXJfZGF0YSA9IGdzdF92aWRlb19jb2RlY19mcmFtZV9nZXRfdXNlcl9kYXRhIChmcmFtZSk7CisKKyAgaWYgKCF1c2VyX2RhdGEpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChlbmMsICJIYXZlIG5vIGZyYW1lIHVzZXIgZGF0YSIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKHVzZXJfZGF0YS0+aW1hZ2UpCisgICAgZ19zbGljZV9mcmVlICh2cHhfaW1hZ2VfdCwgdXNlcl9kYXRhLT5pbWFnZSk7CisgIHVzZXJfZGF0YS0+aW1hZ2UgPSBOVUxMOworICByZXR1cm4gdXNlcl9kYXRhOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3ZwOF9lbmNfaGFuZGxlX2ludmlzaWJsZV9mcmFtZV9idWZmZXIgKEdzdFZQWEVuYyAqIGVuYywgdm9pZCAqdXNlcl9kYXRhLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0VlA4RW5jVXNlckRhdGEgKnZwOF91c2VyX2RhdGEgPSAoR3N0VlA4RW5jVXNlckRhdGEgKikgdXNlcl9kYXRhOworCisgIGlmICghdnA4X3VzZXJfZGF0YSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGVuYywgIkhhdmUgbm8gZnJhbWUgdXNlciBkYXRhIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgdnA4X3VzZXJfZGF0YS0+aW52aXNpYmxlID0gZ19saXN0X2FwcGVuZCAodnA4X3VzZXJfZGF0YS0+aW52aXNpYmxlLCBidWZmZXIpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2dzdF92cDhfZW5jX3NldF9mcmFtZV91c2VyX2RhdGEgKEdzdFZQWEVuYyAqIGVuYywgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUsCisgICAgdnB4X2ltYWdlX3QgKiBpbWFnZSkKK3sKKyAgR3N0VlA4RW5jVXNlckRhdGEgKnVzZXJfZGF0YTsKKyAgdXNlcl9kYXRhID0gZ19zbGljZV9uZXcwIChHc3RWUDhFbmNVc2VyRGF0YSk7CisgIHVzZXJfZGF0YS0+aW1hZ2UgPSBpbWFnZTsKKyAgZ3N0X3ZpZGVvX2NvZGVjX2ZyYW1lX3NldF91c2VyX2RhdGEgKGZyYW1lLCB1c2VyX2RhdGEsCisgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF92cDhfZW5jX3VzZXJfZGF0YV9mcmVlKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgZ3VpbnQ2NAorX3RvX2dyYW51bGVwb3MgKGd1aW50NjQgZnJhbWVfZW5kX251bWJlciwgZ3VpbnQgaW52X2NvdW50LCBndWludCBrZXlmcmFtZV9kaXN0KQoreworICBndWludDY0IGdyYW51bGVwb3M7CisgIGd1aW50IGludjsKKworICBpbnYgPSAoaW52X2NvdW50ID09IDApID8gMHgzIDogaW52X2NvdW50IC0gMTsKKworICBncmFudWxlcG9zID0gKGZyYW1lX2VuZF9udW1iZXIgPDwgMzIpIHwgKGludiA8PCAzMCkgfCAoa2V5ZnJhbWVfZGlzdCA8PCAzKTsKKyAgcmV0dXJuIGdyYW51bGVwb3M7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdnA4X2VuY19wcmVfcHVzaCAoR3N0VmlkZW9FbmNvZGVyICogdmlkZW9fZW5jb2RlciwKKyAgICBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0VlA4RW5jICplbmNvZGVyOworICBHc3RWUFhFbmMgKnZweF9lbmM7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RWUDhFbmNVc2VyRGF0YSAqdXNlcl9kYXRhID0gZ3N0X3ZpZGVvX2NvZGVjX2ZyYW1lX2dldF91c2VyX2RhdGEgKGZyYW1lKTsKKyAgR0xpc3QgKmw7CisgIGdpbnQgaW52X2NvdW50OworICBHc3RWaWRlb0luZm8gKmluZm87CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodmlkZW9fZW5jb2RlciwgInByZV9wdXNoIik7CisKKyAgZW5jb2RlciA9IEdTVF9WUDhfRU5DICh2aWRlb19lbmNvZGVyKTsKKyAgdnB4X2VuYyA9IEdTVF9WUFhfRU5DIChlbmNvZGVyKTsKKworICBpbmZvID0gJnZweF9lbmMtPmlucHV0X3N0YXRlLT5pbmZvOworCisgIGdfYXNzZXJ0ICh1c2VyX2RhdGEgIT0gTlVMTCk7CisKKyAgZm9yIChpbnZfY291bnQgPSAwLCBsID0gdXNlcl9kYXRhLT5pbnZpc2libGU7IGw7IGludl9jb3VudCsrLCBsID0gbC0+bmV4dCkgeworICAgIGJ1ZiA9IGwtPmRhdGE7CisgICAgbC0+ZGF0YSA9IE5VTEw7CisKKyAgICAvKiBGSVhNRSA6IEFsbCBvZiB0aGlzIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBoYW5kbGVkIGJ5IGJhc2UgY2xhc3Nlcywgbm8gPyAqLworICAgIGlmIChsID09IHVzZXJfZGF0YS0+aW52aXNpYmxlCisgICAgICAgICYmIEdTVF9WSURFT19DT0RFQ19GUkFNRV9JU19TWU5DX1BPSU5UIChmcmFtZSkpIHsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgICBlbmNvZGVyLT5rZXlmcmFtZV9kaXN0YW5jZSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworICAgICAgZW5jb2Rlci0+a2V5ZnJhbWVfZGlzdGFuY2UrKzsKKyAgICB9CisKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ERUNPREVfT05MWSk7CisgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoZnJhbWUtPm91dHB1dF9idWZmZXIpOworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikgPSAwOworICAgIGlmIChHU1RfVklERU9fSU5GT19GUFNfRCAoaW5mbykgPT0gMCB8fCBHU1RfVklERU9fSU5GT19GUFNfTiAoaW5mbykgPT0gMCkgeworICAgICAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWYpID0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORTsKKyAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpID0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWYpID0KKyAgICAgICAgICBfdG9fZ3JhbnVsZXBvcyAoZnJhbWUtPnByZXNlbnRhdGlvbl9mcmFtZV9udW1iZXIgKyAxLAorICAgICAgICAgIGludl9jb3VudCwgZW5jb2Rlci0+a2V5ZnJhbWVfZGlzdGFuY2UpOworICAgICAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPQorICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoZnJhbWUtPnByZXNlbnRhdGlvbl9mcmFtZV9udW1iZXIgKyAxLAorICAgICAgICAgIEdTVF9TRUNPTkQgKiBHU1RfVklERU9fSU5GT19GUFNfRCAoaW5mbyksCisgICAgICAgICAgR1NUX1ZJREVPX0lORk9fRlBTX04gKGluZm8pKTsKKyAgICB9CisKKyAgICByZXQgPSBnc3RfcGFkX3B1c2ggKEdTVF9WSURFT19FTkNPREVSX1NSQ19QQUQgKHZpZGVvX2VuY29kZXIpLCBidWYpOworCisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmNvZGVyLCAiZmxvdyBlcnJvciAlZCIsIHJldCk7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICB9CisKKyAgYnVmID0gZnJhbWUtPm91dHB1dF9idWZmZXI7CisKKyAgLyogRklYTUUgOiBBbGwgb2YgdGhpcyBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gaGFuZGxlZCBieSBiYXNlIGNsYXNzZXMsIG5vID8gKi8KKyAgaWYgKCF1c2VyX2RhdGEtPmludmlzaWJsZSAmJiBHU1RfVklERU9fQ09ERUNfRlJBTUVfSVNfU1lOQ19QT0lOVCAoZnJhbWUpKSB7CisgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKTsKKyAgICBlbmNvZGVyLT5rZXlmcmFtZV9kaXN0YW5jZSA9IDA7CisgIH0gZWxzZSB7CisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgZW5jb2Rlci0+a2V5ZnJhbWVfZGlzdGFuY2UrKzsKKyAgfQorCisgIGlmIChHU1RfVklERU9fSU5GT19GUFNfRCAoaW5mbykgPT0gMCB8fCBHU1RfVklERU9fSU5GT19GUFNfTiAoaW5mbykgPT0gMCkgeworICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmKSA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisgICAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FOworICB9IGVsc2UgeworICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmKSA9CisgICAgICAgIF90b19ncmFudWxlcG9zIChmcmFtZS0+cHJlc2VudGF0aW9uX2ZyYW1lX251bWJlciArIDEsIDAsCisgICAgICAgIGVuY29kZXItPmtleWZyYW1lX2Rpc3RhbmNlKTsKKyAgICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSA9CisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoZnJhbWUtPnByZXNlbnRhdGlvbl9mcmFtZV9udW1iZXIgKyAxLAorICAgICAgICBHU1RfU0VDT05EICogR1NUX1ZJREVPX0lORk9fRlBTX0QgKGluZm8pLCBHU1RfVklERU9fSU5GT19GUFNfTiAoaW5mbykpOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHZpZGVvX2VuY29kZXIsICJzcmMgdHM6ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpKSk7CisKK2RvbmU6CisgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiBIQVZFX1ZQOF9FTkNPREVSICovCmRpZmYgLS1naXQgYS9leHQvdnB4L2dzdHZwOGVuYy5oIGIvZXh0L3ZweC9nc3R2cDhlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzMxOWUyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3ZweC9nc3R2cDhlbmMuaApAQCAtMCwwICsxLDczIEBACisvKiBWUDgKKyAqIENvcHlyaWdodCAoQykgMjAwNiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBFbnRyb3B5IFdhdmUgSW5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisjaWZuZGVmIF9fR1NUX1ZQOF9FTkNfSF9fCisjZGVmaW5lIF9fR1NUX1ZQOF9FTkNfSF9fCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmZGVmIEhBVkVfVlA4X0VOQ09ERVIKKworI2luY2x1ZGUgPGdzdHZweGVuYy5oPgorCisvKiBGSVhNRTogVW5kZWYgSEFWRV9DT05GSUdfSCBiZWNhdXNlIHZweF9jb2RlYy5oIHVzZXMgaXQsCisgKiB3aGljaCBjYXVzZXMgY29tcGlsYXRpb24gZmFpbHVyZXMgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjdW5kZWYgSEFWRV9DT05GSUdfSAorI2VuZGlmCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WUDhfRU5DIFwKKyAgKGdzdF92cDhfZW5jX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WUDhfRU5DKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVlA4X0VOQyxHc3RWUDhFbmMpKQorI2RlZmluZSBHU1RfVlA4X0VOQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WUDhfRU5DLEdzdFZQOEVuY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1ZQOF9FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WUDhfRU5DKSkKKyNkZWZpbmUgR1NUX0lTX1ZQOF9FTkNfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1ZQOF9FTkMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VlA4RW5jIEdzdFZQOEVuYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWUDhFbmNDbGFzcyBHc3RWUDhFbmNDbGFzczsKKworc3RydWN0IF9Hc3RWUDhFbmMKK3sKKyAgR3N0VlBYRW5jIGJhc2VfdnB4X2VuY29kZXI7CisKKyAgaW50IGtleWZyYW1lX2Rpc3RhbmNlOworfTsKKworc3RydWN0IF9Hc3RWUDhFbmNDbGFzcworeworICBHc3RWUFhFbmNDbGFzcyAgYmFzZV92cHhlbmNfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfdnA4X2VuY19nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgorCisjZW5kaWYgLyogX19HU1RfVlA4X0VOQ19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC92cHgvZ3N0dnA4dXRpbHMuYyBiL2V4dC92cHgvZ3N0dnA4dXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzIxOTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3ZweC9nc3R2cDh1dGlscy5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qIFZQOAorICogQ29weXJpZ2h0IChDKSAyMDA2IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDEwIEVudHJvcHkgV2F2ZSBJbmMKKyAqIENvcHlyaWdodCAoQykgMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisvKiBGSVhNRTogVW5kZWYgSEFWRV9DT05GSUdfSCBiZWNhdXNlIHZweF9jb2RlYy5oIHVzZXMgaXQsCisgKiB3aGljaCBjYXVzZXMgY29tcGlsYXRpb24gZmFpbHVyZXMgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjdW5kZWYgSEFWRV9DT05GSUdfSAorI2VuZGlmCisKKyNpbmNsdWRlIDx2cHgvdnB4X2NvZGVjLmg+CisKKyNpbmNsdWRlICJnc3R2cDh1dGlscy5oIgorCitjb25zdCBjaGFyICoKK2dzdF92cHhfZXJyb3JfbmFtZSAodnB4X2NvZGVjX2Vycl90IHN0YXR1cykKK3sKKyAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICBjYXNlIFZQWF9DT0RFQ19PSzoKKyAgICAgIHJldHVybiAiT0siOworICAgIGNhc2UgVlBYX0NPREVDX0VSUk9SOgorICAgICAgcmV0dXJuICJlcnJvciI7CisgICAgY2FzZSBWUFhfQ09ERUNfTUVNX0VSUk9SOgorICAgICAgcmV0dXJuICJtZW0gZXJyb3IiOworICAgIGNhc2UgVlBYX0NPREVDX0FCSV9NSVNNQVRDSDoKKyAgICAgIHJldHVybiAiYWJpIG1pc21hdGNoIjsKKyAgICBjYXNlIFZQWF9DT0RFQ19JTkNBUEFCTEU6CisgICAgICByZXR1cm4gImluY2FwYWJsZSI7CisgICAgY2FzZSBWUFhfQ09ERUNfVU5TVVBfQklUU1RSRUFNOgorICAgICAgcmV0dXJuICJ1bnN1cHBvcnRlZCBiaXRzdHJlYW0iOworICAgIGNhc2UgVlBYX0NPREVDX1VOU1VQX0ZFQVRVUkU6CisgICAgICByZXR1cm4gInVuc3VwcG9ydGVkIGZlYXR1cmUiOworICAgIGNhc2UgVlBYX0NPREVDX0NPUlJVUFRfRlJBTUU6CisgICAgICByZXR1cm4gImNvcnJ1cHQgZnJhbWUiOworICAgIGNhc2UgVlBYX0NPREVDX0lOVkFMSURfUEFSQU06CisgICAgICByZXR1cm4gImludmFsaWQgcGFyYW1ldGVyIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L3ZweC9nc3R2cDh1dGlscy5oIGIvZXh0L3ZweC9nc3R2cDh1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNDVkZjEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdnB4L2dzdHZwOHV0aWxzLmgKQEAgLTAsMCArMSwzMCBAQAorLyogVlA4CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRW50cm9weSBXYXZlIEluYworICogQ29weXJpZ2h0IChDKSAyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPHZweC92cHhfY29kZWMuaD4KKworR19CRUdJTl9ERUNMUworCitjb25zdCBjaGFyICogZ3N0X3ZweF9lcnJvcl9uYW1lICh2cHhfY29kZWNfZXJyX3Qgc3RhdHVzKTsKKworR19FTkRfREVDTFMKZGlmZiAtLWdpdCBhL2V4dC92cHgvZ3N0dnA5ZGVjLmMgYi9leHQvdnB4L2dzdHZwOWRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YmIwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdnB4L2dzdHZwOWRlYy5jCkBAIC0wLDAgKzEsMjE5IEBACisvKiBWUDkKKyAqIENvcHlyaWdodCAoQykgMjAwNiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDA5LDIwMTAgRW50cm9weSBXYXZlIEluYworICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtdnA5ZGVjCisgKiBAc2VlX2Fsc286IHZwOWVuYywgbWF0cm9za2FkZW11eAorICoKKyAqIFRoaXMgZWxlbWVudCBkZWNvZGVzIFZQOSBzdHJlYW1zIGludG8gcmF3IHZpZGVvLgorICogPHVsaW5rIHVybD0iaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmciPlZQOTwvdWxpbms+IGlzIGEgcm95YWx0eS1mcmVlCisgKiB2aWRlbyBjb2RlYyBtYWludGFpbmVkIGJ5IDx1bGluayB1cmw9Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8iPkdvb2dsZQorICogPC91bGluaz4uIEl0J3MgdGhlIHN1Y2Nlc3NvciBvZiBPbjIgVlAzLCB3aGljaCB3YXMgdGhlIGJhc2Ugb2YgdGhlCisgKiBUaGVvcmEgdmlkZW8gY29kZWMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249dmlkZW90ZXN0c3JjLndlYm0gISBtYXRyb3NrYWRlbXV4ICEgdnA5ZGVjICEgdmlkZW9jb252ZXJ0ICEgdmlkZW9zY2FsZSAhIGF1dG92aWRlb3NpbmsKKyAqIF18IFRoaXMgZXhhbXBsZSBwaXBlbGluZSB3aWxsIGRlY29kZSBhIFdlYk0gc3RyZWFtIGFuZCBkZWNvZGVzIHRoZSBWUDkgdmlkZW8uCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmZGVmIEhBVkVfVlA5X0RFQ09ERVIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0dnA4dXRpbHMuaCIKKyNpbmNsdWRlICJnc3R2cDlkZWMuaCIKKworI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb21ldGEuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9wb29sLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF92cDlkZWNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3ZwOWRlY19kZWJ1ZworCisjZGVmaW5lIFZQOV9ERUNPREVSX1ZJREVPX1RBRyAiVlA5IHZpZGVvIgorCitzdGF0aWMgdm9pZCBnc3RfdnA5X2RlY19zZXRfc3RyZWFtX2luZm8gKEdzdFZQWERlYyAqIGRlYywKKyAgICB2cHhfY29kZWNfc3RyZWFtX2luZm9fdCAqIHN0cmVhbV9pbmZvKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdnA5X2RlY19nZXRfdmFsaWRfZm9ybWF0IChHc3RWUFhEZWMgKiBkZWMsCisgICAgdnB4X2ltYWdlX3QgKiBpbWcsIEdzdFZpZGVvRm9ybWF0ICogZm10KTsKK3N0YXRpYyB2b2lkIGdzdF92cDlfZGVjX2hhbmRsZV9yZXNvbHV0aW9uX2NoYW5nZSAoR3N0VlBYRGVjICogZGVjLAorICAgIHZweF9pbWFnZV90ICogaW1nLCBHc3RWaWRlb0Zvcm1hdCBmbXQpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3ZwOV9kZWNfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXZwOSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF92cDlfZGVjX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBJNDIwLCBZVjEyLCBZNDJCLCBZNDQ0IH0iKSkKKyAgICApOworCisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfdnA5X2RlY19wYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFZQOURlYywgZ3N0X3ZwOV9kZWMsIEdTVF9UWVBFX1ZQWF9ERUMpOworCitzdGF0aWMgdm9pZAorZ3N0X3ZwOV9kZWNfY2xhc3NfaW5pdCAoR3N0VlA5RGVjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHc3RWUFhEZWNDbGFzcyAqdnB4X2NsYXNzOworCisgIGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICB2cHhfY2xhc3MgPSBHU1RfVlBYX0RFQ19DTEFTUyAoa2xhc3MpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF92cDlfZGVjX3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF92cDlfZGVjX3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiT24yIFZQOSBEZWNvZGVyIiwKKyAgICAgICJDb2RlYy9EZWNvZGVyL1ZpZGVvIiwKKyAgICAgICJEZWNvZGUgVlA5IHZpZGVvIHN0cmVhbXMiLCAiRGF2aWQgU2NobGVlZiA8ZHNAZW50cm9weXdhdmUuY29tPiwgIgorICAgICAgIlNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPiIpOworCisgIHZweF9jbGFzcy0+dmlkZW9fY29kZWNfdGFnID0gVlA5X0RFQ09ERVJfVklERU9fVEFHOworICB2cHhfY2xhc3MtPmNvZGVjX2FsZ28gPSAmdnB4X2NvZGVjX3ZwOV9keF9hbGdvOworICB2cHhfY2xhc3MtPnNldF9zdHJlYW1faW5mbyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdnA5X2RlY19zZXRfc3RyZWFtX2luZm8pOworICB2cHhfY2xhc3MtPmdldF9mcmFtZV9mb3JtYXQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92cDlfZGVjX2dldF92YWxpZF9mb3JtYXQpOworICB2cHhfY2xhc3MtPmhhbmRsZV9yZXNvbHV0aW9uX2NoYW5nZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3ZwOV9kZWNfaGFuZGxlX3Jlc29sdXRpb25fY2hhbmdlKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3ZwOWRlY19kZWJ1ZywgInZwOWRlYyIsIDAsICJWUDkgRGVjb2RlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZwOV9kZWNfaW5pdCAoR3N0VlA5RGVjICogZ3N0X3ZwOV9kZWMpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGdzdF92cDlfZGVjLCAiZ3N0X3ZwOV9kZWNfaW5pdCIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZwOV9kZWNfc2V0X3N0cmVhbV9pbmZvIChHc3RWUFhEZWMgKiBkZWMsCisgICAgdnB4X2NvZGVjX3N0cmVhbV9pbmZvX3QgKiBzdHJlYW1faW5mbykKK3sKKyAgLyogRklYTUU6IHBlZWtfc3RyZWFtX2luZm8oKSBkb2VzIG5vdCByZXR1cm4gdmFsaWQgdmFsdWVzLCB0YWtlIGlucHV0IGNhcHMgKi8KKyAgc3RyZWFtX2luZm8tPncgPSBkZWMtPmlucHV0X3N0YXRlLT5pbmZvLndpZHRoOworICBzdHJlYW1faW5mby0+aCA9IGRlYy0+aW5wdXRfc3RhdGUtPmluZm8uaGVpZ2h0OworICByZXR1cm47Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZwOV9kZWNfZ2V0X3ZhbGlkX2Zvcm1hdCAoR3N0VlBYRGVjICogZGVjLCB2cHhfaW1hZ2VfdCAqIGltZywKKyAgICBHc3RWaWRlb0Zvcm1hdCAqIGZtdCkKK3sKKyAgc3dpdGNoIChpbWctPmZtdCkgeworICAgIGNhc2UgVlBYX0lNR19GTVRfSTQyMDoKKyAgICAgICpmbXQgPSBHU1RfVklERU9fRk9STUFUX0k0MjA7CisgICAgICByZXR1cm4gVFJVRTsKKworICAgIGNhc2UgVlBYX0lNR19GTVRfWVYxMjoKKyAgICAgICpmbXQgPSBHU1RfVklERU9fRk9STUFUX1lWMTI7CisgICAgICByZXR1cm4gVFJVRTsKKworICAgIGNhc2UgVlBYX0lNR19GTVRfSTQyMjoKKyAgICAgICpmbXQgPSBHU1RfVklERU9fRk9STUFUX1k0MkI7CisgICAgICByZXR1cm4gVFJVRTsKKworICAgIGNhc2UgVlBYX0lNR19GTVRfSTQ0NDoKKyAgICAgICpmbXQgPSBHU1RfVklERU9fRk9STUFUX1k0NDQ7CisgICAgICByZXR1cm4gVFJVRTsKKyNpZmRlZiBWUFhfSU1HX0ZNVF9JNDQwCisgICAgY2FzZSBWUFhfSU1HX0ZNVF9JNDQwOgorICAgICAgLyogUGxhbmFyLCBoYWxmIGhlaWdodCwgZnVsbCB3aWR0aCBVL1YgKi8KKyAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKGRlYywgIlBsZWFzZSBhZGQgYSA0OjQ6MCBwbGFuYXIgZnJhbWUgZm9ybWF0Iik7CisgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChkZWMsIFNUUkVBTSwgTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgIChOVUxMKSwgKCJVbnN1cHBvcnRlZCBmcmFtZSBmb3JtYXQgLSA0OjQ6MCBwbGFuYXIiKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisjZW5kaWYKKyNpZmRlZiBWUFhfSU1HX0ZNVF9JNDIwMTYKKyAgICBjYXNlIFZQWF9JTUdfRk1UX0k0MjAxNjoKKyAgICAgIC8qIFZQWF9JTUdfRk1UX0k0MjAgfCBWUFhfSU1HX0ZNVF9ISUdIQklUREVQVEggKi8KKyAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKGRlYywgIlBsZWFzZSBhZGQgMTYtYml0IEk0MjAgZm9ybWF0Iik7CisgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChkZWMsIFNUUkVBTSwgTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgIChOVUxMKSwgKCJVbnN1cHBvcnRlZCBmcmFtZSBmb3JtYXQgLSAxNi1iaXQgNDoyOjAgcGxhbmFyIikpOworICAgICAgcmV0dXJuIEZBTFNFOworI2VuZGlmCisjaWZkZWYgVlBYX0lNR19GTVRfSTQyMjE2CisgICAgY2FzZSBWUFhfSU1HX0ZNVF9JNDIyMTY6CisgICAgICAvKiBWUFhfSU1HX0ZNVF9JNDIyIHwgVlBYX0lNR19GTVRfSElHSEJJVERFUFRIICovCisgICAgICBHU1RfRklYTUVfT0JKRUNUIChkZWMsICJQbGVhc2UgYWRkIDE2LWJpdCBZNDJCIGZvcm1hdCIpOworICAgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoZGVjLCBTVFJFQU0sIE5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAoTlVMTCksICgiVW5zdXBwb3J0ZWQgZnJhbWUgZm9ybWF0IC0gMTYtYml0IDQ6MjoyIHBsYW5hciIpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorI2lmZGVmIFZQWF9JTUdfRk1UX0k0NDQxNgorICAgIGNhc2UgVlBYX0lNR19GTVRfSTQ0NDE2OgorICAgICAgLyogVlBYX0lNR19GTVRfSTQ0NCB8IFZQWF9JTUdfRk1UX0hJR0hCSVRERVBUSCAqLworICAgICAgR1NUX0ZJWE1FX09CSkVDVCAoZGVjLCAiUGxlYXNlIGFkZCAxNi1iaXQgWTQ0NCBmb3JtYXQiKTsKKyAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKGRlYywgU1RSRUFNLCBOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgKE5VTEwpLCAoIlVuc3VwcG9ydGVkIGZyYW1lIGZvcm1hdCAtIDE2LWJpdCA0OjQ6NCBwbGFuYXIiKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisjZW5kaWYKKyNpZmRlZiBWUFhfSU1HX0ZNVF9JNDQwMTYKKyAgICBjYXNlIFZQWF9JTUdfRk1UX0k0NDAxNjoKKyAgICAgIC8qIFZQWF9JTUdfRk1UX0k0NDAgfCBWUFhfSU1HX0ZNVF9ISUdIQklUREVQVEggKi8KKyAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKGRlYywgIlBsZWFzZSBhZGQgMTYtYml0IDQ6NDowIHBsYW5hciBmcmFtZSBmb3JtYXQiKTsKKyAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKGRlYywgU1RSRUFNLCBOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgKE5VTEwpLCAoIlVuc3VwcG9ydGVkIGZyYW1lIGZvcm1hdCAtIDE2LWJpdCA0OjQ6MCBwbGFuYXIiKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnA5X2RlY19oYW5kbGVfcmVzb2x1dGlvbl9jaGFuZ2UgKEdzdFZQWERlYyAqIGRlYywgdnB4X2ltYWdlX3QgKiBpbWcsCisgICAgR3N0VmlkZW9Gb3JtYXQgZm10KQoreworICBHc3RWUFhEZWNDbGFzcyAqdnB4Y2xhc3MgPSBHU1RfVlBYX0RFQ19HRVRfQ0xBU1MgKGRlYyk7CisKKyAgaWYgKCFkZWMtPm91dHB1dF9zdGF0ZSB8fCBkZWMtPm91dHB1dF9zdGF0ZS0+aW5mby5maW5mby0+Zm9ybWF0ICE9IGZtdCB8fAorICAgICAgZGVjLT5vdXRwdXRfc3RhdGUtPmluZm8ud2lkdGggIT0gaW1nLT5kX3cgfHwKKyAgICAgIGRlYy0+b3V0cHV0X3N0YXRlLT5pbmZvLmhlaWdodCAhPSBpbWctPmRfaCkgeworICAgIGdib29sZWFuIHNlbmRfdGFncyA9ICFkZWMtPm91dHB1dF9zdGF0ZTsKKworICAgIGlmIChkZWMtPm91dHB1dF9zdGF0ZSkKKyAgICAgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAoZGVjLT5vdXRwdXRfc3RhdGUpOworCisgICAgZGVjLT5vdXRwdXRfc3RhdGUgPQorICAgICAgICBnc3RfdmlkZW9fZGVjb2Rlcl9zZXRfb3V0cHV0X3N0YXRlIChHU1RfVklERU9fREVDT0RFUiAoZGVjKSwKKyAgICAgICAgZm10LCBpbWctPmRfdywgaW1nLT5kX2gsIGRlYy0+aW5wdXRfc3RhdGUpOworICAgIGdzdF92aWRlb19kZWNvZGVyX25lZ290aWF0ZSAoR1NUX1ZJREVPX0RFQ09ERVIgKGRlYykpOworCisgICAgaWYgKHNlbmRfdGFncykKKyAgICAgIHZweGNsYXNzLT5zZW5kX3RhZ3MgKGRlYyk7CisgIH0KK30KKworI2VuZGlmIC8qIEhBVkVfVlA5X0RFQ09ERVIgKi8KZGlmZiAtLWdpdCBhL2V4dC92cHgvZ3N0dnA5ZGVjLmggYi9leHQvdnB4L2dzdHZwOWRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMzMyZjMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdnB4L2dzdHZwOWRlYy5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qIFZQOQorICogQ29weXJpZ2h0IChDKSAyMDA2IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LDIwMDksMjAxMCBFbnRyb3B5IFdhdmUgSW5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMyBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX19HU1RfVlA5X0RFQ19IX18KKyNkZWZpbmUgX19HU1RfVlA5X0RFQ19IX18KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9WUDlfREVDT0RFUgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2RlY29kZXIuaD4KKyNpbmNsdWRlIDxnc3R2cHhkZWMuaD4KKworLyogRklYTUU6IFVuZGVmIEhBVkVfQ09ORklHX0ggYmVjYXVzZSB2cHhfY29kZWMuaCB1c2VzIGl0LAorICogd2hpY2ggY2F1c2VzIGNvbXBpbGF0aW9uIGZhaWx1cmVzICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI3VuZGVmIEhBVkVfQ09ORklHX0gKKyNlbmRpZgorCisjaW5jbHVkZSA8dnB4L3ZweF9kZWNvZGVyLmg+CisjaW5jbHVkZSA8dnB4L3ZwOGR4Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WUDlfREVDIFwKKyAgKGdzdF92cDlfZGVjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WUDlfREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVlA5X0RFQyxHc3RWUDlEZWMpKQorI2RlZmluZSBHU1RfVlA5X0RFQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WUDlfREVDLEdzdFZQOURlY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1ZQOV9ERUMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WUDlfREVDKSkKKyNkZWZpbmUgR1NUX0lTX1ZQOV9ERUNfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1ZQOV9ERUMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VlA5RGVjIEdzdFZQOURlYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWUDlEZWNDbGFzcyBHc3RWUDlEZWNDbGFzczsKKworc3RydWN0IF9Hc3RWUDlEZWMKK3sKKyAgR3N0VlBYRGVjIGJhc2VfdnB4X2RlY29kZXI7Cit9OworCitzdHJ1Y3QgX0dzdFZQOURlY0NsYXNzCit7CisgIEdzdFZQWERlY0NsYXNzIGJhc2VfdnB4X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3ZwOV9kZWNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYKKworI2VuZGlmIC8qIF9fR1NUX1ZQOV9ERUNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvdnB4L2dzdHZwOWVuYy5jIGIvZXh0L3ZweC9nc3R2cDllbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDhmOWEyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3ZweC9nc3R2cDllbmMuYwpAQCAtMCwwICsxLDI1MiBAQAorLyogVlA5CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRW50cm9weSBXYXZlIEluYworICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTMgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtdnA5ZW5jCisgKiBAc2VlX2Fsc286IHZwOWRlYywgd2VibW11eCwgb2dnbXV4CisgKgorICogVGhpcyBlbGVtZW50IGVuY29kZXMgcmF3IHZpZGVvIGludG8gYSBWUDkgc3RyZWFtLgorICogPHVsaW5rIHVybD0iaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmciPlZQOTwvdWxpbms+IGlzIGEgcm95YWx0eS1mcmVlCisgKiB2aWRlbyBjb2RlYyBtYWludGFpbmVkIGJ5IDx1bGluayB1cmw9Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8iPkdvb2dsZQorICogPC91bGluaz4uIEl0J3MgdGhlIHN1Y2Nlc3NvciBvZiBPbjIgVlAzLCB3aGljaCB3YXMgdGhlIGJhc2Ugb2YgdGhlCisgKiBUaGVvcmEgdmlkZW8gY29kZWMuCisgKgorICogVG8gY29udHJvbCB0aGUgcXVhbGl0eSBvZiB0aGUgZW5jb2RpbmcsIHRoZSAjR3N0VlA5RW5jOjp0YXJnZXQtYml0cmF0ZSwKKyAqICNHc3RWUDlFbmM6Om1pbi1xdWFudGl6ZXIsICNHc3RWUDlFbmM6Om1heC1xdWFudGl6ZXIgb3IgI0dzdFZQOUVuYzo6Y3EtbGV2ZWwKKyAqIHByb3BlcnRpZXMgY2FuIGJlIHVzZWQuIFdoaWNoIG9uZSBpcyB1c2VkIGRlcGVuZHMgb24gdGhlIG1vZGUgc2VsZWN0ZWQgYnkKKyAqIHRoZSAjR3N0VlA5RW5jOjplbmQtdXNhZ2UgcHJvcGVydHkuCisgKiBTZWUgPHVsaW5rIHVybD0iaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvZG9jcy9lbmNvZGVyLXBhcmFtZXRlcnMvIj5FbmNvZGVyIFBhcmFtZXRlcnM8L3VsaW5rPgorICogZm9yIGV4cGxhbmF0aW9uLCBleGFtcGxlcyBmb3IgdXNlZnVsIGVuY29kaW5nIHBhcmFtZXRlcnMgYW5kIG1vcmUgZGV0YWlscworICogb24gdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0xMDAwICEgdnA5ZW5jICEgd2VibW11eCAhIGZpbGVzaW5rIGxvY2F0aW9uPXZpZGVvdGVzdHNyYy53ZWJtCisgKiBdfCBUaGlzIGV4YW1wbGUgcGlwZWxpbmUgd2lsbCBlbmNvZGUgYSB0ZXN0IHZpZGVvIHNvdXJjZSB0byBWUDkgbXV4ZWQgaW4gYW4KKyAqIFdlYk0gY29udGFpbmVyLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1ZQOV9FTkNPREVSCisKKy8qIGdsaWIgZGVjaWRlZCBpbiAyLjMyIGl0IHdvdWxkIGJlIGEgZ3JlYXQgaWRlYSB0byBkZXByZWNhdGVkIEdWYWx1ZUFycmF5IHdpdGhvdXQKKyAqIHByb3ZpZGluZyBhbiBhbHRlcm5hdGl2ZQorICoKKyAqIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjY3MjI4CisgKiAqLworI2RlZmluZSBHTElCX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKworI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3R2cDh1dGlscy5oIgorI2luY2x1ZGUgImdzdHZwOWVuYy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfdnA5ZW5jX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF92cDllbmNfZGVidWcKKworCisvKiBGSVhNRTogWTQyQiBhbmQgWTQ0NCBkbyBub3Qgd29yayB5ZXQgaXQgc2VlbXMgKi8KK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfdnA5X2VuY19zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIC8qR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBJNDIwLCBZVjEyLCBZNDJCLCBZNDQ0IH0iKSkgKi8KKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IEk0MjAsIFlWMTIgfSIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfdnA5X2VuY19zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtdnA5LCAiICJwcm9maWxlID0gKHN0cmluZykgezAsIDEsIDIsIDN9IikKKyAgICApOworCisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfdnA5X2VuY19wYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFZQOUVuYywgZ3N0X3ZwOV9lbmMsIEdTVF9UWVBFX1ZQWF9FTkMpOworCitzdGF0aWMgdnB4X2NvZGVjX2lmYWNlX3QgKmdzdF92cDlfZW5jX2dldF9hbGdvIChHc3RWUFhFbmMgKiBlbmMpOworc3RhdGljIGdib29sZWFuIGdzdF92cDlfZW5jX2VuYWJsZV9zY2FsaW5nIChHc3RWUFhFbmMgKiBlbmMpOworc3RhdGljIHZvaWQgZ3N0X3ZwOV9lbmNfc2V0X2ltYWdlX2Zvcm1hdCAoR3N0VlBYRW5jICogZW5jLCB2cHhfaW1hZ2VfdCAqIGltYWdlKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfdnA5X2VuY19nZXRfbmV3X3NpbXBsZV9jYXBzIChHc3RWUFhFbmMgKiBlbmMpOworc3RhdGljIHZvaWQgZ3N0X3ZwOV9lbmNfc2V0X3N0cmVhbV9pbmZvIChHc3RWUFhFbmMgKiBlbmMsIEdzdENhcHMgKiBjYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluZm8pOworc3RhdGljIHZvaWQgKmdzdF92cDlfZW5jX3Byb2Nlc3NfZnJhbWVfdXNlcl9kYXRhIChHc3RWUFhFbmMgKiBlbmMsCisgICAgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3ZwOV9lbmNfaGFuZGxlX2ludmlzaWJsZV9mcmFtZV9idWZmZXIgKEdzdFZQWEVuYyAqIGVuYywKKyAgICB2b2lkICp1c2VyX2RhdGEsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CitzdGF0aWMgdm9pZCBnc3RfdnA5X2VuY19zZXRfZnJhbWVfdXNlcl9kYXRhIChHc3RWUFhFbmMgKiBlbmMsCisgICAgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUsIHZweF9pbWFnZV90ICogaW1hZ2UpOworCitzdGF0aWMgdm9pZAorZ3N0X3ZwOV9lbmNfY2xhc3NfaW5pdCAoR3N0VlA5RW5jQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHc3RWUFhFbmNDbGFzcyAqdnB4X2VuY29kZXJfY2xhc3M7CisKKyAgZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIHZweF9lbmNvZGVyX2NsYXNzID0gR1NUX1ZQWF9FTkNfQ0xBU1MgKGtsYXNzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfdnA5X2VuY19zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfdnA5X2VuY19zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIk9uMiBWUDkgRW5jb2RlciIsCisgICAgICAiQ29kZWMvRW5jb2Rlci9WaWRlbyIsCisgICAgICAiRW5jb2RlIFZQOSB2aWRlbyBzdHJlYW1zIiwgIkRhdmlkIFNjaGxlZWYgPGRzQGVudHJvcHl3YXZlLmNvbT4sICIKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKKworICB2cHhfZW5jb2Rlcl9jbGFzcy0+Z2V0X2FsZ28gPSBnc3RfdnA5X2VuY19nZXRfYWxnbzsKKyAgdnB4X2VuY29kZXJfY2xhc3MtPmVuYWJsZV9zY2FsaW5nID0gZ3N0X3ZwOV9lbmNfZW5hYmxlX3NjYWxpbmc7CisgIHZweF9lbmNvZGVyX2NsYXNzLT5zZXRfaW1hZ2VfZm9ybWF0ID0gZ3N0X3ZwOV9lbmNfc2V0X2ltYWdlX2Zvcm1hdDsKKyAgdnB4X2VuY29kZXJfY2xhc3MtPmdldF9uZXdfdnB4X2NhcHMgPSBnc3RfdnA5X2VuY19nZXRfbmV3X3NpbXBsZV9jYXBzOworICB2cHhfZW5jb2Rlcl9jbGFzcy0+c2V0X3N0cmVhbV9pbmZvID0gZ3N0X3ZwOV9lbmNfc2V0X3N0cmVhbV9pbmZvOworICB2cHhfZW5jb2Rlcl9jbGFzcy0+cHJvY2Vzc19mcmFtZV91c2VyX2RhdGEgPQorICAgICAgZ3N0X3ZwOV9lbmNfcHJvY2Vzc19mcmFtZV91c2VyX2RhdGE7CisgIHZweF9lbmNvZGVyX2NsYXNzLT5oYW5kbGVfaW52aXNpYmxlX2ZyYW1lX2J1ZmZlciA9CisgICAgICBnc3RfdnA5X2VuY19oYW5kbGVfaW52aXNpYmxlX2ZyYW1lX2J1ZmZlcjsKKyAgdnB4X2VuY29kZXJfY2xhc3MtPnNldF9mcmFtZV91c2VyX2RhdGEgPSBnc3RfdnA5X2VuY19zZXRfZnJhbWVfdXNlcl9kYXRhOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfdnA5ZW5jX2RlYnVnLCAidnA5ZW5jIiwgMCwgIlZQOSBFbmNvZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnA5X2VuY19pbml0IChHc3RWUDlFbmMgKiBnc3RfdnA5X2VuYykKK3sKKyAgdnB4X2NvZGVjX2Vycl90IHN0YXR1czsKKyAgR3N0VlBYRW5jICpnc3RfdnB4X2VuYyA9IEdTVF9WUFhfRU5DIChnc3RfdnA5X2VuYyk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGdzdF92cDlfZW5jLCAiZ3N0X3ZwOV9lbmNfaW5pdCIpOworICBzdGF0dXMgPQorICAgICAgdnB4X2NvZGVjX2VuY19jb25maWdfZGVmYXVsdCAoZ3N0X3ZwOV9lbmNfZ2V0X2FsZ28gKGdzdF92cHhfZW5jKSwKKyAgICAgICZnc3RfdnB4X2VuYy0+Y2ZnLCAwKTsKKyAgaWYgKHN0YXR1cyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChnc3RfdnB4X2VuYywKKyAgICAgICAgIkZhaWxlZCB0byBnZXQgZGVmYXVsdCBlbmNvZGVyIGNvbmZpZ3VyYXRpb246ICVzIiwKKyAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgICBnc3RfdnB4X2VuYy0+aGF2ZV9kZWZhdWx0X2NvbmZpZyA9IEZBTFNFOworICB9IGVsc2UgeworICAgIGdzdF92cHhfZW5jLT5oYXZlX2RlZmF1bHRfY29uZmlnID0gVFJVRTsKKyAgfQorfQorCitzdGF0aWMgdnB4X2NvZGVjX2lmYWNlX3QgKgorZ3N0X3ZwOV9lbmNfZ2V0X2FsZ28gKEdzdFZQWEVuYyAqIGVuYykKK3sKKyAgcmV0dXJuICZ2cHhfY29kZWNfdnA5X2N4X2FsZ287Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZwOV9lbmNfZW5hYmxlX3NjYWxpbmcgKEdzdFZQWEVuYyAqIGVuYykKK3sKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZwOV9lbmNfc2V0X2ltYWdlX2Zvcm1hdCAoR3N0VlBYRW5jICogZW5jLCB2cHhfaW1hZ2VfdCAqIGltYWdlKQoreworICBzd2l0Y2ggKGVuYy0+aW5wdXRfc3RhdGUtPmluZm8uZmluZm8tPmZvcm1hdCkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOgorICAgICAgaW1hZ2UtPmZtdCA9IFZQWF9JTUdfRk1UX0k0MjA7CisgICAgICBpbWFnZS0+YnBzID0gMTI7CisgICAgICBpbWFnZS0+eF9jaHJvbWFfc2hpZnQgPSBpbWFnZS0+eV9jaHJvbWFfc2hpZnQgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgICBpbWFnZS0+Zm10ID0gVlBYX0lNR19GTVRfWVYxMjsKKyAgICAgIGltYWdlLT5icHMgPSAxMjsKKyAgICAgIGltYWdlLT54X2Nocm9tYV9zaGlmdCA9IGltYWdlLT55X2Nocm9tYV9zaGlmdCA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQyQjoKKyAgICAgIGltYWdlLT5mbXQgPSBWUFhfSU1HX0ZNVF9JNDIyOworICAgICAgaW1hZ2UtPmJwcyA9IDE2OworICAgICAgaW1hZ2UtPnhfY2hyb21hX3NoaWZ0ID0gMTsKKyAgICAgIGltYWdlLT55X2Nocm9tYV9zaGlmdCA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQ0NDoKKyAgICAgIGltYWdlLT5mbXQgPSBWUFhfSU1HX0ZNVF9JNDQ0OworICAgICAgaW1hZ2UtPmJwcyA9IDI0OworICAgICAgaW1hZ2UtPnhfY2hyb21hX3NoaWZ0ID0gaW1hZ2UtPnlfY2hyb21hX3NoaWZ0ID0gMDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF92cDlfZW5jX2dldF9uZXdfc2ltcGxlX2NhcHMgKEdzdFZQWEVuYyAqIGVuYykKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2NoYXIgKnByb2ZpbGVfc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiJWQiLCBlbmMtPmNmZy5nX3Byb2ZpbGUpOworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtdnA5IiwKKyAgICAgICJwcm9maWxlIiwgR19UWVBFX1NUUklORywgcHJvZmlsZV9zdHIsIE5VTEwpOworICBnX2ZyZWUgKHByb2ZpbGVfc3RyKTsKKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnA5X2VuY19zZXRfc3RyZWFtX2luZm8gKEdzdFZQWEVuYyAqIGVuYywgR3N0Q2FwcyAqIGNhcHMsCisgICAgR3N0VmlkZW9JbmZvICogaW5mbykKK3sKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCAqCitnc3RfdnA5X2VuY19wcm9jZXNzX2ZyYW1lX3VzZXJfZGF0YSAoR3N0VlBYRW5jICogZW5jLAorICAgIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKQoreworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92cDlfZW5jX2hhbmRsZV9pbnZpc2libGVfZnJhbWVfYnVmZmVyIChHc3RWUFhFbmMgKiBlbmMsIHZvaWQgKnVzZXJfZGF0YSwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBnX211dGV4X3VubG9jayAoJmVuYy0+ZW5jb2Rlcl9sb2NrKTsKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChHU1RfVklERU9fRU5DT0RFUl9TUkNfUEFEIChlbmMpLCBidWZmZXIpOworICBnX211dGV4X2xvY2sgKCZlbmMtPmVuY29kZXJfbG9jayk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnA5X2VuY191c2VyX2RhdGFfZnJlZSAodnB4X2ltYWdlX3QgKiBpbWFnZSkKK3sKKyAgZ19zbGljZV9mcmVlICh2cHhfaW1hZ2VfdCwgaW1hZ2UpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZwOV9lbmNfc2V0X2ZyYW1lX3VzZXJfZGF0YSAoR3N0VlBYRW5jICogZW5jLCBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSwKKyAgICB2cHhfaW1hZ2VfdCAqIGltYWdlKQoreworICBnc3RfdmlkZW9fY29kZWNfZnJhbWVfc2V0X3VzZXJfZGF0YSAoZnJhbWUsIGltYWdlLAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfdnA5X2VuY191c2VyX2RhdGFfZnJlZSk7CisgIHJldHVybjsKK30KKworI2VuZGlmIC8qIEhBVkVfVlA5X0VOQ09ERVIgKi8KZGlmZiAtLWdpdCBhL2V4dC92cHgvZ3N0dnA5ZW5jLmggYi9leHQvdnB4L2dzdHZwOWVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MzM3MmIKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdnB4L2dzdHZwOWVuYy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qIFZQOQorICogQ29weXJpZ2h0IChDKSAyMDA2IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDEwIEVudHJvcHkgV2F2ZSBJbmMKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKyNpZm5kZWYgX19HU1RfVlA5X0VOQ19IX18KKyNkZWZpbmUgX19HU1RfVlA5X0VOQ19IX18KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9WUDlfRU5DT0RFUgorCisjaW5jbHVkZSA8Z3N0dnB4ZW5jLmg+CisKKy8qIEZJWE1FOiBVbmRlZiBIQVZFX0NPTkZJR19IIGJlY2F1c2UgdnB4X2NvZGVjLmggdXNlcyBpdCwKKyAqIHdoaWNoIGNhdXNlcyBjb21waWxhdGlvbiBmYWlsdXJlcyAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyN1bmRlZiBIQVZFX0NPTkZJR19ICisjZW5kaWYKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1ZQOV9FTkMgXAorICAoZ3N0X3ZwOV9lbmNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1ZQOV9FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9WUDlfRU5DLEdzdFZQOUVuYykpCisjZGVmaW5lIEdTVF9WUDlfRU5DX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1ZQOV9FTkMsR3N0VlA5RW5jQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVlA5X0VOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1ZQOV9FTkMpKQorI2RlZmluZSBHU1RfSVNfVlA5X0VOQ19DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVlA5X0VOQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWUDlFbmMgR3N0VlA5RW5jOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZQOUVuY0NsYXNzIEdzdFZQOUVuY0NsYXNzOworCitzdHJ1Y3QgX0dzdFZQOUVuYworeworCUdzdFZQWEVuYyBiYXNlX3ZweF9lbmNvZGVyOworfTsKKworc3RydWN0IF9Hc3RWUDlFbmNDbGFzcworeworICBHc3RWUFhFbmNDbGFzcyAgYmFzZV92cHhlbmNfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfdnA5X2VuY19nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgorCisjZW5kaWYgLyogX19HU1RfVlA5X0VOQ19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC92cHgvZ3N0dnB4ZGVjLmMgYi9leHQvdnB4L2dzdHZweGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZjBmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdnB4L2dzdHZweGRlYy5jCkBAIC0wLDAgKzEsODIwIEBACisvKiBWUFgKKyAqIENvcHlyaWdodCAoQykgMjAwNiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDA5LDIwMTAgRW50cm9weSBXYXZlIEluYworICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTIgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoSEFWRV9WUDhfREVDT0RFUikgfHwgZGVmaW5lZChIQVZFX1ZQOV9ERUNPREVSKQorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3R2cHhkZWMuaCIKKyNpbmNsdWRlICJnc3R2cDh1dGlscy5oIgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvbWV0YS5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb3Bvb2wuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3ZweGRlY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfdnB4ZGVjX2RlYnVnCisKKyNkZWZpbmUgREVGQVVMVF9QT1NUX1BST0NFU1NJTkcgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9QT1NUX1BST0NFU1NJTkdfRkxBR1MgKFZQOF9ERUJMT0NLIHwgVlA4X0RFTUFDUk9CTE9DSyB8IFZQOF9NRlFFKQorI2RlZmluZSBERUZBVUxUX0RFQkxPQ0tJTkdfTEVWRUwgNAorI2RlZmluZSBERUZBVUxUX05PSVNFX0xFVkVMIDAKKyNkZWZpbmUgREVGQVVMVF9USFJFQURTIDAKKyNkZWZpbmUgREVGQVVMVF9WSURFT19DT0RFQ19UQUcgTlVMTAorI2RlZmluZSBERUZBVUxUX0NPREVDX0FMR08gTlVMTAorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9QT1NUX1BST0NFU1NJTkcsCisgIFBST1BfUE9TVF9QUk9DRVNTSU5HX0ZMQUdTLAorICBQUk9QX0RFQkxPQ0tJTkdfTEVWRUwsCisgIFBST1BfTk9JU0VfTEVWRUwsCisgIFBST1BfVEhSRUFEUworfTsKKworI2RlZmluZSBDX0ZMQUdTKHYpICgoZ3VpbnQpIHYpCisjZGVmaW5lIEdTVF9WUFhfREVDX1RZUEVfUE9TVF9QUk9DRVNTSU5HX0ZMQUdTIChnc3RfdnB4X2RlY19wb3N0X3Byb2Nlc3NpbmdfZmxhZ3NfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3ZweF9kZWNfcG9zdF9wcm9jZXNzaW5nX2ZsYWdzX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgY29uc3QgR0ZsYWdzVmFsdWUgdmFsdWVzW10gPSB7CisgICAge0NfRkxBR1MgKFZQOF9ERUJMT0NLKSwgIkRlYmxvY2siLCAiZGVibG9jayJ9LAorICAgIHtDX0ZMQUdTIChWUDhfREVNQUNST0JMT0NLKSwgIkRlbWFjcm9ibG9jayIsICJkZW1hY3JvYmxvY2sifSwKKyAgICB7Q19GTEFHUyAoVlA4X0FERE5PSVNFKSwgIkFkZCBub2lzZSIsICJhZGRub2lzZSJ9LAorICAgIHtDX0ZMQUdTIChWUDhfREVCVUdfVFhUX0ZSQU1FX0lORk8pLAorICAgICAgICAgICJQcmludCBmcmFtZSBpbmZvcm1hdGlvbiIsCisgICAgICAgICJ2aXN1YWxpemUtZnJhbWUtaW5mbyJ9LAorICAgIHtDX0ZMQUdTIChWUDhfREVCVUdfVFhUX01CTEtfTU9ERVMpLAorICAgICAgICAgICJTaG93IG1hY3JvYmxvY2sgbW9kZSBzZWxlY3Rpb24gb3ZlcmxhaWQgb24gaW1hZ2UiLAorICAgICAgICAidmlzdWFsaXplLW1hY3JvYmxvY2stbW9kZXMifSwKKyAgICB7Q19GTEFHUyAoVlA4X0RFQlVHX1RYVF9EQ19ESUZGKSwKKyAgICAgICAgICAiU2hvdyBkYyBkaWZmIGZvciBlYWNoIG1hY3JvIGJsb2NrIG92ZXJsYWlkIG9uIGltYWdlIiwKKyAgICAgICAgInZpc3VhbGl6ZS1kYy1kaWZmIn0sCisgICAge0NfRkxBR1MgKFZQOF9ERUJVR19UWFRfUkFURV9JTkZPKSwKKyAgICAgICAgICAiUHJpbnQgdmlkZW8gcmF0ZSBpbmZvIiwKKyAgICAgICAgInZpc3VhbGl6ZS1yYXRlLWluZm8ifSwKKyAgICB7Q19GTEFHUyAoVlA4X01GUUUpLCAiTXVsdGktZnJhbWUgcXVhbGl0eSBlbmhhbmNlbWVudCIsICJtZnFlIn0sCisgICAgezAsIE5VTEwsIE5VTEx9CisgIH07CisgIHN0YXRpYyB2b2xhdGlsZSBHVHlwZSBpZCA9IDA7CisKKyAgaWYgKGdfb25jZV9pbml0X2VudGVyICgoZ3NpemUgKikgJiBpZCkpIHsKKyAgICBHVHlwZSBfaWQ7CisKKyAgICBfaWQgPSBnX2ZsYWdzX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFZQWERlY1Bvc3RQcm9jZXNzaW5nRmxhZ3MiLCB2YWx1ZXMpOworCisgICAgZ19vbmNlX2luaXRfbGVhdmUgKChnc2l6ZSAqKSAmIGlkLCBfaWQpOworICB9CisKKyAgcmV0dXJuIGlkOworfQorCisjdW5kZWYgQ19GTEFHUworCitzdGF0aWMgdm9pZCBnc3RfdnB4X2RlY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfdnB4X2RlY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdnB4X2RlY19zdGFydCAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2Rlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZweF9kZWNfc3RvcCAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2Rlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZweF9kZWNfc2V0X2Zvcm1hdCAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlciwKKyAgICBHc3RWaWRlb0NvZGVjU3RhdGUgKiBzdGF0ZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZweF9kZWNfZmx1c2ggKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92cHhfZGVjX2hhbmRsZV9mcmFtZSAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlciwKKyAgICBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZweF9kZWNfZGVjaWRlX2FsbG9jYXRpb24gKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIsCisgICAgR3N0UXVlcnkgKiBxdWVyeSk7CisKK3N0YXRpYyB2b2lkIGdzdF92cHhfZGVjX2ltYWdlX3RvX2J1ZmZlciAoR3N0VlBYRGVjICogZGVjLAorICAgIGNvbnN0IHZweF9pbWFnZV90ICogaW1nLCBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3ZweF9kZWNfb3Blbl9jb2RlYyAoR3N0VlBYRGVjICogZGVjLAorICAgIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKTsKK3N0YXRpYyB2b2lkIGdzdF92cHhfZGVjX2RlZmF1bHRfc2VuZF90YWdzIChHc3RWUFhEZWMgKiBkZWMpOworc3RhdGljIHZvaWQgZ3N0X3ZweF9kZWNfc2V0X3N0cmVhbV9pbmZvIChHc3RWUFhEZWMgKiBkZWMsCisgICAgdnB4X2NvZGVjX3N0cmVhbV9pbmZvX3QgKiBzdHJlYW1faW5mbyk7CitzdGF0aWMgdm9pZCBnc3RfdnB4X2RlY19zZXRfZGVmYXVsdF9mb3JtYXQgKEdzdFZQWERlYyAqIGRlYywgR3N0VmlkZW9Gb3JtYXQgZm10LAorICAgIGludCB3aWR0aCwgaW50IGhlaWdodCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZweF9kZWNfZGVmYXVsdF9mcmFtZV9mb3JtYXQgKEdzdFZQWERlYyAqIGRlYywKKyAgICB2cHhfaW1hZ2VfdCAqIGltZywgR3N0VmlkZW9Gb3JtYXQgKiBmbXQpOworc3RhdGljIHZvaWQgZ3N0X3ZweF9kZWNfaGFuZGxlX3Jlc29sdXRpb25fY2hhbmdlIChHc3RWUFhEZWMgKiBkZWMsCisgICAgdnB4X2ltYWdlX3QgKiBpbWcsIEdzdFZpZGVvRm9ybWF0IGZtdCk7CisKKyNkZWZpbmUgcGFyZW50X2NsYXNzIGdzdF92cHhfZGVjX3BhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0VlBYRGVjLCBnc3RfdnB4X2RlYywgR1NUX1RZUEVfVklERU9fREVDT0RFUik7CisKK3N0YXRpYyB2b2lkCitnc3RfdnB4X2RlY19jbGFzc19pbml0IChHc3RWUFhEZWNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdFZpZGVvRGVjb2RlckNsYXNzICpiYXNlX3ZpZGVvX2RlY29kZXJfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIGJhc2VfdmlkZW9fZGVjb2Rlcl9jbGFzcyA9IEdTVF9WSURFT19ERUNPREVSX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3ZweF9kZWNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfdnB4X2RlY19nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QT1NUX1BST0NFU1NJTkcsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInBvc3QtcHJvY2Vzc2luZyIsICJQb3N0IFByb2Nlc3NpbmciLAorICAgICAgICAgICJFbmFibGUgcG9zdCBwcm9jZXNzaW5nIiwgREVGQVVMVF9QT1NUX1BST0NFU1NJTkcsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QT1NUX1BST0NFU1NJTkdfRkxBR1MsCisgICAgICBnX3BhcmFtX3NwZWNfZmxhZ3MgKCJwb3N0LXByb2Nlc3NpbmctZmxhZ3MiLCAiUG9zdCBQcm9jZXNzaW5nIEZsYWdzIiwKKyAgICAgICAgICAiRmxhZ3MgdG8gY29udHJvbCBwb3N0IHByb2Nlc3NpbmciLAorICAgICAgICAgIEdTVF9WUFhfREVDX1RZUEVfUE9TVF9QUk9DRVNTSU5HX0ZMQUdTLCBERUZBVUxUX1BPU1RfUFJPQ0VTU0lOR19GTEFHUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RFQkxPQ0tJTkdfTEVWRUwsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoImRlYmxvY2tpbmctbGV2ZWwiLCAiRGVibG9ja2luZyBMZXZlbCIsCisgICAgICAgICAgIkRlYmxvY2tpbmcgbGV2ZWwiLAorICAgICAgICAgIDAsIDE2LCBERUZBVUxUX0RFQkxPQ0tJTkdfTEVWRUwsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9OT0lTRV9MRVZFTCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibm9pc2UtbGV2ZWwiLCAiTm9pc2UgTGV2ZWwiLAorICAgICAgICAgICJOb2lzZSBsZXZlbCIsCisgICAgICAgICAgMCwgMTYsIERFRkFVTFRfTk9JU0VfTEVWRUwsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJFQURTLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJ0aHJlYWRzIiwgIk1heCBUaHJlYWRzIiwKKyAgICAgICAgICAiTWF4aW11bSBudW1iZXIgb2YgZGVjb2RpbmcgdGhyZWFkcyIsCisgICAgICAgICAgMCwgMTYsIERFRkFVTFRfVEhSRUFEUywgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgYmFzZV92aWRlb19kZWNvZGVyX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdnB4X2RlY19zdGFydCk7CisgIGJhc2VfdmlkZW9fZGVjb2Rlcl9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdnB4X2RlY19zdG9wKTsKKyAgYmFzZV92aWRlb19kZWNvZGVyX2NsYXNzLT5mbHVzaCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdnB4X2RlY19mbHVzaCk7CisgIGJhc2VfdmlkZW9fZGVjb2Rlcl9jbGFzcy0+c2V0X2Zvcm1hdCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3ZweF9kZWNfc2V0X2Zvcm1hdCk7CisgIGJhc2VfdmlkZW9fZGVjb2Rlcl9jbGFzcy0+aGFuZGxlX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdnB4X2RlY19oYW5kbGVfZnJhbWUpOzsKKyAgYmFzZV92aWRlb19kZWNvZGVyX2NsYXNzLT5kZWNpZGVfYWxsb2NhdGlvbiA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3ZweF9kZWNfZGVjaWRlX2FsbG9jYXRpb24pOworCisgIGtsYXNzLT52aWRlb19jb2RlY190YWcgPSBERUZBVUxUX1ZJREVPX0NPREVDX1RBRzsKKyAga2xhc3MtPmNvZGVjX2FsZ28gPSBERUZBVUxUX0NPREVDX0FMR087CisgIGtsYXNzLT5vcGVuX2NvZGVjID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92cHhfZGVjX29wZW5fY29kZWMpOworICBrbGFzcy0+c2VuZF90YWdzID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92cHhfZGVjX2RlZmF1bHRfc2VuZF90YWdzKTsKKyAga2xhc3MtPnNldF9zdHJlYW1faW5mbyA9IE5VTEw7CisgIGtsYXNzLT5zZXRfZGVmYXVsdF9mb3JtYXQgPSBOVUxMOworICBrbGFzcy0+aGFuZGxlX3Jlc29sdXRpb25fY2hhbmdlID0gTlVMTDsKKyAga2xhc3MtPmdldF9mcmFtZV9mb3JtYXQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92cHhfZGVjX2RlZmF1bHRfZnJhbWVfZm9ybWF0KTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3ZweGRlY19kZWJ1ZywgInZweGRlYyIsIDAsICJWUFggRGVjb2RlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZweF9kZWNfaW5pdCAoR3N0VlBYRGVjICogZ3N0X3ZweF9kZWMpCit7CisgIEdzdFZpZGVvRGVjb2RlciAqZGVjb2RlciA9IChHc3RWaWRlb0RlY29kZXIgKikgZ3N0X3ZweF9kZWM7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZ3N0X3ZweF9kZWMsICJnc3RfdnB4X2RlY19pbml0Iik7CisgIGdzdF92aWRlb19kZWNvZGVyX3NldF9wYWNrZXRpemVkIChkZWNvZGVyLCBUUlVFKTsKKyAgZ3N0X3ZweF9kZWMtPnBvc3RfcHJvY2Vzc2luZyA9IERFRkFVTFRfUE9TVF9QUk9DRVNTSU5HOworICBnc3RfdnB4X2RlYy0+cG9zdF9wcm9jZXNzaW5nX2ZsYWdzID0gREVGQVVMVF9QT1NUX1BST0NFU1NJTkdfRkxBR1M7CisgIGdzdF92cHhfZGVjLT5kZWJsb2NraW5nX2xldmVsID0gREVGQVVMVF9ERUJMT0NLSU5HX0xFVkVMOworICBnc3RfdnB4X2RlYy0+bm9pc2VfbGV2ZWwgPSBERUZBVUxUX05PSVNFX0xFVkVMOworCisgIGdzdF92aWRlb19kZWNvZGVyX3NldF9uZWVkc19mb3JtYXQgKGRlY29kZXIsIFRSVUUpOworICBnc3RfdmlkZW9fZGVjb2Rlcl9zZXRfdXNlX2RlZmF1bHRfcGFkX2FjY2VwdGNhcHMgKGRlY29kZXIsIFRSVUUpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9WSURFT19ERUNPREVSX1NJTktfUEFEIChkZWNvZGVyKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnB4X2RlY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VlBYRGVjICpkZWM7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1ZQWF9ERUMgKG9iamVjdCkpOworICBkZWMgPSBHU1RfVlBYX0RFQyAob2JqZWN0KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChvYmplY3QsICJnc3RfdnB4X2RlY19zZXRfcHJvcGVydHkiKTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BPU1RfUFJPQ0VTU0lORzoKKyAgICAgIGRlYy0+cG9zdF9wcm9jZXNzaW5nID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BPU1RfUFJPQ0VTU0lOR19GTEFHUzoKKyAgICAgIGRlYy0+cG9zdF9wcm9jZXNzaW5nX2ZsYWdzID0gZ192YWx1ZV9nZXRfZmxhZ3MgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERUJMT0NLSU5HX0xFVkVMOgorICAgICAgZGVjLT5kZWJsb2NraW5nX2xldmVsID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05PSVNFX0xFVkVMOgorICAgICAgZGVjLT5ub2lzZV9sZXZlbCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJFQURTOgorICAgICAgZGVjLT50aHJlYWRzID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZweF9kZWNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFZQWERlYyAqZGVjOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19WUFhfREVDIChvYmplY3QpKTsKKyAgZGVjID0gR1NUX1ZQWF9ERUMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BPU1RfUFJPQ0VTU0lORzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBkZWMtPnBvc3RfcHJvY2Vzc2luZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUE9TVF9QUk9DRVNTSU5HX0ZMQUdTOgorICAgICAgZ192YWx1ZV9zZXRfZmxhZ3MgKHZhbHVlLCBkZWMtPnBvc3RfcHJvY2Vzc2luZ19mbGFncyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfREVCTE9DS0lOR19MRVZFTDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBkZWMtPmRlYmxvY2tpbmdfbGV2ZWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05PSVNFX0xFVkVMOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIGRlYy0+bm9pc2VfbGV2ZWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUkVBRFM6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgZGVjLT50aHJlYWRzKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdnB4X2RlY19zdGFydCAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlcikKK3sKKyAgR3N0VlBYRGVjICpnc3RfdnB4X2RlYyA9IEdTVF9WUFhfREVDIChkZWNvZGVyKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChnc3RfdnB4X2RlYywgInN0YXJ0Iik7CisgIGdzdF92cHhfZGVjLT5kZWNvZGVyX2luaXRlZCA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92cHhfZGVjX3N0b3AgKEdzdFZpZGVvRGVjb2RlciAqIGJhc2VfdmlkZW9fZGVjb2RlcikKK3sKKyAgR3N0VlBYRGVjICpnc3RfdnB4X2RlYyA9IEdTVF9WUFhfREVDIChiYXNlX3ZpZGVvX2RlY29kZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGdzdF92cHhfZGVjLCAic3RvcCIpOworCisgIGlmIChnc3RfdnB4X2RlYy0+b3V0cHV0X3N0YXRlKSB7CisgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChnc3RfdnB4X2RlYy0+b3V0cHV0X3N0YXRlKTsKKyAgICBnc3RfdnB4X2RlYy0+b3V0cHV0X3N0YXRlID0gTlVMTDsKKyAgfQorCisgIGlmIChnc3RfdnB4X2RlYy0+aW5wdXRfc3RhdGUpIHsKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKGdzdF92cHhfZGVjLT5pbnB1dF9zdGF0ZSk7CisgICAgZ3N0X3ZweF9kZWMtPmlucHV0X3N0YXRlID0gTlVMTDsKKyAgfQorCisgIGlmIChnc3RfdnB4X2RlYy0+ZGVjb2Rlcl9pbml0ZWQpCisgICAgdnB4X2NvZGVjX2Rlc3Ryb3kgKCZnc3RfdnB4X2RlYy0+ZGVjb2Rlcik7CisgIGdzdF92cHhfZGVjLT5kZWNvZGVyX2luaXRlZCA9IEZBTFNFOworCisgIGlmIChnc3RfdnB4X2RlYy0+cG9vbCkgeworICAgIGdzdF9idWZmZXJfcG9vbF9zZXRfYWN0aXZlIChnc3RfdnB4X2RlYy0+cG9vbCwgRkFMU0UpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGdzdF92cHhfZGVjLT5wb29sKTsKKyAgICBnc3RfdnB4X2RlYy0+cG9vbCA9IE5VTEw7CisgICAgZ3N0X3ZweF9kZWMtPmJ1Zl9zaXplID0gMDsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92cHhfZGVjX3NldF9mb3JtYXQgKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIsIEdzdFZpZGVvQ29kZWNTdGF0ZSAqIHN0YXRlKQoreworICBHc3RWUFhEZWMgKmdzdF92cHhfZGVjID0gR1NUX1ZQWF9ERUMgKGRlY29kZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGdzdF92cHhfZGVjLCAic2V0X2Zvcm1hdCIpOworCisgIGlmIChnc3RfdnB4X2RlYy0+ZGVjb2Rlcl9pbml0ZWQpCisgICAgdnB4X2NvZGVjX2Rlc3Ryb3kgKCZnc3RfdnB4X2RlYy0+ZGVjb2Rlcik7CisgIGdzdF92cHhfZGVjLT5kZWNvZGVyX2luaXRlZCA9IEZBTFNFOworCisgIGlmIChnc3RfdnB4X2RlYy0+b3V0cHV0X3N0YXRlKSB7CisgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChnc3RfdnB4X2RlYy0+b3V0cHV0X3N0YXRlKTsKKyAgICBnc3RfdnB4X2RlYy0+b3V0cHV0X3N0YXRlID0gTlVMTDsKKyAgfQorCisgIGlmIChnc3RfdnB4X2RlYy0+aW5wdXRfc3RhdGUpIHsKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKGdzdF92cHhfZGVjLT5pbnB1dF9zdGF0ZSk7CisgIH0KKworICBnc3RfdnB4X2RlYy0+aW5wdXRfc3RhdGUgPSBnc3RfdmlkZW9fY29kZWNfc3RhdGVfcmVmIChzdGF0ZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZweF9kZWNfZmx1c2ggKEdzdFZpZGVvRGVjb2RlciAqIGJhc2VfdmlkZW9fZGVjb2RlcikKK3sKKyAgR3N0VlBYRGVjICpkZWNvZGVyOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VfdmlkZW9fZGVjb2RlciwgImZsdXNoIik7CisKKyAgZGVjb2RlciA9IEdTVF9WUFhfREVDIChiYXNlX3ZpZGVvX2RlY29kZXIpOworCisgIGlmIChkZWNvZGVyLT5vdXRwdXRfc3RhdGUpIHsKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKGRlY29kZXItPm91dHB1dF9zdGF0ZSk7CisgICAgZGVjb2Rlci0+b3V0cHV0X3N0YXRlID0gTlVMTDsKKyAgfQorCisgIGlmIChkZWNvZGVyLT5kZWNvZGVyX2luaXRlZCkKKyAgICB2cHhfY29kZWNfZGVzdHJveSAoJmRlY29kZXItPmRlY29kZXIpOworICBkZWNvZGVyLT5kZWNvZGVyX2luaXRlZCA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZweF9kZWNfZGVmYXVsdF9zZW5kX3RhZ3MgKEdzdFZQWERlYyAqIGRlYykKK3sKKyAgR3N0VGFnTGlzdCAqbGlzdDsKKyAgR3N0VlBYRGVjQ2xhc3MgKnZweGNsYXNzID0gR1NUX1ZQWF9ERUNfR0VUX0NMQVNTIChkZWMpOworCisgIGlmICh2cHhjbGFzcy0+dmlkZW9fY29kZWNfdGFnID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGxpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3RfYWRkIChsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICBHU1RfVEFHX1ZJREVPX0NPREVDLCB2cHhjbGFzcy0+dmlkZW9fY29kZWNfdGFnLCBOVUxMKTsKKworICBnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9WSURFT19ERUNPREVSX1NSQ19QQUQgKGRlYyksCisgICAgICBnc3RfZXZlbnRfbmV3X3RhZyAobGlzdCkpOworfQorCisjaWZkZWYgSEFWRV9WUFhfMV80CitzdHJ1Y3QgRnJhbWUKK3sKKyAgR3N0TWFwSW5mbyBpbmZvOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKK307CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3ZweF9kZWNfcHJlcGFyZV9pbWFnZSAoR3N0VlBYRGVjICogZGVjLCBjb25zdCB2cHhfaW1hZ2VfdCAqIGltZykKK3sKKyAgZ2ludCBjb21wOworICBHc3RWaWRlb01ldGEgKnZtZXRhOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgc3RydWN0IEZyYW1lICpmcmFtZSA9IGltZy0+ZmJfcHJpdjsKKyAgR3N0VmlkZW9JbmZvICppbmZvID0gJmRlYy0+b3V0cHV0X3N0YXRlLT5pbmZvOworCisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfcmVmIChmcmFtZS0+YnVmZmVyKTsKKworICB2bWV0YSA9IGdzdF9idWZmZXJfZ2V0X3ZpZGVvX21ldGEgKGJ1ZmZlcik7CisgIHZtZXRhLT5mb3JtYXQgPSBHU1RfVklERU9fSU5GT19GT1JNQVQgKGluZm8pOworICB2bWV0YS0+d2lkdGggPSBHU1RfVklERU9fSU5GT19XSURUSCAoaW5mbyk7CisgIHZtZXRhLT5oZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluZm8pOworICB2bWV0YS0+bl9wbGFuZXMgPSBHU1RfVklERU9fSU5GT19OX1BMQU5FUyAoaW5mbyk7CisKKyAgZm9yIChjb21wID0gMDsgY29tcCA8IDQ7IGNvbXArKykgeworICAgIHZtZXRhLT5zdHJpZGVbY29tcF0gPSBpbWctPnN0cmlkZVtjb21wXTsKKyAgICB2bWV0YS0+b2Zmc2V0W2NvbXBdID0KKyAgICAgICAgaW1nLT5wbGFuZXNbY29tcF0gPyBpbWctPnBsYW5lc1tjb21wXSAtIGZyYW1lLT5pbmZvLmRhdGEgOiAwOworICB9CisKKyAgLyogRklYTUUgVGhpcyBpcyBhIFJFQUQvV1JJVEUgbWFwcGVkIGJ1ZmZlciBzZWUgYnVnICM3NTQ4MjYgKi8KKworICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgaW50Citnc3RfdnB4X2RlY19nZXRfYnVmZmVyX2NiIChncG9pbnRlciBwcml2LCBnc2l6ZSBtaW5fc2l6ZSwKKyAgICB2cHhfY29kZWNfZnJhbWVfYnVmZmVyX3QgKiBmYikKK3sKKyAgR3N0VlBYRGVjICpkZWMgPSBwcml2OworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IE5VTEw7CisgIHN0cnVjdCBGcmFtZSAqZnJhbWU7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIGlmICghZGVjLT5wb29sIHx8IGRlYy0+YnVmX3NpemUgIT0gbWluX3NpemUpIHsKKyAgICBHc3RCdWZmZXJQb29sICpwb29sOworICAgIEdzdFN0cnVjdHVyZSAqY29uZmlnOworICAgIEdzdENhcHMgKmNhcHM7CisgICAgR3N0QWxsb2NhdG9yICphbGxvY2F0b3I7CisgICAgR3N0QWxsb2NhdGlvblBhcmFtcyBwYXJhbXM7CisKKyAgICBpZiAoZGVjLT5wb29sKSB7CisgICAgICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAoZGVjLT5wb29sLCBGQUxTRSk7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChkZWMtPnBvb2wpOworICAgICAgZGVjLT5wb29sID0gTlVMTDsKKyAgICAgIGRlYy0+YnVmX3NpemUgPSAwOworICAgIH0KKworICAgIGdzdF92aWRlb19kZWNvZGVyX2dldF9hbGxvY2F0b3IgKEdTVF9WSURFT19ERUNPREVSIChkZWMpLCAmYWxsb2NhdG9yLAorICAgICAgICAmcGFyYW1zKTsKKworICAgIGlmIChhbGxvY2F0b3IgJiYKKyAgICAgICAgR1NUX09CSkVDVF9GTEFHX0lTX1NFVCAoYWxsb2NhdG9yLCBHU1RfQUxMT0NBVE9SX0ZMQUdfQ1VTVE9NX0FMTE9DKSkgeworICAgICAgZ3N0X29iamVjdF91bnJlZiAoYWxsb2NhdG9yKTsKKyAgICAgIGFsbG9jYXRvciA9IE5VTEw7CisgICAgfQorCisgICAgcG9vbCA9IGdzdF9idWZmZXJfcG9vbF9uZXcgKCk7CisgICAgY29uZmlnID0gZ3N0X2J1ZmZlcl9wb29sX2dldF9jb25maWcgKHBvb2wpOworICAgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfc2V0X2FsbG9jYXRvciAoY29uZmlnLCBhbGxvY2F0b3IsICZwYXJhbXMpOworICAgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoInZpZGVvL2ludGVybmFsIik7CisgICAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19zZXRfcGFyYW1zIChjb25maWcsIGNhcHMsIG1pbl9zaXplLCAyLCAwKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgZ3N0X2J1ZmZlcl9wb29sX3NldF9jb25maWcgKHBvb2wsIGNvbmZpZyk7CisKKyAgICBpZiAoYWxsb2NhdG9yKQorICAgICAgZ3N0X29iamVjdF91bnJlZiAoYWxsb2NhdG9yKTsKKworICAgIGlmICghZ3N0X2J1ZmZlcl9wb29sX3NldF9hY3RpdmUgKHBvb2wsIFRSVUUpKSB7CisgICAgICBHU1RfV0FSTklORyAoIkZhaWxlZCB0byBjcmVhdGUgaW50ZXJuYWwgcG9vbCIpOworICAgICAgZ3N0X29iamVjdF91bnJlZiAocG9vbCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZGVjLT5wb29sID0gcG9vbDsKKyAgICBkZWMtPmJ1Zl9zaXplID0gbWluX3NpemU7CisgIH0KKworICByZXQgPSBnc3RfYnVmZmVyX3Bvb2xfYWNxdWlyZV9idWZmZXIgKGRlYy0+cG9vbCwgJmJ1ZmZlciwgTlVMTCk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBHU1RfV0FSTklORyAoIkZhaWxlZCB0byBhY3F1aXJlIGJ1ZmZlciBmcm9tIGludGVybmFsIHBvb2wuIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogQWRkIGl0IG5vdywgd2hpbGUgdGhlIGJ1ZmZlciBpcyB3cml0YWJsZSAqLworICBnc3RfYnVmZmVyX2FkZF92aWRlb19tZXRhIChidWZmZXIsIEdTVF9WSURFT19GUkFNRV9GTEFHX05PTkUsCisgICAgICBHU1RfVklERU9fRk9STUFUX0VOQ09ERUQsIDAsIDApOworCisgIGZyYW1lID0gZ19uZXcwIChzdHJ1Y3QgRnJhbWUsIDEpOworICBpZiAoIWdzdF9idWZmZXJfbWFwIChidWZmZXIsICZmcmFtZS0+aW5mbywgR1NUX01BUF9SRUFEV1JJVEUpKSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICBnX2ZyZWUgKGZyYW1lKTsKKyAgICBHU1RfV0FSTklORyAoIkZhaWxlZCB0byBtYXAgYnVmZmVyIGZyb20gaW50ZXJuYWwgcG9vbC4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBmYi0+c2l6ZSA9IGZyYW1lLT5pbmZvLnNpemU7CisgIGZiLT5kYXRhID0gZnJhbWUtPmluZm8uZGF0YTsKKyAgZnJhbWUtPmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgZmItPnByaXYgPSBmcmFtZTsKKworICBHU1RfVFJBQ0VfT0JKRUNUIChwcml2LCAiQWxsb2NhdGVkIGJ1ZmZlciAlcCIsIGZyYW1lLT5idWZmZXIpOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Citnc3RfdnB4X2RlY19yZWxlYXNlX2J1ZmZlcl9jYiAoZ3BvaW50ZXIgcHJpdiwgdnB4X2NvZGVjX2ZyYW1lX2J1ZmZlcl90ICogZmIpCit7CisgIHN0cnVjdCBGcmFtZSAqZnJhbWUgPSBmYi0+cHJpdjsKKworICAvKiBXZSdyZSBzb21ldGltZXMgY2FsbGVkIHdpdGhvdXQgYSBmcmFtZSAqLworICBpZiAoIWZyYW1lKQorICAgIHJldHVybiAwOworCisgIEdTVF9UUkFDRV9PQkpFQ1QgKHByaXYsICJSZWxlYXNlIGJ1ZmZlciAlcCIsIGZyYW1lLT5idWZmZXIpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGZyYW1lLT5idWZmZXIsICZmcmFtZS0+aW5mbyk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGZyYW1lLT5idWZmZXIpOworICBnX2ZyZWUgKGZyYW1lKTsKKyAgZmItPnByaXYgPSBOVUxMOworCisgIHJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitnc3RfdnB4X2RlY19pbWFnZV90b19idWZmZXIgKEdzdFZQWERlYyAqIGRlYywgY29uc3QgdnB4X2ltYWdlX3QgKiBpbWcsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBpbnQgZGVzdHN0cmlkZSwgc3Jjc3RyaWRlLCBoZWlnaHQsIHdpZHRoLCBsaW5lLCBjb21wOworICBndWludDggKmRlc3QsICpzcmM7CisgIEdzdFZpZGVvRnJhbWUgZnJhbWU7CisgIEdzdFZpZGVvSW5mbyAqaW5mbyA9ICZkZWMtPm91dHB1dF9zdGF0ZS0+aW5mbzsKKworICBpZiAoIWdzdF92aWRlb19mcmFtZV9tYXAgKCZmcmFtZSwgaW5mbywgYnVmZmVyLCBHU1RfTUFQX1dSSVRFKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlYywgIkNvdWxkIG5vdCBtYXAgdmlkZW8gYnVmZmVyIik7CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yIChjb21wID0gMDsgY29tcCA8IDM7IGNvbXArKykgeworICAgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBICgmZnJhbWUsIGNvbXApOworICAgIHNyYyA9IGltZy0+cGxhbmVzW2NvbXBdOworICAgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKCZmcmFtZSwgY29tcCkKKyAgICAgICAgKiBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFICgmZnJhbWUsIGNvbXApOworICAgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoJmZyYW1lLCBjb21wKTsKKyAgICBkZXN0c3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFICgmZnJhbWUsIGNvbXApOworICAgIHNyY3N0cmlkZSA9IGltZy0+c3RyaWRlW2NvbXBdOworCisgICAgaWYgKHNyY3N0cmlkZSA9PSBkZXN0c3RyaWRlKSB7CisgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChkZWMsICJTdHJpZGUgbWF0Y2hlcy4gQ29tcCAlZDogJWQsIGNvcHlpbmcgZnVsbCBwbGFuZSIsCisgICAgICAgICAgY29tcCwgc3Jjc3RyaWRlKTsKKyAgICAgIG1lbWNweSAoZGVzdCwgc3JjLCBzcmNzdHJpZGUgKiBoZWlnaHQpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChkZWMsICJTdHJpZGUgbWlzbWF0Y2guIENvbXAgJWQ6ICVkICE9ICVkLCBjb3B5aW5nICIKKyAgICAgICAgICAibGluZSBieSBsaW5lLiIsIGNvbXAsIHNyY3N0cmlkZSwgZGVzdHN0cmlkZSk7CisgICAgICBmb3IgKGxpbmUgPSAwOyBsaW5lIDwgaGVpZ2h0OyBsaW5lKyspIHsKKyAgICAgICAgbWVtY3B5IChkZXN0LCBzcmMsIHdpZHRoKTsKKyAgICAgICAgZGVzdCArPSBkZXN0c3RyaWRlOworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJmZyYW1lKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92cHhfZGVjX29wZW5fY29kZWMgKEdzdFZQWERlYyAqIGRlYywgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUpCit7CisgIGludCBmbGFncyA9IDA7CisgIHZweF9jb2RlY19zdHJlYW1faW5mb190IHN0cmVhbV9pbmZvOworICB2cHhfY29kZWNfY2Fwc190IGNhcHM7CisgIHZweF9jb2RlY19kZWNfY2ZnX3QgY2ZnOworICB2cHhfY29kZWNfZXJyX3Qgc3RhdHVzOworICBHc3RNYXBJbmZvIG1pbmZvOworICBHc3RWUFhEZWNDbGFzcyAqdnB4Y2xhc3MgPSBHU1RfVlBYX0RFQ19HRVRfQ0xBU1MgKGRlYyk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHZweGNsYXNzLT5jb2RlY19hbGdvICE9IE5VTEwsIEdTVF9GTE9XX0VSUk9SKTsKKworICBtZW1zZXQgKCZzdHJlYW1faW5mbywgMCwgc2l6ZW9mIChzdHJlYW1faW5mbykpOworICBtZW1zZXQgKCZjZmcsIDAsIHNpemVvZiAoY2ZnKSk7CisgIHN0cmVhbV9pbmZvLnN6ID0gc2l6ZW9mIChzdHJlYW1faW5mbyk7CisKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAoZnJhbWUtPmlucHV0X2J1ZmZlciwgJm1pbmZvLCBHU1RfTUFQX1JFQUQpKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZGVjLCAiRmFpbGVkIHRvIG1hcCBpbnB1dCBidWZmZXIiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICBzdGF0dXMgPSB2cHhfY29kZWNfcGVla19zdHJlYW1faW5mbyAodnB4Y2xhc3MtPmNvZGVjX2FsZ28sCisgICAgICBtaW5mby5kYXRhLCBtaW5mby5zaXplLCAmc3RyZWFtX2luZm8pOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGZyYW1lLT5pbnB1dF9idWZmZXIsICZtaW5mbyk7CisKKyAgaWYgKHN0YXR1cyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlYywgIlZQWCBwcmVwcm9jZXNzaW5nIGVycm9yOiAlcyIsCisgICAgICAgIGdzdF92cHhfZXJyb3JfbmFtZSAoc3RhdHVzKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0NVU1RPTV9TVUNDRVNTXzE7CisgIH0KKyAgaWYgKCFzdHJlYW1faW5mby5pc19rZikgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVjLCAiTm8ga2V5ZnJhbWUsIHNraXBwaW5nIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0NVU1RPTV9TVUNDRVNTXzE7CisgIH0KKworICBnc3RfdnB4X2RlY19zZXRfc3RyZWFtX2luZm8gKGRlYywgJnN0cmVhbV9pbmZvKTsKKyAgZ3N0X3ZweF9kZWNfc2V0X2RlZmF1bHRfZm9ybWF0IChkZWMsIEdTVF9WSURFT19GT1JNQVRfSTQyMCwgc3RyZWFtX2luZm8udywKKyAgICAgIHN0cmVhbV9pbmZvLmgpOworCisgIGNmZy53ID0gc3RyZWFtX2luZm8udzsKKyAgY2ZnLmggPSBzdHJlYW1faW5mby5oOworCisgIGlmIChkZWMtPnRocmVhZHMgPiAwKQorICAgIGNmZy50aHJlYWRzID0gZGVjLT50aHJlYWRzOworICBlbHNlCisgICAgY2ZnLnRocmVhZHMgPSBnX2dldF9udW1fcHJvY2Vzc29ycyAoKTsKKworICBjYXBzID0gdnB4X2NvZGVjX2dldF9jYXBzICh2cHhjbGFzcy0+Y29kZWNfYWxnbyk7CisKKyAgaWYgKGRlYy0+cG9zdF9wcm9jZXNzaW5nKSB7CisgICAgaWYgKCEoY2FwcyAmIFZQWF9DT0RFQ19DQVBfUE9TVFBST0MpKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlYywgIkRlY29kZXIgZG9lcyBub3Qgc3VwcG9ydCBwb3N0IHByb2Nlc3NpbmciKTsKKyAgICB9IGVsc2UgeworICAgICAgZmxhZ3MgfD0gVlBYX0NPREVDX1VTRV9QT1NUUFJPQzsKKyAgICB9CisgIH0KKworICBzdGF0dXMgPQorICAgICAgdnB4X2NvZGVjX2RlY19pbml0ICgmZGVjLT5kZWNvZGVyLCB2cHhjbGFzcy0+Y29kZWNfYWxnbywgJmNmZywgZmxhZ3MpOworICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZWMsIExJQlJBUlksIElOSVQsCisgICAgICAgICgiRmFpbGVkIHRvIGluaXRpYWxpemUgVlA4IGRlY29kZXIiKSwgKCIlcyIsCisgICAgICAgICAgICBnc3RfdnB4X2Vycm9yX25hbWUgKHN0YXR1cykpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICBpZiAoKGNhcHMgJiBWUFhfQ09ERUNfQ0FQX1BPU1RQUk9DKSAmJiBkZWMtPnBvc3RfcHJvY2Vzc2luZykgeworICAgIHZwOF9wb3N0cHJvY19jZmdfdCBwcF9jZmcgPSB7IDAsIH07CisKKyAgICBwcF9jZmcucG9zdF9wcm9jX2ZsYWcgPSBkZWMtPnBvc3RfcHJvY2Vzc2luZ19mbGFnczsKKyAgICBwcF9jZmcuZGVibG9ja2luZ19sZXZlbCA9IGRlYy0+ZGVibG9ja2luZ19sZXZlbDsKKyAgICBwcF9jZmcubm9pc2VfbGV2ZWwgPSBkZWMtPm5vaXNlX2xldmVsOworCisgICAgc3RhdHVzID0gdnB4X2NvZGVjX2NvbnRyb2wgKCZkZWMtPmRlY29kZXIsIFZQOF9TRVRfUE9TVFBST0MsICZwcF9jZmcpOworICAgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlYywgIkNvdWxkbid0IHNldCBwb3N0cHJvY2Vzc2luZyBzZXR0aW5nczogJXMiLAorICAgICAgICAgIGdzdF92cHhfZXJyb3JfbmFtZSAoc3RhdHVzKSk7CisgICAgfQorICB9CisjaWZkZWYgSEFWRV9WUFhfMV80CisgIHZweF9jb2RlY19zZXRfZnJhbWVfYnVmZmVyX2Z1bmN0aW9ucyAoJmRlYy0+ZGVjb2RlciwKKyAgICAgIGdzdF92cHhfZGVjX2dldF9idWZmZXJfY2IsIGdzdF92cHhfZGVjX3JlbGVhc2VfYnVmZmVyX2NiLCBkZWMpOworI2VuZGlmCisKKyAgZGVjLT5kZWNvZGVyX2luaXRlZCA9IFRSVUU7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3ZweF9kZWNfaGFuZGxlX2ZyYW1lIChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyLCBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0VlBYRGVjICpkZWM7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIHZweF9jb2RlY19lcnJfdCBzdGF0dXM7CisgIHZweF9jb2RlY19pdGVyX3QgaXRlciA9IE5VTEw7CisgIHZweF9pbWFnZV90ICppbWc7CisgIGxvbmcgZGVjb2Rlcl9kZWFkbGluZSA9IDA7CisgIEdzdENsb2NrVGltZURpZmYgZGVhZGxpbmU7CisgIEdzdE1hcEluZm8gbWluZm87CisgIEdzdFZQWERlY0NsYXNzICp2cHhjbGFzczsKKyAgR3N0VmlkZW9Gb3JtYXQgZm10OworCisgIEdTVF9MT0dfT0JKRUNUIChkZWNvZGVyLCAiaGFuZGxlX2ZyYW1lIik7CisKKyAgZGVjID0gR1NUX1ZQWF9ERUMgKGRlY29kZXIpOworICB2cHhjbGFzcyA9IEdTVF9WUFhfREVDX0dFVF9DTEFTUyAoZGVjKTsKKworICBpZiAoIWRlYy0+ZGVjb2Rlcl9pbml0ZWQpIHsKKyAgICByZXQgPSB2cHhjbGFzcy0+b3Blbl9jb2RlYyAoZGVjLCBmcmFtZSk7CisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19DVVNUT01fU1VDQ0VTU18xKSB7CisgICAgICBnc3RfdmlkZW9fZGVjb2Rlcl9kcm9wX2ZyYW1lIChkZWNvZGVyLCBmcmFtZSk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgfSBlbHNlIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgIGdzdF92aWRlb19jb2RlY19mcmFtZV91bnJlZiAoZnJhbWUpOworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgIH0KKworICBkZWFkbGluZSA9IGdzdF92aWRlb19kZWNvZGVyX2dldF9tYXhfZGVjb2RlX3RpbWUgKGRlY29kZXIsIGZyYW1lKTsKKyAgaWYgKGRlYWRsaW5lIDwgMCkgeworICAgIGRlY29kZXJfZGVhZGxpbmUgPSAxOworICB9IGVsc2UgaWYgKGRlYWRsaW5lID09IEdfTUFYSU5UNjQpIHsKKyAgICBkZWNvZGVyX2RlYWRsaW5lID0gMDsKKyAgfSBlbHNlIHsKKyAgICBkZWNvZGVyX2RlYWRsaW5lID0gTUFYICgxLCBkZWFkbGluZSAvIEdTVF9NU0VDT05EKTsKKyAgfQorCisgIGlmICghZ3N0X2J1ZmZlcl9tYXAgKGZyYW1lLT5pbnB1dF9idWZmZXIsICZtaW5mbywgR1NUX01BUF9SRUFEKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlYywgIkZhaWxlZCB0byBtYXAgaW5wdXQgYnVmZmVyIik7CisgICAgZ3N0X3ZpZGVvX2NvZGVjX2ZyYW1lX3VucmVmIChmcmFtZSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgc3RhdHVzID0gdnB4X2NvZGVjX2RlY29kZSAoJmRlYy0+ZGVjb2RlciwKKyAgICAgIG1pbmZvLmRhdGEsIG1pbmZvLnNpemUsIE5VTEwsIGRlY29kZXJfZGVhZGxpbmUpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGZyYW1lLT5pbnB1dF9idWZmZXIsICZtaW5mbyk7CisKKyAgaWYgKHN0YXR1cykgeworICAgIEdTVF9WSURFT19ERUNPREVSX0VSUk9SIChkZWNvZGVyLCAxLCBMSUJSQVJZLCBFTkNPREUsCisgICAgICAgICgiRmFpbGVkIHRvIGRlY29kZSBmcmFtZSIpLCAoIiVzIiwgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKSwgcmV0KTsKKyAgICBnc3RfdmlkZW9fY29kZWNfZnJhbWVfdW5yZWYgKGZyYW1lKTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgaW1nID0gdnB4X2NvZGVjX2dldF9mcmFtZSAoJmRlYy0+ZGVjb2RlciwgJml0ZXIpOworICBpZiAoaW1nKSB7CisgICAgaWYgKHZweGNsYXNzLT5nZXRfZnJhbWVfZm9ybWF0IChkZWMsIGltZywgJmZtdCkgPT0gRkFMU0UpIHsKKyAgICAgIHZweF9pbWdfZnJlZSAoaW1nKTsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZWNvZGVyLCBMSUJSQVJZLCBFTkNPREUsCisgICAgICAgICAgKCJGYWlsZWQgdG8gZGVjb2RlIGZyYW1lIiksICgiVW5zdXBwb3J0ZWQgY29sb3IgZm9ybWF0ICVkIiwKKyAgICAgICAgICAgICAgaW1nLT5mbXQpKTsKKyAgICAgIGdzdF92aWRlb19jb2RlY19mcmFtZV91bnJlZiAoZnJhbWUpOworICAgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICAgIH0KKworICAgIGlmIChkZWFkbGluZSA8IDApIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkZWMsICJTa2lwcGluZyBsYXRlIGZyYW1lICglZiBzIHBhc3QgZGVhZGxpbmUpIiwKKyAgICAgICAgICAoZG91YmxlKSAtZGVhZGxpbmUgLyBHU1RfU0VDT05EKTsKKyAgICAgIGdzdF92aWRlb19kZWNvZGVyX2Ryb3BfZnJhbWUgKGRlY29kZXIsIGZyYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgZ3N0X3ZweF9kZWNfaGFuZGxlX3Jlc29sdXRpb25fY2hhbmdlIChkZWMsIGltZywgZm10KTsKKyNpZmRlZiBIQVZFX1ZQWF8xXzQKKyAgICAgIGlmIChpbWctPmZiX3ByaXYgJiYgZGVjLT5oYXZlX3ZpZGVvX21ldGEpIHsKKyAgICAgICAgZnJhbWUtPm91dHB1dF9idWZmZXIgPSBnc3RfdnB4X2RlY19wcmVwYXJlX2ltYWdlIChkZWMsIGltZyk7CisgICAgICAgIHJldCA9IGdzdF92aWRlb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoZGVjb2RlciwgZnJhbWUpOworICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgIHsKKyAgICAgICAgcmV0ID0gZ3N0X3ZpZGVvX2RlY29kZXJfYWxsb2NhdGVfb3V0cHV0X2ZyYW1lIChkZWNvZGVyLCBmcmFtZSk7CisKKyAgICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykgeworICAgICAgICAgIGdzdF92cHhfZGVjX2ltYWdlX3RvX2J1ZmZlciAoZGVjLCBpbWcsIGZyYW1lLT5vdXRwdXRfYnVmZmVyKTsKKyAgICAgICAgICByZXQgPSBnc3RfdmlkZW9fZGVjb2Rlcl9maW5pc2hfZnJhbWUgKGRlY29kZXIsIGZyYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnc3RfdmlkZW9fZGVjb2Rlcl9kcm9wX2ZyYW1lIChkZWNvZGVyLCBmcmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB2cHhfaW1nX2ZyZWUgKGltZyk7CisKKyAgICB3aGlsZSAoKGltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUgKCZkZWMtPmRlY29kZXIsICZpdGVyKSkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVjb2RlciwgIk11bHRpcGxlIGRlY29kZWQgZnJhbWVzLi4uIGRyb3BwaW5nIik7CisgICAgICB2cHhfaW1nX2ZyZWUgKGltZyk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIEludmlzaWJsZSBmcmFtZSAqLworICAgIEdTVF9WSURFT19DT0RFQ19GUkFNRV9TRVRfREVDT0RFX09OTFkgKGZyYW1lKTsKKyAgICBnc3RfdmlkZW9fZGVjb2Rlcl9maW5pc2hfZnJhbWUgKGRlY29kZXIsIGZyYW1lKTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZweF9kZWNfZGVjaWRlX2FsbG9jYXRpb24gKEdzdFZpZGVvRGVjb2RlciAqIGJkZWMsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFZQWERlYyAqZGVjID0gR1NUX1ZQWF9ERUMgKGJkZWMpOworICBHc3RCdWZmZXJQb29sICpwb29sOworICBHc3RTdHJ1Y3R1cmUgKmNvbmZpZzsKKworICBpZiAoIUdTVF9WSURFT19ERUNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kZWNpZGVfYWxsb2NhdGlvbiAoYmRlYywgcXVlcnkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBnX2Fzc2VydCAoZ3N0X3F1ZXJ5X2dldF9uX2FsbG9jYXRpb25fcG9vbHMgKHF1ZXJ5KSA+IDApOworICBnc3RfcXVlcnlfcGFyc2VfbnRoX2FsbG9jYXRpb25fcG9vbCAocXVlcnksIDAsICZwb29sLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHBvb2wgIT0gTlVMTCk7CisKKyAgY29uZmlnID0gZ3N0X2J1ZmZlcl9wb29sX2dldF9jb25maWcgKHBvb2wpOworICBpZiAoZ3N0X3F1ZXJ5X2ZpbmRfYWxsb2NhdGlvbl9tZXRhIChxdWVyeSwgR1NUX1ZJREVPX01FVEFfQVBJX1RZUEUsIE5VTEwpKSB7CisgICAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19hZGRfb3B0aW9uIChjb25maWcsCisgICAgICAgIEdTVF9CVUZGRVJfUE9PTF9PUFRJT05fVklERU9fTUVUQSk7CisgICAgZGVjLT5oYXZlX3ZpZGVvX21ldGEgPSBUUlVFOworICB9CisgIGdzdF9idWZmZXJfcG9vbF9zZXRfY29uZmlnIChwb29sLCBjb25maWcpOworICBnc3Rfb2JqZWN0X3VucmVmIChwb29sKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92cHhfZGVjX3NldF9zdHJlYW1faW5mbyAoR3N0VlBYRGVjICogZGVjLAorICAgIHZweF9jb2RlY19zdHJlYW1faW5mb190ICogc3RyZWFtX2luZm8pCit7CisgIEdzdFZQWERlY0NsYXNzICp2cHhjbGFzcyA9IEdTVF9WUFhfREVDX0dFVF9DTEFTUyAoZGVjKTsKKyAgaWYgKHZweGNsYXNzLT5zZXRfc3RyZWFtX2luZm8gIT0gTlVMTCkgeworICAgIHZweGNsYXNzLT5zZXRfc3RyZWFtX2luZm8gKGRlYywgc3RyZWFtX2luZm8pOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnB4X2RlY19zZXRfZGVmYXVsdF9mb3JtYXQgKEdzdFZQWERlYyAqIGRlYywgR3N0VmlkZW9Gb3JtYXQgZm10LCBpbnQgd2lkdGgsCisgICAgaW50IGhlaWdodCkKK3sKKyAgR3N0VlBYRGVjQ2xhc3MgKnZweGNsYXNzID0gR1NUX1ZQWF9ERUNfR0VUX0NMQVNTIChkZWMpOworICBpZiAodnB4Y2xhc3MtPnNldF9kZWZhdWx0X2Zvcm1hdCAhPSBOVUxMKSB7CisgICAgdnB4Y2xhc3MtPnNldF9kZWZhdWx0X2Zvcm1hdCAoZGVjLCBmbXQsIHdpZHRoLCBoZWlnaHQpOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZweF9kZWNfZGVmYXVsdF9mcmFtZV9mb3JtYXQgKEdzdFZQWERlYyAqIGRlYywgdnB4X2ltYWdlX3QgKiBpbWcsCisgICAgR3N0VmlkZW9Gb3JtYXQgKiBmbXQpCit7CisgIGlmIChpbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9JNDIwKSB7CisgICAgKmZtdCA9IEdTVF9WSURFT19GT1JNQVRfSTQyMDsKKyAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZweF9kZWNfaGFuZGxlX3Jlc29sdXRpb25fY2hhbmdlIChHc3RWUFhEZWMgKiBkZWMsIHZweF9pbWFnZV90ICogaW1nLAorICAgIEdzdFZpZGVvRm9ybWF0IGZtdCkKK3sKKyAgR3N0VlBYRGVjQ2xhc3MgKnZweGNsYXNzID0gR1NUX1ZQWF9ERUNfR0VUX0NMQVNTIChkZWMpOworICBpZiAodnB4Y2xhc3MtPmhhbmRsZV9yZXNvbHV0aW9uX2NoYW5nZSAhPSBOVUxMKSB7CisgICAgdnB4Y2xhc3MtPmhhbmRsZV9yZXNvbHV0aW9uX2NoYW5nZSAoZGVjLCBpbWcsIGZtdCk7CisgIH0KK30KKworI2VuZGlmIC8qIEhBVkVfVlA4X0RFQ09ERVIgfHwgIEhBVkVfVlA5X0RFQ09ERVIgKi8KZGlmZiAtLWdpdCBhL2V4dC92cHgvZ3N0dnB4ZGVjLmggYi9leHQvdnB4L2dzdHZweGRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NTJmODYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvdnB4L2dzdHZweGRlYy5oCkBAIC0wLDAgKzEsMTEzIEBACisvKiBWUFgKKyAqIENvcHlyaWdodCAoQykgMjAwNiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDA5LDIwMTAgRW50cm9weSBXYXZlIEluYworICogQ29weXJpZ2h0IChDKSAyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9fR1NUX1ZQWF9ERUNfSF9fCisjZGVmaW5lIF9fR1NUX1ZQWF9ERUNfSF9fCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoSEFWRV9WUDhfREVDT0RFUikgfHwgZGVmaW5lZChIQVZFX1ZQOV9ERUNPREVSKQorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2RlY29kZXIuaD4KKworLyogRklYTUU6IFVuZGVmIEhBVkVfQ09ORklHX0ggYmVjYXVzZSB2cHhfY29kZWMuaCB1c2VzIGl0LAorICogd2hpY2ggY2F1c2VzIGNvbXBpbGF0aW9uIGZhaWx1cmVzICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI3VuZGVmIEhBVkVfQ09ORklHX0gKKyNlbmRpZgorCisjaW5jbHVkZSA8dnB4L3ZweF9kZWNvZGVyLmg+CisjaW5jbHVkZSA8dnB4L3ZwOGR4Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WUFhfREVDIFwKKyAgKGdzdF92cHhfZGVjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WUFhfREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVlBYX0RFQyxHc3RWUFhEZWMpKQorI2RlZmluZSBHU1RfVlBYX0RFQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WUFhfREVDLEdzdFZQWERlY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1ZQWF9ERUMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WUFhfREVDKSkKKyNkZWZpbmUgR1NUX0lTX1ZQWF9ERUNfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1ZQWF9ERUMpKQorI2RlZmluZSBHU1RfVlBYX0RFQ19HRVRfQ0xBU1Mob2JqKSAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9WUFhfREVDLCBHc3RWUFhEZWNDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWUFhEZWMgR3N0VlBYRGVjOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZQWERlY0NsYXNzIEdzdFZQWERlY0NsYXNzOworCitzdHJ1Y3QgX0dzdFZQWERlYworeworICBHc3RWaWRlb0RlY29kZXIgYmFzZV92aWRlb19kZWNvZGVyOworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIHZweF9jb2RlY19jdHhfdCBkZWNvZGVyOworCisgIC8qIHN0YXRlICovCisgIGdib29sZWFuIGRlY29kZXJfaW5pdGVkOworCisgIC8qIHByb3BlcnRpZXMgKi8KKyAgZ2Jvb2xlYW4gcG9zdF9wcm9jZXNzaW5nOworICBlbnVtIHZwOF9wb3N0cHJvY19sZXZlbCBwb3N0X3Byb2Nlc3NpbmdfZmxhZ3M7CisgIGdpbnQgZGVibG9ja2luZ19sZXZlbDsKKyAgZ2ludCBub2lzZV9sZXZlbDsKKyAgZ2ludCB0aHJlYWRzOworCisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqaW5wdXRfc3RhdGU7CisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqb3V0cHV0X3N0YXRlOworCisgIC8qIGFsbG9jYXRpb24gKi8KKyAgZ2Jvb2xlYW4gaGF2ZV92aWRlb19tZXRhOworICBHc3RCdWZmZXJQb29sICpwb29sOworICBnc2l6ZSBidWZfc2l6ZTsKK307CisKK3N0cnVjdCBfR3N0VlBYRGVjQ2xhc3MKK3sKKyAgR3N0VmlkZW9EZWNvZGVyQ2xhc3MgYmFzZV92aWRlb19kZWNvZGVyX2NsYXNzOworICBjb25zdCBjaGFyKiB2aWRlb19jb2RlY190YWc7CisgIC8qc3VwcG9ydGVkIHZweCBhbGdvKi8KKyAgdnB4X2NvZGVjX2lmYWNlX3QqIGNvZGVjX2FsZ287CisgIC8qdmlydHVhbCBmdW5jdGlvbiB0byBvcGVuX2NvZGVjKi8KKyAgR3N0Rmxvd1JldHVybiAoKm9wZW5fY29kZWMpIChHc3RWUFhEZWMgKiBkZWMsIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKTsKKyAgLyp2aXJ0dWFsIGZ1bmN0aW9uIHRvIHNlbmQgdGFncyovCisgIHZvaWQgKCpzZW5kX3RhZ3MpIChHc3RWUFhEZWMqIGRlYyk7CisgIC8qdmlydHVhbCBmdW5jdGlvbiB0byBzZXQvY29ycmVjdCB0aGUgc3RyZWFtIGluZm8qLworICB2b2lkICgqc2V0X3N0cmVhbV9pbmZvKSAoR3N0VlBYRGVjICpkZWMsIHZweF9jb2RlY19zdHJlYW1faW5mb190ICpzdHJlYW1faW5mbyk7CisgIC8qdmlydHVhbCBmdW5jdGlvbiB0byBzZXQgZGVmYXVsdCBmb3JtYXQgd2hpbGUgb3BlbmluZyBjb2RlYyovCisgIHZvaWQgKCpzZXRfZGVmYXVsdF9mb3JtYXQpIChHc3RWUFhEZWMgKmRlYywgR3N0VmlkZW9Gb3JtYXQgZm10LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICAvKnZpcnR1YWwgZnVuY3Rpb24gdG8gbmVnb3RpYXRlIGZvcm1hdCB3aGlsZSBoYW5kbGluZyBmcmFtZSovCisgIHZvaWQgKCpoYW5kbGVfcmVzb2x1dGlvbl9jaGFuZ2UpIChHc3RWUFhEZWMgKmRlYywgdnB4X2ltYWdlX3QgKmltZywgR3N0VmlkZW9Gb3JtYXQgZm10KTsKKyAgLyp2aXJ0dWFsIGZ1bmN0aW9uIHRvIGNoZWNrIHZhbGlkIGZvcm1hdCovCisgIGdib29sZWFuICgqZ2V0X2ZyYW1lX2Zvcm1hdCkoR3N0VlBYRGVjICpkZWMsIHZweF9pbWFnZV90ICppbWcsIEdzdFZpZGVvRm9ybWF0KiBmbXQpOworfTsKKworR1R5cGUgZ3N0X3ZweF9kZWNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYKKworI2VuZGlmIC8qIF9fR1NUX1ZQOF9ERUNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvdnB4L2dzdHZweGVuYy5jIGIvZXh0L3ZweC9nc3R2cHhlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmEyY2NjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3ZweC9nc3R2cHhlbmMuYwpAQCAtMCwwICsxLDE5NjggQEAKKy8qIFZQWAorICogQ29weXJpZ2h0IChDKSAyMDA2IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDEwIEVudHJvcHkgV2F2ZSBJbmMKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEyIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhBVkVfVlA4X0VOQ09ERVIpIHx8IGRlZmluZWQoSEFWRV9WUDlfRU5DT0RFUikKKworLyogZ2xpYiBkZWNpZGVkIGluIDIuMzIgaXQgd291bGQgYmUgYSBncmVhdCBpZGVhIHRvIGRlcHJlY2F0ZWQgR1ZhbHVlQXJyYXkgd2l0aG91dAorICogcHJvdmlkaW5nIGFuIGFsdGVybmF0aXZlCisgKgorICogU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NjcyMjgKKyAqICovCisjZGVmaW5lIEdMSUJfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworCisjaW5jbHVkZSA8Z3N0L3RhZy90YWcuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHZwOHV0aWxzLmgiCisjaW5jbHVkZSAiZ3N0dnB4ZW5jLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF92cHhlbmNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3ZweGVuY19kZWJ1ZworCisvKiBGcm9tIHZwOC92cDhfY3hfaWZhY2UuYyBhbmQgdnA5L3ZwOV9jeF9pZmFjZS5jICovCisjZGVmaW5lIERFRkFVTFRfUFJPRklMRSAwCisKKyNkZWZpbmUgREVGQVVMVF9SQ19FTkRfVVNBR0UgVlBYX1ZCUgorI2RlZmluZSBERUZBVUxUX1JDX1RBUkdFVF9CSVRSQVRFIDI1NjAwMAorI2RlZmluZSBERUZBVUxUX1JDX01JTl9RVUFOVElaRVIgNAorI2RlZmluZSBERUZBVUxUX1JDX01BWF9RVUFOVElaRVIgNjMKKworI2RlZmluZSBERUZBVUxUX1JDX0RST1BGUkFNRV9USFJFU0ggMAorI2RlZmluZSBERUZBVUxUX1JDX1JFU0laRV9BTExPV0VEIDAKKyNkZWZpbmUgREVGQVVMVF9SQ19SRVNJWkVfVVBfVEhSRVNIIDMwCisjZGVmaW5lIERFRkFVTFRfUkNfUkVTSVpFX0RPV05fVEhSRVNIIDYwCisjZGVmaW5lIERFRkFVTFRfUkNfVU5ERVJTSE9PVF9QQ1QgMTAwCisjZGVmaW5lIERFRkFVTFRfUkNfT1ZFUlNIT09UX1BDVCAxMDAKKyNkZWZpbmUgREVGQVVMVF9SQ19CVUZfU1ogNjAwMAorI2RlZmluZSBERUZBVUxUX1JDX0JVRl9JTklUSUFMX1NaIDQwMDAKKyNkZWZpbmUgREVGQVVMVF9SQ19CVUZfT1BUSU1BTF9TWiA1MDAwCisjZGVmaW5lIERFRkFVTFRfUkNfMlBBU1NfVkJSX0JJQVNfUENUIDUwCisjZGVmaW5lIERFRkFVTFRfUkNfMlBBU1NfVkJSX01JTlNFQ1RJT05fUENUIDAKKyNkZWZpbmUgREVGQVVMVF9SQ18yUEFTU19WQlJfTUFYU0VDVElPTl9QQ1QgNDAwCisKKyNkZWZpbmUgREVGQVVMVF9LRl9NT0RFIFZQWF9LRl9BVVRPCisjZGVmaW5lIERFRkFVTFRfS0ZfTUFYX0RJU1QgMTI4CisKKyNkZWZpbmUgREVGQVVMVF9NVUxUSVBBU1NfTU9ERSBWUFhfUkNfT05FX1BBU1MKKyNkZWZpbmUgREVGQVVMVF9NVUxUSVBBU1NfQ0FDSEVfRklMRSAibXVsdGlwYXNzLmNhY2hlIgorCisjZGVmaW5lIERFRkFVTFRfVFNfTlVNQkVSX0xBWUVSUyAxCisjZGVmaW5lIERFRkFVTFRfVFNfVEFSR0VUX0JJVFJBVEUgTlVMTAorI2RlZmluZSBERUZBVUxUX1RTX1JBVEVfREVDSU1BVE9SIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9UU19QRVJJT0RJQ0lUWSAwCisjZGVmaW5lIERFRkFVTFRfVFNfTEFZRVJfSUQgTlVMTAorCisjZGVmaW5lIERFRkFVTFRfRVJST1JfUkVTSUxJRU5UIDAKKyNkZWZpbmUgREVGQVVMVF9MQUdfSU5fRlJBTUVTIDAKKworI2RlZmluZSBERUZBVUxUX1RIUkVBRFMgMAorCisjZGVmaW5lIERFRkFVTFRfSF9TQ0FMSU5HX01PREUgVlA4RV9OT1JNQUwKKyNkZWZpbmUgREVGQVVMVF9WX1NDQUxJTkdfTU9ERSBWUDhFX05PUk1BTAorI2RlZmluZSBERUZBVUxUX0NQVV9VU0VEIDAKKyNkZWZpbmUgREVGQVVMVF9FTkFCTEVfQVVUT19BTFRfUkVGIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfREVBRExJTkUgVlBYX0RMX0JFU1RfUVVBTElUWQorI2RlZmluZSBERUZBVUxUX05PSVNFX1NFTlNJVElWSVRZIDAKKyNkZWZpbmUgREVGQVVMVF9TSEFSUE5FU1MgMAorI2RlZmluZSBERUZBVUxUX1NUQVRJQ19USFJFU0hPTEQgMAorI2RlZmluZSBERUZBVUxUX1RPS0VOX1BBUlRJVElPTlMgMAorI2RlZmluZSBERUZBVUxUX0FSTlJfTUFYRlJBTUVTIDAKKyNkZWZpbmUgREVGQVVMVF9BUk5SX1NUUkVOR1RIIDMKKyNkZWZpbmUgREVGQVVMVF9BUk5SX1RZUEUgMworI2RlZmluZSBERUZBVUxUX1RVTklORyBWUDhfVFVORV9QU05SCisjZGVmaW5lIERFRkFVTFRfQ1FfTEVWRUwgMTAKKyNkZWZpbmUgREVGQVVMVF9NQVhfSU5UUkFfQklUUkFURV9QQ1QgMAorI2RlZmluZSBERUZBVUxUX1RJTUVCQVNFX04gMAorI2RlZmluZSBERUZBVUxUX1RJTUVCQVNFX0QgMQorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9SQ19FTkRfVVNBR0UsCisgIFBST1BfUkNfVEFSR0VUX0JJVFJBVEUsCisgIFBST1BfUkNfTUlOX1FVQU5USVpFUiwKKyAgUFJPUF9SQ19NQVhfUVVBTlRJWkVSLAorICBQUk9QX1JDX0RST1BGUkFNRV9USFJFU0gsCisgIFBST1BfUkNfUkVTSVpFX0FMTE9XRUQsCisgIFBST1BfUkNfUkVTSVpFX1VQX1RIUkVTSCwKKyAgUFJPUF9SQ19SRVNJWkVfRE9XTl9USFJFU0gsCisgIFBST1BfUkNfVU5ERVJTSE9PVF9QQ1QsCisgIFBST1BfUkNfT1ZFUlNIT09UX1BDVCwKKyAgUFJPUF9SQ19CVUZfU1osCisgIFBST1BfUkNfQlVGX0lOSVRJQUxfU1osCisgIFBST1BfUkNfQlVGX09QVElNQUxfU1osCisgIFBST1BfUkNfMlBBU1NfVkJSX0JJQVNfUENULAorICBQUk9QX1JDXzJQQVNTX1ZCUl9NSU5TRUNUSU9OX1BDVCwKKyAgUFJPUF9SQ18yUEFTU19WQlJfTUFYU0VDVElPTl9QQ1QsCisgIFBST1BfS0ZfTU9ERSwKKyAgUFJPUF9LRl9NQVhfRElTVCwKKyAgUFJPUF9UU19OVU1CRVJfTEFZRVJTLAorICBQUk9QX1RTX1RBUkdFVF9CSVRSQVRFLAorICBQUk9QX1RTX1JBVEVfREVDSU1BVE9SLAorICBQUk9QX1RTX1BFUklPRElDSVRZLAorICBQUk9QX1RTX0xBWUVSX0lELAorICBQUk9QX01VTFRJUEFTU19NT0RFLAorICBQUk9QX01VTFRJUEFTU19DQUNIRV9GSUxFLAorICBQUk9QX0VSUk9SX1JFU0lMSUVOVCwKKyAgUFJPUF9MQUdfSU5fRlJBTUVTLAorICBQUk9QX1RIUkVBRFMsCisgIFBST1BfREVBRExJTkUsCisgIFBST1BfSF9TQ0FMSU5HX01PREUsCisgIFBST1BfVl9TQ0FMSU5HX01PREUsCisgIFBST1BfQ1BVX1VTRUQsCisgIFBST1BfRU5BQkxFX0FVVE9fQUxUX1JFRiwKKyAgUFJPUF9OT0lTRV9TRU5TSVRJVklUWSwKKyAgUFJPUF9TSEFSUE5FU1MsCisgIFBST1BfU1RBVElDX1RIUkVTSE9MRCwKKyAgUFJPUF9UT0tFTl9QQVJUSVRJT05TLAorICBQUk9QX0FSTlJfTUFYRlJBTUVTLAorICBQUk9QX0FSTlJfU1RSRU5HVEgsCisgIFBST1BfQVJOUl9UWVBFLAorICBQUk9QX1RVTklORywKKyAgUFJPUF9DUV9MRVZFTCwKKyAgUFJPUF9NQVhfSU5UUkFfQklUUkFURV9QQ1QsCisgIFBST1BfVElNRUJBU0UKK307CisKKworI2RlZmluZSBHU1RfVlBYX0VOQ19FTkRfVVNBR0VfVFlQRSAoZ3N0X3ZweF9lbmNfZW5kX3VzYWdlX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF92cHhfZW5jX2VuZF91c2FnZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAge1ZQWF9WQlIsICJWYXJpYWJsZSBCaXQgUmF0ZSAoVkJSKSBtb2RlIiwgInZiciJ9LAorICAgIHtWUFhfQ0JSLCAiQ29uc3RhbnQgQml0IFJhdGUgKENCUikgbW9kZSIsICJjYnIifSwKKyAgICB7VlBYX0NRLCAiQ29uc3RhbnQgUXVhbGl0eSBNb2RlIChDUSkgbW9kZSIsICJjcSJ9LAorICAgIHswLCBOVUxMLCBOVUxMfQorICB9OworICBzdGF0aWMgdm9sYXRpbGUgR1R5cGUgaWQgPSAwOworCisgIGlmIChnX29uY2VfaW5pdF9lbnRlciAoKGdzaXplICopICYgaWQpKSB7CisgICAgR1R5cGUgX2lkOworCisgICAgX2lkID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFZQWEVuY0VuZFVzYWdlIiwgdmFsdWVzKTsKKworICAgIGdfb25jZV9pbml0X2xlYXZlICgoZ3NpemUgKikgJiBpZCwgX2lkKTsKKyAgfQorCisgIHJldHVybiBpZDsKK30KKworI2RlZmluZSBHU1RfVlBYX0VOQ19NVUxUSVBBU1NfTU9ERV9UWVBFIChnc3RfdnB4X2VuY19tdWx0aXBhc3NfbW9kZV9nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3RfdnB4X2VuY19tdWx0aXBhc3NfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAge1ZQWF9SQ19PTkVfUEFTUywgIk9uZSBwYXNzIGVuY29kaW5nIChkZWZhdWx0KSIsICJvbmUtcGFzcyJ9LAorICAgIHtWUFhfUkNfRklSU1RfUEFTUywgIkZpcnN0IHBhc3Mgb2YgbXVsdGlwYXNzIGVuY29kaW5nIiwgImZpcnN0LXBhc3MifSwKKyAgICB7VlBYX1JDX0xBU1RfUEFTUywgIkxhc3QgcGFzcyBvZiBtdWx0aXBhc3MgZW5jb2RpbmciLCAibGFzdC1wYXNzIn0sCisgICAgezAsIE5VTEwsIE5VTEx9CisgIH07CisgIHN0YXRpYyB2b2xhdGlsZSBHVHlwZSBpZCA9IDA7CisKKyAgaWYgKGdfb25jZV9pbml0X2VudGVyICgoZ3NpemUgKikgJiBpZCkpIHsKKyAgICBHVHlwZSBfaWQ7CisKKyAgICBfaWQgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0VlBYRW5jTXVsdGlwYXNzTW9kZSIsIHZhbHVlcyk7CisKKyAgICBnX29uY2VfaW5pdF9sZWF2ZSAoKGdzaXplICopICYgaWQsIF9pZCk7CisgIH0KKworICByZXR1cm4gaWQ7Cit9CisKKyNkZWZpbmUgR1NUX1ZQWF9FTkNfS0ZfTU9ERV9UWVBFIChnc3RfdnB4X2VuY19rZl9tb2RlX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF92cHhfZW5jX2tmX21vZGVfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHZhbHVlc1tdID0geworICAgIHtWUFhfS0ZfQVVUTywgIkRldGVybWluZSBvcHRpbWFsIHBsYWNlbWVudCBhdXRvbWF0aWNhbGx5IiwgImF1dG8ifSwKKyAgICB7VlBYX0tGX0RJU0FCTEVELCAiRG9uJ3QgYXV0b21hdGljYWxseSBwbGFjZSBrZXlmcmFtZXMiLCAiZGlzYWJsZWQifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0KKyAgfTsKKyAgc3RhdGljIHZvbGF0aWxlIEdUeXBlIGlkID0gMDsKKworICBpZiAoZ19vbmNlX2luaXRfZW50ZXIgKChnc2l6ZSAqKSAmIGlkKSkgeworICAgIEdUeXBlIF9pZDsKKworICAgIF9pZCA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RWUFhFbmNLZk1vZGUiLCB2YWx1ZXMpOworCisgICAgZ19vbmNlX2luaXRfbGVhdmUgKChnc2l6ZSAqKSAmIGlkLCBfaWQpOworICB9CisKKyAgcmV0dXJuIGlkOworfQorCisjZGVmaW5lIEdTVF9WUFhfRU5DX1RVTklOR19UWVBFIChnc3RfdnB4X2VuY190dW5pbmdfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3ZweF9lbmNfdHVuaW5nX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSB2YWx1ZXNbXSA9IHsKKyAgICB7VlA4X1RVTkVfUFNOUiwgIlR1bmUgZm9yIFBTTlIiLCAicHNuciJ9LAorICAgIHtWUDhfVFVORV9TU0lNLCAiVHVuZSBmb3IgU1NJTSIsICJzc2ltIn0sCisgICAgezAsIE5VTEwsIE5VTEx9CisgIH07CisgIHN0YXRpYyB2b2xhdGlsZSBHVHlwZSBpZCA9IDA7CisKKyAgaWYgKGdfb25jZV9pbml0X2VudGVyICgoZ3NpemUgKikgJiBpZCkpIHsKKyAgICBHVHlwZSBfaWQ7CisKKyAgICBfaWQgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0VlBYRW5jVHVuaW5nIiwgdmFsdWVzKTsKKworICAgIGdfb25jZV9pbml0X2xlYXZlICgoZ3NpemUgKikgJiBpZCwgX2lkKTsKKyAgfQorCisgIHJldHVybiBpZDsKK30KKworI2RlZmluZSBHU1RfVlBYX0VOQ19TQ0FMSU5HX01PREVfVFlQRSAoZ3N0X3ZweF9lbmNfc2NhbGluZ19tb2RlX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF92cHhfZW5jX3NjYWxpbmdfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAge1ZQOEVfTk9STUFMLCAiTm9ybWFsIiwgIm5vcm1hbCJ9LAorICAgIHtWUDhFX0ZPVVJGSVZFLCAiNDo1IiwgIjQ6NSJ9LAorICAgIHtWUDhFX1RIUkVFRklWRSwgIjM6NSIsICIzOjUifSwKKyAgICB7VlA4RV9PTkVUV08sICIxOjIiLCAiMToyIn0sCisgICAgezAsIE5VTEwsIE5VTEx9CisgIH07CisgIHN0YXRpYyB2b2xhdGlsZSBHVHlwZSBpZCA9IDA7CisKKyAgaWYgKGdfb25jZV9pbml0X2VudGVyICgoZ3NpemUgKikgJiBpZCkpIHsKKyAgICBHVHlwZSBfaWQ7CisKKyAgICBfaWQgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0VlBYRW5jU2NhbGluZ01vZGUiLCB2YWx1ZXMpOworCisgICAgZ19vbmNlX2luaXRfbGVhdmUgKChnc2l6ZSAqKSAmIGlkLCBfaWQpOworICB9CisKKyAgcmV0dXJuIGlkOworfQorCisjZGVmaW5lIEdTVF9WUFhfRU5DX1RPS0VOX1BBUlRJVElPTlNfVFlQRSAoZ3N0X3ZweF9lbmNfdG9rZW5fcGFydGl0aW9uc19nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3RfdnB4X2VuY190b2tlbl9wYXJ0aXRpb25zX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSB2YWx1ZXNbXSA9IHsKKyAgICB7VlA4X09ORV9UT0tFTlBBUlRJVElPTiwgIk9uZSB0b2tlbiBwYXJ0aXRpb24iLCAiMSJ9LAorICAgIHtWUDhfVFdPX1RPS0VOUEFSVElUSU9OLCAiVHdvIHRva2VuIHBhcnRpdGlvbnMiLCAiMiJ9LAorICAgIHtWUDhfRk9VUl9UT0tFTlBBUlRJVElPTiwgIkZvdXIgdG9rZW4gcGFydGl0aW9ucyIsICI0In0sCisgICAge1ZQOF9FSUdIVF9UT0tFTlBBUlRJVElPTiwgIkVpZ2h0IHRva2VuIHBhcnRpdGlvbnMiLCAiOCJ9LAorICAgIHswLCBOVUxMLCBOVUxMfQorICB9OworICBzdGF0aWMgdm9sYXRpbGUgR1R5cGUgaWQgPSAwOworCisgIGlmIChnX29uY2VfaW5pdF9lbnRlciAoKGdzaXplICopICYgaWQpKSB7CisgICAgR1R5cGUgX2lkOworCisgICAgX2lkID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFZQWEVuY1Rva2VuUGFydGl0aW9ucyIsIHZhbHVlcyk7CisKKyAgICBnX29uY2VfaW5pdF9sZWF2ZSAoKGdzaXplICopICYgaWQsIF9pZCk7CisgIH0KKworICByZXR1cm4gaWQ7Cit9CisKKyNkZWZpbmUgR1NUX1ZQWF9FTkNfRVJfRkxBR1NfVFlQRSAoZ3N0X3ZweF9lbmNfZXJfZmxhZ3NfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3ZweF9lbmNfZXJfZmxhZ3NfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBHRmxhZ3NWYWx1ZSB2YWx1ZXNbXSA9IHsKKyAgICB7VlBYX0VSUk9SX1JFU0lMSUVOVF9ERUZBVUxULCAiRGVmYXVsdCBlcnJvciByZXNpbGllbmNlIiwgImRlZmF1bHQifSwKKyAgICB7VlBYX0VSUk9SX1JFU0lMSUVOVF9QQVJUSVRJT05TLAorICAgICAgICAiQWxsb3cgcGFydGl0aW9ucyB0byBiZSBkZWNvZGVkIGluZGVwZW5kZW50bHkiLCAicGFydGl0aW9ucyJ9LAorICAgIHswLCBOVUxMLCBOVUxMfQorICB9OworICBzdGF0aWMgdm9sYXRpbGUgR1R5cGUgaWQgPSAwOworCisgIGlmIChnX29uY2VfaW5pdF9lbnRlciAoKGdzaXplICopICYgaWQpKSB7CisgICAgR1R5cGUgX2lkOworCisgICAgX2lkID0gZ19mbGFnc19yZWdpc3Rlcl9zdGF0aWMgKCJHc3RWUFhFbmNFckZsYWdzIiwgdmFsdWVzKTsKKworICAgIGdfb25jZV9pbml0X2xlYXZlICgoZ3NpemUgKikgJiBpZCwgX2lkKTsKKyAgfQorCisgIHJldHVybiBpZDsKK30KKworc3RhdGljIHZvaWQgZ3N0X3ZweF9lbmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X3ZweF9lbmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3ZweF9lbmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZweF9lbmNfc3RhcnQgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIpOworc3RhdGljIGdib29sZWFuIGdzdF92cHhfZW5jX3N0b3AgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIpOworc3RhdGljIGdib29sZWFuIGdzdF92cHhfZW5jX3NldF9mb3JtYXQgKEdzdFZpZGVvRW5jb2RlciAqCisgICAgdmlkZW9fZW5jb2RlciwgR3N0VmlkZW9Db2RlY1N0YXRlICogc3RhdGUpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3ZweF9lbmNfZmluaXNoIChHc3RWaWRlb0VuY29kZXIgKiB2aWRlb19lbmNvZGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdnB4X2VuY19mbHVzaCAoR3N0VmlkZW9FbmNvZGVyICogdmlkZW9fZW5jb2Rlcik7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfdnB4X2VuY19kcmFpbiAoR3N0VmlkZW9FbmNvZGVyICogdmlkZW9fZW5jb2Rlcik7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfdnB4X2VuY19oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRW5jb2RlciAqCisgICAgdmlkZW9fZW5jb2RlciwgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUpOworc3RhdGljIGdib29sZWFuIGdzdF92cHhfZW5jX3NpbmtfZXZlbnQgKEdzdFZpZGVvRW5jb2RlciAqCisgICAgdmlkZW9fZW5jb2RlciwgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZweF9lbmNfcHJvcG9zZV9hbGxvY2F0aW9uIChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyLAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworCisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfdnB4X2VuY19wYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RWUFhFbmMsIGdzdF92cHhfZW5jLCBHU1RfVFlQRV9WSURFT19FTkNPREVSLAorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfVEFHX1NFVFRFUiwgTlVMTCk7CisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9QUkVTRVQsIE5VTEwpOyk7CisKK3N0YXRpYyB2b2lkCitnc3RfdnB4X2VuY19jbGFzc19pbml0IChHc3RWUFhFbmNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdFZpZGVvRW5jb2RlckNsYXNzICp2aWRlb19lbmNvZGVyX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICB2aWRlb19lbmNvZGVyX2NsYXNzID0gR1NUX1ZJREVPX0VOQ09ERVJfQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdnB4X2VuY19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF92cHhfZW5jX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfdnB4X2VuY19maW5hbGl6ZTsKKworICB2aWRlb19lbmNvZGVyX2NsYXNzLT5zdGFydCA9IGdzdF92cHhfZW5jX3N0YXJ0OworICB2aWRlb19lbmNvZGVyX2NsYXNzLT5zdG9wID0gZ3N0X3ZweF9lbmNfc3RvcDsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+aGFuZGxlX2ZyYW1lID0gZ3N0X3ZweF9lbmNfaGFuZGxlX2ZyYW1lOworICB2aWRlb19lbmNvZGVyX2NsYXNzLT5zZXRfZm9ybWF0ID0gZ3N0X3ZweF9lbmNfc2V0X2Zvcm1hdDsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+Zmx1c2ggPSBnc3RfdnB4X2VuY19mbHVzaDsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+ZmluaXNoID0gZ3N0X3ZweF9lbmNfZmluaXNoOworICB2aWRlb19lbmNvZGVyX2NsYXNzLT5zaW5rX2V2ZW50ID0gZ3N0X3ZweF9lbmNfc2lua19ldmVudDsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+cHJvcG9zZV9hbGxvY2F0aW9uID0gZ3N0X3ZweF9lbmNfcHJvcG9zZV9hbGxvY2F0aW9uOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkNfRU5EX1VTQUdFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJlbmQtdXNhZ2UiLCAiUmF0ZSBjb250cm9sIG1vZGUiLAorICAgICAgICAgICJSYXRlIGNvbnRyb2wgbW9kZSIsCisgICAgICAgICAgR1NUX1ZQWF9FTkNfRU5EX1VTQUdFX1RZUEUsIERFRkFVTFRfUkNfRU5EX1VTQUdFLAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JDX1RBUkdFVF9CSVRSQVRFLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInRhcmdldC1iaXRyYXRlIiwgIlRhcmdldCBiaXRyYXRlIiwKKyAgICAgICAgICAiVGFyZ2V0IGJpdHJhdGUgKGluIGJpdHMvc2VjKSIsCisgICAgICAgICAgMCwgR19NQVhJTlQsIERFRkFVTFRfUkNfVEFSR0VUX0JJVFJBVEUsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkNfTUlOX1FVQU5USVpFUiwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJtaW4tcXVhbnRpemVyIiwgIk1pbmltdW0gUXVhbnRpemVyIiwKKyAgICAgICAgICAiTWluaW11bSBRdWFudGl6ZXIgKGJlc3QpIiwKKyAgICAgICAgICAwLCA2MywgREVGQVVMVF9SQ19NSU5fUVVBTlRJWkVSLAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JDX01BWF9RVUFOVElaRVIsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgibWF4LXF1YW50aXplciIsICJNYXhpbXVtIFF1YW50aXplciIsCisgICAgICAgICAgIk1heGltdW0gUXVhbnRpemVyICh3b3JzdCkiLAorICAgICAgICAgIDAsIDYzLCBERUZBVUxUX1JDX01BWF9RVUFOVElaRVIsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkNfRFJPUEZSQU1FX1RIUkVTSCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJkcm9wZnJhbWUtdGhyZXNob2xkIiwgIkRyb3AgRnJhbWUgVGhyZXNob2xkIiwKKyAgICAgICAgICAiVGVtcG9yYWwgcmVzYW1wbGluZyB0aHJlc2hvbGQgKGJ1ZiAlKSIsCisgICAgICAgICAgMCwgMTAwLCBERUZBVUxUX1JDX0RST1BGUkFNRV9USFJFU0gsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkNfUkVTSVpFX0FMTE9XRUQsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInJlc2l6ZS1hbGxvd2VkIiwgIlJlc2l6ZSBBbGxvd2VkIiwKKyAgICAgICAgICAiQWxsb3cgc3BhdGlhbCByZXNhbXBsaW5nIiwKKyAgICAgICAgICBERUZBVUxUX1JDX1JFU0laRV9BTExPV0VELAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JDX1JFU0laRV9VUF9USFJFU0gsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicmVzaXplLXVwLXRocmVzaG9sZCIsICJSZXNpemUgVXAgVGhyZXNob2xkIiwKKyAgICAgICAgICAiVXBzY2FsZSB0aHJlc2hvbGQgKGJ1ZiAlKSIsCisgICAgICAgICAgMCwgMTAwLCBERUZBVUxUX1JDX1JFU0laRV9VUF9USFJFU0gsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkNfUkVTSVpFX0RPV05fVEhSRVNILAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInJlc2l6ZS1kb3duLXRocmVzaG9sZCIsICJSZXNpemUgRG93biBUaHJlc2hvbGQiLAorICAgICAgICAgICJEb3duc2NhbGUgdGhyZXNob2xkIChidWYgJSkiLAorICAgICAgICAgIDAsIDEwMCwgREVGQVVMVF9SQ19SRVNJWkVfRE9XTl9USFJFU0gsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkNfVU5ERVJTSE9PVF9QQ1QsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgidW5kZXJzaG9vdCIsICJVbmRlcnNob290IFBDVCIsCisgICAgICAgICAgIkRhdGFyYXRlIHVuZGVyc2hvb3QgKG1pbikgdGFyZ2V0ICglKSIsCisgICAgICAgICAgMCwgMTAwMCwgREVGQVVMVF9SQ19VTkRFUlNIT09UX1BDVCwKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SQ19PVkVSU0hPT1RfUENULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoIm92ZXJzaG9vdCIsICJPdmVyc2hvb3QgUENUIiwKKyAgICAgICAgICAiRGF0YXJhdGUgb3ZlcnNob290IChtYXgpIHRhcmdldCAoJSkiLAorICAgICAgICAgIDAsIDEwMDAsIERFRkFVTFRfUkNfT1ZFUlNIT09UX1BDVCwKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SQ19CVUZfU1osCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiYnVmZmVyLXNpemUiLCAiQnVmZmVyIHNpemUiLAorICAgICAgICAgICJDbGllbnQgYnVmZmVyIHNpemUgKG1zKSIsCisgICAgICAgICAgMCwgR19NQVhJTlQsIERFRkFVTFRfUkNfQlVGX1NaLAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JDX0JVRl9JTklUSUFMX1NaLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImJ1ZmZlci1pbml0aWFsLXNpemUiLCAiQnVmZmVyIGluaXRpYWwgc2l6ZSIsCisgICAgICAgICAgIkluaXRpYWwgY2xpZW50IGJ1ZmZlciBzaXplIChtcykiLAorICAgICAgICAgIDAsIEdfTUFYSU5ULCBERUZBVUxUX1JDX0JVRl9JTklUSUFMX1NaLAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JDX0JVRl9PUFRJTUFMX1NaLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImJ1ZmZlci1vcHRpbWFsLXNpemUiLCAiQnVmZmVyIG9wdGltYWwgc2l6ZSIsCisgICAgICAgICAgIk9wdGltYWwgY2xpZW50IGJ1ZmZlciBzaXplIChtcykiLAorICAgICAgICAgIDAsIEdfTUFYSU5ULCBERUZBVUxUX1JDX0JVRl9PUFRJTUFMX1NaLAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JDXzJQQVNTX1ZCUl9CSUFTX1BDVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0d29wYXNzLXZici1iaWFzIiwgIjItcGFzcyBWQlIgYmlhcyIsCisgICAgICAgICAgIkNCUi9WQlIgYmlhcyAoMD1DQlIsIDEwMD1WQlIpIiwKKyAgICAgICAgICAwLCAxMDAsIERFRkFVTFRfUkNfMlBBU1NfVkJSX0JJQVNfUENULAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9SQ18yUEFTU19WQlJfTUlOU0VDVElPTl9QQ1QsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgidHdvcGFzcy12YnItbWluc2VjdGlvbiIsICIyLXBhc3MgR09QIG1pbiBiaXRyYXRlIiwKKyAgICAgICAgICAiR09QIG1pbmltdW0gYml0cmF0ZSAoJSB0YXJnZXQpIiwgMCwgR19NQVhJTlQsCisgICAgICAgICAgREVGQVVMVF9SQ18yUEFTU19WQlJfTUlOU0VDVElPTl9QQ1QsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1JDXzJQQVNTX1ZCUl9NQVhTRUNUSU9OX1BDVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0d29wYXNzLXZici1tYXhzZWN0aW9uIiwgIjItcGFzcyBHT1AgbWF4IGJpdHJhdGUiLAorICAgICAgICAgICJHT1AgbWF4aW11bSBiaXRyYXRlICglIHRhcmdldCkiLCAwLCBHX01BWElOVCwKKyAgICAgICAgICBERUZBVUxUX1JDXzJQQVNTX1ZCUl9NSU5TRUNUSU9OX1BDVCwKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9LRl9NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJrZXlmcmFtZS1tb2RlIiwgIktleWZyYW1lIE1vZGUiLAorICAgICAgICAgICJLZXlmcmFtZSBwbGFjZW1lbnQiLAorICAgICAgICAgIEdTVF9WUFhfRU5DX0tGX01PREVfVFlQRSwgREVGQVVMVF9LRl9NT0RFLAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0tGX01BWF9ESVNULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImtleWZyYW1lLW1heC1kaXN0IiwgIktleWZyYW1lIG1heCBkaXN0YW5jZSIsCisgICAgICAgICAgIk1heGltdW0gZGlzdGFuY2UgYmV0d2VlbiBrZXlmcmFtZXMgKG51bWJlciBvZiBmcmFtZXMpIiwKKyAgICAgICAgICAwLCBHX01BWElOVCwgREVGQVVMVF9LRl9NQVhfRElTVCwKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NVUxUSVBBU1NfTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgibXVsdGlwYXNzLW1vZGUiLCAiTXVsdGlwYXNzIE1vZGUiLAorICAgICAgICAgICJNdWx0aXBhc3MgZW5jb2RlIG1vZGUiLAorICAgICAgICAgIEdTVF9WUFhfRU5DX01VTFRJUEFTU19NT0RFX1RZUEUsIERFRkFVTFRfTVVMVElQQVNTX01PREUsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTVVMVElQQVNTX0NBQ0hFX0ZJTEUsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibXVsdGlwYXNzLWNhY2hlLWZpbGUiLCAiTXVsdGlwYXNzIENhY2hlIEZpbGUiLAorICAgICAgICAgICJNdWx0aXBhc3MgY2FjaGUgZmlsZS4gIgorICAgICAgICAgICJJZiBzdHJlYW0gY2FwcyByZWluaXRlZCwgbXVsdGlwbGUgZmlsZXMgd2lsbCBiZSBjcmVhdGVkOiAiCisgICAgICAgICAgImZpbGUsIGZpbGUuMSwgZmlsZS4yLCAuLi4gYW5kIHNvIG9uLiIsCisgICAgICAgICAgREVGQVVMVF9NVUxUSVBBU1NfQ0FDSEVfRklMRSwKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UU19OVU1CRVJfTEFZRVJTLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInRlbXBvcmFsLXNjYWxhYmlsaXR5LW51bWJlci1sYXllcnMiLAorICAgICAgICAgICJOdW1iZXIgb2YgY29kaW5nIGxheWVycyIsICJOdW1iZXIgb2YgY29kaW5nIGxheWVycyB0byB1c2UiLCAxLCA1LAorICAgICAgICAgIERFRkFVTFRfVFNfTlVNQkVSX0xBWUVSUywKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UU19UQVJHRVRfQklUUkFURSwKKyAgICAgIGdfcGFyYW1fc3BlY192YWx1ZV9hcnJheSAoInRlbXBvcmFsLXNjYWxhYmlsaXR5LXRhcmdldC1iaXRyYXRlIiwKKyAgICAgICAgICAiQ29kaW5nIGxheWVyIHRhcmdldCBiaXRyYXRlcyIsCisgICAgICAgICAgIlRhcmdldCBiaXRyYXRlcyBmb3IgY29kaW5nIGxheWVycyAob25lIHBlciBsYXllciwgZGVjcmVhc2luZykiLAorICAgICAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0YXJnZXQtYml0cmF0ZSIsICJUYXJnZXQgYml0cmF0ZSIsCisgICAgICAgICAgICAgICJUYXJnZXQgYml0cmF0ZSIsIDAsIEdfTUFYSU5ULCBERUZBVUxUX1JDX1RBUkdFVF9CSVRSQVRFLAorICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVFNfUkFURV9ERUNJTUFUT1IsCisgICAgICBnX3BhcmFtX3NwZWNfdmFsdWVfYXJyYXkgKCJ0ZW1wb3JhbC1zY2FsYWJpbGl0eS1yYXRlLWRlY2ltYXRvciIsCisgICAgICAgICAgIkNvZGluZyBsYXllciByYXRlIGRlY2ltYXRvciIsCisgICAgICAgICAgIlJhdGUgZGVjaW1hdGlvbiBmYWN0b3JzIGZvciBlYWNoIGxheWVyIiwKKyAgICAgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicmF0ZS1kZWNpbWF0b3IiLCAiUmF0ZSBkZWNpbWF0b3IiLAorICAgICAgICAgICAgICAiUmF0ZSBkZWNpbWF0b3IiLCAwLCAxMDAwMDAwMDAwLCAwLAorICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVFNfUEVSSU9ESUNJVFksCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgidGVtcG9yYWwtc2NhbGFiaWxpdHktcGVyaW9kaWNpdHkiLAorICAgICAgICAgICJDb2RpbmcgbGF5ZXIgcGVyaW9kaWNpdHkiLAorICAgICAgICAgICJMZW5ndGggb2Ygc2VxdWVuY2UgdGhhdCBkZWZpbmVzIGxheWVyIG1lbWJlcnNoaXAgcGVyaW9kaWNpdHkiLCAwLCAxNiwKKyAgICAgICAgICBERUZBVUxUX1RTX1BFUklPRElDSVRZLAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RTX0xBWUVSX0lELAorICAgICAgZ19wYXJhbV9zcGVjX3ZhbHVlX2FycmF5ICgidGVtcG9yYWwtc2NhbGFiaWxpdHktbGF5ZXItaWQiLAorICAgICAgICAgICJDb2RpbmcgbGF5ZXIgaWRlbnRpZmljYXRpb24iLAorICAgICAgICAgICJTZXF1ZW5jZSBkZWZpbmluZyBjb2RpbmcgbGF5ZXIgbWVtYmVyc2hpcCIsCisgICAgICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImxheWVyLWlkIiwgIkxheWVyIElEIiwgIkxheWVyIElEIiwgMCwgNCwgMCwKKyAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0xBR19JTl9GUkFNRVMsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgibGFnLWluLWZyYW1lcyIsICJMYWcgaW4gZnJhbWVzIiwKKyAgICAgICAgICAiTWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIHRvIGxhZyIsCisgICAgICAgICAgMCwgMjUsIERFRkFVTFRfTEFHX0lOX0ZSQU1FUywKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9FUlJPUl9SRVNJTElFTlQsCisgICAgICBnX3BhcmFtX3NwZWNfZmxhZ3MgKCJlcnJvci1yZXNpbGllbnQiLCAiRXJyb3IgcmVzaWxpZW50IiwKKyAgICAgICAgICAiRXJyb3IgcmVzaWxpZW5jZSBmbGFncyIsCisgICAgICAgICAgR1NUX1ZQWF9FTkNfRVJfRkxBR1NfVFlQRSwgREVGQVVMVF9FUlJPUl9SRVNJTElFTlQsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVEhSRUFEUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0aHJlYWRzIiwgIlRocmVhZHMiLAorICAgICAgICAgICJOdW1iZXIgb2YgdGhyZWFkcyB0byB1c2UiLAorICAgICAgICAgIDAsIDY0LCBERUZBVUxUX1RIUkVBRFMsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfREVBRExJTkUsCisgICAgICBnX3BhcmFtX3NwZWNfaW50NjQgKCJkZWFkbGluZSIsICJEZWFkbGluZSIsCisgICAgICAgICAgIkRlYWRsaW5lIHBlciBmcmFtZSAodXNlYywgMD1kaXNhYmxlZCkiLAorICAgICAgICAgIDAsIEdfTUFYSU5UNjQsIERFRkFVTFRfREVBRExJTkUsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSF9TQ0FMSU5HX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoImhvcml6b250YWwtc2NhbGluZy1tb2RlIiwgIkhvcml6b250YWwgc2NhbGluZyBtb2RlIiwKKyAgICAgICAgICAiSG9yaXpvbnRhbCBzY2FsaW5nIG1vZGUiLAorICAgICAgICAgIEdTVF9WUFhfRU5DX1NDQUxJTkdfTU9ERV9UWVBFLCBERUZBVUxUX0hfU0NBTElOR19NT0RFLAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1ZfU0NBTElOR19NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJ2ZXJ0aWNhbC1zY2FsaW5nLW1vZGUiLCAiVmVydGljYWwgc2NhbGluZyBtb2RlIiwKKyAgICAgICAgICAiVmVydGljYWwgc2NhbGluZyBtb2RlIiwKKyAgICAgICAgICBHU1RfVlBYX0VOQ19TQ0FMSU5HX01PREVfVFlQRSwgREVGQVVMVF9WX1NDQUxJTkdfTU9ERSwKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DUFVfVVNFRCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJjcHUtdXNlZCIsICJDUFUgdXNlZCIsCisgICAgICAgICAgIkNQVSB1c2VkIiwKKyAgICAgICAgICAtMTYsIDE2LCBERUZBVUxUX0NQVV9VU0VELAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0VOQUJMRV9BVVRPX0FMVF9SRUYsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImF1dG8tYWx0LXJlZiIsICJBdXRvIGFsdCByZWZlcmVuY2UgZnJhbWVzIiwKKyAgICAgICAgICAiQXV0b21hdGljYWxseSBnZW5lcmF0ZSBBbHRSZWYgZnJhbWVzIiwKKyAgICAgICAgICBERUZBVUxUX0VOQUJMRV9BVVRPX0FMVF9SRUYsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTk9JU0VfU0VOU0lUSVZJVFksCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgibm9pc2Utc2Vuc2l0aXZpdHkiLCAiTm9pc2Ugc2Vuc2l0aXZpdHkiLAorICAgICAgICAgICJOb2lzZSBzZW5zaXNpdml0eSAoZnJhbWVzIHRvIGJsdXIpIiwKKyAgICAgICAgICAwLCA2LCBERUZBVUxUX05PSVNFX1NFTlNJVElWSVRZLAorICAgICAgICAgIChHUGFyYW1GbGFncykgKEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NIQVJQTkVTUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJzaGFycG5lc3MiLCAiU2hhcnBuZXNzIiwKKyAgICAgICAgICAiRmlsdGVyIHNoYXJwbmVzcyIsCisgICAgICAgICAgMCwgNywgREVGQVVMVF9TSEFSUE5FU1MsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU1RBVElDX1RIUkVTSE9MRCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJzdGF0aWMtdGhyZXNob2xkIiwgIlN0YXRpYyBUaHJlc2hvbGQiLAorICAgICAgICAgICJNb3Rpb24gZGV0ZWN0aW9uIHRocmVzaG9sZCIsCisgICAgICAgICAgMCwgR19NQVhJTlQsIERFRkFVTFRfU1RBVElDX1RIUkVTSE9MRCwKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UT0tFTl9QQVJUSVRJT05TLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJ0b2tlbi1wYXJ0aXRpb25zIiwgIlRva2VuIHBhcnRpdGlvbnMiLAorICAgICAgICAgICJOdW1iZXIgb2YgdG9rZW4gcGFydGl0aW9ucyIsCisgICAgICAgICAgR1NUX1ZQWF9FTkNfVE9LRU5fUEFSVElUSU9OU19UWVBFLCBERUZBVUxUX1RPS0VOX1BBUlRJVElPTlMsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQVJOUl9NQVhGUkFNRVMsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiYXJuci1tYXhmcmFtZXMiLCAiQWx0UmVmIG1heCBmcmFtZXMiLAorICAgICAgICAgICJBbHRSZWYgbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIiwKKyAgICAgICAgICAwLCAxNSwgREVGQVVMVF9BUk5SX01BWEZSQU1FUywKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9BUk5SX1NUUkVOR1RILAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImFybnItc3RyZW5ndGgiLCAiQWx0UmVmIHN0cmVuZ3RoIiwKKyAgICAgICAgICAiQWx0UmVmIHN0cmVuZ3RoIiwKKyAgICAgICAgICAwLCA2LCBERUZBVUxUX0FSTlJfU1RSRU5HVEgsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQVJOUl9UWVBFLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImFybnItdHlwZSIsICJBbHRSZWYgdHlwZSIsCisgICAgICAgICAgIkFsdFJlZiB0eXBlIiwKKyAgICAgICAgICAxLCAzLCBERUZBVUxUX0FSTlJfVFlQRSwKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfAorICAgICAgICAgICAgICBHX1BBUkFNX0RFUFJFQ0FURUQpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UVU5JTkcsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoInR1bmluZyIsICJUdW5pbmciLAorICAgICAgICAgICJUdW5pbmciLAorICAgICAgICAgIEdTVF9WUFhfRU5DX1RVTklOR19UWVBFLCBERUZBVUxUX1RVTklORywKKyAgICAgICAgICAoR1BhcmFtRmxhZ3MpIChHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DUV9MRVZFTCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJjcS1sZXZlbCIsICJDb25zdHJhaW5lZCBxdWFsaXR5IGxldmVsIiwKKyAgICAgICAgICAiQ29uc3RyYWluZWQgcXVhbGl0eSBsZXZlbCIsCisgICAgICAgICAgMCwgNjMsIERFRkFVTFRfQ1FfTEVWRUwsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX0lOVFJBX0JJVFJBVEVfUENULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoIm1heC1pbnRyYS1iaXRyYXRlIiwgIk1heCBJbnRyYSBiaXRyYXRlIiwKKyAgICAgICAgICAiTWF4aW11bSBJbnRyYSBmcmFtZSBiaXRyYXRlIiwKKyAgICAgICAgICAwLCBHX01BWElOVCwgREVGQVVMVF9NQVhfSU5UUkFfQklUUkFURV9QQ1QsCisgICAgICAgICAgKEdQYXJhbUZsYWdzKSAoR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVElNRUJBU0UsCisgICAgICBnc3RfcGFyYW1fc3BlY19mcmFjdGlvbiAoInRpbWViYXNlIiwgIlNob3J0ZXN0IGludGVyZnJhbWUgdGltZSIsCisgICAgICAgICAgIkZyYWN0aW9uIG9mIG9uZSBzZWNvbmQgdGhhdCBpcyB0aGUgc2hvcnRlc3QgaW50ZXJmcmFtZSB0aW1lIC0gbm9ybWFsbHkgbGVmdCBhcyB6ZXJvIHdoaWNoIHdpbGwgZGVmYXVsdCB0byB0aGUgZnJhbWVyYXRlIiwKKyAgICAgICAgICAwLCAxLCBHX01BWElOVCwgMSwgREVGQVVMVF9USU1FQkFTRV9OLCBERUZBVUxUX1RJTUVCQVNFX0QsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF92cHhlbmNfZGVidWcsICJ2cHhlbmMiLCAwLCAiVlBYIEVuY29kZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92cHhfZW5jX2luaXQgKEdzdFZQWEVuYyAqIGdzdF92cHhfZW5jKQoreworICBHU1RfREVCVUdfT0JKRUNUIChnc3RfdnB4X2VuYywgImluaXQiKTsKKyAgR1NUX1BBRF9TRVRfQUNDRVBUX1RFTVBMQVRFIChHU1RfVklERU9fRU5DT0RFUl9TSU5LX1BBRCAoZ3N0X3ZweF9lbmMpKTsKKworICBnc3RfdnB4X2VuYy0+Y2ZnLnJjX2VuZF91c2FnZSA9IERFRkFVTFRfUkNfRU5EX1VTQUdFOworICBnc3RfdnB4X2VuYy0+Y2ZnLnJjX3RhcmdldF9iaXRyYXRlID0gREVGQVVMVF9SQ19UQVJHRVRfQklUUkFURSAvIDEwMDA7CisgIGdzdF92cHhfZW5jLT5yY190YXJnZXRfYml0cmF0ZV9zZXQgPSBGQUxTRTsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5yY19taW5fcXVhbnRpemVyID0gREVGQVVMVF9SQ19NSU5fUVVBTlRJWkVSOworICBnc3RfdnB4X2VuYy0+Y2ZnLnJjX21heF9xdWFudGl6ZXIgPSBERUZBVUxUX1JDX01BWF9RVUFOVElaRVI7CisgIGdzdF92cHhfZW5jLT5jZmcucmNfZHJvcGZyYW1lX3RocmVzaCA9IERFRkFVTFRfUkNfRFJPUEZSQU1FX1RIUkVTSDsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5yY19yZXNpemVfYWxsb3dlZCA9IERFRkFVTFRfUkNfUkVTSVpFX0FMTE9XRUQ7CisgIGdzdF92cHhfZW5jLT5jZmcucmNfcmVzaXplX3VwX3RocmVzaCA9IERFRkFVTFRfUkNfUkVTSVpFX1VQX1RIUkVTSDsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5yY19yZXNpemVfZG93bl90aHJlc2ggPSBERUZBVUxUX1JDX1JFU0laRV9ET1dOX1RIUkVTSDsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5yY191bmRlcnNob290X3BjdCA9IERFRkFVTFRfUkNfVU5ERVJTSE9PVF9QQ1Q7CisgIGdzdF92cHhfZW5jLT5jZmcucmNfb3ZlcnNob290X3BjdCA9IERFRkFVTFRfUkNfT1ZFUlNIT09UX1BDVDsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5yY19idWZfc3ogPSBERUZBVUxUX1JDX0JVRl9TWjsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5yY19idWZfaW5pdGlhbF9zeiA9IERFRkFVTFRfUkNfQlVGX0lOSVRJQUxfU1o7CisgIGdzdF92cHhfZW5jLT5jZmcucmNfYnVmX29wdGltYWxfc3ogPSBERUZBVUxUX1JDX0JVRl9PUFRJTUFMX1NaOworICBnc3RfdnB4X2VuYy0+Y2ZnLnJjXzJwYXNzX3Zicl9iaWFzX3BjdCA9IERFRkFVTFRfUkNfMlBBU1NfVkJSX0JJQVNfUENUOworICBnc3RfdnB4X2VuYy0+Y2ZnLnJjXzJwYXNzX3Zicl9taW5zZWN0aW9uX3BjdCA9CisgICAgICBERUZBVUxUX1JDXzJQQVNTX1ZCUl9NSU5TRUNUSU9OX1BDVDsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5yY18ycGFzc192YnJfbWF4c2VjdGlvbl9wY3QgPQorICAgICAgREVGQVVMVF9SQ18yUEFTU19WQlJfTUFYU0VDVElPTl9QQ1Q7CisgIGdzdF92cHhfZW5jLT5jZmcua2ZfbW9kZSA9IERFRkFVTFRfS0ZfTU9ERTsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5rZl9tYXhfZGlzdCA9IERFRkFVTFRfS0ZfTUFYX0RJU1Q7CisgIGdzdF92cHhfZW5jLT5jZmcuZ19wYXNzID0gREVGQVVMVF9NVUxUSVBBU1NfTU9ERTsKKyAgZ3N0X3ZweF9lbmMtPm11bHRpcGFzc19jYWNoZV9wcmVmaXggPSBnX3N0cmR1cCAoREVGQVVMVF9NVUxUSVBBU1NfQ0FDSEVfRklMRSk7CisgIGdzdF92cHhfZW5jLT5tdWx0aXBhc3NfY2FjaGVfZmlsZSA9IE5VTEw7CisgIGdzdF92cHhfZW5jLT5tdWx0aXBhc3NfY2FjaGVfaWR4ID0gMDsKKyAgZ3N0X3ZweF9lbmMtPmNmZy50c19udW1iZXJfbGF5ZXJzID0gREVGQVVMVF9UU19OVU1CRVJfTEFZRVJTOworICBnc3RfdnB4X2VuYy0+bl90c190YXJnZXRfYml0cmF0ZSA9IDA7CisgIGdzdF92cHhfZW5jLT5uX3RzX3JhdGVfZGVjaW1hdG9yID0gMDsKKyAgZ3N0X3ZweF9lbmMtPmNmZy50c19wZXJpb2RpY2l0eSA9IERFRkFVTFRfVFNfUEVSSU9ESUNJVFk7CisgIGdzdF92cHhfZW5jLT5uX3RzX2xheWVyX2lkID0gMDsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5nX2Vycm9yX3Jlc2lsaWVudCA9IERFRkFVTFRfRVJST1JfUkVTSUxJRU5UOworICBnc3RfdnB4X2VuYy0+Y2ZnLmdfbGFnX2luX2ZyYW1lcyA9IERFRkFVTFRfTEFHX0lOX0ZSQU1FUzsKKyAgZ3N0X3ZweF9lbmMtPmNmZy5nX3RocmVhZHMgPSBERUZBVUxUX1RIUkVBRFM7CisgIGdzdF92cHhfZW5jLT5kZWFkbGluZSA9IERFRkFVTFRfREVBRExJTkU7CisgIGdzdF92cHhfZW5jLT5oX3NjYWxpbmdfbW9kZSA9IERFRkFVTFRfSF9TQ0FMSU5HX01PREU7CisgIGdzdF92cHhfZW5jLT52X3NjYWxpbmdfbW9kZSA9IERFRkFVTFRfVl9TQ0FMSU5HX01PREU7CisgIGdzdF92cHhfZW5jLT5jcHVfdXNlZCA9IERFRkFVTFRfQ1BVX1VTRUQ7CisgIGdzdF92cHhfZW5jLT5lbmFibGVfYXV0b19hbHRfcmVmID0gREVGQVVMVF9FTkFCTEVfQVVUT19BTFRfUkVGOworICBnc3RfdnB4X2VuYy0+bm9pc2Vfc2Vuc2l0aXZpdHkgPSBERUZBVUxUX05PSVNFX1NFTlNJVElWSVRZOworICBnc3RfdnB4X2VuYy0+c2hhcnBuZXNzID0gREVGQVVMVF9TSEFSUE5FU1M7CisgIGdzdF92cHhfZW5jLT5zdGF0aWNfdGhyZXNob2xkID0gREVGQVVMVF9TVEFUSUNfVEhSRVNIT0xEOworICBnc3RfdnB4X2VuYy0+dG9rZW5fcGFydGl0aW9ucyA9IERFRkFVTFRfVE9LRU5fUEFSVElUSU9OUzsKKyAgZ3N0X3ZweF9lbmMtPmFybnJfbWF4ZnJhbWVzID0gREVGQVVMVF9BUk5SX01BWEZSQU1FUzsKKyAgZ3N0X3ZweF9lbmMtPmFybnJfc3RyZW5ndGggPSBERUZBVUxUX0FSTlJfU1RSRU5HVEg7CisgIGdzdF92cHhfZW5jLT5hcm5yX3R5cGUgPSBERUZBVUxUX0FSTlJfVFlQRTsKKyAgZ3N0X3ZweF9lbmMtPnR1bmluZyA9IERFRkFVTFRfVFVOSU5HOworICBnc3RfdnB4X2VuYy0+Y3FfbGV2ZWwgPSBERUZBVUxUX0NRX0xFVkVMOworICBnc3RfdnB4X2VuYy0+bWF4X2ludHJhX2JpdHJhdGVfcGN0ID0gREVGQVVMVF9NQVhfSU5UUkFfQklUUkFURV9QQ1Q7CisgIGdzdF92cHhfZW5jLT50aW1lYmFzZV9uID0gREVGQVVMVF9USU1FQkFTRV9OOworICBnc3RfdnB4X2VuYy0+dGltZWJhc2VfZCA9IERFRkFVTFRfVElNRUJBU0VfRDsKKworICBnc3RfdnB4X2VuYy0+Y2ZnLmdfcHJvZmlsZSA9IERFRkFVTFRfUFJPRklMRTsKKworICBnX211dGV4X2luaXQgKCZnc3RfdnB4X2VuYy0+ZW5jb2Rlcl9sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92cHhfZW5jX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RWUFhFbmMgKmdzdF92cHhfZW5jOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG9iamVjdCwgImZpbmFsaXplIik7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1ZQWF9FTkMgKG9iamVjdCkpOworICBnc3RfdnB4X2VuYyA9IEdTVF9WUFhfRU5DIChvYmplY3QpOworCisgIGdfZnJlZSAoZ3N0X3ZweF9lbmMtPm11bHRpcGFzc19jYWNoZV9wcmVmaXgpOworICBnX2ZyZWUgKGdzdF92cHhfZW5jLT5tdWx0aXBhc3NfY2FjaGVfZmlsZSk7CisgIGdzdF92cHhfZW5jLT5tdWx0aXBhc3NfY2FjaGVfaWR4ID0gMDsKKworCisgIGlmIChnc3RfdnB4X2VuYy0+aW5wdXRfc3RhdGUpCisgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChnc3RfdnB4X2VuYy0+aW5wdXRfc3RhdGUpOworCisgIGdfbXV0ZXhfY2xlYXIgKCZnc3RfdnB4X2VuYy0+ZW5jb2Rlcl9sb2NrKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnB4X2VuY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VlBYRW5jICpnc3RfdnB4X2VuYzsKKyAgZ2Jvb2xlYW4gZ2xvYmFsID0gRkFMU0U7CisgIHZweF9jb2RlY19lcnJfdCBzdGF0dXM7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1ZQWF9FTkMgKG9iamVjdCkpOworICBnc3RfdnB4X2VuYyA9IEdTVF9WUFhfRU5DIChvYmplY3QpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG9iamVjdCwgImdzdF92cHhfZW5jX3NldF9wcm9wZXJ0eSIpOworICBnX211dGV4X2xvY2sgKCZnc3RfdnB4X2VuYy0+ZW5jb2Rlcl9sb2NrKTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1JDX0VORF9VU0FHRToKKyAgICAgIGdzdF92cHhfZW5jLT5jZmcucmNfZW5kX3VzYWdlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgZ2xvYmFsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SQ19UQVJHRVRfQklUUkFURToKKyAgICAgIGdzdF92cHhfZW5jLT5jZmcucmNfdGFyZ2V0X2JpdHJhdGUgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKSAvIDEwMDA7CisgICAgICBnc3RfdnB4X2VuYy0+cmNfdGFyZ2V0X2JpdHJhdGVfc2V0ID0gVFJVRTsKKyAgICAgIGdsb2JhbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfTUlOX1FVQU5USVpFUjoKKyAgICAgIGdzdF92cHhfZW5jLT5jZmcucmNfbWluX3F1YW50aXplciA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgZ2xvYmFsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SQ19NQVhfUVVBTlRJWkVSOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy5yY19tYXhfcXVhbnRpemVyID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnbG9iYWwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JDX0RST1BGUkFNRV9USFJFU0g6CisgICAgICBnc3RfdnB4X2VuYy0+Y2ZnLnJjX2Ryb3BmcmFtZV90aHJlc2ggPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdsb2JhbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfUkVTSVpFX0FMTE9XRUQ6CisgICAgICBnc3RfdnB4X2VuYy0+Y2ZnLnJjX3Jlc2l6ZV9hbGxvd2VkID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgZ2xvYmFsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SQ19SRVNJWkVfVVBfVEhSRVNIOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy5yY19yZXNpemVfdXBfdGhyZXNoID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnbG9iYWwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JDX1JFU0laRV9ET1dOX1RIUkVTSDoKKyAgICAgIGdzdF92cHhfZW5jLT5jZmcucmNfcmVzaXplX2Rvd25fdGhyZXNoID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnbG9iYWwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JDX1VOREVSU0hPT1RfUENUOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy5yY191bmRlcnNob290X3BjdCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgZ2xvYmFsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SQ19PVkVSU0hPT1RfUENUOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy5yY19vdmVyc2hvb3RfcGN0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnbG9iYWwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JDX0JVRl9TWjoKKyAgICAgIGdzdF92cHhfZW5jLT5jZmcucmNfYnVmX3N6ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnbG9iYWwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JDX0JVRl9JTklUSUFMX1NaOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy5yY19idWZfaW5pdGlhbF9zeiA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgZ2xvYmFsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SQ19CVUZfT1BUSU1BTF9TWjoKKyAgICAgIGdzdF92cHhfZW5jLT5jZmcucmNfYnVmX29wdGltYWxfc3ogPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdsb2JhbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfMlBBU1NfVkJSX0JJQVNfUENUOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy5yY18ycGFzc192YnJfYmlhc19wY3QgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdsb2JhbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfMlBBU1NfVkJSX01JTlNFQ1RJT05fUENUOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy5yY18ycGFzc192YnJfbWluc2VjdGlvbl9wY3QgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdsb2JhbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfMlBBU1NfVkJSX01BWFNFQ1RJT05fUENUOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy5yY18ycGFzc192YnJfbWF4c2VjdGlvbl9wY3QgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdsb2JhbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfS0ZfTU9ERToKKyAgICAgIGdzdF92cHhfZW5jLT5jZmcua2ZfbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGdsb2JhbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfS0ZfTUFYX0RJU1Q6CisgICAgICBnc3RfdnB4X2VuYy0+Y2ZnLmtmX21heF9kaXN0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnbG9iYWwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01VTFRJUEFTU19NT0RFOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy5nX3Bhc3MgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBnbG9iYWwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01VTFRJUEFTU19DQUNIRV9GSUxFOgorICAgICAgaWYgKGdzdF92cHhfZW5jLT5tdWx0aXBhc3NfY2FjaGVfcHJlZml4KQorICAgICAgICBnX2ZyZWUgKGdzdF92cHhfZW5jLT5tdWx0aXBhc3NfY2FjaGVfcHJlZml4KTsKKyAgICAgIGdzdF92cHhfZW5jLT5tdWx0aXBhc3NfY2FjaGVfcHJlZml4ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVFNfTlVNQkVSX0xBWUVSUzoKKyAgICAgIGdzdF92cHhfZW5jLT5jZmcudHNfbnVtYmVyX2xheWVycyA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgZ2xvYmFsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UU19UQVJHRVRfQklUUkFURTp7CisgICAgICBHVmFsdWVBcnJheSAqdmEgPSBnX3ZhbHVlX2dldF9ib3hlZCAodmFsdWUpOworCisgICAgICBtZW1zZXQgKCZnc3RfdnB4X2VuYy0+Y2ZnLnRzX3RhcmdldF9iaXRyYXRlLCAwLAorICAgICAgICAgIHNpemVvZiAoZ3N0X3ZweF9lbmMtPmNmZy50c190YXJnZXRfYml0cmF0ZSkpOworICAgICAgaWYgKHZhID09IE5VTEwpIHsKKyAgICAgICAgZ3N0X3ZweF9lbmMtPm5fdHNfdGFyZ2V0X2JpdHJhdGUgPSAwOworICAgICAgfSBlbHNlIGlmICh2YS0+bl92YWx1ZXMgPiBWUFhfVFNfTUFYX0xBWUVSUykgeworICAgICAgICBnX3dhcm5pbmcgKCIlczogT25seSAlZCBsYXllcnMgYWxsb3dlZCBhdCBtYXhpbXVtIiwKKyAgICAgICAgICAgIEdTVF9FTEVNRU5UX05BTUUgKGdzdF92cHhfZW5jKSwgVlBYX1RTX01BWF9MQVlFUlMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2ludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2YS0+bl92YWx1ZXM7IGkrKykKKyAgICAgICAgICBnc3RfdnB4X2VuYy0+Y2ZnLnRzX3RhcmdldF9iaXRyYXRlW2ldID0KKyAgICAgICAgICAgICAgZ192YWx1ZV9nZXRfaW50IChnX3ZhbHVlX2FycmF5X2dldF9udGggKHZhLCBpKSk7CisgICAgICAgIGdzdF92cHhfZW5jLT5uX3RzX3RhcmdldF9iaXRyYXRlID0gdmEtPm5fdmFsdWVzOworICAgICAgfQorICAgICAgZ2xvYmFsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfVFNfUkFURV9ERUNJTUFUT1I6eworICAgICAgR1ZhbHVlQXJyYXkgKnZhID0gZ192YWx1ZV9nZXRfYm94ZWQgKHZhbHVlKTsKKworICAgICAgbWVtc2V0ICgmZ3N0X3ZweF9lbmMtPmNmZy50c19yYXRlX2RlY2ltYXRvciwgMCwKKyAgICAgICAgICBzaXplb2YgKGdzdF92cHhfZW5jLT5jZmcudHNfcmF0ZV9kZWNpbWF0b3IpKTsKKyAgICAgIGlmICh2YSA9PSBOVUxMKSB7CisgICAgICAgIGdzdF92cHhfZW5jLT5uX3RzX3JhdGVfZGVjaW1hdG9yID0gMDsKKyAgICAgIH0gZWxzZSBpZiAodmEtPm5fdmFsdWVzID4gVlBYX1RTX01BWF9MQVlFUlMpIHsKKyAgICAgICAgZ193YXJuaW5nICgiJXM6IE9ubHkgJWQgbGF5ZXJzIGFsbG93ZWQgYXQgbWF4aW11bSIsCisgICAgICAgICAgICBHU1RfRUxFTUVOVF9OQU1FIChnc3RfdnB4X2VuYyksIFZQWF9UU19NQVhfTEFZRVJTKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmEtPm5fdmFsdWVzOyBpKyspCisgICAgICAgICAgZ3N0X3ZweF9lbmMtPmNmZy50c19yYXRlX2RlY2ltYXRvcltpXSA9CisgICAgICAgICAgICAgIGdfdmFsdWVfZ2V0X2ludCAoZ192YWx1ZV9hcnJheV9nZXRfbnRoICh2YSwgaSkpOworICAgICAgICBnc3RfdnB4X2VuYy0+bl90c19yYXRlX2RlY2ltYXRvciA9IHZhLT5uX3ZhbHVlczsKKyAgICAgIH0KKyAgICAgIGdsb2JhbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX1RTX1BFUklPRElDSVRZOgorICAgICAgZ3N0X3ZweF9lbmMtPmNmZy50c19wZXJpb2RpY2l0eSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgZ2xvYmFsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UU19MQVlFUl9JRDp7CisgICAgICBHVmFsdWVBcnJheSAqdmEgPSBnX3ZhbHVlX2dldF9ib3hlZCAodmFsdWUpOworCisgICAgICBtZW1zZXQgKCZnc3RfdnB4X2VuYy0+Y2ZnLnRzX2xheWVyX2lkLCAwLAorICAgICAgICAgIHNpemVvZiAoZ3N0X3ZweF9lbmMtPmNmZy50c19sYXllcl9pZCkpOworICAgICAgaWYgKHZhICYmIHZhLT5uX3ZhbHVlcyA+IFZQWF9UU19NQVhfUEVSSU9ESUNJVFkpIHsKKyAgICAgICAgZ193YXJuaW5nICgiJXM6IE9ubHkgJWQgc2l6ZWQgbGF5ZXIgc2VxdWVuY2VzIGFsbG93ZWQgYXQgbWF4aW11bSIsCisgICAgICAgICAgICBHU1RfRUxFTUVOVF9OQU1FIChnc3RfdnB4X2VuYyksIFZQWF9UU19NQVhfUEVSSU9ESUNJVFkpOworICAgICAgfSBlbHNlIGlmICh2YSkgeworICAgICAgICBnaW50IGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHZhLT5uX3ZhbHVlczsgaSsrKQorICAgICAgICAgIGdzdF92cHhfZW5jLT5jZmcudHNfbGF5ZXJfaWRbaV0gPQorICAgICAgICAgICAgICBnX3ZhbHVlX2dldF9pbnQgKGdfdmFsdWVfYXJyYXlfZ2V0X250aCAodmEsIGkpKTsKKyAgICAgICAgZ3N0X3ZweF9lbmMtPm5fdHNfbGF5ZXJfaWQgPSB2YS0+bl92YWx1ZXM7CisgICAgICB9IGVsc2UgeworICAgICAgICBnc3RfdnB4X2VuYy0+bl90c19sYXllcl9pZCA9IDA7CisgICAgICB9CisgICAgICBnbG9iYWwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9FUlJPUl9SRVNJTElFTlQ6CisgICAgICBnc3RfdnB4X2VuYy0+Y2ZnLmdfZXJyb3JfcmVzaWxpZW50ID0gZ192YWx1ZV9nZXRfZmxhZ3MgKHZhbHVlKTsKKyAgICAgIGdsb2JhbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTEFHX0lOX0ZSQU1FUzoKKyAgICAgIGdzdF92cHhfZW5jLT5jZmcuZ19sYWdfaW5fZnJhbWVzID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnbG9iYWwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUkVBRFM6CisgICAgICBnc3RfdnB4X2VuYy0+Y2ZnLmdfdGhyZWFkcyA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgZ2xvYmFsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERUFETElORToKKyAgICAgIGdzdF92cHhfZW5jLT5kZWFkbGluZSA9IGdfdmFsdWVfZ2V0X2ludDY0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSF9TQ0FMSU5HX01PREU6CisgICAgICBnc3RfdnB4X2VuYy0+aF9zY2FsaW5nX21vZGUgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBpZiAoZ3N0X3ZweF9lbmMtPmluaXRlZCkgeworICAgICAgICB2cHhfc2NhbGluZ19tb2RlX3Qgc207CisKKyAgICAgICAgc20uaF9zY2FsaW5nX21vZGUgPSBnc3RfdnB4X2VuYy0+aF9zY2FsaW5nX21vZGU7CisgICAgICAgIHNtLnZfc2NhbGluZ19tb2RlID0gZ3N0X3ZweF9lbmMtPnZfc2NhbGluZ19tb2RlOworCisgICAgICAgIHN0YXR1cyA9CisgICAgICAgICAgICB2cHhfY29kZWNfY29udHJvbCAoJmdzdF92cHhfZW5jLT5lbmNvZGVyLCBWUDhFX1NFVF9TQ0FMRU1PREUsICZzbSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChnc3RfdnB4X2VuYywKKyAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfU0NBTEVNT0RFOiAlcyIsCisgICAgICAgICAgICAgIGdzdF92cHhfZXJyb3JfbmFtZSAoc3RhdHVzKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9WX1NDQUxJTkdfTU9ERToKKyAgICAgIGdzdF92cHhfZW5jLT52X3NjYWxpbmdfbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGlmIChnc3RfdnB4X2VuYy0+aW5pdGVkKSB7CisgICAgICAgIHZweF9zY2FsaW5nX21vZGVfdCBzbTsKKworICAgICAgICBzbS5oX3NjYWxpbmdfbW9kZSA9IGdzdF92cHhfZW5jLT5oX3NjYWxpbmdfbW9kZTsKKyAgICAgICAgc20udl9zY2FsaW5nX21vZGUgPSBnc3RfdnB4X2VuYy0+dl9zY2FsaW5nX21vZGU7CisKKyAgICAgICAgc3RhdHVzID0KKyAgICAgICAgICAgIHZweF9jb2RlY19jb250cm9sICgmZ3N0X3ZweF9lbmMtPmVuY29kZXIsIFZQOEVfU0VUX1NDQUxFTU9ERSwgJnNtKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGdzdF92cHhfZW5jLAorICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBWUDhFX1NFVF9TQ0FMRU1PREU6ICVzIiwKKyAgICAgICAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NQVV9VU0VEOgorICAgICAgZ3N0X3ZweF9lbmMtPmNwdV91c2VkID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBpZiAoZ3N0X3ZweF9lbmMtPmluaXRlZCkgeworICAgICAgICBzdGF0dXMgPQorICAgICAgICAgICAgdnB4X2NvZGVjX2NvbnRyb2wgKCZnc3RfdnB4X2VuYy0+ZW5jb2RlciwgVlA4RV9TRVRfQ1BVVVNFRCwKKyAgICAgICAgICAgIGdzdF92cHhfZW5jLT5jcHVfdXNlZCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChnc3RfdnB4X2VuYywgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfQ1BVVVNFRDogJXMiLAorICAgICAgICAgICAgICBnc3RfdnB4X2Vycm9yX25hbWUgKHN0YXR1cykpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRU5BQkxFX0FVVE9fQUxUX1JFRjoKKyAgICAgIGdzdF92cHhfZW5jLT5lbmFibGVfYXV0b19hbHRfcmVmID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgaWYgKGdzdF92cHhfZW5jLT5pbml0ZWQpIHsKKyAgICAgICAgc3RhdHVzID0KKyAgICAgICAgICAgIHZweF9jb2RlY19jb250cm9sICgmZ3N0X3ZweF9lbmMtPmVuY29kZXIsIFZQOEVfU0VUX0VOQUJMRUFVVE9BTFRSRUYsCisgICAgICAgICAgICAoZ3N0X3ZweF9lbmMtPmVuYWJsZV9hdXRvX2FsdF9yZWYgPyAxIDogMCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZ3N0X3ZweF9lbmMsCisgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IFZQOEVfU0VUX0VOQUJMRUFVVE9BTFRSRUY6ICVzIiwKKyAgICAgICAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05PSVNFX1NFTlNJVElWSVRZOgorICAgICAgZ3N0X3ZweF9lbmMtPm5vaXNlX3NlbnNpdGl2aXR5ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBpZiAoZ3N0X3ZweF9lbmMtPmluaXRlZCkgeworICAgICAgICBzdGF0dXMgPQorICAgICAgICAgICAgdnB4X2NvZGVjX2NvbnRyb2wgKCZnc3RfdnB4X2VuYy0+ZW5jb2RlciwKKyAgICAgICAgICAgIFZQOEVfU0VUX05PSVNFX1NFTlNJVElWSVRZLCBnc3RfdnB4X2VuYy0+bm9pc2Vfc2Vuc2l0aXZpdHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZ3N0X3ZweF9lbmMsCisgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IFZQOEVfU0VUX05PSVNFX1NFTlNJVElWSVRZOiAlcyIsCisgICAgICAgICAgICAgIGdzdF92cHhfZXJyb3JfbmFtZSAoc3RhdHVzKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TSEFSUE5FU1M6CisgICAgICBnc3RfdnB4X2VuYy0+c2hhcnBuZXNzID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBpZiAoZ3N0X3ZweF9lbmMtPmluaXRlZCkgeworICAgICAgICBzdGF0dXMgPSB2cHhfY29kZWNfY29udHJvbCAoJmdzdF92cHhfZW5jLT5lbmNvZGVyLCBWUDhFX1NFVF9TSEFSUE5FU1MsCisgICAgICAgICAgICBnc3RfdnB4X2VuYy0+c2hhcnBuZXNzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGdzdF92cHhfZW5jLAorICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBWUDhFX1NFVF9TSEFSUE5FU1M6ICVzIiwKKyAgICAgICAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUQVRJQ19USFJFU0hPTEQ6CisgICAgICBnc3RfdnB4X2VuYy0+c3RhdGljX3RocmVzaG9sZCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgaWYgKGdzdF92cHhfZW5jLT5pbml0ZWQpIHsKKyAgICAgICAgc3RhdHVzID0KKyAgICAgICAgICAgIHZweF9jb2RlY19jb250cm9sICgmZ3N0X3ZweF9lbmMtPmVuY29kZXIsIFZQOEVfU0VUX1NUQVRJQ19USFJFU0hPTEQsCisgICAgICAgICAgICBnc3RfdnB4X2VuYy0+c3RhdGljX3RocmVzaG9sZCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChnc3RfdnB4X2VuYywKKyAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRDogJXMiLAorICAgICAgICAgICAgICBnc3RfdnB4X2Vycm9yX25hbWUgKHN0YXR1cykpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVE9LRU5fUEFSVElUSU9OUzoKKyAgICAgIGdzdF92cHhfZW5jLT50b2tlbl9wYXJ0aXRpb25zID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgaWYgKGdzdF92cHhfZW5jLT5pbml0ZWQpIHsKKyAgICAgICAgc3RhdHVzID0KKyAgICAgICAgICAgIHZweF9jb2RlY19jb250cm9sICgmZ3N0X3ZweF9lbmMtPmVuY29kZXIsIFZQOEVfU0VUX1RPS0VOX1BBUlRJVElPTlMsCisgICAgICAgICAgICBnc3RfdnB4X2VuYy0+dG9rZW5fcGFydGl0aW9ucyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChnc3RfdnB4X2VuYywKKyAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfVE9LRU5fUEFSVElPTlM6ICVzIiwKKyAgICAgICAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FSTlJfTUFYRlJBTUVTOgorICAgICAgZ3N0X3ZweF9lbmMtPmFybnJfbWF4ZnJhbWVzID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBpZiAoZ3N0X3ZweF9lbmMtPmluaXRlZCkgeworICAgICAgICBzdGF0dXMgPQorICAgICAgICAgICAgdnB4X2NvZGVjX2NvbnRyb2wgKCZnc3RfdnB4X2VuYy0+ZW5jb2RlciwgVlA4RV9TRVRfQVJOUl9NQVhGUkFNRVMsCisgICAgICAgICAgICBnc3RfdnB4X2VuYy0+YXJucl9tYXhmcmFtZXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZ3N0X3ZweF9lbmMsCisgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IFZQOEVfU0VUX0FSTlJfTUFYRlJBTUVTOiAlcyIsCisgICAgICAgICAgICAgIGdzdF92cHhfZXJyb3JfbmFtZSAoc3RhdHVzKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BUk5SX1NUUkVOR1RIOgorICAgICAgZ3N0X3ZweF9lbmMtPmFybnJfc3RyZW5ndGggPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGlmIChnc3RfdnB4X2VuYy0+aW5pdGVkKSB7CisgICAgICAgIHN0YXR1cyA9CisgICAgICAgICAgICB2cHhfY29kZWNfY29udHJvbCAoJmdzdF92cHhfZW5jLT5lbmNvZGVyLCBWUDhFX1NFVF9BUk5SX1NUUkVOR1RILAorICAgICAgICAgICAgZ3N0X3ZweF9lbmMtPmFybnJfc3RyZW5ndGgpOworICAgICAgICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZ3N0X3ZweF9lbmMsCisgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IFZQOEVfU0VUX0FSTlJfU1RSRU5HVEg6ICVzIiwKKyAgICAgICAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FSTlJfVFlQRToKKyAgICAgIGdzdF92cHhfZW5jLT5hcm5yX3R5cGUgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdfd2FybmluZyAoImFybnItdHlwZSBpcyBhIG5vLW9wIHNpbmNlIGNvbnRyb2wgaGFzIGJlZW4gZGVwcmVjYXRlZCAiCisgICAgICAgICAgImluIGxpYnZweCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RVTklORzoKKyAgICAgIGdzdF92cHhfZW5jLT50dW5pbmcgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBpZiAoZ3N0X3ZweF9lbmMtPmluaXRlZCkgeworICAgICAgICBzdGF0dXMgPSB2cHhfY29kZWNfY29udHJvbCAoJmdzdF92cHhfZW5jLT5lbmNvZGVyLCBWUDhFX1NFVF9UVU5JTkcsCisgICAgICAgICAgICBnc3RfdnB4X2VuYy0+dHVuaW5nKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGdzdF92cHhfZW5jLAorICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBWUDhFX1NFVF9UVU5JTkc6ICVzIiwgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NRX0xFVkVMOgorICAgICAgZ3N0X3ZweF9lbmMtPmNxX2xldmVsID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBpZiAoZ3N0X3ZweF9lbmMtPmluaXRlZCkgeworICAgICAgICBzdGF0dXMgPSB2cHhfY29kZWNfY29udHJvbCAoJmdzdF92cHhfZW5jLT5lbmNvZGVyLCBWUDhFX1NFVF9DUV9MRVZFTCwKKyAgICAgICAgICAgIGdzdF92cHhfZW5jLT5jcV9sZXZlbCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChnc3RfdnB4X2VuYywKKyAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfQ1FfTEVWRUw6ICVzIiwKKyAgICAgICAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9JTlRSQV9CSVRSQVRFX1BDVDoKKyAgICAgIGdzdF92cHhfZW5jLT5tYXhfaW50cmFfYml0cmF0ZV9wY3QgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGlmIChnc3RfdnB4X2VuYy0+aW5pdGVkKSB7CisgICAgICAgIHN0YXR1cyA9CisgICAgICAgICAgICB2cHhfY29kZWNfY29udHJvbCAoJmdzdF92cHhfZW5jLT5lbmNvZGVyLAorICAgICAgICAgICAgVlA4RV9TRVRfTUFYX0lOVFJBX0JJVFJBVEVfUENULCBnc3RfdnB4X2VuYy0+bWF4X2ludHJhX2JpdHJhdGVfcGN0KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGdzdF92cHhfZW5jLAorICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBWUDhFX1NFVF9NQVhfSU5UUkFfQklUUkFURV9QQ1Q6ICVzIiwKKyAgICAgICAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RJTUVCQVNFOgorICAgICAgZ3N0X3ZweF9lbmMtPnRpbWViYXNlX24gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAodmFsdWUpOworICAgICAgZ3N0X3ZweF9lbmMtPnRpbWViYXNlX2QgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoZ2xvYmFsICYmZ3N0X3ZweF9lbmMtPmluaXRlZCkgeworICAgIHN0YXR1cyA9CisgICAgICAgIHZweF9jb2RlY19lbmNfY29uZmlnX3NldCAoJmdzdF92cHhfZW5jLT5lbmNvZGVyLCAmZ3N0X3ZweF9lbmMtPmNmZyk7CisgICAgaWYgKHN0YXR1cyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmZ3N0X3ZweF9lbmMtPmVuY29kZXJfbG9jayk7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZ3N0X3ZweF9lbmMsIExJQlJBUlksIElOSVQsCisgICAgICAgICAgKCJGYWlsZWQgdG8gc2V0IGVuY29kZXIgY29uZmlndXJhdGlvbiIpLCAoIiVzIiwKKyAgICAgICAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmZ3N0X3ZweF9lbmMtPmVuY29kZXJfbG9jayk7CisgICAgfQorICB9IGVsc2UgeworICAgIGdfbXV0ZXhfdW5sb2NrICgmZ3N0X3ZweF9lbmMtPmVuY29kZXJfbG9jayk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92cHhfZW5jX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWUFhFbmMgKmdzdF92cHhfZW5jOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19WUFhfRU5DIChvYmplY3QpKTsKKyAgZ3N0X3ZweF9lbmMgPSBHU1RfVlBYX0VOQyAob2JqZWN0KTsKKworICBnX211dGV4X2xvY2sgKCZnc3RfdnB4X2VuYy0+ZW5jb2Rlcl9sb2NrKTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1JDX0VORF9VU0FHRToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBnc3RfdnB4X2VuYy0+Y2ZnLnJjX2VuZF91c2FnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfVEFSR0VUX0JJVFJBVEU6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBnc3RfdnB4X2VuYy0+Y2ZnLnJjX3RhcmdldF9iaXRyYXRlICogMTAwMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfTUlOX1FVQU5USVpFUjoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcucmNfbWluX3F1YW50aXplcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfTUFYX1FVQU5USVpFUjoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcucmNfbWF4X3F1YW50aXplcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfRFJPUEZSQU1FX1RIUkVTSDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcucmNfZHJvcGZyYW1lX3RocmVzaCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfUkVTSVpFX0FMTE9XRUQ6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmNmZy5yY19yZXNpemVfYWxsb3dlZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfUkVTSVpFX1VQX1RIUkVTSDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcucmNfcmVzaXplX3VwX3RocmVzaCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfUkVTSVpFX0RPV05fVEhSRVNIOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmNmZy5yY19yZXNpemVfZG93bl90aHJlc2gpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JDX1VOREVSU0hPT1RfUENUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmNmZy5yY191bmRlcnNob290X3BjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfT1ZFUlNIT09UX1BDVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcucmNfb3ZlcnNob290X3BjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfQlVGX1NaOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmNmZy5yY19idWZfc3opOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JDX0JVRl9JTklUSUFMX1NaOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmNmZy5yY19idWZfaW5pdGlhbF9zeik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfQlVGX09QVElNQUxfU1o6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBnc3RfdnB4X2VuYy0+Y2ZnLnJjX2J1Zl9vcHRpbWFsX3N6KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SQ18yUEFTU19WQlJfQklBU19QQ1Q6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBnc3RfdnB4X2VuYy0+Y2ZnLnJjXzJwYXNzX3Zicl9iaWFzX3BjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkNfMlBBU1NfVkJSX01JTlNFQ1RJT05fUENUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmNmZy5yY18ycGFzc192YnJfbWluc2VjdGlvbl9wY3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JDXzJQQVNTX1ZCUl9NQVhTRUNUSU9OX1BDVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcucmNfMnBhc3NfdmJyX21heHNlY3Rpb25fcGN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9LRl9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcua2ZfbW9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfS0ZfTUFYX0RJU1Q6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBnc3RfdnB4X2VuYy0+Y2ZnLmtmX21heF9kaXN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NVUxUSVBBU1NfTU9ERToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBnc3RfdnB4X2VuYy0+Y2ZnLmdfcGFzcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTVVMVElQQVNTX0NBQ0hFX0ZJTEU6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBnc3RfdnB4X2VuYy0+bXVsdGlwYXNzX2NhY2hlX3ByZWZpeCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVFNfTlVNQkVSX0xBWUVSUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcudHNfbnVtYmVyX2xheWVycyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVFNfVEFSR0VUX0JJVFJBVEU6eworICAgICAgR1ZhbHVlQXJyYXkgKnZhOworCisgICAgICBpZiAoZ3N0X3ZweF9lbmMtPm5fdHNfdGFyZ2V0X2JpdHJhdGUgPT0gMCkgeworICAgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIE5VTEwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2ludCBpOworCisgICAgICAgIHZhID0gZ192YWx1ZV9hcnJheV9uZXcgKGdzdF92cHhfZW5jLT5uX3RzX3RhcmdldF9iaXRyYXRlKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGdzdF92cHhfZW5jLT5uX3RzX3RhcmdldF9iaXRyYXRlOyBpKyspIHsKKyAgICAgICAgICBHVmFsdWUgdiA9IHsgMCwgfTsKKworICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnYsIEdfVFlQRV9JTlQpOworICAgICAgICAgIGdfdmFsdWVfc2V0X2ludCAoJnYsIGdzdF92cHhfZW5jLT5jZmcudHNfdGFyZ2V0X2JpdHJhdGVbaV0pOworICAgICAgICAgIGdfdmFsdWVfYXJyYXlfYXBwZW5kICh2YSwgJnYpOworICAgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZ2KTsKKyAgICAgICAgfQorICAgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIHZhKTsKKyAgICAgICAgZ192YWx1ZV9hcnJheV9mcmVlICh2YSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX1RTX1JBVEVfREVDSU1BVE9SOnsKKyAgICAgIEdWYWx1ZUFycmF5ICp2YTsKKworICAgICAgaWYgKGdzdF92cHhfZW5jLT5uX3RzX3JhdGVfZGVjaW1hdG9yID09IDApIHsKKyAgICAgICAgZ192YWx1ZV9zZXRfYm94ZWQgKHZhbHVlLCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdpbnQgaTsKKworICAgICAgICB2YSA9IGdfdmFsdWVfYXJyYXlfbmV3IChnc3RfdnB4X2VuYy0+bl90c19yYXRlX2RlY2ltYXRvcik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBnc3RfdnB4X2VuYy0+bl90c19yYXRlX2RlY2ltYXRvcjsgaSsrKSB7CisgICAgICAgICAgR1ZhbHVlIHYgPSB7IDAsIH07CisKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZ2LCBHX1RZUEVfSU5UKTsKKyAgICAgICAgICBnX3ZhbHVlX3NldF9pbnQgKCZ2LCBnc3RfdnB4X2VuYy0+Y2ZnLnRzX3JhdGVfZGVjaW1hdG9yW2ldKTsKKyAgICAgICAgICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAodmEsICZ2KTsKKyAgICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisgICAgICAgIH0KKyAgICAgICAgZ192YWx1ZV9zZXRfYm94ZWQgKHZhbHVlLCB2YSk7CisgICAgICAgIGdfdmFsdWVfYXJyYXlfZnJlZSAodmEpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9UU19QRVJJT0RJQ0lUWToKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcudHNfcGVyaW9kaWNpdHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RTX0xBWUVSX0lEOnsKKyAgICAgIEdWYWx1ZUFycmF5ICp2YTsKKworICAgICAgaWYgKGdzdF92cHhfZW5jLT5uX3RzX2xheWVyX2lkID09IDApIHsKKyAgICAgICAgZ192YWx1ZV9zZXRfYm94ZWQgKHZhbHVlLCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdpbnQgaTsKKworICAgICAgICB2YSA9IGdfdmFsdWVfYXJyYXlfbmV3IChnc3RfdnB4X2VuYy0+bl90c19sYXllcl9pZCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBnc3RfdnB4X2VuYy0+bl90c19sYXllcl9pZDsgaSsrKSB7CisgICAgICAgICAgR1ZhbHVlIHYgPSB7IDAsIH07CisKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZ2LCBHX1RZUEVfSU5UKTsKKyAgICAgICAgICBnX3ZhbHVlX3NldF9pbnQgKCZ2LCBnc3RfdnB4X2VuYy0+Y2ZnLnRzX2xheWVyX2lkW2ldKTsKKyAgICAgICAgICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAodmEsICZ2KTsKKyAgICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisgICAgICAgIH0KKyAgICAgICAgZ192YWx1ZV9zZXRfYm94ZWQgKHZhbHVlLCB2YSk7CisgICAgICAgIGdfdmFsdWVfYXJyYXlfZnJlZSAodmEpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9FUlJPUl9SRVNJTElFTlQ6CisgICAgICBnX3ZhbHVlX3NldF9mbGFncyAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcuZ19lcnJvcl9yZXNpbGllbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xBR19JTl9GUkFNRVM6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBnc3RfdnB4X2VuYy0+Y2ZnLmdfbGFnX2luX2ZyYW1lcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSRUFEUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jZmcuZ190aHJlYWRzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERUFETElORToKKyAgICAgIGdfdmFsdWVfc2V0X2ludDY0ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmRlYWRsaW5lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9IX1NDQUxJTkdfTU9ERToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBnc3RfdnB4X2VuYy0+aF9zY2FsaW5nX21vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1ZfU0NBTElOR19NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGdzdF92cHhfZW5jLT52X3NjYWxpbmdfbW9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ1BVX1VTRUQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBnc3RfdnB4X2VuYy0+Y3B1X3VzZWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0VOQUJMRV9BVVRPX0FMVF9SRUY6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmVuYWJsZV9hdXRvX2FsdF9yZWYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05PSVNFX1NFTlNJVElWSVRZOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPm5vaXNlX3NlbnNpdGl2aXR5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TSEFSUE5FU1M6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBnc3RfdnB4X2VuYy0+c2hhcnBuZXNzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVEFUSUNfVEhSRVNIT0xEOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPnN0YXRpY190aHJlc2hvbGQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RPS0VOX1BBUlRJVElPTlM6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPnRva2VuX3BhcnRpdGlvbnMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FSTlJfTUFYRlJBTUVTOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmFybnJfbWF4ZnJhbWVzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BUk5SX1NUUkVOR1RIOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPmFybnJfc3RyZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FSTlJfVFlQRToKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5hcm5yX3R5cGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RVTklORzoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBnc3RfdnB4X2VuYy0+dHVuaW5nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DUV9MRVZFTDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGdzdF92cHhfZW5jLT5jcV9sZXZlbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX0lOVFJBX0JJVFJBVEVfUENUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPm1heF9pbnRyYV9iaXRyYXRlX3BjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVElNRUJBU0U6CisgICAgICBnc3RfdmFsdWVfc2V0X2ZyYWN0aW9uICh2YWx1ZSwgZ3N0X3ZweF9lbmMtPnRpbWViYXNlX24sCisgICAgICAgICAgZ3N0X3ZweF9lbmMtPnRpbWViYXNlX2QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorCisgIGdfbXV0ZXhfdW5sb2NrICgmZ3N0X3ZweF9lbmMtPmVuY29kZXJfbG9jayk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZweF9lbmNfc3RhcnQgKEdzdFZpZGVvRW5jb2RlciAqIHZpZGVvX2VuY29kZXIpCit7CisgIEdzdFZQWEVuYyAqZW5jb2RlciA9IEdTVF9WUFhfRU5DICh2aWRlb19lbmNvZGVyKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb19lbmNvZGVyLCAic3RhcnQiKTsKKworICBpZiAoIWVuY29kZXItPmhhdmVfZGVmYXVsdF9jb25maWcpIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZW5jb2RlciwgTElCUkFSWSwgSU5JVCwKKyAgICAgICAgKCJGYWlsZWQgdG8gZ2V0IGRlZmF1bHQgZW5jb2RlciBjb25maWd1cmF0aW9uIiksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdnB4X2VuY19kZXN0cm95X2VuY29kZXIgKEdzdFZQWEVuYyAqIGVuY29kZXIpCit7CisgIGdfbXV0ZXhfbG9jayAoJmVuY29kZXItPmVuY29kZXJfbG9jayk7CisgIGlmIChlbmNvZGVyLT5pbml0ZWQpIHsKKyAgICB2cHhfY29kZWNfZGVzdHJveSAoJmVuY29kZXItPmVuY29kZXIpOworICAgIGVuY29kZXItPmluaXRlZCA9IEZBTFNFOworICB9CisKKyAgaWYgKGVuY29kZXItPmZpcnN0X3Bhc3NfY2FjaGVfY29udGVudCkgeworICAgIGdfYnl0ZV9hcnJheV9mcmVlIChlbmNvZGVyLT5maXJzdF9wYXNzX2NhY2hlX2NvbnRlbnQsIFRSVUUpOworICAgIGVuY29kZXItPmZpcnN0X3Bhc3NfY2FjaGVfY29udGVudCA9IE5VTEw7CisgIH0KKworICBpZiAoZW5jb2Rlci0+Y2ZnLnJjX3R3b3Bhc3Nfc3RhdHNfaW4uYnVmKSB7CisgICAgZ19mcmVlIChlbmNvZGVyLT5jZmcucmNfdHdvcGFzc19zdGF0c19pbi5idWYpOworICAgIGVuY29kZXItPmNmZy5yY190d29wYXNzX3N0YXRzX2luLmJ1ZiA9IE5VTEw7CisgICAgZW5jb2Rlci0+Y2ZnLnJjX3R3b3Bhc3Nfc3RhdHNfaW4uc3ogPSAwOworICB9CisgIGdfbXV0ZXhfdW5sb2NrICgmZW5jb2Rlci0+ZW5jb2Rlcl9sb2NrKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdnB4X2VuY19zdG9wIChHc3RWaWRlb0VuY29kZXIgKiB2aWRlb19lbmNvZGVyKQoreworICBHc3RWUFhFbmMgKmVuY29kZXI7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodmlkZW9fZW5jb2RlciwgInN0b3AiKTsKKworICBlbmNvZGVyID0gR1NUX1ZQWF9FTkMgKHZpZGVvX2VuY29kZXIpOworCisgIGdzdF92cHhfZW5jX2Rlc3Ryb3lfZW5jb2RlciAoZW5jb2Rlcik7CisKKyAgZ3N0X3RhZ19zZXR0ZXJfcmVzZXRfdGFncyAoR1NUX1RBR19TRVRURVIgKGVuY29kZXIpKTsKKworICBnX2ZyZWUgKGVuY29kZXItPm11bHRpcGFzc19jYWNoZV9maWxlKTsKKyAgZW5jb2Rlci0+bXVsdGlwYXNzX2NhY2hlX2ZpbGUgPSBOVUxMOworICBlbmNvZGVyLT5tdWx0aXBhc3NfY2FjaGVfaWR4ID0gMDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdpbnQKK2dzdF92cHhfZW5jX2dldF9kb3duc3RyZWFtX3Byb2ZpbGUgKEdzdFZQWEVuYyAqIGVuY29kZXIpCit7CisgIEdzdENhcHMgKmFsbG93ZWQ7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgZ2ludCBwcm9maWxlID0gREVGQVVMVF9QUk9GSUxFOworCisgIGFsbG93ZWQgPSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKEdTVF9WSURFT19FTkNPREVSX1NSQ19QQUQgKGVuY29kZXIpKTsKKyAgaWYgKGFsbG93ZWQpIHsKKyAgICBhbGxvd2VkID0gZ3N0X2NhcHNfdHJ1bmNhdGUgKGFsbG93ZWQpOworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhbGxvd2VkLCAwKTsKKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHMsICJwcm9maWxlIikpIHsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqdiA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAicHJvZmlsZSIpOworICAgICAgY29uc3QgZ2NoYXIgKnByb2ZpbGVfc3RyID0gTlVMTDsKKworICAgICAgaWYgKEdTVF9WQUxVRV9IT0xEU19MSVNUICh2KSAmJiBnc3RfdmFsdWVfbGlzdF9nZXRfc2l6ZSAodikgPiAwKSB7CisgICAgICAgIHByb2ZpbGVfc3RyID0gZ192YWx1ZV9nZXRfc3RyaW5nIChnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKHYsIDApKTsKKyAgICAgIH0gZWxzZSBpZiAoR19WQUxVRV9IT0xEU19TVFJJTkcgKHYpKSB7CisgICAgICAgIHByb2ZpbGVfc3RyID0gZ192YWx1ZV9nZXRfc3RyaW5nICh2KTsKKyAgICAgIH0KKworICAgICAgaWYgKHByb2ZpbGVfc3RyKSB7CisgICAgICAgIGdjaGFyICplbmRwdHIgPSBOVUxMOworCisgICAgICAgIHByb2ZpbGUgPSBnX2FzY2lpX3N0cnRvdWxsIChwcm9maWxlX3N0ciwgJmVuZHB0ciwgMTApOworICAgICAgICBpZiAoKmVuZHB0ciAhPSAnXDAnIHx8IHByb2ZpbGUgPCAwIHx8IHByb2ZpbGUgPiAzKSB7CisgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoZW5jb2RlciwgIkludmFsaWQgcHJvZmlsZSAnJXMnIiwgcHJvZmlsZV9zdHIpOworICAgICAgICAgIHByb2ZpbGUgPSBERUZBVUxUX1BST0ZJTEU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZ3N0X2NhcHNfdW5yZWYgKGFsbG93ZWQpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZW5jb2RlciwgIlVzaW5nIHByb2ZpbGUgJWQiLCBwcm9maWxlKTsKKworICByZXR1cm4gcHJvZmlsZTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdnB4X2VuY19zZXRfZm9ybWF0IChHc3RWaWRlb0VuY29kZXIgKiB2aWRlb19lbmNvZGVyLAorICAgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqIHN0YXRlKQoreworICBHc3RWUFhFbmMgKmVuY29kZXI7CisgIHZweF9jb2RlY19lcnJfdCBzdGF0dXM7CisgIHZweF9pbWFnZV90ICppbWFnZTsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKyAgR3N0VmlkZW9JbmZvICppbmZvID0gJnN0YXRlLT5pbmZvOworICBHc3RWaWRlb0NvZGVjU3RhdGUgKm91dHB1dF9zdGF0ZTsKKyAgR3N0Q2xvY2tUaW1lIGxhdGVuY3k7CisgIEdzdFZQWEVuY0NsYXNzICp2cHhfZW5jX2NsYXNzOworCisgIGVuY29kZXIgPSBHU1RfVlBYX0VOQyAodmlkZW9fZW5jb2Rlcik7CisgIHZweF9lbmNfY2xhc3MgPSBHU1RfVlBYX0VOQ19HRVRfQ0xBU1MgKGVuY29kZXIpOworICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb19lbmNvZGVyLCAic2V0X2Zvcm1hdCIpOworCisgIGlmIChlbmNvZGVyLT5pbml0ZWQpIHsKKyAgICBnc3RfdnB4X2VuY19kcmFpbiAodmlkZW9fZW5jb2Rlcik7CisgICAgZ19tdXRleF9sb2NrICgmZW5jb2Rlci0+ZW5jb2Rlcl9sb2NrKTsKKyAgICB2cHhfY29kZWNfZGVzdHJveSAoJmVuY29kZXItPmVuY29kZXIpOworICAgIGVuY29kZXItPmluaXRlZCA9IEZBTFNFOworICAgIGVuY29kZXItPm11bHRpcGFzc19jYWNoZV9pZHgrKzsKKyAgfSBlbHNlIHsKKyAgICBnX211dGV4X2xvY2sgKCZlbmNvZGVyLT5lbmNvZGVyX2xvY2spOworICB9CisKKyAgZW5jb2Rlci0+Y2ZnLmdfcHJvZmlsZSA9IGdzdF92cHhfZW5jX2dldF9kb3duc3RyZWFtX3Byb2ZpbGUgKGVuY29kZXIpOworCisgIC8qIFNjYWxlIGRlZmF1bHQgYml0cmF0ZSB0byBvdXIgc2l6ZSAqLworICBpZiAoIWVuY29kZXItPnJjX3RhcmdldF9iaXRyYXRlX3NldCkKKyAgICBlbmNvZGVyLT5jZmcucmNfdGFyZ2V0X2JpdHJhdGUgPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKERFRkFVTFRfUkNfVEFSR0VUX0JJVFJBVEUsCisgICAgICAgIEdTVF9WSURFT19JTkZPX1dJRFRIIChpbmZvKSAqIEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5mbyksCisgICAgICAgIDMyMCAqIDI0MCAqIDEwMDApOworCisgIGVuY29kZXItPmNmZy5nX3cgPSBHU1RfVklERU9fSU5GT19XSURUSCAoaW5mbyk7CisgIGVuY29kZXItPmNmZy5nX2ggPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluZm8pOworCisgIGlmIChlbmNvZGVyLT50aW1lYmFzZV9uICE9IDAgJiYgZW5jb2Rlci0+dGltZWJhc2VfZCAhPSAwKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodmlkZW9fZW5jb2RlciwgIlVzaW5nIHRpbWViYXNlIGNvbmZpZ3VyYXRpb24iKTsKKyAgICBlbmNvZGVyLT5jZmcuZ190aW1lYmFzZS5udW0gPSBlbmNvZGVyLT50aW1lYmFzZV9uOworICAgIGVuY29kZXItPmNmZy5nX3RpbWViYXNlLmRlbiA9IGVuY29kZXItPnRpbWViYXNlX2Q7CisgIH0gZWxzZSB7CisgICAgLyogWmVybyBmcmFtZXJhdGUgYW5kIG1heC1mcmFtZXJhdGUgYnV0IHN0aWxsIG5lZWQgdG8gc2V0dXAgdGhlIHRpbWViYXNlIHRvIGF2b2lkCisgICAgICogYSBkaXZpZGUgYnkgemVybyBlcnJvci4gUHJlc3VtaW5nIHRoZSBsb3dlc3QgY29tbW9uIGRlbm9taW5hdG9yIHdpbGwgYmUgUlRQIC0KKyAgICAgKiBWUDggcGF5bG9hZCBkcmFmdCBzdGF0ZXMgY2xvY2sgcmF0ZSBvZiA5MDAwMCB3aGljaCBzaG91bGQgd29yayBmb3IgYW55b25lIHdoZXJlCisgICAgICogRlBTIDwgOTAwMDAgKHNob3VsZG4ndCBiZSB0b28gbWFueSBjYXNlcyB3aGVyZSBpdCdzIGhpZ2hlcikgdGhvdWdoIHdvdWxkbid0IGJlIG9wdGltYWwuIFJUUCBzcGVjaWZpY2F0aW9uCisgICAgICogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1wYXlsb2FkLXZwOC0wMSBzZWN0aW9uIDYuMy4xICovCisgICAgZW5jb2Rlci0+Y2ZnLmdfdGltZWJhc2UubnVtID0gMTsKKyAgICBlbmNvZGVyLT5jZmcuZ190aW1lYmFzZS5kZW4gPSA5MDAwMDsKKyAgfQorCisgIGlmIChlbmNvZGVyLT5jZmcuZ19wYXNzID09IFZQWF9SQ19GSVJTVF9QQVNTIHx8CisgICAgICBlbmNvZGVyLT5jZmcuZ19wYXNzID09IFZQWF9SQ19MQVNUX1BBU1MpIHsKKyAgICBpZiAoIWVuY29kZXItPm11bHRpcGFzc19jYWNoZV9wcmVmaXgpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChlbmNvZGVyLCBSRVNPVVJDRSwgT1BFTl9SRUFELAorICAgICAgICAgICgiTm8gbXVsdGlwYXNzIGNhY2hlIGZpbGUgcHJvdmlkZWQiKSwgKE5VTEwpKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmZW5jb2Rlci0+ZW5jb2Rlcl9sb2NrKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBnX2ZyZWUgKGVuY29kZXItPm11bHRpcGFzc19jYWNoZV9maWxlKTsKKworICAgIGlmIChlbmNvZGVyLT5tdWx0aXBhc3NfY2FjaGVfaWR4ID4gMCkKKyAgICAgIGVuY29kZXItPm11bHRpcGFzc19jYWNoZV9maWxlID0gZ19zdHJkdXBfcHJpbnRmICgiJXMuJXUiLAorICAgICAgICAgIGVuY29kZXItPm11bHRpcGFzc19jYWNoZV9wcmVmaXgsIGVuY29kZXItPm11bHRpcGFzc19jYWNoZV9pZHgpOworICAgIGVsc2UKKyAgICAgIGVuY29kZXItPm11bHRpcGFzc19jYWNoZV9maWxlID0KKyAgICAgICAgICBnX3N0cmR1cCAoZW5jb2Rlci0+bXVsdGlwYXNzX2NhY2hlX3ByZWZpeCk7CisgIH0KKworICBpZiAoZW5jb2Rlci0+Y2ZnLmdfcGFzcyA9PSBWUFhfUkNfRklSU1RfUEFTUykgeworICAgIGlmIChlbmNvZGVyLT5maXJzdF9wYXNzX2NhY2hlX2NvbnRlbnQgIT0gTlVMTCkKKyAgICAgIGdfYnl0ZV9hcnJheV9mcmVlIChlbmNvZGVyLT5maXJzdF9wYXNzX2NhY2hlX2NvbnRlbnQsIFRSVUUpOworCisgICAgZW5jb2Rlci0+Zmlyc3RfcGFzc19jYWNoZV9jb250ZW50ID0gZ19ieXRlX2FycmF5X3NpemVkX25ldyAoNDA5Nik7CisKKyAgfSBlbHNlIGlmIChlbmNvZGVyLT5jZmcuZ19wYXNzID09IFZQWF9SQ19MQVNUX1BBU1MpIHsKKyAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICBpZiAoZW5jb2Rlci0+Y2ZnLnJjX3R3b3Bhc3Nfc3RhdHNfaW4uYnVmICE9IE5VTEwpIHsKKyAgICAgIGdfZnJlZSAoZW5jb2Rlci0+Y2ZnLnJjX3R3b3Bhc3Nfc3RhdHNfaW4uYnVmKTsKKyAgICAgIGVuY29kZXItPmNmZy5yY190d29wYXNzX3N0YXRzX2luLmJ1ZiA9IE5VTEw7CisgICAgICBlbmNvZGVyLT5jZmcucmNfdHdvcGFzc19zdGF0c19pbi5zeiA9IDA7CisgICAgfQorCisgICAgaWYgKCFnX2ZpbGVfZ2V0X2NvbnRlbnRzIChlbmNvZGVyLT5tdWx0aXBhc3NfY2FjaGVfZmlsZSwKKyAgICAgICAgICAgIChnY2hhciAqKikgJiBlbmNvZGVyLT5jZmcucmNfdHdvcGFzc19zdGF0c19pbi5idWYsCisgICAgICAgICAgICAmZW5jb2Rlci0+Y2ZnLnJjX3R3b3Bhc3Nfc3RhdHNfaW4uc3osICZlcnIpKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZW5jb2RlciwgUkVTT1VSQ0UsIE9QRU5fUkVBRCwKKyAgICAgICAgICAoIkZhaWxlZCB0byByZWFkIG11bHRpcGFzcyBjYWNoZSBmaWxlIHByb3ZpZGVkIiksICgiJXMiLAorICAgICAgICAgICAgICBlcnItPm1lc3NhZ2UpKTsKKyAgICAgIGdfZXJyb3JfZnJlZSAoZXJyKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmZW5jb2Rlci0+ZW5jb2Rlcl9sb2NrKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKworICBzdGF0dXMgPQorICAgICAgdnB4X2NvZGVjX2VuY19pbml0ICgmZW5jb2Rlci0+ZW5jb2RlciwgdnB4X2VuY19jbGFzcy0+Z2V0X2FsZ28gKGVuY29kZXIpLAorICAgICAgJmVuY29kZXItPmNmZywgMCk7CisgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGVuY29kZXIsIExJQlJBUlksIElOSVQsCisgICAgICAgICgiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciIpLCAoIiVzIiwgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKSk7CisgICAgZ19tdXRleF91bmxvY2sgKCZlbmNvZGVyLT5lbmNvZGVyX2xvY2spOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICh2cHhfZW5jX2NsYXNzLT5lbmFibGVfc2NhbGluZyAoZW5jb2RlcikpIHsKKyAgICB2cHhfc2NhbGluZ19tb2RlX3Qgc207CisKKyAgICBzbS5oX3NjYWxpbmdfbW9kZSA9IGVuY29kZXItPmhfc2NhbGluZ19tb2RlOworICAgIHNtLnZfc2NhbGluZ19tb2RlID0gZW5jb2Rlci0+dl9zY2FsaW5nX21vZGU7CisKKyAgICBzdGF0dXMgPSB2cHhfY29kZWNfY29udHJvbCAoJmVuY29kZXItPmVuY29kZXIsIFZQOEVfU0VUX1NDQUxFTU9ERSwgJnNtKTsKKyAgICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmNvZGVyLCAiRmFpbGVkIHRvIHNldCBWUDhFX1NFVF9TQ0FMRU1PREU6ICVzIiwKKyAgICAgICAgICBnc3RfdnB4X2Vycm9yX25hbWUgKHN0YXR1cykpOworICAgIH0KKyAgfQorCisgIHN0YXR1cyA9CisgICAgICB2cHhfY29kZWNfY29udHJvbCAoJmVuY29kZXItPmVuY29kZXIsIFZQOEVfU0VUX0NQVVVTRUQsCisgICAgICBlbmNvZGVyLT5jcHVfdXNlZCk7CisgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmNvZGVyLCAiRmFpbGVkIHRvIHNldCBWUDhFX1NFVF9DUFVVU0VEOiAlcyIsCisgICAgICAgIGdzdF92cHhfZXJyb3JfbmFtZSAoc3RhdHVzKSk7CisgIH0KKworICBzdGF0dXMgPQorICAgICAgdnB4X2NvZGVjX2NvbnRyb2wgKCZlbmNvZGVyLT5lbmNvZGVyLCBWUDhFX1NFVF9FTkFCTEVBVVRPQUxUUkVGLAorICAgICAgKGVuY29kZXItPmVuYWJsZV9hdXRvX2FsdF9yZWYgPyAxIDogMCkpOworICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZW5jb2RlciwKKyAgICAgICAgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfRU5BQkxFQVVUT0FMVFJFRjogJXMiLAorICAgICAgICBnc3RfdnB4X2Vycm9yX25hbWUgKHN0YXR1cykpOworICB9CisgIHN0YXR1cyA9IHZweF9jb2RlY19jb250cm9sICgmZW5jb2Rlci0+ZW5jb2RlciwgVlA4RV9TRVRfTk9JU0VfU0VOU0lUSVZJVFksCisgICAgICBlbmNvZGVyLT5ub2lzZV9zZW5zaXRpdml0eSk7CisgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmNvZGVyLAorICAgICAgICAiRmFpbGVkIHRvIHNldCBWUDhFX1NFVF9OT0lTRV9TRU5TSVRJVklUWTogJXMiLAorICAgICAgICBnc3RfdnB4X2Vycm9yX25hbWUgKHN0YXR1cykpOworICB9CisgIHN0YXR1cyA9IHZweF9jb2RlY19jb250cm9sICgmZW5jb2Rlci0+ZW5jb2RlciwgVlA4RV9TRVRfU0hBUlBORVNTLAorICAgICAgZW5jb2Rlci0+c2hhcnBuZXNzKTsKKyAgaWYgKHN0YXR1cyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGVuY29kZXIsCisgICAgICAgICJGYWlsZWQgdG8gc2V0IFZQOEVfU0VUX1NIQVJQTkVTUzogJXMiLCBnc3RfdnB4X2Vycm9yX25hbWUgKHN0YXR1cykpOworICB9CisgIHN0YXR1cyA9IHZweF9jb2RlY19jb250cm9sICgmZW5jb2Rlci0+ZW5jb2RlciwgVlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRCwKKyAgICAgIGVuY29kZXItPnN0YXRpY190aHJlc2hvbGQpOworICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZW5jb2RlciwKKyAgICAgICAgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRDogJXMiLAorICAgICAgICBnc3RfdnB4X2Vycm9yX25hbWUgKHN0YXR1cykpOworICB9CisgIHN0YXR1cyA9IHZweF9jb2RlY19jb250cm9sICgmZW5jb2Rlci0+ZW5jb2RlciwgVlA4RV9TRVRfVE9LRU5fUEFSVElUSU9OUywKKyAgICAgIGVuY29kZXItPnRva2VuX3BhcnRpdGlvbnMpOworICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZW5jb2RlciwKKyAgICAgICAgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfVE9LRU5fUEFSVElPTlM6ICVzIiwKKyAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgfQorICBzdGF0dXMgPSB2cHhfY29kZWNfY29udHJvbCAoJmVuY29kZXItPmVuY29kZXIsIFZQOEVfU0VUX0FSTlJfTUFYRlJBTUVTLAorICAgICAgZW5jb2Rlci0+YXJucl9tYXhmcmFtZXMpOworICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZW5jb2RlciwKKyAgICAgICAgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfQVJOUl9NQVhGUkFNRVM6ICVzIiwKKyAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgfQorICBzdGF0dXMgPSB2cHhfY29kZWNfY29udHJvbCAoJmVuY29kZXItPmVuY29kZXIsIFZQOEVfU0VUX0FSTlJfU1RSRU5HVEgsCisgICAgICBlbmNvZGVyLT5hcm5yX3N0cmVuZ3RoKTsKKyAgaWYgKHN0YXR1cyAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGVuY29kZXIsCisgICAgICAgICJGYWlsZWQgdG8gc2V0IFZQOEVfU0VUX0FSTlJfU1RSRU5HVEg6ICVzIiwKKyAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgfQorICBzdGF0dXMgPSB2cHhfY29kZWNfY29udHJvbCAoJmVuY29kZXItPmVuY29kZXIsIFZQOEVfU0VUX1RVTklORywKKyAgICAgIGVuY29kZXItPnR1bmluZyk7CisgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmNvZGVyLAorICAgICAgICAiRmFpbGVkIHRvIHNldCBWUDhFX1NFVF9UVU5JTkc6ICVzIiwgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgfQorICBzdGF0dXMgPSB2cHhfY29kZWNfY29udHJvbCAoJmVuY29kZXItPmVuY29kZXIsIFZQOEVfU0VUX0NRX0xFVkVMLAorICAgICAgZW5jb2Rlci0+Y3FfbGV2ZWwpOworICBpZiAoc3RhdHVzICE9IFZQWF9DT0RFQ19PSykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZW5jb2RlciwKKyAgICAgICAgIkZhaWxlZCB0byBzZXQgVlA4RV9TRVRfQ1FfTEVWRUw6ICVzIiwgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgfQorICBzdGF0dXMgPSB2cHhfY29kZWNfY29udHJvbCAoJmVuY29kZXItPmVuY29kZXIsIFZQOEVfU0VUX01BWF9JTlRSQV9CSVRSQVRFX1BDVCwKKyAgICAgIGVuY29kZXItPm1heF9pbnRyYV9iaXRyYXRlX3BjdCk7CisgIGlmIChzdGF0dXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmNvZGVyLAorICAgICAgICAiRmFpbGVkIHRvIHNldCBWUDhFX1NFVF9NQVhfSU5UUkFfQklUUkFURV9QQ1Q6ICVzIiwKKyAgICAgICAgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKTsKKyAgfQorCisgIGlmIChHU1RfVklERU9fSU5GT19GUFNfRCAoaW5mbykgPT0gMCB8fCBHU1RfVklERU9fSU5GT19GUFNfTiAoaW5mbykgPT0gMCkgeworICAgIC8qIEZJWE1FOiBBc3N1bWUgMjVmcHMgZm9yIHVua25vd24gZnJhbWVyYXRlcy4gQmV0dGVyIHRoYW4gcmVwb3J0aW5nCisgICAgICogdGhhdCB3ZSBpbnRyb2R1Y2Ugbm8gbGF0ZW5jeSB3aGlsZSB3ZSBhY3R1YWxseSBkbworICAgICAqLworICAgIGxhdGVuY3kgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGVuY29kZXItPmNmZy5nX2xhZ19pbl9mcmFtZXMsCisgICAgICAgIDEgKiBHU1RfU0VDT05ELCAyNSk7CisgIH0gZWxzZSB7CisgICAgbGF0ZW5jeSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoZW5jb2Rlci0+Y2ZnLmdfbGFnX2luX2ZyYW1lcywKKyAgICAgICAgR1NUX1ZJREVPX0lORk9fRlBTX0QgKGluZm8pICogR1NUX1NFQ09ORCwgR1NUX1ZJREVPX0lORk9fRlBTX04gKGluZm8pKTsKKyAgfQorICBnc3RfdmlkZW9fZW5jb2Rlcl9zZXRfbGF0ZW5jeSAodmlkZW9fZW5jb2RlciwgbGF0ZW5jeSwgbGF0ZW5jeSk7CisgIGVuY29kZXItPmluaXRlZCA9IFRSVUU7CisKKyAgLyogU3RvcmUgaW5wdXQgc3RhdGUgKi8KKyAgaWYgKGVuY29kZXItPmlucHV0X3N0YXRlKQorICAgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAoZW5jb2Rlci0+aW5wdXRfc3RhdGUpOworICBlbmNvZGVyLT5pbnB1dF9zdGF0ZSA9IGdzdF92aWRlb19jb2RlY19zdGF0ZV9yZWYgKHN0YXRlKTsKKworICAvKiBwcmVwYXJlIGNhY2hlZCBpbWFnZSBidWZmZXIgc2V0dXAgKi8KKyAgaW1hZ2UgPSAmZW5jb2Rlci0+aW1hZ2U7CisgIG1lbXNldCAoaW1hZ2UsIDAsIHNpemVvZiAoKmltYWdlKSk7CisKKyAgdnB4X2VuY19jbGFzcy0+c2V0X2ltYWdlX2Zvcm1hdCAoZW5jb2RlciwgaW1hZ2UpOworCisgIGltYWdlLT53ID0gaW1hZ2UtPmRfdyA9IEdTVF9WSURFT19JTkZPX1dJRFRIIChpbmZvKTsKKyAgaW1hZ2UtPmggPSBpbWFnZS0+ZF9oID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbmZvKTsKKworICBpbWFnZS0+c3RyaWRlW1ZQWF9QTEFORV9ZXSA9IEdTVF9WSURFT19JTkZPX0NPTVBfU1RSSURFIChpbmZvLCAwKTsKKyAgaW1hZ2UtPnN0cmlkZVtWUFhfUExBTkVfVV0gPSBHU1RfVklERU9fSU5GT19DT01QX1NUUklERSAoaW5mbywgMSk7CisgIGltYWdlLT5zdHJpZGVbVlBYX1BMQU5FX1ZdID0gR1NUX1ZJREVPX0lORk9fQ09NUF9TVFJJREUgKGluZm8sIDIpOworCisgIGNhcHMgPSB2cHhfZW5jX2NsYXNzLT5nZXRfbmV3X3ZweF9jYXBzIChlbmNvZGVyKTsKKworICB2cHhfZW5jX2NsYXNzLT5zZXRfc3RyZWFtX2luZm8gKGVuY29kZXIsIGNhcHMsIGluZm8pOworCisgIGdfbXV0ZXhfdW5sb2NrICgmZW5jb2Rlci0+ZW5jb2Rlcl9sb2NrKTsKKworICBvdXRwdXRfc3RhdGUgPQorICAgICAgZ3N0X3ZpZGVvX2VuY29kZXJfc2V0X291dHB1dF9zdGF0ZSAodmlkZW9fZW5jb2RlciwgY2Fwcywgc3RhdGUpOworICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKG91dHB1dF9zdGF0ZSk7CisKKyAgZ3N0X3ZpZGVvX2VuY29kZXJfbmVnb3RpYXRlIChHU1RfVklERU9fRU5DT0RFUiAoZW5jb2RlcikpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdnB4X2VuY19wcm9jZXNzIChHc3RWUFhFbmMgKiBlbmNvZGVyKQoreworICB2cHhfY29kZWNfaXRlcl90IGl0ZXIgPSBOVUxMOworICBjb25zdCB2cHhfY29kZWNfY3hfcGt0X3QgKnBrdDsKKyAgR3N0VmlkZW9FbmNvZGVyICp2aWRlb19lbmNvZGVyOworICB2b2lkICp1c2VyX2RhdGE7CisgIEdzdFZpZGVvQ29kZWNGcmFtZSAqZnJhbWU7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdFZQWEVuY0NsYXNzICp2cHhfZW5jX2NsYXNzOworICB2cHhfY29kZWNfcHRzX3QgcHRzOworCisgIHZpZGVvX2VuY29kZXIgPSBHU1RfVklERU9fRU5DT0RFUiAoZW5jb2Rlcik7CisgIHZweF9lbmNfY2xhc3MgPSBHU1RfVlBYX0VOQ19HRVRfQ0xBU1MgKGVuY29kZXIpOworCisgIGdfbXV0ZXhfbG9jayAoJmVuY29kZXItPmVuY29kZXJfbG9jayk7CisgIHBrdCA9IHZweF9jb2RlY19nZXRfY3hfZGF0YSAoJmVuY29kZXItPmVuY29kZXIsICZpdGVyKTsKKyAgd2hpbGUgKHBrdCAhPSBOVUxMKSB7CisgICAgR3N0QnVmZmVyICpidWZmZXI7CisgICAgZ2Jvb2xlYW4gaW52aXNpYmxlOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZW5jb2RlciwgInBhY2tldCAldSB0eXBlICVkIiwgKGd1aW50KSBwa3QtPmRhdGEuZnJhbWUuc3osCisgICAgICAgIHBrdC0+a2luZCk7CisKKyAgICBpZiAocGt0LT5raW5kID09IFZQWF9DT0RFQ19TVEFUU19QS1QKKyAgICAgICAgJiYgZW5jb2Rlci0+Y2ZnLmdfcGFzcyA9PSBWUFhfUkNfRklSU1RfUEFTUykgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKGVuY29kZXIsICJoYW5kbGluZyBTVEFUUyBwYWNrZXQiKTsKKworICAgICAgZ19ieXRlX2FycmF5X2FwcGVuZCAoZW5jb2Rlci0+Zmlyc3RfcGFzc19jYWNoZV9jb250ZW50LAorICAgICAgICAgIHBrdC0+ZGF0YS50d29wYXNzX3N0YXRzLmJ1ZiwgcGt0LT5kYXRhLnR3b3Bhc3Nfc3RhdHMuc3opOworCisgICAgICBmcmFtZSA9IGdzdF92aWRlb19lbmNvZGVyX2dldF9vbGRlc3RfZnJhbWUgKHZpZGVvX2VuY29kZXIpOworICAgICAgaWYgKGZyYW1lICE9IE5VTEwpIHsKKyAgICAgICAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0xJVkUpOworICAgICAgICBmcmFtZS0+b3V0cHV0X2J1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgZ19tdXRleF91bmxvY2sgKCZlbmNvZGVyLT5lbmNvZGVyX2xvY2spOworICAgICAgICByZXQgPSBnc3RfdmlkZW9fZW5jb2Rlcl9maW5pc2hfZnJhbWUgKHZpZGVvX2VuY29kZXIsIGZyYW1lKTsKKyAgICAgICAgZ19tdXRleF9sb2NrICgmZW5jb2Rlci0+ZW5jb2Rlcl9sb2NrKTsKKyAgICAgIH0KKworICAgICAgcGt0ID0gdnB4X2NvZGVjX2dldF9jeF9kYXRhICgmZW5jb2Rlci0+ZW5jb2RlciwgJml0ZXIpOworICAgICAgY29udGludWU7CisgICAgfSBlbHNlIGlmIChwa3QtPmtpbmQgIT0gVlBYX0NPREVDX0NYX0ZSQU1FX1BLVCkgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKGVuY29kZXIsICJub24gZnJhbWUgcGt0OiAlZCIsIHBrdC0+a2luZCk7CisgICAgICBwa3QgPSB2cHhfY29kZWNfZ2V0X2N4X2RhdGEgKCZlbmNvZGVyLT5lbmNvZGVyLCAmaXRlcik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpbnZpc2libGUgPSAocGt0LT5kYXRhLmZyYW1lLmZsYWdzICYgVlBYX0ZSQU1FX0lTX0lOVklTSUJMRSkgIT0gMDsKKworICAgIC8qIGRpc2NhcmQgb2xkZXIgZnJhbWVzIHRoYXQgd2VyZSBkcm9wcGVkIGJ5IGxpYnZweCAqLworICAgIGZyYW1lID0gTlVMTDsKKyAgICBkbyB7CisgICAgICBpZiAoZnJhbWUpCisgICAgICAgIGdzdF92aWRlb19lbmNvZGVyX2ZpbmlzaF9mcmFtZSAodmlkZW9fZW5jb2RlciwgZnJhbWUpOworICAgICAgZnJhbWUgPSBnc3RfdmlkZW9fZW5jb2Rlcl9nZXRfb2xkZXN0X2ZyYW1lICh2aWRlb19lbmNvZGVyKTsKKyAgICAgIHB0cyA9CisgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChmcmFtZS0+cHRzLAorICAgICAgICAgIGVuY29kZXItPmNmZy5nX3RpbWViYXNlLmRlbiwKKyAgICAgICAgICBlbmNvZGVyLT5jZmcuZ190aW1lYmFzZS5udW0gKiAoR3N0Q2xvY2tUaW1lKSBHU1RfU0VDT05EKTsKKyAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKGVuY29kZXIsICJ2cHggcHRzOiAlIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAiLCBnc3QgZnJhbWUgcHRzOiAlIiBHX0dJTlQ2NF9GT1JNQVQsIHBrdC0+ZGF0YS5mcmFtZS5wdHMsIHB0cyk7CisgICAgfSB3aGlsZSAocGt0LT5kYXRhLmZyYW1lLnB0cyA+IHB0cyk7CisKKyAgICBnX2Fzc2VydCAoZnJhbWUgIT0gTlVMTCk7CisgICAgaWYgKChwa3QtPmRhdGEuZnJhbWUuZmxhZ3MgJiBWUFhfRlJBTUVfSVNfS0VZKSAhPSAwKQorICAgICAgR1NUX1ZJREVPX0NPREVDX0ZSQU1FX1NFVF9TWU5DX1BPSU5UIChmcmFtZSk7CisgICAgZWxzZQorICAgICAgR1NUX1ZJREVPX0NPREVDX0ZSQU1FX1VOU0VUX1NZTkNfUE9JTlQgKGZyYW1lKTsKKworICAgIC8qIEZJWE1FIDogSXQgd291bGQgYmUgbmljZSB0byBhdm9pZCB0aGUgbWVtb3J5IGNvcHkgLi4uICovCisgICAgYnVmZmVyID0KKyAgICAgICAgZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ19tZW1kdXAgKHBrdC0+ZGF0YS5mcmFtZS5idWYsCisgICAgICAgICAgICBwa3QtPmRhdGEuZnJhbWUuc3opLCBwa3QtPmRhdGEuZnJhbWUuc3opOworCisgICAgdXNlcl9kYXRhID0gdnB4X2VuY19jbGFzcy0+cHJvY2Vzc19mcmFtZV91c2VyX2RhdGEgKGVuY29kZXIsIGZyYW1lKTsKKworICAgIGlmIChpbnZpc2libGUpIHsKKyAgICAgIHJldCA9CisgICAgICAgICAgdnB4X2VuY19jbGFzcy0+aGFuZGxlX2ludmlzaWJsZV9mcmFtZV9idWZmZXIgKGVuY29kZXIsIHVzZXJfZGF0YSwKKyAgICAgICAgICBidWZmZXIpOworICAgICAgZ3N0X3ZpZGVvX2NvZGVjX2ZyYW1lX3VucmVmIChmcmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZyYW1lLT5vdXRwdXRfYnVmZmVyID0gYnVmZmVyOworICAgICAgZ19tdXRleF91bmxvY2sgKCZlbmNvZGVyLT5lbmNvZGVyX2xvY2spOworICAgICAgcmV0ID0gZ3N0X3ZpZGVvX2VuY29kZXJfZmluaXNoX2ZyYW1lICh2aWRlb19lbmNvZGVyLCBmcmFtZSk7CisgICAgICBnX211dGV4X2xvY2sgKCZlbmNvZGVyLT5lbmNvZGVyX2xvY2spOworICAgIH0KKworICAgIHBrdCA9IHZweF9jb2RlY19nZXRfY3hfZGF0YSAoJmVuY29kZXItPmVuY29kZXIsICZpdGVyKTsKKyAgfQorICBnX211dGV4X3VubG9jayAoJmVuY29kZXItPmVuY29kZXJfbG9jayk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGhvbGRpbmcgdGhlbiBzdHJlYW0gbG9jayovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3ZweF9lbmNfZHJhaW4gKEdzdFZpZGVvRW5jb2RlciAqIHZpZGVvX2VuY29kZXIpCit7CisgIEdzdFZQWEVuYyAqZW5jb2RlcjsKKyAgaW50IGZsYWdzID0gMDsKKyAgdnB4X2NvZGVjX2Vycl90IHN0YXR1czsKKyAgZ2ludDY0IGRlYWRsaW5lOworICB2cHhfY29kZWNfcHRzX3QgcHRzOworCisgIGVuY29kZXIgPSBHU1RfVlBYX0VOQyAodmlkZW9fZW5jb2Rlcik7CisKKyAgZ19tdXRleF9sb2NrICgmZW5jb2Rlci0+ZW5jb2Rlcl9sb2NrKTsKKyAgZGVhZGxpbmUgPSBlbmNvZGVyLT5kZWFkbGluZTsKKworICBwdHMgPQorICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChlbmNvZGVyLT5sYXN0X3B0cywKKyAgICAgIGVuY29kZXItPmNmZy5nX3RpbWViYXNlLmRlbiwKKyAgICAgIGVuY29kZXItPmNmZy5nX3RpbWViYXNlLm51bSAqIChHc3RDbG9ja1RpbWUpIEdTVF9TRUNPTkQpOworCisgIHN0YXR1cyA9IHZweF9jb2RlY19lbmNvZGUgKCZlbmNvZGVyLT5lbmNvZGVyLCBOVUxMLCBwdHMsIDAsIGZsYWdzLCBkZWFkbGluZSk7CisgIGdfbXV0ZXhfdW5sb2NrICgmZW5jb2Rlci0+ZW5jb2Rlcl9sb2NrKTsKKworICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChlbmNvZGVyLCAiZW5jb2RlIHJldHVybmVkICVkICVzIiwgc3RhdHVzLAorICAgICAgICBnc3RfdnB4X2Vycm9yX25hbWUgKHN0YXR1cykpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIC8qIGRpc3BhdGNoIHJlbWFpbmluZyBmcmFtZXMgKi8KKyAgZ3N0X3ZweF9lbmNfcHJvY2VzcyAoZW5jb2Rlcik7CisKKyAgZ19tdXRleF9sb2NrICgmZW5jb2Rlci0+ZW5jb2Rlcl9sb2NrKTsKKyAgaWYgKGVuY29kZXItPmNmZy5nX3Bhc3MgPT0gVlBYX1JDX0ZJUlNUX1BBU1MgJiYgZW5jb2Rlci0+bXVsdGlwYXNzX2NhY2hlX2ZpbGUpIHsKKyAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICBpZiAoIWdfZmlsZV9zZXRfY29udGVudHMgKGVuY29kZXItPm11bHRpcGFzc19jYWNoZV9maWxlLAorICAgICAgICAgICAgKGNvbnN0IGdjaGFyICopIGVuY29kZXItPmZpcnN0X3Bhc3NfY2FjaGVfY29udGVudC0+ZGF0YSwKKyAgICAgICAgICAgIGVuY29kZXItPmZpcnN0X3Bhc3NfY2FjaGVfY29udGVudC0+bGVuLCAmZXJyKSkgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGVuY29kZXIsIFJFU09VUkNFLCBXUklURSwgKE5VTEwpLAorICAgICAgICAgICgiRmFpbGVkIHRvIHdyaXRlIG11bHRpcGFzcyBjYWNoZSBmaWxlOiAlcyIsIGVyci0+bWVzc2FnZSkpOworICAgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgIH0KKyAgfQorICBnX211dGV4X3VubG9jayAoJmVuY29kZXItPmVuY29kZXJfbG9jayk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92cHhfZW5jX2ZsdXNoIChHc3RWaWRlb0VuY29kZXIgKiB2aWRlb19lbmNvZGVyKQoreworICBHc3RWUFhFbmMgKmVuY29kZXI7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodmlkZW9fZW5jb2RlciwgImZsdXNoIik7CisKKyAgZW5jb2RlciA9IEdTVF9WUFhfRU5DICh2aWRlb19lbmNvZGVyKTsKKworICBnc3RfdnB4X2VuY19kZXN0cm95X2VuY29kZXIgKGVuY29kZXIpOworICBpZiAoZW5jb2Rlci0+aW5wdXRfc3RhdGUpIHsKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfcmVmIChlbmNvZGVyLT5pbnB1dF9zdGF0ZSk7CisgICAgZ3N0X3ZweF9lbmNfc2V0X2Zvcm1hdCAodmlkZW9fZW5jb2RlciwgZW5jb2Rlci0+aW5wdXRfc3RhdGUpOworICAgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAoZW5jb2Rlci0+aW5wdXRfc3RhdGUpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdnB4X2VuY19maW5pc2ggKEdzdFZpZGVvRW5jb2RlciAqIHZpZGVvX2VuY29kZXIpCit7CisgIEdzdFZQWEVuYyAqZW5jb2RlcjsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodmlkZW9fZW5jb2RlciwgImZpbmlzaCIpOworCisgIGVuY29kZXIgPSBHU1RfVlBYX0VOQyAodmlkZW9fZW5jb2Rlcik7CisKKyAgaWYgKGVuY29kZXItPmluaXRlZCkgeworICAgIHJldCA9IGdzdF92cHhfZW5jX2RyYWluICh2aWRlb19lbmNvZGVyKTsKKyAgfSBlbHNlIHsKKyAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2cHhfaW1hZ2VfdCAqCitnc3RfdnB4X2VuY19idWZmZXJfdG9faW1hZ2UgKEdzdFZQWEVuYyAqIGVuYywgR3N0VmlkZW9GcmFtZSAqIGZyYW1lKQoreworICB2cHhfaW1hZ2VfdCAqaW1hZ2UgPSBnX3NsaWNlX25ldyAodnB4X2ltYWdlX3QpOworCisgIG1lbWNweSAoaW1hZ2UsICZlbmMtPmltYWdlLCBzaXplb2YgKCppbWFnZSkpOworCisgIGltYWdlLT5wbGFuZXNbVlBYX1BMQU5FX1ldID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZnJhbWUsIDApOworICBpbWFnZS0+cGxhbmVzW1ZQWF9QTEFORV9VXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAxKTsKKyAgaW1hZ2UtPnBsYW5lc1tWUFhfUExBTkVfVl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgMik7CisKKyAgaW1hZ2UtPnN0cmlkZVtWUFhfUExBTkVfWV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKTsKKyAgaW1hZ2UtPnN0cmlkZVtWUFhfUExBTkVfVV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAxKTsKKyAgaW1hZ2UtPnN0cmlkZVtWUFhfUExBTkVfVl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAyKTsKKworICByZXR1cm4gaW1hZ2U7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdnB4X2VuY19oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRW5jb2RlciAqIHZpZGVvX2VuY29kZXIsCisgICAgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUpCit7CisgIEdzdFZQWEVuYyAqZW5jb2RlcjsKKyAgdnB4X2NvZGVjX2Vycl90IHN0YXR1czsKKyAgaW50IGZsYWdzID0gMDsKKyAgdnB4X2ltYWdlX3QgKmltYWdlOworICBHc3RWaWRlb0ZyYW1lIHZmcmFtZTsKKyAgdnB4X2NvZGVjX3B0c190IHB0czsKKyAgdW5zaWduZWQgbG9uZyBkdXJhdGlvbjsKKyAgR3N0VlBYRW5jQ2xhc3MgKnZweF9lbmNfY2xhc3M7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodmlkZW9fZW5jb2RlciwgImhhbmRsZV9mcmFtZSIpOworCisgIGVuY29kZXIgPSBHU1RfVlBYX0VOQyAodmlkZW9fZW5jb2Rlcik7CisgIHZweF9lbmNfY2xhc3MgPSBHU1RfVlBYX0VOQ19HRVRfQ0xBU1MgKGVuY29kZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHZpZGVvX2VuY29kZXIsICJzaXplICVkICVkIiwKKyAgICAgIEdTVF9WSURFT19JTkZPX1dJRFRIICgmZW5jb2Rlci0+aW5wdXRfc3RhdGUtPmluZm8pLAorICAgICAgR1NUX1ZJREVPX0lORk9fSEVJR0hUICgmZW5jb2Rlci0+aW5wdXRfc3RhdGUtPmluZm8pKTsKKworICBnc3RfdmlkZW9fZnJhbWVfbWFwICgmdmZyYW1lLCAmZW5jb2Rlci0+aW5wdXRfc3RhdGUtPmluZm8sCisgICAgICBmcmFtZS0+aW5wdXRfYnVmZmVyLCBHU1RfTUFQX1JFQUQpOworICBpbWFnZSA9IGdzdF92cHhfZW5jX2J1ZmZlcl90b19pbWFnZSAoZW5jb2RlciwgJnZmcmFtZSk7CisKKyAgdnB4X2VuY19jbGFzcy0+c2V0X2ZyYW1lX3VzZXJfZGF0YSAoZW5jb2RlciwgZnJhbWUsIGltYWdlKTsKKworICBpZiAoR1NUX1ZJREVPX0NPREVDX0ZSQU1FX0lTX0ZPUkNFX0tFWUZSQU1FIChmcmFtZSkpIHsKKyAgICBmbGFncyB8PSBWUFhfRUZMQUdfRk9SQ0VfS0Y7CisgIH0KKworICBnX211dGV4X2xvY2sgKCZlbmNvZGVyLT5lbmNvZGVyX2xvY2spOworICBwdHMgPQorICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChmcmFtZS0+cHRzLAorICAgICAgZW5jb2Rlci0+Y2ZnLmdfdGltZWJhc2UuZGVuLAorICAgICAgZW5jb2Rlci0+Y2ZnLmdfdGltZWJhc2UubnVtICogKEdzdENsb2NrVGltZSkgR1NUX1NFQ09ORCk7CisgIGVuY29kZXItPmxhc3RfcHRzID0gZnJhbWUtPnB0czsKKworICBpZiAoZnJhbWUtPmR1cmF0aW9uICE9IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICBkdXJhdGlvbiA9CisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoZnJhbWUtPmR1cmF0aW9uLCBlbmNvZGVyLT5jZmcuZ190aW1lYmFzZS5kZW4sCisgICAgICAgIGVuY29kZXItPmNmZy5nX3RpbWViYXNlLm51bSAqIChHc3RDbG9ja1RpbWUpIEdTVF9TRUNPTkQpOworCisgICAgaWYgKGR1cmF0aW9uID4gMCkgeworICAgICAgZW5jb2Rlci0+bGFzdF9wdHMgKz0gZnJhbWUtPmR1cmF0aW9uOworICAgIH0gZWxzZSB7CisgICAgICAvKiBXZSBmb3JjZSB0aGUgcGF0aCBpZ25vcmluZyB0aGUgZHVyYXRpb24gaWYgd2UgZW5kIHVwIHdpdGggYSB6ZXJvCisgICAgICAgKiB2YWx1ZSBmb3IgZHVyYXRpb24gYWZ0ZXIgc2NhbGluZyAoZS5nLiBkdXJhdGlvbiB2YWx1ZSB0b28gc21hbGwpICovCisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGVuY29kZXIsCisgICAgICAgICAgIklnbm9yaW5nIHRvbyBzbWFsbCBmcmFtZSBkdXJhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZnJhbWUtPmR1cmF0aW9uKSk7CisgICAgICBkdXJhdGlvbiA9IDE7CisgICAgfQorICB9IGVsc2UgeworICAgIGR1cmF0aW9uID0gMTsKKyAgfQorCisgIHN0YXR1cyA9IHZweF9jb2RlY19lbmNvZGUgKCZlbmNvZGVyLT5lbmNvZGVyLCBpbWFnZSwKKyAgICAgIHB0cywgZHVyYXRpb24sIGZsYWdzLCBlbmNvZGVyLT5kZWFkbGluZSk7CisKKyAgZ19tdXRleF91bmxvY2sgKCZlbmNvZGVyLT5lbmNvZGVyX2xvY2spOworICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZ2ZnJhbWUpOworCisgIGlmIChzdGF0dXMgIT0gMCkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChlbmNvZGVyLCBMSUJSQVJZLCBFTkNPREUsCisgICAgICAgICgiRmFpbGVkIHRvIGVuY29kZSBmcmFtZSIpLCAoIiVzIiwgZ3N0X3ZweF9lcnJvcl9uYW1lIChzdGF0dXMpKSk7CisgICAgZ3N0X3ZpZGVvX2NvZGVjX2ZyYW1lX3NldF91c2VyX2RhdGEgKGZyYW1lLCBOVUxMLCBOVUxMKTsKKyAgICBnc3RfdmlkZW9fY29kZWNfZnJhbWVfdW5yZWYgKGZyYW1lKTsKKworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorICBnc3RfdmlkZW9fY29kZWNfZnJhbWVfdW5yZWYgKGZyYW1lKTsKKyAgcmV0dXJuIGdzdF92cHhfZW5jX3Byb2Nlc3MgKGVuY29kZXIpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92cHhfZW5jX3NpbmtfZXZlbnQgKEdzdFZpZGVvRW5jb2RlciAqIGJlbmMsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFZQWEVuYyAqZW5jID0gR1NUX1ZQWF9FTkMgKGJlbmMpOworCisgIC8qIEZJWE1FIDogTW92ZSB0aGlzIHRvIGJhc2UgZW5jb2RlciBjbGFzcyAqLworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9UQUcpIHsKKyAgICBHc3RUYWdMaXN0ICpsaXN0OworICAgIEdzdFRhZ1NldHRlciAqc2V0dGVyID0gR1NUX1RBR19TRVRURVIgKGVuYyk7CisgICAgY29uc3QgR3N0VGFnTWVyZ2VNb2RlIG1vZGUgPSBnc3RfdGFnX3NldHRlcl9nZXRfdGFnX21lcmdlX21vZGUgKHNldHRlcik7CisKKyAgICBnc3RfZXZlbnRfcGFyc2VfdGFnIChldmVudCwgJmxpc3QpOworICAgIGdzdF90YWdfc2V0dGVyX21lcmdlX3RhZ3MgKHNldHRlciwgbGlzdCwgbW9kZSk7CisgIH0KKworICAvKiBqdXN0IHBlZWtlZCwgYmFzZWNsYXNzIGhhbmRsZXMgdGhlIHJlc3QgKi8KKyAgcmV0dXJuIEdTVF9WSURFT19FTkNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChiZW5jLCBldmVudCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZweF9lbmNfcHJvcG9zZV9hbGxvY2F0aW9uIChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnc3RfcXVlcnlfYWRkX2FsbG9jYXRpb25fbWV0YSAocXVlcnksIEdTVF9WSURFT19NRVRBX0FQSV9UWVBFLCBOVUxMKTsKKworICByZXR1cm4gR1NUX1ZJREVPX0VOQ09ERVJfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnByb3Bvc2VfYWxsb2NhdGlvbiAoZW5jb2RlciwKKyAgICAgIHF1ZXJ5KTsKK30KKworI2VuZGlmIC8qIEhBVkVfVlA4X0VOQ09ERVIgfHwgSEFWRV9WUDlfRU5DT0RFUiAqLwpkaWZmIC0tZ2l0IGEvZXh0L3ZweC9nc3R2cHhlbmMuaCBiL2V4dC92cHgvZ3N0dnB4ZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIwMTkyNwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC92cHgvZ3N0dnB4ZW5jLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qIFZQOAorICogQ29weXJpZ2h0IChDKSAyMDA2IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDEwIEVudHJvcHkgV2F2ZSBJbmMKKyAqIENvcHlyaWdodCAoQykgMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKyNpZm5kZWYgX19HU1RfVlBYX0VOQ19IX18KKyNkZWZpbmUgX19HU1RfVlBYX0VOQ19IX18KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX1ZQOF9FTkNPREVSKSB8fCBkZWZpbmVkKEhBVkVfVlA5X0VOQ09ERVIpCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZW5jb2Rlci5oPgorCisvKiBGSVhNRTogVW5kZWYgSEFWRV9DT05GSUdfSCBiZWNhdXNlIHZweF9jb2RlYy5oIHVzZXMgaXQsCisgKiB3aGljaCBjYXVzZXMgY29tcGlsYXRpb24gZmFpbHVyZXMgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjdW5kZWYgSEFWRV9DT05GSUdfSAorI2VuZGlmCisKKyNpbmNsdWRlIDx2cHgvdnB4X2VuY29kZXIuaD4KKyNpbmNsdWRlIDx2cHgvdnA4Y3guaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1ZQWF9FTkMgXAorICAoZ3N0X3ZweF9lbmNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1ZQWF9FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9WUFhfRU5DLEdzdFZQWEVuYykpCisjZGVmaW5lIEdTVF9WUFhfRU5DX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1ZQWF9FTkMsR3N0VlBYRW5jQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVlBYX0VOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1ZQWF9FTkMpKQorI2RlZmluZSBHU1RfSVNfVlBYX0VOQ19DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVlBYX0VOQykpCisjZGVmaW5lIEdTVF9WUFhfRU5DX0dFVF9DTEFTUyhvYmopICAgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX1ZQWF9FTkMsIEdzdFZQWEVuY0NsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZQWEVuYyBHc3RWUFhFbmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VlBYRW5jQ2xhc3MgR3N0VlBYRW5jQ2xhc3M7CisKK3N0cnVjdCBfR3N0VlBYRW5jCit7CisgIEdzdFZpZGVvRW5jb2RlciBiYXNlX3ZpZGVvX2VuY29kZXI7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgdnB4X2NvZGVjX2N0eF90IGVuY29kZXI7CisgIEdNdXRleCBlbmNvZGVyX2xvY2s7CisKKyAgLyogcHJvcGVydGllcyAqLworICB2cHhfY29kZWNfZW5jX2NmZ190IGNmZzsKKyAgZ2Jvb2xlYW4gaGF2ZV9kZWZhdWx0X2NvbmZpZzsKKyAgZ2Jvb2xlYW4gcmNfdGFyZ2V0X2JpdHJhdGVfc2V0OworICBnaW50IG5fdHNfdGFyZ2V0X2JpdHJhdGU7CisgIGdpbnQgbl90c19yYXRlX2RlY2ltYXRvcjsKKyAgZ2ludCBuX3RzX2xheWVyX2lkOworICAvKiBHbG9iYWwgdHdvLXBhc3Mgb3B0aW9ucyAqLworICBnY2hhciAqbXVsdGlwYXNzX2NhY2hlX2ZpbGU7CisgIGdjaGFyICptdWx0aXBhc3NfY2FjaGVfcHJlZml4OworICBndWludCBtdWx0aXBhc3NfY2FjaGVfaWR4OworICBHQnl0ZUFycmF5ICpmaXJzdF9wYXNzX2NhY2hlX2NvbnRlbnQ7CisKKyAgLyogRW5jb2RlIHBhcmFtZXRlciAqLworICBnaW50NjQgZGVhZGxpbmU7CisKKyAgLyogQ29udHJvbHMgKi8KKyAgVlBYX1NDQUxJTkdfTU9ERSBoX3NjYWxpbmdfbW9kZTsKKyAgVlBYX1NDQUxJTkdfTU9ERSB2X3NjYWxpbmdfbW9kZTsKKyAgaW50IGNwdV91c2VkOworICBnYm9vbGVhbiBlbmFibGVfYXV0b19hbHRfcmVmOworICB1bnNpZ25lZCBpbnQgbm9pc2Vfc2Vuc2l0aXZpdHk7CisgIHVuc2lnbmVkIGludCBzaGFycG5lc3M7CisgIHVuc2lnbmVkIGludCBzdGF0aWNfdGhyZXNob2xkOworICB2cDhlX3Rva2VuX3BhcnRpdGlvbnMgdG9rZW5fcGFydGl0aW9uczsKKyAgdW5zaWduZWQgaW50IGFybnJfbWF4ZnJhbWVzOworICB1bnNpZ25lZCBpbnQgYXJucl9zdHJlbmd0aDsKKyAgdW5zaWduZWQgaW50IGFybnJfdHlwZTsKKyAgdnA4ZV90dW5pbmcgdHVuaW5nOworICB1bnNpZ25lZCBpbnQgY3FfbGV2ZWw7CisgIHVuc2lnbmVkIGludCBtYXhfaW50cmFfYml0cmF0ZV9wY3Q7CisgIC8qIFRpbWViYXNlIC0gYSB2YWx1ZSBvZiAwIHdpbGwgdXNlIHRoZSBmcmFtZXJhdGUgKi8KKyAgdW5zaWduZWQgaW50IHRpbWViYXNlX247CisgIHVuc2lnbmVkIGludCB0aW1lYmFzZV9kOworCisgIC8qIHN0YXRlICovCisgIGdib29sZWFuIGluaXRlZDsKKworICB2cHhfaW1hZ2VfdCBpbWFnZTsKKworICBHc3RDbG9ja1RpbWUgbGFzdF9wdHM7CisKKyAgR3N0VmlkZW9Db2RlY1N0YXRlICppbnB1dF9zdGF0ZTsKK307CisKK3N0cnVjdCBfR3N0VlBYRW5jQ2xhc3MKK3sKKyAgR3N0VmlkZW9FbmNvZGVyQ2xhc3MgYmFzZV92aWRlb19lbmNvZGVyX2NsYXNzOworICAvKnZpcnR1YWwgZnVuY3Rpb24gdG8gZ2V0IHN1cHBvcnRlZCBhbGdvKi8KKyAgdnB4X2NvZGVjX2lmYWNlX3QqICgqZ2V0X2FsZ28pIChHc3RWUFhFbmMgKmVuYyk7CisgIC8qZW5hYmxlZCBzY2FsaW5nKi8KKyAgZ2Jvb2xlYW4gKCplbmFibGVfc2NhbGluZykgKEdzdFZQWEVuYyAqZW5jKTsKKyAgLypzZXQgaW1hZ2UgZm9ybWF0IGluZm8qLworICB2b2lkICgqc2V0X2ltYWdlX2Zvcm1hdCkgKEdzdFZQWEVuYyAqZW5jLCB2cHhfaW1hZ2VfdCAqaW1hZ2UpOworICAvKmdldCBuZXcgc2ltcGxlIGNhcHMqLworICBHc3RDYXBzKiAoKmdldF9uZXdfdnB4X2NhcHMpIChHc3RWUFhFbmMgKmVuYyk7CisgIC8qc2V0IHN0cmVhbSBpbmZvKi8KKyAgdm9pZCAoKnNldF9zdHJlYW1faW5mbykgKEdzdFZQWEVuYyAqZW5jLCBHc3RDYXBzICpjYXBzLCBHc3RWaWRlb0luZm8gKmluZm8pOworICAvKnByb2Nlc3MgdXNlciBkYXRhKi8KKyAgdm9pZCogKCpwcm9jZXNzX2ZyYW1lX3VzZXJfZGF0YSkgKEdzdFZQWEVuYyAqZW5jLCBHc3RWaWRlb0NvZGVjRnJhbWUqIGZyYW1lKTsKKyAgLypzZXQgZnJhbWUgdXNlciBkYXRhKi8KKyAgdm9pZCAoKnNldF9mcmFtZV91c2VyX2RhdGEpIChHc3RWUFhFbmMgKmVuYywgR3N0VmlkZW9Db2RlY0ZyYW1lKiBmcmFtZSwgdnB4X2ltYWdlX3QgKmltYWdlKTsKKyAgLypIYW5kbGUgaW52aXNpYmxlIGZyYW1lKi8KKyAgR3N0Rmxvd1JldHVybiAoKmhhbmRsZV9pbnZpc2libGVfZnJhbWVfYnVmZmVyKSAoR3N0VlBYRW5jICplbmMsIHZvaWQqIHVzZXJfZGF0YSwgR3N0QnVmZmVyKiBidWZmZXIpOworfTsKKworR1R5cGUgZ3N0X3ZweF9lbmNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYKKworI2VuZGlmIC8qIF9fR1NUX1ZQWF9FTkNfSF9fICovCmRpZmYgLS1naXQgYS9leHQvdnB4L21lc29uLmJ1aWxkIGIvZXh0L3ZweC9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODVhZWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3ZweC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDYyIEBACit2cHhfc291cmNlcyA9IFsKKyAgJ2dzdHZwOGRlYy5jJywKKyAgJ2dzdHZwOGVuYy5jJywKKyAgJ2dzdHZwOHV0aWxzLmMnLAorICAnZ3N0dnA5ZGVjLmMnLAorICAnZ3N0dnA5ZW5jLmMnLAorICAnZ3N0dnB4ZGVjLmMnLAorICAnZ3N0dnB4ZW5jLmMnLAorICAncGx1Z2luLmMnLAorXQorCit2cHhfZmVhdHVyZXMgPSBbCisgIFsgJ3ZweC92cDhjeC5oJywgJ3ZweF9jb2RlY192cDhfY3hfYWxnbycsICctREhBVkVfVlA4X0VOQ09ERVInLCAnVlA4IGVuY29kZXInIF0sCisgIFsgJ3ZweC92cDhkeC5oJywgJ3ZweF9jb2RlY192cDhfZHhfYWxnbycsICctREhBVkVfVlA4X0RFQ09ERVInLCAnVlA4IGRlY29kZXInIF0sCisgIFsgJ3ZweC92cDhjeC5oJywgJ3ZweF9jb2RlY192cDlfY3hfYWxnbycsICctREhBVkVfVlA5X0VOQ09ERVInLCAnVlA5IGVuY29kZXInIF0sCisgIFsgJ3ZweC92cDhkeC5oJywgJ3ZweF9jb2RlY192cDlfZHhfYWxnbycsICctREhBVkVfVlA5X0RFQ09ERVInLCAnVlA5IGRlY29kZXInIF0sCitdCisKK3ZweF9kZXAgPSBkZXBlbmRlbmN5KCd2cHgnLCB2ZXJzaW9uIDogJz49MS4zLjAnLCByZXF1aXJlZCA6IGZhbHNlKQorCitpZiB2cHhfZGVwLmZvdW5kKCkKKyAgdnB4X2FyZ3MgPSBbXQorICBmb3JlYWNoIGYgOiB2cHhfZmVhdHVyZXMKKyAgICBoZWFkZXIgPSBmLmdldCgwKQorICAgIGNvZGVjX2lmYWNlID0gZi5nZXQoMSkKKyAgICBleHRyYV9kZWZpbmUgPSBmLmdldCgyKQorICAgIGxpbmtfY29kZSA9ICcnJyNpbmNsdWRlIDxAMEA+CisgICAgICAgICAgICAgICAgICAgaW50IG1haW4gKGludCBhLCBjaGFyICoqIGcpIHsKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZweF9jb2RlY19pZmFjZV90ICpjID0gJkAxQDsKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjICE9IDA7CisgICAgICAgICAgICAgICAgICAgfScnJy5mb3JtYXQoaGVhZGVyLGNvZGVjX2lmYWNlKQorICAgICMgRklYTUU6IHNob3VsZCB0YWtlIGRlcGVuZGVuY2llcyA6IHZweF9kZXAgYXJndW1lbnQKKyAgICBpZiBjYy5saW5rcyhsaW5rX2NvZGUsIGFyZ3MgOiBbJy1sdnB4J10pCisgICAgICB2cHhfYXJncyArPSBleHRyYV9kZWZpbmUKKyAgICAgIG1lc3NhZ2UoJ2xpYnZweCBwcm92aWRlcyBAMEAgaW50ZXJmYWNlIChAMUApJy5mb3JtYXQoZi5nZXQoMyksZi5nZXQoMSkpKQorICAgICAgaGF2ZV92cHhfZmVhdHVyZSA9IHRydWUKKyAgICBlbHNlCisgICAgICBtZXNzYWdlKCdsaWJ2cHggZG9lcyBub3QgcHJvdmlkZSBAMEAgaW50ZXJmYWNlIChAMUApJy5mb3JtYXQoZi5nZXQoMyksZi5nZXQoMSkpKQorICAgICAgaGF2ZV92cHhfZmVhdHVyZSA9IGZhbHNlCisgICAgZW5kaWYKKyAgICBzZXRfdmFyaWFibGUoJ2hhdmVfJyArIGYuZ2V0KDMpLnRvX2xvd2VyKCkudW5kZXJzY29yaWZ5KCksIGhhdmVfdnB4X2ZlYXR1cmUpCisgIGVuZGZvcmVhY2gKKworICBpZiB2cHhfYXJncy5sZW5ndGgoKSA9PSAwCisgICAgbWVzc2FnZSgnV0FSTklORzogbGlidnB4IHdhcyBidWlsdCB3aXRob3V0IGFueSBlbmNvZGVyIG9yIGRlY29kZXIgZmVhdHVyZXMhJykKKyAgZW5kaWYKKworICBpZiBkZXBlbmRlbmN5KCd2cHgnLCB2ZXJzaW9uIDogJz49MS40LjAnLCByZXF1aXJlZCA6IGZhbHNlKS5mb3VuZCgpCisgICAgdnB4X2FyZ3MgKz0gJy1ESEFWRV9WUFhfMV80JworICBlbmRpZgorCisgIGdzdHZweCA9IGxpYnJhcnkoJ2dzdHZweCcsCisgICAgdnB4X3NvdXJjZXMsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzICsgdnB4X2FyZ3MsCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICAgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0dGFnX2RlcCwgZ3N0dmlkZW9fZGVwLCB2cHhfZGVwXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCisgICkKKworICBpbnN0YWxsX2RhdGEoc291cmNlczogWydHc3RWUDhFbmMucHJzJ10sIGluc3RhbGxfZGlyOiBwcmVzZXRkaXIpCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L3ZweC9wbHVnaW4uYyBiL2V4dC92cHgvcGx1Z2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwNGVmYQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC92cHgvcGx1Z2luLmMKQEAgLTAsMCArMSw2MyBAQAorLyogVlA4CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRW50cm9weSBXYXZlIEluYworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnc3R2cDhkZWMuaCIKKyNpbmNsdWRlICJnc3R2cDhlbmMuaCIKKyNpbmNsdWRlICJnc3R2cDlkZWMuaCIKKyNpbmNsdWRlICJnc3R2cDllbmMuaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworI2lmZGVmIEhBVkVfVlA4X0RFQ09ERVIKKyAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInZwOGRlYyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICBnc3RfdnA4X2RlY19nZXRfdHlwZSAoKSk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVlA4X0VOQ09ERVIKKyAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInZwOGVuYyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICBnc3RfdnA4X2VuY19nZXRfdHlwZSAoKSk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVlA5X0RFQ09ERVIKKyAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInZwOWRlYyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICBnc3RfdnA5X2RlY19nZXRfdHlwZSAoKSk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVlA5X0VOQ09ERVIKKyAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInZwOWVuYyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICBnc3RfdnA5X2VuY19nZXRfdHlwZSAoKSk7CisjZW5kaWYKKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHZweCwKKyAgICAiVlA4IHBsdWdpbiIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZXh0L3dhdnBhY2svTWFrZWZpbGUuYW0gYi9leHQvd2F2cGFjay9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmVkNmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3dhdnBhY2svTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyMSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0d2F2cGFjay5sYQorCitsaWJnc3R3YXZwYWNrX2xhX1NPVVJDRVMgPSBcCisJCQkJZ3N0d2F2cGFjay5jIFwKKwkJCQlnc3R3YXZwYWNrY29tbW9uLmMgXAorCQkJCWdzdHdhdnBhY2tkZWMuYyBcCisJCQkJZ3N0d2F2cGFja2VuYy5jIFwKKwkJCQlnc3R3YXZwYWNrc3RyZWFtcmVhZGVyLmMKKworbGliZ3N0d2F2cGFja19sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJCQkJJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgJChXQVZQQUNLX0NGTEFHUykKK2xpYmdzdHdhdnBhY2tfbGFfTElCQUREID0gICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJCQkJJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKFdBVlBBQ0tfTElCUykKK2xpYmdzdHdhdnBhY2tfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IFwKKwkJZ3N0d2F2cGFja2RlYy5oIFwKKwkJZ3N0d2F2cGFja2VuYy5oIFwKKwkJZ3N0d2F2cGFja2NvbW1vbi5oIFwKKwkJZ3N0d2F2cGFja3N0cmVhbXJlYWRlci5oCisKZGlmZiAtLWdpdCBhL2V4dC93YXZwYWNrL2dzdHdhdnBhY2suYyBiL2V4dC93YXZwYWNrL2dzdHdhdnBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjA5YWEyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3dhdnBhY2svZ3N0d2F2cGFjay5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIEdTdHJlYW1lciB3YXZwYWNrIHBsdWdpbgorICogKGMpIDIwMDQgQXJ3ZWQgdi4gTWVya2F0eiA8di5tZXJrYXR6QGdteC5uZXQ+CisgKgorICogZ3N0d2F2cGFjay5jOiBwbHVnaW4gbG9hZGVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC1pMThuLXBsdWdpbi5oPgorCisjaW5jbHVkZSAiZ3N0d2F2cGFja2RlYy5oIgorI2luY2x1ZGUgImdzdHdhdnBhY2tlbmMuaCIKKworLyogZGVidWcgY2F0ZWdvcnkgZm9yIGNvbW1vbiBjb2RlICovCitHU1RfREVCVUdfQ0FURUdPUlkgKHdhdnBhY2tfZGVidWcpOworCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUICh3YXZwYWNrX2RlYnVnLCAid2F2cGFjayIsIDAsICJXYXZwYWNrIGVsZW1lbnRzIik7CisKKyNpZmRlZiBFTkFCTEVfTkxTCisgIEdTVF9ERUJVRyAoImJpbmRpbmcgdGV4dCBkb21haW4gJXMgdG8gbG9jYWxlIGRpciAlcyIsIEdFVFRFWFRfUEFDS0FHRSwKKyAgICAgIExPQ0FMRURJUik7CisgIGJpbmR0ZXh0ZG9tYWluIChHRVRURVhUX1BBQ0tBR0UsIExPQ0FMRURJUik7CisgIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChHRVRURVhUX1BBQ0tBR0UsICJVVEYtOCIpOworI2VuZGlmCisKKyAgcmV0dXJuIChnc3Rfd2F2cGFja19kZWNfcGx1Z2luX2luaXQgKHBsdWdpbikKKyAgICAgICYmIGdzdF93YXZwYWNrX2VuY19wbHVnaW5faW5pdCAocGx1Z2luKSk7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICB3YXZwYWNrLAorICAgICJXYXZwYWNrIGxvc3NsZXNzL2xvc3N5IGF1ZGlvIGZvcm1hdCBoYW5kbGluZyIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5jIGIvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExN2M5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvd2F2cGFjay9nc3R3YXZwYWNrY29tbW9uLmMKQEAgLTAsMCArMSwyNjQgQEAKKy8qIEdTdHJlYW1lciBXYXZwYWNrIHBsdWdpbgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFyd2VkIHYuIE1lcmthdHogPHYubWVya2F0ekBnbXgubmV0PgorICogQ29weXJpZ2h0IChjKSAxOTk4IC0gMjAwNSBDb25pZmVyIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIGdzdHdhdnBhY2tjb21tb24uYzogY29tbW9uIGhlbHBlciBmdW5jdGlvbnMKKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0d2F2cGFja2NvbW1vbi5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfRVhURVJOICh3YXZwYWNrX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHdhdnBhY2tfZGVidWcKKworZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX3JlYWRfaGVhZGVyIChXYXZwYWNrSGVhZGVyICogaGVhZGVyLCBndWludDggKiBidWYpCit7CisgIG1lbW1vdmUgKGhlYWRlciwgYnVmLCBzaXplb2YgKFdhdnBhY2tIZWFkZXIpKTsKKworICBXYXZwYWNrTGl0dGxlRW5kaWFuVG9OYXRpdmUgKGhlYWRlciwgKGNoYXIgKikgV2F2cGFja0hlYWRlckZvcm1hdCk7CisKKyAgcmV0dXJuIChtZW1jbXAgKGhlYWRlci0+Y2tJRCwgInd2cGsiLCA0KSA9PSAwKTsKK30KKworLyogaW5zcGlyZWQgYnkgdGhlIG9yaWdpbmFsIG9uZSBpbiB3YXZwYWNrICovCitnYm9vbGVhbgorZ3N0X3dhdnBhY2tfcmVhZF9tZXRhZGF0YSAoR3N0V2F2cGFja01ldGFkYXRhICogd3BtZCwgZ3VpbnQ4ICogaGVhZGVyX2RhdGEsCisgICAgZ3VpbnQ4ICoqIHBfZGF0YSkKK3sKKyAgV2F2cGFja0hlYWRlciBoZHI7CisgIGd1aW50OCAqZW5kOworCisgIGdzdF93YXZwYWNrX3JlYWRfaGVhZGVyICgmaGRyLCBoZWFkZXJfZGF0YSk7CisgIGVuZCA9IGhlYWRlcl9kYXRhICsgaGRyLmNrU2l6ZSArIDg7CisKKyAgaWYgKGVuZCAtICpwX2RhdGEgPCAyKQorICAgIHJldHVybiBGQUxTRTsKKworICB3cG1kLT5pZCA9IEdTVF9SRUFEX1VJTlQ4ICgqcF9kYXRhKTsKKyAgd3BtZC0+Ynl0ZV9sZW5ndGggPSAyICogKGd1aW50KSBHU1RfUkVBRF9VSU5UOCAoKnBfZGF0YSArIDEpOworCisgICpwX2RhdGEgKz0gMjsKKworICBpZiAoKHdwbWQtPmlkICYgSURfTEFSR0UpID09IElEX0xBUkdFKSB7CisgICAgZ3VpbnQgZXh0cmE7CisKKyAgICB3cG1kLT5pZCAmPSB+SURfTEFSR0U7CisKKyAgICBpZiAoZW5kIC0gKnBfZGF0YSA8IDIpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBleHRyYSA9IEdTVF9SRUFEX1VJTlQxNl9MRSAoKnBfZGF0YSk7CisgICAgd3BtZC0+Ynl0ZV9sZW5ndGggKz0gKGV4dHJhIDw8IDkpOworICAgICpwX2RhdGEgKz0gMjsKKyAgfQorCisgIGlmICgod3BtZC0+aWQgJiBJRF9PRERfU0laRSkgPT0gSURfT0REX1NJWkUpIHsKKyAgICB3cG1kLT5pZCAmPSB+SURfT0REX1NJWkU7CisgICAgLS13cG1kLT5ieXRlX2xlbmd0aDsKKyAgfQorCisgIGlmICh3cG1kLT5ieXRlX2xlbmd0aCA+IDApIHsKKyAgICBpZiAoZW5kIC0gKnBfZGF0YSA8IHdwbWQtPmJ5dGVfbGVuZ3RoICsgKHdwbWQtPmJ5dGVfbGVuZ3RoICYgMSkpIHsKKyAgICAgIHdwbWQtPmRhdGEgPSBOVUxMOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHdwbWQtPmRhdGEgPSAqcF9kYXRhOworICAgICpwX2RhdGEgKz0gd3BtZC0+Ynl0ZV9sZW5ndGggKyAod3BtZC0+Ynl0ZV9sZW5ndGggJiAxKTsKKyAgfSBlbHNlIHsKKyAgICB3cG1kLT5kYXRhID0gTlVMTDsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitnaW50Citnc3Rfd2F2cGFja19nZXRfZGVmYXVsdF9jaGFubmVsX21hc2sgKGdpbnQgbmNoYW5uZWxzKQoreworICBnaW50IGNoYW5uZWxfbWFzayA9IDA7CisKKyAgLyogU2V0IHRoZSBkZWZhdWx0IGNoYW5uZWwgbWFzayBmb3IgdGhlIGdpdmVuIG51bWJlciBvZiBjaGFubmVscy4KKyAgICogSXQncyB0aGUgc2FtZSBhcyBmb3IgV0FWRV9GT1JNQVRfRVhURU5ERUQ6CisgICAqIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93aGRjL2RldmljZS9hdWRpby9tdWx0aWNoYXVkLm1zcHgKKyAgICovCisgIHN3aXRjaCAobmNoYW5uZWxzKSB7CisgICAgY2FzZSAxMToKKyAgICAgIGNoYW5uZWxfbWFzayB8PSAweDAwNDAwOworICAgICAgY2hhbm5lbF9tYXNrIHw9IDB4MDAyMDA7CisgICAgY2FzZSA5OgorICAgICAgY2hhbm5lbF9tYXNrIHw9IDB4MDAxMDA7CisgICAgY2FzZSA4OgorICAgICAgY2hhbm5lbF9tYXNrIHw9IDB4MDAwODA7CisgICAgICBjaGFubmVsX21hc2sgfD0gMHgwMDA0MDsKKyAgICBjYXNlIDY6CisgICAgICBjaGFubmVsX21hc2sgfD0gMHgwMDAyMDsKKyAgICAgIGNoYW5uZWxfbWFzayB8PSAweDAwMDEwOworICAgIGNhc2UgNDoKKyAgICAgIGNoYW5uZWxfbWFzayB8PSAweDAwMDA4OworICAgIGNhc2UgMzoKKyAgICAgIGNoYW5uZWxfbWFzayB8PSAweDAwMDA0OworICAgIGNhc2UgMjoKKyAgICAgIGNoYW5uZWxfbWFzayB8PSAweDAwMDAyOworICAgICAgY2hhbm5lbF9tYXNrIHw9IDB4MDAwMDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAvKiBGb3IgbW9ubyB1c2UgZnJvbnQgY2VudGVyICovCisgICAgICBjaGFubmVsX21hc2sgfD0gMHgwMDAwNDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGNoYW5uZWxfbWFzazsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdAoreworICBjb25zdCBndWludDMyIG1zX21hc2s7CisgIGNvbnN0IEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIGdzdF9wb3M7Cit9IGxheW91dF9tYXBwaW5nW10gPSB7CisgIHsKKyAgMHgwMDAwMSwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVH0sIHsKKyAgMHgwMDAwMiwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFR9LCB7CisgIDB4MDAwMDQsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUn0sIHsKKyAgMHgwMDAwOCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMX0sIHsKKyAgMHgwMDAxMCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZUfSwgeworICAweDAwMDIwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hUfSwgeworICAweDAwMDQwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUX09GX0NFTlRFUn0sIHsKKyAgMHgwMDA4MCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFRfT0ZfQ0VOVEVSfSwgeworICAweDAwMTAwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0NFTlRFUn0sIHsKKyAgMHgwMDIwMCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9MRUZUfSwgeworICAweDAwNDAwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hUfSwgeworICAweDAwODAwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfQ0VOVEVSfSwgeworICAweDAxMDAwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfTEVGVH0sIHsKKyAgMHgwMjAwMCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX0NFTlRFUn0sIHsKKyAgMHgwNDAwMCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX1JJR0hUfSwgeworICAweDA4MDAwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9MRUZUfSwgeworICAweDEwMDAwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9DRU5URVJ9LCB7CisgIDB4MjAwMDAsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX1JJR0hUfQorfTsKKworI2RlZmluZSBNQVhfQ0hBTk5FTF9QT1NJVElPTlMgR19OX0VMRU1FTlRTIChsYXlvdXRfbWFwcGluZykKKworZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX2dldF9jaGFubmVsX3Bvc2l0aW9ucyAoZ2ludCBudW1fY2hhbm5lbHMsIGdpbnQgbGF5b3V0LAorICAgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICogcG9zKQoreworICBnaW50IGksIHA7CisKKyAgaWYgKG51bV9jaGFubmVscyA9PSAxICYmIGxheW91dCA9PSAweDAwMDA0KSB7CisgICAgcG9zWzBdID0gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTU9OTzsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHAgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0NIQU5ORUxfUE9TSVRJT05TOyArK2kpIHsKKyAgICBpZiAoKGxheW91dCAmIGxheW91dF9tYXBwaW5nW2ldLm1zX21hc2spICE9IDApIHsKKyAgICAgIGlmIChwID49IG51bV9jaGFubmVscykgeworICAgICAgICBHU1RfV0FSTklORyAoIk1vcmUgYml0cyBzZXQgaW4gdGhlIGNoYW5uZWwgbGF5b3V0IG1hcCB0aGFuIHRoZXJlICIKKyAgICAgICAgICAgICJhcmUgY2hhbm5lbHMhIEJyb2tlbiBmaWxlIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmIChsYXlvdXRfbWFwcGluZ1tpXS5nc3RfcG9zID09IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0lOVkFMSUQpIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJVbnN1cHBvcnRlZCBjaGFubmVsIHBvc2l0aW9uIChtYXNrIDB4JTA4eCkgaW4gY2hhbm5lbCAiCisgICAgICAgICAgICAibGF5b3V0IG1hcCAtIGlnbm9yaW5nIHRob3NlIGNoYW5uZWxzIiwgbGF5b3V0X21hcHBpbmdbaV0ubXNfbWFzayk7CisgICAgICAgIC8qIHdoYXQgdG8gZG8/IGp1c3QgaWdub3JlIGl0IGFuZCBsZXQgZG93bnN0cmVhbSBkZWFsIHdpdGggYSBjaGFubmVsCisgICAgICAgICAqIGxheW91dCB0aGF0IGhhcyBJTlZBTElEIHBvc2l0aW9ucyBpbiBpdCBmb3Igbm93IC4uLiAqLworICAgICAgfQorICAgICAgcG9zW3BdID0gbGF5b3V0X21hcHBpbmdbaV0uZ3N0X3BvczsKKyAgICAgICsrcDsKKyAgICB9CisgIH0KKworICBpZiAocCAhPSBudW1fY2hhbm5lbHMpIHsKKyAgICBHU1RfV0FSTklORyAoIk9ubHkgJWQgYml0cyBzZXQgaW4gdGhlIGNoYW5uZWwgbGF5b3V0IG1hcCwgYnV0IHRoZXJlIGFyZSAiCisgICAgICAgICJzdXBwb3NlZCB0byBiZSAlZCBjaGFubmVscyEgQnJva2VuIGZpbGUiLCBwLCBudW1fY2hhbm5lbHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqCitnc3Rfd2F2cGFja19nZXRfZGVmYXVsdF9jaGFubmVsX3Bvc2l0aW9ucyAoZ2ludCBuY2hhbm5lbHMpCit7CisgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICpwb3MgPSBnX25ldyAoR3N0QXVkaW9DaGFubmVsUG9zaXRpb24sIG5jaGFubmVscyk7CisgIGdpbnQgaTsKKworICBpZiAobmNoYW5uZWxzID09IDEpIHsKKyAgICBwb3NbMF0gPSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVI7CisgICAgcmV0dXJuIHBvczsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBuY2hhbm5lbHM7IGkrKykKKyAgICBwb3NbaV0gPSBsYXlvdXRfbWFwcGluZ1tpXS5nc3RfcG9zOworCisgIHJldHVybiBwb3M7Cit9CisKK2dpbnQKK2dzdF93YXZwYWNrX2dldF9jaGFubmVsX21hc2tfZnJvbV9wb3NpdGlvbnMgKEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICogcG9zLAorICAgIGdpbnQgbmNoYW5uZWxzKQoreworICBnaW50IGNoYW5uZWxfbWFzayA9IDA7CisgIGdpbnQgaSwgajsKKworICBpZiAobmNoYW5uZWxzID09IDEgJiYgcG9zWzBdID09IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX01PTk8pIHsKKyAgICBjaGFubmVsX21hc2sgPSAweDAwMDAwMDA0OworICAgIHJldHVybiBjaGFubmVsX21hc2s7CisgIH0KKworICAvKiBGSVhNRTogbm90IGV4YWN0bHkgZWZmaWNpZW50IGJ1dCBvdGhlcndpc2Ugd2UgbmVlZCBhbiBpbnZlcnNlCisgICAqIG1hcHBpbmcgdGFibGUgdG9vICovCisgIGZvciAoaSA9IDA7IGkgPCBuY2hhbm5lbHM7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCBNQVhfQ0hBTk5FTF9QT1NJVElPTlM7IGorKykgeworICAgICAgaWYgKHBvc1tpXSA9PSBsYXlvdXRfbWFwcGluZ1tqXS5nc3RfcG9zKSB7CisgICAgICAgIGNoYW5uZWxfbWFzayB8PSBsYXlvdXRfbWFwcGluZ1tqXS5tc19tYXNrOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gY2hhbm5lbF9tYXNrOworfQorCitnYm9vbGVhbgorZ3N0X3dhdnBhY2tfc2V0X2NoYW5uZWxfbWFwcGluZyAoR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gKiBwb3MsIGdpbnQgbmNoYW5uZWxzLAorICAgIGdpbnQ4ICogY2hhbm5lbF9tYXBwaW5nKQoreworICBnaW50IGksIGo7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgZm9yIChpID0gMDsgaSA8IG5jaGFubmVsczsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IE1BWF9DSEFOTkVMX1BPU0lUSU9OUzsgaisrKSB7CisgICAgICBpZiAocG9zW2ldID09IGxheW91dF9tYXBwaW5nW2pdLmdzdF9wb3MpIHsKKyAgICAgICAgY2hhbm5lbF9tYXBwaW5nW2ldID0gajsKKyAgICAgICAgcmV0ICY9IChpID09IGopOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gIXJldDsKK30KZGlmZiAtLWdpdCBhL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tjb21tb24uaCBiL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tjb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGE4MWJmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2NvbW1vbi5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIEdTdHJlYW1lciBXYXZwYWNrIHBsdWdpbgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFyd2VkIHYuIE1lcmthdHogPHYubWVya2F0ekBnbXgubmV0PgorICogQ29weXJpZ2h0IChjKSAyMDA2IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBnc3R3YXZwYWNrY29tbW9uLmg6IGNvbW1vbiBoZWxwZXIgZnVuY3Rpb25zCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9XQVZQQUNLX0NPTU1PTl9IX18KKyNkZWZpbmUgX19HU1RfV0FWUEFDS19DT01NT05fSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8d2F2cGFjay93YXZwYWNrLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGd1aW50MzIgYnl0ZV9sZW5ndGg7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQ4IGlkOworfSBHc3RXYXZwYWNrTWV0YWRhdGE7CisKKyNkZWZpbmUgSURfVU5JUVVFICAgICAgICAgICAgICAgMHgzZgorI2RlZmluZSBJRF9PUFRJT05BTF9EQVRBICAgICAgICAweDIwCisjZGVmaW5lIElEX09ERF9TSVpFICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgSURfTEFSR0UgICAgICAgICAgICAgICAgMHg4MAorCisjZGVmaW5lIElEX0RVTU1ZICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBJRF9FTkNPREVSX0lORk8gICAgICAgICAweDEKKyNkZWZpbmUgSURfREVDT1JSX1RFUk1TICAgICAgICAgMHgyCisjZGVmaW5lIElEX0RFQ09SUl9XRUlHSFRTICAgICAgIDB4MworI2RlZmluZSBJRF9ERUNPUlJfU0FNUExFUyAgICAgICAweDQKKyNkZWZpbmUgSURfRU5UUk9QWV9WQVJTICAgICAgICAgMHg1CisjZGVmaW5lIElEX0hZQlJJRF9QUk9GSUxFICAgICAgIDB4NgorI2RlZmluZSBJRF9TSEFQSU5HX1dFSUdIVFMgICAgICAweDcKKyNkZWZpbmUgSURfRkxPQVRfSU5GTyAgICAgICAgICAgMHg4CisjZGVmaW5lIElEX0lOVDMyX0lORk8gICAgICAgICAgIDB4OQorI2RlZmluZSBJRF9XVl9CSVRTVFJFQU0gICAgICAgICAweGEKKyNkZWZpbmUgSURfV1ZDX0JJVFNUUkVBTSAgICAgICAgMHhiCisjZGVmaW5lIElEX1dWWF9CSVRTVFJFQU0gICAgICAgIDB4YworI2RlZmluZSBJRF9DSEFOTkVMX0lORk8gICAgICAgICAweGQKKworI2RlZmluZSBJRF9SSUZGX0hFQURFUiAgICAgICAgICAoSURfT1BUSU9OQUxfREFUQSB8IDB4MSkKKyNkZWZpbmUgSURfUklGRl9UUkFJTEVSICAgICAgICAgKElEX09QVElPTkFMX0RBVEEgfCAweDIpCisjZGVmaW5lIElEX1JFUExBWV9HQUlOICAgICAgICAgIChJRF9PUFRJT05BTF9EQVRBIHwgMHgzKQorI2RlZmluZSBJRF9DVUVTSEVFVCAgICAgICAgICAgICAoSURfT1BUSU9OQUxfREFUQSB8IDB4NCkKKyNkZWZpbmUgSURfQ09ORklHX0JMT0NLICAgICAgICAgKElEX09QVElPTkFMX0RBVEEgfCAweDUpCisjZGVmaW5lIElEX01ENV9DSEVDS1NVTSAgICAgICAgIChJRF9PUFRJT05BTF9EQVRBIHwgMHg2KQorI2RlZmluZSBJRF9TQU1QTEVfUkFURSAgICAgICAgICAoSURfT1BUSU9OQUxfREFUQSB8IDB4NykKKworCitnYm9vbGVhbiBnc3Rfd2F2cGFja19yZWFkX2hlYWRlciAoV2F2cGFja0hlYWRlciAqIGhlYWRlciwgZ3VpbnQ4ICogYnVmKTsKK2dib29sZWFuIGdzdF93YXZwYWNrX3JlYWRfbWV0YWRhdGEgKEdzdFdhdnBhY2tNZXRhZGF0YSAqIG1ldGEsCisgICAgZ3VpbnQ4ICogaGVhZGVyX2RhdGEsIGd1aW50OCAqKiBwX2RhdGEpOworZ2ludCBnc3Rfd2F2cGFja19nZXRfZGVmYXVsdF9jaGFubmVsX21hc2sgKGdpbnQgbmNoYW5uZWxzKTsKK2dib29sZWFuIGdzdF93YXZwYWNrX2dldF9jaGFubmVsX3Bvc2l0aW9ucyAoZ2ludCBuY2hhbm5lbHMsIGdpbnQgbGF5b3V0LCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqcG9zKTsKK0dzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICpnc3Rfd2F2cGFja19nZXRfZGVmYXVsdF9jaGFubmVsX3Bvc2l0aW9ucyAoZ2ludCBuY2hhbm5lbHMpOworZ2ludCBnc3Rfd2F2cGFja19nZXRfY2hhbm5lbF9tYXNrX2Zyb21fcG9zaXRpb25zIChHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqcG9zLCBnaW50IG5jaGFubmVscyk7CitnYm9vbGVhbiBnc3Rfd2F2cGFja19zZXRfY2hhbm5lbF9tYXBwaW5nIChHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqcG9zLCBnaW50IG5jaGFubmVscywgZ2ludDggKmNoYW5uZWxfbWFwcGluZyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jIGIvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjY2U1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvd2F2cGFjay9nc3R3YXZwYWNrZGVjLmMKQEAgLTAsMCArMSw0NzMgQEAKKy8qIEdTdHJlYW1lciBXYXZwYWNrIHBsdWdpbgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFyd2VkIHYuIE1lcmthdHogPHYubWVya2F0ekBnbXgubmV0PgorICogQ29weXJpZ2h0IChjKSAyMDA2IEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA2IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBnc3R3YXZwYWNrZGVjLmM6IHJhdyBXYXZwYWNrIGJpdHN0cmVhbSBkZWNvZGVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtd2F2cGFja2RlYworICoKKyAqIFdhdnBhY2tEZWMgZGVjb2RlcyBmcmFtZWQgKGZvciBleGFtcGxlIGJ5IHRoZSBXYXZwYWNrUGFyc2UgZWxlbWVudCkKKyAqIFdhdnBhY2sgc3RyZWFtcyBhbmQgZGVjb2RlcyB0aGVtIHRvIHJhdyBhdWRpby4KKyAqIDx1bGluayB1cmw9Imh0dHA6Ly93d3cud2F2cGFjay5jb20vIj5XYXZwYWNrPC91bGluaz4gaXMgYW4gb3Blbi1zb3VyY2UKKyAqIGF1ZGlvIGNvZGVjIHRoYXQgZmVhdHVyZXMgYm90aCBsb3NzbGVzcyBhbmQgbG9zc3kgZW5jb2RpbmcuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGZpbGVzcmMgbG9jYXRpb249dGVzdC53diAhIHdhdnBhY2twYXJzZSAhIHdhdnBhY2tkZWMgISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgYXV0b2F1ZGlvc2luaworICogXXwgVGhpcyBwaXBlbGluZSBkZWNvZGVzIHRoZSBXYXZwYWNrIGZpbGUgdGVzdC53diBpbnRvIHJhdyBhdWRpbyBidWZmZXJzIGFuZAorICogdHJpZXMgdG8gcGxheSBpdCBiYWNrIHVzaW5nIGFuIGF1dG9tYXRpY2FsbHkgZm91bmQgYXVkaW8gc2luay4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8d2F2cGFjay93YXZwYWNrLmg+CisjaW5jbHVkZSAiZ3N0d2F2cGFja2RlYy5oIgorI2luY2x1ZGUgImdzdHdhdnBhY2tjb21tb24uaCIKKyNpbmNsdWRlICJnc3R3YXZwYWNrc3RyZWFtcmVhZGVyLmgiCisKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3dhdnBhY2tfZGVjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF93YXZwYWNrX2RlY19kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC13YXZwYWNrLCAiCisgICAgICAgICJkZXB0aCA9IChpbnQpIFsgMSwgMzIgXSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDggXSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgNjAwMCwgMTkyMDAwIF0sICIgImZyYW1lZCA9IChib29sZWFuKSB0cnVlIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIFM4LCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDggXSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgNjAwMCwgMTkyMDAwIF07ICIKKyAgICAgICAgImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzE2KSAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDggXSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgNjAwMCwgMTkyMDAwIF07ICIKKyAgICAgICAgImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzMyKSAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDggXSwgIiAicmF0ZSA9IChpbnQpIFsgNjAwMCwgMTkyMDAwIF0iKQorICAgICk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfd2F2cGFja19kZWNfc3RhcnQgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3dhdnBhY2tfZGVjX3N0b3AgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3dhdnBhY2tfZGVjX3NldF9mb3JtYXQgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfd2F2cGFja19kZWNfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0RlY29kZXIgKiBkZWMsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworc3RhdGljIHZvaWQgZ3N0X3dhdnBhY2tfZGVjX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyB2b2lkIGdzdF93YXZwYWNrX2RlY19wb3N0X3RhZ3MgKEdzdFdhdnBhY2tEZWMgKiBkZWMpOworCisjZGVmaW5lIGdzdF93YXZwYWNrX2RlY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RXYXZwYWNrRGVjLCBnc3Rfd2F2cGFja19kZWMsIEdTVF9UWVBFX0FVRElPX0RFQ09ERVIpOworCitzdGF0aWMgdm9pZAorZ3N0X3dhdnBhY2tfZGVjX2NsYXNzX2luaXQgKEdzdFdhdnBhY2tEZWNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIChrbGFzcyk7CisgIEdzdEF1ZGlvRGVjb2RlckNsYXNzICpiYXNlX2NsYXNzID0gKEdzdEF1ZGlvRGVjb2RlckNsYXNzICopIChrbGFzcyk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzcmNfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc2lua19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIldhdnBhY2sgYXVkaW8gZGVjb2RlciIsCisgICAgICAiQ29kZWMvRGVjb2Rlci9BdWRpbyIsCisgICAgICAiRGVjb2RlcyBXYXZwYWNrIGF1ZGlvIGRhdGEiLAorICAgICAgIkFyd2VkIHYuIE1lcmthdHogPHYubWVya2F0ekBnbXgubmV0PiwgIgorICAgICAgIlNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4iKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF93YXZwYWNrX2RlY19maW5hbGl6ZTsKKworICBiYXNlX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2cGFja19kZWNfc3RhcnQpOworICBiYXNlX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZwYWNrX2RlY19zdG9wKTsKKyAgYmFzZV9jbGFzcy0+c2V0X2Zvcm1hdCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2cGFja19kZWNfc2V0X2Zvcm1hdCk7CisgIGJhc2VfY2xhc3MtPmhhbmRsZV9mcmFtZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2cGFja19kZWNfaGFuZGxlX2ZyYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZwYWNrX2RlY19yZXNldCAoR3N0V2F2cGFja0RlYyAqIGRlYykKK3sKKyAgZGVjLT53dl9pZC5idWZmZXIgPSBOVUxMOworICBkZWMtPnd2X2lkLnBvc2l0aW9uID0gZGVjLT53dl9pZC5sZW5ndGggPSAwOworCisgIGRlYy0+Y2hhbm5lbHMgPSAwOworICBkZWMtPmNoYW5uZWxfbWFzayA9IDA7CisgIGRlYy0+c2FtcGxlX3JhdGUgPSAwOworICBkZWMtPmRlcHRoID0gMDsKK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZwYWNrX2RlY19pbml0IChHc3RXYXZwYWNrRGVjICogZGVjKQoreworICBkZWMtPmNvbnRleHQgPSBOVUxMOworICBkZWMtPnN0cmVhbV9yZWFkZXIgPSBnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX25ldyAoKTsKKworICBnc3RfYXVkaW9fZGVjb2Rlcl9zZXRfbmVlZHNfZm9ybWF0IChHU1RfQVVESU9fREVDT0RFUiAoZGVjKSwgVFJVRSk7CisgIGdzdF9hdWRpb19kZWNvZGVyX3NldF91c2VfZGVmYXVsdF9wYWRfYWNjZXB0Y2FwcyAoR1NUX0FVRElPX0RFQ09ERVJfQ0FTVAorICAgICAgKGRlYyksIFRSVUUpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9BVURJT19ERUNPREVSX1NJTktfUEFEIChkZWMpKTsKKworICBnc3Rfd2F2cGFja19kZWNfcmVzZXQgKGRlYyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFja19kZWNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFdhdnBhY2tEZWMgKmRlYyA9IEdTVF9XQVZQQUNLX0RFQyAob2JqZWN0KTsKKworICBnX2ZyZWUgKGRlYy0+c3RyZWFtX3JlYWRlcik7CisgIGRlYy0+c3RyZWFtX3JlYWRlciA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX2RlY19zdGFydCAoR3N0QXVkaW9EZWNvZGVyICogZGVjKQoreworICBHU1RfREVCVUdfT0JKRUNUIChkZWMsICJzdGFydCIpOworCisgIC8qIG5ldmVyIG1pbmQgYSBmZXcgZXJyb3JzICovCisgIGdzdF9hdWRpb19kZWNvZGVyX3NldF9tYXhfZXJyb3JzIChkZWMsIDE2KTsKKyAgLyogZG9uJ3QgYm90aGVyIHVzIHdpdGggZmx1c2hpbmcgKi8KKyAgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X2RyYWluYWJsZSAoZGVjLCBGQUxTRSk7CisgIC8qIGFpbSBmb3Igc29tZSBwZXJmZWN0IHRpbWVzdGFtcGluZyAqLworICBnc3RfYXVkaW9fZGVjb2Rlcl9zZXRfdG9sZXJhbmNlIChkZWMsIDEwICogR1NUX01TRUNPTkQpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX2RlY19zdG9wIChHc3RBdWRpb0RlY29kZXIgKiBkZWMpCit7CisgIEdzdFdhdnBhY2tEZWMgKndwZGVjID0gR1NUX1dBVlBBQ0tfREVDIChkZWMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlYywgInN0b3AiKTsKKworICBpZiAod3BkZWMtPmNvbnRleHQpIHsKKyAgICBXYXZwYWNrQ2xvc2VGaWxlICh3cGRlYy0+Y29udGV4dCk7CisgICAgd3BkZWMtPmNvbnRleHQgPSBOVUxMOworICB9CisKKyAgZ3N0X3dhdnBhY2tfZGVjX3Jlc2V0ICh3cGRlYyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFja19kZWNfbmVnb3RpYXRlIChHc3RXYXZwYWNrRGVjICogZGVjKQoreworICBHc3RBdWRpb0luZm8gaW5mbzsKKyAgR3N0QXVkaW9Gb3JtYXQgZm10OworICBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBwb3NbNjRdID0geyBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9JTlZBTElELCB9OworCisgIC8qIGFycmFuZ2UgZm9yIDEsIDIgb3IgNC1ieXRlIHdpZHRoID09IGRlcHRoIG91dHB1dCAqLworICBkZWMtPndpZHRoID0gZGVjLT5kZXB0aDsKKyAgc3dpdGNoIChkZWMtPmRlcHRoKSB7CisgICAgY2FzZSA4OgorICAgICAgZm10ID0gR1NUX0FVRElPX0ZPUk1BVF9TODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICBmbXQgPSBfR1NUX0FVRElPX0ZPUk1BVF9ORSAoUzE2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ6CisgICAgY2FzZSAzMjoKKyAgICAgIGZtdCA9IF9HU1RfQVVESU9fRk9STUFUX05FIChTMzIpOworICAgICAgZGVjLT53aWR0aCA9IDMyOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZtdCA9IEdTVF9BVURJT19GT1JNQVRfVU5LTk9XTjsKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgYnJlYWs7CisgIH0KKworICBnX2Fzc2VydCAoZGVjLT5jaGFubmVsX21hc2sgIT0gMCk7CisKKyAgaWYgKCFnc3Rfd2F2cGFja19nZXRfY2hhbm5lbF9wb3NpdGlvbnMgKGRlYy0+Y2hhbm5lbHMsCisgICAgICAgICAgZGVjLT5jaGFubmVsX21hc2ssIHBvcykpCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZWMsICJGYWlsZWQgdG8gc2V0IGNoYW5uZWwgbGF5b3V0Iik7CisKKyAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJmluZm8pOworICBnc3RfYXVkaW9faW5mb19zZXRfZm9ybWF0ICgmaW5mbywgZm10LCBkZWMtPnNhbXBsZV9yYXRlLCBkZWMtPmNoYW5uZWxzLCBwb3MpOworCisgIGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b192YWxpZF9vcmRlciAoaW5mby5wb3NpdGlvbiwgaW5mby5jaGFubmVscyk7CisgIGdzdF9hdWRpb19nZXRfY2hhbm5lbF9yZW9yZGVyX21hcCAoaW5mby5jaGFubmVscywKKyAgICAgIGluZm8ucG9zaXRpb24sIHBvcywgZGVjLT5jaGFubmVsX3Jlb3JkZXJfbWFwKTsKKworICAvKiBzaG91bGQgYWx3YXlzIHN1Y2NlZWQgKi8KKyAgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X291dHB1dF9mb3JtYXQgKEdTVF9BVURJT19ERUNPREVSIChkZWMpLCAmaW5mbyk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhY2tfZGVjX3NldF9mb3JtYXQgKEdzdEF1ZGlvRGVjb2RlciAqIGJkZWMsIEdzdENhcHMgKiBjYXBzKQoreworICAvKiBwcmV0dHkgbXVjaCBub3RoaW5nIHRvIGRvIGhlcmUsCisgICAqIHdlJ2xsIHBhcnNlIGl0IGFsbCBmcm9tIHRoZSBzdHJlYW0gYW5kIHNldHVwIHRoZW4gKi8KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZwYWNrX2RlY19wb3N0X3RhZ3MgKEdzdFdhdnBhY2tEZWMgKiBkZWMpCit7CisgIEdzdFRhZ0xpc3QgKmxpc3Q7CisgIEdzdEZvcm1hdCBmb3JtYXRfdGltZSA9IEdTVF9GT1JNQVRfVElNRSwgZm9ybWF0X2J5dGVzID0gR1NUX0ZPUk1BVF9CWVRFUzsKKyAgZ2ludDY0IGR1cmF0aW9uLCBzaXplOworCisgIC8qIHRyeSB0byBlc3RpbWF0ZSB0aGUgYXZlcmFnZSBiaXRyYXRlICovCisgIGlmIChnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKEdTVF9BVURJT19ERUNPREVSX1NJTktfUEFEIChkZWMpLAorICAgICAgICAgIGZvcm1hdF9ieXRlcywgJnNpemUpICYmCisgICAgICBnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKEdTVF9BVURJT19ERUNPREVSX1NJTktfUEFEIChkZWMpLAorICAgICAgICAgIGZvcm1hdF90aW1lLCAmZHVyYXRpb24pICYmIHNpemUgPiAwICYmIGR1cmF0aW9uID4gMCkgeworICAgIGd1aW50NjQgYml0cmF0ZTsKKworICAgIGxpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgICAgYml0cmF0ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoc2l6ZSwgOCAqIEdTVF9TRUNPTkQsIGR1cmF0aW9uKTsKKyAgICBnc3RfdGFnX2xpc3RfYWRkIChsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIEdTVF9UQUdfQklUUkFURSwKKyAgICAgICAgKGd1aW50KSBiaXRyYXRlLCBOVUxMKTsKKyAgICBnc3RfYXVkaW9fZGVjb2Rlcl9tZXJnZV90YWdzIChHU1RfQVVESU9fREVDT0RFUiAoZGVjKSwgbGlzdCwKKyAgICAgICAgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKGxpc3QpOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfd2F2cGFja19kZWNfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0RlY29kZXIgKiBiZGVjLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFdhdnBhY2tEZWMgKmRlYzsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBXYXZwYWNrSGVhZGVyIHdwaDsKKyAgaW50MzJfdCBkZWNvZGVkLCB1bnBhY2tlZF9zaXplOworICBnYm9vbGVhbiBmb3JtYXRfY2hhbmdlZDsKKyAgZ2ludCB3aWR0aCwgZGVwdGgsIGksIGosIG1heDsKKyAgZ2ludDMyICpkZWNfZGF0YSA9IE5VTEw7CisgIGd1aW50OCAqb3V0X2RhdGE7CisgIEdzdE1hcEluZm8gbWFwLCBvbWFwOworCisgIGRlYyA9IEdTVF9XQVZQQUNLX0RFQyAoYmRlYyk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGJ1ZiAhPSBOVUxMLCBHU1RfRkxPV19FUlJPUik7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICAvKiBjaGVjayBpbnB1dCwgd2Ugb25seSBhY2NlcHQgZnJhbWVkIGlucHV0IHdpdGggY29tcGxldGUgY2h1bmtzICovCisgIGlmIChtYXAuc2l6ZSA8IHNpemVvZiAoV2F2cGFja0hlYWRlcikpCisgICAgZ290byBpbnB1dF9ub3RfZnJhbWVkOworCisgIGlmICghZ3N0X3dhdnBhY2tfcmVhZF9oZWFkZXIgKCZ3cGgsIG1hcC5kYXRhKSkKKyAgICBnb3RvIGludmFsaWRfaGVhZGVyOworCisgIGlmIChtYXAuc2l6ZSA8IHdwaC5ja1NpemUgKyA0ICogMSArIDQpCisgICAgZ290byBpbnB1dF9ub3RfZnJhbWVkOworCisgIGlmICghKHdwaC5mbGFncyAmIElOSVRJQUxfQkxPQ0spKQorICAgIGdvdG8gaW5wdXRfbm90X2ZyYW1lZDsKKworICBkZWMtPnd2X2lkLmJ1ZmZlciA9IG1hcC5kYXRhOworICBkZWMtPnd2X2lkLmxlbmd0aCA9IG1hcC5zaXplOworICBkZWMtPnd2X2lkLnBvc2l0aW9uID0gMDsKKworICAvKiBjcmVhdGUgYSBuZXcgd2F2cGFjayBjb250ZXh0IGlmIHRoZXJlIGlzIG5vbmUgeWV0IGJ1dCBpZiB0aGVyZQorICAgKiB3YXMgYWxyZWFkeSBvbmUgKGkuZS4gY2FwcyB3ZXJlIHNldCBvbiB0aGUgc3JjcGFkKSBjaGVjayB3aGV0aGVyCisgICAqIHRoZSBuZXcgb25lIGhhcyB0aGUgc2FtZSBjYXBzICovCisgIGlmICghZGVjLT5jb250ZXh0KSB7CisgICAgZ2NoYXIgZXJyb3JfbXNnWzgwXTsKKworICAgIGRlYy0+Y29udGV4dCA9IFdhdnBhY2tPcGVuRmlsZUlucHV0RXggKGRlYy0+c3RyZWFtX3JlYWRlciwKKyAgICAgICAgJmRlYy0+d3ZfaWQsIE5VTEwsIGVycm9yX21zZywgT1BFTl9TVFJFQU1JTkcsIDApOworCisgICAgLyogZXhwZWN0IHRoaXMgdG8gd29yayAqLworICAgIGlmICghZGVjLT5jb250ZXh0KSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlYywgIkNvdWxkbid0IGRlY29kZSBidWZmZXI6ICVzIiwgZXJyb3JfbXNnKTsKKyAgICAgIGdvdG8gY29udGV4dF9mYWlsZWQ7CisgICAgfQorICB9CisKKyAgZ19hc3NlcnQgKGRlYy0+Y29udGV4dCAhPSBOVUxMKTsKKworICBmb3JtYXRfY2hhbmdlZCA9CisgICAgICAoZGVjLT5zYW1wbGVfcmF0ZSAhPSBXYXZwYWNrR2V0U2FtcGxlUmF0ZSAoZGVjLT5jb250ZXh0KSkgfHwKKyAgICAgIChkZWMtPmNoYW5uZWxzICE9IFdhdnBhY2tHZXROdW1DaGFubmVscyAoZGVjLT5jb250ZXh0KSkgfHwKKyAgICAgIChkZWMtPmRlcHRoICE9IFdhdnBhY2tHZXRCeXRlc1BlclNhbXBsZSAoZGVjLT5jb250ZXh0KSAqIDgpIHx8CisgICAgICAoZGVjLT5jaGFubmVsX21hc2sgIT0gV2F2cGFja0dldENoYW5uZWxNYXNrIChkZWMtPmNvbnRleHQpKTsKKworICBpZiAoIWdzdF9wYWRfaGFzX2N1cnJlbnRfY2FwcyAoR1NUX0FVRElPX0RFQ09ERVJfU1JDX1BBRCAoZGVjKSkgfHwKKyAgICAgIGZvcm1hdF9jaGFuZ2VkKSB7CisgICAgZ2ludCBjaGFubmVsX21hc2s7CisKKyAgICBkZWMtPnNhbXBsZV9yYXRlID0gV2F2cGFja0dldFNhbXBsZVJhdGUgKGRlYy0+Y29udGV4dCk7CisgICAgZGVjLT5jaGFubmVscyA9IFdhdnBhY2tHZXROdW1DaGFubmVscyAoZGVjLT5jb250ZXh0KTsKKyAgICBkZWMtPmRlcHRoID0gV2F2cGFja0dldEJ5dGVzUGVyU2FtcGxlIChkZWMtPmNvbnRleHQpICogODsKKworICAgIGNoYW5uZWxfbWFzayA9IFdhdnBhY2tHZXRDaGFubmVsTWFzayAoZGVjLT5jb250ZXh0KTsKKyAgICBpZiAoY2hhbm5lbF9tYXNrID09IDApCisgICAgICBjaGFubmVsX21hc2sgPSBnc3Rfd2F2cGFja19nZXRfZGVmYXVsdF9jaGFubmVsX21hc2sgKGRlYy0+Y2hhbm5lbHMpOworCisgICAgZGVjLT5jaGFubmVsX21hc2sgPSBjaGFubmVsX21hc2s7CisKKyAgICBnc3Rfd2F2cGFja19kZWNfbmVnb3RpYXRlIChkZWMpOworCisgICAgLyogc2VuZCBHU1RfVEFHX0FVRElPX0NPREVDIGFuZCBHU1RfVEFHX0JJVFJBVEUgdGFncyBiZWZvcmUgc29tZXRoaW5nCisgICAgICogaXMgZGVjb2RlZCBvciBhZnRlciB0aGUgZm9ybWF0IGhhcyBjaGFuZ2VkICovCisgICAgZ3N0X3dhdnBhY2tfZGVjX3Bvc3RfdGFncyAoZGVjKTsKKyAgfQorCisgIC8qIGFsbG9jIG91dHB1dCBidWZmZXIgKi8KKyAgZGVjX2RhdGEgPSBnX21hbGxvYyAoNCAqIHdwaC5ibG9ja19zYW1wbGVzICogZGVjLT5jaGFubmVscyk7CisKKyAgLyogZGVjb2RlICovCisgIGRlY29kZWQgPSBXYXZwYWNrVW5wYWNrU2FtcGxlcyAoZGVjLT5jb250ZXh0LCBkZWNfZGF0YSwgd3BoLmJsb2NrX3NhbXBsZXMpOworICBpZiAoZGVjb2RlZCAhPSB3cGguYmxvY2tfc2FtcGxlcykKKyAgICBnb3RvIGRlY29kZV9lcnJvcjsKKworICB1bnBhY2tlZF9zaXplID0gKGRlYy0+d2lkdGggLyA4KSAqIHdwaC5ibG9ja19zYW1wbGVzICogZGVjLT5jaGFubmVsczsKKyAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICh1bnBhY2tlZF9zaXplKTsKKworICAvKiBsZWdhY3k7IHBhc3MgYWxvbmcgb2Zmc2V0LCB3aGF0ZXZlciB0aGF0IG1pZ2h0IGVudGFpbCAqLworICBHU1RfQlVGRkVSX09GRlNFVCAob3V0YnVmKSA9IEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZvbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgb3V0X2RhdGEgPSBvbWFwLmRhdGE7CisKKyAgd2lkdGggPSBkZWMtPndpZHRoOworICBkZXB0aCA9IGRlYy0+ZGVwdGg7CisgIG1heCA9IGRlYy0+Y2hhbm5lbHMgKiB3cGguYmxvY2tfc2FtcGxlczsKKyAgaWYgKHdpZHRoID09IDgpIHsKKyAgICBnaW50OCAqb3V0YnVmZmVyID0gKGdpbnQ4ICopIG91dF9kYXRhOworICAgIGdpbnQgKnJlb3JkZXJfbWFwID0gZGVjLT5jaGFubmVsX3Jlb3JkZXJfbWFwOworCisgICAgZm9yIChpID0gMDsgaSA8IG1heDsgaSArPSBkZWMtPmNoYW5uZWxzKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgZGVjLT5jaGFubmVsczsgaisrKQorICAgICAgICAqb3V0YnVmZmVyKysgPSAoZ2ludDgpIChkZWNfZGF0YVtpICsgcmVvcmRlcl9tYXBbal1dKTsKKyAgICB9CisgIH0gZWxzZSBpZiAod2lkdGggPT0gMTYpIHsKKyAgICBnaW50MTYgKm91dGJ1ZmZlciA9IChnaW50MTYgKikgb3V0X2RhdGE7CisgICAgZ2ludCAqcmVvcmRlcl9tYXAgPSBkZWMtPmNoYW5uZWxfcmVvcmRlcl9tYXA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWF4OyBpICs9IGRlYy0+Y2hhbm5lbHMpIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBkZWMtPmNoYW5uZWxzOyBqKyspCisgICAgICAgICpvdXRidWZmZXIrKyA9IChnaW50MTYpIChkZWNfZGF0YVtpICsgcmVvcmRlcl9tYXBbal1dKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZGVjLT53aWR0aCA9PSAzMikgeworICAgIGdpbnQzMiAqb3V0YnVmZmVyID0gKGdpbnQzMiAqKSBvdXRfZGF0YTsKKyAgICBnaW50ICpyZW9yZGVyX21hcCA9IGRlYy0+Y2hhbm5lbF9yZW9yZGVyX21hcDsKKworICAgIGlmICh3aWR0aCAhPSBkZXB0aCkgeworICAgICAgZm9yIChpID0gMDsgaSA8IG1heDsgaSArPSBkZWMtPmNoYW5uZWxzKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBkZWMtPmNoYW5uZWxzOyBqKyspCisgICAgICAgICAgKm91dGJ1ZmZlcisrID0KKyAgICAgICAgICAgICAgKGdpbnQzMikgKGRlY19kYXRhW2kgKyByZW9yZGVyX21hcFtqXV0gPDwgKHdpZHRoIC0gZGVwdGgpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpID0gMDsgaSA8IG1heDsgaSArPSBkZWMtPmNoYW5uZWxzKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBkZWMtPmNoYW5uZWxzOyBqKyspCisgICAgICAgICAgKm91dGJ1ZmZlcisrID0gKGdpbnQzMikgKGRlY19kYXRhW2kgKyByZW9yZGVyX21hcFtqXV0pOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgfQorCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm9tYXApOworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBidWYgPSBOVUxMOworCisgIGdfZnJlZSAoZGVjX2RhdGEpOworCisgIHJldCA9IGdzdF9hdWRpb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoYmRlYywgb3V0YnVmLCAxKTsKKworb3V0OgorICBpZiAoYnVmKQorICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZWMsICJmbG93OiAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgfQorCisgIHJldHVybiByZXQ7CisKKy8qIEVSUk9SUyAqLworaW5wdXRfbm90X2ZyYW1lZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZWMsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksICgiRXhwZWN0ZWQgZnJhbWVkIGlucHV0IikpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gb3V0OworICB9CitpbnZhbGlkX2hlYWRlcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZWMsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksICgiSW52YWxpZCB3YXZwYWNrIGhlYWRlciIpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIG91dDsKKyAgfQorY29udGV4dF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfQVVESU9fREVDT0RFUl9FUlJPUiAoYmRlYywgMSwgTElCUkFSWSwgSU5JVCwgKE5VTEwpLAorICAgICAgICAoImVycm9yIGNyZWF0aW5nIFdhdnBhY2sgY29udGV4dCIpLCByZXQpOworICAgIGdvdG8gb3V0OworICB9CitkZWNvZGVfZXJyb3I6CisgIHsKKyAgICBjb25zdCBnY2hhciAqcmVhc29uID0gInVua25vd24iOworCisgICAgaWYgKGRlYy0+Y29udGV4dCkgeworICAgICAgcmVhc29uID0gV2F2cGFja0dldEVycm9yTWVzc2FnZSAoZGVjLT5jb250ZXh0KTsKKyAgICB9IGVsc2UgeworICAgICAgcmVhc29uID0gImNvdWxkbid0IGNyZWF0ZSBkZWNvZGVyIGNvbnRleHQiOworICAgIH0KKyAgICBHU1RfQVVESU9fREVDT0RFUl9FUlJPUiAoYmRlYywgMSwgU1RSRUFNLCBERUNPREUsIChOVUxMKSwKKyAgICAgICAgKCJkZWNvZGluZyBlcnJvcjogJXMiLCByZWFzb24pLCByZXQpOworICAgIGdfZnJlZSAoZGVjX2RhdGEpOworICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT0spCisgICAgICBnc3RfYXVkaW9fZGVjb2Rlcl9maW5pc2hfZnJhbWUgKGJkZWMsIE5VTEwsIDEpOworICAgIGdvdG8gb3V0OworICB9Cit9CisKK2dib29sZWFuCitnc3Rfd2F2cGFja19kZWNfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAid2F2cGFja2RlYyIsCisgICAgICAgICAgR1NUX1JBTktfUFJJTUFSWSwgR1NUX1RZUEVfV0FWUEFDS19ERUMpKQorICAgIHJldHVybiBGQUxTRTsKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF93YXZwYWNrX2RlY19kZWJ1ZywgIndhdnBhY2tkZWMiLCAwLAorICAgICAgIldhdnBhY2sgZGVjb2RlciIpOworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaCBiL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTAwMmI0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2RlYy5oCkBAIC0wLDAgKzEsNzggQEAKKy8qIEdTdHJlYW1lciBXYXZwYWNrIHBsdWdpbgorICogQ29weXJpZ2h0IChjKSAyMDA0IEFyd2VkIHYuIE1lcmthdHogPHYubWVya2F0ekBnbXgubmV0PgorICogQ29weXJpZ2h0IChjKSAyMDA2IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBnc3R3YXZwYWNrZGVjLmg6IHJhdyBXYXZwYWNrIGJpdHN0cmVhbSBkZWNvZGVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9XQVZQQUNLX0RFQ19IX18KKyNkZWZpbmUgX19HU1RfV0FWUEFDS19ERUNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZGVjb2Rlci5oPgorCisjaW5jbHVkZSA8d2F2cGFjay93YXZwYWNrLmg+CisKKyNpbmNsdWRlICJnc3R3YXZwYWNrc3RyZWFtcmVhZGVyLmgiCisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfV0FWUEFDS19ERUMgXAorICAoZ3N0X3dhdnBhY2tfZGVjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9XQVZQQUNLX0RFQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1dBVlBBQ0tfREVDLEdzdFdhdnBhY2tEZWMpKQorI2RlZmluZSBHU1RfV0FWUEFDS19ERUNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfV0FWUEFDS19ERUMsR3N0V2F2cGFja0RlY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1dBVlBBQ0tfREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfV0FWUEFDS19ERUMpKQorI2RlZmluZSBHU1RfSVNfV0FWUEFDS19ERUNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfV0FWUEFDS19ERUMpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFdhdnBhY2tEZWMgR3N0V2F2cGFja0RlYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RXYXZwYWNrRGVjQ2xhc3MgR3N0V2F2cGFja0RlY0NsYXNzOworCitzdHJ1Y3QgX0dzdFdhdnBhY2tEZWMKK3sKKyAgR3N0QXVkaW9EZWNvZGVyIGVsZW1lbnQ7CisKKyAgLyo8IHByaXZhdGUgPiAqLworCisgIFdhdnBhY2tDb250ZXh0ICpjb250ZXh0OworICBXYXZwYWNrU3RyZWFtUmVhZGVyICpzdHJlYW1fcmVhZGVyOworCisgIHJlYWRfaWQgd3ZfaWQ7CisKKyAgZ2ludCBzYW1wbGVfcmF0ZTsKKyAgZ2ludCBkZXB0aDsKKyAgZ2ludCB3aWR0aDsKKyAgZ2ludCBjaGFubmVsczsKKyAgZ2ludCBjaGFubmVsX21hc2s7CisKKyAgZ2ludCBjaGFubmVsX3Jlb3JkZXJfbWFwWzY0XTsKKworfTsKKworc3RydWN0IF9Hc3RXYXZwYWNrRGVjQ2xhc3MKK3sKKyAgR3N0QXVkaW9EZWNvZGVyQ2xhc3MgcGFyZW50OworfTsKKworR1R5cGUgZ3N0X3dhdnBhY2tfZGVjX2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3dhdnBhY2tfZGVjX3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1dBVlBBQ0tfREVDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jIGIvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNjIwNWMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvd2F2cGFjay9nc3R3YXZwYWNrZW5jLmMKQEAgLTAsMCArMSwxMDA1IEBACisvKiBHU3RyZWFtZXIgV2F2cGFjayBlbmNvZGVyIHBsdWdpbgorICogQ29weXJpZ2h0IChjKSAyMDA2IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBnc3R3YXZwYWNrZGVjLmM6IFdhdnBhY2sgYXVkaW8gZW5jb2RlcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXdhdnBhY2tlbmMKKyAqCisgKiBXYXZwYWNrRW5jIGVuY29kZXMgcmF3IGF1ZGlvIGludG8gYSBmcmFtZWQgV2F2cGFjayBzdHJlYW0uCisgKiA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LndhdnBhY2suY29tLyI+V2F2cGFjazwvdWxpbms+IGlzIGFuIG9wZW4tc291cmNlCisgKiBhdWRpbyBjb2RlYyB0aGF0IGZlYXR1cmVzIGJvdGggbG9zc2xlc3MgYW5kIGxvc3N5IGVuY29kaW5nLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBhdWRpb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9NTAwICEgYXVkaW9jb252ZXJ0ICEgd2F2cGFja2VuYyAhIGZpbGVzaW5rIGxvY2F0aW9uPXNpbmV3YXZlLnd2CisgKiBdfCBUaGlzIHBpcGVsaW5lIGVuY29kZXMgYXVkaW8gZnJvbSBhdWRpb3Rlc3RzcmMgaW50byBhIFdhdnBhY2sgZmlsZS4gVGhlIGF1ZGlvY29udmVydCBlbGVtZW50IGlzIG5lZWRlZAorICogYXMgdGhlIFdhdnBhY2sgZW5jb2RlciBvbmx5IGFjY2VwdHMgaW5wdXQgd2l0aCAzMiBiaXQgd2lkdGguCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgY2RkYTovLzEgISBhdWRpb2NvbnZlcnQgISB3YXZwYWNrZW5jICEgZmlsZXNpbmsgbG9jYXRpb249dHJhY2sxLnd2CisgKiBdfCBUaGlzIHBpcGVsaW5lIGVuY29kZXMgYXVkaW8gZnJvbSBhbiBhdWRpbyBDRCBpbnRvIGEgV2F2cGFjayBmaWxlIHVzaW5nCisgKiBsb3NzbGVzcyBlbmNvZGluZyAodGhlIGZpbGUgb3V0cHV0IHdpbGwgYmUgZmFpcmx5IGxhcmdlKS4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBjZGRhOi8vMSAhIGF1ZGlvY29udmVydCAhIHdhdnBhY2tlbmMgYml0cmF0ZT0xMjgwMDAgISBmaWxlc2luayBsb2NhdGlvbj10cmFjazEud3YKKyAqIF18IFRoaXMgcGlwZWxpbmUgZW5jb2RlcyBhdWRpbyBmcm9tIGFuIGF1ZGlvIENEIGludG8gYSBXYXZwYWNrIGZpbGUgdXNpbmcKKyAqIGxvc3N5IGVuY29kaW5nIGF0IGEgY2VydGFpbiBiaXRyYXRlICh0aGUgZmlsZSB3aWxsIGJlIGZhaXJseSBzbWFsbCkuCisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qCisgKiBUT0RPOiAtIGFkZCAzMiBiaXQgZmxvYXQgbW9kZS4gQ09ORklHX0ZMT0FUX0RBVEEKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdsaWIvZ3ByaW50Zi5oPgorCisjaW5jbHVkZSA8d2F2cGFjay93YXZwYWNrLmg+CisjaW5jbHVkZSAiZ3N0d2F2cGFja2VuYy5oIgorI2luY2x1ZGUgImdzdHdhdnBhY2tjb21tb24uaCIKKworc3RhdGljIGdib29sZWFuIGdzdF93YXZwYWNrX2VuY19zdGFydCAoR3N0QXVkaW9FbmNvZGVyICogZW5jKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfd2F2cGFja19lbmNfc3RvcCAoR3N0QXVkaW9FbmNvZGVyICogZW5jKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfd2F2cGFja19lbmNfc2V0X2Zvcm1hdCAoR3N0QXVkaW9FbmNvZGVyICogZW5jLAorICAgIEdzdEF1ZGlvSW5mbyAqIGluZm8pOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3dhdnBhY2tfZW5jX2hhbmRsZV9mcmFtZSAoR3N0QXVkaW9FbmNvZGVyICogZW5jLAorICAgIEdzdEJ1ZmZlciAqIGluX2J1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3dhdnBhY2tfZW5jX3NpbmtfZXZlbnQgKEdzdEF1ZGlvRW5jb2RlciAqIGVuYywKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIGludCBnc3Rfd2F2cGFja19lbmNfcHVzaF9ibG9jayAodm9pZCAqaWQsIHZvaWQgKmRhdGEsIGludDMyX3QgY291bnQpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3dhdnBhY2tfZW5jX2RyYWluIChHc3RXYXZwYWNrRW5jICogZW5jKTsKKworc3RhdGljIHZvaWQgZ3N0X3dhdnBhY2tfZW5jX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF93YXZwYWNrX2VuY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK2VudW0KK3sKKyAgQVJHXzAsCisgIEFSR19NT0RFLAorICBBUkdfQklUUkFURSwKKyAgQVJHX0JJVFNQRVJTQU1QTEUsCisgIEFSR19DT1JSRUNUSU9OX01PREUsCisgIEFSR19NRDUsCisgIEFSR19FWFRSQV9QUk9DRVNTSU5HLAorICBBUkdfSk9JTlRfU1RFUkVPX01PREUKK307CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF93YXZwYWNrX2VuY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3Rfd2F2cGFja19lbmNfZGVidWcKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzMyKSAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDggXSwgIiAicmF0ZSA9IChpbnQpIFsgNjAwMCwgMTkyMDAwIF0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXdhdnBhY2ssICIKKyAgICAgICAgImRlcHRoID0gKGludCkgWyAxLCAzMiBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgOCBdLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyA2MDAwLCAxOTIwMDAgXSwgIiAiZnJhbWVkID0gKGJvb2xlYW4pIFRSVUUiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSB3dmNzcmNfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgid3Zjc3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXdhdnBhY2stY29ycmVjdGlvbiwgIiAiZnJhbWVkID0gKGJvb2xlYW4pIFRSVUUiKQorICAgICk7CisKK2VudW0KK3sKKyAgR1NUX1dBVlBBQ0tfRU5DX01PREVfVkVSWV9GQVNUID0gMCwKKyAgR1NUX1dBVlBBQ0tfRU5DX01PREVfRkFTVCwKKyAgR1NUX1dBVlBBQ0tfRU5DX01PREVfREVGQVVMVCwKKyAgR1NUX1dBVlBBQ0tfRU5DX01PREVfSElHSCwKKyAgR1NUX1dBVlBBQ0tfRU5DX01PREVfVkVSWV9ISUdICit9OworCisjZGVmaW5lIEdTVF9UWVBFX1dBVlBBQ0tfRU5DX01PREUgKGdzdF93YXZwYWNrX2VuY19tb2RlX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3Rfd2F2cGFja19lbmNfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHF0eXBlID0gMDsKKworICBpZiAocXR5cGUgPT0gMCkgeworICAgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHZhbHVlc1tdID0geworI2lmIDAKKyAgICAgIC8qIFZlcnkgRmFzdCBDb21wcmVzc2lvbiBpcyBub3Qgc3VwcG9ydGVkIHlldCwgYnV0IHdpbGwgYmUgc3VwcG9ydGVkCisgICAgICAgKiBpbiBmdXR1cmUgd2F2cGFjayB2ZXJzaW9ucyAqLworICAgICAge0dTVF9XQVZQQUNLX0VOQ19NT0RFX1ZFUllfRkFTVCwgIlZlcnkgRmFzdCBDb21wcmVzc2lvbiIsICJ2ZXJ5ZmFzdCJ9LAorI2VuZGlmCisgICAgICB7R1NUX1dBVlBBQ0tfRU5DX01PREVfRkFTVCwgIkZhc3QgQ29tcHJlc3Npb24iLCAiZmFzdCJ9LAorICAgICAge0dTVF9XQVZQQUNLX0VOQ19NT0RFX0RFRkFVTFQsICJOb3JtYWwgQ29tcHJlc3Npb24iLCAibm9ybWFsIn0sCisgICAgICB7R1NUX1dBVlBBQ0tfRU5DX01PREVfSElHSCwgIkhpZ2ggQ29tcHJlc3Npb24iLCAiaGlnaCJ9LAorICAgICAge0dTVF9XQVZQQUNLX0VOQ19NT0RFX1ZFUllfSElHSCwgIlZlcnkgSGlnaCBDb21wcmVzc2lvbiIsICJ2ZXJ5aGlnaCJ9LAorICAgICAgezAsIE5VTEwsIE5VTEx9CisgICAgfTsKKworICAgIHF0eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFdhdnBhY2tFbmNNb2RlIiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gcXR5cGU7Cit9CisKK2VudW0KK3sKKyAgR1NUX1dBVlBBQ0tfQ09SUkVDVElPTl9NT0RFX09GRiA9IDAsCisgIEdTVF9XQVZQQUNLX0NPUlJFQ1RJT05fTU9ERV9PTiwKKyAgR1NUX1dBVlBBQ0tfQ09SUkVDVElPTl9NT0RFX09QVElNSVpFRAorfTsKKworI2RlZmluZSBHU1RfVFlQRV9XQVZQQUNLX0VOQ19DT1JSRUNUSU9OX01PREUgKGdzdF93YXZwYWNrX2VuY19jb3JyZWN0aW9uX21vZGVfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF93YXZwYWNrX2VuY19jb3JyZWN0aW9uX21vZGVfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBxdHlwZSA9IDA7CisKKyAgaWYgKHF0eXBlID09IDApIHsKKyAgICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSB2YWx1ZXNbXSA9IHsKKyAgICAgIHtHU1RfV0FWUEFDS19DT1JSRUNUSU9OX01PREVfT0ZGLCAiQ3JlYXRlIG5vIGNvcnJlY3Rpb24gZmlsZSIsICJvZmYifSwKKyAgICAgIHtHU1RfV0FWUEFDS19DT1JSRUNUSU9OX01PREVfT04sICJDcmVhdGUgY29ycmVjdGlvbiBmaWxlIiwgIm9uIn0sCisgICAgICB7R1NUX1dBVlBBQ0tfQ09SUkVDVElPTl9NT0RFX09QVElNSVpFRCwKKyAgICAgICAgICAiQ3JlYXRlIG9wdGltaXplZCBjb3JyZWN0aW9uIGZpbGUiLCAib3B0aW1pemVkIn0sCisgICAgICB7MCwgTlVMTCwgTlVMTH0KKyAgICB9OworCisgICAgcXR5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0V2F2cGFja0VuY0NvcnJlY3Rpb25Nb2RlIiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gcXR5cGU7Cit9CisKK2VudW0KK3sKKyAgR1NUX1dBVlBBQ0tfSlNfTU9ERV9BVVRPID0gMCwKKyAgR1NUX1dBVlBBQ0tfSlNfTU9ERV9MRUZUX1JJR0hULAorICBHU1RfV0FWUEFDS19KU19NT0RFX01JRF9TSURFCit9OworCisjZGVmaW5lIEdTVF9UWVBFX1dBVlBBQ0tfRU5DX0pPSU5UX1NURVJFT19NT0RFIChnc3Rfd2F2cGFja19lbmNfam9pbnRfc3RlcmVvX21vZGVfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF93YXZwYWNrX2VuY19qb2ludF9zdGVyZW9fbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHF0eXBlID0gMDsKKworICBpZiAocXR5cGUgPT0gMCkgeworICAgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHZhbHVlc1tdID0geworICAgICAge0dTVF9XQVZQQUNLX0pTX01PREVfQVVUTywgImF1dG8iLCAiYXV0byJ9LAorICAgICAge0dTVF9XQVZQQUNLX0pTX01PREVfTEVGVF9SSUdIVCwgImxlZnQvcmlnaHQiLCAibGVmdHJpZ2h0In0sCisgICAgICB7R1NUX1dBVlBBQ0tfSlNfTU9ERV9NSURfU0lERSwgIm1pZC9zaWRlIiwgIm1pZHNpZGUifSwKKyAgICAgIHswLCBOVUxMLCBOVUxMfQorICAgIH07CisKKyAgICBxdHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RXYXZwYWNrRW5jSlNNb2RlIiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gcXR5cGU7Cit9CisKKyNkZWZpbmUgZ3N0X3dhdnBhY2tfZW5jX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFdhdnBhY2tFbmMsIGdzdF93YXZwYWNrX2VuYywgR1NUX1RZUEVfQVVESU9fRU5DT0RFUik7CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFja19lbmNfY2xhc3NfaW5pdCAoR3N0V2F2cGFja0VuY0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikgKGtsYXNzKTsKKyAgR3N0QXVkaW9FbmNvZGVyQ2xhc3MgKmJhc2VfY2xhc3MgPSAoR3N0QXVkaW9FbmNvZGVyQ2xhc3MgKikgKGtsYXNzKTsKKworICAvKiBhZGQgcGFkIHRlbXBsYXRlcyAqLworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnd2Y3NyY19mYWN0b3J5KTsKKworICAvKiBzZXQgZWxlbWVudCBkZXRhaWxzICovCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJXYXZwYWNrIGF1ZGlvIGVuY29kZXIiLAorICAgICAgIkNvZGVjL0VuY29kZXIvQXVkaW8iLAorICAgICAgIkVuY29kZXMgYXVkaW8gd2l0aCB0aGUgV2F2cGFjayBsb3NzbGVzcy9sb3NzeSBhdWRpbyBjb2RlYyIsCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPiIpOworCisgIC8qIHNldCBwcm9wZXJ0eSBoYW5kbGVycyAqLworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3Rfd2F2cGFja19lbmNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfd2F2cGFja19lbmNfZ2V0X3Byb3BlcnR5OworCisgIGJhc2VfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZwYWNrX2VuY19zdGFydCk7CisgIGJhc2VfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdnBhY2tfZW5jX3N0b3ApOworICBiYXNlX2NsYXNzLT5zZXRfZm9ybWF0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZwYWNrX2VuY19zZXRfZm9ybWF0KTsKKyAgYmFzZV9jbGFzcy0+aGFuZGxlX2ZyYW1lID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZwYWNrX2VuY19oYW5kbGVfZnJhbWUpOworICBiYXNlX2NsYXNzLT5zaW5rX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZwYWNrX2VuY19zaW5rX2V2ZW50KTsKKworICAvKiBpbnN0YWxsIGFsbCBwcm9wZXJ0aWVzICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIEFSR19NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJtb2RlIiwgIkVuY29kaW5nIG1vZGUiLAorICAgICAgICAgICJTcGVlZCB2ZXJzdXMgY29tcHJlc3Npb24gdHJhZGVvZmYuIiwKKyAgICAgICAgICBHU1RfVFlQRV9XQVZQQUNLX0VOQ19NT0RFLCBHU1RfV0FWUEFDS19FTkNfTU9ERV9ERUZBVUxULAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBBUkdfQklUUkFURSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiYml0cmF0ZSIsICJCaXRyYXRlIiwKKyAgICAgICAgICAiVHJ5IHRvIGVuY29kZSB3aXRoIHRoaXMgYXZlcmFnZSBiaXRyYXRlIChiaXRzL3NlYykuICIKKyAgICAgICAgICAiVGhpcyBlbmFibGVzIGxvc3N5IGVuY29kaW5nLCB2YWx1ZXMgc21hbGxlciB0aGFuIDI0MDAwIGRpc2FibGUgaXQgYWdhaW4uIiwKKyAgICAgICAgICAwLCA5NjAwMDAwLCAwLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgQVJHX0JJVFNQRVJTQU1QTEUsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYml0cy1wZXItc2FtcGxlIiwgIkJpdHMgcGVyIHNhbXBsZSIsCisgICAgICAgICAgIlRyeSB0byBlbmNvZGUgd2l0aCB0aGlzIGFtb3VudCBvZiBiaXRzIHBlciBzYW1wbGUuICIKKyAgICAgICAgICAiVGhpcyBlbmFibGVzIGxvc3N5IGVuY29kaW5nLCB2YWx1ZXMgc21hbGxlciB0aGFuIDIuMCBkaXNhYmxlIGl0IGFnYWluLiIsCisgICAgICAgICAgMC4wLCAyNC4wLCAwLjAsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBBUkdfQ09SUkVDVElPTl9NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJjb3JyZWN0aW9uLW1vZGUiLCAiQ29ycmVjdGlvbiBzdHJlYW0gbW9kZSIsCisgICAgICAgICAgIlVzZSB0aGlzIG1vZGUgZm9yIHRoZSBjb3JyZWN0aW9uIHN0cmVhbS4gT25seSB3b3JrcyBpbiBsb3NzeSBtb2RlISIsCisgICAgICAgICAgR1NUX1RZUEVfV0FWUEFDS19FTkNfQ09SUkVDVElPTl9NT0RFLCBHU1RfV0FWUEFDS19DT1JSRUNUSU9OX01PREVfT0ZGLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBBUkdfTUQ1LAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJtZDUiLCAiTUQ1IiwKKyAgICAgICAgICAiU3RvcmUgTUQ1IGhhc2ggb2YgcmF3IHNhbXBsZXMgd2l0aGluIHRoZSBmaWxlLiIsIEZBTFNFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBBUkdfRVhUUkFfUFJPQ0VTU0lORywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiZXh0cmEtcHJvY2Vzc2luZyIsICJFeHRyYSBwcm9jZXNzaW5nIiwKKyAgICAgICAgICAiVXNlIGJldHRlciBidXQgc2xvd2VyIGZpbHRlcnMgZm9yIGJldHRlciBjb21wcmVzc2lvbi9xdWFsaXR5LiIsCisgICAgICAgICAgMCwgNiwgMCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIEFSR19KT0lOVF9TVEVSRU9fTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgiam9pbnQtc3RlcmVvLW1vZGUiLCAiSm9pbnQtU3RlcmVvIG1vZGUiLAorICAgICAgICAgICJVc2UgdGhpcyBqb2ludC1zdGVyZW8gbW9kZS4iLCBHU1RfVFlQRV9XQVZQQUNLX0VOQ19KT0lOVF9TVEVSRU9fTU9ERSwKKyAgICAgICAgICBHU1RfV0FWUEFDS19KU19NT0RFX0FVVE8sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFja19lbmNfcmVzZXQgKEdzdFdhdnBhY2tFbmMgKiBlbmMpCit7CisgIC8qIGNsb3NlIGFuZCBmcmVlIGV2ZXJ5dGhpbmcgc3RyZWFtIHJlbGF0ZWQgaWYgd2UgYWxyZWFkeSBkaWQgc29tZXRoaW5nICovCisgIGlmIChlbmMtPndwX2NvbnRleHQpIHsKKyAgICBXYXZwYWNrQ2xvc2VGaWxlIChlbmMtPndwX2NvbnRleHQpOworICAgIGVuYy0+d3BfY29udGV4dCA9IE5VTEw7CisgIH0KKyAgaWYgKGVuYy0+d3BfY29uZmlnKSB7CisgICAgZ19mcmVlIChlbmMtPndwX2NvbmZpZyk7CisgICAgZW5jLT53cF9jb25maWcgPSBOVUxMOworICB9CisgIGlmIChlbmMtPmZpcnN0X2Jsb2NrKSB7CisgICAgZ19mcmVlIChlbmMtPmZpcnN0X2Jsb2NrKTsKKyAgICBlbmMtPmZpcnN0X2Jsb2NrID0gTlVMTDsKKyAgfQorICBlbmMtPmZpcnN0X2Jsb2NrX3NpemUgPSAwOworICBpZiAoZW5jLT5tZDVfY29udGV4dCkgeworICAgIGdfY2hlY2tzdW1fZnJlZSAoZW5jLT5tZDVfY29udGV4dCk7CisgICAgZW5jLT5tZDVfY29udGV4dCA9IE5VTEw7CisgIH0KKyAgaWYgKGVuYy0+cGVuZGluZ19zZWdtZW50KQorICAgIGdzdF9ldmVudF91bnJlZiAoZW5jLT5wZW5kaW5nX3NlZ21lbnQpOworICBlbmMtPnBlbmRpbmdfc2VnbWVudCA9IE5VTEw7CisKKyAgaWYgKGVuYy0+cGVuZGluZ19idWZmZXIpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChlbmMtPnBlbmRpbmdfYnVmZmVyKTsKKyAgICBlbmMtPnBlbmRpbmdfYnVmZmVyID0gTlVMTDsKKyAgICBlbmMtPnBlbmRpbmdfb2Zmc2V0ID0gMDsKKyAgfQorCisgIC8qIHJlc2V0IHRoZSBsYXN0IHJldHVybnMgdG8gR1NUX0ZMT1dfT0suIFRoaXMgaXMgb25seSBzZXQgdG8gc29tZXRoaW5nIGVsc2UKKyAgICogd2hpbGUgV2F2cGFja1BhY2tTYW1wbGVzKCkgb3IgbW9yZSBzcGVjaWZpYyBnc3Rfd2F2cGFja19lbmNfcHVzaF9ibG9jaygpCisgICAqIHNvIG5vdCB2YWxpZCBhbnltb3JlICovCisgIGVuYy0+c3JjcGFkX2xhc3RfcmV0dXJuID0gZW5jLT53dmNzcmNwYWRfbGFzdF9yZXR1cm4gPSBHU1RfRkxPV19PSzsKKworICAvKiByZXNldCBzdHJlYW0gaW5mb3JtYXRpb24gKi8KKyAgZW5jLT5zYW1wbGVyYXRlID0gMDsKKyAgZW5jLT5kZXB0aCA9IDA7CisgIGVuYy0+Y2hhbm5lbHMgPSAwOworICBlbmMtPmNoYW5uZWxfbWFzayA9IDA7CisgIGVuYy0+bmVlZF9jaGFubmVsX3JlbWFwID0gRkFMU0U7CisKKyAgZW5jLT50aW1lc3RhbXBfb2Zmc2V0ID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgZW5jLT5uZXh0X3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZwYWNrX2VuY19pbml0IChHc3RXYXZwYWNrRW5jICogZW5jKQoreworICBHc3RBdWRpb0VuY29kZXIgKmJlbmMgPSBHU1RfQVVESU9fRU5DT0RFUiAoZW5jKTsKKworICAvKiBpbml0aWFsaXplIG9iamVjdCBhdHRyaWJ1dGVzICovCisgIGVuYy0+d3BfY29uZmlnID0gTlVMTDsKKyAgZW5jLT53cF9jb250ZXh0ID0gTlVMTDsKKyAgZW5jLT5maXJzdF9ibG9jayA9IE5VTEw7CisgIGVuYy0+bWQ1X2NvbnRleHQgPSBOVUxMOworICBnc3Rfd2F2cGFja19lbmNfcmVzZXQgKGVuYyk7CisKKyAgZW5jLT53dl9pZC5jb3JyZWN0aW9uID0gRkFMU0U7CisgIGVuYy0+d3ZfaWQud2F2cGFja19lbmMgPSBlbmM7CisgIGVuYy0+d3ZfaWQucGFzc3Rocm91Z2ggPSBGQUxTRTsKKyAgZW5jLT53dmNfaWQuY29ycmVjdGlvbiA9IFRSVUU7CisgIGVuYy0+d3ZjX2lkLndhdnBhY2tfZW5jID0gZW5jOworICBlbmMtPnd2Y19pZC5wYXNzdGhyb3VnaCA9IEZBTFNFOworCisgIC8qIHNldCBkZWZhdWx0IHZhbHVlcyBvZiBwYXJhbXMgKi8KKyAgZW5jLT5tb2RlID0gR1NUX1dBVlBBQ0tfRU5DX01PREVfREVGQVVMVDsKKyAgZW5jLT5iaXRyYXRlID0gMDsKKyAgZW5jLT5icHMgPSAwLjA7CisgIGVuYy0+Y29ycmVjdGlvbl9tb2RlID0gR1NUX1dBVlBBQ0tfQ09SUkVDVElPTl9NT0RFX09GRjsKKyAgZW5jLT5tZDUgPSBGQUxTRTsKKyAgZW5jLT5leHRyYV9wcm9jZXNzaW5nID0gMDsKKyAgZW5jLT5qb2ludF9zdGVyZW9fbW9kZSA9IEdTVF9XQVZQQUNLX0pTX01PREVfQVVUTzsKKworICAvKiByZXF1aXJlIHBlcmZlY3QgdHMgKi8KKyAgZ3N0X2F1ZGlvX2VuY29kZXJfc2V0X3BlcmZlY3RfdGltZXN0YW1wIChiZW5jLCBUUlVFKTsKKworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9BVURJT19FTkNPREVSX1NJTktfUEFEIChlbmMpKTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX2VuY19zdGFydCAoR3N0QXVkaW9FbmNvZGVyICogZW5jKQoreworICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJzdGFydCIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX2VuY19zdG9wIChHc3RBdWRpb0VuY29kZXIgKiBlbmMpCit7CisgIEdzdFdhdnBhY2tFbmMgKndwZW5jID0gR1NUX1dBVlBBQ0tfRU5DIChlbmMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgInN0b3AiKTsKKyAgZ3N0X3dhdnBhY2tfZW5jX3Jlc2V0ICh3cGVuYyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhY2tfZW5jX3NldF9mb3JtYXQgKEdzdEF1ZGlvRW5jb2RlciAqIGJlbmMsIEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIEdzdFdhdnBhY2tFbmMgKmVuYyA9IEdTVF9XQVZQQUNLX0VOQyAoYmVuYyk7CisgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICpwb3M7CisgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIG9wb3NbNjRdID0geyBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9JTlZBTElELCB9OworICBHc3RDYXBzICpjYXBzOworICBndWludDY0IG1hc2sgPSAwOworCisgIC8qIHdlIG1heSBiZSBjb25maWd1cmVkIGFnYWluLCBidXQgdGhhdCBjaGFuZ2Ugc2hvdWxkIGhhdmUgY2xlYW51cCBjb250ZXh0ICovCisgIGdfYXNzZXJ0IChlbmMtPndwX2NvbnRleHQgPT0gTlVMTCk7CisKKyAgZW5jLT5jaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChpbmZvKTsKKyAgZW5jLT5kZXB0aCA9IEdTVF9BVURJT19JTkZPX0RFUFRIIChpbmZvKTsKKyAgZW5jLT5zYW1wbGVyYXRlID0gR1NUX0FVRElPX0lORk9fUkFURSAoaW5mbyk7CisKKyAgcG9zID0gaW5mby0+cG9zaXRpb247CisgIGdfYXNzZXJ0IChwb3MpOworCisgIC8qIElmIG9uZSBjaGFubmVsIGlzIE5PTkUgdGhleSdsbCBiZSBhbGwgdW5kZWZpbmVkICovCisgIGlmIChwb3MgIT0gTlVMTCAmJiBwb3NbMF0gPT0gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORSkgeworICAgIGdvdG8gaW52YWxpZF9jaGFubmVsczsKKyAgfQorCisgIGVuYy0+Y2hhbm5lbF9tYXNrID0KKyAgICAgIGdzdF93YXZwYWNrX2dldF9jaGFubmVsX21hc2tfZnJvbV9wb3NpdGlvbnMgKHBvcywgZW5jLT5jaGFubmVscyk7CisgIGVuYy0+bmVlZF9jaGFubmVsX3JlbWFwID0KKyAgICAgIGdzdF93YXZwYWNrX3NldF9jaGFubmVsX21hcHBpbmcgKHBvcywgZW5jLT5jaGFubmVscywKKyAgICAgIGVuYy0+Y2hhbm5lbF9tYXBwaW5nKTsKKworICAvKiB3YXZwYWNrIGNhcHMgaG9sZCBnc3QgbWFzaywgbm90IHdhdnBhY2sgbWFzayAqLworICBnc3RfYXVkaW9fY2hhbm5lbF9wb3NpdGlvbnNfdG9fbWFzayAob3BvcywgZW5jLT5jaGFubmVscywgRkFMU0UsICZtYXNrKTsKKworICAvKiBzZXQgZml4ZWQgc3JjIHBhZCBjYXBzIG5vdyB0aGF0IHdlIGtub3cgd2hhdCB3ZSB3aWxsIGdldCAqLworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtd2F2cGFjayIsCisgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBlbmMtPmNoYW5uZWxzLAorICAgICAgInJhdGUiLCBHX1RZUEVfSU5ULCBlbmMtPnNhbXBsZXJhdGUsCisgICAgICAiZGVwdGgiLCBHX1RZUEVfSU5ULCBlbmMtPmRlcHRoLCAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworCisgIGlmIChtYXNrKQorICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjaGFubmVsLW1hc2siLCBHU1RfVFlQRV9CSVRNQVNLLCBtYXNrLCBOVUxMKTsKKworICBpZiAoIWdzdF9hdWRpb19lbmNvZGVyX3NldF9vdXRwdXRfZm9ybWF0IChiZW5jLCBjYXBzKSkKKyAgICBnb3RvIHNldHRpbmdfc3JjX2NhcHNfZmFpbGVkOworCisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAvKiBubyBzcGVjaWFsIGZlZWRiYWNrIHRvIGJhc2UgY2xhc3M7IHNob3VsZCBwcm92aWRlIGFsbCBhdmFpbGFibGUgc2FtcGxlcyAqLworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworc2V0dGluZ19zcmNfY2Fwc19mYWlsZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsCisgICAgICAgICJDb3VsZG4ndCBzZXQgY2FwcyBvbiBzb3VyY2UgcGFkOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQoraW52YWxpZF9jaGFubmVsczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgImlucHV0IGhhcyBpbnZhbGlkIGNoYW5uZWwgbGF5b3V0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFja19lbmNfc2V0X3dwX2NvbmZpZyAoR3N0V2F2cGFja0VuYyAqIGVuYykKK3sKKyAgZW5jLT53cF9jb25maWcgPSBnX25ldzAgKFdhdnBhY2tDb25maWcsIDEpOworICAvKiBzZXQgZ2VuZXJhbCBzdHJlYW0gaW5mb3JtYXRpb25zIGluIHRoZSBXYXZwYWNrQ29uZmlnICovCisgIGVuYy0+d3BfY29uZmlnLT5ieXRlc19wZXJfc2FtcGxlID0gR1NUX1JPVU5EX1VQXzggKGVuYy0+ZGVwdGgpIC8gODsKKyAgZW5jLT53cF9jb25maWctPmJpdHNfcGVyX3NhbXBsZSA9IGVuYy0+ZGVwdGg7CisgIGVuYy0+d3BfY29uZmlnLT5udW1fY2hhbm5lbHMgPSBlbmMtPmNoYW5uZWxzOworICBlbmMtPndwX2NvbmZpZy0+Y2hhbm5lbF9tYXNrID0gZW5jLT5jaGFubmVsX21hc2s7CisgIGVuYy0+d3BfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IGVuYy0+c2FtcGxlcmF0ZTsKKworICAvKgorICAgKiBTZXQgcGFyYW1ldGVycyBpbiBXYXZwYWNrQ29uZmlnCisgICAqLworCisgIC8qIEVuY29kaW5nIG1vZGUgKi8KKyAgc3dpdGNoIChlbmMtPm1vZGUpIHsKKyNpZiAwCisgICAgY2FzZSBHU1RfV0FWUEFDS19FTkNfTU9ERV9WRVJZX0ZBU1Q6CisgICAgICBlbmMtPndwX2NvbmZpZy0+ZmxhZ3MgfD0gQ09ORklHX1ZFUllfRkFTVF9GTEFHOworICAgICAgZW5jLT53cF9jb25maWctPmZsYWdzIHw9IENPTkZJR19GQVNUX0ZMQUc7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgR1NUX1dBVlBBQ0tfRU5DX01PREVfRkFTVDoKKyAgICAgIGVuYy0+d3BfY29uZmlnLT5mbGFncyB8PSBDT05GSUdfRkFTVF9GTEFHOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfV0FWUEFDS19FTkNfTU9ERV9ERUZBVUxUOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfV0FWUEFDS19FTkNfTU9ERV9ISUdIOgorICAgICAgZW5jLT53cF9jb25maWctPmZsYWdzIHw9IENPTkZJR19ISUdIX0ZMQUc7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9XQVZQQUNLX0VOQ19NT0RFX1ZFUllfSElHSDoKKyAgICAgIGVuYy0+d3BfY29uZmlnLT5mbGFncyB8PSBDT05GSUdfSElHSF9GTEFHOworICAgICAgZW5jLT53cF9jb25maWctPmZsYWdzIHw9IENPTkZJR19WRVJZX0hJR0hfRkxBRzsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogQml0cmF0ZSwgZW5hYmxlcyBsb3NzeSBtb2RlICovCisgIGlmIChlbmMtPmJpdHJhdGUpIHsKKyAgICBlbmMtPndwX2NvbmZpZy0+ZmxhZ3MgfD0gQ09ORklHX0hZQlJJRF9GTEFHOworICAgIGVuYy0+d3BfY29uZmlnLT5mbGFncyB8PSBDT05GSUdfQklUUkFURV9LQlBTOworICAgIGVuYy0+d3BfY29uZmlnLT5iaXRyYXRlID0gZW5jLT5iaXRyYXRlIC8gMTAwMC4wOworICB9IGVsc2UgaWYgKGVuYy0+YnBzKSB7CisgICAgZW5jLT53cF9jb25maWctPmZsYWdzIHw9IENPTkZJR19IWUJSSURfRkxBRzsKKyAgICBlbmMtPndwX2NvbmZpZy0+Yml0cmF0ZSA9IGVuYy0+YnBzOworICB9CisKKyAgLyogQ29ycmVjdGlvbiBNb2RlLCBvbmx5IGluIGxvc3N5IG1vZGUgKi8KKyAgaWYgKGVuYy0+d3BfY29uZmlnLT5mbGFncyAmIENPTkZJR19IWUJSSURfRkxBRykgeworICAgIGlmIChlbmMtPmNvcnJlY3Rpb25fbW9kZSA+IEdTVF9XQVZQQUNLX0NPUlJFQ1RJT05fTU9ERV9PRkYpIHsKKyAgICAgIEdzdENhcHMgKmNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC13YXZwYWNrLWNvcnJlY3Rpb24iLAorICAgICAgICAgICJmcmFtZWQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisKKyAgICAgIGVuYy0+d3Zjc3JjcGFkID0KKyAgICAgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnd2Y3NyY19mYWN0b3J5LCAid3Zjc3JjIik7CisKKyAgICAgIC8qIHRyeSB0byBhZGQgY29ycmVjdGlvbiBzcmMgcGFkLCBkb24ndCBzZXQgY29ycmVjdGlvbiBtb2RlIG9uIGZhaWx1cmUgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgIkFkZGluZyBjb3JyZWN0aW9uIHBhZCB3aXRoIGNhcHMgJSIKKyAgICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgICAgICBpZiAoIWdzdF9wYWRfc2V0X2NhcHMgKGVuYy0+d3Zjc3JjcGFkLCBjYXBzKSkgeworICAgICAgICBlbmMtPmNvcnJlY3Rpb25fbW9kZSA9IDA7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZW5jLCAic2V0dGluZyBjb3JyZWN0aW9uIGNhcHMgZmFpbGVkIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChlbmMtPnd2Y3NyY3BhZCk7CisgICAgICAgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoZW5jLT53dmNzcmNwYWQsIFRSVUUpOworICAgICAgICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoZW5jKSwgZW5jLT53dmNzcmNwYWQpOworICAgICAgICBlbmMtPndwX2NvbmZpZy0+ZmxhZ3MgfD0gQ09ORklHX0NSRUFURV9XVkM7CisgICAgICAgIGlmIChlbmMtPmNvcnJlY3Rpb25fbW9kZSA9PSBHU1RfV0FWUEFDS19DT1JSRUNUSU9OX01PREVfT1BUSU1JWkVEKSB7CisgICAgICAgICAgZW5jLT53cF9jb25maWctPmZsYWdzIHw9IENPTkZJR19PUFRJTUlaRV9XVkM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGVuYy0+Y29ycmVjdGlvbl9tb2RlID4gR1NUX1dBVlBBQ0tfQ09SUkVDVElPTl9NT0RFX09GRikgeworICAgICAgZW5jLT5jb3JyZWN0aW9uX21vZGUgPSAwOworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmMsICJzZXR0aW5nIGNvcnJlY3Rpb24gbW9kZSBvbmx5IGhhcyAiCisgICAgICAgICAgImFueSBlZmZlY3QgaWYgYSBiaXRyYXRlIGlzIHByb3ZpZGVkLiIpOworICAgIH0KKyAgfQorICBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgKEdTVF9FTEVNRU5UIChlbmMpKTsKKworICAvKiBNRDUsIHNldHVwIE1ENSBjb250ZXh0ICovCisgIGlmICgoZW5jLT5tZDUpICYmICEoZW5jLT5tZDVfY29udGV4dCkpIHsKKyAgICBlbmMtPndwX2NvbmZpZy0+ZmxhZ3MgfD0gQ09ORklHX01ENV9DSEVDS1NVTTsKKyAgICBlbmMtPm1kNV9jb250ZXh0ID0gZ19jaGVja3N1bV9uZXcgKEdfQ0hFQ0tTVU1fTUQ1KTsKKyAgfQorCisgIC8qIEV4dHJhIGVuY29kZSBwcm9jZXNzaW5nICovCisgIGlmIChlbmMtPmV4dHJhX3Byb2Nlc3NpbmcpIHsKKyAgICBlbmMtPndwX2NvbmZpZy0+ZmxhZ3MgfD0gQ09ORklHX0VYVFJBX01PREU7CisgICAgZW5jLT53cF9jb25maWctPnhtb2RlID0gZW5jLT5leHRyYV9wcm9jZXNzaW5nOworICB9CisKKyAgLyogSm9pbnQgc3RlcmVvIG1vZGUgKi8KKyAgc3dpdGNoIChlbmMtPmpvaW50X3N0ZXJlb19tb2RlKSB7CisgICAgY2FzZSBHU1RfV0FWUEFDS19KU19NT0RFX0FVVE86CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9XQVZQQUNLX0pTX01PREVfTEVGVF9SSUdIVDoKKyAgICAgIGVuYy0+d3BfY29uZmlnLT5mbGFncyB8PSBDT05GSUdfSk9JTlRfT1ZFUlJJREU7CisgICAgICBlbmMtPndwX2NvbmZpZy0+ZmxhZ3MgJj0gfkNPTkZJR19KT0lOVF9TVEVSRU87CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9XQVZQQUNLX0pTX01PREVfTUlEX1NJREU6CisgICAgICBlbmMtPndwX2NvbmZpZy0+ZmxhZ3MgfD0gKENPTkZJR19KT0lOVF9PVkVSUklERSB8IENPTkZJR19KT0lOVF9TVEVSRU8pOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGludAorZ3N0X3dhdnBhY2tfZW5jX3B1c2hfYmxvY2sgKHZvaWQgKmlkLCB2b2lkICpkYXRhLCBpbnQzMl90IGNvdW50KQoreworICBHc3RXYXZwYWNrRW5jV3JpdGVJRCAqd2lkID0gKEdzdFdhdnBhY2tFbmNXcml0ZUlEICopIGlkOworICBHc3RXYXZwYWNrRW5jICplbmMgPSBHU1RfV0FWUEFDS19FTkMgKHdpZC0+d2F2cGFja19lbmMpOworICBHc3RGbG93UmV0dXJuICpmbG93OworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0UGFkICpwYWQ7CisgIGd1Y2hhciAqYmxvY2sgPSAoZ3VjaGFyICopIGRhdGE7CisgIGdpbnQgc2FtcGxlcyA9IDA7CisKKyAgcGFkID0gKHdpZC0+Y29ycmVjdGlvbikgPyBlbmMtPnd2Y3NyY3BhZCA6IEdTVF9BVURJT19FTkNPREVSX1NSQ19QQUQgKGVuYyk7CisgIGZsb3cgPQorICAgICAgKHdpZC0+Y29ycmVjdGlvbikgPyAmZW5jLT4KKyAgICAgIHd2Y3NyY3BhZF9sYXN0X3JldHVybiA6ICZlbmMtPnNyY3BhZF9sYXN0X3JldHVybjsKKworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGNvdW50KTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChidWZmZXIsIDAsIGRhdGEsIGNvdW50KTsKKworICBpZiAoY291bnQgPiBzaXplb2YgKFdhdnBhY2tIZWFkZXIpICYmIG1lbWNtcCAoYmxvY2ssICJ3dnBrIiwgNCkgPT0gMCkgeworICAgIC8qIGlmIGl0J3MgYSBXYXZwYWNrIGJsb2NrIHNldCBidWZmZXIgdGltZXN0YW1wIGFuZCBkdXJhdGlvbiwgZXRjICovCisgICAgV2F2cGFja0hlYWRlciB3cGg7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZW5jLCAiZ290ICVkIGJ5dGVzIG9mIGVuY29kZWQgd2F2cGFjayAlc2RhdGEiLAorICAgICAgICBjb3VudCwgKHdpZC0+Y29ycmVjdGlvbikgPyAiY29ycmVjdGlvbiAiIDogIiIpOworCisgICAgZ3N0X3dhdnBhY2tfcmVhZF9oZWFkZXIgKCZ3cGgsIGJsb2NrKTsKKworICAgIC8qIE9ubHkgc2V0IHdoZW4gcHVzaGluZyB0aGUgZmlyc3QgYnVmZmVyIGFnYWluLCBpbiB0aGF0IGNhc2UKKyAgICAgKiB3ZSBkb24ndCB3YW50IHRvIGRlbGF5IHRoZSBidWZmZXIgb3IgcHVzaCBuZXdzZWdtZW50IGV2ZW50cworICAgICAqLworICAgIGlmICghd2lkLT5wYXNzdGhyb3VnaCkgeworICAgICAgLyogT25seSBwdXNoIGNvbXBsZXRlIGJsb2NrcyAqLworICAgICAgaWYgKGVuYy0+cGVuZGluZ19idWZmZXIgPT0gTlVMTCkgeworICAgICAgICBlbmMtPnBlbmRpbmdfYnVmZmVyID0gYnVmZmVyOworICAgICAgICBlbmMtPnBlbmRpbmdfb2Zmc2V0ID0gd3BoLmJsb2NrX2luZGV4OworICAgICAgfSBlbHNlIGlmIChlbmMtPnBlbmRpbmdfb2Zmc2V0ID09IHdwaC5ibG9ja19pbmRleCkgeworICAgICAgICBlbmMtPnBlbmRpbmdfYnVmZmVyID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKGVuYy0+cGVuZGluZ19idWZmZXIsIGJ1ZmZlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfRVJST1IgKCJHb3QgaW5jb21wbGV0ZSBibG9jaywgZHJvcHBpbmciKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoZW5jLT5wZW5kaW5nX2J1ZmZlcik7CisgICAgICAgIGVuYy0+cGVuZGluZ19idWZmZXIgPSBidWZmZXI7CisgICAgICAgIGVuYy0+cGVuZGluZ19vZmZzZXQgPSB3cGguYmxvY2tfaW5kZXg7CisgICAgICB9CisKKyAgICAgIC8qIElzIHRoaXMgdGhlIG5vdC1maW5hbCBibG9jayBvZiBtdWx0aS1jaGFubmVsIGRhdGE/IElmIHNvLCBqdXN0CisgICAgICAgKiBhY2N1bXVsYXRlIGFuZCByZXR1cm4gaGVyZS4gKi8KKyAgICAgIGlmICghKHdwaC5mbGFncyAmIEZJTkFMX0JMT0NLKSAmJiAoKGJsb2NrWzMyXSAmIElEX09QVElPTkFMX0RBVEEpID09IDApKQorICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgYnVmZmVyID0gZW5jLT5wZW5kaW5nX2J1ZmZlcjsKKyAgICAgIGVuYy0+cGVuZGluZ19idWZmZXIgPSBOVUxMOworICAgICAgZW5jLT5wZW5kaW5nX29mZnNldCA9IDA7CisKKyAgICAgIC8qIG9ubHkgc2VuZCBzZWdtZW50IG9uIGNvcnJlY3Rpb24gcGFkLAorICAgICAgICogcmVndWxhciBwYWQgaXMgaGFuZGxlZCBub3JtYWxseSBieSBiYXNlY2xhc3MgKi8KKyAgICAgIGlmICh3aWQtPmNvcnJlY3Rpb24gJiYgZW5jLT5wZW5kaW5nX3NlZ21lbnQpIHsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChwYWQsIGVuYy0+cGVuZGluZ19zZWdtZW50KTsKKyAgICAgICAgZW5jLT5wZW5kaW5nX3NlZ21lbnQgPSBOVUxMOworICAgICAgfQorCisgICAgICBpZiAod3BoLmJsb2NrX2luZGV4ID09IDApIHsKKyAgICAgICAgLyogc2F2ZSBoZWFkZXIgZm9yIGxhdGVyIHJlZmVyZW5jZSwgc28gd2UgY2FuIHJlLXNlbmQgaXQgbGF0ZXIgb24KKyAgICAgICAgICogRU9TIHdpdGggZml4ZWQgdXAgdmFsdWVzIGZvciB0b3RhbCBzYW1wbGUgY291bnQgZXRjLiAqLworICAgICAgICBpZiAoZW5jLT5maXJzdF9ibG9jayA9PSBOVUxMICYmICF3aWQtPmNvcnJlY3Rpb24pIHsKKyAgICAgICAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgICAgICAgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICAgICAgZW5jLT5maXJzdF9ibG9jayA9IGdfbWVtZHVwIChtYXAuZGF0YSwgbWFwLnNpemUpOworICAgICAgICAgIGVuYy0+Zmlyc3RfYmxvY2tfc2l6ZSA9IG1hcC5zaXplOworICAgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgc2FtcGxlcyA9IHdwaC5ibG9ja19zYW1wbGVzOworCisgICAgLyogZGVjb3JhdGUgYnVmZmVyICovCisgICAgLyogTk9URTogdGhpcyB3aWxsIGdldCBvdmVyd3JpdHRlbiBieSBiYXNlY2xhc3MsIGJ1dCBzdGF5IGZvciB0aG9zZQorICAgICAqIHRoYXQgYXJlIHB1c2hlZCBkaXJlY3RseQorICAgICAqIEZJWE1FOiBhZGQgc2V0dGluZyB0byBiYXNlY2xhc3MgdG8gYXZvaWQgb3ZlcndyaXRpbmcgaXQgPz8gKi8KKyAgICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSA9IHdwaC5ibG9ja19pbmRleDsKKyAgICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZmZlcikgPSB3cGguYmxvY2tfaW5kZXggKyB3cGguYmxvY2tfc2FtcGxlczsKKyAgfSBlbHNlIHsKKyAgICAvKiBpZiBpdCdzIHNvbWV0aGluZyBlbHNlIHNldCBubyB0aW1lc3RhbXAgYW5kIGR1cmF0aW9uIG9uIHRoZSBidWZmZXIgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJnb3QgJWQgYnl0ZXMgb2YgdW5rbm93biBkYXRhIiwgY291bnQpOworICB9CisKKyAgaWYgKHdpZC0+Y29ycmVjdGlvbiB8fCB3aWQtPnBhc3N0aHJvdWdoKSB7CisgICAgLyogcHVzaCB0aGUgYnVmZmVyIGFuZCBmb3J3YXJkIGVycm9ycyAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgInB1c2hpbmcgYnVmZmVyIHdpdGggJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyIsCisgICAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikpOworICAgICpmbG93ID0gZ3N0X3BhZF9wdXNoIChwYWQsIGJ1ZmZlcik7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAiaGFuZGluZyBmcmFtZSBvZiAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwKKyAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSk7CisgICAgKmZsb3cgPSBnc3RfYXVkaW9fZW5jb2Rlcl9maW5pc2hfZnJhbWUgKEdTVF9BVURJT19FTkNPREVSIChlbmMpLCBidWZmZXIsCisgICAgICAgIHNhbXBsZXMpOworICB9CisKKyAgaWYgKCpmbG93ICE9IEdTVF9GTE9XX09LKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmMsICJmbG93IG9uICVzOiVzID0gJXMiLAorICAgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKHBhZCksIGdzdF9mbG93X2dldF9uYW1lICgqZmxvdykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3dhdnBhY2tfZW5jX2ZpeF9jaGFubmVsX29yZGVyIChHc3RXYXZwYWNrRW5jICogZW5jLCBnaW50MzIgKiBkYXRhLAorICAgIGdpbnQgbnNhbXBsZXMpCit7CisgIGdpbnQgaSwgajsKKyAgZ2ludDMyIHRtcFs4XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnNhbXBsZXMgLyBlbmMtPmNoYW5uZWxzOyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgZW5jLT5jaGFubmVsczsgaisrKSB7CisgICAgICB0bXBbZW5jLT5jaGFubmVsX21hcHBpbmdbal1dID0gZGF0YVtqXTsKKyAgICB9CisgICAgZm9yIChqID0gMDsgaiA8IGVuYy0+Y2hhbm5lbHM7IGorKykgeworICAgICAgZGF0YVtqXSA9IHRtcFtqXTsKKyAgICB9CisgICAgZGF0YSArPSBlbmMtPmNoYW5uZWxzOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfd2F2cGFja19lbmNfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0VuY29kZXIgKiBiZW5jLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFdhdnBhY2tFbmMgKmVuYyA9IEdTVF9XQVZQQUNLX0VOQyAoYmVuYyk7CisgIHVpbnQzMl90IHNhbXBsZV9jb3VudDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdE1hcEluZm8gbWFwOworCisgIC8qIGJhc2UgY2xhc3MgZW5zdXJlcyBjb25maWd1cmF0aW9uICovCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChlbmMtPmRlcHRoICE9IDAsIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEKTsKKworICAvKiByZXNldCB0aGUgbGFzdCByZXR1cm5zIHRvIEdTVF9GTE9XX09LLiBUaGlzIGlzIG9ubHkgc2V0IHRvIHNvbWV0aGluZyBlbHNlCisgICAqIHdoaWxlIFdhdnBhY2tQYWNrU2FtcGxlcygpIG9yIG1vcmUgc3BlY2lmaWMgZ3N0X3dhdnBhY2tfZW5jX3B1c2hfYmxvY2soKQorICAgKiBzbyBub3QgdmFsaWQgYW55bW9yZSAqLworICBlbmMtPnNyY3BhZF9sYXN0X3JldHVybiA9IGVuYy0+d3Zjc3JjcGFkX2xhc3RfcmV0dXJuID0gR1NUX0ZMT1dfT0s7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFidWYpKQorICAgIHJldHVybiBnc3Rfd2F2cGFja19lbmNfZHJhaW4gKGVuYyk7CisKKyAgc2FtcGxlX2NvdW50ID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSAvIDQ7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgImdvdCAldSByYXcgc2FtcGxlcyIsIHNhbXBsZV9jb3VudCk7CisKKyAgLyogY2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGEgdmFsaWQgV2F2cGFja0NvbnRleHQsIG90aGVyd2lzZSBtYWtlIG9uZSAqLworICBpZiAoIWVuYy0+d3BfY29udGV4dCkgeworICAgIC8qIGNyZWF0ZSByYXcgY29udGV4dCAqLworICAgIGVuYy0+d3BfY29udGV4dCA9CisgICAgICAgIFdhdnBhY2tPcGVuRmlsZU91dHB1dCAoZ3N0X3dhdnBhY2tfZW5jX3B1c2hfYmxvY2ssICZlbmMtPnd2X2lkLAorICAgICAgICAoZW5jLT5jb3JyZWN0aW9uX21vZGUgPiAwKSA/ICZlbmMtPnd2Y19pZCA6IE5VTEwpOworICAgIGlmICghZW5jLT53cF9jb250ZXh0KQorICAgICAgZ290byBjb250ZXh0X2ZhaWxlZDsKKworICAgIC8qIHNldCB0aGUgV2F2cGFja0NvbmZpZyBhY2NvcmRpbmcgdG8gb3VyIHBhcmFtZXRlcnMgKi8KKyAgICBnc3Rfd2F2cGFja19lbmNfc2V0X3dwX2NvbmZpZyAoZW5jKTsKKworICAgIC8qIHNldCB0aGUgY29uZmlndXJhdGlvbiB0byB0aGUgY29udGV4dCBub3cgdGhhdCB3ZSBrbm93IGV2ZXJ5dGhpbmcKKyAgICAgKiBhbmQgaW5pdGlhbGl6ZSB0aGUgZW5jb2RlciAqLworICAgIGlmICghV2F2cGFja1NldENvbmZpZ3VyYXRpb24gKGVuYy0+d3BfY29udGV4dCwKKyAgICAgICAgICAgIGVuYy0+d3BfY29uZmlnLCAodWludDMyX3QpICgtMSkpCisgICAgICAgIHx8ICFXYXZwYWNrUGFja0luaXQgKGVuYy0+d3BfY29udGV4dCkpIHsKKyAgICAgIFdhdnBhY2tDbG9zZUZpbGUgKGVuYy0+d3BfY29udGV4dCk7CisgICAgICBnb3RvIGNvbmZpZ19mYWlsZWQ7CisgICAgfQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgInNldHVwIG9mIGVuY29kaW5nIGNvbnRleHQgc3VjY2Vzc2Z1bGwiKTsKKyAgfQorCisgIGlmIChlbmMtPm5lZWRfY2hhbm5lbF9yZW1hcCkgeworICAgIGJ1ZiA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoYnVmKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBnc3Rfd2F2cGFja19lbmNfZml4X2NoYW5uZWxfb3JkZXIgKGVuYywgKGdpbnQzMiAqKSBtYXAuZGF0YSwgc2FtcGxlX2NvdW50KTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICB9CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICAvKiBpZiB3ZSB3YW50IHRvIGFwcGVuZCB0aGUgTUQ1IHN1bSB0byB0aGUgc3RyZWFtIHVwZGF0ZSBpdCBoZXJlCisgICAqIHdpdGggdGhlIGN1cnJlbnQgcmF3IHNhbXBsZXMgKi8KKyAgaWYgKGVuYy0+bWQ1KSB7CisgICAgZ19jaGVja3N1bV91cGRhdGUgKGVuYy0+bWQ1X2NvbnRleHQsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIH0KKworICAvKiBlbmNvZGUgYW5kIGhhbmRsZSByZXR1cm4gdmFsdWVzIGZyb20gZW5jb2RpbmcgKi8KKyAgaWYgKFdhdnBhY2tQYWNrU2FtcGxlcyAoZW5jLT53cF9jb250ZXh0LCAoaW50MzJfdCAqKSBtYXAuZGF0YSwKKyAgICAgICAgICBzYW1wbGVfY291bnQgLyBlbmMtPmNoYW5uZWxzKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgImVuY29kaW5nIHNhbXBsZXMgc3VjY2Vzc2Z1bCIpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgIH0gZWxzZSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBpZiAoKGVuYy0+c3JjcGFkX2xhc3RfcmV0dXJuID09IEdTVF9GTE9XX09LKSB8fAorICAgICAgICAoZW5jLT53dmNzcmNwYWRfbGFzdF9yZXR1cm4gPT0gR1NUX0ZMT1dfT0spKSB7CisgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICB9IGVsc2UgaWYgKChlbmMtPnNyY3BhZF9sYXN0X3JldHVybiA9PSBHU1RfRkxPV19OT1RfTElOS0VEKSAmJgorICAgICAgICAoZW5jLT53dmNzcmNwYWRfbGFzdF9yZXR1cm4gPT0gR1NUX0ZMT1dfTk9UX0xJTktFRCkpIHsKKyAgICAgIHJldCA9IEdTVF9GTE9XX05PVF9MSU5LRUQ7CisgICAgfSBlbHNlIGlmICgoZW5jLT5zcmNwYWRfbGFzdF9yZXR1cm4gPT0gR1NUX0ZMT1dfRkxVU0hJTkcpICYmCisgICAgICAgIChlbmMtPnd2Y3NyY3BhZF9sYXN0X3JldHVybiA9PSBHU1RfRkxPV19GTFVTSElORykpIHsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0ZMVVNISU5HOworICAgIH0gZWxzZSB7CisgICAgICBnb3RvIGVuY29kaW5nX2ZhaWxlZDsKKyAgICB9CisgIH0KKworZXhpdDoKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK2VuY29kaW5nX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChlbmMsIExJQlJBUlksIEVOQ09ERSwgKE5VTEwpLAorICAgICAgICAoImVuY29kaW5nIHNhbXBsZXMgZmFpbGVkIikpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorY29uZmlnX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChlbmMsIExJQlJBUlksIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiZXJyb3Igc2V0dGluZyB1cCB3YXZwYWNrIGVuY29kaW5nIGNvbnRleHQiKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBleGl0OworICB9Citjb250ZXh0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChlbmMsIExJQlJBUlksIElOSVQsIChOVUxMKSwKKyAgICAgICAgKCJlcnJvciBjcmVhdGluZyBXYXZwYWNrIGNvbnRleHQiKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBleGl0OworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFja19lbmNfcmV3cml0ZV9maXJzdF9ibG9jayAoR3N0V2F2cGFja0VuYyAqIGVuYykKK3sKKyAgR3N0U2VnbWVudCBzZWdtZW50OworICBnYm9vbGVhbiByZXQ7CisgIEdzdFF1ZXJ5ICpxdWVyeTsKKyAgZ2Jvb2xlYW4gc2Vla2FibGUgPSBGQUxTRTsKKworICBnX3JldHVybl9pZl9mYWlsIChlbmMpOworICBnX3JldHVybl9pZl9mYWlsIChlbmMtPmZpcnN0X2Jsb2NrKTsKKworICAvKiB1cGRhdGUgdGhlIHNhbXBsZSBjb3VudCBpbiB0aGUgZmlyc3QgYmxvY2sgKi8KKyAgV2F2cGFja1VwZGF0ZU51bVNhbXBsZXMgKGVuYy0+d3BfY29udGV4dCwgZW5jLT5maXJzdF9ibG9jayk7CisKKyAgLyogdHJ5IHRvIHNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0ICovCisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19zZWVraW5nIChHU1RfRk9STUFUX0JZVEVTKTsKKyAgaWYgKGdzdF9wYWRfcGVlcl9xdWVyeSAoR1NUX0FVRElPX0VOQ09ERVJfU1JDX1BBRCAoZW5jKSwgcXVlcnkpKSB7CisgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKworICAgIGdzdF9xdWVyeV9wYXJzZV9zZWVraW5nIChxdWVyeSwgJmZvcm1hdCwgJnNlZWthYmxlLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZm9ybWF0ICE9IEdTVF9GT1JNQVRfQllURVMpCisgICAgICBzZWVrYWJsZSA9IEZBTFNFOworICB9IGVsc2UgeworICAgIEdTVF9MT0dfT0JKRUNUIChlbmMsICJTRUVLSU5HIHF1ZXJ5IG5vdCBoYW5kbGVkIik7CisgIH0KKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisKKyAgaWYgKCFzZWVrYWJsZSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgImRvd25zdHJlYW0gbm90IHNlZWthYmxlOyBub3QgcmV3cml0aW5nIik7CisgICAgcmV0dXJuOworICB9CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfQllURVMpOworICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9BVURJT19FTkNPREVSX1NSQ19QQUQgKGVuYyksCisgICAgICBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSk7CisgIGlmIChyZXQpIHsKKyAgICAvKiB0cnkgdG8gcmV3cml0ZSB0aGUgZmlyc3QgYmxvY2sgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJyZXdyaXRpbmcgZmlyc3QgYmxvY2sgLi4uIik7CisgICAgZW5jLT53dl9pZC5wYXNzdGhyb3VnaCA9IFRSVUU7CisgICAgcmV0ID0gZ3N0X3dhdnBhY2tfZW5jX3B1c2hfYmxvY2sgKCZlbmMtPnd2X2lkLAorICAgICAgICBlbmMtPmZpcnN0X2Jsb2NrLCBlbmMtPmZpcnN0X2Jsb2NrX3NpemUpOworICAgIGVuYy0+d3ZfaWQucGFzc3Rocm91Z2ggPSBGQUxTRTsKKyAgICBnX2ZyZWUgKGVuYy0+Zmlyc3RfYmxvY2spOworICAgIGVuYy0+Zmlyc3RfYmxvY2sgPSBOVUxMOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZW5jLCAicmV3cml0aW5nIG9mIGZpcnN0IGJsb2NrIGZhaWxlZC4gIgorICAgICAgICAiU2Vla2luZyB0byBmaXJzdCBibG9jayBmYWlsZWQhIik7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF93YXZwYWNrX2VuY19kcmFpbiAoR3N0V2F2cGFja0VuYyAqIGVuYykKK3sKKyAgaWYgKCFlbmMtPndwX2NvbnRleHQpCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVuYywgImRyYWluaW5nIik7CisKKyAgLyogRW5jb2RlIGFsbCByZW1haW5pbmcgc2FtcGxlcyBhbmQgZmx1c2ggdGhlbSB0byB0aGUgc3JjIHBhZHMgKi8KKyAgV2F2cGFja0ZsdXNoU2FtcGxlcyAoZW5jLT53cF9jb250ZXh0KTsKKworICAvKiBEcm9wIGFsbCByZW1haW5pbmcgZGF0YSwgdGhpcyBpcyBubyBjb21wbGV0ZSBibG9jayBvdGhlcndpc2UKKyAgICogaXQgd291bGQndmUgYmVlbiBwdXNoZWQgYWxyZWFkeSAqLworICBpZiAoZW5jLT5wZW5kaW5nX2J1ZmZlcikgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKGVuYy0+cGVuZGluZ19idWZmZXIpOworICAgIGVuYy0+cGVuZGluZ19idWZmZXIgPSBOVUxMOworICAgIGVuYy0+cGVuZGluZ19vZmZzZXQgPSAwOworICB9CisKKyAgLyogd3JpdGUgdGhlIE1ENSBzdW0gaWYgd2UgaGF2ZSB0byB3cml0ZSBvbmUgKi8KKyAgaWYgKChlbmMtPm1kNSkgJiYgKGVuYy0+bWQ1X2NvbnRleHQpKSB7CisgICAgZ3VpbnQ4IG1kNV9kaWdlc3RbMTZdOworICAgIGdzaXplIGRpZ2VzdF9sZW4gPSBzaXplb2YgKG1kNV9kaWdlc3QpOworCisgICAgZ19jaGVja3N1bV9nZXRfZGlnZXN0IChlbmMtPm1kNV9jb250ZXh0LCBtZDVfZGlnZXN0LCAmZGlnZXN0X2xlbik7CisgICAgaWYgKGRpZ2VzdF9sZW4gPT0gc2l6ZW9mIChtZDVfZGlnZXN0KSkgeworICAgICAgV2F2cGFja1N0b3JlTUQ1U3VtIChlbmMtPndwX2NvbnRleHQsIG1kNV9kaWdlc3QpOworICAgICAgV2F2cGFja0ZsdXNoU2FtcGxlcyAoZW5jLT53cF9jb250ZXh0KTsKKyAgICB9IGVsc2UKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZW5jLCAiQ2FsY3VsYXRpbmcgTUQ1IGRpZ2VzdCBmYWlsZWQiKTsKKyAgfQorCisgIC8qIFRyeSB0byByZXdyaXRlIHRoZSBmaXJzdCBmcmFtZSB3aXRoIHRoZSBjb3JyZWN0IHNhbXBsZSBudW1iZXIgKi8KKyAgaWYgKGVuYy0+Zmlyc3RfYmxvY2spCisgICAgZ3N0X3dhdnBhY2tfZW5jX3Jld3JpdGVfZmlyc3RfYmxvY2sgKGVuYyk7CisKKyAgLyogY2xvc2UgdGhlIGNvbnRleHQgaWYgbm90IGFscmVhZHkgaGFwcGVuZWQgKi8KKyAgaWYgKGVuYy0+d3BfY29udGV4dCkgeworICAgIFdhdnBhY2tDbG9zZUZpbGUgKGVuYy0+d3BfY29udGV4dCk7CisgICAgZW5jLT53cF9jb250ZXh0ID0gTlVMTDsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2cGFja19lbmNfc2lua19ldmVudCAoR3N0QXVkaW9FbmNvZGVyICogYmVuYywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0V2F2cGFja0VuYyAqZW5jID0gR1NUX1dBVlBBQ0tfRU5DIChiZW5jKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJSZWNlaXZlZCAlcyBldmVudCBvbiBzaW5rcGFkIiwKKyAgICAgIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDoKKyAgICAgIGlmIChlbmMtPndwX2NvbnRleHQpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbmMsICJnb3QgTkVXU0VHTUVOVCBhZnRlciBlbmNvZGluZyAiCisgICAgICAgICAgICAiYWxyZWFkeSBzdGFydGVkIik7CisgICAgICB9CisgICAgICAvKiBwZWVrIGFuZCBob2xkIE5FV1NFR01FTlQgZXZlbnRzIGZvciBzZW5kaW5nIG9uIGNvcnJlY3Rpb24gcGFkICovCisgICAgICBpZiAoZW5jLT5wZW5kaW5nX3NlZ21lbnQpCisgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZW5jLT5wZW5kaW5nX3NlZ21lbnQpOworICAgICAgZW5jLT5wZW5kaW5nX3NlZ21lbnQgPSBnc3RfZXZlbnRfcmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBiYXNlY2xhc3MgaGFuZGxlcyByZXN0ICovCisgIHJldHVybiBHU1RfQVVESU9fRU5DT0RFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAoYmVuYywgZXZlbnQpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3dhdnBhY2tfZW5jX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RXYXZwYWNrRW5jICplbmMgPSBHU1RfV0FWUEFDS19FTkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBBUkdfTU9ERToKKyAgICAgIGVuYy0+bW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0JJVFJBVEU6eworICAgICAgZ3VpbnQgdmFsID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworCisgICAgICBpZiAoKHZhbCA+PSAyNDAwMCkgJiYgKHZhbCA8PSA5NjAwMDAwKSkgeworICAgICAgICBlbmMtPmJpdHJhdGUgPSB2YWw7CisgICAgICAgIGVuYy0+YnBzID0gMC4wOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZW5jLT5iaXRyYXRlID0gMDsKKyAgICAgICAgZW5jLT5icHMgPSAwLjA7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBUkdfQklUU1BFUlNBTVBMRTp7CisgICAgICBnZG91YmxlIHZhbCA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworCisgICAgICBpZiAoKHZhbCA+PSAyLjApICYmICh2YWwgPD0gMjQuMCkpIHsKKyAgICAgICAgZW5jLT5icHMgPSB2YWw7CisgICAgICAgIGVuYy0+Yml0cmF0ZSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbmMtPmJwcyA9IDAuMDsKKyAgICAgICAgZW5jLT5iaXRyYXRlID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFSR19DT1JSRUNUSU9OX01PREU6CisgICAgICBlbmMtPmNvcnJlY3Rpb25fbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX01ENToKKyAgICAgIGVuYy0+bWQ1ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfRVhUUkFfUFJPQ0VTU0lORzoKKyAgICAgIGVuYy0+ZXh0cmFfcHJvY2Vzc2luZyA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0pPSU5UX1NURVJFT19NT0RFOgorICAgICAgZW5jLT5qb2ludF9zdGVyZW9fbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZwYWNrX2VuY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0V2F2cGFja0VuYyAqZW5jID0gR1NUX1dBVlBBQ0tfRU5DIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgQVJHX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgZW5jLT5tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0JJVFJBVEU6CisgICAgICBpZiAoZW5jLT5icHMgPT0gMC4wKSB7CisgICAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBlbmMtPmJpdHJhdGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIDApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfQklUU1BFUlNBTVBMRToKKyAgICAgIGlmIChlbmMtPmJpdHJhdGUgPT0gMCkgeworICAgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBlbmMtPmJwcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCAwLjApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfQ09SUkVDVElPTl9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGVuYy0+Y29ycmVjdGlvbl9tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX01ENToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBlbmMtPm1kNSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19FWFRSQV9QUk9DRVNTSU5HOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIGVuYy0+ZXh0cmFfcHJvY2Vzc2luZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19KT0lOVF9TVEVSRU9fTU9ERToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBlbmMtPmpvaW50X3N0ZXJlb19tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX2VuY19wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJ3YXZwYWNrZW5jIiwKKyAgICAgICAgICBHU1RfUkFOS19OT05FLCBHU1RfVFlQRV9XQVZQQUNLX0VOQykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3Rfd2F2cGFja19lbmNfZGVidWcsICJ3YXZwYWNrZW5jIiwgMCwKKyAgICAgICJXYXZwYWNrIGVuY29kZXIiKTsKKworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaCBiL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmE1YjExCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3dhdnBhY2svZ3N0d2F2cGFja2VuYy5oCkBAIC0wLDAgKzEsMTA1IEBACisvKiBHU3RyZWFtZXIgV2F2cGFjayBlbmNvZGVyIHBsdWdpbgorICogQ29weXJpZ2h0IChjKSAyMDA2IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBnc3R3YXZwYWNrZW5jLmg6IFdhdnBhY2sgYXVkaW8gZW5jb2RlcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfV0FWUEFDS19FTkNfSF9fCisjZGVmaW5lIF9fR1NUX1dBVlBBQ0tfRU5DX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2VuY29kZXIuaD4KKworI2luY2x1ZGUgPHdhdnBhY2svd2F2cGFjay5oPgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1dBVlBBQ0tfRU5DIFwKKyAgKGdzdF93YXZwYWNrX2VuY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfV0FWUEFDS19FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9XQVZQQUNLX0VOQyxHc3RXYXZwYWNrRW5jKSkKKyNkZWZpbmUgR1NUX1dBVlBBQ0tfRU5DX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1dBVlBBQ0tfRU5DLEdzdFdhdnBhY2tFbmMpKQorI2RlZmluZSBHU1RfSVNfV0FWUEFDS19FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9XQVZQQUNLX0VOQykpCisjZGVmaW5lIEdTVF9JU19XQVZQQUNLX0VOQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9XQVZQQUNLX0VOQykpCit0eXBlZGVmIHN0cnVjdCBfR3N0V2F2cGFja0VuYyBHc3RXYXZwYWNrRW5jOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFdhdnBhY2tFbmNDbGFzcyBHc3RXYXZwYWNrRW5jQ2xhc3M7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGdib29sZWFuIGNvcnJlY3Rpb247CisgIEdzdFdhdnBhY2tFbmMgKndhdnBhY2tfZW5jOworICBnYm9vbGVhbiBwYXNzdGhyb3VnaDsKK30gR3N0V2F2cGFja0VuY1dyaXRlSUQ7CisKKworc3RydWN0IF9Hc3RXYXZwYWNrRW5jCit7CisgIEdzdEF1ZGlvRW5jb2RlciBlbGVtZW50OworCisgIC8qPCBwcml2YXRlID4gKi8KKyAgR3N0UGFkICp3dmNzcmNwYWQ7CisKKyAgR3N0Rmxvd1JldHVybiBzcmNwYWRfbGFzdF9yZXR1cm47CisgIEdzdEZsb3dSZXR1cm4gd3Zjc3JjcGFkX2xhc3RfcmV0dXJuOworCisgIFdhdnBhY2tDb25maWcgKndwX2NvbmZpZzsKKyAgV2F2cGFja0NvbnRleHQgKndwX2NvbnRleHQ7CisKKyAgZ2ludCBzYW1wbGVyYXRlOworICBnaW50IGNoYW5uZWxzOworICBnaW50IGNoYW5uZWxfbWFzazsKKyAgZ2ludDggY2hhbm5lbF9tYXBwaW5nWzhdOworICBnYm9vbGVhbiBuZWVkX2NoYW5uZWxfcmVtYXA7CisgIGdpbnQgZGVwdGg7CisKKyAgR3N0V2F2cGFja0VuY1dyaXRlSUQgd3ZfaWQ7CisgIEdzdFdhdnBhY2tFbmNXcml0ZUlEIHd2Y19pZDsKKworICBndWludCBtb2RlOworICBndWludCBiaXRyYXRlOworICBnZG91YmxlIGJwczsKKyAgZ3VpbnQgY29ycmVjdGlvbl9tb2RlOworICBnYm9vbGVhbiBtZDU7CisgIEdDaGVja3N1bSAqbWQ1X2NvbnRleHQ7CisgIGd1aW50IGV4dHJhX3Byb2Nlc3Npbmc7CisgIGd1aW50IGpvaW50X3N0ZXJlb19tb2RlOworCisgIHZvaWQgKmZpcnN0X2Jsb2NrOworICBpbnQzMl90IGZpcnN0X2Jsb2NrX3NpemU7CisKKyAgR3N0QnVmZmVyICpwZW5kaW5nX2J1ZmZlcjsKKyAgZ2ludDMyIHBlbmRpbmdfb2Zmc2V0OworICBHc3RFdmVudCAqcGVuZGluZ19zZWdtZW50OworCisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXBfb2Zmc2V0OworICBHc3RDbG9ja1RpbWUgbmV4dF90czsKK307CisKK3N0cnVjdCBfR3N0V2F2cGFja0VuY0NsYXNzCit7CisgIEdzdEF1ZGlvRW5jb2RlckNsYXNzIHBhcmVudDsKK307CisKK0dUeXBlIGdzdF93YXZwYWNrX2VuY19nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF93YXZwYWNrX2VuY19wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9XQVZQQUNLX0VOQ19IX18gKi8KZGlmZiAtLWdpdCBhL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuYyBiL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDI5YTM3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3dhdnBhY2svZ3N0d2F2cGFja3N0cmVhbXJlYWRlci5jCkBAIC0wLDAgKzEsMTI1IEBACisvKiBHU3RyZWFtZXIgV2F2cGFjayBwbHVnaW4KKyAqIENvcHlyaWdodCAoYykgMjAwNiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogZ3N0d2F2cGFja3N0cmVhbXJlYWRlci5jOiBzdHJlYW0gcmVhZGVyIHVzZWQgZm9yIGRlY29kaW5nCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnc3R3YXZwYWNrc3RyZWFtcmVhZGVyLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKHdhdnBhY2tfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgd2F2cGFja19kZWJ1ZworCitzdGF0aWMgaW50MzJfdAorZ3N0X3dhdnBhY2tfc3RyZWFtX3JlYWRlcl9yZWFkX2J5dGVzICh2b2lkICppZCwgdm9pZCAqZGF0YSwgaW50MzJfdCBiY291bnQpCit7CisgIHJlYWRfaWQgKnJpZCA9IChyZWFkX2lkICopIGlkOworICB1aW50MzJfdCBsZWZ0ID0gcmlkLT5sZW5ndGggLSByaWQtPnBvc2l0aW9uOworICB1aW50MzJfdCB0b19yZWFkID0gTUlOIChsZWZ0LCBiY291bnQpOworCisgIEdTVF9ERUJVRyAoIlRyeWluZyB0byByZWFkICVkIG9mICVkIGJ5dGVzIGZyb20gcG9zaXRpb24gJWQiLCBiY291bnQsCisgICAgICByaWQtPmxlbmd0aCwgcmlkLT5wb3NpdGlvbik7CisKKyAgaWYgKHRvX3JlYWQgPiAwKSB7CisgICAgbWVtbW92ZSAoZGF0YSwgcmlkLT5idWZmZXIgKyByaWQtPnBvc2l0aW9uLCB0b19yZWFkKTsKKyAgICByaWQtPnBvc2l0aW9uICs9IHRvX3JlYWQ7CisgICAgcmV0dXJuIHRvX3JlYWQ7CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkcgKCJDb3VsZG4ndCByZWFkICVkIGJ5dGVzIiwgYmNvdW50KTsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCitzdGF0aWMgdWludDMyX3QKK2dzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfZ2V0X3BvcyAodm9pZCAqaWQpCit7CisgIEdTVF9ERUJVRyAoIlJldHVybmluZyBwb3NpdGlvbiAlZCIsICgocmVhZF9pZCAqKSBpZCktPnBvc2l0aW9uKTsKKyAgcmV0dXJuICgocmVhZF9pZCAqKSBpZCktPnBvc2l0aW9uOworfQorCitzdGF0aWMgaW50Citnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX3NldF9wb3NfYWJzICh2b2lkICppZCwgdWludDMyX3QgcG9zKQoreworICBHU1RfV0FSTklORyAoIlNob3VsZCBub3QgYmUgY2FsbGVkOiB0cmllZCB0byBzZXQgYWJzb2x1dGUgcG9zaXRpb24gdG8gJWQiLAorICAgICAgcG9zKTsKKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50Citnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX3NldF9wb3NfcmVsICh2b2lkICppZCwgaW50MzJfdCBkZWx0YSwgaW50IG1vZGUpCit7CisgIEdTVF9XQVJOSU5HICgiU2hvdWxkIG5vdCBiZSBjYWxsZWQ6IHRyaWVkIHRvIHNldCByZWxhdGl2ZSBwb3NpdGlvbiB0byAlZCIKKyAgICAgICIgd2l0aCBtb2RlICVkIiwgZGVsdGEsIG1vZGUpOworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK2dzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfcHVzaF9iYWNrX2J5dGUgKHZvaWQgKmlkLCBpbnQgYykKK3sKKyAgcmVhZF9pZCAqcmlkID0gKHJlYWRfaWQgKikgaWQ7CisKKyAgR1NUX0RFQlVHICgiUHVzaGluZyBiYWNrIG9uZSBieXRlOiAweCV4IiwgYyk7CisKKyAgaWYgKHJpZC0+cG9zaXRpb24gPT0gMCkKKyAgICByZXR1cm4gcmlkLT5wb3NpdGlvbjsKKworICByaWQtPnBvc2l0aW9uIC09IDE7CisgIHJldHVybiByaWQtPnBvc2l0aW9uOworfQorCitzdGF0aWMgdWludDMyX3QKK2dzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfZ2V0X2xlbmd0aCAodm9pZCAqaWQpCit7CisgIEdTVF9ERUJVRyAoIlJldHVybmluZyBsZW5ndGggJWQiLCAoKHJlYWRfaWQgKikgaWQpLT5sZW5ndGgpOworCisgIHJldHVybiAoKHJlYWRfaWQgKikgaWQpLT5sZW5ndGg7Cit9CisKK3N0YXRpYyBpbnQKK2dzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfY2FuX3NlZWsgKHZvaWQgKmlkKQoreworICBHU1RfREVCVUcgKCJDYW4ndCBzZWVrIik7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludDMyX3QKK2dzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfd3JpdGVfYnl0ZXMgKHZvaWQgKmlkLCB2b2lkICpkYXRhLCBpbnQzMl90IGJjb3VudCkKK3sKKyAgR1NUX1dBUk5JTkcgKCJTaG91bGQgbm90IGJlIGNhbGxlZCwgdHJpZWQgdG8gd3JpdGUgJWQgYnl0ZXMiLCBiY291bnQpOworICByZXR1cm4gMDsKK30KKworV2F2cGFja1N0cmVhbVJlYWRlciAqCitnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX25ldyAodm9pZCkKK3sKKyAgV2F2cGFja1N0cmVhbVJlYWRlciAqc3RyZWFtX3JlYWRlciA9CisgICAgICAoV2F2cGFja1N0cmVhbVJlYWRlciAqKSBnX21hbGxvYzAgKHNpemVvZiAoV2F2cGFja1N0cmVhbVJlYWRlcikpOworICBzdHJlYW1fcmVhZGVyLT5yZWFkX2J5dGVzID0gZ3N0X3dhdnBhY2tfc3RyZWFtX3JlYWRlcl9yZWFkX2J5dGVzOworICBzdHJlYW1fcmVhZGVyLT5nZXRfcG9zID0gZ3N0X3dhdnBhY2tfc3RyZWFtX3JlYWRlcl9nZXRfcG9zOworICBzdHJlYW1fcmVhZGVyLT5zZXRfcG9zX2FicyA9IGdzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfc2V0X3Bvc19hYnM7CisgIHN0cmVhbV9yZWFkZXItPnNldF9wb3NfcmVsID0gZ3N0X3dhdnBhY2tfc3RyZWFtX3JlYWRlcl9zZXRfcG9zX3JlbDsKKyAgc3RyZWFtX3JlYWRlci0+cHVzaF9iYWNrX2J5dGUgPSBnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX3B1c2hfYmFja19ieXRlOworICBzdHJlYW1fcmVhZGVyLT5nZXRfbGVuZ3RoID0gZ3N0X3dhdnBhY2tfc3RyZWFtX3JlYWRlcl9nZXRfbGVuZ3RoOworICBzdHJlYW1fcmVhZGVyLT5jYW5fc2VlayA9IGdzdF93YXZwYWNrX3N0cmVhbV9yZWFkZXJfY2FuX3NlZWs7CisgIHN0cmVhbV9yZWFkZXItPndyaXRlX2J5dGVzID0gZ3N0X3dhdnBhY2tfc3RyZWFtX3JlYWRlcl93cml0ZV9ieXRlczsKKworICByZXR1cm4gc3RyZWFtX3JlYWRlcjsKK30KZGlmZiAtLWdpdCBhL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuaCBiL2V4dC93YXZwYWNrL2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzQxMmNjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3dhdnBhY2svZ3N0d2F2cGFja3N0cmVhbXJlYWRlci5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIEdTdHJlYW1lciBXYXZwYWNrIHBsdWdpbgorICogQ29weXJpZ2h0IChjKSAyMDA2IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBnc3R3YXZwYWNrc3RyZWFtcmVhZGVyLmg6IHN0cmVhbSByZWFkZXIgdXNlZCBmb3IgZGVjb2RpbmcKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1dBVlBBQ0tfU1RSRUFNX1JFQURFUl9IX18KKyNkZWZpbmUgX19HU1RfV0FWUEFDS19TVFJFQU1fUkVBREVSX0hfXworCisjaW5jbHVkZSA8d2F2cGFjay93YXZwYWNrLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGd1aW50OCAqYnVmZmVyOworICB1aW50MzJfdCBsZW5ndGg7CisgIHVpbnQzMl90IHBvc2l0aW9uOworfSByZWFkX2lkOworCitXYXZwYWNrU3RyZWFtUmVhZGVyICpnc3Rfd2F2cGFja19zdHJlYW1fcmVhZGVyX25ldyAodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh0L3dhdnBhY2svbWVzb24uYnVpbGQgYi9leHQvd2F2cGFjay9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGM5MDcxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3dhdnBhY2svbWVzb24uYnVpbGQKQEAgLTAsMCArMSwyMSBAQAord2F2cGFja19zb3VyY2VzID0gWworICAnZ3N0d2F2cGFjay5jJywKKyAgJ2dzdHdhdnBhY2tjb21tb24uYycsCisgICdnc3R3YXZwYWNrZGVjLmMnLAorICAnZ3N0d2F2cGFja2VuYy5jJywKKyAgJ2dzdHdhdnBhY2tzdHJlYW1yZWFkZXIuYycsCitdCisKK3dhdnBhY2tfZGVwID0gZGVwZW5kZW5jeSgnd2F2cGFjaycsIHZlcnNpb24gOiAnPj0gNC42MC4wJywgcmVxdWlyZWQgOiBmYWxzZSkKKworaWYgd2F2cGFja19kZXAuZm91bmQoKQorICBnc3R3YXZwYWNrID0gbGlicmFyeSgnZ3N0d2F2cGFjaycsCisgICAgd2F2cGFja19zb3VyY2VzLAorICAgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgICBsaW5rX2FyZ3MgOiBub3NlaF9saW5rX2FyZ3MsCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICAgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0YXVkaW9fZGVwLCB3YXZwYWNrX2RlcF0sCisgICAgaW5zdGFsbCA6IHRydWUsCisgICAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorICApCitlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0LWxpYnMvZ3N0L2dldHRleHQuaCBiL2dzdC1saWJzL2dzdC9nZXR0ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3MGFiNwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC1saWJzL2dzdC9nZXR0ZXh0LmgKQEAgLTAsMCArMSw2OSBAQAorLyogQ29udmVuaWVuY2UgaGVhZGVyIGZvciBjb25kaXRpb25hbCB1c2Ugb2YgR05VIDxsaWJpbnRsLmg+LgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTgsIDIwMDAtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX0xJQkdFVFRFWFRfSAorI2RlZmluZSBfTElCR0VUVEVYVF9IIDEKKworLyogTkxTIGNhbiBiZSBkaXNhYmxlZCB0aHJvdWdoIHRoZSBjb25maWd1cmUgLS1kaXNhYmxlLW5scyBvcHRpb24uICAqLworI2lmZGVmIEVOQUJMRV9OTFMKKworLyogR2V0IGRlY2xhcmF0aW9ucyBvZiBHTlUgbWVzc2FnZSBjYXRhbG9nIGZ1bmN0aW9ucy4gICovCisjIGluY2x1ZGUgPGxpYmludGwuaD4KKworI2Vsc2UKKworLyogU29sYXJpcyAvdXNyL2luY2x1ZGUvbG9jYWxlLmggaW5jbHVkZXMgL3Vzci9pbmNsdWRlL2xpYmludGwuaCwgd2hpY2gKKyAgIGNob2tlcyBpZiBkY2dldHRleHQgaXMgZGVmaW5lZCBhcyBhIG1hY3JvLiAgU28gaW5jbHVkZSBpdCBub3csIHRvIG1ha2UKKyAgIGxhdGVyIGluY2x1c2lvbnMgb2YgPGxvY2FsZS5oPiBhIE5PUC4gIFdlIGRvbid0IGluY2x1ZGUgPGxpYmludGwuaD4KKyAgIGFzIHdlbGwgYmVjYXVzZSBwZW9wbGUgdXNpbmcgImdldHRleHQuaCIgd2lsbCBub3QgaW5jbHVkZSA8bGliaW50bC5oPiwKKyAgIGFuZCBhbHNvIGluY2x1ZGluZyA8bGliaW50bC5oPiB3b3VsZCBmYWlsIG9uIFN1bk9TIDQsIHdoZXJlYXMgPGxvY2FsZS5oPgorICAgaXMgT0suICAqLworI2lmIGRlZmluZWQoX19zdW4pCisjIGluY2x1ZGUgPGxvY2FsZS5oPgorI2VuZGlmCisKKy8qIERpc2FibGVkIE5MUy4KKyAgIFRoZSBjYXN0cyB0byAnY29uc3QgY2hhciAqJyBzZXJ2ZSB0aGUgcHVycG9zZSBvZiBwcm9kdWNpbmcgd2FybmluZ3MKKyAgIGZvciBpbnZhbGlkIHVzZXMgb2YgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlc2UgZnVuY3Rpb25zLgorICAgT24gcHJlLUFOU0kgc3lzdGVtcyB3aXRob3V0ICdjb25zdCcsIHRoZSBjb25maWcuaCBmaWxlIGlzIHN1cHBvc2VkIHRvCisgICBjb250YWluICIjZGVmaW5lIGNvbnN0Ii4gICovCisjIGRlZmluZSBnZXR0ZXh0KE1zZ2lkKSAoKGNvbnN0IGNoYXIgKikgKE1zZ2lkKSkKKyMgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkKSAoKGNvbnN0IGNoYXIgKikgKE1zZ2lkKSkKKyMgZGVmaW5lIGRjZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCwgQ2F0ZWdvcnkpICgoY29uc3QgY2hhciAqKSAoTXNnaWQpKQorIyBkZWZpbmUgbmdldHRleHQoTXNnaWQxLCBNc2dpZDIsIE4pIFwKKyAgICAoKE4pID09IDEgPyAoY29uc3QgY2hhciAqKSAoTXNnaWQxKSA6IChjb25zdCBjaGFyICopIChNc2dpZDIpKQorIyBkZWZpbmUgZG5nZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkMSwgTXNnaWQyLCBOKSBcCisgICAgKChOKSA9PSAxID8gKGNvbnN0IGNoYXIgKikgKE1zZ2lkMSkgOiAoY29uc3QgY2hhciAqKSAoTXNnaWQyKSkKKyMgZGVmaW5lIGRjbmdldHRleHQoRG9tYWlubmFtZSwgTXNnaWQxLCBNc2dpZDIsIE4sIENhdGVnb3J5KSBcCisgICAgKChOKSA9PSAxID8gKGNvbnN0IGNoYXIgKikgKE1zZ2lkMSkgOiAoY29uc3QgY2hhciAqKSAoTXNnaWQyKSkKKyMgZGVmaW5lIHRleHRkb21haW4oRG9tYWlubmFtZSkgKChjb25zdCBjaGFyICopIChEb21haW5uYW1lKSkKKyMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbm5hbWUsIERpcm5hbWUpICgoY29uc3QgY2hhciAqKSAoRGlybmFtZSkpCisjIGRlZmluZSBiaW5kX3RleHRkb21haW5fY29kZXNldChEb21haW5uYW1lLCBDb2Rlc2V0KSAoKGNvbnN0IGNoYXIgKikgKENvZGVzZXQpKQorCisjZW5kaWYKKworLyogQSBwc2V1ZG8gZnVuY3Rpb24gY2FsbCB0aGF0IHNlcnZlcyBhcyBhIG1hcmtlciBmb3IgdGhlIGF1dG9tYXRlZAorICAgZXh0cmFjdGlvbiBvZiBtZXNzYWdlcywgYnV0IGRvZXMgbm90IGNhbGwgZ2V0dGV4dCgpLiAgVGhlIHJ1bi10aW1lCisgICB0cmFuc2xhdGlvbiBpcyBkb25lIGF0IGEgZGlmZmVyZW50IHBsYWNlIGluIHRoZSBjb2RlLgorICAgVGhlIGFyZ3VtZW50LCBTdHJpbmcsIHNob3VsZCBiZSBhIGxpdGVyYWwgc3RyaW5nLiAgQ29uY2F0ZW5hdGVkIHN0cmluZ3MKKyAgIGFuZCBvdGhlciBzdHJpbmcgZXhwcmVzc2lvbnMgd29uJ3Qgd29yay4KKyAgIFRoZSBtYWNybydzIGV4cGFuc2lvbiBpcyBub3QgcGFyZW50aGVzaXplZCwgc28gdGhhdCBpdCBpcyBzdWl0YWJsZSBhcworICAgaW5pdGlhbGl6ZXIgZm9yIHN0YXRpYyAnY2hhcltdJyBvciAnY29uc3QgY2hhcltdJyB2YXJpYWJsZXMuICAqLworI2RlZmluZSBnZXR0ZXh0X25vb3AoU3RyaW5nKSBTdHJpbmcKKworI2VuZGlmIC8qIF9MSUJHRVRURVhUX0ggKi8KZGlmZiAtLWdpdCBhL2dzdC1saWJzL2dzdC9nbGliLWNvbXBhdC1wcml2YXRlLmggYi9nc3QtbGlicy9nc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzdkZTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QtbGlicy9nc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBnbGliLWNvbXBhdC5jCisgKiBGdW5jdGlvbnMgY29waWVkIGZyb20gZ2xpYiAyLjEwCisgKgorICogQ29weXJpZ2h0IDIwMDUgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dMSUJfQ09NUEFUX1BSSVZBVEVfSF9fCisjZGVmaW5lIF9fR0xJQl9DT01QQVRfUFJJVkFURV9IX18KKworI2luY2x1ZGUgPGdsaWIuaD4KKworR19CRUdJTl9ERUNMUworCisvKiBjb3BpZXMgKi8KKworLyogYWRhcHRhdGlvbnMgKi8KKworR19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QtbGlicy9nc3QvZ3N0LWkxOG4tcGx1Z2luLmggYi9nc3QtbGlicy9nc3QvZ3N0LWkxOG4tcGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0MGNlMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC1saWJzL2dzdC9nc3QtaTE4bi1wbHVnaW4uaApAQCAtMCwwICsxLDQ3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXNAYXBlc3RhYXJ0Lm9yZz4KKyAqCisgKiBnc3QtaTE4bi1wbHVnaW5zLmg6IGludGVybmF0aW9uYWxpemF0aW9uIG1hY3JvcyBmb3IgdGhlIEdTdHJlYW1lciBwbHVnaW5zCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9JMThOX1BMVUdJTl9IX18KKyNkZWZpbmUgX19HU1RfSTE4Tl9QTFVHSU5fSF9fCisKKyNpZm5kZWYgR0VUVEVYVF9QQUNLQUdFCisjZXJyb3IgWW91IG11c3QgZGVmaW5lIEdFVFRFWFRfUEFDS0FHRSBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgaGVhZGVyLgorI2VuZGlmCisKKyNpZmRlZiBFTkFCTEVfTkxTCisKKyNpbmNsdWRlIDxsb2NhbGUuaD4KKworI2luY2x1ZGUgImdldHRleHQuaCIgLyogaW5jbHVkZWQgd2l0aCBnZXR0ZXh0IGRpc3RyaWJ1dGlvbiBhbmQgY29waWVkICovCisKKy8qIHdlIHdhbnQgdG8gdXNlIHNob3J0aGFuZCBfKCkgZm9yIHRyYW5zbGF0aW5nIGFuZCBOXygpIGZvciBtYXJraW5nICovCisjZGVmaW5lIF8oU3RyaW5nKSBkZ2V0dGV4dCAoR0VUVEVYVF9QQUNLQUdFLCBTdHJpbmcpCisjZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCisvKiBGSVhNRTogaWYgd2UgbmVlZCBpdCwgd2UgY2FuIGFkZCBRXyBhcyB3ZWxsLCBsaWtlIGluIGdsaWIgKi8KKworI2Vsc2UKKyNkZWZpbmUgXyhTdHJpbmcpIFN0cmluZworI2RlZmluZSBOXyhTdHJpbmcpIFN0cmluZworI2RlZmluZSBuZ2V0dGV4dChTaW5ndWxhcixQbHVyYWwsQ291bnQpICgoQ291bnQ+MSk/UGx1cmFsOlNpbmd1bGFyKQorCisjZW5kaWYKKworI2VuZGlmIC8qIF9fR1NUX0kxOE5fUExVR0lOX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0LXBsdWdpbnMtZ29vZC5kb2FwIGIvZ3N0LXBsdWdpbnMtZ29vZC5kb2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYTcwZjEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QtcGx1Z2lucy1nb29kLmRvYXAKQEAgLTAsMCArMSw4MjYgQEAKKzxQcm9qZWN0CisgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKKyAgeG1sbnM6cmRmcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hIyIKKyAgeG1sbnM9Imh0dHA6Ly91c2VmdWxpbmMuY29tL25zL2RvYXAjIgorICB4bWxuczpmb2FmPSJodHRwOi8veG1sbnMuY29tL2ZvYWYvMC4xLyIKKyAgeG1sbnM6YWRtaW49Imh0dHA6Ly93ZWJucy5uZXQvbXZjYi8iPgorCisgPG5hbWU+R1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnM8L25hbWU+CisgPHNob3J0bmFtZT5nc3QtcGx1Z2lucy1nb29kPC9zaG9ydG5hbWU+CisgPGhvbWVwYWdlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvbW9kdWxlcy9nc3QtcGx1Z2lucy1nb29kLmh0bWwiIC8+CisgPGNyZWF0ZWQ+MjAwNS0wOS0wNjwvY3JlYXRlZD4KKyA8c2hvcnRkZXNjIHhtbDpsYW5nPSJlbiI+CithIHNldCBvZiBnb29kLXF1YWxpdHkgcGx1Zy1pbnMgdW5kZXIgb3VyIHByZWZlcnJlZCBsaWNlbnNlLCBMR1BMCis8L3Nob3J0ZGVzYz4KKyA8ZGVzY3JpcHRpb24geG1sOmxhbmc9ImVuIj4KK0dTdHJlYW1lciBHb29kIFBsdWctaW5zIGlzIGEgc2V0IG9mIHBsdWctaW5zIHRoYXQgd2UgY29uc2lkZXIgdG8gaGF2ZSBnb29kCitxdWFsaXR5IGNvZGUgYW5kIGNvcnJlY3QgZnVuY3Rpb25hbGl0eSwgdW5kZXIgb3VyIHByZWZlcnJlZCBsaWNlbnNlIChMR1BMIGZvcgordGhlIHBsdWctaW4gY29kZSwgTEdQTCBvciBMR1BMLWNvbXBhdGlibGUgZm9yIHRoZSBzdXBwb3J0aW5nIGxpYnJhcnkpLgorPC9kZXNjcmlwdGlvbj4KKyA8Y2F0ZWdvcnk+PC9jYXRlZ29yeT4KKyA8YnVnLWRhdGFiYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9lbnRlcl9idWcuY2dpP3Byb2R1Y3Q9R1N0cmVhbWVyJmFtcDtjb21wb25lbnQ9Z3N0LXBsdWdpbnMtZ29vZCIgLz4KKyA8c2NyZWVuc2hvdHM+PC9zY3JlZW5zaG90cz4KKyA8bWFpbGluZy1saXN0IHJkZjpyZXNvdXJjZT0iaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2dzdHJlYW1lci1kZXZlbCIgLz4KKyA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+QzwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgPGxpY2Vuc2UgcmRmOnJlc291cmNlPSJodHRwOi8vdXNlZnVsaW5jLmNvbS9kb2FwL2xpY2Vuc2VzL2xncGwiLz4KKyA8ZG93bmxvYWQtcGFnZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2Rvd25sb2FkLyIgLz4KKworIDxyZXBvc2l0b3J5PgorICAgPEdpdFJlcG9zaXRvcnk+CisgICAgIDxsb2NhdGlvbiByZGY6cmVzb3VyY2U9ImdpdDovL2Fub25naXQuZnJlZWRlc2t0b3Aub3JnL2dzdHJlYW1lci9nc3QtcGx1Z2lucy1nb29kIi8+CisgICAgIDxicm93c2UgcmRmOnJlc291cmNlPSJodHRwOi8vY2dpdC5mcmVlZGVza3RvcC5vcmcvZ3N0cmVhbWVyL2dzdC1wbHVnaW5zLWdvb2QiLz4KKyAgIDwvR2l0UmVwb3NpdG9yeT4KKyA8L3JlcG9zaXRvcnk+IAorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuMTIuMDwvcmV2aXNpb24+CisgICA8YnJhbmNoPm1hc3RlcjwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNy0wNS0wNDwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuMTIuMC50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4xMS45MTwvcmV2aXNpb24+CisgICA8YnJhbmNoPm1hc3RlcjwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNy0wNC0yNzwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuMTEuOTEudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuMTEuOTA8L3JldmlzaW9uPgorICAgPGJyYW5jaD5tYXN0ZXI8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTctMDQtMDc8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjExLjkwLnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4xLjExLjI8L3JldmlzaW9uPgorICAgPGJyYW5jaD5tYXN0ZXI8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTctMDItMjQ8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjExLjIudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuMTEuMTwvcmV2aXNpb24+CisgICA8YnJhbmNoPm1hc3RlcjwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNy0wMS0xMjwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuMTEuMS50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4xMC4wPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+bWFzdGVyPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDE2LTExLTAxPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS4xMC4wLnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4xLjkuOTA8L3JldmlzaW9uPgorICAgPGJyYW5jaD5tYXN0ZXI8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTYtMDktMzA8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjkuOTAudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuOS4yPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+bWFzdGVyPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDE2LTA5LTAxPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS45LjIudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuOS4xPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+bWFzdGVyPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDE2LTA2LTA2PC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS45LjEudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuOC4wPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+bWFzdGVyPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDE2LTAzLTI0PC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS44LjAudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuNy45MTwvcmV2aXNpb24+CisgICA8YnJhbmNoPm1hc3RlcjwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNi0wMy0xNTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuNy45MS50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS43LjkwPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+bWFzdGVyPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDE2LTAzLTAxPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS43LjkwLnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4xLjcuMjwvcmV2aXNpb24+CisgICA8YnJhbmNoPm1hc3RlcjwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNi0wMi0xOTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuNy4yLnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4xLjcuMTwvcmV2aXNpb24+CisgICA8YnJhbmNoPm1hc3RlcjwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNS0xMi0yNDwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuNy4xLnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4xLjYuMjwvcmV2aXNpb24+CisgICA8YnJhbmNoPjEuNjwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNS0xMi0xNDwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuNi4yLnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4xLjYuMTwvcmV2aXNpb24+CisgICA8YnJhbmNoPjEuNjwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNS0xMC0zMDwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuNi4xLnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4xLjYuMDwvcmV2aXNpb24+CisgICA8YnJhbmNoPjEuNjwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNS0wOS0yNTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuNi4wLnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4xLjUuOTE8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjU8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTUtMDktMTg8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjUuOTEudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuNS45MDwvcmV2aXNpb24+CisgICA8YnJhbmNoPjEuNTwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxNS0wOC0xOTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuNS45MC50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS41LjI8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjU8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTUtMDYtMjQ8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjUuMi50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS41LjE8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjU8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTUtMDYtMDc8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjUuMS50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS40LjA8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjQ8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTQtMDctMTk8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjQuMC50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4zLjkxPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MS4zPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDE0LTA3LTExPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS4zLjkxLnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4xLjMuOTA8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjM8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTQtMDYtMjg8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjMuOTAudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuMy4zPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MS4zPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDE0LTA2LTIyPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS4zLjMudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuMy4yPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MS4zPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDE0LTA1LTIxPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS4zLjIudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuMy4xPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MS4zPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDE0LTA1LTAzPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS4zLjEudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuMi4wPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MS4yPC9icmFuY2g+CisgICA8bmFtZT48L25hbWU+CisgICA8Y3JlYXRlZD4yMDEzLTA5LTI0PC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMS4yLjAudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjEuMS45MDwvcmV2aXNpb24+CisgICA8YnJhbmNoPjEuMTwvYnJhbmNoPgorICAgPG5hbWU+PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMy0wOS0xOTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTEuMS45MC50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4xLjQ8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjE8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTMtMDgtMjg8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjEuNC50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4xLjM8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjE8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTMtMDctMjk8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjEuMy50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4xLjI8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjE8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTMtMDctMTE8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjEuMi50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4xLjE8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjE8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTMtMDYtMDU8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjEuMS50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4wLjI8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjA8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTItMTAtMjQ8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjAuMi50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4wLjE8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjA8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTItMTAtMDc8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjAuMS50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MS4wLjA8L3JldmlzaW9uPgorICAgPGJyYW5jaD4xLjA8L2JyYW5jaD4KKyAgIDxuYW1lPjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTItMDktMjQ8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0xLjAuMC50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMS45OTwvcmV2aXNpb24+CisgICA8YnJhbmNoPjAuMTE8L2JyYW5jaD4KKyAgIDxuYW1lPkJlZW4gQXJvdW5kIGZvciBhIExvbmcgTG9uZyBZZWFyPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMi0wOS0xNzwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTEuOTkudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTEuOTQ8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjExPC9icmFuY2g+CisgICA8bmFtZT5CZWF0aWZ1bCBUYW5nbzwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTItMDktMTQ8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjExLjk0LnRhci54eiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjExLjkzPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMTwvYnJhbmNoPgorICAgPG5hbWU+UG9ldGljIFBpdGJ1bGwgUmV2b2x1dGlvbnM8L25hbWU+CisgICA8Y3JlYXRlZD4yMDEyLTA4LTA4PC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMS45My50YXIueHoiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMS45MjwvcmV2aXNpb24+CisgICA8YnJhbmNoPjAuMTE8L2JyYW5jaD4KKyAgIDxuYW1lPk1vbmV5PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMi0wNi0wNzwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTEuOTIudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTEuOTE8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjExPC9icmFuY2g+CisgICA8bmFtZT5JIHNtZWxsIHRoZSBibG9vZCBvZiBhbiBFbmdsaXNobWFuPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMi0wNS0xMzwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTEuOTEudGFyLnh6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTEuOTA8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjExPC9icmFuY2g+CisgICA8bmFtZT5Gcm9tIGdyaWVmIGFuZCBtb2FuIHRvIGEgZ29sZCB0aHJvbmU8L25hbWU+CisgICA8Y3JlYXRlZD4yMDEyLTA0LTEyPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMS45MC50YXIuYnoyIiAvPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMS45MC50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMS4yPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMTwvYnJhbmNoPgorICAgPG5hbWU+Uml0ZSBvZiBEZXZhc3RhdGlvbjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTItMDMtMjI8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjExLjIudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTEuMi50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMS4xPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMTwvYnJhbmNoPgorICAgPG5hbWU+VGhlIExlcGVyIEFmZmluaXR5PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMi0wMi0xNjwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTEuMS50YXIuYnoyIiAvPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMS4xLnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjMwPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+QWRhZ2lvPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMS0wNi0xNTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMzAudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMzAudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMjk8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5Tb2Z0IENoZWVzZSBFbnRodXNpYXN0PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMS0wNS0xMDwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjkudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjkudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMjg8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5JbmNvbnZlbmllbmNlZCBieSB0aGUgU29sYXIgU3lzdGVtPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMS0wMy0wODwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjgudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjgudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMjc8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5Tb21lIEtpbmQgb2YgVGVtcG9yYWwgQmxlbmQ8L25hbWU+CisgICA8Y3JlYXRlZD4yMDExLTAxLTIxPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC4yNy50YXIuYnoyIiAvPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC4yNy50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMC4yNjwvcmV2aXNpb24+CisgICA8YnJhbmNoPjAuMTA8L2JyYW5jaD4KKyAgIDxuYW1lPkVzY2FwYWRlczwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTAtMTItMDE8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjI2LnRhci5iejIiIC8+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjI2LnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjI1PC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+V29lIHRvIFlvdSBPaCBFYXJ0aCBhbmQgU2VhPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMC0wOS0wMjwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjUudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjUudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMjQ8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5UYWtpbmcgTGliZXJ0aWVzPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMC0wNy0xNTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjQudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjQudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMjM8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5TdHlsaXNoIEtpZHMgaW4gUmlvdDwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTAtMDUtMzA8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjIzLnRhci5iejIiIC8+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjIzLnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjIyPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+U3F1YXJlIE9uZTwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTAtMDQtMjc8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjIyLnRhci5iejIiIC8+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjIyLnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjIxPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+TGVtb25zPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMC0wMy0wODwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjEudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMjEudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMjA8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5MZW1vbmFkZTwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMTAtMDMtMDg8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjIwLnRhci5iejIiIC8+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjIwLnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjE5PC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+Q2xvc2VyIHRvIHRoZSBFZGl0PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMC0wMy0wNjwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTkudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTkudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMTg8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5TaG9ydCBDaXJjdWl0PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAxMC0wMi0xMDwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTgudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTgudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMTc8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5UaGV5IHVzZWQgdG8gc3BhcmtsZTwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMDktMTEtMTc8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjE3LnRhci5iejIiIC8+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjE3LnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjE2PC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+U2VjcmV0IEhhbmRzaGFrZXM8L25hbWU+CisgICA8Y3JlYXRlZD4yMDA5LTA4LTI4PC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC4xNi50YXIuYnoyIiAvPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC4xNi50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMC4xNTwvcmV2aXNpb24+CisgICA8YnJhbmNoPjAuMTA8L2JyYW5jaD4KKyAgIDxuYW1lPkkndmUgYmVlbiB1cCBhbGwgbmlnaHQ8L25hbWU+CisgICA8Y3JlYXRlZD4yMDA5LTA1LTIwPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC4xNS50YXIuYnoyIiAvPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC4xNS50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMC4xNDwvcmV2aXNpb24+CisgICA8YnJhbmNoPjAuMTA8L2JyYW5jaD4KKyAgIDxuYW1lPkRpc2FmZmVjdGVkIEFmZmVjdGF0aW9uPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAwOS0wMi0xOTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTQudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTQudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMTM8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5CbGF0YW50IERpc2NvdXJhZ2VtZW50PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAwOS0wMS0yMjwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTMudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTMudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMTI8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5UYWtlbiBVbmRlciBBZHZpc2VtZW50PC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAwOS0wMS0yMjwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTIudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMTIudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuMTE8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5TZWNvbmRhcnkgQ29uc2lkZXJhdGlvbjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMDgtMTAtMjQ8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjExLnRhci5iejIiIC8+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjExLnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjEwPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+QmFyZWx5IE1vdmluZzwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMDgtMDgtMjY8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjEwLnRhci5iejIiIC8+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjEwLnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjk8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5TdGVhbSBUcmFpbiBSb2xsaW5nPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAwOC0wNy0zMTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuOS50YXIuYnoyIiAvPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC45LnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjg8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5PbmUgRm9yIFRoZSBNb25leTwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMDgtMDQtMjQ8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjgudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuOC50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMC43PC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+UmVkIERvb3IgQmxhY2s8L25hbWU+CisgICA8Y3JlYXRlZD4yMDA4LTAxLTIwPC9jcmVhdGVkPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC43LnRhci5iejIiIC8+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjcudGFyLmd6IiAvPgorICA8L1ZlcnNpb24+CisgPC9yZWxlYXNlPgorCisgPHJlbGVhc2U+CisgIDxWZXJzaW9uPgorICAgPHJldmlzaW9uPjAuMTAuNjwvcmV2aXNpb24+CisgICA8YnJhbmNoPjAuMTA8L2JyYW5jaD4KKyAgIDxuYW1lPldvYmJsZSBCb2FyZDwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMDctMDYtMTk8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjYudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuNi50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMC41PC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+VGhlIFBhdGggb2YgVGhvcm5zPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAwNi0xMi0yMTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuNS50YXIuYnoyIiAvPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC41LnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjQ8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5EZWFyIExlYWRlcjwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMDYtMDgtMTQ8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjQudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuNC50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMC4zPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+RGVzcGxhemFkbzwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMDYtMDUtMDQ8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjMudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMy50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMC4yPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+UGFwYSB3YXMgYSByb2xsaW5nIHN0b25lPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAwNi0wMi0wOTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMi50YXIuYnoyIiAvPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC4yLnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxyZWxlYXNlPgorICA8VmVyc2lvbj4KKyAgIDxyZXZpc2lvbj4wLjEwLjE8L3JldmlzaW9uPgorICAgPGJyYW5jaD4wLjEwPC9icmFuY2g+CisgICA8bmFtZT5MaTwvbmFtZT4KKyAgIDxjcmVhdGVkPjIwMDYtMDEtMTM8L2NyZWF0ZWQ+CisgICA8ZmlsZS1yZWxlYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvc3JjL2dzdC1wbHVnaW5zLWdvb2QvZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjEudGFyLmJ6MiIgLz4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMS50YXIuZ3oiIC8+CisgIDwvVmVyc2lvbj4KKyA8L3JlbGVhc2U+CisKKyA8cmVsZWFzZT4KKyAgPFZlcnNpb24+CisgICA8cmV2aXNpb24+MC4xMC4wPC9yZXZpc2lvbj4KKyAgIDxicmFuY2g+MC4xMDwvYnJhbmNoPgorICAgPG5hbWU+QWJvbmRhbmNlPC9uYW1lPgorICAgPGNyZWF0ZWQ+MjAwNS0xMi0wNTwvY3JlYXRlZD4KKyAgIDxmaWxlLXJlbGVhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9zcmMvZ3N0LXBsdWdpbnMtZ29vZC9nc3QtcGx1Z2lucy1nb29kLTAuMTAuMC50YXIuYnoyIiAvPgorICAgPGZpbGUtcmVsZWFzZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL3NyYy9nc3QtcGx1Z2lucy1nb29kL2dzdC1wbHVnaW5zLWdvb2QtMC4xMC4wLnRhci5neiIgLz4KKyAgPC9WZXJzaW9uPgorIDwvcmVsZWFzZT4KKworIDxtYWludGFpbmVyPgorICA8Zm9hZjpQZXJzb24+CisgICAgIDxmb2FmOm5hbWU+V2ltIFRheW1hbnM8L2ZvYWY6bmFtZT4KKyAgICAgPGZvYWY6bWJveF9zaGExc3VtPjBkOTNmZGUwNTI4MTJkNTFhMDVmZDg2ZGU5YmRiZjY3NDQyM2RhYTI8L2ZvYWY6bWJveF9zaGExc3VtPgorICA8L2ZvYWY6UGVyc29uPgorIDwvbWFpbnRhaW5lcj4KKworPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ3N0L01ha2VmaWxlLmFtIGIvZ3N0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNWE1NmQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0IEBACitTVUJESVJTID0gJChHU1RfUExVR0lOU19TRUxFQ1RFRCkKK0RJU1RfU1VCRElSUyA9ICQoR1NUX1BMVUdJTlNfQUxMKQorCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL3BhcmFsbGVsLXN1YmRpcnMubWFrCmRpZmYgLS1naXQgYS9nc3QvYWxwaGEvTWFrZWZpbGUuYW0gYi9nc3QvYWxwaGEvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxMjNkZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hbHBoYS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE3IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RhbHBoYS5sYSBsaWJnc3RhbHBoYWNvbG9yLmxhCisKK2xpYmdzdGFscGhhX2xhX1NPVVJDRVMgPSBnc3RhbHBoYS5jCitsaWJnc3RhbHBoYV9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdGFscGhhX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKExJQk0pCitsaWJnc3RhbHBoYV9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK2xpYmdzdGFscGhhY29sb3JfbGFfU09VUkNFUyA9IGdzdGFscGhhY29sb3IuYworbGliZ3N0YWxwaGFjb2xvcl9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdGFscGhhY29sb3JfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dmlkZW8tJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpCitsaWJnc3RhbHBoYWNvbG9yX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RhbHBoYS5oIGdzdGFscGhhY29sb3IuaApkaWZmIC0tZ2l0IGEvZ3N0L2FscGhhL2dzdGFscGhhLmMgYi9nc3QvYWxwaGEvZ3N0YWxwaGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmFkOTgxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2FscGhhL2dzdGFscGhhLmMKQEAgLTAsMCArMSwyNjEzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gRWR3YXJkIEhlcnZleSA8ZWR3YXJkLmhlcnZleUBjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYWxwaGEKKyAqIAorICogVGhlIGFscGhhIGVsZW1lbnQgYWRkcyBhbiBhbHBoYSBjaGFubmVsIHRvIGEgdmlkZW8gc3RyZWFtLiBUaGUgdmFsdWVzCisgKiBvZiB0aGUgYWxwaGEgY2hhbm5lbCBjYW4gYmUgZWl0aGVyIGJlIHNldCB0byBhIGNvbnN0YW50IG9yIGNhbiBiZQorICogZHluYW1pY2FsbHkgY2FsY3VsYXRlZCB2aWEgY2hyb21hIGtleWluZywgZS5nLiBibHVlIGNhbiBiZSBzZXQgYXMKKyAqIHRoZSB0cmFuc3BhcmVudCBjb2xvci4KKyAqCisgKiBTYW1wbGUgcGlwZWxpbmU6CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdmlkZW90ZXN0c3JjIHBhdHRlcm49c25vdyAhIG1peGVyLnNpbmtfMCBcCisgKiAgIHZpZGVvdGVzdHNyYyBwYXR0ZXJuPXNtcHRlNzUgISBhbHBoYSBtZXRob2Q9Z3JlZW4gISBtaXhlci5zaW5rXzEgXAorICogICB2aWRlb21peGVyIG5hbWU9bWl4ZXIgc2lua18wOjp6b3JkZXI9MCBzaW5rXzE6OnpvcmRlcj0xICEgXAorICogICB2aWRlb2NvbnZlcnQgISBhdXRvdmlkZW9zaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIGFkZHMgYSBhbHBoYSBjaGFubmVsIHRvIHRoZSBTTVBURSBjb2xvciBiYXJzCisgKiB3aXRoIGdyZWVuIGFzIHRoZSB0cmFuc3BhcmVudCBjb2xvciBhbmQgb3ZlcmxheXMgdGhlIG91dHB1dCBvbgorICogdG9wIG9mIGEgc25vdyB2aWRlbyBzdHJlYW0uCisgKi8KKworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RhbHBoYS5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaWZuZGVmIE1fUEkKKyNkZWZpbmUgTV9QSSAgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorI2VuZGlmCisKKy8qIEdlbmVyYXRlZCBieSAtYmFkL2V4dC9jb2cvZ2VuZXJhdGVfdGFibGVzICovCitzdGF0aWMgY29uc3QgaW50IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfaGR0dltdID0geworICAyOTgsIDAsIDQ1OSwgLTYzNTE0LAorICAyOTgsIC01NSwgLTEzNiwgMTk2ODEsCisgIDI5OCwgNTQxLCAwLCAtNzM5ODgsCit9OworCitzdGF0aWMgY29uc3QgaW50IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfc2R0dltdID0geworICAyOTgsIDAsIDQwOSwgLTU3MDY4LAorICAyOTgsIC0xMDAsIC0yMDgsIDM0NzA3LAorICAyOTgsIDUxNiwgMCwgLTcwODcwLAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9oZHR2W10gPSB7CisgIDQ3LCAxNTcsIDE2LCA0MDk2LAorICAtMjYsIC04NywgMTEyLCAzMjc2OCwKKyAgMTEyLCAtMTAyLCAtMTAsIDMyNzY4LAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9zZHR2W10gPSB7CisgIDY2LCAxMjksIDI1LCA0MDk2LAorICAtMzgsIC03NCwgMTEyLCAzMjc2OCwKKyAgMTEyLCAtOTQsIC0xOCwgMzI3NjgsCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBjb2dfeWNiY3Jfc2R0dl90b195Y2Jjcl9oZHR2X21hdHJpeF84Yml0W10gPSB7CisgIDI1NiwgLTMwLCAtNTMsIDEwNjAwLAorICAwLCAyNjEsIDI5LCAtNDM2NywKKyAgMCwgMTksIDI2MiwgLTMyODksCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0W10gPSB7CisgIDI1NiwgMjUsIDQ5LCAtOTUzNiwKKyAgMCwgMjUzLCAtMjgsIDM5NTgsCisgIDAsIC0xOSwgMjUyLCAyOTE4LAorfTsKKworLyogQWxwaGEgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCisjZGVmaW5lIERFRkFVTFRfTUVUSE9EIEFMUEhBX01FVEhPRF9TRVQKKyNkZWZpbmUgREVGQVVMVF9BTFBIQSAxLjAKKyNkZWZpbmUgREVGQVVMVF9UQVJHRVRfUiAwCisjZGVmaW5lIERFRkFVTFRfVEFSR0VUX0cgMjU1CisjZGVmaW5lIERFRkFVTFRfVEFSR0VUX0IgMAorI2RlZmluZSBERUZBVUxUX0FOR0xFIDIwLjAKKyNkZWZpbmUgREVGQVVMVF9OT0lTRV9MRVZFTCAyLjAKKyNkZWZpbmUgREVGQVVMVF9CTEFDS19TRU5TSVRJVklUWSAxMDAKKyNkZWZpbmUgREVGQVVMVF9XSElURV9TRU5TSVRJVklUWSAxMDAKKyNkZWZpbmUgREVGQVVMVF9QUkVGRVJfUEFTU1RIUk9VR0ggRkFMU0UKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTUVUSE9ELAorICBQUk9QX0FMUEhBLAorICBQUk9QX1RBUkdFVF9SLAorICBQUk9QX1RBUkdFVF9HLAorICBQUk9QX1RBUkdFVF9CLAorICBQUk9QX0FOR0xFLAorICBQUk9QX05PSVNFX0xFVkVMLAorICBQUk9QX0JMQUNLX1NFTlNJVElWSVRZLAorICBQUk9QX1dISVRFX1NFTlNJVElWSVRZLAorICBQUk9QX1BSRUZFUl9QQVNTVEhST1VHSAorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9hbHBoYV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgQVlVViwgIgorICAgICAgICAgICAgIkFSR0IsIEJHUkEsIEFCR1IsIFJHQkEsIFk0NDQsIHhSR0IsIEJHUngsIHhCR1IsICIKKyAgICAgICAgICAgICJSR0J4LCBSR0IsIEJHUiwgWTQyQiwgWVVZMiwgWVZZVSwgVVlWWSwgSTQyMCwgWVYxMiwgWTQxQiB9ICIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfYWxwaGFfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IEFZVVYsICIKKyAgICAgICAgICAgICJBUkdCLCBCR1JBLCBBQkdSLCBSR0JBLCBZNDQ0LCB4UkdCLCBCR1J4LCB4QkdSLCAiCisgICAgICAgICAgICAiUkdCeCwgUkdCLCBCR1IsIFk0MkIsIFlVWTIsIFlWWVUsIFVZVlksIEk0MjAsIFlWMTIsICIgIlk0MUIgfSAiKSkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljQ2FwcyBnc3RfYWxwaGFfYWxwaGFfY2FwcyA9CitHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IEFZVVYsIEFSR0IsIEJHUkEsIEFCR1IsIFJHQkEgfSIpKTsKKworLyogRklYTUU6IHdoeSBkbyB3ZSBuZWVkIG91ciBvd24gbG9jayBmb3IgdGhpcz8gKi8KKyNkZWZpbmUgR1NUX0FMUEhBX0xPQ0soYWxwaGEpIEdfU1RNVF9TVEFSVCB7IFwKKyAgR1NUX0xPR19PQkpFQ1QgKGFscGhhLCAiTG9ja2luZyBhbHBoYSBmcm9tIHRocmVhZCAlcCIsIGdfdGhyZWFkX3NlbGYgKCkpOyBcCisgIGdfbXV0ZXhfbG9jayAoJmFscGhhLT5sb2NrKTsgXAorICBHU1RfTE9HX09CSkVDVCAoYWxwaGEsICJMb2NrZWQgYWxwaGEgZnJvbSB0aHJlYWQgJXAiLCBnX3RocmVhZF9zZWxmICgpKTsgXAorfSBHX1NUTVRfRU5ECisKKyNkZWZpbmUgR1NUX0FMUEhBX1VOTE9DSyhhbHBoYSkgR19TVE1UX1NUQVJUIHsgXAorICBHU1RfTE9HX09CSkVDVCAoYWxwaGEsICJVbmxvY2tpbmcgYWxwaGEgZnJvbSB0aHJlYWQgJXAiLCBnX3RocmVhZF9zZWxmICgpKTsgXAorICBnX211dGV4X3VubG9jayAoJmFscGhhLT5sb2NrKTsgXAorfSBHX1NUTVRfRU5ECisKK3N0YXRpYyBHc3RDYXBzICpnc3RfYWxwaGFfdHJhbnNmb3JtX2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiBidHJhbnMsCisgICAgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwgR3N0Q2FwcyAqIGNhcHMsIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIHZvaWQgZ3N0X2FscGhhX2JlZm9yZV90cmFuc2Zvcm0gKEdzdEJhc2VUcmFuc2Zvcm0gKiBidHJhbnMsCisgICAgR3N0QnVmZmVyICogYnVmKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hbHBoYV9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiBmaWx0ZXIsCisgICAgR3N0Q2FwcyAqIGluY2FwcywgR3N0VmlkZW9JbmZvICogaW5faW5mbywgR3N0Q2FwcyAqIG91dGNhcHMsCisgICAgR3N0VmlkZW9JbmZvICogb3V0X2luZm8pOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2FscGhhX3RyYW5zZm9ybV9mcmFtZSAoR3N0VmlkZW9GaWx0ZXIgKiBmaWx0ZXIsCisgICAgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLCBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lKTsKKworc3RhdGljIHZvaWQgZ3N0X2FscGhhX2luaXRfcGFyYW1zX2Z1bGwgKEdzdEFscGhhICogYWxwaGEsCisgICAgY29uc3QgR3N0VmlkZW9Gb3JtYXRJbmZvICogaW5faW5mbywgY29uc3QgR3N0VmlkZW9Gb3JtYXRJbmZvICogb3V0X2luZm8pOworc3RhdGljIHZvaWQgZ3N0X2FscGhhX2luaXRfcGFyYW1zIChHc3RBbHBoYSAqIGFscGhhKTsKK3N0YXRpYyB2b2lkIGdzdF9hbHBoYV9zZXRfcHJvY2Vzc19mdW5jdGlvbiAoR3N0QWxwaGEgKiBhbHBoYSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2FscGhhX3NldF9wcm9jZXNzX2Z1bmN0aW9uX2Z1bGwgKEdzdEFscGhhICogYWxwaGEsCisgICAgR3N0VmlkZW9JbmZvICogaW5faW5mbywgR3N0VmlkZW9JbmZvICogb3V0X2luZm8pOworCitzdGF0aWMgdm9pZCBnc3RfYWxwaGFfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2FscGhhX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hbHBoYV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKKyNkZWZpbmUgZ3N0X2FscGhhX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdEFscGhhLCBnc3RfYWxwaGEsIEdTVF9UWVBFX1ZJREVPX0ZJTFRFUik7CisKKyNkZWZpbmUgR1NUX1RZUEVfQUxQSEFfTUVUSE9EIChnc3RfYWxwaGFfbWV0aG9kX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9hbHBoYV9tZXRob2RfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBhbHBoYV9tZXRob2RfdHlwZSA9IDA7CisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGFscGhhX21ldGhvZFtdID0geworICAgIHtBTFBIQV9NRVRIT0RfU0VULCAiU2V0L2FkanVzdCBhbHBoYSBjaGFubmVsIiwgInNldCJ9LAorICAgIHtBTFBIQV9NRVRIT0RfR1JFRU4sICJDaHJvbWEgS2V5IG9uIHB1cmUgZ3JlZW4iLCAiZ3JlZW4ifSwKKyAgICB7QUxQSEFfTUVUSE9EX0JMVUUsICJDaHJvbWEgS2V5IG9uIHB1cmUgYmx1ZSIsICJibHVlIn0sCisgICAge0FMUEhBX01FVEhPRF9DVVNUT00sICJDaHJvbWEgS2V5IG9uIGN1c3RvbSBSR0IgdmFsdWVzIiwgImN1c3RvbSJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIWFscGhhX21ldGhvZF90eXBlKSB7CisgICAgYWxwaGFfbWV0aG9kX3R5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0QWxwaGFNZXRob2QiLCBhbHBoYV9tZXRob2QpOworICB9CisgIHJldHVybiBhbHBoYV9tZXRob2RfdHlwZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9jbGFzc19pbml0IChHc3RBbHBoYUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqYnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfYWxwaGFfZGVidWcsICJhbHBoYSIsIDAsCisgICAgICAiYWxwaGEgLSBFbGVtZW50IGZvciBhZGRpbmcgYWxwaGEgY2hhbm5lbCB0byBzdHJlYW1zIik7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2FscGhhX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2FscGhhX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfYWxwaGFfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9NRVRIT0QsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoIm1ldGhvZCIsICJNZXRob2QiLAorICAgICAgICAgICJIb3cgdGhlIGFscGhhIGNoYW5uZWxzIHNob3VsZCBiZSBjcmVhdGVkIiwgR1NUX1RZUEVfQUxQSEFfTUVUSE9ELAorICAgICAgICAgIERFRkFVTFRfTUVUSE9ELCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9BTFBIQSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJhbHBoYSIsICJBbHBoYSIsICJUaGUgdmFsdWUgZm9yIHRoZSBhbHBoYSBjaGFubmVsIiwKKyAgICAgICAgICAwLjAsIDEuMCwgREVGQVVMVF9BTFBIQSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfVEFSR0VUX1IsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInRhcmdldC1yIiwgIlRhcmdldCBSZWQiLAorICAgICAgICAgICJUaGUgcmVkIGNvbG9yIHZhbHVlIGZvciBjdXN0b20gUkdCIGNocm9tYSBrZXlpbmciLCAwLCAyNTUsCisgICAgICAgICAgREVGQVVMVF9UQVJHRVRfUiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfVEFSR0VUX0csCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInRhcmdldC1nIiwgIlRhcmdldCBHcmVlbiIsCisgICAgICAgICAgIlRoZSBncmVlbiBjb2xvciB2YWx1ZSBmb3IgY3VzdG9tIFJHQiBjaHJvbWEga2V5aW5nIiwgMCwgMjU1LAorICAgICAgICAgIERFRkFVTFRfVEFSR0VUX0csCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1RBUkdFVF9CLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJ0YXJnZXQtYiIsICJUYXJnZXQgQmx1ZSIsCisgICAgICAgICAgIlRoZSBibHVlIGNvbG9yIHZhbHVlIGZvciBjdXN0b20gUkdCIGNocm9tYSBrZXlpbmciLCAwLCAyNTUsCisgICAgICAgICAgREVGQVVMVF9UQVJHRVRfQiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQU5HTEUsCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJhbmdsZSIsICJBbmdsZSIsICJTaXplIG9mIHRoZSBjb2xvcmN1YmUgdG8gY2hhbmdlIiwKKyAgICAgICAgICAwLjAsIDkwLjAsIERFRkFVTFRfQU5HTEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX05PSVNFX0xFVkVMLAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgibm9pc2UtbGV2ZWwiLCAiTm9pc2UgTGV2ZWwiLCAiU2l6ZSBvZiBub2lzZSByYWRpdXMiLAorICAgICAgICAgIDAuMCwgNjQuMCwgREVGQVVMVF9OT0lTRV9MRVZFTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksCisgICAgICBQUk9QX0JMQUNLX1NFTlNJVElWSVRZLCBnX3BhcmFtX3NwZWNfdWludCAoImJsYWNrLXNlbnNpdGl2aXR5IiwKKyAgICAgICAgICAiQmxhY2sgU2Vuc2l0aXZpdHkiLCAiU2Vuc2l0aXZpdHkgdG8gZGFyayBjb2xvcnMiLCAwLCAxMjgsCisgICAgICAgICAgREVGQVVMVF9CTEFDS19TRU5TSVRJVklUWSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksCisgICAgICBQUk9QX1dISVRFX1NFTlNJVElWSVRZLCBnX3BhcmFtX3NwZWNfdWludCAoIndoaXRlLXNlbnNpdGl2aXR5IiwKKyAgICAgICAgICAiV2hpdGUgU2Vuc2l0aXZpdHkiLCAiU2Vuc2l0aXZpdHkgdG8gYnJpZ2h0IGNvbG9ycyIsIDAsIDEyOCwKKyAgICAgICAgICBERUZBVUxUX1dISVRFX1NFTlNJVElWSVRZLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfUFJFRkVSX1BBU1NUSFJPVUdILCBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInByZWZlci1wYXNzdGhyb3VnaCIsCisgICAgICAgICAgIlByZWZlciBQYXNzdGhyb3VnaCIsCisgICAgICAgICAgIkRvbid0IGRvIGFueSBwcm9jZXNzaW5nIGZvciBhbHBoYT0xLjAgaWYgcG9zc2libGUiLAorICAgICAgICAgIERFRkFVTFRfUFJFRkVSX1BBU1NUSFJPVUdILAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiQWxwaGEgZmlsdGVyIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJBZGRzIGFuIGFscGhhIGNoYW5uZWwgdG8gdmlkZW8gLSB1bmlmb3JtIG9yIHZpYSBjaHJvbWEta2V5aW5nIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPlxuIgorICAgICAgIkVkd2FyZCBIZXJ2ZXkgPGVkd2FyZC5oZXJ2ZXlAY29sbGFib3JhLmNvLnVrPlxuIgorICAgICAgIkphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfYWxwaGFfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9hbHBoYV9zcmNfdGVtcGxhdGUpOworCisgIGJ0cmFuc19jbGFzcy0+YmVmb3JlX3RyYW5zZm9ybSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FscGhhX2JlZm9yZV90cmFuc2Zvcm0pOworICBidHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9jYXBzID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hbHBoYV90cmFuc2Zvcm1fY2Fwcyk7CisKKyAgdmZpbHRlcl9jbGFzcy0+c2V0X2luZm8gPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FscGhhX3NldF9pbmZvKTsKKyAgdmZpbHRlcl9jbGFzcy0+dHJhbnNmb3JtX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWxwaGFfdHJhbnNmb3JtX2ZyYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9pbml0IChHc3RBbHBoYSAqIGFscGhhKQoreworICBhbHBoYS0+YWxwaGEgPSBERUZBVUxUX0FMUEhBOworICBhbHBoYS0+bWV0aG9kID0gREVGQVVMVF9NRVRIT0Q7CisgIGFscGhhLT50YXJnZXRfciA9IERFRkFVTFRfVEFSR0VUX1I7CisgIGFscGhhLT50YXJnZXRfZyA9IERFRkFVTFRfVEFSR0VUX0c7CisgIGFscGhhLT50YXJnZXRfYiA9IERFRkFVTFRfVEFSR0VUX0I7CisgIGFscGhhLT5hbmdsZSA9IERFRkFVTFRfQU5HTEU7CisgIGFscGhhLT5ub2lzZV9sZXZlbCA9IERFRkFVTFRfTk9JU0VfTEVWRUw7CisgIGFscGhhLT5ibGFja19zZW5zaXRpdml0eSA9IERFRkFVTFRfQkxBQ0tfU0VOU0lUSVZJVFk7CisgIGFscGhhLT53aGl0ZV9zZW5zaXRpdml0eSA9IERFRkFVTFRfV0hJVEVfU0VOU0lUSVZJVFk7CisKKyAgZ19tdXRleF9pbml0ICgmYWxwaGEtPmxvY2spOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FscGhhX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RBbHBoYSAqYWxwaGEgPSBHU1RfQUxQSEEgKG9iamVjdCk7CisKKyAgZ19tdXRleF9jbGVhciAoJmFscGhhLT5sb2NrKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWxwaGFfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEFscGhhICphbHBoYSA9IEdTVF9BTFBIQSAob2JqZWN0KTsKKyAgZ2Jvb2xlYW4gcmVjb25maWd1cmUgPSBGQUxTRTsKKworICBHU1RfQUxQSEFfTE9DSyAoYWxwaGEpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTUVUSE9EOnsKKyAgICAgIGdpbnQgbWV0aG9kID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworCisgICAgICByZWNvbmZpZ3VyZSA9IChtZXRob2QgIT0gYWxwaGEtPm1ldGhvZCkgJiYgKG1ldGhvZCA9PSBBTFBIQV9NRVRIT0RfU0VUCisgICAgICAgICAgfHwgYWxwaGEtPm1ldGhvZCA9PSBBTFBIQV9NRVRIT0RfU0VUKSAmJiAoYWxwaGEtPmFscGhhID09IDEuMCkKKyAgICAgICAgICAmJiAoYWxwaGEtPnByZWZlcl9wYXNzdGhyb3VnaCk7CisgICAgICBhbHBoYS0+bWV0aG9kID0gbWV0aG9kOworCisgICAgICBnc3RfYWxwaGFfc2V0X3Byb2Nlc3NfZnVuY3Rpb24gKGFscGhhKTsKKyAgICAgIGdzdF9hbHBoYV9pbml0X3BhcmFtcyAoYWxwaGEpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9BTFBIQTp7CisgICAgICBnZG91YmxlIGEgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKworICAgICAgcmVjb25maWd1cmUgPSAoYSAhPSBhbHBoYS0+YWxwaGEpICYmIChhID09IDEuMCB8fCBhbHBoYS0+YWxwaGEgPT0gMS4wKQorICAgICAgICAgICYmIChhbHBoYS0+bWV0aG9kID09IEFMUEhBX01FVEhPRF9TRVQpICYmIChhbHBoYS0+cHJlZmVyX3Bhc3N0aHJvdWdoKTsKKyAgICAgIGFscGhhLT5hbHBoYSA9IGE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX1RBUkdFVF9SOgorICAgICAgYWxwaGEtPnRhcmdldF9yID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgZ3N0X2FscGhhX2luaXRfcGFyYW1zIChhbHBoYSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEFSR0VUX0c6CisgICAgICBhbHBoYS0+dGFyZ2V0X2cgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBnc3RfYWxwaGFfaW5pdF9wYXJhbXMgKGFscGhhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UQVJHRVRfQjoKKyAgICAgIGFscGhhLT50YXJnZXRfYiA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGdzdF9hbHBoYV9pbml0X3BhcmFtcyAoYWxwaGEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FOR0xFOgorICAgICAgYWxwaGEtPmFuZ2xlID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGdzdF9hbHBoYV9pbml0X3BhcmFtcyAoYWxwaGEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05PSVNFX0xFVkVMOgorICAgICAgYWxwaGEtPm5vaXNlX2xldmVsID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGdzdF9hbHBoYV9pbml0X3BhcmFtcyAoYWxwaGEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JMQUNLX1NFTlNJVElWSVRZOgorICAgICAgYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1dISVRFX1NFTlNJVElWSVRZOgorICAgICAgYWxwaGEtPndoaXRlX3NlbnNpdGl2aXR5ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BSRUZFUl9QQVNTVEhST1VHSDp7CisgICAgICBnYm9vbGVhbiBwcmVmZXJfcGFzc3Rocm91Z2ggPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisKKyAgICAgIHJlY29uZmlndXJlID0gKCghICFwcmVmZXJfcGFzc3Rocm91Z2gpICE9ICghICFhbHBoYS0+cHJlZmVyX3Bhc3N0aHJvdWdoKSkKKyAgICAgICAgICAmJiAoYWxwaGEtPm1ldGhvZCA9PSBBTFBIQV9NRVRIT0RfU0VUKSAmJiAoYWxwaGEtPmFscGhhID09IDEuMCk7CisgICAgICBhbHBoYS0+cHJlZmVyX3Bhc3N0aHJvdWdoID0gcHJlZmVyX3Bhc3N0aHJvdWdoOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAocmVjb25maWd1cmUpCisgICAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3JlY29uZmlndXJlX3NyYyAoR1NUX0JBU0VfVFJBTlNGT1JNX0NBU1QgKGFscGhhKSk7CisKKyAgR1NUX0FMUEhBX1VOTE9DSyAoYWxwaGEpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FscGhhX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBbHBoYSAqYWxwaGEgPSBHU1RfQUxQSEEgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01FVEhPRDoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBhbHBoYS0+bWV0aG9kKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BTFBIQToKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIGFscGhhLT5hbHBoYSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEFSR0VUX1I6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgYWxwaGEtPnRhcmdldF9yKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UQVJHRVRfRzoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBhbHBoYS0+dGFyZ2V0X2cpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RBUkdFVF9COgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIGFscGhhLT50YXJnZXRfYik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQU5HTEU6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIGFscGhhLT5hbmdsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTk9JU0VfTEVWRUw6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIGFscGhhLT5ub2lzZV9sZXZlbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkxBQ0tfU0VOU0lUSVZJVFk6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9XSElURV9TRU5TSVRJVklUWToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBhbHBoYS0+d2hpdGVfc2Vuc2l0aXZpdHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BSRUZFUl9QQVNTVEhST1VHSDoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBhbHBoYS0+cHJlZmVyX3Bhc3N0aHJvdWdoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2FscGhhX3RyYW5zZm9ybV9jYXBzIChHc3RCYXNlVHJhbnNmb3JtICogYnRyYW5zLAorICAgIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENhcHMgKiBjYXBzLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RBbHBoYSAqYWxwaGEgPSBHU1RfQUxQSEEgKGJ0cmFucyk7CisgIEdzdENhcHMgKnJldCwgKnRtcCwgKnRtcDI7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnaW50IGk7CisKKyAgdG1wID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIEdTVF9BTFBIQV9MT0NLIChhbHBoYSk7CisgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7IGkrKykgeworICAgIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfY29weSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSkpOworCisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHN0cnVjdHVyZSwgImZvcm1hdCIpOworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzdHJ1Y3R1cmUsICJjb2xvcmltZXRyeSIpOworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzdHJ1Y3R1cmUsICJjaHJvbWEtc2l0ZSIpOworCisgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAodG1wLCBzdHJ1Y3R1cmUpOworICB9CisKKyAgaWYgKGRpcmVjdGlvbiA9PSBHU1RfUEFEX1NJTkspIHsKKyAgICB0bXAyID0gZ3N0X3N0YXRpY19jYXBzX2dldCAoJmdzdF9hbHBoYV9hbHBoYV9jYXBzKTsKKyAgICByZXQgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHRtcCwgdG1wMik7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcDIpOworICAgIHRtcCA9IHJldDsKKyAgICByZXQgPSBOVUxMOworCisgICAgaWYgKGFscGhhLT5wcmVmZXJfcGFzc3Rocm91Z2ggJiYgYWxwaGEtPm1ldGhvZCA9PSBBTFBIQV9NRVRIT0RfU0VUCisgICAgICAgICYmIGFscGhhLT5hbHBoYSA9PSAxLjApIHsKKyAgICAgIHJldCA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworICAgICAgZ3N0X2NhcHNfYXBwZW5kIChyZXQsIHRtcCk7CisgICAgICB0bXAgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICByZXQgPSB0bXA7CisgICAgICB0bXAgPSBOVUxMOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXQgPSB0bXA7CisgICAgdG1wID0gTlVMTDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGFscGhhLAorICAgICAgIlRyYW5zZm9ybWVkICUiIEdTVF9QVFJfRk9STUFUICIgLT4gJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMsIHJldCk7CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmludGVyc2VjdGlvbjsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFscGhhLCAiVXNpbmcgZmlsdGVyIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGZpbHRlcik7CisgICAgaW50ZXJzZWN0aW9uID0KKyAgICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgcmV0LCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChyZXQpOworICAgIHJldCA9IGludGVyc2VjdGlvbjsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhbHBoYSwgIkludGVyc2VjdGlvbiAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKyAgfQorCisKKyAgR1NUX0FMUEhBX1VOTE9DSyAoYWxwaGEpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FscGhhX3NldF9pbmZvIChHc3RWaWRlb0ZpbHRlciAqIGZpbHRlciwKKyAgICBHc3RDYXBzICogaW5jYXBzLCBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLCBHc3RDYXBzICogb3V0Y2FwcywKKyAgICBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0QWxwaGEgKmFscGhhID0gR1NUX0FMUEhBIChmaWx0ZXIpOworICBnYm9vbGVhbiBwYXNzdGhyb3VnaDsKKworICBHU1RfQUxQSEFfTE9DSyAoYWxwaGEpOworCisgIGFscGhhLT5pbl9zZHR2ID0gaW5faW5mby0+Y29sb3JpbWV0cnkubWF0cml4ID09IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQ2MDE7CisgIGFscGhhLT5vdXRfc2R0diA9CisgICAgICBvdXRfaW5mby0+Y29sb3JpbWV0cnkubWF0cml4ID09IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQ2MDE7CisKKyAgcGFzc3Rocm91Z2ggPSBhbHBoYS0+cHJlZmVyX3Bhc3N0aHJvdWdoICYmCisgICAgICBHU1RfVklERU9fSU5GT19GT1JNQVQgKGluX2luZm8pID09IEdTVF9WSURFT19JTkZPX0ZPUk1BVCAob3V0X2luZm8pCisgICAgICAmJiBhbHBoYS0+aW5fc2R0diA9PSBhbHBoYS0+b3V0X3NkdHYgJiYgYWxwaGEtPm1ldGhvZCA9PSBBTFBIQV9NRVRIT0RfU0VUCisgICAgICAmJiBhbHBoYS0+YWxwaGEgPT0gMS4wOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGFscGhhLAorICAgICAgIlNldHRpbmcgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCAiIC0+ICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAiIChwYXNzdGhyb3VnaDogJWQpIiwgaW5jYXBzLCBvdXRjYXBzLCBwYXNzdGhyb3VnaCk7CisgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfcGFzc3Rocm91Z2ggKEdTVF9CQVNFX1RSQU5TRk9STV9DQVNUIChmaWx0ZXIpLAorICAgICAgcGFzc3Rocm91Z2gpOworCisgIGlmICghZ3N0X2FscGhhX3NldF9wcm9jZXNzX2Z1bmN0aW9uX2Z1bGwgKGFscGhhLCBpbl9pbmZvLCBvdXRfaW5mbykKKyAgICAgICYmICFwYXNzdGhyb3VnaCkKKyAgICBnb3RvIG5vX3Byb2Nlc3M7CisKKyAgZ3N0X2FscGhhX2luaXRfcGFyYW1zX2Z1bGwgKGFscGhhLCBpbl9pbmZvLT5maW5mbywgb3V0X2luZm8tPmZpbmZvKTsKKworICBHU1RfQUxQSEFfVU5MT0NLIChhbHBoYSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19wcm9jZXNzOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhbHBoYSwKKyAgICAgICAgIk5vIHByb2Nlc3NpbmcgZnVuY3Rpb24gZm9yIHRoaXMgY2FwcyBhbmQgbm8gcGFzc3Rocm91Z2ggbW9kZSIpOworICAgIEdTVF9BTFBIQV9VTkxPQ0sgKGFscGhhKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogYmFzZWQgb24gaHR0cDovL3d3dy5jcy51dGFoLmVkdS9+bWljaGFlbC9jaHJvbWEvCisgKi8KK3N0YXRpYyBpbmxpbmUgZ2ludAorY2hyb21hX2tleWluZ195dXYgKGdpbnQgYSwgZ2ludCAqIHksIGdpbnQgKiB1LAorICAgIGdpbnQgKiB2LCBnaW50IGNyLCBnaW50IGNiLCBnaW50IHNtaW4sIGdpbnQgc21heCwgZ3VpbnQ4IGFjY2VwdF9hbmdsZV90ZywKKyAgICBndWludDggYWNjZXB0X2FuZ2xlX2N0ZywgZ3VpbnQ4IG9uZV9vdmVyX2tjLCBndWludDgga2ZneV9zY2FsZSwgZ2ludDgga2csCisgICAgZ3VpbnQgbm9pc2VfbGV2ZWwyKQoreworICBnaW50IHRtcCwgdG1wMTsKKyAgZ2ludCB4MSwgeTE7CisgIGdpbnQgeCwgejsKKyAgZ2ludCBiX2FscGhhOworCisgIC8qIHRvbyBkYXJrIG9yIHRvbyBicmlnaHQsIGtlZXAgYWxwaGEgKi8KKyAgaWYgKCp5IDwgc21pbiB8fCAqeSA+IHNtYXgpCisgICAgcmV0dXJuIGE7CisKKyAgLyogQ29udmVydCBmb3JlZ3JvdW5kIHRvIFhaIGNvb3JkcyB3aGVyZSBYIGRpcmVjdGlvbiBpcyBkZWZpbmVkIGJ5CisgICAgIHRoZSBrZXkgY29sb3IgKi8KKyAgdG1wID0gKCgqdSkgKiBjYiArICgqdikgKiBjcikgPj4gNzsKKyAgeCA9IENMQU1QICh0bXAsIC0xMjgsIDEyNyk7CisgIHRtcCA9ICgoKnYpICogY2IgLSAoKnUpICogY3IpID4+IDc7CisgIHogPSBDTEFNUCAodG1wLCAtMTI4LCAxMjcpOworCisgIC8qIFdBUk5JTkc6IGFjY2VwdCBhbmdsZSBzaG91bGQgbmV2ZXIgYmUgc2V0IGdyZWF0ZXIgdGhhbiAic29tZXdoYXQgbGVzcworICAgICB0aGFuIDkwIGRlZ3JlZXMiIHRvIGF2b2lkIGRlYWxpbmcgd2l0aCBuZWdhdGl2ZS9pbmZpbml0ZSB0Zy4gSW4gcmVhbGl0eSwKKyAgICAgODAgZGVncmVlcyBzaG91bGQgYmUgZW5vdWdoIGlmIGZvcmVncm91bmQgaXMgcmVhc29uYWJsZS4gSWYgdGhpcyBzZWVtcworICAgICB0byBiZSBhIHByb2JsZW0sIGdvIHRvIGFsdGVybmF0aXZlIHdheXMgb2YgY2hlY2tpbmcgcG9pbnQgcG9zaXRpb24KKyAgICAgKHNjYWxhciBwcm9kdWN0IG9yIGxpbmUgZXF1YXRpb25zKS4gVGhpcyBhbmdsZSBzaG91bGQgbm90IGJlIHRvbyBzbWFsbAorICAgICBlaXRoZXIgdG8gYXZvaWQgaW5maW5pdGUgY3RnICh1c2VkIHRvIHN1cHByZXNzIGZvcmVncm91bmQgd2l0aG91dCB1c2Ugb2YKKyAgICAgZGl2aXNpb24pICovCisKKyAgdG1wID0gKHggKiBhY2NlcHRfYW5nbGVfdGcpID4+IDQ7CisgIHRtcCA9IE1JTiAodG1wLCAxMjcpOworCisgIGlmIChhYnMgKHopID4gdG1wKSB7CisgICAgLyoga2VlcCBmb3JlZ3JvdW5kIEtmZyA9IDAgKi8KKyAgICByZXR1cm4gYTsKKyAgfQorICAvKiBDb21wdXRlIEtmZyAoaW1wbGljaXRseSkgYW5kIEtiZywgc3VwcHJlc3MgZm9yZWdyb3VuZCBpbiBYWiBjb29yZAorICAgICBhY2NvcmRpbmcgdG8gS2ZnICovCisgIHRtcCA9ICh6ICogYWNjZXB0X2FuZ2xlX2N0ZykgPj4gNDsKKyAgdG1wID0gQ0xBTVAgKHRtcCwgLTEyOCwgMTI3KTsKKyAgeDEgPSBhYnMgKHRtcCk7CisgIHkxID0gejsKKworICB0bXAxID0geCAtIHgxOworICB0bXAxID0gTUFYICh0bXAxLCAwKTsKKyAgYl9hbHBoYSA9ICh0bXAxICogb25lX292ZXJfa2MpIC8gMjsKKyAgYl9hbHBoYSA9IDI1NSAtIENMQU1QIChiX2FscGhhLCAwLCAyNTUpOworICBiX2FscGhhID0gKGEgKiBiX2FscGhhKSA+PiA4OworCisgIHRtcCA9ICh0bXAxICoga2ZneV9zY2FsZSkgPj4gNDsKKyAgdG1wMSA9IE1JTiAodG1wLCAyNTUpOworCisgICp5ID0gKCp5IDwgdG1wMSkgPyAwIDogKnkgLSB0bXAxOworCisgIC8qIENvbnZlcnQgc3VwcHJlc3NlZCBmb3JlZ3JvdW5kIGJhY2sgdG8gQ2JDciAqLworICB0bXAgPSAoeDEgKiBjYiAtIHkxICogY3IpID4+IDc7CisgICp1ID0gQ0xBTVAgKHRtcCwgLTEyOCwgMTI3KTsKKworICB0bXAgPSAoeDEgKiBjciArIHkxICogY2IpID4+IDc7CisgICp2ID0gQ0xBTVAgKHRtcCwgLTEyOCwgMTI3KTsKKworICAvKiBEZWFsIHdpdGggbm9pc2UuIEZvciBub3csIGEgY2lyY2xlIGFyb3VuZCB0aGUga2V5IGNvbG9yIHdpdGgKKyAgICAgcmFkaXVzIG9mIG5vaXNlX2xldmVsIHRyZWF0ZWQgYXMgZXhhY3Qga2V5IGNvbG9yLiBJbnRyb2R1Y2VzCisgICAgIHNoYXJwIHRyYW5zaXRpb25zLgorICAgKi8KKyAgdG1wID0geiAqIHogKyAoeCAtIGtnKSAqICh4IC0ga2cpOworICB0bXAgPSBNSU4gKHRtcCwgMHhmZmZmKTsKKworICBpZiAodG1wIDwgbm9pc2VfbGV2ZWwyKQorICAgIGJfYWxwaGEgPSAwOworCisgIHJldHVybiBiX2FscGhhOworfQorCisjZGVmaW5lIEFQUExZX01BVFJJWChtLG8sdjEsdjIsdjMpICgobVtvKjRdICogdjEgKyBtW28qNCsxXSAqIHYyICsgbVtvKjQrMl0gKiB2MyArIG1bbyo0KzNdKSA+PiA4KQorCitzdGF0aWMgdm9pZAorZ3N0X2FscGhhX3NldF9hcmdiX2F5dXYgKGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lLCBHc3RBbHBoYSAqIGFscGhhKQoreworICBnaW50IHNfYWxwaGEgPSBDTEFNUCAoKGdpbnQpIChhbHBoYS0+YWxwaGEgKiAyNTYpLCAwLCAyNTYpOworICBjb25zdCBndWludDggKnNyYzsKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBtYXRyaXhbMTJdOworICBnaW50IHksIHUsIHY7CisgIGdpbnQgb1s0XTsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIG9bMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMyk7CisgIG9bMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMCk7CisgIG9bMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMSk7CisgIG9bM10gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMik7CisKKyAgbWVtY3B5IChtYXRyaXgsCisgICAgICBhbHBoYS0+b3V0X3NkdHYgPyBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9oZHR2LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICBkZXN0WzBdID0gKHNyY1tvWzBdXSAqIHNfYWxwaGEpID4+IDg7CisKKyAgICAgIHkgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgc3JjW29bMV1dLCBzcmNbb1syXV0sIHNyY1tvWzNdXSk7CisgICAgICB1ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHNyY1tvWzFdXSwgc3JjW29bMl1dLCBzcmNbb1szXV0pOworICAgICAgdiA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCBzcmNbb1sxXV0sIHNyY1tvWzJdXSwgc3JjW29bM11dKTsKKworICAgICAgZGVzdFsxXSA9IHk7CisgICAgICBkZXN0WzJdID0gdTsKKyAgICAgIGRlc3RbM10gPSB2OworCisgICAgICBkZXN0ICs9IDQ7CisgICAgICBzcmMgKz0gNDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9jaHJvbWFfa2V5X2FyZ2JfYXl1diAoY29uc3QgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUsIEdzdEFscGhhICogYWxwaGEpCit7CisgIGNvbnN0IGd1aW50OCAqc3JjOworICBndWludDggKmRlc3Q7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBpLCBqOworICBnaW50IGEsIHksIHUsIHY7CisgIGdpbnQgciwgZywgYjsKKyAgZ2ludCBzbWluLCBzbWF4OworICBnaW50IHBhID0gQ0xBTVAgKChnaW50KSAoYWxwaGEtPmFscGhhICogMjU2KSwgMCwgMjU2KTsKKyAgZ2ludDggY2IgPSBhbHBoYS0+Y2IsIGNyID0gYWxwaGEtPmNyOworICBnaW50OCBrZyA9IGFscGhhLT5rZzsKKyAgZ3VpbnQ4IGFjY2VwdF9hbmdsZV90ZyA9IGFscGhhLT5hY2NlcHRfYW5nbGVfdGc7CisgIGd1aW50OCBhY2NlcHRfYW5nbGVfY3RnID0gYWxwaGEtPmFjY2VwdF9hbmdsZV9jdGc7CisgIGd1aW50OCBvbmVfb3Zlcl9rYyA9IGFscGhhLT5vbmVfb3Zlcl9rYzsKKyAgZ3VpbnQ4IGtmZ3lfc2NhbGUgPSBhbHBoYS0+a2ZneV9zY2FsZTsKKyAgZ3VpbnQgbm9pc2VfbGV2ZWwyID0gYWxwaGEtPm5vaXNlX2xldmVsMjsKKyAgZ2ludCBtYXRyaXhbMTJdOworICBnaW50IG9bNF07CisKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAwKTsKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKTsKKworICBvWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAoaW5fZnJhbWUsIDMpOworICBvWzFdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAoaW5fZnJhbWUsIDApOworICBvWzJdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAoaW5fZnJhbWUsIDEpOworICBvWzNdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAoaW5fZnJhbWUsIDIpOworCisgIHNtaW4gPSAxMjggLSBhbHBoYS0+YmxhY2tfc2Vuc2l0aXZpdHk7CisgIHNtYXggPSAxMjggKyBhbHBoYS0+d2hpdGVfc2Vuc2l0aXZpdHk7CisKKyAgbWVtY3B5IChtYXRyaXgsCisgICAgICBhbHBoYS0+b3V0X3NkdHYgPyBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9oZHR2LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICBhID0gKHNyY1tvWzBdXSAqIHBhKSA+PiA4OworICAgICAgciA9IHNyY1tvWzFdXTsKKyAgICAgIGcgPSBzcmNbb1syXV07CisgICAgICBiID0gc3JjW29bM11dOworCisgICAgICB5ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHIsIGcsIGIpOworICAgICAgdSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCByLCBnLCBiKSAtIDEyODsKKyAgICAgIHYgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgciwgZywgYikgLSAxMjg7CisKKyAgICAgIGEgPSBjaHJvbWFfa2V5aW5nX3l1diAoYSwgJnksICZ1LCAmdiwgY3IsIGNiLAorICAgICAgICAgIHNtaW4sIHNtYXgsIGFjY2VwdF9hbmdsZV90ZywgYWNjZXB0X2FuZ2xlX2N0ZywKKyAgICAgICAgICBvbmVfb3Zlcl9rYywga2ZneV9zY2FsZSwga2csIG5vaXNlX2xldmVsMik7CisKKyAgICAgIHUgKz0gMTI4OworICAgICAgdiArPSAxMjg7CisKKyAgICAgIGRlc3RbMF0gPSBhOworICAgICAgZGVzdFsxXSA9IHk7CisgICAgICBkZXN0WzJdID0gdTsKKyAgICAgIGRlc3RbM10gPSB2OworCisgICAgICBzcmMgKz0gNDsKKyAgICAgIGRlc3QgKz0gNDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9zZXRfYXJnYl9hcmdiIChjb25zdCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSwgR3N0QWxwaGEgKiBhbHBoYSkKK3sKKyAgY29uc3QgZ3VpbnQ4ICpzcmM7CisgIGd1aW50OCAqZGVzdDsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IHNfYWxwaGEgPSBDTEFNUCAoKGdpbnQpIChhbHBoYS0+YWxwaGEgKiAyNTYpLCAwLCAyNTYpOworICBnaW50IGksIGo7CisgIGdpbnQgcFs0XSwgb1s0XTsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIHBbMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDMpOworICBwWzFdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAwKTsKKyAgcFsyXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMSk7CisgIHBbM10gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDIpOworCisgIG9bMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMyk7CisgIG9bMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMCk7CisgIG9bMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMSk7CisgIG9bM10gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMik7CisKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgIGRlc3RbcFswXV0gPSAoc3JjW29bMF1dICogc19hbHBoYSkgPj4gODsKKworICAgICAgZGVzdFtwWzFdXSA9IHNyY1tvWzFdXTsKKyAgICAgIGRlc3RbcFsyXV0gPSBzcmNbb1syXV07CisgICAgICBkZXN0W3BbM11dID0gc3JjW29bM11dOworCisgICAgICBkZXN0ICs9IDQ7CisgICAgICBzcmMgKz0gNDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9jaHJvbWFfa2V5X2FyZ2JfYXJnYiAoY29uc3QgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUsIEdzdEFscGhhICogYWxwaGEpCit7CisgIGNvbnN0IGd1aW50OCAqc3JjOworICBndWludDggKmRlc3Q7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBpLCBqOworICBnaW50IGEsIHksIHUsIHY7CisgIGdpbnQgciwgZywgYjsKKyAgZ2ludCBzbWluLCBzbWF4OworICBnaW50IHBhID0gQ0xBTVAgKChnaW50KSAoYWxwaGEtPmFscGhhICogMjU2KSwgMCwgMjU2KTsKKyAgZ2ludDggY2IgPSBhbHBoYS0+Y2IsIGNyID0gYWxwaGEtPmNyOworICBnaW50OCBrZyA9IGFscGhhLT5rZzsKKyAgZ3VpbnQ4IGFjY2VwdF9hbmdsZV90ZyA9IGFscGhhLT5hY2NlcHRfYW5nbGVfdGc7CisgIGd1aW50OCBhY2NlcHRfYW5nbGVfY3RnID0gYWxwaGEtPmFjY2VwdF9hbmdsZV9jdGc7CisgIGd1aW50OCBvbmVfb3Zlcl9rYyA9IGFscGhhLT5vbmVfb3Zlcl9rYzsKKyAgZ3VpbnQ4IGtmZ3lfc2NhbGUgPSBhbHBoYS0+a2ZneV9zY2FsZTsKKyAgZ3VpbnQgbm9pc2VfbGV2ZWwyID0gYWxwaGEtPm5vaXNlX2xldmVsMjsKKyAgZ2ludCBtYXRyaXhbMTJdLCBtYXRyaXgyWzEyXTsKKyAgZ2ludCBwWzRdLCBvWzRdOworCisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSk7CisKKyAgcFswXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMyk7CisgIHBbMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDApOworICBwWzJdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAxKTsKKyAgcFszXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMik7CisKKyAgb1swXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAzKTsKKyAgb1sxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAwKTsKKyAgb1syXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAxKTsKKyAgb1szXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAyKTsKKworICBzbWluID0gMTI4IC0gYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5OworICBzbWF4ID0gMTI4ICsgYWxwaGEtPndoaXRlX3NlbnNpdGl2aXR5OworCisgIG1lbWNweSAobWF0cml4LCBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYsIDEyICogc2l6ZW9mIChnaW50KSk7CisgIG1lbWNweSAobWF0cml4MiwgY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICBhID0gKHNyY1tvWzBdXSAqIHBhKSA+PiA4OworICAgICAgciA9IHNyY1tvWzFdXTsKKyAgICAgIGcgPSBzcmNbb1syXV07CisgICAgICBiID0gc3JjW29bM11dOworCisgICAgICB5ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHIsIGcsIGIpOworICAgICAgdSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCByLCBnLCBiKSAtIDEyODsKKyAgICAgIHYgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgciwgZywgYikgLSAxMjg7CisKKyAgICAgIGEgPSBjaHJvbWFfa2V5aW5nX3l1diAoYSwgJnksICZ1LCAmdiwgY3IsIGNiLAorICAgICAgICAgIHNtaW4sIHNtYXgsIGFjY2VwdF9hbmdsZV90ZywgYWNjZXB0X2FuZ2xlX2N0ZywKKyAgICAgICAgICBvbmVfb3Zlcl9rYywga2ZneV9zY2FsZSwga2csIG5vaXNlX2xldmVsMik7CisKKyAgICAgIHUgKz0gMTI4OworICAgICAgdiArPSAxMjg7CisKKyAgICAgIHIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeDIsIDAsIHksIHUsIHYpOworICAgICAgZyA9IEFQUExZX01BVFJJWCAobWF0cml4MiwgMSwgeSwgdSwgdik7CisgICAgICBiID0gQVBQTFlfTUFUUklYIChtYXRyaXgyLCAyLCB5LCB1LCB2KTsKKworICAgICAgZGVzdFtwWzBdXSA9IGE7CisgICAgICBkZXN0W3BbMV1dID0gQ0xBTVAgKHIsIDAsIDI1NSk7CisgICAgICBkZXN0W3BbMl1dID0gQ0xBTVAgKGcsIDAsIDI1NSk7CisgICAgICBkZXN0W3BbM11dID0gQ0xBTVAgKGIsIDAsIDI1NSk7CisKKyAgICAgIHNyYyArPSA0OworICAgICAgZGVzdCArPSA0OworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2FscGhhX3NldF9heXV2X2FyZ2IgKGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lLCBHc3RBbHBoYSAqIGFscGhhKQoreworICBjb25zdCBndWludDggKnNyYzsKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgc19hbHBoYSA9IENMQU1QICgoZ2ludCkgKGFscGhhLT5hbHBoYSAqIDI1NiksIDAsIDI1Nik7CisgIGdpbnQgeSwgeDsKKyAgZ2ludCBtYXRyaXhbMTJdOworICBnaW50IHIsIGcsIGI7CisgIGdpbnQgcFs0XTsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIHBbMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDMpOworICBwWzFdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAwKTsKKyAgcFsyXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMSk7CisgIHBbM10gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDIpOworCisgIG1lbWNweSAobWF0cml4LAorICAgICAgYWxwaGEtPmluX3NkdHYgPyBjb2dfeWNiY3JfdG9fcmdiX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9oZHR2LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICBkZXN0W3BbMF1dID0gKHNyY1swXSAqIHNfYWxwaGEpID4+IDg7CisKKyAgICAgIHIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgc3JjWzFdLCBzcmNbMl0sIHNyY1szXSk7CisgICAgICBnID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHNyY1sxXSwgc3JjWzJdLCBzcmNbM10pOworICAgICAgYiA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCBzcmNbMV0sIHNyY1syXSwgc3JjWzNdKTsKKworICAgICAgZGVzdFtwWzFdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzJdXSA9IENMQU1QIChnLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzNdXSA9IENMQU1QIChiLCAwLCAyNTUpOworCisgICAgICBkZXN0ICs9IDQ7CisgICAgICBzcmMgKz0gNDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9jaHJvbWFfa2V5X2F5dXZfYXJnYiAoY29uc3QgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUsIEdzdEFscGhhICogYWxwaGEpCit7CisgIGNvbnN0IGd1aW50OCAqc3JjOworICBndWludDggKmRlc3Q7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBpLCBqOworICBnaW50IGEsIHksIHUsIHY7CisgIGdpbnQgciwgZywgYjsKKyAgZ2ludCBzbWluLCBzbWF4OworICBnaW50IHBhID0gQ0xBTVAgKChnaW50KSAoYWxwaGEtPmFscGhhICogMjU2KSwgMCwgMjU2KTsKKyAgZ2ludDggY2IgPSBhbHBoYS0+Y2IsIGNyID0gYWxwaGEtPmNyOworICBnaW50OCBrZyA9IGFscGhhLT5rZzsKKyAgZ3VpbnQ4IGFjY2VwdF9hbmdsZV90ZyA9IGFscGhhLT5hY2NlcHRfYW5nbGVfdGc7CisgIGd1aW50OCBhY2NlcHRfYW5nbGVfY3RnID0gYWxwaGEtPmFjY2VwdF9hbmdsZV9jdGc7CisgIGd1aW50OCBvbmVfb3Zlcl9rYyA9IGFscGhhLT5vbmVfb3Zlcl9rYzsKKyAgZ3VpbnQ4IGtmZ3lfc2NhbGUgPSBhbHBoYS0+a2ZneV9zY2FsZTsKKyAgZ3VpbnQgbm9pc2VfbGV2ZWwyID0gYWxwaGEtPm5vaXNlX2xldmVsMjsKKyAgZ2ludCBtYXRyaXhbMTJdOworICBnaW50IHBbNF07CisKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAwKTsKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKTsKKworICBwWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAzKTsKKyAgcFsxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMCk7CisgIHBbMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDEpOworICBwWzNdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAyKTsKKworICBzbWluID0gMTI4IC0gYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5OworICBzbWF4ID0gMTI4ICsgYWxwaGEtPndoaXRlX3NlbnNpdGl2aXR5OworCisgIG1lbWNweSAobWF0cml4LAorICAgICAgYWxwaGEtPmluX3NkdHYgPyBjb2dfeWNiY3JfdG9fcmdiX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9oZHR2LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICBhID0gKHNyY1swXSAqIHBhKSA+PiA4OworICAgICAgeSA9IHNyY1sxXTsKKyAgICAgIHUgPSBzcmNbMl0gLSAxMjg7CisgICAgICB2ID0gc3JjWzNdIC0gMTI4OworCisgICAgICBhID0gY2hyb21hX2tleWluZ195dXYgKGEsICZ5LCAmdSwgJnYsIGNyLCBjYiwKKyAgICAgICAgICBzbWluLCBzbWF4LCBhY2NlcHRfYW5nbGVfdGcsIGFjY2VwdF9hbmdsZV9jdGcsCisgICAgICAgICAgb25lX292ZXJfa2MsIGtmZ3lfc2NhbGUsIGtnLCBub2lzZV9sZXZlbDIpOworCisgICAgICB1ICs9IDEyODsKKyAgICAgIHYgKz0gMTI4OworCisgICAgICByID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHksIHUsIHYpOworICAgICAgZyA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5LCB1LCB2KTsKKyAgICAgIGIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeSwgdSwgdik7CisKKyAgICAgIGRlc3RbcFswXV0gPSBhOworICAgICAgZGVzdFtwWzFdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzJdXSA9IENMQU1QIChnLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzNdXSA9IENMQU1QIChiLCAwLCAyNTUpOworCisgICAgICBzcmMgKz0gNDsKKyAgICAgIGRlc3QgKz0gNDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9zZXRfYXl1dl9heXV2IChjb25zdCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSwgR3N0QWxwaGEgKiBhbHBoYSkKK3sKKyAgY29uc3QgZ3VpbnQ4ICpzcmM7CisgIGd1aW50OCAqZGVzdDsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IHNfYWxwaGEgPSBDTEFNUCAoKGdpbnQpIChhbHBoYS0+YWxwaGEgKiAyNTYpLCAwLCAyNTYpOworICBnaW50IHksIHg7CisKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAwKTsKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKTsKKworICBpZiAoYWxwaGEtPmluX3NkdHYgPT0gYWxwaGEtPm91dF9zZHR2KSB7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICBkZXN0WzBdID0gKHNyY1swXSAqIHNfYWxwaGEpID4+IDg7CisgICAgICAgIGRlc3RbMV0gPSBzcmNbMV07CisgICAgICAgIGRlc3RbMl0gPSBzcmNbMl07CisgICAgICAgIGRlc3RbM10gPSBzcmNbM107CisKKyAgICAgICAgZGVzdCArPSA0OworICAgICAgICBzcmMgKz0gNDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ2ludCBtYXRyaXhbMTJdOworCisgICAgbWVtY3B5IChtYXRyaXgsCisgICAgICAgIGFscGhhLT5vdXRfc2R0diA/IGNvZ195Y2Jjcl9oZHR2X3RvX3ljYmNyX3NkdHZfbWF0cml4XzhiaXQgOgorICAgICAgICBjb2dfeWNiY3Jfc2R0dl90b195Y2Jjcl9oZHR2X21hdHJpeF84Yml0LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICBkZXN0WzBdID0gKHNyY1swXSAqIHNfYWxwaGEpID4+IDg7CisgICAgICAgIGRlc3RbMV0gPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgc3JjWzFdLCBzcmNbMl0sIHNyY1szXSk7CisgICAgICAgIGRlc3RbMl0gPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgc3JjWzFdLCBzcmNbMl0sIHNyY1szXSk7CisgICAgICAgIGRlc3RbM10gPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgc3JjWzFdLCBzcmNbMl0sIHNyY1szXSk7CisKKyAgICAgICAgZGVzdCArPSA0OworICAgICAgICBzcmMgKz0gNDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9jaHJvbWFfa2V5X2F5dXZfYXl1diAoY29uc3QgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUsIEdzdEFscGhhICogYWxwaGEpCit7CisgIGNvbnN0IGd1aW50OCAqc3JjOworICBndWludDggKmRlc3Q7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBpLCBqOworICBnaW50IGEsIHksIHUsIHY7CisgIGdpbnQgc21pbiwgc21heDsKKyAgZ2ludCBwYSA9IENMQU1QICgoZ2ludCkgKGFscGhhLT5hbHBoYSAqIDI1NiksIDAsIDI1Nik7CisgIGdpbnQ4IGNiID0gYWxwaGEtPmNiLCBjciA9IGFscGhhLT5jcjsKKyAgZ2ludDgga2cgPSBhbHBoYS0+a2c7CisgIGd1aW50OCBhY2NlcHRfYW5nbGVfdGcgPSBhbHBoYS0+YWNjZXB0X2FuZ2xlX3RnOworICBndWludDggYWNjZXB0X2FuZ2xlX2N0ZyA9IGFscGhhLT5hY2NlcHRfYW5nbGVfY3RnOworICBndWludDggb25lX292ZXJfa2MgPSBhbHBoYS0+b25lX292ZXJfa2M7CisgIGd1aW50OCBrZmd5X3NjYWxlID0gYWxwaGEtPmtmZ3lfc2NhbGU7CisgIGd1aW50IG5vaXNlX2xldmVsMiA9IGFscGhhLT5ub2lzZV9sZXZlbDI7CisKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAwKTsKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKTsKKworICBzbWluID0gMTI4IC0gYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5OworICBzbWF4ID0gMTI4ICsgYWxwaGEtPndoaXRlX3NlbnNpdGl2aXR5OworCisgIGlmIChhbHBoYS0+aW5fc2R0diA9PSBhbHBoYS0+b3V0X3NkdHYpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgIGEgPSAoc3JjWzBdICogcGEpID4+IDg7CisgICAgICAgIHkgPSBzcmNbMV07CisgICAgICAgIHUgPSBzcmNbMl0gLSAxMjg7CisgICAgICAgIHYgPSBzcmNbM10gLSAxMjg7CisKKyAgICAgICAgYSA9IGNocm9tYV9rZXlpbmdfeXV2IChhLCAmeSwgJnUsICZ2LCBjciwgY2IsCisgICAgICAgICAgICBzbWluLCBzbWF4LCBhY2NlcHRfYW5nbGVfdGcsIGFjY2VwdF9hbmdsZV9jdGcsCisgICAgICAgICAgICBvbmVfb3Zlcl9rYywga2ZneV9zY2FsZSwga2csIG5vaXNlX2xldmVsMik7CisKKyAgICAgICAgdSArPSAxMjg7CisgICAgICAgIHYgKz0gMTI4OworCisgICAgICAgIGRlc3RbMF0gPSBhOworICAgICAgICBkZXN0WzFdID0geTsKKyAgICAgICAgZGVzdFsyXSA9IHU7CisgICAgICAgIGRlc3RbM10gPSB2OworCisgICAgICAgIHNyYyArPSA0OworICAgICAgICBkZXN0ICs9IDQ7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGdpbnQgbWF0cml4WzEyXTsKKworICAgIG1lbWNweSAobWF0cml4LAorICAgICAgICBhbHBoYS0+b3V0X3NkdHYgPyBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0IDoKKyAgICAgICAgY29nX3ljYmNyX3NkdHZfdG9feWNiY3JfaGR0dl9tYXRyaXhfOGJpdCwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgYSA9IChzcmNbMF0gKiBwYSkgPj4gODsKKyAgICAgICAgeSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCBzcmNbMV0sIHNyY1syXSwgc3JjWzNdKTsKKyAgICAgICAgdSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCBzcmNbMV0sIHNyY1syXSwgc3JjWzNdKSAtIDEyODsKKyAgICAgICAgdiA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCBzcmNbMV0sIHNyY1syXSwgc3JjWzNdKSAtIDEyODsKKworICAgICAgICBhID0gY2hyb21hX2tleWluZ195dXYgKGEsICZ5LCAmdSwgJnYsIGNyLCBjYiwKKyAgICAgICAgICAgIHNtaW4sIHNtYXgsIGFjY2VwdF9hbmdsZV90ZywgYWNjZXB0X2FuZ2xlX2N0ZywKKyAgICAgICAgICAgIG9uZV9vdmVyX2tjLCBrZmd5X3NjYWxlLCBrZywgbm9pc2VfbGV2ZWwyKTsKKworICAgICAgICB1ICs9IDEyODsKKyAgICAgICAgdiArPSAxMjg7CisKKyAgICAgICAgZGVzdFswXSA9IGE7CisgICAgICAgIGRlc3RbMV0gPSB5OworICAgICAgICBkZXN0WzJdID0gdTsKKyAgICAgICAgZGVzdFszXSA9IHY7CisKKyAgICAgICAgc3JjICs9IDQ7CisgICAgICAgIGRlc3QgKz0gNDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9zZXRfcmdiX2F5dXYgKGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lLCBHc3RBbHBoYSAqIGFscGhhKQoreworICBjb25zdCBndWludDggKnNyYzsKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgc19hbHBoYSA9IENMQU1QICgoZ2ludCkgKGFscGhhLT5hbHBoYSAqIDI1NSksIDAsIDI1NSk7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBtYXRyaXhbMTJdOworICBnaW50IHksIHUsIHY7CisgIGdpbnQgb1szXTsKKyAgZ2ludCBicHA7CisKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAwKTsKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKTsKKworICBicHAgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChpbl9mcmFtZSwgMCk7CisgIG9bMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMCk7CisgIG9bMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMSk7CisgIG9bMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMik7CisKKyAgbWVtY3B5IChtYXRyaXgsCisgICAgICBhbHBoYS0+b3V0X3NkdHYgPyBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9oZHR2LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICBkZXN0WzBdID0gc19hbHBoYTsKKworICAgICAgeSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCBzcmNbb1swXV0sIHNyY1tvWzFdXSwgc3JjW29bMl1dKTsKKyAgICAgIHUgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgc3JjW29bMF1dLCBzcmNbb1sxXV0sIHNyY1tvWzJdXSk7CisgICAgICB2ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHNyY1tvWzBdXSwgc3JjW29bMV1dLCBzcmNbb1syXV0pOworCisgICAgICBkZXN0WzFdID0geTsKKyAgICAgIGRlc3RbMl0gPSB1OworICAgICAgZGVzdFszXSA9IHY7CisKKyAgICAgIGRlc3QgKz0gNDsKKyAgICAgIHNyYyArPSBicHA7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWxwaGFfY2hyb21hX2tleV9yZ2JfYXl1diAoY29uc3QgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUsIEdzdEFscGhhICogYWxwaGEpCit7CisgIGNvbnN0IGd1aW50OCAqc3JjOworICBndWludDggKmRlc3Q7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBpLCBqOworICBnaW50IGEsIHksIHUsIHY7CisgIGdpbnQgciwgZywgYjsKKyAgZ2ludCBzbWluLCBzbWF4OworICBnaW50IHBhID0gQ0xBTVAgKChnaW50KSAoYWxwaGEtPmFscGhhICogMjU1KSwgMCwgMjU1KTsKKyAgZ2ludDggY2IgPSBhbHBoYS0+Y2IsIGNyID0gYWxwaGEtPmNyOworICBnaW50OCBrZyA9IGFscGhhLT5rZzsKKyAgZ3VpbnQ4IGFjY2VwdF9hbmdsZV90ZyA9IGFscGhhLT5hY2NlcHRfYW5nbGVfdGc7CisgIGd1aW50OCBhY2NlcHRfYW5nbGVfY3RnID0gYWxwaGEtPmFjY2VwdF9hbmdsZV9jdGc7CisgIGd1aW50OCBvbmVfb3Zlcl9rYyA9IGFscGhhLT5vbmVfb3Zlcl9rYzsKKyAgZ3VpbnQ4IGtmZ3lfc2NhbGUgPSBhbHBoYS0+a2ZneV9zY2FsZTsKKyAgZ3VpbnQgbm9pc2VfbGV2ZWwyID0gYWxwaGEtPm5vaXNlX2xldmVsMjsKKyAgZ2ludCBtYXRyaXhbMTJdOworICBnaW50IG9bM107CisgIGdpbnQgYnBwOworCisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSk7CisKKyAgYnBwID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUFNUUklERSAoaW5fZnJhbWUsIDApOworCisgIG9bMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMCk7CisgIG9bMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMSk7CisgIG9bMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMik7CisKKyAgc21pbiA9IDEyOCAtIGFscGhhLT5ibGFja19zZW5zaXRpdml0eTsKKyAgc21heCA9IDEyOCArIGFscGhhLT53aGl0ZV9zZW5zaXRpdml0eTsKKworICBtZW1jcHkgKG1hdHJpeCwKKyAgICAgIGFscGhhLT5vdXRfc2R0diA/IGNvZ19yZ2JfdG9feWNiY3JfbWF0cml4XzhiaXRfc2R0diA6CisgICAgICBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X2hkdHYsIDEyICogc2l6ZW9mIChnaW50KSk7CisKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgIGEgPSBwYTsKKyAgICAgIHIgPSBzcmNbb1swXV07CisgICAgICBnID0gc3JjW29bMV1dOworICAgICAgYiA9IHNyY1tvWzJdXTsKKworICAgICAgeSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCByLCBnLCBiKTsKKyAgICAgIHUgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgciwgZywgYikgLSAxMjg7CisgICAgICB2ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHIsIGcsIGIpIC0gMTI4OworCisgICAgICBhID0gY2hyb21hX2tleWluZ195dXYgKGEsICZ5LCAmdSwgJnYsIGNyLCBjYiwKKyAgICAgICAgICBzbWluLCBzbWF4LCBhY2NlcHRfYW5nbGVfdGcsIGFjY2VwdF9hbmdsZV9jdGcsCisgICAgICAgICAgb25lX292ZXJfa2MsIGtmZ3lfc2NhbGUsIGtnLCBub2lzZV9sZXZlbDIpOworCisgICAgICB1ICs9IDEyODsKKyAgICAgIHYgKz0gMTI4OworCisgICAgICBkZXN0WzBdID0gYTsKKyAgICAgIGRlc3RbMV0gPSB5OworICAgICAgZGVzdFsyXSA9IHU7CisgICAgICBkZXN0WzNdID0gdjsKKworICAgICAgc3JjICs9IGJwcDsKKyAgICAgIGRlc3QgKz0gNDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9zZXRfcmdiX2FyZ2IgKGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lLCBHc3RBbHBoYSAqIGFscGhhKQoreworICBjb25zdCBndWludDggKnNyYzsKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgc19hbHBoYSA9IENMQU1QICgoZ2ludCkgKGFscGhhLT5hbHBoYSAqIDI1NSksIDAsIDI1NSk7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBwWzRdLCBvWzNdOworICBnaW50IGJwcDsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIGJwcCA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BTVFJJREUgKGluX2ZyYW1lLCAwKTsKKworICBvWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAoaW5fZnJhbWUsIDApOworICBvWzFdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAoaW5fZnJhbWUsIDEpOworICBvWzJdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAoaW5fZnJhbWUsIDIpOworCisgIHBbMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDMpOworICBwWzFdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAwKTsKKyAgcFsyXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMSk7CisgIHBbM10gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDIpOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICBkZXN0W3BbMF1dID0gc19hbHBoYTsKKworICAgICAgZGVzdFtwWzFdXSA9IHNyY1tvWzBdXTsKKyAgICAgIGRlc3RbcFsyXV0gPSBzcmNbb1sxXV07CisgICAgICBkZXN0W3BbM11dID0gc3JjW29bMl1dOworCisgICAgICBkZXN0ICs9IDQ7CisgICAgICBzcmMgKz0gYnBwOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2FscGhhX2Nocm9tYV9rZXlfcmdiX2FyZ2IgKGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lLCBHc3RBbHBoYSAqIGFscGhhKQoreworICBjb25zdCBndWludDggKnNyYzsKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBhLCB5LCB1LCB2OworICBnaW50IHIsIGcsIGI7CisgIGdpbnQgc21pbiwgc21heDsKKyAgZ2ludCBwYSA9IENMQU1QICgoZ2ludCkgKGFscGhhLT5hbHBoYSAqIDI1NSksIDAsIDI1NSk7CisgIGdpbnQ4IGNiID0gYWxwaGEtPmNiLCBjciA9IGFscGhhLT5jcjsKKyAgZ2ludDgga2cgPSBhbHBoYS0+a2c7CisgIGd1aW50OCBhY2NlcHRfYW5nbGVfdGcgPSBhbHBoYS0+YWNjZXB0X2FuZ2xlX3RnOworICBndWludDggYWNjZXB0X2FuZ2xlX2N0ZyA9IGFscGhhLT5hY2NlcHRfYW5nbGVfY3RnOworICBndWludDggb25lX292ZXJfa2MgPSBhbHBoYS0+b25lX292ZXJfa2M7CisgIGd1aW50OCBrZmd5X3NjYWxlID0gYWxwaGEtPmtmZ3lfc2NhbGU7CisgIGd1aW50IG5vaXNlX2xldmVsMiA9IGFscGhhLT5ub2lzZV9sZXZlbDI7CisgIGdpbnQgbWF0cml4WzEyXSwgbWF0cml4MlsxMl07CisgIGdpbnQgcFs0XSwgb1szXTsKKyAgZ2ludCBicHA7CisKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAwKTsKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKTsKKworICBicHAgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChpbl9mcmFtZSwgMCk7CisKKyAgb1swXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAwKTsKKyAgb1sxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAxKTsKKyAgb1syXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAyKTsKKworICBwWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAzKTsKKyAgcFsxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMCk7CisgIHBbMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDEpOworICBwWzNdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAyKTsKKworICBzbWluID0gMTI4IC0gYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5OworICBzbWF4ID0gMTI4ICsgYWxwaGEtPndoaXRlX3NlbnNpdGl2aXR5OworCisgIG1lbWNweSAobWF0cml4LCBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYsIDEyICogc2l6ZW9mIChnaW50KSk7CisgIG1lbWNweSAobWF0cml4MiwgY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICBhID0gcGE7CisgICAgICByID0gc3JjW29bMF1dOworICAgICAgZyA9IHNyY1tvWzFdXTsKKyAgICAgIGIgPSBzcmNbb1syXV07CisKKyAgICAgIHkgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgciwgZywgYik7CisgICAgICB1ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHIsIGcsIGIpIC0gMTI4OworICAgICAgdiA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCByLCBnLCBiKSAtIDEyODsKKworICAgICAgYSA9IGNocm9tYV9rZXlpbmdfeXV2IChhLCAmeSwgJnUsICZ2LCBjciwgY2IsCisgICAgICAgICAgc21pbiwgc21heCwgYWNjZXB0X2FuZ2xlX3RnLCBhY2NlcHRfYW5nbGVfY3RnLAorICAgICAgICAgIG9uZV9vdmVyX2tjLCBrZmd5X3NjYWxlLCBrZywgbm9pc2VfbGV2ZWwyKTsKKworICAgICAgdSArPSAxMjg7CisgICAgICB2ICs9IDEyODsKKworICAgICAgciA9IEFQUExZX01BVFJJWCAobWF0cml4MiwgMCwgeSwgdSwgdik7CisgICAgICBnID0gQVBQTFlfTUFUUklYIChtYXRyaXgyLCAxLCB5LCB1LCB2KTsKKyAgICAgIGIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeDIsIDIsIHksIHUsIHYpOworCisgICAgICBkZXN0W3BbMF1dID0gYTsKKyAgICAgIGRlc3RbcFsxXV0gPSBDTEFNUCAociwgMCwgMjU1KTsKKyAgICAgIGRlc3RbcFsyXV0gPSBDTEFNUCAoZywgMCwgMjU1KTsKKyAgICAgIGRlc3RbcFszXV0gPSBDTEFNUCAoYiwgMCwgMjU1KTsKKworICAgICAgc3JjICs9IGJwcDsKKyAgICAgIGRlc3QgKz0gNDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9zZXRfcGxhbmFyX3l1dl9heXV2IChjb25zdCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSwgR3N0QWxwaGEgKiBhbHBoYSkKK3sKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgYl9hbHBoYSA9IENMQU1QICgoZ2ludCkgKGFscGhhLT5hbHBoYSAqIDI1NSksIDAsIDI1NSk7CisgIGNvbnN0IGd1aW50OCAqc3JjWSwgKnNyY1lfdG1wOworICBjb25zdCBndWludDggKnNyY1UsICpzcmNVX3RtcDsKKyAgY29uc3QgZ3VpbnQ4ICpzcmNWLCAqc3JjVl90bXA7CisgIGdpbnQgaSwgajsKKyAgZ2ludCB5X3N0cmlkZSwgdXZfc3RyaWRlOworICBnaW50IHZfc3VicywgaF9zdWJzOworCisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSk7CisKKyAgeV9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGluX2ZyYW1lLCAwKTsKKyAgdXZfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChpbl9mcmFtZSwgMSk7CisKKyAgc3JjWV90bXAgPSBzcmNZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoaW5fZnJhbWUsIDApOworICBzcmNVX3RtcCA9IHNyY1UgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChpbl9mcmFtZSwgMSk7CisgIHNyY1ZfdG1wID0gc3JjViA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGluX2ZyYW1lLCAyKTsKKworICBzd2l0Y2ggKEdTVF9WSURFT19GUkFNRV9GT1JNQVQgKGluX2ZyYW1lKSkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVjEyOgorICAgICAgdl9zdWJzID0gaF9zdWJzID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDQ0OgorICAgICAgdl9zdWJzID0gaF9zdWJzID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgICAgdl9zdWJzID0gMTsKKyAgICAgIGhfc3VicyA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQxQjoKKyAgICAgIHZfc3VicyA9IDE7CisgICAgICBoX3N1YnMgPSA0OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGFscGhhLT5pbl9zZHR2ID09IGFscGhhLT5vdXRfc2R0dikgeworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgZGVzdFswXSA9IGJfYWxwaGE7CisgICAgICAgIGRlc3RbMV0gPSBzcmNZWzBdOworICAgICAgICBkZXN0WzJdID0gc3JjVVswXTsKKyAgICAgICAgZGVzdFszXSA9IHNyY1ZbMF07CisKKyAgICAgICAgZGVzdCArPSA0OworICAgICAgICBzcmNZKys7CisgICAgICAgIGlmICgoaiArIDEpICUgaF9zdWJzID09IDApIHsKKyAgICAgICAgICBzcmNVKys7CisgICAgICAgICAgc3JjVisrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHNyY1lfdG1wID0gc3JjWSA9IHNyY1lfdG1wICsgeV9zdHJpZGU7CisgICAgICBpZiAoKGkgKyAxKSAlIHZfc3VicyA9PSAwKSB7CisgICAgICAgIHNyY1VfdG1wID0gc3JjVSA9IHNyY1VfdG1wICsgdXZfc3RyaWRlOworICAgICAgICBzcmNWX3RtcCA9IHNyY1YgPSBzcmNWX3RtcCArIHV2X3N0cmlkZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyY1UgPSBzcmNVX3RtcDsKKyAgICAgICAgc3JjViA9IHNyY1ZfdG1wOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBnaW50IG1hdHJpeFsxMl07CisgICAgZ2ludCBhLCB5LCB1LCB2OworCisgICAgbWVtY3B5IChtYXRyaXgsCisgICAgICAgIGFscGhhLT5vdXRfc2R0diA/IGNvZ195Y2Jjcl9oZHR2X3RvX3ljYmNyX3NkdHZfbWF0cml4XzhiaXQgOgorICAgICAgICBjb2dfeWNiY3Jfc2R0dl90b195Y2Jjcl9oZHR2X21hdHJpeF84Yml0LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICBhID0gYl9hbHBoYTsKKyAgICAgICAgeSA9IHNyY1lbMF07CisgICAgICAgIHUgPSBzcmNVWzBdOworICAgICAgICB2ID0gc3JjVlswXTsKKworICAgICAgICBkZXN0WzBdID0gYTsKKyAgICAgICAgZGVzdFsxXSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5LCB1LCB2KTsKKyAgICAgICAgZGVzdFsyXSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5LCB1LCB2KTsKKyAgICAgICAgZGVzdFszXSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5LCB1LCB2KTsKKworICAgICAgICBkZXN0ICs9IDQ7CisgICAgICAgIHNyY1krKzsKKyAgICAgICAgaWYgKChqICsgMSkgJSBoX3N1YnMgPT0gMCkgeworICAgICAgICAgIHNyY1UrKzsKKyAgICAgICAgICBzcmNWKys7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3JjWV90bXAgPSBzcmNZID0gc3JjWV90bXAgKyB5X3N0cmlkZTsKKyAgICAgIGlmICgoaSArIDEpICUgdl9zdWJzID09IDApIHsKKyAgICAgICAgc3JjVV90bXAgPSBzcmNVID0gc3JjVV90bXAgKyB1dl9zdHJpZGU7CisgICAgICAgIHNyY1ZfdG1wID0gc3JjViA9IHNyY1ZfdG1wICsgdXZfc3RyaWRlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3JjVSA9IHNyY1VfdG1wOworICAgICAgICBzcmNWID0gc3JjVl90bXA7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWxwaGFfY2hyb21hX2tleV9wbGFuYXJfeXV2X2F5dXYgKGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lLCBHc3RBbHBoYSAqIGFscGhhKQoreworICBndWludDggKmRlc3Q7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBiX2FscGhhID0gQ0xBTVAgKChnaW50KSAoYWxwaGEtPmFscGhhICogMjU1KSwgMCwgMjU1KTsKKyAgY29uc3QgZ3VpbnQ4ICpzcmNZLCAqc3JjWV90bXA7CisgIGNvbnN0IGd1aW50OCAqc3JjVSwgKnNyY1VfdG1wOworICBjb25zdCBndWludDggKnNyY1YsICpzcmNWX3RtcDsKKyAgZ2ludCBpLCBqOworICBnaW50IGEsIHksIHUsIHY7CisgIGdpbnQgeV9zdHJpZGUsIHV2X3N0cmlkZTsKKyAgZ2ludCB2X3N1YnMsIGhfc3ViczsKKyAgZ2ludCBzbWluID0gMTI4IC0gYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5OworICBnaW50IHNtYXggPSAxMjggKyBhbHBoYS0+d2hpdGVfc2Vuc2l0aXZpdHk7CisgIGdpbnQ4IGNiID0gYWxwaGEtPmNiLCBjciA9IGFscGhhLT5jcjsKKyAgZ2ludDgga2cgPSBhbHBoYS0+a2c7CisgIGd1aW50OCBhY2NlcHRfYW5nbGVfdGcgPSBhbHBoYS0+YWNjZXB0X2FuZ2xlX3RnOworICBndWludDggYWNjZXB0X2FuZ2xlX2N0ZyA9IGFscGhhLT5hY2NlcHRfYW5nbGVfY3RnOworICBndWludDggb25lX292ZXJfa2MgPSBhbHBoYS0+b25lX292ZXJfa2M7CisgIGd1aW50OCBrZmd5X3NjYWxlID0gYWxwaGEtPmtmZ3lfc2NhbGU7CisgIGd1aW50IG5vaXNlX2xldmVsMiA9IGFscGhhLT5ub2lzZV9sZXZlbDI7CisKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKTsKKworICB5X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoaW5fZnJhbWUsIDApOworICB1dl9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGluX2ZyYW1lLCAxKTsKKworICBzcmNZX3RtcCA9IHNyY1kgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChpbl9mcmFtZSwgMCk7CisgIHNyY1VfdG1wID0gc3JjVSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGluX2ZyYW1lLCAxKTsKKyAgc3JjVl90bXAgPSBzcmNWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoaW5fZnJhbWUsIDIpOworCisgIHN3aXRjaCAoR1NUX1ZJREVPX0ZSQU1FX0ZPUk1BVCAoaW5fZnJhbWUpKSB7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgICB2X3N1YnMgPSBoX3N1YnMgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0NDQ6CisgICAgICB2X3N1YnMgPSBoX3N1YnMgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MkI6CisgICAgICB2X3N1YnMgPSAxOworICAgICAgaF9zdWJzID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDFCOgorICAgICAgdl9zdWJzID0gMTsKKyAgICAgIGhfc3VicyA9IDQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICByZXR1cm47CisgIH0KKworICBpZiAoYWxwaGEtPmluX3NkdHYgPT0gYWxwaGEtPm91dF9zZHR2KSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICBhID0gYl9hbHBoYTsKKyAgICAgICAgeSA9IHNyY1lbMF07CisgICAgICAgIHUgPSBzcmNVWzBdIC0gMTI4OworICAgICAgICB2ID0gc3JjVlswXSAtIDEyODsKKworICAgICAgICBhID0gY2hyb21hX2tleWluZ195dXYgKGEsICZ5LCAmdSwgJnYsIGNyLCBjYiwgc21pbiwKKyAgICAgICAgICAgIHNtYXgsIGFjY2VwdF9hbmdsZV90ZywgYWNjZXB0X2FuZ2xlX2N0ZywKKyAgICAgICAgICAgIG9uZV9vdmVyX2tjLCBrZmd5X3NjYWxlLCBrZywgbm9pc2VfbGV2ZWwyKTsKKworICAgICAgICB1ICs9IDEyODsKKyAgICAgICAgdiArPSAxMjg7CisKKyAgICAgICAgZGVzdFswXSA9IGE7CisgICAgICAgIGRlc3RbMV0gPSB5OworICAgICAgICBkZXN0WzJdID0gdTsKKyAgICAgICAgZGVzdFszXSA9IHY7CisKKyAgICAgICAgZGVzdCArPSA0OworICAgICAgICBzcmNZKys7CisgICAgICAgIGlmICgoaiArIDEpICUgaF9zdWJzID09IDApIHsKKyAgICAgICAgICBzcmNVKys7CisgICAgICAgICAgc3JjVisrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHNyY1lfdG1wID0gc3JjWSA9IHNyY1lfdG1wICsgeV9zdHJpZGU7CisgICAgICBpZiAoKGkgKyAxKSAlIHZfc3VicyA9PSAwKSB7CisgICAgICAgIHNyY1VfdG1wID0gc3JjVSA9IHNyY1VfdG1wICsgdXZfc3RyaWRlOworICAgICAgICBzcmNWX3RtcCA9IHNyY1YgPSBzcmNWX3RtcCArIHV2X3N0cmlkZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyY1UgPSBzcmNVX3RtcDsKKyAgICAgICAgc3JjViA9IHNyY1ZfdG1wOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBnaW50IG1hdHJpeFsxMl07CisKKyAgICBtZW1jcHkgKG1hdHJpeCwKKyAgICAgICAgYWxwaGEtPm91dF9zZHR2ID8gY29nX3ljYmNyX2hkdHZfdG9feWNiY3Jfc2R0dl9tYXRyaXhfOGJpdCA6CisgICAgICAgIGNvZ195Y2Jjcl9zZHR2X3RvX3ljYmNyX2hkdHZfbWF0cml4XzhiaXQsIDEyICogc2l6ZW9mIChnaW50KSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAgIGEgPSBiX2FscGhhOworICAgICAgICB5ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHNyY1lbMF0sIHNyY1VbMF0sIHNyY1ZbMF0pOworICAgICAgICB1ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHNyY1lbMF0sIHNyY1VbMF0sIHNyY1ZbMF0pIC0gMTI4OworICAgICAgICB2ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHNyY1lbMF0sIHNyY1VbMF0sIHNyY1ZbMF0pIC0gMTI4OworCisgICAgICAgIGEgPSBjaHJvbWFfa2V5aW5nX3l1diAoYSwgJnksICZ1LCAmdiwgY3IsIGNiLCBzbWluLAorICAgICAgICAgICAgc21heCwgYWNjZXB0X2FuZ2xlX3RnLCBhY2NlcHRfYW5nbGVfY3RnLAorICAgICAgICAgICAgb25lX292ZXJfa2MsIGtmZ3lfc2NhbGUsIGtnLCBub2lzZV9sZXZlbDIpOworCisgICAgICAgIGRlc3RbMF0gPSBhOworICAgICAgICBkZXN0WzFdID0geTsKKyAgICAgICAgZGVzdFsyXSA9IHUgKyAxMjg7CisgICAgICAgIGRlc3RbM10gPSB2ICsgMTI4OworCisgICAgICAgIGRlc3QgKz0gNDsKKyAgICAgICAgc3JjWSsrOworICAgICAgICBpZiAoKGogKyAxKSAlIGhfc3VicyA9PSAwKSB7CisgICAgICAgICAgc3JjVSsrOworICAgICAgICAgIHNyY1YrKzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBzcmNZX3RtcCA9IHNyY1kgPSBzcmNZX3RtcCArIHlfc3RyaWRlOworICAgICAgaWYgKChpICsgMSkgJSB2X3N1YnMgPT0gMCkgeworICAgICAgICBzcmNVX3RtcCA9IHNyY1UgPSBzcmNVX3RtcCArIHV2X3N0cmlkZTsKKyAgICAgICAgc3JjVl90bXAgPSBzcmNWID0gc3JjVl90bXAgKyB1dl9zdHJpZGU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcmNVID0gc3JjVV90bXA7CisgICAgICAgIHNyY1YgPSBzcmNWX3RtcDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9zZXRfcGxhbmFyX3l1dl9hcmdiIChjb25zdCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSwgR3N0QWxwaGEgKiBhbHBoYSkKK3sKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgYl9hbHBoYSA9IENMQU1QICgoZ2ludCkgKGFscGhhLT5hbHBoYSAqIDI1NSksIDAsIDI1NSk7CisgIGNvbnN0IGd1aW50OCAqc3JjWSwgKnNyY1lfdG1wOworICBjb25zdCBndWludDggKnNyY1UsICpzcmNVX3RtcDsKKyAgY29uc3QgZ3VpbnQ4ICpzcmNWLCAqc3JjVl90bXA7CisgIGdpbnQgaSwgajsKKyAgZ2ludCB5X3N0cmlkZSwgdXZfc3RyaWRlOworICBnaW50IHZfc3VicywgaF9zdWJzOworICBnaW50IG1hdHJpeFsxMl07CisgIGdpbnQgYSwgeSwgdSwgdjsKKyAgZ2ludCByLCBnLCBiOworICBnaW50IHBbNF07CisKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKTsKKworICBwWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAzKTsKKyAgcFsxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMCk7CisgIHBbMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDEpOworICBwWzNdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAyKTsKKworICB5X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoaW5fZnJhbWUsIDApOworICB1dl9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGluX2ZyYW1lLCAxKTsKKworICBzcmNZX3RtcCA9IHNyY1kgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChpbl9mcmFtZSwgMCk7CisgIHNyY1VfdG1wID0gc3JjVSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGluX2ZyYW1lLCAxKTsKKyAgc3JjVl90bXAgPSBzcmNWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoaW5fZnJhbWUsIDIpOworCisgIHN3aXRjaCAoR1NUX1ZJREVPX0ZSQU1FX0ZPUk1BVCAoaW5fZnJhbWUpKSB7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgICB2X3N1YnMgPSBoX3N1YnMgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0NDQ6CisgICAgICB2X3N1YnMgPSBoX3N1YnMgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MkI6CisgICAgICB2X3N1YnMgPSAxOworICAgICAgaF9zdWJzID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDFCOgorICAgICAgdl9zdWJzID0gMTsKKyAgICAgIGhfc3VicyA9IDQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICByZXR1cm47CisgIH0KKworICBtZW1jcHkgKG1hdHJpeCwKKyAgICAgIGFscGhhLT5pbl9zZHR2ID8gY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2IDoKKyAgICAgIGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfaGR0diwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgYSA9IGJfYWxwaGE7CisgICAgICB5ID0gc3JjWVswXTsKKyAgICAgIHUgPSBzcmNVWzBdOworICAgICAgdiA9IHNyY1ZbMF07CisKKyAgICAgIGRlc3RbcFswXV0gPSBhOworICAgICAgciA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5LCB1LCB2KTsKKyAgICAgIGcgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeSwgdSwgdik7CisgICAgICBiID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHksIHUsIHYpOworICAgICAgZGVzdFtwWzFdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzJdXSA9IENMQU1QIChnLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzNdXSA9IENMQU1QIChiLCAwLCAyNTUpOworCisgICAgICBkZXN0ICs9IDQ7CisgICAgICBzcmNZKys7CisgICAgICBpZiAoKGogKyAxKSAlIGhfc3VicyA9PSAwKSB7CisgICAgICAgIHNyY1UrKzsKKyAgICAgICAgc3JjVisrOworICAgICAgfQorICAgIH0KKworICAgIHNyY1lfdG1wID0gc3JjWSA9IHNyY1lfdG1wICsgeV9zdHJpZGU7CisgICAgaWYgKChpICsgMSkgJSB2X3N1YnMgPT0gMCkgeworICAgICAgc3JjVV90bXAgPSBzcmNVID0gc3JjVV90bXAgKyB1dl9zdHJpZGU7CisgICAgICBzcmNWX3RtcCA9IHNyY1YgPSBzcmNWX3RtcCArIHV2X3N0cmlkZTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjVSA9IHNyY1VfdG1wOworICAgICAgc3JjViA9IHNyY1ZfdG1wOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2FscGhhX2Nocm9tYV9rZXlfcGxhbmFyX3l1dl9hcmdiIChjb25zdCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSwgR3N0QWxwaGEgKiBhbHBoYSkKK3sKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgYl9hbHBoYSA9IENMQU1QICgoZ2ludCkgKGFscGhhLT5hbHBoYSAqIDI1NSksIDAsIDI1NSk7CisgIGNvbnN0IGd1aW50OCAqc3JjWSwgKnNyY1lfdG1wOworICBjb25zdCBndWludDggKnNyY1UsICpzcmNVX3RtcDsKKyAgY29uc3QgZ3VpbnQ4ICpzcmNWLCAqc3JjVl90bXA7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBhLCB5LCB1LCB2OworICBnaW50IHIsIGcsIGI7CisgIGdpbnQgeV9zdHJpZGUsIHV2X3N0cmlkZTsKKyAgZ2ludCB2X3N1YnMsIGhfc3ViczsKKyAgZ2ludCBzbWluID0gMTI4IC0gYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5OworICBnaW50IHNtYXggPSAxMjggKyBhbHBoYS0+d2hpdGVfc2Vuc2l0aXZpdHk7CisgIGdpbnQ4IGNiID0gYWxwaGEtPmNiLCBjciA9IGFscGhhLT5jcjsKKyAgZ2ludDgga2cgPSBhbHBoYS0+a2c7CisgIGd1aW50OCBhY2NlcHRfYW5nbGVfdGcgPSBhbHBoYS0+YWNjZXB0X2FuZ2xlX3RnOworICBndWludDggYWNjZXB0X2FuZ2xlX2N0ZyA9IGFscGhhLT5hY2NlcHRfYW5nbGVfY3RnOworICBndWludDggb25lX292ZXJfa2MgPSBhbHBoYS0+b25lX292ZXJfa2M7CisgIGd1aW50OCBrZmd5X3NjYWxlID0gYWxwaGEtPmtmZ3lfc2NhbGU7CisgIGd1aW50IG5vaXNlX2xldmVsMiA9IGFscGhhLT5ub2lzZV9sZXZlbDI7CisgIGdpbnQgbWF0cml4WzEyXTsKKyAgZ2ludCBwWzRdOworCisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSk7CisKKyAgcFswXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMyk7CisgIHBbMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDApOworICBwWzJdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAxKTsKKyAgcFszXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMik7CisKKyAgeV9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGluX2ZyYW1lLCAwKTsKKyAgdXZfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChpbl9mcmFtZSwgMSk7CisKKyAgc3JjWV90bXAgPSBzcmNZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoaW5fZnJhbWUsIDApOworICBzcmNVX3RtcCA9IHNyY1UgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChpbl9mcmFtZSwgMSk7CisgIHNyY1ZfdG1wID0gc3JjViA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGluX2ZyYW1lLCAyKTsKKworICBzd2l0Y2ggKEdTVF9WSURFT19GUkFNRV9GT1JNQVQgKGluX2ZyYW1lKSkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVjEyOgorICAgICAgdl9zdWJzID0gaF9zdWJzID0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDQ0OgorICAgICAgdl9zdWJzID0gaF9zdWJzID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgICAgdl9zdWJzID0gMTsKKyAgICAgIGhfc3VicyA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQxQjoKKyAgICAgIHZfc3VicyA9IDE7CisgICAgICBoX3N1YnMgPSA0OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgcmV0dXJuOworICB9CisKKyAgbWVtY3B5IChtYXRyaXgsCisgICAgICBhbHBoYS0+aW5fc2R0diA/IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfc2R0diA6CisgICAgICBjb2dfeWNiY3JfdG9fcmdiX21hdHJpeF84Yml0X2hkdHYsIDEyICogc2l6ZW9mIChnaW50KSk7CisKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgIGEgPSBiX2FscGhhOworICAgICAgeSA9IHNyY1lbMF07CisgICAgICB1ID0gc3JjVVswXSAtIDEyODsKKyAgICAgIHYgPSBzcmNWWzBdIC0gMTI4OworCisgICAgICBhID0gY2hyb21hX2tleWluZ195dXYgKGEsICZ5LCAmdSwgJnYsIGNyLCBjYiwgc21pbiwKKyAgICAgICAgICBzbWF4LCBhY2NlcHRfYW5nbGVfdGcsIGFjY2VwdF9hbmdsZV9jdGcsCisgICAgICAgICAgb25lX292ZXJfa2MsIGtmZ3lfc2NhbGUsIGtnLCBub2lzZV9sZXZlbDIpOworCisgICAgICB1ICs9IDEyODsKKyAgICAgIHYgKz0gMTI4OworCisgICAgICBkZXN0W3BbMF1dID0gYTsKKyAgICAgIHIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeSwgdSwgdik7CisgICAgICBnID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHksIHUsIHYpOworICAgICAgYiA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5LCB1LCB2KTsKKyAgICAgIGRlc3RbcFsxXV0gPSBDTEFNUCAociwgMCwgMjU1KTsKKyAgICAgIGRlc3RbcFsyXV0gPSBDTEFNUCAoZywgMCwgMjU1KTsKKyAgICAgIGRlc3RbcFszXV0gPSBDTEFNUCAoYiwgMCwgMjU1KTsKKworICAgICAgZGVzdCArPSA0OworICAgICAgc3JjWSsrOworICAgICAgaWYgKChqICsgMSkgJSBoX3N1YnMgPT0gMCkgeworICAgICAgICBzcmNVKys7CisgICAgICAgIHNyY1YrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzcmNZX3RtcCA9IHNyY1kgPSBzcmNZX3RtcCArIHlfc3RyaWRlOworICAgIGlmICgoaSArIDEpICUgdl9zdWJzID09IDApIHsKKyAgICAgIHNyY1VfdG1wID0gc3JjVSA9IHNyY1VfdG1wICsgdXZfc3RyaWRlOworICAgICAgc3JjVl90bXAgPSBzcmNWID0gc3JjVl90bXAgKyB1dl9zdHJpZGU7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY1UgPSBzcmNVX3RtcDsKKyAgICAgIHNyY1YgPSBzcmNWX3RtcDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9zZXRfcGFja2VkXzQyMl9heXV2IChjb25zdCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSwgR3N0QWxwaGEgKiBhbHBoYSkKK3sKKyAgY29uc3QgZ3VpbnQ4ICpzcmM7CisgIGd1aW50OCAqZGVzdDsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IHNfYWxwaGEgPSBDTEFNUCAoKGdpbnQpIChhbHBoYS0+YWxwaGEgKiAyNTUpLCAwLCAyNTUpOworICBnaW50IGksIGo7CisgIGdpbnQgeSwgdSwgdjsKKyAgZ2ludCBwWzRdOyAgICAgICAgICAgICAgICAgICAgLyogWSBVIFkgViAqLworICBnaW50IHNyY19zdHJpZGU7CisgIGNvbnN0IGd1aW50OCAqc3JjX3RtcDsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIHNyY19zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGluX2ZyYW1lLCAwKTsKKworICBwWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAoaW5fZnJhbWUsIDApOworICBwWzJdID0gcFswXSArIDI7CisgIHBbMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMSk7CisgIHBbM10gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMik7CisKKyAgaWYgKGFscGhhLT5pbl9zZHR2ICE9IGFscGhhLT5vdXRfc2R0dikgeworICAgIGdpbnQgbWF0cml4WzEyXTsKKworICAgIG1lbWNweSAobWF0cml4LAorICAgICAgICBhbHBoYS0+aW5fc2R0diA/IGNvZ195Y2Jjcl9zZHR2X3RvX3ljYmNyX2hkdHZfbWF0cml4XzhiaXQgOgorICAgICAgICBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICBzcmNfdG1wID0gc3JjOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGggLSAxOyBqICs9IDIpIHsKKyAgICAgICAgZGVzdFswXSA9IHNfYWxwaGE7CisgICAgICAgIGRlc3RbNF0gPSBzX2FscGhhOworCisgICAgICAgIHkgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgc3JjW3BbMF1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSk7CisgICAgICAgIHUgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgc3JjW3BbMF1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSk7CisgICAgICAgIHYgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgc3JjW3BbMF1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSk7CisKKyAgICAgICAgZGVzdFsxXSA9IHk7CisgICAgICAgIGRlc3RbMl0gPSB1OworICAgICAgICBkZXN0WzNdID0gdjsKKworICAgICAgICB5ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHNyY1twWzJdXSwgc3JjW3BbMV1dLCBzcmNbcFszXV0pOworICAgICAgICB1ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHNyY1twWzJdXSwgc3JjW3BbMV1dLCBzcmNbcFszXV0pOworICAgICAgICB2ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHNyY1twWzJdXSwgc3JjW3BbMV1dLCBzcmNbcFszXV0pOworCisgICAgICAgIGRlc3RbNV0gPSB5OworICAgICAgICBkZXN0WzZdID0gdTsKKyAgICAgICAgZGVzdFs3XSA9IHY7CisKKyAgICAgICAgZGVzdCArPSA4OworICAgICAgICBzcmMgKz0gNDsKKyAgICAgIH0KKworICAgICAgaWYgKGogPT0gd2lkdGggLSAxKSB7CisgICAgICAgIGRlc3RbMF0gPSBzX2FscGhhOworCisgICAgICAgIHkgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgc3JjW3BbMF1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSk7CisgICAgICAgIHUgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgc3JjW3BbMF1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSk7CisgICAgICAgIHYgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgc3JjW3BbMF1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSk7CisKKyAgICAgICAgZGVzdFsxXSA9IHk7CisgICAgICAgIGRlc3RbMl0gPSB1OworICAgICAgICBkZXN0WzNdID0gdjsKKworICAgICAgICBkZXN0ICs9IDQ7CisgICAgICB9CisKKyAgICAgIHNyYyA9IHNyY190bXAgKyBzcmNfc3RyaWRlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIHNyY190bXAgPSBzcmM7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aCAtIDE7IGogKz0gMikgeworICAgICAgICBkZXN0WzBdID0gc19hbHBoYTsKKyAgICAgICAgZGVzdFs0XSA9IHNfYWxwaGE7CisKKyAgICAgICAgeSA9IHNyY1twWzBdXTsKKyAgICAgICAgdSA9IHNyY1twWzFdXTsKKyAgICAgICAgdiA9IHNyY1twWzNdXTsKKworICAgICAgICBkZXN0WzFdID0geTsKKyAgICAgICAgZGVzdFsyXSA9IHU7CisgICAgICAgIGRlc3RbM10gPSB2OworCisgICAgICAgIHkgPSBzcmNbcFsyXV07CisKKyAgICAgICAgZGVzdFs1XSA9IHk7CisgICAgICAgIGRlc3RbNl0gPSB1OworICAgICAgICBkZXN0WzddID0gdjsKKworICAgICAgICBkZXN0ICs9IDg7CisgICAgICAgIHNyYyArPSA0OworICAgICAgfQorCisgICAgICBpZiAoaiA9PSB3aWR0aCAtIDEpIHsKKyAgICAgICAgZGVzdFswXSA9IHNfYWxwaGE7CisKKyAgICAgICAgeSA9IHNyY1twWzBdXTsKKyAgICAgICAgdSA9IHNyY1twWzFdXTsKKyAgICAgICAgdiA9IHNyY1twWzNdXTsKKworICAgICAgICBkZXN0WzFdID0geTsKKyAgICAgICAgZGVzdFsyXSA9IHU7CisgICAgICAgIGRlc3RbM10gPSB2OworCisgICAgICAgIGRlc3QgKz0gNDsKKyAgICAgIH0KKworICAgICAgc3JjID0gc3JjX3RtcCArIHNyY19zdHJpZGU7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWxwaGFfY2hyb21hX2tleV9wYWNrZWRfNDIyX2F5dXYgKGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lLCBHc3RBbHBoYSAqIGFscGhhKQoreworICBjb25zdCBndWludDggKnNyYzsKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBhLCB5LCB1LCB2OworICBnaW50IHNtaW4sIHNtYXg7CisgIGdpbnQgcGEgPSBDTEFNUCAoKGdpbnQpIChhbHBoYS0+YWxwaGEgKiAyNTUpLCAwLCAyNTUpOworICBnaW50OCBjYiA9IGFscGhhLT5jYiwgY3IgPSBhbHBoYS0+Y3I7CisgIGdpbnQ4IGtnID0gYWxwaGEtPmtnOworICBndWludDggYWNjZXB0X2FuZ2xlX3RnID0gYWxwaGEtPmFjY2VwdF9hbmdsZV90ZzsKKyAgZ3VpbnQ4IGFjY2VwdF9hbmdsZV9jdGcgPSBhbHBoYS0+YWNjZXB0X2FuZ2xlX2N0ZzsKKyAgZ3VpbnQ4IG9uZV9vdmVyX2tjID0gYWxwaGEtPm9uZV9vdmVyX2tjOworICBndWludDgga2ZneV9zY2FsZSA9IGFscGhhLT5rZmd5X3NjYWxlOworICBndWludCBub2lzZV9sZXZlbDIgPSBhbHBoYS0+bm9pc2VfbGV2ZWwyOworICBnaW50IHBbNF07ICAgICAgICAgICAgICAgICAgICAvKiBZIFUgWSBWICovCisgIGdpbnQgc3JjX3N0cmlkZTsKKyAgY29uc3QgZ3VpbnQ4ICpzcmNfdG1wOworCisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSk7CisKKyAgc3JjX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoaW5fZnJhbWUsIDApOworCisgIHBbMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMCk7CisgIHBbMl0gPSBwWzBdICsgMjsKKyAgcFsxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAxKTsKKyAgcFszXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAyKTsKKworICBzbWluID0gMTI4IC0gYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5OworICBzbWF4ID0gMTI4ICsgYWxwaGEtPndoaXRlX3NlbnNpdGl2aXR5OworCisgIGlmIChhbHBoYS0+aW5fc2R0diAhPSBhbHBoYS0+b3V0X3NkdHYpIHsKKyAgICBnaW50IG1hdHJpeFsxMl07CisKKyAgICBtZW1jcHkgKG1hdHJpeCwKKyAgICAgICAgYWxwaGEtPmluX3NkdHYgPyBjb2dfeWNiY3Jfc2R0dl90b195Y2Jjcl9oZHR2X21hdHJpeF84Yml0IDoKKyAgICAgICAgY29nX3ljYmNyX2hkdHZfdG9feWNiY3Jfc2R0dl9tYXRyaXhfOGJpdCwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgc3JjX3RtcCA9IHNyYzsKKworICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoIC0gMTsgaiArPSAyKSB7CisgICAgICAgIHkgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgc3JjW3BbMF1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSk7CisgICAgICAgIHUgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgc3JjW3BbMF1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSkgLSAxMjg7CisgICAgICAgIHYgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgc3JjW3BbMF1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSkgLSAxMjg7CisKKyAgICAgICAgYSA9IGNocm9tYV9rZXlpbmdfeXV2IChwYSwgJnksICZ1LCAmdiwgY3IsIGNiLAorICAgICAgICAgICAgc21pbiwgc21heCwgYWNjZXB0X2FuZ2xlX3RnLCBhY2NlcHRfYW5nbGVfY3RnLAorICAgICAgICAgICAgb25lX292ZXJfa2MsIGtmZ3lfc2NhbGUsIGtnLCBub2lzZV9sZXZlbDIpOworCisgICAgICAgIGRlc3RbMF0gPSBhOworICAgICAgICBkZXN0WzFdID0geTsKKyAgICAgICAgZGVzdFsyXSA9IHUgKyAxMjg7CisgICAgICAgIGRlc3RbM10gPSB2ICsgMTI4OworCisgICAgICAgIHkgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgc3JjW3BbMl1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSk7CisgICAgICAgIHUgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgc3JjW3BbMl1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSkgLSAxMjg7CisgICAgICAgIHYgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgc3JjW3BbMl1dLCBzcmNbcFsxXV0sIHNyY1twWzNdXSkgLSAxMjg7CisKKyAgICAgICAgYSA9IGNocm9tYV9rZXlpbmdfeXV2IChwYSwgJnksICZ1LCAmdiwgY3IsIGNiLAorICAgICAgICAgICAgc21pbiwgc21heCwgYWNjZXB0X2FuZ2xlX3RnLCBhY2NlcHRfYW5nbGVfY3RnLAorICAgICAgICAgICAgb25lX292ZXJfa2MsIGtmZ3lfc2NhbGUsIGtnLCBub2lzZV9sZXZlbDIpOworCisgICAgICAgIGRlc3RbNF0gPSBhOworICAgICAgICBkZXN0WzVdID0geTsKKyAgICAgICAgZGVzdFs2XSA9IHUgKyAxMjg7CisgICAgICAgIGRlc3RbN10gPSB2ICsgMTI4OworCisgICAgICAgIGRlc3QgKz0gODsKKyAgICAgICAgc3JjICs9IDQ7CisgICAgICB9CisKKyAgICAgIGlmIChqID09IHdpZHRoIC0gMSkgeworICAgICAgICB5ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHNyY1twWzBdXSwgc3JjW3BbMV1dLCBzcmNbcFszXV0pOworICAgICAgICB1ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHNyY1twWzBdXSwgc3JjW3BbMV1dLCBzcmNbcFszXV0pIC0gMTI4OworICAgICAgICB2ID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHNyY1twWzBdXSwgc3JjW3BbMV1dLCBzcmNbcFszXV0pIC0gMTI4OworCisgICAgICAgIGEgPSBjaHJvbWFfa2V5aW5nX3l1diAocGEsICZ5LCAmdSwgJnYsIGNyLCBjYiwKKyAgICAgICAgICAgIHNtaW4sIHNtYXgsIGFjY2VwdF9hbmdsZV90ZywgYWNjZXB0X2FuZ2xlX2N0ZywKKyAgICAgICAgICAgIG9uZV9vdmVyX2tjLCBrZmd5X3NjYWxlLCBrZywgbm9pc2VfbGV2ZWwyKTsKKworICAgICAgICBkZXN0WzBdID0gYTsKKyAgICAgICAgZGVzdFsxXSA9IHk7CisgICAgICAgIGRlc3RbMl0gPSB1ICsgMTI4OworICAgICAgICBkZXN0WzNdID0gdiArIDEyODsKKworICAgICAgICBkZXN0ICs9IDQ7CisgICAgICB9CisKKyAgICAgIHNyYyA9IHNyY190bXAgKyBzcmNfc3RyaWRlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIHNyY190bXAgPSBzcmM7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aCAtIDE7IGogKz0gMikgeworICAgICAgICB5ID0gc3JjW3BbMF1dOworICAgICAgICB1ID0gc3JjW3BbMV1dIC0gMTI4OworICAgICAgICB2ID0gc3JjW3BbM11dIC0gMTI4OworCisgICAgICAgIGEgPSBjaHJvbWFfa2V5aW5nX3l1diAocGEsICZ5LCAmdSwgJnYsIGNyLCBjYiwKKyAgICAgICAgICAgIHNtaW4sIHNtYXgsIGFjY2VwdF9hbmdsZV90ZywgYWNjZXB0X2FuZ2xlX2N0ZywKKyAgICAgICAgICAgIG9uZV9vdmVyX2tjLCBrZmd5X3NjYWxlLCBrZywgbm9pc2VfbGV2ZWwyKTsKKworICAgICAgICBkZXN0WzBdID0gYTsKKyAgICAgICAgZGVzdFsxXSA9IHk7CisgICAgICAgIGRlc3RbMl0gPSB1ICsgMTI4OworICAgICAgICBkZXN0WzNdID0gdiArIDEyODsKKworICAgICAgICB5ID0gc3JjW3BbMl1dOworICAgICAgICB1ID0gc3JjW3BbMV1dIC0gMTI4OworICAgICAgICB2ID0gc3JjW3BbM11dIC0gMTI4OworCisgICAgICAgIGEgPSBjaHJvbWFfa2V5aW5nX3l1diAocGEsICZ5LCAmdSwgJnYsIGNyLCBjYiwKKyAgICAgICAgICAgIHNtaW4sIHNtYXgsIGFjY2VwdF9hbmdsZV90ZywgYWNjZXB0X2FuZ2xlX2N0ZywKKyAgICAgICAgICAgIG9uZV9vdmVyX2tjLCBrZmd5X3NjYWxlLCBrZywgbm9pc2VfbGV2ZWwyKTsKKworICAgICAgICBkZXN0WzRdID0gYTsKKyAgICAgICAgZGVzdFs1XSA9IHk7CisgICAgICAgIGRlc3RbNl0gPSB1ICsgMTI4OworICAgICAgICBkZXN0WzddID0gdiArIDEyODsKKworICAgICAgICBkZXN0ICs9IDg7CisgICAgICAgIHNyYyArPSA0OworICAgICAgfQorCisgICAgICBpZiAoaiA9PSB3aWR0aCAtIDEpIHsKKyAgICAgICAgeSA9IHNyY1twWzBdXTsKKyAgICAgICAgdSA9IHNyY1twWzFdXSAtIDEyODsKKyAgICAgICAgdiA9IHNyY1twWzNdXSAtIDEyODsKKworICAgICAgICBhID0gY2hyb21hX2tleWluZ195dXYgKHBhLCAmeSwgJnUsICZ2LCBjciwgY2IsCisgICAgICAgICAgICBzbWluLCBzbWF4LCBhY2NlcHRfYW5nbGVfdGcsIGFjY2VwdF9hbmdsZV9jdGcsCisgICAgICAgICAgICBvbmVfb3Zlcl9rYywga2ZneV9zY2FsZSwga2csIG5vaXNlX2xldmVsMik7CisKKyAgICAgICAgZGVzdFswXSA9IGE7CisgICAgICAgIGRlc3RbMV0gPSB5OworICAgICAgICBkZXN0WzJdID0gdSArIDEyODsKKyAgICAgICAgZGVzdFszXSA9IHYgKyAxMjg7CisKKyAgICAgICAgZGVzdCArPSA0OworICAgICAgfQorCisgICAgICBzcmMgPSBzcmNfdG1wICsgc3JjX3N0cmlkZTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9zZXRfcGFja2VkXzQyMl9hcmdiIChjb25zdCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSwgR3N0QWxwaGEgKiBhbHBoYSkKK3sKKyAgY29uc3QgZ3VpbnQ4ICpzcmM7CisgIGd1aW50OCAqZGVzdDsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IHNfYWxwaGEgPSBDTEFNUCAoKGdpbnQpIChhbHBoYS0+YWxwaGEgKiAyNTUpLCAwLCAyNTUpOworICBnaW50IGksIGo7CisgIGdpbnQgcFs0XSwgb1s0XTsKKyAgZ2ludCBzcmNfc3RyaWRlOworICBjb25zdCBndWludDggKnNyY190bXA7CisgIGdpbnQgbWF0cml4WzEyXTsKKyAgZ2ludCByLCBnLCBiOworCisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSk7CisKKyAgc3JjX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoaW5fZnJhbWUsIDApOworCisgIG9bMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMCk7CisgIG9bMl0gPSBvWzBdICsgMjsKKyAgb1sxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAxKTsKKyAgb1szXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAyKTsKKworICBwWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAzKTsKKyAgcFsxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMCk7CisgIHBbMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDEpOworICBwWzNdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAyKTsKKworICBtZW1jcHkgKG1hdHJpeCwKKyAgICAgIGFscGhhLT5pbl9zZHR2ID8gY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2IDoKKyAgICAgIGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfaGR0diwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICBzcmNfdG1wID0gc3JjOworCisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoIC0gMTsgaiArPSAyKSB7CisgICAgICByID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHNyY1tvWzBdXSwgc3JjW29bMV1dLCBzcmNbb1szXV0pOworICAgICAgZyA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCBzcmNbb1swXV0sIHNyY1tvWzFdXSwgc3JjW29bM11dKTsKKyAgICAgIGIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgc3JjW29bMF1dLCBzcmNbb1sxXV0sIHNyY1tvWzNdXSk7CisKKyAgICAgIGRlc3RbcFswXV0gPSBzX2FscGhhOworICAgICAgZGVzdFtwWzFdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzJdXSA9IENMQU1QIChnLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzNdXSA9IENMQU1QIChiLCAwLCAyNTUpOworCisgICAgICByID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHNyY1tvWzJdXSwgc3JjW29bMV1dLCBzcmNbb1szXV0pOworICAgICAgZyA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCBzcmNbb1syXV0sIHNyY1tvWzFdXSwgc3JjW29bM11dKTsKKyAgICAgIGIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgc3JjW29bMl1dLCBzcmNbb1sxXV0sIHNyY1tvWzNdXSk7CisKKyAgICAgIGRlc3RbNCArIHBbMF1dID0gc19hbHBoYTsKKyAgICAgIGRlc3RbNCArIHBbMV1dID0gQ0xBTVAgKHIsIDAsIDI1NSk7CisgICAgICBkZXN0WzQgKyBwWzJdXSA9IENMQU1QIChnLCAwLCAyNTUpOworICAgICAgZGVzdFs0ICsgcFszXV0gPSBDTEFNUCAoYiwgMCwgMjU1KTsKKworICAgICAgZGVzdCArPSA4OworICAgICAgc3JjICs9IDQ7CisgICAgfQorCisgICAgaWYgKGogPT0gd2lkdGggLSAxKSB7CisgICAgICByID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHNyY1tvWzBdXSwgc3JjW29bMV1dLCBzcmNbb1szXV0pOworICAgICAgZyA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCBzcmNbb1swXV0sIHNyY1tvWzFdXSwgc3JjW29bM11dKTsKKyAgICAgIGIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgc3JjW29bMF1dLCBzcmNbb1sxXV0sIHNyY1tvWzNdXSk7CisKKyAgICAgIGRlc3RbcFswXV0gPSBzX2FscGhhOworICAgICAgZGVzdFtwWzFdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzJdXSA9IENMQU1QIChnLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzNdXSA9IENMQU1QIChiLCAwLCAyNTUpOworCisgICAgICBkZXN0ICs9IDQ7CisgICAgfQorCisgICAgc3JjID0gc3JjX3RtcCArIHNyY19zdHJpZGU7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9jaHJvbWFfa2V5X3BhY2tlZF80MjJfYXJnYiAoY29uc3QgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUsIEdzdEFscGhhICogYWxwaGEpCit7CisgIGNvbnN0IGd1aW50OCAqc3JjOworICBndWludDggKmRlc3Q7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBpLCBqOworICBnaW50IGEsIHksIHUsIHY7CisgIGdpbnQgciwgZywgYjsKKyAgZ2ludCBzbWluLCBzbWF4OworICBnaW50IHBhID0gQ0xBTVAgKChnaW50KSAoYWxwaGEtPmFscGhhICogMjU1KSwgMCwgMjU1KTsKKyAgZ2ludDggY2IgPSBhbHBoYS0+Y2IsIGNyID0gYWxwaGEtPmNyOworICBnaW50OCBrZyA9IGFscGhhLT5rZzsKKyAgZ3VpbnQ4IGFjY2VwdF9hbmdsZV90ZyA9IGFscGhhLT5hY2NlcHRfYW5nbGVfdGc7CisgIGd1aW50OCBhY2NlcHRfYW5nbGVfY3RnID0gYWxwaGEtPmFjY2VwdF9hbmdsZV9jdGc7CisgIGd1aW50OCBvbmVfb3Zlcl9rYyA9IGFscGhhLT5vbmVfb3Zlcl9rYzsKKyAgZ3VpbnQ4IGtmZ3lfc2NhbGUgPSBhbHBoYS0+a2ZneV9zY2FsZTsKKyAgZ3VpbnQgbm9pc2VfbGV2ZWwyID0gYWxwaGEtPm5vaXNlX2xldmVsMjsKKyAgZ2ludCBwWzRdLCBvWzRdOworICBnaW50IHNyY19zdHJpZGU7CisgIGNvbnN0IGd1aW50OCAqc3JjX3RtcDsKKyAgZ2ludCBtYXRyaXhbMTJdOworCisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSk7CisKKyAgc3JjX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoaW5fZnJhbWUsIDApOworCisgIG9bMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChpbl9mcmFtZSwgMCk7CisgIG9bMl0gPSBvWzBdICsgMjsKKyAgb1sxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAxKTsKKyAgb1szXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKGluX2ZyYW1lLCAyKTsKKworICBwWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAzKTsKKyAgcFsxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BPRkZTRVQgKG91dF9mcmFtZSwgMCk7CisgIHBbMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QT0ZGU0VUIChvdXRfZnJhbWUsIDEpOworICBwWzNdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUE9GRlNFVCAob3V0X2ZyYW1lLCAyKTsKKworICBtZW1jcHkgKG1hdHJpeCwKKyAgICAgIGFscGhhLT5pbl9zZHR2ID8gY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2IDoKKyAgICAgIGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfaGR0diwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKworICBzbWluID0gMTI4IC0gYWxwaGEtPmJsYWNrX3NlbnNpdGl2aXR5OworICBzbWF4ID0gMTI4ICsgYWxwaGEtPndoaXRlX3NlbnNpdGl2aXR5OworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIHNyY190bXAgPSBzcmM7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGggLSAxOyBqICs9IDIpIHsKKyAgICAgIHkgPSBzcmNbb1swXV07CisgICAgICB1ID0gc3JjW29bMV1dIC0gMTI4OworICAgICAgdiA9IHNyY1tvWzNdXSAtIDEyODsKKworICAgICAgYSA9IGNocm9tYV9rZXlpbmdfeXV2IChwYSwgJnksICZ1LCAmdiwgY3IsIGNiLAorICAgICAgICAgIHNtaW4sIHNtYXgsIGFjY2VwdF9hbmdsZV90ZywgYWNjZXB0X2FuZ2xlX2N0ZywKKyAgICAgICAgICBvbmVfb3Zlcl9rYywga2ZneV9zY2FsZSwga2csIG5vaXNlX2xldmVsMik7CisgICAgICB1ICs9IDEyODsKKyAgICAgIHYgKz0gMTI4OworCisgICAgICByID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHksIHUsIHYpOworICAgICAgZyA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5LCB1LCB2KTsKKyAgICAgIGIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeSwgdSwgdik7CisKKyAgICAgIGRlc3RbcFswXV0gPSBhOworICAgICAgZGVzdFtwWzFdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzJdXSA9IENMQU1QIChnLCAwLCAyNTUpOworICAgICAgZGVzdFtwWzNdXSA9IENMQU1QIChiLCAwLCAyNTUpOworCisgICAgICB5ID0gc3JjW29bMl1dOworICAgICAgdSA9IHNyY1tvWzFdXSAtIDEyODsKKyAgICAgIHYgPSBzcmNbb1szXV0gLSAxMjg7CisKKyAgICAgIGEgPSBjaHJvbWFfa2V5aW5nX3l1diAocGEsICZ5LCAmdSwgJnYsIGNyLCBjYiwKKyAgICAgICAgICBzbWluLCBzbWF4LCBhY2NlcHRfYW5nbGVfdGcsIGFjY2VwdF9hbmdsZV9jdGcsCisgICAgICAgICAgb25lX292ZXJfa2MsIGtmZ3lfc2NhbGUsIGtnLCBub2lzZV9sZXZlbDIpOworICAgICAgdSArPSAxMjg7CisgICAgICB2ICs9IDEyODsKKworICAgICAgciA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5LCB1LCB2KTsKKyAgICAgIGcgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeSwgdSwgdik7CisgICAgICBiID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHksIHUsIHYpOworCisgICAgICBkZXN0WzQgKyBwWzBdXSA9IGE7CisgICAgICBkZXN0WzQgKyBwWzFdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgZGVzdFs0ICsgcFsyXV0gPSBDTEFNUCAoZywgMCwgMjU1KTsKKyAgICAgIGRlc3RbNCArIHBbM11dID0gQ0xBTVAgKGIsIDAsIDI1NSk7CisKKyAgICAgIGRlc3QgKz0gODsKKyAgICAgIHNyYyArPSA0OworICAgIH0KKworICAgIGlmIChqID09IHdpZHRoIC0gMSkgeworICAgICAgeSA9IHNyY1tvWzBdXTsKKyAgICAgIHUgPSBzcmNbb1sxXV0gLSAxMjg7CisgICAgICB2ID0gc3JjW29bM11dIC0gMTI4OworCisgICAgICBhID0gY2hyb21hX2tleWluZ195dXYgKHBhLCAmeSwgJnUsICZ2LCBjciwgY2IsCisgICAgICAgICAgc21pbiwgc21heCwgYWNjZXB0X2FuZ2xlX3RnLCBhY2NlcHRfYW5nbGVfY3RnLAorICAgICAgICAgIG9uZV9vdmVyX2tjLCBrZmd5X3NjYWxlLCBrZywgbm9pc2VfbGV2ZWwyKTsKKyAgICAgIHUgKz0gMTI4OworICAgICAgdiArPSAxMjg7CisKKyAgICAgIHIgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeSwgdSwgdik7CisgICAgICBnID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHksIHUsIHYpOworICAgICAgYiA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5LCB1LCB2KTsKKworICAgICAgZGVzdFtwWzBdXSA9IGE7CisgICAgICBkZXN0W3BbMV1dID0gQ0xBTVAgKHIsIDAsIDI1NSk7CisgICAgICBkZXN0W3BbMl1dID0gQ0xBTVAgKGcsIDAsIDI1NSk7CisgICAgICBkZXN0W3BbM11dID0gQ0xBTVAgKGIsIDAsIDI1NSk7CisKKyAgICAgIGRlc3QgKz0gNDsKKyAgICB9CisKKyAgICBzcmMgPSBzcmNfdG1wICsgc3JjX3N0cmlkZTsKKyAgfQorfQorCisvKiBQcm90ZWN0ZWQgd2l0aCB0aGUgYWxwaGEgbG9jayAqLworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9pbml0X3BhcmFtc19mdWxsIChHc3RBbHBoYSAqIGFscGhhLAorICAgIGNvbnN0IEdzdFZpZGVvRm9ybWF0SW5mbyAqIGluX2luZm8sIGNvbnN0IEdzdFZpZGVvRm9ybWF0SW5mbyAqIG91dF9pbmZvKQoreworICBnZmxvYXQga2dsOworICBnZmxvYXQgdG1wOworICBnZmxvYXQgdG1wMSwgdG1wMjsKKyAgZ2Zsb2F0IHk7CisgIGd1aW50IHRhcmdldF9yID0gYWxwaGEtPnRhcmdldF9yOworICBndWludCB0YXJnZXRfZyA9IGFscGhhLT50YXJnZXRfZzsKKyAgZ3VpbnQgdGFyZ2V0X2IgPSBhbHBoYS0+dGFyZ2V0X2I7CisgIGNvbnN0IGdpbnQgKm1hdHJpeDsKKworICBzd2l0Y2ggKGFscGhhLT5tZXRob2QpIHsKKyAgICBjYXNlIEFMUEhBX01FVEhPRF9HUkVFTjoKKyAgICAgIHRhcmdldF9yID0gMDsKKyAgICAgIHRhcmdldF9nID0gMjU1OworICAgICAgdGFyZ2V0X2IgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBTFBIQV9NRVRIT0RfQkxVRToKKyAgICAgIHRhcmdldF9yID0gMDsKKyAgICAgIHRhcmdldF9nID0gMDsKKyAgICAgIHRhcmdldF9iID0gMjU1OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogUkdCLT5SR0I6IGNvbnZlcnQgdG8gU0RUViBZVVYsIGNocm9tYSBrZXlpbmcsIGNvbnZlcnQgYmFjaworICAgKiBZVVYtPlJHQjogY2hyb21hIGtleWluZywgY29udmVydCB0byBSR0IKKyAgICogUkdCLT5ZVVY6IGNvbnZlcnQgdG8gWVVWLCBjaHJvbWEga2V5aW5nCisgICAqIFlVVi0+WVVWOiBjb252ZXJ0IG1hdHJpeCwgY2hyb21hIGtleWluZworICAgKi8KKyAgaWYgKEdTVF9WSURFT19GT1JNQVRfSU5GT19JU19SR0IgKGluX2luZm8pCisgICAgICAmJiBHU1RfVklERU9fRk9STUFUX0lORk9fSVNfUkdCIChvdXRfaW5mbykpCisgICAgbWF0cml4ID0gY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9zZHR2OworICBlbHNlIGlmIChHU1RfVklERU9fRk9STUFUX0lORk9fSVNfWVVWIChpbl9pbmZvKQorICAgICAgJiYgR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX0lTX1JHQiAob3V0X2luZm8pKQorICAgIG1hdHJpeCA9CisgICAgICAgIChhbHBoYS0+aW5fc2R0dikgPyBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgICBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X2hkdHY7CisgIGVsc2UgaWYgKEdTVF9WSURFT19GT1JNQVRfSU5GT19JU19SR0IgKGluX2luZm8pCisgICAgICAmJiBHU1RfVklERU9fRk9STUFUX0lORk9fSVNfWVVWIChvdXRfaW5mbykpCisgICAgbWF0cml4ID0KKyAgICAgICAgKGFscGhhLT5vdXRfc2R0dikgPyBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgICBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X2hkdHY7CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHl1diAtPiB5dXYgKi8KKyAgICBtYXRyaXggPQorICAgICAgICAoYWxwaGEtPm91dF9zZHR2KSA/IGNvZ19yZ2JfdG9feWNiY3JfbWF0cml4XzhiaXRfc2R0diA6CisgICAgICAgIGNvZ19yZ2JfdG9feWNiY3JfbWF0cml4XzhiaXRfaGR0djsKKworICB5ID0gKG1hdHJpeFswXSAqICgoZ2ludCkgdGFyZ2V0X3IpICsKKyAgICAgIG1hdHJpeFsxXSAqICgoZ2ludCkgdGFyZ2V0X2cpICsKKyAgICAgIG1hdHJpeFsyXSAqICgoZ2ludCkgdGFyZ2V0X2IpICsgbWF0cml4WzNdKSA+PiA4OworICAvKiBDYixDciB3aXRob3V0IG9mZnNldCBoZXJlIGJlY2F1c2UgdGhlIGNocm9tYSBrZXlpbmcKKyAgICogd29ya3Mgd2l0aCB0aGVtIGJlaW5nIGluIHJhbmdlIFstMTI4LDEyN10KKyAgICovCisgIHRtcDEgPQorICAgICAgKG1hdHJpeFs0XSAqICgoZ2ludCkgdGFyZ2V0X3IpICsKKyAgICAgIG1hdHJpeFs1XSAqICgoZ2ludCkgdGFyZ2V0X2cpICsgbWF0cml4WzZdICogKChnaW50KSB0YXJnZXRfYikpID4+IDg7CisgIHRtcDIgPQorICAgICAgKG1hdHJpeFs4XSAqICgoZ2ludCkgdGFyZ2V0X3IpICsKKyAgICAgIG1hdHJpeFs5XSAqICgoZ2ludCkgdGFyZ2V0X2cpICsgbWF0cml4WzEwXSAqICgoZ2ludCkgdGFyZ2V0X2IpKSA+PiA4OworCisgIGtnbCA9IHNxcnQgKHRtcDEgKiB0bXAxICsgdG1wMiAqIHRtcDIpOworICBhbHBoYS0+Y2IgPSAxMjcgKiAodG1wMSAvIGtnbCk7CisgIGFscGhhLT5jciA9IDEyNyAqICh0bXAyIC8ga2dsKTsKKworICB0bXAgPSAxNSAqIHRhbiAoTV9QSSAqIGFscGhhLT5hbmdsZSAvIDE4MCk7CisgIHRtcCA9IE1JTiAodG1wLCAyNTUpOworICBhbHBoYS0+YWNjZXB0X2FuZ2xlX3RnID0gdG1wOworICB0bXAgPSAxNSAvIHRhbiAoTV9QSSAqIGFscGhhLT5hbmdsZSAvIDE4MCk7CisgIHRtcCA9IE1JTiAodG1wLCAyNTUpOworICBhbHBoYS0+YWNjZXB0X2FuZ2xlX2N0ZyA9IHRtcDsKKyAgdG1wID0gMSAvIChrZ2wpOworICBhbHBoYS0+b25lX292ZXJfa2MgPSAyNTUgKiAyICogdG1wIC0gMjU1OworICB0bXAgPSAxNSAqIHkgLyBrZ2w7CisgIHRtcCA9IE1JTiAodG1wLCAyNTUpOworICBhbHBoYS0+a2ZneV9zY2FsZSA9IHRtcDsKKyAgYWxwaGEtPmtnID0gTUlOIChrZ2wsIDEyNyk7CisKKyAgYWxwaGEtPm5vaXNlX2xldmVsMiA9IGFscGhhLT5ub2lzZV9sZXZlbCAqIGFscGhhLT5ub2lzZV9sZXZlbDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9pbml0X3BhcmFtcyAoR3N0QWxwaGEgKiBhbHBoYSkKK3sKKyAgY29uc3QgR3N0VmlkZW9Gb3JtYXRJbmZvICpmaW5mb19pbiwgKmZpbmZvX291dDsKKworICBmaW5mb19pbiA9IEdTVF9WSURFT19GSUxURVIgKGFscGhhKS0+aW5faW5mby5maW5mbzsKKyAgZmluZm9fb3V0ID0gR1NUX1ZJREVPX0ZJTFRFUiAoYWxwaGEpLT5vdXRfaW5mby5maW5mbzsKKworICBpZiAoZmluZm9faW4gIT0gTlVMTCAmJiBmaW5mb19vdXQgIT0gTlVMTCkgeworICAgIGdzdF9hbHBoYV9pbml0X3BhcmFtc19mdWxsIChhbHBoYSwgZmluZm9faW4sIGZpbmZvX291dCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYWxwaGEsICJ2aWRlbyBmb3JtYXRzIG5vdCBzZXQgeWV0Iik7CisgIH0KK30KKworLyogUHJvdGVjdGVkIHdpdGggdGhlIGFscGhhIGxvY2sgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FscGhhX3NldF9wcm9jZXNzX2Z1bmN0aW9uX2Z1bGwgKEdzdEFscGhhICogYWxwaGEsIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sCisgICAgR3N0VmlkZW9JbmZvICogb3V0X2luZm8pCit7CisgIGFscGhhLT5wcm9jZXNzID0gTlVMTDsKKworICBzd2l0Y2ggKGFscGhhLT5tZXRob2QpIHsKKyAgICBjYXNlIEFMUEhBX01FVEhPRF9TRVQ6CisgICAgICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAob3V0X2luZm8pKSB7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgICAgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUIChpbl9pbmZvKSkgeworICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FZVVY6CisgICAgICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gZ3N0X2FscGhhX3NldF9heXV2X2F5dXY7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0NDQ6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQyQjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQxQjoKKyAgICAgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSBnc3RfYWxwaGFfc2V0X3BsYW5hcl95dXZfYXl1djsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVVZMjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVllVOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gZ3N0X2FscGhhX3NldF9wYWNrZWRfNDIyX2F5dXY7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FSR0I6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQUJHUjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gZ3N0X2FscGhhX3NldF9hcmdiX2F5dXY7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hSR0I6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeEJHUjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0J4OgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUng6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUjoKKyAgICAgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSBnc3RfYWxwaGFfc2V0X3JnYl9heXV2OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FSR0I6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BQkdSOgorICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgICAgICAgc3dpdGNoIChHU1RfVklERU9fSU5GT19GT1JNQVQgKGluX2luZm8pKSB7CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICAgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSBnc3RfYWxwaGFfc2V0X2F5dXZfYXJnYjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQ0NDoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVYxMjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDFCOgorICAgICAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IGdzdF9hbHBoYV9zZXRfcGxhbmFyX3l1dl9hcmdiOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWWVU6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfVVlWWToKKyAgICAgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSBnc3RfYWxwaGFfc2V0X3BhY2tlZF80MjJfYXJnYjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BQkdSOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQkE6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSBnc3RfYWxwaGFfc2V0X2FyZ2JfYXJnYjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeFJHQjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94QkdSOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQng6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSeDoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSOgorICAgICAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IGdzdF9hbHBoYV9zZXRfcmdiX2FyZ2I7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBBTFBIQV9NRVRIT0RfR1JFRU46CisgICAgY2FzZSBBTFBIQV9NRVRIT0RfQkxVRToKKyAgICBjYXNlIEFMUEhBX01FVEhPRF9DVVNUT006CisgICAgICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAob3V0X2luZm8pKSB7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgICAgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUIChpbl9pbmZvKSkgeworICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FZVVY6CisgICAgICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gZ3N0X2FscGhhX2Nocm9tYV9rZXlfYXl1dl9heXV2OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDQ0OgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MkI6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfSTQyMDoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVjEyOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MUI6CisgICAgICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gZ3N0X2FscGhhX2Nocm9tYV9rZXlfcGxhbmFyX3l1dl9heXV2OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWWVU6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfVVlWWToKKyAgICAgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSBnc3RfYWxwaGFfY2hyb21hX2tleV9wYWNrZWRfNDIyX2F5dXY7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FSR0I6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQUJHUjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gZ3N0X2FscGhhX2Nocm9tYV9rZXlfYXJnYl9heXV2OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94UkdCOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hCR1I6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCeDoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1J4OgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1I6CisgICAgICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gZ3N0X2FscGhhX2Nocm9tYV9rZXlfcmdiX2F5dXY7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgICAgICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoaW5faW5mbykpIHsKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IGdzdF9hbHBoYV9jaHJvbWFfa2V5X2F5dXZfYXJnYjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQ0NDoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVYxMjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDFCOgorICAgICAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IGdzdF9hbHBoYV9jaHJvbWFfa2V5X3BsYW5hcl95dXZfYXJnYjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVVZMjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVllVOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gZ3N0X2FscGhhX2Nocm9tYV9rZXlfcGFja2VkXzQyMl9hcmdiOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BUkdCOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1JBOgorICAgICAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IGdzdF9hbHBoYV9jaHJvbWFfa2V5X2FyZ2JfYXJnYjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeFJHQjoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94QkdSOgorICAgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQng6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSeDoKKyAgICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSOgorICAgICAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IGdzdF9hbHBoYV9jaHJvbWFfa2V5X3JnYl9hcmdiOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gYWxwaGEtPnByb2Nlc3MgIT0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hbHBoYV9zZXRfcHJvY2Vzc19mdW5jdGlvbiAoR3N0QWxwaGEgKiBhbHBoYSkKK3sKKyAgR3N0VmlkZW9JbmZvICppbmZvX2luLCAqaW5mb19vdXQ7CisKKyAgaW5mb19pbiA9ICZHU1RfVklERU9fRklMVEVSIChhbHBoYSktPmluX2luZm87CisgIGluZm9fb3V0ID0gJkdTVF9WSURFT19GSUxURVIgKGFscGhhKS0+b3V0X2luZm87CisKKyAgaWYgKGluZm9faW4tPmZpbmZvICE9IE5VTEwgJiYgaW5mb19vdXQtPmZpbmZvICE9IE5VTEwpIHsKKyAgICBnc3RfYWxwaGFfc2V0X3Byb2Nlc3NfZnVuY3Rpb25fZnVsbCAoYWxwaGEsIGluZm9faW4sIGluZm9fb3V0KTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhbHBoYSwgInZpZGVvIGZvcm1hdHMgbm90IHNldCB5ZXQiKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2FscGhhX2JlZm9yZV90cmFuc2Zvcm0gKEdzdEJhc2VUcmFuc2Zvcm0gKiBidHJhbnMsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0QWxwaGEgKmFscGhhID0gR1NUX0FMUEhBIChidHJhbnMpOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworCisgIHRpbWVzdGFtcCA9IGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmYnRyYW5zLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKSk7CisgIEdTVF9MT0cgKCJHb3Qgc3RyZWFtIHRpbWUgb2YgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEICh0aW1lc3RhbXApKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKGFscGhhKSwgdGltZXN0YW1wKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hbHBoYV90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogZmlsdGVyLCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSkKK3sKKyAgR3N0QWxwaGEgKmFscGhhID0gR1NUX0FMUEhBIChmaWx0ZXIpOworCisgIEdTVF9BTFBIQV9MT0NLIChhbHBoYSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFhbHBoYS0+cHJvY2VzcykpCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICBhbHBoYS0+cHJvY2VzcyAoaW5fZnJhbWUsIG91dF9mcmFtZSwgYWxwaGEpOworCisgIEdTVF9BTFBIQV9VTkxPQ0sgKGFscGhhKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCitub3RfbmVnb3RpYXRlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGFscGhhLCAiTm90IG5lZ290aWF0ZWQgeWV0Iik7CisgICAgR1NUX0FMUEhBX1VOTE9DSyAoYWxwaGEpOworICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYWxwaGEiLCBHU1RfUkFOS19OT05FLCBHU1RfVFlQRV9BTFBIQSk7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBhbHBoYSwKKyAgICAiYWRkcyBhbiBhbHBoYSBjaGFubmVsIHRvIHZpZGVvIC0gY29uc3RhbnQgb3IgdmlhIGNocm9tYS1rZXlpbmciLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L2FscGhhL2dzdGFscGhhLmggYi9nc3QvYWxwaGEvZ3N0YWxwaGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDhmYjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2FscGhhL2dzdGFscGhhLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBFZHdhcmQgSGVydmV5IDxlZHdhcmQuaGVydmV5QGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0FMUEhBX0hfXworI2RlZmluZSBfX0dTVF9BTFBIQV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9maWx0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0FMUEhBIFwKKyAgKGdzdF9hbHBoYV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQUxQSEEob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9BTFBIQSxHc3RBbHBoYSkpCisjZGVmaW5lIEdTVF9BTFBIQV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9BTFBIQSxHc3RBbHBoYUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FMUEhBKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQUxQSEEpKQorI2RlZmluZSBHU1RfSVNfQUxQSEFfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfQUxQSEEpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0QWxwaGEgR3N0QWxwaGE7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QWxwaGFDbGFzcyBHc3RBbHBoYUNsYXNzOworCisvKiogCisgKiBHc3RBbHBoYU1ldGhvZDoKKyAqIEBBTFBIQV9NRVRIT0RfU0VUOiBTZXQvYWRqdXN0IGFscGhhIGNoYW5uZWwKKyAqIEBBTFBIQV9NRVRIT0RfR1JFRU46IENocm9tYSBLZXkgZ3JlZW4KKyAqIEBBTFBIQV9NRVRIT0RfQkxVRTogQ2hyb21hIEtleSBibHVlCisgKiBAQUxQSEFfTUVUSE9EX0NVU1RPTTogQ2hyb21hIEtleSBvbiB0YXJnZXRfci9nL2IKKyAqLwordHlwZWRlZiBlbnVtCit7CisgIEFMUEhBX01FVEhPRF9TRVQsCisgIEFMUEhBX01FVEhPRF9HUkVFTiwKKyAgQUxQSEFfTUVUSE9EX0JMVUUsCisgIEFMUEhBX01FVEhPRF9DVVNUT00sCit9CitHc3RBbHBoYU1ldGhvZDsKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X2FscGhhX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9hbHBoYV9kZWJ1ZworCitzdHJ1Y3QgX0dzdEFscGhhCit7CisgIEdzdFZpZGVvRmlsdGVyIHBhcmVudDsKKworICAvKiA8cHJpdmF0ZT4gKi8KKworICAvKiBjYXBzICovCisgIEdNdXRleCBsb2NrOworCisgIGdib29sZWFuIGluX3NkdHYsIG91dF9zZHR2OworCisgIC8qIHByb3BlcnRpZXMgKi8KKyAgZ2RvdWJsZSBhbHBoYTsKKworICBndWludCB0YXJnZXRfcjsKKyAgZ3VpbnQgdGFyZ2V0X2c7CisgIGd1aW50IHRhcmdldF9iOworCisgIEdzdEFscGhhTWV0aG9kIG1ldGhvZDsKKworICBnZmxvYXQgYW5nbGU7CisgIGdmbG9hdCBub2lzZV9sZXZlbDsKKyAgZ3VpbnQgYmxhY2tfc2Vuc2l0aXZpdHk7CisgIGd1aW50IHdoaXRlX3NlbnNpdGl2aXR5OworCisgIGdib29sZWFuIHByZWZlcl9wYXNzdGhyb3VnaDsKKworICAvKiBwcm9jZXNzaW5nIGZ1bmN0aW9uICovCisgIHZvaWQgKCpwcm9jZXNzKSAoY29uc3QgR3N0VmlkZW9GcmFtZSAqaW5fZnJhbWUsIEdzdFZpZGVvRnJhbWUgKm91dF9mcmFtZSwgR3N0QWxwaGEgKmFscGhhKTsKKworICAvKiBwcmVjYWxjdWxhdGVkIHZhbHVlcyBmb3IgY2hyb21hIGtleWluZyAqLworICBnaW50OCBjYiwgY3I7CisgIGdpbnQ4IGtnOworICBndWludDggYWNjZXB0X2FuZ2xlX3RnOworICBndWludDggYWNjZXB0X2FuZ2xlX2N0ZzsKKyAgZ3VpbnQ4IG9uZV9vdmVyX2tjOworICBndWludDgga2ZneV9zY2FsZTsKKyAgZ3VpbnQgbm9pc2VfbGV2ZWwyOworfTsKKworc3RydWN0IF9Hc3RBbHBoYUNsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2FscGhhX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0FMUEhBX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2FscGhhL2dzdGFscGhhY29sb3IuYyBiL2dzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA4MmU3NAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmMKQEAgLTAsMCArMSw3MDcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hbHBoYWNvbG9yCisgKgorICogVGhlIGFscGhhY29sb3IgZWxlbWVudCBkb2VzIG1lbW9yeS1lZmZpY2llbnQgKGluLXBsYWNlKSBjb2xvdXJzcGFjZQorICogY29udmVyc2lvbiBmcm9tIFJHQkEgdG8gQVlVViBvciBBWVVWIHRvIFJHQkEgd2hpbGUgcHJlc2VydmluZyB0aGUKKyAqIGFscGhhIGNoYW5uZWwuCisgKgorICogU2FtcGxlIHBpcGVsaW5lOgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyAhICJ2aWRlby94LXJhdyxmb3JtYXQ9KGZvdXJjYylBWVVWIiAhIFwKKyAqICAgYWxwaGFjb2xvciAhIHZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsKKyAqIF18CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0YWxwaGFjb2xvci5oIgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGFscGhhX2NvbG9yX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGFscGhhX2NvbG9yX2RlYnVnCisKKy8qIGVsZW1lbnRmYWN0b3J5IGluZm9ybWF0aW9uICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgUkdCQSwgQkdSQSwgQVJHQiwgQUJHUiwgQVlVViB9IikpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IFJHQkEsIEJHUkEsIEFSR0IsIEFCR1IsIEFZVVYgfSIpKQorICAgICk7CisKK0dfREVGSU5FX1RZUEUgKEdzdEFscGhhQ29sb3IsIGdzdF9hbHBoYV9jb2xvciwgR1NUX1RZUEVfVklERU9fRklMVEVSKTsKKworc3RhdGljIEdzdENhcHMgKmdzdF9hbHBoYV9jb2xvcl90cmFuc2Zvcm1fY2FwcyAoR3N0QmFzZVRyYW5zZm9ybSAqIGJ0cmFucywKKyAgICBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RDYXBzICogY2FwcywgR3N0Q2FwcyAqIGZpbHRlcik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYWxwaGFfY29sb3Jfc2V0X2luZm8gKEdzdFZpZGVvRmlsdGVyICogZmlsdGVyLAorICAgIEdzdENhcHMgKiBpbmNhcHMsIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIG91dF9pbmZvKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hbHBoYV9jb2xvcl90cmFuc2Zvcm1fZnJhbWVfaXAgKEdzdFZpZGVvRmlsdGVyICoKKyAgICBmaWx0ZXIsIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSk7CisKK3N0YXRpYyB2b2lkCitnc3RfYWxwaGFfY29sb3JfY2xhc3NfaW5pdCAoR3N0QWxwaGFDb2xvckNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqZ3N0YmFzZXRyYW5zZm9ybV9jbGFzcyA9CisgICAgICAoR3N0QmFzZVRyYW5zZm9ybUNsYXNzICopIGtsYXNzOworICBHc3RWaWRlb0ZpbHRlckNsYXNzICpnc3R2aWRlb2ZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChhbHBoYV9jb2xvcl9kZWJ1ZywgImFscGhhY29sb3IiLCAwLAorICAgICAgIkFSR0I8LT5BWVVWIGNvbG9yc3BhY2UgY29udmVyc2lvbiBwcmVzZXJ2aW5nIHRoZSBhbHBoYSBjaGFubmVscyIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJBbHBoYSBjb2xvciBmaWx0ZXIiLAorICAgICAgIkZpbHRlci9Db252ZXJ0ZXIvVmlkZW8iLAorICAgICAgIkFSR0IgZnJvbS90byBBWVVWIGNvbG9yc3BhY2UgY29udmVyc2lvbiBwcmVzZXJ2aW5nIHRoZSBhbHBoYSBjaGFubmVsIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsYXRlKTsKKworICBnc3RiYXNldHJhbnNmb3JtX2NsYXNzLT50cmFuc2Zvcm1fY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FscGhhX2NvbG9yX3RyYW5zZm9ybV9jYXBzKTsKKyAgZ3N0YmFzZXRyYW5zZm9ybV9jbGFzcy0+dHJhbnNmb3JtX2lwX29uX3Bhc3N0aHJvdWdoID0gRkFMU0U7CisKKyAgZ3N0dmlkZW9maWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hbHBoYV9jb2xvcl9zZXRfaW5mbyk7CisgIGdzdHZpZGVvZmlsdGVyX2NsYXNzLT50cmFuc2Zvcm1fZnJhbWVfaXAgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hbHBoYV9jb2xvcl90cmFuc2Zvcm1fZnJhbWVfaXApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FscGhhX2NvbG9yX2luaXQgKEdzdEFscGhhQ29sb3IgKiBhbHBoYSkKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybSAqYnRyYW5zID0gR1NUX0JBU0VfVFJBTlNGT1JNIChhbHBoYSk7CisKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9pbl9wbGFjZSAoYnRyYW5zLCBUUlVFKTsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2FscGhhX2NvbG9yX3RyYW5zZm9ybV9jYXBzIChHc3RCYXNlVHJhbnNmb3JtICogYnRyYW5zLAorICAgIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENhcHMgKiBjYXBzLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICp0bXBsX2NhcHMgPSBOVUxMOworICBHc3RDYXBzICpyZXN1bHQgPSBOVUxMLCAqbG9jYWxfY2FwcyA9IE5VTEw7CisgIGd1aW50IGk7CisKKyAgbG9jYWxfY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSA9CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfY29weSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSkpOworCisgICAgLyogUmVtb3ZlIGFueSBzcGVjaWZpYyBwYXJhbWV0ZXIgZnJvbSB0aGUgc3RydWN0dXJlICovCisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHN0cnVjdHVyZSwgImZvcm1hdCIpOworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzdHJ1Y3R1cmUsICJjb2xvcmltZXRyeSIpOworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzdHJ1Y3R1cmUsICJjaHJvbWEtc2l0ZSIpOworCisgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAoc3RydWN0dXJlLCAidmlkZW8veC1yYXciKTsKKyAgICBnc3RfY2Fwc19hcHBlbmRfc3RydWN0dXJlIChsb2NhbF9jYXBzLCBzdHJ1Y3R1cmUpOworICB9CisKKyAgLyogR2V0IHRoZSBhcHByb3ByaWF0ZSB0ZW1wbGF0ZSAqLworICBpZiAoZGlyZWN0aW9uID09IEdTVF9QQURfU0lOSykgeworICAgIHRtcGxfY2FwcyA9IGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldF9jYXBzICgmc3JjX3RlbXBsYXRlKTsKKyAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gR1NUX1BBRF9TUkMpIHsKKyAgICB0bXBsX2NhcHMgPSBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXRfY2FwcyAoJnNpbmtfdGVtcGxhdGUpOworICB9CisKKyAgLyogSW50ZXJzZWN0IHdpdGggb3VyIHRlbXBsYXRlIGNhcHMgKi8KKyAgcmVzdWx0ID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChsb2NhbF9jYXBzLCB0bXBsX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAodG1wbF9jYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGxvY2FsX2NhcHMpOworCisgIHJlc3VsdCA9IGdzdF9jYXBzX3NpbXBsaWZ5IChyZXN1bHQpOworCisgIEdTVF9MT0dfT0JKRUNUIChidHJhbnMsICJ0cmFuc2Zvcm1lZCAlIiBHU1RfUFRSX0ZPUk1BVCAiIHRvICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgY2FwcywgcmVzdWx0KTsKKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYnRyYW5zLCAiVXNpbmcgZmlsdGVyIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGZpbHRlcik7CisgICAgaW50ZXJzZWN0aW9uID0KKyAgICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgcmVzdWx0LCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChyZXN1bHQpOworICAgIHJlc3VsdCA9IGludGVyc2VjdGlvbjsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChidHJhbnMsICJJbnRlcnNlY3Rpb24gJSIgR1NUX1BUUl9GT1JNQVQsIHJlc3VsdCk7CisgIH0KKworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIEdlbmVyYXRlZCBieSAtYmFkL2V4dC9jb2cvZ2VuZXJhdGVfdGFibGVzICovCitzdGF0aWMgY29uc3QgaW50IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfaGR0dltdID0geworICAyOTgsIDAsIDQ1OSwgLTYzNTE0LAorICAyOTgsIC01NSwgLTEzNiwgMTk2ODEsCisgIDI5OCwgNTQxLCAwLCAtNzM5ODgsCit9OworCitzdGF0aWMgY29uc3QgaW50IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfc2R0dltdID0geworICAyOTgsIDAsIDQwOSwgLTU3MDY4LAorICAyOTgsIC0xMDAsIC0yMDgsIDM0NzA3LAorICAyOTgsIDUxNiwgMCwgLTcwODcwLAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9oZHR2W10gPSB7CisgIDQ3LCAxNTcsIDE2LCA0MDk2LAorICAtMjYsIC04NywgMTEyLCAzMjc2OCwKKyAgMTEyLCAtMTAyLCAtMTAsIDMyNzY4LAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9zZHR2W10gPSB7CisgIDY2LCAxMjksIDI1LCA0MDk2LAorICAtMzgsIC03NCwgMTEyLCAzMjc2OCwKKyAgMTEyLCAtOTQsIC0xOCwgMzI3NjgsCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBjb2dfeWNiY3Jfc2R0dl90b195Y2Jjcl9oZHR2X21hdHJpeF84Yml0W10gPSB7CisgIDI1NiwgLTMwLCAtNTMsIDEwNjAwLAorICAwLCAyNjEsIDI5LCAtNDM2NywKKyAgMCwgMTksIDI2MiwgLTMyODksCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0W10gPSB7CisgIDI1NiwgMjUsIDQ5LCAtOTUzNiwKKyAgMCwgMjUzLCAtMjgsIDM5NTgsCisgIDAsIC0xOSwgMjUyLCAyOTE4LAorfTsKKworI2RlZmluZSBERUZJTkVfQVJHQl9BWVVWX0ZVTkNUSU9OUyhuYW1lLCBBLCBSLCBHLCBCKSBcCitzdGF0aWMgdm9pZCBcCit0cmFuc2Zvcm1fIyNuYW1lIyNfYXl1diAoR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBjb25zdCBnaW50ICptYXRyaXgpIFwKK3sgXAorICBndWludDggKmRhdGE7IFwKKyAgZ3NpemUgc2l6ZTsgXAorICBnaW50IHksIHUsIHY7IFwKKyAgZ2ludCB5Y1s0XTsgXAorICBnaW50IHVjWzRdOyBcCisgIGdpbnQgdmNbNF07IFwKKyAgXAorICBkYXRhID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLCAwKTtcCisgIHNpemUgPSBHU1RfVklERU9fRlJBTUVfU0laRSAoZnJhbWUpO1wKKyAgXAorICBtZW1jcHkgKHljLCBtYXRyaXgsIDQgKiBzaXplb2YgKGdpbnQpKTsgXAorICBtZW1jcHkgKHVjLCBtYXRyaXggKyA0LCA0ICogc2l6ZW9mIChnaW50KSk7IFwKKyAgbWVtY3B5ICh2YywgbWF0cml4ICsgOCwgNCAqIHNpemVvZiAoZ2ludCkpOyBcCisgIFwKKyAgd2hpbGUgKHNpemUgPiAwKSB7IFwKKyAgICB5ID0gKGRhdGFbUl0gKiB5Y1swXSArIGRhdGFbR10gKiB5Y1sxXSArIGRhdGFbQl0gKiB5Y1syXSArIHljWzNdKSA+PiA4OyBcCisgICAgdSA9IChkYXRhW1JdICogdWNbMF0gKyBkYXRhW0ddICogdWNbMV0gKyBkYXRhW0JdICogdWNbMl0gKyB1Y1szXSkgPj4gODsgXAorICAgIHYgPSAoZGF0YVtSXSAqIHZjWzBdICsgZGF0YVtHXSAqIHZjWzFdICsgZGF0YVtCXSAqIHZjWzJdICsgdmNbM10pID4+IDg7IFwKKyAgICBcCisgICAgZGF0YVswXSA9IGRhdGFbQV07IFwKKyAgICBkYXRhWzFdID0geTsgXAorICAgIGRhdGFbMl0gPSB1OyBcCisgICAgZGF0YVszXSA9IHY7IFwKKyAgICBcCisgICAgZGF0YSArPSA0OyBcCisgICAgc2l6ZSAtPSA0OyBcCisgIH0gXAorfSBcCitcCitzdGF0aWMgdm9pZCBcCit0cmFuc2Zvcm1fYXl1dl8jI25hbWUgKEdzdFZpZGVvRnJhbWUgKiBmcmFtZSwgY29uc3QgZ2ludCAqbWF0cml4KSBcCit7IFwKKyAgZ3VpbnQ4ICpkYXRhOyBcCisgIGdzaXplIHNpemU7IFwKKyAgZ2ludCByLCBnLCBiOyBcCisgIGdpbnQgcmNbNF07IFwKKyAgZ2ludCBnY1s0XTsgXAorICBnaW50IGJjWzRdOyBcCisgIFwKKyAgZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7XAorICBzaXplID0gR1NUX1ZJREVPX0ZSQU1FX1NJWkUgKGZyYW1lKTtcCisgIFwKKyAgbWVtY3B5IChyYywgbWF0cml4LCA0ICogc2l6ZW9mIChnaW50KSk7IFwKKyAgbWVtY3B5IChnYywgbWF0cml4ICsgNCwgNCAqIHNpemVvZiAoZ2ludCkpOyBcCisgIG1lbWNweSAoYmMsIG1hdHJpeCArIDgsIDQgKiBzaXplb2YgKGdpbnQpKTsgXAorICBcCisgIHdoaWxlIChzaXplID4gMCkgeyBcCisgICAgciA9IChkYXRhWzFdICogcmNbMF0gKyBkYXRhWzJdICogcmNbMV0gKyBkYXRhWzNdICogcmNbMl0gKyByY1szXSkgPj4gODsgXAorICAgIGcgPSAoZGF0YVsxXSAqIGdjWzBdICsgZGF0YVsyXSAqIGdjWzFdICsgZGF0YVszXSAqIGdjWzJdICsgZ2NbM10pID4+IDg7IFwKKyAgICBiID0gKGRhdGFbMV0gKiBiY1swXSArIGRhdGFbMl0gKiBiY1sxXSArIGRhdGFbM10gKiBiY1syXSArIGJjWzNdKSA+PiA4OyBcCisgICAgXAorICAgIGRhdGFbQV0gPSBkYXRhWzBdOyBcCisgICAgZGF0YVtSXSA9IENMQU1QIChyLCAwLCAyNTUpOyBcCisgICAgZGF0YVtHXSA9IENMQU1QIChnLCAwLCAyNTUpOyBcCisgICAgZGF0YVtCXSA9IENMQU1QIChiLCAwLCAyNTUpOyBcCisgICAgXAorICAgIGRhdGEgKz0gNDsgXAorICAgIHNpemUgLT0gNDsgXAorICB9IFwKK30KKworREVGSU5FX0FSR0JfQVlVVl9GVU5DVElPTlMgKHJnYmEsIDMsIDAsIDEsIDIpOworREVGSU5FX0FSR0JfQVlVVl9GVU5DVElPTlMgKGJncmEsIDMsIDIsIDEsIDApOworREVGSU5FX0FSR0JfQVlVVl9GVU5DVElPTlMgKGFyZ2IsIDAsIDEsIDIsIDMpOworREVGSU5FX0FSR0JfQVlVVl9GVU5DVElPTlMgKGFiZ3IsIDAsIDMsIDIsIDEpOworCitzdGF0aWMgdm9pZAordHJhbnNmb3JtX2F5dXZfYXl1diAoR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBjb25zdCBnaW50ICogbWF0cml4KQoreworICBndWludDggKmRhdGE7CisgIGdzaXplIHNpemU7CisgIGdpbnQgeSwgdSwgdjsKKyAgZ2ludCB5Y1s0XTsKKyAgZ2ludCB1Y1s0XTsKKyAgZ2ludCB2Y1s0XTsKKworICBpZiAobWF0cml4ID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGRhdGEgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZnJhbWUsIDApOworICBzaXplID0gR1NUX1ZJREVPX0ZSQU1FX1NJWkUgKGZyYW1lKTsKKworICBtZW1jcHkgKHljLCBtYXRyaXgsIDQgKiBzaXplb2YgKGdpbnQpKTsKKyAgbWVtY3B5ICh1YywgbWF0cml4ICsgNCwgNCAqIHNpemVvZiAoZ2ludCkpOworICBtZW1jcHkgKHZjLCBtYXRyaXggKyA4LCA0ICogc2l6ZW9mIChnaW50KSk7CisKKyAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgeSA9IChkYXRhWzFdICogeWNbMF0gKyBkYXRhWzJdICogeWNbMV0gKyBkYXRhWzNdICogeWNbMl0gKyB5Y1szXSkgPj4gODsKKyAgICB1ID0gKGRhdGFbMV0gKiB1Y1swXSArIGRhdGFbMl0gKiB1Y1sxXSArIGRhdGFbM10gKiB1Y1syXSArIHVjWzNdKSA+PiA4OworICAgIHYgPSAoZGF0YVsxXSAqIHZjWzBdICsgZGF0YVsyXSAqIHZjWzFdICsgZGF0YVszXSAqIHZjWzJdICsgdmNbM10pID4+IDg7CisKKyAgICBkYXRhWzFdID0geTsKKyAgICBkYXRhWzJdID0gdTsKKyAgICBkYXRhWzNdID0gdjsKKworICAgIGRhdGEgKz0gNDsKKyAgICBzaXplIC09IDQ7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RyYW5zZm9ybV9hcmdiX2JncmEgKEdzdFZpZGVvRnJhbWUgKiBmcmFtZSwgY29uc3QgZ2ludCAqIG1hdHJpeCkKK3sKKyAgZ3VpbnQ4ICpkYXRhOworICBnc2l6ZSBzaXplOworICBnaW50IHIsIGcsIGI7CisKKyAgZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7CisgIHNpemUgPSBHU1RfVklERU9fRlJBTUVfU0laRSAoZnJhbWUpOworCisgIHdoaWxlIChzaXplID4gMCkgeworICAgIHIgPSBkYXRhWzFdOworICAgIGcgPSBkYXRhWzJdOworICAgIGIgPSBkYXRhWzNdOworCisgICAgZGF0YVszXSA9IGRhdGFbMF07CisgICAgZGF0YVswXSA9IGI7CisgICAgZGF0YVsxXSA9IGc7CisgICAgZGF0YVsyXSA9IHI7CisKKyAgICBkYXRhICs9IDQ7CisgICAgc2l6ZSAtPSA0OworICB9Cit9CisKKyNkZWZpbmUgdHJhbnNmb3JtX2FiZ3JfcmdiYSB0cmFuc2Zvcm1fYXJnYl9iZ3JhCisKK3N0YXRpYyB2b2lkCit0cmFuc2Zvcm1fYXJnYl9hYmdyIChHc3RWaWRlb0ZyYW1lICogZnJhbWUsIGNvbnN0IGdpbnQgKiBtYXRyaXgpCit7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgc2l6ZTsKKyAgZ2ludCByLCBnLCBiOworCisgIGRhdGEgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZnJhbWUsIDApOworICBzaXplID0gR1NUX1ZJREVPX0ZSQU1FX1NJWkUgKGZyYW1lKTsKKworICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICByID0gZGF0YVsxXTsKKyAgICBnID0gZGF0YVsyXTsKKyAgICBiID0gZGF0YVszXTsKKworICAgIC8qIGRhdGFbMF0gPSBkYXRhWzBdOyAqLworICAgIGRhdGFbMV0gPSBiOworICAgIGRhdGFbMl0gPSBnOworICAgIGRhdGFbM10gPSByOworCisgICAgZGF0YSArPSA0OworICAgIHNpemUgLT0gNDsKKyAgfQorfQorCisjZGVmaW5lIHRyYW5zZm9ybV9hYmdyX2FyZ2IgdHJhbnNmb3JtX2FyZ2JfYWJncgorCitzdGF0aWMgdm9pZAordHJhbnNmb3JtX3JnYmFfYmdyYSAoR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBjb25zdCBnaW50ICogbWF0cml4KQoreworICBndWludDggKmRhdGE7CisgIGdzaXplIHNpemU7CisgIGdpbnQgciwgZywgYjsKKworICBkYXRhID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLCAwKTsKKyAgc2l6ZSA9IEdTVF9WSURFT19GUkFNRV9TSVpFIChmcmFtZSk7CisKKyAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgciA9IGRhdGFbMF07CisgICAgZyA9IGRhdGFbMV07CisgICAgYiA9IGRhdGFbMl07CisKKyAgICAvKiBkYXRhWzNdID0gZGF0YVszXSAqLyA7CisgICAgZGF0YVswXSA9IGI7CisgICAgZGF0YVsxXSA9IGc7CisgICAgZGF0YVsyXSA9IHI7CisKKyAgICBkYXRhICs9IDQ7CisgICAgc2l6ZSAtPSA0OworICB9Cit9CisKKyNkZWZpbmUgdHJhbnNmb3JtX2JncmFfcmdiYSB0cmFuc2Zvcm1fcmdiYV9iZ3JhCisKK3N0YXRpYyB2b2lkCit0cmFuc2Zvcm1fYXJnYl9yZ2JhIChHc3RWaWRlb0ZyYW1lICogZnJhbWUsIGNvbnN0IGdpbnQgKiBtYXRyaXgpCit7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgc2l6ZTsKKyAgZ2ludCByLCBnLCBiOworCisgIGRhdGEgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZnJhbWUsIDApOworICBzaXplID0gR1NUX1ZJREVPX0ZSQU1FX1NJWkUgKGZyYW1lKTsKKworICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICByID0gZGF0YVsxXTsKKyAgICBnID0gZGF0YVsyXTsKKyAgICBiID0gZGF0YVszXTsKKworICAgIGRhdGFbM10gPSBkYXRhWzBdOworICAgIGRhdGFbMF0gPSByOworICAgIGRhdGFbMV0gPSBnOworICAgIGRhdGFbMl0gPSBiOworCisgICAgZGF0YSArPSA0OworICAgIHNpemUgLT0gNDsKKyAgfQorfQorCisjZGVmaW5lIHRyYW5zZm9ybV9hYmdyX2JncmEgdHJhbnNmb3JtX2FyZ2JfcmdiYQorCitzdGF0aWMgdm9pZAordHJhbnNmb3JtX2JncmFfYXJnYiAoR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBjb25zdCBnaW50ICogbWF0cml4KQoreworICBndWludDggKmRhdGE7CisgIGdzaXplIHNpemU7CisgIGdpbnQgciwgZywgYjsKKworICBkYXRhID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLCAwKTsKKyAgc2l6ZSA9IEdTVF9WSURFT19GUkFNRV9TSVpFIChmcmFtZSk7CisKKyAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgciA9IGRhdGFbMl07CisgICAgZyA9IGRhdGFbMV07CisgICAgYiA9IGRhdGFbMF07CisKKyAgICBkYXRhWzBdID0gZGF0YVszXTsKKyAgICBkYXRhWzFdID0gcjsKKyAgICBkYXRhWzJdID0gZzsKKyAgICBkYXRhWzNdID0gYjsKKworICAgIGRhdGEgKz0gNDsKKyAgICBzaXplIC09IDQ7CisgIH0KK30KKworI2RlZmluZSB0cmFuc2Zvcm1fcmdiYV9hYmdyIHRyYW5zZm9ybV9iZ3JhX2FyZ2IKKworc3RhdGljIHZvaWQKK3RyYW5zZm9ybV9yZ2JhX2FyZ2IgKEdzdFZpZGVvRnJhbWUgKiBmcmFtZSwgY29uc3QgZ2ludCAqIG1hdHJpeCkKK3sKKyAgZ3VpbnQ4ICpkYXRhOworICBnc2l6ZSBzaXplOworICBnaW50IHIsIGcsIGI7CisKKyAgZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7CisgIHNpemUgPSBHU1RfVklERU9fRlJBTUVfU0laRSAoZnJhbWUpOworCisgIHdoaWxlIChzaXplID4gMCkgeworICAgIHIgPSBkYXRhWzBdOworICAgIGcgPSBkYXRhWzFdOworICAgIGIgPSBkYXRhWzJdOworCisgICAgZGF0YVswXSA9IGRhdGFbM107CisgICAgZGF0YVsxXSA9IHI7CisgICAgZGF0YVsyXSA9IGc7CisgICAgZGF0YVszXSA9IGI7CisKKyAgICBkYXRhICs9IDQ7CisgICAgc2l6ZSAtPSA0OworICB9Cit9CisKKyNkZWZpbmUgdHJhbnNmb3JtX2JncmFfYWJnciB0cmFuc2Zvcm1fcmdiYV9hcmdiCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FscGhhX2NvbG9yX3NldF9pbmZvIChHc3RWaWRlb0ZpbHRlciAqIGZpbHRlciwgR3N0Q2FwcyAqIGluY2FwcywKKyAgICBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLCBHc3RDYXBzICogb3V0Y2FwcywgR3N0VmlkZW9JbmZvICogb3V0X2luZm8pCit7CisgIEdzdEFscGhhQ29sb3IgKmFscGhhID0gR1NUX0FMUEhBX0NPTE9SIChmaWx0ZXIpOworICBnYm9vbGVhbiBpbl9zZHR2LCBvdXRfc2R0djsKKworICBhbHBoYS0+cHJvY2VzcyA9IE5VTEw7CisgIGFscGhhLT5tYXRyaXggPSBOVUxMOworCisgIGlmIChHU1RfVklERU9fSU5GT19XSURUSCAoaW5faW5mbykgIT0gR1NUX1ZJREVPX0lORk9fV0lEVEggKG91dF9pbmZvKSB8fAorICAgICAgR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbl9pbmZvKSAhPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKG91dF9pbmZvKSkKKyAgICBnb3RvIGludmFsaWRfY2FwczsKKworICBpbl9zZHR2ID0gaW5faW5mby0+Y29sb3JpbWV0cnkubWF0cml4ID09IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQ2MDE7CisgIG91dF9zZHR2ID0gb3V0X2luZm8tPmNvbG9yaW1ldHJ5Lm1hdHJpeCA9PSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUNjAxOworCisgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUIChpbl9pbmZvKSkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BUkdCOgorICAgICAgc3dpdGNoIChHU1RfVklERU9fSU5GT19GT1JNQVQgKG91dF9pbmZvKSkgeworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IE5VTEw7CisgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1JBOgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gdHJhbnNmb3JtX2FyZ2JfYmdyYTsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSB0cmFuc2Zvcm1fYXJnYl9hYmdyOworICAgICAgICAgIGFscGhhLT5tYXRyaXggPSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IHRyYW5zZm9ybV9hcmdiX3JnYmE7CisgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gdHJhbnNmb3JtX2FyZ2JfYXl1djsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0KKyAgICAgICAgICAgICAgb3V0X3NkdHYgPyBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgICAgICAgICBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X2hkdHY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSBOVUxMOworICAgICAgICAgIGFscGhhLT5tYXRyaXggPSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAob3V0X2luZm8pKSB7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1JBOgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gTlVMTDsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FSR0I6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSB0cmFuc2Zvcm1fYmdyYV9hcmdiOworICAgICAgICAgIGFscGhhLT5tYXRyaXggPSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQUJHUjoKKyAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IHRyYW5zZm9ybV9iZ3JhX2FiZ3I7CisgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gdHJhbnNmb3JtX2JncmFfcmdiYTsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FZVVY6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSB0cmFuc2Zvcm1fYmdyYV9heXV2OworICAgICAgICAgIGFscGhhLT5tYXRyaXggPQorICAgICAgICAgICAgICBvdXRfc2R0diA/IGNvZ19yZ2JfdG9feWNiY3JfbWF0cml4XzhiaXRfc2R0diA6CisgICAgICAgICAgICAgIGNvZ19yZ2JfdG9feWNiY3JfbWF0cml4XzhiaXRfaGR0djsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IE5VTEw7CisgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQUJHUjoKKyAgICAgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUIChvdXRfaW5mbykpIHsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSBOVUxMOworICAgICAgICAgIGFscGhhLT5tYXRyaXggPSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IHRyYW5zZm9ybV9hYmdyX3JnYmE7CisgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BUkdCOgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gdHJhbnNmb3JtX2FiZ3JfYXJnYjsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSB0cmFuc2Zvcm1fYWJncl9iZ3JhOworICAgICAgICAgIGFscGhhLT5tYXRyaXggPSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IHRyYW5zZm9ybV9hYmdyX2F5dXY7CisgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9CisgICAgICAgICAgICAgIG91dF9zZHR2ID8gY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9zZHR2IDoKKyAgICAgICAgICAgICAgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9oZHR2OworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gTlVMTDsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgc3dpdGNoIChHU1RfVklERU9fSU5GT19GT1JNQVQgKG91dF9pbmZvKSkgeworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IE5VTEw7CisgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BUkdCOgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gdHJhbnNmb3JtX3JnYmFfYXJnYjsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSB0cmFuc2Zvcm1fcmdiYV9hYmdyOworICAgICAgICAgIGFscGhhLT5tYXRyaXggPSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IHRyYW5zZm9ybV9yZ2JhX2JncmE7CisgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gdHJhbnNmb3JtX3JnYmFfYXl1djsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0KKyAgICAgICAgICAgICAgb3V0X3NkdHYgPyBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgICAgICAgICBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X2hkdHY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSBOVUxMOworICAgICAgICAgIGFscGhhLT5tYXRyaXggPSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FZVVY6CisgICAgICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAob3V0X2luZm8pKSB7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgICAgIGlmIChpbl9zZHR2ID09IG91dF9zZHR2KSB7CisgICAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IHRyYW5zZm9ybV9heXV2X2F5dXY7CisgICAgICAgICAgICBhbHBoYS0+bWF0cml4ID0gTlVMTDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSB0cmFuc2Zvcm1fYXl1dl9heXV2OworICAgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9CisgICAgICAgICAgICAgICAgb3V0X3NkdHYgPyBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0IDoKKyAgICAgICAgICAgICAgICBjb2dfeWNiY3Jfc2R0dl90b195Y2Jjcl9oZHR2X21hdHJpeF84Yml0OworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FSR0I6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSB0cmFuc2Zvcm1fYXl1dl9hcmdiOworICAgICAgICAgIGFscGhhLT5tYXRyaXggPQorICAgICAgICAgICAgICBpbl9zZHR2ID8gY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2IDoKKyAgICAgICAgICAgICAgY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9oZHR2OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgICAgICBhbHBoYS0+cHJvY2VzcyA9IHRyYW5zZm9ybV9heXV2X2JncmE7CisgICAgICAgICAgYWxwaGEtPm1hdHJpeCA9CisgICAgICAgICAgICAgIGluX3NkdHYgPyBjb2dfeWNiY3JfdG9fcmdiX21hdHJpeF84Yml0X3NkdHYgOgorICAgICAgICAgICAgICBjb2dfeWNiY3JfdG9fcmdiX21hdHJpeF84Yml0X2hkdHY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BQkdSOgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gdHJhbnNmb3JtX2F5dXZfYWJncjsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0KKyAgICAgICAgICAgICAgaW5fc2R0diA/IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfc2R0diA6CisgICAgICAgICAgICAgIGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfaGR0djsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQkE6CisgICAgICAgICAgYWxwaGEtPnByb2Nlc3MgPSB0cmFuc2Zvcm1fYXl1dl9yZ2JhOworICAgICAgICAgIGFscGhhLT5tYXRyaXggPQorICAgICAgICAgICAgICBpbl9zZHR2ID8gY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2IDoKKyAgICAgICAgICAgICAgY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9oZHR2OworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGFscGhhLT5wcm9jZXNzID0gTlVMTDsKKyAgICAgICAgICBhbHBoYS0+bWF0cml4ID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhbHBoYS0+cHJvY2VzcyA9IE5VTEw7CisgICAgICBhbHBoYS0+bWF0cml4ID0gTlVMTDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoaW5faW5mbykgPT0gR1NUX1ZJREVPX0lORk9fRk9STUFUIChvdXRfaW5mbykKKyAgICAgICYmIGluX3NkdHYgPT0gb3V0X3NkdHYpCisgICAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAoR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpLCBUUlVFKTsKKyAgZWxzZSBpZiAoIWFscGhhLT5wcm9jZXNzKQorICAgIGdvdG8gbm9fcHJvY2VzczsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfY2FwczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFscGhhLCAiaW5jb21wbGV0ZSBvciBpbnZhbGlkIGNhcHMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX3Byb2Nlc3M6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhbHBoYSwgImNvdWxkIG5vdCBmaW5kIHByb2Nlc3MgZnVuY3Rpb24iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hbHBoYV9jb2xvcl90cmFuc2Zvcm1fZnJhbWVfaXAgKEdzdFZpZGVvRmlsdGVyICogZmlsdGVyLAorICAgIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0QWxwaGFDb2xvciAqYWxwaGEgPSBHU1RfQUxQSEFfQ09MT1IgKGZpbHRlcik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFhbHBoYS0+cHJvY2VzcykpCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICAvKiBUcmFuc2Zvcm0gaW4gcGxhY2UgKi8KKyAgYWxwaGEtPnByb2Nlc3MgKGZyYW1lLCBhbHBoYS0+bWF0cml4KTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCitub3RfbmVnb3RpYXRlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGFscGhhLCAiTm90IG5lZ290aWF0ZWQgeWV0Iik7CisgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJhbHBoYWNvbG9yIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIEdTVF9UWVBFX0FMUEhBX0NPTE9SKTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGFscGhhY29sb3IsCisgICAgIlJHQkEgZnJvbS90byBBWVVWIGNvbG9yc3BhY2UgY29udmVyc2lvbiBwcmVzZXJ2aW5nIHRoZSBhbHBoYSBjaGFubmVsIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC9hbHBoYS9nc3RhbHBoYWNvbG9yLmggYi9nc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MGY2MjEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYWxwaGEvZ3N0YWxwaGFjb2xvci5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qIEdTdHJlYW1lciBhbHBoYWNvbG9yIGVsZW1lbnQKKyAqIENvcHlyaWdodCAoQykgMjAwNSBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0dTVF9BTFBIQV9DT0xPUl9IXworI2RlZmluZSBfR1NUX0FMUEhBX0NPTE9SX0hfCisKKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9maWx0ZXIuaD4KKworI2RlZmluZSBHU1RfVFlQRV9BTFBIQV9DT0xPUiBcCisgIChnc3RfYWxwaGFfY29sb3JfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0FMUEhBX0NPTE9SKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQUxQSEFfQ09MT1IsR3N0QWxwaGFDb2xvcikpCisjZGVmaW5lIEdTVF9BTFBIQV9DT0xPUl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9BTFBIQV9DT0xPUixHc3RBbHBoYUNvbG9yQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQUxQSEFfQ09MT1Iob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9BTFBIQV9DT0xPUikpCisjZGVmaW5lIEdTVF9JU19BTFBIQV9DT0xPUl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9BTFBIQV9DT0xPUikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBbHBoYUNvbG9yIEdzdEFscGhhQ29sb3I7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QWxwaGFDb2xvckNsYXNzIEdzdEFscGhhQ29sb3JDbGFzczsKKworc3RydWN0IF9Hc3RBbHBoYUNvbG9yCit7CisgIEdzdFZpZGVvRmlsdGVyIHBhcmVudDsKKworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgdm9pZCAoKnByb2Nlc3MpIChHc3RWaWRlb0ZyYW1lICogZnJhbWUsIGNvbnN0IGdpbnQgKiBtYXRyaXgpOworCisgIGNvbnN0IGdpbnQgKm1hdHJpeDsKK307CisKK3N0cnVjdCBfR3N0QWxwaGFDb2xvckNsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2FscGhhX2NvbG9yX2dldF90eXBlICh2b2lkKTsKKworI2VuZGlmIC8qIF9HU1RfQUxQSEFfQ09MT1JfSF8gKi8KZGlmZiAtLWdpdCBhL2dzdC9hbHBoYS9tZXNvbi5idWlsZCBiL2dzdC9hbHBoYS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjU1MjVlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2FscGhhL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTUgQEAKK2dzdGFscGhhID0gbGlicmFyeSgnZ3N0YWxwaGEnLCAnZ3N0YWxwaGEuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0dmlkZW9fZGVwLCBnc3RfZGVwLCBsaWJtXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKKworZ3N0YWxwaGFjb2xvciA9IGxpYnJhcnkoJ2dzdGFscGhhY29sb3InLCAnZ3N0YWxwaGFjb2xvci5jJywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3R2aWRlb19kZXAsIGdzdF9kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L2FwZXRhZy9NYWtlZmlsZS5hbSBiL2dzdC9hcGV0YWcvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhZWNmNQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hcGV0YWcvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0YXBldGFnLmxhCisKK2xpYmdzdGFwZXRhZ19sYV9TT1VSQ0VTID0gZ3N0YXBlZGVtdXguYworbGliZ3N0YXBldGFnX2xhX0NGTEFHUyA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9DRkxBR1MpCitsaWJnc3RhcGV0YWdfbGFfTElCQUREID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHRhZy1AR1NUX0FQSV9WRVJTSU9OQCBcCisJLWxnc3RwYnV0aWxzLUBHU1RfQVBJX1ZFUlNJT05AXAorCSQoR1NUX0JBU0VfTElCUykgXAorCSQoR1NUX0xJQlMpCitsaWJnc3RhcGV0YWdfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdGFwZWRlbXV4LmgKZGlmZiAtLWdpdCBhL2dzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYyBiL2dzdC9hcGV0YWcvZ3N0YXBlZGVtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2U2Mjg5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2FwZXRhZy9nc3RhcGVkZW11eC5jCkBAIC0wLDAgKzEsNDQ1IEBACisvKiBHU3RyZWFtZXIgQVBFdjEvMiB0YWcgcmVhZGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXBlZGVtdXgKKyAqCisgKiBhcGVkZW11eCBhY2NlcHRzIGRhdGEgc3RyZWFtcyB3aXRoIEFQRSB0YWdzIGF0IHRoZSBzdGFydCBvciBhdCB0aGUgZW5kCisgKiAob3IgYm90aCkuIFRoZSBtaW1lIHR5cGUgb2YgdGhlIGRhdGEgYmV0d2VlbiB0aGUgdGFnIGJsb2NrcyBpcyBkZXRlY3RlZAorICogdXNpbmcgdHlwZWZpbmQgZnVuY3Rpb25zLCBhbmQgdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBtaW1lIHR5cGUgc2V0IG9uCisgKiBvdXRnb2luZyBidWZmZXJzLgorICoKKyAqIFRoZSBlbGVtZW50IGlzIG9ubHkgYWJsZSB0byByZWFkIEFQRSB0YWdzIGF0IHRoZSBlbmQgb2YgYSBzdHJlYW0gZnJvbQorICogYSBzZWVrYWJsZSBzdHJlYW0sIGllLiB3aGVuIGdldF9yYW5nZSBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgdXBzdHJlYW0KKyAqIGVsZW1lbnRzLiBJZiBnZXRfcmFuZ2Ugb3BlcmF0aW9uIGlzIGF2YWlsYWJsZSwgYXBlZGVtdXggbWFrZXMgaXQgYXZhaWxhYmxlCisgKiBkb3duc3RyZWFtLiBUaGlzIG1lYW5zIHRoYXQgZWxlbWVudHMgd2hpY2ggcmVxdWlyZSBnZXRfcmFuZ2UgbW9kZSwgc3VjaCBhcworICogd2F2cGFyc2Ugb3IgbXVzZXBhY2tkZWMsIGNhbiBvcGVyYXRlIG9uIGZpbGVzIGNvbnRhaW5pbmcgQVBFIHRhZworICogaW5mb3JtYXRpb24uCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC10IGZpbGVzcmMgbG9jYXRpb249ZmlsZS5tcGMgISBhcGVkZW11eCAhIGZha2VzaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIHNob3VsZCByZWFkIGFueSBhdmFpbGFibGUgQVBFIHRhZyBpbmZvcm1hdGlvbiBhbmQgb3V0cHV0IGl0LgorICogVGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGluc2lkZSB0aGUgQVBFIHRhZyByZWdpb25zIHNob3VsZCBiZSBkZXRlY3RlZCwgYW5kCisgKiB0aGUgYXBwcm9wcmlhdGUgbWltZSB0eXBlIHNldCBvbiBidWZmZXJzIHByb2R1Y2VkIGZyb20gYXBlZGVtdXguCisgKiA8L3JlZnNlY3QyPgorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2dzdC1pMThuLXBsdWdpbi5oPgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL3BidXRpbHMuaD4KKworI2luY2x1ZGUgImdzdGFwZWRlbXV4LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIEFQRV9WRVJTSU9OX01BSk9SKHZlcikgICgodmVyKS8xMDAwKQorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChhcGVkZW11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAoYXBlZGVtdXhfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LWFwZXRhZyIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hcGVfZGVtdXhfaWRlbnRpZnlfdGFnIChHc3RUYWdEZW11eCAqIGRlbXV4LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlciwgZ2Jvb2xlYW4gc3RhcnRfdGFnLCBndWludCAqIHRhZ19zaXplKTsKK3N0YXRpYyBHc3RUYWdEZW11eFJlc3VsdCBnc3RfYXBlX2RlbXV4X3BhcnNlX3RhZyAoR3N0VGFnRGVtdXggKiBkZW11eCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIsIGdib29sZWFuIHN0YXJ0X3RhZywgZ3VpbnQgKiB0YWdfc2l6ZSwKKyAgICBHc3RUYWdMaXN0ICoqIHRhZ3MpOworCitHX0RFRklORV9UWVBFIChHc3RBcGVEZW11eCwgZ3N0X2FwZV9kZW11eCwgR1NUX1RZUEVfVEFHX0RFTVVYKTsKKworc3RhdGljIHZvaWQKK2dzdF9hcGVfZGVtdXhfY2xhc3NfaW5pdCAoR3N0QXBlRGVtdXhDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisgIEdzdFRhZ0RlbXV4Q2xhc3MgKnRhZ2RlbXV4X2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChhcGVkZW11eF9kZWJ1ZywgImFwZWRlbXV4IiwgMCwKKyAgICAgICJHU3RyZWFtZXIgQVBFIHRhZyBkZW11eGVyIik7CisKKyAgdGFnZGVtdXhfY2xhc3MgPSBHU1RfVEFHX0RFTVVYX0NMQVNTIChrbGFzcyk7CisgIGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJBUEUgdGFnIGRlbXV4ZXIiLAorICAgICAgIkNvZGVjL0RlbXV4ZXIvTWV0YWRhdGEiLAorICAgICAgIlJlYWQgYW5kIG91dHB1dCBBUEUgdGFncyB3aGlsZSBkZW11eGluZyB0aGUgY29udGVudHMiLAorICAgICAgIlRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzaW5rX2ZhY3RvcnkpOworCisgIHRhZ2RlbXV4X2NsYXNzLT5pZGVudGlmeV90YWcgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FwZV9kZW11eF9pZGVudGlmeV90YWcpOworICB0YWdkZW11eF9jbGFzcy0+cGFyc2VfdGFnID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hcGVfZGVtdXhfcGFyc2VfdGFnKTsKKworICAvKiBubyBuZWVkIGZvciBhIG1lcmdlIGZ1bmN0aW9uLCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgdG8gcHJlZmVyIHN0YXJ0CisgICAqIHRhZ3MgKEFQRXYyKSBvdmVyIGVuZCB0YWdzICh1c3VhbGx5IEFQRXYxLCBidXQgY291bGQgdGhlb3JldGljYWxseSBhbHNvCisgICAqIGJlIEFQRXYyKSBpcyBmaW5lICovCisKKyAgdGFnZGVtdXhfY2xhc3MtPm1pbl9zdGFydF9zaXplID0gMzI7CisgIHRhZ2RlbXV4X2NsYXNzLT5taW5fZW5kX3NpemUgPSAzMjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hcGVfZGVtdXhfaW5pdCAoR3N0QXBlRGVtdXggKiBhcGVkZW11eCkKK3sKKyAgLyogbm90aGluZyB0byBkbyBoZXJlICovCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgX0dzdEFwZURlbXV4VGFnVGFibGVFbnRyeQoreworICBjb25zdCBnY2hhciAqYXBlX3RhZzsKKyAgY29uc3QgZ2NoYXIgKmdzdF90YWc7Cit9IHRhZ190YWJsZVtdID0geworICB7CisgICJyZXBsYXlnYWluX3RyYWNrX2dhaW4iLCBHU1RfVEFHX1RSQUNLX0dBSU59LCB7CisgICJyZXBsYXlnYWluX3RyYWNrX3BlYWsiLCBHU1RfVEFHX1RSQUNLX1BFQUt9LCB7CisgICJyZXBsYXlnYWluX2FsYnVtX2dhaW4iLCBHU1RfVEFHX0FMQlVNX0dBSU59LCB7CisgICJyZXBsYXlnYWluX2FsYnVtX3BlYWsiLCBHU1RfVEFHX0FMQlVNX1BFQUt9LCB7CisgICJ0aXRsZSIsIEdTVF9UQUdfVElUTEV9LCB7CisgICJhcnRpc3QiLCBHU1RfVEFHX0FSVElTVH0sIHsKKyAgImFsYnVtIiwgR1NUX1RBR19BTEJVTX0sIHsKKyAgImNvbXBvc2VyIiwgR1NUX1RBR19DT01QT1NFUn0sIHsKKyAgImNvbW1lbnQiLCBHU1RfVEFHX0NPTU1FTlR9LCB7CisgICJjb21tZW50cyIsIEdTVF9UQUdfQ09NTUVOVH0sIHsKKyAgImNvcHlyaWdodCIsIEdTVF9UQUdfQ09QWVJJR0hUfSwgeworICAiZ2VucmUiLCBHU1RfVEFHX0dFTlJFfSwgeworICAiaXNyYyIsIEdTVF9UQUdfSVNSQ30sIHsKKyAgImRpc2MiLCBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9OVU1CRVJ9LCB7CisgICJkaXNrIiwgR1NUX1RBR19BTEJVTV9WT0xVTUVfTlVNQkVSfSwgeworICAiZGlzY251bWJlciIsIEdTVF9UQUdfQUxCVU1fVk9MVU1FX05VTUJFUn0sIHsKKyAgImRpc2tudW1iZXIiLCBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9OVU1CRVJ9LCB7CisgICJ0cmFjayIsIEdTVF9UQUdfVFJBQ0tfTlVNQkVSfSwgeworICAidHJhY2tudW1iZXIiLCBHU1RfVEFHX1RSQUNLX05VTUJFUn0sIHsKKyAgInllYXIiLCBHU1RfVEFHX0RBVEV9LCB7CisgICJmaWxlIiwgR1NUX1RBR19MT0NBVElPTn0KK307CisKK3N0YXRpYyBnYm9vbGVhbgorYXBlX2RlbXV4X2dldF9nc3RfdGFnX2Zyb21fdGFnIChjb25zdCBnY2hhciAqIGFwZV90YWcsCisgICAgY29uc3QgZ2NoYXIgKiogZ3N0X3RhZywgR1R5cGUgKiBnc3RfdGFnX3R5cGUpCit7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTICh0YWdfdGFibGUpOyArK2kpIHsKKyAgICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wICh0YWdfdGFibGVbaV0uYXBlX3RhZywgYXBlX3RhZykgPT0gMCkgeworICAgICAgKmdzdF90YWcgPSB0YWdfdGFibGVbaV0uZ3N0X3RhZzsKKyAgICAgICpnc3RfdGFnX3R5cGUgPSBnc3RfdGFnX2dldF90eXBlICh0YWdfdGFibGVbaV0uZ3N0X3RhZyk7CisgICAgICBHU1RfTE9HICgiTWFwcGVkIEFQRSB0YWcgJyVzJyB0byBHU3RyZWFtZXIgdGFnICclcyciLCBhcGVfdGFnLCAqZ3N0X3RhZyk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKworICBHU1RfV0FSTklORyAoIkNvdWxkIG5vdCBtYXAgQVBFIHRhZyAnJXMnIHRvIGEgR1N0cmVhbWVyIHRhZyIsIGFwZV90YWcpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBHc3RUYWdMaXN0ICoKK2FwZV9kZW11eF9wYXJzZV90YWdzIChjb25zdCBndWludDggKiBkYXRhLCBnaW50IHNpemUpCit7CisgIEdzdFRhZ0xpc3QgKnRhZ2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgIEdTVF9MT0cgKCJSZWFkaW5nIHRhZ3MgZnJvbSBjaHVuayBvZiBzaXplICV1IGJ5dGVzIiwgc2l6ZSk7CisKKyAgLyogZ2V0IHJpZCBvZiBoZWFkZXIvZm9vdGVyICovCisgIGlmIChzaXplID49IDMyICYmIG1lbWNtcCAoZGF0YSwgIkFQRVRBR0VYIiwgOCkgPT0gMCkgeworICAgIGRhdGEgKz0gMzI7CisgICAgc2l6ZSAtPSAzMjsKKyAgfQorICBpZiAoc2l6ZSA+IDMyICYmIG1lbWNtcCAoZGF0YSArIHNpemUgLSAzMiwgIkFQRVRBR0VYIiwgOCkgPT0gMCkgeworICAgIHNpemUgLT0gMzI7CisgIH0KKworICAvKiByZWFkIGFjdHVhbCB0YWdzIC0gYXQgbGVhc3QgMTAgYnl0ZXMgZm9yIHRhZyBoZWFkZXIgKi8KKyAgd2hpbGUgKHNpemUgPj0gMTApIHsKKyAgICBndWludCBsZW4sIG4gPSA4OworICAgIGdjaGFyICp0YWcsICp2YWw7CisgICAgY29uc3QgZ2NoYXIgKmdzdF90YWc7CisgICAgR1R5cGUgZ3N0X3RhZ190eXBlOworCisgICAgLyogZmluZCB0YWcgdHlwZSBhbmQgc2l6ZSAqLworICAgIGxlbiA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSk7CisgICAgd2hpbGUgKG4gPCBzaXplICYmIGRhdGFbbl0gIT0gMHgwKQorICAgICAgbisrOworICAgIGlmIChuID09IHNpemUpCisgICAgICBicmVhazsKKyAgICBnX2Fzc2VydCAoZGF0YVtuXSA9PSAweDApOworICAgIG4rKzsKKyAgICBpZiAoc2l6ZSAtIG4gPCBsZW4pCisgICAgICBicmVhazsKKworICAgIC8qIElmIHRoZSB0YWcgaXMgZW1wdHksIHNraXAgdG8gdGhlIG5leHQgb25lICovCisgICAgaWYgKGxlbiA9PSAwKQorICAgICAgZ290byBuZXh0X3RhZzsKKworICAgIC8qIHJlYWQgKi8KKyAgICB0YWcgPSBnX3N0cm5kdXAgKChnY2hhciAqKSBkYXRhICsgOCwgbiAtIDkpOworICAgIHZhbCA9IGdfc3RybmR1cCAoKGdjaGFyICopIGRhdGEgKyBuLCBsZW4pOworCisgICAgR1NUX0xPRyAoInRhZyBbJXNdLCB2YWxbJXNdIiwgdGFnLCB2YWwpOworCisgICAgLyogc3BlY2lhbC1jYXNlICdtZWRpYScgdGFnLCBjb3VsZCBiZSBlLmcuICJDRCAxLzIiICovCisgICAgaWYgKGdfYXNjaWlfc3RyY2FzZWNtcCAodGFnLCAibWVkaWEiKSA9PSAwKSB7CisgICAgICBnY2hhciAqc3AsICpzcDI7CisKKyAgICAgIGdfZnJlZSAodGFnKTsKKyAgICAgIHRhZyA9IGdfc3RyZHVwICgiZGlzY251bWJlciIpOworICAgICAgLyogZ2V0IHJpZCBvZiB0aGUgbWVkaXVtIGluIGZyb250ICovCisgICAgICBzcCA9IHN0cmNociAodmFsLCAnICcpOworICAgICAgd2hpbGUgKHNwICE9IE5VTEwgJiYgKHNwMiA9IHN0cmNociAoc3AgKyAxLCAnICcpKSAhPSBOVUxMKQorICAgICAgICBzcCA9IHNwMjsKKyAgICAgIGlmIChzcCkgeworICAgICAgICBtZW1tb3ZlICh2YWwsIHNwICsgMSwgc3RybGVuIChzcCArIDEpICsgMSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGFwZV9kZW11eF9nZXRfZ3N0X3RhZ19mcm9tX3RhZyAodGFnLCAmZ3N0X3RhZywgJmdzdF90YWdfdHlwZSkpIHsKKyAgICAgIEdWYWx1ZSB2ID0geyAwLCB9OworCisgICAgICBzd2l0Y2ggKGdzdF90YWdfdHlwZSkgeworICAgICAgICBjYXNlIEdfVFlQRV9JTlQ6eworICAgICAgICAgIGdpbnQgdl9pbnQ7CisKKyAgICAgICAgICBpZiAoc3NjYW5mICh2YWwsICIlZCIsICZ2X2ludCkgPT0gMSkgeworICAgICAgICAgICAgZ192YWx1ZV9pbml0ICgmdiwgR19UWVBFX0lOVCk7CisgICAgICAgICAgICBnX3ZhbHVlX3NldF9pbnQgKCZ2LCB2X2ludCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgR19UWVBFX1VJTlQ6eworICAgICAgICAgIGd1aW50IHZfdWludCwgY291bnQ7CisKKyAgICAgICAgICBpZiAoc3RyY21wIChnc3RfdGFnLCBHU1RfVEFHX1RSQUNLX05VTUJFUikgPT0gMCkgeworICAgICAgICAgICAgZ2ludCBkdW1teTsKKworICAgICAgICAgICAgaWYgKHNzY2FuZiAodmFsLCAiJXUiLCAmdl91aW50KSA9PSAxICYmIHZfdWludCA+IDApIHsKKyAgICAgICAgICAgICAgZ192YWx1ZV9pbml0ICgmdiwgR19UWVBFX1VJTlQpOworICAgICAgICAgICAgICBnX3ZhbHVlX3NldF91aW50ICgmdiwgdl91aW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEdTVF9MT0cgKCJjaGVja2luZyBmb3IgdHJhY2sgY291bnQ6ICVzIiwgdmFsKTsKKyAgICAgICAgICAgIC8qIG1pZ2h0IGJlIDAvTiBvciAtMS9OIHRvIHNwZWNpZnkgdGhhdCB0aGVyZSBpcyBvbmx5IGEgY291bnQgKi8KKyAgICAgICAgICAgIGlmIChzc2NhbmYgKHZhbCwgIiVkLyV1IiwgJmR1bW15LCAmY291bnQpID09IDIgJiYgY291bnQgPiAwKSB7CisgICAgICAgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgICAgICAgICAgICAgR1NUX1RBR19UUkFDS19DT1VOVCwgY291bnQsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wIChnc3RfdGFnLCBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9OVU1CRVIpID09IDApIHsKKyAgICAgICAgICAgIGdpbnQgZHVtbXk7CisKKyAgICAgICAgICAgIGlmIChzc2NhbmYgKHZhbCwgIiV1IiwgJnZfdWludCkgPT0gMSAmJiB2X3VpbnQgPiAwKSB7CisgICAgICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnYsIEdfVFlQRV9VSU5UKTsKKyAgICAgICAgICAgICAgZ192YWx1ZV9zZXRfdWludCAoJnYsIHZfdWludCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBHU1RfTE9HICgiY2hlY2tpbmcgZm9yIHZvbHVtZSBjb3VudDogJXMiLCB2YWwpOworICAgICAgICAgICAgLyogbWlnaHQgYmUgMC9OIG9yIC0xL04gdG8gc3BlY2lmeSB0aGF0IHRoZXJlIGlzIG9ubHkgYSBjb3VudCAqLworICAgICAgICAgICAgaWYgKHNzY2FuZiAodmFsLCAiJWQvJXUiLCAmZHVtbXksICZjb3VudCkgPT0gMiAmJiBjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFnbGlzdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsCisgICAgICAgICAgICAgICAgICBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9DT1VOVCwgY291bnQsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAoc3NjYW5mICh2YWwsICIldSIsICZ2X3VpbnQpID09IDEpIHsKKyAgICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnYsIEdfVFlQRV9VSU5UKTsKKyAgICAgICAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKCZ2LCB2X3VpbnQpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEdfVFlQRV9TVFJJTkc6eworICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnYsIEdfVFlQRV9TVFJJTkcpOworICAgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJnYsIHZhbCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHX1RZUEVfRE9VQkxFOnsKKyAgICAgICAgICBnZG91YmxlIHZfZG91YmxlOworICAgICAgICAgIGdjaGFyICplbmRwdHI7CisKKyAgICAgICAgICAvKiBmbG9hdGluZyBwb2ludCBzdHJpbmdzIGNhbiBiZSAiNCwxMjMiIG9yICI0LjEyMyIgZGVwZW5kaW5nIG9uCisgICAgICAgICAgICogdGhlIGxvY2FsZS4gV2UgbmVlZCB0byBiZSBhYmxlIHRvIHBhcnNlIGFuZCByZWFkIGVpdGhlciB2ZXJzaW9uCisgICAgICAgICAgICogbm8gbWF0dGVyIHdoYXQgb3VyIGN1cnJlbnQgbG9jYWxlIGlzICovCisgICAgICAgICAgZ19zdHJkZWxpbWl0ICh2YWwsICIsIiwgJy4nKTsKKyAgICAgICAgICB2X2RvdWJsZSA9IGdfYXNjaWlfc3RydG9kICh2YWwsICZlbmRwdHIpOworICAgICAgICAgIGlmIChlbmRwdHIgIT0gdmFsKSB7CisgICAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZ2LCBHX1RZUEVfRE9VQkxFKTsKKyAgICAgICAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIHZfZG91YmxlKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OnsKKyAgICAgICAgICBpZiAoZ3N0X3RhZ190eXBlID09IEdfVFlQRV9EQVRFKSB7CisgICAgICAgICAgICBnaW50IHZfaW50OworCisgICAgICAgICAgICBpZiAoc3NjYW5mICh2YWwsICIlZCIsICZ2X2ludCkgPT0gMSkgeworICAgICAgICAgICAgICBHRGF0ZSAqZGF0ZSA9IGdfZGF0ZV9uZXdfZG15ICgxLCAxLCB2X2ludCk7CisKKyAgICAgICAgICAgICAgZ192YWx1ZV9pbml0ICgmdiwgR19UWVBFX0RBVEUpOworICAgICAgICAgICAgICBnX3ZhbHVlX3Rha2VfYm94ZWQgKCZ2LCBkYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR1NUX1dBUk5JTkcgKCJVbmhhbmRsZWQgdGFnIHR5cGUgJyVzJyBmb3IgdGFnICclcyciLAorICAgICAgICAgICAgICAgIGdfdHlwZV9uYW1lIChnc3RfdGFnX3R5cGUpLCBnc3RfdGFnKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChHX1ZBTFVFX1RZUEUgKCZ2KSAhPSAwKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGRfdmFsdWVzICh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgICAgIGdzdF90YWcsICZ2LCBOVUxMKTsKKyAgICAgICAgZ192YWx1ZV91bnNldCAoJnYpOworICAgICAgfQorICAgIH0KKyAgICBHU1RfREVCVUcgKCJSZWFkIHRhZyAlczogJXMiLCB0YWcsIHZhbCk7CisgICAgZ19mcmVlICh0YWcpOworICAgIGdfZnJlZSAodmFsKTsKKworICAgIC8qIG1vdmUgZGF0YSBwb2ludGVyICovCisgIG5leHRfdGFnOgorICAgIHNpemUgLT0gbGVuICsgbjsKKyAgICBkYXRhICs9IGxlbiArIG47CisgIH0KKworICBHU1RfREVCVUcgKCJUYWdsaXN0OiAlIiBHU1RfUFRSX0ZPUk1BVCwgdGFnbGlzdCk7CisgIHJldHVybiB0YWdsaXN0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hcGVfZGVtdXhfaWRlbnRpZnlfdGFnIChHc3RUYWdEZW11eCAqIGRlbXV4LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgZ2Jvb2xlYW4gc3RhcnRfdGFnLCBndWludCAqIHRhZ19zaXplKQoreworICBHc3RNYXBJbmZvIG1hcDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIGlmIChtZW1jbXAgKG1hcC5kYXRhLCAiQVBFVEFHRVgiLCA4KSAhPSAwKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJObyBBUEVUQUdFWCBtYXJrZXIgYXQgJXMgLSBub3QgYW4gQVBFIGZpbGUiLAorICAgICAgICAoc3RhcnRfdGFnKSA/ICJzdGFydCIgOiAiZW5kIik7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAqdGFnX3NpemUgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKG1hcC5kYXRhICsgMTIpOworCisgIC8qIHNpemUgaXMgd2l0aG91dCBoZWFkZXIsIHNvIGFkZCAzMiB0byBhY2NvdW50IGZvciB0aGF0ICovCisgICp0YWdfc2l6ZSArPSAzMjsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0VGFnRGVtdXhSZXN1bHQKK2dzdF9hcGVfZGVtdXhfcGFyc2VfdGFnIChHc3RUYWdEZW11eCAqIGRlbXV4LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgZ2Jvb2xlYW4gc3RhcnRfdGFnLCBndWludCAqIHRhZ19zaXplLCBHc3RUYWdMaXN0ICoqIHRhZ3MpCit7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQ4ICpmb290ZXI7CisgIGdib29sZWFuIGhhdmVfaGVhZGVyOworICBnYm9vbGVhbiBlbmRfdGFnID0gIXN0YXJ0X3RhZzsKKyAgR3N0Q2FwcyAqc2lua19jYXBzOworICBndWludCB2ZXJzaW9uLCBmb290ZXJfc2l6ZTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdzaXplIHNpemU7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBzaXplID0gbWFwLnNpemU7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiUGFyc2luZyBidWZmZXIgb2Ygc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCwgc2l6ZSk7CisKKyAgZm9vdGVyID0gZGF0YSArIHNpemUgLSAzMjsKKworICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJDaGVja2luZyBmb3IgZm9vdGVyIGF0IG9mZnNldCAweCUwNHgiLAorICAgICAgKGd1aW50KSAoZm9vdGVyIC0gZGF0YSkpOworICBpZiAoZm9vdGVyID4gZGF0YSAmJiBtZW1jbXAgKGZvb3RlciwgIkFQRVRBR0VYIiwgOCkgPT0gMCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiRm91bmQgZm9vdGVyIik7CisgICAgZm9vdGVyX3NpemUgPSAzMjsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIk5vIGZvb3RlciIpOworICAgIGZvb3Rlcl9zaXplID0gMDsKKyAgfQorCisgIC8qIEFQRSB0YWdzIGF0IHRoZSBlbmQgbXVzdCBoYXZlIGEgZm9vdGVyICovCisgIGlmIChlbmRfdGFnICYmIGZvb3Rlcl9zaXplID09IDApIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiVGFnIGF0IGVuZCBvZiBmaWxlIHdpdGhvdXQgZm9vdGVyISIpOworICAgIHJldHVybiBHU1RfVEFHX0RFTVVYX1JFU1VMVF9CUk9LRU5fVEFHOworICB9CisKKyAgLyogZG9uJ3QgdHJ1c3QgdGhlIGhlYWRlci9mb290ZXIgZmxhZ3MsIGJldHRlciBkZXRlY3QgdGhlbSBvdXJzZWx2ZXMgKi8KKyAgaGF2ZV9oZWFkZXIgPSAobWVtY21wIChkYXRhLCAiQVBFVEFHRVgiLCA4KSA9PSAwKTsKKworICBpZiAoc3RhcnRfdGFnICYmICFoYXZlX2hlYWRlcikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVGFnIGF0IGJlZ2lubmluZyBvZiBmaWxlIHdpdGhvdXQgaGVhZGVyISIpOworICAgIHJldHVybiBHU1RfVEFHX0RFTVVYX1JFU1VMVF9CUk9LRU5fVEFHOworICB9CisKKyAgaWYgKGVuZF90YWcgJiYgIWhhdmVfaGVhZGVyKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJUYWcgYXQgZW5kIG9mIGZpbGUgaGFzIG5vIGhlYWRlciAoQVBFdjEpIik7CisgICAgKnRhZ19zaXplIC09IDMyOyAgICAgICAgICAgIC8qIGFkanVzdCB0YWcgc2l6ZSAqLworICB9CisKKyAgaWYgKGhhdmVfaGVhZGVyKSB7CisgICAgdmVyc2lvbiA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDgpOworICB9IGVsc2UgeworICAgIHZlcnNpb24gPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGZvb3RlciArIDgpOworICB9CisKKyAgLyogc2tpcCBoZWFkZXIgKi8KKyAgaWYgKGhhdmVfaGVhZGVyKSB7CisgICAgZGF0YSArPSAzMjsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiQVBFIHRhZyB3aXRoIHZlcnNpb24gJXUsIHNpemUgJXUgYXQgb2Zmc2V0IDB4JTA4IgorICAgICAgR19HSU5UNjRfTU9ESUZJRVIgIngiLCB2ZXJzaW9uLCAqdGFnX3NpemUsCisgICAgICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSArICgoaGF2ZV9oZWFkZXIpID8gMCA6IDMyKSk7CisKKyAgaWYgKEFQRV9WRVJTSU9OX01BSk9SICh2ZXJzaW9uKSAhPSAxICYmIEFQRV9WRVJTSU9OX01BSk9SICh2ZXJzaW9uKSAhPSAyKSB7CisgICAgR1NUX1dBUk5JTkcgKCJBUEUgdGFnIGlzIHZlcnNpb24gJXUuJTAzdSwgYnV0IGRlY29kZXIgb25seSBzdXBwb3J0cyAiCisgICAgICAgICJ2MSBvciB2Mi4gSWdub3JpbmcuIiwgQVBFX1ZFUlNJT05fTUFKT1IgKHZlcnNpb24pLCB2ZXJzaW9uICUgMTAwMCk7CisgICAgcmV0dXJuIEdTVF9UQUdfREVNVVhfUkVTVUxUX09LOworICB9CisKKyAgKnRhZ3MgPSBhcGVfZGVtdXhfcGFyc2VfdGFncyAoZGF0YSwgKnRhZ19zaXplIC0gZm9vdGVyX3NpemUpOworCisgIHNpbmtfY2FwcyA9IGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldF9jYXBzICgmc2lua19mYWN0b3J5KTsKKyAgZ3N0X3BiX3V0aWxzX2FkZF9jb2RlY19kZXNjcmlwdGlvbl90b190YWdfbGlzdCAoKnRhZ3MsCisgICAgICBHU1RfVEFHX0NPTlRBSU5FUl9GT1JNQVQsIHNpbmtfY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzaW5rX2NhcHMpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgcmV0dXJuIEdTVF9UQUdfREVNVVhfUkVTVUxUX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXBlZGVtdXgiLAorICAgICAgR1NUX1JBTktfUFJJTUFSWSwgR1NUX1RZUEVfQVBFX0RFTVVYKTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGFwZXRhZywKKyAgICAiQVBFdjEvMiB0YWcgcmVhZGVyIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvYXBldGFnL2dzdGFwZWRlbXV4LmggYi9nc3QvYXBldGFnL2dzdGFwZWRlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0MDU0NwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hcGV0YWcvZ3N0YXBlZGVtdXguaApAQCAtMCwwICsxLDUyIEBACisvKiBHU3RyZWFtZXIgQVBFdjEvMiB0YWcgcmVhZGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BUEVfREVNVVhfSF9fCisjZGVmaW5lIF9fR1NUX0FQRV9ERU1VWF9IX18KKworI2luY2x1ZGUgPGdzdC90YWcvZ3N0dGFnZGVtdXguaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0FQRV9ERU1VWCAgICAgICAgICAgICAoZ3N0X2FwZV9kZW11eF9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVBFX0RFTVVYKG9iaikgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0FQRV9ERU1VWCxHc3RBcGVEZW11eCkpCisjZGVmaW5lIEdTVF9BUEVfREVNVVhfQ0xBU1Moa2xhc3MpICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9BUEVfREVNVVgsR3N0QXBlRGVtdXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BUEVfREVNVVgob2JqKSAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVBFX0RFTVVYKSkKKyNkZWZpbmUgR1NUX0lTX0FQRV9ERU1VWF9DTEFTUyhrbGFzcykgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0FQRV9ERU1VWCkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBcGVEZW11eCAgICAgIEdzdEFwZURlbXV4OwordHlwZWRlZiBzdHJ1Y3QgX0dzdEFwZURlbXV4Q2xhc3MgR3N0QXBlRGVtdXhDbGFzczsKKworc3RydWN0IF9Hc3RBcGVEZW11eAoreworICBHc3RUYWdEZW11eCB0YWdkZW11eDsKK307CisKK3N0cnVjdCBfR3N0QXBlRGVtdXhDbGFzcyAKK3sKKyAgR3N0VGFnRGVtdXhDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfYXBlX2RlbXV4X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0FQRV9ERU1VWF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZ3N0L2FwZXRhZy9tZXNvbi5idWlsZCBiL2dzdC9hcGV0YWcvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4YzY0NQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hcGV0YWcvbWVzb24uYnVpbGQKQEAgLTAsMCArMSw3IEBACitnc3RhcGV0YWcgPSBsaWJyYXJ5KCdnc3RhcGV0YWcnLCAnZ3N0YXBlZGVtdXguYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0cGJ1dGlsc19kZXAsIGdzdHRhZ19kZXAsIGdzdF9kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvLmdpdGlnbm9yZSBiL2dzdC9hdWRpb2Z4Ly5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5ZmM5NwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4Ly5naXRpZ25vcmUKQEAgLTAsMCArMSw2IEBACisuZGVwcworLmxpYnMKKyoubG8KKyoubGEKK01ha2VmaWxlCitNYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW0gYi9nc3QvYXVkaW9meC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2VlN2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2MCBAQAorIyBwbHVnaW5kaXIgaXMgc2V0IGluIGNvbmZpZ3VyZQorCitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RhdWRpb2Z4LmxhCisKKyMgRklYTUUgMC4xMTogaWdub3JlIEdWYWx1ZUFycmF5IHdhcm5pbmdzIGZvciBub3cgdW50aWwgdGhpcyBpcyBzb3J0ZWQKK0VSUk9SX0NGTEFHUz0KKworT1JDX1NPVVJDRT1hdWRpb3Bhbm9yYW1hb3JjCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL29yYy5tYWsKKworIyBzb3VyY2VzIHVzZWQgdG8gY29tcGlsZSB0aGlzIHBsdWctaW4KK2xpYmdzdGF1ZGlvZnhfbGFfU09VUkNFUyA9IGF1ZGlvZnguY1wKKwlhdWRpb3Bhbm9yYW1hLmMgXAorCWF1ZGlvaW52ZXJ0LmMgXAorCWF1ZGlvYW1wbGlmeS5jIFwKKwlhdWRpb2R5bmFtaWMuYyBcCisJYXVkaW9rYXJhb2tlLmMgXAorCWF1ZGlvZnhiYXNlaWlyZmlsdGVyLmMgXAorCWF1ZGlvY2hlYmxpbWl0LmMgXAorCWF1ZGlvY2hlYmJhbmQuYyBcCisJYXVkaW9paXJmaWx0ZXIuYyBcCisJYXVkaW9meGJhc2VmaXJmaWx0ZXIuYyBcCisJYXVkaW93c2luY2JhbmQuYyBcCisJYXVkaW93c2luY2xpbWl0LmMgXAorCWF1ZGlvZmlyZmlsdGVyLmMgXAorCWF1ZGlvZWNoby5jIFwKKwlnc3RzY2FsZXRlbXBvLmMKK25vZGlzdF9saWJnc3RhdWRpb2Z4X2xhX1NPVVJDRVMgPSAkKE9SQ19OT0RJU1RfU09VUkNFUykKKworIyBmbGFncyB1c2VkIHRvIGNvbXBpbGUgdGhpcyBwbHVnaW4KK2xpYmdzdGF1ZGlvZnhfbGFfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKSBcCisJJChHU1RfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChPUkNfQ0ZMQUdTKQorbGliZ3N0YXVkaW9meF9sYV9MSUJBREQgPSAkKEdTVF9MSUJTKSBcCisJJChHU1RfQkFTRV9MSUJTKSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwktbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJLWxnc3RmZnQtJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKE9SQ19MSUJTKSBcCisJJChMSUJNKQorbGliZ3N0YXVkaW9meF9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKKyMgaGVhZGVycyB3ZSBuZWVkIGJ1dCBkb24ndCB3YW50IGluc3RhbGxlZAorbm9pbnN0X0hFQURFUlMgPSBhdWRpb3Bhbm9yYW1hLmggXAorCWF1ZGlvaW52ZXJ0LmggXAorCWF1ZGlvYW1wbGlmeS5oIFwKKwlhdWRpb2R5bmFtaWMuaCBcCisJYXVkaW9rYXJhb2tlLmggXAorCWF1ZGlvZnhiYXNlaWlyZmlsdGVyLmggXAorCWF1ZGlvY2hlYmxpbWl0LmggXAorCWF1ZGlvY2hlYmJhbmQuaCBcCisJYXVkaW9paXJmaWx0ZXIuaCBcCisJYXVkaW9meGJhc2VmaXJmaWx0ZXIuaCBcCisJYXVkaW93c2luY2JhbmQuaCBcCisgICAgICAgIGF1ZGlvd3NpbmNsaW1pdC5oIFwKKwlhdWRpb2ZpcmZpbHRlci5oIFwKKwlhdWRpb2VjaG8uaCBcCisJZ3N0c2NhbGV0ZW1wby5oIFwKKwltYXRoX2NvbXBhdC5oCmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYyBiL2dzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNmNlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuYwpAQCAtMCwwICsxLDQ3NiBAQAorLyogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWF1ZGlvYW1wbGlmeQorICoKKyAqIEFtcGxpZmllcyBhbiBhdWRpbyBzdHJlYW0gYnkgYSBnaXZlbiBmYWN0b3IgYW5kIGFsbG93cyB0aGUgc2VsZWN0aW9uIG9mIGRpZmZlcmVudCBjbGlwcGluZyBtb2Rlcy4KKyAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNsaXBwaW5nIG1vZGVzIGlzIGJlc3QgZXZhbHVhdGVkIGJ5IHRlc3RpbmcuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyB3YXZlPXNhdyAhIGF1ZGlvYW1wbGlmeSBhbXBsaWZpY2F0aW9uPTEuNSAhIGFsc2FzaW5rCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPSJtZWxvMS5vZ2ciICEgb2dnZGVtdXggISB2b3JiaXNkZWMgISBhdWRpb2NvbnZlcnQgISBhdWRpb2FtcGxpZnkgYW1wbGlmaWNhdGlvbj0xLjUgY2xpcHBpbmctbWV0aG9kPXdyYXAtbmVnYXRpdmUgISBhbHNhc2luaworICogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjIHdhdmU9c2F3ICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9hbXBsaWZ5IGFtcGxpZmljYXRpb249MS41IGNsaXBwaW5nLW1ldGhvZD13cmFwLXBvc2l0aXZlICEgYXVkaW9jb252ZXJ0ICEgYWxzYXNpbmsKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlICJhdWRpb2FtcGxpZnkuaCIKKworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2F1ZGlvX2FtcGxpZnlfZGVidWcKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKEdTVF9DQVRfREVGQVVMVCk7CisKKy8qIEZpbHRlciBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0FNUExJRklDQVRJT04sCisgIFBST1BfQ0xJUFBJTkdfTUVUSE9ECit9OworCitlbnVtCit7CisgIE1FVEhPRF9DTElQID0gMCwKKyAgTUVUSE9EX1dSQVBfTkVHQVRJVkUsCisgIE1FVEhPRF9XUkFQX1BPU0lUSVZFLAorICBNRVRIT0RfTk9DTElQLAorICBOVU1fTUVUSE9EUworfTsKKworI2RlZmluZSBHU1RfVFlQRV9BVURJT19BTVBMSUZZX0NMSVBQSU5HX01FVEhPRCAoZ3N0X2F1ZGlvX2FtcGxpZnlfY2xpcHBpbmdfbWV0aG9kX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfYXVkaW9fYW1wbGlmeV9jbGlwcGluZ19tZXRob2RfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBndHlwZSA9IDA7CisKKyAgaWYgKGd0eXBlID09IDApIHsKKyAgICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSB2YWx1ZXNbXSA9IHsKKyAgICAgIHtNRVRIT0RfQ0xJUCwgIk5vcm1hbCBjbGlwcGluZyAoZGVmYXVsdCkiLCAiY2xpcCJ9LAorICAgICAge01FVEhPRF9XUkFQX05FR0FUSVZFLAorICAgICAgICAgICAgIlB1c2ggb3ZlcmRyaXZlbiB2YWx1ZXMgYmFjayBmcm9tIHRoZSBvcHBvc2l0ZSBzaWRlIiwKKyAgICAgICAgICAid3JhcC1uZWdhdGl2ZSJ9LAorICAgICAge01FVEhPRF9XUkFQX1BPU0lUSVZFLCAiUHVzaCBvdmVyZHJpdmVuIHZhbHVlcyBiYWNrIGZyb20gdGhlIHNhbWUgc2lkZSIsCisgICAgICAgICAgIndyYXAtcG9zaXRpdmUifSwKKyAgICAgIHtNRVRIT0RfTk9DTElQLCAiTm8gY2xpcHBpbmciLCAibm9uZSJ9LAorICAgICAgezAsIE5VTEwsIE5VTEx9CisgICAgfTsKKyAgICBndHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RBdWRpb0FtcGxpZnlDbGlwcGluZ01ldGhvZCIsIHZhbHVlcyk7CisgIH0KKyAgcmV0dXJuIGd0eXBlOworfQorCisjZGVmaW5lIEFMTE9XRURfQ0FQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJhdWRpby94LXJhdywiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIGZvcm1hdD0oc3RyaW5nKSB7UzgsIkdTVF9BVURJT19ORShTMTYpIiwiR1NUX0FVRElPX05FKFMzMikiLCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1RfQVVESU9fTkUoRjMyKSIsIkdTVF9BVURJT19ORShGNjQpIn0sIiAgXAorICAgICIgcmF0ZT0oaW50KVsxLE1BWF0sIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIGNoYW5uZWxzPShpbnQpWzEsTUFYXSwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBsYXlvdXQ9KHN0cmluZykge2ludGVybGVhdmVkLCBub24taW50ZXJsZWF2ZWR9IgorCitHX0RFRklORV9UWVBFIChHc3RBdWRpb0FtcGxpZnksIGdzdF9hdWRpb19hbXBsaWZ5LCBHU1RfVFlQRV9BVURJT19GSUxURVIpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F1ZGlvX2FtcGxpZnlfc2V0X3Byb2Nlc3NfZnVuY3Rpb24gKEdzdEF1ZGlvQW1wbGlmeSAqCisgICAgZmlsdGVyLCBnaW50IGNsaXBwaW5nLCBHc3RBdWRpb0Zvcm1hdCBmb3JtYXQpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2FtcGxpZnlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2FtcGxpZnlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F1ZGlvX2FtcGxpZnlfc2V0dXAgKEdzdEF1ZGlvRmlsdGVyICogZmlsdGVyLAorICAgIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwKKyAgICBHc3RCdWZmZXIgKiBidWYpOworCisjZGVmaW5lIE1JTl9naW50OCBHX01JTklOVDgKKyNkZWZpbmUgTUFYX2dpbnQ4IEdfTUFYSU5UOAorI2RlZmluZSBNSU5fZ2ludDE2IEdfTUlOSU5UMTYKKyNkZWZpbmUgTUFYX2dpbnQxNiBHX01BWElOVDE2CisjZGVmaW5lIE1JTl9naW50MzIgR19NSU5JTlQzMgorI2RlZmluZSBNQVhfZ2ludDMyIEdfTUFYSU5UMzIKKworI2RlZmluZSBNQUtFX0lOVF9GVU5DUyh0eXBlLGxhcmdldHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtXyMjdHlwZSMjX2NsaXAgKEdzdEF1ZGlvQW1wbGlmeSAqIGZpbHRlciwgICAgICAgICAgXAorICAgIHZvaWQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlICpkID0gZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB3aGlsZSAobnVtX3NhbXBsZXMtLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxhcmdldHlwZSB2YWwgPSAqZCAqIGZpbHRlci0+YW1wbGlmaWNhdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpkKysgPSAgQ0xBTVAgKHZhbCwgTUlOXyMjdHlwZSwgTUFYXyMjdHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtXyMjdHlwZSMjX3dyYXBfbmVnYXRpdmUgKEdzdEF1ZGlvQW1wbGlmeSAqIGZpbHRlciwgXAorICAgIHZvaWQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlICpkID0gZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB3aGlsZSAobnVtX3NhbXBsZXMtLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxhcmdldHlwZSB2YWwgPSAqZCAqIGZpbHRlci0+YW1wbGlmaWNhdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh2YWwgPiBNQVhfIyN0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdmFsID0gTUlOXyMjdHlwZSArICh2YWwgLSBNSU5fIyN0eXBlKSAlICgobGFyZ2V0eXBlKSBNQVhfIyN0eXBlICsgMSAtICAgXAorICAgICAgICAgIE1JTl8jI3R5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKHZhbCA8IE1JTl8jI3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdmFsID0gTUFYXyMjdHlwZSAtIChNQVhfIyN0eXBlIC0gdmFsKSAlICgobGFyZ2V0eXBlKSBNQVhfIyN0eXBlICsgMSAtICAgXAorICAgICAgICAgIE1JTl8jI3R5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpkKysgPSB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtXyMjdHlwZSMjX3dyYXBfcG9zaXRpdmUgKEdzdEF1ZGlvQW1wbGlmeSAqIGZpbHRlciwgXAorICAgIHZvaWQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlICpkID0gZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB3aGlsZSAobnVtX3NhbXBsZXMtLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxhcmdldHlwZSB2YWwgPSAqZCAqIGZpbHRlci0+YW1wbGlmaWNhdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKHZhbCA+IE1BWF8jI3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2YWwgPSBNQVhfIyN0eXBlIC0gKHZhbCAtIE1BWF8jI3R5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZWxzZSBpZiAodmFsIDwgTUlOXyMjdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2YWwgPSBNSU5fIyN0eXBlICsgKE1JTl8jI3R5cGUgLSB2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpkKysgPSB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtXyMjdHlwZSMjX25vY2xpcCAoR3N0QXVkaW9BbXBsaWZ5ICogZmlsdGVyLCAgICAgICAgXAorICAgIHZvaWQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlICpkID0gZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB3aGlsZSAobnVtX3NhbXBsZXMtLSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpkKysgKj0gZmlsdGVyLT5hbXBsaWZpY2F0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIE1BS0VfRkxPQVRfRlVOQ1ModHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fIyN0eXBlIyNfY2xpcCAoR3N0QXVkaW9BbXBsaWZ5ICogZmlsdGVyLCAgICAgICAgICBcCisgICAgdm9pZCAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGUgKmQgPSBkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlIChudW1fc2FtcGxlcy0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZSB2YWwgPSAqZCogZmlsdGVyLT5hbXBsaWZpY2F0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmQrKyA9IENMQU1QICh2YWwsIC0xLjAsICsxLjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fIyN0eXBlIyNfd3JhcF9uZWdhdGl2ZSAoR3N0QXVkaW9BbXBsaWZ5ICogICAgICAgICBcCisgICAgZmlsdGVyLCB2b2lkICogZGF0YSwgZ3VpbnQgbnVtX3NhbXBsZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGUgKmQgPSBkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlIChudW1fc2FtcGxlcy0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZSB2YWwgPSAqZCAqIGZpbHRlci0+YW1wbGlmaWNhdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAodmFsID4gMS4wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZhbCA9IC0xLjAgKyAodmFsIC0gMS4wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlIGlmICh2YWwgPCAtMS4wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZhbCA9IDEuMCAtICgxLjAgLSB2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmQrKyA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fIyN0eXBlIyNfd3JhcF9wb3NpdGl2ZSAoR3N0QXVkaW9BbXBsaWZ5ICogZmlsdGVyLCBcCisgICAgdm9pZCAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGUgKmQgPSBkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlIChudW1fc2FtcGxlcy0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZSB2YWwgPSAqZCogZmlsdGVyLT5hbXBsaWZpY2F0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAodmFsID4gMS4wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZhbCA9IDEuMCAtICh2YWwgLSAxLjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlIGlmICh2YWwgPCAtMS4wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZhbCA9IC0xLjAgKyAoLTEuMCAtIHZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmQrKyA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fIyN0eXBlIyNfbm9jbGlwIChHc3RBdWRpb0FtcGxpZnkgKiBmaWx0ZXIsICAgICAgICBcCisgICAgdm9pZCAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGUgKmQgPSBkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlIChudW1fc2FtcGxlcy0tKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmQrKyAqPSBmaWx0ZXItPmFtcGxpZmljYXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8qICpJTkRFTlQtT0ZGKiAqLworTUFLRV9JTlRfRlVOQ1MgKGdpbnQ4LGdpbnQpCitNQUtFX0lOVF9GVU5DUyAoZ2ludDE2LGdpbnQpCitNQUtFX0lOVF9GVU5DUyAoZ2ludDMyLGdpbnQ2NCkKK01BS0VfRkxPQVRfRlVOQ1MgKGdmbG9hdCkKK01BS0VfRkxPQVRfRlVOQ1MgKGdkb3VibGUpCisvKiAqSU5ERU5ULU9OKiAqLworCisvKiBHT2JqZWN0IHZtZXRob2QgaW1wbGVtZW50YXRpb25zICovCisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fYW1wbGlmeV9jbGFzc19pbml0IChHc3RBdWRpb0FtcGxpZnlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X2F1ZGlvX2FtcGxpZnlfZGVidWcsICJhdWRpb2FtcGxpZnkiLCAwLAorICAgICAgImF1ZGlvYW1wbGlmeSBlbGVtZW50Iik7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb19hbXBsaWZ5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2F1ZGlvX2FtcGxpZnlfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQU1QTElGSUNBVElPTiwKKyAgICAgIGdfcGFyYW1fc3BlY19mbG9hdCAoImFtcGxpZmljYXRpb24iLCAiQW1wbGlmaWNhdGlvbiIsCisgICAgICAgICAgIkZhY3RvciBvZiBhbXBsaWZpY2F0aW9uIiwgLUdfTUFYRkxPQVQsIEdfTUFYRkxPQVQsCisgICAgICAgICAgMS4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0QXVkaW9BbXBsaWZ5OmNsaXBwaW5nLW1ldGhvZAorICAgKgorICAgKiBDbGlwcGluZyBtZXRob2Q6IGNsaXAgbW9kZSBzZXQgdmFsdWVzIGhpZ2hlciB0aGFuIHRoZSBtYXhpbXVtIHRvIHRoZQorICAgKiBtYXhpbXVtLiBUaGUgd3JhcC1uZWdhdGl2ZSBtb2RlIHB1c2hlcyB0aG9zZSB2YWx1ZXMgYmFjayBmcm9tIHRoZQorICAgKiBvcHBvc2l0ZSBzaWRlLCB3cmFwLXBvc2l0aXZlIHB1c2hlcyB0aGVtIGJhY2sgZnJvbSB0aGUgc2FtZSBzaWRlLgorICAgKgorICAgKiovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ0xJUFBJTkdfTUVUSE9ELAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJjbGlwcGluZy1tZXRob2QiLCAiQ2xpcHBpbmcgbWV0aG9kIiwKKyAgICAgICAgICAiU2VsZWN0cyBob3cgdG8gaGFuZGxlIHZhbHVlcyBoaWdoZXIgdGhhbiB0aGUgbWF4aW11bSIsCisgICAgICAgICAgR1NUX1RZUEVfQVVESU9fQU1QTElGWV9DTElQUElOR19NRVRIT0QsIE1FVEhPRF9DTElQLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJBdWRpbyBhbXBsaWZpZXIiLAorICAgICAgIkZpbHRlci9FZmZlY3QvQXVkaW8iLAorICAgICAgIkFtcGxpZmllcyBhbiBhdWRpbyBzdHJlYW0gYnkgYSBnaXZlbiBmYWN0b3IiLAorICAgICAgIlNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4iKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFMTE9XRURfQ0FQUyk7CisgIGdzdF9hdWRpb19maWx0ZXJfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZXMgKEdTVF9BVURJT19GSUxURVJfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyktPnRyYW5zZm9ybV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2lwKTsKKyAgR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyktPnRyYW5zZm9ybV9pcF9vbl9wYXNzdGhyb3VnaCA9IEZBTFNFOworCisgIEdTVF9BVURJT19GSUxURVJfQ0xBU1MgKGtsYXNzKS0+c2V0dXAgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdWRpb19hbXBsaWZ5X3NldHVwKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19hbXBsaWZ5X2luaXQgKEdzdEF1ZGlvQW1wbGlmeSAqIGZpbHRlcikKK3sKKyAgZmlsdGVyLT5hbXBsaWZpY2F0aW9uID0gMS4wOworICBnc3RfYXVkaW9fYW1wbGlmeV9zZXRfcHJvY2Vzc19mdW5jdGlvbiAoZmlsdGVyLCBNRVRIT0RfQ0xJUCwKKyAgICAgIEdTVF9BVURJT19GT1JNQVRfUzE2KTsKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9pbl9wbGFjZSAoR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpLCBUUlVFKTsKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9nYXBfYXdhcmUgKEdTVF9CQVNFX1RSQU5TRk9STSAoZmlsdGVyKSwgVFJVRSk7Cit9CisKK3N0YXRpYyBHc3RBdWRpb0FtcGxpZnlQcm9jZXNzRnVuYworZ3N0X2F1ZGlvX2FtcGxpZnlfcHJvY2Vzc19mdW5jdGlvbiAoZ2ludCBjbGlwcGluZywgR3N0QXVkaW9Gb3JtYXQgZm9ybWF0KQoreworICBzdGF0aWMgY29uc3Qgc3RydWN0IHByb2Nlc3MKKyAgeworICAgIEdzdEF1ZGlvRm9ybWF0IGZvcm1hdDsKKyAgICBnaW50IGNsaXBwaW5nOworICAgIEdzdEF1ZGlvQW1wbGlmeVByb2Nlc3NGdW5jIGZ1bmM7CisgIH0gcHJvY2Vzc1tdID0geworICAgIHsKKyAgICBHU1RfQVVESU9fRk9STUFUX0YzMiwgTUVUSE9EX0NMSVAsIGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9nZmxvYXRfY2xpcH0sIHsKKyAgICBHU1RfQVVESU9fRk9STUFUX0YzMiwgTUVUSE9EX1dSQVBfTkVHQVRJVkUsCisgICAgICAgICAgZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2dmbG9hdF93cmFwX25lZ2F0aXZlfSwgeworICAgIEdTVF9BVURJT19GT1JNQVRfRjMyLCBNRVRIT0RfV1JBUF9QT1NJVElWRSwKKyAgICAgICAgICBnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fZ2Zsb2F0X3dyYXBfcG9zaXRpdmV9LCB7CisgICAgR1NUX0FVRElPX0ZPUk1BVF9GMzIsIE1FVEhPRF9OT0NMSVAsCisgICAgICAgICAgZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2dmbG9hdF9ub2NsaXB9LCB7CisgICAgR1NUX0FVRElPX0ZPUk1BVF9GNjQsIE1FVEhPRF9DTElQLAorICAgICAgICAgIGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9nZG91YmxlX2NsaXB9LCB7CisgICAgR1NUX0FVRElPX0ZPUk1BVF9GNjQsIE1FVEhPRF9XUkFQX05FR0FUSVZFLAorICAgICAgICAgIGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9nZG91YmxlX3dyYXBfbmVnYXRpdmV9LCB7CisgICAgR1NUX0FVRElPX0ZPUk1BVF9GNjQsIE1FVEhPRF9XUkFQX1BPU0lUSVZFLAorICAgICAgICAgIGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9nZG91YmxlX3dyYXBfcG9zaXRpdmV9LCB7CisgICAgR1NUX0FVRElPX0ZPUk1BVF9GNjQsIE1FVEhPRF9OT0NMSVAsCisgICAgICAgICAgZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2dkb3VibGVfbm9jbGlwfSwgeworICAgIEdTVF9BVURJT19GT1JNQVRfUzgsIE1FVEhPRF9DTElQLCBnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fZ2ludDhfY2xpcH0sIHsKKyAgICBHU1RfQVVESU9fRk9STUFUX1M4LCBNRVRIT0RfV1JBUF9ORUdBVElWRSwKKyAgICAgICAgICBnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fZ2ludDhfd3JhcF9uZWdhdGl2ZX0sIHsKKyAgICBHU1RfQVVESU9fRk9STUFUX1M4LCBNRVRIT0RfV1JBUF9QT1NJVElWRSwKKyAgICAgICAgICBnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fZ2ludDhfd3JhcF9wb3NpdGl2ZX0sIHsKKyAgICBHU1RfQVVESU9fRk9STUFUX1M4LCBNRVRIT0RfTk9DTElQLAorICAgICAgICAgIGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9naW50OF9ub2NsaXB9LCB7CisgICAgR1NUX0FVRElPX0ZPUk1BVF9TMTYsIE1FVEhPRF9DTElQLCBnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fZ2ludDE2X2NsaXB9LCB7CisgICAgR1NUX0FVRElPX0ZPUk1BVF9TMTYsIE1FVEhPRF9XUkFQX05FR0FUSVZFLAorICAgICAgICAgIGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9naW50MTZfd3JhcF9uZWdhdGl2ZX0sIHsKKyAgICBHU1RfQVVESU9fRk9STUFUX1MxNiwgTUVUSE9EX1dSQVBfUE9TSVRJVkUsCisgICAgICAgICAgZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2dpbnQxNl93cmFwX3Bvc2l0aXZlfSwgeworICAgIEdTVF9BVURJT19GT1JNQVRfUzE2LCBNRVRIT0RfTk9DTElQLAorICAgICAgICAgIGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9naW50MTZfbm9jbGlwfSwgeworICAgIEdTVF9BVURJT19GT1JNQVRfUzMyLCBNRVRIT0RfQ0xJUCwgZ3N0X2F1ZGlvX2FtcGxpZnlfdHJhbnNmb3JtX2dpbnQzMl9jbGlwfSwgeworICAgIEdTVF9BVURJT19GT1JNQVRfUzMyLCBNRVRIT0RfV1JBUF9ORUdBVElWRSwKKyAgICAgICAgICBnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fZ2ludDMyX3dyYXBfbmVnYXRpdmV9LCB7CisgICAgR1NUX0FVRElPX0ZPUk1BVF9TMzIsIE1FVEhPRF9XUkFQX1BPU0lUSVZFLAorICAgICAgICAgIGdzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9naW50MzJfd3JhcF9wb3NpdGl2ZX0sIHsKKyAgICBHU1RfQVVESU9fRk9STUFUX1MzMiwgTUVUSE9EX05PQ0xJUCwKKyAgICAgICAgICBnc3RfYXVkaW9fYW1wbGlmeV90cmFuc2Zvcm1fZ2ludDMyX25vY2xpcH0sIHsKKyAgICAwLCAwLCBOVUxMfQorICB9OworICBjb25zdCBzdHJ1Y3QgcHJvY2VzcyAqcDsKKworICBmb3IgKHAgPSBwcm9jZXNzOyBwLT5mdW5jOyBwKyspCisgICAgaWYgKHAtPmZvcm1hdCA9PSBmb3JtYXQgJiYgcC0+Y2xpcHBpbmcgPT0gY2xpcHBpbmcpCisgICAgICByZXR1cm4gcC0+ZnVuYzsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1ZGlvX2FtcGxpZnlfc2V0X3Byb2Nlc3NfZnVuY3Rpb24gKEdzdEF1ZGlvQW1wbGlmeSAqIGZpbHRlciwgZ2ludAorICAgIGNsaXBwaW5nX21ldGhvZCwgR3N0QXVkaW9Gb3JtYXQgZm9ybWF0KQoreworICBHc3RBdWRpb0FtcGxpZnlQcm9jZXNzRnVuYyBwcm9jZXNzOworCisgIC8qIHNldCBwcm9jZXNzaW5nIGZ1bmN0aW9uICovCisKKyAgcHJvY2VzcyA9IGdzdF9hdWRpb19hbXBsaWZ5X3Byb2Nlc3NfZnVuY3Rpb24gKGNsaXBwaW5nX21ldGhvZCwgZm9ybWF0KTsKKyAgaWYgKCFwcm9jZXNzKSB7CisgICAgR1NUX0RFQlVHICgid3JvbmcgZm9ybWF0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgZmlsdGVyLT5wcm9jZXNzID0gcHJvY2VzczsKKyAgZmlsdGVyLT5jbGlwcGluZ19tZXRob2QgPSBjbGlwcGluZ19tZXRob2Q7CisgIGZpbHRlci0+Zm9ybWF0ID0gZm9ybWF0OworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2FtcGxpZnlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEF1ZGlvQW1wbGlmeSAqZmlsdGVyID0gR1NUX0FVRElPX0FNUExJRlkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0FNUExJRklDQVRJT046CisgICAgICBmaWx0ZXItPmFtcGxpZmljYXRpb24gPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAoR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpLAorICAgICAgICAgIGZpbHRlci0+YW1wbGlmaWNhdGlvbiA9PSAxLjApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NMSVBQSU5HX01FVEhPRDoKKyAgICAgIGdzdF9hdWRpb19hbXBsaWZ5X3NldF9wcm9jZXNzX2Z1bmN0aW9uIChmaWx0ZXIsIGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKSwKKyAgICAgICAgICBmaWx0ZXItPmZvcm1hdCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fYW1wbGlmeV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXVkaW9BbXBsaWZ5ICpmaWx0ZXIgPSBHU1RfQVVESU9fQU1QTElGWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQU1QTElGSUNBVElPTjoKKyAgICAgIGdfdmFsdWVfc2V0X2Zsb2F0ICh2YWx1ZSwgZmlsdGVyLT5hbXBsaWZpY2F0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTElQUElOR19NRVRIT0Q6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgZmlsdGVyLT5jbGlwcGluZ19tZXRob2QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBHc3RBdWRpb0ZpbHRlciB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYXVkaW9fYW1wbGlmeV9zZXR1cCAoR3N0QXVkaW9GaWx0ZXIgKiBiYXNlLCBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKQoreworICBHc3RBdWRpb0FtcGxpZnkgKmZpbHRlciA9IEdTVF9BVURJT19BTVBMSUZZIChiYXNlKTsKKworICByZXR1cm4gZ3N0X2F1ZGlvX2FtcGxpZnlfc2V0X3Byb2Nlc3NfZnVuY3Rpb24gKGZpbHRlciwKKyAgICAgIGZpbHRlci0+Y2xpcHBpbmdfbWV0aG9kLCBHU1RfQVVESU9fSU5GT19GT1JNQVQgKGluZm8pKTsKK30KKworLyogR3N0QmFzZVRyYW5zZm9ybSB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hdWRpb19hbXBsaWZ5X3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0QXVkaW9BbXBsaWZ5ICpmaWx0ZXIgPSBHU1RfQVVESU9fQU1QTElGWSAoYmFzZSk7CisgIGd1aW50IG51bV9zYW1wbGVzOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBzdHJlYW1fdGltZTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1Zik7CisgIHN0cmVhbV90aW1lID0KKyAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmYmFzZS0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgInN5bmMgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW1fdGltZSkpCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoZmlsdGVyKSwgc3RyZWFtX3RpbWUpOworCisgIGlmIChHX1VOTElLRUxZIChHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19HQVApKSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEV1JJVEUpOworICBudW1fc2FtcGxlcyA9IG1hcC5zaXplIC8gR1NUX0FVRElPX0ZJTFRFUl9CUFMgKGZpbHRlcik7CisKKyAgZmlsdGVyLT5wcm9jZXNzIChmaWx0ZXIsIG1hcC5kYXRhLCBudW1fc2FtcGxlcyk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuaCBiL2dzdC9hdWRpb2Z4L2F1ZGlvYW1wbGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3M2VlZDEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2FtcGxpZnkuaApAQCAtMCwwICsxLDYyIEBACisvKiAKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BVURJT19BTVBMSUZZX0hfXworI2RlZmluZSBfX0dTVF9BVURJT19BTVBMSUZZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuaD4KKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9BVURJT19BTVBMSUZZICAgICAgICAgICAgKGdzdF9hdWRpb19hbXBsaWZ5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9BVURJT19BTVBMSUZZKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVVESU9fQU1QTElGWSxHc3RBdWRpb0FtcGxpZnkpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fQU1QTElGWShvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0FVRElPX0FNUExJRlkpKQorI2RlZmluZSBHU1RfQVVESU9fQU1QTElGWV9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcykgLEdTVF9UWVBFX0FVRElPX0FNUExJRlksR3N0QXVkaW9BbXBsaWZ5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fQU1QTElGWV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcykgLEdTVF9UWVBFX0FVRElPX0FNUExJRlkpKQorI2RlZmluZSBHU1RfQVVESU9fQU1QTElGWV9HRVRfQ0xBU1Mob2JqKSAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MoKG9iaikgLEdTVF9UWVBFX0FVRElPX0FNUExJRlksR3N0QXVkaW9BbXBsaWZ5Q2xhc3MpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1ZGlvQW1wbGlmeSBHc3RBdWRpb0FtcGxpZnk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9BbXBsaWZ5Q2xhc3MgR3N0QXVkaW9BbXBsaWZ5Q2xhc3M7CisKK3R5cGVkZWYgdm9pZCAoKkdzdEF1ZGlvQW1wbGlmeVByb2Nlc3NGdW5jKSAoR3N0QXVkaW9BbXBsaWZ5ICosIHZvaWQgKiwgZ3VpbnQpOworCitzdHJ1Y3QgX0dzdEF1ZGlvQW1wbGlmeQoreworICBHc3RBdWRpb0ZpbHRlciBhdWRpb2ZpbHRlcjsKKworICBnZmxvYXQgYW1wbGlmaWNhdGlvbjsKKworICAvKiA8IHByaXZhdGUgPiAqLworICBHc3RBdWRpb0FtcGxpZnlQcm9jZXNzRnVuYyBwcm9jZXNzOworICBnaW50IGNsaXBwaW5nX21ldGhvZDsKKyAgR3N0QXVkaW9Gb3JtYXQgZm9ybWF0OworfTsKKworc3RydWN0IF9Hc3RBdWRpb0FtcGxpZnlDbGFzcworeworICBHc3RBdWRpb0ZpbHRlckNsYXNzIHBhcmVudDsKK307CisKK0dUeXBlIGdzdF9hdWRpb19hbXBsaWZ5X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9BVURJT19BTVBMSUZZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jIGIvZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZmViZTkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmMKQEAgLTAsMCArMSw2NjAgQEAKKy8qIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKiAKKyAqIENoZWJ5c2hldiB0eXBlIDEgZmlsdGVyIGRlc2lnbiBiYXNlZCBvbgorICogIlRoZSBTY2llbnRpc3QgYW5kIEVuZ2luZWVyJ3MgR3VpZGUgdG8gRFNQIiwgQ2hhcHRlciAyMC4KKyAqIGh0dHA6Ly93d3cuZHNwZ3VpZGUuY29tLworICoKKyAqIEZvciB0eXBlIDIgYW5kIENoZWJ5c2hldiBmaWx0ZXJzIGluIGdlbmVyYWwgcmVhZAorICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DaGVieXNoZXZfZmlsdGVyCisgKgorICogVHJhbnNmb3JtYXRpb24gZnJvbSBsb3dwYXNzIHRvIGJhbmRwYXNzL2JhbmRyZWplY3Q6CisgKiBodHRwOi8vZG9jcy5kZXdyZXNlYXJjaC5jb20vRHNwSGVscC9odG1sL0lESF9MaW5lYXJTeXN0ZW1zX0xvd3Bhc3NUb0JhbmRQYXNzWi5odG0KKyAqIGh0dHA6Ly9kb2NzLmRld3Jlc2VhcmNoLmNvbS9Ec3BIZWxwL2h0bWwvSURIX0xpbmVhclN5c3RlbXNfTG93cGFzc1RvQmFuZFN0b3BaLmh0bQorICogCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXVkaW9jaGViYmFuZAorICoKKyAqIEF0dGVudWF0ZXMgYWxsIGZyZXF1ZW5jaWVzIG91dHNpZGUgKGJhbmRwYXNzKSBvciBpbnNpZGUgKGJhbmRyZWplY3QpIG9mIGEgZnJlcXVlbmN5CisgKiBiYW5kLiBUaGUgbnVtYmVyIG9mIHBvbGVzIGFuZCB0aGUgcmlwcGxlIHBhcmFtZXRlciBjb250cm9sIHRoZSByb2xsb2ZmLgorICoKKyAqIFRoaXMgZWxlbWVudCBoYXMgdGhlIGFkdmFudGFnZSBvdmVyIHRoZSB3aW5kb3dlZCBzaW5jIGJhbmRwYXNzIGFuZCBiYW5kcmVqZWN0IGZpbHRlciB0aGF0IGl0IGlzCisgKiBtdWNoIGZhc3RlciBhbmQgcHJvZHVjZXMgYWxtb3N0IGFzIGdvb2QgcmVzdWx0cy4gSXQncyBvbmx5IGRpc2FkdmFudGFnZXMgYXJlIHRoZSBoaWdobHkKKyAqIG5vbi1saW5lYXIgcGhhc2UgYW5kIHRoZSBzbG93ZXIgcm9sbG9mZiBjb21wYXJlZCB0byBhIHdpbmRvd2VkIHNpbmMgZmlsdGVyIHdpdGggYSBsYXJnZSBrZXJuZWwuCisgKgorICogRm9yIHR5cGUgMSB0aGUgcmlwcGxlIHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IG11Y2ggcmlwcGxlIGluIGRCIGlzIGFsbG93ZWQgaW4gdGhlIHBhc3NiYW5kLCBpLmUuCisgKiBzb21lIGZyZXF1ZW5jaWVzIGluIHRoZSBwYXNzYmFuZCB3aWxsIGJlIGFtcGxpZmllZCBieSB0aGF0IHZhbHVlLiBBIGhpZ2hlciByaXBwbGUgdmFsdWUgd2lsbCBhbGxvdworICogYSBmYXN0ZXIgcm9sbG9mZi4KKyAqCisgKiBGb3IgdHlwZSAyIHRoZSByaXBwbGUgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgc3RvcGJhbmQgYXR0ZW51YXRpb24uIEluIHRoZSBzdG9wYmFuZCB0aGUgZ2FpbiB3aWxsCisgKiBiZSBhdCBtb3N0IHRoaXMgdmFsdWUuIEEgbG93ZXIgcmlwcGxlIHZhbHVlIHdpbGwgYWxsb3cgYSBmYXN0ZXIgcm9sbG9mZi4KKyAqCisgKiBBcyBhIHNwZWNpYWwgY2FzZSwgYSBDaGVieXNoZXYgdHlwZSAxIGZpbHRlciB3aXRoIG5vIHJpcHBsZSBpcyBhIEJ1dHRlcndvcnRoIGZpbHRlci4KKyAqCisgKiA8bm90ZT4KKyAqIEJlIHdhcm5lZCB0aGF0IGEgdG9vIGxhcmdlIG51bWJlciBvZiBwb2xlcyBjYW4gcHJvZHVjZSBub2lzZS4gVGhlIG1vc3QgcG9sZXMgYXJlIHBvc3NpYmxlIHdpdGgKKyAqIGEgY3V0b2ZmIGZyZXF1ZW5jeSBhdCBhIHF1YXJ0ZXIgb2YgdGhlIHNhbXBsaW5nIHJhdGUuCisgKiA8L25vdGU+CisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyBmcmVxPTE1MDAgISBhdWRpb2NvbnZlcnQgISBhdWRpb2NoZWJiYW5kIG1vZGU9YmFuZC1wYXNzIGxvd2VyLWZyZXF1ZW5jeT0xMDAwIHVwcGVyLWZyZXF1ZW5jeT02MDAwIHBvbGVzPTQgISBhdWRpb2NvbnZlcnQgISBhbHNhc2luaworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj0ibWVsbzEub2dnIiAhIG9nZ2RlbXV4ICEgdm9yYmlzZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9jaGViYmFuZCBtb2RlPWJhbmQtcmVqZWN0IGxvd2VyLWZyZXF1ZW5jeT0xMDAwIHVwcGVyLWZyZXF1ZW5jeT00MDAwIHJpcHBsZT0wLjIgISBhdWRpb2NvbnZlcnQgISBhbHNhc2luaworICogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjIHdhdmU9d2hpdGUtbm9pc2UgISBhdWRpb2NvbnZlcnQgISBhdWRpb2NoZWJiYW5kIG1vZGU9YmFuZC1wYXNzIGxvd2VyLWZyZXF1ZW5jeT0xMDAwIHVwcGVyLWZyZXF1ZW5jeT00MDAwIHR5cGU9MiAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJtYXRoX2NvbXBhdC5oIgorCisjaW5jbHVkZSAiYXVkaW9jaGViYmFuZC5oIgorCisjaW5jbHVkZSAiZ3N0L2dsaWItY29tcGF0LXByaXZhdGUuaCIKKworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2F1ZGlvX2NoZWJfYmFuZF9kZWJ1ZworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoR1NUX0NBVF9ERUZBVUxUKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTU9ERSwKKyAgUFJPUF9UWVBFLAorICBQUk9QX0xPV0VSX0ZSRVFVRU5DWSwKKyAgUFJPUF9VUFBFUl9GUkVRVUVOQ1ksCisgIFBST1BfUklQUExFLAorICBQUk9QX1BPTEVTCit9OworCisjZGVmaW5lIGdzdF9hdWRpb19jaGViX2JhbmRfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0QXVkaW9DaGViQmFuZCwgZ3N0X2F1ZGlvX2NoZWJfYmFuZCwKKyAgICBHU1RfVFlQRV9BVURJT19GWF9CQVNFX0lJUl9GSUxURVIpOworCitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fY2hlYl9iYW5kX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19jaGViX2JhbmRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2NoZWJfYmFuZF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fY2hlYl9iYW5kX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGZpbHRlciwKKyAgICBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKTsKKworZW51bQoreworICBNT0RFX0JBTkRfUEFTUyA9IDAsCisgIE1PREVfQkFORF9SRUpFQ1QKK307CisKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fQ0hFQllTSEVWX0ZSRVFfQkFORF9NT0RFIChnc3RfYXVkaW9fY2hlYl9iYW5kX21vZGVfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9hdWRpb19jaGViX2JhbmRfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGd0eXBlID0gMDsKKworICBpZiAoZ3R5cGUgPT0gMCkgeworICAgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHZhbHVlc1tdID0geworICAgICAge01PREVfQkFORF9QQVNTLCAiQmFuZCBwYXNzIChkZWZhdWx0KSIsCisgICAgICAgICAgImJhbmQtcGFzcyJ9LAorICAgICAge01PREVfQkFORF9SRUpFQ1QsICJCYW5kIHJlamVjdCIsCisgICAgICAgICAgImJhbmQtcmVqZWN0In0sCisgICAgICB7MCwgTlVMTCwgTlVMTH0KKyAgICB9OworCisgICAgZ3R5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0QXVkaW9DaGViQmFuZE1vZGUiLCB2YWx1ZXMpOworICB9CisgIHJldHVybiBndHlwZTsKK30KKworLyogR09iamVjdCB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2NoZWJfYmFuZF9jbGFzc19pbml0IChHc3RBdWRpb0NoZWJCYW5kQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyAqZmlsdGVyX2NsYXNzID0gKEdzdEF1ZGlvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9hdWRpb19jaGViX2JhbmRfZGVidWcsICJhdWRpb2NoZWJiYW5kIiwgMCwKKyAgICAgICJhdWRpb2NoZWJiYW5kIGVsZW1lbnQiKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9fY2hlYl9iYW5kX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2F1ZGlvX2NoZWJfYmFuZF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2F1ZGlvX2NoZWJfYmFuZF9maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoIm1vZGUiLCAiTW9kZSIsCisgICAgICAgICAgIkxvdyBwYXNzIG9yIGhpZ2ggcGFzcyBtb2RlIiwgR1NUX1RZUEVfQVVESU9fQ0hFQllTSEVWX0ZSRVFfQkFORF9NT0RFLAorICAgICAgICAgIE1PREVfQkFORF9QQVNTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UWVBFLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInR5cGUiLCAiVHlwZSIsICJUeXBlIG9mIHRoZSBjaGVieWNoZXYgZmlsdGVyIiwgMSwgMiwgMSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyogRklYTUU6IERvbid0IHVzZSB0aGUgY29tcGxldGUgcG9zc2libGUgcmFuZ2UgYnV0IHJlc3RyaWN0IHRoZSB1cHBlciBib3VuZGFyeQorICAgKiBzbyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBVSXMgY2FuIHVzZSBhIHNsaWRlciB3aXRob3V0ICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTE9XRVJfRlJFUVVFTkNZLAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgibG93ZXItZnJlcXVlbmN5IiwgIkxvd2VyIGZyZXF1ZW5jeSIsCisgICAgICAgICAgIlN0YXJ0IGZyZXF1ZW5jeSBvZiB0aGUgYmFuZCAoSHopIiwgMC4wLCAxMDAwMDAuMCwKKyAgICAgICAgICAwLjAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1VQUEVSX0ZSRVFVRU5DWSwKKyAgICAgIGdfcGFyYW1fc3BlY19mbG9hdCAoInVwcGVyLWZyZXF1ZW5jeSIsICJVcHBlciBmcmVxdWVuY3kiLAorICAgICAgICAgICJTdG9wIGZyZXF1ZW5jeSBvZiB0aGUgYmFuZCAoSHopIiwgMC4wLCAxMDAwMDAuMCwgMC4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SSVBQTEUsCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJyaXBwbGUiLCAiUmlwcGxlIiwgIkFtb3VudCBvZiByaXBwbGUgKGRCKSIsIDAuMCwKKyAgICAgICAgICAyMDAuMCwgMC4yNSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qIEZJWE1FOiBXaGF0IHRvIGRvIGFib3V0IHRoaXMgdXBwZXIgYm91bmRhcnk/IFdpdGggYSBmcmVxdWVuY2llcyBuZWFyCisgICAqIHJhdGUvNCAzMiBwb2xlcyBhcmUgY29tcGxldGVseSBwb3NzaWJsZSwgd2l0aCBmcmVxdWVuY2llcyB2ZXJ5IGxvdworICAgKiBvciB2ZXJ5IGhpZ2ggMTYgcG9sZXMgYWxyZWFkeSBwcm9kdWNlcyBvbmx5IG5vaXNlICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUE9MRVMsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicG9sZXMiLCAiUG9sZXMiLAorICAgICAgICAgICJOdW1iZXIgb2YgcG9sZXMgdG8gdXNlLCB3aWxsIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgbXVsdGlwbHkgb2YgZm91ciIsCisgICAgICAgICAgNCwgMzIsIDQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiQmFuZCBwYXNzICYgYmFuZCByZWplY3QgZmlsdGVyIiwgIkZpbHRlci9FZmZlY3QvQXVkaW8iLAorICAgICAgIkNoZWJ5c2hldiBiYW5kIHBhc3MgYW5kIGJhbmQgcmVqZWN0IGZpbHRlciIsCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZmlsdGVyX2NsYXNzLT5zZXR1cCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9fY2hlYl9iYW5kX3NldHVwKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19jaGViX2JhbmRfaW5pdCAoR3N0QXVkaW9DaGViQmFuZCAqIGZpbHRlcikKK3sKKyAgZmlsdGVyLT5sb3dlcl9mcmVxdWVuY3kgPSBmaWx0ZXItPnVwcGVyX2ZyZXF1ZW5jeSA9IDAuMDsKKyAgZmlsdGVyLT5tb2RlID0gTU9ERV9CQU5EX1BBU1M7CisgIGZpbHRlci0+dHlwZSA9IDE7CisgIGZpbHRlci0+cG9sZXMgPSA0OworICBmaWx0ZXItPnJpcHBsZSA9IDAuMjU7CisKKyAgZ19tdXRleF9pbml0ICgmZmlsdGVyLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2dlbmVyYXRlX2JpcXVhZF9jb2VmZmljaWVudHMgKEdzdEF1ZGlvQ2hlYkJhbmQgKiBmaWx0ZXIsCisgICAgZ2ludCBwLCBnaW50IHJhdGUsIGdkb3VibGUgKiBiMCwgZ2RvdWJsZSAqIGIxLCBnZG91YmxlICogYjIsIGdkb3VibGUgKiBiMywKKyAgICBnZG91YmxlICogYjQsIGdkb3VibGUgKiBhMSwgZ2RvdWJsZSAqIGEyLCBnZG91YmxlICogYTMsIGdkb3VibGUgKiBhNCkKK3sKKyAgZ2ludCBucCA9IGZpbHRlci0+cG9sZXMgLyAyOworICBnZG91YmxlIHJpcHBsZSA9IGZpbHRlci0+cmlwcGxlOworCisgIC8qIHBvbGUgbG9jYXRpb24gaW4gcy1wbGFuZSAqLworICBnZG91YmxlIHJwLCBpcDsKKworICAvKiB6ZXJvIGxvY2F0aW9uIGluIHMtcGxhbmUgKi8KKyAgZ2RvdWJsZSBpeiA9IDAuMDsKKworICAvKiB0cmFuc2ZlciBmdW5jdGlvbiBjb2VmZmljaWVudHMgZm9yIHRoZSB6LXBsYW5lICovCisgIGdkb3VibGUgeDAsIHgxLCB4MiwgeTEsIHkyOworICBnaW50IHR5cGUgPSBmaWx0ZXItPnR5cGU7CisKKyAgLyogQ2FsY3VsYXRlIHBvbGUgbG9jYXRpb24gZm9yIGxvd3Bhc3MgYXQgZnJlcXVlbmN5IDEgKi8KKyAgeworICAgIGdkb3VibGUgYW5nbGUgPSAoR19QSSAvIDIuMCkgKiAoMi4wICogcCAtIDEpIC8gbnA7CisKKyAgICBycCA9IC1zaW4gKGFuZ2xlKTsKKyAgICBpcCA9IGNvcyAoYW5nbGUpOworICB9CisKKyAgLyogSWYgd2UgYWxsb3cgcmlwcGxlLCBtb3ZlIHRoZSBwb2xlIGZyb20gdGhlIHVuaXQKKyAgICogY2lyY2xlIHRvIGFuIGVsbGlwc2UgYW5kIGtlZXAgY3V0b2ZmIGF0IGZyZXF1ZW5jeSAxICovCisgIGlmIChyaXBwbGUgPiAwICYmIHR5cGUgPT0gMSkgeworICAgIGdkb3VibGUgZXMsIHZ4OworCisgICAgZXMgPSBzcXJ0IChwb3cgKDEwLjAsIHJpcHBsZSAvIDEwLjApIC0gMS4wKTsKKworICAgIHZ4ID0gKDEuMCAvIG5wKSAqIGFzaW5oICgxLjAgLyBlcyk7CisgICAgcnAgPSBycCAqIHNpbmggKHZ4KTsKKyAgICBpcCA9IGlwICogY29zaCAodngpOworICB9IGVsc2UgaWYgKHR5cGUgPT0gMikgeworICAgIGdkb3VibGUgZXMsIHZ4OworCisgICAgZXMgPSBzcXJ0IChwb3cgKDEwLjAsIHJpcHBsZSAvIDEwLjApIC0gMS4wKTsKKyAgICB2eCA9ICgxLjAgLyBucCkgKiBhc2luaCAoZXMpOworICAgIHJwID0gcnAgKiBzaW5oICh2eCk7CisgICAgaXAgPSBpcCAqIGNvc2ggKHZ4KTsKKyAgfQorCisgIC8qIENhbGN1bGF0ZSBpbnZlcnNlIG9mIHRoZSBwb2xlIGxvY2F0aW9uIHRvIG1vdmUgZnJvbQorICAgKiB0eXBlIEkgdG8gdHlwZSBJSSAqLworICBpZiAodHlwZSA9PSAyKSB7CisgICAgZ2RvdWJsZSBtYWcyID0gcnAgKiBycCArIGlwICogaXA7CisKKyAgICBycCAvPSBtYWcyOworICAgIGlwIC89IG1hZzI7CisgIH0KKworICAvKiBDYWxjdWxhdGUgemVybyBsb2NhdGlvbiBmb3IgZnJlcXVlbmN5IDEgb24gdGhlCisgICAqIHVuaXQgY2lyY2xlIGZvciB0eXBlIDIgKi8KKyAgaWYgKHR5cGUgPT0gMikgeworICAgIGdkb3VibGUgYW5nbGUgPSBHX1BJIC8gKG5wICogMi4wKSArICgocCAtIDEpICogR19QSSkgLyAobnApOworICAgIGdkb3VibGUgbWFnMjsKKworICAgIGl6ID0gY29zIChhbmdsZSk7CisgICAgbWFnMiA9IGl6ICogaXo7CisgICAgaXogLz0gbWFnMjsKKyAgfQorCisgIC8qIENvbnZlcnQgZnJvbSBzLWRvbWFpbiB0byB6LWRvbWFpbiBieQorICAgKiB1c2luZyB0aGUgYmlsaW5lYXIgWi10cmFuc2Zvcm0sIGkuZS4KKyAgICogc3Vic3RpdHV0ZSBzIGJ5ICgyL3QpKigoei0xKS8oeisxKSkKKyAgICogd2l0aCB0ID0gMiAqIHRhbigwLjUpLgorICAgKi8KKyAgaWYgKHR5cGUgPT0gMSkgeworICAgIGdkb3VibGUgdCwgbSwgZDsKKworICAgIHQgPSAyLjAgKiB0YW4gKDAuNSk7CisgICAgbSA9IHJwICogcnAgKyBpcCAqIGlwOworICAgIGQgPSA0LjAgLSA0LjAgKiBycCAqIHQgKyBtICogdCAqIHQ7CisKKyAgICB4MCA9ICh0ICogdCkgLyBkOworICAgIHgxID0gMi4wICogeDA7CisgICAgeDIgPSB4MDsKKyAgICB5MSA9ICg4LjAgLSAyLjAgKiBtICogdCAqIHQpIC8gZDsKKyAgICB5MiA9ICgtNC4wIC0gNC4wICogcnAgKiB0IC0gbSAqIHQgKiB0KSAvIGQ7CisgIH0gZWxzZSB7CisgICAgZ2RvdWJsZSB0LCBtLCBkOworCisgICAgdCA9IDIuMCAqIHRhbiAoMC41KTsKKyAgICBtID0gcnAgKiBycCArIGlwICogaXA7CisgICAgZCA9IDQuMCAtIDQuMCAqIHJwICogdCArIG0gKiB0ICogdDsKKworICAgIHgwID0gKHQgKiB0ICogaXogKiBpeiArIDQuMCkgLyBkOworICAgIHgxID0gKC04LjAgKyAyLjAgKiBpeiAqIGl6ICogdCAqIHQpIC8gZDsKKyAgICB4MiA9IHgwOworICAgIHkxID0gKDguMCAtIDIuMCAqIG0gKiB0ICogdCkgLyBkOworICAgIHkyID0gKC00LjAgLSA0LjAgKiBycCAqIHQgLSBtICogdCAqIHQpIC8gZDsKKyAgfQorCisgIC8qIENvbnZlcnQgZnJvbSBsb3dwYXNzIGF0IGZyZXF1ZW5jeSAxIHRvIGVpdGhlciBiYW5kcGFzcworICAgKiBvciBiYW5kIHJlamVjdC4KKyAgICoKKyAgICogRm9yIGJhbmRwYXNzIHN1YnN0aXR1dGUgel4oLTEpIHdpdGg6CisgICAqCisgICAqICAgLTIgICAgICAgICAgICAtMQorICAgKiAteiAgICsgYWxwaGEgKiB6ICAgLSBiZXRhCisgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogICAgICAgICAtMiAgICAgICAgICAgIC0xCisgICAqIGJldGEgKiB6ICAgLSBhbHBoYSAqIHogICArIDEKKyAgICoKKyAgICogYWxwaGEgPSAoMiphKmIpLygxK2IpCisgICAqIGJldGEgPSAoYi0xKS8oYisxKQorICAgKiBhID0gY29zKCh3MSArIHcwKS8yKSAvIGNvcygodzEgLSB3MCkvMikKKyAgICogYiA9IHRhbigxLzIpICogY290KCh3MSAtIHcwKS8yKQorICAgKgorICAgKiBGb3IgYmFuZHJlamVjdCBzdWJzdGl0dXRlIHpeKC0xKSB3aXRoOgorICAgKiAKKyAgICogIC0yICAgICAgICAgICAgLTEKKyAgICogeiAgIC0gYWxwaGEgKiB6ICAgKyBiZXRhCisgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogICAgICAgICAtMiAgICAgICAgICAgIC0xCisgICAqIGJldGEgKiB6ICAgLSBhbHBoYSAqIHogICArIDEKKyAgICoKKyAgICogYWxwaGEgPSAoMiphKS8oMStiKQorICAgKiBiZXRhID0gKDEtYikvKDErYikKKyAgICogYSA9IGNvcygodzEgKyB3MCkvMikgLyBjb3MoKHcxIC0gdzApLzIpCisgICAqIGIgPSB0YW4oMS8yKSAqIHRhbigodzEgLSB3MCkvMikKKyAgICoKKyAgICovCisgIHsKKyAgICBnZG91YmxlIGEsIGIsIGQ7CisgICAgZ2RvdWJsZSBhbHBoYSwgYmV0YTsKKyAgICBnZG91YmxlIHcwID0gMi4wICogR19QSSAqIChmaWx0ZXItPmxvd2VyX2ZyZXF1ZW5jeSAvIHJhdGUpOworICAgIGdkb3VibGUgdzEgPSAyLjAgKiBHX1BJICogKGZpbHRlci0+dXBwZXJfZnJlcXVlbmN5IC8gcmF0ZSk7CisKKyAgICBpZiAoZmlsdGVyLT5tb2RlID09IE1PREVfQkFORF9QQVNTKSB7CisgICAgICBhID0gY29zICgodzEgKyB3MCkgLyAyLjApIC8gY29zICgodzEgLSB3MCkgLyAyLjApOworICAgICAgYiA9IHRhbiAoMS4wIC8gMi4wKSAvIHRhbiAoKHcxIC0gdzApIC8gMi4wKTsKKworICAgICAgYWxwaGEgPSAoMi4wICogYSAqIGIpIC8gKDEuMCArIGIpOworICAgICAgYmV0YSA9IChiIC0gMS4wKSAvIChiICsgMS4wKTsKKworICAgICAgZCA9IDEuMCArIGJldGEgKiAoeTEgLSBiZXRhICogeTIpOworCisgICAgICAqYjAgPSAoeDAgKyBiZXRhICogKC14MSArIGJldGEgKiB4MikpIC8gZDsKKyAgICAgICpiMSA9IChhbHBoYSAqICgtMi4wICogeDAgKyB4MSArIGJldGEgKiB4MSAtIDIuMCAqIGJldGEgKiB4MikpIC8gZDsKKyAgICAgICpiMiA9CisgICAgICAgICAgKC14MSAtIGJldGEgKiBiZXRhICogeDEgKyAyLjAgKiBiZXRhICogKHgwICsgeDIpICsKKyAgICAgICAgICBhbHBoYSAqIGFscGhhICogKHgwIC0geDEgKyB4MikpIC8gZDsKKyAgICAgICpiMyA9IChhbHBoYSAqICh4MSArIGJldGEgKiAoLTIuMCAqIHgwICsgeDEpIC0gMi4wICogeDIpKSAvIGQ7CisgICAgICAqYjQgPSAoYmV0YSAqIChiZXRhICogeDAgLSB4MSkgKyB4MikgLyBkOworICAgICAgKmExID0gKGFscGhhICogKDIuMCArIHkxICsgYmV0YSAqIHkxIC0gMi4wICogYmV0YSAqIHkyKSkgLyBkOworICAgICAgKmEyID0KKyAgICAgICAgICAoLXkxIC0gYmV0YSAqIGJldGEgKiB5MSAtIGFscGhhICogYWxwaGEgKiAoMS4wICsgeTEgLSB5MikgKworICAgICAgICAgIDIuMCAqIGJldGEgKiAoLTEuMCArIHkyKSkgLyBkOworICAgICAgKmEzID0gKGFscGhhICogKHkxICsgYmV0YSAqICgyLjAgKyB5MSkgLSAyLjAgKiB5MikpIC8gZDsKKyAgICAgICphNCA9ICgtYmV0YSAqIGJldGEgLSBiZXRhICogeTEgKyB5MikgLyBkOworICAgIH0gZWxzZSB7CisgICAgICBhID0gY29zICgodzEgKyB3MCkgLyAyLjApIC8gY29zICgodzEgLSB3MCkgLyAyLjApOworICAgICAgYiA9IHRhbiAoMS4wIC8gMi4wKSAqIHRhbiAoKHcxIC0gdzApIC8gMi4wKTsKKworICAgICAgYWxwaGEgPSAoMi4wICogYSkgLyAoMS4wICsgYik7CisgICAgICBiZXRhID0gKDEuMCAtIGIpIC8gKDEuMCArIGIpOworCisgICAgICBkID0gLTEuMCArIGJldGEgKiAoYmV0YSAqIHkyICsgeTEpOworCisgICAgICAqYjAgPSAoLXgwIC0gYmV0YSAqIHgxIC0gYmV0YSAqIGJldGEgKiB4MikgLyBkOworICAgICAgKmIxID0gKGFscGhhICogKDIuMCAqIHgwICsgeDEgKyBiZXRhICogeDEgKyAyLjAgKiBiZXRhICogeDIpKSAvIGQ7CisgICAgICAqYjIgPQorICAgICAgICAgICgteDEgLSBiZXRhICogYmV0YSAqIHgxIC0gMi4wICogYmV0YSAqICh4MCArIHgyKSAtCisgICAgICAgICAgYWxwaGEgKiBhbHBoYSAqICh4MCArIHgxICsgeDIpKSAvIGQ7CisgICAgICAqYjMgPSAoYWxwaGEgKiAoeDEgKyBiZXRhICogKDIuMCAqIHgwICsgeDEpICsgMi4wICogeDIpKSAvIGQ7CisgICAgICAqYjQgPSAoLWJldGEgKiBiZXRhICogeDAgLSBiZXRhICogeDEgLSB4MikgLyBkOworICAgICAgKmExID0gKGFscGhhICogKC0yLjAgKyB5MSArIGJldGEgKiB5MSArIDIuMCAqIGJldGEgKiB5MikpIC8gZDsKKyAgICAgICphMiA9CisgICAgICAgICAgLSh5MSArIGJldGEgKiBiZXRhICogeTEgKyAyLjAgKiBiZXRhICogKC0xLjAgKyB5MikgKworICAgICAgICAgIGFscGhhICogYWxwaGEgKiAoLTEuMCArIHkxICsgeTIpKSAvIGQ7CisgICAgICAqYTMgPSAoYWxwaGEgKiAoYmV0YSAqICgtMi4wICsgeTEpICsgeTEgKyAyLjAgKiB5MikpIC8gZDsKKyAgICAgICphNCA9IC0oLWJldGEgKiBiZXRhICsgYmV0YSAqIHkxICsgeTIpIC8gZDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dlbmVyYXRlX2NvZWZmaWNpZW50cyAoR3N0QXVkaW9DaGViQmFuZCAqIGZpbHRlciwgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgZ2ludCByYXRlOworCisgIGlmIChpbmZvKSB7CisgICAgcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKGluZm8pOworICB9IGVsc2UgeworICAgIHJhdGUgPSBHU1RfQVVESU9fRklMVEVSX1JBVEUgKGZpbHRlcik7CisgIH0KKworICBpZiAocmF0ZSA9PSAwKSB7CisgICAgZ2RvdWJsZSAqYSA9IGdfbmV3MCAoZ2RvdWJsZSwgMSk7CisgICAgZ2RvdWJsZSAqYiA9IGdfbmV3MCAoZ2RvdWJsZSwgMSk7CisKKyAgICBhWzBdID0gMS4wOworICAgIGJbMF0gPSAxLjA7CisgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9zZXRfY29lZmZpY2llbnRzIChHU1RfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSCisgICAgICAgIChmaWx0ZXIpLCBhLCAxLCBiLCAxKTsKKyAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAicmF0ZSB3YXMgbm90IHNldCB5ZXQiKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoZmlsdGVyLT51cHBlcl9mcmVxdWVuY3kgPD0gZmlsdGVyLT5sb3dlcl9mcmVxdWVuY3kpIHsKKyAgICBnZG91YmxlICphID0gZ19uZXcwIChnZG91YmxlLCAxKTsKKyAgICBnZG91YmxlICpiID0gZ19uZXcwIChnZG91YmxlLCAxKTsKKworICAgIGFbMF0gPSAxLjA7CisgICAgYlswXSA9IChmaWx0ZXItPm1vZGUgPT0gTU9ERV9CQU5EX1BBU1MpID8gMC4wIDogMS4wOworICAgIGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfc2V0X2NvZWZmaWNpZW50cyAoR1NUX0FVRElPX0ZYX0JBU0VfSUlSX0ZJTFRFUgorICAgICAgICAoZmlsdGVyKSwgYSwgMSwgYiwgMSk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiZnJlcXVlbmN5IGJhbmQgaGFkIG5vIG9yIG5lZ2F0aXZlIGRpbWVuc2lvbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChmaWx0ZXItPnVwcGVyX2ZyZXF1ZW5jeSA+IHJhdGUgLyAyKSB7CisgICAgZmlsdGVyLT51cHBlcl9mcmVxdWVuY3kgPSByYXRlIC8gMjsKKyAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiY2xpcHBlZCB1cHBlciBmcmVxdWVuY3kgdG8gbnlxdWlzdCBmcmVxdWVuY3kiKTsKKyAgfQorCisgIGlmIChmaWx0ZXItPmxvd2VyX2ZyZXF1ZW5jeSA8IDAuMCkgeworICAgIGZpbHRlci0+bG93ZXJfZnJlcXVlbmN5ID0gMC4wOworICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICJjbGlwcGVkIGxvd2VyIGZyZXF1ZW5jeSB0byAwLjAiKTsKKyAgfQorCisgIC8qIENhbGN1bGF0ZSBjb2VmZmljaWVudHMgZm9yIHRoZSBjaGVieXNoZXYgZmlsdGVyICovCisgIHsKKyAgICBnaW50IG5wID0gZmlsdGVyLT5wb2xlczsKKyAgICBnZG91YmxlICphLCAqYjsKKyAgICBnaW50IGksIHA7CisKKyAgICBhID0gZ19uZXcwIChnZG91YmxlLCBucCArIDUpOworICAgIGIgPSBnX25ldzAgKGdkb3VibGUsIG5wICsgNSk7CisKKyAgICAvKiBDYWxjdWxhdGUgdHJhbnNmZXIgZnVuY3Rpb24gY29lZmZpY2llbnRzICovCisgICAgYVs0XSA9IDEuMDsKKyAgICBiWzRdID0gMS4wOworCisgICAgZm9yIChwID0gMTsgcCA8PSBucCAvIDQ7IHArKykgeworICAgICAgZ2RvdWJsZSBiMCwgYjEsIGIyLCBiMywgYjQsIGExLCBhMiwgYTMsIGE0OworICAgICAgZ2RvdWJsZSAqdGEgPSBnX25ldzAgKGdkb3VibGUsIG5wICsgNSk7CisgICAgICBnZG91YmxlICp0YiA9IGdfbmV3MCAoZ2RvdWJsZSwgbnAgKyA1KTsKKworICAgICAgZ2VuZXJhdGVfYmlxdWFkX2NvZWZmaWNpZW50cyAoZmlsdGVyLCBwLCByYXRlLAorICAgICAgICAgICZiMCwgJmIxLCAmYjIsICZiMywgJmI0LCAmYTEsICZhMiwgJmEzLCAmYTQpOworCisgICAgICBtZW1jcHkgKHRhLCBhLCBzaXplb2YgKGdkb3VibGUpICogKG5wICsgNSkpOworICAgICAgbWVtY3B5ICh0YiwgYiwgc2l6ZW9mIChnZG91YmxlKSAqIChucCArIDUpKTsKKworICAgICAgLyogYWRkIHRoZSBuZXcgY29lZmZpY2llbnRzIGZvciB0aGUgbmV3IHR3byBwb2xlcworICAgICAgICogdG8gdGhlIGNhc2NhZGUgYnkgbXVsdGlwbGljYXRpb24gb2YgdGhlIHRyYW5zZmVyCisgICAgICAgKiBmdW5jdGlvbnMgKi8KKyAgICAgIGZvciAoaSA9IDQ7IGkgPCBucCArIDU7IGkrKykgeworICAgICAgICBiW2ldID0KKyAgICAgICAgICAgIGIwICogdGJbaV0gKyBiMSAqIHRiW2kgLSAxXSArIGIyICogdGJbaSAtIDJdICsgYjMgKiB0YltpIC0gM10gKworICAgICAgICAgICAgYjQgKiB0YltpIC0gNF07CisgICAgICAgIGFbaV0gPQorICAgICAgICAgICAgdGFbaV0gLSBhMSAqIHRhW2kgLSAxXSAtIGEyICogdGFbaSAtIDJdIC0gYTMgKiB0YVtpIC0gM10gLQorICAgICAgICAgICAgYTQgKiB0YVtpIC0gNF07CisgICAgICB9CisgICAgICBnX2ZyZWUgKHRhKTsKKyAgICAgIGdfZnJlZSAodGIpOworICAgIH0KKworICAgIC8qIE1vdmUgY29lZmZpY2llbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IHRvIG1vdmUgZnJvbQorICAgICAqIHRoZSB0cmFuc2ZlciBmdW5jdGlvbidzIGNvZWZmaWNpZW50cyB0byB0aGUgZGlmZmVyZW5jZQorICAgICAqIGVxdWF0aW9uJ3MgY29lZmZpY2llbnRzICovCisgICAgZm9yIChpID0gMDsgaSA8PSBucDsgaSsrKSB7CisgICAgICBhW2ldID0gYVtpICsgNF07CisgICAgICBiW2ldID0gYltpICsgNF07CisgICAgfQorCisgICAgLyogTm9ybWFsaXplIHRvIHVuaXR5IGdhaW4gYXQgZnJlcXVlbmN5IDAgYW5kIGZyZXF1ZW5jeQorICAgICAqIDAuNSBmb3IgYmFuZHJlamVjdCBhbmQgdW5pdHkgZ2FpbiBhdCBiYW5kIGNlbnRlciBmcmVxdWVuY3kKKyAgICAgKiBmb3IgYmFuZHBhc3MgKi8KKyAgICBpZiAoZmlsdGVyLT5tb2RlID09IE1PREVfQkFORF9SRUpFQ1QpIHsKKyAgICAgIC8qIGdhaW4gaXMgc3FydChIKDApKkgoMC41KSkgKi8KKworICAgICAgZ2RvdWJsZSBnYWluMSA9CisgICAgICAgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9jYWxjdWxhdGVfZ2FpbiAoYSwgbnAgKyAxLCBiLCBucCArIDEsCisgICAgICAgICAgMS4wLCAwLjApOworICAgICAgZ2RvdWJsZSBnYWluMiA9CisgICAgICAgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9jYWxjdWxhdGVfZ2FpbiAoYSwgbnAgKyAxLCBiLCBucCArIDEsCisgICAgICAgICAgLTEuMCwgMC4wKTsKKworICAgICAgZ2FpbjEgPSBzcXJ0IChnYWluMSAqIGdhaW4yKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8PSBucDsgaSsrKSB7CisgICAgICAgIGJbaV0gLz0gZ2FpbjE7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGdhaW4gaXMgSCh3YyksIHdjID0gY2VudGVyIGZyZXF1ZW5jeSAqLworCisgICAgICBnZG91YmxlIHcxID0gMi4wICogR19QSSAqIChmaWx0ZXItPmxvd2VyX2ZyZXF1ZW5jeSAvIHJhdGUpOworICAgICAgZ2RvdWJsZSB3MiA9IDIuMCAqIEdfUEkgKiAoZmlsdGVyLT51cHBlcl9mcmVxdWVuY3kgLyByYXRlKTsKKyAgICAgIGdkb3VibGUgdzAgPSAodzIgKyB3MSkgLyAyLjA7CisgICAgICBnZG91YmxlIHpyID0gY29zICh3MCksIHppID0gc2luICh3MCk7CisgICAgICBnZG91YmxlIGdhaW4gPQorICAgICAgICAgIGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfY2FsY3VsYXRlX2dhaW4gKGEsIG5wICsgMSwgYiwgbnAgKyAxLCB6ciwKKyAgICAgICAgICB6aSk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPD0gbnA7IGkrKykgeworICAgICAgICBiW2ldIC89IGdhaW47CisgICAgICB9CisgICAgfQorCisgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9zZXRfY29lZmZpY2llbnRzIChHU1RfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSCisgICAgICAgIChmaWx0ZXIpLCBhLCBucCArIDEsIGIsIG5wICsgMSk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLAorICAgICAgICAiR2VuZXJhdGVkIElJUiBjb2VmZmljaWVudHMgZm9yIHRoZSBDaGVieXNoZXYgZmlsdGVyIik7CisgICAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwKKyAgICAgICAgIm1vZGU6ICVzLCB0eXBlOiAlZCwgcG9sZXM6ICVkLCBsb3dlci1mcmVxdWVuY3k6ICUuMmYgSHosIHVwcGVyLWZyZXF1ZW5jeTogJS4yZiBIeiwgcmlwcGxlOiAlLjJmIGRCIiwKKyAgICAgICAgKGZpbHRlci0+bW9kZSA9PSBNT0RFX0JBTkRfUEFTUykgPyAiYmFuZC1wYXNzIiA6ICJiYW5kLXJlamVjdCIsCisgICAgICAgIGZpbHRlci0+dHlwZSwgZmlsdGVyLT5wb2xlcywgZmlsdGVyLT5sb3dlcl9mcmVxdWVuY3ksCisgICAgICAgIGZpbHRlci0+dXBwZXJfZnJlcXVlbmN5LCBmaWx0ZXItPnJpcHBsZSk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiJS4yZiBkQiBnYWluIEAgMEh6IiwKKyAgICAgICAgMjAuMCAqIGxvZzEwIChnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2NhbGN1bGF0ZV9nYWluIChhLCBucCArIDEsIGIsCisgICAgICAgICAgICAgICAgbnAgKyAxLCAxLjAsIDAuMCkpKTsKKyAgICB7CisgICAgICBnZG91YmxlIHcxID0gMi4wICogR19QSSAqIChmaWx0ZXItPmxvd2VyX2ZyZXF1ZW5jeSAvIHJhdGUpOworICAgICAgZ2RvdWJsZSB3MiA9IDIuMCAqIEdfUEkgKiAoZmlsdGVyLT51cHBlcl9mcmVxdWVuY3kgLyByYXRlKTsKKyAgICAgIGdkb3VibGUgdzAgPSAodzIgKyB3MSkgLyAyLjA7CisgICAgICBnZG91YmxlIHpyLCB6aTsKKworICAgICAgenIgPSBjb3MgKHcxKTsKKyAgICAgIHppID0gc2luICh3MSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiJS4yZiBkQiBnYWluIEAgJWRIeiIsCisgICAgICAgICAgMjAuMCAqIGxvZzEwIChnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2NhbGN1bGF0ZV9nYWluIChhLCBucCArIDEsCisgICAgICAgICAgICAgICAgICBiLCBucCArIDEsIHpyLCB6aSkpLCAoaW50KSBmaWx0ZXItPmxvd2VyX2ZyZXF1ZW5jeSk7CisgICAgICB6ciA9IGNvcyAodzApOworICAgICAgemkgPSBzaW4gKHcwKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICIlLjJmIGRCIGdhaW4gQCAlZEh6IiwKKyAgICAgICAgICAyMC4wICogbG9nMTAgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfY2FsY3VsYXRlX2dhaW4gKGEsIG5wICsgMSwKKyAgICAgICAgICAgICAgICAgIGIsIG5wICsgMSwgenIsIHppKSksCisgICAgICAgICAgKGludCkgKChmaWx0ZXItPmxvd2VyX2ZyZXF1ZW5jeSArIGZpbHRlci0+dXBwZXJfZnJlcXVlbmN5KSAvIDIuMCkpOworICAgICAgenIgPSBjb3MgKHcyKTsKKyAgICAgIHppID0gc2luICh3Mik7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiJS4yZiBkQiBnYWluIEAgJWRIeiIsCisgICAgICAgICAgMjAuMCAqIGxvZzEwIChnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2NhbGN1bGF0ZV9nYWluIChhLCBucCArIDEsCisgICAgICAgICAgICAgICAgICBiLCBucCArIDEsIHpyLCB6aSkpLCAoaW50KSBmaWx0ZXItPnVwcGVyX2ZyZXF1ZW5jeSk7CisgICAgfQorICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICIlLjJmIGRCIGdhaW4gQCAlZEh6IiwKKyAgICAgICAgMjAuMCAqIGxvZzEwIChnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2NhbGN1bGF0ZV9nYWluIChhLCBucCArIDEsIGIsCisgICAgICAgICAgICAgICAgbnAgKyAxLCAtMS4wLCAwLjApKSwgcmF0ZSAvIDIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fY2hlYl9iYW5kX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RBdWRpb0NoZWJCYW5kICpmaWx0ZXIgPSBHU1RfQVVESU9fQ0hFQl9CQU5EIChvYmplY3QpOworCisgIGdfbXV0ZXhfY2xlYXIgKCZmaWx0ZXItPmxvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19jaGViX2JhbmRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEF1ZGlvQ2hlYkJhbmQgKmZpbHRlciA9IEdTVF9BVURJT19DSEVCX0JBTkQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01PREU6CisgICAgICBnX211dGV4X2xvY2sgKCZmaWx0ZXItPmxvY2spOworICAgICAgZmlsdGVyLT5tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgZ2VuZXJhdGVfY29lZmZpY2llbnRzIChmaWx0ZXIsIE5VTEwpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZmaWx0ZXItPmxvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RZUEU6CisgICAgICBnX211dGV4X2xvY2sgKCZmaWx0ZXItPmxvY2spOworICAgICAgZmlsdGVyLT50eXBlID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnZW5lcmF0ZV9jb2VmZmljaWVudHMgKGZpbHRlciwgTlVMTCk7CisgICAgICBnX211dGV4X3VubG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTE9XRVJfRlJFUVVFTkNZOgorICAgICAgZ19tdXRleF9sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGZpbHRlci0+bG93ZXJfZnJlcXVlbmN5ID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGdlbmVyYXRlX2NvZWZmaWNpZW50cyAoZmlsdGVyLCBOVUxMKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VUFBFUl9GUkVRVUVOQ1k6CisgICAgICBnX211dGV4X2xvY2sgKCZmaWx0ZXItPmxvY2spOworICAgICAgZmlsdGVyLT51cHBlcl9mcmVxdWVuY3kgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgZ2VuZXJhdGVfY29lZmZpY2llbnRzIChmaWx0ZXIsIE5VTEwpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZmaWx0ZXItPmxvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JJUFBMRToKKyAgICAgIGdfbXV0ZXhfbG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBmaWx0ZXItPnJpcHBsZSA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisgICAgICBnZW5lcmF0ZV9jb2VmZmljaWVudHMgKGZpbHRlciwgTlVMTCk7CisgICAgICBnX211dGV4X3VubG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUE9MRVM6CisgICAgICBnX211dGV4X2xvY2sgKCZmaWx0ZXItPmxvY2spOworICAgICAgZmlsdGVyLT5wb2xlcyA9IEdTVF9ST1VORF9VUF80IChnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKSk7CisgICAgICBnZW5lcmF0ZV9jb2VmZmljaWVudHMgKGZpbHRlciwgTlVMTCk7CisgICAgICBnX211dGV4X3VubG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fY2hlYl9iYW5kX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb0NoZWJCYW5kICpmaWx0ZXIgPSBHU1RfQVVESU9fQ0hFQl9CQU5EIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGZpbHRlci0+bW9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVFlQRToKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGZpbHRlci0+dHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTE9XRVJfRlJFUVVFTkNZOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBmaWx0ZXItPmxvd2VyX2ZyZXF1ZW5jeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVBQRVJfRlJFUVVFTkNZOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBmaWx0ZXItPnVwcGVyX2ZyZXF1ZW5jeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUklQUExFOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBmaWx0ZXItPnJpcHBsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUE9MRVM6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBmaWx0ZXItPnBvbGVzKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogR3N0QXVkaW9GaWx0ZXIgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworc3RhdGljIGdib29sZWFuCitnc3RfYXVkaW9fY2hlYl9iYW5kX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGJhc2UsIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIEdzdEF1ZGlvQ2hlYkJhbmQgKmZpbHRlciA9IEdTVF9BVURJT19DSEVCX0JBTkQgKGJhc2UpOworCisgIGdlbmVyYXRlX2NvZWZmaWNpZW50cyAoZmlsdGVyLCBpbmZvKTsKKworICByZXR1cm4gR1NUX0FVRElPX0ZJTFRFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2V0dXAgKGJhc2UsIGluZm8pOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5oIGIvZ3N0L2F1ZGlvZngvYXVkaW9jaGViYmFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YmRhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2NoZWJiYW5kLmgKQEAgLTAsMCArMSw2NCBAQAorLyogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQVVESU9fQ0hFQl9CQU5EX0hfXworI2RlZmluZSBfX0dTVF9BVURJT19DSEVCX0JBTkRfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2ZpbHRlci5oPgorCisjaW5jbHVkZSAiYXVkaW9meGJhc2VpaXJmaWx0ZXIuaCIKKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9BVURJT19DSEVCX0JBTkQgICAgICAgICAgICAoZ3N0X2F1ZGlvX2NoZWJfYmFuZF9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVVESU9fQ0hFQl9CQU5EKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVVESU9fQ0hFQl9CQU5ELEdzdEF1ZGlvQ2hlYkJhbmQpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fQ0hFQl9CQU5EKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVVESU9fQ0hFQl9CQU5EKSkKKyNkZWZpbmUgR1NUX0FVRElPX0NIRUJfQkFORF9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcykgLEdTVF9UWVBFX0FVRElPX0NIRUJfQkFORCxHc3RBdWRpb0NoZWJCYW5kQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fQ0hFQl9CQU5EX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSAsR1NUX1RZUEVfQVVESU9fQ0hFQl9CQU5EKSkKKyNkZWZpbmUgR1NUX0FVRElPX0NIRUJfQkFORF9HRVRfQ0xBU1Mob2JqKSAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MoKG9iaikgLEdTVF9UWVBFX0FVRElPX0NIRUJfQkFORCxHc3RBdWRpb0NoZWJCYW5kQ2xhc3MpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1ZGlvQ2hlYkJhbmQgR3N0QXVkaW9DaGViQmFuZDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdWRpb0NoZWJCYW5kQ2xhc3MgR3N0QXVkaW9DaGViQmFuZENsYXNzOworCitzdHJ1Y3QgX0dzdEF1ZGlvQ2hlYkJhbmQKK3sKKyAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXIgcGFyZW50OworCisgIGdpbnQgbW9kZTsKKyAgZ2ludCB0eXBlOworICBnaW50IHBvbGVzOworICBnZmxvYXQgbG93ZXJfZnJlcXVlbmN5OworICBnZmxvYXQgdXBwZXJfZnJlcXVlbmN5OworICBnZmxvYXQgcmlwcGxlOworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIEdNdXRleCBsb2NrOworfTsKKworc3RydWN0IF9Hc3RBdWRpb0NoZWJCYW5kQ2xhc3MKK3sKKyAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJDbGFzcyBwYXJlbnQ7Cit9OworCitHVHlwZSBnc3RfYXVkaW9fY2hlYl9iYW5kX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9BVURJT19DSEVCX0JBTkRfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5jIGIvZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjc4ODg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuYwpAQCAtMCwwICsxLDU3NCBAQAorLyogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIAorICogQ2hlYnlzaGV2IHR5cGUgMSBmaWx0ZXIgZGVzaWduIGJhc2VkIG9uCisgKiAiVGhlIFNjaWVudGlzdCBhbmQgRW5naW5lZXIncyBHdWlkZSB0byBEU1AiLCBDaGFwdGVyIDIwLgorICogaHR0cDovL3d3dy5kc3BndWlkZS5jb20vCisgKgorICogRm9yIHR5cGUgMiBhbmQgQ2hlYnlzaGV2IGZpbHRlcnMgaW4gZ2VuZXJhbCByZWFkCisgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NoZWJ5c2hldl9maWx0ZXIKKyAqCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXVkaW9jaGVibGltaXQKKyAqCisgKiBBdHRlbnVhdGVzIGFsbCBmcmVxdWVuY2llcyBhYm92ZSB0aGUgY3V0b2ZmIGZyZXF1ZW5jeSAobG93LXBhc3MpIG9yIGFsbCBmcmVxdWVuY2llcyBiZWxvdyB0aGUKKyAqIGN1dG9mZiBmcmVxdWVuY3kgKGhpZ2gtcGFzcykuIFRoZSBudW1iZXIgb2YgcG9sZXMgYW5kIHRoZSByaXBwbGUgcGFyYW1ldGVyIGNvbnRyb2wgdGhlIHJvbGxvZmYuCisgKgorICogVGhpcyBlbGVtZW50IGhhcyB0aGUgYWR2YW50YWdlIG92ZXIgdGhlIHdpbmRvd2VkIHNpbmMgbG93cGFzcyBhbmQgaGlnaHBhc3MgZmlsdGVyIHRoYXQgaXQgaXMKKyAqIG11Y2ggZmFzdGVyIGFuZCBwcm9kdWNlcyBhbG1vc3QgYXMgZ29vZCByZXN1bHRzLiBJdCdzIG9ubHkgZGlzYWR2YW50YWdlcyBhcmUgdGhlIGhpZ2hseQorICogbm9uLWxpbmVhciBwaGFzZSBhbmQgdGhlIHNsb3dlciByb2xsb2ZmIGNvbXBhcmVkIHRvIGEgd2luZG93ZWQgc2luYyBmaWx0ZXIgd2l0aCBhIGxhcmdlIGtlcm5lbC4KKyAqCisgKiBGb3IgdHlwZSAxIHRoZSByaXBwbGUgcGFyYW1ldGVyIHNwZWNpZmllcyBob3cgbXVjaCByaXBwbGUgaW4gZEIgaXMgYWxsb3dlZCBpbiB0aGUgcGFzc2JhbmQsIGkuZS4KKyAqIHNvbWUgZnJlcXVlbmNpZXMgaW4gdGhlIHBhc3NiYW5kIHdpbGwgYmUgYW1wbGlmaWVkIGJ5IHRoYXQgdmFsdWUuIEEgaGlnaGVyIHJpcHBsZSB2YWx1ZSB3aWxsIGFsbG93CisgKiBhIGZhc3RlciByb2xsb2ZmLgorICoKKyAqIEZvciB0eXBlIDIgdGhlIHJpcHBsZSBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBzdG9wYmFuZCBhdHRlbnVhdGlvbi4gSW4gdGhlIHN0b3BiYW5kIHRoZSBnYWluIHdpbGwKKyAqIGJlIGF0IG1vc3QgdGhpcyB2YWx1ZS4gQSBsb3dlciByaXBwbGUgdmFsdWUgd2lsbCBhbGxvdyBhIGZhc3RlciByb2xsb2ZmLgorICoKKyAqIEFzIGEgc3BlY2lhbCBjYXNlLCBhIENoZWJ5c2hldiB0eXBlIDEgZmlsdGVyIHdpdGggbm8gcmlwcGxlIGlzIGEgQnV0dGVyd29ydGggZmlsdGVyLgorICoKKyAqIDxub3RlPjxwYXJhPgorICogQmUgd2FybmVkIHRoYXQgYSB0b28gbGFyZ2UgbnVtYmVyIG9mIHBvbGVzIGNhbiBwcm9kdWNlIG5vaXNlLiBUaGUgbW9zdCBwb2xlcyBhcmUgcG9zc2libGUgd2l0aAorICogYSBjdXRvZmYgZnJlcXVlbmN5IGF0IGEgcXVhcnRlciBvZiB0aGUgc2FtcGxpbmcgcmF0ZS4KKyAqIDwvcGFyYT48L25vdGU+CisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyBmcmVxPTE1MDAgISBhdWRpb2NvbnZlcnQgISBhdWRpb2NoZWJsaW1pdCBtb2RlPWxvdy1wYXNzIGN1dG9mZj0xMDAwIHBvbGVzPTQgISBhdWRpb2NvbnZlcnQgISBhbHNhc2luaworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj0ibWVsbzEub2dnIiAhIG9nZ2RlbXV4ICEgdm9yYmlzZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9jaGVibGltaXQgbW9kZT1oaWdoLXBhc3MgY3V0b2ZmPTQwMCByaXBwbGU9MC4yICEgYXVkaW9jb252ZXJ0ICEgYWxzYXNpbmsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyB3YXZlPXdoaXRlLW5vaXNlICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9jaGVibGltaXQgbW9kZT1sb3ctcGFzcyBjdXRvZmY9ODAwIHR5cGU9MiAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJtYXRoX2NvbXBhdC5oIgorCisjaW5jbHVkZSAiYXVkaW9jaGVibGltaXQuaCIKKworI2luY2x1ZGUgImdzdC9nbGliLWNvbXBhdC1wcml2YXRlLmgiCisKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9hdWRpb19jaGViX2xpbWl0X2RlYnVnCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChHU1RfQ0FUX0RFRkFVTFQpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9NT0RFLAorICBQUk9QX1RZUEUsCisgIFBST1BfQ1VUT0ZGLAorICBQUk9QX1JJUFBMRSwKKyAgUFJPUF9QT0xFUworfTsKKworI2RlZmluZSBnc3RfYXVkaW9fY2hlYl9saW1pdF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RBdWRpb0NoZWJMaW1pdCwKKyAgICBnc3RfYXVkaW9fY2hlYl9saW1pdCwgR1NUX1RZUEVfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSKTsKKworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2NoZWJfbGltaXRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2NoZWJfbGltaXRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2NoZWJfbGltaXRfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F1ZGlvX2NoZWJfbGltaXRfc2V0dXAgKEdzdEF1ZGlvRmlsdGVyICogZmlsdGVyLAorICAgIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pOworCitlbnVtCit7CisgIE1PREVfTE9XX1BBU1MgPSAwLAorICBNT0RFX0hJR0hfUEFTUworfTsKKworI2RlZmluZSBHU1RfVFlQRV9BVURJT19DSEVCWVNIRVZfRlJFUV9MSU1JVF9NT0RFIChnc3RfYXVkaW9fY2hlYl9saW1pdF9tb2RlX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfYXVkaW9fY2hlYl9saW1pdF9tb2RlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZ3R5cGUgPSAwOworCisgIGlmIChndHlwZSA9PSAwKSB7CisgICAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAgICB7TU9ERV9MT1dfUEFTUywgIkxvdyBwYXNzIChkZWZhdWx0KSIsCisgICAgICAgICAgImxvdy1wYXNzIn0sCisgICAgICB7TU9ERV9ISUdIX1BBU1MsICJIaWdoIHBhc3MiLAorICAgICAgICAgICJoaWdoLXBhc3MifSwKKyAgICAgIHswLCBOVUxMLCBOVUxMfQorICAgIH07CisKKyAgICBndHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RBdWRpb0NoZWJMaW1pdE1vZGUiLCB2YWx1ZXMpOworICB9CisgIHJldHVybiBndHlwZTsKK30KKworLyogR09iamVjdCB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2NoZWJfbGltaXRfY2xhc3NfaW5pdCAoR3N0QXVkaW9DaGViTGltaXRDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RBdWRpb0ZpbHRlckNsYXNzICpmaWx0ZXJfY2xhc3MgPSAoR3N0QXVkaW9GaWx0ZXJDbGFzcyAqKSBrbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X2F1ZGlvX2NoZWJfbGltaXRfZGVidWcsICJhdWRpb2NoZWJsaW1pdCIsIDAsCisgICAgICAiYXVkaW9jaGVibGltaXQgZWxlbWVudCIpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb19jaGViX2xpbWl0X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2F1ZGlvX2NoZWJfbGltaXRfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9hdWRpb19jaGViX2xpbWl0X2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgibW9kZSIsICJNb2RlIiwKKyAgICAgICAgICAiTG93IHBhc3Mgb3IgaGlnaCBwYXNzIG1vZGUiLAorICAgICAgICAgIEdTVF9UWVBFX0FVRElPX0NIRUJZU0hFVl9GUkVRX0xJTUlUX01PREUsIE1PREVfTE9XX1BBU1MsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RZUEUsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgidHlwZSIsICJUeXBlIiwgIlR5cGUgb2YgdGhlIGNoZWJ5Y2hldiBmaWx0ZXIiLCAxLCAyLCAxLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKiBGSVhNRTogRG9uJ3QgdXNlIHRoZSBjb21wbGV0ZSBwb3NzaWJsZSByYW5nZSBidXQgcmVzdHJpY3QgdGhlIHVwcGVyIGJvdW5kYXJ5CisgICAqIHNvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIFVJcyBjYW4gdXNlIGEgc2xpZGVyIHdpdGhvdXQgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DVVRPRkYsCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJjdXRvZmYiLCAiQ3V0b2ZmIiwgIkN1dCBvZmYgZnJlcXVlbmN5IChIeikiLCAwLjAsCisgICAgICAgICAgMTAwMDAwLjAsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUklQUExFLAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgicmlwcGxlIiwgIlJpcHBsZSIsICJBbW91bnQgb2YgcmlwcGxlIChkQikiLCAwLjAsCisgICAgICAgICAgMjAwLjAsIDAuMjUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qIEZJWE1FOiBXaGF0IHRvIGRvIGFib3V0IHRoaXMgdXBwZXIgYm91bmRhcnk/IFdpdGggYSBjdXRvZmYgZnJlcXVlbmN5IG9mCisgICAqIHJhdGUvNCAzMiBwb2xlcyBhcmUgY29tcGxldGVseSBwb3NzaWJsZSwgd2l0aCBhIGN1dG9mZiBmcmVxdWVuY3kgdmVyeSBsb3cKKyAgICogb3IgdmVyeSBoaWdoIDE2IHBvbGVzIGFscmVhZHkgcHJvZHVjZXMgb25seSBub2lzZSAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BPTEVTLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInBvbGVzIiwgIlBvbGVzIiwKKyAgICAgICAgICAiTnVtYmVyIG9mIHBvbGVzIHRvIHVzZSwgd2lsbCBiZSByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IGV2ZW4gbnVtYmVyIiwKKyAgICAgICAgICAyLCAzMiwgNCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJMb3cgcGFzcyAmIGhpZ2ggcGFzcyBmaWx0ZXIiLAorICAgICAgIkZpbHRlci9FZmZlY3QvQXVkaW8iLAorICAgICAgIkNoZWJ5c2hldiBsb3cgcGFzcyBhbmQgaGlnaCBwYXNzIGZpbHRlciIsCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZmlsdGVyX2NsYXNzLT5zZXR1cCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9fY2hlYl9saW1pdF9zZXR1cCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fY2hlYl9saW1pdF9pbml0IChHc3RBdWRpb0NoZWJMaW1pdCAqIGZpbHRlcikKK3sKKyAgZmlsdGVyLT5jdXRvZmYgPSAwLjA7CisgIGZpbHRlci0+bW9kZSA9IE1PREVfTE9XX1BBU1M7CisgIGZpbHRlci0+dHlwZSA9IDE7CisgIGZpbHRlci0+cG9sZXMgPSA0OworICBmaWx0ZXItPnJpcHBsZSA9IDAuMjU7CisKKyAgZ19tdXRleF9pbml0ICgmZmlsdGVyLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2dlbmVyYXRlX2JpcXVhZF9jb2VmZmljaWVudHMgKEdzdEF1ZGlvQ2hlYkxpbWl0ICogZmlsdGVyLAorICAgIGdpbnQgcCwgZ2ludCByYXRlLCBnZG91YmxlICogYjAsIGdkb3VibGUgKiBiMSwgZ2RvdWJsZSAqIGIyLAorICAgIGdkb3VibGUgKiBhMSwgZ2RvdWJsZSAqIGEyKQoreworICBnaW50IG5wID0gZmlsdGVyLT5wb2xlczsKKyAgZ2RvdWJsZSByaXBwbGUgPSBmaWx0ZXItPnJpcHBsZTsKKworICAvKiBwb2xlIGxvY2F0aW9uIGluIHMtcGxhbmUgKi8KKyAgZ2RvdWJsZSBycCwgaXA7CisKKyAgLyogemVybyBsb2NhdGlvbiBpbiBzLXBsYW5lICovCisgIGdkb3VibGUgaXogPSAwLjA7CisKKyAgLyogdHJhbnNmZXIgZnVuY3Rpb24gY29lZmZpY2llbnRzIGZvciB0aGUgei1wbGFuZSAqLworICBnZG91YmxlIHgwLCB4MSwgeDIsIHkxLCB5MjsKKyAgZ2ludCB0eXBlID0gZmlsdGVyLT50eXBlOworCisgIC8qIENhbGN1bGF0ZSBwb2xlIGxvY2F0aW9uIGZvciBsb3dwYXNzIGF0IGZyZXF1ZW5jeSAxICovCisgIHsKKyAgICBnZG91YmxlIGFuZ2xlID0gKEdfUEkgLyAyLjApICogKDIuMCAqIHAgLSAxKSAvIG5wOworCisgICAgcnAgPSAtc2luIChhbmdsZSk7CisgICAgaXAgPSBjb3MgKGFuZ2xlKTsKKyAgfQorCisgIC8qIElmIHdlIGFsbG93IHJpcHBsZSwgbW92ZSB0aGUgcG9sZSBmcm9tIHRoZSB1bml0CisgICAqIGNpcmNsZSB0byBhbiBlbGxpcHNlIGFuZCBrZWVwIGN1dG9mZiBhdCBmcmVxdWVuY3kgMSAqLworICBpZiAocmlwcGxlID4gMCAmJiB0eXBlID09IDEpIHsKKyAgICBnZG91YmxlIGVzLCB2eDsKKworICAgIGVzID0gc3FydCAocG93ICgxMC4wLCByaXBwbGUgLyAxMC4wKSAtIDEuMCk7CisKKyAgICB2eCA9ICgxLjAgLyBucCkgKiBhc2luaCAoMS4wIC8gZXMpOworICAgIHJwID0gcnAgKiBzaW5oICh2eCk7CisgICAgaXAgPSBpcCAqIGNvc2ggKHZ4KTsKKyAgfSBlbHNlIGlmICh0eXBlID09IDIpIHsKKyAgICBnZG91YmxlIGVzLCB2eDsKKworICAgIGVzID0gc3FydCAocG93ICgxMC4wLCByaXBwbGUgLyAxMC4wKSAtIDEuMCk7CisgICAgdnggPSAoMS4wIC8gbnApICogYXNpbmggKGVzKTsKKyAgICBycCA9IHJwICogc2luaCAodngpOworICAgIGlwID0gaXAgKiBjb3NoICh2eCk7CisgIH0KKworICAvKiBDYWxjdWxhdGUgaW52ZXJzZSBvZiB0aGUgcG9sZSBsb2NhdGlvbiB0byBjb252ZXJ0IGZyb20KKyAgICogdHlwZSBJIHRvIHR5cGUgSUkgKi8KKyAgaWYgKHR5cGUgPT0gMikgeworICAgIGdkb3VibGUgbWFnMiA9IHJwICogcnAgKyBpcCAqIGlwOworCisgICAgcnAgLz0gbWFnMjsKKyAgICBpcCAvPSBtYWcyOworICB9CisKKyAgLyogQ2FsY3VsYXRlIHplcm8gbG9jYXRpb24gZm9yIGZyZXF1ZW5jeSAxIG9uIHRoZQorICAgKiB1bml0IGNpcmNsZSBmb3IgdHlwZSAyICovCisgIGlmICh0eXBlID09IDIpIHsKKyAgICBnZG91YmxlIGFuZ2xlID0gR19QSSAvIChucCAqIDIuMCkgKyAoKHAgLSAxKSAqIEdfUEkpIC8gKG5wKTsKKyAgICBnZG91YmxlIG1hZzI7CisKKyAgICBpeiA9IGNvcyAoYW5nbGUpOworICAgIG1hZzIgPSBpeiAqIGl6OworICAgIGl6IC89IG1hZzI7CisgIH0KKworICAvKiBDb252ZXJ0IGZyb20gcy1kb21haW4gdG8gei1kb21haW4gYnkKKyAgICogdXNpbmcgdGhlIGJpbGluZWFyIFotdHJhbnNmb3JtLCBpLmUuCisgICAqIHN1YnN0aXR1dGUgcyBieSAoMi90KSooKHotMSkvKHorMSkpCisgICAqIHdpdGggdCA9IDIgKiB0YW4oMC41KS4KKyAgICovCisgIGlmICh0eXBlID09IDEpIHsKKyAgICBnZG91YmxlIHQsIG0sIGQ7CisKKyAgICB0ID0gMi4wICogdGFuICgwLjUpOworICAgIG0gPSBycCAqIHJwICsgaXAgKiBpcDsKKyAgICBkID0gNC4wIC0gNC4wICogcnAgKiB0ICsgbSAqIHQgKiB0OworCisgICAgeDAgPSAodCAqIHQpIC8gZDsKKyAgICB4MSA9IDIuMCAqIHgwOworICAgIHgyID0geDA7CisgICAgeTEgPSAoOC4wIC0gMi4wICogbSAqIHQgKiB0KSAvIGQ7CisgICAgeTIgPSAoLTQuMCAtIDQuMCAqIHJwICogdCAtIG0gKiB0ICogdCkgLyBkOworICB9IGVsc2UgeworICAgIGdkb3VibGUgdCwgbSwgZDsKKworICAgIHQgPSAyLjAgKiB0YW4gKDAuNSk7CisgICAgbSA9IHJwICogcnAgKyBpcCAqIGlwOworICAgIGQgPSA0LjAgLSA0LjAgKiBycCAqIHQgKyBtICogdCAqIHQ7CisKKyAgICB4MCA9ICh0ICogdCAqIGl6ICogaXogKyA0LjApIC8gZDsKKyAgICB4MSA9ICgtOC4wICsgMi4wICogaXogKiBpeiAqIHQgKiB0KSAvIGQ7CisgICAgeDIgPSB4MDsKKyAgICB5MSA9ICg4LjAgLSAyLjAgKiBtICogdCAqIHQpIC8gZDsKKyAgICB5MiA9ICgtNC4wIC0gNC4wICogcnAgKiB0IC0gbSAqIHQgKiB0KSAvIGQ7CisgIH0KKworICAvKiBDb252ZXJ0IGZyb20gbG93cGFzcyBhdCBmcmVxdWVuY3kgMSB0byBlaXRoZXIgbG93cGFzcworICAgKiBvciBoaWdocGFzcy4KKyAgICoKKyAgICogRm9yIGxvd3Bhc3Mgc3Vic3RpdHV0ZSB6XigtMSkgd2l0aDoKKyAgICogIC0xCisgICAqIHogICAtIGsKKyAgICogLS0tLS0tLS0tLS0tCisgICAqICAgICAgICAgIC0xCisgICAqIDEgLSBrICogegorICAgKgorICAgKiBrID0gc2luKCgxLXcpLzIpIC8gc2luKCgxK3cpLzIpCisgICAqCisgICAqIEZvciBoaWdocGFzcyBzdWJzdGl0dXRlIHpeKC0xKSB3aXRoOgorICAgKgorICAgKiAgIC0xCisgICAqIC16ICAgLSBrCisgICAqIC0tLS0tLS0tLS0tLQorICAgKiAgICAgICAgICAtMQorICAgKiAxICsgayAqIHoKKyAgICoKKyAgICogayA9IC1jb3MoKDErdykvMikgLyBjb3MoKDEtdykvMikKKyAgICoKKyAgICovCisgIHsKKyAgICBnZG91YmxlIGssIGQ7CisgICAgZ2RvdWJsZSBvbWVnYSA9IDIuMCAqIEdfUEkgKiAoZmlsdGVyLT5jdXRvZmYgLyByYXRlKTsKKworICAgIGlmIChmaWx0ZXItPm1vZGUgPT0gTU9ERV9MT1dfUEFTUykKKyAgICAgIGsgPSBzaW4gKCgxLjAgLSBvbWVnYSkgLyAyLjApIC8gc2luICgoMS4wICsgb21lZ2EpIC8gMi4wKTsKKyAgICBlbHNlCisgICAgICBrID0gLWNvcyAoKG9tZWdhICsgMS4wKSAvIDIuMCkgLyBjb3MgKChvbWVnYSAtIDEuMCkgLyAyLjApOworCisgICAgZCA9IDEuMCArIHkxICogayAtIHkyICogayAqIGs7CisgICAgKmIwID0gKHgwICsgayAqICgteDEgKyBrICogeDIpKSAvIGQ7CisgICAgKmIxID0gKHgxICsgayAqIGsgKiB4MSAtIDIuMCAqIGsgKiAoeDAgKyB4MikpIC8gZDsKKyAgICAqYjIgPSAoeDAgKiBrICogayAtIHgxICogayArIHgyKSAvIGQ7CisgICAgKmExID0gKDIuMCAqIGsgKyB5MSArIHkxICogayAqIGsgLSAyLjAgKiB5MiAqIGspIC8gZDsKKyAgICAqYTIgPSAoLWsgKiBrIC0geTEgKiBrICsgeTIpIC8gZDsKKworICAgIGlmIChmaWx0ZXItPm1vZGUgPT0gTU9ERV9ISUdIX1BBU1MpIHsKKyAgICAgICphMSA9IC0qYTE7CisgICAgICAqYjEgPSAtKmIxOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ2VuZXJhdGVfY29lZmZpY2llbnRzIChHc3RBdWRpb0NoZWJMaW1pdCAqIGZpbHRlciwgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgZ2ludCByYXRlOworCisgIGlmIChpbmZvKSB7CisgICAgcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKGluZm8pOworICB9IGVsc2UgeworICAgIHJhdGUgPSBHU1RfQVVESU9fRklMVEVSX1JBVEUgKGZpbHRlcik7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiY3V0b2ZmICVmIiwgZmlsdGVyLT5jdXRvZmYpOworCisgIGlmIChyYXRlID09IDApIHsKKyAgICBnZG91YmxlICphID0gZ19uZXcwIChnZG91YmxlLCAxKTsKKyAgICBnZG91YmxlICpiID0gZ19uZXcwIChnZG91YmxlLCAxKTsKKworICAgIGFbMF0gPSAxLjA7CisgICAgYlswXSA9IDEuMDsKKyAgICBnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX3NldF9jb2VmZmljaWVudHMgKEdTVF9BVURJT19GWF9CQVNFX0lJUl9GSUxURVIKKyAgICAgICAgKGZpbHRlciksIGEsIDEsIGIsIDEpOworCisgICAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwgInJhdGUgd2FzIG5vdCBzZXQgeWV0Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGZpbHRlci0+Y3V0b2ZmID49IHJhdGUgLyAyLjApIHsKKyAgICBnZG91YmxlICphID0gZ19uZXcwIChnZG91YmxlLCAxKTsKKyAgICBnZG91YmxlICpiID0gZ19uZXcwIChnZG91YmxlLCAxKTsKKworICAgIGFbMF0gPSAxLjA7CisgICAgYlswXSA9IChmaWx0ZXItPm1vZGUgPT0gTU9ERV9MT1dfUEFTUykgPyAxLjAgOiAwLjA7CisgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9zZXRfY29lZmZpY2llbnRzIChHU1RfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSCisgICAgICAgIChmaWx0ZXIpLCBhLCAxLCBiLCAxKTsKKyAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiY3V0b2ZmIHdhcyBoaWdoZXIgdGhhbiBueXF1aXN0IGZyZXF1ZW5jeSIpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmIChmaWx0ZXItPmN1dG9mZiA8PSAwLjApIHsKKyAgICBnZG91YmxlICphID0gZ19uZXcwIChnZG91YmxlLCAxKTsKKyAgICBnZG91YmxlICpiID0gZ19uZXcwIChnZG91YmxlLCAxKTsKKworICAgIGFbMF0gPSAxLjA7CisgICAgYlswXSA9IChmaWx0ZXItPm1vZGUgPT0gTU9ERV9MT1dfUEFTUykgPyAwLjAgOiAxLjA7CisgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9zZXRfY29lZmZpY2llbnRzIChHU1RfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSCisgICAgICAgIChmaWx0ZXIpLCBhLCAxLCBiLCAxKTsKKyAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiY3V0b2ZmIGlzIGxvd2VyIHRoYW4gemVybyIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIENhbGN1bGF0ZSBjb2VmZmljaWVudHMgZm9yIHRoZSBjaGVieXNoZXYgZmlsdGVyICovCisgIHsKKyAgICBnaW50IG5wID0gZmlsdGVyLT5wb2xlczsKKyAgICBnZG91YmxlICphLCAqYjsKKyAgICBnaW50IGksIHA7CisKKyAgICBhID0gZ19uZXcwIChnZG91YmxlLCBucCArIDMpOworICAgIGIgPSBnX25ldzAgKGdkb3VibGUsIG5wICsgMyk7CisKKyAgICAvKiBDYWxjdWxhdGUgdHJhbnNmZXIgZnVuY3Rpb24gY29lZmZpY2llbnRzICovCisgICAgYVsyXSA9IDEuMDsKKyAgICBiWzJdID0gMS4wOworCisgICAgZm9yIChwID0gMTsgcCA8PSBucCAvIDI7IHArKykgeworICAgICAgZ2RvdWJsZSBiMCwgYjEsIGIyLCBhMSwgYTI7CisgICAgICBnZG91YmxlICp0YSA9IGdfbmV3MCAoZ2RvdWJsZSwgbnAgKyAzKTsKKyAgICAgIGdkb3VibGUgKnRiID0gZ19uZXcwIChnZG91YmxlLCBucCArIDMpOworCisgICAgICBnZW5lcmF0ZV9iaXF1YWRfY29lZmZpY2llbnRzIChmaWx0ZXIsIHAsIHJhdGUsICZiMCwgJmIxLCAmYjIsICZhMSwgJmEyKTsKKworICAgICAgbWVtY3B5ICh0YSwgYSwgc2l6ZW9mIChnZG91YmxlKSAqIChucCArIDMpKTsKKyAgICAgIG1lbWNweSAodGIsIGIsIHNpemVvZiAoZ2RvdWJsZSkgKiAobnAgKyAzKSk7CisKKyAgICAgIC8qIGFkZCB0aGUgbmV3IGNvZWZmaWNpZW50cyBmb3IgdGhlIG5ldyB0d28gcG9sZXMKKyAgICAgICAqIHRvIHRoZSBjYXNjYWRlIGJ5IG11bHRpcGxpY2F0aW9uIG9mIHRoZSB0cmFuc2ZlcgorICAgICAgICogZnVuY3Rpb25zICovCisgICAgICBmb3IgKGkgPSAyOyBpIDwgbnAgKyAzOyBpKyspIHsKKyAgICAgICAgYltpXSA9IGIwICogdGJbaV0gKyBiMSAqIHRiW2kgLSAxXSArIGIyICogdGJbaSAtIDJdOworICAgICAgICBhW2ldID0gdGFbaV0gLSBhMSAqIHRhW2kgLSAxXSAtIGEyICogdGFbaSAtIDJdOworICAgICAgfQorICAgICAgZ19mcmVlICh0YSk7CisgICAgICBnX2ZyZWUgKHRiKTsKKyAgICB9CisKKyAgICAvKiBNb3ZlIGNvZWZmaWNpZW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheSB0byBtb3ZlIGZyb20KKyAgICAgKiB0aGUgdHJhbnNmZXIgZnVuY3Rpb24ncyBjb2VmZmljaWVudHMgdG8gdGhlIGRpZmZlcmVuY2UKKyAgICAgKiBlcXVhdGlvbidzIGNvZWZmaWNpZW50cyAqLworICAgIGZvciAoaSA9IDA7IGkgPD0gbnA7IGkrKykgeworICAgICAgYVtpXSA9IGFbaSArIDJdOworICAgICAgYltpXSA9IGJbaSArIDJdOworICAgIH0KKworICAgIC8qIE5vcm1hbGl6ZSB0byB1bml0eSBnYWluIGF0IGZyZXF1ZW5jeSAwIGZvciBsb3dwYXNzCisgICAgICogYW5kIGZyZXF1ZW5jeSAwLjUgZm9yIGhpZ2hwYXNzICovCisgICAgeworICAgICAgZ2RvdWJsZSBnYWluOworCisgICAgICBpZiAoZmlsdGVyLT5tb2RlID09IE1PREVfTE9XX1BBU1MpCisgICAgICAgIGdhaW4gPQorICAgICAgICAgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9jYWxjdWxhdGVfZ2FpbiAoYSwgbnAgKyAxLCBiLCBucCArIDEsCisgICAgICAgICAgICAxLjAsIDAuMCk7CisgICAgICBlbHNlCisgICAgICAgIGdhaW4gPQorICAgICAgICAgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9jYWxjdWxhdGVfZ2FpbiAoYSwgbnAgKyAxLCBiLCBucCArIDEsCisgICAgICAgICAgICAtMS4wLCAwLjApOworCisgICAgICBmb3IgKGkgPSAwOyBpIDw9IG5wOyBpKyspIHsKKyAgICAgICAgYltpXSAvPSBnYWluOworICAgICAgfQorICAgIH0KKworICAgIGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfc2V0X2NvZWZmaWNpZW50cyAoR1NUX0FVRElPX0ZYX0JBU0VfSUlSX0ZJTFRFUgorICAgICAgICAoZmlsdGVyKSwgYSwgbnAgKyAxLCBiLCBucCArIDEpOworCisgICAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwKKyAgICAgICAgIkdlbmVyYXRlZCBJSVIgY29lZmZpY2llbnRzIGZvciB0aGUgQ2hlYnlzaGV2IGZpbHRlciIpOworICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsCisgICAgICAgICJtb2RlOiAlcywgdHlwZTogJWQsIHBvbGVzOiAlZCwgY3V0b2ZmOiAlLjJmIEh6LCByaXBwbGU6ICUuMmYgZEIiLAorICAgICAgICAoZmlsdGVyLT5tb2RlID09IE1PREVfTE9XX1BBU1MpID8gImxvdy1wYXNzIiA6ICJoaWdoLXBhc3MiLAorICAgICAgICBmaWx0ZXItPnR5cGUsIGZpbHRlci0+cG9sZXMsIGZpbHRlci0+Y3V0b2ZmLCBmaWx0ZXItPnJpcHBsZSk7CisgICAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwgIiUuMmYgZEIgZ2FpbiBAIDAgSHoiLAorICAgICAgICAyMC4wICogbG9nMTAgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfY2FsY3VsYXRlX2dhaW4gKGEsIG5wICsgMSwgYiwKKyAgICAgICAgICAgICAgICBucCArIDEsIDEuMCwgMC4wKSkpOworCisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworICAgIHsKKyAgICAgIGdkb3VibGUgd2MgPSAyLjAgKiBHX1BJICogKGZpbHRlci0+Y3V0b2ZmIC8gcmF0ZSk7CisgICAgICBnZG91YmxlIHpyID0gY29zICh3YyksIHppID0gc2luICh3Yyk7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICIlLjJmIGRCIGdhaW4gQCAlZCBIeiIsCisgICAgICAgICAgMjAuMCAqIGxvZzEwIChnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2NhbGN1bGF0ZV9nYWluIChhLCBucCArIDEsCisgICAgICAgICAgICAgICAgICBiLCBucCArIDEsIHpyLCB6aSkpLCAoaW50KSBmaWx0ZXItPmN1dG9mZik7CisgICAgfQorI2VuZGlmCisKKyAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiJS4yZiBkQiBnYWluIEAgJWQgSHoiLAorICAgICAgICAyMC4wICogbG9nMTAgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfY2FsY3VsYXRlX2dhaW4gKGEsIG5wICsgMSwgYiwKKyAgICAgICAgICAgICAgICBucCArIDEsIC0xLjAsIDAuMCkpLCByYXRlKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2NoZWJfbGltaXRfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEF1ZGlvQ2hlYkxpbWl0ICpmaWx0ZXIgPSBHU1RfQVVESU9fQ0hFQl9MSU1JVCAob2JqZWN0KTsKKworICBnX211dGV4X2NsZWFyICgmZmlsdGVyLT5sb2NrKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fY2hlYl9saW1pdF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXVkaW9DaGViTGltaXQgKmZpbHRlciA9IEdTVF9BVURJT19DSEVCX0xJTUlUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ19tdXRleF9sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGZpbHRlci0+bW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGdlbmVyYXRlX2NvZWZmaWNpZW50cyAoZmlsdGVyLCBOVUxMKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UWVBFOgorICAgICAgZ19tdXRleF9sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGZpbHRlci0+dHlwZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgZ2VuZXJhdGVfY29lZmZpY2llbnRzIChmaWx0ZXIsIE5VTEwpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZmaWx0ZXItPmxvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NVVE9GRjoKKyAgICAgIGdfbXV0ZXhfbG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBmaWx0ZXItPmN1dG9mZiA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisgICAgICBnZW5lcmF0ZV9jb2VmZmljaWVudHMgKGZpbHRlciwgTlVMTCk7CisgICAgICBnX211dGV4X3VubG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUklQUExFOgorICAgICAgZ19tdXRleF9sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGZpbHRlci0+cmlwcGxlID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGdlbmVyYXRlX2NvZWZmaWNpZW50cyAoZmlsdGVyLCBOVUxMKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QT0xFUzoKKyAgICAgIGdfbXV0ZXhfbG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBmaWx0ZXItPnBvbGVzID0gR1NUX1JPVU5EX1VQXzIgKGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpKTsKKyAgICAgIGdlbmVyYXRlX2NvZWZmaWNpZW50cyAoZmlsdGVyLCBOVUxMKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19jaGViX2xpbWl0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb0NoZWJMaW1pdCAqZmlsdGVyID0gR1NUX0FVRElPX0NIRUJfTElNSVQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgZmlsdGVyLT5tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UWVBFOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZmlsdGVyLT50eXBlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DVVRPRkY6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIGZpbHRlci0+Y3V0b2ZmKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SSVBQTEU6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIGZpbHRlci0+cmlwcGxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QT0xFUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGZpbHRlci0+cG9sZXMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBHc3RBdWRpb0ZpbHRlciB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdWRpb19jaGViX2xpbWl0X3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGJhc2UsIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIEdzdEF1ZGlvQ2hlYkxpbWl0ICpmaWx0ZXIgPSBHU1RfQVVESU9fQ0hFQl9MSU1JVCAoYmFzZSk7CisKKyAgZ2VuZXJhdGVfY29lZmZpY2llbnRzIChmaWx0ZXIsIGluZm8pOworCisgIHJldHVybiBHU1RfQVVESU9fRklMVEVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zZXR1cCAoYmFzZSwgaW5mbyk7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb2NoZWJsaW1pdC5oIGIvZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTMwOTYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvYXVkaW9jaGVibGltaXQuaApAQCAtMCwwICsxLDY2IEBACisvKiAKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BVURJT19DSEVCX0xJTUlUX0hfXworI2RlZmluZSBfX0dTVF9BVURJT19DSEVCX0xJTUlUX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuaD4KKworI2luY2x1ZGUgImF1ZGlvZnhiYXNlaWlyZmlsdGVyLmgiCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9BVURJT19DSEVCX0xJTUlUICAgICAgICAgICAgKGdzdF9hdWRpb19jaGViX2xpbWl0X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9BVURJT19DSEVCX0xJTUlUKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVVESU9fQ0hFQl9MSU1JVCxHc3RBdWRpb0NoZWJMaW1pdCkpCisjZGVmaW5lIEdTVF9JU19BVURJT19DSEVCX0xJTUlUKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVVESU9fQ0hFQl9MSU1JVCkpCisjZGVmaW5lIEdTVF9BVURJT19DSEVCX0xJTUlUX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSAsR1NUX1RZUEVfQVVESU9fQ0hFQl9MSU1JVCxHc3RBdWRpb0NoZWJMaW1pdENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FVRElPX0NIRUJfTElNSVRfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpICxHU1RfVFlQRV9BVURJT19DSEVCX0xJTUlUKSkKKyNkZWZpbmUgR1NUX0FVRElPX0NIRUJfTElNSVRfR0VUX0NMQVNTKG9iaikgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTKChvYmopICxHU1RfVFlQRV9BVURJT19DSEVCX0xJTUlULEdzdEF1ZGlvQ2hlYkxpbWl0Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9DaGViTGltaXQgR3N0QXVkaW9DaGViTGltaXQ7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9DaGViTGltaXRDbGFzcyBHc3RBdWRpb0NoZWJMaW1pdENsYXNzOworCitzdHJ1Y3QgX0dzdEF1ZGlvQ2hlYkxpbWl0Cit7CisgIEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyIHBhcmVudDsKKworICBnaW50IG1vZGU7CisgIGdpbnQgdHlwZTsKKyAgZ2ludCBwb2xlczsKKyAgZ2Zsb2F0IGN1dG9mZjsKKyAgZ2Zsb2F0IHJpcHBsZTsKKworICAvKiA8IHByaXZhdGUgPiAqLworICBHTXV0ZXggbG9jazsKK307CisKK3N0cnVjdCBfR3N0QXVkaW9DaGViTGltaXRDbGFzcworeworICBHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlckNsYXNzIHBhcmVudDsKK307CisKK0dUeXBlIGdzdF9hdWRpb19jaGViX2xpbWl0X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0FVRElPX0NIRUJfTElNSVRfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuYyBiL2dzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliM2E2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2R5bmFtaWMuYwpAQCAtMCwwICsxLDcxMyBAQAorLyogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXVkaW9keW5hbWljCisgKgorICogVGhpcyBlbGVtZW50IGNhbiBhY3QgYXMgYSBjb21wcmVzc29yIG9yIGV4cGFuZGVyLiBBIGNvbXByZXNzb3IgY2hhbmdlcyB0aGUKKyAqIGFtcGxpdHVkZSBvZiBhbGwgc2FtcGxlcyBhYm92ZSBhIHNwZWNpZmljIHRocmVzaG9sZCB3aXRoIGEgc3BlY2lmaWMgcmF0aW8sCisgKiBhIGV4cGFuZGVyIGRvZXMgdGhlIHNhbWUgZm9yIGFsbCBzYW1wbGVzIGJlbG93IGEgc3BlY2lmaWMgdGhyZXNob2xkLiBJZgorICogc29mdC1rbmVlIG1vZGUgaXMgc2VsZWN0ZWQgdGhlIHJhdGlvIGlzIGFwcGxpZWQgc21vb3RobHkuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyB3YXZlPXNhdyAhIGF1ZGlvZHluYW1pYyBjaGFyYWN0ZXJpc3RpY3M9c29mdC1rbmVlIG1vZGU9Y29tcHJlc3NvciB0aHJlc2hvbGQ9MC41IHJhdGlvPTAuNSAhIGFsc2FzaW5rCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPSJtZWxvMS5vZ2ciICEgb2dnZGVtdXggISB2b3JiaXNkZWMgISBhdWRpb2NvbnZlcnQgISBhdWRpb2R5bmFtaWMgY2hhcmFjdGVyaXN0aWNzPWhhcmQta25lZSBtb2RlPWV4cGFuZGVyIHRocmVzaG9sZD0wLjIgcmF0aW89NC4wICEgYWxzYXNpbmsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyB3YXZlPXNhdyAhIGF1ZGlvY29udmVydCAhIGF1ZGlvZHluYW1pYyAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisvKiBUT0RPOiBJbXBsZW1lbnQgYXR0YWNrIGFuZCByZWxlYXNlIHBhcmFtZXRlcnMgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuaD4KKworI2luY2x1ZGUgImF1ZGlvZHluYW1pYy5oIgorCisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfYXVkaW9fZHluYW1pY19kZWJ1ZworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoR1NUX0NBVF9ERUZBVUxUKTsKKworLyogRmlsdGVyIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQ0hBUkFDVEVSSVNUSUNTLAorICBQUk9QX01PREUsCisgIFBST1BfVEhSRVNIT0xELAorICBQUk9QX1JBVElPCit9OworCisjZGVmaW5lIEFMTE9XRURfQ0FQUyBcCisgICAgImF1ZGlvL3gtcmF3LCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBmb3JtYXQ9KHN0cmluZykgeyJHU1RfQVVESU9fTkUoUzE2KSIsIkdTVF9BVURJT19ORShGMzIpIn0sIiBcCisgICAgIiByYXRlPShpbnQpWzEsTUFYXSwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBjaGFubmVscz0oaW50KVsxLE1BWF0sIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBsYXlvdXQ9KHN0cmluZykge2ludGVybGVhdmVkLCBub24taW50ZXJsZWF2ZWR9IgorCitHX0RFRklORV9UWVBFIChHc3RBdWRpb0R5bmFtaWMsIGdzdF9hdWRpb19keW5hbWljLCBHU1RfVFlQRV9BVURJT19GSUxURVIpOworCitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fZHluYW1pY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fZHluYW1pY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fZHluYW1pY19zZXR1cCAoR3N0QXVkaW9GaWx0ZXIgKiBmaWx0ZXIsCisgICAgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1faGFyZF9rbmVlX2NvbXByZXNzb3JfaW50IChHc3RBdWRpb0R5bmFtaWMgKiBmaWx0ZXIsCisgICAgZ2ludDE2ICogZGF0YSwgZ3VpbnQgbnVtX3NhbXBsZXMpOworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9oYXJkX2tuZWVfY29tcHJlc3Nvcl9mbG9hdCAoR3N0QXVkaW9EeW5hbWljICoKKyAgICBmaWx0ZXIsIGdmbG9hdCAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKTsKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2NvbXByZXNzb3JfaW50IChHc3RBdWRpb0R5bmFtaWMgKiBmaWx0ZXIsCisgICAgZ2ludDE2ICogZGF0YSwgZ3VpbnQgbnVtX3NhbXBsZXMpOworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9zb2Z0X2tuZWVfY29tcHJlc3Nvcl9mbG9hdCAoR3N0QXVkaW9EeW5hbWljICoKKyAgICBmaWx0ZXIsIGdmbG9hdCAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9oYXJkX2tuZWVfZXhwYW5kZXJfaW50IChHc3RBdWRpb0R5bmFtaWMKKyAgICAqIGZpbHRlciwgZ2ludDE2ICogZGF0YSwgZ3VpbnQgbnVtX3NhbXBsZXMpOworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9oYXJkX2tuZWVfZXhwYW5kZXJfZmxvYXQgKEdzdEF1ZGlvRHluYW1pYyAqIGZpbHRlciwKKyAgICBnZmxvYXQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcyk7CitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2V4cGFuZGVyX2ludCAoR3N0QXVkaW9EeW5hbWljCisgICAgKiBmaWx0ZXIsIGdpbnQxNiAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKTsKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2V4cGFuZGVyX2Zsb2F0IChHc3RBdWRpb0R5bmFtaWMgKiBmaWx0ZXIsCisgICAgZ2Zsb2F0ICogZGF0YSwgZ3VpbnQgbnVtX3NhbXBsZXMpOworCitzdGF0aWMgY29uc3QgR3N0QXVkaW9EeW5hbWljUHJvY2Vzc0Z1bmMgcHJvY2Vzc19mdW5jdGlvbnNbXSA9IHsKKyAgKEdzdEF1ZGlvRHluYW1pY1Byb2Nlc3NGdW5jKQorICAgICAgZ3N0X2F1ZGlvX2R5bmFtaWNfdHJhbnNmb3JtX2hhcmRfa25lZV9jb21wcmVzc29yX2ludCwKKyAgKEdzdEF1ZGlvRHluYW1pY1Byb2Nlc3NGdW5jKQorICAgICAgZ3N0X2F1ZGlvX2R5bmFtaWNfdHJhbnNmb3JtX2hhcmRfa25lZV9jb21wcmVzc29yX2Zsb2F0LAorICAoR3N0QXVkaW9EeW5hbWljUHJvY2Vzc0Z1bmMpCisgICAgICBnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2NvbXByZXNzb3JfaW50LAorICAoR3N0QXVkaW9EeW5hbWljUHJvY2Vzc0Z1bmMpCisgICAgICBnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2NvbXByZXNzb3JfZmxvYXQsCisgIChHc3RBdWRpb0R5bmFtaWNQcm9jZXNzRnVuYykKKyAgICAgIGdzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9oYXJkX2tuZWVfZXhwYW5kZXJfaW50LAorICAoR3N0QXVkaW9EeW5hbWljUHJvY2Vzc0Z1bmMpCisgICAgICBnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1faGFyZF9rbmVlX2V4cGFuZGVyX2Zsb2F0LAorICAoR3N0QXVkaW9EeW5hbWljUHJvY2Vzc0Z1bmMpCisgICAgICBnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2V4cGFuZGVyX2ludCwKKyAgKEdzdEF1ZGlvRHluYW1pY1Byb2Nlc3NGdW5jKQorICBnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2V4cGFuZGVyX2Zsb2F0Cit9OworCitlbnVtCit7CisgIENIQVJBQ1RFUklTVElDU19IQVJEX0tORUUgPSAwLAorICBDSEFSQUNURVJJU1RJQ1NfU09GVF9LTkVFCit9OworCisjZGVmaW5lIEdTVF9UWVBFX0FVRElPX0RZTkFNSUNfQ0hBUkFDVEVSSVNUSUNTIChnc3RfYXVkaW9fZHluYW1pY19jaGFyYWN0ZXJpc3RpY3NfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9hdWRpb19keW5hbWljX2NoYXJhY3RlcmlzdGljc19nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGd0eXBlID0gMDsKKworICBpZiAoZ3R5cGUgPT0gMCkgeworICAgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHZhbHVlc1tdID0geworICAgICAge0NIQVJBQ1RFUklTVElDU19IQVJEX0tORUUsICJIYXJkIEtuZWUgKGRlZmF1bHQpIiwKKyAgICAgICAgICAiaGFyZC1rbmVlIn0sCisgICAgICB7Q0hBUkFDVEVSSVNUSUNTX1NPRlRfS05FRSwgIlNvZnQgS25lZSAoc21vb3RoKSIsCisgICAgICAgICAgInNvZnQta25lZSJ9LAorICAgICAgezAsIE5VTEwsIE5VTEx9CisgICAgfTsKKworICAgIGd0eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdEF1ZGlvRHluYW1pY0NoYXJhY3RlcmlzdGljcyIsIHZhbHVlcyk7CisgIH0KKyAgcmV0dXJuIGd0eXBlOworfQorCitlbnVtCit7CisgIE1PREVfQ09NUFJFU1NPUiA9IDAsCisgIE1PREVfRVhQQU5ERVIKK307CisKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fRFlOQU1JQ19NT0RFIChnc3RfYXVkaW9fZHluYW1pY19tb2RlX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfYXVkaW9fZHluYW1pY19tb2RlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZ3R5cGUgPSAwOworCisgIGlmIChndHlwZSA9PSAwKSB7CisgICAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAgICB7TU9ERV9DT01QUkVTU09SLCAiQ29tcHJlc3NvciAoZGVmYXVsdCkiLAorICAgICAgICAgICJjb21wcmVzc29yIn0sCisgICAgICB7TU9ERV9FWFBBTkRFUiwgIkV4cGFuZGVyIiwgImV4cGFuZGVyIn0sCisgICAgICB7MCwgTlVMTCwgTlVMTH0KKyAgICB9OworCisgICAgZ3R5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0QXVkaW9EeW5hbWljTW9kZSIsIHZhbHVlcyk7CisgIH0KKyAgcmV0dXJuIGd0eXBlOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2R5bmFtaWNfc2V0X3Byb2Nlc3NfZnVuY3Rpb24gKEdzdEF1ZGlvRHluYW1pYyAqIGZpbHRlciwKKyAgICBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKQoreworICBnaW50IGZ1bmNfaW5kZXg7CisKKyAgZnVuY19pbmRleCA9IChmaWx0ZXItPm1vZGUgPT0gTU9ERV9DT01QUkVTU09SKSA/IDAgOiA0OworICBmdW5jX2luZGV4ICs9IChmaWx0ZXItPmNoYXJhY3RlcmlzdGljcyA9PSBDSEFSQUNURVJJU1RJQ1NfSEFSRF9LTkVFKSA/IDAgOiAyOworICBmdW5jX2luZGV4ICs9IChHU1RfQVVESU9fSU5GT19GT1JNQVQgKGluZm8pID09IEdTVF9BVURJT19GT1JNQVRfRjMyKSA/IDEgOiAwOworCisgIGdfYXNzZXJ0IChmdW5jX2luZGV4ID49IDAgJiYgZnVuY19pbmRleCA8IEdfTl9FTEVNRU5UUyAocHJvY2Vzc19mdW5jdGlvbnMpKTsKKworICBmaWx0ZXItPnByb2Nlc3MgPSBwcm9jZXNzX2Z1bmN0aW9uc1tmdW5jX2luZGV4XTsKK30KKworLyogR09iamVjdCB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2R5bmFtaWNfY2xhc3NfaW5pdCAoR3N0QXVkaW9EeW5hbWljQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9hdWRpb19keW5hbWljX2RlYnVnLCAiYXVkaW9keW5hbWljIiwgMCwKKyAgICAgICJhdWRpb2R5bmFtaWMgZWxlbWVudCIpOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9fZHluYW1pY19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb19keW5hbWljX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NIQVJBQ1RFUklTVElDUywKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgiY2hhcmFjdGVyaXN0aWNzIiwgIkNoYXJhY3RlcmlzdGljcyIsCisgICAgICAgICAgIlNlbGVjdHMgd2hldGhlciB0aGUgcmF0aW8gc2hvdWxkIGJlIGFwcGxpZWQgc21vb3RoIChzb2Z0LWtuZWUpICIKKyAgICAgICAgICAib3IgaGFyZCAoaGFyZC1rbmVlKS4iLAorICAgICAgICAgIEdTVF9UWVBFX0FVRElPX0RZTkFNSUNfQ0hBUkFDVEVSSVNUSUNTLCBDSEFSQUNURVJJU1RJQ1NfSEFSRF9LTkVFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgibW9kZSIsICJNb2RlIiwKKyAgICAgICAgICAiU2VsZWN0cyB3aGV0aGVyIHRoZSBmaWx0ZXIgc2hvdWxkIHdvcmsgb24gbG91ZCBzYW1wbGVzIChjb21wcmVzc29yKSBvciIKKyAgICAgICAgICAicXVpZXQgc2FtcGxlcyAoZXhwYW5kZXIpLiIsCisgICAgICAgICAgR1NUX1RZUEVfQVVESU9fRFlOQU1JQ19NT0RFLCBNT0RFX0NPTVBSRVNTT1IsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJFU0hPTEQsCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJ0aHJlc2hvbGQiLCAiVGhyZXNob2xkIiwKKyAgICAgICAgICAiVGhyZXNob2xkIHVudGlsIHRoZSBmaWx0ZXIgaXMgYWN0aXZhdGVkIiwgMC4wLCAxLjAsCisgICAgICAgICAgMC4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JBVElPLAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgicmF0aW8iLCAiUmF0aW8iLAorICAgICAgICAgICJSYXRpbyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIiwgMC4wLCBHX01BWEZMT0FULAorICAgICAgICAgIDEuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJEeW5hbWljIHJhbmdlIGNvbnRyb2xsZXIiLCAiRmlsdGVyL0VmZmVjdC9BdWRpbyIsCisgICAgICAiQ29tcHJlc3NvciBhbmQgRXhwYW5kZXIiLCAiU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPiIpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQUxMT1dFRF9DQVBTKTsKKyAgZ3N0X2F1ZGlvX2ZpbHRlcl9jbGFzc19hZGRfcGFkX3RlbXBsYXRlcyAoR1NUX0FVRElPX0ZJTFRFUl9DTEFTUyAoa2xhc3MpLAorICAgICAgY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBHU1RfQVVESU9fRklMVEVSX0NMQVNTIChrbGFzcyktPnNldHVwID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9fZHluYW1pY19zZXR1cCk7CisKKyAgR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyktPnRyYW5zZm9ybV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2R5bmFtaWNfdHJhbnNmb3JtX2lwKTsKKyAgR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyktPnRyYW5zZm9ybV9pcF9vbl9wYXNzdGhyb3VnaCA9IEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2R5bmFtaWNfaW5pdCAoR3N0QXVkaW9EeW5hbWljICogZmlsdGVyKQoreworICBmaWx0ZXItPnJhdGlvID0gMS4wOworICBmaWx0ZXItPnRocmVzaG9sZCA9IDAuMDsKKyAgZmlsdGVyLT5jaGFyYWN0ZXJpc3RpY3MgPSBDSEFSQUNURVJJU1RJQ1NfSEFSRF9LTkVFOworICBmaWx0ZXItPm1vZGUgPSBNT0RFX0NPTVBSRVNTT1I7CisgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfaW5fcGxhY2UgKEdTVF9CQVNFX1RSQU5TRk9STSAoZmlsdGVyKSwgVFJVRSk7CisgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfZ2FwX2F3YXJlIChHU1RfQkFTRV9UUkFOU0ZPUk0gKGZpbHRlciksIFRSVUUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2R5bmFtaWNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEF1ZGlvRHluYW1pYyAqZmlsdGVyID0gR1NUX0FVRElPX0RZTkFNSUMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0NIQVJBQ1RFUklTVElDUzoKKyAgICAgIGZpbHRlci0+Y2hhcmFjdGVyaXN0aWNzID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgZ3N0X2F1ZGlvX2R5bmFtaWNfc2V0X3Byb2Nlc3NfZnVuY3Rpb24gKGZpbHRlciwKKyAgICAgICAgICBHU1RfQVVESU9fRklMVEVSX0lORk8gKGZpbHRlcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01PREU6CisgICAgICBmaWx0ZXItPm1vZGUgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBnc3RfYXVkaW9fZHluYW1pY19zZXRfcHJvY2Vzc19mdW5jdGlvbiAoZmlsdGVyLAorICAgICAgICAgIEdTVF9BVURJT19GSUxURVJfSU5GTyAoZmlsdGVyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSRVNIT0xEOgorICAgICAgZmlsdGVyLT50aHJlc2hvbGQgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JBVElPOgorICAgICAgZmlsdGVyLT5yYXRpbyA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZHluYW1pY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXVkaW9EeW5hbWljICpmaWx0ZXIgPSBHU1RfQVVESU9fRFlOQU1JQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ0hBUkFDVEVSSVNUSUNTOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGZpbHRlci0+Y2hhcmFjdGVyaXN0aWNzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGZpbHRlci0+bW9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSRVNIT0xEOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBmaWx0ZXItPnRocmVzaG9sZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkFUSU86CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIGZpbHRlci0+cmF0aW8pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBHc3RBdWRpb0ZpbHRlciB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdWRpb19keW5hbWljX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGJhc2UsIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIEdzdEF1ZGlvRHluYW1pYyAqZmlsdGVyID0gR1NUX0FVRElPX0RZTkFNSUMgKGJhc2UpOworCisgIGdzdF9hdWRpb19keW5hbWljX3NldF9wcm9jZXNzX2Z1bmN0aW9uIChmaWx0ZXIsIGluZm8pOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9oYXJkX2tuZWVfY29tcHJlc3Nvcl9pbnQgKEdzdEF1ZGlvRHluYW1pYyAqIGZpbHRlciwKKyAgICBnaW50MTYgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykKK3sKKyAgZ2xvbmcgdmFsOworICBnbG9uZyB0aHJfcCA9IGZpbHRlci0+dGhyZXNob2xkICogR19NQVhJTlQxNjsKKyAgZ2xvbmcgdGhyX24gPSBmaWx0ZXItPnRocmVzaG9sZCAqIEdfTUlOSU5UMTY7CisKKyAgLyogTm90aGluZyB0byBkbyBmb3IgdXMgaWYgcmF0aW8gaXMgMS4wIG9yIGlmIHRoZSB0aHJlc2hvbGQKKyAgICogZXF1YWxzIDEuMC4gKi8KKyAgaWYgKGZpbHRlci0+dGhyZXNob2xkID09IDEuMCB8fCBmaWx0ZXItPnJhdGlvID09IDEuMCkKKyAgICByZXR1cm47CisKKyAgZm9yICg7IG51bV9zYW1wbGVzOyBudW1fc2FtcGxlcy0tKSB7CisgICAgdmFsID0gKmRhdGE7CisKKyAgICBpZiAodmFsID4gdGhyX3ApIHsKKyAgICAgIHZhbCA9IHRocl9wICsgKHZhbCAtIHRocl9wKSAqIGZpbHRlci0+cmF0aW87CisgICAgfSBlbHNlIGlmICh2YWwgPCB0aHJfbikgeworICAgICAgdmFsID0gdGhyX24gKyAodmFsIC0gdGhyX24pICogZmlsdGVyLT5yYXRpbzsKKyAgICB9CisgICAgKmRhdGErKyA9IChnaW50MTYpIENMQU1QICh2YWwsIEdfTUlOSU5UMTYsIEdfTUFYSU5UMTYpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1faGFyZF9rbmVlX2NvbXByZXNzb3JfZmxvYXQgKEdzdEF1ZGlvRHluYW1pYyAqCisgICAgZmlsdGVyLCBnZmxvYXQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykKK3sKKyAgZ2RvdWJsZSB2YWwsIHRocmVzaG9sZCA9IGZpbHRlci0+dGhyZXNob2xkOworCisgIC8qIE5vdGhpbmcgdG8gZG8gZm9yIHVzIGlmIHJhdGlvID09IDEuMC4KKyAgICogQXMgZmxvYXQgdmFsdWVzIGNhbiBiZSBhYm92ZSAxLjAgd2UgaGF2ZSB0byBkbyBzb21ldGhpbmcKKyAgICogaWYgdGhyZXNob2xkIGlzIGdyZWF0ZXIgdGhhbiAxLjAuICovCisgIGlmIChmaWx0ZXItPnJhdGlvID09IDEuMCkKKyAgICByZXR1cm47CisKKyAgZm9yICg7IG51bV9zYW1wbGVzOyBudW1fc2FtcGxlcy0tKSB7CisgICAgdmFsID0gKmRhdGE7CisKKyAgICBpZiAodmFsID4gdGhyZXNob2xkKSB7CisgICAgICB2YWwgPSB0aHJlc2hvbGQgKyAodmFsIC0gdGhyZXNob2xkKSAqIGZpbHRlci0+cmF0aW87CisgICAgfSBlbHNlIGlmICh2YWwgPCAtdGhyZXNob2xkKSB7CisgICAgICB2YWwgPSAtdGhyZXNob2xkICsgKHZhbCArIHRocmVzaG9sZCkgKiBmaWx0ZXItPnJhdGlvOworICAgIH0KKyAgICAqZGF0YSsrID0gKGdmbG9hdCkgdmFsOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2NvbXByZXNzb3JfaW50IChHc3RBdWRpb0R5bmFtaWMgKiBmaWx0ZXIsCisgICAgZ2ludDE2ICogZGF0YSwgZ3VpbnQgbnVtX3NhbXBsZXMpCit7CisgIGdsb25nIHZhbDsKKyAgZ2xvbmcgdGhyX3AgPSBmaWx0ZXItPnRocmVzaG9sZCAqIEdfTUFYSU5UMTY7CisgIGdsb25nIHRocl9uID0gZmlsdGVyLT50aHJlc2hvbGQgKiBHX01JTklOVDE2OworICBnZG91YmxlIGFfcCwgYl9wLCBjX3A7CisgIGdkb3VibGUgYV9uLCBiX24sIGNfbjsKKworICAvKiBOb3RoaW5nIHRvIGRvIGZvciB1cyBpZiByYXRpbyBpcyAxLjAgb3IgaWYgdGhlIHRocmVzaG9sZAorICAgKiBlcXVhbHMgMS4wLiAqLworICBpZiAoZmlsdGVyLT50aHJlc2hvbGQgPT0gMS4wIHx8IGZpbHRlci0+cmF0aW8gPT0gMS4wKQorICAgIHJldHVybjsKKworICAvKiBXZSBidWlsZCBhIDJuZCBkZWdyZWUgcG9seW5vbWlhbCBoZXJlIGZvcgorICAgKiB2YWx1ZXMgZ3JlYXRlciB0aGFuIHRocmVzaG9sZCBvciBzbWFsbCB0aGFuCisgICAqIC10aHJlc2hvbGQgd2l0aDoKKyAgICogZih0KSA9IHQsIGYnKHQpID0gMSwgZicobSkgPSByCisgICAqID0+CisgICAqIGEgPSAoMS1yKS8oMioodC1tKSkKKyAgICogYiA9IChyKnQgLSBtKS8odC1tKQorICAgKiBjID0gdCAqICgxIC0gYiAtIGEqdCkKKyAgICogZih4KSA9IGF4XjIgKyBieCArIGMKKyAgICovCisKKyAgLyogc2hvdWxkbid0IGhhcHBlbiBiZWNhdXNlIHRoaXMgd291bGQgb25seSBiZSB0aGUgY2FzZQorICAgKiBmb3IgdGhyZXNob2xkID09IDEuMCB3aGljaCB3ZSBjYXRjaCBhYm92ZSAqLworICBnX2Fzc2VydCAodGhyX3AgLSBHX01BWElOVDE2ICE9IDApOworICBnX2Fzc2VydCAodGhyX24gLSBHX01JTklOVCAhPSAwKTsKKworICBhX3AgPSAoMSAtIGZpbHRlci0+cmF0aW8pIC8gKDIgKiAodGhyX3AgLSBHX01BWElOVDE2KSk7CisgIGJfcCA9IChmaWx0ZXItPnJhdGlvICogdGhyX3AgLSBHX01BWElOVDE2KSAvICh0aHJfcCAtIEdfTUFYSU5UMTYpOworICBjX3AgPSB0aHJfcCAqICgxIC0gYl9wIC0gYV9wICogdGhyX3ApOworICBhX24gPSAoMSAtIGZpbHRlci0+cmF0aW8pIC8gKDIgKiAodGhyX24gLSBHX01JTklOVDE2KSk7CisgIGJfbiA9IChmaWx0ZXItPnJhdGlvICogdGhyX24gLSBHX01JTklOVDE2KSAvICh0aHJfbiAtIEdfTUlOSU5UMTYpOworICBjX24gPSB0aHJfbiAqICgxIC0gYl9uIC0gYV9uICogdGhyX24pOworCisgIGZvciAoOyBudW1fc2FtcGxlczsgbnVtX3NhbXBsZXMtLSkgeworICAgIHZhbCA9ICpkYXRhOworCisgICAgaWYgKHZhbCA+IHRocl9wKSB7CisgICAgICB2YWwgPSBhX3AgKiB2YWwgKiB2YWwgKyBiX3AgKiB2YWwgKyBjX3A7CisgICAgfSBlbHNlIGlmICh2YWwgPCB0aHJfbikgeworICAgICAgdmFsID0gYV9uICogdmFsICogdmFsICsgYl9uICogdmFsICsgY19uOworICAgIH0KKyAgICAqZGF0YSsrID0gKGdpbnQxNikgQ0xBTVAgKHZhbCwgR19NSU5JTlQxNiwgR19NQVhJTlQxNik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9zb2Z0X2tuZWVfY29tcHJlc3Nvcl9mbG9hdCAoR3N0QXVkaW9EeW5hbWljICoKKyAgICBmaWx0ZXIsIGdmbG9hdCAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKQoreworICBnZG91YmxlIHZhbDsKKyAgZ2RvdWJsZSB0aHJlc2hvbGQgPSBmaWx0ZXItPnRocmVzaG9sZDsKKyAgZ2RvdWJsZSBhX3AsIGJfcCwgY19wOworICBnZG91YmxlIGFfbiwgYl9uLCBjX247CisKKyAgLyogTm90aGluZyB0byBkbyBmb3IgdXMgaWYgcmF0aW8gPT0gMS4wLgorICAgKiBBcyBmbG9hdCB2YWx1ZXMgY2FuIGJlIGFib3ZlIDEuMCB3ZSBoYXZlIHRvIGRvIHNvbWV0aGluZworICAgKiBpZiB0aHJlc2hvbGQgaXMgZ3JlYXRlciB0aGFuIDEuMC4gKi8KKyAgaWYgKGZpbHRlci0+cmF0aW8gPT0gMS4wKQorICAgIHJldHVybjsKKworICAvKiBXZSBidWlsZCBhIDJuZCBkZWdyZWUgcG9seW5vbWlhbCBoZXJlIGZvcgorICAgKiB2YWx1ZXMgZ3JlYXRlciB0aGFuIHRocmVzaG9sZCBvciBzbWFsbCB0aGFuCisgICAqIC10aHJlc2hvbGQgd2l0aDoKKyAgICogZih0KSA9IHQsIGYnKHQpID0gMSwgZicobSkgPSByCisgICAqID0+CisgICAqIGEgPSAoMS1yKS8oMioodC1tKSkKKyAgICogYiA9IChyKnQgLSBtKS8odC1tKQorICAgKiBjID0gdCAqICgxIC0gYiAtIGEqdCkKKyAgICogZih4KSA9IGF4XjIgKyBieCArIGMKKyAgICovCisKKyAgLyogRklYTUU6IElmIHRyZXNob2xkIGlzIHRoZSBzYW1lIGFzIHRoZSBtYXhpbXVtCisgICAqIHdlIG5lZWQgdG8gcmFpc2UgaXQgYSBiaXQgdG8gcHJldmVudAorICAgKiBkaXZpc2lvbiBieSB6ZXJvLiAqLworICBpZiAodGhyZXNob2xkID09IDEuMCkKKyAgICB0aHJlc2hvbGQgPSAxLjAgKyAwLjAwMDAxOworCisgIGFfcCA9ICgxLjAgLSBmaWx0ZXItPnJhdGlvKSAvICgyLjAgKiAodGhyZXNob2xkIC0gMS4wKSk7CisgIGJfcCA9IChmaWx0ZXItPnJhdGlvICogdGhyZXNob2xkIC0gMS4wKSAvICh0aHJlc2hvbGQgLSAxLjApOworICBjX3AgPSB0aHJlc2hvbGQgKiAoMS4wIC0gYl9wIC0gYV9wICogdGhyZXNob2xkKTsKKyAgYV9uID0gKDEuMCAtIGZpbHRlci0+cmF0aW8pIC8gKDIuMCAqICgtdGhyZXNob2xkICsgMS4wKSk7CisgIGJfbiA9ICgtZmlsdGVyLT5yYXRpbyAqIHRocmVzaG9sZCArIDEuMCkgLyAoLXRocmVzaG9sZCArIDEuMCk7CisgIGNfbiA9IC10aHJlc2hvbGQgKiAoMS4wIC0gYl9uICsgYV9uICogdGhyZXNob2xkKTsKKworICBmb3IgKDsgbnVtX3NhbXBsZXM7IG51bV9zYW1wbGVzLS0pIHsKKyAgICB2YWwgPSAqZGF0YTsKKworICAgIGlmICh2YWwgPiAxLjApIHsKKyAgICAgIHZhbCA9IDEuMCArICh2YWwgLSAxLjApICogZmlsdGVyLT5yYXRpbzsKKyAgICB9IGVsc2UgaWYgKHZhbCA+IHRocmVzaG9sZCkgeworICAgICAgdmFsID0gYV9wICogdmFsICogdmFsICsgYl9wICogdmFsICsgY19wOworICAgIH0gZWxzZSBpZiAodmFsIDwgLTEuMCkgeworICAgICAgdmFsID0gLTEuMCArICh2YWwgKyAxLjApICogZmlsdGVyLT5yYXRpbzsKKyAgICB9IGVsc2UgaWYgKHZhbCA8IC10aHJlc2hvbGQpIHsKKyAgICAgIHZhbCA9IGFfbiAqIHZhbCAqIHZhbCArIGJfbiAqIHZhbCArIGNfbjsKKyAgICB9CisgICAgKmRhdGErKyA9IChnZmxvYXQpIHZhbDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2R5bmFtaWNfdHJhbnNmb3JtX2hhcmRfa25lZV9leHBhbmRlcl9pbnQgKEdzdEF1ZGlvRHluYW1pYyAqIGZpbHRlciwKKyAgICBnaW50MTYgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykKK3sKKyAgZ2xvbmcgdmFsOworICBnbG9uZyB0aHJfcCA9IGZpbHRlci0+dGhyZXNob2xkICogR19NQVhJTlQxNjsKKyAgZ2xvbmcgdGhyX24gPSBmaWx0ZXItPnRocmVzaG9sZCAqIEdfTUlOSU5UMTY7CisgIGdkb3VibGUgemVyb19wLCB6ZXJvX247CisKKyAgLyogTm90aGluZyB0byBkbyBmb3IgdXMgaGVyZSBpZiB0aHJlc2hvbGQgZXF1YWxzIDAuMAorICAgKiBvciByYXRpbyBlcXVhbHMgMS4wICovCisgIGlmIChmaWx0ZXItPnRocmVzaG9sZCA9PSAwLjAgfHwgZmlsdGVyLT5yYXRpbyA9PSAxLjApCisgICAgcmV0dXJuOworCisgIC8qIHplcm8gY3Jvc3Npbmcgb2Ygb3VyIGZ1bmN0aW9uICovCisgIGlmIChmaWx0ZXItPnJhdGlvICE9IDAuMCkgeworICAgIHplcm9fcCA9IHRocl9wIC0gdGhyX3AgLyBmaWx0ZXItPnJhdGlvOworICAgIHplcm9fbiA9IHRocl9uIC0gdGhyX24gLyBmaWx0ZXItPnJhdGlvOworICB9IGVsc2UgeworICAgIHplcm9fcCA9IHplcm9fbiA9IDAuMDsKKyAgfQorCisgIGlmICh6ZXJvX3AgPCAwLjApCisgICAgemVyb19wID0gMC4wOworICBpZiAoemVyb19uID4gMC4wKQorICAgIHplcm9fbiA9IDAuMDsKKworICBmb3IgKDsgbnVtX3NhbXBsZXM7IG51bV9zYW1wbGVzLS0pIHsKKyAgICB2YWwgPSAqZGF0YTsKKworICAgIGlmICh2YWwgPCB0aHJfcCAmJiB2YWwgPiB6ZXJvX3ApIHsKKyAgICAgIHZhbCA9IGZpbHRlci0+cmF0aW8gKiB2YWwgKyB0aHJfcCAqICgxIC0gZmlsdGVyLT5yYXRpbyk7CisgICAgfSBlbHNlIGlmICgodmFsIDw9IHplcm9fcCAmJiB2YWwgPiAwKSB8fCAodmFsID49IHplcm9fbiAmJiB2YWwgPCAwKSkgeworICAgICAgdmFsID0gMDsKKyAgICB9IGVsc2UgaWYgKHZhbCA+IHRocl9uICYmIHZhbCA8IHplcm9fbikgeworICAgICAgdmFsID0gZmlsdGVyLT5yYXRpbyAqIHZhbCArIHRocl9uICogKDEgLSBmaWx0ZXItPnJhdGlvKTsKKyAgICB9CisgICAgKmRhdGErKyA9IChnaW50MTYpIENMQU1QICh2YWwsIEdfTUlOSU5UMTYsIEdfTUFYSU5UMTYpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1faGFyZF9rbmVlX2V4cGFuZGVyX2Zsb2F0IChHc3RBdWRpb0R5bmFtaWMgKiBmaWx0ZXIsCisgICAgZ2Zsb2F0ICogZGF0YSwgZ3VpbnQgbnVtX3NhbXBsZXMpCit7CisgIGdkb3VibGUgdmFsLCB0aHJlc2hvbGQgPSBmaWx0ZXItPnRocmVzaG9sZCwgemVybzsKKworICAvKiBOb3RoaW5nIHRvIGRvIGZvciB1cyBoZXJlIGlmIHRocmVzaG9sZCBlcXVhbHMgMC4wCisgICAqIG9yIHJhdGlvIGVxdWFscyAxLjAgKi8KKyAgaWYgKGZpbHRlci0+dGhyZXNob2xkID09IDAuMCB8fCBmaWx0ZXItPnJhdGlvID09IDEuMCkKKyAgICByZXR1cm47CisKKyAgLyogemVybyBjcm9zc2luZyBvZiBvdXIgZnVuY3Rpb24gKi8KKyAgaWYgKGZpbHRlci0+cmF0aW8gIT0gMC4wKQorICAgIHplcm8gPSB0aHJlc2hvbGQgLSB0aHJlc2hvbGQgLyBmaWx0ZXItPnJhdGlvOworICBlbHNlCisgICAgemVybyA9IDAuMDsKKworICBpZiAoemVybyA8IDAuMCkKKyAgICB6ZXJvID0gMC4wOworCisgIGZvciAoOyBudW1fc2FtcGxlczsgbnVtX3NhbXBsZXMtLSkgeworICAgIHZhbCA9ICpkYXRhOworCisgICAgaWYgKHZhbCA8IHRocmVzaG9sZCAmJiB2YWwgPiB6ZXJvKSB7CisgICAgICB2YWwgPSBmaWx0ZXItPnJhdGlvICogdmFsICsgdGhyZXNob2xkICogKDEuMCAtIGZpbHRlci0+cmF0aW8pOworICAgIH0gZWxzZSBpZiAoKHZhbCA8PSB6ZXJvICYmIHZhbCA+IDAuMCkgfHwgKHZhbCA+PSAtemVybyAmJiB2YWwgPCAwLjApKSB7CisgICAgICB2YWwgPSAwLjA7CisgICAgfSBlbHNlIGlmICh2YWwgPiAtdGhyZXNob2xkICYmIHZhbCA8IC16ZXJvKSB7CisgICAgICB2YWwgPSBmaWx0ZXItPnJhdGlvICogdmFsIC0gdGhyZXNob2xkICogKDEuMCAtIGZpbHRlci0+cmF0aW8pOworICAgIH0KKyAgICAqZGF0YSsrID0gKGdmbG9hdCkgdmFsOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZHluYW1pY190cmFuc2Zvcm1fc29mdF9rbmVlX2V4cGFuZGVyX2ludCAoR3N0QXVkaW9EeW5hbWljICogZmlsdGVyLAorICAgIGdpbnQxNiAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKQoreworICBnbG9uZyB2YWw7CisgIGdsb25nIHRocl9wID0gZmlsdGVyLT50aHJlc2hvbGQgKiBHX01BWElOVDE2OworICBnbG9uZyB0aHJfbiA9IGZpbHRlci0+dGhyZXNob2xkICogR19NSU5JTlQxNjsKKyAgZ2RvdWJsZSB6ZXJvX3AsIHplcm9fbjsKKyAgZ2RvdWJsZSBhX3AsIGJfcCwgY19wOworICBnZG91YmxlIGFfbiwgYl9uLCBjX247CisgIGdkb3VibGUgcjI7CisKKyAgLyogTm90aGluZyB0byBkbyBmb3IgdXMgaGVyZSBpZiB0aHJlc2hvbGQgZXF1YWxzIDAuMAorICAgKiBvciByYXRpbyBlcXVhbHMgMS4wICovCisgIGlmIChmaWx0ZXItPnRocmVzaG9sZCA9PSAwLjAgfHwgZmlsdGVyLT5yYXRpbyA9PSAxLjApCisgICAgcmV0dXJuOworCisgIC8qIHplcm8gY3Jvc3Npbmcgb2Ygb3VyIGZ1bmN0aW9uICovCisgIHplcm9fcCA9ICh0aHJfcCAqIChmaWx0ZXItPnJhdGlvIC0gMS4wKSkgLyAoMS4wICsgZmlsdGVyLT5yYXRpbyk7CisgIHplcm9fbiA9ICh0aHJfbiAqIChmaWx0ZXItPnJhdGlvIC0gMS4wKSkgLyAoMS4wICsgZmlsdGVyLT5yYXRpbyk7CisKKyAgaWYgKHplcm9fcCA8IDAuMCkKKyAgICB6ZXJvX3AgPSAwLjA7CisgIGlmICh6ZXJvX24gPiAwLjApCisgICAgemVyb19uID0gMC4wOworCisgIC8qIHNob3VsZG4ndCBoYXBwZW4gYXMgdGhpcyB3b3VsZCBvbmx5IGhhcHBlbgorICAgKiB3aXRoIHRocmVzaG9sZCA9PSAwLjAgKi8KKyAgZ19hc3NlcnQgKHRocl9wICE9IDApOworICBnX2Fzc2VydCAodGhyX24gIT0gMCk7CisKKyAgLyogV2UgYnVpbGQgYSAybiBkZWdyZWUgcG9seW5vbWlhbCBoZXJlIGZvciB2YWx1ZXMgYmV0d2VlbgorICAgKiAwIGFuZCB0aHJlc2hvbGQgb3IgMCBhbmQgLXRocmVzaG9sZCB3aXRoOgorICAgKiBmKHQpID0gdCwgZicodCkgPSAxLCBmKHopID0gMCwgZicoeikgPSByCisgICAqIHogYmV0d2VlbiAwIGFuZCB0CisgICAqID0+CisgICAqIGEgPSAoMSAtIHJeMikgLyAoNCAqIHQpCisgICAqIGIgPSAoMSArIHJeMikgLyAyCisgICAqIGMgPSB0ICogKDEuMCAtIGIgLSBhKnQpCisgICAqIGYoeCkgPSBheF4yICsgYnggKyBjICovCisgIHIyID0gZmlsdGVyLT5yYXRpbyAqIGZpbHRlci0+cmF0aW87CisgIGFfcCA9ICgxLjAgLSByMikgLyAoNC4wICogdGhyX3ApOworICBiX3AgPSAoMS4wICsgcjIpIC8gMi4wOworICBjX3AgPSB0aHJfcCAqICgxLjAgLSBiX3AgLSBhX3AgKiB0aHJfcCk7CisgIGFfbiA9ICgxLjAgLSByMikgLyAoNC4wICogdGhyX24pOworICBiX24gPSAoMS4wICsgcjIpIC8gMi4wOworICBjX24gPSB0aHJfbiAqICgxLjAgLSBiX24gLSBhX24gKiB0aHJfbik7CisKKyAgZm9yICg7IG51bV9zYW1wbGVzOyBudW1fc2FtcGxlcy0tKSB7CisgICAgdmFsID0gKmRhdGE7CisKKyAgICBpZiAodmFsIDwgdGhyX3AgJiYgdmFsID4gemVyb19wKSB7CisgICAgICB2YWwgPSBhX3AgKiB2YWwgKiB2YWwgKyBiX3AgKiB2YWwgKyBjX3A7CisgICAgfSBlbHNlIGlmICgodmFsIDw9IHplcm9fcCAmJiB2YWwgPiAwKSB8fCAodmFsID49IHplcm9fbiAmJiB2YWwgPCAwKSkgeworICAgICAgdmFsID0gMDsKKyAgICB9IGVsc2UgaWYgKHZhbCA+IHRocl9uICYmIHZhbCA8IHplcm9fbikgeworICAgICAgdmFsID0gYV9uICogdmFsICogdmFsICsgYl9uICogdmFsICsgY19uOworICAgIH0KKyAgICAqZGF0YSsrID0gKGdpbnQxNikgQ0xBTVAgKHZhbCwgR19NSU5JTlQxNiwgR19NQVhJTlQxNik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19keW5hbWljX3RyYW5zZm9ybV9zb2Z0X2tuZWVfZXhwYW5kZXJfZmxvYXQgKEdzdEF1ZGlvRHluYW1pYyAqIGZpbHRlciwKKyAgICBnZmxvYXQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykKK3sKKyAgZ2RvdWJsZSB2YWw7CisgIGdkb3VibGUgdGhyZXNob2xkID0gZmlsdGVyLT50aHJlc2hvbGQ7CisgIGdkb3VibGUgemVybzsKKyAgZ2RvdWJsZSBhX3AsIGJfcCwgY19wOworICBnZG91YmxlIGFfbiwgYl9uLCBjX247CisgIGdkb3VibGUgcjI7CisKKyAgLyogTm90aGluZyB0byBkbyBmb3IgdXMgaGVyZSBpZiB0aHJlc2hvbGQgZXF1YWxzIDAuMAorICAgKiBvciByYXRpbyBlcXVhbHMgMS4wICovCisgIGlmIChmaWx0ZXItPnRocmVzaG9sZCA9PSAwLjAgfHwgZmlsdGVyLT5yYXRpbyA9PSAxLjApCisgICAgcmV0dXJuOworCisgIC8qIHplcm8gY3Jvc3Npbmcgb2Ygb3VyIGZ1bmN0aW9uICovCisgIHplcm8gPSAodGhyZXNob2xkICogKGZpbHRlci0+cmF0aW8gLSAxLjApKSAvICgxLjAgKyBmaWx0ZXItPnJhdGlvKTsKKworICBpZiAoemVybyA8IDAuMCkKKyAgICB6ZXJvID0gMC4wOworCisgIC8qIHNob3VsZG4ndCBoYXBwZW4gYXMgdGhpcyBvbmx5IGhhcHBlbnMgd2l0aAorICAgKiB0aHJlc2hvbGQgPT0gMC4wICovCisgIGdfYXNzZXJ0ICh0aHJlc2hvbGQgIT0gMC4wKTsKKworICAvKiBXZSBidWlsZCBhIDJuIGRlZ3JlZSBwb2x5bm9taWFsIGhlcmUgZm9yIHZhbHVlcyBiZXR3ZWVuCisgICAqIDAgYW5kIHRocmVzaG9sZCBvciAwIGFuZCAtdGhyZXNob2xkIHdpdGg6CisgICAqIGYodCkgPSB0LCBmJyh0KSA9IDEsIGYoeikgPSAwLCBmJyh6KSA9IHIKKyAgICogeiBiZXR3ZWVuIDAgYW5kIHQKKyAgICogPT4KKyAgICogYSA9ICgxIC0gcl4yKSAvICg0ICogdCkKKyAgICogYiA9ICgxICsgcl4yKSAvIDIKKyAgICogYyA9IHQgKiAoMS4wIC0gYiAtIGEqdCkKKyAgICogZih4KSA9IGF4XjIgKyBieCArIGMgKi8KKyAgcjIgPSBmaWx0ZXItPnJhdGlvICogZmlsdGVyLT5yYXRpbzsKKyAgYV9wID0gKDEuMCAtIHIyKSAvICg0LjAgKiB0aHJlc2hvbGQpOworICBiX3AgPSAoMS4wICsgcjIpIC8gMi4wOworICBjX3AgPSB0aHJlc2hvbGQgKiAoMS4wIC0gYl9wIC0gYV9wICogdGhyZXNob2xkKTsKKyAgYV9uID0gKDEuMCAtIHIyKSAvICgtNC4wICogdGhyZXNob2xkKTsKKyAgYl9uID0gKDEuMCArIHIyKSAvIDIuMDsKKyAgY19uID0gLXRocmVzaG9sZCAqICgxLjAgLSBiX24gKyBhX24gKiB0aHJlc2hvbGQpOworCisgIGZvciAoOyBudW1fc2FtcGxlczsgbnVtX3NhbXBsZXMtLSkgeworICAgIHZhbCA9ICpkYXRhOworCisgICAgaWYgKHZhbCA8IHRocmVzaG9sZCAmJiB2YWwgPiB6ZXJvKSB7CisgICAgICB2YWwgPSBhX3AgKiB2YWwgKiB2YWwgKyBiX3AgKiB2YWwgKyBjX3A7CisgICAgfSBlbHNlIGlmICgodmFsIDw9IHplcm8gJiYgdmFsID4gMC4wKSB8fCAodmFsID49IC16ZXJvICYmIHZhbCA8IDAuMCkpIHsKKyAgICAgIHZhbCA9IDAuMDsKKyAgICB9IGVsc2UgaWYgKHZhbCA+IC10aHJlc2hvbGQgJiYgdmFsIDwgLXplcm8pIHsKKyAgICAgIHZhbCA9IGFfbiAqIHZhbCAqIHZhbCArIGJfbiAqIHZhbCArIGNfbjsKKyAgICB9CisgICAgKmRhdGErKyA9IChnZmxvYXQpIHZhbDsKKyAgfQorfQorCisvKiBHc3RCYXNlVHJhbnNmb3JtIHZtZXRob2QgaW1wbGVtZW50YXRpb25zICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F1ZGlvX2R5bmFtaWNfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RBdWRpb0R5bmFtaWMgKmZpbHRlciA9IEdTVF9BVURJT19EWU5BTUlDIChiYXNlKTsKKyAgZ3VpbnQgbnVtX3NhbXBsZXM7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIHN0cmVhbV90aW1lOworICBHc3RNYXBJbmZvIG1hcDsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKyAgc3RyZWFtX3RpbWUgPQorICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZiYXNlLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsIHRpbWVzdGFtcCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAic3luYyB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHN0cmVhbV90aW1lKSkKKyAgICBnc3Rfb2JqZWN0X3N5bmNfdmFsdWVzIChHU1RfT0JKRUNUIChmaWx0ZXIpLCBzdHJlYW1fdGltZSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0dBUCkpKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQURXUklURSk7CisgIG51bV9zYW1wbGVzID0gbWFwLnNpemUgLyBHU1RfQVVESU9fRklMVEVSX0JQUyAoZmlsdGVyKTsKKworICBmaWx0ZXItPnByb2Nlc3MgKGZpbHRlciwgbWFwLmRhdGEsIG51bV9zYW1wbGVzKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5oIGIvZ3N0L2F1ZGlvZngvYXVkaW9keW5hbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxZTRmYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlvZHluYW1pYy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQVVESU9fRFlOQU1JQ19IX18KKyNkZWZpbmUgX19HU1RfQVVESU9fRFlOQU1JQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9BVURJT19EWU5BTUlDICAgICAgICAgICAgKGdzdF9hdWRpb19keW5hbWljX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9BVURJT19EWU5BTUlDKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVVESU9fRFlOQU1JQyxHc3RBdWRpb0R5bmFtaWMpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fRFlOQU1JQyhvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0FVRElPX0RZTkFNSUMpKQorI2RlZmluZSBHU1RfQVVESU9fRFlOQU1JQ19DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcykgLEdTVF9UWVBFX0FVRElPX0RZTkFNSUMsR3N0QXVkaW9EeW5hbWljQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fRFlOQU1JQ19DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcykgLEdTVF9UWVBFX0FVRElPX0RZTkFNSUMpKQorI2RlZmluZSBHU1RfQVVESU9fRFlOQU1JQ19HRVRfQ0xBU1Mob2JqKSAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MoKG9iaikgLEdTVF9UWVBFX0FVRElPX0RZTkFNSUMsR3N0QXVkaW9EeW5hbWljQ2xhc3MpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1ZGlvRHluYW1pYyBHc3RBdWRpb0R5bmFtaWM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9EeW5hbWljQ2xhc3MgR3N0QXVkaW9EeW5hbWljQ2xhc3M7CisKK3R5cGVkZWYgdm9pZCAoKkdzdEF1ZGlvRHluYW1pY1Byb2Nlc3NGdW5jKSAoR3N0QXVkaW9EeW5hbWljICosIGd1aW50OCAqLCBndWludCk7CisKK3N0cnVjdCBfR3N0QXVkaW9EeW5hbWljCit7CisgIEdzdEF1ZGlvRmlsdGVyIGF1ZGlvZmlsdGVyOworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIEdzdEF1ZGlvRHluYW1pY1Byb2Nlc3NGdW5jIHByb2Nlc3M7CisgIGdpbnQgY2hhcmFjdGVyaXN0aWNzOworICBnaW50IG1vZGU7CisgIGdmbG9hdCB0aHJlc2hvbGQ7CisgIGdmbG9hdCByYXRpbzsKK307CisKK3N0cnVjdCBfR3N0QXVkaW9EeW5hbWljQ2xhc3MKK3sKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyBwYXJlbnQ7Cit9OworCitHVHlwZSBnc3RfYXVkaW9fZHluYW1pY19nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BVURJT19EWU5BTUlDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmMgYi9nc3QvYXVkaW9meC9hdWRpb2VjaG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjViZWYxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvYXVkaW9lY2hvLmMKQEAgLTAsMCArMSw1MDQgQEAKKy8qIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXVkaW9lY2hvCisgKgorICogYXVkaW9lY2hvIGFkZHMgYW4gZWNobyBvciAoc2ltcGxlKSByZXZlcmIgZWZmZWN0IHRvIGFuIGF1ZGlvIHN0cmVhbS4gVGhlIGVjaG8KKyAqIGRlbGF5LCBpbnRlbnNpdHkgYW5kIHRoZSBwZXJjZW50YWdlIG9mIGZlZWRiYWNrIGNhbiBiZSBjb25maWd1cmVkLgorICoKKyAqIEZvciBnZXR0aW5nIGFuIGVjaG8gZWZmZWN0IHlvdSBoYXZlIHRvIHNldCB0aGUgZGVsYXkgdG8gYSBsYXJnZXIgdmFsdWUsCisgKiBmb3IgZXhhbXBsZSAyMDBtcyBhbmQgbW9yZS4gRXZlcnl0aGluZyBiZWxvdyB3aWxsIHJlc3VsdCBpbiBhIHNpbXBsZQorICogcmV2ZXJiIGVmZmVjdCwgd2hpY2ggcmVzdWx0cyBpbiBhIHNsaWdodGx5IG1ldGFsbGljIHNvdW5kLgorICoKKyAqIFVzZSB0aGUgbWF4LWRlbGF5IHByb3BlcnR5IHRvIHNldCB0aGUgbWF4aW11bSBhbW91bnQgb2YgZGVsYXkgdGhhdAorICogd2lsbCBiZSB1c2VkLiBUaGlzIGNhbiBvbmx5IGJlIHNldCBiZWZvcmUgZ29pbmcgdG8gdGhlIFBBVVNFRCBvciBQTEFZSU5HCisgKiBzdGF0ZSBhbmQgd2lsbCBiZSBzZXQgdG8gdGhlIGN1cnJlbnQgZGVsYXkgYnkgZGVmYXVsdC4KKyAqCisgKiBhdWRpb2VjaG8gY2FuIGFsc28gYmUgdXNlZCB0byBhcHBseSBhIGNvbmZpZ3VyYWJsZSBkZWxheSB0byBhdWRpbyBjaGFubmVscworICogYnkgc2V0dGluZyBzdXJyb3VuZC1kZWxheT10cnVlLiBJbiB0aGF0IG1vZGUsIGl0IGp1c3QgZGVsYXlzICJzdXJyb3VuZAorICogY2hhbm5lbHMiIGJ5IHRoZSBkZWxheSBhbW91bnQgaW5zdGVhZCBvZiBwZXJmb3JtaW5nIGFuIGVjaG8uIFRoZQorICogY2hhbm5lbHMgdGhhdCBhcmUgY29uZmlndXJlZCBzdXJyb3VuZCBjaGFubmVscyBmb3IgdGhlIGRlbGF5IGFyZQorICogc2VsZWN0ZWQgdXNpbmcgdGhlIHN1cnJvdW5kLWNoYW5uZWxzIG1hc2sgcHJvcGVydHkuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBhdXRvYXVkaW9zcmMgISBhdWRpb2NvbnZlcnQgISBhdWRpb2VjaG8gZGVsYXk9NTAwMDAwMDAwIGludGVuc2l0eT0wLjYgZmVlZGJhY2s9MC40ICEgYXVkaW9jb252ZXJ0ICEgYXV0b2F1ZGlvc2luaworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj0ibWVsbzEub2dnIiAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhIGF1ZGlvZWNobyBkZWxheT01MDAwMDAwMCBpbnRlbnNpdHk9MC42IGZlZWRiYWNrPTAuNCAhIGF1ZGlvY29udmVydCAhIGF1dG9hdWRpb3NpbmsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyAhIGF1ZGlvY29udmVydCAhIGF1ZGlvL3gtcmF3LGNoYW5uZWxzPTQgISBhdWRpb2VjaG8gc3Vycm91bmQtZGVsYXk9dHJ1ZSBkZWxheT01MDAwMDAwMDAgISBhdWRpb2NvbnZlcnQgISBhdXRvYXVkaW9zaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2ZpbHRlci5oPgorCisjaW5jbHVkZSAiYXVkaW9lY2hvLmgiCisKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9hdWRpb19lY2hvX2RlYnVnCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChHU1RfQ0FUX0RFRkFVTFQpOworCisvKiBFdmVyeXRoaW5nIGV4Y2VwdCB0aGUgZmlyc3QgMiBjaGFubmVscyBhcmUgY29uc2lkZXJlZCBzdXJyb3VuZCAqLworI2RlZmluZSBERUZBVUxUX1NVUlJPVU5EX01BU0sgfigoZ3VpbnQ2NCkoMHgzKSkKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfREVMQVksCisgIFBST1BfTUFYX0RFTEFZLAorICBQUk9QX0lOVEVOU0lUWSwKKyAgUFJPUF9GRUVEQkFDSywKKyAgUFJPUF9TVVJfREVMQVksCisgIFBST1BfU1VSX01BU0sKK307CisKKyNkZWZpbmUgQUxMT1dFRF9DQVBTIFwKKyAgICAiYXVkaW8veC1yYXcsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBmb3JtYXQ9KHN0cmluZykgeyJHU1RfQVVESU9fTkUoRjMyKSIsIkdTVF9BVURJT19ORShGNjQpIn0sICIgXAorICAgICIgcmF0ZT0oaW50KVsxLE1BWF0sIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIGNoYW5uZWxzPShpbnQpWzEsTUFYXSwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBsYXlvdXQ9KHN0cmluZykgaW50ZXJsZWF2ZWQiCisKKyNkZWZpbmUgZ3N0X2F1ZGlvX2VjaG9fcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0QXVkaW9FY2hvLCBnc3RfYXVkaW9fZWNobywgR1NUX1RZUEVfQVVESU9fRklMVEVSKTsKKworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2VjaG9fc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2VjaG9fZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2VjaG9fZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F1ZGlvX2VjaG9fc2V0dXAgKEdzdEF1ZGlvRmlsdGVyICogc2VsZiwKKyAgICBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fZWNob19zdG9wIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfYXVkaW9fZWNob190cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19lY2hvX3RyYW5zZm9ybV9mbG9hdCAoR3N0QXVkaW9FY2hvICogc2VsZiwKKyAgICBnZmxvYXQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcyk7CitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fZWNob190cmFuc2Zvcm1fZG91YmxlIChHc3RBdWRpb0VjaG8gKiBzZWxmLAorICAgIGdkb3VibGUgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcyk7CisKKy8qIEdPYmplY3Qgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19lY2hvX2NsYXNzX2luaXQgKEdzdEF1ZGlvRWNob0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqYmFzZXRyYW5zZm9ybV9jbGFzcyA9IChHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKikga2xhc3M7CisgIEdzdEF1ZGlvRmlsdGVyQ2xhc3MgKmF1ZGlvc2VsZl9jbGFzcyA9IChHc3RBdWRpb0ZpbHRlckNsYXNzICopIGtsYXNzOworICBHc3RDYXBzICpjYXBzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfYXVkaW9fZWNob19kZWJ1ZywgImF1ZGlvZWNobyIsIDAsCisgICAgICAiYXVkaW9lY2hvIGVsZW1lbnQiKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9fZWNob19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb19lY2hvX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfYXVkaW9fZWNob19maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RFTEFZLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoImRlbGF5IiwgIkRlbGF5IiwKKyAgICAgICAgICAiRGVsYXkgb2YgdGhlIGVjaG8gaW4gbmFub3NlY29uZHMiLCAxLCBHX01BWFVJTlQ2NCwKKyAgICAgICAgICAxLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MKKyAgICAgICAgICB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01BWF9ERUxBWSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJtYXgtZGVsYXkiLCAiTWF4aW11bSBEZWxheSIsCisgICAgICAgICAgIk1heGltdW0gZGVsYXkgb2YgdGhlIGVjaG8gaW4gbmFub3NlY29uZHMiCisgICAgICAgICAgIiAoY2FuJ3QgYmUgY2hhbmdlZCBpbiBQTEFZSU5HIG9yIFBBVVNFRCBzdGF0ZSkiLAorICAgICAgICAgIDEsIEdfTUFYVUlOVDY0LCAxLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8CisgICAgICAgICAgR1NUX1BBUkFNX01VVEFCTEVfUkVBRFkpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lOVEVOU0lUWSwKKyAgICAgIGdfcGFyYW1fc3BlY19mbG9hdCAoImludGVuc2l0eSIsICJJbnRlbnNpdHkiLAorICAgICAgICAgICJJbnRlbnNpdHkgb2YgdGhlIGVjaG8iLCAwLjAsIDEuMCwKKyAgICAgICAgICAwLjAsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUworICAgICAgICAgIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRkVFREJBQ0ssCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJmZWVkYmFjayIsICJGZWVkYmFjayIsCisgICAgICAgICAgIkFtb3VudCBvZiBmZWVkYmFjayIsIDAuMCwgMS4wLAorICAgICAgICAgIDAuMCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTCisgICAgICAgICAgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TVVJfREVMQVksCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInN1cnJvdW5kLWRlbGF5IiwgIkVuYWJsZSBTdXJyb3VuZCBEZWxheSIsCisgICAgICAgICAgIkRlbGF5IFN1cnJvdW5kIENoYW5uZWxzIHdoZW4gVFJVRSBpbnN0ZWFkIG9mIGFwcGx5aW5nIGFuIGVjaG8gZWZmZWN0IiwKKyAgICAgICAgICBGQUxTRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TVVJfTUFTSywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJzdXJyb3VuZC1tYXNrIiwgIlN1cnJvdW5kIE1hc2siLAorICAgICAgICAgICJBIGJpdG1hc2sgb2YgY2hhbm5lbHMgdGhhdCBhcmUgY29uc2lkZXJlZCBzdXJyb3VuZCBhbmQgZGVsYXllZCB3aGVuIHN1cnJvdW5kLWRlbGF5ID0gVFJVRSIsCisgICAgICAgICAgMSwgR19NQVhVSU5UNjQsIERFRkFVTFRfU1VSUk9VTkRfTUFTSywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfAorICAgICAgICAgIEdTVF9QQVJBTV9NVVRBQkxFX1JFQURZKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkF1ZGlvIGVjaG8iLAorICAgICAgIkZpbHRlci9FZmZlY3QvQXVkaW8iLAorICAgICAgIkFkZHMgYW4gZWNobyBvciByZXZlcmIgZWZmZWN0IHRvIGFuIGF1ZGlvIHN0cmVhbSIsCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBTExPV0VEX0NBUFMpOworICBnc3RfYXVkaW9fZmlsdGVyX2NsYXNzX2FkZF9wYWRfdGVtcGxhdGVzIChHU1RfQVVESU9fRklMVEVSX0NMQVNTIChrbGFzcyksCisgICAgICBjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGF1ZGlvc2VsZl9jbGFzcy0+c2V0dXAgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2VjaG9fc2V0dXApOworICBiYXNldHJhbnNmb3JtX2NsYXNzLT50cmFuc2Zvcm1faXAgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdWRpb19lY2hvX3RyYW5zZm9ybV9pcCk7CisgIGJhc2V0cmFuc2Zvcm1fY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2VjaG9fc3RvcCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZWNob19pbml0IChHc3RBdWRpb0VjaG8gKiBzZWxmKQoreworICBzZWxmLT5kZWxheSA9IDE7CisgIHNlbGYtPm1heF9kZWxheSA9IDE7CisgIHNlbGYtPmludGVuc2l0eSA9IDAuMDsKKyAgc2VsZi0+ZmVlZGJhY2sgPSAwLjA7CisgIHNlbGYtPnN1cmRlbGF5ID0gRkFMU0U7CisgIHNlbGYtPnN1cnJvdW5kX21hc2sgPSBERUZBVUxUX1NVUlJPVU5EX01BU0s7CisKKyAgZ19tdXRleF9pbml0ICgmc2VsZi0+bG9jayk7CisKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9pbl9wbGFjZSAoR1NUX0JBU0VfVFJBTlNGT1JNIChzZWxmKSwgVFJVRSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZWNob19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0QXVkaW9FY2hvICpzZWxmID0gR1NUX0FVRElPX0VDSE8gKG9iamVjdCk7CisKKyAgZ19mcmVlIChzZWxmLT5idWZmZXIpOworICBzZWxmLT5idWZmZXIgPSBOVUxMOworCisgIGdfbXV0ZXhfY2xlYXIgKCZzZWxmLT5sb2NrKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZWNob19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXVkaW9FY2hvICpzZWxmID0gR1NUX0FVRElPX0VDSE8gKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFTEFZOnsKKyAgICAgIGd1aW50NjQgbWF4X2RlbGF5LCBkZWxheTsKKyAgICAgIGd1aW50IHJhdGU7CisKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgZGVsYXkgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIG1heF9kZWxheSA9IHNlbGYtPm1heF9kZWxheTsKKworICAgICAgaWYgKGRlbGF5ID4gbWF4X2RlbGF5ICYmIEdTVF9TVEFURSAoc2VsZikgPiBHU1RfU1RBVEVfUkVBRFkpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiTmV3IGRlbGF5ICglIiBHU1RfVElNRV9GT1JNQVQgIikgIgorICAgICAgICAgICAgImlzIGxhcmdlciB0aGFuIG1heGltdW0gZGVsYXkgKCUiIEdTVF9USU1FX0ZPUk1BVCAiKSIsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChkZWxheSksIEdTVF9USU1FX0FSR1MgKG1heF9kZWxheSkpOworICAgICAgICBzZWxmLT5kZWxheSA9IG1heF9kZWxheTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNlbGYtPmRlbGF5ID0gZGVsYXk7CisgICAgICAgIHNlbGYtPm1heF9kZWxheSA9IE1BWCAoZGVsYXksIG1heF9kZWxheSk7CisgICAgICAgIGlmIChkZWxheSA+IG1heF9kZWxheSkgeworICAgICAgICAgIGdfZnJlZSAoc2VsZi0+YnVmZmVyKTsKKyAgICAgICAgICBzZWxmLT5idWZmZXIgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICByYXRlID0gR1NUX0FVRElPX0ZJTFRFUl9SQVRFIChzZWxmKTsKKyAgICAgIGlmIChyYXRlID4gMCkKKyAgICAgICAgc2VsZi0+ZGVsYXlfZnJhbWVzID0KKyAgICAgICAgICAgIE1BWCAoZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzZWxmLT5kZWxheSwgcmF0ZSwgR1NUX1NFQ09ORCksIDEpOworCisgICAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9NQVhfREVMQVk6eworICAgICAgZ3VpbnQ2NCBtYXhfZGVsYXk7CisKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgbWF4X2RlbGF5ID0gZ192YWx1ZV9nZXRfdWludDY0ICh2YWx1ZSk7CisKKyAgICAgIGlmIChHU1RfU1RBVEUgKHNlbGYpID4gR1NUX1NUQVRFX1JFQURZKSB7CisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJDYW4ndCBjaGFuZ2UgbWF4aW11bSBkZWxheSBpbiIKKyAgICAgICAgICAgICIgUExBWUlORyBvciBQQVVTRUQgc3RhdGUiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNlbGYtPm1heF9kZWxheSA9IG1heF9kZWxheTsKKyAgICAgICAgZ19mcmVlIChzZWxmLT5idWZmZXIpOworICAgICAgICBzZWxmLT5idWZmZXIgPSBOVUxMOworICAgICAgfQorICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfSU5URU5TSVRZOnsKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgc2VsZi0+aW50ZW5zaXR5ID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0ZFRURCQUNLOnsKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgc2VsZi0+ZmVlZGJhY2sgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfU1VSX0RFTEFZOnsKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgc2VsZi0+c3VyZGVsYXkgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9TVVJfTUFTSzp7CisgICAgICBnX211dGV4X2xvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIHNlbGYtPnN1cnJvdW5kX21hc2sgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2VjaG9fZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEF1ZGlvRWNobyAqc2VsZiA9IEdTVF9BVURJT19FQ0hPIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9ERUxBWToKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgc2VsZi0+ZGVsYXkpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfREVMQVk6CisgICAgICBnX211dGV4X2xvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHNlbGYtPm1heF9kZWxheSk7CisgICAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lOVEVOU0lUWToKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBzZWxmLT5pbnRlbnNpdHkpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GRUVEQkFDSzoKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBzZWxmLT5mZWVkYmFjayk7CisgICAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NVUl9ERUxBWToKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNlbGYtPnN1cmRlbGF5KTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1VSX01BU0s6eworICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBzZWxmLT5zdXJyb3VuZF9tYXNrKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBHc3RBdWRpb0ZpbHRlciB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdWRpb19lY2hvX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGJhc2UsIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIEdzdEF1ZGlvRWNobyAqc2VsZiA9IEdTVF9BVURJT19FQ0hPIChiYXNlKTsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICBzd2l0Y2ggKEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoaW5mbykpIHsKKyAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfRjMyOgorICAgICAgc2VsZi0+cHJvY2VzcyA9IChHc3RBdWRpb0VjaG9Qcm9jZXNzRnVuYykKKyAgICAgICAgICBnc3RfYXVkaW9fZWNob190cmFuc2Zvcm1fZmxvYXQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfRjY0OgorICAgICAgc2VsZi0+cHJvY2VzcyA9IChHc3RBdWRpb0VjaG9Qcm9jZXNzRnVuYykKKyAgICAgICAgICBnc3RfYXVkaW9fZWNob190cmFuc2Zvcm1fZG91YmxlOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IEZBTFNFOworICAgICAgYnJlYWs7CisgIH0KKworICBnX2ZyZWUgKHNlbGYtPmJ1ZmZlcik7CisgIHNlbGYtPmJ1ZmZlciA9IE5VTEw7CisgIHNlbGYtPmJ1ZmZlcl9wb3MgPSAwOworICBzZWxmLT5idWZmZXJfc2l6ZSA9IDA7CisgIHNlbGYtPmJ1ZmZlcl9zaXplX2ZyYW1lcyA9IDA7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYXVkaW9fZWNob19zdG9wIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSkKK3sKKyAgR3N0QXVkaW9FY2hvICpzZWxmID0gR1NUX0FVRElPX0VDSE8gKGJhc2UpOworCisgIGdfZnJlZSAoc2VsZi0+YnVmZmVyKTsKKyAgc2VsZi0+YnVmZmVyID0gTlVMTDsKKyAgc2VsZi0+YnVmZmVyX3BvcyA9IDA7CisgIHNlbGYtPmJ1ZmZlcl9zaXplID0gMDsKKyAgc2VsZi0+YnVmZmVyX3NpemVfZnJhbWVzID0gMDsKKworICByZXR1cm4gVFJVRTsKK30KKworI2RlZmluZSBUUkFOU0ZPUk1fRlVOQyhuYW1lLCB0eXBlKSBcCitzdGF0aWMgdm9pZCBcCitnc3RfYXVkaW9fZWNob190cmFuc2Zvcm1fIyNuYW1lIChHc3RBdWRpb0VjaG8gKiBzZWxmLCBcCisgICAgdHlwZSAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKSBcCit7IFwKKyAgdHlwZSAqYnVmZmVyID0gKHR5cGUgKikgc2VsZi0+YnVmZmVyOyBcCisgIGd1aW50IGNoYW5uZWxzID0gR1NUX0FVRElPX0ZJTFRFUl9DSEFOTkVMUyAoc2VsZik7IFwKKyAgZ3VpbnQgaSwgajsgXAorICBndWludCBlY2hvX29mZnNldCA9IHNlbGYtPmJ1ZmZlcl9zaXplX2ZyYW1lcyAtIHNlbGYtPmRlbGF5X2ZyYW1lczsgXAorICBnZG91YmxlIGludGVuc2l0eSA9IHNlbGYtPmludGVuc2l0eTsgXAorICBnZG91YmxlIGZlZWRiYWNrID0gc2VsZi0+ZmVlZGJhY2s7IFwKKyAgZ3VpbnQgYnVmZmVyX3BvcyA9IHNlbGYtPmJ1ZmZlcl9wb3M7IFwKKyAgZ3VpbnQgYnVmZmVyX3NpemVfZnJhbWVzID0gc2VsZi0+YnVmZmVyX3NpemVfZnJhbWVzOyBcCisgIFwKKyAgaWYgKHNlbGYtPnN1cmRlbGF5ID09IEZBTFNFKSB7IFwKKyAgICBndWludCByZWFkX3BvcyA9ICgoZWNob19vZmZzZXQgKyBidWZmZXJfcG9zKSAlIGJ1ZmZlcl9zaXplX2ZyYW1lcykgKiBjaGFubmVsczsgXAorICAgIGd1aW50IHdyaXRlX3BvcyA9IChidWZmZXJfcG9zICUgYnVmZmVyX3NpemVfZnJhbWVzKSAqIGNoYW5uZWxzOyBcCisgICAgZ3VpbnQgYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZV9mcmFtZXMgKiBjaGFubmVsczsgXAorICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc2FtcGxlczsgaSsrKSB7IFwKKyAgICAgIGdkb3VibGUgaW4gPSAqZGF0YTsgXAorICAgICAgZ2RvdWJsZSBlY2hvID0gYnVmZmVyW3JlYWRfcG9zXTsgXAorICAgICAgdHlwZSBvdXQgPSBpbiArIGludGVuc2l0eSAqIGVjaG87IFwKKyAgICAgIFwKKyAgICAgICpkYXRhID0gb3V0OyBcCisgICAgICBcCisgICAgICBidWZmZXJbd3JpdGVfcG9zXSA9IGluICsgZmVlZGJhY2sgKiBlY2hvOyBcCisgICAgICByZWFkX3BvcyA9IChyZWFkX3BvcyArIDEpICUgYnVmZmVyX3NpemU7IFwKKyAgICAgIHdyaXRlX3BvcyA9ICh3cml0ZV9wb3MgKyAxKSAlIGJ1ZmZlcl9zaXplOyBcCisgICAgICBkYXRhKys7IFwKKyAgICB9IFwKKyAgICBidWZmZXJfcG9zID0gd3JpdGVfcG9zIC8gY2hhbm5lbHM7IFwKKyAgfSBlbHNlIHsgXAorICAgIGd1aW50NjQgc3Vycm91bmRfbWFzayA9IHNlbGYtPnN1cnJvdW5kX21hc2s7IFwKKyAgICBndWludCByZWFkX3BvcyA9ICgoZWNob19vZmZzZXQgKyBidWZmZXJfcG9zKSAlIGJ1ZmZlcl9zaXplX2ZyYW1lcykgKiBjaGFubmVsczsgXAorICAgIGd1aW50IHdyaXRlX3BvcyA9IChidWZmZXJfcG9zICUgYnVmZmVyX3NpemVfZnJhbWVzKSAqIGNoYW5uZWxzOyBcCisgICAgZ3VpbnQgYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZV9mcmFtZXMgKiBjaGFubmVsczsgXAorICAgIFwKKyAgICBudW1fc2FtcGxlcyAvPSBjaGFubmVsczsgXAorICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NhbXBsZXM7IGkrKykgeyBcCisgICAgICBndWludDY0IGNoYW5uZWxfbWFzayA9IDE7IFwKKyAgICAgIFwKKyAgICAgIGZvciAoaiA9IDA7IGogPCBjaGFubmVsczsgaisrKSB7IFwKKyAgICAgICAgaWYgKGNoYW5uZWxfbWFzayAmIHN1cnJvdW5kX21hc2spIHsgXAorICAgICAgICAgIGdkb3VibGUgaW4gPSBkYXRhW2pdOyBcCisgICAgICAgICAgZ2RvdWJsZSBlY2hvID0gYnVmZmVyW3JlYWRfcG9zICsgal07IFwKKyAgICAgICAgICB0eXBlIG91dCA9IGVjaG87IFwKKyAgICAgICAgICBcCisgICAgICAgICAgZGF0YVtqXSA9IG91dDsgXAorICAgICAgICAgIFwKKyAgICAgICAgICBidWZmZXJbd3JpdGVfcG9zICsgal0gPSBpbjsgXAorICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgZ2RvdWJsZSBpbiA9IGRhdGFbal07IFwKKyAgICAgICAgICBnZG91YmxlIGVjaG8gPSBidWZmZXJbcmVhZF9wb3MgKyBqXTsgXAorICAgICAgICAgIHR5cGUgb3V0ID0gaW4gKyBpbnRlbnNpdHkgKiBlY2hvOyBcCisgICAgICAgICAgXAorICAgICAgICAgIGRhdGFbal0gPSBvdXQ7IFwKKyAgICAgICAgICBcCisgICAgICAgICAgYnVmZmVyW3dyaXRlX3BvcyArIGpdID0gaW4gKyBmZWVkYmFjayAqIGVjaG87IFwKKyAgICAgICAgfSBcCisgICAgICAgIGNoYW5uZWxfbWFzayA8PD0gMTsgXAorICAgICAgfSBcCisgICAgICByZWFkX3BvcyA9IChyZWFkX3BvcyArIGNoYW5uZWxzKSAlIGJ1ZmZlcl9zaXplOyBcCisgICAgICB3cml0ZV9wb3MgPSAod3JpdGVfcG9zICsgY2hhbm5lbHMpICUgYnVmZmVyX3NpemU7IFwKKyAgICAgIGRhdGEgKz0gY2hhbm5lbHM7IFwKKyAgICB9IFwKKyAgICBidWZmZXJfcG9zID0gd3JpdGVfcG9zIC8gY2hhbm5lbHM7IFwKKyAgfSBcCisgIHNlbGYtPmJ1ZmZlcl9wb3MgPSBidWZmZXJfcG9zOyBcCit9CisKK1RSQU5TRk9STV9GVU5DIChmbG9hdCwgZ2Zsb2F0KTsKK1RSQU5TRk9STV9GVU5DIChkb3VibGUsIGdkb3VibGUpOworCisvKiBHc3RCYXNlVHJhbnNmb3JtIHZtZXRob2QgaW1wbGVtZW50YXRpb25zICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F1ZGlvX2VjaG9fdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RBdWRpb0VjaG8gKnNlbGYgPSBHU1RfQVVESU9fRUNITyAoYmFzZSk7CisgIGd1aW50IG51bV9zYW1wbGVzOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBzdHJlYW1fdGltZTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpOworICBzdHJlYW1fdGltZSA9CisgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJmJhc2UtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAic3luYyB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHN0cmVhbV90aW1lKSkKKyAgICBnc3Rfb2JqZWN0X3N5bmNfdmFsdWVzIChHU1RfT0JKRUNUIChzZWxmKSwgc3RyZWFtX3RpbWUpOworCisgIGlmIChzZWxmLT5idWZmZXIgPT0gTlVMTCkgeworICAgIGd1aW50IGJwZiwgcmF0ZTsKKworICAgIGJwZiA9IEdTVF9BVURJT19GSUxURVJfQlBGIChzZWxmKTsKKyAgICByYXRlID0gR1NUX0FVRElPX0ZJTFRFUl9SQVRFIChzZWxmKTsKKworICAgIHNlbGYtPmRlbGF5X2ZyYW1lcyA9CisgICAgICAgIE1BWCAoZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzZWxmLT5kZWxheSwgcmF0ZSwgR1NUX1NFQ09ORCksIDEpOworICAgIHNlbGYtPmJ1ZmZlcl9zaXplX2ZyYW1lcyA9CisgICAgICAgIE1BWCAoZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzZWxmLT5tYXhfZGVsYXksIHJhdGUsIEdTVF9TRUNPTkQpLCAxKTsKKworICAgIHNlbGYtPmJ1ZmZlcl9zaXplID0gc2VsZi0+YnVmZmVyX3NpemVfZnJhbWVzICogYnBmOworICAgIHNlbGYtPmJ1ZmZlciA9IGdfdHJ5X21hbGxvYzAgKHNlbGYtPmJ1ZmZlcl9zaXplKTsKKyAgICBzZWxmLT5idWZmZXJfcG9zID0gMDsKKworICAgIGlmIChzZWxmLT5idWZmZXIgPT0gTlVMTCkgeworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJGYWlsZWQgdG8gYWxsb2NhdGUgJXUgYnl0ZXMiLCBzZWxmLT5idWZmZXJfc2l6ZSk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorICB9CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEV1JJVEUpOworICBudW1fc2FtcGxlcyA9IG1hcC5zaXplIC8gR1NUX0FVRElPX0ZJTFRFUl9CUFMgKHNlbGYpOworCisgIHNlbGYtPnByb2Nlc3MgKHNlbGYsIG1hcC5kYXRhLCBudW1fc2FtcGxlcyk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb2VjaG8uaCBiL2dzdC9hdWRpb2Z4L2F1ZGlvZWNoby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNjg5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2VjaG8uaApAQCAtMCwwICsxLDczIEBACisvKiAKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA5IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQVVESU9fRUNIT19IX18KKyNkZWZpbmUgX19HU1RfQVVESU9fRUNIT19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9BVURJT19FQ0hPICAgICAgICAgICAgKGdzdF9hdWRpb19lY2hvX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9BVURJT19FQ0hPKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVVESU9fRUNITyxHc3RBdWRpb0VjaG8pKQorI2RlZmluZSBHU1RfSVNfQVVESU9fRUNITyhvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0FVRElPX0VDSE8pKQorI2RlZmluZSBHU1RfQVVESU9fRUNIT19DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcykgLEdTVF9UWVBFX0FVRElPX0VDSE8sR3N0QXVkaW9FY2hvQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fRUNIT19DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcykgLEdTVF9UWVBFX0FVRElPX0VDSE8pKQorI2RlZmluZSBHU1RfQVVESU9fRUNIT19HRVRfQ0xBU1Mob2JqKSAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MoKG9iaikgLEdTVF9UWVBFX0FVRElPX0VDSE8sR3N0QXVkaW9FY2hvQ2xhc3MpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1ZGlvRWNobyBHc3RBdWRpb0VjaG87Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9FY2hvQ2xhc3MgR3N0QXVkaW9FY2hvQ2xhc3M7CisKK3R5cGVkZWYgdm9pZCAoKkdzdEF1ZGlvRWNob1Byb2Nlc3NGdW5jKSAoR3N0QXVkaW9FY2hvICosIGd1aW50OCAqLCBndWludCk7CisKK3N0cnVjdCBfR3N0QXVkaW9FY2hvCit7CisgIEdzdEF1ZGlvRmlsdGVyIGF1ZGlvZmlsdGVyOworCisgIGd1aW50NjQgZGVsYXk7CisgIGd1aW50NjQgbWF4X2RlbGF5OworICBnZmxvYXQgaW50ZW5zaXR5OworICBnZmxvYXQgZmVlZGJhY2s7CisgIGdib29sZWFuIHN1cmRlbGF5OworICBndWludDY0IHN1cnJvdW5kX21hc2s7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgR3N0QXVkaW9FY2hvUHJvY2Vzc0Z1bmMgcHJvY2VzczsKKyAgZ3VpbnQgZGVsYXlfZnJhbWVzOworICBndWludDggKmJ1ZmZlcjsKKyAgZ3VpbnQgYnVmZmVyX3BvczsKKyAgZ3VpbnQgYnVmZmVyX3NpemU7CisgIGd1aW50IGJ1ZmZlcl9zaXplX2ZyYW1lczsKKworICBHTXV0ZXggbG9jazsKK307CisKK3N0cnVjdCBfR3N0QXVkaW9FY2hvQ2xhc3MKK3sKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyBwYXJlbnQ7Cit9OworCitHVHlwZSBnc3RfYXVkaW9fZWNob19nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BVURJT19FQ0hPX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9maXJmaWx0ZXIuYyBiL2dzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiMzJmMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKiAKKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hdWRpb2ZpcmZpbHRlcgorICoKKyAqIGF1ZGlvZmlyZmlsdGVyIGltcGxlbWVudHMgYSBnZW5lcmljIGF1ZGlvIDx1bGluayB1cmw9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmluaXRlX2ltcHVsc2VfcmVzcG9uc2UiPkZJUiBmaWx0ZXI8L3VsaW5rPi4gQmVmb3JlIHVzYWdlIHRoZQorICogImtlcm5lbCIgcHJvcGVydHkgaGFzIHRvIGJlIHNldCB0byB0aGUgZmlsdGVyIGtlcm5lbCB0aGF0IHNob3VsZCBiZQorICogdXNlZCBhbmQgdGhlICJsYXRlbmN5IiBwcm9wZXJ0eSBoYXMgdG8gYmUgc2V0IHRvIHRoZSBsYXRlbmN5IChpbiBzYW1wbGVzKQorICogdGhhdCBpcyBpbnRyb2R1Y2VkIGJ5IHRoZSBmaWx0ZXIga2VybmVsLiBTZXR0aW5nIGEgbGF0ZW5jeSBvZiBuIHNhbXBsZXMKKyAqIHdpbGwgbGVhZCB0byB0aGUgZmlyc3QgbiBzYW1wbGVzIGJlaW5nIGRyb3BwZWQgZnJvbSB0aGUgb3V0cHV0IGFuZAorICogbiBzYW1wbGVzIGFkZGVkIHRvIHRoZSBlbmQuCisgKgorICogVGhlIGZpbHRlciBrZXJuZWwgZGVzY3JpYmVzIHRoZSBpbXB1bHNlIHJlc3BvbnNlIG9mIHRoZSBmaWx0ZXIuIFRvCisgKiBjYWxjdWxhdGUgdGhlIGZyZXF1ZW5jeSByZXNwb25zZSBvZiB0aGUgZmlsdGVyIHlvdSBoYXZlIHRvIGNhbGN1bGF0ZQorICogdGhlIEZvdXJpZXIgVHJhbnNmb3JtIG9mIHRoZSBpbXB1bHNlIHJlc3BvbnNlLgorICoKKyAqIFRvIGNoYW5nZSB0aGUgZmlsdGVyIGtlcm5lbCB3aGVuZXZlciB0aGUgc2FtcGxpbmcgcmF0ZSBjaGFuZ2VzIHRoZQorICogInJhdGUtY2hhbmdlZCIgc2lnbmFsIGNhbiBiZSB1c2VkLiBUaGlzIHNob3VsZCBiZSBkb25lIGZvciBtb3N0CisgKiBGSVIgZmlsdGVycyBhcyB0aGV5J3JlIGRlcGVuZGluZyBvbiB0aGUgc2FtcGxpbmcgcmF0ZS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBhcHBsaWNhdGlvbjwvdGl0bGU+CisgKiA8aW5mb3JtYWxleGFtcGxlPjxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iQyI+CisgKiA8eGk6aW5jbHVkZSB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy9YSW5jbHVkZSIgcGFyc2U9InRleHQiIGhyZWY9Ii4uLy4uLy4uLy4uL3Rlc3RzL2V4YW1wbGVzL2F1ZGlvZngvZmlyZmlsdGVyLWV4YW1wbGUuYyIgLz4KKyAqIDwvcHJvZ3JhbWxpc3Rpbmc+PC9pbmZvcm1hbGV4YW1wbGU+CisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qIEZJWE1FIDAuMTE6IHN1cHByZXNzIHdhcm5pbmdzIGZvciBkZXByZWNhdGVkIEFQSSBzdWNoIGFzIEdWYWx1ZUFycmF5CisgKiB3aXRoIG5ld2VyIEdMaWIgdmVyc2lvbnMgKD49IDIuMzEuMCkgKi8KKyNkZWZpbmUgR0xJQl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlICJhdWRpb2ZpcmZpbHRlci5oIgorCisjaW5jbHVkZSAiZ3N0L2dsaWItY29tcGF0LXByaXZhdGUuaCIKKworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfZGVidWcKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKEdTVF9DQVRfREVGQVVMVCk7CisKK2VudW0KK3sKKyAgU0lHTkFMX1JBVEVfQ0hBTkdFRCwKKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0tFUk5FTCwKKyAgUFJPUF9MQVRFTkNZCit9OworCitzdGF0aWMgZ3VpbnQgZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAsIH07CisKKyNkZWZpbmUgZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0QXVkaW9GSVJGaWx0ZXIsIGdzdF9hdWRpb19maXJfZmlsdGVyLAorICAgIEdTVF9UWVBFX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUik7CisKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19maXJfZmlsdGVyX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19maXJfZmlsdGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19maXJfZmlsdGVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hdWRpb19maXJfZmlsdGVyX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGJhc2UsCisgICAgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbyk7CisKKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19maXJfZmlsdGVyX2NsYXNzX2luaXQgKEdzdEF1ZGlvRklSRmlsdGVyQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyAqZmlsdGVyX2NsYXNzID0gKEdzdEF1ZGlvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9hdWRpb19maXJfZmlsdGVyX2RlYnVnLCAiYXVkaW9maXJmaWx0ZXIiLCAwLAorICAgICAgIkdlbmVyaWMgYXVkaW8gRklSIGZpbHRlciBwbHVnaW4iKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9fZmlyX2ZpbHRlcl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb19maXJfZmlsdGVyX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfYXVkaW9fZmlyX2ZpbHRlcl9maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0tFUk5FTCwKKyAgICAgIGdfcGFyYW1fc3BlY192YWx1ZV9hcnJheSAoImtlcm5lbCIsICJGaWx0ZXIgS2VybmVsIiwKKyAgICAgICAgICAiRmlsdGVyIGtlcm5lbCBmb3IgdGhlIEZJUiBmaWx0ZXIiLAorICAgICAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJFbGVtZW50IiwgIkZpbHRlciBLZXJuZWwgRWxlbWVudCIsCisgICAgICAgICAgICAgICJFbGVtZW50IG9mIHRoZSBmaWx0ZXIga2VybmVsIiwgLUdfTUFYRE9VQkxFLCBHX01BWERPVUJMRSwgMC4wLAorICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0xBVEVOQ1ksCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgibGF0ZW5jeSIsICJMYXRlY3kiLAorICAgICAgICAgICJGaWx0ZXIgbGF0ZW5jeSBpbiBzYW1wbGVzIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQ2NCwgMCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZmlsdGVyX2NsYXNzLT5zZXR1cCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9fZmlyX2ZpbHRlcl9zZXR1cCk7CisKKyAgLyoqCisgICAqIEdzdEF1ZGlvRklSRmlsdGVyOjpyYXRlLWNoYW5nZWQ6CisgICAqIEBmaWx0ZXI6IHRoZSBmaWx0ZXIgb24gd2hpY2ggdGhlIHNpZ25hbCBpcyBlbWl0dGVkCisgICAqIEByYXRlOiB0aGUgbmV3IHNhbXBsaW5nIHJhdGUKKyAgICoKKyAgICogV2lsbCBiZSBlbWl0dGVkIHdoZW4gdGhlIHNhbXBsaW5nIHJhdGUgY2hhbmdlcy4gVGhlIGNhbGxiYWNrcworICAgKiB3aWxsIGJlIGNhbGxlZCBmcm9tIHRoZSBzdHJlYW1pbmcgdGhyZWFkIGFuZCBwcm9jZXNzaW5nIHdpbGwKKyAgICogc3RvcCB1bnRpbCB0aGUgZXZlbnQgaXMgaGFuZGxlZC4KKyAgICovCisgIGdzdF9hdWRpb19maXJfZmlsdGVyX3NpZ25hbHNbU0lHTkFMX1JBVEVfQ0hBTkdFRF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgicmF0ZS1jaGFuZ2VkIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdEF1ZGlvRklSRmlsdGVyQ2xhc3MsIHJhdGVfY2hhbmdlZCksCisgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX0lOVCk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJBdWRpbyBGSVIgZmlsdGVyIiwgIkZpbHRlci9FZmZlY3QvQXVkaW8iLAorICAgICAgIkdlbmVyaWMgYXVkaW8gRklSIGZpbHRlciB3aXRoIGN1c3RvbSBmaWx0ZXIga2VybmVsIiwKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19maXJfZmlsdGVyX3VwZGF0ZV9rZXJuZWwgKEdzdEF1ZGlvRklSRmlsdGVyICogc2VsZiwgR1ZhbHVlQXJyYXkgKiB2YSkKK3sKKyAgZ2RvdWJsZSAqa2VybmVsOworICBndWludCBpOworCisgIGlmICh2YSkgeworICAgIGlmIChzZWxmLT5rZXJuZWwpCisgICAgICBnX3ZhbHVlX2FycmF5X2ZyZWUgKHNlbGYtPmtlcm5lbCk7CisKKyAgICBzZWxmLT5rZXJuZWwgPSB2YTsKKyAgfQorCisgIGtlcm5lbCA9IGdfbmV3IChnZG91YmxlLCBzZWxmLT5rZXJuZWwtPm5fdmFsdWVzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+a2VybmVsLT5uX3ZhbHVlczsgaSsrKSB7CisgICAgR1ZhbHVlICp2ID0gZ192YWx1ZV9hcnJheV9nZXRfbnRoIChzZWxmLT5rZXJuZWwsIGkpOworICAgIGtlcm5lbFtpXSA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodik7CisgIH0KKworICBnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3NldF9rZXJuZWwgKEdTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIgKHNlbGYpLAorICAgICAga2VybmVsLCBzZWxmLT5rZXJuZWwtPm5fdmFsdWVzLCBzZWxmLT5sYXRlbmN5LCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19maXJfZmlsdGVyX2luaXQgKEdzdEF1ZGlvRklSRmlsdGVyICogc2VsZikKK3sKKyAgR1ZhbHVlIHYgPSB7IDAsIH07CisgIEdWYWx1ZUFycmF5ICp2YTsKKworICBzZWxmLT5sYXRlbmN5ID0gMDsKKyAgdmEgPSBnX3ZhbHVlX2FycmF5X25ldyAoMSk7CisKKyAgZ192YWx1ZV9pbml0ICgmdiwgR19UWVBFX0RPVUJMRSk7CisgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIDEuMCk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kICh2YSwgJnYpOworICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisgIGdzdF9hdWRpb19maXJfZmlsdGVyX3VwZGF0ZV9rZXJuZWwgKHNlbGYsIHZhKTsKKworICBnX211dGV4X2luaXQgKCZzZWxmLT5sb2NrKTsKK30KKworLyogR3N0QXVkaW9GaWx0ZXIgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworLyogZ2V0IG5vdGlmaWVkIG9mIGNhcHMgYW5kIHBsdWcgaW4gdGhlIGNvcnJlY3QgcHJvY2VzcyBmdW5jdGlvbiAqLworc3RhdGljIGdib29sZWFuCitnc3RfYXVkaW9fZmlyX2ZpbHRlcl9zZXR1cCAoR3N0QXVkaW9GaWx0ZXIgKiBiYXNlLCBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKQoreworICBHc3RBdWRpb0ZJUkZpbHRlciAqc2VsZiA9IEdTVF9BVURJT19GSVJfRklMVEVSIChiYXNlKTsKKyAgZ2ludCBuZXdfcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKGluZm8pOworCisgIGlmIChHU1RfQVVESU9fRklMVEVSX1JBVEUgKHNlbGYpICE9IG5ld19yYXRlKSB7CisgICAgZ19zaWduYWxfZW1pdCAoR19PQkpFQ1QgKHNlbGYpLAorICAgICAgICBnc3RfYXVkaW9fZmlyX2ZpbHRlcl9zaWduYWxzW1NJR05BTF9SQVRFX0NIQU5HRURdLCAwLCBuZXdfcmF0ZSk7CisgIH0KKworICByZXR1cm4gR1NUX0FVRElPX0ZJTFRFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2V0dXAgKGJhc2UsIGluZm8pOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEF1ZGlvRklSRmlsdGVyICpzZWxmID0gR1NUX0FVRElPX0ZJUl9GSUxURVIgKG9iamVjdCk7CisKKyAgZ19tdXRleF9jbGVhciAoJnNlbGYtPmxvY2spOworCisgIGlmIChzZWxmLT5rZXJuZWwpCisgICAgZ192YWx1ZV9hcnJheV9mcmVlIChzZWxmLT5rZXJuZWwpOworICBzZWxmLT5rZXJuZWwgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19maXJfZmlsdGVyX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb0ZJUkZpbHRlciAqc2VsZiA9IEdTVF9BVURJT19GSVJfRklMVEVSIChvYmplY3QpOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19BVURJT19GSVJfRklMVEVSIChzZWxmKSk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0tFUk5FTDoKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgLyogdXBkYXRlIGtlcm5lbCBhbHJlYWR5IHB1c2hlcyByZXNpZHVlcyAqLworICAgICAgZ3N0X2F1ZGlvX2Zpcl9maWx0ZXJfdXBkYXRlX2tlcm5lbCAoc2VsZiwgZ192YWx1ZV9kdXBfYm94ZWQgKHZhbHVlKSk7CisgICAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xBVEVOQ1k6CisgICAgICBnX211dGV4X2xvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIHNlbGYtPmxhdGVuY3kgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGdzdF9hdWRpb19maXJfZmlsdGVyX3VwZGF0ZV9rZXJuZWwgKHNlbGYsIE5VTEwpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19maXJfZmlsdGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb0ZJUkZpbHRlciAqc2VsZiA9IEdTVF9BVURJT19GSVJfRklMVEVSIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9LRVJORUw6CisgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIHNlbGYtPmtlcm5lbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTEFURU5DWToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHNlbGYtPmxhdGVuY3kpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9maXJmaWx0ZXIuaCBiL2dzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiMzQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlvZmlyZmlsdGVyLmgKQEAgLTAsMCArMSw3MSBAQAorLyogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqIAorICovCisKKyNpZm5kZWYgX19HU1RfQVVESU9fRklSX0ZJTFRFUl9IX18KKyNkZWZpbmUgX19HU1RfQVVESU9fRklSX0ZJTFRFUl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuaD4KKworI2luY2x1ZGUgImF1ZGlvZnhiYXNlZmlyZmlsdGVyLmgiCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9BVURJT19GSVJfRklMVEVSIFwKKyAgKGdzdF9hdWRpb19maXJfZmlsdGVyX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9BVURJT19GSVJfRklMVEVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVVESU9fRklSX0ZJTFRFUixHc3RBdWRpb0ZJUkZpbHRlcikpCisjZGVmaW5lIEdTVF9BVURJT19GSVJfRklMVEVSX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0FVRElPX0ZJUl9GSUxURVIsR3N0QXVkaW9GSVJGaWx0ZXJDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BVURJT19GSVJfRklMVEVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVVESU9fRklSX0ZJTFRFUikpCisjZGVmaW5lIEdTVF9JU19BVURJT19GSVJfRklMVEVSX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0FVRElPX0ZJUl9GSUxURVIpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9GSVJGaWx0ZXIgR3N0QXVkaW9GSVJGaWx0ZXI7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9GSVJGaWx0ZXJDbGFzcyBHc3RBdWRpb0ZJUkZpbHRlckNsYXNzOworCisvKioKKyAqIEdzdEF1ZGlvRklSRmlsdGVyOgorICoKKyAqIE9wYXF1ZSBkYXRhIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RBdWRpb0ZJUkZpbHRlciB7CisgIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyIHBhcmVudDsKKworICBHVmFsdWVBcnJheSAqa2VybmVsOworICBndWludDY0IGxhdGVuY3k7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgR011dGV4IGxvY2s7Cit9OworCitzdHJ1Y3QgX0dzdEF1ZGlvRklSRmlsdGVyQ2xhc3MgeworICBHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlckNsYXNzIHBhcmVudDsKKworICB2b2lkICgqcmF0ZV9jaGFuZ2VkKSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIGdpbnQgcmF0ZSk7Cit9OworCitHVHlwZSBnc3RfYXVkaW9fZmlyX2ZpbHRlcl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BVURJT19GSVJfRklMVEVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9meC5jIGIvZ3N0L2F1ZGlvZngvYXVkaW9meC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZGRhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2Z4LmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA2IFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJhdWRpb3Bhbm9yYW1hLmgiCisjaW5jbHVkZSAiYXVkaW9pbnZlcnQuaCIKKyNpbmNsdWRlICJhdWRpb2thcmFva2UuaCIKKyNpbmNsdWRlICJhdWRpb2FtcGxpZnkuaCIKKyNpbmNsdWRlICJhdWRpb2R5bmFtaWMuaCIKKyNpbmNsdWRlICJhdWRpb2NoZWJsaW1pdC5oIgorI2luY2x1ZGUgImF1ZGlvY2hlYmJhbmQuaCIKKyNpbmNsdWRlICJhdWRpb2lpcmZpbHRlci5oIgorI2luY2x1ZGUgImF1ZGlvd3NpbmNiYW5kLmgiCisjaW5jbHVkZSAiYXVkaW93c2luY2xpbWl0LmgiCisjaW5jbHVkZSAiYXVkaW9maXJmaWx0ZXIuaCIKKyNpbmNsdWRlICJhdWRpb2VjaG8uaCIKKyNpbmNsdWRlICJnc3RzY2FsZXRlbXBvLmgiCisKKy8qIGVudHJ5IHBvaW50IHRvIGluaXRpYWxpemUgdGhlIHBsdWctaW4KKyAqIGluaXRpYWxpemUgdGhlIHBsdWctaW4gaXRzZWxmCisgKiByZWdpc3RlciB0aGUgZWxlbWVudCBmYWN0b3JpZXMgYW5kIHBhZCB0ZW1wbGF0ZXMKKyAqIHJlZ2lzdGVyIHRoZSBmZWF0dXJlcworICovCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiAoZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImF1ZGlvcGFub3JhbWEiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX0FVRElPX1BBTk9SQU1BKSAmJgorICAgICAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImF1ZGlvaW52ZXJ0IiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9BVURJT19JTlZFUlQpICYmCisgICAgICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXVkaW9rYXJhb2tlIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9BVURJT19LQVJBT0tFKSAmJgorICAgICAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImF1ZGlvYW1wbGlmeSIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfQVVESU9fQU1QTElGWSkgJiYKKyAgICAgIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJhdWRpb2R5bmFtaWMiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX0FVRElPX0RZTkFNSUMpICYmCisgICAgICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXVkaW9jaGVibGltaXQiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX0FVRElPX0NIRUJfTElNSVQpICYmCisgICAgICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXVkaW9jaGViYmFuZCIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfQVVESU9fQ0hFQl9CQU5EKSAmJgorICAgICAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImF1ZGlvaWlyZmlsdGVyIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9BVURJT19JSVJfRklMVEVSKSAmJgorICAgICAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImF1ZGlvd3NpbmNsaW1pdCIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfQVVESU9fV1NJTkNfTElNSVQpICYmCisgICAgICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXVkaW93c2luY2JhbmQiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX0FVRElPX1dTSU5DX0JBTkQpICYmCisgICAgICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXVkaW9maXJmaWx0ZXIiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX0FVRElPX0ZJUl9GSUxURVIpICYmCisgICAgICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXVkaW9lY2hvIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9BVURJT19FQ0hPKSAmJgorICAgICAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInNjYWxldGVtcG8iLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX1NDQUxFVEVNUE8pKTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGF1ZGlvZngsCisgICAgIkF1ZGlvIGVmZmVjdHMgcGx1Z2luIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmMgYi9nc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYWZiMGEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWZpcmZpbHRlci5jCkBAIC0wLDAgKzEsMTA4NiBAQAorLyogLSotIGMtYmFzaWMtb2Zmc2V0OiAyIC0qLQorICogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgIDIwMDYgRHJlYW1sYWIgVGVjaG5vbG9naWVzIEx0ZC4gPG1hdGhpcy5ob2ZlckBkcmVhbWxhYi5uZXQ+CisgKiAgICAgICAgICAgICAgIDIwMDctMjAwOSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqIAorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlICJhdWRpb2Z4YmFzZWZpcmZpbHRlci5oIgorCisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX2RlYnVnCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChHU1RfQ0FUX0RFRkFVTFQpOworCisjZGVmaW5lIEFMTE9XRURfQ0FQUyBcCisgICAgImF1ZGlvL3gtcmF3LCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBmb3JtYXQ9KHN0cmluZyl7IkdTVF9BVURJT19ORShGMzIpIiwiR1NUX0FVRElPX05FKEY2NCkifSwgIiBcCisgICAgIiByYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBjaGFubmVscyA9IChpbnQpIFsgMSwgTUFYIF0sICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBsYXlvdXQ9KHN0cmluZykgaW50ZXJsZWF2ZWQiCisKKy8qIFN3aXRjaCBmcm9tIHRpbWUtZG9tYWluIHRvIEZGVCBjb252b2x1dGlvbiBmb3Iga2VybmVscyA+PSB0aGlzICovCisjZGVmaW5lIEZGVF9USFJFU0hPTEQgMzIKKworZW51bQoreworICBQUk9QXzAgPSAwLAorICBQUk9QX0xPV19MQVRFTkNZLAorICBQUk9QX0RSQUlOX09OX0NIQU5HRVMKK307CisKKyNkZWZpbmUgREVGQVVMVF9MT1dfTEFURU5DWSBGQUxTRQorI2RlZmluZSBERUZBVUxUX0RSQUlOX09OX0NIQU5HRVMgVFJVRQorCisjZGVmaW5lIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXIsIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXIsCisgICAgR1NUX1RZUEVfQVVESU9fRklMVEVSKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl90cmFuc2Zvcm0gKEdzdEJhc2VUcmFuc2Zvcm0gKgorICAgIGJhc2UsIEdzdEJ1ZmZlciAqIGluYnVmLCBHc3RCdWZmZXIgKiBvdXRidWYpOworc3RhdGljIGdib29sZWFuIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc3RhcnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3N0b3AgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3NpbmtfZXZlbnQgKEdzdEJhc2VUcmFuc2Zvcm0gKgorICAgIGJhc2UsIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfdHJhbnNmb3JtX3NpemUgKEdzdEJhc2VUcmFuc2Zvcm0gKgorICAgIGJhc2UsIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENhcHMgKiBjYXBzLCBnc2l6ZSBzaXplLAorICAgIEdzdENhcHMgKiBvdGhlcmNhcHMsIGdzaXplICogb3RoZXJzaXplKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGJhc2UsCisgICAgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3F1ZXJ5IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwgR3N0UXVlcnkgKiBxdWVyKTsKKworLyoKKyAqIFRoZSBjb2RlIGJlbG93IGNhbGN1bGF0ZXMgdGhlIGxpbmVhciBjb252b2x1dGlvbjoKKyAqCisgKiB5W3RdID0gXHN1bV97dT0wfV57TS0xfSB4W3QgLSB1XSAqIGhbdV0KKyAqCisgKiB3aGVyZSB5IGlzIHRoZSBvdXRwdXQsIHggaXMgdGhlIGlucHV0LCBNIGlzIHRoZSBsZW5ndGgKKyAqIG9mIHRoZSBmaWx0ZXIga2VybmVsIGFuZCBoIGlzIHRoZSBmaWx0ZXIga2VybmVsLiBGb3IgeAorICogaG9sZHM6IHhbdF0gPT0gMCBcZm9yYWxsIHQgPCAwLgorICoKKyAqIFRoZSBydW50aW1lIGNvbXBsZXhpdHkgb2YgdGhpcyBpcyBPIChNKSBwZXIgc2FtcGxlLgorICoKKyAqLworI2RlZmluZSBERUZJTkVfUFJPQ0VTU19GVU5DKHdpZHRoLGN0eXBlKSBcCitzdGF0aWMgZ3VpbnQgXAorcHJvY2Vzc18jI3dpZHRoIChHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlciAqIHNlbGYsIGNvbnN0IGcjI2N0eXBlICogc3JjLCBnIyNjdHlwZSAqIGRzdCwgZ3VpbnQgaW5wdXRfc2FtcGxlcykgXAoreyBcCisgIGdpbnQgY2hhbm5lbHMgPSBHU1RfQVVESU9fRklMVEVSX0NIQU5ORUxTIChzZWxmKTsgXAorICBUSU1FX0RPTUFJTl9DT05WT0xVVElPTl9CT0RZIChjaGFubmVscyk7IFwKK30KKworI2RlZmluZSBERUZJTkVfUFJPQ0VTU19GVU5DX0ZJWEVEX0NIQU5ORUxTKHdpZHRoLGNoYW5uZWxzLGN0eXBlKSBcCitzdGF0aWMgZ3VpbnQgXAorcHJvY2Vzc18jI2NoYW5uZWxzIyNfIyN3aWR0aCAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXIgKiBzZWxmLCBjb25zdCBnIyNjdHlwZSAqIHNyYywgZyMjY3R5cGUgKiBkc3QsIGd1aW50IGlucHV0X3NhbXBsZXMpIFwKK3sgXAorICBUSU1FX0RPTUFJTl9DT05WT0xVVElPTl9CT0RZIChjaGFubmVscyk7IFwKK30KKworI2RlZmluZSBUSU1FX0RPTUFJTl9DT05WT0xVVElPTl9CT0RZKGNoYW5uZWxzKSBHX1NUTVRfU1RBUlQgeyBcCisgIGdpbnQga2VybmVsX2xlbmd0aCA9IHNlbGYtPmtlcm5lbF9sZW5ndGg7IFwKKyAgZ2ludCBpLCBqLCBrLCBsOyBcCisgIGdpbnQgcmVzX3N0YXJ0OyBcCisgIGdpbnQgZnJvbV9pbnB1dDsgXAorICBnaW50IG9mZjsgXAorICBnZG91YmxlICpidWZmZXIgPSBzZWxmLT5idWZmZXI7IFwKKyAgZ2RvdWJsZSAqa2VybmVsID0gc2VsZi0+a2VybmVsOyBcCisgIFwKKyAgaWYgKCFidWZmZXIpIHsgXAorICAgIHNlbGYtPmJ1ZmZlcl9sZW5ndGggPSBrZXJuZWxfbGVuZ3RoICogY2hhbm5lbHM7IFwKKyAgICBzZWxmLT5idWZmZXIgPSBidWZmZXIgPSBnX25ldzAgKGdkb3VibGUsIHNlbGYtPmJ1ZmZlcl9sZW5ndGgpOyBcCisgIH0gXAorICBcCisgIGlucHV0X3NhbXBsZXMgKj0gY2hhbm5lbHM7IFwKKyAgLyogY29udm9sdXRpb24gKi8gXAorICBmb3IgKGkgPSAwOyBpIDwgaW5wdXRfc2FtcGxlczsgaSsrKSB7IFwKKyAgICBkc3RbaV0gPSAwLjA7IFwKKyAgICBrID0gaSAlIGNoYW5uZWxzOyBcCisgICAgbCA9IGkgLyBjaGFubmVsczsgXAorICAgIGZyb21faW5wdXQgPSBNSU4gKGwsIGtlcm5lbF9sZW5ndGgtMSk7IFwKKyAgICBvZmYgPSBsICogY2hhbm5lbHMgKyBrOyBcCisgICAgZm9yIChqID0gMDsgaiA8PSBmcm9tX2lucHV0OyBqKyspIHsgXAorICAgICAgZHN0W2ldICs9IHNyY1tvZmZdICoga2VybmVsW2pdOyBcCisgICAgICBvZmYgLT0gY2hhbm5lbHM7IFwKKyAgICB9IFwKKyAgICAvKiBqID09IGZyb21faW5wdXQgJiYgb2ZmID09IChsIC0gaikgKiBjaGFubmVscyArIGsgKi8gXAorICAgIG9mZiArPSBrZXJuZWxfbGVuZ3RoICogY2hhbm5lbHM7IFwKKyAgICBmb3IgKDsgaiA8IGtlcm5lbF9sZW5ndGg7IGorKykgeyBcCisgICAgICBkc3RbaV0gKz0gYnVmZmVyW29mZl0gKiBrZXJuZWxbal07IFwKKyAgICAgIG9mZiAtPSBjaGFubmVsczsgXAorICAgIH0gXAorICB9IFwKKyAgXAorICAvKiBjb3B5IHRoZSB0YWlsIG9mIHRoZSBjdXJyZW50IGlucHV0IGJ1ZmZlciB0byB0aGUgcmVzaWR1ZSwgd2hpbGUgXAorICAgKiBrZWVwaW5nIHBhcnRzIG9mIHRoZSByZXNpZHVlIGlmIHRoZSBpbnB1dCBidWZmZXIgaXMgc21hbGxlciB0aGFuIFwKKyAgICogdGhlIGtlcm5lbCBsZW5ndGggKi8gXAorICAvKiBmcm9tIG5vdyBvbiB0YWtlIGtlcm5lbCBsZW5ndGggYXMgbGVuZ3RoIG92ZXIgYWxsIGNoYW5uZWxzICovIFwKKyAga2VybmVsX2xlbmd0aCAqPSBjaGFubmVsczsgXAorICBpZiAoaW5wdXRfc2FtcGxlcyA8IGtlcm5lbF9sZW5ndGgpIFwKKyAgICByZXNfc3RhcnQgPSBrZXJuZWxfbGVuZ3RoIC0gaW5wdXRfc2FtcGxlczsgXAorICBlbHNlIFwKKyAgICByZXNfc3RhcnQgPSAwOyBcCisgIFwKKyAgZm9yIChpID0gMDsgaSA8IHJlc19zdGFydDsgaSsrKSBcCisgICAgYnVmZmVyW2ldID0gYnVmZmVyW2kgKyBpbnB1dF9zYW1wbGVzXTsgXAorICAvKiBpID09IHJlc19zdGFydCAqLyBcCisgIGZvciAoOyBpIDwga2VybmVsX2xlbmd0aDsgaSsrKSBcCisgICAgYnVmZmVyW2ldID0gc3JjW2lucHV0X3NhbXBsZXMgLSBrZXJuZWxfbGVuZ3RoICsgaV07IFwKKyAgXAorICBzZWxmLT5idWZmZXJfZmlsbCArPSBrZXJuZWxfbGVuZ3RoIC0gcmVzX3N0YXJ0OyBcCisgIGlmIChzZWxmLT5idWZmZXJfZmlsbCA+IGtlcm5lbF9sZW5ndGgpIFwKKyAgICBzZWxmLT5idWZmZXJfZmlsbCA9IGtlcm5lbF9sZW5ndGg7IFwKKyAgXAorICByZXR1cm4gaW5wdXRfc2FtcGxlcyAvIGNoYW5uZWxzOyBcCit9IEdfU1RNVF9FTkQKKworREVGSU5FX1BST0NFU1NfRlVOQyAoMzIsIGZsb2F0KTsKK0RFRklORV9QUk9DRVNTX0ZVTkMgKDY0LCBkb3VibGUpOworCitERUZJTkVfUFJPQ0VTU19GVU5DX0ZJWEVEX0NIQU5ORUxTICgzMiwgMSwgZmxvYXQpOworREVGSU5FX1BST0NFU1NfRlVOQ19GSVhFRF9DSEFOTkVMUyAoNjQsIDEsIGRvdWJsZSk7CisKK0RFRklORV9QUk9DRVNTX0ZVTkNfRklYRURfQ0hBTk5FTFMgKDMyLCAyLCBmbG9hdCk7CitERUZJTkVfUFJPQ0VTU19GVU5DX0ZJWEVEX0NIQU5ORUxTICg2NCwgMiwgZG91YmxlKTsKKworI3VuZGVmIFRJTUVfRE9NQUlOX0NPTlZPTFVUSU9OX0JPRFkKKyN1bmRlZiBERUZJTkVfUFJPQ0VTU19GVU5DCisjdW5kZWYgREVGSU5FX1BST0NFU1NfRlVOQ19GSVhFRF9DSEFOTkVMUworCisvKiBUaGlzIGltcGxlbWVudHMgRkZUIGNvbnZvbHV0aW9uIGFuZCB1c2VzIHRoZSBvdmVybGFwLXNhdmUgYWxnb3JpdGhtLgorICogU2VlIGh0dHA6Ly9jbngub3JnL2NvbnRlbnQvbTEyMDIyL2xhdGVzdC8gb3IgeW91ciBmYXZvcml0ZQorICogZGlnaXRhbCBzaWduYWwgcHJvY2Vzc2luZyBib29rIGZvciBkZXRhaWxzLgorICoKKyAqIEluIGV2ZXJ5IHBhc3MgdGhlIGZvbGxvd2luZyBpcyBjYWxjdWxhdGVkOgorICoKKyAqIHkgPSBJRkZUIChGRlQoeCkgKiBGRlQoaCkpCisgKgorICogd2hlcmUgeSBpcyB0aGUgb3V0cHV0IGluIHRoZSB0aW1lIGRvbWFpbiwgeCB0aGUKKyAqIGlucHV0IGFuZCBoIHRoZSBmaWx0ZXIga2VybmVsLiAqIGlzIHRoZSBtdWx0aXBsaWNhdGlvbgorICogb2YgY29tcGxleCBudW1iZXJzLgorICoKKyAqIER1ZSB0byB0aGUgY2lyY3VsYXIgY29udm9sdXRpb24gdGhlb3JlbSB0aGlzCisgKiBnaXZlcyBpbiB0aGUgdGltZSBkb21haW46CisgKgorICogeVt0XSA9IFxzdW1fe3U9MH1ee00tMX0geFt0IC0gdV0gKiBoW3VdCisgKgorICogd2hlcmUgeSBpcyB0aGUgb3V0cHV0LCBNIGlzIHRoZSBrZXJuZWwgbGVuZ3RoLAorICogeCB0aGUgcGVyaW9kaWNhbGx5IGV4dGVuZGVkWzBdIGlucHV0IGFuZCBoIHRoZQorICogZmlsdGVyIGtlcm5lbC4KKyAqCisgKiAoWzBdIFBlcmlvZGljYWxseSBleHRlbmRlZCBtZWFuczogICAgKQorICogKCAgICB4W3RdID0geFt0K2tOXSBcZm9yYWxsIGsgXGluIFogICkKKyAqICggICAgd2hlcmUgTiBpcyB0aGUgbGVuZ3RoIG9mIHggICAgICApCisgKgorICogVGhpcyBtZWFuczoKKyAqIC0gT2J2aW91c2x5IHggYW5kIGggbmVlZCB0byBiZSBvZiB0aGUgc2FtZSBzaXplIGZvciB0aGUgRkZUCisgKiAtIFRoZSBmaXJzdCBNLTEgb3V0cHV0IHZhbHVlcyBhcmUgdXNlbGVzcyBiZWNhdXNlIHRoZXkncmUKKyAqICAgYnVpbHQgZnJvbSAxIHVwIHRvIE0tMSB2YWx1ZXMgZnJvbSB0aGUgZW5kIG9mIHRoZSBpbnB1dAorICogICAoY2lyY3VsYXIgY29udm9sdXNpb24hKS4KKyAqIC0gVGhlIGxhc3QgTS0xIGlucHV0IHZhbHVlcyBhcmUgb25seSB1c2VkIGZvciAxIHVwIHRvIE0tMQorICogICBvdXRwdXQgdmFsdWVzLCBpLmUuIHRoZXkgbmVlZCB0byBiZSB1c2VkIGFnYWluIGluIHRoZQorICogICBuZXh0IHBhc3MgZm9yIHRoZSBmaXJzdCBNLTEgaW5wdXQgdmFsdWVzLgorICoKKyAqID0+IFRoZSBmaXJzdCBwYXNzIG5lZWRzIE0tMSB6ZXJvZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAqIGlucHV0IGFuZCB0aGUgbGFzdCBNLTEgaW5wdXQgdmFsdWVzIG9mIGV2ZXJ5IHBhc3MgbmVlZCB0bworICogYmUgdXNlZCBhcyB0aGUgZmlyc3QgTS0xIGlucHV0IHZhbHVlcyBvZiB0aGUgbmV4dCBwYXNzLgorICoKKyAqID0+IHggbXVzdCBiZSBsYXJnZXIgdGhhbiBoIHRvIGdpdmUgYSB1c2VmdWwgbnVtYmVyIG9mIG91dHB1dAorICogc2FtcGxlcyBhbmQgaCBuZWVkcyB0byBiZSBwYWRkZWQgYnkgemVyb2VzIGF0IHRoZSBlbmQgdG8gZ2l2ZQorICogaXQgdmlydHVhbGx5IHRoZSBzYW1lIHNpemUgYXMgeCAoYnkgTSB3ZSBkZW5vdGUgdGhlIG51bWJlciBvZgorICogbm9uLXBhZGRpbmcgc2FtcGxlcyBvZiBoKS4gSWYgbGVuKHgpPT1sZW4oaCk9PU0gb25seSAxIG91dHB1dAorICogc2FtcGxlIHdvdWxkIGJlIGNhbGN1bGF0ZWQgcGVyIHBhc3MsIGxlbih4KT09MipsZW4oaCkgd291bGQKKyAqIGdpdmUgTSsxIG91dHB1dCBzYW1wbGVzLCBldGMuIFVzdWFsbHkgYSBmYWN0b3IgYmV0d2VlbiA0IGFuZCA4CisgKiBnaXZlcyBhIGxvdyBudW1iZXIgb2Ygb3BlcmF0aW9ucyBwZXIgb3V0cHV0IHNhbXBsZXMgKHNlZSB3ZWJzaXRlCisgKiBnaXZlbiBhYm92ZSkuCisgKgorICogT3ZlcmFsbCB0aGlzIGdpdmVzIGEgcnVudGltZSBjb21wbGV4aXR5IHBlciBzYW1wbGUgb2YKKyAqCisgKiAgICggIE4gbG9nIE4gICkKKyAqIE8gKCAtLS0tLS0tLS0gKSBjb21wYXJlZCB0byBPIChNKSBmb3IgdGhlIGRpcmVjdCBjYWxjdWxhdGlvbi4KKyAqICAgKCBOIC0gTSArIDEgKQorICovCisjZGVmaW5lIERFRklORV9GRlRfUFJPQ0VTU19GVU5DKHdpZHRoLGN0eXBlKSBcCitzdGF0aWMgZ3VpbnQgXAorcHJvY2Vzc19mZnRfIyN3aWR0aCAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXIgKiBzZWxmLCBjb25zdCBnIyNjdHlwZSAqIHNyYywgXAorICAgIGcjI2N0eXBlICogZHN0LCBndWludCBpbnB1dF9zYW1wbGVzKSBcCit7IFwKKyAgZ2ludCBjaGFubmVscyA9IEdTVF9BVURJT19GSUxURVJfQ0hBTk5FTFMgKHNlbGYpOyBcCisgIEZGVF9DT05WT0xVVElPTl9CT0RZIChjaGFubmVscyk7IFwKK30KKworI2RlZmluZSBERUZJTkVfRkZUX1BST0NFU1NfRlVOQ19GSVhFRF9DSEFOTkVMUyh3aWR0aCxjaGFubmVscyxjdHlwZSkgXAorc3RhdGljIGd1aW50IFwKK3Byb2Nlc3NfZmZ0XyMjY2hhbm5lbHMjI18jI3dpZHRoIChHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlciAqIHNlbGYsIGNvbnN0IGcjI2N0eXBlICogc3JjLCBcCisgICAgZyMjY3R5cGUgKiBkc3QsIGd1aW50IGlucHV0X3NhbXBsZXMpIFwKK3sgXAorICBGRlRfQ09OVk9MVVRJT05fQk9EWSAoY2hhbm5lbHMpOyBcCit9CisKKyNkZWZpbmUgRkZUX0NPTlZPTFVUSU9OX0JPRFkoY2hhbm5lbHMpIEdfU1RNVF9TVEFSVCB7IFwKKyAgZ2ludCBpLCBqOyBcCisgIGd1aW50IHBhc3M7IFwKKyAgZ3VpbnQga2VybmVsX2xlbmd0aCA9IHNlbGYtPmtlcm5lbF9sZW5ndGg7IFwKKyAgZ3VpbnQgYmxvY2tfbGVuZ3RoID0gc2VsZi0+YmxvY2tfbGVuZ3RoOyBcCisgIGd1aW50IGJ1ZmZlcl9sZW5ndGggPSBzZWxmLT5idWZmZXJfbGVuZ3RoOyBcCisgIGd1aW50IHJlYWxfYnVmZmVyX2xlbmd0aCA9IGJ1ZmZlcl9sZW5ndGggKyBrZXJuZWxfbGVuZ3RoIC0gMTsgXAorICBndWludCBidWZmZXJfZmlsbCA9IHNlbGYtPmJ1ZmZlcl9maWxsOyBcCisgIEdzdEZGVEY2NCAqZmZ0ID0gc2VsZi0+ZmZ0OyBcCisgIEdzdEZGVEY2NCAqaWZmdCA9IHNlbGYtPmlmZnQ7IFwKKyAgR3N0RkZURjY0Q29tcGxleCAqZnJlcXVlbmN5X3Jlc3BvbnNlID0gc2VsZi0+ZnJlcXVlbmN5X3Jlc3BvbnNlOyBcCisgIEdzdEZGVEY2NENvbXBsZXggKmZmdF9idWZmZXIgPSBzZWxmLT5mZnRfYnVmZmVyOyBcCisgIGd1aW50IGZyZXF1ZW5jeV9yZXNwb25zZV9sZW5ndGggPSBzZWxmLT5mcmVxdWVuY3lfcmVzcG9uc2VfbGVuZ3RoOyBcCisgIGdkb3VibGUgKmJ1ZmZlciA9IHNlbGYtPmJ1ZmZlcjsgXAorICBndWludCBnZW5lcmF0ZWQgPSAwOyBcCisgIGdkb3VibGUgcmUsIGltOyBcCisgIFwKKyAgaWYgKCFmZnRfYnVmZmVyKSBcCisgICAgc2VsZi0+ZmZ0X2J1ZmZlciA9IGZmdF9idWZmZXIgPSBcCisgICAgICAgIGdfbmV3IChHc3RGRlRGNjRDb21wbGV4LCBmcmVxdWVuY3lfcmVzcG9uc2VfbGVuZ3RoKTsgXAorICBcCisgIC8qIEJ1ZmZlciBjb250YWlucyB0aGUgdGltZSBkb21haW4gc2FtcGxlcyBvZiBpbnB1dCBkYXRhIGZvciBvbmUgY2h1bmsgXAorICAgKiBwbHVzIHNvbWUgbW9yZSBzcGFjZSBmb3IgdGhlIGludmVyc2UgRkZUIGJlbG93LiBcCisgICAqIFwKKyAgICogVGhlIHNhbXBsZXMgYXJlIHB1dCBhdCBvZmZzZXQga2VybmVsX2xlbmd0aCwgdGhlIGludmVyc2UgRkZUIFwKKyAgICogb3ZlcndyaXRlcyBldmVydGhpbmcgZnJvbSBvZmZzZXQgMCB0byBsZW5ndGgta2VybmVsX2xlbmd0aCsxLCBrZWVwaW5nIFwKKyAgICogdGhlIGxhc3Qga2VybmVsX2xlbmd0aC0xIHNhbXBsZXMgZm9yIGNvcHlpbmcgdG8gdGhlIG5leHQgcHJvY2Vzc2luZyBcCisgICAqIHN0ZXAuIFwKKyAgICovIFwKKyAgaWYgKCFidWZmZXIpIHsgXAorICAgIHNlbGYtPmJ1ZmZlcl9sZW5ndGggPSBidWZmZXJfbGVuZ3RoID0gYmxvY2tfbGVuZ3RoOyBcCisgICAgcmVhbF9idWZmZXJfbGVuZ3RoID0gYnVmZmVyX2xlbmd0aCArIGtlcm5lbF9sZW5ndGggLSAxOyBcCisgICAgXAorICAgIHNlbGYtPmJ1ZmZlciA9IGJ1ZmZlciA9IGdfbmV3MCAoZ2RvdWJsZSwgcmVhbF9idWZmZXJfbGVuZ3RoICogY2hhbm5lbHMpOyBcCisgICAgXAorICAgIC8qIEJlZ2lubmluZyBoYXMga2VybmVsX2xlbmd0aC0xIHplcm9lcyBhdCB0aGUgYmVnaW5uaW5nICovIFwKKyAgICBzZWxmLT5idWZmZXJfZmlsbCA9IGJ1ZmZlcl9maWxsID0ga2VybmVsX2xlbmd0aCAtIDE7IFwKKyAgfSBcCisgIFwKKyAgZ19hc3NlcnQgKHNlbGYtPmJ1ZmZlcl9sZW5ndGggPT0gYmxvY2tfbGVuZ3RoKTsgXAorICBcCisgIHdoaWxlIChpbnB1dF9zYW1wbGVzKSB7IFwKKyAgICBwYXNzID0gTUlOIChidWZmZXJfbGVuZ3RoIC0gYnVmZmVyX2ZpbGwsIGlucHV0X3NhbXBsZXMpOyBcCisgICAgXAorICAgIC8qIERlaW50ZXJsZWF2ZSBjaGFubmVscyAqLyBcCisgICAgZm9yIChpID0gMDsgaSA8IHBhc3M7IGkrKykgeyBcCisgICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeyBcCisgICAgICAgIGJ1ZmZlcltyZWFsX2J1ZmZlcl9sZW5ndGggKiBqICsgYnVmZmVyX2ZpbGwgKyBrZXJuZWxfbGVuZ3RoIC0gMSArIGldID0gXAorICAgICAgICAgICAgc3JjW2kgKiBjaGFubmVscyArIGpdOyBcCisgICAgICB9IFwKKyAgICB9IFwKKyAgICBidWZmZXJfZmlsbCArPSBwYXNzOyBcCisgICAgc3JjICs9IGNoYW5uZWxzICogcGFzczsgXAorICAgIGlucHV0X3NhbXBsZXMgLT0gcGFzczsgXAorICAgIFwKKyAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGEgY29tcGxldGUgYnVmZmVyIGdvIG91dCAqLyBcCisgICAgaWYgKGJ1ZmZlcl9maWxsIDwgYnVmZmVyX2xlbmd0aCkgXAorICAgICAgYnJlYWs7IFwKKyAgICBcCisgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsgXAorICAgICAgLyogQ2FsY3VsYXRlIEZGVCBvZiBpbnB1dCBibG9jayAqLyBcCisgICAgICBnc3RfZmZ0X2Y2NF9mZnQgKGZmdCwgXAorICAgICAgICAgIGJ1ZmZlciArIHJlYWxfYnVmZmVyX2xlbmd0aCAqIGogKyBrZXJuZWxfbGVuZ3RoIC0gMSwgZmZ0X2J1ZmZlcik7IFwKKyAgICAgIFwKKyAgICAgIC8qIENvbXBsZXggbXVsdGlwbGljYXRpb24gb2YgaW5wdXQgYW5kIGZpbHRlciBzcGVjdHJ1bSAqLyBcCisgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJlcXVlbmN5X3Jlc3BvbnNlX2xlbmd0aDsgaSsrKSB7IFwKKwlyZSA9IGZmdF9idWZmZXJbaV0ucjsgXAorCWltID0gZmZ0X2J1ZmZlcltpXS5pOyBcCisgICAgICAgIFwKKyAgICAgICAgZmZ0X2J1ZmZlcltpXS5yID0gXAorICAgICAgICAgICAgcmUgKiBmcmVxdWVuY3lfcmVzcG9uc2VbaV0uciAtIFwKKyAgICAgICAgICAgIGltICogZnJlcXVlbmN5X3Jlc3BvbnNlW2ldLmk7IFwKKyAgICAgICAgZmZ0X2J1ZmZlcltpXS5pID0gXAorICAgICAgICAgICAgcmUgKiBmcmVxdWVuY3lfcmVzcG9uc2VbaV0uaSArIFwKKyAgICAgICAgICAgIGltICogZnJlcXVlbmN5X3Jlc3BvbnNlW2ldLnI7IFwKKyAgICAgIH0gXAorICAgICAgXAorICAgICAgLyogQ2FsY3VsYXRlIGludmVyc2UgRkZUIG9mIHRoZSByZXN1bHQgKi8gXAorICAgICAgZ3N0X2ZmdF9mNjRfaW52ZXJzZV9mZnQgKGlmZnQsIGZmdF9idWZmZXIsIFwKKyAgICAgICAgICBidWZmZXIgKyByZWFsX2J1ZmZlcl9sZW5ndGggKiBqKTsgXAorICAgICAgXAorICAgICAgLyogQ29weSBhbGwgZXhjZXB0IHRoZSBmaXJzdCBrZXJuZWxfbGVuZ3RoLTEgc2FtcGxlcyB0byB0aGUgb3V0cHV0ICovIFwKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJfbGVuZ3RoIC0ga2VybmVsX2xlbmd0aCArIDE7IGkrKykgeyBcCisgICAgICAgIGRzdFtpICogY2hhbm5lbHMgKyBqXSA9IFwKKyAgICAgICAgICAgIGJ1ZmZlcltyZWFsX2J1ZmZlcl9sZW5ndGggKiBqICsga2VybmVsX2xlbmd0aCAtIDEgKyBpXTsgXAorICAgICAgfSBcCisgICAgICBcCisgICAgICAvKiBDb3B5IHRoZSBsYXN0IGtlcm5lbF9sZW5ndGgtMSBzYW1wbGVzIHRvIHRoZSBiZWdpbm5pbmcgZm9yIHRoZSBuZXh0IGJsb2NrICovIFwKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXJuZWxfbGVuZ3RoIC0gMTsgaSsrKSB7IFwKKyAgICAgICAgYnVmZmVyW3JlYWxfYnVmZmVyX2xlbmd0aCAqIGogKyBrZXJuZWxfbGVuZ3RoIC0gMSArIGldID0gXAorICAgICAgICAgICAgYnVmZmVyW3JlYWxfYnVmZmVyX2xlbmd0aCAqIGogKyBidWZmZXJfbGVuZ3RoICsgaV07IFwKKyAgICAgIH0gXAorICAgIH0gXAorICAgIFwKKyAgICBnZW5lcmF0ZWQgKz0gYnVmZmVyX2xlbmd0aCAtIGtlcm5lbF9sZW5ndGggKyAxOyBcCisgICAgZHN0ICs9IGNoYW5uZWxzICogKGJ1ZmZlcl9sZW5ndGggLSBrZXJuZWxfbGVuZ3RoICsgMSk7IFwKKyAgICBcCisgICAgLyogVGhlIHRoZSBmaXJzdCBrZXJuZWxfbGVuZ3RoLTEgc2FtcGxlcyBhcmUgdGhlcmUgYWxyZWFkeSAqLyBcCisgICAgYnVmZmVyX2ZpbGwgPSBrZXJuZWxfbGVuZ3RoIC0gMTsgXAorICB9IFwKKyAgXAorICAvKiBXcml0ZSBiYWNrIGNhY2hlZCBidWZmZXJfZmlsbCB2YWx1ZSAqLyBcCisgIHNlbGYtPmJ1ZmZlcl9maWxsID0gYnVmZmVyX2ZpbGw7IFwKKyAgXAorICByZXR1cm4gZ2VuZXJhdGVkOyBcCit9IEdfU1RNVF9FTkQKKworREVGSU5FX0ZGVF9QUk9DRVNTX0ZVTkMgKDMyLCBmbG9hdCk7CitERUZJTkVfRkZUX1BST0NFU1NfRlVOQyAoNjQsIGRvdWJsZSk7CisKK0RFRklORV9GRlRfUFJPQ0VTU19GVU5DX0ZJWEVEX0NIQU5ORUxTICgzMiwgMSwgZmxvYXQpOworREVGSU5FX0ZGVF9QUk9DRVNTX0ZVTkNfRklYRURfQ0hBTk5FTFMgKDY0LCAxLCBkb3VibGUpOworCitERUZJTkVfRkZUX1BST0NFU1NfRlVOQ19GSVhFRF9DSEFOTkVMUyAoMzIsIDIsIGZsb2F0KTsKK0RFRklORV9GRlRfUFJPQ0VTU19GVU5DX0ZJWEVEX0NIQU5ORUxTICg2NCwgMiwgZG91YmxlKTsKKworI3VuZGVmIEZGVF9DT05WT0xVVElPTl9CT0RZCisjdW5kZWYgREVGSU5FX0ZGVF9QUk9DRVNTX0ZVTkMKKyN1bmRlZiBERUZJTkVfRkZUX1BST0NFU1NfRlVOQ19GSVhFRF9DSEFOTkVMUworCisvKiBFbGVtZW50IGNsYXNzICovCitzdGF0aWMgdm9pZAorICAgIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfY2FsY3VsYXRlX2ZyZXF1ZW5jeV9yZXNwb25zZQorICAgIChHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlciAqIHNlbGYpCit7CisgIGdzdF9mZnRfZjY0X2ZyZWUgKHNlbGYtPmZmdCk7CisgIHNlbGYtPmZmdCA9IE5VTEw7CisgIGdzdF9mZnRfZjY0X2ZyZWUgKHNlbGYtPmlmZnQpOworICBzZWxmLT5pZmZ0ID0gTlVMTDsKKyAgZ19mcmVlIChzZWxmLT5mcmVxdWVuY3lfcmVzcG9uc2UpOworICBzZWxmLT5mcmVxdWVuY3lfcmVzcG9uc2VfbGVuZ3RoID0gMDsKKyAgZ19mcmVlIChzZWxmLT5mZnRfYnVmZmVyKTsKKyAgc2VsZi0+ZmZ0X2J1ZmZlciA9IE5VTEw7CisKKyAgaWYgKHNlbGYtPmtlcm5lbCAmJiBzZWxmLT5rZXJuZWxfbGVuZ3RoID49IEZGVF9USFJFU0hPTEQKKyAgICAgICYmICFzZWxmLT5sb3dfbGF0ZW5jeSkgeworICAgIGd1aW50IGJsb2NrX2xlbmd0aCwgaTsKKyAgICBnZG91YmxlICprZXJuZWxfdG1wLCAqa2VybmVsID0gc2VsZi0+a2VybmVsOworCisgICAgLyogV2UgcHJvY2VzcyA0ICoga2VybmVsX2xlbmd0aCBzYW1wbGVzIHBlciBwYXNzIGluIEZGVCBtb2RlICovCisgICAgYmxvY2tfbGVuZ3RoID0gNCAqIHNlbGYtPmtlcm5lbF9sZW5ndGg7CisgICAgYmxvY2tfbGVuZ3RoID0gZ3N0X2ZmdF9uZXh0X2Zhc3RfbGVuZ3RoIChibG9ja19sZW5ndGgpOworICAgIHNlbGYtPmJsb2NrX2xlbmd0aCA9IGJsb2NrX2xlbmd0aDsKKworICAgIGtlcm5lbF90bXAgPSBnX25ldzAgKGdkb3VibGUsIGJsb2NrX2xlbmd0aCk7CisgICAgbWVtY3B5IChrZXJuZWxfdG1wLCBrZXJuZWwsIHNlbGYtPmtlcm5lbF9sZW5ndGggKiBzaXplb2YgKGdkb3VibGUpKTsKKworICAgIHNlbGYtPmZmdCA9IGdzdF9mZnRfZjY0X25ldyAoYmxvY2tfbGVuZ3RoLCBGQUxTRSk7CisgICAgc2VsZi0+aWZmdCA9IGdzdF9mZnRfZjY0X25ldyAoYmxvY2tfbGVuZ3RoLCBUUlVFKTsKKyAgICBzZWxmLT5mcmVxdWVuY3lfcmVzcG9uc2VfbGVuZ3RoID0gYmxvY2tfbGVuZ3RoIC8gMiArIDE7CisgICAgc2VsZi0+ZnJlcXVlbmN5X3Jlc3BvbnNlID0KKyAgICAgICAgZ19uZXcgKEdzdEZGVEY2NENvbXBsZXgsIHNlbGYtPmZyZXF1ZW5jeV9yZXNwb25zZV9sZW5ndGgpOworICAgIGdzdF9mZnRfZjY0X2ZmdCAoc2VsZi0+ZmZ0LCBrZXJuZWxfdG1wLCBzZWxmLT5mcmVxdWVuY3lfcmVzcG9uc2UpOworICAgIGdfZnJlZSAoa2VybmVsX3RtcCk7CisKKyAgICAvKiBOb3JtYWxpemUgdG8gbWFrZSBzdXJlIElGRlQoRkZUKHgpKSA9PSB4ICovCisgICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPmZyZXF1ZW5jeV9yZXNwb25zZV9sZW5ndGg7IGkrKykgeworICAgICAgc2VsZi0+ZnJlcXVlbmN5X3Jlc3BvbnNlW2ldLnIgLz0gYmxvY2tfbGVuZ3RoOworICAgICAgc2VsZi0+ZnJlcXVlbmN5X3Jlc3BvbnNlW2ldLmkgLz0gYmxvY2tfbGVuZ3RoOworICAgIH0KKyAgfQorfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGJhc2UgdHJhbnNmb3JtIGxvY2shICovCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9zZWxlY3RfcHJvY2Vzc19mdW5jdGlvbiAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXIgKgorICAgIHNlbGYsIEdzdEF1ZGlvRm9ybWF0IGZvcm1hdCwgZ2ludCBjaGFubmVscykKK3sKKyAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfRjMyOgorICAgICAgaWYgKHNlbGYtPmZmdCAmJiAhc2VsZi0+bG93X2xhdGVuY3kpIHsKKyAgICAgICAgaWYgKGNoYW5uZWxzID09IDEpCisgICAgICAgICAgc2VsZi0+cHJvY2VzcyA9IChHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlclByb2Nlc3NGdW5jKSBwcm9jZXNzX2ZmdF8xXzMyOworICAgICAgICBlbHNlIGlmIChjaGFubmVscyA9PSAyKQorICAgICAgICAgIHNlbGYtPnByb2Nlc3MgPSAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXJQcm9jZXNzRnVuYykgcHJvY2Vzc19mZnRfMl8zMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNlbGYtPnByb2Nlc3MgPSAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXJQcm9jZXNzRnVuYykgcHJvY2Vzc19mZnRfMzI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoY2hhbm5lbHMgPT0gMSkKKyAgICAgICAgICBzZWxmLT5wcm9jZXNzID0gKEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyUHJvY2Vzc0Z1bmMpIHByb2Nlc3NfMV8zMjsKKyAgICAgICAgZWxzZSBpZiAoY2hhbm5lbHMgPT0gMikKKyAgICAgICAgICBzZWxmLT5wcm9jZXNzID0gKEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyUHJvY2Vzc0Z1bmMpIHByb2Nlc3NfMl8zMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNlbGYtPnByb2Nlc3MgPSAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXJQcm9jZXNzRnVuYykgcHJvY2Vzc18zMjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GNjQ6CisgICAgICBpZiAoc2VsZi0+ZmZ0ICYmICFzZWxmLT5sb3dfbGF0ZW5jeSkgeworICAgICAgICBpZiAoY2hhbm5lbHMgPT0gMSkKKyAgICAgICAgICBzZWxmLT5wcm9jZXNzID0gKEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyUHJvY2Vzc0Z1bmMpIHByb2Nlc3NfZmZ0XzFfNjQ7CisgICAgICAgIGVsc2UgaWYgKGNoYW5uZWxzID09IDIpCisgICAgICAgICAgc2VsZi0+cHJvY2VzcyA9IChHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlclByb2Nlc3NGdW5jKSBwcm9jZXNzX2ZmdF8yXzY0OworICAgICAgICBlbHNlCisgICAgICAgICAgc2VsZi0+cHJvY2VzcyA9IChHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlclByb2Nlc3NGdW5jKSBwcm9jZXNzX2ZmdF82NDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjaGFubmVscyA9PSAxKQorICAgICAgICAgIHNlbGYtPnByb2Nlc3MgPSAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXJQcm9jZXNzRnVuYykgcHJvY2Vzc18xXzY0OworICAgICAgICBlbHNlIGlmIChjaGFubmVscyA9PSAyKQorICAgICAgICAgIHNlbGYtPnByb2Nlc3MgPSAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXJQcm9jZXNzRnVuYykgcHJvY2Vzc18yXzY0OworICAgICAgICBlbHNlCisgICAgICAgICAgc2VsZi0+cHJvY2VzcyA9IChHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlclByb2Nlc3NGdW5jKSBwcm9jZXNzXzY0OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNlbGYtPnByb2Nlc3MgPSBOVUxMOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyICpzZWxmID0gR1NUX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUiAob2JqZWN0KTsKKworICBnX2ZyZWUgKHNlbGYtPmJ1ZmZlcik7CisgIGdfZnJlZSAoc2VsZi0+a2VybmVsKTsKKyAgZ3N0X2ZmdF9mNjRfZnJlZSAoc2VsZi0+ZmZ0KTsKKyAgZ3N0X2ZmdF9mNjRfZnJlZSAoc2VsZi0+aWZmdCk7CisgIGdfZnJlZSAoc2VsZi0+ZnJlcXVlbmN5X3Jlc3BvbnNlKTsKKyAgZ19mcmVlIChzZWxmLT5mZnRfYnVmZmVyKTsKKyAgZ19tdXRleF9jbGVhciAoJnNlbGYtPmxvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyICpzZWxmID0gR1NUX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTE9XX0xBVEVOQ1k6eworICAgICAgZ2Jvb2xlYW4gbG93X2xhdGVuY3k7CisKKyAgICAgIGlmIChHU1RfU1RBVEUgKHNlbGYpID49IEdTVF9TVEFURV9QQVVTRUQpIHsKKyAgICAgICAgZ193YXJuaW5nICgiQ2hhbmdpbmcgdGhlIFwibG93LWxhdGVuY3lcIiBwcm9wZXJ0eSAiCisgICAgICAgICAgICAiaXMgb25seSBhbGxvd2VkIGluIHN0YXRlcyA8IFBBVVNFRCIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKworICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBsb3dfbGF0ZW5jeSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKworICAgICAgaWYgKHNlbGYtPmxvd19sYXRlbmN5ICE9IGxvd19sYXRlbmN5KSB7CisgICAgICAgIHNlbGYtPmxvd19sYXRlbmN5ID0gbG93X2xhdGVuY3k7CisgICAgICAgIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfY2FsY3VsYXRlX2ZyZXF1ZW5jeV9yZXNwb25zZSAoc2VsZik7CisgICAgICAgIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc2VsZWN0X3Byb2Nlc3NfZnVuY3Rpb24gKHNlbGYsCisgICAgICAgICAgICBHU1RfQVVESU9fRklMVEVSX0ZPUk1BVCAoc2VsZiksIEdTVF9BVURJT19GSUxURVJfQ0hBTk5FTFMgKHNlbGYpKTsKKyAgICAgIH0KKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0RSQUlOX09OX0NIQU5HRVM6eworICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBzZWxmLT5kcmFpbl9vbl9jaGFuZ2VzID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlciAqc2VsZiA9IEdTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xPV19MQVRFTkNZOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNlbGYtPmxvd19sYXRlbmN5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9EUkFJTl9PTl9DSEFOR0VTOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNlbGYtPmRyYWluX29uX2NoYW5nZXMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9jbGFzc19pbml0IChHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlckNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqdHJhbnNfY2xhc3MgPSAoR3N0QmFzZVRyYW5zZm9ybUNsYXNzICopIGtsYXNzOworICBHc3RBdWRpb0ZpbHRlckNsYXNzICpmaWx0ZXJfY2xhc3MgPSAoR3N0QXVkaW9GaWx0ZXJDbGFzcyAqKSBrbGFzczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9kZWJ1ZywKKyAgICAgICJhdWRpb2Z4YmFzZWZpcmZpbHRlciIsIDAsICJGSVIgZmlsdGVyIGJhc2UgY2xhc3MiKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX2dldF9wcm9wZXJ0eTsKKworICAvKioKKyAgICogR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXI6bG93LWxhdGVuY3k6CisgICAqCisgICAqIFdvcmsgaW4gbG93LWxhdGVuY3kgbW9kZS4gVGhpcyBtb2RlIGlzIG11Y2ggc2xvd2VyIGZvciBsYXJnZSBmaWx0ZXIgc2l6ZXMKKyAgICogYnV0IHRoZSBsYXRlbmN5IGlzIGFsd2F5cyBvbmx5IHRoZSBwcmUtbGF0ZW5jeSBvZiB0aGUgZmlsdGVyLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MT1dfTEFURU5DWSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgibG93LWxhdGVuY3kiLCAiTG93IGxhdGVuY3kiLAorICAgICAgICAgICJPcGVyYXRlIGluIGxvdyBsYXRlbmN5IG1vZGUuIFRoaXMgbW9kZSBpcyBzbG93ZXIgYnV0IHRoZSAiCisgICAgICAgICAgImxhdGVuY3kgd2lsbCBvbmx5IGJlIHRoZSBmaWx0ZXIgcHJlLWxhdGVuY3kuICIKKyAgICAgICAgICAiQ2FuIG9ubHkgYmUgY2hhbmdlZCBpbiBzdGF0ZXMgPCBQQVVTRUQhIiwgREVGQVVMVF9MT1dfTEFURU5DWSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXI6ZHJhaW4tb24tY2hhbmdlczoKKyAgICoKKyAgICogV2hldGhlciB0aGUgZmlsdGVyIHNob3VsZCBiZSBkcmFpbmVkIHdoZW4gaXRzIGNvZWZpY2llbnRzIGNoYW5nZQorICAgKgorICAgKiBOb3RlOiBDdXJyZW50bHkgdGhpcyBvbmx5IHdvcmtzIGlmIHRoZSBrZXJuZWwgc2l6ZSBpcyBub3QgY2hhbmdlZCEKKyAgICogU3VwcG9ydCBmb3IgZHJhaW5sZXNzIGtlcm5lbCBzaXplIGNoYW5nZXMgd2lsbCBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9EUkFJTl9PTl9DSEFOR0VTLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJkcmFpbi1vbi1jaGFuZ2VzIiwgIkRyYWluIG9uIGNoYW5nZXMiLAorICAgICAgICAgICJEcmFpbnMgdGhlIGZpbHRlciB3aGVuIGl0cyBjb2VmaWNpZW50cyBjaGFuZ2UiLAorICAgICAgICAgIERFRkFVTFRfRFJBSU5fT05fQ0hBTkdFUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFMTE9XRURfQ0FQUyk7CisgIGdzdF9hdWRpb19maWx0ZXJfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZXMgKEdTVF9BVURJT19GSUxURVJfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgdHJhbnNfY2xhc3MtPnRyYW5zZm9ybSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl90cmFuc2Zvcm0pOworICB0cmFuc19jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9zdGFydCk7CisgIHRyYW5zX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc3RvcCk7CisgIHRyYW5zX2NsYXNzLT5zaW5rX2V2ZW50ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3NpbmtfZXZlbnQpOworICB0cmFuc19jbGFzcy0+cXVlcnkgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9xdWVyeSk7CisgIHRyYW5zX2NsYXNzLT50cmFuc2Zvcm1fc2l6ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl90cmFuc2Zvcm1fc2l6ZSk7CisgIGZpbHRlcl9jbGFzcy0+c2V0dXAgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9zZXR1cCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX2luaXQgKEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyICogc2VsZikKK3sKKyAgc2VsZi0+a2VybmVsID0gTlVMTDsKKyAgc2VsZi0+YnVmZmVyID0gTlVMTDsKKyAgc2VsZi0+YnVmZmVyX2xlbmd0aCA9IDA7CisKKyAgc2VsZi0+c3RhcnRfdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBzZWxmLT5zdGFydF9vZmYgPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FOworICBzZWxmLT5uc2FtcGxlc19vdXQgPSAwOworICBzZWxmLT5uc2FtcGxlc19pbiA9IDA7CisKKyAgc2VsZi0+bG93X2xhdGVuY3kgPSBERUZBVUxUX0xPV19MQVRFTkNZOworICBzZWxmLT5kcmFpbl9vbl9jaGFuZ2VzID0gREVGQVVMVF9EUkFJTl9PTl9DSEFOR0VTOworCisgIGdfbXV0ZXhfaW5pdCAoJnNlbGYtPmxvY2spOworfQorCit2b2lkCitnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3B1c2hfcmVzaWR1ZSAoR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXIgKiBzZWxmKQoreworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIGdpbnQgcmF0ZSA9IEdTVF9BVURJT19GSUxURVJfUkFURSAoc2VsZik7CisgIGdpbnQgY2hhbm5lbHMgPSBHU1RfQVVESU9fRklMVEVSX0NIQU5ORUxTIChzZWxmKTsKKyAgZ2ludCBicHMgPSBHU1RfQVVESU9fRklMVEVSX0JQUyAoc2VsZik7CisgIGdpbnQgb3V0c2l6ZSwgb3V0c2FtcGxlczsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqaW4sICpvdXQ7CisKKyAgaWYgKGNoYW5uZWxzID09IDAgfHwgcmF0ZSA9PSAwIHx8IHNlbGYtPm5zYW1wbGVzX2luID09IDApIHsKKyAgICBzZWxmLT5idWZmZXJfZmlsbCA9IDA7CisgICAgZ19mcmVlIChzZWxmLT5idWZmZXIpOworICAgIHNlbGYtPmJ1ZmZlciA9IE5VTEw7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgdGhlaXIgbWVtb3J5IHNpemUgdGhhdAorICAgKiBzaG91bGQgYmUgcHVzaGVkIGZyb20gdGhlIHJlc2lkdWUgKi8KKyAgb3V0c2FtcGxlcyA9IHNlbGYtPm5zYW1wbGVzX2luIC0gKHNlbGYtPm5zYW1wbGVzX291dCAtIHNlbGYtPmxhdGVuY3kpOworICBpZiAob3V0c2FtcGxlcyA8PSAwKSB7CisgICAgc2VsZi0+YnVmZmVyX2ZpbGwgPSAwOworICAgIGdfZnJlZSAoc2VsZi0+YnVmZmVyKTsKKyAgICBzZWxmLT5idWZmZXIgPSBOVUxMOworICAgIHJldHVybjsKKyAgfQorICBvdXRzaXplID0gb3V0c2FtcGxlcyAqIGNoYW5uZWxzICogYnBzOworCisgIGlmICghc2VsZi0+ZmZ0IHx8IHNlbGYtPmxvd19sYXRlbmN5KSB7CisgICAgZ2ludDY0IGRpZmZzaXplLCBkaWZmc2FtcGxlczsKKworICAgIC8qIFByb2Nlc3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBsYXRlbmN5IGFuZCByZXNpZHVlIGxlbmd0aCBzYW1wbGVzCisgICAgICogdG8gc3RhcnQgYXQgdGhlIGFjdHVhbCBkYXRhIGluc3RlYWQgb2Ygc3RhcnRpbmcgYXQgdGhlIHplcm9zIGJlZm9yZQorICAgICAqIHdoZW4gd2Ugb25seSBnb3Qgb25lIGJ1ZmZlciBzbWFsbGVyIHRoYW4gbGF0ZW5jeSAqLworICAgIGRpZmZzYW1wbGVzID0KKyAgICAgICAgKChnaW50NjQpIHNlbGYtPmxhdGVuY3kpIC0gKChnaW50NjQpIHNlbGYtPmJ1ZmZlcl9maWxsKSAvIGNoYW5uZWxzOworICAgIGlmIChkaWZmc2FtcGxlcyA+IDApIHsKKyAgICAgIGRpZmZzaXplID0gZGlmZnNhbXBsZXMgKiBjaGFubmVscyAqIGJwczsKKyAgICAgIGluID0gZ19uZXcwIChndWludDgsIGRpZmZzaXplKTsKKyAgICAgIG91dCA9IGdfbmV3MCAoZ3VpbnQ4LCBkaWZmc2l6ZSk7CisgICAgICBzZWxmLT5uc2FtcGxlc19vdXQgKz0gc2VsZi0+cHJvY2VzcyAoc2VsZiwgaW4sIG91dCwgZGlmZnNhbXBsZXMpOworICAgICAgZ19mcmVlIChpbik7CisgICAgICBnX2ZyZWUgKG91dCk7CisgICAgfQorCisgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChvdXRzaXplKTsKKworICAgIC8qIENvbnZvbHZlIHRoZSByZXNpZHVlIHdpdGggemVyb3MgdG8gZ2V0IHRoZSBhY3R1YWwgcmVtYWluaW5nIGRhdGEgKi8KKyAgICBpbiA9IGdfbmV3MCAoZ3VpbnQ4LCBvdXRzaXplKTsKKyAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1JFQURXUklURSk7CisgICAgc2VsZi0+bnNhbXBsZXNfb3V0ICs9IHNlbGYtPnByb2Nlc3MgKHNlbGYsIGluLCBtYXAuZGF0YSwgb3V0c2FtcGxlcyk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgIGdfZnJlZSAoaW4pOworICB9IGVsc2UgeworICAgIGd1aW50IGdlbnNhbXBsZXMgPSAwOworCisgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChvdXRzaXplKTsKKyAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1JFQURXUklURSk7CisKKyAgICB3aGlsZSAoZ2Vuc2FtcGxlcyA8IG91dHNhbXBsZXMpIHsKKyAgICAgIGd1aW50IHN0ZXBfaW5zYW1wbGVzID0gc2VsZi0+YmxvY2tfbGVuZ3RoIC0gc2VsZi0+YnVmZmVyX2ZpbGw7CisgICAgICBndWludDggKnplcm9lcyA9IGdfbmV3MCAoZ3VpbnQ4LCBzdGVwX2luc2FtcGxlcyAqIGNoYW5uZWxzICogYnBzKTsKKyAgICAgIGd1aW50OCAqb3V0ID0gZ19uZXcgKGd1aW50OCwgc2VsZi0+YmxvY2tfbGVuZ3RoICogY2hhbm5lbHMgKiBicHMpOworICAgICAgZ3VpbnQgc3RlcF9nZW5zYW1wbGVzOworCisgICAgICBzdGVwX2dlbnNhbXBsZXMgPSBzZWxmLT5wcm9jZXNzIChzZWxmLCB6ZXJvZXMsIG91dCwgc3RlcF9pbnNhbXBsZXMpOworICAgICAgZ19mcmVlICh6ZXJvZXMpOworCisgICAgICBtZW1jcHkgKG1hcC5kYXRhICsgZ2Vuc2FtcGxlcyAqIGJwcywgb3V0LCBNSU4gKHN0ZXBfZ2Vuc2FtcGxlcywKKyAgICAgICAgICAgICAgb3V0c2FtcGxlcyAtIGdlbnNhbXBsZXMpICogYnBzKTsKKyAgICAgIGdlbnNhbXBsZXMgKz0gTUlOIChzdGVwX2dlbnNhbXBsZXMsIG91dHNhbXBsZXMgLSBnZW5zYW1wbGVzKTsKKworICAgICAgZ19mcmVlIChvdXQpOworICAgIH0KKyAgICBzZWxmLT5uc2FtcGxlc19vdXQgKz0gZ2Vuc2FtcGxlczsKKworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm1hcCk7CisgIH0KKworICAvKiBTZXQgdGltZXN0YW1wLCBvZmZzZXQsIGV0YyBmcm9tIHRoZSB2YWx1ZXMgd2UKKyAgICogc2F2ZWQgd2hlbiBwcm9jZXNzaW5nIHRoZSByZWd1bGFyIGJ1ZmZlcnMgKi8KKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzZWxmLT5zdGFydF90cykpCisgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSBzZWxmLT5zdGFydF90czsKKyAgZWxzZQorICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpID0gMDsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgKz0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNlbGYtPm5zYW1wbGVzX291dCAtIG91dHNhbXBsZXMgLQorICAgICAgc2VsZi0+bGF0ZW5jeSwgR1NUX1NFQ09ORCwgcmF0ZSk7CisKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9CisgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChvdXRzYW1wbGVzLCBHU1RfU0VDT05ELCByYXRlKTsKKworICBpZiAoc2VsZi0+c3RhcnRfb2ZmICE9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkUpIHsKKyAgICBHU1RfQlVGRkVSX09GRlNFVCAob3V0YnVmKSA9CisgICAgICAgIHNlbGYtPnN0YXJ0X29mZiArIHNlbGYtPm5zYW1wbGVzX291dCAtIG91dHNhbXBsZXMgLSBzZWxmLT5sYXRlbmN5OworICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAob3V0YnVmKSA9IEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpICsgb3V0c2FtcGxlczsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAiUHVzaGluZyByZXNpZHVlIGJ1ZmZlciBvZiBzaXplICUiIEdfR1NJWkVfRk9STUFUICIgd2l0aCB0aW1lc3RhbXA6ICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQgIiwgZHVyYXRpb246ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBvZmZzZXQ6ICUiCisgICAgICBHX0dVSU5UNjRfRk9STUFUICIsIG9mZnNldF9lbmQ6ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgbnNhbXBsZXNfb3V0OiAlZCIsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWYpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSksIEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpLAorICAgICAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChvdXRidWYpLCBvdXRzYW1wbGVzKTsKKworICByZXMgPSBnc3RfcGFkX3B1c2ggKEdTVF9CQVNFX1RSQU5TRk9STV9DQVNUIChzZWxmKS0+c3JjcGFkLCBvdXRidWYpOworCisgIGlmIChHX1VOTElLRUxZIChyZXMgIT0gR1NUX0ZMT1dfT0spKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiZmFpbGVkIHRvIHB1c2ggcmVzaWR1ZSIpOworICB9CisKKyAgc2VsZi0+YnVmZmVyX2ZpbGwgPSAwOworfQorCisvKiBHc3RBdWRpb0ZpbHRlciB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCisvKiBnZXQgbm90aWZpZWQgb2YgY2FwcyBhbmQgcGx1ZyBpbiB0aGUgY29ycmVjdCBwcm9jZXNzIGZ1bmN0aW9uICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc2V0dXAgKEdzdEF1ZGlvRmlsdGVyICogYmFzZSwKKyAgICBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKQoreworICBHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlciAqc2VsZiA9IEdTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIgKGJhc2UpOworCisgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICBpZiAoc2VsZi0+YnVmZmVyKSB7CisgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9wdXNoX3Jlc2lkdWUgKHNlbGYpOworICAgIGdfZnJlZSAoc2VsZi0+YnVmZmVyKTsKKyAgICBzZWxmLT5idWZmZXIgPSBOVUxMOworICAgIHNlbGYtPmJ1ZmZlcl9maWxsID0gMDsKKyAgICBzZWxmLT5idWZmZXJfbGVuZ3RoID0gMDsKKyAgICBzZWxmLT5zdGFydF90cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgc2VsZi0+c3RhcnRfb2ZmID0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORTsKKyAgICBzZWxmLT5uc2FtcGxlc19vdXQgPSAwOworICAgIHNlbGYtPm5zYW1wbGVzX2luID0gMDsKKyAgfQorCisgIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc2VsZWN0X3Byb2Nlc3NfZnVuY3Rpb24gKHNlbGYsCisgICAgICBHU1RfQVVESU9fSU5GT19GT1JNQVQgKGluZm8pLCBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoaW5mbykpOworICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworCisgIHJldHVybiAoc2VsZi0+cHJvY2VzcyAhPSBOVUxMKTsKK30KKworLyogR3N0QmFzZVRyYW5zZm9ybSB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfdHJhbnNmb3JtX3NpemUgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLAorICAgIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENhcHMgKiBjYXBzLCBnc2l6ZSBzaXplLCBHc3RDYXBzICogb3RoZXJjYXBzLAorICAgIGdzaXplICogb3RoZXJzaXplKQoreworICBHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlciAqc2VsZiA9IEdTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIgKGJhc2UpOworICBndWludCBibG9ja2xlbjsKKyAgR3N0QXVkaW9JbmZvIGluZm87CisgIGdpbnQgYnBmOworCisgIGlmICghc2VsZi0+ZmZ0IHx8IHNlbGYtPmxvd19sYXRlbmN5IHx8IGRpcmVjdGlvbiA9PSBHU1RfUEFEX1NSQykgeworICAgICpvdGhlcnNpemUgPSBzaXplOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgaWYgKCFnc3RfYXVkaW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgYnBmID0gR1NUX0FVRElPX0lORk9fQlBGICgmaW5mbyk7CisKKyAgc2l6ZSAvPSBicGY7CisgIGJsb2NrbGVuID0gc2VsZi0+YmxvY2tfbGVuZ3RoIC0gc2VsZi0+a2VybmVsX2xlbmd0aCArIDE7CisgICpvdGhlcnNpemUgPSAoKHNpemUgKyBibG9ja2xlbiAtIDEpIC8gYmxvY2tsZW4pICogYmxvY2tsZW47CisgICpvdGhlcnNpemUgKj0gYnBmOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl90cmFuc2Zvcm0gKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLAorICAgIEdzdEJ1ZmZlciAqIGluYnVmLCBHc3RCdWZmZXIgKiBvdXRidWYpCit7CisgIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyICpzZWxmID0gR1NUX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUiAoYmFzZSk7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIGV4cGVjdGVkX3RpbWVzdGFtcDsKKyAgZ2ludCBjaGFubmVscyA9IEdTVF9BVURJT19GSUxURVJfQ0hBTk5FTFMgKHNlbGYpOworICBnaW50IHJhdGUgPSBHU1RfQVVESU9fRklMVEVSX1JBVEUgKHNlbGYpOworICBnaW50IGJwcyA9IEdTVF9BVURJT19GSUxURVJfQlBTIChzZWxmKTsKKyAgR3N0TWFwSW5mbyBpbm1hcCwgb3V0bWFwOworICBndWludCBpbnB1dF9zYW1wbGVzOworICBndWludCBvdXRwdXRfc2FtcGxlczsKKyAgZ3VpbnQgZ2VuZXJhdGVkX3NhbXBsZXM7CisgIGd1aW50NjQgb3V0cHV0X29mZnNldDsKKyAgZ2ludDY0IGRpZmYgPSAwOworICBHc3RDbG9ja1RpbWUgc3RyZWFtX3RpbWU7CisKKyAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1Zik7CisKKyAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAodGltZXN0YW1wKQorICAgICAgJiYgIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzZWxmLT5zdGFydF90cykpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiSW52YWxpZCB0aW1lc3RhbXAiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICBnX211dGV4X2xvY2sgKCZzZWxmLT5sb2NrKTsKKyAgc3RyZWFtX3RpbWUgPQorICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZiYXNlLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsIHRpbWVzdGFtcCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgInN5bmMgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW1fdGltZSkpCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoc2VsZiksIHN0cmVhbV90aW1lKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2VsZi0+a2VybmVsICE9IE5VTEwsIEdTVF9GTE9XX0VSUk9SKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNoYW5uZWxzICE9IDAsIEdTVF9GTE9XX0VSUk9SKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHNlbGYtPnN0YXJ0X3RzKSkKKyAgICBleHBlY3RlZF90aW1lc3RhbXAgPQorICAgICAgICBzZWxmLT5zdGFydF90cyArIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNlbGYtPm5zYW1wbGVzX2luLAorICAgICAgICBHU1RfU0VDT05ELCByYXRlKTsKKyAgZWxzZQorICAgIGV4cGVjdGVkX3RpbWVzdGFtcCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgLyogUmVzZXQgdGhlIHJlc2lkdWUgaWYgYWxyZWFkeSBleGlzdGluZyBvbiBkaXNjb250IGJ1ZmZlcnMgKi8KKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAoaW5idWYpCisgICAgICB8fCAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGV4cGVjdGVkX3RpbWVzdGFtcCkKKyAgICAgICAgICAmJiAoQUJTIChHU1RfQ0xPQ0tfRElGRiAodGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3RpbWVzdGFtcCkpID4gNSAqIEdTVF9NU0VDT05EKSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiRGlzY29udGludWl0eSBkZXRlY3RlZCAtIGZsdXNoaW5nIik7CisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChleHBlY3RlZF90aW1lc3RhbXApKQorICAgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9wdXNoX3Jlc2lkdWUgKHNlbGYpOworICAgIHNlbGYtPmJ1ZmZlcl9maWxsID0gMDsKKyAgICBnX2ZyZWUgKHNlbGYtPmJ1ZmZlcik7CisgICAgc2VsZi0+YnVmZmVyID0gTlVMTDsKKyAgICBzZWxmLT5zdGFydF90cyA9IHRpbWVzdGFtcDsKKyAgICBzZWxmLT5zdGFydF9vZmYgPSBHU1RfQlVGRkVSX09GRlNFVCAoaW5idWYpOworICAgIHNlbGYtPm5zYW1wbGVzX291dCA9IDA7CisgICAgc2VsZi0+bnNhbXBsZXNfaW4gPSAwOworICB9IGVsc2UgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc2VsZi0+c3RhcnRfdHMpKSB7CisgICAgc2VsZi0+c3RhcnRfdHMgPSB0aW1lc3RhbXA7CisgICAgc2VsZi0+c3RhcnRfb2ZmID0gR1NUX0JVRkZFUl9PRkZTRVQgKGluYnVmKTsKKyAgfQorCisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZiwgJmlubWFwLCBHU1RfTUFQX1JFQUQpOworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmb3V0bWFwLCBHU1RfTUFQX1dSSVRFKTsKKworICBpbnB1dF9zYW1wbGVzID0gKGlubWFwLnNpemUgLyBicHMpIC8gY2hhbm5lbHM7CisgIG91dHB1dF9zYW1wbGVzID0gKG91dG1hcC5zaXplIC8gYnBzKSAvIGNoYW5uZWxzOworCisgIHNlbGYtPm5zYW1wbGVzX2luICs9IGlucHV0X3NhbXBsZXM7CisKKyAgZ2VuZXJhdGVkX3NhbXBsZXMgPQorICAgICAgc2VsZi0+cHJvY2VzcyAoc2VsZiwgaW5tYXAuZGF0YSwgb3V0bWFwLmRhdGEsIGlucHV0X3NhbXBsZXMpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmLCAmaW5tYXApOworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWYsICZvdXRtYXApOworCisgIGdfYXNzZXJ0IChnZW5lcmF0ZWRfc2FtcGxlcyA8PSBvdXRwdXRfc2FtcGxlcyk7CisgIHNlbGYtPm5zYW1wbGVzX291dCArPSBnZW5lcmF0ZWRfc2FtcGxlczsKKyAgaWYgKGdlbmVyYXRlZF9zYW1wbGVzID09IDApCisgICAgZ290byBub19zYW1wbGVzOworCisgIC8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgd2UgY2FuIHB1c2ggb3V0IG5vdyB3aXRob3V0IG91dHB1dHRpbmcKKyAgICogbGF0ZW5jeSB6ZXJvcyBpbiB0aGUgYmVnaW5uaW5nICovCisgIGRpZmYgPSAoKGdpbnQ2NCkgc2VsZi0+bnNhbXBsZXNfb3V0KSAtICgoZ2ludDY0KSBzZWxmLT5sYXRlbmN5KTsKKyAgaWYgKGRpZmYgPCAwKQorICAgIGdvdG8gbm9fc2FtcGxlczsKKworICBpZiAoZGlmZiA8IGdlbmVyYXRlZF9zYW1wbGVzKSB7CisgICAgZ2ludDY0IHRtcCA9IGRpZmY7CisgICAgZGlmZiA9IGdlbmVyYXRlZF9zYW1wbGVzIC0gZGlmZjsKKyAgICBnZW5lcmF0ZWRfc2FtcGxlcyA9IHRtcDsKKyAgfSBlbHNlIHsKKyAgICBkaWZmID0gMDsKKyAgfQorCisgIGdzdF9idWZmZXJfcmVzaXplIChvdXRidWYsIGRpZmYgKiBicHMgKiBjaGFubmVscywKKyAgICAgIGdlbmVyYXRlZF9zYW1wbGVzICogYnBzICogY2hhbm5lbHMpOworCisgIG91dHB1dF9vZmZzZXQgPSBzZWxmLT5uc2FtcGxlc19vdXQgLSBzZWxmLT5sYXRlbmN5IC0gZ2VuZXJhdGVkX3NhbXBsZXM7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpID0KKyAgICAgIHNlbGYtPnN0YXJ0X3RzICsgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAob3V0cHV0X29mZnNldCwgR1NUX1NFQ09ORCwKKyAgICAgIHJhdGUpOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKG91dHB1dF9zYW1wbGVzLCBHU1RfU0VDT05ELCByYXRlKTsKKyAgaWYgKHNlbGYtPnN0YXJ0X29mZiAhPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FKSB7CisgICAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBzZWxmLT5zdGFydF9vZmYgKyBvdXRwdXRfb2Zmc2V0OworICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAob3V0YnVmKSA9CisgICAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpICsgZ2VuZXJhdGVkX3NhbXBsZXM7CisgIH0gZWxzZSB7CisgICAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FOworICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAob3V0YnVmKSA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgIlB1c2hpbmcgYnVmZmVyIG9mIHNpemUgJSIgR19HU0laRV9GT1JNQVQgIiB3aXRoIHRpbWVzdGFtcDogJSIKKyAgICAgIEdTVF9USU1FX0ZPUk1BVCAiLCBkdXJhdGlvbjogJSIgR1NUX1RJTUVfRk9STUFUICIsIG9mZnNldDogJSIKKyAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIiwgb2Zmc2V0X2VuZDogJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBuc2FtcGxlc19vdXQ6ICVkIiwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZiksCisgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSksCisgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpKSwgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZiksCisgICAgICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKG91dGJ1ZiksIGdlbmVyYXRlZF9zYW1wbGVzKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKK25vX3NhbXBsZXM6CisgIHsKKyAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgIHJldHVybiBHU1RfQkFTRV9UUkFOU0ZPUk1fRkxPV19EUk9QUEVEOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UpCit7CisgIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyICpzZWxmID0gR1NUX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUiAoYmFzZSk7CisKKyAgc2VsZi0+YnVmZmVyX2ZpbGwgPSAwOworICBnX2ZyZWUgKHNlbGYtPmJ1ZmZlcik7CisgIHNlbGYtPmJ1ZmZlciA9IE5VTEw7CisgIHNlbGYtPnN0YXJ0X3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgc2VsZi0+c3RhcnRfb2ZmID0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORTsKKyAgc2VsZi0+bnNhbXBsZXNfb3V0ID0gMDsKKyAgc2VsZi0+bnNhbXBsZXNfaW4gPSAwOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc3RvcCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UpCit7CisgIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyICpzZWxmID0gR1NUX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUiAoYmFzZSk7CisKKyAgZ19mcmVlIChzZWxmLT5idWZmZXIpOworICBzZWxmLT5idWZmZXIgPSBOVUxMOworICBzZWxmLT5idWZmZXJfbGVuZ3RoID0gMDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3F1ZXJ5IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXIgKnNlbGYgPSBHU1RfQVVESU9fRlhfQkFTRV9GSVJfRklMVEVSICh0cmFucyk7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfTEFURU5DWToKKyAgICB7CisgICAgICBHc3RDbG9ja1RpbWUgbWluLCBtYXg7CisgICAgICBnYm9vbGVhbiBsaXZlOworICAgICAgZ3VpbnQ2NCBsYXRlbmN5OworICAgICAgZ2ludCByYXRlID0gR1NUX0FVRElPX0ZJTFRFUl9SQVRFIChzZWxmKTsKKworICAgICAgaWYgKHJhdGUgPT0gMCkgeworICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgIH0gZWxzZSBpZiAoKHJlcyA9CisgICAgICAgICAgICAgIGdzdF9wYWRfcGVlcl9xdWVyeSAoR1NUX0JBU0VfVFJBTlNGT1JNIChzZWxmKS0+c2lua3BhZCwgcXVlcnkpKSkgeworICAgICAgICBnc3RfcXVlcnlfcGFyc2VfbGF0ZW5jeSAocXVlcnksICZsaXZlLCAmbWluLCAmbWF4KTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUGVlciBsYXRlbmN5OiBtaW4gJSIKKyAgICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiIG1heCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChtaW4pLCBHU1RfVElNRV9BUkdTIChtYXgpKTsKKworICAgICAgICBpZiAoc2VsZi0+ZmZ0ICYmICFzZWxmLT5sb3dfbGF0ZW5jeSkKKyAgICAgICAgICBsYXRlbmN5ID0gc2VsZi0+YmxvY2tfbGVuZ3RoIC0gc2VsZi0+a2VybmVsX2xlbmd0aCArIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBsYXRlbmN5ID0gc2VsZi0+bGF0ZW5jeTsKKworICAgICAgICAvKiBhZGQgb3VyIG93biBsYXRlbmN5ICovCisgICAgICAgIGxhdGVuY3kgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKGxhdGVuY3ksIEdTVF9TRUNPTkQsIHJhdGUpOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJPdXIgbGF0ZW5jeTogJSIKKyAgICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAobGF0ZW5jeSkpOworCisgICAgICAgIG1pbiArPSBsYXRlbmN5OworICAgICAgICBpZiAobWF4ICE9IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgICAgICAgbWF4ICs9IGxhdGVuY3k7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkNhbGN1bGF0ZWQgdG90YWwgbGF0ZW5jeSA6IG1pbiAlIgorICAgICAgICAgICAgR1NUX1RJTUVfRk9STUFUICIgbWF4ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKG1pbiksIEdTVF9USU1FX0FSR1MgKG1heCkpOworCisgICAgICAgIGdzdF9xdWVyeV9zZXRfbGF0ZW5jeSAocXVlcnksIGxpdmUsIG1pbiwgbWF4KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0KKyAgICAgICAgICBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKHBhcmVudF9jbGFzcyktPnF1ZXJ5ICh0cmFucywgZGlyZWN0aW9uLAorICAgICAgICAgIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9zaW5rX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlciAqc2VsZiA9IEdTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIgKGJhc2UpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfcHVzaF9yZXNpZHVlIChzZWxmKTsKKyAgICAgIHNlbGYtPnN0YXJ0X3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgIHNlbGYtPnN0YXJ0X29mZiA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisgICAgICBzZWxmLT5uc2FtcGxlc19vdXQgPSAwOworICAgICAgc2VsZi0+bnNhbXBsZXNfaW4gPSAwOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAoYmFzZSwgZXZlbnQpOworfQorCit2b2lkCitnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3NldF9rZXJuZWwgKEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyICogc2VsZiwKKyAgICBnZG91YmxlICoga2VybmVsLCBndWludCBrZXJuZWxfbGVuZ3RoLCBndWludDY0IGxhdGVuY3ksCisgICAgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgZ2Jvb2xlYW4gbGF0ZW5jeV9jaGFuZ2VkOworICBHc3RBdWRpb0Zvcm1hdCBmb3JtYXQ7CisgIGdpbnQgY2hhbm5lbHM7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoa2VybmVsICE9IE5VTEwpOworICBnX3JldHVybl9pZl9mYWlsIChzZWxmICE9IE5VTEwpOworCisgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworCisgIGxhdGVuY3lfY2hhbmdlZCA9IChzZWxmLT5sYXRlbmN5ICE9IGxhdGVuY3kKKyAgICAgIHx8ICghc2VsZi0+bG93X2xhdGVuY3kgJiYgc2VsZi0+a2VybmVsX2xlbmd0aCA8IEZGVF9USFJFU0hPTEQKKyAgICAgICAgICAmJiBrZXJuZWxfbGVuZ3RoID49IEZGVF9USFJFU0hPTEQpCisgICAgICB8fCAoIXNlbGYtPmxvd19sYXRlbmN5ICYmIHNlbGYtPmtlcm5lbF9sZW5ndGggPj0gRkZUX1RIUkVTSE9MRAorICAgICAgICAgICYmIGtlcm5lbF9sZW5ndGggPCBGRlRfVEhSRVNIT0xEKSk7CisKKyAgLyogRklYTUU6IElmIHRoZSBsYXRlbmN5IGNoYW5nZXMsIHRoZSBidWZmZXIgc2l6ZSBjaGFuZ2VzIHRvbyBhbmQgd2UKKyAgICogaGF2ZSB0byBkcmFpbiBpbiBhbnkgY2FzZSB1bnRpbCB0aGlzIGlzIGZpeGVkIGluIHRoZSBmdXR1cmUgKi8KKyAgaWYgKHNlbGYtPmJ1ZmZlciAmJiAoIXNlbGYtPmRyYWluX29uX2NoYW5nZXMgfHwgbGF0ZW5jeV9jaGFuZ2VkKSkgeworICAgIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfcHVzaF9yZXNpZHVlIChzZWxmKTsKKyAgICBzZWxmLT5zdGFydF90cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgc2VsZi0+c3RhcnRfb2ZmID0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORTsKKyAgICBzZWxmLT5uc2FtcGxlc19vdXQgPSAwOworICAgIHNlbGYtPm5zYW1wbGVzX2luID0gMDsKKyAgICBzZWxmLT5idWZmZXJfZmlsbCA9IDA7CisgIH0KKworICBnX2ZyZWUgKHNlbGYtPmtlcm5lbCk7CisgIGlmICghc2VsZi0+ZHJhaW5fb25fY2hhbmdlcyB8fCBsYXRlbmN5X2NoYW5nZWQpIHsKKyAgICBnX2ZyZWUgKHNlbGYtPmJ1ZmZlcik7CisgICAgc2VsZi0+YnVmZmVyID0gTlVMTDsKKyAgICBzZWxmLT5idWZmZXJfZmlsbCA9IDA7CisgICAgc2VsZi0+YnVmZmVyX2xlbmd0aCA9IDA7CisgIH0KKworICBzZWxmLT5rZXJuZWwgPSBrZXJuZWw7CisgIHNlbGYtPmtlcm5lbF9sZW5ndGggPSBrZXJuZWxfbGVuZ3RoOworCisgIGlmIChpbmZvKSB7CisgICAgZm9ybWF0ID0gR1NUX0FVRElPX0lORk9fRk9STUFUIChpbmZvKTsKKyAgICBjaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChpbmZvKTsKKyAgfSBlbHNlIHsKKyAgICBmb3JtYXQgPSBHU1RfQVVESU9fRklMVEVSX0ZPUk1BVCAoc2VsZik7CisgICAgY2hhbm5lbHMgPSBHU1RfQVVESU9fRklMVEVSX0NIQU5ORUxTIChzZWxmKTsKKyAgfQorCisgIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfY2FsY3VsYXRlX2ZyZXF1ZW5jeV9yZXNwb25zZSAoc2VsZik7CisgIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc2VsZWN0X3Byb2Nlc3NfZnVuY3Rpb24gKHNlbGYsIGZvcm1hdCwgY2hhbm5lbHMpOworCisgIGlmIChsYXRlbmN5X2NoYW5nZWQpIHsKKyAgICBzZWxmLT5sYXRlbmN5ID0gbGF0ZW5jeTsKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UIChzZWxmKSwKKyAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2xhdGVuY3kgKEdTVF9PQkpFQ1QgKHNlbGYpKSk7CisgIH0KKworICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VmaXJmaWx0ZXIuaCBiL2dzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkNTU2MQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlZmlyZmlsdGVyLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qIC0qLSBjLWJhc2ljLW9mZnNldDogMiAtKi0KKyAqIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAyMDA2IERyZWFtbGFiIFRlY2hub2xvZ2llcyBMdGQuIDxtYXRoaXMuaG9mZXJAZHJlYW1sYWIubmV0PgorICogICAgICAgICAgICAgICAyMDA5IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICogCisgKi8KKworI2lmbmRlZiBfX0dTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVJfSF9fCisjZGVmaW5lIF9fR1NUX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvZmZ0L2dzdGZmdGY2NC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fRlhfQkFTRV9GSVJfRklMVEVSIFwKKyAgKGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUixHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlcikpCisjZGVmaW5lIEdTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVJfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfQVVESU9fRlhfQkFTRV9GSVJfRklMVEVSLEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fRlhfQkFTRV9GSVJfRklMVEVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVVESU9fRlhfQkFTRV9GSVJfRklMVEVSKSkKKyNkZWZpbmUgR1NUX0lTX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXIgR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXI7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXJDbGFzcyBHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlckNsYXNzOworCit0eXBlZGVmIGd1aW50ICgqR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXJQcm9jZXNzRnVuYykgKEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyICosIGNvbnN0IGd1aW50OCAqLCBndWludDggKiwgZ3VpbnQpOworCisvKioKKyAqIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyOgorICoKKyAqIE9wYXF1ZSBkYXRhIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RBdWRpb0ZYQmFzZUZJUkZpbHRlciB7CisgIEdzdEF1ZGlvRmlsdGVyIGVsZW1lbnQ7CisKKyAgLyogcHJvcGVydGllcyAqLworICBnZG91YmxlICprZXJuZWw7ICAgICAgICAgICAgICAvKiBmaWx0ZXIga2VybmVsIC0tIHRpbWUgZG9tYWluICovCisgIGd1aW50IGtlcm5lbF9sZW5ndGg7ICAgICAgICAgIC8qIGxlbmd0aCBvZiB0aGUgZmlsdGVyIGtlcm5lbCAtLSB0aW1lIGRvbWFpbiAqLworCisgIGd1aW50NjQgbGF0ZW5jeTsgICAgICAgICAgICAgIC8qIHByZS1sYXRlbmN5IG9mIHRoZSBmaWx0ZXIga2VybmVsICovCisgIGdib29sZWFuIGxvd19sYXRlbmN5OyAgICAgICAgIC8qIHdvcmsgaW4gc2xvd2VyIGxvdyBsYXRlbmN5IG1vZGUgKi8KKworICBnYm9vbGVhbiBkcmFpbl9vbl9jaGFuZ2VzOyAgICAvKiBJZiB0aGUgZmlsdGVyIHNob3VsZCBiZSBkcmFpbmVkIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY29lZmljaWVudHMgY2hhbmdlICovCisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXJQcm9jZXNzRnVuYyBwcm9jZXNzOworCisgIGdkb3VibGUgKmJ1ZmZlcjsgICAgICAgICAgICAgIC8qIGJ1ZmZlciBmb3Igc3RvcmluZyBzYW1wbGVzIG9mIHByZXZpb3VzIGJ1ZmZlcnMgKi8KKyAgZ3VpbnQgYnVmZmVyX2ZpbGw7ICAgICAgICAgICAgLyogZmlsbCBsZXZlbCBvZiBidWZmZXIgKi8KKyAgZ3VpbnQgYnVmZmVyX2xlbmd0aDsgICAgICAgICAgLyogbGVuZ3RoIG9mIHRoZSBidWZmZXIgLS0gbWVhbmluZyBkZXBlbmRzIG9uIHByb2Nlc3NpbmcgbW9kZSAqLworCisgIC8qIEZGVCBjb252b2x1dGlvbiBzcGVjaWZpYyBkYXRhICovCisgIEdzdEZGVEY2NCAqZmZ0OworICBHc3RGRlRGNjQgKmlmZnQ7CisgIEdzdEZGVEY2NENvbXBsZXggKmZyZXF1ZW5jeV9yZXNwb25zZTsgIC8qIGZpbHRlciBrZXJuZWwgLS0gZnJlcXVlbmN5IGRvbWFpbiAqLworICBndWludCBmcmVxdWVuY3lfcmVzcG9uc2VfbGVuZ3RoOyAgICAgICAvKiBsZW5ndGggb2YgZmlsdGVyIGtlcm5lbCAtLSBmcmVxdWVuY3kgZG9tYWluICovCisgIEdzdEZGVEY2NENvbXBsZXggKmZmdF9idWZmZXI7ICAgICAgICAgIC8qIEZGVCBidWZmZXIsIGhhcyB0aGUgbGVuZ3RoIG9mIHRoZSBmcmVxdWVuY3kgcmVzcG9uc2UgKi8KKyAgZ3VpbnQgYmxvY2tfbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIHRoZSBwcm9jZXNzaW5nIGJsb2NrcyAtLSB0aW1lIGRvbWFpbiAqLworCisgIEdzdENsb2NrVGltZSBzdGFydF90czsgICAgICAgIC8qIHN0YXJ0IHRpbWVzdGFtcCBhZnRlciBhIGRpc2NvbnQgKi8KKyAgZ3VpbnQ2NCBzdGFydF9vZmY7ICAgICAgICAgICAgLyogc3RhcnQgb2Zmc2V0IGFmdGVyIGEgZGlzY29udCAqLworICBndWludDY0IG5zYW1wbGVzX291dDsgICAgICAgICAvKiBudW1iZXIgb2Ygb3V0cHV0IHNhbXBsZXMgc2luY2UgbGFzdCBkaXNjb250ICovCisgIGd1aW50NjQgbnNhbXBsZXNfaW47ICAgICAgICAgIC8qIG51bWJlciBvZiBpbnB1dCBzYW1wbGVzIHNpbmNlIGxhc3QgZGlzY29udCAqLworCisgIEdNdXRleCBsb2NrOworfTsKKworc3RydWN0IF9Hc3RBdWRpb0ZYQmFzZUZJUkZpbHRlckNsYXNzIHsKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX2dldF90eXBlICh2b2lkKTsKK3ZvaWQgZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9zZXRfa2VybmVsIChHc3RBdWRpb0ZYQmFzZUZJUkZpbHRlciAqZmlsdGVyLCBnZG91YmxlICprZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQga2VybmVsX2xlbmd0aCwgZ3VpbnQ2NCBsYXRlbmN5LCBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKTsKK3ZvaWQgZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9wdXNoX3Jlc2lkdWUgKEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyICpmaWx0ZXIpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQVVESU9fRlhfQkFTRV9GSVJfRklMVEVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuYyBiL2dzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlaWlyZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1NTNlOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlvZnhiYXNlaWlyZmlsdGVyLmMKQEAgLTAsMCArMSw0MTYgQEAKKy8qIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJhdWRpb2Z4YmFzZWlpcmZpbHRlci5oIgorCisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2RlYnVnCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChHU1RfQ0FUX0RFRkFVTFQpOworCisjZGVmaW5lIEFMTE9XRURfQ0FQUyBcCisgICAgImF1ZGlvL3gtcmF3LCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBmb3JtYXQ9KHN0cmluZyl7IkdTVF9BVURJT19ORShGMzIpIiwiR1NUX0FVRElPX05FKEY2NCkifSwiICBcCisgICAgIiByYXRlID0gKGludCkgWyAxLCBNQVggXSwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBjaGFubmVscyA9IChpbnQpIFsgMSwgTUFYIF0sIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBsYXlvdXQ9KHN0cmluZykgaW50ZXJsZWF2ZWQiCisKKyNkZWZpbmUgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlciwKKyAgICBnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyLCBHU1RfVFlQRV9BVURJT19GSUxURVIpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9zZXR1cCAoR3N0QXVkaW9GaWx0ZXIgKiBmaWx0ZXIsCisgICAgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9zdG9wIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSk7CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfNjQgKEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyICogZmlsdGVyLAorICAgIGdkb3VibGUgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcyk7CitzdGF0aWMgdm9pZCBwcm9jZXNzXzMyIChHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlciAqIGZpbHRlciwKKyAgICBnZmxvYXQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcyk7CisKKy8qIEdPYmplY3Qgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyICpmaWx0ZXIgPSBHU1RfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSIChvYmplY3QpOworCisgIGlmIChmaWx0ZXItPmEpIHsKKyAgICBnX2ZyZWUgKGZpbHRlci0+YSk7CisgICAgZmlsdGVyLT5hID0gTlVMTDsKKyAgfQorCisgIGlmIChmaWx0ZXItPmIpIHsKKyAgICBnX2ZyZWUgKGZpbHRlci0+Yik7CisgICAgZmlsdGVyLT5iID0gTlVMTDsKKyAgfQorCisgIGlmIChmaWx0ZXItPmNoYW5uZWxzKSB7CisgICAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJDaGFubmVsQ3R4ICpjdHg7CisgICAgZ3VpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXItPm5jaGFubmVsczsgaSsrKSB7CisgICAgICBjdHggPSAmZmlsdGVyLT5jaGFubmVsc1tpXTsKKyAgICAgIGdfZnJlZSAoY3R4LT54KTsKKyAgICAgIGdfZnJlZSAoY3R4LT55KTsKKyAgICB9CisKKyAgICBnX2ZyZWUgKGZpbHRlci0+Y2hhbm5lbHMpOworICAgIGZpbHRlci0+Y2hhbm5lbHMgPSBOVUxMOworICB9CisgIGdfbXV0ZXhfY2xlYXIgKCZmaWx0ZXItPmxvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfY2xhc3NfaW5pdCAoR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyAqZmlsdGVyX2NsYXNzID0gKEdzdEF1ZGlvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfZGVidWcsCisgICAgICAiYXVkaW9meGJhc2VpaXJmaWx0ZXIiLCAwLCAiQXVkaW8gSUlSIEZpbHRlciBCYXNlIENsYXNzIik7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2ZpbmFsaXplOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQUxMT1dFRF9DQVBTKTsKKyAgZ3N0X2F1ZGlvX2ZpbHRlcl9jbGFzc19hZGRfcGFkX3RlbXBsYXRlcyAoR1NUX0FVRElPX0ZJTFRFUl9DTEFTUyAoa2xhc3MpLAorICAgICAgY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBmaWx0ZXJfY2xhc3MtPnNldHVwID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfc2V0dXApOworCisgIHRyYW5zX2NsYXNzLT50cmFuc2Zvcm1faXAgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdWRpb19meF9iYXNlX2lpcl9maWx0ZXJfdHJhbnNmb3JtX2lwKTsKKyAgdHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9pcF9vbl9wYXNzdGhyb3VnaCA9IEZBTFNFOworICB0cmFuc19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX3N0b3ApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9pbml0IChHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlciAqIGZpbHRlcikKK3sKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9pbl9wbGFjZSAoR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpLCBUUlVFKTsKKworICBmaWx0ZXItPmEgPSBOVUxMOworICBmaWx0ZXItPm5hID0gMDsKKyAgZmlsdGVyLT5iID0gTlVMTDsKKyAgZmlsdGVyLT5uYiA9IDA7CisgIGZpbHRlci0+Y2hhbm5lbHMgPSBOVUxMOworICBmaWx0ZXItPm5jaGFubmVscyA9IDA7CisKKyAgZ19tdXRleF9pbml0ICgmZmlsdGVyLT5sb2NrKTsKK30KKworLyogRXZhbHVhdGUgdGhlIHRyYW5zZmVyIGZ1bmN0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIElJUgorICogY29lZmZpY2llbnRzIGF0ICh6ciArIHppKkkpXi0xIGFuZCByZXR1cm4gdGhlIG1hZ25pdHVkZSAqLworZ2RvdWJsZQorZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9jYWxjdWxhdGVfZ2FpbiAoZ2RvdWJsZSAqIGEsIGd1aW50IG5hLCBnZG91YmxlICogYiwKKyAgICBndWludCBuYiwgZ2RvdWJsZSB6ciwgZ2RvdWJsZSB6aSkKK3sKKyAgZ2RvdWJsZSBzdW1fYXIsIHN1bV9haTsKKyAgZ2RvdWJsZSBzdW1fYnIsIHN1bV9iaTsKKyAgZ2RvdWJsZSBnYWluX3IsIGdhaW5faTsKKworICBnZG91YmxlIHN1bV9yX29sZDsKKyAgZ2RvdWJsZSBzdW1faV9vbGQ7CisKKyAgZ2ludCBpOworCisgIHN1bV9hciA9IGFbbmEgLSAxXTsKKyAgc3VtX2FpID0gMC4wOworICBmb3IgKGkgPSBuYSAtIDI7IGkgPj0gMDsgaS0tKSB7CisgICAgc3VtX3Jfb2xkID0gc3VtX2FyOworICAgIHN1bV9pX29sZCA9IHN1bV9haTsKKworICAgIHN1bV9hciA9IChzdW1fcl9vbGQgKiB6ciAtIHN1bV9pX29sZCAqIHppKSArIGFbaV07CisgICAgc3VtX2FpID0gKHN1bV9yX29sZCAqIHppICsgc3VtX2lfb2xkICogenIpICsgMC4wOworICB9CisKKyAgc3VtX2JyID0gYltuYiAtIDFdOworICBzdW1fYmkgPSAwLjA7CisgIGZvciAoaSA9IG5iIC0gMjsgaSA+PSAwOyBpLS0pIHsKKyAgICBzdW1fcl9vbGQgPSBzdW1fYnI7CisgICAgc3VtX2lfb2xkID0gc3VtX2JpOworCisgICAgc3VtX2JyID0gKHN1bV9yX29sZCAqIHpyIC0gc3VtX2lfb2xkICogemkpICsgYltpXTsKKyAgICBzdW1fYmkgPSAoc3VtX3Jfb2xkICogemkgKyBzdW1faV9vbGQgKiB6cikgKyAwLjA7CisgIH0KKworICBnYWluX3IgPQorICAgICAgKHN1bV9iciAqIHN1bV9hciArIHN1bV9iaSAqIHN1bV9haSkgLyAoc3VtX2FyICogc3VtX2FyICsgc3VtX2FpICogc3VtX2FpKTsKKyAgZ2Fpbl9pID0KKyAgICAgIChzdW1fYmkgKiBzdW1fYXIgLSBzdW1fYnIgKiBzdW1fYWkpIC8gKHN1bV9hciAqIHN1bV9hciArIHN1bV9haSAqIHN1bV9haSk7CisKKyAgcmV0dXJuIChzcXJ0IChnYWluX3IgKiBnYWluX3IgKyBnYWluX2kgKiBnYWluX2kpKTsKK30KKwordm9pZAorZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9zZXRfY29lZmZpY2llbnRzIChHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlciAqIGZpbHRlciwKKyAgICBnZG91YmxlICogYSwgZ3VpbnQgbmEsIGdkb3VibGUgKiBiLCBndWludCBuYikKK3sKKyAgZ3VpbnQgaTsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSIChmaWx0ZXIpKTsKKworICBnX211dGV4X2xvY2sgKCZmaWx0ZXItPmxvY2spOworCisgIGdfZnJlZSAoZmlsdGVyLT5hKTsKKyAgZ19mcmVlIChmaWx0ZXItPmIpOworCisgIGZpbHRlci0+YSA9IGZpbHRlci0+YiA9IE5VTEw7CisKKyAgaWYgKGZpbHRlci0+Y2hhbm5lbHMpIHsKKyAgICBHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlckNoYW5uZWxDdHggKmN0eDsKKyAgICBnYm9vbGVhbiBmcmVlID0gKG5hICE9IGZpbHRlci0+bmEgfHwgbmIgIT0gZmlsdGVyLT5uYik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyLT5uY2hhbm5lbHM7IGkrKykgeworICAgICAgY3R4ID0gJmZpbHRlci0+Y2hhbm5lbHNbaV07CisKKyAgICAgIGlmIChmcmVlKQorICAgICAgICBnX2ZyZWUgKGN0eC0+eCk7CisgICAgICBlbHNlCisgICAgICAgIG1lbXNldCAoY3R4LT54LCAwLCBmaWx0ZXItPm5iICogc2l6ZW9mIChnZG91YmxlKSk7CisKKyAgICAgIGlmIChmcmVlKQorICAgICAgICBnX2ZyZWUgKGN0eC0+eSk7CisgICAgICBlbHNlCisgICAgICAgIG1lbXNldCAoY3R4LT55LCAwLCBmaWx0ZXItPm5hICogc2l6ZW9mIChnZG91YmxlKSk7CisgICAgfQorCisgICAgZ19mcmVlIChmaWx0ZXItPmNoYW5uZWxzKTsKKyAgICBmaWx0ZXItPmNoYW5uZWxzID0gTlVMTDsKKyAgfQorCisgIGZpbHRlci0+bmEgPSBuYTsKKyAgZmlsdGVyLT5uYiA9IG5iOworCisgIGZpbHRlci0+YSA9IGE7CisgIGZpbHRlci0+YiA9IGI7CisKKyAgaWYgKGZpbHRlci0+bmNoYW5uZWxzICYmICFmaWx0ZXItPmNoYW5uZWxzKSB7CisgICAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJDaGFubmVsQ3R4ICpjdHg7CisKKyAgICBmaWx0ZXItPmNoYW5uZWxzID0KKyAgICAgICAgZ19uZXcwIChHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlckNoYW5uZWxDdHgsIGZpbHRlci0+bmNoYW5uZWxzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyLT5uY2hhbm5lbHM7IGkrKykgeworICAgICAgY3R4ID0gJmZpbHRlci0+Y2hhbm5lbHNbaV07CisKKyAgICAgIGN0eC0+eCA9IGdfbmV3MCAoZ2RvdWJsZSwgZmlsdGVyLT5uYik7CisgICAgICBjdHgtPnkgPSBnX25ldzAgKGdkb3VibGUsIGZpbHRlci0+bmEpOworICAgIH0KKyAgfQorCisgIGdfbXV0ZXhfdW5sb2NrICgmZmlsdGVyLT5sb2NrKTsKK30KKworLyogR3N0QXVkaW9GaWx0ZXIgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworc3RhdGljIGdib29sZWFuCitnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGJhc2UsCisgICAgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXIgKmZpbHRlciA9IEdTVF9BVURJT19GWF9CQVNFX0lJUl9GSUxURVIgKGJhc2UpOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworICBnaW50IGNoYW5uZWxzOworCisgIGdfbXV0ZXhfbG9jayAoJmZpbHRlci0+bG9jayk7CisgIHN3aXRjaCAoR1NUX0FVRElPX0lORk9fRk9STUFUIChpbmZvKSkgeworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GMzI6CisgICAgICBmaWx0ZXItPnByb2Nlc3MgPSAoR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJQcm9jZXNzRnVuYykKKyAgICAgICAgICBwcm9jZXNzXzMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX0Y2NDoKKyAgICAgIGZpbHRlci0+cHJvY2VzcyA9IChHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlclByb2Nlc3NGdW5jKQorICAgICAgICAgIHByb2Nlc3NfNjQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgfQorCisgIGNoYW5uZWxzID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKGluZm8pOworCisgIGlmIChjaGFubmVscyAhPSBmaWx0ZXItPm5jaGFubmVscykgeworICAgIGd1aW50IGk7CisgICAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJDaGFubmVsQ3R4ICpjdHg7CisKKyAgICBpZiAoZmlsdGVyLT5jaGFubmVscykgeworICAgICAgZm9yIChpID0gMDsgaSA8IGZpbHRlci0+bmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgY3R4ID0gJmZpbHRlci0+Y2hhbm5lbHNbaV07CisKKyAgICAgICAgZ19mcmVlIChjdHgtPngpOworICAgICAgICBnX2ZyZWUgKGN0eC0+eSk7CisgICAgICB9CisgICAgICBnX2ZyZWUgKGZpbHRlci0+Y2hhbm5lbHMpOworICAgIH0KKworICAgIGZpbHRlci0+Y2hhbm5lbHMgPSBnX25ldzAgKEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyQ2hhbm5lbEN0eCwgY2hhbm5lbHMpOworICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisgICAgICBjdHggPSAmZmlsdGVyLT5jaGFubmVsc1tpXTsKKworICAgICAgY3R4LT54ID0gZ19uZXcwIChnZG91YmxlLCBmaWx0ZXItPm5iKTsKKyAgICAgIGN0eC0+eSA9IGdfbmV3MCAoZ2RvdWJsZSwgZmlsdGVyLT5uYSk7CisgICAgfQorICAgIGZpbHRlci0+bmNoYW5uZWxzID0gY2hhbm5lbHM7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZmaWx0ZXItPmxvY2spOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2RvdWJsZQorcHJvY2VzcyAoR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXIgKiBmaWx0ZXIsCisgICAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJDaGFubmVsQ3R4ICogY3R4LCBnZG91YmxlIHgwKQoreworICBnZG91YmxlIHZhbCA9IGZpbHRlci0+YlswXSAqIHgwOworICBnaW50IGksIGo7CisKKyAgZm9yIChpID0gMSwgaiA9IGN0eC0+eF9wb3M7IGkgPCBmaWx0ZXItPm5iOyBpKyspIHsKKyAgICB2YWwgKz0gZmlsdGVyLT5iW2ldICogY3R4LT54W2pdOworICAgIGotLTsKKyAgICBpZiAoaiA8IDApCisgICAgICBqID0gZmlsdGVyLT5uYiAtIDE7CisgIH0KKworICBmb3IgKGkgPSAxLCBqID0gY3R4LT55X3BvczsgaSA8IGZpbHRlci0+bmE7IGkrKykgeworICAgIHZhbCAtPSBmaWx0ZXItPmFbaV0gKiBjdHgtPnlbal07CisgICAgai0tOworICAgIGlmIChqIDwgMCkKKyAgICAgIGogPSBmaWx0ZXItPm5hIC0gMTsKKyAgfQorICB2YWwgLz0gZmlsdGVyLT5hWzBdOworCisgIGlmIChjdHgtPngpIHsKKyAgICBjdHgtPnhfcG9zKys7CisgICAgaWYgKGN0eC0+eF9wb3MgPj0gZmlsdGVyLT5uYikKKyAgICAgIGN0eC0+eF9wb3MgPSAwOworICAgIGN0eC0+eFtjdHgtPnhfcG9zXSA9IHgwOworICB9CisgIGlmIChjdHgtPnkpIHsKKyAgICBjdHgtPnlfcG9zKys7CisgICAgaWYgKGN0eC0+eV9wb3MgPj0gZmlsdGVyLT5uYSkKKyAgICAgIGN0eC0+eV9wb3MgPSAwOworCisgICAgY3R4LT55W2N0eC0+eV9wb3NdID0gdmFsOworICB9CisKKyAgcmV0dXJuIHZhbDsKK30KKworI2RlZmluZSBERUZJTkVfUFJPQ0VTU19GVU5DKHdpZHRoLGN0eXBlKSBcCitzdGF0aWMgdm9pZCBcCitwcm9jZXNzXyMjd2lkdGggKEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyICogZmlsdGVyLCBcCisgICAgZyMjY3R5cGUgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykgXAoreyBcCisgIGdpbnQgaSwgaiwgY2hhbm5lbHMgPSBmaWx0ZXItPm5jaGFubmVsczsgXAorICBnZG91YmxlIHZhbDsgXAorICBcCisgIGZvciAoaSA9IDA7IGkgPCBudW1fc2FtcGxlcyAvIGNoYW5uZWxzOyBpKyspIHsgXAorICAgIGZvciAoaiA9IDA7IGogPCBjaGFubmVsczsgaisrKSB7IFwKKyAgICAgIHZhbCA9IHByb2Nlc3MgKGZpbHRlciwgJmZpbHRlci0+Y2hhbm5lbHNbal0sICpkYXRhKTsgXAorICAgICAgKmRhdGErKyA9IHZhbDsgXAorICAgIH0gXAorICB9IFwKK30KKworREVGSU5FX1BST0NFU1NfRlVOQyAoMzIsIGZsb2F0KTsKK0RFRklORV9QUk9DRVNTX0ZVTkMgKDY0LCBkb3VibGUpOworCisjdW5kZWYgREVGSU5FX1BST0NFU1NfRlVOQworCisvKiBHc3RCYXNlVHJhbnNmb3JtIHZtZXRob2QgaW1wbGVtZW50YXRpb25zICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXIgKmZpbHRlciA9IEdTVF9BVURJT19GWF9CQVNFX0lJUl9GSUxURVIgKGJhc2UpOworICBndWludCBudW1fc2FtcGxlczsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwgc3RyZWFtX3RpbWU7CisgIEdzdE1hcEluZm8gbWFwOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpOworICBzdHJlYW1fdGltZSA9CisgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJmJhc2UtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJzeW5jIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKGZpbHRlciksIHN0cmVhbV90aW1lKTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQURXUklURSk7CisgIG51bV9zYW1wbGVzID0gbWFwLnNpemUgLyBHU1RfQVVESU9fRklMVEVSX0JQUyAoZmlsdGVyKTsKKworICBnX211dGV4X2xvY2sgKCZmaWx0ZXItPmxvY2spOworICBpZiAoZmlsdGVyLT5hID09IE5VTEwgfHwgZmlsdGVyLT5iID09IE5VTEwpIHsKKyAgICBnX3dhcm5faWZfZmFpbCAoZmlsdGVyLT5hICE9IE5VTEwgJiYgZmlsdGVyLT5iICE9IE5VTEwpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ19tdXRleF91bmxvY2sgKCZmaWx0ZXItPmxvY2spOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorICBmaWx0ZXItPnByb2Nlc3MgKGZpbHRlciwgbWFwLmRhdGEsIG51bV9zYW1wbGVzKTsKKyAgZ19tdXRleF91bmxvY2sgKCZmaWx0ZXItPmxvY2spOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9zdG9wIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSkKK3sKKyAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXIgKmZpbHRlciA9IEdTVF9BVURJT19GWF9CQVNFX0lJUl9GSUxURVIgKGJhc2UpOworICBndWludCBjaGFubmVscyA9IGZpbHRlci0+bmNoYW5uZWxzOworICBHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlckNoYW5uZWxDdHggKmN0eDsKKyAgZ3VpbnQgaTsKKworICAvKiBSZXNldCB0aGUgaGlzdG9yeSBvZiBpbnB1dCBhbmQgb3V0cHV0IHZhbHVlcyBpZgorICAgKiBhbHJlYWR5IGV4aXN0aW5nICovCisgIGlmIChjaGFubmVscyAmJiBmaWx0ZXItPmNoYW5uZWxzKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKKyAgICAgIGN0eCA9ICZmaWx0ZXItPmNoYW5uZWxzW2ldOworICAgICAgZ19mcmVlIChjdHgtPngpOworICAgICAgZ19mcmVlIChjdHgtPnkpOworICAgIH0KKyAgICBnX2ZyZWUgKGZpbHRlci0+Y2hhbm5lbHMpOworICB9CisgIGZpbHRlci0+Y2hhbm5lbHMgPSBOVUxMOworICBmaWx0ZXItPm5jaGFubmVscyA9IDA7CisKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb2Z4YmFzZWlpcmZpbHRlci5oIGIvZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzhhZTMxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvYXVkaW9meGJhc2VpaXJmaWx0ZXIuaApAQCAtMCwwICsxLDc4IEBACisvKiAKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BVURJT19GWF9CQVNFX0lJUl9GSUxURVJfSF9fCisjZGVmaW5lIF9fR1NUX0FVRElPX0ZYX0JBU0VfSUlSX0ZJTFRFUl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9BVURJT19GWF9CQVNFX0lJUl9GSUxURVIgICAgICAgICAgICAoZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSLEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyKSkKKyNkZWZpbmUgR1NUX0lTX0FVRElPX0ZYX0JBU0VfSUlSX0ZJTFRFUihvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0FVRElPX0ZYX0JBU0VfSUlSX0ZJTFRFUikpCisjZGVmaW5lIEdTVF9BVURJT19GWF9CQVNFX0lJUl9GSUxURVJfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpICxHU1RfVFlQRV9BVURJT19GWF9CQVNFX0lJUl9GSUxURVIsR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BVURJT19GWF9CQVNFX0lJUl9GSUxURVJfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpICxHU1RfVFlQRV9BVURJT19GWF9CQVNFX0lJUl9GSUxURVIpKQorI2RlZmluZSBHU1RfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSX0dFVF9DTEFTUyhvYmopICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUygob2JqKSAsR1NUX1RZUEVfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSLEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyQ2xhc3MpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyIEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyQ2xhc3MgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJDbGFzczsKKwordHlwZWRlZiB2b2lkICgqR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJQcm9jZXNzRnVuYykgKEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyICosIGd1aW50OCAqLCBndWludCk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGdkb3VibGUgKng7CisgIGdpbnQgeF9wb3M7CisgIGdkb3VibGUgKnk7CisgIGdpbnQgeV9wb3M7Cit9IEdzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyQ2hhbm5lbEN0eDsKKworc3RydWN0IF9Hc3RBdWRpb0ZYQmFzZUlJUkZpbHRlcgoreworICBHc3RBdWRpb0ZpbHRlciBhdWRpb2ZpbHRlcjsKKworICAvKiA8IHByaXZhdGUgPiAqLworICBHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlclByb2Nlc3NGdW5jIHByb2Nlc3M7CisKKyAgZ2RvdWJsZSAqYTsKKyAgZ3VpbnQgbmE7CisgIGdkb3VibGUgKmI7CisgIGd1aW50IG5iOworICBHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlckNoYW5uZWxDdHggKmNoYW5uZWxzOworICBndWludCBuY2hhbm5lbHM7CisKKyAgR011dGV4IGxvY2s7Cit9OworCitzdHJ1Y3QgX0dzdEF1ZGlvRlhCYXNlSUlSRmlsdGVyQ2xhc3MKK3sKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyBwYXJlbnQ7Cit9OworCitHVHlwZSBnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2dldF90eXBlICh2b2lkKTsKK3ZvaWQgZ3N0X2F1ZGlvX2Z4X2Jhc2VfaWlyX2ZpbHRlcl9zZXRfY29lZmZpY2llbnRzIChHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlciAqZmlsdGVyLCBnZG91YmxlICphLCBndWludCBuYSwgZ2RvdWJsZSAqYiwgZ3VpbnQgbmIpOworZ2RvdWJsZSBnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX2NhbGN1bGF0ZV9nYWluIChnZG91YmxlICphLCBndWludCBuYSwgZ2RvdWJsZSAqYiwgZ3VpbnQgbmIsIGdkb3VibGUgenIsIGdkb3VibGUgemkpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQVVESU9fRlhfQkFTRV9JSVJfRklMVEVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9paXJmaWx0ZXIuYyBiL2dzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0ZjIwYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmMKQEAgLTAsMCArMSwyODEgQEAKKy8qIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKiAKKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hdWRpb2lpcmZpbHRlcgorICoKKyAqIGF1ZGlvaWlyZmlsdGVyIGltcGxlbWVudHMgYSBnZW5lcmljIGF1ZGlvIDx1bGluayB1cmw9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSW5maW5pdGVfaW1wdWxzZV9yZXNwb25zZSI+SUlSIGZpbHRlcjwvdWxpbms+LiBCZWZvcmUgdXNhZ2UgdGhlCisgKiAiYSIgYW5kICJiIiBwcm9wZXJ0aWVzIGhhdmUgdG8gYmUgc2V0IHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIHRoYXQKKyAqIHNob3VsZCBiZSB1c2VkLgorICoKKyAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGRlc2NyaWJlIHRoZSBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIG9mIHRoZQorICogdHJhbnNmZXIgZnVuY3Rpb24uCisgKgorICogVG8gY2hhbmdlIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIHdoZW5ldmVyIHRoZSBzYW1wbGluZyByYXRlIGNoYW5nZXMgdGhlCisgKiAicmF0ZS1jaGFuZ2VkIiBzaWduYWwgY2FuIGJlIHVzZWQuIFRoaXMgc2hvdWxkIGJlIGRvbmUgZm9yIG1vc3QKKyAqIElJUiBmaWx0ZXJzIGFzIHRoZXkncmUgZGVwZW5kaW5nIG9uIHRoZSBzYW1wbGluZyByYXRlLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGFwcGxpY2F0aW9uPC90aXRsZT4KKyAqIDxpbmZvcm1hbGV4YW1wbGU+PHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJDIj4KKyAqIDx4aTppbmNsdWRlIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzL1hJbmNsdWRlIiBwYXJzZT0idGV4dCIgaHJlZj0iLi4vLi4vLi4vLi4vdGVzdHMvZXhhbXBsZXMvYXVkaW9meC9paXJmaWx0ZXItZXhhbXBsZS5jIiAvPgorICogPC9wcm9ncmFtbGlzdGluZz48L2luZm9ybWFsZXhhbXBsZT4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworLyogRklYTUUgMC4xMTogc3VwcHJlc3Mgd2FybmluZ3MgZm9yIGRlcHJlY2F0ZWQgQVBJIHN1Y2ggYXMgR1ZhbHVlQXJyYXkKKyAqIHdpdGggbmV3ZXIgR0xpYiB2ZXJzaW9ucyAoPj0gMi4zMS4wKSAqLworI2RlZmluZSBHTElCX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuaD4KKworI2luY2x1ZGUgImF1ZGlvaWlyZmlsdGVyLmgiCisKKyNpbmNsdWRlICJnc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oIgorCisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfYXVkaW9faWlyX2ZpbHRlcl9kZWJ1ZworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoR1NUX0NBVF9ERUZBVUxUKTsKKworZW51bQoreworICBTSUdOQUxfUkFURV9DSEFOR0VELAorICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQSwKKyAgUFJPUF9CCit9OworCitzdGF0aWMgZ3VpbnQgZ3N0X2F1ZGlvX2lpcl9maWx0ZXJfc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAsIH07CisKKyNkZWZpbmUgZ3N0X2F1ZGlvX2lpcl9maWx0ZXJfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0QXVkaW9JSVJGaWx0ZXIsIGdzdF9hdWRpb19paXJfZmlsdGVyLAorICAgIEdTVF9UWVBFX0FVRElPX0ZYX0JBU0VfSUlSX0ZJTFRFUik7CisKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19paXJfZmlsdGVyX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19paXJfZmlsdGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19paXJfZmlsdGVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hdWRpb19paXJfZmlsdGVyX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGJhc2UsCisgICAgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbyk7CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9faWlyX2ZpbHRlcl9jbGFzc19pbml0IChHc3RBdWRpb0lJUkZpbHRlckNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEF1ZGlvRmlsdGVyQ2xhc3MgKmZpbHRlcl9jbGFzcyA9IChHc3RBdWRpb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfYXVkaW9faWlyX2ZpbHRlcl9kZWJ1ZywgImF1ZGlvaWlyZmlsdGVyIiwgMCwKKyAgICAgICJHZW5lcmljIGF1ZGlvIElJUiBmaWx0ZXIgcGx1Z2luIik7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2F1ZGlvX2lpcl9maWx0ZXJfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9faWlyX2ZpbHRlcl9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2F1ZGlvX2lpcl9maWx0ZXJfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9BLAorICAgICAgZ19wYXJhbV9zcGVjX3ZhbHVlX2FycmF5ICgiYSIsICJBIiwKKyAgICAgICAgICAiRmlsdGVyIGNvZWZmaWNpZW50cyAoZGVub21pbmF0b3Igb2YgdHJhbnNmZXIgZnVuY3Rpb24pIiwKKyAgICAgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiQ29lZmZpY2llbnQiLCAiRmlsdGVyIENvZWZmaWNpZW50IiwKKyAgICAgICAgICAgICAgIkZpbHRlciBjb2VmZmljaWVudCIsIC1HX01BWERPVUJMRSwgR19NQVhET1VCTEUsIDAuMCwKKyAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CLAorICAgICAgZ19wYXJhbV9zcGVjX3ZhbHVlX2FycmF5ICgiYiIsICJCIiwKKyAgICAgICAgICAiRmlsdGVyIGNvZWZmaWNpZW50cyAobnVtZXJhdG9yIG9mIHRyYW5zZmVyIGZ1bmN0aW9uKSIsCisgICAgICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoIkNvZWZmaWNpZW50IiwgIkZpbHRlciBDb2VmZmljaWVudCIsCisgICAgICAgICAgICAgICJGaWx0ZXIgY29lZmZpY2llbnQiLCAtR19NQVhET1VCTEUsIEdfTUFYRE9VQkxFLCAwLjAsCisgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyksCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZmlsdGVyX2NsYXNzLT5zZXR1cCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9faWlyX2ZpbHRlcl9zZXR1cCk7CisKKyAgLyoqCisgICAqIEdzdEF1ZGlvSUlSRmlsdGVyOjpyYXRlLWNoYW5nZWQ6CisgICAqIEBmaWx0ZXI6IHRoZSBmaWx0ZXIgb24gd2hpY2ggdGhlIHNpZ25hbCBpcyBlbWl0dGVkCisgICAqIEByYXRlOiB0aGUgbmV3IHNhbXBsaW5nIHJhdGUKKyAgICoKKyAgICogV2lsbCBiZSBlbWl0dGVkIHdoZW4gdGhlIHNhbXBsaW5nIHJhdGUgY2hhbmdlcy4gVGhlIGNhbGxiYWNrcworICAgKiB3aWxsIGJlIGNhbGxlZCBmcm9tIHRoZSBzdHJlYW1pbmcgdGhyZWFkIGFuZCBwcm9jZXNzaW5nIHdpbGwKKyAgICogc3RvcCB1bnRpbCB0aGUgZXZlbnQgaXMgaGFuZGxlZC4KKyAgICovCisgIGdzdF9hdWRpb19paXJfZmlsdGVyX3NpZ25hbHNbU0lHTkFMX1JBVEVfQ0hBTkdFRF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgicmF0ZS1jaGFuZ2VkIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdEF1ZGlvSUlSRmlsdGVyQ2xhc3MsIHJhdGVfY2hhbmdlZCksCisgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX0lOVCk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJBdWRpbyBJSVIgZmlsdGVyIiwgIkZpbHRlci9FZmZlY3QvQXVkaW8iLAorICAgICAgIkdlbmVyaWMgYXVkaW8gSUlSIGZpbHRlciB3aXRoIGN1c3RvbSBmaWx0ZXIga2VybmVsIiwKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19paXJfZmlsdGVyX3VwZGF0ZV9jb2VmZmljaWVudHMgKEdzdEF1ZGlvSUlSRmlsdGVyICogc2VsZiwKKyAgICBHVmFsdWVBcnJheSAqIHZhLCBHVmFsdWVBcnJheSAqIHZiKQoreworICBnZG91YmxlICphID0gTlVMTCwgKmIgPSBOVUxMOworICBndWludCBpOworCisgIGlmICh2YSkgeworICAgIGlmIChzZWxmLT5hKQorICAgICAgZ192YWx1ZV9hcnJheV9mcmVlIChzZWxmLT5hKTsKKworICAgIHNlbGYtPmEgPSB2YTsKKyAgfQorICBpZiAodmIpIHsKKyAgICBpZiAoc2VsZi0+YikKKyAgICAgIGdfdmFsdWVfYXJyYXlfZnJlZSAoc2VsZi0+Yik7CisKKyAgICBzZWxmLT5iID0gdmI7CisgIH0KKworICBpZiAoc2VsZi0+YSAmJiBzZWxmLT5hLT5uX3ZhbHVlcyA+IDApIHsKKyAgICBhID0gZ19uZXcgKGdkb3VibGUsIHNlbGYtPmEtPm5fdmFsdWVzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5hLT5uX3ZhbHVlczsgaSsrKSB7CisgICAgICBHVmFsdWUgKnYgPSBnX3ZhbHVlX2FycmF5X2dldF9udGggKHNlbGYtPmEsIGkpOworICAgICAgYVtpXSA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodik7CisgICAgfQorICB9CisKKyAgaWYgKHNlbGYtPmIgJiYgc2VsZi0+Yi0+bl92YWx1ZXMgPiAwKSB7CisgICAgYiA9IGdfbmV3IChnZG91YmxlLCBzZWxmLT5iLT5uX3ZhbHVlcyk7CisgICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPmItPm5fdmFsdWVzOyBpKyspIHsKKyAgICAgIEdWYWx1ZSAqdiA9IGdfdmFsdWVfYXJyYXlfZ2V0X250aCAoc2VsZi0+YiwgaSk7CisgICAgICBiW2ldID0gZ192YWx1ZV9nZXRfZG91YmxlICh2KTsKKyAgICB9CisgIH0KKworICBnc3RfYXVkaW9fZnhfYmFzZV9paXJfZmlsdGVyX3NldF9jb2VmZmljaWVudHMgKEdTVF9BVURJT19GWF9CQVNFX0lJUl9GSUxURVIKKyAgICAgIChzZWxmKSwgYSwgKHNlbGYtPmEpID8gc2VsZi0+YS0+bl92YWx1ZXMgOiAwLCBiLAorICAgICAgKHNlbGYtPmIpID8gc2VsZi0+Yi0+bl92YWx1ZXMgOiAwKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19paXJfZmlsdGVyX2luaXQgKEdzdEF1ZGlvSUlSRmlsdGVyICogc2VsZikKK3sKKyAgR1ZhbHVlIHYgPSB7IDAsIH07CisgIEdWYWx1ZUFycmF5ICphOworCisgIGEgPSBnX3ZhbHVlX2FycmF5X25ldyAoMSk7CisKKyAgZ192YWx1ZV9pbml0ICgmdiwgR19UWVBFX0RPVUJMRSk7CisgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIDEuMCk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kIChhLCAmdik7CisgIGdfdmFsdWVfdW5zZXQgKCZ2KTsKKworICBnc3RfYXVkaW9faWlyX2ZpbHRlcl91cGRhdGVfY29lZmZpY2llbnRzIChzZWxmLCBhLCBnX3ZhbHVlX2FycmF5X2NvcHkgKGEpKTsKKworICBnX211dGV4X2luaXQgKCZzZWxmLT5sb2NrKTsKK30KKworLyogR3N0QXVkaW9GaWx0ZXIgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworLyogZ2V0IG5vdGlmaWVkIG9mIGNhcHMgYW5kIHBsdWcgaW4gdGhlIGNvcnJlY3QgcHJvY2VzcyBmdW5jdGlvbiAqLworc3RhdGljIGdib29sZWFuCitnc3RfYXVkaW9faWlyX2ZpbHRlcl9zZXR1cCAoR3N0QXVkaW9GaWx0ZXIgKiBiYXNlLCBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKQoreworICBHc3RBdWRpb0lJUkZpbHRlciAqc2VsZiA9IEdTVF9BVURJT19JSVJfRklMVEVSIChiYXNlKTsKKyAgZ2ludCBuZXdfcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKGluZm8pOworCisgIGlmIChHU1RfQVVESU9fRklMVEVSX1JBVEUgKHNlbGYpICE9IG5ld19yYXRlKSB7CisgICAgZ19zaWduYWxfZW1pdCAoR19PQkpFQ1QgKHNlbGYpLAorICAgICAgICBnc3RfYXVkaW9faWlyX2ZpbHRlcl9zaWduYWxzW1NJR05BTF9SQVRFX0NIQU5HRURdLCAwLCBuZXdfcmF0ZSk7CisgIH0KKworICByZXR1cm4gR1NUX0FVRElPX0ZJTFRFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2V0dXAgKGJhc2UsIGluZm8pOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2lpcl9maWx0ZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEF1ZGlvSUlSRmlsdGVyICpzZWxmID0gR1NUX0FVRElPX0lJUl9GSUxURVIgKG9iamVjdCk7CisKKyAgZ19tdXRleF9jbGVhciAoJnNlbGYtPmxvY2spOworCisgIGlmIChzZWxmLT5hKQorICAgIGdfdmFsdWVfYXJyYXlfZnJlZSAoc2VsZi0+YSk7CisgIHNlbGYtPmEgPSBOVUxMOworICBpZiAoc2VsZi0+YikKKyAgICBnX3ZhbHVlX2FycmF5X2ZyZWUgKHNlbGYtPmIpOworICBzZWxmLT5iID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9faWlyX2ZpbHRlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXVkaW9JSVJGaWx0ZXIgKnNlbGYgPSBHU1RfQVVESU9fSUlSX0ZJTFRFUiAob2JqZWN0KTsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfQVVESU9fSUlSX0ZJTFRFUiAoc2VsZikpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9BOgorICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBnc3RfYXVkaW9faWlyX2ZpbHRlcl91cGRhdGVfY29lZmZpY2llbnRzIChzZWxmLCBnX3ZhbHVlX2R1cF9ib3hlZCAodmFsdWUpLAorICAgICAgICAgIE5VTEwpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9COgorICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBnc3RfYXVkaW9faWlyX2ZpbHRlcl91cGRhdGVfY29lZmZpY2llbnRzIChzZWxmLCBOVUxMLAorICAgICAgICAgIGdfdmFsdWVfZHVwX2JveGVkICh2YWx1ZSkpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19paXJfZmlsdGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb0lJUkZpbHRlciAqc2VsZiA9IEdTVF9BVURJT19JSVJfRklMVEVSIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9BOgorICAgICAgZ192YWx1ZV9zZXRfYm94ZWQgKHZhbHVlLCBzZWxmLT5hKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9COgorICAgICAgZ192YWx1ZV9zZXRfYm94ZWQgKHZhbHVlLCBzZWxmLT5iKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb2Z4L2F1ZGlvaWlyZmlsdGVyLmggYi9nc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMzljNWIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2lpcmZpbHRlci5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKiAKKyAqLworCisjaWZuZGVmIF9fR1NUX0FVRElPX0lJUl9GSUxURVJfSF9fCisjZGVmaW5lIF9fR1NUX0FVRElPX0lJUl9GSUxURVJfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlICJhdWRpb2Z4YmFzZWlpcmZpbHRlci5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fSUlSX0ZJTFRFUiBcCisgIChnc3RfYXVkaW9faWlyX2ZpbHRlcl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVVESU9fSUlSX0ZJTFRFUihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0FVRElPX0lJUl9GSUxURVIsR3N0QXVkaW9JSVJGaWx0ZXIpKQorI2RlZmluZSBHU1RfQVVESU9fSUlSX0ZJTFRFUl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9BVURJT19JSVJfRklMVEVSLEdzdEF1ZGlvSUlSRmlsdGVyQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fSUlSX0ZJTFRFUihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0FVRElPX0lJUl9GSUxURVIpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fSUlSX0ZJTFRFUl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9BVURJT19JSVJfRklMVEVSKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1ZGlvSUlSRmlsdGVyIEdzdEF1ZGlvSUlSRmlsdGVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1ZGlvSUlSRmlsdGVyQ2xhc3MgR3N0QXVkaW9JSVJGaWx0ZXJDbGFzczsKKworLyoqCisgKiBHc3RBdWRpb0lJUkZpbHRlcjoKKyAqCisgKiBPcGFxdWUgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0QXVkaW9JSVJGaWx0ZXIgeworICBHc3RBdWRpb0ZYQmFzZUlJUkZpbHRlciBwYXJlbnQ7CisKKyAgR1ZhbHVlQXJyYXkgKmEsICpiOworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIEdNdXRleCBsb2NrOworfTsKKworc3RydWN0IF9Hc3RBdWRpb0lJUkZpbHRlckNsYXNzIHsKKyAgR3N0QXVkaW9GWEJhc2VJSVJGaWx0ZXJDbGFzcyBwYXJlbnQ7CisKKyAgdm9pZCAoKnJhdGVfY2hhbmdlZCkgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBnaW50IHJhdGUpOworfTsKKworR1R5cGUgZ3N0X2F1ZGlvX2lpcl9maWx0ZXJfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQVVESU9fSUlSX0ZJTFRFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0LmMgYi9nc3QvYXVkaW9meC9hdWRpb2ludmVydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OGRkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb2ludmVydC5jCkBAIC0wLDAgKzEsMjU2IEBACisvKiAKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXVkaW9pbnZlcnQKKyAqCisgKiBTd2FwcyB1cHBlciBhbmQgbG93ZXIgaGFsZiBvZiBhdWRpbyBzYW1wbGVzLiBNaXhpbmcgYW4gaW52ZXJ0ZWQgc2FtcGxlIG9uIHRvcCBvZgorICogdGhlIG9yaWdpbmFsIHdpdGggYSBzbGlnaHQgZGVsYXkgY2FuIHByb2R1Y2UgZWZmZWN0cyB0aGF0IHNvdW5kIGxpa2UgcmVzb25hbmNlLgorICogQ3JlYXRpbmcgYSBzdGVyZW8gc2FtcGxlIGZyb20gYSBtb25vIHNvdXJjZSwgd2l0aCBvbmUgY2hhbm5lbCBpbnZlcnRlZCBwcm9kdWNlcyB3aWRlLXN0ZXJlbyBzb3VuZHMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyB3YXZlPXNhdyAhIGF1ZGlvaW52ZXJ0IGRlZ3JlZT0wLjQgISBhbHNhc2luaworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj0ibWVsbzEub2dnIiAhIG9nZ2RlbXV4ICEgdm9yYmlzZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9pbnZlcnQgZGVncmVlPTAuNCAhIGFsc2FzaW5rCisgKiBnc3QtbGF1bmNoLTEuMCBhdWRpb3Rlc3RzcmMgd2F2ZT1zYXcgISBhdWRpb2NvbnZlcnQgISBhdWRpb2ludmVydCBkZWdyZWU9MC40ICEgYXVkaW9jb252ZXJ0ICEgYWxzYXNpbmsKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlICJhdWRpb2ludmVydC5oIgorCisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfYXVkaW9faW52ZXJ0X2RlYnVnCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChHU1RfQ0FUX0RFRkFVTFQpOworCisvKiBGaWx0ZXIgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9ERUdSRUUKK307CisKKyNkZWZpbmUgQUxMT1dFRF9DQVBTIFwKKyAgICAiYXVkaW8veC1yYXcsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICIgZm9ybWF0PShzdHJpbmcpIHsiR1NUX0FVRElPX05FKFMxNikiLCJHU1RfQVVESU9fTkUoRjMyKSJ9LCIgICAgICBcCisgICAgIiByYXRlPShpbnQpWzEsTUFYXSwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIGNoYW5uZWxzPShpbnQpWzEsTUFYXSwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICIgbGF5b3V0PShzdHJpbmcpIHtpbnRlcmxlYXZlZCwgbm9uLWludGVybGVhdmVkfSIKKworR19ERUZJTkVfVFlQRSAoR3N0QXVkaW9JbnZlcnQsIGdzdF9hdWRpb19pbnZlcnQsIEdTVF9UWVBFX0FVRElPX0ZJTFRFUik7CisKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19pbnZlcnRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2ludmVydF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9faW52ZXJ0X3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGZpbHRlciwKKyAgICBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hdWRpb19pbnZlcnRfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwKKyAgICBHc3RCdWZmZXIgKiBidWYpOworCitzdGF0aWMgdm9pZCBnc3RfYXVkaW9faW52ZXJ0X3RyYW5zZm9ybV9pbnQgKEdzdEF1ZGlvSW52ZXJ0ICogZmlsdGVyLAorICAgIGdpbnQxNiAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19pbnZlcnRfdHJhbnNmb3JtX2Zsb2F0IChHc3RBdWRpb0ludmVydCAqIGZpbHRlciwKKyAgICBnZmxvYXQgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcyk7CisKKy8qIEdPYmplY3Qgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19pbnZlcnRfY2xhc3NfaW5pdCAoR3N0QXVkaW9JbnZlcnRDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X2F1ZGlvX2ludmVydF9kZWJ1ZywgImF1ZGlvaW52ZXJ0IiwgMCwKKyAgICAgICJhdWRpb2ludmVydCBlbGVtZW50Iik7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb19pbnZlcnRfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9faW52ZXJ0X2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RFR1JFRSwKKyAgICAgIGdfcGFyYW1fc3BlY19mbG9hdCAoImRlZ3JlZSIsICJEZWdyZWUiLAorICAgICAgICAgICJEZWdyZWUgb2YgaW52ZXJzaW9uIiwgMC4wLCAxLjAsCisgICAgICAgICAgMC4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiQXVkaW8gaW52ZXJzaW9uIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L0F1ZGlvIiwKKyAgICAgICJTd2FwcyB1cHBlciBhbmQgbG93ZXIgaGFsZiBvZiBhdWRpbyBzYW1wbGVzIiwKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+Iik7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBTExPV0VEX0NBUFMpOworICBnc3RfYXVkaW9fZmlsdGVyX2NsYXNzX2FkZF9wYWRfdGVtcGxhdGVzIChHU1RfQVVESU9fRklMVEVSX0NMQVNTIChrbGFzcyksCisgICAgICBjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAoa2xhc3MpLT50cmFuc2Zvcm1faXAgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdWRpb19pbnZlcnRfdHJhbnNmb3JtX2lwKTsKKyAgR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyktPnRyYW5zZm9ybV9pcF9vbl9wYXNzdGhyb3VnaCA9IEZBTFNFOworCisgIEdTVF9BVURJT19GSUxURVJfQ0xBU1MgKGtsYXNzKS0+c2V0dXAgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdWRpb19pbnZlcnRfc2V0dXApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2ludmVydF9pbml0IChHc3RBdWRpb0ludmVydCAqIGZpbHRlcikKK3sKKyAgZmlsdGVyLT5kZWdyZWUgPSAwLjA7CisgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfaW5fcGxhY2UgKEdTVF9CQVNFX1RSQU5TRk9STSAoZmlsdGVyKSwgVFJVRSk7CisgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfZ2FwX2F3YXJlIChHU1RfQkFTRV9UUkFOU0ZPUk0gKGZpbHRlciksIFRSVUUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2ludmVydF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXVkaW9JbnZlcnQgKmZpbHRlciA9IEdTVF9BVURJT19JTlZFUlQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFR1JFRToKKyAgICAgIGZpbHRlci0+ZGVncmVlID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfcGFzc3Rocm91Z2ggKEdTVF9CQVNFX1RSQU5TRk9STSAoZmlsdGVyKSwKKyAgICAgICAgICBmaWx0ZXItPmRlZ3JlZSA9PSAwLjApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2ludmVydF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXVkaW9JbnZlcnQgKmZpbHRlciA9IEdTVF9BVURJT19JTlZFUlQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFR1JFRToKKyAgICAgIGdfdmFsdWVfc2V0X2Zsb2F0ICh2YWx1ZSwgZmlsdGVyLT5kZWdyZWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBHc3RBdWRpb0ZpbHRlciB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdWRpb19pbnZlcnRfc2V0dXAgKEdzdEF1ZGlvRmlsdGVyICogYmFzZSwgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgR3N0QXVkaW9JbnZlcnQgKmZpbHRlciA9IEdTVF9BVURJT19JTlZFUlQgKGJhc2UpOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIHN3aXRjaCAoR1NUX0FVRElPX0lORk9fRk9STUFUIChpbmZvKSkgeworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMTY6CisgICAgICBmaWx0ZXItPnByb2Nlc3MgPSAoR3N0QXVkaW9JbnZlcnRQcm9jZXNzRnVuYykKKyAgICAgICAgICBnc3RfYXVkaW9faW52ZXJ0X3RyYW5zZm9ybV9pbnQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfRjMyOgorICAgICAgZmlsdGVyLT5wcm9jZXNzID0gKEdzdEF1ZGlvSW52ZXJ0UHJvY2Vzc0Z1bmMpCisgICAgICAgICAgZ3N0X2F1ZGlvX2ludmVydF90cmFuc2Zvcm1fZmxvYXQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2ludmVydF90cmFuc2Zvcm1faW50IChHc3RBdWRpb0ludmVydCAqIGZpbHRlciwKKyAgICBnaW50MTYgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykKK3sKKyAgZ2ludCBpOworICBnZmxvYXQgZHJ5ID0gMS4wIC0gZmlsdGVyLT5kZWdyZWU7CisgIGdsb25nIHZhbDsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NhbXBsZXM7IGkrKykgeworICAgIHZhbCA9ICgqZGF0YSkgKiBkcnkgKyAoLTEgLSAoKmRhdGEpKSAqIGZpbHRlci0+ZGVncmVlOworICAgICpkYXRhKysgPSAoZ2ludDE2KSBDTEFNUCAodmFsLCBHX01JTklOVDE2LCBHX01BWElOVDE2KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2ludmVydF90cmFuc2Zvcm1fZmxvYXQgKEdzdEF1ZGlvSW52ZXJ0ICogZmlsdGVyLAorICAgIGdmbG9hdCAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKQoreworICBnaW50IGk7CisgIGdmbG9hdCBkcnkgPSAxLjAgLSBmaWx0ZXItPmRlZ3JlZTsKKyAgZ2xvbmcgdmFsOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fc2FtcGxlczsgaSsrKSB7CisgICAgdmFsID0gKCpkYXRhKSAqIGRyeSAtICgqZGF0YSkgKiBmaWx0ZXItPmRlZ3JlZTsKKyAgICAqZGF0YSsrID0gdmFsOworICB9Cit9CisKKy8qIEdzdEJhc2VUcmFuc2Zvcm0gdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYXVkaW9faW52ZXJ0X3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0QXVkaW9JbnZlcnQgKmZpbHRlciA9IEdTVF9BVURJT19JTlZFUlQgKGJhc2UpOworICBndWludCBudW1fc2FtcGxlczsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwgc3RyZWFtX3RpbWU7CisgIEdzdE1hcEluZm8gbWFwOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpOworICBzdHJlYW1fdGltZSA9CisgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJmJhc2UtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJzeW5jIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKGZpbHRlciksIHN0cmVhbV90aW1lKTsKKworICBpZiAoR19VTkxJS0VMWSAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfR0FQKSkpCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgbnVtX3NhbXBsZXMgPSBtYXAuc2l6ZSAvIEdTVF9BVURJT19GSUxURVJfQlBTIChmaWx0ZXIpOworCisgIGZpbHRlci0+cHJvY2VzcyAoZmlsdGVyLCBtYXAuZGF0YSwgbnVtX3NhbXBsZXMpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9pbnZlcnQuaCBiL2dzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JiNWIzZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlvaW52ZXJ0LmgKQEAgLTAsMCArMSw2MCBAQAorLyogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQVVESU9fSU5WRVJUX0hfXworI2RlZmluZSBfX0dTVF9BVURJT19JTlZFUlRfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2ZpbHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX0FVRElPX0lOVkVSVCAgICAgICAgICAgIChnc3RfYXVkaW9faW52ZXJ0X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9BVURJT19JTlZFUlQob2JqKSAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9BVURJT19JTlZFUlQsR3N0QXVkaW9JbnZlcnQpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fSU5WRVJUKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVVESU9fSU5WRVJUKSkKKyNkZWZpbmUgR1NUX0FVRElPX0lOVkVSVF9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcykgLEdTVF9UWVBFX0FVRElPX0lOVkVSVCxHc3RBdWRpb0ludmVydENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FVRElPX0lOVkVSVF9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcykgLEdTVF9UWVBFX0FVRElPX0lOVkVSVCkpCisjZGVmaW5lIEdTVF9BVURJT19JTlZFUlRfR0VUX0NMQVNTKG9iaikgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTKChvYmopICxHU1RfVFlQRV9BVURJT19JTlZFUlQsR3N0QXVkaW9JbnZlcnRDbGFzcykpCit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9JbnZlcnQgR3N0QXVkaW9JbnZlcnQ7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9JbnZlcnRDbGFzcyBHc3RBdWRpb0ludmVydENsYXNzOworCit0eXBlZGVmIHZvaWQgKCpHc3RBdWRpb0ludmVydFByb2Nlc3NGdW5jKSAoR3N0QXVkaW9JbnZlcnQgKiwgZ3VpbnQ4ICosIGd1aW50KTsKKworc3RydWN0IF9Hc3RBdWRpb0ludmVydAoreworICBHc3RBdWRpb0ZpbHRlciBhdWRpb2ZpbHRlcjsKKworICBnZmxvYXQgZGVncmVlOworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIEdzdEF1ZGlvSW52ZXJ0UHJvY2Vzc0Z1bmMgcHJvY2VzczsKK307CisKK3N0cnVjdCBfR3N0QXVkaW9JbnZlcnRDbGFzcworeworICBHc3RBdWRpb0ZpbHRlckNsYXNzIHBhcmVudDsKK307CisKK0dUeXBlIGdzdF9hdWRpb19pbnZlcnRfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX0FVRElPX0lOVkVSVF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jIGIvZ3N0L2F1ZGlvZngvYXVkaW9rYXJhb2tlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2OTdjYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlva2FyYW9rZS5jCkBAIC0wLDAgKzEsMzYzIEBACisvKiAKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA4IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXVkaW9rYXJhb2tlCisgKgorICogUmVtb3ZlIHRoZSB2b2ljZSBmcm9tIGF1ZGlvIGJ5IGZpbHRlcmluZyB0aGUgY2VudGVyIGNoYW5uZWwuCisgKiBUaGlzIHBsdWdpbiBpcyB1c2VmdWwgZm9yIGthcmFva2UgYXBwbGljYXRpb25zLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXNvbmcub2dnICEgb2dnZGVtdXggISB2b3JiaXNkZWMgISBhdWRpb2thcmFva2UgISBhdWRpb2NvbnZlcnQgISBhbHNhc2luaworICogXXwKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9maWx0ZXIuaD4KKworI2luY2x1ZGUgImF1ZGlva2FyYW9rZS5oIgorCisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfYXVkaW9fa2FyYW9rZV9kZWJ1ZworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoR1NUX0NBVF9ERUZBVUxUKTsKKworLyogRmlsdGVyIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworI2RlZmluZSBERUZBVUxUX0xFVkVMCQkxLjAKKyNkZWZpbmUgREVGQVVMVF9NT05PX0xFVkVMCTEuMAorI2RlZmluZSBERUZBVUxUX0ZJTFRFUl9CQU5ECTIyMC4wCisjZGVmaW5lIERFRkFVTFRfRklMVEVSX1dJRFRICTEwMC4wCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0xFVkVMLAorICBQUk9QX01PTk9fTEVWRUwsCisgIFBST1BfRklMVEVSX0JBTkQsCisgIFBST1BfRklMVEVSX1dJRFRICit9OworCisjZGVmaW5lIEFMTE9XRURfQ0FQUyBcCisgICAgImF1ZGlvL3gtcmF3LCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBmb3JtYXQ9KHN0cmluZyl7IkdTVF9BVURJT19ORShTMTYpIiwiR1NUX0FVRElPX05FKEYzMikifSwiICBcCisgICAgIiByYXRlPShpbnQpWzEsTUFYXSwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBjaGFubmVscz0oaW50KTIsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBjaGFubmVsLW1hc2s9KGJpdG1hc2spMHgzLCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBsYXlvdXQ9KHN0cmluZykgaW50ZXJsZWF2ZWQiCisKK0dfREVGSU5FX1RZUEUgKEdzdEF1ZGlvS2FyYW9rZSwgZ3N0X2F1ZGlvX2thcmFva2UsIEdTVF9UWVBFX0FVRElPX0ZJTFRFUik7CisKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19rYXJhb2tlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19rYXJhb2tlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hdWRpb19rYXJhb2tlX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGZpbHRlciwKKyAgICBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hdWRpb19rYXJhb2tlX3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UsCisgICAgR3N0QnVmZmVyICogYnVmKTsKKworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX2thcmFva2VfdHJhbnNmb3JtX2ludCAoR3N0QXVkaW9LYXJhb2tlICogZmlsdGVyLAorICAgIGdpbnQxNiAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19rYXJhb2tlX3RyYW5zZm9ybV9mbG9hdCAoR3N0QXVkaW9LYXJhb2tlICogZmlsdGVyLAorICAgIGdmbG9hdCAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKTsKKworLyogR09iamVjdCB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2thcmFva2VfY2xhc3NfaW5pdCAoR3N0QXVkaW9LYXJhb2tlQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9hdWRpb19rYXJhb2tlX2RlYnVnLCAiYXVkaW9rYXJhb2tlIiwgMCwKKyAgICAgICJhdWRpb2thcmFva2UgZWxlbWVudCIpOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9fa2FyYW9rZV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb19rYXJhb2tlX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0xFVkVMLAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgibGV2ZWwiLCAiTGV2ZWwiLAorICAgICAgICAgICJMZXZlbCBvZiB0aGUgZWZmZWN0ICgxLjAgPSBmdWxsKSIsIDAuMCwgMS4wLCBERUZBVUxUX0xFVkVMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01PTk9fTEVWRUwsCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJtb25vLWxldmVsIiwgIk1vbm8gTGV2ZWwiLAorICAgICAgICAgICJMZXZlbCBvZiB0aGUgbW9ubyBjaGFubmVsICgxLjAgPSBmdWxsKSIsIDAuMCwgMS4wLCBERUZBVUxUX0xFVkVMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0ZJTFRFUl9CQU5ELAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgiZmlsdGVyLWJhbmQiLCAiRmlsdGVyIEJhbmQiLAorICAgICAgICAgICJUaGUgRnJlcXVlbmN5IGJhbmQgb2YgdGhlIGZpbHRlciIsIDAuMCwgNDQxLjAsIERFRkFVTFRfRklMVEVSX0JBTkQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRklMVEVSX1dJRFRILAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgiZmlsdGVyLXdpZHRoIiwgIkZpbHRlciBXaWR0aCIsCisgICAgICAgICAgIlRoZSBGcmVxdWVuY3kgd2lkdGggb2YgdGhlIGZpbHRlciIsIDAuMCwgMTAwLjAsIERFRkFVTFRfRklMVEVSX1dJRFRILAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiQXVkaW9LYXJhb2tlIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L0F1ZGlvIiwKKyAgICAgICJSZW1vdmVzIHZvaWNlIGZyb20gc291bmQiLCAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFMTE9XRURfQ0FQUyk7CisgIGdzdF9hdWRpb19maWx0ZXJfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZXMgKEdTVF9BVURJT19GSUxURVJfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyktPnRyYW5zZm9ybV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX2thcmFva2VfdHJhbnNmb3JtX2lwKTsKKyAgR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyktPnRyYW5zZm9ybV9pcF9vbl9wYXNzdGhyb3VnaCA9IEZBTFNFOworCisgIEdTVF9BVURJT19GSUxURVJfQ0xBU1MgKGtsYXNzKS0+c2V0dXAgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdWRpb19rYXJhb2tlX3NldHVwKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19rYXJhb2tlX2luaXQgKEdzdEF1ZGlvS2FyYW9rZSAqIGZpbHRlcikKK3sKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9pbl9wbGFjZSAoR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpLCBUUlVFKTsKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9nYXBfYXdhcmUgKEdTVF9CQVNFX1RSQU5TRk9STSAoZmlsdGVyKSwgVFJVRSk7CisKKyAgZmlsdGVyLT5sZXZlbCA9IERFRkFVTFRfTEVWRUw7CisgIGZpbHRlci0+bW9ub19sZXZlbCA9IERFRkFVTFRfTU9OT19MRVZFTDsKKyAgZmlsdGVyLT5maWx0ZXJfYmFuZCA9IERFRkFVTFRfRklMVEVSX0JBTkQ7CisgIGZpbHRlci0+ZmlsdGVyX3dpZHRoID0gREVGQVVMVF9GSUxURVJfV0lEVEg7Cit9CisKK3N0YXRpYyB2b2lkCit1cGRhdGVfZmlsdGVyIChHc3RBdWRpb0thcmFva2UgKiBmaWx0ZXIsIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIGdmbG9hdCBBLCBCLCBDOworICBnaW50IHJhdGU7CisKKyAgaWYgKGluZm8pIHsKKyAgICByYXRlID0gR1NUX0FVRElPX0lORk9fUkFURSAoaW5mbyk7CisgIH0gZWxzZSB7CisgICAgcmF0ZSA9IEdTVF9BVURJT19GSUxURVJfUkFURSAoZmlsdGVyKTsKKyAgfQorCisgIGlmIChyYXRlID09IDApCisgICAgcmV0dXJuOworCisgIEMgPSBleHAgKC0yICogR19QSSAqIGZpbHRlci0+ZmlsdGVyX3dpZHRoIC8gcmF0ZSk7CisgIEIgPSAtNCAqIEMgLyAoMSArIEMpICogY29zICgyICogR19QSSAqIGZpbHRlci0+ZmlsdGVyX2JhbmQgLyByYXRlKTsKKyAgQSA9IHNxcnQgKDEgLSBCICogQiAvICg0ICogQykpICogKDEgLSBDKTsKKworICBmaWx0ZXItPkEgPSBBOworICBmaWx0ZXItPkIgPSBCOworICBmaWx0ZXItPkMgPSBDOworICBmaWx0ZXItPnkxID0gMC4wOworICBmaWx0ZXItPnkyID0gMC4wOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX2thcmFva2Vfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEF1ZGlvS2FyYW9rZSAqZmlsdGVyOworCisgIGZpbHRlciA9IEdTVF9BVURJT19LQVJBT0tFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MRVZFTDoKKyAgICAgIGZpbHRlci0+bGV2ZWwgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01PTk9fTEVWRUw6CisgICAgICBmaWx0ZXItPm1vbm9fbGV2ZWwgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZJTFRFUl9CQU5EOgorICAgICAgZmlsdGVyLT5maWx0ZXJfYmFuZCA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisgICAgICB1cGRhdGVfZmlsdGVyIChmaWx0ZXIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZJTFRFUl9XSURUSDoKKyAgICAgIGZpbHRlci0+ZmlsdGVyX3dpZHRoID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIHVwZGF0ZV9maWx0ZXIgKGZpbHRlciwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fa2FyYW9rZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXVkaW9LYXJhb2tlICpmaWx0ZXI7CisKKyAgZmlsdGVyID0gR1NUX0FVRElPX0tBUkFPS0UgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xFVkVMOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBmaWx0ZXItPmxldmVsKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NT05PX0xFVkVMOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBmaWx0ZXItPm1vbm9fbGV2ZWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZJTFRFUl9CQU5EOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBmaWx0ZXItPmZpbHRlcl9iYW5kKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GSUxURVJfV0lEVEg6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIGZpbHRlci0+ZmlsdGVyX3dpZHRoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogR3N0QXVkaW9GaWx0ZXIgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworc3RhdGljIGdib29sZWFuCitnc3RfYXVkaW9fa2FyYW9rZV9zZXR1cCAoR3N0QXVkaW9GaWx0ZXIgKiBiYXNlLCBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKQoreworICBHc3RBdWRpb0thcmFva2UgKmZpbHRlciA9IEdTVF9BVURJT19LQVJBT0tFIChiYXNlKTsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICBzd2l0Y2ggKEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoaW5mbykpIHsKKyAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzE2OgorICAgICAgZmlsdGVyLT5wcm9jZXNzID0gKEdzdEF1ZGlvS2FyYW9rZVByb2Nlc3NGdW5jKQorICAgICAgICAgIGdzdF9hdWRpb19rYXJhb2tlX3RyYW5zZm9ybV9pbnQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfRjMyOgorICAgICAgZmlsdGVyLT5wcm9jZXNzID0gKEdzdEF1ZGlvS2FyYW9rZVByb2Nlc3NGdW5jKQorICAgICAgICAgIGdzdF9hdWRpb19rYXJhb2tlX3RyYW5zZm9ybV9mbG9hdDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisgIHVwZGF0ZV9maWx0ZXIgKGZpbHRlciwgaW5mbyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19rYXJhb2tlX3RyYW5zZm9ybV9pbnQgKEdzdEF1ZGlvS2FyYW9rZSAqIGZpbHRlciwKKyAgICBnaW50MTYgKiBkYXRhLCBndWludCBudW1fc2FtcGxlcykKK3sKKyAgZ2ludCBpLCBsLCByLCBvLCB4OworICBnaW50IGNoYW5uZWxzOworICBnZG91YmxlIHk7CisgIGdpbnQgbGV2ZWw7CisKKyAgY2hhbm5lbHMgPSBHU1RfQVVESU9fRklMVEVSX0NIQU5ORUxTIChmaWx0ZXIpOworICBsZXZlbCA9IGZpbHRlci0+bGV2ZWwgKiAyNTY7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9zYW1wbGVzOyBpICs9IGNoYW5uZWxzKSB7CisgICAgLyogZ2V0IGxlZnQgYW5kIHJpZ2h0IGlucHV0cyAqLworICAgIGwgPSBkYXRhW2ldOworICAgIHIgPSBkYXRhW2kgKyAxXTsKKyAgICAvKiBkbyBmaWx0ZXJpbmcgKi8KKyAgICB4ID0gKGwgKyByKSAvIDI7CisgICAgeSA9IChmaWx0ZXItPkEgKiB4IC0gZmlsdGVyLT5CICogZmlsdGVyLT55MSkgLSBmaWx0ZXItPkMgKiBmaWx0ZXItPnkyOworICAgIGZpbHRlci0+eTIgPSBmaWx0ZXItPnkxOworICAgIGZpbHRlci0+eTEgPSB5OworICAgIC8qIGZpbHRlciBtb25vIHNpZ25hbCAqLworICAgIG8gPSAoaW50KSAoeSAqIGZpbHRlci0+bW9ub19sZXZlbCk7CisgICAgbyA9IENMQU1QIChvLCBHX01JTklOVDE2LCBHX01BWElOVDE2KTsKKyAgICBvID0gKG8gKiBsZXZlbCkgPj4gODsKKyAgICAvKiBub3cgY3V0IHRoZSBjZW50ZXIgKi8KKyAgICB4ID0gbCAtICgociAqIGxldmVsKSA+PiA4KSArIG87CisgICAgciA9IHIgLSAoKGwgKiBsZXZlbCkgPj4gOCkgKyBvOworICAgIGRhdGFbaV0gPSBDTEFNUCAoeCwgR19NSU5JTlQxNiwgR19NQVhJTlQxNik7CisgICAgZGF0YVtpICsgMV0gPSBDTEFNUCAociwgR19NSU5JTlQxNiwgR19NQVhJTlQxNik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19rYXJhb2tlX3RyYW5zZm9ybV9mbG9hdCAoR3N0QXVkaW9LYXJhb2tlICogZmlsdGVyLAorICAgIGdmbG9hdCAqIGRhdGEsIGd1aW50IG51bV9zYW1wbGVzKQoreworICBnaW50IGk7CisgIGdpbnQgY2hhbm5lbHM7CisgIGdkb3VibGUgbCwgciwgbzsKKyAgZ2RvdWJsZSB5OworCisgIGNoYW5uZWxzID0gR1NUX0FVRElPX0ZJTFRFUl9DSEFOTkVMUyAoZmlsdGVyKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NhbXBsZXM7IGkgKz0gY2hhbm5lbHMpIHsKKyAgICAvKiBnZXQgbGVmdCBhbmQgcmlnaHQgaW5wdXRzICovCisgICAgbCA9IGRhdGFbaV07CisgICAgciA9IGRhdGFbaSArIDFdOworICAgIC8qIGRvIGZpbHRlcmluZyAqLworICAgIHkgPSAoZmlsdGVyLT5BICogKChsICsgcikgLyAyLjApIC0gZmlsdGVyLT5CICogZmlsdGVyLT55MSkgLQorICAgICAgICBmaWx0ZXItPkMgKiBmaWx0ZXItPnkyOworICAgIGZpbHRlci0+eTIgPSBmaWx0ZXItPnkxOworICAgIGZpbHRlci0+eTEgPSB5OworICAgIC8qIGZpbHRlciBtb25vIHNpZ25hbCAqLworICAgIG8gPSB5ICogZmlsdGVyLT5tb25vX2xldmVsICogZmlsdGVyLT5sZXZlbDsKKyAgICAvKiBub3cgY3V0IHRoZSBjZW50ZXIgKi8KKyAgICBkYXRhW2ldID0gbCAtIChyICogZmlsdGVyLT5sZXZlbCkgKyBvOworICAgIGRhdGFbaSArIDFdID0gciAtIChsICogZmlsdGVyLT5sZXZlbCkgKyBvOworICB9Cit9CisKKy8qIEdzdEJhc2VUcmFuc2Zvcm0gdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYXVkaW9fa2FyYW9rZV90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdEF1ZGlvS2FyYW9rZSAqZmlsdGVyID0gR1NUX0FVRElPX0tBUkFPS0UgKGJhc2UpOworICBndWludCBudW1fc2FtcGxlczsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwgc3RyZWFtX3RpbWU7CisgIEdzdE1hcEluZm8gbWFwOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpOworICBzdHJlYW1fdGltZSA9CisgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJmJhc2UtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJzeW5jIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKGZpbHRlciksIHN0cmVhbV90aW1lKTsKKworICBpZiAoR19VTkxJS0VMWSAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfR0FQKSkpCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgbnVtX3NhbXBsZXMgPSBtYXAuc2l6ZSAvIEdTVF9BVURJT19GSUxURVJfQlBTIChmaWx0ZXIpOworCisgIGZpbHRlci0+cHJvY2VzcyAoZmlsdGVyLCBtYXAuZGF0YSwgbnVtX3NhbXBsZXMpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9rYXJhb2tlLmggYi9nc3QvYXVkaW9meC9hdWRpb2thcmFva2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzkxZWZjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvYXVkaW9rYXJhb2tlLmgKQEAgLTAsMCArMSw2NyBAQAorLyogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQVVESU9fS0FSQU9LRV9IX18KKyNkZWZpbmUgX19HU1RfQVVESU9fS0FSQU9LRV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fS0FSQU9LRSAgICAgICAgICAgIChnc3RfYXVkaW9fa2FyYW9rZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVVESU9fS0FSQU9LRShvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0FVRElPX0tBUkFPS0UsR3N0QXVkaW9LYXJhb2tlKSkKKyNkZWZpbmUgR1NUX0lTX0FVRElPX0tBUkFPS0Uob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9BVURJT19LQVJBT0tFKSkKKyNkZWZpbmUgR1NUX0FVRElPX0tBUkFPS0VfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpICxHU1RfVFlQRV9BVURJT19LQVJBT0tFLEdzdEF1ZGlvS2FyYW9rZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FVRElPX0tBUkFPS0VfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpICxHU1RfVFlQRV9BVURJT19LQVJBT0tFKSkKKyNkZWZpbmUgR1NUX0FVRElPX0tBUkFPS0VfR0VUX0NMQVNTKG9iaikgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTKChvYmopICxHU1RfVFlQRV9BVURJT19LQVJBT0tFLEdzdEF1ZGlvS2FyYW9rZUNsYXNzKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdWRpb0thcmFva2UgR3N0QXVkaW9LYXJhb2tlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1ZGlvS2FyYW9rZUNsYXNzIEdzdEF1ZGlvS2FyYW9rZUNsYXNzOworCit0eXBlZGVmIHZvaWQgKCpHc3RBdWRpb0thcmFva2VQcm9jZXNzRnVuYykgKEdzdEF1ZGlvS2FyYW9rZSAqLCBndWludDggKiwgZ3VpbnQpOworCitzdHJ1Y3QgX0dzdEF1ZGlvS2FyYW9rZQoreworICBHc3RBdWRpb0ZpbHRlciBhdWRpb2ZpbHRlcjsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIGdmbG9hdCBsZXZlbDsKKyAgZ2Zsb2F0IG1vbm9fbGV2ZWw7CisgIGdmbG9hdCBmaWx0ZXJfYmFuZDsKKyAgZ2Zsb2F0IGZpbHRlcl93aWR0aDsKKworICAvKiBmaWx0ZXIgY29lZiAqLworICBnZmxvYXQgQSwgQiwgQzsKKyAgZ2Zsb2F0IHkxLCB5MjsKKworICAvKiA8IHByaXZhdGUgPiAqLworICBHc3RBdWRpb0thcmFva2VQcm9jZXNzRnVuYyBwcm9jZXNzOworfTsKKworc3RydWN0IF9Hc3RBdWRpb0thcmFva2VDbGFzcworeworICBHc3RBdWRpb0ZpbHRlckNsYXNzIHBhcmVudDsKK307CisKK0dUeXBlIGdzdF9hdWRpb19rYXJhb2tlX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9BVURJT19LQVJBT0tFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jIGIvZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MDE0NjQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmMKQEAgLTAsMCArMSw1MzMgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWF1ZGlvcGFub3JhbWEKKyAqCisgKiBTdGVyZW8gcGFub3JhbWEgZWZmZWN0IHdpdGggY29udHJvbGxhYmxlIHBhbiBwb3NpdGlvbi4gT25lIGNhbiBjaG9vc2UgYmV0d2VlbiB0aGUgZGVmYXVsdCBwc3ljaG9hY291c3RpYyBwYW5uaW5nIG1ldGhvZCwKKyAqIHdoaWNoIGtlZXBzIHRoZSBzYW1lIHBlcmNlaXZlZCBsb3VkbmVzcywgYW5kIGEgc2ltcGxlIHBhbm5pbmcgbWV0aG9kIHRoYXQganVzdCBjb250cm9scyB0aGUgdm9sdW1lIG9uIG9uZSBjaGFubmVsLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBhdWRpb3Rlc3RzcmMgd2F2ZT1zYXcgISBhdWRpb3Bhbm9yYW1hIHBhbm9yYW1hPS0xLjAwICEgYWxzYXNpbmsKKyAqIGdzdC1sYXVuY2gtMS4wIGZpbGVzcmMgbG9jYXRpb249Im1lbG8xLm9nZyIgISBvZ2dkZW11eCAhIHZvcmJpc2RlYyAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcGFub3JhbWEgcGFub3JhbWE9LTEuMDAgISBhbHNhc2luaworICogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjIHdhdmU9c2F3ICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9wYW5vcmFtYSBwYW5vcmFtYT0tMS4wMCAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBnc3QtbGF1bmNoLTEuMCBhdWRpb3Rlc3RzcmMgd2F2ZT1zYXcgISBhdWRpb2NvbnZlcnQgISBhdWRpb3Bhbm9yYW1hIG1ldGhvZD1zaW1wbGUgcGFub3JhbWE9LTAuNTAgISBhdWRpb2NvbnZlcnQgISBhbHNhc2luaworICogXXwKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorCisjaWZkZWYgSEFWRV9PUkMKKyNpbmNsdWRlIDxvcmMvb3JjZnVuY3Rpb25zLmg+CisjZWxzZQorI2RlZmluZSBvcmNfbWVtc2V0IG1lbXNldAorI2VuZGlmCisKKyNpbmNsdWRlICJhdWRpb3Bhbm9yYW1hLmgiCisjaW5jbHVkZSAiYXVkaW9wYW5vcmFtYW9yYy5oIgorCisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfYXVkaW9fcGFub3JhbWFfZGVidWcKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKEdTVF9DQVRfREVGQVVMVCk7CisKKy8qIEZpbHRlciBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9QQU5PUkFNQSwKKyAgUFJPUF9NRVRIT0QKK307CisKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fUEFOT1JBTUFfTUVUSE9EIChnc3RfYXVkaW9fcGFub3JhbWFfbWV0aG9kX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfYXVkaW9fcGFub3JhbWFfbWV0aG9kX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZ3R5cGUgPSAwOworCisgIGlmIChndHlwZSA9PSAwKSB7CisgICAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAgICB7TUVUSE9EX1BTWUNIT0FDT1VTVElDLCAiUHN5Y2hvYWNvdXN0aWMgUGFubmluZyAoZGVmYXVsdCkiLAorICAgICAgICAgICJwc3ljaG9hY291c3RpYyJ9LAorICAgICAge01FVEhPRF9TSU1QTEUsICJTaW1wbGUgUGFubmluZyIsICJzaW1wbGUifSwKKyAgICAgIHswLCBOVUxMLCBOVUxMfQorICAgIH07CisKKyAgICBndHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RBdWRpb1Bhbm9yYW1hTWV0aG9kIiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gZ3R5cGU7Cit9CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgIiBHU1RfQVVESU9fTkUgKEYzMikgIiwgIiBHU1RfQVVESU9fTkUgKFMxNikgIn0sICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgeyAiIEdTVF9BVURJT19ORSAoRjMyKSAiLCAiIEdTVF9BVURJT19ORSAoUzE2KSAifSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIgImNoYW5uZWxzID0gKGludCkgMiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQiKQorICAgICk7CisKK0dfREVGSU5FX1RZUEUgKEdzdEF1ZGlvUGFub3JhbWEsIGdzdF9hdWRpb19wYW5vcmFtYSwgR1NUX1RZUEVfQkFTRV9UUkFOU0ZPUk0pOworCitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fcGFub3JhbWFfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX3Bhbm9yYW1hX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hdWRpb19wYW5vcmFtYV9nZXRfdW5pdF9zaXplIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwKKyAgICBHc3RDYXBzICogY2FwcywgZ3NpemUgKiBzaXplKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLAorICAgIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENhcHMgKiBjYXBzLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fcGFub3JhbWFfc2V0X2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLAorICAgIEdzdENhcHMgKiBpbmNhcHMsIEdzdENhcHMgKiBvdXRjYXBzKTsKKworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX3Bhbm9yYW1hX20yc19pbnQgKGdmbG9hdCBwYW4sCisgICAgZ2ludDE2ICogaWRhdGEsIGdpbnQxNiAqIG9kYXRhLCBndWludCBudW1fc2FtcGxlcyk7CitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fcGFub3JhbWFfczJzX2ludCAoZ2Zsb2F0IHBhbiwKKyAgICBnaW50MTYgKiBpZGF0YSwgZ2ludDE2ICogb2RhdGEsIGd1aW50IG51bV9zYW1wbGVzKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19wYW5vcmFtYV9tMnNfZmxvYXQgKGdmbG9hdCBwYW4sCisgICAgZ2Zsb2F0ICogaWRhdGEsIGdmbG9hdCAqIG9kYXRhLCBndWludCBudW1fc2FtcGxlcyk7CitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fcGFub3JhbWFfczJzX2Zsb2F0IChnZmxvYXQgcGFuLAorICAgIGdmbG9hdCAqIGlkYXRhLCBnZmxvYXQgKiBvZGF0YSwgZ3VpbnQgbnVtX3NhbXBsZXMpOworCitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fcGFub3JhbWFfbTJzX2ludF9zaW1wbGUgKGdmbG9hdCBwYW4sCisgICAgZ2ludDE2ICogaWRhdGEsIGdpbnQxNiAqIG9kYXRhLCBndWludCBudW1fc2FtcGxlcyk7CitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fcGFub3JhbWFfczJzX2ludF9zaW1wbGUgKGdmbG9hdCBwYW4sCisgICAgZ2ludDE2ICogaWRhdGEsIGdpbnQxNiAqIG9kYXRhLCBndWludCBudW1fc2FtcGxlcyk7CitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fcGFub3JhbWFfbTJzX2Zsb2F0X3NpbXBsZSAoZ2Zsb2F0IHBhbiwKKyAgICBnZmxvYXQgKiBpZGF0YSwgZ2Zsb2F0ICogb2RhdGEsIGd1aW50IG51bV9zYW1wbGVzKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb19wYW5vcmFtYV9zMnNfZmxvYXRfc2ltcGxlIChnZmxvYXQgcGFuLAorICAgIGdmbG9hdCAqIGlkYXRhLCBnZmxvYXQgKiBvZGF0YSwgZ3VpbnQgbnVtX3NhbXBsZXMpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwKKyAgICBHc3RCdWZmZXIgKiBpbmJ1ZiwgR3N0QnVmZmVyICogb3V0YnVmKTsKKworCisvKiBUYWJsZSB3aXRoIHByb2Nlc3NpbmcgZnVuY3Rpb25zOiBbY2hhbm5lbHNdW2Zvcm1hdF1bbWV0aG9kXSAqLworc3RhdGljIGNvbnN0IEdzdEF1ZGlvUGFub3JhbWFQcm9jZXNzRnVuYyBwYW5vcmFtYV9wcm9jZXNzX2Z1bmN0aW9uc1syXVsyXVsyXSA9IHsKKyAgeworICAgICAgICB7CisgICAgICAgICAgICAgIChHc3RBdWRpb1Bhbm9yYW1hUHJvY2Vzc0Z1bmMpIGdzdF9hdWRpb19wYW5vcmFtYV9tMnNfaW50LAorICAgICAgICAgICAgKEdzdEF1ZGlvUGFub3JhbWFQcm9jZXNzRnVuYykgZ3N0X2F1ZGlvX3Bhbm9yYW1hX20yc19pbnRfc2ltcGxlfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAoR3N0QXVkaW9QYW5vcmFtYVByb2Nlc3NGdW5jKSBnc3RfYXVkaW9fcGFub3JhbWFfbTJzX2Zsb2F0LAorICAgICAgICAgICAgKEdzdEF1ZGlvUGFub3JhbWFQcm9jZXNzRnVuYykgZ3N0X2F1ZGlvX3Bhbm9yYW1hX20yc19mbG9hdF9zaW1wbGV9CisgICAgICB9LAorICB7CisgICAgICAgIHsKKyAgICAgICAgICAgICAgKEdzdEF1ZGlvUGFub3JhbWFQcm9jZXNzRnVuYykgZ3N0X2F1ZGlvX3Bhbm9yYW1hX3Myc19pbnQsCisgICAgICAgICAgICAoR3N0QXVkaW9QYW5vcmFtYVByb2Nlc3NGdW5jKSBnc3RfYXVkaW9fcGFub3JhbWFfczJzX2ludF9zaW1wbGV9LAorICAgICAgICB7CisgICAgICAgICAgICAgIChHc3RBdWRpb1Bhbm9yYW1hUHJvY2Vzc0Z1bmMpIGdzdF9hdWRpb19wYW5vcmFtYV9zMnNfZmxvYXQsCisgICAgICAgICAgICAoR3N0QXVkaW9QYW5vcmFtYVByb2Nlc3NGdW5jKSBnc3RfYXVkaW9fcGFub3JhbWFfczJzX2Zsb2F0X3NpbXBsZX0KKyAgICAgIH0KK307CisKKy8qIEdPYmplY3Qgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19wYW5vcmFtYV9jbGFzc19pbml0IChHc3RBdWRpb1Bhbm9yYW1hQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9hdWRpb19wYW5vcmFtYV9kZWJ1ZywgImF1ZGlvcGFub3JhbWEiLCAwLAorICAgICAgImF1ZGlvcGFub3JhbWEgZWxlbWVudCIpOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9fcGFub3JhbWFfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9fcGFub3JhbWFfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUEFOT1JBTUEsCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJwYW5vcmFtYSIsICJQYW5vcmFtYSIsCisgICAgICAgICAgIlBvc2l0aW9uIGluIHN0ZXJlbyBwYW5vcmFtYSAoLTEuMCBsZWZ0IC0+IDEuMCByaWdodCkiLCAtMS4wLCAxLjAsCisgICAgICAgICAgMC4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgLyoqCisgICAqIEdzdEF1ZGlvUGFub3JhbWE6bWV0aG9kOgorICAgKgorICAgKiBQYW5uaW5nIG1ldGhvZDogcHN5Y2hvYWNvdXN0aWMgbW9kZSBrZWVwcyB0aGUgc2FtZSBwZXJjZWl2ZWQgbG91ZG5lc3MsCisgICAqIHdoaWxlIHNpbXBsZSBtb2RlIGp1c3QgY29udHJvbHMgdGhlIHZvbHVtZSBvZiBvbmUgY2hhbm5lbC4gSXQncyBtZXJlbHkKKyAgICogYSBtYXR0ZXIgb2YgdGFzdGUgd2hpY2ggbWV0aG9kIHNob3VsZCBiZSBjaG9zZW4uIAorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NRVRIT0QsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoIm1ldGhvZCIsICJQYW5uaW5nIG1ldGhvZCIsCisgICAgICAgICAgIlBzeWNob2Fjb3VzdGljIG1vZGUga2VlcHMgc2FtZSBwZXJjZWl2ZWQgbG91ZG5lc3MsICIKKyAgICAgICAgICAic2ltcGxlIG1vZGUganVzdCBjb250cm9scyB2b2x1bWUgb2Ygb25lIGNoYW5uZWwuIiwKKyAgICAgICAgICBHU1RfVFlQRV9BVURJT19QQU5PUkFNQV9NRVRIT0QsIE1FVEhPRF9QU1lDSE9BQ09VU1RJQywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiU3RlcmVvIHBvc2l0aW9uaW5nIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L0F1ZGlvIiwKKyAgICAgICJQb3NpdGlvbnMgYXVkaW8gc3RyZWFtcyBpbiB0aGUgc3RlcmVvIHBhbm9yYW1hIiwKKyAgICAgICJTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworCisgIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAoa2xhc3MpLT5nZXRfdW5pdF9zaXplID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9fcGFub3JhbWFfZ2V0X3VuaXRfc2l6ZSk7CisgIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAoa2xhc3MpLT50cmFuc2Zvcm1fY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybV9jYXBzKTsKKyAgR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyktPnNldF9jYXBzID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9fcGFub3JhbWFfc2V0X2NhcHMpOworICBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKGtsYXNzKS0+dHJhbnNmb3JtID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19wYW5vcmFtYV9pbml0IChHc3RBdWRpb1Bhbm9yYW1hICogZmlsdGVyKQoreworCisgIGZpbHRlci0+cGFub3JhbWEgPSAwOworICBmaWx0ZXItPm1ldGhvZCA9IE1FVEhPRF9QU1lDSE9BQ09VU1RJQzsKKyAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJmZpbHRlci0+aW5mbyk7CisgIGZpbHRlci0+cHJvY2VzcyA9IE5VTEw7CisKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9nYXBfYXdhcmUgKEdTVF9CQVNFX1RSQU5TRk9STSAoZmlsdGVyKSwgVFJVRSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1ZGlvX3Bhbm9yYW1hX3NldF9wcm9jZXNzX2Z1bmN0aW9uIChHc3RBdWRpb1Bhbm9yYW1hICogZmlsdGVyLAorICAgIEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIGdpbnQgY2hhbm5lbF9pbmRleCwgZm9ybWF0X2luZGV4LCBtZXRob2RfaW5kZXg7CisgIGNvbnN0IEdzdEF1ZGlvRm9ybWF0SW5mbyAqZmluZm8gPSBpbmZvLT5maW5mbzsKKworICAvKiBzZXQgcHJvY2Vzc2luZyBmdW5jdGlvbiAqLworICBjaGFubmVsX2luZGV4ID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKGluZm8pIC0gMTsKKyAgaWYgKGNoYW5uZWxfaW5kZXggPiAxIHx8IGNoYW5uZWxfaW5kZXggPCAwKSB7CisgICAgZmlsdGVyLT5wcm9jZXNzID0gTlVMTDsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBmb3JtYXRfaW5kZXggPSBHU1RfQVVESU9fRk9STUFUX0lORk9fSVNfRkxPQVQgKGZpbmZvKSA/IDEgOiAwOworICBtZXRob2RfaW5kZXggPSBmaWx0ZXItPm1ldGhvZDsKKworICBmaWx0ZXItPnByb2Nlc3MgPQorICAgICAgcGFub3JhbWFfcHJvY2Vzc19mdW5jdGlvbnNbY2hhbm5lbF9pbmRleF1bZm9ybWF0X2luZGV4XVttZXRob2RfaW5kZXhdOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19wYW5vcmFtYV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXVkaW9QYW5vcmFtYSAqZmlsdGVyID0gR1NUX0FVRElPX1BBTk9SQU1BIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QQU5PUkFNQToKKyAgICAgIGZpbHRlci0+cGFub3JhbWEgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01FVEhPRDoKKyAgICAgIGZpbHRlci0+bWV0aG9kID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgZ3N0X2F1ZGlvX3Bhbm9yYW1hX3NldF9wcm9jZXNzX2Z1bmN0aW9uIChmaWx0ZXIsICZmaWx0ZXItPmluZm8pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX3Bhbm9yYW1hX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb1Bhbm9yYW1hICpmaWx0ZXIgPSBHU1RfQVVESU9fUEFOT1JBTUEgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BBTk9SQU1BOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBmaWx0ZXItPnBhbm9yYW1hKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NRVRIT0Q6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgZmlsdGVyLT5tZXRob2QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBHc3RCYXNlVHJhbnNmb3JtIHZtZXRob2QgaW1wbGVtZW50YXRpb25zICovCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1ZGlvX3Bhbm9yYW1hX2dldF91bml0X3NpemUgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLCBHc3RDYXBzICogY2FwcywKKyAgICBnc2l6ZSAqIHNpemUpCit7CisgIEdzdEF1ZGlvSW5mbyBpbmZvOworCisgIGdfYXNzZXJ0IChzaXplKTsKKworICBpZiAoIWdzdF9hdWRpb19pbmZvX2Zyb21fY2FwcyAoJmluZm8sIGNhcHMpKQorICAgIHJldHVybiBGQUxTRTsKKworICAqc2l6ZSA9IEdTVF9BVURJT19JTkZPX0JQRiAoJmluZm8pOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfYXVkaW9fcGFub3JhbWFfdHJhbnNmb3JtX2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlLAorICAgIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENhcHMgKiBjYXBzLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICpyZXM7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnaW50IGk7CisKKyAgLyogcmVwbGFjZSB0aGUgY2hhbm5lbCBwcm9wZXJ0eSB3aXRoIG91ciByYW5nZS4gKi8KKyAgcmVzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAocmVzKTsgaSsrKSB7CisgICAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAocmVzLCBpKTsKKyAgICBpZiAoZGlyZWN0aW9uID09IEdTVF9QQURfU1JDKSB7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGJhc2UsICJbJWRdIGFsbG93IDEtMiBjaGFubmVscyIsIGkpOworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cnVjdHVyZSwgImNoYW5uZWxzIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCAyLCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0lORk9fT0JKRUNUIChiYXNlLCAiWyVkXSBhbGxvdyAyIGNoYW5uZWxzIiwgaSk7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAyLCBOVUxMKTsKKyAgICB9CisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHN0cnVjdHVyZSwgImNoYW5uZWwtbWFzayIpOworICB9CisgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2UsICJ0cmFuc2Zvcm1lZCAlIiBHU1RfUFRSX0ZPUk1BVCwgcmVzKTsKKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZSwgIlVzaW5nIGZpbHRlciBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBmaWx0ZXIpOworICAgIGludGVyc2VjdGlvbiA9CisgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHJlcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmVzKTsKKyAgICByZXMgPSBpbnRlcnNlY3Rpb247CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZSwgIkludGVyc2VjdGlvbiAlIiBHU1RfUFRSX0ZPUk1BVCwgcmVzKTsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1ZGlvX3Bhbm9yYW1hX3NldF9jYXBzIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwgR3N0Q2FwcyAqIGluY2FwcywKKyAgICBHc3RDYXBzICogb3V0Y2FwcykKK3sKKyAgR3N0QXVkaW9QYW5vcmFtYSAqZmlsdGVyID0gR1NUX0FVRElPX1BBTk9SQU1BIChiYXNlKTsKKyAgR3N0QXVkaW9JbmZvIGluZm87CisKKyAgLypHU1RfSU5GTyAoImluY2FwcyBhcmUgJSIgR1NUX1BUUl9GT1JNQVQsIGluY2Fwcyk7ICovCisgIGlmICghZ3N0X2F1ZGlvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgaW5jYXBzKSkKKyAgICBnb3RvIG5vX2Zvcm1hdDsKKworICBHU1RfREVCVUcgKCJ0cnkgdG8gcHJvY2VzcyAlZCBpbnB1dCB3aXRoICVkIGNoYW5uZWxzIiwKKyAgICAgIEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoJmluZm8pLCBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJmluZm8pKTsKKworICBpZiAoIWdzdF9hdWRpb19wYW5vcmFtYV9zZXRfcHJvY2Vzc19mdW5jdGlvbiAoZmlsdGVyLCAmaW5mbykpCisgICAgZ290byBub19mb3JtYXQ7CisKKyAgZmlsdGVyLT5pbmZvID0gaW5mbzsKKworICByZXR1cm4gVFJVRTsKKworbm9fZm9ybWF0OgorICB7CisgICAgR1NUX0RFQlVHICgiaW52YWxpZCBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIHBzeWNob2Fjb3VzdGljIHByb2Nlc3NpbmcgZnVuY3Rpb25zICovCisKKy8qIG1vbm8gdG8gc3RlcmVvIHBhbm5pbmcKKyAqIHBhbjogLTEuMCAgMC4wICAxLjAKKyAqIGw6ICAgIDEuMCAgMC41ICAwLjAgIAorICogcjogICAgMC4wICAwLjUgIDEuMAorICoKKyAqIEZJWE1FOiB3ZSBzaG91bGQgdXNlIC0zZGIgKDEvc3F0cigyKSkgZm9yIDUwOjUwCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fcGFub3JhbWFfbTJzX2ludCAoZ2Zsb2F0IHBhbiwgZ2ludDE2ICogaWRhdGEsIGdpbnQxNiAqIG9kYXRhLCBndWludCBuKQoreworICBnZmxvYXQgciA9IChwYW4gKyAxLjApIC8gMi4wOworICBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3BzeSAob2RhdGEsIGlkYXRhLCAxLjAgLSByLCByLCBuKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19wYW5vcmFtYV9tMnNfZmxvYXQgKGdmbG9hdCBwYW4sIGdmbG9hdCAqIGlkYXRhLAorICAgIGdmbG9hdCAqIG9kYXRhLCBndWludCBuKQoreworICBnZmxvYXQgciA9IChwYW4gKyAxLjApIC8gMi4wOworICBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX3BzeSAob2RhdGEsIGlkYXRhLCAxLjAgLSByLCByLCBuKTsKK30KKworLyogc3RlcmVvIGJhbGFuY2UKKyAqIHBhbjogLTEuMCAgMC4wICAxLjAKKyAqIGxsOiAgIDEuMCAgMS4wICAwLjAKKyAqIGxyOiAgIDEuMCAgMC4wICAwLjAKKyAqIHJyOiAgIDAuMCAgMS4wICAxLjAKKyAqIHJsOiAgIDAuMCAgMC4wICAxLjAKKyAqLworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19wYW5vcmFtYV9zMnNfaW50IChnZmxvYXQgcGFuLCBnaW50MTYgKiBpZGF0YSwgZ2ludDE2ICogb2RhdGEsIGd1aW50IG4pCit7CisgIGlmIChwYW4gPT0gMC4wKSB7CisgICAgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9ub25lIChvZGF0YSwgaWRhdGEsIG4pOworICB9IGVsc2UgaWYgKHBhbiA+IDAuMCkgeworICAgIGdmbG9hdCBybCA9IHBhbjsKKyAgICBnZmxvYXQgbGwgPSAxLjAgLSBybDsKKyAgICBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3BzeV9yaWdodCAob2RhdGEsIGlkYXRhLCBsbCwgcmwsIG4pOworICB9IGVsc2UgeworICAgIGdmbG9hdCByciA9IDEuMCArIHBhbjsKKyAgICBnZmxvYXQgbHIgPSAxLjAgLSBycjsKKyAgICBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3BzeV9sZWZ0IChvZGF0YSwgaWRhdGEsIGxyLCByciwgbik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb19wYW5vcmFtYV9zMnNfZmxvYXQgKGdmbG9hdCBwYW4sIGdmbG9hdCAqIGlkYXRhLAorICAgIGdmbG9hdCAqIG9kYXRhLCBndWludCBuKQoreworICBpZiAocGFuID09IDAuMCkgeworICAgIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfbm9uZSAob2RhdGEsIGlkYXRhLCBuKTsKKyAgfSBlbHNlIGlmIChwYW4gPiAwLjApIHsKKyAgICBnZmxvYXQgcmwgPSBwYW47CisgICAgZ2Zsb2F0IGxsID0gMS4wIC0gcmw7CisgICAgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9wc3lfcmlnaHQgKG9kYXRhLCBpZGF0YSwgbGwsIHJsLCBuKTsKKyAgfSBlbHNlIHsKKyAgICBnZmxvYXQgcnIgPSAxLjAgKyBwYW47CisgICAgZ2Zsb2F0IGxyID0gMS4wIC0gcnI7CisgICAgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9wc3lfbGVmdCAob2RhdGEsIGlkYXRhLCBsciwgcnIsIG4pOworICB9Cit9CisKKy8qIHNpbXBsZSBwcm9jZXNzaW5nIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX3Bhbm9yYW1hX20yc19pbnRfc2ltcGxlIChnZmxvYXQgcGFuLCBnaW50MTYgKiBpZGF0YSwKKyAgICBnaW50MTYgKiBvZGF0YSwgZ3VpbnQgbikKK3sKKyAgaWYgKHBhbiA9PSAwLjApIHsKKyAgICBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX25vbmUgKG9kYXRhLCBpZGF0YSwgbik7CisgIH0gZWxzZSBpZiAocGFuID4gMC4wKSB7CisgICAgZ2Zsb2F0IGxwYW4gPSAxLjAgLSBwYW47CisgICAgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9zaW1fbGVmdCAob2RhdGEsIGlkYXRhLCBscGFuLCBuKTsKKyAgfSBlbHNlIHsKKyAgICBnZmxvYXQgcnBhbiA9IDEuMCArIHBhbjsKKyAgICBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3NpbV9yaWdodCAob2RhdGEsIGlkYXRhLCBycGFuLCBuKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX3Bhbm9yYW1hX3Myc19pbnRfc2ltcGxlIChnZmxvYXQgcGFuLCBnaW50MTYgKiBpZGF0YSwKKyAgICBnaW50MTYgKiBvZGF0YSwgZ3VpbnQgbikKK3sKKyAgaWYgKHBhbiA9PSAwLjApIHsKKyAgICBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX25vbmUgKG9kYXRhLCBpZGF0YSwgbik7CisgIH0gZWxzZSBpZiAocGFuID4gMC4wKSB7CisgICAgZ2Zsb2F0IGxwYW4gPSAxLjAgLSBwYW47CisgICAgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9zaW1fbGVmdCAob2RhdGEsIGlkYXRhLCBscGFuLCBuKTsKKyAgfSBlbHNlIHsKKyAgICBnZmxvYXQgcnBhbiA9IDEuMCArIHBhbjsKKyAgICBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3NpbV9yaWdodCAob2RhdGEsIGlkYXRhLCBycGFuLCBuKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX3Bhbm9yYW1hX20yc19mbG9hdF9zaW1wbGUgKGdmbG9hdCBwYW4sIGdmbG9hdCAqIGlkYXRhLAorICAgIGdmbG9hdCAqIG9kYXRhLCBndWludCBuKQoreworICBpZiAocGFuID09IDAuMCkgeworICAgIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfbm9uZSAob2RhdGEsIGlkYXRhLCBuKTsKKyAgfSBlbHNlIGlmIChwYW4gPiAwLjApIHsKKyAgICBnZmxvYXQgbHBhbiA9IDEuMCAtIHBhbjsKKyAgICBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX3NpbV9sZWZ0IChvZGF0YSwgaWRhdGEsIGxwYW4sIG4pOworICB9IGVsc2UgeworICAgIGdmbG9hdCBycGFuID0gMS4wICsgcGFuOworICAgIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfc2ltX3JpZ2h0IChvZGF0YSwgaWRhdGEsIHJwYW4sIG4pOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fcGFub3JhbWFfczJzX2Zsb2F0X3NpbXBsZSAoZ2Zsb2F0IHBhbiwgZ2Zsb2F0ICogaWRhdGEsCisgICAgZ2Zsb2F0ICogb2RhdGEsIGd1aW50IG4pCit7CisgIGlmIChwYW4gPT0gMC4wKSB7CisgICAgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9ub25lIChvZGF0YSwgaWRhdGEsIG4pOworICB9IGVsc2UgaWYgKHBhbiA+IDAuMCkgeworICAgIGdmbG9hdCBscGFuID0gMS4wIC0gcGFuOworICAgIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfc2ltX2xlZnQgKG9kYXRhLCBpZGF0YSwgbHBhbiwgbik7CisgIH0gZWxzZSB7CisgICAgZ2Zsb2F0IHJwYW4gPSAxLjAgKyBwYW47CisgICAgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9zaW1fcmlnaHQgKG9kYXRhLCBpZGF0YSwgcnBhbiwgbik7CisgIH0KK30KKworLyogdGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBhY3R1YWwgcHJvY2Vzc2luZworICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F1ZGlvX3Bhbm9yYW1hX3RyYW5zZm9ybSAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UsIEdzdEJ1ZmZlciAqIGluYnVmLAorICAgIEdzdEJ1ZmZlciAqIG91dGJ1ZikKK3sKKyAgR3N0QXVkaW9QYW5vcmFtYSAqZmlsdGVyID0gR1NUX0FVRElPX1BBTk9SQU1BIChiYXNlKTsKKyAgR3N0Q2xvY2tUaW1lIHRzOworICBHc3RNYXBJbmZvIGlubWFwLCBvdXRtYXA7CisKKyAgdHMgPSBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJmJhc2UtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZikpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAodHMpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAic3luYyB0byAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHRzKSk7CisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoZmlsdGVyKSwgdHMpOworICB9CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZiwgJm91dG1hcCwgR1NUX01BUF9XUklURSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGluYnVmLCBHU1RfQlVGRkVSX0ZMQUdfR0FQKSkpIHsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19HQVApOworICAgIG9yY19tZW1zZXQgKG91dG1hcC5kYXRhLCAwLCBvdXRtYXAuc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgLyogb3V0cHV0IGlzIGFsd2F5cyBzdGVyZW8sIGlucHV0IGlzIG1vbm8gb3Igc3RlcmVvLAorICAgICAqIGFuZCBpbmZvIGRlc2NyaWJlcyBpbnB1dCBmb3JtYXQgKi8KKyAgICBndWludCBudW1fc2FtcGxlcyA9IG91dG1hcC5zaXplIC8gKDIgKiBHU1RfQVVESU9fSU5GT19CUFMgKCZmaWx0ZXItPmluZm8pKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZiwgJmlubWFwLCBHU1RfTUFQX1JFQUQpOworICAgIGZpbHRlci0+cHJvY2VzcyAoZmlsdGVyLT5wYW5vcmFtYSwgaW5tYXAuZGF0YSwgb3V0bWFwLmRhdGEsIG51bV9zYW1wbGVzKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZiwgJmlubWFwKTsKKyAgfQorCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm91dG1hcCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5oIGIvZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZDFjZWMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hLmgKQEAgLTAsMCArMSw2OCBAQAorLyogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyAKKyNpZm5kZWYgX19HU1RfQVVESU9fUEFOT1JBTUFfSF9fCisjZGVmaW5lIF9fR1NUX0FVRElPX1BBTk9SQU1BX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0FVRElPX1BBTk9SQU1BICAgICAgICAgICAgKGdzdF9hdWRpb19wYW5vcmFtYV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVVESU9fUEFOT1JBTUEob2JqKSAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9BVURJT19QQU5PUkFNQSxHc3RBdWRpb1Bhbm9yYW1hKSkKKyNkZWZpbmUgR1NUX0lTX0FVRElPX1BBTk9SQU1BKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVVESU9fUEFOT1JBTUEpKQorI2RlZmluZSBHU1RfQVVESU9fUEFOT1JBTUFfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpICxHU1RfVFlQRV9BVURJT19QQU5PUkFNQSxHc3RBdWRpb1Bhbm9yYW1hQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fUEFOT1JBTUFfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpICxHU1RfVFlQRV9BVURJT19QQU5PUkFNQSkpCisjZGVmaW5lIEdTVF9BVURJT19QQU5PUkFNQV9HRVRfQ0xBU1Mob2JqKSAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MoKG9iaikgLEdTVF9UWVBFX0FVRElPX1BBTk9SQU1BLEdzdEF1ZGlvUGFub3JhbWFDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdWRpb1Bhbm9yYW1hICAgICAgR3N0QXVkaW9QYW5vcmFtYTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdWRpb1Bhbm9yYW1hQ2xhc3MgR3N0QXVkaW9QYW5vcmFtYUNsYXNzOworCit0eXBlZGVmIHZvaWQgKCpHc3RBdWRpb1Bhbm9yYW1hUHJvY2Vzc0Z1bmMpKGdmbG9hdCwgZ3VpbnQ4KiwgZ3VpbnQ4KiwgZ3VpbnQpOworCit0eXBlZGVmIGVudW0KK3sKKyAgTUVUSE9EX1BTWUNIT0FDT1VTVElDID0gMCwKKyAgTUVUSE9EX1NJTVBMRQorfSBHc3RBdWRpb1Bhbm9yYW1hTWV0aG9kOworCitzdHJ1Y3QgX0dzdEF1ZGlvUGFub3JhbWEgeworICBHc3RCYXNlVHJhbnNmb3JtIGVsZW1lbnQ7CisKKyAgLyogcHJvcGVydGllcyAqLworICBnZmxvYXQgcGFub3JhbWE7CisgIEdzdEF1ZGlvUGFub3JhbWFNZXRob2QgbWV0aG9kOworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIEdzdEF1ZGlvUGFub3JhbWFQcm9jZXNzRnVuYyBwcm9jZXNzOworICBHc3RBdWRpb0luZm8gaW5mbzsKK307CisKK3N0cnVjdCBfR3N0QXVkaW9QYW5vcmFtYUNsYXNzIHsKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9hdWRpb19wYW5vcmFtYV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BVURJT19QQU5PUkFNQV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWFvcmMtZGlzdC5jIGIvZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYW9yYy1kaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZkNjg2MQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWFvcmMtZGlzdC5jCkBAIC0wLDAgKzEsMzk3NyBAQAorCisvKiBhdXRvZ2VuZXJhdGVkIGZyb20gYXVkaW9wYW5vcmFtYW9yYy5vcmMgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPGdsaWIuaD4KKworI2lmbmRlZiBfT1JDX0lOVEVHRVJfVFlQRURFRlNfCisjZGVmaW5lIF9PUkNfSU5URUdFUl9UWVBFREVGU18KKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorI2luY2x1ZGUgPHN0ZGludC5oPgordHlwZWRlZiBpbnQ4X3Qgb3JjX2ludDg7Cit0eXBlZGVmIGludDE2X3Qgb3JjX2ludDE2OwordHlwZWRlZiBpbnQzMl90IG9yY19pbnQzMjsKK3R5cGVkZWYgaW50NjRfdCBvcmNfaW50NjQ7Cit0eXBlZGVmIHVpbnQ4X3Qgb3JjX3VpbnQ4OwordHlwZWRlZiB1aW50MTZfdCBvcmNfdWludDE2OwordHlwZWRlZiB1aW50MzJfdCBvcmNfdWludDMyOwordHlwZWRlZiB1aW50NjRfdCBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgVUlOVDY0X0MoeCkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCit0eXBlZGVmIHNpZ25lZCBfX2ludDggb3JjX2ludDg7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDE2IG9yY19pbnQxNjsKK3R5cGVkZWYgc2lnbmVkIF9faW50MzIgb3JjX2ludDMyOwordHlwZWRlZiBzaWduZWQgX19pbnQ2NCBvcmNfaW50NjQ7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50OCBvcmNfdWludDg7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50MTYgb3JjX3VpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQzMiBvcmNfdWludDMyOwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSAoeCMjVWk2NCkKKyNkZWZpbmUgaW5saW5lIF9faW5saW5lCisjZWxzZQorI2luY2x1ZGUgPGxpbWl0cy5oPgordHlwZWRlZiBzaWduZWQgY2hhciBvcmNfaW50ODsKK3R5cGVkZWYgc2hvcnQgb3JjX2ludDE2OwordHlwZWRlZiBpbnQgb3JjX2ludDMyOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIG9yY191aW50ODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgb3JjX3VpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IG9yY191aW50MzI7CisjaWYgSU5UX01BWCA9PSBMT05HX01BWAordHlwZWRlZiBsb25nIGxvbmcgb3JjX2ludDY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgb3JjX3VpbnQ2NDsKKyNkZWZpbmUgT1JDX1VJTlQ2NF9DKHgpICh4IyNVTEwpCisjZWxzZQordHlwZWRlZiBsb25nIG9yY19pbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgKHgjI1VMKQorI2VuZGlmCisjZW5kaWYKK3R5cGVkZWYgdW5pb24KK3sKKyAgb3JjX2ludDE2IGk7CisgIG9yY19pbnQ4IHgyWzJdOworfSBvcmNfdW5pb24xNjsKK3R5cGVkZWYgdW5pb24KK3sKKyAgb3JjX2ludDMyIGk7CisgIGZsb2F0IGY7CisgIG9yY19pbnQxNiB4MlsyXTsKKyAgb3JjX2ludDggeDRbNF07Cit9IG9yY191bmlvbjMyOwordHlwZWRlZiB1bmlvbgoreworICBvcmNfaW50NjQgaTsKKyAgZG91YmxlIGY7CisgIG9yY19pbnQzMiB4MlsyXTsKKyAgZmxvYXQgeDJmWzJdOworICBvcmNfaW50MTYgeDRbNF07Cit9IG9yY191bmlvbjY0OworI2VuZGlmCisjaWZuZGVmIE9SQ19SRVNUUklDVAorI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjZGVmaW5lIE9SQ19SRVNUUklDVCByZXN0cmljdAorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAorI2RlZmluZSBPUkNfUkVTVFJJQ1QgX19yZXN0cmljdF9fCisjZWxzZQorI2RlZmluZSBPUkNfUkVTVFJJQ1QKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgT1JDX0lOVEVSTkFMCisjaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU5MCkKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykgJiYgKF9fU1VOUFJPX0MgPj0gMHg1NTApCisjZGVmaW5lIE9SQ19JTlRFUk5BTCBfX2hpZGRlbgorI2VsaWYgZGVmaW5lZCAoX19HTlVDX18pCisjZGVmaW5lIE9SQ19JTlRFUk5BTCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZWxzZQorI2RlZmluZSBPUkNfSU5URVJOQUwKKyNlbmRpZgorI2VuZGlmCisKKworI2lmbmRlZiBESVNBQkxFX09SQworI2luY2x1ZGUgPG9yYy9vcmMuaD4KKyNlbmRpZgordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX25vbmUgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnaW50MTYgKiBPUkNfUkVTVFJJQ1QgczEsIGludCBuKTsKK3ZvaWQgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9ub25lIChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfbm9uZSAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX25vbmUgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGludCBuKTsKK3ZvaWQgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9wc3kgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnaW50MTYgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBmbG9hdCBwMiwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX3BzeSAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdmbG9hdCAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGZsb2F0IHAyLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfcHN5X3JpZ2h0IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKTsKK3ZvaWQgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9wc3lfbGVmdCAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGZsb2F0IHAyLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfcHN5X3JpZ2h0IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKTsKK3ZvaWQgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9wc3lfbGVmdCAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdmbG9hdCAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGZsb2F0IHAyLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfc2ltX3JpZ2h0IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3NpbV9sZWZ0IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3NpbV9yaWdodCAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGludCBuKTsKK3ZvaWQgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9zaW1fbGVmdCAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGludCBuKTsKK3ZvaWQgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fcmlnaHQgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfc2ltX2xlZnQgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfc2ltX3JpZ2h0IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3NpbV9sZWZ0IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pOworCisKKy8qIGJlZ2luIE9yYyBDIHRhcmdldCBwcmVhbWJsZSAqLworI2RlZmluZSBPUkNfQ0xBTVAoeCxhLGIpICgoeCk8KGEpID8gKGEpIDogKCh4KT4oYikgPyAoYikgOiAoeCkpKQorI2RlZmluZSBPUkNfQUJTKGEpICgoYSk8MCA/IC0oYSkgOiAoYSkpCisjZGVmaW5lIE9SQ19NSU4oYSxiKSAoKGEpPChiKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgT1JDX01BWChhLGIpICgoYSk+KGIpID8gKGEpIDogKGIpKQorI2RlZmluZSBPUkNfU0JfTUFYIDEyNworI2RlZmluZSBPUkNfU0JfTUlOICgtMS1PUkNfU0JfTUFYKQorI2RlZmluZSBPUkNfVUJfTUFYIChvcmNfdWludDgpIDI1NQorI2RlZmluZSBPUkNfVUJfTUlOIDAKKyNkZWZpbmUgT1JDX1NXX01BWCAzMjc2NworI2RlZmluZSBPUkNfU1dfTUlOICgtMS1PUkNfU1dfTUFYKQorI2RlZmluZSBPUkNfVVdfTUFYIChvcmNfdWludDE2KTY1NTM1CisjZGVmaW5lIE9SQ19VV19NSU4gMAorI2RlZmluZSBPUkNfU0xfTUFYIDIxNDc0ODM2NDcKKyNkZWZpbmUgT1JDX1NMX01JTiAoLTEtT1JDX1NMX01BWCkKKyNkZWZpbmUgT1JDX1VMX01BWCA0Mjk0OTY3Mjk1VQorI2RlZmluZSBPUkNfVUxfTUlOIDAKKyNkZWZpbmUgT1JDX0NMQU1QX1NCKHgpIE9SQ19DTEFNUCh4LE9SQ19TQl9NSU4sT1JDX1NCX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1VCKHgpIE9SQ19DTEFNUCh4LE9SQ19VQl9NSU4sT1JDX1VCX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1NXKHgpIE9SQ19DTEFNUCh4LE9SQ19TV19NSU4sT1JDX1NXX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1VXKHgpIE9SQ19DTEFNUCh4LE9SQ19VV19NSU4sT1JDX1VXX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1NMKHgpIE9SQ19DTEFNUCh4LE9SQ19TTF9NSU4sT1JDX1NMX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1VMKHgpIE9SQ19DTEFNUCh4LE9SQ19VTF9NSU4sT1JDX1VMX01BWCkKKyNkZWZpbmUgT1JDX1NXQVBfVyh4KSAoKCgoeCkmMHhmZlUpPDw4KSB8ICgoKHgpJjB4ZmYwMFUpPj44KSkKKyNkZWZpbmUgT1JDX1NXQVBfTCh4KSAoKCgoeCkmMHhmZlUpPDwyNCkgfCAoKCh4KSYweGZmMDBVKTw8OCkgfCAoKCh4KSYweGZmMDAwMFUpPj44KSB8ICgoKHgpJjB4ZmYwMDAwMDBVKT4+MjQpKQorI2RlZmluZSBPUkNfU1dBUF9RKHgpICgoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZikpPDw1NikgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwKSk8PDQwKSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDAwMCkpPDwyNCkgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwMDAwMCkpPDw4KSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDAwMDAwMDApKT4+OCkgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwMDAwMDAwMDApKT4+MjQpIHwgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4ZmYwMDAwMDAwMDAwMDApKT4+NDApIHwgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4ZmYwMDAwMDAwMDAwMDAwMCkpPj41NikpCisjZGVmaW5lIE9SQ19QVFJfT0ZGU0VUKHB0cixvZmZzZXQpICgodm9pZCAqKSgoKHVuc2lnbmVkIGNoYXIgKikocHRyKSkgKyAob2Zmc2V0KSkpCisjZGVmaW5lIE9SQ19ERU5PUk1BTCh4KSAoKHgpICYgKCgoKHgpJjB4N2Y4MDAwMDApID09IDApID8gMHhmZjgwMDAwMCA6IDB4ZmZmZmZmZmYpKQorI2RlZmluZSBPUkNfSVNOQU4oeCkgKCgoKHgpJjB4N2Y4MDAwMDApID09IDB4N2Y4MDAwMDApICYmICgoKHgpJjB4MDA3ZmZmZmYpICE9IDApKQorI2RlZmluZSBPUkNfREVOT1JNQUxfRE9VQkxFKHgpICgoeCkgJiAoKCgoeCkmT1JDX1VJTlQ2NF9DKDB4N2ZmMDAwMDAwMDAwMDAwMCkpID09IDApID8gT1JDX1VJTlQ2NF9DKDB4ZmZmMDAwMDAwMDAwMDAwMCkgOiBPUkNfVUlOVDY0X0MoMHhmZmZmZmZmZmZmZmZmZmZmKSkpCisjZGVmaW5lIE9SQ19JU05BTl9ET1VCTEUoeCkgKCgoKHgpJk9SQ19VSU5UNjRfQygweDdmZjAwMDAwMDAwMDAwMDApKSA9PSBPUkNfVUlOVDY0X0MoMHg3ZmYwMDAwMDAwMDAwMDAwKSkgJiYgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4MDAwZmZmZmZmZmZmZmZmZikpICE9IDApKQorI2lmbmRlZiBPUkNfUkVTVFJJQ1QKKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorI2RlZmluZSBPUkNfUkVTVFJJQ1QgcmVzdHJpY3QKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDQKKyNkZWZpbmUgT1JDX1JFU1RSSUNUIF9fcmVzdHJpY3RfXworI2Vsc2UKKyNkZWZpbmUgT1JDX1JFU1RSSUNUCisjZW5kaWYKKyNlbmRpZgorLyogZW5kIE9yYyBDIHRhcmdldCBwcmVhbWJsZSAqLworCisKKworLyogYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9ub25lICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfbm9uZSAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjE2ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMTYgdmFyMzI7CisgIG9yY191bmlvbjE2IHZhcjMzOworICBvcmNfdW5pb24zMiB2YXIzNDsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGQxOworICBwdHI0ID0gKG9yY191bmlvbjE2ICopIHMxOworCisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWR3ICovCisgICAgdmFyMzIgPSBwdHI0W2ldOworICAgIC8qIDE6IGxvYWR3ICovCisgICAgdmFyMzMgPSBwdHI0W2ldOworICAgIC8qIDI6IG1lcmdld2wgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyMzIuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyMzMuaTsKKyAgICAgIHZhcjM0LmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiAzOiBzdG9yZWwgKi8KKyAgICBwdHIwW2ldID0gdmFyMzQ7CisgIH0KKworfQorCisjZWxzZQorc3RhdGljIHZvaWQKK19iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9ub25lIChPcmNFeGVjdXRvciAqIE9SQ19SRVNUUklDVCBleCkKK3sKKyAgaW50IGk7CisgIGludCBuID0gZXgtPm47CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMTYgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb24xNiB2YXIzMjsKKyAgb3JjX3VuaW9uMTYgdmFyMzM7CisgIG9yY191bmlvbjMyIHZhcjM0OworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZXgtPmFycmF5c1swXTsKKyAgcHRyNCA9IChvcmNfdW5pb24xNiAqKSBleC0+YXJyYXlzWzRdOworCisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWR3ICovCisgICAgdmFyMzIgPSBwdHI0W2ldOworICAgIC8qIDE6IGxvYWR3ICovCisgICAgdmFyMzMgPSBwdHI0W2ldOworICAgIC8qIDI6IG1lcmdld2wgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyMzIuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyMzMuaTsKKyAgICAgIHZhcjM0LmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiAzOiBzdG9yZWwgKi8KKyAgICBwdHIwW2ldID0gdmFyMzQ7CisgIH0KKworfQorCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX25vbmUgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnaW50MTYgKiBPUkNfUkVTVFJJQ1QgczEsIGludCBuKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgOSwgMzksIDk3LCAxMTcsIDEwMCwgMTA1LCAxMTEsIDExMiwgOTcsIDExMCwgMTExLCAxMTQsIDk3LCAxMDksIDk3LAorICAgICAgICAxMDksIDk1LCAxMTEsIDExNCwgOTksIDk1LCAxMTIsIDExNCwgMTExLCA5OSwgMTAxLCAxMTUsIDExNSwgOTUsIDExNSwKKyAgICAgICAgNDksCisgICAgICAgIDU0LCA5NSwgOTksIDEwNCwgNDksIDk1LCAxMTAsIDExMSwgMTEwLCAxMDEsIDExLCA0LCA0LCAxMiwgMiwgMiwKKyAgICAgICAgMTk1LCAwLCA0LCA0LCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX25vbmUpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfbm9uZSIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfbm9uZSk7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDQsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgMiwgInMxIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibWVyZ2V3bCIsIDAsIE9SQ19WQVJfRDEsIE9SQ19WQVJfUzEsIE9SQ19WQVJfUzEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisjZW5kaWYKKworICAgICAgb3JjX3Byb2dyYW1fY29tcGlsZSAocCk7CisgICAgICBjID0gb3JjX3Byb2dyYW1fdGFrZV9jb2RlIChwKTsKKyAgICAgIG9yY19wcm9ncmFtX2ZyZWUgKHApOworICAgIH0KKyAgICBwX2luaXRlZCA9IFRSVUU7CisgICAgb3JjX29uY2VfbXV0ZXhfdW5sb2NrICgpOworICB9CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9BMl0gPSBjOworICBleC0+cHJvZ3JhbSA9IDA7CisKKyAgZXgtPm4gPSBuOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9ub25lICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfbm9uZSAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdmbG9hdCAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMzIgdmFyMzI7CisgIG9yY191bmlvbjMyIHZhcjMzOworICBvcmNfdW5pb242NCB2YXIzNDsKKworICBwdHIwID0gKG9yY191bmlvbjY0ICopIGQxOworICBwdHI0ID0gKG9yY191bmlvbjMyICopIHMxOworCisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRsICovCisgICAgdmFyMzIgPSBwdHI0W2ldOworICAgIC8qIDE6IGxvYWRsICovCisgICAgdmFyMzMgPSBwdHI0W2ldOworICAgIC8qIDI6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyMzIuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyMzMuaTsKKyAgICAgIHZhcjM0LmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiAzOiBzdG9yZXEgKi8KKyAgICBwdHIwW2ldID0gdmFyMzQ7CisgIH0KKworfQorCisjZWxzZQorc3RhdGljIHZvaWQKK19iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9ub25lIChPcmNFeGVjdXRvciAqIE9SQ19SRVNUUklDVCBleCkKK3sKKyAgaW50IGk7CisgIGludCBuID0gZXgtPm47CisgIG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb24zMiB2YXIzMjsKKyAgb3JjX3VuaW9uMzIgdmFyMzM7CisgIG9yY191bmlvbjY0IHZhcjM0OworCisgIHB0cjAgPSAob3JjX3VuaW9uNjQgKikgZXgtPmFycmF5c1swXTsKKyAgcHRyNCA9IChvcmNfdW5pb24zMiAqKSBleC0+YXJyYXlzWzRdOworCisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRsICovCisgICAgdmFyMzIgPSBwdHI0W2ldOworICAgIC8qIDE6IGxvYWRsICovCisgICAgdmFyMzMgPSBwdHI0W2ldOworICAgIC8qIDI6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyMzIuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyMzMuaTsKKyAgICAgIHZhcjM0LmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiAzOiBzdG9yZXEgKi8KKyAgICBwdHIwW2ldID0gdmFyMzQ7CisgIH0KKworfQorCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX25vbmUgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGludCBuKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgOSwgMzksIDk3LCAxMTcsIDEwMCwgMTA1LCAxMTEsIDExMiwgOTcsIDExMCwgMTExLCAxMTQsIDk3LCAxMDksIDk3LAorICAgICAgICAxMDksIDk1LCAxMTEsIDExNCwgOTksIDk1LCAxMTIsIDExNCwgMTExLCA5OSwgMTAxLCAxMTUsIDExNSwgOTUsIDEwMiwKKyAgICAgICAgNTEsCisgICAgICAgIDUwLCA5NSwgOTksIDEwNCwgNDksIDk1LCAxMTAsIDExMSwgMTEwLCAxMDEsIDExLCA4LCA4LCAxMiwgNCwgNCwKKyAgICAgICAgMTk0LCAwLCA0LCA0LCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX25vbmUpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfbm9uZSIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfbm9uZSk7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDgsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgNCwgInMxIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibWVyZ2VscSIsIDAsIE9SQ19WQVJfRDEsIE9SQ19WQVJfUzEsIE9SQ19WQVJfUzEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisjZW5kaWYKKworICAgICAgb3JjX3Byb2dyYW1fY29tcGlsZSAocCk7CisgICAgICBjID0gb3JjX3Byb2dyYW1fdGFrZV9jb2RlIChwKTsKKyAgICAgIG9yY19wcm9ncmFtX2ZyZWUgKHApOworICAgIH0KKyAgICBwX2luaXRlZCA9IFRSVUU7CisgICAgb3JjX29uY2VfbXV0ZXhfdW5sb2NrICgpOworICB9CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9BMl0gPSBjOworICBleC0+cHJvZ3JhbSA9IDA7CisKKyAgZXgtPm4gPSBuOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9ub25lICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfbm9uZSAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMzIgdmFyMzI7CisgIG9yY191bmlvbjMyIHZhcjMzOworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZDE7CisgIHB0cjQgPSAob3JjX3VuaW9uMzIgKikgczE7CisKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGwgKi8KKyAgICB2YXIzMiA9IHB0cjRbaV07CisgICAgLyogMTogY29weXcgKi8KKyAgICB2YXIzMy54MlswXSA9IHZhcjMyLngyWzBdOworICAgIHZhcjMzLngyWzFdID0gdmFyMzIueDJbMV07CisgICAgLyogMjogc3RvcmVsICovCisgICAgcHRyMFtpXSA9IHZhcjMzOworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfbm9uZSAoT3JjRXhlY3V0b3IgKiBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgbiA9IGV4LT5uOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMzIgdmFyMzI7CisgIG9yY191bmlvbjMyIHZhcjMzOworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZXgtPmFycmF5c1swXTsKKyAgcHRyNCA9IChvcmNfdW5pb24zMiAqKSBleC0+YXJyYXlzWzRdOworCisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRsICovCisgICAgdmFyMzIgPSBwdHI0W2ldOworICAgIC8qIDE6IGNvcHl3ICovCisgICAgdmFyMzMueDJbMF0gPSB2YXIzMi54MlswXTsKKyAgICB2YXIzMy54MlsxXSA9IHZhcjMyLngyWzFdOworICAgIC8qIDI6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzMzsKKyAgfQorCit9CisKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfbm9uZSAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA5LCAzOSwgOTcsIDExNywgMTAwLCAxMDUsIDExMSwgMTEyLCA5NywgMTEwLCAxMTEsIDExNCwgOTcsIDEwOSwgOTcsCisgICAgICAgIDEwOSwgOTUsIDExMSwgMTE0LCA5OSwgOTUsIDExMiwgMTE0LCAxMTEsIDk5LCAxMDEsIDExNSwgMTE1LCA5NSwgMTE1LAorICAgICAgICA0OSwKKyAgICAgICAgNTQsIDk1LCA5OSwgMTA0LCA1MCwgOTUsIDExMCwgMTExLCAxMTAsIDEwMSwgMTEsIDQsIDQsIDEyLCA0LCA0LAorICAgICAgICAyMSwgMSwgNzksIDAsIDQsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfbm9uZSk7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9uYW1lIChwLCAiYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9ub25lIik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9ub25lKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9kZXN0aW5hdGlvbiAocCwgNCwgImQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCA0LCAiczEiKTsKKworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb3B5dyIsIDEsIE9SQ19WQVJfRDEsIE9SQ19WQVJfUzEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisjZW5kaWYKKworICAgICAgb3JjX3Byb2dyYW1fY29tcGlsZSAocCk7CisgICAgICBjID0gb3JjX3Byb2dyYW1fdGFrZV9jb2RlIChwKTsKKyAgICAgIG9yY19wcm9ncmFtX2ZyZWUgKHApOworICAgIH0KKyAgICBwX2luaXRlZCA9IFRSVUU7CisgICAgb3JjX29uY2VfbXV0ZXhfdW5sb2NrICgpOworICB9CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9BMl0gPSBjOworICBleC0+cHJvZ3JhbSA9IDA7CisKKyAgZXgtPm4gPSBuOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9ub25lICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfbm9uZSAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdmbG9hdCAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uNjQgdmFyMzI7CisgIG9yY191bmlvbjY0IHZhcjMzOworCisgIHB0cjAgPSAob3JjX3VuaW9uNjQgKikgZDE7CisgIHB0cjQgPSAob3JjX3VuaW9uNjQgKikgczE7CisKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZHEgKi8KKyAgICB2YXIzMiA9IHB0cjRbaV07CisgICAgLyogMTogY29weWwgKi8KKyAgICB2YXIzMy54MlswXSA9IHZhcjMyLngyWzBdOworICAgIHZhcjMzLngyWzFdID0gdmFyMzIueDJbMV07CisgICAgLyogMjogc3RvcmVxICovCisgICAgcHRyMFtpXSA9IHZhcjMzOworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfbm9uZSAoT3JjRXhlY3V0b3IgKiBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgbiA9IGV4LT5uOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uNjQgdmFyMzI7CisgIG9yY191bmlvbjY0IHZhcjMzOworCisgIHB0cjAgPSAob3JjX3VuaW9uNjQgKikgZXgtPmFycmF5c1swXTsKKyAgcHRyNCA9IChvcmNfdW5pb242NCAqKSBleC0+YXJyYXlzWzRdOworCisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRxICovCisgICAgdmFyMzIgPSBwdHI0W2ldOworICAgIC8qIDE6IGNvcHlsICovCisgICAgdmFyMzMueDJbMF0gPSB2YXIzMi54MlswXTsKKyAgICB2YXIzMy54MlsxXSA9IHZhcjMyLngyWzFdOworICAgIC8qIDI6IHN0b3JlcSAqLworICAgIHB0cjBbaV0gPSB2YXIzMzsKKyAgfQorCit9CisKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfbm9uZSAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdmbG9hdCAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA5LCAzOSwgOTcsIDExNywgMTAwLCAxMDUsIDExMSwgMTEyLCA5NywgMTEwLCAxMTEsIDExNCwgOTcsIDEwOSwgOTcsCisgICAgICAgIDEwOSwgOTUsIDExMSwgMTE0LCA5OSwgOTUsIDExMiwgMTE0LCAxMTEsIDk5LCAxMDEsIDExNSwgMTE1LCA5NSwgMTAyLAorICAgICAgICA1MSwKKyAgICAgICAgNTAsIDk1LCA5OSwgMTA0LCA1MCwgOTUsIDExMCwgMTExLCAxMTAsIDEwMSwgMTEsIDgsIDgsIDEyLCA4LCA4LAorICAgICAgICAyMSwgMSwgMTEyLCAwLCA0LCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX25vbmUpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfbm9uZSIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfbm9uZSk7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDgsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgOCwgInMxIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29weWwiLCAxLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1MxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX0QxXSA9IGQxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzFdID0gKHZvaWQgKikgczE7CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfcHN5ICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfcHN5IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKQoreworICBpbnQgaTsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24xNiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjE2IHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uMzIgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisgIG9yY191bmlvbjMyIHZhcjQxOworICBvcmNfdW5pb24zMiB2YXI0MjsKKyAgb3JjX3VuaW9uNjQgdmFyNDM7CisgIG9yY191bmlvbjY0IHZhcjQ0OworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZDE7CisgIHB0cjQgPSAob3JjX3VuaW9uMTYgKikgczE7CisKKyAgLyogMzogbG9hZHBsICovCisgIHZhcjM2LmYgPSBwMjsKKyAgLyogNTogbG9hZHBsICovCisgIHZhcjM3LmYgPSBwMTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZHcgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMTogY29udnN3bCAqLworICAgIHZhcjM5LmkgPSB2YXIzNS5pOworICAgIC8qIDI6IGNvbnZsZiAqLworICAgIHZhcjQwLmYgPSB2YXIzOS5pOworICAgIC8qIDQ6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDAuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNi5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0MS5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDY6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDAuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNy5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0Mi5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDc6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyNDIuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDEuaTsKKyAgICAgIHZhcjQzLmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiA4OiBjb252ZmwgKi8KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzBdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMF0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzBdID0gdG1wOworICAgIH0KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzFdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMV0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzFdID0gdG1wOworICAgIH0KKyAgICAvKiA5OiBjb252c3NzbHcgKi8KKyAgICB2YXIzOC54MlswXSA9IE9SQ19DTEFNUF9TVyAodmFyNDQueDJbMF0pOworICAgIHZhcjM4LngyWzFdID0gT1JDX0NMQU1QX1NXICh2YXI0NC54MlsxXSk7CisgICAgLyogMTA6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzODsKKyAgfQorCit9CisKKyNlbHNlCitzdGF0aWMgdm9pZAorX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3BzeSAoT3JjRXhlY3V0b3IgKiBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgbiA9IGV4LT5uOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjE2ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMTYgdmFyMzU7CisgIG9yY191bmlvbjMyIHZhcjM2OworICBvcmNfdW5pb24zMiB2YXIzNzsKKyAgb3JjX3VuaW9uMzIgdmFyMzg7CisgIG9yY191bmlvbjMyIHZhcjM5OworICBvcmNfdW5pb24zMiB2YXI0MDsKKyAgb3JjX3VuaW9uMzIgdmFyNDE7CisgIG9yY191bmlvbjMyIHZhcjQyOworICBvcmNfdW5pb242NCB2YXI0MzsKKyAgb3JjX3VuaW9uNjQgdmFyNDQ7CisKKyAgcHRyMCA9IChvcmNfdW5pb24zMiAqKSBleC0+YXJyYXlzWzBdOworICBwdHI0ID0gKG9yY191bmlvbjE2ICopIGV4LT5hcnJheXNbNF07CisKKyAgLyogMzogbG9hZHBsICovCisgIHZhcjM2LmkgPSBleC0+cGFyYW1zWzI1XTsKKyAgLyogNTogbG9hZHBsICovCisgIHZhcjM3LmkgPSBleC0+cGFyYW1zWzI0XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZHcgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMTogY29udnN3bCAqLworICAgIHZhcjM5LmkgPSB2YXIzNS5pOworICAgIC8qIDI6IGNvbnZsZiAqLworICAgIHZhcjQwLmYgPSB2YXIzOS5pOworICAgIC8qIDQ6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDAuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNi5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0MS5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDY6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDAuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNy5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0Mi5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDc6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyNDIuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDEuaTsKKyAgICAgIHZhcjQzLmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiA4OiBjb252ZmwgKi8KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzBdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMF0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzBdID0gdG1wOworICAgIH0KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzFdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMV0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzFdID0gdG1wOworICAgIH0KKyAgICAvKiA5OiBjb252c3NzbHcgKi8KKyAgICB2YXIzOC54MlswXSA9IE9SQ19DTEFNUF9TVyAodmFyNDQueDJbMF0pOworICAgIHZhcjM4LngyWzFdID0gT1JDX0NMQU1QX1NXICh2YXI0NC54MlsxXSk7CisgICAgLyogMTA6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzODsKKyAgfQorCit9CisKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfcHN5IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgOSwgMzgsIDk3LCAxMTcsIDEwMCwgMTA1LCAxMTEsIDExMiwgOTcsIDExMCwgMTExLCAxMTQsIDk3LCAxMDksIDk3LAorICAgICAgICAxMDksIDk1LCAxMTEsIDExNCwgOTksIDk1LCAxMTIsIDExNCwgMTExLCA5OSwgMTAxLCAxMTUsIDExNSwgOTUsIDExNSwKKyAgICAgICAgNDksCisgICAgICAgIDU0LCA5NSwgOTksIDEwNCwgNDksIDk1LCAxMTIsIDExNSwgMTIxLCAxMSwgNCwgNCwgMTIsIDIsIDIsIDE3LAorICAgICAgICA0LCAxNywgNCwgMjAsIDgsIDIwLCA0LCAyMCwgNCwgMTUzLCAzMywgNCwgMjExLCAzMywgMzMsIDIwMiwKKyAgICAgICAgMzQsIDMzLCAyNSwgMjAyLCAzMywgMzMsIDI0LCAxOTQsIDMyLCAzMywgMzQsIDIxLCAxLCAyMTAsIDMyLCAzMiwKKyAgICAgICAgMjEsIDEsIDE2NSwgMCwgMzIsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfcHN5KTsKKyNlbHNlCisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3ICgpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X25hbWUgKHAsICJhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3BzeSIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfcHN5KTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9kZXN0aW5hdGlvbiAocCwgNCwgImQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCAyLCAiczEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXJfZmxvYXQgKHAsIDQsICJwMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAyIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA4LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQzIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnN3bCIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfUzEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZsZiIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDIsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGYiLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1AyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtdWxmIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9QMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibWVyZ2VscSIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDMsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZmbCIsIDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZzc3NsdyIsIDEsIE9SQ19WQVJfRDEsIE9SQ19WQVJfVDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9EMSk7CisjZW5kaWYKKworICAgICAgb3JjX3Byb2dyYW1fY29tcGlsZSAocCk7CisgICAgICBjID0gb3JjX3Byb2dyYW1fdGFrZV9jb2RlIChwKTsKKyAgICAgIG9yY19wcm9ncmFtX2ZyZWUgKHApOworICAgIH0KKyAgICBwX2luaXRlZCA9IFRSVUU7CisgICAgb3JjX29uY2VfbXV0ZXhfdW5sb2NrICgpOworICB9CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9BMl0gPSBjOworICBleC0+cHJvZ3JhbSA9IDA7CisKKyAgZXgtPm4gPSBuOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKyAgeworICAgIG9yY191bmlvbjMyIHRtcDsKKyAgICB0bXAuZiA9IHAxOworICAgIGV4LT5wYXJhbXNbT1JDX1ZBUl9QMV0gPSB0bXAuaTsKKyAgfQorICB7CisgICAgb3JjX3VuaW9uMzIgdG1wOworICAgIHRtcC5mID0gcDI7CisgICAgZXgtPnBhcmFtc1tPUkNfVkFSX1AyXSA9IHRtcC5pOworICB9CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfcHN5ICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfcHN5IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKQoreworICBpbnQgaTsKKyAgb3JjX3VuaW9uNjQgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjMyIHZhcjM0OworICBvcmNfdW5pb24zMiB2YXIzNTsKKyAgb3JjX3VuaW9uMzIgdmFyMzY7CisgIG9yY191bmlvbjMyIHZhcjM3OworICBvcmNfdW5pb242NCB2YXIzODsKKyAgb3JjX3VuaW9uMzIgdmFyMzk7CisgIG9yY191bmlvbjMyIHZhcjQwOworCisgIHB0cjAgPSAob3JjX3VuaW9uNjQgKikgZDE7CisgIHB0cjQgPSAob3JjX3VuaW9uMzIgKikgczE7CisKKyAgLyogMTogbG9hZHBsICovCisgIHZhcjM1LmYgPSBwMjsKKyAgLyogNDogbG9hZHBsICovCisgIHZhcjM3LmYgPSBwMTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGwgKi8KKyAgICB2YXIzNCA9IHB0cjRbaV07CisgICAgLyogMjogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXIzNC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM1LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjM5LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogMzogbG9hZGwgKi8KKyAgICB2YXIzNiA9IHB0cjRbaV07CisgICAgLyogNTogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXIzNi5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM3LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQwLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogNjogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXI0MC5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXIzOS5pOworICAgICAgdmFyMzguaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDc6IHN0b3JlcSAqLworICAgIHB0cjBbaV0gPSB2YXIzODsKKyAgfQorCit9CisKKyNlbHNlCitzdGF0aWMgdm9pZAorX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX3BzeSAoT3JjRXhlY3V0b3IgKiBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgbiA9IGV4LT5uOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMzIgdmFyMzQ7CisgIG9yY191bmlvbjMyIHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uMzIgdmFyMzc7CisgIG9yY191bmlvbjY0IHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisKKyAgcHRyMCA9IChvcmNfdW5pb242NCAqKSBleC0+YXJyYXlzWzBdOworICBwdHI0ID0gKG9yY191bmlvbjMyICopIGV4LT5hcnJheXNbNF07CisKKyAgLyogMTogbG9hZHBsICovCisgIHZhcjM1LmkgPSBleC0+cGFyYW1zWzI1XTsKKyAgLyogNDogbG9hZHBsICovCisgIHZhcjM3LmkgPSBleC0+cGFyYW1zWzI0XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGwgKi8KKyAgICB2YXIzNCA9IHB0cjRbaV07CisgICAgLyogMjogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXIzNC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM1LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjM5LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogMzogbG9hZGwgKi8KKyAgICB2YXIzNiA9IHB0cjRbaV07CisgICAgLyogNTogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXIzNi5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM3LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQwLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogNjogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXI0MC5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXIzOS5pOworICAgICAgdmFyMzguaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDc6IHN0b3JlcSAqLworICAgIHB0cjBbaV0gPSB2YXIzODsKKyAgfQorCit9CisKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfcHN5IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgOSwgMzgsIDk3LCAxMTcsIDEwMCwgMTA1LCAxMTEsIDExMiwgOTcsIDExMCwgMTExLCAxMTQsIDk3LCAxMDksIDk3LAorICAgICAgICAxMDksIDk1LCAxMTEsIDExNCwgOTksIDk1LCAxMTIsIDExNCwgMTExLCA5OSwgMTAxLCAxMTUsIDExNSwgOTUsIDEwMiwKKyAgICAgICAgNTEsCisgICAgICAgIDUwLCA5NSwgOTksIDEwNCwgNDksIDk1LCAxMTIsIDExNSwgMTIxLCAxMSwgOCwgOCwgMTIsIDQsIDQsIDE3LAorICAgICAgICA0LCAxNywgNCwgMjAsIDQsIDIwLCA0LCAyMDIsIDMzLCA0LCAyNSwgMjAyLCAzMiwgNCwgMjQsIDE5NCwKKyAgICAgICAgMCwgMzIsIDMzLCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX3BzeSk7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9uYW1lIChwLCAiYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9wc3kiKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX3BzeSk7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDgsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgNCwgInMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfcGFyYW1ldGVyX2Zsb2F0IChwLCA0LCAicDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXJfZmxvYXQgKHAsIDQsICJwMiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDIiKTsKKworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtdWxmIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9TMSwgT1JDX1ZBUl9QMiwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsZiIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfUzEsIE9SQ19WQVJfUDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm1lcmdlbHEiLCAwLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX0QxXSA9IGQxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzFdID0gKHZvaWQgKikgczE7CisgIHsKKyAgICBvcmNfdW5pb24zMiB0bXA7CisgICAgdG1wLmYgPSBwMTsKKyAgICBleC0+cGFyYW1zW09SQ19WQVJfUDFdID0gdG1wLmk7CisgIH0KKyAgeworICAgIG9yY191bmlvbjMyIHRtcDsKKyAgICB0bXAuZiA9IHAyOworICAgIGV4LT5wYXJhbXNbT1JDX1ZBUl9QMl0gPSB0bXAuaTsKKyAgfQorCisgIGZ1bmMgPSBjLT5leGVjOworICBmdW5jIChleCk7Cit9CisjZW5kaWYKKworCisvKiBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3BzeV9yaWdodCAqLworI2lmZGVmIERJU0FCTEVfT1JDCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3BzeV9yaWdodCAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGZsb2F0IHAyLCBpbnQgbikKK3sKKyAgaW50IGk7CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uMzIgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uNjQgdmFyNDA7CisgIG9yY191bmlvbjY0IHZhcjQxOworICBvcmNfdW5pb24zMiB2YXI0MjsKKyAgb3JjX3VuaW9uMzIgdmFyNDM7CisgIG9yY191bmlvbjMyIHZhcjQ0OworICBvcmNfdW5pb24zMiB2YXI0NTsKKyAgb3JjX3VuaW9uMzIgdmFyNDY7CisgIG9yY191bmlvbjY0IHZhcjQ3OworICBvcmNfdW5pb242NCB2YXI0ODsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGQxOworICBwdHI0ID0gKG9yY191bmlvbjMyICopIHMxOworCisgIC8qIDU6IGxvYWRwbCAqLworICB2YXIzNy5mID0gcDI7CisgIC8qIDc6IGxvYWRwbCAqLworICB2YXIzOC5mID0gcDE7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRsICovCisgICAgdmFyMzYgPSBwdHI0W2ldOworICAgIC8qIDE6IGNvbnZzd2wgKi8KKyAgICB2YXI0MC54MlswXSA9IHZhcjM2LngyWzBdOworICAgIHZhcjQwLngyWzFdID0gdmFyMzYueDJbMV07CisgICAgLyogMjogY29udmxmICovCisgICAgdmFyNDEueDJmWzBdID0gdmFyNDAueDJbMF07CisgICAgdmFyNDEueDJmWzFdID0gdmFyNDAueDJbMV07CisgICAgLyogMzogc2VsZWN0MHFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjQxLmk7CisgICAgICB2YXI0Mi5pID0gX3NyYy54MlswXTsKKyAgICB9CisgICAgLyogNDogc2VsZWN0MXFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjQxLmk7CisgICAgICB2YXI0My5pID0gX3NyYy54MlsxXTsKKyAgICB9CisgICAgLyogNjogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0Mi5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM3LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQ0LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogODogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0Mi5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM4LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQ1LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogOTogYWRkZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0NC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjQzLmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICsgX3NyYzIuZjsKKyAgICAgIHZhcjQ2LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogMTA6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyNDUuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDYuaTsKKyAgICAgIHZhcjQ3LmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiAxMTogY29udmZsICovCisgICAgeworICAgICAgaW50IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIHZhcjQ3LngyZlswXTsKKyAgICAgIGlmICh0bXAgPT0gMHg4MDAwMDAwMCAmJiAhKHZhcjQ3LngyWzBdICYgMHg4MDAwMDAwMCkpCisgICAgICAgIHRtcCA9IDB4N2ZmZmZmZmY7CisgICAgICB2YXI0OC54MlswXSA9IHRtcDsKKyAgICB9CisgICAgeworICAgICAgaW50IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIHZhcjQ3LngyZlsxXTsKKyAgICAgIGlmICh0bXAgPT0gMHg4MDAwMDAwMCAmJiAhKHZhcjQ3LngyWzFdICYgMHg4MDAwMDAwMCkpCisgICAgICAgIHRtcCA9IDB4N2ZmZmZmZmY7CisgICAgICB2YXI0OC54MlsxXSA9IHRtcDsKKyAgICB9CisgICAgLyogMTI6IGNvbnZzc3NsdyAqLworICAgIHZhcjM5LngyWzBdID0gT1JDX0NMQU1QX1NXICh2YXI0OC54MlswXSk7CisgICAgdmFyMzkueDJbMV0gPSBPUkNfQ0xBTVBfU1cgKHZhcjQ4LngyWzFdKTsKKyAgICAvKiAxMzogc3RvcmVsICovCisgICAgcHRyMFtpXSA9IHZhcjM5OworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfcHN5X3JpZ2h0IChPcmNFeGVjdXRvciAqCisgICAgT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IG4gPSBleC0+bjsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjMyIHZhcjM2OworICBvcmNfdW5pb24zMiB2YXIzNzsKKyAgb3JjX3VuaW9uMzIgdmFyMzg7CisgIG9yY191bmlvbjMyIHZhcjM5OworICBvcmNfdW5pb242NCB2YXI0MDsKKyAgb3JjX3VuaW9uNjQgdmFyNDE7CisgIG9yY191bmlvbjMyIHZhcjQyOworICBvcmNfdW5pb24zMiB2YXI0MzsKKyAgb3JjX3VuaW9uMzIgdmFyNDQ7CisgIG9yY191bmlvbjMyIHZhcjQ1OworICBvcmNfdW5pb24zMiB2YXI0NjsKKyAgb3JjX3VuaW9uNjQgdmFyNDc7CisgIG9yY191bmlvbjY0IHZhcjQ4OworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZXgtPmFycmF5c1swXTsKKyAgcHRyNCA9IChvcmNfdW5pb24zMiAqKSBleC0+YXJyYXlzWzRdOworCisgIC8qIDU6IGxvYWRwbCAqLworICB2YXIzNy5pID0gZXgtPnBhcmFtc1syNV07CisgIC8qIDc6IGxvYWRwbCAqLworICB2YXIzOC5pID0gZXgtPnBhcmFtc1syNF07CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRsICovCisgICAgdmFyMzYgPSBwdHI0W2ldOworICAgIC8qIDE6IGNvbnZzd2wgKi8KKyAgICB2YXI0MC54MlswXSA9IHZhcjM2LngyWzBdOworICAgIHZhcjQwLngyWzFdID0gdmFyMzYueDJbMV07CisgICAgLyogMjogY29udmxmICovCisgICAgdmFyNDEueDJmWzBdID0gdmFyNDAueDJbMF07CisgICAgdmFyNDEueDJmWzFdID0gdmFyNDAueDJbMV07CisgICAgLyogMzogc2VsZWN0MHFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjQxLmk7CisgICAgICB2YXI0Mi5pID0gX3NyYy54MlswXTsKKyAgICB9CisgICAgLyogNDogc2VsZWN0MXFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjQxLmk7CisgICAgICB2YXI0My5pID0gX3NyYy54MlsxXTsKKyAgICB9CisgICAgLyogNjogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0Mi5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM3LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQ0LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogODogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0Mi5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM4LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQ1LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogOTogYWRkZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0NC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjQzLmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICsgX3NyYzIuZjsKKyAgICAgIHZhcjQ2LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogMTA6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyNDUuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDYuaTsKKyAgICAgIHZhcjQ3LmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiAxMTogY29udmZsICovCisgICAgeworICAgICAgaW50IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIHZhcjQ3LngyZlswXTsKKyAgICAgIGlmICh0bXAgPT0gMHg4MDAwMDAwMCAmJiAhKHZhcjQ3LngyWzBdICYgMHg4MDAwMDAwMCkpCisgICAgICAgIHRtcCA9IDB4N2ZmZmZmZmY7CisgICAgICB2YXI0OC54MlswXSA9IHRtcDsKKyAgICB9CisgICAgeworICAgICAgaW50IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIHZhcjQ3LngyZlsxXTsKKyAgICAgIGlmICh0bXAgPT0gMHg4MDAwMDAwMCAmJiAhKHZhcjQ3LngyWzFdICYgMHg4MDAwMDAwMCkpCisgICAgICAgIHRtcCA9IDB4N2ZmZmZmZmY7CisgICAgICB2YXI0OC54MlsxXSA9IHRtcDsKKyAgICB9CisgICAgLyogMTI6IGNvbnZzc3NsdyAqLworICAgIHZhcjM5LngyWzBdID0gT1JDX0NMQU1QX1NXICh2YXI0OC54MlswXSk7CisgICAgdmFyMzkueDJbMV0gPSBPUkNfQ0xBTVBfU1cgKHZhcjQ4LngyWzFdKTsKKyAgICAvKiAxMzogc3RvcmVsICovCisgICAgcHRyMFtpXSA9IHZhcjM5OworICB9CisKK30KKwordm9pZAorYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9wc3lfcmlnaHQgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnaW50MTYgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBmbG9hdCBwMiwgaW50IG4pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA5LCA0NCwgOTcsIDExNywgMTAwLCAxMDUsIDExMSwgMTEyLCA5NywgMTEwLCAxMTEsIDExNCwgOTcsIDEwOSwgOTcsCisgICAgICAgIDEwOSwgOTUsIDExMSwgMTE0LCA5OSwgOTUsIDExMiwgMTE0LCAxMTEsIDk5LCAxMDEsIDExNSwgMTE1LCA5NSwgMTE1LAorICAgICAgICA0OSwKKyAgICAgICAgNTQsIDk1LCA5OSwgMTA0LCA1MCwgOTUsIDExMiwgMTE1LCAxMjEsIDk1LCAxMTQsIDEwNSwgMTAzLCAxMDQsIDExNiwgMTEsCisgICAgICAgIDQsIDQsIDEyLCA0LCA0LCAxNywgNCwgMTcsIDQsIDIwLCA4LCAyMCwgNCwgMjAsIDQsIDIwLAorICAgICAgICA0LCAyMSwgMSwgMTUzLCAzMiwgNCwgMjEsIDEsIDIxMSwgMzIsIDMyLCAxOTIsIDMzLCAzMiwgMTkzLCAzNCwKKyAgICAgICAgMzIsIDIwMiwgMzUsIDMzLCAyNSwgMjAyLCAzMywgMzMsIDI0LCAyMDAsIDM0LCAzNSwgMzQsIDE5NCwgMzIsIDMzLAorICAgICAgICAzNCwgMjEsIDEsIDIxMCwgMzIsIDMyLCAyMSwgMSwgMTY1LCAwLCAzMiwgMiwgMCwKKyAgICAgIH07CisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3X2Zyb21fc3RhdGljX2J5dGVjb2RlIChiYyk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9wc3lfcmlnaHQpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfcHN5X3JpZ2h0Iik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9wc3lfcmlnaHQpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCA0LCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDQsICJzMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfcGFyYW1ldGVyX2Zsb2F0IChwLCA0LCAicDIiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDgsICJ0MSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQyIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDMiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0NCIpOworCisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZzd2wiLCAxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1MxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252bGYiLCAxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJzZWxlY3QwcWwiLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QxLAorICAgICAgICAgIE9SQ19WQVJfRDEsIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJzZWxlY3QxcWwiLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QxLAorICAgICAgICAgIE9SQ19WQVJfRDEsIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtdWxmIiwgMCwgT1JDX1ZBUl9UNCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9QMiwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsZiIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDIsIE9SQ19WQVJfUDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImFkZGYiLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1Q0LCBPUkNfVkFSX1QzLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtZXJnZWxxIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udmZsIiwgMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnNzc2x3IiwgMSwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1MxXSA9ICh2b2lkICopIHMxOworICB7CisgICAgb3JjX3VuaW9uMzIgdG1wOworICAgIHRtcC5mID0gcDE7CisgICAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHRtcC5pOworICB9CisgIHsKKyAgICBvcmNfdW5pb24zMiB0bXA7CisgICAgdG1wLmYgPSBwMjsKKyAgICBleC0+cGFyYW1zW09SQ19WQVJfUDJdID0gdG1wLmk7CisgIH0KKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9wc3lfbGVmdCAqLworI2lmZGVmIERJU0FCTEVfT1JDCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3BzeV9sZWZ0IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKQoreworICBpbnQgaTsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjMyIHZhcjM2OworICBvcmNfdW5pb24zMiB2YXIzNzsKKyAgb3JjX3VuaW9uMzIgdmFyMzg7CisgIG9yY191bmlvbjMyIHZhcjM5OworICBvcmNfdW5pb242NCB2YXI0MDsKKyAgb3JjX3VuaW9uNjQgdmFyNDE7CisgIG9yY191bmlvbjMyIHZhcjQyOworICBvcmNfdW5pb24zMiB2YXI0MzsKKyAgb3JjX3VuaW9uMzIgdmFyNDQ7CisgIG9yY191bmlvbjMyIHZhcjQ1OworICBvcmNfdW5pb24zMiB2YXI0NjsKKyAgb3JjX3VuaW9uNjQgdmFyNDc7CisgIG9yY191bmlvbjY0IHZhcjQ4OworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZDE7CisgIHB0cjQgPSAob3JjX3VuaW9uMzIgKikgczE7CisKKyAgLyogNTogbG9hZHBsICovCisgIHZhcjM3LmYgPSBwMTsKKyAgLyogNzogbG9hZHBsICovCisgIHZhcjM4LmYgPSBwMjsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGwgKi8KKyAgICB2YXIzNiA9IHB0cjRbaV07CisgICAgLyogMTogY29udnN3bCAqLworICAgIHZhcjQwLngyWzBdID0gdmFyMzYueDJbMF07CisgICAgdmFyNDAueDJbMV0gPSB2YXIzNi54MlsxXTsKKyAgICAvKiAyOiBjb252bGYgKi8KKyAgICB2YXI0MS54MmZbMF0gPSB2YXI0MC54MlswXTsKKyAgICB2YXI0MS54MmZbMV0gPSB2YXI0MC54MlsxXTsKKyAgICAvKiAzOiBzZWxlY3QwcWwgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfc3JjOworICAgICAgX3NyYy5pID0gdmFyNDEuaTsKKyAgICAgIHZhcjQyLmkgPSBfc3JjLngyWzBdOworICAgIH0KKyAgICAvKiA0OiBzZWxlY3QxcWwgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfc3JjOworICAgICAgX3NyYy5pID0gdmFyNDEuaTsKKyAgICAgIHZhcjQzLmkgPSBfc3JjLngyWzFdOworICAgIH0KKyAgICAvKiA2OiBtdWxmICovCisgICAgeworICAgICAgb3JjX3VuaW9uMzIgX3NyYzE7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMjsKKyAgICAgIG9yY191bmlvbjMyIF9kZXN0MTsKKyAgICAgIF9zcmMxLmkgPSBPUkNfREVOT1JNQUwgKHZhcjQzLmkpOworICAgICAgX3NyYzIuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzcuaSk7CisgICAgICBfZGVzdDEuZiA9IF9zcmMxLmYgKiBfc3JjMi5mOworICAgICAgdmFyNDQuaSA9IE9SQ19ERU5PUk1BTCAoX2Rlc3QxLmkpOworICAgIH0KKyAgICAvKiA4OiBtdWxmICovCisgICAgeworICAgICAgb3JjX3VuaW9uMzIgX3NyYzE7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMjsKKyAgICAgIG9yY191bmlvbjMyIF9kZXN0MTsKKyAgICAgIF9zcmMxLmkgPSBPUkNfREVOT1JNQUwgKHZhcjQzLmkpOworICAgICAgX3NyYzIuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzguaSk7CisgICAgICBfZGVzdDEuZiA9IF9zcmMxLmYgKiBfc3JjMi5mOworICAgICAgdmFyNDUuaSA9IE9SQ19ERU5PUk1BTCAoX2Rlc3QxLmkpOworICAgIH0KKyAgICAvKiA5OiBhZGRmICovCisgICAgeworICAgICAgb3JjX3VuaW9uMzIgX3NyYzE7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMjsKKyAgICAgIG9yY191bmlvbjMyIF9kZXN0MTsKKyAgICAgIF9zcmMxLmkgPSBPUkNfREVOT1JNQUwgKHZhcjQ0LmkpOworICAgICAgX3NyYzIuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDIuaSk7CisgICAgICBfZGVzdDEuZiA9IF9zcmMxLmYgKyBfc3JjMi5mOworICAgICAgdmFyNDYuaSA9IE9SQ19ERU5PUk1BTCAoX2Rlc3QxLmkpOworICAgIH0KKyAgICAvKiAxMDogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXI0Ni5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXI0NS5pOworICAgICAgdmFyNDcuaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDExOiBjb252ZmwgKi8KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDcueDJmWzBdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDcueDJbMF0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ4LngyWzBdID0gdG1wOworICAgIH0KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDcueDJmWzFdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDcueDJbMV0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ4LngyWzFdID0gdG1wOworICAgIH0KKyAgICAvKiAxMjogY29udnNzc2x3ICovCisgICAgdmFyMzkueDJbMF0gPSBPUkNfQ0xBTVBfU1cgKHZhcjQ4LngyWzBdKTsKKyAgICB2YXIzOS54MlsxXSA9IE9SQ19DTEFNUF9TVyAodmFyNDgueDJbMV0pOworICAgIC8qIDEzOiBzdG9yZWwgKi8KKyAgICBwdHIwW2ldID0gdmFyMzk7CisgIH0KKworfQorCisjZWxzZQorc3RhdGljIHZvaWQKK19iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9wc3lfbGVmdCAoT3JjRXhlY3V0b3IgKgorICAgIE9SQ19SRVNUUklDVCBleCkKK3sKKyAgaW50IGk7CisgIGludCBuID0gZXgtPm47CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uMzIgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uNjQgdmFyNDA7CisgIG9yY191bmlvbjY0IHZhcjQxOworICBvcmNfdW5pb24zMiB2YXI0MjsKKyAgb3JjX3VuaW9uMzIgdmFyNDM7CisgIG9yY191bmlvbjMyIHZhcjQ0OworICBvcmNfdW5pb24zMiB2YXI0NTsKKyAgb3JjX3VuaW9uMzIgdmFyNDY7CisgIG9yY191bmlvbjY0IHZhcjQ3OworICBvcmNfdW5pb242NCB2YXI0ODsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGV4LT5hcnJheXNbMF07CisgIHB0cjQgPSAob3JjX3VuaW9uMzIgKikgZXgtPmFycmF5c1s0XTsKKworICAvKiA1OiBsb2FkcGwgKi8KKyAgdmFyMzcuaSA9IGV4LT5wYXJhbXNbMjRdOworICAvKiA3OiBsb2FkcGwgKi8KKyAgdmFyMzguaSA9IGV4LT5wYXJhbXNbMjVdOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkbCAqLworICAgIHZhcjM2ID0gcHRyNFtpXTsKKyAgICAvKiAxOiBjb252c3dsICovCisgICAgdmFyNDAueDJbMF0gPSB2YXIzNi54MlswXTsKKyAgICB2YXI0MC54MlsxXSA9IHZhcjM2LngyWzFdOworICAgIC8qIDI6IGNvbnZsZiAqLworICAgIHZhcjQxLngyZlswXSA9IHZhcjQwLngyWzBdOworICAgIHZhcjQxLngyZlsxXSA9IHZhcjQwLngyWzFdOworICAgIC8qIDM6IHNlbGVjdDBxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXI0MS5pOworICAgICAgdmFyNDIuaSA9IF9zcmMueDJbMF07CisgICAgfQorICAgIC8qIDQ6IHNlbGVjdDFxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXI0MS5pOworICAgICAgdmFyNDMuaSA9IF9zcmMueDJbMV07CisgICAgfQorICAgIC8qIDY6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDMuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNy5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0NC5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDg6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDMuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzOC5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0NS5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDk6IGFkZGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDQuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXI0Mi5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiArIF9zcmMyLmY7CisgICAgICB2YXI0Ni5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDEwOiBtZXJnZWxxICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX2Rlc3Q7CisgICAgICBfZGVzdC54MlswXSA9IHZhcjQ2Lmk7CisgICAgICBfZGVzdC54MlsxXSA9IHZhcjQ1Lmk7CisgICAgICB2YXI0Ny5pID0gX2Rlc3QuaTsKKyAgICB9CisgICAgLyogMTE6IGNvbnZmbCAqLworICAgIHsKKyAgICAgIGludCB0bXA7CisgICAgICB0bXAgPSAoaW50KSB2YXI0Ny54MmZbMF07CisgICAgICBpZiAodG1wID09IDB4ODAwMDAwMDAgJiYgISh2YXI0Ny54MlswXSAmIDB4ODAwMDAwMDApKQorICAgICAgICB0bXAgPSAweDdmZmZmZmZmOworICAgICAgdmFyNDgueDJbMF0gPSB0bXA7CisgICAgfQorICAgIHsKKyAgICAgIGludCB0bXA7CisgICAgICB0bXAgPSAoaW50KSB2YXI0Ny54MmZbMV07CisgICAgICBpZiAodG1wID09IDB4ODAwMDAwMDAgJiYgISh2YXI0Ny54MlsxXSAmIDB4ODAwMDAwMDApKQorICAgICAgICB0bXAgPSAweDdmZmZmZmZmOworICAgICAgdmFyNDgueDJbMV0gPSB0bXA7CisgICAgfQorICAgIC8qIDEyOiBjb252c3NzbHcgKi8KKyAgICB2YXIzOS54MlswXSA9IE9SQ19DTEFNUF9TVyAodmFyNDgueDJbMF0pOworICAgIHZhcjM5LngyWzFdID0gT1JDX0NMQU1QX1NXICh2YXI0OC54MlsxXSk7CisgICAgLyogMTM6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzOTsKKyAgfQorCit9CisKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfcHN5X2xlZnQgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnaW50MTYgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBmbG9hdCBwMiwgaW50IG4pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA5LCA0MywgOTcsIDExNywgMTAwLCAxMDUsIDExMSwgMTEyLCA5NywgMTEwLCAxMTEsIDExNCwgOTcsIDEwOSwgOTcsCisgICAgICAgIDEwOSwgOTUsIDExMSwgMTE0LCA5OSwgOTUsIDExMiwgMTE0LCAxMTEsIDk5LCAxMDEsIDExNSwgMTE1LCA5NSwgMTE1LAorICAgICAgICA0OSwKKyAgICAgICAgNTQsIDk1LCA5OSwgMTA0LCA1MCwgOTUsIDExMiwgMTE1LCAxMjEsIDk1LCAxMDgsIDEwMSwgMTAyLCAxMTYsIDExLCA0LAorICAgICAgICA0LCAxMiwgNCwgNCwgMTcsIDQsIDE3LCA0LCAyMCwgOCwgMjAsIDQsIDIwLCA0LCAyMCwgNCwKKyAgICAgICAgMjEsIDEsIDE1MywgMzIsIDQsIDIxLCAxLCAyMTEsIDMyLCAzMiwgMTkyLCAzMywgMzIsIDE5MywgMzUsIDMyLAorICAgICAgICAyMDIsIDM0LCAzNSwgMjQsIDIwMiwgMzUsIDM1LCAyNSwgMjAwLCAzMywgMzQsIDMzLCAxOTQsIDMyLCAzMywgMzUsCisgICAgICAgIDIxLCAxLCAyMTAsIDMyLCAzMiwgMjEsIDEsIDE2NSwgMCwgMzIsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfcHN5X2xlZnQpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfcHN5X2xlZnQiKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3BzeV9sZWZ0KTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9kZXN0aW5hdGlvbiAocCwgNCwgImQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCA0LCAiczEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXJfZmxvYXQgKHAsIDQsICJwMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAyIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA4LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQzIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDQiKTsKKworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252c3dsIiwgMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9TMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udmxmIiwgMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MHFsIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MXFsIiwgMCwgT1JDX1ZBUl9UNCwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsZiIsIDAsIE9SQ19WQVJfVDMsIE9SQ19WQVJfVDQsIE9SQ19WQVJfUDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGYiLCAwLCBPUkNfVkFSX1Q0LCBPUkNfVkFSX1Q0LCBPUkNfVkFSX1AyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhZGRmIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9UMiwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibWVyZ2VscSIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDQsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZmbCIsIDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZzc3NsdyIsIDEsIE9SQ19WQVJfRDEsIE9SQ19WQVJfVDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9EMSk7CisjZW5kaWYKKworICAgICAgb3JjX3Byb2dyYW1fY29tcGlsZSAocCk7CisgICAgICBjID0gb3JjX3Byb2dyYW1fdGFrZV9jb2RlIChwKTsKKyAgICAgIG9yY19wcm9ncmFtX2ZyZWUgKHApOworICAgIH0KKyAgICBwX2luaXRlZCA9IFRSVUU7CisgICAgb3JjX29uY2VfbXV0ZXhfdW5sb2NrICgpOworICB9CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9BMl0gPSBjOworICBleC0+cHJvZ3JhbSA9IDA7CisKKyAgZXgtPm4gPSBuOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKyAgeworICAgIG9yY191bmlvbjMyIHRtcDsKKyAgICB0bXAuZiA9IHAxOworICAgIGV4LT5wYXJhbXNbT1JDX1ZBUl9QMV0gPSB0bXAuaTsKKyAgfQorICB7CisgICAgb3JjX3VuaW9uMzIgdG1wOworICAgIHRtcC5mID0gcDI7CisgICAgZXgtPnBhcmFtc1tPUkNfVkFSX1AyXSA9IHRtcC5pOworICB9CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfcHN5X3JpZ2h0ICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfcHN5X3JpZ2h0IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKQoreworICBpbnQgaTsKKyAgb3JjX3VuaW9uNjQgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjY0IHZhcjM1OworICBvcmNfdW5pb242NCB2YXIzNjsKKyAgb3JjX3VuaW9uMzIgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb242NCB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisgIG9yY191bmlvbjMyIHZhcjQxOworICBvcmNfdW5pb24zMiB2YXI0MjsKKyAgb3JjX3VuaW9uMzIgdmFyNDM7CisgIG9yY191bmlvbjMyIHZhcjQ0OworCisgIHB0cjAgPSAob3JjX3VuaW9uNjQgKikgZDE7CisgIHB0cjQgPSAob3JjX3VuaW9uNjQgKikgczE7CisKKyAgLyogNDogbG9hZHBsICovCisgIHZhcjM3LmYgPSBwMjsKKyAgLyogNjogbG9hZHBsICovCisgIHZhcjM4LmYgPSBwMTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZHEgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMTogc2VsZWN0MHFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM1Lmk7CisgICAgICB2YXI0MC5pID0gX3NyYy54MlswXTsKKyAgICB9CisgICAgLyogMjogbG9hZHEgKi8KKyAgICB2YXIzNiA9IHB0cjRbaV07CisgICAgLyogMzogc2VsZWN0MXFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM2Lmk7CisgICAgICB2YXI0MS5pID0gX3NyYy54MlsxXTsKKyAgICB9CisgICAgLyogNTogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0MC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM3LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQyLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogNzogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0MC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM4LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQzLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogODogYWRkZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0Mi5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjQxLmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICsgX3NyYzIuZjsKKyAgICAgIHZhcjQ0LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogOTogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXI0My5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXI0NC5pOworICAgICAgdmFyMzkuaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDEwOiBzdG9yZXEgKi8KKyAgICBwdHIwW2ldID0gdmFyMzk7CisgIH0KKworfQorCisjZWxzZQorc3RhdGljIHZvaWQKK19iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9wc3lfcmlnaHQgKE9yY0V4ZWN1dG9yICoKKyAgICBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgbiA9IGV4LT5uOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uNjQgdmFyMzU7CisgIG9yY191bmlvbjY0IHZhcjM2OworICBvcmNfdW5pb24zMiB2YXIzNzsKKyAgb3JjX3VuaW9uMzIgdmFyMzg7CisgIG9yY191bmlvbjY0IHZhcjM5OworICBvcmNfdW5pb24zMiB2YXI0MDsKKyAgb3JjX3VuaW9uMzIgdmFyNDE7CisgIG9yY191bmlvbjMyIHZhcjQyOworICBvcmNfdW5pb24zMiB2YXI0MzsKKyAgb3JjX3VuaW9uMzIgdmFyNDQ7CisKKyAgcHRyMCA9IChvcmNfdW5pb242NCAqKSBleC0+YXJyYXlzWzBdOworICBwdHI0ID0gKG9yY191bmlvbjY0ICopIGV4LT5hcnJheXNbNF07CisKKyAgLyogNDogbG9hZHBsICovCisgIHZhcjM3LmkgPSBleC0+cGFyYW1zWzI1XTsKKyAgLyogNjogbG9hZHBsICovCisgIHZhcjM4LmkgPSBleC0+cGFyYW1zWzI0XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZHEgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMTogc2VsZWN0MHFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM1Lmk7CisgICAgICB2YXI0MC5pID0gX3NyYy54MlswXTsKKyAgICB9CisgICAgLyogMjogbG9hZHEgKi8KKyAgICB2YXIzNiA9IHB0cjRbaV07CisgICAgLyogMzogc2VsZWN0MXFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM2Lmk7CisgICAgICB2YXI0MS5pID0gX3NyYy54MlsxXTsKKyAgICB9CisgICAgLyogNTogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0MC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM3LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQyLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogNzogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0MC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM4LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQzLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogODogYWRkZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0Mi5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjQxLmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICsgX3NyYzIuZjsKKyAgICAgIHZhcjQ0LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogOTogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXI0My5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXI0NC5pOworICAgICAgdmFyMzkuaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDEwOiBzdG9yZXEgKi8KKyAgICBwdHIwW2ldID0gdmFyMzk7CisgIH0KKworfQorCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3BzeV9yaWdodCAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdmbG9hdCAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGZsb2F0IHAyLCBpbnQgbikKK3sKKyAgT3JjRXhlY3V0b3IgX2V4LCAqZXggPSAmX2V4OworICBzdGF0aWMgdm9sYXRpbGUgaW50IHBfaW5pdGVkID0gMDsKKyAgc3RhdGljIE9yY0NvZGUgKmMgPSAwOworICB2b2lkICgqZnVuYykgKE9yY0V4ZWN1dG9yICopOworCisgIGlmICghcF9pbml0ZWQpIHsKKyAgICBvcmNfb25jZV9tdXRleF9sb2NrICgpOworICAgIGlmICghcF9pbml0ZWQpIHsKKyAgICAgIE9yY1Byb2dyYW0gKnA7CisKKyNpZiAxCisgICAgICBzdGF0aWMgY29uc3Qgb3JjX3VpbnQ4IGJjW10gPSB7CisgICAgICAgIDEsIDksIDQ0LCA5NywgMTE3LCAxMDAsIDEwNSwgMTExLCAxMTIsIDk3LCAxMTAsIDExMSwgMTE0LCA5NywgMTA5LCA5NywKKyAgICAgICAgMTA5LCA5NSwgMTExLCAxMTQsIDk5LCA5NSwgMTEyLCAxMTQsIDExMSwgOTksIDEwMSwgMTE1LCAxMTUsIDk1LCAxMDIsCisgICAgICAgIDUxLAorICAgICAgICA1MCwgOTUsIDk5LCAxMDQsIDUwLCA5NSwgMTEyLCAxMTUsIDEyMSwgOTUsIDExNCwgMTA1LCAxMDMsIDEwNCwgMTE2LCAxMSwKKyAgICAgICAgOCwgOCwgMTIsIDgsIDgsIDE3LCA0LCAxNywgNCwgMjAsIDQsIDIwLCA0LCAyMCwgNCwgMTkyLAorICAgICAgICAzMiwgNCwgMTkzLCAzMywgNCwgMjAyLCAzNCwgMzIsIDI1LCAyMDIsIDMyLCAzMiwgMjQsIDIwMCwgMzMsIDM0LAorICAgICAgICAzMywgMTk0LCAwLCAzMiwgMzMsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfcHN5X3JpZ2h0KTsKKyNlbHNlCisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3ICgpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X25hbWUgKHAsICJhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3BzeV9yaWdodCIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfcHN5X3JpZ2h0KTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9kZXN0aW5hdGlvbiAocCwgOCwgImQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCA4LCAiczEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXJfZmxvYXQgKHAsIDQsICJwMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAyIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQzIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MHFsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9TMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MXFsIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9TMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsZiIsIDAsIE9SQ19WQVJfVDMsIE9SQ19WQVJfVDEsIE9SQ19WQVJfUDIsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGYiLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1AxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhZGRmIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9UMiwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibWVyZ2VscSIsIDAsIE9SQ19WQVJfRDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDIsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisjZW5kaWYKKworICAgICAgb3JjX3Byb2dyYW1fY29tcGlsZSAocCk7CisgICAgICBjID0gb3JjX3Byb2dyYW1fdGFrZV9jb2RlIChwKTsKKyAgICAgIG9yY19wcm9ncmFtX2ZyZWUgKHApOworICAgIH0KKyAgICBwX2luaXRlZCA9IFRSVUU7CisgICAgb3JjX29uY2VfbXV0ZXhfdW5sb2NrICgpOworICB9CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9BMl0gPSBjOworICBleC0+cHJvZ3JhbSA9IDA7CisKKyAgZXgtPm4gPSBuOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKyAgeworICAgIG9yY191bmlvbjMyIHRtcDsKKyAgICB0bXAuZiA9IHAxOworICAgIGV4LT5wYXJhbXNbT1JDX1ZBUl9QMV0gPSB0bXAuaTsKKyAgfQorICB7CisgICAgb3JjX3VuaW9uMzIgdG1wOworICAgIHRtcC5mID0gcDI7CisgICAgZXgtPnBhcmFtc1tPUkNfVkFSX1AyXSA9IHRtcC5pOworICB9CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfcHN5X2xlZnQgKi8KKyNpZmRlZiBESVNBQkxFX09SQwordm9pZAorYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9wc3lfbGVmdCAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdmbG9hdCAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGZsb2F0IHAyLCBpbnQgbikKK3sKKyAgaW50IGk7CisgIG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uNjQgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb242NCB2YXIzNTsKKyAgb3JjX3VuaW9uNjQgdmFyMzY7CisgIG9yY191bmlvbjMyIHZhcjM3OworICBvcmNfdW5pb24zMiB2YXIzODsKKyAgb3JjX3VuaW9uNjQgdmFyMzk7CisgIG9yY191bmlvbjMyIHZhcjQwOworICBvcmNfdW5pb24zMiB2YXI0MTsKKyAgb3JjX3VuaW9uMzIgdmFyNDI7CisgIG9yY191bmlvbjMyIHZhcjQzOworICBvcmNfdW5pb24zMiB2YXI0NDsKKworICBwdHIwID0gKG9yY191bmlvbjY0ICopIGQxOworICBwdHI0ID0gKG9yY191bmlvbjY0ICopIHMxOworCisgIC8qIDQ6IGxvYWRwbCAqLworICB2YXIzNy5mID0gcDE7CisgIC8qIDY6IGxvYWRwbCAqLworICB2YXIzOC5mID0gcDI7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRxICovCisgICAgdmFyMzUgPSBwdHI0W2ldOworICAgIC8qIDE6IHNlbGVjdDBxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzNS5pOworICAgICAgdmFyNDAuaSA9IF9zcmMueDJbMF07CisgICAgfQorICAgIC8qIDI6IGxvYWRxICovCisgICAgdmFyMzYgPSBwdHI0W2ldOworICAgIC8qIDM6IHNlbGVjdDFxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzNi5pOworICAgICAgdmFyNDEuaSA9IF9zcmMueDJbMV07CisgICAgfQorICAgIC8qIDU6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDEuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNy5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0Mi5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDc6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDEuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzOC5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0My5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDg6IGFkZGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDIuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXI0MC5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiArIF9zcmMyLmY7CisgICAgICB2YXI0NC5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDk6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyNDQuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDMuaTsKKyAgICAgIHZhcjM5LmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiAxMDogc3RvcmVxICovCisgICAgcHRyMFtpXSA9IHZhcjM5OworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfcHN5X2xlZnQgKE9yY0V4ZWN1dG9yICoKKyAgICBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgbiA9IGV4LT5uOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uNjQgdmFyMzU7CisgIG9yY191bmlvbjY0IHZhcjM2OworICBvcmNfdW5pb24zMiB2YXIzNzsKKyAgb3JjX3VuaW9uMzIgdmFyMzg7CisgIG9yY191bmlvbjY0IHZhcjM5OworICBvcmNfdW5pb24zMiB2YXI0MDsKKyAgb3JjX3VuaW9uMzIgdmFyNDE7CisgIG9yY191bmlvbjMyIHZhcjQyOworICBvcmNfdW5pb24zMiB2YXI0MzsKKyAgb3JjX3VuaW9uMzIgdmFyNDQ7CisKKyAgcHRyMCA9IChvcmNfdW5pb242NCAqKSBleC0+YXJyYXlzWzBdOworICBwdHI0ID0gKG9yY191bmlvbjY0ICopIGV4LT5hcnJheXNbNF07CisKKyAgLyogNDogbG9hZHBsICovCisgIHZhcjM3LmkgPSBleC0+cGFyYW1zWzI0XTsKKyAgLyogNjogbG9hZHBsICovCisgIHZhcjM4LmkgPSBleC0+cGFyYW1zWzI1XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZHEgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMTogc2VsZWN0MHFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM1Lmk7CisgICAgICB2YXI0MC5pID0gX3NyYy54MlswXTsKKyAgICB9CisgICAgLyogMjogbG9hZHEgKi8KKyAgICB2YXIzNiA9IHB0cjRbaV07CisgICAgLyogMzogc2VsZWN0MXFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM2Lmk7CisgICAgICB2YXI0MS5pID0gX3NyYy54MlsxXTsKKyAgICB9CisgICAgLyogNTogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0MS5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM3LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQyLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogNzogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0MS5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM4LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQzLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogODogYWRkZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXI0Mi5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjQwLmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICsgX3NyYzIuZjsKKyAgICAgIHZhcjQ0LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogOTogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXI0NC5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXI0My5pOworICAgICAgdmFyMzkuaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDEwOiBzdG9yZXEgKi8KKyAgICBwdHIwW2ldID0gdmFyMzk7CisgIH0KKworfQorCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3BzeV9sZWZ0IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgOSwgNDMsIDk3LCAxMTcsIDEwMCwgMTA1LCAxMTEsIDExMiwgOTcsIDExMCwgMTExLCAxMTQsIDk3LCAxMDksIDk3LAorICAgICAgICAxMDksIDk1LCAxMTEsIDExNCwgOTksIDk1LCAxMTIsIDExNCwgMTExLCA5OSwgMTAxLCAxMTUsIDExNSwgOTUsIDEwMiwKKyAgICAgICAgNTEsCisgICAgICAgIDUwLCA5NSwgOTksIDEwNCwgNTAsIDk1LCAxMTIsIDExNSwgMTIxLCA5NSwgMTA4LCAxMDEsIDEwMiwgMTE2LCAxMSwgOCwKKyAgICAgICAgOCwgMTIsIDgsIDgsIDE3LCA0LCAxNywgNCwgMjAsIDQsIDIwLCA0LCAyMCwgNCwgMTkyLCAzMiwKKyAgICAgICAgNCwgMTkzLCAzNCwgNCwgMjAyLCAzMywgMzQsIDI0LCAyMDIsIDM0LCAzNCwgMjUsIDIwMCwgMzIsIDMzLCAzMiwKKyAgICAgICAgMTk0LCAwLCAzMiwgMzQsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfcHN5X2xlZnQpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfcHN5X2xlZnQiKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3BzeV9sZWZ0KTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9kZXN0aW5hdGlvbiAocCwgOCwgImQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCA4LCAiczEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXJfZmxvYXQgKHAsIDQsICJwMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAyIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQzIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MHFsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9TMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MXFsIiwgMCwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9TMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsZiIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDMsIE9SQ19WQVJfUDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGYiLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1AyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhZGRmIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibWVyZ2VscSIsIDAsIE9SQ19WQVJfRDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDMsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisjZW5kaWYKKworICAgICAgb3JjX3Byb2dyYW1fY29tcGlsZSAocCk7CisgICAgICBjID0gb3JjX3Byb2dyYW1fdGFrZV9jb2RlIChwKTsKKyAgICAgIG9yY19wcm9ncmFtX2ZyZWUgKHApOworICAgIH0KKyAgICBwX2luaXRlZCA9IFRSVUU7CisgICAgb3JjX29uY2VfbXV0ZXhfdW5sb2NrICgpOworICB9CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9BMl0gPSBjOworICBleC0+cHJvZ3JhbSA9IDA7CisKKyAgZXgtPm4gPSBuOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKyAgeworICAgIG9yY191bmlvbjMyIHRtcDsKKyAgICB0bXAuZiA9IHAxOworICAgIGV4LT5wYXJhbXNbT1JDX1ZBUl9QMV0gPSB0bXAuaTsKKyAgfQorICB7CisgICAgb3JjX3VuaW9uMzIgdG1wOworICAgIHRtcC5mID0gcDI7CisgICAgZXgtPnBhcmFtc1tPUkNfVkFSX1AyXSA9IHRtcC5pOworICB9CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfc2ltX3JpZ2h0ICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfc2ltX3JpZ2h0IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjE2ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMTYgdmFyMzU7CisgIG9yY191bmlvbjMyIHZhcjM2OworICBvcmNfdW5pb24zMiB2YXIzNzsKKyAgb3JjX3VuaW9uMzIgdmFyMzg7CisgIG9yY191bmlvbjMyIHZhcjM5OworICBvcmNfdW5pb24zMiB2YXI0MDsKKyAgb3JjX3VuaW9uNjQgdmFyNDE7CisgIG9yY191bmlvbjY0IHZhcjQyOworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZDE7CisgIHB0cjQgPSAob3JjX3VuaW9uMTYgKikgczE7CisKKyAgLyogMzogbG9hZHBsICovCisgIHZhcjM2LmYgPSBwMTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZHcgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMTogY29udnN3bCAqLworICAgIHZhcjM4LmkgPSB2YXIzNS5pOworICAgIC8qIDI6IGNvbnZsZiAqLworICAgIHZhcjM5LmYgPSB2YXIzOC5pOworICAgIC8qIDQ6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzkuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNi5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0MC5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDU6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyMzkuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDAuaTsKKyAgICAgIHZhcjQxLmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiA2OiBjb252ZmwgKi8KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDEueDJmWzBdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDEueDJbMF0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQyLngyWzBdID0gdG1wOworICAgIH0KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDEueDJmWzFdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDEueDJbMV0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQyLngyWzFdID0gdG1wOworICAgIH0KKyAgICAvKiA3OiBjb252c3NzbHcgKi8KKyAgICB2YXIzNy54MlswXSA9IE9SQ19DTEFNUF9TVyAodmFyNDIueDJbMF0pOworICAgIHZhcjM3LngyWzFdID0gT1JDX0NMQU1QX1NXICh2YXI0Mi54MlsxXSk7CisgICAgLyogODogc3RvcmVsICovCisgICAgcHRyMFtpXSA9IHZhcjM3OworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfc2ltX3JpZ2h0IChPcmNFeGVjdXRvciAqCisgICAgT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IG4gPSBleC0+bjsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24xNiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjE2IHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uMzIgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisgIG9yY191bmlvbjY0IHZhcjQxOworICBvcmNfdW5pb242NCB2YXI0MjsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGV4LT5hcnJheXNbMF07CisgIHB0cjQgPSAob3JjX3VuaW9uMTYgKikgZXgtPmFycmF5c1s0XTsKKworICAvKiAzOiBsb2FkcGwgKi8KKyAgdmFyMzYuaSA9IGV4LT5wYXJhbXNbMjRdOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkdyAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiAxOiBjb252c3dsICovCisgICAgdmFyMzguaSA9IHZhcjM1Lmk7CisgICAgLyogMjogY29udmxmICovCisgICAgdmFyMzkuZiA9IHZhcjM4Lmk7CisgICAgLyogNDogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXIzOS5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM2LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQwLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogNTogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXIzOS5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXI0MC5pOworICAgICAgdmFyNDEuaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDY6IGNvbnZmbCAqLworICAgIHsKKyAgICAgIGludCB0bXA7CisgICAgICB0bXAgPSAoaW50KSB2YXI0MS54MmZbMF07CisgICAgICBpZiAodG1wID09IDB4ODAwMDAwMDAgJiYgISh2YXI0MS54MlswXSAmIDB4ODAwMDAwMDApKQorICAgICAgICB0bXAgPSAweDdmZmZmZmZmOworICAgICAgdmFyNDIueDJbMF0gPSB0bXA7CisgICAgfQorICAgIHsKKyAgICAgIGludCB0bXA7CisgICAgICB0bXAgPSAoaW50KSB2YXI0MS54MmZbMV07CisgICAgICBpZiAodG1wID09IDB4ODAwMDAwMDAgJiYgISh2YXI0MS54MlsxXSAmIDB4ODAwMDAwMDApKQorICAgICAgICB0bXAgPSAweDdmZmZmZmZmOworICAgICAgdmFyNDIueDJbMV0gPSB0bXA7CisgICAgfQorICAgIC8qIDc6IGNvbnZzc3NsdyAqLworICAgIHZhcjM3LngyWzBdID0gT1JDX0NMQU1QX1NXICh2YXI0Mi54MlswXSk7CisgICAgdmFyMzcueDJbMV0gPSBPUkNfQ0xBTVBfU1cgKHZhcjQyLngyWzFdKTsKKyAgICAvKiA4OiBzdG9yZWwgKi8KKyAgICBwdHIwW2ldID0gdmFyMzc7CisgIH0KKworfQorCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3NpbV9yaWdodCAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGludCBuKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgOSwgNDQsIDk3LCAxMTcsIDEwMCwgMTA1LCAxMTEsIDExMiwgOTcsIDExMCwgMTExLCAxMTQsIDk3LCAxMDksIDk3LAorICAgICAgICAxMDksIDk1LCAxMTEsIDExNCwgOTksIDk1LCAxMTIsIDExNCwgMTExLCA5OSwgMTAxLCAxMTUsIDExNSwgOTUsIDExNSwKKyAgICAgICAgNDksCisgICAgICAgIDU0LCA5NSwgOTksIDEwNCwgNDksIDk1LCAxMTUsIDEwNSwgMTA5LCA5NSwgMTE0LCAxMDUsIDEwMywgMTA0LCAxMTYsIDExLAorICAgICAgICA0LCA0LCAxMiwgMiwgMiwgMTcsIDQsIDIwLCA4LCAyMCwgNCwgMjAsIDQsIDE1MywgMzMsIDQsCisgICAgICAgIDIxMSwgMzMsIDMzLCAyMDIsIDM0LCAzMywgMjQsIDE5NCwgMzIsIDMzLCAzNCwgMjEsIDEsIDIxMCwgMzIsIDMyLAorICAgICAgICAyMSwgMSwgMTY1LCAwLCAzMiwgMiwgMCwKKyAgICAgIH07CisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3X2Zyb21fc3RhdGljX2J5dGVjb2RlIChiYyk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9zaW1fcmlnaHQpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfc2ltX3JpZ2h0Iik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9zaW1fcmlnaHQpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCA0LCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDIsICJzMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA4LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQzIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnN3bCIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfUzEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZsZiIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDIsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGYiLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1AxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtZXJnZWxxIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udmZsIiwgMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnNzc2x3IiwgMSwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1MxXSA9ICh2b2lkICopIHMxOworICB7CisgICAgb3JjX3VuaW9uMzIgdG1wOworICAgIHRtcC5mID0gcDE7CisgICAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHRtcC5pOworICB9CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfc2ltX2xlZnQgKi8KKyNpZmRlZiBESVNBQkxFX09SQwordm9pZAorYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9zaW1fbGVmdCAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGludCBuKQoreworICBpbnQgaTsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24xNiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjE2IHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uMzIgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisgIG9yY191bmlvbjY0IHZhcjQxOworICBvcmNfdW5pb242NCB2YXI0MjsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGQxOworICBwdHI0ID0gKG9yY191bmlvbjE2ICopIHMxOworCisgIC8qIDM6IGxvYWRwbCAqLworICB2YXIzNi5mID0gcDE7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWR3ICovCisgICAgdmFyMzUgPSBwdHI0W2ldOworICAgIC8qIDE6IGNvbnZzd2wgKi8KKyAgICB2YXIzOC5pID0gdmFyMzUuaTsKKyAgICAvKiAyOiBjb252bGYgKi8KKyAgICB2YXIzOS5mID0gdmFyMzguaTsKKyAgICAvKiA0OiBtdWxmICovCisgICAgeworICAgICAgb3JjX3VuaW9uMzIgX3NyYzE7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMjsKKyAgICAgIG9yY191bmlvbjMyIF9kZXN0MTsKKyAgICAgIF9zcmMxLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM5LmkpOworICAgICAgX3NyYzIuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzYuaSk7CisgICAgICBfZGVzdDEuZiA9IF9zcmMxLmYgKiBfc3JjMi5mOworICAgICAgdmFyNDAuaSA9IE9SQ19ERU5PUk1BTCAoX2Rlc3QxLmkpOworICAgIH0KKyAgICAvKiA1OiBtZXJnZWxxICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX2Rlc3Q7CisgICAgICBfZGVzdC54MlswXSA9IHZhcjQwLmk7CisgICAgICBfZGVzdC54MlsxXSA9IHZhcjM5Lmk7CisgICAgICB2YXI0MS5pID0gX2Rlc3QuaTsKKyAgICB9CisgICAgLyogNjogY29udmZsICovCisgICAgeworICAgICAgaW50IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIHZhcjQxLngyZlswXTsKKyAgICAgIGlmICh0bXAgPT0gMHg4MDAwMDAwMCAmJiAhKHZhcjQxLngyWzBdICYgMHg4MDAwMDAwMCkpCisgICAgICAgIHRtcCA9IDB4N2ZmZmZmZmY7CisgICAgICB2YXI0Mi54MlswXSA9IHRtcDsKKyAgICB9CisgICAgeworICAgICAgaW50IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIHZhcjQxLngyZlsxXTsKKyAgICAgIGlmICh0bXAgPT0gMHg4MDAwMDAwMCAmJiAhKHZhcjQxLngyWzFdICYgMHg4MDAwMDAwMCkpCisgICAgICAgIHRtcCA9IDB4N2ZmZmZmZmY7CisgICAgICB2YXI0Mi54MlsxXSA9IHRtcDsKKyAgICB9CisgICAgLyogNzogY29udnNzc2x3ICovCisgICAgdmFyMzcueDJbMF0gPSBPUkNfQ0xBTVBfU1cgKHZhcjQyLngyWzBdKTsKKyAgICB2YXIzNy54MlsxXSA9IE9SQ19DTEFNUF9TVyAodmFyNDIueDJbMV0pOworICAgIC8qIDg6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzNzsKKyAgfQorCit9CisKKyNlbHNlCitzdGF0aWMgdm9pZAorX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3NpbV9sZWZ0IChPcmNFeGVjdXRvciAqCisgICAgT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IG4gPSBleC0+bjsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24xNiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjE2IHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uMzIgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisgIG9yY191bmlvbjY0IHZhcjQxOworICBvcmNfdW5pb242NCB2YXI0MjsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGV4LT5hcnJheXNbMF07CisgIHB0cjQgPSAob3JjX3VuaW9uMTYgKikgZXgtPmFycmF5c1s0XTsKKworICAvKiAzOiBsb2FkcGwgKi8KKyAgdmFyMzYuaSA9IGV4LT5wYXJhbXNbMjRdOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkdyAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiAxOiBjb252c3dsICovCisgICAgdmFyMzguaSA9IHZhcjM1Lmk7CisgICAgLyogMjogY29udmxmICovCisgICAgdmFyMzkuZiA9IHZhcjM4Lmk7CisgICAgLyogNDogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXIzOS5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM2LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQwLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogNTogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXI0MC5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXIzOS5pOworICAgICAgdmFyNDEuaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDY6IGNvbnZmbCAqLworICAgIHsKKyAgICAgIGludCB0bXA7CisgICAgICB0bXAgPSAoaW50KSB2YXI0MS54MmZbMF07CisgICAgICBpZiAodG1wID09IDB4ODAwMDAwMDAgJiYgISh2YXI0MS54MlswXSAmIDB4ODAwMDAwMDApKQorICAgICAgICB0bXAgPSAweDdmZmZmZmZmOworICAgICAgdmFyNDIueDJbMF0gPSB0bXA7CisgICAgfQorICAgIHsKKyAgICAgIGludCB0bXA7CisgICAgICB0bXAgPSAoaW50KSB2YXI0MS54MmZbMV07CisgICAgICBpZiAodG1wID09IDB4ODAwMDAwMDAgJiYgISh2YXI0MS54MlsxXSAmIDB4ODAwMDAwMDApKQorICAgICAgICB0bXAgPSAweDdmZmZmZmZmOworICAgICAgdmFyNDIueDJbMV0gPSB0bXA7CisgICAgfQorICAgIC8qIDc6IGNvbnZzc3NsdyAqLworICAgIHZhcjM3LngyWzBdID0gT1JDX0NMQU1QX1NXICh2YXI0Mi54MlswXSk7CisgICAgdmFyMzcueDJbMV0gPSBPUkNfQ0xBTVBfU1cgKHZhcjQyLngyWzFdKTsKKyAgICAvKiA4OiBzdG9yZWwgKi8KKyAgICBwdHIwW2ldID0gdmFyMzc7CisgIH0KKworfQorCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3NpbV9sZWZ0IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA5LCA0MywgOTcsIDExNywgMTAwLCAxMDUsIDExMSwgMTEyLCA5NywgMTEwLCAxMTEsIDExNCwgOTcsIDEwOSwgOTcsCisgICAgICAgIDEwOSwgOTUsIDExMSwgMTE0LCA5OSwgOTUsIDExMiwgMTE0LCAxMTEsIDk5LCAxMDEsIDExNSwgMTE1LCA5NSwgMTE1LAorICAgICAgICA0OSwKKyAgICAgICAgNTQsIDk1LCA5OSwgMTA0LCA0OSwgOTUsIDExNSwgMTA1LCAxMDksIDk1LCAxMDgsIDEwMSwgMTAyLCAxMTYsIDExLCA0LAorICAgICAgICA0LCAxMiwgMiwgMiwgMTcsIDQsIDIwLCA4LCAyMCwgNCwgMjAsIDQsIDE1MywgMzQsIDQsIDIxMSwKKyAgICAgICAgMzQsIDM0LCAyMDIsIDMzLCAzNCwgMjQsIDE5NCwgMzIsIDMzLCAzNCwgMjEsIDEsIDIxMCwgMzIsIDMyLCAyMSwKKyAgICAgICAgMSwgMTY1LCAwLCAzMiwgMiwgMCwKKyAgICAgIH07CisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3X2Zyb21fc3RhdGljX2J5dGVjb2RlIChiYyk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9zaW1fbGVmdCk7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9uYW1lIChwLCAiYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9zaW1fbGVmdCIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfc2ltX2xlZnQpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCA0LCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDIsICJzMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA4LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQzIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnN3bCIsIDAsIE9SQ19WQVJfVDMsIE9SQ19WQVJfUzEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZsZiIsIDAsIE9SQ19WQVJfVDMsIE9SQ19WQVJfVDMsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGYiLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1AxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtZXJnZWxxIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udmZsIiwgMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnNzc2x3IiwgMSwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1MxXSA9ICh2b2lkICopIHMxOworICB7CisgICAgb3JjX3VuaW9uMzIgdG1wOworICAgIHRtcC5mID0gcDE7CisgICAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHRtcC5pOworICB9CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfc2ltX3JpZ2h0ICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfc2ltX3JpZ2h0IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMzIgdmFyMzU7CisgIG9yY191bmlvbjMyIHZhcjM2OworICBvcmNfdW5pb24zMiB2YXIzNzsKKyAgb3JjX3VuaW9uNjQgdmFyMzg7CisgIG9yY191bmlvbjY0IHZhcjM5OworICBvcmNfdW5pb24zMiB2YXI0MDsKKyAgb3JjX3VuaW9uMzIgdmFyNDE7CisgIG9yY191bmlvbjMyIHZhcjQyOworICBvcmNfdW5pb242NCB2YXI0MzsKKyAgb3JjX3VuaW9uNjQgdmFyNDQ7CisKKyAgcHRyMCA9IChvcmNfdW5pb24zMiAqKSBkMTsKKyAgcHRyNCA9IChvcmNfdW5pb24zMiAqKSBzMTsKKworICAvKiA1OiBsb2FkcGwgKi8KKyAgdmFyMzYuZiA9IHAxOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkbCAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiAxOiBjb252c3dsICovCisgICAgdmFyMzgueDJbMF0gPSB2YXIzNS54MlswXTsKKyAgICB2YXIzOC54MlsxXSA9IHZhcjM1LngyWzFdOworICAgIC8qIDI6IGNvbnZsZiAqLworICAgIHZhcjM5LngyZlswXSA9IHZhcjM4LngyWzBdOworICAgIHZhcjM5LngyZlsxXSA9IHZhcjM4LngyWzFdOworICAgIC8qIDM6IHNlbGVjdDBxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzOS5pOworICAgICAgdmFyNDAuaSA9IF9zcmMueDJbMF07CisgICAgfQorICAgIC8qIDQ6IHNlbGVjdDFxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzOS5pOworICAgICAgdmFyNDEuaSA9IF9zcmMueDJbMV07CisgICAgfQorICAgIC8qIDY6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDEuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNi5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0Mi5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDc6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyNDAuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDIuaTsKKyAgICAgIHZhcjQzLmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiA4OiBjb252ZmwgKi8KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzBdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMF0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzBdID0gdG1wOworICAgIH0KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzFdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMV0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzFdID0gdG1wOworICAgIH0KKyAgICAvKiA5OiBjb252c3NzbHcgKi8KKyAgICB2YXIzNy54MlswXSA9IE9SQ19DTEFNUF9TVyAodmFyNDQueDJbMF0pOworICAgIHZhcjM3LngyWzFdID0gT1JDX0NMQU1QX1NXICh2YXI0NC54MlsxXSk7CisgICAgLyogMTA6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzNzsKKyAgfQorCit9CisKKyNlbHNlCitzdGF0aWMgdm9pZAorX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3NpbV9yaWdodCAoT3JjRXhlY3V0b3IgKgorICAgIE9SQ19SRVNUUklDVCBleCkKK3sKKyAgaW50IGk7CisgIGludCBuID0gZXgtPm47CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb24zMiB2YXIzNTsKKyAgb3JjX3VuaW9uMzIgdmFyMzY7CisgIG9yY191bmlvbjMyIHZhcjM3OworICBvcmNfdW5pb242NCB2YXIzODsKKyAgb3JjX3VuaW9uNjQgdmFyMzk7CisgIG9yY191bmlvbjMyIHZhcjQwOworICBvcmNfdW5pb24zMiB2YXI0MTsKKyAgb3JjX3VuaW9uMzIgdmFyNDI7CisgIG9yY191bmlvbjY0IHZhcjQzOworICBvcmNfdW5pb242NCB2YXI0NDsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGV4LT5hcnJheXNbMF07CisgIHB0cjQgPSAob3JjX3VuaW9uMzIgKikgZXgtPmFycmF5c1s0XTsKKworICAvKiA1OiBsb2FkcGwgKi8KKyAgdmFyMzYuaSA9IGV4LT5wYXJhbXNbMjRdOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkbCAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiAxOiBjb252c3dsICovCisgICAgdmFyMzgueDJbMF0gPSB2YXIzNS54MlswXTsKKyAgICB2YXIzOC54MlsxXSA9IHZhcjM1LngyWzFdOworICAgIC8qIDI6IGNvbnZsZiAqLworICAgIHZhcjM5LngyZlswXSA9IHZhcjM4LngyWzBdOworICAgIHZhcjM5LngyZlsxXSA9IHZhcjM4LngyWzFdOworICAgIC8qIDM6IHNlbGVjdDBxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzOS5pOworICAgICAgdmFyNDAuaSA9IF9zcmMueDJbMF07CisgICAgfQorICAgIC8qIDQ6IHNlbGVjdDFxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzOS5pOworICAgICAgdmFyNDEuaSA9IF9zcmMueDJbMV07CisgICAgfQorICAgIC8qIDY6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDEuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNi5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0Mi5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDc6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyNDAuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDIuaTsKKyAgICAgIHZhcjQzLmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiA4OiBjb252ZmwgKi8KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzBdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMF0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzBdID0gdG1wOworICAgIH0KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzFdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMV0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzFdID0gdG1wOworICAgIH0KKyAgICAvKiA5OiBjb252c3NzbHcgKi8KKyAgICB2YXIzNy54MlswXSA9IE9SQ19DTEFNUF9TVyAodmFyNDQueDJbMF0pOworICAgIHZhcjM3LngyWzFdID0gT1JDX0NMQU1QX1NXICh2YXI0NC54MlsxXSk7CisgICAgLyogMTA6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzNzsKKyAgfQorCit9CisKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfc2ltX3JpZ2h0IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA5LCA0NCwgOTcsIDExNywgMTAwLCAxMDUsIDExMSwgMTEyLCA5NywgMTEwLCAxMTEsIDExNCwgOTcsIDEwOSwgOTcsCisgICAgICAgIDEwOSwgOTUsIDExMSwgMTE0LCA5OSwgOTUsIDExMiwgMTE0LCAxMTEsIDk5LCAxMDEsIDExNSwgMTE1LCA5NSwgMTE1LAorICAgICAgICA0OSwKKyAgICAgICAgNTQsIDk1LCA5OSwgMTA0LCA1MCwgOTUsIDExNSwgMTA1LCAxMDksIDk1LCAxMTQsIDEwNSwgMTAzLCAxMDQsIDExNiwgMTEsCisgICAgICAgIDQsIDQsIDEyLCA0LCA0LCAxNywgNCwgMjAsIDgsIDIwLCA0LCAyMCwgNCwgMjEsIDEsIDE1MywKKyAgICAgICAgMzIsIDQsIDIxLCAxLCAyMTEsIDMyLCAzMiwgMTkyLCAzMywgMzIsIDE5MywgMzQsIDMyLCAyMDIsIDM0LCAzNCwKKyAgICAgICAgMjQsIDE5NCwgMzIsIDMzLCAzNCwgMjEsIDEsIDIxMCwgMzIsIDMyLCAyMSwgMSwgMTY1LCAwLCAzMiwgMiwKKyAgICAgICAgMCwKKyAgICAgIH07CisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3X2Zyb21fc3RhdGljX2J5dGVjb2RlIChiYyk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9zaW1fcmlnaHQpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfc2ltX3JpZ2h0Iik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9zaW1fcmlnaHQpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCA0LCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDQsICJzMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA4LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQzIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnN3bCIsIDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfUzEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZsZiIsIDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInNlbGVjdDBxbCIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInNlbGVjdDFxbCIsIDAsIE9SQ19WQVJfVDMsIE9SQ19WQVJfVDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGYiLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1AxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtZXJnZWxxIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udmZsIiwgMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnNzc2x3IiwgMSwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1MxXSA9ICh2b2lkICopIHMxOworICB7CisgICAgb3JjX3VuaW9uMzIgdG1wOworICAgIHRtcC5mID0gcDE7CisgICAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHRtcC5pOworICB9CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfc2ltX2xlZnQgKi8KKyNpZmRlZiBESVNBQkxFX09SQwordm9pZAorYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9zaW1fbGVmdCAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGludCBuKQoreworICBpbnQgaTsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjMyIHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uMzIgdmFyMzc7CisgIG9yY191bmlvbjY0IHZhcjM4OworICBvcmNfdW5pb242NCB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisgIG9yY191bmlvbjMyIHZhcjQxOworICBvcmNfdW5pb24zMiB2YXI0MjsKKyAgb3JjX3VuaW9uNjQgdmFyNDM7CisgIG9yY191bmlvbjY0IHZhcjQ0OworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZDE7CisgIHB0cjQgPSAob3JjX3VuaW9uMzIgKikgczE7CisKKyAgLyogNTogbG9hZHBsICovCisgIHZhcjM2LmYgPSBwMTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGwgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMTogY29udnN3bCAqLworICAgIHZhcjM4LngyWzBdID0gdmFyMzUueDJbMF07CisgICAgdmFyMzgueDJbMV0gPSB2YXIzNS54MlsxXTsKKyAgICAvKiAyOiBjb252bGYgKi8KKyAgICB2YXIzOS54MmZbMF0gPSB2YXIzOC54MlswXTsKKyAgICB2YXIzOS54MmZbMV0gPSB2YXIzOC54MlsxXTsKKyAgICAvKiAzOiBzZWxlY3QwcWwgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfc3JjOworICAgICAgX3NyYy5pID0gdmFyMzkuaTsKKyAgICAgIHZhcjQwLmkgPSBfc3JjLngyWzBdOworICAgIH0KKyAgICAvKiA0OiBzZWxlY3QxcWwgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfc3JjOworICAgICAgX3NyYy5pID0gdmFyMzkuaTsKKyAgICAgIHZhcjQxLmkgPSBfc3JjLngyWzFdOworICAgIH0KKyAgICAvKiA2OiBtdWxmICovCisgICAgeworICAgICAgb3JjX3VuaW9uMzIgX3NyYzE7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMjsKKyAgICAgIG9yY191bmlvbjMyIF9kZXN0MTsKKyAgICAgIF9zcmMxLmkgPSBPUkNfREVOT1JNQUwgKHZhcjQwLmkpOworICAgICAgX3NyYzIuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzYuaSk7CisgICAgICBfZGVzdDEuZiA9IF9zcmMxLmYgKiBfc3JjMi5mOworICAgICAgdmFyNDIuaSA9IE9SQ19ERU5PUk1BTCAoX2Rlc3QxLmkpOworICAgIH0KKyAgICAvKiA3OiBtZXJnZWxxICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX2Rlc3Q7CisgICAgICBfZGVzdC54MlswXSA9IHZhcjQyLmk7CisgICAgICBfZGVzdC54MlsxXSA9IHZhcjQxLmk7CisgICAgICB2YXI0My5pID0gX2Rlc3QuaTsKKyAgICB9CisgICAgLyogODogY29udmZsICovCisgICAgeworICAgICAgaW50IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIHZhcjQzLngyZlswXTsKKyAgICAgIGlmICh0bXAgPT0gMHg4MDAwMDAwMCAmJiAhKHZhcjQzLngyWzBdICYgMHg4MDAwMDAwMCkpCisgICAgICAgIHRtcCA9IDB4N2ZmZmZmZmY7CisgICAgICB2YXI0NC54MlswXSA9IHRtcDsKKyAgICB9CisgICAgeworICAgICAgaW50IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIHZhcjQzLngyZlsxXTsKKyAgICAgIGlmICh0bXAgPT0gMHg4MDAwMDAwMCAmJiAhKHZhcjQzLngyWzFdICYgMHg4MDAwMDAwMCkpCisgICAgICAgIHRtcCA9IDB4N2ZmZmZmZmY7CisgICAgICB2YXI0NC54MlsxXSA9IHRtcDsKKyAgICB9CisgICAgLyogOTogY29udnNzc2x3ICovCisgICAgdmFyMzcueDJbMF0gPSBPUkNfQ0xBTVBfU1cgKHZhcjQ0LngyWzBdKTsKKyAgICB2YXIzNy54MlsxXSA9IE9SQ19DTEFNUF9TVyAodmFyNDQueDJbMV0pOworICAgIC8qIDEwOiBzdG9yZWwgKi8KKyAgICBwdHIwW2ldID0gdmFyMzc7CisgIH0KKworfQorCisjZWxzZQorc3RhdGljIHZvaWQKK19iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9zaW1fbGVmdCAoT3JjRXhlY3V0b3IgKgorICAgIE9SQ19SRVNUUklDVCBleCkKK3sKKyAgaW50IGk7CisgIGludCBuID0gZXgtPm47CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb24zMiB2YXIzNTsKKyAgb3JjX3VuaW9uMzIgdmFyMzY7CisgIG9yY191bmlvbjMyIHZhcjM3OworICBvcmNfdW5pb242NCB2YXIzODsKKyAgb3JjX3VuaW9uNjQgdmFyMzk7CisgIG9yY191bmlvbjMyIHZhcjQwOworICBvcmNfdW5pb24zMiB2YXI0MTsKKyAgb3JjX3VuaW9uMzIgdmFyNDI7CisgIG9yY191bmlvbjY0IHZhcjQzOworICBvcmNfdW5pb242NCB2YXI0NDsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGV4LT5hcnJheXNbMF07CisgIHB0cjQgPSAob3JjX3VuaW9uMzIgKikgZXgtPmFycmF5c1s0XTsKKworICAvKiA1OiBsb2FkcGwgKi8KKyAgdmFyMzYuaSA9IGV4LT5wYXJhbXNbMjRdOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkbCAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiAxOiBjb252c3dsICovCisgICAgdmFyMzgueDJbMF0gPSB2YXIzNS54MlswXTsKKyAgICB2YXIzOC54MlsxXSA9IHZhcjM1LngyWzFdOworICAgIC8qIDI6IGNvbnZsZiAqLworICAgIHZhcjM5LngyZlswXSA9IHZhcjM4LngyWzBdOworICAgIHZhcjM5LngyZlsxXSA9IHZhcjM4LngyWzFdOworICAgIC8qIDM6IHNlbGVjdDBxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzOS5pOworICAgICAgdmFyNDAuaSA9IF9zcmMueDJbMF07CisgICAgfQorICAgIC8qIDQ6IHNlbGVjdDFxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzOS5pOworICAgICAgdmFyNDEuaSA9IF9zcmMueDJbMV07CisgICAgfQorICAgIC8qIDY6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyNDAuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNi5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0Mi5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDc6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyNDIuaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDEuaTsKKyAgICAgIHZhcjQzLmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiA4OiBjb252ZmwgKi8KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzBdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMF0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzBdID0gdG1wOworICAgIH0KKyAgICB7CisgICAgICBpbnQgdG1wOworICAgICAgdG1wID0gKGludCkgdmFyNDMueDJmWzFdOworICAgICAgaWYgKHRtcCA9PSAweDgwMDAwMDAwICYmICEodmFyNDMueDJbMV0gJiAweDgwMDAwMDAwKSkKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKKyAgICAgIHZhcjQ0LngyWzFdID0gdG1wOworICAgIH0KKyAgICAvKiA5OiBjb252c3NzbHcgKi8KKyAgICB2YXIzNy54MlswXSA9IE9SQ19DTEFNUF9TVyAodmFyNDQueDJbMF0pOworICAgIHZhcjM3LngyWzFdID0gT1JDX0NMQU1QX1NXICh2YXI0NC54MlsxXSk7CisgICAgLyogMTA6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzNzsKKyAgfQorCit9CisKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfc2ltX2xlZnQgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnaW50MTYgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbikKK3sKKyAgT3JjRXhlY3V0b3IgX2V4LCAqZXggPSAmX2V4OworICBzdGF0aWMgdm9sYXRpbGUgaW50IHBfaW5pdGVkID0gMDsKKyAgc3RhdGljIE9yY0NvZGUgKmMgPSAwOworICB2b2lkICgqZnVuYykgKE9yY0V4ZWN1dG9yICopOworCisgIGlmICghcF9pbml0ZWQpIHsKKyAgICBvcmNfb25jZV9tdXRleF9sb2NrICgpOworICAgIGlmICghcF9pbml0ZWQpIHsKKyAgICAgIE9yY1Byb2dyYW0gKnA7CisKKyNpZiAxCisgICAgICBzdGF0aWMgY29uc3Qgb3JjX3VpbnQ4IGJjW10gPSB7CisgICAgICAgIDEsIDksIDQzLCA5NywgMTE3LCAxMDAsIDEwNSwgMTExLCAxMTIsIDk3LCAxMTAsIDExMSwgMTE0LCA5NywgMTA5LCA5NywKKyAgICAgICAgMTA5LCA5NSwgMTExLCAxMTQsIDk5LCA5NSwgMTEyLCAxMTQsIDExMSwgOTksIDEwMSwgMTE1LCAxMTUsIDk1LCAxMTUsCisgICAgICAgIDQ5LAorICAgICAgICA1NCwgOTUsIDk5LCAxMDQsIDUwLCA5NSwgMTE1LCAxMDUsIDEwOSwgOTUsIDEwOCwgMTAxLCAxMDIsIDExNiwgMTEsIDQsCisgICAgICAgIDQsIDEyLCA0LCA0LCAxNywgNCwgMjAsIDgsIDIwLCA0LCAyMCwgNCwgMjEsIDEsIDE1MywgMzIsCisgICAgICAgIDQsIDIxLCAxLCAyMTEsIDMyLCAzMiwgMTkyLCAzMywgMzIsIDE5MywgMzQsIDMyLCAyMDIsIDMzLCAzMywgMjQsCisgICAgICAgIDE5NCwgMzIsIDMzLCAzNCwgMjEsIDEsIDIxMCwgMzIsIDMyLCAyMSwgMSwgMTY1LCAwLCAzMiwgMiwgMCwKKworICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3NpbV9sZWZ0KTsKKyNlbHNlCisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3ICgpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X25hbWUgKHAsICJhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3NpbV9sZWZ0Iik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9zaW1fbGVmdCk7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDQsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgNCwgInMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfcGFyYW1ldGVyX2Zsb2F0IChwLCA0LCAicDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDgsICJ0MSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQyIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDMiKTsKKworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252c3dsIiwgMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9TMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udmxmIiwgMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MHFsIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MXFsIiwgMCwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsZiIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDIsIE9SQ19WQVJfUDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm1lcmdlbHEiLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QzLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252ZmwiLCAxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252c3NzbHciLCAxLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1QxLAorICAgICAgICAgIE9SQ19WQVJfRDEsIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX0QxXSA9IGQxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzFdID0gKHZvaWQgKikgczE7CisgIHsKKyAgICBvcmNfdW5pb24zMiB0bXA7CisgICAgdG1wLmYgPSBwMTsKKyAgICBleC0+cGFyYW1zW09SQ19WQVJfUDFdID0gdG1wLmk7CisgIH0KKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fcmlnaHQgKi8KKyNpZmRlZiBESVNBQkxFX09SQwordm9pZAorYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fcmlnaHQgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbikKK3sKKyAgaW50IGk7CisgIG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb24zMiB2YXIzNDsKKyAgb3JjX3VuaW9uMzIgdmFyMzU7CisgIG9yY191bmlvbjMyIHZhcjM2OworICBvcmNfdW5pb242NCB2YXIzNzsKKyAgb3JjX3VuaW9uMzIgdmFyMzg7CisgIG9yY191bmlvbjMyIHZhcjM5OworCisgIHB0cjAgPSAob3JjX3VuaW9uNjQgKikgZDE7CisgIHB0cjQgPSAob3JjX3VuaW9uMzIgKikgczE7CisKKyAgLyogMzogbG9hZHBsICovCisgIHZhcjM2LmYgPSBwMTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGwgKi8KKyAgICB2YXIzNCA9IHB0cjRbaV07CisgICAgLyogMTogY29weWwgKi8KKyAgICB2YXIzOC5pID0gdmFyMzQuaTsKKyAgICAvKiAyOiBsb2FkbCAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiA0OiBtdWxmICovCisgICAgeworICAgICAgb3JjX3VuaW9uMzIgX3NyYzE7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMjsKKyAgICAgIG9yY191bmlvbjMyIF9kZXN0MTsKKyAgICAgIF9zcmMxLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM1LmkpOworICAgICAgX3NyYzIuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzYuaSk7CisgICAgICBfZGVzdDEuZiA9IF9zcmMxLmYgKiBfc3JjMi5mOworICAgICAgdmFyMzkuaSA9IE9SQ19ERU5PUk1BTCAoX2Rlc3QxLmkpOworICAgIH0KKyAgICAvKiA1OiBtZXJnZWxxICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX2Rlc3Q7CisgICAgICBfZGVzdC54MlswXSA9IHZhcjM4Lmk7CisgICAgICBfZGVzdC54MlsxXSA9IHZhcjM5Lmk7CisgICAgICB2YXIzNy5pID0gX2Rlc3QuaTsKKyAgICB9CisgICAgLyogNjogc3RvcmVxICovCisgICAgcHRyMFtpXSA9IHZhcjM3OworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfc2ltX3JpZ2h0IChPcmNFeGVjdXRvciAqCisgICAgT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IG4gPSBleC0+bjsKKyAgb3JjX3VuaW9uNjQgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjMyIHZhcjM0OworICBvcmNfdW5pb24zMiB2YXIzNTsKKyAgb3JjX3VuaW9uMzIgdmFyMzY7CisgIG9yY191bmlvbjY0IHZhcjM3OworICBvcmNfdW5pb24zMiB2YXIzODsKKyAgb3JjX3VuaW9uMzIgdmFyMzk7CisKKyAgcHRyMCA9IChvcmNfdW5pb242NCAqKSBleC0+YXJyYXlzWzBdOworICBwdHI0ID0gKG9yY191bmlvbjMyICopIGV4LT5hcnJheXNbNF07CisKKyAgLyogMzogbG9hZHBsICovCisgIHZhcjM2LmkgPSBleC0+cGFyYW1zWzI0XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGwgKi8KKyAgICB2YXIzNCA9IHB0cjRbaV07CisgICAgLyogMTogY29weWwgKi8KKyAgICB2YXIzOC5pID0gdmFyMzQuaTsKKyAgICAvKiAyOiBsb2FkbCAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiA0OiBtdWxmICovCisgICAgeworICAgICAgb3JjX3VuaW9uMzIgX3NyYzE7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMjsKKyAgICAgIG9yY191bmlvbjMyIF9kZXN0MTsKKyAgICAgIF9zcmMxLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM1LmkpOworICAgICAgX3NyYzIuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzYuaSk7CisgICAgICBfZGVzdDEuZiA9IF9zcmMxLmYgKiBfc3JjMi5mOworICAgICAgdmFyMzkuaSA9IE9SQ19ERU5PUk1BTCAoX2Rlc3QxLmkpOworICAgIH0KKyAgICAvKiA1OiBtZXJnZWxxICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX2Rlc3Q7CisgICAgICBfZGVzdC54MlswXSA9IHZhcjM4Lmk7CisgICAgICBfZGVzdC54MlsxXSA9IHZhcjM5Lmk7CisgICAgICB2YXIzNy5pID0gX2Rlc3QuaTsKKyAgICB9CisgICAgLyogNjogc3RvcmVxICovCisgICAgcHRyMFtpXSA9IHZhcjM3OworICB9CisKK30KKwordm9pZAorYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fcmlnaHQgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbikKK3sKKyAgT3JjRXhlY3V0b3IgX2V4LCAqZXggPSAmX2V4OworICBzdGF0aWMgdm9sYXRpbGUgaW50IHBfaW5pdGVkID0gMDsKKyAgc3RhdGljIE9yY0NvZGUgKmMgPSAwOworICB2b2lkICgqZnVuYykgKE9yY0V4ZWN1dG9yICopOworCisgIGlmICghcF9pbml0ZWQpIHsKKyAgICBvcmNfb25jZV9tdXRleF9sb2NrICgpOworICAgIGlmICghcF9pbml0ZWQpIHsKKyAgICAgIE9yY1Byb2dyYW0gKnA7CisKKyNpZiAxCisgICAgICBzdGF0aWMgY29uc3Qgb3JjX3VpbnQ4IGJjW10gPSB7CisgICAgICAgIDEsIDksIDQ0LCA5NywgMTE3LCAxMDAsIDEwNSwgMTExLCAxMTIsIDk3LCAxMTAsIDExMSwgMTE0LCA5NywgMTA5LCA5NywKKyAgICAgICAgMTA5LCA5NSwgMTExLCAxMTQsIDk5LCA5NSwgMTEyLCAxMTQsIDExMSwgOTksIDEwMSwgMTE1LCAxMTUsIDk1LCAxMDIsCisgICAgICAgIDUxLAorICAgICAgICA1MCwgOTUsIDk5LCAxMDQsIDQ5LCA5NSwgMTE1LCAxMDUsIDEwOSwgOTUsIDExNCwgMTA1LCAxMDMsIDEwNCwgMTE2LCAxMSwKKyAgICAgICAgOCwgOCwgMTIsIDQsIDQsIDE3LCA0LCAyMCwgNCwgMjAsIDQsIDExMiwgMzIsIDQsIDIwMiwgMzMsCisgICAgICAgIDQsIDI0LCAxOTQsIDAsIDMyLCAzMywgMiwgMCwKKyAgICAgIH07CisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3X2Zyb21fc3RhdGljX2J5dGVjb2RlIChiYyk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fcmlnaHQpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfc2ltX3JpZ2h0Iik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fcmlnaHQpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCA4LCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDQsICJzMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MiIpOworCisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvcHlsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9TMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsZiIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfUzEsIE9SQ19WQVJfUDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm1lcmdlbHEiLCAwLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX0QxXSA9IGQxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzFdID0gKHZvaWQgKikgczE7CisgIHsKKyAgICBvcmNfdW5pb24zMiB0bXA7CisgICAgdG1wLmYgPSBwMTsKKyAgICBleC0+cGFyYW1zW09SQ19WQVJfUDFdID0gdG1wLmk7CisgIH0KKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fbGVmdCAqLworI2lmZGVmIERJU0FCTEVfT1JDCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX3NpbV9sZWZ0IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMzIgdmFyMzQ7CisgIG9yY191bmlvbjMyIHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uNjQgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKworICBwdHIwID0gKG9yY191bmlvbjY0ICopIGQxOworICBwdHI0ID0gKG9yY191bmlvbjMyICopIHMxOworCisgIC8qIDE6IGxvYWRwbCAqLworICB2YXIzNS5mID0gcDE7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRsICovCisgICAgdmFyMzQgPSBwdHI0W2ldOworICAgIC8qIDI6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzQuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNS5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXIzOC5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDM6IGxvYWRsICovCisgICAgdmFyMzYgPSBwdHI0W2ldOworICAgIC8qIDQ6IGNvcHlsICovCisgICAgdmFyMzkuaSA9IHZhcjM2Lmk7CisgICAgLyogNTogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXIzOC5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXIzOS5pOworICAgICAgdmFyMzcuaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDY6IHN0b3JlcSAqLworICAgIHB0cjBbaV0gPSB2YXIzNzsKKyAgfQorCit9CisKKyNlbHNlCitzdGF0aWMgdm9pZAorX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX3NpbV9sZWZ0IChPcmNFeGVjdXRvciAqCisgICAgT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IG4gPSBleC0+bjsKKyAgb3JjX3VuaW9uNjQgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjMyIHZhcjM0OworICBvcmNfdW5pb24zMiB2YXIzNTsKKyAgb3JjX3VuaW9uMzIgdmFyMzY7CisgIG9yY191bmlvbjY0IHZhcjM3OworICBvcmNfdW5pb24zMiB2YXIzODsKKyAgb3JjX3VuaW9uMzIgdmFyMzk7CisKKyAgcHRyMCA9IChvcmNfdW5pb242NCAqKSBleC0+YXJyYXlzWzBdOworICBwdHI0ID0gKG9yY191bmlvbjMyICopIGV4LT5hcnJheXNbNF07CisKKyAgLyogMTogbG9hZHBsICovCisgIHZhcjM1LmkgPSBleC0+cGFyYW1zWzI0XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGwgKi8KKyAgICB2YXIzNCA9IHB0cjRbaV07CisgICAgLyogMjogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXIzNC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM1LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjM4LmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogMzogbG9hZGwgKi8KKyAgICB2YXIzNiA9IHB0cjRbaV07CisgICAgLyogNDogY29weWwgKi8KKyAgICB2YXIzOS5pID0gdmFyMzYuaTsKKyAgICAvKiA1OiBtZXJnZWxxICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX2Rlc3Q7CisgICAgICBfZGVzdC54MlswXSA9IHZhcjM4Lmk7CisgICAgICBfZGVzdC54MlsxXSA9IHZhcjM5Lmk7CisgICAgICB2YXIzNy5pID0gX2Rlc3QuaTsKKyAgICB9CisgICAgLyogNjogc3RvcmVxICovCisgICAgcHRyMFtpXSA9IHZhcjM3OworICB9CisKK30KKwordm9pZAorYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fbGVmdCAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGdmbG9hdCAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGludCBuKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgOSwgNDMsIDk3LCAxMTcsIDEwMCwgMTA1LCAxMTEsIDExMiwgOTcsIDExMCwgMTExLCAxMTQsIDk3LCAxMDksIDk3LAorICAgICAgICAxMDksIDk1LCAxMTEsIDExNCwgOTksIDk1LCAxMTIsIDExNCwgMTExLCA5OSwgMTAxLCAxMTUsIDExNSwgOTUsIDEwMiwKKyAgICAgICAgNTEsCisgICAgICAgIDUwLCA5NSwgOTksIDEwNCwgNDksIDk1LCAxMTUsIDEwNSwgMTA5LCA5NSwgMTA4LCAxMDEsIDEwMiwgMTE2LCAxMSwgOCwKKyAgICAgICAgOCwgMTIsIDQsIDQsIDE3LCA0LCAyMCwgNCwgMjAsIDQsIDIwMiwgMzIsIDQsIDI0LCAxMTIsIDMzLAorICAgICAgICA0LCAxOTQsIDAsIDMyLCAzMywgMiwgMCwKKyAgICAgIH07CisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3X2Zyb21fc3RhdGljX2J5dGVjb2RlIChiYyk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fbGVmdCk7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9uYW1lIChwLCAiYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fbGVmdCIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwKKyAgICAgICAgICBfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfc2ltX2xlZnQpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCA4LCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDQsICJzMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlcl9mbG9hdCAocCwgNCwgInAxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MiIpOworCisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGYiLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1MxLCBPUkNfVkFSX1AxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb3B5bCIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfUzEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm1lcmdlbHEiLCAwLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX0QxXSA9IGQxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzFdID0gKHZvaWQgKikgczE7CisgIHsKKyAgICBvcmNfdW5pb24zMiB0bXA7CisgICAgdG1wLmYgPSBwMTsKKyAgICBleC0+cGFyYW1zW09SQ19WQVJfUDFdID0gdG1wLmk7CisgIH0KKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9zaW1fcmlnaHQgKi8KKyNpZmRlZiBESVNBQkxFX09SQwordm9pZAorYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9zaW1fcmlnaHQgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbikKK3sKKyAgaW50IGk7CisgIG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uNjQgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb242NCB2YXIzNDsKKyAgb3JjX3VuaW9uNjQgdmFyMzU7CisgIG9yY191bmlvbjMyIHZhcjM2OworICBvcmNfdW5pb242NCB2YXIzNzsKKyAgb3JjX3VuaW9uMzIgdmFyMzg7CisgIG9yY191bmlvbjMyIHZhcjM5OworICBvcmNfdW5pb24zMiB2YXI0MDsKKworICBwdHIwID0gKG9yY191bmlvbjY0ICopIGQxOworICBwdHI0ID0gKG9yY191bmlvbjY0ICopIHMxOworCisgIC8qIDQ6IGxvYWRwbCAqLworICB2YXIzNi5mID0gcDE7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRxICovCisgICAgdmFyMzQgPSBwdHI0W2ldOworICAgIC8qIDE6IHNlbGVjdDBxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzNC5pOworICAgICAgdmFyMzguaSA9IF9zcmMueDJbMF07CisgICAgfQorICAgIC8qIDI6IGxvYWRxICovCisgICAgdmFyMzUgPSBwdHI0W2ldOworICAgIC8qIDM6IHNlbGVjdDFxbCAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9zcmM7CisgICAgICBfc3JjLmkgPSB2YXIzNS5pOworICAgICAgdmFyMzkuaSA9IF9zcmMueDJbMV07CisgICAgfQorICAgIC8qIDU6IG11bGYgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMTsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMyOworICAgICAgb3JjX3VuaW9uMzIgX2Rlc3QxOworICAgICAgX3NyYzEuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzkuaSk7CisgICAgICBfc3JjMi5pID0gT1JDX0RFTk9STUFMICh2YXIzNi5pKTsKKyAgICAgIF9kZXN0MS5mID0gX3NyYzEuZiAqIF9zcmMyLmY7CisgICAgICB2YXI0MC5pID0gT1JDX0RFTk9STUFMIChfZGVzdDEuaSk7CisgICAgfQorICAgIC8qIDY6IG1lcmdlbHEgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfZGVzdDsKKyAgICAgIF9kZXN0LngyWzBdID0gdmFyMzguaTsKKyAgICAgIF9kZXN0LngyWzFdID0gdmFyNDAuaTsKKyAgICAgIHZhcjM3LmkgPSBfZGVzdC5pOworICAgIH0KKyAgICAvKiA3OiBzdG9yZXEgKi8KKyAgICBwdHIwW2ldID0gdmFyMzc7CisgIH0KKworfQorCisjZWxzZQorc3RhdGljIHZvaWQKK19iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9zaW1fcmlnaHQgKE9yY0V4ZWN1dG9yICoKKyAgICBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgbiA9IGV4LT5uOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uNjQgdmFyMzQ7CisgIG9yY191bmlvbjY0IHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uNjQgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisKKyAgcHRyMCA9IChvcmNfdW5pb242NCAqKSBleC0+YXJyYXlzWzBdOworICBwdHI0ID0gKG9yY191bmlvbjY0ICopIGV4LT5hcnJheXNbNF07CisKKyAgLyogNDogbG9hZHBsICovCisgIHZhcjM2LmkgPSBleC0+cGFyYW1zWzI0XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZHEgKi8KKyAgICB2YXIzNCA9IHB0cjRbaV07CisgICAgLyogMTogc2VsZWN0MHFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM0Lmk7CisgICAgICB2YXIzOC5pID0gX3NyYy54MlswXTsKKyAgICB9CisgICAgLyogMjogbG9hZHEgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMzogc2VsZWN0MXFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM1Lmk7CisgICAgICB2YXIzOS5pID0gX3NyYy54MlsxXTsKKyAgICB9CisgICAgLyogNTogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXIzOS5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM2LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQwLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogNjogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXIzOC5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXI0MC5pOworICAgICAgdmFyMzcuaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDc6IHN0b3JlcSAqLworICAgIHB0cjBbaV0gPSB2YXIzNzsKKyAgfQorCit9CisKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfc2ltX3JpZ2h0IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA5LCA0NCwgOTcsIDExNywgMTAwLCAxMDUsIDExMSwgMTEyLCA5NywgMTEwLCAxMTEsIDExNCwgOTcsIDEwOSwgOTcsCisgICAgICAgIDEwOSwgOTUsIDExMSwgMTE0LCA5OSwgOTUsIDExMiwgMTE0LCAxMTEsIDk5LCAxMDEsIDExNSwgMTE1LCA5NSwgMTAyLAorICAgICAgICA1MSwKKyAgICAgICAgNTAsIDk1LCA5OSwgMTA0LCA1MCwgOTUsIDExNSwgMTA1LCAxMDksIDk1LCAxMTQsIDEwNSwgMTAzLCAxMDQsIDExNiwgMTEsCisgICAgICAgIDgsIDgsIDEyLCA4LCA4LCAxNywgNCwgMjAsIDQsIDIwLCA0LCAxOTIsIDMyLCA0LCAxOTMsIDMzLAorICAgICAgICA0LCAyMDIsIDMzLCAzMywgMjQsIDE5NCwgMCwgMzIsIDMzLCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3NpbV9yaWdodCk7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9uYW1lIChwLCAiYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9zaW1fcmlnaHQiKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3NpbV9yaWdodCk7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDgsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgOCwgInMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfcGFyYW1ldGVyX2Zsb2F0IChwLCA0LCAicDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQyIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MHFsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9TMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MXFsIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9TMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsZiIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDIsIE9SQ19WQVJfUDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm1lcmdlbHEiLCAwLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX0QxXSA9IGQxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzFdID0gKHZvaWQgKikgczE7CisgIHsKKyAgICBvcmNfdW5pb24zMiB0bXA7CisgICAgdG1wLmYgPSBwMTsKKyAgICBleC0+cGFyYW1zW09SQ19WQVJfUDFdID0gdG1wLmk7CisgIH0KKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9zaW1fbGVmdCAqLworI2lmZGVmIERJU0FCTEVfT1JDCit2b2lkCithdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3NpbV9sZWZ0IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uNjQgdmFyMzQ7CisgIG9yY191bmlvbjY0IHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uNjQgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisKKyAgcHRyMCA9IChvcmNfdW5pb242NCAqKSBkMTsKKyAgcHRyNCA9IChvcmNfdW5pb242NCAqKSBzMTsKKworICAvKiA0OiBsb2FkcGwgKi8KKyAgdmFyMzYuZiA9IHAxOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkcSAqLworICAgIHZhcjM0ID0gcHRyNFtpXTsKKyAgICAvKiAxOiBzZWxlY3QwcWwgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfc3JjOworICAgICAgX3NyYy5pID0gdmFyMzQuaTsKKyAgICAgIHZhcjM4LmkgPSBfc3JjLngyWzBdOworICAgIH0KKyAgICAvKiAyOiBsb2FkcSAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiAzOiBzZWxlY3QxcWwgKi8KKyAgICB7CisgICAgICBvcmNfdW5pb242NCBfc3JjOworICAgICAgX3NyYy5pID0gdmFyMzUuaTsKKyAgICAgIHZhcjM5LmkgPSBfc3JjLngyWzFdOworICAgIH0KKyAgICAvKiA1OiBtdWxmICovCisgICAgeworICAgICAgb3JjX3VuaW9uMzIgX3NyYzE7CisgICAgICBvcmNfdW5pb24zMiBfc3JjMjsKKyAgICAgIG9yY191bmlvbjMyIF9kZXN0MTsKKyAgICAgIF9zcmMxLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM4LmkpOworICAgICAgX3NyYzIuaSA9IE9SQ19ERU5PUk1BTCAodmFyMzYuaSk7CisgICAgICBfZGVzdDEuZiA9IF9zcmMxLmYgKiBfc3JjMi5mOworICAgICAgdmFyNDAuaSA9IE9SQ19ERU5PUk1BTCAoX2Rlc3QxLmkpOworICAgIH0KKyAgICAvKiA2OiBtZXJnZWxxICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX2Rlc3Q7CisgICAgICBfZGVzdC54MlswXSA9IHZhcjQwLmk7CisgICAgICBfZGVzdC54MlsxXSA9IHZhcjM5Lmk7CisgICAgICB2YXIzNy5pID0gX2Rlc3QuaTsKKyAgICB9CisgICAgLyogNzogc3RvcmVxICovCisgICAgcHRyMFtpXSA9IHZhcjM3OworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfc2ltX2xlZnQgKE9yY0V4ZWN1dG9yICoKKyAgICBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgbiA9IGV4LT5uOworICBvcmNfdW5pb242NCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjY0ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uNjQgdmFyMzQ7CisgIG9yY191bmlvbjY0IHZhcjM1OworICBvcmNfdW5pb24zMiB2YXIzNjsKKyAgb3JjX3VuaW9uNjQgdmFyMzc7CisgIG9yY191bmlvbjMyIHZhcjM4OworICBvcmNfdW5pb24zMiB2YXIzOTsKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisKKyAgcHRyMCA9IChvcmNfdW5pb242NCAqKSBleC0+YXJyYXlzWzBdOworICBwdHI0ID0gKG9yY191bmlvbjY0ICopIGV4LT5hcnJheXNbNF07CisKKyAgLyogNDogbG9hZHBsICovCisgIHZhcjM2LmkgPSBleC0+cGFyYW1zWzI0XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZHEgKi8KKyAgICB2YXIzNCA9IHB0cjRbaV07CisgICAgLyogMTogc2VsZWN0MHFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM0Lmk7CisgICAgICB2YXIzOC5pID0gX3NyYy54MlswXTsKKyAgICB9CisgICAgLyogMjogbG9hZHEgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMzogc2VsZWN0MXFsICovCisgICAgeworICAgICAgb3JjX3VuaW9uNjQgX3NyYzsKKyAgICAgIF9zcmMuaSA9IHZhcjM1Lmk7CisgICAgICB2YXIzOS5pID0gX3NyYy54MlsxXTsKKyAgICB9CisgICAgLyogNTogbXVsZiAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjMyIF9zcmMxOworICAgICAgb3JjX3VuaW9uMzIgX3NyYzI7CisgICAgICBvcmNfdW5pb24zMiBfZGVzdDE7CisgICAgICBfc3JjMS5pID0gT1JDX0RFTk9STUFMICh2YXIzOC5pKTsKKyAgICAgIF9zcmMyLmkgPSBPUkNfREVOT1JNQUwgKHZhcjM2LmkpOworICAgICAgX2Rlc3QxLmYgPSBfc3JjMS5mICogX3NyYzIuZjsKKyAgICAgIHZhcjQwLmkgPSBPUkNfREVOT1JNQUwgKF9kZXN0MS5pKTsKKyAgICB9CisgICAgLyogNjogbWVyZ2VscSAqLworICAgIHsKKyAgICAgIG9yY191bmlvbjY0IF9kZXN0OworICAgICAgX2Rlc3QueDJbMF0gPSB2YXI0MC5pOworICAgICAgX2Rlc3QueDJbMV0gPSB2YXIzOS5pOworICAgICAgdmFyMzcuaSA9IF9kZXN0Lmk7CisgICAgfQorICAgIC8qIDc6IHN0b3JlcSAqLworICAgIHB0cjBbaV0gPSB2YXIzNzsKKyAgfQorCit9CisKK3ZvaWQKK2F1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfc2ltX2xlZnQgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbikKK3sKKyAgT3JjRXhlY3V0b3IgX2V4LCAqZXggPSAmX2V4OworICBzdGF0aWMgdm9sYXRpbGUgaW50IHBfaW5pdGVkID0gMDsKKyAgc3RhdGljIE9yY0NvZGUgKmMgPSAwOworICB2b2lkICgqZnVuYykgKE9yY0V4ZWN1dG9yICopOworCisgIGlmICghcF9pbml0ZWQpIHsKKyAgICBvcmNfb25jZV9tdXRleF9sb2NrICgpOworICAgIGlmICghcF9pbml0ZWQpIHsKKyAgICAgIE9yY1Byb2dyYW0gKnA7CisKKyNpZiAxCisgICAgICBzdGF0aWMgY29uc3Qgb3JjX3VpbnQ4IGJjW10gPSB7CisgICAgICAgIDEsIDksIDQzLCA5NywgMTE3LCAxMDAsIDEwNSwgMTExLCAxMTIsIDk3LCAxMTAsIDExMSwgMTE0LCA5NywgMTA5LCA5NywKKyAgICAgICAgMTA5LCA5NSwgMTExLCAxMTQsIDk5LCA5NSwgMTEyLCAxMTQsIDExMSwgOTksIDEwMSwgMTE1LCAxMTUsIDk1LCAxMDIsCisgICAgICAgIDUxLAorICAgICAgICA1MCwgOTUsIDk5LCAxMDQsIDUwLCA5NSwgMTE1LCAxMDUsIDEwOSwgOTUsIDEwOCwgMTAxLCAxMDIsIDExNiwgMTEsIDgsCisgICAgICAgIDgsIDEyLCA4LCA4LCAxNywgNCwgMjAsIDQsIDIwLCA0LCAxOTIsIDMyLCA0LCAxOTMsIDMzLCA0LAorICAgICAgICAyMDIsIDMyLCAzMiwgMjQsIDE5NCwgMCwgMzIsIDMzLCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsCisgICAgICAgICAgX2JhY2t1cF9hdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3NpbV9sZWZ0KTsKKyNlbHNlCisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3ICgpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X25hbWUgKHAsICJhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3NpbV9sZWZ0Iik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9zaW1fbGVmdCk7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDgsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgOCwgInMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfcGFyYW1ldGVyX2Zsb2F0IChwLCA0LCAicDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDQsICJ0MSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQyIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MHFsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9TMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2VsZWN0MXFsIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9TMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsZiIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfUDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm1lcmdlbHEiLCAwLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX0QxXSA9IGQxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzFdID0gKHZvaWQgKikgczE7CisgIHsKKyAgICBvcmNfdW5pb24zMiB0bXA7CisgICAgdG1wLmYgPSBwMTsKKyAgICBleC0+cGFyYW1zW09SQ19WQVJfUDFdID0gdG1wLmk7CisgIH0KKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hb3JjLWRpc3QuaCBiL2dzdC9hdWRpb2Z4L2F1ZGlvcGFub3JhbWFvcmMtZGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MTFmYmEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hb3JjLWRpc3QuaApAQCAtMCwwICsxLDEwNyBAQAorCisvKiBhdXRvZ2VuZXJhdGVkIGZyb20gYXVkaW9wYW5vcmFtYW9yYy5vcmMgKi8KKworI2lmbmRlZiBfQVVESU9QQU5PUkFNQU9SQ19IXworI2RlZmluZSBfQVVESU9QQU5PUkFNQU9SQ19IXworCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworCisjaWZuZGVmIF9PUkNfSU5URUdFUl9UWVBFREVGU18KKyNkZWZpbmUgX09SQ19JTlRFR0VSX1RZUEVERUZTXworI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjaW5jbHVkZSA8c3RkaW50Lmg+Cit0eXBlZGVmIGludDhfdCBvcmNfaW50ODsKK3R5cGVkZWYgaW50MTZfdCBvcmNfaW50MTY7Cit0eXBlZGVmIGludDMyX3Qgb3JjX2ludDMyOwordHlwZWRlZiBpbnQ2NF90IG9yY19pbnQ2NDsKK3R5cGVkZWYgdWludDhfdCBvcmNfdWludDg7Cit0eXBlZGVmIHVpbnQxNl90IG9yY191aW50MTY7Cit0eXBlZGVmIHVpbnQzMl90IG9yY191aW50MzI7Cit0eXBlZGVmIHVpbnQ2NF90IG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSBVSU5UNjRfQyh4KQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKK3R5cGVkZWYgc2lnbmVkIF9faW50OCBvcmNfaW50ODsKK3R5cGVkZWYgc2lnbmVkIF9faW50MTYgb3JjX2ludDE2OwordHlwZWRlZiBzaWduZWQgX19pbnQzMiBvcmNfaW50MzI7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDY0IG9yY19pbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ4IG9yY191aW50ODsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQxNiBvcmNfdWludDE2OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDMyIG9yY191aW50MzI7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgb3JjX3VpbnQ2NDsKKyNkZWZpbmUgT1JDX1VJTlQ2NF9DKHgpICh4IyNVaTY0KQorI2RlZmluZSBpbmxpbmUgX19pbmxpbmUKKyNlbHNlCisjaW5jbHVkZSA8bGltaXRzLmg+Cit0eXBlZGVmIHNpZ25lZCBjaGFyIG9yY19pbnQ4OwordHlwZWRlZiBzaG9ydCBvcmNfaW50MTY7Cit0eXBlZGVmIGludCBvcmNfaW50MzI7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgb3JjX3VpbnQ4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBvcmNfdWludDE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgb3JjX3VpbnQzMjsKKyNpZiBJTlRfTUFYID09IExPTkdfTUFYCit0eXBlZGVmIGxvbmcgbG9uZyBvcmNfaW50NjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgKHgjI1VMTCkKKyNlbHNlCit0eXBlZGVmIGxvbmcgb3JjX2ludDY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSAoeCMjVUwpCisjZW5kaWYKKyNlbmRpZgordHlwZWRlZiB1bmlvbiB7IG9yY19pbnQxNiBpOyBvcmNfaW50OCB4MlsyXTsgfSBvcmNfdW5pb24xNjsKK3R5cGVkZWYgdW5pb24geyBvcmNfaW50MzIgaTsgZmxvYXQgZjsgb3JjX2ludDE2IHgyWzJdOyBvcmNfaW50OCB4NFs0XTsgfSBvcmNfdW5pb24zMjsKK3R5cGVkZWYgdW5pb24geyBvcmNfaW50NjQgaTsgZG91YmxlIGY7IG9yY19pbnQzMiB4MlsyXTsgZmxvYXQgeDJmWzJdOyBvcmNfaW50MTYgeDRbNF07IH0gb3JjX3VuaW9uNjQ7CisjZW5kaWYKKyNpZm5kZWYgT1JDX1JFU1RSSUNUCisjaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyNkZWZpbmUgT1JDX1JFU1RSSUNUIHJlc3RyaWN0CisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSA0CisjZGVmaW5lIE9SQ19SRVNUUklDVCBfX3Jlc3RyaWN0X18KKyNlbHNlCisjZGVmaW5lIE9SQ19SRVNUUklDVAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBPUkNfSU5URVJOQUwKKyNpZiBkZWZpbmVkKF9fU1VOUFJPX0MpICYmIChfX1NVTlBST19DID49IDB4NTkwKQorI2RlZmluZSBPUkNfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKQorI2VsaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU1MCkKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9faGlkZGVuCisjZWxpZiBkZWZpbmVkIChfX0dOVUNfXykKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbHNlCisjZGVmaW5lIE9SQ19JTlRFUk5BTAorI2VuZGlmCisjZW5kaWYKKwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX25vbmUgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfbm9uZSAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLCBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGludCBuKTsKK3ZvaWQgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9ub25lIChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX25vbmUgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfcHN5IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGZsb2F0IHAyLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfcHN5IChnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgZDEsIGNvbnN0IGdmbG9hdCAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGZsb2F0IHAyLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfcHN5X3JpZ2h0IChnaW50MTYgKiBPUkNfUkVTVFJJQ1QgZDEsIGNvbnN0IGdpbnQxNiAqIE9SQ19SRVNUUklDVCBzMSwgZmxvYXQgcDEsIGZsb2F0IHAyLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfcHN5X2xlZnQgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKTsKK3ZvaWQgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9wc3lfcmlnaHQgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgZmxvYXQgcDIsIGludCBuKTsKK3ZvaWQgYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9wc3lfbGVmdCAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLCBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBmbG9hdCBwMiwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3NpbV9yaWdodCAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLCBjb25zdCBnaW50MTYgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfc2ltX2xlZnQgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3NpbV9yaWdodCAoZ2ludDE2ICogT1JDX1JFU1RSSUNUIGQxLCBjb25zdCBnaW50MTYgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfc2ltX2xlZnQgKGdpbnQxNiAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ2ludDE2ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gxX3NpbV9yaWdodCAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLCBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfc2ltX2xlZnQgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pOwordm9pZCBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3NpbV9yaWdodCAoZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIGQxLCBjb25zdCBnZmxvYXQgKiBPUkNfUkVTVFJJQ1QgczEsIGZsb2F0IHAxLCBpbnQgbik7Cit2b2lkIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfc2ltX2xlZnQgKGdmbG9hdCAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ2Zsb2F0ICogT1JDX1JFU1RSSUNUIHMxLCBmbG9hdCBwMSwgaW50IG4pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYW9yYy5vcmMgYi9nc3QvYXVkaW9meC9hdWRpb3Bhbm9yYW1hb3JjLm9yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjE0MDExCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvYXVkaW9wYW5vcmFtYW9yYy5vcmMKQEAgLTAsMCArMSwyNTggQEAKKyMgcGFzcyB0aHJvdWdoIGZ1bmN0aW9ucworCisuZnVuY3Rpb24gYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9ub25lCisuc291cmNlIDIgczEgZ2ludDE2CisuZGVzdCA0IGQxIGdpbnQxNgorCittZXJnZXdsIGQxIHMxIHMxCisKKworLmZ1bmN0aW9uIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfbm9uZQorLnNvdXJjZSA0IHMxIGdmbG9hdAorLmRlc3QgOCBkMSBnZmxvYXQKKworbWVyZ2VscSBkMSBzMSBzMQorCisKKy5mdW5jdGlvbiBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX25vbmUKKy5zb3VyY2UgNCBzMSBnaW50MTYKKy5kZXN0IDQgZDEgZ2ludDE2CisKK3gyIGNvcHl3IGQxIHMxCisKKworLmZ1bmN0aW9uIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfbm9uZQorLnNvdXJjZSA4IHMxIGdmbG9hdAorLmRlc3QgOCBkMSBnZmxvYXQKKworeDIgY29weWwgZDEgczEKKworCisjIHBzeWNob2Fjb3VzdGljIHByb2Nlc3NpbmcgZnVuY3Rpb24KKworLmZ1bmN0aW9uIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDFfcHN5Cisuc291cmNlIDIgczEgZ2ludDE2CisuZGVzdCA0IGQxIGdpbnQxNgorLmZsb2F0cGFyYW0gNCBscGFuCisuZmxvYXRwYXJhbSA0IHJwYW4KKy50ZW1wIDggdDEKKy50ZW1wIDQgbGVmdAorLnRlbXAgNCByaWdodAorCitjb252c3dsIGxlZnQgczEKK2NvbnZsZiBsZWZ0IGxlZnQKK211bGYgcmlnaHQgbGVmdCBycGFuCittdWxmIGxlZnQgbGVmdCBscGFuCittZXJnZWxxIHQxIGxlZnQgcmlnaHQKK3gyIGNvbnZmbCB0MSB0MQoreDIgY29udnNzc2x3IGQxIHQxCisKKworLmZ1bmN0aW9uIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfcHN5Cisuc291cmNlIDQgczEgZ2Zsb2F0CisuZGVzdCA4IGQxIGdmbG9hdAorLmZsb2F0cGFyYW0gNCBscGFuCisuZmxvYXRwYXJhbSA0IHJwYW4KKy50ZW1wIDQgbGVmdAorLnRlbXAgNCByaWdodAorCittdWxmIHJpZ2h0IHMxIHJwYW4KK211bGYgbGVmdCBzMSBscGFuCittZXJnZWxxIGQxIGxlZnQgcmlnaHQKKworCisuZnVuY3Rpb24gYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9wc3lfcmlnaHQKKy5zb3VyY2UgNCBzMSBnaW50MTYKKy5kZXN0IDQgZDEgZ2ludDE2CisuZmxvYXRwYXJhbSA0IGxscGFuCisuZmxvYXRwYXJhbSA0IHJscGFuCisudGVtcCA4IHQxCisudGVtcCA0IGxlZnQKKy50ZW1wIDQgcmlnaHQKKy50ZW1wIDQgcmlnaHQxCisKK3gyIGNvbnZzd2wgdDEgczEKK3gyIGNvbnZsZiB0MSB0MQorc2VsZWN0MHFsIGxlZnQgdDEKK3NlbGVjdDFxbCByaWdodCB0MQorbXVsZiByaWdodDEgbGVmdCBybHBhbgorbXVsZiBsZWZ0IGxlZnQgbGxwYW4KK2FkZGYgcmlnaHQgcmlnaHQxIHJpZ2h0CittZXJnZWxxIHQxIGxlZnQgcmlnaHQKK3gyIGNvbnZmbCB0MSB0MQoreDIgY29udnNzc2x3IGQxIHQxCisKKworLmZ1bmN0aW9uIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX3MxNl9jaDJfcHN5X2xlZnQKKy5zb3VyY2UgNCBzMSBnaW50MTYKKy5kZXN0IDQgZDEgZ2ludDE2CisuZmxvYXRwYXJhbSA0IGxycGFuCisuZmxvYXRwYXJhbSA0IHJycGFuCisudGVtcCA4IHQxCisudGVtcCA0IGxlZnQKKy50ZW1wIDQgbGVmdDEKKy50ZW1wIDQgcmlnaHQKKworeDIgY29udnN3bCB0MSBzMQoreDIgY29udmxmIHQxIHQxCitzZWxlY3QwcWwgbGVmdCB0MQorc2VsZWN0MXFsIHJpZ2h0IHQxCittdWxmIGxlZnQxIHJpZ2h0IGxycGFuCittdWxmIHJpZ2h0IHJpZ2h0IHJycGFuCithZGRmIGxlZnQgbGVmdDEgbGVmdAorbWVyZ2VscSB0MSBsZWZ0IHJpZ2h0Cit4MiBjb252ZmwgdDEgdDEKK3gyIGNvbnZzc3NsdyBkMSB0MQorCisKKy5mdW5jdGlvbiBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19mMzJfY2gyX3BzeV9yaWdodAorLnNvdXJjZSA4IHMxIGdmbG9hdAorLmRlc3QgOCBkMSBnZmxvYXQKKy5mbG9hdHBhcmFtIDQgbGxwYW4KKy5mbG9hdHBhcmFtIDQgcmxwYW4KKy50ZW1wIDQgbGVmdAorLnRlbXAgNCByaWdodAorLnRlbXAgNCByaWdodDEKKworc2VsZWN0MHFsIGxlZnQgczEKK3NlbGVjdDFxbCByaWdodCBzMQorbXVsZiByaWdodDEgbGVmdCBybHBhbgorbXVsZiBsZWZ0IGxlZnQgbGxwYW4KK2FkZGYgcmlnaHQgcmlnaHQxIHJpZ2h0CittZXJnZWxxIGQxIGxlZnQgcmlnaHQKKworCisuZnVuY3Rpb24gYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMl9wc3lfbGVmdAorLnNvdXJjZSA4IHMxIGdmbG9hdAorLmRlc3QgOCBkMSBnZmxvYXQKKy5mbG9hdHBhcmFtIDQgbHJwYW4KKy5mbG9hdHBhcmFtIDQgcnJwYW4KKy50ZW1wIDQgbGVmdAorLnRlbXAgNCBsZWZ0MQorLnRlbXAgNCByaWdodAorCitzZWxlY3QwcWwgbGVmdCBzMQorc2VsZWN0MXFsIHJpZ2h0IHMxCittdWxmIGxlZnQxIHJpZ2h0IGxycGFuCittdWxmIHJpZ2h0IHJpZ2h0IHJycGFuCithZGRmIGxlZnQgbGVmdDEgbGVmdAorbWVyZ2VscSBkMSBsZWZ0IHJpZ2h0CisKKyMgc2ltcGxlIHByb2Nlc3NpbmcgZnVuY3Rpb25zCisKKy5mdW5jdGlvbiBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gxX3NpbV9yaWdodAorLnNvdXJjZSAyIHMxIGdpbnQxNgorLmRlc3QgNCBkMSBnaW50MTYKKy5mbG9hdHBhcmFtIDQgcnBhbgorLnRlbXAgOCB0MQorLnRlbXAgNCBsZWZ0CisudGVtcCA0IHJpZ2h0CisKK2NvbnZzd2wgbGVmdCBzMQorY29udmxmIGxlZnQgbGVmdAorbXVsZiByaWdodCBsZWZ0IHJwYW4KK21lcmdlbHEgdDEgbGVmdCByaWdodAoreDIgY29udmZsIHQxIHQxCit4MiBjb252c3NzbHcgZDEgdDEKKworCisuZnVuY3Rpb24gYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMV9zaW1fbGVmdAorLnNvdXJjZSAyIHMxIGdpbnQxNgorLmRlc3QgNCBkMSBnaW50MTYKKy5mbG9hdHBhcmFtIDQgbHBhbgorLnRlbXAgOCB0MQorLnRlbXAgNCBsZWZ0CisudGVtcCA0IHJpZ2h0CisKK2NvbnZzd2wgcmlnaHQgczEKK2NvbnZsZiByaWdodCByaWdodAorbXVsZiBsZWZ0IHJpZ2h0IGxwYW4KK21lcmdlbHEgdDEgbGVmdCByaWdodAoreDIgY29udmZsIHQxIHQxCit4MiBjb252c3NzbHcgZDEgdDEKKworCisuZnVuY3Rpb24gYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfczE2X2NoMl9zaW1fcmlnaHQKKy5zb3VyY2UgNCBzMSBnaW50MTYKKy5kZXN0IDQgZDEgZ2ludDE2CisuZmxvYXRwYXJhbSA0IHJwYW4KKy50ZW1wIDggdDEKKy50ZW1wIDQgbGVmdAorLnRlbXAgNCByaWdodAorCit4MiBjb252c3dsIHQxIHMxCit4MiBjb252bGYgdDEgdDEKK3NlbGVjdDBxbCBsZWZ0IHQxCitzZWxlY3QxcWwgcmlnaHQgdDEKK211bGYgcmlnaHQgcmlnaHQgcnBhbgorbWVyZ2VscSB0MSBsZWZ0IHJpZ2h0Cit4MiBjb252ZmwgdDEgdDEKK3gyIGNvbnZzc3NsdyBkMSB0MQorCisKKy5mdW5jdGlvbiBhdWRpb3Bhbm9yYW1hbV9vcmNfcHJvY2Vzc19zMTZfY2gyX3NpbV9sZWZ0Cisuc291cmNlIDQgczEgZ2ludDE2CisuZGVzdCA0IGQxIGdpbnQxNgorLmZsb2F0cGFyYW0gNCBscGFuCisudGVtcCA4IHQxCisudGVtcCA0IGxlZnQKKy50ZW1wIDQgcmlnaHQKKworeDIgY29udnN3bCB0MSBzMQoreDIgY29udmxmIHQxIHQxCitzZWxlY3QwcWwgbGVmdCB0MQorc2VsZWN0MXFsIHJpZ2h0IHQxCittdWxmIGxlZnQgbGVmdCBscGFuCittZXJnZWxxIHQxIGxlZnQgcmlnaHQKK3gyIGNvbnZmbCB0MSB0MQoreDIgY29udnNzc2x3IGQxIHQxCisKKworLmZ1bmN0aW9uIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDFfc2ltX3JpZ2h0Cisuc291cmNlIDQgczEgZ2Zsb2F0CisuZGVzdCA4IGQxIGdmbG9hdAorLmZsb2F0cGFyYW0gNCBycGFuCisudGVtcCA0IGxlZnQKKy50ZW1wIDQgcmlnaHQKKworY29weWwgbGVmdCBzMQorbXVsZiByaWdodCBzMSBycGFuCittZXJnZWxxIGQxIGxlZnQgcmlnaHQKKworCisuZnVuY3Rpb24gYXVkaW9wYW5vcmFtYW1fb3JjX3Byb2Nlc3NfZjMyX2NoMV9zaW1fbGVmdAorLnNvdXJjZSA0IHMxIGdmbG9hdAorLmRlc3QgOCBkMSBnZmxvYXQKKy5mbG9hdHBhcmFtIDQgbHBhbgorLnRlbXAgNCBsZWZ0CisudGVtcCA0IHJpZ2h0CisKK211bGYgbGVmdCBzMSBscGFuCitjb3B5bCByaWdodCBzMQorbWVyZ2VscSBkMSBsZWZ0IHJpZ2h0CisKKworLmZ1bmN0aW9uIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfc2ltX3JpZ2h0Cisuc291cmNlIDggczEgZ2Zsb2F0CisuZGVzdCA4IGQxIGdmbG9hdAorLmZsb2F0cGFyYW0gNCBycGFuCisudGVtcCA0IGxlZnQKKy50ZW1wIDQgcmlnaHQKKworc2VsZWN0MHFsIGxlZnQgczEKK3NlbGVjdDFxbCByaWdodCBzMQorbXVsZiByaWdodCByaWdodCBycGFuCittZXJnZWxxIGQxIGxlZnQgcmlnaHQKKworLmZ1bmN0aW9uIGF1ZGlvcGFub3JhbWFtX29yY19wcm9jZXNzX2YzMl9jaDJfc2ltX2xlZnQKKy5zb3VyY2UgOCBzMSBnZmxvYXQKKy5kZXN0IDggZDEgZ2Zsb2F0CisuZmxvYXRwYXJhbSA0IGxwYW4KKy50ZW1wIDQgbGVmdAorLnRlbXAgNCByaWdodAorCitzZWxlY3QwcWwgbGVmdCBzMQorc2VsZWN0MXFsIHJpZ2h0IHMxCittdWxmIGxlZnQgbGVmdCBscGFuCittZXJnZWxxIGQxIGxlZnQgcmlnaHQKKwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuYyBiL2dzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E2NmQ0MQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNiYW5kLmMKQEAgLTAsMCArMSw0ODIgQEAKKy8qIC0qLSBjLWJhc2ljLW9mZnNldDogMiAtKi0KKyAqIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAyMDA2IERyZWFtbGFiIFRlY2hub2xvZ2llcyBMdGQuIDxtYXRoaXMuaG9mZXJAZHJlYW1sYWIubmV0PgorICogICAgICAgICAgICAgICAyMDA3LTIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKiAKKyAqIAorICogdGhpcyB3aW5kb3dlZCBzaW5jIGZpbHRlciBpcyB0YWtlbiBmcm9tIHRoZSBmcmVlbHkgZG93bmxvYWRhYmxlIERTUCBib29rLAorICogIlRoZSBTY2llbnRpc3QgYW5kIEVuZ2luZWVyJ3MgR3VpZGUgdG8gRGlnaXRhbCBTaWduYWwgUHJvY2Vzc2luZyIsCisgKiBjaGFwdGVyIDE2CisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5kc3BndWlkZS5jb20vCisgKgorICogRm9yIHRoZSB3aW5kb3cgZnVuY3Rpb25zIHNlZQorICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XaW5kb3dfZnVuY3Rpb24KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hdWRpb3dzaW5jYmFuZAorICoKKyAqIEF0dGVudWF0ZXMgYWxsIGZyZXF1ZW5jaWVzIG91dHNpZGUgKGJhbmRwYXNzKSBvciBpbnNpZGUgKGJhbmRyZWplY3QpIG9mIGEgZnJlcXVlbmN5CisgKiBiYW5kLiBUaGUgbGVuZ3RoIHBhcmFtZXRlciBjb250cm9scyB0aGUgcm9sbG9mZiwgdGhlIHdpbmRvdyBwYXJhbWV0ZXIKKyAqIGNvbnRyb2xzIHJvbGxvZmYgYW5kIHN0b3BiYW5kIGF0dGVudWF0aW9uLiBUaGUgSGFtbWluZyB3aW5kb3cgcHJvdmlkZXMgYSBmYXN0ZXIgcm9sbG9mZiBidXQgYSBiaXQKKyAqIHdvcnNlIHN0b3BiYW5kIGF0dGVudWF0aW9uLCB0aGUgb3RoZXIgd2F5IGFyb3VuZCBmb3IgdGhlIEJsYWNrbWFuIHdpbmRvdy4KKyAqCisgKiBUaGlzIGVsZW1lbnQgaGFzIHRoZSBhZHZhbnRhZ2Ugb3ZlciB0aGUgQ2hlYnlzaGV2IGJhbmRwYXNzIGFuZCBiYW5kcmVqZWN0IGZpbHRlciB0aGF0IGl0IGhhcworICogYSBtdWNoIGJldHRlciByb2xsb2ZmIHdoZW4gdXNpbmcgYSBsYXJnZXIga2VybmVsIHNpemUgYW5kIGFsbW9zdCBsaW5lYXIgcGhhc2UuIFRoZSBvbmx5CisgKiBkaXNhZHZhbnRhZ2UgaXMgdGhlIG11Y2ggc2xvd2VyIGV4ZWN1dGlvbiB0aW1lIHdpdGggbGFyZ2VyIGtlcm5lbHMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyBmcmVxPTE1MDAgISBhdWRpb2NvbnZlcnQgISBhdWRpb3dzaW5jYmFuZCBtb2RlPWJhbmQtcGFzcyBsb3dlci1mcmVxdWVuY3k9MzAwMCB1cHBlci1mcmVxdWVuY3k9MTAwMDAgbGVuZ3RoPTUwMSB3aW5kb3c9YmxhY2ttYW4gISBhdWRpb2NvbnZlcnQgISBhbHNhc2luaworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj0ibWVsbzEub2dnIiAhIG9nZ2RlbXV4ICEgdm9yYmlzZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW93c2luY2JhbmQgbW9kZT1iYW5kLXJlamVjdCBsb3dlci1mcmVxdWVuY3k9NTkgdXBwZXItZnJlcXVlbmN5PTYxIGxlbmd0aD0xMDAwMSB3aW5kb3c9aGFtbWluZyAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBnc3QtbGF1bmNoLTEuMCBhdWRpb3Rlc3RzcmMgd2F2ZT13aGl0ZS1ub2lzZSAhIGF1ZGlvY29udmVydCAhIGF1ZGlvd3NpbmNiYW5kIG1vZGU9YmFuZC1wYXNzIGxvd2VyLWZyZXF1ZW5jeT0xMDAwIHVwcGVyLWZyZXF1ZW5jeT0yMDAwIGxlbmd0aD0zMSAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2ZpbHRlci5oPgorCisjaW5jbHVkZSAiYXVkaW93c2luY2JhbmQuaCIKKworI2luY2x1ZGUgImdzdC9nbGliLWNvbXBhdC1wcml2YXRlLmgiCisKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9nc3RfYXVkaW9fd3NpbmNiYW5kX2RlYnVnCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChHU1RfQ0FUX0RFRkFVTFQpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MRU5HVEgsCisgIFBST1BfTE9XRVJfRlJFUVVFTkNZLAorICBQUk9QX1VQUEVSX0ZSRVFVRU5DWSwKKyAgUFJPUF9NT0RFLAorICBQUk9QX1dJTkRPVworfTsKKworZW51bQoreworICBNT0RFX0JBTkRfUEFTUyA9IDAsCisgIE1PREVfQkFORF9SRUpFQ1QKK307CisKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fV1NJTkNfQkFORF9NT0RFIChnc3RfZ3N0X2F1ZGlvX3dzaW5jYmFuZF9tb2RlX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfZ3N0X2F1ZGlvX3dzaW5jYmFuZF9tb2RlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZ3R5cGUgPSAwOworCisgIGlmIChndHlwZSA9PSAwKSB7CisgICAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAgICB7TU9ERV9CQU5EX1BBU1MsICJCYW5kIHBhc3MgKGRlZmF1bHQpIiwKKyAgICAgICAgICAiYmFuZC1wYXNzIn0sCisgICAgICB7TU9ERV9CQU5EX1JFSkVDVCwgIkJhbmQgcmVqZWN0IiwKKyAgICAgICAgICAiYmFuZC1yZWplY3QifSwKKyAgICAgIHswLCBOVUxMLCBOVUxMfQorICAgIH07CisKKyAgICBndHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RBdWRpb1dTaW5jQmFuZE1vZGUiLCB2YWx1ZXMpOworICB9CisgIHJldHVybiBndHlwZTsKK30KKworZW51bQoreworICBXSU5ET1dfSEFNTUlORyA9IDAsCisgIFdJTkRPV19CTEFDS01BTiwKKyAgV0lORE9XX0dBVVNTSUFOLAorICBXSU5ET1dfQ09TSU5FLAorICBXSU5ET1dfSEFOTgorfTsKKworI2RlZmluZSBHU1RfVFlQRV9BVURJT19XU0lOQ19CQU5EX1dJTkRPVyAoZ3N0X2dzdF9hdWRpb193c2luY2JhbmRfd2luZG93X2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfZ3N0X2F1ZGlvX3dzaW5jYmFuZF93aW5kb3dfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBndHlwZSA9IDA7CisKKyAgaWYgKGd0eXBlID09IDApIHsKKyAgICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSB2YWx1ZXNbXSA9IHsKKyAgICAgIHtXSU5ET1dfSEFNTUlORywgIkhhbW1pbmcgd2luZG93IChkZWZhdWx0KSIsCisgICAgICAgICAgImhhbW1pbmcifSwKKyAgICAgIHtXSU5ET1dfQkxBQ0tNQU4sICJCbGFja21hbiB3aW5kb3ciLAorICAgICAgICAgICJibGFja21hbiJ9LAorICAgICAge1dJTkRPV19HQVVTU0lBTiwgIkdhdXNzaWFuIHdpbmRvdyIsCisgICAgICAgICAgImdhdXNzaWFuIn0sCisgICAgICB7V0lORE9XX0NPU0lORSwgIkNvc2luZSB3aW5kb3ciLAorICAgICAgICAgICJjb3NpbmUifSwKKyAgICAgIHtXSU5ET1dfSEFOTiwgIkhhbm4gd2luZG93IiwKKyAgICAgICAgICAiaGFubiJ9LAorICAgICAgezAsIE5VTEwsIE5VTEx9CisgICAgfTsKKworICAgIGd0eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdEF1ZGlvV1NpbmNCYW5kV2luZG93IiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gZ3R5cGU7Cit9CisKKyNkZWZpbmUgZ3N0X2F1ZGlvX3dzaW5jYmFuZF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RBdWRpb1dTaW5jQmFuZCwgZ3N0X2F1ZGlvX3dzaW5jYmFuZCwKKyAgICBHU1RfVFlQRV9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIpOworCitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fd3NpbmNiYW5kX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdWRpb193c2luY2JhbmRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1ZGlvX3dzaW5jYmFuZF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fd3NpbmNiYW5kX3NldHVwIChHc3RBdWRpb0ZpbHRlciAqIGJhc2UsCisgICAgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbyk7CisKKyNkZWZpbmUgUE9XMih4KSAgKHgpKih4KQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX3dzaW5jYmFuZF9jbGFzc19pbml0IChHc3RBdWRpb1dTaW5jQmFuZENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEF1ZGlvRmlsdGVyQ2xhc3MgKmZpbHRlcl9jbGFzcyA9IChHc3RBdWRpb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfZ3N0X2F1ZGlvX3dzaW5jYmFuZF9kZWJ1ZywgImF1ZGlvd3NpbmNiYW5kIiwgMCwKKyAgICAgICJCYW5kLXBhc3MgYW5kIEJhbmQtcmVqZWN0IFdpbmRvd2VkIHNpbmMgZmlsdGVyIHBsdWdpbiIpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb193c2luY2JhbmRfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfYXVkaW9fd3NpbmNiYW5kX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfYXVkaW9fd3NpbmNiYW5kX2ZpbmFsaXplOworCisgIC8qIEZJWE1FOiBEb24ndCB1c2UgdGhlIGNvbXBsZXRlIHBvc3NpYmxlIHJhbmdlIGJ1dCByZXN0cmljdCB0aGUgdXBwZXIgYm91bmRhcnkKKyAgICogc28gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgVUlzIGNhbiB1c2UgYSBzbGlkZXIgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MT1dFUl9GUkVRVUVOQ1ksCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJsb3dlci1mcmVxdWVuY3kiLCAiTG93ZXIgRnJlcXVlbmN5IiwKKyAgICAgICAgICAiQ3V0LW9mZiBsb3dlciBmcmVxdWVuY3kgKEh6KSIsIDAuMCwgMTAwMDAwLjAsIDAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1VQUEVSX0ZSRVFVRU5DWSwKKyAgICAgIGdfcGFyYW1fc3BlY19mbG9hdCAoInVwcGVyLWZyZXF1ZW5jeSIsICJVcHBlciBGcmVxdWVuY3kiLAorICAgICAgICAgICJDdXQtb2ZmIHVwcGVyIGZyZXF1ZW5jeSAoSHopIiwgMC4wLCAxMDAwMDAuMCwgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTEVOR1RILAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImxlbmd0aCIsICJMZW5ndGgiLAorICAgICAgICAgICJGaWx0ZXIga2VybmVsIGxlbmd0aCwgd2lsbCBiZSByb3VuZGVkIHRvIHRoZSBuZXh0IG9kZCBudW1iZXIiLCAzLAorICAgICAgICAgIDI1NjAwMCwgMTAxLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoIm1vZGUiLCAiTW9kZSIsCisgICAgICAgICAgIkJhbmQgcGFzcyBvciBiYW5kIHJlamVjdCBtb2RlIiwgR1NUX1RZUEVfQVVESU9fV1NJTkNfQkFORF9NT0RFLAorICAgICAgICAgIE1PREVfQkFORF9QQVNTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1dJTkRPVywKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgid2luZG93IiwgIldpbmRvdyIsCisgICAgICAgICAgIldpbmRvdyBmdW5jdGlvbiB0byB1c2UiLCBHU1RfVFlQRV9BVURJT19XU0lOQ19CQU5EX1dJTkRPVywKKyAgICAgICAgICBXSU5ET1dfSEFNTUlORywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJCYW5kIHBhc3MgJiBiYW5kIHJlamVjdCBmaWx0ZXIiLCAiRmlsdGVyL0VmZmVjdC9BdWRpbyIsCisgICAgICAiQmFuZCBwYXNzIGFuZCBiYW5kIHJlamVjdCB3aW5kb3dlZCBzaW5jIGZpbHRlciIsCisgICAgICAiVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPiwgIgorICAgICAgIlN0ZXZlbiBXLiBTbWl0aCwgIgorICAgICAgIkRyZWFtbGFiIFRlY2hub2xvZ2llcyBMdGQuIDxtYXRoaXMuaG9mZXJAZHJlYW1sYWIubmV0PiwgIgorICAgICAgIlNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPiIpOworCisgIGZpbHRlcl9jbGFzcy0+c2V0dXAgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1ZGlvX3dzaW5jYmFuZF9zZXR1cCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fd3NpbmNiYW5kX2luaXQgKEdzdEF1ZGlvV1NpbmNCYW5kICogc2VsZikKK3sKKyAgc2VsZi0+a2VybmVsX2xlbmd0aCA9IDEwMTsKKyAgc2VsZi0+bG93ZXJfZnJlcXVlbmN5ID0gMC4wOworICBzZWxmLT51cHBlcl9mcmVxdWVuY3kgPSAwLjA7CisgIHNlbGYtPm1vZGUgPSBNT0RFX0JBTkRfUEFTUzsKKyAgc2VsZi0+d2luZG93ID0gV0lORE9XX0hBTU1JTkc7CisKKyAgZ19tdXRleF9pbml0ICgmc2VsZi0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fd3NpbmNiYW5kX2J1aWxkX2tlcm5lbCAoR3N0QXVkaW9XU2luY0JhbmQgKiBzZWxmLAorICAgIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIGdpbnQgaSA9IDA7CisgIGdkb3VibGUgc3VtID0gMC4wOworICBnaW50IGxlbiA9IDA7CisgIGdkb3VibGUgKmtlcm5lbF9scCwgKmtlcm5lbF9ocDsKKyAgZ2RvdWJsZSB3OworICBnZG91YmxlICprZXJuZWw7CisgIGdpbnQgcmF0ZSwgY2hhbm5lbHM7CisKKyAgbGVuID0gc2VsZi0+a2VybmVsX2xlbmd0aDsKKworICBpZiAoaW5mbykgeworICAgIHJhdGUgPSBHU1RfQVVESU9fSU5GT19SQVRFIChpbmZvKTsKKyAgICBjaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChpbmZvKTsKKyAgfSBlbHNlIHsKKyAgICByYXRlID0gR1NUX0FVRElPX0ZJTFRFUl9SQVRFIChzZWxmKTsKKyAgICBjaGFubmVscyA9IEdTVF9BVURJT19GSUxURVJfQ0hBTk5FTFMgKHNlbGYpOworICB9CisKKyAgaWYgKHJhdGUgPT0gMCkgeworICAgIEdTVF9ERUJVRyAoInJhdGUgbm90IHNldCB5ZXQiKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoY2hhbm5lbHMgPT0gMCkgeworICAgIEdTVF9ERUJVRyAoImNoYW5uZWxzIG5vdCBzZXQgeWV0Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogQ2xhbXAgZnJlcXVlbmNpZXMgKi8KKyAgc2VsZi0+bG93ZXJfZnJlcXVlbmN5ID0gQ0xBTVAgKHNlbGYtPmxvd2VyX2ZyZXF1ZW5jeSwgMC4wLCByYXRlIC8gMik7CisgIHNlbGYtPnVwcGVyX2ZyZXF1ZW5jeSA9IENMQU1QIChzZWxmLT51cHBlcl9mcmVxdWVuY3ksIDAuMCwgcmF0ZSAvIDIpOworCisgIGlmIChzZWxmLT5sb3dlcl9mcmVxdWVuY3kgPiBzZWxmLT51cHBlcl9mcmVxdWVuY3kpIHsKKyAgICBnaW50IHRtcCA9IHNlbGYtPmxvd2VyX2ZyZXF1ZW5jeTsKKworICAgIHNlbGYtPmxvd2VyX2ZyZXF1ZW5jeSA9IHNlbGYtPnVwcGVyX2ZyZXF1ZW5jeTsKKyAgICBzZWxmLT51cHBlcl9mcmVxdWVuY3kgPSB0bXA7CisgIH0KKworICBHU1RfREVCVUcgKCJnc3RfYXVkaW9fd3NpbmNiYW5kOiBpbml0aWFsaXppbmcgZmlsdGVyIGtlcm5lbCBvZiBsZW5ndGggJWQgIgorICAgICAgIndpdGggbG93ZXIgZnJlcXVlbmN5ICUuMmxmIEh6ICIKKyAgICAgICIsIHVwcGVyIGZyZXF1ZW5jeSAlLjJsZiBIeiBmb3IgbW9kZSAlcyIsCisgICAgICBsZW4sIHNlbGYtPmxvd2VyX2ZyZXF1ZW5jeSwgc2VsZi0+dXBwZXJfZnJlcXVlbmN5LAorICAgICAgKHNlbGYtPm1vZGUgPT0gTU9ERV9CQU5EX1BBU1MpID8gImJhbmQtcGFzcyIgOiAiYmFuZC1yZWplY3QiKTsKKworICAvKiBmaWxsIHRoZSBscCBrZXJuZWwgKi8KKyAgdyA9IDIgKiBHX1BJICogKHNlbGYtPmxvd2VyX2ZyZXF1ZW5jeSAvIHJhdGUpOworICBrZXJuZWxfbHAgPSBnX25ldyAoZ2RvdWJsZSwgbGVuKTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgaWYgKGkgPT0gKGxlbiAtIDEpIC8gMi4wKQorICAgICAga2VybmVsX2xwW2ldID0gdzsKKyAgICBlbHNlCisgICAgICBrZXJuZWxfbHBbaV0gPSBzaW4gKHcgKiAoaSAtIChsZW4gLSAxKSAvIDIuMCkpIC8gKGkgLSAobGVuIC0gMSkgLyAyLjApOworCisgICAgLyogd2luZG93aW5nICovCisgICAgc3dpdGNoIChzZWxmLT53aW5kb3cpIHsKKyAgICAgIGNhc2UgV0lORE9XX0hBTU1JTkc6CisgICAgICAgIGtlcm5lbF9scFtpXSAqPSAoMC41NCAtIDAuNDYgKiBjb3MgKDIgKiBHX1BJICogaSAvIChsZW4gLSAxKSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV0lORE9XX0JMQUNLTUFOOgorICAgICAgICBrZXJuZWxfbHBbaV0gKj0gKDAuNDIgLSAwLjUgKiBjb3MgKDIgKiBHX1BJICogaSAvIChsZW4gLSAxKSkgKworICAgICAgICAgICAgMC4wOCAqIGNvcyAoNCAqIEdfUEkgKiBpIC8gKGxlbiAtIDEpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXSU5ET1dfR0FVU1NJQU46CisgICAgICAgIGtlcm5lbF9scFtpXSAqPSBleHAgKC0wLjUgKiBQT1cyICgzLjAgLyBsZW4gKiAoMiAqIGkgLSAobGVuIC0gMSkpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXSU5ET1dfQ09TSU5FOgorICAgICAgICBrZXJuZWxfbHBbaV0gKj0gY29zIChHX1BJICogaSAvIChsZW4gLSAxKSAtIEdfUEkgLyAyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdJTkRPV19IQU5OOgorICAgICAgICBrZXJuZWxfbHBbaV0gKj0gMC41ICogKDEgLSBjb3MgKDIgKiBHX1BJICogaSAvIChsZW4gLSAxKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBub3JtYWxpemUgZm9yIHVuaXR5IGdhaW4gYXQgREMgKi8KKyAgc3VtID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisgICAgc3VtICs9IGtlcm5lbF9scFtpXTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorICAgIGtlcm5lbF9scFtpXSAvPSBzdW07CisKKyAgLyogZmlsbCB0aGUgaHAga2VybmVsICovCisgIHcgPSAyICogR19QSSAqIChzZWxmLT51cHBlcl9mcmVxdWVuY3kgLyByYXRlKTsKKyAga2VybmVsX2hwID0gZ19uZXcgKGdkb3VibGUsIGxlbik7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgIGlmIChpID09IChsZW4gLSAxKSAvIDIuMCkKKyAgICAgIGtlcm5lbF9ocFtpXSA9IHc7CisgICAgZWxzZQorICAgICAga2VybmVsX2hwW2ldID0gc2luICh3ICogKGkgLSAobGVuIC0gMSkgLyAyLjApKSAvIChpIC0gKGxlbiAtIDEpIC8gMi4wKTsKKworICAgIC8qIFdpbmRvd2luZyAqLworICAgIHN3aXRjaCAoc2VsZi0+d2luZG93KSB7CisgICAgICBjYXNlIFdJTkRPV19IQU1NSU5HOgorICAgICAgICBrZXJuZWxfaHBbaV0gKj0gKDAuNTQgLSAwLjQ2ICogY29zICgyICogR19QSSAqIGkgLyAobGVuIC0gMSkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdJTkRPV19CTEFDS01BTjoKKyAgICAgICAga2VybmVsX2hwW2ldICo9ICgwLjQyIC0gMC41ICogY29zICgyICogR19QSSAqIGkgLyAobGVuIC0gMSkpICsKKyAgICAgICAgICAgIDAuMDggKiBjb3MgKDQgKiBHX1BJICogaSAvIChsZW4gLSAxKSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV0lORE9XX0dBVVNTSUFOOgorICAgICAgICBrZXJuZWxfaHBbaV0gKj0gZXhwICgtMC41ICogUE9XMiAoMy4wIC8gbGVuICogKDIgKiBpIC0gKGxlbiAtIDEpKSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV0lORE9XX0NPU0lORToKKyAgICAgICAga2VybmVsX2hwW2ldICo9IGNvcyAoR19QSSAqIGkgLyAobGVuIC0gMSkgLSBHX1BJIC8gMik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXSU5ET1dfSEFOTjoKKyAgICAgICAga2VybmVsX2hwW2ldICo9IDAuNSAqICgxIC0gY29zICgyICogR19QSSAqIGkgLyAobGVuIC0gMSkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyogbm9ybWFsaXplIGZvciB1bml0eSBnYWluIGF0IERDICovCisgIHN1bSA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorICAgIHN1bSArPSBrZXJuZWxfaHBbaV07CisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKyAgICBrZXJuZWxfaHBbaV0gLz0gc3VtOworCisgIC8qIGRvIHNwZWN0cmFsIGludmVyc2lvbiB0byBnbyBmcm9tIGxvd3Bhc3MgdG8gaGlnaHBhc3MgKi8KKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorICAgIGtlcm5lbF9ocFtpXSA9IC1rZXJuZWxfaHBbaV07CisgIGlmIChsZW4gJSAyID09IDEpIHsKKyAgICBrZXJuZWxfaHBbKGxlbiAtIDEpIC8gMl0gKz0gMS4wOworICB9IGVsc2UgeworICAgIGtlcm5lbF9ocFtsZW4gLyAyIC0gMV0gKz0gMC41OworICAgIGtlcm5lbF9ocFtsZW4gLyAyXSArPSAwLjU7CisgIH0KKworICAvKiBjb21iaW5lIHRoZSB0d28ga2VybmVscyAqLworICBrZXJuZWwgPSBnX25ldyAoZ2RvdWJsZSwgbGVuKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisgICAga2VybmVsW2ldID0ga2VybmVsX2xwW2ldICsga2VybmVsX2hwW2ldOworCisgIC8qIGZyZWUgdGhlIGhlbHBlciBrZXJuZWxzICovCisgIGdfZnJlZSAoa2VybmVsX2xwKTsKKyAgZ19mcmVlIChrZXJuZWxfaHApOworCisgIC8qIGRvIHNwZWN0cmFsIGludmVyc2lvbiB0byBnbyBmcm9tIGJhbmRyZWplY3QgdG8gYmFuZHBhc3MKKyAgICogaWYgc3BlY2lmaWVkICovCisgIGlmIChzZWxmLT5tb2RlID09IE1PREVfQkFORF9QQVNTKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorICAgICAga2VybmVsW2ldID0gLWtlcm5lbFtpXTsKKyAgICBrZXJuZWxbbGVuIC8gMl0gKz0gMTsKKyAgfQorCisgIGdzdF9hdWRpb19meF9iYXNlX2Zpcl9maWx0ZXJfc2V0X2tlcm5lbCAoR1NUX0FVRElPX0ZYX0JBU0VfRklSX0ZJTFRFUiAoc2VsZiksCisgICAgICBrZXJuZWwsIHNlbGYtPmtlcm5lbF9sZW5ndGgsIChsZW4gLSAxKSAvIDIsIGluZm8pOworfQorCisvKiBHc3RBdWRpb0ZpbHRlciB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworCisvKiBnZXQgbm90aWZpZWQgb2YgY2FwcyBhbmQgcGx1ZyBpbiB0aGUgY29ycmVjdCBwcm9jZXNzIGZ1bmN0aW9uICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdWRpb193c2luY2JhbmRfc2V0dXAgKEdzdEF1ZGlvRmlsdGVyICogYmFzZSwgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgR3N0QXVkaW9XU2luY0JhbmQgKnNlbGYgPSBHU1RfQVVESU9fV1NJTkNfQkFORCAoYmFzZSk7CisKKyAgZ3N0X2F1ZGlvX3dzaW5jYmFuZF9idWlsZF9rZXJuZWwgKHNlbGYsIGluZm8pOworCisgIHJldHVybiBHU1RfQVVESU9fRklMVEVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zZXR1cCAoYmFzZSwgaW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fd3NpbmNiYW5kX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RBdWRpb1dTaW5jQmFuZCAqc2VsZiA9IEdTVF9BVURJT19XU0lOQ19CQU5EIChvYmplY3QpOworCisgIGdfbXV0ZXhfY2xlYXIgKCZzZWxmLT5sb2NrKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fd3NpbmNiYW5kX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb1dTaW5jQmFuZCAqc2VsZiA9IEdTVF9BVURJT19XU0lOQ19CQU5EIChvYmplY3QpOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19BVURJT19XU0lOQ19CQU5EIChzZWxmKSk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xFTkdUSDp7CisgICAgICBnaW50IHZhbDsKKworICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICB2YWwgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGlmICh2YWwgJSAyID09IDApCisgICAgICAgIHZhbCsrOworCisgICAgICBpZiAodmFsICE9IHNlbGYtPmtlcm5lbF9sZW5ndGgpIHsKKyAgICAgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9wdXNoX3Jlc2lkdWUgKEdTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIKKyAgICAgICAgICAgIChzZWxmKSk7CisgICAgICAgIHNlbGYtPmtlcm5lbF9sZW5ndGggPSB2YWw7CisgICAgICAgIGdzdF9hdWRpb193c2luY2JhbmRfYnVpbGRfa2VybmVsIChzZWxmLCBOVUxMKTsKKyAgICAgIH0KKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0xPV0VSX0ZSRVFVRU5DWToKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgc2VsZi0+bG93ZXJfZnJlcXVlbmN5ID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGdzdF9hdWRpb193c2luY2JhbmRfYnVpbGRfa2VybmVsIChzZWxmLCBOVUxMKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVBQRVJfRlJFUVVFTkNZOgorICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBzZWxmLT51cHBlcl9mcmVxdWVuY3kgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgZ3N0X2F1ZGlvX3dzaW5jYmFuZF9idWlsZF9rZXJuZWwgKHNlbGYsIE5VTEwpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBzZWxmLT5tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgZ3N0X2F1ZGlvX3dzaW5jYmFuZF9idWlsZF9rZXJuZWwgKHNlbGYsIE5VTEwpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9XSU5ET1c6CisgICAgICBnX211dGV4X2xvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIHNlbGYtPndpbmRvdyA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGdzdF9hdWRpb193c2luY2JhbmRfYnVpbGRfa2VybmVsIChzZWxmLCBOVUxMKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVkaW9fd3NpbmNiYW5kX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb1dTaW5jQmFuZCAqc2VsZiA9IEdTVF9BVURJT19XU0lOQ19CQU5EIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MRU5HVEg6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBzZWxmLT5rZXJuZWxfbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9MT1dFUl9GUkVRVUVOQ1k6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIHNlbGYtPmxvd2VyX2ZyZXF1ZW5jeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVBQRVJfRlJFUVVFTkNZOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBzZWxmLT51cHBlcl9mcmVxdWVuY3kpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgc2VsZi0+bW9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfV0lORE9XOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHNlbGYtPndpbmRvdyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb3dzaW5jYmFuZC5oIGIvZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2MyYmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvYXVkaW93c2luY2JhbmQuaApAQCAtMCwwICsxLDgwIEBACisvKiAtKi0gYy1iYXNpYy1vZmZzZXQ6IDIgLSotCisgKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAyMDA2IERyZWFtbGFiIFRlY2hub2xvZ2llcyBMdGQuIDxtYXRoaXMuaG9mZXJAZHJlYW1sYWIubmV0PgorICogICAgICAgICAgICAgICAyMDA3LTIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIHRoaXMgd2luZG93ZWQgc2luYyBmaWx0ZXIgaXMgdGFrZW4gZnJvbSB0aGUgZnJlZWx5IGRvd25sb2FkYWJsZSBEU1AgYm9vaywKKyAqICJUaGUgU2NpZW50aXN0IGFuZCBFbmdpbmVlcidzIEd1aWRlIHRvIERpZ2l0YWwgU2lnbmFsIFByb2Nlc3NpbmciLAorICogY2hhcHRlciAxNgorICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZHNwZ3VpZGUuY29tLworICoKKyAqLworCisjaWZuZGVmIF9fR1NUX0FVRElPX1dTSU5DX0JBTkRfSF9fCisjZGVmaW5lIF9fR1NUX0FVRElPX1dTSU5DX0JBTkRfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlICJhdWRpb2Z4YmFzZWZpcmZpbHRlci5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fV1NJTkNfQkFORCBcCisgIChnc3RfYXVkaW9fd3NpbmNiYW5kX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9BVURJT19XU0lOQ19CQU5EKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVVESU9fV1NJTkNfQkFORCxHc3RBdWRpb1dTaW5jQmFuZCkpCisjZGVmaW5lIEdTVF9BVURJT19XU0lOQ19CQU5EX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0FVRElPX1dTSU5DX0JBTkQsR3N0QXVkaW9XU2luY0JhbmRDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BVURJT19XU0lOQ19CQU5EKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVVESU9fV1NJTkNfQkFORCkpCisjZGVmaW5lIEdTVF9JU19BVURJT19XU0lOQ19CQU5EX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0FVRElPX1dTSU5DX0JBTkQpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9XU2luY0JhbmQgR3N0QXVkaW9XU2luY0JhbmQ7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9XU2luY0JhbmRDbGFzcyBHc3RBdWRpb1dTaW5jQmFuZENsYXNzOworCisvKioKKyAqIEdzdEF1ZGlvV1NpbmNCYW5kOgorICoKKyAqIE9wYXF1ZSBkYXRhIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RBdWRpb1dTaW5jQmFuZCB7CisgIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyIHBhcmVudDsKKworICBnaW50IG1vZGU7CisgIGdpbnQgd2luZG93OworICBnZmxvYXQgbG93ZXJfZnJlcXVlbmN5LCB1cHBlcl9mcmVxdWVuY3k7CisgIGdpbnQga2VybmVsX2xlbmd0aDsgICAgICAgICAgIC8qIGxlbmd0aCBvZiB0aGUgZmlsdGVyIGtlcm5lbCAqLworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIEdNdXRleCBsb2NrOworfTsKKworc3RydWN0IF9Hc3RBdWRpb1dTaW5jQmFuZENsYXNzIHsKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyBwYXJlbnQ7Cit9OworCitHVHlwZSBnc3RfYXVkaW9fd3NpbmNiYW5kX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0FVRElPX1dTSU5DX0JBTkRfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYyBiL2dzdC9hdWRpb2Z4L2F1ZGlvd3NpbmNsaW1pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZWIwMDcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuYwpAQCAtMCwwICsxLDQwOCBAQAorLyogLSotIGMtYmFzaWMtb2Zmc2V0OiAyIC0qLQorICogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgIDIwMDYgRHJlYW1sYWIgVGVjaG5vbG9naWVzIEx0ZC4gPG1hdGhpcy5ob2ZlckBkcmVhbWxhYi5uZXQ+CisgKiAgICAgICAgICAgICAgIDIwMDctMjAwOSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqIAorICogCisgKiB0aGlzIHdpbmRvd2VkIHNpbmMgZmlsdGVyIGlzIHRha2VuIGZyb20gdGhlIGZyZWVseSBkb3dubG9hZGFibGUgRFNQIGJvb2ssCisgKiAiVGhlIFNjaWVudGlzdCBhbmQgRW5naW5lZXIncyBHdWlkZSB0byBEaWdpdGFsIFNpZ25hbCBQcm9jZXNzaW5nIiwKKyAqIGNoYXB0ZXIgMTYKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmRzcGd1aWRlLmNvbS8KKyAqCisgKiBGb3IgdGhlIHdpbmRvdyBmdW5jdGlvbnMgc2VlCisgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dpbmRvd19mdW5jdGlvbgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWF1ZGlvd3NpbmNsaW1pdAorICoKKyAqIEF0dGVudWF0ZXMgYWxsIGZyZXF1ZW5jaWVzIGFib3ZlIHRoZSBjdXRvZmYgZnJlcXVlbmN5IChsb3ctcGFzcykgb3IgYWxsIGZyZXF1ZW5jaWVzIGJlbG93IHRoZQorICogY3V0b2ZmIGZyZXF1ZW5jeSAoaGlnaC1wYXNzKS4gVGhlIGxlbmd0aCBwYXJhbWV0ZXIgY29udHJvbHMgdGhlIHJvbGxvZmYsIHRoZSB3aW5kb3cgcGFyYW1ldGVyCisgKiBjb250cm9scyByb2xsb2ZmIGFuZCBzdG9wYmFuZCBhdHRlbnVhdGlvbi4gVGhlIEhhbW1pbmcgd2luZG93IHByb3ZpZGVzIGEgZmFzdGVyIHJvbGxvZmYgYnV0IGEgYml0CisgKiB3b3JzZSBzdG9wYmFuZCBhdHRlbnVhdGlvbiwgdGhlIG90aGVyIHdheSBhcm91bmQgZm9yIHRoZSBCbGFja21hbiB3aW5kb3cuCisgKgorICogVGhpcyBlbGVtZW50IGhhcyB0aGUgYWR2YW50YWdlIG92ZXIgdGhlIENoZWJ5c2hldiBsb3dwYXNzIGFuZCBoaWdocGFzcyBmaWx0ZXIgdGhhdCBpdCBoYXMKKyAqIGEgbXVjaCBiZXR0ZXIgcm9sbG9mZiB3aGVuIHVzaW5nIGEgbGFyZ2VyIGtlcm5lbCBzaXplIGFuZCBhbG1vc3QgbGluZWFyIHBoYXNlLiBUaGUgb25seQorICogZGlzYWR2YW50YWdlIGlzIHRoZSBtdWNoIHNsb3dlciBleGVjdXRpb24gdGltZSB3aXRoIGxhcmdlciBrZXJuZWxzLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBhdWRpb3Rlc3RzcmMgZnJlcT0xNTAwICEgYXVkaW9jb252ZXJ0ICEgYXVkaW93c2luY2xpbWl0IG1vZGU9bG93LXBhc3MgY3V0b2ZmPTEwMDAgbGVuZ3RoPTUwMSAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPSJtZWxvMS5vZ2ciICEgb2dnZGVtdXggISB2b3JiaXNkZWMgISBhdWRpb2NvbnZlcnQgISBhdWRpb3dzaW5jbGltaXQgbW9kZT1oaWdoLXBhc3MgY3V0b2ZmPTE1MDAwIGxlbmd0aD01MDEgISBhdWRpb2NvbnZlcnQgISBhbHNhc2luaworICogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjIHdhdmU9d2hpdGUtbm9pc2UgISBhdWRpb2NvbnZlcnQgISBhdWRpb3dzaW5jbGltaXQgbW9kZT1sb3ctcGFzcyBjdXRvZmY9MTAwMCBsZW5ndGg9MTAwMDEgd2luZG93PWJsYWNrbWFuICEgYXVkaW9jb252ZXJ0ICEgYWxzYXNpbmsKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlICJhdWRpb3dzaW5jbGltaXQuaCIKKworI2luY2x1ZGUgImdzdC9nbGliLWNvbXBhdC1wcml2YXRlLmgiCisKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9hdWRpb193c2luY2xpbWl0X2RlYnVnCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChHU1RfQ0FUX0RFRkFVTFQpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MRU5HVEgsCisgIFBST1BfRlJFUVVFTkNZLAorICBQUk9QX01PREUsCisgIFBST1BfV0lORE9XCit9OworCitlbnVtCit7CisgIE1PREVfTE9XX1BBU1MgPSAwLAorICBNT0RFX0hJR0hfUEFTUworfTsKKworI2RlZmluZSBHU1RfVFlQRV9BVURJT19XU0lOQ19MSU1JVF9NT0RFIChnc3RfYXVkaW9fd3NpbmNsaW1pdF9tb2RlX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfYXVkaW9fd3NpbmNsaW1pdF9tb2RlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZ3R5cGUgPSAwOworCisgIGlmIChndHlwZSA9PSAwKSB7CisgICAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAgICB7TU9ERV9MT1dfUEFTUywgIkxvdyBwYXNzIChkZWZhdWx0KSIsCisgICAgICAgICAgImxvdy1wYXNzIn0sCisgICAgICB7TU9ERV9ISUdIX1BBU1MsICJIaWdoIHBhc3MiLAorICAgICAgICAgICJoaWdoLXBhc3MifSwKKyAgICAgIHswLCBOVUxMLCBOVUxMfQorICAgIH07CisKKyAgICBndHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RBdWRpb1dTaW5jTGltaXRNb2RlIiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gZ3R5cGU7Cit9CisKK2VudW0KK3sKKyAgV0lORE9XX0hBTU1JTkcgPSAwLAorICBXSU5ET1dfQkxBQ0tNQU4sCisgIFdJTkRPV19HQVVTU0lBTiwKKyAgV0lORE9XX0NPU0lORSwKKyAgV0lORE9XX0hBTk4KK307CisKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fV1NJTkNfTElNSVRfV0lORE9XIChnc3RfYXVkaW9fd3NpbmNsaW1pdF93aW5kb3dfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9hdWRpb193c2luY2xpbWl0X3dpbmRvd19nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGd0eXBlID0gMDsKKworICBpZiAoZ3R5cGUgPT0gMCkgeworICAgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHZhbHVlc1tdID0geworICAgICAge1dJTkRPV19IQU1NSU5HLCAiSGFtbWluZyB3aW5kb3cgKGRlZmF1bHQpIiwKKyAgICAgICAgICAiaGFtbWluZyJ9LAorICAgICAge1dJTkRPV19CTEFDS01BTiwgIkJsYWNrbWFuIHdpbmRvdyIsCisgICAgICAgICAgImJsYWNrbWFuIn0sCisgICAgICB7V0lORE9XX0dBVVNTSUFOLCAiR2F1c3NpYW4gd2luZG93IiwKKyAgICAgICAgICAiZ2F1c3NpYW4ifSwKKyAgICAgIHtXSU5ET1dfQ09TSU5FLCAiQ29zaW5lIHdpbmRvdyIsCisgICAgICAgICAgImNvc2luZSJ9LAorICAgICAge1dJTkRPV19IQU5OLCAiSGFubiB3aW5kb3ciLAorICAgICAgICAgICJoYW5uIn0sCisgICAgICB7MCwgTlVMTCwgTlVMTH0KKyAgICB9OworCisgICAgZ3R5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0QXVkaW9XU2luY0xpbWl0V2luZG93IiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gZ3R5cGU7Cit9CisKKyNkZWZpbmUgZ3N0X2F1ZGlvX3dzaW5jbGltaXRfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0QXVkaW9XU2luY0xpbWl0LCBnc3RfYXVkaW9fd3NpbmNsaW1pdCwKKyAgICBHU1RfVFlQRV9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIpOworCitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fd3NpbmNsaW1pdF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fd3NpbmNsaW1pdF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfYXVkaW9fd3NpbmNsaW1pdF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVkaW9fd3NpbmNsaW1pdF9zZXR1cCAoR3N0QXVkaW9GaWx0ZXIgKiBiYXNlLAorICAgIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pOworCisKKyNkZWZpbmUgUE9XMih4KSAgKHgpKih4KQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX3dzaW5jbGltaXRfY2xhc3NfaW5pdCAoR3N0QXVkaW9XU2luY0xpbWl0Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyAqZmlsdGVyX2NsYXNzID0gKEdzdEF1ZGlvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9hdWRpb193c2luY2xpbWl0X2RlYnVnLCAiYXVkaW93c2luY2xpbWl0IiwgMCwKKyAgICAgICJMb3ctcGFzcyBhbmQgSGlnaC1wYXNzIFdpbmRvd2VkIHNpbmMgZmlsdGVyIHBsdWdpbiIpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9hdWRpb193c2luY2xpbWl0X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2F1ZGlvX3dzaW5jbGltaXRfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9hdWRpb193c2luY2xpbWl0X2ZpbmFsaXplOworCisgIC8qIEZJWE1FOiBEb24ndCB1c2UgdGhlIGNvbXBsZXRlIHBvc3NpYmxlIHJhbmdlIGJ1dCByZXN0cmljdCB0aGUgdXBwZXIgYm91bmRhcnkKKyAgICogc28gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgVUlzIGNhbiB1c2UgYSBzbGlkZXIgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9GUkVRVUVOQ1ksCisgICAgICBnX3BhcmFtX3NwZWNfZmxvYXQgKCJjdXRvZmYiLCAiQ3V0b2ZmIiwKKyAgICAgICAgICAiQ3V0LW9mZiBGcmVxdWVuY3kgKEh6KSIsIDAuMCwgMTAwMDAwLjAsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTEVOR1RILAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImxlbmd0aCIsICJMZW5ndGgiLAorICAgICAgICAgICJGaWx0ZXIga2VybmVsIGxlbmd0aCwgd2lsbCBiZSByb3VuZGVkIHRvIHRoZSBuZXh0IG9kZCBudW1iZXIiLAorICAgICAgICAgIDMsIDI1NjAwMCwgMTAxLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoIm1vZGUiLCAiTW9kZSIsCisgICAgICAgICAgIkxvdyBwYXNzIG9yIGhpZ2ggcGFzcyBtb2RlIiwgR1NUX1RZUEVfQVVESU9fV1NJTkNfTElNSVRfTU9ERSwKKyAgICAgICAgICBNT0RFX0xPV19QQVNTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1dJTkRPVywKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgid2luZG93IiwgIldpbmRvdyIsCisgICAgICAgICAgIldpbmRvdyBmdW5jdGlvbiB0byB1c2UiLCBHU1RfVFlQRV9BVURJT19XU0lOQ19MSU1JVF9XSU5ET1csCisgICAgICAgICAgV0lORE9XX0hBTU1JTkcsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiTG93IHBhc3MgJiBoaWdoIHBhc3MgZmlsdGVyIiwgIkZpbHRlci9FZmZlY3QvQXVkaW8iLAorICAgICAgIkxvdyBwYXNzIGFuZCBoaWdoIHBhc3Mgd2luZG93ZWQgc2luYyBmaWx0ZXIiLAorICAgICAgIlRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4sICIKKyAgICAgICJTdGV2ZW4gVy4gU21pdGgsICIKKyAgICAgICJEcmVhbWxhYiBUZWNobm9sb2dpZXMgTHRkLiA8bWF0aGlzLmhvZmVyQGRyZWFtbGFiLm5ldD4sICIKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKKworICBmaWx0ZXJfY2xhc3MtPnNldHVwID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdWRpb193c2luY2xpbWl0X3NldHVwKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb193c2luY2xpbWl0X2luaXQgKEdzdEF1ZGlvV1NpbmNMaW1pdCAqIHNlbGYpCit7CisgIHNlbGYtPm1vZGUgPSBNT0RFX0xPV19QQVNTOworICBzZWxmLT53aW5kb3cgPSBXSU5ET1dfSEFNTUlORzsKKyAgc2VsZi0+a2VybmVsX2xlbmd0aCA9IDEwMTsKKyAgc2VsZi0+Y3V0b2ZmID0gMC4wOworCisgIGdfbXV0ZXhfaW5pdCAoJnNlbGYtPmxvY2spOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1ZGlvX3dzaW5jbGltaXRfYnVpbGRfa2VybmVsIChHc3RBdWRpb1dTaW5jTGltaXQgKiBzZWxmLAorICAgIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIGdpbnQgaSA9IDA7CisgIGdkb3VibGUgc3VtID0gMC4wOworICBnaW50IGxlbiA9IDA7CisgIGdkb3VibGUgdzsKKyAgZ2RvdWJsZSAqa2VybmVsID0gTlVMTDsKKyAgZ2ludCByYXRlLCBjaGFubmVsczsKKworICBsZW4gPSBzZWxmLT5rZXJuZWxfbGVuZ3RoOworCisgIGlmIChpbmZvKSB7CisgICAgcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKGluZm8pOworICAgIGNoYW5uZWxzID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKGluZm8pOworICB9IGVsc2UgeworICAgIHJhdGUgPSBHU1RfQVVESU9fRklMVEVSX1JBVEUgKHNlbGYpOworICAgIGNoYW5uZWxzID0gR1NUX0FVRElPX0ZJTFRFUl9DSEFOTkVMUyAoc2VsZik7CisgIH0KKworICBpZiAocmF0ZSA9PSAwKSB7CisgICAgR1NUX0RFQlVHICgicmF0ZSBub3Qgc2V0IHlldCIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChjaGFubmVscyA9PSAwKSB7CisgICAgR1NUX0RFQlVHICgiY2hhbm5lbHMgbm90IHNldCB5ZXQiKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBDbGFtcCBjdXRvZmYgZnJlcXVlbmN5IGJldHdlZW4gMCBhbmQgdGhlIG55cXVpc3QgZnJlcXVlbmN5ICovCisgIHNlbGYtPmN1dG9mZiA9IENMQU1QIChzZWxmLT5jdXRvZmYsIDAuMCwgcmF0ZSAvIDIpOworCisgIEdTVF9ERUJVRyAoImdzdF9hdWRpb193c2luY2xpbWl0XzogaW5pdGlhbGl6aW5nIGZpbHRlciBrZXJuZWwgb2YgbGVuZ3RoICVkICIKKyAgICAgICJ3aXRoIGN1dG9mZiAlLjJsZiBIeiAiCisgICAgICAiZm9yIG1vZGUgJXMiLAorICAgICAgbGVuLCBzZWxmLT5jdXRvZmYsCisgICAgICAoc2VsZi0+bW9kZSA9PSBNT0RFX0xPV19QQVNTKSA/ICJsb3ctcGFzcyIgOiAiaGlnaC1wYXNzIik7CisKKyAgLyogZmlsbCB0aGUga2VybmVsICovCisgIHcgPSAyICogR19QSSAqIChzZWxmLT5jdXRvZmYgLyByYXRlKTsKKworICBrZXJuZWwgPSBnX25ldyAoZ2RvdWJsZSwgbGVuKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICBpZiAoaSA9PSAobGVuIC0gMSkgLyAyLjApCisgICAgICBrZXJuZWxbaV0gPSB3OworICAgIGVsc2UKKyAgICAgIGtlcm5lbFtpXSA9IHNpbiAodyAqIChpIC0gKGxlbiAtIDEpIC8gMikpIC8gKGkgLSAobGVuIC0gMSkgLyAyLjApOworCisgICAgLyogd2luZG93aW5nICovCisgICAgc3dpdGNoIChzZWxmLT53aW5kb3cpIHsKKyAgICAgIGNhc2UgV0lORE9XX0hBTU1JTkc6CisgICAgICAgIGtlcm5lbFtpXSAqPSAoMC41NCAtIDAuNDYgKiBjb3MgKDIgKiBHX1BJICogaSAvIChsZW4gLSAxKSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV0lORE9XX0JMQUNLTUFOOgorICAgICAgICBrZXJuZWxbaV0gKj0gKDAuNDIgLSAwLjUgKiBjb3MgKDIgKiBHX1BJICogaSAvIChsZW4gLSAxKSkgKworICAgICAgICAgICAgMC4wOCAqIGNvcyAoNCAqIEdfUEkgKiBpIC8gKGxlbiAtIDEpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXSU5ET1dfR0FVU1NJQU46CisgICAgICAgIGtlcm5lbFtpXSAqPSBleHAgKC0wLjUgKiBQT1cyICgzLjAgLyBsZW4gKiAoMiAqIGkgLSAobGVuIC0gMSkpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXSU5ET1dfQ09TSU5FOgorICAgICAgICBrZXJuZWxbaV0gKj0gY29zIChHX1BJICogaSAvIChsZW4gLSAxKSAtIEdfUEkgLyAyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdJTkRPV19IQU5OOgorICAgICAgICBrZXJuZWxbaV0gKj0gMC41ICogKDEgLSBjb3MgKDIgKiBHX1BJICogaSAvIChsZW4gLSAxKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBub3JtYWxpemUgZm9yIHVuaXR5IGdhaW4gYXQgREMgKi8KKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorICAgIHN1bSArPSBrZXJuZWxbaV07CisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKyAgICBrZXJuZWxbaV0gLz0gc3VtOworCisgIC8qIGNvbnZlcnQgdG8gaGlnaHBhc3MgaWYgc3BlY2lmaWVkICovCisgIGlmIChzZWxmLT5tb2RlID09IE1PREVfSElHSF9QQVNTKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorICAgICAga2VybmVsW2ldID0gLWtlcm5lbFtpXTsKKworICAgIGlmIChsZW4gJSAyID09IDEpIHsKKyAgICAgIGtlcm5lbFsobGVuIC0gMSkgLyAyXSArPSAxLjA7CisgICAgfSBlbHNlIHsKKyAgICAgIGtlcm5lbFtsZW4gLyAyIC0gMV0gKz0gMC41OworICAgICAga2VybmVsW2xlbiAvIDJdICs9IDAuNTsKKyAgICB9CisgIH0KKworICBnc3RfYXVkaW9fZnhfYmFzZV9maXJfZmlsdGVyX3NldF9rZXJuZWwgKEdTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIgKHNlbGYpLAorICAgICAga2VybmVsLCBzZWxmLT5rZXJuZWxfbGVuZ3RoLCAobGVuIC0gMSkgLyAyLCBpbmZvKTsKK30KKworLyogR3N0QXVkaW9GaWx0ZXIgdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KKworLyogZ2V0IG5vdGlmaWVkIG9mIGNhcHMgYW5kIHBsdWcgaW4gdGhlIGNvcnJlY3QgcHJvY2VzcyBmdW5jdGlvbiAqLworc3RhdGljIGdib29sZWFuCitnc3RfYXVkaW9fd3NpbmNsaW1pdF9zZXR1cCAoR3N0QXVkaW9GaWx0ZXIgKiBiYXNlLCBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKQoreworICBHc3RBdWRpb1dTaW5jTGltaXQgKnNlbGYgPSBHU1RfQVVESU9fV1NJTkNfTElNSVQgKGJhc2UpOworCisgIGdzdF9hdWRpb193c2luY2xpbWl0X2J1aWxkX2tlcm5lbCAoc2VsZiwgaW5mbyk7CisKKyAgcmV0dXJuIEdTVF9BVURJT19GSUxURVJfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNldHVwIChiYXNlLCBpbmZvKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb193c2luY2xpbWl0X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RBdWRpb1dTaW5jTGltaXQgKnNlbGYgPSBHU1RfQVVESU9fV1NJTkNfTElNSVQgKG9iamVjdCk7CisKKyAgZ19tdXRleF9jbGVhciAoJnNlbGYtPmxvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb193c2luY2xpbWl0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb1dTaW5jTGltaXQgKnNlbGYgPSBHU1RfQVVESU9fV1NJTkNfTElNSVQgKG9iamVjdCk7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX0FVRElPX1dTSU5DX0xJTUlUIChzZWxmKSk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xFTkdUSDp7CisgICAgICBnaW50IHZhbDsKKworICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICB2YWwgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGlmICh2YWwgJSAyID09IDApCisgICAgICAgIHZhbCsrOworCisgICAgICBpZiAodmFsICE9IHNlbGYtPmtlcm5lbF9sZW5ndGgpIHsKKyAgICAgICAgZ3N0X2F1ZGlvX2Z4X2Jhc2VfZmlyX2ZpbHRlcl9wdXNoX3Jlc2lkdWUgKEdTVF9BVURJT19GWF9CQVNFX0ZJUl9GSUxURVIKKyAgICAgICAgICAgIChzZWxmKSk7CisgICAgICAgIHNlbGYtPmtlcm5lbF9sZW5ndGggPSB2YWw7CisgICAgICAgIGdzdF9hdWRpb193c2luY2xpbWl0X2J1aWxkX2tlcm5lbCAoc2VsZiwgTlVMTCk7CisgICAgICB9CisgICAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9GUkVRVUVOQ1k6CisgICAgICBnX211dGV4X2xvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIHNlbGYtPmN1dG9mZiA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisgICAgICBnc3RfYXVkaW9fd3NpbmNsaW1pdF9idWlsZF9rZXJuZWwgKHNlbGYsIE5VTEwpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBzZWxmLT5tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgZ3N0X2F1ZGlvX3dzaW5jbGltaXRfYnVpbGRfa2VybmVsIChzZWxmLCBOVUxMKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfV0lORE9XOgorICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICBzZWxmLT53aW5kb3cgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBnc3RfYXVkaW9fd3NpbmNsaW1pdF9idWlsZF9rZXJuZWwgKHNlbGYsIE5VTEwpOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdWRpb193c2luY2xpbWl0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdWRpb1dTaW5jTGltaXQgKnNlbGYgPSBHU1RfQVVESU9fV1NJTkNfTElNSVQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xFTkdUSDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHNlbGYtPmtlcm5lbF9sZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZSRVFVRU5DWToKKyAgICAgIGdfdmFsdWVfc2V0X2Zsb2F0ICh2YWx1ZSwgc2VsZi0+Y3V0b2ZmKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHNlbGYtPm1vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1dJTkRPVzoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBzZWxmLT53aW5kb3cpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmggYi9nc3QvYXVkaW9meC9hdWRpb3dzaW5jbGltaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2ZhOTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvYXVkaW93c2luY2xpbWl0LmgKQEAgLTAsMCArMSw4MCBAQAorLyogLSotIGMtYmFzaWMtb2Zmc2V0OiAyIC0qLQorICogCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAxIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgIDIwMDYgRHJlYW1sYWIgVGVjaG5vbG9naWVzIEx0ZC4gPG1hdGhpcy5ob2ZlckBkcmVhbWxhYi5uZXQ+CisgKiAgICAgICAgICAgICAgIDIwMDctMjAwOSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqIAorICogCisgKiB0aGlzIHdpbmRvd2VkIHNpbmMgZmlsdGVyIGlzIHRha2VuIGZyb20gdGhlIGZyZWVseSBkb3dubG9hZGFibGUgRFNQIGJvb2ssCisgKiAiVGhlIFNjaWVudGlzdCBhbmQgRW5naW5lZXIncyBHdWlkZSB0byBEaWdpdGFsIFNpZ25hbCBQcm9jZXNzaW5nIiwKKyAqIGNoYXB0ZXIgMTYKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmRzcGd1aWRlLmNvbS8KKyAqCisgKi8KKworI2lmbmRlZiBfX0dTVF9BVURJT19XU0lOQ19MSU1JVF9IX18KKyNkZWZpbmUgX19HU1RfQVVESU9fV1NJTkNfTElNSVRfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKKyNpbmNsdWRlICJhdWRpb2Z4YmFzZWZpcmZpbHRlci5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQVVESU9fV1NJTkNfTElNSVQgXAorICAoZ3N0X2F1ZGlvX3dzaW5jbGltaXRfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0FVRElPX1dTSU5DX0xJTUlUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVVESU9fV1NJTkNfTElNSVQsR3N0QXVkaW9XU2luY0xpbWl0KSkKKyNkZWZpbmUgR1NUX0FVRElPX1dTSU5DX0xJTUlUX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0FVRElPX1dTSU5DX0xJTUlULEdzdEF1ZGlvV1NpbmNMaW1pdENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FVRElPX1dTSU5DX0xJTUlUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVVESU9fV1NJTkNfTElNSVQpKQorI2RlZmluZSBHU1RfSVNfQVVESU9fV1NJTkNfTElNSVRfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfQVVESU9fV1NJTkNfTElNSVQpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0QXVkaW9XU2luY0xpbWl0IEdzdEF1ZGlvV1NpbmNMaW1pdDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdWRpb1dTaW5jTGltaXRDbGFzcyBHc3RBdWRpb1dTaW5jTGltaXRDbGFzczsKKworLyoqCisgKiBHc3RBdWRpb1dTaW5jTGltaXQ6CisgKgorICogT3BhcXVlIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdEF1ZGlvV1NpbmNMaW1pdCB7CisgIEdzdEF1ZGlvRlhCYXNlRklSRmlsdGVyIHBhcmVudDsKKworICBnaW50IG1vZGU7CisgIGdpbnQgd2luZG93OworICBnZmxvYXQgY3V0b2ZmOworICBnaW50IGtlcm5lbF9sZW5ndGg7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgR011dGV4IGxvY2s7Cit9OworCitzdHJ1Y3QgX0dzdEF1ZGlvV1NpbmNMaW1pdENsYXNzIHsKKyAgR3N0QXVkaW9GWEJhc2VGSVJGaWx0ZXJDbGFzcyBwYXJlbnQ7Cit9OworCitHVHlwZSBnc3RfYXVkaW9fd3NpbmNsaW1pdF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BVURJT19XU0lOQ19MSU1JVF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYyBiL2dzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmJjMjBmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5jCkBAIC0wLDAgKzEsOTIyIEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUm92IEp1dmFubyA8cm92anV2YW5vQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1zY2FsZXRlbXBvCisgKgorICogU2NhbGUgdGVtcG8gd2hpbGUgbWFpbnRhaW5pbmcgcGl0Y2gKKyAqIChXU09MQS1saWtlIHRlY2huaXF1ZSB3aXRoIGNyb3NzIGNvcnJlbGF0aW9uKQorICogSW5zcGlyZWQgYnkgU291bmRUb3VjaCBsaWJyYXJ5IGJ5IE9sbGkgUGFydmlhaW5lbgorICoKKyAqIFVzZSBTY2VsZXRlbXBvIHRvIGFwcGx5IHBsYXliYWNrIHJhdGVzIHdpdGhvdXQgdGhlIGNoaXBtdW5rIGVmZmVjdC4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogPHBhcmE+CisgKiB8WworICogZmlsZXNyYyBsb2NhdGlvbj1tZWRpYS5leHQgISBkZWNvZGViaW4gbmFtZT1kIFwKKyAqICAgICBkLiAhIHF1ZXVlICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIHNjYWxldGVtcG8gISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgYXV0b2F1ZGlvc2luayBcCisgKiAgICAgZC4gISBxdWV1ZSAhIHZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsKKyAqIF18CisgKiBPUgorICogfFsKKyAqIHBsYXliaW4gdXJpPS4uLiBhdWRpb19zaW5rPSJzY2FsZXRlbXBvICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIGF1dG9hdWRpb3NpbmsiCisgKiBdfAorICogV2hlbiBhbiBhcHBsaWNhdGlvbiBzZW5kcyBhIHNlZWsgZXZlbnQgd2l0aCByYXRlICE9IDEuMCwgU2NhbGV0ZW1wbyBhcHBsaWVzCisgKiB0aGUgcmF0ZSBjaGFuZ2UgYnkgc2NhbGluZyB0aGUgdGVtcG8gd2l0aG91dCBzY2FsaW5nIHRoZSBwaXRjaC4KKyAqCisgKiBTY2FsZXRlbXBvIHdvcmtzIGJ5IHByb2R1Y2luZyBhdWRpbyBpbiBjb25zdGFudCBzaXplZCBjaHVua3MKKyAqICgjR3N0U2NhbGV0ZW1wbzpzdHJpZGUpIGJ1dCBjb25zdW1pbmcgY2h1bmtzIHByb3BvcnRpb25hbCB0byB0aGUgcGxheWJhY2sKKyAqIHJhdGUuCisgKgorICogU2NhbGV0ZW1wbyB0aGVuIHNtb290aHMgdGhlIG91dHB1dCBieSBibGVuZGluZyB0aGUgZW5kIG9mIG9uZSBzdHJpZGUgd2l0aAorICogdGhlIG5leHQgKCNHc3RTY2FsZXRlbXBvOm92ZXJsYXApLgorICoKKyAqIFNjYWxldGVtcG8gc21vb3RocyB0aGUgb3ZlcmxhcCBmdXJ0aGVyIGJ5IHNlYXJjaGluZyB3aXRoaW4gdGhlIGlucHV0IGJ1ZmZlcgorICogZm9yIHRoZSBiZXN0IG92ZXJsYXAgcG9zaXRpb24uICBTY2FsZXRlbXBvIHVzZXMgYSBzdGF0aXN0aWNhbCBjcm9zcworICogY29ycmVsYXRpb24gKHJvdWdobHkgYSBkb3QtcHJvZHVjdCkuICBTY2FsZXRlbXBvIGNvbnN1bWVzIG1vc3Qgb2YgaXRzIENQVQorICogY3ljbGVzIGhlcmUuIE9uZSBjYW4gdXNlIHRoZSAjR3N0U2NhbGV0ZW1wbzpzZWFyY2ggcHJvcGVyeSB0byB0dW5lIGhvdyBmYXIKKyAqIHRoZSBhbGdvcml0bSBsb29rcy4KKyAqIDwvcGFyYT4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworLyoKKyAqIE5vdGU6IGZyYW1lID0gYXVkaW8ga2V5IHVuaXQgKGkuZS4gb25lIHNhbXBsZSBmb3IgZWFjaCBjaGFubmVsKQorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAgICAgICAgIC8qIGZvciBtZW1zZXQgKi8KKworI2luY2x1ZGUgImdzdHNjYWxldGVtcG8uaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3NjYWxldGVtcG9fZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3NjYWxldGVtcG9fZGVidWcKKworLyogRmlsdGVyIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX1JBVEUsCisgIFBST1BfU1RSSURFLAorICBQUk9QX09WRVJMQVAsCisgIFBST1BfU0VBUkNILAorfTsKKworI2RlZmluZSBTVVBQT1JURURfQ0FQUyBcCitHU1RfU1RBVElDX0NBUFMgKCBcCisgICAgR1NUX0FVRElPX0NBUFNfTUFLRSAoR1NUX0FVRElPX05FIChGMzIpKSAiOyAiIFwKKyAgICBHU1RfQVVESU9fQ0FQU19NQUtFIChHU1RfQVVESU9fTkUgKEY2NCkpICI7ICIgXAorICAgIEdTVF9BVURJT19DQVBTX01BS0UgKEdTVF9BVURJT19ORSAoUzE2KSkgXAorKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIFNVUFBPUlRFRF9DQVBTKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBTVVBQT1JURURfQ0FQUyk7CisKKyNkZWZpbmUgREVCVUdfSU5JVChibGEpIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3Rfc2NhbGV0ZW1wb19kZWJ1ZywgInNjYWxldGVtcG8iLCAwLCAic2NhbGV0ZW1wbyBlbGVtZW50Iik7CisKKyNkZWZpbmUgZ3N0X3NjYWxldGVtcG9fcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdFNjYWxldGVtcG8sIGdzdF9zY2FsZXRlbXBvLAorICAgIEdTVF9UWVBFX0JBU0VfVFJBTlNGT1JNLCBERUJVR19JTklUICgwKSk7CisKKyNkZWZpbmUgQ1JFQVRFX0JFU1RfT1ZFUkxBUF9PRkZTRVRfRkxPQVRfRlVOQyh0eXBlKSBcCitzdGF0aWMgZ3VpbnQgXAorYmVzdF9vdmVybGFwX29mZnNldF8jI3R5cGUgKEdzdFNjYWxldGVtcG8gKiBzdCkgXAoreyBcCisgIGcjI3R5cGUgKnB3LCAqcG8sICpwcGMsICpzZWFyY2hfc3RhcnQ7IFwKKyAgZyMjdHlwZSBiZXN0X2NvcnIgPSBHX01JTklOVDsgXAorICBndWludCBiZXN0X29mZiA9IDA7IFwKKyAgZ2ludCBpLCBvZmY7IFwKKyAgXAorICBwdyA9IHN0LT50YWJsZV93aW5kb3c7IFwKKyAgcG8gPSBzdC0+YnVmX292ZXJsYXA7IFwKKyAgcG8gKz0gc3QtPnNhbXBsZXNfcGVyX2ZyYW1lOyBcCisgIHBwYyA9IHN0LT5idWZfcHJlX2NvcnI7IFwKKyAgZm9yIChpID0gc3QtPnNhbXBsZXNfcGVyX2ZyYW1lOyBpIDwgc3QtPnNhbXBsZXNfb3ZlcmxhcDsgaSsrKSB7IFwKKyAgICAqcHBjKysgPSAqcHcrKyAqICpwbysrOyBcCisgIH0gXAorICBcCisgIHNlYXJjaF9zdGFydCA9IChnIyN0eXBlICopIHN0LT5idWZfcXVldWUgKyBzdC0+c2FtcGxlc19wZXJfZnJhbWU7IFwKKyAgZm9yIChvZmYgPSAwOyBvZmYgPCBzdC0+ZnJhbWVzX3NlYXJjaDsgb2ZmKyspIHsgXAorICAgIGcjI3R5cGUgY29yciA9IDA7IFwKKyAgICBnIyN0eXBlICpwcyA9IHNlYXJjaF9zdGFydDsgXAorICAgIHBwYyA9IHN0LT5idWZfcHJlX2NvcnI7IFwKKyAgICBmb3IgKGkgPSBzdC0+c2FtcGxlc19wZXJfZnJhbWU7IGkgPCBzdC0+c2FtcGxlc19vdmVybGFwOyBpKyspIHsgXAorICAgICAgY29yciArPSAqcHBjKysgKiAqcHMrKzsgXAorICAgIH0gXAorICAgIGlmIChjb3JyID4gYmVzdF9jb3JyKSB7IFwKKyAgICAgIGJlc3RfY29yciA9IGNvcnI7IFwKKyAgICAgIGJlc3Rfb2ZmID0gb2ZmOyBcCisgICAgfSBcCisgICAgc2VhcmNoX3N0YXJ0ICs9IHN0LT5zYW1wbGVzX3Blcl9mcmFtZTsgXAorICB9IFwKKyAgXAorICByZXR1cm4gYmVzdF9vZmYgKiBzdC0+Ynl0ZXNfcGVyX2ZyYW1lOyBcCit9CisKK0NSRUFURV9CRVNUX09WRVJMQVBfT0ZGU0VUX0ZMT0FUX0ZVTkMgKGZsb2F0KTsKK0NSRUFURV9CRVNUX09WRVJMQVBfT0ZGU0VUX0ZMT0FUX0ZVTkMgKGRvdWJsZSk7CisKKy8qIGJ1ZmZlciBwYWRkaW5nIGZvciBsb29wIG9wdGltaXphdGlvbjogc2l6ZW9mKGdpbnQzMikgKiAobG9vcF9zaXplIC0gMSkgKi8KKyNkZWZpbmUgVU5ST0xMX1BBRERJTkcgKDQqMykKK3N0YXRpYyBndWludAorYmVzdF9vdmVybGFwX29mZnNldF9zMTYgKEdzdFNjYWxldGVtcG8gKiBzdCkKK3sKKyAgZ2ludDMyICpwdywgKnBwYzsKKyAgZ2ludDE2ICpwbywgKnNlYXJjaF9zdGFydDsKKyAgZ2ludDY0IGJlc3RfY29yciA9IEdfTUlOSU5UNjQ7CisgIGd1aW50IGJlc3Rfb2ZmID0gMDsKKyAgZ3VpbnQgb2ZmOworICBnbG9uZyBpOworCisgIHB3ID0gc3QtPnRhYmxlX3dpbmRvdzsKKyAgcG8gPSBzdC0+YnVmX292ZXJsYXA7CisgIHBvICs9IHN0LT5zYW1wbGVzX3Blcl9mcmFtZTsKKyAgcHBjID0gc3QtPmJ1Zl9wcmVfY29ycjsKKyAgZm9yIChpID0gc3QtPnNhbXBsZXNfcGVyX2ZyYW1lOyBpIDwgc3QtPnNhbXBsZXNfb3ZlcmxhcDsgaSsrKSB7CisgICAgKnBwYysrID0gKCpwdysrICogKnBvKyspID4+IDE1OworICB9CisKKyAgc2VhcmNoX3N0YXJ0ID0gKGdpbnQxNiAqKSBzdC0+YnVmX3F1ZXVlICsgc3QtPnNhbXBsZXNfcGVyX2ZyYW1lOworICBmb3IgKG9mZiA9IDA7IG9mZiA8IHN0LT5mcmFtZXNfc2VhcmNoOyBvZmYrKykgeworICAgIGdpbnQ2NCBjb3JyID0gMDsKKyAgICBnaW50MTYgKnBzID0gc2VhcmNoX3N0YXJ0OworICAgIHBwYyA9IHN0LT5idWZfcHJlX2NvcnI7CisgICAgcHBjICs9IHN0LT5zYW1wbGVzX292ZXJsYXAgLSBzdC0+c2FtcGxlc19wZXJfZnJhbWU7CisgICAgcHMgKz0gc3QtPnNhbXBsZXNfb3ZlcmxhcCAtIHN0LT5zYW1wbGVzX3Blcl9mcmFtZTsKKyAgICBpID0gLSgoZ2xvbmcpIHN0LT5zYW1wbGVzX292ZXJsYXAgLSAoZ2xvbmcpIHN0LT5zYW1wbGVzX3Blcl9mcmFtZSk7CisgICAgZG8geworICAgICAgY29yciArPSBwcGNbaSArIDBdICogcHNbaSArIDBdOworICAgICAgY29yciArPSBwcGNbaSArIDFdICogcHNbaSArIDFdOworICAgICAgY29yciArPSBwcGNbaSArIDJdICogcHNbaSArIDJdOworICAgICAgY29yciArPSBwcGNbaSArIDNdICogcHNbaSArIDNdOworICAgICAgaSArPSA0OworICAgIH0gd2hpbGUgKGkgPCAwKTsKKyAgICBpZiAoY29yciA+IGJlc3RfY29ycikgeworICAgICAgYmVzdF9jb3JyID0gY29ycjsKKyAgICAgIGJlc3Rfb2ZmID0gb2ZmOworICAgIH0KKyAgICBzZWFyY2hfc3RhcnQgKz0gc3QtPnNhbXBsZXNfcGVyX2ZyYW1lOworICB9CisKKyAgcmV0dXJuIGJlc3Rfb2ZmICogc3QtPmJ5dGVzX3Blcl9mcmFtZTsKK30KKworI2RlZmluZSBDUkVBVEVfT1VUUFVUX09WRVJMQVBfRkxPQVRfRlVOQyh0eXBlKSBcCitzdGF0aWMgdm9pZCBcCitvdXRwdXRfb3ZlcmxhcF8jI3R5cGUgKEdzdFNjYWxldGVtcG8gKiBzdCwgZ3BvaW50ZXIgYnVmX291dCwgZ3VpbnQgYnl0ZXNfb2ZmKSBcCit7IFwKKyAgZyMjdHlwZSAqcG91dCA9IGJ1Zl9vdXQ7IFwKKyAgZyMjdHlwZSAqcGIgPSBzdC0+dGFibGVfYmxlbmQ7IFwKKyAgZyMjdHlwZSAqcG8gPSBzdC0+YnVmX292ZXJsYXA7IFwKKyAgZyMjdHlwZSAqcGluID0gKGcjI3R5cGUgKikgKHN0LT5idWZfcXVldWUgKyBieXRlc19vZmYpOyBcCisgIGdpbnQgaTsgXAorICBmb3IgKGkgPSAwOyBpIDwgc3QtPnNhbXBsZXNfb3ZlcmxhcDsgaSsrKSB7IFwKKyAgICAqcG91dCsrID0gKnBvIC0gKnBiKysgKiAoKnBvIC0gKnBpbisrKTsgXAorICAgIHBvKys7IFwKKyAgfSBcCit9CisKK0NSRUFURV9PVVRQVVRfT1ZFUkxBUF9GTE9BVF9GVU5DIChmbG9hdCk7CitDUkVBVEVfT1VUUFVUX09WRVJMQVBfRkxPQVRfRlVOQyAoZG91YmxlKTsKKworc3RhdGljIHZvaWQKK291dHB1dF9vdmVybGFwX3MxNiAoR3N0U2NhbGV0ZW1wbyAqIHN0LCBncG9pbnRlciBidWZfb3V0LCBndWludCBieXRlc19vZmYpCit7CisgIGdpbnQxNiAqcG91dCA9IGJ1Zl9vdXQ7CisgIGdpbnQzMiAqcGIgPSBzdC0+dGFibGVfYmxlbmQ7CisgIGdpbnQxNiAqcG8gPSBzdC0+YnVmX292ZXJsYXA7CisgIGdpbnQxNiAqcGluID0gKGdpbnQxNiAqKSAoc3QtPmJ1Zl9xdWV1ZSArIGJ5dGVzX29mZik7CisgIGdpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHN0LT5zYW1wbGVzX292ZXJsYXA7IGkrKykgeworICAgICpwb3V0KysgPSAqcG8gLSAoKCpwYisrICogKCpwbyAtICpwaW4rKykpID4+IDE2KTsKKyAgICBwbysrOworICB9Cit9CisKK3N0YXRpYyBndWludAorZmlsbF9xdWV1ZSAoR3N0U2NhbGV0ZW1wbyAqIHN0LCBHc3RCdWZmZXIgKiBidWZfaW4sIGd1aW50IG9mZnNldCkKK3sKKyAgZ3VpbnQgYnl0ZXNfaW4gPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZfaW4pIC0gb2Zmc2V0OworICBndWludCBvZmZzZXRfdW5jaGFuZ2VkID0gb2Zmc2V0OworICBHc3RNYXBJbmZvIG1hcDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmX2luLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBpZiAoc3QtPmJ5dGVzX3RvX3NsaWRlID4gMCkgeworICAgIGlmIChzdC0+Ynl0ZXNfdG9fc2xpZGUgPCBzdC0+Ynl0ZXNfcXVldWVkKSB7CisgICAgICBndWludCBieXRlc19pbl9tb3ZlID0gc3QtPmJ5dGVzX3F1ZXVlZCAtIHN0LT5ieXRlc190b19zbGlkZTsKKyAgICAgIG1lbW1vdmUgKHN0LT5idWZfcXVldWUsIHN0LT5idWZfcXVldWUgKyBzdC0+Ynl0ZXNfdG9fc2xpZGUsCisgICAgICAgICAgYnl0ZXNfaW5fbW92ZSk7CisgICAgICBzdC0+Ynl0ZXNfdG9fc2xpZGUgPSAwOworICAgICAgc3QtPmJ5dGVzX3F1ZXVlZCA9IGJ5dGVzX2luX21vdmU7CisgICAgfSBlbHNlIHsKKyAgICAgIGd1aW50IGJ5dGVzX2luX3NraXA7CisgICAgICBzdC0+Ynl0ZXNfdG9fc2xpZGUgLT0gc3QtPmJ5dGVzX3F1ZXVlZDsKKyAgICAgIGJ5dGVzX2luX3NraXAgPSBNSU4gKHN0LT5ieXRlc190b19zbGlkZSwgYnl0ZXNfaW4pOworICAgICAgc3QtPmJ5dGVzX3F1ZXVlZCA9IDA7CisgICAgICBzdC0+Ynl0ZXNfdG9fc2xpZGUgLT0gYnl0ZXNfaW5fc2tpcDsKKyAgICAgIG9mZnNldCArPSBieXRlc19pbl9za2lwOworICAgICAgYnl0ZXNfaW4gLT0gYnl0ZXNfaW5fc2tpcDsKKyAgICB9CisgIH0KKworICBpZiAoYnl0ZXNfaW4gPiAwKSB7CisgICAgZ3VpbnQgYnl0ZXNfaW5fY29weSA9CisgICAgICAgIE1JTiAoc3QtPmJ5dGVzX3F1ZXVlX21heCAtIHN0LT5ieXRlc19xdWV1ZWQsIGJ5dGVzX2luKTsKKyAgICBtZW1jcHkgKHN0LT5idWZfcXVldWUgKyBzdC0+Ynl0ZXNfcXVldWVkLCBtYXAuZGF0YSArIG9mZnNldCwgYnl0ZXNfaW5fY29weSk7CisgICAgc3QtPmJ5dGVzX3F1ZXVlZCArPSBieXRlc19pbl9jb3B5OworICAgIG9mZnNldCArPSBieXRlc19pbl9jb3B5OworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1Zl9pbiwgJm1hcCk7CisKKyAgcmV0dXJuIG9mZnNldCAtIG9mZnNldF91bmNoYW5nZWQ7Cit9CisKK3N0YXRpYyB2b2lkCityZWluaXRfYnVmZmVycyAoR3N0U2NhbGV0ZW1wbyAqIHN0KQoreworICBnaW50IGksIGo7CisgIGd1aW50IGZyYW1lc19vdmVybGFwOworICBndWludCBuZXdfc2l6ZTsKKyAgR3N0Q2xvY2tUaW1lIGxhdGVuY3k7CisKKyAgZ3VpbnQgZnJhbWVzX3N0cmlkZSA9IHN0LT5tc19zdHJpZGUgKiBzdC0+c2FtcGxlX3JhdGUgLyAxMDAwLjA7CisgIHN0LT5ieXRlc19zdHJpZGUgPSBmcmFtZXNfc3RyaWRlICogc3QtPmJ5dGVzX3Blcl9mcmFtZTsKKworICAvKiBvdmVybGFwICovCisgIGZyYW1lc19vdmVybGFwID0gZnJhbWVzX3N0cmlkZSAqIHN0LT5wZXJjZW50X292ZXJsYXA7CisgIGlmIChmcmFtZXNfb3ZlcmxhcCA8IDEpIHsgICAgIC8qIGlmIG5vIG92ZXJsYXAgKi8KKyAgICBzdC0+Ynl0ZXNfb3ZlcmxhcCA9IDA7CisgICAgc3QtPmJ5dGVzX3N0YW5kaW5nID0gc3QtPmJ5dGVzX3N0cmlkZTsKKyAgICBzdC0+c2FtcGxlc19zdGFuZGluZyA9IHN0LT5ieXRlc19zdGFuZGluZyAvIHN0LT5ieXRlc19wZXJfc2FtcGxlOworICAgIHN0LT5vdXRwdXRfb3ZlcmxhcCA9IE5VTEw7CisgIH0gZWxzZSB7CisgICAgZ3VpbnQgcHJldl9vdmVybGFwID0gc3QtPmJ5dGVzX292ZXJsYXA7CisgICAgc3QtPmJ5dGVzX292ZXJsYXAgPSBmcmFtZXNfb3ZlcmxhcCAqIHN0LT5ieXRlc19wZXJfZnJhbWU7CisgICAgc3QtPnNhbXBsZXNfb3ZlcmxhcCA9IGZyYW1lc19vdmVybGFwICogc3QtPnNhbXBsZXNfcGVyX2ZyYW1lOworICAgIHN0LT5ieXRlc19zdGFuZGluZyA9IHN0LT5ieXRlc19zdHJpZGUgLSBzdC0+Ynl0ZXNfb3ZlcmxhcDsKKyAgICBzdC0+c2FtcGxlc19zdGFuZGluZyA9IHN0LT5ieXRlc19zdGFuZGluZyAvIHN0LT5ieXRlc19wZXJfc2FtcGxlOworICAgIHN0LT5idWZfb3ZlcmxhcCA9IGdfcmVhbGxvYyAoc3QtPmJ1Zl9vdmVybGFwLCBzdC0+Ynl0ZXNfb3ZlcmxhcCk7CisgICAgLyogUzE2IHVzZXMgZ2ludDMyIGJsZW5kIHRhYmxlLCBmbG9hdHMvZG91YmxlcyB1c2UgdGhlaXIgcmVzcGVjdGl2ZSB0eXBlICovCisgICAgc3QtPnRhYmxlX2JsZW5kID0KKyAgICAgICAgZ19yZWFsbG9jIChzdC0+dGFibGVfYmxlbmQsCisgICAgICAgIHN0LT5zYW1wbGVzX292ZXJsYXAgKiAoc3QtPmZvcm1hdCA9PQorICAgICAgICAgICAgR1NUX0FVRElPX0ZPUk1BVF9TMTYgPyA0IDogc3QtPmJ5dGVzX3Blcl9zYW1wbGUpKTsKKyAgICBpZiAoc3QtPmJ5dGVzX292ZXJsYXAgPiBwcmV2X292ZXJsYXApIHsKKyAgICAgIG1lbXNldCAoKGd1aW50OCAqKSBzdC0+YnVmX292ZXJsYXAgKyBwcmV2X292ZXJsYXAsIDAsCisgICAgICAgICAgc3QtPmJ5dGVzX292ZXJsYXAgLSBwcmV2X292ZXJsYXApOworICAgIH0KKyAgICBpZiAoc3QtPmZvcm1hdCA9PSBHU1RfQVVESU9fRk9STUFUX1MxNikgeworICAgICAgZ2ludDMyICpwYiA9IHN0LT50YWJsZV9ibGVuZDsKKyAgICAgIGdpbnQ2NCBibGVuZCA9IDA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVzX292ZXJsYXA7IGkrKykgeworICAgICAgICBnaW50MzIgdiA9IGJsZW5kIC8gZnJhbWVzX292ZXJsYXA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdC0+c2FtcGxlc19wZXJfZnJhbWU7IGorKykgeworICAgICAgICAgICpwYisrID0gdjsKKyAgICAgICAgfQorICAgICAgICBibGVuZCArPSA2NTUzNTsgICAgICAgICAvKiAyXjE2ICovCisgICAgICB9CisgICAgICBzdC0+b3V0cHV0X292ZXJsYXAgPSBvdXRwdXRfb3ZlcmxhcF9zMTY7CisgICAgfSBlbHNlIGlmIChzdC0+Zm9ybWF0ID09IEdTVF9BVURJT19GT1JNQVRfRjMyKSB7CisgICAgICBnZmxvYXQgKnBiID0gc3QtPnRhYmxlX2JsZW5kOworICAgICAgZ2Zsb2F0IHQgPSAoZ2Zsb2F0KSBmcmFtZXNfb3ZlcmxhcDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZXNfb3ZlcmxhcDsgaSsrKSB7CisgICAgICAgIGdmbG9hdCB2ID0gaSAvIHQ7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdC0+c2FtcGxlc19wZXJfZnJhbWU7IGorKykgeworICAgICAgICAgICpwYisrID0gdjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3QtPm91dHB1dF9vdmVybGFwID0gb3V0cHV0X292ZXJsYXBfZmxvYXQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGdkb3VibGUgKnBiID0gc3QtPnRhYmxlX2JsZW5kOworICAgICAgZ2RvdWJsZSB0ID0gKGdkb3VibGUpIGZyYW1lc19vdmVybGFwOworICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lc19vdmVybGFwOyBpKyspIHsKKyAgICAgICAgZ2RvdWJsZSB2ID0gaSAvIHQ7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdC0+c2FtcGxlc19wZXJfZnJhbWU7IGorKykgeworICAgICAgICAgICpwYisrID0gdjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3QtPm91dHB1dF9vdmVybGFwID0gb3V0cHV0X292ZXJsYXBfZG91YmxlOworICAgIH0KKyAgfQorCisgIC8qIGJlc3Qgb3ZlcmxhcCAqLworICBzdC0+ZnJhbWVzX3NlYXJjaCA9CisgICAgICAoZnJhbWVzX292ZXJsYXAgPD0gMSkgPyAwIDogc3QtPm1zX3NlYXJjaCAqIHN0LT5zYW1wbGVfcmF0ZSAvIDEwMDAuMDsKKyAgaWYgKHN0LT5mcmFtZXNfc2VhcmNoIDwgMSkgeyAgLyogaWYgbm8gc2VhcmNoICovCisgICAgc3QtPmJlc3Rfb3ZlcmxhcF9vZmZzZXQgPSBOVUxMOworICB9IGVsc2UgeworICAgIC8qIFMxNiB1c2VzIGdpbnQzMiBidWZmZXIsIGZsb2F0cy9kb3VibGVzIHVzZSB0aGVpciByZXNwZWN0aXZlIHR5cGUgKi8KKyAgICBndWludCBieXRlc19wcmVfY29yciA9CisgICAgICAgIChzdC0+c2FtcGxlc19vdmVybGFwIC0gc3QtPnNhbXBsZXNfcGVyX2ZyYW1lKSAqIChzdC0+Zm9ybWF0ID09CisgICAgICAgIEdTVF9BVURJT19GT1JNQVRfUzE2ID8gNCA6IHN0LT5ieXRlc19wZXJfc2FtcGxlKTsKKyAgICBzdC0+YnVmX3ByZV9jb3JyID0KKyAgICAgICAgZ19yZWFsbG9jIChzdC0+YnVmX3ByZV9jb3JyLCBieXRlc19wcmVfY29yciArIFVOUk9MTF9QQURESU5HKTsKKyAgICBzdC0+dGFibGVfd2luZG93ID0gZ19yZWFsbG9jIChzdC0+dGFibGVfd2luZG93LCBieXRlc19wcmVfY29ycik7CisgICAgaWYgKHN0LT5mb3JtYXQgPT0gR1NUX0FVRElPX0ZPUk1BVF9TMTYpIHsKKyAgICAgIGdpbnQ2NCB0ID0gZnJhbWVzX292ZXJsYXA7CisgICAgICBnaW50MzIgbiA9IDg1ODk5MzQ1ODhMTCAvICh0ICogdCk7ICAgICAgICAvKiA0ICogKDJeMzEgLSAxKSAvIHReMiAqLworICAgICAgZ2ludDMyICpwdzsKKworICAgICAgbWVtc2V0ICgoZ3VpbnQ4ICopIHN0LT5idWZfcHJlX2NvcnIgKyBieXRlc19wcmVfY29yciwgMCwgVU5ST0xMX1BBRERJTkcpOworICAgICAgcHcgPSBzdC0+dGFibGVfd2luZG93OworICAgICAgZm9yIChpID0gMTsgaSA8IGZyYW1lc19vdmVybGFwOyBpKyspIHsKKyAgICAgICAgZ2ludDMyIHYgPSAoaSAqICh0IC0gaSkgKiBuKSA+PiAxNTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHN0LT5zYW1wbGVzX3Blcl9mcmFtZTsgaisrKSB7CisgICAgICAgICAgKnB3KysgPSB2OworICAgICAgICB9CisgICAgICB9CisgICAgICBzdC0+YmVzdF9vdmVybGFwX29mZnNldCA9IGJlc3Rfb3ZlcmxhcF9vZmZzZXRfczE2OworICAgIH0gZWxzZSBpZiAoc3QtPmZvcm1hdCA9PSBHU1RfQVVESU9fRk9STUFUX0YzMikgeworICAgICAgZ2Zsb2F0ICpwdyA9IHN0LT50YWJsZV93aW5kb3c7CisgICAgICBmb3IgKGkgPSAxOyBpIDwgZnJhbWVzX292ZXJsYXA7IGkrKykgeworICAgICAgICBnZmxvYXQgdiA9IGkgKiAoZnJhbWVzX292ZXJsYXAgLSBpKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHN0LT5zYW1wbGVzX3Blcl9mcmFtZTsgaisrKSB7CisgICAgICAgICAgKnB3KysgPSB2OworICAgICAgICB9CisgICAgICB9CisgICAgICBzdC0+YmVzdF9vdmVybGFwX29mZnNldCA9IGJlc3Rfb3ZlcmxhcF9vZmZzZXRfZmxvYXQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGdkb3VibGUgKnB3ID0gc3QtPnRhYmxlX3dpbmRvdzsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBmcmFtZXNfb3ZlcmxhcDsgaSsrKSB7CisgICAgICAgIGdkb3VibGUgdiA9IGkgKiAoZnJhbWVzX292ZXJsYXAgLSBpKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHN0LT5zYW1wbGVzX3Blcl9mcmFtZTsgaisrKSB7CisgICAgICAgICAgKnB3KysgPSB2OworICAgICAgICB9CisgICAgICB9CisgICAgICBzdC0+YmVzdF9vdmVybGFwX29mZnNldCA9IGJlc3Rfb3ZlcmxhcF9vZmZzZXRfZG91YmxlOworICAgIH0KKyAgfQorCisgIG5ld19zaXplID0KKyAgICAgIChzdC0+ZnJhbWVzX3NlYXJjaCArIGZyYW1lc19zdHJpZGUgKworICAgICAgZnJhbWVzX292ZXJsYXApICogc3QtPmJ5dGVzX3Blcl9mcmFtZTsKKyAgaWYgKHN0LT5ieXRlc19xdWV1ZWQgPiBuZXdfc2l6ZSkgeworICAgIGlmIChzdC0+Ynl0ZXNfdG9fc2xpZGUgPiBzdC0+Ynl0ZXNfcXVldWVkKSB7CisgICAgICBzdC0+Ynl0ZXNfdG9fc2xpZGUgLT0gc3QtPmJ5dGVzX3F1ZXVlZDsKKyAgICAgIHN0LT5ieXRlc19xdWV1ZWQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBndWludCBuZXdfcXVldWVkID0gTUlOIChzdC0+Ynl0ZXNfcXVldWVkIC0gc3QtPmJ5dGVzX3RvX3NsaWRlLCBuZXdfc2l6ZSk7CisgICAgICBtZW1tb3ZlIChzdC0+YnVmX3F1ZXVlLAorICAgICAgICAgIHN0LT5idWZfcXVldWUgKyBzdC0+Ynl0ZXNfcXVldWVkIC0gbmV3X3F1ZXVlZCwgbmV3X3F1ZXVlZCk7CisgICAgICBzdC0+Ynl0ZXNfdG9fc2xpZGUgPSAwOworICAgICAgc3QtPmJ5dGVzX3F1ZXVlZCA9IG5ld19xdWV1ZWQ7CisgICAgfQorICB9CisKKyAgc3QtPmJ5dGVzX3F1ZXVlX21heCA9IG5ld19zaXplOworICBzdC0+YnVmX3F1ZXVlID0gZ19yZWFsbG9jIChzdC0+YnVmX3F1ZXVlLCBzdC0+Ynl0ZXNfcXVldWVfbWF4KTsKKworICBsYXRlbmN5ID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoc3QtPmJ5dGVzX3F1ZXVlX21heCwgR1NUX1NFQ09ORCwKKyAgICAgIHN0LT5ieXRlc19wZXJfZnJhbWUgKiBzdC0+c2FtcGxlX3JhdGUpOworICBpZiAoc3QtPmxhdGVuY3kgIT0gbGF0ZW5jeSkgeworICAgIHN0LT5sYXRlbmN5ID0gbGF0ZW5jeTsKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UIChzdCksCisgICAgICAgIGdzdF9tZXNzYWdlX25ld19sYXRlbmN5IChHU1RfT0JKRUNUIChzdCkpKTsKKyAgfQorCisgIHN0LT5ieXRlc19zdHJpZGVfc2NhbGVkID0gc3QtPmJ5dGVzX3N0cmlkZSAqIHN0LT5zY2FsZTsKKyAgc3QtPmZyYW1lc19zdHJpZGVfc2NhbGVkID0gc3QtPmJ5dGVzX3N0cmlkZV9zY2FsZWQgLyBzdC0+Ynl0ZXNfcGVyX2ZyYW1lOworCisgIEdTVF9ERUJVRworICAgICAgKCIlLjNmIHNjYWxlLCAlLjNmIHN0cmlkZV9pbiwgJWkgc3RyaWRlX291dCwgJWkgc3RhbmRpbmcsICVpIG92ZXJsYXAsICVpIHNlYXJjaCwgJWkgcXVldWUsICVzIG1vZGUiLAorICAgICAgc3QtPnNjYWxlLCBzdC0+ZnJhbWVzX3N0cmlkZV9zY2FsZWQsCisgICAgICAoZ2ludCkgKHN0LT5ieXRlc19zdHJpZGUgLyBzdC0+Ynl0ZXNfcGVyX2ZyYW1lKSwKKyAgICAgIChnaW50KSAoc3QtPmJ5dGVzX3N0YW5kaW5nIC8gc3QtPmJ5dGVzX3Blcl9mcmFtZSksCisgICAgICAoZ2ludCkgKHN0LT5ieXRlc19vdmVybGFwIC8gc3QtPmJ5dGVzX3Blcl9mcmFtZSksIHN0LT5mcmFtZXNfc2VhcmNoLAorICAgICAgKGdpbnQpIChzdC0+Ynl0ZXNfcXVldWVfbWF4IC8gc3QtPmJ5dGVzX3Blcl9mcmFtZSksCisgICAgICBnc3RfYXVkaW9fZm9ybWF0X3RvX3N0cmluZyAoc3QtPmZvcm1hdCkpOworCisgIHN0LT5yZWluaXRfYnVmZmVycyA9IEZBTFNFOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK3JldmVyc2VfYnVmZmVyIChHc3RTY2FsZXRlbXBvICogc3QsIEdzdEJ1ZmZlciAqIGluYnVmKQoreworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0TWFwSW5mbyBpbWFwLCBvbWFwOworCisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZiwgJmltYXAsIEdTVF9NQVBfUkVBRCk7CisgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoaW1hcC5zaXplKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZiwgJm9tYXAsIEdTVF9NQVBfV1JJVEUpOworCisgIGlmIChzdC0+Zm9ybWF0ID09IEdTVF9BVURJT19GT1JNQVRfRjY0KSB7CisgICAgY29uc3QgZ2ludDY0ICppcCA9IChjb25zdCBnaW50NjQgKikgaW1hcC5kYXRhOworICAgIGdpbnQ2NCAqb3AgPSAoZ2ludDY0ICopIChvbWFwLmRhdGEgKyBvbWFwLnNpemUgLSA4ICogc3QtPnNhbXBsZXNfcGVyX2ZyYW1lKTsKKyAgICBndWludCBpLCBuID0gaW1hcC5zaXplIC8gKDggKiBzdC0+c2FtcGxlc19wZXJfZnJhbWUpOworICAgIGd1aW50IGosIGMgPSBzdC0+c2FtcGxlc19wZXJfZnJhbWU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgYzsgaisrKQorICAgICAgICBvcFtqXSA9IGlwW2pdOworICAgICAgb3AgLT0gYzsKKyAgICAgIGlwICs9IGM7CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IGdpbnQzMiAqaXAgPSAoY29uc3QgZ2ludDMyICopIGltYXAuZGF0YTsKKyAgICBnaW50MzIgKm9wID0gKGdpbnQzMiAqKSAob21hcC5kYXRhICsgb21hcC5zaXplIC0gNCAqIHN0LT5zYW1wbGVzX3Blcl9mcmFtZSk7CisgICAgZ3VpbnQgaSwgbiA9IGltYXAuc2l6ZSAvICg0ICogc3QtPnNhbXBsZXNfcGVyX2ZyYW1lKTsKKyAgICBndWludCBqLCBjID0gc3QtPnNhbXBsZXNfcGVyX2ZyYW1lOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IGM7IGorKykKKyAgICAgICAgb3Bbal0gPSBpcFtqXTsKKyAgICAgIG9wIC09IGM7CisgICAgICBpcCArPSBjOworICAgIH0KKyAgfQorCisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmLCAmaW1hcCk7CisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm9tYXApOworCisgIHJldHVybiBvdXRidWY7Cit9CisKKy8qIEdzdEJhc2VUcmFuc2Zvcm0gdm1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfc2NhbGV0ZW1wb190cmFuc2Zvcm0gKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RCdWZmZXIgKiBpbmJ1ZiwgR3N0QnVmZmVyICogb3V0YnVmKQoreworICBHc3RTY2FsZXRlbXBvICpzdCA9IEdTVF9TQ0FMRVRFTVBPICh0cmFucyk7CisgIGdpbnQ4ICpwb3V0OworICBndWludCBvZmZzZXRfaW4sIGJ5dGVzX291dDsKKyAgR3N0TWFwSW5mbyBvbWFwOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworICBHc3RCdWZmZXIgKnRtcGJ1ZiA9IE5VTEw7CisKKyAgaWYgKHN0LT5yZXZlcnNlKQorICAgIHRtcGJ1ZiA9IHJldmVyc2VfYnVmZmVyIChzdCwgaW5idWYpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZvbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgcG91dCA9IChnaW50OCAqKSBvbWFwLmRhdGE7CisgIGJ5dGVzX291dCA9IG9tYXAuc2l6ZTsKKworICBvZmZzZXRfaW4gPSBmaWxsX3F1ZXVlIChzdCwgdG1wYnVmID8gdG1wYnVmIDogaW5idWYsIDApOworICBieXRlc19vdXQgPSAwOworICB3aGlsZSAoc3QtPmJ5dGVzX3F1ZXVlZCA+PSBzdC0+Ynl0ZXNfcXVldWVfbWF4KSB7CisgICAgZ3VpbnQgYnl0ZXNfb2ZmID0gMDsKKyAgICBnZG91YmxlIGZyYW1lc190b19zbGlkZTsKKyAgICBndWludCBmcmFtZXNfdG9fc3RyaWRlX3dob2xlOworCisgICAgLyogb3V0cHV0IHN0cmlkZSAqLworICAgIGlmIChzdC0+b3V0cHV0X292ZXJsYXApIHsKKyAgICAgIGlmIChzdC0+YmVzdF9vdmVybGFwX29mZnNldCkgeworICAgICAgICBieXRlc19vZmYgPSBzdC0+YmVzdF9vdmVybGFwX29mZnNldCAoc3QpOworICAgICAgfQorICAgICAgc3QtPm91dHB1dF9vdmVybGFwIChzdCwgcG91dCwgYnl0ZXNfb2ZmKTsKKyAgICB9CisgICAgbWVtY3B5IChwb3V0ICsgc3QtPmJ5dGVzX292ZXJsYXAsCisgICAgICAgIHN0LT5idWZfcXVldWUgKyBieXRlc19vZmYgKyBzdC0+Ynl0ZXNfb3ZlcmxhcCwgc3QtPmJ5dGVzX3N0YW5kaW5nKTsKKyAgICBwb3V0ICs9IHN0LT5ieXRlc19zdHJpZGU7CisgICAgYnl0ZXNfb3V0ICs9IHN0LT5ieXRlc19zdHJpZGU7CisKKyAgICAvKiBpbnB1dCBzdHJpZGUgKi8KKyAgICBtZW1jcHkgKHN0LT5idWZfb3ZlcmxhcCwKKyAgICAgICAgc3QtPmJ1Zl9xdWV1ZSArIGJ5dGVzX29mZiArIHN0LT5ieXRlc19zdHJpZGUsIHN0LT5ieXRlc19vdmVybGFwKTsKKyAgICBmcmFtZXNfdG9fc2xpZGUgPSBzdC0+ZnJhbWVzX3N0cmlkZV9zY2FsZWQgKyBzdC0+ZnJhbWVzX3N0cmlkZV9lcnJvcjsKKyAgICBmcmFtZXNfdG9fc3RyaWRlX3dob2xlID0gKGdpbnQpIGZyYW1lc190b19zbGlkZTsKKyAgICBzdC0+Ynl0ZXNfdG9fc2xpZGUgPSBmcmFtZXNfdG9fc3RyaWRlX3dob2xlICogc3QtPmJ5dGVzX3Blcl9mcmFtZTsKKyAgICBzdC0+ZnJhbWVzX3N0cmlkZV9lcnJvciA9IGZyYW1lc190b19zbGlkZSAtIGZyYW1lc190b19zdHJpZGVfd2hvbGU7CisKKyAgICBvZmZzZXRfaW4gKz0gZmlsbF9xdWV1ZSAoc3QsIHRtcGJ1ZiA/IHRtcGJ1ZiA6IGluYnVmLCBvZmZzZXRfaW4pOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm9tYXApOworCisgIGlmIChzdC0+cmV2ZXJzZSkgeworICAgIHRpbWVzdGFtcCA9IHN0LT5pbl9zZWdtZW50LnN0b3AgLSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWYpOworICAgIGlmICh0aW1lc3RhbXAgPCBzdC0+bGF0ZW5jeSkKKyAgICAgIHRpbWVzdGFtcCA9IDA7CisgICAgZWxzZQorICAgICAgdGltZXN0YW1wIC09IHN0LT5sYXRlbmN5OworICB9IGVsc2UgeworICAgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZikgLSBzdC0+aW5fc2VnbWVudC5zdGFydDsKKyAgICBpZiAodGltZXN0YW1wIDwgc3QtPmxhdGVuY3kpCisgICAgICB0aW1lc3RhbXAgPSAwOworICAgIGVsc2UKKyAgICAgIHRpbWVzdGFtcCAtPSBzdC0+bGF0ZW5jeTsKKyAgfQorICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSA9IHRpbWVzdGFtcCAvIHN0LT5zY2FsZSArIHN0LT5pbl9zZWdtZW50LnN0YXJ0OworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoYnl0ZXNfb3V0LCBHU1RfU0VDT05ELAorICAgICAgc3QtPmJ5dGVzX3Blcl9mcmFtZSAqIHN0LT5zYW1wbGVfcmF0ZSk7CisgIGdzdF9idWZmZXJfc2V0X3NpemUgKG91dGJ1ZiwgYnl0ZXNfb3V0KTsKKworICBpZiAodG1wYnVmKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKHRtcGJ1Zik7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NjYWxldGVtcG9fc3VibWl0X2lucHV0X2J1ZmZlciAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIGdib29sZWFuIGlzX2Rpc2NvbnQsIEdzdEJ1ZmZlciAqIGlucHV0KQoreworICBHc3RTY2FsZXRlbXBvICpzY2FsZXRlbXBvID0gR1NUX1NDQUxFVEVNUE8gKHRyYW5zKTsKKworICBpZiAoc2NhbGV0ZW1wby0+aW5fc2VnbWVudC5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgaW5wdXQgPQorICAgICAgICBnc3RfYXVkaW9fYnVmZmVyX2NsaXAgKGlucHV0LCAmc2NhbGV0ZW1wby0+aW5fc2VnbWVudCwKKyAgICAgICAgc2NhbGV0ZW1wby0+c2FtcGxlX3JhdGUsIHNjYWxldGVtcG8tPmJ5dGVzX3Blcl9mcmFtZSk7CisgICAgaWYgKCFpbnB1dCkKKyAgICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorCisgIHJldHVybiBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKHBhcmVudF9jbGFzcyktPnN1Ym1pdF9pbnB1dF9idWZmZXIgKHRyYW5zLAorICAgICAgaXNfZGlzY29udCwgaW5wdXQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zY2FsZXRlbXBvX3RyYW5zZm9ybV9zaXplIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwKKyAgICBHc3RDYXBzICogY2FwcywgZ3NpemUgc2l6ZSwgR3N0Q2FwcyAqIG90aGVyY2FwcywgZ3NpemUgKiBvdGhlcnNpemUpCit7CisgIGlmIChkaXJlY3Rpb24gPT0gR1NUX1BBRF9TSU5LKSB7CisgICAgR3N0U2NhbGV0ZW1wbyAqc2NhbGV0ZW1wbyA9IEdTVF9TQ0FMRVRFTVBPICh0cmFucyk7CisgICAgZ2ludCBieXRlc190b19vdXQ7CisKKyAgICBpZiAoc2NhbGV0ZW1wby0+cmVpbml0X2J1ZmZlcnMpCisgICAgICByZWluaXRfYnVmZmVycyAoc2NhbGV0ZW1wbyk7CisKKyAgICBieXRlc190b19vdXQgPSBzaXplICsgc2NhbGV0ZW1wby0+Ynl0ZXNfcXVldWVkIC0gc2NhbGV0ZW1wby0+Ynl0ZXNfdG9fc2xpZGU7CisgICAgaWYgKGJ5dGVzX3RvX291dCA8IChnaW50KSBzY2FsZXRlbXBvLT5ieXRlc19xdWV1ZV9tYXgpIHsKKyAgICAgICpvdGhlcnNpemUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAvKiB3aGlsZSAodG90YWxfYnVmZmVyZWQgLSBzdHJpZGVfbGVuZ3RoICogbiA+PSBxdWV1ZV9tYXgpIG4rKyAqLworICAgICAgKm90aGVyc2l6ZSA9IHNjYWxldGVtcG8tPmJ5dGVzX3N0cmlkZSAqICgoZ3VpbnQpICgKKyAgICAgICAgICAgICAgKGJ5dGVzX3RvX291dCAtIHNjYWxldGVtcG8tPmJ5dGVzX3F1ZXVlX21heCArCisgICAgICAgICAgICAgICAgICAvKiByb3VuZGluZyBwcm90ZWN0aW9uICovIHNjYWxldGVtcG8tPmJ5dGVzX3Blcl9mcmFtZSkKKyAgICAgICAgICAgICAgLyBzY2FsZXRlbXBvLT5ieXRlc19zdHJpZGVfc2NhbGVkKSArIDEpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2NhbGV0ZW1wb19zaW5rX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFNjYWxldGVtcG8gKnNjYWxldGVtcG8gPSBHU1RfU0NBTEVURU1QTyAodHJhbnMpOworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9TRUdNRU5UKSB7CisgICAgR3N0U2VnbWVudCBzZWdtZW50OworCisgICAgZ3N0X2V2ZW50X2NvcHlfc2VnbWVudCAoZXZlbnQsICZzZWdtZW50KTsKKworICAgIGlmIChzZWdtZW50LmZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUKKyAgICAgICAgfHwgc2NhbGV0ZW1wby0+c2NhbGUgIT0gQUJTIChzZWdtZW50LnJhdGUpCisgICAgICAgIHx8ICEgIXNjYWxldGVtcG8tPnJldmVyc2UgIT0gISAhKHNlZ21lbnQucmF0ZSA8IDAuMCkpIHsKKyAgICAgIGlmIChzZWdtZW50LmZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUgfHwgQUJTIChzZWdtZW50LnJhdGUgLSAxLjApIDwgMWUtMTApIHsKKyAgICAgICAgc2NhbGV0ZW1wby0+c2NhbGUgPSAxLjA7CisgICAgICAgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfcGFzc3Rocm91Z2ggKEdTVF9CQVNFX1RSQU5TRk9STSAoc2NhbGV0ZW1wbyksCisgICAgICAgICAgICBUUlVFKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfcGFzc3Rocm91Z2ggKEdTVF9CQVNFX1RSQU5TRk9STSAoc2NhbGV0ZW1wbyksCisgICAgICAgICAgICBGQUxTRSk7CisgICAgICAgIHNjYWxldGVtcG8tPnNjYWxlID0gQUJTIChzZWdtZW50LnJhdGUpOworICAgICAgICBzY2FsZXRlbXBvLT5yZXZlcnNlID0gc2VnbWVudC5yYXRlIDwgMC4wOworICAgICAgICBzY2FsZXRlbXBvLT5ieXRlc19zdHJpZGVfc2NhbGVkID0KKyAgICAgICAgICAgIHNjYWxldGVtcG8tPmJ5dGVzX3N0cmlkZSAqIHNjYWxldGVtcG8tPnNjYWxlOworICAgICAgICBzY2FsZXRlbXBvLT5mcmFtZXNfc3RyaWRlX3NjYWxlZCA9CisgICAgICAgICAgICBzY2FsZXRlbXBvLT5ieXRlc19zdHJpZGVfc2NhbGVkIC8gc2NhbGV0ZW1wby0+Ynl0ZXNfcGVyX2ZyYW1lOworICAgICAgICBHU1RfREVCVUcgKCIlLjNmIHNjYWxlLCAlLjNmIHN0cmlkZV9pbiwgJWkgc3RyaWRlX291dCIsCisgICAgICAgICAgICBzY2FsZXRlbXBvLT5zY2FsZSwgc2NhbGV0ZW1wby0+ZnJhbWVzX3N0cmlkZV9zY2FsZWQsCisgICAgICAgICAgICAoZ2ludCkgKHNjYWxldGVtcG8tPmJ5dGVzX3N0cmlkZSAvIHNjYWxldGVtcG8tPmJ5dGVzX3Blcl9mcmFtZSkpOworCisgICAgICAgIHNjYWxldGVtcG8tPmJ5dGVzX3RvX3NsaWRlID0gMDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzY2FsZXRlbXBvLT5pbl9zZWdtZW50ID0gc2VnbWVudDsKKyAgICBzY2FsZXRlbXBvLT5vdXRfc2VnbWVudCA9IHNlZ21lbnQ7CisKKyAgICBpZiAoc2NhbGV0ZW1wby0+c2NhbGUgIT0gMS4wIHx8IHNjYWxldGVtcG8tPnJldmVyc2UpIHsKKyAgICAgIGd1aW50MzIgc2VxbnVtOworCisgICAgICBzZWdtZW50LmFwcGxpZWRfcmF0ZSA9IHNlZ21lbnQucmF0ZTsKKyAgICAgIHNlZ21lbnQucmF0ZSA9IDEuMDsKKworICAgICAgaWYgKHNlZ21lbnQuc3RvcCAhPSAtMSkgeworICAgICAgICBzZWdtZW50LnN0b3AgPQorICAgICAgICAgICAgKHNlZ21lbnQuc3RvcCAtIHNlZ21lbnQuc3RhcnQpIC8gQUJTIChzZWdtZW50LmFwcGxpZWRfcmF0ZSkgKworICAgICAgICAgICAgc2VnbWVudC5zdGFydDsKKyAgICAgIH0KKworICAgICAgc2NhbGV0ZW1wby0+b3V0X3NlZ21lbnQgPSBzZWdtZW50OworCisgICAgICBzZXFudW0gPSBnc3RfZXZlbnRfZ2V0X3NlcW51bSAoZXZlbnQpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisKKyAgICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCk7CisgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZXZlbnQsIHNlcW51bSk7CisKKyAgICAgIHJldHVybiBnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9CQVNFX1RSQU5TRk9STV9TUkNfUEFEICh0cmFucyksIGV2ZW50KTsKKyAgICB9CisgIH0gZWxzZSBpZiAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSA9PSBHU1RfRVZFTlRfRkxVU0hfU1RPUCkgeworICAgIGdzdF9zZWdtZW50X2luaXQgKCZzY2FsZXRlbXBvLT5pbl9zZWdtZW50LCBHU1RfRk9STUFUX1VOREVGSU5FRCk7CisgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNjYWxldGVtcG8tPm91dF9zZWdtZW50LCBHU1RfRk9STUFUX1VOREVGSU5FRCk7CisgIH0gZWxzZSBpZiAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSA9PSBHU1RfRVZFTlRfR0FQKSB7CisgICAgaWYgKHNjYWxldGVtcG8tPnNjYWxlICE9IDEuMCkgeworICAgICAgR3N0Q2xvY2tUaW1lIGdhcF90cywgZ2FwX2R1cmF0aW9uOworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2dhcCAoZXZlbnQsICZnYXBfdHMsICZnYXBfZHVyYXRpb24pOworICAgICAgaWYgKHNjYWxldGVtcG8tPnJldmVyc2UpIHsKKyAgICAgICAgZ2FwX3RzID0gc2NhbGV0ZW1wby0+aW5fc2VnbWVudC5zdG9wIC0gZ2FwX3RzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2FwX3RzID0gZ2FwX3RzIC0gc2NhbGV0ZW1wby0+aW5fc2VnbWVudC5zdGFydDsKKyAgICAgIH0KKyAgICAgIGdhcF90cyA9IGdhcF90cyAvIHNjYWxldGVtcG8tPnNjYWxlICsgc2NhbGV0ZW1wby0+aW5fc2VnbWVudC5zdGFydDsKKyAgICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZ2FwX2R1cmF0aW9uKSkgeworICAgICAgICBnYXBfZHVyYXRpb24gPSBnYXBfZHVyYXRpb24gLyBBQlMgKHNjYWxldGVtcG8tPnNjYWxlKTsKKyAgICAgIH0KKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2dhcCAoZ2FwX3RzLCBnYXBfZHVyYXRpb24pOworICAgIH0KKyAgfQorCisgIHJldHVybiBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKHRyYW5zLCBldmVudCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NjYWxldGVtcG9fc2V0X2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RDYXBzICogaW5jYXBzLCBHc3RDYXBzICogb3V0Y2FwcykKK3sKKyAgR3N0U2NhbGV0ZW1wbyAqc2NhbGV0ZW1wbyA9IEdTVF9TQ0FMRVRFTVBPICh0cmFucyk7CisKKyAgZ2ludCB3aWR0aCwgYnBzLCBuY2gsIHJhdGU7CisgIEdzdEF1ZGlvSW5mbyBpbmZvOworICBHc3RBdWRpb0Zvcm1hdCBmb3JtYXQ7CisKKyAgaWYgKCFnc3RfYXVkaW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBpbmNhcHMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBuY2ggPSBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJmluZm8pOworICByYXRlID0gR1NUX0FVRElPX0lORk9fUkFURSAoJmluZm8pOworICB3aWR0aCA9IEdTVF9BVURJT19JTkZPX1dJRFRIICgmaW5mbyk7CisgIGZvcm1hdCA9IEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoJmluZm8pOworCisgIGJwcyA9IHdpZHRoIC8gODsKKworICBHU1RfREVCVUcgKCJjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCAiLCAlZCBicHMiLCBpbmNhcHMsIGJwcyk7CisKKyAgaWYgKHJhdGUgIT0gc2NhbGV0ZW1wby0+c2FtcGxlX3JhdGUKKyAgICAgIHx8IG5jaCAhPSBzY2FsZXRlbXBvLT5zYW1wbGVzX3Blcl9mcmFtZQorICAgICAgfHwgYnBzICE9IHNjYWxldGVtcG8tPmJ5dGVzX3Blcl9zYW1wbGUgfHwgZm9ybWF0ICE9IHNjYWxldGVtcG8tPmZvcm1hdCkgeworICAgIHNjYWxldGVtcG8tPnNhbXBsZV9yYXRlID0gcmF0ZTsKKyAgICBzY2FsZXRlbXBvLT5zYW1wbGVzX3Blcl9mcmFtZSA9IG5jaDsKKyAgICBzY2FsZXRlbXBvLT5ieXRlc19wZXJfc2FtcGxlID0gYnBzOworICAgIHNjYWxldGVtcG8tPmJ5dGVzX3Blcl9mcmFtZSA9IG5jaCAqIGJwczsKKyAgICBzY2FsZXRlbXBvLT5mb3JtYXQgPSBmb3JtYXQ7CisgICAgc2NhbGV0ZW1wby0+cmVpbml0X2J1ZmZlcnMgPSBUUlVFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NjYWxldGVtcG9fc3RhcnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucykKK3sKKyAgR3N0U2NhbGV0ZW1wbyAqc2NhbGV0ZW1wbyA9IEdTVF9TQ0FMRVRFTVBPICh0cmFucyk7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNjYWxldGVtcG8tPmluX3NlZ21lbnQsIEdTVF9GT1JNQVRfVU5ERUZJTkVEKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNjYWxldGVtcG8tPm91dF9zZWdtZW50LCBHU1RfRk9STUFUX1VOREVGSU5FRCk7CisgIHNjYWxldGVtcG8tPnJlaW5pdF9idWZmZXJzID0gVFJVRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2NhbGV0ZW1wb19zdG9wIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpCit7CisgIEdzdFNjYWxldGVtcG8gKnNjYWxldGVtcG8gPSBHU1RfU0NBTEVURU1QTyAodHJhbnMpOworCisgIGdfZnJlZSAoc2NhbGV0ZW1wby0+YnVmX3F1ZXVlKTsKKyAgc2NhbGV0ZW1wby0+YnVmX3F1ZXVlID0gTlVMTDsKKyAgZ19mcmVlIChzY2FsZXRlbXBvLT5idWZfb3ZlcmxhcCk7CisgIHNjYWxldGVtcG8tPmJ1Zl9vdmVybGFwID0gTlVMTDsKKyAgZ19mcmVlIChzY2FsZXRlbXBvLT50YWJsZV9ibGVuZCk7CisgIHNjYWxldGVtcG8tPnRhYmxlX2JsZW5kID0gTlVMTDsKKyAgZ19mcmVlIChzY2FsZXRlbXBvLT5idWZfcHJlX2NvcnIpOworICBzY2FsZXRlbXBvLT5idWZfcHJlX2NvcnIgPSBOVUxMOworICBnX2ZyZWUgKHNjYWxldGVtcG8tPnRhYmxlX3dpbmRvdyk7CisgIHNjYWxldGVtcG8tPnRhYmxlX3dpbmRvdyA9IE5VTEw7CisgIHNjYWxldGVtcG8tPnJlaW5pdF9idWZmZXJzID0gVFJVRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2NhbGV0ZW1wb19xdWVyeSAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLCBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFNjYWxldGVtcG8gKnNjYWxldGVtcG8gPSBHU1RfU0NBTEVURU1QTyAodHJhbnMpOworCisgIGlmIChkaXJlY3Rpb24gPT0gR1NUX1BBRF9TUkMpIHsKKyAgICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICAgIGNhc2UgR1NUX1FVRVJZX0xBVEVOQ1k6eworICAgICAgICBHc3RQYWQgKnBlZXI7CisKKyAgICAgICAgaWYgKChwZWVyID0gZ3N0X3BhZF9nZXRfcGVlciAoR1NUX0JBU0VfVFJBTlNGT1JNX1NJTktfUEFEICh0cmFucykpKSkgeworICAgICAgICAgIGlmICgoZ3N0X3BhZF9xdWVyeSAocGVlciwgcXVlcnkpKSkgeworICAgICAgICAgICAgR3N0Q2xvY2tUaW1lIG1pbiwgbWF4OworICAgICAgICAgICAgZ2Jvb2xlYW4gbGl2ZTsKKworICAgICAgICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2xhdGVuY3kgKHF1ZXJ5LCAmbGl2ZSwgJm1pbiwgJm1heCk7CisKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNjYWxldGVtcG8sICJQZWVyIGxhdGVuY3k6IG1pbiAlIgorICAgICAgICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiIG1heCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobWluKSwgR1NUX1RJTUVfQVJHUyAobWF4KSk7CisKKyAgICAgICAgICAgIC8qIGFkZCBvdXIgb3duIGxhdGVuY3kgKi8KKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNjYWxldGVtcG8sICJPdXIgbGF0ZW5jeTogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHNjYWxldGVtcG8tPmxhdGVuY3kpKTsKKyAgICAgICAgICAgIG1pbiArPSBzY2FsZXRlbXBvLT5sYXRlbmN5OworICAgICAgICAgICAgaWYgKG1heCAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgICAgICAgICAgICBtYXggKz0gc2NhbGV0ZW1wby0+bGF0ZW5jeTsKKworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2NhbGV0ZW1wbywgIkNhbGN1bGF0ZWQgdG90YWwgbGF0ZW5jeSA6IG1pbiAlIgorICAgICAgICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiIG1heCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobWluKSwgR1NUX1RJTUVfQVJHUyAobWF4KSk7CisgICAgICAgICAgICBnc3RfcXVlcnlfc2V0X2xhdGVuY3kgKHF1ZXJ5LCBsaXZlLCBtaW4sIG1heCk7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHBlZXIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgICBkZWZhdWx0OnsKKyAgICAgICAgcmV0dXJuIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+cXVlcnkgKHRyYW5zLCBkaXJlY3Rpb24sCisgICAgICAgICAgICBxdWVyeSk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKHBhcmVudF9jbGFzcyktPnF1ZXJ5ICh0cmFucywgZGlyZWN0aW9uLAorICAgICAgICBxdWVyeSk7CisgIH0KK30KKworLyogR09iamVjdCB2bWV0aG9kIGltcGxlbWVudGF0aW9ucyAqLworc3RhdGljIHZvaWQKK2dzdF9zY2FsZXRlbXBvX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTY2FsZXRlbXBvICpzY2FsZXRlbXBvID0gR1NUX1NDQUxFVEVNUE8gKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1JBVEU6CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBzY2FsZXRlbXBvLT5zY2FsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1RSSURFOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNjYWxldGVtcG8tPm1zX3N0cmlkZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfT1ZFUkxBUDoKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIHNjYWxldGVtcG8tPnBlcmNlbnRfb3ZlcmxhcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0VBUkNIOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNjYWxldGVtcG8tPm1zX3NlYXJjaCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc2NhbGV0ZW1wb19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0U2NhbGV0ZW1wbyAqc2NhbGV0ZW1wbyA9IEdTVF9TQ0FMRVRFTVBPIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TVFJJREU6eworICAgICAgZ3VpbnQgbmV3X3ZhbHVlID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgaWYgKHNjYWxldGVtcG8tPm1zX3N0cmlkZSAhPSBuZXdfdmFsdWUpIHsKKyAgICAgICAgc2NhbGV0ZW1wby0+bXNfc3RyaWRlID0gbmV3X3ZhbHVlOworICAgICAgICBzY2FsZXRlbXBvLT5yZWluaXRfYnVmZmVycyA9IFRSVUU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX09WRVJMQVA6eworICAgICAgZ2RvdWJsZSBuZXdfdmFsdWUgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIGlmIChzY2FsZXRlbXBvLT5wZXJjZW50X292ZXJsYXAgIT0gbmV3X3ZhbHVlKSB7CisgICAgICAgIHNjYWxldGVtcG8tPnBlcmNlbnRfb3ZlcmxhcCA9IG5ld192YWx1ZTsKKyAgICAgICAgc2NhbGV0ZW1wby0+cmVpbml0X2J1ZmZlcnMgPSBUUlVFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9TRUFSQ0g6eworICAgICAgZ3VpbnQgbmV3X3ZhbHVlID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgaWYgKHNjYWxldGVtcG8tPm1zX3NlYXJjaCAhPSBuZXdfdmFsdWUpIHsKKyAgICAgICAgc2NhbGV0ZW1wby0+bXNfc2VhcmNoID0gbmV3X3ZhbHVlOworICAgICAgICBzY2FsZXRlbXBvLT5yZWluaXRfYnVmZmVycyA9IFRSVUU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3NjYWxldGVtcG9fY2xhc3NfaW5pdCAoR3N0U2NhbGV0ZW1wb0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqYmFzZXRyYW5zZm9ybV9jbGFzcyA9IEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2NhbGV0ZW1wb19nZXRfcHJvcGVydHkpOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NjYWxldGVtcG9fc2V0X3Byb3BlcnR5KTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JBVEUsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgicmF0ZSIsICJQbGF5YmFjayBSYXRlIiwgIkN1cnJlbnQgcGxheWJhY2sgcmF0ZSIsCisgICAgICAgICAgR19NSU5JTlQsIEdfTUFYSU5ULCAxLjAsIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TVFJJREUsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInN0cmlkZSIsICJTdHJpZGUgTGVuZ3RoIiwKKyAgICAgICAgICAiTGVuZ3RoIGluIG1pbGxpc2Vjb25kcyB0byBvdXRwdXQgZWFjaCBzdHJpZGUiLCAxLCA1MDAwLCAzMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX09WRVJMQVAsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgib3ZlcmxhcCIsICJPdmVybGFwIExlbmd0aCIsCisgICAgICAgICAgIlBlcmNlbnRhZ2Ugb2Ygc3RyaWRlIHRvIG92ZXJsYXAiLCAwLCAxLCAuMiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NFQVJDSCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgic2VhcmNoIiwgIlNlYXJjaCBMZW5ndGgiLAorICAgICAgICAgICJMZW5ndGggaW4gbWlsbGlzZWNvbmRzIHRvIHNlYXJjaCBmb3IgYmVzdCBvdmVybGFwIHBvc2l0aW9uIiwgMCwgNTAwLAorICAgICAgICAgIDE0LCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJTY2FsZXRlbXBvIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1JhdGUiLAorICAgICAgIlN5bmMgYXVkaW8gdGVtcG8gd2l0aCBwbGF5YmFjayByYXRlIiwKKyAgICAgICJSb3YgSnV2YW5vIDxyb3ZqdXZhbm9AdXNlcnMuc291cmNlZm9yZ2UubmV0PiIpOworCisgIGJhc2V0cmFuc2Zvcm1fY2xhc3MtPnNpbmtfZXZlbnQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zY2FsZXRlbXBvX3NpbmtfZXZlbnQpOworICBiYXNldHJhbnNmb3JtX2NsYXNzLT5zZXRfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2NhbGV0ZW1wb19zZXRfY2Fwcyk7CisgIGJhc2V0cmFuc2Zvcm1fY2xhc3MtPnRyYW5zZm9ybV9zaXplID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2NhbGV0ZW1wb190cmFuc2Zvcm1fc2l6ZSk7CisgIGJhc2V0cmFuc2Zvcm1fY2xhc3MtPnRyYW5zZm9ybSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2NhbGV0ZW1wb190cmFuc2Zvcm0pOworICBiYXNldHJhbnNmb3JtX2NsYXNzLT5xdWVyeSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2NhbGV0ZW1wb19xdWVyeSk7CisgIGJhc2V0cmFuc2Zvcm1fY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zY2FsZXRlbXBvX3N0YXJ0KTsKKyAgYmFzZXRyYW5zZm9ybV9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2NhbGV0ZW1wb19zdG9wKTsKKyAgYmFzZXRyYW5zZm9ybV9jbGFzcy0+c3VibWl0X2lucHV0X2J1ZmZlciA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NjYWxldGVtcG9fc3VibWl0X2lucHV0X2J1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc2NhbGV0ZW1wb19pbml0IChHc3RTY2FsZXRlbXBvICogc2NhbGV0ZW1wbykKK3sKKyAgLyogZGVmYXVsdHMgKi8KKyAgc2NhbGV0ZW1wby0+bXNfc3RyaWRlID0gMzA7CisgIHNjYWxldGVtcG8tPnBlcmNlbnRfb3ZlcmxhcCA9IC4yOworICBzY2FsZXRlbXBvLT5tc19zZWFyY2ggPSAxNDsKKworICAvKiB1bmluaXRpYWxpemVkICovCisgIHNjYWxldGVtcG8tPnNjYWxlID0gMDsKKyAgc2NhbGV0ZW1wby0+c2FtcGxlX3JhdGUgPSAwOworICBzY2FsZXRlbXBvLT5mcmFtZXNfc3RyaWRlX2Vycm9yID0gMDsKKyAgc2NhbGV0ZW1wby0+Ynl0ZXNfc3RyaWRlID0gMDsKKyAgc2NhbGV0ZW1wby0+Ynl0ZXNfcXVldWVkID0gMDsKKyAgc2NhbGV0ZW1wby0+Ynl0ZXNfdG9fc2xpZGUgPSAwOworICBnc3Rfc2VnbWVudF9pbml0ICgmc2NhbGV0ZW1wby0+aW5fc2VnbWVudCwgR1NUX0ZPUk1BVF9VTkRFRklORUQpOworICBnc3Rfc2VnbWVudF9pbml0ICgmc2NhbGV0ZW1wby0+b3V0X3NlZ21lbnQsIEdTVF9GT1JNQVRfVU5ERUZJTkVEKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uaCBiL2dzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTE4ODFkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvZ3N0c2NhbGV0ZW1wby5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBSb3YgSnV2YW5vIDxyb3ZqdXZhbm9AdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfU0NBTEVURU1QT19IX18KKyNkZWZpbmUgX19HU1RfU0NBTEVURU1QT19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9TQ0FMRVRFTVBPICAgICAgICAgICAgKGdzdF9zY2FsZXRlbXBvX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9TQ0FMRVRFTVBPKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksIEdTVF9UWVBFX1NDQUxFVEVNUE8sIEdzdFNjYWxldGVtcG8pKQorI2RlZmluZSBHU1RfU0NBTEVURU1QT19DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksICBHU1RfVFlQRV9TQ0FMRVRFTVBPLCBHc3RTY2FsZXRlbXBvQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfU0NBTEVURU1QTyhvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLCBHU1RfVFlQRV9TQ0FMRVRFTVBPKSkKKyNkZWZpbmUgR1NUX0lTX1NDQUxFVEVNUE9fQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLCAgR1NUX1RZUEVfU0NBTEVURU1QTykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RTY2FsZXRlbXBvIEdzdFNjYWxldGVtcG87Cit0eXBlZGVmIHN0cnVjdCBfR3N0U2NhbGV0ZW1wb0NsYXNzIEdzdFNjYWxldGVtcG9DbGFzczsKK3R5cGVkZWYgc3RydWN0IF9Hc3RTY2FsZXRlbXBvUHJpdmF0ZSBHc3RTY2FsZXRlbXBvUHJpdmF0ZTsKKworc3RydWN0IF9Hc3RTY2FsZXRlbXBvCit7CisgIEdzdEJhc2VUcmFuc2Zvcm0gZWxlbWVudDsKKworICBnZG91YmxlIHNjYWxlOworICBnYm9vbGVhbiByZXZlcnNlOworCisgIC8qIHBhcmFtZXRlcnMgKi8KKyAgZ3VpbnQgbXNfc3RyaWRlOworICBnZG91YmxlIHBlcmNlbnRfb3ZlcmxhcDsKKyAgZ3VpbnQgbXNfc2VhcmNoOworCisgIC8qIGNhcHMgKi8KKyAgR3N0QXVkaW9Gb3JtYXQgZm9ybWF0OworICBndWludCBzYW1wbGVzX3Blcl9mcmFtZTsgICAgICAvKiBBS0EgbnVtYmVyIG9mIGNoYW5uZWxzICovCisgIGd1aW50IGJ5dGVzX3Blcl9zYW1wbGU7CisgIGd1aW50IGJ5dGVzX3Blcl9mcmFtZTsKKyAgZ3VpbnQgc2FtcGxlX3JhdGU7CisKKyAgLyogc3RyaWRlICovCisgIGdkb3VibGUgZnJhbWVzX3N0cmlkZV9zY2FsZWQ7CisgIGdkb3VibGUgZnJhbWVzX3N0cmlkZV9lcnJvcjsKKyAgZ3VpbnQgYnl0ZXNfc3RyaWRlOworICBnZG91YmxlIGJ5dGVzX3N0cmlkZV9zY2FsZWQ7CisgIGd1aW50IGJ5dGVzX3F1ZXVlX21heDsKKyAgZ3VpbnQgYnl0ZXNfcXVldWVkOworICBndWludCBieXRlc190b19zbGlkZTsKKyAgZ2ludDggKmJ1Zl9xdWV1ZTsKKworICAvKiBvdmVybGFwICovCisgIGd1aW50IHNhbXBsZXNfb3ZlcmxhcDsKKyAgZ3VpbnQgc2FtcGxlc19zdGFuZGluZzsKKyAgZ3VpbnQgYnl0ZXNfb3ZlcmxhcDsKKyAgZ3VpbnQgYnl0ZXNfc3RhbmRpbmc7CisgIGdwb2ludGVyIGJ1Zl9vdmVybGFwOworICBncG9pbnRlciB0YWJsZV9ibGVuZDsKKyAgdm9pZCAoKm91dHB1dF9vdmVybGFwKSAoR3N0U2NhbGV0ZW1wbyAqIHNjYWxldGVtcG8sIGdwb2ludGVyIG91dF9idWYsIGd1aW50IGJ5dGVzX29mZik7CisKKyAgLyogYmVzdCBvdmVybGFwICovCisgIGd1aW50IGZyYW1lc19zZWFyY2g7CisgIGdwb2ludGVyIGJ1Zl9wcmVfY29ycjsKKyAgZ3BvaW50ZXIgdGFibGVfd2luZG93OworICBndWludCAoKmJlc3Rfb3ZlcmxhcF9vZmZzZXQpIChHc3RTY2FsZXRlbXBvICogc2NhbGV0ZW1wbyk7CisKKyAgLyogZ3N0cmVhbWVyICovCisgIEdzdFNlZ21lbnQgaW5fc2VnbWVudCwgb3V0X3NlZ21lbnQ7CisgIEdzdENsb2NrVGltZSBsYXRlbmN5OworCisgIC8qIHRocmVhZHMgKi8KKyAgZ2Jvb2xlYW4gcmVpbml0X2J1ZmZlcnM7Cit9OworCitzdHJ1Y3QgX0dzdFNjYWxldGVtcG9DbGFzcworeworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3NjYWxldGVtcG9fZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1NDQUxFVEVNUE9fSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvcGx1Z2luLmMgYi9nc3QvYXVkaW9meC9nc3RzY2FsZXRlbXBvcGx1Z2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2ZjFmMQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L2dzdHNjYWxldGVtcG9wbHVnaW4uYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUm92IEp1dmFubyA8cm92anV2YW5vQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSAodGhlICJMR1BMIiksIGluCisgKiB3aGljaCBjYXNlIHRoZSBmb2xsb3dpbmcgcHJvdmlzaW9ucyBhcHBseSBpbnN0ZWFkIG9mIHRoZSBvbmVzCisgKiBtZW50aW9uZWQgYWJvdmU6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAiZ3N0c2NhbGV0ZW1wby5oIgorCisvKiBlbnRyeSBwb2ludCB0byBpbml0aWFsaXplIHRoZSBwbHVnLWluCisgKiBpbml0aWFsaXplIHRoZSBwbHVnLWluIGl0c2VsZgorICogcmVnaXN0ZXIgdGhlIGVsZW1lbnQgZmFjdG9yaWVzIGFuZCBwYWQgdGVtcGxhdGVzCisgKiByZWdpc3RlciB0aGUgZmVhdHVyZXMKKyAqCisgKiBleGNoYW5nZSB0aGUgc3RyaW5nICdwbHVnaW4nIHdpdGggeW91ciBlbGVtbnQgbmFtZQorICovCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJzY2FsZXRlbXBvIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIEdTVF9UWVBFX1NDQUxFVEVNUE8pOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHNjYWxldGVtcG8sICJTY2FsZSBhdWRpbyB0ZW1wbyBpbiBzeW5jIHdpdGggcGxheWJhY2sgcmF0ZSIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvYXVkaW9meC9tYXRoX2NvbXBhdC5oIGIvZ3N0L2F1ZGlvZngvbWF0aF9jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTIzNzBjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvZngvbWF0aF9jb21wYXQuaApAQCAtMCwwICsxLDU1IEBACisvKiAKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA4IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fTUFUSF9DT01QQVRfSF9fCisjZGVmaW5lIF9fTUFUSF9DT01QQVRfSF9fCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpZm5kZWYgSEFWRV9BU0lOSAorc3RhdGljIGlubGluZSBnZG91YmxlCithc2luaCAoZ2RvdWJsZSB4KQoreworICByZXR1cm4gbG9nKHggKyBzcXJ0ICh4ICogeCArIDEpKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU0lOSAorc3RhdGljIGlubGluZSBnZG91YmxlCitzaW5oIChnZG91YmxlIHgpCit7CisgIHJldHVybiAwLjUgKiAoZXhwICh4KSAtIGV4cCAoLXgpKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfQ09TSAorc3RhdGljIGlubGluZSBnZG91YmxlCitjb3NoIChnZG91YmxlIHgpCit7CisgIHJldHVybiAwLjUgKiAoZXhwICh4KSArIGV4cCAoLXgpKTsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19NQVRIX0NPTVBBVF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb2Z4L21lc29uLmJ1aWxkIGIvZ3N0L2F1ZGlvZngvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1NTA0NAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb2Z4L21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsNDYgQEAKK2F1ZGlvZnhfc291cmNlcyA9IFsKKyAgJ2F1ZGlvZnguYycsCisgICdhdWRpb3Bhbm9yYW1hLmMnLAorICAnYXVkaW9pbnZlcnQuYycsCisgICdhdWRpb2FtcGxpZnkuYycsCisgICdhdWRpb2R5bmFtaWMuYycsCisgICdhdWRpb2thcmFva2UuYycsCisgICdhdWRpb2Z4YmFzZWlpcmZpbHRlci5jJywKKyAgJ2F1ZGlvY2hlYmxpbWl0LmMnLAorICAnYXVkaW9jaGViYmFuZC5jJywKKyAgJ2F1ZGlvaWlyZmlsdGVyLmMnLAorICAnYXVkaW9meGJhc2VmaXJmaWx0ZXIuYycsCisgICdhdWRpb3dzaW5jYmFuZC5jJywKKyAgJ2F1ZGlvd3NpbmNsaW1pdC5jJywKKyAgJ2F1ZGlvZmlyZmlsdGVyLmMnLAorICAnYXVkaW9lY2hvLmMnLAorICAnZ3N0c2NhbGV0ZW1wby5jJworXQorCitvcmNzcmMgPSAnYXVkaW9wYW5vcmFtYW9yYycKK2lmIGhhdmVfb3JjYworICBvcmNfaCA9IGN1c3RvbV90YXJnZXQob3Jjc3JjICsgJy5oJywKKyAgICBpbnB1dCA6IG9yY3NyYyArICcub3JjJywKKyAgICBvdXRwdXQgOiBvcmNzcmMgKyAnLmgnLAorICAgIGNvbW1hbmQgOiBvcmNjX2FyZ3MgKyBbJy0taGVhZGVyJywgJy1vJywgJ0BPVVRQVVRAJywgJ0BJTlBVVEAnXSkKKyAgb3JjX2MgPSBjdXN0b21fdGFyZ2V0KG9yY3NyYyArICcuYycsCisgICAgaW5wdXQgOiBvcmNzcmMgKyAnLm9yYycsCisgICAgb3V0cHV0IDogb3Jjc3JjICsgJy5jJywKKyAgICBjb21tYW5kIDogb3JjY19hcmdzICsgWyctLWltcGxlbWVudGF0aW9uJywgJy1vJywgJ0BPVVRQVVRAJywgJ0BJTlBVVEAnXSkKK2Vsc2UKKyAgb3JjX2ggPSBjb25maWd1cmVfZmlsZShpbnB1dCA6IG9yY3NyYyArICctZGlzdC5oJywKKyAgICBvdXRwdXQgOiBvcmNzcmMgKyAnLmgnLAorICAgIGNvbmZpZ3VyYXRpb24gOiBjb25maWd1cmF0aW9uX2RhdGEoKSkKKyAgb3JjX2MgPSBjb25maWd1cmVfZmlsZShpbnB1dCA6IG9yY3NyYyArICctZGlzdC5jJywKKyAgICBvdXRwdXQgOiBvcmNzcmMgKyAnLmMnLAorICAgIGNvbmZpZ3VyYXRpb24gOiBjb25maWd1cmF0aW9uX2RhdGEoKSkKK2VuZGlmCisKK2dzdGF1ZGlvZnggPSBsaWJyYXJ5KCdnc3RhdWRpb2Z4JywKKyAgYXVkaW9meF9zb3VyY2VzLCBvcmNfYywgb3JjX2gsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbb3JjX2RlcCwgZ3N0YXVkaW9fZGVwLCBnc3RmZnRfZGVwLCBsaWJtXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2dzdC9hdWRpb3BhcnNlcnMvTWFrZWZpbGUuYW0gYi9nc3QvYXVkaW9wYXJzZXJzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Mjc2ODgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9wYXJzZXJzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTkgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGF1ZGlvcGFyc2Vycy5sYQorCitsaWJnc3RhdWRpb3BhcnNlcnNfbGFfU09VUkNFUyA9IFwKKwlnc3RhYWNwYXJzZS5jIGdzdGFtcnBhcnNlLmMgZ3N0YWMzcGFyc2UuYyBcCisJZ3N0ZGNhcGFyc2UuYyBnc3RmbGFjcGFyc2UuYyBnc3RtcGVnYXVkaW9wYXJzZS5jIFwKKwlnc3RzYmNwYXJzZS5jIGdzdHdhdnBhY2twYXJzZS5jIHBsdWdpbi5jCisKK2xpYmdzdGF1ZGlvcGFyc2Vyc19sYV9DRkxBR1MgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdGF1ZGlvcGFyc2Vyc19sYV9MSUJBREQgPSBcCisJLWxnc3RwYnV0aWxzLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dGFnLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJLWxnc3RhdWRpby0kKEdTVF9BUElfVkVSU0lPTikgXAorCSQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykKK2xpYmdzdGF1ZGlvcGFyc2Vyc19sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0YWFjcGFyc2UuaCBnc3RhbXJwYXJzZS5oIGdzdGFjM3BhcnNlLmggXAorCWdzdGRjYXBhcnNlLmggZ3N0ZmxhY3BhcnNlLmggZ3N0bXBlZ2F1ZGlvcGFyc2UuaCBnc3RzYmNwYXJzZS5oIFwKKwlnc3R3YXZwYWNrcGFyc2UuaApkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYWNwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjN2M3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmMKQEAgLTAsMCArMSwxNjcxIEBACisvKiBHU3RyZWFtZXIgQUFDIHBhcnNlciBwbHVnaW4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0OiBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWFhY3BhcnNlCisgKiBAc2hvcnRfZGVzY3JpcHRpb246IEFBQyBwYXJzZXIKKyAqIEBzZWVfYWxzbzogI0dzdEFtclBhcnNlCisgKgorICogVGhpcyBpcyBhbiBBQUMgcGFyc2VyIHdoaWNoIGhhbmRsZXMgYm90aCBBRElGIGFuZCBBRFRTIHN0cmVhbSBmb3JtYXRzLgorICoKKyAqIEFzIEFESUYgZm9ybWF0IGlzIG5vdCBmcmFtZWQsIGl0IGlzIG5vdCBzZWVrYWJsZSBhbmQgc3RyZWFtIGR1cmF0aW9uIGNhbm5vdAorICogYmUgZGV0ZXJtaW5lZCBlaXRoZXIuIEhvd2V2ZXIsIEFEVFMgZm9ybWF0IEFBQyBjbGlwcyBjYW4gYmUgc2Vla2VkLCBhbmQgcGFyc2VyCisgKiBjYW4gYWxzbyBlc3RpbWF0ZSBwbGF5YmFjayBwb3NpdGlvbiBhbmQgY2xpcCBkdXJhdGlvbi4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj1hYmMuYWFjICEgYWFjcGFyc2UgISBmYWFkICEgYXVkaW9yZXNhbXBsZSAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJpdHJlYWRlci5oPgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL3BidXRpbHMuaD4KKyNpbmNsdWRlICJnc3RhYWNwYXJzZS5oIgorCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8vbXBlZywgIgorICAgICAgICAiZnJhbWVkID0gKGJvb2xlYW4pIHRydWUsICIgIm1wZWd2ZXJzaW9uID0gKGludCkgeyAyLCA0IH0sICIKKyAgICAgICAgInN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSB7IHJhdywgYWR0cywgYWRpZiwgbG9hcyB9OyIpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby9tcGVnLCBtcGVndmVyc2lvbiA9IChpbnQpIHsgMiwgNCB9OyIpKTsKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoYWFjcGFyc2VfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgYWFjcGFyc2VfZGVidWcKKworCisjZGVmaW5lIEFESUZfTUFYX1NJWkUgNDAgICAgICAgIC8qIFNob3VsZCBiZSBlbm91Z2ggKi8KKyNkZWZpbmUgQURUU19NQVhfU0laRSAxMCAgICAgICAgLyogU2hvdWxkIGJlIGVub3VnaCAqLworI2RlZmluZSBMT0FTX01BWF9TSVpFIDMgICAgICAgICAvKiBTaG91bGQgYmUgZW5vdWdoICovCisjZGVmaW5lIFJBV19NQVhfU0laRSAgMSAgICAgICAgIC8qIENvcnJlY3QgZnJhbWluZyBpcyByZXF1aXJlZCAqLworCisjZGVmaW5lIEFEVFNfSEVBREVSU19MRU5HVEggN1VMIC8qIFRvdGFsIGJ5dGUtbGVuZ3RoIG9mIGZpeGVkIGFuZCB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzIHByZXBlbmRlZCBkdXJpbmcgcmF3IHRvIEFEVFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiAqLworCisjZGVmaW5lIEFBQ19GUkFNRV9EVVJBVElPTihwYXJzZSkgKEdTVF9TRUNPTkQvcGFyc2UtPmZyYW1lc19wZXJfc2VjKQorCitzdGF0aWMgY29uc3QgZ2ludCBsb2FzX3NhbXBsZV9yYXRlX3RhYmxlWzE2XSA9IHsKKyAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMjQwMDAsIDIyMDUwLAorICAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwLCA3MzUwLCAwLCAwLCAwCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBsb2FzX2NoYW5uZWxzX3RhYmxlWzE2XSA9IHsKKyAgMCwgMSwgMiwgMywgNCwgNSwgNiwgOCwKKyAgMCwgMCwgMCwgNywgOCwgMCwgOCwgMAorfTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hYWNfcGFyc2Vfc3RhcnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYWFjX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hYWNfcGFyc2Vfc2lua19zZXRjYXBzIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X2FhY19wYXJzZV9zaW5rX2dldGNhcHMgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfYWFjX3BhcnNlX2hhbmRsZV9mcmFtZSAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSwgZ2ludCAqIHNraXBzaXplKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hYWNfcGFyc2VfcHJlX3B1c2hfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUpOworc3RhdGljIGdib29sZWFuIGdzdF9hYWNfcGFyc2Vfc3JjX2V2ZW50IChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hYWNfcGFyc2VfcmVhZF9hdWRpb19zcGVjaWZpY19jb25maWcgKEdzdEFhY1BhcnNlICoKKyAgICBhYWNwYXJzZSwgR3N0Qml0UmVhZGVyICogYnIsIGdpbnQgKiBvYmplY3RfdHlwZSwgZ2ludCAqIHNhbXBsZV9yYXRlLAorICAgIGdpbnQgKiBjaGFubmVscywgZ2ludCAqIGZyYW1lX3NhbXBsZXMpOworCisKKyNkZWZpbmUgZ3N0X2FhY19wYXJzZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RBYWNQYXJzZSwgZ3N0X2FhY19wYXJzZSwgR1NUX1RZUEVfQkFTRV9QQVJTRSk7CisKKy8qKgorICogZ3N0X2FhY19wYXJzZV9jbGFzc19pbml0OgorICogQGtsYXNzOiAjR3N0QWFjUGFyc2VDbGFzcy4KKyAqCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfYWFjX3BhcnNlX2NsYXNzX2luaXQgKEdzdEFhY1BhcnNlQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QmFzZVBhcnNlQ2xhc3MgKnBhcnNlX2NsYXNzID0gR1NUX0JBU0VfUEFSU0VfQ0xBU1MgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoYWFjcGFyc2VfZGVidWcsICJhYWNwYXJzZSIsIDAsCisgICAgICAiQUFDIGF1ZGlvIHN0cmVhbSBwYXJzZXIiKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywKKyAgICAgICJBQUMgYXVkaW8gc3RyZWFtIHBhcnNlciIsICJDb2RlYy9QYXJzZXIvQXVkaW8iLAorICAgICAgIkFkdmFuY2VkIEF1ZGlvIENvZGluZyBwYXJzZXIiLCAiU3RlZmFuIEtvc3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4iKTsKKworICBwYXJzZV9jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FhY19wYXJzZV9zdGFydCk7CisgIHBhcnNlX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hYWNfcGFyc2Vfc3RvcCk7CisgIHBhcnNlX2NsYXNzLT5zZXRfc2lua19jYXBzID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hYWNfcGFyc2Vfc2lua19zZXRjYXBzKTsKKyAgcGFyc2VfY2xhc3MtPmdldF9zaW5rX2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FhY19wYXJzZV9zaW5rX2dldGNhcHMpOworICBwYXJzZV9jbGFzcy0+aGFuZGxlX2ZyYW1lID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hYWNfcGFyc2VfaGFuZGxlX2ZyYW1lKTsKKyAgcGFyc2VfY2xhc3MtPnByZV9wdXNoX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWFjX3BhcnNlX3ByZV9wdXNoX2ZyYW1lKTsKKyAgcGFyc2VfY2xhc3MtPnNyY19ldmVudCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWFjX3BhcnNlX3NyY19ldmVudCk7Cit9CisKKworLyoqCisgKiBnc3RfYWFjX3BhcnNlX2luaXQ6CisgKiBAYWFjcGFyc2U6ICNHc3RBYWNQYXJzZS4KKyAqIEBrbGFzczogI0dzdEFhY1BhcnNlQ2xhc3MuCisgKgorICovCitzdGF0aWMgdm9pZAorZ3N0X2FhY19wYXJzZV9pbml0IChHc3RBYWNQYXJzZSAqIGFhY3BhcnNlKQoreworICBHU1RfREVCVUcgKCJpbml0aWFsaXplZCIpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfSU5URVJTRUNUIChHU1RfQkFTRV9QQVJTRV9TSU5LX1BBRCAoYWFjcGFyc2UpKTsKKyAgR1NUX1BBRF9TRVRfQUNDRVBUX1RFTVBMQVRFIChHU1RfQkFTRV9QQVJTRV9TSU5LX1BBRCAoYWFjcGFyc2UpKTsKKworICBhYWNwYXJzZS0+bGFzdF9wYXJzZWRfc2FtcGxlX3JhdGUgPSAwOworICBhYWNwYXJzZS0+bGFzdF9wYXJzZWRfY2hhbm5lbHMgPSAwOworfQorCisKKy8qKgorICogZ3N0X2FhY19wYXJzZV9zZXRfc3JjX2NhcHM6CisgKiBAYWFjcGFyc2U6ICNHc3RBYWNQYXJzZS4KKyAqIEBzaW5rX2NhcHM6IChwcm9wb3NlZCkgY2FwcyBvZiBzaW5rIHBhZAorICoKKyAqIFNldCBzb3VyY2UgcGFkIGNhcHMgYWNjb3JkaW5nIHRvIGN1cnJlbnQga25vd2xlZGdlIGFib3V0IHRoZQorICogYXVkaW8gc3RyZWFtLgorICoKKyAqIFJldHVybnM6IFRSVUUgaWYgY2FwcyB3ZXJlIHN1Y2Nlc3NmdWxseSBzZXQuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FhY19wYXJzZV9zZXRfc3JjX2NhcHMgKEdzdEFhY1BhcnNlICogYWFjcGFyc2UsIEdzdENhcHMgKiBzaW5rX2NhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgR3N0Q2FwcyAqc3JjX2NhcHMgPSBOVUxMLCAqYWxsb3dlZDsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisgIGNvbnN0IGdjaGFyICpzdHJlYW1fZm9ybWF0OworICBndWludDggY29kZWNfZGF0YVsyXTsKKyAgZ3VpbnQxNiBjb2RlY19kYXRhX2RhdGE7CisgIGdpbnQgc2FtcGxlX3JhdGVfaWR4OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGFhY3BhcnNlLCAic2luayBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgc2lua19jYXBzKTsKKyAgaWYgKHNpbmtfY2FwcykKKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX2NvcHkgKHNpbmtfY2Fwcyk7CisgIGVsc2UKKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby9tcGVnIik7CisKKyAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoc3JjX2NhcHMsICJmcmFtZWQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwKKyAgICAgICJtcGVndmVyc2lvbiIsIEdfVFlQRV9JTlQsIGFhY3BhcnNlLT5tcGVndmVyc2lvbiwgTlVMTCk7CisKKyAgYWFjcGFyc2UtPm91dHB1dF9oZWFkZXJfdHlwZSA9IGFhY3BhcnNlLT5oZWFkZXJfdHlwZTsKKyAgc3dpdGNoIChhYWNwYXJzZS0+aGVhZGVyX3R5cGUpIHsKKyAgICBjYXNlIERTUEFBQ19IRUFERVJfTk9ORToKKyAgICAgIHN0cmVhbV9mb3JtYXQgPSAicmF3IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFNQQUFDX0hFQURFUl9BRFRTOgorICAgICAgc3RyZWFtX2Zvcm1hdCA9ICJhZHRzIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFNQQUFDX0hFQURFUl9BRElGOgorICAgICAgc3RyZWFtX2Zvcm1hdCA9ICJhZGlmIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFNQQUFDX0hFQURFUl9MT0FTOgorICAgICAgc3RyZWFtX2Zvcm1hdCA9ICJsb2FzIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzdHJlYW1fZm9ybWF0ID0gTlVMTDsKKyAgfQorCisgIC8qIEdlbmVyYXRlIGNvZGVjIGRhdGEgdG8gYmUgYWJsZSB0byBzZXQgcHJvZmlsZS9sZXZlbCBvbiB0aGUgY2FwcyAqLworICBzYW1wbGVfcmF0ZV9pZHggPQorICAgICAgZ3N0X2NvZGVjX3V0aWxzX2FhY19nZXRfaW5kZXhfZnJvbV9zYW1wbGVfcmF0ZSAoYWFjcGFyc2UtPnNhbXBsZV9yYXRlKTsKKyAgaWYgKHNhbXBsZV9yYXRlX2lkeCA8IDApCisgICAgZ290byBub3RfYV9rbm93bl9yYXRlOworICBjb2RlY19kYXRhX2RhdGEgPQorICAgICAgKGFhY3BhcnNlLT5vYmplY3RfdHlwZSA8PCAxMSkgfAorICAgICAgKHNhbXBsZV9yYXRlX2lkeCA8PCA3KSB8IChhYWNwYXJzZS0+Y2hhbm5lbHMgPDwgMyk7CisgIEdTVF9XUklURV9VSU5UMTZfQkUgKGNvZGVjX2RhdGEsIGNvZGVjX2RhdGFfZGF0YSk7CisgIGdzdF9jb2RlY191dGlsc19hYWNfY2Fwc19zZXRfbGV2ZWxfYW5kX3Byb2ZpbGUgKHNyY19jYXBzLCBjb2RlY19kYXRhLCAyKTsKKworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoc3JjX2NhcHMsIDApOworICBpZiAoYWFjcGFyc2UtPnNhbXBsZV9yYXRlID4gMCkKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgInJhdGUiLCBHX1RZUEVfSU5ULCBhYWNwYXJzZS0+c2FtcGxlX3JhdGUsIE5VTEwpOworICBpZiAoYWFjcGFyc2UtPmNoYW5uZWxzID4gMCkKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgYWFjcGFyc2UtPmNoYW5uZWxzLCBOVUxMKTsKKyAgaWYgKHN0cmVhbV9mb3JtYXQpCisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgc3RyZWFtX2Zvcm1hdCwgTlVMTCk7CisKKyAgYWxsb3dlZCA9IGdzdF9wYWRfZ2V0X2FsbG93ZWRfY2FwcyAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKS0+c3JjcGFkKTsKKyAgaWYgKGFsbG93ZWQgJiYgIWdzdF9jYXBzX2Nhbl9pbnRlcnNlY3QgKHNyY19jYXBzLCBhbGxvd2VkKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKEdTVF9CQVNFX1BBUlNFIChhYWNwYXJzZSktPnNyY3BhZCwKKyAgICAgICAgIkNhcHMgY2FuIG5vdCBpbnRlcnNlY3QiKTsKKyAgICBpZiAoYWFjcGFyc2UtPmhlYWRlcl90eXBlID09IERTUEFBQ19IRUFERVJfQURUUykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKS0+c3JjcGFkLAorICAgICAgICAgICJJbnB1dCBpcyBBRFRTLCB0cnlpbmcgcmF3Iik7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChzcmNfY2FwcywgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAicmF3IiwKKyAgICAgICAgICBOVUxMKTsKKyAgICAgIGlmIChnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChzcmNfY2FwcywgYWxsb3dlZCkpIHsKKyAgICAgICAgR3N0QnVmZmVyICpjb2RlY19kYXRhX2J1ZmZlcjsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChHU1RfQkFTRV9QQVJTRSAoYWFjcGFyc2UpLT5zcmNwYWQsCisgICAgICAgICAgICAiQ2FwcyBjYW4gaW50ZXJzZWN0LCB3ZSB3aWxsIGRyb3AgdGhlIEFEVFMgbGF5ZXIiKTsKKyAgICAgICAgYWFjcGFyc2UtPm91dHB1dF9oZWFkZXJfdHlwZSA9IERTUEFBQ19IRUFERVJfTk9ORTsKKworICAgICAgICAvKiBUaGUgY29kZWNfZGF0YSBkYXRhIGlzIGFjY29yZGluZyB0byBBdWRpb1NwZWNpZmljQ29uZmlnLAorICAgICAgICAgICBJU08vSUVDIDE0NDk2LTMsIDEuNi4yLjEgKi8KKyAgICAgICAgY29kZWNfZGF0YV9idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDIpOworICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGNvZGVjX2RhdGFfYnVmZmVyLCAwLCBjb2RlY19kYXRhLCAyKTsKKyAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoc3JjX2NhcHMsICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLAorICAgICAgICAgICAgY29kZWNfZGF0YV9idWZmZXIsIE5VTEwpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoYWFjcGFyc2UtPmhlYWRlcl90eXBlID09IERTUEFBQ19IRUFERVJfTk9ORSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKS0+c3JjcGFkLAorICAgICAgICAgICJJbnB1dCBpcyByYXcsIHRyeWluZyBBRFRTIik7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChzcmNfY2FwcywgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiYWR0cyIsCisgICAgICAgICAgTlVMTCk7CisgICAgICBpZiAoZ3N0X2NhcHNfY2FuX2ludGVyc2VjdCAoc3JjX2NhcHMsIGFsbG93ZWQpKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKEdTVF9CQVNFX1BBUlNFIChhYWNwYXJzZSktPnNyY3BhZCwKKyAgICAgICAgICAgICJDYXBzIGNhbiBpbnRlcnNlY3QsIHdlIHdpbGwgcHJlcGVuZCBBRFRTIGhlYWRlcnMiKTsKKyAgICAgICAgYWFjcGFyc2UtPm91dHB1dF9oZWFkZXJfdHlwZSA9IERTUEFBQ19IRUFERVJfQURUUzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGFsbG93ZWQpCisgICAgZ3N0X2NhcHNfdW5yZWYgKGFsbG93ZWQpOworCisgIGFhY3BhcnNlLT5sYXN0X3BhcnNlZF9jaGFubmVscyA9IDA7CisgIGFhY3BhcnNlLT5sYXN0X3BhcnNlZF9zYW1wbGVfcmF0ZSA9IDA7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYWFjcGFyc2UsICJzZXR0aW5nIHNyYyBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgc3JjX2NhcHMpOworCisgIHJlcyA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9CQVNFX1BBUlNFIChhYWNwYXJzZSktPnNyY3BhZCwgc3JjX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjX2NhcHMpOworICByZXR1cm4gcmVzOworCitub3RfYV9rbm93bl9yYXRlOgorICBHU1RfRVJST1JfT0JKRUNUIChhYWNwYXJzZSwgIk5vdCBhIGtub3duIHNhbXBsZSByYXRlOiAlZCIsCisgICAgICBhYWNwYXJzZS0+c2FtcGxlX3JhdGUpOworICBnc3RfY2Fwc191bnJlZiAoc3JjX2NhcHMpOworICByZXR1cm4gRkFMU0U7Cit9CisKKworLyoqCisgKiBnc3RfYWFjX3BhcnNlX3Npbmtfc2V0Y2FwczoKKyAqIEBzaW5rcGFkOiBHc3RQYWQKKyAqIEBjYXBzOiBHc3RDYXBzCisgKgorICogSW1wbGVtZW50YXRpb24gb2YgInNldF9zaW5rX2NhcHMiIHZtZXRob2QgaW4gI0dzdEJhc2VQYXJzZSBjbGFzcy4KKyAqCisgKiBSZXR1cm5zOiBUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FhY19wYXJzZV9zaW5rX3NldGNhcHMgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0QWFjUGFyc2UgKmFhY3BhcnNlOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2NoYXIgKmNhcHNfc3RyOworICBjb25zdCBHVmFsdWUgKnZhbHVlOworCisgIGFhY3BhcnNlID0gR1NUX0FBQ19QQVJTRSAocGFyc2UpOworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgY2Fwc19zdHIgPSBnc3RfY2Fwc190b19zdHJpbmcgKGNhcHMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGFhY3BhcnNlLCAic2V0Y2FwczogJXMiLCBjYXBzX3N0cik7CisgIGdfZnJlZSAoY2Fwc19zdHIpOworCisgIC8qIFRoaXMgaXMgbmVlZGVkIGF0IGxlYXN0IGluIGNhc2Ugb2YgUlRQCisgICAqIFBhcnNlcyB0aGUgY29kZWNfZGF0YSBpbmZvcm1hdGlvbiB0byBnZXQgT2JqZWN0VHlwZSwKKyAgICogbnVtYmVyIG9mIGNoYW5uZWxzIGFuZCBzYW1wbGVyYXRlICovCisgIHZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImNvZGVjX2RhdGEiKTsKKyAgaWYgKHZhbHVlKSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBnc3RfdmFsdWVfZ2V0X2J1ZmZlciAodmFsdWUpOworCisgICAgaWYgKGJ1ZiAmJiBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpID49IDIpIHsKKyAgICAgIEdzdE1hcEluZm8gbWFwOworICAgICAgR3N0Qml0UmVhZGVyIGJyOworCisgICAgICBpZiAoIWdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGdzdF9iaXRfcmVhZGVyX2luaXQgKCZiciwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICAgIGdzdF9hYWNfcGFyc2VfcmVhZF9hdWRpb19zcGVjaWZpY19jb25maWcgKGFhY3BhcnNlLCAmYnIsCisgICAgICAgICAgJmFhY3BhcnNlLT5vYmplY3RfdHlwZSwgJmFhY3BhcnNlLT5zYW1wbGVfcmF0ZSwgJmFhY3BhcnNlLT5jaGFubmVscywKKyAgICAgICAgICAmYWFjcGFyc2UtPmZyYW1lX3NhbXBsZXMpOworCisgICAgICBhYWNwYXJzZS0+aGVhZGVyX3R5cGUgPSBEU1BBQUNfSEVBREVSX05PTkU7CisgICAgICBhYWNwYXJzZS0+bXBlZ3ZlcnNpb24gPSA0OworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICAgICAgR1NUX0RFQlVHICgiY29kZWNfZGF0YTogb2JqZWN0X3R5cGU9JWQsIHNhbXBsZV9yYXRlPSVkLCBjaGFubmVscz0lZCwgIgorICAgICAgICAgICJzYW1wbGVzPSVkIiwgYWFjcGFyc2UtPm9iamVjdF90eXBlLCBhYWNwYXJzZS0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgYWFjcGFyc2UtPmNoYW5uZWxzLCBhYWNwYXJzZS0+ZnJhbWVfc2FtcGxlcyk7CisKKyAgICAgIC8qIGFycmFuZ2UgZm9yIG1ldGFkYXRhIGFuZCBnZXQgb3V0IG9mIHRoZSB3YXkgKi8KKyAgICAgIGdzdF9hYWNfcGFyc2Vfc2V0X3NyY19jYXBzIChhYWNwYXJzZSwgY2Fwcyk7CisgICAgICBpZiAoYWFjcGFyc2UtPmhlYWRlcl90eXBlID09IGFhY3BhcnNlLT5vdXRwdXRfaGVhZGVyX3R5cGUpCisgICAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9wYXNzdGhyb3VnaCAocGFyc2UsIFRSVUUpOworCisgICAgICAvKiBpbnB1dCBpcyBhbHJlYWR5IGNvcnJlY3RseSBmcmFtZWQgKi8KKyAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAocGFyc2UsIFJBV19NQVhfU0laRSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBjYXBzIGluZm8gb3ZlcnJpZGVzICovCisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJyYXRlIiwgJmFhY3BhcnNlLT5zYW1wbGVfcmF0ZSk7CisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsICZhYWNwYXJzZS0+Y2hhbm5lbHMpOworICB9IGVsc2UgeworICAgIGNvbnN0IGdjaGFyICpzdHJlYW1fZm9ybWF0ID0KKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJzdHJlYW0tZm9ybWF0Iik7CisKKyAgICBpZiAoZ19zdHJjbXAwIChzdHJlYW1fZm9ybWF0LCAicmF3IikgPT0gMCkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAocGFyc2UsICJOZWVkIGNvZGVjX2RhdGEgZm9yIHJhdyBBQUMiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgYWFjcGFyc2UtPnNhbXBsZV9yYXRlID0gMDsKKyAgICAgIGFhY3BhcnNlLT5jaGFubmVscyA9IDA7CisgICAgICBhYWNwYXJzZS0+aGVhZGVyX3R5cGUgPSBEU1BBQUNfSEVBREVSX05PVF9QQVJTRUQ7CisgICAgICBnc3RfYmFzZV9wYXJzZV9zZXRfcGFzc3Rocm91Z2ggKHBhcnNlLCBGQUxTRSk7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCisKKy8qKgorICogZ3N0X2FhY19wYXJzZV9hZHRzX2dldF9mcmFtZV9sZW46CisgKiBAZGF0YTogYmxvY2sgb2YgZGF0YSBjb250YWluaW5nIGFuIEFEVFMgaGVhZGVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBBRFRTIGZyYW1lIGxlbmd0aCBmcm9tIHRoZSBnaXZlbiBoZWFkZXIuCisgKgorICogUmV0dXJuczogc2l6ZSBvZiB0aGUgQURUUyBmcmFtZS4KKyAqLworc3RhdGljIGlubGluZSBndWludAorZ3N0X2FhY19wYXJzZV9hZHRzX2dldF9mcmFtZV9sZW4gKGNvbnN0IGd1aW50OCAqIGRhdGEpCit7CisgIHJldHVybiAoKGRhdGFbM10gJiAweDAzKSA8PCAxMSkgfCAoZGF0YVs0XSA8PCAzKSB8ICgoZGF0YVs1XSAmIDB4ZTApID4+IDUpOworfQorCisKKy8qKgorICogZ3N0X2FhY19wYXJzZV9jaGVja19hZHRzX2ZyYW1lOgorICogQGFhY3BhcnNlOiAjR3N0QWFjUGFyc2UuCisgKiBAZGF0YTogRGF0YSB0byBiZSBjaGVja2VkLgorICogQGF2YWlsOiBBbW91bnQgb2YgZGF0YSBwYXNzZWQuCisgKiBAZnJhbWVzaXplOiBJZiB2YWxpZCBBRFRTIGZyYW1lIHdhcyBmb3VuZCwgdGhpcyB3aWxsIGJlIHNldCB0byB0ZWxsIHRoZQorICogICAgICAgICAgICAgZm91bmQgZnJhbWUgc2l6ZSBpbiBieXRlcy4KKyAqIEBuZWVkZWRfZGF0YTogSWYgZnJhbWUgd2FzIG5vdCBmb3VuZCwgdGhpcyBtYXkgYmUgc2V0IHRvIHRlbGwgaG93IG11Y2gKKyAqICAgICAgICAgICAgICAgbW9yZSBkYXRhIGlzIG5lZWRlZCBpbiB0aGUgbmV4dCByb3VuZCB0byBkZXRlY3QgdGhlIGZyYW1lCisgKiAgICAgICAgICAgICAgIHJlbGlhYmx5LiBUaGlzIG1heSBoYXBwZW4gd2hlbiBhIGZyYW1lIGhlYWRlciBjYW5kaWRhdGUKKyAqICAgICAgICAgICAgICAgaXMgZm91bmQgYnV0IGl0IGNhbm5vdCBiZSBndWFyYW50ZWVkIHRvIGJlIHRoZSBoZWFkZXIgd2l0aG91dAorICogICAgICAgICAgICAgICBwZWVraW5nIHRoZSBmb2xsb3dpbmcgZGF0YS4KKyAqCisgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZGF0YSBjb250YWlucyBjb250YWlucyBBRFRTIGZyYW1lLiBUaGUgYWxnb3JpdGhtCisgKiB3aWxsIGV4YW1pbmUgQURUUyBmcmFtZSBoZWFkZXIgYW5kIGNhbGN1bGF0ZSB0aGUgZnJhbWUgc2l6ZS4gQWxzbywgYW5vdGhlcgorICogY29uc2VjdXRpdmUgQURUUyBmcmFtZSBoZWFkZXIgbmVlZCB0byBiZSBwcmVzZW50IGFmdGVyIHRoZSBmb3VuZCBmcmFtZS4KKyAqIE90aGVyd2lzZSB0aGUgZGF0YSBpcyBub3QgY29uc2lkZXJlZCBhcyBhIHZhbGlkIEFEVFMgZnJhbWUuIEhvd2V2ZXIsIHRoaXMKKyAqICJleHRyYSBjaGVjayIgaXMgb21pdHRlZCB3aGVuIEVPUyBoYXMgYmVlbiByZWNlaXZlZC4gSW4gdGhpcyBjYXNlIGl0IGlzCisgKiBlbm91Z2ggd2hlbiBkYXRhWzBdIGNvbnRhaW5zIGEgdmFsaWQgQURUUyBoZWFkZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgc2V0IHRoZSAjbmVlZGVkX2RhdGEgdG8gaW5kaWNhdGUgdGhhdCBhIHBvc3NpYmxlIGZyYW1lCisgKiBjYW5kaWRhdGUgaGFzIGJlZW4gZm91bmQsIGJ1dCBtb3JlIGRhdGEgKCNuZWVkZWRfZGF0YSBieXRlcykgaXMgbmVlZGVkIHRvCisgKiBiZSBhYnNvbHV0ZWx5IHN1cmUuIFdoZW4gdGhpcyBzaXR1YXRpb24gb2NjdXJzLCBGQUxTRSB3aWxsIGJlIHJldHVybmVkLgorICoKKyAqIFdoZW4gYSB2YWxpZCBmcmFtZSBpcyBkZXRlY3RlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHVzZQorICogZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplKCkgZnVuY3Rpb24gZnJvbSAjR3N0QmFzZVBhcnNlIGNsYXNzCisgKiB0byBzZXQgdGhlIG5lZWRlZCBieXRlcyBmb3IgbmV4dCBmcmFtZS5UaGlzIHdheSBuZXh0IGRhdGEgY2h1bmsgaXMgYWxyZWFkeQorICogb2YgY29ycmVjdCBzaXplLgorICoKKyAqIFJldHVybnM6IFRSVUUgaWYgdGhlIGdpdmVuIGRhdGEgY29udGFpbnMgYSB2YWxpZCBBRFRTIGhlYWRlci4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYWFjX3BhcnNlX2NoZWNrX2FkdHNfZnJhbWUgKEdzdEFhY1BhcnNlICogYWFjcGFyc2UsCisgICAgY29uc3QgZ3VpbnQ4ICogZGF0YSwgY29uc3QgZ3VpbnQgYXZhaWwsIGdib29sZWFuIGRyYWluLAorICAgIGd1aW50ICogZnJhbWVzaXplLCBndWludCAqIG5lZWRlZF9kYXRhKQoreworICBndWludCBjcmNfc2l6ZTsKKworICAqbmVlZGVkX2RhdGEgPSAwOworCisgIC8qIEFic29sdXRlIG1pbmltdW0gdG8gcGVyZm9ybSB0aGUgQURUUyBzeW5jd29yZCwKKyAgICAgbGF5ZXIgYW5kIHNhbXBsaW5nIGZyZXF1ZW5jeSB0ZXN0cyAqLworICBpZiAoR19VTkxJS0VMWSAoYXZhaWwgPCAzKSkgeworICAgICpuZWVkZWRfZGF0YSA9IDM7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogU3luY3dvcmQgYW5kIGxheWVyIHRlc3RzICovCisgIGlmICgoZGF0YVswXSA9PSAweGZmKSAmJiAoKGRhdGFbMV0gJiAweGY2KSA9PSAweGYwKSkgeworCisgICAgLyogU2FtcGxpbmcgZnJlcXVlbmN5IHRlc3QgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAoKGRhdGFbMl0gJiAweDNDKSA+PiAyID09IDE1KSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8qIFRoaXMgbG9va3MgbGlrZSBhbiBBRFRTIGZyYW1lIGhlYWRlciBidXQKKyAgICAgICB3ZSBuZWVkIGF0IGxlYXN0IDYgYnl0ZXMgdG8gcHJvY2VlZCAqLworICAgIGlmIChHX1VOTElLRUxZIChhdmFpbCA8IDYpKSB7CisgICAgICAqbmVlZGVkX2RhdGEgPSA2OworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgICpmcmFtZXNpemUgPSBnc3RfYWFjX3BhcnNlX2FkdHNfZ2V0X2ZyYW1lX2xlbiAoZGF0YSk7CisKKyAgICAvKiBJZiBmcmFtZSBoYXMgQ1JDLCBpdCBuZWVkcyAyIGJ5dGVzCisgICAgICAgZm9yIGl0IGF0IHRoZSBlbmQgb2YgdGhlIGhlYWRlciAqLworICAgIGNyY19zaXplID0gKGRhdGFbMV0gJiAweDAxKSA/IDAgOiAyOworCisgICAgLyogQ1JDIHNpemUgdGVzdCAqLworICAgIGlmICgqZnJhbWVzaXplIDwgNyArIGNyY19zaXplKSB7CisgICAgICAqbmVlZGVkX2RhdGEgPSA3ICsgY3JjX3NpemU7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLyogSW4gRU9TIG1vZGUgdGhpcyBpcyBlbm91Z2guIE5vIG5lZWQgdG8gZXhhbWluZSB0aGUgZGF0YSBmdXJ0aGVyLgorICAgICAgIFdlIGFsc28gcmVsYXggdGhlIGNoZWNrIHdoZW4gd2UgaGF2ZSBzeW5jLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0CisgICAgICAgaWYgd2UncmUgbm90IGxvb2tpbmcgYXQgcmFuZG9tIGRhdGEsIHdlIGhhdmUgYSBtdWNoIGhpZ2hlciBjaGFuY2UKKyAgICAgICB0byBnZXQgdGhlIGNvcnJlY3Qgc3luYywgYW5kIHRoaXMgYXZvaWRzIGxvc2luZyB0d28gZnJhbWVzIHdoZW4KKyAgICAgICBhIHNpbmdsZSBiaXQgY29ycnVwdGlvbiBoYXBwZW5zLiAqLworICAgIGlmIChkcmFpbiB8fCAhR1NUX0JBU0VfUEFSU0VfTE9TVF9TWU5DIChhYWNwYXJzZSkpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIGlmICgqZnJhbWVzaXplICsgQURUU19NQVhfU0laRSA+IGF2YWlsKSB7CisgICAgICAvKiBXZSBoYXZlIGZvdW5kIGEgcG9zc2libGUgZnJhbWUgaGVhZGVyIGNhbmRpZGF0ZSwgYnV0IGNhbid0IGJlCisgICAgICAgICBzdXJlIHNpbmNlIHdlIGRvbid0IGhhdmUgZW5vdWdoIGRhdGEgdG8gY2hlY2sgdGhlIG5leHQgZnJhbWUgKi8KKyAgICAgIEdTVF9ERUJVRyAoIk5FRUQgTU9SRSBEQVRBOiB3ZSBuZWVkICVkLCBhdmFpbGFibGUgJWQiLAorICAgICAgICAgICpmcmFtZXNpemUgKyBBRFRTX01BWF9TSVpFLCBhdmFpbCk7CisgICAgICAqbmVlZGVkX2RhdGEgPSAqZnJhbWVzaXplICsgQURUU19NQVhfU0laRTsKKyAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwKKyAgICAgICAgICAqZnJhbWVzaXplICsgQURUU19NQVhfU0laRSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChkYXRhWypmcmFtZXNpemVdID09IDB4ZmYpICYmICgoZGF0YVsqZnJhbWVzaXplICsgMV0gJiAweGY2KSA9PSAweGYwKSkgeworICAgICAgZ3VpbnQgbmV4dGxlbiA9IGdzdF9hYWNfcGFyc2VfYWR0c19nZXRfZnJhbWVfbGVuIChkYXRhICsgKCpmcmFtZXNpemUpKTsKKworICAgICAgR1NUX0xPRyAoIkFEVFMgZnJhbWUgZm91bmQsIGxlbjogJWQgYnl0ZXMiLCAqZnJhbWVzaXplKTsKKyAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwKKyAgICAgICAgICBuZXh0bGVuICsgQURUU19NQVhfU0laRSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYWNfcGFyc2VfbGF0bV9nZXRfdmFsdWUgKEdzdEFhY1BhcnNlICogYWFjcGFyc2UsIEdzdEJpdFJlYWRlciAqIGJyLAorICAgIGd1aW50MzIgKiB2YWx1ZSkKK3sKKyAgZ3VpbnQ4IGJ5dGVzLCBpLCBieXRlOworCisgICp2YWx1ZSA9IDA7CisgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKGJyLCAmYnl0ZXMsIDIpKQorICAgIHJldHVybiBGQUxTRTsKKyAgZm9yIChpID0gMDsgaSA8PSBieXRlczsgKytpKSB7CisgICAgKnZhbHVlIDw8PSA4OworICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKGJyLCAmYnl0ZSwgOCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgKnZhbHVlICs9IGJ5dGU7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FhY19wYXJzZV9nZXRfYXVkaW9fb2JqZWN0X3R5cGUgKEdzdEFhY1BhcnNlICogYWFjcGFyc2UsIEdzdEJpdFJlYWRlciAqIGJyLAorICAgIGd1aW50OCAqIGF1ZGlvX29iamVjdF90eXBlKQoreworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4IChiciwgYXVkaW9fb2JqZWN0X3R5cGUsIDUpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKCphdWRpb19vYmplY3RfdHlwZSA9PSAzMSkgeworICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKGJyLCBhdWRpb19vYmplY3RfdHlwZSwgNikpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgKmF1ZGlvX29iamVjdF90eXBlICs9IDMyOworICB9CisgIEdTVF9MT0dfT0JKRUNUIChhYWNwYXJzZSwgImF1ZGlvIG9iamVjdCB0eXBlICV1IiwgKmF1ZGlvX29iamVjdF90eXBlKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FhY19wYXJzZV9nZXRfYXVkaW9fc2FtcGxlX3JhdGUgKEdzdEFhY1BhcnNlICogYWFjcGFyc2UsIEdzdEJpdFJlYWRlciAqIGJyLAorICAgIGdpbnQgKiBzYW1wbGVfcmF0ZSkKK3sKKyAgZ3VpbnQ4IHNhbXBsaW5nX2ZyZXF1ZW5jeV9pbmRleDsKKyAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoYnIsICZzYW1wbGluZ19mcmVxdWVuY3lfaW5kZXgsIDQpKQorICAgIHJldHVybiBGQUxTRTsKKyAgR1NUX0xPR19PQkpFQ1QgKGFhY3BhcnNlLCAic2FtcGxpbmdfZnJlcXVlbmN5X2luZGV4OiAldSIsCisgICAgICBzYW1wbGluZ19mcmVxdWVuY3lfaW5kZXgpOworICBpZiAoc2FtcGxpbmdfZnJlcXVlbmN5X2luZGV4ID09IDB4ZikgeworICAgIGd1aW50MzIgc2FtcGxpbmdfcmF0ZTsKKyAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQzMiAoYnIsICZzYW1wbGluZ19yYXRlLCAyNCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgKnNhbXBsZV9yYXRlID0gc2FtcGxpbmdfcmF0ZTsKKyAgfSBlbHNlIHsKKyAgICAqc2FtcGxlX3JhdGUgPSBsb2FzX3NhbXBsZV9yYXRlX3RhYmxlW3NhbXBsaW5nX2ZyZXF1ZW5jeV9pbmRleF07CisgICAgaWYgKCEqc2FtcGxlX3JhdGUpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgYWFjcGFyc2UtPmxhc3RfcGFyc2VkX3NhbXBsZV9yYXRlID0gKnNhbXBsZV9yYXRlOworICByZXR1cm4gVFJVRTsKK30KKworLyogU2VlIHRhYmxlIDEuMTMgaW4gSVNPL0lFQyAxNDQ5Ni0zICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYWNfcGFyc2VfcmVhZF9hdWRpb19zcGVjaWZpY19jb25maWcgKEdzdEFhY1BhcnNlICogYWFjcGFyc2UsCisgICAgR3N0Qml0UmVhZGVyICogYnIsIGdpbnQgKiBvYmplY3RfdHlwZSwgZ2ludCAqIHNhbXBsZV9yYXRlLCBnaW50ICogY2hhbm5lbHMsCisgICAgZ2ludCAqIGZyYW1lX3NhbXBsZXMpCit7CisgIGd1aW50OCBhdWRpb19vYmplY3RfdHlwZTsKKyAgZ3VpbnQ4IEdfR05VQ19VTlVTRUQgZXh0ZW5zaW9uX2F1ZGlvX29iamVjdF90eXBlOworICBndWludDggY2hhbm5lbF9jb25maWd1cmF0aW9uLCBleHRlbnNpb25fY2hhbm5lbF9jb25maWd1cmF0aW9uOworICBnYm9vbGVhbiBHX0dOVUNfVU5VU0VEIHNiciA9IEZBTFNFLCBwcyA9IEZBTFNFOworCisgIGlmICghZ3N0X2FhY19wYXJzZV9nZXRfYXVkaW9fb2JqZWN0X3R5cGUgKGFhY3BhcnNlLCBiciwgJmF1ZGlvX29iamVjdF90eXBlKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChvYmplY3RfdHlwZSkKKyAgICAqb2JqZWN0X3R5cGUgPSBhdWRpb19vYmplY3RfdHlwZTsKKworICBpZiAoIWdzdF9hYWNfcGFyc2VfZ2V0X2F1ZGlvX3NhbXBsZV9yYXRlIChhYWNwYXJzZSwgYnIsIHNhbXBsZV9yYXRlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoYnIsICZjaGFubmVsX2NvbmZpZ3VyYXRpb24sIDQpKQorICAgIHJldHVybiBGQUxTRTsKKyAgKmNoYW5uZWxzID0gbG9hc19jaGFubmVsc190YWJsZVtjaGFubmVsX2NvbmZpZ3VyYXRpb25dOworICBHU1RfTE9HX09CSkVDVCAoYWFjcGFyc2UsICJjaGFubmVsX2NvbmZpZ3VyYXRpb246ICVkIiwgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKKyAgaWYgKCEqY2hhbm5lbHMpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChhdWRpb19vYmplY3RfdHlwZSA9PSA1IHx8IGF1ZGlvX29iamVjdF90eXBlID09IDI5KSB7CisgICAgZXh0ZW5zaW9uX2F1ZGlvX29iamVjdF90eXBlID0gNTsKKyAgICBzYnIgPSBUUlVFOworICAgIGlmIChhdWRpb19vYmplY3RfdHlwZSA9PSAyOSkgeworICAgICAgcHMgPSBUUlVFOworICAgICAgLyogUGFyYW1ldHJpYyBzdGVyZW8uIElmIHdlIGhhdmUgYSBvbmUtY2hhbm5lbCBjb25maWd1cmF0aW9uLCB3ZSBjYW4KKyAgICAgICAqIG92ZXJyaWRlIGl0IHRvIHN0ZXJlbyAqLworICAgICAgaWYgKCpjaGFubmVscyA9PSAxKQorICAgICAgICAqY2hhbm5lbHMgPSAyOworICAgIH0KKworICAgIEdTVF9MT0dfT0JKRUNUIChhYWNwYXJzZSwKKyAgICAgICAgIkF1ZGlvIG9iamVjdCB0eXBlIDUgb3IgMjksIHNvIHJlcmVhZGluZyBzYW1wbGluZyByYXRlICh3YXMgJWQpLi4uIiwKKyAgICAgICAgKnNhbXBsZV9yYXRlKTsKKyAgICBpZiAoIWdzdF9hYWNfcGFyc2VfZ2V0X2F1ZGlvX3NhbXBsZV9yYXRlIChhYWNwYXJzZSwgYnIsIHNhbXBsZV9yYXRlKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmICghZ3N0X2FhY19wYXJzZV9nZXRfYXVkaW9fb2JqZWN0X3R5cGUgKGFhY3BhcnNlLCBiciwgJmF1ZGlvX29iamVjdF90eXBlKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChhdWRpb19vYmplY3RfdHlwZSA9PSAyMikgeworICAgICAgLyogZXh0ZW5zaW9uIGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLworICAgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoYnIsICZleHRlbnNpb25fY2hhbm5lbF9jb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICA0KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGFhY3BhcnNlLCAiZXh0ZW5zaW9uIGNoYW5uZWxfY29uZmlndXJhdGlvbjogJWQiLAorICAgICAgICAgIGV4dGVuc2lvbl9jaGFubmVsX2NvbmZpZ3VyYXRpb24pOworICAgICAgKmNoYW5uZWxzID0gbG9hc19jaGFubmVsc190YWJsZVtleHRlbnNpb25fY2hhbm5lbF9jb25maWd1cmF0aW9uXTsKKyAgICAgIGlmICghKmNoYW5uZWxzKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9IGVsc2UgeworICAgIGV4dGVuc2lvbl9hdWRpb19vYmplY3RfdHlwZSA9IDA7CisgIH0KKworICBHU1RfSU5GT19PQkpFQ1QgKGFhY3BhcnNlLCAiUGFyc2VkIEF1ZGlvU3BlY2lmaWNDb25maWc6ICVkIEh6LCAlZCBjaGFubmVscyIsCisgICAgICAqc2FtcGxlX3JhdGUsICpjaGFubmVscyk7CisKKyAgaWYgKGZyYW1lX3NhbXBsZXMgJiYgYXVkaW9fb2JqZWN0X3R5cGUgPT0gMjMpIHsKKyAgICBndWludDggZnJhbWVfZmxhZzsKKyAgICAvKiBSZWFkIHRoZSBEZWNvZGVyIENvbmZpZ3VyYXRpb24gKEdBU3BlY2lmaWNDb25maWcpIGlmIHByZXNlbnQgKi8KKyAgICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGZpcnN0IGJpdCB0byBrbm93IHdoYXQgdGhlIG51bWJlciBvZiBzYW1wbGVzCisgICAgICogaW4gYSBmcmFtZSBpcyAqLworICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKGJyLCAmZnJhbWVfZmxhZywgMSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgKmZyYW1lX3NhbXBsZXMgPSBmcmFtZV9mbGFnID8gOTYwIDogMTAyNDsKKyAgfQorCisgIC8qIFRoZXJlJ3MgTE9UUyBvZiBzdHVmZiBuZXh0LCBidXQgd2UgaWdub3JlIGl0IGZvciBub3cgYXMgd2UgaGF2ZQorICAgICB3aGF0IHdlIHdhbnQgKHNhbXBsZSByYXRlIGFuZCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoYWFjcGFyc2UsCisgICAgICAiTmVlZCBtb3JlIGNvZGUgdG8gcGFyc2UgaHVtb25nb3VzIExPQVMgZGF0YSwgY3VycmVudGx5IGlnbm9yZWQiKTsKKyAgYWFjcGFyc2UtPmxhc3RfcGFyc2VkX2NoYW5uZWxzID0gKmNoYW5uZWxzOworICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYWNfcGFyc2VfcmVhZF9sb2FzX2NvbmZpZyAoR3N0QWFjUGFyc2UgKiBhYWNwYXJzZSwgY29uc3QgZ3VpbnQ4ICogZGF0YSwKKyAgICBndWludCBhdmFpbCwgZ2ludCAqIHNhbXBsZV9yYXRlLCBnaW50ICogY2hhbm5lbHMsIGdpbnQgKiB2ZXJzaW9uKQoreworICBHc3RCaXRSZWFkZXIgYnI7CisgIGd1aW50OCB1OCwgdiwgdkE7CisKKyAgLyogTm8gdmVyc2lvbiBpbiB0aGUgYml0c3RyZWFtLCBidXQgdGhlIHNwZWMgaGFzIExPQVMgaW4gdGhlIE1QRUctNCBzZWN0aW9uICovCisgIGlmICh2ZXJzaW9uKQorICAgICp2ZXJzaW9uID0gNDsKKworICBnc3RfYml0X3JlYWRlcl9pbml0ICgmYnIsIGRhdGEsIGF2YWlsKTsKKworICAvKiBza2lwIHN5bmMgd29yZCAoMTEgYml0cykgYW5kIHNpemUgKDEzIGJpdHMpICovCisgIGlmICghZ3N0X2JpdF9yZWFkZXJfc2tpcCAoJmJyLCAxMSArIDEzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogRmlyc3QgYml0IGlzICJ1c2UgbGFzdCBjb25maWciICovCisgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKCZiciwgJnU4LCAxKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICh1OCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChhYWNwYXJzZSwgIkZyYW1lIHVzZXMgcHJldmlvdXMgY29uZmlnIik7CisgICAgaWYgKCFhYWNwYXJzZS0+bGFzdF9wYXJzZWRfc2FtcGxlX3JhdGUgfHwgIWFhY3BhcnNlLT5sYXN0X3BhcnNlZF9jaGFubmVscykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYWFjcGFyc2UsCisgICAgICAgICAgIk5vIHByZXZpb3VzIGNvbmZpZyB0byB1c2UuIFdlJ2xsIGxvb2sgZm9yIG1vcmUgZGF0YS4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgKnNhbXBsZV9yYXRlID0gYWFjcGFyc2UtPmxhc3RfcGFyc2VkX3NhbXBsZV9yYXRlOworICAgICpjaGFubmVscyA9IGFhY3BhcnNlLT5sYXN0X3BhcnNlZF9jaGFubmVsczsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGFhY3BhcnNlLCAiRnJhbWUgY29udGFpbnMgbmV3IGNvbmZpZyIpOworCisgIC8qIGF1ZGlvTXV4VmVyc2lvbiAqLworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmYnIsICZ2LCAxKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICh2KSB7CisgICAgLyogYXVkaW9NdXhWZXJzaW9uQSAqLworICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKCZiciwgJnZBLCAxKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfSBlbHNlCisgICAgdkEgPSAwOworCisgIEdTVF9MT0dfT0JKRUNUIChhYWNwYXJzZSwgInYgJWQsIHZBICVkIiwgdiwgdkEpOworICBpZiAodkEgPT0gMCkgeworICAgIGd1aW50OCBzYW1lX3RpbWUsIHN1YmZyYW1lcywgbnVtX3Byb2dyYW0sIHByb2c7CisgICAgaWYgKHYgPT0gMSkgeworICAgICAgZ3VpbnQzMiB2YWx1ZTsKKyAgICAgIC8qIHRhcmFCdWZmZXJGdWxsbmVzcyAqLworICAgICAgaWYgKCFnc3RfYWFjX3BhcnNlX2xhdG1fZ2V0X3ZhbHVlIChhYWNwYXJzZSwgJmJyLCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKCZiciwgJnNhbWVfdGltZSwgMSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoJmJyLCAmc3ViZnJhbWVzLCA2KSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmYnIsICZudW1fcHJvZ3JhbSwgNCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgR1NUX0xPR19PQkpFQ1QgKGFhY3BhcnNlLCAic2FtZV90aW1lICVkLCBzdWJmcmFtZXMgJWQsIG51bV9wcm9ncmFtICVkIiwKKyAgICAgICAgc2FtZV90aW1lLCBzdWJmcmFtZXMsIG51bV9wcm9ncmFtKTsKKworICAgIGZvciAocHJvZyA9IDA7IHByb2cgPD0gbnVtX3Byb2dyYW07ICsrcHJvZykgeworICAgICAgZ3VpbnQ4IG51bV9sYXllciwgbGF5ZXI7CisgICAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmYnIsICZudW1fbGF5ZXIsIDMpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBHU1RfTE9HX09CSkVDVCAoYWFjcGFyc2UsICJQcm9ncmFtICVkOiAlZCBsYXllcnMiLCBwcm9nLCBudW1fbGF5ZXIpOworCisgICAgICBmb3IgKGxheWVyID0gMDsgbGF5ZXIgPD0gbnVtX2xheWVyOyArK2xheWVyKSB7CisgICAgICAgIGd1aW50OCB1c2Vfc2FtZV9jb25maWc7CisgICAgICAgIGlmIChwcm9nID09IDAgJiYgbGF5ZXIgPT0gMCkgeworICAgICAgICAgIHVzZV9zYW1lX2NvbmZpZyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoJmJyLCAmdXNlX3NhbWVfY29uZmlnLCAxKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXVzZV9zYW1lX2NvbmZpZykgeworICAgICAgICAgIGlmICh2ID09IDApIHsKKyAgICAgICAgICAgIGlmICghZ3N0X2FhY19wYXJzZV9yZWFkX2F1ZGlvX3NwZWNpZmljX2NvbmZpZyAoYWFjcGFyc2UsICZiciwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGUsIGNoYW5uZWxzLCBOVUxMKSkKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBndWludDMyIGFzY19sZW47CisgICAgICAgICAgICBpZiAoIWdzdF9hYWNfcGFyc2VfbGF0bV9nZXRfdmFsdWUgKGFhY3BhcnNlLCAmYnIsICZhc2NfbGVuKSkKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgaWYgKCFnc3RfYWFjX3BhcnNlX3JlYWRfYXVkaW9fc3BlY2lmaWNfY29uZmlnIChhYWNwYXJzZSwgJmJyLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZSwgY2hhbm5lbHMsIE5VTEwpKQorICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX3NraXAgKCZiciwgYXNjX2xlbikpCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgR1NUX0xPR19PQkpFQ1QgKGFhY3BhcnNlLCAiTW9yZSBkYXRhIGlnbm9yZWQiKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGFhY3BhcnNlLCAiU3BlYyBzYXlzIFwiVEJEXCIuLi4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogZ3N0X2FhY19wYXJzZV9sb2FzX2dldF9mcmFtZV9sZW46CisgKiBAZGF0YTogYmxvY2sgb2YgZGF0YSBjb250YWluaW5nIGEgTE9BUyBoZWFkZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIExPQVMgZnJhbWUgbGVuZ3RoIGZyb20gdGhlIGdpdmVuIGhlYWRlci4KKyAqCisgKiBSZXR1cm5zOiBzaXplIG9mIHRoZSBMT0FTIGZyYW1lLgorICovCitzdGF0aWMgaW5saW5lIGd1aW50Citnc3RfYWFjX3BhcnNlX2xvYXNfZ2V0X2ZyYW1lX2xlbiAoY29uc3QgZ3VpbnQ4ICogZGF0YSkKK3sKKyAgcmV0dXJuICgoKGRhdGFbMV0gJiAweDFmKSA8PCA4KSB8IGRhdGFbMl0pICsgMzsKK30KKworCisvKioKKyAqIGdzdF9hYWNfcGFyc2VfY2hlY2tfbG9hc19mcmFtZToKKyAqIEBhYWNwYXJzZTogI0dzdEFhY1BhcnNlLgorICogQGRhdGE6IERhdGEgdG8gYmUgY2hlY2tlZC4KKyAqIEBhdmFpbDogQW1vdW50IG9mIGRhdGEgcGFzc2VkLgorICogQGZyYW1lc2l6ZTogSWYgdmFsaWQgTE9BUyBmcmFtZSB3YXMgZm91bmQsIHRoaXMgd2lsbCBiZSBzZXQgdG8gdGVsbCB0aGUKKyAqICAgICAgICAgICAgIGZvdW5kIGZyYW1lIHNpemUgaW4gYnl0ZXMuCisgKiBAbmVlZGVkX2RhdGE6IElmIGZyYW1lIHdhcyBub3QgZm91bmQsIHRoaXMgbWF5IGJlIHNldCB0byB0ZWxsIGhvdyBtdWNoCisgKiAgICAgICAgICAgICAgIG1vcmUgZGF0YSBpcyBuZWVkZWQgaW4gdGhlIG5leHQgcm91bmQgdG8gZGV0ZWN0IHRoZSBmcmFtZQorICogICAgICAgICAgICAgICByZWxpYWJseS4gVGhpcyBtYXkgaGFwcGVuIHdoZW4gYSBmcmFtZSBoZWFkZXIgY2FuZGlkYXRlCisgKiAgICAgICAgICAgICAgIGlzIGZvdW5kIGJ1dCBpdCBjYW5ub3QgYmUgZ3VhcmFudGVlZCB0byBiZSB0aGUgaGVhZGVyIHdpdGhvdXQKKyAqICAgICAgICAgICAgICAgcGVla2luZyB0aGUgZm9sbG93aW5nIGRhdGEuCisgKgorICogQ2hlY2sgaWYgdGhlIGdpdmVuIGRhdGEgY29udGFpbnMgY29udGFpbnMgTE9BUyBmcmFtZS4gVGhlIGFsZ29yaXRobQorICogd2lsbCBleGFtaW5lIExPQVMgZnJhbWUgaGVhZGVyIGFuZCBjYWxjdWxhdGUgdGhlIGZyYW1lIHNpemUuIEFsc28sIGFub3RoZXIKKyAqIGNvbnNlY3V0aXZlIExPQVMgZnJhbWUgaGVhZGVyIG5lZWQgdG8gYmUgcHJlc2VudCBhZnRlciB0aGUgZm91bmQgZnJhbWUuCisgKiBPdGhlcndpc2UgdGhlIGRhdGEgaXMgbm90IGNvbnNpZGVyZWQgYXMgYSB2YWxpZCBMT0FTIGZyYW1lLiBIb3dldmVyLCB0aGlzCisgKiAiZXh0cmEgY2hlY2siIGlzIG9taXR0ZWQgd2hlbiBFT1MgaGFzIGJlZW4gcmVjZWl2ZWQuIEluIHRoaXMgY2FzZSBpdCBpcworICogZW5vdWdoIHdoZW4gZGF0YVswXSBjb250YWlucyBhIHZhbGlkIExPQVMgaGVhZGVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IHNldCB0aGUgI25lZWRlZF9kYXRhIHRvIGluZGljYXRlIHRoYXQgYSBwb3NzaWJsZSBmcmFtZQorICogY2FuZGlkYXRlIGhhcyBiZWVuIGZvdW5kLCBidXQgbW9yZSBkYXRhICgjbmVlZGVkX2RhdGEgYnl0ZXMpIGlzIG5lZWRlZCB0bworICogYmUgYWJzb2x1dGVseSBzdXJlLiBXaGVuIHRoaXMgc2l0dWF0aW9uIG9jY3VycywgRkFMU0Ugd2lsbCBiZSByZXR1cm5lZC4KKyAqCisgKiBXaGVuIGEgdmFsaWQgZnJhbWUgaXMgZGV0ZWN0ZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCB1c2UKKyAqIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSgpIGZ1bmN0aW9uIGZyb20gI0dzdEJhc2VQYXJzZSBjbGFzcworICogdG8gc2V0IHRoZSBuZWVkZWQgYnl0ZXMgZm9yIG5leHQgZnJhbWUuVGhpcyB3YXkgbmV4dCBkYXRhIGNodW5rIGlzIGFscmVhZHkKKyAqIG9mIGNvcnJlY3Qgc2l6ZS4KKyAqCisgKiBMT0FTIGNhbiBoYXZlIHRocmVlIGRpZmZlcmVudCBmb3JtYXRzLCBpZiBJIHJlYWQgdGhlIHNwZWMgY29ycmVjdGx5LiBPbmx5CisgKiBvbmUgb2YgdGhlbSBpcyBzdXBwb3J0ZWQgaGVyZSwgYXMgdGhlIHR3byBzYW1wbGVzIEkgaGF2ZSB1c2UgdGhpcyBvbmUuCisgKgorICogUmV0dXJuczogVFJVRSBpZiB0aGUgZ2l2ZW4gZGF0YSBjb250YWlucyBhIHZhbGlkIExPQVMgaGVhZGVyLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYWNfcGFyc2VfY2hlY2tfbG9hc19mcmFtZSAoR3N0QWFjUGFyc2UgKiBhYWNwYXJzZSwKKyAgICBjb25zdCBndWludDggKiBkYXRhLCBjb25zdCBndWludCBhdmFpbCwgZ2Jvb2xlYW4gZHJhaW4sCisgICAgZ3VpbnQgKiBmcmFtZXNpemUsIGd1aW50ICogbmVlZGVkX2RhdGEpCit7CisgICpuZWVkZWRfZGF0YSA9IDA7CisKKyAgLyogMyBieXRlIGhlYWRlciAqLworICBpZiAoR19VTkxJS0VMWSAoYXZhaWwgPCAzKSkgeworICAgICpuZWVkZWRfZGF0YSA9IDM7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKChkYXRhWzBdID09IDB4NTYpICYmICgoZGF0YVsxXSAmIDB4ZTApID09IDB4ZTApKSB7CisgICAgKmZyYW1lc2l6ZSA9IGdzdF9hYWNfcGFyc2VfbG9hc19nZXRfZnJhbWVfbGVuIChkYXRhKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhYWNwYXJzZSwgIkZvdW5kIHBvc3NpYmxlICV1IGJ5dGUgTE9BUyBmcmFtZSIsCisgICAgICAgICpmcmFtZXNpemUpOworCisgICAgLyogSW4gRU9TIG1vZGUgdGhpcyBpcyBlbm91Z2guIE5vIG5lZWQgdG8gZXhhbWluZSB0aGUgZGF0YSBmdXJ0aGVyLgorICAgICAgIFdlIGFsc28gcmVsYXggdGhlIGNoZWNrIHdoZW4gd2UgaGF2ZSBzeW5jLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0CisgICAgICAgaWYgd2UncmUgbm90IGxvb2tpbmcgYXQgcmFuZG9tIGRhdGEsIHdlIGhhdmUgYSBtdWNoIGhpZ2hlciBjaGFuY2UKKyAgICAgICB0byBnZXQgdGhlIGNvcnJlY3Qgc3luYywgYW5kIHRoaXMgYXZvaWRzIGxvc2luZyB0d28gZnJhbWVzIHdoZW4KKyAgICAgICBhIHNpbmdsZSBiaXQgY29ycnVwdGlvbiBoYXBwZW5zLiAqLworICAgIGlmIChkcmFpbiB8fCAhR1NUX0JBU0VfUEFSU0VfTE9TVF9TWU5DIChhYWNwYXJzZSkpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIGlmICgqZnJhbWVzaXplICsgTE9BU19NQVhfU0laRSA+IGF2YWlsKSB7CisgICAgICAvKiBXZSBoYXZlIGZvdW5kIGEgcG9zc2libGUgZnJhbWUgaGVhZGVyIGNhbmRpZGF0ZSwgYnV0IGNhbid0IGJlCisgICAgICAgICBzdXJlIHNpbmNlIHdlIGRvbid0IGhhdmUgZW5vdWdoIGRhdGEgdG8gY2hlY2sgdGhlIG5leHQgZnJhbWUgKi8KKyAgICAgIEdTVF9ERUJVRyAoIk5FRUQgTU9SRSBEQVRBOiB3ZSBuZWVkICVkLCBhdmFpbGFibGUgJWQiLAorICAgICAgICAgICpmcmFtZXNpemUgKyBMT0FTX01BWF9TSVpFLCBhdmFpbCk7CisgICAgICAqbmVlZGVkX2RhdGEgPSAqZnJhbWVzaXplICsgTE9BU19NQVhfU0laRTsKKyAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwKKyAgICAgICAgICAqZnJhbWVzaXplICsgTE9BU19NQVhfU0laRSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChkYXRhWypmcmFtZXNpemVdID09IDB4NTYpICYmICgoZGF0YVsqZnJhbWVzaXplICsgMV0gJiAweGUwKSA9PSAweGUwKSkgeworICAgICAgZ3VpbnQgbmV4dGxlbiA9IGdzdF9hYWNfcGFyc2VfbG9hc19nZXRfZnJhbWVfbGVuIChkYXRhICsgKCpmcmFtZXNpemUpKTsKKworICAgICAgR1NUX0xPRyAoIkxPQVMgZnJhbWUgZm91bmQsIGxlbjogJWQgYnl0ZXMiLCAqZnJhbWVzaXplKTsKKyAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwKKyAgICAgICAgICBuZXh0bGVuICsgTE9BU19NQVhfU0laRSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYWFjcGFyc2UsICJUaGF0IHdhcyBhIGZhbHNlIHBvc2l0aXZlIik7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKK30KKworLyogY2FsbGVyIGVuc3VyZSBzdWZmaWNpZW50IGRhdGEgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZ3N0X2FhY19wYXJzZV9wYXJzZV9hZHRzX2hlYWRlciAoR3N0QWFjUGFyc2UgKiBhYWNwYXJzZSwgY29uc3QgZ3VpbnQ4ICogZGF0YSwKKyAgICBnaW50ICogcmF0ZSwgZ2ludCAqIGNoYW5uZWxzLCBnaW50ICogb2JqZWN0LCBnaW50ICogdmVyc2lvbikKK3sKKworICBpZiAocmF0ZSkgeworICAgIGdpbnQgc3JfaWR4ID0gKGRhdGFbMl0gJiAweDNjKSA+PiAyOworCisgICAgKnJhdGUgPSBnc3RfY29kZWNfdXRpbHNfYWFjX2dldF9zYW1wbGVfcmF0ZV9mcm9tX2luZGV4IChzcl9pZHgpOworICB9CisgIGlmIChjaGFubmVscykgeworICAgICpjaGFubmVscyA9ICgoZGF0YVsyXSAmIDB4MDEpIDw8IDIpIHwgKChkYXRhWzNdICYgMHhjMCkgPj4gNik7CisgICAgaWYgKCpjaGFubmVscyA9PSA3KQorICAgICAgKmNoYW5uZWxzID0gODsKKyAgfQorCisgIGlmICh2ZXJzaW9uKQorICAgICp2ZXJzaW9uID0gKGRhdGFbMV0gJiAweDA4KSA/IDIgOiA0OworICBpZiAob2JqZWN0KQorICAgICpvYmplY3QgPSAoKGRhdGFbMl0gJiAweGMwKSA+PiA2KSArIDE7Cit9CisKKy8qKgorICogZ3N0X2FhY19wYXJzZV9kZXRlY3Rfc3RyZWFtOgorICogQGFhY3BhcnNlOiAjR3N0QWFjUGFyc2UuCisgKiBAZGF0YTogQSBibG9jayBvZiBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgZXhhbWluZWQgZm9yIHN0cmVhbSBjaGFyYWN0ZXJpc3RpY3MuCisgKiBAYXZhaWw6IFNpemUgb2YgdGhlIGdpdmVuIGRhdGFibG9jay4KKyAqIEBmcmFtZXNpemU6IElmIHZhbGlkIHN0cmVhbSB3YXMgZm91bmQsIHRoaXMgd2lsbCBiZSBzZXQgdG8gdGVsbCB0aGUKKyAqICAgICAgICAgICAgIGZpcnN0IGZyYW1lIHNpemUgaW4gYnl0ZXMuCisgKiBAc2tpcHNpemU6IElmIHZhbGlkIHN0cmVhbSB3YXMgZm91bmQsIHRoaXMgd2lsbCBiZSBzZXQgdG8gdGVsbCB0aGUgZmlyc3QKKyAqICAgICAgICAgICAgYXVkaW8gZnJhbWUgcG9zaXRpb24gd2l0aGluIHRoZSBnaXZlbiBkYXRhLgorICoKKyAqIEV4YW1pbmVzIHRoZSBnaXZlbiBwaWVjZSBvZiBkYXRhIGFuZCB0cnkgdG8gZGV0ZWN0IHRoZSBmb3JtYXQgb2YgaXQuIEl0CisgKiBjaGVja3MgZm9yICJBRElGIiBoZWFkZXIgKGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNsaXApIGFuZCBBRFRTIGZyYW1lCisgKiBoZWFkZXIuIElmIHRoZSBzdHJlYW0gaXMgZGV0ZWN0ZWQsIFRSVUUgd2lsbCBiZSByZXR1cm5lZCBhbmQgI2ZyYW1lc2l6ZQorICogaXMgc2V0IHRvIGluZGljYXRlIHRoZSBmb3VuZCBmcmFtZSBzaXplLiBBZGRpdGlvbmFsbHksICNza2lwc2l6ZSBtaWdodAorICogYmUgc2V0IHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBuZWVkIHRvIGJlIHNraXBwZWQsIGEuay5hLiB0aGUKKyAqIHBvc2l0aW9uIG9mIHRoZSBmcmFtZSBpbnNpZGUgZ2l2ZW4gZGF0YSBjaHVuay4KKyAqCisgKiBSZXR1cm5zOiBUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FhY19wYXJzZV9kZXRlY3Rfc3RyZWFtIChHc3RBYWNQYXJzZSAqIGFhY3BhcnNlLAorICAgIGNvbnN0IGd1aW50OCAqIGRhdGEsIGNvbnN0IGd1aW50IGF2YWlsLCBnYm9vbGVhbiBkcmFpbiwKKyAgICBndWludCAqIGZyYW1lc2l6ZSwgZ2ludCAqIHNraXBzaXplKQoreworICBnYm9vbGVhbiBmb3VuZCA9IEZBTFNFOworICBndWludCBuZWVkX2RhdGFfYWR0cyA9IDAsIG5lZWRfZGF0YV9sb2FzOworICBndWludCBpID0gMDsKKworICBHU1RfREVCVUdfT0JKRUNUIChhYWNwYXJzZSwgIlBhcnNpbmcgaGVhZGVyIGRhdGEiKTsKKworICAvKiBGSVhNRTogTm8gbmVlZCB0byBjaGVjayBmb3IgQURJRiBpZiB3ZSBhcmUgbm90IGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICAgIHN0cmVhbSAqLworCisgIC8qIENhbiB3ZSBldmVuIHBhcnNlIHRoZSBoZWFkZXI/ICovCisgIGlmIChhdmFpbCA8IE1BWCAoQURUU19NQVhfU0laRSwgTE9BU19NQVhfU0laRSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhYWNwYXJzZSwgIk5vdCBlbm91Z2ggZGF0YSB0byBjaGVjayIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBhdmFpbCAtIDQ7IGkrKykgeworICAgIGlmICgoKGRhdGFbaV0gPT0gMHhmZikgJiYgKChkYXRhW2kgKyAxXSAmIDB4ZjYpID09IDB4ZjApKSB8fAorICAgICAgICAoKGRhdGFbaV0gPT0gMHg1NikgJiYgKChkYXRhW2kgKyAxXSAmIDB4ZTApID09IDB4ZTApKSB8fAorICAgICAgICBzdHJuY21wICgoY2hhciAqKSBkYXRhICsgaSwgIkFESUYiLCA0KSA9PSAwKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhYWNwYXJzZSwgIkZvdW5kIHNpZ25hdHVyZSBhdCBvZmZzZXQgJXUiLCBpKTsKKyAgICAgIGZvdW5kID0gVFJVRTsKKworICAgICAgaWYgKGkpIHsKKyAgICAgICAgLyogVHJpY2s6IHRlbGwgdGhlIHBhcmVudCBjbGFzcyB0aGF0IHdlIGRpZG4ndCBmaW5kIHRoZSBmcmFtZSB5ZXQsCisgICAgICAgICAgIGJ1dCBtYWtlIGl0IHNraXAgJ2knIGFtb3VudCBvZiBieXRlcy4gTmV4dCB0aW1lIHdlIGFycml2ZQorICAgICAgICAgICBoZXJlIHdlIGhhdmUgZnVsbCBmcmFtZSBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhLiAqLworICAgICAgICAqc2tpcHNpemUgPSBpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKCFmb3VuZCkgeworICAgIGlmIChpKQorICAgICAgKnNraXBzaXplID0gaTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoZ3N0X2FhY19wYXJzZV9jaGVja19hZHRzX2ZyYW1lIChhYWNwYXJzZSwgZGF0YSwgYXZhaWwsIGRyYWluLAorICAgICAgICAgIGZyYW1lc2l6ZSwgJm5lZWRfZGF0YV9hZHRzKSkgeworICAgIGdpbnQgcmF0ZSwgY2hhbm5lbHM7CisKKyAgICBHU1RfSU5GTyAoIkFEVFMgSUQ6ICVkLCBmcmFtZXNpemU6ICVkIiwgKGRhdGFbMV0gJiAweDA4KSA+PiAzLCAqZnJhbWVzaXplKTsKKworICAgIGdzdF9hYWNfcGFyc2VfcGFyc2VfYWR0c19oZWFkZXIgKGFhY3BhcnNlLCBkYXRhLCAmcmF0ZSwgJmNoYW5uZWxzLAorICAgICAgICAmYWFjcGFyc2UtPm9iamVjdF90eXBlLCAmYWFjcGFyc2UtPm1wZWd2ZXJzaW9uKTsKKworICAgIGlmICghY2hhbm5lbHMgfHwgIWZyYW1lc2l6ZSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYWFjcGFyc2UsICJpbXBvc3NpYmxlIEFEVFMgY29uZmlndXJhdGlvbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGFhY3BhcnNlLT5oZWFkZXJfdHlwZSA9IERTUEFBQ19IRUFERVJfQURUUzsKKyAgICBnc3RfYmFzZV9wYXJzZV9zZXRfZnJhbWVfcmF0ZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwgcmF0ZSwKKyAgICAgICAgYWFjcGFyc2UtPmZyYW1lX3NhbXBsZXMsIDIsIDIpOworCisgICAgR1NUX0RFQlVHICgiQURUUzogc2FtcGxlcmF0ZSAlZCwgY2hhbm5lbHMgJWQsIG9ianR5cGUgJWQsIHZlcnNpb24gJWQiLAorICAgICAgICByYXRlLCBjaGFubmVscywgYWFjcGFyc2UtPm9iamVjdF90eXBlLCBhYWNwYXJzZS0+bXBlZ3ZlcnNpb24pOworCisgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X3N5bmNhYmxlIChHU1RfQkFTRV9QQVJTRSAoYWFjcGFyc2UpLCBUUlVFKTsKKworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgaWYgKGdzdF9hYWNfcGFyc2VfY2hlY2tfbG9hc19mcmFtZSAoYWFjcGFyc2UsIGRhdGEsIGF2YWlsLCBkcmFpbiwKKyAgICAgICAgICBmcmFtZXNpemUsICZuZWVkX2RhdGFfbG9hcykpIHsKKyAgICBnaW50IHJhdGUgPSAwLCBjaGFubmVscyA9IDA7CisKKyAgICBHU1RfSU5GTyAoIkxPQVMsIGZyYW1lc2l6ZTogJWQiLCAqZnJhbWVzaXplKTsKKworICAgIGFhY3BhcnNlLT5oZWFkZXJfdHlwZSA9IERTUEFBQ19IRUFERVJfTE9BUzsKKworICAgIGlmICghZ3N0X2FhY19wYXJzZV9yZWFkX2xvYXNfY29uZmlnIChhYWNwYXJzZSwgZGF0YSwgYXZhaWwsICZyYXRlLAorICAgICAgICAgICAgJmNoYW5uZWxzLCAmYWFjcGFyc2UtPm1wZWd2ZXJzaW9uKSkgeworICAgICAgLyogVGhpcyBpcyBwcmV0dHkgbm9ybWFsIHdoZW4gc2tpcHBpbmcgZGF0YSBhdCB0aGUgc3RhcnQgb2YKKyAgICAgICAqIHJhbmRvbSBzdHJlYW0gKE1QRUctVFMgY2FwdHVyZSBmb3IgZXhhbXBsZSkgKi8KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChhYWNwYXJzZSwgIkVycm9yIHJlYWRpbmcgTE9BUyBjb25maWciKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAocmF0ZSAmJiBjaGFubmVscykgeworICAgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X2ZyYW1lX3JhdGUgKEdTVF9CQVNFX1BBUlNFIChhYWNwYXJzZSksIHJhdGUsCisgICAgICAgICAgYWFjcGFyc2UtPmZyYW1lX3NhbXBsZXMsIDIsIDIpOworCisgICAgICAvKiBEb24ndCBzdG9yZSB0aGUgc2FtcGxlIHJhdGUgYW5kIGNoYW5uZWxzIHlldCAtCisgICAgICAgKiB0aGlzIGlzIGp1c3QgZm9ybWF0IGRldGVjdGlvbi4gKi8KKyAgICAgIEdTVF9ERUJVRyAoIkxPQVM6IHNhbXBsZXJhdGUgJWQsIGNoYW5uZWxzICVkLCBvYmp0eXBlICVkLCB2ZXJzaW9uICVkIiwKKyAgICAgICAgICByYXRlLCBjaGFubmVscywgYWFjcGFyc2UtPm9iamVjdF90eXBlLCBhYWNwYXJzZS0+bXBlZ3ZlcnNpb24pOworICAgIH0KKworICAgIGdzdF9iYXNlX3BhcnNlX3NldF9zeW5jYWJsZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwgVFJVRSk7CisKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGlmIChuZWVkX2RhdGFfYWR0cyB8fCBuZWVkX2RhdGFfbG9hcykgeworICAgIC8qIFRoaXMgdGVsbHMgdGhlIHBhcmVudCBjbGFzcyBub3QgdG8gc2tpcCBhbnkgZGF0YSAqLworICAgICpza2lwc2l6ZSA9IDA7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKGF2YWlsIDwgQURJRl9NQVhfU0laRSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKG1lbWNtcCAoZGF0YSArIGksICJBRElGIiwgNCkgPT0gMCkgeworICAgIGNvbnN0IGd1aW50OCAqYWRpZjsKKyAgICBpbnQgc2tpcF9zaXplID0gMDsKKyAgICBpbnQgYml0c3RyZWFtX3R5cGU7CisgICAgaW50IHNyX2lkeDsKKyAgICBHc3RDYXBzICpzaW5rY2FwczsKKworICAgIGFhY3BhcnNlLT5oZWFkZXJfdHlwZSA9IERTUEFBQ19IRUFERVJfQURJRjsKKyAgICBhYWNwYXJzZS0+bXBlZ3ZlcnNpb24gPSA0OworCisgICAgLyogU2tpcCB0aGUgIkFESUYiIGJ5dGVzICovCisgICAgYWRpZiA9IGRhdGEgKyBpICsgNDsKKworICAgIC8qIGNvcHlyaWdodCBzdHJpbmcgKi8KKyAgICBpZiAoYWRpZlswXSAmIDB4ODApCisgICAgICBza2lwX3NpemUgKz0gOTsgICAgICAgICAgIC8qIHNraXAgOSBieXRlcyAqLworCisgICAgYml0c3RyZWFtX3R5cGUgPSBhZGlmWzAgKyBza2lwX3NpemVdICYgMHgxMDsKKyAgICBhYWNwYXJzZS0+Yml0cmF0ZSA9CisgICAgICAgICgodW5zaWduZWQgaW50KSAoYWRpZlswICsgc2tpcF9zaXplXSAmIDB4MGYpIDw8IDE5KSB8CisgICAgICAgICgodW5zaWduZWQgaW50KSBhZGlmWzEgKyBza2lwX3NpemVdIDw8IDExKSB8CisgICAgICAgICgodW5zaWduZWQgaW50KSBhZGlmWzIgKyBza2lwX3NpemVdIDw8IDMpIHwKKyAgICAgICAgKCh1bnNpZ25lZCBpbnQpIGFkaWZbMyArIHNraXBfc2l6ZV0gJiAweGUwKTsKKworICAgIC8qIENCUiAqLworICAgIGlmIChiaXRzdHJlYW1fdHlwZSA9PSAwKSB7CisjaWYgMAorICAgICAgLyogQnVmZmVyIGZ1bGxuZXNzIHBhcnNpbmcuIEN1cnJlbnRseSBub3QgbmVlZGVkLi4uICovCisgICAgICBndWludCBudW1fZWxlbXMgPSAwOworICAgICAgZ3VpbnQgZnVsbG5lc3MgPSAwOworCisgICAgICBudW1fZWxlbXMgPSAoYWRpZlszICsgc2tpcF9zaXplXSAmIDB4MWUpOworICAgICAgR1NUX0lORk8gKCJBRElGIG51bV9jb25maWdfZWxlbXM6ICVkIiwgbnVtX2VsZW1zKTsKKworICAgICAgZnVsbG5lc3MgPSAoKHVuc2lnbmVkIGludCkgKGFkaWZbMyArIHNraXBfc2l6ZV0gJiAweDAxKSA8PCAxOSkgfAorICAgICAgICAgICgodW5zaWduZWQgaW50KSBhZGlmWzQgKyBza2lwX3NpemVdIDw8IDExKSB8CisgICAgICAgICAgKCh1bnNpZ25lZCBpbnQpIGFkaWZbNSArIHNraXBfc2l6ZV0gPDwgMykgfAorICAgICAgICAgICgodW5zaWduZWQgaW50KSAoYWRpZls2ICsgc2tpcF9zaXplXSAmIDB4ZTApID4+IDUpOworCisgICAgICBHU1RfSU5GTyAoIkFESUYgYnVmZmVyIGZ1bGxuZXNzOiAlZCIsIGZ1bGxuZXNzKTsKKyNlbmRpZgorICAgICAgYWFjcGFyc2UtPm9iamVjdF90eXBlID0gKChhZGlmWzYgKyBza2lwX3NpemVdICYgMHgwMSkgPDwgMSkgfAorICAgICAgICAgICgoYWRpZls3ICsgc2tpcF9zaXplXSAmIDB4ODApID4+IDcpOworICAgICAgc3JfaWR4ID0gKGFkaWZbNyArIHNraXBfc2l6ZV0gJiAweDc4KSA+PiAzOworICAgIH0KKyAgICAvKiBWQlIgKi8KKyAgICBlbHNlIHsKKyAgICAgIGFhY3BhcnNlLT5vYmplY3RfdHlwZSA9IChhZGlmWzQgKyBza2lwX3NpemVdICYgMHgxOCkgPj4gMzsKKyAgICAgIHNyX2lkeCA9ICgoYWRpZls0ICsgc2tpcF9zaXplXSAmIDB4MDcpIDw8IDEpIHwKKyAgICAgICAgICAoKGFkaWZbNSArIHNraXBfc2l6ZV0gJiAweDgwKSA+PiA3KTsKKyAgICB9CisKKyAgICAvKiBGSVhNRTogVGhpcyBnaXZlcyB0b3RhbGx5IHdyb25nIHJlc3VsdHMuIER1cmF0aW9uIGNhbGN1bGF0aW9uIGNhbm5vdAorICAgICAgIGJlIGJhc2VkIG9uIHRoaXMgKi8KKyAgICBhYWNwYXJzZS0+c2FtcGxlX3JhdGUgPQorICAgICAgICBnc3RfY29kZWNfdXRpbHNfYWFjX2dldF9zYW1wbGVfcmF0ZV9mcm9tX2luZGV4IChzcl9pZHgpOworCisgICAgLyogYmFzZXBhcnNlIGlzIG5vdCBnaXZlbiBhbnkgZnBzLAorICAgICAqIHNvIGl0IHdpbGwgZ2l2ZSB1cCBvbiB0aW1lc3RhbXBzLCBzZWVraW5nLCBldGMgKi8KKworICAgIC8qIEZJWE1FOiBDYW4gd2UgYXNzdW1lIHRoaXM/ICovCisgICAgYWFjcGFyc2UtPmNoYW5uZWxzID0gMjsKKworICAgIEdTVF9JTkZPICgiQURJRjogYnI9JWQsIHNhbXBsZXJhdGU9JWQsIG9ianR5cGU9JWQiLAorICAgICAgICBhYWNwYXJzZS0+Yml0cmF0ZSwgYWFjcGFyc2UtPnNhbXBsZV9yYXRlLCBhYWNwYXJzZS0+b2JqZWN0X3R5cGUpOworCisgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChHU1RfQkFTRV9QQVJTRSAoYWFjcGFyc2UpLCA1MTIpOworCisgICAgLyogYXJyYW5nZSBmb3IgbWV0YWRhdGEgYW5kIGdldCBvdXQgb2YgdGhlIHdheSAqLworICAgIHNpbmtjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChHU1RfQkFTRV9QQVJTRV9TSU5LX1BBRCAoYWFjcGFyc2UpKTsKKyAgICBnc3RfYWFjX3BhcnNlX3NldF9zcmNfY2FwcyAoYWFjcGFyc2UsIHNpbmtjYXBzKTsKKyAgICBpZiAoc2lua2NhcHMpCisgICAgICBnc3RfY2Fwc191bnJlZiAoc2lua2NhcHMpOworCisgICAgLyogbm90IHN5bmNhYmxlLCBub3QgZWFzaWx5IHNlZWthYmxlICh1bmxlc3Mgd2UgcHVzaCBkYXRhIGZyb20gc3RhcnQgKi8KKyAgICBnc3RfYmFzZV9wYXJzZV9zZXRfc3luY2FibGUgKEdTVF9CQVNFX1BBUlNFX0NBU1QgKGFhY3BhcnNlKSwgRkFMU0UpOworICAgIGdzdF9iYXNlX3BhcnNlX3NldF9wYXNzdGhyb3VnaCAoR1NUX0JBU0VfUEFSU0VfQ0FTVCAoYWFjcGFyc2UpLCBUUlVFKTsKKyAgICBnc3RfYmFzZV9wYXJzZV9zZXRfYXZlcmFnZV9iaXRyYXRlIChHU1RfQkFTRV9QQVJTRV9DQVNUIChhYWNwYXJzZSksIDApOworCisgICAgKmZyYW1lc2l6ZSA9IGF2YWlsOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBnc3RfYWFjX3BhcnNlX2dldF9hdWRpb19wcm9maWxlX29iamVjdF90eXBlCisgKiBAYWFjcGFyc2U6ICNHc3RBYWNQYXJzZS4KKyAqCisgKiBHZXRzIHRoZSBNUEVHLTIgcHJvZmlsZSBvciB0aGUgTVBFRy00IG9iamVjdCB0eXBlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgKiBtcGVndmVyc2lvbiBhbmQgcHJvZmlsZSBvZiBAYWFjcGFyc2UncyBzcmMgcGFkIGNhcHMsIGFjY29yZGluZyB0byB0aGUKKyAqIHZhbHVlcyBkZWZpbmVkIGJ5IHRhYmxlIDEuQS4xMSBpbiBJU08vSUVDIDE0NDk2LTMuCisgKgorICogUmV0dXJuczogdGhlIHByb2ZpbGUgb3Igb2JqZWN0IHR5cGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBAYWFjcGFyc2UncyBzcmMKKyAqIHBhZCBjYXBzLCBpZiBzdWNoIGEgdmFsdWUgZXhpc3RzOyBvdGhlcndpc2UgR19NQVhVSU5UOC4KKyAqLworc3RhdGljIGd1aW50OAorZ3N0X2FhY19wYXJzZV9nZXRfYXVkaW9fcHJvZmlsZV9vYmplY3RfdHlwZSAoR3N0QWFjUGFyc2UgKiBhYWNwYXJzZSkKK3sKKyAgR3N0Q2FwcyAqc3JjY2FwczsKKyAgR3N0U3RydWN0dXJlICpzcmNzdHJ1Y3Q7CisgIGNvbnN0IGdjaGFyICpwcm9maWxlOworICBndWludDggcmV0OworCisgIHNyY2NhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKGFhY3BhcnNlKSk7CisgIGlmIChHX1VOTElLRUxZIChzcmNjYXBzID09IE5VTEwpKSB7CisgICAgcmV0dXJuIEdfTUFYVUlOVDg7CisgIH0KKworICBzcmNzdHJ1Y3QgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChzcmNjYXBzLCAwKTsKKyAgcHJvZmlsZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3Jjc3RydWN0LCAicHJvZmlsZSIpOworICBpZiAoR19VTkxJS0VMWSAocHJvZmlsZSA9PSBOVUxMKSkgeworICAgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKyAgICByZXR1cm4gR19NQVhVSU5UODsKKyAgfQorCisgIGlmIChnX3N0cmNtcDAgKHByb2ZpbGUsICJtYWluIikgPT0gMCkgeworICAgIHJldCA9IChndWludDgpIDBVOworICB9IGVsc2UgaWYgKGdfc3RyY21wMCAocHJvZmlsZSwgImxjIikgPT0gMCkgeworICAgIHJldCA9IChndWludDgpIDFVOworICB9IGVsc2UgaWYgKGdfc3RyY21wMCAocHJvZmlsZSwgInNzciIpID09IDApIHsKKyAgICByZXQgPSAoZ3VpbnQ4KSAyVTsKKyAgfSBlbHNlIGlmIChnX3N0cmNtcDAgKHByb2ZpbGUsICJsdHAiKSA9PSAwKSB7CisgICAgaWYgKEdfTElLRUxZIChhYWNwYXJzZS0+bXBlZ3ZlcnNpb24gPT0gNCkpCisgICAgICByZXQgPSAoZ3VpbnQ4KSAzVTsKKyAgICBlbHNlCisgICAgICByZXQgPSBHX01BWFVJTlQ4OyAgICAgICAgIC8qIExUUCBPYmplY3QgVHlwZSBhbGxvd2VkIG9ubHkgZm9yIE1QRUctNCAqLworICB9IGVsc2UgeworICAgIHJldCA9IEdfTUFYVUlOVDg7CisgIH0KKworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogZ3N0X2FhY19wYXJzZV9nZXRfYXVkaW9fY2hhbm5lbF9jb25maWd1cmF0aW9uCisgKiBAbnVtX2NoYW5uZWxzOiBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMuCisgKgorICogR2V0cyB0aGUgQ2hhbm5lbCBDb25maWd1cmF0aW9uIHZhbHVlLCBhcyBkZWZpbmVkIGJ5IHRhYmxlIDEuMTkgaW4gSVNPL0lFQworICogMTQ0OTYtMywgZm9yIGEgZ2l2ZW4gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzLgorICoKKyAqIFJldHVybnM6IHRoZSBDaGFubmVsIENvbmZpZ3VyYXRpb24gdmFsdWUgY29ycmVzcG9uZGluZyB0byBAbnVtX2NoYW5uZWxzLCBpZgorICogc3VjaCBhIHZhbHVlIGV4aXN0czsgb3RoZXJ3aXNlIEdfTUFYVUlOVDguCisgKi8KK3N0YXRpYyBndWludDgKK2dzdF9hYWNfcGFyc2VfZ2V0X2F1ZGlvX2NoYW5uZWxfY29uZmlndXJhdGlvbiAoZ2ludCBudW1fY2hhbm5lbHMpCit7CisgIGlmIChudW1fY2hhbm5lbHMgPj0gMSAmJiBudW1fY2hhbm5lbHMgPD0gNikgICAvKiBNb25vIHVwIHRvICYgaW5jbHVkaW5nIDUuMSAqLworICAgIHJldHVybiAoZ3VpbnQ4KSBudW1fY2hhbm5lbHM7CisgIGVsc2UgaWYgKG51bV9jaGFubmVscyA9PSA4KSAgIC8qIDcuMSAqLworICAgIHJldHVybiAoZ3VpbnQ4KSA3VTsKKyAgZWxzZQorICAgIHJldHVybiBHX01BWFVJTlQ4OworCisgIC8qIEZJWE1FOiBBZGQgc3VwcG9ydCBmb3IgY29uZmlndXJhdGlvbnMgMTEsIDEyIGFuZCAxNCBmcm9tCisgICAqIElTTy9JRUMgMTQ0OTYtMzoyMDA5L1BEQU0gNCBiYXNlZCBvbiB0aGUgYWN0dWFsIGNoYW5uZWwgbGF5b3V0CisgICAqLworfQorCisvKioKKyAqIGdzdF9hYWNfcGFyc2VfZ2V0X2F1ZGlvX3NhbXBsaW5nX2ZyZXF1ZW5jeV9pbmRleDoKKyAqIEBzYW1wbGVfcmF0ZTogYXVkaW8gc2FtcGxpbmcgcmF0ZS4KKyAqCisgKiBHZXRzIHRoZSBTYW1wbGluZyBGcmVxdWVuY3kgSW5kZXggdmFsdWUsIGFzIGRlZmluZWQgYnkgdGFibGUgMS4xOCBpbiBJU08vSUVDCisgKiAxNDQ5Ni0zLCBmb3IgYSBnaXZlbiBzYW1wbGluZyByYXRlLgorICoKKyAqIFJldHVybnM6IHRoZSBTYW1wbGluZyBGcmVxdWVuY3kgSW5kZXggdmFsdWUgY29ycmVzcG9uZGluZyB0byBAc2FtcGxlX3JhdGUsCisgKiBpZiBzdWNoIGEgdmFsdWUgZXhpc3RzOyBvdGhlcndpc2UgR19NQVhVSU5UOC4KKyAqLworc3RhdGljIGd1aW50OAorZ3N0X2FhY19wYXJzZV9nZXRfYXVkaW9fc2FtcGxpbmdfZnJlcXVlbmN5X2luZGV4IChnaW50IHNhbXBsZV9yYXRlKQoreworICBzd2l0Y2ggKHNhbXBsZV9yYXRlKSB7CisgICAgY2FzZSA5NjAwMDoKKyAgICAgIHJldHVybiAweDBVOworICAgIGNhc2UgODgyMDA6CisgICAgICByZXR1cm4gMHgxVTsKKyAgICBjYXNlIDY0MDAwOgorICAgICAgcmV0dXJuIDB4MlU7CisgICAgY2FzZSA0ODAwMDoKKyAgICAgIHJldHVybiAweDNVOworICAgIGNhc2UgNDQxMDA6CisgICAgICByZXR1cm4gMHg0VTsKKyAgICBjYXNlIDMyMDAwOgorICAgICAgcmV0dXJuIDB4NVU7CisgICAgY2FzZSAyNDAwMDoKKyAgICAgIHJldHVybiAweDZVOworICAgIGNhc2UgMjIwNTA6CisgICAgICByZXR1cm4gMHg3VTsKKyAgICBjYXNlIDE2MDAwOgorICAgICAgcmV0dXJuIDB4OFU7CisgICAgY2FzZSAxMjAwMDoKKyAgICAgIHJldHVybiAweDlVOworICAgIGNhc2UgMTEwMjU6CisgICAgICByZXR1cm4gMHhBVTsKKyAgICBjYXNlIDgwMDA6CisgICAgICByZXR1cm4gMHhCVTsKKyAgICBjYXNlIDczNTA6CisgICAgICByZXR1cm4gMHhDVTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEdfTUFYVUlOVDg7CisgIH0KK30KKworLyoqCisgKiBnc3RfYWFjX3BhcnNlX3ByZXBlbmRfYWR0c19oZWFkZXJzOgorICogQGFhY3BhcnNlOiAjR3N0QWFjUGFyc2UuCisgKiBAZnJhbWU6IHJhdyBBQUMgZnJhbWUgdG8gd2hpY2ggQURUUyBoZWFkZXJzIHNoYWxsIGJlIHByZXBlbmRlZC4KKyAqCisgKiBQcmVwZW5kcyBBRFRTIGhlYWRlcnMgdG8gYSByYXcgQUFDIGF1ZGlvIGZyYW1lLgorICoKKyAqIFJldHVybnM6IFRSVUUgaWYgQURUUyBoZWFkZXJzIHdlcmUgc3VjY2Vzc2Z1bGx5IHByZXBlbmRlZDsgRkFMU0Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYWNfcGFyc2VfcHJlcGVuZF9hZHRzX2hlYWRlcnMgKEdzdEFhY1BhcnNlICogYWFjcGFyc2UsCisgICAgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0TWVtb3J5ICptZW07CisgIGd1aW50OCAqYWR0c19oZWFkZXJzOworICBnc2l6ZSBidWZfc2l6ZTsKKyAgZ3NpemUgZnJhbWVfc2l6ZTsKKyAgZ3VpbnQ4IGlkLCBwcm9maWxlLCBjaGFubmVsX2NvbmZpZ3VyYXRpb24sIHNhbXBsaW5nX2ZyZXF1ZW5jeV9pbmRleDsKKworICBpZCA9IChhYWNwYXJzZS0+bXBlZ3ZlcnNpb24gPT0gNCkgPyAweDBVIDogMHgxVTsKKyAgcHJvZmlsZSA9IGdzdF9hYWNfcGFyc2VfZ2V0X2F1ZGlvX3Byb2ZpbGVfb2JqZWN0X3R5cGUgKGFhY3BhcnNlKTsKKyAgaWYgKHByb2ZpbGUgPT0gR19NQVhVSU5UOCkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGFhY3BhcnNlLCAiVW5zdXBwb3J0ZWQgYXVkaW8gcHJvZmlsZSBvciBvYmplY3QgdHlwZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBjaGFubmVsX2NvbmZpZ3VyYXRpb24gPQorICAgICAgZ3N0X2FhY19wYXJzZV9nZXRfYXVkaW9fY2hhbm5lbF9jb25maWd1cmF0aW9uIChhYWNwYXJzZS0+Y2hhbm5lbHMpOworICBpZiAoY2hhbm5lbF9jb25maWd1cmF0aW9uID09IEdfTUFYVUlOVDgpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChhYWNwYXJzZSwgIlVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBzYW1wbGluZ19mcmVxdWVuY3lfaW5kZXggPQorICAgICAgZ3N0X2FhY19wYXJzZV9nZXRfYXVkaW9fc2FtcGxpbmdfZnJlcXVlbmN5X2luZGV4IChhYWNwYXJzZS0+c2FtcGxlX3JhdGUpOworICBpZiAoc2FtcGxpbmdfZnJlcXVlbmN5X2luZGV4ID09IEdfTUFYVUlOVDgpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChhYWNwYXJzZSwgIlVuc3VwcG9ydGVkIHNhbXBsaW5nIGZyZXF1ZW5jeSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGZyYW1lLT5vdXRfYnVmZmVyID0gZ3N0X2J1ZmZlcl9jb3B5IChmcmFtZS0+YnVmZmVyKTsKKyAgYnVmX3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChmcmFtZS0+b3V0X2J1ZmZlcik7CisgIGZyYW1lX3NpemUgPSBidWZfc2l6ZSArIEFEVFNfSEVBREVSU19MRU5HVEg7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGZyYW1lX3NpemUgPj0gMHg0MDAwKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGFhY3BhcnNlLCAiRnJhbWUgc2l6ZSBpcyB0b28gYmlnIGZvciBBRFRTIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgYWR0c19oZWFkZXJzID0gKGd1aW50OCAqKSBnX21hbGxvYzAgKEFEVFNfSEVBREVSU19MRU5HVEgpOworCisgIC8qIE5vdGU6IG5vIGVycm9yIGNvcnJlY3Rpb24gYml0cyBhcmUgYWRkZWQgdG8gdGhlIHJlc3VsdGluZyBBRFRTIGZyYW1lcyAqLworICBhZHRzX2hlYWRlcnNbMF0gPSAweEZGVTsKKyAgYWR0c19oZWFkZXJzWzFdID0gMHhGMFUgfCAoaWQgPDwgMykgfCAweDFVOworICBhZHRzX2hlYWRlcnNbMl0gPSAocHJvZmlsZSA8PCA2KSB8IChzYW1wbGluZ19mcmVxdWVuY3lfaW5kZXggPDwgMikgfCAweDJVIHwKKyAgICAgIChjaGFubmVsX2NvbmZpZ3VyYXRpb24gJiAweDRVKTsKKyAgYWR0c19oZWFkZXJzWzNdID0gKChjaGFubmVsX2NvbmZpZ3VyYXRpb24gJiAweDNVKSA8PCA2KSB8IDB4MzBVIHwKKyAgICAgIChndWludDgpIChmcmFtZV9zaXplID4+IDExKTsKKyAgYWR0c19oZWFkZXJzWzRdID0gKGd1aW50OCkgKChmcmFtZV9zaXplID4+IDMpICYgMHgwMEZGKTsKKyAgYWR0c19oZWFkZXJzWzVdID0gKGd1aW50OCkgKCgoZnJhbWVfc2l6ZSAmIDB4MDAwNykgPDwgNSkgKyAweDFGVSk7CisgIGFkdHNfaGVhZGVyc1s2XSA9IDB4RkNVOworCisgIG1lbSA9IGdzdF9tZW1vcnlfbmV3X3dyYXBwZWQgKDAsIGFkdHNfaGVhZGVycywgQURUU19IRUFERVJTX0xFTkdUSCwgMCwKKyAgICAgIEFEVFNfSEVBREVSU19MRU5HVEgsIGFkdHNfaGVhZGVycywgZ19mcmVlKTsKKyAgZ3N0X2J1ZmZlcl9wcmVwZW5kX21lbW9yeSAoZnJhbWUtPm91dF9idWZmZXIsIG1lbSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogZ3N0X2FhY19wYXJzZV9jaGVja192YWxpZF9mcmFtZToKKyAqIEBwYXJzZTogI0dzdEJhc2VQYXJzZS4KKyAqIEBmcmFtZTogI0dzdEJhc2VQYXJzZUZyYW1lLgorICogQHNraXBzaXplOiBIb3cgbXVjaCBkYXRhIHBhcmVudCBjbGFzcyBzaG91bGQgc2tpcCBpbiBvcmRlciB0byBmaW5kIHRoZQorICogICAgICAgICAgICBmcmFtZSBoZWFkZXIuCisgKgorICogSW1wbGVtZW50YXRpb24gb2YgImhhbmRsZV9mcmFtZSIgdm1ldGhvZCBpbiAjR3N0QmFzZVBhcnNlIGNsYXNzLgorICoKKyAqIEFsc28gZGV0ZXJtaW5lcyBmcmFtZSBvdmVyaGVhZC4KKyAqIEFEVFMgc3RyZWFtcyBoYXZlIGEgNyBieXRlIGhlYWRlciBpbiBlYWNoIGZyYW1lLiBNUDQgYW5kIEFESUYgc3RyZWFtcyBkb24ndCBoYXZlCisgKiBhIHBlci1mcmFtZSBoZWFkZXIuIExPQVMgaGFzIDMgYnl0ZXMuCisgKgorICogV2UncmUgbWFraW5nIGEgY291cGxlIG9mIHNpbXBsaWZ5aW5nIGFzc3VtcHRpb25zOgorICoKKyAqIDEuIFdlIGNvdW50IFByb2dyYW0gQ29uZmlndXJhdGlvbiBFbGVtZW50cyByYXRoZXIgdGhhbiBzZWFyY2hpbmcgZm9yIHRoZW0KKyAqICAgIGluIHRoZSBzdHJlYW1zIHRvIGRpc2NvdW50IHRoZW0gLSB0aGUgb3ZlcmhlYWQgaXMgbmVnbGlnaWJsZS4KKyAqCisgKiAyLiBXZSBpZ25vcmUgQ1JDLiBUaGlzIGhhcyBhIHdvcnN0LWNhc2UgaW1wYWN0IG9mIChudW1fcmF3X2Jsb2NrcyArIDEpKjE2CisgKiAgICBiaXRzLCB3aGljaCBzaG91bGQgc3RpbGwgbm90IGJlIHNpZ25pZmljYW50IGVub3VnaCB0byB3YXJyYW50IHRoZQorICogICAgYWRkaXRpb25hbCBwYXJzaW5nIHRocm91Z2ggdGhlIGhlYWRlcnMKKyAqCisgKiBSZXR1cm5zOiBhICNHc3RGbG93UmV0dXJuLgorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2FhY19wYXJzZV9oYW5kbGVfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUsIGdpbnQgKiBza2lwc2l6ZSkKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdEFhY1BhcnNlICphYWNwYXJzZTsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisgIGdib29sZWFuIGxvc3Rfc3luYzsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIGd1aW50IGZyYW1lc2l6ZTsKKyAgZ2ludCByYXRlID0gMCwgY2hhbm5lbHMgPSAwOworCisgIGFhY3BhcnNlID0gR1NUX0FBQ19QQVJTRSAocGFyc2UpOworICBidWZmZXIgPSBmcmFtZS0+YnVmZmVyOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgKnNraXBzaXplID0gLTE7CisgIGxvc3Rfc3luYyA9IEdTVF9CQVNFX1BBUlNFX0xPU1RfU1lOQyAocGFyc2UpOworCisgIGlmIChhYWNwYXJzZS0+aGVhZGVyX3R5cGUgPT0gRFNQQUFDX0hFQURFUl9BRElGIHx8CisgICAgICBhYWNwYXJzZS0+aGVhZGVyX3R5cGUgPT0gRFNQQUFDX0hFQURFUl9OT05FKSB7CisgICAgLyogVGhlcmUgaXMgbm90aGluZyB0byBwYXJzZSAqLworICAgIGZyYW1lc2l6ZSA9IG1hcC5zaXplOworICAgIHJldCA9IFRSVUU7CisKKyAgfSBlbHNlIGlmIChhYWNwYXJzZS0+aGVhZGVyX3R5cGUgPT0gRFNQQUFDX0hFQURFUl9OT1RfUEFSU0VEIHx8IGxvc3Rfc3luYykgeworCisgICAgcmV0ID0gZ3N0X2FhY19wYXJzZV9kZXRlY3Rfc3RyZWFtIChhYWNwYXJzZSwgbWFwLmRhdGEsIG1hcC5zaXplLAorICAgICAgICBHU1RfQkFTRV9QQVJTRV9EUkFJTklORyAocGFyc2UpLCAmZnJhbWVzaXplLCBza2lwc2l6ZSk7CisKKyAgfSBlbHNlIGlmIChhYWNwYXJzZS0+aGVhZGVyX3R5cGUgPT0gRFNQQUFDX0hFQURFUl9BRFRTKSB7CisgICAgZ3VpbnQgbmVlZGVkX2RhdGEgPSAxMDI0OworCisgICAgcmV0ID0gZ3N0X2FhY19wYXJzZV9jaGVja19hZHRzX2ZyYW1lIChhYWNwYXJzZSwgbWFwLmRhdGEsIG1hcC5zaXplLAorICAgICAgICBHU1RfQkFTRV9QQVJTRV9EUkFJTklORyAocGFyc2UpLCAmZnJhbWVzaXplLCAmbmVlZGVkX2RhdGEpOworCisgICAgaWYgKCFyZXQgJiYgbmVlZGVkX2RhdGEpIHsKKyAgICAgIEdTVF9ERUJVRyAoImJ1ZmZlciBkaWRuJ3QgY29udGFpbiB2YWxpZCBmcmFtZSIpOworICAgICAgKnNraXBzaXplID0gMDsKKyAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwKKyAgICAgICAgICBuZWVkZWRfZGF0YSk7CisgICAgfQorCisgIH0gZWxzZSBpZiAoYWFjcGFyc2UtPmhlYWRlcl90eXBlID09IERTUEFBQ19IRUFERVJfTE9BUykgeworICAgIGd1aW50IG5lZWRlZF9kYXRhID0gMTAyNDsKKworICAgIHJldCA9IGdzdF9hYWNfcGFyc2VfY2hlY2tfbG9hc19mcmFtZSAoYWFjcGFyc2UsIG1hcC5kYXRhLAorICAgICAgICBtYXAuc2l6ZSwgR1NUX0JBU0VfUEFSU0VfRFJBSU5JTkcgKHBhcnNlKSwgJmZyYW1lc2l6ZSwgJm5lZWRlZF9kYXRhKTsKKworICAgIGlmICghcmV0ICYmIG5lZWRlZF9kYXRhKSB7CisgICAgICBHU1RfREVCVUcgKCJidWZmZXIgZGlkbid0IGNvbnRhaW4gdmFsaWQgZnJhbWUiKTsKKyAgICAgICpza2lwc2l6ZSA9IDA7CisgICAgICBnc3RfYmFzZV9wYXJzZV9zZXRfbWluX2ZyYW1lX3NpemUgKEdTVF9CQVNFX1BBUlNFIChhYWNwYXJzZSksCisgICAgICAgICAgbmVlZGVkX2RhdGEpOworICAgIH0KKworICB9IGVsc2UgeworICAgIEdTVF9ERUJVRyAoImJ1ZmZlciBkaWRuJ3QgY29udGFpbiB2YWxpZCBmcmFtZSIpOworICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwKKyAgICAgICAgQURUU19NQVhfU0laRSk7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoIXJldCkpCisgICAgZ290byBleGl0OworCisgIGlmIChhYWNwYXJzZS0+aGVhZGVyX3R5cGUgPT0gRFNQQUFDX0hFQURFUl9BRFRTKSB7CisgICAgLyogc2VlIGFib3ZlICovCisgICAgZnJhbWUtPm92ZXJoZWFkID0gNzsKKworICAgIGdzdF9hYWNfcGFyc2VfcGFyc2VfYWR0c19oZWFkZXIgKGFhY3BhcnNlLCBtYXAuZGF0YSwKKyAgICAgICAgJnJhdGUsICZjaGFubmVscywgTlVMTCwgTlVMTCk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoYWFjcGFyc2UsICJyYXRlOiAlZCwgY2hhbnM6ICVkIiwgcmF0ZSwgY2hhbm5lbHMpOworCisgICAgaWYgKEdfVU5MSUtFTFkgKHJhdGUgIT0gYWFjcGFyc2UtPnNhbXBsZV9yYXRlCisgICAgICAgICAgICB8fCBjaGFubmVscyAhPSBhYWNwYXJzZS0+Y2hhbm5lbHMpKSB7CisgICAgICBhYWNwYXJzZS0+c2FtcGxlX3JhdGUgPSByYXRlOworICAgICAgYWFjcGFyc2UtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisKKyAgICAgIGlmICghZ3N0X2FhY19wYXJzZV9zZXRfc3JjX2NhcHMgKGFhY3BhcnNlLCBOVUxMKSkgeworICAgICAgICAvKiBJZiBsaW5raW5nIGZhaWxzLCB3ZSBuZWVkIHRvIHJldHVybiBhcHByb3ByaWF0ZSBlcnJvciAqLworICAgICAgICByZXQgPSBHU1RfRkxPV19OT1RfTElOS0VEOworICAgICAgfQorCisgICAgICBnc3RfYmFzZV9wYXJzZV9zZXRfZnJhbWVfcmF0ZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwKKyAgICAgICAgICBhYWNwYXJzZS0+c2FtcGxlX3JhdGUsIGFhY3BhcnNlLT5mcmFtZV9zYW1wbGVzLCAyLCAyKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoYWFjcGFyc2UtPmhlYWRlcl90eXBlID09IERTUEFBQ19IRUFERVJfTE9BUykgeworICAgIGdib29sZWFuIHNldGNhcHMgPSBGQUxTRTsKKworICAgIC8qIHNlZSBhYm92ZSAqLworICAgIGZyYW1lLT5vdmVyaGVhZCA9IDM7CisKKyAgICBpZiAoIWdzdF9hYWNfcGFyc2VfcmVhZF9sb2FzX2NvbmZpZyAoYWFjcGFyc2UsIG1hcC5kYXRhLCBtYXAuc2l6ZSwgJnJhdGUsCisgICAgICAgICAgICAmY2hhbm5lbHMsIE5VTEwpIHx8ICFyYXRlIHx8ICFjaGFubmVscykgeworICAgICAgLyogVGhpcyBpcyBwcmV0dHkgbm9ybWFsIHdoZW4gc2tpcHBpbmcgZGF0YSBhdCB0aGUgc3RhcnQgb2YKKyAgICAgICAqIHJhbmRvbSBzdHJlYW0gKE1QRUctVFMgY2FwdHVyZSBmb3IgZXhhbXBsZSkgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFhY3BhcnNlLCAiRXJyb3IgcmVhZGluZyBMT0FTIGNvbmZpZy4gU2tpcHBpbmcuIik7CisgICAgICAvKiBTaW5jZSB3ZSBkb24ndCBmdWxseSBwYXJzZSB0aGUgTE9BUyBjb25maWcsIHdlIGRvbid0IGtub3cgZm9yIHN1cmUKKyAgICAgICAqIGhvdyBtdWNoIHRvIHNraXAuIEp1c3Qgc2tpcCAxIHRvIGVuZCB1cCB0byB0aGUgbmV4dCBtYXJrZXIgYW5kCisgICAgICAgKiByZXN1bWUgcGFyc2luZyBmcm9tIHRoZXJlICovCisgICAgICAqc2tpcHNpemUgPSAxOworICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGlmIChHX1VOTElLRUxZIChyYXRlICE9IGFhY3BhcnNlLT5zYW1wbGVfcmF0ZQorICAgICAgICAgICAgfHwgY2hhbm5lbHMgIT0gYWFjcGFyc2UtPmNoYW5uZWxzKSkgeworICAgICAgYWFjcGFyc2UtPnNhbXBsZV9yYXRlID0gcmF0ZTsKKyAgICAgIGFhY3BhcnNlLT5jaGFubmVscyA9IGNoYW5uZWxzOworICAgICAgc2V0Y2FwcyA9IFRSVUU7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGFhY3BhcnNlLCAiTmV3IExPQVMgY29uZmlnOiAlZCBIeiwgJWQgY2hhbm5lbHMiLCByYXRlLAorICAgICAgICAgIGNoYW5uZWxzKTsKKyAgICB9CisKKyAgICAvKiBXZSB3YW50IHRvIHNldCBjYXBzIGJvdGggYXQgc3RhcnQsIGFuZCB3aGVuIHJhdGUvY2hhbm5lbHMgY2hhbmdlLgorICAgICAgIFNpbmNlIG9ubHkgc29tZSBMT0FTIGZyYW1lcyBoYXZlIHRoYXQgaW5mbywgd2UgbWF5IHJlY2VpdmUgZnJhbWVzCisgICAgICAgYmVmb3JlIGtub3dpbmcgYWJvdXQgcmF0ZS9jaGFubmVscy4gKi8KKyAgICBpZiAoc2V0Y2FwcworICAgICAgICB8fCAhZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChhYWNwYXJzZSkpKSB7CisgICAgICBpZiAoIWdzdF9hYWNfcGFyc2Vfc2V0X3NyY19jYXBzIChhYWNwYXJzZSwgTlVMTCkpIHsKKyAgICAgICAgLyogSWYgbGlua2luZyBmYWlscywgd2UgbmVlZCB0byByZXR1cm4gYXBwcm9wcmlhdGUgZXJyb3IgKi8KKyAgICAgICAgcmV0ID0gR1NUX0ZMT1dfTk9UX0xJTktFRDsKKyAgICAgIH0KKworICAgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X2ZyYW1lX3JhdGUgKEdTVF9CQVNFX1BBUlNFIChhYWNwYXJzZSksCisgICAgICAgICAgYWFjcGFyc2UtPnNhbXBsZV9yYXRlLCBhYWNwYXJzZS0+ZnJhbWVfc2FtcGxlcywgMiwgMik7CisgICAgfQorICB9CisKKyAgaWYgKGFhY3BhcnNlLT5oZWFkZXJfdHlwZSA9PSBEU1BBQUNfSEVBREVSX05PTkUKKyAgICAgICYmIGFhY3BhcnNlLT5vdXRwdXRfaGVhZGVyX3R5cGUgPT0gRFNQQUFDX0hFQURFUl9BRFRTKSB7CisgICAgaWYgKCFnc3RfYWFjX3BhcnNlX3ByZXBlbmRfYWR0c19oZWFkZXJzIChhYWNwYXJzZSwgZnJhbWUpKSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChhYWNwYXJzZSwgIkZhaWxlZCB0byBwcmVwZW5kIEFEVFMgaGVhZGVycyB0byBmcmFtZSIpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorICB9CisKK2V4aXQ6CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgaWYgKHJldCkgeworICAgIC8qIGZvdW5kLCBza2lwIGlmIG5lZWRlZCAqLworICAgIGlmICgqc2tpcHNpemUgPiAwKQorICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgICpza2lwc2l6ZSA9IDA7CisgIH0gZWxzZSB7CisgICAgaWYgKCpza2lwc2l6ZSA8IDApCisgICAgICAqc2tpcHNpemUgPSAxOworICB9CisKKyAgaWYgKHJldCAmJiBmcmFtZXNpemUgPD0gbWFwLnNpemUpIHsKKyAgICByZXR1cm4gZ3N0X2Jhc2VfcGFyc2VfZmluaXNoX2ZyYW1lIChwYXJzZSwgZnJhbWUsIGZyYW1lc2l6ZSk7CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYWFjX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0QWFjUGFyc2UgKmFhY3BhcnNlID0gR1NUX0FBQ19QQVJTRSAocGFyc2UpOworCisgIGlmICghYWFjcGFyc2UtPnNlbnRfY29kZWNfdGFnKSB7CisgICAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgLyogY29kZWMgdGFnICovCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpKTsKKyAgICBpZiAoY2FwcyA9PSBOVUxMKSB7CisgICAgICBpZiAoR1NUX1BBRF9JU19GTFVTSElORyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpKSkgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHBhcnNlLCAiU3JjIHBhZCBpcyBmbHVzaGluZyIpOworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRkxVU0hJTkc7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHBhcnNlLCAiU3JjIHBhZCBpcyBub3QgbmVnb3RpYXRlZCEiKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICAgICAgfQorICAgIH0KKworICAgIHRhZ2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgIGdzdF9wYl91dGlsc19hZGRfY29kZWNfZGVzY3JpcHRpb25fdG9fdGFnX2xpc3QgKHRhZ2xpc3QsCisgICAgICAgIEdTVF9UQUdfQVVESU9fQ09ERUMsIGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgIGdzdF9iYXNlX3BhcnNlX21lcmdlX3RhZ3MgKHBhcnNlLCB0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UpOworICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnbGlzdCk7CisKKyAgICAvKiBhbHNvIHNpZ25hbHMgdGhlIGVuZCBvZiBmaXJzdC1mcmFtZSBwcm9jZXNzaW5nICovCisgICAgYWFjcGFyc2UtPnNlbnRfY29kZWNfdGFnID0gVFJVRTsKKyAgfQorCisgIC8qIEFzIGEgc3BlY2lhbCBjYXNlLCB3ZSBjYW4gcmVtb3ZlIHRoZSBBRFRTIGZyYW1pbmcgYW5kIG91dHB1dCByYXcgQUFDLiAqLworICBpZiAoYWFjcGFyc2UtPmhlYWRlcl90eXBlID09IERTUEFBQ19IRUFERVJfQURUUworICAgICAgJiYgYWFjcGFyc2UtPm91dHB1dF9oZWFkZXJfdHlwZSA9PSBEU1BBQUNfSEVBREVSX05PTkUpIHsKKyAgICBndWludCBoZWFkZXJfc2l6ZTsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBmcmFtZS0+b3V0X2J1ZmZlciA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoZnJhbWUtPmJ1ZmZlcik7CisgICAgZnJhbWUtPmJ1ZmZlciA9IE5VTEw7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKGZyYW1lLT5vdXRfYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIGhlYWRlcl9zaXplID0gKG1hcC5kYXRhWzFdICYgMSkgPyA3IDogOTsgICAgLyogb3B0aW9uYWwgQ1JDICovCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoZnJhbWUtPm91dF9idWZmZXIsICZtYXApOworICAgIGdzdF9idWZmZXJfcmVzaXplIChmcmFtZS0+b3V0X2J1ZmZlciwgaGVhZGVyX3NpemUsCisgICAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGZyYW1lLT5vdXRfYnVmZmVyKSAtIGhlYWRlcl9zaXplKTsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworCisvKioKKyAqIGdzdF9hYWNfcGFyc2Vfc3RhcnQ6CisgKiBAcGFyc2U6ICNHc3RCYXNlUGFyc2UuCisgKgorICogSW1wbGVtZW50YXRpb24gb2YgInN0YXJ0IiB2bWV0aG9kIGluICNHc3RCYXNlUGFyc2UgY2xhc3MuCisgKgorICogUmV0dXJuczogVFJVRSBpZiBzdGFydHVwIHN1Y2NlZWRlZC4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYWFjX3BhcnNlX3N0YXJ0IChHc3RCYXNlUGFyc2UgKiBwYXJzZSkKK3sKKyAgR3N0QWFjUGFyc2UgKmFhY3BhcnNlOworCisgIGFhY3BhcnNlID0gR1NUX0FBQ19QQVJTRSAocGFyc2UpOworICBHU1RfREVCVUcgKCJzdGFydCIpOworICBhYWNwYXJzZS0+ZnJhbWVfc2FtcGxlcyA9IDEwMjQ7CisgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGFhY3BhcnNlKSwgQURUU19NQVhfU0laRSk7CisgIGFhY3BhcnNlLT5zZW50X2NvZGVjX3RhZyA9IEZBTFNFOworICBhYWNwYXJzZS0+bGFzdF9wYXJzZWRfY2hhbm5lbHMgPSAwOworICBhYWNwYXJzZS0+bGFzdF9wYXJzZWRfc2FtcGxlX3JhdGUgPSAwOworICBhYWNwYXJzZS0+b2JqZWN0X3R5cGUgPSAwOworICBhYWNwYXJzZS0+Yml0cmF0ZSA9IDA7CisgIGFhY3BhcnNlLT5oZWFkZXJfdHlwZSA9IERTUEFBQ19IRUFERVJfTk9UX1BBUlNFRDsKKyAgYWFjcGFyc2UtPm91dHB1dF9oZWFkZXJfdHlwZSA9IERTUEFBQ19IRUFERVJfTk9UX1BBUlNFRDsKKyAgYWFjcGFyc2UtPmNoYW5uZWxzID0gMDsKKyAgYWFjcGFyc2UtPnNhbXBsZV9yYXRlID0gMDsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqCisgKiBnc3RfYWFjX3BhcnNlX3N0b3A6CisgKiBAcGFyc2U6ICNHc3RCYXNlUGFyc2UuCisgKgorICogSW1wbGVtZW50YXRpb24gb2YgInN0b3AiIHZtZXRob2QgaW4gI0dzdEJhc2VQYXJzZSBjbGFzcy4KKyAqCisgKiBSZXR1cm5zOiBUUlVFIGlzIHN0b3BwaW5nIHN1Y2NlZWRlZC4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYWFjX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKQoreworICBHU1RfREVCVUcgKCJzdG9wIik7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX2ZpZWxkcyAoR3N0Q2FwcyAqIGNhcHMpCit7CisgIGd1aW50IGksIG47CisKKyAgbiA9IGdzdF9jYXBzX2dldF9zaXplIChjYXBzKTsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIGkpOworCisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJmcmFtZWQiKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorYWRkX2NvbnZlcnNpb25fZmllbGRzIChHc3RDYXBzICogY2FwcykKK3sKKyAgZ3VpbnQgaSwgbjsKKworICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSk7CisKKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHMsICJzdHJlYW0tZm9ybWF0IikpIHsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqdiA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAic3RyZWFtLWZvcm1hdCIpOworCisgICAgICBpZiAoR19WQUxVRV9IT0xEU19TVFJJTkcgKHYpKSB7CisgICAgICAgIGNvbnN0IGdjaGFyICpzdHIgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKHYpOworCisgICAgICAgIGlmIChzdHJjbXAgKHN0ciwgImFkdHMiKSA9PSAwIHx8IHN0cmNtcCAoc3RyLCAicmF3IikgPT0gMCkgeworICAgICAgICAgIEdWYWx1ZSB2YSA9IEdfVkFMVUVfSU5JVDsKKyAgICAgICAgICBHVmFsdWUgdnMgPSBHX1ZBTFVFX0lOSVQ7CisKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZ2YSwgR1NUX1RZUEVfTElTVCk7CisgICAgICAgICAgZ192YWx1ZV9pbml0ICgmdnMsIEdfVFlQRV9TVFJJTkcpOworICAgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJnZzLCAiYWR0cyIpOworICAgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJnZhLCAmdnMpOworICAgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJnZzLCAicmF3Iik7CisgICAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmdmEsICZ2cyk7CisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKHMsICJzdHJlYW0tZm9ybWF0IiwgJnZhKTsKKyAgICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdmEpOworICAgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZ2cyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoR1NUX1ZBTFVFX0hPTERTX0xJU1QgKHYpKSB7CisgICAgICAgIGdib29sZWFuIGNvbnRhaW5zX3JhdyA9IEZBTFNFOworICAgICAgICBnYm9vbGVhbiBjb250YWluc19hZHRzID0gRkFMU0U7CisgICAgICAgIGd1aW50IG0gPSBnc3RfdmFsdWVfbGlzdF9nZXRfc2l6ZSAodiksIGo7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG07IGorKykgeworICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmUgPSBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKHYsIGopOworICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHI7CisKKyAgICAgICAgICBpZiAoR19WQUxVRV9IT0xEU19TVFJJTkcgKHZlKSAmJiAoc3RyID0gZ192YWx1ZV9nZXRfc3RyaW5nICh2ZSkpKSB7CisgICAgICAgICAgICBpZiAoc3RyY21wIChzdHIsICJhZHRzIikgPT0gMCkKKyAgICAgICAgICAgICAgY29udGFpbnNfYWR0cyA9IFRSVUU7CisgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKHN0ciwgInJhdyIpID09IDApCisgICAgICAgICAgICAgIGNvbnRhaW5zX3JhdyA9IFRSVUU7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnRhaW5zX2FkdHMgfHwgY29udGFpbnNfcmF3KSB7CisgICAgICAgICAgR1ZhbHVlIHZhID0gR19WQUxVRV9JTklUOworICAgICAgICAgIEdWYWx1ZSB2cyA9IEdfVkFMVUVfSU5JVDsKKworICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnZhLCBHU1RfVFlQRV9MSVNUKTsKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZ2cywgR19UWVBFX1NUUklORyk7CisgICAgICAgICAgZ192YWx1ZV9jb3B5ICh2LCAmdmEpOworCisgICAgICAgICAgaWYgKCFjb250YWluc19yYXcpIHsKKyAgICAgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJnZzLCAicmF3Iik7CisgICAgICAgICAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZ2YSwgJnZzKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFjb250YWluc19hZHRzKSB7CisgICAgICAgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKCZ2cywgImFkdHMiKTsKKyAgICAgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJnZhLCAmdnMpOworICAgICAgICAgIH0KKworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzLCAic3RyZWFtLWZvcm1hdCIsICZ2YSk7CisKKyAgICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdnMpOworICAgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZ2YSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2FhY19wYXJzZV9zaW5rX2dldGNhcHMgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICpwZWVyY2FwcywgKnRlbXBsOworICBHc3RDYXBzICpyZXM7CisKKyAgdGVtcGwgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU0lOS19QQUQgKHBhcnNlKSk7CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmZjb3B5ID0gZ3N0X2NhcHNfY29weSAoZmlsdGVyKTsKKyAgICAvKiBSZW1vdmUgdGhlIGZpZWxkcyB3ZSBjb252ZXJ0ICovCisgICAgcmVtb3ZlX2ZpZWxkcyAoZmNvcHkpOworICAgIGFkZF9jb252ZXJzaW9uX2ZpZWxkcyAoZmNvcHkpOworICAgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgZmNvcHkpOworICAgIGdzdF9jYXBzX3VucmVmIChmY29weSk7CisgIH0gZWxzZQorICAgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgTlVMTCk7CisKKyAgaWYgKHBlZXJjYXBzKSB7CisgICAgcGVlcmNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChwZWVyY2Fwcyk7CisgICAgLyogUmVtb3ZlIHRoZSBmaWVsZHMgd2UgY29udmVydCAqLworICAgIHJlbW92ZV9maWVsZHMgKHBlZXJjYXBzKTsKKyAgICBhZGRfY29udmVyc2lvbl9maWVsZHMgKHBlZXJjYXBzKTsKKworICAgIHJlcyA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChwZWVyY2FwcywgdGVtcGwsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGVtcGwpOworICB9IGVsc2UgeworICAgIHJlcyA9IHRlbXBsOworICB9CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmludGVyc2VjdGlvbjsKKworICAgIGludGVyc2VjdGlvbiA9CisgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHJlcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmVzKTsKKyAgICByZXMgPSBpbnRlcnNlY3Rpb247CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYWNfcGFyc2Vfc3JjX2V2ZW50IChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0QWFjUGFyc2UgKmFhY3BhcnNlID0gR1NUX0FBQ19QQVJTRSAocGFyc2UpOworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9GTFVTSF9TVE9QKSB7CisgICAgYWFjcGFyc2UtPmxhc3RfcGFyc2VkX2NoYW5uZWxzID0gMDsKKyAgICBhYWNwYXJzZS0+bGFzdF9wYXJzZWRfc2FtcGxlX3JhdGUgPSAwOworICB9CisKKyAgcmV0dXJuIEdTVF9CQVNFX1BBUlNFX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zcmNfZXZlbnQgKHBhcnNlLCBldmVudCk7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmggYi9nc3QvYXVkaW9wYXJzZXJzL2dzdGFhY3BhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjOTZmZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0YWFjcGFyc2UuaApAQCAtMCwwICsxLDEwNSBAQAorLyogR1N0cmVhbWVyIEFBQyBwYXJzZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0OiBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQUFDX1BBUlNFX0hfXworI2RlZmluZSBfX0dTVF9BQUNfUEFSU0VfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXBhcnNlLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9BQUNfUEFSU0UgXAorICAoZ3N0X2FhY19wYXJzZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQUFDX1BBUlNFKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksIEdTVF9UWVBFX0FBQ19QQVJTRSwgR3N0QWFjUGFyc2UpKQorI2RlZmluZSBHU1RfQUFDX1BBUlNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLCBHU1RfVFlQRV9BQUNfUEFSU0UsIEdzdEFhY1BhcnNlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQUFDX1BBUlNFKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksIEdTVF9UWVBFX0FBQ19QQVJTRSkpCisjZGVmaW5lIEdTVF9JU19BQUNfUEFSU0VfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksIEdTVF9UWVBFX0FBQ19QQVJTRSkpCisKKworLyoqCisgKiBHc3RBYWNIZWFkZXJUeXBlOgorICogQERTUEFBQ19IRUFERVJfTk9UX1BBUlNFRDogSGVhZGVyIG5vdCBwYXJzZWQgeWV0LgorICogQERTUEFBQ19IRUFERVJfVU5LTk9XTjogVW5rbm93biAobm90IHJlY29nbml6ZWQpIGhlYWRlci4KKyAqIEBEU1BBQUNfSEVBREVSX0FESUY6IEFESUYgaGVhZGVyIGZvdW5kLgorICogQERTUEFBQ19IRUFERVJfQURUUzogQURUUyBoZWFkZXIgZm91bmQuCisgKiBARFNQQUFDX0hFQURFUl9MT0FTOiBMT0FTIGhlYWRlciBmb3VuZC4KKyAqIEBEU1BBQUNfSEVBREVSX05PTkU6IFJhdyBzdHJlYW0sIG5vIGhlYWRlci4KKyAqCisgKiBUeXBlIGhlYWRlciBlbnVtZXJhdGlvbiBzZXQgaW4gI2hlYWRlcl90eXBlLgorICovCit0eXBlZGVmIGVudW0geworICBEU1BBQUNfSEVBREVSX05PVF9QQVJTRUQsCisgIERTUEFBQ19IRUFERVJfVU5LTk9XTiwKKyAgRFNQQUFDX0hFQURFUl9BRElGLAorICBEU1BBQUNfSEVBREVSX0FEVFMsCisgIERTUEFBQ19IRUFERVJfTE9BUywKKyAgRFNQQUFDX0hFQURFUl9OT05FCit9IEdzdEFhY0hlYWRlclR5cGU7CisKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEFhY1BhcnNlIEdzdEFhY1BhcnNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEFhY1BhcnNlQ2xhc3MgR3N0QWFjUGFyc2VDbGFzczsKKworLyoqCisgKiBHc3RBYWNQYXJzZToKKyAqCisgKiBUaGUgb3BhcXVlIEdzdEFhY1BhcnNlIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdEFhY1BhcnNlIHsKKyAgR3N0QmFzZVBhcnNlIGVsZW1lbnQ7CisKKyAgLyogU3RyZWFtIHR5cGUgLXJlbGF0ZWQgaW5mbyAqLworICBnaW50ICAgICAgICAgICBvYmplY3RfdHlwZTsKKyAgZ2ludCAgICAgICAgICAgYml0cmF0ZTsKKyAgZ2ludCAgICAgICAgICAgc2FtcGxlX3JhdGU7CisgIGdpbnQgICAgICAgICAgIGNoYW5uZWxzOworICBnaW50ICAgICAgICAgICBtcGVndmVyc2lvbjsKKyAgZ2ludCAgICAgICAgICAgZnJhbWVfc2FtcGxlczsKKworICBHc3RBYWNIZWFkZXJUeXBlIGhlYWRlcl90eXBlOworICBHc3RBYWNIZWFkZXJUeXBlIG91dHB1dF9oZWFkZXJfdHlwZTsKKworICBnYm9vbGVhbiBzZW50X2NvZGVjX3RhZzsKKworICBnaW50IGxhc3RfcGFyc2VkX3NhbXBsZV9yYXRlOworICBnaW50IGxhc3RfcGFyc2VkX2NoYW5uZWxzOworfTsKKworLyoqCisgKiBHc3RBYWNQYXJzZUNsYXNzOgorICogQHBhcmVudF9jbGFzczogRWxlbWVudCBwYXJlbnQgY2xhc3MuCisgKgorICogVGhlIG9wYXF1ZSBHc3RBYWNQYXJzZUNsYXNzIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdEFhY1BhcnNlQ2xhc3MgeworICBHc3RCYXNlUGFyc2VDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfYWFjX3BhcnNlX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0FBQ19QQVJTRV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYyBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmM4NzcwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5jCkBAIC0wLDAgKzEsOTUzIEBACisvKiBHU3RyZWFtZXIgQUMzIHBhcnNlcgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXcgdXNlcnMgc2YgbmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBDb250YWN0OiBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hYzNwYXJzZQorICogQHNob3J0X2Rlc2NyaXB0aW9uOiBBQzMgcGFyc2VyCisgKiBAc2VlX2Fsc286ICNHc3RBbXJQYXJzZSwgI0dzdEFBQ1BhcnNlCisgKgorICogVGhpcyBpcyBhbiBBQzMgcGFyc2VyLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPWFiYy5hYzMgISBhYzNwYXJzZSAhIGE1MmRlYyAhIGF1ZGlvcmVzYW1wbGUgISBhdWRpb2NvbnZlcnQgISBhdXRvYXVkaW9zaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisvKiBUT0RPOgorICogIC0gYXVkaW8vYWMzIHRvIGF1ZGlvL3gtcHJpdmF0ZTEtYWMzIGlzIG5vdCBpbXBsZW1lbnRlZCAoZG9uZSBpbiB0aGUgbXV4ZXIpCisgKiAgLSBzaG91bGQgYWNjZXB0IGZyYW1lZCBhbmQgdW5mcmFtZWQgaW5wdXQgKG5lZWRzIGRlY29kZWJpbiBmaXhlcyBmaXJzdCkKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdGFjM3BhcnNlLmgiCisjaW5jbHVkZSA8Z3N0L2Jhc2UvYmFzZS5oPgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL3BidXRpbHMuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoYWMzX3BhcnNlX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGFjM19wYXJzZV9kZWJ1ZworCitzdGF0aWMgY29uc3Qgc3RydWN0Cit7CisgIGNvbnN0IGd1aW50IGJpdF9yYXRlOyAgICAgICAgIC8qIG5vbWluYWwgYml0IHJhdGUgKi8KKyAgY29uc3QgZ3VpbnQgZnJhbWVfc2l6ZVszXTsgICAgLyogZnJhbWUgc2l6ZSBmb3IgMzJrSHosIDQ0a0h6LCBhbmQgNDhrSHogKi8KK30gZnJtc2l6Y29kX3RhYmxlWzM4XSA9IHsKKyAgeworICAgIDMyLCB7CisgIDY0LCA2OSwgOTZ9fSwgeworICAgIDMyLCB7CisgIDY0LCA3MCwgOTZ9fSwgeworICAgIDQwLCB7CisgIDgwLCA4NywgMTIwfX0sIHsKKyAgICA0MCwgeworICA4MCwgODgsIDEyMH19LCB7CisgICAgNDgsIHsKKyAgOTYsIDEwNCwgMTQ0fX0sIHsKKyAgICA0OCwgeworICA5NiwgMTA1LCAxNDR9fSwgeworICAgIDU2LCB7CisgIDExMiwgMTIxLCAxNjh9fSwgeworICAgIDU2LCB7CisgIDExMiwgMTIyLCAxNjh9fSwgeworICAgIDY0LCB7CisgIDEyOCwgMTM5LCAxOTJ9fSwgeworICAgIDY0LCB7CisgIDEyOCwgMTQwLCAxOTJ9fSwgeworICAgIDgwLCB7CisgIDE2MCwgMTc0LCAyNDB9fSwgeworICAgIDgwLCB7CisgIDE2MCwgMTc1LCAyNDB9fSwgeworICAgIDk2LCB7CisgIDE5MiwgMjA4LCAyODh9fSwgeworICAgIDk2LCB7CisgIDE5MiwgMjA5LCAyODh9fSwgeworICAgIDExMiwgeworICAyMjQsIDI0MywgMzM2fX0sIHsKKyAgICAxMTIsIHsKKyAgMjI0LCAyNDQsIDMzNn19LCB7CisgICAgMTI4LCB7CisgIDI1NiwgMjc4LCAzODR9fSwgeworICAgIDEyOCwgeworICAyNTYsIDI3OSwgMzg0fX0sIHsKKyAgICAxNjAsIHsKKyAgMzIwLCAzNDgsIDQ4MH19LCB7CisgICAgMTYwLCB7CisgIDMyMCwgMzQ5LCA0ODB9fSwgeworICAgIDE5MiwgeworICAzODQsIDQxNywgNTc2fX0sIHsKKyAgICAxOTIsIHsKKyAgMzg0LCA0MTgsIDU3Nn19LCB7CisgICAgMjI0LCB7CisgIDQ0OCwgNDg3LCA2NzJ9fSwgeworICAgIDIyNCwgeworICA0NDgsIDQ4OCwgNjcyfX0sIHsKKyAgICAyNTYsIHsKKyAgNTEyLCA1NTcsIDc2OH19LCB7CisgICAgMjU2LCB7CisgIDUxMiwgNTU4LCA3Njh9fSwgeworICAgIDMyMCwgeworICA2NDAsIDY5NiwgOTYwfX0sIHsKKyAgICAzMjAsIHsKKyAgNjQwLCA2OTcsIDk2MH19LCB7CisgICAgMzg0LCB7CisgIDc2OCwgODM1LCAxMTUyfX0sIHsKKyAgICAzODQsIHsKKyAgNzY4LCA4MzYsIDExNTJ9fSwgeworICAgIDQ0OCwgeworICA4OTYsIDk3NSwgMTM0NH19LCB7CisgICAgNDQ4LCB7CisgIDg5NiwgOTc2LCAxMzQ0fX0sIHsKKyAgICA1MTIsIHsKKyAgMTAyNCwgMTExNCwgMTUzNn19LCB7CisgICAgNTEyLCB7CisgIDEwMjQsIDExMTUsIDE1MzZ9fSwgeworICAgIDU3NiwgeworICAxMTUyLCAxMjUzLCAxNzI4fX0sIHsKKyAgICA1NzYsIHsKKyAgMTE1MiwgMTI1NCwgMTcyOH19LCB7CisgICAgNjQwLCB7CisgIDEyODAsIDEzOTMsIDE5MjB9fSwgeworICAgIDY0MCwgeworICAxMjgwLCAxMzk0LCAxOTIwfX0KK307CisKK3N0YXRpYyBjb25zdCBndWludCBmc2NvZF9yYXRlc1s0XSA9IHsgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMCB9Oworc3RhdGljIGNvbnN0IGd1aW50IGFjbW9kX2NoYW5zWzhdID0geyAyLCAxLCAyLCAzLCAzLCA0LCA0LCA1IH07CitzdGF0aWMgY29uc3QgZ3VpbnQgbnVtYmxrc1s0XSA9IHsgMSwgMiwgMywgNiB9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtYWMzLCBmcmFtZWQgPSAoYm9vbGVhbikgdHJ1ZSwgIgorICAgICAgICAiIGNoYW5uZWxzID0gKGludCkgWyAxLCA2IF0sIHJhdGUgPSAoaW50KSBbIDgwMDAsIDQ4MDAwIF0sICIKKyAgICAgICAgIiBhbGlnbm1lbnQgPSAoc3RyaW5nKSB7IGllYzYxOTM3LCBmcmFtZX07ICIKKyAgICAgICAgImF1ZGlvL3gtZWFjMywgZnJhbWVkID0gKGJvb2xlYW4pIHRydWUsICIKKyAgICAgICAgIiBjaGFubmVscyA9IChpbnQpIFsgMSwgNiBdLCByYXRlID0gKGludCkgWyA4MDAwLCA0ODAwMCBdLCAiCisgICAgICAgICIgYWxpZ25tZW50ID0gKHN0cmluZykgeyBpZWM2MTkzNywgZnJhbWV9OyAiKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1hYzM7ICIgImF1ZGlvL3gtZWFjMzsgIiAiYXVkaW8vYWMzOyAiCisgICAgICAgICJhdWRpby94LXByaXZhdGUxLWFjMyIpKTsKKworc3RhdGljIHZvaWQgZ3N0X2FjM19wYXJzZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYWMzX3BhcnNlX3N0YXJ0IChHc3RCYXNlUGFyc2UgKiBwYXJzZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2FjM19wYXJzZV9zdG9wIChHc3RCYXNlUGFyc2UgKiBwYXJzZSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfYWMzX3BhcnNlX2hhbmRsZV9mcmFtZSAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSwgZ2ludCAqIHNraXBzaXplKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hYzNfcGFyc2VfcHJlX3B1c2hfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUpOworc3RhdGljIGdib29sZWFuIGdzdF9hYzNfcGFyc2Vfc3JjX2V2ZW50IChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfYWMzX3BhcnNlX2dldF9zaW5rX2NhcHMgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9hYzNfcGFyc2Vfc2V0X3NpbmtfY2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworCisjZGVmaW5lIGdzdF9hYzNfcGFyc2VfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0QWMzUGFyc2UsIGdzdF9hYzNfcGFyc2UsIEdTVF9UWVBFX0JBU0VfUEFSU0UpOworCitzdGF0aWMgdm9pZAorZ3N0X2FjM19wYXJzZV9jbGFzc19pbml0IChHc3RBYzNQYXJzZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QmFzZVBhcnNlQ2xhc3MgKnBhcnNlX2NsYXNzID0gR1NUX0JBU0VfUEFSU0VfQ0xBU1MgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoYWMzX3BhcnNlX2RlYnVnLCAiYWMzcGFyc2UiLCAwLAorICAgICAgIkFDMyBhdWRpbyBzdHJlYW0gcGFyc2VyIik7CisKKyAgb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9hYzNfcGFyc2VfZmluYWxpemU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiQUMzIGF1ZGlvIHN0cmVhbSBwYXJzZXIiLCAiQ29kZWMvUGFyc2VyL0NvbnZlcnRlci9BdWRpbyIsCisgICAgICAiQUMzIHBhcnNlciIsICJUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PiIpOworCisgIHBhcnNlX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWMzX3BhcnNlX3N0YXJ0KTsKKyAgcGFyc2VfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FjM19wYXJzZV9zdG9wKTsKKyAgcGFyc2VfY2xhc3MtPmhhbmRsZV9mcmFtZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWMzX3BhcnNlX2hhbmRsZV9mcmFtZSk7CisgIHBhcnNlX2NsYXNzLT5wcmVfcHVzaF9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FjM19wYXJzZV9wcmVfcHVzaF9mcmFtZSk7CisgIHBhcnNlX2NsYXNzLT5zcmNfZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FjM19wYXJzZV9zcmNfZXZlbnQpOworICBwYXJzZV9jbGFzcy0+Z2V0X3NpbmtfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWMzX3BhcnNlX2dldF9zaW5rX2NhcHMpOworICBwYXJzZV9jbGFzcy0+c2V0X3NpbmtfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWMzX3BhcnNlX3NldF9zaW5rX2NhcHMpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FjM19wYXJzZV9yZXNldCAoR3N0QWMzUGFyc2UgKiBhYzNwYXJzZSkKK3sKKyAgYWMzcGFyc2UtPmNoYW5uZWxzID0gLTE7CisgIGFjM3BhcnNlLT5zYW1wbGVfcmF0ZSA9IC0xOworICBhYzNwYXJzZS0+YmxvY2tzID0gLTE7CisgIGFjM3BhcnNlLT5lYWMgPSBGQUxTRTsKKyAgYWMzcGFyc2UtPnNlbnRfY29kZWNfdGFnID0gRkFMU0U7CisgIGdfYXRvbWljX2ludF9zZXQgKCZhYzNwYXJzZS0+YWxpZ24sIEdTVF9BQzNfUEFSU0VfQUxJR05fTk9ORSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWMzX3BhcnNlX2luaXQgKEdzdEFjM1BhcnNlICogYWMzcGFyc2UpCit7CisgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGFjM3BhcnNlKSwgOCk7CisgIGdzdF9hYzNfcGFyc2VfcmVzZXQgKGFjM3BhcnNlKTsKKyAgYWMzcGFyc2UtPmJhc2VwYXJzZV9jaGFpbmZ1bmMgPQorICAgICAgR1NUX0JBU0VfUEFSU0VfU0lOS19QQUQgKEdTVF9CQVNFX1BBUlNFIChhYzNwYXJzZSkpLT5jaGFpbmZ1bmM7CisgIEdTVF9QQURfU0VUX0FDQ0VQVF9JTlRFUlNFQ1QgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChhYzNwYXJzZSkpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChhYzNwYXJzZSkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FjM19wYXJzZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYzNfcGFyc2Vfc3RhcnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKQoreworICBHc3RBYzNQYXJzZSAqYWMzcGFyc2UgPSBHU1RfQUMzX1BBUlNFIChwYXJzZSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJzdGFydGluZyIpOworCisgIGdzdF9hYzNfcGFyc2VfcmVzZXQgKGFjM3BhcnNlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYWMzX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKQoreworICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgInN0b3BwaW5nIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWMzX3BhcnNlX3NldF9hbGlnbm1lbnQgKEdzdEFjM1BhcnNlICogYWMzcGFyc2UsIGdib29sZWFuIGVhYykKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0U3RydWN0dXJlICpzdDsKKyAgY29uc3QgZ2NoYXIgKnN0ciA9IE5VTEw7CisgIGludCBpOworCisgIGlmIChHX0xJS0VMWSAoIWVhYykpCisgICAgZ290byBkb25lOworCisgIGNhcHMgPSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKGFjM3BhcnNlKSk7CisKKyAgaWYgKCFjYXBzKQorICAgIGdvdG8gZG9uZTsKKworICBmb3IgKGkgPSAwOyBpIDwgZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOyBpKyspIHsKKyAgICBzdCA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIGkpOworCisgICAgaWYgKCFnX3N0cl9lcXVhbCAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3QpLCAiYXVkaW8veC1lYWMzIikpCisgICAgICBjb250aW51ZTsKKworICAgIGlmICgoc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdCwgImFsaWdubWVudCIpKSkgeworICAgICAgaWYgKGdfc3RyX2VxdWFsIChzdHIsICJpZWM2MTkzNyIpKSB7CisgICAgICAgIGdfYXRvbWljX2ludF9zZXQgKCZhYzNwYXJzZS0+YWxpZ24sIEdTVF9BQzNfUEFSU0VfQUxJR05fSUVDNjE5MzcpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhYzNwYXJzZSwgInBpY2tlZCBpZWM2MTkzNyBhbGlnbm1lbnQiKTsKKyAgICAgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKHN0ciwgImZyYW1lIikgPT0gMCkgeworICAgICAgICBnX2F0b21pY19pbnRfc2V0ICgmYWMzcGFyc2UtPmFsaWduLCBHU1RfQUMzX1BBUlNFX0FMSUdOX0ZSQU1FKTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYWMzcGFyc2UsICJwaWNrZWQgZnJhbWUgYWxpZ25tZW50Iik7CisgICAgICB9IGVsc2UgeworICAgICAgICBnX2F0b21pY19pbnRfc2V0ICgmYWMzcGFyc2UtPmFsaWduLCBHU1RfQUMzX1BBUlNFX0FMSUdOX0ZSQU1FKTsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhYzNwYXJzZSwgInVua25vd24gYWxpZ25tZW50OiAlcyIsIHN0cik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoY2FwcykKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKK2RvbmU6CisgIC8qIGRlZmF1bHQgKi8KKyAgaWYgKGFjM3BhcnNlLT5hbGlnbiA9PSBHU1RfQUMzX1BBUlNFX0FMSUdOX05PTkUpIHsKKyAgICBnX2F0b21pY19pbnRfc2V0ICgmYWMzcGFyc2UtPmFsaWduLCBHU1RfQUMzX1BBUlNFX0FMSUdOX0ZSQU1FKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhYzNwYXJzZSwgInBpY2tlZCBzeW5jZnJhbWUgYWxpZ25tZW50Iik7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYWMzX3BhcnNlX2ZyYW1lX2hlYWRlcl9hYzMgKEdzdEFjM1BhcnNlICogYWMzcGFyc2UsIEdzdEJ1ZmZlciAqIGJ1ZiwKKyAgICBnaW50IHNraXAsIGd1aW50ICogZnJhbWVfc2l6ZSwgZ3VpbnQgKiByYXRlLCBndWludCAqIGNoYW5zLCBndWludCAqIGJsa3MsCisgICAgZ3VpbnQgKiBzaWQpCit7CisgIEdzdEJpdFJlYWRlciBiaXRzOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4IGZzY29kLCBmcm1zaXpjb2QsIGJzaWQsIGFjbW9kLCBsZmVfb24sIHJhdGVfc2NhbGU7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIEdTVF9MT0dfT0JKRUNUIChhYzNwYXJzZSwgInBhcnNpbmcgYWMzIik7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZ3N0X2JpdF9yZWFkZXJfaW5pdCAoJmJpdHMsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIGdzdF9iaXRfcmVhZGVyX3NraXBfdW5jaGVja2VkICgmYml0cywgc2tpcCAqIDgpOworCisgIGdzdF9iaXRfcmVhZGVyX3NraXBfdW5jaGVja2VkICgmYml0cywgMTYgKyAxNik7CisgIGZzY29kID0gZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmYml0cywgMik7CisgIGZybXNpemNvZCA9IGdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4X3VuY2hlY2tlZCAoJmJpdHMsIDYpOworCisgIGlmIChHX1VOTElLRUxZIChmc2NvZCA9PSAzIHx8IGZybXNpemNvZCA+PSBHX05fRUxFTUVOVFMgKGZybXNpemNvZF90YWJsZSkpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYWMzcGFyc2UsICJiYWQgZnNjb2Q9JWQgZnJtc2l6Y29kPSVkIiwgZnNjb2QsIGZybXNpemNvZCk7CisgICAgZ290byBjbGVhbnVwOworICB9CisKKyAgYnNpZCA9IGdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4X3VuY2hlY2tlZCAoJmJpdHMsIDUpOworICBnc3RfYml0X3JlYWRlcl9za2lwX3VuY2hlY2tlZCAoJmJpdHMsIDMpOyAgICAgLyogYnNtb2QgKi8KKyAgYWNtb2QgPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OF91bmNoZWNrZWQgKCZiaXRzLCAzKTsKKworICAvKiBzcGVjIG5vdCBxdWl0ZSBjbGVhciBoZXJlOiBkZWNvZGVyIHNob3VsZCBkZWNvZGUgaWYgbGVzcyB0aGFuIDgsCisgICAqIGJ1dCBzZWVtaW5nbHkgb25seSBkZWZpbmVzIDYgYW5kIDggY2FzZXMgKi8KKyAgLyogRmlsZXMgd2l0aCA5IGFuZCAxMCBoYXBwZW4sIGFuZCBzZWVtIHRvIGNvbXBseSB3aXRoIHRoZSA8PSA4CisgICAgIGZvcm1hdCwgc28gbGV0IHRoZW0gdGhyb3VnaC4gVGhlIHNwZWMgc2F5cyBub3RoaW5nIGFib3V0IDkgYW5kIDEwICovCisgIGlmIChic2lkID4gMTApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhYzNwYXJzZSwgInVuZXhwZWN0ZWQgYnNpZD0lZCIsIGJzaWQpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfSBlbHNlIGlmIChic2lkICE9IDggJiYgYnNpZCAhPSA2KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYWMzcGFyc2UsICJ1bmRlZmluZWQgYnNpZD0lZCIsIGJzaWQpOworICB9CisKKyAgaWYgKChhY21vZCAmIDB4MSkgJiYgKGFjbW9kICE9IDB4MSkpICAvKiAzIGZyb250IGNoYW5uZWxzICovCisgICAgZ3N0X2JpdF9yZWFkZXJfc2tpcF91bmNoZWNrZWQgKCZiaXRzLCAyKTsKKyAgaWYgKChhY21vZCAmIDB4NCkpICAgICAgICAgICAgLyogaWYgYSBzdXJyb3VuZCBjaGFubmVsIGV4aXN0cyAqLworICAgIGdzdF9iaXRfcmVhZGVyX3NraXBfdW5jaGVja2VkICgmYml0cywgMik7CisgIGlmIChhY21vZCA9PSAweDIpICAgICAgICAgICAgIC8qIGlmIGluIDIvMCBtb2RlICovCisgICAgZ3N0X2JpdF9yZWFkZXJfc2tpcF91bmNoZWNrZWQgKCZiaXRzLCAyKTsKKworICBsZmVfb24gPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OF91bmNoZWNrZWQgKCZiaXRzLCAxKTsKKworICAvKiA2LzgtPjAsIDktPjEsIDEwLT4yLAorICAgICBzZWUgaHR0cDovL21hdHJvc2thLm9yZy90ZWNobmljYWwvc3BlY3MvY29kZWNpZC9pbmRleC5odG1sICovCisgIHJhdGVfc2NhbGUgPSAoQ0xBTVAgKGJzaWQsIDgsIDEwKSAtIDgpOworCisgIGlmIChmcmFtZV9zaXplKQorICAgICpmcmFtZV9zaXplID0gZnJtc2l6Y29kX3RhYmxlW2ZybXNpemNvZF0uZnJhbWVfc2l6ZVtmc2NvZF0gKiAyOworICBpZiAocmF0ZSkKKyAgICAqcmF0ZSA9IGZzY29kX3JhdGVzW2ZzY29kXSA+PiByYXRlX3NjYWxlOworICBpZiAoY2hhbnMpCisgICAgKmNoYW5zID0gYWNtb2RfY2hhbnNbYWNtb2RdICsgbGZlX29uOworICBpZiAoYmxrcykKKyAgICAqYmxrcyA9IDY7CisgIGlmIChzaWQpCisgICAgKnNpZCA9IDA7CisKKyAgcmV0ID0gVFJVRTsKKworY2xlYW51cDoKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYzNfcGFyc2VfZnJhbWVfaGVhZGVyX2VhYzMgKEdzdEFjM1BhcnNlICogYWMzcGFyc2UsIEdzdEJ1ZmZlciAqIGJ1ZiwKKyAgICBnaW50IHNraXAsIGd1aW50ICogZnJhbWVfc2l6ZSwgZ3VpbnQgKiByYXRlLCBndWludCAqIGNoYW5zLCBndWludCAqIGJsa3MsCisgICAgZ3VpbnQgKiBzaWQpCit7CisgIEdzdEJpdFJlYWRlciBiaXRzOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQxNiBmcm1zaXosIHNhbXBsZV9yYXRlLCBibG9ja3M7CisgIGd1aW50OCBzdHJtdHlwLCBmc2NvZCwgZnNjb2QyLCBhY21vZCwgbGZlX29uLCBzdHJtaWQsIG51bWJsa3Njb2Q7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIEdTVF9MT0dfT0JKRUNUIChhYzNwYXJzZSwgInBhcnNpbmcgZS1hYzMiKTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBnc3RfYml0X3JlYWRlcl9pbml0ICgmYml0cywgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgZ3N0X2JpdF9yZWFkZXJfc2tpcF91bmNoZWNrZWQgKCZiaXRzLCBza2lwICogOCk7CisKKyAgZ3N0X2JpdF9yZWFkZXJfc2tpcF91bmNoZWNrZWQgKCZiaXRzLCAxNik7CisgIHN0cm10eXAgPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OF91bmNoZWNrZWQgKCZiaXRzLCAyKTsgLyogc3RybXR5cCAgICAgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHN0cm10eXAgPT0gMykpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhYzNwYXJzZSwgImJhZCBzdHJtdHlwICVkIiwgc3RybXR5cCk7CisgICAgZ290byBjbGVhbnVwOworICB9CisKKyAgc3RybWlkID0gZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmYml0cywgMyk7ICAvKiBzdWJzdHJlYW1pZCAqLworICBmcm1zaXogPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MTZfdW5jaGVja2VkICgmYml0cywgMTEpOyAgICAgICAgLyogZnJtc2l6ICAgICAgKi8KKyAgZnNjb2QgPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OF91bmNoZWNrZWQgKCZiaXRzLCAyKTsgICAvKiBmc2NvZCAgICAgICAqLworICBpZiAoZnNjb2QgPT0gMykgeworICAgIGZzY29kMiA9IGdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4X3VuY2hlY2tlZCAoJmJpdHMsIDIpOyAgICAgICAgLyogZnNjb2QyICAgICAgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAoZnNjb2QyID09IDMpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhYzNwYXJzZSwgImludmFsaWQgZnNjb2QyIik7CisgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorICAgIHNhbXBsZV9yYXRlID0gZnNjb2RfcmF0ZXNbZnNjb2QyXSAvIDI7CisgICAgYmxvY2tzID0gNjsKKyAgfSBlbHNlIHsKKyAgICBudW1ibGtzY29kID0gZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmYml0cywgMik7ICAgIC8qIG51bWJsa3Njb2QgICovCisgICAgc2FtcGxlX3JhdGUgPSBmc2NvZF9yYXRlc1tmc2NvZF07CisgICAgYmxvY2tzID0gbnVtYmxrc1tudW1ibGtzY29kXTsKKyAgfQorCisgIGFjbW9kID0gZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmYml0cywgMyk7ICAgLyogYWNtb2QgICAgICAgKi8KKyAgbGZlX29uID0gZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmYml0cywgMSk7ICAvKiBsZmVvbiAgICAgICAqLworCisgIGdzdF9iaXRfcmVhZGVyX3NraXBfdW5jaGVja2VkICgmYml0cywgNSk7ICAgICAvKiBic2lkICAgICAgICAqLworCisgIGlmIChmcmFtZV9zaXplKQorICAgICpmcmFtZV9zaXplID0gKGZybXNpeiArIDEpICogMjsKKyAgaWYgKHJhdGUpCisgICAgKnJhdGUgPSBzYW1wbGVfcmF0ZTsKKyAgaWYgKGNoYW5zKQorICAgICpjaGFucyA9IGFjbW9kX2NoYW5zW2FjbW9kXSArIGxmZV9vbjsKKyAgaWYgKGJsa3MpCisgICAgKmJsa3MgPSBibG9ja3M7CisgIGlmIChzaWQpCisgICAgKnNpZCA9IChzdHJtdHlwICYgMHgxKSA8PCAzIHwgc3RybWlkOworCisgIHJldCA9IFRSVUU7CisKK2NsZWFudXA6CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYWMzX3BhcnNlX2ZyYW1lX2hlYWRlciAoR3N0QWMzUGFyc2UgKiBwYXJzZSwgR3N0QnVmZmVyICogYnVmLCBnaW50IHNraXAsCisgICAgZ3VpbnQgKiBmcmFtZXNpemUsIGd1aW50ICogcmF0ZSwgZ3VpbnQgKiBjaGFucywgZ3VpbnQgKiBibG9ja3MsCisgICAgZ3VpbnQgKiBzaWQsIGdib29sZWFuICogZWFjKQoreworICBHc3RCaXRSZWFkZXIgYml0czsKKyAgZ3VpbnQxNiBzeW5jOworICBndWludDggYnNpZDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGdzdF9iaXRfcmVhZGVyX2luaXQgKCZiaXRzLCBtYXAuZGF0YSwgbWFwLnNpemUpOworCisgIEdTVF9NRU1EVU1QX09CSkVDVCAocGFyc2UsICJBQzMgZnJhbWUgc3luYyIsIG1hcC5kYXRhLCBNSU4gKG1hcC5zaXplLCAxNikpOworCisgIGdzdF9iaXRfcmVhZGVyX3NraXBfdW5jaGVja2VkICgmYml0cywgc2tpcCAqIDgpOworCisgIHN5bmMgPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MTZfdW5jaGVja2VkICgmYml0cywgMTYpOworICBnc3RfYml0X3JlYWRlcl9za2lwX3VuY2hlY2tlZCAoJmJpdHMsIDE2ICsgOCk7CisgIGJzaWQgPSBnc3RfYml0X3JlYWRlcl9wZWVrX2JpdHNfdWludDhfdW5jaGVja2VkICgmYml0cywgNSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHN5bmMgIT0gMHgwYjc3KSkKKyAgICBnb3RvIGNsZWFudXA7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAiYnNpZCA9ICVkIiwgYnNpZCk7CisKKyAgaWYgKGJzaWQgPD0gMTApIHsKKyAgICBpZiAoZWFjKQorICAgICAgKmVhYyA9IEZBTFNFOworICAgIHJldCA9IGdzdF9hYzNfcGFyc2VfZnJhbWVfaGVhZGVyX2FjMyAocGFyc2UsIGJ1Ziwgc2tpcCwgZnJhbWVzaXplLCByYXRlLAorICAgICAgICBjaGFucywgYmxvY2tzLCBzaWQpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfSBlbHNlIGlmIChic2lkIDw9IDE2KSB7CisgICAgaWYgKGVhYykKKyAgICAgICplYWMgPSBUUlVFOworICAgIHJldCA9IGdzdF9hYzNfcGFyc2VfZnJhbWVfaGVhZGVyX2VhYzMgKHBhcnNlLCBidWYsIHNraXAsIGZyYW1lc2l6ZSwgcmF0ZSwKKyAgICAgICAgY2hhbnMsIGJsb2Nrcywgc2lkKTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJ1bmV4cGVjdGVkIGJzaWQgJWQiLCBic2lkKTsKKyAgICByZXQgPSBGQUxTRTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgInVuZXhwZWN0ZWQgYnNpZCAlZCIsIGJzaWQpOworCitjbGVhbnVwOgorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYWMzX3BhcnNlX2hhbmRsZV9mcmFtZSAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSwgZ2ludCAqIHNraXBzaXplKQoreworICBHc3RBYzNQYXJzZSAqYWMzcGFyc2UgPSBHU1RfQUMzX1BBUlNFIChwYXJzZSk7CisgIEdzdEJ1ZmZlciAqYnVmID0gZnJhbWUtPmJ1ZmZlcjsKKyAgR3N0Qnl0ZVJlYWRlciByZWFkZXI7CisgIGdpbnQgb2ZmOworICBnYm9vbGVhbiBsb3N0X3N5bmMsIGRyYWluaW5nLCBlYWMsIG1vcmUgPSBGQUxTRTsKKyAgZ3VpbnQgZnJtc2l6LCBibG9ja3MsIHNpZDsKKyAgZ3VpbnQgcmF0ZSwgY2hhbnM7CisgIGdib29sZWFuIHVwZGF0ZV9yYXRlID0gRkFMU0U7CisgIGdpbnQgZnJhbWVzaXplID0gMDsKKyAgZ2ludCBoYXZlX2Jsb2NrcyA9IDA7CisgIEdzdE1hcEluZm8gbWFwOworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKyAgR3N0Rmxvd1JldHVybiByZXMgPSBHU1RfRkxPV19PSzsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIGlmIChHX1VOTElLRUxZIChtYXAuc2l6ZSA8IDgpKSB7CisgICAgKnNraXBzaXplID0gMTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KKworICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJnJlYWRlciwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgb2ZmID0gZ3N0X2J5dGVfcmVhZGVyX21hc2tlZF9zY2FuX3VpbnQzMiAoJnJlYWRlciwgMHhmZmZmMDAwMCwgMHgwYjc3MDAwMCwKKyAgICAgIDAsIG1hcC5zaXplKTsKKworICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJwb3NzaWJsZSBzeW5jIGF0IGJ1ZmZlciBvZmZzZXQgJWQiLCBvZmYpOworCisgIC8qIGRpZG4ndCBmaW5kIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIHN5bmMgd29yZCwgc2tpcCAqLworICBpZiAob2ZmIDwgMCkgeworICAgICpza2lwc2l6ZSA9IG1hcC5zaXplIC0gMzsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KKworICAvKiBwb3NzaWJsZSBmcmFtZSBoZWFkZXIsIGJ1dCBub3QgYXQgb2Zmc2V0IDA/IHNraXAgYnl0ZXMgYmVmb3JlIHN5bmMgKi8KKyAgaWYgKG9mZiA+IDApIHsKKyAgICAqc2tpcHNpemUgPSBvZmY7CisgICAgZ290byBjbGVhbnVwOworICB9CisKKyAgLyogbWFrZSBzdXJlIHRoZSB2YWx1ZXMgaW4gdGhlIGZyYW1lIGhlYWRlciBsb29rIHNhbmUgKi8KKyAgaWYgKCFnc3RfYWMzX3BhcnNlX2ZyYW1lX2hlYWRlciAoYWMzcGFyc2UsIGJ1ZiwgMCwgJmZybXNpeiwgJnJhdGUsICZjaGFucywKKyAgICAgICAgICAmYmxvY2tzLCAmc2lkLCAmZWFjKSkgeworICAgICpza2lwc2l6ZSA9IG9mZiArIDI7CisgICAgZ290byBjbGVhbnVwOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAic2l6ZTogJXUsIGJsb2NrczogJXUsIHJhdGU6ICV1LCBjaGFuczogJXUiLCBmcm1zaXosCisgICAgICBibG9ja3MsIHJhdGUsIGNoYW5zKTsKKworICBmcmFtZXNpemUgPSBmcm1zaXo7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGdfYXRvbWljX2ludF9nZXQgKCZhYzNwYXJzZS0+YWxpZ24pID09CisgICAgICAgICAgR1NUX0FDM19QQVJTRV9BTElHTl9OT05FKSkKKyAgICBnc3RfYWMzX3BhcnNlX3NldF9hbGlnbm1lbnQgKGFjM3BhcnNlLCBlYWMpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgImdvdCBmcmFtZSIpOworCisgIGxvc3Rfc3luYyA9IEdTVF9CQVNFX1BBUlNFX0xPU1RfU1lOQyAocGFyc2UpOworICBkcmFpbmluZyA9IEdTVF9CQVNFX1BBUlNFX0RSQUlOSU5HIChwYXJzZSk7CisKKyAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCZhYzNwYXJzZS0+YWxpZ24pID09IEdTVF9BQzNfUEFSU0VfQUxJR05fSUVDNjE5MzcpIHsKKyAgICAvKiBXZSBuZWVkIDYgYXVkaW8gYmxvY2tzIGZyb20gZWFjaCBzdWJzdHJlYW0sIHNvIHdlIGtlZXAgZ29pbmcgZm9yd2FyZHMKKyAgICAgKiB0aWxsIHdlIGhhdmUgaXQgKi8KKworICAgIGdfYXNzZXJ0IChibG9ja3MgPiAwKTsKKyAgICBHU1RfTE9HX09CSkVDVCAoYWMzcGFyc2UsICJOZWVkICVkIGZyYW1lcyBiZWZvcmUgcHVzaGluZyIsIDYgLyBibG9ja3MpOworCisgICAgaWYgKHNpZCAhPSAwKSB7CisgICAgICAvKiBXZSBuZWVkIHRoZSBmaXJzdCBzdWJzdHJlYW0gdG8gYmUgdGhlIG9uZSB3aXRoIGlkIDAgKi8KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChhYzNwYXJzZSwgIlNraXBwaW5nIHRpbGwgd2UgZmluZCBzaWQgMCIpOworICAgICAgKnNraXBzaXplID0gb2ZmICsgMjsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICBmcmFtZXNpemUgPSAwOworCisgICAgLyogTG9vcCB0aWxsIHdlIGhhdmUgNiBibG9ja3MgcGVyIHN1YnN0cmVhbSAqLworICAgIGZvciAoaGF2ZV9ibG9ja3MgPSAwOyAhbW9yZSAmJiBoYXZlX2Jsb2NrcyA8IDY7IGhhdmVfYmxvY2tzICs9IGJsb2NrcykgeworICAgICAgLyogTG9vcCB0aWxsIHdlIGdldCBvbmUgZnJhbWUgZnJvbSBlYWNoIHN1YnN0cmVhbSAqLworICAgICAgZG8geworICAgICAgICBmcmFtZXNpemUgKz0gZnJtc2l6OworCisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZyZWFkZXIsIGZybXNpeikKKyAgICAgICAgICAgIHx8IG1hcC5zaXplIDwgKGZyYW1lc2l6ZSArIDYpKSB7CisgICAgICAgICAgbW9yZSA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWdzdF9hYzNfcGFyc2VfZnJhbWVfaGVhZGVyIChhYzNwYXJzZSwgYnVmLCBmcmFtZXNpemUsICZmcm1zaXosCisgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgJnNpZCwgJmVhYykpIHsKKyAgICAgICAgICAqc2tpcHNpemUgPSBvZmYgKyAyOworICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAoc2lkKTsKKyAgICB9CisKKyAgICAvKiBXZSdyZSBub3cgYXQgdGhlIG5leHQgZnJhbWUsIHNvIG5vIG5lZWQgdG8gc2tpcCBpZiByZXN5bmNpbmcgKi8KKyAgICBmcm1zaXogPSAwOworICB9CisKKyAgaWYgKGxvc3Rfc3luYyAmJiAhZHJhaW5pbmcpIHsKKyAgICBndWludDE2IHdvcmQgPSAwOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYWMzcGFyc2UsICJyZXN5bmNpbmc7IGNoZWNraW5nIG5leHQgZnJhbWUgc3luY3dvcmQiKTsKKworICAgIGlmIChtb3JlIHx8ICFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJnJlYWRlciwgZnJtc2l6KSB8fAorICAgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmUgKCZyZWFkZXIsICZ3b3JkKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYWMzcGFyc2UsICIuLi4gYnV0IG5vdCBzdWZmaWNpZW50IGRhdGEiKTsKKyAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAocGFyc2UsIGZyYW1lc2l6ZSArIDgpOworICAgICAgKnNraXBzaXplID0gMDsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHdvcmQgIT0gMHgwYjc3KSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFjM3BhcnNlLCAiMHgleCBub3QgT0siLCB3b3JkKTsKKyAgICAgICAgKnNraXBzaXplID0gb2ZmICsgMjsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogb2ssIGdvdCBzeW5jIG5vdywgbGV0J3MgYXNzdW1lIGNvbnN0YW50IGZyYW1lIHNpemUgKi8KKyAgICAgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChwYXJzZSwgZnJhbWVzaXplKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBleHBlY3QgdG8gaGF2ZSBmb3VuZCBhIGZyYW1lIGhlcmUgKi8KKyAgZ19hc3NlcnQgKGZyYW1lc2l6ZSk7CisgIHJldCA9IFRSVUU7CisKKyAgLyogYXJyYW5nZSBmb3IgbWV0YWRhdGEgc2V0dXAgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHNpZCkpIHsKKyAgICAvKiBkZXBlbmRlbnQgZnJhbWUsIG5vIG5lZWQgdG8gKGFjKWNvdW50IGZvciBvciBjb25zaWRlciBmdXJ0aGVyICovCisgICAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAic2lkOiAlZCIsIHNpZCk7CisgICAgZnJhbWUtPmZsYWdzIHw9IEdTVF9CQVNFX1BBUlNFX0ZSQU1FX0ZMQUdfTk9fRlJBTUU7CisgICAgLyogVE9ETyBtYXliZSBhbHNvIG1hcmsgYXMgREVMVEFfVU5JVCwKKyAgICAgKiBpZiB0aGF0IGRvZXMgbm90IHN1cnByaXNlIGJhc2VwYXJzZSBlbHNld2hlcmUgKi8KKyAgICAvKiBvY2N1cGllcyBzYW1lIHRpbWUgc3BhY2UgYXMgcHJldmlvdXMgYmFzZSBmcmFtZSAqLworICAgIGlmIChHX0xJS0VMWSAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikgPj0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKSkpCisgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKSAtPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpOworICAgIC8qIG9ubHkgc2hvcnRjdXQgaWYgd2UgYWxyZWFkeSBhcnJhbmdlZCBmb3IgY2FwcyAqLworICAgIGlmIChHX0xJS0VMWSAoYWMzcGFyc2UtPnNhbXBsZV9yYXRlID4gMCkpCisgICAgICBnb3RvIGNsZWFudXA7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoYWMzcGFyc2UtPnNhbXBsZV9yYXRlICE9IHJhdGUgfHwgYWMzcGFyc2UtPmNoYW5uZWxzICE9IGNoYW5zCisgICAgICAgICAgfHwgYWMzcGFyc2UtPmVhYyAhPSBlYWMpKSB7CisgICAgR3N0Q2FwcyAqY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKGVhYyA/ICJhdWRpby94LWVhYzMiIDogImF1ZGlvL3gtYWMzIiwKKyAgICAgICAgImZyYW1lZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCAicmF0ZSIsIEdfVFlQRV9JTlQsIHJhdGUsCisgICAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGNoYW5zLCBOVUxMKTsKKyAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiYWxpZ25tZW50IiwgR19UWVBFX1NUUklORywKKyAgICAgICAgZ19hdG9taWNfaW50X2dldCAoJmFjM3BhcnNlLT5hbGlnbikgPT0gR1NUX0FDM19QQVJTRV9BTElHTl9JRUM2MTkzNyA/CisgICAgICAgICJpZWM2MTkzNyIgOiAiZnJhbWUiLCBOVUxMKTsKKyAgICBnc3RfcGFkX3NldF9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChwYXJzZSksIGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgIGFjM3BhcnNlLT5zYW1wbGVfcmF0ZSA9IHJhdGU7CisgICAgYWMzcGFyc2UtPmNoYW5uZWxzID0gY2hhbnM7CisgICAgYWMzcGFyc2UtPmVhYyA9IGVhYzsKKworICAgIHVwZGF0ZV9yYXRlID0gVFJVRTsKKyAgfQorCisgIGlmIChHX1VOTElLRUxZIChhYzNwYXJzZS0+YmxvY2tzICE9IGJsb2NrcykpIHsKKyAgICBhYzNwYXJzZS0+YmxvY2tzID0gYmxvY2tzOworCisgICAgdXBkYXRlX3JhdGUgPSBUUlVFOworICB9CisKKyAgaWYgKEdfVU5MSUtFTFkgKHVwZGF0ZV9yYXRlKSkKKyAgICBnc3RfYmFzZV9wYXJzZV9zZXRfZnJhbWVfcmF0ZSAocGFyc2UsIHJhdGUsIDI1NiAqIGJsb2NrcywgMiwgMik7CisKK2NsZWFudXA6CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgaWYgKHJldCAmJiBmcmFtZXNpemUgPD0gbWFwLnNpemUpIHsKKyAgICByZXMgPSBnc3RfYmFzZV9wYXJzZV9maW5pc2hfZnJhbWUgKHBhcnNlLCBmcmFtZSwgZnJhbWVzaXplKTsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKKworLyoKKyAqIE1QRUctUFMgcHJpdmF0ZTEgc3RyZWFtcyBhZGQgYSAyIGJ5dGVzICJBdWRpbyBTdWJzdHJlYW0gSGVhZGVycyIgZm9yIGVhY2gKKyAqIGJ1ZmZlciAobm90IGVhY2ggZnJhbWUpIHdpdGggdGhlIG9mZnNldCBvZiB0aGUgbmV4dCBmcmFtZSdzIHN0YXJ0LgorICoKKyAqIEJ1ZmZlciAxOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfGZpcnN0QWNjVW5pdHxBQzNTeW5jV29yZHx4eHh4eHh4eHh4eHh4eHh4eAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQnVmZmVyIDI6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8Zmlyc3RBY2NVbml0fHh4eHh4eHxBQzNTeW5jV29yZHx4eHh4eHh4eHh4CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhlc2UgMiBieXRlcyBjYW4gYmUgZHJvcHBlZCBzYWZlbHkgYXMgdGhleSBkbyBub3QgaW5jbHVkZSBhbnkgdGltaW5nCisgKiBpbmZvcm1hdGlvbiwgb25seSB0aGUgb2Zmc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBmcmFtZS4KKyAqCisgKiBGcm9tIGh0dHA6Ly9zdG5zb2Z0LmNvbS9EVkQvYXNzLWhkci5odG1sOgorICogIkZpcnN0QWNjVW5pdCBvZmZzZXQgdG8gZnJhbWUgd2hpY2ggY29ycmVzcG9uZHMgdG8gUFRTIHZhbHVlIG9mZnNldCAwIGlzIHRoZQorICogbGFzdCBieXRlIG9mIEZpcnN0QWNjVW5pdCwgaWUgYWRkIHRoZSBvZmZzZXQgb2YgYnl0ZSAyIHRvIGdldCB0aGUgQVUncyBvZmZzZXQKKyAqIFRoZSB2YWx1ZSAwMDAwIGluZGljYXRlcyB0aGVyZSBpcyBubyBmaXJzdCBhY2Nlc3MgdW5pdCIKKyAqICovCisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYWMzX3BhcnNlX2NoYWluX3ByaXYgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdEFjM1BhcnNlICphYzNwYXJzZSA9IEdTVF9BQzNfUEFSU0UgKHBhcmVudCk7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBnc2l6ZSBzaXplOworICBndWludDggZGF0YVsyXTsKKyAgZ2ludCBvZmZzZXQ7CisgIGdpbnQgbGVuOworICBHc3RCdWZmZXIgKnN1YmJ1ZjsKKyAgZ2ludCBmaXJzdF9hY2Nlc3M7CisKKyAgc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisgIGlmIChzaXplIDwgMikKKyAgICBnb3RvIG5vdF9lbm91Z2hfZGF0YTsKKworICBnc3RfYnVmZmVyX2V4dHJhY3QgKGJ1ZiwgMCwgZGF0YSwgMik7CisgIGZpcnN0X2FjY2VzcyA9IChkYXRhWzBdIDw8IDgpIHwgZGF0YVsxXTsKKworICAvKiBTa2lwIHRoZSBmaXJzdF9hY2Nlc3MgaGVhZGVyICovCisgIG9mZnNldCA9IDI7CisKKyAgaWYgKGZpcnN0X2FjY2VzcyA+IDEpIHsKKyAgICAvKiBMZW5ndGggb2YgZGF0YSBiZWZvcmUgZmlyc3RfYWNjZXNzICovCisgICAgbGVuID0gZmlyc3RfYWNjZXNzIC0gMTsKKworICAgIGlmIChsZW4gPD0gMCB8fCBvZmZzZXQgKyBsZW4gPiBzaXplKQorICAgICAgZ290byBiYWRfZmlyc3RfYWNjZXNzX3BhcmFtZXRlcjsKKworICAgIHN1YmJ1ZiA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX0FMTCwgb2Zmc2V0LCBsZW4pOworICAgIEdTVF9CVUZGRVJfRFRTIChzdWJidWYpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICBHU1RfQlVGRkVSX1BUUyAoc3ViYnVmKSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgcmV0ID0gYWMzcGFyc2UtPmJhc2VwYXJzZV9jaGFpbmZ1bmMgKHBhZCwgcGFyZW50LCBzdWJidWYpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0sgJiYgcmV0ICE9IEdTVF9GTE9XX05PVF9MSU5LRUQpIHsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgb2Zmc2V0ICs9IGxlbjsKKyAgICBsZW4gPSBzaXplIC0gb2Zmc2V0OworCisgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgIHN1YmJ1ZiA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX0FMTCwgb2Zmc2V0LCBsZW4pOworICAgICAgR1NUX0JVRkZFUl9QVFMgKHN1YmJ1ZikgPSBHU1RfQlVGRkVSX1BUUyAoYnVmKTsKKyAgICAgIEdTVF9CVUZGRVJfRFRTIChzdWJidWYpID0gR1NUX0JVRkZFUl9EVFMgKGJ1Zik7CisKKyAgICAgIHJldCA9IGFjM3BhcnNlLT5iYXNlcGFyc2VfY2hhaW5mdW5jIChwYWQsIHBhcmVudCwgc3ViYnVmKTsKKyAgICB9CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBmaXJzdF9hY2Nlc3MgPSAwIG9yIDEsIHNvIGlmIHRoZXJlJ3MgYSB0aW1lc3RhbXAgaXQgYXBwbGllcyB0byB0aGUgZmlyc3QgYnl0ZSAqLworICAgIHN1YmJ1ZiA9CisgICAgICAgIGdzdF9idWZmZXJfY29weV9yZWdpb24gKGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX0FMTCwgb2Zmc2V0LAorICAgICAgICBzaXplIC0gb2Zmc2V0KTsKKyAgICBHU1RfQlVGRkVSX1BUUyAoc3ViYnVmKSA9IEdTVF9CVUZGRVJfUFRTIChidWYpOworICAgIEdTVF9CVUZGRVJfRFRTIChzdWJidWYpID0gR1NUX0JVRkZFUl9EVFMgKGJ1Zik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXQgPSBhYzNwYXJzZS0+YmFzZXBhcnNlX2NoYWluZnVuYyAocGFkLCBwYXJlbnQsIHN1YmJ1Zik7CisgIH0KKworZG9uZToKKyAgcmV0dXJuIHJldDsKKworLyogRVJST1JTICovCitub3RfZW5vdWdoX2RhdGE6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoR1NUX0VMRU1FTlQgKGFjM3BhcnNlKSwgU1RSRUFNLCBGT1JNQVQsIChOVUxMKSwKKyAgICAgICAgKCJJbnN1ZmZpY2llbnQgZGF0YSBpbiBidWZmZXIuIENhbid0IGRldGVybWluZSBmaXJzdF9hY2VzcyIpKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorYmFkX2ZpcnN0X2FjY2Vzc19wYXJhbWV0ZXI6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoR1NUX0VMRU1FTlQgKGFjM3BhcnNlKSwgU1RSRUFNLCBGT1JNQVQsIChOVUxMKSwKKyAgICAgICAgKCJCYWQgZmlyc3RfYWNjZXNzIHBhcmFtZXRlciAoJWQpIGluIGJ1ZmZlciIsIGZpcnN0X2FjY2VzcykpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYWMzX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0QWMzUGFyc2UgKmFjM3BhcnNlID0gR1NUX0FDM19QQVJTRSAocGFyc2UpOworCisgIGlmICghYWMzcGFyc2UtPnNlbnRfY29kZWNfdGFnKSB7CisgICAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgLyogY29kZWMgdGFnICovCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpKTsKKyAgICBpZiAoR19VTkxJS0VMWSAoY2FwcyA9PSBOVUxMKSkgeworICAgICAgaWYgKEdTVF9QQURfSVNfRkxVU0hJTkcgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSkpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgZmx1c2hpbmciKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgbm90IG5lZ290aWF0ZWQhIik7CisgICAgICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgICBnc3RfcGJfdXRpbHNfYWRkX2NvZGVjX2Rlc2NyaXB0aW9uX3RvX3RhZ19saXN0ICh0YWdsaXN0LAorICAgICAgICBHU1RfVEFHX0FVRElPX0NPREVDLCBjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICBnc3RfYmFzZV9wYXJzZV9tZXJnZV90YWdzIChwYXJzZSwgdGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ2xpc3QpOworCisgICAgLyogYWxzbyBzaWduYWxzIHRoZSBlbmQgb2YgZmlyc3QtZnJhbWUgcHJvY2Vzc2luZyAqLworICAgIGFjM3BhcnNlLT5zZW50X2NvZGVjX3RhZyA9IFRSVUU7CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FjM19wYXJzZV9zcmNfZXZlbnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RBYzNQYXJzZSAqYWMzcGFyc2UgPSBHU1RfQUMzX1BBUlNFIChwYXJzZSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSkgJiYKKyAgICAgIGdzdF9ldmVudF9oYXNfbmFtZSAoZXZlbnQsICJhYzNwYXJzZS1zZXQtYWxpZ25tZW50IikpIHsKKyAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnN0ID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKyAgICBjb25zdCBnY2hhciAqYWxpZ24gPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0LCAiYWxpZ25tZW50Iik7CisKKyAgICBpZiAoZ19zdHJfZXF1YWwgKGFsaWduLCAiaWVjNjE5MzciKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYWMzcGFyc2UsICJTd2l0Y2hpbmcgdG8gaWVjNjE5MzcgYWxpZ25tZW50Iik7CisgICAgICBnX2F0b21pY19pbnRfc2V0ICgmYWMzcGFyc2UtPmFsaWduLCBHU1RfQUMzX1BBUlNFX0FMSUdOX0lFQzYxOTM3KTsKKyAgICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChhbGlnbiwgImZyYW1lIikpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFjM3BhcnNlLCAiU3dpdGNoaW5nIHRvIGZyYW1lIGFsaWdubWVudCIpOworICAgICAgZ19hdG9taWNfaW50X3NldCAoJmFjM3BhcnNlLT5hbGlnbiwgR1NUX0FDM19QQVJTRV9BTElHTl9GUkFNRSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdfYXRvbWljX2ludF9zZXQgKCZhYzNwYXJzZS0+YWxpZ24sIEdTVF9BQzNfUEFSU0VfQUxJR05fRlJBTUUpOworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhYzNwYXJzZSwgIkdvdCB1bmtub3duIGFsaWdubWVudCByZXF1ZXN0ICglcykgIgorICAgICAgICAgICJyZXZlcnRpbmcgdG8gZnJhbWUgYWxpZ25tZW50LiIsCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdCwgImFsaWdubWVudCIpKTsKKyAgICB9CisKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBHU1RfQkFTRV9QQVJTRV9DTEFTUyAocGFyZW50X2NsYXNzKS0+c3JjX2V2ZW50IChwYXJzZSwgZXZlbnQpOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX2ZpZWxkcyAoR3N0Q2FwcyAqIGNhcHMpCit7CisgIGd1aW50IGksIG47CisKKyAgbiA9IGdzdF9jYXBzX2dldF9zaXplIChjYXBzKTsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIGkpOworCisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJmcmFtZWQiKTsKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAocywgImFsaWdubWVudCIpOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2V4dGVuZF9jYXBzIChHc3RDYXBzICogY2FwcywgZ2Jvb2xlYW4gYWRkX3ByaXZhdGUpCit7CisgIGd1aW50IGksIG47CisgIEdzdENhcHMgKm5jYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKworICAgIGlmIChhZGRfcHJpdmF0ZSAmJiAhZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgImF1ZGlvL3gtcHJpdmF0ZTEtYWMzIikpIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqbnMgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHMpOworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAobnMsICJhdWRpby94LXByaXZhdGUxLWFjMyIpOworICAgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAobmNhcHMsIG5zKTsKKyAgICB9IGVsc2UgaWYgKCFhZGRfcHJpdmF0ZSAmJgorICAgICAgICBnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiYXVkaW8veC1wcml2YXRlMS1hYzMiKSkgeworICAgICAgR3N0U3RydWN0dXJlICpucyA9IGdzdF9zdHJ1Y3R1cmVfY29weSAocyk7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChucywgImF1ZGlvL3gtYWMzIik7CisgICAgICBnc3RfY2Fwc19hcHBlbmRfc3RydWN0dXJlIChuY2FwcywgbnMpOworICAgICAgbnMgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHMpOworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAobnMsICJhdWRpby94LWVhYzMiKTsKKyAgICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKG5jYXBzLCBucyk7CisgICAgfSBlbHNlIGlmICghYWRkX3ByaXZhdGUpIHsKKyAgICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKG5jYXBzLCBnc3Rfc3RydWN0dXJlX2NvcHkgKHMpKTsKKyAgICB9CisgIH0KKworICBpZiAoYWRkX3ByaXZhdGUpIHsKKyAgICBnc3RfY2Fwc19hcHBlbmQgKGNhcHMsIG5jYXBzKTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgY2FwcyA9IG5jYXBzOworICB9CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9hYzNfcGFyc2VfZ2V0X3NpbmtfY2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnBlZXJjYXBzLCAqdGVtcGw7CisgIEdzdENhcHMgKnJlczsKKworICB0ZW1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChHU1RfQkFTRV9QQVJTRV9TSU5LX1BBRCAocGFyc2UpKTsKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmZjb3B5ID0gZ3N0X2NhcHNfY29weSAoZmlsdGVyKTsKKyAgICAvKiBSZW1vdmUgdGhlIGZpZWxkcyB3ZSBjb252ZXJ0ICovCisgICAgcmVtb3ZlX2ZpZWxkcyAoZmNvcHkpOworICAgIC8qIHdlIGRvIG5vdCBhc2sgZG93bnN0cmVhbSB0byBoYW5kbGUgeC1wcml2YXRlMS1hYzMgKi8KKyAgICBmY29weSA9IGV4dGVuZF9jYXBzIChmY29weSwgRkFMU0UpOworICAgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgZmNvcHkpOworICAgIGdzdF9jYXBzX3VucmVmIChmY29weSk7CisgIH0gZWxzZQorICAgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgTlVMTCk7CisKKyAgaWYgKHBlZXJjYXBzKSB7CisgICAgLyogUmVtb3ZlIHRoZSBmcmFtZWQgYW5kIGFsaWdubWVudCBmaWVsZC4gV2UgY2FuIGNvbnZlcnQKKyAgICAgKiBiZXR3ZWVuIGRpZmZlcmVudCBhbGlnbm1lbnRzLiAqLworICAgIHBlZXJjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocGVlcmNhcHMpOworICAgIHJlbW92ZV9maWVsZHMgKHBlZXJjYXBzKTsKKyAgICAvKiBhbHNvIGFsbG93IGZvciB4LXByaXZhdGUxLWFjMyBpbnB1dCAqLworICAgIHBlZXJjYXBzID0gZXh0ZW5kX2NhcHMgKHBlZXJjYXBzLCBUUlVFKTsKKworICAgIHJlcyA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChwZWVyY2FwcywgdGVtcGwsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGVtcGwpOworICB9IGVsc2UgeworICAgIHJlcyA9IHRlbXBsOworICB9CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmludGVyc2VjdGlvbjsKKworICAgIGludGVyc2VjdGlvbiA9CisgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHJlcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmVzKTsKKyAgICByZXMgPSBpbnRlcnNlY3Rpb247CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hYzNfcGFyc2Vfc2V0X3NpbmtfY2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdzdEFjM1BhcnNlICphYzNwYXJzZSA9IEdTVF9BQzNfUEFSU0UgKHBhcnNlKTsKKworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiYXVkaW8veC1wcml2YXRlMS1hYzMiKSkgeworICAgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChwYXJzZS0+c2lua3BhZCwgZ3N0X2FjM19wYXJzZV9jaGFpbl9wcml2KTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAocGFyc2UtPnNpbmtwYWQsIGFjM3BhcnNlLT5iYXNlcGFyc2VfY2hhaW5mdW5jKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuaCBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0YWMzcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTdhZjVhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhYzNwYXJzZS5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIEdTdHJlYW1lciBBQzMgcGFyc2VyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1dyB1c2VycyBzZiBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIENvbnRhY3Q6IFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BQzNfUEFSU0VfSF9fCisjZGVmaW5lIF9fR1NUX0FDM19QQVJTRV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlcGFyc2UuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0FDM19QQVJTRSBcCisgIChnc3RfYWMzX3BhcnNlX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9BQzNfUEFSU0Uob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSwgR1NUX1RZUEVfQUMzX1BBUlNFLCBHc3RBYzNQYXJzZSkpCisjZGVmaW5lIEdTVF9BQzNfUEFSU0VfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksIEdTVF9UWVBFX0FDM19QQVJTRSwgR3N0QWMzUGFyc2VDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BQzNfUEFSU0Uob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSwgR1NUX1RZUEVfQUMzX1BBUlNFKSkKKyNkZWZpbmUgR1NUX0lTX0FDM19QQVJTRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSwgR1NUX1RZUEVfQUMzX1BBUlNFKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEFjM1BhcnNlIEdzdEFjM1BhcnNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEFjM1BhcnNlQ2xhc3MgR3N0QWMzUGFyc2VDbGFzczsKKworZW51bSB7CisgIEdTVF9BQzNfUEFSU0VfQUxJR05fTk9ORSwKKyAgR1NUX0FDM19QQVJTRV9BTElHTl9GUkFNRSwKKyAgR1NUX0FDM19QQVJTRV9BTElHTl9JRUM2MTkzNywKK307CisKKy8qKgorICogR3N0QWMzUGFyc2U6CisgKgorICogVGhlIG9wYXF1ZSBHc3RBYzNQYXJzZSBvYmplY3QKKyAqLworc3RydWN0IF9Hc3RBYzNQYXJzZSB7CisgIEdzdEJhc2VQYXJzZSBiYXNlcGFyc2U7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIGdpbnQgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZTsKKyAgZ2ludCAgICAgICAgICAgICAgICAgIGNoYW5uZWxzOworICBnaW50ICAgICAgICAgICAgICAgICAgYmxvY2tzOworICBnYm9vbGVhbiAgICAgICAgICAgICAgZWFjOworICBnYm9vbGVhbiAgICAgICAgICAgICAgc2VudF9jb2RlY190YWc7CisgIHZvbGF0aWxlIGdpbnQgICAgICAgICBhbGlnbjsKKyAgR3N0UGFkQ2hhaW5GdW5jdGlvbiAgIGJhc2VwYXJzZV9jaGFpbmZ1bmM7Cit9OworCisvKioKKyAqIEdzdEFjM1BhcnNlQ2xhc3M6CisgKiBAcGFyZW50X2NsYXNzOiBFbGVtZW50IHBhcmVudCBjbGFzcy4KKyAqCisgKiBUaGUgb3BhcXVlIEdzdEFjM1BhcnNlQ2xhc3MgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0QWMzUGFyc2VDbGFzcyB7CisgIEdzdEJhc2VQYXJzZUNsYXNzIGJhc2VwYXJzZV9jbGFzczsKK307CisKK0dUeXBlIGdzdF9hYzNfcGFyc2VfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQUMzX1BBUlNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RhbXJwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMDEzNTkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmMKQEAgLTAsMCArMSw0NTIgQEAKKy8qIEdTdHJlYW1lciBBZGFwdGl2ZSBNdWx0aS1SYXRlIHBhcnNlciBwbHVnaW4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3Q6IFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYW1ycGFyc2UKKyAqIEBzaG9ydF9kZXNjcmlwdGlvbjogQU1SIHBhcnNlcgorICogQHNlZV9hbHNvOiAjR3N0QW1ybmJEZWMsICNHc3RBbXJuYkVuYworICoKKyAqIFRoaXMgaXMgYW4gQU1SIHBhcnNlciBjYXBhYmxlIG9mIGhhbmRsaW5nIGJvdGggbmFycm93LWJhbmQgYW5kIHdpZGViYW5kCisgKiBmb3JtYXRzLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPWFiYy5hbXIgISBhbXJwYXJzZSAhIGFtcmRlYyAhIGF1ZGlvcmVzYW1wbGUgISBhdWRpb2NvbnZlcnQgISBhbHNhc2luaworICogXXwKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RhbXJwYXJzZS5oIgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL3BidXRpbHMuaD4KKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby9BTVIsICIgInJhdGUgPSAoaW50KSA4MDAwLCAiICJjaGFubmVscyA9IChpbnQpIDE7IgorICAgICAgICAiYXVkaW8vQU1SLVdCLCAiICJyYXRlID0gKGludCkgMTYwMDAsICIgImNoYW5uZWxzID0gKGludCkgMTsiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1hbXItbmItc2g7IGF1ZGlvL3gtYW1yLXdiLXNoIikpOworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChhbXJwYXJzZV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBhbXJwYXJzZV9kZWJ1ZworCitzdGF0aWMgY29uc3QgZ2ludCBibG9ja19zaXplX25iWzE2XSA9CisgICAgeyAxMiwgMTMsIDE1LCAxNywgMTksIDIwLCAyNiwgMzEsIDUsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKworc3RhdGljIGNvbnN0IGdpbnQgYmxvY2tfc2l6ZV93YlsxNl0gPQorICAgIHsgMTcsIDIzLCAzMiwgMzYsIDQwLCA0NiwgNTAsIDU4LCA2MCwgNSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAgfTsKKworLyogQU1SIGhhcyBhICJoYXJkY29kZWQiIGZyYW1lcmF0ZSBvZiA1MGZwcyAqLworI2RlZmluZSBBTVJfRlJBTUVTX1BFUl9TRUNPTkQgNTAKKyNkZWZpbmUgQU1SX0ZSQU1FX0RVUkFUSU9OIChHU1RfU0VDT05EL0FNUl9GUkFNRVNfUEVSX1NFQ09ORCkKKyNkZWZpbmUgQU1SX01JTUVfSEVBREVSX1NJWkUgOQorCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2Ftcl9wYXJzZV9zdGFydCAoR3N0QmFzZVBhcnNlICogcGFyc2UpOworc3RhdGljIGdib29sZWFuIGdzdF9hbXJfcGFyc2Vfc3RvcCAoR3N0QmFzZVBhcnNlICogcGFyc2UpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2Ftcl9wYXJzZV9zaW5rX3NldGNhcHMgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfYW1yX3BhcnNlX3NpbmtfZ2V0Y2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0Q2FwcyAqIGZpbHRlcik7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hbXJfcGFyc2VfaGFuZGxlX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lLCBnaW50ICogc2tpcHNpemUpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2Ftcl9wYXJzZV9wcmVfcHVzaF9mcmFtZSAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSk7CisKK0dfREVGSU5FX1RZUEUgKEdzdEFtclBhcnNlLCBnc3RfYW1yX3BhcnNlLCBHU1RfVFlQRV9CQVNFX1BBUlNFKTsKKworLyoqCisgKiBnc3RfYW1yX3BhcnNlX2NsYXNzX2luaXQ6CisgKiBAa2xhc3M6IEdzdEFtclBhcnNlQ2xhc3MuCisgKgorICovCitzdGF0aWMgdm9pZAorZ3N0X2Ftcl9wYXJzZV9jbGFzc19pbml0IChHc3RBbXJQYXJzZUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdzdEJhc2VQYXJzZUNsYXNzICpwYXJzZV9jbGFzcyA9IEdTVF9CQVNFX1BBUlNFX0NMQVNTIChrbGFzcyk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGFtcnBhcnNlX2RlYnVnLCAiYW1ycGFyc2UiLCAwLAorICAgICAgIkFNUi1OQiBhdWRpbyBzdHJlYW0gcGFyc2VyIik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiQU1SIGF1ZGlvIHN0cmVhbSBwYXJzZXIiLCAiQ29kZWMvUGFyc2VyL0F1ZGlvIiwKKyAgICAgICJBZGFwdGl2ZSBNdWx0aS1SYXRlIGF1ZGlvIHBhcnNlciIsCisgICAgICAiUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PiIpOworCisgIHBhcnNlX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYW1yX3BhcnNlX3N0YXJ0KTsKKyAgcGFyc2VfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Ftcl9wYXJzZV9zdG9wKTsKKyAgcGFyc2VfY2xhc3MtPnNldF9zaW5rX2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Ftcl9wYXJzZV9zaW5rX3NldGNhcHMpOworICBwYXJzZV9jbGFzcy0+Z2V0X3NpbmtfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYW1yX3BhcnNlX3NpbmtfZ2V0Y2Fwcyk7CisgIHBhcnNlX2NsYXNzLT5oYW5kbGVfZnJhbWUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Ftcl9wYXJzZV9oYW5kbGVfZnJhbWUpOworICBwYXJzZV9jbGFzcy0+cHJlX3B1c2hfZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hbXJfcGFyc2VfcHJlX3B1c2hfZnJhbWUpOworfQorCisKKy8qKgorICogZ3N0X2Ftcl9wYXJzZV9pbml0OgorICogQGFtcnBhcnNlOiAjR3N0QW1yUGFyc2UKKyAqIEBrbGFzczogI0dzdEFtclBhcnNlQ2xhc3MuCisgKgorICovCitzdGF0aWMgdm9pZAorZ3N0X2Ftcl9wYXJzZV9pbml0IChHc3RBbXJQYXJzZSAqIGFtcnBhcnNlKQoreworICAvKiBpbml0IHJlc3QgKi8KKyAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChHU1RfQkFTRV9QQVJTRSAoYW1ycGFyc2UpLCA2Mik7CisgIEdTVF9ERUJVRyAoImluaXRpYWxpemVkIik7CisgIEdTVF9QQURfU0VUX0FDQ0VQVF9JTlRFUlNFQ1QgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChhbXJwYXJzZSkpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChhbXJwYXJzZSkpOworfQorCisKKy8qKgorICogZ3N0X2Ftcl9wYXJzZV9zZXRfc3JjX2NhcHM6CisgKiBAYW1ycGFyc2U6ICNHc3RBbXJQYXJzZS4KKyAqCisgKiBTZXQgc291cmNlIHBhZCBjYXBzIGFjY29yZGluZyB0byBjdXJyZW50IGtub3dsZWRnZSBhYm91dCB0aGUKKyAqIGF1ZGlvIHN0cmVhbS4KKyAqCisgKiBSZXR1cm5zOiBUUlVFIGlmIGNhcHMgd2VyZSBzdWNjZXNzZnVsbHkgc2V0LgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hbXJfcGFyc2Vfc2V0X3NyY19jYXBzIChHc3RBbXJQYXJzZSAqIGFtcnBhcnNlKQoreworICBHc3RDYXBzICpzcmNfY2FwcyA9IE5VTEw7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIGlmIChhbXJwYXJzZS0+d2lkZSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFtcnBhcnNlLCAic2V0dGluZyBzcmNwYWQgY2FwcyB0byBBTVItV0IiKTsKKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9BTVItV0IiLAorICAgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLCAicmF0ZSIsIEdfVFlQRV9JTlQsIDE2MDAwLCBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhbXJwYXJzZSwgInNldHRpbmcgc3JjcGFkIGNhcHMgdG8gQU1SLU5CIik7CisgICAgLyogTWF4LiBzaXplIG9mIE5CIGZyYW1lIGlzIDMxIGJ5dGVzLCBzbyB3ZSBjYW4gc2V0IHRoZSBtaW4uIGZyYW1lCisgICAgICAgc2l6ZSB0byAzMiAoKzEgZm9yIG5leHQgZnJhbWUgaGVhZGVyKSAqLworICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGFtcnBhcnNlKSwgMzIpOworICAgIHNyY19jYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL0FNUiIsCisgICAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDEsICJyYXRlIiwgR19UWVBFX0lOVCwgODAwMCwgTlVMTCk7CisgIH0KKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoR1NUX0JBU0VfUEFSU0UgKGFtcnBhcnNlKS0+c3JjcGFkKTsKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX0JBU0VfUEFSU0UgKGFtcnBhcnNlKS0+c3JjcGFkLCBzcmNfY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNfY2Fwcyk7CisgIHJldHVybiByZXM7Cit9CisKKworLyoqCisgKiBnc3RfYW1yX3BhcnNlX3Npbmtfc2V0Y2FwczoKKyAqIEBzaW5rcGFkOiBHc3RQYWQKKyAqIEBjYXBzOiBHc3RDYXBzCisgKgorICogUmV0dXJuczogVFJVRSBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hbXJfcGFyc2Vfc2lua19zZXRjYXBzIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdEFtclBhcnNlICphbXJwYXJzZTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IGdjaGFyICpuYW1lOworCisgIGFtcnBhcnNlID0gR1NUX0FNUl9QQVJTRSAocGFyc2UpOworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgbmFtZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYW1ycGFyc2UsICJzZXRjYXBzOiAlcyIsIG5hbWUpOworCisgIGlmICghc3RybmNtcCAobmFtZSwgImF1ZGlvL3gtYW1yLXdiLXNoIiwgMTcpKSB7CisgICAgYW1ycGFyc2UtPmJsb2NrX3NpemUgPSBibG9ja19zaXplX3diOworICAgIGFtcnBhcnNlLT53aWRlID0gMTsKKyAgfSBlbHNlIGlmICghc3RybmNtcCAobmFtZSwgImF1ZGlvL3gtYW1yLW5iLXNoIiwgMTcpKSB7CisgICAgYW1ycGFyc2UtPmJsb2NrX3NpemUgPSBibG9ja19zaXplX25iOworICAgIGFtcnBhcnNlLT53aWRlID0gMDsKKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklORyAoIlVua25vd24gY2FwcyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGFtcnBhcnNlLT5uZWVkX2hlYWRlciA9IEZBTFNFOworICBnc3RfYmFzZV9wYXJzZV9zZXRfZnJhbWVfcmF0ZSAoR1NUX0JBU0VfUEFSU0UgKGFtcnBhcnNlKSwgNTAsIDEsIDIsIDIpOworICBnc3RfYW1yX3BhcnNlX3NldF9zcmNfY2FwcyAoYW1ycGFyc2UpOworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBnc3RfYW1yX3BhcnNlX3BhcnNlX2hlYWRlcjoKKyAqIEBhbXJwYXJzZTogI0dzdEFtclBhcnNlCisgKiBAZGF0YTogSGVhZGVyIGRhdGEgdG8gYmUgcGFyc2VkLgorICogQHNraXBzaXplOiBPdXRwdXQgYXJndW1lbnQgd2hlcmUgdGhlIGZyYW1lIHNpemUgd2lsbCBiZSBzdG9yZWQuCisgKgorICogQ2hlY2sgaWYgdGhlIGdpdmVuIGRhdGEgY29udGFpbnMgYW4gQU1SIG1pbWUgaGVhZGVyLgorICoKKyAqIFJldHVybnM6IFRSVUUgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYW1yX3BhcnNlX3BhcnNlX2hlYWRlciAoR3N0QW1yUGFyc2UgKiBhbXJwYXJzZSwKKyAgICBjb25zdCBndWludDggKiBkYXRhLCBnaW50ICogc2tpcHNpemUpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGFtcnBhcnNlLCAiUGFyc2luZyBoZWFkZXIgZGF0YSIpOworCisgIGlmICghbWVtY21wIChkYXRhLCAiIyFBTVItV0JcbiIsIDkpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYW1ycGFyc2UsICJBTVItV0IgZGV0ZWN0ZWQiKTsKKyAgICBhbXJwYXJzZS0+YmxvY2tfc2l6ZSA9IGJsb2NrX3NpemVfd2I7CisgICAgYW1ycGFyc2UtPndpZGUgPSBUUlVFOworICAgICpza2lwc2l6ZSA9IGFtcnBhcnNlLT5oZWFkZXIgPSA5OworICB9IGVsc2UgaWYgKCFtZW1jbXAgKGRhdGEsICIjIUFNUlxuIiwgNikpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhbXJwYXJzZSwgIkFNUi1OQiBkZXRlY3RlZCIpOworICAgIGFtcnBhcnNlLT5ibG9ja19zaXplID0gYmxvY2tfc2l6ZV9uYjsKKyAgICBhbXJwYXJzZS0+d2lkZSA9IEZBTFNFOworICAgICpza2lwc2l6ZSA9IGFtcnBhcnNlLT5oZWFkZXIgPSA2OworICB9IGVsc2UKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZ3N0X2Ftcl9wYXJzZV9zZXRfc3JjX2NhcHMgKGFtcnBhcnNlKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqCisgKiBnc3RfYW1yX3BhcnNlX2NoZWNrX3ZhbGlkX2ZyYW1lOgorICogQHBhcnNlOiAjR3N0QmFzZVBhcnNlLgorICogQGJ1ZmZlcjogI0dzdEJ1ZmZlci4KKyAqIEBmcmFtZXNpemU6IE91dHB1dCB2YXJpYWJsZSB3aGVyZSB0aGUgZm91bmQgZnJhbWUgc2l6ZSBpcyBwdXQuCisgKiBAc2tpcHNpemU6IE91dHB1dCB2YXJpYWJsZSB3aGljaCB0ZWxscyBob3cgbXVjaCBkYXRhIG5lZWRzIHRvIGJlIHNraXBwZWQKKyAqICAgICAgICAgICAgdW50aWwgYSBmcmFtZSBoZWFkZXIgaXMgZm91bmQuCisgKgorICogSW1wbGVtZW50YXRpb24gb2YgImNoZWNrX3ZhbGlkX2ZyYW1lIiB2bWV0aG9kIGluICNHc3RCYXNlUGFyc2UgY2xhc3MuCisgKgorICogUmV0dXJuczogVFJVRSBpZiB0aGUgZ2l2ZW4gZGF0YSBjb250YWlucyB2YWxpZCBmcmFtZS4KKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hbXJfcGFyc2VfaGFuZGxlX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lLCBnaW50ICogc2tpcHNpemUpCit7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2ludCBmc2l6ZSA9IDAsIG1vZGUsIGRzaXplOworICBHc3RBbXJQYXJzZSAqYW1ycGFyc2U7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGdib29sZWFuIGZvdW5kID0gRkFMU0U7CisKKyAgYW1ycGFyc2UgPSBHU1RfQU1SX1BBUlNFIChwYXJzZSk7CisgIGJ1ZmZlciA9IGZyYW1lLT5idWZmZXI7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZHNpemUgPSBtYXAuc2l6ZTsKKworICBHU1RfTE9HICgiYnVmZmVyOiAlZCBieXRlcyIsIGRzaXplKTsKKworICBpZiAoYW1ycGFyc2UtPm5lZWRfaGVhZGVyKSB7CisgICAgaWYgKGRzaXplID49IEFNUl9NSU1FX0hFQURFUl9TSVpFICYmCisgICAgICAgIGdzdF9hbXJfcGFyc2VfcGFyc2VfaGVhZGVyIChhbXJwYXJzZSwgbWFwLmRhdGEsIHNraXBzaXplKSkgeworICAgICAgYW1ycGFyc2UtPm5lZWRfaGVhZGVyID0gRkFMU0U7CisgICAgICBnc3RfYmFzZV9wYXJzZV9zZXRfZnJhbWVfcmF0ZSAoR1NUX0JBU0VfUEFSU0UgKGFtcnBhcnNlKSwgNTAsIDEsIDIsIDIpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklORyAoIm1lZGlhIGRvZXNuJ3QgbG9vayBsaWtlIGEgQU1SIGZvcm1hdCIpOworICAgIH0KKyAgICAvKiBXZSByZXR1cm4gRkFMU0UsIHNvIHRoaXMgZnJhbWUgd29uJ3QgZ2V0IHB1c2hlZCBmb3J3YXJkLiBJbnN0ZWFkLAorICAgICAgIHRoZSAic2tpcCIgdmFsdWUgaXMgc2V0LCBzbyBuZXh0IHRpbWUgd2Ugd2lsbCByZWNlaXZlIGEgdmFsaWQgZnJhbWUuICovCisgICAgZ290byBkb25lOworICB9CisKKyAgKnNraXBzaXplID0gMTsKKyAgLyogRG9lcyB0aGlzIGxvb2sgbGlrZSBhIHBvc3NpYmxlIGZyYW1lIGhlYWRlciBjYW5kaWRhdGU/ICovCisgIGlmICgobWFwLmRhdGFbMF0gJiAweDgzKSA9PSAwKSB7CisgICAgLyogWWVwLiBSZXRyaWV2ZSB0aGUgZnJhbWUgc2l6ZSAqLworICAgIG1vZGUgPSAobWFwLmRhdGFbMF0gPj4gMykgJiAweDBGOworICAgIGZzaXplID0gYW1ycGFyc2UtPmJsb2NrX3NpemVbbW9kZV0gKyAxOyAgICAgLyogKzEgZm9yIHRoZSBoZWFkZXIgYnl0ZSAqLworCisgICAgLyogV2UgcmVjb2duaXplIHRoaXMgZGF0YSBhcyBhIHZhbGlkIGZyYW1lIHdoZW46CisgICAgICogICAgIC0gV2UgYXJlIGluIHN5bmMuIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGV4dHJhIGNoZWNrcyB0aGVuCisgICAgICogICAgIC0gV2UgYXJlIGluIEVPUy4gVGhlcmUgbWlnaHQgbm90IGJlIGVub3VnaCBkYXRhIHRvIGNoZWNrIG5leHQgZnJhbWUKKyAgICAgKiAgICAgLSBTeW5jIGlzIGxvc3QsIGJ1dCB0aGUgZm9sbG93aW5nIGRhdGEgYWZ0ZXIgdGhpcyBmcmFtZSBzZWVtCisgICAgICogICAgICAgdG8gY29udGFpbiBhIHZhbGlkIGhlYWRlciBhcyB3ZWxsIChhbmQgdGhlcmUgaXMgZW5vdWdoIGRhdGEgdG8KKyAgICAgKiAgICAgICBwZXJmb3JtIHRoaXMgY2hlY2spCisgICAgICovCisgICAgaWYgKGZzaXplKSB7CisgICAgICAqc2tpcHNpemUgPSAwOworICAgICAgLyogaW4gc3luYywgbm8gZnVydGhlciBjaGVjayAqLworICAgICAgaWYgKCFHU1RfQkFTRV9QQVJTRV9MT1NUX1NZTkMgKHBhcnNlKSkgeworICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICB9IGVsc2UgaWYgKGRzaXplID4gZnNpemUpIHsKKyAgICAgICAgLyogZW5vdWdoIGRhdGEsIGNoZWNrIGZvciBuZXh0IHN5bmMgKi8KKyAgICAgICAgaWYgKChtYXAuZGF0YVtmc2l6ZV0gJiAweDgzKSA9PSAwKQorICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgIH0gZWxzZSBpZiAoR1NUX0JBU0VfUEFSU0VfRFJBSU5JTkcgKHBhcnNlKSkgeworICAgICAgICAvKiBub3QgZW5vdWdoLCBidXQgZHJhaW5pbmcsIHNvIG9rICovCisgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworZG9uZToKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICBpZiAoZm91bmQgJiYgZnNpemUgPD0gbWFwLnNpemUpIHsKKyAgICByZXQgPSBnc3RfYmFzZV9wYXJzZV9maW5pc2hfZnJhbWUgKHBhcnNlLCBmcmFtZSwgZnNpemUpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBnc3RfYW1yX3BhcnNlX3N0YXJ0OgorICogQHBhcnNlOiAjR3N0QmFzZVBhcnNlLgorICoKKyAqIEltcGxlbWVudGF0aW9uIG9mICJzdGFydCIgdm1ldGhvZCBpbiAjR3N0QmFzZVBhcnNlIGNsYXNzLgorICoKKyAqIFJldHVybnM6IFRSVUUgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYW1yX3BhcnNlX3N0YXJ0IChHc3RCYXNlUGFyc2UgKiBwYXJzZSkKK3sKKyAgR3N0QW1yUGFyc2UgKmFtcnBhcnNlOworCisgIGFtcnBhcnNlID0gR1NUX0FNUl9QQVJTRSAocGFyc2UpOworICBHU1RfREVCVUcgKCJzdGFydCIpOworICBhbXJwYXJzZS0+bmVlZF9oZWFkZXIgPSBUUlVFOworICBhbXJwYXJzZS0+aGVhZGVyID0gMDsKKyAgYW1ycGFyc2UtPnNlbnRfY29kZWNfdGFnID0gRkFMU0U7CisgIHJldHVybiBUUlVFOworfQorCisKKy8qKgorICogZ3N0X2Ftcl9wYXJzZV9zdG9wOgorICogQHBhcnNlOiAjR3N0QmFzZVBhcnNlLgorICoKKyAqIEltcGxlbWVudGF0aW9uIG9mICJzdG9wIiB2bWV0aG9kIGluICNHc3RCYXNlUGFyc2UgY2xhc3MuCisgKgorICogUmV0dXJuczogVFJVRSBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hbXJfcGFyc2Vfc3RvcCAoR3N0QmFzZVBhcnNlICogcGFyc2UpCit7CisgIEdzdEFtclBhcnNlICphbXJwYXJzZTsKKworICBhbXJwYXJzZSA9IEdTVF9BTVJfUEFSU0UgKHBhcnNlKTsKKyAgR1NUX0RFQlVHICgic3RvcCIpOworICBhbXJwYXJzZS0+bmVlZF9oZWFkZXIgPSBUUlVFOworICBhbXJwYXJzZS0+aGVhZGVyID0gMDsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9hbXJfcGFyc2Vfc2lua19nZXRjYXBzIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqcGVlcmNhcHMsICp0ZW1wbDsKKyAgR3N0Q2FwcyAqcmVzOworCisKKyAgdGVtcGwgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU0lOS19QQUQgKHBhcnNlKSk7CisgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgZmlsdGVyKTsKKworICBpZiAocGVlcmNhcHMpIHsKKyAgICBndWludCBpLCBuOworCisgICAgLyogUmVuYW1lIHN0cnVjdHVyZSBuYW1lcyAqLworICAgIHBlZXJjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocGVlcmNhcHMpOworICAgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAocGVlcmNhcHMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHBlZXJjYXBzLCBpKTsKKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJhdWRpby9BTVIiKSkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAocywgImF1ZGlvL3gtYW1yLW5iLXNoIik7CisgICAgICBlbHNlCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHMsICJhdWRpby94LWFtci13Yi1zaCIpOworICAgIH0KKworICAgIHJlcyA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChwZWVyY2FwcywgdGVtcGwsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICByZXMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChyZXMpOworICAgIC8qIEFwcGVuZCB0aGUgdGVtcGxhdGUgY2FwcyBiZWNhdXNlIHdlIHN0aWxsIHdhbnQgdG8gYWNjZXB0CisgICAgICogY2FwcyB3aXRob3V0IGFueSBmaWVsZHMgaW4gdGhlIGNhc2UgdXBzdHJlYW0gZG9lcyBub3QKKyAgICAgKiBrbm93IGFueXRoaW5nLgorICAgICAqLworICAgIGdzdF9jYXBzX2FwcGVuZCAocmVzLCB0ZW1wbCk7CisgIH0gZWxzZSB7CisgICAgcmVzID0gdGVtcGw7CisgIH0KKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgaW50ZXJzZWN0aW9uID0KKyAgICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgcmVzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChyZXMpOworICAgIHJlcyA9IGludGVyc2VjdGlvbjsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYW1yX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0QW1yUGFyc2UgKmFtcnBhcnNlID0gR1NUX0FNUl9QQVJTRSAocGFyc2UpOworCisgIGlmICghYW1ycGFyc2UtPnNlbnRfY29kZWNfdGFnKSB7CisgICAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgLyogY29kZWMgdGFnICovCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpKTsKKyAgICBpZiAoR19VTkxJS0VMWSAoY2FwcyA9PSBOVUxMKSkgeworICAgICAgaWYgKEdTVF9QQURfSVNfRkxVU0hJTkcgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSkpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgZmx1c2hpbmciKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgbm90IG5lZ290aWF0ZWQhIik7CisgICAgICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgICBnc3RfcGJfdXRpbHNfYWRkX2NvZGVjX2Rlc2NyaXB0aW9uX3RvX3RhZ19saXN0ICh0YWdsaXN0LAorICAgICAgICBHU1RfVEFHX0FVRElPX0NPREVDLCBjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICBnc3RfYmFzZV9wYXJzZV9tZXJnZV90YWdzIChwYXJzZSwgdGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ2xpc3QpOworCisgICAgLyogYWxzbyBzaWduYWxzIHRoZSBlbmQgb2YgZmlyc3QtZnJhbWUgcHJvY2Vzc2luZyAqLworICAgIGFtcnBhcnNlLT5zZW50X2NvZGVjX3RhZyA9IFRSVUU7CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmggYi9nc3QvYXVkaW9wYXJzZXJzL2dzdGFtcnBhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhMjljMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0YW1ycGFyc2UuaApAQCAtMCwwICsxLDc4IEBACisvKiBHU3RyZWFtZXIgQWRhcHRpdmUgTXVsdGktUmF0ZSBwYXJzZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdDogU3RlZmFuIEtvc3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0FNUl9QQVJTRV9IX18KKyNkZWZpbmUgX19HU1RfQU1SX1BBUlNFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2VwYXJzZS5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQU1SX1BBUlNFIFwKKyAgKGdzdF9hbXJfcGFyc2VfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0FNUl9QQVJTRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLCBHU1RfVFlQRV9BTVJfUEFSU0UsIEdzdEFtclBhcnNlKSkKKyNkZWZpbmUgR1NUX0FNUl9QQVJTRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSwgR1NUX1RZUEVfQU1SX1BBUlNFLCBHc3RBbXJQYXJzZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FNUl9QQVJTRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLCBHU1RfVFlQRV9BTVJfUEFSU0UpKQorI2RlZmluZSBHU1RfSVNfQU1SX1BBUlNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLCBHU1RfVFlQRV9BTVJfUEFSU0UpKQorCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBbXJQYXJzZSBHc3RBbXJQYXJzZTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RBbXJQYXJzZUNsYXNzIEdzdEFtclBhcnNlQ2xhc3M7CisKKy8qKgorICogR3N0QW1yUGFyc2U6CisgKiBAZWxlbWVudDogdGhlIHBhcmVudCBlbGVtZW50LgorICogQGJsb2NrX3NpemU6IFBvaW50ZXIgdG8gZnJhbWUgc2l6ZSBsb29rdXAgdGFibGUuCisgKiBAbmVlZF9oZWFkZXI6IFRlbGxzIHdoZXRoZXIgdGhlIE1JTUUgaGVhZGVyIHNob3VsZCBiZSByZWFkIGluIHRoZSBiZWdpbm5pbmcuCisgKiBAd2lkZTogV2lkZWJhbmQgbW9kZS4KKyAqCisgKiBUaGUgb3BhcXVlIEdzdEFhY1BhcnNlIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdEFtclBhcnNlIHsKKyAgR3N0QmFzZVBhcnNlIGVsZW1lbnQ7CisgIGNvbnN0IGdpbnQgKmJsb2NrX3NpemU7CisgIGdib29sZWFuIG5lZWRfaGVhZGVyOworICBnYm9vbGVhbiBzZW50X2NvZGVjX3RhZzsKKyAgZ2ludCBoZWFkZXI7CisgIGdib29sZWFuIHdpZGU7Cit9OworCisvKioKKyAqIEdzdEFtclBhcnNlQ2xhc3M6CisgKiBAcGFyZW50X2NsYXNzOiBFbGVtZW50IHBhcmVudCBjbGFzcy4KKyAqCisgKiBUaGUgb3BhcXVlIEdzdEFtclBhcnNlQ2xhc3MgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0QW1yUGFyc2VDbGFzcyB7CisgIEdzdEJhc2VQYXJzZUNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9hbXJfcGFyc2VfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQU1SX1BBUlNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYTQwYWMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9wYXJzZXJzL2dzdGRjYXBhcnNlLmMKQEAgLTAsMCArMSw2MTcgQEAKKy8qIEdTdHJlYW1lciBEQ0EgcGFyc2VyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1kY2FwYXJzZQorICogQHNob3J0X2Rlc2NyaXB0aW9uOiBEQ0EgKERUUyBDb2hlcmVudCBBY291c3RpY3MpIHBhcnNlcgorICogQHNlZV9hbHNvOiAjR3N0QW1yUGFyc2UsICNHc3RBQUNQYXJzZSwgI0dzdEFjM1BhcnNlCisgKgorICogVGhpcyBpcyBhIERDQSAoRFRTIENvaGVyZW50IEFjb3VzdGljcykgcGFyc2VyLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPWFiYy5kdHMgISBkY2FwYXJzZSAhIGR0c2RlYyAhIGF1ZGlvcmVzYW1wbGUgISBhdWRpb2NvbnZlcnQgISBhdXRvYXVkaW9zaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisvKiBUT0RPOgorICogIC0gc2hvdWxkIGFjY2VwdCBmcmFtZWQgYW5kIHVuZnJhbWVkIGlucHV0IChuZWVkcyBkZWNvZGViaW4gZml4ZXMgZmlyc3QpCisgKiAgLSBzZWVraW5nIGluIHJhdyAuZHRzIGZpbGVzIGRvZXNuJ3Qgc2VlbSB0byB3b3JrLCBidXQgZHVyYXRpb24gZXN0aW1hdGUgb2sKKyAqCisgKiAgLSBpZiBmcmFtZXMgaGF2ZSAnb2RkJyBkdXJhdGlvbnMsIHRoZSBmcmFtZSBkdXJhdGlvbnMgKHBsdXMgdGltZXN0YW1wcykKKyAqICAgIGFyZW4ndCBhZGp1c3RlZCB1cCBvY2Nhc2lvbmFsbHkgdG8gbWFrZSB1cCBmb3Igcm91bmRpbmcgZXJyb3IgZ2Fwcy4KKyAqICAgIChlLmcuIGlmIDUxMiBzYW1wbGVzIHBlciBmcmFtZSBAIDQ4a0h6ID0gMTAuNjY2NjY2NjY3IG1zL2ZyYW1lKQorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0ZGNhcGFyc2UuaCIKKyNpbmNsdWRlIDxnc3QvYmFzZS9iYXNlLmg+CisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvcGJ1dGlscy5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChkY2FfcGFyc2VfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZGNhX3BhcnNlX2RlYnVnCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1kdHMsIgorICAgICAgICAiIGZyYW1lZCA9IChib29sZWFuKSB0cnVlLCIKKyAgICAgICAgIiBjaGFubmVscyA9IChpbnQpIFsgMSwgOCBdLCIKKyAgICAgICAgIiByYXRlID0gKGludCkgWyA4MDAwLCAxOTIwMDAgXSwiCisgICAgICAgICIgZGVwdGggPSAoaW50KSB7IDE0LCAxNiB9LCIKKyAgICAgICAgIiBlbmRpYW5uZXNzID0gKGludCkgeyBMSVRUTEVfRU5ESUFOLCBCSUdfRU5ESUFOIH0sICIKKyAgICAgICAgIiBibG9jay1zaXplID0gKGludCkgWyAxLCBNQVhdLCAiICIgZnJhbWUtc2l6ZSA9IChpbnQpIFsgMSwgTUFYXSIpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWR0czsgIiAiYXVkaW8veC1wcml2YXRlMS1kdHMiKSk7CisKK3N0YXRpYyB2b2lkIGdzdF9kY2FfcGFyc2VfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2RjYV9wYXJzZV9zdGFydCAoR3N0QmFzZVBhcnNlICogcGFyc2UpOworc3RhdGljIGdib29sZWFuIGdzdF9kY2FfcGFyc2Vfc3RvcCAoR3N0QmFzZVBhcnNlICogcGFyc2UpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2RjYV9wYXJzZV9oYW5kbGVfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUsIGdpbnQgKiBza2lwc2l6ZSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZGNhX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfZGNhX3BhcnNlX2dldF9zaW5rX2NhcHMgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9kY2FfcGFyc2Vfc2V0X3NpbmtfY2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworCisjZGVmaW5lIGdzdF9kY2FfcGFyc2VfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0RGNhUGFyc2UsIGdzdF9kY2FfcGFyc2UsIEdTVF9UWVBFX0JBU0VfUEFSU0UpOworCitzdGF0aWMgdm9pZAorZ3N0X2RjYV9wYXJzZV9jbGFzc19pbml0IChHc3REY2FQYXJzZUNsYXNzICoga2xhc3MpCit7CisgIEdzdEJhc2VQYXJzZUNsYXNzICpwYXJzZV9jbGFzcyA9IEdTVF9CQVNFX1BBUlNFX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZGNhX3BhcnNlX2RlYnVnLCAiZGNhcGFyc2UiLCAwLAorICAgICAgIkRDQSBhdWRpbyBzdHJlYW0gcGFyc2VyIik7CisKKyAgb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9kY2FfcGFyc2VfZmluYWxpemU7CisKKyAgcGFyc2VfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kY2FfcGFyc2Vfc3RhcnQpOworICBwYXJzZV9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGNhX3BhcnNlX3N0b3ApOworICBwYXJzZV9jbGFzcy0+aGFuZGxlX2ZyYW1lID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kY2FfcGFyc2VfaGFuZGxlX2ZyYW1lKTsKKyAgcGFyc2VfY2xhc3MtPnByZV9wdXNoX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGNhX3BhcnNlX3ByZV9wdXNoX2ZyYW1lKTsKKyAgcGFyc2VfY2xhc3MtPmdldF9zaW5rX2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RjYV9wYXJzZV9nZXRfc2lua19jYXBzKTsKKyAgcGFyc2VfY2xhc3MtPnNldF9zaW5rX2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RjYV9wYXJzZV9zZXRfc2lua19jYXBzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywKKyAgICAgICJEVFMgQ29oZXJlbnQgQWNvdXN0aWNzIGF1ZGlvIHN0cmVhbSBwYXJzZXIiLCAiQ29kZWMvUGFyc2VyL0F1ZGlvIiwKKyAgICAgICJEQ0EgcGFyc2VyIiwgIlRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGNhX3BhcnNlX3Jlc2V0IChHc3REY2FQYXJzZSAqIGRjYXBhcnNlKQoreworICBkY2FwYXJzZS0+Y2hhbm5lbHMgPSAtMTsKKyAgZGNhcGFyc2UtPnJhdGUgPSAtMTsKKyAgZGNhcGFyc2UtPmRlcHRoID0gLTE7CisgIGRjYXBhcnNlLT5lbmRpYW5uZXNzID0gLTE7CisgIGRjYXBhcnNlLT5ibG9ja19zaXplID0gLTE7CisgIGRjYXBhcnNlLT5mcmFtZV9zaXplID0gLTE7CisgIGRjYXBhcnNlLT5sYXN0X3N5bmMgPSAwOworICBkY2FwYXJzZS0+c2VudF9jb2RlY190YWcgPSBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kY2FfcGFyc2VfaW5pdCAoR3N0RGNhUGFyc2UgKiBkY2FwYXJzZSkKK3sKKyAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChHU1RfQkFTRV9QQVJTRSAoZGNhcGFyc2UpLAorICAgICAgRENBX01JTl9GUkFNRVNJWkUpOworICBnc3RfZGNhX3BhcnNlX3Jlc2V0IChkY2FwYXJzZSk7CisgIGRjYXBhcnNlLT5iYXNlcGFyc2VfY2hhaW5mdW5jID0KKyAgICAgIEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChHU1RfQkFTRV9QQVJTRSAoZGNhcGFyc2UpKS0+Y2hhaW5mdW5jOworCisgIEdTVF9QQURfU0VUX0FDQ0VQVF9JTlRFUlNFQ1QgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChkY2FwYXJzZSkpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChkY2FwYXJzZSkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RjYV9wYXJzZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kY2FfcGFyc2Vfc3RhcnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKQoreworICBHc3REY2FQYXJzZSAqZGNhcGFyc2UgPSBHU1RfRENBX1BBUlNFIChwYXJzZSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJzdGFydGluZyIpOworCisgIGdzdF9kY2FfcGFyc2VfcmVzZXQgKGRjYXBhcnNlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZGNhX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKQoreworICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgInN0b3BwaW5nIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RjYV9wYXJzZV9wYXJzZV9oZWFkZXIgKEdzdERjYVBhcnNlICogZGNhcGFyc2UsCisgICAgY29uc3QgR3N0Qnl0ZVJlYWRlciAqIHJlYWRlciwgZ3VpbnQgKiBmcmFtZV9zaXplLAorICAgIGd1aW50ICogc2FtcGxlX3JhdGUsIGd1aW50ICogY2hhbm5lbHMsIGd1aW50ICogZGVwdGgsCisgICAgZ2ludCAqIGVuZGlhbm5lc3MsIGd1aW50ICogbnVtX2Jsb2NrcywgZ3VpbnQgKiBzYW1wbGVzX3Blcl9ibG9jaywKKyAgICBnYm9vbGVhbiAqIHRlcm1pbmF0b3IpCit7CisgIHN0YXRpYyBjb25zdCBpbnQgc2FtcGxlX3JhdGVzWzE2XSA9IHsgMCwgODAwMCwgMTYwMDAsIDMyMDAwLCAwLCAwLCAxMTAyNSwKKyAgICAyMjA1MCwgNDQxMDAsIDAsIDAsIDEyMDAwLCAyNDAwMCwgNDgwMDAsIDk2MDAwLCAxOTIwMDAKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGd1aW50OCBjaGFubmVsc190YWJsZVsxNl0gPSB7IDEsIDIsIDIsIDIsIDIsIDMsIDMsIDQsIDQsIDUsCisgICAgNiwgNiwgNiwgNywgOCwgOAorICB9OworICBHc3RCeXRlUmVhZGVyIHIgPSAqcmVhZGVyOworICBndWludDE2IGhkcls4XTsKKyAgZ3VpbnQzMiBtYXJrZXI7CisgIGd1aW50IGNoYW5zLCBsZmUsIGk7CisKKyAgaWYgKGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nICgmcikgPCAoNCArIHNpemVvZiAoaGRyKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIG1hcmtlciA9IGdzdF9ieXRlX3JlYWRlcl9wZWVrX3VpbnQzMl9iZV91bmNoZWNrZWQgKCZyKTsKKworICAvKiByYXcgYmlnIGVuZGlhbiBvciAxNC1iaXQgYmlnIGVuZGlhbiAqLworICBpZiAobWFya2VyID09IDB4N0ZGRTgwMDEgfHwgbWFya2VyID09IDB4MUZGRkU4MDApIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChoZHIpOyArK2kpCisgICAgICBoZHJbaV0gPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9iZV91bmNoZWNrZWQgKCZyKTsKKyAgfSBlbHNlCisgICAgLyogcmF3IGxpdHRsZSBlbmRpYW4gb3IgMTQtYml0IGxpdHRsZSBlbmRpYW4gKi8KKyAgaWYgKG1hcmtlciA9PSAweEZFN0YwMTgwIHx8IG1hcmtlciA9PSAweEZGMUYwMEU4KSB7CisgICAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAoaGRyKTsgKytpKQorICAgICAgaGRyW2ldID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGVfdW5jaGVja2VkICgmcik7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRjYXBhcnNlLCAiZHRzIHN5bmMgbWFya2VyIDB4JTA4eCBhdCBvZmZzZXQgJXUiLCBtYXJrZXIsCisgICAgICBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3BvcyAocmVhZGVyKSk7CisKKyAgLyogMTQtYml0IG1vZGUgKi8KKyAgaWYgKG1hcmtlciA9PSAweDFGRkZFODAwIHx8IG1hcmtlciA9PSAweEZGMUYwMEU4KSB7CisgICAgaWYgKChoZHJbMl0gJiAweEZGRjApICE9IDB4MDdGMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAvKiBkaXNjYXJkIHRvcCAyIGJpdHMgKDIgdm9pZCksIHNoaWZ0IGluIDIgKi8KKyAgICBoZHJbMF0gPSAoaGRyWzBdIDw8IDIpIHwgKChoZHJbMV0gPj4gMTIpICYgMHgwMDAzKTsKKyAgICAvKiBkaXNjYXJkIHRvcCA0IGJpdHMgKDIgdm9pZCwgMiBzaGlmdGVkIGludG8gaGRyWzBdKSwgc2hpZnQgaW4gNCBldGMuICovCisgICAgaGRyWzFdID0gKGhkclsxXSA8PCA0KSB8ICgoaGRyWzJdID4+IDEwKSAmIDB4MDAwRik7CisgICAgaGRyWzJdID0gKGhkclsyXSA8PCA2KSB8ICgoaGRyWzNdID4+IDgpICYgMHgwMDNGKTsKKyAgICBoZHJbM10gPSAoaGRyWzNdIDw8IDgpIHwgKChoZHJbNF0gPj4gNikgJiAweDAwRkYpOworICAgIGhkcls0XSA9IChoZHJbNF0gPDwgMTApIHwgKChoZHJbNV0gPj4gNCkgJiAweDAzRkYpOworICAgIGhkcls1XSA9IChoZHJbNV0gPDwgMTIpIHwgKChoZHJbNl0gPj4gMikgJiAweDBGRkYpOworICAgIGhkcls2XSA9IChoZHJbNl0gPDwgMTQpIHwgKChoZHJbN10gPj4gMCkgJiAweDNGRkYpOworICAgIGdfYXNzZXJ0IChoZHJbMF0gPT0gMHg3RkZFICYmIGhkclsxXSA9PSAweDgwMDEpOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRjYXBhcnNlLCAiZnJhbWUgaGVhZGVyOiAlMDR4JTA0eCUwNHglMDR4IiwKKyAgICAgIGhkclsyXSwgaGRyWzNdLCBoZHJbNF0sIGhkcls1XSk7CisKKyAgKnRlcm1pbmF0b3IgPSAoaGRyWzJdICYgMHg4MCkgPyBGQUxTRSA6IFRSVUU7CisgICpzYW1wbGVzX3Blcl9ibG9jayA9ICgoaGRyWzJdID4+IDEwKSAmIDB4MWYpICsgMTsKKyAgKm51bV9ibG9ja3MgPSAoKGhkclsyXSA+PiAyKSAmIDB4N0YpICsgMTsKKyAgKmZyYW1lX3NpemUgPSAoKChoZHJbMl0gJiAweDAzKSA8PCAxMikgfCAoaGRyWzNdID4+IDQpKSArIDE7CisgIGNoYW5zID0gKChoZHJbM10gJiAweDBGKSA8PCAyKSB8IChoZHJbNF0gPj4gMTQpOworICAqc2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZXNbKGhkcls0XSA+PiAxMCkgJiAweDBGXTsKKyAgbGZlID0gKGhkcls1XSA+PiA5KSAmIDB4MDM7CisKKyAgR1NUX1RSQUNFX09CSkVDVCAoZGNhcGFyc2UsICJmcmFtZSBzaXplICV1LCBudW1fYmxvY2tzICV1LCByYXRlICV1LCAiCisgICAgICAic2FtcGxlcyBwZXIgYmxvY2sgJXUiLCAqZnJhbWVfc2l6ZSwgKm51bV9ibG9ja3MsICpzYW1wbGVfcmF0ZSwKKyAgICAgICpzYW1wbGVzX3Blcl9ibG9jayk7CisKKyAgaWYgKCpudW1fYmxvY2tzIDwgNiB8fCAqZnJhbWVfc2l6ZSA8IDk2IHx8ICpzYW1wbGVfcmF0ZSA9PSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobWFya2VyID09IDB4MUZGRkU4MDAgfHwgbWFya2VyID09IDB4RkYxRjAwRTgpCisgICAgKmZyYW1lX3NpemUgPSAoKmZyYW1lX3NpemUgKiAxNikgLyAxNDsgICAgICAvKiBGSVhNRTogcm91bmQgdXA/ICovCisKKyAgaWYgKGNoYW5zIDwgR19OX0VMRU1FTlRTIChjaGFubmVsc190YWJsZSkpCisgICAgKmNoYW5uZWxzID0gY2hhbm5lbHNfdGFibGVbY2hhbnNdICsgKChsZmUpID8gMSA6IDApOworICBlbHNlCisgICAgKmNoYW5uZWxzID0gMDsKKworICBpZiAoZGVwdGgpCisgICAgKmRlcHRoID0gKG1hcmtlciA9PSAweDFGRkZFODAwIHx8IG1hcmtlciA9PSAweEZGMUYwMEU4KSA/IDE0IDogMTY7CisgIGlmIChlbmRpYW5uZXNzKQorICAgICplbmRpYW5uZXNzID0gKG1hcmtlciA9PSAweEZFN0YwMTgwIHx8IG1hcmtlciA9PSAweEZGMUYwMEU4KSA/CisgICAgICAgIEdfTElUVExFX0VORElBTiA6IEdfQklHX0VORElBTjsKKworICBHU1RfVFJBQ0VfT0JKRUNUIChkY2FwYXJzZSwgImZyYW1lIHNpemUgJXUsIGNoYW5uZWxzICV1LCByYXRlICV1LCAiCisgICAgICAibnVtX2Jsb2NrcyAldSwgc2FtcGxlc19wZXJfYmxvY2sgJXUiLCAqZnJhbWVfc2l6ZSwgKmNoYW5uZWxzLAorICAgICAgKnNhbXBsZV9yYXRlLCAqbnVtX2Jsb2NrcywgKnNhbXBsZXNfcGVyX2Jsb2NrKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdpbnQKK2dzdF9kY2FfcGFyc2VfZmluZF9zeW5jIChHc3REY2FQYXJzZSAqIGRjYXBhcnNlLCBHc3RCeXRlUmVhZGVyICogcmVhZGVyLAorICAgIGdzaXplIGJ1ZnNpemUsIGd1aW50MzIgKiBzeW5jKQoreworICBndWludDMyIGJlc3Rfc3luYyA9IDA7CisgIGd1aW50IGJlc3Rfb2Zmc2V0ID0gR19NQVhVSU5UOworICBnaW50IG9mZjsKKworICAvKiBGSVhNRTogdmVyaWZ5IHN5bmNzIHZpYSBfcGFyc2VfaGVhZGVyKCkgaGVyZSBhbHJlYWR5ICovCisKKyAgLyogUmF3IGxpdHRsZSBlbmRpYW4gKi8KKyAgb2ZmID0gZ3N0X2J5dGVfcmVhZGVyX21hc2tlZF9zY2FuX3VpbnQzMiAocmVhZGVyLCAweGZmZmZmZmZmLCAweGZlN2YwMTgwLAorICAgICAgMCwgYnVmc2l6ZSk7CisgIGlmIChvZmYgPj0gMCAmJiBvZmYgPCBiZXN0X29mZnNldCkgeworICAgIGJlc3Rfb2Zmc2V0ID0gb2ZmOworICAgIGJlc3Rfc3luYyA9IDB4ZmU3ZjAxODA7CisgIH0KKworICAvKiBSYXcgYmlnIGVuZGlhbiAqLworICBvZmYgPSBnc3RfYnl0ZV9yZWFkZXJfbWFza2VkX3NjYW5fdWludDMyIChyZWFkZXIsIDB4ZmZmZmZmZmYsIDB4N2ZmZTgwMDEsCisgICAgICAwLCBidWZzaXplKTsKKyAgaWYgKG9mZiA+PSAwICYmIG9mZiA8IGJlc3Rfb2Zmc2V0KSB7CisgICAgYmVzdF9vZmZzZXQgPSBvZmY7CisgICAgYmVzdF9zeW5jID0gMHg3ZmZlODAwMTsKKyAgfQorCisgIC8qIEZJWE1FOiBjaGVjayBuZXh0IDIgYnl0ZXMgYXMgd2VsbCBmb3IgMTQtYml0IGZvcm1hdHMgKGJ1dCB0aGVuIGRvbid0CisgICAqIGZvcmdldCB0byBhZGp1c3QgdGhlICpza2lwc2l6ZT0gaW4gX2NoZWNrX3ZhbGlkX2ZyYW1lKCkgKi8KKworICAvKiAxNC1iaXQgbGl0dGxlIGVuZGlhbiAgKi8KKyAgb2ZmID0gZ3N0X2J5dGVfcmVhZGVyX21hc2tlZF9zY2FuX3VpbnQzMiAocmVhZGVyLCAweGZmZmZmZmZmLCAweGZmMWYwMGU4LAorICAgICAgMCwgYnVmc2l6ZSk7CisgIGlmIChvZmYgPj0gMCAmJiBvZmYgPCBiZXN0X29mZnNldCkgeworICAgIGJlc3Rfb2Zmc2V0ID0gb2ZmOworICAgIGJlc3Rfc3luYyA9IDB4ZmYxZjAwZTg7CisgIH0KKworICAvKiAxNC1iaXQgYmlnIGVuZGlhbiAgKi8KKyAgb2ZmID0gZ3N0X2J5dGVfcmVhZGVyX21hc2tlZF9zY2FuX3VpbnQzMiAocmVhZGVyLCAweGZmZmZmZmZmLCAweDFmZmZlODAwLAorICAgICAgMCwgYnVmc2l6ZSk7CisgIGlmIChvZmYgPj0gMCAmJiBvZmYgPCBiZXN0X29mZnNldCkgeworICAgIGJlc3Rfb2Zmc2V0ID0gb2ZmOworICAgIGJlc3Rfc3luYyA9IDB4MWZmZmU4MDA7CisgIH0KKworICBpZiAoYmVzdF9vZmZzZXQgPT0gR19NQVhVSU5UKQorICAgIHJldHVybiAtMTsKKworICAqc3luYyA9IGJlc3Rfc3luYzsKKyAgcmV0dXJuIGJlc3Rfb2Zmc2V0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2RjYV9wYXJzZV9oYW5kbGVfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUsIGdpbnQgKiBza2lwc2l6ZSkKK3sKKyAgR3N0RGNhUGFyc2UgKmRjYXBhcnNlID0gR1NUX0RDQV9QQVJTRSAocGFyc2UpOworICBHc3RCdWZmZXIgKmJ1ZiA9IGZyYW1lLT5idWZmZXI7CisgIEdzdEJ5dGVSZWFkZXIgcjsKKyAgZ2Jvb2xlYW4gcGFyc2VyX2luX3N5bmM7CisgIGdib29sZWFuIHRlcm1pbmF0b3I7CisgIGd1aW50MzIgc3luYyA9IDA7CisgIGd1aW50IHNpemUgPSAwLCByYXRlLCBjaGFucywgbnVtX2Jsb2Nrcywgc2FtcGxlc19wZXJfYmxvY2ssIGRlcHRoOworICBnaW50IGJsb2NrX3NpemU7CisgIGdpbnQgZW5kaWFubmVzczsKKyAgZ2ludCBvZmYgPSAtMTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfRU9TOworICBnc2l6ZSBleHRyYV9zaXplID0gMDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIGlmIChHX1VOTElLRUxZIChtYXAuc2l6ZSA8IDE2KSkgeworICAgICpza2lwc2l6ZSA9IDE7CisgICAgZ290byBjbGVhbnVwOworICB9CisKKyAgcGFyc2VyX2luX3N5bmMgPSAhR1NUX0JBU0VfUEFSU0VfTE9TVF9TWU5DIChwYXJzZSk7CisKKyAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZyLCBtYXAuZGF0YSwgbWFwLnNpemUpOworCisgIGlmIChHX0xJS0VMWSAocGFyc2VyX2luX3N5bmMgJiYgZGNhcGFyc2UtPmxhc3Rfc3luYyAhPSAwKSkgeworICAgIG9mZiA9IGdzdF9ieXRlX3JlYWRlcl9tYXNrZWRfc2Nhbl91aW50MzIgKCZyLCAweGZmZmZmZmZmLAorICAgICAgICBkY2FwYXJzZS0+bGFzdF9zeW5jLCAwLCBtYXAuc2l6ZSk7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAob2ZmIDwgMCkpIHsKKyAgICBvZmYgPSBnc3RfZGNhX3BhcnNlX2ZpbmRfc3luYyAoZGNhcGFyc2UsICZyLCBtYXAuc2l6ZSwgJnN5bmMpOworICB9CisKKyAgLyogZGlkbid0IGZpbmQgYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlIGEgc3luYyB3b3JkLCBza2lwICovCisgIGlmIChvZmYgPCAwKSB7CisgICAgKnNraXBzaXplID0gbWFwLnNpemUgLSAzOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRjYXBhcnNlLCAibm8gc3luYywgc2tpcHBpbmcgJWQgYnl0ZXMiLCAqc2tpcHNpemUpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgInBvc3NpYmxlIHN5bmMgJTA4eCBhdCBidWZmZXIgb2Zmc2V0ICVkIiwgc3luYywgb2ZmKTsKKworICAvKiBwb3NzaWJsZSBmcmFtZSBoZWFkZXIsIGJ1dCBub3QgYXQgb2Zmc2V0IDA/IHNraXAgYnl0ZXMgYmVmb3JlIHN5bmMgKi8KKyAgaWYgKG9mZiA+IDApIHsKKyAgICAqc2tpcHNpemUgPSBvZmY7CisgICAgZ290byBjbGVhbnVwOworICB9CisKKyAgLyogbWFrZSBzdXJlIHRoZSB2YWx1ZXMgaW4gdGhlIGZyYW1lIGhlYWRlciBsb29rIHNhbmUgKi8KKyAgaWYgKCFnc3RfZGNhX3BhcnNlX3BhcnNlX2hlYWRlciAoZGNhcGFyc2UsICZyLCAmc2l6ZSwgJnJhdGUsICZjaGFucywgJmRlcHRoLAorICAgICAgICAgICZlbmRpYW5uZXNzLCAmbnVtX2Jsb2NrcywgJnNhbXBsZXNfcGVyX2Jsb2NrLCAmdGVybWluYXRvcikpIHsKKyAgICAqc2tpcHNpemUgPSA0OworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgImdvdCBmcmFtZSwgc3luYyAlMDh4LCBzaXplICV1LCByYXRlICVkLCBjaGFubmVscyAlZCIsCisgICAgICBzeW5jLCBzaXplLCByYXRlLCBjaGFucyk7CisKKyAgZGNhcGFyc2UtPmxhc3Rfc3luYyA9IHN5bmM7CisKKyAgLyogRklYTUU6IERvbid0IGxvb2sgZm9yIGEgc2Vjb25kIHN5bmN3b3JkLCB0aGVyZSBhcmUgc3RyZWFtcyBvdXQgdGhlcmUKKyAgICogdGhhdCBjb25zaXN0ZW50bHkgY29udGFpbiBnYXJiYWdlIGJldHdlZW4gZXZlcnkgZnJhbWUgc28gd2UgbmV2ZXIgZXZlcgorICAgKiBmaW5kIGEgc2Vjb25kIGNvbnNlY3V0aXZlIHN5bmN3b3JkLgorICAgKiBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTczODIzNworICAgKi8KKyNpZiAwCisgIHBhcnNlcl9kcmFpbmluZyA9IEdTVF9CQVNFX1BBUlNFX0RSQUlOSU5HIChwYXJzZSk7CisKKyAgaWYgKCFwYXJzZXJfaW5fc3luYyAmJiAhcGFyc2VyX2RyYWluaW5nKSB7CisgICAgLyogY2hlY2sgZm9yIHNlY29uZCBmcmFtZSB0byBiZSBzdXJlICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGNhcGFyc2UsICJyZXN5bmNpbmc7IGNoZWNraW5nIG5leHQgZnJhbWUgc3luY3dvcmQiKTsKKyAgICBpZiAobWFwLnNpemUgPj0gKHNpemUgKyAxNikpIHsKKyAgICAgIGd1aW50IHMyLCByMiwgYzIsIG4yLCBzMzsKKyAgICAgIGdib29sZWFuIHQ7CisKKyAgICAgIEdTVF9NRU1EVU1QICgiYnVmIiwgbWFwLmRhdGEsIHNpemUgKyAxNik7CisgICAgICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJnIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgICBnc3RfYnl0ZV9yZWFkZXJfc2tpcF91bmNoZWNrZWQgKCZyLCBzaXplKTsKKworICAgICAgaWYgKCFnc3RfZGNhX3BhcnNlX3BhcnNlX2hlYWRlciAoZGNhcGFyc2UsICZyLCAmczIsICZyMiwgJmMyLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAmbjIsICZzMywgJnQpKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRjYXBhcnNlLCAiZGlkbid0IGZpbmQgc2Vjb25kIHN5bmN3b3JkIik7CisgICAgICAgICpza2lwc2l6ZSA9IDQ7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgIH0KKworICAgICAgLyogb2ssIGdvdCBzeW5jIG5vdywgbGV0J3MgYXNzdW1lIGNvbnN0YW50IGZyYW1lIHNpemUgKi8KKyAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAocGFyc2UsIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAvKiB3YWl0IGZvciBzb21lIG1vcmUgZGF0YSAqLworICAgICAgR1NUX0xPR19PQkpFQ1QgKGRjYXBhcnNlLAorICAgICAgICAgICJuZXh0IHN5bmMgb3V0IG9mIHJlYWNoICglIiBHX0dTSVpFX0ZPUk1BVCAiIDwgJXUpIiwgbWFwLnNpemUsCisgICAgICAgICAgc2l6ZSArIDE2KTsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIC8qIGZvdW5kIGZyYW1lICovCisgIHJldCA9IEdTVF9GTE9XX09LOworCisgIC8qIG1ldGFkYXRhIGhhbmRsaW5nICovCisgIGJsb2NrX3NpemUgPSBudW1fYmxvY2tzICogc2FtcGxlc19wZXJfYmxvY2s7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGRjYXBhcnNlLT5yYXRlICE9IHJhdGUgfHwgZGNhcGFyc2UtPmNoYW5uZWxzICE9IGNoYW5zCisgICAgICAgICAgfHwgZGNhcGFyc2UtPmRlcHRoICE9IGRlcHRoIHx8IGRjYXBhcnNlLT5lbmRpYW5uZXNzICE9IGVuZGlhbm5lc3MKKyAgICAgICAgICB8fCAoIXRlcm1pbmF0b3IgJiYgZGNhcGFyc2UtPmJsb2NrX3NpemUgIT0gYmxvY2tfc2l6ZSkKKyAgICAgICAgICB8fCAoc2l6ZSAhPSBkY2FwYXJzZS0+ZnJhbWVfc2l6ZSkpKSB7CisgICAgR3N0Q2FwcyAqY2FwczsKKworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1kdHMiLAorICAgICAgICAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsCisgICAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgcmF0ZSwgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgY2hhbnMsCisgICAgICAgICJlbmRpYW5uZXNzIiwgR19UWVBFX0lOVCwgZW5kaWFubmVzcywgImRlcHRoIiwgR19UWVBFX0lOVCwgZGVwdGgsCisgICAgICAgICJibG9jay1zaXplIiwgR19UWVBFX0lOVCwgYmxvY2tfc2l6ZSwgImZyYW1lLXNpemUiLCBHX1RZUEVfSU5ULCBzaXplLAorICAgICAgICBOVUxMKTsKKyAgICBnc3RfcGFkX3NldF9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChwYXJzZSksIGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgIGRjYXBhcnNlLT5yYXRlID0gcmF0ZTsKKyAgICBkY2FwYXJzZS0+Y2hhbm5lbHMgPSBjaGFuczsKKyAgICBkY2FwYXJzZS0+ZGVwdGggPSBkZXB0aDsKKyAgICBkY2FwYXJzZS0+ZW5kaWFubmVzcyA9IGVuZGlhbm5lc3M7CisgICAgZGNhcGFyc2UtPmJsb2NrX3NpemUgPSBibG9ja19zaXplOworICAgIGRjYXBhcnNlLT5mcmFtZV9zaXplID0gc2l6ZTsKKworICAgIGdzdF9iYXNlX3BhcnNlX3NldF9mcmFtZV9yYXRlIChwYXJzZSwgcmF0ZSwgYmxvY2tfc2l6ZSwgMCwgMCk7CisgIH0KKworY2xlYW51cDoKKyAgLyogaXQgaXMgcG9zc2libGUgdGhhdCBEVFMgSEQgc3Vic3RyZWFtIGFmdGVyIERUUyBjb3JlICovCisgIGlmIChwYXJzZS0+ZmxhZ3MgJiBHU1RfQkFTRV9QQVJTRV9GTEFHX0RSQUlOSU5HIHx8IG1hcC5zaXplID49IHNpemUgKyA5KSB7CisgICAgZXh0cmFfc2l6ZSA9IDA7CisgICAgaWYgKG1hcC5zaXplID49IHNpemUgKyA5KSB7CisgICAgICBjb25zdCBndWludDggKm5leHQgPSBtYXAuZGF0YSArIHNpemU7CisgICAgICAvKiBDaGVjayBmb3IgRFRTX1NZTkNXT1JEX1NVQlNUUkVBTSAqLworICAgICAgaWYgKG5leHRbMF0gPT0gMHg2NCAmJiBuZXh0WzFdID09IDB4NTggJiYgbmV4dFsyXSA9PSAweDIwCisgICAgICAgICAgJiYgbmV4dFszXSA9PSAweDI1KSB7CisgICAgICAgIC8qIDcuNC4xIEV4dGVuc2lvbiBTdWJzdHJlYW0gSGVhZGVyICovCisgICAgICAgIEdzdEJpdFJlYWRlciByZWFkZXI7CisgICAgICAgIGdzdF9iaXRfcmVhZGVyX2luaXQgKCZyZWFkZXIsIG5leHQgKyA0LCA1KTsKKyAgICAgICAgZ3N0X2JpdF9yZWFkZXJfc2tpcCAoJnJlYWRlciwgOCArIDIpOyAgIC8qIHNraXAgVXNlckRlZmluZWRCaXRzIGFuZCBuRXh0U1NJbmRleCkgKi8KKyAgICAgICAgaWYgKGdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4X3VuY2hlY2tlZCAoJnJlYWRlciwgMSkgPT0gMCkgeworICAgICAgICAgIGdzdF9iaXRfcmVhZGVyX3NraXAgKCZyZWFkZXIsIDgpOworICAgICAgICAgIGV4dHJhX3NpemUgPQorICAgICAgICAgICAgICBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzJfdW5jaGVja2VkICgmcmVhZGVyLCAxNikgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9iaXRfcmVhZGVyX3NraXAgKCZyZWFkZXIsIDEyKTsKKyAgICAgICAgICBleHRyYV9zaXplID0KKyAgICAgICAgICAgICAgZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDMyX3VuY2hlY2tlZCAoJnJlYWRlciwgMjApICsgMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgc2l6ZSArIGV4dHJhX3NpemUgPD0gbWFwLnNpemUpIHsKKyAgICAgIHJldCA9IGdzdF9iYXNlX3BhcnNlX2ZpbmlzaF9mcmFtZSAocGFyc2UsIGZyYW1lLCBzaXplICsgZXh0cmFfc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE1QRUctUFMgcHJpdmF0ZTEgc3RyZWFtcyBhZGQgYSAyIGJ5dGVzICJBdWRpbyBTdWJzdHJlYW0gSGVhZGVycyIgZm9yIGVhY2gKKyAqIGJ1ZmZlciAobm90IGVhY2ggZnJhbWUpIHdpdGggdGhlIG9mZnNldCBvZiB0aGUgbmV4dCBmcmFtZSdzIHN0YXJ0LgorICogVGhlc2UgMiBieXRlcyBjYW4gYmUgZHJvcHBlZCBzYWZlbHkgYXMgdGhleSBkbyBub3QgaW5jbHVkZSBhbnkgdGltaW5nCisgKiBpbmZvcm1hdGlvbiwgb25seSB0aGUgb2Zmc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBmcmFtZS4KKyAqIFNlZSBnc3RhYzNwYXJzZS5jIGZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24uCisgKiAqLworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2RjYV9wYXJzZV9jaGFpbl9wcml2IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3REY2FQYXJzZSAqZGNhcGFyc2UgPSBHU1RfRENBX1BBUlNFIChwYXJlbnQpOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0QnVmZmVyICpuZXdidWY7CisgIGdzaXplIHNpemU7CisKKyAgc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcik7CisgIGlmIChzaXplID49IDIpIHsKKyAgICBuZXdidWYgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIDIsIHNpemUgLSAyKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldCA9IGRjYXBhcnNlLT5iYXNlcGFyc2VfY2hhaW5mdW5jIChwYWQsIHBhcmVudCwgbmV3YnVmKTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldCA9IEdTVF9GTE9XX09LOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9maWVsZHMgKEdzdENhcHMgKiBjYXBzKQoreworICBndWludCBpLCBuOworCisgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCAiZnJhbWVkIik7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2RjYV9wYXJzZV9nZXRfc2lua19jYXBzIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqcGVlcmNhcHMsICp0ZW1wbDsKKyAgR3N0Q2FwcyAqcmVzOworCisgIHRlbXBsID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChwYXJzZSkpOworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqZmNvcHkgPSBnc3RfY2Fwc19jb3B5IChmaWx0ZXIpOworICAgIC8qIFJlbW92ZSB0aGUgZmllbGRzIHdlIGNvbnZlcnQgKi8KKyAgICByZW1vdmVfZmllbGRzIChmY29weSk7CisgICAgcGVlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpLCBmY29weSk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGZjb3B5KTsKKyAgfSBlbHNlCisgICAgcGVlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpLCBOVUxMKTsKKworICBpZiAocGVlcmNhcHMpIHsKKyAgICAvKiBSZW1vdmUgdGhlIGZyYW1lZCBmaWVsZCAqLworICAgIHBlZXJjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocGVlcmNhcHMpOworICAgIHJlbW92ZV9maWVsZHMgKHBlZXJjYXBzKTsKKworICAgIHJlcyA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChwZWVyY2FwcywgdGVtcGwsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGVtcGwpOworICB9IGVsc2UgeworICAgIHJlcyA9IHRlbXBsOworICB9CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmludGVyc2VjdGlvbjsKKworICAgIGludGVyc2VjdGlvbiA9CisgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHJlcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmVzKTsKKyAgICByZXMgPSBpbnRlcnNlY3Rpb247CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kY2FfcGFyc2Vfc2V0X3NpbmtfY2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdzdERjYVBhcnNlICpkY2FwYXJzZSA9IEdTVF9EQ0FfUEFSU0UgKHBhcnNlKTsKKworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiYXVkaW8veC1wcml2YXRlMS1kdHMiKSkgeworICAgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChwYXJzZS0+c2lua3BhZCwgZ3N0X2RjYV9wYXJzZV9jaGFpbl9wcml2KTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAocGFyc2UtPnNpbmtwYWQsIGRjYXBhcnNlLT5iYXNlcGFyc2VfY2hhaW5mdW5jKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9kY2FfcGFyc2VfcHJlX3B1c2hfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLCBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lKQoreworICBHc3REY2FQYXJzZSAqZGNhcGFyc2UgPSBHU1RfRENBX1BBUlNFIChwYXJzZSk7CisKKyAgaWYgKCFkY2FwYXJzZS0+c2VudF9jb2RlY190YWcpIHsKKyAgICBHc3RUYWdMaXN0ICp0YWdsaXN0OworICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAvKiBjb2RlYyB0YWcgKi8KKyAgICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChwYXJzZSkpOworICAgIGlmIChHX1VOTElLRUxZIChjYXBzID09IE5VTEwpKSB7CisgICAgICBpZiAoR1NUX1BBRF9JU19GTFVTSElORyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpKSkgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHBhcnNlLCAiU3JjIHBhZCBpcyBmbHVzaGluZyIpOworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRkxVU0hJTkc7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHBhcnNlLCAiU3JjIHBhZCBpcyBub3QgbmVnb3RpYXRlZCEiKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICAgICAgfQorICAgIH0KKworICAgIHRhZ2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgIGdzdF9wYl91dGlsc19hZGRfY29kZWNfZGVzY3JpcHRpb25fdG9fdGFnX2xpc3QgKHRhZ2xpc3QsCisgICAgICAgIEdTVF9UQUdfQVVESU9fQ09ERUMsIGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgIGdzdF9iYXNlX3BhcnNlX21lcmdlX3RhZ3MgKHBhcnNlLCB0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UpOworICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnbGlzdCk7CisKKyAgICAvKiBhbHNvIHNpZ25hbHMgdGhlIGVuZCBvZiBmaXJzdC1mcmFtZSBwcm9jZXNzaW5nICovCisgICAgZGNhcGFyc2UtPnNlbnRfY29kZWNfdGFnID0gVFJVRTsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuaCBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0ZGNhcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTk4YTA2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RkY2FwYXJzZS5oCkBAIC0wLDAgKzEsODIgQEAKKy8qIEdTdHJlYW1lciBEQ0EgcGFyc2VyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0RDQV9QQVJTRV9IX18KKyNkZWZpbmUgX19HU1RfRENBX1BBUlNFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2VwYXJzZS5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfRENBX1BBUlNFIFwKKyAgKGdzdF9kY2FfcGFyc2VfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0RDQV9QQVJTRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLCBHU1RfVFlQRV9EQ0FfUEFSU0UsIEdzdERjYVBhcnNlKSkKKyNkZWZpbmUgR1NUX0RDQV9QQVJTRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSwgR1NUX1RZUEVfRENBX1BBUlNFLCBHc3REY2FQYXJzZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0RDQV9QQVJTRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLCBHU1RfVFlQRV9EQ0FfUEFSU0UpKQorI2RlZmluZSBHU1RfSVNfRENBX1BBUlNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLCBHU1RfVFlQRV9EQ0FfUEFSU0UpKQorCisjZGVmaW5lIERDQV9NSU5fRlJBTUVTSVpFIDk2CisjZGVmaW5lIERDQV9NQVhfRlJBTUVTSVpFIDE4NzI1IC8qIDE2Mzg0KjE2LzE0ICovCisKK3R5cGVkZWYgc3RydWN0IF9Hc3REY2FQYXJzZSBHc3REY2FQYXJzZTsKK3R5cGVkZWYgc3RydWN0IF9Hc3REY2FQYXJzZUNsYXNzIEdzdERjYVBhcnNlQ2xhc3M7CisKKy8qKgorICogR3N0RGNhUGFyc2U6CisgKgorICogVGhlIG9wYXF1ZSBHc3REY2FQYXJzZSBvYmplY3QKKyAqLworc3RydWN0IF9Hc3REY2FQYXJzZSB7CisgIEdzdEJhc2VQYXJzZSBiYXNlcGFyc2U7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIGdpbnQgICAgICAgICAgICAgICAgICByYXRlOworICBnaW50ICAgICAgICAgICAgICAgICAgY2hhbm5lbHM7CisgIGdpbnQgICAgICAgICAgICAgICAgICBkZXB0aDsKKyAgZ2ludCAgICAgICAgICAgICAgICAgIGVuZGlhbm5lc3M7CisgIGdpbnQgICAgICAgICAgICAgICAgICBibG9ja19zaXplOworICBnaW50ICAgICAgICAgICAgICAgICAgZnJhbWVfc2l6ZTsKKworICBnYm9vbGVhbiAgICAgICAgICAgICAgc2VudF9jb2RlY190YWc7CisKKyAgZ3VpbnQzMiAgICAgICAgICAgICAgIGxhc3Rfc3luYzsKKworICBHc3RQYWRDaGFpbkZ1bmN0aW9uICAgYmFzZXBhcnNlX2NoYWluZnVuYzsKK307CisKKy8qKgorICogR3N0RGNhUGFyc2VDbGFzczoKKyAqIEBwYXJlbnRfY2xhc3M6IEVsZW1lbnQgcGFyZW50IGNsYXNzLgorICoKKyAqIFRoZSBvcGFxdWUgR3N0RGNhUGFyc2VDbGFzcyBkYXRhIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3REY2FQYXJzZUNsYXNzIHsKKyAgR3N0QmFzZVBhcnNlQ2xhc3MgYmFzZXBhcnNlX2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2RjYV9wYXJzZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9EQ0FfUEFSU0VfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5jIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWE2OTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuYwpAQCAtMCwwICsxLDE4NzcgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWFyayBOYXV3ZWxhZXJ0cyA8bWFyay5uYXV3ZWxhZXJ0c0Bjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIENvbnRhY3Q6IFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZmxhY3BhcnNlCisgKiBAc2VlX2Fsc286IGZsYWNkZWMsIG9nZ2RlbXV4LCB2b3JiaXNwYXJzZQorICoKKyAqIFRoZSBmbGFjcGFyc2UgZWxlbWVudCB3aWxsIHBhcnNlIHRoZSBoZWFkZXIgcGFja2V0cyBvZiB0aGUgRkxBQworICogc3RyZWFtIGFuZCBwdXQgdGhlbSBhcyB0aGUgc3RyZWFtaGVhZGVyIGluIHRoZSBjYXBzLiBUaGlzIGlzIHVzZWQgaW4gdGhlCisgKiBtdWx0aWZkc2luayBjYXNlIHdoZXJlIHlvdSB3YW50IHRvIHN0cmVhbSBsaXZlIEZMQUMgc3RyZWFtcyB0byBtdWx0aXBsZQorICogY2xpZW50cywgZWFjaCBjbGllbnQgaGFzIHRvIHJlY2VpdmUgdGhlIHN0cmVhbWhlYWRlcnMgZmlyc3QgYmVmb3JlIHRoZXkgY2FuCisgKiBjb25zdW1lIHRoZSBGTEFDIHBhY2tldHMuCisgKgorICogVGhpcyBlbGVtZW50IGFsc28gbWFrZXMgc3VyZSB0aGF0IHRoZSBidWZmZXJzIHRoYXQgaXQgcHVzaGVzIG91dCBhcmUgcHJvcGVybHkKKyAqIHRpbWVzdGFtcGVkIGFuZCB0aGF0IHRoZWlyIG9mZnNldCBhbmQgb2Zmc2V0X2VuZCBhcmUgc2V0LiBUaGUgYnVmZmVycyB0aGF0CisgKiBmbGFjcGFyc2Ugb3V0cHV0cyBoYXZlIGFsbCBvZiB0aGUgbWV0YWRhdGEgdGhhdCBvZ2dtdXggZXhwZWN0cyB0byByZWNlaXZlLAorICogd2hpY2ggYWxsb3dzIHlvdSB0byAoZm9yIGV4YW1wbGUpIHJlbXV4IGFuIG9nZy9mbGFjIG9yIGNvbnZlcnQgYSBuYXRpdmUgRkxBQworICogZm9ybWF0IGZpbGUgdG8gYW4gb2dnIGJpdHN0cmVhbS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249c2luZS5mbGFjICEgZmxhY3BhcnNlICEgaWRlbnRpdHkgXAorICogICAgICAgICAgICAhIG9nZ211eCAhIGZpbGVzaW5rIGxvY2F0aW9uPXNpbmUtcmVtdXhlZC5vZ2cKKyAqIF18IFRoaXMgcGlwZWxpbmUgY29udmVydHMgYSBuYXRpdmUgRkxBQyBmb3JtYXQgZmlsZSB0byBhbiBvZ2cgYml0c3RyZWFtLgorICogSXQgYWxzbyBpbGx1c3RyYXRlcyB0aGF0IHRoZSBzdHJlYW1oZWFkZXIgaXMgc2V0IGluIHRoZSBjYXBzLCBhbmQgdGhhdCBlYWNoCisgKiBidWZmZXIgaGFzIHRoZSB0aW1lc3RhbXAsIGR1cmF0aW9uLCBvZmZzZXQsIGFuZCBvZmZzZXRfZW5kIHNldC4KKyAqIDwvcmVmc2VjdDI+CisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGZsYWNwYXJzZS5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L3RhZy90YWcuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9iYXNlLmg+CisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvcGJ1dGlscy5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChmbGFjcGFyc2VfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZmxhY3BhcnNlX2RlYnVnCisKKy8qIENSQy04LCBwb2x5ID0geF44ICsgeF4yICsgeF4xICsgeF4wLCBpbml0ID0gMCAqLworc3RhdGljIGNvbnN0IGd1aW50OCBjcmM4X3RhYmxlWzI1Nl0gPSB7CisgIDB4MDAsIDB4MDcsIDB4MEUsIDB4MDksIDB4MUMsIDB4MUIsIDB4MTIsIDB4MTUsCisgIDB4MzgsIDB4M0YsIDB4MzYsIDB4MzEsIDB4MjQsIDB4MjMsIDB4MkEsIDB4MkQsCisgIDB4NzAsIDB4NzcsIDB4N0UsIDB4NzksIDB4NkMsIDB4NkIsIDB4NjIsIDB4NjUsCisgIDB4NDgsIDB4NEYsIDB4NDYsIDB4NDEsIDB4NTQsIDB4NTMsIDB4NUEsIDB4NUQsCisgIDB4RTAsIDB4RTcsIDB4RUUsIDB4RTksIDB4RkMsIDB4RkIsIDB4RjIsIDB4RjUsCisgIDB4RDgsIDB4REYsIDB4RDYsIDB4RDEsIDB4QzQsIDB4QzMsIDB4Q0EsIDB4Q0QsCisgIDB4OTAsIDB4OTcsIDB4OUUsIDB4OTksIDB4OEMsIDB4OEIsIDB4ODIsIDB4ODUsCisgIDB4QTgsIDB4QUYsIDB4QTYsIDB4QTEsIDB4QjQsIDB4QjMsIDB4QkEsIDB4QkQsCisgIDB4QzcsIDB4QzAsIDB4QzksIDB4Q0UsIDB4REIsIDB4REMsIDB4RDUsIDB4RDIsCisgIDB4RkYsIDB4RjgsIDB4RjEsIDB4RjYsIDB4RTMsIDB4RTQsIDB4RUQsIDB4RUEsCisgIDB4QjcsIDB4QjAsIDB4QjksIDB4QkUsIDB4QUIsIDB4QUMsIDB4QTUsIDB4QTIsCisgIDB4OEYsIDB4ODgsIDB4ODEsIDB4ODYsIDB4OTMsIDB4OTQsIDB4OUQsIDB4OUEsCisgIDB4MjcsIDB4MjAsIDB4MjksIDB4MkUsIDB4M0IsIDB4M0MsIDB4MzUsIDB4MzIsCisgIDB4MUYsIDB4MTgsIDB4MTEsIDB4MTYsIDB4MDMsIDB4MDQsIDB4MEQsIDB4MEEsCisgIDB4NTcsIDB4NTAsIDB4NTksIDB4NUUsIDB4NEIsIDB4NEMsIDB4NDUsIDB4NDIsCisgIDB4NkYsIDB4NjgsIDB4NjEsIDB4NjYsIDB4NzMsIDB4NzQsIDB4N0QsIDB4N0EsCisgIDB4ODksIDB4OEUsIDB4ODcsIDB4ODAsIDB4OTUsIDB4OTIsIDB4OUIsIDB4OUMsCisgIDB4QjEsIDB4QjYsIDB4QkYsIDB4QjgsIDB4QUQsIDB4QUEsIDB4QTMsIDB4QTQsCisgIDB4RjksIDB4RkUsIDB4RjcsIDB4RjAsIDB4RTUsIDB4RTIsIDB4RUIsIDB4RUMsCisgIDB4QzEsIDB4QzYsIDB4Q0YsIDB4QzgsIDB4REQsIDB4REEsIDB4RDMsIDB4RDQsCisgIDB4NjksIDB4NkUsIDB4NjcsIDB4NjAsIDB4NzUsIDB4NzIsIDB4N0IsIDB4N0MsCisgIDB4NTEsIDB4NTYsIDB4NUYsIDB4NTgsIDB4NEQsIDB4NEEsIDB4NDMsIDB4NDQsCisgIDB4MTksIDB4MUUsIDB4MTcsIDB4MTAsIDB4MDUsIDB4MDIsIDB4MEIsIDB4MEMsCisgIDB4MjEsIDB4MjYsIDB4MkYsIDB4MjgsIDB4M0QsIDB4M0EsIDB4MzMsIDB4MzQsCisgIDB4NEUsIDB4NDksIDB4NDAsIDB4NDcsIDB4NTIsIDB4NTUsIDB4NUMsIDB4NUIsCisgIDB4NzYsIDB4NzEsIDB4NzgsIDB4N0YsIDB4NkEsIDB4NkQsIDB4NjQsIDB4NjMsCisgIDB4M0UsIDB4MzksIDB4MzAsIDB4MzcsIDB4MjIsIDB4MjUsIDB4MkMsIDB4MkIsCisgIDB4MDYsIDB4MDEsIDB4MDgsIDB4MEYsIDB4MUEsIDB4MUQsIDB4MTQsIDB4MTMsCisgIDB4QUUsIDB4QTksIDB4QTAsIDB4QTcsIDB4QjIsIDB4QjUsIDB4QkMsIDB4QkIsCisgIDB4OTYsIDB4OTEsIDB4OTgsIDB4OUYsIDB4OEEsIDB4OEQsIDB4ODQsIDB4ODMsCisgIDB4REUsIDB4RDksIDB4RDAsIDB4RDcsIDB4QzIsIDB4QzUsIDB4Q0MsIDB4Q0IsCisgIDB4RTYsIDB4RTEsIDB4RTgsIDB4RUYsIDB4RkEsIDB4RkQsIDB4RjQsIDB4RjMKK307CisKK3N0YXRpYyBndWludDgKK2dzdF9mbGFjX2NhbGN1bGF0ZV9jcmM4IChjb25zdCBndWludDggKiBkYXRhLCBndWludCBsZW5ndGgpCit7CisgIGd1aW50OCBjcmMgPSAwOworCisgIHdoaWxlIChsZW5ndGgtLSkgeworICAgIGNyYyA9IGNyYzhfdGFibGVbY3JjIF4gKmRhdGFdOworICAgICsrZGF0YTsKKyAgfQorCisgIHJldHVybiBjcmM7Cit9CisKKy8qIENSQy0xNiwgcG9seSA9IHheMTYgKyB4XjE1ICsgeF4yICsgeF4wLCBpbml0ID0gMCAqLworc3RhdGljIGNvbnN0IGd1aW50MTYgY3JjMTZfdGFibGVbMjU2XSA9IHsKKyAgMHgwMDAwLCAweDgwMDUsIDB4ODAwZiwgMHgwMDBhLCAweDgwMWIsIDB4MDAxZSwgMHgwMDE0LCAweDgwMTEsCisgIDB4ODAzMywgMHgwMDM2LCAweDAwM2MsIDB4ODAzOSwgMHgwMDI4LCAweDgwMmQsIDB4ODAyNywgMHgwMDIyLAorICAweDgwNjMsIDB4MDA2NiwgMHgwMDZjLCAweDgwNjksIDB4MDA3OCwgMHg4MDdkLCAweDgwNzcsIDB4MDA3MiwKKyAgMHgwMDUwLCAweDgwNTUsIDB4ODA1ZiwgMHgwMDVhLCAweDgwNGIsIDB4MDA0ZSwgMHgwMDQ0LCAweDgwNDEsCisgIDB4ODBjMywgMHgwMGM2LCAweDAwY2MsIDB4ODBjOSwgMHgwMGQ4LCAweDgwZGQsIDB4ODBkNywgMHgwMGQyLAorICAweDAwZjAsIDB4ODBmNSwgMHg4MGZmLCAweDAwZmEsIDB4ODBlYiwgMHgwMGVlLCAweDAwZTQsIDB4ODBlMSwKKyAgMHgwMGEwLCAweDgwYTUsIDB4ODBhZiwgMHgwMGFhLCAweDgwYmIsIDB4MDBiZSwgMHgwMGI0LCAweDgwYjEsCisgIDB4ODA5MywgMHgwMDk2LCAweDAwOWMsIDB4ODA5OSwgMHgwMDg4LCAweDgwOGQsIDB4ODA4NywgMHgwMDgyLAorICAweDgxODMsIDB4MDE4NiwgMHgwMThjLCAweDgxODksIDB4MDE5OCwgMHg4MTlkLCAweDgxOTcsIDB4MDE5MiwKKyAgMHgwMWIwLCAweDgxYjUsIDB4ODFiZiwgMHgwMWJhLCAweDgxYWIsIDB4MDFhZSwgMHgwMWE0LCAweDgxYTEsCisgIDB4MDFlMCwgMHg4MWU1LCAweDgxZWYsIDB4MDFlYSwgMHg4MWZiLCAweDAxZmUsIDB4MDFmNCwgMHg4MWYxLAorICAweDgxZDMsIDB4MDFkNiwgMHgwMWRjLCAweDgxZDksIDB4MDFjOCwgMHg4MWNkLCAweDgxYzcsIDB4MDFjMiwKKyAgMHgwMTQwLCAweDgxNDUsIDB4ODE0ZiwgMHgwMTRhLCAweDgxNWIsIDB4MDE1ZSwgMHgwMTU0LCAweDgxNTEsCisgIDB4ODE3MywgMHgwMTc2LCAweDAxN2MsIDB4ODE3OSwgMHgwMTY4LCAweDgxNmQsIDB4ODE2NywgMHgwMTYyLAorICAweDgxMjMsIDB4MDEyNiwgMHgwMTJjLCAweDgxMjksIDB4MDEzOCwgMHg4MTNkLCAweDgxMzcsIDB4MDEzMiwKKyAgMHgwMTEwLCAweDgxMTUsIDB4ODExZiwgMHgwMTFhLCAweDgxMGIsIDB4MDEwZSwgMHgwMTA0LCAweDgxMDEsCisgIDB4ODMwMywgMHgwMzA2LCAweDAzMGMsIDB4ODMwOSwgMHgwMzE4LCAweDgzMWQsIDB4ODMxNywgMHgwMzEyLAorICAweDAzMzAsIDB4ODMzNSwgMHg4MzNmLCAweDAzM2EsIDB4ODMyYiwgMHgwMzJlLCAweDAzMjQsIDB4ODMyMSwKKyAgMHgwMzYwLCAweDgzNjUsIDB4ODM2ZiwgMHgwMzZhLCAweDgzN2IsIDB4MDM3ZSwgMHgwMzc0LCAweDgzNzEsCisgIDB4ODM1MywgMHgwMzU2LCAweDAzNWMsIDB4ODM1OSwgMHgwMzQ4LCAweDgzNGQsIDB4ODM0NywgMHgwMzQyLAorICAweDAzYzAsIDB4ODNjNSwgMHg4M2NmLCAweDAzY2EsIDB4ODNkYiwgMHgwM2RlLCAweDAzZDQsIDB4ODNkMSwKKyAgMHg4M2YzLCAweDAzZjYsIDB4MDNmYywgMHg4M2Y5LCAweDAzZTgsIDB4ODNlZCwgMHg4M2U3LCAweDAzZTIsCisgIDB4ODNhMywgMHgwM2E2LCAweDAzYWMsIDB4ODNhOSwgMHgwM2I4LCAweDgzYmQsIDB4ODNiNywgMHgwM2IyLAorICAweDAzOTAsIDB4ODM5NSwgMHg4MzlmLCAweDAzOWEsIDB4ODM4YiwgMHgwMzhlLCAweDAzODQsIDB4ODM4MSwKKyAgMHgwMjgwLCAweDgyODUsIDB4ODI4ZiwgMHgwMjhhLCAweDgyOWIsIDB4MDI5ZSwgMHgwMjk0LCAweDgyOTEsCisgIDB4ODJiMywgMHgwMmI2LCAweDAyYmMsIDB4ODJiOSwgMHgwMmE4LCAweDgyYWQsIDB4ODJhNywgMHgwMmEyLAorICAweDgyZTMsIDB4MDJlNiwgMHgwMmVjLCAweDgyZTksIDB4MDJmOCwgMHg4MmZkLCAweDgyZjcsIDB4MDJmMiwKKyAgMHgwMmQwLCAweDgyZDUsIDB4ODJkZiwgMHgwMmRhLCAweDgyY2IsIDB4MDJjZSwgMHgwMmM0LCAweDgyYzEsCisgIDB4ODI0MywgMHgwMjQ2LCAweDAyNGMsIDB4ODI0OSwgMHgwMjU4LCAweDgyNWQsIDB4ODI1NywgMHgwMjUyLAorICAweDAyNzAsIDB4ODI3NSwgMHg4MjdmLCAweDAyN2EsIDB4ODI2YiwgMHgwMjZlLCAweDAyNjQsIDB4ODI2MSwKKyAgMHgwMjIwLCAweDgyMjUsIDB4ODIyZiwgMHgwMjJhLCAweDgyM2IsIDB4MDIzZSwgMHgwMjM0LCAweDgyMzEsCisgIDB4ODIxMywgMHgwMjE2LCAweDAyMWMsIDB4ODIxOSwgMHgwMjA4LCAweDgyMGQsIDB4ODIwNywgMHgwMjAyCit9OworCitzdGF0aWMgZ3VpbnQxNgorZ3N0X2ZsYWNfY2FsY3VsYXRlX2NyYzE2IChjb25zdCBndWludDggKiBkYXRhLCBndWludCBsZW5ndGgpCit7CisgIGd1aW50MTYgY3JjID0gMDsKKworICB3aGlsZSAobGVuZ3RoLS0pIHsKKyAgICBjcmMgPSAoKGNyYyA8PCA4KSBeIGNyYzE2X3RhYmxlWyhjcmMgPj4gOCkgXiAqZGF0YV0pICYgMHhmZmZmOworICAgIGRhdGErKzsKKyAgfQorCisgIHJldHVybiBjcmM7Cit9CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0NIRUNLX0ZSQU1FX0NIRUNLU1VNUworfTsKKworI2RlZmluZSBERUZBVUxUX0NIRUNLX0ZSQU1FX0NIRUNLU1VNUyBGQUxTRQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1mbGFjLCBmcmFtZWQgPSAoYm9vbGVhbikgdHJ1ZSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDggXSwgIiAicmF0ZSA9IChpbnQpIFsgMSwgNjU1MzUwIF0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWZsYWMiKQorICAgICk7CisKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9mbGFjX3BhcnNlX2dlbmVyYXRlX3ZvcmJpc2NvbW1lbnQgKEdzdEZsYWNQYXJzZSAqCisgICAgZmxhY3BhcnNlKTsKKworc3RhdGljIGlubGluZSB2b2lkIGdzdF9mbGFjX3BhcnNlX3Jlc2V0X2J1ZmZlcl90aW1lX2FuZF9vZmZzZXQgKEdzdEJ1ZmZlciAqCisgICAgYnVmZmVyKTsKK3N0YXRpYyB2b2lkIGdzdF9mbGFjX3BhcnNlX3Jlc2V0IChHc3RGbGFjUGFyc2UgKiBwYXJzZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9mbGFjX3BhcnNlX2hhbmRsZV9ibG9ja190eXBlIChHc3RGbGFjUGFyc2UgKiBmbGFjcGFyc2UsCisgICAgZ3VpbnQgdHlwZSwgR3N0QnVmZmVyICogc2J1ZmZlcik7CitzdGF0aWMgdm9pZCBnc3RfZmxhY19wYXJzZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3RfZmxhY19wYXJzZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfZmxhY19wYXJzZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZmxhY19wYXJzZV9zdGFydCAoR3N0QmFzZVBhcnNlICogcGFyc2UpOworc3RhdGljIGdib29sZWFuIGdzdF9mbGFjX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9mbGFjX3BhcnNlX2hhbmRsZV9mcmFtZSAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSwgZ2ludCAqIHNraXBzaXplKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9mbGFjX3BhcnNlX3BhcnNlX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lLCBnaW50IHNpemUpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2ZsYWNfcGFyc2VfcHJlX3B1c2hfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUpOworc3RhdGljIGdib29sZWFuIGdzdF9mbGFjX3BhcnNlX2NvbnZlcnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEZvcm1hdCBzcmNfZm9ybWF0LCBnaW50NjQgc3JjX3ZhbHVlLCBHc3RGb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgZ2ludDY0ICogZGVzdF92YWx1ZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ZsYWNfcGFyc2Vfc3JjX2V2ZW50IChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfZmxhY19wYXJzZV9nZXRfc2lua19jYXBzIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RDYXBzICogZmlsdGVyKTsKKworI2RlZmluZSBnc3RfZmxhY19wYXJzZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RGbGFjUGFyc2UsIGdzdF9mbGFjX3BhcnNlLCBHU1RfVFlQRV9CQVNFX1BBUlNFKTsKKworc3RhdGljIHZvaWQKK2dzdF9mbGFjX3BhcnNlX2NsYXNzX2luaXQgKEdzdEZsYWNQYXJzZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdzdEJhc2VQYXJzZUNsYXNzICpiYXNlcGFyc2VfY2xhc3MgPSBHU1RfQkFTRV9QQVJTRV9DTEFTUyAoa2xhc3MpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChmbGFjcGFyc2VfZGVidWcsICJmbGFjcGFyc2UiLCAwLAorICAgICAgIkZsYWMgcGFyc2VyIGVsZW1lbnQiKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9mbGFjX3BhcnNlX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfZmxhY19wYXJzZV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9mbGFjX3BhcnNlX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NIRUNLX0ZSQU1FX0NIRUNLU1VNUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiY2hlY2stZnJhbWUtY2hlY2tzdW1zIiwgIkNoZWNrIEZyYW1lIENoZWNrc3VtcyIsCisgICAgICAgICAgIkNoZWNrIHRoZSBvdmVyYWxsIGNoZWNrc3VtcyBvZiBldmVyeSBmcmFtZSIsCisgICAgICAgICAgREVGQVVMVF9DSEVDS19GUkFNRV9DSEVDS1NVTVMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgYmFzZXBhcnNlX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmxhY19wYXJzZV9zdGFydCk7CisgIGJhc2VwYXJzZV9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmxhY19wYXJzZV9zdG9wKTsKKyAgYmFzZXBhcnNlX2NsYXNzLT5oYW5kbGVfZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbGFjX3BhcnNlX2hhbmRsZV9mcmFtZSk7CisgIGJhc2VwYXJzZV9jbGFzcy0+cHJlX3B1c2hfZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbGFjX3BhcnNlX3ByZV9wdXNoX2ZyYW1lKTsKKyAgYmFzZXBhcnNlX2NsYXNzLT5jb252ZXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbGFjX3BhcnNlX2NvbnZlcnQpOworICBiYXNlcGFyc2VfY2xhc3MtPnNyY19ldmVudCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmxhY19wYXJzZV9zcmNfZXZlbnQpOworICBiYXNlcGFyc2VfY2xhc3MtPmdldF9zaW5rX2NhcHMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbGFjX3BhcnNlX2dldF9zaW5rX2NhcHMpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfZmFjdG9yeSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIkZMQUMgYXVkaW8gcGFyc2VyIiwKKyAgICAgICJDb2RlYy9QYXJzZXIvQXVkaW8iLAorICAgICAgIlBhcnNlcyBhdWRpbyB3aXRoIHRoZSBGTEFDIGxvc3NsZXNzIGF1ZGlvIGNvZGVjIiwKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9mbGFjX3BhcnNlX2luaXQgKEdzdEZsYWNQYXJzZSAqIGZsYWNwYXJzZSkKK3sKKyAgZmxhY3BhcnNlLT5jaGVja19mcmFtZV9jaGVja3N1bXMgPSBERUZBVUxUX0NIRUNLX0ZSQU1FX0NIRUNLU1VNUzsKKyAgR1NUX1BBRF9TRVRfQUNDRVBUX0lOVEVSU0VDVCAoR1NUX0JBU0VfUEFSU0VfU0lOS19QQUQgKGZsYWNwYXJzZSkpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChmbGFjcGFyc2UpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9mbGFjX3BhcnNlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RGbGFjUGFyc2UgKmZsYWNwYXJzZSA9IEdTVF9GTEFDX1BBUlNFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DSEVDS19GUkFNRV9DSEVDS1NVTVM6CisgICAgICBmbGFjcGFyc2UtPmNoZWNrX2ZyYW1lX2NoZWNrc3VtcyA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9mbGFjX3BhcnNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RGbGFjUGFyc2UgKmZsYWNwYXJzZSA9IEdTVF9GTEFDX1BBUlNFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DSEVDS19GUkFNRV9DSEVDS1NVTVM6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmxhY3BhcnNlLT5jaGVja19mcmFtZV9jaGVja3N1bXMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2ZsYWNfcGFyc2VfcmVzZXQgKEdzdEZsYWNQYXJzZSAqIHBhcnNlcikKK3sKKyAgaWYgKHBhcnNlci0+dGFncykgeworICAgIGdzdF90YWdfbGlzdF91bnJlZiAocGFyc2VyLT50YWdzKTsKKyAgICBwYXJzZXItPnRhZ3MgPSBOVUxMOworICB9CisgIGlmIChwYXJzZXItPnRvYykgeworICAgIGdzdF90b2NfdW5yZWYgKHBhcnNlci0+dG9jKTsKKyAgICBwYXJzZXItPnRvYyA9IE5VTEw7CisgIH0KKyAgaWYgKHBhcnNlci0+c2Vla3RhYmxlKSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAocGFyc2VyLT5zZWVrdGFibGUpOworICAgIHBhcnNlci0+c2Vla3RhYmxlID0gTlVMTDsKKyAgfQorCisgIGdfbGlzdF9mb3JlYWNoIChwYXJzZXItPmhlYWRlcnMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKHBhcnNlci0+aGVhZGVycyk7CisgIHBhcnNlci0+aGVhZGVycyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmxhY19wYXJzZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0RmxhY1BhcnNlICpmbGFjcGFyc2UgPSBHU1RfRkxBQ19QQVJTRSAob2JqZWN0KTsKKworICBnc3RfZmxhY19wYXJzZV9yZXNldCAoZmxhY3BhcnNlKTsKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbGFjX3BhcnNlX3N0YXJ0IChHc3RCYXNlUGFyc2UgKiBwYXJzZSkKK3sKKyAgR3N0RmxhY1BhcnNlICpmbGFjcGFyc2UgPSBHU1RfRkxBQ19QQVJTRSAocGFyc2UpOworCisgIGZsYWNwYXJzZS0+c3RhdGUgPSBHU1RfRkxBQ19QQVJTRV9TVEFURV9JTklUOworICBmbGFjcGFyc2UtPm1pbl9ibG9ja3NpemUgPSAwOworICBmbGFjcGFyc2UtPm1heF9ibG9ja3NpemUgPSAwOworICBmbGFjcGFyc2UtPm1pbl9mcmFtZXNpemUgPSAwOworICBmbGFjcGFyc2UtPm1heF9mcmFtZXNpemUgPSAwOworCisgIGZsYWNwYXJzZS0+dXBzdHJlYW1fbGVuZ3RoID0gLTE7CisKKyAgZmxhY3BhcnNlLT5zYW1wbGVyYXRlID0gMDsKKyAgZmxhY3BhcnNlLT5jaGFubmVscyA9IDA7CisgIGZsYWNwYXJzZS0+YnBzID0gMDsKKyAgZmxhY3BhcnNlLT50b3RhbF9zYW1wbGVzID0gMDsKKworICBmbGFjcGFyc2UtPm9mZnNldCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGZsYWNwYXJzZS0+YmxvY2tpbmdfc3RyYXRlZ3kgPSAwOworICBmbGFjcGFyc2UtPmJsb2NrX3NpemUgPSAwOworICBmbGFjcGFyc2UtPnNhbXBsZV9udW1iZXIgPSAwOworICBmbGFjcGFyc2UtPnN0cmF0ZWd5X2NoZWNrZWQgPSBGQUxTRTsKKworICBmbGFjcGFyc2UtPnNlbnRfY29kZWNfdGFnID0gRkFMU0U7CisKKyAgLyogImZMYUMiIG1hcmtlciAqLworICBnc3RfYmFzZV9wYXJzZV9zZXRfbWluX2ZyYW1lX3NpemUgKEdTVF9CQVNFX1BBUlNFIChmbGFjcGFyc2UpLCA0KTsKKworICAvKiBpbmZvcm0gYmFzZWNsYXNzIHdlIGNhbiBjb21lIHVwIHdpdGggdHMsIGJhc2VkIG9uIGNvdW50ZXJzIGluIHBhY2tldHMgKi8KKyAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X2hhc190aW1pbmdfaW5mbyAoR1NUX0JBU0VfUEFSU0VfQ0FTVCAoZmxhY3BhcnNlKSwgVFJVRSk7CisgIGdzdF9iYXNlX3BhcnNlX3NldF9zeW5jYWJsZSAoR1NUX0JBU0VfUEFSU0VfQ0FTVCAoZmxhY3BhcnNlKSwgVFJVRSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ZsYWNfcGFyc2Vfc3RvcCAoR3N0QmFzZVBhcnNlICogcGFyc2UpCit7CisgIEdzdEZsYWNQYXJzZSAqZmxhY3BhcnNlID0gR1NUX0ZMQUNfUEFSU0UgKHBhcnNlKTsKKworICBnc3RfZmxhY19wYXJzZV9yZXNldCAoZmxhY3BhcnNlKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBjb25zdCBndWludDggc2FtcGxlX3NpemVfdGFibGVbXSA9IHsgMCwgOCwgMTIsIDAsIDE2LCAyMCwgMjQsIDAgfTsKKworc3RhdGljIGNvbnN0IGd1aW50MTYgYmxvY2tzaXplX3RhYmxlWzE2XSA9IHsKKyAgMCwgMTkyLCA1NzYgPDwgMCwgNTc2IDw8IDEsIDU3NiA8PCAyLCA1NzYgPDwgMywgMCwgMCwKKyAgMjU2IDw8IDAsIDI1NiA8PCAxLCAyNTYgPDwgMiwgMjU2IDw8IDMsIDI1NiA8PCA0LCAyNTYgPDwgNSwgMjU2IDw8IDYsCisgIDI1NiA8PCA3LAorfTsKKworc3RhdGljIGNvbnN0IGd1aW50MzIgc2FtcGxlX3JhdGVfdGFibGVbMTZdID0geworICAwLAorICA4ODIwMCwgMTc2NDAwLCAxOTIwMDAsCisgIDgwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAsIDk2MDAwLAorICAwLCAwLCAwLCAwLAorfTsKKwordHlwZWRlZiBlbnVtCit7CisgIEZSQU1FX0hFQURFUl9WQUxJRCwKKyAgRlJBTUVfSEVBREVSX0lOVkFMSUQsCisgIEZSQU1FX0hFQURFUl9NT1JFX0RBVEEKK30gRnJhbWVIZWFkZXJDaGVja1JldHVybjsKKworc3RhdGljIEZyYW1lSGVhZGVyQ2hlY2tSZXR1cm4KK2dzdF9mbGFjX3BhcnNlX2ZyYW1lX2hlYWRlcl9pc192YWxpZCAoR3N0RmxhY1BhcnNlICogZmxhY3BhcnNlLAorICAgIGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIGdib29sZWFuIHNldCwgZ3VpbnQxNiAqIGJsb2NrX3NpemVfcmV0LAorICAgIGdib29sZWFuICogc3VzcGVjdCkKK3sKKyAgR3N0Qml0UmVhZGVyIHJlYWRlciA9IEdTVF9CSVRfUkVBREVSX0lOSVQgKGRhdGEsIHNpemUpOworICBndWludDggYmxvY2tpbmdfc3RyYXRlZ3k7CisgIGd1aW50MTYgYmxvY2tfc2l6ZTsKKyAgZ3VpbnQzMiBzYW1wbGVyYXRlID0gMDsKKyAgZ3VpbnQ2NCBzYW1wbGVfbnVtYmVyOworICBndWludDggY2hhbm5lbHMsIGJwczsKKyAgZ3VpbnQ4IHRtcCA9IDA7CisgIGd1aW50OCBhY3R1YWxfY3JjLCBleHBlY3RlZF9jcmMgPSAwOworCisgIC8qIFNraXAgMTQgYml0IHN5bmMgY29kZSAqLworICBnc3RfYml0X3JlYWRlcl9za2lwX3VuY2hlY2tlZCAoJnJlYWRlciwgMTQpOworCisgIC8qIE11c3QgYmUgMCAqLworICBpZiAoZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmcmVhZGVyLCAxKSAhPSAwKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogMCA9PSBmaXhlZCBibG9jayBzaXplLCAxID09IHZhcmlhYmxlIGJsb2NrIHNpemUgKi8KKyAgYmxvY2tpbmdfc3RyYXRlZ3kgPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OF91bmNoZWNrZWQgKCZyZWFkZXIsIDEpOworICBpZiAoZmxhY3BhcnNlLT5mb3JjZV92YXJpYWJsZV9ibG9ja19zaXplKQorICAgIGJsb2NraW5nX3N0cmF0ZWd5ID0gMTsKKworICAvKiBibG9jayBzaXplIGluZGV4LCBjYWxjdWxhdGlvbiBvZiB0aGUgcmVhbCBibG9ja3NpemUgYmVsb3cgKi8KKyAgYmxvY2tfc2l6ZSA9IGdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQxNl91bmNoZWNrZWQgKCZyZWFkZXIsIDQpOworICBpZiAoYmxvY2tfc2l6ZSA9PSAwKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogc2FtcGxlIHJhdGUgaW5kZXgsIGNhbGN1bGF0aW9uIG9mIHRoZSByZWFsIHNhbXBsZXJhdGUgYmVsb3cgKi8KKyAgc2FtcGxlcmF0ZSA9IGdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQxNl91bmNoZWNrZWQgKCZyZWFkZXIsIDQpOworICBpZiAoc2FtcGxlcmF0ZSA9PSAweDBmKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogY2hhbm5lbCBhc3NpZ25tZW50ICovCisgIGNoYW5uZWxzID0gZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmcmVhZGVyLCA0KTsKKyAgaWYgKGNoYW5uZWxzIDwgOCkgeworICAgIGNoYW5uZWxzKys7CisgIH0gZWxzZSBpZiAoY2hhbm5lbHMgPD0gMTApIHsKKyAgICBjaGFubmVscyA9IDI7CisgIH0gZWxzZSBpZiAoY2hhbm5lbHMgPiAxMCkgeworICAgIGdvdG8gZXJyb3I7CisgIH0KKyAgaWYgKGZsYWNwYXJzZS0+Y2hhbm5lbHMgJiYgZmxhY3BhcnNlLT5jaGFubmVscyAhPSBjaGFubmVscykKKyAgICBnb3RvIGVycm9yOworCisgIC8qIGJpdHMgcGVyIHNhbXBsZSAqLworICBicHMgPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OF91bmNoZWNrZWQgKCZyZWFkZXIsIDMpOworICBpZiAoYnBzID09IDB4MDMgfHwgYnBzID09IDB4MDcpIHsKKyAgICBnb3RvIGVycm9yOworICB9IGVsc2UgaWYgKGJwcyA9PSAwICYmIGZsYWNwYXJzZS0+YnBzID09IDApIHsKKyAgICBnb3RvIG5lZWRfc3RyZWFtaW5mbzsKKyAgfQorICBicHMgPSBzYW1wbGVfc2l6ZV90YWJsZVticHNdOworICBpZiAoZmxhY3BhcnNlLT5icHMgJiYgYnBzICE9IGZsYWNwYXJzZS0+YnBzKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogcmVzZXJ2ZWQsIG11c3QgYmUgMCAqLworICBpZiAoZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmcmVhZGVyLCAxKSAhPSAwKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogcmVhZCAidXRmOCIgZW5jb2RlZCBzYW1wbGUvZnJhbWUgbnVtYmVyICovCisgIHsKKyAgICBnaW50IGxlbiA9IDA7CisKKyAgICBsZW4gPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OF91bmNoZWNrZWQgKCZyZWFkZXIsIDgpOworCisgICAgLyogVGhpcyBpcyBzbGlnaHRseSBmYXN0ZXIgdGhhbiBhIGxvb3AgKi8KKyAgICBpZiAoIShsZW4gJiAweDgwKSkgeworICAgICAgc2FtcGxlX251bWJlciA9IGxlbjsKKyAgICAgIGxlbiA9IDA7CisgICAgfSBlbHNlIGlmICgobGVuICYgMHhjMCkgJiYgIShsZW4gJiAweDIwKSkgeworICAgICAgc2FtcGxlX251bWJlciA9IGxlbiAmIDB4MWY7CisgICAgICBsZW4gPSAxOworICAgIH0gZWxzZSBpZiAoKGxlbiAmIDB4ZTApICYmICEobGVuICYgMHgxMCkpIHsKKyAgICAgIHNhbXBsZV9udW1iZXIgPSBsZW4gJiAweDBmOworICAgICAgbGVuID0gMjsKKyAgICB9IGVsc2UgaWYgKChsZW4gJiAweGYwKSAmJiAhKGxlbiAmIDB4MDgpKSB7CisgICAgICBzYW1wbGVfbnVtYmVyID0gbGVuICYgMHgwNzsKKyAgICAgIGxlbiA9IDM7CisgICAgfSBlbHNlIGlmICgobGVuICYgMHhmOCkgJiYgIShsZW4gJiAweDA0KSkgeworICAgICAgc2FtcGxlX251bWJlciA9IGxlbiAmIDB4MDM7CisgICAgICBsZW4gPSA0OworICAgIH0gZWxzZSBpZiAoKGxlbiAmIDB4ZmMpICYmICEobGVuICYgMHgwMikpIHsKKyAgICAgIHNhbXBsZV9udW1iZXIgPSBsZW4gJiAweDAxOworICAgICAgbGVuID0gNTsKKyAgICB9IGVsc2UgaWYgKChsZW4gJiAweGZlKSAmJiAhKGxlbiAmIDB4MDEpKSB7CisgICAgICBzYW1wbGVfbnVtYmVyID0gbGVuICYgMHgwOworICAgICAgbGVuID0gNjsKKyAgICB9IGVsc2UgeworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoKGJsb2NraW5nX3N0cmF0ZWd5ID09IDAgJiYgbGVuID4gNSkgfHwKKyAgICAgICAgKGJsb2NraW5nX3N0cmF0ZWd5ID09IDEgJiYgbGVuID4gNikpCisgICAgICBnb3RvIGVycm9yOworCisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKCZyZWFkZXIsICZ0bXAsIDgpKQorICAgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworCisgICAgICBpZiAoKHRtcCAmIDB4YzApICE9IDB4ODApCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgIHNhbXBsZV9udW1iZXIgPDw9IDY7CisgICAgICBzYW1wbGVfbnVtYmVyIHw9ICh0bXAgJiAweDNmKTsKKyAgICAgIGxlbi0tOworICAgIH0KKyAgfQorCisgIC8qIGNhbGN1bGF0ZSByZWFsIGJsb2Nrc2l6ZSBmcm9tIHRoZSBibG9ja3NpemUgaW5kZXggKi8KKyAgaWYgKGJsb2NrX3NpemUgPT0gNikgeworICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDE2ICgmcmVhZGVyLCAmYmxvY2tfc2l6ZSwgOCkpCisgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworICAgIGJsb2NrX3NpemUrKzsKKyAgfSBlbHNlIGlmIChibG9ja19zaXplID09IDcpIHsKKyAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQxNiAoJnJlYWRlciwgJmJsb2NrX3NpemUsIDE2KSkKKyAgICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisgICAgYmxvY2tfc2l6ZSsrOworICB9IGVsc2UgeworICAgIGJsb2NrX3NpemUgPSBibG9ja3NpemVfdGFibGVbYmxvY2tfc2l6ZV07CisgIH0KKworICAvKiBjYWxjdWxhdGUgdGhlIHJlYWwgc2FtcGxlcmF0ZSBmcm9tIHRoZSBzYW1wbGVyYXRlIGluZGV4ICovCisgIGlmIChzYW1wbGVyYXRlID09IDAgJiYgZmxhY3BhcnNlLT5zYW1wbGVyYXRlID09IDApIHsKKyAgICBnb3RvIG5lZWRfc3RyZWFtaW5mbzsKKyAgfSBlbHNlIGlmIChzYW1wbGVyYXRlIDwgMTIpIHsKKyAgICBzYW1wbGVyYXRlID0gc2FtcGxlX3JhdGVfdGFibGVbc2FtcGxlcmF0ZV07CisgIH0gZWxzZSBpZiAoc2FtcGxlcmF0ZSA9PSAxMikgeworICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDMyICgmcmVhZGVyLCAmc2FtcGxlcmF0ZSwgOCkpCisgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworICAgIHNhbXBsZXJhdGUgKj0gMTAwMDsKKyAgfSBlbHNlIGlmIChzYW1wbGVyYXRlID09IDEzKSB7CisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzIgKCZyZWFkZXIsICZzYW1wbGVyYXRlLCAxNikpCisgICAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworICB9IGVsc2UgaWYgKHNhbXBsZXJhdGUgPT0gMTQpIHsKKyAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQzMiAoJnJlYWRlciwgJnNhbXBsZXJhdGUsIDE2KSkKKyAgICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisgICAgc2FtcGxlcmF0ZSAqPSAxMDsKKyAgfQorCisgIGlmIChmbGFjcGFyc2UtPnNhbXBsZXJhdGUgJiYgZmxhY3BhcnNlLT5zYW1wbGVyYXRlICE9IHNhbXBsZXJhdGUpCisgICAgZ290byBlcnJvcjsKKworICAvKiBjaGVjayBjcmMtOCBmb3IgdGhlIGhlYWRlciAqLworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmcmVhZGVyLCAmZXhwZWN0ZWRfY3JjLCA4KSkKKyAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworCisgIGFjdHVhbF9jcmMgPQorICAgICAgZ3N0X2ZsYWNfY2FsY3VsYXRlX2NyYzggKGRhdGEsCisgICAgICAoZ3N0X2JpdF9yZWFkZXJfZ2V0X3BvcyAoJnJlYWRlcikgLyA4KSAtIDEpOworICBpZiAoYWN0dWFsX2NyYyAhPSBleHBlY3RlZF9jcmMpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjcGFyc2UsCisgICAgICAgICJDaGVja3N1bSBtaXNtYXRjaC4gSGVhZGVyIENSQyB3YXMgJyVkJyBidXQgZnJhbWUgaGFzICclZCciLAorICAgICAgICBleHBlY3RlZF9jcmMsIGFjdHVhbF9jcmMpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICAvKiBTYW5pdHkgY2hlY2sgc2FtcGxlIG51bWJlciBhZ2FpbnN0IGJsb2NraW5nIHN0cmF0ZWd5LCBhcyBpdCBzZWVtcworICAgICBzb21lIGZpbGVzIGNsYWltIGZpeGVkIGJsb2NrIHNpemUgYnV0IHN1cHBseSBzYW1wbGUgbnVtYmVycywKKyAgICAgcmF0aGVyIHRoYW4gYmxvY2sgbnVtYmVycy4gKi8KKyAgaWYgKGJsb2NraW5nX3N0cmF0ZWd5ID09IDAgJiYgZmxhY3BhcnNlLT5ibG9ja19zaXplICE9IDApIHsKKyAgICBpZiAoIWZsYWNwYXJzZS0+c3RyYXRlZ3lfY2hlY2tlZCkgeworICAgICAgaWYgKGJsb2NrX3NpemUgPT0gc2FtcGxlX251bWJlcikgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGZsYWNwYXJzZSwgIlRoaXMgZmlsZSBjbGFpbXMgZml4ZWQgYmxvY2sgc2l6ZSwgIgorICAgICAgICAgICAgImJ1dCBzZWVtcyB0byBiZSBseWluZzogYXNzdW1pbmcgdmFyaWFibGUgYmxvY2sgc2l6ZSIpOworICAgICAgICBmbGFjcGFyc2UtPmZvcmNlX3ZhcmlhYmxlX2Jsb2NrX3NpemUgPSBUUlVFOworICAgICAgICBibG9ja2luZ19zdHJhdGVneSA9IDE7CisgICAgICB9CisgICAgICBmbGFjcGFyc2UtPnN0cmF0ZWd5X2NoZWNrZWQgPSBUUlVFOworICAgIH0KKyAgfQorCisgIC8qIGRvY3VtZW50YXRpb24gc2F5czoKKyAgICogVGhlICJibG9ja2luZyBzdHJhdGVneSIgYml0IG11c3QgYmUgdGhlIHNhbWUgdGhyb3VnaG91dCB0aGUgZW50aXJlIHN0cmVhbS4gKi8KKyAgaWYgKGZsYWNwYXJzZS0+YmxvY2tpbmdfc3RyYXRlZ3kgIT0gYmxvY2tpbmdfc3RyYXRlZ3kpIHsKKyAgICBpZiAoZmxhY3BhcnNlLT5ibG9ja19zaXplICE9IDApIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZmxhY3BhcnNlLCAiYmxvY2tpbmcgc3RyYXRlZ3kgaXMgbm90IGNvbnN0YW50Iik7CisgICAgICBpZiAoc3VzcGVjdCkKKyAgICAgICAgKnN1c3BlY3QgPSBUUlVFOworICAgIH0KKyAgfQorCisgIC8qCisgICAgIFRoZSBGTEFDIGZvcm1hdCBkb2N1bWVudGF0aW9uIHNheXM6CisgICAgIFRoZSAiYmxvY2tpbmcgc3RyYXRlZ3kiIGJpdCBkZXRlcm1pbmVzIGhvdyB0byBjYWxjdWxhdGUgdGhlIHNhbXBsZSBudW1iZXIKKyAgICAgb2YgdGhlIGZpcnN0IHNhbXBsZSBpbiB0aGUgZnJhbWUuIElmIHRoZSBiaXQgaXMgMCAoZml4ZWQtYmxvY2tzaXplKSwgdGhlCisgICAgIGZyYW1lIGhlYWRlciBlbmNvZGVzIHRoZSBmcmFtZSBudW1iZXIgYXMgYWJvdmUsIGFuZCB0aGUgZnJhbWUncyBzdGFydGluZworICAgICBzYW1wbGUgbnVtYmVyIHdpbGwgYmUgdGhlIGZyYW1lIG51bWJlciB0aW1lcyB0aGUgYmxvY2tzaXplLiBJZiBpdCBpcyAxCisgICAgICh2YXJpYWJsZS1ibG9ja3NpemUpLCB0aGUgZnJhbWUgaGVhZGVyIGVuY29kZXMgdGhlIGZyYW1lJ3Mgc3RhcnRpbmcKKyAgICAgc2FtcGxlIG51bWJlciBpdHNlbGYuIChJbiB0aGUgY2FzZSBvZiBhIGZpeGVkLWJsb2Nrc2l6ZSBzdHJlYW0sIG9ubHkgdGhlCisgICAgIGxhc3QgYmxvY2sgbWF5IGJlIHNob3J0ZXIgdGhhbiB0aGUgc3RyZWFtIGJsb2Nrc2l6ZTsgaXRzIHN0YXJ0aW5nIHNhbXBsZQorICAgICBudW1iZXIgd2lsbCBiZSBjYWxjdWxhdGVkIGFzIHRoZSBmcmFtZSBudW1iZXIgdGltZXMgdGhlIHByZXZpb3VzIGZyYW1lJ3MKKyAgICAgYmxvY2tzaXplLCBvciB6ZXJvIGlmIGl0IGlzIHRoZSBmaXJzdCBmcmFtZSkuCisKKyAgICAgVGhlcmVmb3JlLCB3aGVuIGluIGZpeGVkIGJsb2NrIHNpemUgbW9kZSwgd2Ugb25seSB1cGRhdGUgdGhlIGJsb2NrIHNpemUKKyAgICAgdGhlIGZpcnN0IHRpbWUsIHRoZW4gcmV1c2UgdGhhdCBibG9jayBzaXplIGZvciBzdWJzZXF1ZW50IGNhbGxzLgorICAgICBUaGlzIHdpbGwgYWxzbyBmaXggYSB0aW1lc3RhbXAgcHJvYmxlbSB3aXRoIHRoZSBsYXN0IGJsb2NrJ3MgdGltZXN0YW1wCisgICAgIGJlaW5nIG1pc2NhbGN1bGF0ZWQgYnkgc2NhbGluZyB0aGUgYmxvY2sgbnVtYmVyIGJ5IGEgIndyb25nIiBibG9jayBzaXplLgorICAgKi8KKyAgaWYgKGJsb2NraW5nX3N0cmF0ZWd5ID09IDApIHsKKyAgICBpZiAoZmxhY3BhcnNlLT5ibG9ja19zaXplICE9IDApIHsKKyAgICAgIC8qIGFmdGVyIGZpcnN0IGJsb2NrICovCisgICAgICBpZiAoZmxhY3BhcnNlLT5ibG9ja19zaXplICE9IGJsb2NrX3NpemUpIHsKKyAgICAgICAgLyogVE9ETzogY2FuIHdlIGtub3cgd2UncmUgb24gdGhlIGxhc3QgZnJhbWUsIHRvIGF2b2lkIHdhcm5pbmcgPyAqLworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGZsYWNwYXJzZSwgIkJsb2NrIHNpemUgaXMgbm90IGNvbnN0YW50Iik7CisgICAgICAgIGJsb2NrX3NpemUgPSBmbGFjcGFyc2UtPmJsb2NrX3NpemU7CisgICAgICAgIGlmIChzdXNwZWN0KQorICAgICAgICAgICpzdXNwZWN0ID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoc2V0KSB7CisgICAgZmxhY3BhcnNlLT5ibG9ja19zaXplID0gYmxvY2tfc2l6ZTsKKyAgICBpZiAoIWZsYWNwYXJzZS0+c2FtcGxlcmF0ZSkKKyAgICAgIGZsYWNwYXJzZS0+c2FtcGxlcmF0ZSA9IHNhbXBsZXJhdGU7CisgICAgaWYgKCFmbGFjcGFyc2UtPmJwcykKKyAgICAgIGZsYWNwYXJzZS0+YnBzID0gYnBzOworICAgIGlmICghZmxhY3BhcnNlLT5ibG9ja2luZ19zdHJhdGVneSkKKyAgICAgIGZsYWNwYXJzZS0+YmxvY2tpbmdfc3RyYXRlZ3kgPSBibG9ja2luZ19zdHJhdGVneTsKKyAgICBpZiAoIWZsYWNwYXJzZS0+Y2hhbm5lbHMpCisgICAgICBmbGFjcGFyc2UtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgaWYgKCFmbGFjcGFyc2UtPnNhbXBsZV9udW1iZXIpCisgICAgICBmbGFjcGFyc2UtPnNhbXBsZV9udW1iZXIgPSBzYW1wbGVfbnVtYmVyOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY3BhcnNlLAorICAgICAgICAiUGFyc2VkIGZyYW1lIGF0IG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFUICI6XG4iICJCbG9jayBzaXplOiAldVxuIgorICAgICAgICAiU2FtcGxlL0ZyYW1lIG51bWJlcjogJSIgR19HVUlOVDY0X0ZPUk1BVCwgZmxhY3BhcnNlLT5vZmZzZXQsCisgICAgICAgIGZsYWNwYXJzZS0+YmxvY2tfc2l6ZSwgZmxhY3BhcnNlLT5zYW1wbGVfbnVtYmVyKTsKKyAgfQorCisgIGlmIChibG9ja19zaXplX3JldCkKKyAgICAqYmxvY2tfc2l6ZV9yZXQgPSBibG9ja19zaXplOworCisgIHJldHVybiBGUkFNRV9IRUFERVJfVkFMSUQ7CisKK25lZWRfc3RyZWFtaW5mbzoKKyAgR1NUX0VSUk9SX09CSkVDVCAoZmxhY3BhcnNlLCAiTmVlZCBTVFJFQU1JTkZPIG1ldGFkYXRhLiBCaXRzIHBlciBzYW1wbGUgIgorICAgICAgIm9yIHNhbXBsZSByYXRlIG5vdCBpbiBmcmFtZSBoZWFkZXIiKTsKK2Vycm9yOgorICByZXR1cm4gRlJBTUVfSEVBREVSX0lOVkFMSUQ7CisKK25lZWRfbW9yZV9kYXRhOgorICByZXR1cm4gRlJBTUVfSEVBREVSX01PUkVfREFUQTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19wYXJzZV9mcmFtZV9pc192YWxpZCAoR3N0RmxhY1BhcnNlICogZmxhY3BhcnNlLAorICAgIGNvbnN0IGd1aW50OCAqIGRhdGEsIGdzaXplIHNpemUsIGd1aW50ICogcmV0KQoreworICBndWludCBtYXgsIHJlbWFpbmluZzsKKyAgZ3VpbnQgaSwgc2VhcmNoX3N0YXJ0LCBzZWFyY2hfZW5kOworICBGcmFtZUhlYWRlckNoZWNrUmV0dXJuIGhlYWRlcl9yZXQ7CisgIGd1aW50MTYgYmxvY2tfc2l6ZTsKKyAgZ2Jvb2xlYW4gc3VzcGVjdF9zdGFydCA9IEZBTFNFLCBzdXNwZWN0X2VuZCA9IEZBTFNFOworCisgIGlmIChzaXplIDwgZmxhY3BhcnNlLT5taW5fZnJhbWVzaXplKQorICAgIGdvdG8gbmVlZF9tb3JlOworCisgIGhlYWRlcl9yZXQgPQorICAgICAgZ3N0X2ZsYWNfcGFyc2VfZnJhbWVfaGVhZGVyX2lzX3ZhbGlkIChmbGFjcGFyc2UsIGRhdGEsIHNpemUsIFRSVUUsCisgICAgICAmYmxvY2tfc2l6ZSwgJnN1c3BlY3Rfc3RhcnQpOworICBpZiAoaGVhZGVyX3JldCA9PSBGUkFNRV9IRUFERVJfSU5WQUxJRCkgeworICAgICpyZXQgPSAwOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoaGVhZGVyX3JldCA9PSBGUkFNRV9IRUFERVJfTU9SRV9EQVRBKQorICAgIGdvdG8gbmVlZF9tb3JlOworCisgIC8qIG1pbmQgdW5rbm93biBmcmFtZXNpemUgKi8KKyAgc2VhcmNoX3N0YXJ0ID0gTUFYICgyLCBmbGFjcGFyc2UtPm1pbl9mcmFtZXNpemUpOworICBpZiAoZmxhY3BhcnNlLT5tYXhfZnJhbWVzaXplKQorICAgIHNlYXJjaF9lbmQgPSBNSU4gKHNpemUsIGZsYWNwYXJzZS0+bWF4X2ZyYW1lc2l6ZSArIDkgKyAyKTsKKyAgZWxzZQorICAgIHNlYXJjaF9lbmQgPSBzaXplOworICBzZWFyY2hfZW5kIC09IDI7CisKKyAgcmVtYWluaW5nID0gc2l6ZTsKKworICBmb3IgKGkgPSBzZWFyY2hfc3RhcnQ7IGkgPCBzZWFyY2hfZW5kOyBpKyssIHJlbWFpbmluZy0tKSB7CisKKyAgICBpZiAoKEdTVF9SRUFEX1VJTlQxNl9CRSAoZGF0YSArIGkpICYgMHhmZmZlKSAhPSAweGZmZjgpCisgICAgICBjb250aW51ZTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChmbGFjcGFyc2UsICJwb3NzaWJsZSBmcmFtZSBlbmQgYXQgb2Zmc2V0ICVkIiwgaSk7CisgICAgc3VzcGVjdF9lbmQgPSBGQUxTRTsKKyAgICBoZWFkZXJfcmV0ID0KKyAgICAgICAgZ3N0X2ZsYWNfcGFyc2VfZnJhbWVfaGVhZGVyX2lzX3ZhbGlkIChmbGFjcGFyc2UsIGRhdGEgKyBpLAorICAgICAgICByZW1haW5pbmcsIEZBTFNFLCBOVUxMLCAmc3VzcGVjdF9lbmQpOworICAgIGlmIChoZWFkZXJfcmV0ID09IEZSQU1FX0hFQURFUl9WQUxJRCkgeworICAgICAgaWYgKGZsYWNwYXJzZS0+Y2hlY2tfZnJhbWVfY2hlY2tzdW1zIHx8IHN1c3BlY3Rfc3RhcnQgfHwgc3VzcGVjdF9lbmQpIHsKKyAgICAgICAgZ3VpbnQxNiBhY3R1YWxfY3JjID0gZ3N0X2ZsYWNfY2FsY3VsYXRlX2NyYzE2IChkYXRhLCBpIC0gMik7CisgICAgICAgIGd1aW50MTYgZXhwZWN0ZWRfY3JjID0gR1NUX1JFQURfVUlOVDE2X0JFIChkYXRhICsgaSAtIDIpOworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChmbGFjcGFyc2UsCisgICAgICAgICAgICAiRm91bmQgcG9zc2libGUgZnJhbWUgKCVkLCAlZCkuIENoZWNraW5nIGZvciBDUkMgbWF0Y2giLAorICAgICAgICAgICAgc3VzcGVjdF9zdGFydCwgc3VzcGVjdF9lbmQpOworICAgICAgICBpZiAoYWN0dWFsX2NyYyAhPSBleHBlY3RlZF9jcmMpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjcGFyc2UsCisgICAgICAgICAgICAgICJDaGVja3N1bSBtaXNtYXRjaC4gSGVhZGVyIENSQyB3YXMgJyVkJyBidXQgZnJhbWUgaGFzICclZCciLAorICAgICAgICAgICAgICBleHBlY3RlZF9jcmMsIGFjdHVhbF9jcmMpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICAqcmV0ID0gaTsKKyAgICAgIGZsYWNwYXJzZS0+YmxvY2tfc2l6ZSA9IGJsb2NrX3NpemU7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9IGVsc2UgaWYgKGhlYWRlcl9yZXQgPT0gRlJBTUVfSEVBREVSX01PUkVfREFUQSkgeworICAgICAgZ290byBuZWVkX21vcmU7CisgICAgfQorICB9CisKKyAgLyogRm9yIHRoZSBsYXN0IGZyYW1lIG91dHB1dCBldmVyeXRoaW5nIHRvIHRoZSBlbmQgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKEdTVF9CQVNFX1BBUlNFX0RSQUlOSU5HIChmbGFjcGFyc2UpKSkgeworICAgIGlmIChmbGFjcGFyc2UtPmNoZWNrX2ZyYW1lX2NoZWNrc3VtcykgeworICAgICAgZ3VpbnQxNiBhY3R1YWxfY3JjID0gZ3N0X2ZsYWNfY2FsY3VsYXRlX2NyYzE2IChkYXRhLCBzaXplIC0gMik7CisgICAgICBndWludDE2IGV4cGVjdGVkX2NyYyA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoZGF0YSArIHNpemUgLSAyKTsKKworICAgICAgaWYgKGFjdHVhbF9jcmMgPT0gZXhwZWN0ZWRfY3JjKSB7CisgICAgICAgICpyZXQgPSBzaXplOworICAgICAgICBmbGFjcGFyc2UtPmJsb2NrX3NpemUgPSBibG9ja19zaXplOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgKnJldCA9IHNpemU7CisgICAgICBmbGFjcGFyc2UtPmJsb2NrX3NpemUgPSBibG9ja19zaXplOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgLyogc28gd2Ugc2VhcmNoZWQgdG8gZXhwZWN0ZWQgZW5kIGFuZCBmb3VuZCBub3RoaW5nLAorICAgKiBnaXZlIHVwIG9uIHRoaXMgZnJhbWUgKHN0YXJ0KSAqLworICBpZiAoZmxhY3BhcnNlLT5tYXhfZnJhbWVzaXplICYmIGkgPiAyICogZmxhY3BhcnNlLT5tYXhfZnJhbWVzaXplKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGZsYWNwYXJzZSwKKyAgICAgICAgImNvdWxkIG5vdCBkZXRlcm1pbmUgdmFsaWQgZnJhbWUgZW5kLCBkaXNjYXJkaW5nIGZyYW1lIChzdGFydCkiKTsKKyAgICAqcmV0ID0gMTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworbmVlZF9tb3JlOgorICBtYXggPSBmbGFjcGFyc2UtPm1heF9mcmFtZXNpemUgKyAxNjsKKyAgaWYgKG1heCA9PSAxNikKKyAgICBtYXggPSAxIDw8IDI0OworICAqcmV0ID0gTUlOIChzaXplICsgNDA5NiwgbWF4KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZmxhY19wYXJzZV9oYW5kbGVfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUsIGdpbnQgKiBza2lwc2l6ZSkKK3sKKyAgR3N0RmxhY1BhcnNlICpmbGFjcGFyc2UgPSBHU1RfRkxBQ19QQVJTRSAocGFyc2UpOworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IGZyYW1lLT5idWZmZXI7CisgIEdzdE1hcEluZm8gbWFwOworICBnYm9vbGVhbiByZXN1bHQgPSBUUlVFOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludCBmcmFtZXNpemUgPSAwOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgKnNraXBzaXplID0gMTsKKworICBpZiAoR19VTkxJS0VMWSAobWFwLnNpemUgPCA0KSkgeworICAgIHJlc3VsdCA9IEZBTFNFOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorCisgIGlmIChmbGFjcGFyc2UtPnN0YXRlID09IEdTVF9GTEFDX1BBUlNFX1NUQVRFX0lOSVQpIHsKKyAgICBpZiAobWVtY21wIChtYXAuZGF0YSwgImZMYUMiLCA0KSA9PSAwKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjcGFyc2UsICJmTGFDIG1hcmtlciBmb3VuZCIpOworICAgICAgZnJhbWVzaXplID0gNDsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgICAgaWYgKG1hcC5kYXRhWzBdID09IDB4ZmYgJiYgKG1hcC5kYXRhWzFdID4+IDIpID09IDB4M2UpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNwYXJzZSwgIkZvdW5kIGhlYWRlcmxlc3MgRkxBQyIpOworICAgICAgLyogTWluaW1hbCBzaXplIG9mIGEgZnJhbWUgaGVhZGVyICovCisgICAgICBnc3RfYmFzZV9wYXJzZV9zZXRfbWluX2ZyYW1lX3NpemUgKEdTVF9CQVNFX1BBUlNFIChmbGFjcGFyc2UpLCA5KTsKKyAgICAgIGZsYWNwYXJzZS0+c3RhdGUgPSBHU1RfRkxBQ19QQVJTRV9TVEFURV9HRU5FUkFURV9IRUFERVJTOworICAgICAgKnNraXBzaXplID0gMDsKKyAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKyAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjcGFyc2UsICJmTGFDIG1hcmtlciBub3QgZm91bmQiKTsKKyAgICByZXN1bHQgPSBGQUxTRTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KKworICBpZiAoZmxhY3BhcnNlLT5zdGF0ZSA9PSBHU1RfRkxBQ19QQVJTRV9TVEFURV9IRUFERVJTKSB7CisgICAgZ3VpbnQgc2l6ZSA9IDQgKyAoKG1hcC5kYXRhWzFdIDw8IDE2KSB8IChtYXAuZGF0YVsyXSA8PCA4KSB8IChtYXAuZGF0YVszXSkpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY3BhcnNlLCAiRm91bmQgbWV0YWRhdGEgYmxvY2sgb2Ygc2l6ZSAldSIsIHNpemUpOworICAgIGZyYW1lc2l6ZSA9IHNpemU7CisgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChHU1RfQkFTRV9QQVJTRSAoZmxhY3BhcnNlKSwgZnJhbWVzaXplKTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KKworICBpZiAoKEdTVF9SRUFEX1VJTlQxNl9CRSAobWFwLmRhdGEpICYgMHhmZmZlKSA9PSAweGZmZjgpIHsKKyAgICBnYm9vbGVhbiByZXQsIGlzX2ZpcnN0ID0gIWZsYWNwYXJzZS0+c3RyYXRlZ3lfY2hlY2tlZDsKKyAgICBndWludCBuZXh0OworCisgICAgZmxhY3BhcnNlLT5vZmZzZXQgPSBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKTsKKyAgICBmbGFjcGFyc2UtPmJsb2NraW5nX3N0cmF0ZWd5ID0gMDsKKyAgICBmbGFjcGFyc2UtPnNhbXBsZV9udW1iZXIgPSAwOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY3BhcnNlLCAiRm91bmQgc3luYyBjb2RlIik7CisgICAgcmV0ID0gZ3N0X2ZsYWNfcGFyc2VfZnJhbWVfaXNfdmFsaWQgKGZsYWNwYXJzZSwgbWFwLmRhdGEsIG1hcC5zaXplLCAmbmV4dCk7CisgICAgaWYgKHJldCkgeworICAgICAgaWYgKGlzX2ZpcnN0KSB7CisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoZmxhY3BhcnNlLCAiRmlyc3Qgc2FtcGxlIG51bWJlciBpcyAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgZmxhY3BhcnNlLT5zYW1wbGVfbnVtYmVyKTsKKyAgICAgICAgZmxhY3BhcnNlLT5maXJzdF9zYW1wbGVfbnVtYmVyID0gZmxhY3BhcnNlLT5zYW1wbGVfbnVtYmVyOworICAgICAgfQorICAgICAgZnJhbWVzaXplID0gbmV4dDsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICAvKiBJZiB3ZSdyZSBhdCBFT1MgYW5kIHRoZSBmcmFtZSB3YXMgbm90IHZhbGlkLCBkcm9wIGl0ISAqLworICAgIGlmIChHX1VOTElLRUxZIChHU1RfQkFTRV9QQVJTRV9EUkFJTklORyAoZmxhY3BhcnNlKSkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZmxhY3BhcnNlLCAiRU9TIik7CisgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICBpZiAobmV4dCA9PSAwKSB7CisgICAgfSBlbHNlIGlmIChuZXh0ID4gbWFwLnNpemUpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNwYXJzZSwgIlJlcXVlc3RpbmcgJXUgYnl0ZXMiLCBuZXh0KTsKKyAgICAgICpza2lwc2l6ZSA9IDA7CisgICAgICBnc3RfYmFzZV9wYXJzZV9zZXRfbWluX2ZyYW1lX3NpemUgKHBhcnNlLCBuZXh0KTsKKyAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgZ290byBjbGVhbnVwOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChmbGFjcGFyc2UsCisgICAgICAgICAgIkdpdmluZyB1cCBvbiBpbnZhbGlkIGZyYW1lICglIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzKSIsIG1hcC5zaXplKTsKKyAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHc3RCeXRlUmVhZGVyIHJlYWRlcjsKKyAgICBnaW50IG9mZjsKKworICAgIGdzdF9ieXRlX3JlYWRlcl9pbml0ICgmcmVhZGVyLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAgIG9mZiA9CisgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9tYXNrZWRfc2Nhbl91aW50MzIgKCZyZWFkZXIsIDB4ZmZmYzAwMDAsIDB4ZmZmODAwMDAsCisgICAgICAgIDAsIG1hcC5zaXplKTsKKworICAgIGlmIChvZmYgPiAwKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlBvc3NpYmxlIHN5bmMgYXQgYnVmZmVyIG9mZnNldCAlZCIsIG9mZik7CisgICAgICAqc2tpcHNpemUgPSBvZmY7CisgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjcGFyc2UsICJTeW5jIGNvZGUgbm90IGZvdW5kIik7CisgICAgKnNraXBzaXplID0gbWFwLnNpemUgLSAzOworICAgIHJlc3VsdCA9IEZBTFNFOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorCisgIHJlc3VsdCA9IEZBTFNFOworCitjbGVhbnVwOgorICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIGlmIChyZXN1bHQpCisgICAgKnNraXBzaXplID0gMDsKKworICBpZiAocmVzdWx0ICYmIGZyYW1lc2l6ZSA8PSBtYXAuc2l6ZSkgeworICAgIHJldCA9IGdzdF9mbGFjX3BhcnNlX3BhcnNlX2ZyYW1lIChwYXJzZSwgZnJhbWUsIGZyYW1lc2l6ZSk7CisgICAgaWYgKHJldCA9PSBHU1RfQkFTRV9QQVJTRV9GTE9XX0RST1BQRUQpIHsKKyAgICAgIGZyYW1lLT5mbGFncyB8PSBHU1RfQkFTRV9QQVJTRV9GUkFNRV9GTEFHX0RST1A7CisgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICB9CisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykKKyAgICAgIHJldCA9IGdzdF9iYXNlX3BhcnNlX2ZpbmlzaF9mcmFtZSAocGFyc2UsIGZyYW1lLCBmcmFtZXNpemUpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19wYXJzZV9oYW5kbGVfc3RyZWFtaW5mbyAoR3N0RmxhY1BhcnNlICogZmxhY3BhcnNlLCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEJpdFJlYWRlciByZWFkZXI7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGdzdF9iaXRfcmVhZGVyX2luaXQgKCZyZWFkZXIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisKKyAgaWYgKG1hcC5zaXplICE9IDQgKyAzNCkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGZsYWNwYXJzZSwKKyAgICAgICAgIkludmFsaWQgbWV0YWJsb2NrIHNpemUgZm9yIFNUUkVBTUlORk86ICUiIEdfR1NJWkVfRk9STUFUICIiLCBtYXAuc2l6ZSk7CisgICAgZ290byBmYWlsdXJlOworICB9CisKKyAgLyogU2tpcCBtZXRhZGF0YSBibG9jayBoZWFkZXIgKi8KKyAgaWYgKCFnc3RfYml0X3JlYWRlcl9za2lwICgmcmVhZGVyLCAzMikpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQxNiAoJnJlYWRlciwgJmZsYWNwYXJzZS0+bWluX2Jsb2Nrc2l6ZSwgMTYpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmIChmbGFjcGFyc2UtPm1pbl9ibG9ja3NpemUgPCAxNikgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZmxhY3BhcnNlLCAiSW52YWxpZCBtaW5pbXVtIGJsb2NrIHNpemU6ICV1IiwKKyAgICAgICAgZmxhY3BhcnNlLT5taW5fYmxvY2tzaXplKTsKKyAgfQorCisgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDE2ICgmcmVhZGVyLCAmZmxhY3BhcnNlLT5tYXhfYmxvY2tzaXplLCAxNikpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKGZsYWNwYXJzZS0+bWF4X2Jsb2Nrc2l6ZSA8IDE2KSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChmbGFjcGFyc2UsICJJbnZhbGlkIG1heGltdW0gYmxvY2sgc2l6ZTogJXUiLAorICAgICAgICBmbGFjcGFyc2UtPm1heF9ibG9ja3NpemUpOworICB9CisKKyAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzIgKCZyZWFkZXIsICZmbGFjcGFyc2UtPm1pbl9mcmFtZXNpemUsIDI0KSkKKyAgICBnb3RvIGVycm9yOworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQzMiAoJnJlYWRlciwgJmZsYWNwYXJzZS0+bWF4X2ZyYW1lc2l6ZSwgMjQpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzIgKCZyZWFkZXIsICZmbGFjcGFyc2UtPnNhbXBsZXJhdGUsIDIwKSkKKyAgICBnb3RvIGVycm9yOworICBpZiAoZmxhY3BhcnNlLT5zYW1wbGVyYXRlID09IDApIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChmbGFjcGFyc2UsICJJbnZhbGlkIHNhbXBsZSByYXRlIDAiKTsKKyAgICBnb3RvIGZhaWx1cmU7CisgIH0KKworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmcmVhZGVyLCAmZmxhY3BhcnNlLT5jaGFubmVscywgMykpCisgICAgZ290byBlcnJvcjsKKyAgZmxhY3BhcnNlLT5jaGFubmVscysrOworICBpZiAoZmxhY3BhcnNlLT5jaGFubmVscyA+IDgpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChmbGFjcGFyc2UsICJJbnZhbGlkIG51bWJlciBvZiBjaGFubmVscyAldSIsCisgICAgICAgIGZsYWNwYXJzZS0+Y2hhbm5lbHMpOworICAgIGdvdG8gZmFpbHVyZTsKKyAgfQorCisgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKCZyZWFkZXIsICZmbGFjcGFyc2UtPmJwcywgNSkpCisgICAgZ290byBlcnJvcjsKKyAgZmxhY3BhcnNlLT5icHMrKzsKKworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ2NCAoJnJlYWRlciwgJmZsYWNwYXJzZS0+dG90YWxfc2FtcGxlcywgMzYpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmIChmbGFjcGFyc2UtPnRvdGFsX3NhbXBsZXMpIHsKKyAgICBnc3RfYmFzZV9wYXJzZV9zZXRfZHVyYXRpb24gKEdTVF9CQVNFX1BBUlNFIChmbGFjcGFyc2UpLAorICAgICAgICBHU1RfRk9STUFUX0RFRkFVTFQsIGZsYWNwYXJzZS0+dG90YWxfc2FtcGxlcywgMCk7CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNwYXJzZSwgIlNUUkVBTUlORk86XG4iCisgICAgICAiXHRtaW4vbWF4IGJsb2Nrc2l6ZTogJXUvJXUsXG4iCisgICAgICAiXHRtaW4vbWF4IGZyYW1lc2l6ZTogJXUvJXUsXG4iCisgICAgICAiXHRzYW1wbGVyYXRlOiAldSxcbiIKKyAgICAgICJcdGNoYW5uZWxzOiAldSxcbiIKKyAgICAgICJcdGJpdHMgcGVyIHNhbXBsZTogJXUsXG4iCisgICAgICAiXHR0b3RhbCBzYW1wbGVzOiAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgZmxhY3BhcnNlLT5taW5fYmxvY2tzaXplLCBmbGFjcGFyc2UtPm1heF9ibG9ja3NpemUsCisgICAgICBmbGFjcGFyc2UtPm1pbl9mcmFtZXNpemUsIGZsYWNwYXJzZS0+bWF4X2ZyYW1lc2l6ZSwKKyAgICAgIGZsYWNwYXJzZS0+c2FtcGxlcmF0ZSwKKyAgICAgIGZsYWNwYXJzZS0+Y2hhbm5lbHMsIGZsYWNwYXJzZS0+YnBzLCBmbGFjcGFyc2UtPnRvdGFsX3NhbXBsZXMpOworCisgIHJldHVybiBUUlVFOworCitlcnJvcjoKKyAgR1NUX0VSUk9SX09CSkVDVCAoZmxhY3BhcnNlLCAiRmFpbGVkIHRvIHJlYWQgZGF0YSIpOworZmFpbHVyZToKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbGFjX3BhcnNlX2hhbmRsZV92b3JiaXNjb21tZW50IChHc3RGbGFjUGFyc2UgKiBmbGFjcGFyc2UsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RUYWdMaXN0ICp0YWdzOworICBHc3RNYXBJbmZvIG1hcDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIHRhZ3MgPQorICAgICAgZ3N0X3RhZ19saXN0X2Zyb21fdm9yYmlzY29tbWVudCAobWFwLmRhdGEsIG1hcC5zaXplLCBtYXAuZGF0YSwgNCwgTlVMTCk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgaWYgKHRhZ3MgPT0gTlVMTCkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGZsYWNwYXJzZSwgIkludmFsaWQgdm9yYmlzY29tbWVudCBibG9jayIpOworICB9IGVsc2UgaWYgKGdzdF90YWdfbGlzdF9pc19lbXB0eSAodGFncykpIHsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ3MpOworICB9IGVsc2UgaWYgKGZsYWNwYXJzZS0+dGFncyA9PSBOVUxMKSB7CisgICAgZmxhY3BhcnNlLT50YWdzID0gdGFnczsKKyAgfSBlbHNlIHsKKyAgICBnc3RfdGFnX2xpc3RfaW5zZXJ0IChmbGFjcGFyc2UtPnRhZ3MsIHRhZ3MsIEdTVF9UQUdfTUVSR0VfQVBQRU5EKTsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ3MpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ZsYWNfcGFyc2VfaGFuZGxlX2N1ZXNoZWV0IChHc3RGbGFjUGFyc2UgKiBmbGFjcGFyc2UsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0Qnl0ZVJlYWRlciByZWFkZXI7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludCBpLCBqOworICBndWludDggbl90cmFja3MsIHRyYWNrX251bSwgaW5kZXg7CisgIGd1aW50NjQgb2Zmc2V0OworICBnaW50NjQgc3RhcnQsIHN0b3A7CisgIGdjaGFyICppZDsKKyAgZ2NoYXIgaXNyY1sxM107CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisgIEdzdFRvYyAqdG9jOworICBHc3RUb2NFbnRyeSAqY3VyX2VudHJ5ID0gTlVMTCwgKnByZXZfZW50cnkgPSBOVUxMOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGdzdF9ieXRlX3JlYWRlcl9pbml0ICgmcmVhZGVyLCBtYXAuZGF0YSwgbWFwLnNpemUpOworCisgIHRvYyA9IGdzdF90b2NfbmV3IChHU1RfVE9DX1NDT1BFX0dMT0JBTCk7CisKKyAgLyogc2tpcCA0IGJ5dGVzIE1FVEFEQVRBX0JMT0NLX0hFQURFUiAqLworICAvKiBodHRwczovL3hpcGgub3JnL2ZsYWMvZm9ybWF0Lmh0bWwjbWV0YWRhdGFfYmxvY2tfaGVhZGVyICovCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZyZWFkZXIsIDQpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogc2tpcCAzOTUgYnl0ZXMgZnJvbSBNRVRBREFUQV9CTE9DS19DVUVTSEVFVCAqLworICAvKiBodHRwczovL3hpcGgub3JnL2ZsYWMvZm9ybWF0Lmh0bWwjbWV0YWRhdGFfYmxvY2tfY3Vlc2hlZXQgKi8KKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJnJlYWRlciwgMzk1KSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAoJnJlYWRlciwgJm5fdHJhY2tzKSkKKyAgICBnb3RvIGVycm9yOworCisgIC8qIENVRVNIRUVUX1RSQUNLICovCisgIC8qIGh0dHBzOi8veGlwaC5vcmcvZmxhYy9mb3JtYXQuaHRtbCNjdWVzaGVldF90cmFjayAqLworICBmb3IgKGkgPSAwOyBpIDwgbl90cmFja3M7IGkrKykgeworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50NjRfYmUgKCZyZWFkZXIsICZvZmZzZXQpKQorICAgICAgZ290byBlcnJvcjsKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZyZWFkZXIsICZ0cmFja19udW0pKQorICAgICAgZ290byBlcnJvcjsKKworICAgIGlmIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoJnJlYWRlcikgPCAxMikKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgbWVtY3B5IChpc3JjLCBtYXAuZGF0YSArIGdzdF9ieXRlX3JlYWRlcl9nZXRfcG9zICgmcmVhZGVyKSwgMTIpOworICAgIC8qIFwwLXRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCisgICAgaXNyY1sxMl0gPSAnXDAnOworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZyZWFkZXIsIDEyKSkKKyAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAvKiBza2lwIDE0IGJ5dGVzIGZyb20gQ1VFU0hFRVRfVFJBQ0sgKi8KKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmcmVhZGVyLCAxNCkpCisgICAgICBnb3RvIGVycm9yOworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAoJnJlYWRlciwgJmluZGV4KSkKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgLyogYWRkIHRyYWNrcyBpbiBUT0MgKi8KKyAgICAvKiBsZWFkLW91dCB0YWNrIGhhcyBudW1iZXIgMTcwIG9yIDI1NSAqLworICAgIGlmICh0cmFja19udW0gIT0gMTcwICYmIHRyYWNrX251bSAhPSAyNTUpIHsKKyAgICAgIHByZXZfZW50cnkgPSBjdXJfZW50cnk7CisgICAgICAvKiBwcmV2aW91cyB0cmFjayBzdG9wIHRpbWUgPSBjdXJyZW50IHRyYWNrIHN0YXJ0IHRpbWUgKi8KKyAgICAgIGlmIChwcmV2X2VudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgZ3N0X3RvY19lbnRyeV9nZXRfc3RhcnRfc3RvcF90aW1lcyAocHJldl9lbnRyeSwgJnN0YXJ0LCBOVUxMKTsKKyAgICAgICAgc3RvcCA9CisgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKG9mZnNldCwgR1NUX1NFQ09ORCwKKyAgICAgICAgICAgIGZsYWNwYXJzZS0+c2FtcGxlcmF0ZSk7CisgICAgICAgIGdzdF90b2NfZW50cnlfc2V0X3N0YXJ0X3N0b3BfdGltZXMgKHByZXZfZW50cnksIHN0YXJ0LCBzdG9wKTsKKyAgICAgIH0KKyAgICAgIGlkID0gZ19zdHJkdXBfcHJpbnRmICgiJTA4eCIsIHRyYWNrX251bSk7CisgICAgICBjdXJfZW50cnkgPSBnc3RfdG9jX2VudHJ5X25ldyAoR1NUX1RPQ19FTlRSWV9UWVBFX1RSQUNLLCBpZCk7CisgICAgICBnX2ZyZWUgKGlkKTsKKyAgICAgIHN0YXJ0ID0KKyAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKG9mZnNldCwgR1NUX1NFQ09ORCwKKyAgICAgICAgICBmbGFjcGFyc2UtPnNhbXBsZXJhdGUpOworICAgICAgZ3N0X3RvY19lbnRyeV9zZXRfc3RhcnRfc3RvcF90aW1lcyAoY3VyX2VudHJ5LCBzdGFydCwgLTEpOworICAgICAgLyogYWRkIElTUkMgYXMgdGFnIGluIHRyYWNrICovCisgICAgICBpZiAoc3RybGVuIChpc3JjKSAhPSAwKSB7CisgICAgICAgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX0FQUEVORCwgR1NUX1RBR19JU1JDLCBpc3JjLCBOVUxMKTsKKyAgICAgICAgZ3N0X3RvY19lbnRyeV9zZXRfdGFncyAoY3VyX2VudHJ5LCB0YWdzKTsKKyAgICAgIH0KKyAgICAgIGdzdF90b2NfYXBwZW5kX2VudHJ5ICh0b2MsIGN1cl9lbnRyeSk7CisgICAgICAvKiBDVUVTSEVFVF9UUkFDS19JTkRFWCAqLworICAgICAgLyogaHR0cHM6Ly94aXBoLm9yZy9mbGFjL2Zvcm1hdC5odG1sI2N1ZXNoZWV0X3RyYWNrX2luZGV4ICovCisgICAgICBmb3IgKGogPSAwOyBqIDwgaW5kZXg7IGorKykgeworICAgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmcmVhZGVyLCAxMikpCisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogc2V0IHN0b3AgdGltZSBpbiBsYXN0IHRyYWNrICovCisgICAgICBzdG9wID0KKyAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKG9mZnNldCwgR1NUX1NFQ09ORCwKKyAgICAgICAgICBmbGFjcGFyc2UtPnNhbXBsZXJhdGUpOworICAgICAgZ3N0X3RvY19lbnRyeV9zZXRfc3RhcnRfc3RvcF90aW1lcyAoY3VyX2VudHJ5LCBzdGFydCwgc3RvcCk7CisgICAgfQorICB9CisKKyAgLyogc2VuZCBkYXRhIGFzIFRPQyAqLworICBpZiAoIWZsYWNwYXJzZS0+dG9jKQorICAgIGZsYWNwYXJzZS0+dG9jID0gdG9jOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIHJldHVybiBUUlVFOworCitlcnJvcjoKKyAgR1NUX0VSUk9SX09CSkVDVCAoZmxhY3BhcnNlLCAiRXJyb3IgcmVhZGluZyBkYXRhIik7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19wYXJzZV9oYW5kbGVfcGljdHVyZSAoR3N0RmxhY1BhcnNlICogZmxhY3BhcnNlLCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEJ5dGVSZWFkZXIgcmVhZGVyOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQzMiBpbWdfbGVuID0gMCwgaW1nX3R5cGUgPSAwOworICBndWludDMyIGltZ19taW1ldHlwZV9sZW4gPSAwLCBpbWdfZGVzY3JpcHRpb25fbGVuID0gMDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJnJlYWRlciwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmcmVhZGVyLCA0KSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZyZWFkZXIsICZpbWdfdHlwZSkpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmcmVhZGVyLCAmaW1nX21pbWV0eXBlX2xlbikpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJnJlYWRlciwgaW1nX21pbWV0eXBlX2xlbikpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmcmVhZGVyLCAmaW1nX2Rlc2NyaXB0aW9uX2xlbikpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJnJlYWRlciwgaW1nX2Rlc2NyaXB0aW9uX2xlbikpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmcmVhZGVyLCA0ICogNCkpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmcmVhZGVyLCAmaW1nX2xlbikpCisgICAgZ290byBlcnJvcjsKKworICBpZiAoZ3N0X2J5dGVfcmVhZGVyX2dldF9wb3MgKCZyZWFkZXIpICsgaW1nX2xlbiA+IG1hcC5zaXplKQorICAgIGdvdG8gZXJyb3I7CisKKyAgR1NUX0lORk9fT0JKRUNUIChmbGFjcGFyc2UsICJHb3QgaW1hZ2Ugb2YgJWQgYnl0ZXMiLCBpbWdfbGVuKTsKKworICBpZiAoaW1nX2xlbiA+IDApIHsKKyAgICBpZiAoZmxhY3BhcnNlLT50YWdzID09IE5VTEwpCisgICAgICBmbGFjcGFyc2UtPnRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgICAgZ3N0X3RhZ19saXN0X2FkZF9pZDNfaW1hZ2UgKGZsYWNwYXJzZS0+dGFncywKKyAgICAgICAgbWFwLmRhdGEgKyBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3BvcyAoJnJlYWRlciksIGltZ19sZW4sIGltZ190eXBlKTsKKyAgfQorCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIHJldHVybiBUUlVFOworCitlcnJvcjoKKyAgR1NUX0VSUk9SX09CSkVDVCAoZmxhY3BhcnNlLCAiRXJyb3IgcmVhZGluZyBkYXRhIik7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19wYXJzZV9oYW5kbGVfc2Vla3RhYmxlIChHc3RGbGFjUGFyc2UgKiBmbGFjcGFyc2UsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKworICBHU1RfREVCVUdfT0JKRUNUIChmbGFjcGFyc2UsICJzdG9yaW5nIHNlZWt0YWJsZSIpOworICAvKiBvbmx5IHN0b3JlIGZvciBub3c7CisgICAqIG9mZnNldCBvZiB0aGUgZmlyc3QgZnJhbWUgaXMgbmVlZGVkIHRvIGdldCByZWFsIGluZm8gKi8KKyAgaWYgKGZsYWNwYXJzZS0+c2Vla3RhYmxlKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKGZsYWNwYXJzZS0+c2Vla3RhYmxlKTsKKyAgZmxhY3BhcnNlLT5zZWVrdGFibGUgPSBnc3RfYnVmZmVyX3JlZiAoYnVmZmVyKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9mbGFjX3BhcnNlX3Byb2Nlc3Nfc2Vla3RhYmxlIChHc3RGbGFjUGFyc2UgKiBmbGFjcGFyc2UsIGdpbnQ2NCBib2Zmc2V0KQoreworICBHc3RCeXRlUmVhZGVyIGJyOworICBnaW50NjQgb2Zmc2V0ID0gMCwgc2FtcGxlcyA9IDA7CisgIEdzdE1hcEluZm8gbWFwOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNwYXJzZSwKKyAgICAgICJwYXJzaW5nIHNlZWt0YWJsZTsgYmFzZSBvZmZzZXQgJSIgR19HSU5UNjRfRk9STUFULCBib2Zmc2V0KTsKKworICBpZiAoYm9mZnNldCA8PSAwKQorICAgIGdvdG8gZXhpdDsKKworICBnc3RfYnVmZmVyX21hcCAoZmxhY3BhcnNlLT5zZWVrdGFibGUsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGdzdF9ieXRlX3JlYWRlcl9pbml0ICgmYnIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisKKyAgLyogc2tpcCBoZWFkZXIgKi8KKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJmJyLCA0KSkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogc2Vla3BvaW50cyAqLworICB3aGlsZSAoZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKCZicikpIHsKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfaW50NjRfYmUgKCZiciwgJnNhbXBsZXMpKQorICAgICAgYnJlYWs7CisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2ludDY0X2JlICgmYnIsICZvZmZzZXQpKQorICAgICAgYnJlYWs7CisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJmJyLCAyKSkKKyAgICAgIGJyZWFrOworCisgICAgR1NUX0xPR19PQkpFQ1QgKGZsYWNwYXJzZSwgInNhbXBsZXMgJSIgR19HSU5UNjRfRk9STUFUICIgLT4gb2Zmc2V0ICUiCisgICAgICAgIEdfR0lOVDY0X0ZPUk1BVCwgc2FtcGxlcywgb2Zmc2V0KTsKKworICAgIC8qIHNhbml0eSBjaGVjayAqLworICAgIGlmIChHX0xJS0VMWSAob2Zmc2V0ID4gMCAmJiBzYW1wbGVzID4gMCkpIHsKKyAgICAgIGdzdF9iYXNlX3BhcnNlX2FkZF9pbmRleF9lbnRyeSAoR1NUX0JBU0VfUEFSU0UgKGZsYWNwYXJzZSksCisgICAgICAgICAgYm9mZnNldCArIG9mZnNldCwgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzYW1wbGVzLCBHU1RfU0VDT05ELAorICAgICAgICAgICAgICBmbGFjcGFyc2UtPnNhbXBsZXJhdGUpLCBUUlVFLCBGQUxTRSk7CisgICAgfQorICB9CisKK2RvbmU6CisgIGdzdF9idWZmZXJfdW5tYXAgKGZsYWNwYXJzZS0+c2Vla3RhYmxlLCAmbWFwKTsKK2V4aXQ6CisgIGdzdF9idWZmZXJfdW5yZWYgKGZsYWNwYXJzZS0+c2Vla3RhYmxlKTsKKyAgZmxhY3BhcnNlLT5zZWVrdGFibGUgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorX3ZhbHVlX2FycmF5X2FwcGVuZF9idWZmZXIgKEdWYWx1ZSAqIGFycmF5X3ZhbCwgR3N0QnVmZmVyICogYnVmKQoreworICBHVmFsdWUgdmFsdWUgPSB7IDAsIH07CisKKyAgZ192YWx1ZV9pbml0ICgmdmFsdWUsIEdTVF9UWVBFX0JVRkZFUik7CisgIC8qIGNvcHkgYnVmZmVyIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggY2lyY3VsYXIgcmVmY291bnRzICovCisgIGJ1ZiA9IGdzdF9idWZmZXJfY29weSAoYnVmKTsKKyAgLyogYWdhaW4sIGZvciBnb29kIG1lYXN1cmUgKi8KKyAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKyAgZ3N0X3ZhbHVlX3NldF9idWZmZXIgKCZ2YWx1ZSwgYnVmKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgZ3N0X3ZhbHVlX2FycmF5X2FwcGVuZF92YWx1ZSAoYXJyYXlfdmFsLCAmdmFsdWUpOworICBnX3ZhbHVlX3Vuc2V0ICgmdmFsdWUpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2ZsYWNfcGFyc2VfaGFuZGxlX2hlYWRlcnMgKEdzdEZsYWNQYXJzZSAqIGZsYWNwYXJzZSkKK3sKKyAgR3N0QnVmZmVyICp2b3JiaXNjb21tZW50ID0gTlVMTDsKKyAgR3N0QnVmZmVyICpzdHJlYW1pbmZvID0gTlVMTDsKKyAgR3N0QnVmZmVyICptYXJrZXIgPSBOVUxMOworICBHVmFsdWUgYXJyYXkgPSB7IDAsIH07CisgIEdzdENhcHMgKmNhcHM7CisgIEdMaXN0ICpsOworICBHc3RGbG93UmV0dXJuIHJlcyA9IEdTVF9GTE9XX09LOworCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1mbGFjIiwKKyAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGZsYWNwYXJzZS0+Y2hhbm5lbHMsCisgICAgICAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsCisgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIGZsYWNwYXJzZS0+c2FtcGxlcmF0ZSwgTlVMTCk7CisKKyAgaWYgKCFmbGFjcGFyc2UtPmhlYWRlcnMpCisgICAgZ290byBwdXNoX2hlYWRlcnM7CisKKyAgZm9yIChsID0gZmxhY3BhcnNlLT5oZWFkZXJzOyBsOyBsID0gbC0+bmV4dCkgeworICAgIEdzdEJ1ZmZlciAqaGVhZGVyID0gbC0+ZGF0YTsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgIGdzdF9idWZmZXJfbWFwIChoZWFkZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChoZWFkZXIsIEdTVF9CVUZGRVJfRkxBR19IRUFERVIpOworCisgICAgaWYgKG1hcC5zaXplID09IDQgJiYgbWVtY21wIChtYXAuZGF0YSwgImZMYUMiLCA0KSA9PSAwKSB7CisgICAgICBtYXJrZXIgPSBoZWFkZXI7CisgICAgfSBlbHNlIGlmIChtYXAuc2l6ZSA+IDEgJiYgKG1hcC5kYXRhWzBdICYgMHg3ZikgPT0gMCkgeworICAgICAgc3RyZWFtaW5mbyA9IGhlYWRlcjsKKyAgICB9IGVsc2UgaWYgKG1hcC5zaXplID4gMSAmJiAobWFwLmRhdGFbMF0gJiAweDdmKSA9PSA0KSB7CisgICAgICB2b3JiaXNjb21tZW50ID0gaGVhZGVyOworICAgIH0KKworICAgIGdzdF9idWZmZXJfdW5tYXAgKGhlYWRlciwgJm1hcCk7CisgIH0KKworICAvKiBhdCBsZWFzdCB0aGlzIG9uZSB3ZSBjYW4gZ2VuZXJhdGUgZWFzaWx5CisgICAqIHRvIHByb3ZpZGUgZnVsbCBoZWFkZXJzIGRvd25zdHJlYW0gKi8KKyAgaWYgKHZvcmJpc2NvbW1lbnQgPT0gTlVMTCAmJiBzdHJlYW1pbmZvICE9IE5VTEwpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjcGFyc2UsCisgICAgICAgICJtaXNzaW5nIHZvcmJpc2NvbW1lbnQgaGVhZGVyOyBnZW5lcmF0aW5nIGR1bW15Iik7CisgICAgdm9yYmlzY29tbWVudCA9IGdzdF9mbGFjX3BhcnNlX2dlbmVyYXRlX3ZvcmJpc2NvbW1lbnQgKGZsYWNwYXJzZSk7CisgICAgZmxhY3BhcnNlLT5oZWFkZXJzID0gZ19saXN0X2luc2VydCAoZmxhY3BhcnNlLT5oZWFkZXJzLCB2b3JiaXNjb21tZW50LAorICAgICAgICBnX2xpc3RfaW5kZXggKGZsYWNwYXJzZS0+aGVhZGVycywgc3RyZWFtaW5mbykgKyAxKTsKKyAgfQorCisgIGlmIChtYXJrZXIgPT0gTlVMTCB8fCBzdHJlYW1pbmZvID09IE5VTEwgfHwgdm9yYmlzY29tbWVudCA9PSBOVUxMKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChmbGFjcGFyc2UsCisgICAgICAgICJtaXNzaW5nIGhlYWRlciAlcCAlcCAlcCwgbXV4aW5nIGludG8gY29udGFpbmVyICIKKyAgICAgICAgImZvcm1hdHMgbWF5IGJlIGJyb2tlbiIsIG1hcmtlciwgc3RyZWFtaW5mbywgdm9yYmlzY29tbWVudCk7CisgICAgZ290byBwdXNoX2hlYWRlcnM7CisgIH0KKworICBnX3ZhbHVlX2luaXQgKCZhcnJheSwgR1NUX1RZUEVfQVJSQVkpOworCisgIC8qIGFkZCBtYXJrZXIgaW5jbHVkaW5nIFNUUkVBTUlORk8gaGVhZGVyICovCisgIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICBndWludDE2IG51bTsKKyAgICBHc3RNYXBJbmZvIHNpbmZvbWFwLCB3cml0ZW1hcDsKKworICAgIGdzdF9idWZmZXJfbWFwIChzdHJlYW1pbmZvLCAmc2luZm9tYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgICAvKiBtaW51cyBvbmUgZm9yIHRoZSBtYXJrZXIgdGhhdCBpcyBtZXJnZWQgd2l0aCBzdHJlYW1pbmZvIGhlcmUgKi8KKyAgICBudW0gPSBnX2xpc3RfbGVuZ3RoIChmbGFjcGFyc2UtPmhlYWRlcnMpIC0gMTsKKworICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTMgKyBzaW5mb21hcC5zaXplKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmd3JpdGVtYXAsIEdTVF9NQVBfV1JJVEUpOworCisgICAgd3JpdGVtYXAuZGF0YVswXSA9IDB4N2Y7CisgICAgbWVtY3B5ICh3cml0ZW1hcC5kYXRhICsgMSwgIkZMQUMiLCA0KTsKKyAgICB3cml0ZW1hcC5kYXRhWzVdID0gMHgwMTsgICAgLyogbWFwcGluZyB2ZXJzaW9uIG1ham9yICovCisgICAgd3JpdGVtYXAuZGF0YVs2XSA9IDB4MDA7ICAgIC8qIG1hcHBpbmcgdmVyc2lvbiBtaW5vciAqLworICAgIHdyaXRlbWFwLmRhdGFbN10gPSAobnVtICYgMHhGRjAwKSA+PiA4OworICAgIHdyaXRlbWFwLmRhdGFbOF0gPSAobnVtICYgMHgwMEZGKSA+PiAwOworICAgIG1lbWNweSAod3JpdGVtYXAuZGF0YSArIDksICJmTGFDIiwgNCk7CisgICAgbWVtY3B5ICh3cml0ZW1hcC5kYXRhICsgMTMsIHNpbmZvbWFwLmRhdGEsIHNpbmZvbWFwLnNpemUpOworICAgIF92YWx1ZV9hcnJheV9hcHBlbmRfYnVmZmVyICgmYXJyYXksIGJ1Zik7CisKKyAgICBnc3RfYnVmZmVyX3VubWFwIChzdHJlYW1pbmZvLCAmc2luZm9tYXApOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJndyaXRlbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICB9CisKKyAgLyogYWRkIFZPUkJJU0NPTU1FTlQgaGVhZGVyICovCisgIF92YWx1ZV9hcnJheV9hcHBlbmRfYnVmZmVyICgmYXJyYXksIHZvcmJpc2NvbW1lbnQpOworCisgIC8qIGFkZCBvdGhlciBoZWFkZXJzLCBpZiB0aGVyZSBhcmUgYW55ICovCisgIGZvciAobCA9IGZsYWNwYXJzZS0+aGVhZGVyczsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICBpZiAoR1NUX0JVRkZFUl9DQVNUIChsLT5kYXRhKSAhPSBtYXJrZXIgJiYKKyAgICAgICAgR1NUX0JVRkZFUl9DQVNUIChsLT5kYXRhKSAhPSBzdHJlYW1pbmZvICYmCisgICAgICAgIEdTVF9CVUZGRVJfQ0FTVCAobC0+ZGF0YSkgIT0gdm9yYmlzY29tbWVudCkgeworICAgICAgX3ZhbHVlX2FycmF5X2FwcGVuZF9idWZmZXIgKCZhcnJheSwgR1NUX0JVRkZFUl9DQVNUIChsLT5kYXRhKSk7CisgICAgfQorICB9CisKKyAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApLAorICAgICAgInN0cmVhbWhlYWRlciIsICZhcnJheSk7CisgIGdfdmFsdWVfdW5zZXQgKCZhcnJheSk7CisKK3B1c2hfaGVhZGVyczoKKworICBnc3RfcGFkX3NldF9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChHU1RfQkFTRV9QQVJTRSAoZmxhY3BhcnNlKSksIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgLyogcHVzaCBoZWFkZXIgYnVmZmVyczsgdXBkYXRlIGNhcHMsIHNvIHdoZW4gd2UgcHVzaCB0aGUgZmlyc3QgYnVmZmVyIHRoZQorICAgKiBuZWdvdGlhdGVkIGNhcHMgd2lsbCBjaGFuZ2UgdG8gY2FwcyB0aGF0IGluY2x1ZGUgdGhlIHN0cmVhbWhlYWRlciBmaWVsZCAqLworICB3aGlsZSAoZmxhY3BhcnNlLT5oZWFkZXJzKSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBHU1RfQlVGRkVSIChmbGFjcGFyc2UtPmhlYWRlcnMtPmRhdGEpOworICAgIEdzdEJhc2VQYXJzZUZyYW1lIGZyYW1lOworCisgICAgZmxhY3BhcnNlLT5oZWFkZXJzID0KKyAgICAgICAgZ19saXN0X2RlbGV0ZV9saW5rIChmbGFjcGFyc2UtPmhlYWRlcnMsIGZsYWNwYXJzZS0+aGVhZGVycyk7CisgICAgYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChidWYpOworCisgICAgLyogaW5pdCwgc2V0IGFuZCBnaXZlIGF3YXkgZnJhbWUgKi8KKyAgICBnc3RfYmFzZV9wYXJzZV9mcmFtZV9pbml0ICgmZnJhbWUpOworICAgIGZyYW1lLmJ1ZmZlciA9IGJ1ZjsKKyAgICBmcmFtZS5vdmVyaGVhZCA9IC0xOworICAgIHJlcyA9IGdzdF9iYXNlX3BhcnNlX3B1c2hfZnJhbWUgKEdTVF9CQVNFX1BBUlNFIChmbGFjcGFyc2UpLCAmZnJhbWUpOworICAgIGdzdF9iYXNlX3BhcnNlX2ZyYW1lX2ZyZWUgKCZmcmFtZSk7CisgICAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworICB9CisgIGdfbGlzdF9mb3JlYWNoIChmbGFjcGFyc2UtPmhlYWRlcnMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGZsYWNwYXJzZS0+aGVhZGVycyk7CisgIGZsYWNwYXJzZS0+aGVhZGVycyA9IE5VTEw7CisKKyAgcmV0dXJuIHJlczsKK30KKworLyogZW1wdHkgdm9yYmlzY29tbWVudCAqLworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfZmxhY19wYXJzZV9nZW5lcmF0ZV92b3JiaXNjb21tZW50IChHc3RGbGFjUGFyc2UgKiBmbGFjcGFyc2UpCit7CisgIEdzdFRhZ0xpc3QgKnRhZ2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBndWNoYXIgaGVhZGVyWzRdOworICBndWludCBzaXplOworICBHc3RCdWZmZXIgKnZvcmJpc2NvbW1lbnQ7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGhlYWRlclswXSA9IDB4ODQ7ICAgICAgICAgICAgIC8qIGlzX2xhc3QgPSAxOyB0eXBlID0gNDsgKi8KKworICB2b3JiaXNjb21tZW50ID0KKyAgICAgIGdzdF90YWdfbGlzdF90b192b3JiaXNjb21tZW50X2J1ZmZlciAodGFnbGlzdCwgaGVhZGVyLAorICAgICAgc2l6ZW9mIChoZWFkZXIpLCBOVUxMKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdsaXN0KTsKKworICBnc3RfYnVmZmVyX21hcCAodm9yYmlzY29tbWVudCwgJm1hcCwgR1NUX01BUF9XUklURSk7CisKKyAgLyogR2V0IHJpZCBvZiBmcmFtaW5nIGJpdCAqLworICBpZiAobWFwLmRhdGFbbWFwLnNpemUgLSAxXSA9PSAxKSB7CisgICAgR3N0QnVmZmVyICpzdWI7CisKKyAgICBzdWIgPQorICAgICAgICBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uICh2b3JiaXNjb21tZW50LCBHU1RfQlVGRkVSX0NPUFlfQUxMLCAwLAorICAgICAgICBtYXAuc2l6ZSAtIDEpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKHZvcmJpc2NvbW1lbnQsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKHZvcmJpc2NvbW1lbnQpOworICAgIHZvcmJpc2NvbW1lbnQgPSBzdWI7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKHZvcmJpc2NvbW1lbnQsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICB9CisKKyAgc2l6ZSA9IG1hcC5zaXplIC0gNDsKKyAgbWFwLmRhdGFbMV0gPSAoKHNpemUgJiAweEZGMDAwMCkgPj4gMTYpOworICBtYXAuZGF0YVsyXSA9ICgoc2l6ZSAmIDB4MDBGRjAwKSA+PiA4KTsKKyAgbWFwLmRhdGFbM10gPSAoc2l6ZSAmIDB4MDAwMEZGKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAodm9yYmlzY29tbWVudCwgJm1hcCk7CisgIGdzdF9mbGFjX3BhcnNlX3Jlc2V0X2J1ZmZlcl90aW1lX2FuZF9vZmZzZXQgKHZvcmJpc2NvbW1lbnQpOworCisgIHJldHVybiB2b3JiaXNjb21tZW50OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbGFjX3BhcnNlX2dlbmVyYXRlX2hlYWRlcnMgKEdzdEZsYWNQYXJzZSAqIGZsYWNwYXJzZSkKK3sKKyAgR3N0QnVmZmVyICptYXJrZXIsICpzdHJlYW1pbmZvOworICBHc3RNYXBJbmZvIG1hcDsKKworICBtYXJrZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDQpOworICBnc3RfYnVmZmVyX21hcCAobWFya2VyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgbWVtY3B5IChtYXAuZGF0YSwgImZMYUMiLCA0KTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAobWFya2VyLCAmbWFwKTsKKyAgZ3N0X2ZsYWNfcGFyc2VfcmVzZXRfYnVmZmVyX3RpbWVfYW5kX29mZnNldCAobWFya2VyKTsKKyAgZmxhY3BhcnNlLT5oZWFkZXJzID0gZ19saXN0X2FwcGVuZCAoZmxhY3BhcnNlLT5oZWFkZXJzLCBtYXJrZXIpOworCisgIHN0cmVhbWluZm8gPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDQgKyAzNCk7CisgIGdzdF9idWZmZXJfbWFwIChzdHJlYW1pbmZvLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgbWVtc2V0IChtYXAuZGF0YSwgMCwgNCArIDM0KTsKKworICAvKiBtZXRhZGF0YSBibG9jayBoZWFkZXIgKi8KKyAgbWFwLmRhdGFbMF0gPSAweDAwOyAgICAgICAgICAgLyogaXNfbGFzdCA9IDA7IHR5cGUgPSAwOyAqLworICBtYXAuZGF0YVsxXSA9IDB4MDA7ICAgICAgICAgICAvKiBsZW5ndGggPSAzNDsgKi8KKyAgbWFwLmRhdGFbMl0gPSAweDAwOworICBtYXAuZGF0YVszXSA9IDB4MjI7CisKKyAgLyogc3RyZWFtaW5mbyAqLworCisgIG1hcC5kYXRhWzRdID0gKGZsYWNwYXJzZS0+YmxvY2tfc2l6ZSA+PiA4KSAmIDB4ZmY7ICAgIC8qIG1pbiBibG9ja3NpemUgPSBibG9ja3NpemU7ICovCisgIG1hcC5kYXRhWzVdID0gKGZsYWNwYXJzZS0+YmxvY2tfc2l6ZSkgJiAweGZmOworICBtYXAuZGF0YVs2XSA9IChmbGFjcGFyc2UtPmJsb2NrX3NpemUgPj4gOCkgJiAweGZmOyAgICAvKiBtYXggYmxvY2tzaXplID0gYmxvY2tzaXplOyAqLworICBtYXAuZGF0YVs3XSA9IChmbGFjcGFyc2UtPmJsb2NrX3NpemUpICYgMHhmZjsKKworICBtYXAuZGF0YVs4XSA9IDB4MDA7ICAgICAgICAgICAvKiBtaW4gZnJhbWVzaXplID0gMDsgKi8KKyAgbWFwLmRhdGFbOV0gPSAweDAwOworICBtYXAuZGF0YVsxMF0gPSAweDAwOworICBtYXAuZGF0YVsxMV0gPSAweDAwOyAgICAgICAgICAvKiBtYXggZnJhbWVzaXplID0gMDsgKi8KKyAgbWFwLmRhdGFbMTJdID0gMHgwMDsKKyAgbWFwLmRhdGFbMTNdID0gMHgwMDsKKworICBtYXAuZGF0YVsxNF0gPSAoZmxhY3BhcnNlLT5zYW1wbGVyYXRlID4+IDEyKSAmIDB4ZmY7CisgIG1hcC5kYXRhWzE1XSA9IChmbGFjcGFyc2UtPnNhbXBsZXJhdGUgPj4gNCkgJiAweGZmOworICBtYXAuZGF0YVsxNl0gPSAoZmxhY3BhcnNlLT5zYW1wbGVyYXRlID4+IDApICYgMHhmMDsKKworICBtYXAuZGF0YVsxNl0gfD0gKGZsYWNwYXJzZS0+Y2hhbm5lbHMgLSAxKSA8PCAxOworCisgIG1hcC5kYXRhWzE2XSB8PSAoKGZsYWNwYXJzZS0+YnBzIC0gMSkgPj4gNCkgJiAweDAxOworICBtYXAuZGF0YVsxN10gPSAoKChmbGFjcGFyc2UtPmJwcyAtIDEpKSAmIDB4MGYpIDw8IDQ7CisKKyAgeworICAgIGdpbnQ2NCBkdXJhdGlvbjsKKworICAgIGlmIChnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChmbGFjcGFyc2UpLAorICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCAmZHVyYXRpb24pICYmIGR1cmF0aW9uICE9IC0xKSB7CisgICAgICBkdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX1RPX0ZSQU1FUyAoZHVyYXRpb24sIGZsYWNwYXJzZS0+c2FtcGxlcmF0ZSk7CisKKyAgICAgIG1hcC5kYXRhWzE3XSB8PSAoZHVyYXRpb24gPj4gMzIpICYgMHhmZjsKKyAgICAgIG1hcC5kYXRhWzE4XSB8PSAoZHVyYXRpb24gPj4gMjQpICYgMHhmZjsKKyAgICAgIG1hcC5kYXRhWzE5XSB8PSAoZHVyYXRpb24gPj4gMTYpICYgMHhmZjsKKyAgICAgIG1hcC5kYXRhWzIwXSB8PSAoZHVyYXRpb24gPj4gOCkgJiAweGZmOworICAgICAgbWFwLmRhdGFbMjFdIHw9IChkdXJhdGlvbiA+PiAwKSAmIDB4ZmY7CisgICAgfQorICB9CisgIC8qIE1ENSA9IDA7ICovCisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoc3RyZWFtaW5mbywgJm1hcCk7CisgIGdzdF9mbGFjX3BhcnNlX3Jlc2V0X2J1ZmZlcl90aW1lX2FuZF9vZmZzZXQgKHN0cmVhbWluZm8pOworICBmbGFjcGFyc2UtPmhlYWRlcnMgPSBnX2xpc3RfYXBwZW5kIChmbGFjcGFyc2UtPmhlYWRlcnMsIHN0cmVhbWluZm8pOworCisgIGZsYWNwYXJzZS0+aGVhZGVycyA9IGdfbGlzdF9hcHBlbmQgKGZsYWNwYXJzZS0+aGVhZGVycywKKyAgICAgIGdzdF9mbGFjX3BhcnNlX2dlbmVyYXRlX3ZvcmJpc2NvbW1lbnQgKGZsYWNwYXJzZSkpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2dzdF9mbGFjX3BhcnNlX3Jlc2V0X2J1ZmZlcl90aW1lX2FuZF9vZmZzZXQgKEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcikgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZmZlcikgPSAwOworICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZmZlcikgPSAwOworfQorCisvKiBUeXBlIDEyNyBpcyBpbnZhbGlkIGZvciBhIG1ldGFkYXRhIGJsb2NrIGhlYWRlciAmIHNob3VsZAorICogYmUgZGlzY2FyZGVkIF9iZWZvcmVfIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAqLworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19wYXJzZV9oYW5kbGVfYmxvY2tfdHlwZSAoR3N0RmxhY1BhcnNlICogZmxhY3BhcnNlLCBndWludCB0eXBlLAorICAgIEdzdEJ1ZmZlciAqIHNidWZmZXIpCit7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgLyogU1RSRUFNSU5GTyAqLworICAgICAgR1NUX0lORk9fT0JKRUNUIChmbGFjcGFyc2UsICJTVFJFQU1JTkZPIGhlYWRlciIpOworICAgICAgcmV0ID0gZ3N0X2ZsYWNfcGFyc2VfaGFuZGxlX3N0cmVhbWluZm8gKGZsYWNwYXJzZSwgc2J1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAvKiBTRUVLVEFCTEUgKi8KKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoZmxhY3BhcnNlLCAiU0VFS1RBQkxFIGhlYWRlciIpOworICAgICAgcmV0ID0gZ3N0X2ZsYWNfcGFyc2VfaGFuZGxlX3NlZWt0YWJsZSAoZmxhY3BhcnNlLCBzYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgIC8qIFZPUkJJU19DT01NRU5UICovCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGZsYWNwYXJzZSwgIlZPUkJJU0NPTU1FTlQgaGVhZGVyIik7CisgICAgICByZXQgPSBnc3RfZmxhY19wYXJzZV9oYW5kbGVfdm9yYmlzY29tbWVudCAoZmxhY3BhcnNlLCBzYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTogICAgICAgICAgICAgICAgICAgIC8qIENVRVNIRUVUICovCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGZsYWNwYXJzZSwgIkNVRVNIRUVUIGhlYWRlciIpOworICAgICAgcmV0ID0gZ3N0X2ZsYWNfcGFyc2VfaGFuZGxlX2N1ZXNoZWV0IChmbGFjcGFyc2UsIHNidWZmZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OiAgICAgICAgICAgICAgICAgICAgLyogUElDVFVSRSAqLworICAgICAgR1NUX0lORk9fT0JKRUNUIChmbGFjcGFyc2UsICJQSUNUVVJFIGhlYWRlciIpOworICAgICAgcmV0ID0gZ3N0X2ZsYWNfcGFyc2VfaGFuZGxlX3BpY3R1cmUgKGZsYWNwYXJzZSwgc2J1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAvKiBQQURESU5HICovCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGZsYWNwYXJzZSwgIlBBRERJTkcgaGVhZGVyIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAvKiBBUFBMSUNBVElPTiAqLworICAgICAgR1NUX0lORk9fT0JKRUNUIChmbGFjcGFyc2UsICJBUFBMSUNBVElPTiBoZWFkZXIiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgIC8qIFJFU0VSVkVEICovCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGZsYWNwYXJzZSwgIlVuaGFuZGxlZCBtZXRhZGF0YSBoZWFkZXIgdHlwZSAnJXUnIiwgdHlwZSk7CisgICAgICBHU1RfRklYTUVfT0JKRUNUIChmbGFjcGFyc2UsICJGTEFDIHZlcnNpb24gbWlnaHQgbm90IGJlIGZ1bGx5IHN1cHBvcnRlZCIpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2ZsYWNfcGFyc2VfcGFyc2VfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLCBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lLAorICAgIGdpbnQgc2l6ZSkKK3sKKyAgR3N0RmxhY1BhcnNlICpmbGFjcGFyc2UgPSBHU1RfRkxBQ19QQVJTRSAocGFyc2UpOworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IGZyYW1lLT5idWZmZXIsICpzYnVmZmVyOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR3N0Rmxvd1JldHVybiByZXMgPSBHU1RfRkxPV19FUlJPUjsKKyAgZ3VpbnQ2NCByZWxhdGl2ZV9zYW1wbGVfbnVtYmVyOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgaWYgKGZsYWNwYXJzZS0+c3RhdGUgPT0gR1NUX0ZMQUNfUEFSU0VfU1RBVEVfSU5JVCkgeworICAgIHNidWZmZXIgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIDAsIHNpemUpOworICAgIGdzdF9mbGFjX3BhcnNlX3Jlc2V0X2J1ZmZlcl90aW1lX2FuZF9vZmZzZXQgKHNidWZmZXIpOworCisgICAgLyogMzIgYml0cyBtZXRhZGF0YSBibG9jayAqLworICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGZsYWNwYXJzZSksIDQpOworICAgIGZsYWNwYXJzZS0+c3RhdGUgPSBHU1RfRkxBQ19QQVJTRV9TVEFURV9IRUFERVJTOworCisgICAgZmxhY3BhcnNlLT5oZWFkZXJzID0gZ19saXN0X2FwcGVuZCAoZmxhY3BhcnNlLT5oZWFkZXJzLCBzYnVmZmVyKTsKKworICAgIHJlcyA9IEdTVF9CQVNFX1BBUlNFX0ZMT1dfRFJPUFBFRDsKKyAgfSBlbHNlIGlmIChmbGFjcGFyc2UtPnN0YXRlID09IEdTVF9GTEFDX1BBUlNFX1NUQVRFX0hFQURFUlMpIHsKKyAgICBnYm9vbGVhbiBpc19sYXN0ID0gbWFwLmRhdGFbMF0gPj4gNzsKKyAgICBndWludCB0eXBlID0gKG1hcC5kYXRhWzBdICYgMHg3Rik7CisKKyAgICBpZiAodHlwZSA9PSAxMjcpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZmxhY3BhcnNlLCAiSW52YWxpZCBtZXRhZGF0YSBibG9jayB0eXBlIDEyNyIpOworICAgICAgcmVzID0gR1NUX0JBU0VfUEFSU0VfRkxPV19EUk9QUEVEOworICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZsYWNwYXJzZSwgIkhhbmRsaW5nIG1ldGFkYXRhIGJsb2NrIG9mIHR5cGUgJXUiLCB0eXBlKTsKKworICAgIHNidWZmZXIgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIDAsIHNpemUpOworCisgICAgaWYgKGdzdF9mbGFjX3BhcnNlX2hhbmRsZV9ibG9ja190eXBlIChmbGFjcGFyc2UsIHR5cGUsIHNidWZmZXIpKSB7CisgICAgICBnc3RfZmxhY19wYXJzZV9yZXNldF9idWZmZXJfdGltZV9hbmRfb2Zmc2V0IChzYnVmZmVyKTsKKyAgICAgIGZsYWNwYXJzZS0+aGVhZGVycyA9IGdfbGlzdF9hcHBlbmQgKGZsYWNwYXJzZS0+aGVhZGVycywgc2J1ZmZlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsICJmYWlsZWQgdG8gcGFyc2UgaGVhZGVyIG9mIHR5cGUgJXUiLCB0eXBlKTsKKyAgICAgIEdTVF9NRU1EVU1QX09CSkVDVCAocGFyc2UsICJiYWQgaGVhZGVyIGRhdGEiLCBtYXAuZGF0YSwgc2l6ZSk7CisKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHNidWZmZXIpOworCisgICAgICAvKiBlcnJvciBvdXQgdW5sZXNzIHdlIGhhdmUgYSBTVFJFQU1JTkZPIGhlYWRlciAqLworICAgICAgaWYgKGZsYWNwYXJzZS0+c2FtcGxlcmF0ZSA9PSAwIHx8IGZsYWNwYXJzZS0+YnBzID09IDApCisgICAgICAgIGdvdG8gaGVhZGVyX3BhcnNpbmdfZXJyb3I7CisKKyAgICAgIC8qIC4uIGluIHdoaWNoIGNhc2UganVzdCBzdG9wIGhlYWRlciBwYXJzaW5nIGFuZCB0cnkgdG8gZmluZCBhdWRpbyAqLworICAgICAgaXNfbGFzdCA9IFRSVUU7CisgICAgfQorCisgICAgaWYgKGlzX2xhc3QpIHsKKyAgICAgIHJlcyA9IGdzdF9mbGFjX3BhcnNlX2hhbmRsZV9oZWFkZXJzIChmbGFjcGFyc2UpOworCisgICAgICAvKiBNaW5pbWFsIHNpemUgb2YgYSBmcmFtZSBoZWFkZXIgKi8KKyAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKGZsYWNwYXJzZSksIE1BWCAoOSwKKyAgICAgICAgICAgICAgZmxhY3BhcnNlLT5taW5fZnJhbWVzaXplKSk7CisgICAgICBmbGFjcGFyc2UtPnN0YXRlID0gR1NUX0ZMQUNfUEFSU0VfU1RBVEVfREFUQTsKKworICAgICAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0gZWxzZSB7CisgICAgICAvKiBIZWFkZXIgbGVuZ3RoICovCisgICAgICBnc3RfYmFzZV9wYXJzZV9zZXRfbWluX2ZyYW1lX3NpemUgKEdTVF9CQVNFX1BBUlNFIChmbGFjcGFyc2UpLCA0KTsKKyAgICB9CisKKyAgICAvKiBEUk9QUEVEIGJlY2F1c2Ugd2UgcHVzaGVkIGFscmVhZHkgb3Igd2lsbCBwdXNoIGFsbCBoZWFkZXJzIG1hbnVhbGx5ICovCisgICAgcmVzID0gR1NUX0JBU0VfUEFSU0VfRkxPV19EUk9QUEVEOworICB9IGVsc2UgeworICAgIGlmIChmbGFjcGFyc2UtPm9mZnNldCAhPSBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSkgeworICAgICAgRnJhbWVIZWFkZXJDaGVja1JldHVybiByZXQ7CisKKyAgICAgIGZsYWNwYXJzZS0+b2Zmc2V0ID0gR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZmZlcik7CisgICAgICByZXQgPQorICAgICAgICAgIGdzdF9mbGFjX3BhcnNlX2ZyYW1lX2hlYWRlcl9pc192YWxpZCAoZmxhY3BhcnNlLAorICAgICAgICAgIG1hcC5kYXRhLCBtYXAuc2l6ZSwgVFJVRSwgTlVMTCwgTlVMTCk7CisgICAgICBpZiAocmV0ICE9IEZSQU1FX0hFQURFUl9WQUxJRCkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChmbGFjcGFyc2UsCisgICAgICAgICAgICAiQmFzZWNsYXNzIGRpZG4ndCBwcm92aWRlIGEgY29tcGxldGUgZnJhbWUiKTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgfQorICAgIH0KKworICAgIGlmIChmbGFjcGFyc2UtPmJsb2NrX3NpemUgPT0gMCkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAoZmxhY3BhcnNlLCAiVW5wYXJzZWQgZnJhbWUiKTsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICBpZiAoZmxhY3BhcnNlLT5zZWVrdGFibGUpCisgICAgICBnc3RfZmxhY19wYXJzZV9wcm9jZXNzX3NlZWt0YWJsZSAoZmxhY3BhcnNlLCBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSk7CisKKyAgICBpZiAoZmxhY3BhcnNlLT5zdGF0ZSA9PSBHU1RfRkxBQ19QQVJTRV9TVEFURV9HRU5FUkFURV9IRUFERVJTKSB7CisgICAgICBpZiAoZmxhY3BhcnNlLT5ibG9ja2luZ19zdHJhdGVneSA9PSAxKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZmxhY3BhcnNlLAorICAgICAgICAgICAgIkdlbmVyYXRpbmcgaGVhZGVycyBmb3IgdmFyaWFibGUgYmxvY2tzaXplIHN0cmVhbXMgbm90IHN1cHBvcnRlZCIpOworCisgICAgICAgIHJlcyA9IGdzdF9mbGFjX3BhcnNlX2hhbmRsZV9oZWFkZXJzIChmbGFjcGFyc2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZmxhY3BhcnNlLCAiR2VuZXJhdGluZyBoZWFkZXJzIik7CisKKyAgICAgICAgaWYgKCFnc3RfZmxhY19wYXJzZV9nZW5lcmF0ZV9oZWFkZXJzIChmbGFjcGFyc2UpKQorICAgICAgICAgIGdvdG8gY2xlYW51cDsKKworICAgICAgICByZXMgPSBnc3RfZmxhY19wYXJzZV9oYW5kbGVfaGVhZGVycyAoZmxhY3BhcnNlKTsKKyAgICAgIH0KKyAgICAgIGZsYWNwYXJzZS0+c3RhdGUgPSBHU1RfRkxBQ19QQVJTRV9TVEFURV9EQVRBOworICAgICAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKworICAgIC8qIGFsc28gY2F0ZXIgZm9yIG9nZ211eCBtZXRhZGF0YSAqLworICAgIHJlbGF0aXZlX3NhbXBsZV9udW1iZXIgPQorICAgICAgICBmbGFjcGFyc2UtPnNhbXBsZV9udW1iZXIgLSBmbGFjcGFyc2UtPmZpcnN0X3NhbXBsZV9udW1iZXI7CisgICAgaWYgKGZsYWNwYXJzZS0+YmxvY2tpbmdfc3RyYXRlZ3kgPT0gMCkgeworICAgICAgR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcikgPQorICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAocmVsYXRpdmVfc2FtcGxlX251bWJlciwKKyAgICAgICAgICBmbGFjcGFyc2UtPmJsb2NrX3NpemUgKiBHU1RfU0VDT05ELCBmbGFjcGFyc2UtPnNhbXBsZXJhdGUpOworICAgICAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWZmZXIpID0KKyAgICAgICAgICByZWxhdGl2ZV9zYW1wbGVfbnVtYmVyICogZmxhY3BhcnNlLT5ibG9ja19zaXplICsKKyAgICAgICAgICBmbGFjcGFyc2UtPmJsb2NrX3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9CVUZGRVJfUFRTIChidWZmZXIpID0KKyAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHJlbGF0aXZlX3NhbXBsZV9udW1iZXIsIEdTVF9TRUNPTkQsCisgICAgICAgICAgZmxhY3BhcnNlLT5zYW1wbGVyYXRlKTsKKyAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmZmVyKSA9CisgICAgICAgICAgcmVsYXRpdmVfc2FtcGxlX251bWJlciArIGZsYWNwYXJzZS0+YmxvY2tfc2l6ZTsKKyAgICB9CisKKyAgICBHU1RfQlVGRkVSX0RUUyAoYnVmZmVyKSA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZmZlciksIEdTVF9TRUNPTkQsCisgICAgICAgIGZsYWNwYXJzZS0+c2FtcGxlcmF0ZSk7CisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSA9CisgICAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpIC0gR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcik7CisKKyAgICAvKiBUbyBzaW1wbGlmeSwgd2UganVzdCBhc3N1bWUgdGhhdCBpdCdzIGEgZml4ZWQgc2l6ZSBoZWFkZXIgYW5kIGlnbm9yZQorICAgICAqIHN1YmZyYW1lIGhlYWRlcnMuIFRoZSBmaXJzdCBjb3VsZCBsZWFkIHVzIHRvIGJlIG9mZiBieSA4OCBiaXRzIGFuZAorICAgICAqIHRoZSBzZWNvbmQgZXZlbiBsZXNzLCBzbyB0aGUgdG90YWwgaW5hY2N1cmFjeSBpcyBuZWdsaWdpYmxlLiAqLworICAgIGZyYW1lLT5vdmVyaGVhZCA9IDc7CisKKyAgICAvKiBNaW5pbWFsIHNpemUgb2YgYSBmcmFtZSBoZWFkZXIgKi8KKyAgICBnc3RfYmFzZV9wYXJzZV9zZXRfbWluX2ZyYW1lX3NpemUgKEdTVF9CQVNFX1BBUlNFIChmbGFjcGFyc2UpLCBNQVggKDksCisgICAgICAgICAgICBmbGFjcGFyc2UtPm1pbl9mcmFtZXNpemUpKTsKKworICAgIGZsYWNwYXJzZS0+b2Zmc2V0ID0gLTE7CisgICAgZmxhY3BhcnNlLT5ibG9ja2luZ19zdHJhdGVneSA9IDA7CisgICAgZmxhY3BhcnNlLT5zYW1wbGVfbnVtYmVyID0gMDsKKyAgICByZXMgPSBHU1RfRkxPV19PSzsKKyAgfQorCitjbGVhbnVwOgorICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICByZXR1cm4gcmVzOworCitoZWFkZXJfcGFyc2luZ19lcnJvcjoKKyAgR1NUX0VMRU1FTlRfRVJST1IgKGZsYWNwYXJzZSwgU1RSRUFNLCBERUNPREUsIChOVUxMKSwKKyAgICAgICgiRmFpbGVkIHRvIHBhcnNlIGhlYWRlcnMiKSk7CisgIGdvdG8gY2xlYW51cDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbGFjX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0RmxhY1BhcnNlICpmbGFjcGFyc2UgPSBHU1RfRkxBQ19QQVJTRSAocGFyc2UpOworCisgIGlmICghZmxhY3BhcnNlLT5zZW50X2NvZGVjX3RhZykgeworICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICBpZiAoZmxhY3BhcnNlLT50YWdzID09IE5VTEwpCisgICAgICBmbGFjcGFyc2UtPnRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgICAgLyogY29kZWMgdGFnICovCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpKTsKKyAgICBpZiAoR19VTkxJS0VMWSAoY2FwcyA9PSBOVUxMKSkgeworICAgICAgaWYgKEdTVF9QQURfSVNfRkxVU0hJTkcgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSkpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgZmx1c2hpbmciKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICAgICAgfQorICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgbm90IG5lZ290aWF0ZWQhIik7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgICAgfQorICAgIGdzdF9wYl91dGlsc19hZGRfY29kZWNfZGVzY3JpcHRpb25fdG9fdGFnX2xpc3QgKGZsYWNwYXJzZS0+dGFncywKKyAgICAgICAgR1NUX1RBR19BVURJT19DT0RFQywgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgLyogQW5ub3VuY2Ugb3VyIHBlbmRpbmcgdGFncyAqLworICAgIGdzdF9iYXNlX3BhcnNlX21lcmdlX3RhZ3MgKHBhcnNlLCBmbGFjcGFyc2UtPnRhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSk7CisKKyAgICAvKiBhbHNvIHNpZ25hbHMgdGhlIGVuZCBvZiBmaXJzdC1mcmFtZSBwcm9jZXNzaW5nICovCisgICAgZmxhY3BhcnNlLT5zZW50X2NvZGVjX3RhZyA9IFRSVUU7CisgIH0KKworICAvKiBQdXNoIHRvYyAqLworICBpZiAoZmxhY3BhcnNlLT50b2MpIHsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKGZsYWNwYXJzZSksCisgICAgICAgIGdzdF9ldmVudF9uZXdfdG9jIChmbGFjcGFyc2UtPnRvYywgRkFMU0UpKTsKKyAgfQorCisgIGZyYW1lLT5mbGFncyB8PSBHU1RfQkFTRV9QQVJTRV9GUkFNRV9GTEFHX0NMSVA7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbGFjX3BhcnNlX2NvbnZlcnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEZvcm1hdCBzcmNfZm9ybWF0LCBnaW50NjQgc3JjX3ZhbHVlLCBHc3RGb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgZ2ludDY0ICogZGVzdF92YWx1ZSkKK3sKKyAgR3N0RmxhY1BhcnNlICpmbGFjcGFyc2UgPSBHU1RfRkxBQ19QQVJTRSAocGFyc2UpOworCisgIGlmIChmbGFjcGFyc2UtPnNhbXBsZXJhdGUgPiAwKSB7CisgICAgaWYgKHNyY19mb3JtYXQgPT0gR1NUX0ZPUk1BVF9ERUZBVUxUICYmIGRlc3RfZm9ybWF0ID09IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgaWYgKHNyY192YWx1ZSAhPSAtMSkKKyAgICAgICAgKmRlc3RfdmFsdWUgPQorICAgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzcmNfdmFsdWUsIEdTVF9TRUNPTkQsCisgICAgICAgICAgICBmbGFjcGFyc2UtPnNhbXBsZXJhdGUpOworICAgICAgZWxzZQorICAgICAgICAqZGVzdF92YWx1ZSA9IC0xOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfSBlbHNlIGlmIChzcmNfZm9ybWF0ID09IEdTVF9GT1JNQVRfVElNRSAmJgorICAgICAgICBkZXN0X2Zvcm1hdCA9PSBHU1RfRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgIGlmIChzcmNfdmFsdWUgIT0gLTEpCisgICAgICAgICpkZXN0X3ZhbHVlID0KKyAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoc3JjX3ZhbHVlLCBmbGFjcGFyc2UtPnNhbXBsZXJhdGUsCisgICAgICAgICAgICBHU1RfU0VDT05EKTsKKyAgICAgIGVsc2UKKyAgICAgICAgKmRlc3RfdmFsdWUgPSAtMTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorCisgIHJldHVybiBHU1RfQkFTRV9QQVJTRV9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y29udmVydCAocGFyc2UsIHNyY19mb3JtYXQsCisgICAgICBzcmNfdmFsdWUsIGRlc3RfZm9ybWF0LCBkZXN0X3ZhbHVlKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmxhY19wYXJzZV9zcmNfZXZlbnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RGbGFjUGFyc2UgKmZsYWNwYXJzZSA9IEdTVF9GTEFDX1BBUlNFIChwYXJzZSk7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1RPQ19TRUxFQ1Q6CisgICAgeworICAgICAgR3N0VG9jRW50cnkgKmVudHJ5ID0gTlVMTDsKKyAgICAgIEdzdEV2ZW50ICpzZWVrX2V2ZW50OworICAgICAgR3N0VG9jICp0b2MgPSBOVUxMOworICAgICAgZ2ludDY0IHN0YXJ0X3BvczsKKyAgICAgIGdjaGFyICp1aWQgPSBOVUxMOworCisgICAgICAvKiBGSVhNRTogc29tZSBsb2NraW5nIHdvdWxkIGJlIGdvb2QgKi8KKyAgICAgIGlmIChmbGFjcGFyc2UtPnRvYykKKyAgICAgICAgdG9jID0gZ3N0X3RvY19yZWYgKGZsYWNwYXJzZS0+dG9jKTsKKworICAgICAgaWYgKHRvYyAhPSBOVUxMKSB7CisgICAgICAgIGdzdF9ldmVudF9wYXJzZV90b2Nfc2VsZWN0IChldmVudCwgJnVpZCk7CisgICAgICAgIGlmICh1aWQgIT0gTlVMTCkgeworICAgICAgICAgIGVudHJ5ID0gZ3N0X3RvY19maW5kX2VudHJ5ICh0b2MsIHVpZCk7CisgICAgICAgICAgaWYgKGVudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGdzdF90b2NfZW50cnlfZ2V0X3N0YXJ0X3N0b3BfdGltZXMgKGVudHJ5LCAmc3RhcnRfcG9zLCBOVUxMKTsKKworICAgICAgICAgICAgLyogRklYTUU6IHVzZSBzZWdtZW50IHJhdGUgaGVyZSBpbnN0ZWFkPyAqLworICAgICAgICAgICAgc2Vla19ldmVudCA9IGdzdF9ldmVudF9uZXdfc2VlayAoMS4wLAorICAgICAgICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgICAgICAgICBHU1RfU0VFS19GTEFHX0ZMVVNILAorICAgICAgICAgICAgICAgIEdTVF9TRUVLX1RZUEVfU0VULCBzdGFydF9wb3MsIEdTVF9TRUVLX1RZUEVfTk9ORSwgLTEpOworCisgICAgICAgICAgICByZXMgPQorICAgICAgICAgICAgICAgIEdTVF9CQVNFX1BBUlNFX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zcmNfZXZlbnQgKHBhcnNlLAorICAgICAgICAgICAgICAgIHNlZWtfZXZlbnQpOworCisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsICJubyBUT0MgZW50cnkgd2l0aCBnaXZlbiBVSUQ6ICVzIiwgdWlkKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ19mcmVlICh1aWQpOworICAgICAgICB9CisgICAgICAgIGdzdF90b2NfdW5yZWYgKHRvYyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChmbGFjcGFyc2UsICJubyBUT0MgdG8gc2VsZWN0Iik7CisgICAgICB9CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gR1NUX0JBU0VfUEFSU0VfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNyY19ldmVudCAocGFyc2UsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfZmllbGRzIChHc3RDYXBzICogY2FwcykKK3sKKyAgZ3VpbnQgaSwgbjsKKworICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSk7CisKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAocywgImZyYW1lZCIpOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9mbGFjX3BhcnNlX2dldF9zaW5rX2NhcHMgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICpwZWVyY2FwcywgKnRlbXBsOworICBHc3RDYXBzICpyZXM7CisKKyAgdGVtcGwgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU0lOS19QQUQgKHBhcnNlKSk7CisgIGlmIChmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICpmY29weSA9IGdzdF9jYXBzX2NvcHkgKGZpbHRlcik7CisgICAgLyogUmVtb3ZlIHRoZSBmaWVsZHMgd2UgY29udmVydCAqLworICAgIHJlbW92ZV9maWVsZHMgKGZjb3B5KTsKKyAgICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChwYXJzZSksIGZjb3B5KTsKKyAgICBnc3RfY2Fwc191bnJlZiAoZmNvcHkpOworICB9IGVsc2UKKyAgICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChwYXJzZSksIE5VTEwpOworCisgIGlmIChwZWVyY2FwcykgeworICAgIC8qIFJlbW92ZSB0aGUgZnJhbWVkIGZpZWxkICovCisgICAgcGVlcmNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChwZWVyY2Fwcyk7CisgICAgcmVtb3ZlX2ZpZWxkcyAocGVlcmNhcHMpOworCisgICAgcmVzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKHBlZXJjYXBzLCB0ZW1wbCwgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmICh0ZW1wbCk7CisgIH0gZWxzZSB7CisgICAgcmVzID0gdGVtcGw7CisgIH0KKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgaW50ZXJzZWN0aW9uID0KKyAgICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgcmVzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChyZXMpOworICAgIHJlcyA9IGludGVyc2VjdGlvbjsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9wYXJzZXJzL2dzdGZsYWNwYXJzZS5oIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTQxOGRmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RmbGFjcGFyc2UuaApAQCAtMCwwICsxLDk5IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+LgorICogQ29weXJpZ2h0IChDKSAyMDA5IE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBDb250YWN0OiBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfRkxBQ19QQVJTRV9IX18KKyNkZWZpbmUgX19HU1RfRkxBQ19QQVJTRV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlcGFyc2UuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0ZMQUNfUEFSU0UJCSAgIChnc3RfZmxhY19wYXJzZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfRkxBQ19QQVJTRShvYmopCQkgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfRkxBQ19QQVJTRSxHc3RGbGFjUGFyc2UpKQorI2RlZmluZSBHU1RfRkxBQ19QQVJTRV9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfRkxBQ19QQVJTRSxHc3RGbGFjUGFyc2VDbGFzcykpCisjZGVmaW5lIEdTVF9GTEFDX1BBUlNFX0dFVF9DTEFTUyhvYmopICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUygob2JqKSxHU1RfVFlQRV9GTEFDX1BBUlNFLEdzdEZsYWNQYXJzZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0ZMQUNfUEFSU0Uob2JqKQkgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfRkxBQ19QQVJTRSkpCisjZGVmaW5lIEdTVF9JU19GTEFDX1BBUlNFX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9GTEFDX1BBUlNFKSkKKyNkZWZpbmUgR1NUX0ZMQUNfUEFSU0VfQ0FTVChvYmopCSgoR3N0RmxhY1BhcnNlICopKG9iaikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RGbGFjUGFyc2UgR3N0RmxhY1BhcnNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEZsYWNQYXJzZUNsYXNzIEdzdEZsYWNQYXJzZUNsYXNzOworCit0eXBlZGVmIGVudW0geworICBHU1RfRkxBQ19QQVJTRV9TVEFURV9JTklULAorICBHU1RfRkxBQ19QQVJTRV9TVEFURV9IRUFERVJTLAorICBHU1RfRkxBQ19QQVJTRV9TVEFURV9HRU5FUkFURV9IRUFERVJTLAorICBHU1RfRkxBQ19QQVJTRV9TVEFURV9EQVRBCit9IEdzdEZsYWNQYXJzZVN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGd1aW50OCB0eXBlOworfSBHc3RGbGFjUGFyc2VTdWJGcmFtZTsKKworc3RydWN0IF9Hc3RGbGFjUGFyc2UgeworICBHc3RCYXNlUGFyc2UgcGFyZW50OworCisgIC8qIFByb3BlcnRpZXMgKi8KKyAgZ2Jvb2xlYW4gY2hlY2tfZnJhbWVfY2hlY2tzdW1zOworCisgIEdzdEZsYWNQYXJzZVN0YXRlIHN0YXRlOworCisgIGdpbnQ2NCB1cHN0cmVhbV9sZW5ndGg7CisKKyAgLyogU1RSRUFNSU5GTyBjb250ZW50ICovCisgIGd1aW50MTYgbWluX2Jsb2Nrc2l6ZSwgbWF4X2Jsb2Nrc2l6ZTsKKyAgZ3VpbnQzMiBtaW5fZnJhbWVzaXplLCBtYXhfZnJhbWVzaXplOworICBndWludDMyIHNhbXBsZXJhdGU7CisgIGd1aW50OCBjaGFubmVsczsKKyAgZ3VpbnQ4IGJwczsKKyAgZ3VpbnQ2NCB0b3RhbF9zYW1wbGVzOworCisgIC8qIEN1cnJlbnQgZnJhbWUgKi8KKyAgZ3VpbnQ2NCBvZmZzZXQ7CisgIGd1aW50OCBibG9ja2luZ19zdHJhdGVneTsKKyAgZ3VpbnQxNiBibG9ja19zaXplOworICBndWludDY0IHNhbXBsZV9udW1iZXI7CisgIGd1aW50NjQgZmlyc3Rfc2FtcGxlX251bWJlcjsKKyAgZ2Jvb2xlYW4gc3RyYXRlZ3lfY2hlY2tlZDsKKworICBnYm9vbGVhbiBzZW50X2NvZGVjX3RhZzsKKworICBHc3RUYWdMaXN0ICp0YWdzOworICBHc3RUb2MgKnRvYzsKKworICBHTGlzdCAqaGVhZGVyczsKKyAgR3N0QnVmZmVyICpzZWVrdGFibGU7CisKKyAgZ2Jvb2xlYW4gZm9yY2VfdmFyaWFibGVfYmxvY2tfc2l6ZTsKK307CisKK3N0cnVjdCBfR3N0RmxhY1BhcnNlQ2xhc3MgeworICBHc3RCYXNlUGFyc2VDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfZmxhY19wYXJzZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9GTEFDX1BBUlNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RtcGVnYXVkaW9wYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYWQ4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmMKQEAgLTAsMCArMSwxNDU1IEBACisvKiBHU3RyZWFtZXIgTVBFRyBhdWRpbyBwYXJzZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwIE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3IHVzZXJzIHNmIG5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgQ29udGFjdDogU3RlZmFuIEtvc3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtbXBlZ2F1ZGlvcGFyc2UKKyAqIEBzaG9ydF9kZXNjcmlwdGlvbjogTVBFRyBhdWRpbyBwYXJzZXIKKyAqIEBzZWVfYWxzbzogI0dzdEFtclBhcnNlLCAjR3N0QUFDUGFyc2UKKyAqCisgKiBQYXJzZXMgYW5kIGZyYW1lcyBtcGVnMSBhdWRpbyBzdHJlYW1zLiBQcm92aWRlcyBzZWVraW5nLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXRlc3QubXAzICEgbXBlZ2F1ZGlvcGFyc2UgISBtcGcxMjNhdWRpb2RlYworICogICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIGF1dG9hdWRpb3NpbmsKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qIEZJWE1FOiB3ZSBzaG91bGQgbWFrZSB0aGUgYmFzZSBjbGFzcyAoR3N0QmFzZVBhcnNlKSBhd2FyZSBvZiB0aGUKKyAqIFhJTkcgc2VlayB0YWJsZSBzb21laG93LCBzbyBpdCBjYW4gdXNlIGl0IHByb3Blcmx5IGZvciB0aGluZ3MgbGlrZQorICogYWNjdXJhdGUgc2Vla3MuIEN1cnJlbnRseSBpdCBjYW4gb25seSBkbyBhIGxvb2t1cCB2aWEgdGhlIGNvbnZlcnQgZnVuY3Rpb24sCisgKiBidXQgdGhlbiBkb2Vzbid0IGtub3cgd2hhdCB0aGUgcmVzdWx0IHJlcHJlc2VudHMgZXhhY3RseS4gT25lIGNvdWxkIGVpdGhlcgorICogYWRkIGEgdmZ1bmMgZm9yIGluZGV4IGxvb2t1cCwgb3IganVzdCBtYWtlIG1wZWdhdWRpb3BhcnNlIHBvcHVsYXRlIHRoZQorICogYmFzZSBjbGFzcydzIGluZGV4IHZpYSB0aGUgQVBJIHByb3ZpZGVkLgorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdG1wZWdhdWRpb3BhcnNlLmgiCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXJlYWRlci5oPgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL3BidXRpbHMuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAobXBlZ19hdWRpb19wYXJzZV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBtcGVnX2F1ZGlvX3BhcnNlX2RlYnVnCisKKyNkZWZpbmUgTVBFR19BVURJT19DSEFOTkVMX01PREVfVU5LTk9XTiAtMQorI2RlZmluZSBNUEVHX0FVRElPX0NIQU5ORUxfTU9ERV9TVEVSRU8gMAorI2RlZmluZSBNUEVHX0FVRElPX0NIQU5ORUxfTU9ERV9KT0lOVF9TVEVSRU8gMQorI2RlZmluZSBNUEVHX0FVRElPX0NIQU5ORUxfTU9ERV9EVUFMX0NIQU5ORUwgMgorI2RlZmluZSBNUEVHX0FVRElPX0NIQU5ORUxfTU9ERV9NT05PIDMKKworI2RlZmluZSBDUkNfVU5LTk9XTiAtMQorI2RlZmluZSBDUkNfUFJPVEVDVEVEIDAKKyNkZWZpbmUgQ1JDX05PVF9QUk9URUNURUQgMQorCisjZGVmaW5lIFhJTkdfRlJBTUVTX0ZMQUcgICAgIDB4MDAwMQorI2RlZmluZSBYSU5HX0JZVEVTX0ZMQUcgICAgICAweDAwMDIKKyNkZWZpbmUgWElOR19UT0NfRkxBRyAgICAgICAgMHgwMDA0CisjZGVmaW5lIFhJTkdfVkJSX1NDQUxFX0ZMQUcgIDB4MDAwOAorCisjZGVmaW5lIE1JTl9GUkFNRV9TSVpFICAgICAgIDYKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby9tcGVnLCAiCisgICAgICAgICJtcGVndmVyc2lvbiA9IChpbnQpIDEsICIKKyAgICAgICAgImxheWVyID0gKGludCkgWyAxLCAzIF0sICIKKyAgICAgICAgIm1wZWdhdWRpb3ZlcnNpb24gPSAoaW50KSBbIDEsIDNdLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyA4MDAwLCA0ODAwMCBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdLCAiICJwYXJzZWQ9KGJvb2xlYW4pIHRydWUiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb24gPSAoaW50KSAxIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfbXBlZ19hdWRpb19wYXJzZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbXBlZ19hdWRpb19wYXJzZV9zdGFydCAoR3N0QmFzZVBhcnNlICogcGFyc2UpOworc3RhdGljIGdib29sZWFuIGdzdF9tcGVnX2F1ZGlvX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9tcGVnX2F1ZGlvX3BhcnNlX2hhbmRsZV9mcmFtZSAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSwgZ2ludCAqIHNraXBzaXplKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9tcGVnX2F1ZGlvX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbXBlZ19hdWRpb19wYXJzZV9jb252ZXJ0IChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RGb3JtYXQgc3JjX2Zvcm1hdCwgZ2ludDY0IHNyY192YWx1ZSwKKyAgICBHc3RGb3JtYXQgZGVzdF9mb3JtYXQsIGdpbnQ2NCAqIGRlc3RfdmFsdWUpOworc3RhdGljIEdzdENhcHMgKmdzdF9tcGVnX2F1ZGlvX3BhcnNlX2dldF9zaW5rX2NhcHMgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpOworCitzdGF0aWMgdm9pZCBnc3RfbXBlZ19hdWRpb19wYXJzZV9oYW5kbGVfZmlyc3RfZnJhbWUgKEdzdE1wZWdBdWRpb1BhcnNlICoKKyAgICBtcDNwYXJzZSwgR3N0QnVmZmVyICogYnVmKTsKKworI2RlZmluZSBnc3RfbXBlZ19hdWRpb19wYXJzZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RNcGVnQXVkaW9QYXJzZSwgZ3N0X21wZWdfYXVkaW9fcGFyc2UsIEdTVF9UWVBFX0JBU0VfUEFSU0UpOworCisjZGVmaW5lIEdTVF9UWVBFX01QRUdfQVVESU9fQ0hBTk5FTF9NT0RFICBcCisgICAgKGdzdF9tcGVnX2F1ZGlvX2NoYW5uZWxfbW9kZV9nZXRfdHlwZSgpKQorCitzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBtcGVnX2F1ZGlvX2NoYW5uZWxfbW9kZVtdID0geworICB7TVBFR19BVURJT19DSEFOTkVMX01PREVfVU5LTk9XTiwgIlVua25vd24iLCAidW5rbm93biJ9LAorICB7TVBFR19BVURJT19DSEFOTkVMX01PREVfTU9OTywgIk1vbm8iLCAibW9ubyJ9LAorICB7TVBFR19BVURJT19DSEFOTkVMX01PREVfRFVBTF9DSEFOTkVMLCAiRHVhbCBDaGFubmVsIiwgImR1YWwtY2hhbm5lbCJ9LAorICB7TVBFR19BVURJT19DSEFOTkVMX01PREVfSk9JTlRfU1RFUkVPLCAiSm9pbnQgU3RlcmVvIiwgImpvaW50LXN0ZXJlbyJ9LAorICB7TVBFR19BVURJT19DSEFOTkVMX01PREVfU1RFUkVPLCAiU3RlcmVvIiwgInN0ZXJlbyJ9LAorICB7MCwgTlVMTCwgTlVMTH0sCit9OworCitzdGF0aWMgR1R5cGUKK2dzdF9tcGVnX2F1ZGlvX2NoYW5uZWxfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIG1wZWdfYXVkaW9fY2hhbm5lbF9tb2RlX3R5cGUgPSAwOworCisgIGlmICghbXBlZ19hdWRpb19jaGFubmVsX21vZGVfdHlwZSkgeworICAgIG1wZWdfYXVkaW9fY2hhbm5lbF9tb2RlX3R5cGUgPQorICAgICAgICBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0TXBlZ0F1ZGlvQ2hhbm5lbE1vZGUiLAorICAgICAgICBtcGVnX2F1ZGlvX2NoYW5uZWxfbW9kZSk7CisgIH0KKyAgcmV0dXJuIG1wZWdfYXVkaW9fY2hhbm5lbF9tb2RlX3R5cGU7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqCitnc3RfbXBlZ19hdWRpb19jaGFubmVsX21vZGVfZ2V0X25pY2sgKGdpbnQgbW9kZSkKK3sKKyAgZ3VpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAobXBlZ19hdWRpb19jaGFubmVsX21vZGUpOyBpKyspIHsKKyAgICBpZiAobXBlZ19hdWRpb19jaGFubmVsX21vZGVbaV0udmFsdWUgPT0gbW9kZSkKKyAgICAgIHJldHVybiBtcGVnX2F1ZGlvX2NoYW5uZWxfbW9kZVtpXS52YWx1ZV9uaWNrOworICB9CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X21wZWdfYXVkaW9fcGFyc2VfY2xhc3NfaW5pdCAoR3N0TXBlZ0F1ZGlvUGFyc2VDbGFzcyAqIGtsYXNzKQoreworICBHc3RCYXNlUGFyc2VDbGFzcyAqcGFyc2VfY2xhc3MgPSBHU1RfQkFTRV9QQVJTRV9DTEFTUyAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKG1wZWdfYXVkaW9fcGFyc2VfZGVidWcsICJtcGVnYXVkaW9wYXJzZSIsIDAsCisgICAgICAiTVBFRzEgYXVkaW8gc3RyZWFtIHBhcnNlciIpOworCisgIG9iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfbXBlZ19hdWRpb19wYXJzZV9maW5hbGl6ZTsKKworICBwYXJzZV9jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21wZWdfYXVkaW9fcGFyc2Vfc3RhcnQpOworICBwYXJzZV9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXBlZ19hdWRpb19wYXJzZV9zdG9wKTsKKyAgcGFyc2VfY2xhc3MtPmhhbmRsZV9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21wZWdfYXVkaW9fcGFyc2VfaGFuZGxlX2ZyYW1lKTsKKyAgcGFyc2VfY2xhc3MtPnByZV9wdXNoX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXBlZ19hdWRpb19wYXJzZV9wcmVfcHVzaF9mcmFtZSk7CisgIHBhcnNlX2NsYXNzLT5jb252ZXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tcGVnX2F1ZGlvX3BhcnNlX2NvbnZlcnQpOworICBwYXJzZV9jbGFzcy0+Z2V0X3NpbmtfY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21wZWdfYXVkaW9fcGFyc2VfZ2V0X3NpbmtfY2Fwcyk7CisKKyAgLyogcmVnaXN0ZXIgdGFncyAqLworI2RlZmluZSBHU1RfVEFHX0NSQyAgICAgICJoYXMtY3JjIgorI2RlZmluZSBHU1RfVEFHX01PREUgICAgICJjaGFubmVsLW1vZGUiCisKKyAgZ3N0X3RhZ19yZWdpc3RlciAoR1NUX1RBR19DUkMsIEdTVF9UQUdfRkxBR19NRVRBLCBHX1RZUEVfQk9PTEVBTiwKKyAgICAgICJoYXMgY3JjIiwgIlVzaW5nIENSQyIsIE5VTEwpOworICBnc3RfdGFnX3JlZ2lzdGVyIChHU1RfVEFHX01PREUsIEdTVF9UQUdfRkxBR19FTkNPREVELCBHX1RZUEVfU1RSSU5HLAorICAgICAgImNoYW5uZWwgbW9kZSIsICJNUEVHIGF1ZGlvIGNoYW5uZWwgbW9kZSIsIE5VTEwpOworCisgIGdfdHlwZV9jbGFzc19yZWYgKEdTVF9UWVBFX01QRUdfQVVESU9fQ0hBTk5FTF9NT0RFKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIk1QRUcxIEF1ZGlvIFBhcnNlciIsCisgICAgICAiQ29kZWMvUGFyc2VyL0F1ZGlvIiwKKyAgICAgICJQYXJzZXMgYW5kIGZyYW1lcyBtcGVnMSBhdWRpbyBzdHJlYW1zIChsZXZlbHMgMS0zKSwgcHJvdmlkZXMgc2VlayIsCisgICAgICAiSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+LCIKKyAgICAgICJNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tcGVnX2F1ZGlvX3BhcnNlX3Jlc2V0IChHc3RNcGVnQXVkaW9QYXJzZSAqIG1wM3BhcnNlKQoreworICBtcDNwYXJzZS0+Y2hhbm5lbHMgPSAtMTsKKyAgbXAzcGFyc2UtPnJhdGUgPSAtMTsKKyAgbXAzcGFyc2UtPnNlbnRfY29kZWNfdGFnID0gRkFMU0U7CisgIG1wM3BhcnNlLT5sYXN0X3Bvc3RlZF9jcmMgPSBDUkNfVU5LTk9XTjsKKyAgbXAzcGFyc2UtPmxhc3RfcG9zdGVkX2NoYW5uZWxfbW9kZSA9IE1QRUdfQVVESU9fQ0hBTk5FTF9NT0RFX1VOS05PV047CisgIG1wM3BhcnNlLT5mcmVlcmF0ZSA9IDA7CisKKyAgbXAzcGFyc2UtPmhkcl9iaXRyYXRlID0gMDsKKworICBtcDNwYXJzZS0+eGluZ19mbGFncyA9IDA7CisgIG1wM3BhcnNlLT54aW5nX2JpdHJhdGUgPSAwOworICBtcDNwYXJzZS0+eGluZ19mcmFtZXMgPSAwOworICBtcDNwYXJzZS0+eGluZ190b3RhbF90aW1lID0gMDsKKyAgbXAzcGFyc2UtPnhpbmdfYnl0ZXMgPSAwOworICBtcDNwYXJzZS0+eGluZ192YnJfc2NhbGUgPSAwOworICBtZW1zZXQgKG1wM3BhcnNlLT54aW5nX3NlZWtfdGFibGUsIDAsIHNpemVvZiAobXAzcGFyc2UtPnhpbmdfc2Vla190YWJsZSkpOworICBtZW1zZXQgKG1wM3BhcnNlLT54aW5nX3NlZWtfdGFibGVfaW52ZXJzZSwgMCwKKyAgICAgIHNpemVvZiAobXAzcGFyc2UtPnhpbmdfc2Vla190YWJsZV9pbnZlcnNlKSk7CisKKyAgbXAzcGFyc2UtPnZicmlfYml0cmF0ZSA9IDA7CisgIG1wM3BhcnNlLT52YnJpX2ZyYW1lcyA9IDA7CisgIG1wM3BhcnNlLT52YnJpX3RvdGFsX3RpbWUgPSAwOworICBtcDNwYXJzZS0+dmJyaV9ieXRlcyA9IDA7CisgIG1wM3BhcnNlLT52YnJpX3NlZWtfcG9pbnRzID0gMDsKKyAgZ19mcmVlIChtcDNwYXJzZS0+dmJyaV9zZWVrX3RhYmxlKTsKKyAgbXAzcGFyc2UtPnZicmlfc2Vla190YWJsZSA9IE5VTEw7CisKKyAgbXAzcGFyc2UtPmVuY29kZXJfZGVsYXkgPSAwOworICBtcDNwYXJzZS0+ZW5jb2Rlcl9wYWRkaW5nID0gMDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tcGVnX2F1ZGlvX3BhcnNlX2luaXQgKEdzdE1wZWdBdWRpb1BhcnNlICogbXAzcGFyc2UpCit7CisgIGdzdF9tcGVnX2F1ZGlvX3BhcnNlX3Jlc2V0IChtcDNwYXJzZSk7CisgIEdTVF9QQURfU0VUX0FDQ0VQVF9JTlRFUlNFQ1QgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChtcDNwYXJzZSkpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChtcDNwYXJzZSkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X21wZWdfYXVkaW9fcGFyc2VfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbXBlZ19hdWRpb19wYXJzZV9zdGFydCAoR3N0QmFzZVBhcnNlICogcGFyc2UpCit7CisgIEdzdE1wZWdBdWRpb1BhcnNlICptcDNwYXJzZSA9IEdTVF9NUEVHX0FVRElPX1BBUlNFIChwYXJzZSk7CisKKyAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChHU1RfQkFTRV9QQVJTRSAobXAzcGFyc2UpLCBNSU5fRlJBTUVfU0laRSk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAic3RhcnRpbmciKTsKKworICBnc3RfbXBlZ19hdWRpb19wYXJzZV9yZXNldCAobXAzcGFyc2UpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tcGVnX2F1ZGlvX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKQoreworICBHc3RNcGVnQXVkaW9QYXJzZSAqbXAzcGFyc2UgPSBHU1RfTVBFR19BVURJT19QQVJTRSAocGFyc2UpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAic3RvcHBpbmciKTsKKworICBnc3RfbXBlZ19hdWRpb19wYXJzZV9yZXNldCAobXAzcGFyc2UpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgY29uc3QgZ3VpbnQgbXAzdHlwZXNfYml0cmF0ZXNbMl1bM11bMTZdID0geworICB7CisgICAgICAgIHswLCAzMiwgNjQsIDk2LCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCx9LAorICAgICAgICB7MCwgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAzODQsfSwKKyAgICAgICAgezAsIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAsfQorICAgICAgfSwKKyAgeworICAgICAgICB7MCwgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwLCAxNzYsIDE5MiwgMjI0LCAyNTYsfSwKKyAgICAgICAgezAsIDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MCx9LAorICAgICAgICB7MCwgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwLH0KKyAgICAgIH0sCit9OworCitzdGF0aWMgY29uc3QgZ3VpbnQgbXAzdHlwZXNfZnJlcXNbM11bM10gPSB7IHs0NDEwMCwgNDgwMDAsIDMyMDAwfSwKK3syMjA1MCwgMjQwMDAsIDE2MDAwfSwKK3sxMTAyNSwgMTIwMDAsIDgwMDB9Cit9OworCitzdGF0aWMgaW5saW5lIGd1aW50CittcDNfdHlwZV9mcmFtZV9sZW5ndGhfZnJvbV9oZWFkZXIgKEdzdE1wZWdBdWRpb1BhcnNlICogbXAzcGFyc2UsIGd1aW50MzIgaGVhZGVyLAorICAgIGd1aW50ICogcHV0X3ZlcnNpb24sIGd1aW50ICogcHV0X2xheWVyLCBndWludCAqIHB1dF9jaGFubmVscywKKyAgICBndWludCAqIHB1dF9iaXRyYXRlLCBndWludCAqIHB1dF9zYW1wbGVyYXRlLCBndWludCAqIHB1dF9tb2RlLAorICAgIGd1aW50ICogcHV0X2NyYykKK3sKKyAgZ3VpbnQgbGVuZ3RoOworICBndWxvbmcgbW9kZSwgc2FtcGxlcmF0ZSwgYml0cmF0ZSwgbGF5ZXIsIGNoYW5uZWxzLCBwYWRkaW5nLCBjcmM7CisgIGd1bG9uZyB2ZXJzaW9uOworICBnaW50IGxzZiwgbXBnMjU7CisKKyAgaWYgKGhlYWRlciAmICgxIDw8IDIwKSkgeworICAgIGxzZiA9IChoZWFkZXIgJiAoMSA8PCAxOSkpID8gMCA6IDE7CisgICAgbXBnMjUgPSAwOworICB9IGVsc2UgeworICAgIGxzZiA9IDE7CisgICAgbXBnMjUgPSAxOworICB9CisKKyAgdmVyc2lvbiA9IDEgKyBsc2YgKyBtcGcyNTsKKworICBsYXllciA9IDQgLSAoKGhlYWRlciA+PiAxNykgJiAweDMpOworCisgIGNyYyA9IChoZWFkZXIgPj4gMTYpICYgMHgxOworCisgIGJpdHJhdGUgPSAoaGVhZGVyID4+IDEyKSAmIDB4RjsKKyAgYml0cmF0ZSA9IG1wM3R5cGVzX2JpdHJhdGVzW2xzZl1bbGF5ZXIgLSAxXVtiaXRyYXRlXSAqIDEwMDA7CisgIGlmICghYml0cmF0ZSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChtcDNwYXJzZSwgInVzaW5nIGZyZWVmb3JtIGJpdHJhdGUiKTsKKyAgICBiaXRyYXRlID0gbXAzcGFyc2UtPmZyZWVyYXRlOworICB9CisKKyAgc2FtcGxlcmF0ZSA9IChoZWFkZXIgPj4gMTApICYgMHgzOworICBzYW1wbGVyYXRlID0gbXAzdHlwZXNfZnJlcXNbbHNmICsgbXBnMjVdW3NhbXBsZXJhdGVdOworCisgIC8qIGZvcmNlIDAgbGVuZ3RoIGlmIDAgYml0cmF0ZSAqLworICBwYWRkaW5nID0gKGJpdHJhdGUgPiAwKSA/IChoZWFkZXIgPj4gOSkgJiAweDEgOiAwOworCisgIG1vZGUgPSAoaGVhZGVyID4+IDYpICYgMHgzOworICBjaGFubmVscyA9IChtb2RlID09IDMpID8gMSA6IDI7CisKKyAgc3dpdGNoIChsYXllcikgeworICAgIGNhc2UgMToKKyAgICAgIGxlbmd0aCA9IDQgKiAoKGJpdHJhdGUgKiAxMikgLyBzYW1wbGVyYXRlICsgcGFkZGluZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBsZW5ndGggPSAoYml0cmF0ZSAqIDE0NCkgLyBzYW1wbGVyYXRlICsgcGFkZGluZzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgY2FzZSAzOgorICAgICAgbGVuZ3RoID0gKGJpdHJhdGUgKiAxNDQpIC8gKHNhbXBsZXJhdGUgPDwgbHNmKSArIHBhZGRpbmc7CisgICAgICBicmVhazsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAiQ2FsY3VsYXRlZCBtcDMgZnJhbWUgbGVuZ3RoIG9mICV1IGJ5dGVzIiwKKyAgICAgIGxlbmd0aCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAic2FtcGxlcmF0ZSA9ICVsdSwgYml0cmF0ZSA9ICVsdSwgdmVyc2lvbiA9ICVsdSwgIgorICAgICAgImxheWVyID0gJWx1LCBjaGFubmVscyA9ICVsdSwgbW9kZSA9ICVzIiwgc2FtcGxlcmF0ZSwgYml0cmF0ZSwgdmVyc2lvbiwKKyAgICAgIGxheWVyLCBjaGFubmVscywgZ3N0X21wZWdfYXVkaW9fY2hhbm5lbF9tb2RlX2dldF9uaWNrIChtb2RlKSk7CisKKyAgaWYgKHB1dF92ZXJzaW9uKQorICAgICpwdXRfdmVyc2lvbiA9IHZlcnNpb247CisgIGlmIChwdXRfbGF5ZXIpCisgICAgKnB1dF9sYXllciA9IGxheWVyOworICBpZiAocHV0X2NoYW5uZWxzKQorICAgICpwdXRfY2hhbm5lbHMgPSBjaGFubmVsczsKKyAgaWYgKHB1dF9iaXRyYXRlKQorICAgICpwdXRfYml0cmF0ZSA9IGJpdHJhdGU7CisgIGlmIChwdXRfc2FtcGxlcmF0ZSkKKyAgICAqcHV0X3NhbXBsZXJhdGUgPSBzYW1wbGVyYXRlOworICBpZiAocHV0X21vZGUpCisgICAgKnB1dF9tb2RlID0gbW9kZTsKKyAgaWYgKHB1dF9jcmMpCisgICAgKnB1dF9jcmMgPSBjcmM7CisKKyAgcmV0dXJuIGxlbmd0aDsKK30KKworLyogTWluaW11bSBudW1iZXIgb2YgY29uc2VjdXRpdmUsIHZhbGlkLWxvb2tpbmcgZnJhbWVzIHRvIGNvbnNpZGVyCisgKiBmb3IgcmVzeW5jaW5nICovCisjZGVmaW5lIE1JTl9SRVNZTkNfRlJBTUVTIDMKKworLyogUGVyZm9ybSBleHRlbmRlZCB2YWxpZGF0aW9uIHRvIGNoZWNrIHRoYXQgc3Vic2VxdWVudCBoZWFkZXJzIG1hdGNoCisgKiB0aGUgZmlyc3QgaGVhZGVyIGdpdmVuIGhlcmUgaW4gaW1wb3J0YW50IGNoYXJhY3RlcmlzdGljcywgdG8gYXZvaWQKKyAqIGZhbHNlIHN5bmMuIFdlIGxvb2sgZm9yIGEgbWluaW11bSBvZiBNSU5fUkVTWU5DX0ZSQU1FUyBjb25zZWN1dGl2ZQorICogZnJhbWVzIHRvIG1hdGNoIHRoZWlyIG1ham9yIGNoYXJhY3RlcmlzdGljcy4KKyAqCisgKiBJZiBhdF9lb3MgaXMgc2V0IHRvIFRSVUUsIHdlIGp1c3QgY2hlY2sgdGhhdCB3ZSBkb24ndCBmaW5kIGFueSBpbnZhbGlkCisgKiBmcmFtZXMgaW4gd2hhdGV2ZXIgZGF0YSBpcyBhdmFpbGFibGUsIHJhdGhlciB0aGFuIHJlcXVpcmluZyBhIGZ1bGwKKyAqIE1JTl9SRVNZTkNfRlJBTUVTIG9mIGRhdGEuCisgKgorICogUmV0dXJucyBUUlVFIGlmIHdlJ3ZlIHNlZW4gZW5vdWdoIGRhdGEgdG8gdmFsaWRhdGUgb3IgcmVqZWN0IHRoZSBmcmFtZS4KKyAqIElmIFRSVUUgaXMgcmV0dXJuZWQsIHRoZW4gKnZhbGlkIGNvbnRhaW5zIFRSVUUgaWYgaXQgdmFsaWRhdGVkLCBvciBmYWxzZQorICogaWYgd2UgZGVjaWRlZCBpdCB3YXMgZmFsc2Ugc3luYy4KKyAqIElmIEZBTFNFIGlzIHJldHVybmVkLCB0aGVuICp2YWxpZCBjb250YWlucyBtaW5pbXVtIG5lZWRlZCBkYXRhLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tcDNwYXJzZV92YWxpZGF0ZV9leHRlbmRlZCAoR3N0TXBlZ0F1ZGlvUGFyc2UgKiBtcDNwYXJzZSwgR3N0QnVmZmVyICogYnVmLAorICAgIGd1aW50MzIgaGVhZGVyLCBpbnQgYnBmLCBnYm9vbGVhbiBhdF9lb3MsIGdpbnQgKiB2YWxpZCkKK3sKKyAgZ3VpbnQzMiBuZXh0X2hlYWRlcjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIGludCBmcmFtZXNfZm91bmQgPSAxOworICBpbnQgb2Zmc2V0ID0gYnBmOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgd2hpbGUgKGZyYW1lc19mb3VuZCA8IE1JTl9SRVNZTkNfRlJBTUVTKSB7CisgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBlbm91Z2ggZGF0YSBmb3IgYWxsIHRoZXNlIGZyYW1lcywgcGx1cyB0aGUgbmV4dAorICAgICAgIGZyYW1lIGhlYWRlci4gKi8KKyAgICBpZiAobWFwLnNpemUgPCBvZmZzZXQgKyA0KSB7CisgICAgICBpZiAoYXRfZW9zKSB7CisgICAgICAgIC8qIFJ1bm5pbmcgb3V0IG9mIGRhdGEgYXQgRU9TIGlzIGZpbmU7IGp1c3QgYWNjZXB0IGl0ICovCisgICAgICAgICp2YWxpZCA9IFRSVUU7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICp2YWxpZCA9IG9mZnNldCArIDQ7CisgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICB9CisgICAgfQorCisgICAgbmV4dF9oZWFkZXIgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKG1hcC5kYXRhICsgb2Zmc2V0KTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChtcDNwYXJzZSwgIkF0ICVkOiBoZWFkZXI9JTA4WCwgaGVhZGVyMj0lMDhYLCBicGY9JWQiLAorICAgICAgICBvZmZzZXQsICh1bnNpZ25lZCBpbnQpIGhlYWRlciwgKHVuc2lnbmVkIGludCkgbmV4dF9oZWFkZXIsIGJwZik7CisKKy8qIG1hc2sgdGhlIGJpdHMgd2hpY2ggYXJlIGFsbG93ZWQgdG8gZGlmZmVyIGJldHdlZW4gZnJhbWVzICovCisjZGVmaW5lIEhEUk1BU0sgfigoMHhGIDw8IDEyKSAgLyogYml0cmF0ZSAqLyB8IFwKKyAgICAgICAgICAgICAgICAgICgweDEgPDwgIDkpICAvKiBwYWRkaW5nICovIHwgXAorICAgICAgICAgICAgICAgICAgKDB4ZiA8PCAgNCkgIC8qIG1vZGV8bW9kZSBleHRlbnNpb24gKi8gfCBcCisgICAgICAgICAgICAgICAgICAoMHhmKSkgICAgICAgIC8qIGNvcHlyaWdodHxlbXBoYXNpcyAqLworCisgICAgaWYgKChuZXh0X2hlYWRlciAmIEhEUk1BU0spICE9IChoZWFkZXIgJiBIRFJNQVNLKSkgeworICAgICAgLyogSWYgYW55IG9mIHRoZSB1bm1hc2tlZCBiaXRzIGRvbid0IG1hdGNoLCB0aGVuIGl0J3Mgbm90IHZhbGlkICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChtcDNwYXJzZSwgIm5leHQgaGVhZGVyIGRvZXNuJ3QgbWF0Y2ggIgorICAgICAgICAgICIoaGVhZGVyPSUwOFggKCUwOFgpLCBoZWFkZXIyPSUwOFggKCUwOFgpLCBicGY9JWQpIiwKKyAgICAgICAgICAoZ3VpbnQpIGhlYWRlciwgKGd1aW50KSBoZWFkZXIgJiBIRFJNQVNLLCAoZ3VpbnQpIG5leHRfaGVhZGVyLAorICAgICAgICAgIChndWludCkgbmV4dF9oZWFkZXIgJiBIRFJNQVNLLCBicGYpOworICAgICAgKnZhbGlkID0gRkFMU0U7CisgICAgICBnb3RvIGNsZWFudXA7CisgICAgfSBlbHNlIGlmICgoKG5leHRfaGVhZGVyID4+IDEyKSAmIDB4ZikgPT0gMHhmKSB7CisgICAgICAvKiBUaGUgZXNzZW50aWFsIHBhcnRzIHdlcmUgdGhlIHNhbWUsIGJ1dCB0aGUgYml0cmF0ZSBoZWxkIGFuCisgICAgICAgICBpbnZhbGlkIHZhbHVlIC0gYWxzbyByZWplY3QgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAibmV4dCBoZWFkZXIgaW52YWxpZCAoYml0cmF0ZSkiKTsKKyAgICAgICp2YWxpZCA9IEZBTFNFOworICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKworICAgIGJwZiA9IG1wM190eXBlX2ZyYW1lX2xlbmd0aF9mcm9tX2hlYWRlciAobXAzcGFyc2UsIG5leHRfaGVhZGVyLAorICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICAgIC8qIGlmIG5vIGJpdHJhdGUsIGFuZCBubyBmcmVlZm9ybSByYXRlIGtub3duLCB0aGVuIGZhaWwgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAoIWJwZikpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAibmV4dCBoZWFkZXIgaW52YWxpZCAoYml0cmF0ZSAwKSIpOworICAgICAgKnZhbGlkID0gRkFMU0U7CisgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorCisgICAgb2Zmc2V0ICs9IGJwZjsKKyAgICBmcmFtZXNfZm91bmQrKzsKKyAgfQorCisgICp2YWxpZCA9IFRSVUU7CisKK2NsZWFudXA6CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21wZWdfYXVkaW9fcGFyc2VfaGVhZF9jaGVjayAoR3N0TXBlZ0F1ZGlvUGFyc2UgKiBtcDNwYXJzZSwKKyAgICB1bnNpZ25lZCBsb25nIGhlYWQpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAiY2hlY2tpbmcgbXAzIGhlYWRlciAweCUwOGx4IiwgaGVhZCk7CisgIC8qIGlmIGl0J3Mgbm90IGEgdmFsaWQgc3luYyAqLworICBpZiAoKGhlYWQgJiAweGZmZTAwMDAwKSAhPSAweGZmZTAwMDAwKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtcDNwYXJzZSwgImludmFsaWQgc3luYyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICAvKiBpZiBpdCdzIGFuIGludmFsaWQgTVBFRyB2ZXJzaW9uICovCisgIGlmICgoKGhlYWQgPj4gMTkpICYgMykgPT0gMHgxKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtcDNwYXJzZSwgImludmFsaWQgTVBFRyB2ZXJzaW9uOiAweCVseCIsCisgICAgICAgIChoZWFkID4+IDE5KSAmIDMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICAvKiBpZiBpdCdzIGFuIGludmFsaWQgbGF5ZXIgKi8KKyAgaWYgKCEoKGhlYWQgPj4gMTcpICYgMykpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG1wM3BhcnNlLCAiaW52YWxpZCBsYXllcjogMHglbHgiLCAoaGVhZCA+PiAxNykgJiAzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgLyogaWYgaXQncyBhbiBpbnZhbGlkIGJpdHJhdGUgKi8KKyAgaWYgKCgoaGVhZCA+PiAxMikgJiAweGYpID09IDB4ZikgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXAzcGFyc2UsICJpbnZhbGlkIGJpdHJhdGU6IDB4JWx4IiwgKGhlYWQgPj4gMTIpICYgMHhmKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgLyogaWYgaXQncyBhbiBpbnZhbGlkIHNhbXBsZXJhdGUgKi8KKyAgaWYgKCgoaGVhZCA+PiAxMCkgJiAweDMpID09IDB4MykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXAzcGFyc2UsICJpbnZhbGlkIHNhbXBsZXJhdGU6IDB4JWx4IiwKKyAgICAgICAgKGhlYWQgPj4gMTApICYgMHgzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoKGhlYWQgJiAweDMpID09IDB4MikgeworICAgIC8qIElnbm9yZSB0aGlzIGFzIHRoZXJlIGFyZSBzb21lIGZpbGVzIHdpdGggZW1waGFzaXMgMHgyIHRoYXQgY2FuCisgICAgICogYmUgcGxheWVkIGZpbmUuIFNlZSBCR08gIzUzNzIzNSAqLworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXAzcGFyc2UsICJpbnZhbGlkIGVtcGhhc2lzOiAweCVseCIsIGhlYWQgJiAweDMpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIERldGVybWluZXMgcG9zc2libGUgZnJlZWZvcm0gZnJhbWUgcmF0ZS9zaXplIGJ5IGxvb2tpbmcgZm9yIG5leHQKKyAqIGhlYWRlciB3aXRoIHZhbGlkIGJpdHJhdGUgKDAgb3Igb3RoZXJ3aXNlIHZhbGlkKSAoYW5kIHN1ZmZpY2llbnRseQorICogbWF0Y2hpbmcgY3VycmVudCBoZWFkZXIpLgorICoKKyAqIFJldHVybnMgVFJVRSBpZiB3ZSd2ZSBmb3VuZCBzdWNoIG9uZSwgYW5kICpyYXRlIHRoZW4gY29udGFpbnMgcmF0ZQorICogKG9yICpyYXRlIGNvbnRhaW5zIDAgaWYgZGVjaWRlZCBubyBmcmVlZnJhbWUgc2l6ZSBjb3VsZCBiZSBkZXRlcm1pbmVkKS4KKyAqIElmIG5vdCBlbm91Z2ggZGF0YSwgcmV0dXJucyBGQUxTRS4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfbXAzcGFyc2VfZmluZF9mcmVlcmF0ZSAoR3N0TXBlZ0F1ZGlvUGFyc2UgKiBtcDNwYXJzZSwgR3N0TWFwSW5mbyAqIG1hcCwKKyAgICBndWludDMyIGhlYWRlciwgZ2Jvb2xlYW4gYXRfZW9zLCBnaW50ICogX3JhdGUpCit7CisgIGd1aW50MzIgbmV4dF9oZWFkZXI7CisgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQgYXZhaWxhYmxlOworICBpbnQgb2Zmc2V0ID0gNDsKKyAgZ3Vsb25nIHNhbXBsZXJhdGUsIHJhdGUsIGxheWVyLCBwYWRkaW5nOworICBnYm9vbGVhbiB2YWxpZDsKKyAgZ2ludCBsc2YsIG1wZzI1OworCisgIGF2YWlsYWJsZSA9IG1hcC0+c2l6ZTsKKyAgZGF0YSA9IG1hcC0+ZGF0YTsKKworICAqX3JhdGUgPSAwOworCisgIC8qIHBpY2sgYXBhcnQgaGVhZGVyIGFnYWluIHBhcnRpYWxseSAqLworICBpZiAoaGVhZGVyICYgKDEgPDwgMjApKSB7CisgICAgbHNmID0gKGhlYWRlciAmICgxIDw8IDE5KSkgPyAwIDogMTsKKyAgICBtcGcyNSA9IDA7CisgIH0gZWxzZSB7CisgICAgbHNmID0gMTsKKyAgICBtcGcyNSA9IDE7CisgIH0KKyAgbGF5ZXIgPSA0IC0gKChoZWFkZXIgPj4gMTcpICYgMHgzKTsKKyAgc2FtcGxlcmF0ZSA9IChoZWFkZXIgPj4gMTApICYgMHgzOworICBzYW1wbGVyYXRlID0gbXAzdHlwZXNfZnJlcXNbbHNmICsgbXBnMjVdW3NhbXBsZXJhdGVdOworICBwYWRkaW5nID0gKGhlYWRlciA+PiA5KSAmIDB4MTsKKworICBmb3IgKDsgb2Zmc2V0IDwgYXZhaWxhYmxlOyArK29mZnNldCkgeworICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgZW5vdWdoIGRhdGEgZm9yIGFsbCB0aGVzZSBmcmFtZXMsIHBsdXMgdGhlIG5leHQKKyAgICAgICBmcmFtZSBoZWFkZXIuICovCisgICAgaWYgKGF2YWlsYWJsZSA8IG9mZnNldCArIDQpIHsKKyAgICAgIGlmIChhdF9lb3MpIHsKKyAgICAgICAgLyogUnVubmluZyBvdXQgb2YgZGF0YTsgZmFpbGVkIHRvIGRldGVybWluZSBzaXplICovCisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKworICAgIHZhbGlkID0gRkFMU0U7CisgICAgbmV4dF9oZWFkZXIgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEgKyBvZmZzZXQpOworICAgIGlmICgobmV4dF9oZWFkZXIgJiAweEZGRTAwMDAwKSAhPSAweEZGRTAwMDAwKQorICAgICAgZ290byBuZXh0OworCisgICAgR1NUX0RFQlVHX09CSkVDVCAobXAzcGFyc2UsICJBdCAlZDogaGVhZGVyPSUwOFgsIGhlYWRlcjI9JTA4WCIsCisgICAgICAgIG9mZnNldCwgKHVuc2lnbmVkIGludCkgaGVhZGVyLCAodW5zaWduZWQgaW50KSBuZXh0X2hlYWRlcik7CisKKyAgICBpZiAoKG5leHRfaGVhZGVyICYgSERSTUFTSykgIT0gKGhlYWRlciAmIEhEUk1BU0spKSB7CisgICAgICAvKiBJZiBhbnkgb2YgdGhlIHVubWFza2VkIGJpdHMgZG9uJ3QgbWF0Y2gsIHRoZW4gaXQncyBub3QgdmFsaWQgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAibmV4dCBoZWFkZXIgZG9lc24ndCBtYXRjaCAiCisgICAgICAgICAgIihoZWFkZXI9JTA4WCAoJTA4WCksIGhlYWRlcjI9JTA4WCAoJTA4WCkpIiwKKyAgICAgICAgICAoZ3VpbnQpIGhlYWRlciwgKGd1aW50KSBoZWFkZXIgJiBIRFJNQVNLLCAoZ3VpbnQpIG5leHRfaGVhZGVyLAorICAgICAgICAgIChndWludCkgbmV4dF9oZWFkZXIgJiBIRFJNQVNLKTsKKyAgICAgIGdvdG8gbmV4dDsKKyAgICB9IGVsc2UgaWYgKCgobmV4dF9oZWFkZXIgPj4gMTIpICYgMHhmKSA9PSAweGYpIHsKKyAgICAgIC8qIFRoZSBlc3NlbnRpYWwgcGFydHMgd2VyZSB0aGUgc2FtZSwgYnV0IHRoZSBiaXRyYXRlIGhlbGQgYW4KKyAgICAgICAgIGludmFsaWQgdmFsdWUgLSBhbHNvIHJlamVjdCAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXAzcGFyc2UsICJuZXh0IGhlYWRlciBpbnZhbGlkIChiaXRyYXRlKSIpOworICAgICAgZ290byBuZXh0OworICAgIH0KKworICAgIHZhbGlkID0gVFJVRTsKKworICBuZXh0OgorICAgIC8qIGFsbW9zdCBhY2NlcHQgYXMgZnJlZSBmcmFtZSAqLworICAgIGlmIChsYXllciA9PSAxKSB7CisgICAgICByYXRlID0gc2FtcGxlcmF0ZSAqIChvZmZzZXQgLSA0ICogcGFkZGluZyArIDQpIC8gNDgwMDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHJhdGUgPSBzYW1wbGVyYXRlICogKG9mZnNldCAtIHBhZGRpbmcgKyAxKSAvICgxNDQgPj4gbHNmKSAvIDEwMDA7CisgICAgfQorCisgICAgaWYgKHZhbGlkKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAobXAzcGFyc2UsICJjYWxjdWxhdGVkIHJhdGUgJWx1IiwgcmF0ZSAqIDEwMDApOworICAgICAgaWYgKHJhdGUgPCA4IHx8IChsYXllciA9PSAzICYmIHJhdGUgPiA2NDApKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAicmF0ZSBpbnZhbGlkIik7CisgICAgICAgIGlmIChyYXRlIDwgOCkgeworICAgICAgICAgIC8qIG1heWJlIHNvbWUgaG9wZSAqLworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAiYWJvcnRpbmciKTsKKyAgICAgICAgICAvKiBnaXZlIHVwICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICpfcmF0ZSA9IHJhdGUgKiAxMDAwOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGF2b2lkIGluZGVmaW5pdGUgc2VhcmNoaW5nICovCisgICAgICBpZiAocmF0ZSA+IDEwMDApIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXAzcGFyc2UsICJleGNlZWRlZCBzYW5pdHkgcmF0ZTsgYWJvcnRpbmciKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbXBlZ19hdWRpb19wYXJzZV9oYW5kbGVfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUsIGdpbnQgKiBza2lwc2l6ZSkKK3sKKyAgR3N0TXBlZ0F1ZGlvUGFyc2UgKm1wM3BhcnNlID0gR1NUX01QRUdfQVVESU9fUEFSU0UgKHBhcnNlKTsKKyAgR3N0QnVmZmVyICpidWYgPSBmcmFtZS0+YnVmZmVyOworICBHc3RCeXRlUmVhZGVyIHJlYWRlcjsKKyAgZ2ludCBvZmYsIGJwZiA9IDA7CisgIGdib29sZWFuIGxvc3Rfc3luYywgZHJhaW5pbmcsIHZhbGlkLCBjYXBzX2NoYW5nZTsKKyAgZ3VpbnQzMiBoZWFkZXI7CisgIGd1aW50IGJpdHJhdGUsIGxheWVyLCByYXRlLCBjaGFubmVscywgdmVyc2lvbiwgbW9kZSwgY3JjOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgaWYgKEdfVU5MSUtFTFkgKG1hcC5zaXplIDwgNikpIHsKKyAgICAqc2tpcHNpemUgPSAxOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorCisgIGdzdF9ieXRlX3JlYWRlcl9pbml0ICgmcmVhZGVyLCBtYXAuZGF0YSwgbWFwLnNpemUpOworCisgIG9mZiA9IGdzdF9ieXRlX3JlYWRlcl9tYXNrZWRfc2Nhbl91aW50MzIgKCZyZWFkZXIsIDB4ZmZlMDAwMDAsIDB4ZmZlMDAwMDAsCisgICAgICAwLCBtYXAuc2l6ZSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAicG9zc2libGUgc3luYyBhdCBidWZmZXIgb2Zmc2V0ICVkIiwgb2ZmKTsKKworICAvKiBkaWRuJ3QgZmluZCBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSBzeW5jIHdvcmQsIHNraXAgKi8KKyAgaWYgKG9mZiA8IDApIHsKKyAgICAqc2tpcHNpemUgPSBtYXAuc2l6ZSAtIDM7CisgICAgZ290byBjbGVhbnVwOworICB9CisKKyAgLyogcG9zc2libGUgZnJhbWUgaGVhZGVyLCBidXQgbm90IGF0IG9mZnNldCAwPyBza2lwIGJ5dGVzIGJlZm9yZSBzeW5jICovCisgIGlmIChvZmYgPiAwKSB7CisgICAgKnNraXBzaXplID0gb2ZmOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorCisgIC8qIG1ha2Ugc3VyZSB0aGUgdmFsdWVzIGluIHRoZSBmcmFtZSBoZWFkZXIgbG9vayBzYW5lICovCisgIGhlYWRlciA9IEdTVF9SRUFEX1VJTlQzMl9CRSAobWFwLmRhdGEpOworICBpZiAoIWdzdF9tcGVnX2F1ZGlvX3BhcnNlX2hlYWRfY2hlY2sgKG1wM3BhcnNlLCBoZWFkZXIpKSB7CisgICAgKnNraXBzaXplID0gMTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJnb3QgZnJhbWUiKTsKKworICBsb3N0X3N5bmMgPSBHU1RfQkFTRV9QQVJTRV9MT1NUX1NZTkMgKHBhcnNlKTsKKyAgZHJhaW5pbmcgPSBHU1RfQkFTRV9QQVJTRV9EUkFJTklORyAocGFyc2UpOworCisgIGlmIChHX1VOTElLRUxZIChsb3N0X3N5bmMpKQorICAgIG1wM3BhcnNlLT5mcmVlcmF0ZSA9IDA7CisKKyAgYnBmID0gbXAzX3R5cGVfZnJhbWVfbGVuZ3RoX2Zyb21faGVhZGVyIChtcDNwYXJzZSwgaGVhZGVyLAorICAgICAgJnZlcnNpb24sICZsYXllciwgJmNoYW5uZWxzLCAmYml0cmF0ZSwgJnJhdGUsICZtb2RlLCAmY3JjKTsKKworICBpZiAoY2hhbm5lbHMgIT0gbXAzcGFyc2UtPmNoYW5uZWxzIHx8IHJhdGUgIT0gbXAzcGFyc2UtPnJhdGUgfHwKKyAgICAgIGxheWVyICE9IG1wM3BhcnNlLT5sYXllciB8fCB2ZXJzaW9uICE9IG1wM3BhcnNlLT52ZXJzaW9uKQorICAgIGNhcHNfY2hhbmdlID0gVFJVRTsKKyAgZWxzZQorICAgIGNhcHNfY2hhbmdlID0gRkFMU0U7CisKKyAgLyogbWF5YmUgZnJlZSBmb3JtYXQgKi8KKyAgaWYgKGJwZiA9PSAwKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKG1wM3BhcnNlLCAicG9zc2libHkgZnJlZSBmb3JtYXQiKTsKKyAgICBpZiAobG9zdF9zeW5jIHx8IG1wM3BhcnNlLT5mcmVlcmF0ZSA9PSAwKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChtcDNwYXJzZSwgImZpbmRpbmcgZnJlZSBmb3JtYXQgcmF0ZSIpOworICAgICAgaWYgKCFnc3RfbXAzcGFyc2VfZmluZF9mcmVlcmF0ZSAobXAzcGFyc2UsICZtYXAsIGhlYWRlciwgZHJhaW5pbmcsCisgICAgICAgICAgICAgICZ2YWxpZCkpIHsKKyAgICAgICAgLyogbm90IGVub3VnaCBkYXRhICovCisgICAgICAgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAocGFyc2UsIHZhbGlkKTsKKyAgICAgICAgKnNraXBzaXplID0gMDsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJkZXRlcm1pbmVkIGZyZWVmb3JtIHNpemUgJWQiLCB2YWxpZCk7CisgICAgICAgIG1wM3BhcnNlLT5mcmVlcmF0ZSA9IHZhbGlkOworICAgICAgfQorICAgIH0KKyAgICAvKiB0cnkgYWdhaW4gKi8KKyAgICBicGYgPSBtcDNfdHlwZV9mcmFtZV9sZW5ndGhfZnJvbV9oZWFkZXIgKG1wM3BhcnNlLCBoZWFkZXIsCisgICAgICAgICZ2ZXJzaW9uLCAmbGF5ZXIsICZjaGFubmVscywgJmJpdHJhdGUsICZyYXRlLCAmbW9kZSwgJmNyYyk7CisgICAgaWYgKCFicGYpIHsKKyAgICAgIC8qIGRpZCBub3QgY29tZSB1cCB3aXRoIHZhbGlkIGZyZWVmb3JtIGxlbmd0aCwgcmVqZWN0IGFmdGVyIGFsbCAqLworICAgICAgKnNraXBzaXplID0gMTsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgIH0KKworICBpZiAoIWRyYWluaW5nICYmIChsb3N0X3N5bmMgfHwgY2Fwc19jaGFuZ2UpKSB7CisgICAgaWYgKCFnc3RfbXAzcGFyc2VfdmFsaWRhdGVfZXh0ZW5kZWQgKG1wM3BhcnNlLCBidWYsIGhlYWRlciwgYnBmLCBkcmFpbmluZywKKyAgICAgICAgICAgICZ2YWxpZCkpIHsKKyAgICAgIC8qIG5vdCBlbm91Z2ggZGF0YSAqLworICAgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChwYXJzZSwgdmFsaWQpOworICAgICAgKnNraXBzaXplID0gMDsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCF2YWxpZCkgeworICAgICAgICAqc2tpcHNpemUgPSBvZmYgKyAyOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKGRyYWluaW5nICYmIGxvc3Rfc3luYyAmJiBjYXBzX2NoYW5nZSAmJiBtcDNwYXJzZS0+cmF0ZSA+IDApIHsKKyAgICAvKiBhdm9pZCBjYXBzIGppdHRlciB0aGF0IHdlIGNhbid0IGJlIHN1cmUgb2YgKi8KKyAgICAqc2tpcHNpemUgPSBvZmYgKyAyOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorCisgIC8qIHJlc3RvcmUgZGVmYXVsdCBtaW5pbXVtICovCisgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAocGFyc2UsIE1JTl9GUkFNRV9TSVpFKTsKKworICByZXMgPSBUUlVFOworCisgIC8qIG1ldGFkYXRhIGhhbmRsaW5nICovCisgIGlmIChHX1VOTElLRUxZIChjYXBzX2NoYW5nZSkpIHsKKyAgICBHc3RDYXBzICpjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL21wZWciLAorICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLAorICAgICAgICAibXBlZ2F1ZGlvdmVyc2lvbiIsIEdfVFlQRV9JTlQsIHZlcnNpb24sCisgICAgICAgICJsYXllciIsIEdfVFlQRV9JTlQsIGxheWVyLAorICAgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIHJhdGUsCisgICAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGNoYW5uZWxzLCAicGFyc2VkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICAgIGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgbXAzcGFyc2UtPnJhdGUgPSByYXRlOworICAgIG1wM3BhcnNlLT5jaGFubmVscyA9IGNoYW5uZWxzOworICAgIG1wM3BhcnNlLT5sYXllciA9IGxheWVyOworICAgIG1wM3BhcnNlLT52ZXJzaW9uID0gdmVyc2lvbjsKKworICAgIC8qIHNlZSBodHRwOi8vd3d3LmNvZGVwcm9qZWN0LmNvbS9hdWRpby9NUEVHQXVkaW9JbmZvLmFzcCAqLworICAgIGlmIChtcDNwYXJzZS0+bGF5ZXIgPT0gMSkKKyAgICAgIG1wM3BhcnNlLT5zcGYgPSAzODQ7CisgICAgZWxzZSBpZiAobXAzcGFyc2UtPmxheWVyID09IDIpCisgICAgICBtcDNwYXJzZS0+c3BmID0gMTE1MjsKKyAgICBlbHNlIGlmIChtcDNwYXJzZS0+dmVyc2lvbiA9PSAxKSB7CisgICAgICBtcDNwYXJzZS0+c3BmID0gMTE1MjsKKyAgICB9IGVsc2UgeworICAgICAgLyogTVBFRy0yIG9yICIyLjUiICovCisgICAgICBtcDNwYXJzZS0+c3BmID0gNTc2OworICAgIH0KKworICAgIC8qIGxlYWRfaW46CisgICAgICogV2Ugc3RhcnQgcHVzaGluZyA5IGZyYW1lcyBlYXJsaWVyICgyOSBmcmFtZXMgZm9yIE1QRUcyKSB0aGFuCisgICAgICogc2VnbWVudCBzdGFydCB0byBiZSBhYmxlIHRvIGRlY29kZSB0aGUgZmlyc3QgZnJhbWUgd2Ugd2FudC4KKyAgICAgKiA5ICgyOSkgZnJhbWVzIGFyZSB0aGUgdGhlb3JldGljYWwgbWF4aW11bSBvZiBmcmFtZXMgdGhhdCBjb250YWluCisgICAgICogZGF0YSBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgKGJpdCByZXNlcnZvaXIpLgorICAgICAqCisgICAgICogbGVhZF9vdXQ6CisgICAgICogU29tZSBtcDMgc3RyZWFtcyBoYXZlIGFuIG9mZnNldCBpbiB0aGUgdGltZXN0YW1wcywgZm9yIHdoaWNoIHdlIGhhdmUgdG8KKyAgICAgKiBwdXNoIHRoZSBmcmFtZSAqYWZ0ZXIqIHRoZSBlbmQgcG9zaXRpb24gaW4gb3JkZXIgZm9yIHRoZSBkZWNvZGVyIHRvIGJlCisgICAgICogYWJsZSB0byBkZWNvZGUgZXZlcnl0aGluZyB1cCB1bnRpbCB0aGUgc2VnbWVudC5zdG9wIHBvc2l0aW9uLiAqLworICAgIGdzdF9iYXNlX3BhcnNlX3NldF9mcmFtZV9yYXRlIChwYXJzZSwgbXAzcGFyc2UtPnJhdGUsIG1wM3BhcnNlLT5zcGYsCisgICAgICAgICh2ZXJzaW9uID09IDEpID8gMTAgOiAzMCwgMik7CisgIH0KKworICBtcDNwYXJzZS0+aGRyX2JpdHJhdGUgPSBiaXRyYXRlOworCisgIC8qIEZvciBmaXJzdCBmcmFtZTsgY2hlY2sgZm9yIHNlZWsgdGFibGVzIGFuZCBvdXRwdXQgYSBjb2RlYyB0YWcgKi8KKyAgZ3N0X21wZWdfYXVkaW9fcGFyc2VfaGFuZGxlX2ZpcnN0X2ZyYW1lIChtcDNwYXJzZSwgYnVmKTsKKworICAvKiBzdG9yZSBzb21lIGZyYW1lIGluZm8gZm9yIGxhdGVyIHByb2Nlc3NpbmcgKi8KKyAgbXAzcGFyc2UtPmxhc3RfY3JjID0gY3JjOworICBtcDNwYXJzZS0+bGFzdF9tb2RlID0gbW9kZTsKKworY2xlYW51cDoKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICBpZiAocmVzICYmIGJwZiA8PSBtYXAuc2l6ZSkgeworICAgIHJldHVybiBnc3RfYmFzZV9wYXJzZV9maW5pc2hfZnJhbWUgKHBhcnNlLCBmcmFtZSwgYnBmKTsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tcGVnX2F1ZGlvX3BhcnNlX2hhbmRsZV9maXJzdF9mcmFtZSAoR3N0TXBlZ0F1ZGlvUGFyc2UgKiBtcDNwYXJzZSwKKyAgICBHc3RCdWZmZXIgKiBidWYpCit7CisgIGNvbnN0IGd1aW50MzIgeGluZ19pZCA9IDB4NTg2OTZlNjc7ICAgLyogJ1hpbmcnIGluIGhleCAqLworICBjb25zdCBndWludDMyIGluZm9faWQgPSAweDQ5NmU2NjZmOyAgIC8qICdJbmZvJyBpbiBoZXggLSBmb3VuZCBpbiBMQU1FIENCUiBmaWxlcyAqLworICBjb25zdCBndWludDMyIHZicmlfaWQgPSAweDU2NDI1MjQ5OyAgIC8qICdWQlJJJyBpbiBoZXggKi8KKyAgY29uc3QgZ3VpbnQzMiBsYW1lX2lkID0gMHg0YzQxNGQ0NTsgICAvKiAnTEFNRScgaW4gaGV4ICovCisgIGdpbnQgb2Zmc2V0X3hpbmcsIG9mZnNldF92YnJpOworICBndWludDY0IGF2YWlsOworICBnaW50NjQgdXBzdHJlYW1fdG90YWxfYnl0ZXMgPSAwOworICBndWludDMyIHJlYWRfaWRfeGluZyA9IDAsIHJlYWRfaWRfdmJyaSA9IDA7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmRhdGE7CisgIGd1aW50IGJpdHJhdGU7CisKKyAgaWYgKG1wM3BhcnNlLT5zZW50X2NvZGVjX3RhZykKKyAgICByZXR1cm47CisKKyAgLyogQ2hlY2sgZmlyc3QgZnJhbWUgZm9yIFhpbmcgaW5mbyAqLworICBpZiAobXAzcGFyc2UtPnZlcnNpb24gPT0gMSkgeyAvKiBNUEVHLTEgZmlsZSAqLworICAgIGlmIChtcDNwYXJzZS0+Y2hhbm5lbHMgPT0gMSkKKyAgICAgIG9mZnNldF94aW5nID0gMHgxMTsKKyAgICBlbHNlCisgICAgICBvZmZzZXRfeGluZyA9IDB4MjA7CisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIE1QRUctMiBoZWFkZXIgKi8KKyAgICBpZiAobXAzcGFyc2UtPmNoYW5uZWxzID09IDEpCisgICAgICBvZmZzZXRfeGluZyA9IDB4MDk7CisgICAgZWxzZQorICAgICAgb2Zmc2V0X3hpbmcgPSAweDExOworICB9CisKKyAgLyogVGhlIFZCUkkgdGFnIGlzIGFsd2F5cyBhdCBvZmZzZXQgMHgyMCAqLworICBvZmZzZXRfdmJyaSA9IDB4MjA7CisKKyAgLyogU2tpcCB0aGUgNCBieXRlcyBvZiB0aGUgTVAzIGhlYWRlciB0b28gKi8KKyAgb2Zmc2V0X3hpbmcgKz0gNDsKKyAgb2Zmc2V0X3ZicmkgKz0gNDsKKworICAvKiBDaGVjayBpZiB3ZSBoYXZlIGVub3VnaCBkYXRhIHRvIHJlYWQgdGhlIFhpbmcgaGVhZGVyICovCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgYXZhaWwgPSBtYXAuc2l6ZTsKKworICBpZiAoYXZhaWwgPj0gb2Zmc2V0X3hpbmcgKyA0KSB7CisgICAgcmVhZF9pZF94aW5nID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhICsgb2Zmc2V0X3hpbmcpOworICB9CisgIGlmIChhdmFpbCA+PSBvZmZzZXRfdmJyaSArIDQpIHsKKyAgICByZWFkX2lkX3ZicmkgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEgKyBvZmZzZXRfdmJyaSk7CisgIH0KKworICAvKiBvYnRhaW4gcmVhbCB1cHN0cmVhbSB0b3RhbCBieXRlcyAqLworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAoR1NUX0JBU0VfUEFSU0VfU0lOS19QQUQgKG1wM3BhcnNlKSwKKyAgICAgICAgICBHU1RfRk9STUFUX0JZVEVTLCAmdXBzdHJlYW1fdG90YWxfYnl0ZXMpKQorICAgIHVwc3RyZWFtX3RvdGFsX2J5dGVzID0gMDsKKworICBpZiAocmVhZF9pZF94aW5nID09IHhpbmdfaWQgfHwgcmVhZF9pZF94aW5nID09IGluZm9faWQpIHsKKyAgICBndWludDMyIHhpbmdfZmxhZ3M7CisgICAgZ3VpbnQgYnl0ZXNfbmVlZGVkID0gb2Zmc2V0X3hpbmcgKyA4OworICAgIGdpbnQ2NCB0b3RhbF9ieXRlczsKKyAgICBHc3RDbG9ja1RpbWUgdG90YWxfdGltZTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAiRm91bmQgWGluZyBoZWFkZXIgbWFya2VyIDB4JXgiLCB4aW5nX2lkKTsKKworICAgIC8qIE1vdmUgZGF0YSBhZnRlciBYaW5nIGhlYWRlciAqLworICAgIGRhdGEgKz0gb2Zmc2V0X3hpbmcgKyA0OworCisgICAgLyogUmVhZCA0IGJhc2UgYnl0ZXMgb2YgZmxhZ3MsIGJpZy1lbmRpYW4gKi8KKyAgICB4aW5nX2ZsYWdzID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhKTsKKyAgICBkYXRhICs9IDQ7CisgICAgaWYgKHhpbmdfZmxhZ3MgJiBYSU5HX0ZSQU1FU19GTEFHKQorICAgICAgYnl0ZXNfbmVlZGVkICs9IDQ7CisgICAgaWYgKHhpbmdfZmxhZ3MgJiBYSU5HX0JZVEVTX0ZMQUcpCisgICAgICBieXRlc19uZWVkZWQgKz0gNDsKKyAgICBpZiAoeGluZ19mbGFncyAmIFhJTkdfVE9DX0ZMQUcpCisgICAgICBieXRlc19uZWVkZWQgKz0gMTAwOworICAgIGlmICh4aW5nX2ZsYWdzICYgWElOR19WQlJfU0NBTEVfRkxBRykKKyAgICAgIGJ5dGVzX25lZWRlZCArPSA0OworICAgIGlmIChhdmFpbCA8IGJ5dGVzX25lZWRlZCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXAzcGFyc2UsCisgICAgICAgICAgIk5vdCBlbm91Z2ggZGF0YSB0byByZWFkIFhpbmcgaGVhZGVyIChuZWVkICVkKSIsIGJ5dGVzX25lZWRlZCk7CisgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAobXAzcGFyc2UsICJSZWFkaW5nIFhpbmcgaGVhZGVyIik7CisgICAgbXAzcGFyc2UtPnhpbmdfZmxhZ3MgPSB4aW5nX2ZsYWdzOworCisgICAgaWYgKHhpbmdfZmxhZ3MgJiBYSU5HX0ZSQU1FU19GTEFHKSB7CisgICAgICBtcDNwYXJzZS0+eGluZ19mcmFtZXMgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEpOworICAgICAgaWYgKG1wM3BhcnNlLT54aW5nX2ZyYW1lcyA9PSAwKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXAzcGFyc2UsCisgICAgICAgICAgICAiSW52YWxpZCBudW1iZXIgb2YgZnJhbWVzIGluIFhpbmcgaGVhZGVyIik7CisgICAgICAgIG1wM3BhcnNlLT54aW5nX2ZsYWdzICY9IH5YSU5HX0ZSQU1FU19GTEFHOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbXAzcGFyc2UtPnhpbmdfdG90YWxfdGltZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoR1NUX1NFQ09ORCwKKyAgICAgICAgICAgIChndWludDY0KSAobXAzcGFyc2UtPnhpbmdfZnJhbWVzKSAqIChtcDNwYXJzZS0+c3BmKSwKKyAgICAgICAgICAgIG1wM3BhcnNlLT5yYXRlKTsKKyAgICAgIH0KKworICAgICAgZGF0YSArPSA0OworICAgIH0gZWxzZSB7CisgICAgICBtcDNwYXJzZS0+eGluZ19mcmFtZXMgPSAwOworICAgICAgbXAzcGFyc2UtPnhpbmdfdG90YWxfdGltZSA9IDA7CisgICAgfQorCisgICAgaWYgKHhpbmdfZmxhZ3MgJiBYSU5HX0JZVEVTX0ZMQUcpIHsKKyAgICAgIG1wM3BhcnNlLT54aW5nX2J5dGVzID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhKTsKKyAgICAgIGlmIChtcDNwYXJzZS0+eGluZ19ieXRlcyA9PSAwKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXAzcGFyc2UsICJJbnZhbGlkIG51bWJlciBvZiBieXRlcyBpbiBYaW5nIGhlYWRlciIpOworICAgICAgICBtcDNwYXJzZS0+eGluZ19mbGFncyAmPSB+WElOR19CWVRFU19GTEFHOworICAgICAgfQorICAgICAgZGF0YSArPSA0OworICAgIH0gZWxzZSB7CisgICAgICBtcDNwYXJzZS0+eGluZ19ieXRlcyA9IDA7CisgICAgfQorCisgICAgLyogSWYgd2Uga25vdyB0aGUgdXBzdHJlYW0gc2l6ZSBhbmQgZHVyYXRpb24sIGNvbXB1dGUgdGhlCisgICAgICogdG90YWwgYml0cmF0ZSwgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBrYml0L3NlYyAqLworICAgIGlmICgodG90YWxfdGltZSA9IG1wM3BhcnNlLT54aW5nX3RvdGFsX3RpbWUpICYmCisgICAgICAgICh0b3RhbF9ieXRlcyA9IG1wM3BhcnNlLT54aW5nX2J5dGVzKSkgeworICAgICAgbXAzcGFyc2UtPnhpbmdfYml0cmF0ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAodG90YWxfYnl0ZXMsCisgICAgICAgICAgOCAqIEdTVF9TRUNPTkQsIHRvdGFsX3RpbWUpOworICAgICAgbXAzcGFyc2UtPnhpbmdfYml0cmF0ZSArPSA1MDA7CisgICAgICBtcDNwYXJzZS0+eGluZ19iaXRyYXRlIC09IG1wM3BhcnNlLT54aW5nX2JpdHJhdGUgJSAxMDAwOworICAgIH0KKworICAgIGlmICh4aW5nX2ZsYWdzICYgWElOR19UT0NfRkxBRykgeworICAgICAgaW50IGksIHBlcmNlbnQgPSAwOworICAgICAgZ3VjaGFyICp0YWJsZSA9IG1wM3BhcnNlLT54aW5nX3NlZWtfdGFibGU7CisgICAgICBndWNoYXIgb2xkID0gMCwgbmV3OworICAgICAgZ3VpbnQgZmlyc3Q7CisKKyAgICAgIGZpcnN0ID0gZGF0YVswXTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLAorICAgICAgICAgICJTdWJ0cmFjdGluZyBpbml0aWFsIG9mZnNldCBvZiAlZCBieXRlcyBmcm9tIFhpbmcgVE9DIiwgZmlyc3QpOworCisgICAgICAvKiB4aW5nIHNlZWsgdGFibGU6IHBlcmNlbnQgdGltZSAtPiAxLzI1NiBieXRlcG9zICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKyAgICAgICAgbmV3ID0gZGF0YVtpXSAtIGZpcnN0OworICAgICAgICBpZiAob2xkID4gbmV3KSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtcDNwYXJzZSwgIlNraXBwaW5nIGJyb2tlbiBYaW5nIFRPQyIpOworICAgICAgICAgIG1wM3BhcnNlLT54aW5nX2ZsYWdzICY9IH5YSU5HX1RPQ19GTEFHOworICAgICAgICAgIGdvdG8gc2tpcF90b2M7CisgICAgICAgIH0KKyAgICAgICAgbXAzcGFyc2UtPnhpbmdfc2Vla190YWJsZVtpXSA9IG9sZCA9IG5ldzsKKyAgICAgIH0KKworICAgICAgLyogYnVpbGQgaW52ZXJzZSB0YWJsZTogMS8yNTYgYnl0ZXBvcyAtPiAxLzEwMCBwZXJjZW50IHRpbWUgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICB3aGlsZSAocGVyY2VudCA8IDk5ICYmIHRhYmxlW3BlcmNlbnQgKyAxXSA8PSBpKQorICAgICAgICAgIHBlcmNlbnQrKzsKKworICAgICAgICBpZiAodGFibGVbcGVyY2VudF0gPT0gaSkgeworICAgICAgICAgIG1wM3BhcnNlLT54aW5nX3NlZWtfdGFibGVfaW52ZXJzZVtpXSA9IHBlcmNlbnQgKiAxMDA7CisgICAgICAgIH0gZWxzZSBpZiAocGVyY2VudCA8IDk5ICYmIHRhYmxlW3BlcmNlbnRdKSB7CisgICAgICAgICAgZ2RvdWJsZSBmYSwgZmIsIGZ4OworICAgICAgICAgIGdpbnQgYSA9IHBlcmNlbnQsIGIgPSBwZXJjZW50ICsgMTsKKworICAgICAgICAgIGZhID0gdGFibGVbYV07CisgICAgICAgICAgZmIgPSB0YWJsZVtiXTsKKyAgICAgICAgICBmeCA9IChiIC0gYSkgLyAoZmIgLSBmYSkgKiAoaSAtIGZhKSArIGE7CisgICAgICAgICAgbXAzcGFyc2UtPnhpbmdfc2Vla190YWJsZV9pbnZlcnNlW2ldID0gKGd1aW50MTYpIChmeCAqIDEwMCk7CisgICAgICAgIH0gZWxzZSBpZiAocGVyY2VudCA9PSA5OSkgeworICAgICAgICAgIGdkb3VibGUgZmEsIGZiLCBmeDsKKyAgICAgICAgICBnaW50IGEgPSBwZXJjZW50LCBiID0gMTAwOworCisgICAgICAgICAgZmEgPSB0YWJsZVthXTsKKyAgICAgICAgICBmYiA9IDI1Ni4wOworICAgICAgICAgIGZ4ID0gKGIgLSBhKSAvIChmYiAtIGZhKSAqIChpIC0gZmEpICsgYTsKKyAgICAgICAgICBtcDNwYXJzZS0+eGluZ19zZWVrX3RhYmxlX2ludmVyc2VbaV0gPSAoZ3VpbnQxNikgKGZ4ICogMTAwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIHNraXBfdG9jOgorICAgICAgZGF0YSArPSAxMDA7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lbXNldCAobXAzcGFyc2UtPnhpbmdfc2Vla190YWJsZSwgMCwgc2l6ZW9mIChtcDNwYXJzZS0+eGluZ19zZWVrX3RhYmxlKSk7CisgICAgICBtZW1zZXQgKG1wM3BhcnNlLT54aW5nX3NlZWtfdGFibGVfaW52ZXJzZSwgMCwKKyAgICAgICAgICBzaXplb2YgKG1wM3BhcnNlLT54aW5nX3NlZWtfdGFibGVfaW52ZXJzZSkpOworICAgIH0KKworICAgIGlmICh4aW5nX2ZsYWdzICYgWElOR19WQlJfU0NBTEVfRkxBRykgeworICAgICAgbXAzcGFyc2UtPnhpbmdfdmJyX3NjYWxlID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhKTsKKyAgICAgIGRhdGEgKz0gNDsKKyAgICB9IGVsc2UKKyAgICAgIG1wM3BhcnNlLT54aW5nX3Zicl9zY2FsZSA9IDA7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChtcDNwYXJzZSwgIlhpbmcgaGVhZGVyIHJlcG9ydGVkICV1IGZyYW1lcywgdGltZSAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiwgJXUgYnl0ZXMsIHZiciBzY2FsZSAldSIsIG1wM3BhcnNlLT54aW5nX2ZyYW1lcywKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAobXAzcGFyc2UtPnhpbmdfdG90YWxfdGltZSksIG1wM3BhcnNlLT54aW5nX2J5dGVzLAorICAgICAgICBtcDNwYXJzZS0+eGluZ192YnJfc2NhbGUpOworCisgICAgLyogY2hlY2sgZm9yIHRydW5jYXRlZCBmaWxlICovCisgICAgaWYgKHVwc3RyZWFtX3RvdGFsX2J5dGVzICYmIG1wM3BhcnNlLT54aW5nX2J5dGVzICYmCisgICAgICAgIG1wM3BhcnNlLT54aW5nX2J5dGVzICogMC44ID4gdXBzdHJlYW1fdG90YWxfYnl0ZXMpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXAzcGFyc2UsICJGaWxlIGFwcGVhcnMgdG8gaGF2ZSBiZWVuIHRydW5jYXRlZDsgIgorICAgICAgICAgICJpbnZhbGlkYXRpbmcgWGluZyBoZWFkZXIgZHVyYXRpb24gYW5kIHNpemUiKTsKKyAgICAgIG1wM3BhcnNlLT54aW5nX2ZsYWdzICY9IH5YSU5HX0JZVEVTX0ZMQUc7CisgICAgICBtcDNwYXJzZS0+eGluZ19mbGFncyAmPSB+WElOR19GUkFNRVNfRkxBRzsKKyAgICB9CisKKyAgICAvKiBPcHRpb25hbCBMQU1FIHRhZz8gKi8KKyAgICBpZiAoYXZhaWwgLSBieXRlc19uZWVkZWQgPj0gMzYgJiYgR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhKSA9PSBsYW1lX2lkKSB7CisgICAgICBnY2hhciBsYW1lX3ZlcnNpb25bMTBdID0geyAwLCB9OworICAgICAgZ3VpbnQgdGFnX3JldjsKKyAgICAgIGd1aW50MzIgZW5jb2Rlcl9kZWxheSwgZW5jb2Rlcl9wYWRkaW5nOworCisgICAgICBtZW1jcHkgKGxhbWVfdmVyc2lvbiwgZGF0YSwgOSk7CisgICAgICBkYXRhICs9IDk7CisgICAgICB0YWdfcmV2ID0gZGF0YVswXSA+PiA0OworICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXAzcGFyc2UsICJGb3VuZCBMQU1FIHRhZyByZXZpc2lvbiAlZCBjcmVhdGVkIGJ5ICclcyciLAorICAgICAgICAgIHRhZ19yZXYsIGxhbWVfdmVyc2lvbik7CisKKyAgICAgIC8qIFNraXAgYWxsIHRoZSBpbmZvcm1hdGlvbiB3ZSdyZSBub3QgaW50ZXJlc3RlZCBpbiAqLworICAgICAgZGF0YSArPSAxMjsKKyAgICAgIC8qIEVuY29kZXIgZGVsYXkgYW5kIGVuZCBwYWRkaW5nICovCisgICAgICBlbmNvZGVyX2RlbGF5ID0gR1NUX1JFQURfVUlOVDI0X0JFIChkYXRhKTsKKyAgICAgIGVuY29kZXJfZGVsYXkgPj49IDEyOworICAgICAgZW5jb2Rlcl9wYWRkaW5nID0gR1NUX1JFQURfVUlOVDI0X0JFIChkYXRhKTsKKyAgICAgIGVuY29kZXJfcGFkZGluZyAmPSAweDAwMGZmZjsKKworICAgICAgbXAzcGFyc2UtPmVuY29kZXJfZGVsYXkgPSBlbmNvZGVyX2RlbGF5OworICAgICAgbXAzcGFyc2UtPmVuY29kZXJfcGFkZGluZyA9IGVuY29kZXJfcGFkZGluZzsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXAzcGFyc2UsICJFbmNvZGVyIGRlbGF5ICV1LCBlbmNvZGVyIHBhZGRpbmcgJXUiLAorICAgICAgICAgIGVuY29kZXJfZGVsYXksIGVuY29kZXJfcGFkZGluZyk7CisgICAgfQorICB9IGVsc2UgaWYgKHJlYWRfaWRfdmJyaSA9PSB2YnJpX2lkKSB7CisgICAgZ2ludDY0IHRvdGFsX2J5dGVzLCB0b3RhbF9mcmFtZXM7CisgICAgR3N0Q2xvY2tUaW1lIHRvdGFsX3RpbWU7CisgICAgZ3VpbnQxNiBuc2Vla19wb2ludHM7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChtcDNwYXJzZSwgIkZvdW5kIFZCUkkgaGVhZGVyIG1hcmtlciAweCV4IiwgdmJyaV9pZCk7CisKKyAgICBpZiAoYXZhaWwgPCBvZmZzZXRfdmJyaSArIDI2KSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChtcDNwYXJzZSwKKyAgICAgICAgICAiTm90IGVub3VnaCBkYXRhIHRvIHJlYWQgVkJSSSBoZWFkZXIgKG5lZWQgJWQpIiwgb2Zmc2V0X3ZicmkgKyAyNik7CisgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAobXAzcGFyc2UsICJSZWFkaW5nIFZCUkkgaGVhZGVyIik7CisKKyAgICAvKiBNb3ZlIGRhdGEgYWZ0ZXIgVkJSSSBoZWFkZXIgKi8KKyAgICBkYXRhICs9IG9mZnNldF92YnJpICsgNDsKKworICAgIGlmIChHU1RfUkVBRF9VSU5UMTZfQkUgKGRhdGEpICE9IDB4MDAwMSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtcDNwYXJzZSwKKyAgICAgICAgICAiVW5zdXBwb3J0ZWQgVkJSSSB2ZXJzaW9uIDB4JXgiLCBHU1RfUkVBRF9VSU5UMTZfQkUgKGRhdGEpKTsKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgICAgZGF0YSArPSAyOworCisgICAgLyogU2tpcCBlbmNvZGVyIGRlbGF5ICovCisgICAgZGF0YSArPSAyOworCisgICAgLyogU2tpcCBxdWFsaXR5ICovCisgICAgZGF0YSArPSAyOworCisgICAgdG90YWxfYnl0ZXMgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEpOworICAgIGlmICh0b3RhbF9ieXRlcyAhPSAwKQorICAgICAgbXAzcGFyc2UtPnZicmlfYnl0ZXMgPSB0b3RhbF9ieXRlczsKKyAgICBkYXRhICs9IDQ7CisKKyAgICB0b3RhbF9mcmFtZXMgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEpOworICAgIGlmICh0b3RhbF9mcmFtZXMgIT0gMCkgeworICAgICAgbXAzcGFyc2UtPnZicmlfZnJhbWVzID0gdG90YWxfZnJhbWVzOworICAgICAgbXAzcGFyc2UtPnZicmlfdG90YWxfdGltZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoR1NUX1NFQ09ORCwKKyAgICAgICAgICAoZ3VpbnQ2NCkgKG1wM3BhcnNlLT52YnJpX2ZyYW1lcykgKiAobXAzcGFyc2UtPnNwZiksIG1wM3BhcnNlLT5yYXRlKTsKKyAgICB9CisgICAgZGF0YSArPSA0OworCisgICAgLyogSWYgd2Uga25vdyB0aGUgdXBzdHJlYW0gc2l6ZSBhbmQgZHVyYXRpb24sIGNvbXB1dGUgdGhlCisgICAgICogdG90YWwgYml0cmF0ZSwgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBrYml0L3NlYyAqLworICAgIGlmICgodG90YWxfdGltZSA9IG1wM3BhcnNlLT52YnJpX3RvdGFsX3RpbWUpICYmCisgICAgICAgICh0b3RhbF9ieXRlcyA9IG1wM3BhcnNlLT52YnJpX2J5dGVzKSkgeworICAgICAgbXAzcGFyc2UtPnZicmlfYml0cmF0ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAodG90YWxfYnl0ZXMsCisgICAgICAgICAgOCAqIEdTVF9TRUNPTkQsIHRvdGFsX3RpbWUpOworICAgICAgbXAzcGFyc2UtPnZicmlfYml0cmF0ZSArPSA1MDA7CisgICAgICBtcDNwYXJzZS0+dmJyaV9iaXRyYXRlIC09IG1wM3BhcnNlLT52YnJpX2JpdHJhdGUgJSAxMDAwOworICAgIH0KKworICAgIG5zZWVrX3BvaW50cyA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoZGF0YSk7CisgICAgZGF0YSArPSAyOworCisgICAgaWYgKG5zZWVrX3BvaW50cyA+IDApIHsKKyAgICAgIGd1aW50IHNjYWxlLCBzZWVrX2J5dGVzLCBzZWVrX2ZyYW1lczsKKyAgICAgIGdpbnQgaTsKKworICAgICAgbXAzcGFyc2UtPnZicmlfc2Vla19wb2ludHMgPSBuc2Vla19wb2ludHM7CisKKyAgICAgIHNjYWxlID0gR1NUX1JFQURfVUlOVDE2X0JFIChkYXRhKTsKKyAgICAgIGRhdGEgKz0gMjsKKworICAgICAgc2Vla19ieXRlcyA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoZGF0YSk7CisgICAgICBkYXRhICs9IDI7CisKKyAgICAgIHNlZWtfZnJhbWVzID0gR1NUX1JFQURfVUlOVDE2X0JFIChkYXRhKTsKKworICAgICAgaWYgKHNjYWxlID09IDAgfHwgc2Vla19ieXRlcyA9PSAwIHx8IHNlZWtfYnl0ZXMgPiA0IHx8IHNlZWtfZnJhbWVzID09IDApIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtcDNwYXJzZSwgIlVuc3VwcG9ydGVkIFZCUkkgc2VlayB0YWJsZSIpOworICAgICAgICBnb3RvIG91dF92YnJpOworICAgICAgfQorCisgICAgICBpZiAoYXZhaWwgPCBvZmZzZXRfdmJyaSArIDI2ICsgbnNlZWtfcG9pbnRzICogc2Vla19ieXRlcykgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG1wM3BhcnNlLAorICAgICAgICAgICAgIk5vdCBlbm91Z2ggZGF0YSB0byByZWFkIFZCUkkgc2VlayB0YWJsZSAobmVlZCAlZCkiLAorICAgICAgICAgICAgb2Zmc2V0X3ZicmkgKyAyNiArIG5zZWVrX3BvaW50cyAqIHNlZWtfYnl0ZXMpOworICAgICAgICBnb3RvIG91dF92YnJpOworICAgICAgfQorCisgICAgICBpZiAoc2Vla19mcmFtZXMgKiBuc2Vla19wb2ludHMgPCB0b3RhbF9mcmFtZXMgLSBzZWVrX2ZyYW1lcyB8fAorICAgICAgICAgIHNlZWtfZnJhbWVzICogbnNlZWtfcG9pbnRzID4gdG90YWxfZnJhbWVzICsgc2Vla19mcmFtZXMpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtcDNwYXJzZSwKKyAgICAgICAgICAgICJWQlJJIHNlZWsgdGFibGUgZG9lc24ndCBjb3ZlciB0aGUgY29tcGxldGUgZmlsZSIpOworICAgICAgICBnb3RvIG91dF92YnJpOworICAgICAgfQorCisgICAgICBkYXRhID0gbWFwLmRhdGE7CisgICAgICBkYXRhICs9IG9mZnNldF92YnJpICsgMjY7CisKKyAgICAgIC8qIFZCUkkgc2VlayB0YWJsZTogZnJhbWUvc2Vla19mcmFtZXMgLT4gYnl0ZSAqLworICAgICAgbXAzcGFyc2UtPnZicmlfc2Vla190YWJsZSA9IGdfbmV3IChndWludDMyLCBuc2Vla19wb2ludHMpOworICAgICAgaWYgKHNlZWtfYnl0ZXMgPT0gNCkKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5zZWVrX3BvaW50czsgaSsrKSB7CisgICAgICAgICAgbXAzcGFyc2UtPnZicmlfc2Vla190YWJsZVtpXSA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoZGF0YSkgKiBzY2FsZTsKKyAgICAgICAgICBkYXRhICs9IDQ7CisgICAgICB9IGVsc2UgaWYgKHNlZWtfYnl0ZXMgPT0gMykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5zZWVrX3BvaW50czsgaSsrKSB7CisgICAgICAgICAgbXAzcGFyc2UtPnZicmlfc2Vla190YWJsZVtpXSA9IEdTVF9SRUFEX1VJTlQyNF9CRSAoZGF0YSkgKiBzY2FsZTsKKyAgICAgICAgICBkYXRhICs9IDM7CisgICAgICB9IGVsc2UgaWYgKHNlZWtfYnl0ZXMgPT0gMikKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5zZWVrX3BvaW50czsgaSsrKSB7CisgICAgICAgICAgbXAzcGFyc2UtPnZicmlfc2Vla190YWJsZVtpXSA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoZGF0YSkgKiBzY2FsZTsKKyAgICAgICAgICBkYXRhICs9IDI7CisgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgIC8qIHNlZWtfYnl0ZXMgPT0gMSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnNlZWtfcG9pbnRzOyBpKyspIHsKKyAgICAgICAgICBtcDNwYXJzZS0+dmJyaV9zZWVrX3RhYmxlW2ldID0gR1NUX1JFQURfVUlOVDggKGRhdGEpICogc2NhbGU7CisgICAgICAgICAgZGF0YSArPSAxOworICAgICAgICB9CisgICAgfQorICBvdXRfdmJyaToKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAiVkJSSSBoZWFkZXIgcmVwb3J0ZWQgJXUgZnJhbWVzLCB0aW1lICUiCisgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiLCBieXRlcyAldSIsIG1wM3BhcnNlLT52YnJpX2ZyYW1lcywKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAobXAzcGFyc2UtPnZicmlfdG90YWxfdGltZSksIG1wM3BhcnNlLT52YnJpX2J5dGVzKTsKKworICAgIC8qIGNoZWNrIGZvciB0cnVuY2F0ZWQgZmlsZSAqLworICAgIGlmICh1cHN0cmVhbV90b3RhbF9ieXRlcyAmJiBtcDNwYXJzZS0+dmJyaV9ieXRlcyAmJgorICAgICAgICBtcDNwYXJzZS0+dmJyaV9ieXRlcyAqIDAuOCA+IHVwc3RyZWFtX3RvdGFsX2J5dGVzKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG1wM3BhcnNlLCAiRmlsZSBhcHBlYXJzIHRvIGhhdmUgYmVlbiB0cnVuY2F0ZWQ7ICIKKyAgICAgICAgICAiaW52YWxpZGF0aW5nIFZCUkkgaGVhZGVyIGR1cmF0aW9uIGFuZCBzaXplIik7CisgICAgICBtcDNwYXJzZS0+dmJyaV92YWxpZCA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICBtcDNwYXJzZS0+dmJyaV92YWxpZCA9IFRSVUU7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLAorICAgICAgICAiWGluZywgTEFNRSBvciBWQlJJIGhlYWRlciBub3QgZm91bmQgaW4gZmlyc3QgZnJhbWUiKTsKKyAgfQorCisgIC8qIHNldCBkdXJhdGlvbiBpZiB0YWJsZXMgcHJvdmlkZWQgYSB2YWxpZCBvbmUgKi8KKyAgaWYgKG1wM3BhcnNlLT54aW5nX2ZsYWdzICYgWElOR19GUkFNRVNfRkxBRykgeworICAgIGdzdF9iYXNlX3BhcnNlX3NldF9kdXJhdGlvbiAoR1NUX0JBU0VfUEFSU0UgKG1wM3BhcnNlKSwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICBtcDNwYXJzZS0+eGluZ190b3RhbF90aW1lLCAwKTsKKyAgfQorICBpZiAobXAzcGFyc2UtPnZicmlfdG90YWxfdGltZSAhPSAwICYmIG1wM3BhcnNlLT52YnJpX3ZhbGlkKSB7CisgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X2R1cmF0aW9uIChHU1RfQkFTRV9QQVJTRSAobXAzcGFyc2UpLCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgIG1wM3BhcnNlLT52YnJpX3RvdGFsX3RpbWUsIDApOworICB9CisKKyAgLyogdGVsbCBiYXNlY2xhc3MgaG93IG5pY2VseSB3ZSBjYW4gc2VlaywgYW5kIGEgYml0cmF0ZSBpZiBvbmUgZm91bmQgKi8KKyAgLyogRklYTUU6IGZpbGwgaW5kZXggd2l0aCBzZWVrIHRhYmxlICovCisjaWYgMAorICBzZWVrYWJsZSA9IEdTVF9CQVNFX1BBUlNFX1NFRUtfREVGQVVMVDsKKyAgaWYgKChtcDNwYXJzZS0+eGluZ19mbGFncyAmIFhJTkdfVE9DX0ZMQUcpICYmIG1wM3BhcnNlLT54aW5nX2J5dGVzICYmCisgICAgICBtcDNwYXJzZS0+eGluZ190b3RhbF90aW1lKQorICAgIHNlZWthYmxlID0gR1NUX0JBU0VfUEFSU0VfU0VFS19UQUJMRTsKKworICBpZiAobXAzcGFyc2UtPnZicmlfc2Vla190YWJsZSAmJiBtcDNwYXJzZS0+dmJyaV9ieXRlcyAmJgorICAgICAgbXAzcGFyc2UtPnZicmlfdG90YWxfdGltZSkKKyAgICBzZWVrYWJsZSA9IEdTVF9CQVNFX1BBUlNFX1NFRUtfVEFCTEU7CisjZW5kaWYKKworICBpZiAobXAzcGFyc2UtPnhpbmdfYml0cmF0ZSkKKyAgICBiaXRyYXRlID0gbXAzcGFyc2UtPnhpbmdfYml0cmF0ZTsKKyAgZWxzZSBpZiAobXAzcGFyc2UtPnZicmlfYml0cmF0ZSkKKyAgICBiaXRyYXRlID0gbXAzcGFyc2UtPnZicmlfYml0cmF0ZTsKKyAgZWxzZQorICAgIGJpdHJhdGUgPSAwOworCisgIGdzdF9iYXNlX3BhcnNlX3NldF9hdmVyYWdlX2JpdHJhdGUgKEdTVF9CQVNFX1BBUlNFIChtcDNwYXJzZSksIGJpdHJhdGUpOworCitjbGVhbnVwOgorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tcGVnX2F1ZGlvX3BhcnNlX3RpbWVfdG9fYnl0ZXBvcyAoR3N0TXBlZ0F1ZGlvUGFyc2UgKiBtcDNwYXJzZSwKKyAgICBHc3RDbG9ja1RpbWUgdHMsIGdpbnQ2NCAqIGJ5dGVwb3MpCit7CisgIGdpbnQ2NCB0b3RhbF9ieXRlczsKKyAgR3N0Q2xvY2tUaW1lIHRvdGFsX3RpbWU7CisKKyAgLyogSWYgWElORyBzZWVrIHRhYmxlIGV4aXN0cyB1c2UgdGhpcyBmb3IgdGltZS0+Ynl0ZSBjb252ZXJzaW9uICovCisgIGlmICgobXAzcGFyc2UtPnhpbmdfZmxhZ3MgJiBYSU5HX1RPQ19GTEFHKSAmJgorICAgICAgKHRvdGFsX2J5dGVzID0gbXAzcGFyc2UtPnhpbmdfYnl0ZXMpICYmCisgICAgICAodG90YWxfdGltZSA9IG1wM3BhcnNlLT54aW5nX3RvdGFsX3RpbWUpKSB7CisgICAgZ2RvdWJsZSBmYSwgZmIsIGZ4OworICAgIGdkb3VibGUgcGVyY2VudCA9CisgICAgICAgIENMQU1QICgoMTAwLjAgKiBnc3RfdXRpbF9ndWludDY0X3RvX2dkb3VibGUgKHRzKSkgLworICAgICAgICBnc3RfdXRpbF9ndWludDY0X3RvX2dkb3VibGUgKHRvdGFsX3RpbWUpLCAwLjAsIDEwMC4wKTsKKyAgICBnaW50IGluZGV4ID0gQ0xBTVAgKHBlcmNlbnQsIDAsIDk5KTsKKworICAgIGZhID0gbXAzcGFyc2UtPnhpbmdfc2Vla190YWJsZVtpbmRleF07CisgICAgaWYgKGluZGV4IDwgOTkpCisgICAgICBmYiA9IG1wM3BhcnNlLT54aW5nX3NlZWtfdGFibGVbaW5kZXggKyAxXTsKKyAgICBlbHNlCisgICAgICBmYiA9IDI1Ni4wOworCisgICAgZnggPSBmYSArIChmYiAtIGZhKSAqIChwZXJjZW50IC0gaW5kZXgpOworCisgICAgKmJ5dGVwb3MgPSAoMS4wIC8gMjU2LjApICogZnggKiB0b3RhbF9ieXRlczsKKworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgaWYgKG1wM3BhcnNlLT52YnJpX3NlZWtfdGFibGUgJiYgKHRvdGFsX2J5dGVzID0gbXAzcGFyc2UtPnZicmlfYnl0ZXMpICYmCisgICAgICAodG90YWxfdGltZSA9IG1wM3BhcnNlLT52YnJpX3RvdGFsX3RpbWUpKSB7CisgICAgZ2ludCBpLCBqOworICAgIGdkb3VibGUgYSwgYiwgZmEsIGZiOworCisgICAgaSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAodHMsIG1wM3BhcnNlLT52YnJpX3NlZWtfcG9pbnRzIC0gMSwgdG90YWxfdGltZSk7CisgICAgaSA9IENMQU1QIChpLCAwLCBtcDNwYXJzZS0+dmJyaV9zZWVrX3BvaW50cyAtIDEpOworCisgICAgYSA9IGdzdF9ndWludDY0X3RvX2dkb3VibGUgKGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoaSwgdG90YWxfdGltZSwKKyAgICAgICAgICAgIG1wM3BhcnNlLT52YnJpX3NlZWtfcG9pbnRzKSk7CisgICAgZmEgPSAwLjA7CisgICAgZm9yIChqID0gaTsgaiA+PSAwOyBqLS0pCisgICAgICBmYSArPSBtcDNwYXJzZS0+dmJyaV9zZWVrX3RhYmxlW2pdOworCisgICAgaWYgKGkgKyAxIDwgbXAzcGFyc2UtPnZicmlfc2Vla19wb2ludHMpIHsKKyAgICAgIGIgPSBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChnc3RfdXRpbF91aW50NjRfc2NhbGUgKGkgKyAxLCB0b3RhbF90aW1lLAorICAgICAgICAgICAgICBtcDNwYXJzZS0+dmJyaV9zZWVrX3BvaW50cykpOworICAgICAgZmIgPSBmYSArIG1wM3BhcnNlLT52YnJpX3NlZWtfdGFibGVbaSArIDFdOworICAgIH0gZWxzZSB7CisgICAgICBiID0gZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAodG90YWxfdGltZSk7CisgICAgICBmYiA9IHRvdGFsX2J5dGVzOworICAgIH0KKworICAgICpieXRlcG9zID0gZmEgKyAoKGZiIC0gZmEpIC8gKGIgLSBhKSkgKiAoZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAodHMpIC0gYSk7CisKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbXBlZ19hdWRpb19wYXJzZV9ieXRlcG9zX3RvX3RpbWUgKEdzdE1wZWdBdWRpb1BhcnNlICogbXAzcGFyc2UsCisgICAgZ2ludDY0IGJ5dGVwb3MsIEdzdENsb2NrVGltZSAqIHRzKQoreworICBnaW50NjQgdG90YWxfYnl0ZXM7CisgIEdzdENsb2NrVGltZSB0b3RhbF90aW1lOworCisgIC8qIElmIFhJTkcgc2VlayB0YWJsZSBleGlzdHMgdXNlIHRoaXMgZm9yIGJ5dGUtPnRpbWUgY29udmVyc2lvbiAqLworICBpZiAoKG1wM3BhcnNlLT54aW5nX2ZsYWdzICYgWElOR19UT0NfRkxBRykgJiYKKyAgICAgICh0b3RhbF9ieXRlcyA9IG1wM3BhcnNlLT54aW5nX2J5dGVzKSAmJgorICAgICAgKHRvdGFsX3RpbWUgPSBtcDNwYXJzZS0+eGluZ190b3RhbF90aW1lKSkgeworICAgIGdkb3VibGUgZmEsIGZiLCBmeDsKKyAgICBnZG91YmxlIHBvczsKKyAgICBnaW50IGluZGV4OworCisgICAgcG9zID0gQ0xBTVAgKChieXRlcG9zICogMjU2LjApIC8gdG90YWxfYnl0ZXMsIDAuMCwgMjU2LjApOworICAgIGluZGV4ID0gQ0xBTVAgKHBvcywgMCwgMjU1KTsKKyAgICBmYSA9IG1wM3BhcnNlLT54aW5nX3NlZWtfdGFibGVfaW52ZXJzZVtpbmRleF07CisgICAgaWYgKGluZGV4IDwgMjU1KQorICAgICAgZmIgPSBtcDNwYXJzZS0+eGluZ19zZWVrX3RhYmxlX2ludmVyc2VbaW5kZXggKyAxXTsKKyAgICBlbHNlCisgICAgICBmYiA9IDEwMDAwLjA7CisKKyAgICBmeCA9IGZhICsgKGZiIC0gZmEpICogKHBvcyAtIGluZGV4KTsKKworICAgICp0cyA9ICgxLjAgLyAxMDAwMC4wKSAqIGZ4ICogZ3N0X3V0aWxfZ3VpbnQ2NF90b19nZG91YmxlICh0b3RhbF90aW1lKTsKKworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgaWYgKG1wM3BhcnNlLT52YnJpX3NlZWtfdGFibGUgJiYKKyAgICAgICh0b3RhbF9ieXRlcyA9IG1wM3BhcnNlLT52YnJpX2J5dGVzKSAmJgorICAgICAgKHRvdGFsX3RpbWUgPSBtcDNwYXJzZS0+dmJyaV90b3RhbF90aW1lKSkgeworICAgIGdpbnQgaSA9IDA7CisgICAgZ3VpbnQ2NCBzdW0gPSAwOworICAgIGdkb3VibGUgYSwgYiwgZmEsIGZiOworCisgICAgZG8geworICAgICAgc3VtICs9IG1wM3BhcnNlLT52YnJpX3NlZWtfdGFibGVbaV07CisgICAgICBpKys7CisgICAgfSB3aGlsZSAoaSArIDEgPCBtcDNwYXJzZS0+dmJyaV9zZWVrX3BvaW50cworICAgICAgICAmJiBzdW0gKyBtcDNwYXJzZS0+dmJyaV9zZWVrX3RhYmxlW2ldIDwgYnl0ZXBvcyk7CisgICAgaS0tOworCisgICAgYSA9IGdzdF9ndWludDY0X3RvX2dkb3VibGUgKHN1bSk7CisgICAgZmEgPSBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChnc3RfdXRpbF91aW50NjRfc2NhbGUgKGksIHRvdGFsX3RpbWUsCisgICAgICAgICAgICBtcDNwYXJzZS0+dmJyaV9zZWVrX3BvaW50cykpOworCisgICAgaWYgKGkgKyAxIDwgbXAzcGFyc2UtPnZicmlfc2Vla19wb2ludHMpIHsKKyAgICAgIGIgPSBhICsgbXAzcGFyc2UtPnZicmlfc2Vla190YWJsZVtpICsgMV07CisgICAgICBmYiA9IGdzdF9ndWludDY0X3RvX2dkb3VibGUgKGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoaSArIDEsIHRvdGFsX3RpbWUsCisgICAgICAgICAgICAgIG1wM3BhcnNlLT52YnJpX3NlZWtfcG9pbnRzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGIgPSB0b3RhbF9ieXRlczsKKyAgICAgIGZiID0gZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAodG90YWxfdGltZSk7CisgICAgfQorCisgICAgKnRzID0gZ3N0X2dkb3VibGVfdG9fZ3VpbnQ2NCAoZmEgKyAoKGZiIC0gZmEpIC8gKGIgLSBhKSkgKiAoYnl0ZXBvcyAtIGEpKTsKKworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tcGVnX2F1ZGlvX3BhcnNlX2NvbnZlcnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLCBHc3RGb3JtYXQgc3JjX2Zvcm1hdCwKKyAgICBnaW50NjQgc3JjX3ZhbHVlLCBHc3RGb3JtYXQgZGVzdF9mb3JtYXQsIGdpbnQ2NCAqIGRlc3RfdmFsdWUpCit7CisgIEdzdE1wZWdBdWRpb1BhcnNlICptcDNwYXJzZSA9IEdTVF9NUEVHX0FVRElPX1BBUlNFIChwYXJzZSk7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIGlmIChzcmNfZm9ybWF0ID09IEdTVF9GT1JNQVRfVElNRSAmJiBkZXN0X2Zvcm1hdCA9PSBHU1RfRk9STUFUX0JZVEVTKQorICAgIHJlcyA9CisgICAgICAgIGdzdF9tcGVnX2F1ZGlvX3BhcnNlX3RpbWVfdG9fYnl0ZXBvcyAobXAzcGFyc2UsIHNyY192YWx1ZSwgZGVzdF92YWx1ZSk7CisgIGVsc2UgaWYgKHNyY19mb3JtYXQgPT0gR1NUX0ZPUk1BVF9CWVRFUyAmJiBkZXN0X2Zvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpCisgICAgcmVzID0gZ3N0X21wZWdfYXVkaW9fcGFyc2VfYnl0ZXBvc190b190aW1lIChtcDNwYXJzZSwgc3JjX3ZhbHVlLAorICAgICAgICAoR3N0Q2xvY2tUaW1lICopIGRlc3RfdmFsdWUpOworCisgIC8qIGlmIG5vIHRhYmxlcywgZmFsbCBiYWNrIHRvIGRlZmF1bHQgZXN0aW1hdGVkIHJhdGUgYmFzZWQgY29udmVyc2lvbiAqLworICBpZiAoIXJlcykKKyAgICByZXR1cm4gZ3N0X2Jhc2VfcGFyc2VfY29udmVydF9kZWZhdWx0IChwYXJzZSwgc3JjX2Zvcm1hdCwgc3JjX3ZhbHVlLAorICAgICAgICBkZXN0X2Zvcm1hdCwgZGVzdF92YWx1ZSk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tcGVnX2F1ZGlvX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lKQoreworICBHc3RNcGVnQXVkaW9QYXJzZSAqbXAzcGFyc2UgPSBHU1RfTVBFR19BVURJT19QQVJTRSAocGFyc2UpOworICBHc3RUYWdMaXN0ICp0YWdsaXN0ID0gTlVMTDsKKworICAvKiB3ZSB3aWxsIGNyZWF0ZSBhIHRhZ2xpc3QgKGlmIGFueSBvZiB0aGUgcGFyYW1ldGVycyBoYXMgY2hhbmdlZCkKKyAgICogdG8gYWRkIHRoZSB0YWdzIHRoYXQgY2hhbmdlZCAqLworICBpZiAobXAzcGFyc2UtPmxhc3RfcG9zdGVkX2NyYyAhPSBtcDNwYXJzZS0+bGFzdF9jcmMpIHsKKyAgICBnYm9vbGVhbiB1c2luZ19jcmM7CisKKyAgICBpZiAoIXRhZ2xpc3QpCisgICAgICB0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKworICAgIG1wM3BhcnNlLT5sYXN0X3Bvc3RlZF9jcmMgPSBtcDNwYXJzZS0+bGFzdF9jcmM7CisgICAgaWYgKG1wM3BhcnNlLT5sYXN0X3Bvc3RlZF9jcmMgPT0gQ1JDX1BST1RFQ1RFRCkgeworICAgICAgdXNpbmdfY3JjID0gVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgdXNpbmdfY3JjID0gRkFMU0U7CisgICAgfQorICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwgR1NUX1RBR19DUkMsCisgICAgICAgIHVzaW5nX2NyYywgTlVMTCk7CisgIH0KKworICBpZiAobXAzcGFyc2UtPmxhc3RfcG9zdGVkX2NoYW5uZWxfbW9kZSAhPSBtcDNwYXJzZS0+bGFzdF9tb2RlKSB7CisgICAgaWYgKCF0YWdsaXN0KQorICAgICAgdGFnbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisKKyAgICBtcDNwYXJzZS0+bGFzdF9wb3N0ZWRfY2hhbm5lbF9tb2RlID0gbXAzcGFyc2UtPmxhc3RfbW9kZTsKKworICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwgR1NUX1RBR19NT0RFLAorICAgICAgICBnc3RfbXBlZ19hdWRpb19jaGFubmVsX21vZGVfZ2V0X25pY2sgKG1wM3BhcnNlLT5sYXN0X21vZGUpLCBOVUxMKTsKKyAgfQorCisgIC8qIHRhZyBzZW5kaW5nIGRvbmUgbGF0ZSBlbm91Z2ggaW4gaG9vayB0byBlbnN1cmUgcGVuZGluZyBldmVudHMKKyAgICogaGF2ZSBhbHJlYWR5IGJlZW4gc2VudCAqLworICBpZiAodGFnbGlzdCAhPSBOVUxMIHx8ICFtcDNwYXJzZS0+c2VudF9jb2RlY190YWcpIHsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgaWYgKHRhZ2xpc3QgPT0gTlVMTCkKKyAgICAgIHRhZ2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgICAgLyogY29kZWMgdGFnICovCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpKTsKKyAgICBpZiAoR19VTkxJS0VMWSAoY2FwcyA9PSBOVUxMKSkgeworICAgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdsaXN0KTsKKworICAgICAgaWYgKEdTVF9QQURfSVNfRkxVU0hJTkcgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSkpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgZmx1c2hpbmciKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgbm90IG5lZ290aWF0ZWQhIik7CisgICAgICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICAgIH0KKyAgICB9CisgICAgZ3N0X3BiX3V0aWxzX2FkZF9jb2RlY19kZXNjcmlwdGlvbl90b190YWdfbGlzdCAodGFnbGlzdCwKKyAgICAgICAgR1NUX1RBR19BVURJT19DT0RFQywgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgaWYgKG1wM3BhcnNlLT5oZHJfYml0cmF0ZSA+IDAgJiYgbXAzcGFyc2UtPnhpbmdfYml0cmF0ZSA9PSAwICYmCisgICAgICAgIG1wM3BhcnNlLT52YnJpX2JpdHJhdGUgPT0gMCkgeworICAgICAgLyogV2UgZG9uJ3QgaGF2ZSBhIFZCUiBiaXRyYXRlLCBzbyBwb3N0IHRoZSBhdmFpbGFibGUgYml0cmF0ZSBhcworICAgICAgICogbm9taW5hbCBhbmQgbGV0IGJhc2VwYXJzZSBjYWxjdWxhdGUgdGhlIHJlYWwgYml0cmF0ZSAqLworICAgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICAgIEdTVF9UQUdfTk9NSU5BTF9CSVRSQVRFLCBtcDNwYXJzZS0+aGRyX2JpdHJhdGUsIE5VTEwpOworICAgIH0KKworICAgIC8qIGFsc28gc2lnbmFscyB0aGUgZW5kIG9mIGZpcnN0LWZyYW1lIHByb2Nlc3NpbmcgKi8KKyAgICBtcDNwYXJzZS0+c2VudF9jb2RlY190YWcgPSBUUlVFOworICB9CisKKyAgLyogaWYgdGhlIHRhZ2xpc3QgZXhpc3RzLCB3ZSBuZWVkIHRvIHVwZGF0ZSBpdCBzbyBpdCBnZXRzIHNlbnQgb3V0ICovCisgIGlmICh0YWdsaXN0KSB7CisgICAgZ3N0X2Jhc2VfcGFyc2VfbWVyZ2VfdGFncyAocGFyc2UsIHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSk7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdsaXN0KTsKKyAgfQorCisgIC8qIHVzdWFsIGNsaXBwaW5nIGFwcGxpZXMgKi8KKyAgZnJhbWUtPmZsYWdzIHw9IEdTVF9CQVNFX1BBUlNFX0ZSQU1FX0ZMQUdfQ0xJUDsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfZmllbGRzIChHc3RDYXBzICogY2FwcykKK3sKKyAgZ3VpbnQgaSwgbjsKKworICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSk7CisKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAocywgInBhcnNlZCIpOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9tcGVnX2F1ZGlvX3BhcnNlX2dldF9zaW5rX2NhcHMgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICpwZWVyY2FwcywgKnRlbXBsOworICBHc3RDYXBzICpyZXM7CisKKyAgdGVtcGwgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU0lOS19QQUQgKHBhcnNlKSk7CisgIGlmIChmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICpmY29weSA9IGdzdF9jYXBzX2NvcHkgKGZpbHRlcik7CisgICAgLyogUmVtb3ZlIHRoZSBmaWVsZHMgd2UgY29udmVydCAqLworICAgIHJlbW92ZV9maWVsZHMgKGZjb3B5KTsKKyAgICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChwYXJzZSksIGZjb3B5KTsKKyAgICBnc3RfY2Fwc191bnJlZiAoZmNvcHkpOworICB9IGVsc2UKKyAgICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChwYXJzZSksIE5VTEwpOworCisgIGlmIChwZWVyY2FwcykgeworICAgIC8qIFJlbW92ZSB0aGUgcGFyc2VkIGZpZWxkICovCisgICAgcGVlcmNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChwZWVyY2Fwcyk7CisgICAgcmVtb3ZlX2ZpZWxkcyAocGVlcmNhcHMpOworCisgICAgcmVzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKHBlZXJjYXBzLCB0ZW1wbCwgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmICh0ZW1wbCk7CisgIH0gZWxzZSB7CisgICAgcmVzID0gdGVtcGw7CisgIH0KKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgaW50ZXJzZWN0aW9uID0KKyAgICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgcmVzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChyZXMpOworICAgIHJlcyA9IGludGVyc2VjdGlvbjsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmggYi9nc3QvYXVkaW9wYXJzZXJzL2dzdG1wZWdhdWRpb3BhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1NzZiZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0bXBlZ2F1ZGlvcGFyc2UuaApAQCAtMCwwICsxLDExMyBAQAorLyogR1N0cmVhbWVyIE1QRUcgYXVkaW8gcGFyc2VyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1dyB1c2VycyBzZiBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIENvbnRhY3Q6IFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9NUEVHX0FVRElPX1BBUlNFX0hfXworI2RlZmluZSBfX0dTVF9NUEVHX0FVRElPX1BBUlNFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2VwYXJzZS5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfTVBFR19BVURJT19QQVJTRSBcCisgIChnc3RfbXBlZ19hdWRpb19wYXJzZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfTVBFR19BVURJT19QQVJTRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLCBHU1RfVFlQRV9NUEVHX0FVRElPX1BBUlNFLCBHc3RNcGVnQXVkaW9QYXJzZSkpCisjZGVmaW5lIEdTVF9NUEVHX0FVRElPX1BBUlNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLCBHU1RfVFlQRV9NUEVHX0FVRElPX1BBUlNFLCBHc3RNcGVnQXVkaW9QYXJzZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX01QRUdfQVVESU9fUEFSU0Uob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSwgR1NUX1RZUEVfTVBFR19BVURJT19QQVJTRSkpCisjZGVmaW5lIEdTVF9JU19NUEVHX0FVRElPX1BBUlNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLCBHU1RfVFlQRV9NUEVHX0FVRElPX1BBUlNFKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1wZWdBdWRpb1BhcnNlIEdzdE1wZWdBdWRpb1BhcnNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1wZWdBdWRpb1BhcnNlQ2xhc3MgR3N0TXBlZ0F1ZGlvUGFyc2VDbGFzczsKKworLyoqCisgKiBHc3RNcGVnQXVkaW9QYXJzZToKKyAqCisgKiBUaGUgb3BhcXVlIEdzdE1wZWdBdWRpb1BhcnNlIG9iamVjdAorICovCitzdHJ1Y3QgX0dzdE1wZWdBdWRpb1BhcnNlIHsKKyAgR3N0QmFzZVBhcnNlIGJhc2VwYXJzZTsKKworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgZ2ludCAgICAgICAgIHJhdGU7CisgIGdpbnQgICAgICAgICBjaGFubmVsczsKKyAgZ2ludCAgICAgICAgIGxheWVyOworICBnaW50ICAgICAgICAgdmVyc2lvbjsKKworICBHc3RDbG9ja1RpbWUgbWF4X2JpdHJlc2Vydm9pcjsKKyAgLyogc2FtcGxlcyBwZXIgZnJhbWUgKi8KKyAgZ2ludCAgICAgICAgc3BmOworCisgIGdpbnQgICAgICAgICBmcmVlcmF0ZTsKKworICBnYm9vbGVhbiAgICAgc2VudF9jb2RlY190YWc7CisgIGd1aW50ICAgICAgICBsYXN0X3Bvc3RlZF9iaXRyYXRlOworICBnaW50ICAgICAgICAgbGFzdF9wb3N0ZWRfY3JjLCBsYXN0X2NyYzsKKyAgZ3VpbnQgICAgICAgIGxhc3RfcG9zdGVkX2NoYW5uZWxfbW9kZSwgbGFzdF9tb2RlOworCisgIC8qIEJpdHJhdGUgZnJvbSBub24tdmJyIGhlYWRlcnMgKi8KKyAgZ3VpbnQzMiAgICAgIGhkcl9iaXRyYXRlOworCisgIC8qIFhpbmcgaW5mbyAqLworICBndWludDMyICAgICAgeGluZ19mbGFnczsKKyAgZ3VpbnQzMiAgICAgIHhpbmdfZnJhbWVzOworICBHc3RDbG9ja1RpbWUgeGluZ190b3RhbF90aW1lOworICBndWludDMyICAgICAgeGluZ19ieXRlczsKKyAgLyogcGVyY2VudCAtPiBmaWxlcG9zIG1hcHBpbmcgKi8KKyAgZ3VjaGFyICAgICAgIHhpbmdfc2Vla190YWJsZVsxMDBdOworICAvKiBmaWxlcG9zIC0+IHBlcmNlbnQgbWFwcGluZyAqLworICBndWludDE2ICAgICAgeGluZ19zZWVrX3RhYmxlX2ludmVyc2VbMjU2XTsKKyAgZ3VpbnQzMiAgICAgIHhpbmdfdmJyX3NjYWxlOworICBndWludCAgICAgICAgeGluZ19iaXRyYXRlOworCisgIC8qIFZCUkkgaW5mbyAqLworICBndWludDMyICAgICAgdmJyaV9mcmFtZXM7CisgIEdzdENsb2NrVGltZSB2YnJpX3RvdGFsX3RpbWU7CisgIGd1aW50MzIgICAgICB2YnJpX2J5dGVzOworICBndWludCAgICAgICAgdmJyaV9iaXRyYXRlOworICBndWludCAgICAgICAgdmJyaV9zZWVrX3BvaW50czsKKyAgZ3VpbnQzMiAgICAgKnZicmlfc2Vla190YWJsZTsKKyAgZ2Jvb2xlYW4gICAgIHZicmlfdmFsaWQ7CisKKyAgLyogTEFNRSBpbmZvICovCisgIGd1aW50MzIgICAgICBlbmNvZGVyX2RlbGF5OworICBndWludDMyICAgICAgZW5jb2Rlcl9wYWRkaW5nOworfTsKKworLyoqCisgKiBHc3RNcGVnQXVkaW9QYXJzZUNsYXNzOgorICogQHBhcmVudF9jbGFzczogRWxlbWVudCBwYXJlbnQgY2xhc3MuCisgKgorICogVGhlIG9wYXF1ZSBHc3RNcGVnQXVkaW9QYXJzZUNsYXNzIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdE1wZWdBdWRpb1BhcnNlQ2xhc3MgeworICBHc3RCYXNlUGFyc2VDbGFzcyBiYXNlcGFyc2VfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfbXBlZ19hdWRpb19wYXJzZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9NUEVHX0FVRElPX1BBUlNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5jIGIvZ3N0L2F1ZGlvcGFyc2Vycy9nc3RzYmNwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYzM5ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9wYXJzZXJzL2dzdHNiY3BhcnNlLmMKQEAgLTAsMCArMSw1MzMgQEAKKy8qIEdTdHJlYW1lciBTQkMgYXVkaW8gcGFyc2VyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgQ29sbGFib3JhIEx0ZC4gPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtc2JjcGFyc2UKKyAqIEBzZWVfYWxzbzogc2JjZGVjLCBzYmNlbmMKKyAqCisgKiBUaGUgc2JjcGFyc2UgZWxlbWVudCB3aWxsIHBhcnNlIGEgYmx1ZXRvb3RoIFNCQyBhdWRpbyBzdHJlYW0gaW50bworICogZnJhbWVzIGFuZCB0aW1lc3RhbXAgdGhlbSBwcm9wZXJseS4KKyAqCisgKiBTaW5jZTogMS4yLjAKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RzYmNwYXJzZS5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L3RhZy90YWcuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9iYXNlLmg+CisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvcGJ1dGlscy5oPgorCisjZGVmaW5lIFNCQ19TWU5DQllURSAweDlDCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHNiY3BhcnNlX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHNiY3BhcnNlX2RlYnVnCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXNiYywgcGFyc2VkID0gKGJvb2xlYW4pIHRydWUsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgWyAxLCAyIF0sICIKKyAgICAgICAgInJhdGUgPSAoaW50KSB7IDE2MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXNiYyIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9zYmNfcGFyc2Vfc3RhcnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc2JjX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9zYmNfcGFyc2VfaGFuZGxlX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lLCBnaW50ICogc2tpcHNpemUpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3NiY19wYXJzZV9wcmVfcHVzaF9mcmFtZSAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3NiY19wYXJzZV9nZXRfc2lua19jYXBzIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RDYXBzICogZmlsdGVyKTsKKworc3RhdGljIGd1aW50OCBnc3Rfc2JjX2NhbGN1bGF0ZV9jcmM4IChjb25zdCBndWludDggKiBkYXRhLCBnaW50IGJpdHNfY3JjKTsKK3N0YXRpYyBnc2l6ZSBnc3Rfc2JjX2NhbGNfZnJhbWVsZW4gKGd1aW50IHN1YmJhbmRzLCBHc3RTYmNDaGFubmVsTW9kZSBjaF9tb2RlLAorICAgIGd1aW50IGJsb2NrcywgZ3VpbnQgYml0cG9vbCk7CitzdGF0aWMgZ3NpemUgZ3N0X3NiY19wYXJzZV9oZWFkZXIgKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50ICogcmF0ZSwKKyAgICBndWludCAqIG5fYmxvY2tzLCBHc3RTYmNDaGFubmVsTW9kZSAqIGNoX21vZGUsCisgICAgR3N0U2JjQWxsb2NhdGlvbk1ldGhvZCAqIGFsbG9jX21ldGhvZCwgZ3VpbnQgKiBuX3N1YmJhbmRzLCBndWludCAqIGJpdHBvb2wpOworCisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3Rfc2JjX3BhcnNlX3BhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0U2JjUGFyc2UsIGdzdF9zYmNfcGFyc2UsIEdTVF9UWVBFX0JBU0VfUEFSU0UpOworCitzdGF0aWMgdm9pZAorZ3N0X3NiY19wYXJzZV9jbGFzc19pbml0IChHc3RTYmNQYXJzZUNsYXNzICoga2xhc3MpCit7CisgIEdzdEJhc2VQYXJzZUNsYXNzICpiYXNlcGFyc2VfY2xhc3MgPSBHU1RfQkFTRV9QQVJTRV9DTEFTUyAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChzYmNwYXJzZV9kZWJ1ZywgInNiY3BhcnNlIiwgMCwgIlNCQyBhdWRpbyBwYXJzZXIiKTsKKworICBiYXNlcGFyc2VfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zYmNfcGFyc2Vfc3RhcnQpOworICBiYXNlcGFyc2VfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NiY19wYXJzZV9zdG9wKTsKKyAgYmFzZXBhcnNlX2NsYXNzLT5wcmVfcHVzaF9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NiY19wYXJzZV9wcmVfcHVzaF9mcmFtZSk7CisgIGJhc2VwYXJzZV9jbGFzcy0+aGFuZGxlX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2JjX3BhcnNlX2hhbmRsZV9mcmFtZSk7CisgIGJhc2VwYXJzZV9jbGFzcy0+Z2V0X3NpbmtfY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NiY19wYXJzZV9nZXRfc2lua19jYXBzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzaW5rX2ZhY3RvcnkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJTQkMgYXVkaW8gcGFyc2VyIiwKKyAgICAgICJDb2RlYy9QYXJzZXIvQXVkaW8iLCAiUGFyc2VzIGFuIFNCQyBibHVldG9vdGggYXVkaW8gc3RyZWFtIiwKKyAgICAgICJUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zYmNfcGFyc2VfcmVzZXQgKEdzdFNiY1BhcnNlICogc2JjcGFyc2UpCit7CisgIHNiY3BhcnNlLT5hbGxvY19tZXRob2QgPSBHU1RfU0JDX0FMTE9DQVRJT05fTUVUSE9EX0lOVkFMSUQ7CisgIHNiY3BhcnNlLT5jaF9tb2RlID0gR1NUX1NCQ19DSEFOTkVMX01PREVfSU5WQUxJRDsKKyAgc2JjcGFyc2UtPnJhdGUgPSAtMTsKKyAgc2JjcGFyc2UtPm5fYmxvY2tzID0gLTE7CisgIHNiY3BhcnNlLT5uX3N1YmJhbmRzID0gLTE7CisgIHNiY3BhcnNlLT5iaXRwb29sID0gLTE7CisgIHNiY3BhcnNlLT5zZW50X2NvZGVjX3RhZyA9IEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NiY19wYXJzZV9pbml0IChHc3RTYmNQYXJzZSAqIHNiY3BhcnNlKQoreworICBnc3Rfc2JjX3BhcnNlX3Jlc2V0IChzYmNwYXJzZSk7CisgIEdTVF9QQURfU0VUX0FDQ0VQVF9JTlRFUlNFQ1QgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChzYmNwYXJzZSkpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChzYmNwYXJzZSkpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zYmNfcGFyc2Vfc3RhcnQgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKQoreworICBnc3RfYmFzZV9wYXJzZV9zZXRfbWluX2ZyYW1lX3NpemUgKHBhcnNlLAorICAgICAgZ3N0X3NiY19jYWxjX2ZyYW1lbGVuICg0LCBHU1RfU0JDX0NIQU5ORUxfTU9ERV9NT05PLCA0LCAyKSk7CisKKyAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X2hhc190aW1pbmdfaW5mbyAocGFyc2UsIEZBTFNFKTsKKworICBnc3RfYmFzZV9wYXJzZV9zZXRfc3luY2FibGUgKHBhcnNlLCBUUlVFKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2JjX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKQoreworICBnc3Rfc2JjX3BhcnNlX3Jlc2V0IChHU1RfU0JDX1BBUlNFIChwYXJzZSkpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICoKK2dzdF9zYmNfY2hhbm5lbF9tb2RlX2dldF9uYW1lIChHc3RTYmNDaGFubmVsTW9kZSBjaF9tb2RlKQoreworICBzd2l0Y2ggKGNoX21vZGUpIHsKKyAgICBjYXNlIEdTVF9TQkNfQ0hBTk5FTF9NT0RFX01PTk86CisgICAgICByZXR1cm4gIm1vbm8iOworICAgIGNhc2UgR1NUX1NCQ19DSEFOTkVMX01PREVfRFVBTDoKKyAgICAgIHJldHVybiAiZHVhbCI7CisgICAgY2FzZSBHU1RfU0JDX0NIQU5ORUxfTU9ERV9TVEVSRU86CisgICAgICByZXR1cm4gInN0ZXJlbyI7CisgICAgY2FzZSBHU1RfU0JDX0NIQU5ORUxfTU9ERV9KT0lOVF9TVEVSRU86CisgICAgICByZXR1cm4gImpvaW50IjsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuICJpbnZhbGlkIjsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICoKK2dzdF9zYmNfYWxsb2NhdGlvbl9tZXRob2RfZ2V0X25hbWUgKEdzdFNiY0FsbG9jYXRpb25NZXRob2QgYWxsb2NfbWV0aG9kKQoreworICBzd2l0Y2ggKGFsbG9jX21ldGhvZCkgeworICAgIGNhc2UgR1NUX1NCQ19BTExPQ0FUSU9OX01FVEhPRF9TTlI6CisgICAgICByZXR1cm4gInNuciI7CisgICAgY2FzZSBHU1RfU0JDX0FMTE9DQVRJT05fTUVUSE9EX0xPVURORVNTOgorICAgICAgcmV0dXJuICJsb3VkbmVzcyI7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAiaW52YWxpZCI7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfc2JjX3BhcnNlX2hhbmRsZV9mcmFtZSAoR3N0QmFzZVBhcnNlICogcGFyc2UsIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUsCisgICAgZ2ludCAqIHNraXBzaXplKQoreworICBHc3RTYmNQYXJzZSAqc2JjcGFyc2UgPSBHU1RfU0JDX1BBUlNFIChwYXJzZSk7CisgIEdzdFNiY0FsbG9jYXRpb25NZXRob2QgYWxsb2NfbWV0aG9kID0gR1NUX1NCQ19BTExPQ0FUSU9OX01FVEhPRF9JTlZBTElEOworICBHc3RTYmNDaGFubmVsTW9kZSBjaF9tb2RlID0gR1NUX1NCQ19DSEFOTkVMX01PREVfSU5WQUxJRDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50IHJhdGUgPSAwLCBuX2Jsb2NrcyA9IDAsIG5fc3ViYmFuZHMgPSAwLCBiaXRwb29sID0gMDsKKyAgZ3NpemUgZnJhbWVfbGVuLCBuZXh0X2xlbjsKKyAgZ2ludCBpLCBtYXhfZnJhbWVzOworCisgIGdzdF9idWZmZXJfbWFwIChmcmFtZS0+YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIGdfYXNzZXJ0IChtYXAuc2l6ZSA+PSA2KTsKKworICBmcmFtZV9sZW4gPSBnc3Rfc2JjX3BhcnNlX2hlYWRlciAobWFwLmRhdGEsICZyYXRlLCAmbl9ibG9ja3MsICZjaF9tb2RlLAorICAgICAgJmFsbG9jX21ldGhvZCwgJm5fc3ViYmFuZHMsICZiaXRwb29sKTsKKworICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJmcmFtZV9sZW46ICV1IiwgKGd1aW50KSBmcmFtZV9sZW4pOworCisgIGlmIChmcmFtZV9sZW4gPT0gMCkKKyAgICBnb3RvIHJlc3luYzsKKworICBpZiAoc2JjcGFyc2UtPmFsbG9jX21ldGhvZCAhPSBhbGxvY19tZXRob2QKKyAgICAgIHx8IHNiY3BhcnNlLT5jaF9tb2RlICE9IGNoX21vZGUKKyAgICAgIHx8IHNiY3BhcnNlLT5yYXRlICE9IHJhdGUKKyAgICAgIHx8IHNiY3BhcnNlLT5uX2Jsb2NrcyAhPSBuX2Jsb2NrcworICAgICAgfHwgc2JjcGFyc2UtPm5fc3ViYmFuZHMgIT0gbl9zdWJiYW5kcyB8fCBzYmNwYXJzZS0+Yml0cG9vbCAhPSBiaXRwb29sKSB7CisgICAgZ3VpbnQgYXZnX2JpdHJhdGU7CisgICAgR3N0Q2FwcyAqY2FwczsKKworICAgIC8qIEZJWE1FOiBkbyBhbGwgb2YgdGhlc2UgbmVlZCB0byBiZSBpbiB0aGUgY2Fwcz8gKi8KKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtc2JjIiwgInJhdGUiLCBHX1RZUEVfSU5ULCByYXRlLAorICAgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAoY2hfbW9kZSA9PSBHU1RfU0JDX0NIQU5ORUxfTU9ERV9NT05PKSA/IDEgOiAyLAorICAgICAgICAiY2hhbm5lbC1tb2RlIiwgR19UWVBFX1NUUklORywgZ3N0X3NiY19jaGFubmVsX21vZGVfZ2V0X25hbWUgKGNoX21vZGUpLAorICAgICAgICAiYmxvY2tzIiwgR19UWVBFX0lOVCwgbl9ibG9ja3MsICJzdWJiYW5kcyIsIEdfVFlQRV9JTlQsIG5fc3ViYmFuZHMsCisgICAgICAgICJhbGxvY2F0aW9uLW1ldGhvZCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgIGdzdF9zYmNfYWxsb2NhdGlvbl9tZXRob2RfZ2V0X25hbWUgKGFsbG9jX21ldGhvZCksCisgICAgICAgICJiaXRwb29sIiwgR19UWVBFX0lOVCwgYml0cG9vbCwgInBhcnNlZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKworICAgIEdTVF9JTkZPX09CSkVDVCAoc2JjcGFyc2UsICJjYXBzIGNoYW5nZWQgdG8gJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChzYmNwYXJzZSksCisgICAgICAgIGdzdF9ldmVudF9uZXdfY2FwcyAoY2FwcykpOworCisgICAgYXZnX2JpdHJhdGUgPSAoOCAqIGZyYW1lX2xlbiAqIHJhdGUpIC8gKG5fc3ViYmFuZHMgKiBuX2Jsb2Nrcyk7CisgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X2F2ZXJhZ2VfYml0cmF0ZSAocGFyc2UsIGF2Z19iaXRyYXRlKTsKKworICAgIGdzdF9iYXNlX3BhcnNlX3NldF9mcmFtZV9yYXRlIChwYXJzZSwgcmF0ZSwgbl9zdWJiYW5kcyAqIG5fYmxvY2tzLCAwLCAwKTsKKworICAgIHNiY3BhcnNlLT5hbGxvY19tZXRob2QgPSBhbGxvY19tZXRob2Q7CisgICAgc2JjcGFyc2UtPmNoX21vZGUgPSBjaF9tb2RlOworICAgIHNiY3BhcnNlLT5yYXRlID0gcmF0ZTsKKyAgICBzYmNwYXJzZS0+bl9ibG9ja3MgPSBuX2Jsb2NrczsKKyAgICBzYmNwYXJzZS0+bl9zdWJiYW5kcyA9IG5fc3ViYmFuZHM7CisgICAgc2JjcGFyc2UtPmJpdHBvb2wgPSBiaXRwb29sOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9CisKKyAgaWYgKGZyYW1lX2xlbiA+IG1hcC5zaXplKQorICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGZyYW1lLT5idWZmZXIpID0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORTsKKyAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChmcmFtZS0+YnVmZmVyKSA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisKKyAgLyogY29tcGxldGVseSBhcmJpdHJhcnkgbGltaXQsIHdlIG9ubHkgcHJvY2VzcyBkYXRhIHdlIGFscmVhZHkgaGF2ZSwKKyAgICogc28gd2UgYXJlbid0IGludHJvZHVjaW5nIGxhdGVuY3kgaGVyZSAqLworICBtYXhfZnJhbWVzID0gTUlOIChtYXAuc2l6ZSAvIGZyYW1lX2xlbiwgbl9ibG9ja3MgKiBuX3N1YmJhbmRzICogNSk7CisgIEdTVF9MT0dfT0JKRUNUIChzYmNwYXJzZSwgInBhcnNpbmcgdXAgdG8gJWQgZnJhbWVzIiwgbWF4X2ZyYW1lcyk7CisKKyAgZm9yIChpID0gMTsgaSA8IG1heF9mcmFtZXM7ICsraSkgeworICAgIG5leHRfbGVuID0gZ3N0X3NiY19wYXJzZV9oZWFkZXIgKG1hcC5kYXRhICsgKGkgKiBmcmFtZV9sZW4pLCAmcmF0ZSwKKyAgICAgICAgJm5fYmxvY2tzLCAmY2hfbW9kZSwgJmFsbG9jX21ldGhvZCwgJm5fc3ViYmFuZHMsICZiaXRwb29sKTsKKworICAgIGlmIChuZXh0X2xlbiAhPSBmcmFtZV9sZW4gfHwgc2JjcGFyc2UtPmFsbG9jX21ldGhvZCAhPSBhbGxvY19tZXRob2QgfHwKKyAgICAgICAgc2JjcGFyc2UtPmNoX21vZGUgIT0gY2hfbW9kZSB8fCBzYmNwYXJzZS0+cmF0ZSAhPSByYXRlIHx8CisgICAgICAgIHNiY3BhcnNlLT5uX2Jsb2NrcyAhPSBuX2Jsb2NrcyB8fCBzYmNwYXJzZS0+bl9zdWJiYW5kcyAhPSBuX3N1YmJhbmRzIHx8CisgICAgICAgIHNiY3BhcnNlLT5iaXRwb29sICE9IGJpdHBvb2wpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBHU1RfTE9HX09CSkVDVCAoc2JjcGFyc2UsICJwYWNraW5nICVkIFNCQyBmcmFtZXMgaW50byBuZXh0IG91dHB1dCBidWZmZXIiLCBpKTsKKworICAvKiBOb3RlOiBsb2NhbCBuX3N1YmJhbmRzIGFuZCBuX2Jsb2NrcyB2YXJpYWJsZXMgbWlnaHQgYmUgdGFpbnRlZCBpZiB3ZQorICAgKiBiYWlsZWQgb3V0IG9mIHRoZSBsb29wIGFib3ZlIGJlY2F1c2Ugb2YgYSBoZWFkZXIgY29uZmlndXJhdGlvbiBtaXNtYXRjaCAqLworICBnc3RfYmFzZV9wYXJzZV9zZXRfZnJhbWVfcmF0ZSAocGFyc2UsIHJhdGUsCisgICAgICBzYmNwYXJzZS0+bl9zdWJiYW5kcyAqIHNiY3BhcnNlLT5uX2Jsb2NrcyAqIGksIDAsIDApOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGZyYW1lLT5idWZmZXIsICZtYXApOworICByZXR1cm4gZ3N0X2Jhc2VfcGFyc2VfZmluaXNoX2ZyYW1lIChwYXJzZSwgZnJhbWUsIGkgKiBmcmFtZV9sZW4pOworCityZXN5bmM6CisgIHsKKyAgICBjb25zdCBndWludDggKnBvc3NpYmxlX3N5bmM7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIm5vIHN5bmMsIHJlc3luY2luZyIpOworCisgICAgcG9zc2libGVfc3luYyA9IG1lbWNociAobWFwLmRhdGEsIFNCQ19TWU5DQllURSwgbWFwLnNpemUpOworCisgICAgaWYgKHBvc3NpYmxlX3N5bmMgIT0gTlVMTCkKKyAgICAgICpza2lwc2l6ZSA9IChnaW50KSAocG9zc2libGVfc3luYyAtIG1hcC5kYXRhKTsKKyAgICBlbHNlCisgICAgICAqc2tpcHNpemUgPSBtYXAuc2l6ZTsKKworICAgIGdzdF9idWZmZXJfdW5tYXAgKGZyYW1lLT5idWZmZXIsICZtYXApOworCisgICAgLyogd2UgY291bGQgb3B0aW1pc2UgdGhpbmdzIGhlcmUgYnkgbG9vcGluZyBvdmVyIHRoZSBkYXRhIGFuZCBjaGVja2luZworICAgICAqIHdoZXRoZXIgdGhlIHN5bmMgaXMgZ29vZCBvciBub3QgaW5zdGVhZCBvZiBoYW5kaW5nIGNvbnRyb2wgYmFjayB0bworICAgICAqIHRoZSBiYXNlIGNsYXNzIGp1c3QgdG8gYmUgY2FsbGVkIGFnYWluICovCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CituZWVkX21vcmVfZGF0YToKKyAgeworICAgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgIm5lZWQgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcywgYnV0IG9ubHkgaGF2ZSAlIiBHX0dTSVpFX0ZPUk1BVCwKKyAgICAgICAgZnJhbWVfbGVuLCBtYXAuc2l6ZSk7CisgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChwYXJzZSwgZnJhbWVfbGVuKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChmcmFtZS0+YnVmZmVyLCAmbWFwKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9maWVsZHMgKEdzdENhcHMgKiBjYXBzKQoreworICBndWludCBpLCBuOworCisgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCAicGFyc2VkIik7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3NiY19wYXJzZV9nZXRfc2lua19jYXBzIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqcGVlcmNhcHMsICp0ZW1wbDsKKyAgR3N0Q2FwcyAqcmVzOworCisgIHRlbXBsID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEIChwYXJzZSkpOworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqZmNvcHkgPSBnc3RfY2Fwc19jb3B5IChmaWx0ZXIpOworICAgIC8qIFJlbW92ZSB0aGUgZmllbGRzIHdlIGNvbnZlcnQgKi8KKyAgICByZW1vdmVfZmllbGRzIChmY29weSk7CisgICAgcGVlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpLCBmY29weSk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGZjb3B5KTsKKyAgfSBlbHNlCisgICAgcGVlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpLCBOVUxMKTsKKworICBpZiAocGVlcmNhcHMpIHsKKyAgICAvKiBSZW1vdmUgdGhlIHBhcnNlZCBmaWVsZCAqLworICAgIHBlZXJjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocGVlcmNhcHMpOworICAgIHJlbW92ZV9maWVsZHMgKHBlZXJjYXBzKTsKKworICAgIHJlcyA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChwZWVyY2FwcywgdGVtcGwsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGVtcGwpOworICB9IGVsc2UgeworICAgIHJlcyA9IHRlbXBsOworICB9CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmludGVyc2VjdGlvbjsKKworICAgIGludGVyc2VjdGlvbiA9CisgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHJlcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmVzKTsKKyAgICByZXMgPSBpbnRlcnNlY3Rpb247CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgY29uc3QgZ3VpbnQ4IGNyY190YWJsZVsyNTZdID0geworICAweDAwLCAweDFELCAweDNBLCAweDI3LCAweDc0LCAweDY5LCAweDRFLCAweDUzLAorICAweEU4LCAweEY1LCAweEQyLCAweENGLCAweDlDLCAweDgxLCAweEE2LCAweEJCLAorICAweENELCAweEQwLCAweEY3LCAweEVBLCAweEI5LCAweEE0LCAweDgzLCAweDlFLAorICAweDI1LCAweDM4LCAweDFGLCAweDAyLCAweDUxLCAweDRDLCAweDZCLCAweDc2LAorICAweDg3LCAweDlBLCAweEJELCAweEEwLCAweEYzLCAweEVFLCAweEM5LCAweEQ0LAorICAweDZGLCAweDcyLCAweDU1LCAweDQ4LCAweDFCLCAweDA2LCAweDIxLCAweDNDLAorICAweDRBLCAweDU3LCAweDcwLCAweDZELCAweDNFLCAweDIzLCAweDA0LCAweDE5LAorICAweEEyLCAweEJGLCAweDk4LCAweDg1LCAweEQ2LCAweENCLCAweEVDLCAweEYxLAorICAweDEzLCAweDBFLCAweDI5LCAweDM0LCAweDY3LCAweDdBLCAweDVELCAweDQwLAorICAweEZCLCAweEU2LCAweEMxLCAweERDLCAweDhGLCAweDkyLCAweEI1LCAweEE4LAorICAweERFLCAweEMzLCAweEU0LCAweEY5LCAweEFBLCAweEI3LCAweDkwLCAweDhELAorICAweDM2LCAweDJCLCAweDBDLCAweDExLCAweDQyLCAweDVGLCAweDc4LCAweDY1LAorICAweDk0LCAweDg5LCAweEFFLCAweEIzLCAweEUwLCAweEZELCAweERBLCAweEM3LAorICAweDdDLCAweDYxLCAweDQ2LCAweDVCLCAweDA4LCAweDE1LCAweDMyLCAweDJGLAorICAweDU5LCAweDQ0LCAweDYzLCAweDdFLCAweDJELCAweDMwLCAweDE3LCAweDBBLAorICAweEIxLCAweEFDLCAweDhCLCAweDk2LCAweEM1LCAweEQ4LCAweEZGLCAweEUyLAorICAweDI2LCAweDNCLCAweDFDLCAweDAxLCAweDUyLCAweDRGLCAweDY4LCAweDc1LAorICAweENFLCAweEQzLCAweEY0LCAweEU5LCAweEJBLCAweEE3LCAweDgwLCAweDlELAorICAweEVCLCAweEY2LCAweEQxLCAweENDLCAweDlGLCAweDgyLCAweEE1LCAweEI4LAorICAweDAzLCAweDFFLCAweDM5LCAweDI0LCAweDc3LCAweDZBLCAweDRELCAweDUwLAorICAweEExLCAweEJDLCAweDlCLCAweDg2LCAweEQ1LCAweEM4LCAweEVGLCAweEYyLAorICAweDQ5LCAweDU0LCAweDczLCAweDZFLCAweDNELCAweDIwLCAweDA3LCAweDFBLAorICAweDZDLCAweDcxLCAweDU2LCAweDRCLCAweDE4LCAweDA1LCAweDIyLCAweDNGLAorICAweDg0LCAweDk5LCAweEJFLCAweEEzLCAweEYwLCAweEVELCAweENBLCAweEQ3LAorICAweDM1LCAweDI4LCAweDBGLCAweDEyLCAweDQxLCAweDVDLCAweDdCLCAweDY2LAorICAweERELCAweEMwLCAweEU3LCAweEZBLCAweEE5LCAweEI0LCAweDkzLCAweDhFLAorICAweEY4LCAweEU1LCAweEMyLCAweERGLCAweDhDLCAweDkxLCAweEI2LCAweEFCLAorICAweDEwLCAweDBELCAweDJBLCAweDM3LCAweDY0LCAweDc5LCAweDVFLCAweDQzLAorICAweEIyLCAweEFGLCAweDg4LCAweDk1LCAweEM2LCAweERCLCAweEZDLCAweEUxLAorICAweDVBLCAweDQ3LCAweDYwLCAweDdELCAweDJFLCAweDMzLCAweDE0LCAweDA5LAorICAweDdGLCAweDYyLCAweDQ1LCAweDU4LCAweDBCLCAweDE2LCAweDMxLCAweDJDLAorICAweDk3LCAweDhBLCAweEFELCAweEIwLCAweEUzLCAweEZFLCAweEQ5LCAweEM0Cit9OworCitzdGF0aWMgZ3VpbnQ4Citnc3Rfc2JjX2NhbGN1bGF0ZV9jcmM4IChjb25zdCBndWludDggKiBkYXRhLCBnaW50IGNyY19iaXRzKQoreworICBndWludDggY3JjID0gMHgwZjsKKyAgZ3VpbnQ4IG9jdGV0OworCisgIHdoaWxlIChjcmNfYml0cyA+PSA4KSB7CisgICAgY3JjID0gY3JjX3RhYmxlW2NyYyBeICpkYXRhXTsKKyAgICBjcmNfYml0cyAtPSA4OworICAgICsrZGF0YTsKKyAgfQorCisgIG9jdGV0ID0gKmRhdGE7CisgIHdoaWxlIChjcmNfYml0cyA+IDApIHsKKyAgICBnY2hhciBiaXQgPSAoKG9jdGV0IF4gY3JjKSAmIDB4ODApID4+IDc7CisKKyAgICBjcmMgPSAoKGNyYyAmIDB4N2YpIDw8IDEpIF4gKGJpdCA/IDB4MWQgOiAwKTsKKworICAgIG9jdGV0ID0gb2N0ZXQgPDwgMTsKKyAgICAtLWNyY19iaXRzOworICB9CisKKyAgcmV0dXJuIGNyYzsKK30KKworc3RhdGljIGdzaXplCitnc3Rfc2JjX2NhbGNfZnJhbWVsZW4gKGd1aW50IHN1YmJhbmRzLCBHc3RTYmNDaGFubmVsTW9kZSBjaF9tb2RlLAorICAgIGd1aW50IGJsb2NrcywgZ3VpbnQgYml0cG9vbCkKK3sKKyAgc3dpdGNoIChjaF9tb2RlKSB7CisgICAgY2FzZSBHU1RfU0JDX0NIQU5ORUxfTU9ERV9NT05POgorICAgICAgcmV0dXJuIDQgKyAoc3ViYmFuZHMgKiAxKSAvIDIgKyAoKGJsb2NrcyAqIDEgKiBiaXRwb29sKSArIDcpIC8gODsKKyAgICBjYXNlIEdTVF9TQkNfQ0hBTk5FTF9NT0RFX0RVQUw6CisgICAgICByZXR1cm4gNCArIChzdWJiYW5kcyAqIDIpIC8gMiArICgoYmxvY2tzICogMiAqIGJpdHBvb2wpICsgNykgLyA4OworICAgIGNhc2UgR1NUX1NCQ19DSEFOTkVMX01PREVfU1RFUkVPOgorICAgICAgcmV0dXJuIDQgKyAoc3ViYmFuZHMgKiAyKSAvIDIgKyAoKGJsb2NrcyAqIGJpdHBvb2wpICsgNykgLyA4OworICAgIGNhc2UgR1NUX1NCQ19DSEFOTkVMX01PREVfSk9JTlRfU1RFUkVPOgorICAgICAgcmV0dXJuIDQgKyAoc3ViYmFuZHMgKiAyKSAvIDIgKyAoKHN1YmJhbmRzICsgYmxvY2tzICogYml0cG9vbCkgKyA3KSAvIDg7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgZ19yZXR1cm5fdmFsX2lmX3JlYWNoZWQgKDApOworfQorCitzdGF0aWMgZ3NpemUKK2dzdF9zYmNfcGFyc2VfaGVhZGVyIChjb25zdCBndWludDggKiBkYXRhLCBndWludCAqIHJhdGUsIGd1aW50ICogbl9ibG9ja3MsCisgICAgR3N0U2JjQ2hhbm5lbE1vZGUgKiBjaF9tb2RlLCBHc3RTYmNBbGxvY2F0aW9uTWV0aG9kICogYWxsb2NfbWV0aG9kLAorICAgIGd1aW50ICogbl9zdWJiYW5kcywgZ3VpbnQgKiBiaXRwb29sKQoreworICBzdGF0aWMgY29uc3QgZ3VpbnQxNiBzYmNfcmF0ZXNbNF0gPSB7IDE2MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH07CisgIHN0YXRpYyBjb25zdCBndWludDggc2JjX2Jsb2Nrc1s0XSA9IHsgNCwgOCwgMTIsIDE2IH07CisgIGd1aW50OCBjcmNfZGF0YVsyICsgMSArIDhdLCBjcmNfYml0cywgaTsKKworICBHU1RfTUVNRFVNUCAoImhlYWRlciIsIGRhdGEsIDgpOworCisgIGlmIChkYXRhWzBdICE9IFNCQ19TWU5DQllURSkKKyAgICByZXR1cm4gMDsKKworICAqcmF0ZSA9IHNiY19yYXRlc1soZGF0YVsxXSA+PiA2KSAmIDB4MDNdOworICAqbl9ibG9ja3MgPSBzYmNfYmxvY2tzWyhkYXRhWzFdID4+IDQpICYgMHgwM107CisgICpjaF9tb2RlID0gKEdzdFNiY0NoYW5uZWxNb2RlKSAoKGRhdGFbMV0gPj4gMikgJiAweDAzKTsKKyAgKmFsbG9jX21ldGhvZCA9IChkYXRhWzFdID4+IDEpICYgMHgwMTsKKyAgKm5fc3ViYmFuZHMgPSAoZGF0YVsxXSAmIDB4MDEpID8gOCA6IDQ7CisgICpiaXRwb29sID0gZGF0YVsyXTsKKworICBHU1RfVFJBQ0UgKCJyYXRlPSV1LCBuX2Jsb2Nrcz0ldSwgY2hfbW9kZT0ldSwgYWxsb2NfbWV0aG9kPSV1LCAiCisgICAgICAibl9zdWJiYW5kcz0ldSwgYml0cG9vbD0ldSIsICpyYXRlLCAqbl9ibG9ja3MsICpjaF9tb2RlLCAqYWxsb2NfbWV0aG9kLAorICAgICAgKm5fc3ViYmFuZHMsICpiaXRwb29sKTsKKworICBpZiAoKmJpdHBvb2wgPCAyKQorICAgIHJldHVybiAwOworCisgIC8qIGNoZWNrIENSQyAqLworICBjcmNfZGF0YVswXSA9IGRhdGFbMV07CisgIGNyY19kYXRhWzFdID0gZGF0YVsyXTsKKyAgY3JjX2JpdHMgPSAxNjsKKworICAvKiBqb2ludCBmbGFncyBhbmQgUkZBICovCisgIGlmICgqY2hfbW9kZSA9PSBHU1RfU0JDX0NIQU5ORUxfTU9ERV9KT0lOVF9TVEVSRU8pCisgICAgY3JjX2JpdHMgKz0gKm5fc3ViYmFuZHM7CisKKyAgLyogc2NhbGUgZmFjdG9ycyAqLworICBpZiAoKmNoX21vZGUgPT0gR1NUX1NCQ19DSEFOTkVMX01PREVfTU9OTykKKyAgICBjcmNfYml0cyArPSAqbl9zdWJiYW5kcyAqIDEgKiA0OworICBlbHNlCisgICAgY3JjX2JpdHMgKz0gKm5fc3ViYmFuZHMgKiAyICogNDsKKworICBmb3IgKGkgPSAxNjsgaSA8IGNyY19iaXRzOyBpICs9IDgpIHsKKyAgICBjcmNfZGF0YVtpIC8gOF0gPSBkYXRhWzEgKyAoaSAvIDgpICsgMV07CisgIH0KKworICBpZiAoaSA+IGNyY19iaXRzKSB7CisgICAgY3JjX2RhdGFbKGkgLyA4KSAtIDFdICY9IDB4RjA7CisgIH0KKworICBHU1RfTUVNRFVNUCAoImNyYyBieXRlcyIsIGNyY19kYXRhLCBHU1RfUk9VTkRfVVBfOCAoY3JjX2JpdHMpIC8gOCk7CisgIGlmIChnc3Rfc2JjX2NhbGN1bGF0ZV9jcmM4IChjcmNfZGF0YSwgY3JjX2JpdHMpICE9IGRhdGFbM10pIHsKKyAgICBHU1RfTE9HICgiaGVhZGVyIENSQyBjaGVjayBmYWlsZWQsIGJpdHM9JXUsIGdvdCAweCUwMngsIGV4cGVjdGVkIDB4JTAyeCIsCisgICAgICAgIGNyY19iaXRzLCBnc3Rfc2JjX2NhbGN1bGF0ZV9jcmM4IChjcmNfZGF0YSwgY3JjX2JpdHMpLCBkYXRhWzNdKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiBnc3Rfc2JjX2NhbGNfZnJhbWVsZW4gKCpuX3N1YmJhbmRzLCAqY2hfbW9kZSwgKm5fYmxvY2tzLCAqYml0cG9vbCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfc2JjX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0U2JjUGFyc2UgKnNiY3BhcnNlID0gR1NUX1NCQ19QQVJTRSAocGFyc2UpOworCisgIGlmICghc2JjcGFyc2UtPnNlbnRfY29kZWNfdGFnKSB7CisgICAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgLyogY29kZWMgdGFnICovCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpKTsKKyAgICBpZiAoR19VTkxJS0VMWSAoY2FwcyA9PSBOVUxMKSkgeworICAgICAgaWYgKEdTVF9QQURfSVNfRkxVU0hJTkcgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSkpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgZmx1c2hpbmciKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgbm90IG5lZ290aWF0ZWQhIik7CisgICAgICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgICBnc3RfcGJfdXRpbHNfYWRkX2NvZGVjX2Rlc2NyaXB0aW9uX3RvX3RhZ19saXN0ICh0YWdsaXN0LAorICAgICAgICBHU1RfVEFHX0FVRElPX0NPREVDLCBjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICBnc3RfYmFzZV9wYXJzZV9tZXJnZV90YWdzIChwYXJzZSwgdGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ2xpc3QpOworCisgICAgLyogYWxzbyBzaWduYWxzIHRoZSBlbmQgb2YgZmlyc3QtZnJhbWUgcHJvY2Vzc2luZyAqLworICAgIHNiY3BhcnNlLT5zZW50X2NvZGVjX3RhZyA9IFRSVUU7CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXVkaW9wYXJzZXJzL2dzdHNiY3BhcnNlLmggYi9nc3QvYXVkaW9wYXJzZXJzL2dzdHNiY3BhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQyMDRiZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0c2JjcGFyc2UuaApAQCAtMCwwICsxLDc2IEBACisvKiBHU3RyZWFtZXIgU0JDIGF1ZGlvIHBhcnNlcgorICogQ29weXJpZ2h0IChDKSAyMDEyIENvbGxhYm9yYSBMdGQuIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1NCQ19QQVJTRV9IX0lOQ0xVREVEX18KKyNkZWZpbmUgX19HU1RfU0JDX1BBUlNFX0hfSU5DTFVERURfXworCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXBhcnNlLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9TQkNfUEFSU0UgICAgICAgICAgICAoZ3N0X3NiY19wYXJzZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfU0JDX1BBUlNFKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfU0JDX1BBUlNFLEdzdFNiY1BhcnNlKSkKKyNkZWZpbmUgR1NUX1NCQ19QQVJTRV9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfU0JDX1BBUlNFLEdzdFNiY1BhcnNlQ2xhc3MpKQorI2RlZmluZSBHU1RfU0JDX1BBUlNFX0dFVF9DTEFTUyhvYmopICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUygob2JqKSxHU1RfVFlQRV9TQkNfUEFSU0UsR3N0U2JjUGFyc2VDbGFzcykpCisjZGVmaW5lIEdTVF9JU19TQkNfUEFSU0Uob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9TQkNfUEFSU0UpKQorI2RlZmluZSBHU1RfSVNfU0JDX1BBUlNFX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9TQkNfUEFSU0UpKQorI2RlZmluZSBHU1RfU0JDX1BBUlNFX0NBU1Qob2JqKSAgICAgICAoKEdzdFNiY1BhcnNlICopKG9iaikpCisKK3R5cGVkZWYgZW51bSB7CisgIEdTVF9TQkNfQ0hBTk5FTF9NT0RFX0lOVkFMSUQgPSAtMSwKKyAgR1NUX1NCQ19DSEFOTkVMX01PREVfTU9OTyA9IDAsCisgIEdTVF9TQkNfQ0hBTk5FTF9NT0RFX0RVQUwgPSAxLAorICBHU1RfU0JDX0NIQU5ORUxfTU9ERV9TVEVSRU8gPSAyLAorICBHU1RfU0JDX0NIQU5ORUxfTU9ERV9KT0lOVF9TVEVSRU8gPSAzCit9IEdzdFNiY0NoYW5uZWxNb2RlOworCit0eXBlZGVmIGVudW0geworICBHU1RfU0JDX0FMTE9DQVRJT05fTUVUSE9EX0lOVkFMSUQgPSAtMSwKKyAgR1NUX1NCQ19BTExPQ0FUSU9OX01FVEhPRF9MT1VETkVTUyA9IDAsCisgIEdTVF9TQkNfQUxMT0NBVElPTl9NRVRIT0RfU05SID0gMQorfSBHc3RTYmNBbGxvY2F0aW9uTWV0aG9kOworCit0eXBlZGVmIHN0cnVjdCBfR3N0U2JjUGFyc2UgR3N0U2JjUGFyc2U7Cit0eXBlZGVmIHN0cnVjdCBfR3N0U2JjUGFyc2VDbGFzcyBHc3RTYmNQYXJzZUNsYXNzOworCitzdHJ1Y3QgX0dzdFNiY1BhcnNlIHsKKyAgR3N0QmFzZVBhcnNlIGJhc2VwYXJzZTsKKworICAvKiBjdXJyZW50IG91dHB1dCBmb3JtYXQgKi8KKyAgR3N0U2JjQWxsb2NhdGlvbk1ldGhvZCAgYWxsb2NfbWV0aG9kOworICBHc3RTYmNDaGFubmVsTW9kZSAgICAgICBjaF9tb2RlOworICBnaW50ICAgICAgICAgICAgICAgICAgICByYXRlOworICBnaW50ICAgICAgICAgICAgICAgICAgICBuX2Jsb2NrczsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICAgbl9zdWJiYW5kczsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICAgYml0cG9vbDsKKworICBnYm9vbGVhbiAgICAgICAgICAgICAgICBzZW50X2NvZGVjX3RhZzsKK307CisKK3N0cnVjdCBfR3N0U2JjUGFyc2VDbGFzcyB7CisgIEdzdEJhc2VQYXJzZUNsYXNzIGJhc2VwYXJzZV9jbGFzczsKK307CisKK0dUeXBlIGdzdF9zYmNfcGFyc2VfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfU0JDX1BBUlNFX0hfSU5DTFVERURfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuYyBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxZDE5YwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmMKQEAgLTAsMCArMSw3MDYgQEAKKy8qIEdTdHJlYW1lciBXYXZwYWNrIHBhcnNlcgorICogQ29weXJpZ2h0IChDKSAyMDEyIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSAyMDEyIE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBDb250YWN0OiBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC13YXZwYWNrcGFyc2UKKyAqIEBzaG9ydF9kZXNjcmlwdGlvbjogV2F2cGFjayBwYXJzZXIKKyAqIEBzZWVfYWxzbzogI0dzdEFtclBhcnNlLCAjR3N0QUFDUGFyc2UKKyAqCisgKiBUaGlzIGlzIGFuIFdhdnBhY2sgcGFyc2VyLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPWFiYy53YXZwYWNrICEgd2F2cGFja3BhcnNlICEgd2F2cGFja2RlYyAhIGF1ZGlvcmVzYW1wbGUgISBhdWRpb2NvbnZlcnQgISBhdXRvYXVkaW9zaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHdhdnBhY2twYXJzZS5oIgorCisjaW5jbHVkZSA8Z3N0L2Jhc2UvYmFzZS5oPgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL3BidXRpbHMuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAod2F2cGFja19wYXJzZV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCB3YXZwYWNrX3BhcnNlX2RlYnVnCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC13YXZwYWNrLCAiCisgICAgICAgICJkZXB0aCA9IChpbnQpIFsgMSwgMzIgXSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDggXSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgNjAwMCwgMTkyMDAwIF0sICIgImZyYW1lZCA9IChib29sZWFuKSBUUlVFOyAiCisgICAgICAgICJhdWRpby94LXdhdnBhY2stY29ycmVjdGlvbiwgIiAiZnJhbWVkID0gKGJvb2xlYW4pIFRSVUUiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC13YXZwYWNrIikpOworCitzdGF0aWMgdm9pZCBnc3Rfd2F2cGFja19wYXJzZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfd2F2cGFja19wYXJzZV9zdGFydCAoR3N0QmFzZVBhcnNlICogcGFyc2UpOworc3RhdGljIGdib29sZWFuIGdzdF93YXZwYWNrX3BhcnNlX3N0b3AgKEdzdEJhc2VQYXJzZSAqIHBhcnNlKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF93YXZwYWNrX3BhcnNlX2hhbmRsZV9mcmFtZSAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0QmFzZVBhcnNlRnJhbWUgKiBmcmFtZSwgZ2ludCAqIHNraXBzaXplKTsKK3N0YXRpYyBHc3RDYXBzICpnc3Rfd2F2cGFja19wYXJzZV9nZXRfc2lua19jYXBzIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF93YXZwYWNrX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lKTsKKworI2RlZmluZSBnc3Rfd2F2cGFja19wYXJzZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RXYXZwYWNrUGFyc2UsIGdzdF93YXZwYWNrX3BhcnNlLCBHU1RfVFlQRV9CQVNFX1BBUlNFKTsKKworc3RhdGljIHZvaWQKK2dzdF93YXZwYWNrX3BhcnNlX2NsYXNzX2luaXQgKEdzdFdhdnBhY2tQYXJzZUNsYXNzICoga2xhc3MpCit7CisgIEdzdEJhc2VQYXJzZUNsYXNzICpwYXJzZV9jbGFzcyA9IEdTVF9CQVNFX1BBUlNFX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAod2F2cGFja19wYXJzZV9kZWJ1ZywgIndhdnBhY2twYXJzZSIsIDAsCisgICAgICAiV2F2cGFjayBhdWRpbyBzdHJlYW0gcGFyc2VyIik7CisKKyAgb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF93YXZwYWNrX3BhcnNlX2ZpbmFsaXplOworCisgIHBhcnNlX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2cGFja19wYXJzZV9zdGFydCk7CisgIHBhcnNlX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZwYWNrX3BhcnNlX3N0b3ApOworICBwYXJzZV9jbGFzcy0+aGFuZGxlX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2cGFja19wYXJzZV9oYW5kbGVfZnJhbWUpOworICBwYXJzZV9jbGFzcy0+Z2V0X3NpbmtfY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdnBhY2tfcGFyc2VfZ2V0X3NpbmtfY2Fwcyk7CisgIHBhcnNlX2NsYXNzLT5wcmVfcHVzaF9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdnBhY2tfcGFyc2VfcHJlX3B1c2hfZnJhbWUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIldhdnBhY2sgYXVkaW8gc3RyZWFtIHBhcnNlciIsICJDb2RlYy9QYXJzZXIvQXVkaW8iLAorICAgICAgIldhdnBhY2sgcGFyc2VyIiwgIk1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3dhdnBhY2tfcGFyc2VfcmVzZXQgKEdzdFdhdnBhY2tQYXJzZSAqIHd2cGFyc2UpCit7CisgIHd2cGFyc2UtPmNoYW5uZWxzID0gLTE7CisgIHd2cGFyc2UtPmNoYW5uZWxfbWFzayA9IDA7CisgIHd2cGFyc2UtPnNhbXBsZV9yYXRlID0gLTE7CisgIHd2cGFyc2UtPndpZHRoID0gLTE7CisgIHd2cGFyc2UtPnRvdGFsX3NhbXBsZXMgPSAwOworICB3dnBhcnNlLT5zZW50X2NvZGVjX3RhZyA9IEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3dhdnBhY2tfcGFyc2VfaW5pdCAoR3N0V2F2cGFja1BhcnNlICogd3ZwYXJzZSkKK3sKKyAgZ3N0X3dhdnBhY2tfcGFyc2VfcmVzZXQgKHd2cGFyc2UpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfSU5URVJTRUNUIChHU1RfQkFTRV9QQVJTRV9TSU5LX1BBRCAod3ZwYXJzZSkpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9CQVNFX1BBUlNFX1NJTktfUEFEICh3dnBhcnNlKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFja19wYXJzZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX3BhcnNlX3N0YXJ0IChHc3RCYXNlUGFyc2UgKiBwYXJzZSkKK3sKKyAgR3N0V2F2cGFja1BhcnNlICp3dnBhcnNlID0gR1NUX1dBVlBBQ0tfUEFSU0UgKHBhcnNlKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgInN0YXJ0aW5nIik7CisKKyAgZ3N0X3dhdnBhY2tfcGFyc2VfcmVzZXQgKHd2cGFyc2UpOworCisgIC8qIG5lZWQgaGVhZGVyIGF0IGxlYXN0ICovCisgIGdzdF9iYXNlX3BhcnNlX3NldF9taW5fZnJhbWVfc2l6ZSAoR1NUX0JBU0VfUEFSU0UgKHd2cGFyc2UpLAorICAgICAgc2l6ZW9mIChXYXZwYWNrSGVhZGVyKSk7CisKKyAgLyogaW5mb3JtIGJhc2VjbGFzcyB3ZSBjYW4gY29tZSB1cCB3aXRoIHRzLCBiYXNlZCBvbiBjb3VudGVycyBpbiBwYWNrZXRzICovCisgIGdzdF9iYXNlX3BhcnNlX3NldF9oYXNfdGltaW5nX2luZm8gKEdTVF9CQVNFX1BBUlNFX0NBU1QgKHd2cGFyc2UpLCBUUlVFKTsKKyAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X3N5bmNhYmxlIChHU1RfQkFTRV9QQVJTRV9DQVNUICh3dnBhcnNlKSwgVFJVRSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhY2tfcGFyc2Vfc3RvcCAoR3N0QmFzZVBhcnNlICogcGFyc2UpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAic3RvcHBpbmciKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdpbnQKK2dzdF93YXZwYWNrX2dldF9kZWZhdWx0X2NoYW5uZWxfbWFzayAoZ2ludCBuY2hhbm5lbHMpCit7CisgIGdpbnQgY2hhbm5lbF9tYXNrID0gMDsKKworICAvKiBTZXQgdGhlIGRlZmF1bHQgY2hhbm5lbCBtYXNrIGZvciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGNoYW5uZWxzLgorICAgKiBJdCdzIHRoZSBzYW1lIGFzIGZvciBXQVZFX0ZPUk1BVF9FWFRFTkRFRDoKKyAgICogaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3doZGMvZGV2aWNlL2F1ZGlvL211bHRpY2hhdWQubXNweAorICAgKi8KKyAgc3dpdGNoIChuY2hhbm5lbHMpIHsKKyAgICBjYXNlIDExOgorICAgICAgY2hhbm5lbF9tYXNrIHw9IDB4MDA0MDA7CisgICAgICBjaGFubmVsX21hc2sgfD0gMHgwMDIwMDsKKyAgICBjYXNlIDk6CisgICAgICBjaGFubmVsX21hc2sgfD0gMHgwMDEwMDsKKyAgICBjYXNlIDg6CisgICAgICBjaGFubmVsX21hc2sgfD0gMHgwMDA4MDsKKyAgICAgIGNoYW5uZWxfbWFzayB8PSAweDAwMDQwOworICAgIGNhc2UgNjoKKyAgICAgIGNoYW5uZWxfbWFzayB8PSAweDAwMDIwOworICAgICAgY2hhbm5lbF9tYXNrIHw9IDB4MDAwMTA7CisgICAgY2FzZSA0OgorICAgICAgY2hhbm5lbF9tYXNrIHw9IDB4MDAwMDg7CisgICAgY2FzZSAzOgorICAgICAgY2hhbm5lbF9tYXNrIHw9IDB4MDAwMDQ7CisgICAgY2FzZSAyOgorICAgICAgY2hhbm5lbF9tYXNrIHw9IDB4MDAwMDI7CisgICAgICBjaGFubmVsX21hc2sgfD0gMHgwMDAwMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIC8qIEZvciBtb25vIHVzZSBmcm9udCBjZW50ZXIgKi8KKyAgICAgIGNoYW5uZWxfbWFzayB8PSAweDAwMDA0OworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gY2hhbm5lbF9tYXNrOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0Cit7CisgIGNvbnN0IGd1aW50MzIgbXNfbWFzazsKKyAgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gZ3N0X3BvczsKK30gbGF5b3V0X21hcHBpbmdbXSA9IHsKKyAgeworICAweDAwMDAxLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUfSwgeworICAweDAwMDAyLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVH0sIHsKKyAgMHgwMDAwNCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSfSwgeworICAweDAwMDA4LCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxfSwgeworICAweDAwMDEwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0xFRlR9LCB7CisgIDB4MDAwMjAsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFR9LCB7CisgIDB4MDAwNDAsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlRfT0ZfQ0VOVEVSfSwgeworICAweDAwMDgwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVF9PRl9DRU5URVJ9LCB7CisgIDB4MDAxMDAsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfQ0VOVEVSfSwgeworICAweDAwMjAwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlR9LCB7CisgIDB4MDA0MDAsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfUklHSFR9LCB7CisgIDB4MDA4MDAsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9DRU5URVJ9LCB7CisgIDB4MDEwMDAsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9MRUZUfSwgeworICAweDAyMDAwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfQ0VOVEVSfSwgeworICAweDA0MDAwLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfUklHSFR9LCB7CisgIDB4MDgwMDAsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX0xFRlR9LCB7CisgIDB4MTAwMDAsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX0NFTlRFUn0sIHsKKyAgMHgyMDAwMCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfUklHSFR9Cit9OworCisjZGVmaW5lIE1BWF9DSEFOTkVMX1BPU0lUSU9OUyBHX05fRUxFTUVOVFMgKGxheW91dF9tYXBwaW5nKQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX2dldF9jaGFubmVsX3Bvc2l0aW9ucyAoZ2ludCBudW1fY2hhbm5lbHMsIGdpbnQgbGF5b3V0LAorICAgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICogcG9zKQoreworICBnaW50IGksIHA7CisKKyAgaWYgKG51bV9jaGFubmVscyA9PSAxICYmIGxheW91dCA9PSAweDAwMDA0KSB7CisgICAgcG9zWzBdID0gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTU9OTzsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHAgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0NIQU5ORUxfUE9TSVRJT05TOyArK2kpIHsKKyAgICBpZiAoKGxheW91dCAmIGxheW91dF9tYXBwaW5nW2ldLm1zX21hc2spICE9IDApIHsKKyAgICAgIGlmIChwID49IG51bV9jaGFubmVscykgeworICAgICAgICBHU1RfV0FSTklORyAoIk1vcmUgYml0cyBzZXQgaW4gdGhlIGNoYW5uZWwgbGF5b3V0IG1hcCB0aGFuIHRoZXJlICIKKyAgICAgICAgICAgICJhcmUgY2hhbm5lbHMhIEJyb2tlbiBmaWxlIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmIChsYXlvdXRfbWFwcGluZ1tpXS5nc3RfcG9zID09IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0lOVkFMSUQpIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJVbnN1cHBvcnRlZCBjaGFubmVsIHBvc2l0aW9uIChtYXNrIDB4JTA4eCkgaW4gY2hhbm5lbCAiCisgICAgICAgICAgICAibGF5b3V0IG1hcCAtIGlnbm9yaW5nIHRob3NlIGNoYW5uZWxzIiwgbGF5b3V0X21hcHBpbmdbaV0ubXNfbWFzayk7CisgICAgICAgIC8qIHdoYXQgdG8gZG8/IGp1c3QgaWdub3JlIGl0IGFuZCBsZXQgZG93bnN0cmVhbSBkZWFsIHdpdGggYSBjaGFubmVsCisgICAgICAgICAqIGxheW91dCB0aGF0IGhhcyBJTlZBTElEIHBvc2l0aW9ucyBpbiBpdCBmb3Igbm93IC4uLiAqLworICAgICAgfQorICAgICAgcG9zW3BdID0gbGF5b3V0X21hcHBpbmdbaV0uZ3N0X3BvczsKKyAgICAgICsrcDsKKyAgICB9CisgIH0KKworICBpZiAocCAhPSBudW1fY2hhbm5lbHMpIHsKKyAgICBHU1RfV0FSTklORyAoIk9ubHkgJWQgYml0cyBzZXQgaW4gdGhlIGNoYW5uZWwgbGF5b3V0IG1hcCwgYnV0IHRoZXJlIGFyZSAiCisgICAgICAgICJzdXBwb3NlZCB0byBiZSAlZCBjaGFubmVscyEgQnJva2VuIGZpbGUiLCBwLCBudW1fY2hhbm5lbHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgY29uc3QgZ3VpbnQzMiBzYW1wbGVfcmF0ZXNbXSA9IHsKKyAgNjAwMCwgODAwMCwgOTYwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsCisgIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwLCA2NDAwMCwgODgyMDAsIDk2MDAwLCAxOTIwMDAKK307CisKKyNkZWZpbmUgQ0hFQ0soY2FsbCkgeyBcCisgIGlmICghY2FsbCkgXAorICAgIGdvdG8gcmVhZF9mYWlsZWQ7IFwKK30KKworLyogY2FsbGVyIGVuc3VyZXMgcHJvcGVybHkgc3luYydlZCB3aXRoIGVub3VnaCBkYXRhICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYWNrX3BhcnNlX2ZyYW1lX21ldGFkYXRhIChHc3RXYXZwYWNrUGFyc2UgKiBwYXJzZSwgR3N0QnVmZmVyICogYnVmLAorICAgIGdpbnQgc2tpcCwgV2F2cGFja0hlYWRlciAqIHdwaCwgV2F2cGFja0luZm8gKiB3cGkpCit7CisgIEdzdEJ5dGVSZWFkZXIgYnI7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdwaCAhPSBOVUxMIHx8IHdwaSAhPSBOVUxMLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChnc3RfYnVmZmVyX2dldF9zaXplIChidWYpID49CisgICAgICBza2lwICsgc2l6ZW9mIChXYXZwYWNrSGVhZGVyKSwgRkFMU0UpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZiciwgbWFwLmRhdGEgKyBza2lwLCB3cGgtPmNrU2l6ZSArIDgpOworICAvKiBza2lwIHBhc3QgaGVhZGVyICovCisgIGdzdF9ieXRlX3JlYWRlcl9za2lwX3VuY2hlY2tlZCAoJmJyLCBzaXplb2YgKFdhdnBhY2tIZWFkZXIpKTsKKworICAvKiBnZXQgc29tZSBiYXNpY3MgZnJvbSBoZWFkZXIgKi8KKyAgaSA9ICh3cGgtPmZsYWdzID4+IDIzKSAmIDB4RjsKKyAgaWYgKCF3cGktPnJhdGUpCisgICAgd3BpLT5yYXRlID0gKGkgPCBHX05fRUxFTUVOVFMgKHNhbXBsZV9yYXRlcykpID8gc2FtcGxlX3JhdGVzW2ldIDogNDQxMDA7CisgIHdwaS0+d2lkdGggPSAoKHdwaC0+ZmxhZ3MgJiAweDMpICsgMSkgKiA4OworICBpZiAoIXdwaS0+Y2hhbm5lbHMpCisgICAgd3BpLT5jaGFubmVscyA9ICh3cGgtPmZsYWdzICYgMHg0KSA/IDEgOiAyOworICBpZiAoIXdwaS0+Y2hhbm5lbF9tYXNrKQorICAgIHdwaS0+Y2hhbm5lbF9tYXNrID0gNSAtIHdwaS0+Y2hhbm5lbHM7CisKKyAgLyogbmVlZCB0byBkaWcgbWV0YWRhdGEgYmxvY2tzIGZvciBzb21lIG1vcmUgKi8KKyAgd2hpbGUgKGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nICgmYnIpKSB7CisgICAgZ2ludCBzaXplID0gMDsKKyAgICBndWludDE2IHNpemUyID0gMDsKKyAgICBndWludDggYywgaWQ7CisgICAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICAgIEdzdEJ5dGVSZWFkZXIgbWJyOworCisgICAgQ0hFQ0sgKGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZiciwgJmlkKSk7CisgICAgQ0hFQ0sgKGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZiciwgJmMpKTsKKyAgICBpZiAoaWQgJiBJRF9MQVJHRSkKKyAgICAgIENIRUNLIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAoJmJyLCAmc2l6ZTIpKTsKKyAgICBzaXplID0gc2l6ZTI7CisgICAgc2l6ZSA8PD0gODsKKyAgICBzaXplICs9IGM7CisgICAgc2l6ZSA8PD0gMTsKKyAgICBpZiAoaWQgJiBJRF9PRERfU0laRSkKKyAgICAgIHNpemUtLTsKKworICAgIENIRUNLIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X2RhdGEgKCZiciwgc2l6ZSArIChzaXplICYgMSksICZkYXRhKSk7CisgICAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZtYnIsIGRhdGEsIHNpemUpOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgY2FzZSBJRF9XVkNfQklUU1RSRUFNOgorICAgICAgICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJjb3JyZWN0aW9uIGJpdHN0cmVhbSIpOworICAgICAgICB3cGktPmNvcnJlY3Rpb24gPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSURfV1ZfQklUU1RSRUFNOgorICAgICAgY2FzZSBJRF9XVlhfQklUU1RSRUFNOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSURfU0FNUExFX1JBVEU6CisgICAgICAgIGlmIChzaXplID09IDMpIHsKKyAgICAgICAgICBDSEVDSyAoZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MjRfbGUgKCZtYnIsICZ3cGktPnJhdGUpKTsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJ1cGRhdGVkIHdpdGggY3VzdG9tIHJhdGUgJWQiLCB3cGktPnJhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAidW5leHBlY3RlZCBzaXplIGZvciBTQU1QTEVfUkFURSBtZXRhZGF0YSIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBJRF9DSEFOTkVMX0lORk86CisgICAgICB7CisgICAgICAgIGd1aW50MTYgY2hhbm5lbHM7CisgICAgICAgIGd1aW50MzIgbWFzayA9IDA7CisKKyAgICAgICAgaWYgKHNpemUgPT0gNikgeworICAgICAgICAgIENIRUNLIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAoJm1iciwgJmNoYW5uZWxzKSk7CisgICAgICAgICAgY2hhbm5lbHMgPSBjaGFubmVscyAmIDB4RkZGOworICAgICAgICAgIENIRUNLIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQyNF9sZSAoJm1iciwgJm1hc2spKTsKKyAgICAgICAgfSBlbHNlIGlmIChzaXplKSB7CisgICAgICAgICAgQ0hFQ0sgKGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZtYnIsICZjKSk7CisgICAgICAgICAgY2hhbm5lbHMgPSBjOworICAgICAgICAgIHdoaWxlIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ4ICgmbWJyLCAmYykpCisgICAgICAgICAgICBtYXNrIHw9ICgoKGd1aW50MzIpIGMpIDw8IDgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAidW5leHBlY3RlZCBzaXplIGZvciBDSEFOTkVMX0lORk8gbWV0YWRhdGEiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB3cGktPmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgICAgIHdwaS0+Y2hhbm5lbF9tYXNrID0gbWFzazsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJ1bnBhcnNlZCBJRCAweCV4IiwgaWQpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworcmVhZF9mYWlsZWQ6CisgIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAic2hvcnQgcmVhZCB3aGlsZSBwYXJzaW5nIG1ldGFkYXRhIik7CisgICAgLyogbGV0J3MgbG9vayB0aGUgb3RoZXIgd2F5IGFueXdheSAqLworICAgIHJldHVybiBUUlVFOworICB9Cit9CisKKy8qIGNhbGxlciBlbnN1cmVzIHByb3Blcmx5IHN5bmMnZWQgd2l0aCBlbm91Z2ggZGF0YSAqLworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2cGFja19wYXJzZV9mcmFtZV9oZWFkZXIgKEdzdFdhdnBhY2tQYXJzZSAqIHBhcnNlLCBHc3RCdWZmZXIgKiBidWYsCisgICAgZ2ludCBza2lwLCBXYXZwYWNrSGVhZGVyICogX3dwaCkKK3sKKyAgR3N0Qnl0ZVJlYWRlciBicjsKKyAgV2F2cGFja0hlYWRlciB3cGggPSB7IHswLH0sIDAsIH07CisgIEdzdE1hcEluZm8gbWFwOworICBnYm9vbGVhbiBoZGwgPSBUUlVFOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChnc3RfYnVmZmVyX2dldF9zaXplIChidWYpID49CisgICAgICBza2lwICsgc2l6ZW9mIChXYXZwYWNrSGVhZGVyKSwgRkFMU0UpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGdzdF9ieXRlX3JlYWRlcl9pbml0ICgmYnIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisKKyAgLyogbWFya2VyICovCisgIGdzdF9ieXRlX3JlYWRlcl9za2lwX3VuY2hlY2tlZCAoJmJyLCBza2lwICsgNCk7CisKKyAgLyogcmVhZCAqLworICBoZGwgJj0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKCZiciwgJndwaC5ja1NpemUpOworICBoZGwgJj0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKCZiciwgJndwaC52ZXJzaW9uKTsKKyAgaGRsICY9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZiciwgJndwaC50cmFja19ubyk7CisgIGhkbCAmPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ4ICgmYnIsICZ3cGguaW5kZXhfbm8pOworICBoZGwgJj0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKCZiciwgJndwaC50b3RhbF9zYW1wbGVzKTsKKyAgaGRsICY9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2xlICgmYnIsICZ3cGguYmxvY2tfaW5kZXgpOworICBoZGwgJj0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKCZiciwgJndwaC5ibG9ja19zYW1wbGVzKTsKKyAgaGRsICY9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2xlICgmYnIsICZ3cGguZmxhZ3MpOworICBoZGwgJj0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKCZiciwgJndwaC5jcmMpOworCisgIGlmICghaGRsKQorICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsICJFcnJvciByZWFkaW5nIGhlYWRlciIpOworCisgIC8qIGR1bXAgKi8KKyAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAic2l6ZSAlZCIsIHdwaC5ja1NpemUpOworICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJ2ZXJzaW9uIDB4JXgiLCB3cGgudmVyc2lvbik7CisgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgInRvdGFsIHNhbXBsZXMgJWQiLCB3cGgudG90YWxfc2FtcGxlcyk7CisgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgImJsb2NrIGluZGV4ICVkIiwgd3BoLmJsb2NrX2luZGV4KTsKKyAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAiYmxvY2sgc2FtcGxlcyAlZCIsIHdwaC5ibG9ja19zYW1wbGVzKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAiZmxhZ3MgMHgleCIsIHdwaC5mbGFncyk7CisgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgImNyYyAweCV4Iiwgd3BoLmZsYWdzKTsKKworICBpZiAoIXBhcnNlLT50b3RhbF9zYW1wbGVzICYmIHdwaC5ibG9ja19pbmRleCA9PSAwICYmIHdwaC50b3RhbF9zYW1wbGVzICE9IC0xKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJkZXRlcm1pbmVkIGR1cmF0aW9uIG9mICV1IHNhbXBsZXMiLAorICAgICAgICB3cGgudG90YWxfc2FtcGxlcyk7CisgICAgcGFyc2UtPnRvdGFsX3NhbXBsZXMgPSB3cGgudG90YWxfc2FtcGxlczsKKyAgfQorCisgIGlmIChfd3BoKQorICAgICpfd3BoID0gd3BoOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfd2F2cGFja19wYXJzZV9oYW5kbGVfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUsIGdpbnQgKiBza2lwc2l6ZSkKK3sKKyAgR3N0V2F2cGFja1BhcnNlICp3dnBhcnNlID0gR1NUX1dBVlBBQ0tfUEFSU0UgKHBhcnNlKTsKKyAgR3N0QnVmZmVyICpidWYgPSBmcmFtZS0+YnVmZmVyOworICBHc3RCeXRlUmVhZGVyIHJlYWRlcjsKKyAgZ2ludCBvZmY7CisgIGd1aW50IHJhdGUsIGNoYW5zLCB3aWR0aCwgbWFzazsKKyAgZ2Jvb2xlYW4gbG9zdF9zeW5jLCBkcmFpbmluZywgZmluYWw7CisgIGd1aW50IGZybXNpemUgPSAwOworICBXYXZwYWNrSGVhZGVyIHdwaDsKKyAgV2F2cGFja0luZm8gd3BpID0geyAwLCB9OworICBHc3RNYXBJbmZvIG1hcDsKKworICBpZiAoR19VTkxJS0VMWSAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSA8IHNpemVvZiAoV2F2cGFja0hlYWRlcikpKQorICAgIHJldHVybiBGQUxTRTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJnJlYWRlciwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKworICAvKiBzY2FuIGZvciAnd3ZwaycgbWFya2VyICovCisgIG9mZiA9IGdzdF9ieXRlX3JlYWRlcl9tYXNrZWRfc2Nhbl91aW50MzIgKCZyZWFkZXIsIDB4ZmZmZmZmZmYsIDB4Nzc3NjcwNmIsCisgICAgICAwLCBtYXAuc2l6ZSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAicG9zc2libGUgc3luYyBhdCBidWZmZXIgb2Zmc2V0ICVkIiwgb2ZmKTsKKworICAvKiBkaWRuJ3QgZmluZCBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSBzeW5jIHdvcmQsIHNraXAgKi8KKyAgaWYgKG9mZiA8IDApIHsKKyAgICAqc2tpcHNpemUgPSBtYXAuc2l6ZSAtIDM7CisgICAgZ290byBza2lwOworICB9CisKKyAgLyogcG9zc2libGUgZnJhbWUgaGVhZGVyLCBidXQgbm90IGF0IG9mZnNldCAwPyBza2lwIGJ5dGVzIGJlZm9yZSBzeW5jICovCisgIGlmIChvZmYgPiAwKSB7CisgICAgKnNraXBzaXplID0gb2ZmOworICAgIGdvdG8gc2tpcDsKKyAgfQorCisgIC8qIG1ha2Ugc3VyZSB0aGUgdmFsdWVzIGluIHRoZSBmcmFtZSBoZWFkZXIgbG9vayBzYW5lICovCisgIGdzdF93YXZwYWNrX3BhcnNlX2ZyYW1lX2hlYWRlciAod3ZwYXJzZSwgYnVmLCAwLCAmd3BoKTsKKyAgZnJtc2l6ZSA9IHdwaC5ja1NpemUgKyA4OworCisgIC8qIG5lZWQgdGhlIGVudGlyZSBmcmFtZSBmb3IgcGFyc2luZyAqLworICBpZiAoZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKCZyZWFkZXIpIDwgZnJtc2l6ZSkKKyAgICBnb3RvIG1vcmU7CisKKyAgLyogZ290IGEgZnJhbWUsIG5vdyB3ZSBjYW4gZGlnIGZvciBzb21lIG1vcmUgbWV0YWRhdGEgKi8KKyAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAiZ290IGZyYW1lIik7CisgIGdzdF93YXZwYWNrX3BhcnNlX2ZyYW1lX21ldGFkYXRhICh3dnBhcnNlLCBidWYsIDAsICZ3cGgsICZ3cGkpOworCisgIGxvc3Rfc3luYyA9IEdTVF9CQVNFX1BBUlNFX0xPU1RfU1lOQyAocGFyc2UpOworICBkcmFpbmluZyA9IEdTVF9CQVNFX1BBUlNFX0RSQUlOSU5HIChwYXJzZSk7CisKKyAgd2hpbGUgKCEoZmluYWwgPSAod3BoLmZsYWdzICYgRkxBR19GSU5BTF9CTE9DSykpIHx8IChsb3N0X3N5bmMgJiYgIWRyYWluaW5nKSkgeworICAgIGd1aW50MzIgd29yZCA9IDA7CisKKyAgICBHU1RfTE9HX09CSkVDVCAod3ZwYXJzZSwgImNoZWNraW5nIG5leHQgZnJhbWUgc3luY3dvcmQ7ICIKKyAgICAgICAgImxvc3Rfc3luYzogJWQsIGRyYWluaW5nOiAlZCwgZmluYWw6ICVkIiwgbG9zdF9zeW5jLCBkcmFpbmluZywgZmluYWwpOworCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJnJlYWRlciwgd3BoLmNrU2l6ZSArIDgpIHx8CisgICAgICAgICFnc3RfYnl0ZV9yZWFkZXJfcGVla191aW50MzJfYmUgKCZyZWFkZXIsICZ3b3JkKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAod3ZwYXJzZSwgIi4uLiBidXQgbm90IHN1ZmZpY2llbnQgZGF0YSIpOworICAgICAgZnJtc2l6ZSArPSA0OworICAgICAgZ290byBtb3JlOworICAgIH0gZWxzZSB7CisgICAgICBpZiAod29yZCAhPSAweDc3NzY3MDZiKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHd2cGFyc2UsICIweCV4IG5vdCBPSyIsIHdvcmQpOworICAgICAgICAqc2tpcHNpemUgPSBvZmYgKyAyOworICAgICAgICBnb3RvIHNraXA7CisgICAgICB9CisgICAgICAvKiBuZWVkIHRvIHBhcnNlIGVhY2ggZnJhbWUvYmxvY2sgZm9yIG1ldGFkYXRhIGlmIHNldmVyYWwgb25lcyAqLworICAgICAgaWYgKCFmaW5hbCkgeworICAgICAgICBnaW50IGF2OworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUICh3dnBhcnNlLCAiY2hlY2tpbmcgZnJhbWUgYXQgb2Zmc2V0ICVkICgweCV4KSIsCisgICAgICAgICAgICBmcm1zaXplLCBmcm1zaXplKTsKKyAgICAgICAgYXYgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoJnJlYWRlcik7CisgICAgICAgIGlmIChhdiA8IHNpemVvZiAoV2F2cGFja0hlYWRlcikpIHsKKyAgICAgICAgICBmcm1zaXplICs9IHNpemVvZiAoV2F2cGFja0hlYWRlcik7CisgICAgICAgICAgZ290byBtb3JlOworICAgICAgICB9CisgICAgICAgIGdzdF93YXZwYWNrX3BhcnNlX2ZyYW1lX2hlYWRlciAod3ZwYXJzZSwgYnVmLCBmcm1zaXplLCAmd3BoKTsKKyAgICAgICAgb2ZmID0gZnJtc2l6ZTsKKyAgICAgICAgZnJtc2l6ZSArPSB3cGguY2tTaXplICsgODsKKyAgICAgICAgaWYgKGF2IDwgd3BoLmNrU2l6ZSArIDgpCisgICAgICAgICAgZ290byBtb3JlOworICAgICAgICBnc3Rfd2F2cGFja19wYXJzZV9mcmFtZV9tZXRhZGF0YSAod3ZwYXJzZSwgYnVmLCBvZmYsICZ3cGgsICZ3cGkpOworICAgICAgICAvKiBjb3VsZCBhbHNvIGNoZWNrIGZvciBtYXRjaGluZyBibG9ja19pbmRleCBhbmQgYmxvY2tfc2FtcGxlcyA/PyAqLworICAgICAgfQorICAgIH0KKworICAgIC8qIHJlc3luY2VkIGlmIHdlIG1ha2UgaXQgaGVyZSAqLworICAgIGxvc3Rfc3luYyA9IEZBTFNFOworICB9CisKKyAgcmF0ZSA9IHdwaS5yYXRlOworICB3aWR0aCA9IHdwaS53aWR0aDsKKyAgY2hhbnMgPSB3cGkuY2hhbm5lbHM7CisgIG1hc2sgPSB3cGkuY2hhbm5lbF9tYXNrOworCisgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgInJhdGU6ICV1LCB3aWR0aDogJXUsIGNoYW5zOiAldSIsIHJhdGUsIHdpZHRoLCBjaGFucyk7CisKKyAgR1NUX0JVRkZFUl9QVFMgKGJ1ZikgPQorICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAod3BoLmJsb2NrX2luZGV4LCBHU1RfU0VDT05ELCByYXRlKTsKKyAgR1NUX0JVRkZFUl9EVFMgKGJ1ZikgPSBHU1RfQlVGRkVSX1BUUyAoYnVmKTsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKSA9CisgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50ICh3cGguYmxvY2tfaW5kZXggKyB3cGguYmxvY2tfc2FtcGxlcywKKyAgICAgIEdTVF9TRUNPTkQsIHJhdGUpIC0gR1NUX0JVRkZFUl9QVFMgKGJ1Zik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHd2cGFyc2UtPnNhbXBsZV9yYXRlICE9IHJhdGUgfHwgd3ZwYXJzZS0+Y2hhbm5lbHMgIT0gY2hhbnMKKyAgICAgICAgICB8fCB3dnBhcnNlLT53aWR0aCAhPSB3aWR0aCB8fCB3dnBhcnNlLT5jaGFubmVsX21hc2sgIT0gbWFzaykpIHsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgaWYgKHdwaS5jb3JyZWN0aW9uKSB7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtd2F2cGFjay1jb3JyZWN0aW9uIiwKKyAgICAgICAgICAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtd2F2cGFjayIsCisgICAgICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgY2hhbnMsCisgICAgICAgICAgInJhdGUiLCBHX1RZUEVfSU5ULCByYXRlLAorICAgICAgICAgICJkZXB0aCIsIEdfVFlQRV9JTlQsIHdpZHRoLCAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworCisgICAgICBpZiAoIW1hc2spCisgICAgICAgIG1hc2sgPSBnc3Rfd2F2cGFja19nZXRfZGVmYXVsdF9jaGFubmVsX21hc2sgKHd2cGFyc2UtPmNoYW5uZWxzKTsKKyAgICAgIGlmIChtYXNrICE9IDApIHsKKyAgICAgICAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zWzY0XSA9CisgICAgICAgICAgICB7IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0lOVkFMSUQsIH07CisgICAgICAgIGd1aW50NjQgZ21hc2s7CisKKyAgICAgICAgaWYgKCFnc3Rfd2F2cGFja19nZXRfY2hhbm5lbF9wb3NpdGlvbnMgKGNoYW5zLCBtYXNrLCBwb3MpKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh3dnBhcnNlLCAiRmFpbGVkIHRvIGRldGVybWluZSBjaGFubmVsIGxheW91dCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b19tYXNrIChwb3MsIGNoYW5zLCBGQUxTRSwgJmdtYXNrKTsKKyAgICAgICAgICBpZiAoZ21hc2spCisgICAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLAorICAgICAgICAgICAgICAgICJjaGFubmVsLW1hc2siLCBHU1RfVFlQRV9CSVRNQVNLLCBnbWFzaywgTlVMTCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBnc3RfcGFkX3NldF9jYXBzIChHU1RfQkFTRV9QQVJTRV9TUkNfUEFEIChwYXJzZSksIGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgIHd2cGFyc2UtPnNhbXBsZV9yYXRlID0gcmF0ZTsKKyAgICB3dnBhcnNlLT5jaGFubmVscyA9IGNoYW5zOworICAgIHd2cGFyc2UtPndpZHRoID0gd2lkdGg7CisgICAgd3ZwYXJzZS0+Y2hhbm5lbF9tYXNrID0gbWFzazsKKworICAgIGlmICh3dnBhcnNlLT50b3RhbF9zYW1wbGVzKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUICh3dnBhcnNlLCAic2V0dGluZyBkdXJhdGlvbiIpOworICAgICAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X2R1cmF0aW9uIChHU1RfQkFTRV9QQVJTRSAod3ZwYXJzZSksCisgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50ICh3dnBhcnNlLT50b3RhbF9zYW1wbGVzLAorICAgICAgICAgICAgICBHU1RfU0VDT05ELCB3dnBhcnNlLT5zYW1wbGVfcmF0ZSksIDApOworICAgIH0KKyAgfQorCisgIC8qIHJldHVybiB0byBub3JtYWwgc2l6ZSAqLworICBnc3RfYmFzZV9wYXJzZV9zZXRfbWluX2ZyYW1lX3NpemUgKHBhcnNlLCBzaXplb2YgKFdhdnBhY2tIZWFkZXIpKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICByZXR1cm4gZ3N0X2Jhc2VfcGFyc2VfZmluaXNoX2ZyYW1lIChwYXJzZSwgZnJhbWUsIGZybXNpemUpOworCitza2lwOgorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBHU1RfTE9HX09CSkVDVCAod3ZwYXJzZSwgInNraXBwaW5nICVkIiwgKnNraXBzaXplKTsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCittb3JlOgorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBHU1RfTE9HX09CSkVDVCAod3ZwYXJzZSwgIm5lZWQgYXQgbGVhc3QgJXUiLCBmcm1zaXplKTsKKyAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChwYXJzZSwgZnJtc2l6ZSk7CisgICpza2lwc2l6ZSA9IDA7CisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9maWVsZHMgKEdzdENhcHMgKiBjYXBzKQoreworICBndWludCBpLCBuOworCisgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCAiZnJhbWVkIik7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3dhdnBhY2tfcGFyc2VfZ2V0X3NpbmtfY2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnBlZXJjYXBzLCAqdGVtcGw7CisgIEdzdENhcHMgKnJlczsKKworICB0ZW1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChHU1RfQkFTRV9QQVJTRV9TSU5LX1BBRCAocGFyc2UpKTsKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmZjb3B5ID0gZ3N0X2NhcHNfY29weSAoZmlsdGVyKTsKKyAgICAvKiBSZW1vdmUgdGhlIGZpZWxkcyB3ZSBjb252ZXJ0ICovCisgICAgcmVtb3ZlX2ZpZWxkcyAoZmNvcHkpOworICAgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgZmNvcHkpOworICAgIGdzdF9jYXBzX3VucmVmIChmY29weSk7CisgIH0gZWxzZQorICAgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgTlVMTCk7CisKKyAgaWYgKHBlZXJjYXBzKSB7CisgICAgLyogUmVtb3ZlIHRoZSBmcmFtZWQgZmllbGQgKi8KKyAgICBwZWVyY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKHBlZXJjYXBzKTsKKyAgICByZW1vdmVfZmllbGRzIChwZWVyY2Fwcyk7CisKKyAgICByZXMgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAocGVlcmNhcHMsIHRlbXBsLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChwZWVyY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRlbXBsKTsKKyAgfSBlbHNlIHsKKyAgICByZXMgPSB0ZW1wbDsKKyAgfQorCisgIGlmIChmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICppbnRlcnNlY3Rpb247CisKKyAgICBpbnRlcnNlY3Rpb24gPQorICAgICAgICBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCByZXMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHJlcyk7CisgICAgcmVzID0gaW50ZXJzZWN0aW9uOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF93YXZwYWNrX3BhcnNlX3ByZV9wdXNoX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lKQoreworICBHc3RXYXZwYWNrUGFyc2UgKndhdnBhY2twYXJzZSA9IEdTVF9XQVZQQUNLX1BBUlNFIChwYXJzZSk7CisKKyAgaWYgKCF3YXZwYWNrcGFyc2UtPnNlbnRfY29kZWNfdGFnKSB7CisgICAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgLyogY29kZWMgdGFnICovCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX0JBU0VfUEFSU0VfU1JDX1BBRCAocGFyc2UpKTsKKyAgICBpZiAoR19VTkxJS0VMWSAoY2FwcyA9PSBOVUxMKSkgeworICAgICAgaWYgKEdTVF9QQURfSVNfRkxVU0hJTkcgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSkpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgZmx1c2hpbmciKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIlNyYyBwYWQgaXMgbm90IG5lZ290aWF0ZWQhIik7CisgICAgICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgICBnc3RfcGJfdXRpbHNfYWRkX2NvZGVjX2Rlc2NyaXB0aW9uX3RvX3RhZ19saXN0ICh0YWdsaXN0LAorICAgICAgICBHU1RfVEFHX0FVRElPX0NPREVDLCBjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICBnc3RfYmFzZV9wYXJzZV9tZXJnZV90YWdzIChwYXJzZSwgdGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ2xpc3QpOworCisgICAgLyogYWxzbyBzaWduYWxzIHRoZSBlbmQgb2YgZmlyc3QtZnJhbWUgcHJvY2Vzc2luZyAqLworICAgIHdhdnBhY2twYXJzZS0+c2VudF9jb2RlY190YWcgPSBUUlVFOworICB9CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1ZGlvcGFyc2Vycy9nc3R3YXZwYWNrcGFyc2UuaCBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzMjVhYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qIEdTdHJlYW1lciBXYXZwYWNrIHBhcnNlcgorICogQ29weXJpZ2h0IChDKSAyMDEyIE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSAyMDEyIE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBDb250YWN0OiBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfV0FWUEFDS19QQVJTRV9IX18KKyNkZWZpbmUgX19HU1RfV0FWUEFDS19QQVJTRV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlcGFyc2UuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1dBVlBBQ0tfUEFSU0UgXAorICAoZ3N0X3dhdnBhY2tfcGFyc2VfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1dBVlBBQ0tfUEFSU0Uob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSwgR1NUX1RZUEVfV0FWUEFDS19QQVJTRSwgR3N0V2F2cGFja1BhcnNlKSkKKyNkZWZpbmUgR1NUX1dBVlBBQ0tfUEFSU0VfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksIEdTVF9UWVBFX1dBVlBBQ0tfUEFSU0UsIEdzdFdhdnBhY2tQYXJzZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1dBVlBBQ0tfUEFSU0Uob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSwgR1NUX1RZUEVfV0FWUEFDS19QQVJTRSkpCisjZGVmaW5lIEdTVF9JU19XQVZQQUNLX1BBUlNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLCBHU1RfVFlQRV9XQVZQQUNLX1BBUlNFKSkKKworCisjZGVmaW5lIElEX1VOSVFVRSAgICAgICAgICAgICAgIDB4M2YKKyNkZWZpbmUgSURfT1BUSU9OQUxfREFUQSAgICAgICAgMHgyMAorI2RlZmluZSBJRF9PRERfU0laRSAgICAgICAgICAgICAweDQwCisjZGVmaW5lIElEX0xBUkdFICAgICAgICAgICAgICAgIDB4ODAKKworI2RlZmluZSBJRF9EVU1NWSAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgSURfRU5DT0RFUl9JTkZPICAgICAgICAgMHgxCisjZGVmaW5lIElEX0RFQ09SUl9URVJNUyAgICAgICAgIDB4MgorI2RlZmluZSBJRF9ERUNPUlJfV0VJR0hUUyAgICAgICAweDMKKyNkZWZpbmUgSURfREVDT1JSX1NBTVBMRVMgICAgICAgMHg0CisjZGVmaW5lIElEX0VOVFJPUFlfVkFSUyAgICAgICAgIDB4NQorI2RlZmluZSBJRF9IWUJSSURfUFJPRklMRSAgICAgICAweDYKKyNkZWZpbmUgSURfU0hBUElOR19XRUlHSFRTICAgICAgMHg3CisjZGVmaW5lIElEX0ZMT0FUX0lORk8gICAgICAgICAgIDB4OAorI2RlZmluZSBJRF9JTlQzMl9JTkZPICAgICAgICAgICAweDkKKyNkZWZpbmUgSURfV1ZfQklUU1RSRUFNICAgICAgICAgMHhhCisjZGVmaW5lIElEX1dWQ19CSVRTVFJFQU0gICAgICAgIDB4YgorI2RlZmluZSBJRF9XVlhfQklUU1RSRUFNICAgICAgICAweGMKKyNkZWZpbmUgSURfQ0hBTk5FTF9JTkZPICAgICAgICAgMHhkCisKKyNkZWZpbmUgSURfUklGRl9IRUFERVIgICAgICAgICAgKElEX09QVElPTkFMX0RBVEEgfCAweDEpCisjZGVmaW5lIElEX1JJRkZfVFJBSUxFUiAgICAgICAgIChJRF9PUFRJT05BTF9EQVRBIHwgMHgyKQorI2RlZmluZSBJRF9SRVBMQVlfR0FJTiAgICAgICAgICAoSURfT1BUSU9OQUxfREFUQSB8IDB4MykKKyNkZWZpbmUgSURfQ1VFU0hFRVQgICAgICAgICAgICAgKElEX09QVElPTkFMX0RBVEEgfCAweDQpCisjZGVmaW5lIElEX0NPTkZJR19CTE9DSyAgICAgICAgIChJRF9PUFRJT05BTF9EQVRBIHwgMHg1KQorI2RlZmluZSBJRF9NRDVfQ0hFQ0tTVU0gICAgICAgICAoSURfT1BUSU9OQUxfREFUQSB8IDB4NikKKyNkZWZpbmUgSURfU0FNUExFX1JBVEUgICAgICAgICAgKElEX09QVElPTkFMX0RBVEEgfCAweDcpCisKKyNkZWZpbmUgRkxBR19GSU5BTF9CTE9DSyAgICAgICAgKDEgPDwgMTIpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhciBja0lEIFs0XTsgICAgICAgICAgICAgLyogInd2cGsiICovCisgIGd1aW50MzIgY2tTaXplOyAgICAgICAgICAgIC8qIHNpemUgb2YgZW50aXJlIGJsb2NrIChtaW51cyA4LCBvZiBjb3Vyc2UpICovCisgIGd1aW50MTYgdmVyc2lvbjsgICAgICAgICAgIC8qIDB4NDAyIHRvIDB4NDEwIGFyZSBjdXJyZW50bHkgdmFsaWQgZm9yIGRlY29kZSAqLworICBndWNoYXIgdHJhY2tfbm87ICAgICAgICAgICAvKiB0cmFjayBudW1iZXIgKDAgaWYgbm90IHVzZWQsIGxpa2Ugbm93KSAqLworICBndWNoYXIgaW5kZXhfbm87ICAgICAgICAgICAvKiB0cmFjayBzdWItaW5kZXggKDAgaWYgbm90IHVzZWQsIGxpa2Ugbm93KSAqLworICBndWludDMyIHRvdGFsX3NhbXBsZXM7ICAgICAvKiB0b3RhbCBzYW1wbGVzIGZvciBlbnRpcmUgZmlsZSwgYnV0IHRoaXMgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb25seSB2YWxpZCBpZiBibG9ja19pbmRleCA9PSAwIGFuZCBhIHZhbHVlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIC0xIGluZGljYXRlcyB1bmtub3duIGxlbmd0aCAqLworICBndWludDMyIGJsb2NrX2luZGV4OyAgICAgICAvKiBpbmRleCBvZiBmaXJzdCBzYW1wbGUgaW4gYmxvY2sgcmVsYXRpdmUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmVnaW5uaW5nIG9mIGZpbGUgKG5vcm1hbGx5IHRoaXMgd291bGQgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXQgMCBmb3IgdGhlIGZpcnN0IGJsb2NrKSAqLworICBndWludDMyIGJsb2NrX3NhbXBsZXM7ICAgICAvKiBudW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGlzIGJsb2NrICgwID0gbm8gYXVkaW8pICovCisgIGd1aW50MzIgZmxhZ3M7ICAgICAgICAgICAgIC8qIHZhcmlvdXMgZmxhZ3MgZm9yIGlkIGFuZCBkZWNvZGluZyAqLworICBndWludDMyIGNyYzsgICAgICAgICAgICAgICAvKiBjcmMgZm9yIGFjdHVhbCBkZWNvZGVkIGRhdGEgKi8KK30gV2F2cGFja0hlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBnYm9vbGVhbiBjb3JyZWN0aW9uOworICBndWludCByYXRlOworICBndWludCB3aWR0aDsKKyAgZ3VpbnQgY2hhbm5lbHM7CisgIGd1aW50IGNoYW5uZWxfbWFzazsKK30gV2F2cGFja0luZm87CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RXYXZwYWNrUGFyc2UgR3N0V2F2cGFja1BhcnNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFdhdnBhY2tQYXJzZUNsYXNzIEdzdFdhdnBhY2tQYXJzZUNsYXNzOworCisvKioKKyAqIEdzdFdhdnBhY2tQYXJzZToKKyAqCisgKiBUaGUgb3BhcXVlIEdzdFdhdnBhY2tQYXJzZSBvYmplY3QKKyAqLworc3RydWN0IF9Hc3RXYXZwYWNrUGFyc2UgeworICBHc3RCYXNlUGFyc2UgYmFzZXBhcnNlOworCisgIC8qPCBwcml2YXRlID4qLworICBnaW50ICAgICAgICAgIHNhbXBsZV9yYXRlOworICBnaW50ICAgICAgICAgIGNoYW5uZWxzOworICBnaW50ICAgICAgICAgIHdpZHRoOworICBnaW50ICAgICAgICAgIGNoYW5uZWxfbWFzazsKKworICBndWludCAgICAgICAgIHRvdGFsX3NhbXBsZXM7CisKKyAgZ2Jvb2xlYW4gICAgICBzZW50X2NvZGVjX3RhZzsKK307CisKKy8qKgorICogR3N0V2F2cGFja1BhcnNlQ2xhc3M6CisgKiBAcGFyZW50X2NsYXNzOiBFbGVtZW50IHBhcmVudCBjbGFzcy4KKyAqCisgKiBUaGUgb3BhcXVlIEdzdFdhdnBhY2tQYXJzZUNsYXNzIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdFdhdnBhY2tQYXJzZUNsYXNzIHsKKyAgR3N0QmFzZVBhcnNlQ2xhc3MgYmFzZXBhcnNlX2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3dhdnBhY2tfcGFyc2VfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfV0FWUEFDS19QQVJTRV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9hdWRpb3BhcnNlcnMvbWVzb24uYnVpbGQgYi9nc3QvYXVkaW9wYXJzZXJzL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNWJmODcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9wYXJzZXJzL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMjEgQEAKK2F1ZGlvcGFyc2Vyc19zcmMgPSBbCisgICdnc3RhYWNwYXJzZS5jJywKKyAgJ2dzdGFtcnBhcnNlLmMnLAorICAnZ3N0YWMzcGFyc2UuYycsCisgICdnc3RkY2FwYXJzZS5jJywKKyAgJ2dzdGZsYWNwYXJzZS5jJywKKyAgJ2dzdG1wZWdhdWRpb3BhcnNlLmMnLAorICAnZ3N0c2JjcGFyc2UuYycsCisgICdnc3R3YXZwYWNrcGFyc2UuYycsCisgICdwbHVnaW4uYycsCitdCisKK2dzdGF1ZGlvcGFyc2VycyA9IGxpYnJhcnkoJ2dzdGF1ZGlvcGFyc2VycycsCisgIGF1ZGlvcGFyc2Vyc19zcmMsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0X2RlcCwgZ3N0YmFzZV9kZXAsIGdzdHBidXRpbHNfZGVwLAorICAgICAgICAgICAgICAgICAgZ3N0YXVkaW9fZGVwLCBnc3R0YWdfZGVwXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2dzdC9hdWRpb3BhcnNlcnMvcGx1Z2luLmMgYi9nc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYmZlNjAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVkaW9wYXJzZXJzL3BsdWdpbi5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qIEdTdHJlYW1lciBhdWRpbyBwYXJzZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RhYWNwYXJzZS5oIgorI2luY2x1ZGUgImdzdGFtcnBhcnNlLmgiCisjaW5jbHVkZSAiZ3N0YWMzcGFyc2UuaCIKKyNpbmNsdWRlICJnc3RkY2FwYXJzZS5oIgorI2luY2x1ZGUgImdzdGZsYWNwYXJzZS5oIgorI2luY2x1ZGUgImdzdG1wZWdhdWRpb3BhcnNlLmgiCisjaW5jbHVkZSAiZ3N0c2JjcGFyc2UuaCIKKyNpbmNsdWRlICJnc3R3YXZwYWNrcGFyc2UuaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBnYm9vbGVhbiByZXQ7CisKKyAgcmV0ID0gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImFhY3BhcnNlIiwKKyAgICAgIEdTVF9SQU5LX1BSSU1BUlkgKyAxLCBHU1RfVFlQRV9BQUNfUEFSU0UpOworICByZXQgJj0gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImFtcnBhcnNlIiwKKyAgICAgIEdTVF9SQU5LX1BSSU1BUlkgKyAxLCBHU1RfVFlQRV9BTVJfUEFSU0UpOworICByZXQgJj0gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImFjM3BhcnNlIiwKKyAgICAgIEdTVF9SQU5LX1BSSU1BUlkgKyAxLCBHU1RfVFlQRV9BQzNfUEFSU0UpOworICByZXQgJj0gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImRjYXBhcnNlIiwKKyAgICAgIEdTVF9SQU5LX1BSSU1BUlkgKyAxLCBHU1RfVFlQRV9EQ0FfUEFSU0UpOworICByZXQgJj0gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImZsYWNwYXJzZSIsCisgICAgICBHU1RfUkFOS19QUklNQVJZICsgMSwgR1NUX1RZUEVfRkxBQ19QQVJTRSk7CisgIHJldCAmPSBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAibXBlZ2F1ZGlvcGFyc2UiLAorICAgICAgR1NUX1JBTktfUFJJTUFSWSArIDIsIEdTVF9UWVBFX01QRUdfQVVESU9fUEFSU0UpOworICByZXQgJj0gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInNiY3BhcnNlIiwKKyAgICAgIEdTVF9SQU5LX1BSSU1BUlkgKyAxLCBHU1RfVFlQRV9TQkNfUEFSU0UpOworICByZXQgJj0gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIndhdnBhY2twYXJzZSIsCisgICAgICBHU1RfUkFOS19QUklNQVJZICsgMSwgR1NUX1RZUEVfV0FWUEFDS19QQVJTRSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgYXVkaW9wYXJzZXJzLAorICAgICJQYXJzZXJzIGZvciB2YXJpb3VzIGF1ZGlvIGZvcm1hdHMiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9nc3QvYXVwYXJzZS8uZ2l0aWdub3JlIGIvZ3N0L2F1cGFyc2UvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGY1ZWQzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1cGFyc2UvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDcgQEAKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorKi5vCisqLmxvCisqLmxhCisuZGVwcworLmxpYnMKZGlmZiAtLWdpdCBhL2dzdC9hdXBhcnNlL01ha2VmaWxlLmFtIGIvZ3N0L2F1cGFyc2UvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEzZDBmMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdXBhcnNlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOCBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0YXVwYXJzZS5sYQorCitsaWJnc3RhdXBhcnNlX2xhX1NPVVJDRVMgPSBnc3RhdXBhcnNlLmMKK2xpYmdzdGF1cGFyc2VfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdGF1cGFyc2VfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0xJQlMpICQoR1NUX0JBU0VfTElCUykKK2xpYmdzdGF1cGFyc2VfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdGF1cGFyc2UuaApkaWZmIC0tZ2l0IGEvZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jIGIvZ3N0L2F1cGFyc2UvZ3N0YXVwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MTRhZDgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmMKQEAgLTAsMCArMSw4MTEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXVwYXJzZQorICoKKyAqIFBhcnNlcyAuYXUgZmlsZXMgbW9zdGx5IG9yaWdpbmF0aW5nIGZyb20gc3VuIG9zIGJhc2VkIGNvbXB1dGVycy4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdGF1cGFyc2UuaCIKKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoYXVwYXJzZV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAoYXVwYXJzZV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWF1IikKKyAgICApOworCisjZGVmaW5lIEdTVF9BVV9QQVJTRV9SQVdfUEFEX1RFTVBMQVRFX0NBUFMgXAorICAgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImZvcm1hdD0gKHN0cmluZykgeyBTOCwgUzE2TEUsIFMxNkJFLCBTMjRMRSwgUzI0QkUsICIgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIlMzMkxFLCBTMzJCRSwgRjMyTEUsIEYzMkJFLCAiICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICJGNjRMRSwgRjY0QkUgfSwgIiBcCisgICAgInJhdGUgPSAoaW50KSBbIDgwMDAsIDE5MjAwMCBdLCAiICAgICAgIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICAgICAgICAgICAgICAgICAgXAorICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZDsiICAgICAgICBcCisgICAgImF1ZGlvL3gtcmF3LCAiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZm9ybWF0PSAoc3RyaW5nKSB7IFM4LCBTMTZMRSwgUzE2QkUsIFMyNExFLCBTMjRCRSwgIiAgXAorICAgICAgICAgICAgICAgICAgICAgICAiUzMyTEUsIFMzMkJFLCBGMzJMRSwgRjMyQkUsICIgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIkY2NExFLCBGNjRCRSB9LCAiIFwKKyAgICAicmF0ZSA9IChpbnQpIFsgODAwMCwgMTkyMDAwIF0sICIgICAgICAgXAorICAgICJjaGFubmVscyA9IChpbnQpIDIsICIgICAgICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWwtbWFzayA9IChiaXRtYXNrKSAweDMsIiAgICAgICAgIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQiCisKKyNkZWZpbmUgR1NUX0FVX1BBUlNFX0FMQVdfUEFEX1RFTVBMQVRFX0NBUFMgXAorICAgICJhdWRpby94LWFsYXcsICIgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJhdGUgPSAoaW50KSBbIDgwMDAsIDE5MjAwMCBdLCAiICAgICAgIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXSIKKworI2RlZmluZSBHU1RfQVVfUEFSU0VfTVVMQVdfUEFEX1RFTVBMQVRFX0NBUFMgXAorICAgICJhdWRpby94LW11bGF3LCAiICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyYXRlID0gKGludCkgWyA4MDAwLCAxOTIwMDAgXSwgIiAgICAgICAgXAorICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdIgorCisvKiBOb3RoaW5nIHRvIGRlY29kZSB0aG9zZSBBRFBDTSBzdHJlYW1zIGZvciBub3cgKi8KKyNkZWZpbmUgR1NUX0FVX1BBUlNFX0FEUENNX1BBRF9URU1QTEFURV9DQVBTIFwKKyAgICAiYXVkaW8veC1hZHBjbSwgIiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgeyBnNzIxLCBnNzIyLCBnNzIzXzMsIGc3MjNfNSB9IgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX0FVX1BBUlNFX1JBV19QQURfVEVNUExBVEVfQ0FQUyAiOyAiCisgICAgICAgIEdTVF9BVV9QQVJTRV9BTEFXX1BBRF9URU1QTEFURV9DQVBTICI7IgorICAgICAgICBHU1RfQVVfUEFSU0VfTVVMQVdfUEFEX1RFTVBMQVRFX0NBUFMgIjsiCisgICAgICAgIEdTVF9BVV9QQVJTRV9BRFBDTV9QQURfVEVNUExBVEVfQ0FQUykpOworCisKK3N0YXRpYyB2b2lkIGdzdF9hdV9wYXJzZV9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hdV9wYXJzZV9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfYXVfcGFyc2VfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyB2b2lkIGdzdF9hdV9wYXJzZV9yZXNldCAoR3N0QXVQYXJzZSAqIGF1cGFyc2UpOworc3RhdGljIGdib29sZWFuIGdzdF9hdV9wYXJzZV9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIGdib29sZWFuIGdzdF9hdV9wYXJzZV9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9hdV9wYXJzZV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXVfcGFyc2Vfc3JjX2NvbnZlcnQgKEdzdEF1UGFyc2UgKiBhdXBhcnNlLAorICAgIEdzdEZvcm1hdCBzcmNfZm9ybWF0LCBnaW50NjQgc3JjdmFsLCBHc3RGb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgZ2ludDY0ICogZGVzdHZhbCk7CisKKyNkZWZpbmUgZ3N0X2F1X3BhcnNlX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdEF1UGFyc2UsIGdzdF9hdV9wYXJzZSwgR1NUX1RZUEVfRUxFTUVOVCk7CisKK3N0YXRpYyB2b2lkCitnc3RfYXVfcGFyc2VfY2xhc3NfaW5pdCAoR3N0QXVQYXJzZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChhdXBhcnNlX2RlYnVnLCAiYXVwYXJzZSIsIDAsICIuYXUgcGFyc2VyIik7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3RfYXVfcGFyc2VfZGlzcG9zZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdV9wYXJzZV9jaGFuZ2Vfc3RhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiQVUgYXVkaW8gZGVtdXhlciIsCisgICAgICAiQ29kZWMvRGVtdXhlci9BdWRpbyIsCisgICAgICAiUGFyc2UgYW4gLmF1IGZpbGUgaW50byByYXcgYXVkaW8iLAorICAgICAgIkVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVfcGFyc2VfaW5pdCAoR3N0QXVQYXJzZSAqIGF1cGFyc2UpCit7CisgIGF1cGFyc2UtPnNpbmtwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNpbmtfdGVtcGxhdGUsICJzaW5rIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChhdXBhcnNlLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdV9wYXJzZV9jaGFpbikpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoYXVwYXJzZS0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXVfcGFyc2Vfc2lua19ldmVudCkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoYXVwYXJzZSksIGF1cGFyc2UtPnNpbmtwYWQpOworCisgIGF1cGFyc2UtPnNyY3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc3JjX3RlbXBsYXRlLCAic3JjIik7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChhdXBhcnNlLT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F1X3BhcnNlX3NyY19xdWVyeSkpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoYXVwYXJzZS0+c3JjcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdV9wYXJzZV9zcmNfZXZlbnQpKTsKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoYXVwYXJzZS0+c3JjcGFkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKGF1cGFyc2UpLCBhdXBhcnNlLT5zcmNwYWQpOworCisgIGF1cGFyc2UtPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIGdzdF9hdV9wYXJzZV9yZXNldCAoYXVwYXJzZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVfcGFyc2VfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0QXVQYXJzZSAqYXUgPSBHU1RfQVVfUEFSU0UgKG9iamVjdCk7CisKKyAgaWYgKGF1LT5hZGFwdGVyICE9IE5VTEwpIHsKKyAgICBnX29iamVjdF91bnJlZiAoYXUtPmFkYXB0ZXIpOworICAgIGF1LT5hZGFwdGVyID0gTlVMTDsKKyAgfQorICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdV9wYXJzZV9yZXNldCAoR3N0QXVQYXJzZSAqIGF1cGFyc2UpCit7CisgIGF1cGFyc2UtPm9mZnNldCA9IDA7CisgIGF1cGFyc2UtPmJ1ZmZlcl9vZmZzZXQgPSAwOworICBhdXBhcnNlLT5lbmNvZGluZyA9IDA7CisgIGF1cGFyc2UtPnNhbXBsZXJhdGUgPSAwOworICBhdXBhcnNlLT5jaGFubmVscyA9IDA7CisKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGF1cGFyc2UtPmFkYXB0ZXIpOworCisgIGdzdF9jYXBzX3JlcGxhY2UgKCZhdXBhcnNlLT5zcmNfY2FwcywgTlVMTCk7CisKKyAgLyogZ3N0X3NlZ21lbnRfaW5pdCAoJmF1cGFyc2UtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7ICovCit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXVfcGFyc2VfbmVnb3RpYXRlX3NyY3BhZCAoR3N0QXVQYXJzZSAqIGF1cGFyc2UsIEdzdENhcHMgKiBuZXdfY2FwcykKK3sKKyAgaWYgKGF1cGFyc2UtPnNyY19jYXBzICYmIGdzdF9jYXBzX2lzX2VxdWFsIChuZXdfY2FwcywgYXVwYXJzZS0+c3JjX2NhcHMpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGF1cGFyc2UsICJzYW1lIGNhcHMsIG5vdGhpbmcgdG8gZG8iKTsKKyAgICByZXR1cm47CisgIH0KKworICBnc3RfY2Fwc19yZXBsYWNlICgmYXVwYXJzZS0+c3JjX2NhcHMsIG5ld19jYXBzKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXVwYXJzZSwgIkNoYW5naW5nIHNyYyBwYWQgY2FwcyB0byAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIGF1cGFyc2UtPnNyY19jYXBzKTsKKyAgZ3N0X3BhZF9zZXRfY2FwcyAoYXVwYXJzZS0+c3JjcGFkLCBhdXBhcnNlLT5zcmNfY2Fwcyk7CisKKyAgcmV0dXJuOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F1X3BhcnNlX3BhcnNlX2hlYWRlciAoR3N0QXVQYXJzZSAqIGF1cGFyc2UpCit7CisgIEdzdENhcHMgKnRlbXBjYXBzOworICBndWludDMyIHNpemU7CisgIGd1aW50OCAqaGVhZDsKKyAgZ2NoYXIgbGF5b3V0WzddID0geyAwLCB9OworICBHc3RBdWRpb0Zvcm1hdCBmb3JtYXQgPSBHU1RfQVVESU9fRk9STUFUX1VOS05PV047CisgIGdpbnQgbGF3ID0gMDsKKyAgZ3VpbnQgZW5kaWFubmVzczsKKworICBoZWFkID0gKGd1aW50OCAqKSBnc3RfYWRhcHRlcl9tYXAgKGF1cGFyc2UtPmFkYXB0ZXIsIDI0KTsKKyAgZ19hc3NlcnQgKGhlYWQgIT0gTlVMTCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXVwYXJzZSwgIlslYyVjJWMlY10iLCBoZWFkWzBdLCBoZWFkWzFdLCBoZWFkWzJdLCBoZWFkWzNdKTsKKworICBzd2l0Y2ggKEdTVF9SRUFEX1VJTlQzMl9CRSAoaGVhZCkpIHsKKyAgICAgIC8qIG5vcm1hbCBmb3JtYXQgaXMgYmlnIGVuZGlhbiAoYXUgaXMgYSBTcGFyYyBmb3JtYXQpICovCisgICAgY2FzZSAweDJlNzM2ZTY0OnsgICAgICAgICAgLyogIi5zbmQiICovCisgICAgICBlbmRpYW5uZXNzID0gR19CSUdfRU5ESUFOOworICAgICAgYnJlYWs7CisgICAgfQorICAgICAgLyogYW5kIG9mIGNvdXJzZSwgc29tZW9uZSBoYWQgdG8gaW52ZW50IGEgbGl0dGxlIGVuZGlhbgorICAgICAgICogdmVyc2lvbi4gIFVzZWQgYnkgREVDIHN5c3RlbXMuICovCisgICAgY2FzZSAweDY0NmU3MzJlOiAgICAgICAgICAgLyogZG5zLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBjYXNlIDB4MDA2NDczMmU6eyAgICAgICAgICAvKiBvdGhlciBzb3VyY2Ugc2F5IGl0IGlzICJkbnMuIiAqLworICAgICAgZW5kaWFubmVzcyA9IEdfTElUVExFX0VORElBTjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OnsKKyAgICAgIGdvdG8gdW5rbm93bl9oZWFkZXI7CisgICAgfQorICB9CisKKyAgYXVwYXJzZS0+b2Zmc2V0ID0gR1NUX1JFQURfVUlOVDMyX0JFIChoZWFkICsgNCk7CisgIC8qIERvIG5vdCB0cnVzdCBzaXplLCBjb3VsZCBiZSBzZXQgdG8gLTEgOiB1bmtub3duCisgICAqIG90aGVyd2lzZTogZmlsZXNpemUgPSBzaXplICsgYXVwYXJzZS0+b2Zmc2V0CisgICAqLworICBzaXplID0gR1NUX1JFQURfVUlOVDMyX0JFIChoZWFkICsgOCk7CisgIGF1cGFyc2UtPmVuY29kaW5nID0gR1NUX1JFQURfVUlOVDMyX0JFIChoZWFkICsgMTIpOworICBhdXBhcnNlLT5zYW1wbGVyYXRlID0gR1NUX1JFQURfVUlOVDMyX0JFIChoZWFkICsgMTYpOworICBhdXBhcnNlLT5jaGFubmVscyA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoaGVhZCArIDIwKTsKKworICBpZiAoYXVwYXJzZS0+c2FtcGxlcmF0ZSA8IDgwMDAgfHwgYXVwYXJzZS0+c2FtcGxlcmF0ZSA+IDE5MjAwMCkKKyAgICBnb3RvIHVuc3VwcG9ydGVkX3NhbXBsZV9yYXRlOworCisgIGlmIChhdXBhcnNlLT5jaGFubmVscyA8IDEgfHwgYXVwYXJzZS0+Y2hhbm5lbHMgPiAyKQorICAgIGdvdG8gdW5zdXBwb3J0ZWRfbnVtYmVyX29mX2NoYW5uZWxzOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF1cGFyc2UsICJvZmZzZXQgJSIgR19HSU5UNjRfRk9STUFUICIsIHNpemUgJXUsICIKKyAgICAgICJlbmNvZGluZyAldSwgZnJlcXVlbmN5ICV1LCBjaGFubmVscyAldSIsIGF1cGFyc2UtPm9mZnNldCwgc2l6ZSwKKyAgICAgIGF1cGFyc2UtPmVuY29kaW5nLCBhdXBhcnNlLT5zYW1wbGVyYXRlLCBhdXBhcnNlLT5jaGFubmVscyk7CisKKyAgLyogRG9jczoKKyAgICogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL3B1YmxpYy9wdWJzL2V4dGVybmFsL2F1Zm9ybWF0Lmh0bWwKKyAgICogaHR0cDovL2FzdHJvbm9teS5zd2luLmVkdS5hdS9+cGJvdXJrZS9kYXRhZm9ybWF0cy9hdS8KKyAgICogU29sYXJpcyBoZWFkZXJzIDogL3Vzci9pbmNsdWRlL2F1ZGlvL2F1LmgKKyAgICogbGlic25kZmlsZSA6IHNyYy9hdS5jCisgICAqCisgICAqIFNhbXBsZXMgOgorICAgKiBodHRwOi8vd3d3LnRzcC5lY2UubWNnaWxsLmNhL01NU1AvRG9jdW1lbnRzL0F1ZGlvRm9ybWF0cy9BVS9TYW1wbGVzLmh0bWwKKyAgICovCisKKyAgc3dpdGNoIChhdXBhcnNlLT5lbmNvZGluZykgeworICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgIC8qIDgtYml0IElTRE4gbXUtbGF3IEcuNzExICovCisgICAgICBsYXcgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNzogICAgICAgICAgICAgICAgICAgLyogOC1iaXQgSVNETiAgQS1sYXcgRy43MTEgKi8KKyAgICAgIGxhdyA9IDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgIC8qICA4LWJpdCBsaW5lYXIgUENNLCBGSVhNRSBzaWduZWQ/ICovCisgICAgICBmb3JtYXQgPSBHU1RfQVVESU9fRk9STUFUX1M4OworICAgICAgYXVwYXJzZS0+c2FtcGxlX3NpemUgPSBhdXBhcnNlLT5jaGFubmVsczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgIC8qIDE2LWJpdCBsaW5lYXIgUENNICovCisgICAgICBpZiAoZW5kaWFubmVzcyA9PSBHX0xJVFRMRV9FTkRJQU4pCisgICAgICAgIGZvcm1hdCA9IEdTVF9BVURJT19GT1JNQVRfUzE2TEU7CisgICAgICBlbHNlCisgICAgICAgIGZvcm1hdCA9IEdTVF9BVURJT19GT1JNQVRfUzE2QkU7CisgICAgICBhdXBhcnNlLT5zYW1wbGVfc2l6ZSA9IGF1cGFyc2UtPmNoYW5uZWxzICogMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgIC8qIDI0LWJpdCBsaW5lYXIgUENNICovCisgICAgICBpZiAoZW5kaWFubmVzcyA9PSBHX0xJVFRMRV9FTkRJQU4pCisgICAgICAgIGZvcm1hdCA9IEdTVF9BVURJT19GT1JNQVRfUzI0TEU7CisgICAgICBlbHNlCisgICAgICAgIGZvcm1hdCA9IEdTVF9BVURJT19GT1JNQVRfUzI0QkU7CisgICAgICBhdXBhcnNlLT5zYW1wbGVfc2l6ZSA9IGF1cGFyc2UtPmNoYW5uZWxzICogMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTogICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBsaW5lYXIgUENNICovCisgICAgICBpZiAoZW5kaWFubmVzcyA9PSBHX0xJVFRMRV9FTkRJQU4pCisgICAgICAgIGZvcm1hdCA9IEdTVF9BVURJT19GT1JNQVRfUzMyTEU7CisgICAgICBlbHNlCisgICAgICAgIGZvcm1hdCA9IEdTVF9BVURJT19GT1JNQVRfUzMyQkU7CisgICAgICBhdXBhcnNlLT5zYW1wbGVfc2l6ZSA9IGF1cGFyc2UtPmNoYW5uZWxzICogNDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSA2OiAgICAgICAgICAgICAgICAgICAgLyogMzItYml0IElFRUUgZmxvYXRpbmcgcG9pbnQgKi8KKyAgICAgIGlmIChlbmRpYW5uZXNzID09IEdfTElUVExFX0VORElBTikKKyAgICAgICAgZm9ybWF0ID0gR1NUX0FVRElPX0ZPUk1BVF9GMzJMRTsKKyAgICAgIGVsc2UKKyAgICAgICAgZm9ybWF0ID0gR1NUX0FVRElPX0ZPUk1BVF9GMzJCRTsKKyAgICAgIGF1cGFyc2UtPnNhbXBsZV9zaXplID0gYXVwYXJzZS0+Y2hhbm5lbHMgKiA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OiAgICAgICAgICAgICAgICAgICAgLyogNjQtYml0IElFRUUgZmxvYXRpbmcgcG9pbnQgKi8KKyAgICAgIGlmIChlbmRpYW5uZXNzID09IEdfTElUVExFX0VORElBTikKKyAgICAgICAgZm9ybWF0ID0gR1NUX0FVRElPX0ZPUk1BVF9GNjRMRTsKKyAgICAgIGVsc2UKKyAgICAgICAgZm9ybWF0ID0gR1NUX0FVRElPX0ZPUk1BVF9GNjRCRTsKKyAgICAgIGF1cGFyc2UtPnNhbXBsZV9zaXplID0gYXVwYXJzZS0+Y2hhbm5lbHMgKiA4OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDIzOiAgICAgICAgICAgICAgICAgICAvKiA0LWJpdCBDQ0lUVCBHLjcyMSAgIEFEUENNIDMya2JwcyAtPiBtb2RwbHVnL2xpYnNuZGZpbGUgKGNvbXByZXNzZWQgOC1iaXQgbXUtbGF3KSAqLworICAgICAgc3RyY3B5IChsYXlvdXQsICJnNzIxIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI0OiAgICAgICAgICAgICAgICAgICAvKiA4LWJpdCBDQ0lUVCBHLjcyMiAgIEFEUENNICAgICAgICAtPiBydHAgKi8KKyAgICAgIHN0cmNweSAobGF5b3V0LCAiZzcyMiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNTogICAgICAgICAgICAgICAgICAgLyogMy1iaXQgQ0NJVFQgRy43MjMuMyBBRFBDTSAyNGticHMgLT4gcnRwL3hpbmUvbW9kcGx1Zy9saWJzbmRmaWxlICovCisgICAgICBzdHJjcHkgKGxheW91dCwgImc3MjNfMyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNjogICAgICAgICAgICAgICAgICAgLyogNS1iaXQgQ0NJVFQgRy43MjMuNSBBRFBDTSA0MGticHMgLT4gcnRwL3hpbmUvbW9kcGx1Zy9saWJzbmRmaWxlICovCisgICAgICBzdHJjcHkgKGxheW91dCwgImc3MjNfNSIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDg6ICAgICAgICAgICAgICAgICAgICAvKiBGcmFnbWVudGVkIHNhbXBsZSBkYXRhICovCisgICAgY2FzZSA5OiAgICAgICAgICAgICAgICAgICAgLyogQVVfRU5DT0RJTkdfTkVTVEVEICovCisKKyAgICBjYXNlIDEwOiAgICAgICAgICAgICAgICAgICAvKiBEU1AgcHJvZ3JhbSAqLworICAgIGNhc2UgMTE6ICAgICAgICAgICAgICAgICAgIC8qIERTUCAgOC1iaXQgZml4ZWQgcG9pbnQgKi8KKyAgICBjYXNlIDEyOiAgICAgICAgICAgICAgICAgICAvKiBEU1AgMTYtYml0IGZpeGVkIHBvaW50ICovCisgICAgY2FzZSAxMzogICAgICAgICAgICAgICAgICAgLyogRFNQIDI0LWJpdCBmaXhlZCBwb2ludCAqLworICAgIGNhc2UgMTQ6ICAgICAgICAgICAgICAgICAgIC8qIERTUCAzMi1iaXQgZml4ZWQgcG9pbnQgKi8KKworICAgIGNhc2UgMTY6ICAgICAgICAgICAgICAgICAgIC8qIEFVX0VOQ09ESU5HX0RJU1BMQVkgOiBub24tYXVkaW8gZGlzcGxheSBkYXRhICovCisgICAgY2FzZSAxNzogICAgICAgICAgICAgICAgICAgLyogQVVfRU5DT0RJTkdfTVVMQVdfU1FVRUxDSCAqLworCisgICAgY2FzZSAxODogICAgICAgICAgICAgICAgICAgLyogMTYtYml0IGxpbmVhciB3aXRoIGVtcGhhc2lzICovCisgICAgY2FzZSAxOTogICAgICAgICAgICAgICAgICAgLyogMTYtYml0IGxpbmVhciBjb21wcmVzc2VkIChOZVhUKSAqLworICAgIGNhc2UgMjA6ICAgICAgICAgICAgICAgICAgIC8qIDE2LWJpdCBsaW5lYXIgd2l0aCBlbXBoYXNpcyBhbmQgY29tcHJlc3Npb24gKi8KKworICAgIGNhc2UgMjE6ICAgICAgICAgICAgICAgICAgIC8qIE11c2ljIGtpdCBEU1AgY29tbWFuZHMgKi8KKyAgICBjYXNlIDIyOiAgICAgICAgICAgICAgICAgICAvKiBNdXNpYyBraXQgRFNQIGNvbW1hbmRzIHNhbXBsZXMgKi8KKworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIHVua25vd25fZm9ybWF0OworICB9CisKKyAgaWYgKGxhdykgeworICAgIHRlbXBjYXBzID0KKyAgICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoKGxhdyA9PSAxKSA/ICJhdWRpby94LW11bGF3IiA6ICJhdWRpby94LWFsYXciLAorICAgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIGF1cGFyc2UtPnNhbXBsZXJhdGUsCisgICAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGF1cGFyc2UtPmNoYW5uZWxzLCBOVUxMKTsKKyAgICBhdXBhcnNlLT5zYW1wbGVfc2l6ZSA9IGF1cGFyc2UtPmNoYW5uZWxzOworICB9IGVsc2UgaWYgKGZvcm1hdCAhPSBHU1RfQVVESU9fRk9STUFUX1VOS05PV04pIHsKKyAgICBHc3RDYXBzICp0ZW1wbF9jYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKGF1cGFyc2UtPnNyY3BhZCk7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgdGVtcGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgZ3N0X2F1ZGlvX2Zvcm1hdF90b19zdHJpbmcgKGZvcm1hdCksCisgICAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgYXVwYXJzZS0+c2FtcGxlcmF0ZSwKKyAgICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgYXVwYXJzZS0+Y2hhbm5lbHMsIE5VTEwpOworCisgICAgaW50ZXJzZWN0aW9uID0gZ3N0X2NhcHNfaW50ZXJzZWN0ICh0ZW1wY2FwcywgdGVtcGxfY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRlbXBjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGVtcGxfY2Fwcyk7CisgICAgdGVtcGNhcHMgPSBpbnRlcnNlY3Rpb247CisgIH0gZWxzZSBpZiAobGF5b3V0WzBdKSB7CisgICAgdGVtcGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1hZHBjbSIsCisgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCBsYXlvdXQsIE5VTEwpOworICAgIGF1cGFyc2UtPnNhbXBsZV9zaXplID0gMDsKKyAgfSBlbHNlCisgICAgZ290byB1bmtub3duX2Zvcm1hdDsKKworICBHU1RfREVCVUdfT0JKRUNUIChhdXBhcnNlLCAic2FtcGxlX3NpemU9JWQiLCBhdXBhcnNlLT5zYW1wbGVfc2l6ZSk7CisKKyAgZ3N0X2F1X3BhcnNlX25lZ290aWF0ZV9zcmNwYWQgKGF1cGFyc2UsIHRlbXBjYXBzKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChhdXBhcnNlLCAib2Zmc2V0PSUiIEdfR0lOVDY0X0ZPUk1BVCwgYXVwYXJzZS0+b2Zmc2V0KTsKKyAgZ3N0X2FkYXB0ZXJfdW5tYXAgKGF1cGFyc2UtPmFkYXB0ZXIpOworICBnc3RfYWRhcHRlcl9mbHVzaCAoYXVwYXJzZS0+YWRhcHRlciwgYXVwYXJzZS0+b2Zmc2V0KTsKKworICBnc3RfY2Fwc191bnJlZiAodGVtcGNhcHMpOworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCit1bmtub3duX2hlYWRlcjoKKyAgeworICAgIGdzdF9hZGFwdGVyX3VubWFwIChhdXBhcnNlLT5hZGFwdGVyKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXVwYXJzZSwgU1RSRUFNLCBXUk9OR19UWVBFLCAoTlVMTCksIChOVUxMKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit1bnN1cHBvcnRlZF9zYW1wbGVfcmF0ZToKKyAgeworICAgIGdzdF9hZGFwdGVyX3VubWFwIChhdXBhcnNlLT5hZGFwdGVyKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXVwYXJzZSwgU1RSRUFNLCBGT1JNQVQsIChOVUxMKSwKKyAgICAgICAgKCJVbnN1cHBvcnRlZCBzYW1wbGVyYXRlOiAldSIsIGF1cGFyc2UtPnNhbXBsZXJhdGUpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3Vuc3VwcG9ydGVkX251bWJlcl9vZl9jaGFubmVsczoKKyAgeworICAgIGdzdF9hZGFwdGVyX3VubWFwIChhdXBhcnNlLT5hZGFwdGVyKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXVwYXJzZSwgU1RSRUFNLCBGT1JNQVQsIChOVUxMKSwKKyAgICAgICAgKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHM6ICV1IiwgYXVwYXJzZS0+Y2hhbm5lbHMpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3Vua25vd25fZm9ybWF0OgorICB7CisgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKGF1cGFyc2UtPmFkYXB0ZXIpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChhdXBhcnNlLCBTVFJFQU0sIEZPUk1BVCwgKE5VTEwpLAorICAgICAgICAoIlVuc3VwcG9ydGVkIGVuY29kaW5nOiAldSIsIGF1cGFyc2UtPmVuY29kaW5nKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKKyNkZWZpbmUgQVVfSEVBREVSX1NJWkUgMjQKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hdV9wYXJzZV9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0QXVQYXJzZSAqYXVwYXJzZTsKKyAgZ2ludCBhdmFpbCwgc2VuZG5vdyA9IDA7CisgIGdpbnQ2NCB0aW1lc3RhbXA7CisgIGdpbnQ2NCBkdXJhdGlvbjsKKyAgZ2ludDY0IG9mZnNldDsKKworICBhdXBhcnNlID0gR1NUX0FVX1BBUlNFIChwYXJlbnQpOworCisgIEdTVF9MT0dfT0JKRUNUIChhdXBhcnNlLCAiZ290IGJ1ZmZlciBvZiBzaXplICUiIEdfR1NJWkVfRk9STUFULAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSk7CisKKyAgZ3N0X2FkYXB0ZXJfcHVzaCAoYXVwYXJzZS0+YWRhcHRlciwgYnVmKTsKKyAgYnVmID0gTlVMTDsKKworICAvKiBpZiB3ZSBoYXZlbid0IHNlZW4gYW55IGRhdGEgeWV0Li4uICovCisgIGlmICghZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChhdXBhcnNlLT5zcmNwYWQpKSB7CisgICAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoYXVwYXJzZS0+YWRhcHRlcikgPCBBVV9IRUFERVJfU0laRSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXVwYXJzZSwgIm5lZWQgbW9yZSBkYXRhIHRvIHBhcnNlIGhlYWRlciIpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICByZXQgPSBnc3RfYXVfcGFyc2VfcGFyc2VfaGVhZGVyIChhdXBhcnNlKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBvdXQ7CisKKyAgICBpZiAoYXVwYXJzZS0+bmVlZF9zZWdtZW50KSB7CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKGF1cGFyc2UtPnNyY3BhZCwKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZhdXBhcnNlLT5zZWdtZW50KSk7CisgICAgICBhdXBhcnNlLT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgICB9CisgIH0KKworICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoYXVwYXJzZS0+YWRhcHRlcik7CisKKyAgaWYgKGF1cGFyc2UtPnNhbXBsZV9zaXplID4gMCkgeworICAgIC8qIEVuc3VyZSB3ZSBwdXNoIGEgYnVmZmVyIHRoYXQncyBhIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplIGRvd25zdHJlYW0gKi8KKyAgICBzZW5kbm93ID0gYXZhaWwgLSAoYXZhaWwgJSBhdXBhcnNlLT5zYW1wbGVfc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgLyogSXQncyBzb21ldGhpbmcgbm9uLXRyaXZpYWwgKHN1Y2ggYXMgQURQQ00pLCB3ZSBkb24ndCB1bmRlcnN0YW5kIGl0LCBzbworICAgICAqIGp1c3QgcHVzaCBkb3duc3RyZWFtIGFuZCBhc3N1bWUgaXQgd2lsbCBrbm93IHdoYXQgdG8gZG8gd2l0aCBpdCAqLworICAgIHNlbmRub3cgPSBhdmFpbDsKKyAgfQorCisgIGlmIChzZW5kbm93ID4gMCkgeworICAgIEdzdEJ1ZmZlciAqb3V0YnVmOworICAgIGdpbnQ2NCBwb3M7CisKKyAgICBvdXRidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoYXVwYXJzZS0+YWRhcHRlciwgc2VuZG5vdyk7CisgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChvdXRidWYpOworCisgICAgcG9zID0gYXVwYXJzZS0+YnVmZmVyX29mZnNldCAtIGF1cGFyc2UtPm9mZnNldDsKKyAgICBwb3MgPSBNQVggKHBvcywgMCk7CisKKyAgICBpZiAoYXVwYXJzZS0+c2FtcGxlX3NpemUgPiAwICYmIGF1cGFyc2UtPnNhbXBsZXJhdGUgPiAwKSB7CisgICAgICBnc3RfYXVfcGFyc2Vfc3JjX2NvbnZlcnQgKGF1cGFyc2UsIEdTVF9GT1JNQVRfQllURVMsIHBvcywKKyAgICAgICAgICBHU1RfRk9STUFUX0RFRkFVTFQsICZvZmZzZXQpOworICAgICAgZ3N0X2F1X3BhcnNlX3NyY19jb252ZXJ0IChhdXBhcnNlLCBHU1RfRk9STUFUX0JZVEVTLCBwb3MsCisgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCAmdGltZXN0YW1wKTsKKyAgICAgIGdzdF9hdV9wYXJzZV9zcmNfY29udmVydCAoYXVwYXJzZSwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICAgICAgICBzZW5kbm93LCBHU1RfRk9STUFUX1RJTUUsICZkdXJhdGlvbik7CisKKyAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpID0gb2Zmc2V0OworICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSB0aW1lc3RhbXA7CisgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gZHVyYXRpb247CisgICAgfQorCisgICAgYXVwYXJzZS0+YnVmZmVyX29mZnNldCArPSBzZW5kbm93OworCisgICAgcmV0ID0gZ3N0X3BhZF9wdXNoIChhdXBhcnNlLT5zcmNwYWQsIG91dGJ1Zik7CisgIH0KKworb3V0OgorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1X3BhcnNlX3NyY19jb252ZXJ0IChHc3RBdVBhcnNlICogYXVwYXJzZSwgR3N0Rm9ybWF0IHNyY19mb3JtYXQsCisgICAgZ2ludDY0IHNyY3ZhbCwgR3N0Rm9ybWF0IGRlc3RfZm9ybWF0LCBnaW50NjQgKiBkZXN0dmFsKQoreworICBnYm9vbGVhbiByZXQgPSBUUlVFOworICBndWludCBzYW1wbGVzaXplLCByYXRlOworCisgIGlmIChkZXN0X2Zvcm1hdCA9PSBzcmNfZm9ybWF0KSB7CisgICAgKmRlc3R2YWwgPSBzcmN2YWw7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBHU1RfT0JKRUNUX0xPQ0sgKGF1cGFyc2UpOworICBzYW1wbGVzaXplID0gYXVwYXJzZS0+c2FtcGxlX3NpemU7CisgIHJhdGUgPSBhdXBhcnNlLT5zYW1wbGVyYXRlOworICBHU1RfT0JKRUNUX1VOTE9DSyAoYXVwYXJzZSk7CisKKyAgaWYgKHNhbXBsZXNpemUgPT0gMCB8fCByYXRlID09IDApIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoYXVwYXJzZSwgImNhbm5vdCBjb252ZXJ0LCBzYW1wbGVfc2l6ZSBvciByYXRlIHVua25vd24iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBzd2l0Y2ggKHNyY19mb3JtYXQpIHsKKyAgICBjYXNlIEdTVF9GT1JNQVRfQllURVM6CisgICAgICBzcmN2YWwgLz0gc2FtcGxlc2l6ZTsKKyAgICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgY2FzZSBHU1RfRk9STUFUX0RFRkFVTFQ6eworICAgICAgc3dpdGNoIChkZXN0X2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfREVGQVVMVDoKKyAgICAgICAgICAqZGVzdHZhbCA9IHNyY3ZhbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgICAgICpkZXN0dmFsID0gc3JjdmFsICogc2FtcGxlc2l6ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICAgICAgKmRlc3R2YWwgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChzcmN2YWwsIEdTVF9TRUNPTkQsIHJhdGUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldCA9IEZBTFNFOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0ZPUk1BVF9USU1FOnsKKyAgICAgIHN3aXRjaCAoZGVzdF9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgICAgICpkZXN0dmFsID0gc2FtcGxlc2l6ZSAqCisgICAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNyY3ZhbCwgcmF0ZSwgR1NUX1NFQ09ORCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICAgICpkZXN0dmFsID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoc3JjdmFsLCByYXRlLCBHU1RfU0VDT05EKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXQgPSBGQUxTRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OnsKKyAgICAgIHJldCA9IEZBTFNFOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKCFyZXQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdXBhcnNlLCAiY291bGQgbm90IGNvbnZlcnQgZnJvbSAlcyB0byAlcyBmb3JtYXQiLAorICAgICAgICBnc3RfZm9ybWF0X2dldF9uYW1lIChzcmNfZm9ybWF0KSwgZ3N0X2Zvcm1hdF9nZXRfbmFtZSAoZGVzdF9mb3JtYXQpKTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1X3BhcnNlX3NyY19xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdEF1UGFyc2UgKmF1cGFyc2U7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIGF1cGFyc2UgPSBHU1RfQVVfUEFSU0UgKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfRFVSQVRJT046eworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgICAgIGdpbnQ2NCBsZW4sIHZhbDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2R1cmF0aW9uIChxdWVyeSwgJmZvcm1hdCwgTlVMTCk7CisgICAgICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAoYXVwYXJzZS0+c2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICAgICAgICAgICAgJmxlbikpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXVwYXJzZSwgImZhaWxlZCB0byBxdWVyeSB1cHN0cmVhbSBsZW5ndGgiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGF1cGFyc2UpOworICAgICAgbGVuIC09IGF1cGFyc2UtPm9mZnNldDsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChhdXBhcnNlKTsKKworICAgICAgcmV0ID0KKyAgICAgICAgICBnc3RfYXVfcGFyc2Vfc3JjX2NvbnZlcnQgKGF1cGFyc2UsIEdTVF9GT1JNQVRfQllURVMsIGxlbiwgZm9ybWF0LAorICAgICAgICAgICZ2YWwpOworCisgICAgICBpZiAocmV0KSB7CisgICAgICAgIGdzdF9xdWVyeV9zZXRfZHVyYXRpb24gKHF1ZXJ5LCBmb3JtYXQsIHZhbCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfUE9TSVRJT046eworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgICAgIGdpbnQ2NCBwb3MsIHZhbDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3Bvc2l0aW9uIChxdWVyeSwgJmZvcm1hdCwgTlVMTCk7CisgICAgICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeV9wb3NpdGlvbiAoYXVwYXJzZS0+c2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICAgICAgICAgICAgJnBvcykpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXVwYXJzZSwgImZhaWxlZCB0byBxdWVyeSB1cHN0cmVhbSBwb3NpdGlvbiIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoYXVwYXJzZSk7CisgICAgICBwb3MgLT0gYXVwYXJzZS0+b2Zmc2V0OworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGF1cGFyc2UpOworCisgICAgICByZXQgPSBnc3RfYXVfcGFyc2Vfc3JjX2NvbnZlcnQgKGF1cGFyc2UsIEdTVF9GT1JNQVRfQllURVMsIHBvcywKKyAgICAgICAgICBmb3JtYXQsICZ2YWwpOworCisgICAgICBpZiAocmV0KSB7CisgICAgICAgIGdzdF9xdWVyeV9zZXRfcG9zaXRpb24gKHF1ZXJ5LCBmb3JtYXQsIHZhbCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfU0VFS0lORzp7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworCisgICAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksICZmb3JtYXQsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgLyogRklYTUU6IHF1ZXJ5IGR1cmF0aW9uIGluICdmb3JtYXQnCisgICAgICAgICBnc3RfcXVlcnlfc2V0X3NlZWtpbmcgKHF1ZXJ5LCBmb3JtYXQsIFRSVUUsIDAsIGR1cmF0aW9uKTsKKyAgICAgICAqLworICAgICAgZ3N0X3F1ZXJ5X3NldF9zZWVraW5nIChxdWVyeSwgZm9ybWF0LCBUUlVFLCAwLCBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYXVfcGFyc2VfaGFuZGxlX3NlZWsgKEdzdEF1UGFyc2UgKiBhdXBhcnNlLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RTZWVrVHlwZSBzdGFydF90eXBlLCBzdG9wX3R5cGU7CisgIEdzdFNlZWtGbGFncyBmbGFnczsKKyAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgZ2RvdWJsZSByYXRlOworICBnaW50NjQgc3RhcnQsIHN0b3A7CisgIGdib29sZWFuIHJlczsKKworICBnc3RfZXZlbnRfcGFyc2Vfc2VlayAoZXZlbnQsICZyYXRlLCAmZm9ybWF0LCAmZmxhZ3MsICZzdGFydF90eXBlLCAmc3RhcnQsCisgICAgICAmc3RvcF90eXBlLCAmc3RvcCk7CisKKyAgaWYgKGZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdXBhcnNlLCAib25seSBzdXBwb3J0IHNlZWtzIGluIFRJTUUgZm9ybWF0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmVzID0gZ3N0X2F1X3BhcnNlX3NyY19jb252ZXJ0IChhdXBhcnNlLCBHU1RfRk9STUFUX1RJTUUsIHN0YXJ0LAorICAgICAgR1NUX0ZPUk1BVF9CWVRFUywgJnN0YXJ0KTsKKworICBpZiAoc3RvcCA+IDApIHsKKyAgICByZXMgPSBnc3RfYXVfcGFyc2Vfc3JjX2NvbnZlcnQgKGF1cGFyc2UsIEdTVF9GT1JNQVRfVElNRSwgc3RvcCwKKyAgICAgICAgR1NUX0ZPUk1BVF9CWVRFUywgJnN0b3ApOworICB9CisKKyAgR1NUX0lORk9fT0JKRUNUIChhdXBhcnNlLAorICAgICAgInNlZWtpbmc6ICUiIEdfR0lOVDY0X0ZPUk1BVCAiIC4uLiAlIiBHX0dJTlQ2NF9GT1JNQVQsIHN0YXJ0LCBzdG9wKTsKKworICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VlayAocmF0ZSwgR1NUX0ZPUk1BVF9CWVRFUywgZmxhZ3MsIHN0YXJ0X3R5cGUsIHN0YXJ0LAorICAgICAgc3RvcF90eXBlLCBzdG9wKTsKKyAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChhdXBhcnNlLT5zaW5rcGFkLCBldmVudCk7CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1X3BhcnNlX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RBdVBhcnNlICphdXBhcnNlOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIGF1cGFyc2UgPSBHU1RfQVVfUEFSU0UgKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfQ0FQUzoKKyAgICB7CisgICAgICAvKiBkaXNjYXJkLCB3ZSdsbCBjb21lIHVwIHdpdGggcHJvcGVyIHNyYyBjYXBzICovCisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgIHsKKyAgICAgIGdpbnQ2NCBzdGFydCwgc3RvcCwgb2Zmc2V0ID0gMDsKKyAgICAgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICAgICAgLyogc29tZSBkZWJ1ZyBvdXRwdXQgKi8KKyAgICAgIGdzdF9ldmVudF9jb3B5X3NlZ21lbnQgKGV2ZW50LCAmc2VnbWVudCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdXBhcnNlLCAicmVjZWl2ZWQgbmV3c2VnbWVudCAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsCisgICAgICAgICAgJnNlZ21lbnQpOworCisgICAgICBzdGFydCA9IHNlZ21lbnQuc3RhcnQ7CisgICAgICBzdG9wID0gc2VnbWVudC5zdG9wOworICAgICAgaWYgKGF1cGFyc2UtPnNhbXBsZV9zaXplID4gMCkgeworICAgICAgICBpZiAoc3RhcnQgPiAwKSB7CisgICAgICAgICAgb2Zmc2V0ID0gc3RhcnQ7CisgICAgICAgICAgc3RhcnQgLT0gYXVwYXJzZS0+b2Zmc2V0OworICAgICAgICAgIHN0YXJ0ID0gTUFYIChzdGFydCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0b3AgPiAwKSB7CisgICAgICAgICAgc3RvcCAtPSBhdXBhcnNlLT5vZmZzZXQ7CisgICAgICAgICAgc3RvcCA9IE1BWCAoc3RvcCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZ3N0X2F1X3BhcnNlX3NyY19jb252ZXJ0IChhdXBhcnNlLCBHU1RfRk9STUFUX0JZVEVTLCBzdGFydCwKKyAgICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwgJnN0YXJ0KTsKKyAgICAgICAgZ3N0X2F1X3BhcnNlX3NyY19jb252ZXJ0IChhdXBhcnNlLCBHU1RfRk9STUFUX0JZVEVTLCBzdG9wLAorICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCAmc3RvcCk7CisgICAgICB9CisKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoYXVwYXJzZSwKKyAgICAgICAgICAibmV3IHNlZ21lbnQ6ICUiIEdTVF9USU1FX0ZPUk1BVCAiIC4uLiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc3RhcnQpLCBHU1RfVElNRV9BUkdTIChzdG9wKSk7CisKKyAgICAgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICAgICAgc2VnbWVudC5zdGFydCA9IHNlZ21lbnQudGltZSA9IHN0YXJ0OworICAgICAgc2VnbWVudC5zdG9wID0gc3RvcDsKKworICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvICgmc2VnbWVudCwgJmF1cGFyc2UtPnNlZ21lbnQpOworCisgICAgICBpZiAoIWdzdF9wYWRfaGFzX2N1cnJlbnRfY2FwcyAoYXVwYXJzZS0+c3JjcGFkKSkgeworICAgICAgICBhdXBhcnNlLT5uZWVkX3NlZ21lbnQgPSBUUlVFOworICAgICAgICByZXQgPSBUUlVFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXVwYXJzZS0+bmVlZF9zZWdtZW50ID0gRkFMU0U7CisgICAgICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAoYXVwYXJzZS0+c3JjcGFkLAorICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworICAgICAgfQorCisgICAgICBhdXBhcnNlLT5idWZmZXJfb2Zmc2V0ID0gb2Zmc2V0OworCisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgICBpZiAoIWF1cGFyc2UtPnNyY3BhZCkgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXVwYXJzZSwgU1RSRUFNLCBXUk9OR19UWVBFLAorICAgICAgICAgICAgKCJObyB2YWxpZCBpbnB1dCBmb3VuZCBiZWZvcmUgZW5kIG9mIHN0cmVhbSIpLCAoTlVMTCkpOworICAgICAgfQorICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYXVfcGFyc2Vfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0QXVQYXJzZSAqYXVwYXJzZTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIGF1cGFyc2UgPSBHU1RfQVVfUEFSU0UgKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICAgIHJldCA9IGdzdF9hdV9wYXJzZV9oYW5kbGVfc2VlayAoYXVwYXJzZSwgZXZlbnQpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9hdV9wYXJzZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RBdVBhcnNlICphdXBhcnNlID0gR1NUX0FVX1BBUlNFIChlbGVtZW50KTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTOworCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICByZXR1cm4gcmV0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfYXVfcGFyc2VfcmVzZXQgKGF1cGFyc2UpOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXVwYXJzZSIsIEdTVF9SQU5LX1NFQ09OREFSWSwKKyAgICAgICAgICBHU1RfVFlQRV9BVV9QQVJTRSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGF1cGFyc2UsCisgICAgInBhcnNlcyBhdSBzdHJlYW1zIiwgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwKKyAgICBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmggYi9nc3QvYXVwYXJzZS9nc3RhdXBhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhMDk5NQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdXBhcnNlL2dzdGF1cGFyc2UuaApAQCAtMCwwICsxLDc1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9BVV9QQVJTRV9IX18KKyNkZWZpbmUgX19HU1RfQVVfUEFSU0VfSF9fCisKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0FVX1BBUlNFIFwKKyAgKGdzdF9hdV9wYXJzZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVVfUEFSU0Uob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9BVV9QQVJTRSxHc3RBdVBhcnNlKSkKKyNkZWZpbmUgR1NUX0FVX1BBUlNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0FVX1BBUlNFLEdzdEF1UGFyc2VDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BVV9QQVJTRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0FVX1BBUlNFKSkKKyNkZWZpbmUgR1NUX0lTX0FVX1BBUlNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0FVX1BBUlNFKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1UGFyc2UgR3N0QXVQYXJzZTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdVBhcnNlQ2xhc3MgR3N0QXVQYXJzZUNsYXNzOworCitzdHJ1Y3QgX0dzdEF1UGFyc2UgeworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgR3N0UGFkICAgICAqc2lua3BhZDsKKyAgR3N0UGFkICAgICAqc3JjcGFkOworCisgIEdzdENhcHMgICAgKnNyY19jYXBzOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisKKyAgR3N0U2VnbWVudCAgc2VnbWVudDsKKyAgZ2Jvb2xlYW4gICAgbmVlZF9zZWdtZW50OworCisgIGdpbnQ2NCAgICAgIG9mZnNldDsgICAgICAgIC8qIHdoZXJlIHNhbXBsZSBkYXRhIHN0YXJ0cyAqLworICBnaW50NjQgICAgICBidWZmZXJfb2Zmc2V0OworICBndWludCAgICAgICBzYW1wbGVfc2l6ZTsKKyAgZ3VpbnQgICAgICAgZW5jb2Rpbmc7CisgIGd1aW50ICAgICAgIHNhbXBsZXJhdGU7CisgIGd1aW50ICAgICAgIGNoYW5uZWxzOworfTsKKworc3RydWN0IF9Hc3RBdVBhcnNlQ2xhc3MgeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2F1X3BhcnNlX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0FVX1BBUlNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2F1cGFyc2UvbWVzb24uYnVpbGQgYi9nc3QvYXVwYXJzZS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDMwOGQyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1cGFyc2UvbWVzb24uYnVpbGQKQEAgLTAsMCArMSw4IEBACitnc3RhdXBhcnNlID0gbGlicmFyeSgnZ3N0YXVwYXJzZScsCisgICdnc3RhdXBhcnNlLmMnLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdGF1ZGlvX2RlcCwgZ3N0YmFzZV9kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L2F1dG9kZXRlY3QvTWFrZWZpbGUuYW0gYi9nc3QvYXV0b2RldGVjdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjkyOGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1dG9kZXRlY3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxOCBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0YXV0b2RldGVjdC5sYQorCitsaWJnc3RhdXRvZGV0ZWN0X2xhX1NPVVJDRVMgPSBcCisJZ3N0YXV0b2F1ZGlvc2luay5jIFwKKwlnc3RhdXRvYXVkaW9zcmMuYyBcCisJZ3N0YXV0b2RldGVjdC5jIFwKKwlnc3RhdXRvdmlkZW9zaW5rLmMgXAorCWdzdGF1dG92aWRlb3NyYy5jCitsaWJnc3RhdXRvZGV0ZWN0X2xhX0NGTEFHUyA9ICQoR1NUX0NGTEFHUykKK2xpYmdzdGF1dG9kZXRlY3RfbGFfTElCQUREID0gJChHU1RfTElCUykKK2xpYmdzdGF1dG9kZXRlY3RfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IFwKKwlnc3RhdXRvYXVkaW9zaW5rLmggXAorCWdzdGF1dG9hdWRpb3NyYy5oIFwKKwlnc3RhdXRvZGV0ZWN0LmggXAorCWdzdGF1dG92aWRlb3NpbmsuaCBcCisJZ3N0YXV0b3ZpZGVvc3JjLmgKZGlmZiAtLWdpdCBhL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYyBiL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWRmNmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5jCkBAIC0wLDAgKzEsMTQzIEBACisvKiBHU3RyZWFtZXIKKyAqIChjKSAyMDA1IFJvbmFsZCBTLiBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqIChjKSAyMDA2IEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hdXRvYXVkaW9zaW5rCisgKiBAc2VlX2Fsc286IGF1dG92aWRlb3NpbmssIGFsc2FzaW5rLCBvc3NzaW5rCisgKgorICogYXV0b2F1ZGlvc2luayBpcyBhbiBhdWRpbyBzaW5rIHRoYXQgYXV0b21hdGljYWxseSBkZXRlY3RzIGFuIGFwcHJvcHJpYXRlCisgKiBhdWRpbyBzaW5rIHRvIHVzZS4gIEl0IGRvZXMgc28gYnkgc2Nhbm5pbmcgdGhlIHJlZ2lzdHJ5IGZvciBhbGwgZWxlbWVudHMKKyAqIHRoYXQgaGF2ZSA8cXVvdGU+U2luazwvcXVvdGU+IGFuZCA8cXVvdGU+QXVkaW88L3F1b3RlPiBpbiB0aGUgY2xhc3MgZmllbGQKKyAqIG9mIHRoZWlyIGVsZW1lbnQgaW5mb3JtYXRpb24sIGFuZCBhbHNvIGhhdmUgYSBub24temVybyBhdXRvcGx1Z2dpbmcgcmFuay4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgLW0gYXVkaW90ZXN0c3JjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIGF1dG9hdWRpb3NpbmsKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGF1dG9hdWRpb3NpbmsuaCIKKworI2RlZmluZSBERUZBVUxUX1RTX09GRlNFVCAgICAgICAgICAgMAorCisvKiBQcm9wZXJ0aWVzICovCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9UU19PRkZTRVQsCit9OworCitzdGF0aWMgdm9pZCBnc3RfYXV0b19hdWRpb19zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdXRvX2F1ZGlvX3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1dG9fYXVkaW9fc2lua19jb25maWd1cmUgKEdzdEF1dG9EZXRlY3QgKiBhdXRvZGV0ZWN0LAorICAgIEdzdEVsZW1lbnQgKiBraWQpOworCitHX0RFRklORV9UWVBFIChHc3RBdXRvQXVkaW9TaW5rLCBnc3RfYXV0b19hdWRpb19zaW5rLCBHU1RfVFlQRV9BVVRPX0RFVEVDVCk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b19hdWRpb19zaW5rX2NsYXNzX2luaXQgKEdzdEF1dG9BdWRpb1NpbmtDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmVrbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdzdEF1dG9EZXRlY3RDbGFzcyAqYWtsYXNzID0gR1NUX0FVVE9fREVURUNUX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2F1dG9fYXVkaW9fc2lua19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9hdXRvX2F1ZGlvX3NpbmtfZ2V0X3Byb3BlcnR5OworCisgIGFrbGFzcy0+Y29uZmlndXJlID0gZ3N0X2F1dG9fYXVkaW9fc2lua19jb25maWd1cmU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UU19PRkZTRVQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50NjQgKCJ0cy1vZmZzZXQiLCAiVFMgT2Zmc2V0IiwKKyAgICAgICAgICAiVGltZXN0YW1wIG9mZnNldCBpbiBuYW5vc2Vjb25kcyIsIEdfTUlOSU5UNjQsIEdfTUFYSU5UNjQsCisgICAgICAgICAgREVGQVVMVF9UU19PRkZTRVQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChla2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWtsYXNzLCAiQXV0byBhdWRpbyBzaW5rIiwKKyAgICAgICJTaW5rL0F1ZGlvIiwKKyAgICAgICJXcmFwcGVyIGF1ZGlvIHNpbmsgZm9yIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYXVkaW8gc2luayIsCisgICAgICAiSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1dG9fYXVkaW9fc2lua19pbml0IChHc3RBdXRvQXVkaW9TaW5rICogc2luaykKK3sKKyAgR3N0QXV0b0RldGVjdCAqYXV0b2RldGVjdCA9IEdTVF9BVVRPX0RFVEVDVCAoc2luayk7CisKKyAgYXV0b2RldGVjdC0+bWVkaWFfa2xhc3MgPSAiQXVkaW8iOworICBhdXRvZGV0ZWN0LT5mbGFnID0gR1NUX0VMRU1FTlRfRkxBR19TSU5LOworCisgIHNpbmstPnRzX29mZnNldCA9IERFRkFVTFRfVFNfT0ZGU0VUOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1dG9fYXVkaW9fc2lua19jb25maWd1cmUgKEdzdEF1dG9EZXRlY3QgKiBhdXRvZGV0ZWN0LCBHc3RFbGVtZW50ICoga2lkKQoreworICBHc3RBdXRvQXVkaW9TaW5rICpzZWxmID0gR1NUX0FVVE9fQVVESU9fU0lOSyAoYXV0b2RldGVjdCk7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoa2lkKSwgInRzLW9mZnNldCIsIHNlbGYtPnRzX29mZnNldCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b19hdWRpb19zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdXRvQXVkaW9TaW5rICpzaW5rID0gR1NUX0FVVE9fQVVESU9fU0lOSyAob2JqZWN0KTsKKyAgR3N0QXV0b0RldGVjdCAqYXV0b2RldGVjdCA9IChHc3RBdXRvRGV0ZWN0ICopIHNpbms7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1RTX09GRlNFVDoKKyAgICAgIHNpbmstPnRzX29mZnNldCA9IGdfdmFsdWVfZ2V0X2ludDY0ICh2YWx1ZSk7CisgICAgICBpZiAoYXV0b2RldGVjdC0+a2lkKQorICAgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChhdXRvZGV0ZWN0LT5raWQpLCBwc3BlYy0+bmFtZSwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1dG9fYXVkaW9fc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXV0b0F1ZGlvU2luayAqc2luayA9IEdTVF9BVVRPX0FVRElPX1NJTksgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1RTX09GRlNFVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludDY0ICh2YWx1ZSwgc2luay0+dHNfb2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuaCBiL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGEwYjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc2luay5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIEdTdHJlYW1lcgorICogKGMpIDIwMDUgUm9uYWxkIFMuIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQVVUT19BVURJT19TSU5LX0hfXworI2RlZmluZSBfX0dTVF9BVVRPX0FVRElPX1NJTktfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAiZ3N0YXV0b2RldGVjdC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQVVUT19BVURJT19TSU5LIFwKKyAgKGdzdF9hdXRvX2F1ZGlvX3NpbmtfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9BVVRPX0FVRElPX1NJTksob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0FVVE9fQVVESU9fU0lOSywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdEF1dG9BdWRpb1NpbmspKQorI2RlZmluZSBHU1RfQVVUT19BVURJT19TSU5LX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfQVVUT19BVURJT19TSU5LLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0QXV0b0F1ZGlvU2lua0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FVVE9fQVVESU9fU0lOSyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfQVVUT19BVURJT19TSU5LKSkKKyNkZWZpbmUgR1NUX0lTX0FVVE9fQVVESU9fU0lOS19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0FVVE9fQVVESU9fU0lOSykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdXRvQXVkaW9TaW5rIHsKKyAgR3N0QXV0b0RldGVjdCBwYXJlbnQ7CisKKyAgR3N0Q2xvY2tUaW1lRGlmZiB0c19vZmZzZXQ7Cit9IEdzdEF1dG9BdWRpb1Npbms7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdXRvQXVkaW9TaW5rQ2xhc3MgeworICBHc3RBdXRvRGV0ZWN0Q2xhc3MgcGFyZW50X2NsYXNzOworfSBHc3RBdXRvQXVkaW9TaW5rQ2xhc3M7CisKK0dUeXBlICAgZ3N0X2F1dG9fYXVkaW9fc2lua19nZXRfdHlwZSAgICAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BVVRPX0FVRElPX1NJTktfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYyBiL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG9hdWRpb3NyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZGRhMDAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuYwpAQCAtMCwwICsxLDk1IEBACisvKiBHU3RyZWFtZXIKKyAqIChjKSAyMDA1IFJvbmFsZCBTLiBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqIChjKSAyMDA2IEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKyAqIChjKSAyMDA4IFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hdXRvYXVkaW9zcmMKKyAqIEBzZWVfYWxzbzogYXV0b3ZpZGVvc3JjLCBhbHNhc3JjLCBvc3NzcmMKKyAqCisgKiBhdXRvYXVkaW9zcmMgaXMgYW4gYXVkaW8gc291cmNlIHRoYXQgYXV0b21hdGljYWxseSBkZXRlY3RzIGFuIGFwcHJvcHJpYXRlCisgKiBhdWRpbyBzb3VyY2UgdG8gdXNlLiAgSXQgZG9lcyBzbyBieSBzY2FubmluZyB0aGUgcmVnaXN0cnkgZm9yIGFsbCBlbGVtZW50cworICogdGhhdCBoYXZlIDxxdW90ZT5Tb3VyY2U8L3F1b3RlPiBhbmQgPHF1b3RlPkF1ZGlvPC9xdW90ZT4gaW4gdGhlIGNsYXNzIGZpZWxkCisgKiBvZiB0aGVpciBlbGVtZW50IGluZm9ybWF0aW9uLCBhbmQgYWxzbyBoYXZlIGEgbm9uLXplcm8gYXV0b3BsdWdnaW5nIHJhbmsuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IC1tIGF1dG9hdWRpb3NyYyAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RhdXRvYXVkaW9zcmMuaCIKKworR19ERUZJTkVfVFlQRSAoR3N0QXV0b0F1ZGlvU3JjLCBnc3RfYXV0b19hdWRpb19zcmMsIEdTVF9UWVBFX0FVVE9fREVURUNUKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworc3RhdGljIEdzdEVsZW1lbnQgKgorZ3N0X2F1dG9fYXVkaW9fc3JjX2NyZWF0ZV9mYWtlX2VsZW1lbnQgKEdzdEF1dG9EZXRlY3QgKiBhdXRvZGV0ZWN0KQoreworICBHc3RFbGVtZW50ICpmYWtlOworCisgIGZha2UgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb3Rlc3RzcmMiLCAiZmFrZS1hdXRvLWF1ZGlvLXNyYyIpOworICBpZiAoZmFrZSAhPSBOVUxMKSB7CisgICAgZ19vYmplY3Rfc2V0IChmYWtlLCAiaXMtbGl2ZSIsIFRSVUUsIE5VTEwpOworICAgIGdzdF91dGlsX3NldF9vYmplY3RfYXJnIChHX09CSkVDVCAoZmFrZSksICJ3YXZlIiwgInNpbGVuY2UiKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXV0b2RldGVjdCwgUkVTT1VSQ0UsIE5PVF9GT1VORCwKKyAgICAgICAgKCJGYWlsZWQgdG8gZmluZCB1c2FibGUgYXVkaW8gc291cmNlIGVsZW1lbnQuIiksCisgICAgICAgICgiRmFpbGVkIHRvIGZpbmQgYSB1c2FibGUgYXVkaW8gc291cmNlIGFuZCBjb3VsZG4ndCBjcmVhdGUgYW4gYXVkaW8iCisgICAgICAgICAgICAidGVzdHNyYyBhcyBmYWxsYmFjayBlaXRoZXIsIGNoZWNrIHlvdXIgR1N0cmVhbWVyIGluc3RhbGxhdGlvbi4iKSk7CisgICAgLyogVGhpcyB3aWxsIGVycm9yIG91dCB3aXRoIG5vdC1uZWdvdGlhdGVkLi4gKi8KKyAgICBmYWtlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNyYyIsICJmYWtlLWF1dG8tYXVkaW8tc3JjIik7CisgIH0KKyAgcmV0dXJuIGZha2U7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b19hdWRpb19zcmNfY2xhc3NfaW5pdCAoR3N0QXV0b0F1ZGlvU3JjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0QXV0b0RldGVjdENsYXNzICphdXRvY2xhc3MgPSBHU1RfQVVUT19ERVRFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICpla2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChla2xhc3MsICZzcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChla2xhc3MsICJBdXRvIGF1ZGlvIHNvdXJjZSIsCisgICAgICAiU291cmNlL0F1ZGlvIiwKKyAgICAgICJXcmFwcGVyIGF1ZGlvIHNvdXJjZSBmb3IgYXV0b21hdGljYWxseSBkZXRlY3RlZCBhdWRpbyBzb3VyY2UiLAorICAgICAgIkphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4sICIKKyAgICAgICJTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+Iik7CisKKyAgYXV0b2NsYXNzLT5jcmVhdGVfZmFrZV9lbGVtZW50ID0gZ3N0X2F1dG9fYXVkaW9fc3JjX2NyZWF0ZV9mYWtlX2VsZW1lbnQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b19hdWRpb19zcmNfaW5pdCAoR3N0QXV0b0F1ZGlvU3JjICogc3JjKQoreworICBHc3RBdXRvRGV0ZWN0ICphdXRvZGV0ZWN0ID0gR1NUX0FVVE9fREVURUNUIChzcmMpOworCisgIGF1dG9kZXRlY3QtPm1lZGlhX2tsYXNzID0gIkF1ZGlvIjsKKyAgYXV0b2RldGVjdC0+ZmxhZyA9IEdTVF9FTEVNRU5UX0ZMQUdfU09VUkNFOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmggYi9nc3QvYXV0b2RldGVjdC9nc3RhdXRvYXVkaW9zcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjdjZGFlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2F1ZGlvc3JjLmgKQEAgLTAsMCArMSw1NCBAQAorLyogR1N0cmVhbWVyCisgKiAoYykgMjAwNSBSb25hbGQgUy4gQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAoYykgMjAwOCBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BVVRPX0FVRElPX1NSQ19IX18KKyNkZWZpbmUgX19HU1RfQVVUT19BVURJT19TUkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAiZ3N0YXV0b2RldGVjdC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQVVUT19BVURJT19TUkMgXAorICAoZ3N0X2F1dG9fYXVkaW9fc3JjX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfQVVUT19BVURJT19TUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0FVVE9fQVVESU9fU1JDLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0QXV0b0F1ZGlvU3JjKSkKKyNkZWZpbmUgR1NUX0FVVE9fQVVESU9fU1JDX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfQVVUT19BVURJT19TUkMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RBdXRvQXVkaW9TcmNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BVVRPX0FVRElPX1NSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfQVVUT19BVURJT19TUkMpKQorI2RlZmluZSBHU1RfSVNfQVVUT19BVURJT19TUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9BVVRPX0FVRElPX1NSQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdXRvQXVkaW9TcmMgeworICBHc3RBdXRvRGV0ZWN0IHBhcmVudDsKK30gR3N0QXV0b0F1ZGlvU3JjOworCit0eXBlZGVmIHN0cnVjdCBfR3N0QXV0b0F1ZGlvU3JjQ2xhc3MgeworICBHc3RBdXRvRGV0ZWN0Q2xhc3MgcGFyZW50X2NsYXNzOworfSBHc3RBdXRvQXVkaW9TcmNDbGFzczsKKworR1R5cGUgICBnc3RfYXV0b19hdWRpb19zcmNfZ2V0X3R5cGUgICAgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQVVUT19BVURJT19TUkNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXV0b2RldGVjdC9nc3RhdXRvZGV0ZWN0LmMgYi9nc3QvYXV0b2RldGVjdC9nc3RhdXRvZGV0ZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzMDI0MQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuYwpAQCAtMCwwICsxLDUwNyBAQAorLyogR1N0cmVhbWVyCisgKiAoYykgMjAwNSBSb25hbGQgUy4gQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImdzdGF1dG9kZXRlY3QuaCIKKyNpbmNsdWRlICJnc3RhdXRvYXVkaW9zaW5rLmgiCisjaW5jbHVkZSAiZ3N0YXV0b2F1ZGlvc3JjLmgiCisjaW5jbHVkZSAiZ3N0YXV0b3ZpZGVvc2luay5oIgorI2luY2x1ZGUgImdzdGF1dG92aWRlb3NyYy5oIgorCitHU1RfREVCVUdfQ0FURUdPUlkgKGF1dG9kZXRlY3RfZGVidWcpOworCisjZGVmaW5lIERFRkFVTFRfU1lOQyAgICAgICAgICAgICAgICBUUlVFCisKKy8qIFByb3BlcnRpZXMgKi8KK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0NBUFMsCisgIFBST1BfU1lOQywKK307CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfYXV0b19kZXRlY3RfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyB2b2lkIGdzdF9hdXRvX2RldGVjdF9jb25zdHJ1Y3RlZCAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3RfYXV0b19kZXRlY3RfZGlzcG9zZSAoR09iamVjdCAqIHNlbGYpOworc3RhdGljIHZvaWQgZ3N0X2F1dG9fZGV0ZWN0X2NsZWFyX2tpZCAoR3N0QXV0b0RldGVjdCAqIHNlbGYpOworc3RhdGljIHZvaWQgZ3N0X2F1dG9fZGV0ZWN0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdXRvX2RldGVjdF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKKyNkZWZpbmUgZ3N0X2F1dG9fZGV0ZWN0X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUgKEdzdEF1dG9EZXRlY3QsIGdzdF9hdXRvX2RldGVjdCwgR1NUX1RZUEVfQklOKTsKKworc3RhdGljIHZvaWQKK2dzdF9hdXRvX2RldGVjdF9jbGFzc19pbml0IChHc3RBdXRvRGV0ZWN0Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmVrbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgZWtsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3RlZCA9IGdzdF9hdXRvX2RldGVjdF9jb25zdHJ1Y3RlZDsKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9hdXRvX2RldGVjdF9kaXNwb3NlOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfYXV0b19kZXRlY3Rfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfYXV0b19kZXRlY3RfZ2V0X3Byb3BlcnR5OworCisgIGVrbGFzcy0+Y2hhbmdlX3N0YXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdXRvX2RldGVjdF9jaGFuZ2Vfc3RhdGUpOworCisgIC8qKgorICAgKiBHc3RBdXRvRGV0ZWN0OmZpbHRlci1jYXBzOgorICAgKgorICAgKiBUaGlzIHByb3BlcnR5IHdpbGwgZmlsdGVyIG91dCBjYW5kaWRhdGUgc2lua3MgdGhhdCBjYW4gaGFuZGxlIHRoZSBzcGVjaWZpZWQKKyAgICogY2Fwcy4gQnkgZGVmYXVsdCBvbmx5IGVsZW1lbnRzIHRoYXQgc3VwcG9ydCB1bmNvbXByZXNzZWQgZGF0YSBhcmUgc2VsZWN0ZWQuCisgICAqCisgICAqIFRoaXMgcHJvcGVydHkgY2FuIG9ubHkgYmUgc2V0IGJlZm9yZSB0aGUgZWxlbWVudCBnb2VzIHRvIHRoZSBSRUFEWSBzdGF0ZS4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ0FQUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoImZpbHRlci1jYXBzIiwgIkZpbHRlciBjYXBzIiwKKyAgICAgICAgICAiRmlsdGVyIHNpbmsgY2FuZGlkYXRlcyB1c2luZyB0aGVzZSBjYXBzLiIsIEdTVF9UWVBFX0NBUFMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TWU5DLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzeW5jIiwgIlN5bmMiLAorICAgICAgICAgICJTeW5jIG9uIHRoZSBjbG9jayIsIERFRkFVTFRfU1lOQywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdXRvX2RldGVjdF9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RBdXRvRGV0ZWN0ICpzZWxmID0gR1NUX0FVVE9fREVURUNUIChvYmplY3QpOworCisgIGdzdF9hdXRvX2RldGVjdF9jbGVhcl9raWQgKHNlbGYpOworCisgIGlmIChzZWxmLT5maWx0ZXJfY2FwcykKKyAgICBnc3RfY2Fwc191bnJlZiAoc2VsZi0+ZmlsdGVyX2NhcHMpOworICBzZWxmLT5maWx0ZXJfY2FwcyA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKChHT2JqZWN0ICopIHNlbGYpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1dG9fZGV0ZWN0X2NsZWFyX2tpZCAoR3N0QXV0b0RldGVjdCAqIHNlbGYpCit7CisgIGlmIChzZWxmLT5raWQpIHsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNlbGYtPmtpZCwgR1NUX1NUQVRFX05VTEwpOworICAgIGdzdF9iaW5fcmVtb3ZlIChHU1RfQklOIChzZWxmKSwgc2VsZi0+a2lkKTsKKyAgICBzZWxmLT5raWQgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK2dzdF9hdXRvX2RldGVjdF9jcmVhdGVfZmFrZV9lbGVtZW50X2RlZmF1bHQgKEdzdEF1dG9EZXRlY3QgKiBzZWxmKQoreworICBHc3RFbGVtZW50ICpmYWtlOworICBnY2hhciBkdW1teV9mYWN0b3J5WzEwXSwgZHVtbXlfbmFtZVsyMF07CisKKyAgc3ByaW50ZiAoZHVtbXlfZmFjdG9yeSwgImZha2UlcyIsIHNlbGYtPnR5cGVfa2xhc3NfbGMpOworICBzcHJpbnRmIChkdW1teV9uYW1lLCAiZmFrZS0lcy0lcyIsIHNlbGYtPm1lZGlhX2tsYXNzX2xjLCBzZWxmLT50eXBlX2tsYXNzX2xjKTsKKyAgZmFrZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoZHVtbXlfZmFjdG9yeSwgZHVtbXlfbmFtZSk7CisgIGdfb2JqZWN0X3NldCAoZmFrZSwgInN5bmMiLCBzZWxmLT5zeW5jLCBOVUxMKTsKKworICByZXR1cm4gZmFrZTsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorZ3N0X2F1dG9fZGV0ZWN0X2NyZWF0ZV9mYWtlX2VsZW1lbnQgKEdzdEF1dG9EZXRlY3QgKiBzZWxmKQoreworICBHc3RBdXRvRGV0ZWN0Q2xhc3MgKmtsYXNzID0gR1NUX0FVVE9fREVURUNUX0dFVF9DTEFTUyAoc2VsZik7CisgIEdzdEVsZW1lbnQgKmZha2U7CisKKyAgaWYgKGtsYXNzLT5jcmVhdGVfZmFrZV9lbGVtZW50KQorICAgIGZha2UgPSBrbGFzcy0+Y3JlYXRlX2Zha2VfZWxlbWVudCAoc2VsZik7CisgIGVsc2UKKyAgICBmYWtlID0gZ3N0X2F1dG9fZGV0ZWN0X2NyZWF0ZV9mYWtlX2VsZW1lbnRfZGVmYXVsdCAoc2VsZik7CisKKyAgcmV0dXJuIGZha2U7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F1dG9fZGV0ZWN0X2F0dGFjaF9naG9zdF9wYWQgKEdzdEF1dG9EZXRlY3QgKiBzZWxmKQoreworICBHc3RQYWQgKnRhcmdldCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzZWxmLT5raWQsIHNlbGYtPnR5cGVfa2xhc3NfbGMpOworICBnYm9vbGVhbiByZXMgPSBnc3RfZ2hvc3RfcGFkX3NldF90YXJnZXQgKEdTVF9HSE9TVF9QQUQgKHNlbGYtPnBhZCksIHRhcmdldCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHRhcmdldCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworLyogSGFjayB0byBtYWtlIGluaXRpYWwgbGlua2luZyB3b3JrOyBpZGVhbGx5LCB0aGlzJ2Qgd29yayBldmVuIHdoZW4KKyAqIG5vIHRhcmdldCBoYXMgYmVlbiBhc3NpZ25lZCB0byB0aGUgZ2hvc3RwYWQgeWV0LiAqLworc3RhdGljIHZvaWQKK2dzdF9hdXRvX2RldGVjdF9yZXNldCAoR3N0QXV0b0RldGVjdCAqIHNlbGYpCit7CisgIGdzdF9hdXRvX2RldGVjdF9jbGVhcl9raWQgKHNlbGYpOworCisgIC8qIHBsYWNlaG9sZGVyIGVsZW1lbnQgKi8KKyAgc2VsZi0+a2lkID0gZ3N0X2F1dG9fZGV0ZWN0X2NyZWF0ZV9mYWtlX2VsZW1lbnQgKHNlbGYpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAoc2VsZiksIHNlbGYtPmtpZCk7CisKKyAgZ3N0X2F1dG9fZGV0ZWN0X2F0dGFjaF9naG9zdF9wYWQgKHNlbGYpOworfQorCitzdGF0aWMgR3N0U3RhdGljQ2FwcyByYXdfYXVkaW9fY2FwcyA9IEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3Iik7CitzdGF0aWMgR3N0U3RhdGljQ2FwcyByYXdfdmlkZW9fY2FwcyA9IEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtcmF3Iik7CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b19kZXRlY3RfaW5pdCAoR3N0QXV0b0RldGVjdCAqIHNlbGYpCit7CisgIHNlbGYtPnN5bmMgPSBERUZBVUxUX1NZTkM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b19kZXRlY3RfY29uc3RydWN0ZWQgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEF1dG9EZXRlY3QgKnNlbGYgPSBHU1RfQVVUT19ERVRFQ1QgKG9iamVjdCk7CisgIGdib29sZWFuIGlzX2F1ZGlvOworCisgIGlmIChHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y29uc3RydWN0ZWQpCisgICAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNvbnN0cnVjdGVkIChvYmplY3QpOworCisgIGlzX2F1ZGlvID0gIWdfc3RyY21wMCAoc2VsZi0+bWVkaWFfa2xhc3MsICJBdWRpbyIpOworICBzZWxmLT50eXBlX2tsYXNzID0gKHNlbGYtPmZsYWcgPT0gR1NUX0VMRU1FTlRfRkxBR19TSU5LKSA/ICJTaW5rIiA6ICJTb3VyY2UiOworICBzZWxmLT50eXBlX2tsYXNzX2xjID0gKHNlbGYtPmZsYWcgPT0gR1NUX0VMRU1FTlRfRkxBR19TSU5LKSA/ICJzaW5rIiA6ICJzcmMiOworICBzZWxmLT5tZWRpYV9rbGFzc19sYyA9IGlzX2F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyI7CisgIC8qIHNldCB0aGUgZGVmYXVsdCByYXcgY2FwcyAqLworICBzZWxmLT5maWx0ZXJfY2FwcyA9IGdzdF9zdGF0aWNfY2Fwc19nZXQgKGlzX2F1ZGlvID8gJnJhd19hdWRpb19jYXBzIDoKKyAgICAgICZyYXdfdmlkZW9fY2Fwcyk7CisKKyAgc2VsZi0+cGFkID0gZ3N0X2dob3N0X3BhZF9uZXdfbm9fdGFyZ2V0IChzZWxmLT50eXBlX2tsYXNzX2xjLAorICAgICAgKHNlbGYtPmZsYWcgPT0gR1NUX0VMRU1FTlRfRkxBR19TSU5LKSA/IEdTVF9QQURfU0lOSyA6IEdTVF9QQURfU1JDKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHNlbGYpLCBzZWxmLT5wYWQpOworCisgIGdzdF9hdXRvX2RldGVjdF9yZXNldCAoc2VsZik7CisKKyAgLyogbWFyayBlbGVtZW50IHR5cGUgKi8KKyAgR1NUX09CSkVDVF9GTEFHX1NFVCAoc2VsZiwgc2VsZi0+ZmxhZyk7CisgIGdzdF9iaW5fc2V0X3N1cHByZXNzZWRfZmxhZ3MgKEdTVF9CSU4gKHNlbGYpLAorICAgICAgR1NUX0VMRU1FTlRfRkxBR19TT1VSQ0UgfCBHU1RfRUxFTUVOVF9GTEFHX1NJTkspOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdXRvX2RldGVjdF9mYWN0b3J5X2ZpbHRlciAoR3N0UGx1Z2luRmVhdHVyZSAqIGZlYXR1cmUsIGdwb2ludGVyIGRhdGEpCit7CisgIEdzdEF1dG9EZXRlY3QgKnNlbGYgPSAoR3N0QXV0b0RldGVjdCAqKSBkYXRhOworICBndWludCByYW5rOworICBjb25zdCBnY2hhciAqa2xhc3M7CisKKyAgLyogd2Ugb25seSBjYXJlIGFib3V0IGVsZW1lbnQgZmFjdG9yaWVzICovCisgIGlmICghR1NUX0lTX0VMRU1FTlRfRkFDVE9SWSAoZmVhdHVyZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIGF1ZGlvIHNpbmtzICovCisgIGtsYXNzID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9nZXRfbWV0YWRhdGEgKEdTVF9FTEVNRU5UX0ZBQ1RPUlkgKGZlYXR1cmUpLAorICAgICAgR1NUX0VMRU1FTlRfTUVUQURBVEFfS0xBU1MpOworICBpZiAoIShzdHJzdHIgKGtsYXNzLCBzZWxmLT50eXBlX2tsYXNzKSAmJiBzdHJzdHIgKGtsYXNzLCBzZWxmLT5tZWRpYV9rbGFzcykpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBvbmx5IHNlbGVjdCBlbGVtZW50cyB3aXRoIGF1dG9wbHVnZ2luZyByYW5rICovCisgIHJhbmsgPSBnc3RfcGx1Z2luX2ZlYXR1cmVfZ2V0X3JhbmsgKGZlYXR1cmUpOworICBpZiAocmFuayA8IEdTVF9SQU5LX01BUkdJTkFMKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorY3JlYXRlX2VsZW1lbnRfd2l0aF9wcmV0dHlfbmFtZSAoR3N0QXV0b0RldGVjdCAqIHNlbGYsCisgICAgR3N0RWxlbWVudEZhY3RvcnkgKiBmYWN0b3J5KQoreworICBHc3RFbGVtZW50ICplbGVtZW50OworICBnY2hhciAqbmFtZSwgKm1hcmtlcjsKKworICBtYXJrZXIgPSBnX3N0cmR1cCAoR1NUX09CSkVDVF9OQU1FIChmYWN0b3J5KSk7CisgIGlmIChnX3N0cl9oYXNfc3VmZml4IChtYXJrZXIsIHNlbGYtPnR5cGVfa2xhc3NfbGMpKQorICAgIG1hcmtlcltzdHJsZW4gKG1hcmtlcikgLSA0XSA9ICdcMCc7CisgIGlmIChnX3N0cl9oYXNfcHJlZml4IChtYXJrZXIsICJnc3QiKSkKKyAgICBtZW1tb3ZlIChtYXJrZXIsIG1hcmtlciArIDMsIHN0cmxlbiAobWFya2VyICsgMykgKyAxKTsKKyAgbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoIiVzLWFjdHVhbC0lcy0lcyIsIEdTVF9PQkpFQ1RfTkFNRSAoc2VsZiksCisgICAgICBzZWxmLT50eXBlX2tsYXNzX2xjLCBtYXJrZXIpOworICBnX2ZyZWUgKG1hcmtlcik7CisKKyAgZWxlbWVudCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfY3JlYXRlIChmYWN0b3J5LCBuYW1lKTsKKyAgZ19mcmVlIChuYW1lKTsKKworICByZXR1cm4gZWxlbWVudDsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorZ3N0X2F1dG9fZGV0ZWN0X2ZpbmRfYmVzdCAoR3N0QXV0b0RldGVjdCAqIHNlbGYpCit7CisgIEdMaXN0ICpsaXN0LCAqaXRlbTsKKyAgR3N0RWxlbWVudCAqY2hvaWNlID0gTlVMTDsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZSA9IE5VTEw7CisgIEdTTGlzdCAqZXJyb3JzID0gTlVMTDsKKyAgR3N0QnVzICpidXMgPSBnc3RfYnVzX25ldyAoKTsKKyAgR3N0UGFkICplbF9wYWQgPSBOVUxMOworICBHc3RDYXBzICplbF9jYXBzID0gTlVMTDsKKyAgZ2Jvb2xlYW4gbm9fbWF0Y2ggPSBUUlVFOworCisgIC8qIFdlIGRvbid0IHRyZWF0IHNvdW5kIHNlcnZlciBzaW5rcyBzcGVjaWFsLiBPdXIgcG9saWN5IGlzIHRoYXQgc291bmQKKyAgICogc2VydmVyIHNpbmtzIHRoYXQgaGF2ZSBhIHJhbmsgbXVzdCBub3QgYXV0by1zcGF3biBhIGRhZW1vbiB1bmRlciBhbnkKKyAgICogY2lyY3Vtc3RhbmNlcywgc28gdGhlcmUncyBub3RoaW5nIGZvciB1cyB0byB3b3JyeSBhYm91dCBoZXJlICovCisgIGxpc3QgPSBnc3RfcmVnaXN0cnlfZmVhdHVyZV9maWx0ZXIgKGdzdF9yZWdpc3RyeV9nZXQgKCksCisgICAgICAoR3N0UGx1Z2luRmVhdHVyZUZpbHRlcikgZ3N0X2F1dG9fZGV0ZWN0X2ZhY3RvcnlfZmlsdGVyLCBGQUxTRSwgc2VsZik7CisgIGxpc3QgPQorICAgICAgZ19saXN0X3NvcnQgKGxpc3QsIChHQ29tcGFyZUZ1bmMpIGdzdF9wbHVnaW5fZmVhdHVyZV9yYW5rX2NvbXBhcmVfZnVuYyk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNlbGYsICJUcnlpbmcgdG8gZmluZCB1c2FibGUgJXMgZWxlbWVudHMgLi4uIiwKKyAgICAgIHNlbGYtPm1lZGlhX2tsYXNzX2xjKTsKKworICBmb3IgKGl0ZW0gPSBsaXN0OyBpdGVtICE9IE5VTEw7IGl0ZW0gPSBpdGVtLT5uZXh0KSB7CisgICAgR3N0RWxlbWVudEZhY3RvcnkgKmYgPSBHU1RfRUxFTUVOVF9GQUNUT1JZIChpdGVtLT5kYXRhKTsKKyAgICBHc3RFbGVtZW50ICplbDsKKworICAgIGlmICgoZWwgPSBjcmVhdGVfZWxlbWVudF93aXRoX3ByZXR0eV9uYW1lIChzZWxmLCBmKSkpIHsKKyAgICAgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlRlc3RpbmcgJXMiLCBHU1RfT0JKRUNUX05BTUUgKGYpKTsKKworICAgICAgLyogSWYgYXV0b2RldGVjdCBoYXMgYmVlbiBwcm92aWRlZCB3aXRoIGZpbHRlciBjYXBzLAorICAgICAgICogYWNjZXB0IG9ubHkgZWxlbWVudHMgdGhhdCBtYXRjaCB3aXRoIHRoZSBmaWx0ZXIgY2FwcyAqLworICAgICAgaWYgKHNlbGYtPmZpbHRlcl9jYXBzKSB7CisgICAgICAgIGVsX3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChlbCwgc2VsZi0+dHlwZV9rbGFzc19sYyk7CisgICAgICAgIGVsX2NhcHMgPSBnc3RfcGFkX3F1ZXJ5X2NhcHMgKGVsX3BhZCwgTlVMTCk7CisgICAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGVsX3BhZCk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICAgICAiQ2hlY2tpbmcgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQgIiB2cy4gJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgICBzZWxmLT5maWx0ZXJfY2FwcywgZWxfY2Fwcyk7CisgICAgICAgIG5vX21hdGNoID0gIWdzdF9jYXBzX2Nhbl9pbnRlcnNlY3QgKHNlbGYtPmZpbHRlcl9jYXBzLCBlbF9jYXBzKTsKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKGVsX2NhcHMpOworCisgICAgICAgIGlmIChub19tYXRjaCkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJJbmNvbXBhdGlibGUgY2FwcyIpOworICAgICAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGVsKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiRm91bmQgY29tcGF0aWJsZSBjYXBzIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAoZWwsIGJ1cyk7CisgICAgICByZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsLCBHU1RfU1RBVEVfUkVBRFkpOworICAgICAgaWYgKHJldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlRoaXMgd29ya2VkISIpOworICAgICAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsLCBHU1RfU1RBVEVfTlVMTCk7CisgICAgICAgIGNob2ljZSA9IGVsOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogY29sbGVjdCBhbGwgZXJyb3IgbWVzc2FnZXMgKi8KKyAgICAgIHdoaWxlICgobWVzc2FnZSA9IGdzdF9idXNfcG9wX2ZpbHRlcmVkIChidXMsIEdTVF9NRVNTQUdFX0VSUk9SKSkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImVycm9yIG1lc3NhZ2UgJSIgR1NUX1BUUl9GT1JNQVQsIG1lc3NhZ2UpOworICAgICAgICBlcnJvcnMgPSBnX3NsaXN0X2FwcGVuZCAoZXJyb3JzLCBtZXNzYWdlKTsKKyAgICAgIH0KKworICAgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbCwgR1NUX1NUQVRFX05VTEwpOworICAgICAgZ3N0X29iamVjdF91bnJlZiAoZWwpOworICAgIH0KKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJkb25lIHRyeWluZyIpOworICBpZiAoIWNob2ljZSkgeworICAgIC8qIFdlIHBvc3QgYSB3YXJuaW5nIGFuZCBwbHVnIGEgZmFrZS1lbGVtZW50LiBUaGlzIGlzIGNvbnZlbmllbnQgZm9yIHJ1bm5pbmcKKyAgICAgKiB0ZXN0cyB3aXRob3V0IHJlcXVpcmluZyBoYXJkd2FyZSBzcmMvc2lua3MuICovCisgICAgaWYgKGVycm9ycykgeworICAgICAgR0Vycm9yICplcnIgPSBOVUxMOworICAgICAgZ2NoYXIgKmRiZyA9IE5VTEw7CisKKyAgICAgIC8qIEZJWE1FOiB3ZSBmb3J3YXJkIHRoZSBmaXJzdCBtZXNzYWdlIGZvciBub3c7IGJ1dCBsYXRlciBvbiBpdCBtaWdodCBtYWtlCisgICAgICAgKiBzZW5zZSB0byBmb3J3YXJkIGFsbCBzbyB0aGF0IGFwcHMgY2FuIGFjdHVhbGx5IGFuYWx5c2UgdGhlbS4gKi8KKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChHU1RfTUVTU0FHRSAoZXJyb3JzLT5kYXRhKSwgJmVyciwgJmRiZyk7CisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHNlbGYpLAorICAgICAgICAgIGdzdF9tZXNzYWdlX25ld193YXJuaW5nIChHU1RfT0JKRUNUX0NBU1QgKHNlbGYpLCBlcnIsIGRiZykpOworICAgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgICAgZ19mcmVlIChkYmcpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBzZW5kIHdhcm5pbmcgbWVzc2FnZSB0byBhcHBsaWNhdGlvbiBhbmQgdXNlIGEgZmFrZXNyYyAqLworICAgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoc2VsZiwgUkVTT1VSQ0UsIE5PVF9GT1VORCwgKE5VTEwpLAorICAgICAgICAgICgiRmFpbGVkIHRvIGZpbmQgYSB1c2FibGUgJXMgJXMiLCBzZWxmLT5tZWRpYV9rbGFzc19sYywKKyAgICAgICAgICAgICAgc2VsZi0+dHlwZV9rbGFzc19sYykpOworICAgIH0KKyAgICBjaG9pY2UgPSBnc3RfYXV0b19kZXRlY3RfY3JlYXRlX2Zha2VfZWxlbWVudCAoc2VsZik7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChjaG9pY2UsIEdTVF9TVEFURV9SRUFEWSk7CisgIH0KKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X3BsdWdpbl9mZWF0dXJlX2xpc3RfZnJlZSAobGlzdCk7CisgIGdfc2xpc3RfZm9yZWFjaCAoZXJyb3JzLCAoR0Z1bmMpIGdzdF9taW5pX29iamVjdF91bnJlZiwgTlVMTCk7CisgIGdfc2xpc3RfZnJlZSAoZXJyb3JzKTsKKworICByZXR1cm4gY2hvaWNlOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdXRvX2RldGVjdF9kZXRlY3QgKEdzdEF1dG9EZXRlY3QgKiBzZWxmKQoreworICBHc3RFbGVtZW50ICpraWQ7CisgIEdzdEF1dG9EZXRlY3RDbGFzcyAqa2xhc3MgPSBHU1RfQVVUT19ERVRFQ1RfR0VUX0NMQVNTIChzZWxmKTsKKworICBnc3RfYXV0b19kZXRlY3RfY2xlYXJfa2lkIChzZWxmKTsKKworICAvKiBmaW5kIGVsZW1lbnQgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkNyZWF0aW5nIG5ldyBraWQiKTsKKyAgaWYgKCEoa2lkID0gZ3N0X2F1dG9fZGV0ZWN0X2ZpbmRfYmVzdCAoc2VsZikpKQorICAgIGdvdG8gbm9fc2luazsKKworICBzZWxmLT5oYXNfc3luYyA9CisgICAgICBnX29iamVjdF9jbGFzc19maW5kX3Byb3BlcnR5IChHX09CSkVDVF9HRVRfQ0xBU1MgKGtpZCksICJzeW5jIikgIT0gTlVMTDsKKyAgaWYgKHNlbGYtPmhhc19zeW5jKQorICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGtpZCksICJzeW5jIiwgc2VsZi0+c3luYywgTlVMTCk7CisgIGlmIChrbGFzcy0+Y29uZmlndXJlKSB7CisgICAga2xhc3MtPmNvbmZpZ3VyZSAoc2VsZiwga2lkKTsKKyAgfQorCisgIHNlbGYtPmtpZCA9IGtpZDsKKworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAoc2VsZiksIGtpZCk7CisKKyAgLyogRW5zdXJlIHRoZSBjaGlsZCBpcyBicm91Z2h0IHVwIHRvIHRoZSByaWdodCBzdGF0ZSB0byBtYXRjaCB0aGUgcGFyZW50LiAqLworICBpZiAoR1NUX1NUQVRFIChzZWxmLT5raWQpIDwgR1NUX1NUQVRFIChzZWxmKSkKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNlbGYtPmtpZCwgR1NUX1NUQVRFIChzZWxmKSk7CisKKyAgLyogYXR0YWNoIGdob3N0IHBhZCAqLworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUmUtYXNzaWduaW5nIGdob3N0cGFkIik7CisgIGlmICghZ3N0X2F1dG9fZGV0ZWN0X2F0dGFjaF9naG9zdF9wYWQgKHNlbGYpKQorICAgIGdvdG8gdGFyZ2V0X2ZhaWxlZDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiZG9uZSBjaGFuZ2luZyBhdXRvICVzICVzIiwgc2VsZi0+bWVkaWFfa2xhc3NfbGMsCisgICAgICBzZWxmLT50eXBlX2tsYXNzX2xjKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK25vX3Npbms6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2VsZiwgTElCUkFSWSwgSU5JVCwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBmaW5kIGEgc3VwcG9ydGVkIGF1ZGlvIHNpbmsiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit0YXJnZXRfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNlbGYsIExJQlJBUlksIElOSVQsIChOVUxMKSwKKyAgICAgICAgKCJGYWlsZWQgdG8gc2V0IHRhcmdldCBwYWQiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2F1dG9fZGV0ZWN0X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUzsKKyAgR3N0QXV0b0RldGVjdCAqc2luayA9IEdTVF9BVVRPX0RFVEVDVCAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBpZiAoIWdzdF9hdXRvX2RldGVjdF9kZXRlY3QgKHNpbmspKQorICAgICAgICByZXR1cm4gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKQorICAgIHJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBnc3RfYXV0b19kZXRlY3RfcmVzZXQgKHNpbmspOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdXRvX2RldGVjdF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXV0b0RldGVjdCAqc2VsZiA9IEdTVF9BVVRPX0RFVEVDVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ0FQUzoKKyAgICAgIGlmIChzZWxmLT5maWx0ZXJfY2FwcykKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKHNlbGYtPmZpbHRlcl9jYXBzKTsKKyAgICAgIHNlbGYtPmZpbHRlcl9jYXBzID0gZ3N0X2NhcHNfY29weSAoZ3N0X3ZhbHVlX2dldF9jYXBzICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NZTkM6CisgICAgICBzZWxmLT5zeW5jID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgaWYgKHNlbGYtPmtpZCAmJiBzZWxmLT5oYXNfc3luYykKKyAgICAgICAgZ19vYmplY3Rfc2V0X3Byb3BlcnR5IChHX09CSkVDVCAoc2VsZi0+a2lkKSwgcHNwZWMtPm5hbWUsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdXRvX2RldGVjdF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXV0b0RldGVjdCAqc2VsZiA9IEdTVF9BVVRPX0RFVEVDVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ0FQUzoKKyAgICAgIGdzdF92YWx1ZV9zZXRfY2FwcyAodmFsdWUsIHNlbGYtPmZpbHRlcl9jYXBzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TWU5DOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNlbGYtPnN5bmMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChhdXRvZGV0ZWN0X2RlYnVnLCAiYXV0b2RldGVjdCIsIDAsCisgICAgICAiQXV0b2RldGVjdGlvbiBhdWRpby92aWRlbyBvdXRwdXQgd3JhcHBlciBlbGVtZW50cyIpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXV0b3ZpZGVvc2luayIsCisgICAgICBHU1RfUkFOS19OT05FLCBHU1RfVFlQRV9BVVRPX1ZJREVPX1NJTkspICYmCisgICAgICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXV0b3ZpZGVvc3JjIiwKKyAgICAgIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX0FVVE9fVklERU9fU1JDKSAmJgorICAgICAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImF1dG9hdWRpb3NpbmsiLAorICAgICAgR1NUX1JBTktfTk9ORSwgR1NUX1RZUEVfQVVUT19BVURJT19TSU5LKSAmJgorICAgICAgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImF1dG9hdWRpb3NyYyIsCisgICAgICBHU1RfUkFOS19OT05FLCBHU1RfVFlQRV9BVVRPX0FVRElPX1NSQyk7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBhdXRvZGV0ZWN0LAorICAgICJQbHVnaW4gY29udGFpbnMgYXV0by1kZXRlY3Rpb24gcGx1Z2lucyBmb3IgdmlkZW8vYXVkaW8gaW4tIGFuZCBvdXRwdXRzIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuaCBiL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG9kZXRlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWFlODlmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b2RldGVjdC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qIEdTdHJlYW1lcgorICogKGMpIDIwMDUgUm9uYWxkIFMuIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQVVUT19ERVRFQ1RfSF9fCisjZGVmaW5lIF9fR1NUX0FVVE9fREVURUNUX0hfXworCitHX0JFR0lOX0RFQ0xTCisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKGF1dG9kZXRlY3RfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgYXV0b2RldGVjdF9kZWJ1ZworCisjZGVmaW5lIEdTVF9UWVBFX0FVVE9fREVURUNUIChnc3RfYXV0b19kZXRlY3RfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9BVVRPX0RFVEVDVChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfQVVUT19ERVRFQ1QsIEdzdEF1dG9EZXRlY3QpKQorI2RlZmluZSBHU1RfQVVUT19ERVRFQ1RfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9BVVRPX0RFVEVDVCwgR3N0QXV0b0RldGVjdENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FVVE9fREVURUNUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9BVVRPX0RFVEVDVCkpCisjZGVmaW5lIEdTVF9JU19BVVRPX0RFVEVDVF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0FVVE9fREVURUNUKSkKKyNkZWZpbmUgR1NUX0FVVE9fREVURUNUX0dFVF9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9BVVRPX0RFVEVDVCwgR3N0QXV0b0RldGVjdENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1dG9EZXRlY3QgeworICBHc3RCaW4gcGFyZW50OworICAKKyAgLyogY29uZmlndXJhdGlvbiBmb3Igc3ViY2xhc3NlcyAqLworICBjb25zdCBnY2hhciAqbWVkaWFfa2xhc3M7IC8qIEF1ZGlvL1ZpZGVvLy4uLiAqLworICBHc3RFbGVtZW50RmxhZ3MgZmxhZzsgLyogR1NUX0VMRU1FTlRfRkxBR197U0lOSy9TT1VSQ0V9ICovCisKKyAgLyogZXhwbGljaXQgcG9pbnRlcnMgdG8gc3R1ZmYgdXNlZCAqLworICBHc3RQYWQgKnBhZDsKKyAgR3N0Q2FwcyAqZmlsdGVyX2NhcHM7CisgIGdib29sZWFuIHN5bmM7CisKKyAgLyogPCBwcml2YXRlID4gKi8gCisgIEdzdEVsZW1lbnQgKmtpZDsKKyAgZ2Jvb2xlYW4gaGFzX3N5bmM7CisgIGNvbnN0IGdjaGFyICp0eXBlX2tsYXNzOyAvKiBTb3VyY2UvU2luayAqLworICBjb25zdCBnY2hhciAqbWVkaWFfa2xhc3NfbGMsICp0eXBlX2tsYXNzX2xjOyAvKiBsb3dlciBjYXNlIHZlcnNpb25zICovCisKK30gR3N0QXV0b0RldGVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF1dG9EZXRlY3RDbGFzcyB7CisgIEdzdEJpbkNsYXNzIHBhcmVudF9jbGFzczsKKyAgCisgIC8qPCBwcml2YXRlID4qLworICAvKiB2aXJ0dWFsIG1ldGhvZHMgZm9yIHN1YmNsYXNzZXMgKi8KKyAgdm9pZCAoKmNvbmZpZ3VyZSkoR3N0QXV0b0RldGVjdCAqc2VsZiwgR3N0RWxlbWVudCAqa2lkKTsKKyAgR3N0RWxlbWVudCAqICgqY3JlYXRlX2Zha2VfZWxlbWVudCkgKEdzdEF1dG9EZXRlY3QgKiBhdXRvZGV0ZWN0KTsKK30gR3N0QXV0b0RldGVjdENsYXNzOworCitHVHlwZSAgIGdzdF9hdXRvX2RldGVjdF9nZXRfdHlwZSAgICAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BVVRPX0RFVEVDVF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYyBiL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGZkOTFlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5jCkBAIC0wLDAgKzEsMTQzIEBACisvKiBHU3RyZWFtZXIKKyAqIChjKSAyMDA1IFJvbmFsZCBTLiBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqIChjKSAyMDA2IEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hdXRvdmlkZW9zaW5rCisgKiBAc2VlX2Fsc286IGF1dG9hdWRpb3NpbmssIHhpbWFnZXNpbmssIHh2aW1hZ2VzaW5rLCBzZGx2aWRlb3NpbmsKKyAqCisgKiBhdXRvdmlkZW9zaW5rIGlzIGEgdmlkZW8gc2luayB0aGF0IGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyBhbiBhcHByb3ByaWF0ZQorICogdmlkZW8gc2luayB0byB1c2UuICBJdCBkb2VzIHNvIGJ5IHNjYW5uaW5nIHRoZSByZWdpc3RyeSBmb3IgYWxsIGVsZW1lbnRzCisgKiB0aGF0IGhhdmUgPHF1b3RlPlNpbms8L3F1b3RlPiBhbmQgPHF1b3RlPlZpZGVvPC9xdW90ZT4gaW4gdGhlIGNsYXNzIGZpZWxkCisgKiBvZiB0aGVpciBlbGVtZW50IGluZm9ybWF0aW9uLCBhbmQgYWxzbyBoYXZlIGEgbm9uLXplcm8gYXV0b3BsdWdnaW5nIHJhbmsuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IC1tIHZpZGVvdGVzdHNyYyAhIGF1dG92aWRlb3NpbmsKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGF1dG92aWRlb3NpbmsuaCIKKworI2RlZmluZSBERUZBVUxUX1RTX09GRlNFVCAgICAgICAgICAgMAorCisvKiBQcm9wZXJ0aWVzICovCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9UU19PRkZTRVQsCit9OworCitzdGF0aWMgdm9pZCBnc3RfYXV0b192aWRlb19zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hdXRvX3ZpZGVvX3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F1dG9fdmlkZW9fc2lua19jb25maWd1cmUgKEdzdEF1dG9EZXRlY3QgKiBhdXRvZGV0ZWN0LAorICAgIEdzdEVsZW1lbnQgKiBraWQpOworCitHX0RFRklORV9UWVBFIChHc3RBdXRvVmlkZW9TaW5rLCBnc3RfYXV0b192aWRlb19zaW5rLCBHU1RfVFlQRV9BVVRPX0RFVEVDVCk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b192aWRlb19zaW5rX2NsYXNzX2luaXQgKEdzdEF1dG9WaWRlb1NpbmtDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmVrbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdzdEF1dG9EZXRlY3RDbGFzcyAqYWtsYXNzID0gR1NUX0FVVE9fREVURUNUX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2F1dG9fdmlkZW9fc2lua19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9hdXRvX3ZpZGVvX3NpbmtfZ2V0X3Byb3BlcnR5OworCisgIGFrbGFzcy0+Y29uZmlndXJlID0gZ3N0X2F1dG9fdmlkZW9fc2lua19jb25maWd1cmU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UU19PRkZTRVQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50NjQgKCJ0cy1vZmZzZXQiLCAiVFMgT2Zmc2V0IiwKKyAgICAgICAgICAiVGltZXN0YW1wIG9mZnNldCBpbiBuYW5vc2Vjb25kcyIsIEdfTUlOSU5UNjQsIEdfTUFYSU5UNjQsCisgICAgICAgICAgREVGQVVMVF9UU19PRkZTRVQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChla2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWtsYXNzLCAiQXV0byB2aWRlbyBzaW5rIiwKKyAgICAgICJTaW5rL1ZpZGVvIiwKKyAgICAgICJXcmFwcGVyIHZpZGVvIHNpbmsgZm9yIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdmlkZW8gc2luayIsCisgICAgICAiSmFuIFNjaG1pZHQgPHRoYXl0YW5Abm9yYWlzaW4ubmV0PiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1dG9fdmlkZW9fc2lua19pbml0IChHc3RBdXRvVmlkZW9TaW5rICogc2luaykKK3sKKyAgR3N0QXV0b0RldGVjdCAqYXV0b2RldGVjdCA9IEdTVF9BVVRPX0RFVEVDVCAoc2luayk7CisKKyAgYXV0b2RldGVjdC0+bWVkaWFfa2xhc3MgPSAiVmlkZW8iOworICBhdXRvZGV0ZWN0LT5mbGFnID0gR1NUX0VMRU1FTlRfRkxBR19TSU5LOworCisgIHNpbmstPnRzX29mZnNldCA9IERFRkFVTFRfVFNfT0ZGU0VUOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1dG9fdmlkZW9fc2lua19jb25maWd1cmUgKEdzdEF1dG9EZXRlY3QgKiBhdXRvZGV0ZWN0LCBHc3RFbGVtZW50ICoga2lkKQoreworICBHc3RBdXRvVmlkZW9TaW5rICpzZWxmID0gR1NUX0FVVE9fVklERU9fU0lOSyAoYXV0b2RldGVjdCk7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoa2lkKSwgInRzLW9mZnNldCIsIHNlbGYtPnRzX29mZnNldCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b192aWRlb19zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdXRvVmlkZW9TaW5rICpzaW5rID0gR1NUX0FVVE9fVklERU9fU0lOSyAob2JqZWN0KTsKKyAgR3N0QXV0b0RldGVjdCAqYXV0b2RldGVjdCA9IChHc3RBdXRvRGV0ZWN0ICopIHNpbms7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1RTX09GRlNFVDoKKyAgICAgIHNpbmstPnRzX29mZnNldCA9IGdfdmFsdWVfZ2V0X2ludDY0ICh2YWx1ZSk7CisgICAgICBpZiAoYXV0b2RldGVjdC0+a2lkKQorICAgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChhdXRvZGV0ZWN0LT5raWQpLCBwc3BlYy0+bmFtZSwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F1dG9fdmlkZW9fc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QXV0b1ZpZGVvU2luayAqc2luayA9IEdTVF9BVVRPX1ZJREVPX1NJTksgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1RTX09GRlNFVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludDY0ICh2YWx1ZSwgc2luay0+dHNfb2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuaCBiL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjdkYjQwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc2luay5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIEdTdHJlYW1lcgorICogKGMpIDIwMDUgUm9uYWxkIFMuIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQVVUT19WSURFT19TSU5LX0hfXworI2RlZmluZSBfX0dTVF9BVVRPX1ZJREVPX1NJTktfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAiZ3N0YXV0b2RldGVjdC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQVVUT19WSURFT19TSU5LIFwKKyAgKGdzdF9hdXRvX3ZpZGVvX3NpbmtfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9BVVRPX1ZJREVPX1NJTksob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0FVVE9fVklERU9fU0lOSywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdEF1dG9WaWRlb1NpbmspKQorI2RlZmluZSBHU1RfQVVUT19WSURFT19TSU5LX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfQVVUT19WSURFT19TSU5LLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0QXV0b1ZpZGVvU2lua0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FVVE9fVklERU9fU0lOSyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfQVVUT19WSURFT19TSU5LKSkKKyNkZWZpbmUgR1NUX0lTX0FVVE9fVklERU9fU0lOS19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0FVVE9fVklERU9fU0lOSykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdXRvVmlkZW9TaW5rIHsKKyAgR3N0QXV0b0RldGVjdCBwYXJlbnQ7CisKKyAgR3N0Q2xvY2tUaW1lRGlmZiB0c19vZmZzZXQ7Cit9IEdzdEF1dG9WaWRlb1Npbms7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdXRvVmlkZW9TaW5rQ2xhc3MgeworICBHc3RBdXRvRGV0ZWN0Q2xhc3MgcGFyZW50X2NsYXNzOworfSBHc3RBdXRvVmlkZW9TaW5rQ2xhc3M7CisKK0dUeXBlICAgZ3N0X2F1dG9fdmlkZW9fc2lua19nZXRfdHlwZSAgICAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BVVRPX1ZJREVPX1NJTktfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYyBiL2dzdC9hdXRvZGV0ZWN0L2dzdGF1dG92aWRlb3NyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNDM0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuYwpAQCAtMCwwICsxLDk0IEBACisvKiBHU3RyZWFtZXIKKyAqIChjKSAyMDA1IFJvbmFsZCBTLiBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqIChjKSAyMDA2IEphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4KKyAqIChjKSAyMDA4IFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hdXRvdmlkZW9zcmMKKyAqIEBzZWVfYWxzbzogYXV0b2F1ZGlvc3JjLCB2NGwyc3JjLCB2NGxzcmMKKyAqCisgKiBhdXRvdmlkZW9zcmMgaXMgYSB2aWRlbyBzcmMgdGhhdCBhdXRvbWF0aWNhbGx5IGRldGVjdHMgYW4gYXBwcm9wcmlhdGUKKyAqIHZpZGVvIHNvdXJjZSB0byB1c2UuICBJdCBkb2VzIHNvIGJ5IHNjYW5uaW5nIHRoZSByZWdpc3RyeSBmb3IgYWxsIGVsZW1lbnRzCisgKiB0aGF0IGhhdmUgPHF1b3RlPlNvdXJjZTwvcXVvdGU+IGFuZCA8cXVvdGU+VmlkZW88L3F1b3RlPiBpbiB0aGUgY2xhc3MgZmllbGQKKyAqIG9mIHRoZWlyIGVsZW1lbnQgaW5mb3JtYXRpb24sIGFuZCBhbHNvIGhhdmUgYSBub24temVybyBhdXRvcGx1Z2dpbmcgcmFuay4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgLW0gYXV0b3ZpZGVvc3JjICEgeHZpbWFnZXNpbmsKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGF1dG92aWRlb3NyYy5oIgorCitHX0RFRklORV9UWVBFIChHc3RBdXRvVmlkZW9TcmMsIGdzdF9hdXRvX3ZpZGVvX3NyYywgR1NUX1RZUEVfQVVUT19ERVRFQ1QpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0RWxlbWVudCAqCitnc3RfYXV0b192aWRlb19zcmNfY3JlYXRlX2Zha2VfZWxlbWVudCAoR3N0QXV0b0RldGVjdCAqIGF1dG9kZXRlY3QpCit7CisgIEdzdEVsZW1lbnQgKmZha2U7CisKKyAgZmFrZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsICJmYWtlLWF1dG8tdmlkZW8tc3JjIik7CisgIGlmIChmYWtlICE9IE5VTEwpIHsKKyAgICBnX29iamVjdF9zZXQgKGZha2UsICJpcy1saXZlIiwgVFJVRSwgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF1dG9kZXRlY3QsIFJFU09VUkNFLCBOT1RfRk9VTkQsCisgICAgICAgICgiRmFpbGVkIHRvIGZpbmQgdXNhYmxlIHZpZGVvIHNvdXJjZSBlbGVtZW50LiIpLAorICAgICAgICAoIkZhaWxlZCB0byBmaW5kIGEgdXNhYmxlIHZpZGVvIHNvdXJjZSBhbmQgY291bGRuJ3QgY3JlYXRlIGEgdmlkZW8iCisgICAgICAgICAgICAidGVzdHNyYyBhcyBmYWxsYmFjayBlaXRoZXIsIGNoZWNrIHlvdXIgR1N0cmVhbWVyIGluc3RhbGxhdGlvbi4iKSk7CisgICAgLyogVGhpcyB3aWxsIGVycm9yIG91dCB3aXRoIG5vdC1uZWdvdGlhdGVkLi4gKi8KKyAgICBmYWtlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNyYyIsICJmYWtlLWF1dG8tdmlkZW8tc3JjIik7CisgIH0KKyAgcmV0dXJuIGZha2U7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b192aWRlb19zcmNfY2xhc3NfaW5pdCAoR3N0QXV0b1ZpZGVvU3JjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0QXV0b0RldGVjdENsYXNzICphdXRvY2xhc3MgPSBHU1RfQVVUT19ERVRFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICpla2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChla2xhc3MsICZzcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChla2xhc3MsICJBdXRvIHZpZGVvIHNvdXJjZSIsCisgICAgICAiU291cmNlL1ZpZGVvIiwKKyAgICAgICJXcmFwcGVyIHZpZGVvIHNvdXJjZSBmb3IgYXV0b21hdGljYWxseSBkZXRlY3RlZCB2aWRlbyBzb3VyY2UiLAorICAgICAgIkphbiBTY2htaWR0IDx0aGF5dGFuQG5vcmFpc2luLm5ldD4sICIKKyAgICAgICJTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+Iik7CisKKyAgYXV0b2NsYXNzLT5jcmVhdGVfZmFrZV9lbGVtZW50ID0gZ3N0X2F1dG9fdmlkZW9fc3JjX2NyZWF0ZV9mYWtlX2VsZW1lbnQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXV0b192aWRlb19zcmNfaW5pdCAoR3N0QXV0b1ZpZGVvU3JjICogc3JjKQoreworICBHc3RBdXRvRGV0ZWN0ICphdXRvZGV0ZWN0ID0gR1NUX0FVVE9fREVURUNUIChzcmMpOworCisgIGF1dG9kZXRlY3QtPm1lZGlhX2tsYXNzID0gIlZpZGVvIjsKKyAgYXV0b2RldGVjdC0+ZmxhZyA9IEdTVF9FTEVNRU5UX0ZMQUdfU09VUkNFOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc3JjLmggYi9nc3QvYXV0b2RldGVjdC9nc3RhdXRvdmlkZW9zcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzZjYzcyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F1dG9kZXRlY3QvZ3N0YXV0b3ZpZGVvc3JjLmgKQEAgLTAsMCArMSw1NCBAQAorLyogR1N0cmVhbWVyCisgKiAoYykgMjAwNSBSb25hbGQgUy4gQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAoYykgMjAwOCBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BVVRPX1ZJREVPX1NSQ19IX18KKyNkZWZpbmUgX19HU1RfQVVUT19WSURFT19TUkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAiZ3N0YXV0b2RldGVjdC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQVVUT19WSURFT19TUkMgXAorICAoZ3N0X2F1dG9fdmlkZW9fc3JjX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfQVVUT19WSURFT19TUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0FVVE9fVklERU9fU1JDLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0QXV0b1ZpZGVvU3JjKSkKKyNkZWZpbmUgR1NUX0FVVE9fVklERU9fU1JDX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfQVVUT19WSURFT19TUkMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RBdXRvVmlkZW9TcmNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BVVRPX1ZJREVPX1NSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfQVVUT19WSURFT19TUkMpKQorI2RlZmluZSBHU1RfSVNfQVVUT19WSURFT19TUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9BVVRPX1ZJREVPX1NSQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdXRvVmlkZW9TcmMgeworICBHc3RBdXRvRGV0ZWN0IHBhcmVudDsKK30gR3N0QXV0b1ZpZGVvU3JjOworCit0eXBlZGVmIHN0cnVjdCBfR3N0QXV0b1ZpZGVvU3JjQ2xhc3MgeworICBHc3RBdXRvRGV0ZWN0Q2xhc3MgcGFyZW50X2NsYXNzOworfSBHc3RBdXRvVmlkZW9TcmNDbGFzczsKKworR1R5cGUgICBnc3RfYXV0b192aWRlb19zcmNfZ2V0X3R5cGUgICAgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQVVUT19WSURFT19TUkNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXV0b2RldGVjdC9tZXNvbi5idWlsZCBiL2dzdC9hdXRvZGV0ZWN0L21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTJkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXV0b2RldGVjdC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDE2IEBACithdXRvZGV0ZWN0X3NvdXJjZXMgPSBbCisgICdnc3RhdXRvYXVkaW9zaW5rLmMnLAorICAnZ3N0YXV0b2F1ZGlvc3JjLmMnLAorICAnZ3N0YXV0b2RldGVjdC5jJywKKyAgJ2dzdGF1dG92aWRlb3NpbmsuYycsCisgICdnc3RhdXRvdmlkZW9zcmMuYycsCitdCisKK2dzdGF1dG9kZXRlY3QgPSBsaWJyYXJ5KCdnc3RhdXRvZGV0ZWN0JywKKyAgYXV0b2RldGVjdF9zb3VyY2VzLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdF9kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L2F2aS8uZ2l0aWdub3JlIGIvZ3N0L2F2aS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZjk2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXZpLy5naXRpZ25vcmUKQEAgLTAsMCArMSw4IEBACitNYWtlZmlsZQorTWFrZWZpbGUuaW4KKyoubworKi5sbworKi5sYQorLmRlcHMKKy5saWJzCitjb2RlY3Rlc3QKZGlmZiAtLWdpdCBhL2dzdC9hdmkvTWFrZWZpbGUuYW0gYi9nc3QvYXZpL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NmEzMjcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXZpL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjcgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGF2aS5sYQorCitsaWJnc3RhdmlfbGFfU09VUkNFUyA9IFwKKwlnc3RhdmkuYyBcCisJZ3N0YXZpbXV4LmMgXAorCWdzdGF2aWRlbXV4LmMgXAorCWdzdGF2aXN1YnRpdGxlLmMKKworbm9pbnN0X0hFQURFUlMgPSBcCisJYXZpLWlkcy5oIFwKKwlnc3RhdmltdXguaCBcCisJZ3N0YXZpZGVtdXguaCBcCisJZ3N0YXZpc3VidGl0bGUuaAorCitsaWJnc3RhdmlfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdGF2aV9sYV9MSUJBREQgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwkkKEdTVF9CQVNFX0xJQlMpIFwKKwkkKEdTVF9MSUJTKSBcCisJLWxnc3RyaWZmLUBHU1RfQVBJX1ZFUlNJT05AIFwKKwktbGdzdGF1ZGlvLUBHU1RfQVBJX1ZFUlNJT05AIFwKKwktbGdzdHRhZy1AR1NUX0FQSV9WRVJTSU9OQCBcCisJLWxnc3R2aWRlby1AR1NUX0FQSV9WRVJTSU9OQAorCitsaWJnc3RhdmlfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitFWFRSQV9ESVNUID0gUkVBRE1FCmRpZmYgLS1naXQgYS9nc3QvYXZpL1JFQURNRSBiL2dzdC9hdmkvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YTA4YTkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXZpL1JFQURNRQpAQCAtMCwwICsxLDcyIEBACitUaGUgYXZpIGRlY29kZXIgcGx1Z2lucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGF2aSBkZWNvZGVyIGNvbnNpc3RzIG9mIGEgc2V0IG9mIGdzdHJlYW1lciBwbHVnaW5zOgorCisgLSBkZW11eGVyIChhdmlkZW11eCkKKyAtIGF2aSB0byBnc3RyZWFtZXIgdHlwZSBjb252ZXJ0ZXIgKGF2aXR5cGVzKQorIC0gd2luZG93cyBkbGxzIHdyYXBwZXJzLgorCit0aGUgYXZpZGVjb2RlciBlbGVtZW50IHVzZXMgdGhlIGFib3ZlIHBsdWdpbnMgdG8gcGVyZm9ybSB0aGUgYXZpCitkZWNvZGluZy4gSXQgaXMgY29uc3RydWN0ZWQgYXMgYSBjdXN0b20gYmluIHdoaWNoIGluaXRpYWxseSBvbmx5IGhhcwordGhlIGRlbXV4ZXIgZWxlbWVudCBpbiBpdC4gVGhlIGRlbXV4ZXIgaGFzIGEgc2V0IG9mIHBhZHRlbXBsYXRlcyBmb3IKK3JhdyBhdWRpbyBhbmQgdmlkZW8uCisKKyAgKC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSkKKyAgISBhdmlkZWNvZGVyICAgICAgICAgICAgICAgICAgICAgICAgICEKKyAgISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2aWRlby9yYXcpLi4uCisgICEgICAgICgtLS0tLS0tLS0tKSAgICAgICAgICAgICAgICAgICAhCisgICEgICAgICEgZGVtdXhlciAodmlkZW8veC1tc3ZpZGVvLCBhdWRzKS4uCisgICEgICAgICEgICAgICAgICAgISAgICAgICAgICAgICAgICAgICAhCisgICEgICAtc3JjICAgICAgICAgISAgICAgICAgICAgICAgICAgICAhCisgICEgIC8gICEgICAgICAgICAodmlkZW8veC1tc3ZpZGVvLCB2aWRzKS4uCisgLSBzcmMgICEgICAgICAgICAgISAgICAgICAgICAgICAgICAgICAhCisgICEgICAgICgtLS0tLS0tLS0tKSAgICAgICAgICAgICAgICAoYXVkaW8vcmF3KS4uLgorICAhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIQorICAoLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKQorCit0aGUgZGVtdXhlciBoYXMgYSBzZXQgb2YgcGFkdGVtcGxhdGVzIGZvciB0aGUgcmF3IGF2aSBoZWFkZXIgcHJvcGVydGllcy4KKworVGhlIGF2aSBkZWNvZGVyIHdpbGwgYWN0IG9uIHRoZSBuZXdfcGFkIHNpZ25hbCBvZiB0aGUgZGVtdXhlciBlbGVtZW50CithbmQgd2lsbCBhdHRhY2ggYW4gYXZpdHlwZSBwbHVnaW4gdG8gdGhlIG5ldyBwYWQuIENhcHMgbmVnb3RpYXRpb24gd2lsbAorY29udmVydCB0aGUgcmF3IGF2aSBjYXBzIHRvIHRoZSBnc3RyZWFtZXIgY2Fwcy4gSWYgdGhlIHNyYyBwYWQgb2YgdGhlCithdml0eXBlcyBwbHVnaW4gYXJlIGNvbXBhdGlibGUgd2l0aCB0aGUgYXZpZGVjb2RlciBwYWR0ZW1wbGF0ZSwgdGhlIAorYXZpdHlwZSBwYWQgaXMgZ2hvc3RlZCB0byB0aGUgYXZpZGVjb2RlciBiaW4sIHRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgbm8KK2NvZGVjIGlzIG5lZWRlZCAoZm9yIHJhdyBQQ00gc2FtcGxlcywgZm9yIGV4YW1wbGUpLgorCitXaGVuIHRoZSBhdml0eXBlcyBjYXBzIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIG9uZSBvZiB0aGUgYXZpZGVjb2RlciAKK3RlbXBsYXRlcywgYSBzdGF0aWMgYXV0b3BsdWdnZXIgaXMgdXNlZCB0aGUgZmluZCBhbiBlbGVtZW50IHRvIGNvbm5lY3QKK3RoZSBkZW11eGVycyBwYWQgdG8gdGhlIGRlY29kZXJzIHBhZHRlbXBsYXRlLgorCitXaGVuIG5vIGVsZW1lbnQgY291bGQgYmUgZm91bmQsIGFuIHdpbmRlYyBwbHVnaW4gaXMgYXR0YWNoZWQgdG8gdGhlIAorZGVtdXhlcnMgcGFkIGFuZCB0aGUgYXZpdHlwZXMgcGx1Z2luIGlzIHJlbW92ZWQgZnJvbSB0aGUgZGVjb2Rlci4KKworCitleGFtcGxlOgorLS0tLS0tLS0KKworIEFuIGF2aWRlY29kZXIgdGhhdCBoYXMgYSB2aWRlbyBwYWQgKGRlY29kZWQgd2l0aCB3aW5kb3dzIGRsbHMpIGFuZCBhbgorIGF1ZGlvIHBhZCAocmF3IFBDTSkuCisKKyAgKC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0pCisgICEgYXZpZGVjb2RlciAgICAgICAgICAgICAgICgtLS0tLS0tLSkgICAgKC0tLS0tLSkgICAgICAgICAgICAgICAgIQorICAhICAgICAgICAgICAgICAgICAgICAgICAgICAhYXZpdHlwZXMhICAgICF3aW5kZWMhICAgICAgIC8tLSAodmlkZW8vcmF3KQorICAhICAgICAoLS0tLS0tLS0tLSkgICAgIC8tc2luayAgICAgIHNyYy0tc2luayAgIHNyYyAtLS0tLSAgICAgICAgICEKKyAgISAgICAgIWRlbXV4ZXIgKHZpZGVvL3gtbXN2aWRlbywgICAgISAgICAhICAgICAgISAgICAgICAgICAgICAgICAhCisgICEgICAgICEgICAgICAgICAgISBhdWRzKS4uICgtLS0tLS0tLSkgICAgKC0tLS0tLSkgICAgICAgICAgICAgICAgISAgCisgICEgICAtc2luayAgICAgICAgISAgICAgICAgICgtLS0tLS0tLSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIQorICAhICAvICAhICAgICAgICAodmlkZW8veC0uLiwhYXZpdHlwZXMhICAgICAgICAgICAgICAgICAgICAgICAgICAgICEKKyAtc2luayAgISAgICAgICAgICAhIHZpZHMpLi4gISAgICAgICAgISAgICAgICAgICAgICAgICAgICAgICAgICAgICAhCisgICEgICAgICgtLS0tLS0tLS0tKSAgICAgXC1zaW5rICAgICAgc3JjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIChhdWRpby9yYXcpCisgICEgICAgICAgICAgICAgICAgICAgICAgICAgICgtLS0tLS0tLSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIQorICAoLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSkKKworCisKK1RPRE8KKy0tLS0KKworYXV0b21hdGljYWxseSBnZW5lcmF0ZSB0aGUgcGFkdGVtcGxhdGVzIGZyb20gYWxsIHBvc3NpYmxlIGF2aSB0eXBlcworZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LgorCisKZGlmZiAtLWdpdCBhL2dzdC9hdmkvYXZpLWlkcy5oIGIvZ3N0L2F2aS9hdmktaWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwOTgwMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdmkvYXZpLWlkcy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0FWSV9IX18KKyNkZWZpbmUgX19HU1RfQVZJX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCit0eXBlZGVmIHN0cnVjdCBfZ3N0X3JpZmZfYXZpaCB7CisgIGd1aW50MzIgdXNfZnJhbWU7ICAgICAgICAgIC8qIG1pY3Jvc2VjIHBlciBmcmFtZSAqLworICBndWludDMyIG1heF9icHM7ICAgICAgICAgICAvKiBieXRlL3Mgb3ZlcmFsbCAqLworICBndWludDMyIHBhZF9ncmFuOyAgICAgICAgICAvKiBwYWRfZ3JhbnVsYXJpdHkgKi8KKyAgZ3VpbnQzMiBmbGFnczsKKy8qIGZsYWdzIHZhbHVlcyAqLworI2RlZmluZSBHU1RfUklGRl9BVklIX0hBU0lOREVYICAgICAgIDB4MDAwMDAwMTAgLyogaGFzIGlkeDEgY2h1bmsgKi8KKyNkZWZpbmUgR1NUX1JJRkZfQVZJSF9NVVNUVVNFSU5ERVggICAweDAwMDAwMDIwIC8qIG11c3QgdXNlIGlkeDEgY2h1bmsgdG8gZGV0ZXJtaW5lIG9yZGVyICovCisjZGVmaW5lIEdTVF9SSUZGX0FWSUhfSVNJTlRFUkxFQVZFRCAgMHgwMDAwMDEwMCAvKiBBVkkgZmlsZSBpcyBpbnRlcmxlYXZlZCAqLworI2RlZmluZSBHU1RfUklGRl9BVklIX1RSVVNUQ0tUWVBFICAgIDB4MDAwMDA4MDAgLyogVXNlIENLVHlwZSB0byBmaW5kIGtleSBmcmFtZXMgKi8KKyNkZWZpbmUgR1NUX1JJRkZfQVZJSF9XQVNDQVBUVVJFRklMRSAweDAwMDEwMDAwIC8qIHNwZWNpYWxseSBhbGxvY2F0ZWQgdXNlZCBmb3IgY2FwdHVyaW5nIHJlYWwgdGltZSB2aWRlbyAqLworI2RlZmluZSBHU1RfUklGRl9BVklIX0NPUFlSSUdIVEVEICAgIDB4MDAwMjAwMDAgLyogY29udGFpbnMgY29weXJpZ2h0ZWQgZGF0YSAqLworICBndWludDMyIHRvdF9mcmFtZXM7ICAgICAgICAvKiAjIG9mIGZyYW1lcyAoYWxsKSAqLworICBndWludDMyIGluaXRfZnJhbWVzOyAgICAgICAvKiBpbml0aWFsIGZyYW1lcyAoPz8/KSAqLworICBndWludDMyIHN0cmVhbXM7CisgIGd1aW50MzIgYnVmc2l6ZTsgICAgICAgICAgIC8qIHN1Z2dlc3RlZCBidWZmZXIgc2l6ZSAqLworICBndWludDMyIHdpZHRoOworICBndWludDMyIGhlaWdodDsKKyAgZ3VpbnQzMiBzY2FsZTsKKyAgZ3VpbnQzMiByYXRlOworICBndWludDMyIHN0YXJ0OworICBndWludDMyIGxlbmd0aDsKK30gZ3N0X3JpZmZfYXZpaDsKKworLyogdnBycCAodmlkZW8gcHJvcGVydGllcykgT0RNTCBoZWFkZXIgKi8KKy8qIHNlZSBPRE1MIHNwZWMgZm9yIHNvbWUvbW9yZSBleHBsYW5hdGlvbiAqLworI2RlZmluZSBHU1RfUklGRl9UQUdfdnBycCBHU1RfTUFLRV9GT1VSQ0MgKCd2JywncCcsJ3InLCdwJykKKyNkZWZpbmUgR1NUX1JJRkZfRFhTQiBHU1RfTUFLRV9GT1VSQ0MgKCdEJywnWCcsJ1MnLCdCJykKKyNkZWZpbmUgR1NUX1JJRkZfVlBSUF9WSURFT19GSUVMRFMgICAgICAgICgyKQorCit0eXBlZGVmIHN0cnVjdCBfZ3N0X3JpZmZfdnBycF92aWRlb19maWVsZF9kZXNjIHsKKyAgZ3VpbnQzMiBjb21wcmVzc2VkX2JtX2hlaWdodDsKKyAgZ3VpbnQzMiBjb21wcmVzc2VkX2JtX3dpZHRoOworICBndWludDMyIHZhbGlkX2JtX2hlaWdodDsKKyAgZ3VpbnQzMiB2YWxpZF9ibV93aWR0aDsKKyAgZ3VpbnQzMiB2YWxpZF9ibV94X29mZnNldDsKKyAgZ3VpbnQzMiB2YWxpZF9ibV95X29mZnNldDsKKyAgZ3VpbnQzMiB2aWRlb194X3Rfb2Zmc2V0OworICBndWludDMyIHZpZGVvX3lfc3RhcnQ7Cit9IGdzdF9yaWZmX3ZwcnBfdmlkZW9fZmllbGRfZGVzYzsKKwordHlwZWRlZiBzdHJ1Y3QgX2dzdF9yaWZmX3ZwcnAgeworICBndWludDMyIGZvcm1hdF90b2tlbjsgICAgICAvKiB3aGV0aGVyIGZpZWxkcyBkZWZpbmVkIGJ5IHN0YW5kYXJkICovCisgIGd1aW50MzIgc3RhbmRhcmQ7ICAgICAgICAgIC8qIHZpZGVvIGRpc3BsYXkgc3RhbmRhcmQsIFVOS05PV04sIFBBTCwgZXRjICovCisgIGd1aW50MzIgdmVydF9yYXRlOyAgICAgICAgIC8qIHZlcnRpY2FsIHJlZnJlc2ggcmF0ZSAqLworICBndWludDMyIGhvcl90X3RvdGFsOyAgICAgICAvKiB3aWR0aCAqLworICBndWludDMyIHZlcnRfbGluZXM7ICAgICAgICAvKiBoZWlnaHQgKi8KKyAgZ3VpbnQzMiBhc3BlY3Q7ICAgICAgICAgICAgLyogYXNwZWN0IHJhdGlvIGhpZ2ggd29yZDpsb3cgd29yZCAqLworICBndWludDMyIHdpZHRoOyAgICAgICAgICAgICAvKiBhY3RpdmUgd2lkdGggKi8KKyAgZ3VpbnQzMiBoZWlnaHQ7ICAgICAgICAgICAgLyogYWN0aXZlIGhlaWdodCAqLworICBndWludDMyIGZpZWxkczsgICAgICAgICAgICAvKiBmaWVsZCBjb3VudCAqLworICBnc3RfcmlmZl92cHJwX3ZpZGVvX2ZpZWxkX2Rlc2MgZmllbGRfaW5mb1tHU1RfUklGRl9WUFJQX1ZJREVPX0ZJRUxEU107Cit9IGdzdF9yaWZmX3ZwcnA7CisKKyNlbmRpZiAvKiBfX0dTVF9BVklfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXZpL2dzdGF2aS5jIGIvZ3N0L2F2aS9nc3RhdmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGNmMGFkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F2aS9nc3RhdmkuYwpAQCAtMCwwICsxLDU4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAdGVtcGxlLWJhcHRpc3QuY29tPgorICoKKyAqIGdzdGF2aS5jOiBwbHVnaW4gcmVnaXN0ZXJpbmcKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3QvZ3N0LWkxOG4tcGx1Z2luLmgiCisKKyNpbmNsdWRlICJnc3RhdmlkZW11eC5oIgorI2luY2x1ZGUgImdzdGF2aW11eC5oIgorI2luY2x1ZGUgImdzdGF2aXN1YnRpdGxlLmgiCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgZ3N0X3JpZmZfaW5pdCAoKTsKKworI2lmZGVmIEVOQUJMRV9OTFMKKyAgYmluZHRleHRkb21haW4gKEdFVFRFWFRfUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKEdFVFRFWFRfUEFDS0FHRSwgIlVURi04Iik7CisjZW5kaWYgLyogRU5BQkxFX05MUyAqLworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImF2aWRlbXV4IiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgICAgICBHU1RfVFlQRV9BVklfREVNVVgpIHx8CisgICAgICAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImF2aW11eCIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICAgR1NUX1RZUEVfQVZJX01VWCkgfHwKKyAgICAgICFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYXZpc3VidGl0bGUiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX0FWSV9TVUJUSVRMRSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGF2aSwKKyAgICAiQVZJIHN0cmVhbSBoYW5kbGluZyIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L2F2aS9nc3RhdmlkZW11eC5jIGIvZ3N0L2F2aS9nc3RhdmlkZW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMmVlODkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXZpL2dzdGF2aWRlbXV4LmMKQEAgLTAsMCArMSw2MDQ0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAdGVtcGxlLWJhcHRpc3QuY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gTm9raWEgQ29ycG9yYXRpb24gKGNvbnRhY3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4pCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5LTIwMTA+IFNURXJpY3Nzb24gPGJlbmphbWluLmdhaWduYXJkQHN0ZXJpY3Nzb24uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKiBFbGVtZW50LUNoZWNrbGlzdC1WZXJzaW9uOiA1ICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWF2aWRlbXV4CisgKgorICogRGVtdXhlcyBhbiAuYXZpIGZpbGUgaW50byByYXcgb3IgY29tcHJlc3NlZCBhdWRpbyBhbmQvb3IgdmlkZW8gc3RyZWFtcy4KKyAqCisgKiBUaGlzIGVsZW1lbnQgc3VwcG9ydHMgYm90aCBwdXNoIGFuZCBwdWxsLWJhc2VkIHNjaGVkdWxpbmcsIGRlcGVuZGluZyBvbiB0aGUKKyAqIGNhcGFiaWxpdGllcyBvZiB0aGUgdXBzdHJlYW0gZWxlbWVudHMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGZpbGVzcmMgbG9jYXRpb249dGVzdC5hdmkgISBhdmlkZW11eCBuYW1lPWRlbXV4ICBkZW11eC5hdWRpb18wMCAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rICAgZGVtdXgudmlkZW9fMDAgISBxdWV1ZSAhIGRlY29kZWJpbiAhIHZpZGVvY29udmVydCAhIHZpZGVvc2NhbGUgISBhdXRvdmlkZW9zaW5rCisgKiBdfCBQbGF5IChwYXJzZSBhbmQgZGVjb2RlKSBhbiAuYXZpIGZpbGUgYW5kIHRyeSB0byBvdXRwdXQgaXQgdG8KKyAqIGFuIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgc291bmRjYXJkIGFuZCB2aWRlb3NpbmsuIElmIHRoZSBBVkkgZmlsZSBjb250YWlucworICogY29tcHJlc3NlZCBhdWRpbyBvciB2aWRlbyBkYXRhLCB0aGlzIHdpbGwgb25seSB3b3JrIGlmIHlvdSBoYXZlIHRoZQorICogcmlnaHQgZGVjb2RlciBlbGVtZW50cy9wbHVnaW5zIGluc3RhbGxlZC4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImdzdC9yaWZmL3JpZmYtbWVkaWEuaCIKKyNpbmNsdWRlICJnc3RhdmlkZW11eC5oIgorI2luY2x1ZGUgImF2aS1pZHMuaCIKKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisKKyNkZWZpbmUgRElWX1JPVU5EX1VQKHMsdikgKCgocykgKyAoKHYpLTEpKSAvICh2KSkKKworI2RlZmluZSBHU1RfQVZJX0tFWUZSQU1FICgxIDw8IDApCisjZGVmaW5lIEVOVFJZX0lTX0tFWUZSQU1FKGUpICgoZSktPmZsYWdzID09IEdTVF9BVklfS0VZRlJBTUUpCisjZGVmaW5lIEVOVFJZX1NFVF9LRVlGUkFNRShlKSAoKGUpLT5mbGFncyA9IEdTVF9BVklfS0VZRlJBTUUpCisjZGVmaW5lIEVOVFJZX1VOU0VUX0tFWUZSQU1FKGUpICgoZSktPmZsYWdzID0gMCkKKworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChhdmlkZW11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBhdmlkZW11eF9kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbCA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtbXN2aWRlbyIpCisgICAgKTsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzbmFwX3R5cGVzWzJdWzJdID0geworICB7ImFueSIsICJhZnRlciJ9LAorICB7ImJlZm9yZSIsICJuZWFyZXN0In0sCit9OworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGdzdF9hdmlfZGVtdXhfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3RfYXZpX2RlbXV4X3Jlc2V0IChHc3RBdmlEZW11eCAqIGF2aSk7CisKKyNpZiAwCitzdGF0aWMgY29uc3QgR3N0RXZlbnRNYXNrICpnc3RfYXZpX2RlbXV4X2dldF9ldmVudF9tYXNrIChHc3RQYWQgKiBwYWQpOworI2VuZGlmCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXZpX2RlbXV4X2hhbmRsZV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXZpX2RlbXV4X3B1c2hfZXZlbnQgKEdzdEF2aURlbXV4ICogYXZpLCBHc3RFdmVudCAqIGV2ZW50KTsKKworI2lmIDAKK3N0YXRpYyBjb25zdCBHc3RGb3JtYXQgKmdzdF9hdmlfZGVtdXhfZ2V0X3NyY19mb3JtYXRzIChHc3RQYWQgKiBwYWQpOworI2VuZGlmCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F2aV9kZW11eF9oYW5kbGVfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXZpX2RlbXV4X3NyY19jb252ZXJ0IChHc3RQYWQgKiBwYWQsIEdzdEZvcm1hdCBzcmNfZm9ybWF0LAorICAgIGdpbnQ2NCBzcmNfdmFsdWUsIEdzdEZvcm1hdCAqIGRlc3RfZm9ybWF0LCBnaW50NjQgKiBkZXN0X3ZhbHVlKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hdmlfZGVtdXhfZG9fc2VlayAoR3N0QXZpRGVtdXggKiBhdmksIEdzdFNlZ21lbnQgKiBzZWdtZW50LAorICAgIEdzdFNlZWtGbGFncyBmbGFncyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F2aV9kZW11eF9oYW5kbGVfc2VlayAoR3N0QXZpRGVtdXggKiBhdmksIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrX3B1c2ggKEdzdEF2aURlbXV4ICogYXZpLCBHc3RQYWQgKiBwYWQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgdm9pZCBnc3RfYXZpX2RlbXV4X2xvb3AgKEdzdFBhZCAqIHBhZCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F2aV9kZW11eF9zaW5rX2FjdGl2YXRlIChHc3RQYWQgKiBzaW5rcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F2aV9kZW11eF9zaW5rX2FjdGl2YXRlX21vZGUgKEdzdFBhZCAqIHNpbmtwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfYXZpX2RlbXV4X2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWYpOworI2lmIDAKK3N0YXRpYyB2b2lkIGdzdF9hdmlfZGVtdXhfc2V0X2luZGV4IChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0SW5kZXggKiBpbmRleCk7CitzdGF0aWMgR3N0SW5kZXggKmdzdF9hdmlfZGVtdXhfZ2V0X2luZGV4IChHc3RFbGVtZW50ICogZWxlbWVudCk7CisjZW5kaWYKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfYXZpX2RlbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgdm9pZCBnc3RfYXZpX2RlbXV4X2NhbGN1bGF0ZV9kdXJhdGlvbnNfZnJvbV9pbmRleCAoR3N0QXZpRGVtdXggKiBhdmkpOworc3RhdGljIHZvaWQgZ3N0X2F2aV9kZW11eF9nZXRfYnVmZmVyX2luZm8gKEdzdEF2aURlbXV4ICogYXZpLAorICAgIEdzdEF2aVN0cmVhbSAqIHN0cmVhbSwgZ3VpbnQgZW50cnlfbiwgR3N0Q2xvY2tUaW1lICogdGltZXN0YW1wLAorICAgIEdzdENsb2NrVGltZSAqIHRzX2VuZCwgZ3VpbnQ2NCAqIG9mZnNldCwgZ3VpbnQ2NCAqIG9mZnNldF9lbmQpOworCitzdGF0aWMgdm9pZCBnc3RfYXZpX2RlbXV4X3BhcnNlX2lkaXQgKEdzdEF2aURlbXV4ICogYXZpLCBHc3RCdWZmZXIgKiBidWYpOworc3RhdGljIHZvaWQgZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJkIChHc3RBdmlEZW11eCAqIGF2aSwgR3N0QnVmZmVyICogYnVmKTsKKworc3RhdGljIHZvaWQgcGFyc2VfdGFnX3ZhbHVlIChHc3RBdmlEZW11eCAqIGF2aSwgR3N0VGFnTGlzdCAqIHRhZ2xpc3QsCisgICAgY29uc3QgZ2NoYXIgKiB0eXBlLCBndWludDggKiBwdHIsIGd1aW50IHRzaXplKTsKKworLyogR09iamVjdCBtZXRob2RzICovCisKKyNkZWZpbmUgZ3N0X2F2aV9kZW11eF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RBdmlEZW11eCwgZ3N0X2F2aV9kZW11eCwgR1NUX1RZUEVfRUxFTUVOVCk7CisKK3N0YXRpYyB2b2lkCitnc3RfYXZpX2RlbXV4X2NsYXNzX2luaXQgKEdzdEF2aURlbXV4Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0UGFkVGVtcGxhdGUgKnZpZGVvc3JjdGVtcGwsICphdWRpb3NyY3RlbXBsLCAqc3Vic3JjdGVtcGwsICpzdWJwaWNzcmN0ZW1wbDsKKyAgR3N0Q2FwcyAqYXVkY2FwcywgKnZpZGNhcHMsICpzdWJjYXBzLCAqc3VicGljY2FwczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoYXZpZGVtdXhfZGVidWcsICJhdmlkZW11eCIsCisgICAgICAwLCAiRGVtdXhlciBmb3IgQVZJIHN0cmVhbXMiKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9hdmlfZGVtdXhfZmluYWxpemU7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXZpX2RlbXV4X2NoYW5nZV9zdGF0ZSk7CisjaWYgMAorICBnc3RlbGVtZW50X2NsYXNzLT5zZXRfaW5kZXggPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F2aV9kZW11eF9zZXRfaW5kZXgpOworICBnc3RlbGVtZW50X2NsYXNzLT5nZXRfaW5kZXggPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F2aV9kZW11eF9nZXRfaW5kZXgpOworI2VuZGlmCisKKyAgYXVkY2FwcyA9IGdzdF9yaWZmX2NyZWF0ZV9hdWRpb190ZW1wbGF0ZV9jYXBzICgpOworICBnc3RfY2Fwc19hcHBlbmQgKGF1ZGNhcHMsIGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby94LWF2aS11bmtub3duIikpOworICBhdWRpb3NyY3RlbXBsID0gZ3N0X3BhZF90ZW1wbGF0ZV9uZXcgKCJhdWRpb18ldSIsCisgICAgICBHU1RfUEFEX1NSQywgR1NUX1BBRF9TT01FVElNRVMsIGF1ZGNhcHMpOworCisgIHZpZGNhcHMgPSBnc3RfcmlmZl9jcmVhdGVfdmlkZW9fdGVtcGxhdGVfY2FwcyAoKTsKKyAgZ3N0X2NhcHNfYXBwZW5kICh2aWRjYXBzLCBnc3RfcmlmZl9jcmVhdGVfaWF2c190ZW1wbGF0ZV9jYXBzICgpKTsKKyAgZ3N0X2NhcHNfYXBwZW5kICh2aWRjYXBzLCBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8veC1hdmktdW5rbm93biIpKTsKKyAgdmlkZW9zcmN0ZW1wbCA9IGdzdF9wYWRfdGVtcGxhdGVfbmV3ICgidmlkZW9fJXUiLAorICAgICAgR1NUX1BBRF9TUkMsIEdTVF9QQURfU09NRVRJTUVTLCB2aWRjYXBzKTsKKworICBzdWJjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtc3VidGl0bGUtYXZpIik7CisgIHN1YnNyY3RlbXBsID0gZ3N0X3BhZF90ZW1wbGF0ZV9uZXcgKCJzdWJ0aXRsZV8ldSIsCisgICAgICBHU1RfUEFEX1NSQywgR1NUX1BBRF9TT01FVElNRVMsIHN1YmNhcHMpOworICBzdWJwaWNjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInN1YnBpY3R1cmUveC14c3ViIik7CisgIHN1YnBpY3NyY3RlbXBsID0gZ3N0X3BhZF90ZW1wbGF0ZV9uZXcgKCJzdWJwaWN0dXJlXyV1IiwKKyAgICAgIEdTVF9QQURfU1JDLCBHU1RfUEFEX1NPTUVUSU1FUywgc3VicGljY2Fwcyk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsIGF1ZGlvc3JjdGVtcGwpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCB2aWRlb3NyY3RlbXBsKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgc3Vic3JjdGVtcGwpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCBzdWJwaWNzcmN0ZW1wbCk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbCk7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGF1ZGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAodmlkY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzdWJjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHN1YnBpY2NhcHMpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJBdmkgZGVtdXhlciIsCisgICAgICAiQ29kZWMvRGVtdXhlciIsCisgICAgICAiRGVtdWx0aXBsZXggYW4gYXZpIGZpbGUgaW50byBhdWRpbyBhbmQgdmlkZW8iLAorICAgICAgIkVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+LCAiCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNoZWxsby5iZT4sICIKKyAgICAgICJUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9pbml0IChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgYXZpLT5zaW5rcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rX3RlbXBsLCAic2luayIpOworICBnc3RfcGFkX3NldF9hY3RpdmF0ZV9mdW5jdGlvbiAoYXZpLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdmlfZGVtdXhfc2lua19hY3RpdmF0ZSkpOworICBnc3RfcGFkX3NldF9hY3RpdmF0ZW1vZGVfZnVuY3Rpb24gKGF2aS0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXZpX2RlbXV4X3NpbmtfYWN0aXZhdGVfbW9kZSkpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoYXZpLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdmlfZGVtdXhfY2hhaW4pKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKGF2aS0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zaW5rX2V2ZW50KSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKGF2aSksIGF2aS0+c2lua3BhZCk7CisKKyAgYXZpLT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICBhdmktPmZsb3djb21iaW5lciA9IGdzdF9mbG93X2NvbWJpbmVyX25ldyAoKTsKKworICBnc3RfYXZpX2RlbXV4X3Jlc2V0IChhdmkpOworCisgIEdTVF9PQkpFQ1RfRkxBR19TRVQgKGF2aSwgR1NUX0VMRU1FTlRfRkxBR19JTkRFWEFCTEUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0QXZpRGVtdXggKmF2aSA9IEdTVF9BVklfREVNVVggKG9iamVjdCk7CisKKyAgR1NUX0RFQlVHICgiQVZJOiBmaW5hbGl6ZSIpOworCisgIGdfb2JqZWN0X3VucmVmIChhdmktPmFkYXB0ZXIpOworICBnc3RfZmxvd19jb21iaW5lcl9mcmVlIChhdmktPmZsb3djb21iaW5lcik7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9yZXNldF9zdHJlYW0gKEdzdEF2aURlbXV4ICogYXZpLCBHc3RBdmlTdHJlYW0gKiBzdHJlYW0pCit7CisgIGdfZnJlZSAoc3RyZWFtLT5zdHJoKTsKKyAgZ19mcmVlIChzdHJlYW0tPnN0cmYuZGF0YSk7CisgIGdfZnJlZSAoc3RyZWFtLT5uYW1lKTsKKyAgZ19mcmVlIChzdHJlYW0tPmluZGV4KTsKKyAgZ19mcmVlIChzdHJlYW0tPmluZGV4ZXMpOworICBpZiAoc3RyZWFtLT5pbml0ZGF0YSkKKyAgICBnc3RfYnVmZmVyX3VucmVmIChzdHJlYW0tPmluaXRkYXRhKTsKKyAgaWYgKHN0cmVhbS0+ZXh0cmFkYXRhKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKHN0cmVhbS0+ZXh0cmFkYXRhKTsKKyAgaWYgKHN0cmVhbS0+cmdiOF9wYWxldHRlKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKHN0cmVhbS0+cmdiOF9wYWxldHRlKTsKKyAgaWYgKHN0cmVhbS0+cGFkKSB7CisgICAgaWYgKHN0cmVhbS0+ZXhwb3NlZCkgeworICAgICAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzdHJlYW0tPnBhZCwgRkFMU0UpOworICAgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoYXZpKSwgc3RyZWFtLT5wYWQpOworICAgICAgZ3N0X2Zsb3dfY29tYmluZXJfcmVtb3ZlX3BhZCAoYXZpLT5mbG93Y29tYmluZXIsIHN0cmVhbS0+cGFkKTsKKyAgICB9IGVsc2UKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHN0cmVhbS0+cGFkKTsKKyAgfQorICBpZiAoc3RyZWFtLT50YWdsaXN0KSB7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmIChzdHJlYW0tPnRhZ2xpc3QpOworICAgIHN0cmVhbS0+dGFnbGlzdCA9IE5VTEw7CisgIH0KKyAgbWVtc2V0IChzdHJlYW0sIDAsIHNpemVvZiAoR3N0QXZpU3RyZWFtKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXZpX2RlbXV4X3Jlc2V0IChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgZ2ludCBpOworCisgIEdTVF9ERUJVRyAoIkFWSTogcmVzZXQiKTsKKworICBmb3IgKGkgPSAwOyBpIDwgYXZpLT5udW1fc3RyZWFtczsgaSsrKQorICAgIGdzdF9hdmlfZGVtdXhfcmVzZXRfc3RyZWFtIChhdmksICZhdmktPnN0cmVhbVtpXSk7CisKKyAgYXZpLT5oZWFkZXJfc3RhdGUgPSBHU1RfQVZJX0RFTVVYX0hFQURFUl9UQUdfTElTVDsKKyAgYXZpLT5udW1fc3RyZWFtcyA9IDA7CisgIGF2aS0+bnVtX3Zfc3RyZWFtcyA9IDA7CisgIGF2aS0+bnVtX2Ffc3RyZWFtcyA9IDA7CisgIGF2aS0+bnVtX3Rfc3RyZWFtcyA9IDA7CisgIGF2aS0+bnVtX3NwX3N0cmVhbXMgPSAwOworICBhdmktPm1haW5fc3RyZWFtID0gLTE7CisKKyAgYXZpLT5oYXZlX2dyb3VwX2lkID0gRkFMU0U7CisgIGF2aS0+Z3JvdXBfaWQgPSBHX01BWFVJTlQ7CisKKyAgYXZpLT5zdGF0ZSA9IEdTVF9BVklfREVNVVhfU1RBUlQ7CisgIGF2aS0+b2Zmc2V0ID0gMDsKKyAgYXZpLT5idWlsZGluZ19pbmRleCA9IEZBTFNFOworCisgIGF2aS0+aW5kZXhfb2Zmc2V0ID0gMDsKKyAgZ19mcmVlIChhdmktPmF2aWgpOworICBhdmktPmF2aWggPSBOVUxMOworCisjaWYgMAorICBpZiAoYXZpLT5lbGVtZW50X2luZGV4KQorICAgIGdzdF9vYmplY3RfdW5yZWYgKGF2aS0+ZWxlbWVudF9pbmRleCk7CisgIGF2aS0+ZWxlbWVudF9pbmRleCA9IE5VTEw7CisjZW5kaWYKKworICBpZiAoYXZpLT5zZWdfZXZlbnQpIHsKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGF2aS0+c2VnX2V2ZW50KTsKKyAgICBhdmktPnNlZ19ldmVudCA9IE5VTEw7CisgIH0KKyAgaWYgKGF2aS0+c2Vla19ldmVudCkgeworICAgIGdzdF9ldmVudF91bnJlZiAoYXZpLT5zZWVrX2V2ZW50KTsKKyAgICBhdmktPnNlZWtfZXZlbnQgPSBOVUxMOworICB9CisKKyAgaWYgKGF2aS0+Z2xvYmFsdGFncykKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKGF2aS0+Z2xvYmFsdGFncyk7CisgIGF2aS0+Z2xvYmFsdGFncyA9IE5VTEw7CisKKyAgYXZpLT5nb3RfdGFncyA9IFRSVUU7ICAgICAgICAgLyogd2UgYWx3YXlzIHdhbnQgdG8gcHVzaCBnbG9iYWwgdGFncyAqLworICBhdmktPmhhdmVfZW9zID0gRkFMU0U7CisgIGF2aS0+c2Vla2FibGUgPSBUUlVFOworCisgIGdzdF9hZGFwdGVyX2NsZWFyIChhdmktPmFkYXB0ZXIpOworCisgIGdzdF9zZWdtZW50X2luaXQgKCZhdmktPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGF2aS0+c2VnbWVudF9zZXFudW0gPSAwOworfQorCisKKy8qIEdzdEVsZW1lbnQgbWV0aG9kcyAqLworCisjaWYgMAorc3RhdGljIGNvbnN0IEdzdEZvcm1hdCAqCitnc3RfYXZpX2RlbXV4X2dldF9zcmNfZm9ybWF0cyAoR3N0UGFkICogcGFkKQoreworICBHc3RBdmlTdHJlYW0gKnN0cmVhbSA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKworICBzdGF0aWMgY29uc3QgR3N0Rm9ybWF0IHNyY19hX2Zvcm1hdHNbXSA9IHsKKyAgICBHU1RfRk9STUFUX1RJTUUsCisgICAgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICBHU1RfRk9STUFUX0RFRkFVTFQsCisgICAgMAorICB9OworICBzdGF0aWMgY29uc3QgR3N0Rm9ybWF0IHNyY192X2Zvcm1hdHNbXSA9IHsKKyAgICBHU1RfRk9STUFUX1RJTUUsCisgICAgR1NUX0ZPUk1BVF9ERUZBVUxULAorICAgIDAKKyAgfTsKKworICByZXR1cm4gKHN0cmVhbS0+c3RyaC0+dHlwZSA9PSBHU1RfUklGRl9GQ0NfYXVkcyA/CisgICAgICBzcmNfYV9mb3JtYXRzIDogc3JjX3ZfZm9ybWF0cyk7Cit9CisjZW5kaWYKKworLyogYXNzdW1lcyBzdHJlYW0tPnN0cmYuYXVkcy0+YXZfYnBzICE9IDAgKi8KK3N0YXRpYyBpbmxpbmUgR3N0Q2xvY2tUaW1lCithdmlfc3RyZWFtX2NvbnZlcnRfYnl0ZXNfdG9fdGltZV91bmNoZWNrZWQgKEdzdEF2aVN0cmVhbSAqIHN0cmVhbSwKKyAgICBndWludDY0IGJ5dGVzKQoreworICByZXR1cm4gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoYnl0ZXMsIEdTVF9TRUNPTkQsCisgICAgICBzdHJlYW0tPnN0cmYuYXVkcy0+YXZfYnBzKTsKK30KKworc3RhdGljIGlubGluZSBndWludDY0Cithdmlfc3RyZWFtX2NvbnZlcnRfdGltZV90b19ieXRlc191bmNoZWNrZWQgKEdzdEF2aVN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RDbG9ja1RpbWUgdGltZSkKK3sKKyAgcmV0dXJuIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHRpbWUsIHN0cmVhbS0+c3RyZi5hdWRzLT5hdl9icHMsCisgICAgICBHU1RfU0VDT05EKTsKK30KKworLyogYXNzdW1lcyBzdHJlYW0tPnN0cmgtPnJhdGUgIT0gMCAqLworc3RhdGljIGlubGluZSBHc3RDbG9ja1RpbWUKK2F2aV9zdHJlYW1fY29udmVydF9mcmFtZXNfdG9fdGltZV91bmNoZWNrZWQgKEdzdEF2aVN0cmVhbSAqIHN0cmVhbSwKKyAgICBndWludDY0IGZyYW1lcykKK3sKKyAgcmV0dXJuIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoZnJhbWVzLCBzdHJlYW0tPnN0cmgtPnNjYWxlICogR1NUX1NFQ09ORCwKKyAgICAgIHN0cmVhbS0+c3RyaC0+cmF0ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ3VpbnQ2NAorYXZpX3N0cmVhbV9jb252ZXJ0X3RpbWVfdG9fZnJhbWVzX3VuY2hlY2tlZCAoR3N0QXZpU3RyZWFtICogc3RyZWFtLAorICAgIEdzdENsb2NrVGltZSB0aW1lKQoreworICByZXR1cm4gZ3N0X3V0aWxfdWludDY0X3NjYWxlICh0aW1lLCBzdHJlYW0tPnN0cmgtPnJhdGUsCisgICAgICBzdHJlYW0tPnN0cmgtPnNjYWxlICogR1NUX1NFQ09ORCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9kZW11eF9zcmNfY29udmVydCAoR3N0UGFkICogcGFkLAorICAgIEdzdEZvcm1hdCBzcmNfZm9ybWF0LAorICAgIGdpbnQ2NCBzcmNfdmFsdWUsIEdzdEZvcm1hdCAqIGRlc3RfZm9ybWF0LCBnaW50NjQgKiBkZXN0X3ZhbHVlKQoreworICBHc3RBdmlTdHJlYW0gKnN0cmVhbSA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLAorICAgICAgIlJlY2VpdmVkICBzcmNfZm9ybWF0OiVzLCBzcmNfdmFsdWU6JSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgIiwgZGVzdF9mb3JtYXQ6JXMiLCBnc3RfZm9ybWF0X2dldF9uYW1lIChzcmNfZm9ybWF0KSwgc3JjX3ZhbHVlLAorICAgICAgZ3N0X2Zvcm1hdF9nZXRfbmFtZSAoKmRlc3RfZm9ybWF0KSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHNyY19mb3JtYXQgPT0gKmRlc3RfZm9ybWF0KSkgeworICAgICpkZXN0X3ZhbHVlID0gc3JjX3ZhbHVlOworICAgIGdvdG8gZG9uZTsKKyAgfQorICBpZiAoR19VTkxJS0VMWSAoIXN0cmVhbS0+c3RyaCB8fCAhc3RyZWFtLT5zdHJmLmRhdGEpKSB7CisgICAgcmVzID0gRkFMU0U7CisgICAgZ290byBkb25lOworICB9CisgIGlmIChHX1VOTElLRUxZIChzdHJlYW0tPnN0cmgtPnR5cGUgPT0gR1NUX1JJRkZfRkNDX3ZpZHMgJiYKKyAgICAgICAgICAoc3JjX2Zvcm1hdCA9PSBHU1RfRk9STUFUX0JZVEVTCisgICAgICAgICAgICAgIHx8ICpkZXN0X2Zvcm1hdCA9PSBHU1RfRk9STUFUX0JZVEVTKSkpIHsKKyAgICByZXMgPSBGQUxTRTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBzd2l0Y2ggKHNyY19mb3JtYXQpIHsKKyAgICBjYXNlIEdTVF9GT1JNQVRfVElNRToKKyAgICAgIHN3aXRjaCAoKmRlc3RfZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9CWVRFUzoKKyAgICAgICAgICAqZGVzdF92YWx1ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNyY192YWx1ZSwKKyAgICAgICAgICAgICAgc3RyZWFtLT5zdHJmLmF1ZHMtPmF2X2JwcywgR1NUX1NFQ09ORCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICAgICpkZXN0X3ZhbHVlID0KKyAgICAgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX3JvdW5kIChzcmNfdmFsdWUsIHN0cmVhbS0+c3RyaC0+cmF0ZSwKKyAgICAgICAgICAgICAgc3RyZWFtLT5zdHJoLT5zY2FsZSAqIEdTVF9TRUNPTkQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgc3dpdGNoICgqZGVzdF9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICAgICAgaWYgKHN0cmVhbS0+c3RyZi5hdWRzLT5hdl9icHMgIT0gMCkgeworICAgICAgICAgICAgKmRlc3RfdmFsdWUgPSBhdmlfc3RyZWFtX2NvbnZlcnRfYnl0ZXNfdG9fdGltZV91bmNoZWNrZWQgKHN0cmVhbSwKKyAgICAgICAgICAgICAgICBzcmNfdmFsdWUpOworICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9GT1JNQVRfREVGQVVMVDoKKyAgICAgIHN3aXRjaCAoKmRlc3RfZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9USU1FOgorICAgICAgICAgICpkZXN0X3ZhbHVlID0KKyAgICAgICAgICAgICAgYXZpX3N0cmVhbV9jb252ZXJ0X2ZyYW1lc190b190aW1lX3VuY2hlY2tlZCAoc3RyZWFtLCBzcmNfdmFsdWUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IEZBTFNFOworICB9CisKK2RvbmU6CisgIEdTVF9MT0dfT0JKRUNUIChwYWQsCisgICAgICAiUmV0dXJuaW5nIHJlczolZCBkZXN0X2Zvcm1hdDolcyBkZXN0X3ZhbHVlOiUiIEdfR1VJTlQ2NF9GT1JNQVQsIHJlcywKKyAgICAgIGdzdF9mb3JtYXRfZ2V0X25hbWUgKCpkZXN0X2Zvcm1hdCksICpkZXN0X3ZhbHVlKTsKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIEdzdEF2aURlbXV4ICphdmkgPSBHU1RfQVZJX0RFTVVYIChwYXJlbnQpOworCisgIEdzdEF2aVN0cmVhbSAqc3RyZWFtID0gZ3N0X3BhZF9nZXRfZWxlbWVudF9wcml2YXRlIChwYWQpOworCisgIGlmICghc3RyZWFtLT5zdHJoIHx8ICFzdHJlYW0tPnN0cmYuZGF0YSkKKyAgICByZXR1cm4gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX1BPU0lUSU9OOnsKKyAgICAgIGdpbnQ2NCBwb3MgPSAwOworCisgICAgICBHU1RfREVCVUcgKCJwb3MgcXVlcnkgZm9yIHN0cmVhbSAldTogZnJhbWVzICV1LCBieXRlcyAldSIsCisgICAgICAgICAgc3RyZWFtLT5udW0sIHN0cmVhbS0+Y3VycmVudF9lbnRyeSwgc3RyZWFtLT5jdXJyZW50X3RvdGFsKTsKKworICAgICAgLyogRklYTUUsIHRoaXMgbG9va3MgY2x1bXN5ICovCisgICAgICBpZiAoc3RyZWFtLT5zdHJoLT50eXBlID09IEdTVF9SSUZGX0ZDQ19hdWRzKSB7CisgICAgICAgIGlmIChzdHJlYW0tPmlzX3ZicikgeworICAgICAgICAgIC8qIFZCUiAqLworICAgICAgICAgIHBvcyA9IGF2aV9zdHJlYW1fY29udmVydF9mcmFtZXNfdG9fdGltZV91bmNoZWNrZWQgKHN0cmVhbSwKKyAgICAgICAgICAgICAgc3RyZWFtLT5jdXJyZW50X2VudHJ5KTsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJWQlIgY29udmVydCBmcmFtZSAldSwgdGltZSAlIgorICAgICAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIHN0cmVhbS0+Y3VycmVudF9lbnRyeSwgR1NUX1RJTUVfQVJHUyAocG9zKSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLT5zdHJmLmF1ZHMtPmF2X2JwcyAhPSAwKSB7CisgICAgICAgICAgLyogQ0JSICovCisgICAgICAgICAgcG9zID0gYXZpX3N0cmVhbV9jb252ZXJ0X2J5dGVzX3RvX3RpbWVfdW5jaGVja2VkIChzdHJlYW0sCisgICAgICAgICAgICAgIHN0cmVhbS0+Y3VycmVudF90b3RhbCk7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLAorICAgICAgICAgICAgICAiQ0JSIGNvbnZlcnQgYnl0ZXMgJXUsIHRpbWUgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgICBzdHJlYW0tPmN1cnJlbnRfdG90YWwsIEdTVF9USU1FX0FSR1MgKHBvcykpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS0+aWR4X24gIT0gMCAmJiBzdHJlYW0tPnRvdGFsX2J5dGVzICE9IDApIHsKKyAgICAgICAgICAvKiBjYWxjdWxhdGUgdGltZXN0YW1wcyBiYXNlZCBvbiBwZXJjZW50YWdlIG9mIGxlbmd0aCAqLworICAgICAgICAgIGd1aW50NjQgeGxlbiA9IGF2aS0+YXZpaC0+dXNfZnJhbWUgKgorICAgICAgICAgICAgICBhdmktPmF2aWgtPnRvdF9mcmFtZXMgKiBHU1RfVVNFQ09ORDsKKworICAgICAgICAgIHBvcyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoeGxlbiwgc3RyZWFtLT5jdXJyZW50X3RvdGFsLAorICAgICAgICAgICAgICBzdHJlYW0tPnRvdGFsX2J5dGVzKTsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksCisgICAgICAgICAgICAgICJDQlIgcGVyYyBjb252ZXJ0IGJ5dGVzICV1LCB0aW1lICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgICAgc3RyZWFtLT5jdXJyZW50X3RvdGFsLCBHU1RfVElNRV9BUkdTIChwb3MpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiB3ZSBkb24ndCBrbm93ICovCisgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzdHJlYW0tPnN0cmgtPnJhdGUgIT0gMCkgeworICAgICAgICAgIHBvcyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoKGd1aW50NjQpIHN0cmVhbS0+Y3VycmVudF9lbnRyeSAqCisgICAgICAgICAgICAgIHN0cmVhbS0+c3RyaC0+c2NhbGUsIEdTVF9TRUNPTkQsIChndWludDY0KSBzdHJlYW0tPnN0cmgtPnJhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBvcyA9IHN0cmVhbS0+Y3VycmVudF9lbnRyeSAqIGF2aS0+YXZpaC0+dXNfZnJhbWUgKiBHU1RfVVNFQ09ORDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHJlcykgeworICAgICAgICBHU1RfREVCVUcgKCJwb3MgcXVlcnkgOiAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHBvcykpOworICAgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgR1NUX0ZPUk1BVF9USU1FLCBwb3MpOworICAgICAgfSBlbHNlCisgICAgICAgIEdTVF9XQVJOSU5HICgicG9zIHF1ZXJ5IGZhaWxlZCIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX0RVUkFUSU9OOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmbXQ7CisgICAgICBHc3RDbG9ja1RpbWUgZHVyYXRpb247CisKKyAgICAgIC8qIG9ubHkgYWN0IG9uIGF1ZGlvIG9yIHZpZGVvIHN0cmVhbXMgKi8KKyAgICAgIGlmIChzdHJlYW0tPnN0cmgtPnR5cGUgIT0gR1NUX1JJRkZfRkNDX2F1ZHMgJiYKKyAgICAgICAgICBzdHJlYW0tPnN0cmgtPnR5cGUgIT0gR1NUX1JJRkZfRkNDX3ZpZHMgJiYKKyAgICAgICAgICBzdHJlYW0tPnN0cmgtPnR5cGUgIT0gR1NUX1JJRkZfRkNDX2lhdnMpIHsKKyAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvKiB0YWtlIHN0cmVhbSBkdXJhdGlvbiwgZmFsbCBiYWNrIHRvIGF2aWggZHVyYXRpb24gKi8KKyAgICAgIGlmICgoZHVyYXRpb24gPSBzdHJlYW0tPmR1cmF0aW9uKSA9PSAtMSkKKyAgICAgICAgaWYgKChkdXJhdGlvbiA9IHN0cmVhbS0+aGRyX2R1cmF0aW9uKSA9PSAtMSkKKyAgICAgICAgICBkdXJhdGlvbiA9IGF2aS0+ZHVyYXRpb247CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9kdXJhdGlvbiAocXVlcnksICZmbXQsIE5VTEwpOworCisgICAgICBzd2l0Y2ggKGZtdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfVElNRToKKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X2R1cmF0aW9uIChxdWVyeSwgZm10LCBkdXJhdGlvbik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICB7CisgICAgICAgICAgZ2ludDY0IGR1cjsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdWVyeSwgInRvdGFsIGZyYW1lcyBpcyAlIiBHX0dVSU5UMzJfRk9STUFULAorICAgICAgICAgICAgICBzdHJlYW0tPmlkeF9uKTsKKworICAgICAgICAgIGlmIChzdHJlYW0tPmlkeF9uID4gMCkKKyAgICAgICAgICAgIGdzdF9xdWVyeV9zZXRfZHVyYXRpb24gKHF1ZXJ5LCBmbXQsIHN0cmVhbS0+aWR4X24pOworICAgICAgICAgIGVsc2UgaWYgKGdzdF9wYWRfcXVlcnlfY29udmVydCAocGFkLCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwgZm10LCAmZHVyKSkKKyAgICAgICAgICAgIGdzdF9xdWVyeV9zZXRfZHVyYXRpb24gKHF1ZXJ5LCBmbXQsIGR1cik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9TRUVLSU5HOnsKKyAgICAgIEdzdEZvcm1hdCBmbXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9zZWVraW5nIChxdWVyeSwgJmZtdCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICBpZiAoZm10ID09IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgICBnYm9vbGVhbiBzZWVrYWJsZSA9IFRSVUU7CisKKyAgICAgICAgaWYgKGF2aS0+c3RyZWFtaW5nKSB7CisgICAgICAgICAgc2Vla2FibGUgPSBhdmktPnNlZWthYmxlOworICAgICAgICB9CisKKyAgICAgICAgZ3N0X3F1ZXJ5X3NldF9zZWVraW5nIChxdWVyeSwgR1NUX0ZPUk1BVF9USU1FLCBzZWVrYWJsZSwKKyAgICAgICAgICAgIDAsIHN0cmVhbS0+ZHVyYXRpb24pOworICAgICAgICByZXMgPSBUUlVFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX0NPTlZFUlQ6eworICAgICAgR3N0Rm9ybWF0IHNyY19mbXQsIGRlc3RfZm10OworICAgICAgZ2ludDY0IHNyY192YWwsIGRlc3RfdmFsOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY29udmVydCAocXVlcnksICZzcmNfZm10LCAmc3JjX3ZhbCwgJmRlc3RfZm10LCAmZGVzdF92YWwpOworICAgICAgaWYgKChyZXMgPSBnc3RfYXZpX2RlbXV4X3NyY19jb252ZXJ0IChwYWQsIHNyY19mbXQsIHNyY192YWwsICZkZXN0X2ZtdCwKKyAgICAgICAgICAgICAgICAgICZkZXN0X3ZhbCkpKQorICAgICAgICBnc3RfcXVlcnlfc2V0X2NvbnZlcnQgKHF1ZXJ5LCBzcmNfZm10LCBzcmNfdmFsLCBkZXN0X2ZtdCwgZGVzdF92YWwpOworICAgICAgZWxzZQorICAgICAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfU0VHTUVOVDoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworICAgICAgZ2ludDY0IHN0YXJ0LCBzdG9wOworCisgICAgICBmb3JtYXQgPSBhdmktPnNlZ21lbnQuZm9ybWF0OworCisgICAgICBzdGFydCA9CisgICAgICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZhdmktPnNlZ21lbnQsIGZvcm1hdCwKKyAgICAgICAgICBhdmktPnNlZ21lbnQuc3RhcnQpOworICAgICAgaWYgKChzdG9wID0gYXZpLT5zZWdtZW50LnN0b3ApID09IC0xKQorICAgICAgICBzdG9wID0gYXZpLT5zZWdtZW50LmR1cmF0aW9uOworICAgICAgZWxzZQorICAgICAgICBzdG9wID0gZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZhdmktPnNlZ21lbnQsIGZvcm1hdCwgc3RvcCk7CisKKyAgICAgIGdzdF9xdWVyeV9zZXRfc2VnbWVudCAocXVlcnksIGF2aS0+c2VnbWVudC5yYXRlLCBmb3JtYXQsIHN0YXJ0LCBzdG9wKTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworI2lmIDAKK3N0YXRpYyBjb25zdCBHc3RFdmVudE1hc2sgKgorZ3N0X2F2aV9kZW11eF9nZXRfZXZlbnRfbWFzayAoR3N0UGFkICogcGFkKQoreworICBzdGF0aWMgY29uc3QgR3N0RXZlbnRNYXNrIG1hc2tzW10gPSB7CisgICAge0dTVF9FVkVOVF9TRUVLLCBHU1RfU0VFS19NRVRIT0RfU0VUIHwgR1NUX1NFRUtfRkxBR19LRVlfVU5JVH0sCisgICAgezAsfQorICB9OworCisgIHJldHVybiBtYXNrczsKK30KKyNlbmRpZgorCisjaWYgMAorc3RhdGljIGd1aW50NjQKK2dzdF9hdmlfZGVtdXhfc2Vla19zdHJlYW1zIChHc3RBdmlEZW11eCAqIGF2aSwgZ3VpbnQ2NCBvZmZzZXQsIGdib29sZWFuIGJlZm9yZSkKK3sKKyAgR3N0QXZpU3RyZWFtICpzdHJlYW07CisgIEdzdEluZGV4RW50cnkgKmVudHJ5OworICBnaW50IGk7CisgIGdpbnQ2NCB2YWwsIG1pbiA9IG9mZnNldDsKKworICBmb3IgKGkgPSAwOyBpIDwgYXZpLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgc3RyZWFtID0gJmF2aS0+c3RyZWFtW2ldOworCisgICAgZW50cnkgPSBnc3RfaW5kZXhfZ2V0X2Fzc29jX2VudHJ5IChhdmktPmVsZW1lbnRfaW5kZXgsIHN0cmVhbS0+aW5kZXhfaWQsCisgICAgICAgIGJlZm9yZSA/IEdTVF9JTkRFWF9MT09LVVBfQkVGT1JFIDogR1NUX0lOREVYX0xPT0tVUF9BRlRFUiwKKyAgICAgICAgR1NUX0FTU09DSUFUSU9OX0ZMQUdfTk9ORSwgR1NUX0ZPUk1BVF9CWVRFUywgb2Zmc2V0KTsKKworICAgIGlmIChiZWZvcmUpIHsKKyAgICAgIGlmIChlbnRyeSkgeworICAgICAgICBnc3RfaW5kZXhfZW50cnlfYXNzb2NfbWFwIChlbnRyeSwgR1NUX0ZPUk1BVF9CWVRFUywgJnZhbCk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInN0cmVhbSAlZCwgcHJldmlvdXMgZW50cnkgYXQgJSIKKyAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGksIHZhbCk7CisgICAgICAgIGlmICh2YWwgPCBtaW4pCisgICAgICAgICAgbWluID0gdmFsOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKCFlbnRyeSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAibm8gcG9zaXRpb24gZm9yIHN0cmVhbSAlZCwgYXNzdW1pbmcgYXQgc3RhcnQiLCBpKTsKKyAgICAgIHN0cmVhbS0+Y3VycmVudF9lbnRyeSA9IDA7CisgICAgICBzdHJlYW0tPmN1cnJlbnRfdG90YWwgPSAwOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgZ3N0X2luZGV4X2VudHJ5X2Fzc29jX21hcCAoZW50cnksIEdTVF9GT1JNQVRfQllURVMsICZ2YWwpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInN0cmVhbSAlZCwgbmV4dCBlbnRyeSBhdCAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICBpLCB2YWwpOworCisgICAgZ3N0X2luZGV4X2VudHJ5X2Fzc29jX21hcCAoZW50cnksIEdTVF9GT1JNQVRfVElNRSwgJnZhbCk7CisgICAgc3RyZWFtLT5jdXJyZW50X3RvdGFsID0gdmFsOworICAgIGdzdF9pbmRleF9lbnRyeV9hc3NvY19tYXAgKGVudHJ5LCBHU1RfRk9STUFUX0RFRkFVTFQsICZ2YWwpOworICAgIHN0cmVhbS0+Y3VycmVudF9lbnRyeSA9IHZhbDsKKyAgfQorCisgIHJldHVybiBtaW47Cit9CisjZW5kaWYKKworc3RhdGljIGdpbnQKK2dzdF9hdmlfZGVtdXhfaW5kZXhfZW50cnlfb2Zmc2V0X3NlYXJjaCAoR3N0QXZpSW5kZXhFbnRyeSAqIGVudHJ5LAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGlmIChlbnRyeS0+b2Zmc2V0IDwgKm9mZnNldCkKKyAgICByZXR1cm4gLTE7CisgIGVsc2UgaWYgKGVudHJ5LT5vZmZzZXQgPiAqb2Zmc2V0KQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGd1aW50NjQKK2dzdF9hdmlfZGVtdXhfc2Vla19zdHJlYW1zX2luZGV4IChHc3RBdmlEZW11eCAqIGF2aSwgZ3VpbnQ2NCBvZmZzZXQsCisgICAgZ2Jvb2xlYW4gYmVmb3JlKQoreworICBHc3RBdmlTdHJlYW0gKnN0cmVhbTsKKyAgR3N0QXZpSW5kZXhFbnRyeSAqZW50cnk7CisgIGdpbnQgaTsKKyAgZ2ludDY0IHZhbCwgbWluID0gb2Zmc2V0OworICBndWludCBpbmRleCA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IGF2aS0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgIHN0cmVhbSA9ICZhdmktPnN0cmVhbVtpXTsKKworICAgIC8qIGNvbXBlbnNhdGUgZm9yIGNodW5rIGhlYWRlciAqLworICAgIG9mZnNldCArPSA4OworICAgIGVudHJ5ID0KKyAgICAgICAgZ3N0X3V0aWxfYXJyYXlfYmluYXJ5X3NlYXJjaCAoc3RyZWFtLT5pbmRleCwgc3RyZWFtLT5pZHhfbiwKKyAgICAgICAgc2l6ZW9mIChHc3RBdmlJbmRleEVudHJ5KSwKKyAgICAgICAgKEdDb21wYXJlRGF0YUZ1bmMpIGdzdF9hdmlfZGVtdXhfaW5kZXhfZW50cnlfb2Zmc2V0X3NlYXJjaCwKKyAgICAgICAgYmVmb3JlID8gR1NUX1NFQVJDSF9NT0RFX0JFRk9SRSA6IEdTVF9TRUFSQ0hfTU9ERV9BRlRFUiwgJm9mZnNldCwgTlVMTCk7CisgICAgb2Zmc2V0IC09IDg7CisKKyAgICBpZiAoZW50cnkpCisgICAgICBpbmRleCA9IGVudHJ5IC0gc3RyZWFtLT5pbmRleDsKKworICAgIGlmIChiZWZvcmUpIHsKKyAgICAgIGlmIChlbnRyeSkgeworICAgICAgICB2YWwgPSBzdHJlYW0tPmluZGV4W2luZGV4XS5vZmZzZXQ7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwKKyAgICAgICAgICAgICJzdHJlYW0gJWQsIHByZXZpb3VzIGVudHJ5IGF0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIGksIHZhbCk7CisgICAgICAgIGlmICh2YWwgPCBtaW4pCisgICAgICAgICAgbWluID0gdmFsOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKCFlbnRyeSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAibm8gcG9zaXRpb24gZm9yIHN0cmVhbSAlZCwgYXNzdW1pbmcgYXQgc3RhcnQiLCBpKTsKKyAgICAgIHN0cmVhbS0+Y3VycmVudF9lbnRyeSA9IDA7CisgICAgICBzdHJlYW0tPmN1cnJlbnRfdG90YWwgPSAwOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgdmFsID0gc3RyZWFtLT5pbmRleFtpbmRleF0ub2Zmc2V0IC0gODsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJzdHJlYW0gJWQsIG5leHQgZW50cnkgYXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwgaSwKKyAgICAgICAgdmFsKTsKKworICAgIHN0cmVhbS0+Y3VycmVudF90b3RhbCA9IHN0cmVhbS0+aW5kZXhbaW5kZXhdLnRvdGFsOworICAgIHN0cmVhbS0+Y3VycmVudF9lbnRyeSA9IGluZGV4OworICB9CisKKyAgcmV0dXJuIG1pbjsKK30KKworI2RlZmluZSBHU1RfQVZJX1NFRUtfUFVTSF9ESVNQTEFDRSAgICAgKDQgKiBHU1RfU0VDT05EKQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdmlfZGVtdXhfaGFuZGxlX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIEdzdEF2aURlbXV4ICphdmkgPSBHU1RfQVZJX0RFTVVYIChwYXJlbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwKKyAgICAgICJoYXZlIGV2ZW50IHR5cGUgJXM6ICVwIG9uIHNpbmsgcGFkIiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpLCBldmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDoKKyAgICB7CisgICAgICBnaW50NjQgYm9mZnNldCwgb2Zmc2V0ID0gMDsKKyAgICAgIEdzdFNlZ21lbnQgc2VnbWVudDsKKyAgICAgIEdzdEV2ZW50ICpzZWdtZW50X2V2ZW50OworCisgICAgICAvKiBzb21lIGRlYnVnIG91dHB1dCAqLworICAgICAgZ3N0X2V2ZW50X2NvcHlfc2VnbWVudCAoZXZlbnQsICZzZWdtZW50KTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInJlY2VpdmVkIG5ld3NlZ21lbnQgJSIgR1NUX1NFR01FTlRfRk9STUFULAorICAgICAgICAgICZzZWdtZW50KTsKKworICAgICAgLyogY2hhaW4gd2lsbCBzZW5kIGluaXRpYWwgbmV3c2VnbWVudCBhZnRlciBwYWRzIGhhdmUgYmVlbiBhZGRlZCAqLworICAgICAgaWYgKGF2aS0+c3RhdGUgIT0gR1NUX0FWSV9ERU1VWF9NT1ZJKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInN0aWxsIHN0YXJ0aW5nLCBlYXRpbmcgZXZlbnQiKTsKKyAgICAgICAgZ290byBleGl0OworICAgICAgfQorCisgICAgICAvKiB3ZSBvbmx5IGV4cGVjdCBhIEJZVEUgc2VnbWVudCwgZS5nLiBmb2xsb3dpbmcgYSBzZWVrICovCisgICAgICBpZiAoc2VnbWVudC5mb3JtYXQgIT0gR1NUX0ZPUk1BVF9CWVRFUykgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJ1bnN1cHBvcnRlZCBzZWdtZW50IGZvcm1hdCwgaWdub3JpbmciKTsKKyAgICAgICAgZ290byBleGl0OworICAgICAgfQorCisgICAgICBpZiAoYXZpLT5oYXZlX2luZGV4KSB7CisgICAgICAgIEdzdEF2aUluZGV4RW50cnkgKmVudHJ5OworICAgICAgICBndWludCBpID0gMCwgaW5kZXggPSAwLCBrID0gMDsKKyAgICAgICAgR3N0QXZpU3RyZWFtICpzdHJlYW07CisKKyAgICAgICAgLyogY29tcGVuc2F0ZSBjaHVuayBoZWFkZXIsIHN0b3JlZCBpbmRleCBvZmZzZXQgcG9pbnRzIGFmdGVyIGhlYWRlciAqLworICAgICAgICBib2Zmc2V0ID0gc2VnbWVudC5zdGFydCArIDg7CisgICAgICAgIC8qIGZpbmQgd2hpY2ggc3RyZWFtIHdlJ3JlIG9uICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICBzdHJlYW0gPSAmYXZpLT5zdHJlYW1baV07CisKKyAgICAgICAgICAvKiBmaW5kIHRoZSBpbmRleCBmb3Igc3RhcnQgYnl0ZXMgb2Zmc2V0ICovCisgICAgICAgICAgZW50cnkgPSBnc3RfdXRpbF9hcnJheV9iaW5hcnlfc2VhcmNoIChzdHJlYW0tPmluZGV4LAorICAgICAgICAgICAgICBzdHJlYW0tPmlkeF9uLCBzaXplb2YgKEdzdEF2aUluZGV4RW50cnkpLAorICAgICAgICAgICAgICAoR0NvbXBhcmVEYXRhRnVuYykgZ3N0X2F2aV9kZW11eF9pbmRleF9lbnRyeV9vZmZzZXRfc2VhcmNoLAorICAgICAgICAgICAgICBHU1RfU0VBUkNIX01PREVfQUZURVIsICZib2Zmc2V0LCBOVUxMKTsKKworICAgICAgICAgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgaW5kZXggPSBlbnRyeSAtIHN0cmVhbS0+aW5kZXg7CisKKyAgICAgICAgICAvKiB3ZSBhcmUgb24gdGhlIHN0cmVhbSB3aXRoIGEgY2h1bmsgc3RhcnQgb2Zmc2V0IGNsb3Nlc3QgdG8gc3RhcnQgKi8KKyAgICAgICAgICBpZiAoIW9mZnNldCB8fCBzdHJlYW0tPmluZGV4W2luZGV4XS5vZmZzZXQgPCBvZmZzZXQpIHsKKyAgICAgICAgICAgIG9mZnNldCA9IHN0cmVhbS0+aW5kZXhbaW5kZXhdLm9mZnNldDsKKyAgICAgICAgICAgIGsgPSBpOworICAgICAgICAgIH0KKyAgICAgICAgICAvKiBleGFjdCBtYXRjaCBuZWVkcyBubyBmdXJ0aGVyIHNlYXJjaGluZyAqLworICAgICAgICAgIGlmIChzdHJlYW0tPmluZGV4W2luZGV4XS5vZmZzZXQgPT0gYm9mZnNldCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IHdoaWxlICgrK2kgPCBhdmktPm51bV9zdHJlYW1zKTsKKyAgICAgICAgYm9mZnNldCAtPSA4OworICAgICAgICBvZmZzZXQgLT0gODsKKyAgICAgICAgc3RyZWFtID0gJmF2aS0+c3RyZWFtW2tdOworCisgICAgICAgIC8qIHNvIHdlIGhhdmUgbm8gaWRlYSB3aGF0IGlzIHRvIGNvbWUsIG9yIHdoZXJlIHdlIGFyZSAqLworICAgICAgICBpZiAoIW9mZnNldCkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLCAiaW5zdWZmaWNpZW50IGluZGV4IGRhdGEsIGZvcmNpbmcgRU9TIik7CisgICAgICAgICAgZ290byBlb3M7CisgICAgICAgIH0KKworICAgICAgICAvKiBnZXQgdGhlIHRzIGNvcnJlc3BvbmRpbmcgdG8gc3RhcnQgb2Zmc2V0IGJ5dGVzIGZvciB0aGUgc3RyZWFtICovCisgICAgICAgIGdzdF9hdmlfZGVtdXhfZ2V0X2J1ZmZlcl9pbmZvIChhdmksIHN0cmVhbSwgaW5kZXgsCisgICAgICAgICAgICAoR3N0Q2xvY2tUaW1lICopICYgc2VnbWVudC50aW1lLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyNpZiAwCisgICAgICB9IGVsc2UgaWYgKGF2aS0+ZWxlbWVudF9pbmRleCkgeworICAgICAgICBHc3RJbmRleEVudHJ5ICplbnRyeTsKKworICAgICAgICAvKiBMZXQncyBjaGVjayBpZiB3ZSBoYXZlIGFuIGluZGV4IGVudHJ5IGZvciB0aGlzIHBvc2l0aW9uICovCisgICAgICAgIGVudHJ5ID0gZ3N0X2luZGV4X2dldF9hc3NvY19lbnRyeSAoYXZpLT5lbGVtZW50X2luZGV4LCBhdmktPmluZGV4X2lkLAorICAgICAgICAgICAgR1NUX0lOREVYX0xPT0tVUF9BRlRFUiwgR1NUX0FTU09DSUFUSU9OX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgIEdTVF9GT1JNQVRfQllURVMsIHNlZ21lbnQuc3RhcnQpOworCisgICAgICAgIC8qIHdlIGNhbiBub3QgZ28gd2hlcmUgd2UgaGF2ZSBub3QgeWV0IGJlZW4gYmVmb3JlIC4uLiAqLworICAgICAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJpbnN1ZmZpY2llbnQgaW5kZXggZGF0YSwgZm9yY2luZyBFT1MiKTsKKyAgICAgICAgICBnb3RvIGVvczsKKyAgICAgICAgfQorCisgICAgICAgIGdzdF9pbmRleF9lbnRyeV9hc3NvY19tYXAgKGVudHJ5LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICAoZ2ludDY0ICopICYgc2VnbWVudC50aW1lKTsKKyAgICAgICAgZ3N0X2luZGV4X2VudHJ5X2Fzc29jX21hcCAoZW50cnksIEdTVF9GT1JNQVRfQllURVMsICZvZmZzZXQpOworI2VuZGlmCisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwgIm5vIGluZGV4IGRhdGEsIGZvcmNpbmcgRU9TIik7CisgICAgICAgIGdvdG8gZW9zOworICAgICAgfQorCisgICAgICBzZWdtZW50LmZvcm1hdCA9IEdTVF9GT1JNQVRfVElNRTsKKyAgICAgIHNlZ21lbnQuc3RhcnQgPSBzZWdtZW50LnRpbWU7CisgICAgICBzZWdtZW50LnN0b3AgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgc2VnbWVudC5wb3NpdGlvbiA9IHNlZ21lbnQuc3RhcnQ7CisKKyAgICAgIC8qIHJlc2N1ZSBkdXJhdGlvbiAqLworICAgICAgc2VnbWVudC5kdXJhdGlvbiA9IGF2aS0+c2VnbWVudC5kdXJhdGlvbjsKKworICAgICAgLyogc2V0IHVwIHNlZ21lbnQgYW5kIHNlbmQgZG93bnN0cmVhbSAqLworICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvICgmc2VnbWVudCwgJmF2aS0+c2VnbWVudCk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIlB1c2hpbmcgbmV3c2VnICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwgJnNlZ21lbnQpOworICAgICAgYXZpLT5zZWdtZW50X3NlcW51bSA9IGdzdF9ldmVudF9nZXRfc2VxbnVtIChldmVudCk7CisgICAgICBzZWdtZW50X2V2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCk7CisgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoc2VnbWVudF9ldmVudCwgZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KSk7CisgICAgICBnc3RfYXZpX2RlbXV4X3B1c2hfZXZlbnQgKGF2aSwgc2VnbWVudF9ldmVudCk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIm5leHQgY2h1bmsgZXhwZWN0ZWQgYXQgJSIgR19HSU5UNjRfRk9STUFULAorICAgICAgICAgIGJvZmZzZXQpOworCisgICAgICAvKiBhZGp1c3Qgc3RhdGUgZm9yIHN0cmVhbWluZyB0aHJlYWQgYWNjb3JkaW5nbHkgKi8KKyAgICAgIGlmIChhdmktPmhhdmVfaW5kZXgpCisgICAgICAgIGdzdF9hdmlfZGVtdXhfc2Vla19zdHJlYW1zX2luZGV4IChhdmksIG9mZnNldCwgRkFMU0UpOworI2lmIDAKKyAgICAgIGVsc2UKKyAgICAgICAgZ3N0X2F2aV9kZW11eF9zZWVrX3N0cmVhbXMgKGF2aSwgb2Zmc2V0LCBGQUxTRSk7CisjZW5kaWYKKworICAgICAgLyogc2V0IHVwIHN0cmVhbWluZyB0aHJlYWQgKi8KKyAgICAgIGdfYXNzZXJ0IChvZmZzZXQgPj0gYm9mZnNldCk7CisgICAgICBhdmktPm9mZnNldCA9IGJvZmZzZXQ7CisgICAgICBhdmktPnRvZHJvcCA9IG9mZnNldCAtIGJvZmZzZXQ7CisKKyAgICBleGl0OgorICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgZW9zOgorICAgICAgLyogc2V0IHVwIGZvciBFT1MgKi8KKyAgICAgIGF2aS0+aGF2ZV9lb3MgPSBUUlVFOworICAgICAgZ290byBleGl0OworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgeworICAgICAgaWYgKGF2aS0+c3RhdGUgIT0gR1NUX0FWSV9ERU1VWF9NT1ZJKSB7CisgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXZpLCBTVFJFQU0sIERFTVVYLAorICAgICAgICAgICAgKE5VTEwpLCAoImdvdCBlb3MgYW5kIGRpZG4ndCByZWNlaXZlIGEgY29tcGxldGUgaGVhZGVyIG9iamVjdCIpKTsKKyAgICAgIH0gZWxzZSBpZiAoIWdzdF9hdmlfZGVtdXhfcHVzaF9ldmVudCAoYXZpLCBldmVudCkpIHsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgICAgIChOVUxMKSwgKCJnb3QgZW9zIGJ1dCBubyBzdHJlYW1zICh5ZXQpIikpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgeworICAgICAgZ2ludCBpOworCisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAoYXZpLT5hZGFwdGVyKTsKKyAgICAgIGF2aS0+aGF2ZV9lb3MgPSBGQUxTRTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmktPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgYXZpLT5zdHJlYW1baV0uZGlzY29udCA9IFRSVUU7CisgICAgICB9CisgICAgICAvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCBjYXNlIHNvIHRoYXQgdGhlIGV2ZW50IGdldHMgcGFzc2VkIGRvd25zdHJlYW0gKi8KKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIEdzdEF2aURlbXV4ICphdmkgPSBHU1RfQVZJX0RFTVVYIChwYXJlbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwKKyAgICAgICJoYXZlIGV2ZW50IHR5cGUgJXM6ICVwIG9uIHNyYyBwYWQiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCksIGV2ZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUVLOgorICAgICAgaWYgKCFhdmktPnN0cmVhbWluZykgeworICAgICAgICByZXMgPSBnc3RfYXZpX2RlbXV4X2hhbmRsZV9zZWVrIChhdmksIHBhZCwgZXZlbnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gZ3N0X2F2aV9kZW11eF9oYW5kbGVfc2Vla19wdXNoIChhdmksIHBhZCwgZXZlbnQpOworICAgICAgfQorICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCisvKiBzdHJlYW1pbmcgaGVscGVyIChwdXNoKSAqLworCisvKgorICogZ3N0X2F2aV9kZW11eF9wZWVrX2NodW5rX2luZm86CisgKiBAYXZpOiBBdmkgb2JqZWN0CisgKiBAdGFnOiBob2xkZXIgZm9yIHRhZworICogQHNpemU6IGhvbGRlciBmb3IgdGFnIHNpemUKKyAqCisgKiBQZWVrIG5leHQgY2h1bmsgaW5mbyAodGFnIGFuZCBzaXplKQorICoKKyAqIFJldHVybnM6IFRSVUUgd2hlbiBvbmUgY2h1bmsgaW5mbyBoYXMgYmVlbiBnb3QKKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYXZpX2RlbXV4X3BlZWtfY2h1bmtfaW5mbyAoR3N0QXZpRGVtdXggKiBhdmksIGd1aW50MzIgKiB0YWcsIGd1aW50MzIgKiBzaXplKQoreworICBjb25zdCBndWludDggKmRhdGEgPSBOVUxMOworCisgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGF2aS0+YWRhcHRlcikgPCA4KQorICAgIHJldHVybiBGQUxTRTsKKworICBkYXRhID0gZ3N0X2FkYXB0ZXJfbWFwIChhdmktPmFkYXB0ZXIsIDgpOworICAqdGFnID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKyAgKnNpemUgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEgKyA0KTsKKyAgZ3N0X2FkYXB0ZXJfdW5tYXAgKGF2aS0+YWRhcHRlcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBnc3RfYXZpX2RlbXV4X3BlZWtfY2h1bms6CisgKiBAYXZpOiBBdmkgb2JqZWN0CisgKiBAdGFnOiBob2xkZXIgZm9yIHRhZworICogQHNpemU6IGhvbGRlciBmb3IgdGFnIHNpemUKKyAqCisgKiBQZWVrIGVub3VnaCBkYXRhIGZvciBvbmUgZnVsbCBjaHVuaworICoKKyAqIFJldHVybnM6ICVUUlVFIHdoZW4gb25lIGNodW5rIGhhcyBiZWVuIGdvdAorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdmlfZGVtdXhfcGVla19jaHVuayAoR3N0QXZpRGVtdXggKiBhdmksIGd1aW50MzIgKiB0YWcsIGd1aW50MzIgKiBzaXplKQoreworICBndWludDMyIHBlZWtfc2l6ZSA9IDA7CisgIGdpbnQgYXZhaWxhYmxlOworCisgIGlmICghZ3N0X2F2aV9kZW11eF9wZWVrX2NodW5rX2luZm8gKGF2aSwgdGFnLCBzaXplKSkKKyAgICBnb3RvIHBlZWtfZmFpbGVkOworCisgIC8qIHNpemUgMCAtPiBlbXB0eSBkYXRhIGJ1ZmZlciB3b3VsZCBzdXJwcmlzZSBtb3N0IGNhbGxlcnMsCisgICAqIGxhcmdlIHNpemUgLT4gZG8gbm90IGJvdGhlciB0cnlpbmcgdG8gc3F1ZWV6ZSB0aGF0IGludG8gYWRhcHRlciwKKyAgICogc28gd2UgdGhyb3cgcG9vciBtYW4ncyBleGNlcHRpb24sIHdoaWNoIGNhbiBiZSBjYXVnaHQgaWYgY2FsbGVyIHJlYWxseQorICAgKiB3YW50cyB0byBoYW5kbGUgMCBzaXplIGNodW5rICovCisgIGlmICghKCpzaXplKSB8fCAoKnNpemUpID49ICgxIDw8IDMwKSkKKyAgICBnb3RvIHN0cmFuZ2Vfc2l6ZTsKKworICBwZWVrX3NpemUgPSAoKnNpemUgKyAxKSAmIH4xOworICBhdmFpbGFibGUgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGF2aS0+YWRhcHRlcik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLAorICAgICAgIk5lZWQgdG8gcGVlayBjaHVuayBvZiAlZCBieXRlcyB0byByZWFkIGNodW5rICUiIEdTVF9GT1VSQ0NfRk9STUFUCisgICAgICAiLCAlZCBieXRlcyBhdmFpbGFibGUiLCAqc2l6ZSwgR1NUX0ZPVVJDQ19BUkdTICgqdGFnKSwgYXZhaWxhYmxlKTsKKworICBpZiAoYXZhaWxhYmxlIDwgKDggKyBwZWVrX3NpemUpKQorICAgIGdvdG8gbmVlZF9tb3JlOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworcGVla19mYWlsZWQ6CisgIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgIkZhaWxlZCB0byBwZWVrIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitzdHJhbmdlX3NpemU6CisgIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwKKyAgICAgICAgIkludmFsaWQvdW5leHBlY3RlZCBjaHVuayBzaXplICVkIGZvciB0YWcgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsICpzaXplLAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKCp0YWcpKTsKKyAgICAvKiBjaGFpbiBzaG91bGQgZ2l2ZSB1cCAqLworICAgIGF2aS0+YWJvcnRfYnVmZmVyaW5nID0gVFJVRTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25lZWRfbW9yZToKKyAgeworICAgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAibmVlZCBtb3JlICVkIDwgJSIgR19HVUlOVDMyX0ZPUk1BVCwKKyAgICAgICAgYXZhaWxhYmxlLCA4ICsgcGVla19zaXplKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogQVZJIGluaXQgKi8KKworLyoKKyAqIGdzdF9hdmlfZGVtdXhfcGFyc2VfZmlsZV9oZWFkZXI6CisgKiBAZWxlbWVudDogY2FsbGVyIGVsZW1lbnQgKHVzZWQgZm9yIGVycm9ycy9kZWJ1ZykuCisgKiBAYnVmOiBpbnB1dCBkYXRhIHRvIGJlIHVzZWQgZm9yIHBhcnNpbmcuCisgKgorICogIk9wZW4iIGEgUklGRi9BVkkgZmlsZS4gVGhlIGJ1ZmZlciBzaG91bGQgYmUgYXQgbGVhc3QgMTIKKyAqIGJ5dGVzIGxvbmcuIFRha2VzIG93bmVyc2hpcCBvZiBAYnVmLgorICoKKyAqIFJldHVybnM6IFRSVUUgaWYgdGhlIGZpbGUgaXMgYSBSSUZGL0FWSSBmaWxlLCBGQUxTRSBvdGhlcndpc2UuCisgKiAgICAgICAgICBUaHJvd3MgYW4gZXJyb3IsIGNhbGxlciBzaG91bGQgZXJyb3Igb3V0IChmYXRhbCkuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9kZW11eF9wYXJzZV9maWxlX2hlYWRlciAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgZ3VpbnQzMiBkb2N0eXBlOworICBHc3RDbG9ja1RpbWUgc3RhbXA7CisKKyAgc3RhbXAgPSBnc3RfdXRpbF9nZXRfdGltZXN0YW1wICgpOworCisgIC8qIHJpZmZfcGFyc2UgcG9zdHMgYW4gZXJyb3IgKi8KKyAgaWYgKCFnc3RfcmlmZl9wYXJzZV9maWxlX2hlYWRlciAoZWxlbWVudCwgYnVmLCAmZG9jdHlwZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChkb2N0eXBlICE9IEdTVF9SSUZGX1JJRkZfQVZJKQorICAgIGdvdG8gbm90X2F2aTsKKworICBzdGFtcCA9IGdzdF91dGlsX2dldF90aW1lc3RhbXAgKCkgLSBzdGFtcDsKKyAgR1NUX0RFQlVHX09CSkVDVCAoZWxlbWVudCwgImhlYWRlciBwYXJzaW5nIHRvb2sgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoc3RhbXApKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK25vdF9hdmk6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZWxlbWVudCwgU1RSRUFNLCBXUk9OR19UWVBFLCAoTlVMTCksCisgICAgICAgICgiRmlsZSBpcyBub3QgYW4gQVZJIGZpbGU6IDB4JSIgR19HSU5UMzJfTU9ESUZJRVIgIngiLCBkb2N0eXBlKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qCisgKiBSZWFkIEFWSSBmaWxlIHRhZyB3aGVuIHN0cmVhbWluZworICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5pdF9wdXNoIChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoYXZpLT5hZGFwdGVyKSA+PSAxMikgeworICAgIEdzdEJ1ZmZlciAqdG1wOworCisgICAgdG1wID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGF2aS0+YWRhcHRlciwgMTIpOworCisgICAgR1NUX0RFQlVHICgiUGFyc2luZyBhdmkgaGVhZGVyIik7CisgICAgaWYgKCFnc3RfYXZpX2RlbXV4X3BhcnNlX2ZpbGVfaGVhZGVyIChHU1RfRUxFTUVOVF9DQVNUIChhdmkpLCB0bXApKSB7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorICAgIEdTVF9ERUJVRyAoImhlYWRlciBvayIpOworICAgIGF2aS0+b2Zmc2V0ICs9IDEyOworCisgICAgYXZpLT5zdGF0ZSA9IEdTVF9BVklfREVNVVhfSEVBREVSOworICB9CisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworLyoKKyAqIFJlYWQgQVZJIGZpbGUgdGFnCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbml0X3B1bGwgKEdzdEF2aURlbXV4ICogYXZpKQoreworICBHc3RGbG93UmV0dXJuIHJlczsKKyAgR3N0QnVmZmVyICpidWYgPSBOVUxMOworCisgIHJlcyA9IGdzdF9wYWRfcHVsbF9yYW5nZSAoYXZpLT5zaW5rcGFkLCBhdmktPm9mZnNldCwgMTIsICZidWYpOworICBpZiAocmVzICE9IEdTVF9GTE9XX09LKQorICAgIHJldHVybiByZXM7CisgIGVsc2UgaWYgKCFnc3RfYXZpX2RlbXV4X3BhcnNlX2ZpbGVfaGVhZGVyIChHU1RfRUxFTUVOVF9DQVNUIChhdmkpLCBidWYpKQorICAgIGdvdG8gd3JvbmdfaGVhZGVyOworCisgIGF2aS0+b2Zmc2V0ICs9IDEyOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX2hlYWRlcjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgImVycm9yIHBhcnNpbmcgZmlsZSBoZWFkZXIiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworLyogQVZJIGhlYWRlciBoYW5kbGluZyAqLworLyoKKyAqIGdzdF9hdmlfZGVtdXhfcGFyc2VfYXZpaDoKKyAqIEBhdmk6IGNhbGxlciBlbGVtZW50ICh1c2VkIGZvciBlcnJvcnMvZGVidWcpLgorICogQGJ1ZjogaW5wdXQgZGF0YSB0byBiZSB1c2VkIGZvciBwYXJzaW5nLgorICogQGF2aWg6IHBvaW50ZXIgdG8gc3RydWN0dXJlIChmaWxsZWQgaW4gYnkgZnVuY3Rpb24pIGNvbnRhaW5pbmcKKyAqICAgICAgICBzdHJlYW0gaW5mb3JtYXRpb24gKHN1Y2ggYXMgZmxhZ3MsIG51bWJlciBvZiBzdHJlYW1zLCBldGMuKS4KKyAqCisgKiBSZWFkICdhdmloJyBoZWFkZXIuIERpc2NhcmRzIGJ1ZmZlciBhZnRlciB1c2UuCisgKgorICogUmV0dXJuczogVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvdGhlcndpc2UuIFRocm93cyBhbiBlcnJvciBpZgorICogICAgICAgICAgdGhlIGhlYWRlciBpcyBpbnZhbGlkLiBUaGUgY2FsbGVyIHNob3VsZCBlcnJvciBvdXQKKyAqICAgICAgICAgIChmYXRhbCkuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9kZW11eF9wYXJzZV9hdmloIChHc3RBdmlEZW11eCAqIGF2aSwKKyAgICBHc3RCdWZmZXIgKiBidWYsIGdzdF9yaWZmX2F2aWggKiogX2F2aWgpCit7CisgIGdzdF9yaWZmX2F2aWggKmF2aWg7CisgIGdzaXplIHNpemU7CisKKyAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgIGdvdG8gbm9fYnVmZmVyOworCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworICBpZiAoc2l6ZSA8IHNpemVvZiAoZ3N0X3JpZmZfYXZpaCkpCisgICAgZ290byBhdmloX3Rvb19zbWFsbDsKKworICBhdmloID0gZ19tYWxsb2MgKHNpemUpOworICBnc3RfYnVmZmVyX2V4dHJhY3QgKGJ1ZiwgMCwgYXZpaCwgc2l6ZSk7CisKKyNpZiAoR19CWVRFX09SREVSID09IEdfQklHX0VORElBTikKKyAgYXZpaC0+dXNfZnJhbWUgPSBHVUlOVDMyX0ZST01fTEUgKGF2aWgtPnVzX2ZyYW1lKTsKKyAgYXZpaC0+bWF4X2JwcyA9IEdVSU5UMzJfRlJPTV9MRSAoYXZpaC0+bWF4X2Jwcyk7CisgIGF2aWgtPnBhZF9ncmFuID0gR1VJTlQzMl9GUk9NX0xFIChhdmloLT5wYWRfZ3Jhbik7CisgIGF2aWgtPmZsYWdzID0gR1VJTlQzMl9GUk9NX0xFIChhdmloLT5mbGFncyk7CisgIGF2aWgtPnRvdF9mcmFtZXMgPSBHVUlOVDMyX0ZST01fTEUgKGF2aWgtPnRvdF9mcmFtZXMpOworICBhdmloLT5pbml0X2ZyYW1lcyA9IEdVSU5UMzJfRlJPTV9MRSAoYXZpaC0+aW5pdF9mcmFtZXMpOworICBhdmloLT5zdHJlYW1zID0gR1VJTlQzMl9GUk9NX0xFIChhdmloLT5zdHJlYW1zKTsKKyAgYXZpaC0+YnVmc2l6ZSA9IEdVSU5UMzJfRlJPTV9MRSAoYXZpaC0+YnVmc2l6ZSk7CisgIGF2aWgtPndpZHRoID0gR1VJTlQzMl9GUk9NX0xFIChhdmloLT53aWR0aCk7CisgIGF2aWgtPmhlaWdodCA9IEdVSU5UMzJfRlJPTV9MRSAoYXZpaC0+aGVpZ2h0KTsKKyAgYXZpaC0+c2NhbGUgPSBHVUlOVDMyX0ZST01fTEUgKGF2aWgtPnNjYWxlKTsKKyAgYXZpaC0+cmF0ZSA9IEdVSU5UMzJfRlJPTV9MRSAoYXZpaC0+cmF0ZSk7CisgIGF2aWgtPnN0YXJ0ID0gR1VJTlQzMl9GUk9NX0xFIChhdmloLT5zdGFydCk7CisgIGF2aWgtPmxlbmd0aCA9IEdVSU5UMzJfRlJPTV9MRSAoYXZpaC0+bGVuZ3RoKTsKKyNlbmRpZgorCisgIC8qIGRlYnVnIHN0dWZmICovCisgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAiYXZpaCB0YWcgZm91bmQ6Iik7CisgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAiIHVzX2ZyYW1lICAgICV1IiwgYXZpaC0+dXNfZnJhbWUpOworICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgIiBtYXhfYnBzICAgICAldSIsIGF2aWgtPm1heF9icHMpOworICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgIiBwYWRfZ3JhbiAgICAldSIsIGF2aWgtPnBhZF9ncmFuKTsKKyAgR1NUX0lORk9fT0JKRUNUIChhdmksICIgZmxhZ3MgICAgICAgMHglMDh4IiwgYXZpaC0+ZmxhZ3MpOworICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgIiB0b3RfZnJhbWVzICAldSIsIGF2aWgtPnRvdF9mcmFtZXMpOworICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgIiBpbml0X2ZyYW1lcyAldSIsIGF2aWgtPmluaXRfZnJhbWVzKTsKKyAgR1NUX0lORk9fT0JKRUNUIChhdmksICIgc3RyZWFtcyAgICAgJXUiLCBhdmloLT5zdHJlYW1zKTsKKyAgR1NUX0lORk9fT0JKRUNUIChhdmksICIgYnVmc2l6ZSAgICAgJXUiLCBhdmloLT5idWZzaXplKTsKKyAgR1NUX0lORk9fT0JKRUNUIChhdmksICIgd2lkdGggICAgICAgJXUiLCBhdmloLT53aWR0aCk7CisgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAiIGhlaWdodCAgICAgICV1IiwgYXZpaC0+aGVpZ2h0KTsKKyAgR1NUX0lORk9fT0JKRUNUIChhdmksICIgc2NhbGUgICAgICAgJXUiLCBhdmloLT5zY2FsZSk7CisgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAiIHJhdGUgICAgICAgICV1IiwgYXZpaC0+cmF0ZSk7CisgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAiIHN0YXJ0ICAgICAgICV1IiwgYXZpaC0+c3RhcnQpOworICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgIiBsZW5ndGggICAgICAldSIsIGF2aWgtPmxlbmd0aCk7CisKKyAgKl9hdmloID0gYXZpaDsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICBpZiAoYXZpaC0+dXNfZnJhbWUgIT0gMCAmJiBhdmloLT50b3RfZnJhbWVzICE9IDApCisgICAgYXZpLT5kdXJhdGlvbiA9CisgICAgICAgIChndWludDY0KSBhdmloLT51c19mcmFtZSAqIChndWludDY0KSBhdmloLT50b3RfZnJhbWVzICogMTAwMDsKKyAgZWxzZQorICAgIGF2aS0+ZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAiIGhlYWRlciBkdXJhdGlvbiAgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoYXZpLT5kdXJhdGlvbikpOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworbm9fYnVmZmVyOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLCAoIk5vIGJ1ZmZlciIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2F2aWhfdG9vX3NtYWxsOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAoIlRvbyBzbWFsbCBhdmloICglIiBHX0dTSVpFX0ZPUk1BVCAiIGF2YWlsYWJsZSwgJWQgbmVlZGVkKSIsCisgICAgICAgICAgICBzaXplLCAoaW50KSBzaXplb2YgKGdzdF9yaWZmX2F2aWgpKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyoKKyAqIGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3VwZXJpbmRleDoKKyAqIEBhdmk6IGNhbGxlciBlbGVtZW50ICh1c2VkIGZvciBkZWJ1Z2dpbmcvZXJyb3JzKS4KKyAqIEBidWY6IGlucHV0IGRhdGEgdG8gdXNlIGZvciBwYXJzaW5nLgorICogQGxvY2F0aW9uczogbG9jYXRpb25zIGluIHRoZSBmaWxlIChieXRlLW9mZnNldHMpIHRoYXQgY29udGFpbgorICogICAgICAgICAgICAgdGhlIGFjdHVhbCBpbmRleGVzIChzZWUgZ2V0X2F2aV9kZW11eF9wYXJzZV9zdWJpbmRleCgpKS4KKyAqICAgICAgICAgICAgIFRoZSBhcnJheSBlbmRzIHdpdGggR1NUX0JVRkZFUl9PRkZTRVRfTk9ORS4KKyAqCisgKiBSZWFkcyBzdXBlcmluZGV4IChvcGVuRE1MLTIgc3BlYyBzdHVmZikgZnJvbSB0aGUgcHJvdmlkZWQgZGF0YS4KKyAqCisgKiBSZXR1cm5zOiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG90aGVyd2lzZS4gSW5kZXhlcyBzaG91bGQgYmUgc2tpcHBlZAorICogICAgICAgICAgb24gZXJyb3IsIGJ1dCB0aGV5IGFyZSBub3QgZmF0YWwuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9kZW11eF9wYXJzZV9zdXBlcmluZGV4IChHc3RBdmlEZW11eCAqIGF2aSwKKyAgICBHc3RCdWZmZXIgKiBidWYsIGd1aW50NjQgKiogX2luZGV4ZXMpCit7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmRhdGE7CisgIGd1aW50MTYgYnBlID0gMTY7CisgIGd1aW50MzIgbnVtLCBpOworICBndWludDY0ICppbmRleGVzOworICBnc2l6ZSBzaXplOworCisgICpfaW5kZXhlcyA9IE5VTEw7CisKKyAgaWYgKGJ1ZikgeworICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgZGF0YSA9IG1hcC5kYXRhOworICAgIHNpemUgPSBtYXAuc2l6ZTsKKyAgfSBlbHNlIHsKKyAgICBkYXRhID0gTlVMTDsKKyAgICBzaXplID0gMDsKKyAgfQorCisgIGlmIChzaXplIDwgMjQpCisgICAgZ290byB0b29fc21hbGw7CisKKyAgLyogY2hlY2sgdHlwZSBvZiBpbmRleC4gVGhlIG9wZW5kbWwyIHNwZWNzIHN0YXRlIHRoYXQKKyAgICogdGhlcmUgc2hvdWxkIGJlIDQgZHdvcmRzIHBlciBhcnJheSBlbnRyeS4gVHlwZSBjYW4gYmUKKyAgICogZWl0aGVyIGZyYW1lIG9yIGZpZWxkIChhbmQgd2UgZG9uJ3QgY2FyZSkuICovCisgIGlmIChHU1RfUkVBRF9VSU5UMTZfTEUgKGRhdGEpICE9IDQgfHwKKyAgICAgIChkYXRhWzJdICYgMHhmZSkgIT0gMHgwIHx8IGRhdGFbM10gIT0gMHgwKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksCisgICAgICAgICJTdXBlcmluZGV4IGZvciBzdHJlYW0gaGFzIHVuZXhwZWN0ZWQgIgorICAgICAgICAic2l6ZV9lbnRyeSAlZCAoYnl0ZXMpIG9yIGZsYWdzIDB4JTAyeC8weCUwMngiLAorICAgICAgICBHU1RfUkVBRF9VSU5UMTZfTEUgKGRhdGEpLCBkYXRhWzJdLCBkYXRhWzNdKTsKKyAgICBicGUgPSBHU1RfUkVBRF9VSU5UMTZfTEUgKGRhdGEpICogNDsKKyAgfQorICBudW0gPSBHU1RfUkVBRF9VSU5UMzJfTEUgKCZkYXRhWzRdKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJnb3QgJWQgaW5kZXhlcyIsIG51bSk7CisKKyAgLyogdGhpcyBjYW4ndCB3b3JrIG91dCB3ZWxsIC4uLiAqLworICBpZiAobnVtID4gR19NQVhVSU5UMzIgPj4gMSB8fCBicGUgPCA4KSB7CisgICAgZ290byBpbnZhbGlkX3BhcmFtczsKKyAgfQorCisgIGluZGV4ZXMgPSBnX25ldyAoZ3VpbnQ2NCwgbnVtICsgMSk7CisgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgIGlmIChzaXplIDwgMjQgKyBicGUgKiAoaSArIDEpKQorICAgICAgYnJlYWs7CisgICAgaW5kZXhlc1tpXSA9IEdTVF9SRUFEX1VJTlQ2NF9MRSAoJmRhdGFbMjQgKyBicGUgKiBpXSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiaW5kZXggJWQgYXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwgaSwgaW5kZXhlc1tpXSk7CisgIH0KKyAgaW5kZXhlc1tpXSA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisgICpfaW5kZXhlcyA9IGluZGV4ZXM7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGF2aSwKKyAgICAgICAgIk5vdCBlbm91Z2ggZGF0YSB0byBwYXJzZSBzdXBlcmluZGV4ICglIiBHX0dTSVpFX0ZPUk1BVAorICAgICAgICAiIGF2YWlsYWJsZSwgMjQgbmVlZGVkKSIsIHNpemUpOworICAgIGlmIChidWYpIHsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfcGFyYW1zOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoYXZpLCAiaW52YWxpZCBpbmRleCBwYXJhbWV0ZXJzIChudW0gPSAlZCwgYnBlID0gJWQpIiwKKyAgICAgICAgbnVtLCBicGUpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogYWRkIGFuIGVudHJ5IHRvIHRoZSBpbmRleCBvZiBhIHN0cmVhbS4gQG51bSBzaG91bGQgYmUgYW4gZXN0aW1hdGUgb2YgdGhlCisgKiB0b3RhbCBhbW91bnQgb2YgaW5kZXggZW50cmllcyBmb3IgYWxsIHN0cmVhbXMgYW5kIGlzIHVzZWQgdG8gZHluYW1pY2FsbHkKKyAqIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGluZGV4IGVudHJpZXMuICovCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitnc3RfYXZpX2RlbXV4X2FkZF9pbmRleCAoR3N0QXZpRGVtdXggKiBhdmksIEdzdEF2aVN0cmVhbSAqIHN0cmVhbSwKKyAgICBndWludCBudW0sIEdzdEF2aUluZGV4RW50cnkgKiBlbnRyeSkKK3sKKyAgLyogZW5zdXJlIGluZGV4IG1lbW9yeSAqLworICBpZiAoR19VTkxJS0VMWSAoc3RyZWFtLT5pZHhfbiA+PSBzdHJlYW0tPmlkeF9tYXgpKSB7CisgICAgZ3VpbnQgaWR4X21heCA9IHN0cmVhbS0+aWR4X21heDsKKyAgICBHc3RBdmlJbmRleEVudHJ5ICpuZXdfaWR4OworCisgICAgLyogd2UgbmVlZCB0byBtYWtlIHNvbWUgbW9yZSByb29tICovCisgICAgaWYgKGlkeF9tYXggPT0gMCkgeworICAgICAgLyogaW5pdGlhbCBzaXplIGd1ZXNzLCBhc3N1bWUgZWFjaCBzdHJlYW0gaGFzIGFuIGVxdWFsIGFtb3VudCBvZiBlbnRyaWVzLAorICAgICAgICogb3ZlcnNob290IHdpdGggYXQgbGVhc3QgOEsgKi8KKyAgICAgIGlkeF9tYXggPSAobnVtIC8gYXZpLT5udW1fc3RyZWFtcykgKyAoODE5MiAvIHNpemVvZiAoR3N0QXZpSW5kZXhFbnRyeSkpOworICAgIH0gZWxzZSB7CisgICAgICBpZHhfbWF4ICs9IDgxOTIgLyBzaXplb2YgKEdzdEF2aUluZGV4RW50cnkpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiZXhwYW5kZWQgaW5kZXggZnJvbSAldSB0byAldSIsCisgICAgICAgICAgc3RyZWFtLT5pZHhfbWF4LCBpZHhfbWF4KTsKKyAgICB9CisgICAgbmV3X2lkeCA9IGdfdHJ5X3JlbmV3IChHc3RBdmlJbmRleEVudHJ5LCBzdHJlYW0tPmluZGV4LCBpZHhfbWF4KTsKKyAgICAvKiBvdXQgb2YgbWVtb3J5LCBpZiB0aGlzIGZhaWxzIHN0cmVhbS0+aW5kZXggaXMgdW50b3VjaGVkLiAqLworICAgIGlmIChHX1VOTElLRUxZICghbmV3X2lkeCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgLyogdXNlIG5ldyBpbmRleCAqLworICAgIHN0cmVhbS0+aW5kZXggPSBuZXdfaWR4OworICAgIHN0cmVhbS0+aWR4X21heCA9IGlkeF9tYXg7CisgIH0KKworICAvKiB1cGRhdGUgZW50cnkgdG90YWwgYW5kIHN0cmVhbSBzdGF0cy4gVGhlIGVudHJ5IHRvdGFsIGNhbiBiZSBjb252ZXJ0ZWQgdG8KKyAgICogdGhlIHRpbWVzdGFtcCBvZiB0aGUgZW50cnkgZWFzaWx5LiAqLworICBpZiAoc3RyZWFtLT5zdHJoLT50eXBlID09IEdTVF9SSUZGX0ZDQ19hdWRzKSB7CisgICAgZ2ludCBibG9ja2FsaWduOworCisgICAgaWYgKHN0cmVhbS0+aXNfdmJyKSB7CisgICAgICBlbnRyeS0+dG90YWwgPSBzdHJlYW0tPnRvdGFsX2Jsb2NrczsKKyAgICB9IGVsc2UgeworICAgICAgZW50cnktPnRvdGFsID0gc3RyZWFtLT50b3RhbF9ieXRlczsKKyAgICB9CisgICAgYmxvY2thbGlnbiA9IHN0cmVhbS0+c3RyZi5hdWRzLT5ibG9ja2FsaWduOworICAgIGlmIChibG9ja2FsaWduID4gMCkKKyAgICAgIHN0cmVhbS0+dG90YWxfYmxvY2tzICs9IERJVl9ST1VORF9VUCAoZW50cnktPnNpemUsIGJsb2NrYWxpZ24pOworICAgIGVsc2UKKyAgICAgIHN0cmVhbS0+dG90YWxfYmxvY2tzKys7CisgIH0gZWxzZSB7CisgICAgaWYgKHN0cmVhbS0+aXNfdmJyKSB7CisgICAgICBlbnRyeS0+dG90YWwgPSBzdHJlYW0tPmlkeF9uOworICAgIH0gZWxzZSB7CisgICAgICBlbnRyeS0+dG90YWwgPSBzdHJlYW0tPnRvdGFsX2J5dGVzOworICAgIH0KKyAgfQorICBzdHJlYW0tPnRvdGFsX2J5dGVzICs9IGVudHJ5LT5zaXplOworICBpZiAoRU5UUllfSVNfS0VZRlJBTUUgKGVudHJ5KSkKKyAgICBzdHJlYW0tPm5fa2V5ZnJhbWVzKys7CisKKyAgLyogYW5kIGFkZCAqLworICBHU1RfTE9HX09CSkVDVCAoYXZpLAorICAgICAgIkFkZGluZyBzdHJlYW0gJXUsIGluZGV4IGVudHJ5ICVkLCBrZiAlZCwgc2l6ZSAldSAiCisgICAgICAiLCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCB0b3RhbCAlIiBHX0dVSU5UNjRfRk9STUFULCBzdHJlYW0tPm51bSwKKyAgICAgIHN0cmVhbS0+aWR4X24sIEVOVFJZX0lTX0tFWUZSQU1FIChlbnRyeSksIGVudHJ5LT5zaXplLCBlbnRyeS0+b2Zmc2V0LAorICAgICAgZW50cnktPnRvdGFsKTsKKyAgc3RyZWFtLT5pbmRleFtzdHJlYW0tPmlkeF9uKytdID0gKmVudHJ5OworCisgIHJldHVybiBUUlVFOworfQorCisvKiBnaXZlbiBAZW50cnlfbiBpbiBAc3RyZWFtLCBjYWxjdWxhdGUgaW5mbyBzdWNoIGFzIHRpbWVzdGFtcHMgYW5kCisgKiBvZmZzZXRzIGZvciB0aGUgZW50cnkuICovCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9nZXRfYnVmZmVyX2luZm8gKEdzdEF2aURlbXV4ICogYXZpLCBHc3RBdmlTdHJlYW0gKiBzdHJlYW0sCisgICAgZ3VpbnQgZW50cnlfbiwgR3N0Q2xvY2tUaW1lICogdGltZXN0YW1wLCBHc3RDbG9ja1RpbWUgKiB0c19lbmQsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCwgZ3VpbnQ2NCAqIG9mZnNldF9lbmQpCit7CisgIEdzdEF2aUluZGV4RW50cnkgKmVudHJ5OworCisgIGVudHJ5ID0gJnN0cmVhbS0+aW5kZXhbZW50cnlfbl07CisKKyAgaWYgKHN0cmVhbS0+aXNfdmJyKSB7CisgICAgLyogVkJSIHN0cmVhbSBuZXh0IHRpbWVzdGFtcCAqLworICAgIGlmIChzdHJlYW0tPnN0cmgtPnR5cGUgPT0gR1NUX1JJRkZfRkNDX2F1ZHMpIHsKKyAgICAgIGlmICh0aW1lc3RhbXApCisgICAgICAgICp0aW1lc3RhbXAgPQorICAgICAgICAgICAgYXZpX3N0cmVhbV9jb252ZXJ0X2ZyYW1lc190b190aW1lX3VuY2hlY2tlZCAoc3RyZWFtLCBlbnRyeS0+dG90YWwpOworICAgICAgaWYgKHRzX2VuZCkgeworICAgICAgICBnaW50IHNpemUgPSAxOworICAgICAgICBpZiAoR19MSUtFTFkgKGVudHJ5X24gKyAxIDwgc3RyZWFtLT5pZHhfbikpCisgICAgICAgICAgc2l6ZSA9IHN0cmVhbS0+aW5kZXhbZW50cnlfbiArIDFdLnRvdGFsIC0gZW50cnktPnRvdGFsOworICAgICAgICAqdHNfZW5kID0gYXZpX3N0cmVhbV9jb252ZXJ0X2ZyYW1lc190b190aW1lX3VuY2hlY2tlZCAoc3RyZWFtLAorICAgICAgICAgICAgZW50cnktPnRvdGFsICsgc2l6ZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICh0aW1lc3RhbXApCisgICAgICAgICp0aW1lc3RhbXAgPQorICAgICAgICAgICAgYXZpX3N0cmVhbV9jb252ZXJ0X2ZyYW1lc190b190aW1lX3VuY2hlY2tlZCAoc3RyZWFtLCBlbnRyeV9uKTsKKyAgICAgIGlmICh0c19lbmQpCisgICAgICAgICp0c19lbmQgPSBhdmlfc3RyZWFtX2NvbnZlcnRfZnJhbWVzX3RvX3RpbWVfdW5jaGVja2VkIChzdHJlYW0sCisgICAgICAgICAgICBlbnRyeV9uICsgMSk7CisgICAgfQorICB9IGVsc2UgaWYgKHN0cmVhbS0+c3RyaC0+dHlwZSA9PSBHU1RfUklGRl9GQ0NfYXVkcykgeworICAgIC8qIGNvbnN0YW50IHJhdGUgc3RyZWFtICovCisgICAgaWYgKHRpbWVzdGFtcCkKKyAgICAgICp0aW1lc3RhbXAgPQorICAgICAgICAgIGF2aV9zdHJlYW1fY29udmVydF9ieXRlc190b190aW1lX3VuY2hlY2tlZCAoc3RyZWFtLCBlbnRyeS0+dG90YWwpOworICAgIGlmICh0c19lbmQpCisgICAgICAqdHNfZW5kID0gYXZpX3N0cmVhbV9jb252ZXJ0X2J5dGVzX3RvX3RpbWVfdW5jaGVja2VkIChzdHJlYW0sCisgICAgICAgICAgZW50cnktPnRvdGFsICsgZW50cnktPnNpemUpOworICB9CisgIGlmIChzdHJlYW0tPnN0cmgtPnR5cGUgPT0gR1NUX1JJRkZfRkNDX3ZpZHMpIHsKKyAgICAvKiB2aWRlbyBvZmZzZXRzIGFyZSB0aGUgZnJhbWUgbnVtYmVyICovCisgICAgaWYgKG9mZnNldCkKKyAgICAgICpvZmZzZXQgPSBlbnRyeV9uOworICAgIGlmIChvZmZzZXRfZW5kKQorICAgICAgKm9mZnNldF9lbmQgPSBlbnRyeV9uICsgMTsKKyAgfSBlbHNlIHsKKyAgICAvKiBubyBvZmZzZXRzIGZvciBhdWRpbyAqLworICAgIGlmIChvZmZzZXQpCisgICAgICAqb2Zmc2V0ID0gLTE7CisgICAgaWYgKG9mZnNldF9lbmQpCisgICAgICAqb2Zmc2V0X2VuZCA9IC0xOworICB9Cit9CisKKy8qIGNvbGxlY3QgYW5kIGRlYnVnIHN0YXRzIGFib3V0IHRoZSBpbmRleGVzIGZvciBhbGwgc3RyZWFtcy4KKyAqIFRoaXMgbWV0aG9kIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGZpbGxpbmcgaW4gdGhlIHN0cmVhbSBkdXJhdGlvbgorICogYXMgbWVhc3VyZWQgYnkgdGhlIGFtb3VudCBvZiBpbmRleCBlbnRyaWVzLgorICoKKyAqIFJldHVybnMgVFJVRSBpZiB0aGUgaW5kZXggaXMgbm90IGVtcHR5LCBlbHNlIEZBTFNFICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdmlfZGVtdXhfZG9faW5kZXhfc3RhdHMgKEdzdEF2aURlbXV4ICogYXZpKQoreworICBndWludCB0b3RhbF9pZHggPSAwOworICBndWludCBpOworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgZ3VpbnQgdG90YWxfbWF4ID0gMDsKKyNlbmRpZgorCisgIC8qIGdldCBzdHJlYW0gc3RhdHMgbm93ICovCisgIGZvciAoaSA9IDA7IGkgPCBhdmktPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICBHc3RBdmlTdHJlYW0gKnN0cmVhbTsKKworICAgIGlmIChHX1VOTElLRUxZICghKHN0cmVhbSA9ICZhdmktPnN0cmVhbVtpXSkpKQorICAgICAgY29udGludWU7CisgICAgaWYgKEdfVU5MSUtFTFkgKCFzdHJlYW0tPnN0cmgpKQorICAgICAgY29udGludWU7CisgICAgaWYgKEdfVU5MSUtFTFkgKCFzdHJlYW0tPmluZGV4IHx8IHN0cmVhbS0+aWR4X24gPT0gMCkpCisgICAgICBjb250aW51ZTsKKworICAgIC8qIHdlIGludGVyZXN0ZWQgaW4gdGhlIGVuZF90cyBvZiB0aGUgbGFzdCBlbnRyeSwgd2hpY2ggaXMgdGhlIHRvdGFsCisgICAgICogZHVyYXRpb24gb2YgdGhpcyBzdHJlYW0gKi8KKyAgICBnc3RfYXZpX2RlbXV4X2dldF9idWZmZXJfaW5mbyAoYXZpLCBzdHJlYW0sIHN0cmVhbS0+aWR4X24gLSAxLAorICAgICAgICBOVUxMLCAmc3RyZWFtLT5pZHhfZHVyYXRpb24sIE5VTEwsIE5VTEwpOworCisgICAgdG90YWxfaWR4ICs9IHN0cmVhbS0+aWR4X247CisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworICAgIHRvdGFsX21heCArPSBzdHJlYW0tPmlkeF9tYXg7CisjZW5kaWYKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgIlN0cmVhbSAlZCwgZHVyICUiIEdTVF9USU1FX0ZPUk1BVCAiLCAlNnUgZW50cmllcywgIgorICAgICAgICAiJTV1IGtleWZyYW1lcywgZW50cnkgc2l6ZSA9ICUydSwgdG90YWwgc2l6ZSA9ICUxMHUsIGFsbG9jYXRlZCAlMTB1IiwKKyAgICAgICAgaSwgR1NUX1RJTUVfQVJHUyAoc3RyZWFtLT5pZHhfZHVyYXRpb24pLCBzdHJlYW0tPmlkeF9uLAorICAgICAgICBzdHJlYW0tPm5fa2V5ZnJhbWVzLCAoZ3VpbnQpIHNpemVvZiAoR3N0QXZpSW5kZXhFbnRyeSksCisgICAgICAgIChndWludCkgKHN0cmVhbS0+aWR4X24gKiBzaXplb2YgKEdzdEF2aUluZGV4RW50cnkpKSwKKyAgICAgICAgKGd1aW50KSAoc3RyZWFtLT5pZHhfbWF4ICogc2l6ZW9mIChHc3RBdmlJbmRleEVudHJ5KSkpOworCisgICAgLyoga25vd2luZyBhbGwgdGhhdCB3ZSBkbywgdGhhdCBhbHNvIGluY2x1ZGVzIGF2ZyBiaXRyYXRlICovCisgICAgaWYgKCFzdHJlYW0tPnRhZ2xpc3QpIHsKKyAgICAgIHN0cmVhbS0+dGFnbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgICAgfQorICAgIGlmIChzdHJlYW0tPnRvdGFsX2J5dGVzICYmIHN0cmVhbS0+aWR4X2R1cmF0aW9uKQorICAgICAgZ3N0X3RhZ19saXN0X2FkZCAoc3RyZWFtLT50YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgR1NUX1RBR19CSVRSQVRFLAorICAgICAgICAgIChndWludCkgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzdHJlYW0tPnRvdGFsX2J5dGVzICogOCwKKyAgICAgICAgICAgICAgR1NUX1NFQ09ORCwgc3RyZWFtLT5pZHhfZHVyYXRpb24pLCBOVUxMKTsKKyAgfQorICB0b3RhbF9pZHggKj0gc2l6ZW9mIChHc3RBdmlJbmRleEVudHJ5KTsKKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgIHRvdGFsX21heCAqPSBzaXplb2YgKEdzdEF2aUluZGV4RW50cnkpOworI2VuZGlmCisgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAiJXUgYnl0ZXMgZm9yIGluZGV4IHZzICV1IGlkZWFsbHksICV1IHdhc3RlZCIsCisgICAgICB0b3RhbF9tYXgsIHRvdGFsX2lkeCwgdG90YWxfbWF4IC0gdG90YWxfaWR4KTsKKworICBpZiAodG90YWxfaWR4ID09IDApIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwgIkluZGV4IGlzIGVtcHR5ICEiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBnc3RfYXZpX2RlbXV4X3BhcnNlX3N1YmluZGV4OgorICogQGF2aTogQXZpIG9iamVjdAorICogQGJ1ZjogaW5wdXQgZGF0YSB0byB1c2UgZm9yIHBhcnNpbmcuCisgKiBAc3RyZWFtOiBzdHJlYW0gY29udGV4dC4KKyAqIEBlbnRyaWVzX2xpc3Q6IGEgbGlzdCAocmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uKSBjb250YWluaW5nIGFsbCB0aGUKKyAqICAgICAgICAgICBpbmRleGVzIHBhcnNlZCBpbiB0aGlzIHNwZWNpZmljIHN1YmluZGV4LiBUaGUgZmlyc3QKKyAqICAgICAgICAgICBlbnRyeSBpcyBhbHNvIGEgcG9pbnRlciB0byBhbGxvY2F0ZWQgbWVtb3J5IHRoYXQgbmVlZHMKKyAqICAgICAgICAgICB0byBiZSBmcmVlwrRlZC4gTWF5IGJlIE5VTEwgaWYgbm8gc3VwcG9ydGVkIGluZGV4ZXMgd2VyZQorICogICAgICAgICAgIGZvdW5kLgorICoKKyAqIFJlYWRzIHN1cGVyaW5kZXggKG9wZW5ETUwtMiBzcGVjIHN0dWZmKSBmcm9tIHRoZSBwcm92aWRlZCBkYXRhLgorICogVGhlIGJ1ZmZlciBzaG91bGQgY29udGFpbiBhIEdTVF9SSUZGX1RBR19peD8/IGNodW5rLgorICoKKyAqIFJldHVybnM6IFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb3RoZXJ3aXNlLiBFcnJvcnMgYXJlIGZhdGFsLCB3ZQorICogICAgICAgICAgdGhyb3cgYW4gZXJyb3IsIGNhbGxlciBzaG91bGQgYmFpbCBvdXQgYXNhcC4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYXZpX2RlbXV4X3BhcnNlX3N1YmluZGV4IChHc3RBdmlEZW11eCAqIGF2aSwgR3N0QXZpU3RyZWFtICogc3RyZWFtLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQxNiBicGU7CisgIGd1aW50MzIgbnVtLCBpOworICBndWludDY0IGJhc2VvZmY7CisKKyAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKworICAvKiBjaGVjayBzaXplICovCisgIGlmIChtYXAuc2l6ZSA8IDI0KQorICAgIGdvdG8gdG9vX3NtYWxsOworCisgIC8qIFdlIGRvbid0IHN1cHBvcnQgaW5kZXgtZGF0YSB5ZXQgKi8KKyAgaWYgKGRhdGFbM10gJiAweDgwKQorICAgIGdvdG8gbm90X2ltcGxlbWVudGVkOworCisgIC8qIGNoZWNrIHR5cGUgb2YgaW5kZXguIFRoZSBvcGVuZG1sMiBzcGVjcyBzdGF0ZSB0aGF0CisgICAqIHRoZXJlIHNob3VsZCBiZSA0IGR3b3JkcyBwZXIgYXJyYXkgZW50cnkuIFR5cGUgY2FuIGJlCisgICAqIGVpdGhlciBmcmFtZSBvciBmaWVsZCAoYW5kIHdlIGRvbid0IGNhcmUpLiAqLworICBicGUgPSAoZGF0YVsyXSAmIDB4MDEpID8gMTIgOiA4OworICBpZiAoR1NUX1JFQURfVUlOVDE2X0xFIChkYXRhKSAhPSBicGUgLyA0IHx8CisgICAgICAoZGF0YVsyXSAmIDB4ZmUpICE9IDB4MCB8fCBkYXRhWzNdICE9IDB4MSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLAorICAgICAgICAiU3VwZXJpbmRleCBmb3Igc3RyZWFtICVkIGhhcyB1bmV4cGVjdGVkICIKKyAgICAgICAgInNpemVfZW50cnkgJWQgKGJ5dGVzKSBvciBmbGFncyAweCUwMngvMHglMDJ4IiwKKyAgICAgICAgc3RyZWFtLT5udW0sIEdTVF9SRUFEX1VJTlQxNl9MRSAoZGF0YSksIGRhdGFbMl0sIGRhdGFbM10pOworICAgIGJwZSA9IEdTVF9SRUFEX1VJTlQxNl9MRSAoZGF0YSkgKiA0OworICB9CisgIG51bSA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoJmRhdGFbNF0pOworICBiYXNlb2ZmID0gR1NUX1JFQURfVUlOVDY0X0xFICgmZGF0YVsxMl0pOworCisgIC8qIElmIHRoZXJlJ3Mgbm90aGluZywganVzdCByZXR1cm4gISAqLworICBpZiAobnVtID09IDApCisgICAgZ290byBlbXB0eV9pbmRleDsKKworICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgIlBhcnNpbmcgc3ViaW5kZXgsIG5yX2VudHJpZXMgPSAlNmQiLCBudW0pOworCisgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgIEdzdEF2aUluZGV4RW50cnkgZW50cnk7CisKKyAgICBpZiAobWFwLnNpemUgPCAyNCArIGJwZSAqIChpICsgMSkpCisgICAgICBicmVhazsKKworICAgIC8qIGZpbGwgaW4gb2Zmc2V0IGFuZCBzaXplLiBvZmZzZXQgY29udGFpbnMgdGhlIGtleWZyYW1lIGZsYWcgaW4gdGhlCisgICAgICogdXBwZXIgYml0Ki8KKyAgICBlbnRyeS5vZmZzZXQgPSBiYXNlb2ZmICsgR1NUX1JFQURfVUlOVDMyX0xFICgmZGF0YVsyNCArIGJwZSAqIGldKTsKKyAgICBlbnRyeS5zaXplID0gR1NUX1JFQURfVUlOVDMyX0xFICgmZGF0YVsyNCArIGJwZSAqIGkgKyA0XSk7CisgICAgLyogaGFuZGxlIGZsYWdzICovCisgICAgaWYgKHN0cmVhbS0+c3RyaC0+dHlwZSA9PSBHU1RfUklGRl9GQ0NfYXVkcykgeworICAgICAgLyogYWxsIGF1ZGlvIGZyYW1lcyBhcmUga2V5ZnJhbWVzICovCisgICAgICBFTlRSWV9TRVRfS0VZRlJBTUUgKCZlbnRyeSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGVsc2UgcmVhZCBmbGFncyAqLworICAgICAgZW50cnkuZmxhZ3MgPSAoZW50cnkuc2l6ZSAmIDB4ODAwMDAwMDApID8gMCA6IEdTVF9BVklfS0VZRlJBTUU7CisgICAgfQorICAgIGVudHJ5LnNpemUgJj0gfjB4ODAwMDAwMDA7CisKKyAgICAvKiBhbmQgYWRkICovCisgICAgaWYgKEdfVU5MSUtFTFkgKCFnc3RfYXZpX2RlbXV4X2FkZF9pbmRleCAoYXZpLCBzdHJlYW0sIG51bSwgJmVudHJ5KSkpCisgICAgICBnb3RvIG91dF9vZl9tZW07CisgIH0KK2RvbmU6CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCit0b29fc21hbGw6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChhdmksCisgICAgICAgICJOb3QgZW5vdWdoIGRhdGEgdG8gcGFyc2Ugc3ViaW5kZXggKCUiIEdfR1NJWkVfRk9STUFUCisgICAgICAgICIgYXZhaWxhYmxlLCAyNCBuZWVkZWQpIiwgbWFwLnNpemUpOworICAgIGdvdG8gZG9uZTsgICAgICAgICAgICAgICAgICAvKiBjb250aW51ZSAqLworICB9Citub3RfaW1wbGVtZW50ZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXZpLCBTVFJFQU0sIE5PVF9JTVBMRU1FTlRFRCwgKE5VTEwpLAorICAgICAgICAoIlN1YmluZGV4LWlzLWRhdGEgaXMgbm90IGltcGxlbWVudGVkIikpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2VtcHR5X2luZGV4OgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAidGhlIGluZGV4IGlzIGVtcHR5Iik7CisgICAgZ290byBkb25lOyAgICAgICAgICAgICAgICAgIC8qIGNvbnRpbnVlICovCisgIH0KK291dF9vZl9tZW06CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXZpLCBSRVNPVVJDRSwgTk9fU1BBQ0VfTEVGVCwgKE5VTEwpLAorICAgICAgICAoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yICV1KiV1PSV1IGJ5dGVzIiwKKyAgICAgICAgICAgIChndWludCkgc2l6ZW9mIChHc3RBdmlJbmRleEVudHJ5KSwgbnVtLAorICAgICAgICAgICAgKGd1aW50KSBzaXplb2YgKEdzdEF2aUluZGV4RW50cnkpICogbnVtKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKgorICogQ3JlYXRlIGFuZCBwdXNoIGEgZmx1c2hpbmcgc2VlayBldmVudCB1cHN0cmVhbQorICovCitzdGF0aWMgZ2Jvb2xlYW4KK3BlcmZvcm1fc2Vla190b19vZmZzZXQgKEdzdEF2aURlbXV4ICogZGVtdXgsIGd1aW50NjQgb2Zmc2V0LCBndWludDMyIHNlcW51bSkKK3sKKyAgR3N0RXZlbnQgKmV2ZW50OworICBnYm9vbGVhbiByZXMgPSAwOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiU2Vla2luZyB0byAlIiBHX0dVSU5UNjRfRk9STUFULCBvZmZzZXQpOworCisgIGV2ZW50ID0KKyAgICAgIGdzdF9ldmVudF9uZXdfc2VlayAoMS4wLCBHU1RfRk9STUFUX0JZVEVTLAorICAgICAgR1NUX1NFRUtfRkxBR19GTFVTSCB8IEdTVF9TRUVLX0ZMQUdfQUNDVVJBVEUsIEdTVF9TRUVLX1RZUEVfU0VULCBvZmZzZXQsCisgICAgICBHU1RfU0VFS19UWVBFX05PTkUsIC0xKTsKKyAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGV2ZW50LCBzZXFudW0pOworICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKGRlbXV4LT5zaW5rcGFkLCBldmVudCk7CisKKyAgaWYgKHJlcykKKyAgICBkZW11eC0+b2Zmc2V0ID0gb2Zmc2V0OworICByZXR1cm4gcmVzOworfQorCisvKgorICogUmVhZCBBVkkgaW5kZXggd2hlbiBzdHJlYW1pbmcKKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYXZpX2RlbXV4X3JlYWRfc3ViaW5kZXhlc19wdXNoIChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgZ3VpbnQzMiB0YWcgPSAwLCBzaXplOworICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisgIGd1aW50IG9kbWxfc3RyZWFtOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInJlYWQgc3ViaW5kZXhlcyBmb3IgJWQgc3RyZWFtcyIsIGF2aS0+bnVtX3N0cmVhbXMpOworCisgIGlmIChhdmktPm9kbWxfc3ViaWR4c1thdmktPm9kbWxfc3ViaWR4XSAhPSBhdmktPm9mZnNldCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfYXZpX2RlbXV4X3BlZWtfY2h1bmsgKGF2aSwgJnRhZywgJnNpemUpKQorICAgIHJldHVybiBUUlVFOworCisgIC8qIHRoaXMgaXMgdGhlIE9ETUwgY2h1bmsgd2UgZXhwZWN0ICovCisgIG9kbWxfc3RyZWFtID0gYXZpLT5vZG1sX3N0cmVhbTsKKworICBpZiAoKHRhZyAhPSBHU1RfTUFLRV9GT1VSQ0MgKCdpJywgJ3gnLCAnMCcgKyBvZG1sX3N0cmVhbSAvIDEwLAorICAgICAgICAgICAgICAnMCcgKyBvZG1sX3N0cmVhbSAlIDEwKSkgJiYKKyAgICAgICh0YWcgIT0gR1NUX01BS0VfRk9VUkNDICgnMCcgKyBvZG1sX3N0cmVhbSAvIDEwLAorICAgICAgICAgICAgICAnMCcgKyBvZG1sX3N0cmVhbSAlIDEwLCAnaScsICd4JykpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJOb3QgYW4gaXgjIyBjaHVuayAoJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIikiLAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHRhZykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGF2aS0+b2Zmc2V0ICs9IDggKyBHU1RfUk9VTkRfVVBfMiAoc2l6ZSk7CisgIC8qIGZsdXNoIGNodW5rIGhlYWRlciBzbyB3ZSBnZXQganVzdCB0aGUgJ3NpemUnIHBheWxvYWQgZGF0YSAqLworICBnc3RfYWRhcHRlcl9mbHVzaCAoYXZpLT5hZGFwdGVyLCA4KTsKKyAgYnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGF2aS0+YWRhcHRlciwgc2l6ZSk7CisKKyAgaWYgKCFnc3RfYXZpX2RlbXV4X3BhcnNlX3N1YmluZGV4IChhdmksICZhdmktPnN0cmVhbVtvZG1sX3N0cmVhbV0sIGJ1ZikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIHdlIHBhcnNlZCB0aGUgaW5kZXgsIGdvIHRvIG5leHQgc3ViaW5kZXggKi8KKyAgYXZpLT5vZG1sX3N1YmlkeCsrOworCisgIGlmIChhdmktPm9kbWxfc3ViaWR4c1thdmktPm9kbWxfc3ViaWR4XSA9PSBHU1RfQlVGRkVSX09GRlNFVF9OT05FKSB7CisgICAgLyogd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbmRleGVzIGZvciB0aGlzIHN0cmVhbSwgbW92ZSB0byB0aGUgbmV4dAorICAgICAqIHN0cmVhbSB0byBoYW5kbGUgdGhlIGZpcnN0IGluZGV4ICovCisgICAgYXZpLT5vZG1sX3N0cmVhbSsrOworICAgIGF2aS0+b2RtbF9zdWJpZHggPSAwOworCisgICAgaWYgKGF2aS0+b2RtbF9zdHJlYW0gPCBhdmktPm51bV9zdHJlYW1zKSB7CisgICAgICAvKiB0aGVyZSBhcmUgbW9yZSBpbmRleGVzICovCisgICAgICBhdmktPm9kbWxfc3ViaWR4cyA9IGF2aS0+c3RyZWFtW2F2aS0+b2RtbF9zdHJlYW1dLmluZGV4ZXM7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHdlJ3JlIGRvbmUsIGdldCBzdHJlYW0gc3RhdHMgbm93ICovCisgICAgICBhdmktPmhhdmVfaW5kZXggPSBnc3RfYXZpX2RlbXV4X2RvX2luZGV4X3N0YXRzIChhdmkpOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKworICAvKiBzZWVrIHRvIG5leHQgaW5kZXggKi8KKyAgcmV0dXJuIHBlcmZvcm1fc2Vla190b19vZmZzZXQgKGF2aSwgYXZpLT5vZG1sX3N1YmlkeHNbYXZpLT5vZG1sX3N1YmlkeF0sCisgICAgICBhdmktPnNlZ21lbnRfc2VxbnVtKTsKK30KKworLyoKKyAqIFJlYWQgQVZJIGluZGV4CisgKi8KK3N0YXRpYyB2b2lkCitnc3RfYXZpX2RlbXV4X3JlYWRfc3ViaW5kZXhlc19wdWxsIChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgZ3VpbnQzMiB0YWc7CisgIEdzdEJ1ZmZlciAqYnVmOworICBnaW50IGksIG47CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAicmVhZCBzdWJpbmRleGVzIGZvciAlZCBzdHJlYW1zIiwgYXZpLT5udW1fc3RyZWFtcyk7CisKKyAgZm9yIChuID0gMDsgbiA8IGF2aS0+bnVtX3N0cmVhbXM7IG4rKykgeworICAgIEdzdEF2aVN0cmVhbSAqc3RyZWFtID0gJmF2aS0+c3RyZWFtW25dOworCisgICAgaWYgKHN0cmVhbS0+aW5kZXhlcyA9PSBOVUxMKQorICAgICAgY29udGludWU7CisKKyAgICBmb3IgKGkgPSAwOyBzdHJlYW0tPmluZGV4ZXNbaV0gIT0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORTsgaSsrKSB7CisgICAgICBpZiAoZ3N0X3JpZmZfcmVhZF9jaHVuayAoR1NUX0VMRU1FTlRfQ0FTVCAoYXZpKSwgYXZpLT5zaW5rcGFkLAorICAgICAgICAgICAgICAmc3RyZWFtLT5pbmRleGVzW2ldLCAmdGFnLCAmYnVmKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgY29udGludWU7CisgICAgICBlbHNlIGlmICgodGFnICE9IEdTVF9NQUtFX0ZPVVJDQyAoJ2knLCAneCcsICcwJyArIHN0cmVhbS0+bnVtIC8gMTAsCisgICAgICAgICAgICAgICAgICAnMCcgKyBzdHJlYW0tPm51bSAlIDEwKSkgJiYKKyAgICAgICAgICAodGFnICE9IEdTVF9NQUtFX0ZPVVJDQyAoJzAnICsgc3RyZWFtLT5udW0gLyAxMCwKKyAgICAgICAgICAgICAgICAgICcwJyArIHN0cmVhbS0+bnVtICUgMTAsICdpJywgJ3gnKSkpIHsKKyAgICAgICAgLyogU29tZSBPRE1MIGZpbGVzIChjcmVhdGVkIGJ5IGdvZCBrbm93cyB3aGF0IG11eGVyKSBoYXZlIGEgIyNpeCBmb3JtYXQKKyAgICAgICAgICogaW5zdGVhZCBvZiB0aGUgJ29mZmljaWFsJyBpeCMjLiBUaGV5IGFyZSBzdGlsbCB2YWxpZCB0aG91Z2guICovCisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLCAiTm90IGFuIGl4IyMgY2h1bmsgKCUiIEdTVF9GT1VSQ0NfRk9STUFUICIpIiwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSk7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoIWdzdF9hdmlfZGVtdXhfcGFyc2Vfc3ViaW5kZXggKGF2aSwgc3RyZWFtLCBidWYpKQorICAgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBnX2ZyZWUgKHN0cmVhbS0+aW5kZXhlcyk7CisgICAgc3RyZWFtLT5pbmRleGVzID0gTlVMTDsKKyAgfQorICAvKiBnZXQgc3RyZWFtIHN0YXRzIG5vdyAqLworICBhdmktPmhhdmVfaW5kZXggPSBnc3RfYXZpX2RlbXV4X2RvX2luZGV4X3N0YXRzIChhdmkpOworfQorCisvKgorICogZ3N0X2F2aV9kZW11eF9yaWZmX3BhcnNlX3ZwcnA6CisgKiBAZWxlbWVudDogY2FsbGVyIGVsZW1lbnQgKHVzZWQgZm9yIGRlYnVnZ2luZy9lcnJvcikuCisgKiBAYnVmOiBpbnB1dCBkYXRhIHRvIGJlIHVzZWQgZm9yIHBhcnNpbmcsIHN0cmlwcGVkIGZyb20gaGVhZGVyLgorICogQHZwcnA6IGEgcG9pbnRlciAocmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbikgdG8gYSBmaWxsZWQtaW4gdnBycAorICogICAgICAgIHN0cnVjdHVyZS4gQ2FsbGVyIHNob3VsZCBmcmVlIGl0LgorICoKKyAqIFBhcnNlcyBhIHZpZGVvIHN0cmVhbcK0cyB2cHJwLiBUaGlzIGZ1bmN0aW9uIHRha2VzIG93bmVyc2hpcCBvZiBAYnVmLgorICoKKyAqIFJldHVybnM6IFRSVUUgaWYgcGFyc2luZyBzdWNjZWVkZWQsIG90aGVyd2lzZSBGQUxTRS4gVGhlIHN0cmVhbQorICogICAgICAgICAgc2hvdWxkIGJlIHNraXBwZWQgb24gZXJyb3IsIGJ1dCBpdCBpcyBub3QgZmF0YWwuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9kZW11eF9yaWZmX3BhcnNlX3ZwcnAgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZiwgZ3N0X3JpZmZfdnBycCAqKiBfdnBycCkKK3sKKyAgZ3N0X3JpZmZfdnBycCAqdnBycDsKKyAgZ2ludCBrOworICBnc2l6ZSBzaXplOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChidWYgIT0gTlVMTCwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoX3ZwcnAgIT0gTlVMTCwgRkFMU0UpOworCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworCisgIGlmIChzaXplIDwgR19TVFJVQ1RfT0ZGU0VUIChnc3RfcmlmZl92cHJwLCBmaWVsZF9pbmZvKSkKKyAgICBnb3RvIHRvb19zbWFsbDsKKworICB2cHJwID0gZ19tYWxsb2MgKHNpemUpOworICBnc3RfYnVmZmVyX2V4dHJhY3QgKGJ1ZiwgMCwgdnBycCwgc2l6ZSk7CisKKyNpZiAoR19CWVRFX09SREVSID09IEdfQklHX0VORElBTikKKyAgdnBycC0+Zm9ybWF0X3Rva2VuID0gR1VJTlQzMl9GUk9NX0xFICh2cHJwLT5mb3JtYXRfdG9rZW4pOworICB2cHJwLT5zdGFuZGFyZCA9IEdVSU5UMzJfRlJPTV9MRSAodnBycC0+c3RhbmRhcmQpOworICB2cHJwLT52ZXJ0X3JhdGUgPSBHVUlOVDMyX0ZST01fTEUgKHZwcnAtPnZlcnRfcmF0ZSk7CisgIHZwcnAtPmhvcl90X3RvdGFsID0gR1VJTlQzMl9GUk9NX0xFICh2cHJwLT5ob3JfdF90b3RhbCk7CisgIHZwcnAtPnZlcnRfbGluZXMgPSBHVUlOVDMyX0ZST01fTEUgKHZwcnAtPnZlcnRfbGluZXMpOworICB2cHJwLT5hc3BlY3QgPSBHVUlOVDMyX0ZST01fTEUgKHZwcnAtPmFzcGVjdCk7CisgIHZwcnAtPndpZHRoID0gR1VJTlQzMl9GUk9NX0xFICh2cHJwLT53aWR0aCk7CisgIHZwcnAtPmhlaWdodCA9IEdVSU5UMzJfRlJPTV9MRSAodnBycC0+aGVpZ2h0KTsKKyAgdnBycC0+ZmllbGRzID0gR1VJTlQzMl9GUk9NX0xFICh2cHJwLT5maWVsZHMpOworI2VuZGlmCisKKyAgLyogc2l6ZSBjaGVja2luZyAqLworICAvKiBjYWxjdWxhdGUgZmllbGRzIGJhc2VkIG9uIHNpemUgKi8KKyAgayA9IChzaXplIC0gR19TVFJVQ1RfT0ZGU0VUIChnc3RfcmlmZl92cHJwLCBmaWVsZF9pbmZvKSkgLyB2cHJwLT5maWVsZHM7CisgIGlmICh2cHJwLT5maWVsZHMgPiBrKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbGVtZW50LAorICAgICAgICAidnBycCBoZWFkZXIgaW5kaWNhdGVkICVkIGZpZWxkcywgb25seSAlZCBhdmFpbGFibGUiLCB2cHJwLT5maWVsZHMsIGspOworICAgIHZwcnAtPmZpZWxkcyA9IGs7CisgIH0KKyAgaWYgKHZwcnAtPmZpZWxkcyA+IEdTVF9SSUZGX1ZQUlBfVklERU9fRklFTERTKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbGVtZW50LAorICAgICAgICAidnBycCBoZWFkZXIgaW5kaWNhdGVkICVkIGZpZWxkcywgYXQgbW9zdCAlZCBzdXBwb3J0ZWQiLCB2cHJwLT5maWVsZHMsCisgICAgICAgIEdTVF9SSUZGX1ZQUlBfVklERU9fRklFTERTKTsKKyAgICB2cHJwLT5maWVsZHMgPSBHU1RfUklGRl9WUFJQX1ZJREVPX0ZJRUxEUzsKKyAgfQorI2lmIChHX0JZVEVfT1JERVIgPT0gR19CSUdfRU5ESUFOKQorICBmb3IgKGsgPSAwOyBrIDwgdnBycC0+ZmllbGRzOyBrKyspIHsKKyAgICBnc3RfcmlmZl92cHJwX3ZpZGVvX2ZpZWxkX2Rlc2MgKmZkOworCisgICAgZmQgPSAmdnBycC0+ZmllbGRfaW5mb1trXTsKKyAgICBmZC0+Y29tcHJlc3NlZF9ibV9oZWlnaHQgPSBHVUlOVDMyX0ZST01fTEUgKGZkLT5jb21wcmVzc2VkX2JtX2hlaWdodCk7CisgICAgZmQtPmNvbXByZXNzZWRfYm1fd2lkdGggPSBHVUlOVDMyX0ZST01fTEUgKGZkLT5jb21wcmVzc2VkX2JtX3dpZHRoKTsKKyAgICBmZC0+dmFsaWRfYm1faGVpZ2h0ID0gR1VJTlQzMl9GUk9NX0xFIChmZC0+dmFsaWRfYm1faGVpZ2h0KTsKKyAgICBmZC0+dmFsaWRfYm1fd2lkdGggPSBHVUlOVDE2X0ZST01fTEUgKGZkLT52YWxpZF9ibV93aWR0aCk7CisgICAgZmQtPnZhbGlkX2JtX3hfb2Zmc2V0ID0gR1VJTlQxNl9GUk9NX0xFIChmZC0+dmFsaWRfYm1feF9vZmZzZXQpOworICAgIGZkLT52YWxpZF9ibV95X29mZnNldCA9IEdVSU5UMzJfRlJPTV9MRSAoZmQtPnZhbGlkX2JtX3lfb2Zmc2V0KTsKKyAgICBmZC0+dmlkZW9feF90X29mZnNldCA9IEdVSU5UMzJfRlJPTV9MRSAoZmQtPnZpZGVvX3hfdF9vZmZzZXQpOworICAgIGZkLT52aWRlb195X3N0YXJ0ID0gR1VJTlQzMl9GUk9NX0xFIChmZC0+dmlkZW9feV9zdGFydCk7CisgIH0KKyNlbmRpZgorCisgIC8qIGRlYnVnICovCisgIEdTVF9JTkZPX09CSkVDVCAoZWxlbWVudCwgInZwcnAgdGFnIGZvdW5kIGluIGNvbnRleHQgdmlkczoiKTsKKyAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiIGZvcm1hdF90b2tlbiAgJWQiLCB2cHJwLT5mb3JtYXRfdG9rZW4pOworICBHU1RfSU5GT19PQkpFQ1QgKGVsZW1lbnQsICIgc3RhbmRhcmQgICAgICAlZCIsIHZwcnAtPnN0YW5kYXJkKTsKKyAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiIHZlcnRfcmF0ZSAgICAgJWQiLCB2cHJwLT52ZXJ0X3JhdGUpOworICBHU1RfSU5GT19PQkpFQ1QgKGVsZW1lbnQsICIgaG9yX3RfdG90YWwgICAlZCIsIHZwcnAtPmhvcl90X3RvdGFsKTsKKyAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiIHZlcnRfbGluZXMgICAgJWQiLCB2cHJwLT52ZXJ0X2xpbmVzKTsKKyAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiIGFzcGVjdCAgICAgICAgJWQ6JWQiLCB2cHJwLT5hc3BlY3QgPj4gMTYsCisgICAgICB2cHJwLT5hc3BlY3QgJiAweGZmZmYpOworICBHU1RfSU5GT19PQkpFQ1QgKGVsZW1lbnQsICIgd2lkdGggICAgICAgICAlZCIsIHZwcnAtPndpZHRoKTsKKyAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiIGhlaWdodCAgICAgICAgJWQiLCB2cHJwLT5oZWlnaHQpOworICBHU1RfSU5GT19PQkpFQ1QgKGVsZW1lbnQsICIgZmllbGRzICAgICAgICAlZCIsIHZwcnAtPmZpZWxkcyk7CisgIGZvciAoayA9IDA7IGsgPCB2cHJwLT5maWVsZHM7IGsrKykgeworICAgIGdzdF9yaWZmX3ZwcnBfdmlkZW9fZmllbGRfZGVzYyAqZmQ7CisKKyAgICBmZCA9ICYodnBycC0+ZmllbGRfaW5mb1trXSk7CisgICAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiIGZpZWxkICV1IGRlc2NyaXB0aW9uOiIsIGspOworICAgIEdTVF9JTkZPX09CSkVDVCAoZWxlbWVudCwgIiAgY29tcHJlc3NlZF9ibV9oZWlnaHQgICVkIiwKKyAgICAgICAgZmQtPmNvbXByZXNzZWRfYm1faGVpZ2h0KTsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGVsZW1lbnQsICIgIGNvbXByZXNzZWRfYm1fd2lkdGggICVkIiwKKyAgICAgICAgZmQtPmNvbXByZXNzZWRfYm1fd2lkdGgpOworICAgIEdTVF9JTkZPX09CSkVDVCAoZWxlbWVudCwgIiAgdmFsaWRfYm1faGVpZ2h0ICAgICAgICVkIiwKKyAgICAgICAgZmQtPnZhbGlkX2JtX2hlaWdodCk7CisgICAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiICB2YWxpZF9ibV93aWR0aCAgICAgICAgJWQiLCBmZC0+dmFsaWRfYm1fd2lkdGgpOworICAgIEdTVF9JTkZPX09CSkVDVCAoZWxlbWVudCwgIiAgdmFsaWRfYm1feF9vZmZzZXQgICAgICVkIiwKKyAgICAgICAgZmQtPnZhbGlkX2JtX3hfb2Zmc2V0KTsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGVsZW1lbnQsICIgIHZhbGlkX2JtX3lfb2Zmc2V0ICAgICAlZCIsCisgICAgICAgIGZkLT52YWxpZF9ibV95X29mZnNldCk7CisgICAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiICB2aWRlb194X3Rfb2Zmc2V0ICAgICAgJWQiLAorICAgICAgICBmZC0+dmlkZW9feF90X29mZnNldCk7CisgICAgR1NUX0lORk9fT0JKRUNUIChlbGVtZW50LCAiICB2aWRlb195X3N0YXJ0ICAgICAgICAgJWQiLCBmZC0+dmlkZW9feV9zdGFydCk7CisgIH0KKworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgICpfdnBycCA9IHZwcnA7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCit0b29fc21hbGw6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChlbGVtZW50LAorICAgICAgICAiVG9vIHNtYWxsIHZwcnAgKCUiIEdfR1NJWkVfRk9STUFUICIgYXZhaWxhYmxlLCBhdCBsZWFzdCAlZCBuZWVkZWQpIiwKKyAgICAgICAgc2l6ZSwgKGludCkgR19TVFJVQ1RfT0ZGU0VUIChnc3RfcmlmZl92cHJwLCBmaWVsZF9pbmZvKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdmlfZGVtdXhfZXhwb3NlX3N0cmVhbXMgKEdzdEF2aURlbXV4ICogYXZpLCBnYm9vbGVhbiBmb3JjZSkKK3sKKyAgZ3VpbnQgaTsKKworICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJmb3JjZSA6ICVkIiwgZm9yY2UpOworCisgIGZvciAoaSA9IDA7IGkgPCBhdmktPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICBHc3RBdmlTdHJlYW0gKnN0cmVhbSA9ICZhdmktPnN0cmVhbVtpXTsKKworICAgIGlmIChmb3JjZSB8fCBzdHJlYW0tPmlkeF9uICE9IDApIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChhdmksICJBZGRpbmcgcGFkICVzIiwgR1NUX1BBRF9OQU1FIChzdHJlYW0tPnBhZCkpOworICAgICAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoKEdzdEVsZW1lbnQgKikgYXZpLCBzdHJlYW0tPnBhZCk7CisgICAgICBnc3RfZmxvd19jb21iaW5lcl9hZGRfcGFkIChhdmktPmZsb3djb21iaW5lciwgc3RyZWFtLT5wYWQpOworCisjaWYgMAorICAgICAgaWYgKGF2aS0+ZWxlbWVudF9pbmRleCkKKyAgICAgICAgZ3N0X2luZGV4X2dldF93cml0ZXJfaWQgKGF2aS0+ZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgIEdTVF9PQkpFQ1RfQ0FTVCAoc3RyZWFtLT5wYWQpLCAmc3RyZWFtLT5pbmRleF9pZCk7CisjZW5kaWYKKworICAgICAgc3RyZWFtLT5leHBvc2VkID0gVFJVRTsKKyAgICAgIGlmIChhdmktPm1haW5fc3RyZWFtID09IC0xKQorICAgICAgICBhdmktPm1haW5fc3RyZWFtID0gaTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJTdHJlYW0gIyVkIGRvZXNuJ3QgaGF2ZSBhbnkgZW50cnksIHJlbW92aW5nIGl0IiwKKyAgICAgICAgICBpKTsKKyAgICAgIGdzdF9hdmlfZGVtdXhfcmVzZXRfc3RyZWFtIChhdmksIHN0cmVhbSk7CisgICAgfQorICB9Cit9CisKKy8qIGJ1ZiBjb250YWlucyBMSVNUIGNodW5rIGRhdGEsIGFuZCB3aWxsIGJlIHBhZGRlZCB0byBldmVuIHNpemUsCisgKiBzaW5jZSBzb21lIGJ1Z2d5IGZpbGVzIGRvIG5vdCBhY2NvdW50IGZvciB0aGUgcGFkZGluZyBvZiBjaHVua3MKKyAqIHdpdGhpbiBhIExJU1QgaW4gdGhlIHNpemUgb2YgdGhlIExJU1QgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZ3N0X2F2aV9kZW11eF9yb3VuZHVwX2xpc3QgKEdzdEF2aURlbXV4ICogYXZpLCBHc3RCdWZmZXIgKiogYnVmKQoreworICBnc2l6ZSBzaXplOworCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplICgqYnVmKTsKKworICBpZiAoR19VTkxJS0VMWSAoc2l6ZSAmIDEpKSB7CisgICAgR3N0QnVmZmVyICpvYnVmOworICAgIEdzdE1hcEluZm8gbWFwOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAicm91bmRpbmcgdXAgZHViaW91cyBsaXN0IHNpemUgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICAgIHNpemUpOworICAgIG9idWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHNpemUgKyAxKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKCpidWYsIDAsIG1hcC5kYXRhLCBzaXplKTsKKyAgICAvKiBhc3N1bWUgMCBwYWRkaW5nLCBhdCBsZWFzdCBtYWtlcyBvdXRjb21lIGRldGVybWluaXN0aWMgKi8KKyAgICBtYXAuZGF0YVtzaXplXSA9IDA7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob2J1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlIChidWYsIG9idWYpOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9hdmlfZGVtdXhfY2hlY2tfY2FwcyAoR3N0QXZpRGVtdXggKiBhdmksIEdzdEF2aVN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzOworICBjb25zdCBHVmFsdWUgKnZhbDsKKyAgR3N0QnVmZmVyICpidWY7CisKKyAgY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGNhcHMpOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJ2aWRlby94LXJhdyIpKSB7CisgICAgc3RyZWFtLT5pc19yYXcgPSBUUlVFOworICAgIHN0cmVhbS0+YWxpZ25tZW50ID0gMzI7CisgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgInBpeGVsLWFzcGVjdC1yYXRpbyIpKQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iLCBHU1RfVFlQRV9GUkFDVElPTiwKKyAgICAgICAgICAxLCAxLCBOVUxMKTsKKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGRfdHlwZWQgKHMsICJwYWxldHRlX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIpKSB7CisgICAgICBnc3Rfc3RydWN0dXJlX2dldCAocywgInBhbGV0dGVfZGF0YSIsIEdTVF9UWVBFX0JVRkZFUiwKKyAgICAgICAgICAmc3RyZWFtLT5yZ2I4X3BhbGV0dGUsIE5VTEwpOworICAgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJwYWxldHRlX2RhdGEiKTsKKyAgICAgIHJldHVybiBjYXBzOworICAgIH0KKyAgfSBlbHNlIGlmICghZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgInZpZGVvL3gtaDI2NCIpKSB7CisgICAgcmV0dXJuIGNhcHM7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJjaGVja2luZyBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICAvKiBzb21lIG11eGVycyBwdXQgaW52YWxpZCBieXRlc3RyZWFtIHN0dWZmIGluIGgyNjQgZXh0cmEgZGF0YSAqLworICB2YWwgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgImNvZGVjX2RhdGEiKTsKKyAgaWYgKHZhbCAmJiAoYnVmID0gZ3N0X3ZhbHVlX2dldF9idWZmZXIgKHZhbCkpKSB7CisgICAgZ3VpbnQ4ICpkYXRhOworICAgIGdpbnQgc2l6ZTsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgZGF0YSA9IG1hcC5kYXRhOworICAgIHNpemUgPSBtYXAuc2l6ZTsKKyAgICBpZiAoc2l6ZSA+PSA0KSB7CisgICAgICBndWludDMyIGggPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEpOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICAgIGlmIChoID09IDB4MDEpIHsKKyAgICAgICAgLyogY2FuIGhhcmRseSBiZSB2YWxpZCBBVkMgY29kZWMgZGF0YSAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksCisgICAgICAgICAgICAiZGlzY2FyZGluZyBpbnZhbGlkIGNvZGVjX2RhdGEgY29udGFpbmluZyBieXRlLXN0cmVhbSIpOworICAgICAgICAvKiBzbyBkbyBub3QgcHJldGVuZCB0byBkb3duc3RyZWFtIHRoYXQgaXQgaXMgcGFja2V0aXplZCBhdmMgKi8KKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJjb2RlY19kYXRhIik7CisgICAgICAgIC8qIC4uLiBidXQgcmF0aGVyIHByb3Blcmx5IHBhcnNlZCBieXRlc3RyZWFtICovCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAic3RyZWFtLWZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJieXRlLXN0cmVhbSIsCisgICAgICAgICAgICAiYWxpZ25tZW50IiwgR19UWVBFX1NUUklORywgImF1IiwgTlVMTCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKKy8qCisgKiBnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbToKKyAqIEBhdmk6IGNhbGxpbmcgZWxlbWVudCAodXNlZCBmb3IgZGVidWdnaW5nL2Vycm9ycykuCisgKiBAYnVmOiBpbnB1dCBidWZmZXIgdXNlZCB0byBwYXJzZSB0aGUgc3RyZWFtLgorICoKKyAqIFBhcnNlcyBhbGwgc3ViY2h1bmtzIGluIGEgc3RybCBjaHVuayAod2hpY2ggZGVmaW5lcyBhIHNpbmdsZQorICogc3RyZWFtKS4gRGlzY2FyZHMgdGhlIGJ1ZmZlciBhZnRlciB1c2UuIFRoaXMgZnVuY3Rpb24gd2lsbAorICogaW5jcmVtZW50IHRoZSBzdHJlYW0gY291bnRlciBpbnRlcm5hbGx5LgorICoKKyAqIFJldHVybnM6IHdoZXRoZXIgdGhlIHN0cmVhbSB3YXMgaWRlbnRpZmllZCBzdWNjZXNzZnVsbHkuCisgKiAgICAgICAgICBFcnJvcnMgYXJlIG5vdCBmYXRhbC4gSXQgZG9lcyBpbmRpY2F0ZSB0aGUgc3RyZWFtCisgKiAgICAgICAgICB3YXMgc2tpcHBlZC4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYXZpX2RlbXV4X3BhcnNlX3N0cmVhbSAoR3N0QXZpRGVtdXggKiBhdmksIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0QXZpU3RyZWFtICpzdHJlYW07CisgIEdzdEVsZW1lbnRDbGFzcyAqa2xhc3M7CisgIEdzdFBhZFRlbXBsYXRlICp0ZW1wbDsKKyAgR3N0QnVmZmVyICpzdWIgPSBOVUxMOworICBndWludCBvZmZzZXQgPSA0OworICBndWludDMyIHRhZyA9IDA7CisgIGdjaGFyICpjb2RlY19uYW1lID0gTlVMTCwgKnBhZG5hbWUgPSBOVUxMOworICBjb25zdCBnY2hhciAqdGFnX25hbWU7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworICBHc3RQYWQgKnBhZDsKKyAgR3N0RWxlbWVudCAqZWxlbWVudDsKKyAgZ2Jvb2xlYW4gZ290X3N0cmggPSBGQUxTRSwgZ290X3N0cmYgPSBGQUxTRSwgZ290X3ZwcnAgPSBGQUxTRTsKKyAgZ3N0X3JpZmZfdnBycCAqdnBycCA9IE5VTEw7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgZ2NoYXIgKnN0cmVhbV9pZDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdib29sZWFuIHNwYXJzZSA9IEZBTFNFOworCisgIGVsZW1lbnQgPSBHU1RfRUxFTUVOVF9DQVNUIChhdmkpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIlBhcnNpbmcgc3RyZWFtIik7CisKKyAgZ3N0X2F2aV9kZW11eF9yb3VuZHVwX2xpc3QgKGF2aSwgJmJ1Zik7CisKKyAgaWYgKGF2aS0+bnVtX3N0cmVhbXMgPj0gR1NUX0FWSV9ERU1VWF9NQVhfU1RSRUFNUykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLAorICAgICAgICAibWF4aW11bSBubyBvZiBzdHJlYW1zICglZCkgZXhjZWVkZWQsIGlnbm9yaW5nIHN0cmVhbSIsCisgICAgICAgIEdTVF9BVklfREVNVVhfTUFYX1NUUkVBTVMpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgLyogbm90IGEgZmF0YWwgZXJyb3IsIGxldCdzIHNheSAqLworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgc3RyZWFtID0gJmF2aS0+c3RyZWFtW2F2aS0+bnVtX3N0cmVhbXNdOworCisgIC8qIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgc3RyZWFtLT5pZHhfZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBzdHJlYW0tPmhkcl9kdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIHN0cmVhbS0+ZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIHdoaWxlIChnc3RfcmlmZl9wYXJzZV9jaHVuayAoZWxlbWVudCwgYnVmLCAmb2Zmc2V0LCAmdGFnLCAmc3ViKSkgeworICAgIC8qIHN1YiBjYW4gYmUgTlVMTCBpZiB0aGUgY2h1bmsgaXMgZW1wdHkgKi8KKyAgICBpZiAoc3ViID09IE5VTEwpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgImlnbm9yaW5nIGVtcHR5IGNodW5rICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgIGNhc2UgR1NUX1JJRkZfVEFHX3N0cmg6CisgICAgICB7CisgICAgICAgIGdzdF9yaWZmX3N0cmggKnN0cmg7CisKKyAgICAgICAgaWYgKGdvdF9zdHJoKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJJZ25vcmluZyBhZGRpdGlvbmFsIHN0cmggY2h1bmsiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWdzdF9yaWZmX3BhcnNlX3N0cmggKGVsZW1lbnQsIHN1YiwgJnN0cmVhbS0+c3RyaCkpIHsKKyAgICAgICAgICAvKiBvd25lcnNoaXAgZ2l2ZW4gYXdheSAqLworICAgICAgICAgIHN1YiA9IE5VTEw7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJGYWlsZWQgdG8gcGFyc2Ugc3RyaCBjaHVuayIpOworICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBzdWIgPSBOVUxMOworICAgICAgICBzdHJoID0gc3RyZWFtLT5zdHJoOworICAgICAgICAvKiBzYW5pdHkgY2hlY2s7IHN0cmVhbSBoZWFkZXIgZnJhbWUgcmF0ZSBtYXRjaGVzIGdsb2JhbCBoZWFkZXIKKyAgICAgICAgICogZnJhbWUgZHVyYXRpb24gKi8KKyAgICAgICAgaWYgKHN0cmVhbS0+c3RyaC0+dHlwZSA9PSBHU1RfUklGRl9GQ0NfdmlkcykgeworICAgICAgICAgIEdzdENsb2NrVGltZSBzX2R1cjsKKyAgICAgICAgICBHc3RDbG9ja1RpbWUgaF9kdXIgPSBhdmktPmF2aWgtPnVzX2ZyYW1lICogR1NUX1VTRUNPTkQ7CisKKyAgICAgICAgICBzX2R1ciA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoR1NUX1NFQ09ORCwgc3RyaC0+c2NhbGUsIHN0cmgtPnJhdGUpOworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInZlcmlmeWluZyBzdHJlYW0gZnJhbWVyYXRlICVkLyVkLCAiCisgICAgICAgICAgICAgICJmcmFtZSBkdXJhdGlvbiA9ICVkIG1zIiwgc3RyaC0+cmF0ZSwgc3RyaC0+c2NhbGUsCisgICAgICAgICAgICAgIChnaW50KSAoc19kdXIgLyBHU1RfTVNFQ09ORCkpOworICAgICAgICAgIGlmIChoX2R1ciA+ICgxMCAqIEdTVF9NU0VDT05EKSAmJiAoc19kdXIgPiAxMCAqIGhfZHVyKSkgeworICAgICAgICAgICAgc3RyaC0+cmF0ZSA9IEdTVF9TRUNPTkQgLyBHU1RfVVNFQ09ORDsKKyAgICAgICAgICAgIHN0cmgtPnNjYWxlID0gaF9kdXIgLyBHU1RfVVNFQ09ORDsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgImNvcnJlY3Rpbmcgc3RyZWFtIGZyYW1lcmF0ZSB0byAlZC8lZCIsCisgICAgICAgICAgICAgICAgc3RyaC0+cmF0ZSwgc3RyaC0+c2NhbGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBkZXRlcm1pbmUgZHVyYXRpb24gYXMgaW5kaWNhdGVkIGJ5IGhlYWRlciAqLworICAgICAgICBzdHJlYW0tPmhkcl9kdXJhdGlvbiA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoKGd1aW50NjQpIHN0cmgtPmxlbmd0aCAqCisgICAgICAgICAgICBzdHJoLT5zY2FsZSwgR1NUX1NFQ09ORCwgKGd1aW50NjQpIHN0cmgtPnJhdGUpOworICAgICAgICBHU1RfSU5GTyAoIlN0cmVhbSBkdXJhdGlvbiBhY2NvcmRpbmcgdG8gaGVhZGVyOiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChzdHJlYW0tPmhkcl9kdXJhdGlvbikpOworICAgICAgICBpZiAoc3RyZWFtLT5oZHJfZHVyYXRpb24gPT0gMCkKKyAgICAgICAgICBzdHJlYW0tPmhkcl9kdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgICAgICAgZ290X3N0cmggPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgR1NUX1JJRkZfVEFHX3N0cmY6CisgICAgICB7CisgICAgICAgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgICAgICAgIGlmIChnb3Rfc3RyZikgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLCAiSWdub3JpbmcgYWRkaXRpb25hbCBzdHJmIGNodW5rIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFnb3Rfc3RyaCkgeworICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGF2aSwgIkZvdW5kIHN0cmYgY2h1bmsgYmVmb3JlIHN0cmggY2h1bmsiKTsKKyAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChzdHJlYW0tPnN0cmgtPnR5cGUpIHsKKyAgICAgICAgICBjYXNlIEdTVF9SSUZGX0ZDQ192aWRzOgorICAgICAgICAgICAgc3RyZWFtLT5pc192YnIgPSBUUlVFOworICAgICAgICAgICAgcmVzID0gZ3N0X3JpZmZfcGFyc2Vfc3RyZl92aWRzIChlbGVtZW50LCBzdWIsCisgICAgICAgICAgICAgICAgJnN0cmVhbS0+c3RyZi52aWRzLCAmc3RyZWFtLT5leHRyYWRhdGEpOworICAgICAgICAgICAgc3ViID0gTlVMTDsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVsZW1lbnQsICJtYXJraW5nIHZpZGVvIGFzIFZCUiwgcmVzICVkIiwgcmVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX1JJRkZfRkNDX2F1ZHM6CisgICAgICAgICAgICByZXMgPQorICAgICAgICAgICAgICAgIGdzdF9yaWZmX3BhcnNlX3N0cmZfYXVkcyAoZWxlbWVudCwgc3ViLCAmc3RyZWFtLT5zdHJmLmF1ZHMsCisgICAgICAgICAgICAgICAgJnN0cmVhbS0+ZXh0cmFkYXRhKTsKKyAgICAgICAgICAgIHN1YiA9IE5VTEw7CisgICAgICAgICAgICBpZiAoIXJlcykKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBzdHJlYW0tPmlzX3ZiciA9IChzdHJlYW0tPnN0cmgtPnNhbXBsZXNpemUgPT0gMCkKKyAgICAgICAgICAgICAgICAmJiBzdHJlYW0tPnN0cmgtPnNjYWxlID4gMQorICAgICAgICAgICAgICAgICYmIHN0cmVhbS0+c3RyZi5hdWRzLT5ibG9ja2FsaWduICE9IDE7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChlbGVtZW50LCAibWFya2luZyBhdWRpbyBhcyBWQlI6JWQsIHJlcyAlZCIsCisgICAgICAgICAgICAgICAgc3RyZWFtLT5pc192YnIsIHJlcyk7CisgICAgICAgICAgICAvKiB3ZSBuZWVkIHRoZXNlIG9yIHdlIGhhdmUgbm8gd2F5IHRvIGNvbWUgdXAgd2l0aCB0aW1lc3RhbXBzICovCisgICAgICAgICAgICBpZiAoKCFzdHJlYW0tPmlzX3ZiciAmJiAhc3RyZWFtLT5zdHJmLmF1ZHMtPmF2X2JwcykgfHwKKyAgICAgICAgICAgICAgICAoc3RyZWFtLT5pc192YnIgJiYgKCFzdHJlYW0tPnN0cmgtPnNjYWxlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyZWFtLT5zdHJoLT5yYXRlKSkpIHsKKyAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbGVtZW50LAorICAgICAgICAgICAgICAgICAgImludmFsaWQgYXVkaW8gaGVhZGVyLCBpZ25vcmluZyBzdHJlYW0iKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogc29tZSBtb3JlIHNhbml0eSBjaGVja3MgKi8KKyAgICAgICAgICAgIGlmIChzdHJlYW0tPmlzX3ZicikgeworICAgICAgICAgICAgICBpZiAoc3RyZWFtLT5zdHJmLmF1ZHMtPmJsb2NrYWxpZ24gPD0gNCkgeworICAgICAgICAgICAgICAgIC8qIHRoYXQgd291bGQgbWVhbiAodG9vKSBtYW55IGZyYW1lcyBwZXIgY2h1bmssCisgICAgICAgICAgICAgICAgICogc28gbm90IGxpa2VseSBzZXQgYXMgZXhwZWN0ZWQgKi8KKyAgICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChlbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAic3VzcGljaW91cyBibG9ja2FsaWduICVkIGZvciBWQlIgYXVkaW87ICIKKyAgICAgICAgICAgICAgICAgICAgIm92ZXJyaWRpbmcgdG8gMSBmcmFtZSBwZXIgY2h1bmsiLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPnN0cmYuYXVkcy0+YmxvY2thbGlnbik7CisgICAgICAgICAgICAgICAgLyogdGhpcyBzaG91bGQgdG9wIGFueSBsaWtlbHkgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBzdHJlYW0tPnN0cmYuYXVkcy0+YmxvY2thbGlnbiA9ICgxIDw8IDEyKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHU1RfUklGRl9GQ0NfaWF2czoKKyAgICAgICAgICAgIHN0cmVhbS0+aXNfdmJyID0gVFJVRTsKKyAgICAgICAgICAgIHJlcyA9IGdzdF9yaWZmX3BhcnNlX3N0cmZfaWF2cyAoZWxlbWVudCwgc3ViLAorICAgICAgICAgICAgICAgICZzdHJlYW0tPnN0cmYuaWF2cywgJnN0cmVhbS0+ZXh0cmFkYXRhKTsKKyAgICAgICAgICAgIHN1YiA9IE5VTEw7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChlbGVtZW50LCAibWFya2luZyBpYXZzIGFzIFZCUiwgcmVzICVkIiwgcmVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX1JJRkZfRkNDX3R4dHM6CisgICAgICAgICAgICAvKiBub3RoaW5nIHRvIHBhcnNlIGhlcmUgKi8KKyAgICAgICAgICAgIHN0cmVhbS0+aXNfdmJyID0gKHN0cmVhbS0+c3RyaC0+c2FtcGxlc2l6ZSA9PSAwKQorICAgICAgICAgICAgICAgICYmIChzdHJlYW0tPnN0cmgtPnNjYWxlID4gMSk7CisgICAgICAgICAgICByZXMgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGF2aSwKKyAgICAgICAgICAgICAgICAiRG9uwrR0IGtub3cgaG93IHRvIGhhbmRsZSBzdHJlYW0gdHlwZSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHN0cmVhbS0+c3RyaC0+dHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1YikgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHN1Yik7CisgICAgICAgICAgc3ViID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXJlcykKKyAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGdvdF9zdHJmID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEdTVF9SSUZGX1RBR192cHJwOgorICAgICAgeworICAgICAgICBpZiAoZ290X3ZwcnApIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwgIklnbm9yaW5nIGFkZGl0aW9uYWwgdnBycCBjaHVuayIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghZ290X3N0cmgpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChhdmksICJGb3VuZCB2cHJwIGNodW5rIGJlZm9yZSBzdHJoIGNodW5rIik7CisgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGlmICghZ290X3N0cmYpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChhdmksICJGb3VuZCB2cHJwIGNodW5rIGJlZm9yZSBzdHJmIGNodW5rIik7CisgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFnc3RfYXZpX2RlbXV4X3JpZmZfcGFyc2VfdnBycCAoZWxlbWVudCwgc3ViLCAmdnBycCkpIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwgIkZhaWxlZCB0byBwYXJzZSB2cHJwIGNodW5rIik7CisgICAgICAgICAgLyogbm90IGNvbnNpZGVyZWQgZmF0YWwgKi8KKyAgICAgICAgICBnX2ZyZWUgKHZwcnApOworICAgICAgICAgIHZwcnAgPSBOVUxMOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBnb3RfdnBycCA9IFRSVUU7CisgICAgICAgIHN1YiA9IE5VTEw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfUklGRl9UQUdfc3RyZDoKKyAgICAgICAgaWYgKHN0cmVhbS0+aW5pdGRhdGEpCisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoc3RyZWFtLT5pbml0ZGF0YSk7CisgICAgICAgIHN0cmVhbS0+aW5pdGRhdGEgPSBzdWI7CisgICAgICAgIGlmIChzdWIgIT0gTlVMTCkgeworICAgICAgICAgIGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3RyZCAoYXZpLCBzdWIpOworICAgICAgICAgIHN1YiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9SSUZGX1RBR19zdHJuOgorICAgICAgICBnX2ZyZWUgKHN0cmVhbS0+bmFtZSk7CisKKyAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKHN1YiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICAgICAgICBpZiAoYXZpLT5nbG9iYWx0YWdzID09IE5VTEwpCisgICAgICAgICAgYXZpLT5nbG9iYWx0YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgICAgICAgcGFyc2VfdGFnX3ZhbHVlIChhdmksIGF2aS0+Z2xvYmFsdGFncywgR1NUX1RBR19USVRMRSwKKyAgICAgICAgICAgIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisKKyAgICAgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChhdmktPmdsb2JhbHRhZ3MsIEdTVF9UQUdfVElUTEUsCisgICAgICAgICAgICAgICAgJnN0cmVhbS0+bmFtZSkpCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic3RyZWFtIG5hbWU6ICVzIiwgc3RyZWFtLT5uYW1lKTsKKworICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChzdWIsICZtYXApOworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChzdWIpOworICAgICAgICBzdWIgPSBOVUxMOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1JJRkZfSURJVDoKKyAgICAgICAgZ3N0X2F2aV9kZW11eF9wYXJzZV9pZGl0IChhdmksIHN1Yik7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKHRhZyA9PSBHU1RfTUFLRV9GT1VSQ0MgKCdpJywgJ24nLCAnZCcsICd4JykgfHwKKyAgICAgICAgICAgIHRhZyA9PSBHU1RfTUFLRV9GT1VSQ0MgKCdpJywgJ3gnLCAnMCcgKyBhdmktPm51bV9zdHJlYW1zIC8gMTAsCisgICAgICAgICAgICAgICAgJzAnICsgYXZpLT5udW1fc3RyZWFtcyAlIDEwKSkgeworICAgICAgICAgIGdfZnJlZSAoc3RyZWFtLT5pbmRleGVzKTsKKyAgICAgICAgICBnc3RfYXZpX2RlbXV4X3BhcnNlX3N1cGVyaW5kZXggKGF2aSwgc3ViLCAmc3RyZWFtLT5pbmRleGVzKTsKKyAgICAgICAgICBzdHJlYW0tPnN1cGVyaW5kZXggPSBUUlVFOworICAgICAgICAgIHN1YiA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksCisgICAgICAgICAgICAiVW5rbm93biBzdHJlYW0gaGVhZGVyIHRhZyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiLCBpZ25vcmluZyIsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHRhZykpOworICAgICAgICAvKiBPbmx5IGdldCBidWZmZXIgZm9yIGRlYnVnZ2luZyBpZiB0aGUgbWVtZHVtcCBpcyBuZWVkZWQgICovCisgICAgICAgIGlmIChnc3RfZGVidWdfY2F0ZWdvcnlfZ2V0X3RocmVzaG9sZCAoR1NUX0NBVF9ERUZBVUxUKSA+PSA5KSB7CisgICAgICAgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICAgICAgICBnc3RfYnVmZmVyX21hcCAoc3ViLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgICAgIEdTVF9NRU1EVU1QX09CSkVDVCAoYXZpLCAiVW5rbm93biBzdHJlYW0gaGVhZGVyIHRhZyIsIG1hcC5kYXRhLAorICAgICAgICAgICAgICBtYXAuc2l6ZSk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc3ViLCAmbWFwKTsKKyAgICAgICAgfQorICAgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICAgIGNhc2UgR1NUX1JJRkZfVEFHX0pVTlE6CisgICAgICBjYXNlIEdTVF9SSUZGX1RBR19KVU5LOgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHN1YiAhPSBOVUxMKSB7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChzdWIpOworICAgICAgc3ViID0gTlVMTDsKKyAgICB9CisgIH0KKworICBpZiAoIWdvdF9zdHJoKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJGYWlsZWQgdG8gZmluZCBzdHJoIGNodW5rIik7CisgICAgZ290byBmYWlsOworICB9CisKKyAgaWYgKCFnb3Rfc3RyZikgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLCAiRmFpbGVkIHRvIGZpbmQgc3RyZiBjaHVuayIpOworICAgIGdvdG8gZmFpbDsKKyAgfQorCisgIC8qIGdldCBjbGFzcyB0byBmaWd1cmUgb3V0IHRoZSB0ZW1wbGF0ZSAqLworICBrbGFzcyA9IEdTVF9FTEVNRU5UX0dFVF9DTEFTUyAoYXZpKTsKKworICAvKiB3ZSBub3cgaGF2ZSBhbGwgaW5mbywgbGV0wrRzIHNldCB1cCBhIHBhZCBhbmQgYSBjYXBzIGFuZCBiZSBkb25lICovCisgIC8qIGNyZWF0ZSBzdHJlYW0gbmFtZSArIHBhZCAqLworICBzd2l0Y2ggKHN0cmVhbS0+c3RyaC0+dHlwZSkgeworICAgIGNhc2UgR1NUX1JJRkZfRkNDX3ZpZHM6eworICAgICAgZ3VpbnQzMiBmb3VyY2M7CisKKyAgICAgIGZvdXJjYyA9IChzdHJlYW0tPnN0cmYudmlkcy0+Y29tcHJlc3Npb24pID8KKyAgICAgICAgICBzdHJlYW0tPnN0cmYudmlkcy0+Y29tcHJlc3Npb24gOiBzdHJlYW0tPnN0cmgtPmZjY19oYW5kbGVyOworICAgICAgY2FwcyA9IGdzdF9yaWZmX2NyZWF0ZV92aWRlb19jYXBzIChmb3VyY2MsIHN0cmVhbS0+c3RyaCwKKyAgICAgICAgICBzdHJlYW0tPnN0cmYudmlkcywgc3RyZWFtLT5leHRyYWRhdGEsIHN0cmVhbS0+aW5pdGRhdGEsICZjb2RlY19uYW1lKTsKKworICAgICAgLyogRFhTQiBpcyBYU1VCLCBhbmQgaXQgaXMgcGxhY2VkIGluc2lkZSBhIHZpZHMgKi8KKyAgICAgIGlmICghY2FwcyB8fCAoZm91cmNjICE9IEdTVF9NQUtFX0ZPVVJDQyAoJ0QnLCAnWCcsICdTJywgJ0InKSAmJgorICAgICAgICAgICAgICBmb3VyY2MgIT0gR1NUX01BS0VfRk9VUkNDICgnRCcsICdYJywgJ1MnLCAnQScpKSkgeworICAgICAgICBwYWRuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgidmlkZW9fJXUiLCBhdmktPm51bV92X3N0cmVhbXMpOworICAgICAgICB0ZW1wbCA9IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLCAidmlkZW9fJXUiKTsKKyAgICAgICAgaWYgKCFjYXBzKSB7CisgICAgICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWF2aS11bmtub3duIiwgImZvdXJjYyIsCisgICAgICAgICAgICAgIEdfVFlQRV9JTlQsIGZvdXJjYywgTlVMTCk7CisgICAgICAgIH0gZWxzZSBpZiAoZ290X3ZwcnAgJiYgdnBycCkgeworICAgICAgICAgIGd1aW50MzIgYXNwZWN0X24sIGFzcGVjdF9kOworICAgICAgICAgIGdpbnQgbiwgZDsKKworICAgICAgICAgIGFzcGVjdF9uID0gdnBycC0+YXNwZWN0ID4+IDE2OworICAgICAgICAgIGFzcGVjdF9kID0gdnBycC0+YXNwZWN0ICYgMHhmZmZmOworICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgcGl4ZWwgYXNwZWN0IHJhdGlvIHVzaW5nIHcvaCBhbmQgYXNwZWN0IHJhdGlvICovCisgICAgICAgICAgbiA9IGFzcGVjdF9uICogc3RyZWFtLT5zdHJmLnZpZHMtPmhlaWdodDsKKyAgICAgICAgICBkID0gYXNwZWN0X2QgKiBzdHJlYW0tPnN0cmYudmlkcy0+d2lkdGg7CisgICAgICAgICAgaWYgKG4gJiYgZCkKKyAgICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iLCBHU1RfVFlQRV9GUkFDVElPTiwKKyAgICAgICAgICAgICAgICBuLCBkLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBjYXBzID0gZ3N0X2F2aV9kZW11eF9jaGVja19jYXBzIChhdmksIHN0cmVhbSwgY2Fwcyk7CisgICAgICAgIHRhZ19uYW1lID0gR1NUX1RBR19WSURFT19DT0RFQzsKKyAgICAgICAgYXZpLT5udW1fdl9zdHJlYW1zKys7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYWRuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic3VicGljdHVyZV8ldSIsIGF2aS0+bnVtX3NwX3N0cmVhbXMpOworICAgICAgICB0ZW1wbCA9IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLCAic3VicGljdHVyZV8ldSIpOworICAgICAgICB0YWdfbmFtZSA9IE5VTEw7CisgICAgICAgIGF2aS0+bnVtX3NwX3N0cmVhbXMrKzsKKyAgICAgICAgc3BhcnNlID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9SSUZGX0ZDQ19hdWRzOnsKKyAgICAgIC8qIEZJWE1FOiBEbyBzb21ldGhpbmcgd2l0aCB0aGUgY2hhbm5lbCByZW9yZGVyIG1hcCAqLworICAgICAgcGFkbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoImF1ZGlvXyV1IiwgYXZpLT5udW1fYV9zdHJlYW1zKTsKKyAgICAgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJhdWRpb18ldSIpOworICAgICAgY2FwcyA9IGdzdF9yaWZmX2NyZWF0ZV9hdWRpb19jYXBzIChzdHJlYW0tPnN0cmYuYXVkcy0+Zm9ybWF0LAorICAgICAgICAgIHN0cmVhbS0+c3RyaCwgc3RyZWFtLT5zdHJmLmF1ZHMsIHN0cmVhbS0+ZXh0cmFkYXRhLAorICAgICAgICAgIHN0cmVhbS0+aW5pdGRhdGEsICZjb2RlY19uYW1lLCBOVUxMKTsKKyAgICAgIGlmICghY2FwcykgeworICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtYXZpLXVua25vd24iLCAiY29kZWNfaWQiLAorICAgICAgICAgICAgR19UWVBFX0lOVCwgc3RyZWFtLT5zdHJmLmF1ZHMtPmZvcm1hdCwgTlVMTCk7CisgICAgICB9CisgICAgICB0YWdfbmFtZSA9IEdTVF9UQUdfQVVESU9fQ09ERUM7CisgICAgICBhdmktPm51bV9hX3N0cmVhbXMrKzsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9SSUZGX0ZDQ19pYXZzOnsKKyAgICAgIGd1aW50MzIgZm91cmNjID0gc3RyZWFtLT5zdHJoLT5mY2NfaGFuZGxlcjsKKworICAgICAgcGFkbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInZpZGVvXyV1IiwgYXZpLT5udW1fdl9zdHJlYW1zKTsKKyAgICAgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJ2aWRlb18ldSIpOworICAgICAgY2FwcyA9IGdzdF9yaWZmX2NyZWF0ZV9pYXZzX2NhcHMgKGZvdXJjYywgc3RyZWFtLT5zdHJoLAorICAgICAgICAgIHN0cmVhbS0+c3RyZi5pYXZzLCBzdHJlYW0tPmV4dHJhZGF0YSwgc3RyZWFtLT5pbml0ZGF0YSwgJmNvZGVjX25hbWUpOworICAgICAgaWYgKCFjYXBzKSB7CisgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1hdmktdW5rbm93biIsICJmb3VyY2MiLAorICAgICAgICAgICAgR19UWVBFX0lOVCwgZm91cmNjLCBOVUxMKTsKKyAgICAgIH0KKyAgICAgIHRhZ19uYW1lID0gR1NUX1RBR19WSURFT19DT0RFQzsKKyAgICAgIGF2aS0+bnVtX3Zfc3RyZWFtcysrOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1JJRkZfRkNDX3R4dHM6eworICAgICAgcGFkbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInN1YnRpdGxlXyV1IiwgYXZpLT5udW1fdF9zdHJlYW1zKTsKKyAgICAgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJzdWJ0aXRsZV8ldSIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXN1YnRpdGxlLWF2aSIpOworICAgICAgdGFnX25hbWUgPSBOVUxMOworICAgICAgYXZpLT5udW1fdF9zdHJlYW1zKys7CisgICAgICBzcGFyc2UgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBnX3JldHVybl92YWxfaWZfcmVhY2hlZCAoRkFMU0UpOworICB9CisKKyAgLyogbm8gY2FwcyBtZWFucyBubyBzdHJlYW0gKi8KKyAgaWYgKCFjYXBzKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZWxlbWVudCwgIkRpZCBub3QgZmluZCBjYXBzIGZvciBzdHJlYW0gJXMiLCBwYWRuYW1lKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChlbGVtZW50LCAiY29kZWMtbmFtZT0lcyIsIGNvZGVjX25hbWUgPyBjb2RlY19uYW1lIDogIk5VTEwiKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoZWxlbWVudCwgImNhcHM9JSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIC8qIHNldCBwcm9wZXIgc2V0dGluZ3MgYW5kIGFkZCBpdCAqLworICBpZiAoc3RyZWFtLT5wYWQpCisgICAgZ3N0X29iamVjdF91bnJlZiAoc3RyZWFtLT5wYWQpOworICBwYWQgPSBzdHJlYW0tPnBhZCA9IGdzdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKHRlbXBsLCBwYWRuYW1lKTsKKyAgZ19mcmVlIChwYWRuYW1lKTsKKworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChwYWQpOworI2lmIDAKKyAgZ3N0X3BhZF9zZXRfZm9ybWF0c19mdW5jdGlvbiAocGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdmlfZGVtdXhfZ2V0X3NyY19mb3JtYXRzKSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X21hc2tfZnVuY3Rpb24gKHBhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXZpX2RlbXV4X2dldF9ldmVudF9tYXNrKSk7CisjZW5kaWYKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHBhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfZXZlbnQpKTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHBhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXZpX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpKTsKKyNpZiAwCisgIGdzdF9wYWRfc2V0X2NvbnZlcnRfZnVuY3Rpb24gKHBhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXZpX2RlbXV4X3NyY19jb252ZXJ0KSk7CisjZW5kaWYKKworICBzdHJlYW0tPm51bSA9IGF2aS0+bnVtX3N0cmVhbXM7CisKKyAgc3RyZWFtLT5zdGFydF9lbnRyeSA9IDA7CisgIHN0cmVhbS0+c3RlcF9lbnRyeSA9IDA7CisgIHN0cmVhbS0+c3RvcF9lbnRyeSA9IDA7CisKKyAgc3RyZWFtLT5jdXJyZW50X2VudHJ5ID0gLTE7CisgIHN0cmVhbS0+Y3VycmVudF90b3RhbCA9IDA7CisKKyAgc3RyZWFtLT5kaXNjb250ID0gVFJVRTsKKworICBzdHJlYW0tPnRvdGFsX2J5dGVzID0gMDsKKyAgc3RyZWFtLT50b3RhbF9ibG9ja3MgPSAwOworICBzdHJlYW0tPm5fa2V5ZnJhbWVzID0gMDsKKworICBzdHJlYW0tPmlkeF9uID0gMDsKKyAgc3RyZWFtLT5pZHhfbWF4ID0gMDsKKworICBnc3RfcGFkX3NldF9lbGVtZW50X3ByaXZhdGUgKHBhZCwgc3RyZWFtKTsKKyAgYXZpLT5udW1fc3RyZWFtcysrOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAocGFkLCBUUlVFKTsKKyAgc3RyZWFtX2lkID0KKyAgICAgIGdzdF9wYWRfY3JlYXRlX3N0cmVhbV9pZF9wcmludGYgKHBhZCwgR1NUX0VMRU1FTlRfQ0FTVCAoYXZpKSwgIiUwM3UiLAorICAgICAgYXZpLT5udW1fc3RyZWFtcyk7CisKKyAgZXZlbnQgPSBnc3RfcGFkX2dldF9zdGlja3lfZXZlbnQgKGF2aS0+c2lua3BhZCwgR1NUX0VWRU5UX1NUUkVBTV9TVEFSVCwgMCk7CisgIGlmIChldmVudCkgeworICAgIGlmIChnc3RfZXZlbnRfcGFyc2VfZ3JvdXBfaWQgKGV2ZW50LCAmYXZpLT5ncm91cF9pZCkpCisgICAgICBhdmktPmhhdmVfZ3JvdXBfaWQgPSBUUlVFOworICAgIGVsc2UKKyAgICAgIGF2aS0+aGF2ZV9ncm91cF9pZCA9IEZBTFNFOworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICB9IGVsc2UgaWYgKCFhdmktPmhhdmVfZ3JvdXBfaWQpIHsKKyAgICBhdmktPmhhdmVfZ3JvdXBfaWQgPSBUUlVFOworICAgIGF2aS0+Z3JvdXBfaWQgPSBnc3RfdXRpbF9ncm91cF9pZF9uZXh0ICgpOworICB9CisKKyAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoc3RyZWFtX2lkKTsKKyAgaWYgKGF2aS0+aGF2ZV9ncm91cF9pZCkKKyAgICBnc3RfZXZlbnRfc2V0X2dyb3VwX2lkIChldmVudCwgYXZpLT5ncm91cF9pZCk7CisgIGlmIChzcGFyc2UpCisgICAgZ3N0X2V2ZW50X3NldF9zdHJlYW1fZmxhZ3MgKGV2ZW50LCBHU1RfU1RSRUFNX0ZMQUdfU1BBUlNFKTsKKworICBnc3RfcGFkX3B1c2hfZXZlbnQgKHBhZCwgZXZlbnQpOworICBnX2ZyZWUgKHN0cmVhbV9pZCk7CisgIGdzdF9wYWRfc2V0X2NhcHMgKHBhZCwgY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAvKiBtYWtlIHRhZ3MgKi8KKyAgaWYgKGNvZGVjX25hbWUgJiYgdGFnX25hbWUpIHsKKyAgICBpZiAoIXN0cmVhbS0+dGFnbGlzdCkKKyAgICAgIHN0cmVhbS0+dGFnbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisKKyAgICBhdmktPmdvdF90YWdzID0gVFJVRTsKKworICAgIGdzdF90YWdfbGlzdF9hZGQgKHN0cmVhbS0+dGFnbGlzdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsIHRhZ19uYW1lLAorICAgICAgICBjb2RlY19uYW1lLCBOVUxMKTsKKyAgfQorCisgIGdfZnJlZSAodnBycCk7CisgIGdfZnJlZSAoY29kZWNfbmFtZSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitmYWlsOgorICB7CisgICAgLyogdW5yZWYgYW55IG1lbSB0aGF0IG1heSBiZSBpbiB1c2UgKi8KKyAgICBpZiAoYnVmKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICBpZiAoc3ViKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoc3ViKTsKKyAgICBnX2ZyZWUgKHZwcnApOworICAgIGdfZnJlZSAoY29kZWNfbmFtZSk7CisgICAgZ3N0X2F2aV9kZW11eF9yZXNldF9zdHJlYW0gKGF2aSwgc3RyZWFtKTsKKyAgICBhdmktPm51bV9zdHJlYW1zKys7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qCisgKiBnc3RfYXZpX2RlbXV4X3BhcnNlX29kbWw6CisgKiBAYXZpOiBjYWxsaW5nIGVsZW1lbnQgKHVzZWQgZm9yIGRlYnVnL2Vycm9yKS4KKyAqIEBidWY6IGlucHV0IGJ1ZmZlciB0byBiZSB1c2VkIGZvciBwYXJzaW5nLgorICoKKyAqIFJlYWQgYW4gb3BlbkRNTC0yLjAgZXh0ZW5zaW9uIGhlYWRlci4gRmlsbHMgaW4gdGhlIGZyYW1lIG51bWJlcgorICogaW4gdGhlIGF2aSBkZW11eGVyIG9iamVjdCB3aGVuIHJlYWRpbmcgc3VjY2VlZHMuCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfYXZpX2RlbXV4X3BhcnNlX29kbWwgKEdzdEF2aURlbXV4ICogYXZpLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIGd1aW50MzIgdGFnID0gMDsKKyAgZ3VpbnQgb2Zmc2V0ID0gNDsKKyAgR3N0QnVmZmVyICpzdWIgPSBOVUxMOworCisgIHdoaWxlIChnc3RfcmlmZl9wYXJzZV9jaHVuayAoR1NUX0VMRU1FTlRfQ0FTVCAoYXZpKSwgYnVmLCAmb2Zmc2V0LCAmdGFnLAorICAgICAgICAgICZzdWIpKSB7CisgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgIGNhc2UgR1NUX1JJRkZfVEFHX2RtbGg6eworICAgICAgICBnc3RfcmlmZl9kbWxoIGRtbGgsICpfZG1saDsKKyAgICAgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICAgICAgLyogc3ViID09IE5VTEwgaXMgcG9zc2libGUgYW5kIG1lYW5zIGFuIGVtcHR5IGJ1ZmZlciAqLworICAgICAgICBpZiAoc3ViID09IE5VTEwpCisgICAgICAgICAgZ290byBuZXh0OworCisgICAgICAgIGdzdF9idWZmZXJfbWFwIChzdWIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgICAgICAgLyogY2hlY2sgc2l6ZSAqLworICAgICAgICBpZiAobWFwLnNpemUgPCBzaXplb2YgKGdzdF9yaWZmX2RtbGgpKSB7CisgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoYXZpLAorICAgICAgICAgICAgICAiRE1MSCBlbnRyeSBpcyB0b28gc21hbGwgKCUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMsICVkIG5lZWRlZCkiLAorICAgICAgICAgICAgICBtYXAuc2l6ZSwgKGludCkgc2l6ZW9mIChnc3RfcmlmZl9kbWxoKSk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc3ViLCAmbWFwKTsKKyAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgIH0KKyAgICAgICAgX2RtbGggPSAoZ3N0X3JpZmZfZG1saCAqKSBtYXAuZGF0YTsKKyAgICAgICAgZG1saC50b3RhbGZyYW1lcyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoJl9kbWxoLT50b3RhbGZyYW1lcyk7CisgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHN1YiwgJm1hcCk7CisKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChhdmksICJkbWxoIHRhZyBmb3VuZDogdG90YWxmcmFtZXM6ICV1IiwKKyAgICAgICAgICAgIGRtbGgudG90YWxmcmFtZXMpOworCisgICAgICAgIGF2aS0+YXZpaC0+dG90X2ZyYW1lcyA9IGRtbGgudG90YWxmcmFtZXM7CisgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksCisgICAgICAgICAgICAiVW5rbm93biB0YWcgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiBpbiBPRE1MIGhlYWRlciIsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHRhZykpOworICAgICAgICAvKiBPbmx5IGdldCBidWZmZXIgZm9yIGRlYnVnZ2luZyBpZiB0aGUgbWVtZHVtcCBpcyBuZWVkZWQgICovCisgICAgICAgIGlmIChnc3RfZGVidWdfY2F0ZWdvcnlfZ2V0X3RocmVzaG9sZCAoR1NUX0NBVF9ERUZBVUxUKSA+PSA5KSB7CisgICAgICAgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICAgICAgICBnc3RfYnVmZmVyX21hcCAoc3ViLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgICAgIEdTVF9NRU1EVU1QX09CSkVDVCAoYXZpLCAiVW5rbm93biBPRE1MIHRhZyIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc3ViLCAmbWFwKTsKKyAgICAgICAgfQorICAgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICAgIGNhc2UgR1NUX1JJRkZfVEFHX0pVTlE6CisgICAgICBjYXNlIEdTVF9SSUZGX1RBR19KVU5LOgorICAgICAgbmV4dDoKKyAgICAgICAgLyogc2tpcCBhbmQgbW92ZSB0byBuZXh0IGNodW5rICovCisgICAgICAgIGlmIChzdWIpIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChzdWIpOworICAgICAgICAgIHN1YiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChidWYpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKK30KKworLyogSW5kZXggaGVscGVyICovCitzdGF0aWMgZ3VpbnQKK2dzdF9hdmlfZGVtdXhfaW5kZXhfbGFzdCAoR3N0QXZpRGVtdXggKiBhdmksIEdzdEF2aVN0cmVhbSAqIHN0cmVhbSkKK3sKKyAgcmV0dXJuIHN0cmVhbS0+aWR4X247Cit9CisKKy8qIGZpbmQgYSBwcmV2aW91cyBlbnRyeSBpbiB0aGUgaW5kZXggd2l0aCB0aGUgZ2l2ZW4gZmxhZ3MgKi8KK3N0YXRpYyBndWludAorZ3N0X2F2aV9kZW11eF9pbmRleF9wcmV2IChHc3RBdmlEZW11eCAqIGF2aSwgR3N0QXZpU3RyZWFtICogc3RyZWFtLAorICAgIGd1aW50IGxhc3QsIGdib29sZWFuIGtleWZyYW1lKQoreworICBHc3RBdmlJbmRleEVudHJ5ICplbnRyeTsKKyAgZ3VpbnQgaTsKKworICBmb3IgKGkgPSBsYXN0OyBpID4gMDsgaS0tKSB7CisgICAgZW50cnkgPSAmc3RyZWFtLT5pbmRleFtpIC0gMV07CisgICAgaWYgKCFrZXlmcmFtZSB8fCBFTlRSWV9JU19LRVlGUkFNRSAoZW50cnkpKSB7CisgICAgICByZXR1cm4gaSAtIDE7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgZ3VpbnQKK2dzdF9hdmlfZGVtdXhfaW5kZXhfbmV4dCAoR3N0QXZpRGVtdXggKiBhdmksIEdzdEF2aVN0cmVhbSAqIHN0cmVhbSwKKyAgICBndWludCBsYXN0LCBnYm9vbGVhbiBrZXlmcmFtZSkKK3sKKyAgR3N0QXZpSW5kZXhFbnRyeSAqZW50cnk7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSBsYXN0ICsgMTsgaSA8IHN0cmVhbS0+aWR4X247IGkrKykgeworICAgIGVudHJ5ID0gJnN0cmVhbS0+aW5kZXhbaV07CisgICAgaWYgKCFrZXlmcmFtZSB8fCBFTlRSWV9JU19LRVlGUkFNRSAoZW50cnkpKSB7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0cmVhbS0+aWR4X24gLSAxOworfQorCitzdGF0aWMgZ3VpbnQKK2dzdF9hdmlfZGVtdXhfaW5kZXhfZW50cnlfc2VhcmNoIChHc3RBdmlJbmRleEVudHJ5ICogZW50cnksIGd1aW50NjQgKiB0b3RhbCkKK3sKKyAgaWYgKGVudHJ5LT50b3RhbCA8ICp0b3RhbCkKKyAgICByZXR1cm4gLTE7CisgIGVsc2UgaWYgKGVudHJ5LT50b3RhbCA+ICp0b3RhbCkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBnc3RfYXZpX2RlbXV4X2luZGV4X2Zvcl90aW1lOgorICogQGF2aTogQXZpIG9iamVjdAorICogQHN0cmVhbTogdGhlIHN0cmVhbQorICogQHRpbWU6IGEgdGltZSBwb3NpdGlvbgorICogQG5leHQ6IHdoZXRoZXIgdG8gbG9vayBmb3IgZW50cnkgYmVmb3JlIG9yIGFmdGVyIEB0aW1lCisgKgorICogRmluZHMgdGhlIGluZGV4IGVudHJ5IHdoaWNoIHRpbWUgaXMgbGVzcy9tb3JlIG9yIGVxdWFsIHRoYW4gdGhlIHJlcXVlc3RlZCB0aW1lLgorICogVHJ5IHRvIGF2b2lkIGJpbmFyeSBzZWFyY2ggd2hlbiB3ZSBjYW4gY29udmVydCB0aGUgdGltZSB0byBhbiBpbmRleAorICogcG9zaXRpb24gZGlyZWN0bHkgKGZvciBleGFtcGxlIGZvciB2aWRlbyBmcmFtZXMgd2l0aCBhIGZpeGVkIGR1cmF0aW9uKS4KKyAqCisgKiBSZXR1cm5zOiB0aGUgZm91bmQgcG9zaXRpb24gaW4gdGhlIGluZGV4LgorICovCitzdGF0aWMgZ3VpbnQKK2dzdF9hdmlfZGVtdXhfaW5kZXhfZm9yX3RpbWUgKEdzdEF2aURlbXV4ICogYXZpLAorICAgIEdzdEF2aVN0cmVhbSAqIHN0cmVhbSwgZ3VpbnQ2NCB0aW1lLCBnYm9vbGVhbiBuZXh0KQoreworICBndWludCBpbmRleCA9IC0xOworICBndWludDY0IHRvdGFsOworCisgIEdTVF9MT0dfT0JKRUNUIChhdmksICJzZWFyY2ggdGltZTolIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHRpbWUpKTsKKworICAvKiBlYXN5IChhbmQgY29tbW9uKSBjYXNlcyAqLworICBpZiAodGltZSA9PSAwIHx8IHN0cmVhbS0+aWR4X24gPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHRpbWUgPj0gc3RyZWFtLT5pZHhfZHVyYXRpb24pCisgICAgcmV0dXJuIHN0cmVhbS0+aWR4X24gLSAxOworCisgIC8qIGZpZ3VyZSBvdXQgd2hlcmUgd2UgbmVlZCB0byBnby4gRm9yIHRoYXQgd2UgY29udmVydCB0aGUgdGltZSB0byBhbgorICAgKiBpbmRleCBlbnRyeSBvciB3ZSBjb252ZXJ0IGl0IHRvIGEgdG90YWwgYW5kIHRoZW4gZG8gYSBiaW5hcnkgc2VhcmNoLiAqLworICBpZiAoc3RyZWFtLT5pc192YnIpIHsKKyAgICAvKiBWQlIgc3RyZWFtIG5leHQgdGltZXN0YW1wICovCisgICAgaWYgKHN0cmVhbS0+c3RyaC0+dHlwZSA9PSBHU1RfUklGRl9GQ0NfYXVkcykgeworICAgICAgdG90YWwgPSBhdmlfc3RyZWFtX2NvbnZlcnRfdGltZV90b19mcmFtZXNfdW5jaGVja2VkIChzdHJlYW0sIHRpbWUpOworICAgIH0gZWxzZSB7CisgICAgICBpbmRleCA9IGF2aV9zdHJlYW1fY29udmVydF90aW1lX3RvX2ZyYW1lc191bmNoZWNrZWQgKHN0cmVhbSwgdGltZSk7CisgICAgICAvKiB0aGlzIGVudHJ5IHR5cGljYWxseSB1bmRlcnNob290cyB0aGUgdGFyZ2V0IHRpbWUsCisgICAgICAgKiBzbyBjaGVjayBhIGJpdCBtb3JlIGlmIG5leHQgbmVlZGVkICovCisgICAgICBpZiAobmV4dCAmJiBpbmRleCAhPSAtMSkgeworICAgICAgICBHc3RDbG9ja1RpbWUgaXRpbWUgPQorICAgICAgICAgICAgYXZpX3N0cmVhbV9jb252ZXJ0X2ZyYW1lc190b190aW1lX3VuY2hlY2tlZCAoc3RyZWFtLCBpbmRleCk7CisgICAgICAgIGlmIChpdGltZSA8IHRpbWUgJiYgaW5kZXggKyAxIDwgc3RyZWFtLT5pZHhfbikKKyAgICAgICAgICBpbmRleCsrOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmIChzdHJlYW0tPnN0cmgtPnR5cGUgPT0gR1NUX1JJRkZfRkNDX2F1ZHMpIHsKKyAgICAvKiBjb25zdGFudCByYXRlIHN0cmVhbSAqLworICAgIHRvdGFsID0gYXZpX3N0cmVhbV9jb252ZXJ0X3RpbWVfdG9fYnl0ZXNfdW5jaGVja2VkIChzdHJlYW0sIHRpbWUpOworICB9IGVsc2UKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKGluZGV4ID09IC0xKSB7CisgICAgR3N0QXZpSW5kZXhFbnRyeSAqZW50cnk7CisKKyAgICAvKiBubyBpbmRleCwgZmluZCBpbmRleCB3aXRoIGJpbmFyeSBzZWFyY2ggb24gdG90YWwgKi8KKyAgICBHU1RfTE9HX09CSkVDVCAoYXZpLCAiYmluYXJ5IHNlYXJjaCBmb3IgZW50cnkgd2l0aCB0b3RhbCAlIgorICAgICAgICBHX0dVSU5UNjRfRk9STUFULCB0b3RhbCk7CisKKyAgICBlbnRyeSA9IGdzdF91dGlsX2FycmF5X2JpbmFyeV9zZWFyY2ggKHN0cmVhbS0+aW5kZXgsCisgICAgICAgIHN0cmVhbS0+aWR4X24sIHNpemVvZiAoR3N0QXZpSW5kZXhFbnRyeSksCisgICAgICAgIChHQ29tcGFyZURhdGFGdW5jKSBnc3RfYXZpX2RlbXV4X2luZGV4X2VudHJ5X3NlYXJjaCwKKyAgICAgICAgbmV4dCA/IEdTVF9TRUFSQ0hfTU9ERV9BRlRFUiA6IEdTVF9TRUFSQ0hfTU9ERV9CRUZPUkUsICZ0b3RhbCwgTlVMTCk7CisKKyAgICBpZiAoZW50cnkgPT0gTlVMTCkgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKGF2aSwgIm5vdCBmb3VuZCwgYXNzdW1lIGluZGV4IDAiKTsKKyAgICAgIGluZGV4ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZXggPSBlbnRyeSAtIHN0cmVhbS0+aW5kZXg7CisgICAgICBHU1RfTE9HX09CSkVDVCAoYXZpLCAiZm91bmQgYXQgJXUiLCBpbmRleCk7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9MT0dfT0JKRUNUIChhdmksICJjb252ZXJ0ZWQgdGltZSB0byBpbmRleCAldSIsIGluZGV4KTsKKyAgfQorCisgIHJldHVybiBpbmRleDsKK30KKworc3RhdGljIGlubGluZSBHc3RBdmlTdHJlYW0gKgorZ3N0X2F2aV9kZW11eF9zdHJlYW1fZm9yX2lkIChHc3RBdmlEZW11eCAqIGF2aSwgZ3VpbnQzMiBpZCkKK3sKKyAgZ3VpbnQgc3RyZWFtX25yOworICBHc3RBdmlTdHJlYW0gKnN0cmVhbTsKKworICAvKiBnZXQgdGhlIHN0cmVhbSBmb3IgdGhpcyBlbnRyeSAqLworICBzdHJlYW1fbnIgPSBDSFVOS0lEX1RPX1NUUkVBTU5SIChpZCk7CisgIGlmIChHX1VOTElLRUxZIChzdHJlYW1fbnIgPj0gYXZpLT5udW1fc3RyZWFtcykpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwKKyAgICAgICAgImludmFsaWQgc3RyZWFtIG5yICVkICgweCUwOHgsICUiIEdTVF9GT1VSQ0NfRk9STUFUICIpIiwgc3RyZWFtX25yLCBpZCwKKyAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChpZCkpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHN0cmVhbSA9ICZhdmktPnN0cmVhbVtzdHJlYW1fbnJdOworICBpZiAoR19VTkxJS0VMWSAoIXN0cmVhbS0+c3RyaCkpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwgIlVuaGFuZGxlZCBzdHJlYW0gJWQsIHNraXBwaW5nIiwgc3RyZWFtX25yKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gc3RyZWFtOworfQorCisvKgorICogZ3N0X2F2aV9kZW11eF9wYXJzZV9pbmRleDoKKyAqIEBhdmk6IGNhbGxpbmcgZWxlbWVudCAodXNlZCBmb3IgZGVidWdnaW5nL2Vycm9ycykuCisgKiBAYnVmOiBidWZmZXIgY29udGFpbmluZyB0aGUgZnVsbCBpbmRleC4KKyAqCisgKiBSZWFkIGluZGV4IGVudHJpZXMgZnJvbSB0aGUgcHJvdmlkZWQgYnVmZmVyLgorICogVGhlIGJ1ZmZlciBzaG91bGQgY29udGFpbiBhIEdTVF9SSUZGX1RBR19pZHgxIGNodW5rLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdmlfZGVtdXhfcGFyc2VfaW5kZXggKEdzdEF2aURlbXV4ICogYXZpLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludCBpLCBudW0sIG47CisgIGdzdF9yaWZmX2luZGV4X2VudHJ5ICppbmRleDsKKyAgR3N0Q2xvY2tUaW1lIHN0YW1wOworICBHc3RBdmlTdHJlYW0gKnN0cmVhbTsKKyAgR3N0QXZpSW5kZXhFbnRyeSBlbnRyeTsKKyAgZ3VpbnQzMiBpZDsKKworICBpZiAoIWJ1ZikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICBzdGFtcCA9IGdzdF91dGlsX2dldF90aW1lc3RhbXAgKCk7CisKKyAgLyogc2VlIGhvdyBtYW55IGl0ZW1zIGluIHRoZSBpbmRleCAqLworICBudW0gPSBtYXAuc2l6ZSAvIHNpemVvZiAoZ3N0X3JpZmZfaW5kZXhfZW50cnkpOworICBpZiAobnVtID09IDApCisgICAgZ290byBlbXB0eV9saXN0OworCisgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAiUGFyc2luZyBpbmRleCwgbnJfZW50cmllcyA9ICU2ZCIsIG51bSk7CisKKyAgaW5kZXggPSAoZ3N0X3JpZmZfaW5kZXhfZW50cnkgKikgbWFwLmRhdGE7CisKKyAgLyogZmlndXJlIG91dCBpZiB0aGUgaW5kZXggaXMgMCBiYXNlZCBvciByZWxhdGl2ZSB0byB0aGUgTU9WSSBzdGFydCAqLworICBlbnRyeS5vZmZzZXQgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKCZpbmRleFswXS5vZmZzZXQpOworICBpZiAoZW50cnkub2Zmc2V0IDwgYXZpLT5vZmZzZXQpIHsKKyAgICBhdmktPmluZGV4X29mZnNldCA9IGF2aS0+b2Zmc2V0ICsgODsKKyAgICBHU1RfREVCVUcgKCJpbmRleF9vZmZzZXQgPSAlIiBHX0dVSU5UNjRfRk9STUFULCBhdmktPmluZGV4X29mZnNldCk7CisgIH0gZWxzZSB7CisgICAgYXZpLT5pbmRleF9vZmZzZXQgPSAwOworICAgIEdTVF9ERUJVRyAoImluZGV4IGlzIDAgYmFzZWQiKTsKKyAgfQorCisgIGZvciAoaSA9IDAsIG4gPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICBpZCA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoJmluZGV4W2ldLmlkKTsKKyAgICBlbnRyeS5vZmZzZXQgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKCZpbmRleFtpXS5vZmZzZXQpOworCisgICAgLyogc29tZSBzYW5pdHkgY2hlY2tzICovCisgICAgaWYgKEdfVU5MSUtFTFkgKGlkID09IEdTVF9SSUZGX3JlYyB8fCBpZCA9PSAwIHx8CisgICAgICAgICAgICAoZW50cnkub2Zmc2V0ID09IDAgJiYgbiA+IDApKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogZ2V0IHRoZSBzdHJlYW0gZm9yIHRoaXMgZW50cnkgKi8KKyAgICBzdHJlYW0gPSBnc3RfYXZpX2RlbXV4X3N0cmVhbV9mb3JfaWQgKGF2aSwgaWQpOworICAgIGlmIChHX1VOTElLRUxZICghc3RyZWFtKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogaGFuZGxlIG9mZnNldCBhbmQgc2l6ZSAqLworICAgIGVudHJ5Lm9mZnNldCArPSBhdmktPmluZGV4X29mZnNldCArIDg7CisgICAgZW50cnkuc2l6ZSA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoJmluZGV4W2ldLnNpemUpOworCisgICAgLyogaGFuZGxlIGZsYWdzICovCisgICAgaWYgKHN0cmVhbS0+c3RyaC0+dHlwZSA9PSBHU1RfUklGRl9GQ0NfYXVkcykgeworICAgICAgLyogYWxsIGF1ZGlvIGZyYW1lcyBhcmUga2V5ZnJhbWVzICovCisgICAgICBFTlRSWV9TRVRfS0VZRlJBTUUgKCZlbnRyeSk7CisgICAgfSBlbHNlIGlmIChzdHJlYW0tPnN0cmgtPnR5cGUgPT0gR1NUX1JJRkZfRkNDX3ZpZHMgJiYKKyAgICAgICAgc3RyZWFtLT5zdHJmLnZpZHMtPmNvbXByZXNzaW9uID09IEdTVF9SSUZGX0RYU0IpIHsKKyAgICAgIC8qIGFsbCB4c3ViIGZyYW1lcyBhcmUga2V5ZnJhbWVzICovCisgICAgICBFTlRSWV9TRVRfS0VZRlJBTUUgKCZlbnRyeSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGd1aW50MzIgZmxhZ3M7CisgICAgICAvKiBlbHNlIHJlYWQgZmxhZ3MgKi8KKyAgICAgIGZsYWdzID0gR1NUX1JFQURfVUlOVDMyX0xFICgmaW5kZXhbaV0uZmxhZ3MpOworICAgICAgaWYgKGZsYWdzICYgR1NUX1JJRkZfSUZfS0VZRlJBTUUpIHsKKyAgICAgICAgRU5UUllfU0VUX0tFWUZSQU1FICgmZW50cnkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRU5UUllfVU5TRVRfS0VZRlJBTUUgKCZlbnRyeSk7CisgICAgICB9CisgICAgfQorCisgICAgLyogYW5kIGFkZCAqLworICAgIGlmIChHX1VOTElLRUxZICghZ3N0X2F2aV9kZW11eF9hZGRfaW5kZXggKGF2aSwgc3RyZWFtLCBudW0sICZlbnRyeSkpKQorICAgICAgZ290byBvdXRfb2ZfbWVtOworCisgICAgbisrOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgLyogZ2V0IHN0cmVhbSBzdGF0cyBub3cgKi8KKyAgYXZpLT5oYXZlX2luZGV4ID0gZ3N0X2F2aV9kZW11eF9kb19pbmRleF9zdGF0cyAoYXZpKTsKKworICBzdGFtcCA9IGdzdF91dGlsX2dldF90aW1lc3RhbXAgKCkgLSBzdGFtcDsKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiaW5kZXggcGFyc2luZyB0b29rICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHN0YW1wKSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitlbXB0eV9saXN0OgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiZW1wdHkgaW5kZXgiKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitvdXRfb2ZfbWVtOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgUkVTT1VSQ0UsIE5PX1NQQUNFX0xFRlQsIChOVUxMKSwKKyAgICAgICAgKCJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciAldSoldT0ldSBieXRlcyIsCisgICAgICAgICAgICAoZ3VpbnQpIHNpemVvZiAoR3N0QXZpSW5kZXhFbnRyeSksIG51bSwKKyAgICAgICAgICAgIChndWludCkgc2l6ZW9mIChHc3RBdmlJbmRleEVudHJ5KSAqIG51bSkpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyoKKyAqIGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4OgorICogQGF2aTogYXZpIGRlbXV4ZXIgb2JqZWN0LgorICoKKyAqIFNlZWtzIHRvIGluZGV4IGFuZCByZWFkcyBpdC4KKyAqLworc3RhdGljIHZvaWQKK2dzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4IChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIGd1aW50NjQgb2Zmc2V0ID0gYXZpLT5vZmZzZXQ7CisgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKyAgZ3VpbnQzMiB0YWc7CisgIGd1aW50MzIgc2l6ZTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgR1NUX0RFQlVHICgiZGVtdXggc3RyZWFtIGluZGV4IGF0IG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFULCBvZmZzZXQpOworCisgIC8qIGdldCBjaHVuayBpbmZvcm1hdGlvbiAqLworICByZXMgPSBnc3RfcGFkX3B1bGxfcmFuZ2UgKGF2aS0+c2lua3BhZCwgb2Zmc2V0LCA4LCAmYnVmKTsKKyAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIHB1bGxfZmFpbGVkOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGlmIChtYXAuc2l6ZSA8IDgpCisgICAgZ290byB0b29fc21hbGw7CisKKyAgLyogY2hlY2sgdGFnIGZpcnN0IGJlZm9yZSBibGluZHkgdHJ5aW5nIHRvIHJlYWQgJ3NpemUnIGJ5dGVzICovCisgIHRhZyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAobWFwLmRhdGEpOworICBzaXplID0gR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSArIDQpOworICBpZiAodGFnID09IEdTVF9SSUZGX1RBR19MSVNUKSB7CisgICAgLyogdGhpcyBpcyB0aGUgbW92aSB0YWcgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJza2lwIExJU1QgY2h1bmssIHNpemUgJSIgR19HVUlOVDMyX0ZPUk1BVCwKKyAgICAgICAgKDggKyBHU1RfUk9VTkRfVVBfMiAoc2l6ZSkpKTsKKyAgICBvZmZzZXQgKz0gOCArIEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgICBidWYgPSBOVUxMOworICAgIHJlcyA9IGdzdF9wYWRfcHVsbF9yYW5nZSAoYXZpLT5zaW5rcGFkLCBvZmZzZXQsIDgsICZidWYpOworICAgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIHB1bGxfZmFpbGVkOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBpZiAobWFwLnNpemUgPCA4KQorICAgICAgZ290byB0b29fc21hbGw7CisKKyAgICB0YWcgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKG1hcC5kYXRhKTsKKyAgICBzaXplID0gR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSArIDQpOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgaWYgKHRhZyAhPSBHU1RfUklGRl9UQUdfaWR4MSkKKyAgICBnb3RvIG5vX2luZGV4OworICBpZiAoIXNpemUpCisgICAgZ290byB6ZXJvX2luZGV4OworCisgIEdTVF9ERUJVRyAoImluZGV4IGZvdW5kIGF0IG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFULCBvZmZzZXQpOworCisgIC8qIHJlYWQgY2h1bmssIGFkdmFuY2Ugb2Zmc2V0ICovCisgIGlmIChnc3RfcmlmZl9yZWFkX2NodW5rIChHU1RfRUxFTUVOVF9DQVNUIChhdmkpLAorICAgICAgICAgIGF2aS0+c2lua3BhZCwgJm9mZnNldCwgJnRhZywgJmJ1ZikgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuOworCisgIEdTVF9ERUJVRyAoIndpbGwgcGFyc2UgaW5kZXggY2h1bmsgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCAiIGZvciB0YWcgJSIKKyAgICAgIEdTVF9GT1VSQ0NfRk9STUFULCBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpLCBHU1RfRk9VUkNDX0FSR1MgKHRhZykpOworCisgIGdzdF9hdmlfZGVtdXhfcGFyc2VfaW5kZXggKGF2aSwgYnVmKTsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgLyogZGVidWcgb3VyIGluZGV4ZXMgKi8KKyAgeworICAgIGdpbnQgaTsKKyAgICBHc3RBdmlTdHJlYW0gKnN0cmVhbTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhdmktPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgIHN0cmVhbSA9ICZhdmktPnN0cmVhbVtpXTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInN0cmVhbSAldTogJXUgZnJhbWVzLCAlIiBHX0dJTlQ2NF9GT1JNQVQgIiBieXRlcyIsCisgICAgICAgICAgaSwgc3RyZWFtLT5pZHhfbiwgc3RyZWFtLT50b3RhbF9ieXRlcyk7CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworcHVsbF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksCisgICAgICAgICJwdWxsIHJhbmdlIGZhaWxlZDogcG9zPSUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBzaXplPTgiLCBvZmZzZXQpOworICAgIHJldHVybjsKKyAgfQordG9vX3NtYWxsOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiQnVmZmVyIGlzIHRvbyBzbWFsbCIpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm47CisgIH0KK25vX2luZGV4OgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksCisgICAgICAgICJObyBpbmRleCBkYXRhIChpZHgxKSBhZnRlciBtb3ZpIGNodW5rLCBidXQgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSk7CisgICAgcmV0dXJuOworICB9Cit6ZXJvX2luZGV4OgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJFbXB0eSBpbmRleCBkYXRhIChpZHgxKSBhZnRlciBtb3ZpIGNodW5rIik7CisgICAgcmV0dXJuOworICB9Cit9CisKKy8qCisgKiBnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleF9wdXNoOgorICogQGF2aTogYXZpIGRlbXV4ZXIgb2JqZWN0LgorICoKKyAqIFJlYWQgaW5kZXguCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbmRleF9wdXNoIChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgZ3VpbnQ2NCBvZmZzZXQgPSBhdmktPmlkeDFfb2Zmc2V0OworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgZ3VpbnQzMiB0YWc7CisgIGd1aW50MzIgc2l6ZTsKKworICBHU1RfREVCVUcgKCJkZW11eCBzdHJlYW0gaW5kZXggYXQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG9mZnNldCk7CisKKyAgLyogZ2V0IGNodW5rIGluZm9ybWF0aW9uICovCisgIGlmICghZ3N0X2F2aV9kZW11eF9wZWVrX2NodW5rIChhdmksICZ0YWcsICZzaXplKSkKKyAgICByZXR1cm47CisKKyAgLyogY2hlY2sgdGFnIGZpcnN0IGJlZm9yZSBibGluZGx5IHRyeWluZyB0byByZWFkICdzaXplJyBieXRlcyAqLworICBpZiAodGFnID09IEdTVF9SSUZGX1RBR19MSVNUKSB7CisgICAgLyogdGhpcyBpcyB0aGUgbW92aSB0YWcgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJza2lwIExJU1QgY2h1bmssIHNpemUgJSIgR19HVUlOVDMyX0ZPUk1BVCwKKyAgICAgICAgKDggKyBHU1RfUk9VTkRfVVBfMiAoc2l6ZSkpKTsKKyAgICBhdmktPmlkeDFfb2Zmc2V0ID0gb2Zmc2V0ICsgOCArIEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICAvKiBpc3N1ZSBzZWVrIHRvIGFsbG93IGNoYWluIGZ1bmN0aW9uIHRvIGhhbmRsZSBpdCBhbmQgcmV0dXJuISAqLworICAgIHBlcmZvcm1fc2Vla190b19vZmZzZXQgKGF2aSwgYXZpLT5pZHgxX29mZnNldCwgYXZpLT5zZWdtZW50X3NlcW51bSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHRhZyAhPSBHU1RfUklGRl9UQUdfaWR4MSkKKyAgICBnb3RvIG5vX2luZGV4OworCisgIEdTVF9ERUJVRyAoImluZGV4IGZvdW5kIGF0IG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFULCBvZmZzZXQpOworCisgIC8qIGZsdXNoIGNodW5rIGhlYWRlciAqLworICBnc3RfYWRhcHRlcl9mbHVzaCAoYXZpLT5hZGFwdGVyLCA4KTsKKyAgLyogcmVhZCBjaHVuayBwYXlsb2FkICovCisgIGJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChhdmktPmFkYXB0ZXIsIHNpemUpOworICBpZiAoIWJ1ZikKKyAgICBnb3RvIHB1bGxfZmFpbGVkOworICAvKiBhZHZhbmNlIG9mZnNldCAqLworICBvZmZzZXQgKz0gOCArIEdTVF9ST1VORF9VUF8yIChzaXplKTsKKworICBHU1RfREVCVUcgKCJ3aWxsIHBhcnNlIGluZGV4IGNodW5rIHNpemUgJSIgR19HU0laRV9GT1JNQVQgIiBmb3IgdGFnICUiCisgICAgICBHU1RfRk9VUkNDX0ZPUk1BVCwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSwgR1NUX0ZPVVJDQ19BUkdTICh0YWcpKTsKKworICBhdmktPm9mZnNldCA9IGF2aS0+Zmlyc3RfbW92aV9vZmZzZXQ7CisgIGdzdF9hdmlfZGVtdXhfcGFyc2VfaW5kZXggKGF2aSwgYnVmKTsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgLyogZGVidWcgb3VyIGluZGV4ZXMgKi8KKyAgeworICAgIGdpbnQgaTsKKyAgICBHc3RBdmlTdHJlYW0gKnN0cmVhbTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhdmktPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgIHN0cmVhbSA9ICZhdmktPnN0cmVhbVtpXTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInN0cmVhbSAldTogJXUgZnJhbWVzLCAlIiBHX0dJTlQ2NF9GT1JNQVQgIiBieXRlcyIsCisgICAgICAgICAgaSwgc3RyZWFtLT5pZHhfbiwgc3RyZWFtLT50b3RhbF9ieXRlcyk7CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworcHVsbF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksCisgICAgICAgICJ0YWtpbmcgZGF0YSBmcm9tIGFkYXB0ZXIgZmFpbGVkOiBwb3M9JSIgR19HVUlOVDY0X0ZPUk1BVCAiIHNpemU9JXUiLAorICAgICAgICBvZmZzZXQsIHNpemUpOworICAgIHJldHVybjsKKyAgfQorbm9faW5kZXg6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwKKyAgICAgICAgIk5vIGluZGV4IGRhdGEgKGlkeDEpIGFmdGVyIG1vdmkgY2h1bmssIGJ1dCAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgR1NUX0ZPVVJDQ19BUkdTICh0YWcpKTsKKyAgICByZXR1cm47CisgIH0KK30KKworLyoKKyAqIGdzdF9hdmlfZGVtdXhfcGVla190YWc6CisgKgorICogUmV0dXJucyB0aGUgdGFnIGFuZCBzaXplIG9mIHRoZSBuZXh0IGNodW5rCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYXZpX2RlbXV4X3BlZWtfdGFnIChHc3RBdmlEZW11eCAqIGF2aSwgZ3VpbnQ2NCBvZmZzZXQsIGd1aW50MzIgKiB0YWcsCisgICAgZ3VpbnQgKiBzaXplKQoreworICBHc3RGbG93UmV0dXJuIHJlczsKKyAgR3N0QnVmZmVyICpidWYgPSBOVUxMOworICBHc3RNYXBJbmZvIG1hcDsKKworICByZXMgPSBnc3RfcGFkX3B1bGxfcmFuZ2UgKGF2aS0+c2lua3BhZCwgb2Zmc2V0LCA4LCAmYnVmKTsKKyAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIHB1bGxfZmFpbGVkOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGlmIChtYXAuc2l6ZSAhPSA4KQorICAgIGdvdG8gd3Jvbmdfc2l6ZTsKKworICAqdGFnID0gR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSk7CisgICpzaXplID0gR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSArIDQpOworCisgIEdTVF9MT0dfT0JKRUNUIChhdmksICJUYWdbJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIl0gKHNpemU6JWQpICUiCisgICAgICBHX0dJTlQ2NF9GT1JNQVQgIiAtLSAlIiBHX0dJTlQ2NF9GT1JNQVQsIEdTVF9GT1VSQ0NfQVJHUyAoKnRhZyksCisgICAgICAqc2l6ZSwgb2Zmc2V0ICsgOCwgb2Zmc2V0ICsgOCArIChnaW50NjQpICogc2l6ZSk7CisKK2RvbmU6CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK3B1bGxfZmFpbGVkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAicHVsbF9yYW5nZWQgcmV0dXJuZWQgJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmVzKSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQord3Jvbmdfc2l6ZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgImdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIHdoaWNoIGlzIDw+IDggYnl0ZXMiLAorICAgICAgICBtYXAuc2l6ZSk7CisgICAgcmVzID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBkb25lOworICB9Cit9CisKKy8qCisgKiBnc3RfYXZpX2RlbXV4X25leHRfZGF0YV9idWZmZXI6CisgKgorICogUmV0dXJucyB0aGUgb2Zmc2V0IGFuZCBzaXplIG9mIHRoZSBuZXh0IGJ1ZmZlcgorICogUG9zaXRpb24gaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBidWZmZXIgKGFmdGVyIHRhZyBhbmQgc2l6ZSkKKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hdmlfZGVtdXhfbmV4dF9kYXRhX2J1ZmZlciAoR3N0QXZpRGVtdXggKiBhdmksIGd1aW50NjQgKiBvZmZzZXQsCisgICAgZ3VpbnQzMiAqIHRhZywgZ3VpbnQgKiBzaXplKQoreworICBndWludDY0IG9mZiA9ICpvZmZzZXQ7CisgIGd1aW50IF9zaXplID0gMDsKKyAgR3N0Rmxvd1JldHVybiByZXM7CisKKyAgZG8geworICAgIHJlcyA9IGdzdF9hdmlfZGVtdXhfcGVla190YWcgKGF2aSwgb2ZmLCB0YWcsICZfc2l6ZSk7CisgICAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworICAgIGlmICgqdGFnID09IEdTVF9SSUZGX1RBR19MSVNUIHx8ICp0YWcgPT0gR1NUX1JJRkZfVEFHX1JJRkYpCisgICAgICBvZmYgKz0gOCArIDQ7ICAgICAgICAgICAgIC8qIHNraXAgdGFnICsgc2l6ZSArIHN1YnRhZyAqLworICAgIGVsc2UgeworICAgICAgKm9mZnNldCA9IG9mZiArIDg7CisgICAgICAqc2l6ZSA9IF9zaXplOworICAgICAgYnJlYWs7CisgICAgfQorICB9IHdoaWxlIChUUlVFKTsKKworICByZXR1cm4gcmVzOworfQorCisvKgorICogZ3N0X2F2aV9kZW11eF9zdHJlYW1fc2NhbjoKKyAqIEBhdmk6IGNhbGxpbmcgZWxlbWVudCAodXNlZCBmb3IgZGVidWdnaW5nL2Vycm9ycykuCisgKgorICogU2NhbiB0aGUgZmlsZSBmb3IgYWxsIGNodW5rcyB0byAiY3JlYXRlIiBhIG5ldyBpbmRleC4KKyAqIHB1bGwtcmFuZ2UgYmFzZWQKKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfYXZpX2RlbXV4X3N0cmVhbV9zY2FuIChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIEdzdEF2aVN0cmVhbSAqc3RyZWFtOworICBndWludDY0IHBvcyA9IDA7CisgIGd1aW50NjQgbGVuZ3RoOworICBnaW50NjQgdG1wbGVuZ3RoOworICBndWludDMyIHRhZyA9IDA7CisgIGd1aW50IG51bTsKKworICAvKiBGSVhNRToKKyAgICogLSBpbXBsZW1lbnQgbm9uLXNlZWthYmxlIHNvdXJjZSBzdXBwb3J0LgorICAgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiQ3JlYXRpbmcgaW5kZXgiKTsKKworICAvKiBnZXQgdGhlIHNpemUgb2YgdGhlIGZpbGUgKi8KKyAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKGF2aS0+c2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywgJnRtcGxlbmd0aCkpCisgICAgcmV0dXJuIEZBTFNFOworICBsZW5ndGggPSB0bXBsZW5ndGg7CisKKyAgLyogZ3Vlc3MgdGhlIHRvdGFsIGFtb3VudCBvZiBlbnRyaWVzIHdlIGV4cGVjdCAqLworICBudW0gPSAxNjAwMDsKKworICB3aGlsZSAoVFJVRSkgeworICAgIEdzdEF2aUluZGV4RW50cnkgZW50cnk7CisgICAgZ3VpbnQgc2l6ZSA9IDA7CisKKyAgICAvKiBzdGFydCByZWFkaW5nIGRhdGEgYnVmZmVycyB0byBmaW5kIHRoZSBpZCBhbmQgb2Zmc2V0ICovCisgICAgcmVzID0gZ3N0X2F2aV9kZW11eF9uZXh0X2RhdGFfYnVmZmVyIChhdmksICZwb3MsICZ0YWcsICZzaXplKTsKKyAgICBpZiAoR19VTkxJS0VMWSAocmVzICE9IEdTVF9GTE9XX09LKSkKKyAgICAgIGJyZWFrOworCisgICAgLyogZ2V0IHN0cmVhbSAqLworICAgIHN0cmVhbSA9IGdzdF9hdmlfZGVtdXhfc3RyZWFtX2Zvcl9pZCAoYXZpLCB0YWcpOworICAgIGlmIChHX1VOTElLRUxZICghc3RyZWFtKSkKKyAgICAgIGdvdG8gbmV4dDsKKworICAgIC8qIHdlIGNhbid0IGZpZ3VyZSBvdXQgdGhlIGtleWZyYW1lcywgYXNzdW1lIHRoZXkgYWxsIGFyZSAqLworICAgIGVudHJ5LmZsYWdzID0gR1NUX0FWSV9LRVlGUkFNRTsKKyAgICBlbnRyeS5vZmZzZXQgPSBwb3M7CisgICAgZW50cnkuc2l6ZSA9IHNpemU7CisKKyAgICAvKiBhbmQgYWRkIHRvIHRoZSBpbmRleCBvZiB0aGlzIHN0cmVhbSAqLworICAgIGlmIChHX1VOTElLRUxZICghZ3N0X2F2aV9kZW11eF9hZGRfaW5kZXggKGF2aSwgc3RyZWFtLCBudW0sICZlbnRyeSkpKQorICAgICAgZ290byBvdXRfb2ZfbWVtOworCisgIG5leHQ6CisgICAgLyogdXBkYXRlIHBvc2l0aW9uICovCisgICAgcG9zICs9IEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICBpZiAoR19VTkxJS0VMWSAocG9zID4gbGVuZ3RoKSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksCisgICAgICAgICAgIlN0b3BwaW5nIGluZGV4IGxvb2t1cCBzaW5jZSB3ZSBhcmUgZnVydGhlciB0aGFuIEVPRiIpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyogY29sbGVjdCBzdGF0cyAqLworICBhdmktPmhhdmVfaW5kZXggPSBnc3RfYXZpX2RlbXV4X2RvX2luZGV4X3N0YXRzIChhdmkpOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworb3V0X29mX21lbToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChhdmksIFJFU09VUkNFLCBOT19TUEFDRV9MRUZULCAoTlVMTCksCisgICAgICAgICgiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgJXUqJXU9JXUgYnl0ZXMiLAorICAgICAgICAgICAgKGd1aW50KSBzaXplb2YgKEdzdEF2aUluZGV4RW50cnkpLCBudW0sCisgICAgICAgICAgICAoZ3VpbnQpIHNpemVvZiAoR3N0QXZpSW5kZXhFbnRyeSkgKiBudW0pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdmlfZGVtdXhfY2FsY3VsYXRlX2R1cmF0aW9uc19mcm9tX2luZGV4IChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgZ3VpbnQgaTsKKyAgR3N0Q2xvY2tUaW1lIHRvdGFsOworICBHc3RBdmlTdHJlYW0gKnN0cmVhbTsKKworICB0b3RhbCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgLyogYWxsIHN0cmVhbXMgc3RhcnQgYXQgYSB0aW1lc3RhbXAgMCAqLworICBmb3IgKGkgPSAwOyBpIDwgYXZpLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uLCBoZHVyYXRpb247CisgICAgZ3N0X3JpZmZfc3RyaCAqc3RyaDsKKworICAgIHN0cmVhbSA9ICZhdmktPnN0cmVhbVtpXTsKKyAgICBpZiAoR19VTkxJS0VMWSAoIXN0cmVhbSB8fCAhc3RyZWFtLT5pZHhfbiB8fCAhKHN0cmggPSBzdHJlYW0tPnN0cmgpKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogZ2V0IGhlYWRlciBkdXJhdGlvbiBmb3IgdGhlIHN0cmVhbSAqLworICAgIGhkdXJhdGlvbiA9IHN0cmVhbS0+aGRyX2R1cmF0aW9uOworICAgIC8qIGluZGV4IGR1cmF0aW9uIGNhbGN1bGF0ZWQgZHVyaW5nIHBhcnNpbmcgKi8KKyAgICBkdXJhdGlvbiA9IHN0cmVhbS0+aWR4X2R1cmF0aW9uOworCisgICAgLyogbm93IHBpY2sgYSBnb29kIGR1cmF0aW9uICovCisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkdXJhdGlvbikpIHsKKyAgICAgIC8qIGluZGV4IGdhdmUgdmFsaWQgZHVyYXRpb24sIHVzZSB0aGF0ICovCisgICAgICBHU1RfSU5GTyAoIlN0cmVhbSAlcCBkdXJhdGlvbiBhY2NvcmRpbmcgdG8gaW5kZXg6ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBzdHJlYW0sIEdTVF9USU1FX0FSR1MgKGR1cmF0aW9uKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGZhbGwgYmFjayB0byBoZWFkZXIgaW5mbyB0byBjYWxjdWxhdGUgYSBkdXJhdGlvbiAqLworICAgICAgZHVyYXRpb24gPSBoZHVyYXRpb247CisgICAgfQorICAgIEdTVF9JTkZPICgiU2V0dGluZyBkdXJhdGlvbiBvZiBzdHJlYW0gIyVkIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgaSwgR1NUX1RJTUVfQVJHUyAoZHVyYXRpb24pKTsKKyAgICAvKiBzZXQgZHVyYXRpb24gZm9yIHRoZSBzdHJlYW0gKi8KKyAgICBzdHJlYW0tPmR1cmF0aW9uID0gZHVyYXRpb247CisKKyAgICAvKiBmaW5kIHRvdGFsIGR1cmF0aW9uICovCisgICAgaWYgKHRvdGFsID09IEdTVF9DTE9DS19USU1FX05PTkUgfHwKKyAgICAgICAgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkdXJhdGlvbikgJiYgZHVyYXRpb24gPiB0b3RhbCkpCisgICAgICB0b3RhbCA9IGR1cmF0aW9uOworICB9CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEICh0b3RhbCkgJiYgKHRvdGFsID4gMCkpIHsKKyAgICAvKiBub3cgdXBkYXRlIHRoZSBkdXJhdGlvbiBmb3IgdGhvc2Ugc3RyZWFtcyB3aGVyZSB3ZSBoYWQgbm9uZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBhdmktPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgIHN0cmVhbSA9ICZhdmktPnN0cmVhbVtpXTsKKworICAgICAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtLT5kdXJhdGlvbikKKyAgICAgICAgICB8fCBzdHJlYW0tPmR1cmF0aW9uID09IDApIHsKKyAgICAgICAgc3RyZWFtLT5kdXJhdGlvbiA9IHRvdGFsOworCisgICAgICAgIEdTVF9JTkZPICgiU3RyZWFtICVwIGR1cmF0aW9uIGFjY29yZGluZyB0byB0b3RhbDogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgc3RyZWFtLCBHU1RfVElNRV9BUkdTICh0b3RhbCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGFuZCBzZXQgdGhlIHRvdGFsIGR1cmF0aW9uIGluIHRoZSBzZWdtZW50LiAqLworICBHU1RfSU5GTyAoIlNldHRpbmcgdG90YWwgZHVyYXRpb24gdG86ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRvdGFsKSk7CisKKyAgYXZpLT5zZWdtZW50LmR1cmF0aW9uID0gdG90YWw7Cit9CisKKy8qIHJldHVybnMgRkFMU0UgaWYgdGhlcmUgYXJlIG5vIHBhZHMgdG8gZGVsaXZlciBldmVudCB0bywKKyAqIG90aGVyd2lzZSBUUlVFICh3aGF0ZXZlciB0aGUgb3V0Y29tZSBvZiBldmVudCBzZW5kaW5nKSwKKyAqIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgZXZlbnQuICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdmlfZGVtdXhfcHVzaF9ldmVudCAoR3N0QXZpRGVtdXggKiBhdmksIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlc3VsdCA9IEZBTFNFOworICBnaW50IGk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic2VuZGluZyAlcyBldmVudCB0byAlZCBzdHJlYW1zIiwKKyAgICAgIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSwgYXZpLT5udW1fc3RyZWFtcyk7CisKKyAgZm9yIChpID0gMDsgaSA8IGF2aS0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgIEdzdEF2aVN0cmVhbSAqc3RyZWFtID0gJmF2aS0+c3RyZWFtW2ldOworCisgICAgaWYgKHN0cmVhbS0+cGFkKSB7CisgICAgICByZXN1bHQgPSBUUlVFOworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzdHJlYW0tPnBhZCwgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpKTsKKyAgICB9CisgIH0KKyAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXZpX2RlbXV4X2NoZWNrX3NlZWthYmlsaXR5IChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgR3N0UXVlcnkgKnF1ZXJ5OworICBnYm9vbGVhbiBzZWVrYWJsZSA9IEZBTFNFOworICBnaW50NjQgc3RhcnQgPSAtMSwgc3RvcCA9IC0xOworCisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19zZWVraW5nIChHU1RfRk9STUFUX0JZVEVTKTsKKyAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnkgKGF2aS0+c2lua3BhZCwgcXVlcnkpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic2Vla2luZyBxdWVyeSBmYWlsZWQiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksIE5VTEwsICZzZWVrYWJsZSwgJnN0YXJ0LCAmc3RvcCk7CisKKyAgLyogdHJ5IGhhcmRlciB0byBxdWVyeSB1cHN0cmVhbSBzaXplIGlmIHdlIGRpZG4ndCBnZXQgaXQgdGhlIGZpcnN0IHRpbWUgKi8KKyAgaWYgKHNlZWthYmxlICYmIHN0b3AgPT0gLTEpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJkb2luZyBkdXJhdGlvbiBxdWVyeSB0byBmaXggdXAgdW5zZXQgc3RvcCIpOworICAgIGdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAoYXZpLT5zaW5rcGFkLCBHU1RfRk9STUFUX0JZVEVTLCAmc3RvcCk7CisgIH0KKworICAvKiBpZiB1cHN0cmVhbSBkb2Vzbid0IGtub3cgdGhlIHNpemUsIGl0J3MgbGlrZWx5IHRoYXQgaXQncyBub3Qgc2Vla2FibGUgaW4KKyAgICogcHJhY3RpY2UgZXZlbiBpZiBpdCB0ZWNobmljYWxseSBtYXkgYmUgc2Vla2FibGUgKi8KKyAgaWYgKHNlZWthYmxlICYmIChzdGFydCAhPSAwIHx8IHN0b3AgPD0gc3RhcnQpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic2Vla2FibGUgYnV0IHVua25vd24gc3RhcnQvc3RvcCAtPiBkaXNhYmxlIik7CisgICAgc2Vla2FibGUgPSBGQUxTRTsKKyAgfQorCitkb25lOgorICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgInNlZWthYmxlOiAlZCAoJSIgR19HVUlOVDY0X0ZPUk1BVCAiIC0gJSIKKyAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIikiLCBzZWVrYWJsZSwgc3RhcnQsIHN0b3ApOworICBhdmktPnNlZWthYmxlID0gc2Vla2FibGU7CisKKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7Cit9CisKKy8qCisgKiBSZWFkIEFWSSBoZWFkZXJzIHdoZW4gc3RyZWFtaW5nCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYXZpX2RlbXV4X3N0cmVhbV9oZWFkZXJfcHVzaCAoR3N0QXZpRGVtdXggKiBhdmkpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGd1aW50MzIgdGFnID0gMDsKKyAgZ3VpbnQzMiBsdGFnID0gMDsKKyAgZ3VpbnQzMiBzaXplID0gMDsKKyAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEwsICpzdWIgPSBOVUxMOworICBndWludCBvZmZzZXQgPSA0OworICBnaW50IGk7CisgIEdzdFRhZ0xpc3QgKnRhZ3MgPSBOVUxMOworICBndWludDggZm91cmNjWzRdOworCisgIEdTVF9ERUJVRyAoIlJlYWRpbmcgYW5kIHBhcnNpbmcgYXZpIGhlYWRlcnM6ICVkIiwgYXZpLT5oZWFkZXJfc3RhdGUpOworCisgIHN3aXRjaCAoYXZpLT5oZWFkZXJfc3RhdGUpIHsKKyAgICBjYXNlIEdTVF9BVklfREVNVVhfSEVBREVSX1RBR19MSVNUOgorICAgIGFnYWluOgorICAgICAgaWYgKGdzdF9hdmlfZGVtdXhfcGVla19jaHVuayAoYXZpLCAmdGFnLCAmc2l6ZSkpIHsKKyAgICAgICAgYXZpLT5vZmZzZXQgKz0gOCArIEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICAgICAgaWYgKHRhZyAhPSBHU1RfUklGRl9UQUdfTElTVCkKKyAgICAgICAgICBnb3RvIGhlYWRlcl9ub19saXN0OworCisgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChhdmktPmFkYXB0ZXIsIDgpOworICAgICAgICAvKiBGaW5kIHRoZSAnaGRybCcgTElTVCB0YWcgKi8KKyAgICAgICAgR1NUX0RFQlVHICgiUmVhZGluZyAlZCBieXRlcyIsIHNpemUpOworICAgICAgICBidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoYXZpLT5hZGFwdGVyLCBzaXplKTsKKworICAgICAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKGJ1ZiwgMCwgZm91cmNjLCA0KTsKKworICAgICAgICBpZiAoR1NUX1JFQURfVUlOVDMyX0xFIChmb3VyY2MpICE9IEdTVF9SSUZGX0xJU1RfaGRybCkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLCAiSW52YWxpZCBBVkkgaGVhZGVyIChubyBoZHJsIGF0IHN0YXJ0KTogJSIKKyAgICAgICAgICAgICAgR1NUX0ZPVVJDQ19GT1JNQVQsIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICBnb3RvIGFnYWluOworICAgICAgICB9CisKKyAgICAgICAgLyogbWluZCBwYWRkaW5nICovCisgICAgICAgIGlmIChzaXplICYgMSkKKyAgICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAoYXZpLT5hZGFwdGVyLCAxKTsKKworICAgICAgICBHU1RfREVCVUcgKCInaGRybCcgTElTVCB0YWcgZm91bmQuIFBhcnNpbmcgbmV4dCBjaHVuayIpOworCisgICAgICAgIGdzdF9hdmlfZGVtdXhfcm91bmR1cF9saXN0IChhdmksICZidWYpOworCisgICAgICAgIC8qIHRoZSBoZHJsIHN0YXJ0cyB3aXRoIGEgJ2F2aWgnIGhlYWRlciAqLworICAgICAgICBpZiAoIWdzdF9yaWZmX3BhcnNlX2NodW5rIChHU1RfRUxFTUVOVF9DQVNUIChhdmkpLCBidWYsICZvZmZzZXQsICZ0YWcsCisgICAgICAgICAgICAgICAgJnN1YikpCisgICAgICAgICAgZ290byBoZWFkZXJfbm9fYXZpaDsKKworICAgICAgICBpZiAodGFnICE9IEdTVF9SSUZGX1RBR19hdmloKQorICAgICAgICAgIGdvdG8gaGVhZGVyX25vX2F2aWg7CisKKyAgICAgICAgaWYgKCFnc3RfYXZpX2RlbXV4X3BhcnNlX2F2aWggKGF2aSwgc3ViLCAmYXZpLT5hdmloKSkKKyAgICAgICAgICBnb3RvIGhlYWRlcl93cm9uZ19hdmloOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIkFWSSBoZWFkZXIgb2ssIHJlYWRpbmcgZWxlbW50cyBmcm9tIGhlYWRlciIpOworCisgICAgICAgIC8qIG5vdywgcmVhZCB0aGUgZWxlbWVudHMgZnJvbSB0aGUgaGVhZGVyIHVudGlsIHRoZSBlbmQgKi8KKyAgICAgICAgd2hpbGUgKGdzdF9yaWZmX3BhcnNlX2NodW5rIChHU1RfRUxFTUVOVF9DQVNUIChhdmkpLCBidWYsICZvZmZzZXQsICZ0YWcsCisgICAgICAgICAgICAgICAgJnN1YikpIHsKKyAgICAgICAgICAvKiBzdWIgY2FuIGJlIE5VTEwgb24gZW1wdHkgdGFncyAqLworICAgICAgICAgIGlmICghc3ViKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBzd2l0Y2ggKHRhZykgeworICAgICAgICAgICAgY2FzZSBHU1RfUklGRl9UQUdfTElTVDoKKyAgICAgICAgICAgICAgaWYgKGdzdF9idWZmZXJfZ2V0X3NpemUgKHN1YikgPCA0KQorICAgICAgICAgICAgICAgIGdvdG8gbmV4dDsKKworICAgICAgICAgICAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKHN1YiwgMCwgZm91cmNjLCA0KTsKKworICAgICAgICAgICAgICBzd2l0Y2ggKEdTVF9SRUFEX1VJTlQzMl9MRSAoZm91cmNjKSkgeworICAgICAgICAgICAgICAgIGNhc2UgR1NUX1JJRkZfTElTVF9zdHJsOgorICAgICAgICAgICAgICAgICAgaWYgKCEoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0gKGF2aSwgc3ViKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3ViID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoYXZpLCBTVFJFQU0sIERFTVVYLCAoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImZhaWxlZCB0byBwYXJzZSBzdHJlYW0sIGlnbm9yaW5nIikpOworICAgICAgICAgICAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBzdWIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgICAgIGNhc2UgR1NUX1JJRkZfTElTVF9vZG1sOgorICAgICAgICAgICAgICAgICAgZ3N0X2F2aV9kZW11eF9wYXJzZV9vZG1sIChhdmksIHN1Yik7CisgICAgICAgICAgICAgICAgICBzdWIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLAorICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGxpc3QgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiBpbiBBVkkgaGVhZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKEdTVF9SRUFEX1VJTlQzMl9MRSAoZm91cmNjKSkpOworICAgICAgICAgICAgICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgICAgICAgICAgICAgY2FzZSBHU1RfUklGRl9UQUdfSlVOUToKKyAgICAgICAgICAgICAgICBjYXNlIEdTVF9SSUZGX1RBR19KVU5LOgorICAgICAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHU1RfUklGRl9JRElUOgorICAgICAgICAgICAgICBnc3RfYXZpX2RlbXV4X3BhcnNlX2lkaXQgKGF2aSwgc3ViKTsKKyAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksCisgICAgICAgICAgICAgICAgICAiVW5rbm93biB0YWcgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiBpbiBBVkkgaGVhZGVyIiwKKyAgICAgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSk7CisgICAgICAgICAgICAgIC8qIE9ubHkgZ2V0IGJ1ZmZlciBmb3IgZGVidWdnaW5nIGlmIHRoZSBtZW1kdW1wIGlzIG5lZWRlZCAgKi8KKyAgICAgICAgICAgICAgaWYgKGdzdF9kZWJ1Z19jYXRlZ29yeV9nZXRfdGhyZXNob2xkIChHU1RfQ0FUX0RFRkFVTFQpID49IDkpIHsKKyAgICAgICAgICAgICAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgICAgICAgICAgICAgIGdzdF9idWZmZXJfbWFwIChzdWIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICAgICAgICAgICAgR1NUX01FTURVTVBfT0JKRUNUIChhdmksICJVbmtub3duIHRhZyIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc3ViLCAmbWFwKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX1JJRkZfVEFHX0pVTlE6CisgICAgICAgICAgICBjYXNlIEdTVF9SSUZGX1RBR19KVU5LOgorICAgICAgICAgICAgbmV4dDoKKyAgICAgICAgICAgICAgLyogbW92ZSB0byBuZXh0IGNodW5rICovCisgICAgICAgICAgICAgIGlmIChzdWIpCisgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoc3ViKTsKKyAgICAgICAgICAgICAgc3ViID0gTlVMTDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIEdTVF9ERUJVRyAoImVsZW1lbnRzIHBhcnNlZCIpOworCisgICAgICAgIC8qIGNoZWNrIHBhcnNlZCBzdHJlYW1zICovCisgICAgICAgIGlmIChhdmktPm51bV9zdHJlYW1zID09IDApIHsKKyAgICAgICAgICBnb3RvIG5vX3N0cmVhbXM7CisgICAgICAgIH0gZWxzZSBpZiAoYXZpLT5udW1fc3RyZWFtcyAhPSBhdmktPmF2aWgtPnN0cmVhbXMpIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwKKyAgICAgICAgICAgICAgIlN0cmVhbSBoZWFkZXIgbWVudGlvbmVkICVkIHN0cmVhbXMsIGJ1dCAlZCBhdmFpbGFibGUiLAorICAgICAgICAgICAgICBhdmktPmF2aWgtPnN0cmVhbXMsIGF2aS0+bnVtX3N0cmVhbXMpOworICAgICAgICB9CisgICAgICAgIEdTVF9ERUJVRyAoIkdldCBqdW5rIGFuZCBpbmZvIG5leHQiKTsKKyAgICAgICAgYXZpLT5oZWFkZXJfc3RhdGUgPSBHU1RfQVZJX0RFTVVYX0hFQURFUl9JTkZPOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogTmVlZCBtb3JlIGRhdGEgKi8KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KKyAgICAgIC8qIGZhbGwtdGhvdWdoICovCisgICAgY2FzZSBHU1RfQVZJX0RFTVVYX0hFQURFUl9JTkZPOgorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic2tpcHBpbmcganVuayBiZXR3ZWVuIGhlYWRlciBhbmQgZGF0YSAuLi4iKTsKKyAgICAgIHdoaWxlIChUUlVFKSB7CisgICAgICAgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGF2aS0+YWRhcHRlcikgPCAxMikKKyAgICAgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgICAgICAgZGF0YSA9IGdzdF9hZGFwdGVyX21hcCAoYXZpLT5hZGFwdGVyLCAxMik7CisgICAgICAgIHRhZyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSk7CisgICAgICAgIHNpemUgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEgKyA0KTsKKyAgICAgICAgbHRhZyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDgpOworICAgICAgICBnc3RfYWRhcHRlcl91bm1hcCAoYXZpLT5hZGFwdGVyKTsKKworICAgICAgICBpZiAodGFnID09IEdTVF9SSUZGX1RBR19MSVNUKSB7CisgICAgICAgICAgc3dpdGNoIChsdGFnKSB7CisgICAgICAgICAgICBjYXNlIEdTVF9SSUZGX0xJU1RfbW92aToKKyAgICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGF2aS0+YWRhcHRlciwgMTIpOworICAgICAgICAgICAgICBpZiAoIWF2aS0+Zmlyc3RfbW92aV9vZmZzZXQpCisgICAgICAgICAgICAgICAgYXZpLT5maXJzdF9tb3ZpX29mZnNldCA9IGF2aS0+b2Zmc2V0OworICAgICAgICAgICAgICBhdmktPm9mZnNldCArPSAxMjsKKyAgICAgICAgICAgICAgYXZpLT5pZHgxX29mZnNldCA9IGF2aS0+b2Zmc2V0ICsgc2l6ZSAtIDQ7CisgICAgICAgICAgICAgIGdvdG8gc2tpcHBpbmdfZG9uZTsKKyAgICAgICAgICAgIGNhc2UgR1NUX1JJRkZfTElTVF9JTkZPOgorICAgICAgICAgICAgICBHU1RfREVCVUcgKCJGb3VuZCBJTkZPIGNodW5rIik7CisgICAgICAgICAgICAgIGlmIChnc3RfYXZpX2RlbXV4X3BlZWtfY2h1bmsgKGF2aSwgJnRhZywgJnNpemUpKSB7CisgICAgICAgICAgICAgICAgR1NUX0RFQlVHICgiZ290IHNpemUgJWQiLCBzaXplKTsKKyAgICAgICAgICAgICAgICBhdmktPm9mZnNldCArPSAxMjsKKyAgICAgICAgICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAoYXZpLT5hZGFwdGVyLCAxMik7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPiA0KSB7CisgICAgICAgICAgICAgICAgICBidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoYXZpLT5hZGFwdGVyLCBzaXplIC0gNCk7CisgICAgICAgICAgICAgICAgICAvKiBtaW5kIHBhZGRpbmcgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChzaXplICYgMSkKKyAgICAgICAgICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGF2aS0+YWRhcHRlciwgMSk7CisgICAgICAgICAgICAgICAgICBnc3RfcmlmZl9wYXJzZV9pbmZvIChHU1RfRUxFTUVOVF9DQVNUIChhdmkpLCBidWYsICZ0YWdzKTsKKyAgICAgICAgICAgICAgICAgIGlmICh0YWdzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdmktPmdsb2JhbHRhZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfaW5zZXJ0IChhdmktPmdsb2JhbHRhZ3MsIHRhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSk7CisgICAgICAgICAgICAgICAgICAgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICBhdmktPmdsb2JhbHRhZ3MgPSB0YWdzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB0YWdzID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAgIGF2aS0+b2Zmc2V0ICs9IEdTVF9ST1VORF9VUF8yIChzaXplKSAtIDQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIEdTVF9ERUJVRyAoInNraXBwaW5nIElORk8gTElTVCBwcmVmaXgiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogTmVlZCBtb3JlIGRhdGEgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpZiAoZ3N0X2F2aV9kZW11eF9wZWVrX2NodW5rIChhdmksICZ0YWcsICZzaXplKSB8fCBzaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBhY2NlcHQgMCBzaXplIGJ1ZmZlciBoZXJlICovCisgICAgICAgICAgICAgICAgYXZpLT5hYm9ydF9idWZmZXJpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBhdmktPm9mZnNldCArPSA4ICsgR1NUX1JPVU5EX1VQXzIgKHNpemUpOworICAgICAgICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChhdmktPmFkYXB0ZXIsIDggKyBHU1RfUk9VTkRfVVBfMiAoc2l6ZSkpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIE5lZWQgbW9yZSBkYXRhICovCisgICAgICAgICAgICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoZ3N0X2F2aV9kZW11eF9wZWVrX2NodW5rIChhdmksICZ0YWcsICZzaXplKSB8fCBzaXplID09IDApIHsKKyAgICAgICAgICAgIC8qIGFjY2VwdCAwIHNpemUgYnVmZmVyIGhlcmUgKi8KKyAgICAgICAgICAgIGF2aS0+YWJvcnRfYnVmZmVyaW5nID0gRkFMU0U7CisgICAgICAgICAgICBhdmktPm9mZnNldCArPSA4ICsgR1NUX1JPVU5EX1VQXzIgKHNpemUpOworICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGF2aS0+YWRhcHRlciwgOCArIEdTVF9ST1VORF9VUF8yIChzaXplKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIE5lZWQgbW9yZSBkYXRhICovCisgICAgICAgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX1dBUk5JTkcgKCJ1bmhhbmRsZWQgaGVhZGVyIHN0YXRlOiAlZCIsIGF2aS0+aGVhZGVyX3N0YXRlKTsKKyAgICAgIGJyZWFrOworICB9Citza2lwcGluZ19kb25lOgorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInNraXBwaW5nIGRvbmUgLi4uIChzdHJlYW1zPSV1LCBzdHJlYW1bMF0uaW5kZXhlcz0lcCkiLAorICAgICAgYXZpLT5udW1fc3RyZWFtcywgYXZpLT5zdHJlYW1bMF0uaW5kZXhlcyk7CisKKyAgR1NUX0RFQlVHICgiRm91bmQgbW92aSBjaHVuay4gU3RhcnRpbmcgdG8gc3RyZWFtIGRhdGEiKTsKKyAgYXZpLT5zdGF0ZSA9IEdTVF9BVklfREVNVVhfTU9WSTsKKworICAvKiBubyBpbmRleGVzIGluIHB1c2ggbW9kZSwgYnV0IGl0IHN0aWxsIHNldHMgc29tZSB2YXJpYWJsZXMgKi8KKyAgZ3N0X2F2aV9kZW11eF9jYWxjdWxhdGVfZHVyYXRpb25zX2Zyb21faW5kZXggKGF2aSk7CisKKyAgZ3N0X2F2aV9kZW11eF9leHBvc2Vfc3RyZWFtcyAoYXZpLCBUUlVFKTsKKworICAvKiBwcmVwYXJlIGFsbCBzdHJlYW1zIGZvciBpbmRleCAwICovCisgIGZvciAoaSA9IDA7IGkgPCBhdmktPm51bV9zdHJlYW1zOyBpKyspCisgICAgYXZpLT5zdHJlYW1baV0uY3VycmVudF9lbnRyeSA9IDA7CisKKyAgLyogY3JlYXRlIGluaXRpYWwgTkVXU0VHTUVOVCBldmVudCAqLworICBpZiAoYXZpLT5zZWdfZXZlbnQpCisgICAgZ3N0X2V2ZW50X3VucmVmIChhdmktPnNlZ19ldmVudCk7CisgIGF2aS0+c2VnX2V2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmYXZpLT5zZWdtZW50KTsKKyAgaWYgKGF2aS0+c2VnbWVudF9zZXFudW0pCisgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGF2aS0+c2VnX2V2ZW50LCBhdmktPnNlZ21lbnRfc2VxbnVtKTsKKworICBnc3RfYXZpX2RlbXV4X2NoZWNrX3NlZWthYmlsaXR5IChhdmkpOworCisgIC8qIGF0IHRoaXMgcG9pbnQgd2Uga25vdyBhbGwgdGhlIHN0cmVhbXMgYW5kIHdlIGNhbiBzaWduYWwgdGhlIG5vIG1vcmUKKyAgICogcGFkcyBzaWduYWwgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic2lnbmFsaW5nIG5vIG1vcmUgcGFkcyIpOworICBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgKEdTVF9FTEVNRU5UX0NBU1QgKGF2aSkpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworICAvKiBFUlJPUlMgKi8KK25vX3N0cmVhbXM6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXZpLCBTVFJFQU0sIERFTVVYLCAoTlVMTCksICgiTm8gc3RyZWFtcyBmb3VuZCIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2hlYWRlcl9ub19saXN0OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAoIkludmFsaWQgQVZJIGhlYWRlciAobm8gTElTVCBhdCBzdGFydCk6ICUiCisgICAgICAgICAgICBHU1RfRk9VUkNDX0ZPUk1BVCwgR1NUX0ZPVVJDQ19BUkdTICh0YWcpKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CitoZWFkZXJfbm9fYXZpaDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChhdmksIFNUUkVBTSwgREVNVVgsIChOVUxMKSwKKyAgICAgICAgKCJJbnZhbGlkIEFWSSBoZWFkZXIgKG5vIGF2aWggYXQgc3RhcnQpOiAlIgorICAgICAgICAgICAgR1NUX0ZPVVJDQ19GT1JNQVQsIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSkpOworICAgIGlmIChzdWIpCisgICAgICBnc3RfYnVmZmVyX3VucmVmIChzdWIpOworCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2hlYWRlcl93cm9uZ19hdmloOgorICB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdmlfZGVtdXhfYWRkX2RhdGVfdGFnIChHc3RBdmlEZW11eCAqIGF2aSwgZ2ludCB5LCBnaW50IG0sIGdpbnQgZCwKKyAgICBnaW50IGgsIGdpbnQgbWluLCBnaW50IHMpCit7CisgIEdEYXRlICpkYXRlOworICBHc3REYXRlVGltZSAqZHQ7CisKKyAgZGF0ZSA9IGdfZGF0ZV9uZXdfZG15IChkLCBtLCB5KTsKKyAgaWYgKCFnX2RhdGVfdmFsaWQgKGRhdGUpKSB7CisgICAgLyogYm9ndXMgZGF0ZSAqLworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLCAiUmVmdXNpbmcgdG8gYWRkIGludmFsaWQgZGF0ZSAlZC0lZC0lZCIsIHksIG0sIGQpOworICAgIGdfZGF0ZV9mcmVlIChkYXRlKTsKKyAgICByZXR1cm47CisgIH0KKworICBkdCA9IGdzdF9kYXRlX3RpbWVfbmV3X2xvY2FsX3RpbWUgKHksIG0sIGQsIGgsIG1pbiwgcyk7CisKKyAgaWYgKGF2aS0+Z2xvYmFsdGFncyA9PSBOVUxMKQorICAgIGF2aS0+Z2xvYmFsdGFncyA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisKKyAgZ3N0X3RhZ19saXN0X2FkZCAoYXZpLT5nbG9iYWx0YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIEdTVF9UQUdfREFURSwgZGF0ZSwKKyAgICAgIE5VTEwpOworICBnX2RhdGVfZnJlZSAoZGF0ZSk7CisgIGlmIChkdCkgeworICAgIGdzdF90YWdfbGlzdF9hZGQgKGF2aS0+Z2xvYmFsdGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLCBHU1RfVEFHX0RBVEVfVElNRSwKKyAgICAgICAgZHQsIE5VTEwpOworICAgIGdzdF9kYXRlX3RpbWVfdW5yZWYgKGR0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9wYXJzZV9pZGl0X251bXNfb25seSAoR3N0QXZpRGVtdXggKiBhdmksIGdjaGFyICogZGF0YSkKK3sKKyAgZ2ludCB5LCBtLCBkOworICBnaW50IGhyID0gMCwgbWluID0gMCwgc2VjID0gMDsKKyAgZ2ludCByZXQ7CisKKyAgR1NUX0RFQlVHICgiZGF0YSA6ICclcyciLCBkYXRhKTsKKworICByZXQgPSBzc2NhbmYgKGRhdGEsICIlZDolZDolZCAlZDolZDolZCIsICZ5LCAmbSwgJmQsICZociwgJm1pbiwgJnNlYyk7CisgIGlmIChyZXQgPCAzKSB7CisgICAgLyogQXR0ZW1wdCBZWVlZL01NL0RELyBISDpNTSB2YXJpYW50IChmb3VuZCBpbiBDQVNJTyBjYW1lcmFzKSAqLworICAgIHJldCA9IHNzY2FuZiAoZGF0YSwgIiUwNGQvJTAyZC8lMDJkLyAlZDolZCIsICZ5LCAmbSwgJmQsICZociwgJm1pbik7CisgICAgaWYgKHJldCA8IDMpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLCAiRmFpbGVkIHRvIHBhcnNlIElESVQgdGFnIik7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGdzdF9hdmlfZGVtdXhfYWRkX2RhdGVfdGFnIChhdmksIHksIG0sIGQsIGhyLCBtaW4sIHNlYyk7Cit9CisKK3N0YXRpYyBnaW50CitnZXRfbW9udGhfbnVtIChnY2hhciAqIGRhdGEsIGd1aW50IHNpemUpCit7CisgIGlmIChnX2FzY2lpX3N0cm5jYXNlY21wIChkYXRhLCAiamFuIiwgMykgPT0gMCkgeworICAgIHJldHVybiAxOworICB9IGVsc2UgaWYgKGdfYXNjaWlfc3RybmNhc2VjbXAgKGRhdGEsICJmZWIiLCAzKSA9PSAwKSB7CisgICAgcmV0dXJuIDI7CisgIH0gZWxzZSBpZiAoZ19hc2NpaV9zdHJuY2FzZWNtcCAoZGF0YSwgIm1hciIsIDMpID09IDApIHsKKyAgICByZXR1cm4gMzsKKyAgfSBlbHNlIGlmIChnX2FzY2lpX3N0cm5jYXNlY21wIChkYXRhLCAiYXByIiwgMykgPT0gMCkgeworICAgIHJldHVybiA0OworICB9IGVsc2UgaWYgKGdfYXNjaWlfc3RybmNhc2VjbXAgKGRhdGEsICJtYXkiLCAzKSA9PSAwKSB7CisgICAgcmV0dXJuIDU7CisgIH0gZWxzZSBpZiAoZ19hc2NpaV9zdHJuY2FzZWNtcCAoZGF0YSwgImp1biIsIDMpID09IDApIHsKKyAgICByZXR1cm4gNjsKKyAgfSBlbHNlIGlmIChnX2FzY2lpX3N0cm5jYXNlY21wIChkYXRhLCAianVsIiwgMykgPT0gMCkgeworICAgIHJldHVybiA3OworICB9IGVsc2UgaWYgKGdfYXNjaWlfc3RybmNhc2VjbXAgKGRhdGEsICJhdWciLCAzKSA9PSAwKSB7CisgICAgcmV0dXJuIDg7CisgIH0gZWxzZSBpZiAoZ19hc2NpaV9zdHJuY2FzZWNtcCAoZGF0YSwgInNlcCIsIDMpID09IDApIHsKKyAgICByZXR1cm4gOTsKKyAgfSBlbHNlIGlmIChnX2FzY2lpX3N0cm5jYXNlY21wIChkYXRhLCAib2N0IiwgMykgPT0gMCkgeworICAgIHJldHVybiAxMDsKKyAgfSBlbHNlIGlmIChnX2FzY2lpX3N0cm5jYXNlY21wIChkYXRhLCAibm92IiwgMykgPT0gMCkgeworICAgIHJldHVybiAxMTsKKyAgfSBlbHNlIGlmIChnX2FzY2lpX3N0cm5jYXNlY21wIChkYXRhLCAiZGVjIiwgMykgPT0gMCkgeworICAgIHJldHVybiAxMjsKKyAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9wYXJzZV9pZGl0X3RleHQgKEdzdEF2aURlbXV4ICogYXZpLCBnY2hhciAqIGRhdGEpCit7CisgIGdpbnQgeWVhciwgbW9udGgsIGRheTsKKyAgZ2ludCBob3VyLCBtaW4sIHNlYzsKKyAgZ2ludCByZXQ7CisgIGdjaGFyIHdlZWtkYXlbNF07CisgIGdjaGFyIG1vbnRoc3RyWzRdOworCisgIHJldCA9IHNzY2FuZiAoZGF0YSwgIiUzcyAlM3MgJWQgJWQ6JWQ6JWQgJWQiLCB3ZWVrZGF5LCBtb250aHN0ciwgJmRheSwgJmhvdXIsCisgICAgICAmbWluLCAmc2VjLCAmeWVhcik7CisgIGlmIChyZXQgIT0gNykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLCAiRmFpbGVkIHRvIHBhcnNlIElESVQgdGFnIik7CisgICAgcmV0dXJuOworICB9CisgIG1vbnRoID0gZ2V0X21vbnRoX251bSAobW9udGhzdHIsIHN0cmxlbiAobW9udGhzdHIpKTsKKyAgZ3N0X2F2aV9kZW11eF9hZGRfZGF0ZV90YWcgKGF2aSwgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWluLCBzZWMpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9wYXJzZV9pZGl0IChHc3RBdmlEZW11eCAqIGF2aSwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2NoYXIgKnB0cjsKKyAgZ3NpemUgbGVmdDsKKyAgZ2NoYXIgKnNhZmVkYXRhID0gTlVMTDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAvKgorICAgKiBBY2NvcmRpbmcgdG86CisgICAqIGh0dHA6Ly93d3cuZWRlbi1mb3VuZGF0aW9uLm9yZy9wcm9kdWN0cy9jb2RlL2ZpbG1fZGF0ZV9zdGFtcC9pbmRleC5odG1sCisgICAqCisgICAqIFRoaXMgdGFnIGNvdWxkIGJlIGluIG9uZSBvZiB0aGUgYmVsb3cgZm9ybWF0cworICAgKiAyMDA1OjA4OjE3IDExOjQyOjQzCisgICAqIFRIVSBPQ1QgMjYgMTY6NDY6MDQgMjAwNgorICAgKiBNb24gTWFyICAzIDA5OjQ0OjU2IDIwMDgKKyAgICoKKyAgICogRklYTUU6IE91ciBkYXRlIHRhZyBkb2Vzbid0IGluY2x1ZGUgaG91cnMKKyAgICovCisKKyAgLyogc2tpcCBldmVudHVhbCBpbml0aWFsIHdoaXRlc3BhY2UgKi8KKyAgcHRyID0gKGdjaGFyICopIG1hcC5kYXRhOworICBsZWZ0ID0gbWFwLnNpemU7CisKKyAgd2hpbGUgKGxlZnQgPiAwICYmIGdfYXNjaWlfaXNzcGFjZSAocHRyWzBdKSkgeworICAgIHB0cisrOworICAgIGxlZnQtLTsKKyAgfQorCisgIGlmIChsZWZ0ID09IDApIHsKKyAgICBnb3RvIG5vbl9wYXJzYWJsZTsKKyAgfQorCisgIC8qIG1ha2UgYSBzYWZlIGNvcHkgdG8gYWRkIGEgXDAgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nICovCisgIHNhZmVkYXRhID0gZ19zdHJuZHVwIChwdHIsIGxlZnQpOworCisgIC8qIHRlc3QgaWYgdGhlIGZpcnN0IGNoYXIgaXMgYSBhbHBoYSBvciBhIG51bWJlciAqLworICBpZiAoZ19hc2NpaV9pc2RpZ2l0IChwdHJbMF0pKSB7CisgICAgZ3N0X2F2aV9kZW11eF9wYXJzZV9pZGl0X251bXNfb25seSAoYXZpLCBzYWZlZGF0YSk7CisgICAgZ19mcmVlIChzYWZlZGF0YSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAoZ19hc2NpaV9pc2FscGhhIChwdHJbMF0pKSB7CisgICAgZ3N0X2F2aV9kZW11eF9wYXJzZV9pZGl0X3RleHQgKGF2aSwgc2FmZWRhdGEpOworICAgIGdfZnJlZSAoc2FmZWRhdGEpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZ19mcmVlIChzYWZlZGF0YSk7CisKK25vbl9wYXJzYWJsZToKKyAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJJRElUIHRhZyBoYXMgbm8gcGFyc2FibGUgaW5mbyIpOworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworfQorCitzdGF0aWMgdm9pZAorcGFyc2VfdGFnX3ZhbHVlIChHc3RBdmlEZW11eCAqIGF2aSwgR3N0VGFnTGlzdCAqIHRhZ2xpc3QsIGNvbnN0IGdjaGFyICogdHlwZSwKKyAgICBndWludDggKiBwdHIsIGd1aW50IHRzaXplKQoreworICBzdGF0aWMgY29uc3QgZ2NoYXIgKmVudl92YXJzW10gPSB7ICJHU1RfQVZJX1RBR19FTkNPRElORyIsCisgICAgIkdTVF9SSUZGX1RBR19FTkNPRElORyIsICJHU1RfVEFHX0VOQ09ESU5HIiwgTlVMTAorICB9OworICBHVHlwZSB0YWdfdHlwZTsKKyAgZ2NoYXIgKnZhbDsKKworICB0YWdfdHlwZSA9IGdzdF90YWdfZ2V0X3R5cGUgKHR5cGUpOworICB2YWwgPSBnc3RfdGFnX2ZyZWVmb3JtX3N0cmluZ190b191dGY4ICgoZ2NoYXIgKikgcHRyLCB0c2l6ZSwgZW52X3ZhcnMpOworCisgIGlmICh2YWwgIT0gTlVMTCkgeworICAgIGlmICh0YWdfdHlwZSA9PSBHX1RZUEVfU1RSSU5HKSB7CisgICAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwgdHlwZSwgdmFsLCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgR1ZhbHVlIHRhZ192YWwgPSB7IDAsIH07CisKKyAgICAgIGdfdmFsdWVfaW5pdCAoJnRhZ192YWwsIHRhZ190eXBlKTsKKyAgICAgIGlmIChnc3RfdmFsdWVfZGVzZXJpYWxpemUgKCZ0YWdfdmFsLCB2YWwpKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGRfdmFsdWUgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELCB0eXBlLCAmdGFnX3ZhbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwgImNvdWxkIG5vdCBkZXNlcmlhbGl6ZSAnJXMnIGludG8gYSAiCisgICAgICAgICAgICAidGFnICVzIG9mIHR5cGUgJXMiLCB2YWwsIHR5cGUsIGdfdHlwZV9uYW1lICh0YWdfdHlwZSkpOworICAgICAgfQorICAgICAgZ192YWx1ZV91bnNldCAoJnRhZ192YWwpOworICAgIH0KKyAgICBnX2ZyZWUgKHZhbCk7CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJjb3VsZCBub3QgZXh0cmFjdCAlcyB0YWciLCB0eXBlKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJkIChHc3RBdmlEZW11eCAqIGF2aSwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQzMiB0YWc7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgaWYgKG1hcC5zaXplID4gNCkgeworICAgIGd1aW50OCAqcHRyID0gbWFwLmRhdGE7CisgICAgZ3NpemUgbGVmdCA9IG1hcC5zaXplOworCisgICAgLyogcGFyc2luZyBiYXNlZCBvbgorICAgICAqIGh0dHA6Ly93d3cuZWRlbi1mb3VuZGF0aW9uLm9yZy9wcm9kdWN0cy9jb2RlL2ZpbG1fZGF0ZV9zdGFtcC9pbmRleC5odG1sCisgICAgICovCisgICAgdGFnID0gR1NUX1JFQURfVUlOVDMyX0xFIChwdHIpOworICAgIGlmICgodGFnID09IEdTVF9NQUtFX0ZPVVJDQyAoJ0EnLCAnVicsICdJJywgJ0YnKSkgJiYgKG1hcC5zaXplID4gOTgpKSB7CisgICAgICBnc2l6ZSBzdWJfc2l6ZTsKKworICAgICAgcHRyICs9IDk4OworICAgICAgbGVmdCAtPSA5ODsKKyAgICAgIGlmICghbWVtY21wIChwdHIsICJGVUpJRklMTSIsIDgpKSB7CisgICAgICAgIEdTVF9NRU1EVU1QX09CSkVDVCAoYXZpLCAiZnVqaWZpbSB0YWciLCBwdHIsIDQ4KTsKKworICAgICAgICBwdHIgKz0gMTA7CisgICAgICAgIGxlZnQgLT0gMTA7CisgICAgICAgIHN1Yl9zaXplID0gMDsKKyAgICAgICAgd2hpbGUgKHB0cltzdWJfc2l6ZV0gJiYgc3ViX3NpemUgPCBsZWZ0KQorICAgICAgICAgIHN1Yl9zaXplKys7CisKKyAgICAgICAgaWYgKGF2aS0+Z2xvYmFsdGFncyA9PSBOVUxMKQorICAgICAgICAgIGF2aS0+Z2xvYmFsdGFncyA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAoYXZpLT5nbG9iYWx0YWdzLCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgICAgIEdTVF9UQUdfREVWSUNFX01BTlVGQUNUVVJFUiwgIkZVSklGSUxNIiwgTlVMTCk7CisgICAgICAgIHBhcnNlX3RhZ192YWx1ZSAoYXZpLCBhdmktPmdsb2JhbHRhZ3MsIEdTVF9UQUdfREVWSUNFX01PREVMLCBwdHIsCisgICAgICAgICAgICBzdWJfc2l6ZSk7CisKKyAgICAgICAgd2hpbGUgKHB0cltzdWJfc2l6ZV0gPT0gJ1wwJyAmJiBzdWJfc2l6ZSA8IGxlZnQpCisgICAgICAgICAgc3ViX3NpemUrKzsKKworICAgICAgICBwdHIgKz0gc3ViX3NpemU7CisgICAgICAgIGxlZnQgLT0gc3ViX3NpemU7CisgICAgICAgIHN1Yl9zaXplID0gMDsKKyAgICAgICAgd2hpbGUgKHB0cltzdWJfc2l6ZV0gJiYgc3ViX3NpemUgPCBsZWZ0KQorICAgICAgICAgIHN1Yl9zaXplKys7CisgICAgICAgIGlmIChwdHJbNF0gPT0gJzonKQorICAgICAgICAgIHB0cls0XSA9ICctJzsKKyAgICAgICAgaWYgKHB0cls3XSA9PSAnOicpCisgICAgICAgICAgcHRyWzddID0gJy0nOworCisgICAgICAgIHBhcnNlX3RhZ192YWx1ZSAoYXZpLCBhdmktPmdsb2JhbHRhZ3MsIEdTVF9UQUdfREFURV9USU1FLCBwdHIsCisgICAgICAgICAgICBzdWJfc2l6ZSk7CisgICAgICB9CisgICAgfQorICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7Cit9CisKKy8qCisgKiBnc3RfYXZpX2RlbXV4X3BhcnNlX25jZHQ6CisgKiBAZWxlbWVudDogY2FsbGVyIGVsZW1lbnQgKHVzZWQgZm9yIGRlYnVnZ2luZy9lcnJvcikuCisgKiBAYnVmOiBpbnB1dCBkYXRhIHRvIGJlIHVzZWQgZm9yIHBhcnNpbmcsIHN0cmlwcGVkIGZyb20gaGVhZGVyLgorICogQHRhZ2xpc3Q6IGEgcG9pbnRlciB0byBhIHRhZ2xpc3QgKHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24pCisgKiAgICAgICAgICAgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHN0cmVhbS4gTWF5IGJlCisgKiAgICAgICAgICAgTlVMTCBpZiBubyBzdXBwb3J0ZWQgdGFncyB3ZXJlIGZvdW5kLgorICoKKyAqIFBhcnNlcyBOaWtvbiBtZXRhZGF0YSBmcm9tIGlucHV0IGRhdGEuCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfYXZpX2RlbXV4X3BhcnNlX25jZHQgKEdzdEF2aURlbXV4ICogYXZpLCBHc3RCdWZmZXIgKiBidWYsCisgICAgR3N0VGFnTGlzdCAqKiBfdGFnbGlzdCkKK3sKKyAgR3N0TWFwSW5mbyBpbmZvOworICBndWludDggKnB0cjsKKyAgZ3NpemUgbGVmdDsKKyAgZ3VpbnQgdHNpemU7CisgIGd1aW50MzIgdGFnOworICBjb25zdCBnY2hhciAqdHlwZTsKKyAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKworICBnX3JldHVybl9pZl9mYWlsIChfdGFnbGlzdCAhPSBOVUxMKTsKKworICBpZiAoIWJ1ZikgeworICAgICpfdGFnbGlzdCA9IE5VTEw7CisgICAgcmV0dXJuOworICB9CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZpbmZvLCBHU1RfTUFQX1JFQUQpOworCisgIHRhZ2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgIHB0ciA9IGluZm8uZGF0YTsKKyAgbGVmdCA9IGluZm8uc2l6ZTsKKworICB3aGlsZSAobGVmdCA+IDgpIHsKKyAgICB0YWcgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKHB0cik7CisgICAgdHNpemUgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKHB0ciArIDQpOworCisgICAgR1NUX01FTURVTVBfT0JKRUNUIChhdmksICJ0YWcgY2h1bmsiLCBwdHIsIE1JTiAodHNpemUgKyA4LCBsZWZ0KSk7CisKKyAgICBsZWZ0IC09IDg7CisgICAgcHRyICs9IDg7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJ0YWcgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiwgc2l6ZSAldSIsCisgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSwgdHNpemUpOworCisgICAgaWYgKHRzaXplID4gbGVmdCkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksCisgICAgICAgICAgIlRhZ3NpemUgJWQgaXMgbGFyZ2VyIHRoYW4gYXZhaWxhYmxlIGRhdGEgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICAgICAgdHNpemUsIGxlZnQpOworICAgICAgdHNpemUgPSBsZWZ0OworICAgIH0KKworICAgIC8qIGZpbmQgb3V0IHRoZSB0eXBlIG9mIG1ldGFkYXRhICovCisgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgIGNhc2UgR1NUX1JJRkZfTElTVF9uY3RnOgorICAgICAgICB3aGlsZSAodHNpemUgPiA0KSB7CisgICAgICAgICAgZ3VpbnQxNiBzdWJfdGFnID0gR1NUX1JFQURfVUlOVDE2X0xFIChwdHIpOworICAgICAgICAgIGd1aW50MTYgc3ViX3NpemUgPSBHU1RfUkVBRF9VSU5UMTZfTEUgKHB0ciArIDIpOworCisgICAgICAgICAgdHNpemUgLT0gNDsKKyAgICAgICAgICBwdHIgKz0gNDsKKyAgICAgICAgICBsZWZ0IC09IDQ7CisKKyAgICAgICAgICBpZiAoc3ViX3NpemUgPiB0c2l6ZSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic3ViLXRhZyAldSwgc2l6ZSAldSIsIHN1Yl90YWcsIHN1Yl9zaXplKTsKKyAgICAgICAgICAvKiBodHRwOi8vd3d3LnNuby5waHkucXVlZW5zdS5jYS9+cGhpbC9leGlmdG9vbC9UYWdOYW1lcy9OaWtvbi5odG1sI05DVEcKKyAgICAgICAgICAgKiBmb3Igc29tZSByZWFzb24gdGhlIHN1Yl90YWcgaGFzIGEgKzIgb2Zmc2V0CisgICAgICAgICAgICovCisgICAgICAgICAgc3dpdGNoIChzdWJfdGFnKSB7CisgICAgICAgICAgICBjYXNlIDB4MDM6ICAgICAgICAgLyogTWFrZSAqLworICAgICAgICAgICAgICB0eXBlID0gR1NUX1RBR19ERVZJQ0VfTUFOVUZBQ1RVUkVSOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgwNDogICAgICAgICAvKiBNb2RlbCAqLworICAgICAgICAgICAgICB0eXBlID0gR1NUX1RBR19ERVZJQ0VfTU9ERUw7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAvKiBUT0RPOiAweDA1OiBpcyBzb2Z0d2FyZSB2ZXJzaW9uLCBsaWtlIFYxLjAgKi8KKyAgICAgICAgICAgIGNhc2UgMHgwNjogICAgICAgICAvKiBTb2Z0d2FyZSAqLworICAgICAgICAgICAgICB0eXBlID0gR1NUX1RBR19FTkNPREVSOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgxMzogICAgICAgICAvKiBDcmVhdGlvbkRhdGUgKi8KKyAgICAgICAgICAgICAgdHlwZSA9IEdTVF9UQUdfREFURV9USU1FOworICAgICAgICAgICAgICBpZiAobGVmdCA+IDcpIHsKKyAgICAgICAgICAgICAgICBpZiAocHRyWzRdID09ICc6JykKKyAgICAgICAgICAgICAgICAgIHB0cls0XSA9ICctJzsKKyAgICAgICAgICAgICAgICBpZiAocHRyWzddID09ICc6JykKKyAgICAgICAgICAgICAgICAgIHB0cls3XSA9ICctJzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHR5cGUgPSBOVUxMOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHR5cGUgIT0gTlVMTCAmJiBwdHJbMF0gIT0gJ1wwJykgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAibWFwcGVkIHRhZyAldSB0byB0YWcgJXMiLCBzdWJfdGFnLCB0eXBlKTsKKworICAgICAgICAgICAgcGFyc2VfdGFnX3ZhbHVlIChhdmksIHRhZ2xpc3QsIHR5cGUsIHB0ciwgc3ViX3NpemUpOworICAgICAgICAgIH0KKworICAgICAgICAgIHB0ciArPSBzdWJfc2l6ZTsKKyAgICAgICAgICB0c2l6ZSAtPSBzdWJfc2l6ZTsKKyAgICAgICAgICBsZWZ0IC09IHN1Yl9zaXplOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdHlwZSA9IE5VTEw7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLAorICAgICAgICAgICAgIlVua25vd24gbmNkdCAobWV0YWRhdGEpIHRhZyBlbnRyeSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSk7CisgICAgICAgIEdTVF9NRU1EVU1QX09CSkVDVCAoYXZpLCAiVW5rbm93biBuY2R0IiwgcHRyLCB0c2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICh0c2l6ZSAmIDEpIHsKKyAgICAgIHRzaXplKys7CisgICAgICBpZiAodHNpemUgPiBsZWZ0KQorICAgICAgICB0c2l6ZSA9IGxlZnQ7CisgICAgfQorCisgICAgcHRyICs9IHRzaXplOworICAgIGxlZnQgLT0gdHNpemU7CisgIH0KKworICBpZiAoIWdzdF90YWdfbGlzdF9pc19lbXB0eSAodGFnbGlzdCkpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgImV4dHJhY3RlZCB0YWdzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgdGFnbGlzdCk7CisgICAgKl90YWdsaXN0ID0gdGFnbGlzdDsKKyAgfSBlbHNlIHsKKyAgICAqX3RhZ2xpc3QgPSBOVUxMOworICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnbGlzdCk7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmaW5mbyk7CisKKyAgcmV0dXJuOworfQorCisvKgorICogUmVhZCBmdWxsIEFWSSBoZWFkZXJzLgorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyX3B1bGwgKEdzdEF2aURlbXV4ICogYXZpKQoreworICBHc3RGbG93UmV0dXJuIHJlczsKKyAgR3N0QnVmZmVyICpidWYsICpzdWIgPSBOVUxMOworICBndWludDMyIHRhZzsKKyAgZ3VpbnQgb2Zmc2V0ID0gNDsKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IEdTVF9FTEVNRU5UX0NBU1QgKGF2aSk7CisgIEdzdENsb2NrVGltZSBzdGFtcDsKKyAgR3N0VGFnTGlzdCAqdGFncyA9IE5VTEw7CisgIGd1aW50OCBmb3VyY2NbNF07CisKKyAgc3RhbXAgPSBnc3RfdXRpbF9nZXRfdGltZXN0YW1wICgpOworCisgIC8qIHRoZSBoZWFkZXIgY29uc2lzdHMgb2YgYSAnaGRybCcgTElTVCB0YWcgKi8KKyAgcmVzID0gZ3N0X3JpZmZfcmVhZF9jaHVuayAoZWxlbWVudCwgYXZpLT5zaW5rcGFkLCAmYXZpLT5vZmZzZXQsICZ0YWcsICZidWYpOworICBpZiAocmVzICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gcHVsbF9yYW5nZV9mYWlsZWQ7CisgIGVsc2UgaWYgKHRhZyAhPSBHU1RfUklGRl9UQUdfTElTVCkKKyAgICBnb3RvIG5vX2xpc3Q7CisgIGVsc2UgaWYgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikgPCA0KQorICAgIGdvdG8gbm9faGVhZGVyOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInBhcnNpbmcgaGVhZGVycyIpOworCisgIC8qIEZpbmQgdGhlICdoZHJsJyBMSVNUIHRhZyAqLworICBnc3RfYnVmZmVyX2V4dHJhY3QgKGJ1ZiwgMCwgZm91cmNjLCA0KTsKKyAgd2hpbGUgKEdTVF9SRUFEX1VJTlQzMl9MRSAoZm91cmNjKSAhPSBHU1RfUklGRl9MSVNUX2hkcmwpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoYXZpLCAiYnVmZmVyIGNvbnRhaW5zICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKEdTVF9SRUFEX1VJTlQzMl9MRSAoZm91cmNjKSkpOworCisgICAgLyogRWF0IHVwICovCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAgIC8qIHJlYWQgbmV3IGNodW5rICovCisgICAgcmVzID0gZ3N0X3JpZmZfcmVhZF9jaHVuayAoZWxlbWVudCwgYXZpLT5zaW5rcGFkLCAmYXZpLT5vZmZzZXQsICZ0YWcsICZidWYpOworICAgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIHB1bGxfcmFuZ2VfZmFpbGVkOworICAgIGVsc2UgaWYgKHRhZyAhPSBHU1RfUklGRl9UQUdfTElTVCkKKyAgICAgIGdvdG8gbm9fbGlzdDsKKyAgICBlbHNlIGlmIChnc3RfYnVmZmVyX2dldF9zaXplIChidWYpIDwgNCkKKyAgICAgIGdvdG8gbm9faGVhZGVyOworICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoYnVmLCAwLCBmb3VyY2MsIDQpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiaGRybCBMSVNUIHRhZyBmb3VuZCIpOworCisgIGdzdF9hdmlfZGVtdXhfcm91bmR1cF9saXN0IChhdmksICZidWYpOworCisgIC8qIHRoZSBoZHJsIHN0YXJ0cyB3aXRoIGEgJ2F2aWgnIGhlYWRlciAqLworICBpZiAoIWdzdF9yaWZmX3BhcnNlX2NodW5rIChlbGVtZW50LCBidWYsICZvZmZzZXQsICZ0YWcsICZzdWIpKQorICAgIGdvdG8gbm9fYXZpaDsKKyAgZWxzZSBpZiAodGFnICE9IEdTVF9SSUZGX1RBR19hdmloKQorICAgIGdvdG8gbm9fYXZpaDsKKyAgZWxzZSBpZiAoIWdzdF9hdmlfZGVtdXhfcGFyc2VfYXZpaCAoYXZpLCBzdWIsICZhdmktPmF2aWgpKQorICAgIGdvdG8gaW52YWxpZF9hdmloOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIkFWSSBoZWFkZXIgb2ssIHJlYWRpbmcgZWxlbWVudHMgZnJvbSBoZWFkZXIiKTsKKworICAvKiBub3csIHJlYWQgdGhlIGVsZW1lbnRzIGZyb20gdGhlIGhlYWRlciB1bnRpbCB0aGUgZW5kICovCisgIHdoaWxlIChnc3RfcmlmZl9wYXJzZV9jaHVuayAoZWxlbWVudCwgYnVmLCAmb2Zmc2V0LCAmdGFnLCAmc3ViKSkgeworICAgIEdzdE1hcEluZm8gbWFwOworCisgICAgLyogc3ViIGNhbiBiZSBOVUxMIG9uIGVtcHR5IHRhZ3MgKi8KKyAgICBpZiAoIXN1YikKKyAgICAgIGNvbnRpbnVlOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKHN1YiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICAgIHN3aXRjaCAodGFnKSB7CisgICAgICBjYXNlIEdTVF9SSUZGX1RBR19MSVNUOgorICAgICAgICBpZiAobWFwLnNpemUgPCA0KQorICAgICAgICAgIGdvdG8gbmV4dDsKKworICAgICAgICBzd2l0Y2ggKEdTVF9SRUFEX1VJTlQzMl9MRSAobWFwLmRhdGEpKSB7CisgICAgICAgICAgY2FzZSBHU1RfUklGRl9MSVNUX3N0cmw6CisgICAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChzdWIsICZtYXApOworICAgICAgICAgICAgaWYgKCEoZ3N0X2F2aV9kZW11eF9wYXJzZV9zdHJlYW0gKGF2aSwgc3ViKSkpIHsKKyAgICAgICAgICAgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoYXZpLCBTVFJFQU0sIERFTVVYLCAoTlVMTCksCisgICAgICAgICAgICAgICAgICAoImZhaWxlZCB0byBwYXJzZSBzdHJlYW0sIGlnbm9yaW5nIikpOworICAgICAgICAgICAgICBzdWIgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ViID0gTlVMTDsKKyAgICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgICBjYXNlIEdTVF9SSUZGX0xJU1Rfb2RtbDoKKyAgICAgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHN1YiwgJm1hcCk7CisgICAgICAgICAgICBnc3RfYXZpX2RlbXV4X3BhcnNlX29kbWwgKGF2aSwgc3ViKTsKKyAgICAgICAgICAgIHN1YiA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9SSUZGX0xJU1RfSU5GTzoKKyAgICAgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHN1YiwgJm1hcCk7CisgICAgICAgICAgICBnc3RfYnVmZmVyX3Jlc2l6ZSAoc3ViLCA0LCAtMSk7CisgICAgICAgICAgICBnc3RfcmlmZl9wYXJzZV9pbmZvIChlbGVtZW50LCBzdWIsICZ0YWdzKTsKKyAgICAgICAgICAgIGlmICh0YWdzKSB7CisgICAgICAgICAgICAgIGlmIChhdmktPmdsb2JhbHRhZ3MpIHsKKyAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfaW5zZXJ0IChhdmktPmdsb2JhbHRhZ3MsIHRhZ3MsCisgICAgICAgICAgICAgICAgICAgIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSk7CisgICAgICAgICAgICAgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdzKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdmktPmdsb2JhbHRhZ3MgPSB0YWdzOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0YWdzID0gTlVMTDsKKyAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHN1Yik7CisgICAgICAgICAgICBzdWIgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHU1RfUklGRl9MSVNUX25jZHQ6CisgICAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChzdWIsICZtYXApOworICAgICAgICAgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKHN1YiwgNCwgLTEpOworICAgICAgICAgICAgZ3N0X2F2aV9kZW11eF9wYXJzZV9uY2R0IChhdmksIHN1YiwgJnRhZ3MpOworICAgICAgICAgICAgaWYgKHRhZ3MpIHsKKyAgICAgICAgICAgICAgaWYgKGF2aS0+Z2xvYmFsdGFncykgeworICAgICAgICAgICAgICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKGF2aS0+Z2xvYmFsdGFncywgdGFncywKKyAgICAgICAgICAgICAgICAgICAgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ3MpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2aS0+Z2xvYmFsdGFncyA9IHRhZ3M7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhZ3MgPSBOVUxMOworICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoc3ViKTsKKyAgICAgICAgICAgIHN1YiA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksCisgICAgICAgICAgICAgICAgIlVua25vd24gbGlzdCAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIGluIEFWSSBoZWFkZXIiLAorICAgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSkpKTsKKyAgICAgICAgICAgIEdTVF9NRU1EVU1QX09CSkVDVCAoYXZpLCAiVW5rbm93biBsaXN0IiwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICAgICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgICAgICAgIGNhc2UgR1NUX1JJRkZfVEFHX0pVTlE6CisgICAgICAgICAgY2FzZSBHU1RfUklGRl9UQUdfSlVOSzoKKyAgICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1JJRkZfSURJVDoKKyAgICAgICAgZ3N0X2F2aV9kZW11eF9wYXJzZV9pZGl0IChhdmksIHN1Yik7CisgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLAorICAgICAgICAgICAgIlVua25vd24gdGFnICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgaW4gQVZJIGhlYWRlciIsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHRhZykpOworICAgICAgICBHU1RfTUVNRFVNUF9PQkpFQ1QgKGF2aSwgIlVua25vd24gdGFnIiwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgICBjYXNlIEdTVF9SSUZGX1RBR19KVU5ROgorICAgICAgY2FzZSBHU1RfUklGRl9UQUdfSlVOSzoKKyAgICAgIG5leHQ6CisgICAgICAgIGlmIChzdWIpIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChzdWIsICZtYXApOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHN1Yik7CisgICAgICAgIH0KKyAgICAgICAgc3ViID0gTlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIEdTVF9ERUJVRyAoImVsZW1lbnRzIHBhcnNlZCIpOworCisgIC8qIGNoZWNrIHBhcnNlZCBzdHJlYW1zICovCisgIGlmIChhdmktPm51bV9zdHJlYW1zID09IDApCisgICAgZ290byBub19zdHJlYW1zOworICBlbHNlIGlmIChhdmktPm51bV9zdHJlYW1zICE9IGF2aS0+YXZpaC0+c3RyZWFtcykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLAorICAgICAgICAiU3RyZWFtIGhlYWRlciBtZW50aW9uZWQgJWQgc3RyZWFtcywgYnV0ICVkIGF2YWlsYWJsZSIsCisgICAgICAgIGF2aS0+YXZpaC0+c3RyZWFtcywgYXZpLT5udW1fc3RyZWFtcyk7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJza2lwcGluZyBqdW5rIGJldHdlZW4gaGVhZGVyIGFuZCBkYXRhLCBvZmZzZXQ9JSIKKyAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGF2aS0+b2Zmc2V0KTsKKworICAvKiBOb3csIGZpbmQgdGhlIGRhdGEgKGkuZS4gc2tpcCBhbGwganVuayBiZXR3ZWVuIGhlYWRlciBhbmQgZGF0YSkgKi8KKyAgZG8geworICAgIEdzdE1hcEluZm8gbWFwOworICAgIGd1aW50IHNpemU7CisgICAgZ3VpbnQzMiB0YWcsIGx0YWc7CisKKyAgICBidWYgPSBOVUxMOworICAgIHJlcyA9IGdzdF9wYWRfcHVsbF9yYW5nZSAoYXZpLT5zaW5rcGFkLCBhdmktPm9mZnNldCwgMTIsICZidWYpOworICAgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInB1bGxfcmFuZ2UgZmFpbHVyZSB3aGlsZSBsb29raW5nIGZvciB0YWdzIik7CisgICAgICBnb3RvIHB1bGxfcmFuZ2VfZmFpbGVkOworICAgIH0gZWxzZSBpZiAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSA8IDEyKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksCisgICAgICAgICAgImdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIHdoaWNoIGlzIGxlc3MgdGhhbiAxMiBieXRlcyIsCisgICAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICAgIH0KKworICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgdGFnID0gR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSk7CisgICAgc2l6ZSA9IEdTVF9SRUFEX1VJTlQzMl9MRSAobWFwLmRhdGEgKyA0KTsKKyAgICBsdGFnID0gR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSArIDgpOworCisgICAgR1NUX0RFQlVHICgidGFnICUiIEdTVF9GT1VSQ0NfRk9STUFUICIsIHNpemUgJXUiLAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHRhZyksIHNpemUpOworICAgIEdTVF9NRU1EVU1QICgiVGFnIGNvbnRlbnQiLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAgIHN3aXRjaCAodGFnKSB7CisgICAgICBjYXNlIEdTVF9SSUZGX1RBR19MSVNUOnsKKyAgICAgICAgc3dpdGNoIChsdGFnKSB7CisgICAgICAgICAgY2FzZSBHU1RfUklGRl9MSVNUX21vdmk6CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksCisgICAgICAgICAgICAgICAgIlJlYWNoZWQgdGhlICdtb3ZpJyB0YWcsIHdlJ3JlIGRvbmUgd2l0aCBza2lwcGluZyIpOworICAgICAgICAgICAgZ290byBza2lwcGluZ19kb25lOworICAgICAgICAgIGNhc2UgR1NUX1JJRkZfTElTVF9JTkZPOgorICAgICAgICAgICAgcmVzID0KKyAgICAgICAgICAgICAgICBnc3RfcmlmZl9yZWFkX2NodW5rIChlbGVtZW50LCBhdmktPnNpbmtwYWQsICZhdmktPm9mZnNldCwgJnRhZywKKyAgICAgICAgICAgICAgICAmYnVmKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiY291bGRuJ3QgcmVhZCBJTkZPIGNodW5rIik7CisgICAgICAgICAgICAgIGdvdG8gcHVsbF9yYW5nZV9mYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBHU1RfREVCVUcgKCJnb3Qgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSk7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICAgICAgICAgICAgR1NUX0RFQlVHICgic2tpcHBpbmcgSU5GTyBMSVNUIHByZWZpeCIpOworICAgICAgICAgICAgICBhdmktPm9mZnNldCArPSAoNCAtIEdTVF9ST1VORF9VUF8yIChzaXplKSk7CisgICAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdWIgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWYsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIDQsIC0xKTsKKyAgICAgICAgICAgIGdzdF9yaWZmX3BhcnNlX2luZm8gKGVsZW1lbnQsIHN1YiwgJnRhZ3MpOworICAgICAgICAgICAgaWYgKHRhZ3MpIHsKKyAgICAgICAgICAgICAgaWYgKGF2aS0+Z2xvYmFsdGFncykgeworICAgICAgICAgICAgICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKGF2aS0+Z2xvYmFsdGFncywgdGFncywKKyAgICAgICAgICAgICAgICAgICAgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ3MpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2aS0+Z2xvYmFsdGFncyA9IHRhZ3M7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhZ3MgPSBOVUxMOworICAgICAgICAgICAgaWYgKHN1YikgeworICAgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChzdWIpOworICAgICAgICAgICAgICBzdWIgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICAgIC8qIGdzdF9yaWZmX3JlYWRfY2h1bmsoKSBoYXMgYWxyZWFkeSBhZHZhbmNlZCBhdmktPm9mZnNldCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHU1RfUklGRl9MSVNUX25jZHQ6CisgICAgICAgICAgICByZXMgPQorICAgICAgICAgICAgICAgIGdzdF9yaWZmX3JlYWRfY2h1bmsgKGVsZW1lbnQsIGF2aS0+c2lua3BhZCwgJmF2aS0+b2Zmc2V0LCAmdGFnLAorICAgICAgICAgICAgICAgICZidWYpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykgeworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJjb3VsZG4ndCByZWFkIG5jZHQgY2h1bmsiKTsKKyAgICAgICAgICAgICAgZ290byBwdWxsX3JhbmdlX2ZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEdTVF9ERUJVRyAoImdvdCBzaXplICUiIEdfR1NJWkVfRk9STUFULCBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpKTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgNCkgeworICAgICAgICAgICAgICBHU1RfREVCVUcgKCJza2lwcGluZyBuY2R0IExJU1QgcHJlZml4Iik7CisgICAgICAgICAgICAgIGF2aS0+b2Zmc2V0ICs9ICg0IC0gR1NUX1JPVU5EX1VQXzIgKHNpemUpKTsKKyAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN1YiA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX0FMTCwgNCwgLTEpOworICAgICAgICAgICAgZ3N0X2F2aV9kZW11eF9wYXJzZV9uY2R0IChhdmksIHN1YiwgJnRhZ3MpOworICAgICAgICAgICAgaWYgKHRhZ3MpIHsKKyAgICAgICAgICAgICAgaWYgKGF2aS0+Z2xvYmFsdGFncykgeworICAgICAgICAgICAgICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKGF2aS0+Z2xvYmFsdGFncywgdGFncywKKyAgICAgICAgICAgICAgICAgICAgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ3MpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2aS0+Z2xvYmFsdGFncyA9IHRhZ3M7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhZ3MgPSBOVUxMOworICAgICAgICAgICAgaWYgKHN1YikgeworICAgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChzdWIpOworICAgICAgICAgICAgICBzdWIgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICAgIC8qIGdzdF9yaWZmX3JlYWRfY2h1bmsoKSBoYXMgYWxyZWFkeSBhZHZhbmNlZCBhdmktPm9mZnNldCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLAorICAgICAgICAgICAgICAgICJTa2lwcGluZyB1bmtub3duIGxpc3QgdGFnICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAobHRhZykpOworICAgICAgICAgICAgYXZpLT5vZmZzZXQgKz0gOCArIEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmksICJTa2lwcGluZyB1bmtub3duIHRhZyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSk7CisgICAgICAgIC8qIEZhbGwtdGhyb3VnaCAqLworICAgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdKJywgJ1UnLCAnTicsICdRJyk6CisgICAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ0onLCAnVScsICdOJywgJ0snKToKKyAgICAgICAgLyogT25seSBnZXQgYnVmZmVyIGZvciBkZWJ1Z2dpbmcgaWYgdGhlIG1lbWR1bXAgaXMgbmVlZGVkICAqLworICAgICAgICBpZiAoZ3N0X2RlYnVnX2NhdGVnb3J5X2dldF90aHJlc2hvbGQgKEdTVF9DQVRfREVGQVVMVCkgPj0gOSkgeworICAgICAgICAgIGJ1ZiA9IE5VTEw7CisgICAgICAgICAgcmVzID0gZ3N0X3BhZF9wdWxsX3JhbmdlIChhdmktPnNpbmtwYWQsIGF2aS0+b2Zmc2V0LCBzaXplLCAmYnVmKTsKKyAgICAgICAgICBpZiAocmVzICE9IEdTVF9GTE9XX09LKSB7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJjb3VsZG4ndCByZWFkIElORk8gY2h1bmsiKTsKKyAgICAgICAgICAgIGdvdG8gcHVsbF9yYW5nZV9mYWlsZWQ7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICAgICAgR1NUX01FTURVTVAgKCJKdW5rIiwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgYXZpLT5vZmZzZXQgKz0gOCArIEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IHdoaWxlICgxKTsKK3NraXBwaW5nX2RvbmU6CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic2tpcHBpbmcgZG9uZSAuLi4gKHN0cmVhbXM9JXUsIHN0cmVhbVswXS5pbmRleGVzPSVwKSIsCisgICAgICBhdmktPm51bV9zdHJlYW1zLCBhdmktPnN0cmVhbVswXS5pbmRleGVzKTsKKworICAvKiBjcmVhdGUgb3IgcmVhZCBzdHJlYW0gaW5kZXggKGZvciBzZWVraW5nKSAqLworICBpZiAoYXZpLT5zdHJlYW1bMF0uaW5kZXhlcyAhPSBOVUxMKSB7CisgICAgLyogd2UgcmVhZCBhIHN1cGVyIGluZGV4IGFscmVhZHkgKGdzdF9hdmlfZGVtdXhfcGFyc2Vfc3VwZXJpbmRleCgpICkgKi8KKyAgICBnc3RfYXZpX2RlbXV4X3JlYWRfc3ViaW5kZXhlc19wdWxsIChhdmkpOworICB9CisgIGlmICghYXZpLT5oYXZlX2luZGV4KSB7CisgICAgaWYgKGF2aS0+YXZpaC0+ZmxhZ3MgJiBHU1RfUklGRl9BVklIX0hBU0lOREVYKQorICAgICAgZ3N0X2F2aV9kZW11eF9zdHJlYW1faW5kZXggKGF2aSk7CisKKyAgICAvKiBzdGlsbCBubyBpbmRleCwgc2NhbiAqLworICAgIGlmICghYXZpLT5oYXZlX2luZGV4KSB7CisgICAgICBnc3RfYXZpX2RlbXV4X3N0cmVhbV9zY2FuIChhdmkpOworCisgICAgICAvKiBzdGlsbCBubyBpbmRleC4uIHRoaXMgaXMgYSBmYXRhbCBlcnJvciBmb3Igbm93LgorICAgICAgICogRklYTUUsIHdlIHNob3VsZCBzd2l0Y2ggdG8gcGxhaW4gcHVzaCBtb2RlIHdpdGhvdXQgc2Vla2luZworICAgICAgICogaW5zdGVhZCBvZiBmYWlsaW5nLiAqLworICAgICAgaWYgKCFhdmktPmhhdmVfaW5kZXgpCisgICAgICAgIGdvdG8gbm9faW5kZXg7CisgICAgfQorICB9CisgIC8qIHVzZSB0aGUgaW5kZXhlcyBub3cgdG8gY29uc3RydWN0IG5pY2UgZHVyYXRpb25zICovCisgIGdzdF9hdmlfZGVtdXhfY2FsY3VsYXRlX2R1cmF0aW9uc19mcm9tX2luZGV4IChhdmkpOworCisgIGdzdF9hdmlfZGVtdXhfZXhwb3NlX3N0cmVhbXMgKGF2aSwgRkFMU0UpOworCisgIC8qIGRvIGluaXRpYWwgc2VlayB0byB0aGUgZGVmYXVsdCBzZWdtZW50IHZhbHVlcyAqLworICBnc3RfYXZpX2RlbXV4X2RvX3NlZWsgKGF2aSwgJmF2aS0+c2VnbWVudCwgMCk7CisKKyAgLyogY3JlYXRlIGluaXRpYWwgTkVXU0VHTUVOVCBldmVudCAqLworICBpZiAoYXZpLT5zZWdfZXZlbnQpCisgICAgZ3N0X2V2ZW50X3VucmVmIChhdmktPnNlZ19ldmVudCk7CisgIGF2aS0+c2VnX2V2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmYXZpLT5zZWdtZW50KTsKKyAgaWYgKGF2aS0+c2VnbWVudF9zZXFudW0pCisgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGF2aS0+c2VnX2V2ZW50LCBhdmktPnNlZ21lbnRfc2VxbnVtKTsKKworICBzdGFtcCA9IGdzdF91dGlsX2dldF90aW1lc3RhbXAgKCkgLSBzdGFtcDsKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAicHVsbGluZyBoZWFkZXIgdG9vayAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChzdGFtcCkpOworCisgIC8qIGF0IHRoaXMgcG9pbnQgd2Uga25vdyBhbGwgdGhlIHN0cmVhbXMgYW5kIHdlIGNhbiBzaWduYWwgdGhlIG5vIG1vcmUKKyAgICogcGFkcyBzaWduYWwgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic2lnbmFsaW5nIG5vIG1vcmUgcGFkcyIpOworICBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgKEdTVF9FTEVNRU5UX0NBU1QgKGF2aSkpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworICAvKiBFUlJPUlMgKi8KK25vX2xpc3Q6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXZpLCBTVFJFQU0sIERFTVVYLCAoTlVMTCksCisgICAgICAgICgiSW52YWxpZCBBVkkgaGVhZGVyIChubyBMSVNUIGF0IHN0YXJ0KTogJSIKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfRk9STUFULCBHU1RfRk9VUkNDX0FSR1MgKHRhZykpKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorbm9faGVhZGVyOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAoIkludmFsaWQgQVZJIGhlYWRlciAobm8gaGRybCBhdCBzdGFydCk6ICUiCisgICAgICAgICAgICBHU1RfRk9VUkNDX0ZPUk1BVCwgR1NUX0ZPVVJDQ19BUkdTICh0YWcpKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK25vX2F2aWg6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXZpLCBTVFJFQU0sIERFTVVYLCAoTlVMTCksCisgICAgICAgICgiSW52YWxpZCBBVkkgaGVhZGVyIChubyBhdmloIGF0IHN0YXJ0KTogJSIKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfRk9STUFULCBHU1RfRk9VUkNDX0FSR1MgKHRhZykpKTsKKyAgICBpZiAoc3ViKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoc3ViKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQoraW52YWxpZF9hdmloOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAoIkludmFsaWQgQVZJIGhlYWRlciAoY2Fubm90IHBhcnNlIGF2aWggYXQgc3RhcnQpIikpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Citub19zdHJlYW1zOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLCAoIk5vIHN0cmVhbXMgZm91bmQiKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Citub19pbmRleDoKKyAgeworICAgIEdTVF9XQVJOSU5HICgiZmlsZSB3aXRob3V0IG9yIHRvbyBiaWcgaW5kZXgiKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXZpLCBTVFJFQU0sIERFTVVYLCAoTlVMTCksCisgICAgICAgICgiQ291bGQgbm90IGdldC9jcmVhdGUgaW5kZXgiKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CitwdWxsX3JhbmdlX2ZhaWxlZDoKKyAgeworICAgIGlmIChyZXMgPT0gR1NUX0ZMT1dfRkxVU0hJTkcpCisgICAgICByZXR1cm4gcmVzOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChhdmksIFNUUkVBTSwgREVNVVgsIChOVUxMKSwKKyAgICAgICAgKCJwdWxsX3JhbmdlIGZsb3cgcmVhZGluZyBoZWFkZXI6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJlcykpKTsKKyAgICByZXR1cm4gcmVzOworICB9Cit9CisKKy8qIG1vdmUgYSBzdHJlYW0gdG8gQGluZGV4ICovCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9tb3ZlX3N0cmVhbSAoR3N0QXZpRGVtdXggKiBhdmksIEdzdEF2aVN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RTZWdtZW50ICogc2VnbWVudCwgZ3VpbnQgaW5kZXgpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIk1vdmUgc3RyZWFtICVkIHRvICV1Iiwgc3RyZWFtLT5udW0sIGluZGV4KTsKKworICBpZiAoc2VnbWVudC0+cmF0ZSA8IDAuMCkgeworICAgIGd1aW50IG5leHRfa2V5OworICAgIC8qIEJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgZnJhbWUgb3JkZXIgd2UgbmVlZCB0byBwdXNoIGZyb20gdGhlIHByZXYga2V5ZnJhbWUKKyAgICAgKiB0byB0aGUgbmV4dCBrZXlmcmFtZS4gSWYgdGhlcmUgaXMgYSBzbWFydCBkZWNvZGVyIGRvd25zdHJlYW0gaGUgd2lsbCBub3RpY2UKKyAgICAgKiB0aGF0IHRoZXJlIGFyZSB0b28gbWFueSBlbmNvZGVkIGZyYW1lcyBzZW5kIGFuZCByZXR1cm4gRU9TIHdoZW4gdGhlcmUKKyAgICAgKiBhcmUgZW5vdWdoIGRlY29kZWQgZnJhbWVzIHRvIGZpbGwgdGhlIHNlZ21lbnQuICovCisgICAgbmV4dF9rZXkgPSBnc3RfYXZpX2RlbXV4X2luZGV4X25leHQgKGF2aSwgc3RyZWFtLCBpbmRleCwgVFJVRSk7CisKKyAgICAvKiBGSVhNRSwgd2UgZ28gYmFjayB0byAwLCB3ZSBzaG91bGQgbG9vayBhdCBzZWdtZW50LnN0YXJ0LiBXZSB3aWxsIGhvd2V2ZXIKKyAgICAgKiBzdG9wIGVhcmxpZXIgd2hlbiB0aGUgc2VlIHRoZSB0aW1lc3RhbXAgPCBzZWdtZW50LnN0YXJ0ICovCisgICAgc3RyZWFtLT5zdGFydF9lbnRyeSA9IDA7CisgICAgc3RyZWFtLT5zdGVwX2VudHJ5ID0gaW5kZXg7CisgICAgc3RyZWFtLT5jdXJyZW50X2VudHJ5ID0gaW5kZXg7CisgICAgc3RyZWFtLT5zdG9wX2VudHJ5ID0gbmV4dF9rZXk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJyZXZlcnNlIHNlZWs6IHN0YXJ0ICV1LCBzdGVwICV1LCBzdG9wICV1IiwKKyAgICAgICAgc3RyZWFtLT5zdGFydF9lbnRyeSwgc3RyZWFtLT5zdGVwX2VudHJ5LCBzdHJlYW0tPnN0b3BfZW50cnkpOworICB9IGVsc2UgeworICAgIHN0cmVhbS0+c3RhcnRfZW50cnkgPSBpbmRleDsKKyAgICBzdHJlYW0tPnN0ZXBfZW50cnkgPSBpbmRleDsKKyAgICBzdHJlYW0tPnN0b3BfZW50cnkgPSBnc3RfYXZpX2RlbXV4X2luZGV4X2xhc3QgKGF2aSwgc3RyZWFtKTsKKyAgfQorICBpZiAoc3RyZWFtLT5jdXJyZW50X2VudHJ5ICE9IGluZGV4KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiTW92ZSBESVNDT05UIGZyb20gJXUgdG8gJXUiLAorICAgICAgICBzdHJlYW0tPmN1cnJlbnRfZW50cnksIGluZGV4KTsKKyAgICBzdHJlYW0tPmN1cnJlbnRfZW50cnkgPSBpbmRleDsKKyAgICBzdHJlYW0tPmRpc2NvbnQgPSBUUlVFOworICB9CisKKyAgLyogdXBkYXRlIHRoZSBidWZmZXIgaW5mbyAqLworICBnc3RfYXZpX2RlbXV4X2dldF9idWZmZXJfaW5mbyAoYXZpLCBzdHJlYW0sIGluZGV4LAorICAgICAgJnN0cmVhbS0+Y3VycmVudF90aW1lc3RhbXAsICZzdHJlYW0tPmN1cnJlbnRfdHNfZW5kLAorICAgICAgJnN0cmVhbS0+Y3VycmVudF9vZmZzZXQsICZzdHJlYW0tPmN1cnJlbnRfb2Zmc2V0X2VuZCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiTW92ZWQgdG8gJXUsIHRzICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiwgdHNfZW5kICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBvZmYgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgIiwgb2ZmX2VuZCAlIiBHX0dVSU5UNjRfRk9STUFULCBpbmRleCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHN0cmVhbS0+Y3VycmVudF90aW1lc3RhbXApLAorICAgICAgR1NUX1RJTUVfQVJHUyAoc3RyZWFtLT5jdXJyZW50X3RzX2VuZCksIHN0cmVhbS0+Y3VycmVudF9vZmZzZXQsCisgICAgICBzdHJlYW0tPmN1cnJlbnRfb2Zmc2V0X2VuZCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiU2Vla2luZyB0byBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgIHN0cmVhbS0+aW5kZXhbaW5kZXhdLm9mZnNldCk7Cit9CisKKy8qCisgKiBEbyB0aGUgYWN0dWFsIHNlZWtpbmcuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9kZW11eF9kb19zZWVrIChHc3RBdmlEZW11eCAqIGF2aSwgR3N0U2VnbWVudCAqIHNlZ21lbnQsCisgICAgR3N0U2Vla0ZsYWdzIGZsYWdzKQoreworICBHc3RDbG9ja1RpbWUgc2Vla190aW1lOworICBnYm9vbGVhbiBrZXlmcmFtZSwgYmVmb3JlLCBhZnRlcjsKKyAgZ3VpbnQgaSwgaW5kZXg7CisgIEdzdEF2aVN0cmVhbSAqc3RyZWFtOworICBnYm9vbGVhbiBuZXh0OworCisgIHNlZWtfdGltZSA9IHNlZ21lbnQtPnBvc2l0aW9uOworICBrZXlmcmFtZSA9ICEgIShmbGFncyAmIEdTVF9TRUVLX0ZMQUdfS0VZX1VOSVQpOworICBiZWZvcmUgPSAhICEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NOQVBfQkVGT1JFKTsKKyAgYWZ0ZXIgPSAhICEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NOQVBfQUZURVIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInNlZWsgdG86ICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiBrZXlmcmFtZSBzZWVraW5nOiVkLCAlcyIsIEdTVF9USU1FX0FSR1MgKHNlZWtfdGltZSksIGtleWZyYW1lLAorICAgICAgc25hcF90eXBlc1tiZWZvcmUgPyAxIDogMF1bYWZ0ZXIgPyAxIDogMF0pOworCisgIC8qIEZJWE1FLCB0aGlzIGNvZGUgYXNzdW1lcyB0aGUgbWFpbiBzdHJlYW0gd2l0aCBrZXlmcmFtZXMgaXMgc3RyZWFtIDAsCisgICAqIHdoaWNoIGlzIG1vc3RseSBjb3JyZWN0Li4uICovCisgIHN0cmVhbSA9ICZhdmktPnN0cmVhbVthdmktPm1haW5fc3RyZWFtXTsKKworICBuZXh0ID0gYWZ0ZXIgJiYgIWJlZm9yZTsKKyAgaWYgKHNlZ21lbnQtPnJhdGUgPCAwKQorICAgIG5leHQgPSAhbmV4dDsKKworICAvKiBnZXQgdGhlIGVudHJ5IGluZGV4IGZvciB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uICovCisgIGluZGV4ID0gZ3N0X2F2aV9kZW11eF9pbmRleF9mb3JfdGltZSAoYXZpLCBzdHJlYW0sIHNlZWtfdGltZSwgbmV4dCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIkdvdCBlbnRyeSAldSIsIGluZGV4KTsKKyAgaWYgKGluZGV4ID09IC0xKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBjaGVjayBpZiB3ZSBhcmUgYWxyZWFkeSBvbiBhIGtleWZyYW1lICovCisgIGlmICghRU5UUllfSVNfS0VZRlJBTUUgKCZzdHJlYW0tPmluZGV4W2luZGV4XSkpIHsKKyAgICBpZiAobmV4dCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAibm90IGtleWZyYW1lLCBzZWFyY2hpbmcgZm9yd2FyZCIpOworICAgICAgLyogbm93IGdvIHRvIHRoZSBuZXh0IGtleWZyYW1lLCB0aGlzIGlzIHdoZXJlIHdlIHNob3VsZCBzdGFydAorICAgICAgICogZGVjb2RpbmcgZnJvbS4gKi8KKyAgICAgIGluZGV4ID0gZ3N0X2F2aV9kZW11eF9pbmRleF9uZXh0IChhdmksIHN0cmVhbSwgaW5kZXgsIFRSVUUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAibmV4dCBrZXlmcmFtZSBhdCAldSIsIGluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAibm90IGtleWZyYW1lLCBzZWFyY2hpbmcgYmFjayIpOworICAgICAgLyogbm93IGdvIHRvIHRoZSBwcmV2aW91cyBrZXlmcmFtZSwgdGhpcyBpcyB3aGVyZSB3ZSBzaG91bGQgc3RhcnQKKyAgICAgICAqIGRlY29kaW5nIGZyb20uICovCisgICAgICBpbmRleCA9IGdzdF9hdmlfZGVtdXhfaW5kZXhfcHJldiAoYXZpLCBzdHJlYW0sIGluZGV4LCBUUlVFKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInByZXZpb3VzIGtleWZyYW1lIGF0ICV1IiwgaW5kZXgpOworICAgIH0KKyAgfQorCisgIC8qIG1vdmUgdGhlIG1haW4gc3RyZWFtIHRvIHRoaXMgcG9zaXRpb24gKi8KKyAgZ3N0X2F2aV9kZW11eF9tb3ZlX3N0cmVhbSAoYXZpLCBzdHJlYW0sIHNlZ21lbnQsIGluZGV4KTsKKworICBpZiAoa2V5ZnJhbWUpIHsKKyAgICAvKiB3aGVuIHNlZWtpbmcgdG8gYSBrZXlmcmFtZSwgd2UgdXBkYXRlIHRoZSByZXN1bHQgc2VlayB0aW1lCisgICAgICogdG8gdGhlIHRpbWUgb2YgdGhlIGtleWZyYW1lLiAqLworICAgIHNlZWtfdGltZSA9IHN0cmVhbS0+Y3VycmVudF90aW1lc3RhbXA7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAia2V5ZnJhbWUgYWRqdXN0ZWQgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChzZWVrX3RpbWUpKTsKKyAgICAvKiB0aGUgc2VlayB0aW1lIGlzIGFsd2F5cyB0aGUgcG9zaXRpb24gLi4uICovCisgICAgc2VnbWVudC0+cG9zaXRpb24gPSBzZWVrX3RpbWU7CisgICAgLyogLi4uIGFuZCBzdGFydCBhbmQgc3RyZWFtIHRpbWUgd2hlbiBnb2luZyBmb3J3YXJkcywKKyAgICAgKiBvdGhlcndpc2Ugb25seSBzdG9wIHRpbWUgKi8KKyAgICBpZiAoc2VnbWVudC0+cmF0ZSA+IDAuMCkKKyAgICAgIHNlZ21lbnQtPnN0YXJ0ID0gc2VnbWVudC0+dGltZSA9IHNlZWtfdGltZTsKKyAgICBlbHNlCisgICAgICBzZWdtZW50LT5zdG9wID0gc2Vla190aW1lOworICB9CisKKyAgLyogbm93IHNldCBESVNDT05UIGFuZCBhbGlnbiB0aGUgb3RoZXIgc3RyZWFtcyAqLworICBmb3IgKGkgPSAwOyBpIDwgYXZpLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgR3N0QXZpU3RyZWFtICpvc3RyZWFtOworCisgICAgb3N0cmVhbSA9ICZhdmktPnN0cmVhbVtpXTsKKyAgICBpZiAoKG9zdHJlYW0gPT0gc3RyZWFtKSB8fCAob3N0cmVhbS0+aW5kZXggPT0gTlVMTCkpCisgICAgICBjb250aW51ZTsKKworICAgIC8qIGdldCB0aGUgZW50cnkgaW5kZXggZm9yIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gKi8KKyAgICBpbmRleCA9IGdzdF9hdmlfZGVtdXhfaW5kZXhfZm9yX3RpbWUgKGF2aSwgb3N0cmVhbSwgc2Vla190aW1lLCBGQUxTRSk7CisgICAgaWYgKGluZGV4ID09IC0xKQorICAgICAgY29udGludWU7CisKKyAgICAvKiBtb3ZlIHRvIHByZXZpb3VzIGtleWZyYW1lICovCisgICAgaWYgKCFFTlRSWV9JU19LRVlGUkFNRSAoJm9zdHJlYW0tPmluZGV4W2luZGV4XSkpCisgICAgICBpbmRleCA9IGdzdF9hdmlfZGVtdXhfaW5kZXhfcHJldiAoYXZpLCBvc3RyZWFtLCBpbmRleCwgVFJVRSk7CisKKyAgICBnc3RfYXZpX2RlbXV4X21vdmVfc3RyZWFtIChhdmksIG9zdHJlYW0sIHNlZ21lbnQsIGluZGV4KTsKKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJkb25lIHNlZWsgdG86ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHNlZWtfdGltZSkpOworCisgIHJldHVybiBUUlVFOworfQorCisvKgorICogSGFuZGxlIHNlZWsgZXZlbnQgaW4gcHVsbCBtb2RlLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdmlfZGVtdXhfaGFuZGxlX3NlZWsgKEdzdEF2aURlbXV4ICogYXZpLCBHc3RQYWQgKiBwYWQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdkb3VibGUgcmF0ZTsKKyAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgR3N0U2Vla0ZsYWdzIGZsYWdzOworICBHc3RTZWVrVHlwZSBjdXJfdHlwZSA9IEdTVF9TRUVLX1RZUEVfTk9ORSwgc3RvcF90eXBlOworICBnaW50NjQgY3VyLCBzdG9wOworICBnYm9vbGVhbiBmbHVzaDsKKyAgZ2Jvb2xlYW4gdXBkYXRlOworICBHc3RTZWdtZW50IHNlZWtzZWdtZW50ID0geyAwLCB9OworICBnaW50IGk7CisgIGd1aW50MzIgc2VxbnVtID0gMDsKKworICBpZiAoZXZlbnQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJkb2luZyBzZWVrIHdpdGggZXZlbnQiKTsKKworICAgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgJnJhdGUsICZmb3JtYXQsICZmbGFncywKKyAgICAgICAgJmN1cl90eXBlLCAmY3VyLCAmc3RvcF90eXBlLCAmc3RvcCk7CisgICAgc2VxbnVtID0gZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KTsKKworICAgIC8qIHdlIGhhdmUgdG8gaGF2ZSBhIGZvcm1hdCBhcyB0aGUgc2VnbWVudCBmb3JtYXQuIFRyeSB0byBjb252ZXJ0CisgICAgICogaWYgbm90LiAqLworICAgIGlmIChmb3JtYXQgIT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICBnYm9vbGVhbiByZXMgPSBUUlVFOworCisgICAgICBpZiAoY3VyX3R5cGUgIT0gR1NUX1NFRUtfVFlQRV9OT05FKQorICAgICAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2NvbnZlcnQgKHBhZCwgZm9ybWF0LCBjdXIsIEdTVF9GT1JNQVRfVElNRSwgJmN1cik7CisgICAgICBpZiAocmVzICYmIHN0b3BfdHlwZSAhPSBHU1RfU0VFS19UWVBFX05PTkUpCisgICAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfY29udmVydCAocGFkLCBmb3JtYXQsIHN0b3AsIEdTVF9GT1JNQVRfVElNRSwgJnN0b3ApOworICAgICAgaWYgKCFyZXMpCisgICAgICAgIGdvdG8gbm9fZm9ybWF0OworCisgICAgICBmb3JtYXQgPSBHU1RfRk9STUFUX1RJTUU7CisgICAgfQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwKKyAgICAgICAgInNlZWsgcmVxdWVzdGVkOiByYXRlICVnIGN1ciAlIiBHU1RfVElNRV9GT1JNQVQgIiBzdG9wICUiCisgICAgICAgIEdTVF9USU1FX0ZPUk1BVCwgcmF0ZSwgR1NUX1RJTUVfQVJHUyAoY3VyKSwgR1NUX1RJTUVfQVJHUyAoc3RvcCkpOworICAgIC8qIEZJWE1FOiBjYW4gd2UgZG8gYW55dGhpbmcgd2l0aCByYXRlIT0xLjAgKi8KKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJkb2luZyBzZWVrIHdpdGhvdXQgZXZlbnQiKTsKKyAgICBmbGFncyA9IDA7CisgICAgcmF0ZSA9IDEuMDsKKyAgfQorCisgIC8qIHNhdmUgZmx1c2ggZmxhZyAqLworICBmbHVzaCA9IGZsYWdzICYgR1NUX1NFRUtfRkxBR19GTFVTSDsKKworICBpZiAoZmx1c2gpIHsKKyAgICBHc3RFdmVudCAqZmV2ZW50ID0gZ3N0X2V2ZW50X25ld19mbHVzaF9zdGFydCAoKTsKKworICAgIGlmIChzZXFudW0pCisgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZmV2ZW50LCBzZXFudW0pOworICAgIC8qIGZvciBhIGZsdXNoaW5nIHNlZWssIHdlIHNlbmQgYSBmbHVzaF9zdGFydCBvbiBhbGwgcGFkcy4gVGhpcyB3aWxsCisgICAgICogZXZlbnR1YWxseSBzdG9wIHN0cmVhbWluZyB3aXRoIGEgV1JPTkdfU1RBVEUuIFdlIGNhbiB0aHVzIGV2ZW50dWFsbHkKKyAgICAgKiB0YWtlIHRoZSBTVFJFQU1fTE9DSy4gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJzZW5kaW5nIGZsdXNoIHN0YXJ0Iik7CisgICAgZ3N0X2F2aV9kZW11eF9wdXNoX2V2ZW50IChhdmksIGdzdF9ldmVudF9yZWYgKGZldmVudCkpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoYXZpLT5zaW5rcGFkLCBmZXZlbnQpOworICB9IGVsc2UgeworICAgIC8qIGEgbm9uLWZsdXNoaW5nIHNlZWssIHdlIFBBVVNFIHRoZSB0YXNrIHNvIHRoYXQgd2UgY2FuIHRha2UgdGhlCisgICAgICogU1RSRUFNX0xPQ0sgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJub24gZmx1c2hpbmcgc2VlaywgcGF1c2luZyB0YXNrIik7CisgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChhdmktPnNpbmtwYWQpOworICB9CisKKyAgLyogd2FpdCBmb3Igc3RyZWFtaW5nIHRvIHN0b3AgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAid2FpdCBmb3Igc3RyZWFtaW5nIHRvIHN0b3AiKTsKKyAgR1NUX1BBRF9TVFJFQU1fTE9DSyAoYXZpLT5zaW5rcGFkKTsKKworICAvKiBjb3B5IHNlZ21lbnQsIHdlIG5lZWQgdGhpcyBiZWNhdXNlIHdlIHN0aWxsIG5lZWQgdGhlIG9sZAorICAgKiBzZWdtZW50IHdoZW4gd2UgY2xvc2UgdGhlIGN1cnJlbnQgc2VnbWVudC4gKi8KKyAgbWVtY3B5ICgmc2Vla3NlZ21lbnQsICZhdmktPnNlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworCisgIGlmIChldmVudCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgImNvbmZpZ3VyaW5nIHNlZWsiKTsKKyAgICBnc3Rfc2VnbWVudF9kb19zZWVrICgmc2Vla3NlZ21lbnQsIHJhdGUsIGZvcm1hdCwgZmxhZ3MsCisgICAgICAgIGN1cl90eXBlLCBjdXIsIHN0b3BfdHlwZSwgc3RvcCwgJnVwZGF0ZSk7CisgIH0KKyAgLyogZG8gdGhlIHNlZWssIHNlZWtzZWdtZW50LnBvc2l0aW9uIGNvbnRhaW5zIHRoZSBuZXcgcG9zaXRpb24sIHRoaXMKKyAgICogYWN0dWFsbHkgbmV2ZXIgZmFpbHMuICovCisgIGdzdF9hdmlfZGVtdXhfZG9fc2VlayAoYXZpLCAmc2Vla3NlZ21lbnQsIGZsYWdzKTsKKworICBpZiAoZmx1c2gpIHsKKyAgICBHc3RFdmVudCAqZmV2ZW50ID0gZ3N0X2V2ZW50X25ld19mbHVzaF9zdG9wIChUUlVFKTsKKworICAgIGlmIChzZXFudW0pCisgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZmV2ZW50LCBzZXFudW0pOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic2VuZGluZyBmbHVzaCBzdG9wIik7CisgICAgZ3N0X2F2aV9kZW11eF9wdXNoX2V2ZW50IChhdmksIGdzdF9ldmVudF9yZWYgKGZldmVudCkpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoYXZpLT5zaW5rcGFkLCBmZXZlbnQpOworICB9CisKKyAgLyogbm93IHVwZGF0ZSB0aGUgcmVhbCBzZWdtZW50IGluZm8gKi8KKyAgbWVtY3B5ICgmYXZpLT5zZWdtZW50LCAmc2Vla3NlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworCisgIC8qIHBvc3QgdGhlIFNFR01FTlRfU1RBUlQgbWVzc2FnZSB3aGVuIHdlIGRvIHNlZ21lbnRlZCBwbGF5YmFjayAqLworICBpZiAoYXZpLT5zZWdtZW50LmZsYWdzICYgR1NUX1NFRUtfRkxBR19TRUdNRU5UKSB7CisgICAgR3N0TWVzc2FnZSAqc2VnbWVudF9zdGFydF9tc2cgPQorICAgICAgICBnc3RfbWVzc2FnZV9uZXdfc2VnbWVudF9zdGFydCAoR1NUX09CSkVDVF9DQVNUIChhdmkpLAorICAgICAgICBhdmktPnNlZ21lbnQuZm9ybWF0LCBhdmktPnNlZ21lbnQucG9zaXRpb24pOworICAgIGlmIChzZXFudW0pCisgICAgICBnc3RfbWVzc2FnZV9zZXRfc2VxbnVtIChzZWdtZW50X3N0YXJ0X21zZywgc2VxbnVtKTsKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKGF2aSksIHNlZ21lbnRfc3RhcnRfbXNnKTsKKyAgfQorCisgIC8qIHF1ZXVlIHRoZSBzZWdtZW50IGV2ZW50IGZvciB0aGUgc3RyZWFtaW5nIHRocmVhZC4gKi8KKyAgaWYgKGF2aS0+c2VnX2V2ZW50KQorICAgIGdzdF9ldmVudF91bnJlZiAoYXZpLT5zZWdfZXZlbnQpOworICBhdmktPnNlZ19ldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmF2aS0+c2VnbWVudCk7CisgIGlmIChzZXFudW0pCisgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGF2aS0+c2VnX2V2ZW50LCBzZXFudW0pOworICBhdmktPnNlZ21lbnRfc2VxbnVtID0gc2VxbnVtOworCisgIGlmICghYXZpLT5zdHJlYW1pbmcpIHsKKyAgICBnc3RfcGFkX3N0YXJ0X3Rhc2sgKGF2aS0+c2lua3BhZCwgKEdzdFRhc2tGdW5jdGlvbikgZ3N0X2F2aV9kZW11eF9sb29wLAorICAgICAgICBhdmktPnNpbmtwYWQsIE5VTEwpOworICB9CisgIC8qIHJlc2V0IHRoZSBsYXN0IGZsb3cgYW5kIG1hcmsgZGlzY29udCwgc2VlayBpcyBhbHdheXMgRElTQ09OVCAqLworICBmb3IgKGkgPSAwOyBpIDwgYXZpLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAibWFya2luZyBESVNDT05UIik7CisgICAgYXZpLT5zdHJlYW1baV0uZGlzY29udCA9IFRSVUU7CisgIH0KKyAgLyogbGlrZXdpc2UgZm9yIHRoZSB3aG9sZSBuZXcgc2VnbWVudCAqLworICBnc3RfZmxvd19jb21iaW5lcl9yZXNldCAoYXZpLT5mbG93Y29tYmluZXIpOworICBHU1RfUEFEX1NUUkVBTV9VTkxPQ0sgKGF2aS0+c2lua3BhZCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19mb3JtYXQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJ1bnN1cHBvcnRlZCBmb3JtYXQgZ2l2ZW4sIHNlZWsgYWJvcnRlZC4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyoKKyAqIEhhbmRsZSBzZWVrIGV2ZW50IGluIHB1c2ggbW9kZS4KKyAqLworc3RhdGljIGdib29sZWFuCithdmlfZGVtdXhfaGFuZGxlX3NlZWtfcHVzaCAoR3N0QXZpRGVtdXggKiBhdmksIEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2RvdWJsZSByYXRlOworICBHc3RGb3JtYXQgZm9ybWF0OworICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgIEdzdFNlZWtUeXBlIGN1cl90eXBlID0gR1NUX1NFRUtfVFlQRV9OT05FLCBzdG9wX3R5cGU7CisgIGdpbnQ2NCBjdXIsIHN0b3A7CisgIGdib29sZWFuIGtleWZyYW1lLCBiZWZvcmUsIGFmdGVyLCBuZXh0OworICBHc3RBdmlTdHJlYW0gKnN0cmVhbTsKKyAgZ3VpbnQgaW5kZXg7CisgIGd1aW50IG4sIHN0cl9udW07CisgIGd1aW50NjQgbWluX29mZnNldDsKKyAgR3N0U2VnbWVudCBzZWVrc2VnbWVudDsKKyAgZ2Jvb2xlYW4gdXBkYXRlOworCisgIC8qIGNoZWNrIHdlIGhhdmUgdGhlIGluZGV4ICovCisgIGlmICghYXZpLT5oYXZlX2luZGV4KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAibm8gc2VlayBpbmRleCBidWlsdCwgc2VlayBhYm9ydGVkLiIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJkb2luZyBwdXNoLWJhc2VkIHNlZWsgd2l0aCBldmVudCIpOworICB9CisKKyAgZ3N0X2V2ZW50X3BhcnNlX3NlZWsgKGV2ZW50LCAmcmF0ZSwgJmZvcm1hdCwgJmZsYWdzLAorICAgICAgJmN1cl90eXBlLCAmY3VyLCAmc3RvcF90eXBlLCAmc3RvcCk7CisKKyAgaWYgKGZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICBnYm9vbGVhbiByZXMgPSBUUlVFOworCisgICAgaWYgKGN1cl90eXBlICE9IEdTVF9TRUVLX1RZUEVfTk9ORSkKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfY29udmVydCAocGFkLCBmb3JtYXQsIGN1ciwgR1NUX0ZPUk1BVF9USU1FLCAmY3VyKTsKKyAgICBpZiAocmVzICYmIHN0b3BfdHlwZSAhPSBHU1RfU0VFS19UWVBFX05PTkUpCisgICAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2NvbnZlcnQgKHBhZCwgZm9ybWF0LCBzdG9wLCBHU1RfRk9STUFUX1RJTUUsICZzdG9wKTsKKyAgICBpZiAoIXJlcykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAidW5zdXBwb3J0ZWQgZm9ybWF0IGdpdmVuLCBzZWVrIGFib3J0ZWQuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgZm9ybWF0ID0gR1NUX0ZPUk1BVF9USU1FOworICB9CisKKyAgLyogbGV0IGdzdF9zZWdtZW50IGhhbmRsZSBhbnkgdHJpY2t5IHN0dWZmICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgImNvbmZpZ3VyaW5nIHNlZWsiKTsKKyAgbWVtY3B5ICgmc2Vla3NlZ21lbnQsICZhdmktPnNlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworICBnc3Rfc2VnbWVudF9kb19zZWVrICgmc2Vla3NlZ21lbnQsIHJhdGUsIGZvcm1hdCwgZmxhZ3MsCisgICAgICBjdXJfdHlwZSwgY3VyLCBzdG9wX3R5cGUsIHN0b3AsICZ1cGRhdGUpOworCisgIGtleWZyYW1lID0gISAhKGZsYWdzICYgR1NUX1NFRUtfRkxBR19LRVlfVU5JVCk7CisgIGN1ciA9IHNlZWtzZWdtZW50LnBvc2l0aW9uOworICBiZWZvcmUgPSAhICEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NOQVBfQkVGT1JFKTsKKyAgYWZ0ZXIgPSAhICEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NOQVBfQUZURVIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwKKyAgICAgICJTZWVrIHJlcXVlc3RlZDogdHMgJSIgR1NUX1RJTUVfRk9STUFUICIgc3RvcCAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIsIGtmICV1LCAlcywgcmF0ZSAlbGYiLCBHU1RfVElNRV9BUkdTIChjdXIpLCBHU1RfVElNRV9BUkdTIChzdG9wKSwKKyAgICAgIGtleWZyYW1lLCBzbmFwX3R5cGVzW2JlZm9yZSA/IDEgOiAwXVthZnRlciA/IDEgOiAwXSwgcmF0ZSk7CisKKyAgaWYgKHJhdGUgPCAwKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAibmVnYXRpdmUgcmF0ZSBzZWVrIG5vdCBzdXBwb3J0ZWQgaW4gcHVzaCBtb2RlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogRklYTUUsIHRoaXMgY29kZSBhc3N1bWVzIHRoZSBtYWluIHN0cmVhbSB3aXRoIGtleWZyYW1lcyBpcyBzdHJlYW0gMCwKKyAgICogd2hpY2ggaXMgbW9zdGx5IGNvcnJlY3QuLi4gKi8KKyAgc3RyX251bSA9IGF2aS0+bWFpbl9zdHJlYW07CisgIHN0cmVhbSA9ICZhdmktPnN0cmVhbVtzdHJfbnVtXTsKKworICBuZXh0ID0gYWZ0ZXIgJiYgIWJlZm9yZTsKKyAgaWYgKHNlZWtzZWdtZW50LnJhdGUgPCAwKQorICAgIG5leHQgPSAhbmV4dDsKKworICAvKiBnZXQgdGhlIGVudHJ5IGluZGV4IGZvciB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uICovCisgIGluZGV4ID0gZ3N0X2F2aV9kZW11eF9pbmRleF9mb3JfdGltZSAoYXZpLCBzdHJlYW0sIGN1ciwgbmV4dCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInN0ciAldTogRm91bmQgZW50cnkgJXUgZm9yICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIHN0cl9udW0sIGluZGV4LCBHU1RfVElNRV9BUkdTIChjdXIpKTsKKyAgaWYgKGluZGV4ID09IC0xKQorICAgIHJldHVybiAtMTsKKworICAvKiBjaGVjayBpZiB3ZSBhcmUgYWxyZWFkeSBvbiBhIGtleWZyYW1lICovCisgIGlmICghRU5UUllfSVNfS0VZRlJBTUUgKCZzdHJlYW0tPmluZGV4W2luZGV4XSkpIHsKKyAgICBpZiAobmV4dCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiRW50cnkgaXMgbm90IGEga2V5ZnJhbWUgLSBzZWFyY2hpbmcgZm9yd2FyZCIpOworICAgICAgLyogbm93IGdvIHRvIHRoZSBuZXh0IGtleWZyYW1lLCB0aGlzIGlzIHdoZXJlIHdlIHNob3VsZCBzdGFydAorICAgICAgICogZGVjb2RpbmcgZnJvbS4gKi8KKyAgICAgIGluZGV4ID0gZ3N0X2F2aV9kZW11eF9pbmRleF9uZXh0IChhdmksIHN0cmVhbSwgaW5kZXgsIFRSVUUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiRm91bmQgcHJldmlvdXMga2V5ZnJhbWUgYXQgJXUiLCBpbmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIkVudHJ5IGlzIG5vdCBhIGtleWZyYW1lIC0gc2VhcmNoaW5nIGJhY2siKTsKKyAgICAgIC8qIG5vdyBnbyB0byB0aGUgcHJldmlvdXMga2V5ZnJhbWUsIHRoaXMgaXMgd2hlcmUgd2Ugc2hvdWxkIHN0YXJ0CisgICAgICAgKiBkZWNvZGluZyBmcm9tLiAqLworICAgICAgaW5kZXggPSBnc3RfYXZpX2RlbXV4X2luZGV4X3ByZXYgKGF2aSwgc3RyZWFtLCBpbmRleCwgVFJVRSk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJGb3VuZCBwcmV2aW91cyBrZXlmcmFtZSBhdCAldSIsIGluZGV4KTsKKyAgICB9CisgIH0KKworICBnc3RfYXZpX2RlbXV4X2dldF9idWZmZXJfaW5mbyAoYXZpLCBzdHJlYW0sIGluZGV4LAorICAgICAgJnN0cmVhbS0+Y3VycmVudF90aW1lc3RhbXAsICZzdHJlYW0tPmN1cnJlbnRfdHNfZW5kLAorICAgICAgJnN0cmVhbS0+Y3VycmVudF9vZmZzZXQsICZzdHJlYW0tPmN1cnJlbnRfb2Zmc2V0X2VuZCk7CisKKyAgLyogcmUtdXNlIGN1ciB0byBiZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBzZWVrIGFzIGl0IF93aWxsXyBiZSAqLworICBjdXIgPSBzdHJlYW0tPmN1cnJlbnRfdGltZXN0YW1wOworCisgIG1pbl9vZmZzZXQgPSBzdHJlYW0tPmluZGV4W2luZGV4XS5vZmZzZXQ7CisgIGF2aS0+c2Vla19rZl9vZmZzZXQgPSBtaW5fb2Zmc2V0IC0gODsKKworICBHU1RfREVCVUdfT0JKRUNUIChhdmksCisgICAgICAiU2VlayB0bzogdHMgJSIgR1NUX1RJTUVfRk9STUFUICIgKG9uIHN0ciAldSwgaWR4ICV1LCBvZmZzZXQgJSIKKyAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIikiLCBHU1RfVElNRV9BUkdTIChzdHJlYW0tPmN1cnJlbnRfdGltZXN0YW1wKSwgc3RyX251bSwKKyAgICAgIGluZGV4LCBtaW5fb2Zmc2V0KTsKKworICBmb3IgKG4gPSAwOyBuIDwgYXZpLT5udW1fc3RyZWFtczsgbisrKSB7CisgICAgR3N0QXZpU3RyZWFtICpzdHIgPSAmYXZpLT5zdHJlYW1bbl07CisgICAgZ3VpbnQgaWR4OworCisgICAgaWYgKG4gPT0gYXZpLT5tYWluX3N0cmVhbSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogZ2V0IHRoZSBlbnRyeSBpbmRleCBmb3IgdGhlIHJlcXVlc3RlZCBwb3NpdGlvbiAqLworICAgIGlkeCA9IGdzdF9hdmlfZGVtdXhfaW5kZXhfZm9yX3RpbWUgKGF2aSwgc3RyLCBjdXIsIEZBTFNFKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJzdHIgJXU6IEZvdW5kIGVudHJ5ICV1IGZvciAlIiBHU1RfVElNRV9GT1JNQVQsIG4sCisgICAgICAgIGlkeCwgR1NUX1RJTUVfQVJHUyAoY3VyKSk7CisgICAgaWYgKGlkeCA9PSAtMSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogY2hlY2sgaWYgd2UgYXJlIGFscmVhZHkgb24gYSBrZXlmcmFtZSAqLworICAgIGlmICghRU5UUllfSVNfS0VZRlJBTUUgKCZzdHItPmluZGV4W2lkeF0pKSB7CisgICAgICBpZiAobmV4dCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJFbnRyeSBpcyBub3QgYSBrZXlmcmFtZSAtIHNlYXJjaGluZyBmb3J3YXJkIik7CisgICAgICAgIC8qIG5vdyBnbyB0byB0aGUgbmV4dCBrZXlmcmFtZSwgdGhpcyBpcyB3aGVyZSB3ZSBzaG91bGQgc3RhcnQKKyAgICAgICAgICogZGVjb2RpbmcgZnJvbS4gKi8KKyAgICAgICAgaWR4ID0gZ3N0X2F2aV9kZW11eF9pbmRleF9uZXh0IChhdmksIHN0ciwgaWR4LCBUUlVFKTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiRm91bmQgbmV4dCBrZXlmcmFtZSBhdCAldSIsIGlkeCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJFbnRyeSBpcyBub3QgYSBrZXlmcmFtZSAtIHNlYXJjaGluZyBiYWNrIik7CisgICAgICAgIC8qIG5vdyBnbyB0byB0aGUgcHJldmlvdXMga2V5ZnJhbWUsIHRoaXMgaXMgd2hlcmUgd2Ugc2hvdWxkIHN0YXJ0CisgICAgICAgICAqIGRlY29kaW5nIGZyb20uICovCisgICAgICAgIGlkeCA9IGdzdF9hdmlfZGVtdXhfaW5kZXhfcHJldiAoYXZpLCBzdHIsIGlkeCwgVFJVRSk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIkZvdW5kIHByZXZpb3VzIGtleWZyYW1lIGF0ICV1IiwgaWR4KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnc3RfYXZpX2RlbXV4X2dldF9idWZmZXJfaW5mbyAoYXZpLCBzdHIsIGlkeCwKKyAgICAgICAgJnN0ci0+Y3VycmVudF90aW1lc3RhbXAsICZzdHItPmN1cnJlbnRfdHNfZW5kLAorICAgICAgICAmc3RyLT5jdXJyZW50X29mZnNldCwgJnN0ci0+Y3VycmVudF9vZmZzZXRfZW5kKTsKKworICAgIGlmIChzdHItPmluZGV4W2lkeF0ub2Zmc2V0IDwgbWluX29mZnNldCkgeworICAgICAgbWluX29mZnNldCA9IHN0ci0+aW5kZXhbaWR4XS5vZmZzZXQ7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksCisgICAgICAgICAgIkZvdW5kIGFuIGVhcmxpZXIgb2Zmc2V0IGF0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgc3RyICV1IiwKKyAgICAgICAgICBtaW5fb2Zmc2V0LCBuKTsKKyAgICAgIHN0cl9udW0gPSBuOworICAgICAgc3RyZWFtID0gc3RyOworICAgICAgaW5kZXggPSBpZHg7CisgICAgfQorICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLAorICAgICAgIlNlZWsgcGVyZm9ybWVkOiBzdHIgJXUsIG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFUICIsIGlkeCAldSwgdHMgJSIKKyAgICAgIEdTVF9USU1FX0ZPUk1BVCAiLCB0c19lbmQgJSIgR1NUX1RJTUVfRk9STUFUICIsIG9mZiAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAiLCBvZmZfZW5kICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHN0cl9udW0sIG1pbl9vZmZzZXQsIGluZGV4LAorICAgICAgR1NUX1RJTUVfQVJHUyAoc3RyZWFtLT5jdXJyZW50X3RpbWVzdGFtcCksCisgICAgICBHU1RfVElNRV9BUkdTIChzdHJlYW0tPmN1cnJlbnRfdHNfZW5kKSwgc3RyZWFtLT5jdXJyZW50X29mZnNldCwKKyAgICAgIHN0cmVhbS0+Y3VycmVudF9vZmZzZXRfZW5kKTsKKworICAvKiBpbmRleCBkYXRhIHJlZmVycyB0byBkYXRhLCBub3QgY2h1bmsgaGVhZGVyIChmb3IgcHVsbCBtb2RlIGNvbnZlbmllbmNlKSAqLworICBtaW5fb2Zmc2V0IC09IDg7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInNlZWtpbmcgdG8gY2h1bmsgYXQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBtaW5fb2Zmc2V0KTsKKworICBpZiAoIXBlcmZvcm1fc2Vla190b19vZmZzZXQgKGF2aSwgbWluX29mZnNldCwgZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJzZWVrIGV2ZW50IGZhaWxlZCEiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIEhhbmRsZSB3aGV0aGVyIHdlIGNhbiBwZXJmb3JtIHRoZSBzZWVrIGV2ZW50IG9yIGlmIHdlIGhhdmUgdG8gbGV0IHRoZSBjaGFpbgorICogZnVuY3Rpb24gaGFuZGxlIHNlZWtzIHRvIGJ1aWxkIHRoZSBzZWVrIGluZGV4ZXMgZmlyc3QuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9kZW11eF9oYW5kbGVfc2Vla19wdXNoIChHc3RBdmlEZW11eCAqIGF2aSwgR3N0UGFkICogcGFkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIC8qIGNoZWNrIGZvciBoYXZpbmcgcGFyc2VkIGluZGV4IGFscmVhZHkgKi8KKyAgaWYgKCFhdmktPmhhdmVfaW5kZXgpIHsKKyAgICBndWludDY0IG9mZnNldCA9IDA7CisgICAgZ2Jvb2xlYW4gYnVpbGRpbmdfaW5kZXg7CisKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKGF2aSk7CisgICAgLyogaGFuZGxlIHRoZSBzZWVrIGV2ZW50IGluIHRoZSBjaGFpbiBmdW5jdGlvbiAqLworICAgIGF2aS0+c3RhdGUgPSBHU1RfQVZJX0RFTVVYX1NFRUs7CisKKyAgICAvKiBjb3B5IHRoZSBldmVudCAqLworICAgIGlmIChhdmktPnNlZWtfZXZlbnQpCisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGF2aS0+c2Vla19ldmVudCk7CisgICAgYXZpLT5zZWVrX2V2ZW50ID0gZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworCisgICAgLyogc2V0IHRoZSBidWlsZGluZ19pbmRleCBmbGFnIHNvIHRoYXQgb25seSBvbmUgdGhyZWFkIGNhbiBzZXR1cCB0aGUKKyAgICAgKiBzdHJ1Y3R1cmVzIGZvciBpbmRleCBzZWVraW5nLiAqLworICAgIGJ1aWxkaW5nX2luZGV4ID0gYXZpLT5idWlsZGluZ19pbmRleDsKKyAgICBpZiAoIWJ1aWxkaW5nX2luZGV4KSB7CisgICAgICBhdmktPmJ1aWxkaW5nX2luZGV4ID0gVFJVRTsKKyAgICAgIGlmIChhdmktPnN0cmVhbVswXS5pbmRleGVzKSB7CisgICAgICAgIGF2aS0+b2RtbF9zdHJlYW0gPSAwOworICAgICAgICBhdmktPm9kbWxfc3ViaWR4cyA9IGF2aS0+c3RyZWFtW2F2aS0+b2RtbF9zdHJlYW1dLmluZGV4ZXM7CisgICAgICAgIG9mZnNldCA9IGF2aS0+b2RtbF9zdWJpZHhzWzBdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb2Zmc2V0ID0gYXZpLT5pZHgxX29mZnNldDsKKyAgICAgIH0KKyAgICB9CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGF2aSk7CisKKyAgICBpZiAoIWJ1aWxkaW5nX2luZGV4KSB7CisgICAgICAvKiBzZWVrIHRvIHRoZSBmaXJzdCBzdWJpbmRleCBvciBsZWdhY3kgaW5kZXggKi8KKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoYXZpLAorICAgICAgICAgICJTZWVraW5nIHRvIGxlZ2FjeSBpbmRleC9maXJzdCBzdWJpbmRleCBhdCAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgIG9mZnNldCk7CisgICAgICByZXR1cm4gcGVyZm9ybV9zZWVrX3RvX29mZnNldCAoYXZpLCBvZmZzZXQsIGdzdF9ldmVudF9nZXRfc2VxbnVtIChldmVudCkpOworICAgIH0KKworICAgIC8qIEZJWE1FOiB3ZSBoYXZlIHRvIGFsd2F5cyByZXR1cm4gdHJ1ZSBzbyB0aGF0IHdlIGRvbid0IGJsb2NrIHRoZSBzZWVrCisgICAgICogdGhyZWFkLgorICAgICAqIE5vdGU6IG1heWJlIGl0IGlzIE9LIHRvIHJldHVybiB0cnVlIGlmIHdlJ3JlIHN0aWxsIGJ1aWxkaW5nIHRoZSBpbmRleCAqLworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIGF2aV9kZW11eF9oYW5kbGVfc2Vla19wdXNoIChhdmksIHBhZCwgZXZlbnQpOworfQorCisvKgorICogSGVscGVyIGZvciBnc3RfYXZpX2RlbXV4X2ludmVydCgpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc3dhcF9saW5lIChndWludDggKiBkMSwgZ3VpbnQ4ICogZDIsIGd1aW50OCAqIHRtcCwgZ2ludCBieXRlcykKK3sKKyAgbWVtY3B5ICh0bXAsIGQxLCBieXRlcyk7CisgIG1lbWNweSAoZDEsIGQyLCBieXRlcyk7CisgIG1lbWNweSAoZDIsIHRtcCwgYnl0ZXMpOworfQorCisKKyNkZWZpbmUgZ3N0X2F2aV9kZW11eF9pc191bmNvbXByZXNzZWQoZm91cmNjKQkJXAorICAoZm91cmNjID09IEdTVF9SSUZGX0RJQiB8fAkJCQlcCisgICBmb3VyY2MgPT0gR1NUX1JJRkZfcmdiIHx8CQkJCVwKKyAgIGZvdXJjYyA9PSBHU1RfUklGRl9SR0IgfHwgZm91cmNjID09IEdTVF9SSUZGX1JBVykKKworLyoKKyAqIEludmVydCBESUIgYnVmZmVycy4uLiBUYWtlcyBleGlzdGluZyBidWZmZXIgYW5kCisgKiByZXR1cm5zIGVpdGhlciB0aGUgYnVmZmVyIG9yIGEgbmV3IG9uZSAod2l0aCBvbGQKKyAqIG9uZSBkZXJlZmVyZW5jZWQpLgorICogRklYTUU6IGNhbid0IHdlIHByZWFsbG9jYXRlIHRtcD8gYW5kIHJlbWVtYmVyIHN0cmlkZSwgYnBwPworICovCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9hdmlfZGVtdXhfaW52ZXJ0IChHc3RBdmlTdHJlYW0gKiBzdHJlYW0sIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgZ2ludCB5LCB3LCBoOworICBnaW50IGJwcCwgc3RyaWRlOworICBndWludDggKnRtcCA9IE5VTEw7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDMyIGZvdXJjYzsKKworICBpZiAoc3RyZWFtLT5zdHJoLT50eXBlICE9IEdTVF9SSUZGX0ZDQ192aWRzKQorICAgIHJldHVybiBidWY7CisKKyAgaWYgKHN0cmVhbS0+c3RyZi52aWRzID09IE5VTEwpIHsKKyAgICBHU1RfV0FSTklORyAoIkZhaWxlZCB0byByZXRyaWV2ZSB2aWRzIGZvciBzdHJlYW0iKTsKKyAgICByZXR1cm4gYnVmOworICB9CisKKyAgZm91cmNjID0gKHN0cmVhbS0+c3RyZi52aWRzLT5jb21wcmVzc2lvbikgPworICAgICAgc3RyZWFtLT5zdHJmLnZpZHMtPmNvbXByZXNzaW9uIDogc3RyZWFtLT5zdHJoLT5mY2NfaGFuZGxlcjsKKyAgaWYgKCFnc3RfYXZpX2RlbXV4X2lzX3VuY29tcHJlc3NlZCAoZm91cmNjKSkgeworICAgIHJldHVybiBidWY7ICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgbm9uIERJQiBidWZmZXJzICovCisgIH0KKworICAvKiByYXcgcmdiIGRhdGEgaXMgc3RvcmVkIHRvcGRvd24sIGJ1dCBpbnN0ZWFkIG9mIGludmVydGluZyB0aGUgYnVmZmVyLCAqLworICAvKiBzb21lIHRvb2xzIGp1c3QgbmVnYXRlIHRoZSBoZWlnaHQgZmllbGQgaW4gdGhlIGhlYWRlciAoZS5nLiBmZm1wZWcpICovCisgIGlmICgoKGdpbnQzMikgc3RyZWFtLT5zdHJmLnZpZHMtPmhlaWdodCkgPCAwKQorICAgIHJldHVybiBidWY7CisKKyAgaCA9IHN0cmVhbS0+c3RyZi52aWRzLT5oZWlnaHQ7CisgIHcgPSBzdHJlYW0tPnN0cmYudmlkcy0+d2lkdGg7CisgIGJwcCA9IHN0cmVhbS0+c3RyZi52aWRzLT5iaXRfY250ID8gc3RyZWFtLT5zdHJmLnZpZHMtPmJpdF9jbnQgOiA4OworICBzdHJpZGUgPSBHU1RfUk9VTkRfVVBfNCAodyAqIChicHAgLyA4KSk7CisKKyAgYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChidWYpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgaWYgKG1hcC5zaXplIDwgKHN0cmlkZSAqIGgpKSB7CisgICAgR1NUX1dBUk5JTkcgKCJCdWZmZXIgaXMgc21hbGxlciB0aGFuIHJlcG9ydGVkIFdpZHRoIHggSGVpZ2h0IHggRGVwdGgiKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIHJldHVybiBidWY7CisgIH0KKworICB0bXAgPSBnX21hbGxvYyAoc3RyaWRlKTsKKworICBmb3IgKHkgPSAwOyB5IDwgaCAvIDI7IHkrKykgeworICAgIHN3YXBfbGluZSAobWFwLmRhdGEgKyBzdHJpZGUgKiB5LCBtYXAuZGF0YSArIHN0cmlkZSAqIChoIC0gMSAtIHkpLCB0bXAsCisgICAgICAgIHN0cmlkZSk7CisgIH0KKworICBnX2ZyZWUgKHRtcCk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICAvKiBhcHBlbmQgcGFsZXR0ZSB0byBwYWxldHRlZCBSR0I4IGJ1ZmZlciBkYXRhICovCisgIGlmIChzdHJlYW0tPnJnYjhfcGFsZXR0ZSAhPSBOVUxMKQorICAgIGJ1ZiA9IGdzdF9idWZmZXJfYXBwZW5kIChidWYsIGdzdF9idWZmZXJfcmVmIChzdHJlYW0tPnJnYjhfcGFsZXR0ZSkpOworCisgIHJldHVybiBidWY7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9hZGRfYXNzb2MgKEdzdEF2aURlbXV4ICogYXZpLCBHc3RBdmlTdHJlYW0gKiBzdHJlYW0sCisgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwgZ3VpbnQ2NCBvZmZzZXQsIGdib29sZWFuIGtleWZyYW1lKQoreworICAvKiBkbyBub3QgYWRkIGluZGVmaW5pdGVseSBmb3Igb3Blbi1lbmRlZCBzdHJlYW1pbmcgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKGF2aS0+ZWxlbWVudF9pbmRleCAmJiBhdmktPnNlZWthYmxlKSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChhdmksICJhZGRpbmcgYXNzb2NpYXRpb24gJSIgR1NUX1RJTUVfRk9STUFUICItPiAlIgorICAgICAgICBHX0dVSU5UNjRfRk9STUFULCBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApLCBvZmZzZXQpOworICAgIGdzdF9pbmRleF9hZGRfYXNzb2NpYXRpb24gKGF2aS0+ZWxlbWVudF9pbmRleCwgYXZpLT5pbmRleF9pZCwKKyAgICAgICAga2V5ZnJhbWUgPyBHU1RfQVNTT0NJQVRJT05fRkxBR19LRVlfVU5JVCA6CisgICAgICAgIEdTVF9BU1NPQ0lBVElPTl9GTEFHX0RFTFRBX1VOSVQsIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wLAorICAgICAgICBHU1RfRk9STUFUX0JZVEVTLCBvZmZzZXQsIE5VTEwpOworICAgIC8qIGN1cnJlbnRfZW50cnkgaXMgREVGQVVMVCAoZnJhbWUgIykgKi8KKyAgICBnc3RfaW5kZXhfYWRkX2Fzc29jaWF0aW9uIChhdmktPmVsZW1lbnRfaW5kZXgsIHN0cmVhbS0+aW5kZXhfaWQsCisgICAgICAgIGtleWZyYW1lID8gR1NUX0FTU09DSUFUSU9OX0ZMQUdfS0VZX1VOSVQgOgorICAgICAgICBHU1RfQVNTT0NJQVRJT05fRkxBR19ERUxUQV9VTklULCBHU1RfRk9STUFUX1RJTUUsIHRpbWVzdGFtcCwKKyAgICAgICAgR1NUX0ZPUk1BVF9CWVRFUywgb2Zmc2V0LCBHU1RfRk9STUFUX0RFRkFVTFQsIHN0cmVhbS0+Y3VycmVudF9lbnRyeSwKKyAgICAgICAgTlVMTCk7CisgIH0KK30KKyNlbmRpZgorCisvKgorICogUmV0dXJucyB0aGUgYWdncmVnYXRlZCBHc3RGbG93UmV0dXJuLgorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9kZW11eF9jb21iaW5lX2Zsb3dzIChHc3RBdmlEZW11eCAqIGF2aSwgR3N0QXZpU3RyZWFtICogc3RyZWFtLAorICAgIEdzdEZsb3dSZXR1cm4gcmV0KQoreworICBHU1RfTE9HX09CSkVDVCAoYXZpLCAiU3RyZWFtICVzOiVzIGZsb3cgcmV0dXJuOiAlcyIsCisgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKHN0cmVhbS0+cGFkKSwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICByZXQgPSBnc3RfZmxvd19jb21iaW5lcl91cGRhdGVfcGFkX2Zsb3cgKGF2aS0+Zmxvd2NvbWJpbmVyLCBzdHJlYW0tPnBhZCwgcmV0KTsKKyAgR1NUX0xPR19PQkpFQ1QgKGF2aSwgImNvbWJpbmVkIHRvIHJldHVybiAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKworICByZXR1cm4gcmV0OworfQorCisvKiBtb3ZlIEBzdHJlYW0gdG8gdGhlIG5leHQgcG9zaXRpb24gaW4gaXRzIGluZGV4ICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9kZW11eF9hZHZhbmNlIChHc3RBdmlEZW11eCAqIGF2aSwgR3N0QXZpU3RyZWFtICogc3RyZWFtLAorICAgIEdzdEZsb3dSZXR1cm4gcmV0KQoreworICBndWludCBvbGRfZW50cnksIG5ld19lbnRyeTsKKworICBvbGRfZW50cnkgPSBzdHJlYW0tPmN1cnJlbnRfZW50cnk7CisgIC8qIG1vdmUgZm9yd2FyZHMgKi8KKyAgbmV3X2VudHJ5ID0gb2xkX2VudHJ5ICsgMTsKKworICAvKiBzZWUgaWYgd2UgcmVhY2hlZCB0aGUgZW5kICovCisgIGlmIChuZXdfZW50cnkgPj0gc3RyZWFtLT5zdG9wX2VudHJ5KSB7CisgICAgaWYgKGF2aS0+c2VnbWVudC5yYXRlIDwgMC4wKSB7CisgICAgICBpZiAoc3RyZWFtLT5zdGVwX2VudHJ5ID09IHN0cmVhbS0+c3RhcnRfZW50cnkpIHsKKyAgICAgICAgLyogd2Ugc3RlcHBlZCBhbGwgdGhlIHdheSB0byB0aGUgc3RhcnQsIGVvcyAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJyZXZlcnNlIHJlYWNoZWQgc3RhcnQgJXUiLCBzdHJlYW0tPnN0YXJ0X2VudHJ5KTsKKyAgICAgICAgZ290byBlb3M7CisgICAgICB9CisgICAgICAvKiBiYWNrd2FyZHMsIHN0b3AgYmVjb21lcyBzdGVwLCBmaW5kIGEgbmV3IHN0ZXAgKi8KKyAgICAgIHN0cmVhbS0+c3RvcF9lbnRyeSA9IHN0cmVhbS0+c3RlcF9lbnRyeTsKKyAgICAgIHN0cmVhbS0+c3RlcF9lbnRyeSA9IGdzdF9hdmlfZGVtdXhfaW5kZXhfcHJldiAoYXZpLCBzdHJlYW0sCisgICAgICAgICAgc3RyZWFtLT5zdG9wX2VudHJ5LCBUUlVFKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLAorICAgICAgICAgICJyZXZlcnNlIHBsYXliYWNrIGp1bXA6IHN0YXJ0ICV1LCBzdGVwICV1LCBzdG9wICV1IiwKKyAgICAgICAgICBzdHJlYW0tPnN0YXJ0X2VudHJ5LCBzdHJlYW0tPnN0ZXBfZW50cnksIHN0cmVhbS0+c3RvcF9lbnRyeSk7CisKKyAgICAgIC8qIGFuZCBzdGFydCBmcm9tIHRoZSBwcmV2aW91cyBrZXlmcmFtZSBub3cgKi8KKyAgICAgIG5ld19lbnRyeSA9IHN0cmVhbS0+c3RlcF9lbnRyeTsKKyAgICB9IGVsc2UgeworICAgICAgLyogRU9TICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJmb3J3YXJkIHJlYWNoZWQgc3RvcCAldSIsIHN0cmVhbS0+c3RvcF9lbnRyeSk7CisgICAgICBnb3RvIGVvczsKKyAgICB9CisgIH0KKworICBpZiAobmV3X2VudHJ5ICE9IG9sZF9lbnRyeSkgeworICAgIHN0cmVhbS0+Y3VycmVudF9lbnRyeSA9IG5ld19lbnRyeTsKKyAgICBzdHJlYW0tPmN1cnJlbnRfdG90YWwgPSBzdHJlYW0tPmluZGV4W25ld19lbnRyeV0udG90YWw7CisKKyAgICBpZiAobmV3X2VudHJ5ID09IG9sZF9lbnRyeSArIDEpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIm1vdmVkIGZvcndhcmRzIGZyb20gJXUgdG8gJXUiLAorICAgICAgICAgIG9sZF9lbnRyeSwgbmV3X2VudHJ5KTsKKyAgICAgIC8qIHdlIHNpbXBseSBtb3ZlZCBvbmUgc3RlcCBmb3J3YXJkcywgcmV1c2UgY3VycmVudCBpbmZvICovCisgICAgICBzdHJlYW0tPmN1cnJlbnRfdGltZXN0YW1wID0gc3RyZWFtLT5jdXJyZW50X3RzX2VuZDsKKyAgICAgIHN0cmVhbS0+Y3VycmVudF9vZmZzZXQgPSBzdHJlYW0tPmN1cnJlbnRfb2Zmc2V0X2VuZDsKKyAgICAgIGdzdF9hdmlfZGVtdXhfZ2V0X2J1ZmZlcl9pbmZvIChhdmksIHN0cmVhbSwgbmV3X2VudHJ5LAorICAgICAgICAgIE5VTEwsICZzdHJlYW0tPmN1cnJlbnRfdHNfZW5kLCBOVUxMLCAmc3RyZWFtLT5jdXJyZW50X29mZnNldF9lbmQpOworICAgIH0gZWxzZSB7CisgICAgICAvKiB3ZSBtb3ZlZCBESVNDT05ULCBmdWxsIHVwZGF0ZSAqLworICAgICAgZ3N0X2F2aV9kZW11eF9nZXRfYnVmZmVyX2luZm8gKGF2aSwgc3RyZWFtLCBuZXdfZW50cnksCisgICAgICAgICAgJnN0cmVhbS0+Y3VycmVudF90aW1lc3RhbXAsICZzdHJlYW0tPmN1cnJlbnRfdHNfZW5kLAorICAgICAgICAgICZzdHJlYW0tPmN1cnJlbnRfb2Zmc2V0LCAmc3RyZWFtLT5jdXJyZW50X29mZnNldF9lbmQpOworICAgICAgLyogYW5kIE1BUksgZGlzY29udCBmb3IgdGhpcyBzdHJlYW0gKi8KKyAgICAgIHN0cmVhbS0+ZGlzY29udCA9IFRSVUU7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJNb3ZlZCBmcm9tICV1IHRvICV1LCB0cyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAiLCB0c19lbmQgJSIgR1NUX1RJTUVfRk9STUFUICIsIG9mZiAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgIiwgb2ZmX2VuZCAlIiBHX0dVSU5UNjRfRk9STUFULCBvbGRfZW50cnksIG5ld19lbnRyeSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChzdHJlYW0tPmN1cnJlbnRfdGltZXN0YW1wKSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChzdHJlYW0tPmN1cnJlbnRfdHNfZW5kKSwgc3RyZWFtLT5jdXJyZW50X29mZnNldCwKKyAgICAgICAgICBzdHJlYW0tPmN1cnJlbnRfb2Zmc2V0X2VuZCk7CisgICAgfQorICB9CisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1IgKi8KK2VvczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIndlIGFyZSBFT1MiKTsKKyAgICAvKiBzZXR0aW5nIGN1cnJlbnRfdGltZXN0YW1wIHRvIC0xIG1hcmtzIEVPUyAqLworICAgIHN0cmVhbS0+Y3VycmVudF90aW1lc3RhbXAgPSAtMTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworICB9Cit9CisKKy8qIGZpbmQgdGhlIHN0cmVhbSB3aXRoIHRoZSBsb3dlc3QgY3VycmVudCBwb3NpdGlvbiB3aGVuIGdvaW5nIGZvcndhcmRzIG9yIHdpdGgKKyAqIHRoZSBoaWdoZXN0IHBvc2l0aW9uIHdoZW4gZ29pbmcgYmFja3dhcmRzLCB0aGlzIGlzIHRoZSBzdHJlYW0KKyAqIHdlIHNob3VsZCBwdXNoIGZyb20gbmV4dCAqLworc3RhdGljIGdpbnQKK2dzdF9hdmlfZGVtdXhfZmluZF9uZXh0IChHc3RBdmlEZW11eCAqIGF2aSwgZ2Zsb2F0IHJhdGUpCit7CisgIGd1aW50NjQgbWluX3RpbWUsIG1heF90aW1lOworICBndWludCBzdHJlYW1fbnVtLCBpOworCisgIG1heF90aW1lID0gMDsKKyAgbWluX3RpbWUgPSBHX01BWFVJTlQ2NDsKKyAgc3RyZWFtX251bSA9IC0xOworCisgIGZvciAoaSA9IDA7IGkgPCBhdmktPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICBndWludDY0IHBvc2l0aW9uOworICAgIEdzdEF2aVN0cmVhbSAqc3RyZWFtOworCisgICAgc3RyZWFtID0gJmF2aS0+c3RyZWFtW2ldOworCisgICAgLyogaWdub3JlIHN0cmVhbXMgdGhhdCBmaW5pc2hlZCAqLworICAgIGlmIChzdHJlYW0tPnBhZCAmJiBHU1RfUEFEX0xBU1RfRkxPV19SRVRVUk4gKHN0cmVhbS0+cGFkKSA9PSBHU1RfRkxPV19FT1MpCisgICAgICBjb250aW51ZTsKKworICAgIHBvc2l0aW9uID0gc3RyZWFtLT5jdXJyZW50X3RpbWVzdGFtcDsKKworICAgIC8qIHBvc2l0aW9uIG9mIC0xIGlzIEVPUyAqLworICAgIGlmIChwb3NpdGlvbiAhPSAtMSkgeworICAgICAgaWYgKHJhdGUgPiAwLjAgJiYgcG9zaXRpb24gPCBtaW5fdGltZSkgeworICAgICAgICBtaW5fdGltZSA9IHBvc2l0aW9uOworICAgICAgICBzdHJlYW1fbnVtID0gaTsKKyAgICAgIH0gZWxzZSBpZiAocmF0ZSA8IDAuMCAmJiBwb3NpdGlvbiA+PSBtYXhfdGltZSkgeworICAgICAgICBtYXhfdGltZSA9IHBvc2l0aW9uOworICAgICAgICBzdHJlYW1fbnVtID0gaTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0cmVhbV9udW07Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X2F2aV9kZW11eF9hbGlnbl9idWZmZXIgKEdzdEF2aURlbXV4ICogZGVtdXgsCisgICAgR3N0QnVmZmVyICogYnVmZmVyLCBnc2l6ZSBhbGlnbm1lbnQpCit7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgaWYgKG1hcC5zaXplIDwgc2l6ZW9mIChndWludHB0cikpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIHJldHVybiBidWZmZXI7CisgIH0KKworICBpZiAoKChndWludHB0cikgbWFwLmRhdGEpICYgKGFsaWdubWVudCAtIDEpKSB7CisgICAgR3N0QnVmZmVyICpuZXdfYnVmZmVyOworICAgIEdzdEFsbG9jYXRpb25QYXJhbXMgcGFyYW1zID0geyAwLCBhbGlnbm1lbnQgLSAxLCAwLCAwLCB9OworCisgICAgbmV3X2J1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLAorICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpLCAmcGFyYW1zKTsKKworICAgIC8qIENvcHkgZGF0YSAiYnkgaGFuZCIsIHNvIGVuc3VyZSBhbGlnbm1lbnQgaXMga2VwdDogKi8KKyAgICBnc3RfYnVmZmVyX2ZpbGwgKG5ld19idWZmZXIsIDAsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisKKyAgICBnc3RfYnVmZmVyX2NvcHlfaW50byAobmV3X2J1ZmZlciwgYnVmZmVyLCBHU1RfQlVGRkVSX0NPUFlfTUVUQURBVEEsIDAsIC0xKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgIldlIHdhbnQgb3V0cHV0IGFsaWduZWQgb24gJSIgR19HU0laRV9GT1JNQVQgIiwgcmVhbGxvY2F0ZWQiLAorICAgICAgICBhbGlnbm1lbnQpOworCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgICAgcmV0dXJuIG5ld19idWZmZXI7CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9kZW11eF9sb29wX2RhdGEgKEdzdEF2aURlbXV4ICogYXZpKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludCBzdHJlYW1fbnVtOworICBHc3RBdmlTdHJlYW0gKnN0cmVhbTsKKyAgZ2Jvb2xlYW4gcHJvY2Vzc2VkID0gRkFMU0U7CisgIEdzdEJ1ZmZlciAqYnVmOworICBndWludDY0IG9mZnNldCwgc2l6ZTsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwgZHVyYXRpb247CisgIGd1aW50NjQgb3V0X29mZnNldCwgb3V0X29mZnNldF9lbmQ7CisgIGdib29sZWFuIGtleWZyYW1lOworICBHc3RBdmlJbmRleEVudHJ5ICplbnRyeTsKKworICBkbyB7CisgICAgc3RyZWFtX251bSA9IGdzdF9hdmlfZGVtdXhfZmluZF9uZXh0IChhdmksIGF2aS0+c2VnbWVudC5yYXRlKTsKKworICAgIC8qIGFsbCBhcmUgRU9TICovCisgICAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbV9udW0gPT0gLTEpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJhbGwgc3RyZWFtcyBhcmUgRU9TIik7CisgICAgICBnb3RvIGVvczsKKyAgICB9CisKKyAgICAvKiB3ZSBoYXZlIHRoZSBzdHJlYW0gbm93ICovCisgICAgc3RyZWFtID0gJmF2aS0+c3RyZWFtW3N0cmVhbV9udW1dOworCisgICAgLyogc2tpcCBzdHJlYW1zIHdpdGhvdXQgcGFkcyAqLworICAgIGlmICghc3RyZWFtLT5wYWQpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgInNraXBwaW5nIGVudHJ5IGZyb20gc3RyZWFtICVkIHdpdGhvdXQgcGFkIiwKKyAgICAgICAgICBzdHJlYW1fbnVtKTsKKyAgICAgIGdvdG8gbmV4dDsKKyAgICB9CisKKyAgICAvKiBnZXQgdGhlIHRpbWluZyBpbmZvIGZvciB0aGUgZW50cnkgKi8KKyAgICB0aW1lc3RhbXAgPSBzdHJlYW0tPmN1cnJlbnRfdGltZXN0YW1wOworICAgIGR1cmF0aW9uID0gc3RyZWFtLT5jdXJyZW50X3RzX2VuZCAtIHRpbWVzdGFtcDsKKyAgICBvdXRfb2Zmc2V0ID0gc3RyZWFtLT5jdXJyZW50X29mZnNldDsKKyAgICBvdXRfb2Zmc2V0X2VuZCA9IHN0cmVhbS0+Y3VycmVudF9vZmZzZXRfZW5kOworCisgICAgLyogZ2V0IHRoZSBlbnRyeSBkYXRhIGluZm8gKi8KKyAgICBlbnRyeSA9ICZzdHJlYW0tPmluZGV4W3N0cmVhbS0+Y3VycmVudF9lbnRyeV07CisgICAgb2Zmc2V0ID0gZW50cnktPm9mZnNldDsKKyAgICBzaXplID0gZW50cnktPnNpemU7CisgICAga2V5ZnJhbWUgPSBFTlRSWV9JU19LRVlGUkFNRSAoZW50cnkpOworCisgICAgLyogc2tpcCBlbXB0eSBlbnRyaWVzICovCisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiU2tpcHBpbmcgZW50cnkgJXUgKCUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgJXApIiwKKyAgICAgICAgICBzdHJlYW0tPmN1cnJlbnRfZW50cnksIHNpemUsIHN0cmVhbS0+cGFkKTsKKyAgICAgIGdvdG8gbmV4dDsKKyAgICB9CisKKyAgICBpZiAoYXZpLT5zZWdtZW50LnJhdGUgPiAwLjApIHsKKyAgICAgIC8qIG9ubHkgY2hlY2sgdGhpcyBmb3IgZm93YXJkcyBwbGF5YmFjayBmb3Igbm93ICovCisgICAgICBpZiAoa2V5ZnJhbWUgJiYgR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGF2aS0+c2VnbWVudC5zdG9wKQorICAgICAgICAgICYmICh0aW1lc3RhbXAgPiBhdmktPnNlZ21lbnQuc3RvcCkpIHsKKyAgICAgICAgZ290byBlb3Nfc3RvcDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGtleWZyYW1lICYmIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChhdmktPnNlZ21lbnQuc3RhcnQpCisgICAgICAgICAgJiYgKHRpbWVzdGFtcCA8IGF2aS0+c2VnbWVudC5zdGFydCkpCisgICAgICAgIGdvdG8gZW9zX3N0b3A7CisgICAgfQorCisgICAgR1NUX0xPRyAoInJlYWRpbmcgYnVmZmVyIChzaXplPSUiIEdfR1VJTlQ2NF9GT1JNQVQgIiksIHN0cmVhbSAlZCwgcG9zICUiCisgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIiAoMHglIiBHX0dJTlQ2NF9NT0RJRklFUiAieCksIGtmICVkIiwgc2l6ZSwKKyAgICAgICAgc3RyZWFtX251bSwgb2Zmc2V0LCBvZmZzZXQsIGtleWZyYW1lKTsKKworICAgIC8qIEZJWE1FLCBjaGVjayBsYXJnZSBjaHVua3MgYW5kIGN1dCB0aGVtIHVwICovCisKKyAgICAvKiBwdWxsIGluIHRoZSBkYXRhICovCisgICAgYnVmID0gTlVMTDsKKyAgICByZXQgPSBnc3RfcGFkX3B1bGxfcmFuZ2UgKGF2aS0+c2lua3BhZCwgb2Zmc2V0LCBzaXplLCAmYnVmKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBwdWxsX2ZhaWxlZDsKKworICAgIC8qIGNoZWNrIGZvciBzaG9ydCBidWZmZXJzLCB0aGlzIGlzIEVPUyBhcyB3ZWxsICovCisgICAgaWYgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikgPCBzaXplKQorICAgICAgZ290byBzaG9ydF9idWZmZXI7CisKKyAgICAvKiBpbnZlcnQgdGhlIHBpY3R1cmUgaWYgbmVlZGVkLCBhbmQgYXBwZW5kIHBhbGV0dGUgZm9yIFJHQjhQICovCisgICAgYnVmID0gZ3N0X2F2aV9kZW11eF9pbnZlcnQgKHN0cmVhbSwgYnVmKTsKKworICAgIC8qIG1hcmsgbm9uLWtleWZyYW1lcyAqLworICAgIGlmIChrZXlmcmFtZSB8fCBzdHJlYW0tPmlzX3JhdykgeworICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKTsKKyAgICAgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gdGltZXN0YW1wOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKTsKKyAgICAgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICB9CisKKyAgICBHU1RfQlVGRkVSX0RUUyAoYnVmKSA9IHRpbWVzdGFtcDsKKworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikgPSBkdXJhdGlvbjsKKyAgICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSA9IG91dF9vZmZzZXQ7CisgICAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWYpID0gb3V0X29mZnNldF9lbmQ7CisKKyAgICAvKiBtYXJrIGRpc2NvbnQgd2hlbiBwZW5kaW5nICovCisgICAgaWYgKHN0cmVhbS0+ZGlzY29udCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAic2V0dGluZyBESVNDT05UIGZsYWciKTsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgICAgc3RyZWFtLT5kaXNjb250ID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgfQorI2lmIDAKKyAgICBnc3RfYXZpX2RlbXV4X2FkZF9hc3NvYyAoYXZpLCBzdHJlYW0sIHRpbWVzdGFtcCwgb2Zmc2V0LCBrZXlmcmFtZSk7CisjZW5kaWYKKworICAgIC8qIHVwZGF0ZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzZWdtZW50ICovCisgICAgYXZpLT5zZWdtZW50LnBvc2l0aW9uID0gdGltZXN0YW1wOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiUHVzaGluZyBidWZmZXIgb2Ygc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCAiLCB0cyAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiwgZHVyICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBvZmYgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAiLCBvZmZfZW5kICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZiksIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGR1cmF0aW9uKSwgb3V0X29mZnNldCwgb3V0X29mZnNldF9lbmQpOworCisgICAgaWYgKHN0cmVhbS0+YWxpZ25tZW50ID4gMSkKKyAgICAgIGJ1ZiA9IGdzdF9hdmlfZGVtdXhfYWxpZ25fYnVmZmVyIChhdmksIGJ1Ziwgc3RyZWFtLT5hbGlnbm1lbnQpOworICAgIHJldCA9IGdzdF9wYWRfcHVzaCAoc3RyZWFtLT5wYWQsIGJ1Zik7CisKKyAgICAvKiBtYXJrIGFzIHByb2Nlc3NlZCwgd2UgaW5jcmVtZW50IHRoZSBmcmFtZSBhbmQgYnl0ZSBjb3VudGVycyB0aGVuCisgICAgICogbGVhdmUgdGhlIHdoaWxlIGxvb3AgYW5kIHJldHVybiB0aGUgR3N0Rmxvd1JldHVybiAqLworICAgIHByb2Nlc3NlZCA9IFRSVUU7CisKKyAgICBpZiAoYXZpLT5zZWdtZW50LnJhdGUgPCAwKSB7CisgICAgICBpZiAodGltZXN0YW1wID4gYXZpLT5zZWdtZW50LnN0b3AgJiYgcmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgICAgICAvKiBJbiByZXZlcnNlIHBsYXliYWNrIHdlIGNhbiBnZXQgYSBHU1RfRkxPV19FT1Mgd2hlbgorICAgICAgICAgKiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgc2VnbWVudCwgc28gd2UganVzdCBuZWVkIHRvIGp1bXAKKyAgICAgICAgICogYmFjayB0byB0aGUgcHJldmlvdXMgc2VjdGlvbi4gKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiZG93bnN0cmVhbSBoYXMgcmVhY2hlZCBlbmQgb2Ygc2VnbWVudCIpOworICAgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICAgIH0KKyAgICB9CisgIG5leHQ6CisgICAgLyogbW92ZSB0byBuZXh0IGl0ZW0gKi8KKyAgICByZXQgPSBnc3RfYXZpX2RlbXV4X2FkdmFuY2UgKGF2aSwgc3RyZWFtLCByZXQpOworCisgICAgLyogY29tYmluZSBmbG93cyAqLworICAgIHJldCA9IGdzdF9hdmlfZGVtdXhfY29tYmluZV9mbG93cyAoYXZpLCBzdHJlYW0sIHJldCk7CisgIH0gd2hpbGUgKCFwcm9jZXNzZWQpOworCitiZWFjaDoKKyAgcmV0dXJuIHJldDsKKworICAvKiBzcGVjaWFsIGNhc2VzICovCitlb3M6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJObyBzYW1wbGVzIGxlZnQgZm9yIGFueSBzdHJlYW1zIC0gRU9TIik7CisgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgIGdvdG8gYmVhY2g7CisgIH0KK2Vvc19zdG9wOgorICB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGF2aSwgIkZvdW5kIGtleWZyYW1lIGFmdGVyIHNlZ21lbnQsIgorICAgICAgICAiIHNldHRpbmcgRU9TICglIiBHU1RfVElNRV9GT1JNQVQgIiA+ICUiIEdTVF9USU1FX0ZPUk1BVCAiKSIsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCksIEdTVF9USU1FX0FSR1MgKGF2aS0+c2VnbWVudC5zdG9wKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgIC8qIG1vdmUgdG8gbmV4dCBzdHJlYW0gKi8KKyAgICBnb3RvIG5leHQ7CisgIH0KK3B1bGxfZmFpbGVkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAicHVsbCByYW5nZSBmYWlsZWQ6IHBvcz0lIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICIgc2l6ZT0lIiBHX0dVSU5UNjRfRk9STUFULCBvZmZzZXQsIHNpemUpOworICAgIGdvdG8gYmVhY2g7CisgIH0KK3Nob3J0X2J1ZmZlcjoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpLCAiU2hvcnQgcmVhZCBhdCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAiLCBvbmx5IGdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiLyUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgIiBieXRlcyAodHJ1bmNhdGVkIGZpbGU/KSIsIG9mZnNldCwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSwgc2l6ZSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXQgPSBHU1RfRkxPV19FT1M7CisgICAgZ290byBiZWFjaDsKKyAgfQorfQorCisvKgorICogUmVhZCBkYXRhLiBJZiB3ZSBoYXZlIGFuIGluZGV4IGl0IGRlbGVnYXRlcyB0bworICogZ3N0X2F2aV9kZW11eF9wcm9jZXNzX25leHRfZW50cnkoKS4KKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hdmlfZGVtdXhfc3RyZWFtX2RhdGEgKEdzdEF2aURlbXV4ICogYXZpKQoreworICBndWludDMyIHRhZyA9IDA7CisgIGd1aW50MzIgc2l6ZSA9IDA7CisgIGdpbnQgc3RyZWFtX25yID0gMDsKKyAgR3N0Rmxvd1JldHVybiByZXMgPSBHU1RfRkxPV19PSzsKKworICBpZiAoR19VTkxJS0VMWSAoYXZpLT5oYXZlX2VvcykpIHsKKyAgICAvKiBDbGVhbiBhZGFwdGVyLCB3ZSdyZSBkb25lICovCisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGF2aS0+YWRhcHRlcik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKyAgfQorCisgIGlmIChHX1VOTElLRUxZIChhdmktPnRvZHJvcCkpIHsKKyAgICBndWludCBkcm9wOworCisgICAgaWYgKChkcm9wID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChhdmktPmFkYXB0ZXIpKSkgeworICAgICAgaWYgKGRyb3AgPiBhdmktPnRvZHJvcCkKKyAgICAgICAgZHJvcCA9IGF2aS0+dG9kcm9wOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiRHJvcHBpbmcgJWQgYnl0ZXMiLCBkcm9wKTsKKyAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChhdmktPmFkYXB0ZXIsIGRyb3ApOworICAgICAgYXZpLT50b2Ryb3AgLT0gZHJvcDsKKyAgICAgIGF2aS0+b2Zmc2V0ICs9IGRyb3A7CisgICAgfQorICB9CisKKyAgLyogSXRlcmF0ZSB1bnRpbCBuZWVkIG1vcmUgZGF0YSwgc28gYWRhcHRlciB3b24ndCBncm93IHRvbyBtdWNoICovCisgIHdoaWxlICgxKSB7CisgICAgaWYgKEdfVU5MSUtFTFkgKCFnc3RfYXZpX2RlbXV4X3BlZWtfY2h1bmtfaW5mbyAoYXZpLCAmdGFnLCAmc2l6ZSkpKSB7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgfQorCisgICAgR1NUX0RFQlVHICgiVHJ5aW5nIGNodW5rICglIiBHU1RfRk9VUkNDX0ZPUk1BVCAiKSwgc2l6ZSAlZCIsCisgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSwgc2l6ZSk7CisKKyAgICBpZiAoR19MSUtFTFkgKCh0YWcgJiAweGZmKSA+PSAnMCcgJiYgKHRhZyAmIDB4ZmYpIDw9ICc5JyAmJgorICAgICAgICAgICAgKCh0YWcgPj4gOCkgJiAweGZmKSA+PSAnMCcgJiYgKCh0YWcgPj4gOCkgJiAweGZmKSA8PSAnOScpKSB7CisgICAgICBHU1RfTE9HICgiQ2h1bmsgb2siKTsKKyAgICB9IGVsc2UgaWYgKCh0YWcgJiAweGZmZmYpID09ICgoJ3gnIDw8IDgpIHwgJ2knKSkgeworICAgICAgR1NUX0RFQlVHICgiRm91bmQgc3ViLWluZGV4IHRhZyIpOworICAgICAgaWYgKGdzdF9hdmlfZGVtdXhfcGVla19jaHVuayAoYXZpLCAmdGFnLCAmc2l6ZSkgfHwgc2l6ZSA9PSAwKSB7CisgICAgICAgIC8qIGFjY2VwdCAwIHNpemUgYnVmZmVyIGhlcmUgKi8KKyAgICAgICAgYXZpLT5hYm9ydF9idWZmZXJpbmcgPSBGQUxTRTsKKyAgICAgICAgR1NUX0RFQlVHICgiICBza2lwcGluZyAlZCBieXRlcyBmb3Igbm93Iiwgc2l6ZSk7CisgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChhdmktPmFkYXB0ZXIsIDggKyBHU1RfUk9VTkRfVVBfMiAoc2l6ZSkpOworICAgICAgfQorICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgIH0gZWxzZSBpZiAodGFnID09IEdTVF9SSUZGX1RBR19SSUZGKSB7CisgICAgICAvKiBSSUZGIHRhZ3MgY2FuIGFwcGVhciBpbiBPRE1MIGZpbGVzLCBqdXN0IGp1bXAgb3ZlciB0aGVtICovCisgICAgICBpZiAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChhdmktPmFkYXB0ZXIpID49IDEyKSB7CisgICAgICAgIEdTVF9ERUJVRyAoIkZvdW5kIFJJRkYgdGFnLCBza2lwcGluZyBSSUZGIGhlYWRlciIpOworICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAoYXZpLT5hZGFwdGVyLCAxMik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgIH0gZWxzZSBpZiAodGFnID09IEdTVF9SSUZGX1RBR19pZHgxKSB7CisgICAgICBHU1RfREVCVUcgKCJGb3VuZCBpbmRleCB0YWciKTsKKyAgICAgIGlmIChnc3RfYXZpX2RlbXV4X3BlZWtfY2h1bmsgKGF2aSwgJnRhZywgJnNpemUpIHx8IHNpemUgPT0gMCkgeworICAgICAgICAvKiBhY2NlcHQgMCBzaXplIGJ1ZmZlciBoZXJlICovCisgICAgICAgIGF2aS0+YWJvcnRfYnVmZmVyaW5nID0gRkFMU0U7CisgICAgICAgIEdTVF9ERUJVRyAoIiAgc2tpcHBpbmcgJWQgYnl0ZXMgZm9yIG5vdyIsIHNpemUpOworICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAoYXZpLT5hZGFwdGVyLCA4ICsgR1NUX1JPVU5EX1VQXzIgKHNpemUpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgICB9IGVsc2UgaWYgKHRhZyA9PSBHU1RfUklGRl9UQUdfTElTVCkgeworICAgICAgLyogbW92aSBjaHVua3MgbWlnaHQgYmUgZ3JvdXBlZCBpbiByZWMgbGlzdCAqLworICAgICAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoYXZpLT5hZGFwdGVyKSA+PSAxMikgeworICAgICAgICBHU1RfREVCVUcgKCJGb3VuZCBMSVNUIHRhZywgc2tpcHBpbmcgTElTVCBoZWFkZXIiKTsKKyAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGF2aS0+YWRhcHRlciwgMTIpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgICB9IGVsc2UgaWYgKHRhZyA9PSBHU1RfUklGRl9UQUdfSlVOSyB8fCB0YWcgPT0gR1NUX1JJRkZfVEFHX0pVTlEpIHsKKyAgICAgIC8qIHJlYyBsaXN0IG1pZ2h0IGNvbnRhaW4gSlVOSyBjaHVua3MgKi8KKyAgICAgIEdTVF9ERUJVRyAoIkZvdW5kIEpVTksgdGFnIik7CisgICAgICBpZiAoZ3N0X2F2aV9kZW11eF9wZWVrX2NodW5rIChhdmksICZ0YWcsICZzaXplKSB8fCBzaXplID09IDApIHsKKyAgICAgICAgLyogYWNjZXB0IDAgc2l6ZSBidWZmZXIgaGVyZSAqLworICAgICAgICBhdmktPmFib3J0X2J1ZmZlcmluZyA9IEZBTFNFOworICAgICAgICBHU1RfREVCVUcgKCIgIHNraXBwaW5nICVkIGJ5dGVzIGZvciBub3ciLCBzaXplKTsKKyAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGF2aS0+YWRhcHRlciwgOCArIEdTVF9ST1VORF9VUF8yIChzaXplKSk7CisgICAgICB9CisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVRyAoIk5vIG1vcmUgc3RyZWFtIGNodW5rcywgc2VuZCBFT1MiKTsKKyAgICAgIGF2aS0+aGF2ZV9lb3MgPSBUUlVFOworICAgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKyAgICB9CisKKyAgICBpZiAoR19VTkxJS0VMWSAoIWdzdF9hdmlfZGVtdXhfcGVla19jaHVuayAoYXZpLCAmdGFnLCAmc2l6ZSkpKSB7CisgICAgICAvKiBzdXBwb3NlZGx5IG9uZSBob3BlcyB0byBjYXRjaCBhIG5pY2VyIGNodW5rIGxhdGVyIG9uIC4uLiAqLworICAgICAgLyogRklYTUUgPz8gZ2l2ZSB1cCBoZXJlIHJhdGhlciB0aGFuIHBvc3NpYmx5IGVuZGluZyB1cCBnb2luZworICAgICAgICogdGhyb3VnaCB0aGUgd2hvbGUgZmlsZSAqLworICAgICAgaWYgKGF2aS0+YWJvcnRfYnVmZmVyaW5nKSB7CisgICAgICAgIGF2aS0+YWJvcnRfYnVmZmVyaW5nID0gRkFMU0U7CisgICAgICAgIGlmIChzaXplKSB7CisgICAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGF2aS0+YWRhcHRlciwgOCk7CisgICAgICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgICB9CisgICAgfQorICAgIEdTVF9ERUJVRyAoImNodW5rIElEICUiIEdTVF9GT1VSQ0NfRk9STUFUICIsIHNpemUgJXUiLAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHRhZyksIHNpemUpOworCisgICAgc3RyZWFtX25yID0gQ0hVTktJRF9UT19TVFJFQU1OUiAodGFnKTsKKworICAgIGlmIChHX1VOTElLRUxZIChzdHJlYW1fbnIgPCAwIHx8IHN0cmVhbV9uciA+PSBhdmktPm51bV9zdHJlYW1zKSkgeworICAgICAgLyogcmVjb3ZlcmFibGUgKi8KKyAgICAgIEdTVF9XQVJOSU5HICgiSW52YWxpZCBzdHJlYW0gSUQgJWQgKCUiIEdTVF9GT1VSQ0NfRk9STUFUICIpIiwKKyAgICAgICAgICBzdHJlYW1fbnIsIEdTVF9GT1VSQ0NfQVJHUyAodGFnKSk7CisgICAgICBhdmktPm9mZnNldCArPSA4ICsgR1NUX1JPVU5EX1VQXzIgKHNpemUpOworICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGF2aS0+YWRhcHRlciwgOCArIEdTVF9ST1VORF9VUF8yIChzaXplKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdzdEF2aVN0cmVhbSAqc3RyZWFtOworICAgICAgR3N0Q2xvY2tUaW1lIG5leHRfdHMgPSAwOworICAgICAgR3N0QnVmZmVyICpidWYgPSBOVUxMOworI2lmIDAKKyAgICAgIGd1aW50NjQgb2Zmc2V0OworI2VuZGlmCisgICAgICBnYm9vbGVhbiBzYXdfZGVzaXJlZF9rZiA9IHN0cmVhbV9uciAhPSBhdmktPm1haW5fc3RyZWFtCisgICAgICAgICAgfHwgYXZpLT5vZmZzZXQgPj0gYXZpLT5zZWVrX2tmX29mZnNldDsKKworICAgICAgaWYgKHN0cmVhbV9uciA9PSBhdmktPm1haW5fc3RyZWFtICYmIGF2aS0+b2Zmc2V0ID09IGF2aS0+c2Vla19rZl9vZmZzZXQpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLCAiRGVzaXJlZCBrZXlmcmFtZSByZWFjaGVkIik7CisgICAgICAgIGF2aS0+c2Vla19rZl9vZmZzZXQgPSAwOworICAgICAgfQorCisgICAgICBpZiAoc2F3X2Rlc2lyZWRfa2YpIHsKKyAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGF2aS0+YWRhcHRlciwgOCk7CisgICAgICAgIC8qIGdldCBidWZmZXIgKi8KKyAgICAgICAgaWYgKHNpemUpIHsKKyAgICAgICAgICBidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoYXZpLT5hZGFwdGVyLCBHU1RfUk9VTkRfVVBfMiAoc2l6ZSkpOworICAgICAgICAgIC8qIHBhdGNoIHRoZSBzaXplICovCisgICAgICAgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKGJ1ZiwgMCwgc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnVmID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpLAorICAgICAgICAgICAgIkRlc2lyZWQga2V5ZnJhbWUgbm90IHlldCByZWFjaGVkLCBmbHVzaGluZyBjaHVuayIpOworICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAoYXZpLT5hZGFwdGVyLCA4ICsgR1NUX1JPVU5EX1VQXzIgKHNpemUpKTsKKyAgICAgIH0KKworI2lmIDAKKyAgICAgIG9mZnNldCA9IGF2aS0+b2Zmc2V0OworI2VuZGlmCisgICAgICBhdmktPm9mZnNldCArPSA4ICsgR1NUX1JPVU5EX1VQXzIgKHNpemUpOworCisgICAgICBzdHJlYW0gPSAmYXZpLT5zdHJlYW1bc3RyZWFtX25yXTsKKworICAgICAgLyogc2V0IGRlbGF5IChpZiBhbnkpCisgICAgICAgICBpZiAoc3RyZWFtLT5zdHJoLT5pbml0X2ZyYW1lcyA9PSBzdHJlYW0tPmN1cnJlbnRfZnJhbWUgJiYKKyAgICAgICAgIHN0cmVhbS0+ZGVsYXkgPT0gMCkKKyAgICAgICAgIHN0cmVhbS0+ZGVsYXkgPSBuZXh0X3RzOworICAgICAgICovCisKKyAgICAgIC8qIHBhcnNpbmcgb2YgY29ycmVzcG9uZGluZyBoZWFkZXIgbWF5IGhhdmUgZmFpbGVkICovCisgICAgICBpZiAoR19VTkxJS0VMWSAoIXN0cmVhbS0+cGFkKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aSwgIm5vIHBhZCBmb3Igc3RyZWFtIElEICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTICh0YWcpKTsKKyAgICAgICAgaWYgKGJ1ZikKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZ2V0IHRpbWUgb2YgdGhpcyBidWZmZXIgKi8KKyAgICAgICAgZ3N0X3BhZF9xdWVyeV9wb3NpdGlvbiAoc3RyZWFtLT5wYWQsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgICAgIChnaW50NjQgKikgJiBuZXh0X3RzKTsKKworI2lmIDAKKyAgICAgICAgZ3N0X2F2aV9kZW11eF9hZGRfYXNzb2MgKGF2aSwgc3RyZWFtLCBuZXh0X3RzLCBvZmZzZXQsIEZBTFNFKTsKKyNlbmRpZgorCisgICAgICAgIC8qIGluY3JlbWVudCBvdXIgcG9zaXRpb25zICovCisgICAgICAgIHN0cmVhbS0+Y3VycmVudF9lbnRyeSsrOworICAgICAgICAvKiBhcyBpbiBwdWxsIG1vZGUsICd0b3RhbCcgaXMgZWl0aGVyIGJ5dGVzIChDQlIpIG9yIGZyYW1lcyAoVkJSKSAqLworICAgICAgICBpZiAoc3RyZWFtLT5zdHJoLT50eXBlID09IEdTVF9SSUZGX0ZDQ19hdWRzICYmIHN0cmVhbS0+aXNfdmJyKSB7CisgICAgICAgICAgZ2ludCBibG9ja2FsaWduID0gc3RyZWFtLT5zdHJmLmF1ZHMtPmJsb2NrYWxpZ247CisgICAgICAgICAgaWYgKGJsb2NrYWxpZ24gPiAwKQorICAgICAgICAgICAgc3RyZWFtLT5jdXJyZW50X3RvdGFsICs9IERJVl9ST1VORF9VUCAoc2l6ZSwgYmxvY2thbGlnbik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RyZWFtLT5jdXJyZW50X3RvdGFsKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RyZWFtLT5jdXJyZW50X3RvdGFsICs9IHNpemU7CisgICAgICAgIH0KKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGF2aSwgImN1cnJlbnQgZW50cnkgJXUsIHRvdGFsICV1IiwKKyAgICAgICAgICAgIHN0cmVhbS0+Y3VycmVudF9lbnRyeSwgc3RyZWFtLT5jdXJyZW50X3RvdGFsKTsKKworICAgICAgICAvKiB1cGRhdGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc2VnbWVudCAqLworICAgICAgICBhdmktPnNlZ21lbnQucG9zaXRpb24gPSBuZXh0X3RzOworCisgICAgICAgIGlmIChzYXdfZGVzaXJlZF9rZiAmJiBidWYpIHsKKyAgICAgICAgICBHc3RDbG9ja1RpbWUgZHVyX3RzID0gMDsKKworICAgICAgICAgIC8qIGludmVydCB0aGUgcGljdHVyZSBpZiBuZWVkZWQsIGFuZCBhcHBlbmQgcGFsZXR0ZSBmb3IgUkdCOFAgKi8KKyAgICAgICAgICBidWYgPSBnc3RfYXZpX2RlbXV4X2ludmVydCAoc3RyZWFtLCBidWYpOworCisgICAgICAgICAgZ3N0X3BhZF9xdWVyeV9wb3NpdGlvbiAoc3RyZWFtLT5wYWQsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgICAgICAgKGdpbnQ2NCAqKSAmIGR1cl90cyk7CisKKyAgICAgICAgICBHU1RfQlVGRkVSX0RUUyAoYnVmKSA9IG5leHRfdHM7CisgICAgICAgICAgR1NUX0JVRkZFUl9QVFMgKGJ1ZikgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikgPSBkdXJfdHMgLSBuZXh0X3RzOworICAgICAgICAgIGlmIChzdHJlYW0tPnN0cmgtPnR5cGUgPT0gR1NUX1JJRkZfRkNDX3ZpZHMpIHsKKyAgICAgICAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpID0gc3RyZWFtLT5jdXJyZW50X2VudHJ5IC0gMTsKKyAgICAgICAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmKSA9IHN0cmVhbS0+Y3VycmVudF9lbnRyeTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FOworICAgICAgICAgICAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWYpID0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksCisgICAgICAgICAgICAgICJQdXNoaW5nIGJ1ZmZlciB3aXRoIHRpbWU9JSIgR1NUX1RJTUVfRk9STUFUICIsIGR1cmF0aW9uICUiCisgICAgICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiLCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAgICAgICAiIGFuZCBzaXplICVkIG92ZXIgcGFkICVzIiwgR1NUX1RJTUVfQVJHUyAobmV4dF90cyksCisgICAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikpLAorICAgICAgICAgICAgICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSwgc2l6ZSwgR1NUX1BBRF9OQU1FIChzdHJlYW0tPnBhZCkpOworCisgICAgICAgICAgLyogbWFyayBkaXNjb250IHdoZW4gcGVuZGluZyAqLworICAgICAgICAgIGlmIChHX1VOTElLRUxZIChzdHJlYW0tPmRpc2NvbnQpKSB7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJTZXR0aW5nIERJU0NPTlQiKTsKKyAgICAgICAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgICAgICAgICAgc3RyZWFtLT5kaXNjb250ID0gRkFMU0U7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHN0cmVhbS0+YWxpZ25tZW50ID4gMSkKKyAgICAgICAgICAgIGJ1ZiA9IGdzdF9hdmlfZGVtdXhfYWxpZ25fYnVmZmVyIChhdmksIGJ1Ziwgc3RyZWFtLT5hbGlnbm1lbnQpOworICAgICAgICAgIHJlcyA9IGdzdF9wYWRfcHVzaCAoc3RyZWFtLT5wYWQsIGJ1Zik7CisgICAgICAgICAgYnVmID0gTlVMTDsKKworICAgICAgICAgIC8qIGNvbWJpbmUgZmxvd3MgKi8KKyAgICAgICAgICByZXMgPSBnc3RfYXZpX2RlbXV4X2NvbWJpbmVfZmxvd3MgKGF2aSwgc3RyZWFtLCByZXMpOworICAgICAgICAgIGlmIChHX1VOTElLRUxZIChyZXMgIT0gR1NUX0ZMT1dfT0spKSB7CisgICAgICAgICAgICBHU1RfREVCVUcgKCJQdXNoIGZhaWxlZDsgJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmVzKSk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKKy8qCisgKiBTZW5kIHBlbmRpbmcgdGFncy4KKyAqLworc3RhdGljIHZvaWQKK3B1c2hfdGFnX2xpc3RzIChHc3RBdmlEZW11eCAqIGF2aSkKK3sKKyAgZ3VpbnQgaTsKKyAgR3N0VGFnTGlzdCAqdGFnczsKKworICBpZiAoIWF2aS0+Z290X3RhZ3MpCisgICAgcmV0dXJuOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIlB1c2hpbmcgcGVuZGluZyB0YWcgbGlzdHMiKTsKKworICBmb3IgKGkgPSAwOyBpIDwgYXZpLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgR3N0QXZpU3RyZWFtICpzdHJlYW0gPSAmYXZpLT5zdHJlYW1baV07CisgICAgR3N0UGFkICpwYWQgPSBzdHJlYW0tPnBhZDsKKworICAgIHRhZ3MgPSBzdHJlYW0tPnRhZ2xpc3Q7CisKKyAgICBpZiAocGFkICYmIHRhZ3MpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIlRhZ3M6ICUiIEdTVF9QVFJfRk9STUFULCB0YWdzKTsKKworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChwYWQsIGdzdF9ldmVudF9uZXdfdGFnICh0YWdzKSk7CisgICAgICBzdHJlYW0tPnRhZ2xpc3QgPSBOVUxMOworICAgIH0KKyAgfQorCisgIGlmICghKHRhZ3MgPSBhdmktPmdsb2JhbHRhZ3MpKQorICAgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgIEdTVF9UQUdfQ09OVEFJTkVSX0ZPUk1BVCwgIkFWSSIsIE5VTEwpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgIkdsb2JhbCB0YWdzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgdGFncyk7CisgIGdzdF90YWdfbGlzdF9zZXRfc2NvcGUgKHRhZ3MsIEdTVF9UQUdfU0NPUEVfR0xPQkFMKTsKKyAgZ3N0X2F2aV9kZW11eF9wdXNoX2V2ZW50IChhdmksIGdzdF9ldmVudF9uZXdfdGFnICh0YWdzKSk7CisgIGF2aS0+Z2xvYmFsdGFncyA9IE5VTEw7CisgIGF2aS0+Z290X3RhZ3MgPSBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdmlfZGVtdXhfbG9vcCAoR3N0UGFkICogcGFkKQoreworICBHc3RGbG93UmV0dXJuIHJlczsKKyAgR3N0QXZpRGVtdXggKmF2aSA9IEdTVF9BVklfREVNVVggKEdTVF9QQURfUEFSRU5UIChwYWQpKTsKKworICBzd2l0Y2ggKGF2aS0+c3RhdGUpIHsKKyAgICBjYXNlIEdTVF9BVklfREVNVVhfU1RBUlQ6CisgICAgICByZXMgPSBnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbml0X3B1bGwgKGF2aSk7CisgICAgICBpZiAoR19VTkxJS0VMWSAocmVzICE9IEdTVF9GTE9XX09LKSkgeworICAgICAgICBHU1RfV0FSTklORyAoInN0cmVhbV9pbml0IGZsb3c6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJlcykpOworICAgICAgICBnb3RvIHBhdXNlOworICAgICAgfQorICAgICAgYXZpLT5zdGF0ZSA9IEdTVF9BVklfREVNVVhfSEVBREVSOworICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgY2FzZSBHU1RfQVZJX0RFTVVYX0hFQURFUjoKKyAgICAgIHJlcyA9IGdzdF9hdmlfZGVtdXhfc3RyZWFtX2hlYWRlcl9wdWxsIChhdmkpOworICAgICAgaWYgKEdfVU5MSUtFTFkgKHJlcyAhPSBHU1RfRkxPV19PSykpIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJzdHJlYW1faGVhZGVyIGZsb3c6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJlcykpOworICAgICAgICBnb3RvIHBhdXNlOworICAgICAgfQorICAgICAgYXZpLT5zdGF0ZSA9IEdTVF9BVklfREVNVVhfTU9WSTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FWSV9ERU1VWF9NT1ZJOgorICAgICAgaWYgKEdfVU5MSUtFTFkgKGF2aS0+c2VnX2V2ZW50KSkgeworICAgICAgICBnc3RfYXZpX2RlbXV4X3B1c2hfZXZlbnQgKGF2aSwgYXZpLT5zZWdfZXZlbnQpOworICAgICAgICBhdmktPnNlZ19ldmVudCA9IE5VTEw7CisgICAgICB9CisgICAgICBpZiAoR19VTkxJS0VMWSAoYXZpLT5nb3RfdGFncykpIHsKKyAgICAgICAgcHVzaF90YWdfbGlzdHMgKGF2aSk7CisgICAgICB9CisgICAgICAvKiBwcm9jZXNzIGVhY2ggaW5kZXggZW50cnkgaW4gdHVybiAqLworICAgICAgcmVzID0gZ3N0X2F2aV9kZW11eF9sb29wX2RhdGEgKGF2aSk7CisKKyAgICAgIC8qIHBhdXNlIHdoZW4gZXJyb3IgKi8KKyAgICAgIGlmIChHX1VOTElLRUxZIChyZXMgIT0gR1NUX0ZMT1dfT0spKSB7CisgICAgICAgIEdTVF9JTkZPICgic3RyZWFtX21vdmkgZmxvdzogJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmVzKSk7CisgICAgICAgIGdvdG8gcGF1c2U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX0VSUk9SX09CSkVDVCAoYXZpLCAidW5rbm93biBzdGF0ZSAlZCIsIGF2aS0+c3RhdGUpOworICAgICAgcmVzID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICBnb3RvIHBhdXNlOworICB9CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworcGF1c2U6eworCisgICAgZ2Jvb2xlYW4gcHVzaF9lb3MgPSBGQUxTRTsKKyAgICBHU1RfTE9HX09CSkVDVCAoYXZpLCAicGF1c2luZyB0YXNrLCByZWFzb24gJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmVzKSk7CisgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChhdmktPnNpbmtwYWQpOworCisgICAgaWYgKHJlcyA9PSBHU1RfRkxPV19FT1MpIHsKKyAgICAgIC8qIGhhbmRsZSBlbmQtb2Ytc3RyZWFtL3NlZ21lbnQgKi8KKyAgICAgIC8qIHNvIGFsaWduIG91ciBwb3NpdGlvbiB3aXRoIHRoZSBlbmQgb2YgaXQsIGlmIHRoZXJlIGlzIG9uZQorICAgICAgICogdGhpcyBlbnN1cmVzIGEgc3Vic2VxdWVudCB3aWxsIGFycml2ZSBhdCBjb3JyZWN0IGJhc2UvYWNjIHRpbWUgKi8KKyAgICAgIGlmIChhdmktPnNlZ21lbnQucmF0ZSA+IDAuMCAmJgorICAgICAgICAgIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChhdmktPnNlZ21lbnQuc3RvcCkpCisgICAgICAgIGF2aS0+c2VnbWVudC5wb3NpdGlvbiA9IGF2aS0+c2VnbWVudC5zdG9wOworICAgICAgZWxzZSBpZiAoYXZpLT5zZWdtZW50LnJhdGUgPCAwLjApCisgICAgICAgIGF2aS0+c2VnbWVudC5wb3NpdGlvbiA9IGF2aS0+c2VnbWVudC5zdGFydDsKKyAgICAgIGlmIChhdmktPnNlZ21lbnQuZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NFR01FTlQpIHsKKyAgICAgICAgZ2ludDY0IHN0b3A7CisgICAgICAgIEdzdEV2ZW50ICpldmVudDsKKyAgICAgICAgR3N0TWVzc2FnZSAqbXNnOworCisgICAgICAgIGlmICgoc3RvcCA9IGF2aS0+c2VnbWVudC5zdG9wKSA9PSAtMSkKKyAgICAgICAgICBzdG9wID0gYXZpLT5zZWdtZW50LmR1cmF0aW9uOworCisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoYXZpLCAic2VuZGluZyBzZWdtZW50X2RvbmUiKTsKKworICAgICAgICBtc2cgPQorICAgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X3NlZ21lbnRfZG9uZSAoR1NUX09CSkVDVF9DQVNUIChhdmkpLAorICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBzdG9wKTsKKyAgICAgICAgaWYgKGF2aS0+c2VnbWVudF9zZXFudW0pCisgICAgICAgICAgZ3N0X21lc3NhZ2Vfc2V0X3NlcW51bSAobXNnLCBhdmktPnNlZ21lbnRfc2VxbnVtKTsKKyAgICAgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChhdmkpLCBtc2cpOworCisgICAgICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50X2RvbmUgKEdTVF9GT1JNQVRfVElNRSwgc3RvcCk7CisgICAgICAgIGlmIChhdmktPnNlZ21lbnRfc2VxbnVtKQorICAgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgYXZpLT5zZWdtZW50X3NlcW51bSk7CisgICAgICAgIGdzdF9hdmlfZGVtdXhfcHVzaF9ldmVudCAoYXZpLCBldmVudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwdXNoX2VvcyA9IFRSVUU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXMgPT0gR1NUX0ZMT1dfTk9UX0xJTktFRCB8fCByZXMgPCBHU1RfRkxPV19FT1MpIHsKKyAgICAgIC8qIGZvciBmYXRhbCBlcnJvcnMgd2UgcG9zdCBhbiBlcnJvciBtZXNzYWdlLCB3cm9uZy1zdGF0ZSBpcworICAgICAgICogbm90IGZhdGFsIGJlY2F1c2UgaXQgaGFwcGVucyBkdWUgdG8gZmx1c2hlcyBhbmQgb25seSBtZWFucworICAgICAgICogdGhhdCB3ZSBzaG91bGQgc3RvcCBub3cuICovCisgICAgICBHU1RfRUxFTUVOVF9GTE9XX0VSUk9SIChhdmksIHJlcyk7CisgICAgICBwdXNoX2VvcyA9IFRSVUU7CisgICAgfQorICAgIGlmIChwdXNoX2VvcykgeworICAgICAgR3N0RXZlbnQgKmV2ZW50OworCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGF2aSwgInNlbmRpbmcgZW9zIik7CisgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfZW9zICgpOworICAgICAgaWYgKGF2aS0+c2VnbWVudF9zZXFudW0pCisgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgYXZpLT5zZWdtZW50X3NlcW51bSk7CisgICAgICBpZiAoIWdzdF9hdmlfZGVtdXhfcHVzaF9ldmVudCAoYXZpLCBldmVudCkgJiYgKHJlcyA9PSBHU1RfRkxPV19FT1MpKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChhdmksIFNUUkVBTSwgREVNVVgsCisgICAgICAgICAgICAoTlVMTCksICgiZ290IGVvcyBidXQgbm8gc3RyZWFtcyAoeWV0KSIpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9kZW11eF9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIEdzdEF2aURlbXV4ICphdmkgPSBHU1RfQVZJX0RFTVVYIChwYXJlbnQpOworICBnaW50IGk7CisKKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAoYnVmKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aSwgImdvdCBESVNDT05UIik7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGF2aS0+YWRhcHRlcik7CisgICAgLyogbWFyayBhbGwgc3RyZWFtcyBESVNDT05UICovCisgICAgZm9yIChpID0gMDsgaSA8IGF2aS0+bnVtX3N0cmVhbXM7IGkrKykKKyAgICAgIGF2aS0+c3RyZWFtW2ldLmRpc2NvbnQgPSBUUlVFOworICB9CisKKyAgR1NUX0RFQlVHICgiU3RvcmUgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyBpbiBhZGFwdGVyIiwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikpOworICBnc3RfYWRhcHRlcl9wdXNoIChhdmktPmFkYXB0ZXIsIGJ1Zik7CisKKyAgc3dpdGNoIChhdmktPnN0YXRlKSB7CisgICAgY2FzZSBHU1RfQVZJX0RFTVVYX1NUQVJUOgorICAgICAgaWYgKChyZXMgPSBnc3RfYXZpX2RlbXV4X3N0cmVhbV9pbml0X3B1c2ggKGF2aSkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgICAgIEdTVF9XQVJOSU5HICgic3RyZWFtX2luaXQgZmxvdzogJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmVzKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVZJX0RFTVVYX0hFQURFUjoKKyAgICAgIGlmICgocmVzID0gZ3N0X2F2aV9kZW11eF9zdHJlYW1faGVhZGVyX3B1c2ggKGF2aSkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgICAgIEdTVF9XQVJOSU5HICgic3RyZWFtX2hlYWRlciBmbG93OiAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXMpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9BVklfREVNVVhfTU9WSToKKyAgICAgIGlmIChHX1VOTElLRUxZIChhdmktPnNlZ19ldmVudCkpIHsKKyAgICAgICAgZ3N0X2F2aV9kZW11eF9wdXNoX2V2ZW50IChhdmksIGF2aS0+c2VnX2V2ZW50KTsKKyAgICAgICAgYXZpLT5zZWdfZXZlbnQgPSBOVUxMOworICAgICAgfQorICAgICAgaWYgKEdfVU5MSUtFTFkgKGF2aS0+Z290X3RhZ3MpKSB7CisgICAgICAgIHB1c2hfdGFnX2xpc3RzIChhdmkpOworICAgICAgfQorICAgICAgcmVzID0gZ3N0X2F2aV9kZW11eF9zdHJlYW1fZGF0YSAoYXZpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FWSV9ERU1VWF9TRUVLOgorICAgIHsKKyAgICAgIEdzdEV2ZW50ICpldmVudDsKKworICAgICAgcmVzID0gR1NUX0ZMT1dfT0s7CisKKyAgICAgIC8qIG9idGFpbiBhbmQgcGFyc2UgaW5kZXhlcyAqLworICAgICAgaWYgKGF2aS0+c3RyZWFtWzBdLmluZGV4ZXMgJiYgIWdzdF9hdmlfZGVtdXhfcmVhZF9zdWJpbmRleGVzX3B1c2ggKGF2aSkpCisgICAgICAgIC8qIHNlZWsgaW4gc3ViaW5kZXggcmVhZCBmdW5jdGlvbiBmYWlsZWQgKi8KKyAgICAgICAgZ290byBpbmRleF9mYWlsZWQ7CisKKyAgICAgIGlmICghYXZpLT5zdHJlYW1bMF0uaW5kZXhlcyAmJiAhYXZpLT5oYXZlX2luZGV4CisgICAgICAgICAgJiYgYXZpLT5hdmloLT5mbGFncyAmIEdTVF9SSUZGX0FWSUhfSEFTSU5ERVgpCisgICAgICAgIGdzdF9hdmlfZGVtdXhfc3RyZWFtX2luZGV4X3B1c2ggKGF2aSk7CisKKyAgICAgIGlmIChhdmktPmhhdmVfaW5kZXgpIHsKKyAgICAgICAgLyogdXNlIHRoZSBpbmRleGVzIG5vdyB0byBjb25zdHJ1Y3QgbmljZSBkdXJhdGlvbnMgKi8KKyAgICAgICAgZ3N0X2F2aV9kZW11eF9jYWxjdWxhdGVfZHVyYXRpb25zX2Zyb21faW5kZXggKGF2aSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBzdGlsbCBwYXJzaW5nIGluZGV4ZXMgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoYXZpKTsKKyAgICAgIGV2ZW50ID0gYXZpLT5zZWVrX2V2ZW50OworICAgICAgYXZpLT5zZWVrX2V2ZW50ID0gTlVMTDsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChhdmkpOworCisgICAgICAvKiBjYWxjdWxhdGUgYW5kIHBlcmZvcm0gc2VlayAqLworICAgICAgaWYgKCFhdmlfZGVtdXhfaGFuZGxlX3NlZWtfcHVzaCAoYXZpLCBhdmktPnNpbmtwYWQsIGV2ZW50KSkgeworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgZ290byBzZWVrX2ZhaWxlZDsKKyAgICAgIH0KKworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBhdmktPnN0YXRlID0gR1NUX0FWSV9ERU1VWF9NT1ZJOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXZpLCBTVFJFQU0sIEZBSUxFRCwgKE5VTEwpLAorICAgICAgICAgICgiSWxsZWdhbCBpbnRlcm5hbCBzdGF0ZSIpKTsKKyAgICAgIHJlcyA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgYnJlYWs7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJzdGF0ZTogJWQgcmVzOiVzIiwgYXZpLT5zdGF0ZSwKKyAgICAgIGdzdF9mbG93X2dldF9uYW1lIChyZXMpKTsKKworICBpZiAoR19VTkxJS0VMWSAoYXZpLT5hYm9ydF9idWZmZXJpbmcpKQorICAgIGdvdG8gYWJvcnRfYnVmZmVyaW5nOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitpbmRleF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXZpLCBTVFJFQU0sIERFTVVYLCAoTlVMTCksICgiZmFpbGVkIHRvIHJlYWQgaW5kZXhlcyIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3NlZWtfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLCAoInB1c2ggbW9kZSBzZWVrIGZhaWxlZCIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2Fib3J0X2J1ZmZlcmluZzoKKyAgeworICAgIGF2aS0+YWJvcnRfYnVmZmVyaW5nID0gRkFMU0U7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGF2aSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLCAoInVuaGFuZGxlZCBidWZmZXIgc2l6ZSIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYXZpX2RlbXV4X3NpbmtfYWN0aXZhdGUgKEdzdFBhZCAqIHNpbmtwYWQsIEdzdE9iamVjdCAqIHBhcmVudCkKK3sKKyAgR3N0UXVlcnkgKnF1ZXJ5OworICBnYm9vbGVhbiBwdWxsX21vZGU7CisKKyAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X3NjaGVkdWxpbmcgKCk7CisKKyAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnkgKHNpbmtwYWQsIHF1ZXJ5KSkgeworICAgIGdzdF9xdWVyeV91bnJlZiAocXVlcnkpOworICAgIGdvdG8gYWN0aXZhdGVfcHVzaDsKKyAgfQorCisgIHB1bGxfbW9kZSA9IGdzdF9xdWVyeV9oYXNfc2NoZWR1bGluZ19tb2RlX3dpdGhfZmxhZ3MgKHF1ZXJ5LAorICAgICAgR1NUX1BBRF9NT0RFX1BVTEwsIEdTVF9TQ0hFRFVMSU5HX0ZMQUdfU0VFS0FCTEUpOworICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKworICBpZiAoIXB1bGxfbW9kZSkKKyAgICBnb3RvIGFjdGl2YXRlX3B1c2g7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2lua3BhZCwgImFjdGl2YXRpbmcgcHVsbCIpOworICByZXR1cm4gZ3N0X3BhZF9hY3RpdmF0ZV9tb2RlIChzaW5rcGFkLCBHU1RfUEFEX01PREVfUFVMTCwgVFJVRSk7CisKK2FjdGl2YXRlX3B1c2g6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rcGFkLCAiYWN0aXZhdGluZyBwdXNoIik7CisgICAgcmV0dXJuIGdzdF9wYWRfYWN0aXZhdGVfbW9kZSAoc2lua3BhZCwgR1NUX1BBRF9NT0RFX1BVU0gsIFRSVUUpOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9kZW11eF9zaW5rX2FjdGl2YXRlX21vZGUgKEdzdFBhZCAqIHNpbmtwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RBdmlEZW11eCAqYXZpID0gR1NUX0FWSV9ERU1VWCAocGFyZW50KTsKKworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIEdTVF9QQURfTU9ERV9QVUxMOgorICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICBhdmktPnN0cmVhbWluZyA9IEZBTFNFOworICAgICAgICByZXMgPSBnc3RfcGFkX3N0YXJ0X3Rhc2sgKHNpbmtwYWQsIChHc3RUYXNrRnVuY3Rpb24pIGdzdF9hdmlfZGVtdXhfbG9vcCwKKyAgICAgICAgICAgIHNpbmtwYWQsIE5VTEwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gZ3N0X3BhZF9zdG9wX3Rhc2sgKHNpbmtwYWQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUEFEX01PREVfUFVTSDoKKyAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgR1NUX0RFQlVHICgiYXZpOiBhY3RpdmF0aW5nIHB1c2gvY2hhaW4gZnVuY3Rpb24iKTsKKyAgICAgICAgYXZpLT5zdHJlYW1pbmcgPSBUUlVFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHICgiYXZpOiBkZWFjdGl2YXRpbmcgcHVzaC9jaGFpbiBmdW5jdGlvbiIpOworICAgICAgfQorICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9kZW11eF9zZXRfaW5kZXggKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RJbmRleCAqIGluZGV4KQoreworICBHc3RBdmlEZW11eCAqYXZpID0gR1NUX0FWSV9ERU1VWCAoZWxlbWVudCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChhdmkpOworICBpZiAoYXZpLT5lbGVtZW50X2luZGV4KQorICAgIGdzdF9vYmplY3RfdW5yZWYgKGF2aS0+ZWxlbWVudF9pbmRleCk7CisgIGlmIChpbmRleCkgeworICAgIGF2aS0+ZWxlbWVudF9pbmRleCA9IGdzdF9vYmplY3RfcmVmIChpbmRleCk7CisgIH0gZWxzZSB7CisgICAgYXZpLT5lbGVtZW50X2luZGV4ID0gTlVMTDsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoYXZpKTsKKyAgLyogb2JqZWN0IGxvY2sgbWlnaHQgYmUgdGFrZW4gYWdhaW4gKi8KKyAgaWYgKGluZGV4KQorICAgIGdzdF9pbmRleF9nZXRfd3JpdGVyX2lkIChpbmRleCwgR1NUX09CSkVDVF9DQVNUIChlbGVtZW50KSwgJmF2aS0+aW5kZXhfaWQpOworICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJTZXQgaW5kZXggJSIgR1NUX1BUUl9GT1JNQVQsIGF2aS0+ZWxlbWVudF9pbmRleCk7Cit9CisKK3N0YXRpYyBHc3RJbmRleCAqCitnc3RfYXZpX2RlbXV4X2dldF9pbmRleCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdEluZGV4ICpyZXN1bHQgPSBOVUxMOworICBHc3RBdmlEZW11eCAqYXZpID0gR1NUX0FWSV9ERU1VWCAoZWxlbWVudCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChhdmkpOworICBpZiAoYXZpLT5lbGVtZW50X2luZGV4KQorICAgIHJlc3VsdCA9IGdzdF9vYmplY3RfcmVmIChhdmktPmVsZW1lbnRfaW5kZXgpOworICBHU1RfT0JKRUNUX1VOTE9DSyAoYXZpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChhdmksICJSZXR1cm5pbmcgaW5kZXggJSIgR1NUX1BUUl9GT1JNQVQsIHJlc3VsdCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9hdmlfZGVtdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RBdmlEZW11eCAqYXZpID0gR1NUX0FWSV9ERU1VWCAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGF2aS0+c3RyZWFtaW5nID0gRkFMU0U7CisgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmYXZpLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKQorICAgIGdvdG8gZG9uZTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgYXZpLT5oYXZlX2luZGV4ID0gRkFMU0U7CisgICAgICBnc3RfYXZpX2RlbXV4X3Jlc2V0IChhdmkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKK2RvbmU6CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9nc3QvYXZpL2dzdGF2aWRlbXV4LmggYi9nc3QvYXZpL2dzdGF2aWRlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlNDZhMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdmkvZ3N0YXZpZGVtdXguaApAQCAtMCwwICsxLDIyMSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gTm9raWEgQ29ycG9yYXRpb24gKGNvbnRhY3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4pCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BVklfREVNVVhfSF9fCisjZGVmaW5lIF9fR1NUX0FWSV9ERU1VWF9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImF2aS1pZHMuaCIKKyNpbmNsdWRlICJnc3QvcmlmZi9yaWZmLWlkcy5oIgorI2luY2x1ZGUgImdzdC9yaWZmL3JpZmYtcmVhZC5oIgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RmbG93Y29tYmluZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0FWSV9ERU1VWCBcCisgIChnc3RfYXZpX2RlbXV4X2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfQVZJX0RFTVVYKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9BVklfREVNVVgsIEdzdEF2aURlbXV4KSkKKyNkZWZpbmUgR1NUX0FWSV9ERU1VWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX0FWSV9ERU1VWCwgR3N0QXZpRGVtdXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BVklfREVNVVgob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX0FWSV9ERU1VWCkpCisjZGVmaW5lIEdTVF9JU19BVklfREVNVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9BVklfREVNVVgpKQorCisjZGVmaW5lIEdTVF9BVklfREVNVVhfTUFYX1NUUkVBTVMgICAgICAgMTYKKworI2RlZmluZSBDSFVOS0lEX1RPX1NUUkVBTU5SKGNodW5raWQpIFwKKyAgKCgoKGNodW5raWQpICYgMHhmZikgLSAnMCcpICogMTAgKyBcCisgICAoKChjaHVua2lkKSA+PiA4KSAmIDB4ZmYpIC0gJzAnKQorCisKKy8qIG5ldyBpbmRleCBlbnRyaWVzIDI0IGJ5dGVzICovCit0eXBlZGVmIHN0cnVjdCB7CisgIGd1aW50MzIgICAgICAgIGZsYWdzOworICBndWludDMyICAgICAgICBzaXplOyAgICAvKiBieXRlcyBvZiB0aGUgZGF0YSAqLworICBndWludDY0ICAgICAgICBvZmZzZXQ7ICAvKiBkYXRhIG9mZnNldCBpbiBmaWxlICovCisgIGd1aW50NjQgICAgICAgIHRvdGFsOyAgIC8qIHRvdGFsIGJ5dGVzIGJlZm9yZSAqLworfSBHc3RBdmlJbmRleEVudHJ5OworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIGluZGV4IG9mIHRoaXMgc3RyZWFtY29udGV4dCAqLworICBndWludCAgICAgICAgICBudW07CisKKyAgLyogcGFkKi8KKyAgR3N0UGFkICAgICAgICAqcGFkOworICBnYm9vbGVhbiAgICAgICBleHBvc2VkOworCisgIC8qIHN0cmVhbSBpbmZvIGFuZCBoZWFkZXJzICovCisgIGdzdF9yaWZmX3N0cmggKnN0cmg7CisgIHVuaW9uIHsKKyAgICBnc3RfcmlmZl9zdHJmX3ZpZHMgKnZpZHM7CisgICAgZ3N0X3JpZmZfc3RyZl9hdWRzICphdWRzOworICAgIGdzdF9yaWZmX3N0cmZfaWF2cyAqaWF2czsKKyAgICBncG9pbnRlciAgICAgZGF0YTsKKyAgfSBzdHJmOworICBHc3RCdWZmZXIgICAgICpleHRyYWRhdGEsICppbml0ZGF0YTsKKyAgR3N0QnVmZmVyICAgICAqcmdiOF9wYWxldHRlOworICBnY2hhciAgICAgICAgICpuYW1lOworCisgIC8qIHRoZSBzdGFydC9zdGVwL3N0b3AgZW50cmllcyAqLworICBndWludCAgICAgICAgICBzdGFydF9lbnRyeTsKKyAgZ3VpbnQgICAgICAgICAgc3RlcF9lbnRyeTsKKyAgZ3VpbnQgICAgICAgICAgc3RvcF9lbnRyeTsKKworICAvKiBjdXJyZW50IGluZGV4IGVudHJ5ICovCisgIGd1aW50ICAgICAgICAgIGN1cnJlbnRfZW50cnk7CisgIC8qIHBvc2l0aW9uIChieXRlLCBmcmFtZSwgdGltZSkgZm9yIGN1cnJlbnRfZW50cnkgKi8KKyAgZ3VpbnQgICAgICAgICAgY3VycmVudF90b3RhbDsKKyAgR3N0Q2xvY2tUaW1lICAgY3VycmVudF90aW1lc3RhbXA7CisgIEdzdENsb2NrVGltZSAgIGN1cnJlbnRfdHNfZW5kOworICBndWludDY0ICAgICAgICBjdXJyZW50X29mZnNldDsKKyAgZ3VpbnQ2NCAgICAgICAgY3VycmVudF9vZmZzZXRfZW5kOworCisgIGdib29sZWFuICAgICAgIGRpc2NvbnQ7CisKKyAgLyogc3RyZWFtIGxlbmd0aCAqLworICBndWludDY0ICAgICAgICB0b3RhbF9ieXRlczsKKyAgZ3VpbnQzMiAgICAgICAgdG90YWxfYmxvY2tzOworICBndWludCAgICAgICAgICBuX2tleWZyYW1lczsKKyAgLyogc3RyZWFtIGxlbmd0aCBhY2NvcmRpbmcgdG8gaW5kZXggKi8KKyAgR3N0Q2xvY2tUaW1lICAgaWR4X2R1cmF0aW9uOworICAvKiBzdHJlYW0gbGVuZ3RoIGFjY29yZGluZyB0byBoZWFkZXIgKi8KKyAgR3N0Q2xvY2tUaW1lICAgaGRyX2R1cmF0aW9uOworICAvKiBzdHJlYW0gbGVuZ3RoIGJhc2VkIG9uIGhlYWRlci9pbmRleCAqLworICBHc3RDbG9ja1RpbWUgICBkdXJhdGlvbjsKKworICAvKiBWQlIgaW5kaWNhdG9yICovCisgIGdib29sZWFuICAgICAgIGlzX3ZicjsKKworICAvKiBvcGVuRE1MIHN1cHBvcnQgKGZvciBmaWxlcyA+NEdCKSAqLworICBnYm9vbGVhbiAgICAgICBzdXBlcmluZGV4OworICBndWludDY0ICAgICAgICppbmRleGVzOworCisgIC8qIG5ldyBpbmRleGVzICovCisgIEdzdEF2aUluZGV4RW50cnkgKmluZGV4OyAgICAgLyogYXJyYXkgd2l0aCBpbmRleCBlbnRyaWVzICovCisgIGd1aW50ICAgICAgICAgICAgIGlkeF9uOyAgICAgLyogbnVtYmVyIG9mIGVudHJpZXMgKi8KKyAgZ3VpbnQgICAgICAgICAgICAgaWR4X21heDsgICAvKiBtYXggYWxsb2NhdGVkIHNpemUgb2YgZW50cmllcyAqLworCisgIEdzdFRhZ0xpc3QJKnRhZ2xpc3Q7CisKKyAgZ2ludCAgICAgICAgICAgaW5kZXhfaWQ7CisgIGdib29sZWFuIGlzX3JhdzsKKyAgZ3NpemUgYWxpZ25tZW50OworfSBHc3RBdmlTdHJlYW07CisKK3R5cGVkZWYgZW51bSB7CisgIEdTVF9BVklfREVNVVhfU1RBUlQsCisgIEdTVF9BVklfREVNVVhfSEVBREVSLAorICBHU1RfQVZJX0RFTVVYX01PVkksCisgIEdTVF9BVklfREVNVVhfU0VFSywKK30gR3N0QXZpRGVtdXhTdGF0ZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX0FWSV9ERU1VWF9IRUFERVJfVEFHX0xJU1QsCisgIEdTVF9BVklfREVNVVhfSEVBREVSX0FWSUgsCisgIEdTVF9BVklfREVNVVhfSEVBREVSX0VMRU1FTlRTLAorICBHU1RfQVZJX0RFTVVYX0hFQURFUl9JTkZPLAorICBHU1RfQVZJX0RFTVVYX0hFQURFUl9KVU5LLAorICBHU1RfQVZJX0RFTVVYX0hFQURFUl9EQVRBCit9IEdzdEF2aURlbXV4SGVhZGVyU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdmlEZW11eCB7CisgIEdzdEVsZW1lbnQgICAgIHBhcmVudDsKKworICAvKiBwYWRzICovCisgIEdzdFBhZCAgICAgICAgKnNpbmtwYWQ7CisKKyAgLyogQVZJIGRlY29kaW5nIHN0YXRlICovCisgIEdzdEF2aURlbXV4U3RhdGUgc3RhdGU7CisgIEdzdEF2aURlbXV4SGVhZGVyU3RhdGUgaGVhZGVyX3N0YXRlOworICBndWludDY0ICAgICAgICBvZmZzZXQ7CisgIGdib29sZWFuICAgICAgIGFib3J0X2J1ZmZlcmluZzsKKworICAvKiB3aGVuIHdlIGxvYWRlZCB0aGUgaW5kZXhlcyAqLworICBnYm9vbGVhbiAgICAgICBoYXZlX2luZGV4OworICAvKiBpbmRleCBvZmZzZXQgaW4gdGhlIGZpbGUgKi8KKyAgZ3VpbnQ2NCAgICAgICAgaW5kZXhfb2Zmc2V0OworCisgIC8qIHN0cmVhbXMgKi8KKyAgR3N0QXZpU3RyZWFtICAgc3RyZWFtW0dTVF9BVklfREVNVVhfTUFYX1NUUkVBTVNdOworICBndWludCAgICAgICAgICBudW1fc3RyZWFtczsKKyAgZ3VpbnQgICAgICAgICAgbnVtX3Zfc3RyZWFtczsKKyAgZ3VpbnQgICAgICAgICAgbnVtX2Ffc3RyZWFtczsKKyAgZ3VpbnQgICAgICAgICAgbnVtX3Rfc3RyZWFtczsgICAvKiBzdWJ0aXRsZSB0ZXh0IHN0cmVhbXMgKi8KKyAgZ3VpbnQgICAgICAgICAgbnVtX3NwX3N0cmVhbXM7ICAvKiBzdWJwaWN0dXJlIHN0cmVhbXMgKi8KKworICBndWludCAgICAgICAgICBtYWluX3N0cmVhbTsgLyogdXNlZCBmb3Igc2Vla2luZyAqLworCisgIEdzdEZsb3dDb21iaW5lciAqZmxvd2NvbWJpbmVyOworCisgIGdib29sZWFuICAgICAgIGhhdmVfZ3JvdXBfaWQ7CisgIGd1aW50ICAgICAgICAgIGdyb3VwX2lkOworCisgIC8qIGZvciBzdHJlYW1pbmcgbW9kZSAqLworICBnYm9vbGVhbiAgICAgICBzdHJlYW1pbmc7CisgIGdib29sZWFuICAgICAgIGhhdmVfZW9zOworICBHc3RBZGFwdGVyICAgICphZGFwdGVyOworICBndWludCAgICAgICAgICB0b2Ryb3A7CisKKyAgLyogc29tZSBzdHJlYW0gaW5mbyBmb3IgbGVuZ3RoICovCisgIGdzdF9yaWZmX2F2aWggKmF2aWg7CisgIEdzdENsb2NrVGltZSAgIGR1cmF0aW9uOworCisgIC8qIHNlZ21lbnQgaW4gVElNRSAqLworICBHc3RTZWdtZW50ICAgICBzZWdtZW50OworICBndWludDMyICAgICAgICBzZWdtZW50X3NlcW51bTsKKworICAvKiBwZW5kaW5nIHRhZ3MvZXZlbnRzICovCisgIEdzdEV2ZW50ICAgICAgKnNlZ19ldmVudDsKKyAgR3N0VGFnTGlzdAkqZ2xvYmFsdGFnczsKKyAgZ2Jvb2xlYW4JIGdvdF90YWdzOworCisjaWYgMAorICAvKiBnc3QgaW5kZXggc3VwcG9ydCAqLworICBHc3RJbmRleCAgICAgICplbGVtZW50X2luZGV4OworICBnaW50ICAgICAgICAgICBpbmRleF9pZDsKKyNlbmRpZgorCisgIGdib29sZWFuICAgICAgIHNlZWthYmxlOworCisgIGd1aW50NjQgICAgICAgIGZpcnN0X21vdmlfb2Zmc2V0OworICBndWludDY0ICAgICAgICBpZHgxX29mZnNldDsgLyogb2Zmc2V0IGluIGZpbGUgb2YgbGlzdC9jaHVuayBhZnRlciBtb3ZpICovCisgIEdzdEV2ZW50ICAgICAgKnNlZWtfZXZlbnQ7CisKKyAgZ2Jvb2xlYW4gICAgICAgYnVpbGRpbmdfaW5kZXg7CisgIGd1aW50ICAgICAgICAgIG9kbWxfc3RyZWFtOworICBndWludCAgICAgICAgICBvZG1sX3N1YmlkeDsKKyAgZ3VpbnQ2NCAgICAgICAqb2RtbF9zdWJpZHhzOworCisgIGd1aW50NjQgICAgICAgIHNlZWtfa2Zfb2Zmc2V0OyAvKiBvZmZzZXQgb2YgdGhlIGtleWZyYW1lIHRvIHdoaWNoIHdlIHdhbnQgdG8gc2VlayAqLworfSBHc3RBdmlEZW11eDsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF2aURlbXV4Q2xhc3MgeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfSBHc3RBdmlEZW11eENsYXNzOworCitHVHlwZSAgICAgICAgICAgZ3N0X2F2aV9kZW11eF9nZXRfdHlwZSAgICAgICAgICAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BVklfREVNVVhfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXZpL2dzdGF2aW11eC5jIGIvZ3N0L2F2aS9nc3RhdmltdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTNlZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2F2aS9nc3RhdmltdXguYwpAQCAtMCwwICsxLDIzMDMgQEAKKy8qIEFWSSBtdXhlciBwbHVnaW4gZm9yIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqICAgICAgICAgICAoQykgMjAwNiBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIGJhc2VkIG9uOgorICogLSB0aGUgb2xkIGF2aW11eGVyIChieSBXaW0gVGF5bWFucykKKyAqIC0geGF3dHYncyBhdml3cml0ZXIgKGJ5IEdlcmQgS25vcnIpCisgKiAtIG1qcGVndG9vbHMnIGF2aWxpYiAoYnkgUmFpbmVyIEpvaGFubmkpCisgKiAtIG9wZW5ETUwgbGFyZ2UtQVZJIGRvY3MKKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1hdmltdXgKKyAqCisgKiBNdXhlcyByYXcgb3IgY29tcHJlc3NlZCBhdWRpbyBhbmQvb3IgdmlkZW8gc3RyZWFtcyBpbnRvIGFuIEFWSSBmaWxlLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lczwvdGl0bGU+CisgKiA8cGFyYT4od3JpdGUgZXZlcnl0aGluZyBpbiBvbmUgbGluZSwgd2l0aG91dCB0aGUgYmFja3NsYXNoIGNoYXJhY3RlcnMpPC9wYXJhPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0yNTAgXAorICogISAndmlkZW8veC1yYXcsZm9ybWF0PShzdHJpbmcpSTQyMCx3aWR0aD0zMjAsaGVpZ2h0PTI0MCxmcmFtZXJhdGU9KGZyYWN0aW9uKTI1LzEnIFwKKyAqICEgcXVldWUgISBtdXguIFwKKyAqIGF1ZGlvdGVzdHNyYyBudW0tYnVmZmVycz00NDAgISBhdWRpb2NvbnZlcnQgXAorICogISAnYXVkaW8veC1yYXcscmF0ZT00NDEwMCxjaGFubmVscz0yJyAhIHF1ZXVlICEgbXV4LiBcCisgKiBhdmltdXggbmFtZT1tdXggISBmaWxlc2luayBsb2NhdGlvbj10ZXN0LmF2aQorICogXXwgVGhpcyB3aWxsIGNyZWF0ZSBhbiAuQVZJIGZpbGUgY29udGFpbmluZyBhbiB1bmNvbXByZXNzZWQgdmlkZW8gc3RyZWFtCisgKiB3aXRoIGEgdGVzdCBwaWN0dXJlIGFuZCBhbiB1bmNvbXByZXNzZWQgYXVkaW8gc3RyZWFtIGNvbnRhaW5pbmcgYQorICogdGVzdCBzb3VuZC4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB2aWRlb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MjUwIFwKKyAqICEgJ3ZpZGVvL3gtcmF3LGZvcm1hdD0oc3RyaW5nKUk0MjAsd2lkdGg9MzIwLGhlaWdodD0yNDAsZnJhbWVyYXRlPShmcmFjdGlvbikyNS8xJyBcCisgKiAhIHh2aWRlbmMgISBxdWV1ZSAhIG11eC4gXAorICogYXVkaW90ZXN0c3JjIG51bS1idWZmZXJzPTQ0MCAhIGF1ZGlvY29udmVydCAhICdhdWRpby94LXJhdyxyYXRlPTQ0MTAwLGNoYW5uZWxzPTInIFwKKyAqICEgbGFtZSAhIHF1ZXVlICEgbXV4LiBcCisgKiBhdmltdXggbmFtZT1tdXggISBmaWxlc2luayBsb2NhdGlvbj10ZXN0LmF2aQorICogXXwgVGhpcyB3aWxsIGNyZWF0ZSBhbiAuQVZJIGZpbGUgY29udGFpbmluZyB0aGUgc2FtZSB0ZXN0IHZpZGVvIGFuZCBzb3VuZAorICogYXMgYWJvdmUsIG9ubHkgdGhhdCBib3RoIHN0cmVhbXMgd2lsbCBiZSBjb21wcmVzc2VkIHRoaXMgdGltZS4gVGhpcyB3aWxsCisgKiBvbmx5IHdvcmsgaWYgeW91IGhhdmUgdGhlIG5lY2Vzc2FyeSBlbmNvZGVyIGVsZW1lbnRzIGluc3RhbGxlZCBvZiBjb3Vyc2UuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdC9nc3QtaTE4bi1wbHVnaW4uaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXdyaXRlci5oPgorCisjaW5jbHVkZSAiZ3N0YXZpbXV4LmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGF2aW11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBhdmltdXhfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQklHRklMRQorfTsKKworI2RlZmluZSBERUZBVUxUX0JJR0ZJTEUgVFJVRQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1tc3ZpZGVvIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgdmlkZW9fc2lua19mYWN0b3J5ID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInZpZGVvXyV1IiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9SRVFVRVNULAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSB7IFlVWTIsIEk0MjAsIEJHUiwgQkdSeCwgQkdSQSwgR1JBWTgsIFVZVlkgfSwgIgorICAgICAgICAid2lkdGggPSAoaW50KSBbIDE2LCA0MDk2IF0sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbIDAsIE1BWCBdOyAiCisgICAgICAgICJpbWFnZS9qcGVnLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgWyAxNiwgNDA5NiBdLCAiCisgICAgICAgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMCwgTUFYIF07ICIKKyAgICAgICAgInZpZGVvL3gtZGl2eCwgIgorICAgICAgICAid2lkdGggPSAoaW50KSBbIDE2LCA0MDk2IF0sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbIDAsIE1BWCBdLCAiCisgICAgICAgICJkaXZ4dmVyc2lvbiA9IChpbnQpIFsgMywgNSBdOyAiCisgICAgICAgICJ2aWRlby94LW1zbXBlZywgIgorICAgICAgICAid2lkdGggPSAoaW50KSBbIDE2LCA0MDk2IF0sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbIDAsIE1BWCBdLCAiCisgICAgICAgICJtc21wZWd2ZXJzaW9uID0gKGludCkgWyA0MSwgNDMgXTsgIgorICAgICAgICAidmlkZW8vbXBlZywgIgorICAgICAgICAid2lkdGggPSAoaW50KSBbIDE2LCA0MDk2IF0sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbIDAsIE1BWCBdLCAiCisgICAgICAgICJtcGVndmVyc2lvbiA9IChpbnQpIHsgMSwgMiwgNH0sICIKKyAgICAgICAgInN5c3RlbXN0cmVhbSA9IChib29sZWFuKSBGQUxTRTsgIgorICAgICAgICAidmlkZW8veC1oMjYzLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgWyAxNiwgNDA5NiBdLCAiCisgICAgICAgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMCwgTUFYIF07ICIKKyAgICAgICAgInZpZGVvL3gtaDI2NCwgIgorICAgICAgICAic3RyZWFtLWZvcm1hdCA9IChzdHJpbmcpIGJ5dGUtc3RyZWFtLCAiCisgICAgICAgICJhbGlnbm1lbnQgPSAoc3RyaW5nKSBhdSwgIgorICAgICAgICAid2lkdGggPSAoaW50KSBbIDE2LCA0MDk2IF0sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbIDAsIE1BWCBdOyAiCisgICAgICAgICJ2aWRlby94LWR2LCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIDcyMCwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgeyA1NzYsIDQ4MCB9LCAiCisgICAgICAgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMCwgTUFYIF0sICIKKyAgICAgICAgInN5c3RlbXN0cmVhbSA9IChib29sZWFuKSBGQUxTRTsgIgorICAgICAgICAidmlkZW8veC1odWZmeXV2LCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgWyAxNiwgNDA5NiBdLCAiICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMCwgTUFYIF07IgorICAgICAgICAidmlkZW8veC13bXYsICIKKyAgICAgICAgIndpZHRoID0gKGludCkgWyAxNiwgNDA5NiBdLCAiCisgICAgICAgICJoZWlnaHQgPSAoaW50KSBbIDE2LCA0MDk2IF0sICIgImZyYW1lcmF0ZSA9IChmcmFjdGlvbikgWyAwLCBNQVggXSwgIgorICAgICAgICAid212dmVyc2lvbiA9IChpbnQpIFsgMSwgM107IgorICAgICAgICAiaW1hZ2UveC1qcGMsICIKKyAgICAgICAgIndpZHRoID0gKGludCkgWyAxLCAyMTQ3NDgzNjQ3IF0sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsgMSwgMjE0NzQ4MzY0NyBdLCAiCisgICAgICAgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMCwgTUFYIF07IgorICAgICAgICAidmlkZW8veC12cDgsICIKKyAgICAgICAgIndpZHRoID0gKGludCkgWyAxLCAyMTQ3NDgzNjQ3IF0sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsgMSwgMjE0NzQ4MzY0NyBdLCAiCisgICAgICAgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMCwgTUFYIF07IgorICAgICAgICAiaW1hZ2UvcG5nLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgWyAxNiwgNDA5NiBdLCBmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMCwgTUFYIF0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBhdWRpb19zaW5rX2ZhY3RvcnkgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgiYXVkaW9fJXUiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgVTgsIFMxNkxFIH0sICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEwMDAsIDk2MDAwIF0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgWyAxLCAyIF07ICIKKyAgICAgICAgImF1ZGlvL21wZWcsICIKKyAgICAgICAgIm1wZWd2ZXJzaW9uID0gKGludCkgMSwgIgorICAgICAgICAibGF5ZXIgPSAoaW50KSBbIDEsIDMgXSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMTAwMCwgOTYwMDAgXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXTsgIgorICAgICAgICAiYXVkaW8vbXBlZywgIgorICAgICAgICAibXBlZ3ZlcnNpb24gPSAoaW50KSA0LCAiCisgICAgICAgICJzdHJlYW0tZm9ybWF0ID0gKHN0cmluZykgcmF3LCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxMDAwLCA5NjAwMCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdOyAiCisvKiNpZiAwIFZDNiBkb2Vzbid0IHN1cHBvcnQgI2lmIGhlcmUgLi4uCisgICAgICAgICJhdWRpby94LXZvcmJpcywgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMTAwMCwgOTYwMDAgXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXTsgIgorI2VuZGlmKi8KKyAgICAgICAgImF1ZGlvL3gtYWMzLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxMDAwLCA5NjAwMCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgNiBdOyAiCisgICAgICAgICJhdWRpby94LWFsYXcsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEwMDAsIDQ4MDAwIF0sICIgImNoYW5uZWxzID0gKGludCkgWyAxLCAyIF07ICIKKyAgICAgICAgImF1ZGlvL3gtbXVsYXcsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEwMDAsIDQ4MDAwIF0sICIgImNoYW5uZWxzID0gKGludCkgWyAxLCAyIF07ICIKKyAgICAgICAgImF1ZGlvL3gtd21hLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxMDAwLCA5NjAwMCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdLCAiCisgICAgICAgICJ3bWF2ZXJzaW9uID0gKGludCkgWyAxLCAyIF0gIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfYXZpX211eF9wYWRfcmVzZXQgKEdzdEF2aVBhZCAqIGF2aXBhZCwgZ2Jvb2xlYW4gZnJlZSk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hdmlfbXV4X2NvbGxlY3RfcGFkcyAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLAorICAgIEdzdEF2aU11eCAqIGF2aW11eCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F2aV9tdXhfaGFuZGxlX2V2ZW50IChHc3RDb2xsZWN0UGFkcyAqIHBhZCwKKyAgICBHc3RDb2xsZWN0RGF0YSAqIGRhdGEsIEdzdEV2ZW50ICogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSk7CitzdGF0aWMgR3N0UGFkICpnc3RfYXZpX211eF9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIHZvaWQgZ3N0X2F2aV9tdXhfcmVsZWFzZV9wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWQgKiBwYWQpOworc3RhdGljIHZvaWQgZ3N0X2F2aV9tdXhfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2F2aV9tdXhfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9hdmlfbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKKyNkZWZpbmUgZ3N0X2F2aV9tdXhfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdEF2aU11eCwgZ3N0X2F2aV9tdXgsIEdTVF9UWVBFX0VMRU1FTlQsCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9UQUdfU0VUVEVSLCBOVUxMKSk7CisKK3N0YXRpYyB2b2lkCitnc3RfYXZpX211eF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0QXZpTXV4ICptdXggPSBHU1RfQVZJX01VWCAob2JqZWN0KTsKKyAgR1NMaXN0ICpub2RlOworCisgIC8qIGNvbXBsZXRlbHkgZnJlZSBlYWNoIHNpbmtwYWQgKi8KKyAgbm9kZSA9IG11eC0+c2lua3BhZHM7CisgIHdoaWxlIChub2RlKSB7CisgICAgR3N0QXZpUGFkICphdmlwYWQgPSAoR3N0QXZpUGFkICopIG5vZGUtPmRhdGE7CisKKyAgICBub2RlID0gbm9kZS0+bmV4dDsKKworICAgIGdzdF9hdmlfbXV4X3BhZF9yZXNldCAoYXZpcGFkLCBUUlVFKTsKKyAgICBnX2ZyZWUgKGF2aXBhZCk7CisgIH0KKyAgZ19zbGlzdF9mcmVlIChtdXgtPnNpbmtwYWRzKTsKKyAgbXV4LT5zaW5rcGFkcyA9IE5VTEw7CisKKyAgZ19mcmVlIChtdXgtPmlkeCk7CisgIG11eC0+aWR4ID0gTlVMTDsKKworICBnc3Rfb2JqZWN0X3VucmVmIChtdXgtPmNvbGxlY3QpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdmlfbXV4X2NsYXNzX2luaXQgKEdzdEF2aU11eENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoYXZpbXV4X2RlYnVnLCAiYXZpbXV4IiwgMCwgIk11eGVyIGZvciBBVkkgc3RyZWFtcyIpOworCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9hdmlfbXV4X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2F2aV9tdXhfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9hdmlfbXV4X2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQklHRklMRSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiYmlnZmlsZSIsICJCaWdmaWxlIFN1cHBvcnQgKD4yR0IpIiwKKyAgICAgICAgICAiU3VwcG9ydCBmb3Igb3BlbkRNTC0yLjAgKGJpZykgQVZJIGZpbGVzIiwgREVGQVVMVF9CSUdGSUxFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPnJlcXVlc3RfbmV3X3BhZCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F2aV9tdXhfcmVxdWVzdF9uZXdfcGFkKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVsZWFzZV9wYWQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F2aV9tdXhfcmVsZWFzZV9wYWQpOworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2F2aV9tdXhfY2hhbmdlX3N0YXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmYXVkaW9fc2lua19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmdmlkZW9fc2lua19mYWN0b3J5KTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiQXZpIG11eGVyIiwKKyAgICAgICJDb2RlYy9NdXhlciIsCisgICAgICAiTXV4ZXMgYXVkaW8gYW5kIHZpZGVvIGludG8gYW4gYXZpIHN0cmVhbSIsCisgICAgICAiR1N0cmVhbWVyIG1haW50YWluZXJzIDxnc3RyZWFtZXItZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnPiIpOworfQorCisvKiByZXNldCBwYWQgdG8gaW5pdGlhbCBzdGF0ZQorICogZnJlZSAtIGlmIHRydWUsIHJlbGVhc2UgYWxsLCBub3Qgb25seSBzdHJlYW0gcmVsYXRlZCwgZGF0YSAqLworc3RhdGljIHZvaWQKK2dzdF9hdmlfbXV4X3BhZF9yZXNldCAoR3N0QXZpUGFkICogYXZpcGFkLCBnYm9vbGVhbiBmcmVlKQoreworICAvKiBnZW5lcmljIHBhcnQgKi8KKyAgbWVtc2V0ICgmKGF2aXBhZC0+aGRyKSwgMCwgc2l6ZW9mIChnc3RfcmlmZl9zdHJoKSk7CisKKyAgbWVtc2V0ICgmKGF2aXBhZC0+aWR4WzBdKSwgMCwgc2l6ZW9mIChhdmlwYWQtPmlkeCkpOworCisgIGlmIChmcmVlKSB7CisgICAgZ19mcmVlIChhdmlwYWQtPnRhZyk7CisgICAgYXZpcGFkLT50YWcgPSBOVUxMOworICAgIGdfZnJlZSAoYXZpcGFkLT5pZHhfdGFnKTsKKyAgICBhdmlwYWQtPmlkeF90YWcgPSBOVUxMOworICB9CisKKyAgaWYgKGF2aXBhZC0+aXNfdmlkZW8pIHsKKyAgICBHc3RBdmlWaWRlb1BhZCAqdmlkcGFkID0gKEdzdEF2aVZpZGVvUGFkICopIGF2aXBhZDsKKworICAgIGF2aXBhZC0+aGRyLnR5cGUgPSBHU1RfTUFLRV9GT1VSQ0MgKCd2JywgJ2knLCAnZCcsICdzJyk7CisgICAgaWYgKHZpZHBhZC0+dmlkc19jb2RlY19kYXRhKSB7CisgICAgICBnc3RfYnVmZmVyX3VucmVmICh2aWRwYWQtPnZpZHNfY29kZWNfZGF0YSk7CisgICAgICB2aWRwYWQtPnZpZHNfY29kZWNfZGF0YSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHZpZHBhZC0+cHJlcGVuZF9idWZmZXIpIHsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHZpZHBhZC0+cHJlcGVuZF9idWZmZXIpOworICAgICAgdmlkcGFkLT5wcmVwZW5kX2J1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgbWVtc2V0ICgmKHZpZHBhZC0+dmlkcyksIDAsIHNpemVvZiAoZ3N0X3JpZmZfc3RyZl92aWRzKSk7CisgICAgbWVtc2V0ICgmKHZpZHBhZC0+dnBycCksIDAsIHNpemVvZiAoZ3N0X3JpZmZfdnBycCkpOworICB9IGVsc2UgeworICAgIEdzdEF2aUF1ZGlvUGFkICphdWRwYWQgPSAoR3N0QXZpQXVkaW9QYWQgKikgYXZpcGFkOworCisgICAgYXVkcGFkLT5zYW1wbGVzID0gMDsKKworICAgIGF2aXBhZC0+aGRyLnR5cGUgPSBHU1RfTUFLRV9GT1VSQ0MgKCdhJywgJ3UnLCAnZCcsICdzJyk7CisgICAgaWYgKGF1ZHBhZC0+YXVkc19jb2RlY19kYXRhKSB7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChhdWRwYWQtPmF1ZHNfY29kZWNfZGF0YSk7CisgICAgICBhdWRwYWQtPmF1ZHNfY29kZWNfZGF0YSA9IE5VTEw7CisgICAgfQorCisgICAgbWVtc2V0ICgmKGF1ZHBhZC0+YXVkcyksIDAsIHNpemVvZiAoZ3N0X3JpZmZfc3RyZl9hdWRzKSk7CisKKyAgICBhdWRwYWQtPmF1ZGlvX3NpemUgPSAwOworICAgIGF1ZHBhZC0+YXVkaW9fdGltZSA9IDA7CisgICAgYXVkcGFkLT5tYXhfYXVkaW9fY2h1bmsgPSAwOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXZpX211eF9yZXNldCAoR3N0QXZpTXV4ICogYXZpbXV4KQoreworICBHU0xpc3QgKm5vZGUsICpuZXdsaXN0ID0gTlVMTDsKKworICAvKiBmcmVlIGFuZCByZXNldCBlYWNoIHNpbmtwYWQgKi8KKyAgbm9kZSA9IGF2aW11eC0+c2lua3BhZHM7CisgIHdoaWxlIChub2RlKSB7CisgICAgR3N0QXZpUGFkICphdmlwYWQgPSAoR3N0QXZpUGFkICopIG5vZGUtPmRhdGE7CisKKyAgICBub2RlID0gbm9kZS0+bmV4dDsKKworICAgIGdzdF9hdmlfbXV4X3BhZF9yZXNldCAoYXZpcGFkLCBGQUxTRSk7CisgICAgLyogaWYgdGhpcyBwYWQgaGFzIGNvbGxlY3RkYXRhLCBrZWVwIGl0LCBvdGhlcndpc2UgZHVtcCBpdCBjb21wbGV0ZWx5ICovCisgICAgaWYgKGF2aXBhZC0+Y29sbGVjdCkKKyAgICAgIG5ld2xpc3QgPSBnX3NsaXN0X2FwcGVuZCAobmV3bGlzdCwgYXZpcGFkKTsKKyAgICBlbHNlIHsKKyAgICAgIGdzdF9hdmlfbXV4X3BhZF9yZXNldCAoYXZpcGFkLCBUUlVFKTsKKyAgICAgIGdfZnJlZSAoYXZpcGFkKTsKKyAgICB9CisgIH0KKworICAvKiBmcmVlIHRoZSBvbGQgbGlzdCBvZiBzaW5rcGFkcywgb25seSBrZWVwIHRoZSByZWFsIGNvbGxlY3Rpbmcgb25lcyAqLworICBnX3NsaXN0X2ZyZWUgKGF2aW11eC0+c2lua3BhZHMpOworICBhdmltdXgtPnNpbmtwYWRzID0gbmV3bGlzdDsKKworICAvKiBhdmkgZGF0YSAqLworICBhdmltdXgtPm51bV9mcmFtZXMgPSAwOworICBtZW1zZXQgKCYoYXZpbXV4LT5hdmlfaGRyKSwgMCwgc2l6ZW9mIChnc3RfcmlmZl9hdmloKSk7CisgIGF2aW11eC0+YXZpX2hkci5tYXhfYnBzID0gMTAwMDAwMDA7CisgIGF2aW11eC0+Y29kZWNfZGF0YV9zaXplID0gMDsKKworICBpZiAoYXZpbXV4LT50YWdzX3NuYXApIHsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKGF2aW11eC0+dGFnc19zbmFwKTsKKyAgICBhdmltdXgtPnRhZ3Nfc25hcCA9IE5VTEw7CisgIH0KKworICBnX2ZyZWUgKGF2aW11eC0+aWR4KTsKKyAgYXZpbXV4LT5pZHggPSBOVUxMOworCisgIC8qIHN0YXRlIGluZm8gKi8KKyAgYXZpbXV4LT53cml0ZV9oZWFkZXIgPSBUUlVFOworCisgIC8qIHRhZ3MgKi8KKyAgZ3N0X3RhZ19zZXR0ZXJfcmVzZXRfdGFncyAoR1NUX1RBR19TRVRURVIgKGF2aW11eCkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9tdXhfaW5pdCAoR3N0QXZpTXV4ICogYXZpbXV4KQoreworICBhdmltdXgtPnNyY3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc3JjX2ZhY3RvcnksICJzcmMiKTsKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoYXZpbXV4LT5zcmNwYWQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoYXZpbXV4KSwgYXZpbXV4LT5zcmNwYWQpOworCisgIC8qIHByb3BlcnR5ICovCisgIGF2aW11eC0+ZW5hYmxlX2xhcmdlX2F2aSA9IERFRkFVTFRfQklHRklMRTsKKworICBhdmltdXgtPmNvbGxlY3QgPSBnc3RfY29sbGVjdF9wYWRzX25ldyAoKTsKKyAgZ3N0X2NvbGxlY3RfcGFkc19zZXRfZnVuY3Rpb24gKGF2aW11eC0+Y29sbGVjdCwKKyAgICAgIChHc3RDb2xsZWN0UGFkc0Z1bmN0aW9uKSAoR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdmlfbXV4X2NvbGxlY3RfcGFkcykpLAorICAgICAgYXZpbXV4KTsKKyAgZ3N0X2NvbGxlY3RfcGFkc19zZXRfZXZlbnRfZnVuY3Rpb24gKGF2aW11eC0+Y29sbGVjdCwKKyAgICAgIChHc3RDb2xsZWN0UGFkc0V2ZW50RnVuY3Rpb24pIChHU1RfREVCVUdfRlVOQ1BUUgorICAgICAgICAgIChnc3RfYXZpX211eF9oYW5kbGVfZXZlbnQpKSwgYXZpbXV4KTsKKworICAvKiBzZXQgdG8gY2xlYW4gc3RhdGUgKi8KKyAgZ3N0X2F2aV9tdXhfcmVzZXQgKGF2aW11eCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9tdXhfdmlkc2lua19zZXRfY2FwcyAoR3N0UGFkICogcGFkLCBHc3RDYXBzICogdnNjYXBzKQoreworICBHc3RBdmlNdXggKmF2aW11eDsKKyAgR3N0QXZpVmlkZW9QYWQgKmF2aXBhZDsKKyAgR3N0QXZpQ29sbGVjdERhdGEgKmNvbGxlY3RfcGFkOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgY29uc3QgZ2NoYXIgKm1pbWV0eXBlOworICBjb25zdCBHVmFsdWUgKmZwcywgKnBhcjsKKyAgY29uc3QgR1ZhbHVlICpjb2RlY19kYXRhOworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgcGFyX24sIHBhcl9kOworICBnYm9vbGVhbiBjb2RlY19kYXRhX2luX2hlYWRlcnMgPSBUUlVFOworICBnYm9vbGVhbiB2YWxpZF9jYXBzID0gVFJVRTsKKworICBhdmltdXggPSBHU1RfQVZJX01VWCAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKworICAvKiBmaW5kIHN0cmVhbSBkYXRhICovCisgIGNvbGxlY3RfcGFkID0gKEdzdEF2aUNvbGxlY3REYXRhICopIGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgZ19hc3NlcnQgKGNvbGxlY3RfcGFkKTsKKyAgYXZpcGFkID0gKEdzdEF2aVZpZGVvUGFkICopIGNvbGxlY3RfcGFkLT5hdmlwYWQ7CisgIGdfYXNzZXJ0IChhdmlwYWQpOworICBnX2Fzc2VydCAoYXZpcGFkLT5wYXJlbnQuaXNfdmlkZW8pOworICBnX2Fzc2VydCAoYXZpcGFkLT5wYXJlbnQuaGRyLnR5cGUgPT0gR1NUX01BS0VfRk9VUkNDICgndicsICdpJywgJ2QnLCAncycpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChhdmltdXgsICIlczolcywgY2Fwcz0lIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAocGFkKSwgdnNjYXBzKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlICh2c2NhcHMsIDApOworICBtaW1ldHlwZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSk7CisKKyAgLyogZ2xvYmFsICovCisgIGF2aXBhZC0+dmlkcy5zaXplID0gc2l6ZW9mIChnc3RfcmlmZl9zdHJmX3ZpZHMpOworICBhdmlwYWQtPnZpZHMucGxhbmVzID0gMTsKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIndpZHRoIiwgJndpZHRoKSB8fAorICAgICAgIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICBnb3RvIHJlZnVzZV9jYXBzOworICB9CisKKyAgYXZpcGFkLT52aWRzLndpZHRoID0gd2lkdGg7CisgIGF2aXBhZC0+dmlkcy5oZWlnaHQgPSBoZWlnaHQ7CisKKyAgZnBzID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImZyYW1lcmF0ZSIpOworICBpZiAoZnBzID09IE5VTEwgfHwgIUdTVF9WQUxVRV9IT0xEU19GUkFDVElPTiAoZnBzKSkKKyAgICBnb3RvIHJlZnVzZV9jYXBzOworCisgIGF2aXBhZC0+cGFyZW50Lmhkci5yYXRlID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9udW1lcmF0b3IgKGZwcyk7CisgIGF2aXBhZC0+cGFyZW50Lmhkci5zY2FsZSA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fZGVub21pbmF0b3IgKGZwcyk7CisgIGlmIChhdmlwYWQtPnBhcmVudC5oZHIucmF0ZSA8PSAwIHx8IGF2aXBhZC0+cGFyZW50Lmhkci5zY2FsZSA8PSAwKQorICAgIGdvdG8gcmVmdXNlX2NhcHM7CisKKyAgLyogKHBpeGVsKSBhc3BlY3QgcmF0aW8gZGF0YSwgaWYgYW55ICovCisgIHBhciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJwaXhlbC1hc3BlY3QtcmF0aW8iKTsKKyAgLyogb25seSB1c2UgdmlkZW8gcHJvcGVydGllcyBoZWFkZXIgaWYgdGhlcmUgaXMgbm9uLXRyaXZpYWwgYXNwZWN0IGluZm8gKi8KKyAgaWYgKHBhciAmJiBHU1RfVkFMVUVfSE9MRFNfRlJBQ1RJT04gKHBhcikgJiYKKyAgICAgICgocGFyX24gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAocGFyKSkgIT0KKyAgICAgICAgICAocGFyX2QgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yIChwYXIpKSkpIHsKKyAgICBHVmFsdWUgdG9fcmF0aW8gPSB7IDAsIH07CisgICAgZ3VpbnQgcmF0aW9fbiwgcmF0aW9fZDsKKworICAgIC8qIHNvbWUgZnJhY3Rpb24gdm9vZG9vIHRvIG9idGFpbiBzaW1wbGVzdCBwb3NzaWJsZSByYXRpbyAqLworICAgIGdfdmFsdWVfaW5pdCAoJnRvX3JhdGlvLCBHU1RfVFlQRV9GUkFDVElPTik7CisgICAgZ3N0X3ZhbHVlX3NldF9mcmFjdGlvbiAoJnRvX3JhdGlvLCB3aWR0aCAqIHBhcl9uLCBoZWlnaHQgKiBwYXJfZCk7CisgICAgcmF0aW9fbiA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fbnVtZXJhdG9yICgmdG9fcmF0aW8pOworICAgIHJhdGlvX2QgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yICgmdG9fcmF0aW8pOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aW11eCwgImdlbmVyYXRpbmcgdnBycCBkYXRhIHdpdGggYXNwZWN0IHJhdGlvICVkLyVkIiwKKyAgICAgICAgcmF0aW9fbiwgcmF0aW9fZCk7CisgICAgLyogc2ltcGx5IGZpbGwgaW4gKi8KKyAgICBhdmlwYWQtPnZwcnAudmVydF9yYXRlID0gYXZpcGFkLT5wYXJlbnQuaGRyLnJhdGUgLyBhdmlwYWQtPnBhcmVudC5oZHIuc2NhbGU7CisgICAgYXZpcGFkLT52cHJwLmhvcl90X3RvdGFsID0gd2lkdGg7CisgICAgYXZpcGFkLT52cHJwLnZlcnRfbGluZXMgPSBoZWlnaHQ7CisgICAgYXZpcGFkLT52cHJwLmFzcGVjdCA9IChyYXRpb19uKSA8PCAxNiB8IChyYXRpb19kICYgMHhmZmZmKTsKKyAgICBhdmlwYWQtPnZwcnAud2lkdGggPSB3aWR0aDsKKyAgICBhdmlwYWQtPnZwcnAuaGVpZ2h0ID0gaGVpZ2h0OworICAgIGF2aXBhZC0+dnBycC5maWVsZHMgPSAxOworICAgIGF2aXBhZC0+dnBycC5maWVsZF9pbmZvWzBdLmNvbXByZXNzZWRfYm1faGVpZ2h0ID0gaGVpZ2h0OworICAgIGF2aXBhZC0+dnBycC5maWVsZF9pbmZvWzBdLmNvbXByZXNzZWRfYm1fd2lkdGggPSB3aWR0aDsKKyAgICBhdmlwYWQtPnZwcnAuZmllbGRfaW5mb1swXS52YWxpZF9ibV9oZWlnaHQgPSBoZWlnaHQ7CisgICAgYXZpcGFkLT52cHJwLmZpZWxkX2luZm9bMF0udmFsaWRfYm1fd2lkdGggPSB3aWR0aDsKKyAgfQorCisgIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtcmF3IikpIHsKKyAgICBjb25zdCBnY2hhciAqZm9ybWF0OworICAgIEdzdFZpZGVvRm9ybWF0IGZtdDsKKworICAgIGZvcm1hdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZm9ybWF0Iik7CisgICAgZm10ID0gZ3N0X3ZpZGVvX2Zvcm1hdF9mcm9tX3N0cmluZyAoZm9ybWF0KTsKKworICAgIHN3aXRjaCAoZm10KSB7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVVZMjoKKyAgICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgnWScsICdVJywgJ1knLCAnMicpOworICAgICAgICBhdmlwYWQtPnZpZHMuYml0X2NudCA9IDE2OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9VWVZZOgorICAgICAgICBhdmlwYWQtPnZpZHMuY29tcHJlc3Npb24gPSBHU1RfTUFLRV9GT1VSQ0MgKCdVJywgJ1knLCAnVicsICdZJyk7CisgICAgICAgIGF2aXBhZC0+dmlkcy5iaXRfY250ID0gMTY7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICAgIGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbiA9IEdTVF9NQUtFX0ZPVVJDQyAoJ0knLCAnNCcsICcyJywgJzAnKTsKKyAgICAgICAgYXZpcGFkLT52aWRzLmJpdF9jbnQgPSAxMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfR1JBWTg6CisgICAgICAgIGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbiA9IEdTVF9NQUtFX0ZPVVJDQyAoJ1knLCAnOCcsICcwJywgJzAnKTsKKyAgICAgICAgYXZpcGFkLT52aWRzLmJpdF9jbnQgPSA4OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1I6CisgICAgICAgIGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbiA9IEdTVF9NQUtFX0ZPVVJDQyAoMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCk7CisgICAgICAgIGF2aXBhZC0+dmlkcy5iaXRfY250ID0gMjQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUng6CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgweDAwLCAweDAwLCAweDAwLCAweDAwKTsKKyAgICAgICAgYXZpcGFkLT52aWRzLmJpdF9jbnQgPSAzMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB2YWxpZF9jYXBzID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBhdmlwYWQtPnZpZHMuYml0X2NudCA9IDI0OworICAgIGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbiA9IDA7CisKKyAgICAvKiBmaW5kIGZvcm1hdCAqLworICAgIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtaHVmZnl1diIpKSB7CisgICAgICBhdmlwYWQtPnZpZHMuY29tcHJlc3Npb24gPSBHU1RfTUFLRV9GT1VSQ0MgKCdIJywgJ0YnLCAnWScsICdVJyk7CisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImltYWdlL2pwZWciKSkgeworICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgnTScsICdKJywgJ1AnLCAnRycpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LWRpdngiKSkgeworICAgICAgZ2ludCBkaXZ4dmVyc2lvbjsKKworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJkaXZ4dmVyc2lvbiIsICZkaXZ4dmVyc2lvbik7CisgICAgICBzd2l0Y2ggKGRpdnh2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICBhdmlwYWQtPnZpZHMuY29tcHJlc3Npb24gPSBHU1RfTUFLRV9GT1VSQ0MgKCdEJywgJ0knLCAnVicsICczJyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICBhdmlwYWQtPnZpZHMuY29tcHJlc3Npb24gPSBHU1RfTUFLRV9GT1VSQ0MgKCdEJywgJ0knLCAnVicsICdYJyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICBhdmlwYWQtPnZpZHMuY29tcHJlc3Npb24gPSBHU1RfTUFLRV9GT1VSQ0MgKCdEJywgJ1gnLCAnNScsICcwJyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdmFsaWRfY2FwcyA9IEZBTFNFOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAoc3RydWN0dXJlLCAidmlkZW8veC1tc21wZWciKSkgeworICAgICAgZ2ludCBtc21wZWd2ZXJzaW9uOworCisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIm1zbXBlZ3ZlcnNpb24iLCAmbXNtcGVndmVyc2lvbik7CisgICAgICBzd2l0Y2ggKG1zbXBlZ3ZlcnNpb24pIHsKKyAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICBhdmlwYWQtPnZpZHMuY29tcHJlc3Npb24gPSBHU1RfTUFLRV9GT1VSQ0MgKCdNJywgJ1AnLCAnRycsICc0Jyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDI6CisgICAgICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgnTScsICdQJywgJzQnLCAnMicpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQzOgorICAgICAgICAgIGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbiA9IEdTVF9NQUtFX0ZPVVJDQyAoJ00nLCAnUCcsICc0JywgJzMnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBHU1RfSU5GTyAoInVuaGFuZGxlZCBtc21wZWd2ZXJzaW9uIDogJWQsIGZhbGwgYmFjayB0byBmb3VyY2M9TVBFRyIsCisgICAgICAgICAgICAgIG1zbXBlZ3ZlcnNpb24pOworICAgICAgICAgIGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbiA9IEdTVF9NQUtFX0ZPVVJDQyAoJ00nLCAnUCcsICdFJywgJ0cnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1kdiIpKSB7CisgICAgICBhdmlwYWQtPnZpZHMuY29tcHJlc3Npb24gPSBHU1RfTUFLRV9GT1VSQ0MgKCdEJywgJ1YnLCAnUycsICdEJyk7CisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtaDI2MyIpKSB7CisgICAgICBhdmlwYWQtPnZpZHMuY29tcHJlc3Npb24gPSBHU1RfTUFLRV9GT1VSQ0MgKCdIJywgJzInLCAnNicsICczJyk7CisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtaDI2NCIpKSB7CisgICAgICBhdmlwYWQtPnZpZHMuY29tcHJlc3Npb24gPSBHU1RfTUFLRV9GT1VSQ0MgKCdIJywgJzInLCAnNicsICc0Jyk7CisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL21wZWciKSkgeworICAgICAgZ2ludCBtcGVndmVyc2lvbjsKKworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJtcGVndmVyc2lvbiIsICZtcGVndmVyc2lvbik7CisKKyAgICAgIHN3aXRjaCAobXBlZ3ZlcnNpb24pIHsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbiA9IEdTVF9NQUtFX0ZPVVJDQyAoJ00nLCAnUCcsICdHJywgJzInKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgIC8qIG1wbGF5ZXIvZmZtcGVnIG1pZ2h0IG5vdCB3b3JrIHdpdGggRElWWCwgYnV0IHdpdGggRk1QNCAqLworICAgICAgICAgIGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbiA9IEdTVF9NQUtFX0ZPVVJDQyAoJ0QnLCAnSScsICdWJywgJ1gnKTsKKworICAgICAgICAgIC8qIERJVlgvWFZJRCBpbiBBVkkgc3RvcmUgdGhlIGNvZGVjX2RhdGEgY2h1bmsgYXMgcGFydCBvZiB0aGUKKyAgICAgICAgICAgICBmaXJzdCBkYXRhIGJ1ZmZlci4gU28gZm9yIHRoaXMgY2FzZSwgd2UgcHJlcGVuZCB0aGUgY29kZWNfZGF0YQorICAgICAgICAgICAgIGJsb2IgKGlmIGFueSkgdG8gdGhhdCBmaXJzdCBidWZmZXIgKi8KKyAgICAgICAgICBjb2RlY19kYXRhX2luX2hlYWRlcnMgPSBGQUxTRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBHU1RfSU5GTyAoInVuaGFuZGxlZCBtcGVndmVyc2lvbiA6ICVkLCBmYWxsIGJhY2sgdG8gZm91cmNjPU1QRUciLAorICAgICAgICAgICAgICBtcGVndmVyc2lvbik7CisgICAgICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgnTScsICdQJywgJ0UnLCAnRycpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LXdtdiIpKSB7CisgICAgICBnaW50IHdtdnZlcnNpb247CisKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIndtdnZlcnNpb24iLCAmd212dmVyc2lvbikpIHsKKyAgICAgICAgc3dpdGNoICh3bXZ2ZXJzaW9uKSB7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgnVycsICdNJywgJ1YnLCAnMScpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgnVycsICdNJywgJ1YnLCAnMicpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgnVycsICdNJywgJ1YnLCAnMycpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHZhbGlkX2NhcHMgPSBGQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImltYWdlL3gtanBjIikpIHsKKyAgICAgIGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbiA9IEdTVF9NQUtFX0ZPVVJDQyAoJ00nLCAnSicsICcyJywgJ0MnKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC12cDgiKSkgeworICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgnVicsICdQJywgJzgnLCAnMCcpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJpbWFnZS9wbmciKSkgeworICAgICAgYXZpcGFkLT52aWRzLmNvbXByZXNzaW9uID0gR1NUX01BS0VfRk9VUkNDICgncCcsICduJywgJ2cnLCAnICcpOworICAgIH0gZWxzZSB7CisgICAgICB2YWxpZF9jYXBzID0gRkFMU0U7CisgICAgfQorCisgICAgaWYgKCF2YWxpZF9jYXBzKQorICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgfQorCisgIC8qIGNvZGVjIGluaXRpYWxpemF0aW9uIGRhdGEsIGlmIGFueSAqLworICBjb2RlY19kYXRhID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImNvZGVjX2RhdGEiKTsKKyAgaWYgKGNvZGVjX2RhdGEpIHsKKyAgICBpZiAoY29kZWNfZGF0YV9pbl9oZWFkZXJzKSB7CisgICAgICBhdmlwYWQtPnZpZHNfY29kZWNfZGF0YSA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyIChjb2RlY19kYXRhKTsKKyAgICAgIGdzdF9idWZmZXJfcmVmIChhdmlwYWQtPnZpZHNfY29kZWNfZGF0YSk7CisgICAgICAvKiBrZWVwIGdsb2JhbCB0cmFjayBvZiBzaXplICovCisgICAgICBhdmltdXgtPmNvZGVjX2RhdGFfc2l6ZSArPSBnc3RfYnVmZmVyX2dldF9zaXplIChhdmlwYWQtPnZpZHNfY29kZWNfZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGF2aXBhZC0+cHJlcGVuZF9idWZmZXIgPQorICAgICAgICAgIGdzdF9idWZmZXJfcmVmIChnc3RfdmFsdWVfZ2V0X2J1ZmZlciAoY29kZWNfZGF0YSkpOworICAgIH0KKyAgfQorCisgIGF2aXBhZC0+cGFyZW50Lmhkci5mY2NfaGFuZGxlciA9IGF2aXBhZC0+dmlkcy5jb21wcmVzc2lvbjsKKyAgYXZpcGFkLT52aWRzLmltYWdlX3NpemUgPSBhdmlwYWQtPnZpZHMuaGVpZ2h0ICogYXZpcGFkLT52aWRzLndpZHRoOworICAvKiBobSwgbWF5YmUgd2h5IGF2aSBvbmx5IGhhbmRsZXMgb25lIHN0cmVhbSB3ZWxsIC4uLiAqLworICBhdmltdXgtPmF2aV9oZHIud2lkdGggPSBhdmlwYWQtPnZpZHMud2lkdGg7CisgIGF2aW11eC0+YXZpX2hkci5oZWlnaHQgPSBhdmlwYWQtPnZpZHMuaGVpZ2h0OworICBhdmltdXgtPmF2aV9oZHIudXNfZnJhbWUgPSAxMDAwMDAwLiAqIGF2aXBhZC0+cGFyZW50Lmhkci5zY2FsZSAvCisgICAgICBhdmlwYWQtPnBhcmVudC5oZHIucmF0ZTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChhdmltdXgpOworICByZXR1cm4gVFJVRTsKKworcmVmdXNlX2NhcHM6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aW11eCwgInJlZnVzZWQgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgdnNjYXBzKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChhdmltdXgpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBnc3RfYXZpX211eF9hdWRzaW5rX3NldF9maWVsZHMgKEdzdEF2aU11eCAqIGF2aW11eCwKKyAgICBHc3RBdmlBdWRpb1BhZCAqIGF2aXBhZCk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYXZpX211eF9hdWRzaW5rX3NjYW5fbXBlZ19hdWRpbyAoR3N0QXZpTXV4ICogYXZpbXV4LCBHc3RBdmlQYWQgKiBhdmlwYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQgc3BmOworICBndWludDMyIGhlYWRlcjsKKyAgZ3Vsb25nIGxheWVyOworICBndWxvbmcgdmVyc2lvbjsKKyAgZ2ludCBsc2YsIG1wZzI1OworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGlmIChtYXAuc2l6ZSA8IDQpCisgICAgZ290byBub3RfcGFyc2VkOworCisgIGhlYWRlciA9IEdTVF9SRUFEX1VJTlQzMl9CRSAobWFwLmRhdGEpOworCisgIGlmICgoaGVhZGVyICYgMHhmZmUwMDAwMCkgIT0gMHhmZmUwMDAwMCkKKyAgICBnb3RvIG5vdF9wYXJzZWQ7CisKKyAgLyogdGhhbmtzIGdvIHRvIG1wM3BhcnNlICovCisgIGlmIChoZWFkZXIgJiAoMSA8PCAyMCkpIHsKKyAgICBsc2YgPSAoaGVhZGVyICYgKDEgPDwgMTkpKSA/IDAgOiAxOworICAgIG1wZzI1ID0gMDsKKyAgfSBlbHNlIHsKKyAgICBsc2YgPSAxOworICAgIG1wZzI1ID0gMTsKKyAgfQorCisgIHZlcnNpb24gPSAxICsgbHNmICsgbXBnMjU7CisgIGxheWVyID0gNCAtICgoaGVhZGVyID4+IDE3KSAmIDB4Myk7CisKKyAgLyogc2VlIGh0dHA6Ly93d3cuY29kZXByb2plY3QuY29tL2F1ZGlvL01QRUdBdWRpb0luZm8uYXNwICovCisgIGlmIChsYXllciA9PSAxKQorICAgIHNwZiA9IDM4NDsKKyAgZWxzZSBpZiAobGF5ZXIgPT0gMikKKyAgICBzcGYgPSAxMTUyOworICBlbHNlIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICBzcGYgPSAxMTUyOworICB9IGVsc2UgeworICAgIC8qIE1QRUctMiBvciAiMi41IiAqLworICAgIHNwZiA9IDU3NjsKKyAgfQorCisgIGlmIChHX1VOTElLRUxZIChhdmlwYWQtPmhkci5zY2FsZSA8PSAxKSkgeworICAgIGF2aXBhZC0+aGRyLnNjYWxlID0gc3BmOworICAgIGdzdF9hdmlfbXV4X2F1ZHNpbmtfc2V0X2ZpZWxkcyAoYXZpbXV4LCAoR3N0QXZpQXVkaW9QYWQgKikgYXZpcGFkKTsKKyAgfSBlbHNlIGlmIChHX1VOTElLRUxZIChhdmlwYWQtPmhkci5zY2FsZSAhPSBzcGYpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmltdXgsICJpbnB1dCBtcGVnIGF1ZGlvIGhhcyB2YXJ5aW5nIGZyYW1lIHNpemUiKTsKKyAgICBnb3RvIGNicl9mYWxsYmFjazsKKyAgfQorZG9uZToKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVhJVFMgKi8KK25vdF9wYXJzZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aW11eCwgImlucHV0IG1wZWcgYXVkaW8gaXMgbm90IHBhcnNlZCIpOworICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICB9CitjYnJfZmFsbGJhY2s6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aW11eCwgImZhbGxpbmcgYmFjayB0byBDQlIgbXV4aW5nIik7CisgICAgYXZpcGFkLT5oZHIuc2NhbGUgPSAxOworICAgIGdzdF9hdmlfbXV4X2F1ZHNpbmtfc2V0X2ZpZWxkcyAoYXZpbXV4LCAoR3N0QXZpQXVkaW9QYWQgKikgYXZpcGFkKTsKKyAgICAvKiBubyBuZWVkIHRvIGNoZWNrIGZ1cnRoZXIgKi8KKyAgICBhdmlwYWQtPmhvb2sgPSBOVUxMOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9tdXhfYXVkc2lua19zZXRfZmllbGRzIChHc3RBdmlNdXggKiBhdmltdXgsIEdzdEF2aUF1ZGlvUGFkICogYXZpcGFkKQoreworICBpZiAoYXZpcGFkLT5wYXJlbnQuaGRyLnNjYWxlID4gMSkgeworICAgIC8qIHZiciBjYXNlOiBmaXhlZCBkdXJhdGlvbiBwZXIgZnJhbWUvY2h1bmsgKi8KKyAgICBhdmlwYWQtPnBhcmVudC5oZHIucmF0ZSA9IGF2aXBhZC0+YXVkcy5yYXRlOworICAgIGF2aXBhZC0+cGFyZW50Lmhkci5zYW1wbGVzaXplID0gMDsKKyAgICAvKiB0aGlzIHRyaWdnZXJzIGRldGVybWluaW5nIGxhcmdlc3QgYXVkaW8gY2h1bmsgc2l6ZSB0byB3cml0ZSBhdCBlbmQgKi8KKyAgICBhdmlwYWQtPm1heF9hdWRpb19jaHVuayA9IGF2aXBhZC0+YXVkcy5ibG9ja2FsaWduID0KKyAgICAgICAgYXZpcGFkLT5wYXJlbnQuaGRyLnNjYWxlOworICB9IGVsc2UgeworICAgIC8qIGJ5IHNwZWMsIGhkci5yYXRlIGlzIGF2X2JwcyByZWxhdGVkLCBpcyBjYWxjdWxhdGVkIHRoYXQgd2F5IGluIHN0b3BfZmlsZSwKKyAgICAgKiBhbmQgcmVkdWNlcyB0byBzYW1wbGUgcmF0ZSBpbiBQQ00gbGlrZSBjYXNlcyAqLworICAgIGF2aXBhZC0+cGFyZW50Lmhkci5yYXRlID0gYXZpcGFkLT5hdWRzLmF2X2JwcyAvIGF2aXBhZC0+YXVkcy5ibG9ja2FsaWduOworICAgIGF2aXBhZC0+cGFyZW50Lmhkci5zYW1wbGVzaXplID0gYXZpcGFkLT5hdWRzLmJsb2NrYWxpZ247CisgICAgYXZpcGFkLT5wYXJlbnQuaGRyLnNjYWxlID0gMTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hdmlfbXV4X2F1ZHNpbmtfc2V0X2NhcHMgKEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIHZzY2FwcykKK3sKKyAgR3N0QXZpTXV4ICphdmltdXg7CisgIEdzdEF2aUF1ZGlvUGFkICphdmlwYWQ7CisgIEdzdEF2aUNvbGxlY3REYXRhICpjb2xsZWN0X3BhZDsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IGdjaGFyICptaW1ldHlwZTsKKyAgY29uc3QgR1ZhbHVlICpjb2RlY19kYXRhOworICBnaW50IGNoYW5uZWxzLCByYXRlOworCisgIGF2aW11eCA9IEdTVF9BVklfTVVYIChnc3RfcGFkX2dldF9wYXJlbnQgKHBhZCkpOworCisgIC8qIGZpbmQgc3RyZWFtIGRhdGEgKi8KKyAgY29sbGVjdF9wYWQgPSAoR3N0QXZpQ29sbGVjdERhdGEgKikgZ3N0X3BhZF9nZXRfZWxlbWVudF9wcml2YXRlIChwYWQpOworICBnX2Fzc2VydCAoY29sbGVjdF9wYWQpOworICBhdmlwYWQgPSAoR3N0QXZpQXVkaW9QYWQgKikgY29sbGVjdF9wYWQtPmF2aXBhZDsKKyAgZ19hc3NlcnQgKGF2aXBhZCk7CisgIGdfYXNzZXJ0ICghYXZpcGFkLT5wYXJlbnQuaXNfdmlkZW8pOworICBnX2Fzc2VydCAoYXZpcGFkLT5wYXJlbnQuaGRyLnR5cGUgPT0gR1NUX01BS0VfRk9VUkNDICgnYScsICd1JywgJ2QnLCAncycpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChhdmltdXgsICIlczolcywgY2Fwcz0lIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAocGFkKSwgdnNjYXBzKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlICh2c2NhcHMsIDApOworICBtaW1ldHlwZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSk7CisKKyAgLyogd2Ugd2FudCB0aGVzZSBmb3IgYWxsICovCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsICZjaGFubmVscykgfHwKKyAgICAgICFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgInJhdGUiLCAmcmF0ZSkpIHsKKyAgICBnb3RvIHJlZnVzZV9jYXBzOworICB9CisKKyAgYXZpcGFkLT5hdWRzLmNoYW5uZWxzID0gY2hhbm5lbHM7CisgIGF2aXBhZC0+YXVkcy5yYXRlID0gcmF0ZTsKKworICAvKiBjb2RlYyBpbml0aWFsaXphdGlvbiBkYXRhLCBpZiBhbnkgKi8KKyAgY29kZWNfZGF0YSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJjb2RlY19kYXRhIik7CisgIGlmIChjb2RlY19kYXRhKSB7CisgICAgYXZpcGFkLT5hdWRzX2NvZGVjX2RhdGEgPSBnc3RfdmFsdWVfZ2V0X2J1ZmZlciAoY29kZWNfZGF0YSk7CisgICAgZ3N0X2J1ZmZlcl9yZWYgKGF2aXBhZC0+YXVkc19jb2RlY19kYXRhKTsKKyAgICAvKiBrZWVwIGdsb2JhbCB0cmFjayBvZiBzaXplICovCisgICAgYXZpbXV4LT5jb2RlY19kYXRhX3NpemUgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYXZpcGFkLT5hdWRzX2NvZGVjX2RhdGEpOworICB9CisKKyAgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1yYXciKSkgeworICAgIGNvbnN0IGdjaGFyICpmb3JtYXQ7CisgICAgR3N0QXVkaW9Gb3JtYXQgZm10OworCisgICAgZm9ybWF0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJmb3JtYXQiKTsKKyAgICBmbXQgPSBnc3RfYXVkaW9fZm9ybWF0X2Zyb21fc3RyaW5nIChmb3JtYXQpOworCisgICAgc3dpdGNoIChmbXQpIHsKKyAgICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9VODoKKyAgICAgICAgYXZpcGFkLT5hdWRzLmJsb2NrYWxpZ24gPSA4OworICAgICAgICBhdmlwYWQtPmF1ZHMuYml0c19wZXJfc2FtcGxlID0gODsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzE2OgorICAgICAgICBhdmlwYWQtPmF1ZHMuYmxvY2thbGlnbiA9IDE2OworICAgICAgICBhdmlwYWQtPmF1ZHMuYml0c19wZXJfc2FtcGxlID0gMTY7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgICB9CisKKyAgICBhdmlwYWQtPmF1ZHMuZm9ybWF0ID0gR1NUX1JJRkZfV0FWRV9GT1JNQVRfUENNOworICAgIC8qIHNldCBzb21lIG1vcmUgaW5mbyBzdHJhaWdodCAqLworICAgIGF2aXBhZC0+YXVkcy5ibG9ja2FsaWduIC89IDg7CisgICAgYXZpcGFkLT5hdWRzLmJsb2NrYWxpZ24gKj0gYXZpcGFkLT5hdWRzLmNoYW5uZWxzOworICAgIGF2aXBhZC0+YXVkcy5hdl9icHMgPSBhdmlwYWQtPmF1ZHMuYmxvY2thbGlnbiAqIGF2aXBhZC0+YXVkcy5yYXRlOworICB9IGVsc2UgeworICAgIGF2aXBhZC0+YXVkcy5mb3JtYXQgPSAwOworICAgIC8qIHNldCBzb21lIGRlZmF1bHRzICovCisgICAgYXZpcGFkLT5hdWRzLmJsb2NrYWxpZ24gPSAxOworICAgIGF2aXBhZC0+YXVkcy5hdl9icHMgPSAwOworICAgIGF2aXBhZC0+YXVkcy5iaXRzX3Blcl9zYW1wbGUgPSAxNjsKKworICAgIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL21wZWciKSkgeworICAgICAgZ2ludCBtcGVndmVyc2lvbjsKKworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJtcGVndmVyc2lvbiIsICZtcGVndmVyc2lvbik7CisgICAgICBzd2l0Y2ggKG1wZWd2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMTp7CisgICAgICAgICAgZ2ludCBsYXllciA9IDM7CisgICAgICAgICAgZ2Jvb2xlYW4gcGFyc2VkID0gRkFMU0U7CisKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImxheWVyIiwgJmxheWVyKTsKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9ib29sZWFuIChzdHJ1Y3R1cmUsICJwYXJzZWQiLCAmcGFyc2VkKTsKKyAgICAgICAgICBzd2l0Y2ggKGxheWVyKSB7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgIGF2aXBhZC0+YXVkcy5mb3JtYXQgPSBHU1RfUklGRl9XQVZFX0ZPUk1BVF9NUEVHTDM7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICBhdmlwYWQtPmF1ZHMuZm9ybWF0ID0gR1NUX1JJRkZfV0FWRV9GT1JNQVRfTVBFR0wxMjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChwYXJzZWQpIHsKKyAgICAgICAgICAgIC8qIHRyZWF0IGFzIFZCUiwgc2hvdWxkIGFsc28gY292ZXIgQ0JSIGNhc2U7CisgICAgICAgICAgICAgKiBzZXR1cCBob29rIHRvIHBhcnNlIGZyYW1lIGhlYWRlciBhbmQgZGV0ZXJtaW5lIHNwZiAqLworICAgICAgICAgICAgYXZpcGFkLT5wYXJlbnQuaG9vayA9IGdzdF9hdmlfbXV4X2F1ZHNpbmtfc2Nhbl9tcGVnX2F1ZGlvOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aW11eCwgInVucGFyc2VkIE1QRUcgYXVkaW8gaW5wdXQgKD8pLCAiCisgICAgICAgICAgICAgICAgImRvaW5nIENCUiBtdXhpbmciKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSA0OgorICAgICAgICB7CisgICAgICAgICAgR3N0QnVmZmVyICpjb2RlY19kYXRhX2J1ZiA9IGF2aXBhZC0+YXVkc19jb2RlY19kYXRhOworICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHJlYW1fZm9ybWF0OworICAgICAgICAgIGd1aW50IGNvZGVjOworICAgICAgICAgIGd1aW50OCBkYXRhWzJdOworCisgICAgICAgICAgc3RyZWFtX2Zvcm1hdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAic3RyZWFtLWZvcm1hdCIpOworICAgICAgICAgIGlmIChzdHJlYW1fZm9ybWF0KSB7CisgICAgICAgICAgICBpZiAoc3RyY21wIChzdHJlYW1fZm9ybWF0LCAicmF3IikgIT0gMCkgeworICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aW11eCwgIkFBQydzIHN0cmVhbSBmb3JtYXQgJyVzJyBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgInN1cHBvcnRlZCwgcGxlYXNlIHVzZSAncmF3JyIsIHN0cmVhbV9mb3JtYXQpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmltdXgsICJBQUMncyBzdHJlYW0tZm9ybWF0IG5vdCBzcGVjaWZpZWQsICIKKyAgICAgICAgICAgICAgICAiYXNzdW1pbmcgJ3JhdyciKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiB2YnIgY2FzZSBuZWVkcyBzb21lIHNwZWNpYWwgaGFuZGxpbmcgKi8KKyAgICAgICAgICBpZiAoIWNvZGVjX2RhdGFfYnVmIHx8IGdzdF9idWZmZXJfZ2V0X3NpemUgKGNvZGVjX2RhdGFfYnVmKSA8IDIpIHsKKyAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpbXV4LCAibm8gKHZhbGlkKSBjb2RlY19kYXRhIGZvciBBQUMgYXVkaW8iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBhdmlwYWQtPmF1ZHMuZm9ybWF0ID0gR1NUX1JJRkZfV0FWRV9GT1JNQVRfQUFDOworICAgICAgICAgIC8qIG5lZWQgdG8gZGV0ZXJtaW5lIGZyYW1lIGxlbmd0aCAqLworICAgICAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoY29kZWNfZGF0YV9idWYsIDAsIGRhdGEsIDIpOworICAgICAgICAgIGNvZGVjID0gR1NUX1JFQURfVUlOVDE2X0JFIChkYXRhKTsKKyAgICAgICAgICBhdmlwYWQtPnBhcmVudC5oZHIuc2NhbGUgPSAoY29kZWMgJiAweDQpID8gOTYwIDogMTAyNDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJhdWRpby94LXZvcmJpcyIpKSB7CisgICAgICBhdmlwYWQtPmF1ZHMuZm9ybWF0ID0gR1NUX1JJRkZfV0FWRV9GT1JNQVRfVk9SQklTMzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1hYzMiKSkgeworICAgICAgYXZpcGFkLT5hdWRzLmZvcm1hdCA9IEdTVF9SSUZGX1dBVkVfRk9STUFUX0E1MjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1hbGF3IikpIHsKKyAgICAgIGF2aXBhZC0+YXVkcy5mb3JtYXQgPSBHU1RfUklGRl9XQVZFX0ZPUk1BVF9BTEFXOworICAgICAgYXZpcGFkLT5hdWRzLmJpdHNfcGVyX3NhbXBsZSA9IDg7CisgICAgICBhdmlwYWQtPmF1ZHMuYmxvY2thbGlnbiA9IGF2aXBhZC0+YXVkcy5jaGFubmVsczsKKyAgICAgIGF2aXBhZC0+YXVkcy5hdl9icHMgPSBhdmlwYWQtPmF1ZHMuYmxvY2thbGlnbiAqIGF2aXBhZC0+YXVkcy5yYXRlOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJhdWRpby94LW11bGF3IikpIHsKKyAgICAgIGF2aXBhZC0+YXVkcy5mb3JtYXQgPSBHU1RfUklGRl9XQVZFX0ZPUk1BVF9NVUxBVzsKKyAgICAgIGF2aXBhZC0+YXVkcy5iaXRzX3Blcl9zYW1wbGUgPSA4OworICAgICAgYXZpcGFkLT5hdWRzLmJsb2NrYWxpZ24gPSBhdmlwYWQtPmF1ZHMuY2hhbm5lbHM7CisgICAgICBhdmlwYWQtPmF1ZHMuYXZfYnBzID0gYXZpcGFkLT5hdWRzLmJsb2NrYWxpZ24gKiBhdmlwYWQtPmF1ZHMucmF0ZTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC13bWEiKSkgeworICAgICAgZ2ludCB2ZXJzaW9uOworICAgICAgZ2ludCBiaXRyYXRlOworICAgICAgZ2ludCBibG9ja19hbGlnbjsKKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAid21hdmVyc2lvbiIsICZ2ZXJzaW9uKSkgeworICAgICAgICBzd2l0Y2ggKHZlcnNpb24pIHsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBhdmlwYWQtPmF1ZHMuZm9ybWF0ID0gR1NUX1JJRkZfV0FWRV9GT1JNQVRfV01BVjE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBhdmlwYWQtPmF1ZHMuZm9ybWF0ID0gR1NUX1JJRkZfV0FWRV9GT1JNQVRfV01BVjI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGF2aXBhZC0+YXVkcy5mb3JtYXQgIT0gMCkgeworICAgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJibG9ja19hbGlnbiIsICZibG9ja19hbGlnbikpIHsKKyAgICAgICAgICBhdmlwYWQtPmF1ZHMuYmxvY2thbGlnbiA9IGJsb2NrX2FsaWduOworICAgICAgICB9CisgICAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImJpdHJhdGUiLCAmYml0cmF0ZSkpIHsKKyAgICAgICAgICBhdmlwYWQtPmF1ZHMuYXZfYnBzID0gYml0cmF0ZSAvIDg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoIWF2aXBhZC0+YXVkcy5mb3JtYXQpCisgICAgZ290byByZWZ1c2VfY2FwczsKKworICBhdmlwYWQtPnBhcmVudC5oZHIuZmNjX2hhbmRsZXIgPSBhdmlwYWQtPmF1ZHMuZm9ybWF0OworICBnc3RfYXZpX211eF9hdWRzaW5rX3NldF9maWVsZHMgKGF2aW11eCwgYXZpcGFkKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChhdmltdXgpOworICByZXR1cm4gVFJVRTsKKworcmVmdXNlX2NhcHM6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aW11eCwgInJlZnVzZWQgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgdnNjYXBzKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChhdmltdXgpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisKK3N0YXRpYyBHc3RQYWQgKgorZ3N0X2F2aV9tdXhfcmVxdWVzdF9uZXdfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIHJlcV9uYW1lLCBjb25zdCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0QXZpTXV4ICphdmltdXg7CisgIEdzdFBhZCAqbmV3cGFkOworICBHc3RBdmlQYWQgKmF2aXBhZDsKKyAgR3N0RWxlbWVudENsYXNzICprbGFzczsKKyAgZ2NoYXIgKm5hbWUgPSBOVUxMOworICBjb25zdCBnY2hhciAqcGFkX25hbWUgPSBOVUxMOworICBnaW50IHBhZF9pZDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAodGVtcGwgIT0gTlVMTCwgTlVMTCk7CisKKyAgaWYgKHRlbXBsLT5kaXJlY3Rpb24gIT0gR1NUX1BBRF9TSU5LKQorICAgIGdvdG8gd3JvbmdfZGlyZWN0aW9uOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfQVZJX01VWCAoZWxlbWVudCksIE5VTEwpOworICBhdmltdXggPSBHU1RfQVZJX01VWCAoZWxlbWVudCk7CisKKyAgaWYgKCFhdmltdXgtPndyaXRlX2hlYWRlcikKKyAgICBnb3RvIHRvb19sYXRlOworCisgIGtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChlbGVtZW50KTsKKworICBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJhdWRpb18ldSIpKSB7CisgICAgLyogZG9uJ3QgbWl4IG5hbWVkIGFuZCB1bm5hbWVkIHBhZHMsIGlmIHRoZSBwYWQgYWxyZWFkeSBleGlzdHMgd2UgZmFpbCB3aGVuCisgICAgICogdHJ5aW5nIHRvIGFkZCBpdCAqLworICAgIGlmIChyZXFfbmFtZSAhPSBOVUxMICYmIHNzY2FuZiAocmVxX25hbWUsICJhdWRpb18ldSIsICZwYWRfaWQpID09IDEpIHsKKyAgICAgIHBhZF9uYW1lID0gcmVxX25hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJhdWRpb18ldSIsIGF2aW11eC0+YXVkaW9fcGFkcysrKTsKKyAgICAgIHBhZF9uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKiBpbml0IHBhZCBzcGVjaWZpYyBkYXRhICovCisgICAgYXZpcGFkID0gZ19tYWxsb2MwIChzaXplb2YgKEdzdEF2aUF1ZGlvUGFkKSk7CisgICAgYXZpcGFkLT5pc192aWRlbyA9IEZBTFNFOworICAgIGF2aXBhZC0+aGRyLnR5cGUgPSBHU1RfTUFLRV9GT1VSQ0MgKCdhJywgJ3UnLCAnZCcsICdzJyk7CisgICAgLyogYXVkaW8gZ29lcyBsYXN0ICovCisgICAgYXZpbXV4LT5zaW5rcGFkcyA9IGdfc2xpc3RfYXBwZW5kIChhdmltdXgtPnNpbmtwYWRzLCBhdmlwYWQpOworICB9IGVsc2UgaWYgKHRlbXBsID09IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLCAidmlkZW9fJXUiKSkgeworICAgIC8qIHRob3VnaCBzdHJlYW1zIGFyZSBwcmV0dHkgZ2VuZXJpYyBhbmQgcmVsYXRpdmVseSBzZWxmLWNvbnRhaW5lZCwKKyAgICAgKiBzb21lIHZpZGVvIGluZm8gZ29lcyBpbiBhIHNpbmdsZSBhdmkgaGVhZGVyIC1hbmQgdGhlcmVmb3JlIG11eCBzdHJ1Y3QtCisgICAgICogc28gdmlkZW8gcmVzdHJpY3RlZCB0byBvbmUgc3RyZWFtICovCisgICAgaWYgKGF2aW11eC0+dmlkZW9fcGFkcyA+IDApCisgICAgICBnb3RvIHRvb19tYW55X3ZpZGVvX3BhZHM7CisKKyAgICAvKiBzZXR1cCBwYWQgKi8KKyAgICBwYWRfbmFtZSA9ICJ2aWRlb18wIjsKKyAgICBhdmltdXgtPnZpZGVvX3BhZHMrKzsKKworICAgIC8qIGluaXQgcGFkIHNwZWNpZmljIGRhdGEgKi8KKyAgICBhdmlwYWQgPSBnX21hbGxvYzAgKHNpemVvZiAoR3N0QXZpVmlkZW9QYWQpKTsKKyAgICBhdmlwYWQtPmlzX3ZpZGVvID0gVFJVRTsKKyAgICBhdmlwYWQtPmhkci50eXBlID0gR1NUX01BS0VfRk9VUkNDICgndicsICdpJywgJ2QnLCAncycpOworICAgIC8qIHZpZGVvIGdvZXMgZmlyc3QgKi8KKyAgICBhdmltdXgtPnNpbmtwYWRzID0gZ19zbGlzdF9wcmVwZW5kIChhdmltdXgtPnNpbmtwYWRzLCBhdmlwYWQpOworICB9IGVsc2UKKyAgICBnb3RvIHdyb25nX3RlbXBsYXRlOworCisgIG5ld3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKHRlbXBsLCBwYWRfbmFtZSk7CisKKyAgYXZpcGFkLT5jb2xsZWN0ID0gZ3N0X2NvbGxlY3RfcGFkc19hZGRfcGFkIChhdmltdXgtPmNvbGxlY3QsCisgICAgICBuZXdwYWQsIHNpemVvZiAoR3N0QXZpQ29sbGVjdERhdGEpLCBOVUxMLCBUUlVFKTsKKyAgKChHc3RBdmlDb2xsZWN0RGF0YSAqKSAoYXZpcGFkLT5jb2xsZWN0KSktPmF2aXBhZCA9IGF2aXBhZDsKKworICBpZiAoIWdzdF9lbGVtZW50X2FkZF9wYWQgKGVsZW1lbnQsIG5ld3BhZCkpCisgICAgZ290byBwYWRfYWRkX2ZhaWxlZDsKKworICBnX2ZyZWUgKG5hbWUpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG5ld3BhZCwgIkFkZGVkIG5ldyByZXF1ZXN0IHBhZCIpOworCisgIHJldHVybiBuZXdwYWQ7CisKKyAgLyogRVJST1JTICovCit3cm9uZ19kaXJlY3Rpb246CisgIHsKKyAgICBnX3dhcm5pbmcgKCJhdmltdXg6IHJlcXVlc3QgcGFkIHRoYXQgaXMgbm90IGEgU0lOSyBwYWRcbiIpOworICAgIHJldHVybiBOVUxMOworICB9Cit0b29fbGF0ZToKKyAgeworICAgIGdfd2FybmluZyAoImF2aW11eDogcmVxdWVzdCBwYWQgY2Fubm90IGJlIGFkZGVkIGFmdGVyIHN0cmVhbWluZyBzdGFydGVkXG4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQord3JvbmdfdGVtcGxhdGU6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJhdmltdXg6IHRoaXMgaXMgbm90IG91ciB0ZW1wbGF0ZSFcbiIpOworICAgIHJldHVybiBOVUxMOworICB9Cit0b29fbWFueV92aWRlb19wYWRzOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhdmltdXgsICJDYW4gb25seSBoYXZlIG9uZSB2aWRlbyBzdHJlYW0iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorcGFkX2FkZF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGF2aW11eCwgIkFkZGluZyB0aGUgbmV3IHBhZCAnJXMnIGZhaWxlZCIsIHBhZF9uYW1lKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKG5ld3BhZCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9hdmlfbXV4X3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKQoreworICBHc3RBdmlNdXggKmF2aW11eCA9IEdTVF9BVklfTVVYIChlbGVtZW50KTsKKyAgR1NMaXN0ICpub2RlOworCisgIG5vZGUgPSBhdmltdXgtPnNpbmtwYWRzOworICB3aGlsZSAobm9kZSkgeworICAgIEdzdEF2aVBhZCAqYXZpcGFkID0gKEdzdEF2aVBhZCAqKSBub2RlLT5kYXRhOworCisgICAgaWYgKGF2aXBhZC0+Y29sbGVjdC0+cGFkID09IHBhZCkgeworICAgICAgLyogcGFkIGNvdW50IHNob3VsZCBub3QgYmUgYWRqdXN0ZWQsCisgICAgICAgKiBhcyBpdCBhbHNvIHJlcHJlc2VudCBudW1iZXIgb2Ygc3RyZWFtcyBwcmVzZW50ICovCisgICAgICBhdmlwYWQtPmNvbGxlY3QgPSBOVUxMOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYXZpbXV4LCAicmVtb3ZlZCBwYWQgJyVzJyIsIEdTVF9QQURfTkFNRSAocGFkKSk7CisgICAgICBnc3RfY29sbGVjdF9wYWRzX3JlbW92ZV9wYWQgKGF2aW11eC0+Y29sbGVjdCwgcGFkKTsKKyAgICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKGVsZW1lbnQsIHBhZCk7CisgICAgICAvKiBpZiBub3Qgc3RhcnRlZCB5ZXQsIHdlIGNhbiByZW1vdmUgYW55IHNpZ24gdGhpcyBwYWQgZXZlciBleGlzdGVkICovCisgICAgICAvKiBpbiB0aGlzIGNhc2UgX3N0YXJ0IHdpbGwgdGFrZSBjYXJlIG9mIHRoZSByZWFsIHBhZCBjb3VudCAqLworICAgICAgaWYgKGF2aW11eC0+d3JpdGVfaGVhZGVyKSB7CisgICAgICAgIGF2aW11eC0+c2lua3BhZHMgPSBnX3NsaXN0X3JlbW92ZSAoYXZpbXV4LT5zaW5rcGFkcywgYXZpcGFkKTsKKyAgICAgICAgZ3N0X2F2aV9tdXhfcGFkX3Jlc2V0IChhdmlwYWQsIFRSVUUpOworICAgICAgICBnX2ZyZWUgKGF2aXBhZCk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgIH0KKworICBnX3dhcm5pbmcgKCJVbmtub3duIHBhZCAlcyIsIEdTVF9QQURfTkFNRSAocGFkKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ3VpbnQKK2dzdF9hdmlfbXV4X3N0YXJ0X2NodW5rIChHc3RCeXRlV3JpdGVyICogYncsIGNvbnN0IGdjaGFyICogdGFnLCBndWludDMyIGZvdXJjYykKK3sKKyAgZ3VpbnQgY2h1bmtfb2Zmc2V0OworCisgIGlmICh0YWcpCisgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhIChidywgKGNvbnN0IGd1aW50OCAqKSB0YWcsIDQpOworICBlbHNlCisgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKGJ3LCBmb3VyY2MpOworCisgIGNodW5rX29mZnNldCA9IGdzdF9ieXRlX3dyaXRlcl9nZXRfcG9zIChidyk7CisgIC8qIHJlYWwgY2h1bmsgc2l6ZSBjb21lcyBsYXRlciAqLworICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoYncsIDApOworCisgIHJldHVybiBjaHVua19vZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZ3N0X2F2aV9tdXhfZW5kX2NodW5rIChHc3RCeXRlV3JpdGVyICogYncsIGd1aW50IGNodW5rX29mZnNldCkKK3sKKyAgZ3VpbnQgc2l6ZTsKKworICBzaXplID0gZ3N0X2J5dGVfd3JpdGVyX2dldF9wb3MgKGJ3KTsKKworICBnc3RfYnl0ZV93cml0ZXJfc2V0X3BvcyAoYncsIGNodW5rX29mZnNldCk7CisgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlIChidywgc2l6ZSAtIGNodW5rX29mZnNldCAtIDQpOworICBnc3RfYnl0ZV93cml0ZXJfc2V0X3BvcyAoYncsIHNpemUpOworCisgIC8qIGFycmFuZ2UgZm9yIGV2ZW4gcGFkZGluZyAqLworICBpZiAoc2l6ZSAmIDEpCisgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50OCAoYncsIDApOworfQorCisvKiBtYXliZSBzb21lIG9mIHRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgbW92ZWQgdG8gcmlmZi5oPyAqLworCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9tdXhfd3JpdGVfdGFnIChjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwgY29uc3QgZ2NoYXIgKiB0YWcsCisgICAgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgY29uc3Qgc3RydWN0CisgIHsKKyAgICBndWludDMyIGZjYzsKKyAgICBjb25zdCBnY2hhciAqdGFnOworICB9IHJpZmZ0YWdzW10gPSB7CisgICAgeworICAgIEdTVF9SSUZGX0lORk9fSUFSTCwgR1NUX1RBR19MT0NBVElPTn0sIHsKKyAgICBHU1RfUklGRl9JTkZPX0lBUlQsIEdTVF9UQUdfQVJUSVNUfSwgeworICAgIEdTVF9SSUZGX0lORk9fSUNNVCwgR1NUX1RBR19DT01NRU5UfSwgeworICAgIEdTVF9SSUZGX0lORk9fSUNPUCwgR1NUX1RBR19DT1BZUklHSFR9LCB7CisgICAgR1NUX1JJRkZfSU5GT19JQ1JELCBHU1RfVEFHX0RBVEV9LCB7CisgICAgR1NUX1JJRkZfSU5GT19JR05SLCBHU1RfVEFHX0dFTlJFfSwgeworICAgIEdTVF9SSUZGX0lORk9fSUtFWSwgR1NUX1RBR19LRVlXT1JEU30sIHsKKyAgICBHU1RfUklGRl9JTkZPX0lOQU0sIEdTVF9UQUdfVElUTEV9LCB7CisgICAgR1NUX1JJRkZfSU5GT19JU0ZULCBHU1RfVEFHX0VOQ09ERVJ9LCB7CisgICAgR1NUX1JJRkZfSU5GT19JU1JDLCBHU1RfVEFHX0lTUkN9LCB7CisgICAgMCwgTlVMTH0KKyAgfTsKKyAgZ2ludCBuOworICBnY2hhciAqc3RyID0gTlVMTDsKKyAgR3N0Qnl0ZVdyaXRlciAqYncgPSBkYXRhOworICBndWludCBjaHVuazsKKworICBmb3IgKG4gPSAwOyByaWZmdGFnc1tuXS5mY2MgIT0gMDsgbisrKSB7CisgICAgaWYgKCFzdHJjbXAgKHJpZmZ0YWdzW25dLnRhZywgdGFnKSkgeworICAgICAgaWYgKHJpZmZ0YWdzW25dLmZjYyA9PSBHU1RfUklGRl9JTkZPX0lDUkQpIHsKKyAgICAgICAgR0RhdGUgKmRhdGU7CisgICAgICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgdGhlIGRhdGUgdGFnICovCisgICAgICAgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X2RhdGUgKGxpc3QsIHRhZywgJmRhdGUpKSB7CisgICAgICAgICAgc3RyID0KKyAgICAgICAgICAgICAgZ19zdHJkdXBfcHJpbnRmICgiJTA0ZDolMDJkOiUwMmQiLCBnX2RhdGVfZ2V0X3llYXIgKGRhdGUpLAorICAgICAgICAgICAgICBnX2RhdGVfZ2V0X21vbnRoIChkYXRlKSwgZ19kYXRlX2dldF9kYXkgKGRhdGUpKTsKKyAgICAgICAgICBnX2RhdGVfZnJlZSAoZGF0ZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChsaXN0LCB0YWcsICZzdHIpOworICAgICAgfQorICAgICAgaWYgKHN0cikgeworICAgICAgICBjaHVuayA9IGdzdF9hdmlfbXV4X3N0YXJ0X2NodW5rIChidywgTlVMTCwgcmlmZnRhZ3Nbbl0uZmNjKTsKKyAgICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF9zdHJpbmcgKGJ3LCBzdHIpOworICAgICAgICBnc3RfYXZpX211eF9lbmRfY2h1bmsgKGJ3LCBjaHVuayk7CisgICAgICAgIGdfZnJlZSAoc3RyKTsKKyAgICAgICAgc3RyID0gTlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpX2hlYWRlciAoR3N0QXZpTXV4ICogYXZpbXV4KQoreworICBjb25zdCBHc3RUYWdMaXN0ICp0YWdzOworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IE5VTEw7CisgIGdpbnQgc2l6ZSA9IDA7CisgIEdzdEJ5dGVXcml0ZXIgYnc7CisgIEdTTGlzdCAqbm9kZTsKKyAgZ3VpbnQgYXZpaCwgcmlmZiwgaGRybDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdib29sZWFuIGhkbCA9IFRSVUU7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYXZpbXV4LCAiY3JlYXRpbmcgYXZpIGhlYWRlciwgZGF0YV9zaXplICV1LCBpZHhfc2l6ZSAldSIsCisgICAgICBhdmltdXgtPmRhdGFfc2l6ZSwgYXZpbXV4LT5pZHhfc2l6ZSk7CisKKyAgaWYgKGF2aW11eC0+dGFnc19zbmFwKQorICAgIHRhZ3MgPSBhdmltdXgtPnRhZ3Nfc25hcDsKKyAgZWxzZSB7CisgICAgLyogbmVlZCB0byBtYWtlIHNuYXBzaG90IG9mIGN1cnJlbnQgc3RhdGUgb2YgdGFncyB0byBlbnN1cmUgdGhlIHNhbWUgc2V0CisgICAgICogaXMgdXNlZCBuZXh0IHRpbWUgYXJvdW5kIGR1cmluZyBoZWFkZXIgcmV3cml0ZSBhdCB0aGUgZW5kICovCisgICAgdGFncyA9IGdzdF90YWdfc2V0dGVyX2dldF90YWdfbGlzdCAoR1NUX1RBR19TRVRURVIgKGF2aW11eCkpOworICAgIGlmICh0YWdzKQorICAgICAgdGFncyA9IGF2aW11eC0+dGFnc19zbmFwID0gZ3N0X3RhZ19saXN0X2NvcHkgKHRhZ3MpOworICB9CisKKyAgZ3N0X2J5dGVfd3JpdGVyX2luaXRfd2l0aF9zaXplICgmYncsIDEwMjQsIEZBTFNFKTsKKworICAvKiBhdmkgaGVhZGVyIG1ldGFkYXRhICovCisgIHJpZmYgPSBnc3RfYXZpX211eF9zdGFydF9jaHVuayAoJmJ3LCAiUklGRiIsIDApOworICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmYncsIChndWludDggKikgIkFWSSAiLCA0KTsKKyAgaGRybCA9IGdzdF9hdmlfbXV4X3N0YXJ0X2NodW5rICgmYncsICJMSVNUIiwgMCk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X2RhdGEgKCZidywgKGd1aW50OCAqKSAiaGRybCIsIDQpOworCisgIGF2aWggPSBnc3RfYXZpX211eF9zdGFydF9jaHVuayAoJmJ3LCAiYXZpaCIsIDApOworICAvKiB0aGUgQVZJIGhlYWRlciBpdHNlbGYgKi8KKyAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aW11eC0+YXZpX2hkci51c19mcmFtZSk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdmltdXgtPmF2aV9oZHIubWF4X2Jwcyk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdmltdXgtPmF2aV9oZHIucGFkX2dyYW4pOworICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpbXV4LT5hdmlfaGRyLmZsYWdzKTsKKyAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aW11eC0+YXZpX2hkci50b3RfZnJhbWVzKTsKKyAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aW11eC0+YXZpX2hkci5pbml0X2ZyYW1lcyk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdmltdXgtPmF2aV9oZHIuc3RyZWFtcyk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdmltdXgtPmF2aV9oZHIuYnVmc2l6ZSk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdmltdXgtPmF2aV9oZHIud2lkdGgpOworICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpbXV4LT5hdmlfaGRyLmhlaWdodCk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdmltdXgtPmF2aV9oZHIuc2NhbGUpOworICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpbXV4LT5hdmlfaGRyLnJhdGUpOworICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpbXV4LT5hdmlfaGRyLnN0YXJ0KTsKKyAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aW11eC0+YXZpX2hkci5sZW5ndGgpOworICBnc3RfYXZpX211eF9lbmRfY2h1bmsgKCZidywgYXZpaCk7CisKKyAgLyogc3RyZWFtIGRhdGEgKi8KKyAgbm9kZSA9IGF2aW11eC0+c2lua3BhZHM7CisgIHdoaWxlIChub2RlKSB7CisgICAgR3N0QXZpUGFkICphdmlwYWQgPSAoR3N0QXZpUGFkICopIG5vZGUtPmRhdGE7CisgICAgR3N0QXZpVmlkZW9QYWQgKnZpZHBhZCA9IChHc3RBdmlWaWRlb1BhZCAqKSBhdmlwYWQ7CisgICAgR3N0QXZpQXVkaW9QYWQgKmF1ZHBhZCA9IChHc3RBdmlBdWRpb1BhZCAqKSBhdmlwYWQ7CisgICAgZ2ludCBjb2RlY19zaXplID0gMDsKKyAgICBndWludCBzdHJoLCBzdHJsLCBzdHJmLCBpbmR4OworCisgICAgLyogc3RyZWFtIGxpc3QgbWV0YWRhdGEgKi8KKyAgICBzdHJsID0gZ3N0X2F2aV9tdXhfc3RhcnRfY2h1bmsgKCZidywgIkxJU1QiLCAwKTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmYncsIChndWludDggKikgInN0cmwiLCA0KTsKKworICAgIC8qIGdlbmVyaWMgaGVhZGVyICovCisgICAgc3RyaCA9IGdzdF9hdmlfbXV4X3N0YXJ0X2NodW5rICgmYncsICJzdHJoIiwgMCk7CisgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aXBhZC0+aGRyLnR5cGUpOworICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdmlwYWQtPmhkci5mY2NfaGFuZGxlcik7CisgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aXBhZC0+aGRyLmZsYWdzKTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpcGFkLT5oZHIucHJpb3JpdHkpOworICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdmlwYWQtPmhkci5pbml0X2ZyYW1lcyk7CisgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aXBhZC0+aGRyLnNjYWxlKTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpcGFkLT5oZHIucmF0ZSk7CisgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aXBhZC0+aGRyLnN0YXJ0KTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpcGFkLT5oZHIubGVuZ3RoKTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpcGFkLT5oZHIuYnVmc2l6ZSk7CisgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aXBhZC0+aGRyLnF1YWxpdHkpOworICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdmlwYWQtPmhkci5zYW1wbGVzaXplKTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfbGUgKCZidywgMCk7CisgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDE2X2xlICgmYncsIDApOworICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQxNl9sZSAoJmJ3LCAwKTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfbGUgKCZidywgMCk7CisgICAgZ3N0X2F2aV9tdXhfZW5kX2NodW5rICgmYncsIHN0cmgpOworCisgICAgaWYgKGF2aXBhZC0+aXNfdmlkZW8pIHsKKyAgICAgIGNvZGVjX3NpemUgPSB2aWRwYWQtPnZpZHNfY29kZWNfZGF0YSA/CisgICAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAodmlkcGFkLT52aWRzX2NvZGVjX2RhdGEpIDogMDsKKyAgICAgIC8qIHRoZSB2aWRlbyBoZWFkZXIgKi8KKyAgICAgIHN0cmYgPSBnc3RfYXZpX211eF9zdGFydF9jaHVuayAoJmJ3LCAic3RyZiIsIDApOworICAgICAgLyogdGhlIGFjdHVhbCBoZWFkZXIgKi8KKyAgICAgIGhkbCAmPQorICAgICAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIHZpZHBhZC0+dmlkcy5zaXplICsgY29kZWNfc2l6ZSk7CisgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgdmlkcGFkLT52aWRzLndpZHRoKTsKKyAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCB2aWRwYWQtPnZpZHMuaGVpZ2h0KTsKKyAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQxNl9sZSAoJmJ3LCB2aWRwYWQtPnZpZHMucGxhbmVzKTsKKyAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQxNl9sZSAoJmJ3LCB2aWRwYWQtPnZpZHMuYml0X2NudCk7CisgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgdmlkcGFkLT52aWRzLmNvbXByZXNzaW9uKTsKKyAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCB2aWRwYWQtPnZpZHMuaW1hZ2Vfc2l6ZSk7CisgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgdmlkcGFkLT52aWRzLnhwZWxzX21ldGVyKTsKKyAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCB2aWRwYWQtPnZpZHMueXBlbHNfbWV0ZXIpOworICAgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIHZpZHBhZC0+dmlkcy5udW1fY29sb3JzKTsKKyAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCB2aWRwYWQtPnZpZHMuaW1wX2NvbG9ycyk7CisgICAgICBpZiAodmlkcGFkLT52aWRzX2NvZGVjX2RhdGEpIHsKKyAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKHZpZHBhZC0+dmlkc19jb2RlY19kYXRhLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmYncsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHZpZHBhZC0+dmlkc19jb2RlY19kYXRhLCAmbWFwKTsKKyAgICAgIH0KKyAgICAgIGdzdF9hdmlfbXV4X2VuZF9jaHVuayAoJmJ3LCBzdHJmKTsKKworICAgICAgLyogYWRkIHZpZGVvIHByb3BlcnR5IGRhdGEsIG1haW5seSBmb3IgYXNwZWN0IHJhdGlvLCBpZiBhbnkgKi8KKyAgICAgIGlmICh2aWRwYWQtPnZwcnAuYXNwZWN0KSB7CisgICAgICAgIGdpbnQgZjsKKyAgICAgICAgZ3VpbnQgdnBycDsKKworICAgICAgICAvKiBsZXQncyBiZSBvbiB0aGUgc2FmZSBzaWRlICovCisgICAgICAgIHZpZHBhZC0+dnBycC5maWVsZHMgPSBNSU4gKHZpZHBhZC0+dnBycC5maWVsZHMsCisgICAgICAgICAgICBHU1RfUklGRl9WUFJQX1ZJREVPX0ZJRUxEUyk7CisgICAgICAgIC8qIHRoZSB2cHJwIGhlYWRlciAqLworICAgICAgICB2cHJwID0gZ3N0X2F2aV9tdXhfc3RhcnRfY2h1bmsgKCZidywgInZwcnAiLCAwKTsKKyAgICAgICAgLyogdGhlIGFjdHVhbCBkYXRhICovCisgICAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCB2aWRwYWQtPnZwcnAuZm9ybWF0X3Rva2VuKTsKKyAgICAgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIHZpZHBhZC0+dnBycC5zdGFuZGFyZCk7CisgICAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCB2aWRwYWQtPnZwcnAudmVydF9yYXRlKTsKKyAgICAgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIHZpZHBhZC0+dnBycC5ob3JfdF90b3RhbCk7CisgICAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCB2aWRwYWQtPnZwcnAudmVydF9saW5lcyk7CisgICAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCB2aWRwYWQtPnZwcnAuYXNwZWN0KTsKKyAgICAgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIHZpZHBhZC0+dnBycC53aWR0aCk7CisgICAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCB2aWRwYWQtPnZwcnAuaGVpZ2h0KTsKKyAgICAgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIHZpZHBhZC0+dnBycC5maWVsZHMpOworCisgICAgICAgIGZvciAoZiA9IDA7IGYgPCB2aWRwYWQtPnZwcnAuZmllbGRzOyArK2YpIHsKKyAgICAgICAgICBnc3RfcmlmZl92cHJwX3ZpZGVvX2ZpZWxkX2Rlc2MgKmZkOworCisgICAgICAgICAgZmQgPSAmKHZpZHBhZC0+dnBycC5maWVsZF9pbmZvW2ZdKTsKKyAgICAgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgZmQtPmNvbXByZXNzZWRfYm1faGVpZ2h0KTsKKyAgICAgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgZmQtPmNvbXByZXNzZWRfYm1fd2lkdGgpOworICAgICAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBmZC0+dmFsaWRfYm1faGVpZ2h0KTsKKyAgICAgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgZmQtPnZhbGlkX2JtX3dpZHRoKTsKKyAgICAgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgZmQtPnZhbGlkX2JtX3hfb2Zmc2V0KTsKKyAgICAgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgZmQtPnZhbGlkX2JtX3lfb2Zmc2V0KTsKKyAgICAgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgZmQtPnZpZGVvX3hfdF9vZmZzZXQpOworICAgICAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBmZC0+dmlkZW9feV9zdGFydCk7CisgICAgICAgIH0KKyAgICAgICAgZ3N0X2F2aV9tdXhfZW5kX2NodW5rICgmYncsIHZwcnApOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjb2RlY19zaXplID0gYXVkcGFkLT5hdWRzX2NvZGVjX2RhdGEgPworICAgICAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGF1ZHBhZC0+YXVkc19jb2RlY19kYXRhKSA6IDA7CisgICAgICAvKiB0aGUgYXVkaW8gaGVhZGVyICovCisgICAgICBzdHJmID0gZ3N0X2F2aV9tdXhfc3RhcnRfY2h1bmsgKCZidywgInN0cmYiLCAwKTsKKyAgICAgIC8qIHRoZSBhY3R1YWwgaGVhZGVyICovCisgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfbGUgKCZidywgYXVkcGFkLT5hdWRzLmZvcm1hdCk7CisgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfbGUgKCZidywgYXVkcGFkLT5hdWRzLmNoYW5uZWxzKTsKKyAgICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCBhdWRwYWQtPmF1ZHMucmF0ZSk7CisgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXVkcGFkLT5hdWRzLmF2X2Jwcyk7CisgICAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfbGUgKCZidywgYXVkcGFkLT5hdWRzLmJsb2NrYWxpZ24pOworICAgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDE2X2xlICgmYncsIGF1ZHBhZC0+YXVkcy5iaXRzX3Blcl9zYW1wbGUpOworICAgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDE2X2xlICgmYncsIGNvZGVjX3NpemUpOworICAgICAgaWYgKGF1ZHBhZC0+YXVkc19jb2RlY19kYXRhKSB7CisgICAgICAgIGdzdF9idWZmZXJfbWFwIChhdWRwYWQtPmF1ZHNfY29kZWNfZGF0YSwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfZGF0YSAoJmJ3LCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChhdWRwYWQtPmF1ZHNfY29kZWNfZGF0YSwgJm1hcCk7CisgICAgICB9CisgICAgICBnc3RfYXZpX211eF9lbmRfY2h1bmsgKCZidywgc3RyZik7CisgICAgfQorCisgICAgLyogb2RtbCBzdXBlcmluZGV4IGNodW5rICovCisgICAgaWYgKGF2aXBhZC0+aWR4X2luZGV4ID4gMCkKKyAgICAgIGluZHggPSBnc3RfYXZpX211eF9zdGFydF9jaHVuayAoJmJ3LCAiaW5keCIsIDApOworICAgIGVsc2UKKyAgICAgIGluZHggPSBnc3RfYXZpX211eF9zdGFydF9jaHVuayAoJmJ3LCAiSlVOSyIsIDApOworICAgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQxNl9sZSAoJmJ3LCA0KTsgICAgICAvKiBieXRlcyBwZXIgZW50cnkgKi8KKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50OCAoJmJ3LCAwKTsgIC8qIGluZGV4IHN1YnR5cGUgKi8KKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50OCAoJmJ3LCBHU1RfQVZJX0lOREVYX09GX0lOREVYRVMpOyAgIC8qIGluZGV4IHR5cGUgKi8KKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpcGFkLT5pZHhfaW5kZXgpOyAgICAgIC8qIGVudHJpZXMgaW4gdXNlICovCisgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfZGF0YSAoJmJ3LCAoZ3VpbnQ4ICopIGF2aXBhZC0+dGFnLCA0KTsgICAvKiBzdHJlYW0gaWQgKi8KKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgMCk7ICAgICAgLyogcmVzZXJ2ZWQgKi8KKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgMCk7ICAgICAgLyogcmVzZXJ2ZWQgKi8KKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgMCk7ICAgICAgLyogcmVzZXJ2ZWQgKi8KKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmYncsIChndWludDggKikgYXZpcGFkLT5pZHgsCisgICAgICAgIEdTVF9BVklfU1VQRVJJTkRFWF9DT1VOVCAqIHNpemVvZiAoZ3N0X2F2aV9zdXBlcmluZGV4X2VudHJ5KSk7CisgICAgZ3N0X2F2aV9tdXhfZW5kX2NodW5rICgmYncsIGluZHgpOworCisgICAgLyogZW5kIHN0cmwgZm9yIHRoaXMgc3RyZWFtICovCisgICAgZ3N0X2F2aV9tdXhfZW5kX2NodW5rICgmYncsIHN0cmwpOworCisgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgIH0KKworICBpZiAoYXZpbXV4LT52aWRlb19wYWRzID4gMCkgeworICAgIGd1aW50IG9kbWwsIGRtbGg7CisgICAgLyogb2RtbCBoZWFkZXIgKi8KKyAgICBvZG1sID0gZ3N0X2F2aV9tdXhfc3RhcnRfY2h1bmsgKCZidywgIkxJU1QiLCAwKTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmYncsIChndWludDggKikgIm9kbWwiLCA0KTsKKyAgICBkbWxoID0gZ3N0X2F2aV9tdXhfc3RhcnRfY2h1bmsgKCZidywgImRtbGgiLCAwKTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgYXZpbXV4LT50b3RhbF9mcmFtZXMpOworICAgIGdzdF9hdmlfbXV4X2VuZF9jaHVuayAoJmJ3LCBkbWxoKTsKKyAgICBnc3RfYXZpX211eF9lbmRfY2h1bmsgKCZidywgb2RtbCk7CisgIH0KKworICAvKiBlbmQgaGRybCAqLworICBnc3RfYXZpX211eF9lbmRfY2h1bmsgKCZidywgaGRybCk7CisKKyAgLyogdGFncyAqLworICBpZiAodGFncykgeworICAgIGd1aW50IGluZm87CisKKyAgICBpbmZvID0gZ3N0X2F2aV9tdXhfc3RhcnRfY2h1bmsgKCZidywgIkxJU1QiLCAwKTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmYncsIChndWludDggKikgIklORk8iLCA0KTsKKworICAgIGdzdF90YWdfbGlzdF9mb3JlYWNoICh0YWdzLCBnc3RfYXZpX211eF93cml0ZV90YWcsICZidyk7CisgICAgaWYgKGluZm8gKyA4ID09IGdzdF9ieXRlX3dyaXRlcl9nZXRfcG9zICgmYncpKSB7CisgICAgICAvKiBubyB0YWdzIHdyaXRlbiwgcmVtb3ZlIHRoZSBlbXB0eSBJTkZPIExJU1QgYXMgaXQgaXMgdXNlbGVzcworICAgICAgICogYW5kIHByZXZlbnRzIHBsYXliYWNrIGluIHZsYyAqLworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3NldF9wb3MgKCZidywgaW5mbyAtIDQpOworICAgIH0gZWxzZSB7CisgICAgICBnc3RfYXZpX211eF9lbmRfY2h1bmsgKCZidywgaW5mbyk7CisgICAgfQorICB9CisKKyAgLyogcG9wIFJJRkYgKi8KKyAgZ3N0X2F2aV9tdXhfZW5kX2NodW5rICgmYncsIHJpZmYpOworCisgIC8qIGF2aSBkYXRhIGhlYWRlciAqLworICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmYncsIChndWludDggKikgIkxJU1QiLCA0KTsKKyAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIGF2aW11eC0+ZGF0YV9zaXplKTsKKyAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfZGF0YSAoJmJ3LCAoZ3VpbnQ4ICopICJtb3ZpIiwgNCk7CisKKyAgaWYgKCFoZGwpCisgICAgZ290byBiZWFjaDsKKworICAvKiBub3cgZ2V0IHRoZSBkYXRhICovCisgIGJ1ZmZlciA9IGdzdF9ieXRlX3dyaXRlcl9yZXNldF9hbmRfZ2V0X2J1ZmZlciAoJmJ3KTsKKworICAvKiAuLi4gYnV0IFJJRkYgaW5jbHVkZXMgbW9yZSB0aGFuIGp1c3QgaGVhZGVyICovCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgc2l6ZSA9IEdTVF9SRUFEX1VJTlQzMl9MRSAobWFwLmRhdGEgKyA0KTsKKyAgc2l6ZSArPSA4ICsgYXZpbXV4LT5kYXRhX3NpemUgKyBhdmltdXgtPmlkeF9zaXplOworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChtYXAuZGF0YSArIDQsIHNpemUpOworCisgIEdTVF9NRU1EVU1QX09CSkVDVCAoYXZpbXV4LCAiYXZpIGhlYWRlciIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKK2JlYWNoOgorICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9hdmlfbXV4X3JpZmZfZ2V0X2F2aXhfaGVhZGVyIChndWludDMyIGRhdGF4X3NpemUpCit7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBHc3RNYXBJbmZvIG1hcDsKKworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDI0KTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgbWVtY3B5IChtYXAuZGF0YSArIDAsICJSSUZGIiwgNCk7CisgIEdTVF9XUklURV9VSU5UMzJfTEUgKG1hcC5kYXRhICsgNCwgZGF0YXhfc2l6ZSArIDMgKiA0KTsKKyAgbWVtY3B5IChtYXAuZGF0YSArIDgsICJBVklYIiwgNCk7CisgIG1lbWNweSAobWFwLmRhdGEgKyAxMiwgIkxJU1QiLCA0KTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAobWFwLmRhdGEgKyAxNiwgZGF0YXhfc2l6ZSk7CisgIG1lbWNweSAobWFwLmRhdGEgKyAyMCwgIm1vdmkiLCA0KTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgaW5saW5lIEdzdEJ1ZmZlciAqCitnc3RfYXZpX211eF9yaWZmX2dldF9oZWFkZXIgKEdzdEF2aVBhZCAqIGF2aXBhZCwgZ3VpbnQzMiB2aWRlb19mcmFtZV9zaXplKQoreworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg4KTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgbWVtY3B5IChtYXAuZGF0YSArIDAsIGF2aXBhZC0+dGFnLCA0KTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAobWFwLmRhdGEgKyA0LCB2aWRlb19mcmFtZV9zaXplKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICByZXR1cm4gYnVmZmVyOworfQorCisvKiB3cml0ZSBhbiBvZG1sIGluZGV4IGNodW5rIGluIHRoZSBtb3ZpIGxpc3QgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYXZpX211eF93cml0ZV9hdml4X2luZGV4IChHc3RBdmlNdXggKiBhdmltdXgsIEdzdEF2aVBhZCAqIGF2aXBhZCwKKyAgICBnY2hhciAqIGNvZGUsIGdjaGFyICogY2h1bmssIGdzdF9hdmlfc3VwZXJpbmRleF9lbnRyeSAqIHN1cGVyX2luZGV4LAorICAgIGdpbnQgKiBzdXBlcl9pbmRleF9jb3VudCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBndWludDggKmRhdGE7CisgIGdzdF9yaWZmX2luZGV4X2VudHJ5ICplbnRyeTsKKyAgZ2ludCBpOworICBndWludDMyIHNpemUsIGVudHJ5X2NvdW50OworICBnYm9vbGVhbiBpc19wY20gPSBGQUxTRTsKKyAgZ3VpbnQzMiBwY21fc2FtcGxlcyA9IDA7CisgIEdzdE1hcEluZm8gbWFwOworCisgIC8qIGNoZWNrIGlmIGl0IGlzIHBjbSAqLworICBpZiAoYXZpcGFkICYmICFhdmlwYWQtPmlzX3ZpZGVvKSB7CisgICAgR3N0QXZpQXVkaW9QYWQgKmF1ZGlvcGFkID0gKEdzdEF2aUF1ZGlvUGFkICopIGF2aXBhZDsKKyAgICBpZiAoYXVkaW9wYWQtPmF1ZHMuZm9ybWF0ID09IEdTVF9SSUZGX1dBVkVfRk9STUFUX1BDTSkgeworICAgICAgcGNtX3NhbXBsZXMgPSBhdWRpb3BhZC0+c2FtcGxlczsKKyAgICAgIGlzX3BjbSA9IFRSVUU7CisgICAgfQorICB9CisKKyAgLyogYWxsb2NhdGUgdGhlIG1heGltdW0gcG9zc2libGUgKi8KKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgzMiArIDggKiBhdmltdXgtPmlkeF9pbmRleCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKworICAvKiBnZW5lcmFsIGluZGV4IGNodW5rIGluZm8gKi8KKyAgbWVtY3B5IChtYXAuZGF0YSArIDAsIGNodW5rLCA0KTsgICAgICAvKiBjaHVuayBpZCAqLworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChtYXAuZGF0YSArIDQsIDApOyAgICAgICAgLyogY2h1bmsgc2l6ZTsgZmlsbCBsYXRlciAqLworICBHU1RfV1JJVEVfVUlOVDE2X0xFIChtYXAuZGF0YSArIDgsIDIpOyAgICAgICAgLyogaW5kZXggZW50cnkgaXMgMiB3b3JkcyAqLworICBtYXAuZGF0YVsxMF0gPSAwOyAgICAgICAgICAgICAvKiBpbmRleCBzdWJ0eXBlICovCisgIG1hcC5kYXRhWzExXSA9IEdTVF9BVklfSU5ERVhfT0ZfQ0hVTktTOyAgICAgICAvKiBpbmRleCB0eXBlOiBBVklfSU5ERVhfT0ZfQ0hVTktTICovCisgIEdTVF9XUklURV9VSU5UMzJfTEUgKG1hcC5kYXRhICsgMTIsIDApOyAgICAgICAvKiBlbnRyaWVzIGluIHVzZTsgZmlsbCBsYXRlciAqLworICBtZW1jcHkgKG1hcC5kYXRhICsgMTYsIGNvZGUsIDQpOyAgICAgIC8qIHN0cmVhbSB0byB3aGljaCBpbmRleCByZWZlcnMgKi8KKyAgR1NUX1dSSVRFX1VJTlQ2NF9MRSAobWFwLmRhdGEgKyAyMCwgYXZpbXV4LT5hdml4X3N0YXJ0KTsgICAgICAvKiBiYXNlIG9mZnNldCAqLworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChtYXAuZGF0YSArIDI4LCAwKTsgICAgICAgLyogcmVzZXJ2ZWQgKi8KKyAgbWFwLmRhdGEgKz0gMzI7CisKKyAgLyogbm93IHRoZSBhY3R1YWwgaW5kZXggZW50cmllcyAqLworICBpID0gYXZpbXV4LT5pZHhfaW5kZXg7CisgIGVudHJ5ID0gYXZpbXV4LT5pZHg7CisgIHdoaWxlIChpID4gMCkgeworICAgIGlmIChtZW1jbXAgKCZlbnRyeS0+aWQsIGNvZGUsIDQpID09IDApIHsKKyAgICAgIC8qIGVudGVyIHJlbGF0aXZlIG9mZnNldCB0byB0aGUgZGF0YSAoISkgKi8KKyAgICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKG1hcC5kYXRhLCBHVUlOVDMyX0ZST01fTEUgKGVudHJ5LT5vZmZzZXQpICsgOCk7CisgICAgICAvKiBtc2IgaXMgc2V0IGlmIG5vdCAoISkga2V5ZnJhbWUgKi8KKyAgICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKG1hcC5kYXRhICsgNCwgR1VJTlQzMl9GUk9NX0xFIChlbnRyeS0+c2l6ZSkKKyAgICAgICAgICB8IChHVUlOVDMyX0ZST01fTEUgKGVudHJ5LT5mbGFncykKKyAgICAgICAgICAgICAgJiBHU1RfUklGRl9JRl9LRVlGUkFNRSA/IDAgOiAxVSA8PCAzMSkpOworICAgICAgbWFwLmRhdGEgKz0gODsKKyAgICB9CisgICAgaS0tOworICAgIGVudHJ5Kys7CisgIH0KKworICAvKiBvaywgbm93IHdlIGtub3cgdGhlIHNpemUgYW5kIG5vIG9mIGVudHJpZXMsIGZpbGwgaW4gd2hlcmUgbmVlZGVkICovCisgIHNpemUgPSBtYXAuZGF0YSAtIGRhdGE7CisgIEdTVF9XUklURV9VSU5UMzJfTEUgKGRhdGEgKyA0LCBzaXplIC0gOCk7CisgIGVudHJ5X2NvdW50ID0gKHNpemUgLSAzMikgLyA4OworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhICsgMTIsIGVudHJ5X2NvdW50KTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl9yZXNpemUgKGJ1ZmZlciwgMCwgc2l6ZSk7CisKKyAgLyogc2VuZCAqLworICBpZiAoKHJlcyA9IGdzdF9wYWRfcHVzaCAoYXZpbXV4LT5zcmNwYWQsIGJ1ZmZlcikpICE9IEdTVF9GTE9XX09LKQorICAgIHJldHVybiByZXM7CisKKyAgLyoga2VlcCB0cmFjayBvZiB0aGlzIGluIHN1cGVyaW5kZXggKGlmIHJvb20pIC4uLiAqLworICBpZiAoKnN1cGVyX2luZGV4X2NvdW50IDwgR1NUX0FWSV9TVVBFUklOREVYX0NPVU5UKSB7CisgICAgaSA9ICpzdXBlcl9pbmRleF9jb3VudDsKKyAgICBzdXBlcl9pbmRleFtpXS5vZmZzZXQgPSBHVUlOVDY0X1RPX0xFIChhdmltdXgtPnRvdGFsX2RhdGEpOworICAgIHN1cGVyX2luZGV4W2ldLnNpemUgPSBHVUlOVDMyX1RPX0xFIChzaXplKTsKKyAgICBpZiAoaXNfcGNtKSB7CisgICAgICBzdXBlcl9pbmRleFtpXS5kdXJhdGlvbiA9IEdVSU5UMzJfVE9fTEUgKHBjbV9zYW1wbGVzKTsKKyAgICB9IGVsc2UgeworICAgICAgc3VwZXJfaW5kZXhbaV0uZHVyYXRpb24gPSBHVUlOVDMyX1RPX0xFIChlbnRyeV9jb3VudCk7CisgICAgfQorICAgICgqc3VwZXJfaW5kZXhfY291bnQpKys7CisgIH0gZWxzZQorICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYXZpbXV4LCAiTm8gbW9yZSByb29tIGluIHN1cGVyaW5kZXggb2Ygc3RyZWFtICVzIiwKKyAgICAgICAgY29kZSk7CisKKyAgLyogLi4uIGFuZCBpbiBzaXplICovCisgIGF2aW11eC0+dG90YWxfZGF0YSArPSBzaXplOworICBpZiAoYXZpbXV4LT5pc19iaWdmaWxlKQorICAgIGF2aW11eC0+ZGF0YXhfc2l6ZSArPSBzaXplOworICBlbHNlCisgICAgYXZpbXV4LT5kYXRhX3NpemUgKz0gc2l6ZTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKKy8qIHNvbWUgb3RoZXIgdXNhYmxlIGZ1bmN0aW9ucyAodGhhbmt5b3UgeGF3dHYgOy0pICkgKi8KKworc3RhdGljIHZvaWQKK2dzdF9hdmlfbXV4X2FkZF9pbmRleCAoR3N0QXZpTXV4ICogYXZpbXV4LCBHc3RBdmlQYWQgKiBhdmlwYWQsIGd1aW50MzIgZmxhZ3MsCisgICAgZ3VpbnQzMiBzaXplKQoreworICBnY2hhciAqY29kZSA9IGF2aXBhZC0+dGFnOworICBpZiAoYXZpbXV4LT5pZHhfaW5kZXggPT0gYXZpbXV4LT5pZHhfY291bnQpIHsKKyAgICBhdmltdXgtPmlkeF9jb3VudCArPSAyNTY7CisgICAgYXZpbXV4LT5pZHggPQorICAgICAgICBnX3JlYWxsb2MgKGF2aW11eC0+aWR4LAorICAgICAgICBhdmltdXgtPmlkeF9jb3VudCAqIHNpemVvZiAoZ3N0X3JpZmZfaW5kZXhfZW50cnkpKTsKKyAgfQorCisgIC8qIGluIGNhc2Ugb2YgcGNtIGF1ZGlvLCB3ZSBuZWVkIHRvIGNvdW50IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBmb3IKKyAgICogcHV0dGluZyBpbiB0aGUgaW5keCBlbnRyaWVzICovCisgIGlmICghYXZpcGFkLT5pc192aWRlbykgeworICAgIEdzdEF2aUF1ZGlvUGFkICphdWRpb3BhZCA9IChHc3RBdmlBdWRpb1BhZCAqKSBhdmlwYWQ7CisgICAgaWYgKGF1ZGlvcGFkLT5hdWRzLmZvcm1hdCA9PSBHU1RfUklGRl9XQVZFX0ZPUk1BVF9QQ00pIHsKKyAgICAgIGF1ZGlvcGFkLT5zYW1wbGVzICs9IHNpemUgLyBhdWRpb3BhZC0+YXVkcy5ibG9ja2FsaWduOworICAgIH0KKyAgfQorCisgIG1lbWNweSAoJihhdmltdXgtPmlkeFthdmltdXgtPmlkeF9pbmRleF0uaWQpLCBjb2RlLCA0KTsKKyAgYXZpbXV4LT5pZHhbYXZpbXV4LT5pZHhfaW5kZXhdLmZsYWdzID0gR1VJTlQzMl9UT19MRSAoZmxhZ3MpOworICBhdmltdXgtPmlkeFthdmltdXgtPmlkeF9pbmRleF0ub2Zmc2V0ID0gR1VJTlQzMl9UT19MRSAoYXZpbXV4LT5pZHhfb2Zmc2V0KTsKKyAgYXZpbXV4LT5pZHhbYXZpbXV4LT5pZHhfaW5kZXhdLnNpemUgPSBHVUlOVDMyX1RPX0xFIChzaXplKTsKKyAgYXZpbXV4LT5pZHhfaW5kZXgrKzsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hdmlfbXV4X3dyaXRlX2luZGV4IChHc3RBdmlNdXggKiBhdmltdXgpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgc2l6ZTsKKworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDgpOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBtZW1jcHkgKG1hcC5kYXRhICsgMCwgImlkeDEiLCA0KTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAobWFwLmRhdGEgKyA0LAorICAgICAgYXZpbXV4LT5pZHhfaW5kZXggKiBzaXplb2YgKGdzdF9yaWZmX2luZGV4X2VudHJ5KSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgcmVzID0gZ3N0X3BhZF9wdXNoIChhdmltdXgtPnNyY3BhZCwgYnVmZmVyKTsKKyAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gcmVzOworCisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3ICgpOworCisgIHNpemUgPSBhdmltdXgtPmlkeF9pbmRleCAqIHNpemVvZiAoZ3N0X3JpZmZfaW5kZXhfZW50cnkpOworICBkYXRhID0gKGd1aW50OCAqKSBhdmltdXgtPmlkeDsKKyAgYXZpbXV4LT5pZHggPSBOVUxMOyAgICAgICAgICAgLyogd2lsbCBiZSBmcmVlKCknZWQgYnkgZ3N0X2J1ZmZlcl91bnJlZigpICovCisKKyAgZ3N0X2J1ZmZlcl9hcHBlbmRfbWVtb3J5IChidWZmZXIsCisgICAgICBnc3RfbWVtb3J5X25ld193cmFwcGVkICgwLCBkYXRhLCBzaXplLCAwLCBzaXplLCBkYXRhLCBnX2ZyZWUpKTsKKworICBhdmltdXgtPnRvdGFsX2RhdGEgKz0gc2l6ZSArIDg7CisKKyAgcmVzID0gZ3N0X3BhZF9wdXNoIChhdmltdXgtPnNyY3BhZCwgYnVmZmVyKTsKKyAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gcmVzOworCisgIGF2aW11eC0+aWR4X3NpemUgKz0gYXZpbXV4LT5pZHhfaW5kZXggKiBzaXplb2YgKGdzdF9yaWZmX2luZGV4X2VudHJ5KSArIDg7CisKKyAgLyogdXBkYXRlIGhlYWRlciAqLworICBhdmltdXgtPmF2aV9oZHIuZmxhZ3MgfD0gR1NUX1JJRkZfQVZJSF9IQVNJTkRFWDsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9tdXhfYmlnZmlsZSAoR3N0QXZpTXV4ICogYXZpbXV4LCBnYm9vbGVhbiBsYXN0KQoreworICBHc3RGbG93UmV0dXJuIHJlcyA9IEdTVF9GTE9XX09LOworICBHc3RCdWZmZXIgKmhlYWRlcjsKKyAgR1NMaXN0ICpub2RlOworCisgIC8qIGZpcnN0IHNvbWUgb2RtbCBzdGFuZGFyZCBpbmRleCBjaHVua3MgaW4gdGhlIG1vdmkgbGlzdCAqLworICBub2RlID0gYXZpbXV4LT5zaW5rcGFkczsKKyAgd2hpbGUgKG5vZGUpIHsKKyAgICBHc3RBdmlQYWQgKmF2aXBhZCA9IChHc3RBdmlQYWQgKikgbm9kZS0+ZGF0YTsKKworICAgIG5vZGUgPSBub2RlLT5uZXh0OworCisgICAgcmVzID0gZ3N0X2F2aV9tdXhfd3JpdGVfYXZpeF9pbmRleCAoYXZpbXV4LCBhdmlwYWQsIGF2aXBhZC0+dGFnLAorICAgICAgICBhdmlwYWQtPmlkeF90YWcsIGF2aXBhZC0+aWR4LCAmYXZpcGFkLT5pZHhfaW5kZXgpOworICAgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spCisgICAgICByZXR1cm4gcmVzOworICB9CisKKyAgaWYgKGF2aW11eC0+aXNfYmlnZmlsZSkgeworICAgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICAgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX0JZVEVTKTsKKworICAgIC8qIHNlYXJjaCBiYWNrICovCisgICAgc2VnbWVudC5zdGFydCA9IGF2aW11eC0+YXZpeF9zdGFydDsKKyAgICBzZWdtZW50LnRpbWUgPSBhdmltdXgtPmF2aXhfc3RhcnQ7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChhdmltdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgICAgLyogcmV3cml0ZSBBVklYIGhlYWRlciAqLworICAgIGhlYWRlciA9IGdzdF9hdmlfbXV4X3JpZmZfZ2V0X2F2aXhfaGVhZGVyIChhdmltdXgtPmRhdGF4X3NpemUpOworICAgIHJlcyA9IGdzdF9wYWRfcHVzaCAoYXZpbXV4LT5zcmNwYWQsIGhlYWRlcik7CisKKyAgICAvKiBnbyBiYWNrIHRvIGN1cnJlbnQgbG9jYXRpb24sIGF0IGxlYXN0IHRyeSAqLworICAgIHNlZ21lbnQuc3RhcnQgPSBhdmltdXgtPnRvdGFsX2RhdGE7CisgICAgc2VnbWVudC50aW1lID0gYXZpbXV4LT50b3RhbF9kYXRhOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoYXZpbXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKworICAgIGlmIChyZXMgIT0gR1NUX0ZMT1dfT0spCisgICAgICByZXR1cm4gcmVzOworICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBhIHN0YW5kYXJkIGluZGV4IGluIHRoZSBmaXJzdCByaWZmIGNodW5rICovCisgICAgcmVzID0gZ3N0X2F2aV9tdXhfd3JpdGVfaW5kZXggKGF2aW11eCk7CisgICAgLyogdGhlIGluZGV4IGRhdGEvYnVmZmVyIGlzIGZyZWVkIGJ5IHB1c2hpbmcgaXQgKi8KKyAgICBhdmltdXgtPmlkeF9jb3VudCA9IDA7CisgICAgaWYgKHJlcyAhPSBHU1RfRkxPV19PSykKKyAgICAgIHJldHVybiByZXM7CisgIH0KKworICBhdmltdXgtPmF2aXhfc3RhcnQgPSBhdmltdXgtPnRvdGFsX2RhdGE7CisKKyAgaWYgKGxhc3QpCisgICAgcmV0dXJuIHJlczsKKworICBhdmltdXgtPmlzX2JpZ2ZpbGUgPSBUUlVFOworICBhdmltdXgtPm51bXhfZnJhbWVzID0gMDsKKyAgYXZpbXV4LT5kYXRheF9zaXplID0gNDsgICAgICAgLyogbW92aSB0YWcgKi8KKyAgYXZpbXV4LT5pZHhfaW5kZXggPSAwOworICBub2RlID0gYXZpbXV4LT5zaW5rcGFkczsKKyAgd2hpbGUgKG5vZGUpIHsKKyAgICBHc3RBdmlQYWQgKmF2aXBhZCA9IChHc3RBdmlQYWQgKikgbm9kZS0+ZGF0YTsKKyAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICBpZiAoIWF2aXBhZC0+aXNfdmlkZW8pIHsKKyAgICAgIEdzdEF2aUF1ZGlvUGFkICphdWRpb3BhZCA9IChHc3RBdmlBdWRpb1BhZCAqKSBhdmlwYWQ7CisgICAgICBhdWRpb3BhZC0+c2FtcGxlcyA9IDA7CisgICAgfQorICB9CisKKyAgaGVhZGVyID0gZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpeF9oZWFkZXIgKDApOworICBhdmltdXgtPnRvdGFsX2RhdGEgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoaGVhZGVyKTsKKyAgLyogYXZpeF9zdGFydCBpcyB1c2VkIGFzIGJhc2Ugb2Zmc2V0IGZvciB0aGUgb2RtbCBpbmRleCBjaHVuayAqLworICBhdmltdXgtPmlkeF9vZmZzZXQgPSBhdmltdXgtPnRvdGFsX2RhdGEgLSBhdmltdXgtPmF2aXhfc3RhcnQ7CisKKyAgcmV0dXJuIGdzdF9wYWRfcHVzaCAoYXZpbXV4LT5zcmNwYWQsIGhlYWRlcik7Cit9CisKKy8qIGVub3VnaCBoZWFkZXIgYmxhYmxhIG5vdywgbGV0J3MgZ28gb24gdG8gYWN0dWFsbHkgd3JpdGluZyB0aGUgaGVhZGVycyAqLworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9tdXhfc3RhcnRfZmlsZSAoR3N0QXZpTXV4ICogYXZpbXV4KQoreworICBHc3RGbG93UmV0dXJuIHJlczsKKyAgR3N0QnVmZmVyICpoZWFkZXI7CisgIEdTTGlzdCAqbm9kZTsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGF2aW11eC0+dG90YWxfZGF0YSA9IDA7CisgIGF2aW11eC0+dG90YWxfZnJhbWVzID0gMDsKKyAgYXZpbXV4LT5kYXRhX3NpemUgPSA0OyAgICAgICAgLyogbW92aSB0YWcgKi8KKyAgYXZpbXV4LT5kYXRheF9zaXplID0gMDsKKyAgYXZpbXV4LT5udW1fZnJhbWVzID0gMDsKKyAgYXZpbXV4LT5udW14X2ZyYW1lcyA9IDA7CisgIGF2aW11eC0+YXZpeF9zdGFydCA9IDA7CisKKyAgYXZpbXV4LT5pZHhfaW5kZXggPSAwOworICBhdmltdXgtPmlkeF9vZmZzZXQgPSAwOyAgICAgICAvKiBzZWUgMTAgbGluZXMgYmVsb3cgKi8KKyAgYXZpbXV4LT5pZHhfc2l6ZSA9IDA7CisgIGF2aW11eC0+aWR4X2NvdW50ID0gMDsKKyAgYXZpbXV4LT5pZHggPSBOVUxMOworCisgIC8qIHN0YXRlICovCisgIGF2aW11eC0+d3JpdGVfaGVhZGVyID0gRkFMU0U7CisgIGF2aW11eC0+cmVzdGFydCA9IEZBTFNFOworCisgIC8qIGluaXQgc3RyZWFtcywgc2VlIHdoYXQgd2UndmUgZ290ICovCisgIG5vZGUgPSBhdmltdXgtPnNpbmtwYWRzOworICBhdmltdXgtPmF1ZGlvX3BhZHMgPSBhdmltdXgtPnZpZGVvX3BhZHMgPSAwOworICB3aGlsZSAobm9kZSkgeworICAgIEdzdEF2aVBhZCAqYXZpcGFkID0gKEdzdEF2aVBhZCAqKSBub2RlLT5kYXRhOworCisgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisKKyAgICBpZiAoIWF2aXBhZC0+aXNfdmlkZW8pIHsKKyAgICAgIC8qIGF1ZGlvIHN0cmVhbSBudW1iZXJzIG11c3Qgc3RhcnQgYXQgMSBpZmYgdGhlcmUgaXMgYSB2aWRlbyBzdHJlYW0gMDsKKyAgICAgICAqIHJlcXVlc3RfcGFkIGluc2VydHMgdmlkZW8gcGFkIGF0IGhlYWQgb2YgbGlzdCwgc28gdGhpcyB0ZXN0IHN1ZmZpY2VzICovCisgICAgICBpZiAoYXZpbXV4LT52aWRlb19wYWRzKQorICAgICAgICBhdmltdXgtPmF1ZGlvX3BhZHMrKzsKKyAgICAgIGF2aXBhZC0+dGFnID0gZ19zdHJkdXBfcHJpbnRmICgiJTAydXdiIiwgYXZpbXV4LT5hdWRpb19wYWRzKTsKKyAgICAgIGF2aXBhZC0+aWR4X3RhZyA9IGdfc3RyZHVwX3ByaW50ZiAoIml4JTAydSIsIGF2aW11eC0+YXVkaW9fcGFkcyk7CisgICAgICBpZiAoIWF2aW11eC0+dmlkZW9fcGFkcykKKyAgICAgICAgYXZpbXV4LT5hdWRpb19wYWRzKys7CisgICAgfSBlbHNlIHsKKyAgICAgIGF2aXBhZC0+dGFnID0gZ19zdHJkdXBfcHJpbnRmICgiJTAydWRiIiwgYXZpbXV4LT52aWRlb19wYWRzKTsKKyAgICAgIGF2aXBhZC0+aWR4X3RhZyA9IGdfc3RyZHVwX3ByaW50ZiAoIml4JTAydSIsIGF2aW11eC0+dmlkZW9fcGFkcysrKTsKKyAgICB9CisgIH0KKworICAvKiBzdHJlYW0tc3RhcnQgKEZJWE1FOiBjcmVhdGUgaWQgYmFzZWQgb24gaW5wdXQgaWRzKSAqLworICB7CisgICAgZ2NoYXIgc19pZFszMl07CisKKyAgICBnX3NucHJpbnRmIChzX2lkLCBzaXplb2YgKHNfaWQpLCAiYXZpbXV4LSUwOHgiLCBnX3JhbmRvbV9pbnQgKCkpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoYXZpbXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0IChzX2lkKSk7CisgIH0KKworICBjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKGF2aW11eC0+c3JjcGFkKTsKKyAgZ3N0X3BhZF9zZXRfY2FwcyAoYXZpbXV4LT5zcmNwYWQsIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgLyogbGV0IGRvd25zdHJlYW0ga25vdyB3ZSB0aGluayBpbiBCWVRFUyBhbmQgZXhwZWN0IHRvIGRvIHNlZWtpbmcgbGF0ZXIgb24gKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfQllURVMpOworICBnc3RfcGFkX3B1c2hfZXZlbnQgKGF2aW11eC0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSk7CisKKyAgLyogaGVhZGVyICovCisgIGF2aW11eC0+YXZpX2hkci5zdHJlYW1zID0gZ19zbGlzdF9sZW5ndGggKGF2aW11eC0+c2lua3BhZHMpOworICBhdmltdXgtPmlzX2JpZ2ZpbGUgPSBGQUxTRTsKKworICBoZWFkZXIgPSBnc3RfYXZpX211eF9yaWZmX2dldF9hdmlfaGVhZGVyIChhdmltdXgpOworICBhdmltdXgtPnRvdGFsX2RhdGEgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoaGVhZGVyKTsKKworICByZXMgPSBnc3RfcGFkX3B1c2ggKGF2aW11eC0+c3JjcGFkLCBoZWFkZXIpOworCisgIGF2aW11eC0+aWR4X29mZnNldCA9IGF2aW11eC0+dG90YWxfZGF0YTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9tdXhfc3RvcF9maWxlIChHc3RBdmlNdXggKiBhdmltdXgpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzID0gR1NUX0ZMT1dfT0s7CisgIEdzdEJ1ZmZlciAqaGVhZGVyOworICBHU0xpc3QgKm5vZGU7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICAvKiBEbyBub3Qgd3JpdGUgaW5kZXggYW5kIGhlYWRlciwgaWYgdGhlIGluZGV4IGhhcyBubyBkYXRhICovCisgIGlmIChhdmltdXgtPmlkeCA9PSBOVUxMKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICAvKiBpZiBiaWdmaWxlLCByZXdyaXRlIGhlYWRlciwgZWxzZSB3cml0ZSBpbmRleGVzICovCisgIC8qIGRvbid0IGJhaWwgb3V0IGF0IG9uY2UgaWYgZXJyb3IsIHN0aWxsIHRyeSB0byByZS13cml0ZSBoZWFkZXIgKi8KKyAgaWYgKGF2aW11eC0+dmlkZW9fcGFkcyA+IDApIHsKKyAgICBpZiAoYXZpbXV4LT5pc19iaWdmaWxlKSB7CisgICAgICByZXMgPSBnc3RfYXZpX211eF9iaWdmaWxlIChhdmltdXgsIFRSVUUpOworICAgIH0gZWxzZSB7CisgICAgICByZXMgPSBnc3RfYXZpX211eF93cml0ZV9pbmRleCAoYXZpbXV4KTsKKyAgICB9CisgIH0KKworICAvKiB3ZSBkbyBvdXIgYmVzdCB0byBtYWtlIGl0IGludGVybGVhdmVkIGF0IGxlYXN0IC4uLiAqLworICBpZiAoYXZpbXV4LT5hdWRpb19wYWRzID4gMCAmJiBhdmltdXgtPnZpZGVvX3BhZHMgPiAwKQorICAgIGF2aW11eC0+YXZpX2hkci5mbGFncyB8PSBHU1RfUklGRl9BVklIX0lTSU5URVJMRUFWRUQ7CisKKyAgLyogc2V0IHJhdGUgYW5kIGV2ZXJ5dGhpbmcgaGF2aW5nIHRvIGRvIHdpdGggdGhhdCAqLworICBhdmltdXgtPmF2aV9oZHIubWF4X2JwcyA9IDA7CisgIG5vZGUgPSBhdmltdXgtPnNpbmtwYWRzOworICB3aGlsZSAobm9kZSkgeworICAgIEdzdEF2aVBhZCAqYXZpcGFkID0gKEdzdEF2aVBhZCAqKSBub2RlLT5kYXRhOworCisgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisKKyAgICBpZiAoIWF2aXBhZC0+aXNfdmlkZW8pIHsKKyAgICAgIEdzdEF2aUF1ZGlvUGFkICphdWRwYWQgPSAoR3N0QXZpQXVkaW9QYWQgKikgYXZpcGFkOworCisgICAgICAvKiBjYWxjdWxhdGUgYnBzIGlmIG5lZWRlZCAqLworICAgICAgaWYgKCFhdWRwYWQtPmF1ZHMuYXZfYnBzKSB7CisgICAgICAgIGlmIChhdWRwYWQtPmF1ZGlvX3RpbWUpIHsKKyAgICAgICAgICBhdWRwYWQtPmF1ZHMuYXZfYnBzID0KKyAgICAgICAgICAgICAgKEdTVF9TRUNPTkQgKiBhdWRwYWQtPmF1ZGlvX3NpemUpIC8gYXVkcGFkLT5hdWRpb190aW1lOworICAgICAgICAgIC8qIHJvdW5kIGJwcyB0byBuZWFyZXN0IG11bHRpcGxlIG9mIDg7CisgICAgICAgICAgICogd2hpY2ggaXMgbXVjaCBtb3JlIGxpa2VseSB0byBiZSB0aGUgKGNicikgYml0cmF0ZSBpbiB1c2U7CisgICAgICAgICAgICogd2hpY2ggaW4gdHVybiByZXN1bHRzIGluIGJldHRlciB0aW1lc3RhbXAgY2FsY3VsYXRpb24gb24gcGxheWJhY2sgKi8KKyAgICAgICAgICBhdWRwYWQtPmF1ZHMuYXZfYnBzID0gR1NUX1JPVU5EX1VQXzggKGF1ZHBhZC0+YXVkcy5hdl9icHMgLSA0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChhdmltdXgsIFNUUkVBTSwgTVVYLAorICAgICAgICAgICAgICAoXygiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIikpLAorICAgICAgICAgICAgICAoTlVMTCkpOworICAgICAgICAgIGF1ZHBhZC0+YXVkcy5hdl9icHMgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBob3VzZWtlZXBpbmcgZm9yIHZiciBjYXNlICovCisgICAgICBpZiAoYXVkcGFkLT5tYXhfYXVkaW9fY2h1bmspCisgICAgICAgIGF1ZHBhZC0+YXVkcy5ibG9ja2FsaWduID0gYXVkcGFkLT5tYXhfYXVkaW9fY2h1bms7CisgICAgICBpZiAoYXVkcGFkLT5hdWRzLmJsb2NrYWxpZ24gPT0gMCkKKyAgICAgICAgYXVkcGFkLT5hdWRzLmJsb2NrYWxpZ24gPSAxOworICAgICAgLyogbm90ZSB0aGF0IGhkci5yYXRlIGlzIGFjdHVhbGx5IHVzZWQgYnkgZGVtdXggaW4gY2JyIGNhc2UgKi8KKyAgICAgIGlmIChhdmlwYWQtPmhkci5zY2FsZSA8PSAxKQorICAgICAgICBhdmlwYWQtPmhkci5yYXRlID0gYXVkcGFkLT5hdWRzLmF2X2JwcyAvIGF1ZHBhZC0+YXVkcy5ibG9ja2FsaWduOworICAgICAgYXZpbXV4LT5hdmlfaGRyLm1heF9icHMgKz0gYXVkcGFkLT5hdWRzLmF2X2JwczsKKyAgICAgIGF2aXBhZC0+aGRyLmxlbmd0aCA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoYXVkcGFkLT5hdWRpb190aW1lLAorICAgICAgICAgIGF2aXBhZC0+aGRyLnJhdGUsIGF2aXBhZC0+aGRyLnNjYWxlICogR1NUX1NFQ09ORCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdzdEF2aVZpZGVvUGFkICp2aWRwYWQgPSAoR3N0QXZpVmlkZW9QYWQgKikgYXZpcGFkOworCisgICAgICBhdmltdXgtPmF2aV9oZHIubWF4X2JwcyArPSAoKHZpZHBhZC0+dmlkcy5iaXRfY250ICsgNykgLyA4KSAqCisgICAgICAgICAgKDEwMDAwMDAuIC8gYXZpbXV4LT5hdmlfaGRyLnVzX2ZyYW1lKSAqIHZpZHBhZC0+dmlkcy5pbWFnZV9zaXplOworICAgICAgYXZpcGFkLT5oZHIubGVuZ3RoID0gYXZpbXV4LT50b3RhbF9mcmFtZXM7CisgICAgfQorICB9CisKKyAgLyogc3RhdGlzdGljcy90b3RhbF9mcmFtZXMvLi4uICovCisgIGF2aW11eC0+YXZpX2hkci50b3RfZnJhbWVzID0gYXZpbXV4LT5udW1fZnJhbWVzOworCisgIC8qIHNlZWsgYW5kIHJld3JpdGUgdGhlIGhlYWRlciAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAoYXZpbXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKworICAvKiB0aGUgZmlyc3QgZXJyb3Igc3Vydml2ZXMgKi8KKyAgaGVhZGVyID0gZ3N0X2F2aV9tdXhfcmlmZl9nZXRfYXZpX2hlYWRlciAoYXZpbXV4KTsKKyAgaWYgKHJlcyA9PSBHU1RfRkxPV19PSykKKyAgICByZXMgPSBnc3RfcGFkX3B1c2ggKGF2aW11eC0+c3JjcGFkLCBoZWFkZXIpOworICBlbHNlCisgICAgZ3N0X3BhZF9wdXNoIChhdmltdXgtPnNyY3BhZCwgaGVhZGVyKTsKKworICBzZWdtZW50LnN0YXJ0ID0gYXZpbXV4LT50b3RhbF9kYXRhOworICBzZWdtZW50LnRpbWUgPSBhdmltdXgtPnRvdGFsX2RhdGE7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAoYXZpbXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKworICBhdmltdXgtPndyaXRlX2hlYWRlciA9IFRSVUU7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hdmlfbXV4X3Jlc3RhcnRfZmlsZSAoR3N0QXZpTXV4ICogYXZpbXV4KQoreworICBHc3RGbG93UmV0dXJuIHJlczsKKworICBpZiAoKHJlcyA9IGdzdF9hdmlfbXV4X3N0b3BfZmlsZSAoYXZpbXV4KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJlczsKKworICBnc3RfcGFkX3B1c2hfZXZlbnQgKGF2aW11eC0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisKKyAgcmV0dXJuIGdzdF9hdmlfbXV4X3N0YXJ0X2ZpbGUgKGF2aW11eCk7Cit9CisKKy8qIGhhbmRsZSBldmVudHMgKHNlYXJjaCkgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2F2aV9tdXhfaGFuZGxlX2V2ZW50IChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsIEdzdENvbGxlY3REYXRhICogZGF0YSwKKyAgICBHc3RFdmVudCAqIGV2ZW50LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdEF2aU11eCAqYXZpbXV4OworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIGF2aW11eCA9IEdTVF9BVklfTVVYICh1c2VyX2RhdGEpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKyAgICAgIEdzdEF2aUNvbGxlY3REYXRhICpjb2xsZWN0X3BhZDsKKyAgICAgIEdzdEF2aVZpZGVvUGFkICphdmlwYWQ7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChldmVudCwgJmNhcHMpOworCisgICAgICAvKiBmaW5kIHN0cmVhbSBkYXRhICovCisgICAgICBjb2xsZWN0X3BhZCA9IChHc3RBdmlDb2xsZWN0RGF0YSAqKSBkYXRhOworICAgICAgZ19hc3NlcnQgKGNvbGxlY3RfcGFkKTsKKyAgICAgIGF2aXBhZCA9IChHc3RBdmlWaWRlb1BhZCAqKSBjb2xsZWN0X3BhZC0+YXZpcGFkOworICAgICAgZ19hc3NlcnQgKGF2aXBhZCk7CisKKyAgICAgIGlmIChhdmlwYWQtPnBhcmVudC5pc192aWRlbykgeworICAgICAgICByZXQgPSBnc3RfYXZpX211eF92aWRzaW5rX3NldF9jYXBzIChkYXRhLT5wYWQsIGNhcHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gZ3N0X2F2aV9tdXhfYXVkc2lua19zZXRfY2FwcyAoZGF0YS0+cGFkLCBjYXBzKTsKKyAgICAgIH0KKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgZXZlbnQgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX1RBRzp7CisgICAgICBHc3RUYWdMaXN0ICpsaXN0OworICAgICAgR3N0VGFnU2V0dGVyICpzZXR0ZXIgPSBHU1RfVEFHX1NFVFRFUiAoYXZpbXV4KTsKKyAgICAgIGNvbnN0IEdzdFRhZ01lcmdlTW9kZSBtb2RlID0gZ3N0X3RhZ19zZXR0ZXJfZ2V0X3RhZ19tZXJnZV9tb2RlIChzZXR0ZXIpOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfdGFnIChldmVudCwgJmxpc3QpOworICAgICAgZ3N0X3RhZ19zZXR0ZXJfbWVyZ2VfdGFncyAoc2V0dGVyLCBsaXN0LCBtb2RlKTsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgZXZlbnQgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChldmVudCAhPSBOVUxMKQorICAgIHJldHVybiBnc3RfY29sbGVjdF9wYWRzX2V2ZW50X2RlZmF1bHQgKHBhZHMsIGRhdGEsIGV2ZW50LCBGQUxTRSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogc2VuZCBleHRyYSAncGFkZGluZycgZGF0YSAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hdmlfbXV4X3NlbmRfcGFkX2RhdGEgKEdzdEF2aU11eCAqIGF2aW11eCwgZ3Vsb25nIG51bV9ieXRlcykKK3sKKyAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChudW1fYnl0ZXMpOworICBnc3RfYnVmZmVyX21lbXNldCAoYnVmZmVyLCAwLCAwLCBudW1fYnl0ZXMpOworCisgIHJldHVybiBnc3RfcGFkX3B1c2ggKGF2aW11eC0+c3JjcGFkLCBidWZmZXIpOworfQorCisjZGVmaW5lIGdzdF9hdmlfbXV4X2lzX3VuY29tcHJlc3NlZChmb3VyY2MpCQlcCisgIChmb3VyY2MgPT0gR1NUX1JJRkZfRElCIHx8CQkJCVwKKyAgIGZvdXJjYyA9PSBHU1RfUklGRl9yZ2IgfHwJCQkJXAorICAgZm91cmNjID09IEdTVF9SSUZGX1JHQiB8fCBmb3VyY2MgPT0gR1NUX1JJRkZfUkFXKQorCisvKgorICogSGVscGVyIGZvciBnc3RfYXZpX2RlbXV4X2ludmVydCgpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc3dhcF9saW5lIChndWludDggKiBkMSwgZ3VpbnQ4ICogZDIsIGd1aW50OCAqIHRtcCwgZ2ludCBieXRlcykKK3sKKyAgbWVtY3B5ICh0bXAsIGQxLCBieXRlcyk7CisgIG1lbWNweSAoZDEsIGQyLCBieXRlcyk7CisgIG1lbWNweSAoZDIsIHRtcCwgYnl0ZXMpOworfQorCisvKgorICogSW52ZXJ0IERJQiBidWZmZXJzLi4uIFRha2VzIGV4aXN0aW5nIGJ1ZmZlciBhbmQKKyAqIHJldHVybnMgZWl0aGVyIHRoZSBidWZmZXIgb3IgYSBuZXcgb25lICh3aXRoIG9sZAorICogb25lIGRlcmVmZXJlbmNlZCkuCisgKiBGRk1QRUcgZG9lcyB0aGlzIGJ5IHNpbXBseSBuZWdhdGluZyB0aGUgaGVpZ2h0IGluIHRoZSBoZWFkZXIuIFNob3VsZCB3ZT8KKyAqIEZJWE1FOiBjYW4ndCB3ZSBwcmVhbGxvY2F0ZSB0bXA/IGFuZCByZW1lbWJlciBzdHJpZGUsIGJwcD8KKyAqICAgICAgICB0aGlzIGNvdWxkIGJlIGRvbmUgaW4gZG9fb25lX2J1ZmZlcigpIEkgc3VwcG9zZQorICovCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9hdmlfbXV4X2ludmVydCAoR3N0QXZpUGFkICogYXZpcGFkLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIGdpbnQgeSwgdywgaDsKKyAgZ2ludCBicHAsIHN0cmlkZTsKKyAgZ3VpbnQ4ICp0bXAgPSBOVUxMOworICBHc3RNYXBJbmZvIG1hcDsKKworICBHc3RBdmlWaWRlb1BhZCAqdmlkcGFkID0gKEdzdEF2aVZpZGVvUGFkICopIGF2aXBhZDsKKworICBoID0gdmlkcGFkLT52aWRzLmhlaWdodDsKKyAgdyA9IHZpZHBhZC0+dmlkcy53aWR0aDsKKyAgYnBwID0gdmlkcGFkLT52aWRzLmJpdF9jbnQgPyB2aWRwYWQtPnZpZHMuYml0X2NudCA6IDg7CisgIHN0cmlkZSA9IEdTVF9ST1VORF9VUF80ICh3ICogKGJwcCAvIDgpKTsKKworICBidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKGJ1Zik7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEV1JJVEUpOworICBpZiAobWFwLnNpemUgPCAoc3RyaWRlICogaCkpIHsKKyAgICBHU1RfV0FSTklORyAoIkJ1ZmZlciBpcyBzbWFsbGVyIHRoYW4gcmVwb3J0ZWQgV2lkdGggeCBIZWlnaHQgeCBEZXB0aCIpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorCisgIHRtcCA9IGdfbWFsbG9jIChzdHJpZGUpOworCisgIGZvciAoeSA9IDA7IHkgPCBoIC8gMjsgeSsrKSB7CisgICAgc3dhcF9saW5lIChtYXAuZGF0YSArIHN0cmlkZSAqIHksIG1hcC5kYXRhICsgc3RyaWRlICogKGggLSAxIC0geSksIHRtcCwKKyAgICAgICAgc3RyaWRlKTsKKyAgfQorCisgIGdfZnJlZSAodG1wKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIHJldHVybiBidWY7Cit9CisKKy8qIGRvIGJ1ZmZlciAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hdmlfbXV4X2RvX2J1ZmZlciAoR3N0QXZpTXV4ICogYXZpbXV4LCBHc3RBdmlQYWQgKiBhdmlwYWQpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzOworICBHc3RCdWZmZXIgKmRhdGEsICpoZWFkZXI7CisgIGd1bG9uZyB0b3RhbF9zaXplLCBwYWRfYnl0ZXMgPSAwOworICBndWludCBmbGFnczsKKyAgZ3NpemUgZGF0YXNpemU7CisgIEdzdENsb2NrVGltZSB0aW1lOworCisgIGRhdGEgPSBnc3RfY29sbGVjdF9wYWRzX3BvcCAoYXZpbXV4LT5jb2xsZWN0LCBhdmlwYWQtPmNvbGxlY3QpOworICAvKiBhcnJhbmdlIGRvd25zdHJlYW0gcnVubmluZyB0aW1lICovCisgIHRpbWUgPSBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZhdmlwYWQtPmNvbGxlY3QtPnNlZ21lbnQsCisgICAgICBHU1RfRk9STUFUX1RJTUUsIEdTVF9CVUZGRVJfVElNRVNUQU1QIChkYXRhKSk7CisgIGlmICh0aW1lICE9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChkYXRhKSkgeworICAgIGRhdGEgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKGRhdGEpOworICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChkYXRhKSA9IHRpbWU7CisgIH0KKworICAvKiBQcmVwZW5kIGEgc3BlY2lhbCBidWZmZXIgdG8gdGhlIGZpcnN0IG9uZSBmb3Igc29tZSBmb3JtYXRzICovCisgIGlmIChhdmlwYWQtPmlzX3ZpZGVvKSB7CisgICAgR3N0QXZpVmlkZW9QYWQgKnZpZHBhZCA9IChHc3RBdmlWaWRlb1BhZCAqKSBhdmlwYWQ7CisKKyAgICBpZiAodmlkcGFkLT5wcmVwZW5kX2J1ZmZlcikgeworICAgICAgLyogS2VlcCBhIHJlZmVyZW5jZSB0byBkYXRhIHVudGlsIHdlIGNvcHkgdGhlIHRpbWVzdGFtcHMsIHRoZW4gcmVsZWFzZSBpdCAqLworICAgICAgR3N0QnVmZmVyICpuZXdkYXRhID0KKyAgICAgICAgICBnc3RfYnVmZmVyX2FwcGVuZCAodmlkcGFkLT5wcmVwZW5kX2J1ZmZlciwgZ3N0X2J1ZmZlcl9yZWYgKGRhdGEpKTsKKyAgICAgIGdzdF9idWZmZXJfY29weV9pbnRvIChuZXdkYXRhLCBkYXRhLCBHU1RfQlVGRkVSX0NPUFlfVElNRVNUQU1QUywgMCwgLTEpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoZGF0YSk7CisKKyAgICAgIGRhdGEgPSBuZXdkYXRhOworICAgICAgdmlkcGFkLT5wcmVwZW5kX2J1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgLyogRElCIGJ1ZmZlcnMgYXJlIHN0b3JlZCB0b3Bkb3duIChJIGRvbid0IGtub3cgd2h5KSAqLworICAgIGlmIChnc3RfYXZpX211eF9pc191bmNvbXByZXNzZWQgKGF2aXBhZC0+aGRyLmZjY19oYW5kbGVyKSkgeworICAgICAgZGF0YSA9IGdzdF9hdmlfbXV4X2ludmVydCAoYXZpcGFkLCBkYXRhKTsKKyAgICB9CisgIH0KKworICBpZiAoYXZpbXV4LT5yZXN0YXJ0KSB7CisgICAgaWYgKChyZXMgPSBnc3RfYXZpX211eF9yZXN0YXJ0X2ZpbGUgKGF2aW11eCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBkb25lOworICB9CisKKyAgZGF0YXNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChkYXRhKTsKKworICAvKiBuZWVkIHRvIHJlc3RhcnQgb3Igc3RhcnQgYSBuZXh0IGF2aXggY2h1bmsgPyAqLworICBpZiAoKGF2aW11eC0+aXNfYmlnZmlsZSA/IGF2aW11eC0+ZGF0YXhfc2l6ZSA6IGF2aW11eC0+ZGF0YV9zaXplKSArCisgICAgICBkYXRhc2l6ZSA+IEdTVF9BVklfTUFYX1NJWkUpIHsKKyAgICBpZiAoYXZpbXV4LT5lbmFibGVfbGFyZ2VfYXZpKSB7CisgICAgICBpZiAoKHJlcyA9IGdzdF9hdmlfbXV4X2JpZ2ZpbGUgKGF2aW11eCwgRkFMU0UpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBkb25lOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoKHJlcyA9IGdzdF9hdmlfbXV4X3Jlc3RhcnRfZmlsZSAoYXZpbXV4KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgIH0KKworICAvKiBnZXQgaGVhZGVyIGFuZCByZWNvcmQgc29tZSBzdGF0cyAqLworICBpZiAoZGF0YXNpemUgJiAxKSB7CisgICAgcGFkX2J5dGVzID0gMiAtIChkYXRhc2l6ZSAmIDEpOworICB9CisgIGhlYWRlciA9IGdzdF9hdmlfbXV4X3JpZmZfZ2V0X2hlYWRlciAoYXZpcGFkLCBkYXRhc2l6ZSk7CisgIHRvdGFsX3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChoZWFkZXIpICsgZGF0YXNpemUgKyBwYWRfYnl0ZXM7CisKKyAgaWYgKGF2aW11eC0+aXNfYmlnZmlsZSkgeworICAgIGF2aW11eC0+ZGF0YXhfc2l6ZSArPSB0b3RhbF9zaXplOworICB9IGVsc2UgeworICAgIGF2aW11eC0+ZGF0YV9zaXplICs9IHRvdGFsX3NpemU7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoYXZpcGFkLT5ob29rKSkgeworICAgIGdzdF9idWZmZXJfcmVmIChkYXRhKTsKKyAgICBhdmlwYWQtPmhvb2sgKGF2aW11eCwgYXZpcGFkLCBkYXRhKTsKKyAgfQorCisgIC8qIHRoZSBzdWdnZXN0ZWQgYnVmZmVyIHNpemUgaXMgdGhlIG1heCBmcmFtZSBzaXplICovCisgIGlmIChhdmlwYWQtPmhkci5idWZzaXplIDwgZGF0YXNpemUpCisgICAgYXZpcGFkLT5oZHIuYnVmc2l6ZSA9IGRhdGFzaXplOworCisgIGlmIChhdmlwYWQtPmlzX3ZpZGVvKSB7CisgICAgYXZpbXV4LT50b3RhbF9mcmFtZXMrKzsKKworICAgIGlmIChhdmltdXgtPmlzX2JpZ2ZpbGUpIHsKKyAgICAgIGF2aW11eC0+bnVteF9mcmFtZXMrKzsKKyAgICB9IGVsc2UgeworICAgICAgYXZpbXV4LT5udW1fZnJhbWVzKys7CisgICAgfQorCisgICAgZmxhZ3MgPSAweDAyOworICAgIGlmICghR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoZGF0YSwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpKQorICAgICAgZmxhZ3MgfD0gMHgxMDsKKyAgfSBlbHNlIHsKKyAgICBHc3RBdmlBdWRpb1BhZCAqYXVkcGFkID0gKEdzdEF2aUF1ZGlvUGFkICopIGF2aXBhZDsKKworICAgIGZsYWdzID0gMDsKKyAgICBhdWRwYWQtPmF1ZGlvX3NpemUgKz0gZGF0YXNpemU7CisgICAgYXVkcGFkLT5hdWRpb190aW1lICs9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGRhdGEpOworICAgIGlmIChhdWRwYWQtPm1heF9hdWRpb19jaHVuayAmJiBkYXRhc2l6ZSA+IGF1ZHBhZC0+bWF4X2F1ZGlvX2NodW5rKQorICAgICAgYXVkcGFkLT5tYXhfYXVkaW9fY2h1bmsgPSBkYXRhc2l6ZTsKKyAgfQorCisgIGdzdF9hdmlfbXV4X2FkZF9pbmRleCAoYXZpbXV4LCBhdmlwYWQsIGZsYWdzLCBkYXRhc2l6ZSk7CisKKyAgLyogc2VuZCBidWZmZXJzICovCisgIEdTVF9MT0dfT0JKRUNUIChhdmltdXgsICJwdXNoaW5nIGJ1ZmZlcnM6IGhlYWQsIGRhdGEiKTsKKworICBpZiAoKHJlcyA9IGdzdF9wYWRfcHVzaCAoYXZpbXV4LT5zcmNwYWQsIGhlYWRlcikpICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZG9uZTsKKworICBnc3RfYnVmZmVyX3JlZiAoZGF0YSk7CisgIGlmICgocmVzID0gZ3N0X3BhZF9wdXNoIChhdmltdXgtPnNyY3BhZCwgZGF0YSkpICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZG9uZTsKKworICBpZiAocGFkX2J5dGVzKSB7CisgICAgaWYgKChyZXMgPSBnc3RfYXZpX211eF9zZW5kX3BhZF9kYXRhIChhdmltdXgsIHBhZF9ieXRlcykpICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBkb25lOworICB9CisKKyAgLyogaWYgYW55IHB1c2ggYWJvdmUgZmFpbHMsIHdlJ3JlIGluIHRyb3VibGUgd2l0aCBmaWxlIGNvbnNpc3RlbmN5IGFueXdheSAqLworICBhdmltdXgtPnRvdGFsX2RhdGEgKz0gdG90YWxfc2l6ZTsKKyAgYXZpbXV4LT5pZHhfb2Zmc2V0ICs9IHRvdGFsX3NpemU7CisKK2RvbmU6CisgIGdzdF9idWZmZXJfdW5yZWYgKGRhdGEpOworICByZXR1cm4gcmVzOworfQorCisvKiBwaWNrIHRoZSBvbGRlc3QgYnVmZmVyIGZyb20gdGhlIHBhZHMgYW5kIHB1c2ggaXQgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYXZpX211eF9kb19vbmVfYnVmZmVyIChHc3RBdmlNdXggKiBhdmltdXgpCit7CisgIEdzdEF2aVBhZCAqYXZpcGFkLCAqYmVzdF9wYWQ7CisgIEdTTGlzdCAqbm9kZTsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdzdENsb2NrVGltZSB0aW1lLCBiZXN0X3RpbWUsIGRlbGF5OworCisgIG5vZGUgPSBhdmltdXgtPnNpbmtwYWRzOworICBiZXN0X3BhZCA9IE5VTEw7CisgIGJlc3RfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGZvciAoOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgIGF2aXBhZCA9IChHc3RBdmlQYWQgKikgbm9kZS0+ZGF0YTsKKworICAgIGlmICghYXZpcGFkLT5jb2xsZWN0KQorICAgICAgY29udGludWU7CisKKyAgICBidWZmZXIgPSBnc3RfY29sbGVjdF9wYWRzX3BlZWsgKGF2aW11eC0+Y29sbGVjdCwgYXZpcGFkLT5jb2xsZWN0KTsKKyAgICBpZiAoIWJ1ZmZlcikKKyAgICAgIGNvbnRpbnVlOworICAgIHRpbWUgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgICAgLyogaW52YWxpZCBzaG91bGQgcGFzcyAqLworICAgIGlmIChHX0xJS0VMWSAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHRpbWUpKSkgeworICAgICAgdGltZSA9IGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJmF2aXBhZC0+Y29sbGVjdC0+c2VnbWVudCwKKyAgICAgICAgICBHU1RfRk9STUFUX1RJTUUsIHRpbWUpOworICAgICAgaWYgKEdfVU5MSUtFTFkgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAodGltZSkpKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGF2aW11eCwgImNsaXBwaW5nIGJ1ZmZlciBvbiBwYWQgJXMgb3V0c2lkZSBzZWdtZW50IiwKKyAgICAgICAgICAgIEdTVF9QQURfTkFNRSAoYXZpcGFkLT5jb2xsZWN0LT5wYWQpKTsKKyAgICAgICAgYnVmZmVyID0gZ3N0X2NvbGxlY3RfcGFkc19wb3AgKGF2aW11eC0+Y29sbGVjdCwgYXZpcGFkLT5jb2xsZWN0KTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgICAgfQorICAgIH0KKworICAgIGRlbGF5ID0gYXZpcGFkLT5pc192aWRlbyA/IEdTVF9TRUNPTkQgLyAyIDogMDsKKworICAgIC8qIGludmFsaWQgdGltZXN0YW1wIGJ1ZmZlcnMgcGFzcyBmaXJzdCwKKyAgICAgKiB0aGVzZSBhcmUgcHJvYmFibHkgaW5pdGlhbGl6YXRpb24gYnVmZmVycyAqLworICAgIGlmIChiZXN0X3BhZCA9PSBOVUxMIHx8ICFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAodGltZSkKKyAgICAgICAgfHwgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChiZXN0X3RpbWUpICYmIHRpbWUgKyBkZWxheSA8IGJlc3RfdGltZSkpIHsKKyAgICAgIGJlc3RfcGFkID0gYXZpcGFkOworICAgICAgYmVzdF90aW1lID0gdGltZSArIGRlbGF5OworICAgIH0KKyAgfQorCisgIGlmIChiZXN0X3BhZCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChhdmltdXgsICJzZWxlY3RlZCBwYWQgJXMgd2l0aCB0aW1lICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1BBRF9OQU1FIChiZXN0X3BhZC0+Y29sbGVjdC0+cGFkKSwgR1NUX1RJTUVfQVJHUyAoYmVzdF90aW1lKSk7CisKKyAgICByZXR1cm4gZ3N0X2F2aV9tdXhfZG9fYnVmZmVyIChhdmltdXgsIGJlc3RfcGFkKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBzaW1wbHkgZmluaXNoIG9mZiB0aGUgZmlsZSBhbmQgc2VuZCBFT1MgKi8KKyAgICBnc3RfYXZpX211eF9zdG9wX2ZpbGUgKGF2aW11eCk7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChhdmltdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisgIH0KKworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9tdXhfY29sbGVjdF9wYWRzIChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsIEdzdEF2aU11eCAqIGF2aW11eCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXM7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGF2aW11eC0+d3JpdGVfaGVhZGVyKSkgeworICAgIGlmICgocmVzID0gZ3N0X2F2aV9tdXhfc3RhcnRfZmlsZSAoYXZpbXV4KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICByZXR1cm4gcmVzOworICB9CisKKyAgcmV0dXJuIGdzdF9hdmlfbXV4X2RvX29uZV9idWZmZXIgKGF2aW11eCk7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9hdmlfbXV4X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RBdmlNdXggKmF2aW11eDsKKworICBhdmltdXggPSBHU1RfQVZJX01VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQklHRklMRToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBhdmltdXgtPmVuYWJsZV9sYXJnZV9hdmkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2F2aV9tdXhfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEF2aU11eCAqYXZpbXV4OworCisgIGF2aW11eCA9IEdTVF9BVklfTVVYIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9CSUdGSUxFOgorICAgICAgYXZpbXV4LT5lbmFibGVfbGFyZ2VfYXZpID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9hdmlfbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdEF2aU11eCAqYXZpbXV4OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgYXZpbXV4ID0gR1NUX0FWSV9NVVggKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfY29sbGVjdF9wYWRzX3N0YXJ0IChhdmltdXgtPmNvbGxlY3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19QTEFZSU5HOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9jb2xsZWN0X3BhZHNfc3RvcCAoYXZpbXV4LT5jb2xsZWN0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICBnb3RvIGRvbmU7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9hdmlfbXV4X3Jlc2V0IChhdmltdXgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworZG9uZToKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2dzdC9hdmkvZ3N0YXZpbXV4LmggYi9nc3QvYXZpL2dzdGF2aW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZDUzNDMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXZpL2dzdGF2aW11eC5oCkBAIC0wLDAgKzEsMTk4IEBACisvKiBBVkkgbXV4ZXIgcGx1Z2luIGZvciBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX0FWSV9NVVhfSF9fCisjZGVmaW5lIF9fR1NUX0FWSV9NVVhfSF9fCisKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3Rjb2xsZWN0cGFkcy5oPgorI2luY2x1ZGUgPGdzdC9yaWZmL3JpZmYtaWRzLmg+CisjaW5jbHVkZSAiYXZpLWlkcy5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQVZJX01VWCBcCisgIChnc3RfYXZpX211eF9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVZJX01VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0FWSV9NVVgsR3N0QXZpTXV4KSkKKyNkZWZpbmUgR1NUX0FWSV9NVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfQVZJX01VWCxHc3RBdmlNdXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19BVklfTVVYKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQVZJX01VWCkpCisjZGVmaW5lIEdTVF9JU19BVklfTVVYX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0FWSV9NVVgpKQorCisjZGVmaW5lIEdTVF9BVklfSU5ERVhfT0ZfSU5ERVhFUyAgICAgMAorI2RlZmluZSBHU1RfQVZJX0lOREVYX09GX0NIVU5LUyAgICAgIDEKKworLyogdGhpcyBhbGxvd3MgaW5kZXhpbmcgdXAgdG8gNjRHQiBhdmkgZmlsZSAqLworI2RlZmluZSBHU1RfQVZJX1NVUEVSSU5ERVhfQ09VTlQgICAgMzIKKworLyogbWF4IHNpemUgKi8KKyNkZWZpbmUgR1NUX0FWSV9NQVhfU0laRSAgICAweDQwMDAwMDAwCisKK3R5cGVkZWYgc3RydWN0IF9nc3RfYXZpX3N1cGVyaW5kZXhfZW50cnkgeworICBndWludDY0IG9mZnNldDsKKyAgZ3VpbnQzMiBzaXplOworICBndWludDMyIGR1cmF0aW9uOworfSBnc3RfYXZpX3N1cGVyaW5kZXhfZW50cnk7CisKK3R5cGVkZWYgc3RydWN0IF9nc3RfcmlmZl9zdHJoX2Z1bGwgeworICBnc3RfcmlmZl9zdHJoICBwYXJlbnQ7CisgIC8qIHJjRnJhbWUsIFJFQ1Qgc3RydWN0dXJlIChzdHJ1Y3Qgb2YgNCBzaG9ydHMpICovCisgIGdpbnQxNiAgbGVmdDsKKyAgZ2ludDE2ICB0b3A7CisgIGdpbnQxNiAgcmlnaHQ7CisgIGdpbnQxNiAgYm90dG9tOworfSBnc3RfcmlmZl9zdHJoX2Z1bGw7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdmlQYWQgR3N0QXZpUGFkOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF2aU11eCBHc3RBdmlNdXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXZpTXV4Q2xhc3MgR3N0QXZpTXV4Q2xhc3M7CisKK3R5cGVkZWYgR3N0Rmxvd1JldHVybiAoKkdzdEF2aVBhZEhvb2spIChHc3RBdmlNdXggKiBhdmksIEdzdEF2aVBhZCAqIGF2aXBhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworCitzdHJ1Y3QgX0dzdEF2aVBhZCB7CisgIC8qIGRvIG5vdCBleHRlbmQsIGxpbmsgdG8gaXQgKi8KKyAgLyogaXMgTlVMTCBpZiBvcmlnaW5hbCBzaW5rIHJlcXVlc3QgcGFkIGhhcyBiZWVuIHJlbW92ZWQgKi8KKyAgR3N0Q29sbGVjdERhdGEgKmNvbGxlY3Q7CisKKyAgLyogdHlwZSAqLworICBnYm9vbGVhbiBpc192aWRlbzsKKyAgZ2Jvb2xlYW4gY29ubmVjdGVkOworCisgIC8qIGNodW5rIHRhZyAqLworICBnY2hhciAqdGFnOworCisgIC8qIHN0cmVhbSBoZWFkZXIgKi8KKyAgZ3N0X3JpZmZfc3RyaCBoZHI7CisKKyAgLyogb2RtbCBzdXBlciBpbmRleGVzICovCisgIGdzdF9hdmlfc3VwZXJpbmRleF9lbnRyeSBpZHhbR1NUX0FWSV9TVVBFUklOREVYX0NPVU5UXTsKKyAgZ2ludCBpZHhfaW5kZXg7CisgIGdjaGFyICppZHhfdGFnOworCisgIC8qIHN0cmVhbSBzcGVjaWZpYyBob29rICovCisgIEdzdEF2aVBhZEhvb2sgaG9vazsKK307CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdmlWaWRlb1BhZCB7CisgIEdzdEF2aVBhZCBwYXJlbnQ7CisKKyAgLyogc3RyZWFtIGZvcm1hdCAqLworICBnc3RfcmlmZl9zdHJmX3ZpZHMgdmlkczsKKyAgLyogZXh0cmEgZGF0YSAqLworICBHc3RCdWZmZXIgKnZpZHNfY29kZWNfZGF0YTsKKyAgLyogT0RNTCB2aWRlbyBwcm9wZXJ0aWVzICovCisgIGdzdF9yaWZmX3ZwcnAgdnBycDsKKworICBHc3RCdWZmZXIgKnByZXBlbmRfYnVmZmVyOworCit9IEdzdEF2aVZpZGVvUGFkOworCit0eXBlZGVmIHN0cnVjdCBfR3N0QXZpQXVkaW9QYWQgeworICBHc3RBdmlQYWQgcGFyZW50OworCisgIC8qIHN0cmVhbSBmb3JtYXQgKi8KKyAgZ3N0X3JpZmZfc3RyZl9hdWRzIGF1ZHM7CisgIC8qIGF1ZGlvIGluZm8gZm9yIGJwcyBjYWxjdWxhdGlvbiAqLworICBndWludDMyIGF1ZGlvX3NpemU7CisgIGd1aW50NjQgYXVkaW9fdGltZTsKKyAgLyogbWF4IGF1ZGlvIGNodW5rIHNpemUgZm9yIHZiciAqLworICBndWludDMyIG1heF9hdWRpb19jaHVuazsKKworICAvKiBjb3VudHMgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHB1dCBpbiBpbmR4IGNodW5rCisgICAqIHVzZWZ1bCBmb3IgcmF3IGF1ZGlvIHdoZXJlIHVzdWFsbHkgdGhlcmUgYXJlIG1vcmUgdGhhbgorICAgKiAxIHNhbXBsZSBpbiBlYWNoIEdzdEJ1ZmZlciAqLworICBnaW50IHNhbXBsZXM7CisKKyAgLyogZXh0cmEgZGF0YSAqLworICBHc3RCdWZmZXIgKmF1ZHNfY29kZWNfZGF0YTsKK30gR3N0QXZpQXVkaW9QYWQ7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBdmlDb2xsZWN0RGF0YSB7CisgIC8qIGV4dGVuZCB0aGUgQ29sbGVjdERhdGEgKi8KKyAgR3N0Q29sbGVjdERhdGEgY29sbGVjdDsKKworICBHc3RBdmlQYWQgICAgICAqYXZpcGFkOworfSBHc3RBdmlDb2xsZWN0RGF0YTsKKworc3RydWN0IF9Hc3RBdmlNdXggeworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgLyogcGFkcyAqLworICBHc3RQYWQgICAgICAgICAgICAgICpzcmNwYWQ7CisgIC8qIHNpbmtwYWRzLCB2aWRlbyBmaXJzdCAqLworICBHU0xpc3QgICAgICAgICAgICAgICpzaW5rcGFkczsKKyAgLyogdmlkZW8gcmVzdHJpY3RlZCB0byAxIHBhZCAqLworICBndWludCAgICAgICAgICAgICAgIHZpZGVvX3BhZHMsIGF1ZGlvX3BhZHM7CisgIEdzdENvbGxlY3RQYWRzICAgICAqY29sbGVjdDsKKworICAvKiB0aGUgQVZJIGhlYWRlciAqLworICAvKiBzdGlsbCBzb21lIHNpbmdsZSBzdHJlYW0gdmlkZW8gZGF0YSBpbiBtdXggc3RydWN0ICovCisgIGdzdF9yaWZmX2F2aWggYXZpX2hkcjsKKyAgLyogdG90YWwgbnVtYmVyIG9mICh2aWRlbykgZnJhbWVzICovCisgIGd1aW50MzIgdG90YWxfZnJhbWVzOworICAvKiBhbW91bnQgb2YgdG90YWwgZGF0YSAoYnl0ZXMpICovCisgIGd1aW50NjQgdG90YWxfZGF0YTsKKyAgLyogYW1vdW50IG9mIGRhdGEgKGJ5dGVzKSBpbiB0aGUgQVZJL0FWSVggYmxvY2s7CisgICAqIGFjdHVhbGx5IHRoZSBtb3ZpIGxpc3QsIHNvIGNvdW50ZWQgZnJvbSBhbmQgaW5jbHVkaW5nIHRoZSBtb3ZpIHRhZyAqLworICBndWludDMyIGRhdGFfc2l6ZSwgZGF0YXhfc2l6ZTsKKyAgLyogbnVtICh2aWRlbykgZnJhbWVzIGluIHRoZSBBVkkvQVZJWCBibG9jayAqLworICBndWludDMyIG51bV9mcmFtZXMsIG51bXhfZnJhbWVzOworICAvKiBzaXplIG9mIGhkcmwgbGlzdCwgaW5jbHVkaW5nIHRhZyBhcyB1c3VhbCAqLworCisgIC8qIHRvdGFsIHNpemUgb2YgZXh0cmEgY29kZWMgZGF0YSAqLworICBndWludDMyIGNvZGVjX2RhdGFfc2l6ZTsKKyAgLyogc3RhdGUgaW5mbyAqLworICBnYm9vbGVhbiB3cml0ZV9oZWFkZXI7CisgIGdib29sZWFuIHJlc3RhcnQ7CisKKyAgLyogdGFncyAqLworICBHc3RUYWdMaXN0ICp0YWdzX3NuYXA7CisKKyAgLyogaW5mb3JtYXRpb24gYWJvdXQgdGhlIEFWSSBpbmRleCAoJ2lkeCcpICovCisgIGdzdF9yaWZmX2luZGV4X2VudHJ5ICppZHg7CisgIGdpbnQgaWR4X2luZGV4LCBpZHhfY291bnQ7CisgIC8qIG9mZnNldCBvZiAqY2h1bmsqIChyZWxhdGl2ZSB0byBhIGJhc2Ugb2Zmc2V0KTsgZW50ZXJlZCBpbiB0aGUgaW5kZXggKi8KKyAgZ3VpbnQzMiBpZHhfb2Zmc2V0OworICAvKiBzaXplIG9mIGlkeDEgY2h1bmsgKGluY2x1ZGluZyEgY2h1bmsgaGVhZGVyIGFuZCBzaXplIGJ5dGVzKSAqLworICBndWludDMyIGlkeF9zaXplOworCisgIC8qIGFyZSB3ZSBhIGJpZyBmaWxlIGFscmVhZHk/ICovCisgIGdib29sZWFuIGlzX2JpZ2ZpbGU7CisgIGd1aW50NjQgYXZpeF9zdGFydDsKKworICAvKiB3aGV0aGVyIHRvIHVzZSAibGFyZ2UgQVZJIGZpbGVzIiBvciBqdXN0IHN0aWNrIHRvIHNtYWxsIGluZGV4ZWQgZmlsZXMgKi8KKyAgZ2Jvb2xlYW4gZW5hYmxlX2xhcmdlX2F2aTsKK307CisKK3N0cnVjdCBfR3N0QXZpTXV4Q2xhc3MgeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2F2aV9tdXhfZ2V0X3R5cGUodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKworI2VuZGlmIC8qIF9fR1NUX0FWSV9NVVhfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmMgYi9nc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVjOWNjYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9hdmkvZ3N0YXZpc3VidGl0bGUuYwpAQCAtMCwwICsxLDM4OSBAQAorLyogR1N0cmVhbWVyIEFWSSBHQUIyIHN1YnRpdGxlIHBhcnNlcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXZpc3VidGl0bGUKKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8cGFyYT4KKyAqIFBhcnNlcyB0aGUgc3VidGl0bGUgc3RyZWFtIGZyb20gYW4gYXZpIGZpbGUuCisgKiA8L3BhcmE+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiA8cGFyYT4KKyAqIDxwcm9ncmFtbGlzdGluZz4KKyAqIGdzdC1sYXVuY2gtMS4wIGZpbGVzcmMgbG9jYXRpb249c3VidGl0bGUuYXZpICEgYXZpZGVtdXggbmFtZT1kZW11eCAhIHF1ZXVlICEgYXZpc3VidGl0bGUgISBzdWJwYXJzZSAhIHRleHRvdmVybGF5IG5hbWU9b3ZlcmxheSAhIHZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsgZGVtdXguICEgcXVldWUgISBkZWNvZGViaW4gISBvdmVybGF5LgorICogPC9wcm9ncmFtbGlzdGluZz4KKyAqIFRoaXMgcGxheXMgYW4gYXZpIGZpbGUgd2l0aCBhIHZpZGVvIGFuZCBzdWJ0aXRsZSBzdHJlYW0uCisgKiA8L3BhcmE+CisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qIGV4YW1wbGUgb2YgYSBzdWJ0aXRsZSBjaHVuayBpbiBhbiBhdmkgZmlsZQorICogMDAwMDAwMDA6IDQ3IDQxIDQyIDMyIDAwIDAyIDAwIDEwIDAwIDAwIDAwIDQ1IDAwIDZlIDAwIDY3ICBHQUIyLi4uLi4uLkUubi5nCisgKiAwMDAwMDAxMDogMDAgNmMgMDAgNjkgMDAgNzMgMDAgNjggMDAgMDAgMDAgMDQgMDAgOGUgMDAgMDAgIC5sLmkucy5oLi4uLi4uLi4KKyAqIDAwMDAwMDIwOiAwMCBlZiBiYiBiZiAzMSAwZCAwYSAzMCAzMCAzYSAzMCAzMCAzYSAzMCAzMCAyYyAgLi4uLjEuLjAwOjAwOjAwLAorICogMDAwMDAwMzA6IDMxIDMwIDMwIDIwIDJkIDJkIDNlIDIwIDMwIDMwIDNhIDMwIDMwIDNhIDMwIDMyICAxMDAgLS0+IDAwOjAwOjAyCisgKiAwMDAwMDA0MDogMmMgMzAgMzAgMzAgMGQgMGEgM2MgNjIgM2UgNDEgNmUgMjAgNTUgNTQgNDYgMzggICwwMDAuLjxiPkFuIFVURjgKKyAqIDAwMDAwMDUwOiAyMCA1MyA3NSA2MiA3NCA2OSA3NCA2YyA2NSAyMCA3NyA2OSA3NCA2OCAyMCA0MiAgIFN1YnRpdGxlIHdpdGggQgorICogMDAwMDAwNjA6IDRmIDRkIDNjIDJmIDYyIDNlIDBkIDBhIDBkIDBhIDMyIDBkIDBhIDMwIDMwIDNhICBPTTwvYj4uLi4uMi4uMDA6CisgKiAwMDAwMDA3MDogMzAgMzAgM2EgMzAgMzIgMmMgMzEgMzAgMzAgMjAgMmQgMmQgM2UgMjAgMzAgMzAgIDAwOjAyLDEwMCAtLT4gMDAKKyAqIDAwMDAwMDgwOiAzYSAzMCAzMCAzYSAzMCAzNCAyYyAzMCAzMCAzMCAwZCAwYSA1MyA2ZiA2ZCA2NSAgOjAwOjA0LDAwMC4uU29tZQorICogMDAwMDAwOTA6IDc0IDY4IDY5IDZlIDY3IDIwIDZlIDZmIDZlIDQxIDUzIDQzIDQ5IDQ5IDIwIDJkICB0aGluZyBub25BU0NJSSAtCisgKiAwMDAwMDBhMDogMjAgYzIgYjUgYzMgYjYgYzMgYTQgYzMgYmMgYzMgOWYgMGQgMGEgMGQgMGEgICAgICAuLi4uLi4uLi4uLi4uLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0YXZpc3VidGl0bGUuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoYXZpc3VidGl0bGVfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgYXZpc3VidGl0bGVfZGVidWcKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXN1YnRpdGxlLWF2aSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXN1YnRpdGxlIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfYXZpX3N1YnRpdGxlX3RpdGxlX3RhZyAoR3N0QXZpU3VidGl0bGUgKiBzdWIsIGdjaGFyICogdGl0bGUpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2F2aV9zdWJ0aXRsZV9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfYXZpX3N1YnRpdGxlX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2F2aV9zdWJ0aXRsZV9zZW5kX2V2ZW50IChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworI2RlZmluZSBnc3RfYXZpX3N1YnRpdGxlX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdEF2aVN1YnRpdGxlLCBnc3RfYXZpX3N1YnRpdGxlLCBHU1RfVFlQRV9FTEVNRU5UKTsKKworI2RlZmluZSBJU19CT01fVVRGOChkYXRhKSAgICAgKChHU1RfUkVBRF9VSU5UMzJfQkUoZGF0YSkgPj4gOCkgPT0gMHhFRkJCQkYpCisjZGVmaW5lIElTX0JPTV9VVEYxNl9CRShkYXRhKSAoR1NUX1JFQURfVUlOVDE2X0JFKGRhdGEpID09IDB4RkVGRikKKyNkZWZpbmUgSVNfQk9NX1VURjE2X0xFKGRhdGEpIChHU1RfUkVBRF9VSU5UMTZfTEUoZGF0YSkgPT0gMHhGRUZGKQorI2RlZmluZSBJU19CT01fVVRGMzJfQkUoZGF0YSkgKEdTVF9SRUFEX1VJTlQzMl9CRShkYXRhKSA9PSAweEZFRkYpCisjZGVmaW5lIElTX0JPTV9VVEYzMl9MRShkYXRhKSAoR1NUX1JFQURfVUlOVDMyX0xFKGRhdGEpID09IDB4RkVGRikKKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfYXZpX3N1YnRpdGxlX2V4dHJhY3RfZmlsZSAoR3N0QXZpU3VidGl0bGUgKiBzdWIsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBndWludCBvZmZzZXQsIGd1aW50IGxlbikKK3sKKyAgY29uc3QgZ2NoYXIgKmlucHV0X2VuYyA9IE5VTEw7CisgIEdzdEJ1ZmZlciAqcmV0ID0gTlVMTDsKKyAgZ2NoYXIgKmRhdGE7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSAoZ2NoYXIgKikgKG1hcC5kYXRhICsgb2Zmc2V0KTsKKworICBpZiAobGVuID49ICgzICsgMSkgJiYgSVNfQk9NX1VURjggKGRhdGEpICYmCisgICAgICBnX3V0ZjhfdmFsaWRhdGUgKGRhdGEgKyAzLCBsZW4gLSAzLCBOVUxMKSkgeworICAgIHJldCA9CisgICAgICAgIGdzdF9idWZmZXJfY29weV9yZWdpb24gKGJ1ZmZlciwgR1NUX0JVRkZFUl9DT1BZX0FMTCwgb2Zmc2V0ICsgMywKKyAgICAgICAgbGVuIC0gMyk7CisgIH0gZWxzZSBpZiAobGVuID49IDIgJiYgSVNfQk9NX1VURjE2X0JFIChkYXRhKSkgeworICAgIGlucHV0X2VuYyA9ICJVVEYtMTZCRSI7CisgICAgZGF0YSArPSAyOworICAgIGxlbiAtPSAyOworICB9IGVsc2UgaWYgKGxlbiA+PSAyICYmIElTX0JPTV9VVEYxNl9MRSAoZGF0YSkpIHsKKyAgICBpbnB1dF9lbmMgPSAiVVRGLTE2TEUiOworICAgIGRhdGEgKz0gMjsKKyAgICBsZW4gLT0gMjsKKyAgfSBlbHNlIGlmIChsZW4gPj0gNCAmJiBJU19CT01fVVRGMzJfQkUgKGRhdGEpKSB7CisgICAgaW5wdXRfZW5jID0gIlVURi0zMkJFIjsKKyAgICBkYXRhICs9IDQ7CisgICAgbGVuIC09IDQ7CisgIH0gZWxzZSBpZiAobGVuID49IDQgJiYgSVNfQk9NX1VURjMyX0xFIChkYXRhKSkgeworICAgIGlucHV0X2VuYyA9ICJVVEYtMzJMRSI7CisgICAgZGF0YSArPSA0OworICAgIGxlbiAtPSA0OworICB9IGVsc2UgaWYgKGdfdXRmOF92YWxpZGF0ZSAoZGF0YSwgbGVuLCBOVUxMKSkgeworICAgIC8qIG5vdCBzcGVjaWZpZWQsIGNoZWNrIGlmIGl0J3MgVVRGLTggKi8KKyAgICByZXQgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIG9mZnNldCwgbGVuKTsKKyAgfSBlbHNlIHsKKyAgICAvKiB3ZSBjb3VsZCBmYWxsIGJhY2sgdG8gZ3N0X3RhZ19mcmVlZm9ybV90b191dGY4KCkgaGVyZSAqLworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3ViLCAidW5zcGVjaWZpZWQgZW5jb2RpbmcsIGFuZCBub3QgVVRGLTgiKTsKKyAgICByZXQgPSBOVUxMOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChyZXQgIT0gTlVMTCB8fCBpbnB1dF9lbmMgIT0gTlVMTCwgTlVMTCk7CisKKyAgaWYgKGlucHV0X2VuYykgeworICAgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgICBnY2hhciAqdXRmODsKKyAgICBnc2l6ZSBzbGVuOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3ViLCAiY29udmVydGluZyBzdWJ0aXRsZXMgZnJvbSAlcyB0byBVVEYtOCIsIGlucHV0X2VuYyk7CisgICAgdXRmOCA9IGdfY29udmVydCAoZGF0YSwgbGVuLCAiVVRGLTgiLCBpbnB1dF9lbmMsIE5VTEwsIE5VTEwsICZlcnIpOworCisgICAgaWYgKGVyciAhPSBOVUxMKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHN1YiwgImNvbnZlcnNpb24gdG8gVVRGLTggZmFpbGVkIDogJXMiLCBlcnItPm1lc3NhZ2UpOworICAgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgICAgcmV0ID0gTlVMTDsKKyAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICByZXQgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgICBzbGVuID0gc3RybGVuICh1dGY4KTsKKyAgICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKHJldCwKKyAgICAgICAgZ3N0X21lbW9yeV9uZXdfd3JhcHBlZCAoMCwgdXRmOCwgc2xlbiwgMCwgc2xlbiwgdXRmOCwgZ19mcmVlKSk7CisKKyAgICBHU1RfQlVGRkVSX09GRlNFVCAocmV0KSA9IDA7CisgIH0KKworZG9uZToKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIGdzdF9hdmlfc3VidGl0bGVfdGl0bGVfdGFnOgorICogQHN1Yjogc3VidGl0bGUgZWxlbWVudAorICogQHRpdGxlOiB0aGUgdGl0bGUgb2YgdGhpcyBzdWJ0aXRsZSBzdHJlYW0KKyAqCisgKiBTZW5kIGFuIGV2ZW50IHRvIHRoZSBzcmNwYWQgb2YgdGhlIEBzdWIgZWxlbWVudCB3aXRoIHRoZSB0aXRsZQorICogb2YgdGhlIHN1YnRpdGxlIHN0cmVhbSBhcyBhIEdTVF9UQUdfVElUTEUKKyAqLworc3RhdGljIHZvaWQKK2dzdF9hdmlfc3VidGl0bGVfdGl0bGVfdGFnIChHc3RBdmlTdWJ0aXRsZSAqIHN1YiwgZ2NoYXIgKiB0aXRsZSkKK3sKKyAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzdWItPnNyYywKKyAgICAgIGdzdF9ldmVudF9uZXdfdGFnIChnc3RfdGFnX2xpc3RfbmV3IChHU1RfVEFHX1RJVExFLCB0aXRsZSwgTlVMTCkpKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hdmlfc3VidGl0bGVfcGFyc2VfZ2FiMl9jaHVuayAoR3N0QXZpU3VidGl0bGUgKiBzdWIsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgZ2NoYXIgKm5hbWVfdXRmODsKKyAgZ3VpbnQgbmFtZV9sZW5ndGg7CisgIGd1aW50IGZpbGVfbGVuZ3RoOworICBHc3RNYXBJbmZvIG1hcDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIC8qIGNoZWNrIHRoZSBtYWdpYyB3b3JkICJHQUIyXDAiLCBhbmQgdGhlIG5leHQgd29yZCBtdXN0IGJlIDIgKi8KKyAgaWYgKG1hcC5zaXplIDwgMTIgfHwgbWVtY21wIChtYXAuZGF0YSwgIkdBQjJcMFwyXDAiLCA1ICsgMikgIT0gMCkKKyAgICBnb3RvIHdyb25nX21hZ2ljX3dvcmQ7CisKKyAgLyogcmVhZCAnbmFtZScgb2Ygc3VidGl0bGUgKi8KKyAgbmFtZV9sZW5ndGggPSBHU1RfUkVBRF9VSU5UMzJfTEUgKG1hcC5kYXRhICsgNSArIDIpOworICBHU1RfTE9HX09CSkVDVCAoc3ViLCAibGVuZ3RoIG9mIG5hbWU6ICV1IiwgbmFtZV9sZW5ndGgpOworICBpZiAobWFwLnNpemUgPD0gMTcgKyBuYW1lX2xlbmd0aCkKKyAgICBnb3RvIHdyb25nX25hbWVfbGVuZ3RoOworCisgIG5hbWVfdXRmOCA9CisgICAgICBnX2NvbnZlcnQgKChnY2hhciAqKSBtYXAuZGF0YSArIDExLCBuYW1lX2xlbmd0aCwgIlVURi04IiwgIlVURi0xNkxFIiwKKyAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworCisgIGlmIChuYW1lX3V0ZjgpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoc3ViLCAic3VidGl0bGUgbmFtZTogJXMiLCBuYW1lX3V0ZjgpOworICAgIGdzdF9hdmlfc3VidGl0bGVfdGl0bGVfdGFnIChzdWIsIG5hbWVfdXRmOCk7CisgICAgZ19mcmVlIChuYW1lX3V0ZjgpOworICB9CisKKyAgLyogbmV4dCB3b3JkIG11c3QgYmUgNCAqLworICBpZiAoR1NUX1JFQURfVUlOVDE2X0xFIChtYXAuZGF0YSArIDExICsgbmFtZV9sZW5ndGgpICE9IDB4NCkKKyAgICBnb3RvIHdyb25nX2ZpeGVkX3dvcmRfMjsKKworICBmaWxlX2xlbmd0aCA9IEdTVF9SRUFEX1VJTlQzMl9MRSAobWFwLmRhdGEgKyAxMyArIG5hbWVfbGVuZ3RoKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHN1YiwgImxlbmd0aCBzcnQvc3NhIGZpbGU6ICV1IiwgZmlsZV9sZW5ndGgpOworCisgIGlmIChtYXAuc2l6ZSA8ICgxNyArIG5hbWVfbGVuZ3RoICsgZmlsZV9sZW5ndGgpKQorICAgIGdvdG8gd3JvbmdfdG90YWxfbGVuZ3RoOworCisgIC8qIHN0b3JlIHRoaXMsIHNvIHdlIGNhbiBzZW5kIGl0IGFnYWluIGFmdGVyIGEgc2Vlazsgbm90ZSB0aGF0IHdlIHNob3VsZG4ndAorICAgKiBhc3N1bWUgYWxsIHRoZSByZW1haW5pbmcgZGF0YSBpbiB0aGUgY2h1bmsgaXMgc3VidGl0bGUgZGF0YSwgdGhlcmUgbWF5CisgICAqIGJlIHBhZGRpbmcgYXQgdGhlIGVuZCBmb3Igc29tZSByZWFzb24sIHNvIG9ubHkgcGFyc2UgZmlsZV9sZW5ndGggYnl0ZXMgKi8KKyAgc3ViLT5zdWJmaWxlID0KKyAgICAgIGdzdF9hdmlfc3VidGl0bGVfZXh0cmFjdF9maWxlIChzdWIsIGJ1ZiwgMTcgKyBuYW1lX2xlbmd0aCwgZmlsZV9sZW5ndGgpOworCisgIGlmIChzdWItPnN1YmZpbGUgPT0gTlVMTCkKKyAgICBnb3RvIGV4dHJhY3RfZmFpbGVkOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIC8qIEVSUk9SUyAqLword3JvbmdfbWFnaWNfd29yZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzdWIsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksICgiV3JvbmcgbWFnaWMgd29yZCIpKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQord3JvbmdfbmFtZV9sZW5ndGg6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3ViLCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAoIm5hbWUgZG9lc24ndCBmaXQgaW4gYnVmZmVyICglIiBHX0dTSVpFX0ZPUk1BVCAiIDwgJWQpIiwgbWFwLnNpemUsCisgICAgICAgICAgICAxNyArIG5hbWVfbGVuZ3RoKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3dyb25nX2ZpeGVkX3dvcmRfMjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzdWIsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksCisgICAgICAgICgid3JvbmcgZml4ZWQgd29yZDogZXhwZWN0ZWQgJXUsIGdvdCAldSIsIDQsCisgICAgICAgICAgICBHU1RfUkVBRF9VSU5UMTZfTEUgKG1hcC5kYXRhICsgMTEgKyBuYW1lX2xlbmd0aCkpKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQord3JvbmdfdG90YWxfbGVuZ3RoOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHN1YiwgU1RSRUFNLCBERUNPREUsIChOVUxMKSwKKyAgICAgICAgKCJidWZmZXIgc2l6ZSBpcyB3cm9uZzogbmVlZCAlZCBieXRlcywgaGF2ZSAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwKKyAgICAgICAgICAgIDE3ICsgbmFtZV9sZW5ndGggKyBmaWxlX2xlbmd0aCwgbWFwLnNpemUpKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorZXh0cmFjdF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3ViLCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAoImNvdWxkIG5vdCBleHRyYWN0IHN1YnRpdGxlcyIpKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2F2aV9zdWJ0aXRsZV9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0QXZpU3VidGl0bGUgKnN1YiA9IEdTVF9BVklfU1VCVElUTEUgKHBhcmVudCk7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIGlmIChzdWItPnN1YmZpbGUgIT0gTlVMTCkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3ViLCAiR290IG1vcmUgYnVmZmVycyB0aGFuIGV4cGVjdGVkLCBkcm9wcGluZyIpOworICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiB3ZSBleHBlY3QgZXhhY3RseSBvbmUgYnVmZmVyIHdpdGggdGhlIHdob2xlIHNydC9zc2EgZmlsZSBpbiBpdCAqLworICByZXQgPSBnc3RfYXZpX3N1YnRpdGxlX3BhcnNlX2dhYjJfY2h1bmsgKHN1YiwgYnVmZmVyKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogbm93IHB1c2ggdGhlIHN1YnRpdGxlIGRhdGEgZG93bnN0cmVhbSAqLworICByZXQgPSBnc3RfcGFkX3B1c2ggKHN1Yi0+c3JjLCBnc3RfYnVmZmVyX3JlZiAoc3ViLT5zdWJmaWxlKSk7CisKK2RvbmU6CisKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYXZpX3N1YnRpdGxlX3NlbmRfZXZlbnQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RBdmlTdWJ0aXRsZSAqYXZpc3VidGl0bGUgPSBHU1RfQVZJX1NVQlRJVExFIChlbGVtZW50KTsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX1NFRUspIHsKKyAgICBpZiAoYXZpc3VidGl0bGUtPnN1YmZpbGUpIHsKKyAgICAgIGlmIChnc3RfcGFkX3B1c2ggKGF2aXN1YnRpdGxlLT5zcmMsCisgICAgICAgICAgICAgIGdzdF9idWZmZXJfcmVmIChhdmlzdWJ0aXRsZS0+c3ViZmlsZSkpID09IEdTVF9GTE9XX09LKQorICAgICAgICByZXQgPSBUUlVFOworICAgIH0KKyAgfQorICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdmlfc3VidGl0bGVfY2xhc3NfaW5pdCAoR3N0QXZpU3VidGl0bGVDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChhdmlzdWJ0aXRsZV9kZWJ1ZywgImF2aXN1YnRpdGxlIiwgMCwKKyAgICAgICJwYXJzZSBhdmkgc3VidGl0bGUgc3RyZWFtIik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXZpX3N1YnRpdGxlX2NoYW5nZV9zdGF0ZSk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPnNlbmRfZXZlbnQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hdmlfc3VidGl0bGVfc2VuZF9ldmVudCk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiQXZpIHN1YnRpdGxlIHBhcnNlciIsICJDb2RlYy9QYXJzZXIvU3VidGl0bGUiLAorICAgICAgIlBhcnNlIGF2aSBzdWJ0aXRsZSBzdHJlYW0iLCAiVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hdmlfc3VidGl0bGVfaW5pdCAoR3N0QXZpU3VidGl0bGUgKiBzZWxmKQoreworICBHc3RDYXBzICpjYXBzOworCisgIHNlbGYtPnNyYyA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc3JjX3RlbXBsYXRlLCAic3JjIik7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzZWxmKSwgc2VsZi0+c3JjKTsKKworICBzZWxmLT5zaW5rID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rX3RlbXBsYXRlLCAic2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoc2VsZi0+c2luaywKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXZpX3N1YnRpdGxlX2NoYWluKSk7CisKKyAgY2FwcyA9IGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldF9jYXBzICgmc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X3BhZF9zZXRfY2FwcyAoc2VsZi0+c3JjLCBjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKHNlbGYtPnNyYyk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzZWxmKSwgc2VsZi0+c2luayk7CisKKyAgc2VsZi0+c3ViZmlsZSA9IE5VTEw7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2F2aV9zdWJ0aXRsZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdEF2aVN1YnRpdGxlICpzdWIgPSBHU1RfQVZJX1NVQlRJVExFIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICByZXR1cm4gcmV0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBpZiAoc3ViLT5zdWJmaWxlKSB7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHN1Yi0+c3ViZmlsZSk7CisgICAgICAgIHN1Yi0+c3ViZmlsZSA9IE5VTEw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZ3N0L2F2aS9nc3RhdmlzdWJ0aXRsZS5oIGIvZ3N0L2F2aS9nc3RhdmlzdWJ0aXRsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmODA0OGUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXZpL2dzdGF2aXN1YnRpdGxlLmgKQEAgLTAsMCArMSwzOSBAQAorCisjaWZuZGVmIF9fR1NUQVZJU1VCVElUTEVfSF9fCisjZGVmaW5lIF9fR1NUQVZJU1VCVElUTEVfSF9fCisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK0dfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF2aVN1YnRpdGxlIEdzdEF2aVN1YnRpdGxlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEF2aVN1YnRpdGxlQ2xhc3MgR3N0QXZpU3VidGl0bGVDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9BVklfU1VCVElUTEUgKGdzdF9hdmlfc3VidGl0bGVfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9BVklfU1VCVElUTEUob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9BVklfU1VCVElUTEUsIEdzdEF2aVN1YnRpdGxlKSkKKyNkZWZpbmUgR1NUX0FWSV9TVUJUSVRMRV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9BVklfU1VCVElUTEUsIEdzdEF2aVN1YnRpdGxlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVZJX1NVQlRJVExFKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfQVZJX1NVQlRJVExFKSkKKyNkZWZpbmUgR1NUX0lTX0FWSV9TVUJUSVRMRV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9BVklfU1VCVElUTEUpKQorI2RlZmluZSBHU1RfQVZJX1NVQlRJVExFX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfQVZJX1NVQlRJVExFLCBHc3RBdmlTdWJ0aXRsZUNsYXNzKSkKKworR1R5cGUgZ3N0X2F2aV9zdWJ0aXRsZV9nZXRfdHlwZSAodm9pZCk7CisKK3N0cnVjdCBfR3N0QXZpU3VidGl0bGUKK3sKKyAgR3N0RWxlbWVudCBwYXJlbnQ7CisKKyAgR3N0UGFkICAgICpzcmM7CisgIEdzdFBhZCAgICAqc2luazsKKworICBHc3RCdWZmZXIgKnN1YmZpbGU7ICAvKiB0aGUgY29tcGxldGUgc3VidGl0bGUgZmlsZSBpbiBvbmUgYnVmZmVyICovCit9OworCitzdHJ1Y3QgX0dzdEF2aVN1YnRpdGxlQ2xhc3MKK3sKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudDsKK307CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9hdmkvbWVzb24uYnVpbGQgYi9nc3QvYXZpL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZmQxYzQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvYXZpL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTUgQEAKK2F2aV9zb3VyY2VzID0gWworICAnZ3N0YXZpLmMnLAorICAnZ3N0YXZpbXV4LmMnLAorICAnZ3N0YXZpZGVtdXguYycsCisgICdnc3RhdmlzdWJ0aXRsZS5jJworXQorCitnc3RhdmkgPSBsaWJyYXJ5KCdnc3RhdmknLAorICBhdmlfc291cmNlcywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3RfZGVwLCBnc3RyaWZmX2RlcCwgZ3N0YXVkaW9fZGVwLCBnc3R2aWRlb19kZXAsIGdzdHRhZ19kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L2N1dHRlci9NYWtlZmlsZS5hbSBiL2dzdC9jdXR0ZXIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1Njc3ZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9jdXR0ZXIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMCBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0Y3V0dGVyLmxhCisKK2xpYmdzdGN1dHRlcl9sYV9TT1VSQ0VTID0gZ3N0Y3V0dGVyLmMKK2xpYmdzdGN1dHRlcl9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQorbGliZ3N0Y3V0dGVyX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEdTVF9CQVNFX0xJQlMpICQoTElCTSkKK2xpYmdzdGN1dHRlcl9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0Y3V0dGVyLmggZmlsdGVyLmZ1bmMKKworRVhUUkFfRElTVCA9IFJFQURNRQpkaWZmIC0tZ2l0IGEvZ3N0L2N1dHRlci9SRUFETUUgYi9nc3QvY3V0dGVyL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzA5NzVlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2N1dHRlci9SRUFETUUKQEAgLTAsMCArMSwzOCBAQAorY3V0dGVyIHBsdWdpbiBieSB0aG9tYXMgPHRob21hc0BhcGVzdGFhcnQub3JnPgorCitTWU5PUFNJUworCitUaGlzIHBsdWdpbiBlbWl0cyBzaWduYWxzIHdoZW4gUk1TIGxldmVsIG9mIGF1ZGlvIHNpZ25hbCBjcm9zc2VzIGEKK3RocmVzaG9sZCBmb3IgYSBnaXZlbiBhbW91bnQgb2YgdGltZS4gIAorCitBcyBzb29uIGFzIHRoZSBidWZmZXIncyBSTVMgaXMgZ3JlYXRlciB0aGFuIHRoZSB0aHJlc2hvbGQgdmFsdWUsIHRoZSBwbHVnaW4gZmlyZXMgYSBDVVRfU1RBUlQgc2lnbmFsLgorCitXaGVuIHRoZSBidWZmZXIncyBSTVMgbGV2ZWwgZHJvcHMgYmVsb3cgdGhlIHRocmVzaG9sZCB2YWx1ZSBmb3IgYSBjb25zZWN1dGl2ZSBydW4gbGVuZ3RoIGxvbmdlciB0aGFuIHRoZSBnaXZlbiBydW5sZW5ndGgsIGl0IHNlbmRzIGEgQ1VUX1NUT1Agc2lnbmFsLgorCitXaGVuIGEgcHJlLXJlY29yZGluZyBidWZmZXIgaXMgdXNlZCwgdGhlIHBsdWdpbiB3aWxsIGRlbGF5IHRocm91Z2hwdXQgb2YgZGF0YSB3aGVuIGl0J3MgaW4gInNpbGVudCIgbW9kZSBmb3IgYSBtYXhpbXVtIGxlbmd0aCBlcXVhbCB0byB0aGUgcHJlLXJlY29yZGluZyBidWZmZXIgbGVuZ3RoLiAgQXMgc29vbiBhcyB0aGUgaW5wdXQgbGV2ZWwgY3Jvc3NlcyB0aGUgdGhyZXNob2xkIGxldmVsLCB0aGlzIHByZS1yZWNvcmRlZCBidWZmZXIgaXMgZmx1c2hlZCB0byB0aGUgc3JjIHBhZCAoc28geW91IGNhbiBhY3R1YWxseSByZWNvcmQgdGhlIGF1ZGlvIGp1c3QgYmVmb3JlIHRoZSB0aHJlc2hvbGQgY3Jvc3NpbmcpIGFmdGVyIHNlbmRpbmcgdGhlIHNpZ25hbC4KKworQVJHVU1FTlRTCisKK0dzdEN1dHRlcjo6dGhyZXNob2xkCisJbGV2ZWwgKGJldHdlZW4gMCBhbmQgMSkgb2YgdGhyZXNob2xkCitHc3RDdXR0ZXI6OnRocmVzaG9sZF9kQgorCWxldmVsIG9mIHRocmVzaG9sZCBpbiBkQiAoYmV0d2VlbiAtaW5mIGFuZCAwKQorR3N0Q3V0dGVyOjpydW5sZW5ndGgKKwltaW5pbXVtIGxlbmd0aCAoaW4gc2Vjb25kcykgYmVmb3JlIHBsdWdpbiBzZW5kcyBjdXRfc3RvcCBzaWduYWwKK0dzdEN1dHRlcjo6cHJlbGVuZ3RoCisgICAgICAgIGxlbmd0aCBvZiBwcmUtcmVjb3JkaW5nIGJ1ZmZlcgorICAgICAgICAKK1NJR05BTFMKKworCUNVVF9TVEFSVAorCWdldHMgc2VudCB3aGVuIHRoZSBsZXZlbCBvZiB0aGUgc2lnbmFsIGdvZXMgYWJvdmUgdGhyZXNob2xkIGxldmVsCisJQ1VUX1NUT1AKKwlnZXRzIHNlbnQgd2hlbiB0aGUgbGV2ZWwgb2YgdGhlIHNpZ25hbCBoYXMgYmVlbiBiZWxvdyB0aGUKKwl0aHJlc2hvbGQgbGV2ZWwgZm9yIGEgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGl0ZXJhdGlvbnMgb2Ygd2hpY2gKKwl0aGUgY3VtdWxhdGl2ZSBsZW5ndGggaXMgbW9yZSB0aGFuIHRoZSBydW5sZW5ndGgKKworTElNSVRBVElPTlMKKworCSogUk1TIHZhbHVlIGlzIGNhbGN1bGF0ZWQgb3ZlciB0aGUgd2hvbGUgZGF0YSBidWZmZXIsIHNvCisJICB0aGUgdGltZSByZXNvbHV0aW9uIGlzIGxpbWl0ZWQgdG8gdGhlIGJ1ZmZlciBsZW5ndGgKKwkqIFJNUyB2YWx1ZSBpcyBjYWxjdWxhdGVkIG92ZXIgYWxsIG9mIHRoZSBjaGFubmVscyBjb21iaW5lZApkaWZmIC0tZ2l0IGEvZ3N0L2N1dHRlci9maWx0ZXIuZnVuYyBiL2dzdC9jdXR0ZXIvZmlsdGVyLmZ1bmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiZTU2NgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9jdXR0ZXIvZmlsdGVyLmZ1bmMKQEAgLTAsMCArMSwxNiBAQAoreworICBndWludCBqOworICByZWdpc3RlciBkb3VibGUgc3F1YXJlc3VtID0gMC4wOworCisgIC8qCisgICAqIHByb2Nlc3MgZGF0YSBoZXJlICAKKyAgICogaW5wdXQgc2FtcGxlIGRhdGEgZW50ZXJzIGluICppbl9kYXRhIGFzIDggb3IgMTYgYml0IGRhdGEKKyAgICogc2FtcGxlcyBmb3IgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBhcmUgaW50ZXJsZWF2ZWQKKyAgICovCisKKyAgZm9yIChqID0gMDsgaiA8IG51bV9zYW1wbGVzOyBqKyspIAorICAgICBzcXVhcmVzdW0gKz0gZGF0YVtqXSAqIGRhdGFbal07CisKKyAgcmV0dXJuIChzcXVhcmVzdW0gLyAoZmxvYXQpIG51bV9zYW1wbGVzKTsKK30KKwpkaWZmIC0tZ2l0IGEvZ3N0L2N1dHRlci9nc3RjdXR0ZXIuYyBiL2dzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzZGRmNgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmMKQEAgLTAsMCArMSw1MTIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgMjAwMiwyMDAzLDIwMDUKKyAqICAgICAgICAgICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LWN1dHRlcgorICoKKyAqIEFuYWx5c2VzIHRoZSBhdWRpbyBzaWduYWwgZm9yIHBlcmlvZHMgb2Ygc2lsZW5jZS4gVGhlIHN0YXJ0IGFuZCBlbmQgb2YKKyAqIHNpbGVuY2UgaXMgc2lnbmFsbGVkIGJ5IGJ1cyBtZXNzYWdlcyBuYW1lZAorICogPGNsYXNzbmFtZT4mcXVvdDtjdXR0ZXImcXVvdDs8L2NsYXNzbmFtZT4uCisgKiBUaGUgbWVzc2FnZSdzIHN0cnVjdHVyZSBjb250YWlucyB0d28gZmllbGRzOgorICogPGl0ZW1pemVkbGlzdD4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNHc3RDbG9ja1RpbWUKKyAqICAgPGNsYXNzbmFtZT4mcXVvdDt0aW1lc3RhbXAmcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGJ1ZmZlciB0aGF0IHRyaWdnZXJlZCB0aGUgbWVzc2FnZS4KKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgIGdib29sZWFuCisgKiAgIDxjbGFzc25hbWU+JnF1b3Q7YWJvdmUmcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgICVUUlVFIGZvciBiZWdpbiBvZiBzaWxlbmNlIGFuZCAlRkFMU0UgZm9yIGVuZCBvZiBzaWxlbmNlLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPC9pdGVtaXplZGxpc3Q+CisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC1tIGZpbGVzcmMgbG9jYXRpb249Zm9vLm9nZyAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhIGN1dHRlciAhIGF1dG9hdWRpb3NpbmsKKyAqIF18IFNob3cgY3V0IG1lc3NhZ2VzLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgImdzdGN1dHRlci5oIgorI2luY2x1ZGUgIm1hdGguaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoY3V0dGVyX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGN1dHRlcl9kZWJ1ZworCisjZGVmaW5lIENVVFRFUl9ERUZBVUxUX1RIUkVTSE9MRF9MRVZFTCAgICAwLjEKKyNkZWZpbmUgQ1VUVEVSX0RFRkFVTFRfVEhSRVNIT0xEX0xFTkdUSCAgKDUwMCAqIEdTVF9NU0VDT05EKQorI2RlZmluZSBDVVRURVJfREVGQVVMVF9QUkVfTEVOR1RIICAgICAgICAoMjAwICogR1NUX01TRUNPTkQpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBjdXR0ZXJfc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgUzgsIiBHU1RfQVVESU9fTkUgKFMxNikgIiB9LCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGN1dHRlcl9zaW5rX2ZhY3RvcnkgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgUzgsIiBHU1RfQVVESU9fTkUgKFMxNikgIiB9LCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCIpCisgICAgKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfVEhSRVNIT0xELAorICBQUk9QX1RIUkVTSE9MRF9EQiwKKyAgUFJPUF9SVU5fTEVOR1RILAorICBQUk9QX1BSRV9MRU5HVEgsCisgIFBST1BfTEVBS1kKK307CisKKyNkZWZpbmUgZ3N0X2N1dHRlcl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RDdXR0ZXIsIGdzdF9jdXR0ZXIsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9jdXR0ZXJfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyB2b2lkIGdzdF9jdXR0ZXJfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2N1dHRlcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfY3V0dGVyX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9jdXR0ZXJfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKK3N0YXRpYyB2b2lkCitnc3RfY3V0dGVyX2NsYXNzX2luaXQgKEdzdEN1dHRlckNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfY3V0dGVyX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2N1dHRlcl9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9USFJFU0hPTEQsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgidGhyZXNob2xkIiwgIlRocmVzaG9sZCIsCisgICAgICAgICAgIlZvbHVtZSB0aHJlc2hvbGQgYmVmb3JlIHRyaWdnZXIiLAorICAgICAgICAgIC1HX01BWERPVUJMRSwgR19NQVhET1VCTEUsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9USFJFU0hPTERfREIsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgidGhyZXNob2xkLWRCIiwgIlRocmVzaG9sZCAoZEIpIiwKKyAgICAgICAgICAiVm9sdW1lIHRocmVzaG9sZCBiZWZvcmUgdHJpZ2dlciAoaW4gZEIpIiwKKyAgICAgICAgICAtR19NQVhET1VCTEUsIEdfTUFYRE9VQkxFLCAwLjAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfUlVOX0xFTkdUSCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJydW4tbGVuZ3RoIiwgIlJ1biBsZW5ndGgiLAorICAgICAgICAgICJMZW5ndGggb2YgZHJvcCBiZWxvdyB0aHJlc2hvbGQgYmVmb3JlIGN1dF9zdG9wIChpbiBuYW5vc2Vjb25kcykiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDY0LCAwLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9QUkVfTEVOR1RILAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoInByZS1sZW5ndGgiLCAiUHJlLXJlY29yZGluZyBidWZmZXIgbGVuZ3RoIiwKKyAgICAgICAgICAiTGVuZ3RoIG9mIHByZS1yZWNvcmRpbmcgYnVmZmVyIChpbiBuYW5vc2Vjb25kcykiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDY0LCAwLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9MRUFLWSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgibGVha3kiLCAiTGVha3kiLAorICAgICAgICAgICJkbyB3ZSBsZWFrIGJ1ZmZlcnMgd2hlbiBiZWxvdyB0aHJlc2hvbGQgPyIsCisgICAgICAgICAgRkFMU0UsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChjdXR0ZXJfZGVidWcsICJjdXR0ZXIiLCAwLCAiQXVkaW8gY3V0dGluZyIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmN1dHRlcl9zcmNfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmN1dHRlcl9zaW5rX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiQXVkaW8gY3V0dGVyIiwKKyAgICAgICJGaWx0ZXIvRWRpdG9yL0F1ZGlvIiwgIkF1ZGlvIEN1dHRlciB0byBzcGxpdCBhdWRpbyBpbnRvIG5vbi1zaWxlbnQgYml0cyIsCisgICAgICAiVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPiIpOworICBlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfY3V0dGVyX2NoYW5nZV9zdGF0ZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9jdXR0ZXJfaW5pdCAoR3N0Q3V0dGVyICogZmlsdGVyKQoreworICBmaWx0ZXItPnNpbmtwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZjdXR0ZXJfc2lua19mYWN0b3J5LCAic2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoZmlsdGVyLT5zaW5rcGFkLCBnc3RfY3V0dGVyX2NoYWluKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKGZpbHRlci0+c2lua3BhZCwgZ3N0X2N1dHRlcl9ldmVudCk7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKGZpbHRlci0+c2lua3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChmaWx0ZXIpLCBmaWx0ZXItPnNpbmtwYWQpOworCisgIGZpbHRlci0+c3JjcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmY3V0dGVyX3NyY19mYWN0b3J5LCAic3JjIik7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKGZpbHRlci0+c3JjcGFkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKGZpbHRlciksIGZpbHRlci0+c3JjcGFkKTsKKworICBmaWx0ZXItPnRocmVzaG9sZF9sZXZlbCA9IENVVFRFUl9ERUZBVUxUX1RIUkVTSE9MRF9MRVZFTDsKKyAgZmlsdGVyLT50aHJlc2hvbGRfbGVuZ3RoID0gQ1VUVEVSX0RFRkFVTFRfVEhSRVNIT0xEX0xFTkdUSDsKKyAgZmlsdGVyLT5zaWxlbnRfcnVuX2xlbmd0aCA9IDAgKiBHU1RfU0VDT05EOworICBmaWx0ZXItPnNpbGVudCA9IFRSVUU7CisgIGZpbHRlci0+c2lsZW50X3ByZXYgPSBGQUxTRTsgIC8qIHByZXZpb3VzIHZhbHVlIG9mIHNpbGVudCAqLworCisgIGZpbHRlci0+cHJlX2xlbmd0aCA9IENVVFRFUl9ERUZBVUxUX1BSRV9MRU5HVEg7CisgIGZpbHRlci0+cHJlX3J1bl9sZW5ndGggPSAwICogR1NUX1NFQ09ORDsKKyAgZmlsdGVyLT5wcmVfYnVmZmVyID0gTlVMTDsKKyAgZmlsdGVyLT5sZWFreSA9IEZBTFNFOworfQorCitzdGF0aWMgR3N0TWVzc2FnZSAqCitnc3RfY3V0dGVyX21lc3NhZ2VfbmV3IChHc3RDdXR0ZXIgKiBjLCBnYm9vbGVhbiBhYm92ZSwgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCkKK3sKKyAgR3N0U3RydWN0dXJlICpzOworCisgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoImN1dHRlciIsCisgICAgICAiYWJvdmUiLCBHX1RZUEVfQk9PTEVBTiwgYWJvdmUsCisgICAgICAidGltZXN0YW1wIiwgR1NUX1RZUEVfQ0xPQ0tfVElNRSwgdGltZXN0YW1wLCBOVUxMKTsKKworICByZXR1cm4gZ3N0X21lc3NhZ2VfbmV3X2VsZW1lbnQgKEdTVF9PQkpFQ1QgKGMpLCBzKTsKK30KKworLyogQ2FsY3VsYXRlIHRoZSBOb3JtYWxpemVkIEN1bXVsYXRpdmUgU3F1YXJlIG92ZXIgYSBidWZmZXIgb2YgdGhlIGdpdmVuIHR5cGUKKyAqIGFuZCBvdmVyIGFsbCBjaGFubmVscyBjb21iaW5lZCAqLworCisjZGVmaW5lIERFRklORV9DVVRURVJfQ0FMQ1VMQVRPUihUWVBFLCBSRVNPTFVUSU9OKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBpbmxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitnc3RfY3V0dGVyX2NhbGN1bGF0ZV8jI1RZUEUgKFRZUEUgKiBpbiwgZ3VpbnQgbnVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICpOQ1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJlZ2lzdGVyIGludCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvdWJsZSBzcXVhcmVzdW0gPSAwLjA7ICAgICAgICAgICAvKiBzcXVhcmUgc3VtIG9mIHRoZSBpbnRlZ2VyIHNhbXBsZXMgKi8gICBcCisgIHJlZ2lzdGVyIGRvdWJsZSBzcXVhcmUgPSAwLjA7ICAgICAvKiBTcXVhcmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdkb3VibGUgbm9ybWFsaXplcjsgICAgICAgICAgICAgICAvKiBkaXZpc29yIHRvIGdldCBhIFstMS4wLCAxLjBdIHJhbmdlICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICpOQ1MgPSAwLjA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3JtYWxpemVkIEN1bXVsYXRpdmUgU3F1YXJlICovICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5vcm1hbGl6ZXIgPSAoZG91YmxlKSAoMSA8PCAoUkVTT0xVVElPTiAqIDIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaiA9IDA7IGogPCBudW07IGorKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3F1YXJlID0gKChkb3VibGUpIGluW2pdKSAqIGluW2pdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3F1YXJlc3VtICs9IHNxdWFyZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICpOQ1MgPSBzcXVhcmVzdW0gLyBub3JtYWxpemVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0RFRklORV9DVVRURVJfQ0FMQ1VMQVRPUiAoZ2ludDE2LCAxNSk7CitERUZJTkVfQ1VUVEVSX0NBTENVTEFUT1IgKGdpbnQ4LCA3KTsKKworc3RhdGljIGdib29sZWFuCitnc3RfY3V0dGVyX3NldGNhcHMgKEdzdEN1dHRlciAqIGZpbHRlciwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdEF1ZGlvSW5mbyBpbmZvOworCisgIGlmICghZ3N0X2F1ZGlvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgY2FwcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGZpbHRlci0+aW5mbyA9IGluZm87CisKKyAgcmV0dXJuIGdzdF9wYWRfc2V0X2NhcHMgKGZpbHRlci0+c3JjcGFkLCBjYXBzKTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfY3V0dGVyX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0Q3V0dGVyICpmaWx0ZXIgPSBHU1RfQ1VUVEVSIChlbGVtZW50KTsKKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ19saXN0X2ZyZWVfZnVsbCAoZmlsdGVyLT5wcmVfYnVmZmVyLCAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9idWZmZXJfdW5yZWYpOworICAgICAgZmlsdGVyLT5wcmVfYnVmZmVyID0gTlVMTDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9jdXR0ZXJfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBnYm9vbGVhbiByZXQ7CisgIEdzdEN1dHRlciAqZmlsdGVyOworCisgIGZpbHRlciA9IEdTVF9DVVRURVIgKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfY2FwcyAoZXZlbnQsICZjYXBzKTsKKyAgICAgIHJldCA9IGdzdF9jdXR0ZXJfc2V0Y2FwcyAoZmlsdGVyLCBjYXBzKTsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2N1dHRlcl9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0Q3V0dGVyICpmaWx0ZXI7CisgIEdzdE1hcEluZm8gbWFwOworICBnaW50MTYgKmluX2RhdGE7CisgIGdpbnQgYnBmLCByYXRlOworICBnc2l6ZSBpbl9zaXplOworICBndWludCBudW1fc2FtcGxlczsKKyAgZ2RvdWJsZSBOQ1MgPSAwLjA7ICAgICAgICAgICAgLyogTm9ybWFsaXplZCBDdW11bGF0aXZlIFNxdWFyZSBvZiBidWZmZXIgKi8KKyAgZ2RvdWJsZSBSTVMgPSAwLjA7ICAgICAgICAgICAgLyogUk1TIG9mIHNpZ25hbCBpbiBidWZmZXIgKi8KKyAgZ2RvdWJsZSBOTVMgPSAwLjA7ICAgICAgICAgICAgLyogTm9ybWFsaXplZCBNZWFuIFNxdWFyZSBvZiBidWZmZXIgKi8KKyAgR3N0QnVmZmVyICpwcmVidWY7ICAgICAgICAgICAgLyogcG9pbnRlciB0byBhIHByZWJ1ZmZlciBlbGVtZW50ICovCisgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKKworICBmaWx0ZXIgPSBHU1RfQ1VUVEVSIChwYXJlbnQpOworCisgIGlmIChHU1RfQVVESU9fSU5GT19GT1JNQVQgKCZmaWx0ZXItPmluZm8pID09IEdTVF9BVURJT19GT1JNQVRfVU5LTk9XTikKKyAgICBnb3RvIG5vdF9uZWdvdGlhdGVkOworCisgIGJwZiA9IEdTVF9BVURJT19JTkZPX0JQRiAoJmZpbHRlci0+aW5mbyk7CisgIHJhdGUgPSBHU1RfQVVESU9fSU5GT19SQVRFICgmZmlsdGVyLT5pbmZvKTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBpbl9kYXRhID0gKGdpbnQxNiAqKSBtYXAuZGF0YTsKKyAgaW5fc2l6ZSA9IG1hcC5zaXplOworCisgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICJsZW5ndGggb2YgcHJlcmVjIGJ1ZmZlcjogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoZmlsdGVyLT5wcmVfcnVuX2xlbmd0aCkpOworCisgIC8qIGNhbGN1bGF0ZSBtZWFuIHNxdWFyZSB2YWx1ZSBvbiBidWZmZXIgKi8KKyAgc3dpdGNoIChHU1RfQVVESU9fSU5GT19GT1JNQVQgKCZmaWx0ZXItPmluZm8pKSB7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MxNjoKKyAgICAgIG51bV9zYW1wbGVzID0gaW5fc2l6ZSAvIDI7CisgICAgICBnc3RfY3V0dGVyX2NhbGN1bGF0ZV9naW50MTYgKGluX2RhdGEsIG51bV9zYW1wbGVzLCAmTkNTKTsKKyAgICAgIE5NUyA9IE5DUyAvIG51bV9zYW1wbGVzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1M4OgorICAgICAgbnVtX3NhbXBsZXMgPSBpbl9zaXplOworICAgICAgZ3N0X2N1dHRlcl9jYWxjdWxhdGVfZ2ludDggKChnaW50OCAqKSBpbl9kYXRhLCBudW1fc2FtcGxlcywgJk5DUyk7CisgICAgICBOTVMgPSBOQ1MgLyBudW1fc2FtcGxlczsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiB0aGlzIHNob3VsZG4ndCBoYXBwZW4gKi8KKyAgICAgIGdfd2FybmluZyAoIm5vIG1lYW4gc3F1YXJlIGZ1bmN0aW9uIGZvciBmb3JtYXQiKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICBmaWx0ZXItPnNpbGVudF9wcmV2ID0gZmlsdGVyLT5zaWxlbnQ7CisKKyAgZHVyYXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGluX3NpemUgLyBicGYsIEdTVF9TRUNPTkQsIHJhdGUpOworCisgIFJNUyA9IHNxcnQgKE5NUyk7CisgIC8qIGlmIFJNUyBiZWxvdyB0aHJlc2hvbGQsIGFkZCBidWZmZXIgbGVuZ3RoIHRvIHNpbGVudCBydW4gbGVuZ3RoIGNvdW50CisgICAqIGlmIG5vdCwgcmVzZXQKKyAgICovCisgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICJidWZmZXIgc3RhdHM6IE5NUyAlZiwgUk1TICVmLCBhdWRpbyBsZW5ndGggJWYiLCBOTVMsCisgICAgICBSTVMsIGdzdF9ndWludDY0X3RvX2dkb3VibGUgKGR1cmF0aW9uKSk7CisKKyAgaWYgKFJNUyA8IGZpbHRlci0+dGhyZXNob2xkX2xldmVsKQorICAgIGZpbHRlci0+c2lsZW50X3J1bl9sZW5ndGggKz0gZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAoZHVyYXRpb24pOworICBlbHNlIHsKKyAgICBmaWx0ZXItPnNpbGVudF9ydW5fbGVuZ3RoID0gMCAqIEdTVF9TRUNPTkQ7CisgICAgZmlsdGVyLT5zaWxlbnQgPSBGQUxTRTsKKyAgfQorCisgIGlmIChmaWx0ZXItPnNpbGVudF9ydW5fbGVuZ3RoID4gZmlsdGVyLT50aHJlc2hvbGRfbGVuZ3RoKQorICAgIC8qIGl0IGhhcyBiZWVuIHNpbGVudCBsb25nIGVub3VnaCwgZmxhZyBpdCAqLworICAgIGZpbHRlci0+c2lsZW50ID0gVFJVRTsKKworICAvKiBoYXMgdGhlIHNpbGVudCBzdGF0dXMgY2hhbmdlZCA/IGlmIHNvLCBzZW5kIHJpZ2h0IHNpZ25hbAorICAgKiBhbmQsIGlmIGZyb20gc2lsZW50IC0+IG5vdCBzaWxlbnQsIGZsdXNoIHByZV9yZWNvcmQgYnVmZmVyCisgICAqLworICBpZiAoZmlsdGVyLT5zaWxlbnQgIT0gZmlsdGVyLT5zaWxlbnRfcHJldikgeworICAgIGlmIChmaWx0ZXItPnNpbGVudCkgeworICAgICAgR3N0TWVzc2FnZSAqbSA9CisgICAgICAgICAgZ3N0X2N1dHRlcl9tZXNzYWdlX25ldyAoZmlsdGVyLCBGQUxTRSwgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAic2lnbmFsaW5nIENVVF9TVE9QIik7CisgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UIChmaWx0ZXIpLCBtKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2ludCBjb3VudCA9IDA7CisgICAgICBHc3RNZXNzYWdlICptID0KKyAgICAgICAgICBnc3RfY3V0dGVyX21lc3NhZ2VfbmV3IChmaWx0ZXIsIFRSVUUsIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAic2lnbmFsaW5nIENVVF9TVEFSVCIpOworICAgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVCAoZmlsdGVyKSwgbSk7CisgICAgICAvKiBmaXJzdCBvZiBhbGwsIGZsdXNoIGN1cnJlbnQgYnVmZmVyICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJmbHVzaGluZyBidWZmZXIgb2YgbGVuZ3RoICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChmaWx0ZXItPnByZV9ydW5fbGVuZ3RoKSk7CisKKyAgICAgIHdoaWxlIChmaWx0ZXItPnByZV9idWZmZXIpIHsKKyAgICAgICAgcHJlYnVmID0gKGdfbGlzdF9maXJzdCAoZmlsdGVyLT5wcmVfYnVmZmVyKSktPmRhdGE7CisgICAgICAgIGZpbHRlci0+cHJlX2J1ZmZlciA9IGdfbGlzdF9yZW1vdmUgKGZpbHRlci0+cHJlX2J1ZmZlciwgcHJlYnVmKTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoIChmaWx0ZXItPnNyY3BhZCwgcHJlYnVmKTsKKyAgICAgICAgKytjb3VudDsKKyAgICAgIH0KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgImZsdXNoZWQgJWQgYnVmZmVycyIsIGNvdW50KTsKKyAgICAgIGZpbHRlci0+cHJlX3J1bl9sZW5ndGggPSAwICogR1NUX1NFQ09ORDsKKyAgICB9CisgIH0KKyAgLyogbm93IGNoZWNrIGlmIHdlIGhhdmUgdG8gc2VuZCB0aGUgbmV3IGJ1ZmZlciB0byB0aGUgaW50ZXJuYWwgYnVmZmVyIGNhY2hlCisgICAqIG9yIHRvIHRoZSBzcmNwYWQgKi8KKyAgaWYgKGZpbHRlci0+c2lsZW50KSB7CisgICAgZmlsdGVyLT5wcmVfYnVmZmVyID0gZ19saXN0X2FwcGVuZCAoZmlsdGVyLT5wcmVfYnVmZmVyLCBidWYpOworICAgIGZpbHRlci0+cHJlX3J1bl9sZW5ndGggKz0gZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAoZHVyYXRpb24pOworCisgICAgd2hpbGUgKGZpbHRlci0+cHJlX3J1bl9sZW5ndGggPiBmaWx0ZXItPnByZV9sZW5ndGgpIHsKKyAgICAgIEdzdENsb2NrVGltZSBwZHVyYXRpb247CisgICAgICBnc2l6ZSBwc2l6ZTsKKworICAgICAgcHJlYnVmID0gKGdfbGlzdF9maXJzdCAoZmlsdGVyLT5wcmVfYnVmZmVyKSktPmRhdGE7CisgICAgICBnX2Fzc2VydCAoR1NUX0lTX0JVRkZFUiAocHJlYnVmKSk7CisKKyAgICAgIHBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAocHJlYnVmKTsKKyAgICAgIHBkdXJhdGlvbiA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAocHNpemUgLyBicGYsIEdTVF9TRUNPTkQsIHJhdGUpOworCisgICAgICBmaWx0ZXItPnByZV9idWZmZXIgPSBnX2xpc3RfcmVtb3ZlIChmaWx0ZXItPnByZV9idWZmZXIsIHByZWJ1Zik7CisgICAgICBmaWx0ZXItPnByZV9ydW5fbGVuZ3RoIC09IGdzdF9ndWludDY0X3RvX2dkb3VibGUgKHBkdXJhdGlvbik7CisKKyAgICAgIC8qIG9ubHkgcGFzcyBidWZmZXJzIGlmIHdlIGRvbid0IGxlYWsgKi8KKyAgICAgIGlmICghZmlsdGVyLT5sZWFreSkKKyAgICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoIChmaWx0ZXItPnNyY3BhZCwgcHJlYnVmKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocHJlYnVmKTsKKyAgICB9CisgIH0gZWxzZQorICAgIHJldCA9IGdzdF9wYWRfcHVzaCAoZmlsdGVyLT5zcmNwYWQsIGJ1Zik7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK25vdF9uZWdvdGlhdGVkOgorICB7CisgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfY3V0dGVyX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RDdXR0ZXIgKmZpbHRlcjsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfQ1VUVEVSIChvYmplY3QpKTsKKyAgZmlsdGVyID0gR1NUX0NVVFRFUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSRVNIT0xEOgorICAgICAgZmlsdGVyLT50aHJlc2hvbGRfbGV2ZWwgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVRyAoIkRFQlVHOiBzZXQgdGhyZXNob2xkIGxldmVsIHRvICVmIiwgZmlsdGVyLT50aHJlc2hvbGRfbGV2ZWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUkVTSE9MRF9EQjoKKyAgICAgIC8qIHNldCB0aGUgbGV2ZWwgZ2l2ZW4gaW4gZEIKKyAgICAgICAqIHZhbHVlIGluIGRCID0gMjAgKiBsb2cgKHZhbHVlKQorICAgICAgICogdmFsdWVzIGluIGRCIDwgMCByZXN1bHQgaW4gdmFsdWVzIGJldHdlZW4gMCBhbmQgMQorICAgICAgICovCisgICAgICBmaWx0ZXItPnRocmVzaG9sZF9sZXZlbCA9IHBvdyAoMTAsIGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpIC8gMjApOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAic2V0IHRocmVzaG9sZCBsZXZlbCB0byAlZiIsCisgICAgICAgICAgZmlsdGVyLT50aHJlc2hvbGRfbGV2ZWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JVTl9MRU5HVEg6CisgICAgICAvKiBzZXQgdGhlIG1pbmltdW0gbGVuZ3RoIG9mIHRoZSBzaWxlbnQgcnVuIHJlcXVpcmVkICovCisgICAgICBmaWx0ZXItPnRocmVzaG9sZF9sZW5ndGggPQorICAgICAgICAgIGdzdF9ndWludDY0X3RvX2dkb3VibGUgKGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUkVfTEVOR1RIOgorICAgICAgLyogc2V0IHRoZSBsZW5ndGggb2YgdGhlIHByZS1yZWNvcmQgYmxvY2sgKi8KKyAgICAgIGZpbHRlci0+cHJlX2xlbmd0aCA9IGdzdF9ndWludDY0X3RvX2dkb3VibGUgKGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9MRUFLWToKKyAgICAgIC8qIHNldCBpZiB0aGUgcHJlLXJlY29yZCBidWZmZXIgaXMgbGVha3kgb3Igbm90ICovCisgICAgICBmaWx0ZXItPmxlYWt5ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2N1dHRlcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0Q3V0dGVyICpmaWx0ZXI7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX0NVVFRFUiAob2JqZWN0KSk7CisgIGZpbHRlciA9IEdTVF9DVVRURVIgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1JVTl9MRU5HVEg6CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBmaWx0ZXItPnRocmVzaG9sZF9sZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUkVTSE9MRDoKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIGZpbHRlci0+dGhyZXNob2xkX2xldmVsKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJFU0hPTERfREI6CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCAyMCAqIGxvZyAoZmlsdGVyLT50aHJlc2hvbGRfbGV2ZWwpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUkVfTEVOR1RIOgorICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgZmlsdGVyLT5wcmVfbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9MRUFLWToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBmaWx0ZXItPmxlYWt5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJjdXR0ZXIiLCBHU1RfUkFOS19OT05FLCBHU1RfVFlQRV9DVVRURVIpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGN1dHRlciwKKyAgICAiQXVkaW8gQ3V0dGVyIHRvIHNwbGl0IGF1ZGlvIGludG8gbm9uLXNpbGVudCBiaXRzIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pOwpkaWZmIC0tZ2l0IGEvZ3N0L2N1dHRlci9nc3RjdXR0ZXIuaCBiL2dzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg3NWY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9jdXR0ZXIvZ3N0Y3V0dGVyLmgKQEAgLTAsMCArMSw4MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9DVVRURVJfSF9fCisjZGVmaW5lIF9fR1NUX0NVVFRFUl9IX18KKworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorLyogI2luY2x1ZGUgPGdzdC9tZXRhL2F1ZGlvcmF3Lmg+ICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKyNkZWZpbmUgR1NUX1RZUEVfQ1VUVEVSIFwKKyAgKGdzdF9jdXR0ZXJfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0NVVFRFUihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0NVVFRFUixHc3RDdXR0ZXIpKQorI2RlZmluZSBHU1RfQ1VUVEVSX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0NVVFRFUixHc3RDdXR0ZXJDbGFzcykpCisjZGVmaW5lIEdTVF9JU19DVVRURVIob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9DVVRURVIpKQorI2RlZmluZSBHU1RfSVNfQ1VUVEVSX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0NVVFRFUikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RDdXR0ZXIgR3N0Q3V0dGVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEN1dHRlckNsYXNzIEdzdEN1dHRlckNsYXNzOworCitzdHJ1Y3QgX0dzdEN1dHRlcgoreworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgR3N0UGFkICpzaW5rcGFkLCAqc3JjcGFkOworCisgIGRvdWJsZSB0aHJlc2hvbGRfbGV2ZWw7ICAgICAgIC8qIGxldmVsIGJlbG93IHdoaWNoIHRvIGN1dCAqLworICBkb3VibGUgdGhyZXNob2xkX2xlbmd0aDsgICAgICAvKiBob3cgbG9uZyBzaWduYWwgaGFzIHRvIHJlbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiZWxvdyB0aGlzIGxldmVsIGJlZm9yZSBjdXR0aW5nICovCisgIGRvdWJsZSBzaWxlbnRfcnVuX2xlbmd0aDsgICAgIC8qIGhvdyBsb25nIGhhcyBpdCBiZWVuIGJlbG93IHRocmVzaG9sZCA/ICovCisgIGdib29sZWFuIHNpbGVudDsKKyAgZ2Jvb2xlYW4gc2lsZW50X3ByZXY7CisKKyAgZG91YmxlIHByZV9sZW5ndGg7ICAgICAgICAgICAgLyogaG93IGxvbmcgY2FuIHRoZSBwcmUtcmVjb3JkIGJ1ZmZlciBiZSA/ICovCisgIGRvdWJsZSBwcmVfcnVuX2xlbmd0aDsgICAgICAgIC8qIGhvdyBsb25nIGlzIGl0IGN1cnJlbnRseSA/ICovCisgIEdMaXN0ICpwcmVfYnVmZmVyOyAgICAgICAgICAgIC8qIGxpc3Qgb2YgR3N0QnVmZmVycyBpbiBwcmUtcmVjb3JkIGJ1ZmZlciAqLworICBnYm9vbGVhbiBsZWFreTsgICAgICAgICAgICAgICAvKiBkbyB3ZSBsZWFrIGFuIG92ZXJmbG93aW5nIHByZWJ1ZmZlciA/ICovCisKKyAgR3N0QXVkaW9JbmZvIGluZm87Cit9OworCitzdHJ1Y3QgX0dzdEN1dHRlckNsYXNzCit7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7CisgIHZvaWQgKCpjdXRfc3RhcnQpIChHc3RDdXR0ZXIqIGZpbHRlcik7CisgIHZvaWQgKCpjdXRfc3RvcCkgKEdzdEN1dHRlciogZmlsdGVyKTsKK307CisKK0dUeXBlIGdzdF9jdXR0ZXJfZ2V0X3R5cGUgKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKyNlbmRpZiAvKiBfX0dTVF9TVEVSRU9fSF9fICovCmRpZmYgLS1naXQgYS9nc3QvY3V0dGVyL21lc29uLmJ1aWxkIGIvZ3N0L2N1dHRlci9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjU4MGJkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2N1dHRlci9tZXNvbi5idWlsZApAQCAtMCwwICsxLDcgQEAKK2dzdGN1dHRlciA9IGxpYnJhcnkoJ2dzdGN1dHRlcicsICdnc3RjdXR0ZXIuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0YmFzZV9kZXAsIGdzdGF1ZGlvX2RlcCwgbGlibV0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9NYWtlZmlsZS5hbSBiL2dzdC9kZWJ1Z3V0aWxzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZTljOGMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVidWd1dGlscy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM5IEBACisKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGRlYnVnLmxhIGxpYmdzdG5hdmlnYXRpb250ZXN0LmxhIAorCitub2luc3RfSEVBREVSUyA9IFwKKwljcHVyZXBvcnQuaCBcCisJZ3N0Y2Fwc2RlYnVnLmggXAorCWdzdGNhcHNzZXR0ZXIuaCBcCisJZ3N0bmF2aWdhdGlvbnRlc3QuaCBcCisJZ3N0bmF2c2Vlay5oIFwKKwlnc3RwdXNoZmlsZXNyYy5oIFwKKwlnc3R0YWdpbmplY3QuaCBcCisJcHJvZ3Jlc3NyZXBvcnQuaCBcCisJdGVzdHMuaAorCitsaWJnc3RuYXZpZ2F0aW9udGVzdF9sYV9TT1VSQ0VTID0gZ3N0bmF2aWdhdGlvbnRlc3QuYworbGliZ3N0bmF2aWdhdGlvbnRlc3RfbGFfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgXAorCQkJCSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKQorbGliZ3N0bmF2aWdhdGlvbnRlc3RfbGFfTElCQUREID0gJChHU1RfTElCUykgJChHU1RfQkFTRV9MSUJTKSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dmlkZW8tQEdTVF9BUElfVkVSU0lPTkAgJChMSUJNKQorbGliZ3N0bmF2aWdhdGlvbnRlc3RfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitsaWJnc3RkZWJ1Z19sYV9TT1VSQ0VTID0gXAorCWdzdGRlYnVnLmMgXAorCWJyZWFrbXlkYXRhLmMgXAorCWdzdGNhcHNzZXR0ZXIuYyBcCisJZ3N0bmF2c2Vlay5jIFwKKwlnc3RwdXNoZmlsZXNyYy5jIFwKKwlnc3R0YWdpbmplY3QuYyBcCisJcm5kYnVmZmVyc2l6ZS5jIFwKKwlwcm9ncmVzc3JlcG9ydC5jIFwKKwl0ZXN0cy5jIFwKKwljcHVyZXBvcnQuYyBcCisJdGVzdHBsdWdpbi5jCisKKyMJZ3N0Y2Fwc2RlYnVnLmMKKworbGliZ3N0ZGVidWdfbGFfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykKK2xpYmdzdGRlYnVnX2xhX0xJQkFERCA9ICQoR1NUX0xJQlMpICQoR1NUX0JBU0VfTElCUykKK2xpYmdzdGRlYnVnX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKZGlmZiAtLWdpdCBhL2dzdC9kZWJ1Z3V0aWxzL2JyZWFrbXlkYXRhLmMgYi9nc3QvZGVidWd1dGlscy9icmVha215ZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MjJkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVidWd1dGlscy9icmVha215ZGF0YS5jCkBAIC0wLDAgKzEsMjkzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBCZW5qYW1pbiBPdHRlIDxvdHRlQGdub21lLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYnJlYWtteWRhdGEKKyAqCisgKiBUaGlzIGVsZW1lbnQgbW9kaWZpZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgaXQgaXMgcGFzc2VkIHJhbmRvbWx5CisgKiBhY2NvcmRpbmcgdG8gdGhlIHBhcmFtZXRlcnMgc2V0LgorICogSXQgb3RoZXJ3aXNlIGFjdHMgYXMgYW4gaWRlbnRpdHkuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfYnJlYWtfbXlfZGF0YV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfYnJlYWtfbXlfZGF0YV9kZWJ1ZworCisjZGVmaW5lIEdTVF9UWVBFX0JSRUFLX01ZX0RBVEEgXAorICAoZ3N0X2JyZWFrX215X2RhdGFfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0JSRUFLX01ZX0RBVEEob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9CUkVBS19NWV9EQVRBLEdzdEJyZWFrTXlEYXRhKSkKKyNkZWZpbmUgR1NUX0JSRUFLX01ZX0RBVEFfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfQlJFQUtfTVlfREFUQSxHc3RCcmVha015RGF0YUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0JSRUFLX01ZX0RBVEEob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9CUkVBS19NWV9EQVRBKSkKKyNkZWZpbmUgR1NUX0lTX0JSRUFLX01ZX0RBVEFfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfQlJFQUtfTVlfREFUQSkpCisKK0dUeXBlIGdzdF9icmVha19teV9kYXRhX2dldF90eXBlICh2b2lkKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfU0VFRCwKKyAgUFJPUF9TRVRfVE8sCisgIFBST1BfU0tJUCwKKyAgUFJPUF9QUk9CQUJJTElUWQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEJyZWFrTXlEYXRhIEdzdEJyZWFrTXlEYXRhOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEJyZWFrTXlEYXRhQ2xhc3MgR3N0QnJlYWtNeURhdGFDbGFzczsKKworc3RydWN0IF9Hc3RCcmVha015RGF0YQoreworICBHc3RCYXNlVHJhbnNmb3JtIGJhc2V0cmFuc2Zvcm07CisKKyAgR1JhbmQgKnJhbmQ7CisgIGd1aW50IHNraXBwZWQ7CisKKyAgZ3VpbnQzMiBzZWVkOworICBnaW50IHNldDsKKyAgZ3VpbnQgc2tpcDsKKyAgZ2RvdWJsZSBwcm9iYWJpbGl0eTsKK307CisKK3N0cnVjdCBfR3N0QnJlYWtNeURhdGFDbGFzcworeworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworc3RhdGljIHZvaWQgZ3N0X2JyZWFrX215X2RhdGFfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2JyZWFrX215X2RhdGFfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfYnJlYWtfbXlfZGF0YV90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RCdWZmZXIgKiBidWYpOworc3RhdGljIGdib29sZWFuIGdzdF9icmVha19teV9kYXRhX3N0b3AgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2JyZWFrX215X2RhdGFfc3RhcnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucyk7CisKK0dzdFN0YXRpY1BhZFRlbXBsYXRlIGJtZF9zcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK0dzdFN0YXRpY1BhZFRlbXBsYXRlIGJtZF9zaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKKyNkZWZpbmUgZ3N0X2JyZWFrX215X2RhdGFfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0QnJlYWtNeURhdGEsIGdzdF9icmVha19teV9kYXRhLCBHU1RfVFlQRV9CQVNFX1RSQU5TRk9STSk7CisKKworc3RhdGljIHZvaWQKK2dzdF9icmVha19teV9kYXRhX2NsYXNzX2luaXQgKEdzdEJyZWFrTXlEYXRhQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzICpnc3RiYXNldHJhbnNfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzID0gR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9icmVha19teV9kYXRhX2RlYnVnLCAiYnJlYWtteWRhdGEiLCAwLAorICAgICAgImRlYnVnZ2luZyBjYXRlZ29yeSBmb3IgYnJlYWtteWRhdGEgZWxlbWVudCIpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9icmVha19teV9kYXRhX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2JyZWFrX215X2RhdGFfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU0VFRCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgic2VlZCIsICJzZWVkIiwKKyAgICAgICAgICAic2VlZCBmb3IgcmFuZG9tbmVzcyAoaW5pdGlhbGl6ZWQgd2hlbiBnb2luZyBmcm9tIFJFQURZIHRvIFBBVVNFRCkiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDMyLCAwLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU0VUX1RPLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInNldC10byIsICJzZXQtdG8iLAorICAgICAgICAgICJzZXQgY2hhbmdlZCBieXRlcyB0byB0aGlzIHZhbHVlICgtMSBtZWFucyByYW5kb20gdmFsdWUiLAorICAgICAgICAgIC0xLCBHX01BWFVJTlQ4LCAtMSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NLSVAsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInNraXAiLCAic2tpcCIsCisgICAgICAgICAgImFtb3VudCBvZiBieXRlcyBza2lwcGVkIGF0IHRoZSBiZWdpbm5pbmcgb2Ygc3RyZWFtIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIDAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QUk9CQUJJTElUWSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJwcm9iYWJpbGl0eSIsICJwcm9iYWJpbGl0eSIsCisgICAgICAgICAgInByb2JhYmlsaXR5IGZvciBlYWNoIGJ5dGUgaW4gdGhlIGJ1ZmZlciB0byBiZSBjaGFuZ2VkIiwgMC4wLCAxLjAsCisgICAgICAgICAgMC4wLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmJtZF9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmYm1kX3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkJyZWFrIG15IGRhdGEiLAorICAgICAgIlRlc3RpbmciLAorICAgICAgInJhbmRvbWx5IGNoYW5nZSBkYXRhIGluIHRoZSBzdHJlYW0iLCAiQmVuamFtaW4gT3R0ZSA8b3R0ZUBnbm9tZT4iKTsKKworICBnc3RiYXNldHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2JyZWFrX215X2RhdGFfdHJhbnNmb3JtX2lwKTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYnJlYWtfbXlfZGF0YV9zdGFydCk7CisgIGdzdGJhc2V0cmFuc19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYnJlYWtfbXlfZGF0YV9zdG9wKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9icmVha19teV9kYXRhX2luaXQgKEdzdEJyZWFrTXlEYXRhICogYm1kKQoreworICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X2luX3BsYWNlIChHU1RfQkFTRV9UUkFOU0ZPUk0gKGJtZCksIFRSVUUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2JyZWFrX215X2RhdGFfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEJyZWFrTXlEYXRhICpibWQgPSBHU1RfQlJFQUtfTVlfREFUQSAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGJtZCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1NFRUQ6CisgICAgICBibWQtPnNlZWQgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0VUX1RPOgorICAgICAgYm1kLT5zZXQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TS0lQOgorICAgICAgYm1kLT5za2lwID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST0JBQklMSVRZOgorICAgICAgYm1kLT5wcm9iYWJpbGl0eSA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChibWQpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2JyZWFrX215X2RhdGFfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEJyZWFrTXlEYXRhICpibWQgPSBHU1RfQlJFQUtfTVlfREFUQSAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGJtZCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1NFRUQ6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgYm1kLT5zZWVkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TRVRfVE86CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBibWQtPnNldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0tJUDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBibWQtPnNraXApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST0JBQklMSVRZOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgYm1kLT5wcm9iYWJpbGl0eSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGJtZCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYnJlYWtfbXlfZGF0YV90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RCcmVha015RGF0YSAqYm1kID0gR1NUX0JSRUFLX01ZX0RBVEEgKHRyYW5zKTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdzaXplIGk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGdzdF9idWZmZXJfaXNfd3JpdGFibGUgKGJ1ZiksIEdTVF9GTE9XX0VSUk9SKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGJtZCk7CisKKyAgaWYgKGJtZC0+c2tpcHBlZCA8IGJtZC0+c2tpcCkgeworICAgIGkgPSBibWQtPnNraXAgLSBibWQtPnNraXBwZWQ7CisgIH0gZWxzZSB7CisgICAgaSA9IDA7CisgIH0KKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQURXUklURSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGJtZCwKKyAgICAgICJnb3QgYnVmZmVyICVwIChzaXplICUiIEdfR1NJWkVfRk9STUFUICIsIHRpbWVzdGFtcCAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAiLCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCAiIiwgYnVmLCBtYXAuc2l6ZSwKKyAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpLCBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSk7CisKKyAgZm9yICg7IGkgPCBtYXAuc2l6ZTsgaSsrKSB7CisgICAgaWYgKGdfcmFuZF9kb3VibGVfcmFuZ2UgKGJtZC0+cmFuZCwgMCwgMS4wKSA8PSBibWQtPnByb2JhYmlsaXR5KSB7CisgICAgICBndWludDggbmV3OworCisgICAgICBpZiAoYm1kLT5zZXQgPCAwKSB7CisgICAgICAgIG5ldyA9IGdfcmFuZF9pbnRfcmFuZ2UgKGJtZC0+cmFuZCwgMCwgMjU2KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5ldyA9IGJtZC0+c2V0OworICAgICAgfQorICAgICAgR1NUX0lORk9fT0JKRUNUIChibWQsCisgICAgICAgICAgImNoYW5naW5nIGJ5dGUgJSIgR19HU0laRV9GT1JNQVQgIiBmcm9tIDB4JTAyWCB0byAweCUwMlgiLCBpLAorICAgICAgICAgIChndWludCkgR1NUX1JFQURfVUlOVDggKG1hcC5kYXRhICsgaSksIChndWludCkgKChndWludDgpIG5ldykpOworICAgICAgbWFwLmRhdGFbaV0gPSBuZXc7CisgICAgfQorICB9CisgIC8qIGRvbid0IG92ZXJmbG93ICovCisgIGJtZC0+c2tpcHBlZCArPSBNSU4gKEdfTUFYVUlOVCAtIGJtZC0+c2tpcHBlZCwgbWFwLnNpemUpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGJtZCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9icmVha19teV9kYXRhX3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpCit7CisgIEdzdEJyZWFrTXlEYXRhICpibWQgPSBHU1RfQlJFQUtfTVlfREFUQSAodHJhbnMpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoYm1kKTsKKyAgYm1kLT5yYW5kID0gZ19yYW5kX25ld193aXRoX3NlZWQgKGJtZC0+c2VlZCk7CisgIGJtZC0+c2tpcHBlZCA9IDA7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChibWQpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9icmVha19teV9kYXRhX3N0b3AgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucykKK3sKKyAgR3N0QnJlYWtNeURhdGEgKmJtZCA9IEdTVF9CUkVBS19NWV9EQVRBICh0cmFucyk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChibWQpOworICBnX3JhbmRfZnJlZSAoYm1kLT5yYW5kKTsKKyAgYm1kLT5yYW5kID0gTlVMTDsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGJtZCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9jcHVyZXBvcnQuYyBiL2dzdC9kZWJ1Z3V0aWxzL2NwdXJlcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MWMzOGUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVidWd1dGlscy9jcHVyZXBvcnQuYwpAQCAtMCwwICsxLDE0OSBAQAorLyogR1N0cmVhbWVyIENwdSBSZXBvcnQgRWxlbWVudAorICogQ29weXJpZ2h0IChDKSA8MjAxMD4gWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXMgbWVyYWxpIG9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImNwdXJlcG9ydC5oIgorCisKK2VudW0KK3sKKyAgUFJPUF8wLAorfTsKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgY3B1X3JlcG9ydF9zcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK0dzdFN0YXRpY1BhZFRlbXBsYXRlIGNwdV9yZXBvcnRfc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfY3B1X3JlcG9ydF90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RCdWZmZXIgKiBidWYpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2NwdV9yZXBvcnRfc3RhcnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2NwdV9yZXBvcnRfc3RvcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKTsKKworI2RlZmluZSBnc3RfY3B1X3JlcG9ydF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RDcHVSZXBvcnQsIGdzdF9jcHVfcmVwb3J0LCBHU1RfVFlQRV9CQVNFX1RSQU5TRk9STSk7CisKK3N0YXRpYyB2b2lkCitnc3RfY3B1X3JlcG9ydF9maW5hbGl6ZSAoR09iamVjdCAqIG9iaikKK3sKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmopOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2NwdV9yZXBvcnRfY2xhc3NfaW5pdCAoR3N0Q3B1UmVwb3J0Q2xhc3MgKiBnX2NsYXNzKQoreworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKmdzdGJhc2V0cmFuc19jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChnX2NsYXNzKTsKKyAgZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChnX2NsYXNzKTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzID0gR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChnX2NsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9jcHVfcmVwb3J0X2ZpbmFsaXplOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmNwdV9yZXBvcnRfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmNwdV9yZXBvcnRfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiQ1BVIHJlcG9ydCIsCisgICAgICAiVGVzdGluZyIsCisgICAgICAiUG9zdCBjcHUgdXNhZ2UgaW5mb3JtYXRpb24gZXZlcnkgYnVmZmVyIiwKKyAgICAgICJaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4iKTsKKworICBnc3RiYXNldHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2NwdV9yZXBvcnRfdHJhbnNmb3JtX2lwKTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfY3B1X3JlcG9ydF9zdGFydCk7CisgIGdzdGJhc2V0cmFuc19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfY3B1X3JlcG9ydF9zdG9wKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9jcHVfcmVwb3J0X2luaXQgKEdzdENwdVJlcG9ydCAqIHJlcG9ydCkKK3sKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAoR1NUX0JBU0VfVFJBTlNGT1JNIChyZXBvcnQpLCBUUlVFKTsKKworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2NwdV9yZXBvcnRfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Q3B1UmVwb3J0ICpmaWx0ZXI7CisgIEdUaW1lVmFsIGN1cl90aW1lOworICBjbG9ja190IGN1cl9jcHVfdGltZTsKKyAgR3N0TWVzc2FnZSAqbXNnOworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIGdpbnQ2NCB0aW1lX3Rha2VuOworCisKKyAgZ19nZXRfY3VycmVudF90aW1lICgmY3VyX3RpbWUpOworICBjdXJfY3B1X3RpbWUgPSBjbG9jayAoKTsKKworICBmaWx0ZXIgPSBHU1RfQ1BVX1JFUE9SVCAodHJhbnMpOworCisKKyAgdGltZV90YWtlbiA9IEdTVF9USU1FVkFMX1RPX1RJTUUgKGN1cl90aW1lKSAtCisgICAgICBHU1RfVElNRVZBTF9UT19USU1FIChmaWx0ZXItPmxhc3RfdGltZSk7CisKKyAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiY3B1LXJlcG9ydCIsICJjcHUtdGltZSIsIEdfVFlQRV9ET1VCTEUsCisgICAgICAoKGdkb3VibGUpIChjdXJfY3B1X3RpbWUgLSBmaWx0ZXItPmxhc3RfY3B1X3RpbWUpKSwKKyAgICAgICJhY3R1YWwtdGltZSIsIEdfVFlQRV9JTlQ2NCwgdGltZV90YWtlbiwgImJ1ZmZlci10aW1lIiwgR19UWVBFX0lOVDY0LAorICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZiksIE5VTEwpOworICBtc2cgPSBnc3RfbWVzc2FnZV9uZXdfZWxlbWVudCAoR1NUX09CSkVDVF9DQVNUIChmaWx0ZXIpLCBzKTsKKyAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChmaWx0ZXIpLCBtc2cpOworICBmaWx0ZXItPmxhc3RfdGltZSA9IGN1cl90aW1lOworICBmaWx0ZXItPmxhc3RfY3B1X3RpbWUgPSBjdXJfY3B1X3RpbWU7CisKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2NwdV9yZXBvcnRfc3RhcnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucykKK3sKKyAgR3N0Q3B1UmVwb3J0ICpmaWx0ZXI7CisKKyAgZmlsdGVyID0gR1NUX0NQVV9SRVBPUlQgKHRyYW5zKTsKKworICBnX2dldF9jdXJyZW50X3RpbWUgKCZmaWx0ZXItPmxhc3RfdGltZSk7CisgIGZpbHRlci0+c3RhcnRfdGltZSA9IGZpbHRlci0+bGFzdF90aW1lOworICBmaWx0ZXItPmxhc3RfY3B1X3RpbWUgPSBjbG9jayAoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2NwdV9yZXBvcnRfc3RvcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICAvKiBhbnl0aGluZyB3ZSBzaG91bGQgYmUgZG9pbmcgaGVyZT8gKi8KKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9jcHVyZXBvcnQuaCBiL2dzdC9kZWJ1Z3V0aWxzL2NwdXJlcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDU1NTkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVidWd1dGlscy9jcHVyZXBvcnQuaApAQCAtMCwwICsxLDU4IEBACisvKiBHU3RyZWFtZXIgQ1BVIFJlcG9ydCBFbGVtZW50CisgKiBDb3B5cmlnaHQgKEMpIDwyMDEwPiBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBtZXJhbGkgb3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfQ1BVX1JFUE9SVF9IX18KKyNkZWZpbmUgX19HU1RfQ1BVX1JFUE9SVF9IX18KKworI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9DUFVfUkVQT1JUIFwKKyAgKGdzdF9jcHVfcmVwb3J0X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9DUFVfUkVQT1JUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQ1BVX1JFUE9SVCxHc3RDcHVSZXBvcnQpKQorI2RlZmluZSBHU1RfQ1BVX1JFUE9SVF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9DUFVfUkVQT1JULEdzdENwdVJlcG9ydENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0NQVV9SRVBPUlQob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9DUFVfUkVQT1JUKSkKKyNkZWZpbmUgR1NUX0lTX0NQVV9SRVBPUlRfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfQ1BVX1JFUE9SVCkpCit0eXBlZGVmIHN0cnVjdCBfR3N0Q3B1UmVwb3J0IEdzdENwdVJlcG9ydDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RDcHVSZXBvcnRDbGFzcyBHc3RDcHVSZXBvcnRDbGFzczsKKworc3RydWN0IF9Hc3RDcHVSZXBvcnQKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybSBiYXNldHJhbnNmb3JtOworCisgIEdUaW1lVmFsIHN0YXJ0X3RpbWU7CisgIEdUaW1lVmFsIGxhc3RfdGltZTsKKyAgY2xvY2tfdCBsYXN0X2NwdV90aW1lOworfTsKKworc3RydWN0IF9Hc3RDcHVSZXBvcnRDbGFzcworeworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2NwdV9yZXBvcnRfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX0NQVV9SRVBPUlRfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3RjYXBzZGVidWcuYyBiL2dzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNkZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYmM1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVidWd1dGlscy9nc3RjYXBzZGVidWcuYwpAQCAtMCwwICsxLDI1OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgImdzdGNhcHNkZWJ1Zy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfY2Fwc19kZWJ1Z19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfY2Fwc19kZWJ1Z19kZWJ1ZworCisvKiBwcm90b3R5cGVzICovCisKKworc3RhdGljIHZvaWQgZ3N0X2NhcHNfZGVidWdfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3RfY2Fwc19kZWJ1Z19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9jYXBzX2RlYnVnX3NpbmtfY2hhaW4gKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIEdzdENhcHMgKmdzdF9jYXBzX2RlYnVnX2dldGNhcHMgKEdzdFBhZCAqIHBhZCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2NhcHNfZGVidWdfYWNjZXB0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfY2Fwc19kZWJ1Z19idWZmZXJhbGxvYyAoR3N0UGFkICogcGFkLAorICAgIGd1aW50NjQgb2Zmc2V0LCBndWludCBzaXplLCBHc3RDYXBzICogY2FwcywgR3N0QnVmZmVyICoqIGJ1Zik7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2NhcHNfZGVidWdfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKKy8qIHBhZCB0ZW1wbGF0ZXMgKi8KKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9jYXBzX2RlYnVnX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfY2Fwc19kZWJ1Z19zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCisvKiBjbGFzcyBpbml0aWFsaXphdGlvbiAqLworCisjZGVmaW5lIGdzdF9jYXBzX2RlYnVnX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdENhcHNEZWJ1ZywgZ3N0X2NhcHNfZGVidWcsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZAorZ3N0X2NhcHNfZGVidWdfY2xhc3NfaW5pdCAoR3N0Q2Fwc0RlYnVnQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X2NhcHNfZGVidWdfZGlzcG9zZTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfY2Fwc19kZWJ1Z19maW5hbGl6ZTsKKyAgZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9jYXBzX2RlYnVnX2NoYW5nZV9zdGF0ZSk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9jYXBzX2RlYnVnX2RlYnVnLCAiY2Fwc2RlYnVnIiwgMCwKKyAgICAgICJkZWJ1ZyBjYXRlZ29yeSBmb3IgY2Fwc2RlYnVnIGVsZW1lbnQiKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfY2Fwc19kZWJ1Z19zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfY2Fwc19kZWJ1Z19zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiQ2FwcyBkZWJ1ZyIsCisgICAgICAiR2VuZXJpYyIsICJEZWJ1ZyBjYXBzIG5lZ290aWF0aW9uIiwgIkRhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2NhcHNfZGVidWdfaW5pdCAoR3N0Q2Fwc0RlYnVnICogY2Fwc2RlYnVnKQoreworCisgIGNhcHNkZWJ1Zy0+c3JjcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZ3N0X2NhcHNfZGVidWdfc3JjX3RlbXBsYXRlLCAic3JjIik7CisgIGdzdF9wYWRfc2V0X2dldGNhcHNfZnVuY3Rpb24gKGNhcHNkZWJ1Zy0+c3JjcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9jYXBzX2RlYnVnX2dldGNhcHMpKTsKKyAgZ3N0X3BhZF9zZXRfYWNjZXB0Y2Fwc19mdW5jdGlvbiAoY2Fwc2RlYnVnLT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2NhcHNfZGVidWdfYWNjZXB0Y2FwcykpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoY2Fwc2RlYnVnKSwgY2Fwc2RlYnVnLT5zcmNwYWQpOworCisgIGNhcHNkZWJ1Zy0+c2lua3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJmdzdF9jYXBzX2RlYnVnX3NpbmtfdGVtcGxhdGUsICJzaW5rIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChjYXBzZGVidWctPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2NhcHNfZGVidWdfc2lua19jaGFpbikpOworICBnc3RfcGFkX3NldF9idWZmZXJhbGxvY19mdW5jdGlvbiAoY2Fwc2RlYnVnLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9jYXBzX2RlYnVnX2J1ZmZlcmFsbG9jKSk7CisgIGdzdF9wYWRfc2V0X2dldGNhcHNfZnVuY3Rpb24gKGNhcHNkZWJ1Zy0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfY2Fwc19kZWJ1Z19nZXRjYXBzKSk7CisgIGdzdF9wYWRfc2V0X2FjY2VwdGNhcHNfZnVuY3Rpb24gKGNhcHNkZWJ1Zy0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfY2Fwc19kZWJ1Z19hY2NlcHRjYXBzKSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChjYXBzZGVidWcpLCBjYXBzZGVidWctPnNpbmtwYWQpOworCit9CisKK3ZvaWQKK2dzdF9jYXBzX2RlYnVnX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIC8qIGNsZWFuIHVwIGFzIHBvc3NpYmxlLiAgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyAqLworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCit2b2lkCitnc3RfY2Fwc19kZWJ1Z19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgLyogY2xlYW4gdXAgb2JqZWN0IGhlcmUgKi8KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9jYXBzX2RlYnVnX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfY2Fwc19kZWJ1Z19zaW5rX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdENhcHNEZWJ1ZyAqY2Fwc2RlYnVnOworCisgIGNhcHNkZWJ1ZyA9IEdTVF9DQVBTX0RFQlVHIChnc3RfcGFkX2dldF9wYXJlbnQgKHBhZCkpOworCisgIHJldCA9IGdzdF9wYWRfcHVzaCAoY2Fwc2RlYnVnLT5zcmNwYWQsIGJ1ZmZlcik7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoY2Fwc2RlYnVnKTsKKworICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFRISVNQQUQgKChwYWQgPT0gY2Fwc2RlYnVnLT5zcmNwYWQpID8gImRvd25zdHJlYW0iIDogInVwc3RyZWFtIikKKyNkZWZpbmUgT1RIRVJQQUQgKChwYWQgPT0gY2Fwc2RlYnVnLT5zcmNwYWQpID8gInVwc3RyZWFtIiA6ICJkb3duc3RyZWFtIikKKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2NhcHNfZGVidWdfZ2V0Y2FwcyAoR3N0UGFkICogcGFkKQoreworICBHc3RDYXBzICpjYXBzOworICBHc3RDYXBzRGVidWcgKmNhcHNkZWJ1ZzsKKyAgZ2NoYXIgKnM7CisgIEdzdFBhZCAqb3RoZXJwYWQ7CisKKyAgY2Fwc2RlYnVnID0gR1NUX0NBUFNfREVCVUcgKGdzdF9wYWRfZ2V0X3BhcmVudCAocGFkKSk7CisgIG90aGVycGFkID0KKyAgICAgIChwYWQgPT0gY2Fwc2RlYnVnLT5zcmNwYWQpID8gY2Fwc2RlYnVnLT5zaW5rcGFkIDogY2Fwc2RlYnVnLT5zcmNwYWQ7CisKKyAgR1NUX0lORk8gKCIlcyBjYWxsZWQgZ2V0Y2FwcyIsIFRISVNQQUQpOworCisgIGNhcHMgPSBnc3RfcGFkX3BlZXJfZ2V0X2NhcHMgKG90aGVycGFkKTsKKworICBzID0gZ3N0X2NhcHNfdG9fc3RyaW5nIChjYXBzKTsKKyAgR1NUX0lORk8gKCIlcyByZXR1cm5lZCAlcyIsIE9USEVSUEFELCBzKTsKKyAgZ19mcmVlIChzKTsKKworICBpZiAoY2FwcyA9PSBOVUxMKQorICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfYW55ICgpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGNhcHNkZWJ1Zyk7CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfY2Fwc19kZWJ1Z19hY2NlcHRjYXBzIChHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RDYXBzRGVidWcgKmNhcHNkZWJ1ZzsKKyAgZ2NoYXIgKnM7CisgIGdib29sZWFuIHJldDsKKyAgR3N0UGFkICpvdGhlcnBhZDsKKworICBjYXBzZGVidWcgPSBHU1RfQ0FQU19ERUJVRyAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKyAgb3RoZXJwYWQgPQorICAgICAgKHBhZCA9PSBjYXBzZGVidWctPnNyY3BhZCkgPyBjYXBzZGVidWctPnNpbmtwYWQgOiBjYXBzZGVidWctPnNyY3BhZDsKKworICBzID0gZ3N0X2NhcHNfdG9fc3RyaW5nIChjYXBzKTsKKyAgR1NUX0lORk8gKCIlcyBjYWxsZWQgYWNjZXB0Y2FwcyB3aXRoICVzIiwgVEhJU1BBRCwgcyk7CisgIGdfZnJlZSAocyk7CisKKyAgcmV0ID0gZ3N0X3BhZF9wZWVyX2FjY2VwdF9jYXBzIChvdGhlcnBhZCwgY2Fwcyk7CisKKyAgR1NUX0lORk8gKCIlcyByZXR1cm5lZCAlcyIsIE9USEVSUEFELCByZXQgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChjYXBzZGVidWcpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfY2Fwc19kZWJ1Z19idWZmZXJhbGxvYyAoR3N0UGFkICogcGFkLCBndWludDY0IG9mZnNldCwgZ3VpbnQgc2l6ZSwKKyAgICBHc3RDYXBzICogY2FwcywgR3N0QnVmZmVyICoqIGJ1ZikKK3sKKyAgR3N0Q2Fwc0RlYnVnICpjYXBzZGVidWc7CisgIGdjaGFyICpzOworICBnY2hhciAqdDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdFBhZCAqb3RoZXJwYWQ7CisgIGdib29sZWFuIG5ld2NhcHM7CisKKyAgY2Fwc2RlYnVnID0gR1NUX0NBUFNfREVCVUcgKGdzdF9wYWRfZ2V0X3BhcmVudCAocGFkKSk7CisgIG90aGVycGFkID0KKyAgICAgIChwYWQgPT0gY2Fwc2RlYnVnLT5zcmNwYWQpID8gY2Fwc2RlYnVnLT5zaW5rcGFkIDogY2Fwc2RlYnVnLT5zcmNwYWQ7CisKKyAgbmV3Y2FwcyA9IChjYXBzICE9IEdTVF9QQURfQ0FQUyAocGFkKSk7CisKKyAgaWYgKG5ld2NhcHMpIHsKKyAgICBzID0gZ3N0X2NhcHNfdG9fc3RyaW5nIChjYXBzKTsKKyAgICBHU1RfSU5GTyAoIiVzIGNhbGxlZCBidWZmZXJhbGxvYyB3aXRoIG5ldyBjYXBzLCBvZmZzZXQ9JSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAiIHNpemU9JWQgY2Fwcz0lcyIsIFRISVNQQUQsIG9mZnNldCwgc2l6ZSwgcyk7CisgICAgZ19mcmVlIChzKTsKKyAgfQorCisgIHJldCA9IGdzdF9wYWRfYWxsb2NfYnVmZmVyX2FuZF9zZXRfY2FwcyAob3RoZXJwYWQsIG9mZnNldCwgc2l6ZSwgY2FwcywgYnVmKTsKKworICBpZiAobmV3Y2FwcykgeworICAgIEdTVF9JTkZPICgiJXMgcmV0dXJuZWQgJXMiLCBPVEhFUlBBRCwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICB9CisgIGlmIChjYXBzICE9IEdTVF9CVUZGRVJfQ0FQUyAoKmJ1ZikpIHsKKyAgICBzID0gZ3N0X2NhcHNfdG9fc3RyaW5nIChjYXBzKTsKKyAgICB0ID0gZ3N0X2NhcHNfdG9fc3RyaW5nIChHU1RfQlVGRkVSX0NBUFMgKCpidWYpKTsKKyAgICBHU1RfSU5GTworICAgICAgICAoIiVzIHJldHVybmVkIGZyb20gYnVmZmVyYWxsb2Mgd2l0aCBkaWZmZXJlbnQgY2FwcywgcmVxdWVzdGVkPSVzIHJldHVybmVkPSVzIiwKKyAgICAgICAgT1RIRVJQQUQsIHMsIHQpOworICAgIGdfZnJlZSAocyk7CisgICAgZ19mcmVlICh0KTsKKyAgfQorCisgIGdzdF9vYmplY3RfdW5yZWYgKGNhcHNkZWJ1Zyk7CisKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2dzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNkZWJ1Zy5oIGIvZ3N0L2RlYnVndXRpbHMvZ3N0Y2Fwc2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwOTMwZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNkZWJ1Zy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDEwIEZJWE1FIDxmaXhtZUBleGFtcGxlLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9HU1RfQ0FQU19ERUJVR19IXworI2RlZmluZSBfR1NUX0NBUFNfREVCVUdfSF8KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9DQVBTX0RFQlVHICAgKGdzdF9jYXBzX2RlYnVnX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9DQVBTX0RFQlVHKG9iaikgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQ0FQU19ERUJVRyxHc3RDYXBzRGVidWcpKQorI2RlZmluZSBHU1RfQ0FQU19ERUJVR19DTEFTUyhrbGFzcykgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9DQVBTX0RFQlVHLEdzdENhcHNEZWJ1Z0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0NBUFNfREVCVUcob2JqKSAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9DQVBTX0RFQlVHKSkKKyNkZWZpbmUgR1NUX0lTX0NBUFNfREVCVUdfQ0xBU1Mob2JqKSAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0NBUFNfREVCVUcpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0Q2Fwc0RlYnVnIEdzdENhcHNEZWJ1ZzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RDYXBzRGVidWdDbGFzcyBHc3RDYXBzRGVidWdDbGFzczsKKworc3RydWN0IF9Hc3RDYXBzRGVidWcKK3sKKyAgR3N0RWxlbWVudCBiYXNlX2NhcHNkZWJ1ZzsKKworICBHc3RQYWQgKnNyY3BhZDsKKyAgR3N0UGFkICpzaW5rcGFkOworCit9OworCitzdHJ1Y3QgX0dzdENhcHNEZWJ1Z0NsYXNzCit7CisgIEdzdEVsZW1lbnRDbGFzcyBiYXNlX2NhcHNkZWJ1Z19jbGFzczsKK307CisKK0dUeXBlIGdzdF9jYXBzX2RlYnVnX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmMgYi9nc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzZGI3NgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNzZXR0ZXIuYwpAQCAtMCwwICsxLDMzMSBAQAorLyogR1N0cmVhbWVyIEVsZW1lbnQKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA5IE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzA3LCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtY2Fwc3NldHRlcgorICoKKyAqIFNldHMgb3IgbWVyZ2VzIGNhcHMgb24gYSBzdHJlYW0ncyBidWZmZXJzLiBUaGF0IGlzLCBhIGJ1ZmZlcidzIGNhcHMgYXJlCisgKiB1cGRhdGVkIHVzaW5nIChmaWVsZHMgb2YpICNHc3RDYXBzU2V0dGVyOmNhcHMuIE5vdGUgdGhhdCB0aGlzIG1heSBjb250YWluCisgKiBtdWx0aXBsZSBzdHJ1Y3R1cmVzICh0aG91Z2ggbm90IGxpa2VseSByZWNvbW1lbmRlZCksIGJ1dCBlYWNoIG9mIHRoZXNlIG11c3QKKyAqIGJlIGZpeGVkIChvciB3aWxsIG90aGVyd2lzZSBiZSByZWplY3RlZCkuCisgKiAKKyAqIElmICNHc3RDYXBzU2V0dGVyOmpvaW4gaXMgJVRSVUUsIHRoZW4gdGhlIGluY29taW5nIGNhcHMnIG1pbWUtdHlwZSBpcworICogY29tcGFyZWQgdG8gdGhlIG1pbWUtdHlwZShzKSBvZiBwcm92aWRlZCBjYXBzIGFuZCBvbmx5IG1hdGNoaW5nIHN0cnVjdHVyZShzKQorICogYXJlIGNvbnNpZGVyZWQgZm9yIHVwZGF0aW5nLgorICogCisgKiBJZiAjR3N0Q2Fwc1NldHRlcjpyZXBsYWNlIGlzICVUUlVFLCB0aGVuIGFueSBjYXBzIHVwZGF0ZSBpcyBwcmVjZWRlZCBieQorICogY2xlYXJpbmcgZXhpc3RpbmcgZmllbGRzLCBtYWtpbmcgcHJvdmlkZWQgZmllbGRzIChhcyBhIHdob2xlKSByZXBsYWNlCisgKiBpbmNvbWluZyBvbmVzLiBPdGhlcndpc2UsIG5vIGNsZWFyaW5nIGlzIHBlcmZvcm1lZCwgaW4gd2hpY2ggY2FzZSBwcm92aWRlZAorICogZmllbGRzIGFyZSBhZGRlZC9tZXJnZWQgb250byBpbmNvbWluZyBjYXBzCisgKiAKKyAqIEFsdGhvdWdoIHRoaXMgZWxlbWVudCBtaWdodCBtYWlubHkgc2VydmUgYXMgZGVidWcgaGVscGVyLAorICogaXQgY2FuIGFsc28gcHJhY3RpY2FsbHkgYmUgdXNlZCB0byBjb3JyZWN0IGEgZmF1bHR5IHBpeGVsLWFzcGVjdC1yYXRpbywKKyAqIG9yIHRvIG1vZGlmeSBhIHl1diBmb3VyY2MgdmFsdWUgdG8gZWZmZWN0aXZlbHkgc3dhcCBjaHJvbWEgY29tcG9uZW50cyBvciBzdWNoCisgKiBhbGlrZS4KKyAqLworCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGNhcHNzZXR0ZXIuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGNhcHNfc2V0dGVyX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGNhcHNfc2V0dGVyX2RlYnVnCisKKworLyogc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9DQVBTLAorICBQUk9QX0pPSU4sCisgIFBST1BfUkVQTEFDRQorICAgICAgLyogRklMTCBNRSAqLworfTsKKworI2RlZmluZSBERUZBVUxUX0pPSU4gICAgICAgICAgICAgIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9SRVBMQUNFICAgICAgICAgICBGQUxTRQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X2NhcHNfc2V0dGVyX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoR1NUX0JBU0VfVFJBTlNGT1JNX1NSQ19OQU1FLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X2NhcHNfc2V0dGVyX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKEdTVF9CQVNFX1RSQU5TRk9STV9TSU5LX05BTUUsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfY2Fwc19zZXR0ZXJfdHJhbnNmb3JtX3NpemUgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RDYXBzICogY2FwcywgZ3NpemUgc2l6ZSwKKyAgICBHc3RDYXBzICogb3RoZXJjYXBzLCBnc2l6ZSAqIG90aGVyc2l6ZSk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X2NhcHNfc2V0dGVyX3RyYW5zZm9ybV9jYXBzIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwgR3N0Q2FwcyAqIGNhcHMsIEdzdENhcHMgKiBjZmlsdGVyKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9jYXBzX3NldHRlcl90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiBidHJhbnMsCisgICAgR3N0QnVmZmVyICogaW4pOworCitzdGF0aWMgdm9pZCBnc3RfY2Fwc19zZXR0ZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3RfY2Fwc19zZXR0ZXJfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2NhcHNfc2V0dGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworI2RlZmluZSBnc3RfY2Fwc19zZXR0ZXJfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0Q2Fwc1NldHRlciwgZ3N0X2NhcHNfc2V0dGVyLCBHU1RfVFlQRV9CQVNFX1RSQU5TRk9STSk7CisKK3N0YXRpYyB2b2lkCitnc3RfY2Fwc19zZXR0ZXJfY2xhc3NfaW5pdCAoR3N0Q2Fwc1NldHRlckNsYXNzICogZ19jbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBnX2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoZ19jbGFzcyk7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqdHJhbnNfY2xhc3MgPSAoR3N0QmFzZVRyYW5zZm9ybUNsYXNzICopIGdfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGNhcHNfc2V0dGVyX2RlYnVnLCAiY2Fwc3NldHRlciIsIDAsICJjYXBzc2V0dGVyIik7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2NhcHNfc2V0dGVyX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2NhcHNfc2V0dGVyX2dldF9wcm9wZXJ0eTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9jYXBzX3NldHRlcl9maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NBUFMsCisgICAgICBnX3BhcmFtX3NwZWNfYm94ZWQgKCJjYXBzIiwgIk1lcmdlIGNhcHMiLAorICAgICAgICAgICJNZXJnZSB0aGVzZSBjYXBzICh0aGVyZWJ5IG92ZXJ3cml0aW5nKSBpbiB0aGUgc3RyZWFtIiwKKyAgICAgICAgICBHU1RfVFlQRV9DQVBTLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9KT0lOLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJqb2luIiwgIkpvaW4iLAorICAgICAgICAgICJNYXRjaCBpbmNvbWluZyBjYXBzJyBtaW1lLXR5cGUgdG8gbWltZS10eXBlIG9mIHByb3ZpZGVkIGNhcHMiLAorICAgICAgICAgIERFRkFVTFRfSk9JTiwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkVQTEFDRSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgicmVwbGFjZSIsICJSZXBsYWNlIiwKKyAgICAgICAgICAiRHJvcCBmaWVsZHMgb2YgaW5jb21pbmcgY2FwcyIsIERFRkFVTFRfUkVQTEFDRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiQ2Fwc1NldHRlciIsCisgICAgICAiR2VuZXJpYyIsCisgICAgICAiU2V0L21lcmdlIGNhcHMgb24gc3RyZWFtIiwKKyAgICAgICJNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X2NhcHNfc2V0dGVyX3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfY2Fwc19zZXR0ZXJfc3JjX3RlbXBsYXRlKTsKKworICB0cmFuc19jbGFzcy0+dHJhbnNmb3JtX3NpemUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9jYXBzX3NldHRlcl90cmFuc2Zvcm1fc2l6ZSk7CisgIHRyYW5zX2NsYXNzLT50cmFuc2Zvcm1fY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2NhcHNfc2V0dGVyX3RyYW5zZm9ybV9jYXBzKTsKKyAgLyogZHVtbXkgc2VlbXMgbmVlZGVkICovCisgIHRyYW5zX2NsYXNzLT50cmFuc2Zvcm1faXAgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2NhcHNfc2V0dGVyX3RyYW5zZm9ybV9pcCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfY2Fwc19zZXR0ZXJfaW5pdCAoR3N0Q2Fwc1NldHRlciAqIGZpbHRlcikKK3sKKyAgZmlsdGVyLT5jYXBzID0gZ3N0X2NhcHNfbmV3X2FueSAoKTsKKyAgZmlsdGVyLT5qb2luID0gREVGQVVMVF9KT0lOOworICBmaWx0ZXItPnJlcGxhY2UgPSBERUZBVUxUX1JFUExBQ0U7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfY2Fwc19zZXR0ZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdENhcHNTZXR0ZXIgKmZpbHRlciA9IEdTVF9DQVBTX1NFVFRFUiAob2JqZWN0KTsKKworICBnc3RfY2Fwc19yZXBsYWNlICgmZmlsdGVyLT5jYXBzLCBOVUxMKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2NhcHNfc2V0dGVyX3RyYW5zZm9ybV9zaXplIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwgR3N0Q2FwcyAqIGNhcHMsIGdzaXplIHNpemUsCisgICAgR3N0Q2FwcyAqIG90aGVyY2FwcywgZ3NpemUgKiBvdGhlcnNpemUpCit7CisgICpvdGhlcnNpemUgPSBzaXplOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfY2Fwc19zZXR0ZXJfdHJhbnNmb3JtX2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RDYXBzICogY2FwcywgR3N0Q2FwcyAqIGNmaWx0ZXIpCit7CisgIEdzdENhcHNTZXR0ZXIgKmZpbHRlciA9IEdTVF9DQVBTX1NFVFRFUiAodHJhbnMpOworICBHc3RDYXBzICpyZXQgPSBOVUxMLCAqZmlsdGVyX2NhcHMgPSBOVUxMOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSwgKm1lcmdlOworICBjb25zdCBnY2hhciAqbmFtZTsKKyAgZ2ludCBpLCBqLCBrOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHRyYW5zLAorICAgICAgInJlY2VpdmluZyBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCAiLCB3aXRoIGZpbHRlcjogJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBjYXBzLCBjZmlsdGVyKTsKKworICAvKiBwYXNzIGZpbHRlciBjYXBzIHVwc3RyZWFtLCBvciBhbnkgaWYgbm8gZmlsdGVyICovCisgIGlmIChkaXJlY3Rpb24gIT0gR1NUX1BBRF9TSU5LKSB7CisgICAgaWYgKCFjZmlsdGVyIHx8IGdzdF9jYXBzX2lzX2VtcHR5IChjZmlsdGVyKSkgeworICAgICAgcmV0dXJuIGdzdF9jYXBzX3JlZiAoR1NUX0NBUFNfQU5ZKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGdzdF9jYXBzX3JlZiAoY2ZpbHRlcik7CisgICAgfQorICB9CisKKyAgcmV0ID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworICBmaWx0ZXJfY2FwcyA9IGdzdF9jYXBzX3JlZiAoZmlsdGVyLT5jYXBzKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGZpbHRlcik7CisKKyAgZm9yIChrID0gMDsgayA8IGdzdF9jYXBzX2dldF9zaXplIChyZXQpOyBrKyspIHsKKyAgICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChyZXQsIGspOworICAgIG5hbWUgPSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzdHJ1Y3R1cmUpOworCisgICAgZm9yIChpID0gMDsgaSA8IGdzdF9jYXBzX2dldF9zaXplIChmaWx0ZXJfY2Fwcyk7ICsraSkgeworICAgICAgbWVyZ2UgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChmaWx0ZXJfY2FwcywgaSk7CisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAobWVyZ2UsIG5hbWUpIHx8ICFmaWx0ZXItPmpvaW4pIHsKKworICAgICAgICBpZiAoIWZpbHRlci0+am9pbikKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsIGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKG1lcmdlKSk7CisKKyAgICAgICAgaWYgKGZpbHRlci0+cmVwbGFjZSkKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9hbGxfZmllbGRzIChzdHJ1Y3R1cmUpOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBnc3Rfc3RydWN0dXJlX25fZmllbGRzIChtZXJnZSk7ICsraikgeworICAgICAgICAgIGNvbnN0IGdjaGFyICpmbmFtZTsKKworICAgICAgICAgIGZuYW1lID0gZ3N0X3N0cnVjdHVyZV9udGhfZmllbGRfbmFtZSAobWVyZ2UsIGopOworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzdHJ1Y3R1cmUsIGZuYW1lLAorICAgICAgICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAobWVyZ2UsIGZuYW1lKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUICh0cmFucywgInJldHVybmluZyBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKworICBnc3RfY2Fwc191bnJlZiAoZmlsdGVyX2NhcHMpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfY2Fwc19zZXR0ZXJfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogYnRyYW5zLCBHc3RCdWZmZXIgKiBpbikKK3sKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9jYXBzX2lzX2ZpeGVkX2ZvcmVhY2ggKEdRdWFyayBmaWVsZF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsCisgICAgZ3BvaW50ZXIgdW51c2VkKQoreworICByZXR1cm4gZ3N0X3ZhbHVlX2lzX2ZpeGVkICh2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfY2Fwc19zZXR0ZXJfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdENhcHNTZXR0ZXIgKmZpbHRlciA9IEdTVF9DQVBTX1NFVFRFUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ0FQUzp7CisgICAgICBHc3RDYXBzICpuZXdfY2FwczsKKyAgICAgIGNvbnN0IEdzdENhcHMgKm5ld19jYXBzX3ZhbCA9IGdzdF92YWx1ZV9nZXRfY2FwcyAodmFsdWUpOworICAgICAgZ2ludCBpOworCisgICAgICBpZiAobmV3X2NhcHNfdmFsID09IE5VTEwpIHsKKyAgICAgICAgbmV3X2NhcHMgPSBnc3RfY2Fwc19uZXdfYW55ICgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV3X2NhcHMgPSBnc3RfY2Fwc19jb3B5IChuZXdfY2Fwc192YWwpOworICAgICAgfQorCisgICAgICBmb3IgKGkgPSAwOyBuZXdfY2FwcyAmJiAoaSA8IGdzdF9jYXBzX2dldF9zaXplIChuZXdfY2FwcykpOyArK2kpIHsKKyAgICAgICAgR3N0U3RydWN0dXJlICpzOworCisgICAgICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChuZXdfY2FwcywgaSk7CisgICAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9mb3JlYWNoIChzLCBnc3RfY2Fwc19pc19maXhlZF9mb3JlYWNoLCBOVUxMKSkgeworICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGZpbHRlciwgInJlamVjdGVkIHVuZml4ZWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgICAgIG5ld19jYXBzKTsKKyAgICAgICAgICBnc3RfY2Fwc191bnJlZiAobmV3X2NhcHMpOworICAgICAgICAgIG5ld19jYXBzID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAobmV3X2NhcHMpIHsKKyAgICAgICAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworICAgICAgICBnc3RfY2Fwc19yZXBsYWNlICgmZmlsdGVyLT5jYXBzLCBuZXdfY2Fwcyk7CisgICAgICAgIC8qIGRyb3AgZXh0cmEgcmVmICovCisgICAgICAgIGdzdF9jYXBzX3VucmVmIChuZXdfY2Fwcyk7CisgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgInNldCBuZXcgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgbmV3X2NhcHMpOworICAgICAgfQorCisgICAgICAvKiB0cnkgdG8gYWN0aXZhdGUgdGhlc2UgbmV3IGNhcHMgbmV4dCB0aW1lIGFyb3VuZCAqLworICAgICAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3JlY29uZmlndXJlX3NyYyAoR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfSk9JTjoKKyAgICAgIGZpbHRlci0+am9pbiA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVBMQUNFOgorICAgICAgZmlsdGVyLT5yZXBsYWNlID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2NhcHNfc2V0dGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RDYXBzU2V0dGVyICpmaWx0ZXIgPSBHU1RfQ0FQU19TRVRURVIgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0NBUFM6CisgICAgICBnc3RfdmFsdWVfc2V0X2NhcHMgKHZhbHVlLCBmaWx0ZXItPmNhcHMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0pPSU46CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmlsdGVyLT5qb2luKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVBMQUNFOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIGZpbHRlci0+cmVwbGFjZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmggYi9nc3QvZGVidWd1dGlscy9nc3RjYXBzc2V0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2YmYxOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWJ1Z3V0aWxzL2dzdGNhcHNzZXR0ZXIuaApAQCAtMCwwICsxLDYzIEBACisvKiBHU3RyZWFtZXIgRWxlbWVudAorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDkgTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDcsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfQ0FQU19TRVRURVJfSF9fCisjZGVmaW5lIF9fR1NUX0NBUFNfU0VUVEVSX0hfXworCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQ0FQU19TRVRURVIgXAorICAoZ3N0X2NhcHNfc2V0dGVyX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9DQVBTX1NFVFRFUihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0NBUFNfU0VUVEVSLEdzdENhcHNTZXR0ZXIpKQorI2RlZmluZSBHU1RfQ0FQU19TRVRURVJfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfQ0FQU19TRVRURVIsR3N0Q2Fwc1NldHRlckNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0NBUFNfU0VUVEVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQ0FQU19TRVRURVIpKQorI2RlZmluZSBHU1RfSVNfQ0FQU19TRVRURVJfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfQ0FQU19TRVRURVIpKQorCitHVHlwZSBnc3RfY2Fwc19zZXR0ZXJfZ2V0X3R5cGUgKHZvaWQpOworCit0eXBlZGVmIHN0cnVjdCBfR3N0Q2Fwc1NldHRlciBHc3RDYXBzU2V0dGVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdENhcHNTZXR0ZXJDbGFzcyBHc3RDYXBzU2V0dGVyQ2xhc3M7CisKK3N0cnVjdCBfR3N0Q2Fwc1NldHRlcgoreworICBHc3RCYXNlVHJhbnNmb3JtIHBhcmVudDsKKworICAvKiA8IHByaXZhdGUgPiAqLworICAvKiBwcm9wZXJ0aWVzICovCisgIEdzdENhcHMgKmNhcHM7CisgIGdib29sZWFuIGpvaW47CisgIGdib29sZWFuIHJlcGxhY2U7Cit9OworCisKK3N0cnVjdCBfR3N0Q2Fwc1NldHRlckNsYXNzCit7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQ0FQU19TRVRURVJfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3RkZWJ1Zy5jIGIvZ3N0L2RlYnVndXRpbHMvZ3N0ZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTZhYTlmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlYnVndXRpbHMvZ3N0ZGVidWcuYwpAQCAtMCwwICsxLDc2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBCZW5qYW1pbiBPdHRlIDxvdHRlQGdub21lLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR1R5cGUgZ3N0X2JyZWFrX215X2RhdGFfZ2V0X3R5cGUgKHZvaWQpOworLy9HVHlwZSBnc3RfY2Fwc19kZWJ1Z19nZXRfdHlwZSAodm9pZCk7CitHVHlwZSBnc3RfY2Fwc19zZXR0ZXJfZ2V0X3R5cGUgKHZvaWQpOworR1R5cGUgZ3N0X3JuZF9idWZmZXJfc2l6ZV9nZXRfdHlwZSAodm9pZCk7CitHVHlwZSBnc3RfbmF2c2Vla19nZXRfdHlwZSAodm9pZCk7CitHVHlwZSBnc3RfcHJvZ3Jlc3NfcmVwb3J0X2dldF90eXBlICh2b2lkKTsKK0dUeXBlIGdzdF90YWdfaW5qZWN0X2dldF90eXBlICh2b2lkKTsKK0dUeXBlIGdzdF90ZXN0X2dldF90eXBlICh2b2lkKTsKK0dUeXBlIGdzdF9wdXNoX2ZpbGVfc3JjX2dldF90eXBlICh2b2lkKTsKKy8qCitHVHlwZSBnc3RfZ3N0X25lZ290aWF0aW9uX2dldF90eXBlICh2b2lkKTsKKyovCitHVHlwZSBnc3RfY3B1X3JlcG9ydF9nZXRfdHlwZSAodm9pZCk7CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYnJlYWtteWRhdGEiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIGdzdF9icmVha19teV9kYXRhX2dldF90eXBlICgpKQorICAgICAgfHwgIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJjYXBzc2V0dGVyIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBnc3RfY2Fwc19zZXR0ZXJfZ2V0X3R5cGUgKCkpCisgICAgICB8fCAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJuZGJ1ZmZlcnNpemUiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIGdzdF9ybmRfYnVmZmVyX3NpemVfZ2V0X3R5cGUgKCkpCisgICAgICB8fCAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm5hdnNlZWsiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIGdzdF9uYXZzZWVrX2dldF90eXBlICgpKQorICAgICAgfHwgIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJwdXNoZmlsZXNyYyIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgZ3N0X3B1c2hfZmlsZV9zcmNfZ2V0X3R5cGUgKCkpIHx8CisvKiAgICAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm5lZ290aWF0aW9uIiwgR1NUX1JBTktfTk9ORSwgZ3N0X2dzdF9uZWdvdGlhdGlvbl9nZXRfdHlwZSAoKSkgfHwgKi8KKyAgICAgICFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicHJvZ3Jlc3NyZXBvcnQiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIGdzdF9wcm9ncmVzc19yZXBvcnRfZ2V0X3R5cGUgKCkpCisgICAgICB8fCAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInRhZ2luamVjdCIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgZ3N0X3RhZ19pbmplY3RfZ2V0X3R5cGUgKCkpCisgICAgICB8fCAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInRlc3RzaW5rIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBnc3RfdGVzdF9nZXRfdHlwZSAoKSkKKyNpZiAwCisgICAgICB8fCAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImNhcHNkZWJ1ZyIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgZ3N0X2NhcHNfZGVidWdfZ2V0X3R5cGUgKCkpCisjZW5kaWYKKyAgICAgIHx8ICFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiY3B1cmVwb3J0IiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBnc3RfY3B1X3JlcG9ydF9nZXRfdHlwZSAoKSkpCisKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBkZWJ1ZywKKyAgICAiZWxlbWVudHMgZm9yIHRlc3RpbmcgYW5kIGRlYnVnZ2luZyIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L2RlYnVndXRpbHMvZ3N0bmF2aWdhdGlvbnRlc3QuYyBiL2dzdC9kZWJ1Z3V0aWxzL2dzdG5hdmlnYXRpb250ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyZmUxMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWJ1Z3V0aWxzL2dzdG5hdmlnYXRpb250ZXN0LmMKQEAgLTAsMCArMSwyNzcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdG5hdmlnYXRpb250ZXN0LmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSByaW50KHgpIChmbG9vcigoeCkrMC41KSkKKyNlbmRpZgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChuYXZpZ2F0aW9udGVzdF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBuYXZpZ2F0aW9udGVzdF9kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X25hdmlnYXRpb250ZXN0X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgiSTQyMCIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfbmF2aWdhdGlvbnRlc3Rfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJJNDIwIikpCisgICAgKTsKKworI2RlZmluZSBnc3RfbmF2aWdhdGlvbnRlc3RfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0TmF2aWdhdGlvbnRlc3QsIGdzdF9uYXZpZ2F0aW9udGVzdCwgR1NUX1RZUEVfVklERU9fRklMVEVSKTsKKworc3RhdGljIGdib29sZWFuCitnc3RfbmF2aWdhdGlvbnRlc3Rfc3JjX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFZpZGVvSW5mbyAqaW5mbzsKKyAgR3N0TmF2aWdhdGlvbnRlc3QgKm5hdnRlc3Q7CisgIGNvbnN0IGdjaGFyICp0eXBlOworCisgIG5hdnRlc3QgPSBHU1RfTkFWSUdBVElPTlRFU1QgKHRyYW5zKTsKKworICBpbmZvID0gJkdTVF9WSURFT19GSUxURVIgKHRyYW5zKS0+aW5faW5mbzsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9OQVZJR0FUSU9OOgorICAgIHsKKyAgICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCk7CisgICAgICBnaW50IGZwc19uLCBmcHNfZDsKKworICAgICAgZnBzX24gPSBHU1RfVklERU9fSU5GT19GUFNfTiAoaW5mbyk7CisgICAgICBmcHNfZCA9IEdTVF9WSURFT19JTkZPX0ZQU19EIChpbmZvKTsKKworICAgICAgdHlwZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgImV2ZW50Iik7CisgICAgICBpZiAoZ19zdHJfZXF1YWwgKHR5cGUsICJtb3VzZS1tb3ZlIikpIHsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfZG91YmxlIChzLCAicG9pbnRlcl94IiwgJm5hdnRlc3QtPngpOworICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9kb3VibGUgKHMsICJwb2ludGVyX3kiLCAmbmF2dGVzdC0+eSk7CisgICAgICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsICh0eXBlLCAibW91c2UtYnV0dG9uLXByZXNzIikpIHsKKyAgICAgICAgQnV0dG9uQ2xpY2sgKmNsaWNrID0gZ19uZXcgKEJ1dHRvbkNsaWNrLCAxKTsKKworICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9kb3VibGUgKHMsICJwb2ludGVyX3giLCAmY2xpY2stPngpOworICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9kb3VibGUgKHMsICJwb2ludGVyX3kiLCAmY2xpY2stPnkpOworICAgICAgICBjbGljay0+aW1hZ2VzX2xlZnQgPSAoZnBzX24gKyBmcHNfZCAtIDEpIC8gZnBzX2Q7CisgICAgICAgIC8qIGdyZWVuICovCisgICAgICAgIGNsaWNrLT5jeSA9IDE1MDsKKyAgICAgICAgY2xpY2stPmN1ID0gNDY7CisgICAgICAgIGNsaWNrLT5jdiA9IDIxOworICAgICAgICBuYXZ0ZXN0LT5jbGlja3MgPSBnX3NsaXN0X3ByZXBlbmQgKG5hdnRlc3QtPmNsaWNrcywgY2xpY2spOworICAgICAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAodHlwZSwgIm1vdXNlLWJ1dHRvbi1yZWxlYXNlIikpIHsKKyAgICAgICAgQnV0dG9uQ2xpY2sgKmNsaWNrID0gZ19uZXcgKEJ1dHRvbkNsaWNrLCAxKTsKKworICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9kb3VibGUgKHMsICJwb2ludGVyX3giLCAmY2xpY2stPngpOworICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9kb3VibGUgKHMsICJwb2ludGVyX3kiLCAmY2xpY2stPnkpOworICAgICAgICBjbGljay0+aW1hZ2VzX2xlZnQgPSAoZnBzX24gKyBmcHNfZCAtIDEpIC8gZnBzX2Q7CisgICAgICAgIC8qIHJlZCAqLworICAgICAgICBjbGljay0+Y3kgPSA3NjsKKyAgICAgICAgY2xpY2stPmN1ID0gODU7CisgICAgICAgIGNsaWNrLT5jdiA9IDI1NTsKKyAgICAgICAgbmF2dGVzdC0+Y2xpY2tzID0gZ19zbGlzdF9wcmVwZW5kIChuYXZ0ZXN0LT5jbGlja3MsIGNsaWNrKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+c3JjX2V2ZW50ICh0cmFucywgZXZlbnQpOworfQorCisvKiBVc2VmdWwgbWFjcm9zICovCisjZGVmaW5lIEdTVF9WSURFT19JNDIwX1lfUk9XU1RSSURFKHdpZHRoKSAoR1NUX1JPVU5EX1VQXzQod2lkdGgpKQorI2RlZmluZSBHU1RfVklERU9fSTQyMF9VX1JPV1NUUklERSh3aWR0aCkgKEdTVF9ST1VORF9VUF84KHdpZHRoKS8yKQorI2RlZmluZSBHU1RfVklERU9fSTQyMF9WX1JPV1NUUklERSh3aWR0aCkgKChHU1RfUk9VTkRfVVBfOChHU1RfVklERU9fSTQyMF9ZX1JPV1NUUklERSh3aWR0aCkpKS8yKQorCisjZGVmaW5lIEdTVF9WSURFT19JNDIwX1lfT0ZGU0VUKHcsaCkgKDApCisjZGVmaW5lIEdTVF9WSURFT19JNDIwX1VfT0ZGU0VUKHcsaCkgKEdTVF9WSURFT19JNDIwX1lfT0ZGU0VUKHcsaCkrKEdTVF9WSURFT19JNDIwX1lfUk9XU1RSSURFKHcpKkdTVF9ST1VORF9VUF8yKGgpKSkKKyNkZWZpbmUgR1NUX1ZJREVPX0k0MjBfVl9PRkZTRVQodyxoKSAoR1NUX1ZJREVPX0k0MjBfVV9PRkZTRVQodyxoKSsoR1NUX1ZJREVPX0k0MjBfVV9ST1dTVFJJREUodykqR1NUX1JPVU5EX1VQXzIoaCkvMikpCisKKyNkZWZpbmUgR1NUX1ZJREVPX0k0MjBfU0laRSh3LGgpICAgICAoR1NUX1ZJREVPX0k0MjBfVl9PRkZTRVQodyxoKSsoR1NUX1ZJREVPX0k0MjBfVl9ST1dTVFJJREUodykqR1NUX1JPVU5EX1VQXzIoaCkvMikpCisKK3N0YXRpYyB2b2lkCitkcmF3X2JveF9wbGFuYXI0MTEgKEdzdFZpZGVvRnJhbWUgKiBmcmFtZSwgaW50IHgsIGludCB5LAorICAgIGd1aW50OCBjb2xvcnksIGd1aW50OCBjb2xvcnUsIGd1aW50OCBjb2xvcnYpCit7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgaW50IHgxLCB4MiwgeTEsIHkyOworICBndWludDggKmQ7CisgIGdpbnQgc3RyaWRlOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKTsKKworICBpZiAoeCA8IDAgfHwgeSA8IDAgfHwgeCA+PSB3aWR0aCB8fCB5ID49IGhlaWdodCkKKyAgICByZXR1cm47CisKKyAgeDEgPSBNQVggKHggLSA1LCAwKTsKKyAgeDIgPSBNSU4gKHggKyA1LCB3aWR0aCk7CisgIHkxID0gTUFYICh5IC0gNSwgMCk7CisgIHkyID0gTUlOICh5ICsgNSwgaGVpZ2h0KTsKKworICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLCAwKTsKKyAgc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoZnJhbWUsIDApOworCisgIGZvciAoeSA9IHkxOyB5IDwgeTI7IHkrKykgeworICAgIGZvciAoeCA9IHgxOyB4IDwgeDI7IHgrKykgeworICAgICAgZFt5ICogc3RyaWRlICsgeF0gPSBjb2xvcnk7CisgICAgfQorICB9CisKKyAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMSk7CisgIHN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGZyYW1lLCAxKTsKKworICB4MSAvPSAyOworICB4MiAvPSAyOworICB5MSAvPSAyOworICB5MiAvPSAyOworICBmb3IgKHkgPSB5MTsgeSA8IHkyOyB5KyspIHsKKyAgICBmb3IgKHggPSB4MTsgeCA8IHgyOyB4KyspIHsKKyAgICAgIGRbeSAqIHN0cmlkZSArIHhdID0gY29sb3J1OworICAgIH0KKyAgfQorCisgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZnJhbWUsIDIpOworICBzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMik7CisKKyAgZm9yICh5ID0geTE7IHkgPCB5MjsgeSsrKSB7CisgICAgZm9yICh4ID0geDE7IHggPCB4MjsgeCsrKSB7CisgICAgICBkW3kgKiBzdHJpZGUgKyB4XSA9IGNvbG9ydjsKKyAgICB9CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9uYXZpZ2F0aW9udGVzdF90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogZmlsdGVyLAorICAgIEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSkKK3sKKyAgR3N0TmF2aWdhdGlvbnRlc3QgKm5hdnRlc3QgPSBHU1RfTkFWSUdBVElPTlRFU1QgKGZpbHRlcik7CisgIEdTTGlzdCAqd2FsazsKKworICBnc3RfdmlkZW9fZnJhbWVfY29weSAob3V0X2ZyYW1lLCBpbl9mcmFtZSk7CisKKyAgd2FsayA9IG5hdnRlc3QtPmNsaWNrczsKKyAgd2hpbGUgKHdhbGspIHsKKyAgICBCdXR0b25DbGljayAqY2xpY2sgPSB3YWxrLT5kYXRhOworCisgICAgd2FsayA9IGdfc2xpc3RfbmV4dCAod2Fsayk7CisgICAgZHJhd19ib3hfcGxhbmFyNDExIChvdXRfZnJhbWUsCisgICAgICAgIHJpbnQgKGNsaWNrLT54KSwgcmludCAoY2xpY2stPnkpLCBjbGljay0+Y3ksIGNsaWNrLT5jdSwgY2xpY2stPmN2KTsKKyAgICBpZiAoLS1jbGljay0+aW1hZ2VzX2xlZnQgPCAxKSB7CisgICAgICBuYXZ0ZXN0LT5jbGlja3MgPSBnX3NsaXN0X3JlbW92ZSAobmF2dGVzdC0+Y2xpY2tzLCBjbGljayk7CisgICAgICBnX2ZyZWUgKGNsaWNrKTsKKyAgICB9CisgIH0KKyAgZHJhd19ib3hfcGxhbmFyNDExIChvdXRfZnJhbWUsCisgICAgICByaW50IChuYXZ0ZXN0LT54KSwgcmludCAobmF2dGVzdC0+eSksIDAsIDEyOCwgMTI4KTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X25hdmlnYXRpb250ZXN0X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTOworICBHc3ROYXZpZ2F0aW9udGVzdCAqbmF2dGVzdCA9IEdTVF9OQVZJR0FUSU9OVEVTVCAoZWxlbWVudCk7CisKKyAgaWYgKEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUpCisgICAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgLyogZG93bndhcmRzIHN0YXRlIGNoYW5nZXMgKi8KKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICB7CisgICAgICBnX3NsaXN0X2ZvcmVhY2ggKG5hdnRlc3QtPmNsaWNrcywgKEdGdW5jKSBnX2ZyZWUsIE5VTEwpOworICAgICAgZ19zbGlzdF9mcmVlIChuYXZ0ZXN0LT5jbGlja3MpOworICAgICAgbmF2dGVzdC0+Y2xpY2tzID0gTlVMTDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X25hdmlnYXRpb250ZXN0X2NsYXNzX2luaXQgKEdzdE5hdmlnYXRpb250ZXN0Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKnRyYW5zX2NsYXNzOworICBHc3RWaWRlb0ZpbHRlckNsYXNzICp2ZmlsdGVyX2NsYXNzOworCisgIGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICB0cmFuc19jbGFzcyA9IChHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKikga2xhc3M7CisgIHZmaWx0ZXJfY2xhc3MgPSAoR3N0VmlkZW9GaWx0ZXJDbGFzcyAqKSBrbGFzczsKKworICBlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9uYXZpZ2F0aW9udGVzdF9jaGFuZ2Vfc3RhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJWaWRlbyBuYXZpZ2F0aW9uIHRlc3QiLAorICAgICAgIkZpbHRlci9FZmZlY3QvVmlkZW8iLAorICAgICAgIkhhbmRsZSBuYXZpZ2F0aW9uIGV2ZW50cyBzaG93aW5nIGEgYmxhY2sgc3F1YXJlIGZvbGxvd2luZyBtb3VzZSBwb2ludGVyIiwKKyAgICAgICJEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfbmF2aWdhdGlvbnRlc3Rfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9uYXZpZ2F0aW9udGVzdF9zcmNfdGVtcGxhdGUpOworCisgIHRyYW5zX2NsYXNzLT5zcmNfZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X25hdmlnYXRpb250ZXN0X3NyY19ldmVudCk7CisKKyAgdmZpbHRlcl9jbGFzcy0+dHJhbnNmb3JtX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbmF2aWdhdGlvbnRlc3RfdHJhbnNmb3JtX2ZyYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9uYXZpZ2F0aW9udGVzdF9pbml0IChHc3ROYXZpZ2F0aW9udGVzdCAqIG5hdnRlc3QpCit7CisgIG5hdnRlc3QtPnggPSAtMTsKKyAgbmF2dGVzdC0+eSA9IC0xOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChuYXZpZ2F0aW9udGVzdF9kZWJ1ZywgIm5hdmlnYXRpb250ZXN0IiwgMCwKKyAgICAgICJuYXZpZ2F0aW9udGVzdCIpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAibmF2aWdhdGlvbnRlc3QiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfTkFWSUdBVElPTlRFU1QpOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgbmF2aWdhdGlvbnRlc3QsCisgICAgIlRlbXBsYXRlIGZvciBhIHZpZGVvIGZpbHRlciIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3RuYXZpZ2F0aW9udGVzdC5oIGIvZ3N0L2RlYnVndXRpbHMvZ3N0bmF2aWdhdGlvbnRlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWNmNDU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlYnVndXRpbHMvZ3N0bmF2aWdhdGlvbnRlc3QuaApAQCAtMCwwICsxLDY1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX05BVklHQVRJT05URVNUX0hfXworI2RlZmluZSBfX0dTVF9OQVZJR0FUSU9OVEVTVF9IX18KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2ZpbHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX05BVklHQVRJT05URVNUIFwKKyAgKGdzdF9uYXZpZ2F0aW9udGVzdF9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfTkFWSUdBVElPTlRFU1Qob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9OQVZJR0FUSU9OVEVTVCxHc3ROYXZpZ2F0aW9udGVzdCkpCisjZGVmaW5lIEdTVF9OQVZJR0FUSU9OVEVTVF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9OQVZJR0FUSU9OVEVTVCxHc3ROYXZpZ2F0aW9udGVzdENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX05BVklHQVRJT05URVNUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfTkFWSUdBVElPTlRFU1QpKQorI2RlZmluZSBHU1RfSVNfTkFWSUdBVElPTlRFU1RfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfTkFWSUdBVElPTlRFU1QpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdE5hdmlnYXRpb250ZXN0IEdzdE5hdmlnYXRpb250ZXN0OwordHlwZWRlZiBzdHJ1Y3QgX0dzdE5hdmlnYXRpb250ZXN0Q2xhc3MgR3N0TmF2aWdhdGlvbnRlc3RDbGFzczsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ2RvdWJsZSB4OworICBnZG91YmxlIHk7CisgIGdpbnQgaW1hZ2VzX2xlZnQ7CisgIGd1aW50OCBjeSwgY3UsIGN2OworfSBCdXR0b25DbGljazsKKworc3RydWN0IF9Hc3ROYXZpZ2F0aW9udGVzdAoreworICBHc3RWaWRlb0ZpbHRlciB2aWRlb2ZpbHRlcjsKKworICBnZG91YmxlIHgsIHk7CisgIEdTTGlzdCAqY2xpY2tzOworfTsKKworc3RydWN0IF9Hc3ROYXZpZ2F0aW9udGVzdENsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X25hdmlnYXRpb250ZXN0X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9OQVZJR0FUSU9OVEVTVF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9kZWJ1Z3V0aWxzL2dzdG5hdnNlZWsuYyBiL2dzdC9kZWJ1Z3V0aWxzL2dzdG5hdnNlZWsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDkzODZjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlYnVndXRpbHMvZ3N0bmF2c2Vlay5jCkBAIC0wLDAgKzEsMzkwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyAocHJvYmFibHkpIGdlbmVyYXRlZCBmcm9tIGdzdG5hdnNlZWsuYywKKyAqIGdzdG5hdnNlZWsuYyx2IDEuNyAyMDAzLzExLzA4IDAyOjQ4OjU5IGRzY2hsZWVmIEV4cCAKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RuYXZzZWVrLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9TRUVLT0ZGU0VUCit9OworCitHc3RTdGF0aWNQYWRUZW1wbGF0ZSBuYXZzZWVrX3NyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgbmF2c2Vla19zaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbmF2c2Vla19zaW5rX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfbmF2c2Vla190cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNldHJhbnMsCisgICAgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbmF2c2Vla19zcmNfZXZlbnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbmF2c2Vla19zdG9wIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpOworc3RhdGljIGdib29sZWFuIGdzdF9uYXZzZWVrX3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpOworCitzdGF0aWMgdm9pZCBnc3RfbmF2c2Vla19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfbmF2c2Vla19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK0dUeXBlIGdzdF9uYXZzZWVrX2dldF90eXBlICh2b2lkKTsKKyNkZWZpbmUgZ3N0X25hdnNlZWtfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0TmF2U2VlaywgZ3N0X25hdnNlZWssIEdTVF9UWVBFX0JBU0VfVFJBTlNGT1JNKTsKKworc3RhdGljIHZvaWQKK2dzdF9uYXZzZWVrX2NsYXNzX2luaXQgKEdzdE5hdlNlZWtDbGFzcyAqIGtsYXNzKQoreworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKmdzdGJhc2V0cmFuc19jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBnc3RiYXNldHJhbnNfY2xhc3MgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfbmF2c2Vla19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9uYXZzZWVrX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9TRUVLT0ZGU0VULCBnX3BhcmFtX3NwZWNfZG91YmxlICgic2Vlay1vZmZzZXQiLCAiU2VlayBPZmZzZXQiLAorICAgICAgICAgICJUaW1lIGluIHNlY29uZHMgdG8gc2VlayBieSIsIDAuMCwgR19NQVhET1VCTEUsIDUuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZuYXZzZWVrX3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZuYXZzZWVrX3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywKKyAgICAgICJTZWVrIGJhc2VkIG9uIGxlZnQtcmlnaHQgYXJyb3dzIiwgIkZpbHRlci9WaWRlbyIsCisgICAgICAiU2VlayBiYXNlZCBvbiBuYXZpZ2F0aW9uIGtleXMgbGVmdC1yaWdodCIsCisgICAgICAiSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+Iik7CisKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzLT5zcmNfZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X25hdnNlZWtfc3JjX2V2ZW50KTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzLT5zaW5rX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9uYXZzZWVrX3NpbmtfZXZlbnQpOworICBnc3RiYXNldHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X25hdnNlZWtfdHJhbnNmb3JtX2lwKTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbmF2c2Vla19zdGFydCk7CisgIGdzdGJhc2V0cmFuc19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbmF2c2Vla19zdG9wKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9uYXZzZWVrX2luaXQgKEdzdE5hdlNlZWsgKiBuYXZzZWVrKQoreworICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X3Bhc3N0aHJvdWdoIChHU1RfQkFTRV9UUkFOU0ZPUk0gKG5hdnNlZWspLCBUUlVFKTsKKworICBuYXZzZWVrLT5zZWVrX29mZnNldCA9IDUuMDsKKyAgbmF2c2Vlay0+bG9vcCA9IEZBTFNFOworICBuYXZzZWVrLT5ncmFiX3NlZ19zdGFydCA9IEZBTFNFOworICBuYXZzZWVrLT5ncmFiX3NlZ19lbmQgPSBGQUxTRTsKKyAgbmF2c2Vlay0+c2VnbWVudF9zdGFydCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIG5hdnNlZWstPnNlZ21lbnRfZW5kID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9uYXZzZWVrX3NlZWsgKEdzdE5hdlNlZWsgKiBuYXZzZWVrLCBnaW50NjQgb2Zmc2V0KQoreworICBnYm9vbGVhbiByZXQ7CisgIEdzdFBhZCAqcGVlcl9wYWQ7CisgIGdpbnQ2NCBwZWVyX3ZhbHVlOworCisgIC8qIFF1ZXJ5IGZvciB0aGUgY3VycmVudCB0aW1lIHRoZW4gYXR0ZW1wdCB0byBzZXQgdG8gdGltZSArIG9mZnNldCAqLworICBwZWVyX3BhZCA9IGdzdF9wYWRfZ2V0X3BlZXIgKEdTVF9CQVNFX1RSQU5TRk9STSAobmF2c2VlayktPnNpbmtwYWQpOworICByZXQgPSBnc3RfcGFkX3F1ZXJ5X3Bvc2l0aW9uIChwZWVyX3BhZCwgR1NUX0ZPUk1BVF9USU1FLCAmcGVlcl92YWx1ZSk7CisKKyAgaWYgKHJldCkgeworICAgIEdzdEV2ZW50ICpldmVudDsKKworICAgIHBlZXJfdmFsdWUgKz0gb2Zmc2V0OworICAgIGlmIChwZWVyX3ZhbHVlIDwgMCkKKyAgICAgIHBlZXJfdmFsdWUgPSAwOworCisgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZWsgKDEuMCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICBHU1RfU0VFS19GTEFHX0FDQ1VSQVRFIHwgR1NUX1NFRUtfRkxBR19GTFVTSCwKKyAgICAgICAgR1NUX1NFRUtfVFlQRV9TRVQsIHBlZXJfdmFsdWUsIEdTVF9TRUVLX1RZUEVfTk9ORSwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisKKyAgICBnc3RfcGFkX3NlbmRfZXZlbnQgKHBlZXJfcGFkLCBldmVudCk7CisgIH0KKworICBnc3Rfb2JqZWN0X3VucmVmIChwZWVyX3BhZCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbmF2c2Vla19jaGFuZ2VfcGxheWJhY2tfcmF0ZSAoR3N0TmF2U2VlayAqIG5hdnNlZWssIGdkb3VibGUgcmF0ZSkKK3sKKyAgZ2Jvb2xlYW4gcmV0OworICBHc3RQYWQgKnBlZXJfcGFkOworICBnaW50NjQgY3VycmVudF9wb3NpdGlvbjsKKworICBwZWVyX3BhZCA9IGdzdF9wYWRfZ2V0X3BlZXIgKEdTVF9CQVNFX1RSQU5TRk9STSAobmF2c2VlayktPnNpbmtwYWQpOworICByZXQgPSBnc3RfcGFkX3F1ZXJ5X3Bvc2l0aW9uIChwZWVyX3BhZCwgR1NUX0ZPUk1BVF9USU1FLCAmY3VycmVudF9wb3NpdGlvbik7CisKKyAgaWYgKHJldCkgeworICAgIEdzdEV2ZW50ICpldmVudDsKKyAgICBnaW50NjQgc3RhcnQ7CisgICAgZ2ludDY0IHN0b3A7CisKKyAgICBpZiAocmF0ZSA+IDAuMCkgeworICAgICAgc3RhcnQgPSBjdXJyZW50X3Bvc2l0aW9uOworICAgICAgc3RvcCA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAvKiBuZWdhdGl2ZSByYXRlOiB3ZSBwbGF5IGZyb20gc3RvcCB0byBzdGFydCAqLworICAgICAgc3RhcnQgPSAwOworICAgICAgc3RvcCA9IGN1cnJlbnRfcG9zaXRpb247CisgICAgfQorCisgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZWsgKHJhdGUsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgR1NUX1NFRUtfRkxBR19BQ0NVUkFURSB8IEdTVF9TRUVLX0ZMQUdfRkxVU0ggfCBHU1RfU0VFS19GTEFHX1NLSVAsCisgICAgICAgIEdTVF9TRUVLX1RZUEVfU0VULCBzdGFydCwgR1NUX1NFRUtfVFlQRV9TRVQsIHN0b3ApOworCisgICAgZ3N0X3BhZF9zZW5kX2V2ZW50IChwZWVyX3BhZCwgZXZlbnQpOworICB9CisgIGdzdF9vYmplY3RfdW5yZWYgKHBlZXJfcGFkKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9uYXZzZWVrX3NlZ3NlZWsgKEdzdE5hdlNlZWsgKiBuYXZzZWVrKQoreworICBHc3RFdmVudCAqZXZlbnQ7CisgIEdzdFBhZCAqcGVlcl9wYWQ7CisKKyAgaWYgKChuYXZzZWVrLT5zZWdtZW50X3N0YXJ0ID09IEdTVF9DTE9DS19USU1FX05PTkUpIHx8CisgICAgICAobmF2c2Vlay0+c2VnbWVudF9lbmQgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgfHwKKyAgICAgICghR1NUX1BBRF9JU19MSU5LRUQgKEdTVF9CQVNFX1RSQU5TRk9STSAobmF2c2VlayktPnNpbmtwYWQpKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChuYXZzZWVrLT5sb29wKSB7CisgICAgZXZlbnQgPQorICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZWsgKDEuMCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICBHU1RfU0VFS19GTEFHX0FDQ1VSQVRFIHwgR1NUX1NFRUtfRkxBR19TRUdNRU5ULAorICAgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgbmF2c2Vlay0+c2VnbWVudF9zdGFydCwgR1NUX1NFRUtfVFlQRV9TRVQsCisgICAgICAgIG5hdnNlZWstPnNlZ21lbnRfZW5kKTsKKyAgfSBlbHNlIHsKKyAgICBldmVudCA9CisgICAgICAgIGdzdF9ldmVudF9uZXdfc2VlayAoMS4wLCBHU1RfRk9STUFUX1RJTUUsIEdTVF9TRUVLX0ZMQUdfQUNDVVJBVEUsCisgICAgICAgIEdTVF9TRUVLX1RZUEVfU0VULCBuYXZzZWVrLT5zZWdtZW50X3N0YXJ0LCBHU1RfU0VFS19UWVBFX1NFVCwKKyAgICAgICAgbmF2c2Vlay0+c2VnbWVudF9lbmQpOworICB9CisKKyAgcGVlcl9wYWQgPSBnc3RfcGFkX2dldF9wZWVyIChHU1RfQkFTRV9UUkFOU0ZPUk0gKG5hdnNlZWspLT5zaW5rcGFkKTsKKyAgZ3N0X3BhZF9zZW5kX2V2ZW50IChwZWVyX3BhZCwgZXZlbnQpOworICBnc3Rfb2JqZWN0X3VucmVmIChwZWVyX3BhZCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbmF2c2Vla190b2dnbGVfcGxheV9wYXVzZSAoR3N0TmF2U2VlayAqIG5hdnNlZWspCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHNyZXQ7CisgIEdzdFN0YXRlIGN1cnJlbnQsIHBlbmRpbmcsIHN0YXRlOworCisgIHNyZXQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKEdTVF9FTEVNRU5UIChuYXZzZWVrKSwgJmN1cnJlbnQsICZwZW5kaW5nLCAwKTsKKyAgaWYgKHNyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKQorICAgIHJldHVybjsKKworICBzdGF0ZSA9IChwZW5kaW5nICE9IEdTVF9TVEFURV9WT0lEX1BFTkRJTkcpID8gcGVuZGluZyA6IGN1cnJlbnQ7CisKKyAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVCAobmF2c2VlayksCisgICAgICBnc3RfbWVzc2FnZV9uZXdfcmVxdWVzdF9zdGF0ZSAoR1NUX09CSkVDVCAobmF2c2VlayksCisgICAgICAgICAgKHN0YXRlID09IEdTVF9TVEFURV9QTEFZSU5HKSA/IEdTVF9TVEFURV9QQVVTRUQgOiBHU1RfU1RBVEVfUExBWUlORykpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9uYXZzZWVrX3NyY19ldmVudCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3ROYXZTZWVrICpuYXZzZWVrOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIG5hdnNlZWsgPSBHU1RfTkFWU0VFSyAodHJhbnMpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX05BVklHQVRJT046CisgICAgeworICAgICAgLyogQ2hlY2sgZm9yIGEga2V5dXAgYW5kIGNvbnZlcnQgbGVmdC9yaWdodCB0byBhIHNlZWsgZXZlbnQgKi8KKyAgICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICAgICAgY29uc3QgZ2NoYXIgKmV2ZW50X3R5cGU7CisKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCk7CisgICAgICBnX3JldHVybl92YWxfaWZfZmFpbCAoc3RydWN0dXJlICE9IE5VTEwsIEZBTFNFKTsKKworICAgICAgZXZlbnRfdHlwZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZXZlbnQiKTsKKyAgICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChldmVudF90eXBlICE9IE5VTEwsIEZBTFNFKTsKKworICAgICAgaWYgKHN0cmNtcCAoZXZlbnRfdHlwZSwgImtleS1wcmVzcyIpID09IDApIHsKKyAgICAgICAgY29uc3QgZ2NoYXIgKmtleTsKKworICAgICAgICBrZXkgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImtleSIpOworICAgICAgICBnX3JldHVybl92YWxfaWZfZmFpbCAoa2V5ICE9IE5VTEwsIEZBTFNFKTsKKworICAgICAgICBpZiAoc3RyY21wIChrZXksICJMZWZ0IikgPT0gMCkgeworICAgICAgICAgIC8qIFNlZWsgYmFja3dhcmQgYnkgNSBzZWNzICovCisgICAgICAgICAgZ3N0X25hdnNlZWtfc2VlayAobmF2c2VlaywgLTEuMCAqIG5hdnNlZWstPnNlZWtfb2Zmc2V0ICogR1NUX1NFQ09ORCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wIChrZXksICJSaWdodCIpID09IDApIHsKKyAgICAgICAgICAvKiBTZWVrIGZvcndhcmQgKi8KKyAgICAgICAgICBnc3RfbmF2c2Vla19zZWVrIChuYXZzZWVrLCBuYXZzZWVrLT5zZWVrX29mZnNldCAqIEdTVF9TRUNPTkQpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCAoa2V5LCAicyIpID09IDApIHsKKyAgICAgICAgICAvKiBHcmFiIHRoZSBuZXh0IGZyYW1lIGFzIHRoZSBzdGFydCBmcmFtZSBvZiBhIHNlZ21lbnQgKi8KKyAgICAgICAgICBuYXZzZWVrLT5ncmFiX3NlZ19zdGFydCA9IFRSVUU7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wIChrZXksICJlIikgPT0gMCkgeworICAgICAgICAgIC8qIEdyYWIgdGhlIG5leHQgZnJhbWUgYXMgdGhlIGVuZCBmcmFtZSBvZiBhIHNlZ21lbnQgKi8KKyAgICAgICAgICBuYXZzZWVrLT5ncmFiX3NlZ19lbmQgPSBUUlVFOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCAoa2V5LCAibCIpID09IDApIHsKKyAgICAgICAgICAvKiBUb2dnbGUgdGhlIGxvb3AgZmxhZy4gSWYgd2UgaGF2ZSBib3RoIHN0YXJ0IGFuZCBlbmQgc2VnbWVudCB0aW1lcyBzZW5kIGEgc2VlayAqLworICAgICAgICAgIG5hdnNlZWstPmxvb3AgPSAhbmF2c2Vlay0+bG9vcDsKKyAgICAgICAgICBnc3RfbmF2c2Vla19zZWdzZWVrIChuYXZzZWVrKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAgKGtleSwgImYiKSA9PSAwKSB7CisgICAgICAgICAgLyogZmFzdCBmb3J3YXJkICovCisgICAgICAgICAgZ3N0X25hdnNlZWtfY2hhbmdlX3BsYXliYWNrX3JhdGUgKG5hdnNlZWssIDIuMCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wIChrZXksICJyIikgPT0gMCkgeworICAgICAgICAgIC8qIHJld2luZCAqLworICAgICAgICAgIGdzdF9uYXZzZWVrX2NoYW5nZV9wbGF5YmFja19yYXRlIChuYXZzZWVrLCAtMi4wKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAgKGtleSwgIm4iKSA9PSAwKSB7CisgICAgICAgICAgLyogbm9ybWFsIHNwZWVkICovCisgICAgICAgICAgZ3N0X25hdnNlZWtfY2hhbmdlX3BsYXliYWNrX3JhdGUgKG5hdnNlZWssIDEuMCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wIChrZXksICJzcGFjZSIpID09IDApIHsKKyAgICAgICAgICBnc3RfbmF2c2Vla190b2dnbGVfcGxheV9wYXVzZSAobmF2c2Vlayk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBldmVudCA9IE5VTEw7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKGV2ZW50KQorICAgIHJldCA9IEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+c3JjX2V2ZW50ICh0cmFucywgZXZlbnQpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbmF2c2Vla19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0TmF2U2VlayAqbmF2c2VlayA9IEdTVF9OQVZTRUVLIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TRUVLT0ZGU0VUOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChuYXZzZWVrKTsKKyAgICAgIG5hdnNlZWstPnNlZWtfb2Zmc2V0ID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAobmF2c2Vlayk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbmF2c2Vla19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0TmF2U2VlayAqbmF2c2VlayA9IEdTVF9OQVZTRUVLIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TRUVLT0ZGU0VUOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChuYXZzZWVrKTsKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIG5hdnNlZWstPnNlZWtfb2Zmc2V0KTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChuYXZzZWVrKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbmF2c2Vla19zaW5rX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdE5hdlNlZWsgKm5hdnNlZWsgPSBHU1RfTkFWU0VFSyAodHJhbnMpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAobmF2c2Vlayk7CisgICAgICBpZiAobmF2c2Vlay0+bG9vcCkKKyAgICAgICAgZ3N0X25hdnNlZWtfc2Vnc2VlayAobmF2c2Vlayk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAobmF2c2Vlayk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAodHJhbnMsIGV2ZW50KTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9uYXZzZWVrX3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2V0cmFucywgR3N0QnVmZmVyICogYnVmKQoreworICBHc3ROYXZTZWVrICpuYXZzZWVrID0gR1NUX05BVlNFRUsgKGJhc2V0cmFucyk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChuYXZzZWVrKTsKKworICBpZiAoR1NUX0JVRkZFUl9USU1FU1RBTVBfSVNfVkFMSUQgKGJ1ZikpIHsKKyAgICBpZiAobmF2c2Vlay0+Z3JhYl9zZWdfc3RhcnQpIHsKKyAgICAgIG5hdnNlZWstPnNlZ21lbnRfc3RhcnQgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKyAgICAgIG5hdnNlZWstPnNlZ21lbnRfZW5kID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgIG5hdnNlZWstPmdyYWJfc2VnX3N0YXJ0ID0gRkFMU0U7CisgICAgfQorCisgICAgaWYgKG5hdnNlZWstPmdyYWJfc2VnX2VuZCkgeworICAgICAgbmF2c2Vlay0+c2VnbWVudF9lbmQgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKyAgICAgIG5hdnNlZWstPmdyYWJfc2VnX2VuZCA9IEZBTFNFOworICAgICAgZ3N0X25hdnNlZWtfc2Vnc2VlayAobmF2c2Vlayk7CisgICAgfQorICB9CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKG5hdnNlZWspOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbmF2c2Vla19zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICAvKiBhbnl0aGluZyB3ZSBzaG91bGQgYmUgZG9pbmcgaGVyZT8gKi8KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X25hdnNlZWtfc3RvcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICAvKiBhbnl0aGluZyB3ZSBzaG91bGQgYmUgZG9pbmcgaGVyZT8gKi8KKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3RuYXZzZWVrLmggYi9nc3QvZGVidWd1dGlscy9nc3RuYXZzZWVrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI5YzkyNAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWJ1Z3V0aWxzL2dzdG5hdnNlZWsuaApAQCAtMCwwICsxLDYwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX05BVlNFRUtfSF9fCisjZGVmaW5lIF9fR1NUX05BVlNFRUtfSF9fCisKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfTkFWU0VFSyBcCisgIChnc3RfbmF2c2Vla19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfTkFWU0VFSyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX05BVlNFRUssR3N0TmF2U2VlaykpCisjZGVmaW5lIEdTVF9OQVZTRUVLX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX05BVlNFRUssR3N0TmF2U2Vla0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX05BVlNFRUsob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9OQVZTRUVLKSkKKyNkZWZpbmUgR1NUX0lTX05BVlNFRUtfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfTkFWU0VFSykpCit0eXBlZGVmIHN0cnVjdCBfR3N0TmF2U2VlayBHc3ROYXZTZWVrOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE5hdlNlZWtDbGFzcyBHc3ROYXZTZWVrQ2xhc3M7CisKK3N0cnVjdCBfR3N0TmF2U2VlaworeworICBHc3RCYXNlVHJhbnNmb3JtIGJhc2V0cmFuc2Zvcm07CisKKyAgZ2RvdWJsZSBzZWVrX29mZnNldDsKKyAgZ2Jvb2xlYW4gbG9vcDsKKyAgZ2Jvb2xlYW4gZ3JhYl9zZWdfc3RhcnQ7CisgIGdib29sZWFuIGdyYWJfc2VnX2VuZDsKKyAgR3N0Q2xvY2tUaW1lIHNlZ21lbnRfc3RhcnQ7CisgIEdzdENsb2NrVGltZSBzZWdtZW50X2VuZDsKK307CisKK3N0cnVjdCBfR3N0TmF2U2Vla0NsYXNzCit7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX05BVlNFRUtfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3RwdXNoZmlsZXNyYy5jIGIvZ3N0L2RlYnVndXRpbHMvZ3N0cHVzaGZpbGVzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjBhY2NiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlYnVndXRpbHMvZ3N0cHVzaGZpbGVzcmMuYwpAQCAtMCwwICsxLDQyMSBAQAorLyogR1N0cmVhbWVyIFB1c2ggRmlsZSBTb3VyY2UKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcHVzaGZpbGVzcmMKKyAqIEBzZWVfYWxzbzogZmlsZXNyYworICoKKyAqIFRoaXMgZWxlbWVudCBpcyBvbmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiBJdCBpbXBsZW1lbnRzIGFuIFVSSQorICogcHJvdG9jb2wgaGFuZGxlciBmb3IgdGhlICdwdXNoZmlsZScgcHJvdG9jb2wgYW5kIGJlaGF2ZXMgbGlrZSBhIGZpbGUgc291cmNlCisgKiBlbGVtZW50IHRoYXQgY2Fubm90IGJlIGFjdGl2YXRlZCBpbiBwdWxsLW1vZGUuIFRoaXMgbWFrZXMgaXQgdmVyeSBlYXN5IHRvCisgKiBkZWJ1ZyBkZW11eGVycyBvciBkZWNvZGVycyB0aGF0IGNhbiBvcGVyYXRlIGJvdGggcHVsbCBhbmQgcHVzaC1iYXNlZCBpbgorICogY29ubmVjdGlvbiB3aXRoIHRoZSBwbGF5YmluIGVsZW1lbnQgKHdoaWNoIGNyZWF0ZXMgYSBzb3VyY2UgYmFzZWQgb24gdGhlCisgKiBVUkkgcGFzc2VkKS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLW0gcGxheWJpbiB1cmk9cHVzaGZpbGU6Ly8vaG9tZS95b3Uvc29tZS9maWxlLm9nZworICogXXwgVGhpcyBwbGF5cyBiYWNrIHRoZSBnaXZlbiBmaWxlIHVzaW5nIHBsYXliaW4sIHdpdGggdGhlIGRlbXV4ZXIgb3BlcmF0aW5nCisgKiBwdXNoLWJhc2VkLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RwdXNoZmlsZXNyYy5oIgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChwdXNoZmlsZXNyY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBwdXNoZmlsZXNyY19kZWJ1ZworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MT0NBVElPTiwKKyAgUFJPUF9USU1FX1NFR01FTlQsCisgIFBST1BfU1RSRUFNX1RJTUUsCisgIFBST1BfU1RBUlRfVElNRSwKKyAgUFJPUF9JTklUSUFMX1RJTUVTVEFNUCwKKyAgUFJPUF9SQVRFLAorICBQUk9QX0FQUExJRURfUkFURQorfTsKKworI2RlZmluZSBERUZBVUxUX1RJTUVfU0VHTUVOVCBGQUxTRQorI2RlZmluZSBERUZBVUxUX1NUUkVBTV9USU1FIDAKKyNkZWZpbmUgREVGQVVMVF9TVEFSVF9USU1FIDAKKyNkZWZpbmUgREVGQVVMVF9JTklUSUFMX1RJTUVTVEFNUCBHU1RfQ0xPQ0tfVElNRV9OT05FCisjZGVmaW5lIERFRkFVTFRfUkFURSAxLjAKKyNkZWZpbmUgREVGQVVMVF9BUFBMSUVEX1JBVEUgMS4wCisKK3N0YXRpYyB2b2lkIGdzdF9wdXNoX2ZpbGVfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9wdXNoX2ZpbGVfc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgdm9pZCBnc3RfcHVzaF9maWxlX3NyY191cmlfaGFuZGxlcl9pbml0IChncG9pbnRlciBnX2lmYWNlLAorICAgIGdwb2ludGVyIGlmYWNlX2RhdGEpOworCisjZGVmaW5lIGdzdF9wdXNoX2ZpbGVfc3JjX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RQdXNoRmlsZVNyYywgZ3N0X3B1c2hfZmlsZV9zcmMsIEdTVF9UWVBFX0JJTiwKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1VSSV9IQU5ETEVSLAorICAgICAgICBnc3RfcHVzaF9maWxlX3NyY191cmlfaGFuZGxlcl9pbml0KSk7CisKK3N0YXRpYyB2b2lkCitnc3RfcHVzaF9maWxlX3NyY19kaXNwb3NlIChHT2JqZWN0ICogb2JqKQoreworICBHc3RQdXNoRmlsZVNyYyAqc3JjID0gR1NUX1BVU0hfRklMRV9TUkMgKG9iaik7CisKKyAgaWYgKHNyYy0+c3JjcGFkKSB7CisgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlQgKHNyYyksIHNyYy0+c3JjcGFkKTsKKyAgICBzcmMtPnNyY3BhZCA9IE5VTEw7CisgIH0KKyAgaWYgKHNyYy0+ZmlsZXNyYykgeworICAgIGdzdF9iaW5fcmVtb3ZlIChHU1RfQklOIChzcmMpLCBzcmMtPmZpbGVzcmMpOworICAgIHNyYy0+ZmlsZXNyYyA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdXNoX2ZpbGVfc3JjX2NsYXNzX2luaXQgKEdzdFB1c2hGaWxlU3JjQ2xhc3MgKiBnX2NsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGdfY2xhc3MpOworICBlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGdfY2xhc3MpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChwdXNoZmlsZXNyY19kZWJ1ZywgInB1c2hmaWxlc3JjIiwgMCwKKyAgICAgICJwdXNoZmlsZXNyYyBlbGVtZW50Iik7CisKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9wdXNoX2ZpbGVfc3JjX2Rpc3Bvc2U7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9wdXNoX2ZpbGVfc3JjX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3B1c2hfZmlsZV9zcmNfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTE9DQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibG9jYXRpb24iLCAiRmlsZSBMb2NhdGlvbiIsCisgICAgICAgICAgIkxvY2F0aW9uIG9mIHRoZSBmaWxlIHRvIHJlYWQiLCBOVUxMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8CisgICAgICAgICAgR1NUX1BBUkFNX01VVEFCTEVfUkVBRFkpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RJTUVfU0VHTUVOVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgidGltZS1zZWdtZW50IiwgIlRpbWUgU2VnbWVudCIsCisgICAgICAgICAgIkVtaXQgVElNRSBTRUdNRU5UUyIsIERFRkFVTFRfVElNRV9TRUdNRU5ULCBHX1BBUkFNX1JFQURXUklURSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU1RSRUFNX1RJTUUsCisgICAgICBnX3BhcmFtX3NwZWNfaW50NjQgKCJzdHJlYW0tdGltZSIsICJTdHJlYW0gVGltZSIsCisgICAgICAgICAgIkluaXRpYWwgU3RyZWFtIFRpbWUgKGlmIHRpbWUtc2VnbWVudCBUUlVFKSIsIDAsIEdfTUFYSU5UNjQsCisgICAgICAgICAgREVGQVVMVF9TVFJFQU1fVElNRSwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NUQVJUX1RJTUUsCisgICAgICBnX3BhcmFtX3NwZWNfaW50NjQgKCJzdGFydC10aW1lIiwgIlN0YXJ0IFRpbWUiLAorICAgICAgICAgICJJbml0aWFsIFN0YXJ0IFRpbWUgKGlmIHRpbWUtc2VnbWVudCBUUlVFKSIsIDAsIEdfTUFYSU5UNjQsCisgICAgICAgICAgREVGQVVMVF9TVEFSVF9USU1FLCBHX1BBUkFNX1JFQURXUklURSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSU5JVElBTF9USU1FU1RBTVAsCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgiaW5pdGlhbC10aW1lc3RhbXAiLCAiSW5pdGlhbCBUaW1lc3RhbXAiLAorICAgICAgICAgICJJbml0aWFsIEJ1ZmZlciBUaW1lc3RhbXAgKGlmIHRpbWUtc2VnbWVudCBUUlVFKSIsIDAsIEdfTUFYVUlOVDY0LAorICAgICAgICAgIERFRkFVTFRfSU5JVElBTF9USU1FU1RBTVAsIEdfUEFSQU1fUkVBRFdSSVRFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SQVRFLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoInJhdGUiLCAiUmF0ZSIsICJSYXRlIHRvIHVzZSBpbiBUSU1FIFNFR01FTlQiLAorICAgICAgICAgIEdfTUlORE9VQkxFLCBHX01BWERPVUJMRSwgREVGQVVMVF9SQVRFLCBHX1BBUkFNX1JFQURXUklURSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQVBQTElFRF9SQVRFLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImFwcGxpZWQtcmF0ZSIsICJBcHBsaWVkIFJhdGUiLAorICAgICAgICAgICJBcHBsaWVkIHJhdGUgdG8gdXNlIGluIFRJTUUgU0VHTUVOVCIsIEdfTUlORE9VQkxFLCBHX01BWERPVUJMRSwKKyAgICAgICAgICBERUZBVUxUX0FQUExJRURfUkFURSwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiUHVzaCBGaWxlIFNvdXJjZSIsCisgICAgICAiVGVzdGluZyIsCisgICAgICAiSW1wbGVtZW50cyBwdXNoZmlsZTovLyBVUkktaGFuZGxlciBmb3IgcHVzaC1iYXNlZCBmaWxlIGFjY2VzcyIsCisgICAgICAiVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdXNoX2ZpbGVfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RQdXNoRmlsZVNyYyAqc3JjID0gKEdzdFB1c2hGaWxlU3JjICopIG9iamVjdDsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTE9DQVRJT046CisgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChzcmMtPmZpbGVzcmMpLCAibG9jYXRpb24iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVElNRV9TRUdNRU5UOgorICAgICAgc3JjLT50aW1lX3NlZ21lbnQgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1RSRUFNX1RJTUU6CisgICAgICBzcmMtPnN0cmVhbV90aW1lID0gZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVEFSVF9USU1FOgorICAgICAgc3JjLT5zdGFydF90aW1lID0gZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTklUSUFMX1RJTUVTVEFNUDoKKyAgICAgIHNyYy0+aW5pdGlhbF90aW1lc3RhbXAgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SQVRFOgorICAgICAgc3JjLT5yYXRlID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQVBQTElFRF9SQVRFOgorICAgICAgc3JjLT5hcHBsaWVkX3JhdGUgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9wdXNoX2ZpbGVfc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RQdXNoRmlsZVNyYyAqc3JjID0gKEdzdFB1c2hGaWxlU3JjICopIG9iamVjdDsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTE9DQVRJT046CisgICAgICBnX29iamVjdF9nZXRfcHJvcGVydHkgKEdfT0JKRUNUIChzcmMtPmZpbGVzcmMpLCAibG9jYXRpb24iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVElNRV9TRUdNRU5UOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNyYy0+dGltZV9zZWdtZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVFJFQU1fVElNRToKKyAgICAgIGdfdmFsdWVfc2V0X2ludDY0ICh2YWx1ZSwgc3JjLT5zdHJlYW1fdGltZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1RBUlRfVElNRToKKyAgICAgIGdfdmFsdWVfc2V0X2ludDY0ICh2YWx1ZSwgc3JjLT5zdGFydF90aW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTklUSUFMX1RJTUVTVEFNUDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHNyYy0+aW5pdGlhbF90aW1lc3RhbXApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JBVEU6CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBzcmMtPnJhdGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FQUExJRURfUkFURToKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIHNyYy0+YXBwbGllZF9yYXRlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdFBhZFByb2JlUmV0dXJuCitnc3RfcHVzaF9maWxlX3NyY19naG9zdHBhZF9idWZmZXJfcHJvYmUgKEdzdFBhZCAqIHBhZCwgR3N0UGFkUHJvYmVJbmZvICogaW5mbywKKyAgICBHc3RQdXNoRmlsZVNyYyAqIHNyYykKK3sKKyAgR3N0QnVmZmVyICpidWZmZXIgPSBHU1RfUEFEX1BST0JFX0lORk9fQlVGRkVSIChpbmZvKTsKKworICBpZiAoc3JjLT50aW1lX3NlZ21lbnQgJiYgIXNyYy0+c2Vlbl9maXJzdF9idWZmZXIpIHsKKyAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSA9IHNyYy0+aW5pdGlhbF90aW1lc3RhbXA7CisgICAgc3JjLT5zZWVuX2ZpcnN0X2J1ZmZlciA9IFRSVUU7CisgIH0KKyAgcmV0dXJuIEdTVF9QQURfUFJPQkVfT0s7Cit9CisKK3N0YXRpYyBHc3RQYWRQcm9iZVJldHVybgorZ3N0X3B1c2hfZmlsZV9zcmNfZ2hvc3RwYWRfZXZlbnRfcHJvYmUgKEdzdFBhZCAqIHBhZCwgR3N0UGFkUHJvYmVJbmZvICogaW5mbywKKyAgICBHc3RQdXNoRmlsZVNyYyAqIHNyYykKK3sKKyAgR3N0RXZlbnQgKmV2ZW50ID0gR1NUX1BBRF9QUk9CRV9JTkZPX0VWRU5UIChpbmZvKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgIHsKKyAgICAgIGlmIChzcmMtPnRpbWVfc2VnbWVudCkgeworICAgICAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgICAgICAgIEdzdEV2ZW50ICpyZXBsYWNlbWVudDsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiUmVwbGFjaW5nIG91dGdvaW5nIHNlZ21lbnQgd2l0aCBUSU1FIFNFR01FTlQiKTsKKyAgICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgICAgICAgIHNlZ21lbnQuc3RhcnQgPSBzcmMtPnN0YXJ0X3RpbWU7CisgICAgICAgIHNlZ21lbnQudGltZSA9IHNyYy0+c3RyZWFtX3RpbWU7CisgICAgICAgIHNlZ21lbnQucmF0ZSA9IHNyYy0+cmF0ZTsKKyAgICAgICAgc2VnbWVudC5hcHBsaWVkX3JhdGUgPSBzcmMtPmFwcGxpZWRfcmF0ZTsKKyAgICAgICAgcmVwbGFjZW1lbnQgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KTsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIEdTVF9QQURfUFJPQkVfSU5GT19EQVRBIChpbmZvKSA9IHJlcGxhY2VtZW50OworICAgICAgfQorICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIEdTVF9QQURfUFJPQkVfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3B1c2hfZmlsZV9zcmNfZ2hvc3RwYWRfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFB1c2hGaWxlU3JjICpzcmMgPSAoR3N0UHVzaEZpbGVTcmMgKikgcGFyZW50OworICBnYm9vbGVhbiByZXQ7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICAgIGlmIChzcmMtPnRpbWVfc2VnbWVudCkgeworICAgICAgICAvKiBXaGVuIHdvcmtpbmcgaW4gdGltZSB3ZSBkb24ndCBhbGxvdyBzZWVrcyAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJSZWZ1c2luZyBzZWVrIGV2ZW50IGluIFRJTUUgbW9kZSIpOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLyogUEFTU1RIUk9VR0ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wdXNoX2ZpbGVfc3JjX2dob3N0cGFkX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RQdXNoRmlsZVNyYyAqc3JjID0gKEdzdFB1c2hGaWxlU3JjICopIHBhcmVudDsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX1NDSEVEVUxJTkc6CisgICAgICAvKiBXaGVuIHdvcmtpbmcgaW4gdGltZSB3ZSBkb24ndCBhbGxvdyBzZWVrcyAqLworICAgICAgaWYgKHNyYy0+dGltZV9zZWdtZW50KQorICAgICAgICBnc3RfcXVlcnlfc2V0X3NjaGVkdWxpbmcgKHF1ZXJ5LCBHU1RfU0NIRURVTElOR19GTEFHX1NFUVVFTlRJQUwsIDEsIC0xLAorICAgICAgICAgICAgMCk7CisgICAgICBlbHNlCisgICAgICAgIGdzdF9xdWVyeV9zZXRfc2NoZWR1bGluZyAocXVlcnksIEdTVF9TQ0hFRFVMSU5HX0ZMQUdfU0VFS0FCTEUsIDEsIC0xLAorICAgICAgICAgICAgMCk7CisgICAgICBnc3RfcXVlcnlfYWRkX3NjaGVkdWxpbmdfbW9kZSAocXVlcnksIEdTVF9QQURfTU9ERV9QVVNIKTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdXNoX2ZpbGVfc3JjX2luaXQgKEdzdFB1c2hGaWxlU3JjICogc3JjKQoreworICBzcmMtPnRpbWVfc2VnbWVudCA9IERFRkFVTFRfVElNRV9TRUdNRU5UOworICBzcmMtPnN0cmVhbV90aW1lID0gREVGQVVMVF9TVFJFQU1fVElNRTsKKyAgc3JjLT5zdGFydF90aW1lID0gREVGQVVMVF9TVEFSVF9USU1FOworICBzcmMtPmluaXRpYWxfdGltZXN0YW1wID0gREVGQVVMVF9JTklUSUFMX1RJTUVTVEFNUDsKKyAgc3JjLT5yYXRlID0gREVGQVVMVF9SQVRFOworICBzcmMtPmFwcGxpZWRfcmF0ZSA9IERFRkFVTFRfQVBQTElFRF9SQVRFOworICBzcmMtPnNlZW5fZmlyc3RfYnVmZmVyID0gRkFMU0U7CisKKyAgc3JjLT5maWxlc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmlsZXNyYyIsICJyZWFsLWZpbGVzcmMiKTsKKyAgaWYgKHNyYy0+ZmlsZXNyYykgeworICAgIEdzdFBhZCAqcGFkOworCisgICAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHNyYyksIHNyYy0+ZmlsZXNyYyk7CisgICAgcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNyYy0+ZmlsZXNyYywgInNyYyIpOworICAgIGdfYXNzZXJ0IChwYWQgIT0gTlVMTCk7CisgICAgc3JjLT5zcmNwYWQgPSBnc3RfZ2hvc3RfcGFkX25ldyAoInNyYyIsIHBhZCk7CisgICAgLyogRklYTUVeSF5IQ09SRTogdHJ5IHB1c2hmaWxlOi8vL2Zvby9iYXIuZXh0ICEgdHlwZWZpbmQgISBmYWtlc2luayB3aXRob3V0CisgICAgICogdGhpcyBhbmQgd2F0Y2ggY29yZSBidWdnaW5lc3MgKHNvbWUgcGFkIHN0YXlzIGluIGZsdXNoaW5nIHN0YXRlKSAqLworICAgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChzcmMtPnNyY3BhZCwKKyAgICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wdXNoX2ZpbGVfc3JjX2dob3N0cGFkX3F1ZXJ5KSk7CisgICAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHNyYy0+c3JjcGFkLAorICAgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3B1c2hfZmlsZV9zcmNfZ2hvc3RwYWRfZXZlbnQpKTsKKyAgICAvKiBBZGQgb3V0Z29pbmcgZXZlbnQgcHJvYmUgdG8gcmVwbGFjZSBzZWdtZW50IGFuZCBidWZmZXIgdGltZXN0YW1wICovCisgICAgZ3N0X3BhZF9hZGRfcHJvYmUgKHNyYy0+c3JjcGFkLCBHU1RfUEFEX1BST0JFX1RZUEVfRVZFTlRfRE9XTlNUUkVBTSwKKyAgICAgICAgKEdzdFBhZFByb2JlQ2FsbGJhY2spIGdzdF9wdXNoX2ZpbGVfc3JjX2dob3N0cGFkX2V2ZW50X3Byb2JlLAorICAgICAgICBzcmMsIE5VTEwpOworICAgIGdzdF9wYWRfYWRkX3Byb2JlIChzcmMtPnNyY3BhZCwgR1NUX1BBRF9QUk9CRV9UWVBFX0JVRkZFUiwKKyAgICAgICAgKEdzdFBhZFByb2JlQ2FsbGJhY2spIGdzdF9wdXNoX2ZpbGVfc3JjX2dob3N0cGFkX2J1ZmZlcl9wcm9iZSwKKyAgICAgICAgc3JjLCBOVUxMKTsKKyAgICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoc3JjKSwgc3JjLT5zcmNwYWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisgIH0KK30KKworLyoqKiBHU1RVUklIQU5ETEVSIElOVEVSRkFDRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgR3N0VVJJVHlwZQorZ3N0X3B1c2hfZmlsZV9zcmNfdXJpX2dldF90eXBlIChHVHlwZSB0eXBlKQoreworICByZXR1cm4gR1NUX1VSSV9TUkM7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqY29uc3QgKgorZ3N0X3B1c2hfZmlsZV9zcmNfdXJpX2dldF9wcm90b2NvbHMgKEdUeXBlIHR5cGUpCit7CisgIHN0YXRpYyBjb25zdCBnY2hhciAqcHJvdG9jb2xzW10gPSB7ICJwdXNoZmlsZSIsIE5VTEwgfTsKKworICByZXR1cm4gcHJvdG9jb2xzOworfQorCitzdGF0aWMgZ2NoYXIgKgorZ3N0X3B1c2hfZmlsZV9zcmNfdXJpX2dldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyKQoreworICBHc3RQdXNoRmlsZVNyYyAqc3JjID0gR1NUX1BVU0hfRklMRV9TUkMgKGhhbmRsZXIpOworICBnY2hhciAqZmlsZXVyaSwgKnB1c2hmaWxldXJpOworCisgIGlmIChzcmMtPmZpbGVzcmMgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBmaWxldXJpID0gZ3N0X3VyaV9oYW5kbGVyX2dldF91cmkgKEdTVF9VUklfSEFORExFUiAoc3JjLT5maWxlc3JjKSk7CisgIGlmIChmaWxldXJpID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIHB1c2hmaWxldXJpID0gZ19zdHJjb25jYXQgKCJwdXNoIiwgZmlsZXVyaSwgTlVMTCk7CisgIGdfZnJlZSAoZmlsZXVyaSk7CisKKyAgcmV0dXJuIHB1c2hmaWxldXJpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wdXNoX2ZpbGVfc3JjX3VyaV9zZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlciwgY29uc3QgZ2NoYXIgKiB1cmksCisgICAgR0Vycm9yICoqIGVycm9yKQoreworICBHc3RQdXNoRmlsZVNyYyAqc3JjID0gR1NUX1BVU0hfRklMRV9TUkMgKGhhbmRsZXIpOworCisgIGlmIChzcmMtPmZpbGVzcmMgPT0gTlVMTCkgeworICAgIGdfc2V0X2Vycm9yX2xpdGVyYWwgKGVycm9yLCBHU1RfVVJJX0VSUk9SLCBHU1RfVVJJX0VSUk9SX0JBRF9TVEFURSwKKyAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgZmlsZSBzb3VyY2UgZWxlbWVudCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIHNraXAgJ3B1c2gnIGJpdCAqLworICByZXR1cm4gZ3N0X3VyaV9oYW5kbGVyX3NldF91cmkgKEdTVF9VUklfSEFORExFUiAoc3JjLT5maWxlc3JjKSwgdXJpICsgNCwKKyAgICAgIGVycm9yKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wdXNoX2ZpbGVfc3JjX3VyaV9oYW5kbGVyX2luaXQgKGdwb2ludGVyIGdfaWZhY2UsIGdwb2ludGVyIGlmYWNlX2RhdGEpCit7CisgIEdzdFVSSUhhbmRsZXJJbnRlcmZhY2UgKmlmYWNlID0gKEdzdFVSSUhhbmRsZXJJbnRlcmZhY2UgKikgZ19pZmFjZTsKKworICBpZmFjZS0+Z2V0X3R5cGUgPSBnc3RfcHVzaF9maWxlX3NyY191cmlfZ2V0X3R5cGU7CisgIGlmYWNlLT5nZXRfcHJvdG9jb2xzID0gZ3N0X3B1c2hfZmlsZV9zcmNfdXJpX2dldF9wcm90b2NvbHM7CisgIGlmYWNlLT5nZXRfdXJpID0gZ3N0X3B1c2hfZmlsZV9zcmNfdXJpX2dldF91cmk7CisgIGlmYWNlLT5zZXRfdXJpID0gZ3N0X3B1c2hfZmlsZV9zcmNfdXJpX3NldF91cmk7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3RwdXNoZmlsZXNyYy5oIGIvZ3N0L2RlYnVndXRpbHMvZ3N0cHVzaGZpbGVzcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODJhZTEzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlYnVndXRpbHMvZ3N0cHVzaGZpbGVzcmMuaApAQCAtMCwwICsxLDY0IEBACisvKiBHU3RyZWFtZXIgUHVzaCBGaWxlIFNvdXJjZQorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1BVU0hfRklMRV9TUkNfSF9fCisjZGVmaW5lIF9fR1NUX1BVU0hfRklMRV9TUkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0YmluLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfUFVTSF9GSUxFX1NSQyBcCisgIChnc3RfcHVzaF9maWxlX3NyY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUFVTSF9GSUxFX1NSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1BVU0hfRklMRV9TUkMsR3N0UHVzaEZpbGVTcmMpKQorI2RlZmluZSBHU1RfUFVTSF9GSUxFX1NSQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9QVVNIX0ZJTEVfU1JDLEdzdFB1c2hGaWxlU3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUFVTSF9GSUxFX1NSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1BVU0hfRklMRV9TUkMpKQorI2RlZmluZSBHU1RfSVNfUFVTSF9GSUxFX1NSQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9QVVNIX0ZJTEVfU1JDKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RQdXNoRmlsZVNyYyBHc3RQdXNoRmlsZVNyYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RQdXNoRmlsZVNyY0NsYXNzIEdzdFB1c2hGaWxlU3JjQ2xhc3M7CisKK3N0cnVjdCBfR3N0UHVzaEZpbGVTcmMKK3sKKyAgR3N0QmluIHBhcmVudDsKKworICAvKjwgcHJpdmF0ZSA+ICovCisgIEdzdEVsZW1lbnQgKmZpbGVzcmM7CisgIEdzdFBhZCAqc3JjcGFkOworCisgIGdib29sZWFuIHRpbWVfc2VnbWVudDsKKyAgZ2Jvb2xlYW4gc2Vlbl9maXJzdF9idWZmZXI7CisgIGdpbnQ2NCBzdHJlYW1fdGltZTsKKyAgZ2ludDY0IHN0YXJ0X3RpbWU7CisgIGd1aW50NjQgaW5pdGlhbF90aW1lc3RhbXA7CisgIGdkb3VibGUgcmF0ZTsKKyAgZ2RvdWJsZSBhcHBsaWVkX3JhdGU7Cit9OworCitzdHJ1Y3QgX0dzdFB1c2hGaWxlU3JjQ2xhc3MKK3sKKyAgR3N0QmluQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3B1c2hfZmlsZV9zcmNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1BVU0hfRklMRV9TUkNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYyBiL2dzdC9kZWJ1Z3V0aWxzL2dzdHRhZ2luamVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZGI3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuYwpAQCAtMCwwICsxLDIwMyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIGdzdHRhZ2luamVjdC5jOgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC10YWdpbmplY3QKKyAqCisgKiBFbGVtZW50IHRoYXQgaW5qZWN0cyBuZXcgbWV0YWRhdGEgdGFncywgYnV0IHBhc3NlcyBpbmNvbW1pbmcgZGF0YSB0aHJvdWdoCisgKiB1bm1vZGlmaWVkLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjIG51bS1idWZmZXJzPTEwMCAhIHRhZ2luamVjdCB0YWdzPSJ0aXRsZT10ZXN0c3JjLGFydGlzdD1nc3RyZWFtZXIiICEgdm9yYmlzZW5jICEgb2dnbXV4ICEgZmlsZXNpbmsgbG9jYXRpb249dGVzdC5vZ2cKKyAqIF18IHNldCB0aXRsZSBhbmQgYXJ0aXN0CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjIG51bS1idWZmZXJzPTEwMCAhIHRhZ2luamVjdCB0YWdzPSJrZXl3b3Jkcz1ce1widGVzdG9uZVwiLFwiYXVkaW9cIlx9LHRpdGxlPVwiYXVkaW9cIHRlc3R0b25lXCIiICEgdm9yYmlzZW5jICEgb2dnbXV4ICEgZmlsZXNpbmsgbG9jYXRpb249dGVzdC5vZ2cKKyAqIF18IHNldCBrZXl3b3JkcyBhbmQgdGl0bGUgZGVtb25zdHJhdGluZyBxdW90aW5nIG9mIHNwZWNpYWwgY2hhcnMgYW5kIGhhbmRsaW5nIGxpc3RzCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnc3R0YWdpbmplY3QuaCIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF90YWdfaW5qZWN0X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF90YWdfaW5qZWN0X2RlYnVnCisKK2VudW0KK3sKKyAgUFJPUF9UQUdTID0gMQorfTsKKworCisjZGVmaW5lIGdzdF90YWdfaW5qZWN0X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFRhZ0luamVjdCwgZ3N0X3RhZ19pbmplY3QsIEdTVF9UWVBFX0JBU0VfVFJBTlNGT1JNKTsKKworc3RhdGljIHZvaWQgZ3N0X3RhZ19pbmplY3RfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X3RhZ19pbmplY3Rfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3RhZ19pbmplY3RfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfdGFnX2luamVjdF90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RCdWZmZXIgKiBidWYpOworc3RhdGljIGdib29sZWFuIGdzdF90YWdfaW5qZWN0X3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpOworCisKK3N0YXRpYyB2b2lkCitnc3RfdGFnX2luamVjdF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0VGFnSW5qZWN0ICpzZWxmID0gR1NUX1RBR19JTkpFQ1QgKG9iamVjdCk7CisKKyAgaWYgKHNlbGYtPnRhZ3MpIHsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHNlbGYtPnRhZ3MpOworICAgIHNlbGYtPnRhZ3MgPSBOVUxMOworICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3RhZ19pbmplY3RfY2xhc3NfaW5pdCAoR3N0VGFnSW5qZWN0Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqZ3N0YmFzZXRyYW5zX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzID0gR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChrbGFzcyk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF90YWdfaW5qZWN0X2RlYnVnLCAidGFnaW5qZWN0IiwgMCwKKyAgICAgICJ0YWcgaW5qZWN0IGVsZW1lbnQiKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdGFnX2luamVjdF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF90YWdfaW5qZWN0X2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RBR1MsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgidGFncyIsICJ0YWdsaXN0IiwKKyAgICAgICAgICAiTGlzdCBvZiB0YWdzIHRvIGluamVjdCBpbnRvIHRoZSB0YXJnZXQgZmlsZSIsCisgICAgICAgICAgTlVMTCwgR19QQVJBTV9XUklUQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF90YWdfaW5qZWN0X2ZpbmFsaXplOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiVGFnSW5qZWN0IiwKKyAgICAgICJHZW5lcmljIiwgImluamVjdCBtZXRhZGF0YSB0YWdzIiwgIlN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4iKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmN0ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua3RlbXBsYXRlKTsKKworICBnc3RiYXNldHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3RhZ19pbmplY3RfdHJhbnNmb3JtX2lwKTsKKworICBnc3RiYXNldHJhbnNfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF90YWdfaW5qZWN0X3N0YXJ0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF90YWdfaW5qZWN0X2luaXQgKEdzdFRhZ0luamVjdCAqIHNlbGYpCit7CisgIEdzdEJhc2VUcmFuc2Zvcm0gKnRyYW5zID0gR1NUX0JBU0VfVFJBTlNGT1JNIChzZWxmKTsKKworICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X2dhcF9hd2FyZSAodHJhbnMsIFRSVUUpOworCisgIHNlbGYtPnRhZ3MgPSBOVUxMOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3RhZ19pbmplY3RfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0VGFnSW5qZWN0ICpzZWxmID0gR1NUX1RBR19JTkpFQ1QgKHRyYW5zKTsKKworICBpZiAoR19VTkxJS0VMWSAoIXNlbGYtPnRhZ3Nfc2VudCkpIHsKKyAgICBzZWxmLT50YWdzX3NlbnQgPSBUUlVFOworICAgIC8qIHNlbmQgdGFncyAqLworICAgIGlmIChzZWxmLT50YWdzICYmICFnc3RfdGFnX2xpc3RfaXNfZW1wdHkgKHNlbGYtPnRhZ3MpKSB7CisgICAgICBHU1RfREVCVUcgKCJ0YWcgZXZlbnQgOiUiIEdTVF9QVFJfRk9STUFULCBzZWxmLT50YWdzKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoR1NUX0JBU0VfVFJBTlNGT1JNX1NSQ19QQUQgKHRyYW5zKSwKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X3RhZyAoZ3N0X3RhZ19saXN0X3JlZiAoc2VsZi0+dGFncykpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdGFnX2luamVjdF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VGFnSW5qZWN0ICpzZWxmID0gR1NUX1RBR19JTkpFQ1QgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1RBR1M6eworICAgICAgZ2NoYXIgKnN0cnVjdHVyZSA9CisgICAgICAgICAgZ19zdHJkdXBfcHJpbnRmICgidGFnbGlzdCwlcyIsIGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKKyAgICAgIGlmICghKHNlbGYtPnRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2Zyb21fc3RyaW5nIChzdHJ1Y3R1cmUpKSkgeworICAgICAgICBHU1RfV0FSTklORyAoInVucGFyc2FibGUgdGFnbGlzdCA9ICclcyciLCBzdHJ1Y3R1cmUpOworICAgICAgfQorCisgICAgICAvKiBtYWtlIHN1cmUgdGhhdCB0YWdzIHdpbGwgYmUgc2VuZCAqLworICAgICAgc2VsZi0+dGFnc19zZW50ID0gRkFMU0U7CisgICAgICBnX2ZyZWUgKHN0cnVjdHVyZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3RhZ19pbmplY3RfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIC8qR3N0VGFnSW5qZWN0ICpzZWxmID0gR1NUX1RBR19JTkpFQ1QgKG9iamVjdCk7ICovCisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF90YWdfaW5qZWN0X3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpCit7CisgIEdzdFRhZ0luamVjdCAqc2VsZiA9IEdTVF9UQUdfSU5KRUNUICh0cmFucyk7CisKKyAgLyogd2UgbmVlZCB0byBzZW50IHRhZ3MgX3RyYW5zZm9ybV9pcCgpIG9uY2UgKi8KKyAgc2VsZi0+dGFnc19zZW50ID0gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuaCBiL2dzdC9kZWJ1Z3V0aWxzL2dzdHRhZ2luamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NDU5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVidWd1dGlscy9nc3R0YWdpbmplY3QuaApAQCAtMCwwICsxLDY2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKgorICogZ3N0dGFnaW5qZWN0Lmg6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1RBR19JTkpFQ1RfSF9fCisjZGVmaW5lIF9fR1NUX1RBR19JTkpFQ1RfSF9fCisKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfVEFHX0lOSkVDVCBcCisgIChnc3RfdGFnX2luamVjdF9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfVEFHX0lOSkVDVChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1RBR19JTkpFQ1QsR3N0VGFnSW5qZWN0KSkKKyNkZWZpbmUgR1NUX1RBR19JTkpFQ1RfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVEFHX0lOSkVDVCxHc3RUYWdJbmplY3RDbGFzcykpCisjZGVmaW5lIEdTVF9JU19UQUdfSU5KRUNUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVEFHX0lOSkVDVCkpCisjZGVmaW5lIEdTVF9JU19UQUdfSU5KRUNUX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1RBR19JTkpFQ1QpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFRhZ0luamVjdCBHc3RUYWdJbmplY3Q7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VGFnSW5qZWN0Q2xhc3MgR3N0VGFnSW5qZWN0Q2xhc3M7CisKKy8qKgorICogR3N0VGFnSW5qZWN0OgorICoKKyAqIE9wYXF1ZSAjR3N0VGFnSW5qZWN0IGRhdGEgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBfR3N0VGFnSW5qZWN0Cit7CisgIEdzdEJhc2VUcmFuc2Zvcm0gZWxlbWVudDsKKworICAvKjwgcHJpdmF0ZSA+ICovCisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisgIGdib29sZWFuIHRhZ3Nfc2VudDsKK307CisKK3N0cnVjdCBfR3N0VGFnSW5qZWN0Q2xhc3MKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF90YWdfaW5qZWN0X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9UQUdfSU5KRUNUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2RlYnVndXRpbHMvbWVzb24uYnVpbGQgYi9nc3QvZGVidWd1dGlscy9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTgwNTc3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlYnVndXRpbHMvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwyNyBAQAorZ3N0bmF2aWdhdGlvbnRlc3QgPSBsaWJyYXJ5KCdnc3RuYXZpZ2F0aW9udGVzdCcsCisgICdnc3RuYXZpZ2F0aW9udGVzdC5jJywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0dmlkZW9fZGVwLCBsaWJtXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKKworZ3N0ZGVidWcgPSBsaWJyYXJ5KCdnc3RkZWJ1ZycsCisgICdnc3RkZWJ1Zy5jJywKKyAgJ2JyZWFrbXlkYXRhLmMnLAorICAnZ3N0Y2Fwc3NldHRlci5jJywKKyAgJ2dzdG5hdnNlZWsuYycsCisgICdnc3RwdXNoZmlsZXNyYy5jJywKKyAgJ2dzdHRhZ2luamVjdC5jJywKKyAgJ3JuZGJ1ZmZlcnNpemUuYycsCisgICdwcm9ncmVzc3JlcG9ydC5jJywKKyAgJ3Rlc3RzLmMnLAorICAnY3B1cmVwb3J0LmMnLAorICAndGVzdHBsdWdpbi5jJywKKyAgY19hcmdzOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdF9kZXAsIGdzdGJhc2VfZGVwLCBnc3R2aWRlb19kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L2RlYnVndXRpbHMvcHJvZ3Jlc3NyZXBvcnQuYyBiL2dzdC9kZWJ1Z3V0aWxzL3Byb2dyZXNzcmVwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2YmYwZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWJ1Z3V0aWxzL3Byb2dyZXNzcmVwb3J0LmMKQEAgLTAsMCArMSw1MjEgQEAKKy8qIEdTdHJlYW1lciBQcm9ncmVzcyBSZXBvcnQgRWxlbWVudAorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSA8MjAwND4gSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXByb2dyZXNzcmVwb3J0CisgKgorICogVGhlIHByb2dyZXNzcmVwb3J0IGVsZW1lbnQgY2FuIGJlIHB1dCBpbnRvIGEgcGlwZWxpbmUgdG8gcmVwb3J0IHByb2dyZXNzLAorICogd2hpY2ggaXMgZG9uZSBieSBkb2luZyB1cHN0cmVhbSBkdXJhdGlvbiBhbmQgcG9zaXRpb24gcXVlcmllcyBpbiByZWd1bGFyCisgKiAocmVhbC10aW1lKSBpbnRlcnZhbHMuIEJvdGggdGhlIGludGVydmFsIGFuZCB0aGUgcHJlZmVyZWQgcXVlcnkgZm9ybWF0CisgKiBjYW4gYmUgc3BlY2lmaWVkIHZpYSB0aGUgI0dzdFByb2dyZXNzUmVwb3J0OnVwZGF0ZS1mcmVxIGFuZCB0aGUKKyAqICNHc3RQcm9ncmVzc1JlcG9ydDpmb3JtYXQgcHJvcGVydHkuCisgKgorICogRWxlbWVudCBtZXNzYWdlcyBjb250YWluaW5nIGEgInByb2dyZXNzIiBzdHJ1Y3R1cmUgYXJlIHBvc3RlZCBvbiB0aGUgYnVzCisgKiB3aGVuZXZlciBwcm9ncmVzcyBoYXMgYmVlbiBxdWVyaWVkIChzaW5jZSBnc3QtcGx1Z2lucy1nb29kIDAuMTAuNiBvbmx5KS4KKyAqCisgKiBTaW5jZSB0aGUgZWxlbWVudCB3YXMgb3JpZ2luYWxseSBkZXNpZ25lZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBpdCB3aWxsCisgKiBieSBkZWZhdWx0IGFsc28gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgcHJvZ3Jlc3MgdG8gdGhlCisgKiB0ZXJtaW5hbC4gVGhpcyBjYW4gYmUgcHJldmVudGVkIGJ5IHNldHRpbmcgdGhlICNHc3RQcm9ncmVzc1JlcG9ydDpzaWxlbnQKKyAqIHByb3BlcnR5IHRvICVUUlVFLgorICoKKyAqIFRoaXMgZWxlbWVudCBpcyBtb3N0IHVzZWZ1bCBpbiB0cmFuc2NvZGluZyBwaXBlbGluZXMgb3Igb3RoZXIgc2l0dWF0aW9ucworICogd2hlcmUganVzdCBxdWVyeWluZyB0aGUgcGlwZWxpbmUgbWlnaHQgbm90IGxlYWQgdG8gdGhlIHdhbnRlZCByZXN1bHQuIEZvcgorICogcHJvZ3Jlc3MgaW4gVElNRSBmb3JtYXQsIHRoZSBlbGVtZW50IGlzIGJlc3QgcGxhY2VkIGluIGEgJ3JhdyBzdHJlYW0nCisgKiBzZWN0aW9uIG9mIHRoZSBwaXBlbGluZSAob3IgYWZ0ZXIgYW55IGRlbXV4ZXJzL2RlY29kZXJzL3BhcnNlcnMpLgorICoKKyAqIFRocmVlIG1vcmUgdGhpbmdzIHNob3VsZCBiZSBwb2ludGVkIG91dDogZmlyc3RseSwgdGhlIGVsZW1lbnQgd2lsbCBvbmx5CisgKiBxdWVyeSBwcm9ncmVzcyB3aGVuIGRhdGEgZmxvdyBoYXBwZW5zLiBJZiBkYXRhIGZsb3cgaXMgc3RhbGxlZCBmb3Igc29tZQorICogcmVhc29uLCBubyBwcm9ncmVzcyBtZXNzYWdlcyB3aWxsIGJlIHBvc3RlZC4gU2Vjb25kbHksIHRoZXJlIGFyZSBvdGhlcgorICogZWxlbWVudHMgKGxpa2UgcXRkZW11eCwgZm9yIGV4YW1wbGUpIHRoYXQgbWF5IGFsc28gcG9zdCAicHJvZ3Jlc3MiIGVsZW1lbnQKKyAqIG1lc3NhZ2VzIG9uIHRoZSBidXMuIEFwcGxpY2F0aW9ucyBzaG91bGQgY2hlY2sgdGhlIHNvdXJjZSBvZiBhbnkgZWxlbWVudAorICogbWVzc2FnZXMgdGhleSByZWNlaXZlLCBpZiBuZWVkZWQuIEZpbmFsbHksIGFwcGxpY2F0aW9ucyBzaG91bGQgbm90IHRha2UKKyAqIGFjdGlvbiBvbiByZWNlaXZpbmcgbm90aWZpY2F0aW9uIG9mIHByb2dyZXNzIGJlaW5nIDEwMCUsIHRoZXkgc2hvdWxkIG9ubHkKKyAqIHRha2UgYWN0aW9uIHdoZW4gdGhleSByZWNlaXZlIGFuIEVPUyBtZXNzYWdlIChzaW5jZSB0aGUgcHJvZ3Jlc3MgcmVwb3J0ZWQKKyAqIGlzIGluIHJlZmVyZW5jZSB0byBhbiBpbnRlcm5hbCBwb2ludCBvZiBhIHBpcGVsaW5lIGFuZCBub3QgdGhlIHBpcGVsaW5lIGFzCisgKiBhIHdob2xlKS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLW0gZmlsZXNyYyBsb2NhdGlvbj1mb28ub2dnICEgZGVjb2RlYmluICEgcHJvZ3Jlc3NyZXBvcnQgdXBkYXRlLWZyZXE9MSAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rCisgKiBdfCBUaGlzIHNob3dzIGEgcHJvZ3Jlc3MgcXVlcnkgd2hlcmUgYSBkdXJhdGlvbiBpcyBhdmFpbGFibGUuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLW0gYXVkaW90ZXN0c3JjICEgcHJvZ3Jlc3NyZXBvcnQgdXBkYXRlLWZyZXE9MSAhIGF1ZGlvY29udmVydCAhIGF1dG9hdWRpb3NpbmsKKyAqIF18IFRoaXMgc2hvd3MgYSBwcm9ncmVzcyBxdWVyeSB3aGVyZSBubyBkdXJhdGlvbiBpcyBhdmFpbGFibGUuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAicHJvZ3Jlc3NyZXBvcnQuaCIKKworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9VUERBVEVfRlJFUSwKKyAgUFJPUF9TSUxFTlQsCisgIFBST1BfRE9fUVVFUlksCisgIFBST1BfRk9STUFUCit9OworCitHc3RTdGF0aWNQYWRUZW1wbGF0ZSBwcm9ncmVzc19yZXBvcnRfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgcHJvZ3Jlc3NfcmVwb3J0X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKKyNkZWZpbmUgREVGQVVMVF9VUERBVEVfRlJFUSAgNQorI2RlZmluZSBERUZBVUxUX1NJTEVOVCAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX0RPX1FVRVJZICAgICBUUlVFCisjZGVmaW5lIERFRkFVTFRfRk9STUFUICAgICAgICJhdXRvIgorCitzdGF0aWMgdm9pZCBnc3RfcHJvZ3Jlc3NfcmVwb3J0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9wcm9ncmVzc19yZXBvcnRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Byb2dyZXNzX3JlcG9ydF9zaW5rX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcHJvZ3Jlc3NfcmVwb3J0X3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcHJvZ3Jlc3NfcmVwb3J0X3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpOworc3RhdGljIGdib29sZWFuIGdzdF9wcm9ncmVzc19yZXBvcnRfc3RvcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKTsKKworI2RlZmluZSBnc3RfcHJvZ3Jlc3NfcmVwb3J0X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFByb2dyZXNzUmVwb3J0LCBnc3RfcHJvZ3Jlc3NfcmVwb3J0LCBHU1RfVFlQRV9CQVNFX1RSQU5TRk9STSk7CisKK3N0YXRpYyB2b2lkCitnc3RfcHJvZ3Jlc3NfcmVwb3J0X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqKQoreworICBHc3RQcm9ncmVzc1JlcG9ydCAqZmlsdGVyID0gR1NUX1BST0dSRVNTX1JFUE9SVCAob2JqKTsKKworICBnX2ZyZWUgKGZpbHRlci0+Zm9ybWF0KTsKKyAgZmlsdGVyLT5mb3JtYXQgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9wcm9ncmVzc19yZXBvcnRfY2xhc3NfaW5pdCAoR3N0UHJvZ3Jlc3NSZXBvcnRDbGFzcyAqIGdfY2xhc3MpCit7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqZ3N0YmFzZXRyYW5zX2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGdfY2xhc3MpOworICBlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGdfY2xhc3MpOworICBnc3RiYXNldHJhbnNfY2xhc3MgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKGdfY2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3Byb2dyZXNzX3JlcG9ydF9maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3Byb2dyZXNzX3JlcG9ydF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9wcm9ncmVzc19yZXBvcnRfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1VQREFURV9GUkVRLCBnX3BhcmFtX3NwZWNfaW50ICgidXBkYXRlLWZyZXEiLCAiVXBkYXRlIEZyZXF1ZW5jeSIsCisgICAgICAgICAgIk51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gcmVwb3J0cyB3aGVuIGRhdGEgaXMgZmxvd2luZyIsIDEsIEdfTUFYSU5ULAorICAgICAgICAgIERFRkFVTFRfVVBEQVRFX0ZSRVEsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1NJTEVOVCwgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzaWxlbnQiLAorICAgICAgICAgICJEbyBub3QgcHJpbnQgb3V0cHV0IHRvIHN0ZG91dCIsICJEbyBub3QgcHJpbnQgb3V0cHV0IHRvIHN0ZG91dCIsCisgICAgICAgICAgREVGQVVMVF9TSUxFTlQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0RPX1FVRVJZLCBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImRvLXF1ZXJ5IiwKKyAgICAgICAgICAiVXNlIGEgcXVlcnkgaW5zdGVhZCBvZiBidWZmZXIgbWV0YWRhdGEgdG8gZGV0ZXJtaW5lIHN0cmVhbSBwb3NpdGlvbiIsCisgICAgICAgICAgIlVzZSBhIHF1ZXJ5IGluc3RlYWQgb2YgYnVmZmVyIG1ldGFkYXRhIHRvIGRldGVybWluZSBzdHJlYW0gcG9zaXRpb24iLAorICAgICAgICAgIERFRkFVTFRfRE9fUVVFUlksIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0ZPUk1BVCwgZ19wYXJhbV9zcGVjX3N0cmluZyAoImZvcm1hdCIsICJmb3JtYXQiLAorICAgICAgICAgICJGb3JtYXQgdG8gdXNlIGZvciB0aGUgcXVlcnlpbmciLCBERUZBVUxUX0ZPUk1BVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZwcm9ncmVzc19yZXBvcnRfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJnByb2dyZXNzX3JlcG9ydF9zcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJQcm9ncmVzcyByZXBvcnQiLAorICAgICAgIlRlc3RpbmciLAorICAgICAgIlBlcmlvZGljYWxseSBxdWVyeSBhbmQgcmVwb3J0IG9uIHByb2Nlc3NpbmcgcHJvZ3Jlc3MiLAorICAgICAgIkphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPiIpOworCisgIGdzdGJhc2V0cmFuc19jbGFzcy0+c2lua19ldmVudCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Byb2dyZXNzX3JlcG9ydF9zaW5rX2V2ZW50KTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzLT50cmFuc2Zvcm1faXAgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wcm9ncmVzc19yZXBvcnRfdHJhbnNmb3JtX2lwKTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcHJvZ3Jlc3NfcmVwb3J0X3N0YXJ0KTsKKyAgZ3N0YmFzZXRyYW5zX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9wcm9ncmVzc19yZXBvcnRfc3RvcCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHJvZ3Jlc3NfcmVwb3J0X2luaXQgKEdzdFByb2dyZXNzUmVwb3J0ICogcmVwb3J0KQoreworICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X3Bhc3N0aHJvdWdoIChHU1RfQkFTRV9UUkFOU0ZPUk0gKHJlcG9ydCksIFRSVUUpOworCisgIHJlcG9ydC0+dXBkYXRlX2ZyZXEgPSBERUZBVUxUX1VQREFURV9GUkVROworICByZXBvcnQtPnNpbGVudCA9IERFRkFVTFRfU0lMRU5UOworICByZXBvcnQtPmRvX3F1ZXJ5ID0gREVGQVVMVF9ET19RVUVSWTsKKyAgcmVwb3J0LT5mb3JtYXQgPSBnX3N0cmR1cCAoREVGQVVMVF9GT1JNQVQpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Byb2dyZXNzX3JlcG9ydF9wb3N0X3Byb2dyZXNzIChHc3RQcm9ncmVzc1JlcG9ydCAqIGZpbHRlciwKKyAgICBHc3RGb3JtYXQgZm9ybWF0LCBnaW50NjQgY3VycmVudCwgZ2ludDY0IHRvdGFsKQoreworICBHc3RTdHJ1Y3R1cmUgKnMgPSBOVUxMOworCisgIGlmIChjdXJyZW50ID49IDAgJiYgdG90YWwgPiAwKSB7CisgICAgZ2RvdWJsZSBwZXJjOworCisgICAgcGVyYyA9IGdzdF91dGlsX2d1aW50NjRfdG9fZ2RvdWJsZSAoY3VycmVudCkgKiAxMDAuMCAvCisgICAgICAgIGdzdF91dGlsX2d1aW50NjRfdG9fZ2RvdWJsZSAodG90YWwpOworICAgIHBlcmMgPSBDTEFNUCAocGVyYywgMC4wLCAxMDAuMCk7CisKKyAgICAvKiB3ZSBwcm92aWRlIGEgInBlcmNlbnQiIGZpZWxkIG9mIGludGVnZXIgdHlwZSB0byBzdGF5IGNvbXBhdGlibGUKKyAgICAgKiB3aXRoIHF0ZGVtdXgsIGJ1dCBhZGQgYSBzZWNvbmQgInBlcmNlbnQtZG91YmxlIiBmaWVsZCBmb3IgdGhvc2Ugd2hvCisgICAgICogd2FudCBtb3JlIHByZWNpc2lvbiBhbmQgYXJlIHRvbyBsYXp5IHRvIGNhbGN1bGF0ZSBpdCB0aGVtc2VsdmVzICovCisgICAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgicHJvZ3Jlc3MiLCAicGVyY2VudCIsIEdfVFlQRV9JTlQsIChnaW50KSBwZXJjLAorICAgICAgICAicGVyY2VudC1kb3VibGUiLCBHX1RZUEVfRE9VQkxFLCBwZXJjLCAiY3VycmVudCIsIEdfVFlQRV9JTlQ2NCwgY3VycmVudCwKKyAgICAgICAgInRvdGFsIiwgR19UWVBFX0lOVDY0LCB0b3RhbCwgTlVMTCk7CisgIH0gZWxzZSBpZiAoY3VycmVudCA+PSAwKSB7CisgICAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgicHJvZ3Jlc3MiLCAiY3VycmVudCIsIEdfVFlQRV9JTlQ2NCwgY3VycmVudCwgTlVMTCk7CisgIH0KKworICBpZiAocykgeworICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICJwb3N0aW5nIHByb2dyZXNzIG1lc3NhZ2U6ICUiIEdTVF9QVFJfRk9STUFULCBzKTsKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgImZvcm1hdCIsIEdTVF9UWVBFX0ZPUk1BVCwgZm9ybWF0LCBOVUxMKTsKKyAgICAvKiBjYW4ndCBwb3N0IGl0IHJpZ2h0IGhlcmUgYmVjYXVzZSB3ZSdyZSBob2xkaW5nIHRoZSBvYmplY3QgbG9jayAqLworICAgIGZpbHRlci0+cGVuZGluZ19tc2cgPSBnc3RfbWVzc2FnZV9uZXdfZWxlbWVudCAoR1NUX09CSkVDVF9DQVNUIChmaWx0ZXIpLCBzKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wcm9ncmVzc19yZXBvcnRfZG9fcXVlcnkgKEdzdFByb2dyZXNzUmVwb3J0ICogZmlsdGVyLCBHc3RGb3JtYXQgZm9ybWF0LAorICAgIGdpbnQgaGgsIGdpbnQgbW0sIGdpbnQgc3MsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgY29uc3QgZ2NoYXIgKmZvcm1hdF9uYW1lID0gTlVMTDsKKyAgR3N0UGFkICpzaW5rX3BhZDsKKyAgZ2ludDY0IGN1ciwgdG90YWw7CisKKyAgc2lua19wYWQgPSBHU1RfQkFTRV9UUkFOU0ZPUk0gKGZpbHRlciktPnNpbmtwYWQ7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwgInF1ZXJ5aW5nIHVzaW5nIGZvcm1hdCAlZCAoJXMpIiwgZm9ybWF0LAorICAgICAgZ3N0X2Zvcm1hdF9nZXRfbmFtZSAoZm9ybWF0KSk7CisKKyAgaWYgKGZpbHRlci0+ZG9fcXVlcnkgfHwgIWJ1ZikgeworICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICJ1c2luZyB1cHN0cmVhbSBxdWVyeSIpOworICAgIGlmICghZ3N0X3BhZF9wZWVyX3F1ZXJ5X3Bvc2l0aW9uIChzaW5rX3BhZCwgZm9ybWF0LCAmY3VyKSB8fAorICAgICAgICAhZ3N0X3BhZF9wZWVyX3F1ZXJ5X2R1cmF0aW9uIChzaW5rX3BhZCwgZm9ybWF0LCAmdG90YWwpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9IGVsc2UgeworICAgIEdzdEJhc2VUcmFuc2Zvcm0gKmJhc2UgPSBHU1RfQkFTRV9UUkFOU0ZPUk0gKGZpbHRlcik7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAidXNpbmcgYnVmZmVyIG1ldGFkYXRhIik7CisgICAgaWYgKGZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUgJiYgYmFzZS0+c2VnbWVudC5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICBjdXIgPSBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJmJhc2UtPnNlZ21lbnQsIGZvcm1hdCwKKyAgICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKSk7CisgICAgICB0b3RhbCA9IGJhc2UtPnNlZ21lbnQuZHVyYXRpb247CisgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gR1NUX0ZPUk1BVF9CVUZGRVJTKSB7CisgICAgICBjdXIgPSBmaWx0ZXItPmJ1ZmZlcl9jb3VudDsKKyAgICAgIHRvdGFsID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKworICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgR1NUX0ZPUk1BVF9CWVRFUzoKKyAgICAgIGZvcm1hdF9uYW1lID0gImJ5dGVzIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0ZPUk1BVF9CVUZGRVJTOgorICAgICAgZm9ybWF0X25hbWUgPSAiYnVmZmVycyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9GT1JNQVRfUEVSQ0VOVDoKKyAgICAgIGZvcm1hdF9uYW1lID0gInBlcmNlbnQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICBmb3JtYXRfbmFtZSA9ICJzZWNvbmRzIjsKKyAgICAgIGN1ciAvPSBHU1RfU0VDT05EOworICAgICAgdG90YWwgLz0gR1NUX1NFQ09ORDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0ZPUk1BVF9ERUZBVUxUOnsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIGZvcm1hdF9uYW1lID0gImJvZ291bml0cyI7CisgICAgICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChHU1RfQkFTRV9UUkFOU0ZPUk0gKGZpbHRlciktPnNpbmtwYWQpOworICAgICAgaWYgKGNhcHMpIHsKKyAgICAgICAgaWYgKGdzdF9jYXBzX2lzX2ZpeGVkIChjYXBzKSAmJiAhZ3N0X2NhcHNfaXNfYW55IChjYXBzKSkgeworICAgICAgICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICAgICAgICAgIGNvbnN0IGdjaGFyICptaW1lX3R5cGUgPSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKTsKKworICAgICAgICAgIGlmIChnX3N0cl9oYXNfcHJlZml4IChtaW1lX3R5cGUsICJ2aWRlby8iKSB8fAorICAgICAgICAgICAgICBnX3N0cl9oYXNfcHJlZml4IChtaW1lX3R5cGUsICJpbWFnZS8iKSkgeworICAgICAgICAgICAgZm9ybWF0X25hbWUgPSAiZnJhbWVzIjsKKyAgICAgICAgICB9IGVsc2UgaWYgKGdfc3RyX2hhc19wcmVmaXggKG1pbWVfdHlwZSwgImF1ZGlvLyIpKSB7CisgICAgICAgICAgICBmb3JtYXRfbmFtZSA9ICJzYW1wbGVzIjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6eworICAgICAgY29uc3QgR3N0Rm9ybWF0RGVmaW5pdGlvbiAqZGV0YWlsczsKKworICAgICAgZGV0YWlscyA9IGdzdF9mb3JtYXRfZ2V0X2RldGFpbHMgKGZvcm1hdCk7CisgICAgICBpZiAoZGV0YWlscykgeworICAgICAgICBmb3JtYXRfbmFtZSA9IGRldGFpbHMtPm5pY2s7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3JtYXRfbmFtZSA9ICJ1bmtub3duIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmICghZmlsdGVyLT5zaWxlbnQpIHsKKyAgICBpZiAodG90YWwgPiAwKSB7CisgICAgICBnX3ByaW50ICgiJXMgKCUwMmQ6JTAyZDolMDJkKTogJSIgR19HSU5UNjRfRk9STUFUICIgLyAlIgorICAgICAgICAgIEdfR0lOVDY0X0ZPUk1BVCAiICVzICglNC4xZiAlJSlcbiIsIEdTVF9PQkpFQ1RfTkFNRSAoZmlsdGVyKSwgaGgsCisgICAgICAgICAgbW0sIHNzLCBjdXIsIHRvdGFsLCBmb3JtYXRfbmFtZSwgKGdkb3VibGUpIGN1ciAvIHRvdGFsICogMTAwLjApOworICAgIH0gZWxzZSB7CisgICAgICBnX3ByaW50ICgiJXMgKCUwMmQ6JTAyZDolMDJkKTogJSIgR19HSU5UNjRfRk9STUFUICIgJXNcbiIsCisgICAgICAgICAgR1NUX09CSkVDVF9OQU1FIChmaWx0ZXIpLCBoaCwgbW0sIHNzLCBjdXIsIGZvcm1hdF9uYW1lKTsKKyAgICB9CisgIH0KKworICBnc3RfcHJvZ3Jlc3NfcmVwb3J0X3Bvc3RfcHJvZ3Jlc3MgKGZpbHRlciwgZm9ybWF0LCBjdXIsIHRvdGFsKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHJvZ3Jlc3NfcmVwb3J0X3JlcG9ydCAoR3N0UHJvZ3Jlc3NSZXBvcnQgKiBmaWx0ZXIsIEdUaW1lVmFsIGN1cl90aW1lLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rm9ybWF0IHRyeV9mb3JtYXRzW10gPSB7IEdTVF9GT1JNQVRfVElNRSwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICBHU1RfRk9STUFUX1BFUkNFTlQsIEdTVF9GT1JNQVRfQlVGRkVSUywKKyAgICBHU1RfRk9STUFUX0RFRkFVTFQKKyAgfTsKKyAgR3N0TWVzc2FnZSAqbXNnOworICBHc3RGb3JtYXQgZm9ybWF0ID0gR1NUX0ZPUk1BVF9VTkRFRklORUQ7CisgIGdib29sZWFuIGRvbmUgPSBGQUxTRTsKKyAgZ2xvbmcgcnVuX3RpbWU7CisgIGdpbnQgaGgsIG1tLCBzczsKKworICBydW5fdGltZSA9IGN1cl90aW1lLnR2X3NlYyAtIGZpbHRlci0+c3RhcnRfdGltZS50dl9zZWM7CisKKyAgaGggPSAocnVuX3RpbWUgLyAzNjAwKSAlIDEwMDsKKyAgbW0gPSAocnVuX3RpbWUgLyA2MCkgJSA2MDsKKyAgc3MgPSAocnVuX3RpbWUgJSA2MCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworCisgIGlmIChmaWx0ZXItPmZvcm1hdCAhPSBOVUxMICYmIHN0cmNtcCAoZmlsdGVyLT5mb3JtYXQsICJhdXRvIikgIT0gMCkgeworICAgIGZvcm1hdCA9IGdzdF9mb3JtYXRfZ2V0X2J5X25pY2sgKGZpbHRlci0+Zm9ybWF0KTsKKyAgfQorCisgIGlmIChmb3JtYXQgIT0gR1NUX0ZPUk1BVF9VTkRFRklORUQpIHsKKyAgICBkb25lID0gZ3N0X3Byb2dyZXNzX3JlcG9ydF9kb19xdWVyeSAoZmlsdGVyLCBmb3JtYXQsIGhoLCBtbSwgc3MsIGJ1Zik7CisgIH0gZWxzZSB7CisgICAgZ2ludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAodHJ5X2Zvcm1hdHMpOyArK2kpIHsKKyAgICAgIGRvbmUgPSBnc3RfcHJvZ3Jlc3NfcmVwb3J0X2RvX3F1ZXJ5IChmaWx0ZXIsIHRyeV9mb3JtYXRzW2ldLCBoaCwgbW0sIHNzLAorICAgICAgICAgIGJ1Zik7CisgICAgICBpZiAoZG9uZSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKCFkb25lICYmICFmaWx0ZXItPnNpbGVudCkgeworICAgIGdfcHJpbnQgKCIlcyAoJTJkOiUyZDolMmQpOiBDb3VsZCBub3QgcXVlcnkgcG9zaXRpb24gYW5kL29yIGR1cmF0aW9uXG4iLAorICAgICAgICBHU1RfT0JKRUNUX05BTUUgKGZpbHRlciksIGhoLCBtbSwgc3MpOworICB9CisKKyAgbXNnID0gZmlsdGVyLT5wZW5kaW5nX21zZzsKKyAgZmlsdGVyLT5wZW5kaW5nX21zZyA9IE5VTEw7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworCisgIGlmIChtc2cpIHsKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKGZpbHRlciksIG1zZyk7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcHJvZ3Jlc3NfcmVwb3J0X3NpbmtfZXZlbnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UHJvZ3Jlc3NSZXBvcnQgKmZpbHRlcjsKKworICBmaWx0ZXIgPSBHU1RfUFJPR1JFU1NfUkVQT1JUICh0cmFucyk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRU9TOgorICAgIHsKKyAgICAgIEdUaW1lVmFsIGN1cl90aW1lOworCisgICAgICBnX2dldF9jdXJyZW50X3RpbWUgKCZjdXJfdGltZSk7CisgICAgICBnc3RfcHJvZ3Jlc3NfcmVwb3J0X3JlcG9ydCAoZmlsdGVyLCBjdXJfdGltZSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKHRyYW5zLCBldmVudCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcHJvZ3Jlc3NfcmVwb3J0X3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFByb2dyZXNzUmVwb3J0ICpmaWx0ZXI7CisgIGdib29sZWFuIG5lZWRfdXBkYXRlOworICBHVGltZVZhbCBjdXJfdGltZTsKKworICBnX2dldF9jdXJyZW50X3RpbWUgKCZjdXJfdGltZSk7CisKKyAgZmlsdGVyID0gR1NUX1BST0dSRVNTX1JFUE9SVCAodHJhbnMpOworCisgIC8qIENoZWNrIGlmIHVwZGF0ZV9mcmVxIHNlY29uZHMgaGF2ZSBwYXNzZWQgc2luY2UgdGhlIGxhc3QgdXBkYXRlICovCisgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgbmVlZF91cGRhdGUgPQorICAgICAgKChjdXJfdGltZS50dl9zZWMgLSBmaWx0ZXItPmxhc3RfcmVwb3J0LnR2X3NlYykgPj0gZmlsdGVyLT51cGRhdGVfZnJlcSk7CisgIGZpbHRlci0+YnVmZmVyX2NvdW50Kys7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworCisgIGlmIChuZWVkX3VwZGF0ZSkgeworICAgIGdzdF9wcm9ncmVzc19yZXBvcnRfcmVwb3J0IChmaWx0ZXIsIGN1cl90aW1lLCBidWYpOworICAgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgICBmaWx0ZXItPmxhc3RfcmVwb3J0ID0gY3VyX3RpbWU7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGZpbHRlcik7CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Byb2dyZXNzX3JlcG9ydF9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICBHc3RQcm9ncmVzc1JlcG9ydCAqZmlsdGVyOworCisgIGZpbHRlciA9IEdTVF9QUk9HUkVTU19SRVBPUlQgKHRyYW5zKTsKKworICBnX2dldF9jdXJyZW50X3RpbWUgKCZmaWx0ZXItPmxhc3RfcmVwb3J0KTsKKyAgZmlsdGVyLT5zdGFydF90aW1lID0gZmlsdGVyLT5sYXN0X3JlcG9ydDsKKyAgZmlsdGVyLT5idWZmZXJfY291bnQgPSAwOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9wcm9ncmVzc19yZXBvcnRfc3RvcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICAvKiBhbnl0aGluZyB3ZSBzaG91bGQgYmUgZG9pbmcgaGVyZT8gKi8KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHJvZ3Jlc3NfcmVwb3J0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RQcm9ncmVzc1JlcG9ydCAqZmlsdGVyOworCisgIGZpbHRlciA9IEdTVF9QUk9HUkVTU19SRVBPUlQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1VQREFURV9GUkVROgorICAgICAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworICAgICAgZmlsdGVyLT51cGRhdGVfZnJlcSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGZpbHRlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0lMRU5UOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworICAgICAgZmlsdGVyLT5zaWxlbnQgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ET19RVUVSWToKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgICAgIGZpbHRlci0+ZG9fcXVlcnkgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GT1JNQVQ6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgICAgICBnX2ZyZWUgKGZpbHRlci0+Zm9ybWF0KTsKKyAgICAgIGZpbHRlci0+Zm9ybWF0ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBpZiAoZmlsdGVyLT5mb3JtYXQgPT0gTlVMTCkKKyAgICAgICAgZmlsdGVyLT5mb3JtYXQgPSBnX3N0cmR1cCAoImF1dG8iKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcHJvZ3Jlc3NfcmVwb3J0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RQcm9ncmVzc1JlcG9ydCAqZmlsdGVyOworCisgIGZpbHRlciA9IEdTVF9QUk9HUkVTU19SRVBPUlQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1VQREFURV9GUkVROgorICAgICAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZmlsdGVyLT51cGRhdGVfZnJlcSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TSUxFTlQ6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmlsdGVyLT5zaWxlbnQpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGZpbHRlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRE9fUVVFUlk6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmlsdGVyLT5kb19xdWVyeSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GT1JNQVQ6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBmaWx0ZXItPmZvcm1hdCk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9kZWJ1Z3V0aWxzL3Byb2dyZXNzcmVwb3J0LmggYi9nc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OTA5MzcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVidWd1dGlscy9wcm9ncmVzc3JlcG9ydC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qIEdTdHJlYW1lciBQcm9ncmVzcyBSZXBvcnQgRWxlbWVudAorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSA8MjAwND4gSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUFJPR1JFU1NfUkVQT1JUX0hfXworI2RlZmluZSBfX0dTVF9QUk9HUkVTU19SRVBPUlRfSF9fCisKKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfUFJPR1JFU1NfUkVQT1JUIFwKKyAgKGdzdF9wcm9ncmVzc19yZXBvcnRfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1BST0dSRVNTX1JFUE9SVChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1BST0dSRVNTX1JFUE9SVCxHc3RQcm9ncmVzc1JlcG9ydCkpCisjZGVmaW5lIEdTVF9QUk9HUkVTU19SRVBPUlRfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUFJPR1JFU1NfUkVQT1JULEdzdFByb2dyZXNzUmVwb3J0Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUFJPR1JFU1NfUkVQT1JUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUFJPR1JFU1NfUkVQT1JUKSkKKyNkZWZpbmUgR1NUX0lTX1BST0dSRVNTX1JFUE9SVF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9QUk9HUkVTU19SRVBPUlQpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFByb2dyZXNzUmVwb3J0IEdzdFByb2dyZXNzUmVwb3J0OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFByb2dyZXNzUmVwb3J0Q2xhc3MgR3N0UHJvZ3Jlc3NSZXBvcnRDbGFzczsKKworc3RydWN0IF9Hc3RQcm9ncmVzc1JlcG9ydAoreworICBHc3RCYXNlVHJhbnNmb3JtIGJhc2V0cmFuc2Zvcm07CisKKyAgR3N0TWVzc2FnZSAqcGVuZGluZ19tc2c7CisKKyAgZ2ludCB1cGRhdGVfZnJlcTsKKyAgZ2Jvb2xlYW4gc2lsZW50OworICBnYm9vbGVhbiBkb19xdWVyeTsKKyAgR1RpbWVWYWwgc3RhcnRfdGltZTsKKyAgR1RpbWVWYWwgbGFzdF9yZXBvcnQ7CisgIGdpbnQ2NCBidWZmZXJfY291bnQ7CisKKyAgLyogRm9ybWF0IHVzZWQgZm9yIHF1ZXJ5aW5nLiBVc2luZyBhIHN0cmluZyBoZXJlIGJlY2F1c2UgdGhlCisgICAqIGZvcm1hdCBtaWdodCBub3QgYmUgcmVnaXN0ZXJlZCB5ZXQgd2hlbiB0aGUgcHJvcGVydHkgaXMgc2V0ICovCisgIGdjaGFyICpmb3JtYXQ7Cit9OworCitzdHJ1Y3QgX0dzdFByb2dyZXNzUmVwb3J0Q2xhc3MKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9wcm9ncmVzc19yZXBvcnRfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1BST0dSRVNTX1JFUE9SVF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYyBiL2dzdC9kZWJ1Z3V0aWxzL3JuZGJ1ZmZlcnNpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzNhMjNjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlYnVndXRpbHMvcm5kYnVmZmVyc2l6ZS5jCkBAIC0wLDAgKzEsNTc2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNyBOb2tpYSBDb3Jwb3JhdGlvbiAoY29udGFjdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPikKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcm5kYnVmZmVyc2l6ZQorICoKKyAqIFRoaXMgZWxlbWVudCBwdWxscyBidWZmZXJzIHdpdGggcmFuZG9tIHNpemVzIGZyb20gdGhlIHNvdXJjZS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3Rfcm5kX2J1ZmZlcl9zaXplX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9ybmRfYnVmZmVyX3NpemVfZGVidWcKKworI2RlZmluZSBHU1RfVFlQRV9STkRfQlVGRkVSX1NJWkUgICAgICAgICAgICAoZ3N0X3JuZF9idWZmZXJfc2l6ZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUk5EX0JVRkZFUl9TSVpFKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUk5EX0JVRkZFUl9TSVpFLEdzdFJuZEJ1ZmZlclNpemUpKQorI2RlZmluZSBHU1RfUk5EX0JVRkZFUl9TSVpFX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9STkRfQlVGRkVSX1NJWkUsR3N0Um5kQnVmZmVyU2l6ZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JORF9CVUZGRVJfU0laRShvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JORF9CVUZGRVJfU0laRSkpCisjZGVmaW5lIEdTVF9JU19STkRfQlVGRkVSX1NJWkVfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JORF9CVUZGRVJfU0laRSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSbmRCdWZmZXJTaXplIEdzdFJuZEJ1ZmZlclNpemU7Cit0eXBlZGVmIHN0cnVjdCBfR3N0Um5kQnVmZmVyU2l6ZUNsYXNzIEdzdFJuZEJ1ZmZlclNpemVDbGFzczsKKworc3RydWN0IF9Hc3RSbmRCdWZmZXJTaXplCit7CisgIEdzdEVsZW1lbnQgcGFyZW50OworCisgIC8qPCBwcml2YXRlID4gKi8KKyAgR1JhbmQgKnJhbmQ7CisgIGd1aW50IHNlZWQ7CisgIGdpbnQgbWluLCBtYXg7CisKKyAgR3N0UGFkICpzaW5rcGFkLCAqc3JjcGFkOworICBndWludDY0IG9mZnNldDsKKworICBnYm9vbGVhbiBuZWVkX25ld3NlZ21lbnQ7CisKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKK307CisKK3N0cnVjdCBfR3N0Um5kQnVmZmVyU2l6ZUNsYXNzCit7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitlbnVtCit7CisgIFBST1BfU0VFRCA9IDEsCisgIFBST1BfTUlOSU1VTSwKKyAgUFJPUF9NQVhJTVVNCit9OworCisjZGVmaW5lIERFRkFVTFRfU0VFRCAwCisjZGVmaW5lIERFRkFVTFRfTUlOICAxCisjZGVmaW5lIERFRkFVTFRfTUFYICAoOCoxMDI0KQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgdm9pZCBnc3Rfcm5kX2J1ZmZlcl9zaXplX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyB2b2lkIGdzdF9ybmRfYnVmZmVyX3NpemVfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3JuZF9idWZmZXJfc2l6ZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfcm5kX2J1ZmZlcl9zaXplX2FjdGl2YXRlIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3JuZF9idWZmZXJfc2l6ZV9hY3RpdmF0ZV9tb2RlIChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSk7CitzdGF0aWMgdm9pZCBnc3Rfcm5kX2J1ZmZlcl9zaXplX2xvb3AgKEdzdFJuZEJ1ZmZlclNpemUgKiBzZWxmKTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3Rfcm5kX2J1ZmZlcl9zaXplX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3JuZF9idWZmZXJfc2l6ZV9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9ybmRfYnVmZmVyX3NpemVfc2lua19ldmVudCAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfcm5kX2J1ZmZlcl9zaXplX2NoYWluIChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpOworCitHVHlwZSBnc3Rfcm5kX2J1ZmZlcl9zaXplX2dldF90eXBlICh2b2lkKTsKKyNkZWZpbmUgZ3N0X3JuZF9idWZmZXJfc2l6ZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSbmRCdWZmZXJTaXplLCBnc3Rfcm5kX2J1ZmZlcl9zaXplLCBHU1RfVFlQRV9FTEVNRU5UKTsKKworc3RhdGljIHZvaWQKK2dzdF9ybmRfYnVmZmVyX3NpemVfY2xhc3NfaW5pdCAoR3N0Um5kQnVmZmVyU2l6ZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9ybmRfYnVmZmVyX3NpemVfZGVidWcsICJybmRidWZmZXJzaXplIiwgMCwKKyAgICAgICJybmRidWZmZXJzaXplIGVsZW1lbnQiKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3Rfcm5kX2J1ZmZlcl9zaXplX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3JuZF9idWZmZXJfc2l6ZV9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3JuZF9idWZmZXJfc2l6ZV9maW5hbGl6ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlJhbmRvbSBidWZmZXIgc2l6ZSIsCisgICAgICAiVGVzdGluZyIsICJwdWxsIHJhbmRvbSBzaXplZCBidWZmZXJzIiwKKyAgICAgICJTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPiIpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3JuZF9idWZmZXJfc2l6ZV9jaGFuZ2Vfc3RhdGUpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU0VFRCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgic2VlZCIsICJyYW5kb20gbnVtYmVyIHNlZWQiLAorICAgICAgICAgICJzZWVkIGZvciByYW5kb21uZXNzIChpbml0aWFsaXplZCB3aGVuIGdvaW5nIGZyb20gUkVBRFkgdG8gUEFVU0VEKSIsCisgICAgICAgICAgMCwgR19NQVhVSU5UMzIsIERFRkFVTFRfU0VFRCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01JTklNVU0sCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgibWluIiwgIm1pbmludW0iLCAibWluaW51bSBidWZmZXIgc2l6ZSIsCisgICAgICAgICAgMCwgR19NQVhJTlQzMiwgREVGQVVMVF9NSU4sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhJTVVNLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoIm1heCIsICJtYXhpbXVtIiwgIm1heGltdW0gYnVmZmVyIHNpemUiLAorICAgICAgICAgIDEsIEdfTUFYSU5UMzIsIERFRkFVTFRfTUFYLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfcm5kX2J1ZmZlcl9zaXplX2luaXQgKEdzdFJuZEJ1ZmZlclNpemUgKiBzZWxmKQoreworICBzZWxmLT5zaW5rcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rX3RlbXBsYXRlLCAic2luayIpOworICBnc3RfcGFkX3NldF9hY3RpdmF0ZV9mdW5jdGlvbiAoc2VsZi0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfcm5kX2J1ZmZlcl9zaXplX2FjdGl2YXRlKSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2YXRlbW9kZV9mdW5jdGlvbiAoc2VsZi0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfcm5kX2J1ZmZlcl9zaXplX2FjdGl2YXRlX21vZGUpKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHNlbGYtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3JuZF9idWZmZXJfc2l6ZV9zaW5rX2V2ZW50KSk7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChzZWxmLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ybmRfYnVmZmVyX3NpemVfY2hhaW4pKTsKKyAgR1NUX09CSkVDVF9GTEFHX1NFVCAoc2VsZi0+c2lua3BhZCwgR1NUX1BBRF9GTEFHX1BST1hZX0NBUFMpOworICBHU1RfT0JKRUNUX0ZMQUdfU0VUIChzZWxmLT5zaW5rcGFkLCBHU1RfUEFEX0ZMQUdfUFJPWFlfQUxMT0NBVElPTik7CisgIEdTVF9PQkpFQ1RfRkxBR19TRVQgKHNlbGYtPnNpbmtwYWQsIEdTVF9QQURfRkxBR19QUk9YWV9TQ0hFRFVMSU5HKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHNlbGYpLCBzZWxmLT5zaW5rcGFkKTsKKworICBzZWxmLT5zcmNwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNyY190ZW1wbGF0ZSwgInNyYyIpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoc2VsZi0+c3JjcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ybmRfYnVmZmVyX3NpemVfc3JjX2V2ZW50KSk7CisgIEdTVF9PQkpFQ1RfRkxBR19TRVQgKHNlbGYtPnNyY3BhZCwgR1NUX1BBRF9GTEFHX1BST1hZX0NBUFMpOworICBHU1RfT0JKRUNUX0ZMQUdfU0VUIChzZWxmLT5zcmNwYWQsIEdTVF9QQURfRkxBR19QUk9YWV9BTExPQ0FUSU9OKTsKKyAgR1NUX09CSkVDVF9GTEFHX1NFVCAoc2VsZi0+c3JjcGFkLCBHU1RfUEFEX0ZMQUdfUFJPWFlfU0NIRURVTElORyk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzZWxmKSwgc2VsZi0+c3JjcGFkKTsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3JuZF9idWZmZXJfc2l6ZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0Um5kQnVmZmVyU2l6ZSAqc2VsZiA9IEdTVF9STkRfQlVGRkVSX1NJWkUgKG9iamVjdCk7CisKKyAgaWYgKHNlbGYtPnJhbmQpIHsKKyAgICBnX3JhbmRfZnJlZSAoc2VsZi0+cmFuZCk7CisgICAgc2VsZi0+cmFuZCA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9ybmRfYnVmZmVyX3NpemVfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJuZEJ1ZmZlclNpemUgKnNlbGYgPSBHU1RfUk5EX0JVRkZFUl9TSVpFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TRUVEOgorICAgICAgc2VsZi0+c2VlZCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NSU5JTVVNOgorICAgICAgc2VsZi0+bWluID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYSU1VTToKKyAgICAgIHNlbGYtPm1heCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitnc3Rfcm5kX2J1ZmZlcl9zaXplX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSbmRCdWZmZXJTaXplICpzZWxmID0gR1NUX1JORF9CVUZGRVJfU0laRSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU0VFRDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzZWxmLT5zZWVkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NSU5JTVVNOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgc2VsZi0+bWluKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhJTVVNOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgc2VsZi0+bWF4KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ybmRfYnVmZmVyX3NpemVfYWN0aXZhdGUgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50KQoreworICBHc3RRdWVyeSAqcXVlcnk7CisgIGdib29sZWFuIHB1bGxfbW9kZTsKKworICBxdWVyeSA9IGdzdF9xdWVyeV9uZXdfc2NoZWR1bGluZyAoKTsKKworICBpZiAoZ3N0X3BhZF9wZWVyX3F1ZXJ5IChwYWQsIHF1ZXJ5KSkKKyAgICBwdWxsX21vZGUgPSBnc3RfcXVlcnlfaGFzX3NjaGVkdWxpbmdfbW9kZV93aXRoX2ZsYWdzIChxdWVyeSwKKyAgICAgICAgR1NUX1BBRF9NT0RFX1BVTEwsIEdTVF9TQ0hFRFVMSU5HX0ZMQUdfU0VFS0FCTEUpOworICBlbHNlCisgICAgcHVsbF9tb2RlID0gRkFMU0U7CisKKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisKKyAgaWYgKHB1bGxfbW9kZSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgImFjdGl2YXRpbmcgcHVsbCIpOworICAgIHJldHVybiBnc3RfcGFkX2FjdGl2YXRlX21vZGUgKHBhZCwgR1NUX1BBRF9NT0RFX1BVTEwsIFRSVUUpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgImFjdGl2YXRpbmcgcHVzaCIpOworICAgIHJldHVybiBnc3RfcGFkX2FjdGl2YXRlX21vZGUgKHBhZCwgR1NUX1BBRF9NT0RFX1BVU0gsIFRSVUUpOworICB9Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3Rfcm5kX2J1ZmZlcl9zaXplX2FjdGl2YXRlX21vZGUgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFBhZE1vZGUgbW9kZSwgZ2Jvb2xlYW4gYWN0aXZlKQoreworICBnYm9vbGVhbiByZXM7CisgIEdzdFJuZEJ1ZmZlclNpemUgKnNlbGYgPSBHU1RfUk5EX0JVRkZFUl9TSVpFIChwYXJlbnQpOworCisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgR1NUX1BBRF9NT0RFX1BVTEw6CisgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoc2VsZiwgInN0YXJ0aW5nIHB1bGwiKTsKKyAgICAgICAgcmVzID0KKyAgICAgICAgICAgIGdzdF9wYWRfc3RhcnRfdGFzayAocGFkLCAoR3N0VGFza0Z1bmN0aW9uKSBnc3Rfcm5kX2J1ZmZlcl9zaXplX2xvb3AsCisgICAgICAgICAgICBzZWxmLCBOVUxMKTsKKyAgICAgICAgc2VsZi0+bmVlZF9uZXdzZWdtZW50ID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoc2VsZiwgInN0b3BwaW5nIHB1bGwiKTsKKyAgICAgICAgcmVzID0gZ3N0X3BhZF9zdG9wX3Rhc2sgKHBhZCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9QQURfTU9ERV9QVVNIOgorICAgICAgR1NUX0lORk9fT0JKRUNUIChzZWxmLCAiJXNhY3RpdmF0aW5nIGluIHB1c2ggbW9kZSIsIChhY3RpdmUpID8gIiIgOiAiZGUiKTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ybmRfYnVmZmVyX3NpemVfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSbmRCdWZmZXJTaXplICpzZWxmOworICBHc3RTZWVrVHlwZSBzdGFydF90eXBlOworICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgIEdzdEZvcm1hdCBmb3JtYXQ7CisgIGdpbnQ2NCBzdGFydDsKKworICBpZiAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSAhPSBHU1RfRVZFTlRfU0VFSykgeworICAgIHJldHVybiBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgIH0KKworICBzZWxmID0gR1NUX1JORF9CVUZGRVJfU0laRSAocGFyZW50KTsKKyAgZ3N0X2V2ZW50X3BhcnNlX3NlZWsgKGV2ZW50LCBOVUxMLCAmZm9ybWF0LCAmZmxhZ3MsICZzdGFydF90eXBlLCAmc3RhcnQsCisgICAgICBOVUxMLCBOVUxMKTsKKworICBpZiAoZm9ybWF0ICE9IEdTVF9GT1JNQVRfQllURVMpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhZCwgIm9ubHkgQllURSBmb3JtYXQgc3VwcG9ydGVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChzdGFydF90eXBlICE9IEdTVF9TRUVLX1RZUEVfU0VUKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYWQsICJvbmx5IFNFRUtfVFlQRV9TRVQgc3VwcG9ydGVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKChmbGFncyAmIEdTVF9TRUVLX0ZMQUdfRkxVU0gpKSB7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzZWxmLT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfZmx1c2hfc3RhcnQgKCkpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc2VsZi0+c2lua3BhZCwgZ3N0X2V2ZW50X25ld19mbHVzaF9zdGFydCAoKSk7CisgIH0gZWxzZSB7CisgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChzZWxmLT5zaW5rcGFkKTsKKyAgfQorCisgIEdTVF9QQURfU1RSRUFNX0xPQ0sgKHNlbGYtPnNpbmtwYWQpOworCisgIGlmICgoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0ZMVVNIKSkgeworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc2VsZi0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0b3AgKFRSVUUpKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNpbmtwYWQsIGdzdF9ldmVudF9uZXdfZmx1c2hfc3RvcCAoVFJVRSkpOworICB9CisKKyAgR1NUX0lORk9fT0JKRUNUIChwYWQsICJzZWVraW5nIHRvIG9mZnNldCAlIiBHX0dJTlQ2NF9GT1JNQVQsIHN0YXJ0KTsKKworICBzZWxmLT5vZmZzZXQgPSBzdGFydDsKKyAgc2VsZi0+bmVlZF9uZXdzZWdtZW50ID0gVFJVRTsKKworICBnc3RfcGFkX3N0YXJ0X3Rhc2sgKHNlbGYtPnNpbmtwYWQsIChHc3RUYXNrRnVuY3Rpb24pIGdzdF9ybmRfYnVmZmVyX3NpemVfbG9vcCwKKyAgICAgIHNlbGYsIE5VTEwpOworCisgIEdTVF9QQURfU1RSRUFNX1VOTE9DSyAoc2VsZi0+c2lua3BhZCk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3JuZF9idWZmZXJfc2l6ZV9kcmFpbl9hZGFwdGVyIChHc3RSbmRCdWZmZXJTaXplICogc2VsZiwgZ2Jvb2xlYW4gZW9zKQoreworICBHc3RGbG93UmV0dXJuIGZsb3c7CisgIEdzdEJ1ZmZlciAqYnVmOworICBndWludCBudW1fYnl0ZXMsIGF2YWlsOworCisgIGZsb3cgPSBHU1RfRkxPV19PSzsKKworICBpZiAoR19VTkxJS0VMWSAoc2VsZi0+bWluID4gc2VsZi0+bWF4KSkKKyAgICBnb3RvIGJvZ3VzX21pbm1heDsKKworICBkbyB7CisgICAgaWYgKHNlbGYtPm1pbiAhPSBzZWxmLT5tYXgpIHsKKyAgICAgIG51bV9ieXRlcyA9IGdfcmFuZF9pbnRfcmFuZ2UgKHNlbGYtPnJhbmQsIHNlbGYtPm1pbiwgc2VsZi0+bWF4KTsKKyAgICB9IGVsc2UgeworICAgICAgbnVtX2J5dGVzID0gc2VsZi0+bWluOworICAgIH0KKworICAgIEdTVF9MT0dfT0JKRUNUIChzZWxmLCAicHVsbGluZyAldSBieXRlcyBvdXQgb2YgYWRhcHRlciIsIG51bV9ieXRlcyk7CisKKyAgICBidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoc2VsZi0+YWRhcHRlciwgbnVtX2J5dGVzKTsKKworICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgaWYgKCFlb3MpIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHNlbGYsICJub3QgZW5vdWdoIGJ5dGVzIGluIGFkYXB0ZXIiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzZWxmLT5hZGFwdGVyKTsKKworICAgICAgaWYgKGF2YWlsID09IDApCisgICAgICAgIGJyZWFrOworCisgICAgICBpZiAoYXZhaWwgPCBzZWxmLT5taW4pIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiZGlzY2FyZGluZyAldSBieXRlcyBhdCBlbmQgKG1pbj0ldSkiLAorICAgICAgICAgICAgYXZhaWwsIHNlbGYtPm1pbik7CisgICAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChzZWxmLT5hZGFwdGVyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoc2VsZi0+YWRhcHRlciwgYXZhaWwpOworICAgICAgZ19hc3NlcnQgKGJ1ZiAhPSBOVUxMKTsKKyAgICB9CisKKyAgICBmbG93ID0gZ3N0X3BhZF9wdXNoIChzZWxmLT5zcmNwYWQsIGJ1Zik7CisgIH0KKyAgd2hpbGUgKGZsb3cgPT0gR1NUX0ZMT1dfT0spOworCisgIHJldHVybiBmbG93OworCisvKiBFUlJPUlMgKi8KK2JvZ3VzX21pbm1heDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzZWxmLCBMSUJSQVJZLCBTRVRUSU5HUywKKyAgICAgICAgKCJUaGUgbWluaW11bSBidWZmZXIgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIG1heGltdW0gYnVmZmVyIHNpemUuIiksCisgICAgICAgICgiYnVmZmVyIHNpemVzOiBtYXg9JWQsIG1pbj0lZCIsIHNlbGYtPm1pbiwgc2VsZi0+bWF4KSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3JuZF9idWZmZXJfc2l6ZV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSbmRCdWZmZXJTaXplICpybmQgPSBHU1RfUk5EX0JVRkZFUl9TSVpFIChwYXJlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIGdzdF9ybmRfYnVmZmVyX3NpemVfZHJhaW5fYWRhcHRlciAocm5kLCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgICBpZiAocm5kLT5hZGFwdGVyICE9IE5VTEwpCisgICAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChybmQtPmFkYXB0ZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ybmRfYnVmZmVyX3NpemVfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFJuZEJ1ZmZlclNpemUgKnJuZCA9IEdTVF9STkRfQlVGRkVSX1NJWkUgKHBhcmVudCk7CisgIEdzdEZsb3dSZXR1cm4gZmxvdzsKKworICBpZiAocm5kLT5hZGFwdGVyID09IE5VTEwpCisgICAgcm5kLT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworCisgIGdzdF9hZGFwdGVyX3B1c2ggKHJuZC0+YWRhcHRlciwgYnVmKTsKKworICBmbG93ID0gZ3N0X3JuZF9idWZmZXJfc2l6ZV9kcmFpbl9hZGFwdGVyIChybmQsIEZBTFNFKTsKKworICBpZiAoZmxvdyAhPSBHU1RfRkxPV19PSykKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHJuZCwgImZsb3c6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKGZsb3cpKTsKKworICByZXR1cm4gZmxvdzsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ybmRfYnVmZmVyX3NpemVfbG9vcCAoR3N0Um5kQnVmZmVyU2l6ZSAqIHNlbGYpCit7CisgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIGd1aW50IG51bV9ieXRlcywgc2l6ZTsKKworICBpZiAoR19VTkxJS0VMWSAoc2VsZi0+bWluID4gc2VsZi0+bWF4KSkKKyAgICBnb3RvIGJvZ3VzX21pbm1heDsKKworICBpZiAoR19VTkxJS0VMWSAoc2VsZi0+bWluICE9IHNlbGYtPm1heCkpIHsKKyAgICBudW1fYnl0ZXMgPSBnX3JhbmRfaW50X3JhbmdlIChzZWxmLT5yYW5kLCBzZWxmLT5taW4sIHNlbGYtPm1heCk7CisgIH0gZWxzZSB7CisgICAgbnVtX2J5dGVzID0gc2VsZi0+bWluOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNlbGYsICJwdWxsaW5nICV1IGJ5dGVzIGF0IG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgbnVtX2J5dGVzLCBzZWxmLT5vZmZzZXQpOworCisgIHJldCA9IGdzdF9wYWRfcHVsbF9yYW5nZSAoc2VsZi0+c2lua3BhZCwgc2VsZi0+b2Zmc2V0LCBudW1fYnl0ZXMsICZidWYpOworCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBwdWxsX2ZhaWxlZDsKKworICBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKworICBpZiAoc2l6ZSA8IG51bV9ieXRlcykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2VsZiwgInNob3J0IGJ1ZmZlcjogJXUgYnl0ZXMiLCBzaXplKTsKKyAgfQorCisgIGlmIChzZWxmLT5uZWVkX25ld3NlZ21lbnQpIHsKKyAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgICAgc2VnbWVudC5zdGFydCA9IHNlbGYtPm9mZnNldDsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworICAgIHNlbGYtPm5lZWRfbmV3c2VnbWVudCA9IEZBTFNFOworICB9CisKKyAgc2VsZi0+b2Zmc2V0ICs9IHNpemU7CisKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChzZWxmLT5zcmNwYWQsIGJ1Zik7CisKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIHB1c2hfZmFpbGVkOworCisgIHJldHVybjsKKworcGF1c2VfdGFzazoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJwYXVzaW5nIHRhc2siKTsKKyAgICBnc3RfcGFkX3BhdXNlX3Rhc2sgKHNlbGYtPnNpbmtwYWQpOworICAgIHJldHVybjsKKyAgfQorCitwdWxsX2ZhaWxlZDoKKyAgeworICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRU9TKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiZW9zIik7CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNlbGYsICJwdWxsX3JhbmdlIGZsb3c6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICAgIH0KKyAgICBnb3RvIHBhdXNlX3Rhc2s7CisgIH0KKworcHVzaF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAicHVzaCBmbG93OiAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICBpZiAocmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImVvcyIpOworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzZWxmLT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgICB9IGVsc2UgaWYgKHJldCA8IEdTVF9GTE9XX0VPUyB8fCByZXQgPT0gR1NUX0ZMT1dfTk9UX0xJTktFRCkgeworICAgICAgR1NUX0VMRU1FTlRfRkxPV19FUlJPUiAoc2VsZiwgcmV0KTsKKyAgICB9CisgICAgZ290byBwYXVzZV90YXNrOworICB9CisKK2JvZ3VzX21pbm1heDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzZWxmLCBMSUJSQVJZLCBTRVRUSU5HUywKKyAgICAgICAgKCJUaGUgbWluaW11bSBidWZmZXIgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIG1heGltdW0gYnVmZmVyIHNpemUuIiksCisgICAgICAgICgiYnVmZmVyIHNpemVzOiBtYXg9JWQsIG1pbj0lZCIsIHNlbGYtPm1pbiwgc2VsZi0+bWF4KSk7CisgICAgZ290byBwYXVzZV90YXNrOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3JuZF9idWZmZXJfc2l6ZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJuZEJ1ZmZlclNpemUgKnNlbGYgPSBHU1RfUk5EX0JVRkZFUl9TSVpFIChlbGVtZW50KTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIHNlbGYtPm9mZnNldCA9IDA7CisgICAgICBpZiAoIXNlbGYtPnJhbmQpIHsKKyAgICAgICAgc2VsZi0+cmFuZCA9IGdfcmFuZF9uZXdfd2l0aF9zZWVkIChzZWxmLT5zZWVkKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUExBWUlORzoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QTEFZSU5HX1RPX1BBVVNFRDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBpZiAoc2VsZi0+cmFuZCkgeworICAgICAgICBnX3JhbmRfZnJlZSAoc2VsZi0+cmFuZCk7CisgICAgICAgIHNlbGYtPnJhbmQgPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBpZiAoc2VsZi0+YWRhcHRlcikgeworICAgICAgICBnX29iamVjdF91bnJlZiAoc2VsZi0+YWRhcHRlcik7CisgICAgICAgIHNlbGYtPmFkYXB0ZXIgPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2dzdC9kZWJ1Z3V0aWxzL3Rlc3RwbHVnaW4uYyBiL2dzdC9kZWJ1Z3V0aWxzL3Rlc3RwbHVnaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjljYTBmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlYnVndXRpbHMvdGVzdHBsdWdpbi5jCkBAIC0wLDAgKzEsMzA0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBCZW5qYW1pbiBPdHRlIDxvdHRlQGdub21lLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlc2luay5oPgorI2luY2x1ZGUgInRlc3RzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF90ZXN0X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF90ZXN0X2RlYnVnCisKKy8qIFRoaXMgcGx1Z2luIGRvZXMgYWxsIHRoZSB0ZXN0cyByZWdpc3RlcmVkIGluIHRoZSB0ZXN0cy5oIGZpbGUKKyAqLworCisjZGVmaW5lIEdTVF9UWVBFX1RFU1QgXAorICAoZ3N0X3Rlc3RfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1RFU1Qob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9URVNULEdzdFRlc3QpKQorI2RlZmluZSBHU1RfVEVTVF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9URVNULEdzdFRlc3RDbGFzcykpCisjZGVmaW5lIEdTVF9URVNUX0dFVF9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLEdTVF9UWVBFX1RFU1QsR3N0VGVzdENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1RFU1Qob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9URVNUKSkKKyNkZWZpbmUgR1NUX0lTX1RFU1RfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVEVTVCkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RUZXN0IEdzdFRlc3Q7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VGVzdENsYXNzIEdzdFRlc3RDbGFzczsKKworc3RydWN0IF9Hc3RUZXN0Cit7CisgIEdzdEJhc2VTaW5rIGJhc2VzaW5rOworCisgIGdwb2ludGVyIHRlc3RzW1RFU1RTX0NPVU5UXTsKKyAgR1ZhbHVlIHZhbHVlc1tURVNUU19DT1VOVF07Cit9OworCitzdHJ1Y3QgX0dzdFRlc3RDbGFzcworeworICBHc3RCYXNlU2lua0NsYXNzIHBhcmVudF9jbGFzczsKKworICBnY2hhciAqcGFyYW1fbmFtZXNbMiAqIFRFU1RTX0NPVU5UXTsKK307CisKK3N0YXRpYyB2b2lkIGdzdF90ZXN0X2ZpbmFsaXplIChHc3RUZXN0ICogdGVzdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdGVzdF9zdGFydCAoR3N0QmFzZVNpbmsgKiB0cmFucyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Rlc3Rfc3RvcCAoR3N0QmFzZVNpbmsgKiB0cmFucyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Rlc3Rfc2lua19ldmVudCAoR3N0QmFzZVNpbmsgKiBiYXNlc2luaywgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfdGVzdF9yZW5kZXJfYnVmZmVyIChHc3RCYXNlU2luayAqIGJhc2VzaW5rLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyB2b2lkIGdzdF90ZXN0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF90ZXN0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitHVHlwZSBnc3RfdGVzdF9nZXRfdHlwZSAodm9pZCk7CisjZGVmaW5lIGdzdF90ZXN0X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFRlc3QsIGdzdF90ZXN0LCBHU1RfVFlQRV9CQVNFX1NJTkspOworCisKK3N0YXRpYyB2b2lkCitnc3RfdGVzdF9jbGFzc19pbml0IChHc3RUZXN0Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0QmFzZVNpbmtDbGFzcyAqYmFzZXNpbmtfY2xhc3MgPSBHU1RfQkFTRV9TSU5LX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgZ3VpbnQgaTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3Rlc3RfZGVidWcsICJ0ZXN0c2luayIsIDAsCisgICAgICAiZGVidWdnaW5nIGNhdGVnb3J5IGZvciB0ZXN0c2luayBlbGVtZW50Iik7CisKKyAgb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdGVzdF9zZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3Rlc3RfZ2V0X3Byb3BlcnR5OworCisgIG9iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAoR09iamVjdEZpbmFsaXplRnVuYykgZ3N0X3Rlc3RfZmluYWxpemU7CisKKyAgZm9yIChpID0gMDsgaSA8IFRFU1RTX0NPVU5UOyBpKyspIHsKKyAgICBHUGFyYW1TcGVjICpzcGVjOworCisgICAgc3BlYyA9IHRlc3RzW2ldLmdldF9zcGVjICgmdGVzdHNbaV0sIEZBTFNFKTsKKyAgICBrbGFzcy0+cGFyYW1fbmFtZXNbMiAqIGldID0gZ19zdHJkdXAgKGdfcGFyYW1fc3BlY19nZXRfbmFtZSAoc3BlYykpOworICAgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKG9iamVjdF9jbGFzcywgMiAqIGkgKyAxLCBzcGVjKTsKKyAgICBzcGVjID0gdGVzdHNbaV0uZ2V0X3NwZWMgKCZ0ZXN0c1tpXSwgVFJVRSk7CisgICAga2xhc3MtPnBhcmFtX25hbWVzWzIgKiBpICsgMV0gPSBnX3N0cmR1cCAoZ19wYXJhbV9zcGVjX2dldF9uYW1lIChzcGVjKSk7CisgICAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAob2JqZWN0X2NsYXNzLCAyICogaSArIDIsIHNwZWMpOworICB9CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJUZXN0IHBsdWdpbiIsCisgICAgICAiVGVzdGluZyIsICJwZXJmb3JtIGEgbnVtYmVyIG9mIHRlc3RzIiwgIkJlbmphbWluIE90dGUgPG90dGVAZ25vbWU+Iik7CisKKyAgYmFzZXNpbmtfY2xhc3MtPnJlbmRlciA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdGVzdF9yZW5kZXJfYnVmZmVyKTsKKyAgYmFzZXNpbmtfY2xhc3MtPmV2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF90ZXN0X3NpbmtfZXZlbnQpOworICBiYXNlc2lua19jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Rlc3Rfc3RhcnQpOworICBiYXNlc2lua19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdGVzdF9zdG9wKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF90ZXN0X2luaXQgKEdzdFRlc3QgKiB0ZXN0KQoreworICBHc3RUZXN0Q2xhc3MgKmtsYXNzOworICBndWludCBpOworCisgIGtsYXNzID0gR1NUX1RFU1RfR0VUX0NMQVNTICh0ZXN0KTsKKyAgZm9yIChpID0gMDsgaSA8IFRFU1RTX0NPVU5UOyBpKyspIHsKKyAgICBHUGFyYW1TcGVjICpzcGVjID0gZ19vYmplY3RfY2xhc3NfZmluZF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgICAga2xhc3MtPnBhcmFtX25hbWVzWzIgKiBpICsgMV0pOworCisgICAgZ192YWx1ZV9pbml0ICgmdGVzdC0+dmFsdWVzW2ldLCBHX1BBUkFNX1NQRUNfVkFMVUVfVFlQRSAoc3BlYykpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdGVzdF9maW5hbGl6ZSAoR3N0VGVzdCAqIHRlc3QpCit7CisgIGd1aW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IFRFU1RTX0NPVU5UOyBpKyspIHsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmdGVzdC0+dmFsdWVzW2ldKTsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAoKEdPYmplY3QgKikgdGVzdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0c191bnNldCAoR3N0VGVzdCAqIHRlc3QpCit7CisgIGd1aW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IFRFU1RTX0NPVU5UOyBpKyspIHsKKyAgICBpZiAodGVzdC0+dGVzdHNbaV0pIHsKKyAgICAgIHRlc3RzW2ldLmZyZWUgKHRlc3QtPnRlc3RzW2ldKTsKKyAgICAgIHRlc3QtPnRlc3RzW2ldID0gTlVMTDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK3Rlc3RzX3NldCAoR3N0VGVzdCAqIHRlc3QpCit7CisgIGd1aW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IFRFU1RTX0NPVU5UOyBpKyspIHsKKyAgICBnX2Fzc2VydCAodGVzdC0+dGVzdHNbaV0gPT0gTlVMTCk7CisgICAgdGVzdC0+dGVzdHNbaV0gPSB0ZXN0c1tpXS5uZXcgKCZ0ZXN0c1tpXSk7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdGVzdF9zaW5rX2V2ZW50IChHc3RCYXNlU2luayAqIGJhc2VzaW5rLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RUZXN0Q2xhc3MgKmtsYXNzID0gR1NUX1RFU1RfR0VUX0NMQVNTIChiYXNlc2luayk7CisgIEdzdFRlc3QgKnRlc3QgPSBHU1RfVEVTVCAoYmFzZXNpbmspOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworLyoKKyAgICBjYXNlIEdTVF9FVkVOVF9ORVdTRUdNRU5UOgorICAgICAgaWYgKEdTVF9FVkVOVF9ESVNDT05UX05FV19NRURJQSAoZXZlbnQpKSB7CisgICAgICAgIHRlc3RzX3Vuc2V0ICh0ZXN0KTsKKyAgICAgICAgdGVzdHNfc2V0ICh0ZXN0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworKi8KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6eworICAgICAgZ2ludCBpOworCisgICAgICBnX29iamVjdF9mcmVlemVfbm90aWZ5IChHX09CSkVDVCAodGVzdCkpOworICAgICAgZm9yIChpID0gMDsgaSA8IFRFU1RTX0NPVU5UOyBpKyspIHsKKyAgICAgICAgaWYgKHRlc3QtPnRlc3RzW2ldKSB7CisgICAgICAgICAgaWYgKCF0ZXN0c1tpXS5maW5pc2ggKHRlc3QtPnRlc3RzW2ldLCAmdGVzdC0+dmFsdWVzW2ldKSkgeworICAgICAgICAgICAgR1ZhbHVlIHYgPSB7IDAsIH07CisgICAgICAgICAgICBnY2hhciAqcmVhbCwgKmV4cGVjdGVkOworCisgICAgICAgICAgICBleHBlY3RlZCA9IGdzdF92YWx1ZV9zZXJpYWxpemUgKCZ0ZXN0LT52YWx1ZXNbaV0pOworICAgICAgICAgICAgZ192YWx1ZV9pbml0ICgmdiwgR19WQUxVRV9UWVBFICgmdGVzdC0+dmFsdWVzW2ldKSk7CisgICAgICAgICAgICBnX29iamVjdF9nZXRfcHJvcGVydHkgKEdfT0JKRUNUICh0ZXN0KSwga2xhc3MtPnBhcmFtX25hbWVzWzIgKiBpXSwKKyAgICAgICAgICAgICAgICAmdik7CisgICAgICAgICAgICByZWFsID0gZ3N0X3ZhbHVlX3NlcmlhbGl6ZSAoJnYpOworICAgICAgICAgICAgZ192YWx1ZV91bnNldCAoJnYpOworICAgICAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHRlc3QsIFNUUkVBTSwgRk9STUFULCAoTlVMTCksCisgICAgICAgICAgICAgICAgKCJ0ZXN0ICVzIHJldHVybmVkIHZhbHVlIFwiJXNcIiBhbmQgbm90IGV4cGVjdGVkIHZhbHVlIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgIGtsYXNzLT5wYXJhbV9uYW1lc1syICogaV0sIHJlYWwsIGV4cGVjdGVkKSk7CisgICAgICAgICAgICBnX2ZyZWUgKHJlYWwpOworICAgICAgICAgICAgZ19mcmVlIChleHBlY3RlZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKHRlc3QpLCBrbGFzcy0+cGFyYW1fbmFtZXNbMiAqIGldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ19vYmplY3RfdGhhd19ub3RpZnkgKEdfT0JKRUNUICh0ZXN0KSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIEdTVF9CQVNFX1NJTktfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmV2ZW50IChiYXNlc2luaywgZXZlbnQpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3Rlc3RfcmVuZGVyX2J1ZmZlciAoR3N0QmFzZVNpbmsgKiBiYXNlc2luaywgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RUZXN0ICp0ZXN0ID0gR1NUX1RFU1QgKGJhc2VzaW5rKTsKKyAgZ3VpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgVEVTVFNfQ09VTlQ7IGkrKykgeworICAgIGlmICh0ZXN0LT50ZXN0c1tpXSkgeworICAgICAgdGVzdHNbaV0uYWRkICh0ZXN0LT50ZXN0c1tpXSwgYnVmKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF90ZXN0X3N0YXJ0IChHc3RCYXNlU2luayAqIHNpbmspCit7CisgIEdzdFRlc3QgKnRlc3QgPSBHU1RfVEVTVCAoc2luayk7CisKKyAgdGVzdHNfc2V0ICh0ZXN0KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Rlc3Rfc3RvcCAoR3N0QmFzZVNpbmsgKiBzaW5rKQoreworICBHc3RUZXN0ICp0ZXN0ID0gR1NUX1RFU1QgKHNpbmspOworCisgIHRlc3RzX3Vuc2V0ICh0ZXN0KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdGVzdF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VGVzdCAqdGVzdCA9IEdTVF9URVNUIChvYmplY3QpOworCisgIGlmIChwcm9wX2lkID09IDAgfHwgcHJvcF9pZCA+IDIgKiBURVNUU19DT1VOVCkgeworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHByb3BfaWQgJSAyKSB7CisgICAgLyogcmVhbCB2YWx1ZXMgY2FuJ3QgYmUgc2V0ICovCisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBleHBlY3RlZCB2YWx1ZXMgKi8KKyAgICBHU1RfT0JKRUNUX0xPQ0sgKHRlc3QpOworICAgIGdfdmFsdWVfY29weSAodmFsdWUsICZ0ZXN0LT52YWx1ZXNbcHJvcF9pZCAvIDIgLSAxXSk7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHRlc3QpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdGVzdF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VGVzdCAqdGVzdCA9IEdTVF9URVNUIChvYmplY3QpOworICBndWludCBpZCA9IChwcm9wX2lkIC0gMSkgLyAyOworCisgIGlmIChwcm9wX2lkID09IDAgfHwgcHJvcF9pZCA+IDIgKiBURVNUU19DT1VOVCkgeworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgcmV0dXJuOworICB9CisKKyAgR1NUX09CSkVDVF9MT0NLICh0ZXN0KTsKKworICBpZiAocHJvcF9pZCAlIDIpIHsKKyAgICAvKiByZWFsIHZhbHVlcyAqLworICAgIHRlc3RzW2lkXS5nZXRfdmFsdWUgKHRlc3QtPnRlc3RzW2lkXSwgdmFsdWUpOworICB9IGVsc2UgeworICAgIC8qIGV4cGVjdGVkIHZhbHVlcyAqLworICAgIGdfdmFsdWVfY29weSAoJnRlc3QtPnZhbHVlc1tpZF0sIHZhbHVlKTsKKyAgfQorCisgIEdTVF9PQkpFQ1RfVU5MT0NLICh0ZXN0KTsKK30KZGlmZiAtLWdpdCBhL2dzdC9kZWJ1Z3V0aWxzL3Rlc3RzLmMgYi9nc3QvZGVidWd1dGlscy90ZXN0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYTJhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVidWd1dGlscy90ZXN0cy5jCkBAIC0wLDAgKzEsMjY5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBCZW5qYW1pbiBPdHRlIDxvdHRlQGdub21lLm9yZz4KKyAqCisgKiBpbmNsdWRlcyBjb2RlIGJhc2VkIG9uIGdsaWJjIDIuMi4zJ3MgY3J5cHQvbWQ1LmMsCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInRlc3RzLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworCisvKgorICoqKiBMRU5HVEggKioqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ2ludDY0IHZhbHVlOworfQorTGVuZ3RoVGVzdDsKKworc3RhdGljIEdQYXJhbVNwZWMgKgorbGVuZ3RoX2dldF9zcGVjIChjb25zdCBHc3RUZXN0SW5mbyAqIGluZm8sIGdib29sZWFuIGNvbXBhcmVfdmFsdWUpCit7CisgIGlmIChjb21wYXJlX3ZhbHVlKSB7CisgICAgcmV0dXJuIGdfcGFyYW1fc3BlY19pbnQ2NCAoImV4cGVjdGVkLWxlbmd0aCIsICJleHBlY3RlZCBsZW5ndGgiLAorICAgICAgICAiZXhwZWN0ZWQgbGVuZ3RoIG9mIHN0cmVhbSIsIC0xLCBHX01BWElOVDY0LCAtMSwKKyAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGdfcGFyYW1fc3BlY19pbnQ2NCAoImxlbmd0aCIsICJsZW5ndGgiLCAibGVuZ3RoIG9mIHN0cmVhbSIsCisgICAgICAgIC0xLCBHX01BWElOVDY0LCAtMSwgR19QQVJBTV9SRUFEQUJMRSk7CisgIH0KK30KKworc3RhdGljIGdwb2ludGVyCitsZW5ndGhfbmV3IChjb25zdCBHc3RUZXN0SW5mbyAqIGluZm8pCit7CisgIHJldHVybiBnX25ldzAgKExlbmd0aFRlc3QsIDEpOworfQorCitzdGF0aWMgdm9pZAorbGVuZ3RoX2FkZCAoZ3BvaW50ZXIgdGVzdCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBMZW5ndGhUZXN0ICp0ID0gdGVzdDsKKworICB0LT52YWx1ZSArPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2xlbmd0aF9maW5pc2ggKGdwb2ludGVyIHRlc3QsIEdWYWx1ZSAqIHZhbHVlKQoreworICBMZW5ndGhUZXN0ICp0ID0gdGVzdDsKKworICBpZiAoZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKSA9PSAtMSkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gdC0+dmFsdWUgPT0gZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK2xlbmd0aF9nZXRfdmFsdWUgKGdwb2ludGVyIHRlc3QsIEdWYWx1ZSAqIHZhbHVlKQoreworICBMZW5ndGhUZXN0ICp0ID0gdGVzdDsKKworICBnX3ZhbHVlX3NldF9pbnQ2NCAodmFsdWUsIHQgPyB0LT52YWx1ZSA6IC0xKTsKK30KKworLyoKKyAqKiogQlVGRkVSIENPVU5UICoqKgorICovCisKK3N0YXRpYyBHUGFyYW1TcGVjICoKK2J1ZmZlcl9jb3VudF9nZXRfc3BlYyAoY29uc3QgR3N0VGVzdEluZm8gKiBpbmZvLCBnYm9vbGVhbiBjb21wYXJlX3ZhbHVlKQoreworICBpZiAoY29tcGFyZV92YWx1ZSkgeworICAgIHJldHVybiBnX3BhcmFtX3NwZWNfaW50NjQgKCJleHBlY3RlZC1idWZmZXItY291bnQiLCAiZXhwZWN0ZWQgYnVmZmVyIGNvdW50IiwKKyAgICAgICAgImV4cGVjdGVkIG51bWJlciBvZiBidWZmZXJzIGluIHN0cmVhbSIsCisgICAgICAgIC0xLCBHX01BWElOVDY0LCAtMSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGdfcGFyYW1fc3BlY19pbnQ2NCAoImJ1ZmZlci1jb3VudCIsICJidWZmZXIgY291bnQiLAorICAgICAgICAibnVtYmVyIG9mIGJ1ZmZlcnMgaW4gc3RyZWFtIiwgLTEsIEdfTUFYSU5UNjQsIC0xLCBHX1BBUkFNX1JFQURBQkxFKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorYnVmZmVyX2NvdW50X2FkZCAoZ3BvaW50ZXIgdGVzdCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBMZW5ndGhUZXN0ICp0ID0gdGVzdDsKKworICB0LT52YWx1ZSsrOworfQorCisvKgorICoqKiBUSU1FU1RBTVAgLyBEVVJBVElPTiBNQVRDSElORyAqKioKKyAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludDY0IGRpZmY7CisgIGd1aW50IGNvdW50OworICBHc3RDbG9ja1RpbWUgZXhwZWN0ZWQ7Cit9CitUaW1lRHVyVGVzdDsKKworc3RhdGljIEdQYXJhbVNwZWMgKgordGltZWR1cl9nZXRfc3BlYyAoY29uc3QgR3N0VGVzdEluZm8gKiBpbmZvLCBnYm9vbGVhbiBjb21wYXJlX3ZhbHVlKQoreworICBpZiAoY29tcGFyZV92YWx1ZSkgeworICAgIHJldHVybiBnX3BhcmFtX3NwZWNfaW50NjQgKCJhbGxvd2VkLXRpbWVzdGFtcC1kZXZpYXRpb24iLAorICAgICAgICAiYWxsb3dlZCB0aW1lc3RhbXAgZGV2aWF0aW9uIiwKKyAgICAgICAgImFsbG93ZWQgYXZlcmFnZSBkaWZmZXJlbmNlIGluIHVzZWMgYmV0d2VlbiB0aW1lc3RhbXAgb2YgbmV4dCBidWZmZXIgIgorICAgICAgICAiYW5kIGV4cGVjdGVkIHRpbWVzdGFtcCBmcm9tIGFuYWx5emluZyBsYXN0IGJ1ZmZlciIsCisgICAgICAgIC0xLCBHX01BWElOVDY0LCAtMSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGdfcGFyYW1fc3BlY19pbnQ2NCAoInRpbWVzdGFtcC1kZXZpYXRpb24iLAorICAgICAgICAidGltZXN0YW1wIGRldmlhdGlvbiIsCisgICAgICAgICJhdmVyYWdlIGRpZmZlcmVuY2UgaW4gdXNlYyBiZXR3ZWVuIHRpbWVzdGFtcCBvZiBuZXh0IGJ1ZmZlciAiCisgICAgICAgICJhbmQgZXhwZWN0ZWQgdGltZXN0YW1wIGZyb20gYW5hbHl6aW5nIGxhc3QgYnVmZmVyIiwKKyAgICAgICAgLTEsIEdfTUFYSU5UNjQsIC0xLCBHX1BBUkFNX1JFQURBQkxFKTsKKyAgfQorfQorCitzdGF0aWMgZ3BvaW50ZXIKK3RpbWVkdXJfbmV3IChjb25zdCBHc3RUZXN0SW5mbyAqIGluZm8pCit7CisgIFRpbWVEdXJUZXN0ICpyZXQgPSBnX25ldzAgKFRpbWVEdXJUZXN0LCAxKTsKKworICByZXQtPmV4cGVjdGVkID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAordGltZWR1cl9hZGQgKGdwb2ludGVyIHRlc3QsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgVGltZUR1clRlc3QgKnQgPSB0ZXN0OworCisgIGlmIChHU1RfQlVGRkVSX1RJTUVTVEFNUF9JU19WQUxJRCAoYnVmZmVyKSAmJgorICAgICAgR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHQtPmV4cGVjdGVkKSkgeworICAgIHQtPmRpZmYgKz0KKyAgICAgICAgQUJTIChHU1RfQ0xPQ0tfRElGRiAodC0+ZXhwZWN0ZWQsIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpKSk7CisgICAgdC0+Y291bnQrKzsKKyAgfQorICBpZiAoR1NUX0JVRkZFUl9USU1FU1RBTVBfSVNfVkFMSUQgKGJ1ZmZlcikgJiYKKyAgICAgIEdTVF9CVUZGRVJfRFVSQVRJT05fSVNfVkFMSUQgKGJ1ZmZlcikpIHsKKyAgICB0LT5leHBlY3RlZCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpICsgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKTsKKyAgfSBlbHNlIHsKKyAgICB0LT5leHBlY3RlZCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCit0aW1lZHVyX2ZpbmlzaCAoZ3BvaW50ZXIgdGVzdCwgR1ZhbHVlICogdmFsdWUpCit7CisgIFRpbWVEdXJUZXN0ICp0ID0gdGVzdDsKKworICBpZiAoZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKSA9PSAtMSkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gKHQtPmRpZmYgLyBNQVggKDEsIHQtPmNvdW50KSkgPD0gZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK3RpbWVkdXJfZ2V0X3ZhbHVlIChncG9pbnRlciB0ZXN0LCBHVmFsdWUgKiB2YWx1ZSkKK3sKKyAgVGltZUR1clRlc3QgKnQgPSB0ZXN0OworCisgIGdfdmFsdWVfc2V0X2ludDY0ICh2YWx1ZSwgdCA/ICh0LT5kaWZmIC8gTUFYICgxLCB0LT5jb3VudCkpIDogLTEpOworfQorCisvKgorICoqKiBNRDUgKioqCisgKi8KKworc3RhdGljIEdQYXJhbVNwZWMgKgorbWQ1X2dldF9zcGVjIChjb25zdCBHc3RUZXN0SW5mbyAqIGluZm8sIGdib29sZWFuIGNvbXBhcmVfdmFsdWUpCit7CisgIGlmIChjb21wYXJlX3ZhbHVlKSB7CisgICAgcmV0dXJuIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJleHBlY3RlZC1tZDUiLCAiZXhwZWN0ZWQgbWQ1IiwKKyAgICAgICAgImV4cGVjdGVkIG1kNSBvZiBwcm9jZXNzaW5nIHRoZSB3aG9sZSBkYXRhIiwKKyAgICAgICAgIi0tLSIsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QpOworICB9IGVsc2UgeworICAgIHJldHVybiBnX3BhcmFtX3NwZWNfc3RyaW5nICgibWQ1IiwgIm1kNSIsCisgICAgICAgICJtZDUgb2YgcHJvY2Vzc2luZyB0aGUgd2hvbGUgZGF0YSIsICItLS0iLCBHX1BBUkFNX1JFQURBQkxFKTsKKyAgfQorfQorCitzdGF0aWMgZ3BvaW50ZXIKK21kNV9uZXcgKGNvbnN0IEdzdFRlc3RJbmZvICogaW5mbykKK3sKKyAgcmV0dXJuIGdfY2hlY2tzdW1fbmV3IChHX0NIRUNLU1VNX01ENSk7Cit9CisKK3N0YXRpYyB2b2lkCittZDVfYWRkIChncG9pbnRlciBjaGVja3N1bSwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RNYXBJbmZvIG1hcDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBnX2NoZWNrc3VtX3VwZGF0ZSAoY2hlY2tzdW0sIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorbWQ1X2ZpbmlzaCAoZ3BvaW50ZXIgY2hlY2tzdW0sIEdWYWx1ZSAqIHZhbHVlKQoreworICBjb25zdCBnY2hhciAqZXhwZWN0ZWQsICpyZXN1bHQ7CisKKyAgZXhwZWN0ZWQgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKTsKKyAgcmVzdWx0ID0gZ19jaGVja3N1bV9nZXRfc3RyaW5nIChjaGVja3N1bSk7CisKKyAgaWYgKGdfc3RyX2VxdWFsIChleHBlY3RlZCwgIi0tLSIpKQorICAgIHJldHVybiBUUlVFOworICBpZiAoZ19zdHJfZXF1YWwgKGV4cGVjdGVkLCByZXN1bHQpKQorICAgIHJldHVybiBUUlVFOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCittZDVfZ2V0X3ZhbHVlIChncG9pbnRlciBjaGVja3N1bSwgR1ZhbHVlICogdmFsdWUpCit7CisgIGlmICghY2hlY2tzdW0pIHsKKyAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCAiLS0tIik7CisgIH0gZWxzZSB7CisgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgZ19jaGVja3N1bV9nZXRfc3RyaW5nIChjaGVja3N1bSkpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCittZDVfZnJlZSAoZ3BvaW50ZXIgY2hlY2tzdW0pCit7CisgIGdfY2hlY2tzdW1fZnJlZSAoY2hlY2tzdW0pOworfQorCisvKgorICoqKiBURVNUSU5GTyAqKioKKyAqLworCitjb25zdCBHc3RUZXN0SW5mbyB0ZXN0c1tdID0geworICB7bGVuZ3RoX2dldF9zcGVjLCBsZW5ndGhfbmV3LCBsZW5ndGhfYWRkLAorICAgICAgbGVuZ3RoX2ZpbmlzaCwgbGVuZ3RoX2dldF92YWx1ZSwgZ19mcmVlfSwKKyAge2J1ZmZlcl9jb3VudF9nZXRfc3BlYywgbGVuZ3RoX25ldywgYnVmZmVyX2NvdW50X2FkZCwKKyAgICAgIGxlbmd0aF9maW5pc2gsIGxlbmd0aF9nZXRfdmFsdWUsIGdfZnJlZX0sCisgIHt0aW1lZHVyX2dldF9zcGVjLCB0aW1lZHVyX25ldywgdGltZWR1cl9hZGQsCisgICAgICB0aW1lZHVyX2ZpbmlzaCwgdGltZWR1cl9nZXRfdmFsdWUsIGdfZnJlZX0sCisgIHttZDVfZ2V0X3NwZWMsIG1kNV9uZXcsIG1kNV9hZGQsCisgICAgICBtZDVfZmluaXNoLCBtZDVfZ2V0X3ZhbHVlLCBtZDVfZnJlZX0KK307CmRpZmYgLS1naXQgYS9nc3QvZGVidWd1dGlscy90ZXN0cy5oIGIvZ3N0L2RlYnVndXRpbHMvdGVzdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGZhMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlYnVndXRpbHMvdGVzdHMuaApAQCAtMCwwICsxLDQzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBCZW5qYW1pbiBPdHRlIDxvdHRlQGdub21lLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaWZuZGVmIF9fR1NUX1RFU1RTX0hfXworI2RlZmluZSBfX0dTVF9URVNUU19IX18KKworCit0eXBlZGVmIHN0cnVjdCBfR3N0VGVzdEluZm8gR3N0VGVzdEluZm87CisKK3N0cnVjdCBfR3N0VGVzdEluZm8KK3sKKyAgR1BhcmFtU3BlYyAqKCpnZXRfc3BlYykgKGNvbnN0IEdzdFRlc3RJbmZvICogaW5mbywgZ2Jvb2xlYW4gY29tcGFyZV92YWx1ZSk7CisgICAgZ3BvaW50ZXIgKCpuZXcpIChjb25zdCBHc3RUZXN0SW5mbyAqIGluZm8pOworICB2b2lkICgqYWRkKSAoZ3BvaW50ZXIgdGVzdCwgR3N0QnVmZmVyICogYnVmZmVyKTsKKyAgICBnYm9vbGVhbiAoKmZpbmlzaCkgKGdwb2ludGVyIHRlc3QsIEdWYWx1ZSAqIHZhbHVlKTsKKyAgdm9pZCAoKmdldF92YWx1ZSkgKGdwb2ludGVyIHRlc3QsIEdWYWx1ZSAqIHZhbHVlKTsKKyAgdm9pZCAoKmZyZWUpIChncG9pbnRlciB0ZXN0KTsKK307CisKK2V4dGVybiBjb25zdCBHc3RUZXN0SW5mbyB0ZXN0c1tdOworLyoga2VlcCB1cCB0byBkYXRlISAqLworI2RlZmluZSBURVNUU19DT1VOVCAoNCkKKworCisjZW5kaWYgLyogX19HU1RfVEVTVFNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW0gYi9nc3QvZGVpbnRlcmxhY2UvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlN2VkOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUyIEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RkZWludGVybGFjZS5sYQorCitPUkNfU09VUkNFPXR2dGltZQoraW5jbHVkZSAkKHRvcF9zcmNkaXIpL2NvbW1vbi9vcmMubWFrCisKK2xpYmdzdGRlaW50ZXJsYWNlX2xhX1NPVVJDRVMgPSBcCisJZ3N0ZGVpbnRlcmxhY2UuYyBcCisJZ3N0ZGVpbnRlcmxhY2VtZXRob2QuYyBcCisJdHZ0aW1lL3RvbXNtb2NvbXAuYyBcCisJdHZ0aW1lL2dyZWVkeS5jIFwKKwl0dnRpbWUvZ3JlZWR5aC5jIFwKKwl0dnRpbWUvdmZpci5jIFwKKwl0dnRpbWUvd2VhdmV0ZmYuYyBcCisJdHZ0aW1lL3dlYXZlYmZmLmMgXAorCXR2dGltZS93ZWF2ZS5jIFwKKwl0dnRpbWUvbGluZWFyLmMgXAorCXR2dGltZS9saW5lYXJibGVuZC5jIFwKKwl0dnRpbWUvc2NhbGVyYm9iLmMKK25vZGlzdF9saWJnc3RkZWludGVybGFjZV9sYV9TT1VSQ0VTID0gJChPUkNfTk9ESVNUX1NPVVJDRVMpCisKK2xpYmdzdGRlaW50ZXJsYWNlX2xhX0NGTEFHUyA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKE9SQ19DRkxBR1MpCitsaWJnc3RkZWludGVybGFjZV9sYV9MSUJBREQgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dmlkZW8tJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykgJChPUkNfTElCUykKK2xpYmdzdGRlaW50ZXJsYWNlX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBcCisJZ3N0ZGVpbnRlcmxhY2UuaCBcCisJZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaCBcCisJdHZ0aW1lL21teC5oIFwKKwl0dnRpbWUvc3NlLmggXAorCXR2dGltZS9ncmVlZHloLmFzbSBcCisJdHZ0aW1lL2dyZWVkeWhtYWNyb3MuaCBcCisJdHZ0aW1lL3BsdWdpbnMuaCBcCisJdHZ0aW1lL3g4Ni02NF9tYWNyb3MuaW5jIFwKKwl0dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wMEEuaW5jIFwKKwl0dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wQm90dG9tLmluYyBcCisJdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEVkZ2VBOC5pbmMgXAorCXR2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BFZGdlQS5pbmMgXAorCXR2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBMi5pbmMgXAorCXR2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBNi5pbmMgXAorCXR2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBSDIuaW5jIFwKKwl0dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wT2RkQUguaW5jIFwKKwl0dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wT2RkQS5pbmMgXAorCXR2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BUb3AuaW5jIFwKKwl0dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wVkFILmluYyBcCisJdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFZBLmluYyBcCisJdHZ0aW1lL3RvbXNtb2NvbXAvU3RyYW5nZUJvYi5pbmMgXAorCXR2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwyLmluYyBcCisJdHZ0aW1lL3RvbXNtb2NvbXAvVG9tc01vQ29tcEFsbC5pbmMgXAorCXR2dGltZS90b21zbW9jb21wL3RvbXNtb2NvbXBtYWNyb3MuaCBcCisJdHZ0aW1lL3RvbXNtb2NvbXAvV2llcmRCb2IuaW5jCmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYyBiL2dzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MmExYzQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuYwpAQCAtMCwwICsxLDMxNDQgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNYXJ0aW4gRWlrZXJtYW5uIDxtZWlrZXJAdXBiLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSAyMDExIFJvYmVydCBTd2FpbiA8cm9iZXJ0LnN3YWluQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1kZWludGVybGFjZQorICoKKyAqIGRlaW50ZXJsYWNlIGRlaW50ZXJsYWNlcyBpbnRlcmxhY2VkIHZpZGVvIGZyYW1lcyB0byBwcm9ncmVzc2l2ZSB2aWRlbyBmcmFtZXMuCisgKiBGb3IgdGhpcyBkaWZmZXJlbnQgYWxnb3JpdGhtcyBjYW4gYmUgc2VsZWN0ZWQgd2hpY2ggd2lsbCBiZSBkZXNjcmliZWQgbGF0ZXIuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249L3BhdGgvdG8vZmlsZSAhIGRlY29kZWJpbiAhIHZpZGVvY29udmVydCAhIGRlaW50ZXJsYWNlICEgdmlkZW9jb252ZXJ0ICEgYXV0b3ZpZGVvc2luaworICogXXwgVGhpcyBwaXBlbGluZSBkZWludGVybGFjZXMgYSB2aWRlbyBmaWxlIHdpdGggdGhlIGRlZmF1bHQgZGVpbnRlcmxhY2luZyBvcHRpb25zLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RkZWludGVybGFjZS5oIgorI2luY2x1ZGUgInR2dGltZS9wbHVnaW5zLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIEhBVkVfT1JDCisjaW5jbHVkZSA8b3JjL29yYy5oPgorI2VuZGlmCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGRlaW50ZXJsYWNlX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChkZWludGVybGFjZV9kZWJ1ZykKKworLyogUHJvcGVydGllcyAqLworCisjZGVmaW5lIERFRkFVTFRfTU9ERSAgICAgICAgICAgIEdTVF9ERUlOVEVSTEFDRV9NT0RFX0FVVE8KKyNkZWZpbmUgREVGQVVMVF9NRVRIT0QgICAgICAgICAgR1NUX0RFSU5URVJMQUNFX0xJTkVBUgorI2RlZmluZSBERUZBVUxUX0ZJRUxEUyAgICAgICAgICBHU1RfREVJTlRFUkxBQ0VfQUxMCisjZGVmaW5lIERFRkFVTFRfRklFTERfTEFZT1VUICAgIEdTVF9ERUlOVEVSTEFDRV9MQVlPVVRfQVVUTworI2RlZmluZSBERUZBVUxUX0xPQ0tJTkcgICAgICAgICBHU1RfREVJTlRFUkxBQ0VfTE9DS0lOR19OT05FCisjZGVmaW5lIERFRkFVTFRfSUdOT1JFX09CU0NVUkUgIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9EUk9QX09SUEhBTlMgICAgVFJVRQorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9NT0RFLAorICBQUk9QX01FVEhPRCwKKyAgUFJPUF9GSUVMRFMsCisgIFBST1BfRklFTERfTEFZT1VULAorICBQUk9QX0xPQ0tJTkcsCisgIFBST1BfSUdOT1JFX09CU0NVUkUsCisgIFBST1BfRFJPUF9PUlBIQU5TCit9OworCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfUCAgICAoMTw8MCkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX0JVRkZFUl9TVEFURV9JICAgICgxPDwxKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfQlVGRkVSX1NUQVRFX1RDX0IgKDE8PDIpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfVENfVCAoMTw8MykKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX0JVRkZFUl9TVEFURV9UQ19QICgxPDw0KQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfQlVGRkVSX1NUQVRFX1RDX00gKDE8PDUpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfUkZGICAoMTw8NikKKworI2RlZmluZSBHU1RfT05FIFwKKyAgKEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfVENfVCB8IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfVENfQikKKyNkZWZpbmUgR1NUX1BSRyBcCisgIChHU1RfREVJTlRFUkxBQ0VfQlVGRkVSX1NUQVRFX1AgfCBHU1RfREVJTlRFUkxBQ0VfQlVGRkVSX1NUQVRFX1RDX1ApCisjZGVmaW5lIEdTVF9JTlQgXAorICAoR1NUX0RFSU5URVJMQUNFX0JVRkZFUl9TVEFURV9JIHwgR1NUX0RFSU5URVJMQUNFX0JVRkZFUl9TVEFURV9UQ19NKQorI2RlZmluZSBHU1RfUkZGIChHU1RfREVJTlRFUkxBQ0VfQlVGRkVSX1NUQVRFX1JGRikKKworI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfT0JTQ1VSRV9USFJFU0hPTEQgNQorCitzdGF0aWMgY29uc3QgVGVsZWNpbmVQYXR0ZXJuIHRlbGVjaW5lX3BhdHRlcm5zW10gPSB7CisgIC8qIDYwaSAtPiA2MHAgb3IgNTBpIC0+IDUwcCAoTk9URSBUSEUgV0VJUkQgUkFUSU9TKSAqLworICB7IjE6MSIsIDEsIDIsIDEsIHtHU1RfT05FLH19LAorICAvKiA2MGkgLT4gMzBwIG9yIDUwaSAtPiAyNXAgKi8KKyAgeyIyOjIiLCAxLCAxLCAxLCB7R1NUX0lOVCx9fSwKKyAgLyogNjBpIHRlbGVjaW5lIC0+IDI0cCAqLworICB7IjI6My1SRkYiLCA0LCA0LCA1LCB7R1NUX1BSRywgR1NUX1JGRiwgR1NUX1BSRywgR1NUX1JGRix9fSwKKyAgeyIyOjMiLCA1LCA0LCA1LCB7R1NUX1BSRywgR1NUX1BSRywgR1NUX09ORSwgR1NUX09ORSwgR1NUX1BSRyx9fSwKKyAgeyIzOjI6MjozLVJGRiIsIDQsIDQsIDUsIHtHU1RfUkZGLCBHU1RfUFJHLCBHU1RfUFJHLCBHU1RfUkZGLH19LAorICB7IjM6MjoyOjMiLCA1LCA0LCA1LCB7R1NUX1BSRywgR1NUX09ORSwgR1NUX0lOVCwgR1NUX09ORSwgR1NUX1BSRyx9fSwKKyAgLyogZmllbGRhbmFseXNpcyBzaG91bGQgaW5kaWNhdGUgdGhpcyB1c2luZyBSRkYgb24gdGhlIHNlY29uZCBhbmQgZm91cnRoCisgICAqIGJ1ZmZlcnMgYW5kIG5vdCBzZW5kIHRoZSB0aGlyZCBidWZmZXIgYXQgYWxsLiBpdCB3aWxsIGJlIGlkZW50aWZpZWQgYXMKKyAgICogMzoyOjI6My1SRkYgKi8KKyAgLyogeyIyOjM6MzoyIiwgNSwgNCwgNSwge0dTVF9QUkcsIEdTVF9QUkcsIEdTVF9EUlAsIEdTVF9QUkcsIEdTVF9QUkcsfX0sICovCisKKyAgLyogVGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgb2JzY3VyZSBhbmQgYXJlIGlnbm9yZWQgaWYgaWdub3JlLW9ic2N1cmUgaXMKKyAgICogc2V0IHRvIHRydWUuIElmIGFueSBwYXR0ZXJucyBhcmUgYWRkZWQgYWJvdmUgdGhpcyBsaW5lLCBjaGVjayBhbmQgZWRpdAorICAgKiBHU1RfREVJTlRFUkxBQ0VfT0JTQ1VSRV9USFJFU0hPTEQgKi8KKworICAvKiA1MGkgRXVybyBwdWxsZG93biAtPiAyNHAgKi8KKyAgeyIyLTExOjMiLCAyNSwgMjQsIDI1LCB7R1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywKKyAgICAgICAgICAgICAgR1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywKKyAgICAgICAgICAgICAgR1NUX1BSRywgR1NUX1BSRywgR1NUX09ORSwgR1NUX0lOVCwgR1NUX0lOVCwKKyAgICAgICAgICAgICAgR1NUX0lOVCwgR1NUX0lOVCwgR1NUX0lOVCwgR1NUX0lOVCwgR1NUX0lOVCwKKyAgICAgICAgICBHU1RfSU5ULCBHU1RfSU5ULCBHU1RfSU5ULCBHU1RfT05FLCBHU1RfUFJHLH19LAorI2lmIDAKKyAgLyogaGF2ZW4ndCBmaWd1cmVkIG91dCBob3cgZmllbGRhbmFseXNpcyBzaG91bGQgaGFuZGxlIHRoZXNlIHlldCAqLworICAvKiA2MGkgKE5UU0MgMzAwMDAvMTAwMSkgLT4gMTZwICgxNjAwMC8xMDAxKSAqLworICB7IjM6NC0zIiwgMTUsIDgsIDE1LCB7R1NUX1BSRywgR1NUX0RSUCwgR1NUX1BSRywgR1NUX0RSUCwgR1NUX1BSRywKKyAgICAgICAgICAgICAgR1NUX0RSUCwgR1NUX1BSRywgR1NUX0RSUCwgR1NUX1BSRywgR1NUX0RSUCwKKyAgICAgICAgICBHU1RfUFJHLCBHU1RfRFJQLCBHU1RfUFJHLCBHU1RfRFJQLCBHU1RfUFJHLH19LAorICAvKiA1MGkgKFBBTCkgLT4gMTZwICovCisgIHsiMy03OjQiLCAyNSwgMTYsIDI1LCB7R1NUX1BSRywgR1NUX0RSUCwgR1NUX1BSRywgR1NUX1BSRywgR1NUX0RSUCwKKyAgICAgICAgICAgICAgR1NUX1BSRywgR1NUX1BSRywgR1NUX0RSUCwgR1NUX1BSRywgR1NUX1BSRywKKyAgICAgICAgICAgICAgR1NUX0RSUCwgR1NUX1BSRywgR1NUX0RSUCwgR1NUX1BSRywgR1NUX1BSRywKKyAgICAgICAgICAgICAgR1NUX0RSUCwgR1NUX1BSRywgR1NUX1BSRywgR1NUX0RSUCwgR1NUX1BSRywKKyAgICAgICAgICBHU1RfUFJHLCBHU1RfRFJQLCBHU1RfUFJHLCBHU1RfUFJHLCBHU1RfRFJQLH19LAorICAvKiBOVFNDIDYwaSAtPiAxOHAgKi8KKyAgeyIzOjM6NCIsIDUsIDMsIDUsIHtHU1RfUFJHLCBHU1RfRFJQLCBHU1RfUFJHLCBHU1RfRFJQLCBHU1RfUFJHLH19LAorICAvKiBOVFNDIDYwaSAtPiAyMHAgKi8KKyAgeyIzOjMiLCAzLCAyLCAzLCB7R1NUX1BSRywgR1NUX0RSUCwgR1NUX1BSRyx9fSwKKyNlbmRpZgorICAvKiBOVFNDIDYwaSAtPiAyNy41ICovCisgIHsiMzoyLTQiLCAxMSwgMTAsIDExLCB7R1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywKKyAgICAgICAgICAgICAgR1NUX1BSRywgR1NUX09ORSwgR1NUX0lOVCwgR1NUX0lOVCwgR1NUX0lOVCwKKyAgICAgICAgICBHU1RfT05FLH19LAorICAvKiBQQUwgNTBpIC0+IDI3LjUgKi8KKyAgeyIxOjItNCIsIDksIDksIDEwLCB7R1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywgR1NUX1BSRywgR1NUX0lOVCwKKyAgICAgICAgICBHU1RfSU5ULCBHU1RfSU5ULCBHU1RfSU5ULCBHU1RfSU5ULH19LAorfTsKKworc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgbWV0aG9kc190eXBlc1tdID0geworICB7R1NUX0RFSU5URVJMQUNFX1RPTVNNT0NPTVAsICJNb3Rpb24gQWRhcHRpdmU6IE1vdGlvbiBTZWFyY2giLAorICAgICAgInRvbXNtb2NvbXAifSwKKyAge0dTVF9ERUlOVEVSTEFDRV9HUkVFRFlfSCwgIk1vdGlvbiBBZGFwdGl2ZTogQWR2YW5jZWQgRGV0ZWN0aW9uIiwKKyAgICAgICJncmVlZHloIn0sCisgIHtHU1RfREVJTlRFUkxBQ0VfR1JFRURZX0wsICJNb3Rpb24gQWRhcHRpdmU6IFNpbXBsZSBEZXRlY3Rpb24iLCAiZ3JlZWR5bCJ9LAorICB7R1NUX0RFSU5URVJMQUNFX1ZGSVIsICJCbHVyIFZlcnRpY2FsIiwgInZmaXIifSwKKyAge0dTVF9ERUlOVEVSTEFDRV9MSU5FQVIsICJMaW5lYXIiLCAibGluZWFyIn0sCisgIHtHU1RfREVJTlRFUkxBQ0VfTElORUFSX0JMRU5ELCAiQmx1cjogVGVtcG9yYWwgKERvIE5vdCBVc2UpIiwKKyAgICAgICJsaW5lYXJibGVuZCJ9LAorICB7R1NUX0RFSU5URVJMQUNFX1NDQUxFUl9CT0IsICJEb3VibGUgbGluZXMiLCAic2NhbGVyYm9iIn0sCisgIHtHU1RfREVJTlRFUkxBQ0VfV0VBVkUsICJXZWF2ZSAoRG8gTm90IFVzZSkiLCAid2VhdmUifSwKKyAge0dTVF9ERUlOVEVSTEFDRV9XRUFWRV9URkYsICJQcm9ncmVzc2l2ZTogVG9wIEZpZWxkIEZpcnN0IChEbyBOb3QgVXNlKSIsCisgICAgICAid2VhdmV0ZmYifSwKKyAge0dTVF9ERUlOVEVSTEFDRV9XRUFWRV9CRkYsICJQcm9ncmVzc2l2ZTogQm90dG9tIEZpZWxkIEZpcnN0IChEbyBOb3QgVXNlKSIsCisgICAgICAid2VhdmViZmYifSwKKyAgezAsIE5VTEwsIE5VTEx9LAorfTsKKworc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgbG9ja2luZ190eXBlc1tdID0geworICB7R1NUX0RFSU5URVJMQUNFX0xPQ0tJTkdfTk9ORSwKKyAgICAgICJObyBwYXR0ZXJuIGxvY2tpbmciLCAibm9uZSJ9LAorICB7R1NUX0RFSU5URVJMQUNFX0xPQ0tJTkdfQVVUTywKKyAgICAgICAgIkNob29zZSBwYXNzaXZlL2FjdGl2ZSBsb2NraW5nIGRlcGVuZGluZyBvbiB3aGV0aGVyIHVwc3RyZWFtIGlzIGxpdmUiLAorICAgICAgImF1dG8ifSwKKyAge0dTVF9ERUlOVEVSTEFDRV9MT0NLSU5HX0FDVElWRSwKKyAgICAgICAgIkJsb2NrIHVudGlsIHBhdHRlcm4tbG9ja2VkLiBVc2UgYWNjdXJhdGUgdGltZXN0YW1wIGludGVycG9sYXRpb24gd2l0aGluIGEgcGF0dGVybiByZXBlYXQuIiwKKyAgICAgICJhY3RpdmUifSwKKyAge0dTVF9ERUlOVEVSTEFDRV9MT0NLSU5HX1BBU1NJVkUsCisgICAgICAgICJEbyBub3QgYmxvY2suIFVzZSBuYcOvdmUgdGltZXN0YW1wIGFkanVzdG1lbnQgdW50aWwgcGF0dGVybi1sb2NrZWQgYmFzZWQgb24gc3RhdGUgaGlzdG9yeS4iLAorICAgICAgInBhc3NpdmUifSwKKyAgezAsIE5VTEwsIE5VTEx9LAorfTsKKworCisjZGVmaW5lIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRFMgKGdzdF9kZWludGVybGFjZV9tZXRob2RzX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kc19nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGRlaW50ZXJsYWNlX21ldGhvZHNfdHlwZSA9IDA7CisKKyAgaWYgKCFkZWludGVybGFjZV9tZXRob2RzX3R5cGUpIHsKKyAgICBkZWludGVybGFjZV9tZXRob2RzX3R5cGUgPQorICAgICAgICBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0RGVpbnRlcmxhY2VNZXRob2RzIiwgbWV0aG9kc190eXBlcyk7CisgIH0KKyAgcmV0dXJuIGRlaW50ZXJsYWNlX21ldGhvZHNfdHlwZTsKK30KKworI2RlZmluZSBHU1RfVFlQRV9ERUlOVEVSTEFDRV9GSUVMRFMgKGdzdF9kZWludGVybGFjZV9maWVsZHNfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9kZWludGVybGFjZV9maWVsZHNfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBkZWludGVybGFjZV9maWVsZHNfdHlwZSA9IDA7CisKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgZmllbGRzX3R5cGVzW10gPSB7CisgICAge0dTVF9ERUlOVEVSTEFDRV9BTEwsICJBbGwgZmllbGRzIiwgImFsbCJ9LAorICAgIHtHU1RfREVJTlRFUkxBQ0VfVEYsICJUb3AgZmllbGRzIG9ubHkiLCAidG9wIn0sCisgICAge0dTVF9ERUlOVEVSTEFDRV9CRiwgIkJvdHRvbSBmaWVsZHMgb25seSIsICJib3R0b20ifSwKKyAgICB7R1NUX0RFSU5URVJMQUNFX0ZJRUxEU19BVVRPLCAiQXV0b21hdGljYWxseSBkZXRlY3QiLCAiYXV0byJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIWRlaW50ZXJsYWNlX2ZpZWxkc190eXBlKSB7CisgICAgZGVpbnRlcmxhY2VfZmllbGRzX3R5cGUgPQorICAgICAgICBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0RGVpbnRlcmxhY2VGaWVsZHMiLCBmaWVsZHNfdHlwZXMpOworICB9CisgIHJldHVybiBkZWludGVybGFjZV9maWVsZHNfdHlwZTsKK30KKworI2RlZmluZSBHU1RfVFlQRV9ERUlOVEVSTEFDRV9GSUVMRF9MQVlPVVQgKGdzdF9kZWludGVybGFjZV9maWVsZF9sYXlvdXRfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9kZWludGVybGFjZV9maWVsZF9sYXlvdXRfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBkZWludGVybGFjZV9maWVsZF9sYXlvdXRfdHlwZSA9IDA7CisKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgZmllbGRfbGF5b3V0X3R5cGVzW10gPSB7CisgICAge0dTVF9ERUlOVEVSTEFDRV9MQVlPVVRfQVVUTywgIkF1dG8gZGV0ZWN0aW9uIiwgImF1dG8ifSwKKyAgICB7R1NUX0RFSU5URVJMQUNFX0xBWU9VVF9URkYsICJUb3AgZmllbGQgZmlyc3QiLCAidGZmIn0sCisgICAge0dTVF9ERUlOVEVSTEFDRV9MQVlPVVRfQkZGLCAiQm90dG9tIGZpZWxkIGZpcnN0IiwgImJmZiJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIWRlaW50ZXJsYWNlX2ZpZWxkX2xheW91dF90eXBlKSB7CisgICAgZGVpbnRlcmxhY2VfZmllbGRfbGF5b3V0X3R5cGUgPQorICAgICAgICBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0RGVpbnRlcmxhY2VGaWVsZExheW91dCIsCisgICAgICAgIGZpZWxkX2xheW91dF90eXBlcyk7CisgIH0KKyAgcmV0dXJuIGRlaW50ZXJsYWNlX2ZpZWxkX2xheW91dF90eXBlOworfQorCisjZGVmaW5lIEdTVF9UWVBFX0RFSU5URVJMQUNFX01PREVTIChnc3RfZGVpbnRlcmxhY2VfbW9kZXNfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9kZWludGVybGFjZV9tb2Rlc19nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGRlaW50ZXJsYWNlX21vZGVzX3R5cGUgPSAwOworCisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIG1vZGVzX3R5cGVzW10gPSB7CisgICAge0dTVF9ERUlOVEVSTEFDRV9NT0RFX0FVVE8sICJBdXRvIGRldGVjdGlvbiAoYmVzdCBlZmZvcnQpIiwgImF1dG8ifSwKKyAgICB7R1NUX0RFSU5URVJMQUNFX01PREVfSU5URVJMQUNFRCwgIkZvcmNlIGRlaW50ZXJsYWNpbmciLCAiaW50ZXJsYWNlZCJ9LAorICAgIHtHU1RfREVJTlRFUkxBQ0VfTU9ERV9ESVNBQkxFRCwgIlJ1biBpbiBwYXNzdGhyb3VnaCBtb2RlIiwgImRpc2FibGVkIn0sCisgICAge0dTVF9ERUlOVEVSTEFDRV9NT0RFX0FVVE9fU1RSSUNULCAiQXV0byBkZXRlY3Rpb24gKHN0cmljdCkiLAorICAgICAgICAiYXV0by1zdHJpY3QifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0sCisgIH07CisKKyAgaWYgKCFkZWludGVybGFjZV9tb2Rlc190eXBlKSB7CisgICAgZGVpbnRlcmxhY2VfbW9kZXNfdHlwZSA9CisgICAgICAgIGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3REZWludGVybGFjZU1vZGVzIiwgbW9kZXNfdHlwZXMpOworICB9CisgIHJldHVybiBkZWludGVybGFjZV9tb2Rlc190eXBlOworfQorCisjZGVmaW5lIEdTVF9UWVBFX0RFSU5URVJMQUNFX0xPQ0tJTkcgKGdzdF9kZWludGVybGFjZV9sb2NraW5nX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfZGVpbnRlcmxhY2VfbG9ja2luZ19nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGRlaW50ZXJsYWNlX2xvY2tpbmdfdHlwZSA9IDA7CisKKyAgaWYgKCFkZWludGVybGFjZV9sb2NraW5nX3R5cGUpIHsKKyAgICBkZWludGVybGFjZV9sb2NraW5nX3R5cGUgPQorICAgICAgICBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0RGVpbnRlcmxhY2VMb2NraW5nIiwgbG9ja2luZ190eXBlcyk7CisgIH0KKworICByZXR1cm4gZGVpbnRlcmxhY2VfbG9ja2luZ190eXBlOworfQorCisjZGVmaW5lIERFSU5URVJMQUNFX1ZJREVPX0ZPUk1BVFMgXAorICAgICJ7IEFZVVYsIEFSR0IsIEFCR1IsIFJHQkEsIEJHUkEsIFk0NDQsIHhSR0IsIHhCR1IsIFJHQngsIEJHUngsIFJHQiwgIiBcCisgICAgIkJHUiwgWVVZMiwgWVZZVSwgVVlWWSwgWTQyQiwgSTQyMCwgWVYxMiwgWTQxQiwgTlYxMiwgTlYyMSB9IgorCisjZGVmaW5lIERFSU5URVJMQUNFX0NBUFMgR1NUX1ZJREVPX0NBUFNfTUFLRShERUlOVEVSTEFDRV9WSURFT19GT1JNQVRTKQorCisjZGVmaW5lIERFSU5URVJMQUNFX0FMTF9DQVBTIERFSU5URVJMQUNFX0NBUFMgIjsiIFwKKyAgICBHU1RfVklERU9fQ0FQU19NQUtFX1dJVEhfRkVBVFVSRVMgKCJBTlkiLCBHU1RfVklERU9fRk9STUFUU19BTEwpCisKK3N0YXRpYyBHc3RTdGF0aWNDYXBzIHByb2dyZXNzaXZlX2NhcHMgPQorR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1yYXcoQU5ZKSxpbnRlcmxhY2UtbW9kZT0oc3RyaW5nKXByb2dyZXNzaXZlIik7CitzdGF0aWMgR3N0U3RhdGljQ2FwcyBkZWludGVybGFjZV9jYXBzID0gR1NUX1NUQVRJQ19DQVBTIChERUlOVEVSTEFDRV9DQVBTKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbCA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKERFSU5URVJMQUNFX0FMTF9DQVBTKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChERUlOVEVSTEFDRV9BTExfQ0FQUykKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfZGVpbnRlcmxhY2VfZmluYWxpemUgKEdPYmplY3QgKiBzZWxmKTsKK3N0YXRpYyB2b2lkIGdzdF9kZWludGVybGFjZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBzZWxmLCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2RlaW50ZXJsYWNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIHNlbGYsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBHc3RDYXBzICpnc3RfZGVpbnRlcmxhY2VfZ2V0Y2FwcyAoR3N0RGVpbnRlcmxhY2UgKiBzZWxmLCBHc3RQYWQgKiBwYWQsCisgICAgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2RlaW50ZXJsYWNlX3NldGNhcHMgKEdzdERlaW50ZXJsYWNlICogc2VsZiwgR3N0UGFkICogcGFkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZGVpbnRlcmxhY2Vfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2RlaW50ZXJsYWNlX3NpbmtfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2RlaW50ZXJsYWNlX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9kZWludGVybGFjZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworc3RhdGljIGdib29sZWFuIGdzdF9kZWludGVybGFjZV9zZXRfYWxsb2NhdGlvbiAoR3N0RGVpbnRlcmxhY2UgKiBzZWxmLAorICAgIEdzdEJ1ZmZlclBvb2wgKiBwb29sLCBHc3RBbGxvY2F0b3IgKiBhbGxvY2F0b3IsCisgICAgR3N0QWxsb2NhdGlvblBhcmFtcyAqIHBhcmFtcyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZGVpbnRlcmxhY2Vfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZGVpbnRlcmxhY2Vfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2RlaW50ZXJsYWNlX291dHB1dF9mcmFtZSAoR3N0RGVpbnRlcmxhY2UgKiBzZWxmLAorICAgIGdib29sZWFuIGZsdXNoaW5nKTsKK3N0YXRpYyB2b2lkIGdzdF9kZWludGVybGFjZV9yZXNldCAoR3N0RGVpbnRlcmxhY2UgKiBzZWxmKTsKK3N0YXRpYyB2b2lkIGdzdF9kZWludGVybGFjZV91cGRhdGVfcW9zIChHc3REZWludGVybGFjZSAqIHNlbGYsCisgICAgZ2RvdWJsZSBwcm9wb3J0aW9uLCBHc3RDbG9ja1RpbWVEaWZmIGRpZmYsIEdzdENsb2NrVGltZSB0aW1lKTsKK3N0YXRpYyB2b2lkIGdzdF9kZWludGVybGFjZV9yZXNldF9xb3MgKEdzdERlaW50ZXJsYWNlICogc2VsZik7CitzdGF0aWMgdm9pZCBnc3RfZGVpbnRlcmxhY2VfcmVhZF9xb3MgKEdzdERlaW50ZXJsYWNlICogc2VsZiwKKyAgICBnZG91YmxlICogcHJvcG9ydGlvbiwgR3N0Q2xvY2tUaW1lICogdGltZSk7CisKKyNkZWZpbmUgSVNfVEVMRUNJTkUobSkgKChtKSA9PSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfTUlYRUQgJiYgc2VsZi0+cGF0dGVybiA+IDEpCisKKy8qIEZJWE1FOiB3aGF0J3MgdGhlIHBvaW50IG9mIHRoZSBjaGlsZHByb3h5IGludGVyZmFjZSBoZXJlPyBXaGF0IGNhbiB5b3UKKyAqIGFjdHVhbGx5IGRvIHdpdGggaXQ/IFRoZSBtZXRob2Qgb2JqZWN0cyBzZWVtIHRvIGhhdmUgbm8gcHJvcGVydGllcyAqLworI2lmIDAKK3N0YXRpYyB2b2lkIGdzdF9kZWludGVybGFjZV9jaGlsZF9wcm94eV9pbnRlcmZhY2VfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwKKyAgICBncG9pbnRlciBpZmFjZV9kYXRhKTsKKworc3RhdGljIHZvaWQKK19kb19pbml0IChHVHlwZSBvYmplY3RfdHlwZSkKK3sKKyAgY29uc3QgR0ludGVyZmFjZUluZm8gY2hpbGRfcHJveHlfaW50ZXJmYWNlX2luZm8gPSB7CisgICAgKEdJbnRlcmZhY2VJbml0RnVuYykgZ3N0X2RlaW50ZXJsYWNlX2NoaWxkX3Byb3h5X2ludGVyZmFjZV9pbml0LAorICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRlcmZhY2VfZmluYWxpemUgKi8KKyAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50ZXJmYWNlX2RhdGEgKi8KKyAgfTsKKworICBnX3R5cGVfYWRkX2ludGVyZmFjZV9zdGF0aWMgKG9iamVjdF90eXBlLCBHU1RfVFlQRV9DSElMRF9QUk9YWSwKKyAgICAgICZjaGlsZF9wcm94eV9pbnRlcmZhY2VfaW5mbyk7Cit9CisjZW5kaWYKKworR19ERUZJTkVfVFlQRSAoR3N0RGVpbnRlcmxhY2UsIGdzdF9kZWludGVybGFjZSwgR1NUX1RZUEVfRUxFTUVOVCk7CisKKyNkZWZpbmUgcGFyZW50X2NsYXNzIGdzdF9kZWludGVybGFjZV9wYXJlbnRfY2xhc3MKKworc3RhdGljIGNvbnN0IHN0cnVjdAoreworICBHVHlwZSAoKmdldF90eXBlKSAodm9pZCk7Cit9IF9tZXRob2RfdHlwZXNbXSA9IHsKKyAgeworICBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3RvbXNtb2NvbXBfZ2V0X3R5cGV9LCB7CisgIGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2hfZ2V0X3R5cGV9LCB7CisgIGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2xfZ2V0X3R5cGV9LCB7CisgIGdzdF9kZWludGVybGFjZV9tZXRob2RfdmZpcl9nZXRfdHlwZX0sIHsKKyAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9saW5lYXJfZ2V0X3R5cGV9LCB7CisgIGdzdF9kZWludGVybGFjZV9tZXRob2RfbGluZWFyX2JsZW5kX2dldF90eXBlfSwgeworICBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3NjYWxlcl9ib2JfZ2V0X3R5cGV9LCB7CisgIGdzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfZ2V0X3R5cGV9LCB7CisgIGdzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfdGZmX2dldF90eXBlfSwgeworICBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX2JmZl9nZXRfdHlwZX0KK307CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2Vfc2V0X21ldGhvZCAoR3N0RGVpbnRlcmxhY2UgKiBzZWxmLCBHc3REZWludGVybGFjZU1ldGhvZHMgbWV0aG9kKQoreworICBHVHlwZSBtZXRob2RfdHlwZTsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBHc3RWaWRlb0Zvcm1hdCBmb3JtYXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlNldHRpbmcgbmV3IG1ldGhvZCAlZCIsIG1ldGhvZCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fSU5GT19XSURUSCAoJnNlbGYtPnZpbmZvKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUICgmc2VsZi0+dmluZm8pOworICBmb3JtYXQgPSBHU1RfVklERU9fSU5GT19GT1JNQVQgKCZzZWxmLT52aW5mbyk7CisKKyAgaWYgKHNlbGYtPm1ldGhvZCkgeworICAgIGlmIChzZWxmLT5tZXRob2RfaWQgPT0gbWV0aG9kICYmCisgICAgICAgIGdzdF9kZWludGVybGFjZV9tZXRob2Rfc3VwcG9ydGVkIChHX1RZUEVfRlJPTV9JTlNUQU5DRSAoc2VsZi0+bWV0aG9kKSwKKyAgICAgICAgICAgIGZvcm1hdCwgd2lkdGgsIGhlaWdodCkpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJSZXVzaW5nIGN1cnJlbnQgbWV0aG9kIik7CisgICAgICByZXR1cm47CisgICAgfQorI2lmIDAKKyAgICBnc3RfY2hpbGRfcHJveHlfY2hpbGRfcmVtb3ZlZCAoR1NUX09CSkVDVCAoc2VsZiksCisgICAgICAgIEdTVF9PQkpFQ1QgKHNlbGYtPm1ldGhvZCkpOworICAgIGdzdF9vYmplY3RfdW5wYXJlbnQgKEdTVF9PQkpFQ1QgKHNlbGYtPm1ldGhvZCkpOworICAgIHNlbGYtPm1ldGhvZCA9IE5VTEw7CisjZW5kaWYKKyAgfQorCisgIG1ldGhvZF90eXBlID0KKyAgICAgIF9tZXRob2RfdHlwZXNbbWV0aG9kXS5nZXRfdHlwZSAhPQorICAgICAgTlVMTCA/IF9tZXRob2RfdHlwZXNbbWV0aG9kXS5nZXRfdHlwZSAoKSA6IEdfVFlQRV9JTlZBTElEOworICBpZiAobWV0aG9kX3R5cGUgPT0gR19UWVBFX0lOVkFMSUQKKyAgICAgIHx8ICFnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3N1cHBvcnRlZCAobWV0aG9kX3R5cGUsIGZvcm1hdCwKKyAgICAgICAgICB3aWR0aCwgaGVpZ2h0KSkgeworICAgIEdUeXBlIHRtcDsKKyAgICBnaW50IGk7CisKKyAgICBtZXRob2RfdHlwZSA9IEdfVFlQRV9JTlZBTElEOworCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiTWV0aG9kIGRvZXNuJ3Qgc3VwcG9ydCByZXF1ZXN0ZWQgZm9ybWF0Iik7CisgICAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAoX21ldGhvZF90eXBlcyk7IGkrKykgeworICAgICAgaWYgKF9tZXRob2RfdHlwZXNbaV0uZ2V0X3R5cGUgPT0gTlVMTCkKKyAgICAgICAgY29udGludWU7CisgICAgICB0bXAgPSBfbWV0aG9kX3R5cGVzW2ldLmdldF90eXBlICgpOworICAgICAgaWYgKGdzdF9kZWludGVybGFjZV9tZXRob2Rfc3VwcG9ydGVkICh0bXAsIGZvcm1hdCwgd2lkdGgsIGhlaWdodCkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlVzaW5nIG1ldGhvZCAlZCIsIGkpOworICAgICAgICBtZXRob2RfdHlwZSA9IHRtcDsKKyAgICAgICAgbWV0aG9kID0gaTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIC8qIElmIHdlIGdldCBoZXJlIHdlIG11c3QgaGF2ZSBpbnZhbGlkIGNhcHMhICovCisgICAgZ19hc3NlcnQgKG1ldGhvZF90eXBlICE9IEdfVFlQRV9JTlZBTElEKTsKKyAgfQorCisgIHNlbGYtPm1ldGhvZCA9IGdfb2JqZWN0X25ldyAobWV0aG9kX3R5cGUsICJuYW1lIiwgIm1ldGhvZCIsIE5VTEwpOworICBzZWxmLT5tZXRob2RfaWQgPSBtZXRob2Q7CisKKyAgZ3N0X29iamVjdF9zZXRfcGFyZW50IChHU1RfT0JKRUNUIChzZWxmLT5tZXRob2QpLCBHU1RfT0JKRUNUIChzZWxmKSk7CisjaWYgMAorICBnc3RfY2hpbGRfcHJveHlfY2hpbGRfYWRkZWQgKEdTVF9PQkpFQ1QgKHNlbGYpLCBHU1RfT0JKRUNUIChzZWxmLT5tZXRob2QpKTsKKyNlbmRpZgorCisgIGlmIChzZWxmLT5tZXRob2QpCisgICAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9zZXR1cCAoc2VsZi0+bWV0aG9kLCAmc2VsZi0+dmluZm8pOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGFjZV9jbGlwX2J1ZmZlciAoR3N0RGVpbnRlcmxhY2UgKiBzZWxmLCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIEdzdENsb2NrVGltZSBzdGFydCwgc3RvcDsKKyAgZ3VpbnQ2NCBjc3RhcnQsIGNzdG9wOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAiQ2xpcHBpbmcgYnVmZmVyIHRvIHRoZSBjdXJyZW50IHNlZ21lbnQ6ICUiIEdTVF9USU1FX0ZPUk1BVCAiIC0tICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcikpKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkN1cnJlbnQgc2VnbWVudDogJSIgR1NUX1NFR01FTlRfRk9STUFULAorICAgICAgJnNlbGYtPnNlZ21lbnQpOworCisgIGlmIChHX1VOTElLRUxZIChzZWxmLT5zZWdtZW50LmZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUpKQorICAgIGdvdG8gYmVhY2g7CisgIGlmIChHX1VOTElLRUxZICghR1NUX0JVRkZFUl9USU1FU1RBTVBfSVNfVkFMSUQgKGJ1ZmZlcikpKQorICAgIGdvdG8gYmVhY2g7CisKKyAgc3RhcnQgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKTsKKyAgc3RvcCA9IHN0YXJ0ICsgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKTsKKworICBpZiAoIShyZXQgPSBnc3Rfc2VnbWVudF9jbGlwICgmc2VsZi0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgICAgICBzdGFydCwgc3RvcCwgJmNzdGFydCwgJmNzdG9wKSkpCisgICAgZ290byBiZWFjaDsKKworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSA9IGNzdGFydDsKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChjc3RvcCkpCisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSA9IGNzdG9wIC0gY3N0YXJ0OworCitiZWFjaDoKKyAgaWYgKHJldCkKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgICAiQ2xpcHBlZCBidWZmZXIgdG8gdGhlIGN1cnJlbnQgc2VnbWVudDogJSIgR1NUX1RJTUVfRk9STUFUICIgLS0gJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcikpKTsKKyAgZWxzZQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJCdWZmZXIgb3V0c2lkZSB0aGUgY3VycmVudCBzZWdtZW50IC0tIGRyb3BwaW5nIik7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9jbGFzc19pbml0IChHc3REZWludGVybGFjZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbCk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbCk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywKKyAgICAgICJEZWludGVybGFjZXIiLAorICAgICAgIkZpbHRlci9FZmZlY3QvVmlkZW8vRGVpbnRlcmxhY2UiLAorICAgICAgIkRlaW50ZXJsYWNlIE1ldGhvZHMgcG9ydGVkIGZyb20gRFNjYWxlci9UdlRpbWUiLAorICAgICAgIk1hcnRpbiBFaWtlcm1hbm4gPG1laWtlckB1cGIuZGU+LCAiCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2RlaW50ZXJsYWNlX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2RlaW50ZXJsYWNlX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfZGVpbnRlcmxhY2VfZmluYWxpemU7CisKKyAgLyoqCisgICAqIEdzdERlaW50ZXJsYWNlOm1vZGU6CisgICAqCisgICAqIFRoaXMgc2VsZWN0cyB3aGV0aGVyIHRoZSBkZWludGVybGFjaW5nIG1ldGhvZHMgc2hvdWxkCisgICAqIGFsd2F5cyBiZSBhcHBsaWVkIG9yIGlmIHRoZXkgc2hvdWxkIG9ubHkgYmUgYXBwbGllZAorICAgKiBvbiBjb250ZW50IHRoYXQgaGFzIHRoZSAiaW50ZXJsYWNlZCIgZmxhZyBvbiB0aGUgY2Fwcy4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgibW9kZSIsCisgICAgICAgICAgIk1vZGUiLAorICAgICAgICAgICJEZWludGVybGFjZSBNb2RlIiwKKyAgICAgICAgICBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NT0RFUywKKyAgICAgICAgICBERUZBVUxUX01PREUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykKKyAgICAgICk7CisKKyAgLyoqCisgICAqIEdzdERlaW50ZXJsYWNlOm1ldGhvZDoKKyAgICoKKyAgICogU2VsZWN0cyB0aGUgZGlmZmVyZW50IGRlaW50ZXJsYWNpbmcgYWxnb3JpdGhtcyB0aGF0IGNhbiBiZSB1c2VkLgorICAgKiBUaGVzZSBwcm92aWRlIGRpZmZlcmVudCBxdWFsaXR5IGFuZCBDUFUgdXNhZ2UuCisgICAqCisgICAqIFNvbWUgbWV0aG9kcyBwcm92aWRlIHBhcmFtZXRlcnMgd2hpY2ggY2FuIGJlIHNldCBieSBnZXR0aW5nCisgICAqIHRoZSAibWV0aG9kIiBjaGlsZCB2aWEgdGhlICNHc3RDaGlsZFByb3h5IGludGVyZmFjZSBhbmQKKyAgICogc2V0dGluZyB0aGUgYXBwcm9waWF0ZSBwcm9wZXJ0aWVzIG9uIGl0LgorICAgKgorICAgKiA8aXRlbWl6ZWRsaXN0PgorICAgKiA8bGlzdGl0ZW0+CisgICAqIDxwYXJhPgorICAgKiB0b21zbW9jb21wCisgICAqIE1vdGlvbiBBZGFwdGl2ZTogTW90aW9uIFNlYXJjaAorICAgKiA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDxsaXN0aXRlbT4KKyAgICogPHBhcmE+CisgICAqIGdyZWVkeWgKKyAgICogTW90aW9uIEFkYXB0aXZlOiBBZHZhbmNlZCBEZXRlY3Rpb24KKyAgICogPC9wYXJhPgorICAgKiA8L2xpc3RpdGVtPgorICAgKiA8bGlzdGl0ZW0+CisgICAqIDxwYXJhPgorICAgKiBncmVlZHlsCisgICAqIE1vdGlvbiBBZGFwdGl2ZTogU2ltcGxlIERldGVjdGlvbgorICAgKiA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDxsaXN0aXRlbT4KKyAgICogPHBhcmE+CisgICAqIHZmaXIKKyAgICogQmx1ciB2ZXJ0aWNhbAorICAgKiA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDxsaXN0aXRlbT4KKyAgICogPHBhcmE+CisgICAqIGxpbmVhcgorICAgKiBMaW5lYXIgaW50ZXJwb2xhdGlvbgorICAgKiA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDxsaXN0aXRlbT4KKyAgICogPHBhcmE+CisgICAqIGxpbmVhcmJsZW5kCisgICAqIExpbmVhciBpbnRlcnBvbGF0aW9uIGluIHRpbWUgZG9tYWluLiAgQW55IG1vdGlvbiBjYXVzZXMgc2lnbmlmaWNhbnQKKyAgICogZ2hvc3RpbmcsIHNvIHRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC4KKyAgICogPC9wYXJhPgorICAgKiA8L2xpc3RpdGVtPgorICAgKiA8bGlzdGl0ZW0+CisgICAqIDxwYXJhPgorICAgKiBzY2FsZXJib2IKKyAgICogRG91YmxlIGxpbmVzCisgICAqIDwvcGFyYT4KKyAgICogPC9saXN0aXRlbT4KKyAgICogPGxpc3RpdGVtPgorICAgKiA8cGFyYT4KKyAgICogd2VhdmUKKyAgICogV2VhdmUuICBCYWQgcXVhbGl0eSwgZG8gbm90IHVzZS4KKyAgICogPC9wYXJhPgorICAgKiA8L2xpc3RpdGVtPgorICAgKiA8bGlzdGl0ZW0+CisgICAqIDxwYXJhPgorICAgKiB3ZWF2ZXRmZgorICAgKiBQcm9ncmVzc2l2ZTogVG9wIEZpZWxkIEZpcnN0LiAgQmFkIHF1YWxpdHksIGRvIG5vdCB1c2UuCisgICAqIDwvcGFyYT4KKyAgICogPC9saXN0aXRlbT4KKyAgICogPGxpc3RpdGVtPgorICAgKiA8cGFyYT4KKyAgICogd2VhdmViZmYKKyAgICogUHJvZ3Jlc3NpdmU6IEJvdHRvbSBGaWVsZCBGaXJzdC4gIEJhZCBxdWFsaXR5LCBkbyBub3QgdXNlLgorICAgKiA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDwvaXRlbWl6ZWRsaXN0PgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NRVRIT0QsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoIm1ldGhvZCIsCisgICAgICAgICAgIk1ldGhvZCIsCisgICAgICAgICAgIkRlaW50ZXJsYWNlIE1ldGhvZCIsCisgICAgICAgICAgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EUywKKyAgICAgICAgICBERUZBVUxUX01FVEhPRCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKQorICAgICAgKTsKKworICAvKioKKyAgICogR3N0RGVpbnRlcmxhY2U6ZmllbGRzOgorICAgKgorICAgKiBUaGlzIHNlbGVjdHMgd2hpY2ggZmllbGRzIHNob3VsZCBiZSBvdXRwdXQuIElmICJhbGwiIGlzIHNlbGVjdGVkCisgICAqIHRoZSBvdXRwdXQgZnJhbWVyYXRlIHdpbGwgYmUgZG91YmxlLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9GSUVMRFMsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoImZpZWxkcyIsCisgICAgICAgICAgImZpZWxkcyIsCisgICAgICAgICAgIkZpZWxkcyB0byB1c2UgZm9yIGRlaW50ZXJsYWNpbmciLAorICAgICAgICAgIEdTVF9UWVBFX0RFSU5URVJMQUNFX0ZJRUxEUywKKyAgICAgICAgICBERUZBVUxUX0ZJRUxEUywgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKQorICAgICAgKTsKKworICAvKioKKyAgICogR3N0RGVpbnRlcmxhY2U6bGF5b3V0OgorICAgKgorICAgKiBUaGlzIHNlbGVjdHMgd2hpY2ggZmllbGRzIGlzIHRoZSBmaXJzdCBpbiB0aW1lLgorICAgKgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9GSUVMRF9MQVlPVVQsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoInRmZiIsCisgICAgICAgICAgInRmZiIsCisgICAgICAgICAgIkRlaW50ZXJsYWNlIHRvcCBmaWVsZCBmaXJzdCIsCisgICAgICAgICAgR1NUX1RZUEVfREVJTlRFUkxBQ0VfRklFTERfTEFZT1VULAorICAgICAgICAgIERFRkFVTFRfRklFTERfTEFZT1VULCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpCisgICAgICApOworCisgIC8qKgorICAgKiBHc3REZWludGVybGFjZTpsb2NraW5nOgorICAgKgorICAgKiBUaGlzIHNlbGVjdHMgd2hpY2ggYXBwcm9hY2ggdG8gcGF0dGVybiBsb2NraW5nIGlzIHVzZWQgd2hpY2ggYWZmZWN0cworICAgKiBwcm9jZXNzaW5nIGxhdGVuY3kgYW5kIGFjY3VyYWN5IG9mIHRpbWVzdGFtcCBhZGp1c3RtZW50IGZvciB0ZWxlY2luZQorICAgKiBzdHJlYW1zLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MT0NLSU5HLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJsb2NraW5nIiwgImxvY2tpbmciLCAiUGF0dGVybiBsb2NraW5nIG1vZGUiLAorICAgICAgICAgIEdTVF9UWVBFX0RFSU5URVJMQUNFX0xPQ0tJTkcsIERFRkFVTFRfTE9DS0lORywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0RGVpbnRlcmxhY2U6aWdub3JlLW9ic2N1cmU6CisgICAqCisgICAqIFRoaXMgc2VsZWN0cyB3aGV0aGVyIHRvIGlnbm9yZSBvYnNjdXJlL3JhcmUgdGVsZWNpbmUgcGF0dGVybnMuCisgICAqIE5UU0MgMjozIHB1bGxkb3duIHZhcmlhbnRzIGFyZSB0aGUgb25seSByZWFsbHkgY29tbW9uIHBhdHRlcm5zLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9JR05PUkVfT0JTQ1VSRSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiaWdub3JlLW9ic2N1cmUiLCAiaWdub3JlLW9ic2N1cmUiLAorICAgICAgICAgICJJZ25vcmUgb2JzY3VyZSB0ZWxlY2luZSBwYXR0ZXJucyAob25seSBjb25zaWRlciBQLCBJIGFuZCAyOjMgIgorICAgICAgICAgICJ2YXJpYW50cykuIiwgREVGQVVMVF9JR05PUkVfT0JTQ1VSRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0RGVpbnRlcmxhY2U6ZHJvcC1vcnBoYW5zOgorICAgKgorICAgKiBUaGlzIHNlbGVjdHMgd2hldGhlciB0byBkcm9wIG9ycGhhbiBmaWVsZHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0ZWxlY2luZQorICAgKiBwYXR0ZXJucyBpbiBhY3RpdmUgbG9ja2luZyBtb2RlLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9EUk9QX09SUEhBTlMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImRyb3Atb3JwaGFucyIsICJkcm9wLW9ycGhhbnMiLAorICAgICAgICAgICJEcm9wIG9ycGhhbiBmaWVsZHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0ZWxlY2luZSBwYXR0ZXJucyBpbiAiCisgICAgICAgICAgImFjdGl2ZSBsb2NraW5nIG1vZGUuIiwgREVGQVVMVF9EUk9QX09SUEhBTlMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGVpbnRlcmxhY2VfY2hhbmdlX3N0YXRlKTsKK30KKworI2lmIDAKK3N0YXRpYyBHc3RPYmplY3QgKgorZ3N0X2RlaW50ZXJsYWNlX2NoaWxkX3Byb3h5X2dldF9jaGlsZF9ieV9pbmRleCAoR3N0Q2hpbGRQcm94eSAqIGNoaWxkX3Byb3h5LAorICAgIGd1aW50IGluZGV4KQoreworICBHc3REZWludGVybGFjZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRSAoY2hpbGRfcHJveHkpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChpbmRleCA9PSAwLCBOVUxMKTsKKworICByZXR1cm4gZ3N0X29iamVjdF9yZWYgKHNlbGYtPm1ldGhvZCk7Cit9CisKK3N0YXRpYyBndWludAorZ3N0X2RlaW50ZXJsYWNlX2NoaWxkX3Byb3h5X2dldF9jaGlsZHJlbl9jb3VudCAoR3N0Q2hpbGRQcm94eSAqIGNoaWxkX3Byb3h5KQoreworICBHc3REZWludGVybGFjZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRSAoY2hpbGRfcHJveHkpOworCisgIHJldHVybiAoKHNlbGYtPm1ldGhvZCkgPyAxIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfY2hpbGRfcHJveHlfaW50ZXJmYWNlX2luaXQgKGdwb2ludGVyIGdfaWZhY2UsCisgICAgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0Q2hpbGRQcm94eUludGVyZmFjZSAqaWZhY2UgPSBnX2lmYWNlOworCisgIGlmYWNlLT5nZXRfY2hpbGRfYnlfaW5kZXggPSBnc3RfZGVpbnRlcmxhY2VfY2hpbGRfcHJveHlfZ2V0X2NoaWxkX2J5X2luZGV4OworICBpZmFjZS0+Z2V0X2NoaWxkcmVuX2NvdW50ID0gZ3N0X2RlaW50ZXJsYWNlX2NoaWxkX3Byb3h5X2dldF9jaGlsZHJlbl9jb3VudDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX2luaXQgKEdzdERlaW50ZXJsYWNlICogc2VsZikKK3sKKyAgc2VsZi0+c2lua3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua190ZW1wbCwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHNlbGYtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RlaW50ZXJsYWNlX2NoYWluKSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChzZWxmLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kZWludGVybGFjZV9zaW5rX2V2ZW50KSk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChzZWxmLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kZWludGVybGFjZV9zaW5rX3F1ZXJ5KSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzZWxmKSwgc2VsZi0+c2lua3BhZCk7CisKKyAgc2VsZi0+c3JjcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmNfdGVtcGwsICJzcmMiKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHNlbGYtPnNyY3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGVpbnRlcmxhY2Vfc3JjX2V2ZW50KSk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChzZWxmLT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RlaW50ZXJsYWNlX3NyY19xdWVyeSkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoc2VsZiksIHNlbGYtPnNyY3BhZCk7CisKKyAgc2VsZi0+bW9kZSA9IERFRkFVTFRfTU9ERTsKKyAgc2VsZi0+dXNlcl9zZXRfbWV0aG9kX2lkID0gREVGQVVMVF9NRVRIT0Q7CisgIGdzdF92aWRlb19pbmZvX2luaXQgKCZzZWxmLT52aW5mbyk7CisgIGdzdF9kZWludGVybGFjZV9zZXRfbWV0aG9kIChzZWxmLCBzZWxmLT51c2VyX3NldF9tZXRob2RfaWQpOworICBzZWxmLT5maWVsZHMgPSBERUZBVUxUX0ZJRUxEUzsKKyAgc2VsZi0+dXNlcl9zZXRfZmllbGRzID0gREVGQVVMVF9GSUVMRFM7CisgIHNlbGYtPmZpZWxkX2xheW91dCA9IERFRkFVTFRfRklFTERfTEFZT1VUOworICBzZWxmLT5sb2NraW5nID0gREVGQVVMVF9MT0NLSU5HOworICBzZWxmLT5pZ25vcmVfb2JzY3VyZSA9IERFRkFVTFRfSUdOT1JFX09CU0NVUkU7CisgIHNlbGYtPmRyb3Bfb3JwaGFucyA9IERFRkFVTFRfRFJPUF9PUlBIQU5TOworCisgIHNlbGYtPmxvd19sYXRlbmN5ID0gLTE7CisgIHNlbGYtPnBhdHRlcm4gPSAtMTsKKyAgc2VsZi0+cGF0dGVybl9waGFzZSA9IC0xOworICBzZWxmLT5wYXR0ZXJuX2NvdW50ID0gMDsKKyAgc2VsZi0+b3V0cHV0X2NvdW50ID0gMDsKKyAgc2VsZi0+cGF0dGVybl9iYXNlX3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgc2VsZi0+cGF0dGVybl9idWZfZHVyID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgc2VsZi0+c3RpbGxfZnJhbWVfbW9kZSA9IEZBTFNFOworCisgIGdzdF9kZWludGVybGFjZV9yZXNldCAoc2VsZik7Cit9CisKK3N0YXRpYyBHc3RWaWRlb0ZyYW1lICoKK2dzdF92aWRlb19mcmFtZV9uZXdfYW5kX21hcCAoR3N0VmlkZW9JbmZvICogdmluZm8sIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBHc3RNYXBGbGFncyBmbGFncykKK3sKKyAgR3N0VmlkZW9GcmFtZSAqZnJhbWUgPSBnX21hbGxvYzAgKHNpemVvZiAoR3N0VmlkZW9GcmFtZSkpOworICBpZiAoIWdzdF92aWRlb19mcmFtZV9tYXAgKGZyYW1lLCB2aW5mbywgYnVmZmVyLCBmbGFncykpIHsKKyAgICBnX2ZyZWUgKGZyYW1lKTsKKyAgICBnX3JldHVybl92YWxfaWZfcmVhY2hlZCAoTlVMTCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIGZyYW1lOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwX2FuZF9mcmVlIChHc3RWaWRlb0ZyYW1lICogZnJhbWUpCit7CisgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoZnJhbWUpOworICBnX2ZyZWUgKGZyYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9yZXNldF9oaXN0b3J5IChHc3REZWludGVybGFjZSAqIHNlbGYsIGdib29sZWFuIGRyb3BfYWxsKQoreworICBnaW50IGk7CisKKyAgaWYgKCFkcm9wX2FsbCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJGbHVzaGluZyBoaXN0b3J5IChjb3VudCAlZCkiLCBzZWxmLT5oaXN0b3J5X2NvdW50KTsKKyAgICB3aGlsZSAoc2VsZi0+aGlzdG9yeV9jb3VudCA+IDApIHsKKyAgICAgIGlmIChnc3RfZGVpbnRlcmxhY2Vfb3V0cHV0X2ZyYW1lIChzZWxmLCBUUlVFKSAhPSBHU1RfRkxPV19PSykgeworICAgICAgICAvKiBFbmNvdW50ZXJlZCBlcnJvciwgb3IgZmx1c2hpbmcgLT4gc2tpcCBhbmQgZHJvcCBhbGwgcmVtYWluaW5nICovCisgICAgICAgIGRyb3BfYWxsID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChkcm9wX2FsbCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJSZXNldHRpbmcgaGlzdG9yeSAoY291bnQgJWQpIiwKKyAgICAgICAgc2VsZi0+aGlzdG9yeV9jb3VudCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+aGlzdG9yeV9jb3VudDsgaSsrKSB7CisgICAgICBpZiAoc2VsZi0+ZmllbGRfaGlzdG9yeVtpXS5mcmFtZSkgeworICAgICAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXBfYW5kX2ZyZWUgKHNlbGYtPmZpZWxkX2hpc3RvcnlbaV0uZnJhbWUpOworICAgICAgICBzZWxmLT5maWVsZF9oaXN0b3J5W2ldLmZyYW1lID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgbWVtc2V0IChzZWxmLT5maWVsZF9oaXN0b3J5LCAwLAorICAgICAgR1NUX0RFSU5URVJMQUNFX01BWF9GSUVMRF9ISVNUT1JZICogc2l6ZW9mIChHc3REZWludGVybGFjZUZpZWxkKSk7CisgIHNlbGYtPmhpc3RvcnlfY291bnQgPSAwOworICBtZW1zZXQgKHNlbGYtPmJ1Zl9zdGF0ZXMsIDAsCisgICAgICBHU1RfREVJTlRFUkxBQ0VfTUFYX0JVRkZFUl9TVEFURV9ISVNUT1JZICoKKyAgICAgIHNpemVvZiAoR3N0RGVpbnRlcmxhY2VCdWZmZXJTdGF0ZSkpOworICBzZWxmLT5zdGF0ZV9jb3VudCA9IDA7CisgIHNlbGYtPnBhdHRlcm5fbG9jayA9IEZBTFNFOworICBzZWxmLT5wYXR0ZXJuX3JlZnJlc2ggPSBUUlVFOworICBzZWxmLT5jdXJfZmllbGRfaWR4ID0gLTE7CisKKyAgaWYgKCFzZWxmLT5zdGlsbF9mcmFtZV9tb2RlICYmIHNlbGYtPmxhc3RfYnVmZmVyKSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoc2VsZi0+bGFzdF9idWZmZXIpOworICAgIHNlbGYtPmxhc3RfYnVmZmVyID0gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX3Jlc2V0IChHc3REZWludGVybGFjZSAqIHNlbGYpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJSZXNldHRpbmcgaW50ZXJuYWwgc3RhdGUiKTsKKworICBnc3RfdmlkZW9faW5mb19pbml0ICgmc2VsZi0+dmluZm8pOworCisgIHNlbGYtPnBhc3N0aHJvdWdoID0gRkFMU0U7CisKKyAgc2VsZi0+cmVjb25maWd1cmUgPSBGQUxTRTsKKyAgaWYgKChnaW50KSBzZWxmLT5uZXdfbW9kZSAhPSAtMSkKKyAgICBzZWxmLT5tb2RlID0gc2VsZi0+bmV3X21vZGU7CisgIGlmICgoZ2ludCkgc2VsZi0+bmV3X2ZpZWxkcyAhPSAtMSkKKyAgICBzZWxmLT51c2VyX3NldF9maWVsZHMgPSBzZWxmLT5uZXdfZmllbGRzOworICBzZWxmLT5uZXdfbW9kZSA9IC0xOworICBzZWxmLT5uZXdfZmllbGRzID0gLTE7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlbGYtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVU5ERUZJTkVEKTsKKworICBpZiAoc2VsZi0+cmVxdWVzdF9jYXBzKQorICAgIGdzdF9jYXBzX3VucmVmIChzZWxmLT5yZXF1ZXN0X2NhcHMpOworICBzZWxmLT5yZXF1ZXN0X2NhcHMgPSBOVUxMOworCisgIGdzdF9kZWludGVybGFjZV9yZXNldF9oaXN0b3J5IChzZWxmLCBUUlVFKTsKKworICBnc3RfZGVpbnRlcmxhY2VfcmVzZXRfcW9zIChzZWxmKTsKKworICBzZWxmLT5uZWVkX21vcmUgPSBGQUxTRTsKKyAgc2VsZi0+aGF2ZV9lb3MgPSBGQUxTRTsKKworICBzZWxmLT5kaXNjb250ID0gVFJVRTsKKworICBnc3RfZGVpbnRlcmxhY2Vfc2V0X2FsbG9jYXRpb24gKHNlbGYsIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REZWludGVybGFjZSAqc2VsZjsKKworICBzZWxmID0gR1NUX0RFSU5URVJMQUNFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOnsKKyAgICAgIGdpbnQgbmV3X21vZGU7CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZik7CisgICAgICBuZXdfbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGlmIChzZWxmLT5tb2RlICE9IG5ld19tb2RlICYmIGdzdF9wYWRfaGFzX2N1cnJlbnRfY2FwcyAoc2VsZi0+c3JjcGFkKSkgeworICAgICAgICBzZWxmLT5yZWNvbmZpZ3VyZSA9IFRSVUU7CisgICAgICAgIHNlbGYtPm5ld19tb2RlID0gbmV3X21vZGU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZWxmLT5tb2RlID0gbmV3X21vZGU7CisgICAgICB9CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX01FVEhPRDoKKyAgICAgIHNlbGYtPnVzZXJfc2V0X21ldGhvZF9pZCA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGdzdF9kZWludGVybGFjZV9zZXRfbWV0aG9kIChzZWxmLCBzZWxmLT51c2VyX3NldF9tZXRob2RfaWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZJRUxEUzp7CisgICAgICBnaW50IG5ld19maWVsZHM7CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZik7CisgICAgICBuZXdfZmllbGRzID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgaWYgKHNlbGYtPnVzZXJfc2V0X2ZpZWxkcyAhPSBuZXdfZmllbGRzCisgICAgICAgICAgJiYgZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChzZWxmLT5zcmNwYWQpKSB7CisgICAgICAgIHNlbGYtPnJlY29uZmlndXJlID0gVFJVRTsKKyAgICAgICAgc2VsZi0+bmV3X2ZpZWxkcyA9IG5ld19maWVsZHM7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZWxmLT51c2VyX3NldF9maWVsZHMgPSBuZXdfZmllbGRzOworICAgICAgfQorICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNlbGYpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9GSUVMRF9MQVlPVVQ6CisgICAgICBzZWxmLT5maWVsZF9sYXlvdXQgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTE9DS0lORzoKKyAgICAgIHNlbGYtPmxvY2tpbmcgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSUdOT1JFX09CU0NVUkU6CisgICAgICBzZWxmLT5pZ25vcmVfb2JzY3VyZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9EUk9QX09SUEhBTlM6CisgICAgICBzZWxmLT5kcm9wX29ycGhhbnMgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChzZWxmLCBwcm9wX2lkLCBwc3BlYyk7CisgIH0KKworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REZWludGVybGFjZSAqc2VsZjsKKworICBzZWxmID0gR1NUX0RFSU5URVJMQUNFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHNlbGYtPm1vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01FVEhPRDoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBzZWxmLT51c2VyX3NldF9tZXRob2RfaWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZJRUxEUzoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBzZWxmLT51c2VyX3NldF9maWVsZHMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZJRUxEX0xBWU9VVDoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBzZWxmLT5maWVsZF9sYXlvdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xPQ0tJTkc6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgc2VsZi0+bG9ja2luZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSUdOT1JFX09CU0NVUkU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc2VsZi0+aWdub3JlX29ic2N1cmUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RST1BfT1JQSEFOUzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzZWxmLT5kcm9wX29ycGhhbnMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAoc2VsZiwgcHJvcF9pZCwgcHNwZWMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdERlaW50ZXJsYWNlICpzZWxmID0gR1NUX0RFSU5URVJMQUNFIChvYmplY3QpOworCisgIGdzdF9kZWludGVybGFjZV9yZXNldCAoc2VsZik7CisKKyAgaWYgKHNlbGYtPm1ldGhvZCkgeworICAgIGdzdF9vYmplY3RfdW5wYXJlbnQgKEdTVF9PQkpFQ1QgKHNlbGYtPm1ldGhvZCkpOworICAgIHNlbGYtPm1ldGhvZCA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfdXBkYXRlX3BhdHRlcm5fdGltZXN0YW1wcyAoR3N0RGVpbnRlcmxhY2UgKiBzZWxmKQoreworICBnaW50IHN0YXRlX2lkeDsKKyAgaWYgKHNlbGYtPmxvd19sYXRlbmN5KSB7CisgICAgLyogaW4gbG93LWxhdGVuY3kgbW9kZSB0aGUgYnVmZmVyIHN0YXRlIGhpc3RvcnkgY29udGFpbnMgb2xkIGJ1ZmZlcgorICAgICAqIHN0YXRlcyBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IG9uZSBhbmQgcGVyaGFwcyBzb21lIGZ1dHVyZSBvbmVzLgorICAgICAqIHRoZSBjdXJyZW50IGJ1ZmZlcidzIHN0YXRlIGlzIGdpdmVuIGJ5IHRoZSBudW1iZXIgb2YgZmllbGQgcGFpcnMKKyAgICAgKiByb3VuZGVkIHVwLCBtaW51cyAxLiB0aGUgYmVsb3cgaXMgZXF1aXZhbGVudCAqLworICAgIHN0YXRlX2lkeCA9IChzZWxmLT5oaXN0b3J5X2NvdW50IC0gMSkgPj4gMTsKKyAgfSBlbHNlIHsKKyAgICAvKiBpbiBoaWdoLWxhdGVuY3kgbW9kZSBzdGF0ZV9jb3VudCAtIDEgaXMgdGhlIGN1cnJlbnQgYnVmZmVyJ3Mgc3RhdGUgKi8KKyAgICBzdGF0ZV9pZHggPSBzZWxmLT5zdGF0ZV9jb3VudCAtIDE7CisgIH0KKworICBzZWxmLT5wYXR0ZXJuX2Jhc2VfdHMgPSBzZWxmLT5idWZfc3RhdGVzW3N0YXRlX2lkeF0udGltZXN0YW1wOworICBpZiAoc2VsZi0+YnVmX3N0YXRlc1tzdGF0ZV9pZHhdLnN0YXRlICE9IEdTVF9SRkYpIHsKKyAgICBzZWxmLT5wYXR0ZXJuX2J1Zl9kdXIgPQorICAgICAgICAoc2VsZi0+YnVmX3N0YXRlc1tzdGF0ZV9pZHhdLmR1cmF0aW9uICoKKyAgICAgICAgdGVsZWNpbmVfcGF0dGVybnNbc2VsZi0+cGF0dGVybl0ucmF0aW9fZCkgLworICAgICAgICB0ZWxlY2luZV9wYXR0ZXJuc1tzZWxmLT5wYXR0ZXJuXS5yYXRpb19uOworICB9IGVsc2UgeworICAgIHNlbGYtPnBhdHRlcm5fYnVmX2R1ciA9CisgICAgICAgIChzZWxmLT5idWZfc3RhdGVzW3N0YXRlX2lkeF0uZHVyYXRpb24gKgorICAgICAgICB0ZWxlY2luZV9wYXR0ZXJuc1tzZWxmLT5wYXR0ZXJuXS5yYXRpb19kICogMikgLworICAgICAgICAodGVsZWNpbmVfcGF0dGVybnNbc2VsZi0+cGF0dGVybl0ucmF0aW9fbiAqIDMpOworICB9CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAiU3RhcnRpbmcgYSBuZXcgcGF0dGVybiByZXBlYXQgd2l0aCBiYXNlIHRzICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiBhbmQgZHVyICUiIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAoc2VsZi0+cGF0dGVybl9iYXNlX3RzKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHNlbGYtPnBhdHRlcm5fYnVmX2R1cikpOworfQorCitzdGF0aWMgR3N0VmlkZW9GcmFtZSAqCitnc3RfZGVpbnRlcmxhY2VfcG9wX2hpc3RvcnkgKEdzdERlaW50ZXJsYWNlICogc2VsZikKK3sKKyAgR3N0VmlkZW9GcmFtZSAqZnJhbWU7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlbGYtPmhpc3RvcnlfY291bnQgPiAwLCBOVUxMKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUG9wIGxhc3QgaGlzdG9yeSBmcmFtZSAtLSBjdXJyZW50IGhpc3Rvcnkgc2l6ZSAlZCIsCisgICAgICBzZWxmLT5oaXN0b3J5X2NvdW50KTsKKworICBmcmFtZSA9IHNlbGYtPmZpZWxkX2hpc3Rvcnlbc2VsZi0+aGlzdG9yeV9jb3VudCAtIDFdLmZyYW1lOworCisgIHNlbGYtPmhpc3RvcnlfY291bnQtLTsKKyAgaWYgKHNlbGYtPmxvY2tpbmcgIT0gR1NUX0RFSU5URVJMQUNFX0xPQ0tJTkdfTk9ORSAmJiAoIXNlbGYtPmhpc3RvcnlfY291bnQKKyAgICAgICAgICB8fCBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZnJhbWUsIDApICE9CisgICAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNlbGYtPmZpZWxkX2hpc3Rvcnlbc2VsZi0+aGlzdG9yeV9jb3VudCAtCisgICAgICAgICAgICAgICAgICAxXS5mcmFtZSwgMCkpKSB7CisgICAgaWYgKCFzZWxmLT5sb3dfbGF0ZW5jeSkKKyAgICAgIHNlbGYtPnN0YXRlX2NvdW50LS07CisgICAgaWYgKHNlbGYtPnBhdHRlcm5fbG9jaykgeworICAgICAgc2VsZi0+cGF0dGVybl9jb3VudCsrOworICAgICAgaWYgKHNlbGYtPnBhdHRlcm4gIT0gLTEKKyAgICAgICAgICAmJiBzZWxmLT5wYXR0ZXJuX2NvdW50ID49IHRlbGVjaW5lX3BhdHRlcm5zW3NlbGYtPnBhdHRlcm5dLmxlbmd0aCkgeworICAgICAgICBzZWxmLT5wYXR0ZXJuX2NvdW50ID0gMDsKKyAgICAgICAgc2VsZi0+b3V0cHV0X2NvdW50ID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUmV0dXJuaW5nIGZyYW1lOiAlcCAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIgd2l0aCBkdXJhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQgIiBhbmQgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCwgZnJhbWUsCisgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoZnJhbWUtPmJ1ZmZlcikpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVVJBVElPTiAoZnJhbWUtPmJ1ZmZlcikpLAorICAgICAgR1NUX1ZJREVPX0ZSQU1FX1NJWkUgKGZyYW1lKSk7CisKKyAgcmV0dXJuIGZyYW1lOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX2dldF9idWZmZXJfc3RhdGUgKEdzdERlaW50ZXJsYWNlICogc2VsZiwgR3N0VmlkZW9GcmFtZSAqIGZyYW1lLAorICAgIGd1aW50OCAqIHN0YXRlLCBHc3RWaWRlb0ludGVybGFjZU1vZGUgKiBpX21vZGUpCit7CisgIEdzdFZpZGVvSW50ZXJsYWNlTW9kZSBpbnRlcmxhY2luZ19tb2RlOworCisgIGlmICghKGlfbW9kZSB8fCBzdGF0ZSkpCisgICAgcmV0dXJuOworCisgIGludGVybGFjaW5nX21vZGUgPSBHU1RfVklERU9fSU5GT19JTlRFUkxBQ0VfTU9ERSAoJmZyYW1lLT5pbmZvKTsKKyAgaWYgKHNlbGYtPm1vZGUgPT0gR1NUX0RFSU5URVJMQUNFX01PREVfSU5URVJMQUNFRCkKKyAgICBpbnRlcmxhY2luZ19tb2RlID0gR1NUX1ZJREVPX0lOVEVSTEFDRV9NT0RFX0lOVEVSTEVBVkVEOworCisgIGlmIChzdGF0ZSkgeworICAgIGlmIChpbnRlcmxhY2luZ19tb2RlID09IEdTVF9WSURFT19JTlRFUkxBQ0VfTU9ERV9NSVhFRCkgeworICAgICAgaWYgKEdTVF9WSURFT19GUkFNRV9JU19SRkYgKGZyYW1lKSkgeworICAgICAgICAqc3RhdGUgPSBHU1RfREVJTlRFUkxBQ0VfQlVGRkVSX1NUQVRFX1JGRjsKKyAgICAgIH0gZWxzZSBpZiAoR1NUX1ZJREVPX0ZSQU1FX0lTX09ORUZJRUxEIChmcmFtZSkpIHsKKyAgICAgICAgLyogdGMgdG9wIGlmIHRmZiwgdGMgYm90dG9tIG90aGVyd2lzZSAqLworICAgICAgICBpZiAoR1NUX1ZJREVPX0ZSQU1FX0lTX1RGRiAoZnJhbWUpKSB7CisgICAgICAgICAgKnN0YXRlID0gR1NUX0RFSU5URVJMQUNFX0JVRkZFUl9TVEFURV9UQ19UOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpzdGF0ZSA9IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfVENfQjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChHU1RfVklERU9fRlJBTUVfSVNfSU5URVJMQUNFRCAoZnJhbWUpKSB7CisgICAgICAgICpzdGF0ZSA9IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfVENfTTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpzdGF0ZSA9IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfVENfUDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGludGVybGFjaW5nX21vZGUgPT0gR1NUX1ZJREVPX0lOVEVSTEFDRV9NT0RFX0lOVEVSTEVBVkVEKSB7CisgICAgICAgICpzdGF0ZSA9IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfSTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpzdGF0ZSA9IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfUDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoaV9tb2RlKQorICAgICppX21vZGUgPSBpbnRlcmxhY2luZ19tb2RlOworfQorCisjZGVmaW5lIFNUQVRFX1RPX1NUUklORyhzKSAoKHMpID09IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfUCA/ICJQIiA6IFwKKyAgKHMpID09IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfSSA/ICJJIiA6IFwKKyAgKHMpID09IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfVENfQiA/ICJCIiA6IFwKKyAgKHMpID09IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfVENfVCA/ICJUIiA6IFwKKyAgKHMpID09IEdTVF9ERUlOVEVSTEFDRV9CVUZGRVJfU1RBVEVfVENfUCA/ICJUQ1AiIDogXAorICAocykgPT0gR1NUX0RFSU5URVJMQUNFX0JVRkZFUl9TVEFURV9UQ19NID8gIlRDTSIgOiAiUkZGIikKKworI2RlZmluZSBNT0RFX1RPX1NUUklORyhtKSAoKG0pID09IEdTVF9WSURFT19JTlRFUkxBQ0VfTU9ERV9NSVhFRCA/ICJNSVhFRCIgOiBcCisgIChtKSA9PSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfSU5URVJMRUFWRUQgPyAiSSIgOiBcCisgIChtKSA9PSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfRklFTERTID8gIkZJRUxEUyIgOiAiUCIpCisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfcHVzaF9oaXN0b3J5IChHc3REZWludGVybGFjZSAqIHNlbGYsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgaW50IGkgPSAxOworICBHc3REZWludGVybGFjZUZpZWxkTGF5b3V0IGZpZWxkX2xheW91dCA9IHNlbGYtPmZpZWxkX2xheW91dDsKKyAgZ2Jvb2xlYW4gdGZmOworICBnYm9vbGVhbiBvbmVmaWVsZDsKKyAgR3N0VmlkZW9GcmFtZSAqZnJhbWUgPSBOVUxMOworICBHc3RWaWRlb0ZyYW1lICpmaWVsZDEsICpmaWVsZDIgPSBOVUxMOworICBndWludCBmaWVsZHNfdG9fcHVzaDsKKyAgZ3VpbnQgZmllbGQxX2ZsYWdzLCBmaWVsZDJfZmxhZ3M7CisgIEdzdFZpZGVvSW50ZXJsYWNlTW9kZSBpbnRlcmxhY2luZ19tb2RlOworICBndWludDggYnVmX3N0YXRlOworCisgIC8qIHdlIHdpbGwgb25seSByZWFkIGZyb20gdGhpcyBidWZmZXIgYW5kIHdyaXRlIGludG8gZnJlc2ggb3V0cHV0IGJ1ZmZlcnMKKyAgICogaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIGNoYW5nZSB0aGUgbWFwIGZsYWdzIGFzIGFwcHJvcHJpYXRlCisgICAqLworICBmcmFtZSA9IGdzdF92aWRlb19mcmFtZV9uZXdfYW5kX21hcCAoJnNlbGYtPnZpbmZvLCBidWZmZXIsIEdTVF9NQVBfUkVBRCk7CisgIC8qIHdlIGNhbiBtYW5hZ2UgdGhlIGJ1ZmZlciByZWYgY291bnQgdXNpbmcgdGhlIG1hcHMgZnJvbSBoZXJlIG9uICovCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgdGZmID0gR1NUX1ZJREVPX0ZSQU1FX0lTX1RGRiAoZnJhbWUpOworICBvbmVmaWVsZCA9IEdTVF9WSURFT19GUkFNRV9JU19PTkVGSUVMRCAoZnJhbWUpOworICBmaWVsZHNfdG9fcHVzaCA9IChvbmVmaWVsZCkgPyAxIDogMjsKKworICBnX3JldHVybl9pZl9mYWlsIChzZWxmLT5oaXN0b3J5X2NvdW50IDwKKyAgICAgIEdTVF9ERUlOVEVSTEFDRV9NQVhfRklFTERfSElTVE9SWSAtIGZpZWxkc190b19wdXNoKTsKKworICBnc3RfZGVpbnRlcmxhY2VfZ2V0X2J1ZmZlcl9zdGF0ZSAoc2VsZiwgZnJhbWUsICZidWZfc3RhdGUsICZpbnRlcmxhY2luZ19tb2RlKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgIlB1c2hpbmcgbmV3IGZyYW1lIGFzICVkIGZpZWxkcyB0byB0aGUgaGlzdG9yeSAoY291bnQgYmVmb3JlICVkKTogcHRyICVwIGF0ICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQgIiB3aXRoIGR1cmF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiwgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCAiLCBzdGF0ZSAlcywgaW50ZXJsYWNpbmcgbW9kZSAlcyIsCisgICAgICBmaWVsZHNfdG9fcHVzaCwgc2VsZi0+aGlzdG9yeV9jb3VudCwgZnJhbWUsCisgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSksCisgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpKSwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlciksCisgICAgICBTVEFURV9UT19TVFJJTkcgKGJ1Zl9zdGF0ZSksIE1PREVfVE9fU1RSSU5HIChpbnRlcmxhY2luZ19tb2RlKSk7CisKKyAgLyogbW92ZSB1cCBmb3IgbmV3IHN0YXRlICovCisgIG1lbW1vdmUgKCZzZWxmLT5idWZfc3RhdGVzWzFdLCAmc2VsZi0+YnVmX3N0YXRlc1swXSwKKyAgICAgIChHU1RfREVJTlRFUkxBQ0VfTUFYX0JVRkZFUl9TVEFURV9ISVNUT1JZIC0gMSkgKgorICAgICAgc2l6ZW9mIChHc3REZWludGVybGFjZUJ1ZmZlclN0YXRlKSk7CisgIHNlbGYtPmJ1Zl9zdGF0ZXNbMF0uc3RhdGUgPSBidWZfc3RhdGU7CisgIHNlbGYtPmJ1Zl9zdGF0ZXNbMF0udGltZXN0YW1wID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcik7CisgIHNlbGYtPmJ1Zl9zdGF0ZXNbMF0uZHVyYXRpb24gPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpOworICBpZiAoc2VsZi0+c3RhdGVfY291bnQgPCBHU1RfREVJTlRFUkxBQ0VfTUFYX0JVRkZFUl9TVEFURV9ISVNUT1JZKQorICAgIHNlbGYtPnN0YXRlX2NvdW50Kys7CisKKyAgZm9yIChpID0gR1NUX0RFSU5URVJMQUNFX01BWF9GSUVMRF9ISVNUT1JZIC0gMTsgaSA+PSBmaWVsZHNfdG9fcHVzaDsgaS0tKSB7CisgICAgc2VsZi0+ZmllbGRfaGlzdG9yeVtpXS5mcmFtZSA9CisgICAgICAgIHNlbGYtPmZpZWxkX2hpc3RvcnlbaSAtIGZpZWxkc190b19wdXNoXS5mcmFtZTsKKyAgICBzZWxmLT5maWVsZF9oaXN0b3J5W2ldLmZsYWdzID0KKyAgICAgICAgc2VsZi0+ZmllbGRfaGlzdG9yeVtpIC0gZmllbGRzX3RvX3B1c2hdLmZsYWdzOworICB9CisKKyAgaWYgKGZpZWxkX2xheW91dCA9PSBHU1RfREVJTlRFUkxBQ0VfTEFZT1VUX0FVVE8pIHsKKyAgICBpZiAoIUdTVF9WSURFT19JTkZPX0lTX0lOVEVSTEFDRUQgKCZzZWxmLT52aW5mbykpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2VsZiwgIkNhbid0IGRldGVjdCBmaWVsZCBsYXlvdXQgLS0gYXNzdW1pbmcgVEZGIik7CisgICAgICBmaWVsZF9sYXlvdXQgPSBHU1RfREVJTlRFUkxBQ0VfTEFZT1VUX1RGRjsKKyAgICB9IGVsc2UgaWYgKHRmZikgeworICAgICAgZmllbGRfbGF5b3V0ID0gR1NUX0RFSU5URVJMQUNFX0xBWU9VVF9URkY7CisgICAgfSBlbHNlIHsKKyAgICAgIGZpZWxkX2xheW91dCA9IEdTVF9ERUlOVEVSTEFDRV9MQVlPVVRfQkZGOworICAgIH0KKyAgfQorCisgIGZpZWxkMSA9IGZyYW1lOworICBmaWVsZDIgPSBnc3RfdmlkZW9fZnJhbWVfbmV3X2FuZF9tYXAgKCZzZWxmLT52aW5mbywgYnVmZmVyLCBHU1RfTUFQX1JFQUQpOworICBpZiAoZmllbGRfbGF5b3V0ID09IEdTVF9ERUlOVEVSTEFDRV9MQVlPVVRfVEZGKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlRvcCBmaWVsZCBmaXJzdCIpOworICAgIGZpZWxkMV9mbGFncyA9IFBJQ1RVUkVfSU5URVJMQUNFRF9UT1A7CisgICAgZmllbGQyX2ZsYWdzID0gUElDVFVSRV9JTlRFUkxBQ0VEX0JPVFRPTTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiQm90dG9tIGZpZWxkIGZpcnN0Iik7CisgICAgZmllbGQxX2ZsYWdzID0gUElDVFVSRV9JTlRFUkxBQ0VEX0JPVFRPTTsKKyAgICBmaWVsZDJfZmxhZ3MgPSBQSUNUVVJFX0lOVEVSTEFDRURfVE9QOworICB9CisKKyAgLyogU3dhcCBmb3IgcmV2ZXJzZSBwbGF5YmFjayAqLworICBpZiAoc2VsZi0+c2VnbWVudC5yYXRlIDwgMCkgeworICAgIGZpZWxkMV9mbGFncyA9IGZpZWxkMV9mbGFncyBeIGZpZWxkMl9mbGFnczsKKyAgICBmaWVsZDJfZmxhZ3MgPSBmaWVsZDFfZmxhZ3MgXiBmaWVsZDJfZmxhZ3M7CisgICAgZmllbGQxX2ZsYWdzID0gZmllbGQxX2ZsYWdzIF4gZmllbGQyX2ZsYWdzOworICB9CisKKyAgaWYgKCFvbmVmaWVsZCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJUd28gZmllbGRzIik7CisgICAgc2VsZi0+ZmllbGRfaGlzdG9yeVsxXS5mcmFtZSA9IGZpZWxkMTsKKyAgICBzZWxmLT5maWVsZF9oaXN0b3J5WzFdLmZsYWdzID0gZmllbGQxX2ZsYWdzOworCisgICAgc2VsZi0+ZmllbGRfaGlzdG9yeVswXS5mcmFtZSA9IGZpZWxkMjsKKyAgICBzZWxmLT5maWVsZF9oaXN0b3J5WzBdLmZsYWdzID0gZmllbGQyX2ZsYWdzOworICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBvbmVmaWVsZCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJPbmUgZmllbGQiKTsKKyAgICBzZWxmLT5maWVsZF9oaXN0b3J5WzBdLmZyYW1lID0gZmllbGQxOworICAgIHNlbGYtPmZpZWxkX2hpc3RvcnlbMF0uZmxhZ3MgPSBmaWVsZDFfZmxhZ3M7CisgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwX2FuZF9mcmVlIChmaWVsZDIpOworICB9CisKKyAgc2VsZi0+aGlzdG9yeV9jb3VudCArPSBmaWVsZHNfdG9fcHVzaDsKKyAgc2VsZi0+Y3VyX2ZpZWxkX2lkeCArPSBmaWVsZHNfdG9fcHVzaDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUHVzaGVkIGJ1ZmZlciAtLSBjdXJyZW50IGhpc3Rvcnkgc2l6ZSAlZCwgaW5kZXggJWQiLAorICAgICAgc2VsZi0+aGlzdG9yeV9jb3VudCwgc2VsZi0+Y3VyX2ZpZWxkX2lkeCk7CisKKyAgaWYgKHNlbGYtPmxhc3RfYnVmZmVyKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKHNlbGYtPmxhc3RfYnVmZmVyKTsKKyAgc2VsZi0+bGFzdF9idWZmZXIgPSBnc3RfYnVmZmVyX3JlZiAoYnVmZmVyKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV91cGRhdGVfcW9zIChHc3REZWludGVybGFjZSAqIHNlbGYsIGdkb3VibGUgcHJvcG9ydGlvbiwKKyAgICBHc3RDbG9ja1RpbWVEaWZmIGRpZmYsIEdzdENsb2NrVGltZSB0aW1lc3RhbXApCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAiVXBkYXRpbmcgUW9TOiBwcm9wb3J0aW9uICVsZiwgZGlmZiAlIiBHU1RfU1RJTUVfRk9STUFUICIsIHRpbWVzdGFtcCAlIgorICAgICAgR1NUX1RJTUVfRk9STUFULCBwcm9wb3J0aW9uLCBHU1RfU1RJTUVfQVJHUyAoZGlmZiksCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHNlbGYpOworICBzZWxmLT5wcm9wb3J0aW9uID0gcHJvcG9ydGlvbjsKKyAgaWYgKEdfTElLRUxZICh0aW1lc3RhbXAgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkpIHsKKyAgICBpZiAoR19VTkxJS0VMWSAoZGlmZiA+IDApKQorICAgICAgc2VsZi0+ZWFybGllc3RfdGltZSA9CisgICAgICAgICAgdGltZXN0YW1wICsgMiAqIGRpZmYgKyAoKHNlbGYtPmZpZWxkcyA9PQorICAgICAgICAgICAgICBHU1RfREVJTlRFUkxBQ0VfQUxMKSA/IHNlbGYtPmZpZWxkX2R1cmF0aW9uIDogMiAqCisgICAgICAgICAgc2VsZi0+ZmllbGRfZHVyYXRpb24pOworICAgIGVsc2UKKyAgICAgIHNlbGYtPmVhcmxpZXN0X3RpbWUgPSB0aW1lc3RhbXAgKyBkaWZmOworICB9IGVsc2UgeworICAgIHNlbGYtPmVhcmxpZXN0X3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzZWxmKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9yZXNldF9xb3MgKEdzdERlaW50ZXJsYWNlICogc2VsZikKK3sKKyAgZ3N0X2RlaW50ZXJsYWNlX3VwZGF0ZV9xb3MgKHNlbGYsIDAuNSwgMCwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgIHNlbGYtPnByb2Nlc3NlZCA9IDA7CisgIHNlbGYtPmRyb3BwZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX3JlYWRfcW9zIChHc3REZWludGVybGFjZSAqIHNlbGYsIGdkb3VibGUgKiBwcm9wb3J0aW9uLAorICAgIEdzdENsb2NrVGltZSAqIHRpbWUpCit7CisgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZik7CisgICpwcm9wb3J0aW9uID0gc2VsZi0+cHJvcG9ydGlvbjsKKyAgKnRpbWUgPSBzZWxmLT5lYXJsaWVzdF90aW1lOworICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7Cit9CisKKy8qIFBlcmZvcm0gcW9zIGNhbGN1bGF0aW9ucyBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgbmV4dCBmcmFtZS4gUmV0dXJucyBUUlVFIGlmCisgKiB0aGUgZnJhbWUgc2hvdWxkIGJlIHByb2Nlc3NlZCwgRkFMU0UgaWYgdGhlIGZyYW1lIGNhbiBiZSBkcm9wcGVkIGVudGlyZWx5ICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGFjZV9kb19xb3MgKEdzdERlaW50ZXJsYWNlICogc2VsZiwgY29uc3QgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RDbG9ja1RpbWUgcW9zdGltZSwgZWFybGllc3RfdGltZTsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpOworICBnZG91YmxlIHByb3BvcnRpb247CisKKyAgLyogbm8gdGltZXN0YW1wLCBjYW4ndCBkbyBRb1MgPT4gcHJvY2VzcyBmcmFtZSAqLworICBpZiAoR19VTkxJS0VMWSAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEICh0aW1lc3RhbXApKSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChzZWxmLCAiaW52YWxpZCB0aW1lc3RhbXAsIGNhbid0IGRvIFFvUywgcHJvY2VzcyBmcmFtZSIpOworICAgIGdvdG8ga2VlcF9mcmFtZTsKKyAgfQorCisgIC8qIGdldCBsYXRlc3QgUW9TIG9ic2VydmF0aW9uIHZhbHVlcyAqLworICBnc3RfZGVpbnRlcmxhY2VfcmVhZF9xb3MgKHNlbGYsICZwcm9wb3J0aW9uLCAmZWFybGllc3RfdGltZSk7CisKKyAgLyogc2tpcCBxb3MgaWYgd2UgaGF2ZSBubyBvYnNlcnZhdGlvbiAoeWV0KSA9PiBwcm9jZXNzIGZyYW1lICovCisgIGlmIChHX1VOTElLRUxZICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGVhcmxpZXN0X3RpbWUpKSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChzZWxmLCAibm8gb2JzZXJ2YXRpb24geWV0LCBwcm9jZXNzIGZyYW1lIik7CisgICAgZ290byBrZWVwX2ZyYW1lOworICB9CisKKyAgLyogcW9zIGlzIGRvbmUgb24gcnVubmluZyB0aW1lICovCisgIHFvc3RpbWUgPSBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZzZWxmLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICB0aW1lc3RhbXApOworCisgIC8qIHNlZSBob3cgb3VyIG5leHQgdGltZXN0YW1wIHJlbGF0ZXMgdG8gdGhlIGxhdGVzdCBxb3MgdGltZXN0YW1wICovCisgIEdTVF9MT0dfT0JKRUNUIChzZWxmLCAicW9zdGltZSAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZWFybGllc3QgJSIKKyAgICAgIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAocW9zdGltZSksIEdTVF9USU1FX0FSR1MgKGVhcmxpZXN0X3RpbWUpKTsKKworICBpZiAocW9zdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmIHFvc3RpbWUgPD0gZWFybGllc3RfdGltZSkgeworICAgIEdzdENsb2NrVGltZSBzdHJlYW1fdGltZSwgaml0dGVyOworICAgIEdzdE1lc3NhZ2UgKnFvc19tc2c7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAid2UgYXJlIGxhdGUsIGRyb3AgZnJhbWUiKTsKKyAgICBzZWxmLT5kcm9wcGVkKys7CisgICAgc3RyZWFtX3RpbWUgPQorICAgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJnNlbGYtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wKTsKKyAgICBqaXR0ZXIgPSBHU1RfQ0xPQ0tfRElGRiAocW9zdGltZSwgZWFybGllc3RfdGltZSk7CisgICAgcW9zX21zZyA9CisgICAgICAgIGdzdF9tZXNzYWdlX25ld19xb3MgKEdTVF9PQkpFQ1QgKHNlbGYpLCBGQUxTRSwgcW9zdGltZSwgc3RyZWFtX3RpbWUsCisgICAgICAgIHRpbWVzdGFtcCwgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSk7CisgICAgZ3N0X21lc3NhZ2Vfc2V0X3Fvc192YWx1ZXMgKHFvc19tc2csIGppdHRlciwgcHJvcG9ydGlvbiwgMTAwMDAwMCk7CisgICAgZ3N0X21lc3NhZ2Vfc2V0X3Fvc19zdGF0cyAocW9zX21zZywgR1NUX0ZPUk1BVF9CVUZGRVJTLAorICAgICAgICBzZWxmLT5wcm9jZXNzZWQsIHNlbGYtPmRyb3BwZWQpOworICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKHNlbGYpLCBxb3NfbXNnKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoc2VsZiwgInByb2Nlc3MgZnJhbWUiKTsKK2tlZXBfZnJhbWU6CisgIHNlbGYtPnByb2Nlc3NlZCsrOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZGVpbnRlcmxhY2VfZml4X3RpbWVzdGFtcHMgKEdzdERlaW50ZXJsYWNlICogc2VsZiwKKyAgICBHc3RWaWRlb0ZyYW1lICogZmllbGQxLCBHc3RWaWRlb0ZyYW1lICogZmllbGQyKQoreworICBHc3RWaWRlb0ZyYW1lICpmaWVsZDMsICpmaWVsZDQ7CisgIEdzdFZpZGVvSW50ZXJsYWNlTW9kZSBpbnRlcmxhY2luZ19tb2RlOworCisgIC8qIEZJWE1FOiBUaGlzIGlzIGJyb2tlbiBmb3IgcmF0ZSA8IDAgKi8KKyAgaWYgKHNlbGYtPnBhdHRlcm5fbG9jayAmJiBzZWxmLT5wYXR0ZXJuID4gLTEpIHsKKyAgICAvKiBhY2N1cmF0ZSBwYXR0ZXJuLWxvY2tlZCB0aW1lc3RhbXAgYWRqdXN0bWVudCAqLworICAgIGlmICghc2VsZi0+cGF0dGVybl9jb3VudCkKKyAgICAgIGdzdF9kZWludGVybGFjZV91cGRhdGVfcGF0dGVybl90aW1lc3RhbXBzIChzZWxmKTsKKworICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChmaWVsZDEtPmJ1ZmZlcikgPQorICAgICAgICBzZWxmLT5wYXR0ZXJuX2Jhc2VfdHMgKyBzZWxmLT5vdXRwdXRfY291bnQgKiBzZWxmLT5wYXR0ZXJuX2J1Zl9kdXI7CisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoZmllbGQxLT5idWZmZXIpID0gc2VsZi0+cGF0dGVybl9idWZfZHVyOworICAgIHNlbGYtPm91dHB1dF9jb3VudCsrOworICB9IGVsc2UgeworICAgIC8qIG5haXZlIChidXQgbG93LWxhdGVuY3kpIHRpbWVzdGFtcCBhZGp1c3RtZW50IGJhc2VkIG9uIHN1YnNlcXVlbnQKKyAgICAgKiBmaWVsZHMvYnVmZmVycyAqLworICAgIGlmIChmaWVsZDIKKyAgICAgICAgJiYgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZpZWxkMSwKKyAgICAgICAgICAgIDApICE9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmaWVsZDIsIDApKSB7CisgICAgICBpZiAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGZpZWxkMS0+YnVmZmVyKSArCisgICAgICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoZmllbGQxLT5idWZmZXIpID09CisgICAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGZpZWxkMi0+YnVmZmVyKSkgeworICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoZmllbGQxLT5idWZmZXIpID0KKyAgICAgICAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChmaWVsZDItPmJ1ZmZlcikgPQorICAgICAgICAgICAgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChmaWVsZDEtPmJ1ZmZlcikgKworICAgICAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGZpZWxkMi0+YnVmZmVyKSkgLyAyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGZpZWxkMi0+YnVmZmVyKSA9CisgICAgICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoZmllbGQxLT5idWZmZXIpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzZWxmLT5oaXN0b3J5X2NvdW50IDwgMykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIk5lZWQgbW9yZSBmaWVsZHMgKGhhdmUgJWQsIG5lZWQgMykiLAorICAgICAgICAgIHNlbGYtPmhpc3RvcnlfY291bnQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGZpZWxkMyA9IHNlbGYtPmZpZWxkX2hpc3Rvcnlbc2VsZi0+aGlzdG9yeV9jb3VudCAtIDNdLmZyYW1lOworICAgIGludGVybGFjaW5nX21vZGUgPSBHU1RfVklERU9fSU5GT19JTlRFUkxBQ0VfTU9ERSAoJmZpZWxkMy0+aW5mbyk7CisgICAgaWYgKElTX1RFTEVDSU5FIChpbnRlcmxhY2luZ19tb2RlKSkgeworICAgICAgaWYgKHNlbGYtPmhpc3RvcnlfY291bnQgPCA0KSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJOZWVkIG1vcmUgZmllbGRzIChoYXZlICVkLCBuZWVkIDQpIiwKKyAgICAgICAgICAgIHNlbGYtPmhpc3RvcnlfY291bnQpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisKKyAgICAgIGZpZWxkNCA9IHNlbGYtPmZpZWxkX2hpc3Rvcnlbc2VsZi0+aGlzdG9yeV9jb3VudCAtIDRdLmZyYW1lOworICAgICAgaWYgKEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmaWVsZDMsCisgICAgICAgICAgICAgIDApICE9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmaWVsZDQsIDApKSB7CisgICAgICAgIC8qIHRlbGVjaW5lIGZpZWxkcyBpbiBzZXBhcmF0ZSBidWZmZXJzICovCisgICAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChmaWVsZDMtPmJ1ZmZlcikgPQorICAgICAgICAgICAgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChmaWVsZDMtPmJ1ZmZlcikgKworICAgICAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGZpZWxkNC0+YnVmZmVyKSkgLyAyOworICAgICAgfQorICAgIH0KKworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGZpZWxkMS0+YnVmZmVyKSA9CisgICAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChmaWVsZDMtPmJ1ZmZlcikgLQorICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoZmllbGQxLT5idWZmZXIpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwKKyAgICAgICJGaWVsZCAxIGFkanVzdGVkIHRvIHRzICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBkdXIgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGZpZWxkMS0+YnVmZmVyKSksCisgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RVUkFUSU9OIChmaWVsZDEtPmJ1ZmZlcikpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfZ2V0X3BhdHRlcm5fbG9jayAoR3N0RGVpbnRlcmxhY2UgKiBzZWxmLCBnYm9vbGVhbiAqIGZsdXNoX29uZSkKK3sKKyAgLyogbG9vcCBvdmVyIGFsbCBwb3NzaWJsZSBwYXR0ZXJucyBhbmQgYWxsIHBvc3NpYmxlIHBoYXNlcworICAgKiBnaXZpbmcgZWFjaCBhIHNjb3JlLiB0aGUgaGlnaGVzdCBzY29yZSBnZXRzIHRoZSBsb2NrICovCisgIC8qIHRoZSBzY29yZSBpcyBjYWxjdWxhdGVkIGFzIHRoZSBudW1iZXIgb2YgbWF0Y2hlZCBidWZmZXJzIGluIHRoZQorICAgKiBzZXF1ZW5jZSBzdGFydGluZyBhdCB0aGUgcGhhc2Ugb2Zmc2V0IHdpdGggdGhvc2UgZnJvbSB0aGUgaGlzdG9yeQorICAgKiB0aGVuIHRoZSBsb25nZXN0IGR1cmF0aW9uIHBhdHRlcm4gbWF0Y2ggaXMgdGFrZW4uIGlmIHRoZXJlIGlzIG1vcmUgdGhhbgorICAgKiBvbmUgcGF0dGVybiBtYXRjaGluZyBhbGwgYnVmZmVycywgd2UgdGFrZSB0aGUgbG9uZ2VzdCBwYXR0ZXJuIG9mIHRob3NlLgorICAgKiBtYXRjaGVzIHRvIGNvbXBsZXRlIHBhdHRlcm5zIGFyZSBwcmVmZXJyZWQuIGlmIG5vIG5vbi10cml2aWFsIHBhdHRlcm4gaXMKKyAgICogbWF0Y2hlZCwgdHJpdmlhbCBwYXR0ZXJucyBhcmUgdGVzdGVkLiAqLworICBnaW50IGksIGosIGssIHNjb3JlLCBwYXR0ZXJuLCBwaGFzZTsKKyAgY29uc3QgZ2ludCBzdGF0ZV9jb3VudCA9IHNlbGYtPnN0YXRlX2NvdW50OworICBjb25zdCBnaW50IG5fcmVxdWlyZWQgPSBzZWxmLT5pZ25vcmVfb2JzY3VyZSA/CisgICAgICBHU1RfREVJTlRFUkxBQ0VfT0JTQ1VSRV9USFJFU0hPTEQgOgorICAgICAgR1NUX0RFSU5URVJMQUNFX01BWF9CVUZGRVJfU1RBVEVfSElTVE9SWTsKKworICAvKiBzZXQgdW5rbm93biBwYXR0ZXJuIGFzIHRoaXMgaXMgdXNlZCBpbiBsb2dpYyBvdXRzaWRlIHRoaXMgZnVuY3Rpb24gKi8KKyAgc2VsZi0+cGF0dGVybiA9IC0xOworCisgIC8qIHdhaXQgZm9yIG1vcmUgYnVmZmVycyAqLworICBpZiAoIXNlbGYtPmhhdmVfZW9zICYmIHN0YXRlX2NvdW50IDwgbl9yZXF1aXJlZCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJOZWVkIG1vcmUgYnVmZmVycyBpbiBzdGF0ZSBoaXN0b3J5IC0gJWQvJWQiLAorICAgICAgICBzdGF0ZV9jb3VudCwgbl9yZXF1aXJlZCk7CisgICAgcmV0dXJuOworICB9CisKKyAgc2NvcmUgPSBwYXR0ZXJuID0gcGhhc2UgPSAtMTsKKworICAvKiBsb29wIG92ZXIgYWxsIHBhdHRlcm5zICovCisgIGZvciAoaSA9IDA7IGkgPCBHX05fRUxFTUVOVFMgKHRlbGVjaW5lX3BhdHRlcm5zKTsgaSsrKSB7CisgICAgY29uc3QgZ3VpbnQ4IGxlbmd0aCA9IHRlbGVjaW5lX3BhdHRlcm5zW2ldLmxlbmd0aDsKKworICAgIGlmIChzZWxmLT5pZ25vcmVfb2JzY3VyZSAmJiBpID49IEdTVF9ERUlOVEVSTEFDRV9PQlNDVVJFX1RIUkVTSE9MRCkKKyAgICAgIGJyZWFrOworCisgICAgaWYgKHN0YXRlX2NvdW50IDwgbGVuZ3RoKQorICAgICAgY29udGludWU7CisKKyAgICAvKiBsb29wIG92ZXIgYWxsIHBoYXNlcyAqLworICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGg7IGorKykgeworICAgICAgLyogbG93LWxhdGVuY3kgbW9kZSBsb29rcyBhdCBwYXN0IGJ1ZmZlcnMsIGhpZ2ggbGF0ZW5jeSBhdCBmdXR1cmUgYnVmZmVycyAqLworICAgICAgY29uc3QgZ2ludCBzdGF0ZV9pZHggPQorICAgICAgICAgIHNlbGYtPmxvd19sYXRlbmN5ID8gKHNlbGYtPmhpc3RvcnlfY291bnQgLSAxKSA+PiAxIDogc3RhdGVfY291bnQgLSAxOworICAgICAgLyogbG9vcCBvdmVyIGhpc3RvcnksIGJyZWFraW5nIG9uIGRpZmZlcmluZyBidWZmZXIgc3RhdGVzICovCisgICAgICBmb3IgKGsgPSAwOyBrIDwgbGVuZ3RoICYmIGsgPCBzdGF0ZV9jb3VudDsgaysrKSB7CisgICAgICAgIGNvbnN0IGd1aW50OCBoaXN0ID0gc2VsZi0+YnVmX3N0YXRlc1tzdGF0ZV9pZHggLSBrXS5zdGF0ZTsKKyAgICAgICAgY29uc3QgZ3VpbnQ4IHBhdHQgPSB0ZWxlY2luZV9wYXR0ZXJuc1tpXS5zdGF0ZXNbKGogKyBrKSAlIGxlbmd0aF07CisgICAgICAgIGlmICghKGhpc3QgJiBwYXR0KSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogbWFrZSBjb21wbGV0ZSBtYXRjaGVzIG1vcmUgc2lnbmZpY2FudCAqLworICAgICAgaWYgKGsgPT0gbGVuZ3RoKQorICAgICAgICBrICs9IEdTVF9ERUlOVEVSTEFDRV9NQVhfQlVGRkVSX1NUQVRFX0hJU1RPUlk7CisKKyAgICAgIC8qIHRha2UgYXMgbmV3IGJlc3QgcGF0dGVybiBpZiB0aGUgbnVtYmVyIG9mIG1hdGNoZWQgYnVmZmVycyBpcyBtb3JlIHRoYW4KKyAgICAgICAqIGZvciBvdGhlciBwYXR0ZXJucyAqLworICAgICAgaWYgKGsgPiBzY29yZSkgeworICAgICAgICBzY29yZSA9IGs7CisgICAgICAgIHBhdHRlcm4gPSBpOworICAgICAgICBwaGFzZSA9IGo7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKHBhdHRlcm4gPCAwKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiRmFpbGVkIHRvIHNlbGVjdCBhIHBhdHRlcm4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgIkZpbmFsIHBhdHRlcm4gbWF0Y2ggcmVzdWx0OiBwYSAlZCwgcGggJWQsIGwgJWQsIHMgJWQiLCBwYXR0ZXJuLCBwaGFzZSwKKyAgICAgIHRlbGVjaW5lX3BhdHRlcm5zW3BhdHRlcm5dLmxlbmd0aCwgc2NvcmUpOworICBzZWxmLT5wYXR0ZXJuID0gcGF0dGVybjsKKyAgc2VsZi0+cGF0dGVybl9waGFzZSA9IHBoYXNlOworICBzZWxmLT5wYXR0ZXJuX2NvdW50ID0gMDsKKyAgc2VsZi0+b3V0cHV0X2NvdW50ID0gMDsKKyAgc2VsZi0+cGF0dGVybl9sb2NrID0gVFJVRTsKKworICBmb3IgKGkgPSAwOyBpIDwgdGVsZWNpbmVfcGF0dGVybnNbcGF0dGVybl0ubGVuZ3RoOyBpKyspIHsKKyAgICBnaW50IHN0YXRlX2lkeCA9CisgICAgICAgIHNlbGYtPmxvd19sYXRlbmN5ID8gKHNlbGYtPmhpc3RvcnlfY291bnQgLSAxKSA+PiAxIDogc2VsZi0+c3RhdGVfY291bnQgLQorICAgICAgICAxOworICAgIHN0YXRlX2lkeCAtPSBpOworICAgIEdTVF9MT0dfT0JKRUNUIChzZWxmLCAiYnVmWyVkXSAlcyIsIGksCisgICAgICAgIFNUQVRFX1RPX1NUUklORyAoc2VsZi0+YnVmX3N0YXRlc1tzdGF0ZV9pZHhdLnN0YXRlKSk7CisgIH0KKworICAvKiBjaGVjayBmb3IgdGhlIGNhc2UgdGhhdCB0aGUgZmlyc3QgZmllbGQgb2YgdGhlIHBhdHRlcm4gaXMgYW4gb3JwaGFuICovCisgIGlmIChwYXR0ZXJuID4gMQorICAgICAgJiYgdGVsZWNpbmVfcGF0dGVybnNbcGF0dGVybl0uc3RhdGVzW3BoYXNlXSAmIChHU1RfT05FIHwgR1NUX0lOVCkpIHsKKyAgICBnaW50IGkgPSBwaGFzZSwgZmllbGRfY291bnQgPSAwOworICAgIGd1aW50OCBzdGF0ZSA9IHRlbGVjaW5lX3BhdHRlcm5zW3BhdHRlcm5dLnN0YXRlc1tpXTsKKworICAgIGRvIHsKKyAgICAgIGlmIChzdGF0ZSAmIEdTVF9PTkUpIHsKKyAgICAgICAgZmllbGRfY291bnQrKzsKKyNpZiAwCisgICAgICB9IGVsc2UgaWYgKCEoc3RhdGUgJiBHU1RfRFJQKSkgeworI2VuZGlmCisgICAgICB9IGVsc2UgeworICAgICAgICBmaWVsZF9jb3VudCArPSAyOworICAgICAgfQorICAgICAgaSsrOworICAgICAgaSAlPSB0ZWxlY2luZV9wYXR0ZXJuc1twYXR0ZXJuXS5sZW5ndGg7CisgICAgICBzdGF0ZSA9IHRlbGVjaW5lX3BhdHRlcm5zW3BhdHRlcm5dLnN0YXRlc1tpXTsKKyAgICB9IHdoaWxlICghKHN0YXRlICYgR1NUX1BSRykpOworCisgICAgLyogaWYgZmllbGRfY291bnQgaXMgb2RkLCB3ZSBoYXZlIGFuIG9ycGhhbiBmaWVsZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgICAqIHNlcXVlbmNlCisgICAgICogbm90ZSAtIGRvbid0IGRvIHRoaXMgaW4gbG93LWxhdGVuY3kgbW9kZSBhcyB3ZSBhcmUgc29tZXdoZXJlIHdpdGhpbiB0aGUKKyAgICAgKiBwYXR0ZXJuIGFscmVhZHkgKi8KKyAgICBpZiAoIXNlbGYtPmxvd19sYXRlbmN5ICYmICgqZmx1c2hfb25lID0gZmllbGRfY291bnQgJiAxKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIk9ycGhhbiBmaWVsZCBkZXRlY3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSAiCisgICAgICAgICAgInBhdHRlcm4gLSBpdCB3aWxsIGJlIGRlaW50ZXJsYWNlZC4iKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9kZWludGVybGFjZV9vdXRwdXRfZnJhbWUgKEdzdERlaW50ZXJsYWNlICogc2VsZiwgZ2Jvb2xlYW4gZmx1c2hpbmcpCit7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBnaW50IGZpZWxkc19yZXF1aXJlZDsKKyAgR3N0QnVmZmVyICpidWYsICpvdXRidWY7CisgIEdzdFZpZGVvRnJhbWUgKm91dGZyYW1lID0gTlVMTDsKKyAgR3N0RGVpbnRlcmxhY2VGaWVsZCAqZmllbGQxLCAqZmllbGQyOworICBHc3RWaWRlb0ludGVybGFjZU1vZGUgaW50ZXJsYWNpbmdfbW9kZTsKKyAgZ3VpbnQ4IGJ1Zl9zdGF0ZTsKKyAgZ2Jvb2xlYW4gaGxfbm9fbG9jazsgICAgICAgICAgLyogaW5kaWNhdGVzIGhpZ2ggbGF0ZW5jeSB0aW1lc3RhbXAgYWRqdXN0bWVudCBidXQgbm8gcGF0dGVybiBsb2NrIChjb3VsZCBiZSBPTkVGIG9yIEkpICovCisgIGdib29sZWFuIHNhbWVfYnVmZmVyOyAgICAgICAgIC8qIGFyZSBmaWVsZDEgYW5kIGZpZWxkMiBpbiB0aGUgc2FtZSBidWZmZXI/ICovCisgIGdib29sZWFuIGZsdXNoX29uZTsgICAgICAgICAgIC8qIHVzZWQgZm9yIGZsdXNoaW5nIG9uZSBmaWVsZCB3aGVuIGluIGhpZ2ggbGF0ZW5jeSBtb2RlIGFuZCBub3QgbG9ja2VkICovCisgIFRlbGVjaW5lUGF0dGVybiBwYXR0ZXJuOworICBndWludDggcGhhc2UsIGNvdW50OworICBjb25zdCBHc3REZWludGVybGFjZUxvY2tpbmcgbG9ja2luZyA9IHNlbGYtPmxvY2tpbmc7CisKKyAgbWVtc2V0ICgmcGF0dGVybiwgMCwgc2l6ZW9mIChwYXR0ZXJuKSk7CisKK3Jlc3RhcnQ6CisgIHJldCA9IEdTVF9GTE9XX09LOworICBobF9ub19sb2NrID0gRkFMU0U7CisgIGZsdXNoX29uZSA9IEZBTFNFOworICBzZWxmLT5uZWVkX21vcmUgPSBGQUxTRTsKKyAgcGhhc2UgPSBzZWxmLT5wYXR0ZXJuX3BoYXNlOworICBjb3VudCA9IHNlbGYtPnBhdHRlcm5fY291bnQ7CisKKyAgaWYgKCFzZWxmLT5oaXN0b3J5X2NvdW50KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkhpc3RvcnkgaXMgZW1wdHksIHdhaXRpbmcgZm9yIG1vcmUgYnVmZmVycyEiKTsKKyAgICBnb3RvIG5lZWRfbW9yZTsKKyAgfQorCisgIGZpZWxkMSA9ICZzZWxmLT5maWVsZF9oaXN0b3J5W3NlbGYtPmhpc3RvcnlfY291bnQgLSAxXTsKKworICBpZiAobG9ja2luZyAhPSBHU1RfREVJTlRFUkxBQ0VfTE9DS0lOR19OT05FKSB7CisgICAgR3N0Q2FwcyAqc2lua2NhcHM7CisKKyAgICBpZiAoIXNlbGYtPnN0YXRlX2NvdW50KSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLAorICAgICAgICAgICJCUk9LRU4hIEZpZWxkcyBpbiBoaXN0b3J5ICsgbm8gc3RhdGVzIHNob3VsZCBub3QgaGFwcGVuISIpOworICAgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICAgIH0KKworICAgIGdzdF9kZWludGVybGFjZV9nZXRfYnVmZmVyX3N0YXRlIChzZWxmLCBmaWVsZDEtPmZyYW1lLCAmYnVmX3N0YXRlLAorICAgICAgICAmaW50ZXJsYWNpbmdfbW9kZSk7CisKKyAgICBpZiAoc2VsZi0+cGF0dGVybiAhPSAtMSkKKyAgICAgIHBhdHRlcm4gPSB0ZWxlY2luZV9wYXR0ZXJuc1tzZWxmLT5wYXR0ZXJuXTsKKworICAgIC8qIHBhdHRlcm5zIDAgYW5kIDEgYXJlIGludGVybGFjZWQsIHRoZSByZXN0IGFyZSB0ZWxlY2luZSAqLworICAgIGlmIChzZWxmLT5wYXR0ZXJuID4gMSkKKyAgICAgIGludGVybGFjaW5nX21vZGUgPSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfTUlYRUQ7CisKKyAgICBpZiAoc2VsZi0+cGF0dGVybiA9PSAtMSB8fCBzZWxmLT5wYXR0ZXJuX3JlZnJlc2gKKyAgICAgICAgfHwgIShidWZfc3RhdGUgJiBwYXR0ZXJuLnN0YXRlc1socGhhc2UgKyBjb3VudCkgJSBwYXR0ZXJuLmxlbmd0aF0pKSB7CisgICAgICBpZiAoc2VsZi0+cGF0dGVybiA9PSAtMSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiTm8gcGF0dGVybiBsb2NrIC0gcmVmcmVzaCBsb2NrIik7CisgICAgICB9IGVsc2UgaWYgKHNlbGYtPnBhdHRlcm5fcmVmcmVzaCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUGF0dGVybiByZWZyZXNoIC0gcmVmcmVzaCBsb2NrIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiVW5leHBlY3RlZCBidWZmZXIgc3RhdGUgLSByZWZyZXNoIGxvY2siKTsKKyAgICAgIH0KKyAgICAgIC8qIG5vIHBhdHRlcm4sIHBhdHRlcm4gcmVmcmVzaCBzZXQgb3IgdW5leHBlY3RlZCBidWZmZXIgc3RhdGUgKi8KKyAgICAgIHNlbGYtPnBhdHRlcm5fbG9jayA9IEZBTFNFOworICAgICAgc2VsZi0+cGF0dGVybl9yZWZyZXNoID0gVFJVRTsKKworICAgICAgLyogcmVmcmVzaCBwYXR0ZXJuIGxvY2sgKi8KKyAgICAgIGdzdF9kZWludGVybGFjZV9nZXRfcGF0dGVybl9sb2NrIChzZWxmLCAmZmx1c2hfb25lKTsKKworICAgICAgaWYgKHNlbGYtPnBhdHRlcm4gIT0gLTEpIHsKKyAgICAgICAgLyogbG9ja2VkIG9udG8gYSB2YWxpZCBwYXR0ZXJuIHNvIHJlZnJlc2ggY29tcGxldGUgKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlBhdHRlcm4gbG9ja2VkISAlcyBzdGFydGluZyBhdCAlZCIsCisgICAgICAgICAgICB0ZWxlY2luZV9wYXR0ZXJuc1tzZWxmLT5wYXR0ZXJuXS5uaWNrLCBzZWxmLT5wYXR0ZXJuX3BoYXNlKTsKKyAgICAgICAgc2VsZi0+cGF0dGVybl9yZWZyZXNoID0gRkFMU0U7CisgICAgICB9IGVsc2UgaWYgKCFzZWxmLT5sb3dfbGF0ZW5jeSkgeworICAgICAgICBpZiAoIXNlbGYtPnBhdHRlcm5fbG9jaykgeworICAgICAgICAgIGdvdG8gbmVlZF9tb3JlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGhsX25vX2xvY2sgPSBUUlVFOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIHNldGNhcHMgb24gc2luayBhbmQgc3JjIHBhZHMgKi8KKyAgICAgIHNpbmtjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChzZWxmLT5zaW5rcGFkKTsKKyAgICAgIGlmICghc2lua2NhcHMgfHwgIWdzdF9kZWludGVybGFjZV9zZXRjYXBzIChzZWxmLCBzZWxmLT5zaW5rcGFkLCBzaW5rY2FwcykpIHsKKyAgICAgICAgaWYgKHNpbmtjYXBzKQorICAgICAgICAgIGdzdF9jYXBzX3VucmVmIChzaW5rY2Fwcyk7CisgICAgICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICAgIH0KKworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHNpbmtjYXBzKTsKKworICAgICAgaWYgKGZsdXNoX29uZSAmJiBzZWxmLT5kcm9wX29ycGhhbnMpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkRyb3BwaW5nIG9ycGhhbiBmaXJzdCBmaWVsZCIpOworICAgICAgICBzZWxmLT5jdXJfZmllbGRfaWR4LS07CisgICAgICAgIGdzdF92aWRlb19mcmFtZV91bm1hcF9hbmRfZnJlZSAoZ3N0X2RlaW50ZXJsYWNlX3BvcF9oaXN0b3J5IChzZWxmKSk7CisgICAgICAgIGdvdG8gcmVzdGFydDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ3N0X2RlaW50ZXJsYWNlX2dldF9idWZmZXJfc3RhdGUgKHNlbGYsIGZpZWxkMS0+ZnJhbWUsIE5VTEwsCisgICAgICAgICZpbnRlcmxhY2luZ19tb2RlKTsKKyAgfQorCisgIHNhbWVfYnVmZmVyID0gc2VsZi0+aGlzdG9yeV9jb3VudCA+PSAyCisgICAgICAmJiAoR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZpZWxkMS0+ZnJhbWUsIDApID09CisgICAgICBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc2VsZi0+ZmllbGRfaGlzdG9yeVtzZWxmLT5oaXN0b3J5X2NvdW50IC0KKyAgICAgICAgICAgICAgMl0uZnJhbWUsIDApKTsKKworICBpZiAoKGZsdXNoaW5nICYmIHNlbGYtPmhpc3RvcnlfY291bnQgPT0gMSkgfHwgKGZsdXNoX29uZQorICAgICAgICAgICYmICFzZWxmLT5kcm9wX29ycGhhbnMpIHx8IChobF9ub19sb2NrICYmIChzZWxmLT5oaXN0b3J5X2NvdW50ID09IDEKKyAgICAgICAgICAgICAgfHwgIXNhbWVfYnVmZmVyKSkpIHsKKyAgICAvKiBUaGlzIGNhc2UgaXMgZm9yIGZsdXNoaW5nIGEgc2luZ2xlIGZpZWxkOgorICAgICAqIC0gZmx1c2hpbmcgYW5kIDEgZmllbGQgaW4gdGhlIGhpc3RvcnkKKyAgICAgKiAtIGZsdXNoIG9uZSAoZHVlIHRvIG9ycGhhbnMgaW4gdGhlIHBhdHRlcm4pIGFuZCBkbyBub3QgZHJvcCBvcnBoYW5zCisgICAgICogLSBoaWdoLWxhdGVuY3kgcGF0dGVybiBsb2NraW5nIHdpdGggbm8gcG9zc2libGUgbG9jayBnaXZlbiB0aGUgY3VycmVudAorICAgICAqICAgc3RhdGUgYW5kIGVpdGhlciBvbmx5IG9uZSBmaWVsZCBpbiB0aGUgaGlzdG9yeSBvciB0aGUgdGlwIHR3byBmaWVsZHMKKyAgICAgKiAgIGFyZSBpbiBzZXBhcmF0ZSBidWZmZXJzICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkZsdXNoaW5nIG9uZSBmaWVsZCB1c2luZyBsaW5lYXIgbWV0aG9kIik7CisgICAgZ3N0X2RlaW50ZXJsYWNlX3NldF9tZXRob2QgKHNlbGYsIEdTVF9ERUlOVEVSTEFDRV9MSU5FQVIpOworICAgIGZpZWxkc19yZXF1aXJlZCA9IGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X2ZpZWxkc19yZXF1aXJlZCAoc2VsZi0+bWV0aG9kKTsKKyAgfSBlbHNlIGlmIChpbnRlcmxhY2luZ19tb2RlID09IEdTVF9WSURFT19JTlRFUkxBQ0VfTU9ERV9QUk9HUkVTU0lWRSB8fAorICAgICAgKGludGVybGFjaW5nX21vZGUgPT0gR1NUX1ZJREVPX0lOVEVSTEFDRV9NT0RFX01JWEVEICYmCisgICAgICAgICAgIUdTVF9WSURFT19GUkFNRV9JU19JTlRFUkxBQ0VEIChmaWVsZDEtPmZyYW1lKSkpIHsKKyAgICAvKiBUaGlzIGNhc2UgaXMgZm9yIHByb2Nlc3NpbmcgcHJvZ3Jlc3NpdmUgYnVmZmVycywgdGVsZWNpbmUgb3IgcGxhaW4KKyAgICAgKiBwcm9ncmVzc2l2ZSAqLworICAgIEdzdFZpZGVvRnJhbWUgKmZpZWxkMV9mcmFtZTsKKyAgICBHc3RCdWZmZXIgKmZpZWxkMV9idWZmZXI7CisKKyAgICAvKiBwcm9ncmVzc2l2ZSAqLworICAgIGZpZWxkc19yZXF1aXJlZCA9IDI7CisKKyAgICAvKiBOb3QgZW5vdWdoIGZpZWxkcyBpbiB0aGUgaGlzdG9yeSAqLworICAgIGlmICghZmx1c2hpbmcgJiYgc2VsZi0+aGlzdG9yeV9jb3VudCA8IGZpZWxkc19yZXF1aXJlZCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIk5lZWQgbW9yZSBmaWVsZHMgKGhhdmUgJWQsIG5lZWQgJWQpIiwKKyAgICAgICAgICBzZWxmLT5oaXN0b3J5X2NvdW50LCBzZWxmLT5jdXJfZmllbGRfaWR4ICsgZmllbGRzX3JlcXVpcmVkKTsKKyAgICAgIGdvdG8gbmVlZF9tb3JlOworICAgIH0KKworICAgIGZpZWxkMiA9ICZzZWxmLT5maWVsZF9oaXN0b3J5W3NlbGYtPmhpc3RvcnlfY291bnQgLSAyXTsKKyAgICBpZiAoR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZpZWxkMS0+ZnJhbWUsCisgICAgICAgICAgICAwKSAhPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZmllbGQyLT5mcmFtZSwgMCkpIHsKKyAgICAgIC8qIEVSUk9SIC0gbmV4dCB0d28gZmllbGRzIGluIGZpZWxkIGhpc3RvcnkgYXJlIG5vdCBvbmUgcHJvZ3Jlc3NpdmUgYnVmZmVyIC0gd2VhdmU/ICovCisgICAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLAorICAgICAgICAgICJQcm9ncmVzc2l2ZSBidWZmZXIgYnV0IHR3byBmaWVsZHMgYXQgdGlwIGFyZW4ndCBpbiB0aGUgc2FtZSBidWZmZXIhIik7CisgICAgfQorCisgICAgaWYgKElTX1RFTEVDSU5FIChpbnRlcmxhY2luZ19tb2RlKQorICAgICAgICAmJiAhZ3N0X2RlaW50ZXJsYWNlX2ZpeF90aW1lc3RhbXBzIChzZWxmLCBmaWVsZDEtPmZyYW1lLCBmaWVsZDItPmZyYW1lKQorICAgICAgICAmJiAhZmx1c2hpbmcpCisgICAgICBnb3RvIG5lZWRfbW9yZTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICJGcmFtZSB0eXBlOiBQcm9ncmVzc2l2ZTsgcHVzaGluZyBidWZmZXIgYXMgYSBmcmFtZSIpOworICAgIC8qIHBvcCBhbmQgcHVzaCAqLworICAgIHNlbGYtPmN1cl9maWVsZF9pZHgtLTsKKyAgICBmaWVsZDFfZnJhbWUgPSBnc3RfZGVpbnRlcmxhY2VfcG9wX2hpc3RvcnkgKHNlbGYpOworICAgIGZpZWxkMV9idWZmZXIgPSBmaWVsZDFfZnJhbWUtPmJ1ZmZlcjsKKyAgICBnc3RfYnVmZmVyX3JlZiAoZmllbGQxX2J1ZmZlcik7CisgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwX2FuZF9mcmVlIChmaWVsZDFfZnJhbWUpOworICAgIC8qIGZpZWxkMiBpcyB0aGUgc2FtZSBidWZmZXIgYXMgZmllbGQxLCBidXQgd2UgbmVlZCB0byByZW1vdmUgaXQgZnJvbSB0aGUKKyAgICAgKiBoaXN0b3J5IGFueXdheSAqLworICAgIHNlbGYtPmN1cl9maWVsZF9pZHgtLTsKKyAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXBfYW5kX2ZyZWUgKGdzdF9kZWludGVybGFjZV9wb3BfaGlzdG9yeSAoc2VsZikpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICJbT1VUXSB0cyAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZHVyICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBlbmQgJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoZmllbGQxX2J1ZmZlcikpLAorICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RVUkFUSU9OIChmaWVsZDFfYnVmZmVyKSksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChmaWVsZDFfYnVmZmVyKSArCisgICAgICAgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChmaWVsZDFfYnVmZmVyKSkpOworICAgIGlmIChzZWxmLT5kaXNjb250KSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChmaWVsZDFfYnVmZmVyLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgICBzZWxmLT5kaXNjb250ID0gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBnc3RfcGFkX3B1c2ggKHNlbGYtPnNyY3BhZCwgZmllbGQxX2J1ZmZlcik7CisgIH0gZWxzZSBpZiAoSVNfVEVMRUNJTkUgKGludGVybGFjaW5nX21vZGUpCisgICAgICAmJiBHU1RfVklERU9fRlJBTUVfSVNfSU5URVJMQUNFRCAoZmllbGQxLT5mcmFtZSkgJiYgIXNhbWVfYnVmZmVyKSB7CisgICAgLyogVGhpcyBjYXNlIG5lZWRzIHRvIGlkZW50aWZ5IHRlbGVjaW5lIG1peGVkIGJ1ZmZlcnMgdGhhdCByZXF1aXJlIHdlYXZpbmcKKyAgICAgKiBvZiB0d28gZmllbGRzIGluIGRpZmZlcmVudCBidWZmZXJzLgorICAgICAqIC0gaW50ZXJsYWNpbmcgbW9kZSBpcyBtaXhlZAorICAgICAqIC0gbG9ja2VkIG9uIHRvIGEgdGVsZWNpbmUgcGF0dGVybgorICAgICAqIC0gZnJhbWUgaXMgaW50ZXJsYWNlZAorICAgICAqIC0gZmllbGRzIGFyZSBpbiBzZXBhcmF0ZSBidWZmZXJzCisgICAgICogSWYgd2UgZG9uJ3QgeWV0IGhhdmUgYSBwYXR0ZXJuIGxvY2ssIHdlIHdpbGwgaGF2ZSB0byBkZWludGVybGFjZSBhcyB3ZQorICAgICAqIGRvbid0IGV4cGxpY2l0bHkga25vdyB3ZSBoYXZlIGEgdGVsZWNpbmUgc2VxdWVuY2UgYW5kIHNvIHdlIGRyb3AgdGhyb3VnaAorICAgICAqIHRvIHRoZSBwbGFpbiBkZWludGVybGFjZSBjYXNlICovCisgICAgZmllbGRzX3JlcXVpcmVkID0gMjsKKyAgICBpZiAoIWZsdXNoaW5nICYmIHNlbGYtPmhpc3RvcnlfY291bnQgPCBmaWVsZHNfcmVxdWlyZWQpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJOZWVkIG1vcmUgZmllbGRzIChoYXZlICVkLCBuZWVkICVkKSIsCisgICAgICAgICAgc2VsZi0+aGlzdG9yeV9jb3VudCwgc2VsZi0+Y3VyX2ZpZWxkX2lkeCArIGZpZWxkc19yZXF1aXJlZCk7CisgICAgICBnb3RvIG5lZWRfbW9yZTsKKyAgICB9CisKKyAgICBmaWVsZDIgPSAmc2VsZi0+ZmllbGRfaGlzdG9yeVtzZWxmLT5oaXN0b3J5X2NvdW50IC0gMl07CisgICAgaWYgKCFnc3RfZGVpbnRlcmxhY2VfZml4X3RpbWVzdGFtcHMgKHNlbGYsIGZpZWxkMS0+ZnJhbWUsIGZpZWxkMi0+ZnJhbWUpCisgICAgICAgICYmICFmbHVzaGluZykKKyAgICAgIGdvdG8gbmVlZF9tb3JlOworCisgICAgLyogY2hlY2sgZmllbGQxIGFuZCBmaWVsZDIgYnVmZmVyIGNhcHMgYW5kIGZsYWdzIGFyZSBjb3JyZXNwb25kaW5nICovCisgICAgaWYgKGZpZWxkMS0+ZmxhZ3MgPT0gZmllbGQyLT5mbGFncykgeworICAgICAgLyogRVJST1IgLSBmaWVsZHMgYXJlIG9mIHNhbWUgcGFyaXR5IC0gd2hhdCBzaG91bGQgYmUgZG9uZSBoZXJlPworICAgICAgICogcGVyaGFwcyBkZWludGVybGFjZSB0aGUgdGlwIGZpZWxkIGFuZCBzdGFydCBhZ2Fpbj8gKi8KKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJUZWxlY2luZSBtaXhlZCB3aXRoIGZpZWxkcyBvZiBzYW1lIHBhcml0eSEiKTsKKyAgICB9CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwKKyAgICAgICAgIkZyYW1lIHR5cGU6IFRlbGVjaW5lIE1peGVkOyB3ZWF2aW5nIHRpcCB0d28gZmllbGRzIGludG8gYSBmcmFtZSIpOworICAgIC8qIHNldCBtZXRob2QgdG8gV0VBVkUgKi8KKyAgICBnc3RfZGVpbnRlcmxhY2Vfc2V0X21ldGhvZCAoc2VsZiwgR1NUX0RFSU5URVJMQUNFX1dFQVZFKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBUaGlzIGlzIHRoZSBmaW5hbCBjYXRjaC1hbGwgY2FzZSB0aGF0IGFwcGxpZXMgdGhlIHNlbGVjdGVkIGRlaW50ZXJsYWNpbmcKKyAgICAgKiBtZXRob2QuIEF0IHRoaXMgcG9pbnQgdGhlIGZpZWxkcyB0byBiZSBwcm9jZXNzZWQgYXJlIGVpdGhlciBkZWZpbml0ZWx5CisgICAgICogaW50ZXJsYWNlZCBvciB3ZSBkbyBub3QgeWV0IGtub3cgdGhhdCB3ZSBoYXZlIGEgdGVsZWNpbmUgcGF0dGVybiBsb2NrCisgICAgICogYW5kIHNvIHRoZSBiZXN0IHdlIGNhbiBkbyBpcyB0byBkZWludGVybGFjZSB0aGUgZmllbGRzLiAqLworICAgIGdzdF9kZWludGVybGFjZV9zZXRfbWV0aG9kIChzZWxmLCBzZWxmLT51c2VyX3NldF9tZXRob2RfaWQpOworICAgIGZpZWxkc19yZXF1aXJlZCA9IGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X2ZpZWxkc19yZXF1aXJlZCAoc2VsZi0+bWV0aG9kKTsKKyAgICBpZiAoZmx1c2hpbmcgJiYgc2VsZi0+aGlzdG9yeV9jb3VudCA8IGZpZWxkc19yZXF1aXJlZCkgeworICAgICAgLyogbm90ZTogd2UgYWxyZWFkeSBjaGVja2VkIGZvciBmbHVzaGluZyB3aXRoIGhpc3RvcnkgY291bnQgPT0gMSBhYm92ZQorICAgICAgICogc28gd2UgbXVzdCBoYXZlIDIgb3IgbW9yZSBmaWVsZHMgaW4gaGVyZSAqLworICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NldF9tZXRob2QgKHNlbGYsIEdTVF9ERUlOVEVSTEFDRV9WRklSKTsKKyAgICAgIGZpZWxkc19yZXF1aXJlZCA9CisgICAgICAgICAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9nZXRfZmllbGRzX3JlcXVpcmVkIChzZWxmLT5tZXRob2QpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkZsdXNoaW5nIGZpZWxkKHMpIHVzaW5nICVzIG1ldGhvZCIsCisgICAgICAgICAgbWV0aG9kc190eXBlc1tzZWxmLT5tZXRob2RfaWRdLnZhbHVlX25pY2spOworICAgIH0KKworICAgIC8qIE5vdCBlbm91Z2ggZmllbGRzIGluIHRoZSBoaXN0b3J5ICovCisgICAgaWYgKCFmbHVzaGluZyAmJiBzZWxmLT5oaXN0b3J5X2NvdW50IDwgZmllbGRzX3JlcXVpcmVkKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiTmVlZCBtb3JlIGZpZWxkcyAoaGF2ZSAlZCwgbmVlZCAlZCkiLAorICAgICAgICAgIHNlbGYtPmhpc3RvcnlfY291bnQsIHNlbGYtPmN1cl9maWVsZF9pZHggKyBmaWVsZHNfcmVxdWlyZWQpOworICAgICAgZ290byBuZWVkX21vcmU7CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwKKyAgICAgICAgIkZyYW1lIHR5cGU6IEludGVybGFjZWQ7IGRlaW50ZXJsYWNpbmcgdXNpbmcgJXMgbWV0aG9kIiwKKyAgICAgICAgbWV0aG9kc190eXBlc1tzZWxmLT5tZXRob2RfaWRdLnZhbHVlX25pY2spOworICB9CisKKyAgaWYgKCFmbHVzaGluZyAmJiBzZWxmLT5jdXJfZmllbGRfaWR4IDwgMSkgeworICAgIGdvdG8gbmVlZF9tb3JlOworICB9IGVsc2UgaWYgKHNlbGYtPmN1cl9maWVsZF9pZHggPCAwICYmIGZsdXNoaW5nKSB7CisgICAgc2VsZi0+Y3VyX2ZpZWxkX2lkeCsrOworICB9CisKKyAgaWYgKHNlbGYtPmZpZWxkcyA9PSBHU1RfREVJTlRFUkxBQ0VfQUxMIHx8IElTX1RFTEVDSU5FIChpbnRlcmxhY2luZ19tb2RlKSkKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiQWxsIGZpZWxkcyIpOworICBlbHNlIGlmIChzZWxmLT5maWVsZHMgPT0gR1NUX0RFSU5URVJMQUNFX1RGKQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJUb3AgZmllbGRzIik7CisgIGVsc2UgaWYgKHNlbGYtPmZpZWxkcyA9PSBHU1RfREVJTlRFUkxBQ0VfQkYpCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkJvdHRvbSBmaWVsZHMiKTsKKworICBpZiAoKHNlbGYtPmZpZWxkX2hpc3Rvcnlbc2VsZi0+Y3VyX2ZpZWxkX2lkeF0uZmxhZ3MgPT0gUElDVFVSRV9JTlRFUkxBQ0VEX1RPUAorICAgICAgICAgICYmIChzZWxmLT5maWVsZHMgPT0gR1NUX0RFSU5URVJMQUNFX1RGCisgICAgICAgICAgICAgIHx8IElTX1RFTEVDSU5FIChpbnRlcmxhY2luZ19tb2RlKSkpCisgICAgICB8fCAoc2VsZi0+ZmllbGRzID09IEdTVF9ERUlOVEVSTEFDRV9BTEwKKyAgICAgICAgICAmJiAhSVNfVEVMRUNJTkUgKGludGVybGFjaW5nX21vZGUpKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJkZWludGVybGFjaW5nIHRvcCBmaWVsZCIpOworCisgICAgLyogY3JlYXRlIG5ldyBidWZmZXIgKi8KKyAgICByZXQgPSBnc3RfYnVmZmVyX3Bvb2xfYWNxdWlyZV9idWZmZXIgKHNlbGYtPnBvb2wsICZvdXRidWYsIE5VTEwpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIG5vX2J1ZmZlcjsKKworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZWxmLT5oaXN0b3J5X2NvdW50ID49CisgICAgICAgIDEgKyBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dldF9sYXRlbmN5IChzZWxmLT5tZXRob2QpLCBHU1RfRkxPV19FUlJPUik7CisKKyAgICBidWYgPQorICAgICAgICBzZWxmLT5maWVsZF9oaXN0b3J5W3NlbGYtPmhpc3RvcnlfY291bnQgLSAxIC0KKyAgICAgICAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9nZXRfbGF0ZW5jeSAoc2VsZi0+bWV0aG9kKV0uZnJhbWUtPmJ1ZmZlcjsKKworICAgIGlmICghSVNfVEVMRUNJTkUgKGludGVybGFjaW5nX21vZGUpKSB7CisgICAgICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKworICAgICAgaWYgKHNlbGYtPmZpZWxkcyA9PSBHU1RfREVJTlRFUkxBQ0VfQUxMKSB7CisgICAgICAgIGlmIChzZWxmLT5zZWdtZW50LnJhdGUgPCAwKQorICAgICAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpID0gdGltZXN0YW1wICsgc2VsZi0+ZmllbGRfZHVyYXRpb247CisgICAgICAgIGVsc2UKKyAgICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSA9IHRpbWVzdGFtcDsKKyAgICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9IHNlbGYtPmZpZWxkX2R1cmF0aW9uOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSB0aW1lc3RhbXA7CisgICAgICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPSAyICogc2VsZi0+ZmllbGRfZHVyYXRpb247CisgICAgICB9CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgICAgICJbQURKVVNUXSB0cyAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZHVyICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBlbmQgJSIKKyAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpKSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpKSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSArCisgICAgICAgICAgICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikpKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPQorICAgICAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChmaWVsZDEtPmZyYW1lLT5idWZmZXIpOworICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9CisgICAgICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoZmllbGQxLT5mcmFtZS0+YnVmZmVyKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGRyb3AgdGhlIGZyYW1lIGJlY2F1c2Ugb2YgUW9TICovCisgICAgaWYgKCFnc3RfZGVpbnRlcmxhY2VfZG9fcW9zIChzZWxmLCBidWYpKSB7CisgICAgICBzZWxmLT5jdXJfZmllbGRfaWR4LS07CisgICAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXBfYW5kX2ZyZWUgKGdzdF9kZWludGVybGFjZV9wb3BfaGlzdG9yeSAoc2VsZikpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmKTsKKyAgICAgIG91dGJ1ZiA9IE5VTEw7CisgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHNlbGYtPmN1cl9maWVsZF9pZHggPCAwICYmIGZsdXNoaW5nKSB7CisgICAgICAgIGlmIChzZWxmLT5oaXN0b3J5X2NvdW50ID09IDEpIHsKKyAgICAgICAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXBfYW5kX2ZyZWUgKGdzdF9kZWludGVybGFjZV9wb3BfaGlzdG9yeSAoc2VsZikpOworICAgICAgICAgIGdvdG8gbmVlZF9tb3JlOworICAgICAgICB9CisgICAgICAgIHNlbGYtPmN1cl9maWVsZF9pZHgrKzsKKyAgICAgIH0KKyAgICAgIGlmIChzZWxmLT5jdXJfZmllbGRfaWR4IDwgMCkgeworICAgICAgICBnb3RvIG5lZWRfbW9yZTsKKyAgICAgIH0KKyAgICAgIGlmICghZmx1c2hpbmcgJiYgc2VsZi0+Y3VyX2ZpZWxkX2lkeCA8IDEpIHsKKyAgICAgICAgZ290byBuZWVkX21vcmU7CisgICAgICB9CisKKyAgICAgIC8qIG1hcCB0aGUgZnJhbWUgc28gdGhlIGRlaW50ZXJsYWNlIG1ldGhvZHMgY2FuIHdyaXRlIHRoZSBkYXRhIHRvIHRoZQorICAgICAgICogY29ycmVjdCBtZW1vcnkgbG9jYXRpb25zICovCisgICAgICBvdXRmcmFtZSA9CisgICAgICAgICAgZ3N0X3ZpZGVvX2ZyYW1lX25ld19hbmRfbWFwICgmc2VsZi0+dmluZm8sIG91dGJ1ZiwgR1NUX01BUF9XUklURSk7CisKKyAgICAgIC8qIGRvIG1hZ2ljIGNhbGN1bHVzICovCisgICAgICBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lIChzZWxmLT5tZXRob2QsCisgICAgICAgICAgc2VsZi0+ZmllbGRfaGlzdG9yeSwgc2VsZi0+aGlzdG9yeV9jb3VudCwgb3V0ZnJhbWUsCisgICAgICAgICAgc2VsZi0+Y3VyX2ZpZWxkX2lkeCk7CisKKyAgICAgIGdzdF92aWRlb19mcmFtZV91bm1hcF9hbmRfZnJlZSAob3V0ZnJhbWUpOworCisgICAgICBzZWxmLT5jdXJfZmllbGRfaWR4LS07CisgICAgICAvKiBuZWVkIHRvIHJlbW92ZSB0aGUgZmllbGQgaW4gdGhlIHRlbGVjaW5lIHdlYXZpbmcgY2FzZSAqLworICAgICAgaWYgKChJU19URUxFQ0lORSAoaW50ZXJsYWNpbmdfbW9kZSkKKyAgICAgICAgICAgICAgJiYgc2VsZi0+bWV0aG9kX2lkID09IEdTVF9ERUlOVEVSTEFDRV9XRUFWRSkKKyAgICAgICAgICB8fCBzZWxmLT5jdXJfZmllbGRfaWR4ICsgMSArCisgICAgICAgICAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9nZXRfbGF0ZW5jeSAoc2VsZi0+bWV0aG9kKSA8CisgICAgICAgICAgc2VsZi0+aGlzdG9yeV9jb3VudCB8fCBmbHVzaGluZykgeworICAgICAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXBfYW5kX2ZyZWUgKGdzdF9kZWludGVybGFjZV9wb3BfaGlzdG9yeSAoc2VsZikpOworICAgICAgfQorCisgICAgICBpZiAoZ3N0X2RlaW50ZXJsYWNlX2NsaXBfYnVmZmVyIChzZWxmLCBvdXRidWYpKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICAgICAiW09VVF0gdHMgJSIgR1NUX1RJTUVfRk9STUFUICIsIGR1ciAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZW5kICUiCisgICAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpKSwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikpLAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgKworICAgICAgICAgICAgICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikpKTsKKyAgICAgICAgaWYgKHNlbGYtPmRpc2NvbnQpIHsKKyAgICAgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICAgICAgICBzZWxmLT5kaXNjb250ID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoIChzZWxmLT5zcmNwYWQsIG91dGJ1Zik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmKTsKKyAgICAgIH0KKworICAgICAgb3V0YnVmID0gTlVMTDsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIHJldHVybiByZXQ7CisgICAgICBpZiAoSVNfVEVMRUNJTkUgKGludGVybGFjaW5nX21vZGUpCisgICAgICAgICAgJiYgc2VsZi0+bWV0aG9kX2lkID09IEdTVF9ERUlOVEVSTEFDRV9XRUFWRSkgeworICAgICAgICAvKiBwb3Agb2ZmIHRoZSBzZWNvbmQgZmllbGQgKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlJlbW92aW5nIHVudXNlZCBmaWVsZCAoY291bnQ6ICVkKSIsCisgICAgICAgICAgICBzZWxmLT5oaXN0b3J5X2NvdW50KTsKKyAgICAgICAgc2VsZi0+Y3VyX2ZpZWxkX2lkeC0tOworICAgICAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXBfYW5kX2ZyZWUgKGdzdF9kZWludGVybGFjZV9wb3BfaGlzdG9yeSAoc2VsZikpOworICAgICAgICBpbnRlcmxhY2luZ19tb2RlID0gR1NUX1ZJREVPX0lOVEVSTEFDRV9NT0RFX0lOVEVSTEVBVkVEOworICAgICAgICByZXR1cm4gcmV0OworICAgICAgfQorICAgIH0KKworICAgIGlmIChmbHVzaF9vbmUgJiYgIXNlbGYtPmRyb3Bfb3JwaGFucykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIk9ycGhhbiBmaWVsZCBkZWludGVybGFjZWQgLSByZWNvbmZpZ3VyaW5nIik7CisgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgfQorICB9CisgIC8qIG5vIGNhbGN1bGF0aW9uIGRvbmU6IHJlbW92ZSBleGNlc3MgZmllbGQgKi8KKyAgZWxzZSBpZiAoc2VsZi0+ZmllbGRfaGlzdG9yeVtzZWxmLT5jdXJfZmllbGRfaWR4XS5mbGFncyA9PQorICAgICAgUElDVFVSRV9JTlRFUkxBQ0VEX1RPUCAmJiAoc2VsZi0+ZmllbGRzID09IEdTVF9ERUlOVEVSTEFDRV9CRgorICAgICAgICAgICYmICFJU19URUxFQ0lORSAoaW50ZXJsYWNpbmdfbW9kZSkpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlJlbW92aW5nIHVudXNlZCB0b3AgZmllbGQiKTsKKyAgICBzZWxmLT5jdXJfZmllbGRfaWR4LS07CisgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwX2FuZF9mcmVlIChnc3RfZGVpbnRlcmxhY2VfcG9wX2hpc3RvcnkgKHNlbGYpKTsKKworICAgIGlmIChmbHVzaF9vbmUgJiYgIXNlbGYtPmRyb3Bfb3JwaGFucykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIk9ycGhhbiBmaWVsZCBkZWludGVybGFjZWQgLSByZWNvbmZpZ3VyaW5nIik7CisgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgfQorICB9CisKKyAgaWYgKHNlbGYtPmhpc3RvcnlfY291bnQgPCBmaWVsZHNfcmVxdWlyZWQpCisgICAgcmV0dXJuIHJldDsKKworICBpZiAoc2VsZi0+Y3VyX2ZpZWxkX2lkeCA8IDApCisgICAgcmV0dXJuIHJldDsKKworICAvKiBkZWludGVybGFjZSBib3R0b21fZmllbGQgKi8KKyAgaWYgKChzZWxmLT5maWVsZF9oaXN0b3J5W3NlbGYtPmN1cl9maWVsZF9pZHhdLmZsYWdzID09CisgICAgICAgICAgUElDVFVSRV9JTlRFUkxBQ0VEX0JPVFRPTSAmJiAoc2VsZi0+ZmllbGRzID09IEdTVF9ERUlOVEVSTEFDRV9CRgorICAgICAgICAgICAgICB8fCBJU19URUxFQ0lORSAoaW50ZXJsYWNpbmdfbW9kZSkpKQorICAgICAgfHwgKHNlbGYtPmZpZWxkcyA9PSBHU1RfREVJTlRFUkxBQ0VfQUxMCisgICAgICAgICAgJiYgIUlTX1RFTEVDSU5FIChpbnRlcmxhY2luZ19tb2RlKSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiZGVpbnRlcmxhY2luZyBib3R0b20gZmllbGQiKTsKKworICAgIC8qIGNyZWF0ZSBuZXcgYnVmZmVyICovCisgICAgcmV0ID0gZ3N0X2J1ZmZlcl9wb29sX2FjcXVpcmVfYnVmZmVyIChzZWxmLT5wb29sLCAmb3V0YnVmLCBOVUxMKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBub19idWZmZXI7CisKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2VsZi0+aGlzdG9yeV9jb3VudCA+PQorICAgICAgICBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dldF9sYXRlbmN5IChzZWxmLT5tZXRob2QpICsgMSwgR1NUX0ZMT1dfRVJST1IpOworCisgICAgYnVmID0KKyAgICAgICAgc2VsZi0+ZmllbGRfaGlzdG9yeVtzZWxmLT5oaXN0b3J5X2NvdW50IC0gMSAtCisgICAgICAgIGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X2xhdGVuY3kgKHNlbGYtPm1ldGhvZCldLmZyYW1lLT5idWZmZXI7CisgICAgaWYgKCFJU19URUxFQ0lORSAoaW50ZXJsYWNpbmdfbW9kZSkpIHsKKyAgICAgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpOworCisgICAgICBpZiAoc2VsZi0+ZmllbGRzID09IEdTVF9ERUlOVEVSTEFDRV9BTEwpIHsKKyAgICAgICAgaWYgKHNlbGYtPnNlZ21lbnQucmF0ZSA8IDApCisgICAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSB0aW1lc3RhbXA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSA9IHRpbWVzdGFtcCArIHNlbGYtPmZpZWxkX2R1cmF0aW9uOworICAgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gc2VsZi0+ZmllbGRfZHVyYXRpb247CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSA9IHRpbWVzdGFtcDsKKyAgICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9IDIgKiBzZWxmLT5maWVsZF9kdXJhdGlvbjsKKyAgICAgIH0KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICAgIltBREpVU1RdIHRzICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBkdXIgJSIgR1NUX1RJTUVfRk9STUFUICIsIGVuZCAlIgorICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikpLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikpLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpICsKKyAgICAgICAgICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSkpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSA9CisgICAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGZpZWxkMS0+ZnJhbWUtPmJ1ZmZlcik7CisgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0KKyAgICAgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChmaWVsZDEtPmZyYW1lLT5idWZmZXIpOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIHdlIG5lZWQgdG8gZHJvcCB0aGUgZnJhbWUgYmVjYXVzZSBvZiBRb1MgKi8KKyAgICBpZiAoIWdzdF9kZWludGVybGFjZV9kb19xb3MgKHNlbGYsIGJ1ZikpIHsKKyAgICAgIHNlbGYtPmN1cl9maWVsZF9pZHgtLTsKKyAgICAgIGdzdF92aWRlb19mcmFtZV91bm1hcF9hbmRfZnJlZSAoZ3N0X2RlaW50ZXJsYWNlX3BvcF9oaXN0b3J5IChzZWxmKSk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWYpOworICAgICAgb3V0YnVmID0gTlVMTDsKKyAgICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIH0gZWxzZSB7CisgICAgICAvKiBtYXAgdGhlIGZyYW1lIHNvIHRoZSBkZWludGVybGFjZSBtZXRob2RzIGNhbiB3cml0ZSB0aGUgZGF0YSB0byB0aGUKKyAgICAgICAqIGNvcnJlY3QgbWVtb3J5IGxvY2F0aW9ucyAqLworICAgICAgb3V0ZnJhbWUgPQorICAgICAgICAgIGdzdF92aWRlb19mcmFtZV9uZXdfYW5kX21hcCAoJnNlbGYtPnZpbmZvLCBvdXRidWYsIEdTVF9NQVBfV1JJVEUpOworCisgICAgICAvKiBkbyBtYWdpYyBjYWxjdWx1cyAqLworICAgICAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZSAoc2VsZi0+bWV0aG9kLAorICAgICAgICAgIHNlbGYtPmZpZWxkX2hpc3RvcnksIHNlbGYtPmhpc3RvcnlfY291bnQsIG91dGZyYW1lLAorICAgICAgICAgIHNlbGYtPmN1cl9maWVsZF9pZHgpOworCisgICAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXBfYW5kX2ZyZWUgKG91dGZyYW1lKTsKKworICAgICAgc2VsZi0+Y3VyX2ZpZWxkX2lkeC0tOworICAgICAgLyogbmVlZCB0byByZW1vdmUgdGhlIGZpZWxkIGluIHRoZSB0ZWxlY2luZSB3ZWF2aW5nIGNhc2UgKi8KKyAgICAgIGlmICgoSVNfVEVMRUNJTkUgKGludGVybGFjaW5nX21vZGUpCisgICAgICAgICAgICAgICYmIHNlbGYtPm1ldGhvZF9pZCA9PSBHU1RfREVJTlRFUkxBQ0VfV0VBVkUpCisgICAgICAgICAgfHwgc2VsZi0+Y3VyX2ZpZWxkX2lkeCArIDEgKworICAgICAgICAgIGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X2xhdGVuY3kgKHNlbGYtPm1ldGhvZCkgPAorICAgICAgICAgIHNlbGYtPmhpc3RvcnlfY291bnQpIHsKKyAgICAgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwX2FuZF9mcmVlIChnc3RfZGVpbnRlcmxhY2VfcG9wX2hpc3RvcnkgKHNlbGYpKTsKKyAgICAgIH0KKworICAgICAgaWYgKGdzdF9kZWludGVybGFjZV9jbGlwX2J1ZmZlciAoc2VsZiwgb3V0YnVmKSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgICAgICAgIltPVVRdIHRzICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBkdXIgJSIgR1NUX1RJTUVfRk9STUFUICIsIGVuZCAlIgorICAgICAgICAgICAgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSksCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpKSwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpICsKKyAgICAgICAgICAgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpKSk7CisgICAgICAgIHJldCA9IGdzdF9wYWRfcHVzaCAoc2VsZi0+c3JjcGFkLCBvdXRidWYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1Zik7CisgICAgICB9CisKKyAgICAgIG91dGJ1ZiA9IE5VTEw7CisgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICByZXR1cm4gcmV0OworICAgICAgaWYgKElTX1RFTEVDSU5FIChpbnRlcmxhY2luZ19tb2RlKQorICAgICAgICAgICYmIHNlbGYtPm1ldGhvZF9pZCA9PSBHU1RfREVJTlRFUkxBQ0VfV0VBVkUpIHsKKyAgICAgICAgLyogcG9wIG9mZiB0aGUgc2Vjb25kIGZpZWxkICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJSZW1vdmluZyB1bnVzZWQgZmllbGQgKGNvdW50OiAlZCkiLAorICAgICAgICAgICAgc2VsZi0+aGlzdG9yeV9jb3VudCk7CisgICAgICAgIHNlbGYtPmN1cl9maWVsZF9pZHgtLTsKKyAgICAgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwX2FuZF9mcmVlIChnc3RfZGVpbnRlcmxhY2VfcG9wX2hpc3RvcnkgKHNlbGYpKTsKKyAgICAgICAgaW50ZXJsYWNpbmdfbW9kZSA9IEdTVF9WSURFT19JTlRFUkxBQ0VfTU9ERV9JTlRFUkxFQVZFRDsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmx1c2hfb25lICYmICFzZWxmLT5kcm9wX29ycGhhbnMpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJPcnBoYW4gZmllbGQgZGVpbnRlcmxhY2VkIC0gcmVjb25maWd1cmluZyIpOworICAgICAgZ290byByZXN0YXJ0OworICAgIH0KKyAgfQorICAvKiBubyBjYWxjdWxhdGlvbiBkb25lOiByZW1vdmUgZXhjZXNzIGZpZWxkICovCisgIGVsc2UgaWYgKHNlbGYtPmZpZWxkX2hpc3Rvcnlbc2VsZi0+Y3VyX2ZpZWxkX2lkeF0uZmxhZ3MgPT0KKyAgICAgIFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00gJiYgKHNlbGYtPmZpZWxkcyA9PSBHU1RfREVJTlRFUkxBQ0VfVEYKKyAgICAgICAgICAmJiAhSVNfVEVMRUNJTkUgKGludGVybGFjaW5nX21vZGUpKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJSZW1vdmluZyB1bnVzZWQgYm90dG9tIGZpZWxkIik7CisgICAgc2VsZi0+Y3VyX2ZpZWxkX2lkeC0tOworICAgIGdzdF92aWRlb19mcmFtZV91bm1hcF9hbmRfZnJlZSAoZ3N0X2RlaW50ZXJsYWNlX3BvcF9oaXN0b3J5IChzZWxmKSk7CisKKyAgICBpZiAoZmx1c2hfb25lICYmICFzZWxmLT5kcm9wX29ycGhhbnMpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJPcnBoYW4gZmllbGQgZGVpbnRlcmxhY2VkIC0gcmVjb25maWd1cmluZyIpOworICAgICAgZ290byByZXN0YXJ0OworICAgIH0KKyAgfQorCisgIHJldHVybiByZXQ7CisKK25lZWRfbW9yZToKKyAgeworICAgIHNlbGYtPm5lZWRfbW9yZSA9IFRSVUU7CisgICAgcmV0dXJuIHJldDsKKyAgfQorbm9fYnVmZmVyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXIiKTsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RlaW50ZXJsYWNlX2dldF9sYXRlbmN5IChHc3REZWludGVybGFjZSAqIHNlbGYpCit7CisgIGlmIChzZWxmLT5sb2NraW5nID09IEdTVF9ERUlOVEVSTEFDRV9MT0NLSU5HX0FVVE8pIHsKKyAgICBHc3RRdWVyeSAqcXVlcnk7CisKKyAgICBxdWVyeSA9IGdzdF9xdWVyeV9uZXdfbGF0ZW5jeSAoKTsKKyAgICBpZiAoKGdzdF9wYWRfcGVlcl9xdWVyeSAoc2VsZi0+c2lua3BhZCwgcXVlcnkpKSkgeworICAgICAgZ2Jvb2xlYW4gaXNfbGl2ZTsKKyAgICAgIC8qIGlmIHVwc3RyZWFtIGlzIGxpdmUsIHdlIHVzZSBsb3ctbGF0ZW5jeSBwYXNzaXZlIGxvY2tpbmcgbW9kZQorICAgICAgICogZWxzZSBoaWdoLWxhdGVuY3kgYWN0aXZlIGxvY2tpbmcgbW9kZSAqLworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2xhdGVuY3kgKHF1ZXJ5LCAmaXNfbGl2ZSwgTlVMTCwgTlVMTCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiTGF0ZW5jeSBxdWVyeSBpbmRpY2F0ZXMgc3RyZWFtIGlzICVzIiwKKyAgICAgICAgICBpc19saXZlID8gImxpdmUgLSB1c2luZyBwYXNzaXZlIGxvY2tpbmciIDoKKyAgICAgICAgICAibm90IGxpdmUgLSB1c2luZyBhY3RpdmUgbG9ja2luZyIpOworICAgICAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisgICAgICByZXR1cm4gaXNfbGl2ZTsKKyAgICB9IGVsc2UgeworICAgICAgLyogY29uc2VydmF0aXZlbHkgdXNlIHBhc3NpdmUgbG9ja2luZyBpZiB0aGUgcXVlcnkgZmFpbHMgKi8KKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2VsZiwKKyAgICAgICAgICAiTGF0ZW5jeSBxdWVyeSBmYWlsZWQgLSBmYWxsIGJhY2sgdG8gdXNpbmcgcGFzc2l2ZSBsb2NraW5nIik7CisgICAgICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gc2VsZi0+bG9ja2luZyAtIDI7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9kZWludGVybGFjZV9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0RGVpbnRlcmxhY2UgKnNlbGYgPSBHU1RfREVJTlRFUkxBQ0UgKHBhcmVudCk7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzZWxmKTsKKyAgaWYgKHNlbGYtPnJlY29uZmlndXJlIHx8IGdzdF9wYWRfY2hlY2tfcmVjb25maWd1cmUgKHNlbGYtPnNyY3BhZCkpIHsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgaWYgKChnaW50KSBzZWxmLT5uZXdfZmllbGRzICE9IC0xKQorICAgICAgc2VsZi0+dXNlcl9zZXRfZmllbGRzID0gc2VsZi0+bmV3X2ZpZWxkczsKKyAgICBpZiAoKGdpbnQpIHNlbGYtPm5ld19tb2RlICE9IC0xKQorICAgICAgc2VsZi0+bW9kZSA9IHNlbGYtPm5ld19tb2RlOworICAgIHNlbGYtPm5ld19tb2RlID0gLTE7CisgICAgc2VsZi0+bmV3X2ZpZWxkcyA9IC0xOworCisgICAgc2VsZi0+cmVjb25maWd1cmUgPSBGQUxTRTsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7CisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoc2VsZi0+c2lua3BhZCk7CisgICAgaWYgKGNhcHMgIT0gTlVMTCkgeworICAgICAgaWYgKCFnc3RfZGVpbnRlcmxhY2Vfc2V0Y2FwcyAoc2VsZiwgc2VsZi0+c2lua3BhZCwgY2FwcykpIHsKKyAgICAgICAgZ3N0X3BhZF9tYXJrX3JlY29uZmlndXJlIChzZWxmLT5zcmNwYWQpOworICAgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICAgIGlmIChHU1RfUEFEX0lTX0ZMVVNISU5HIChzZWxmLT5zcmNwYWQpKQorICAgICAgICAgIHJldHVybiBHU1RfRkxPV19GTFVTSElORzsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICAgIH0KKyAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICB9IGVsc2UgeworICAgICAgZ3N0X3BhZF9tYXJrX3JlY29uZmlndXJlIChzZWxmLT5zcmNwYWQpOworICAgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgIltJTl0gdHMgJSIgR1NUX1RJTUVfRk9STUFUICIsIGR1ciAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZW5kICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikgKyBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpKSk7CisKKyAgaWYgKHNlbGYtPnN0aWxsX2ZyYW1lX21vZGUgfHwgc2VsZi0+cGFzc3Rocm91Z2gpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgICAiRnJhbWUgdHlwZTogUHJvZ3Jlc3NpdmU/OyBwdXNoaW5nIGJ1ZmZlciB1c2luZyBwYXNzLXRocm91Z2giKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgICAiW09VVF0gdHMgJSIgR1NUX1RJTUVfRk9STUFUICIsIGR1ciAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZW5kICUiCisgICAgICAgIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikpLAorICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikgKyBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpKSk7CisKKyAgICByZXR1cm4gZ3N0X3BhZF9wdXNoIChzZWxmLT5zcmNwYWQsIGJ1Zik7CisgIH0KKworICBpZiAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiRElTQ09OVCBidWZmZXIsIHJlc2V0dGluZyBoaXN0b3J5Iik7CisgICAgZ3N0X2RlaW50ZXJsYWNlX3Jlc2V0X2hpc3RvcnkgKHNlbGYsIEZBTFNFKTsKKyAgICBzZWxmLT5kaXNjb250ID0gVFJVRTsKKyAgfQorCisgIGdzdF9kZWludGVybGFjZV9wdXNoX2hpc3RvcnkgKHNlbGYsIGJ1Zik7CisgIGJ1ZiA9IE5VTEw7CisKKyAgZG8geworICAgIHJldCA9IGdzdF9kZWludGVybGFjZV9vdXRwdXRfZnJhbWUgKHNlbGYsIEZBTFNFKTsKKyAgfSB3aGlsZSAoIXNlbGYtPm5lZWRfbW9yZSAmJiBzZWxmLT5oaXN0b3J5X2NvdW50ID4gMCAmJiByZXQgPT0gR1NUX0ZMT1dfT0spOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RlaW50ZXJsYWNlX2FjY2VwdGNhcHMgKEdzdERlaW50ZXJsYWNlICogc2VsZiwgR3N0UGFkICogcGFkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2Jvb2xlYW4gcmV0OworICBHc3RDYXBzICpvdXJjYXBzOworCisgIC8qIEluIEFVVE8vRElTQUJMRUQgbW9kZSB3ZSBhY2NlcHQgZXZlcnl0aGluZyB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aAorICAgKiBvdXIgdGVtcGxhdGUgY2Fwcy4gSW4gSU5URVJMQUNFRCBtb2RlIHdlIGZvcmNlIGRlaW50ZXJsYWNpbmcsIG1lYW5pbmcKKyAgICogd2UgY2FuIG9ubHkgcG9zc2libHkgc3VwcG9ydCB0aGUgZGVpbnRlcmxhY2UgY2Fwcy4KKyAgICogSW4gQVVUT19TVFJJQ1QgbW9kZSB3ZSBhY2NlcHQgYWxsIHByb2dyZXNzaXZlIGZvcm1hdHMsIGJ1dCBvbmx5IHRob3NlCisgICAqIGludGVybGFjZWQgZm9ybWF0IHRoYXQgd2UgY2FuIGFjdHVhbGx5IGRlaW50ZXJsYWNlICovCisgIGlmIChzZWxmLT5tb2RlID09IEdTVF9ERUlOVEVSTEFDRV9NT0RFX0RJU0FCTEVECisgICAgICB8fCBzZWxmLT5tb2RlID09IEdTVF9ERUlOVEVSTEFDRV9NT0RFX0FVVE8pIHsKKyAgICBvdXJjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisgICAgcmV0ID0gZ3N0X2NhcHNfaXNfc3Vic2V0IChjYXBzLCBvdXJjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAob3VyY2Fwcyk7CisgIH0gZWxzZSBpZiAoc2VsZi0+bW9kZSA9PSBHU1RfREVJTlRFUkxBQ0VfTU9ERV9JTlRFUkxBQ0VEKSB7CisgICAgb3VyY2FwcyA9IGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZkZWludGVybGFjZV9jYXBzKTsKKyAgICByZXQgPSBnc3RfY2Fwc19pc19zdWJzZXQgKGNhcHMsIG91cmNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChvdXJjYXBzKTsKKyAgfSBlbHNlIGlmIChzZWxmLT5tb2RlID09IEdTVF9ERUlOVEVSTEFDRV9NT0RFX0FVVE9fU1RSSUNUKSB7CisgICAgb3VyY2FwcyA9IGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZwcm9ncmVzc2l2ZV9jYXBzKTsKKyAgICByZXQgPSBnc3RfY2Fwc19pc19zdWJzZXQgKGNhcHMsIG91cmNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChvdXJjYXBzKTsKKworICAgIGlmICghcmV0KSB7CisgICAgICBvdXJjYXBzID0gZ3N0X3N0YXRpY19jYXBzX2dldCAoJmRlaW50ZXJsYWNlX2NhcHMpOworICAgICAgcmV0ID0gZ3N0X2NhcHNfaXNfc3Vic2V0IChjYXBzLCBvdXJjYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChvdXJjYXBzKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJhY2NlcHQtY2FwcyByZXN1bHQ6JWQgZm9yIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICByZXQsIGNhcHMpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RlaW50ZXJsYWNlX2ZyYWN0aW9uX2RvdWJsZSAoZ2ludCAqIG5fb3V0LCBnaW50ICogZF9vdXQsIGdib29sZWFuIGhhbGYpCit7CisgIGdpbnQgbiwgZCwgZ2NkOworCisgIG4gPSAqbl9vdXQ7CisgIGQgPSAqZF9vdXQ7CisKKyAgaWYgKGQgPT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKG4gPT0gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICBnY2QgPSBnc3RfdXRpbF9ncmVhdGVzdF9jb21tb25fZGl2aXNvciAobiwgZCk7CisgIG4gLz0gZ2NkOworICBkIC89IGdjZDsKKworICBpZiAoaGFsZikgeworICAgIGlmIChHX01BWElOVCAvIDIgPj0gQUJTIChkKSkgeworICAgICAgZCAqPSAyOworICAgIH0gZWxzZSBpZiAobiA+PSAyICYmIG4gIT0gR19NQVhJTlQpIHsKKyAgICAgIG4gLz0gMjsKKyAgICB9IGVsc2UgeworICAgICAgZCA9IEdfTUFYSU5UOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoR19NQVhJTlQgLyAyID49IEFCUyAobikpIHsKKyAgICAgIG4gKj0gMjsKKyAgICB9IGVsc2UgaWYgKGQgPj0gMiAmJiBkICE9IEdfTUFYSU5UKSB7CisgICAgICBkIC89IDI7CisgICAgfSBlbHNlIHsKKyAgICAgIG4gPSBHX01BWElOVDsKKyAgICB9CisgIH0KKworICAqbl9vdXQgPSBuOworICAqZF9vdXQgPSBkOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfZGVpbnRlcmxhY2VfY2Fwc19kb3VibGVfZnJhbWVyYXRlIChHc3RDYXBzICogY2FwcywgZ2Jvb2xlYW4gaGFsZikKK3sKKyAgZ3VpbnQgbGVuOworCisgIGZvciAobGVuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOyBsZW4gPiAwOyBsZW4tLSkgeworICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIGxlbiAtIDEpOworICAgIGNvbnN0IEdWYWx1ZSAqdmFsOworCisgICAgdmFsID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJmcmFtZXJhdGUiKTsKKyAgICBpZiAoIXZhbCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKEdfVkFMVUVfVFlQRSAodmFsKSA9PSBHU1RfVFlQRV9GUkFDVElPTikgeworICAgICAgZ2ludCBuLCBkOworCisgICAgICBuID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9udW1lcmF0b3IgKHZhbCk7CisgICAgICBkID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9kZW5vbWluYXRvciAodmFsKTsKKworICAgICAgaWYgKCFnc3RfZGVpbnRlcmxhY2VfZnJhY3Rpb25fZG91YmxlICgmbiwgJmQsIGhhbGYpKSB7CisgICAgICAgIGdzdF9jYXBzX3JlbW92ZV9zdHJ1Y3R1cmUgKGNhcHMsIGxlbiAtIDEpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwgbiwgZCwgTlVMTCk7CisgICAgfSBlbHNlIGlmIChHX1ZBTFVFX1RZUEUgKHZhbCkgPT0gR1NUX1RZUEVfRlJBQ1RJT05fUkFOR0UpIHsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqbWluLCAqbWF4OworICAgICAgR1ZhbHVlIG5yYW5nZSA9IHsgMCwgfSwgbm1pbiA9IHsKKyAgICAgIDAsfSwgbm1heCA9IHsKKyAgICAgIDAsfTsKKyAgICAgIGdpbnQgbiwgZDsKKworICAgICAgZ192YWx1ZV9pbml0ICgmbnJhbmdlLCBHU1RfVFlQRV9GUkFDVElPTl9SQU5HRSk7CisgICAgICBnX3ZhbHVlX2luaXQgKCZubWluLCBHU1RfVFlQRV9GUkFDVElPTik7CisgICAgICBnX3ZhbHVlX2luaXQgKCZubWF4LCBHU1RfVFlQRV9GUkFDVElPTik7CisKKyAgICAgIG1pbiA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fcmFuZ2VfbWluICh2YWwpOworICAgICAgbWF4ID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9yYW5nZV9tYXggKHZhbCk7CisKKyAgICAgIG4gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAobWluKTsKKyAgICAgIGQgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yIChtaW4pOworCisgICAgICBpZiAoIWdzdF9kZWludGVybGFjZV9mcmFjdGlvbl9kb3VibGUgKCZuLCAmZCwgaGFsZikpIHsKKyAgICAgICAgZ192YWx1ZV91bnNldCAoJm5yYW5nZSk7CisgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZubWF4KTsKKyAgICAgICAgZ192YWx1ZV91bnNldCAoJm5taW4pOworICAgICAgICBnc3RfY2Fwc19yZW1vdmVfc3RydWN0dXJlIChjYXBzLCBsZW4gLSAxKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGdzdF92YWx1ZV9zZXRfZnJhY3Rpb24gKCZubWluLCBuLCBkKTsKKworICAgICAgbiA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fbnVtZXJhdG9yIChtYXgpOworICAgICAgZCA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fZGVub21pbmF0b3IgKG1heCk7CisKKyAgICAgIGlmICghZ3N0X2RlaW50ZXJsYWNlX2ZyYWN0aW9uX2RvdWJsZSAoJm4sICZkLCBoYWxmKSkgeworICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmbnJhbmdlKTsKKyAgICAgICAgZ192YWx1ZV91bnNldCAoJm5tYXgpOworICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmbm1pbik7CisgICAgICAgIGdzdF9jYXBzX3JlbW92ZV9zdHJ1Y3R1cmUgKGNhcHMsIGxlbiAtIDEpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgZ3N0X3ZhbHVlX3NldF9mcmFjdGlvbiAoJm5tYXgsIG4sIGQpOworICAgICAgZ3N0X3ZhbHVlX3NldF9mcmFjdGlvbl9yYW5nZSAoJm5yYW5nZSwgJm5taW4sICZubWF4KTsKKworICAgICAgZ3N0X3N0cnVjdHVyZV90YWtlX3ZhbHVlIChzLCAiZnJhbWVyYXRlIiwgJm5yYW5nZSk7CisKKyAgICAgIGdfdmFsdWVfdW5zZXQgKCZubWluKTsKKyAgICAgIGdfdmFsdWVfdW5zZXQgKCZubWF4KTsKKyAgICB9IGVsc2UgaWYgKEdfVkFMVUVfVFlQRSAodmFsKSA9PSBHU1RfVFlQRV9MSVNUKSB7CisgICAgICBjb25zdCBHVmFsdWUgKmx2YWw7CisgICAgICBHVmFsdWUgbmxpc3QgPSB7IDAsIH07CisgICAgICBHVmFsdWUgbnZhbCA9IHsgMCwgfTsKKyAgICAgIGdpbnQgaTsKKworICAgICAgZ192YWx1ZV9pbml0ICgmbmxpc3QsIEdTVF9UWVBFX0xJU1QpOworICAgICAgZm9yIChpID0gZ3N0X3ZhbHVlX2xpc3RfZ2V0X3NpemUgKHZhbCk7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgZ2ludCBuLCBkOworCisgICAgICAgIGx2YWwgPSBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKHZhbCwgaSAtIDEpOworCisgICAgICAgIGlmIChHX1ZBTFVFX1RZUEUgKGx2YWwpICE9IEdTVF9UWVBFX0ZSQUNUSU9OKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIG4gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAobHZhbCk7CisgICAgICAgIGQgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yIChsdmFsKTsKKworICAgICAgICAvKiBEb3VibGUvSGFsZiB0aGUgZnJhbWVyYXRlIGJ1dCBpZiB0aGlzIGZhaWxzIHNpbXBseQorICAgICAgICAgKiBza2lwIHRoaXMgdmFsdWUgZnJvbSB0aGUgbGlzdCAqLworICAgICAgICBpZiAoIWdzdF9kZWludGVybGFjZV9mcmFjdGlvbl9kb3VibGUgKCZuLCAmZCwgaGFsZikpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGdfdmFsdWVfaW5pdCAoJm52YWwsIEdTVF9UWVBFX0ZSQUNUSU9OKTsKKworICAgICAgICBnc3RfdmFsdWVfc2V0X2ZyYWN0aW9uICgmbnZhbCwgbiwgZCk7CisgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF9hbmRfdGFrZV92YWx1ZSAoJm5saXN0LCAmbnZhbCk7CisgICAgICB9CisgICAgICBnc3Rfc3RydWN0dXJlX3Rha2VfdmFsdWUgKHMsICJmcmFtZXJhdGUiLCAmbmxpc3QpOworICAgIH0KKyAgfQorCisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfZGVpbnRlcmxhY2VfZ2V0Y2FwcyAoR3N0RGVpbnRlcmxhY2UgKiBzZWxmLCBHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnJldCwgKmNhcHM7CisgIEdzdFBhZCAqb3RoZXJwYWQ7CisgIGdpbnQgbGVuOworICBHc3RDYXBzICpvdXJjYXBzOworICBHc3RDYXBzICpwZWVyY2FwczsKKyAgR3N0Q2FwcyAqdG1wLCAqdG1wMjsKKworICBvdGhlcnBhZCA9IChwYWQgPT0gc2VsZi0+c3JjcGFkKSA/IHNlbGYtPnNpbmtwYWQgOiBzZWxmLT5zcmNwYWQ7CisKKyAgb3VyY2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChwYWQpOworICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChvdGhlcnBhZCwgTlVMTCk7CisKKyAgLyogRmlsdGVyIGFueSBwZWVyY2FwcyB0aGF0IGFyZSBhdmFpbGFibGUgd2l0aCBvdXIgdGVtcGxhdGUKKyAgICogdG8gZ2V0IHN0YXJ0ZWQgd2l0aCB0aGUgc3Vic2V0IG9mIGNhcHMgd2UgYWN0dWFsbHkgc3VwcG9ydCAqLworICBpZiAocGVlcmNhcHMpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJQZWVyIGhhcyBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBwZWVyY2Fwcyk7CisgICAgY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGdzdF9jYXBzX2ludGVyc2VjdCAob3VyY2FwcywgcGVlcmNhcHMpKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChvdXJjYXBzKTsKKyAgICBwZWVyY2FwcyA9IG91cmNhcHMgPSBOVUxMOworICB9IGVsc2UgeworICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChvdXJjYXBzKTsKKyAgICBvdXJjYXBzID0gTlVMTDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwKKyAgICAgICJUcmFuc2Zvcm1pbmcgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCAiIHdpdGggZmlsdGVyICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgY2FwcywgZmlsdGVyKTsKKworICAvKiBJZiBkZWludGVybGFjaW5nIGlzIGRpc2FibGVkLCB3ZSBqdXN0IHBhc3N0aHJvdWdoIHRoZQorICAgKiBjYXBzIGFuZCBldmVyeXRoaW5nICovCisgIGlmIChzZWxmLT5tb2RlID09IEdTVF9ERUlOVEVSTEFDRV9NT0RFX0RJU0FCTEVEKSB7CisgICAgcmV0ID0gY2FwczsKKyAgICBjYXBzID0gTlVMTDsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiBJZiBkZWludGVybGFjaW5nIGlzIGVuZm9yY2VkLCB3ZSBjYW4gb25seSBhY2NlcHQgdGhlCisgICAqIGNhcHMgZm9yIHdoaWNoIHdlIGNhbiBhY3R1YWxseSBkbyBkZWludGVybGFjaW5nICovCisgIGlmIChzZWxmLT5tb2RlID09IEdTVF9ERUlOVEVSTEFDRV9NT0RFX0lOVEVSTEFDRUQpIHsKKyAgICB0bXAgPSBnc3Rfc3RhdGljX2NhcHNfZ2V0ICgmZGVpbnRlcmxhY2VfY2Fwcyk7CisgICAgcmV0ID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGNhcHMsIHRtcCwgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICB0bXAgPSBOVUxMOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICBjYXBzID0gTlVMTDsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBnX2Fzc2VydCAoc2VsZi0+bW9kZSA9PSBHU1RfREVJTlRFUkxBQ0VfTU9ERV9BVVRPCisgICAgICB8fCBzZWxmLT5tb2RlID09IEdTVF9ERUlOVEVSTEFDRV9NT0RFX0FVVE9fU1RSSUNUKTsKKworICAvKiBGb3IgdGhlIGF1dG8gbW9kZSB3ZSBoYXZlIHRvIGRvIGEgYml0IG1vcmUgdGhhbiB0aGF0ICovCisgIHJldCA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKworICAvKiBXZSBjYW4gYWNjZXB0IGFueSBzdHJ1Y3R1cmUgaWYKKyAgICogLSB0aGV5IGFyZSBwcm9ncmVzc2l2ZSBhbHJlYWR5CisgICAqCisgICAqLworICB0bXAgPSBnc3Rfc3RhdGljX2NhcHNfZ2V0ICgmcHJvZ3Jlc3NpdmVfY2Fwcyk7CisgIHRtcDIgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoY2FwcywgdG1wLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgdG1wID0gTlVMTDsKKyAgcmV0ID0gZ3N0X2NhcHNfbWVyZ2UgKHJldCwgdG1wMik7CisgIHRtcDIgPSBOVUxMOworCisgIC8qIG9yCisgICAqIC0gdGhleSBoYXZlIHN5c21lbSBjYXBzIGZlYXR1cmVzIGFuZCBhIGZvcm1hdCBmb3Igd2hpY2ggd2Ugc3VwcG9ydAorICAgKiAgIGRlaW50ZXJsYWNpbmcKKyAgICogb3IKKyAgICogLSB0aGV5IGhhdmUgQU5ZIGNhcHMgZmVhdHVyZXMsIGluIHdoaWNoIGNhc2Ugd2Ugc3VwcG9ydCBpdCBmb3IKKyAgICogICBzeXNtZW0gY2FwcyBmZWF0dXJlcyBmb3IgZm9ybWF0cyB3ZSBzdXBwb3J0CisgICAqCisgICAqIE5PVEU6IFRoZXNlIGFyZSB0aGUgY2FwcyB3aGVyZSB3ZSBhY3R1YWxseSB3b3VsZCBkbyBkZWludGVybGFjaW5nCisgICAqIG91cnNlbHZlcy4gSWYgZmllbGRzID09IEFMTCB3ZSB3b3VsZCBkb3VibGUgdGhlIGZyYW1lcmF0ZSBzbyB3b3VsZAorICAgKiBoYXZlIHRvIGhhbGYgdGhlIGZyYW1lcmF0ZSBjb25zdHJhaW50cyBmcm9tIGRvd25zdHJlYW0gaGVyZQorICAgKi8KKyAgdG1wID0gZ3N0X3N0YXRpY19jYXBzX2dldCAoJmRlaW50ZXJsYWNlX2NhcHMpOworICB0bXAyID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGNhcHMsIHRtcCwgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHRtcCk7CisgIHRtcCA9IE5VTEw7CisKKyAgZm9yIChsZW4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAodG1wMik7IGxlbiA+IDA7IGxlbi0tKSB7CisgICAgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAodG1wMiwgbGVuIC0gMSk7CisKKyAgICBpZiAocGFkID09IHNlbGYtPnNpbmtwYWQpCisgICAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAocywgImludGVybGFjZS1tb2RlIik7CisgICAgZWxzZQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJpbnRlcmxhY2UtbW9kZSIsIEdfVFlQRV9TVFJJTkcsICJwcm9ncmVzc2l2ZSIsCisgICAgICAgICAgTlVMTCk7CisgIH0KKworICBpZiAoc2VsZi0+dXNlcl9zZXRfZmllbGRzID09IEdTVF9ERUlOVEVSTEFDRV9BTEwpIHsKKyAgICB0bXAyID0gZ3N0X2RlaW50ZXJsYWNlX2NhcHNfZG91YmxlX2ZyYW1lcmF0ZSAodG1wMiwgKHBhZCA9PSBzZWxmLT5zaW5rcGFkKSk7CisgIH0KKyAgaWYgKHNlbGYtPnVzZXJfc2V0X2ZpZWxkcyA9PSBHU1RfREVJTlRFUkxBQ0VfRklFTERTX0FVVE8pIHsKKyAgICB0bXAgPSBnc3RfY2Fwc19jb3B5ICh0bXAyKTsKKyAgICB0bXAgPSBnc3RfZGVpbnRlcmxhY2VfY2Fwc19kb3VibGVfZnJhbWVyYXRlICh0bXAsIChwYWQgPT0gc2VsZi0+c2lua3BhZCkpOworICB9CisKKyAgcmV0ID0gZ3N0X2NhcHNfbWVyZ2UgKHJldCwgdG1wMik7CisgIHRtcDIgPSBOVUxMOworICBpZiAodG1wICE9IE5VTEwpIHsKKyAgICByZXQgPSBnc3RfY2Fwc19tZXJnZSAocmV0LCB0bXApOworICAgIHRtcCA9IE5VTEw7CisgIH0KKworICAvKiBvcgorICAgKiAtIGFueXRoaW5nIGVsc2UgaW4gd2hpY2ggY2FzZSB3ZSB3b3VsZCBqdXN0IHBhc3N0aHJvdWdoIGFnYWluIGlmIHdlJ3JlCisgICAqICAgb25seSBpbiBBVVRPIGFuZCBub3QgQVVUT19TVFJJQ1QgbW9kZQorICAgKi8KKyAgaWYgKHNlbGYtPm1vZGUgPT0gR1NUX0RFSU5URVJMQUNFX01PREVfQVVUTykKKyAgICByZXQgPSBnc3RfY2Fwc19tZXJnZSAocmV0LCBnc3RfY2Fwc19jb3B5IChjYXBzKSk7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBjYXBzID0gTlVMTDsKKworZG9uZToKKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqdG1wOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgImludGVyc2VjdGluZyB3aXRoICUiIEdTVF9QVFJfRk9STUFULCBmaWx0ZXIpOworICAgIHRtcCA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHJldCwgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmV0KTsKKyAgICByZXQgPSB0bXA7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJSZXR1cm5pbmcgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKworICByZXR1cm4gcmV0OworfQorCisvKiB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIHBvb2wsIGFsbG9jYXRvciBhbmQgcXVlcnkgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RlaW50ZXJsYWNlX3NldF9hbGxvY2F0aW9uIChHc3REZWludGVybGFjZSAqIHNlbGYsCisgICAgR3N0QnVmZmVyUG9vbCAqIHBvb2wsIEdzdEFsbG9jYXRvciAqIGFsbG9jYXRvciwKKyAgICBHc3RBbGxvY2F0aW9uUGFyYW1zICogcGFyYW1zKQoreworICBHc3RBbGxvY2F0b3IgKm9sZGFsbG9jOworICBHc3RCdWZmZXJQb29sICpvbGRwb29sOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZik7CisgIG9sZHBvb2wgPSBzZWxmLT5wb29sOworICBzZWxmLT5wb29sID0gcG9vbDsKKworICBvbGRhbGxvYyA9IHNlbGYtPmFsbG9jYXRvcjsKKyAgc2VsZi0+YWxsb2NhdG9yID0gYWxsb2NhdG9yOworCisgIGlmIChwYXJhbXMpCisgICAgc2VsZi0+cGFyYW1zID0gKnBhcmFtczsKKyAgZWxzZQorICAgIGdzdF9hbGxvY2F0aW9uX3BhcmFtc19pbml0ICgmc2VsZi0+cGFyYW1zKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNlbGYpOworCisgIGlmIChvbGRwb29sKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImRlYWN0aXZhdGluZyBvbGQgcG9vbCAlcCIsIG9sZHBvb2wpOworICAgIGdzdF9idWZmZXJfcG9vbF9zZXRfYWN0aXZlIChvbGRwb29sLCBGQUxTRSk7CisgICAgZ3N0X29iamVjdF91bnJlZiAob2xkcG9vbCk7CisgIH0KKyAgaWYgKG9sZGFsbG9jKSB7CisgICAgZ3N0X29iamVjdF91bnJlZiAob2xkYWxsb2MpOworICB9CisgIGlmIChwb29sKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImFjdGl2YXRpbmcgbmV3IHBvb2wgJXAiLCBwb29sKTsKKyAgICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAocG9vbCwgVFJVRSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RlaW50ZXJsYWNlX2RvX2J1ZmZlcnBvb2wgKEdzdERlaW50ZXJsYWNlICogc2VsZiwgR3N0Q2FwcyAqIG91dGNhcHMpCit7CisgIEdzdFF1ZXJ5ICpxdWVyeTsKKyAgZ2Jvb2xlYW4gcmVzdWx0ID0gVFJVRTsKKyAgR3N0QnVmZmVyUG9vbCAqcG9vbDsKKyAgR3N0QWxsb2NhdG9yICphbGxvY2F0b3I7CisgIEdzdEFsbG9jYXRpb25QYXJhbXMgcGFyYW1zOworICBHc3RTdHJ1Y3R1cmUgKmNvbmZpZzsKKyAgZ3VpbnQgc2l6ZSwgbWluLCBtYXg7CisKKyAgaWYgKHNlbGYtPnBhc3N0aHJvdWdoKSB7CisgICAgLyogd2UgYXJlIGluIHBhc3N0aHJvdWdoLCB0aGUgaW5wdXQgYnVmZmVyIGlzIG5ldmVyIGNvcGllZCBhbmQgYWx3YXlzIHBhc3NlZAorICAgICAqIGFsb25nLiBXZSBuZXZlciBhbGxvY2F0ZSBhbiBvdXRwdXQgYnVmZmVyIG9uIHRoZSBzcmNwYWQuIFdoYXQgd2UgZG8gaXMKKyAgICAgKiBsZXQgdGhlIHVwc3RyZWFtIGVsZW1lbnQgZGVjaWRlIGlmIGl0IHdhbnRzIHRvIHVzZSBhIGJ1ZmZlcnBvb2wgYW5kCisgICAgICogdGhlbiB3ZSB3aWxsIHByb3h5IHRoZSBkb3duc3RyZWFtIHBvb2wgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAid2UncmUgcGFzc3Rob3VnaCwgZGVsYXkgYnVmZmVycG9vbCIpOworICAgIGdzdF9kZWludGVybGFjZV9zZXRfYWxsb2NhdGlvbiAoc2VsZiwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICAvKiBub3QgcGFzc3Rocm91Z2gsIHdlIG5lZWQgdG8gYWxsb2NhdGUgKi8KKyAgLyogZmluZCBhIHBvb2wgZm9yIHRoZSBuZWdvdGlhdGVkIGNhcHMgbm93ICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJkb2luZyBhbGxvY2F0aW9uIHF1ZXJ5Iik7CisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19hbGxvY2F0aW9uIChvdXRjYXBzLCBUUlVFKTsKKyAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnkgKHNlbGYtPnNyY3BhZCwgcXVlcnkpKSB7CisgICAgLyogbm90IGEgcHJvYmxlbSwganVzdCBkZWJ1ZyBhIGxpdHRsZSAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJwZWVyIEFMTE9DQVRJT04gcXVlcnkgZmFpbGVkIik7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiQUxMT0NBVElPTiAoJWQpIHBhcmFtczogJSIgR1NUX1BUUl9GT1JNQVQsIHJlc3VsdCwKKyAgICAgIHF1ZXJ5KTsKKworICAvKiB3ZSBnb3QgY29uZmlndXJhdGlvbiBmcm9tIG91ciBwZWVyIG9yIHRoZSBkZWNpZGVfYWxsb2NhdGlvbiBtZXRob2QsCisgICAqIHBhcnNlIHRoZW0gKi8KKyAgaWYgKGdzdF9xdWVyeV9nZXRfbl9hbGxvY2F0aW9uX3BhcmFtcyAocXVlcnkpID4gMCkgeworICAgIGdzdF9xdWVyeV9wYXJzZV9udGhfYWxsb2NhdGlvbl9wYXJhbSAocXVlcnksIDAsICZhbGxvY2F0b3IsICZwYXJhbXMpOworICB9IGVsc2UgeworICAgIGFsbG9jYXRvciA9IE5VTEw7CisgICAgZ3N0X2FsbG9jYXRpb25fcGFyYW1zX2luaXQgKCZwYXJhbXMpOworICB9CisKKyAgaWYgKGdzdF9xdWVyeV9nZXRfbl9hbGxvY2F0aW9uX3Bvb2xzIChxdWVyeSkgPiAwKQorICAgIGdzdF9xdWVyeV9wYXJzZV9udGhfYWxsb2NhdGlvbl9wb29sIChxdWVyeSwgMCwgJnBvb2wsICZzaXplLCAmbWluLCAmbWF4KTsKKyAgZWxzZSB7CisgICAgcG9vbCA9IE5VTEw7CisgICAgc2l6ZSA9IEdTVF9WSURFT19JTkZPX1NJWkUgKCZzZWxmLT52aW5mbyk7CisgICAgbWluID0KKyAgICAgICAgTUFYICgoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9nZXRfZmllbGRzX3JlcXVpcmVkIChzZWxmLT5tZXRob2QpICsKKyAgICAgICAgICAgIDEpIC8gMiArIDEsIDQpOworICAgIG1heCA9IDA7CisgIH0KKworICBpZiAocG9vbCA9PSBOVUxMKSB7CisgICAgLyogbm8gcG9vbCwgd2UgY2FuIG1ha2Ugb3VyIG93biAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJubyBwb29sLCBtYWtpbmcgbmV3IHBvb2wiKTsKKyAgICBwb29sID0gZ3N0X3ZpZGVvX2J1ZmZlcl9wb29sX25ldyAoKTsKKyAgfQorCisgIC8qIG5vdyBjb25maWd1cmUgKi8KKyAgY29uZmlnID0gZ3N0X2J1ZmZlcl9wb29sX2dldF9jb25maWcgKHBvb2wpOworICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX3NldF9wYXJhbXMgKGNvbmZpZywgb3V0Y2Fwcywgc2l6ZSwgbWluLCBtYXgpOworICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX3NldF9hbGxvY2F0b3IgKGNvbmZpZywgYWxsb2NhdG9yLCAmcGFyYW1zKTsKKyAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19hZGRfb3B0aW9uIChjb25maWcsIEdTVF9CVUZGRVJfUE9PTF9PUFRJT05fVklERU9fTUVUQSk7CisgIGdzdF9idWZmZXJfcG9vbF9zZXRfY29uZmlnIChwb29sLCBjb25maWcpOworCisgIC8qIG5vdyBzdG9yZSAqLworICByZXN1bHQgPSBnc3RfZGVpbnRlcmxhY2Vfc2V0X2FsbG9jYXRpb24gKHNlbGYsIHBvb2wsIGFsbG9jYXRvciwgJnBhcmFtcyk7CisKKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGFjZV9zZXRjYXBzIChHc3REZWludGVybGFjZSAqIHNlbGYsIEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY2NhcHMgPSBOVUxMOworICBHc3RWaWRlb0ludGVybGFjZU1vZGUgaW50ZXJsYWNpbmdfbW9kZTsKKyAgZ2ludCBmcHNfbiwgZnBzX2Q7CisgIEdzdENhcHMgKnBlZXJjYXBzLCAqY3VycmVudF9jYXBzOworCisgIGdzdF9wYWRfY2hlY2tfcmVjb25maWd1cmUgKHNlbGYtPnNyY3BhZCk7CisKKyAgaWYgKChjdXJyZW50X2NhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHBhZCkpKSB7CisgICAgaWYgKGdzdF9jYXBzX2lzX2VxdWFsIChjYXBzLCBjdXJyZW50X2NhcHMpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJHb3Qgc2FtZSBjYXBzIGFnYWluLCByZXR1cm5pbmciKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChjdXJyZW50X2NhcHMpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGdzdF9kZWludGVybGFjZV9yZXNldF9oaXN0b3J5IChzZWxmLCBGQUxTRSk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGN1cnJlbnRfY2Fwcyk7CisgIH0KKyAgcGVlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAoc2VsZi0+c3JjcGFkLCBOVUxMKTsKKworICAvKiBNYWtlIHN1cmUgdGhlIHBlZXIgY2FwcyBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZSB0ZW1wbGF0ZSBjYXBzICovCisgIGlmIChwZWVyY2FwcykgeworICAgIEdzdENhcHMgKnRtcCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChzZWxmLT5zcmNwYWQpOworICAgIEdzdENhcHMgKnRtcDIgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHBlZXJjYXBzLCB0bXApOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICBwZWVyY2FwcyA9IE5VTEw7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcCk7CisKKyAgICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKHRtcDIpKSB7CisgICAgICBnc3RfY2Fwc191bnJlZiAodG1wMik7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiUGVlciBjYXBzIG5vdCBjb21wYXRpYmxlIHdpdGggdGVtcGxhdGUgY2FwcyIpOworICAgICAgZ290byBpbnZhbGlkX2NhcHM7CisgICAgfQorICAgIHBlZXJjYXBzID0gdG1wMjsKKyAgfQorCisgIGlmIChzZWxmLT5sb2NraW5nICE9IEdTVF9ERUlOVEVSTEFDRV9MT0NLSU5HX05PTkUpIHsKKyAgICBpZiAoc2VsZi0+bG93X2xhdGVuY3kgPT0gLTEpCisgICAgICBzZWxmLT5sb3dfbGF0ZW5jeSA9IGdzdF9kZWludGVybGFjZV9nZXRfbGF0ZW5jeSAoc2VsZik7CisKKyAgICBpZiAoc2VsZi0+cGF0dGVybl9sb2NrKSB7CisgICAgICAvKiByZWZyZXNoIGhhcyBiZWVuIHN1Y2Nlc3NmdWwgLSB3ZSBoYXZlIGEgbG9jayBub3cgKi8KKyAgICAgIHNlbGYtPnBhdHRlcm5fcmVmcmVzaCA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAvKiBpZiB3ZSB3ZXJlIG5vdCByZWZyZXNoaW5nICghcGF0dGVybl9yZWZyZXNoKSB0aGUgY2FwcyBoYXZlIGNoYW5nZWQKKyAgICAgICAqIHNvIHdlIG5lZWQgdG8gcmVmcmVzaCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIGxvY2sgYW55bW9yZQorICAgICAgICogb3RoZXJ3aXNlIHdlIGhhdmUgcGF0dGVybl9mcmVzaCBhbmQgIXBhdHRlcm5fbG9jayBhbnl3YXkgKi8KKyAgICAgIHNlbGYtPnBhdHRlcm5fcmVmcmVzaCA9IFRSVUU7CisgICAgICBzZWxmLT5wYXR0ZXJuX2xvY2sgPSBGQUxTRTsKKyAgICB9CisgIH0KKworICBpZiAoIWdzdF92aWRlb19pbmZvX2Zyb21fY2FwcyAoJnNlbGYtPnZpbmZvLCBjYXBzKSkKKyAgICBnb3RvIGludmFsaWRfY2FwczsKKworICBmcHNfbiA9IEdTVF9WSURFT19JTkZPX0ZQU19OICgmc2VsZi0+dmluZm8pOworICBmcHNfZCA9IEdTVF9WSURFT19JTkZPX0ZQU19EICgmc2VsZi0+dmluZm8pOworCisgIC8qIFVwZGF0ZSBwYXNzdGhyb3VnaCBpbmZvcm1hdGlvbiAqLworICBpZiAoc2VsZi0+bW9kZSA9PSBHU1RfREVJTlRFUkxBQ0VfTU9ERV9ESVNBQkxFRCkgeworICAgIHNlbGYtPnBhc3N0aHJvdWdoID0gVFJVRTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUGFzc3Rocm91Z2ggYmVjYXVzZSBtb2RlPWRpc2FibGVkIik7CisgIH0gZWxzZSBpZiAoc2VsZi0+bW9kZSA9PSBHU1RfREVJTlRFUkxBQ0VfTU9ERV9JTlRFUkxBQ0VEKSB7CisgICAgR3N0Q2FwcyAqdG1wID0gZ3N0X3N0YXRpY19jYXBzX2dldCAoJmRlaW50ZXJsYWNlX2NhcHMpOworCisgICAgaWYgKCFnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChjYXBzLCB0bXApKSB7CisgICAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJVbnN1cHBvcnRlZCBjYXBzIGZvciBtb2RlPWludGVybGFjZWQiKTsKKyAgICAgIGdvdG8gaW52YWxpZF9jYXBzOworICAgIH0KKworICAgIHNlbGYtPnBhc3N0aHJvdWdoID0gRkFMU0U7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIk5vdCBwYXNzdGhyb3VnaCBiZWNhdXNlIG1vZGU9aW50ZXJsYWNlZCIpOworICB9IGVsc2UgaWYgKHNlbGYtPm1vZGUgPT0gR1NUX0RFSU5URVJMQUNFX01PREVfQVVUTworICAgICAgfHwgc2VsZi0+bW9kZSA9PSBHU1RfREVJTlRFUkxBQ0VfTU9ERV9BVVRPX1NUUklDVCkgeworICAgIEdzdENhcHMgKnRtcCA9IGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZkZWludGVybGFjZV9jYXBzKTsKKworICAgIC8qIEFscmVhZHkgcHJvZ3Jlc3NpdmU/IFBhc3N0aHJvdWdoICovCisgICAgaWYgKCFHU1RfVklERU9fSU5GT19JU19JTlRFUkxBQ0VEICgmc2VsZi0+dmluZm8pKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgICAgICJQYXNzdGhyb3VnaCBiZWNhdXNlIG1vZGU9YXV0byBhbmQgcHJvZ3Jlc3NpdmUgY2FwcyIpOworICAgICAgc2VsZi0+cGFzc3Rocm91Z2ggPSBUUlVFOworICAgIH0gZWxzZSBpZiAoZ3N0X2NhcHNfY2FuX2ludGVyc2VjdCAoY2FwcywgdG1wKSkgeworICAgICAgaWYgKHBlZXJjYXBzKSB7CisgICAgICAgIEdzdENhcHMgKmFsbG93ZWRfY2FwczsKKyAgICAgICAgR3N0Q2FwcyAqdG1wMjsKKyAgICAgICAgR3N0U3RydWN0dXJlICpzOworCisgICAgICAgIGFsbG93ZWRfY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdCAocGVlcmNhcHMsIHRtcCk7CisKKyAgICAgICAgdG1wMiA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworICAgICAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAodG1wMiwgMCk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiaW50ZXJsYWNlLW1vZGUiLCBHX1RZUEVfU1RSSU5HLCAicHJvZ3Jlc3NpdmUiLAorICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCAiZnJhbWVyYXRlIik7CisKKyAgICAgICAgLyogRG93bnN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IHByb2dyZXNzaXZlIGNhcHMgYnV0IHN1cHBvcnRzCisgICAgICAgICAqIHRoZSB1cHN0cmVhbSBjYXBzLCBnbyBwYXNzdGhyb3VnaC4KKyAgICAgICAgICogVE9ETzogV2UgbWlnaHQgd2FudCB0byBjaGVjayB0aGUgZnJhbWVyYXRlIGNvbXBhdGliaWxpdHkKKyAgICAgICAgICogb2YgdGhlIGNhcHMgdG9vIGhlcmUKKyAgICAgICAgICovCisgICAgICAgIGlmIChnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChhbGxvd2VkX2NhcHMsIGNhcHMpCisgICAgICAgICAgICAmJiAhZ3N0X2NhcHNfY2FuX2ludGVyc2VjdCAoYWxsb3dlZF9jYXBzLCB0bXAyKSkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICAgICAgICJQYXNzdGhyb3VnaCBiZWNhdXNlIG1vZGU9YXV0bywgIgorICAgICAgICAgICAgICAiZG93bnN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IHByb2dyZXNzaXZlIGNhcHMgYW5kIGludGVybGFjZWQgY2FwcyIpOworICAgICAgICAgIHNlbGYtPnBhc3N0aHJvdWdoID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiTm90IHBhc3N0aHJvdWdoIGJlY2F1c2UgbW9kZT1hdXRvLCAiCisgICAgICAgICAgICAgICJkb3duc3RyZWFtIHN1cHBvcnRzIHByb2dyZXNzaXZlIGNhcHMgYW5kIGludGVybGFjZWQgY2FwcyIpOworICAgICAgICAgIHNlbGYtPnBhc3N0aHJvdWdoID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBnc3RfY2Fwc191bnJlZiAoYWxsb3dlZF9jYXBzKTsKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcDIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwKKyAgICAgICAgICAgICJOb3QgcGFzc3Rocm91Z2ggYmVjYXVzZSBtb2RlPWF1dG8gYW5kIGludGVybGFjZWQgY2FwcyIpOworICAgICAgICBzZWxmLT5wYXNzdGhyb3VnaCA9IEZBTFNFOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoc2VsZi0+bW9kZSA9PSBHU1RfREVJTlRFUkxBQ0VfTU9ERV9BVVRPKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2VsZiwKKyAgICAgICAgICAgICJQYXNzdGhyb3VnaCBiZWNhdXNlIG1vZGU9YXV0byBhbmQgdW5zdXBwb3J0ZWQgaW50ZXJsYWNlZCBjYXBzIik7CisgICAgICAgIHNlbGYtPnBhc3N0aHJvdWdoID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9jYXBzX3VucmVmICh0bXApOworICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLAorICAgICAgICAgICAgIlVuc3VwcG9ydGVkIGludGVybGFjZWQgY2FwcyBpbiBtb2RlPWF1dG8tc3RyaWN0Iik7CisgICAgICAgIGdvdG8gaW52YWxpZF9jYXBzOworICAgICAgfQorICAgIH0KKworICAgIGdzdF9jYXBzX3VucmVmICh0bXApOworICB9IGVsc2UgeworICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICB9CisKKyAgaW50ZXJsYWNpbmdfbW9kZSA9IEdTVF9WSURFT19JTkZPX0lOVEVSTEFDRV9NT0RFICgmc2VsZi0+dmluZm8pOworCisgIGlmICghc2VsZi0+cGFzc3Rocm91Z2gpIHsKKyAgICBpZiAoc2VsZi0+cGF0dGVybl9sb2NrKSB7CisgICAgICBzcmNjYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgICAgICBpZiAoc2VsZi0+cGF0dGVybiAhPSAtMQorICAgICAgICAgICYmIEdfVU5MSUtFTFkgKCFnc3RfdXRpbF9mcmFjdGlvbl9tdWx0aXBseSAoZnBzX24sIGZwc19kLAorICAgICAgICAgICAgICAgICAgdGVsZWNpbmVfcGF0dGVybnNbc2VsZi0+cGF0dGVybl0ucmF0aW9fbiwKKyAgICAgICAgICAgICAgICAgIHRlbGVjaW5lX3BhdHRlcm5zW3NlbGYtPnBhdHRlcm5dLnJhdGlvX2QsICZmcHNfbiwgJmZwc19kKSkpCisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsCisgICAgICAgICAgICAiTXVsdGlwbHlpbmcgdGhlIGZyYW1lcmF0ZSBieSB0aGUgdGVsZWNpbmUgcGF0dGVybiByYXRpbyBvdmVyZmxvd2VkISIpOworICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoc3JjY2FwcywgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLCBmcHNfbiwKKyAgICAgICAgICBmcHNfZCwgTlVMTCk7CisgICAgfSBlbHNlIGlmIChzZWxmLT5sb2NraW5nID09IEdTVF9ERUlOVEVSTEFDRV9MT0NLSU5HX0FDVElWRQorICAgICAgICB8fCBzZWxmLT5sb3dfbGF0ZW5jeSA9PSAwKSB7CisgICAgICAvKiBpbiBoaWdoIGxhdGVuY3kgcGF0dGVybiBsb2NraW5nIG1vZGUgaWYgd2UgZG9uJ3QgaGF2ZSBhIHBhdHRlcm4gbG9jaywKKyAgICAgICAqIHRoZSBzaW5rIHBhZCBjYXBzIGFyZSB0aGUgYmVzdCB3ZSBrbm93ICovCisgICAgICBzcmNjYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgICAgfSBlbHNlIGlmIChzZWxmLT5sb3dfbGF0ZW5jeSA+IDAKKyAgICAgICAgJiYgaW50ZXJsYWNpbmdfbW9kZSA9PSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfTUlYRUQKKyAgICAgICAgJiYgc2VsZi0+cGF0dGVybiA9PSAtMSkgeworICAgICAgLyogZm9yIGluaXRpYWwgYnVmZmVycyBvZiBhIHRlbGVjaW5lIHBhdHRlcm4sIHVudGlsIHRoZXJlIGlzIGEgbG9jayB3ZQorICAgICAgICogd2Ugb3V0cHV0IG5hw692ZWx5IGFkanVzdGVkIHRpbWVzdGFtcHMgaW4gbG93LWxhdGVuY3kgcGF0dGVybiBsb2NraW5nCisgICAgICAgKiBtb2RlICovCisgICAgICBzcmNjYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChzcmNjYXBzLCAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sIDAsIDEsIE5VTEwpOworICAgIH0gZWxzZSBpZiAoc2VsZi0+dXNlcl9zZXRfZmllbGRzID09IEdTVF9ERUlOVEVSTEFDRV9GSUVMRFNfQVVUTykgeworICAgICAgc3JjY2FwcyA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworICAgICAgaWYgKHBlZXJjYXBzKSB7CisgICAgICAgIGdib29sZWFuIGNhbl9iZV90ZiA9IEZBTFNFOworCisgICAgICAgIC8qIFdlIGFscmVhZHkga25vdyB0aGF0IHdlIGFyZSBub3QgcGFzc3Rocm91Z2g6IGludGVybGFjZS1tb2RlIHdpbGwKKyAgICAgICAgICogYmUgcHJvZ3Jlc3NpdmUgKi8KKyAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoc3JjY2FwcywgImludGVybGFjZS1tb2RlIiwgR19UWVBFX1NUUklORywKKyAgICAgICAgICAgICJwcm9ncmVzc2l2ZSIsIE5VTEwpOworCisgICAgICAgIGlmIChnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChwZWVyY2Fwcywgc3JjY2FwcykpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiQ2FuIGRlaW50ZXJsYWNlIHRvcCBmaWVsZHMiKTsKKyAgICAgICAgICBjYW5fYmVfdGYgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIHNyY2NhcHMgPSBnc3RfZGVpbnRlcmxhY2VfY2Fwc19kb3VibGVfZnJhbWVyYXRlIChzcmNjYXBzLCBGQUxTRSk7CisgICAgICAgIGlmICghZ3N0X2NhcHNfY2FuX2ludGVyc2VjdCAocGVlcmNhcHMsIHNyY2NhcHMpKSB7CisgICAgICAgICAgaWYgKGNhbl9iZV90ZikgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIldpbGwgZGVpbnRlcmxhY2UgdG9wIGZpZWxkcyIpOworICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoc3JjY2FwcywgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLCBmcHNfbiwKKyAgICAgICAgICAgICAgICBmcHNfZCwgTlVMTCk7CisgICAgICAgICAgICBzZWxmLT5maWVsZHMgPSBHU1RfREVJTlRFUkxBQ0VfVEY7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICAgICAgICAgIkNhbid0IG5lZ290aWF0ZSB1cHN0cmVhbSBhbmQgZG93bnN0cmVhbSBjYXBzIik7CisgICAgICAgICAgICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisgICAgICAgICAgICBnb3RvIGludmFsaWRfY2FwczsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkRlaW50ZXJsYWNpbmcgYWxsIGZpZWxkcyIpOworICAgICAgICAgIHNlbGYtPmZpZWxkcyA9IEdTVF9ERUlOVEVSTEFDRV9BTEw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICAgICAiTm8gcGVlciBjYXBzIHlldCwgZmFsbGluZyBiYWNrIHRvIGRlaW50ZXJsYWNpbmcgYWxsIGZpZWxkcyIpOworICAgICAgICBzZWxmLT5maWVsZHMgPSBHU1RfREVJTlRFUkxBQ0VfQUxMOworICAgICAgICBzcmNjYXBzID0gZ3N0X2RlaW50ZXJsYWNlX2NhcHNfZG91YmxlX2ZyYW1lcmF0ZSAoc3JjY2FwcywgRkFMU0UpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzZWxmLT5maWVsZHMgPSBzZWxmLT51c2VyX3NldF9maWVsZHM7CisgICAgICBzcmNjYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgICAgICBpZiAoc2VsZi0+ZmllbGRzID09IEdTVF9ERUlOVEVSTEFDRV9BTEwpCisgICAgICAgIHNyY2NhcHMgPSBnc3RfZGVpbnRlcmxhY2VfY2Fwc19kb3VibGVfZnJhbWVyYXRlIChzcmNjYXBzLCBGQUxTRSk7CisgICAgfQorCisgICAgLyogSWYgbm90IHBhc3N0aHJvdWdoLCB3ZSBhcmUgZ29pbmcgdG8gb3V0cHV0IHByb2dyZXNzaXZlIGNvbnRlbnQgKi8KKyAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChzcmNjYXBzLCAiaW50ZXJsYWNlLW1vZGUiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICAicHJvZ3Jlc3NpdmUiLCBOVUxMKTsKKworICAgIGdzdF9kZWludGVybGFjZV9zZXRfbWV0aG9kIChzZWxmLCBzZWxmLT5tZXRob2RfaWQpOworICAgIGdzdF9kZWludGVybGFjZV9tZXRob2Rfc2V0dXAgKHNlbGYtPm1ldGhvZCwgJnNlbGYtPnZpbmZvKTsKKyAgfSBlbHNlIHsKKyAgICBzcmNjYXBzID0gZ3N0X2NhcHNfcmVmIChjYXBzKTsKKyAgfQorCisgIGlmIChmcHNfbiAhPSAwKSB7CisgICAgc2VsZi0+ZmllbGRfZHVyYXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKEdTVF9TRUNPTkQsIGZwc19kLCAyICogZnBzX24pOworICB9IGVsc2UgeworICAgIHNlbGYtPmZpZWxkX2R1cmF0aW9uID0gMDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIlNpbmsgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJTcmMgIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBzcmNjYXBzKTsKKworICBpZiAoIWdzdF9wYWRfc2V0X2NhcHMgKHNlbGYtPnNyY3BhZCwgc3JjY2FwcykpCisgICAgZ290byBzZXRfY2Fwc19mYWlsZWQ7CisKKyAgaWYgKCFnc3RfZGVpbnRlcmxhY2VfZG9fYnVmZmVycG9vbCAoc2VsZiwgc3JjY2FwcykpCisgICAgZ290byBub19idWZmZXJwb29sOworCisgIGlmIChwZWVyY2FwcykKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgcmV0dXJuIFRSVUU7CisKK2ludmFsaWRfY2FwczoKKyAgeworICAgIGlmIChwZWVyY2FwcykKKyAgICAgIGdzdF9jYXBzX3VucmVmIChwZWVyY2Fwcyk7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocGFkLCAiSW52YWxpZCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgICAgZ3N0X3BhZF9tYXJrX3JlY29uZmlndXJlIChzZWxmLT5zcmNwYWQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorc2V0X2NhcHNfZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocGFkLCAiRmFpbGVkIHRvIHNldCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgc3JjY2Fwcyk7CisgICAgaWYgKHBlZXJjYXBzKQorICAgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisgICAgZ3N0X3BhZF9tYXJrX3JlY29uZmlndXJlIChzZWxmLT5zcmNwYWQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fYnVmZmVycG9vbDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBhZCwgImNvdWxkIG5vdCBuZWdvdGlhdGUgYnVmZmVycG9vbCIpOworICAgIGlmIChwZWVyY2FwcykKKyAgICAgIGdzdF9jYXBzX3VucmVmIChwZWVyY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworICAgIGdzdF9wYWRfbWFya19yZWNvbmZpZ3VyZSAoc2VsZi0+c3JjcGFkKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZGVpbnRlcmxhY2Vfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIEdzdERlaW50ZXJsYWNlICpzZWxmID0gR1NUX0RFSU5URVJMQUNFIChwYXJlbnQpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJyZWNlaXZlZCAlcyBldmVudDogJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCksIGV2ZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfY2FwcyAoZXZlbnQsICZjYXBzKTsKKyAgICAgIHJlcyA9IGdzdF9kZWludGVybGFjZV9zZXRjYXBzIChzZWxmLCBwYWQsIGNhcHMpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDoKKyAgICB7CisgICAgICBjb25zdCBHc3RTZWdtZW50ICpzZWdtZW50OworCisgICAgICBnc3RfZXZlbnRfcGFyc2Vfc2VnbWVudCAoZXZlbnQsICZzZWdtZW50KTsKKworICAgICAgZ3N0X2RlaW50ZXJsYWNlX3Jlc2V0X3FvcyAoc2VsZik7CisgICAgICBnc3RfZGVpbnRlcmxhY2VfcmVzZXRfaGlzdG9yeSAoc2VsZiwgRkFMU0UpOworCisgICAgICBpZiAoc2VnbWVudC0+Zm9ybWF0ID09IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsCisgICAgICAgICAgICAiR290IFNFR01FTlQgZXZlbnQgaW4gVElNRSBmb3JtYXQsIHBhc3Npbmcgb24gKCUiCisgICAgICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiAtICUiIEdTVF9USU1FX0ZPUk1BVCAiKSIsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChzZWdtZW50LT5zdGFydCksIEdTVF9USU1FX0FSR1MgKHNlZ21lbnQtPnN0b3ApKTsKKyAgICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvIChzZWdtZW50LCAmc2VsZi0+c2VnbWVudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhZCwgIkdvdCBTRUdNRU5UIGV2ZW50IGluICVzIGZvcm1hdCIsCisgICAgICAgICAgICBnc3RfZm9ybWF0X2dldF9uYW1lIChzZWdtZW50LT5mb3JtYXQpKTsKKyAgICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlbGYtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVU5ERUZJTkVEKTsKKyAgICAgIH0KKworICAgICAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChzZWxmLT5zcmNwYWQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9DVVNUT01fRE9XTlNUUkVBTTp7CisgICAgICBnYm9vbGVhbiBzdGlsbF9zdGF0ZTsKKworICAgICAgaWYgKGdzdF92aWRlb19ldmVudF9wYXJzZV9zdGlsbF9mcmFtZSAoZXZlbnQsICZzdGlsbF9zdGF0ZSkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlJlY2VpdmVkIHN0aWxsIGZyYW1lIGV2ZW50LCBzdGF0ZSAlZCIsCisgICAgICAgICAgICBzdGlsbF9zdGF0ZSk7CisKKyAgICAgICAgaWYgKHN0aWxsX3N0YXRlKSB7CisgICAgICAgICAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiSGFuZGxpbmcgc3RpbGwgZnJhbWUiKTsKKyAgICAgICAgICBzZWxmLT5zdGlsbF9mcmFtZV9tb2RlID0gVFJVRTsKKyAgICAgICAgICBnc3RfZGVpbnRlcmxhY2VfcmVzZXRfaGlzdG9yeSAoc2VsZiwgRkFMU0UpOworICAgICAgICAgIGlmIChzZWxmLT5sYXN0X2J1ZmZlcikgeworICAgICAgICAgICAgcmV0ID0KKyAgICAgICAgICAgICAgICBnc3RfcGFkX3B1c2ggKHNlbGYtPnNyY3BhZCwgZ3N0X2J1ZmZlcl9yZWYgKHNlbGYtPmxhc3RfYnVmZmVyKSk7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUHVzaGVkIHN0aWxsIGZyYW1lLCByZXN1bHQ6ICVzIiwKKyAgICAgICAgICAgICAgICBnc3RfZmxvd19nZXRfbmFtZSAocmV0KSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2VsZiwgIk5vIHBlbmRpbmcgYnVmZmVyISIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiRW5kaW5nIHN0aWxsIGZyYW1lcyIpOworICAgICAgICAgIHNlbGYtPnN0aWxsX2ZyYW1lX21vZGUgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNyY3BhZCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIHNlbGYtPmhhdmVfZW9zID0gVFJVRTsKKyAgICAgIGdzdF9kZWludGVybGFjZV9yZXNldF9oaXN0b3J5IChzZWxmLCBGQUxTRSk7CisgICAgICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNyY3BhZCwgZXZlbnQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgaWYgKHNlbGYtPnN0aWxsX2ZyYW1lX21vZGUpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkVuZGluZyBzdGlsbCBmcmFtZXMiKTsKKyAgICAgICAgc2VsZi0+c3RpbGxfZnJhbWVfbW9kZSA9IEZBTFNFOworICAgICAgfQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3Jlc2V0X3FvcyAoc2VsZik7CisgICAgICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNyY3BhZCwgZXZlbnQpOworICAgICAgZ3N0X2RlaW50ZXJsYWNlX3Jlc2V0X2hpc3RvcnkgKHNlbGYsIFRSVUUpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGFjZV9wcm9wb3NlX2FsbG9jYXRpb24gKEdzdERlaW50ZXJsYWNlICogc2VsZiwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0QnVmZmVyUG9vbCAqcG9vbDsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0VmlkZW9JbmZvIGluZm87CisgIGd1aW50IHNpemU7CisgIEdzdFN0cnVjdHVyZSAqY29uZmlnOworCisgIGdzdF9xdWVyeV9wYXJzZV9hbGxvY2F0aW9uIChxdWVyeSwgJmNhcHMsIE5VTEwpOworCisgIGlmIChjYXBzID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3ZpZGVvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgY2FwcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHNpemUgPSBHU1RfVklERU9fSU5GT19TSVpFICgmaW5mbyk7CisKKyAgcG9vbCA9IGdzdF92aWRlb19idWZmZXJfcG9vbF9uZXcgKCk7CisKKyAgZ3N0X3F1ZXJ5X2FkZF9hbGxvY2F0aW9uX3Bvb2wgKHF1ZXJ5LCBwb29sLCBzaXplLCAwLCAwKTsKKworICBjb25maWcgPSBnc3RfYnVmZmVyX3Bvb2xfZ2V0X2NvbmZpZyAocG9vbCk7CisgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfc2V0X3BhcmFtcyAoY29uZmlnLCBjYXBzLCBzaXplLAorICAgICAgKGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X2ZpZWxkc19yZXF1aXJlZCAoc2VsZi0+bWV0aG9kKSArIDEpIC8gMiArIDEsCisgICAgICAwKTsKKyAgZ3N0X2J1ZmZlcl9wb29sX3NldF9jb25maWcgKHBvb2wsIGNvbmZpZyk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocG9vbCk7CisgIGdzdF9xdWVyeV9hZGRfYWxsb2NhdGlvbl9tZXRhIChxdWVyeSwgR1NUX1ZJREVPX01FVEFfQVBJX1RZUEUsIE5VTEwpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGFjZV9zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0RGVpbnRlcmxhY2UgKnNlbGYgPSBHU1RfREVJTlRFUkxBQ0UgKHBhcmVudCk7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICIlcyBxdWVyeSIsIEdTVF9RVUVSWV9UWVBFX05BTUUgKHF1ZXJ5KSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpmaWx0ZXIsICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZmaWx0ZXIpOworICAgICAgY2FwcyA9IGdzdF9kZWludGVybGFjZV9nZXRjYXBzIChzZWxmLCBwYWQsIGZpbHRlcik7CisgICAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX0FDQ0VQVF9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisgICAgICBnYm9vbGVhbiByZXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9hY2NlcHRfY2FwcyAocXVlcnksICZjYXBzKTsKKyAgICAgIHJldCA9IGdzdF9kZWludGVybGFjZV9hY2NlcHRjYXBzIChzZWxmLCBwYWQsIGNhcHMpOworICAgICAgZ3N0X3F1ZXJ5X3NldF9hY2NlcHRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCByZXQpOworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9BTExPQ0FUSU9OOgorICAgICAgaWYgKHNlbGYtPnBhc3N0aHJvdWdoKQorICAgICAgICByZXMgPSBnc3RfcGFkX3BlZXJfcXVlcnkgKHNlbGYtPnNyY3BhZCwgcXVlcnkpOworICAgICAgZWxzZQorICAgICAgICByZXMgPSBnc3RfZGVpbnRlcmxhY2VfcHJvcG9zZV9hbGxvY2F0aW9uIChzZWxmLCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfZGVpbnRlcmxhY2VfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3REZWludGVybGFjZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19QTEFZSU5HOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisgIGlmIChyZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKQorICAgIHJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9kZWludGVybGFjZV9yZXNldCAoc2VsZik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGFjZV9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3REZWludGVybGFjZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRSAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgInJlY2VpdmVkICVzIGV2ZW50IiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9RT1M6eworICAgICAgR3N0Q2xvY2tUaW1lRGlmZiBkaWZmOworICAgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKyAgICAgIEdzdFFPU1R5cGUgdHlwZTsKKyAgICAgIGdkb3VibGUgcHJvcG9ydGlvbjsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3FvcyAoZXZlbnQsICZ0eXBlLCAmcHJvcG9ydGlvbiwgJmRpZmYsICZ0aW1lc3RhbXApOworCisgICAgICBnc3RfZGVpbnRlcmxhY2VfdXBkYXRlX3FvcyAoc2VsZiwgcHJvcG9ydGlvbiwgZGlmZiwgdGltZXN0YW1wKTsKKyAgICB9CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGFjZV9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3REZWludGVybGFjZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRSAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIiVzIHF1ZXJ5IiwgR1NUX1FVRVJZX1RZUEVfTkFNRSAocXVlcnkpKTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9MQVRFTkNZOgorICAgICAgaWYgKCFzZWxmLT5wYXNzdGhyb3VnaCkgeworICAgICAgICBHc3RDbG9ja1RpbWUgbWluLCBtYXg7CisgICAgICAgIGdib29sZWFuIGxpdmU7CisgICAgICAgIEdzdFBhZCAqcGVlcjsKKworICAgICAgICBpZiAoKHBlZXIgPSBnc3RfcGFkX2dldF9wZWVyIChzZWxmLT5zaW5rcGFkKSkpIHsKKyAgICAgICAgICBpZiAoKHJlcyA9IGdzdF9wYWRfcXVlcnkgKHBlZXIsIHF1ZXJ5KSkpIHsKKyAgICAgICAgICAgIEdzdENsb2NrVGltZSBsYXRlbmN5OworICAgICAgICAgICAgZ2ludCBmaWVsZHNfcmVxdWlyZWQgPSAwOworICAgICAgICAgICAgZ2ludCBtZXRob2RfbGF0ZW5jeSA9IDA7CisKKyAgICAgICAgICAgIGlmIChzZWxmLT5tZXRob2QpIHsKKyAgICAgICAgICAgICAgZmllbGRzX3JlcXVpcmVkID0KKyAgICAgICAgICAgICAgICAgIGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X2ZpZWxkc19yZXF1aXJlZCAoc2VsZi0+bWV0aG9kKTsKKyAgICAgICAgICAgICAgbWV0aG9kX2xhdGVuY3kgPQorICAgICAgICAgICAgICAgICAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9nZXRfbGF0ZW5jeSAoc2VsZi0+bWV0aG9kKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2xhdGVuY3kgKHF1ZXJ5LCAmbGl2ZSwgJm1pbiwgJm1heCk7CisKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJQZWVyIGxhdGVuY3k6IG1pbiAlIgorICAgICAgICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiIG1heCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobWluKSwgR1NUX1RJTUVfQVJHUyAobWF4KSk7CisKKyAgICAgICAgICAgIC8qIGFkZCBvdXIgb3duIGxhdGVuY3kgKi8KKyAgICAgICAgICAgIGxhdGVuY3kgPSAoZmllbGRzX3JlcXVpcmVkICsgbWV0aG9kX2xhdGVuY3kpICogc2VsZi0+ZmllbGRfZHVyYXRpb247CisKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJPdXIgbGF0ZW5jeTogbWluICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAgICAgICAgICIsIG1heCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobGF0ZW5jeSksIEdTVF9USU1FX0FSR1MgKGxhdGVuY3kpKTsKKworICAgICAgICAgICAgbWluICs9IGxhdGVuY3k7CisgICAgICAgICAgICBpZiAobWF4ICE9IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgICAgICAgICAgIG1heCArPSBsYXRlbmN5OworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiQ2FsY3VsYXRlZCB0b3RhbCBsYXRlbmN5IDogbWluICUiCisgICAgICAgICAgICAgICAgR1NUX1RJTUVfRk9STUFUICIgbWF4ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChtaW4pLCBHU1RfVElNRV9BUkdTIChtYXgpKTsKKworICAgICAgICAgICAgZ3N0X3F1ZXJ5X3NldF9sYXRlbmN5IChxdWVyeSwgbGl2ZSwgbWluLCBtYXgpOworICAgICAgICAgIH0KKyAgICAgICAgICBnc3Rfb2JqZWN0X3VucmVmIChwZWVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChkZWludGVybGFjZV9kZWJ1ZywgImRlaW50ZXJsYWNlIiwgMCwgIkRlaW50ZXJsYWNlciIpOworCisjaWYgSEFWRV9PUkMKKyAgb3JjX2luaXQgKCk7CisjZW5kaWYKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJkZWludGVybGFjZSIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfREVJTlRFUkxBQ0UpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBkZWludGVybGFjZSwKKyAgICAiRGVpbnRlcmxhY2VyIiwgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwKKyAgICBHU1RfUEFDS0FHRV9PUklHSU4pOwpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmggYi9nc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGNjNjM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlLmgKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNYXJ0aW4gRWlrZXJtYW5uIDxtZWlrZXJAdXBiLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfREVJTlRFUkxBQ0VfSF9fCisjZGVmaW5lIF9fR1NUX0RFSU5URVJMQUNFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb3Bvb2wuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9tZXRhLmg+CisKKyNpbmNsdWRlICJnc3RkZWludGVybGFjZW1ldGhvZC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0UgXAorICAoZ3N0X2RlaW50ZXJsYWNlX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0RFSU5URVJMQUNFLEdzdERlaW50ZXJsYWNlKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0RFSU5URVJMQUNFLEdzdERlaW50ZXJsYWNlKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfREVJTlRFUkxBQ0UpKQorI2RlZmluZSBHU1RfSVNfREVJTlRFUkxBQ0VfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0RFSU5URVJMQUNFKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdERlaW50ZXJsYWNlIEdzdERlaW50ZXJsYWNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdERlaW50ZXJsYWNlQ2xhc3MgR3N0RGVpbnRlcmxhY2VDbGFzczsKKwordHlwZWRlZiBlbnVtCit7CisgIEdTVF9ERUlOVEVSTEFDRV9UT01TTU9DT01QLAorICBHU1RfREVJTlRFUkxBQ0VfR1JFRURZX0gsCisgIEdTVF9ERUlOVEVSTEFDRV9HUkVFRFlfTCwKKyAgR1NUX0RFSU5URVJMQUNFX1ZGSVIsCisgIEdTVF9ERUlOVEVSTEFDRV9MSU5FQVIsCisgIEdTVF9ERUlOVEVSTEFDRV9MSU5FQVJfQkxFTkQsCisgIEdTVF9ERUlOVEVSTEFDRV9TQ0FMRVJfQk9CLAorICBHU1RfREVJTlRFUkxBQ0VfV0VBVkUsCisgIEdTVF9ERUlOVEVSTEFDRV9XRUFWRV9URkYsCisgIEdTVF9ERUlOVEVSTEFDRV9XRUFWRV9CRkYKK30gR3N0RGVpbnRlcmxhY2VNZXRob2RzOworCit0eXBlZGVmIGVudW0KK3sKKyAgR1NUX0RFSU5URVJMQUNFX0FMTCwgICAgICAgICAvKiBBbGwgKG1pc3NpbmcgZGF0YSBpcyBpbnRlcnAuKSAqLworICBHU1RfREVJTlRFUkxBQ0VfVEYsICAgICAgICAgIC8qIFRvcCBGaWVsZHMgT25seSAqLworICBHU1RfREVJTlRFUkxBQ0VfQkYsICAgICAgICAgIC8qIEJvdHRvbSBGaWVsZHMgT25seSAqLworICBHU1RfREVJTlRFUkxBQ0VfRklFTERTX0FVVE8gIC8qIEF1dG9tYXRpY2FsbHkgZGV0ZWN0ICovCit9IEdzdERlaW50ZXJsYWNlRmllbGRzOworCit0eXBlZGVmIGVudW0KK3sKKyAgR1NUX0RFSU5URVJMQUNFX0xBWU9VVF9BVVRPLAorICBHU1RfREVJTlRFUkxBQ0VfTEFZT1VUX1RGRiwKKyAgR1NUX0RFSU5URVJMQUNFX0xBWU9VVF9CRkYKK30gR3N0RGVpbnRlcmxhY2VGaWVsZExheW91dDsKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX0RFSU5URVJMQUNFX01PREVfQVVUTywKKyAgR1NUX0RFSU5URVJMQUNFX01PREVfSU5URVJMQUNFRCwKKyAgR1NUX0RFSU5URVJMQUNFX01PREVfRElTQUJMRUQsCisgIEdTVF9ERUlOVEVSTEFDRV9NT0RFX0FVVE9fU1RSSUNUCit9IEdzdERlaW50ZXJsYWNlTW9kZTsKKwordHlwZWRlZiBlbnVtCit7CisgIEdTVF9ERUlOVEVSTEFDRV9MT0NLSU5HX05PTkUsCisgIEdTVF9ERUlOVEVSTEFDRV9MT0NLSU5HX0FVVE8sCisgIEdTVF9ERUlOVEVSTEFDRV9MT0NLSU5HX0FDVElWRSwKKyAgR1NUX0RFSU5URVJMQUNFX0xPQ0tJTkdfUEFTU0lWRSwKK30gR3N0RGVpbnRlcmxhY2VMb2NraW5nOworCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NQVhfRklFTERfSElTVE9SWSAxMAorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUFYX0JVRkZFUl9TVEFURV9ISVNUT1JZIDUwCisvKiBjaGVjayBtYXggZmllbGQgaGlzdG9yeSBpcyBsYXJnZSBlbm91Z2ggKi8KKyNpZiBHU1RfREVJTlRFUkxBQ0VfTUFYX0ZJRUxEX0hJU1RPUlkgPCBHU1RfREVJTlRFUkxBQ0VfTUFYX0JVRkZFUl9TVEFURV9ISVNUT1JZICogMworI3VuZGVmIEdTVF9ERUlOVEVSTEFDRV9NQVhfRklFTERfSElTVE9SWQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUFYX0ZJRUxEX0hJU1RPUlkgKEdTVF9ERUlOVEVSTEFDRV9NQVhfQlVGRkVSX1NUQVRFX0hJU1RPUlkgKiAzKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IF9UZWxlY2luZVBhdHRlcm4gVGVsZWNpbmVQYXR0ZXJuOworc3RydWN0IF9UZWxlY2luZVBhdHRlcm4KK3sKKyAgY29uc3QgZ2NoYXIgKm5pY2s7CisgIGd1aW50OCBsZW5ndGg7CisgIGd1aW50OCByYXRpb19uLCByYXRpb19kOworICBndWludDggc3RhdGVzW0dTVF9ERUlOVEVSTEFDRV9NQVhfQlVGRkVSX1NUQVRFX0hJU1RPUlldOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdERlaW50ZXJsYWNlQnVmZmVyU3RhdGUgR3N0RGVpbnRlcmxhY2VCdWZmZXJTdGF0ZTsKK3N0cnVjdCBfR3N0RGVpbnRlcmxhY2VCdWZmZXJTdGF0ZQoreworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworICBHc3RDbG9ja1RpbWUgZHVyYXRpb247CisgIGd1aW50OCBzdGF0ZTsKK307CisKK3N0cnVjdCBfR3N0RGVpbnRlcmxhY2UKK3sKKyAgR3N0RWxlbWVudCBwYXJlbnQ7CisKKyAgR3N0UGFkICpzcmNwYWQsICpzaW5rcGFkOworCisgIC8qIDxwcml2YXRlPiAqLworICBHc3REZWludGVybGFjZU1vZGUgbW9kZTsKKworICBHc3REZWludGVybGFjZUZpZWxkTGF5b3V0IGZpZWxkX2xheW91dDsKKworICBHc3REZWludGVybGFjZUZpZWxkcyBmaWVsZHM7CisKKyAgR3N0RGVpbnRlcmxhY2VGaWVsZHMgdXNlcl9zZXRfZmllbGRzOworCisgIC8qIGN1cnJlbnQgc3RhdGUgKGRpZmZlcnMgd2hlbiBmbHVzaGluZy9pbnZlcnNlIHRlbGVjaW5lIHVzaW5nIHdlYXZlKSAqLworICBHc3REZWludGVybGFjZU1ldGhvZHMgbWV0aG9kX2lkOworICAvKiBwcm9wZXJ0eSB2YWx1ZSAqLworICBHc3REZWludGVybGFjZU1ldGhvZHMgdXNlcl9zZXRfbWV0aG9kX2lkOworICBHc3REZWludGVybGFjZU1ldGhvZCAqbWV0aG9kOworCisgIEdzdFZpZGVvSW5mbyB2aW5mbzsKKyAgR3N0QnVmZmVyUG9vbCAqcG9vbDsKKyAgR3N0QWxsb2NhdG9yICphbGxvY2F0b3I7CisgIEdzdEFsbG9jYXRpb25QYXJhbXMgcGFyYW1zOworCisgIGdib29sZWFuIHBhc3N0aHJvdWdoOworICBnYm9vbGVhbiBkaXNjb250OworCisgIEdzdENsb2NrVGltZSBmaWVsZF9kdXJhdGlvbjsgLyogRHVyYXRpb24gb2Ygb25lIGZpZWxkICovCisKKyAgLyogVGhlIG1vc3QgcmVjZW50IHBpY3R1cmVzIAorICAgICBQaWN0dXJlSGlzdG9yeVswXSBpcyBhbHdheXMgdGhlIG1vc3QgcmVjZW50LgorICAgICBQb2ludGVycyBhcmUgTlVMTCBpZiB0aGUgcGljdHVyZSBpbiBxdWVzdGlvbiBpc24ndCB2YWxpZCwgZS5nLiBiZWNhdXNlCisgICAgIHRoZSBwcm9ncmFtIGp1c3Qgc3RhcnRlZCBvciBhIHBpY3R1cmUgd2FzIHNraXBwZWQuCisgICAqLworICBHc3REZWludGVybGFjZUZpZWxkIGZpZWxkX2hpc3RvcnlbR1NUX0RFSU5URVJMQUNFX01BWF9GSUVMRF9ISVNUT1JZXTsKKyAgZ3VpbnQgaGlzdG9yeV9jb3VudDsKKyAgaW50IGN1cl9maWVsZF9pZHg7CisKKyAgLyogU2V0IHRvIFRSVUUgaWYgd2UncmUgaW4gc3RpbGwgZnJhbWUgbW9kZSwKKyAgICAgaS5lLiBqdXN0IGZvcndhcmQgYWxsIGJ1ZmZlcnMKKyAgICovCisgIGdib29sZWFuIHN0aWxsX2ZyYW1lX21vZGU7CisKKyAgLyogTGFzdCBidWZmZXIgdGhhdCB3YXMgcHVzaGVkIGluICovCisgIEdzdEJ1ZmZlciAqbGFzdF9idWZmZXI7CisKKyAgLyogQ3VycmVudCBzZWdtZW50ICovCisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICAvKiBRb1Mgc3R1ZmYgKi8KKyAgZ2RvdWJsZSBwcm9wb3J0aW9uOworICBHc3RDbG9ja1RpbWUgZWFybGllc3RfdGltZTsKKyAgZ2ludDY0IHByb2Nlc3NlZDsKKyAgZ2ludDY0IGRyb3BwZWQ7CisKKyAgR3N0Q2FwcyAqcmVxdWVzdF9jYXBzOworCisgIGdib29sZWFuIHJlY29uZmlndXJlOworICBHc3REZWludGVybGFjZU1vZGUgbmV3X21vZGU7CisgIEdzdERlaW50ZXJsYWNlRmllbGRzIG5ld19maWVsZHM7CisKKyAgR3N0RGVpbnRlcmxhY2VMb2NraW5nIGxvY2tpbmc7CisgIGdpbnQgbG93X2xhdGVuY3k7CisgIGdib29sZWFuIGRyb3Bfb3JwaGFuczsKKyAgZ2Jvb2xlYW4gaWdub3JlX29ic2N1cmU7CisgIGdib29sZWFuIHBhdHRlcm5fbG9jazsKKyAgZ2Jvb2xlYW4gcGF0dGVybl9yZWZyZXNoOworICBHc3REZWludGVybGFjZUJ1ZmZlclN0YXRlIGJ1Zl9zdGF0ZXNbR1NUX0RFSU5URVJMQUNFX01BWF9CVUZGRVJfU1RBVEVfSElTVE9SWV07CisgIGdpbnQgc3RhdGVfY291bnQ7CisgIGdpbnQgcGF0dGVybjsKKyAgZ3VpbnQ4IHBhdHRlcm5fcGhhc2U7CisgIGd1aW50OCBwYXR0ZXJuX2NvdW50OworICBndWludDggb3V0cHV0X2NvdW50OworICBHc3RDbG9ja1RpbWUgcGF0dGVybl9iYXNlX3RzOworICBHc3RDbG9ja1RpbWUgcGF0dGVybl9idWZfZHVyOworCisgIGdib29sZWFuIG5lZWRfbW9yZTsKKyAgZ2Jvb2xlYW4gaGF2ZV9lb3M7Cit9OworCitzdHJ1Y3QgX0dzdERlaW50ZXJsYWNlQ2xhc3MKK3sKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9kZWludGVybGFjZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9ERUlOVEVSTEFDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5jIGIvZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlNzdlNwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS9nc3RkZWludGVybGFjZW1ldGhvZC5jCkBAIC0wLDAgKzEsODAyIEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0Bjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RkZWludGVybGFjZW1ldGhvZC5oIgorCitHX0RFRklORV9BQlNUUkFDVF9UWVBFIChHc3REZWludGVybGFjZU1ldGhvZCwgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZCwKKyAgICBHU1RfVFlQRV9PQkpFQ1QpOworCitnYm9vbGVhbgorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9zdXBwb3J0ZWQgKEdUeXBlIHR5cGUsIEdzdFZpZGVvRm9ybWF0IGZvcm1hdCwgZ2ludCB3aWR0aCwKKyAgICBnaW50IGhlaWdodCkKK3sKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqa2xhc3MgPQorICAgICAgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9DTEFTUyAoZ190eXBlX2NsYXNzX3JlZiAodHlwZSkpOworICBnYm9vbGVhbiByZXQ7CisKKyAgaWYgKGZvcm1hdCA9PSBHU1RfVklERU9fRk9STUFUX1VOS05PV04pCisgICAgcmV0ID0gVFJVRTsKKyAgZWxzZQorICAgIHJldCA9IGtsYXNzLT5zdXBwb3J0ZWQgKGtsYXNzLCBmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOworICBnX3R5cGVfY2xhc3NfdW5yZWYgKGtsYXNzKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGFjZV9tZXRob2Rfc3VwcG9ydGVkX2ltcGwgKEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKiBrbGFzcywKKyAgICBHc3RWaWRlb0Zvcm1hdCBmb3JtYXQsIGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0KQoreworICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOgorICAgICAgcmV0dXJuIChrbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfeXV5MiAhPSBOVUxMKTsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVZZVToKKyAgICAgIHJldHVybiAoa2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l2eXUgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICByZXR1cm4gKGtsYXNzLT5kZWludGVybGFjZV9mcmFtZV91eXZ5ICE9IE5VTEwpOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOgorICAgICAgcmV0dXJuIChrbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfaTQyMCAhPSBOVUxMKTsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVYxMjoKKyAgICAgIHJldHVybiAoa2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l2MTIgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0NDQ6CisgICAgICByZXR1cm4gKGtsYXNzLT5kZWludGVybGFjZV9mcmFtZV95NDQ0ICE9IE5VTEwpOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgICAgcmV0dXJuIChrbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfeTQyYiAhPSBOVUxMKTsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQxQjoKKyAgICAgIHJldHVybiAoa2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3k0MWIgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FZVVY6CisgICAgICByZXR1cm4gKGtsYXNzLT5kZWludGVybGFjZV9mcmFtZV9heXV2ICE9IE5VTEwpOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9OVjEyOgorICAgICAgcmV0dXJuIChrbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfbnYxMiAhPSBOVUxMKTsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYyMToKKyAgICAgIHJldHVybiAoa2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX252MjEgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FSR0I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hSR0I6CisgICAgICByZXR1cm4gKGtsYXNzLT5kZWludGVybGFjZV9mcmFtZV9hcmdiICE9IE5VTEwpOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BQkdSOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94QkdSOgorICAgICAgcmV0dXJuIChrbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfYWJnciAhPSBOVUxMKTsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCeDoKKyAgICAgIHJldHVybiAoa2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3JnYmEgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUng6CisgICAgICByZXR1cm4gKGtsYXNzLT5kZWludGVybGFjZV9mcmFtZV9iZ3JhICE9IE5VTEwpOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgICByZXR1cm4gKGtsYXNzLT5kZWludGVybGFjZV9mcmFtZV9yZ2IgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUjoKKyAgICAgIHJldHVybiAoa2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX2JnciAhPSBOVUxMKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3ZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2Rfc2V0dXAgKEdzdERlaW50ZXJsYWNlTWV0aG9kICogc2VsZiwgR3N0VmlkZW9JbmZvICogdmluZm8pCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKmtsYXNzID0gR1NUX0RFSU5URVJMQUNFX01FVEhPRF9HRVRfQ0xBU1MgKHNlbGYpOworCisgIGtsYXNzLT5zZXR1cCAoc2VsZiwgdmluZm8pOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9zZXR1cF9pbXBsIChHc3REZWludGVybGFjZU1ldGhvZCAqIHNlbGYsCisgICAgR3N0VmlkZW9JbmZvICogdmluZm8pCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKmtsYXNzID0gR1NUX0RFSU5URVJMQUNFX01FVEhPRF9HRVRfQ0xBU1MgKHNlbGYpOworCisgIHNlbGYtPnZpbmZvID0gdmluZm87CisKKyAgc2VsZi0+ZGVpbnRlcmxhY2VfZnJhbWUgPSBOVUxMOworCisgIGlmIChHU1RfVklERU9fSU5GT19GT1JNQVQgKHNlbGYtPnZpbmZvKSA9PSBHU1RfVklERU9fRk9STUFUX1VOS05PV04pCisgICAgcmV0dXJuOworCisgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUIChzZWxmLT52aW5mbykpIHsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVVZMjoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l1eTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVZZVToKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l2eXU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfVVlWWToKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3V5dnk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfSTQyMDoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX2k0MjA7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVYxMjoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l2MTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQ0NDoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3k0NDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQyQjoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3k0MmI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQxQjoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3k0MWI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX2F5dXY7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYxMjoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX252MTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYyMToKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX252MjE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeFJHQjoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX2FyZ2I7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQUJHUjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeEJHUjoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX2FiZ3I7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCeDoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3JnYmE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSeDoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX2JncmE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCOgorICAgICAgc2VsZi0+ZGVpbnRlcmxhY2VfZnJhbWUgPSBrbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfcmdiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUjoKKyAgICAgIHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lID0ga2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX2JncjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzZWxmLT5kZWludGVybGFjZV9mcmFtZSA9IE5VTEw7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9jbGFzc19pbml0IChHc3REZWludGVybGFjZU1ldGhvZENsYXNzICoga2xhc3MpCit7CisgIGtsYXNzLT5zZXR1cCA9IGdzdF9kZWludGVybGFjZV9tZXRob2Rfc2V0dXBfaW1wbDsKKyAga2xhc3MtPnN1cHBvcnRlZCA9IGdzdF9kZWludGVybGFjZV9tZXRob2Rfc3VwcG9ydGVkX2ltcGw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2luaXQgKEdzdERlaW50ZXJsYWNlTWV0aG9kICogc2VsZikKK3sKKyAgc2VsZi0+dmluZm8gPSBOVUxMOworfQorCit2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lIChHc3REZWludGVybGFjZU1ldGhvZCAqIHNlbGYsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VGaWVsZCAqIGhpc3RvcnksIGd1aW50IGhpc3RvcnlfY291bnQsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dGZyYW1lLCBpbnQgY3VyX2ZpZWxkX2lkeCkKK3sKKyAgZ19hc3NlcnQgKHNlbGYtPmRlaW50ZXJsYWNlX2ZyYW1lICE9IE5VTEwpOworICBzZWxmLT5kZWludGVybGFjZV9mcmFtZSAoc2VsZiwgaGlzdG9yeSwgaGlzdG9yeV9jb3VudCwgb3V0ZnJhbWUsCisgICAgICBjdXJfZmllbGRfaWR4KTsKK30KKworZ2ludAorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9nZXRfZmllbGRzX3JlcXVpcmVkIChHc3REZWludGVybGFjZU1ldGhvZCAqIHNlbGYpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKmtsYXNzID0gR1NUX0RFSU5URVJMQUNFX01FVEhPRF9HRVRfQ0xBU1MgKHNlbGYpOworCisgIHJldHVybiBrbGFzcy0+ZmllbGRzX3JlcXVpcmVkOworfQorCitnaW50Citnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dldF9sYXRlbmN5IChHc3REZWludGVybGFjZU1ldGhvZCAqIHNlbGYpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKmtsYXNzID0gR1NUX0RFSU5URVJMQUNFX01FVEhPRF9HRVRfQ0xBU1MgKHNlbGYpOworCisgIHJldHVybiBrbGFzcy0+bGF0ZW5jeTsKK30KKworR19ERUZJTkVfQUJTVFJBQ1RfVFlQRSAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QsCisgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2QsIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRCk7CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2Rfc3VwcG9ydGVkIChHc3REZWludGVybGFjZU1ldGhvZENsYXNzICogbWtsYXNzLAorICAgIEdzdFZpZGVvRm9ybWF0IGZvcm1hdCwgZ2ludCB3aWR0aCwgZ2ludCBoZWlnaHQpCit7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgKmtsYXNzID0KKyAgICAgIEdTVF9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EX0NMQVNTIChta2xhc3MpOworCisgIGlmICghR1NUX0RFSU5URVJMQUNFX01FVEhPRF9DTEFTUworICAgICAgKGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX3BhcmVudF9jbGFzcyktPnN1cHBvcnRlZCAobWtsYXNzLCBmb3JtYXQsCisgICAgICAgICAgd2lkdGgsIGhlaWdodCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FSR0I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hSR0I6CisgICAgICByZXR1cm4gKGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9hcmdiICE9IE5VTEwKKyAgICAgICAgICAmJiBrbGFzcy0+Y29weV9zY2FubGluZV9hcmdiICE9IE5VTEwpOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0J4OgorICAgICAgcmV0dXJuIChrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiYSAhPSBOVUxMCisgICAgICAgICAgJiYga2xhc3MtPmNvcHlfc2NhbmxpbmVfcmdiYSAhPSBOVUxMKTsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQUJHUjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeEJHUjoKKyAgICAgIHJldHVybiAoa2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2FiZ3IgIT0gTlVMTAorICAgICAgICAgICYmIGtsYXNzLT5jb3B5X3NjYW5saW5lX2FiZ3IgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUng6CisgICAgICByZXR1cm4gKGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3JhICE9IE5VTEwKKyAgICAgICAgICAmJiBrbGFzcy0+Y29weV9zY2FubGluZV9iZ3JhICE9IE5VTEwpOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgICByZXR1cm4gKGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9yZ2IgIT0gTlVMTAorICAgICAgICAgICYmIGtsYXNzLT5jb3B5X3NjYW5saW5lX3JnYiAhPSBOVUxMKTsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSOgorICAgICAgcmV0dXJuIChrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyICE9IE5VTEwKKyAgICAgICAgICAmJiBrbGFzcy0+Y29weV9zY2FubGluZV9iZ3IgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lVWTI6CisgICAgICByZXR1cm4gKGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV95dXkyICE9IE5VTEwKKyAgICAgICAgICAmJiBrbGFzcy0+Y29weV9zY2FubGluZV95dXkyICE9IE5VTEwpOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVllVOgorICAgICAgcmV0dXJuIChrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXZ5dSAhPSBOVUxMCisgICAgICAgICAgJiYga2xhc3MtPmNvcHlfc2NhbmxpbmVfeXZ5dSAhPSBOVUxMKTsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfVVlWWToKKyAgICAgIHJldHVybiAoa2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3V5dnkgIT0gTlVMTAorICAgICAgICAgICYmIGtsYXNzLT5jb3B5X3NjYW5saW5lX3V5dnkgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FZVVY6CisgICAgICByZXR1cm4gKGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9heXV2ICE9IE5VTEwKKyAgICAgICAgICAmJiBrbGFzcy0+Y29weV9zY2FubGluZV9heXV2ICE9IE5VTEwpOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9OVjEyOgorICAgICAgcmV0dXJuIChrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYxMiAhPSBOVUxMCisgICAgICAgICAgJiYga2xhc3MtPmNvcHlfc2NhbmxpbmVfbnYxMiAhPSBOVUxMKTsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYyMToKKyAgICAgIHJldHVybiAoa2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MjEgIT0gTlVMTAorICAgICAgICAgICYmIGtsYXNzLT5jb3B5X3NjYW5saW5lX252MjEgIT0gTlVMTCk7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0NDQ6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MkI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MUI6CisgICAgICByZXR1cm4gKGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfeSAhPSBOVUxMCisgICAgICAgICAgJiYga2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3kgIT0gTlVMTCAmJgorICAgICAgICAgIGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdSAhPSBOVUxMCisgICAgICAgICAgJiYga2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3UgIT0gTlVMTCAmJgorICAgICAgICAgIGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdiAhPSBOVUxMCisgICAgICAgICAgJiYga2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3YgIT0gTlVMTCk7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2ludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZAorICAgIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsIGd1aW50OCAqIG91dCwKKyAgICBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc3RyaWRlKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMSwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2NvcHlfc2NhbmxpbmVfcGFja2VkIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqCisgICAgc2VsZiwgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywKKyAgICBndWludCBzdHJpZGUpCit7CisgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0wLCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWVfcGFja2VkIChHc3REZWludGVybGFjZU1ldGhvZCAqCisgICAgbWV0aG9kLCBjb25zdCBHc3REZWludGVybGFjZUZpZWxkICogaGlzdG9yeSwgZ3VpbnQgaGlzdG9yeV9jb3VudCwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0ZnJhbWUsIGdpbnQgY3VyX2ZpZWxkX2lkeCkKK3sKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKnNlbGYgPSBHU1RfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRCAobWV0aG9kKTsKKyNpZm5kZWYgR19ESVNBQkxFX0FTU0VSVAorICBHc3REZWludGVybGFjZU1ldGhvZENsYXNzICpkbV9jbGFzcyA9IEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR0VUX0NMQVNTIChzZWxmKTsKKyNlbmRpZgorICBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSBzY2FubGluZXM7CisgIGd1aW50IGN1cl9maWVsZF9mbGFnczsKKyAgZ2ludCBpOworICBnaW50IGZyYW1lX2hlaWdodCwgZnJhbWVfd2lkdGg7CisgIEdzdFZpZGVvRnJhbWUgKmZyYW1lcCwgKmZyYW1lMCwgKmZyYW1lMSwgKmZyYW1lMjsKKworICBnX2Fzc2VydCAoc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkICE9IE5VTEwpOworICBnX2Fzc2VydCAoc2VsZi0+Y29weV9zY2FubGluZV9wYWNrZWQgIT0gTlVMTCk7CisKKyAgZnJhbWVfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAob3V0ZnJhbWUpOworICBmcmFtZV93aWR0aCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dGZyYW1lLCAwKTsKKworICBmcmFtZTAgPSBoaXN0b3J5W2N1cl9maWVsZF9pZHhdLmZyYW1lOworICBmcmFtZV93aWR0aCA9IE1JTiAoZnJhbWVfd2lkdGgsIEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGZyYW1lMCwgMCkpOworICBjdXJfZmllbGRfZmxhZ3MgPSBoaXN0b3J5W2N1cl9maWVsZF9pZHhdLmZsYWdzOworCisgIGZyYW1lcCA9IChjdXJfZmllbGRfaWR4ID4gMCA/IGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCAtIDFdLmZyYW1lIDogTlVMTCk7CisgIGlmIChmcmFtZXApCisgICAgZnJhbWVfd2lkdGggPSBNSU4gKGZyYW1lX3dpZHRoLCBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZXAsIDApKTsKKworICBnX2Fzc2VydCAoZG1fY2xhc3MtPmZpZWxkc19yZXF1aXJlZCA8PSA0KTsKKworICBmcmFtZTEgPQorICAgICAgKGN1cl9maWVsZF9pZHggKyAxIDwKKyAgICAgIGhpc3RvcnlfY291bnQgPyBoaXN0b3J5W2N1cl9maWVsZF9pZHggKyAxXS5mcmFtZSA6IE5VTEwpOworICBpZiAoZnJhbWUxKQorICAgIGZyYW1lX3dpZHRoID0gTUlOIChmcmFtZV93aWR0aCwgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoZnJhbWUxLCAwKSk7CisKKyAgZnJhbWUyID0KKyAgICAgIChjdXJfZmllbGRfaWR4ICsgMiA8CisgICAgICBoaXN0b3J5X2NvdW50ID8gaGlzdG9yeVtjdXJfZmllbGRfaWR4ICsgMl0uZnJhbWUgOiBOVUxMKTsKKyAgaWYgKGZyYW1lMikKKyAgICBmcmFtZV93aWR0aCA9IE1JTiAoZnJhbWVfd2lkdGgsIEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGZyYW1lMiwgMCkpOworCisjZGVmaW5lIENMQU1QX0xPVyhpKSAoKChpKTwwKSA/IChpKzIpIDogKGkpKQorI2RlZmluZSBDTEFNUF9ISShpKSAoKChpKT49KGZyYW1lX2hlaWdodCkpID8gKGktMikgOiAoaSkpCisjZGVmaW5lIExJTkUoeCxpKSAoKChndWludDgqKUdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBKCh4KSwwKSkgKyBDTEFNUF9ISShDTEFNUF9MT1coaSkpICogXAorICAgIEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUoKHgpLDApKQorI2RlZmluZSBMSU5FMih4LGkpICgoeCkgPyBMSU5FKHgsaSkgOiBOVUxMKQorCisgIGZvciAoaSA9IDA7IGkgPCBmcmFtZV9oZWlnaHQ7IGkrKykgeworICAgIG1lbXNldCAoJnNjYW5saW5lcywgMCwgc2l6ZW9mIChzY2FubGluZXMpKTsKKyAgICBzY2FubGluZXMuYm90dG9tX2ZpZWxkID0gKGN1cl9maWVsZF9mbGFncyA9PSBQSUNUVVJFX0lOVEVSTEFDRURfQk9UVE9NKTsKKworICAgIGlmICghKChpICYgMSkgXiBzY2FubGluZXMuYm90dG9tX2ZpZWxkKSkgeworICAgICAgLyogY29weWluZyAqLworICAgICAgc2NhbmxpbmVzLnRwID0gTElORTIgKGZyYW1lcCwgaSAtIDEpOworICAgICAgc2NhbmxpbmVzLmJwID0gTElORTIgKGZyYW1lcCwgaSArIDEpOworCisgICAgICBzY2FubGluZXMudHQwID0gTElORTIgKGZyYW1lMCwgKGkgLSAyID49IDApID8gaSAtIDIgOiBpKTsKKyAgICAgIHNjYW5saW5lcy5tMCA9IExJTkUyIChmcmFtZTAsIGkpOworICAgICAgc2NhbmxpbmVzLmJiMCA9IExJTkUyIChmcmFtZTAsIChpICsgMiA8IGZyYW1lX2hlaWdodCA/IGkgKyAyIDogaSkpOworCisgICAgICBzY2FubGluZXMudDEgPSBMSU5FMiAoZnJhbWUxLCBpIC0gMSk7CisgICAgICBzY2FubGluZXMuYjEgPSBMSU5FMiAoZnJhbWUxLCBpICsgMSk7CisKKyAgICAgIHNjYW5saW5lcy50dDIgPSBMSU5FMiAoZnJhbWUyLCAoaSAtIDIgPj0gMCkgPyBpIC0gMiA6IGkpOworICAgICAgc2NhbmxpbmVzLm0yID0gTElORTIgKGZyYW1lMiwgaSk7CisgICAgICBzY2FubGluZXMuYmIyID0gTElORTIgKGZyYW1lMiwgKGkgKyAyIDwgZnJhbWVfaGVpZ2h0ID8gaSArIDIgOiBpKSk7CisKKyAgICAgIHNlbGYtPmNvcHlfc2NhbmxpbmVfcGFja2VkIChzZWxmLCBMSU5FIChvdXRmcmFtZSwgaSksICZzY2FubGluZXMsCisgICAgICAgICAgZnJhbWVfd2lkdGgpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBpbnRlcnBvbGF0aW5nICovCisgICAgICBzY2FubGluZXMudHRwID0gTElORTIgKGZyYW1lcCwgKGkgLSAyID49IDApID8gaSAtIDIgOiBpKTsKKyAgICAgIHNjYW5saW5lcy5tcCA9IExJTkUyIChmcmFtZXAsIGkpOworICAgICAgc2NhbmxpbmVzLmJicCA9IExJTkUyIChmcmFtZXAsIChpICsgMiA8IGZyYW1lX2hlaWdodCA/IGkgKyAyIDogaSkpOworCisgICAgICBzY2FubGluZXMudDAgPSBMSU5FMiAoZnJhbWUwLCBpIC0gMSk7CisgICAgICBzY2FubGluZXMuYjAgPSBMSU5FMiAoZnJhbWUwLCBpICsgMSk7CisKKyAgICAgIHNjYW5saW5lcy50dDEgPSBMSU5FMiAoZnJhbWUxLCAoaSAtIDIgPj0gMCkgPyBpIC0gMiA6IGkpOworICAgICAgc2NhbmxpbmVzLm0xID0gTElORTIgKGZyYW1lMSwgaSk7CisgICAgICBzY2FubGluZXMuYmIxID0gTElORTIgKGZyYW1lMSwgKGkgKyAyIDwgZnJhbWVfaGVpZ2h0ID8gaSArIDIgOiBpKSk7CisKKyAgICAgIHNjYW5saW5lcy50MiA9IExJTkUyIChmcmFtZTIsIGkgLSAxKTsKKyAgICAgIHNjYW5saW5lcy5iMiA9IExJTkUyIChmcmFtZTIsIGkgKyAxKTsKKworICAgICAgc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkIChzZWxmLCBMSU5FIChvdXRmcmFtZSwgaSksICZzY2FubGluZXMsCisgICAgICAgICAgZnJhbWVfd2lkdGgpOworICAgIH0KKyN1bmRlZiBMSU5FCisjdW5kZWYgTElORTIKKyAgfQorfQorCitzdGF0aWMgdm9pZAorICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2ludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl95CisgICAgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwgZ3VpbnQ4ICogb3V0LAorICAgIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMSwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9jb3B5X3NjYW5saW5lX3BsYW5hcl95IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZAorICAgICogc2VsZiwgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQKKyAgICBzaXplKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCisgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfaW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3UKKyAgICAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBvdXQsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0xLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2NvcHlfc2NhbmxpbmVfcGxhbmFyX3UgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kCisgICAgKiBzZWxmLCBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludAorICAgIHNpemUpCit7CisgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0wLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKKyAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdgorICAgIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsIGd1aW50OCAqIG91dCwKKyAgICBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTEsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfY29weV9zY2FubGluZV9wbGFuYXJfdiAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QKKyAgICAqIHNlbGYsIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50CisgICAgc2l6ZSkKK3sKKyAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTAsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lX3BsYW5hcl9wbGFuZQorICAgIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsIEdzdFZpZGVvRnJhbWUgKiBkZXN0LAorICAgIGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBmcmFtZTAsIGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBmcmFtZTEsCisgICAgY29uc3QgR3N0VmlkZW9GcmFtZSAqIGZyYW1lMiwgY29uc3QgR3N0VmlkZW9GcmFtZSAqIGZyYW1lcCwKKyAgICBndWludCBjdXJfZmllbGRfZmxhZ3MsIGdpbnQgcGxhbmUsCisgICAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lLAorICAgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmUpCit7CisgIEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhIHNjYW5saW5lczsKKyAgZ2ludCBpOworICBnaW50IGZyYW1lX2hlaWdodCwgZnJhbWVfd2lkdGg7CisKKyAgZnJhbWVfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChkZXN0LCBwbGFuZSk7CisgIGZyYW1lX3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGRlc3QsIHBsYW5lKSAqCisgICAgICBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChkZXN0LCBwbGFuZSk7CisKKyAgZ19hc3NlcnQgKGludGVycG9sYXRlX3NjYW5saW5lICE9IE5VTEwpOworICBnX2Fzc2VydCAoY29weV9zY2FubGluZSAhPSBOVUxMKTsKKworI2RlZmluZSBMSU5FKHgsaSkgKCgoZ3VpbnQ4KilHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSgoeCkscGxhbmUpKSArIENMQU1QX0hJKENMQU1QX0xPVyhpKSkgKiBcCisgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSgoeCkscGxhbmUpKQorI2RlZmluZSBMSU5FMih4LGkpICgoeCkgPyBMSU5FKHgsaSkgOiBOVUxMKQorCisgIGZvciAoaSA9IDA7IGkgPCBmcmFtZV9oZWlnaHQ7IGkrKykgeworICAgIG1lbXNldCAoJnNjYW5saW5lcywgMCwgc2l6ZW9mIChzY2FubGluZXMpKTsKKyAgICBzY2FubGluZXMuYm90dG9tX2ZpZWxkID0gKGN1cl9maWVsZF9mbGFncyA9PSBQSUNUVVJFX0lOVEVSTEFDRURfQk9UVE9NKTsKKworICAgIGlmICghKChpICYgMSkgXiBzY2FubGluZXMuYm90dG9tX2ZpZWxkKSkgeworICAgICAgLyogY29weWluZyAqLworICAgICAgc2NhbmxpbmVzLnRwID0gTElORTIgKGZyYW1lcCwgaSAtIDEpOworICAgICAgc2NhbmxpbmVzLmJwID0gTElORTIgKGZyYW1lcCwgaSArIDEpOworCisgICAgICBzY2FubGluZXMudHQwID0gTElORTIgKGZyYW1lMCwgKGkgLSAyID49IDApID8gaSAtIDIgOiBpKTsKKyAgICAgIHNjYW5saW5lcy5tMCA9IExJTkUyIChmcmFtZTAsIGkpOworICAgICAgc2NhbmxpbmVzLmJiMCA9IExJTkUyIChmcmFtZTAsIChpICsgMiA8IGZyYW1lX2hlaWdodCA/IGkgKyAyIDogaSkpOworCisgICAgICBzY2FubGluZXMudDEgPSBMSU5FMiAoZnJhbWUxLCBpIC0gMSk7CisgICAgICBzY2FubGluZXMuYjEgPSBMSU5FMiAoZnJhbWUxLCBpICsgMSk7CisKKyAgICAgIHNjYW5saW5lcy50dDIgPSBMSU5FMiAoZnJhbWUyLCAoaSAtIDIgPj0gMCkgPyBpIC0gMiA6IGkpOworICAgICAgc2NhbmxpbmVzLm0yID0gTElORTIgKGZyYW1lMiwgaSk7CisgICAgICBzY2FubGluZXMuYmIyID0gTElORTIgKGZyYW1lMiwgKGkgKyAyIDwgZnJhbWVfaGVpZ2h0ID8gaSArIDIgOiBpKSk7CisKKyAgICAgIGNvcHlfc2NhbmxpbmUgKHNlbGYsIExJTkUgKGRlc3QsIGkpLCAmc2NhbmxpbmVzLCBmcmFtZV93aWR0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGludGVycG9sYXRpbmcgKi8KKyAgICAgIHNjYW5saW5lcy50dHAgPSBMSU5FMiAoZnJhbWVwLCAoaSAtIDIgPj0gMCkgPyBpIC0gMiA6IGkpOworICAgICAgc2NhbmxpbmVzLm1wID0gTElORTIgKGZyYW1lcCwgaSk7CisgICAgICBzY2FubGluZXMuYmJwID0gTElORTIgKGZyYW1lcCwgKGkgKyAyIDwgZnJhbWVfaGVpZ2h0ID8gaSArIDIgOiBpKSk7CisKKyAgICAgIHNjYW5saW5lcy50MCA9IExJTkUyIChmcmFtZTAsIGkgLSAxKTsKKyAgICAgIHNjYW5saW5lcy5iMCA9IExJTkUyIChmcmFtZTAsIGkgKyAxKTsKKworICAgICAgc2NhbmxpbmVzLnR0MSA9IExJTkUyIChmcmFtZTEsIChpIC0gMiA+PSAwKSA/IGkgLSAyIDogaSk7CisgICAgICBzY2FubGluZXMubTEgPSBMSU5FMiAoZnJhbWUxLCBpKTsKKyAgICAgIHNjYW5saW5lcy5iYjEgPSBMSU5FMiAoZnJhbWUxLCAoaSArIDIgPCBmcmFtZV9oZWlnaHQgPyBpICsgMiA6IGkpKTsKKworICAgICAgc2NhbmxpbmVzLnQyID0gTElORTIgKGZyYW1lMiwgaSAtIDEpOworICAgICAgc2NhbmxpbmVzLmIyID0gTElORTIgKGZyYW1lMiwgaSArIDEpOworCisgICAgICBpbnRlcnBvbGF0ZV9zY2FubGluZSAoc2VsZiwgTElORSAoZGVzdCwgaSksICZzY2FubGluZXMsIGZyYW1lX3dpZHRoKTsKKyAgICB9CisjdW5kZWYgTElORQorI3VuZGVmIExJTkUyCisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lX3BsYW5hciAoR3N0RGVpbnRlcmxhY2VNZXRob2QgKgorICAgIG1ldGhvZCwgY29uc3QgR3N0RGVpbnRlcmxhY2VGaWVsZCAqIGhpc3RvcnksIGd1aW50IGhpc3RvcnlfY291bnQsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dGZyYW1lLCBnaW50IGN1cl9maWVsZF9pZHgpCit7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICpzZWxmID0gR1NUX0RFSU5URVJMQUNFX1NJTVBMRV9NRVRIT0QgKG1ldGhvZCk7CisjaWZuZGVmIEdfRElTQUJMRV9BU1NFUlQKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqZG1fY2xhc3MgPSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0dFVF9DTEFTUyAoc2VsZik7CisjZW5kaWYKKyAgY29uc3QgR3N0VmlkZW9GcmFtZSAqZnJhbWUwLCAqZnJhbWUxLCAqZnJhbWUyLCAqZnJhbWVwOworICBndWludCBjdXJfZmllbGRfZmxhZ3MgPSBoaXN0b3J5W2N1cl9maWVsZF9pZHhdLmZsYWdzOworICBnaW50IGk7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gY29weV9zY2FubGluZTsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBpbnRlcnBvbGF0ZV9zY2FubGluZTsKKworICBnX2Fzc2VydCAoc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyWzBdICE9IE5VTEwpOworICBnX2Fzc2VydCAoc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyWzFdICE9IE5VTEwpOworICBnX2Fzc2VydCAoc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyWzJdICE9IE5VTEwpOworICBnX2Fzc2VydCAoc2VsZi0+Y29weV9zY2FubGluZV9wbGFuYXJbMF0gIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChzZWxmLT5jb3B5X3NjYW5saW5lX3BsYW5hclsxXSAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKHNlbGYtPmNvcHlfc2NhbmxpbmVfcGxhbmFyWzJdICE9IE5VTEwpOworCisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBjb3B5X3NjYW5saW5lID0gc2VsZi0+Y29weV9zY2FubGluZV9wbGFuYXJbaV07CisgICAgaW50ZXJwb2xhdGVfc2NhbmxpbmUgPSBzZWxmLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJbaV07CisKKyAgICBmcmFtZXAgPSAoY3VyX2ZpZWxkX2lkeCA+IDAgPyBoaXN0b3J5W2N1cl9maWVsZF9pZHggLSAxXS5mcmFtZSA6IE5VTEwpOworCisgICAgZnJhbWUwID0gaGlzdG9yeVtjdXJfZmllbGRfaWR4XS5mcmFtZTsKKworICAgIGdfYXNzZXJ0IChkbV9jbGFzcy0+ZmllbGRzX3JlcXVpcmVkIDw9IDQpOworCisgICAgZnJhbWUxID0KKyAgICAgICAgKGN1cl9maWVsZF9pZHggKyAxIDwKKyAgICAgICAgaGlzdG9yeV9jb3VudCA/IGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCArIDFdLmZyYW1lIDogTlVMTCk7CisgICAgZnJhbWUyID0KKyAgICAgICAgKGN1cl9maWVsZF9pZHggKyAyIDwKKyAgICAgICAgaGlzdG9yeV9jb3VudCA/IGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCArIDJdLmZyYW1lIDogTlVMTCk7CisKKyAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZV9wbGFuYXJfcGxhbmUgKHNlbGYsCisgICAgICAgIG91dGZyYW1lLCBmcmFtZTAsIGZyYW1lMSwgZnJhbWUyLCBmcmFtZXAsIGN1cl9maWVsZF9mbGFncywgaSwKKyAgICAgICAgY29weV9zY2FubGluZSwgaW50ZXJwb2xhdGVfc2NhbmxpbmUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZV9udjEyIChHc3REZWludGVybGFjZU1ldGhvZCAqCisgICAgbWV0aG9kLCBjb25zdCBHc3REZWludGVybGFjZUZpZWxkICogaGlzdG9yeSwgZ3VpbnQgaGlzdG9yeV9jb3VudCwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0ZnJhbWUsIGdpbnQgY3VyX2ZpZWxkX2lkeCkKK3sKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKnNlbGYgPSBHU1RfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRCAobWV0aG9kKTsKKyNpZm5kZWYgR19ESVNBQkxFX0FTU0VSVAorICBHc3REZWludGVybGFjZU1ldGhvZENsYXNzICpkbV9jbGFzcyA9IEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR0VUX0NMQVNTIChzZWxmKTsKKyNlbmRpZgorICBjb25zdCBHc3RWaWRlb0ZyYW1lICpmcmFtZTAsICpmcmFtZTEsICpmcmFtZTIsICpmcmFtZXA7CisgIGd1aW50IGN1cl9maWVsZF9mbGFncyA9IGhpc3RvcnlbY3VyX2ZpZWxkX2lkeF0uZmxhZ3M7CisgIGdpbnQgaTsKKworICBnX2Fzc2VydCAoc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkICE9IE5VTEwpOworICBnX2Fzc2VydCAoc2VsZi0+Y29weV9zY2FubGluZV9wYWNrZWQgIT0gTlVMTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgIGZyYW1lcCA9IChjdXJfZmllbGRfaWR4ID4gMCA/IGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCAtIDFdLmZyYW1lIDogTlVMTCk7CisKKyAgICBmcmFtZTAgPSBoaXN0b3J5W2N1cl9maWVsZF9pZHhdLmZyYW1lOworCisgICAgZ19hc3NlcnQgKGRtX2NsYXNzLT5maWVsZHNfcmVxdWlyZWQgPD0gNCk7CisKKyAgICBmcmFtZTEgPQorICAgICAgICAoY3VyX2ZpZWxkX2lkeCArIDEgPAorICAgICAgICBoaXN0b3J5X2NvdW50ID8gaGlzdG9yeVtjdXJfZmllbGRfaWR4ICsgMV0uZnJhbWUgOiBOVUxMKTsKKyAgICBmcmFtZTIgPQorICAgICAgICAoY3VyX2ZpZWxkX2lkeCArIDIgPAorICAgICAgICBoaXN0b3J5X2NvdW50ID8gaGlzdG9yeVtjdXJfZmllbGRfaWR4ICsgMl0uZnJhbWUgOiBOVUxMKTsKKworICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lX3BsYW5hcl9wbGFuZSAoc2VsZiwKKyAgICAgICAgb3V0ZnJhbWUsIGZyYW1lMCwgZnJhbWUxLCBmcmFtZTIsIGZyYW1lcCwgY3VyX2ZpZWxkX2ZsYWdzLCBpLAorICAgICAgICBzZWxmLT5jb3B5X3NjYW5saW5lX3BhY2tlZCwgc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2Rfc2V0dXAgKEdzdERlaW50ZXJsYWNlTWV0aG9kICogbWV0aG9kLAorICAgIEdzdFZpZGVvSW5mbyAqIHZpbmZvKQoreworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EIChtZXRob2QpOworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzICprbGFzcyA9CisgICAgICBHU1RfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRF9HRVRfQ0xBU1MgKHNlbGYpOworCisgIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfQ0xBU1MKKyAgICAgIChnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9wYXJlbnRfY2xhc3MpLT5zZXR1cCAobWV0aG9kLCB2aW5mbyk7CisKKyAgc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkID0gTlVMTDsKKyAgc2VsZi0+Y29weV9zY2FubGluZV9wYWNrZWQgPSBOVUxMOworCisgIHNlbGYtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hclswXSA9IE5VTEw7CisgIHNlbGYtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hclsxXSA9IE5VTEw7CisgIHNlbGYtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hclsyXSA9IE5VTEw7CisgIHNlbGYtPmNvcHlfc2NhbmxpbmVfcGxhbmFyWzBdID0gTlVMTDsKKyAgc2VsZi0+Y29weV9zY2FubGluZV9wbGFuYXJbMV0gPSBOVUxMOworICBzZWxmLT5jb3B5X3NjYW5saW5lX3BsYW5hclsyXSA9IE5VTEw7CisKKyAgaWYgKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAodmluZm8pID09IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTikKKyAgICByZXR1cm47CisKKyAgc3dpdGNoIChHU1RfVklERU9fSU5GT19GT1JNQVQgKHZpbmZvKSkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOgorICAgICAgc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkID0ga2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3l1eTI7CisgICAgICBzZWxmLT5jb3B5X3NjYW5saW5lX3BhY2tlZCA9IGtsYXNzLT5jb3B5X3NjYW5saW5lX3l1eTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVZZVToKKyAgICAgIHNlbGYtPmludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZCA9IGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV95dnl1OworICAgICAgc2VsZi0+Y29weV9zY2FubGluZV9wYWNrZWQgPSBrbGFzcy0+Y29weV9zY2FubGluZV95dnl1OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICBzZWxmLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wYWNrZWQgPSBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfdXl2eTsKKyAgICAgIHNlbGYtPmNvcHlfc2NhbmxpbmVfcGFja2VkID0ga2xhc3MtPmNvcHlfc2NhbmxpbmVfdXl2eTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkID0ga2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2F5dXY7CisgICAgICBzZWxmLT5jb3B5X3NjYW5saW5lX3BhY2tlZCA9IGtsYXNzLT5jb3B5X3NjYW5saW5lX2F5dXY7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeFJHQjoKKyAgICAgIHNlbGYtPmludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZCA9IGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9hcmdiOworICAgICAgc2VsZi0+Y29weV9zY2FubGluZV9wYWNrZWQgPSBrbGFzcy0+Y29weV9zY2FubGluZV9hcmdiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hCR1I6CisgICAgICBzZWxmLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wYWNrZWQgPSBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYWJncjsKKyAgICAgIHNlbGYtPmNvcHlfc2NhbmxpbmVfcGFja2VkID0ga2xhc3MtPmNvcHlfc2NhbmxpbmVfYWJncjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0J4OgorICAgICAgc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkID0ga2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3JnYmE7CisgICAgICBzZWxmLT5jb3B5X3NjYW5saW5lX3BhY2tlZCA9IGtsYXNzLT5jb3B5X3NjYW5saW5lX3JnYmE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSeDoKKyAgICAgIHNlbGYtPmludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZCA9IGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3JhOworICAgICAgc2VsZi0+Y29weV9zY2FubGluZV9wYWNrZWQgPSBrbGFzcy0+Y29weV9zY2FubGluZV9iZ3JhOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQjoKKyAgICAgIHNlbGYtPmludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZCA9IGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9yZ2I7CisgICAgICBzZWxmLT5jb3B5X3NjYW5saW5lX3BhY2tlZCA9IGtsYXNzLT5jb3B5X3NjYW5saW5lX3JnYjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1I6CisgICAgICBzZWxmLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wYWNrZWQgPSBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyOworICAgICAgc2VsZi0+Y29weV9zY2FubGluZV9wYWNrZWQgPSBrbGFzcy0+Y29weV9zY2FubGluZV9iZ3I7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYxMjoKKyAgICAgIHNlbGYtPmludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZCA9IGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9udjEyOworICAgICAgc2VsZi0+Y29weV9zY2FubGluZV9wYWNrZWQgPSBrbGFzcy0+Y29weV9zY2FubGluZV9udjEyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX05WMjE6CisgICAgICBzZWxmLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wYWNrZWQgPSBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYyMTsKKyAgICAgIHNlbGYtPmNvcHlfc2NhbmxpbmVfcGFja2VkID0ga2xhc3MtPmNvcHlfc2NhbmxpbmVfbnYyMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVjEyOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDQ0OgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDFCOgorICAgICAgc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyWzBdID0KKyAgICAgICAgICBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3k7CisgICAgICBzZWxmLT5jb3B5X3NjYW5saW5lX3BsYW5hclswXSA9IGtsYXNzLT5jb3B5X3NjYW5saW5lX3BsYW5hcl95OworICAgICAgc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyWzFdID0KKyAgICAgICAgICBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3U7CisgICAgICBzZWxmLT5jb3B5X3NjYW5saW5lX3BsYW5hclsxXSA9IGtsYXNzLT5jb3B5X3NjYW5saW5lX3BsYW5hcl91OworICAgICAgc2VsZi0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyWzJdID0KKyAgICAgICAgICBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3Y7CisgICAgICBzZWxmLT5jb3B5X3NjYW5saW5lX3BsYW5hclsyXSA9IGtsYXNzLT5jb3B5X3NjYW5saW5lX3BsYW5hcl92OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9jbGFzc19pbml0IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzCisgICAgKiBrbGFzcykKK3sKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqZG1fY2xhc3MgPSAoR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqKSBrbGFzczsKKworICBkbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfYXl1diA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZV9wYWNrZWQ7CisgIGRtX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV95dXkyID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lX3BhY2tlZDsKKyAgZG1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l2eXUgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWVfcGFja2VkOworICBkbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfdXl2eSA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZV9wYWNrZWQ7CisgIGRtX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV9hcmdiID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lX3BhY2tlZDsKKyAgZG1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX2FiZ3IgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWVfcGFja2VkOworICBkbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfcmdiYSA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZV9wYWNrZWQ7CisgIGRtX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV9iZ3JhID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lX3BhY2tlZDsKKyAgZG1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3JnYiA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZV9wYWNrZWQ7CisgIGRtX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV9iZ3IgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWVfcGFja2VkOworICBkbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfaTQyMCA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZV9wbGFuYXI7CisgIGRtX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV95djEyID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lX3BsYW5hcjsKKyAgZG1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3k0NDQgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWVfcGxhbmFyOworICBkbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfeTQyYiA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZV9wbGFuYXI7CisgIGRtX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV95NDFiID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lX3BsYW5hcjsKKyAgZG1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX252MTIgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWVfbnYxMjsKKyAgZG1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX252MjEgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWVfbnYxMjsKKyAgZG1fY2xhc3MtPmZpZWxkc19yZXF1aXJlZCA9IDI7CisgIGRtX2NsYXNzLT5zZXR1cCA9IGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX3NldHVwOworICBkbV9jbGFzcy0+c3VwcG9ydGVkID0gZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2Rfc3VwcG9ydGVkOworCisgIGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV95dXkyID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2ludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZDsKKyAga2xhc3MtPmNvcHlfc2NhbmxpbmVfeXV5MiA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9jb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAga2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3l2eXUgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfaW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkOworICBrbGFzcy0+Y29weV9zY2FubGluZV95dnl1ID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2NvcHlfc2NhbmxpbmVfcGFja2VkOworICBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYXl1diA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9pbnRlcnBvbGF0ZV9zY2FubGluZV9wYWNrZWQ7CisgIGtsYXNzLT5jb3B5X3NjYW5saW5lX2F5dXYgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV91eXZ5ID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2ludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZDsKKyAga2xhc3MtPmNvcHlfc2NhbmxpbmVfdXl2eSA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9jb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAga2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MTIgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfaW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkOworICBrbGFzcy0+Y29weV9zY2FubGluZV9udjEyID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2NvcHlfc2NhbmxpbmVfcGFja2VkOworCisgIGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9hcmdiID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2ludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZDsKKyAga2xhc3MtPmNvcHlfc2NhbmxpbmVfYXJnYiA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9jb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAga2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2FiZ3IgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfaW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkOworICBrbGFzcy0+Y29weV9zY2FubGluZV9hYmdyID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2NvcHlfc2NhbmxpbmVfcGFja2VkOworCisgIGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9yZ2JhID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2ludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZDsKKyAga2xhc3MtPmNvcHlfc2NhbmxpbmVfcmdiYSA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9jb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAga2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2JncmEgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfaW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkOworICBrbGFzcy0+Y29weV9zY2FubGluZV9iZ3JhID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2NvcHlfc2NhbmxpbmVfcGFja2VkOworICBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2ludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZDsKKyAga2xhc3MtPmNvcHlfc2NhbmxpbmVfcmdiID0gZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3IgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfaW50ZXJwb2xhdGVfc2NhbmxpbmVfcGFja2VkOworICBrbGFzcy0+Y29weV9zY2FubGluZV9iZ3IgPSBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9jb3B5X3NjYW5saW5lX3BhY2tlZDsKKworICBrbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3kgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfaW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3k7CisgIGtsYXNzLT5jb3B5X3NjYW5saW5lX3BsYW5hcl95ID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2NvcHlfc2NhbmxpbmVfcGxhbmFyX3k7CisgIGtsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdSA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdTsKKyAga2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3UgPQorICAgICAgZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfY29weV9zY2FubGluZV9wbGFuYXJfdTsKKyAga2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl92ID0KKyAgICAgIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2ludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl92OworICBrbGFzcy0+Y29weV9zY2FubGluZV9wbGFuYXJfdiA9CisgICAgICBnc3RfZGVpbnRlcmxhY2Vfc2ltcGxlX21ldGhvZF9jb3B5X3NjYW5saW5lX3BsYW5hcl92OworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX3NpbXBsZV9tZXRob2RfaW5pdCAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmKQoreworfQpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmggYi9nc3QvZGVpbnRlcmxhY2UvZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTY0NjMyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL2dzdGRlaW50ZXJsYWNlbWV0aG9kLmgKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0RFSU5URVJMQUNFX01FVEhPRF9IX18KKyNkZWZpbmUgX19HU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaWYgZGVmaW5lZChIQVZFX0dDQ19BU00pICYmIGRlZmluZWQoSEFWRV9PUkMpCisjaWYgZGVmaW5lZChIQVZFX0NQVV9JMzg2KSB8fCBkZWZpbmVkKEhBVkVfQ1BVX1g4Nl82NCkKKyNkZWZpbmUgQlVJTERfWDg2X0FTTQorI2VuZGlmCisjZW5kaWYKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRAkJKGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9JU19ERUlOVEVSTEFDRV9NRVRIT0Qob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9DTEFTUyhrbGFzcykJKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0QpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0dFVF9DTEFTUyhvYmopCShHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9ELCBHc3REZWludGVybGFjZU1ldGhvZENsYXNzKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRChvYmopCQkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0QsIEdzdERlaW50ZXJsYWNlTWV0aG9kKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9DTEFTUyhrbGFzcykJKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0QsIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0NBU1Qob2JqKQkoKEdzdERlaW50ZXJsYWNlTWV0aG9kKikob2JqKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdERlaW50ZXJsYWNlTWV0aG9kIEdzdERlaW50ZXJsYWNlTWV0aG9kOwordHlwZWRlZiBzdHJ1Y3QgX0dzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzczsKKworCisjZGVmaW5lIFBJQ1RVUkVfUFJPR1JFU1NJVkUgMAorI2RlZmluZSBQSUNUVVJFX0lOVEVSTEFDRURfQk9UVE9NIDEKKyNkZWZpbmUgUElDVFVSRV9JTlRFUkxBQ0VEX1RPUCAyCisjZGVmaW5lIFBJQ1RVUkVfSU5URVJMQUNFRF9NQVNLIChQSUNUVVJFX0lOVEVSTEFDRURfQk9UVE9NIHwgUElDVFVSRV9JTlRFUkxBQ0VEX1RPUCkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0VmlkZW9GcmFtZSAqZnJhbWU7CisgIC8qIHNlZSBQSUNUVVJFXyBmbGFncyBpbiAqLmMgKi8KKyAgZ3VpbnQgZmxhZ3M7Cit9IEdzdERlaW50ZXJsYWNlRmllbGQ7CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBkZWludGVybGFjZXIgcGx1Z2luLgorICovCisKK3R5cGVkZWYgdm9pZCAoKkdzdERlaW50ZXJsYWNlTWV0aG9kRGVpbnRlcmxhY2VGdW5jdGlvbikgKAorICAgIEdzdERlaW50ZXJsYWNlTWV0aG9kICpzZWxmLCBjb25zdCBHc3REZWludGVybGFjZUZpZWxkICpoaXN0b3J5LAorICAgIGd1aW50IGhpc3RvcnlfY291bnQsIEdzdFZpZGVvRnJhbWUgKm91dGZyYW1lLCBpbnQgY3VyX2ZpZWxkX2lkeCk7CisKK3N0cnVjdCBfR3N0RGVpbnRlcmxhY2VNZXRob2QgeworICBHc3RPYmplY3QgcGFyZW50OworCisgIEdzdFZpZGVvSW5mbyAqdmluZm87CisKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2REZWludGVybGFjZUZ1bmN0aW9uIGRlaW50ZXJsYWNlX2ZyYW1lOworfTsKKworc3RydWN0IF9Hc3REZWludGVybGFjZU1ldGhvZENsYXNzIHsKKyAgR3N0T2JqZWN0Q2xhc3MgcGFyZW50X2NsYXNzOworICBndWludCBmaWVsZHNfcmVxdWlyZWQ7CisgIGd1aW50IGxhdGVuY3k7CisKKyAgZ2Jvb2xlYW4gKCpzdXBwb3J0ZWQpIChHc3REZWludGVybGFjZU1ldGhvZENsYXNzICprbGFzcywgR3N0VmlkZW9Gb3JtYXQgZm9ybWF0LCBnaW50IHdpZHRoLCBnaW50IGhlaWdodCk7CisKKyAgdm9pZCAoKnNldHVwKSAoR3N0RGVpbnRlcmxhY2VNZXRob2QgKnNlbGYsIEdzdFZpZGVvSW5mbyAqIHZpbmZvKTsKKworICBHc3REZWludGVybGFjZU1ldGhvZERlaW50ZXJsYWNlRnVuY3Rpb24gZGVpbnRlcmxhY2VfZnJhbWVfeXV5MjsKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2REZWludGVybGFjZUZ1bmN0aW9uIGRlaW50ZXJsYWNlX2ZyYW1lX3l2eXU7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kRGVpbnRlcmxhY2VGdW5jdGlvbiBkZWludGVybGFjZV9mcmFtZV91eXZ5OworICBHc3REZWludGVybGFjZU1ldGhvZERlaW50ZXJsYWNlRnVuY3Rpb24gZGVpbnRlcmxhY2VfZnJhbWVfaTQyMDsKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2REZWludGVybGFjZUZ1bmN0aW9uIGRlaW50ZXJsYWNlX2ZyYW1lX3l2MTI7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kRGVpbnRlcmxhY2VGdW5jdGlvbiBkZWludGVybGFjZV9mcmFtZV95NDQ0OworICBHc3REZWludGVybGFjZU1ldGhvZERlaW50ZXJsYWNlRnVuY3Rpb24gZGVpbnRlcmxhY2VfZnJhbWVfeTQyYjsKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2REZWludGVybGFjZUZ1bmN0aW9uIGRlaW50ZXJsYWNlX2ZyYW1lX3k0MWI7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kRGVpbnRlcmxhY2VGdW5jdGlvbiBkZWludGVybGFjZV9mcmFtZV9heXV2OworICBHc3REZWludGVybGFjZU1ldGhvZERlaW50ZXJsYWNlRnVuY3Rpb24gZGVpbnRlcmxhY2VfZnJhbWVfbnYxMjsKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2REZWludGVybGFjZUZ1bmN0aW9uIGRlaW50ZXJsYWNlX2ZyYW1lX252MjE7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kRGVpbnRlcmxhY2VGdW5jdGlvbiBkZWludGVybGFjZV9mcmFtZV9hcmdiOworICBHc3REZWludGVybGFjZU1ldGhvZERlaW50ZXJsYWNlRnVuY3Rpb24gZGVpbnRlcmxhY2VfZnJhbWVfYWJncjsKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2REZWludGVybGFjZUZ1bmN0aW9uIGRlaW50ZXJsYWNlX2ZyYW1lX3JnYmE7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kRGVpbnRlcmxhY2VGdW5jdGlvbiBkZWludGVybGFjZV9mcmFtZV9iZ3JhOworICBHc3REZWludGVybGFjZU1ldGhvZERlaW50ZXJsYWNlRnVuY3Rpb24gZGVpbnRlcmxhY2VfZnJhbWVfcmdiOworICBHc3REZWludGVybGFjZU1ldGhvZERlaW50ZXJsYWNlRnVuY3Rpb24gZGVpbnRlcmxhY2VfZnJhbWVfYmdyOworCisgIGNvbnN0IGdjaGFyICpuYW1lOworICBjb25zdCBnY2hhciAqbmljazsKK307CisKK0dUeXBlIGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3N1cHBvcnRlZCAoR1R5cGUgdHlwZSwgR3N0VmlkZW9Gb3JtYXQgZm9ybWF0LCBnaW50IHdpZHRoLCBnaW50IGhlaWdodCk7Cit2b2lkIGdzdF9kZWludGVybGFjZV9tZXRob2Rfc2V0dXAgKEdzdERlaW50ZXJsYWNlTWV0aG9kICogc2VsZiwgR3N0VmlkZW9JbmZvICogdmluZm8pOwordm9pZCBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2RlaW50ZXJsYWNlX2ZyYW1lIChHc3REZWludGVybGFjZU1ldGhvZCAqIHNlbGYsIGNvbnN0IEdzdERlaW50ZXJsYWNlRmllbGQgKiBoaXN0b3J5LCBndWludCBoaXN0b3J5X2NvdW50LCBHc3RWaWRlb0ZyYW1lICogb3V0ZnJhbWUsCisgICAgaW50IGN1cl9maWVsZF9pZHgpOworZ2ludCBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dldF9maWVsZHNfcmVxdWlyZWQgKEdzdERlaW50ZXJsYWNlTWV0aG9kICogc2VsZik7CitnaW50IGdzdF9kZWludGVybGFjZV9tZXRob2RfZ2V0X2xhdGVuY3kgKEdzdERlaW50ZXJsYWNlTWV0aG9kICogc2VsZik7CisKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRAkJKGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfSVNfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRChvYmopCQkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX1NJTVBMRV9NRVRIT0RfQ0xBU1Moa2xhc3MpCShHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRCkpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EX0dFVF9DTEFTUyhvYmopCShHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRCwgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RDbGFzcykpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EKG9iaikJCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0RFSU5URVJMQUNFX1NJTVBMRV9NRVRIT0QsIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX1NJTVBMRV9NRVRIT0RfQ0xBU1Moa2xhc3MpCShHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRCwgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RDbGFzcykpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EX0NBU1Qob2JqKQkoKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kKikob2JqKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kOwordHlwZWRlZiBzdHJ1Y3QgX0dzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RDbGFzczsKK3R5cGVkZWYgc3RydWN0IF9Hc3REZWludGVybGFjZVNjYW5saW5lRGF0YSBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YTsKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHNpbXBsZSBkZWludGVybGFjZXIgcGx1Z2luLgorICovCisKK3N0cnVjdCBfR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgeworIGNvbnN0IGd1aW50OCAqdHRwLCAqdHAsICptcCwgKmJwLCAqYmJwOworIGNvbnN0IGd1aW50OCAqdHQwLCAqdDAsICptMCwgKmIwLCAqYmIwOworIGNvbnN0IGd1aW50OCAqdHQxLCAqdDEsICptMSwgKmIxLCAqYmIxOworIGNvbnN0IGd1aW50OCAqdHQyLCAqdDIsICptMiwgKmIyLCAqYmIyOworIGdib29sZWFuIGJvdHRvbV9maWVsZDsKK307CisKKy8qCisgKiBGb3IgaW50ZXJwb2xhdGVfc2NhbmxpbmUgdGhlIGlucHV0IGlzOgorICoKKyAqIHwgICB0LTMgICAgICAgdC0yICAgICAgIHQtMSAgICAgICB0ICAgICAgICB0KzEKKyAqIHwgRmllbGQgMyB8IEZpZWxkIDIgfCBGaWVsZCAxIHwgRmllbGQgMCB8IEZpZWxkIC0xCisgKiB8ICBUVDMgICAgfCAgICAgICAgIHwgICBUVDEgICB8ICAgICAgICAgfCAgIFRUcAorICogfCAgICAgICAgIHwgICBUMiAgICB8ICAgICAgICAgfCAgIFQwICAgIHwKKyAqIHwgICBNMyAgICB8ICAgICAgICAgfCAgICBNMSAgIHwgICAgICAgICB8ICAgIE1wCisgKiB8ICAgICAgICAgfCAgIEIyICAgIHwgICAgICAgICB8ICAgQjAgICAgfAorICogfCAgQkIzICAgIHwgICAgICAgICB8ICAgQkIxICAgfCAgICAgICAgIHwgICBCQnAKKyAqCisgKiBGb3IgY29weV9zY2FubGluZSB0aGUgaW5wdXQgaXM6CisgKgorICogfCAgIHQtMyAgICAgICB0LTIgICAgICAgdC0xICAgICAgIHQgICAgICAgICB0KzEKKyAqIHwgRmllbGQgMyB8IEZpZWxkIDIgfCBGaWVsZCAxIHwgRmllbGQgMCB8IEZpZWxkIC0xCisgKiB8ICAgICAgICAgfCAgIFRUMiAgIHwgICAgICAgICB8ICBUVDAgICAgfAorICogfCAgIFQzICAgIHwgICAgICAgICB8ICAgVDEgICAgfCAgICAgICAgIHwgICBUcAorICogfCAgICAgICAgIHwgICAgTTIgICB8ICAgICAgICAgfCAgIE0wICAgIHwKKyAqIHwgICBCMyAgICB8ICAgICAgICAgfCAgIEIxICAgIHwgICAgICAgICB8ICAgQnAKKyAqIHwgICAgICAgICB8ICAgQkIyICAgfCAgICAgICAgIHwgIEJCMCAgICB8CisgKgorICogQWxsIG90aGVyIHZhbHVlcyBhcmUgTlVMTC4KKyAqLworCit0eXBlZGVmIHZvaWQgKCpHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZEZ1bmN0aW9uKSAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKnNlbGYsIGd1aW50OCAqb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqc2NhbmxpbmVzLCBndWludCBzaXplKTsKKworc3RydWN0IF9Hc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCB7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kIHBhcmVudDsKKworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZEZ1bmN0aW9uIGludGVycG9sYXRlX3NjYW5saW5lX3BhY2tlZDsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZEZ1bmN0aW9uIGludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hclszXTsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX3BsYW5hclszXTsKK307CisKK3N0cnVjdCBfR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RDbGFzcyB7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgcGFyZW50X2NsYXNzOworCisgIC8qIFBhY2tlZCBmb3JtYXRzICovCisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfeXV5MjsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX3l1eTI7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfeXZ5dTsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX3l2eXU7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfdXl2eTsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX3V5dnk7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfYXl1djsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX2F5dXY7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfYXJnYjsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX2FyZ2I7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfYWJncjsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX2FiZ3I7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiYTsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX3JnYmE7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyYTsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX2JncmE7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiOworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZEZ1bmN0aW9uIGNvcHlfc2NhbmxpbmVfcmdiOworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZEZ1bmN0aW9uIGludGVycG9sYXRlX3NjYW5saW5lX2JncjsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX2JncjsKKworICAvKiBTZW1pLXBsYW5hciBmb3JtYXRzICovCisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYxMjsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX252MTI7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYyMTsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX252MjE7CisKKyAgLyogUGxhbmFyIGZvcm1hdHMgKi8KKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBjb3B5X3NjYW5saW5lX3BsYW5hcl95OworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZEZ1bmN0aW9uIGludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl95OworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZEZ1bmN0aW9uIGNvcHlfc2NhbmxpbmVfcGxhbmFyX3U7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gaW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3U7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kRnVuY3Rpb24gY29weV9zY2FubGluZV9wbGFuYXJfdjsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RGdW5jdGlvbiBpbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdjsKK307CisKK0dUeXBlIGdzdF9kZWludGVybGFjZV9zaW1wbGVfbWV0aG9kX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0RFSU5URVJMQUNFX01FVEhPRF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS9tZXNvbi5idWlsZCBiL2dzdC9kZWludGVybGFjZS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWU2YzUzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsNDMgQEAKK2ludGVybGFjZV9zb3VyY2VzID0gWworICAnZ3N0ZGVpbnRlcmxhY2UuYycsCisgICdnc3RkZWludGVybGFjZW1ldGhvZC5jJywKKyAgJ3R2dGltZS90b21zbW9jb21wLmMnLAorICAndHZ0aW1lL2dyZWVkeS5jJywKKyAgJ3R2dGltZS9ncmVlZHloLmMnLAorICAndHZ0aW1lL3ZmaXIuYycsCisgICd0dnRpbWUvd2VhdmV0ZmYuYycsCisgICd0dnRpbWUvd2VhdmViZmYuYycsCisgICd0dnRpbWUvd2VhdmUuYycsCisgICd0dnRpbWUvbGluZWFyLmMnLAorICAndHZ0aW1lL2xpbmVhcmJsZW5kLmMnLAorICAndHZ0aW1lL3NjYWxlcmJvYi5jJworXQorCitvcmNzcmMgPSAndHZ0aW1lJworaWYgaGF2ZV9vcmNjCisgIG9yY19oID0gY3VzdG9tX3RhcmdldChvcmNzcmMgKyAnLmgnLAorICAgIGlucHV0IDogb3Jjc3JjICsgJy5vcmMnLAorICAgIG91dHB1dCA6IG9yY3NyYyArICcuaCcsCisgICAgY29tbWFuZCA6IG9yY2NfYXJncyArIFsnLS1oZWFkZXInLCAnLW8nLCAnQE9VVFBVVEAnLCAnQElOUFVUQCddKQorICBvcmNfYyA9IGN1c3RvbV90YXJnZXQob3Jjc3JjICsgJy5jJywKKyAgICBpbnB1dCA6IG9yY3NyYyArICcub3JjJywKKyAgICBvdXRwdXQgOiBvcmNzcmMgKyAnLmMnLAorICAgIGNvbW1hbmQgOiBvcmNjX2FyZ3MgKyBbJy0taW1wbGVtZW50YXRpb24nLCAnLW8nLCAnQE9VVFBVVEAnLCAnQElOUFVUQCddKQorZWxzZQorICBvcmNfaCA9IGNvbmZpZ3VyZV9maWxlKGlucHV0IDogb3Jjc3JjICsgJy1kaXN0LmgnLAorICAgIG91dHB1dCA6IG9yY3NyYyArICcuaCcsCisgICAgY29uZmlndXJhdGlvbiA6IGNvbmZpZ3VyYXRpb25fZGF0YSgpKQorICBvcmNfYyA9IGNvbmZpZ3VyZV9maWxlKGlucHV0IDogb3Jjc3JjICsgJy1kaXN0LmMnLAorICAgIG91dHB1dCA6IG9yY3NyYyArICcuYycsCisgICAgY29uZmlndXJhdGlvbiA6IGNvbmZpZ3VyYXRpb25fZGF0YSgpKQorZW5kaWYKKworZ3N0ZGVpbnRlcmxhY2UgPSBsaWJyYXJ5KCdnc3RkZWludGVybGFjZScsCisgIGludGVybGFjZV9zb3VyY2VzLCBvcmNfYywgb3JjX2gsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbb3JjX2RlcCwgZ3N0YmFzZV9kZXAsIGdzdHZpZGVvX2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCisKZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdjMTA1NgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUtZGlzdC5jCkBAIC0wLDAgKzEsMTExOSBAQAorCisvKiBhdXRvZ2VuZXJhdGVkIGZyb20gdHZ0aW1lLm9yYyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaWZuZGVmIF9PUkNfSU5URUdFUl9UWVBFREVGU18KKyNkZWZpbmUgX09SQ19JTlRFR0VSX1RZUEVERUZTXworI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjaW5jbHVkZSA8c3RkaW50Lmg+Cit0eXBlZGVmIGludDhfdCBvcmNfaW50ODsKK3R5cGVkZWYgaW50MTZfdCBvcmNfaW50MTY7Cit0eXBlZGVmIGludDMyX3Qgb3JjX2ludDMyOwordHlwZWRlZiBpbnQ2NF90IG9yY19pbnQ2NDsKK3R5cGVkZWYgdWludDhfdCBvcmNfdWludDg7Cit0eXBlZGVmIHVpbnQxNl90IG9yY191aW50MTY7Cit0eXBlZGVmIHVpbnQzMl90IG9yY191aW50MzI7Cit0eXBlZGVmIHVpbnQ2NF90IG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSBVSU5UNjRfQyh4KQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKK3R5cGVkZWYgc2lnbmVkIF9faW50OCBvcmNfaW50ODsKK3R5cGVkZWYgc2lnbmVkIF9faW50MTYgb3JjX2ludDE2OwordHlwZWRlZiBzaWduZWQgX19pbnQzMiBvcmNfaW50MzI7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDY0IG9yY19pbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ4IG9yY191aW50ODsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQxNiBvcmNfdWludDE2OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDMyIG9yY191aW50MzI7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgb3JjX3VpbnQ2NDsKKyNkZWZpbmUgT1JDX1VJTlQ2NF9DKHgpICh4IyNVaTY0KQorI2RlZmluZSBpbmxpbmUgX19pbmxpbmUKKyNlbHNlCisjaW5jbHVkZSA8bGltaXRzLmg+Cit0eXBlZGVmIHNpZ25lZCBjaGFyIG9yY19pbnQ4OwordHlwZWRlZiBzaG9ydCBvcmNfaW50MTY7Cit0eXBlZGVmIGludCBvcmNfaW50MzI7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgb3JjX3VpbnQ4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBvcmNfdWludDE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgb3JjX3VpbnQzMjsKKyNpZiBJTlRfTUFYID09IExPTkdfTUFYCit0eXBlZGVmIGxvbmcgbG9uZyBvcmNfaW50NjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgKHgjI1VMTCkKKyNlbHNlCit0eXBlZGVmIGxvbmcgb3JjX2ludDY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSAoeCMjVUwpCisjZW5kaWYKKyNlbmRpZgordHlwZWRlZiB1bmlvbgoreworICBvcmNfaW50MTYgaTsKKyAgb3JjX2ludDggeDJbMl07Cit9IG9yY191bmlvbjE2OwordHlwZWRlZiB1bmlvbgoreworICBvcmNfaW50MzIgaTsKKyAgZmxvYXQgZjsKKyAgb3JjX2ludDE2IHgyWzJdOworICBvcmNfaW50OCB4NFs0XTsKK30gb3JjX3VuaW9uMzI7Cit0eXBlZGVmIHVuaW9uCit7CisgIG9yY19pbnQ2NCBpOworICBkb3VibGUgZjsKKyAgb3JjX2ludDMyIHgyWzJdOworICBmbG9hdCB4MmZbMl07CisgIG9yY19pbnQxNiB4NFs0XTsKK30gb3JjX3VuaW9uNjQ7CisjZW5kaWYKKyNpZm5kZWYgT1JDX1JFU1RSSUNUCisjaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyNkZWZpbmUgT1JDX1JFU1RSSUNUIHJlc3RyaWN0CisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSA0CisjZGVmaW5lIE9SQ19SRVNUUklDVCBfX3Jlc3RyaWN0X18KKyNlbHNlCisjZGVmaW5lIE9SQ19SRVNUUklDVAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBPUkNfSU5URVJOQUwKKyNpZiBkZWZpbmVkKF9fU1VOUFJPX0MpICYmIChfX1NVTlBST19DID49IDB4NTkwKQorI2RlZmluZSBPUkNfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKQorI2VsaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU1MCkKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9faGlkZGVuCisjZWxpZiBkZWZpbmVkIChfX0dOVUNfXykKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbHNlCisjZGVmaW5lIE9SQ19JTlRFUk5BTAorI2VuZGlmCisjZW5kaWYKKworCisjaWZuZGVmIERJU0FCTEVfT1JDCisjaW5jbHVkZSA8b3JjL29yYy5oPgorI2VuZGlmCit2b2lkIGRlaW50ZXJsYWNlX2xpbmVfdmZpciAoZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMSwgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMyLAorICAgIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMywgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHM0LAorICAgIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzNSwgaW50IG4pOwordm9pZCBkZWludGVybGFjZV9saW5lX2xpbmVhciAoZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMSwgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMyLCBpbnQgbik7Cit2b2lkIGRlaW50ZXJsYWNlX2xpbmVfbGluZWFyX2JsZW5kIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczIsCisgICAgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMzLCBpbnQgbik7Cit2b2lkIGRlaW50ZXJsYWNlX2xpbmVfZ3JlZWR5IChvcmNfdWludDggKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3Qgb3JjX3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBjb25zdCBvcmNfdWludDggKiBPUkNfUkVTVFJJQ1QgczIsCisgICAgY29uc3Qgb3JjX3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMzLCBjb25zdCBvcmNfdWludDggKiBPUkNfUkVTVFJJQ1QgczQsCisgICAgaW50IHAxLCBpbnQgbik7CisKKworLyogYmVnaW4gT3JjIEMgdGFyZ2V0IHByZWFtYmxlICovCisjZGVmaW5lIE9SQ19DTEFNUCh4LGEsYikgKCh4KTwoYSkgPyAoYSkgOiAoKHgpPihiKSA/IChiKSA6ICh4KSkpCisjZGVmaW5lIE9SQ19BQlMoYSkgKChhKTwwID8gLShhKSA6IChhKSkKKyNkZWZpbmUgT1JDX01JTihhLGIpICgoYSk8KGIpID8gKGEpIDogKGIpKQorI2RlZmluZSBPUkNfTUFYKGEsYikgKChhKT4oYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIE9SQ19TQl9NQVggMTI3CisjZGVmaW5lIE9SQ19TQl9NSU4gKC0xLU9SQ19TQl9NQVgpCisjZGVmaW5lIE9SQ19VQl9NQVggKG9yY191aW50OCkgMjU1CisjZGVmaW5lIE9SQ19VQl9NSU4gMAorI2RlZmluZSBPUkNfU1dfTUFYIDMyNzY3CisjZGVmaW5lIE9SQ19TV19NSU4gKC0xLU9SQ19TV19NQVgpCisjZGVmaW5lIE9SQ19VV19NQVggKG9yY191aW50MTYpNjU1MzUKKyNkZWZpbmUgT1JDX1VXX01JTiAwCisjZGVmaW5lIE9SQ19TTF9NQVggMjE0NzQ4MzY0NworI2RlZmluZSBPUkNfU0xfTUlOICgtMS1PUkNfU0xfTUFYKQorI2RlZmluZSBPUkNfVUxfTUFYIDQyOTQ5NjcyOTVVCisjZGVmaW5lIE9SQ19VTF9NSU4gMAorI2RlZmluZSBPUkNfQ0xBTVBfU0IoeCkgT1JDX0NMQU1QKHgsT1JDX1NCX01JTixPUkNfU0JfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfVUIoeCkgT1JDX0NMQU1QKHgsT1JDX1VCX01JTixPUkNfVUJfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfU1coeCkgT1JDX0NMQU1QKHgsT1JDX1NXX01JTixPUkNfU1dfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfVVcoeCkgT1JDX0NMQU1QKHgsT1JDX1VXX01JTixPUkNfVVdfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfU0woeCkgT1JDX0NMQU1QKHgsT1JDX1NMX01JTixPUkNfU0xfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfVUwoeCkgT1JDX0NMQU1QKHgsT1JDX1VMX01JTixPUkNfVUxfTUFYKQorI2RlZmluZSBPUkNfU1dBUF9XKHgpICgoKCh4KSYweGZmVSk8PDgpIHwgKCgoeCkmMHhmZjAwVSk+PjgpKQorI2RlZmluZSBPUkNfU1dBUF9MKHgpICgoKCh4KSYweGZmVSk8PDI0KSB8ICgoKHgpJjB4ZmYwMFUpPDw4KSB8ICgoKHgpJjB4ZmYwMDAwVSk+PjgpIHwgKCgoeCkmMHhmZjAwMDAwMFUpPj4yNCkpCisjZGVmaW5lIE9SQ19TV0FQX1EoeCkgKCgoKHgpJk9SQ19VSU5UNjRfQygweGZmKSk8PDU2KSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDApKTw8NDApIHwgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4ZmYwMDAwKSk8PDI0KSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDAwMDAwKSk8PDgpIHwgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4ZmYwMDAwMDAwMCkpPj44KSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDAwMDAwMDAwMCkpPj4yNCkgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwMDAwMDAwMDAwMCkpPj40MCkgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwMDAwMDAwMDAwMDAwKSk+PjU2KSkKKyNkZWZpbmUgT1JDX1BUUl9PRkZTRVQocHRyLG9mZnNldCkgKCh2b2lkICopKCgodW5zaWduZWQgY2hhciAqKShwdHIpKSArIChvZmZzZXQpKSkKKyNkZWZpbmUgT1JDX0RFTk9STUFMKHgpICgoeCkgJiAoKCgoeCkmMHg3ZjgwMDAwMCkgPT0gMCkgPyAweGZmODAwMDAwIDogMHhmZmZmZmZmZikpCisjZGVmaW5lIE9SQ19JU05BTih4KSAoKCgoeCkmMHg3ZjgwMDAwMCkgPT0gMHg3ZjgwMDAwMCkgJiYgKCgoeCkmMHgwMDdmZmZmZikgIT0gMCkpCisjZGVmaW5lIE9SQ19ERU5PUk1BTF9ET1VCTEUoeCkgKCh4KSAmICgoKCh4KSZPUkNfVUlOVDY0X0MoMHg3ZmYwMDAwMDAwMDAwMDAwKSkgPT0gMCkgPyBPUkNfVUlOVDY0X0MoMHhmZmYwMDAwMDAwMDAwMDAwKSA6IE9SQ19VSU5UNjRfQygweGZmZmZmZmZmZmZmZmZmZmYpKSkKKyNkZWZpbmUgT1JDX0lTTkFOX0RPVUJMRSh4KSAoKCgoeCkmT1JDX1VJTlQ2NF9DKDB4N2ZmMDAwMDAwMDAwMDAwMCkpID09IE9SQ19VSU5UNjRfQygweDdmZjAwMDAwMDAwMDAwMDApKSAmJiAoKCh4KSZPUkNfVUlOVDY0X0MoMHgwMDBmZmZmZmZmZmZmZmZmKSkgIT0gMCkpCisjaWZuZGVmIE9SQ19SRVNUUklDVAorI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjZGVmaW5lIE9SQ19SRVNUUklDVCByZXN0cmljdAorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAorI2RlZmluZSBPUkNfUkVTVFJJQ1QgX19yZXN0cmljdF9fCisjZWxzZQorI2RlZmluZSBPUkNfUkVTVFJJQ1QKKyNlbmRpZgorI2VuZGlmCisvKiBlbmQgT3JjIEMgdGFyZ2V0IHByZWFtYmxlICovCisKKworCisvKiBkZWludGVybGFjZV9saW5lX3ZmaXIgKi8KKyNpZmRlZiBESVNBQkxFX09SQwordm9pZAorZGVpbnRlcmxhY2VfbGluZV92ZmlyIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczIsIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMywKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczQsIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzNSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI1OworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjY7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyNzsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI4OworICBvcmNfaW50OCB2YXIzNTsKKyAgb3JjX2ludDggdmFyMzY7CisgIG9yY19pbnQ4IHZhcjM3OworICBvcmNfaW50OCB2YXIzODsKKyAgb3JjX2ludDggdmFyMzk7CisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPT0gMiAmJiBkZWZpbmVkIChfX2kzODZfXykKKyAgdm9sYXRpbGUgb3JjX3VuaW9uMTYgdmFyNDA7CisjZWxzZQorICBvcmNfdW5pb24xNiB2YXI0MDsKKyNlbmRpZgorICBvcmNfaW50OCB2YXI0MTsKKyAgb3JjX3VuaW9uMTYgdmFyNDI7CisgIG9yY191bmlvbjE2IHZhcjQzOworICBvcmNfdW5pb24xNiB2YXI0NDsKKyAgb3JjX3VuaW9uMTYgdmFyNDU7CisgIG9yY191bmlvbjE2IHZhcjQ2OworICBvcmNfdW5pb24xNiB2YXI0NzsKKyAgb3JjX3VuaW9uMTYgdmFyNDg7CisgIG9yY191bmlvbjE2IHZhcjQ5OworICBvcmNfdW5pb24xNiB2YXI1MDsKKyAgb3JjX3VuaW9uMTYgdmFyNTE7CisgIG9yY191bmlvbjE2IHZhcjUyOworICBvcmNfdW5pb24xNiB2YXI1MzsKKyAgb3JjX3VuaW9uMTYgdmFyNTQ7CisKKyAgcHRyMCA9IChvcmNfaW50OCAqKSBkMTsKKyAgcHRyNCA9IChvcmNfaW50OCAqKSBzMTsKKyAgcHRyNSA9IChvcmNfaW50OCAqKSBzMjsKKyAgcHRyNiA9IChvcmNfaW50OCAqKSBzMzsKKyAgcHRyNyA9IChvcmNfaW50OCAqKSBzNDsKKyAgcHRyOCA9IChvcmNfaW50OCAqKSBzNTsKKworICAvKiAxNjogbG9hZHB3ICovCisgIHZhcjQwLmkgPSAweDAwMDAwMDA0OyAgICAgICAgIC8qIDQgb3IgMS45NzYyNmUtMzIzZiAqLworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkYiAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiAxOiBjb252dWJ3ICovCisgICAgdmFyNDIuaSA9IChvcmNfdWludDgpIHZhcjM1OworICAgIC8qIDI6IGxvYWRiICovCisgICAgdmFyMzYgPSBwdHI4W2ldOworICAgIC8qIDM6IGNvbnZ1YncgKi8KKyAgICB2YXI0My5pID0gKG9yY191aW50OCkgdmFyMzY7CisgICAgLyogNDogYWRkdyAqLworICAgIHZhcjQ0LmkgPSB2YXI0Mi5pICsgdmFyNDMuaTsKKyAgICAvKiA1OiBsb2FkYiAqLworICAgIHZhcjM3ID0gcHRyNVtpXTsKKyAgICAvKiA2OiBjb252dWJ3ICovCisgICAgdmFyNDUuaSA9IChvcmNfdWludDgpIHZhcjM3OworICAgIC8qIDc6IGxvYWRiICovCisgICAgdmFyMzggPSBwdHI3W2ldOworICAgIC8qIDg6IGNvbnZ1YncgKi8KKyAgICB2YXI0Ni5pID0gKG9yY191aW50OCkgdmFyMzg7CisgICAgLyogOTogYWRkdyAqLworICAgIHZhcjQ3LmkgPSB2YXI0NS5pICsgdmFyNDYuaTsKKyAgICAvKiAxMDogc2hsdyAqLworICAgIHZhcjQ4LmkgPSAoKG9yY191aW50MTYpIHZhcjQ3LmkpIDw8IDI7CisgICAgLyogMTE6IGxvYWRiICovCisgICAgdmFyMzkgPSBwdHI2W2ldOworICAgIC8qIDEyOiBjb252dWJ3ICovCisgICAgdmFyNDkuaSA9IChvcmNfdWludDgpIHZhcjM5OworICAgIC8qIDEzOiBzaGx3ICovCisgICAgdmFyNTAuaSA9ICgob3JjX3VpbnQxNikgdmFyNDkuaSkgPDwgMTsKKyAgICAvKiAxNDogc3VidyAqLworICAgIHZhcjUxLmkgPSB2YXI0OC5pIC0gdmFyNDQuaTsKKyAgICAvKiAxNTogYWRkdyAqLworICAgIHZhcjUyLmkgPSB2YXI1MS5pICsgdmFyNTAuaTsKKyAgICAvKiAxNzogYWRkdyAqLworICAgIHZhcjUzLmkgPSB2YXI1Mi5pICsgdmFyNDAuaTsKKyAgICAvKiAxODogc2hyc3cgKi8KKyAgICB2YXI1NC5pID0gdmFyNTMuaSA+PiAzOworICAgIC8qIDE5OiBjb252c3Vzd2IgKi8KKyAgICB2YXI0MSA9IE9SQ19DTEFNUF9VQiAodmFyNTQuaSk7CisgICAgLyogMjA6IHN0b3JlYiAqLworICAgIHB0cjBbaV0gPSB2YXI0MTsKKyAgfQorCit9CisKKyNlbHNlCitzdGF0aWMgdm9pZAorX2JhY2t1cF9kZWludGVybGFjZV9saW5lX3ZmaXIgKE9yY0V4ZWN1dG9yICogT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IG4gPSBleC0+bjsKKyAgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyNTsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI2OworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjc7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyODsKKyAgb3JjX2ludDggdmFyMzU7CisgIG9yY19pbnQ4IHZhcjM2OworICBvcmNfaW50OCB2YXIzNzsKKyAgb3JjX2ludDggdmFyMzg7CisgIG9yY19pbnQ4IHZhcjM5OworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID09IDIgJiYgZGVmaW5lZCAoX19pMzg2X18pCisgIHZvbGF0aWxlIG9yY191bmlvbjE2IHZhcjQwOworI2Vsc2UKKyAgb3JjX3VuaW9uMTYgdmFyNDA7CisjZW5kaWYKKyAgb3JjX2ludDggdmFyNDE7CisgIG9yY191bmlvbjE2IHZhcjQyOworICBvcmNfdW5pb24xNiB2YXI0MzsKKyAgb3JjX3VuaW9uMTYgdmFyNDQ7CisgIG9yY191bmlvbjE2IHZhcjQ1OworICBvcmNfdW5pb24xNiB2YXI0NjsKKyAgb3JjX3VuaW9uMTYgdmFyNDc7CisgIG9yY191bmlvbjE2IHZhcjQ4OworICBvcmNfdW5pb24xNiB2YXI0OTsKKyAgb3JjX3VuaW9uMTYgdmFyNTA7CisgIG9yY191bmlvbjE2IHZhcjUxOworICBvcmNfdW5pb24xNiB2YXI1MjsKKyAgb3JjX3VuaW9uMTYgdmFyNTM7CisgIG9yY191bmlvbjE2IHZhcjU0OworCisgIHB0cjAgPSAob3JjX2ludDggKikgZXgtPmFycmF5c1swXTsKKyAgcHRyNCA9IChvcmNfaW50OCAqKSBleC0+YXJyYXlzWzRdOworICBwdHI1ID0gKG9yY19pbnQ4ICopIGV4LT5hcnJheXNbNV07CisgIHB0cjYgPSAob3JjX2ludDggKikgZXgtPmFycmF5c1s2XTsKKyAgcHRyNyA9IChvcmNfaW50OCAqKSBleC0+YXJyYXlzWzddOworICBwdHI4ID0gKG9yY19pbnQ4ICopIGV4LT5hcnJheXNbOF07CisKKyAgLyogMTY6IGxvYWRwdyAqLworICB2YXI0MC5pID0gMHgwMDAwMDAwNDsgICAgICAgICAvKiA0IG9yIDEuOTc2MjZlLTMyM2YgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGIgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMTogY29udnVidyAqLworICAgIHZhcjQyLmkgPSAob3JjX3VpbnQ4KSB2YXIzNTsKKyAgICAvKiAyOiBsb2FkYiAqLworICAgIHZhcjM2ID0gcHRyOFtpXTsKKyAgICAvKiAzOiBjb252dWJ3ICovCisgICAgdmFyNDMuaSA9IChvcmNfdWludDgpIHZhcjM2OworICAgIC8qIDQ6IGFkZHcgKi8KKyAgICB2YXI0NC5pID0gdmFyNDIuaSArIHZhcjQzLmk7CisgICAgLyogNTogbG9hZGIgKi8KKyAgICB2YXIzNyA9IHB0cjVbaV07CisgICAgLyogNjogY29udnVidyAqLworICAgIHZhcjQ1LmkgPSAob3JjX3VpbnQ4KSB2YXIzNzsKKyAgICAvKiA3OiBsb2FkYiAqLworICAgIHZhcjM4ID0gcHRyN1tpXTsKKyAgICAvKiA4OiBjb252dWJ3ICovCisgICAgdmFyNDYuaSA9IChvcmNfdWludDgpIHZhcjM4OworICAgIC8qIDk6IGFkZHcgKi8KKyAgICB2YXI0Ny5pID0gdmFyNDUuaSArIHZhcjQ2Lmk7CisgICAgLyogMTA6IHNobHcgKi8KKyAgICB2YXI0OC5pID0gKChvcmNfdWludDE2KSB2YXI0Ny5pKSA8PCAyOworICAgIC8qIDExOiBsb2FkYiAqLworICAgIHZhcjM5ID0gcHRyNltpXTsKKyAgICAvKiAxMjogY29udnVidyAqLworICAgIHZhcjQ5LmkgPSAob3JjX3VpbnQ4KSB2YXIzOTsKKyAgICAvKiAxMzogc2hsdyAqLworICAgIHZhcjUwLmkgPSAoKG9yY191aW50MTYpIHZhcjQ5LmkpIDw8IDE7CisgICAgLyogMTQ6IHN1YncgKi8KKyAgICB2YXI1MS5pID0gdmFyNDguaSAtIHZhcjQ0Lmk7CisgICAgLyogMTU6IGFkZHcgKi8KKyAgICB2YXI1Mi5pID0gdmFyNTEuaSArIHZhcjUwLmk7CisgICAgLyogMTc6IGFkZHcgKi8KKyAgICB2YXI1My5pID0gdmFyNTIuaSArIHZhcjQwLmk7CisgICAgLyogMTg6IHNocnN3ICovCisgICAgdmFyNTQuaSA9IHZhcjUzLmkgPj4gMzsKKyAgICAvKiAxOTogY29udnN1c3diICovCisgICAgdmFyNDEgPSBPUkNfQ0xBTVBfVUIgKHZhcjU0LmkpOworICAgIC8qIDIwOiBzdG9yZWIgKi8KKyAgICBwdHIwW2ldID0gdmFyNDE7CisgIH0KKworfQorCit2b2lkCitkZWludGVybGFjZV9saW5lX3ZmaXIgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLAorICAgIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMiwgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMzLAorICAgIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzNCwgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHM1LCBpbnQgbikKK3sKKyAgT3JjRXhlY3V0b3IgX2V4LCAqZXggPSAmX2V4OworICBzdGF0aWMgdm9sYXRpbGUgaW50IHBfaW5pdGVkID0gMDsKKyAgc3RhdGljIE9yY0NvZGUgKmMgPSAwOworICB2b2lkICgqZnVuYykgKE9yY0V4ZWN1dG9yICopOworCisgIGlmICghcF9pbml0ZWQpIHsKKyAgICBvcmNfb25jZV9tdXRleF9sb2NrICgpOworICAgIGlmICghcF9pbml0ZWQpIHsKKyAgICAgIE9yY1Byb2dyYW0gKnA7CisKKyNpZiAxCisgICAgICBzdGF0aWMgY29uc3Qgb3JjX3VpbnQ4IGJjW10gPSB7CisgICAgICAgIDEsIDksIDIxLCAxMDAsIDEwMSwgMTA1LCAxMTAsIDExNiwgMTAxLCAxMTQsIDEwOCwgOTcsIDk5LCAxMDEsIDk1LCAxMDgsCisgICAgICAgIDEwNSwgMTEwLCAxMDEsIDk1LCAxMTgsIDEwMiwgMTA1LCAxMTQsIDExLCAxLCAxLCAxMiwgMSwgMSwgMTIsIDEsCisgICAgICAgIDEsIDEyLCAxLCAxLCAxMiwgMSwgMSwgMTIsIDEsIDEsIDE0LCAyLCAyLCAwLCAwLCAwLAorICAgICAgICAxNCwgMiwgMSwgMCwgMCwgMCwgMTQsIDIsIDQsIDAsIDAsIDAsIDE0LCAyLCAzLCAwLAorICAgICAgICAwLCAwLCAyMCwgMiwgMjAsIDIsIDIwLCAyLCAxNTAsIDMyLCA0LCAxNTAsIDMzLCA4LCA3MCwgMzIsCisgICAgICAgIDMyLCAzMywgMTUwLCAzMywgNSwgMTUwLCAzNCwgNywgNzAsIDMzLCAzMywgMzQsIDkzLCAzMywgMzMsIDE2LAorICAgICAgICAxNTAsIDM0LCA2LCA5MywgMzQsIDM0LCAxNywgOTgsIDMzLCAzMywgMzIsIDcwLCAzMywgMzMsIDM0LCA3MCwKKyAgICAgICAgMzMsIDMzLCAxOCwgOTQsIDMzLCAzMywgMTksIDE2MCwgMCwgMzMsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwgX2JhY2t1cF9kZWludGVybGFjZV9saW5lX3ZmaXIpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImRlaW50ZXJsYWNlX2xpbmVfdmZpciIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwgX2JhY2t1cF9kZWludGVybGFjZV9saW5lX3ZmaXIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCAxLCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDEsICJzMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgMSwgInMyIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCAxLCAiczMiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDEsICJzNCIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgMSwgInM1Iik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfY29uc3RhbnQgKHAsIDIsIDB4MDAwMDAwMDIsICJjMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2NvbnN0YW50IChwLCAyLCAweDAwMDAwMDAxLCAiYzIiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9jb25zdGFudCAocCwgMiwgMHgwMDAwMDAwNCwgImMzIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfY29uc3RhbnQgKHAsIDIsIDB4MDAwMDAwMDMsICJjNCIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgMiwgInQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCAyLCAidDIiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDIsICJ0MyIpOworCisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZ1YnciLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1MxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9TNSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiYWRkdyIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDIsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZ1YnciLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1MyLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMCwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9TNCwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiYWRkdyIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDMsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInNobHciLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QyLCBPUkNfVkFSX0MxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMCwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9TMywgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2hsdyIsIDAsIE9SQ19WQVJfVDMsIE9SQ19WQVJfVDMsIE9SQ19WQVJfQzIsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInN1YnciLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhZGR3IiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiYWRkdyIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDIsIE9SQ19WQVJfQzMsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInNocnN3IiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9DNCwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnN1c3diIiwgMCwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMiwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1MxXSA9ICh2b2lkICopIHMxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzJdID0gKHZvaWQgKikgczI7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TM10gPSAodm9pZCAqKSBzMzsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1M0XSA9ICh2b2lkICopIHM0OworICBleC0+YXJyYXlzW09SQ19WQVJfUzVdID0gKHZvaWQgKikgczU7CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIGRlaW50ZXJsYWNlX2xpbmVfbGluZWFyICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK2RlaW50ZXJsYWNlX2xpbmVfbGluZWFyIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczIsIGludCBuKQoreworICBpbnQgaTsKKyAgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyNTsKKyAgb3JjX2ludDggdmFyMzI7CisgIG9yY19pbnQ4IHZhcjMzOworICBvcmNfaW50OCB2YXIzNDsKKworICBwdHIwID0gKG9yY19pbnQ4ICopIGQxOworICBwdHI0ID0gKG9yY19pbnQ4ICopIHMxOworICBwdHI1ID0gKG9yY19pbnQ4ICopIHMyOworCisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRiICovCisgICAgdmFyMzIgPSBwdHI0W2ldOworICAgIC8qIDE6IGxvYWRiICovCisgICAgdmFyMzMgPSBwdHI1W2ldOworICAgIC8qIDI6IGF2Z3ViICovCisgICAgdmFyMzQgPSAoKG9yY191aW50OCkgdmFyMzIgKyAob3JjX3VpbnQ4KSB2YXIzMyArIDEpID4+IDE7CisgICAgLyogMzogc3RvcmViICovCisgICAgcHRyMFtpXSA9IHZhcjM0OworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX2RlaW50ZXJsYWNlX2xpbmVfbGluZWFyIChPcmNFeGVjdXRvciAqIE9SQ19SRVNUUklDVCBleCkKK3sKKyAgaW50IGk7CisgIGludCBuID0gZXgtPm47CisgIG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI0OworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjU7CisgIG9yY19pbnQ4IHZhcjMyOworICBvcmNfaW50OCB2YXIzMzsKKyAgb3JjX2ludDggdmFyMzQ7CisKKyAgcHRyMCA9IChvcmNfaW50OCAqKSBleC0+YXJyYXlzWzBdOworICBwdHI0ID0gKG9yY19pbnQ4ICopIGV4LT5hcnJheXNbNF07CisgIHB0cjUgPSAob3JjX2ludDggKikgZXgtPmFycmF5c1s1XTsKKworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkYiAqLworICAgIHZhcjMyID0gcHRyNFtpXTsKKyAgICAvKiAxOiBsb2FkYiAqLworICAgIHZhcjMzID0gcHRyNVtpXTsKKyAgICAvKiAyOiBhdmd1YiAqLworICAgIHZhcjM0ID0gKChvcmNfdWludDgpIHZhcjMyICsgKG9yY191aW50OCkgdmFyMzMgKyAxKSA+PiAxOworICAgIC8qIDM6IHN0b3JlYiAqLworICAgIHB0cjBbaV0gPSB2YXIzNDsKKyAgfQorCit9CisKK3ZvaWQKK2RlaW50ZXJsYWNlX2xpbmVfbGluZWFyIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczIsIGludCBuKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgOSwgMjMsIDEwMCwgMTAxLCAxMDUsIDExMCwgMTE2LCAxMDEsIDExNCwgMTA4LCA5NywgOTksIDEwMSwgOTUsIDEwOCwKKyAgICAgICAgMTA1LCAxMTAsIDEwMSwgOTUsIDEwOCwgMTA1LCAxMTAsIDEwMSwgOTcsIDExNCwgMTEsIDEsIDEsIDEyLCAxLCAxLAorICAgICAgICAxMiwgMSwgMSwgMzksIDAsIDQsIDUsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwgX2JhY2t1cF9kZWludGVybGFjZV9saW5lX2xpbmVhcik7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9uYW1lIChwLCAiZGVpbnRlcmxhY2VfbGluZV9saW5lYXIiKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsIF9iYWNrdXBfZGVpbnRlcmxhY2VfbGluZV9saW5lYXIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCAxLCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDEsICJzMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgMSwgInMyIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiYXZndWIiLCAwLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1MxLCBPUkNfVkFSX1MyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX0QxXSA9IGQxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzFdID0gKHZvaWQgKikgczE7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMl0gPSAodm9pZCAqKSBzMjsKKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogZGVpbnRlcmxhY2VfbGluZV9saW5lYXJfYmxlbmQgKi8KKyNpZmRlZiBESVNBQkxFX09SQwordm9pZAorZGVpbnRlcmxhY2VfbGluZV9saW5lYXJfYmxlbmQgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMiwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczMsIGludCBuKQoreworICBpbnQgaTsKKyAgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyNTsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI2OworICBvcmNfaW50OCB2YXIzNTsKKyAgb3JjX2ludDggdmFyMzY7CisgIG9yY19pbnQ4IHZhcjM3OworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID09IDIgJiYgZGVmaW5lZCAoX19pMzg2X18pCisgIHZvbGF0aWxlIG9yY191bmlvbjE2IHZhcjM4OworI2Vsc2UKKyAgb3JjX3VuaW9uMTYgdmFyMzg7CisjZW5kaWYKKyAgb3JjX2ludDggdmFyMzk7CisgIG9yY191bmlvbjE2IHZhcjQwOworICBvcmNfdW5pb24xNiB2YXI0MTsKKyAgb3JjX3VuaW9uMTYgdmFyNDI7CisgIG9yY191bmlvbjE2IHZhcjQzOworICBvcmNfdW5pb24xNiB2YXI0NDsKKyAgb3JjX3VuaW9uMTYgdmFyNDU7CisgIG9yY191bmlvbjE2IHZhcjQ2OworICBvcmNfdW5pb24xNiB2YXI0NzsKKworICBwdHIwID0gKG9yY19pbnQ4ICopIGQxOworICBwdHI0ID0gKG9yY19pbnQ4ICopIHMxOworICBwdHI1ID0gKG9yY19pbnQ4ICopIHMyOworICBwdHI2ID0gKG9yY19pbnQ4ICopIHMzOworCisgIC8qIDk6IGxvYWRwdyAqLworICB2YXIzOC5pID0gMHgwMDAwMDAwMjsgICAgICAgICAvKiAyIG9yIDkuODgxMzFlLTMyNGYgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGIgKi8KKyAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgLyogMTogY29udnVidyAqLworICAgIHZhcjQwLmkgPSAob3JjX3VpbnQ4KSB2YXIzNTsKKyAgICAvKiAyOiBsb2FkYiAqLworICAgIHZhcjM2ID0gcHRyNVtpXTsKKyAgICAvKiAzOiBjb252dWJ3ICovCisgICAgdmFyNDEuaSA9IChvcmNfdWludDgpIHZhcjM2OworICAgIC8qIDQ6IGxvYWRiICovCisgICAgdmFyMzcgPSBwdHI2W2ldOworICAgIC8qIDU6IGNvbnZ1YncgKi8KKyAgICB2YXI0Mi5pID0gKG9yY191aW50OCkgdmFyMzc7CisgICAgLyogNjogYWRkdyAqLworICAgIHZhcjQzLmkgPSB2YXI0MC5pICsgdmFyNDEuaTsKKyAgICAvKiA3OiBhZGR3ICovCisgICAgdmFyNDQuaSA9IHZhcjQyLmkgKyB2YXI0Mi5pOworICAgIC8qIDg6IGFkZHcgKi8KKyAgICB2YXI0NS5pID0gdmFyNDMuaSArIHZhcjQ0Lmk7CisgICAgLyogMTA6IGFkZHcgKi8KKyAgICB2YXI0Ni5pID0gdmFyNDUuaSArIHZhcjM4Lmk7CisgICAgLyogMTE6IHNocnN3ICovCisgICAgdmFyNDcuaSA9IHZhcjQ2LmkgPj4gMjsKKyAgICAvKiAxMjogY29udnN1c3diICovCisgICAgdmFyMzkgPSBPUkNfQ0xBTVBfVUIgKHZhcjQ3LmkpOworICAgIC8qIDEzOiBzdG9yZWIgKi8KKyAgICBwdHIwW2ldID0gdmFyMzk7CisgIH0KKworfQorCisjZWxzZQorc3RhdGljIHZvaWQKK19iYWNrdXBfZGVpbnRlcmxhY2VfbGluZV9saW5lYXJfYmxlbmQgKE9yY0V4ZWN1dG9yICogT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IG4gPSBleC0+bjsKKyAgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyNTsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI2OworICBvcmNfaW50OCB2YXIzNTsKKyAgb3JjX2ludDggdmFyMzY7CisgIG9yY19pbnQ4IHZhcjM3OworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID09IDIgJiYgZGVmaW5lZCAoX19pMzg2X18pCisgIHZvbGF0aWxlIG9yY191bmlvbjE2IHZhcjM4OworI2Vsc2UKKyAgb3JjX3VuaW9uMTYgdmFyMzg7CisjZW5kaWYKKyAgb3JjX2ludDggdmFyMzk7CisgIG9yY191bmlvbjE2IHZhcjQwOworICBvcmNfdW5pb24xNiB2YXI0MTsKKyAgb3JjX3VuaW9uMTYgdmFyNDI7CisgIG9yY191bmlvbjE2IHZhcjQzOworICBvcmNfdW5pb24xNiB2YXI0NDsKKyAgb3JjX3VuaW9uMTYgdmFyNDU7CisgIG9yY191bmlvbjE2IHZhcjQ2OworICBvcmNfdW5pb24xNiB2YXI0NzsKKworICBwdHIwID0gKG9yY19pbnQ4ICopIGV4LT5hcnJheXNbMF07CisgIHB0cjQgPSAob3JjX2ludDggKikgZXgtPmFycmF5c1s0XTsKKyAgcHRyNSA9IChvcmNfaW50OCAqKSBleC0+YXJyYXlzWzVdOworICBwdHI2ID0gKG9yY19pbnQ4ICopIGV4LT5hcnJheXNbNl07CisKKyAgLyogOTogbG9hZHB3ICovCisgIHZhcjM4LmkgPSAweDAwMDAwMDAyOyAgICAgICAgIC8qIDIgb3IgOS44ODEzMWUtMzI0ZiAqLworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkYiAqLworICAgIHZhcjM1ID0gcHRyNFtpXTsKKyAgICAvKiAxOiBjb252dWJ3ICovCisgICAgdmFyNDAuaSA9IChvcmNfdWludDgpIHZhcjM1OworICAgIC8qIDI6IGxvYWRiICovCisgICAgdmFyMzYgPSBwdHI1W2ldOworICAgIC8qIDM6IGNvbnZ1YncgKi8KKyAgICB2YXI0MS5pID0gKG9yY191aW50OCkgdmFyMzY7CisgICAgLyogNDogbG9hZGIgKi8KKyAgICB2YXIzNyA9IHB0cjZbaV07CisgICAgLyogNTogY29udnVidyAqLworICAgIHZhcjQyLmkgPSAob3JjX3VpbnQ4KSB2YXIzNzsKKyAgICAvKiA2OiBhZGR3ICovCisgICAgdmFyNDMuaSA9IHZhcjQwLmkgKyB2YXI0MS5pOworICAgIC8qIDc6IGFkZHcgKi8KKyAgICB2YXI0NC5pID0gdmFyNDIuaSArIHZhcjQyLmk7CisgICAgLyogODogYWRkdyAqLworICAgIHZhcjQ1LmkgPSB2YXI0My5pICsgdmFyNDQuaTsKKyAgICAvKiAxMDogYWRkdyAqLworICAgIHZhcjQ2LmkgPSB2YXI0NS5pICsgdmFyMzguaTsKKyAgICAvKiAxMTogc2hyc3cgKi8KKyAgICB2YXI0Ny5pID0gdmFyNDYuaSA+PiAyOworICAgIC8qIDEyOiBjb252c3Vzd2IgKi8KKyAgICB2YXIzOSA9IE9SQ19DTEFNUF9VQiAodmFyNDcuaSk7CisgICAgLyogMTM6IHN0b3JlYiAqLworICAgIHB0cjBbaV0gPSB2YXIzOTsKKyAgfQorCit9CisKK3ZvaWQKK2RlaW50ZXJsYWNlX2xpbmVfbGluZWFyX2JsZW5kIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczIsCisgICAgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMzLCBpbnQgbikKK3sKKyAgT3JjRXhlY3V0b3IgX2V4LCAqZXggPSAmX2V4OworICBzdGF0aWMgdm9sYXRpbGUgaW50IHBfaW5pdGVkID0gMDsKKyAgc3RhdGljIE9yY0NvZGUgKmMgPSAwOworICB2b2lkICgqZnVuYykgKE9yY0V4ZWN1dG9yICopOworCisgIGlmICghcF9pbml0ZWQpIHsKKyAgICBvcmNfb25jZV9tdXRleF9sb2NrICgpOworICAgIGlmICghcF9pbml0ZWQpIHsKKyAgICAgIE9yY1Byb2dyYW0gKnA7CisKKyNpZiAxCisgICAgICBzdGF0aWMgY29uc3Qgb3JjX3VpbnQ4IGJjW10gPSB7CisgICAgICAgIDEsIDksIDI5LCAxMDAsIDEwMSwgMTA1LCAxMTAsIDExNiwgMTAxLCAxMTQsIDEwOCwgOTcsIDk5LCAxMDEsIDk1LCAxMDgsCisgICAgICAgIDEwNSwgMTEwLCAxMDEsIDk1LCAxMDgsIDEwNSwgMTEwLCAxMDEsIDk3LCAxMTQsIDk1LCA5OCwgMTA4LCAxMDEsIDExMCwKKyAgICAgICAgMTAwLAorICAgICAgICAxMSwgMSwgMSwgMTIsIDEsIDEsIDEyLCAxLCAxLCAxMiwgMSwgMSwgMTQsIDIsIDIsIDAsCisgICAgICAgIDAsIDAsIDIwLCAyLCAyMCwgMiwgMjAsIDIsIDE1MCwgMzIsIDQsIDE1MCwgMzMsIDUsIDE1MCwgMzQsCisgICAgICAgIDYsIDcwLCAzMiwgMzIsIDMzLCA3MCwgMzQsIDM0LCAzNCwgNzAsIDMyLCAzMiwgMzQsIDcwLCAzMiwgMzIsCisgICAgICAgIDE2LCA5NCwgMzIsIDMyLCAxNiwgMTYwLCAwLCAzMiwgMiwgMCwKKyAgICAgIH07CisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3X2Zyb21fc3RhdGljX2J5dGVjb2RlIChiYyk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfZGVpbnRlcmxhY2VfbGluZV9saW5lYXJfYmxlbmQpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImRlaW50ZXJsYWNlX2xpbmVfbGluZWFyX2JsZW5kIik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLAorICAgICAgICAgIF9iYWNrdXBfZGVpbnRlcmxhY2VfbGluZV9saW5lYXJfYmxlbmQpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCAxLCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDEsICJzMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgMSwgInMyIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCAxLCAiczMiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9jb25zdGFudCAocCwgMiwgMHgwMDAwMDAwMiwgImMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCAyLCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDIsICJ0MiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgMiwgInQzIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnVidyIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfUzEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZ1YnciLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1MyLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMCwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9TMywgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiYWRkdyIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDIsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImFkZHciLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QzLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhZGR3IiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiYWRkdyIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDEsIE9SQ19WQVJfQzEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInNocnN3IiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9DMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnN1c3diIiwgMCwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1MxXSA9ICh2b2lkICopIHMxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzJdID0gKHZvaWQgKikgczI7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TM10gPSAodm9pZCAqKSBzMzsKKworICBmdW5jID0gYy0+ZXhlYzsKKyAgZnVuYyAoZXgpOworfQorI2VuZGlmCisKKworLyogZGVpbnRlcmxhY2VfbGluZV9ncmVlZHkgKi8KKyNpZmRlZiBESVNBQkxFX09SQwordm9pZAorZGVpbnRlcmxhY2VfbGluZV9ncmVlZHkgKG9yY191aW50OCAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBvcmNfdWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGNvbnN0IG9yY191aW50OCAqIE9SQ19SRVNUUklDVCBzMiwKKyAgICBjb25zdCBvcmNfdWludDggKiBPUkNfUkVTVFJJQ1QgczMsIGNvbnN0IG9yY191aW50OCAqIE9SQ19SRVNUUklDVCBzNCwKKyAgICBpbnQgcDEsIGludCBuKQoreworICBpbnQgaTsKKyAgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyNTsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI2OworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjc7CisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPT0gMiAmJiBkZWZpbmVkIChfX2kzODZfXykKKyAgdm9sYXRpbGUgb3JjX2ludDggdmFyNDQ7CisjZWxzZQorICBvcmNfaW50OCB2YXI0NDsKKyNlbmRpZgorICBvcmNfaW50OCB2YXI0NTsKKyAgb3JjX2ludDggdmFyNDY7CisgIG9yY19pbnQ4IHZhcjQ3OworICBvcmNfaW50OCB2YXI0ODsKKyAgb3JjX2ludDggdmFyNDk7CisgIG9yY19pbnQ4IHZhcjUwOworICBvcmNfaW50OCB2YXI1MTsKKyAgb3JjX2ludDggdmFyNTI7CisgIG9yY19pbnQ4IHZhcjUzOworICBvcmNfaW50OCB2YXI1NDsKKyAgb3JjX2ludDggdmFyNTU7CisgIG9yY19pbnQ4IHZhcjU2OworICBvcmNfaW50OCB2YXI1NzsKKyAgb3JjX2ludDggdmFyNTg7CisgIG9yY19pbnQ4IHZhcjU5OworICBvcmNfaW50OCB2YXI2MDsKKyAgb3JjX2ludDggdmFyNjE7CisgIG9yY19pbnQ4IHZhcjYyOworICBvcmNfaW50OCB2YXI2MzsKKyAgb3JjX2ludDggdmFyNjQ7CisgIG9yY19pbnQ4IHZhcjY1OworICBvcmNfaW50OCB2YXI2NjsKKyAgb3JjX2ludDggdmFyNjc7CisgIG9yY19pbnQ4IHZhcjY4OworCisgIHB0cjAgPSAob3JjX2ludDggKikgZDE7CisgIHB0cjQgPSAob3JjX2ludDggKikgczE7CisgIHB0cjUgPSAob3JjX2ludDggKikgczI7CisgIHB0cjYgPSAob3JjX2ludDggKikgczM7CisgIHB0cjcgPSAob3JjX2ludDggKikgczQ7CisKKyAgLyogMTE6IGxvYWRwYiAqLworICB2YXI0NCA9IDB4MDAwMDAwODA7ICAgICAgICAgICAvKiAxMjggb3IgNi4zMjQwNGUtMzIyZiAqLworICAvKiAyMDogbG9hZHBiICovCisgIHZhcjQ1ID0gcDE7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRiICovCisgICAgdmFyNDcgPSBwdHI0W2ldOworICAgIC8qIDE6IGxvYWRiICovCisgICAgdmFyNDggPSBwdHI3W2ldOworICAgIC8qIDI6IGxvYWRiICovCisgICAgdmFyNDkgPSBwdHI2W2ldOworICAgIC8qIDM6IGxvYWRiICovCisgICAgdmFyNTAgPSBwdHI1W2ldOworICAgIC8qIDQ6IGF2Z3ViICovCisgICAgdmFyNTEgPSAoKG9yY191aW50OCkgdmFyNTAgKyAob3JjX3VpbnQ4KSB2YXI0OSArIDEpID4+IDE7CisgICAgLyogNTogbWF4dWIgKi8KKyAgICB2YXI1MiA9IE9SQ19NQVggKChvcmNfdWludDgpIHZhcjQ3LCAob3JjX3VpbnQ4KSB2YXI1MSk7CisgICAgLyogNjogbWludWIgKi8KKyAgICB2YXI1MyA9IE9SQ19NSU4gKChvcmNfdWludDgpIHZhcjQ3LCAob3JjX3VpbnQ4KSB2YXI1MSk7CisgICAgLyogNzogc3ViYiAqLworICAgIHZhcjU0ID0gdmFyNTIgLSB2YXI1MzsKKyAgICAvKiA4OiBtYXh1YiAqLworICAgIHZhcjU1ID0gT1JDX01BWCAoKG9yY191aW50OCkgdmFyNDgsIChvcmNfdWludDgpIHZhcjUxKTsKKyAgICAvKiA5OiBtaW51YiAqLworICAgIHZhcjU2ID0gT1JDX01JTiAoKG9yY191aW50OCkgdmFyNDgsIChvcmNfdWludDgpIHZhcjUxKTsKKyAgICAvKiAxMDogc3ViYiAqLworICAgIHZhcjU3ID0gdmFyNTUgLSB2YXI1NjsKKyAgICAvKiAxMjogeG9yYiAqLworICAgIHZhcjU4ID0gdmFyNTQgXiB2YXI0NDsKKyAgICAvKiAxMzogeG9yYiAqLworICAgIHZhcjU5ID0gdmFyNTcgXiB2YXI0NDsKKyAgICAvKiAxNDogY21wZ3RzYiAqLworICAgIHZhcjYwID0gKHZhcjU4ID4gdmFyNTkpID8gKH4wKSA6IDA7CisgICAgLyogMTU6IGFuZGIgKi8KKyAgICB2YXI2MSA9IHZhcjQ4ICYgdmFyNjA7CisgICAgLyogMTY6IGFuZG5iICovCisgICAgdmFyNjIgPSAofnZhcjYwKSAmIHZhcjQ3OworICAgIC8qIDE3OiBvcmIgKi8KKyAgICB2YXI2MyA9IHZhcjYxIHwgdmFyNjI7CisgICAgLyogMTg6IG1heHViICovCisgICAgdmFyNjQgPSBPUkNfTUFYICgob3JjX3VpbnQ4KSB2YXI1MCwgKG9yY191aW50OCkgdmFyNDkpOworICAgIC8qIDE5OiBtaW51YiAqLworICAgIHZhcjY1ID0gT1JDX01JTiAoKG9yY191aW50OCkgdmFyNTAsIChvcmNfdWludDgpIHZhcjQ5KTsKKyAgICAvKiAyMTogYWRkdXNiICovCisgICAgdmFyNjYgPSBPUkNfQ0xBTVBfVUIgKChvcmNfdWludDgpIHZhcjY0ICsgKG9yY191aW50OCkgdmFyNDUpOworICAgIC8qIDIyOiBzdWJ1c2IgKi8KKyAgICB2YXI2NyA9IE9SQ19DTEFNUF9VQiAoKG9yY191aW50OCkgdmFyNjUgLSAob3JjX3VpbnQ4KSB2YXI0NSk7CisgICAgLyogMjM6IG1pbnViICovCisgICAgdmFyNjggPSBPUkNfTUlOICgob3JjX3VpbnQ4KSB2YXI2MywgKG9yY191aW50OCkgdmFyNjYpOworICAgIC8qIDI0OiBtYXh1YiAqLworICAgIHZhcjQ2ID0gT1JDX01BWCAoKG9yY191aW50OCkgdmFyNjgsIChvcmNfdWludDgpIHZhcjY3KTsKKyAgICAvKiAyNTogc3RvcmViICovCisgICAgcHRyMFtpXSA9IHZhcjQ2OworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX2RlaW50ZXJsYWNlX2xpbmVfZ3JlZWR5IChPcmNFeGVjdXRvciAqIE9SQ19SRVNUUklDVCBleCkKK3sKKyAgaW50IGk7CisgIGludCBuID0gZXgtPm47CisgIG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI0OworICBjb25zdCBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjU7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyNjsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI3OworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID09IDIgJiYgZGVmaW5lZCAoX19pMzg2X18pCisgIHZvbGF0aWxlIG9yY19pbnQ4IHZhcjQ0OworI2Vsc2UKKyAgb3JjX2ludDggdmFyNDQ7CisjZW5kaWYKKyAgb3JjX2ludDggdmFyNDU7CisgIG9yY19pbnQ4IHZhcjQ2OworICBvcmNfaW50OCB2YXI0NzsKKyAgb3JjX2ludDggdmFyNDg7CisgIG9yY19pbnQ4IHZhcjQ5OworICBvcmNfaW50OCB2YXI1MDsKKyAgb3JjX2ludDggdmFyNTE7CisgIG9yY19pbnQ4IHZhcjUyOworICBvcmNfaW50OCB2YXI1MzsKKyAgb3JjX2ludDggdmFyNTQ7CisgIG9yY19pbnQ4IHZhcjU1OworICBvcmNfaW50OCB2YXI1NjsKKyAgb3JjX2ludDggdmFyNTc7CisgIG9yY19pbnQ4IHZhcjU4OworICBvcmNfaW50OCB2YXI1OTsKKyAgb3JjX2ludDggdmFyNjA7CisgIG9yY19pbnQ4IHZhcjYxOworICBvcmNfaW50OCB2YXI2MjsKKyAgb3JjX2ludDggdmFyNjM7CisgIG9yY19pbnQ4IHZhcjY0OworICBvcmNfaW50OCB2YXI2NTsKKyAgb3JjX2ludDggdmFyNjY7CisgIG9yY19pbnQ4IHZhcjY3OworICBvcmNfaW50OCB2YXI2ODsKKworICBwdHIwID0gKG9yY19pbnQ4ICopIGV4LT5hcnJheXNbMF07CisgIHB0cjQgPSAob3JjX2ludDggKikgZXgtPmFycmF5c1s0XTsKKyAgcHRyNSA9IChvcmNfaW50OCAqKSBleC0+YXJyYXlzWzVdOworICBwdHI2ID0gKG9yY19pbnQ4ICopIGV4LT5hcnJheXNbNl07CisgIHB0cjcgPSAob3JjX2ludDggKikgZXgtPmFycmF5c1s3XTsKKworICAvKiAxMTogbG9hZHBiICovCisgIHZhcjQ0ID0gMHgwMDAwMDA4MDsgICAgICAgICAgIC8qIDEyOCBvciA2LjMyNDA0ZS0zMjJmICovCisgIC8qIDIwOiBsb2FkcGIgKi8KKyAgdmFyNDUgPSBleC0+cGFyYW1zWzI0XTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLyogMDogbG9hZGIgKi8KKyAgICB2YXI0NyA9IHB0cjRbaV07CisgICAgLyogMTogbG9hZGIgKi8KKyAgICB2YXI0OCA9IHB0cjdbaV07CisgICAgLyogMjogbG9hZGIgKi8KKyAgICB2YXI0OSA9IHB0cjZbaV07CisgICAgLyogMzogbG9hZGIgKi8KKyAgICB2YXI1MCA9IHB0cjVbaV07CisgICAgLyogNDogYXZndWIgKi8KKyAgICB2YXI1MSA9ICgob3JjX3VpbnQ4KSB2YXI1MCArIChvcmNfdWludDgpIHZhcjQ5ICsgMSkgPj4gMTsKKyAgICAvKiA1OiBtYXh1YiAqLworICAgIHZhcjUyID0gT1JDX01BWCAoKG9yY191aW50OCkgdmFyNDcsIChvcmNfdWludDgpIHZhcjUxKTsKKyAgICAvKiA2OiBtaW51YiAqLworICAgIHZhcjUzID0gT1JDX01JTiAoKG9yY191aW50OCkgdmFyNDcsIChvcmNfdWludDgpIHZhcjUxKTsKKyAgICAvKiA3OiBzdWJiICovCisgICAgdmFyNTQgPSB2YXI1MiAtIHZhcjUzOworICAgIC8qIDg6IG1heHViICovCisgICAgdmFyNTUgPSBPUkNfTUFYICgob3JjX3VpbnQ4KSB2YXI0OCwgKG9yY191aW50OCkgdmFyNTEpOworICAgIC8qIDk6IG1pbnViICovCisgICAgdmFyNTYgPSBPUkNfTUlOICgob3JjX3VpbnQ4KSB2YXI0OCwgKG9yY191aW50OCkgdmFyNTEpOworICAgIC8qIDEwOiBzdWJiICovCisgICAgdmFyNTcgPSB2YXI1NSAtIHZhcjU2OworICAgIC8qIDEyOiB4b3JiICovCisgICAgdmFyNTggPSB2YXI1NCBeIHZhcjQ0OworICAgIC8qIDEzOiB4b3JiICovCisgICAgdmFyNTkgPSB2YXI1NyBeIHZhcjQ0OworICAgIC8qIDE0OiBjbXBndHNiICovCisgICAgdmFyNjAgPSAodmFyNTggPiB2YXI1OSkgPyAofjApIDogMDsKKyAgICAvKiAxNTogYW5kYiAqLworICAgIHZhcjYxID0gdmFyNDggJiB2YXI2MDsKKyAgICAvKiAxNjogYW5kbmIgKi8KKyAgICB2YXI2MiA9ICh+dmFyNjApICYgdmFyNDc7CisgICAgLyogMTc6IG9yYiAqLworICAgIHZhcjYzID0gdmFyNjEgfCB2YXI2MjsKKyAgICAvKiAxODogbWF4dWIgKi8KKyAgICB2YXI2NCA9IE9SQ19NQVggKChvcmNfdWludDgpIHZhcjUwLCAob3JjX3VpbnQ4KSB2YXI0OSk7CisgICAgLyogMTk6IG1pbnViICovCisgICAgdmFyNjUgPSBPUkNfTUlOICgob3JjX3VpbnQ4KSB2YXI1MCwgKG9yY191aW50OCkgdmFyNDkpOworICAgIC8qIDIxOiBhZGR1c2IgKi8KKyAgICB2YXI2NiA9IE9SQ19DTEFNUF9VQiAoKG9yY191aW50OCkgdmFyNjQgKyAob3JjX3VpbnQ4KSB2YXI0NSk7CisgICAgLyogMjI6IHN1YnVzYiAqLworICAgIHZhcjY3ID0gT1JDX0NMQU1QX1VCICgob3JjX3VpbnQ4KSB2YXI2NSAtIChvcmNfdWludDgpIHZhcjQ1KTsKKyAgICAvKiAyMzogbWludWIgKi8KKyAgICB2YXI2OCA9IE9SQ19NSU4gKChvcmNfdWludDgpIHZhcjYzLCAob3JjX3VpbnQ4KSB2YXI2Nik7CisgICAgLyogMjQ6IG1heHViICovCisgICAgdmFyNDYgPSBPUkNfTUFYICgob3JjX3VpbnQ4KSB2YXI2OCwgKG9yY191aW50OCkgdmFyNjcpOworICAgIC8qIDI1OiBzdG9yZWIgKi8KKyAgICBwdHIwW2ldID0gdmFyNDY7CisgIH0KKworfQorCit2b2lkCitkZWludGVybGFjZV9saW5lX2dyZWVkeSAob3JjX3VpbnQ4ICogT1JDX1JFU1RSSUNUIGQxLAorICAgIGNvbnN0IG9yY191aW50OCAqIE9SQ19SRVNUUklDVCBzMSwgY29uc3Qgb3JjX3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMyLAorICAgIGNvbnN0IG9yY191aW50OCAqIE9SQ19SRVNUUklDVCBzMywgY29uc3Qgb3JjX3VpbnQ4ICogT1JDX1JFU1RSSUNUIHM0LAorICAgIGludCBwMSwgaW50IG4pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA5LCAyMywgMTAwLCAxMDEsIDEwNSwgMTEwLCAxMTYsIDEwMSwgMTE0LCAxMDgsIDk3LCA5OSwgMTAxLCA5NSwgMTA4LAorICAgICAgICAxMDUsIDExMCwgMTAxLCA5NSwgMTAzLCAxMTQsIDEwMSwgMTAxLCAxMDAsIDEyMSwgMTEsIDEsIDEsIDEyLCAxLCAxLAorICAgICAgICAxMiwgMSwgMSwgMTIsIDEsIDEsIDEyLCAxLCAxLCAxNCwgMSwgMTI4LCAwLCAwLCAwLCAxNiwKKyAgICAgICAgMSwgMjAsIDEsIDIwLCAxLCAyMCwgMSwgMjAsIDEsIDIwLCAxLCAyMCwgMSwgMjAsIDEsIDIwLAorICAgICAgICAxLCAyMCwgMSwgMjAsIDEsIDIwLCAxLCAyMCwgMSwgNDMsIDMyLCA0LCA0MywgMzMsIDcsIDQzLAorICAgICAgICAzNCwgNiwgNDMsIDM1LCA1LCAzOSwgMzYsIDM1LCAzNCwgNTMsIDM5LCAzMiwgMzYsIDU1LCA0MCwgMzIsCisgICAgICAgIDM2LCA2NSwgMzcsIDM5LCA0MCwgNTMsIDM5LCAzMywgMzYsIDU1LCA0MCwgMzMsIDM2LCA2NSwgMzgsIDM5LAorICAgICAgICA0MCwgNjgsIDM3LCAzNywgMTYsIDY4LCAzOCwgMzgsIDE2LCA0MSwgNDAsIDM3LCAzOCwgMzYsIDM5LCAzMywKKyAgICAgICAgNDAsIDM3LCA0MCwgNDAsIDMyLCA1OSwgNDEsIDM5LCA0MCwgNTMsIDQzLCAzNSwgMzQsIDU1LCA0MiwgMzUsCisgICAgICAgIDM0LCAzNSwgNDMsIDQzLCAyNCwgNjcsIDQyLCA0MiwgMjQsIDU1LCA0MSwgNDEsIDQzLCA1MywgMCwgNDEsCisgICAgICAgIDQyLCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsIF9iYWNrdXBfZGVpbnRlcmxhY2VfbGluZV9ncmVlZHkpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgImRlaW50ZXJsYWNlX2xpbmVfZ3JlZWR5Iik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLCBfYmFja3VwX2RlaW50ZXJsYWNlX2xpbmVfZ3JlZWR5KTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9kZXN0aW5hdGlvbiAocCwgMSwgImQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCAxLCAiczEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9zb3VyY2UgKHAsIDEsICJzMiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgMSwgInMzIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCAxLCAiczQiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9jb25zdGFudCAocCwgMSwgMHgwMDAwMDA4MCwgImMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfcGFyYW1ldGVyIChwLCAxLCAicDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDEsICJ0MSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgMSwgInQyIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCAxLCAidDMiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDEsICJ0NCIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgMSwgInQ1Iik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCAxLCAidDYiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDEsICJ0NyIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgMSwgInQ4Iik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCAxLCAidDkiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDEsICJ0MTAiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDEsICJ0MTEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDEsICJ0MTIiKTsKKworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJsb2FkYiIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfUzEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImxvYWRiIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9TNCwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibG9hZGIiLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1MzLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJsb2FkYiIsIDAsIE9SQ19WQVJfVDQsIE9SQ19WQVJfUzIsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImF2Z3ViIiwgMCwgT1JDX1ZBUl9UNSwgT1JDX1ZBUl9UNCwgT1JDX1ZBUl9UMywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibWF4dWIiLCAwLCBPUkNfVkFSX1Q4LCBPUkNfVkFSX1QxLCBPUkNfVkFSX1Q1LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtaW51YiIsIDAsIE9SQ19WQVJfVDksIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDUsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInN1YmIiLCAwLCBPUkNfVkFSX1Q2LCBPUkNfVkFSX1Q4LCBPUkNfVkFSX1Q5LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtYXh1YiIsIDAsIE9SQ19WQVJfVDgsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDUsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm1pbnViIiwgMCwgT1JDX1ZBUl9UOSwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UNSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic3ViYiIsIDAsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDgsIE9SQ19WQVJfVDksCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInhvcmIiLCAwLCBPUkNfVkFSX1Q2LCBPUkNfVkFSX1Q2LCBPUkNfVkFSX0MxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJ4b3JiIiwgMCwgT1JDX1ZBUl9UNywgT1JDX1ZBUl9UNywgT1JDX1ZBUl9DMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY21wZ3RzYiIsIDAsIE9SQ19WQVJfVDksIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDcsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImFuZGIiLCAwLCBPUkNfVkFSX1Q4LCBPUkNfVkFSX1QyLCBPUkNfVkFSX1Q5LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhbmRuYiIsIDAsIE9SQ19WQVJfVDksIE9SQ19WQVJfVDksIE9SQ19WQVJfVDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm9yYiIsIDAsIE9SQ19WQVJfVDEwLCBPUkNfVkFSX1Q4LCBPUkNfVkFSX1Q5LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtYXh1YiIsIDAsIE9SQ19WQVJfVDEyLCBPUkNfVkFSX1Q0LCBPUkNfVkFSX1QzLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtaW51YiIsIDAsIE9SQ19WQVJfVDExLCBPUkNfVkFSX1Q0LCBPUkNfVkFSX1QzLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhZGR1c2IiLCAwLCBPUkNfVkFSX1QxMiwgT1JDX1ZBUl9UMTIsCisgICAgICAgICAgT1JDX1ZBUl9QMSwgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInN1YnVzYiIsIDAsIE9SQ19WQVJfVDExLCBPUkNfVkFSX1QxMSwKKyAgICAgICAgICBPUkNfVkFSX1AxLCBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibWludWIiLCAwLCBPUkNfVkFSX1QxMCwgT1JDX1ZBUl9UMTAsCisgICAgICAgICAgT1JDX1ZBUl9UMTIsIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtYXh1YiIsIDAsIE9SQ19WQVJfRDEsIE9SQ19WQVJfVDEwLCBPUkNfVkFSX1QxMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1MxXSA9ICh2b2lkICopIHMxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzJdID0gKHZvaWQgKikgczI7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TM10gPSAodm9pZCAqKSBzMzsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1M0XSA9ICh2b2lkICopIHM0OworICBleC0+cGFyYW1zW09SQ19WQVJfUDFdID0gcDE7CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0LmggYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLWRpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGJjOTAxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS1kaXN0LmgKQEAgLTAsMCArMSw5MyBAQAorCisvKiBhdXRvZ2VuZXJhdGVkIGZyb20gdHZ0aW1lLm9yYyAqLworCisjaWZuZGVmIF9UVlRJTUVfSF8KKyNkZWZpbmUgX1RWVElNRV9IXworCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworCisjaWZuZGVmIF9PUkNfSU5URUdFUl9UWVBFREVGU18KKyNkZWZpbmUgX09SQ19JTlRFR0VSX1RZUEVERUZTXworI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjaW5jbHVkZSA8c3RkaW50Lmg+Cit0eXBlZGVmIGludDhfdCBvcmNfaW50ODsKK3R5cGVkZWYgaW50MTZfdCBvcmNfaW50MTY7Cit0eXBlZGVmIGludDMyX3Qgb3JjX2ludDMyOwordHlwZWRlZiBpbnQ2NF90IG9yY19pbnQ2NDsKK3R5cGVkZWYgdWludDhfdCBvcmNfdWludDg7Cit0eXBlZGVmIHVpbnQxNl90IG9yY191aW50MTY7Cit0eXBlZGVmIHVpbnQzMl90IG9yY191aW50MzI7Cit0eXBlZGVmIHVpbnQ2NF90IG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSBVSU5UNjRfQyh4KQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKK3R5cGVkZWYgc2lnbmVkIF9faW50OCBvcmNfaW50ODsKK3R5cGVkZWYgc2lnbmVkIF9faW50MTYgb3JjX2ludDE2OwordHlwZWRlZiBzaWduZWQgX19pbnQzMiBvcmNfaW50MzI7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDY0IG9yY19pbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ4IG9yY191aW50ODsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQxNiBvcmNfdWludDE2OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDMyIG9yY191aW50MzI7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgb3JjX3VpbnQ2NDsKKyNkZWZpbmUgT1JDX1VJTlQ2NF9DKHgpICh4IyNVaTY0KQorI2RlZmluZSBpbmxpbmUgX19pbmxpbmUKKyNlbHNlCisjaW5jbHVkZSA8bGltaXRzLmg+Cit0eXBlZGVmIHNpZ25lZCBjaGFyIG9yY19pbnQ4OwordHlwZWRlZiBzaG9ydCBvcmNfaW50MTY7Cit0eXBlZGVmIGludCBvcmNfaW50MzI7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgb3JjX3VpbnQ4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBvcmNfdWludDE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgb3JjX3VpbnQzMjsKKyNpZiBJTlRfTUFYID09IExPTkdfTUFYCit0eXBlZGVmIGxvbmcgbG9uZyBvcmNfaW50NjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgKHgjI1VMTCkKKyNlbHNlCit0eXBlZGVmIGxvbmcgb3JjX2ludDY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSAoeCMjVUwpCisjZW5kaWYKKyNlbmRpZgordHlwZWRlZiB1bmlvbiB7IG9yY19pbnQxNiBpOyBvcmNfaW50OCB4MlsyXTsgfSBvcmNfdW5pb24xNjsKK3R5cGVkZWYgdW5pb24geyBvcmNfaW50MzIgaTsgZmxvYXQgZjsgb3JjX2ludDE2IHgyWzJdOyBvcmNfaW50OCB4NFs0XTsgfSBvcmNfdW5pb24zMjsKK3R5cGVkZWYgdW5pb24geyBvcmNfaW50NjQgaTsgZG91YmxlIGY7IG9yY19pbnQzMiB4MlsyXTsgZmxvYXQgeDJmWzJdOyBvcmNfaW50MTYgeDRbNF07IH0gb3JjX3VuaW9uNjQ7CisjZW5kaWYKKyNpZm5kZWYgT1JDX1JFU1RSSUNUCisjaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyNkZWZpbmUgT1JDX1JFU1RSSUNUIHJlc3RyaWN0CisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSA0CisjZGVmaW5lIE9SQ19SRVNUUklDVCBfX3Jlc3RyaWN0X18KKyNlbHNlCisjZGVmaW5lIE9SQ19SRVNUUklDVAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBPUkNfSU5URVJOQUwKKyNpZiBkZWZpbmVkKF9fU1VOUFJPX0MpICYmIChfX1NVTlBST19DID49IDB4NTkwKQorI2RlZmluZSBPUkNfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKQorI2VsaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU1MCkKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9faGlkZGVuCisjZWxpZiBkZWZpbmVkIChfX0dOVUNfXykKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbHNlCisjZGVmaW5lIE9SQ19JTlRFUk5BTAorI2VuZGlmCisjZW5kaWYKKwordm9pZCBkZWludGVybGFjZV9saW5lX3ZmaXIgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczIsIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMywgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHM0LCBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczUsIGludCBuKTsKK3ZvaWQgZGVpbnRlcmxhY2VfbGluZV9saW5lYXIgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczIsIGludCBuKTsKK3ZvaWQgZGVpbnRlcmxhY2VfbGluZV9saW5lYXJfYmxlbmQgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczIsIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMywgaW50IG4pOwordm9pZCBkZWludGVybGFjZV9saW5lX2dyZWVkeSAob3JjX3VpbnQ4ICogT1JDX1JFU1RSSUNUIGQxLCBjb25zdCBvcmNfdWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGNvbnN0IG9yY191aW50OCAqIE9SQ19SRVNUUklDVCBzMiwgY29uc3Qgb3JjX3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMzLCBjb25zdCBvcmNfdWludDggKiBPUkNfUkVTVFJJQ1QgczQsIGludCBwMSwgaW50IG4pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS5vcmMgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLm9yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDIxN2U3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS5vcmMKQEAgLTAsMCArMSwxMDkgQEAKKworLmZ1bmN0aW9uIGRlaW50ZXJsYWNlX2xpbmVfdmZpcgorLmRlc3QgMSBkMSBndWludDgKKy5zb3VyY2UgMSBzMSBndWludDgKKy5zb3VyY2UgMSBzMiBndWludDgKKy5zb3VyY2UgMSBzMyBndWludDgKKy5zb3VyY2UgMSBzNCBndWludDgKKy5zb3VyY2UgMSBzNSBndWludDgKKy50ZW1wIDIgdDEKKy50ZW1wIDIgdDIKKy50ZW1wIDIgdDMKKworY29udnVidyB0MSwgczEKK2NvbnZ1YncgdDIsIHM1CithZGR3IHQxLCB0MSwgdDIKK2NvbnZ1YncgdDIsIHMyCitjb252dWJ3IHQzLCBzNAorYWRkdyB0MiwgdDIsIHQzCitzaGx3IHQyLCB0MiwgMgorY29udnVidyB0MywgczMKK3NobHcgdDMsIHQzLCAxCitzdWJ3IHQyLCB0MiwgdDEKK2FkZHcgdDIsIHQyLCB0MworYWRkdyB0MiwgdDIsIDQKK3NocnN3IHQyLCB0MiwgMworY29udnN1c3diIGQxLCB0MgorCisKKy5mdW5jdGlvbiBkZWludGVybGFjZV9saW5lX2xpbmVhcgorLmRlc3QgMSBkMSBndWludDgKKy5zb3VyY2UgMSBzMSBndWludDgKKy5zb3VyY2UgMSBzMiBndWludDgKKworYXZndWIgZDEsIHMxLCBzMgorCisKKy5mdW5jdGlvbiBkZWludGVybGFjZV9saW5lX2xpbmVhcl9ibGVuZAorLmRlc3QgMSBkMSBndWludDgKKy5zb3VyY2UgMSBzMSBndWludDgKKy5zb3VyY2UgMSBzMiBndWludDgKKy5zb3VyY2UgMSBzMyBndWludDgKKy50ZW1wIDIgdDEKKy50ZW1wIDIgdDIKKy50ZW1wIDIgdDMKKworY29udnVidyB0MSwgczEKK2NvbnZ1YncgdDIsIHMyCitjb252dWJ3IHQzLCBzMworYWRkdyB0MSwgdDEsIHQyCithZGR3IHQzLCB0MywgdDMKK2FkZHcgdDEsIHQxLCB0MworYWRkdyB0MSwgdDEsIDIKK3NocnN3IHQxLCB0MSwgMgorY29udnN1c3diIGQxLCB0MQorCisKKy5mdW5jdGlvbiBkZWludGVybGFjZV9saW5lX2dyZWVkeQorLmRlc3QgMSBkMQorLnNvdXJjZSAxIG0wCisuc291cmNlIDEgdDEKKy5zb3VyY2UgMSBiMQorLnNvdXJjZSAxIG0yCisucGFyYW0gMSBtYXhfY29tYgorLnRlbXAgMSB0bTAKKy50ZW1wIDEgdG0yCisudGVtcCAxIHRiMQorLnRlbXAgMSB0dDEKKy50ZW1wIDEgYXZnCisudGVtcCAxIGwyX2RpZmYKKy50ZW1wIDEgbHAyX2RpZmYKKy50ZW1wIDEgdDIKKy50ZW1wIDEgdDMKKy50ZW1wIDEgYmVzdAorLnRlbXAgMSBtaW4KKy50ZW1wIDEgbWF4CisKKworbG9hZGIgdG0wLCBtMAorbG9hZGIgdG0yLCBtMgorCitsb2FkYiB0YjEsIGIxCitsb2FkYiB0dDEsIHQxCithdmd1YiBhdmcsIHR0MSwgdGIxCisKK21heHViIHQyLCB0bTAsIGF2ZworbWludWIgdDMsIHRtMCwgYXZnCitzdWJiIGwyX2RpZmYsIHQyLCB0MworCittYXh1YiB0MiwgdG0yLCBhdmcKK21pbnViIHQzLCB0bTIsIGF2Zworc3ViYiBscDJfZGlmZiwgdDIsIHQzCisKK3hvcmIgbDJfZGlmZiwgbDJfZGlmZiwgMHg4MAoreG9yYiBscDJfZGlmZiwgbHAyX2RpZmYsIDB4ODAKK2NtcGd0c2IgdDMsIGwyX2RpZmYsIGxwMl9kaWZmCisKK2FuZGIgdDIsIHRtMiwgdDMKK2FuZG5iIHQzLCB0MywgdG0wCitvcmIgYmVzdCwgdDIsIHQzCisKK21heHViIG1heCwgdHQxLCB0YjEKK21pbnViIG1pbiwgdHQxLCB0YjEKK2FkZHVzYiBtYXgsIG1heCwgbWF4X2NvbWIKK3N1YnVzYiBtaW4sIG1pbiwgbWF4X2NvbWIKK21pbnViIGJlc3QsIGJlc3QsIG1heAorbWF4dWIgZDEsIGJlc3QsIG1pbgorCisKKwpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHkuYyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA0Y2U4YgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5LmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgVG9tIEJhcnJ5ICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogbW14LmggcG9ydCBjb3B5cmlnaHQgKGMpIDIwMDIgQmlsbHkgQmlnZ3MgPHZla3RvckBkdW1idGVybS5uZXQ+LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogUmVsaWNlbnNlZCBmb3IgR1N0cmVhbWVyIGZyb20gR1BMIHRvIExHUEwgd2l0aCBwZXJtaXQgZnJvbSBUb20gQmFycnkKKyAqIGFuZCBCaWxseSBCaWdncy4KKyAqIFNlZTogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNTc4CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGRlaW50ZXJsYWNlbWV0aG9kLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidHZ0aW1lLmgiCisKKworI2RlZmluZSBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0wJKGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2xfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9JU19ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0wob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9MKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9HUkVFRFlfTF9DTEFTUyhrbGFzcykJKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0wpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9MX0dFVF9DTEFTUyhvYmopCShHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9MLCBHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUxDbGFzcykpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0wob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9MLCBHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUwpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9MX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9HUkVFRFlfTCwgR3N0RGVpbnRlcmxhY2VNZXRob2RHcmVlZHlMQ2xhc3MpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9MX0NBU1Qob2JqKQkoKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5TCopKG9iaikpCisKK0dUeXBlIGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2xfZ2V0X3R5cGUgKHZvaWQpOworCit0eXBlZGVmIHN0cnVjdAoreworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCBwYXJlbnQ7CisKKyAgZ3VpbnQgbWF4X2NvbWI7Cit9IEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5TDsKKwordHlwZWRlZiBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzIEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5TENsYXNzOworCisvLyBUaGlzIGlzIGEgc2ltcGxlIGxpZ2h0d2VpZ2h0IERlSW50ZXJsYWNlIG1ldGhvZCB0aGF0IHVzZXMgbGl0dGxlIENQVSB0aW1lCisvLyBidXQgZ2l2ZXMgdmVyeSBnb29kIHJlc3VsdHMgZm9yIGxvdyBvciBpbnRlcm1lZGl0ZSBtb3Rpb24uCisvLyBJdCBkZWZlcnMgZnJhbWVzIGJ5IG9uZSBmaWVsZCwgYnV0IHRoYXQgZG9lcyBub3Qgc2VlbSB0byBwcm9kdWNlIG5vdGljZWFibGUKKy8vIGxpcCBzeW5jIHByb2JsZW1zLgorLy8KKy8vIFRoZSBtZXRob2QgdXNlZCBpcyB0byB0YWtlIGVpdGhlciB0aGUgb2xkZXIgb3IgbmV3ZXIgd2VhdmUgcGl4ZWwgZGVwZW5kaW5nCisvLyB1cG9uIHdoaWNoIGdpdmUgdGhlIHNtYWxsZXIgY29tYiBmYWN0b3IsIGFuZCB0aGVuIGNsaXAgdG8gYXZvaWQgbGFyZ2UgZGFtYWdlCisvLyB3aGVuIHdyb25nLgorLy8KKy8vIEknZCBpbnRlbmRlZCB0aGlzIHRvIGJlIHBhcnQgb2YgYSBsYXJnZXIgbW9yZSBlbGFib3JhdGUgbWV0aG9kIGFkZGVkIHRvIAorLy8gQmxlbmRlZCBDbGlwIGJ1dCB0aGlzIGdpdmUgdG9vIGdvb2QgcmVzdWx0cyBmb3IgdGhlIENQVSB0byBpZ25vcmUgaGVyZS4KKworc3RhdGljIGlubGluZSB2b2lkCitkZWludGVybGFjZV9ncmVlZHlfaW50ZXJwb2xhdGVfc2NhbmxpbmVfb3JjIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgZ3VpbnQgbWF4X2NvbWIgPSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9MIChzZWxmKS0+bWF4X2NvbWI7CisKKyAgaWYgKHNjYW5saW5lcy0+bTEgPT0gTlVMTCB8fCBzY2FubGluZXMtPm1wID09IE5VTEwpIHsKKyAgICBkZWludGVybGFjZV9saW5lX2xpbmVhciAob3V0LCBzY2FubGluZXMtPnQwLCBzY2FubGluZXMtPmIwLCBzaXplKTsKKyAgfSBlbHNlIHsKKyAgICBkZWludGVybGFjZV9saW5lX2dyZWVkeSAob3V0LCBzY2FubGluZXMtPm0xLCBzY2FubGluZXMtPnQwLCBzY2FubGluZXMtPmIwLAorICAgICAgICBzY2FubGluZXMtPm1wID8gc2NhbmxpbmVzLT5tcCA6IHNjYW5saW5lcy0+bTEsIG1heF9jb21iLCBzaXplKTsKKyAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RlaW50ZXJsYWNlX2dyZWVkeV9pbnRlcnBvbGF0ZV9zY2FubGluZV9vcmNfcGxhbmFyX3UgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kCisgICAgKiBzZWxmLCBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludAorICAgIHNpemUpCit7CisgIGd1aW50IG1heF9jb21iID0gR1NUX0RFSU5URVJMQUNFX01FVEhPRF9HUkVFRFlfTCAoc2VsZiktPm1heF9jb21iOworCisgIGlmIChzY2FubGluZXMtPm0xID09IE5VTEwgfHwgc2NhbmxpbmVzLT5tcCA9PSBOVUxMKSB7CisgICAgZGVpbnRlcmxhY2VfbGluZV9saW5lYXIgKG91dCwgc2NhbmxpbmVzLT50MCwgc2NhbmxpbmVzLT5iMCwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgZGVpbnRlcmxhY2VfbGluZV9ncmVlZHkgKG91dCwgc2NhbmxpbmVzLT5tMSwgc2NhbmxpbmVzLT50MCwgc2NhbmxpbmVzLT5iMCwKKyAgICAgICAgc2NhbmxpbmVzLT5tcCA/IHNjYW5saW5lcy0+bXAgOiBzY2FubGluZXMtPm0xLCBtYXhfY29tYiwgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitkZWludGVybGFjZV9ncmVlZHlfaW50ZXJwb2xhdGVfc2NhbmxpbmVfb3JjX3BsYW5hcl92IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZAorICAgICogc2VsZiwgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQKKyAgICBzaXplKQoreworICBndWludCBtYXhfY29tYiA9IEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0wgKHNlbGYpLT5tYXhfY29tYjsKKworICBpZiAoc2NhbmxpbmVzLT5tMSA9PSBOVUxMIHx8IHNjYW5saW5lcy0+bXAgPT0gTlVMTCkgeworICAgIGRlaW50ZXJsYWNlX2xpbmVfbGluZWFyIChvdXQsIHNjYW5saW5lcy0+dDAsIHNjYW5saW5lcy0+YjAsIHNpemUpOworICB9IGVsc2UgeworICAgIGRlaW50ZXJsYWNlX2xpbmVfZ3JlZWR5IChvdXQsIHNjYW5saW5lcy0+bTEsIHNjYW5saW5lcy0+dDAsIHNjYW5saW5lcy0+YjAsCisgICAgICAgIHNjYW5saW5lcy0+bXAgPyBzY2FubGluZXMtPm1wIDogc2NhbmxpbmVzLT5tMSwgbWF4X2NvbWIsIHNpemUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9ncmVlZHlfY29weV9zY2FubGluZSAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0wLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX2dyZWVkeV9jb3B5X3NjYW5saW5lX3BsYW5hcl91IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTAsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2VfZ3JlZWR5X2NvcHlfc2NhbmxpbmVfcGxhbmFyX3YgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMCwgc2l6ZSk7Cit9CisKK0dfREVGSU5FX1RZUEUgKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5TCwgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfbCwKKyAgICBHU1RfVFlQRV9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTUFYX0NPTUIKK307CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dyZWVkeV9sX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUwgKnNlbGYgPSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9MIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NQVhfQ09NQjoKKyAgICAgIHNlbGYtPm1heF9jb21iID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2xfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5TCAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0wgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01BWF9DT01COgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNlbGYtPm1heF9jb21iKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dyZWVkeV9sX2NsYXNzX2luaXQgKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5TENsYXNzICoKKyAgICBrbGFzcykKK3sKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqZGltX2NsYXNzID0gKEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKikga2xhc3M7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgKmRpc21fY2xhc3MgPQorICAgICAgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgKikga2xhc3M7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfbF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2xfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX0NPTUIsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm1heC1jb21iIiwKKyAgICAgICAgICAiTWF4IGNvbWIiLAorICAgICAgICAgICJNYXggQ29tYiIsIDAsIDI1NSwgMTUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykKKyAgICAgICk7CisKKyAgZGltX2NsYXNzLT5maWVsZHNfcmVxdWlyZWQgPSAyOworICBkaW1fY2xhc3MtPm5hbWUgPSAiTW90aW9uIEFkYXB0aXZlOiBTaW1wbGUgRGV0ZWN0aW9uIjsKKyAgZGltX2NsYXNzLT5uaWNrID0gImdyZWVkeWwiOworICBkaW1fY2xhc3MtPmxhdGVuY3kgPSAxOworCisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2F5dXYgPQorICAgICAgZGVpbnRlcmxhY2VfZ3JlZWR5X2ludGVycG9sYXRlX3NjYW5saW5lX29yYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXV5MiA9CisgICAgICBkZWludGVybGFjZV9ncmVlZHlfaW50ZXJwb2xhdGVfc2NhbmxpbmVfb3JjOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV95dnl1ID0KKyAgICAgIGRlaW50ZXJsYWNlX2dyZWVkeV9pbnRlcnBvbGF0ZV9zY2FubGluZV9vcmM7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3V5dnkgPQorICAgICAgZGVpbnRlcmxhY2VfZ3JlZWR5X2ludGVycG9sYXRlX3NjYW5saW5lX29yYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYXJnYiA9CisgICAgICBkZWludGVybGFjZV9ncmVlZHlfaW50ZXJwb2xhdGVfc2NhbmxpbmVfb3JjOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9hYmdyID0KKyAgICAgIGRlaW50ZXJsYWNlX2dyZWVkeV9pbnRlcnBvbGF0ZV9zY2FubGluZV9vcmM7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3JnYmEgPQorICAgICAgZGVpbnRlcmxhY2VfZ3JlZWR5X2ludGVycG9sYXRlX3NjYW5saW5lX29yYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyYSA9CisgICAgICBkZWludGVybGFjZV9ncmVlZHlfaW50ZXJwb2xhdGVfc2NhbmxpbmVfb3JjOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9yZ2IgPQorICAgICAgZGVpbnRlcmxhY2VfZ3JlZWR5X2ludGVycG9sYXRlX3NjYW5saW5lX29yYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyID0KKyAgICAgIGRlaW50ZXJsYWNlX2dyZWVkeV9pbnRlcnBvbGF0ZV9zY2FubGluZV9vcmM7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl95ID0KKyAgICAgIGRlaW50ZXJsYWNlX2dyZWVkeV9pbnRlcnBvbGF0ZV9zY2FubGluZV9vcmM7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl91ID0KKyAgICAgIGRlaW50ZXJsYWNlX2dyZWVkeV9pbnRlcnBvbGF0ZV9zY2FubGluZV9vcmNfcGxhbmFyX3U7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl92ID0KKyAgICAgIGRlaW50ZXJsYWNlX2dyZWVkeV9pbnRlcnBvbGF0ZV9zY2FubGluZV9vcmNfcGxhbmFyX3Y7CisKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9heXV2ID0gZGVpbnRlcmxhY2VfZ3JlZWR5X2NvcHlfc2NhbmxpbmU7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfeXV5MiA9IGRlaW50ZXJsYWNlX2dyZWVkeV9jb3B5X3NjYW5saW5lOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3l2eXUgPSBkZWludGVybGFjZV9ncmVlZHlfY29weV9zY2FubGluZTsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV91eXZ5ID0gZGVpbnRlcmxhY2VfZ3JlZWR5X2NvcHlfc2NhbmxpbmU7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfYXJnYiA9IGRlaW50ZXJsYWNlX2dyZWVkeV9jb3B5X3NjYW5saW5lOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2FiZ3IgPSBkZWludGVybGFjZV9ncmVlZHlfY29weV9zY2FubGluZTsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9yZ2JhID0gZGVpbnRlcmxhY2VfZ3JlZWR5X2NvcHlfc2NhbmxpbmU7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfYmdyYSA9IGRlaW50ZXJsYWNlX2dyZWVkeV9jb3B5X3NjYW5saW5lOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3JnYiA9IGRlaW50ZXJsYWNlX2dyZWVkeV9jb3B5X3NjYW5saW5lOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2JnciA9IGRlaW50ZXJsYWNlX2dyZWVkeV9jb3B5X3NjYW5saW5lOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3BsYW5hcl95ID0gZGVpbnRlcmxhY2VfZ3JlZWR5X2NvcHlfc2NhbmxpbmU7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3UgPQorICAgICAgZGVpbnRlcmxhY2VfZ3JlZWR5X2NvcHlfc2NhbmxpbmVfcGxhbmFyX3U7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3YgPQorICAgICAgZGVpbnRlcmxhY2VfZ3JlZWR5X2NvcHlfc2NhbmxpbmVfcGxhbmFyX3Y7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2dyZWVkeV9sX2luaXQgKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5TCAqIHNlbGYpCit7CisgIHNlbGYtPm1heF9jb21iID0gMTU7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYXNtIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWEwM2RmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9ncmVlZHloLmFzbQpAQCAtMCwwICsxLDQ3MiBAQAorLyoKKyAqCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMSBUb20gQmFycnkuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4LDIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWdsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKy8qCisgKiBSZWxpY2Vuc2VkIGZvciBHU3RyZWFtZXIgZnJvbSBHUEwgdG8gTEdQTCB3aXRoIHBlcm1pdCBmcm9tIFRvbSBCYXJyeS4KKyAqIFNlZTogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNTc4CisgKi8KKworCisjaW5jbHVkZSAieDg2LTY0X21hY3Jvcy5pbmMiCisKK3N0YXRpYyB2b2lkCitGVU5DVF9OQU1FX1lVWTIgKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SCAqc2VsZiwgY29uc3QgZ3VpbnQ4ICogTDEsIGNvbnN0IGd1aW50OCAqIEwyLCBjb25zdCBndWludDggKiBMMywgY29uc3QgZ3VpbnQ4ICogTDJQLCBndWludDggKiBEZXN0LCBnaW50IHdpZHRoKQoreworCisgIC8vIGluIHRpZ2h0IGxvb3Agc29tZSB2YXJzIGFyZSBhY2Nlc3NlZCBmYXN0ZXIgaW4gbG9jYWwgc3RvcmFnZQorICBnaW50NjQgWU1hc2sgPSAweDAwZmYwMGZmMDBmZjAwZmZ1bGw7ICAgICAgICAvLyB0byBrZWVwIG9ubHkgbHVtYQorICBnaW50NjQgVVZNYXNrID0gMHhmZjAwZmYwMGZmMDBmZjAwdWxsOyAgICAgICAvLyB0byBrZWVwIG9ubHkgY2hyb21hCisgIGdpbnQ2NCBTaGlmdE1hc2sgPSAweGZlZmVmZWZlZmVmZWZlZmV1bGw7ICAgIC8vIHRvIGF2b2lkIHNoaWZ0aW5nIGNocm9tYSB0byBsdW1hCisgIGdpbnQ2NCBRVzI1NiA9IDB4MDEwMDAxMDAwMTAwMDEwMHVsbDsgICAgICAgIC8vIDQgMjU2J3MKKyAgZ2ludDY0IE1heENvbWI7CisgIGdpbnQ2NCBNb3Rpb25UaHJlc2hvbGQ7CisgIGdpbnQ2NCBNb3Rpb25TZW5zZTsKKyAgZ2ludDY0IGk7CisgIGdsb25nIExvb3BDdHI7CisgIGdsb25nIG9sZGJ4ID0gMDsKKworICBnaW50NjQgUVcyNTZCOworICBnaW50NjQgTGFzdEF2ZyA9IDA7ICAgICAgICAgIC8vaW50ZXJwIHZhbHVlIGZyb20gbGVmdCBxd29yZAorCisgIC8vIEZJWE1FOiBVc2UgQyBpbXBsZW1lbnRhdGlvbiBpZiB0aGUgd2lkdGggaXMgbm90IGEgbXVsdGlwbGUgb2YgNAorICAvLyBEbyBzb21ldGhpbmcgbW9yZSBvcHRpbWFsIGxhdGVyCisgIGlmICh3aWR0aCAlIDQgIT0gMCkKKyAgICBDX0ZVTkNUX1lVWTIgKHNlbGYsIEwxLCBMMiwgTDMsIEwyUCwgRGVzdCwgd2lkdGgpOworCisgIC8vIFNldCB1cCBvdXIgdHdvIHBhcm1zIHRoYXQgYXJlIGFjdHVhbGx5IGV2YWx1YXRlZCBmb3IgZWFjaCBwaXhlbAorICBpID0gc2VsZi0+bWF4X2NvbWI7CisgIE1heENvbWIgPQorICAgICAgaSA8PCA1NiB8IGkgPDwgNDggfCBpIDw8IDQwIHwgaSA8PCAzMiB8IGkgPDwgMjQgfCBpIDw8IDE2IHwgaSA8PCA4IHwgaTsKKworICBpID0gc2VsZi0+bW90aW9uX3RocmVzaG9sZDsgICAgLy8gc2NhbGUgdG8gcmFuZ2Ugb2YgMC0yNTcKKyAgTW90aW9uVGhyZXNob2xkID0gaSA8PCA0OCB8IGkgPDwgMzIgfCBpIDw8IDE2IHwgaSB8IFVWTWFzazsKKworICBpID0gc2VsZi0+bW90aW9uX3NlbnNlOyAgICAgICAgLy8gc2NhbGUgdG8gcmFuZ2Ugb2YgMC0yNTcKKyAgTW90aW9uU2Vuc2UgPSBpIDw8IDQ4IHwgaSA8PCAzMiB8IGkgPDwgMTYgfCBpOworCisgIGkgPSAweGZmZmZmZmZmIC0gMjU2OworICBRVzI1NkIgPSBpIDw8IDQ4IHwgaSA8PCAzMiB8IGkgPDwgMTYgfCBpOyAgICAgLy8gc2F2ZSBhIGNvdXBsZSBpbnN0ciBvbiBQTUlOU1cgaW5zdHJ1Y3QuCisKKyAgTG9vcEN0ciA9IHdpZHRoIC8gOCAtIDE7ICAgICAgIC8vIHRoZXJlIGFyZSBMaW5lTGVuZ3RoIC8gNCBxd29yZHMgcGVyIGxpbmUgYnV0IGRvIDEgbGVzcywgYWRqIGF0IGVuZCBvZiBsb29wCisKKyAgLy8gRm9yIGVhc2Ugb2YgcmVhZGluZywgdGhlIGNvbW1lbnRzIGJlbG93IGFzc3VtZSB0aGF0IHdlJ3JlIG9wZXJhdGluZyBvbiBhbiBvZGQKKyAgLy8gZmllbGQgKGkuZS4sIHRoYXQgSW5mb0lzT2RkIGlzIHRydWUpLiAgQXNzdW1lIHRoZSBvYnZpb3VzIGZvciBldmVuIGxpbmVzLi4KKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorICAgICAgLy8gc2F2ZSBlYnggKC1mUElDKQorICAgICAgTU9WWCAiICUlIiBYQlggIiwgJVtvbGRieF1cblx0IgorICAgICAgTU9WWCAiICAlW0wxXSwgICAgICAgICAgJSUiIFhBWCAiXG5cdCIKKyAgICAgIExFQVggIiAgOCglJSIgWEFYICIpLCAgICAgJSUiIFhCWCAiXG5cdCIgICAvLyBuZXh0IHF3b3JkIG5lZWRlZCBieSBESlIKKyAgICAgIE1PVlggIiAgJVtMM10sICAgICAgICAgICUlIiBYQ1ggIlxuXHQiCisgICAgICBTVUJYICIgICUlIiBYQVggIiwgICAgICAgICUlIiBYQ1ggIlxuXHQiICAgLy8gY2FycnkgTDMgYWRkciBhcyBhbiBvZmZzZXQKKyAgICAgIE1PVlggIiAgJVtMMlBdLCAgICAgICAgICUlIiBYRFggIlxuXHQiCisgICAgICBNT1ZYICIgICVbTDJdLCAgICAgICAgICAlJSIgWFNJICJcblx0IgorICAgICAgTU9WWCAiICAlW0Rlc3RdLCAgICAgICAgJSUiIFhESSAiXG5cdCIgICAgICAvLyBETDEgaWYgT2RkIG9yIERMMiBpZiBFdmVuCisKKyAgICAgICIuYWxpZ24gOFxuXHQiCisgICAgICAiMTpcblx0IgorICAgICAgIm1vdnEgICglJSIgWFNJICIpLCAgICAgICUlbW0wXG5cdCIgICAgICAgLy8gTDIgLSB0aGUgbmV3ZXN0IHdlYXZlIHBpeGVsIHZhbHVlCisgICAgICAibW92cSAgKCUlIiBYQVggIiksICAgICAgJSVtbTFcblx0IiAgICAgICAvLyBMMSAtIHRoZSB0b3AgcGl4ZWwKKyAgICAgICJtb3ZxICAoJSUiIFhEWCAiKSwgICAgICAlJW1tMlxuXHQiICAgICAgIC8vIEwyUCAtIHRoZSBwcmV2IHdlYXZlIHBpeGVsCisgICAgICAibW92cSAgKCUlIiBYQVggIiwgJSUiIFhDWCAiKSwgJSVtbTNcblx0IiAvLyBMMywgbmV4dCBvZGQgcm93CisgICAgICAibW92cSAgJSVtbTEsICAgICAgICAgICUlbW02XG5cdCIgICAgICAgICAvLyBMMSAtIGdldCBzaW1wbGUgc2luZ2xlIHBpeGVsIGludGVycAorCisgICAgICAvLyAgICAgICAgcGF2Z2IgICBtbTYsIG1tMyAgICAgICAgICAgICAgICAgICAgLy8gdXNlIG1hY3JvIGJlbG93CisgICAgICBWX1BBVkdCICgiJSVtbTYiLCAiJSVtbTMiLCAiJSVtbTQiLCAiJVtTaGlmdE1hc2tdIikKKworICAgICAgLy8gREpSIC0gRGlhZ29uYWwgSmFnZ2llIFJlZHVjdGlvbgorICAgICAgLy8gSW4gdGhlIGV2ZW50IHRoYXQgd2UgYXJlIGdvaW5nIHRvIHVzZSBhbiBhdmVyYWdlIChCb2IpIHBpeGVsIHdlIGRvIG5vdCB3YW50IGEgamFnZ2VkCisgICAgICAvLyBzdGFpciBzdGVwIGVmZmVjdC4gIFRvIGNvbWJhdCB0aGlzIHdlIGF2ZyBpbiB0aGUgMiBob3Jpem9udGFsbHkgYWRqYWNlbiBwaXhlbHMgaW50byB0aGUKKyAgICAgIC8vIGludGVycG9sYXRlZCBCb2IgbWl4LiBUaGlzIHdpbGwgZG8gaG9yaXpvbnRhbCBzbW9vdGhpbmcgZm9yIG9ubHkgdGhlIEJvYidkIHBpeGVscy4KKworICAgICAgIm1vdnEgICVbTGFzdEF2Z10sICAgICAlJW1tNFxuXHQiIC8vIHRoZSBib2IgdmFsdWUgZnJvbSBwcmV2IHF3b3JkIGluIHJvdworICAgICAgIm1vdnEgICUlbW02LCAgICAgICAgICAlW0xhc3RBdmddXG5cdCIgICAgLy8gc2F2ZSBmb3IgbmV4dCBwYXNzCisgICAgICAicHNybHEgJDQ4LCAgICAgICAgICAgICUlbW00XG5cdCIgLy8gcmlnaHQganVzdGlmeSAxIHBpeGVsCisgICAgICAibW92cSAgJSVtbTYsICAgICAgICAgICUlbW03XG5cdCIgLy8gY29weSBvZiBzaW1wbGUgYm9iIHBpeGVsCisgICAgICAicHNsbHEgJDE2LCAgICAgICAgICAgICUlbW03XG5cdCIgLy8gbGVmdCBqdXN0aWZ5IDMgcGl4ZWxzCisgICAgICAicG9yICAgJSVtbTcsICAgICAgICAgICUlbW00XG5cdCIgLy8gYW5kIGNvbWJpbmUKKyAgICAgICJtb3ZxICAoJSUiIFhCWCAiKSwgICAgICAlJW1tNVxuXHQiICAgICAgIC8vIG5leHQgaG9yaXogcXdvcmQgZnJvbSBMMQorICAgICAgLy8gcGF2Z2IgICBtbTUsIHF3b3JkIHB0cltlYngrZWN4XSAvLyBuZXh0IGhvcml6IHF3b3JkIGZyb20gTDMsIHVzZSBtYWNybyBiZWxvdworCisgICAgICBWX1BBVkdCICgiJSVtbTUiLCAiKCUlIiBYQlggIiwlJSIgWENYICIpIiwgIiUlbW03IiwgIiVbU2hpZnRNYXNrXSIpCisgICAgICAicHNsbHEgJDQ4LCAgICAgICAgICAgICUlbW01XG5cdCIgLy8gbGVmdCBqdXN0IDEgcGl4ZWwKKyAgICAgICJtb3ZxICAlJW1tNiwgICAgICAgICAgJSVtbTdcblx0IiAvLyBhbm90aGVyIGNvcHkgb2Ygc2ltcGxlIGJvYiBwaXhlbAorICAgICAgInBzcmxxICQxNiwgICAgICAgICAgICAlJW1tN1xuXHQiIC8vIHJpZ2h0IGp1c3QgMyBwaXhlbHMKKyAgICAgICJwb3IgICAlJW1tNywgICAgICAgICAgJSVtbTVcblx0IiAvLyBjb21iaW5lCisgICAgICAvLyBwYXZnYiAgICAgICAgbW00LCBtbTUgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdmcgb2YgZm9yd2FyZCBhbmQgcHJldiBieSAxIHBpeGVsLCB1c2UgbWFjcm8KKyAgICAgIFZfUEFWR0IgKCIlJW1tNCIsICIlJW1tNSIsICIlJW1tNSIsICIlW1NoaWZ0TWFza10iKSAgICAgICAvLyBtbTUgZ2V0cyBtb2RpZmllZCBpZiBNTVgKKyAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgcGF2Z2IgICAgICAgIG1tNiwgbW00ICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZnIG9mIGNlbnRlciBhbmQgc3Vycm91bmQgaW50ZXJwIHZhbHMsIHVzZSBtYWNybworICAgICAgVl9QQVZHQiAoIiUlbW02IiwgIiUlbW00IiwgIiUlbW03IiwgIiVbU2hpZnRNYXNrXSIpCisKKyAgICAgIC8vIERvbid0IGRvIGFueSBtb3JlIGF2ZXJhZ2luZyB0aGFuIG5lZWRlZCBmb3IgbW14LiBJdCBodXJ0cyBwZXJmb3JtYW5jZSBhbmQgY2F1c2VzIHJvdW5kaW5nIGVycm9ycy4KKyNpZm5kZWYgSVNfTU1YCisgICAgICAvLyAgICAgICAgICBwYXZnYiAgICAgICAgbW00LCBtbTYgICAgICAgICAgICAgICAgICAgICAgICAvLyAxLzQgY2VudGVyLCAzLzQgYWRqYWNlbnQKKyAgICAgIFZfUEFWR0IgKCIlJW1tNCIsICIlJW1tNiIsICIlJW1tNyIsICIlW1NoaWZ0TWFza10iKQorICAgICAgLy8gICAgICAgICAgICAgICAgICAgIHBhdmdiICAgICAgICBtbTYsIG1tNCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMvOCBjZW50ZXIsIDUvOCBhZGphY2VudAorICAgICAgVl9QQVZHQiAoIiUlbW02IiwgIiUlbW00IiwgIiUlbW03IiwgIiVbU2hpZnRNYXNrXSIpCisjZW5kaWYKKworICAgICAgLy8gZ2V0IGFicyB2YWx1ZSBvZiBwb3NzaWJsZSBMMiBjb21iCisgICAgICAibW92cSAgICAlJW1tNiwgICAgICAgICUlbW00XG5cdCIgLy8gd29yayBjb3B5IG9mIGludGVycCB2YWwKKyAgICAgICJtb3ZxICAgICUlbW0yLCAgICAgICAgJSVtbTdcblx0IiAvLyBMMgorICAgICAgInBzdWJ1c2IgJSVtbTQsICAgICAgICAlJW1tN1xuXHQiIC8vIEwyIC0gYXZnCisgICAgICAibW92cSAgICAlJW1tNCwgICAgICAgICUlbW01XG5cdCIgLy8gYXZnCisgICAgICAicHN1YnVzYiAlJW1tMiwgICAgICAgICUlbW01XG5cdCIgLy8gYXZnIC0gTDIKKyAgICAgICJwb3IgICAgICUlbW03LCAgICAgICAgJSVtbTVcblx0IiAvLyBhYnMoYXZnLUwyKQorCisgICAgICAvLyBnZXQgYWJzIHZhbHVlIG9mIHBvc3NpYmxlIEwyUCBjb21iCisgICAgICAibW92cSAgICAlJW1tMCwgICAgICAgICUlbW03XG5cdCIgLy8gTDJQCisgICAgICAicHN1YnVzYiAlJW1tNCwgICAgICAgICUlbW03XG5cdCIgLy8gTDJQIC0gYXZnCisgICAgICAicHN1YnVzYiAlJW1tMCwgICAgICAgICUlbW00XG5cdCIgLy8gYXZnIC0gTDJQCisgICAgICAicG9yICAgICAlJW1tNywgICAgICAgICUlbW00XG5cdCIgLy8gYWJzKGF2Zy1MMlApCisKKyAgICAgIC8vIHVzZSBMMiBvciBMMlAgZGVwZW5kaW5nIHVwb24gd2hpY2ggbWFrZXMgc21hbGxlciBjb21iCisgICAgICAicHN1YnVzYiAlJW1tNSwgICAgICAgICUlbW00XG5cdCIgLy8gc2VlIGlmIGl0IGdvZXMgdG8gemVybworICAgICAgInBzdWJ1c2IgJSVtbTUsICAgICAgICAlJW1tNVxuXHQiIC8vIDAKKyAgICAgICJwY21wZXFiICUlbW01LCAgICAgICAgJSVtbTRcblx0IiAvLyBpZiAobW00PTApIHRoZW4gRkYgZWxzZSAwCisgICAgICAicGNtcGVxYiAlJW1tNCwgICAgICAgICUlbW01XG5cdCIgLy8gb3Bwb3NpdGUgb2YgbW00CisKKyAgICAgIC8vIGlmIENvbWIoTDJQKSA8PSBDb21iKEwyKSB0aGVuIG1tND1mZiwgbW01PTAgZWxzZSBtbTQ9MCwgbW01ID0gNTUKKyAgICAgICJwYW5kICAgICUlbW0yLCAgICAgICAgJSVtbTVcblx0IiAvLyB1c2UgTDIgaWYgbW01ID09IGZmLCBlbHNlIDAKKyAgICAgICJwYW5kICAgICUlbW0wLCAgICAgICAgJSVtbTRcblx0IiAvLyB1c2UgTDJQIGlmIG1tNCA9IGZmLCBlbHNlIDAKKyAgICAgICJwb3IgICAgICUlbW01LCAgICAgICAgJSVtbTRcblx0IiAvLyBtYXkgdGhlIGJlc3Qgd2luCisKKyAgICAgIC8vIEludmVudG9yeTogYXQgdGhpcyBwb2ludCB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAgICAgLy8gbW0wID0gTDJQIChvciBMMikKKyAgICAgIC8vIG1tMSA9IEwxCisgICAgICAvLyBtbTIgPSBMMiAob3IgTDJQKQorICAgICAgLy8gbW0zID0gTDMKKyAgICAgIC8vIG1tNCA9IHRoZSBiZXN0IG9mIEwyLEwyUCB3ZWF2ZSBwaXhlbCwgYmFzZSB1cG9uIGNvbWIKKyAgICAgIC8vIG1tNiA9IHRoZSBhdmcgaW50ZXJwb2xhdGVkIHZhbHVlLCBpZiB3ZSBuZWVkIHRvIHVzZSBpdAorICAgICAgLy8gTGV0J3MgbWVhc3VyZSBtb3ZlbWVudCwgYXMgaG93IG11Y2ggdGhlIHdlYXZlIHBpeGVsIGhhcyBjaGFuZ2VkCisKKyAgICAgICJtb3ZxICAgICUlbW0yLCAgICAgICAgJSVtbTdcblx0IgorICAgICAgInBzdWJ1c2IgJSVtbTAsICAgICAgICAlJW1tMlxuXHQiCisgICAgICAicHN1YnVzYiAlJW1tNywgICAgICAgICUlbW0wXG5cdCIKKyAgICAgICJwb3IgICAgICUlbW0yLCAgICAgICAgJSVtbTBcblx0IiAgIC8vIGFicyB2YWx1ZSBvZiBjaGFuZ2UsIHVzZWQgbGF0ZXIKKworICAgICAgLy8gTm93IGxldHMgY2xpcCBvdXIgY2hvc2VuIHZhbHVlIHRvIGJlIG5vdCBvdXRzaWRlIG9mIHRoZSByYW5nZQorICAgICAgLy8gb2YgdGhlIGhpZ2gvbG93IHJhbmdlIEwxLUwzIGJ5IG1vcmUgdGhhbiBNYXhDb21iLgorICAgICAgLy8gVGhpcyBhbGxvd3Mgc29tZSBjb21iIGJ1dCBsaW1pdHMgdGhlIGRhbWFnZXMgYW5kIGFsc28gYWxsb3dzIG1vcmUKKyAgICAgIC8vIGRldGFpbCB0aGFuIGEgYm9yaW5nIG92ZXJzbW9vdGhlZCBjbGlwLgorCisgICAgICAibW92cSAgICAlJW1tMSwgICAgICAgICUlbW0yXG5cdCIgLy8gY29weSBMMQorICAgICAgLy8gcG1heHViIG1tMiwgbW0zICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIG1hY3JvCisgICAgICBWX1BNQVhVQiAoIiUlbW0yIiwgIiUlbW0zIikgICAgICAgLy8gbm93ID0gTWF4KEwxLEwzKQorICAgICAgIm1vdnEgICAgJSVtbTEsICAgICAgICAlJW1tNVxuXHQiIC8vIGNvcHkgTDEKKyAgICAgIC8vIHBtaW51YiAgICAgICAgbW01LCBtbTMgICAgICAgICAgICAgICAgICAgIC8vIG5vdyA9IE1pbihMMSxMMyksIHVzZSBtYWNybworICAgICAgVl9QTUlOVUIgKCIlJW1tNSIsICIlJW1tMyIsICIlJW1tNyIpCisKKyAgICAgIC8vIGFsbG93IHRoZSB2YWx1ZSB0byBiZSBhYm92ZSB0aGUgaGlnaCBvciBiZWxvdyB0aGUgbG93IGJ5IGFtdCBvZiBNYXhDb21iCisgICAgICAicHN1YnVzYiAlW01heENvbWJdLCAgICUlbW01XG5cdCIgLy8gbG93ZXIgbWluIGJ5IGRpZmYKKyAgICAgICJwYWRkdXNiICVbTWF4Q29tYl0sICAgJSVtbTJcblx0IiAvLyBpbmNyZWFzZSBtYXggYnkgZGlmZgorICAgICAgLy8gcG1heHViICAgICAgICBtbTQsIG1tNSAgICAgICAgIC8vIG5vdyA9IE1heChiZXN0LE1pbihMMSxMMykgdXNlIG1hY3JvCisgICAgICBWX1BNQVhVQiAoIiUlbW00IiwgIiUlbW01IikKKyAgICAgIC8vIHBtaW51YiAgICAgICAgbW00LCBtbTIgICAgICAgICAvLyBub3cgPSBNaW4oIE1heChiZXN0LCBNaW4oTDEsTDMpLCBMMiApPUwyIGNsaXBwZWQKKyAgICAgIFZfUE1JTlVCICgiJSVtbTQiLCAiJSVtbTIiLCAiJSVtbTciKQorCisgICAgICAvLyBCbGVuZCB3ZWF2ZSBwaXhlbCB3aXRoIGJvYiBwaXhlbCwgZGVwZW5kaW5nIG9uIG1vdGlvbiB2YWwgaW4gbW0wCisgICAgICAicHN1YnVzYiAlW01vdGlvblRocmVzaG9sZF0sICUlbW0wXG5cdCIgICAvLyB0ZXN0IFRocmVzaG9sZCwgY2xlYXIgY2hyb21hIGNoYW5nZQorICAgICAgInBtdWxsdyAgJVtNb3Rpb25TZW5zZV0sICUlbW0wXG5cdCIgICAgICAgLy8gbXVsIGJ5IHVzZXIgZmFjdG9yLCBrZWVwIGxvdyAxNiBiaXRzCisgICAgICAibW92cSAgICAlW1FXMjU2XSwgJSVtbTdcblx0IgorI2lmZGVmIElTX01NWEVYVAorICAgICAgInBtaW5zdyAgJSVtbTcsICAgICAgICAlJW1tMFxuXHQiIC8vIG1heCA9IDI1NgorI2Vsc2UKKyAgICAgICJwYWRkdXN3ICVbUVcyNTZCXSwgICAgJSVtbTBcblx0IiAvLyBhZGQsIG1heSBzYXQgYXQgZmZmLi4KKyAgICAgICJwc3VidXN3ICVbUVcyNTZCXSwgICAgJSVtbTBcblx0IiAvLyBub3cgPSBNaW4oTDEsMjU2KQorI2VuZGlmCisgICAgICAicHN1YnVzdyAlJW1tMCwgICAgICAgICUlbW03XG5cdCIgLy8gc28gdGhlIDIgc3VtIHRvIDI1Niwgd2VpZ2h0ZWQgYXZnCisgICAgICAibW92cSAgICAlJW1tNCwgICAgICAgICUlbW0yXG5cdCIgLy8gc2F2ZSB3ZWF2ZSBjaHJvbWEgaW5mbyBiZWZvcmUgdHJhc2hpbmcKKyAgICAgICJwYW5kICAgICVbWU1hc2tdLCAgICAgJSVtbTRcblx0IiAvLyBrZWVwIG9ubHkgbHVtYSBmcm9tIGNhbGMnZCB2YWx1ZQorICAgICAgInBtdWxsdyAgJSVtbTcsICAgICAgICAlJW1tNFxuXHQiIC8vIHVzZSBtb3JlIHdlYXZlIGZvciBsZXNzIG1vdGlvbgorICAgICAgInBhbmQgICAgJVtZTWFza10sICAgICAlJW1tNlxuXHQiIC8vIGtlZXAgb25seSBsdW1hIGZyb20gY2FsYydkIHZhbHVlCisgICAgICAicG11bGx3ICAlJW1tMCwgICAgICAgICUlbW02XG5cdCIgLy8gdXNlIG1vcmUgYm9iIGZvciBsYXJnZSBtb3Rpb24KKyAgICAgICJwYWRkdXN3ICUlbW02LCAgICAgICAgJSVtbTRcblx0IiAvLyBjb21iaW5lCisgICAgICAicHNybHcgICAkOCwgICAgICAgICAgICUlbW00XG5cdCIgLy8gZGl2IGJ5IDI1NiB0byBnZXQgd2VpZ2h0ZWQgYXZnCisgICAgICAvLyBjaHJvbWEgY29tZXMgZnJvbSB3ZWF2ZSBwaXhlbAorICAgICAgInBhbmQgICAgJVtVVk1hc2tdLCAgICAlJW1tMlxuXHQiIC8vIGtlZXAgY2hyb21hCisgICAgICAicG9yICAgICAlJW1tNCwgICAgICAgICUlbW0yXG5cdCIgLy8gYW5kIGNvbWJpbmUKKyAgICAgIFZfTU9WTlRRICgiKCUlIiBYREkgIikiLCAiJSVtbTIiKSAvLyBtb3ZlIGluIG91ciBjbGlwcGVkIGJlc3QsIHVzZSBtYWNybworICAgICAgLy8gYnVtcCBwdHJzIGFuZCBsb29wCisgICAgICBMRUFYICIgICAgOCglJSIgWEFYICIpLCAgICUlIiBYQVggIlxuXHQiCisgICAgICBMRUFYICIgICAgOCglJSIgWEJYICIpLCAgICUlIiBYQlggIlxuXHQiCisgICAgICBMRUFYICIgICAgOCglJSIgWERYICIpLCAgICUlIiBYRFggIlxuXHQiCisgICAgICBMRUFYICIgICAgOCglJSIgWERJICIpLCAgICUlIiBYREkgIlxuXHQiCisgICAgICBMRUFYICIgICAgOCglJSIgWFNJICIpLCAgICUlIiBYU0kgIlxuXHQiCisgICAgICBERUNYICIgICAgJVtMb29wQ3RyXVxuXHQiCisgICAgICAKKyAgICAgICJqZyAgICAgIDFiXG5cdCIgICAvLyBsb29wIGlmIG5vdCB0byBsYXN0IGxpbmUKKyAgICAgIC8vIG5vdGUgUC1JSUkgZGVmYXVsdCBhc3N1bWVzIGJhY2t3YXJkIGJyYW5jaGVzIHRha2VuCisgICAgICAiamwgICAgICAxZlxuXHQiICAgICAgICAgIC8vIGRvbmUKKyAgICAgIE1PVlggIiAgICAlJSIgWEFYICIsICAgICAgJSUiIFhCWCAiXG5cdCIgIC8vIHNoYXJwbmVzcyBsb29rYWhlYWQgMSBieXRlIG9ubHksIGJlIHdyb25nIG9uIDEKKyAgICAgICJqbXAgICAgIDFiXG5cdCIKKyAgICAgIAorICAgICAgIjE6XG5cdCIgICAgICAKKyAgICAgIE1PVlggIiAlW29sZGJ4XSwgJSUiIFhCWCAiXG5cdCIKKyAgICAgICJlbW1zXG5cdCI6ICAgICAvKiBubyBvdXRwdXRzICovCisKKyAgICAgIDpbTGFzdEF2Z10gIm0iIChMYXN0QXZnKSwKKyAgICAgICBbTDFdICJtIiAoTDEpLAorICAgICAgIFtMM10gIm0iIChMMyksCisgICAgICAgW0wyUF0gIm0iIChMMlApLAorICAgICAgIFtMMl0gIm0iIChMMiksCisgICAgICAgW0Rlc3RdICJtIiAoRGVzdCksCisgICAgICAgW1NoaWZ0TWFza10gIm0iIChTaGlmdE1hc2spLAorICAgICAgIFtNYXhDb21iXSAibSIgKE1heENvbWIpLAorICAgICAgIFtNb3Rpb25UaHJlc2hvbGRdICJtIiAoTW90aW9uVGhyZXNob2xkKSwKKyAgICAgICBbTW90aW9uU2Vuc2VdICJtIiAoTW90aW9uU2Vuc2UpLAorICAgICAgIFtRVzI1NkJdICJtIiAoUVcyNTZCKSwKKyAgICAgICBbWU1hc2tdICJtIiAoWU1hc2spLAorICAgICAgIFtVVk1hc2tdICJtIiAoVVZNYXNrKSwKKyAgICAgICBbTG9vcEN0cl0gIm0iIChMb29wQ3RyKSwKKyAgICAgICBbUVcyNTZdICJtIiAoUVcyNTYpLAorICAgICAgIFtvbGRieF0gIm0iIChvbGRieCkKKyAgICAgIDogWEFYLCBYQ1gsIFhEWCwgWFNJLCBYREksCisgICAgICAic3QiLCAic3QoMSkiLCAic3QoMikiLCAic3QoMykiLCAic3QoNCkiLCAic3QoNSkiLCAic3QoNikiLCAic3QoNykiLAorI2lmZGVmIF9fTU1YX18KKyAgICAgICJtbTAiLCAibW0xIiwgIm1tMiIsICJtbTMiLCAibW00IiwgIm1tNSIsICJtbTYiLCAibW03IiwKKyNlbmRpZgorICAgICAgIm1lbW9yeSIsICJjYyIpOworfQorCitzdGF0aWMgdm9pZAorRlVOQ1RfTkFNRV9VWVZZIChHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUggKnNlbGYsIGNvbnN0IGd1aW50OCAqIEwxLCBjb25zdCBndWludDggKiBMMiwgY29uc3QgZ3VpbnQ4ICogTDMsIGNvbnN0IGd1aW50OCAqIEwyUCwgZ3VpbnQ4ICogRGVzdCwgZ2ludCB3aWR0aCkKK3sKKworICAvLyBpbiB0aWdodCBsb29wIHNvbWUgdmFycyBhcmUgYWNjZXNzZWQgZmFzdGVyIGluIGxvY2FsIHN0b3JhZ2UKKyAgZ2ludDY0IFlNYXNrID0gMHhmZjAwZmYwMGZmMDBmZjAwdWxsOyAgICAgICAvLyB0byBrZWVwIG9ubHkgbHVtYQorICBnaW50NjQgVVZNYXNrID0gMHgwMGZmMDBmZjAwZmYwMGZmdWxsOyAgICAgICAgLy8gdG8ga2VlcCBvbmx5IGNocm9tYQorICBnaW50NjQgU2hpZnRNYXNrID0gMHhmZWZlZmVmZWZlZmVmZWZldWxsOyAgICAvLyB0byBhdm9pZCBzaGlmdGluZyBjaHJvbWEgdG8gbHVtYQorICBnaW50NjQgUVcyNTYgPSAweDAxMDAwMTAwMDEwMDAxMDB1bGw7ICAgICAgICAvLyA0IDI1NidzCisgIGdpbnQ2NCBNYXhDb21iOworICBnaW50NjQgTW90aW9uVGhyZXNob2xkOworICBnaW50NjQgTW90aW9uU2Vuc2U7CisgIGdpbnQ2NCBpOworICBnbG9uZyBMb29wQ3RyOworICBnbG9uZyBvbGRieCA9IDA7CisKKyAgZ2ludDY0IFFXMjU2QjsKKyAgZ2ludDY0IExhc3RBdmcgPSAwOyAgICAgICAgICAvL2ludGVycCB2YWx1ZSBmcm9tIGxlZnQgcXdvcmQKKworICAvLyBGSVhNRTogVXNlIEMgaW1wbGVtZW50YXRpb24gaWYgdGhlIHdpZHRoIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQKKyAgLy8gRG8gc29tZXRoaW5nIG1vcmUgb3B0aW1hbCBsYXRlcgorICBpZiAod2lkdGggJSA0ICE9IDApCisgICAgQ19GVU5DVF9VWVZZIChzZWxmLCBMMSwgTDIsIEwzLCBMMlAsIERlc3QsIHdpZHRoKTsKKworICAvLyBTZXQgdXAgb3VyIHR3byBwYXJtcyB0aGF0IGFyZSBhY3R1YWxseSBldmFsdWF0ZWQgZm9yIGVhY2ggcGl4ZWwKKyAgaSA9IHNlbGYtPm1heF9jb21iOworICBNYXhDb21iID0KKyAgICAgIGkgPDwgNTYgfCBpIDw8IDQ4IHwgaSA8PCA0MCB8IGkgPDwgMzIgfCBpIDw8IDI0IHwgaSA8PCAxNiB8IGkgPDwgOCB8IGk7CisKKyAgaSA9IHNlbGYtPm1vdGlvbl90aHJlc2hvbGQ7ICAgIC8vIHNjYWxlIHRvIHJhbmdlIG9mIDAtMjU3CisgIE1vdGlvblRocmVzaG9sZCA9IGkgPDwgNDggfCBpIDw8IDMyIHwgaSA8PCAxNiB8IGkgfCBVVk1hc2s7CisKKyAgaSA9IHNlbGYtPm1vdGlvbl9zZW5zZTsgICAgICAgIC8vIHNjYWxlIHRvIHJhbmdlIG9mIDAtMjU3CisgIE1vdGlvblNlbnNlID0gaSA8PCA0OCB8IGkgPDwgMzIgfCBpIDw8IDE2IHwgaTsKKworICBpID0gMHhmZmZmZmZmZiAtIDI1NjsKKyAgUVcyNTZCID0gaSA8PCA0OCB8IGkgPDwgMzIgfCBpIDw8IDE2IHwgaTsgICAgIC8vIHNhdmUgYSBjb3VwbGUgaW5zdHIgb24gUE1JTlNXIGluc3RydWN0LgorCisgIExvb3BDdHIgPSB3aWR0aCAvIDggLSAxOyAgICAgICAvLyB0aGVyZSBhcmUgTGluZUxlbmd0aCAvIDQgcXdvcmRzIHBlciBsaW5lIGJ1dCBkbyAxIGxlc3MsIGFkaiBhdCBlbmQgb2YgbG9vcAorCisgIC8vIEZvciBlYXNlIG9mIHJlYWRpbmcsIHRoZSBjb21tZW50cyBiZWxvdyBhc3N1bWUgdGhhdCB3ZSdyZSBvcGVyYXRpbmcgb24gYW4gb2RkCisgIC8vIGZpZWxkIChpLmUuLCB0aGF0IEluZm9Jc09kZCBpcyB0cnVlKS4gIEFzc3VtZSB0aGUgb2J2aW91cyBmb3IgZXZlbiBsaW5lcy4uCisgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgIC8vIHNhdmUgZWJ4ICgtZlBJQykKKyAgICAgIE1PVlggIiAlJSIgWEJYICIsICVbb2xkYnhdXG5cdCIKKyAgICAgIE1PVlggIiAgJVtMMV0sICAgICAgICAgICUlIiBYQVggIlxuXHQiCisgICAgICBMRUFYICIgIDgoJSUiIFhBWCAiKSwgICAgICUlIiBYQlggIlxuXHQiICAgLy8gbmV4dCBxd29yZCBuZWVkZWQgYnkgREpSCisgICAgICBNT1ZYICIgICVbTDNdLCAgICAgICAgICAlJSIgWENYICJcblx0IgorICAgICAgU1VCWCAiICAlJSIgWEFYICIsICAgICAgICAlJSIgWENYICJcblx0IiAgIC8vIGNhcnJ5IEwzIGFkZHIgYXMgYW4gb2Zmc2V0CisgICAgICBNT1ZYICIgICVbTDJQXSwgICAgICAgICAlJSIgWERYICJcblx0IgorICAgICAgTU9WWCAiICAlW0wyXSwgICAgICAgICAgJSUiIFhTSSAiXG5cdCIKKyAgICAgIE1PVlggIiAgJVtEZXN0XSwgICAgICAgICUlIiBYREkgIlxuXHQiICAgICAgLy8gREwxIGlmIE9kZCBvciBETDIgaWYgRXZlbgorCisgICAgICAiLmFsaWduIDhcblx0IgorICAgICAgIjE6XG5cdCIKKyAgICAgICJtb3ZxICAoJSUiIFhTSSAiKSwgICAgICAlJW1tMFxuXHQiICAgICAgIC8vIEwyIC0gdGhlIG5ld2VzdCB3ZWF2ZSBwaXhlbCB2YWx1ZQorICAgICAgIm1vdnEgICglJSIgWEFYICIpLCAgICAgICUlbW0xXG5cdCIgICAgICAgLy8gTDEgLSB0aGUgdG9wIHBpeGVsCisgICAgICAibW92cSAgKCUlIiBYRFggIiksICAgICAgJSVtbTJcblx0IiAgICAgICAvLyBMMlAgLSB0aGUgcHJldiB3ZWF2ZSBwaXhlbAorICAgICAgIm1vdnEgICglJSIgWEFYICIsICUlIiBYQ1ggIiksICUlbW0zXG5cdCIgLy8gTDMsIG5leHQgb2RkIHJvdworICAgICAgIm1vdnEgICUlbW0xLCAgICAgICAgICAlJW1tNlxuXHQiICAgICAgICAgLy8gTDEgLSBnZXQgc2ltcGxlIHNpbmdsZSBwaXhlbCBpbnRlcnAKKworICAgICAgLy8gICAgICAgIHBhdmdiICAgbW02LCBtbTMgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBtYWNybyBiZWxvdworICAgICAgVl9QQVZHQiAoIiUlbW02IiwgIiUlbW0zIiwgIiUlbW00IiwgIiVbU2hpZnRNYXNrXSIpCisKKyAgICAgIC8vIERKUiAtIERpYWdvbmFsIEphZ2dpZSBSZWR1Y3Rpb24KKyAgICAgIC8vIEluIHRoZSBldmVudCB0aGF0IHdlIGFyZSBnb2luZyB0byB1c2UgYW4gYXZlcmFnZSAoQm9iKSBwaXhlbCB3ZSBkbyBub3Qgd2FudCBhIGphZ2dlZAorICAgICAgLy8gc3RhaXIgc3RlcCBlZmZlY3QuICBUbyBjb21iYXQgdGhpcyB3ZSBhdmcgaW4gdGhlIDIgaG9yaXpvbnRhbGx5IGFkamFjZW4gcGl4ZWxzIGludG8gdGhlCisgICAgICAvLyBpbnRlcnBvbGF0ZWQgQm9iIG1peC4gVGhpcyB3aWxsIGRvIGhvcml6b250YWwgc21vb3RoaW5nIGZvciBvbmx5IHRoZSBCb2InZCBwaXhlbHMuCisKKyAgICAgICJtb3ZxICAlW0xhc3RBdmddLCAgICAgJSVtbTRcblx0IiAvLyB0aGUgYm9iIHZhbHVlIGZyb20gcHJldiBxd29yZCBpbiByb3cKKyAgICAgICJtb3ZxICAlJW1tNiwgICAgICAgICAgJVtMYXN0QXZnXVxuXHQiICAgIC8vIHNhdmUgZm9yIG5leHQgcGFzcworICAgICAgInBzcmxxICQ0OCwgICAgICAgICAgICAlJW1tNFxuXHQiIC8vIHJpZ2h0IGp1c3RpZnkgMSBwaXhlbAorICAgICAgIm1vdnEgICUlbW02LCAgICAgICAgICAlJW1tN1xuXHQiIC8vIGNvcHkgb2Ygc2ltcGxlIGJvYiBwaXhlbAorICAgICAgInBzbGxxICQxNiwgICAgICAgICAgICAlJW1tN1xuXHQiIC8vIGxlZnQganVzdGlmeSAzIHBpeGVscworICAgICAgInBvciAgICUlbW03LCAgICAgICAgICAlJW1tNFxuXHQiIC8vIGFuZCBjb21iaW5lCisgICAgICAibW92cSAgKCUlIiBYQlggIiksICAgICAgJSVtbTVcblx0IiAgICAgICAvLyBuZXh0IGhvcml6IHF3b3JkIGZyb20gTDEKKyAgICAgIC8vIHBhdmdiICAgbW01LCBxd29yZCBwdHJbZWJ4K2VjeF0gLy8gbmV4dCBob3JpeiBxd29yZCBmcm9tIEwzLCB1c2UgbWFjcm8gYmVsb3cKKworICAgICAgVl9QQVZHQiAoIiUlbW01IiwgIiglJSIgWEJYICIsJSUiIFhDWCAiKSIsICIlJW1tNyIsICIlW1NoaWZ0TWFza10iKQorICAgICAgInBzbGxxICQ0OCwgICAgICAgICAgICAlJW1tNVxuXHQiIC8vIGxlZnQganVzdCAxIHBpeGVsCisgICAgICAibW92cSAgJSVtbTYsICAgICAgICAgICUlbW03XG5cdCIgLy8gYW5vdGhlciBjb3B5IG9mIHNpbXBsZSBib2IgcGl4ZWwKKyAgICAgICJwc3JscSAkMTYsICAgICAgICAgICAgJSVtbTdcblx0IiAvLyByaWdodCBqdXN0IDMgcGl4ZWxzCisgICAgICAicG9yICAgJSVtbTcsICAgICAgICAgICUlbW01XG5cdCIgLy8gY29tYmluZQorICAgICAgLy8gcGF2Z2IgICAgICAgIG1tNCwgbW01ICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZnIG9mIGZvcndhcmQgYW5kIHByZXYgYnkgMSBwaXhlbCwgdXNlIG1hY3JvCisgICAgICBWX1BBVkdCICgiJSVtbTQiLCAiJSVtbTUiLCAiJSVtbTUiLCAiJVtTaGlmdE1hc2tdIikgICAgICAgLy8gbW01IGdldHMgbW9kaWZpZWQgaWYgTU1YCisgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIHBhdmdiICAgICAgICBtbTYsIG1tNCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF2ZyBvZiBjZW50ZXIgYW5kIHN1cnJvdW5kIGludGVycCB2YWxzLCB1c2UgbWFjcm8KKyAgICAgIFZfUEFWR0IgKCIlJW1tNiIsICIlJW1tNCIsICIlJW1tNyIsICIlW1NoaWZ0TWFza10iKQorCisgICAgICAvLyBEb24ndCBkbyBhbnkgbW9yZSBhdmVyYWdpbmcgdGhhbiBuZWVkZWQgZm9yIG1teC4gSXQgaHVydHMgcGVyZm9ybWFuY2UgYW5kIGNhdXNlcyByb3VuZGluZyBlcnJvcnMuCisjaWZuZGVmIElTX01NWAorICAgICAgLy8gICAgICAgICAgcGF2Z2IgICAgICAgIG1tNCwgbW02ICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS80IGNlbnRlciwgMy80IGFkamFjZW50CisgICAgICBWX1BBVkdCICgiJSVtbTQiLCAiJSVtbTYiLCAiJSVtbTciLCAiJVtTaGlmdE1hc2tdIikKKyAgICAgIC8vICAgICAgICAgICAgICAgICAgICBwYXZnYiAgICAgICAgbW02LCBtbTQgICAgICAgICAgICAgICAgICAgICAgICAvLyAzLzggY2VudGVyLCA1LzggYWRqYWNlbnQKKyAgICAgIFZfUEFWR0IgKCIlJW1tNiIsICIlJW1tNCIsICIlJW1tNyIsICIlW1NoaWZ0TWFza10iKQorI2VuZGlmCisKKyAgICAgIC8vIGdldCBhYnMgdmFsdWUgb2YgcG9zc2libGUgTDIgY29tYgorICAgICAgIm1vdnEgICAgJSVtbTYsICAgICAgICAlJW1tNFxuXHQiIC8vIHdvcmsgY29weSBvZiBpbnRlcnAgdmFsCisgICAgICAibW92cSAgICAlJW1tMiwgICAgICAgICUlbW03XG5cdCIgLy8gTDIKKyAgICAgICJwc3VidXNiICUlbW00LCAgICAgICAgJSVtbTdcblx0IiAvLyBMMiAtIGF2ZworICAgICAgIm1vdnEgICAgJSVtbTQsICAgICAgICAlJW1tNVxuXHQiIC8vIGF2ZworICAgICAgInBzdWJ1c2IgJSVtbTIsICAgICAgICAlJW1tNVxuXHQiIC8vIGF2ZyAtIEwyCisgICAgICAicG9yICAgICAlJW1tNywgICAgICAgICUlbW01XG5cdCIgLy8gYWJzKGF2Zy1MMikKKworICAgICAgLy8gZ2V0IGFicyB2YWx1ZSBvZiBwb3NzaWJsZSBMMlAgY29tYgorICAgICAgIm1vdnEgICAgJSVtbTAsICAgICAgICAlJW1tN1xuXHQiIC8vIEwyUAorICAgICAgInBzdWJ1c2IgJSVtbTQsICAgICAgICAlJW1tN1xuXHQiIC8vIEwyUCAtIGF2ZworICAgICAgInBzdWJ1c2IgJSVtbTAsICAgICAgICAlJW1tNFxuXHQiIC8vIGF2ZyAtIEwyUAorICAgICAgInBvciAgICAgJSVtbTcsICAgICAgICAlJW1tNFxuXHQiIC8vIGFicyhhdmctTDJQKQorCisgICAgICAvLyB1c2UgTDIgb3IgTDJQIGRlcGVuZGluZyB1cG9uIHdoaWNoIG1ha2VzIHNtYWxsZXIgY29tYgorICAgICAgInBzdWJ1c2IgJSVtbTUsICAgICAgICAlJW1tNFxuXHQiIC8vIHNlZSBpZiBpdCBnb2VzIHRvIHplcm8KKyAgICAgICJwc3VidXNiICUlbW01LCAgICAgICAgJSVtbTVcblx0IiAvLyAwCisgICAgICAicGNtcGVxYiAlJW1tNSwgICAgICAgICUlbW00XG5cdCIgLy8gaWYgKG1tND0wKSB0aGVuIEZGIGVsc2UgMAorICAgICAgInBjbXBlcWIgJSVtbTQsICAgICAgICAlJW1tNVxuXHQiIC8vIG9wcG9zaXRlIG9mIG1tNAorCisgICAgICAvLyBpZiBDb21iKEwyUCkgPD0gQ29tYihMMikgdGhlbiBtbTQ9ZmYsIG1tNT0wIGVsc2UgbW00PTAsIG1tNSA9IDU1CisgICAgICAicGFuZCAgICAlJW1tMiwgICAgICAgICUlbW01XG5cdCIgLy8gdXNlIEwyIGlmIG1tNSA9PSBmZiwgZWxzZSAwCisgICAgICAicGFuZCAgICAlJW1tMCwgICAgICAgICUlbW00XG5cdCIgLy8gdXNlIEwyUCBpZiBtbTQgPSBmZiwgZWxzZSAwCisgICAgICAicG9yICAgICAlJW1tNSwgICAgICAgICUlbW00XG5cdCIgLy8gbWF5IHRoZSBiZXN0IHdpbgorCisgICAgICAvLyBJbnZlbnRvcnk6IGF0IHRoaXMgcG9pbnQgd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgICAgIC8vIG1tMCA9IEwyUCAob3IgTDIpCisgICAgICAvLyBtbTEgPSBMMQorICAgICAgLy8gbW0yID0gTDIgKG9yIEwyUCkKKyAgICAgIC8vIG1tMyA9IEwzCisgICAgICAvLyBtbTQgPSB0aGUgYmVzdCBvZiBMMixMMlAgd2VhdmUgcGl4ZWwsIGJhc2UgdXBvbiBjb21iCisgICAgICAvLyBtbTYgPSB0aGUgYXZnIGludGVycG9sYXRlZCB2YWx1ZSwgaWYgd2UgbmVlZCB0byB1c2UgaXQKKyAgICAgIC8vIExldCdzIG1lYXN1cmUgbW92ZW1lbnQsIGFzIGhvdyBtdWNoIHRoZSB3ZWF2ZSBwaXhlbCBoYXMgY2hhbmdlZAorCisgICAgICAibW92cSAgICAlJW1tMiwgICAgICAgICUlbW03XG5cdCIKKyAgICAgICJwc3VidXNiICUlbW0wLCAgICAgICAgJSVtbTJcblx0IgorICAgICAgInBzdWJ1c2IgJSVtbTcsICAgICAgICAlJW1tMFxuXHQiCisgICAgICAicG9yICAgICAlJW1tMiwgICAgICAgICUlbW0wXG5cdCIgICAvLyBhYnMgdmFsdWUgb2YgY2hhbmdlLCB1c2VkIGxhdGVyCisKKyAgICAgIC8vIE5vdyBsZXRzIGNsaXAgb3VyIGNob3NlbiB2YWx1ZSB0byBiZSBub3Qgb3V0c2lkZSBvZiB0aGUgcmFuZ2UKKyAgICAgIC8vIG9mIHRoZSBoaWdoL2xvdyByYW5nZSBMMS1MMyBieSBtb3JlIHRoYW4gTWF4Q29tYi4KKyAgICAgIC8vIFRoaXMgYWxsb3dzIHNvbWUgY29tYiBidXQgbGltaXRzIHRoZSBkYW1hZ2VzIGFuZCBhbHNvIGFsbG93cyBtb3JlCisgICAgICAvLyBkZXRhaWwgdGhhbiBhIGJvcmluZyBvdmVyc21vb3RoZWQgY2xpcC4KKworICAgICAgIm1vdnEgICAgJSVtbTEsICAgICAgICAlJW1tMlxuXHQiIC8vIGNvcHkgTDEKKyAgICAgIC8vIHBtYXh1YiBtbTIsIG1tMyAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBtYWNybworICAgICAgVl9QTUFYVUIgKCIlJW1tMiIsICIlJW1tMyIpICAgICAgIC8vIG5vdyA9IE1heChMMSxMMykKKyAgICAgICJtb3ZxICAgICUlbW0xLCAgICAgICAgJSVtbTVcblx0IiAvLyBjb3B5IEwxCisgICAgICAvLyBwbWludWIgICAgICAgIG1tNSwgbW0zICAgICAgICAgICAgICAgICAgICAvLyBub3cgPSBNaW4oTDEsTDMpLCB1c2UgbWFjcm8KKyAgICAgIFZfUE1JTlVCICgiJSVtbTUiLCAiJSVtbTMiLCAiJSVtbTciKQorCisgICAgICAvLyBhbGxvdyB0aGUgdmFsdWUgdG8gYmUgYWJvdmUgdGhlIGhpZ2ggb3IgYmVsb3cgdGhlIGxvdyBieSBhbXQgb2YgTWF4Q29tYgorICAgICAgInBzdWJ1c2IgJVtNYXhDb21iXSwgICAlJW1tNVxuXHQiIC8vIGxvd2VyIG1pbiBieSBkaWZmCisgICAgICAicGFkZHVzYiAlW01heENvbWJdLCAgICUlbW0yXG5cdCIgLy8gaW5jcmVhc2UgbWF4IGJ5IGRpZmYKKyAgICAgIC8vIHBtYXh1YiAgICAgICAgbW00LCBtbTUgICAgICAgICAvLyBub3cgPSBNYXgoYmVzdCxNaW4oTDEsTDMpIHVzZSBtYWNybworICAgICAgVl9QTUFYVUIgKCIlJW1tNCIsICIlJW1tNSIpCisgICAgICAvLyBwbWludWIgICAgICAgIG1tNCwgbW0yICAgICAgICAgLy8gbm93ID0gTWluKCBNYXgoYmVzdCwgTWluKEwxLEwzKSwgTDIgKT1MMiBjbGlwcGVkCisgICAgICBWX1BNSU5VQiAoIiUlbW00IiwgIiUlbW0yIiwgIiUlbW03IikKKworICAgICAgLy8gQmxlbmQgd2VhdmUgcGl4ZWwgd2l0aCBib2IgcGl4ZWwsIGRlcGVuZGluZyBvbiBtb3Rpb24gdmFsIGluIG1tMAorICAgICAgInBzdWJ1c2IgJVtNb3Rpb25UaHJlc2hvbGRdLCAlJW1tMFxuXHQiICAgLy8gdGVzdCBUaHJlc2hvbGQsIGNsZWFyIGNocm9tYSBjaGFuZ2UKKyAgICAgICJwc3JsdyAgICQ4LCAgICAgICAgICAgJSVtbTBcblx0IiAvLyBkaXYgYnkgMjU2IHRvIGdldCB3ZWlnaHRlZCBhdmcKKyAgICAgICJwbXVsbHcgICVbTW90aW9uU2Vuc2VdLCAlJW1tMFxuXHQiICAgICAgIC8vIG11bCBieSB1c2VyIGZhY3Rvciwga2VlcCBsb3cgMTYgYml0cworICAgICAgIm1vdnEgICAgJVtRVzI1Nl0sICUlbW03XG5cdCIKKyNpZmRlZiBJU19NTVhFWFQKKyAgICAgICJwbWluc3cgICUlbW03LCAgICAgICAgJSVtbTBcblx0IiAvLyBtYXggPSAyNTYKKyNlbHNlCisgICAgICAicGFkZHVzdyAlW1FXMjU2Ql0sICAgICUlbW0wXG5cdCIgLy8gYWRkLCBtYXkgc2F0IGF0IGZmZi4uCisgICAgICAicHN1YnVzdyAlW1FXMjU2Ql0sICAgICUlbW0wXG5cdCIgLy8gbm93ID0gTWluKEwxLDI1NikKKyNlbmRpZgorICAgICAgInBzdWJ1c3cgJSVtbTAsICAgICAgICAlJW1tN1xuXHQiIC8vIHNvIHRoZSAyIHN1bSB0byAyNTYsIHdlaWdodGVkIGF2ZworICAgICAgIm1vdnEgICAgJSVtbTQsICAgICAgICAlJW1tMlxuXHQiIC8vIHNhdmUgd2VhdmUgY2hyb21hIGluZm8gYmVmb3JlIHRyYXNoaW5nCisgICAgICAicGFuZCAgICAlW1lNYXNrXSwgICAgICUlbW00XG5cdCIgLy8ga2VlcCBvbmx5IGx1bWEgZnJvbSBjYWxjJ2QgdmFsdWUKKyAgICAgICJwc3JsdyAgICQ4LCAgICAgICAgICAgJSVtbTRcblx0IiAvLyBkaXYgYnkgMjU2IHRvIGdldCB3ZWlnaHRlZCBhdmcKKyAgICAgICJwbXVsbHcgICUlbW03LCAgICAgICAgJSVtbTRcblx0IiAvLyB1c2UgbW9yZSB3ZWF2ZSBmb3IgbGVzcyBtb3Rpb24KKyAgICAgICJwYW5kICAgICVbWU1hc2tdLCAgICAgJSVtbTZcblx0IiAvLyBrZWVwIG9ubHkgbHVtYSBmcm9tIGNhbGMnZCB2YWx1ZQorICAgICAgInBzcmx3ICAgJDgsICAgICAgICAgICAlJW1tNlxuXHQiIC8vIGRpdiBieSAyNTYgdG8gZ2V0IHdlaWdodGVkIGF2ZworICAgICAgInBtdWxsdyAgJSVtbTAsICAgICAgICAlJW1tNlxuXHQiIC8vIHVzZSBtb3JlIGJvYiBmb3IgbGFyZ2UgbW90aW9uCisgICAgICAicGFkZHVzdyAlJW1tNiwgICAgICAgICUlbW00XG5cdCIgLy8gY29tYmluZQorICAgICAgInBhbmQgICAgJVtZTWFza10sICAgICAlJW1tNFxuXHQiIC8vIGtlZXAgb25seSBsdW1hIGZyb20gY2FsYydkIHZhbHVlCisgICAgICAvLyBjaHJvbWEgY29tZXMgZnJvbSB3ZWF2ZSBwaXhlbAorICAgICAgInBhbmQgICAgJVtVVk1hc2tdLCAgICAlJW1tMlxuXHQiIC8vIGtlZXAgY2hyb21hCisgICAgICAicG9yICAgICAlJW1tNCwgICAgICAgICUlbW0yXG5cdCIgLy8gYW5kIGNvbWJpbmUKKyAgICAgIFZfTU9WTlRRICgiKCUlIiBYREkgIikiLCAiJSVtbTIiKSAvLyBtb3ZlIGluIG91ciBjbGlwcGVkIGJlc3QsIHVzZSBtYWNybworICAgICAgLy8gYnVtcCBwdHJzIGFuZCBsb29wCisgICAgICBMRUFYICIgICAgOCglJSIgWEFYICIpLCAgICUlIiBYQVggIlxuXHQiCisgICAgICBMRUFYICIgICAgOCglJSIgWEJYICIpLCAgICUlIiBYQlggIlxuXHQiCisgICAgICBMRUFYICIgICAgOCglJSIgWERYICIpLCAgICUlIiBYRFggIlxuXHQiCisgICAgICBMRUFYICIgICAgOCglJSIgWERJICIpLCAgICUlIiBYREkgIlxuXHQiCisgICAgICBMRUFYICIgICAgOCglJSIgWFNJICIpLCAgICUlIiBYU0kgIlxuXHQiCisgICAgICBERUNYICIgICAgJVtMb29wQ3RyXVxuXHQiCisgICAgICAKKyAgICAgICJqZyAgICAgIDFiXG5cdCIgICAvLyBsb29wIGlmIG5vdCB0byBsYXN0IGxpbmUKKyAgICAgIC8vIG5vdGUgUC1JSUkgZGVmYXVsdCBhc3N1bWVzIGJhY2t3YXJkIGJyYW5jaGVzIHRha2VuCisgICAgICAiamwgICAgICAxZlxuXHQiICAgICAgICAgIC8vIGRvbmUKKyAgICAgIE1PVlggIiAgICAlJSIgWEFYICIsICAgICAgJSUiIFhCWCAiXG5cdCIgIC8vIHNoYXJwbmVzcyBsb29rYWhlYWQgMSBieXRlIG9ubHksIGJlIHdyb25nIG9uIDEKKyAgICAgICJqbXAgICAgIDFiXG5cdCIKKyAgICAgIAorICAgICAgIjE6XG5cdCIgICAgICAKKyAgICAgIE1PVlggIiAlW29sZGJ4XSwgJSUiIFhCWCAiXG5cdCIKKyAgICAgICJlbW1zXG5cdCI6ICAgICAvKiBubyBvdXRwdXRzICovCisKKyAgICAgIDpbTGFzdEF2Z10gIm0iIChMYXN0QXZnKSwKKyAgICAgICBbTDFdICJtIiAoTDEpLAorICAgICAgIFtMM10gIm0iIChMMyksCisgICAgICAgW0wyUF0gIm0iIChMMlApLAorICAgICAgIFtMMl0gIm0iIChMMiksCisgICAgICAgW0Rlc3RdICJtIiAoRGVzdCksCisgICAgICAgW1NoaWZ0TWFza10gIm0iIChTaGlmdE1hc2spLAorICAgICAgIFtNYXhDb21iXSAibSIgKE1heENvbWIpLAorICAgICAgIFtNb3Rpb25UaHJlc2hvbGRdICJtIiAoTW90aW9uVGhyZXNob2xkKSwKKyAgICAgICBbTW90aW9uU2Vuc2VdICJtIiAoTW90aW9uU2Vuc2UpLAorICAgICAgIFtRVzI1NkJdICJtIiAoUVcyNTZCKSwKKyAgICAgICBbWU1hc2tdICJtIiAoWU1hc2spLAorICAgICAgIFtVVk1hc2tdICJtIiAoVVZNYXNrKSwKKyAgICAgICBbTG9vcEN0cl0gIm0iIChMb29wQ3RyKSwKKyAgICAgICBbUVcyNTZdICJtIiAoUVcyNTYpLAorICAgICAgIFtvbGRieF0gIm0iIChvbGRieCkKKyAgICAgIDogWEFYLCBYQ1gsIFhEWCwgWFNJLCBYREksCisgICAgICAic3QiLCAic3QoMSkiLCAic3QoMikiLCAic3QoMykiLCAic3QoNCkiLCAic3QoNSkiLCAic3QoNikiLCAic3QoNykiLAorI2lmZGVmIF9fTU1YX18KKyAgICAgICJtbTAiLCAibW0xIiwgIm1tMiIsICJtbTMiLCAibW00IiwgIm1tNSIsICJtbTYiLCAibW03IiwKKyNlbmRpZgorICAgICAgIm1lbW9yeSIsICJjYyIpOworfQorCmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5Zjc1ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWguYwpAQCAtMCwwICsxLDEwNzYgQEAKKy8qCisgKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgQmlsbHkgQmlnZ3MgPHZla3RvckBkdW1idGVybS5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0Bjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIFJlbGljZW5zZWQgZm9yIEdTdHJlYW1lciBmcm9tIEdQTCB0byBMR1BMIHdpdGggcGVybWl0IGZyb20gQmlsbHkgQmlnZ3MuCisgKiBTZWU6IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTE2MzU3OAorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJncmVlZHlobWFjcm9zLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlICJwbHVnaW5zLmgiCisjaW5jbHVkZSAiZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaCIKKyNpZmRlZiBIQVZFX09SQworI2luY2x1ZGUgPG9yYy9vcmMuaD4KKyNlbmRpZgorCisjZGVmaW5lIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9HUkVFRFlfSAkoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfaF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9HUkVFRFlfSChvYmopCQkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0gpKQorI2RlZmluZSBHU1RfSVNfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9IX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9HUkVFRFlfSCkpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0hfR0VUX0NMQVNTKG9iaikJKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0gsIEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SENsYXNzKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9HUkVFRFlfSChvYmopCQkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0gsIEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SCkpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0hfQ0xBU1Moa2xhc3MpCShHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9ILCBHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUhDbGFzcykpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0hfQ0FTVChvYmopCSgoR3N0RGVpbnRlcmxhY2VNZXRob2RHcmVlZHlIKikob2JqKSkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2QgcGFyZW50OworCisgIGd1aW50IG1heF9jb21iLCBtb3Rpb25fdGhyZXNob2xkLCBtb3Rpb25fc2Vuc2U7Cit9IEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SDsKKwordHlwZWRlZiB2b2lkICgqU2NhbmxpbmVGdW5jdGlvbikgKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SCAqIHNlbGYsCisgICAgY29uc3QgZ3VpbnQ4ICogTDIsIGNvbnN0IGd1aW50OCAqIEwxLCBjb25zdCBndWludDggKiBMMywgY29uc3QgZ3VpbnQ4ICogTDJQLAorICAgIGd1aW50OCAqIERlc3QsIGdpbnQgd2lkdGgpOworCit0eXBlZGVmIHN0cnVjdAoreworICBHc3REZWludGVybGFjZU1ldGhvZENsYXNzIHBhcmVudF9jbGFzczsKKyAgU2NhbmxpbmVGdW5jdGlvbiBzY2FubGluZV95dXkyOyAgICAgICAvKiBUaGlzIGlzIGZvciBZVllVIHRvbyAqLworICBTY2FubGluZUZ1bmN0aW9uIHNjYW5saW5lX3V5dnk7CisgIFNjYW5saW5lRnVuY3Rpb24gc2NhbmxpbmVfYXl1djsKKyAgU2NhbmxpbmVGdW5jdGlvbiBzY2FubGluZV9wbGFuYXJfeTsKKyAgU2NhbmxpbmVGdW5jdGlvbiBzY2FubGluZV9wbGFuYXJfdXY7Cit9IEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SENsYXNzOworCitzdGF0aWMgdm9pZAorZ3JlZWR5aF9zY2FubGluZV9DX2F5dXYgKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SCAqIHNlbGYsIGNvbnN0IGd1aW50OCAqIEwxLAorICAgIGNvbnN0IGd1aW50OCAqIEwyLCBjb25zdCBndWludDggKiBMMywgY29uc3QgZ3VpbnQ4ICogTDJQLCBndWludDggKiBEZXN0LAorICAgIGdpbnQgd2lkdGgpCit7CisgIGdpbnQgUG9zLCBDb21wOworICBndWludDggbDEsIGwxXzEsIGwzLCBsM18xOworICBndWludDggYXZnLCBhdmdfMTsKKyAgZ3VpbnQ4IGF2Z19fMVs0XSA9IHsgMCwgfTsKKyAgZ3VpbnQ4IGF2Z19zOworICBndWludDggYXZnX3NjOworICBndWludDggYmVzdDsKKyAgZ3VpbnQxNiBtb3Y7CisgIGd1aW50OCBvdXQ7CisgIGd1aW50OCBsMiwgbHAyOworICBndWludDggbDJfZGlmZiwgbHAyX2RpZmY7CisgIGd1aW50OCBtaW4sIG1heDsKKyAgZ3VpbnQgbWF4X2NvbWIgPSBzZWxmLT5tYXhfY29tYjsKKyAgZ3VpbnQgbW90aW9uX3NlbnNlID0gc2VsZi0+bW90aW9uX3NlbnNlOworICBndWludCBtb3Rpb25fdGhyZXNob2xkID0gc2VsZi0+bW90aW9uX3RocmVzaG9sZDsKKworICB3aWR0aCAvPSA0OworICBmb3IgKFBvcyA9IDA7IFBvcyA8IHdpZHRoOyBQb3MrKykgeworICAgIGZvciAoQ29tcCA9IDA7IENvbXAgPCA0OyBDb21wKyspIHsKKyAgICAgIGwxID0gTDFbMF07CisgICAgICBsMyA9IEwzWzBdOworCisgICAgICBpZiAoUG9zID09IHdpZHRoIC0gMSkgeworICAgICAgICBsMV8xID0gbDE7CisgICAgICAgIGwzXzEgPSBsMzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGwxXzEgPSBMMVs0XTsKKyAgICAgICAgbDNfMSA9IEwzWzRdOworICAgICAgfQorCisgICAgICAvKiBBdmVyYWdlIG9mIEwxIGFuZCBMMyAqLworICAgICAgYXZnID0gKGwxICsgbDMpIC8gMjsKKworICAgICAgaWYgKFBvcyA9PSAwKSB7CisgICAgICAgIGF2Z19fMVtDb21wXSA9IGF2ZzsKKyAgICAgIH0KKworICAgICAgLyogQXZlcmFnZSBvZiBuZXh0IEwxIGFuZCBuZXh0IEwzICovCisgICAgICBhdmdfMSA9IChsMV8xICsgbDNfMSkgLyAyOworCisgICAgICAvKiBDYWxjdWxhdGUgYXZlcmFnZSBvZiBvbmUgcGl4ZWwgZm9yd2FyZCBhbmQgcHJldmlvdXMgKi8KKyAgICAgIGF2Z19zID0gKGF2Z19fMVtDb21wXSArIGF2Z18xKSAvIDI7CisKKyAgICAgIC8qIENhbGN1bGF0ZSBhdmVyYWdlIG9mIGNlbnRlciBhbmQgc3Vycm91bmRpbmcgcGl4ZWxzICovCisgICAgICBhdmdfc2MgPSAoYXZnICsgYXZnX3MpIC8gMjsKKworICAgICAgLyogbW92ZSBmb3J3YXJkICovCisgICAgICBhdmdfXzFbQ29tcF0gPSBhdmc7CisKKyAgICAgIC8qIEdldCBiZXN0IEwyL0wyUCwgaS5lLiBsZWFzdCBkaWZmIGZyb20gYWJvdmUgYXZlcmFnZSAqLworICAgICAgbDIgPSBMMlswXTsKKyAgICAgIGxwMiA9IEwyUFswXTsKKworICAgICAgbDJfZGlmZiA9IEFCUyAobDIgLSBhdmdfc2MpOworCisgICAgICBscDJfZGlmZiA9IEFCUyAobHAyIC0gYXZnX3NjKTsKKworICAgICAgaWYgKGwyX2RpZmYgPiBscDJfZGlmZikKKyAgICAgICAgYmVzdCA9IGxwMjsKKyAgICAgIGVsc2UKKyAgICAgICAgYmVzdCA9IGwyOworCisgICAgICAvKiBDbGlwIHRoaXMgYmVzdCBMMi9MMlAgYnkgTDEvTDMgYW5kIGFsbG93IHRvIGRpZmZlciBieSBHcmVlZHlNYXhDb21iICovCisgICAgICBtYXggPSBNQVggKGwxLCBsMyk7CisgICAgICBtaW4gPSBNSU4gKGwxLCBsMyk7CisKKyAgICAgIGlmIChtYXggPCAyNTYgLSBtYXhfY29tYikKKyAgICAgICAgbWF4ICs9IG1heF9jb21iOworICAgICAgZWxzZQorICAgICAgICBtYXggPSAyNTU7CisKKyAgICAgIGlmIChtaW4gPiBtYXhfY29tYikKKyAgICAgICAgbWluIC09IG1heF9jb21iOworICAgICAgZWxzZQorICAgICAgICBtaW4gPSAwOworCisgICAgICBvdXQgPSBDTEFNUCAoYmVzdCwgbWluLCBtYXgpOworCisgICAgICBpZiAoQ29tcCA8IDIpIHsKKyAgICAgICAgLyogRG8gbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgbHVtYSwgaS5lLiBob3cgbXVjaAorICAgICAgICAgKiB0aGUgd2VhdmUgcGl4ZWwgZGlmZmVycyAqLworICAgICAgICBtb3YgPSBBQlMgKGwyIC0gbHAyKTsKKyAgICAgICAgaWYgKG1vdiA+IG1vdGlvbl90aHJlc2hvbGQpCisgICAgICAgICAgbW92IC09IG1vdGlvbl90aHJlc2hvbGQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtb3YgPSAwOworCisgICAgICAgIG1vdiA9IG1vdiAqIG1vdGlvbl9zZW5zZTsKKyAgICAgICAgaWYgKG1vdiA+IDI1NikKKyAgICAgICAgICBtb3YgPSAyNTY7CisKKyAgICAgICAgLyogV2VpZ2h0ZWQgc3VtIG9uIGNsaXBwZWQgd2VhdmUgcGl4ZWwgYW5kIGF2ZXJhZ2UgKi8KKyAgICAgICAgb3V0ID0gKG91dCAqICgyNTYgLSBtb3YpICsgYXZnX3NjICogbW92KSAvIDI1NjsKKyAgICAgIH0KKworICAgICAgRGVzdFswXSA9IG91dDsKKworICAgICAgRGVzdCArPSAxOworICAgICAgTDEgKz0gMTsKKyAgICAgIEwyICs9IDE7CisgICAgICBMMyArPSAxOworICAgICAgTDJQICs9IDE7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitncmVlZHloX3NjYW5saW5lX0NfeXV5MiAoR3N0RGVpbnRlcmxhY2VNZXRob2RHcmVlZHlIICogc2VsZiwgY29uc3QgZ3VpbnQ4ICogTDEsCisgICAgY29uc3QgZ3VpbnQ4ICogTDIsIGNvbnN0IGd1aW50OCAqIEwzLCBjb25zdCBndWludDggKiBMMlAsIGd1aW50OCAqIERlc3QsCisgICAgZ2ludCB3aWR0aCkKK3sKKyAgZ2ludCBQb3M7CisgIGd1aW50OCBsMV9sLCBsMV8xX2wsIGwzX2wsIGwzXzFfbDsKKyAgZ3VpbnQ4IGwxX2MsIGwxXzFfYywgbDNfYywgbDNfMV9jOworICBndWludDggYXZnX2wsIGF2Z19jLCBhdmdfbF8xLCBhdmdfY18xOworICBndWludDggYXZnX2xfXzEgPSAwLCBhdmdfY19fMSA9IDA7CisgIGd1aW50OCBhdmdfc19sLCBhdmdfc19jOworICBndWludDggYXZnX3NjX2wsIGF2Z19zY19jOworICBndWludDggYmVzdF9sLCBiZXN0X2M7CisgIGd1aW50MTYgbW92X2w7CisgIGd1aW50OCBvdXRfbCwgb3V0X2M7CisgIGd1aW50OCBsMl9sLCBsMl9jLCBscDJfbCwgbHAyX2M7CisgIGd1aW50OCBsMl9sX2RpZmYsIGwyX2NfZGlmZiwgbHAyX2xfZGlmZiwgbHAyX2NfZGlmZjsKKyAgZ3VpbnQ4IG1pbl9sLCBtaW5fYywgbWF4X2wsIG1heF9jOworICBndWludCBtYXhfY29tYiA9IHNlbGYtPm1heF9jb21iOworICBndWludCBtb3Rpb25fc2Vuc2UgPSBzZWxmLT5tb3Rpb25fc2Vuc2U7CisgIGd1aW50IG1vdGlvbl90aHJlc2hvbGQgPSBzZWxmLT5tb3Rpb25fdGhyZXNob2xkOworCisgIHdpZHRoIC89IDI7CisgIGZvciAoUG9zID0gMDsgUG9zIDwgd2lkdGg7IFBvcysrKSB7CisgICAgbDFfbCA9IEwxWzBdOworICAgIGwxX2MgPSBMMVsxXTsKKyAgICBsM19sID0gTDNbMF07CisgICAgbDNfYyA9IEwzWzFdOworCisgICAgaWYgKFBvcyA9PSB3aWR0aCAtIDEpIHsKKyAgICAgIGwxXzFfbCA9IGwxX2w7CisgICAgICBsMV8xX2MgPSBsMV9jOworICAgICAgbDNfMV9sID0gbDNfbDsKKyAgICAgIGwzXzFfYyA9IGwzX2M7CisgICAgfSBlbHNlIHsKKyAgICAgIGwxXzFfbCA9IEwxWzJdOworICAgICAgbDFfMV9jID0gTDFbM107CisgICAgICBsM18xX2wgPSBMM1syXTsKKyAgICAgIGwzXzFfYyA9IEwzWzNdOworICAgIH0KKworICAgIC8qIEF2ZXJhZ2Ugb2YgTDEgYW5kIEwzICovCisgICAgYXZnX2wgPSAobDFfbCArIGwzX2wpIC8gMjsKKyAgICBhdmdfYyA9IChsMV9jICsgbDNfYykgLyAyOworCisgICAgaWYgKFBvcyA9PSAwKSB7CisgICAgICBhdmdfbF9fMSA9IGF2Z19sOworICAgICAgYXZnX2NfXzEgPSBhdmdfYzsKKyAgICB9CisKKyAgICAvKiBBdmVyYWdlIG9mIG5leHQgTDEgYW5kIG5leHQgTDMgKi8KKyAgICBhdmdfbF8xID0gKGwxXzFfbCArIGwzXzFfbCkgLyAyOworICAgIGF2Z19jXzEgPSAobDFfMV9jICsgbDNfMV9jKSAvIDI7CisKKyAgICAvKiBDYWxjdWxhdGUgYXZlcmFnZSBvZiBvbmUgcGl4ZWwgZm9yd2FyZCBhbmQgcHJldmlvdXMgKi8KKyAgICBhdmdfc19sID0gKGF2Z19sX18xICsgYXZnX2xfMSkgLyAyOworICAgIGF2Z19zX2MgPSAoYXZnX2NfXzEgKyBhdmdfY18xKSAvIDI7CisKKyAgICAvKiBDYWxjdWxhdGUgYXZlcmFnZSBvZiBjZW50ZXIgYW5kIHN1cnJvdW5kaW5nIHBpeGVscyAqLworICAgIGF2Z19zY19sID0gKGF2Z19sICsgYXZnX3NfbCkgLyAyOworICAgIGF2Z19zY19jID0gKGF2Z19jICsgYXZnX3NfYykgLyAyOworCisgICAgLyogbW92ZSBmb3J3YXJkICovCisgICAgYXZnX2xfXzEgPSBhdmdfbDsKKyAgICBhdmdfY19fMSA9IGF2Z19jOworCisgICAgLyogR2V0IGJlc3QgTDIvTDJQLCBpLmUuIGxlYXN0IGRpZmYgZnJvbSBhYm92ZSBhdmVyYWdlICovCisgICAgbDJfbCA9IEwyWzBdOworICAgIGwyX2MgPSBMMlsxXTsKKyAgICBscDJfbCA9IEwyUFswXTsKKyAgICBscDJfYyA9IEwyUFsxXTsKKworICAgIGwyX2xfZGlmZiA9IEFCUyAobDJfbCAtIGF2Z19zY19sKTsKKyAgICBsMl9jX2RpZmYgPSBBQlMgKGwyX2MgLSBhdmdfc2NfYyk7CisKKyAgICBscDJfbF9kaWZmID0gQUJTIChscDJfbCAtIGF2Z19zY19sKTsKKyAgICBscDJfY19kaWZmID0gQUJTIChscDJfYyAtIGF2Z19zY19jKTsKKworICAgIGlmIChsMl9sX2RpZmYgPiBscDJfbF9kaWZmKQorICAgICAgYmVzdF9sID0gbHAyX2w7CisgICAgZWxzZQorICAgICAgYmVzdF9sID0gbDJfbDsKKworICAgIGlmIChsMl9jX2RpZmYgPiBscDJfY19kaWZmKQorICAgICAgYmVzdF9jID0gbHAyX2M7CisgICAgZWxzZQorICAgICAgYmVzdF9jID0gbDJfYzsKKworICAgIC8qIENsaXAgdGhpcyBiZXN0IEwyL0wyUCBieSBMMS9MMyBhbmQgYWxsb3cgdG8gZGlmZmVyIGJ5IEdyZWVkeU1heENvbWIgKi8KKyAgICBtYXhfbCA9IE1BWCAobDFfbCwgbDNfbCk7CisgICAgbWluX2wgPSBNSU4gKGwxX2wsIGwzX2wpOworCisgICAgaWYgKG1heF9sIDwgMjU2IC0gbWF4X2NvbWIpCisgICAgICBtYXhfbCArPSBtYXhfY29tYjsKKyAgICBlbHNlCisgICAgICBtYXhfbCA9IDI1NTsKKworICAgIGlmIChtaW5fbCA+IG1heF9jb21iKQorICAgICAgbWluX2wgLT0gbWF4X2NvbWI7CisgICAgZWxzZQorICAgICAgbWluX2wgPSAwOworCisgICAgbWF4X2MgPSBNQVggKGwxX2MsIGwzX2MpOworICAgIG1pbl9jID0gTUlOIChsMV9jLCBsM19jKTsKKworICAgIGlmIChtYXhfYyA8IDI1NiAtIG1heF9jb21iKQorICAgICAgbWF4X2MgKz0gbWF4X2NvbWI7CisgICAgZWxzZQorICAgICAgbWF4X2MgPSAyNTU7CisKKyAgICBpZiAobWluX2MgPiBtYXhfY29tYikKKyAgICAgIG1pbl9jIC09IG1heF9jb21iOworICAgIGVsc2UKKyAgICAgIG1pbl9jID0gMDsKKworICAgIG91dF9sID0gQ0xBTVAgKGJlc3RfbCwgbWluX2wsIG1heF9sKTsKKyAgICBvdXRfYyA9IENMQU1QIChiZXN0X2MsIG1pbl9jLCBtYXhfYyk7CisKKyAgICAvKiBEbyBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBsdW1hLCBpLmUuIGhvdyBtdWNoCisgICAgICogdGhlIHdlYXZlIHBpeGVsIGRpZmZlcnMgKi8KKyAgICBtb3ZfbCA9IEFCUyAobDJfbCAtIGxwMl9sKTsKKyAgICBpZiAobW92X2wgPiBtb3Rpb25fdGhyZXNob2xkKQorICAgICAgbW92X2wgLT0gbW90aW9uX3RocmVzaG9sZDsKKyAgICBlbHNlCisgICAgICBtb3ZfbCA9IDA7CisKKyAgICBtb3ZfbCA9IG1vdl9sICogbW90aW9uX3NlbnNlOworICAgIGlmIChtb3ZfbCA+IDI1NikKKyAgICAgIG1vdl9sID0gMjU2OworCisgICAgLyogV2VpZ2h0ZWQgc3VtIG9uIGNsaXBwZWQgd2VhdmUgcGl4ZWwgYW5kIGF2ZXJhZ2UgKi8KKyAgICBvdXRfbCA9IChvdXRfbCAqICgyNTYgLSBtb3ZfbCkgKyBhdmdfc2NfbCAqIG1vdl9sKSAvIDI1NjsKKworICAgIERlc3RbMF0gPSBvdXRfbDsKKyAgICBEZXN0WzFdID0gb3V0X2M7CisKKyAgICBEZXN0ICs9IDI7CisgICAgTDEgKz0gMjsKKyAgICBMMiArPSAyOworICAgIEwzICs9IDI7CisgICAgTDJQICs9IDI7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dyZWVkeWhfc2NhbmxpbmVfQ191eXZ5IChHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUggKiBzZWxmLCBjb25zdCBndWludDggKiBMMSwKKyAgICBjb25zdCBndWludDggKiBMMiwgY29uc3QgZ3VpbnQ4ICogTDMsIGNvbnN0IGd1aW50OCAqIEwyUCwgZ3VpbnQ4ICogRGVzdCwKKyAgICBnaW50IHdpZHRoKQoreworICBnaW50IFBvczsKKyAgZ3VpbnQ4IGwxX2wsIGwxXzFfbCwgbDNfbCwgbDNfMV9sOworICBndWludDggbDFfYywgbDFfMV9jLCBsM19jLCBsM18xX2M7CisgIGd1aW50OCBhdmdfbCwgYXZnX2MsIGF2Z19sXzEsIGF2Z19jXzE7CisgIGd1aW50OCBhdmdfbF9fMSA9IDAsIGF2Z19jX18xID0gMDsKKyAgZ3VpbnQ4IGF2Z19zX2wsIGF2Z19zX2M7CisgIGd1aW50OCBhdmdfc2NfbCwgYXZnX3NjX2M7CisgIGd1aW50OCBiZXN0X2wsIGJlc3RfYzsKKyAgZ3VpbnQxNiBtb3ZfbDsKKyAgZ3VpbnQ4IG91dF9sLCBvdXRfYzsKKyAgZ3VpbnQ4IGwyX2wsIGwyX2MsIGxwMl9sLCBscDJfYzsKKyAgZ3VpbnQ4IGwyX2xfZGlmZiwgbDJfY19kaWZmLCBscDJfbF9kaWZmLCBscDJfY19kaWZmOworICBndWludDggbWluX2wsIG1pbl9jLCBtYXhfbCwgbWF4X2M7CisgIGd1aW50IG1heF9jb21iID0gc2VsZi0+bWF4X2NvbWI7CisgIGd1aW50IG1vdGlvbl9zZW5zZSA9IHNlbGYtPm1vdGlvbl9zZW5zZTsKKyAgZ3VpbnQgbW90aW9uX3RocmVzaG9sZCA9IHNlbGYtPm1vdGlvbl90aHJlc2hvbGQ7CisKKyAgd2lkdGggLz0gMjsKKyAgZm9yIChQb3MgPSAwOyBQb3MgPCB3aWR0aDsgUG9zKyspIHsKKyAgICBsMV9sID0gTDFbMV07CisgICAgbDFfYyA9IEwxWzBdOworICAgIGwzX2wgPSBMM1sxXTsKKyAgICBsM19jID0gTDNbMF07CisKKyAgICBpZiAoUG9zID09IHdpZHRoIC0gMSkgeworICAgICAgbDFfMV9sID0gbDFfbDsKKyAgICAgIGwxXzFfYyA9IGwxX2M7CisgICAgICBsM18xX2wgPSBsM19sOworICAgICAgbDNfMV9jID0gbDNfYzsKKyAgICB9IGVsc2UgeworICAgICAgbDFfMV9sID0gTDFbM107CisgICAgICBsMV8xX2MgPSBMMVsyXTsKKyAgICAgIGwzXzFfbCA9IEwzWzNdOworICAgICAgbDNfMV9jID0gTDNbMl07CisgICAgfQorCisgICAgLyogQXZlcmFnZSBvZiBMMSBhbmQgTDMgKi8KKyAgICBhdmdfbCA9IChsMV9sICsgbDNfbCkgLyAyOworICAgIGF2Z19jID0gKGwxX2MgKyBsM19jKSAvIDI7CisKKyAgICBpZiAoUG9zID09IDApIHsKKyAgICAgIGF2Z19sX18xID0gYXZnX2w7CisgICAgICBhdmdfY19fMSA9IGF2Z19jOworICAgIH0KKworICAgIC8qIEF2ZXJhZ2Ugb2YgbmV4dCBMMSBhbmQgbmV4dCBMMyAqLworICAgIGF2Z19sXzEgPSAobDFfMV9sICsgbDNfMV9sKSAvIDI7CisgICAgYXZnX2NfMSA9IChsMV8xX2MgKyBsM18xX2MpIC8gMjsKKworICAgIC8qIENhbGN1bGF0ZSBhdmVyYWdlIG9mIG9uZSBwaXhlbCBmb3J3YXJkIGFuZCBwcmV2aW91cyAqLworICAgIGF2Z19zX2wgPSAoYXZnX2xfXzEgKyBhdmdfbF8xKSAvIDI7CisgICAgYXZnX3NfYyA9IChhdmdfY19fMSArIGF2Z19jXzEpIC8gMjsKKworICAgIC8qIENhbGN1bGF0ZSBhdmVyYWdlIG9mIGNlbnRlciBhbmQgc3Vycm91bmRpbmcgcGl4ZWxzICovCisgICAgYXZnX3NjX2wgPSAoYXZnX2wgKyBhdmdfc19sKSAvIDI7CisgICAgYXZnX3NjX2MgPSAoYXZnX2MgKyBhdmdfc19jKSAvIDI7CisKKyAgICAvKiBtb3ZlIGZvcndhcmQgKi8KKyAgICBhdmdfbF9fMSA9IGF2Z19sOworICAgIGF2Z19jX18xID0gYXZnX2M7CisKKyAgICAvKiBHZXQgYmVzdCBMMi9MMlAsIGkuZS4gbGVhc3QgZGlmZiBmcm9tIGFib3ZlIGF2ZXJhZ2UgKi8KKyAgICBsMl9sID0gTDJbMV07CisgICAgbDJfYyA9IEwyWzBdOworICAgIGxwMl9sID0gTDJQWzFdOworICAgIGxwMl9jID0gTDJQWzBdOworCisgICAgbDJfbF9kaWZmID0gQUJTIChsMl9sIC0gYXZnX3NjX2wpOworICAgIGwyX2NfZGlmZiA9IEFCUyAobDJfYyAtIGF2Z19zY19jKTsKKworICAgIGxwMl9sX2RpZmYgPSBBQlMgKGxwMl9sIC0gYXZnX3NjX2wpOworICAgIGxwMl9jX2RpZmYgPSBBQlMgKGxwMl9jIC0gYXZnX3NjX2MpOworCisgICAgaWYgKGwyX2xfZGlmZiA+IGxwMl9sX2RpZmYpCisgICAgICBiZXN0X2wgPSBscDJfbDsKKyAgICBlbHNlCisgICAgICBiZXN0X2wgPSBsMl9sOworCisgICAgaWYgKGwyX2NfZGlmZiA+IGxwMl9jX2RpZmYpCisgICAgICBiZXN0X2MgPSBscDJfYzsKKyAgICBlbHNlCisgICAgICBiZXN0X2MgPSBsMl9jOworCisgICAgLyogQ2xpcCB0aGlzIGJlc3QgTDIvTDJQIGJ5IEwxL0wzIGFuZCBhbGxvdyB0byBkaWZmZXIgYnkgR3JlZWR5TWF4Q29tYiAqLworICAgIG1heF9sID0gTUFYIChsMV9sLCBsM19sKTsKKyAgICBtaW5fbCA9IE1JTiAobDFfbCwgbDNfbCk7CisKKyAgICBpZiAobWF4X2wgPCAyNTYgLSBtYXhfY29tYikKKyAgICAgIG1heF9sICs9IG1heF9jb21iOworICAgIGVsc2UKKyAgICAgIG1heF9sID0gMjU1OworCisgICAgaWYgKG1pbl9sID4gbWF4X2NvbWIpCisgICAgICBtaW5fbCAtPSBtYXhfY29tYjsKKyAgICBlbHNlCisgICAgICBtaW5fbCA9IDA7CisKKyAgICBtYXhfYyA9IE1BWCAobDFfYywgbDNfYyk7CisgICAgbWluX2MgPSBNSU4gKGwxX2MsIGwzX2MpOworCisgICAgaWYgKG1heF9jIDwgMjU2IC0gbWF4X2NvbWIpCisgICAgICBtYXhfYyArPSBtYXhfY29tYjsKKyAgICBlbHNlCisgICAgICBtYXhfYyA9IDI1NTsKKworICAgIGlmIChtaW5fYyA+IG1heF9jb21iKQorICAgICAgbWluX2MgLT0gbWF4X2NvbWI7CisgICAgZWxzZQorICAgICAgbWluX2MgPSAwOworCisgICAgb3V0X2wgPSBDTEFNUCAoYmVzdF9sLCBtaW5fbCwgbWF4X2wpOworICAgIG91dF9jID0gQ0xBTVAgKGJlc3RfYywgbWluX2MsIG1heF9jKTsKKworICAgIC8qIERvIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIGx1bWEsIGkuZS4gaG93IG11Y2gKKyAgICAgKiB0aGUgd2VhdmUgcGl4ZWwgZGlmZmVycyAqLworICAgIG1vdl9sID0gQUJTIChsMl9sIC0gbHAyX2wpOworICAgIGlmIChtb3ZfbCA+IG1vdGlvbl90aHJlc2hvbGQpCisgICAgICBtb3ZfbCAtPSBtb3Rpb25fdGhyZXNob2xkOworICAgIGVsc2UKKyAgICAgIG1vdl9sID0gMDsKKworICAgIG1vdl9sID0gbW92X2wgKiBtb3Rpb25fc2Vuc2U7CisgICAgaWYgKG1vdl9sID4gMjU2KQorICAgICAgbW92X2wgPSAyNTY7CisKKyAgICAvKiBXZWlnaHRlZCBzdW0gb24gY2xpcHBlZCB3ZWF2ZSBwaXhlbCBhbmQgYXZlcmFnZSAqLworICAgIG91dF9sID0gKG91dF9sICogKDI1NiAtIG1vdl9sKSArIGF2Z19zY19sICogbW92X2wpIC8gMjU2OworCisgICAgRGVzdFsxXSA9IG91dF9sOworICAgIERlc3RbMF0gPSBvdXRfYzsKKworICAgIERlc3QgKz0gMjsKKyAgICBMMSArPSAyOworICAgIEwyICs9IDI7CisgICAgTDMgKz0gMjsKKyAgICBMMlAgKz0gMjsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3JlZWR5aF9zY2FubGluZV9DX3BsYW5hcl95IChHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUggKiBzZWxmLAorICAgIGNvbnN0IGd1aW50OCAqIEwxLCBjb25zdCBndWludDggKiBMMiwgY29uc3QgZ3VpbnQ4ICogTDMsIGNvbnN0IGd1aW50OCAqIEwyUCwKKyAgICBndWludDggKiBEZXN0LCBnaW50IHdpZHRoKQoreworICBnaW50IFBvczsKKyAgZ3VpbnQ4IGwxLCBsMV8xLCBsMywgbDNfMTsKKyAgZ3VpbnQ4IGF2ZywgYXZnXzE7CisgIGd1aW50OCBhdmdfXzEgPSAwOworICBndWludDggYXZnX3M7CisgIGd1aW50OCBhdmdfc2M7CisgIGd1aW50OCBiZXN0OworICBndWludDE2IG1vdjsKKyAgZ3VpbnQ4IG91dDsKKyAgZ3VpbnQ4IGwyLCBscDI7CisgIGd1aW50OCBsMl9kaWZmLCBscDJfZGlmZjsKKyAgZ3VpbnQ4IG1pbiwgbWF4OworICBndWludCBtYXhfY29tYiA9IHNlbGYtPm1heF9jb21iOworICBndWludCBtb3Rpb25fc2Vuc2UgPSBzZWxmLT5tb3Rpb25fc2Vuc2U7CisgIGd1aW50IG1vdGlvbl90aHJlc2hvbGQgPSBzZWxmLT5tb3Rpb25fdGhyZXNob2xkOworCisgIGZvciAoUG9zID0gMDsgUG9zIDwgd2lkdGg7IFBvcysrKSB7CisgICAgbDEgPSBMMVswXTsKKyAgICBsMyA9IEwzWzBdOworCisgICAgaWYgKFBvcyA9PSB3aWR0aCAtIDEpIHsKKyAgICAgIGwxXzEgPSBsMTsKKyAgICAgIGwzXzEgPSBsMzsKKyAgICB9IGVsc2UgeworICAgICAgbDFfMSA9IEwxWzFdOworICAgICAgbDNfMSA9IEwzWzFdOworICAgIH0KKworICAgIC8qIEF2ZXJhZ2Ugb2YgTDEgYW5kIEwzICovCisgICAgYXZnID0gKGwxICsgbDMpIC8gMjsKKworICAgIGlmIChQb3MgPT0gMCkgeworICAgICAgYXZnX18xID0gYXZnOworICAgIH0KKworICAgIC8qIEF2ZXJhZ2Ugb2YgbmV4dCBMMSBhbmQgbmV4dCBMMyAqLworICAgIGF2Z18xID0gKGwxXzEgKyBsM18xKSAvIDI7CisKKyAgICAvKiBDYWxjdWxhdGUgYXZlcmFnZSBvZiBvbmUgcGl4ZWwgZm9yd2FyZCBhbmQgcHJldmlvdXMgKi8KKyAgICBhdmdfcyA9IChhdmdfXzEgKyBhdmdfMSkgLyAyOworCisgICAgLyogQ2FsY3VsYXRlIGF2ZXJhZ2Ugb2YgY2VudGVyIGFuZCBzdXJyb3VuZGluZyBwaXhlbHMgKi8KKyAgICBhdmdfc2MgPSAoYXZnICsgYXZnX3MpIC8gMjsKKworICAgIC8qIG1vdmUgZm9yd2FyZCAqLworICAgIGF2Z19fMSA9IGF2ZzsKKworICAgIC8qIEdldCBiZXN0IEwyL0wyUCwgaS5lLiBsZWFzdCBkaWZmIGZyb20gYWJvdmUgYXZlcmFnZSAqLworICAgIGwyID0gTDJbMF07CisgICAgbHAyID0gTDJQWzBdOworCisgICAgbDJfZGlmZiA9IEFCUyAobDIgLSBhdmdfc2MpOworCisgICAgbHAyX2RpZmYgPSBBQlMgKGxwMiAtIGF2Z19zYyk7CisKKyAgICBpZiAobDJfZGlmZiA+IGxwMl9kaWZmKQorICAgICAgYmVzdCA9IGxwMjsKKyAgICBlbHNlCisgICAgICBiZXN0ID0gbDI7CisKKyAgICAvKiBDbGlwIHRoaXMgYmVzdCBMMi9MMlAgYnkgTDEvTDMgYW5kIGFsbG93IHRvIGRpZmZlciBieSBHcmVlZHlNYXhDb21iICovCisgICAgbWF4ID0gTUFYIChsMSwgbDMpOworICAgIG1pbiA9IE1JTiAobDEsIGwzKTsKKworICAgIGlmIChtYXggPCAyNTYgLSBtYXhfY29tYikKKyAgICAgIG1heCArPSBtYXhfY29tYjsKKyAgICBlbHNlCisgICAgICBtYXggPSAyNTU7CisKKyAgICBpZiAobWluID4gbWF4X2NvbWIpCisgICAgICBtaW4gLT0gbWF4X2NvbWI7CisgICAgZWxzZQorICAgICAgbWluID0gMDsKKworICAgIG91dCA9IENMQU1QIChiZXN0LCBtaW4sIG1heCk7CisKKyAgICAvKiBEbyBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBsdW1hLCBpLmUuIGhvdyBtdWNoCisgICAgICogdGhlIHdlYXZlIHBpeGVsIGRpZmZlcnMgKi8KKyAgICBtb3YgPSBBQlMgKGwyIC0gbHAyKTsKKyAgICBpZiAobW92ID4gbW90aW9uX3RocmVzaG9sZCkKKyAgICAgIG1vdiAtPSBtb3Rpb25fdGhyZXNob2xkOworICAgIGVsc2UKKyAgICAgIG1vdiA9IDA7CisKKyAgICBtb3YgPSBtb3YgKiBtb3Rpb25fc2Vuc2U7CisgICAgaWYgKG1vdiA+IDI1NikKKyAgICAgIG1vdiA9IDI1NjsKKworICAgIC8qIFdlaWdodGVkIHN1bSBvbiBjbGlwcGVkIHdlYXZlIHBpeGVsIGFuZCBhdmVyYWdlICovCisgICAgb3V0ID0gKG91dCAqICgyNTYgLSBtb3YpICsgYXZnX3NjICogbW92KSAvIDI1NjsKKworICAgIERlc3RbMF0gPSBvdXQ7CisKKyAgICBEZXN0ICs9IDE7CisgICAgTDEgKz0gMTsKKyAgICBMMiArPSAxOworICAgIEwzICs9IDE7CisgICAgTDJQICs9IDE7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dyZWVkeWhfc2NhbmxpbmVfQ19wbGFuYXJfdXYgKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SCAqIHNlbGYsCisgICAgY29uc3QgZ3VpbnQ4ICogTDEsIGNvbnN0IGd1aW50OCAqIEwyLCBjb25zdCBndWludDggKiBMMywgY29uc3QgZ3VpbnQ4ICogTDJQLAorICAgIGd1aW50OCAqIERlc3QsIGdpbnQgd2lkdGgpCit7CisgIGdpbnQgUG9zOworICBndWludDggbDEsIGwxXzEsIGwzLCBsM18xOworICBndWludDggYXZnLCBhdmdfMTsKKyAgZ3VpbnQ4IGF2Z19fMSA9IDA7CisgIGd1aW50OCBhdmdfczsKKyAgZ3VpbnQ4IGF2Z19zYzsKKyAgZ3VpbnQ4IGJlc3Q7CisgIGd1aW50OCBvdXQ7CisgIGd1aW50OCBsMiwgbHAyOworICBndWludDggbDJfZGlmZiwgbHAyX2RpZmY7CisgIGd1aW50OCBtaW4sIG1heDsKKyAgZ3VpbnQgbWF4X2NvbWIgPSBzZWxmLT5tYXhfY29tYjsKKworICBmb3IgKFBvcyA9IDA7IFBvcyA8IHdpZHRoOyBQb3MrKykgeworICAgIGwxID0gTDFbMF07CisgICAgbDMgPSBMM1swXTsKKworICAgIGlmIChQb3MgPT0gd2lkdGggLSAxKSB7CisgICAgICBsMV8xID0gbDE7CisgICAgICBsM18xID0gbDM7CisgICAgfSBlbHNlIHsKKyAgICAgIGwxXzEgPSBMMVsxXTsKKyAgICAgIGwzXzEgPSBMM1sxXTsKKyAgICB9CisKKyAgICAvKiBBdmVyYWdlIG9mIEwxIGFuZCBMMyAqLworICAgIGF2ZyA9IChsMSArIGwzKSAvIDI7CisKKyAgICBpZiAoUG9zID09IDApIHsKKyAgICAgIGF2Z19fMSA9IGF2ZzsKKyAgICB9CisKKyAgICAvKiBBdmVyYWdlIG9mIG5leHQgTDEgYW5kIG5leHQgTDMgKi8KKyAgICBhdmdfMSA9IChsMV8xICsgbDNfMSkgLyAyOworCisgICAgLyogQ2FsY3VsYXRlIGF2ZXJhZ2Ugb2Ygb25lIHBpeGVsIGZvcndhcmQgYW5kIHByZXZpb3VzICovCisgICAgYXZnX3MgPSAoYXZnX18xICsgYXZnXzEpIC8gMjsKKworICAgIC8qIENhbGN1bGF0ZSBhdmVyYWdlIG9mIGNlbnRlciBhbmQgc3Vycm91bmRpbmcgcGl4ZWxzICovCisgICAgYXZnX3NjID0gKGF2ZyArIGF2Z19zKSAvIDI7CisKKyAgICAvKiBtb3ZlIGZvcndhcmQgKi8KKyAgICBhdmdfXzEgPSBhdmc7CisKKyAgICAvKiBHZXQgYmVzdCBMMi9MMlAsIGkuZS4gbGVhc3QgZGlmZiBmcm9tIGFib3ZlIGF2ZXJhZ2UgKi8KKyAgICBsMiA9IEwyWzBdOworICAgIGxwMiA9IEwyUFswXTsKKworICAgIGwyX2RpZmYgPSBBQlMgKGwyIC0gYXZnX3NjKTsKKworICAgIGxwMl9kaWZmID0gQUJTIChscDIgLSBhdmdfc2MpOworCisgICAgaWYgKGwyX2RpZmYgPiBscDJfZGlmZikKKyAgICAgIGJlc3QgPSBscDI7CisgICAgZWxzZQorICAgICAgYmVzdCA9IGwyOworCisgICAgLyogQ2xpcCB0aGlzIGJlc3QgTDIvTDJQIGJ5IEwxL0wzIGFuZCBhbGxvdyB0byBkaWZmZXIgYnkgR3JlZWR5TWF4Q29tYiAqLworICAgIG1heCA9IE1BWCAobDEsIGwzKTsKKyAgICBtaW4gPSBNSU4gKGwxLCBsMyk7CisKKyAgICBpZiAobWF4IDwgMjU2IC0gbWF4X2NvbWIpCisgICAgICBtYXggKz0gbWF4X2NvbWI7CisgICAgZWxzZQorICAgICAgbWF4ID0gMjU1OworCisgICAgaWYgKG1pbiA+IG1heF9jb21iKQorICAgICAgbWluIC09IG1heF9jb21iOworICAgIGVsc2UKKyAgICAgIG1pbiA9IDA7CisKKyAgICBvdXQgPSBDTEFNUCAoYmVzdCwgbWluLCBtYXgpOworCisgICAgRGVzdFswXSA9IG91dDsKKworICAgIERlc3QgKz0gMTsKKyAgICBMMSArPSAxOworICAgIEwyICs9IDE7CisgICAgTDMgKz0gMTsKKyAgICBMMlAgKz0gMTsKKyAgfQorfQorCisjaWZkZWYgQlVJTERfWDg2X0FTTQorCisjZGVmaW5lIElTX01NWEVYVAorI2RlZmluZSBTSU1EX1RZUEUgTU1YRVhUCisjZGVmaW5lIENfRlVOQ1RfWVVZMiBncmVlZHloX3NjYW5saW5lX0NfeXV5MgorI2RlZmluZSBDX0ZVTkNUX1VZVlkgZ3JlZWR5aF9zY2FubGluZV9DX3V5dnkKKyNkZWZpbmUgQ19GVU5DVF9QTEFOQVJfWSBncmVlZHloX3NjYW5saW5lX0NfcGxhbmFyX3kKKyNkZWZpbmUgQ19GVU5DVF9QTEFOQVJfVVYgZ3JlZWR5aF9zY2FubGluZV9DX3BsYW5hcl91dgorI2RlZmluZSBGVU5DVF9OQU1FX1lVWTIgZ3JlZWR5aF9zY2FubGluZV9NTVhFWFRfeXV5MgorI2RlZmluZSBGVU5DVF9OQU1FX1VZVlkgZ3JlZWR5aF9zY2FubGluZV9NTVhFWFRfdXl2eQorI2RlZmluZSBGVU5DVF9OQU1FX1BMQU5BUl9ZIGdyZWVkeWhfc2NhbmxpbmVfTU1YRVhUX3BsYW5hcl95CisjZGVmaW5lIEZVTkNUX05BTUVfUExBTkFSX1VWIGdyZWVkeWhfc2NhbmxpbmVfTU1YRVhUX3BsYW5hcl91dgorI2luY2x1ZGUgImdyZWVkeWguYXNtIgorI3VuZGVmIFNJTURfVFlQRQorI3VuZGVmIElTX01NWEVYVAorI3VuZGVmIEZVTkNUX05BTUVfWVVZMgorI3VuZGVmIEZVTkNUX05BTUVfVVlWWQorI3VuZGVmIEZVTkNUX05BTUVfUExBTkFSX1kKKyN1bmRlZiBGVU5DVF9OQU1FX1BMQU5BUl9VVgorCisjZGVmaW5lIElTXzNETk9XCisjZGVmaW5lIFNJTURfVFlQRSAzRE5PVworI2RlZmluZSBGVU5DVF9OQU1FX1lVWTIgZ3JlZWR5aF9zY2FubGluZV8zRE5PV195dXkyCisjZGVmaW5lIEZVTkNUX05BTUVfVVlWWSBncmVlZHloX3NjYW5saW5lXzNETk9XX3V5dnkKKyNkZWZpbmUgRlVOQ1RfTkFNRV9QTEFOQVJfWSBncmVlZHloX3NjYW5saW5lXzNETk9XX3BsYW5hcl95CisjZGVmaW5lIEZVTkNUX05BTUVfUExBTkFSX1VWIGdyZWVkeWhfc2NhbmxpbmVfM0ROT1dfcGxhbmFyX3V2CisjaW5jbHVkZSAiZ3JlZWR5aC5hc20iCisjdW5kZWYgU0lNRF9UWVBFCisjdW5kZWYgSVNfM0ROT1cKKyN1bmRlZiBGVU5DVF9OQU1FX1lVWTIKKyN1bmRlZiBGVU5DVF9OQU1FX1VZVlkKKyN1bmRlZiBGVU5DVF9OQU1FX1BMQU5BUl9ZCisjdW5kZWYgRlVOQ1RfTkFNRV9QTEFOQVJfVVYKKworI2RlZmluZSBJU19NTVgKKyNkZWZpbmUgU0lNRF9UWVBFIE1NWAorI2RlZmluZSBGVU5DVF9OQU1FX1lVWTIgZ3JlZWR5aF9zY2FubGluZV9NTVhfeXV5MgorI2RlZmluZSBGVU5DVF9OQU1FX1VZVlkgZ3JlZWR5aF9zY2FubGluZV9NTVhfdXl2eQorI2RlZmluZSBGVU5DVF9OQU1FX1BMQU5BUl9ZIGdyZWVkeWhfc2NhbmxpbmVfTU1YX3BsYW5hcl95CisjZGVmaW5lIEZVTkNUX05BTUVfUExBTkFSX1VWIGdyZWVkeWhfc2NhbmxpbmVfTU1YX3BsYW5hcl91dgorI2luY2x1ZGUgImdyZWVkeWguYXNtIgorI3VuZGVmIFNJTURfVFlQRQorI3VuZGVmIElTX01NWAorI3VuZGVmIEZVTkNUX05BTUVfWVVZMgorI3VuZGVmIEZVTkNUX05BTUVfVVlWWQorI3VuZGVmIEZVTkNUX05BTUVfUExBTkFSX1kKKyN1bmRlZiBGVU5DVF9OQU1FX1BMQU5BUl9VVgorI3VuZGVmIENfRlVOQ1RfWVVZMgorI3VuZGVmIENfRlVOQ1RfUExBTkFSX1kKKyN1bmRlZiBDX0ZVTkNUX1BMQU5BUl9VVgorCisjZW5kaWYKKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX2ZyYW1lX2RpX2dyZWVkeWhfcGFja2VkIChHc3REZWludGVybGFjZU1ldGhvZCAqIG1ldGhvZCwKKyAgICBjb25zdCBHc3REZWludGVybGFjZUZpZWxkICogaGlzdG9yeSwgZ3VpbnQgaGlzdG9yeV9jb3VudCwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0ZnJhbWUsIGludCBjdXJfZmllbGRfaWR4KQoreworICBHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUggKnNlbGYgPSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0dSRUVEWV9IIChtZXRob2QpOworICBHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUhDbGFzcyAqa2xhc3MgPQorICAgICAgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9HUkVFRFlfSF9HRVRfQ0xBU1MgKHNlbGYpOworICBnaW50IEluZm9Jc09kZCA9IDA7CisgIGdpbnQgTGluZTsKKyAgZ2ludCBSb3dTdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKG91dGZyYW1lLCAwKTsKKyAgZ2ludCBGaWVsZEhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKG91dGZyYW1lKSAvIDI7CisgIGdpbnQgUGl0Y2ggPSBSb3dTdHJpZGUgKiAyOworICBjb25zdCBndWludDggKkwxOyAgICAgICAgICAgICAvLyBwdHIgdG8gTGluZTEsIG9mIDMKKyAgY29uc3QgZ3VpbnQ4ICpMMjsgICAgICAgICAgICAgLy8gcHRyIHRvIExpbmUyLCB0aGUgd2VhdmUgbGluZQorICBjb25zdCBndWludDggKkwzOyAgICAgICAgICAgICAvLyBwdHIgdG8gTGluZTMKKyAgY29uc3QgZ3VpbnQ4ICpMMlA7ICAgICAgICAgICAgLy8gcHRyIHRvIHByZXYgTGluZTIKKyAgZ3VpbnQ4ICpEZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAob3V0ZnJhbWUsIDApOworICBTY2FubGluZUZ1bmN0aW9uIHNjYW5saW5lOworCisgIGlmIChjdXJfZmllbGRfaWR4ICsgMiA+IGhpc3RvcnlfY291bnQgfHwgY3VyX2ZpZWxkX2lkeCA8IDEpIHsKKyAgICBHc3REZWludGVybGFjZU1ldGhvZCAqYmFja3VwX21ldGhvZDsKKworICAgIGJhY2t1cF9tZXRob2QgPSBnX29iamVjdF9uZXcgKGdzdF9kZWludGVybGFjZV9tZXRob2RfbGluZWFyX2dldF90eXBlICgpLAorICAgICAgICBOVUxMKTsKKworICAgIGdzdF9kZWludGVybGFjZV9tZXRob2Rfc2V0dXAgKGJhY2t1cF9tZXRob2QsIG1ldGhvZC0+dmluZm8pOworICAgIGdzdF9kZWludGVybGFjZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWUgKGJhY2t1cF9tZXRob2QsCisgICAgICAgIGhpc3RvcnksIGhpc3RvcnlfY291bnQsIG91dGZyYW1lLCBjdXJfZmllbGRfaWR4KTsKKworICAgIGdfb2JqZWN0X3VucmVmIChiYWNrdXBfbWV0aG9kKTsKKyAgICByZXR1cm47CisgIH0KKworICBjdXJfZmllbGRfaWR4ICs9IDI7CisKKyAgc3dpdGNoIChHU1RfVklERU9fSU5GT19GT1JNQVQgKG1ldGhvZC0+dmluZm8pKSB7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lVWTI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWWVU6CisgICAgICBzY2FubGluZSA9IGtsYXNzLT5zY2FubGluZV95dXkyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICBzY2FubGluZSA9IGtsYXNzLT5zY2FubGluZV91eXZ5OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FZVVY6CisgICAgICBzY2FubGluZSA9IGtsYXNzLT5zY2FubGluZV9heXV2OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgcmV0dXJuOworICB9CisKKyAgLy8gY29weSBmaXJzdCBldmVuIGxpbmUgbm8gbWF0dGVyIHdoYXQsIGFuZCB0aGUgZmlyc3Qgb2RkIGxpbmUgaWYgd2UncmUKKyAgLy8gcHJvY2Vzc2luZyBhbiBFVkVOIGZpZWxkLiAobm90ZSBkaWZmIGZyb20gb3RoZXIgZGVpbnQgcnRucy4pCisKKyAgaWYgKGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCAtIDFdLmZsYWdzID09IFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pIHsKKyAgICBJbmZvSXNPZGQgPSAxOworCisgICAgTDEgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChoaXN0b3J5W2N1cl9maWVsZF9pZHggLSAyXS5mcmFtZSwgMCk7CisgICAgaWYgKGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCAtIDJdLmZsYWdzICYgUElDVFVSRV9JTlRFUkxBQ0VEX0JPVFRPTSkKKyAgICAgIEwxICs9IFJvd1N0cmlkZTsKKworICAgIEwyID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoaGlzdG9yeVtjdXJfZmllbGRfaWR4IC0gMV0uZnJhbWUsIDApOworICAgIGlmIChoaXN0b3J5W2N1cl9maWVsZF9pZHggLSAxXS5mbGFncyAmIFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pCisgICAgICBMMiArPSBSb3dTdHJpZGU7CisKKyAgICBMMyA9IEwxICsgUGl0Y2g7CisgICAgTDJQID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoaGlzdG9yeVtjdXJfZmllbGRfaWR4IC0gM10uZnJhbWUsIDApOworICAgIGlmIChoaXN0b3J5W2N1cl9maWVsZF9pZHggLSAzXS5mbGFncyAmIFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pCisgICAgICBMMlAgKz0gUm93U3RyaWRlOworCisgICAgLy8gY29weSBmaXJzdCBldmVuIGxpbmUKKyAgICBtZW1jcHkgKERlc3QsIEwxLCBSb3dTdHJpZGUpOworICAgIERlc3QgKz0gUm93U3RyaWRlOworICB9IGVsc2UgeworICAgIEluZm9Jc09kZCA9IDA7CisgICAgTDEgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChoaXN0b3J5W2N1cl9maWVsZF9pZHggLSAyXS5mcmFtZSwgMCk7CisgICAgaWYgKGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCAtIDJdLmZsYWdzICYgUElDVFVSRV9JTlRFUkxBQ0VEX0JPVFRPTSkKKyAgICAgIEwxICs9IFJvd1N0cmlkZTsKKworICAgIEwyID0gKGd1aW50OCAqKSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChoaXN0b3J5W2N1cl9maWVsZF9pZHggLQorICAgICAgICAgICAgMV0uZnJhbWUsIDApICsgUGl0Y2g7CisgICAgaWYgKGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCAtIDFdLmZsYWdzICYgUElDVFVSRV9JTlRFUkxBQ0VEX0JPVFRPTSkKKyAgICAgIEwyICs9IFJvd1N0cmlkZTsKKworICAgIEwzID0gTDEgKyBQaXRjaDsKKyAgICBMMlAgPQorICAgICAgICAoZ3VpbnQ4ICopIEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCAtIDNdLmZyYW1lLAorICAgICAgICAwKSArIFBpdGNoOworICAgIGlmIChoaXN0b3J5W2N1cl9maWVsZF9pZHggLSAzXS5mbGFncyAmIFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pCisgICAgICBMMlAgKz0gUm93U3RyaWRlOworCisgICAgLy8gY29weSBmaXJzdCBldmVuIGxpbmUKKyAgICBtZW1jcHkgKERlc3QsIEwxLCBSb3dTdHJpZGUpOworICAgIERlc3QgKz0gUm93U3RyaWRlOworICAgIC8vIHRoZW4gZmlyc3Qgb2RkIGxpbmUKKyAgICBtZW1jcHkgKERlc3QsIEwxLCBSb3dTdHJpZGUpOworICAgIERlc3QgKz0gUm93U3RyaWRlOworICB9CisKKyAgZm9yIChMaW5lID0gMDsgTGluZSA8IChGaWVsZEhlaWdodCAtIDEpOyArK0xpbmUpIHsKKyAgICBzY2FubGluZSAoc2VsZiwgTDEsIEwyLCBMMywgTDJQLCBEZXN0LCBSb3dTdHJpZGUpOworICAgIERlc3QgKz0gUm93U3RyaWRlOworICAgIG1lbWNweSAoRGVzdCwgTDMsIFJvd1N0cmlkZSk7CisgICAgRGVzdCArPSBSb3dTdHJpZGU7CisKKyAgICBMMSArPSBQaXRjaDsKKyAgICBMMiArPSBQaXRjaDsKKyAgICBMMyArPSBQaXRjaDsKKyAgICBMMlAgKz0gUGl0Y2g7CisgIH0KKworICBpZiAoSW5mb0lzT2RkKSB7CisgICAgbWVtY3B5IChEZXN0LCBMMiwgUm93U3RyaWRlKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5aF9wbGFuYXJfcGxhbmUgKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SCAqIHNlbGYsCisgICAgY29uc3QgZ3VpbnQ4ICogTDEsIGNvbnN0IGd1aW50OCAqIEwyLCBjb25zdCBndWludDggKiBMMywgY29uc3QgZ3VpbnQ4ICogTDJQLAorICAgIGd1aW50OCAqIERlc3QsIGdpbnQgUm93U3RyaWRlLCBnaW50IEZpZWxkSGVpZ2h0LCBnaW50IFBpdGNoLCBnaW50IEluZm9Jc09kZCwKKyAgICBTY2FubGluZUZ1bmN0aW9uIHNjYW5saW5lKQoreworICBnaW50IExpbmU7CisKKyAgLy8gY29weSBmaXJzdCBldmVuIGxpbmUgbm8gbWF0dGVyIHdoYXQsIGFuZCB0aGUgZmlyc3Qgb2RkIGxpbmUgaWYgd2UncmUKKyAgLy8gcHJvY2Vzc2luZyBhbiBFVkVOIGZpZWxkLiAobm90ZSBkaWZmIGZyb20gb3RoZXIgZGVpbnQgcnRucy4pCisKKyAgaWYgKEluZm9Jc09kZCkgeworICAgIC8vIGNvcHkgZmlyc3QgZXZlbiBsaW5lCisgICAgbWVtY3B5IChEZXN0LCBMMSwgUm93U3RyaWRlKTsKKyAgICBEZXN0ICs9IFJvd1N0cmlkZTsKKyAgfSBlbHNlIHsKKyAgICAvLyBjb3B5IGZpcnN0IGV2ZW4gbGluZQorICAgIG1lbWNweSAoRGVzdCwgTDEsIFJvd1N0cmlkZSk7CisgICAgRGVzdCArPSBSb3dTdHJpZGU7CisgICAgLy8gdGhlbiBmaXJzdCBvZGQgbGluZQorICAgIG1lbWNweSAoRGVzdCwgTDEsIFJvd1N0cmlkZSk7CisgICAgRGVzdCArPSBSb3dTdHJpZGU7CisgIH0KKworICBmb3IgKExpbmUgPSAwOyBMaW5lIDwgKEZpZWxkSGVpZ2h0IC0gMSk7ICsrTGluZSkgeworICAgIHNjYW5saW5lIChzZWxmLCBMMSwgTDIsIEwzLCBMMlAsIERlc3QsIFJvd1N0cmlkZSk7CisgICAgRGVzdCArPSBSb3dTdHJpZGU7CisgICAgbWVtY3B5IChEZXN0LCBMMywgUm93U3RyaWRlKTsKKyAgICBEZXN0ICs9IFJvd1N0cmlkZTsKKworICAgIEwxICs9IFBpdGNoOworICAgIEwyICs9IFBpdGNoOworICAgIEwzICs9IFBpdGNoOworICAgIEwyUCArPSBQaXRjaDsKKyAgfQorCisgIGlmIChJbmZvSXNPZGQpIHsKKyAgICBtZW1jcHkgKERlc3QsIEwyLCBSb3dTdHJpZGUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9mcmFtZV9kaV9ncmVlZHloX3BsYW5hciAoR3N0RGVpbnRlcmxhY2VNZXRob2QgKiBtZXRob2QsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VGaWVsZCAqIGhpc3RvcnksIGd1aW50IGhpc3RvcnlfY291bnQsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dGZyYW1lLCBpbnQgY3VyX2ZpZWxkX2lkeCkKK3sKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RHcmVlZHlIICpzZWxmID0gR1NUX0RFSU5URVJMQUNFX01FVEhPRF9HUkVFRFlfSCAobWV0aG9kKTsKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RHcmVlZHlIQ2xhc3MgKmtsYXNzID0KKyAgICAgIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0hfR0VUX0NMQVNTIChzZWxmKTsKKyAgZ2ludCBJbmZvSXNPZGQ7CisgIGdpbnQgUm93U3RyaWRlOworICBnaW50IEZpZWxkSGVpZ2h0OworICBnaW50IFBpdGNoOworICBjb25zdCBndWludDggKkwxOyAgICAgICAgICAgICAvLyBwdHIgdG8gTGluZTEsIG9mIDMKKyAgY29uc3QgZ3VpbnQ4ICpMMjsgICAgICAgICAgICAgLy8gcHRyIHRvIExpbmUyLCB0aGUgd2VhdmUgbGluZQorICBjb25zdCBndWludDggKkwzOyAgICAgICAgICAgICAvLyBwdHIgdG8gTGluZTMKKyAgY29uc3QgZ3VpbnQ4ICpMMlA7ICAgICAgICAgICAgLy8gcHRyIHRvIHByZXYgTGluZTIKKyAgZ3VpbnQ4ICpEZXN0OworICBnaW50IGk7CisgIFNjYW5saW5lRnVuY3Rpb24gc2NhbmxpbmU7CisKKyAgaWYgKGN1cl9maWVsZF9pZHggKyAyID4gaGlzdG9yeV9jb3VudCB8fCBjdXJfZmllbGRfaWR4IDwgMSkgeworICAgIEdzdERlaW50ZXJsYWNlTWV0aG9kICpiYWNrdXBfbWV0aG9kOworCisgICAgYmFja3VwX21ldGhvZCA9IGdfb2JqZWN0X25ldyAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9saW5lYXJfZ2V0X3R5cGUgKCksCisgICAgICAgIE5VTEwpOworCisgICAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9zZXR1cCAoYmFja3VwX21ldGhvZCwgbWV0aG9kLT52aW5mbyk7CisgICAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9kZWludGVybGFjZV9mcmFtZSAoYmFja3VwX21ldGhvZCwKKyAgICAgICAgaGlzdG9yeSwgaGlzdG9yeV9jb3VudCwgb3V0ZnJhbWUsIGN1cl9maWVsZF9pZHgpOworCisgICAgZ19vYmplY3RfdW5yZWYgKGJhY2t1cF9tZXRob2QpOworICAgIHJldHVybjsKKyAgfQorCisgIGN1cl9maWVsZF9pZHggKz0gMjsKKworICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgSW5mb0lzT2RkID0gKGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCAtIDFdLmZsYWdzID09IFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pOworICAgIFJvd1N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAob3V0ZnJhbWUsIGkpOworICAgIEZpZWxkSGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChvdXRmcmFtZSwgaSkgLyAyOworICAgIFBpdGNoID0gUm93U3RyaWRlICogMjsKKworICAgIGlmIChpID09IDApCisgICAgICBzY2FubGluZSA9IGtsYXNzLT5zY2FubGluZV9wbGFuYXJfeTsKKyAgICBlbHNlCisgICAgICBzY2FubGluZSA9IGtsYXNzLT5zY2FubGluZV9wbGFuYXJfdXY7CisKKyAgICBEZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAob3V0ZnJhbWUsIGkpOworCisgICAgTDEgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChoaXN0b3J5W2N1cl9maWVsZF9pZHggLSAyXS5mcmFtZSwgaSk7CisgICAgaWYgKGhpc3RvcnlbY3VyX2ZpZWxkX2lkeCAtIDJdLmZsYWdzICYgUElDVFVSRV9JTlRFUkxBQ0VEX0JPVFRPTSkKKyAgICAgIEwxICs9IFJvd1N0cmlkZTsKKworICAgIEwyID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoaGlzdG9yeVtjdXJfZmllbGRfaWR4IC0gMV0uZnJhbWUsIGkpOworICAgIGlmIChoaXN0b3J5W2N1cl9maWVsZF9pZHggLSAxXS5mbGFncyAmIFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pCisgICAgICBMMiArPSBSb3dTdHJpZGU7CisKKyAgICBMMyA9IEwxICsgUGl0Y2g7CisgICAgTDJQID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoaGlzdG9yeVtjdXJfZmllbGRfaWR4IC0gM10uZnJhbWUsIGkpOworICAgIGlmIChoaXN0b3J5W2N1cl9maWVsZF9pZHggLSAzXS5mbGFncyAmIFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pCisgICAgICBMMlAgKz0gUm93U3RyaWRlOworCisgICAgZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5aF9wbGFuYXJfcGxhbmUgKHNlbGYsIEwxLCBMMiwgTDMsIEwyUCwgRGVzdCwKKyAgICAgICAgUm93U3RyaWRlLCBGaWVsZEhlaWdodCwgUGl0Y2gsIEluZm9Jc09kZCwgc2NhbmxpbmUpOworICB9Cit9CisKK0dfREVGSU5FX1RZUEUgKEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SCwgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfaCwKKyAgICBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0QpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9NQVhfQ09NQiwKKyAgUFJPUF9NT1RJT05fVEhSRVNIT0xELAorICBQUk9QX01PVElPTl9TRU5TRQorfTsKKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2hfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SCAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0ggKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01BWF9DT01COgorICAgICAgc2VsZi0+bWF4X2NvbWIgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTU9USU9OX1RIUkVTSE9MRDoKKyAgICAgIHNlbGYtPm1vdGlvbl90aHJlc2hvbGQgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTU9USU9OX1NFTlNFOgorICAgICAgc2VsZi0+bW90aW9uX3NlbnNlID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2hfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kR3JlZWR5SCAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfR1JFRURZX0ggKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01BWF9DT01COgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNlbGYtPm1heF9jb21iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NT1RJT05fVEhSRVNIT0xEOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNlbGYtPm1vdGlvbl90aHJlc2hvbGQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01PVElPTl9TRU5TRToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzZWxmLT5tb3Rpb25fc2Vuc2UpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2hfY2xhc3NfaW5pdCAoR3N0RGVpbnRlcmxhY2VNZXRob2RHcmVlZHlIQ2xhc3MgKgorICAgIGtsYXNzKQoreworICBHc3REZWludGVybGFjZU1ldGhvZENsYXNzICpkaW1fY2xhc3MgPSAoR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqKSBrbGFzczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyNpZmRlZiBCVUlMRF9YODZfQVNNCisgIGd1aW50IGNwdV9mbGFncyA9CisgICAgICBvcmNfdGFyZ2V0X2dldF9kZWZhdWx0X2ZsYWdzIChvcmNfdGFyZ2V0X2dldF9ieV9uYW1lICgibW14IikpOworI2VuZGlmCisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfaF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2hfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX0NPTUIsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm1heC1jb21iIiwKKyAgICAgICAgICAiTWF4IGNvbWIiLAorICAgICAgICAgICJNYXggQ29tYiIsIDAsIDI1NSwgNSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKQorICAgICAgKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01PVElPTl9USFJFU0hPTEQsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm1vdGlvbi10aHJlc2hvbGQiLAorICAgICAgICAgICJNb3Rpb24gVGhyZXNob2xkIiwKKyAgICAgICAgICAiTW90aW9uIFRocmVzaG9sZCIsCisgICAgICAgICAgMCwgMjU1LCAyNSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKQorICAgICAgKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01PVElPTl9TRU5TRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibW90aW9uLXNlbnNlIiwKKyAgICAgICAgICAiTW90aW9uIFNlbnNlIiwKKyAgICAgICAgICAiTW90aW9uIFNlbnNlIiwKKyAgICAgICAgICAwLCAyNTUsIDMwLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpCisgICAgICApOworCisgIGRpbV9jbGFzcy0+ZmllbGRzX3JlcXVpcmVkID0gNDsKKyAgZGltX2NsYXNzLT5uYW1lID0gIk1vdGlvbiBBZGFwdGl2ZTogQWR2YW5jZWQgRGV0ZWN0aW9uIjsKKyAgZGltX2NsYXNzLT5uaWNrID0gImdyZWVkeWgiOworICBkaW1fY2xhc3MtPmxhdGVuY3kgPSAxOworCisgIGRpbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfeXV5MiA9IGRlaW50ZXJsYWNlX2ZyYW1lX2RpX2dyZWVkeWhfcGFja2VkOworICBkaW1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l2eXUgPSBkZWludGVybGFjZV9mcmFtZV9kaV9ncmVlZHloX3BhY2tlZDsKKyAgZGltX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV91eXZ5ID0gZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5aF9wYWNrZWQ7CisgIGRpbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfYXl1diA9IGRlaW50ZXJsYWNlX2ZyYW1lX2RpX2dyZWVkeWhfcGFja2VkOworICBkaW1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3k0NDQgPSBkZWludGVybGFjZV9mcmFtZV9kaV9ncmVlZHloX3BsYW5hcjsKKyAgZGltX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV9pNDIwID0gZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5aF9wbGFuYXI7CisgIGRpbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfeXYxMiA9IGRlaW50ZXJsYWNlX2ZyYW1lX2RpX2dyZWVkeWhfcGxhbmFyOworICBkaW1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3k0MmIgPSBkZWludGVybGFjZV9mcmFtZV9kaV9ncmVlZHloX3BsYW5hcjsKKyAgZGltX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV95NDFiID0gZGVpbnRlcmxhY2VfZnJhbWVfZGlfZ3JlZWR5aF9wbGFuYXI7CisKKyNpZmRlZiBCVUlMRF9YODZfQVNNCisgIGlmIChjcHVfZmxhZ3MgJiBPUkNfVEFSR0VUX01NWF9NTVhFWFQpIHsKKyAgICBrbGFzcy0+c2NhbmxpbmVfeXV5MiA9IGdyZWVkeWhfc2NhbmxpbmVfTU1YRVhUX3l1eTI7CisgICAga2xhc3MtPnNjYW5saW5lX3V5dnkgPSBncmVlZHloX3NjYW5saW5lX01NWEVYVF91eXZ5OworICB9IGVsc2UgaWYgKGNwdV9mbGFncyAmIE9SQ19UQVJHRVRfTU1YXzNETk9XKSB7CisgICAga2xhc3MtPnNjYW5saW5lX3l1eTIgPSBncmVlZHloX3NjYW5saW5lXzNETk9XX3l1eTI7CisgICAga2xhc3MtPnNjYW5saW5lX3V5dnkgPSBncmVlZHloX3NjYW5saW5lXzNETk9XX3V5dnk7CisgIH0gZWxzZSBpZiAoY3B1X2ZsYWdzICYgT1JDX1RBUkdFVF9NTVhfTU1YKSB7CisgICAga2xhc3MtPnNjYW5saW5lX3l1eTIgPSBncmVlZHloX3NjYW5saW5lX01NWF95dXkyOworICAgIGtsYXNzLT5zY2FubGluZV91eXZ5ID0gZ3JlZWR5aF9zY2FubGluZV9NTVhfdXl2eTsKKyAgfSBlbHNlIHsKKyAgICBrbGFzcy0+c2NhbmxpbmVfeXV5MiA9IGdyZWVkeWhfc2NhbmxpbmVfQ195dXkyOworICAgIGtsYXNzLT5zY2FubGluZV91eXZ5ID0gZ3JlZWR5aF9zY2FubGluZV9DX3V5dnk7CisgIH0KKyNlbHNlCisgIGtsYXNzLT5zY2FubGluZV95dXkyID0gZ3JlZWR5aF9zY2FubGluZV9DX3l1eTI7CisgIGtsYXNzLT5zY2FubGluZV91eXZ5ID0gZ3JlZWR5aF9zY2FubGluZV9DX3V5dnk7CisjZW5kaWYKKyAgLyogVE9ETzogTU1YIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIHR3byAqLworICBrbGFzcy0+c2NhbmxpbmVfYXl1diA9IGdyZWVkeWhfc2NhbmxpbmVfQ19heXV2OworICBrbGFzcy0+c2NhbmxpbmVfcGxhbmFyX3kgPSBncmVlZHloX3NjYW5saW5lX0NfcGxhbmFyX3k7CisgIGtsYXNzLT5zY2FubGluZV9wbGFuYXJfdXYgPSBncmVlZHloX3NjYW5saW5lX0NfcGxhbmFyX3V2OworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfaF9pbml0IChHc3REZWludGVybGFjZU1ldGhvZEdyZWVkeUggKiBzZWxmKQoreworICBzZWxmLT5tYXhfY29tYiA9IDU7CisgIHNlbGYtPm1vdGlvbl90aHJlc2hvbGQgPSAyNTsKKyAgc2VsZi0+bW90aW9uX3NlbnNlID0gMzA7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWhtYWNyb3MuaCBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvZ3JlZWR5aG1hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZWFmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2dyZWVkeWhtYWNyb3MuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgVG9tIEJhcnJ5ICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBSZWxpY2Vuc2VkIGZvciBHU3RyZWFtZXIgZnJvbSBHUEwgdG8gTEdQTCB3aXRoIHBlcm1pdCBmcm9tIFRvbSBCYXJyeS4KKyAqIFNlZTogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNTc4CisgKi8KKworLy8gRGVmaW5lIGEgZmV3IG1hY3JvcyBmb3IgQ1BVIGRlcGVuZGVudCBpbnN0cnVjdGlvbnMuIAorLy8gSSBzdXNwZWN0IEkgZG9uJ3QgcmVhbGx5IHVuZGVyc3RhbmQgaG93IHRoZSBDIG1hY3JvIHByZXByb2Nlc3NvciB3b3JrcyBidXQKKy8vIHRoaXMgc2VlbXMgdG8gZ2V0IHRoZSBqb2IgZG9uZS4gICAgICAgICAgLy8gVFJCIDcvMDEKKworLy8gQkVGT1JFIFVTSU5HIFRIRVNFIFlPVSBNVVNUIFNFVDoKKworLy8gI2RlZmluZSBTSU1EX1RZUEUgTU1YRVhUICAgICAgICAgICAgKG9yIE1NWCBvciAzRE5PVykKKworLy8gc29tZSBtYWNyb3MgZm9yIHBhdmdiIGluc3RydWN0aW9uCisvLyAgICAgIFZfUEFWR0IobW1yMSwgbW1yMiwgbW1yIHdvcmsgcmVnaXN0ZXIsIHNtYXNrKSBtbXIyIG1heSA9IG1tcncgaWYgeW91IGNhbiB0cmFzaCBpdAorCisjZGVmaW5lIFZfUEFWR0JfTU1YKG1tcjEsIG1tcjIsIG1tcncsIHNtYXNrKSBcCisJIm1vdnEgICAgIm1tcjIiLCAgIm1tcnciXG5cdCIgICAgICAgICAgICBcCisJInBhbmQgICAgInNtYXNrIiwgIm1tcnciXG5cdCIgICAgICAgICAgICBcCisJInBzcmx3ICAgJDEsICAgICAgIm1tcnciXG5cdCIgICAgICAgICAgICBcCisJInBhbmQgICAgInNtYXNrIiwgIm1tcjEiXG5cdCIgICAgICAgICAgICBcCisJInBzcmx3ICAgJDEsICAgICAgIm1tcjEiXG5cdCIgICAgICAgICAgICBcCisJInBhZGR1c2IgIm1tcnciLCAgIm1tcjEiXG5cdCIKKyNkZWZpbmUgVl9QQVZHQl9NTVhFWFQobW1yMSwgbW1yMiwgbW1ydywgc21hc2spICAgICAgInBhdmdiICAgIm1tcjIiLCAibW1yMSJcblx0IgorI2RlZmluZSBWX1BBVkdCXzNETk9XKG1tcjEsIG1tcjIsIG1tcncsIHNtYXNrKSAgICAicGF2Z3VzYiAibW1yMiIsICJtbXIxIlxuXHQiCisjZGVmaW5lIFZfUEFWR0IobW1yMSwgbW1yMiwgbW1ydywgc21hc2spICAgICAgICAgIFZfUEFWR0IyKG1tcjEsIG1tcjIsIG1tcncsIHNtYXNrLCBTSU1EX1RZUEUpIAorI2RlZmluZSBWX1BBVkdCMihtbXIxLCBtbXIyLCBtbXJ3LCBzbWFzaywgc2ltZF90eXBlKSBWX1BBVkdCMyhtbXIxLCBtbXIyLCBtbXJ3LCBzbWFzaywgc2ltZF90eXBlKSAKKyNkZWZpbmUgVl9QQVZHQjMobW1yMSwgbW1yMiwgbW1ydywgc21hc2ssIHNpbWRfdHlwZSkgVl9QQVZHQl8jI3NpbWRfdHlwZShtbXIxLCBtbXIyLCBtbXJ3LCBzbWFzaykgCisKKy8vIHNvbWUgbWFjcm9zIGZvciBwbWF4dWIgaW5zdHJ1Y3Rpb24KKyNkZWZpbmUgVl9QTUFYVUJfTU1YKG1tcjEsIG1tcjIpIFwKKyAgICAicHN1YnVzYiAibW1yMiIsICJtbXIxIlxuXHQiIFwKKyAgICAicGFkZHVzYiAibW1yMiIsICJtbXIxIlxuXHQiCisjZGVmaW5lIFZfUE1BWFVCX01NWEVYVChtbXIxLCBtbXIyKSAgICAgICJwbWF4dWIgIm1tcjIiLCAibW1yMSJcblx0IgorI2RlZmluZSBWX1BNQVhVQl8zRE5PVyhtbXIxLCBtbXIyKSAgICBWX1BNQVhVQl9NTVgobW1yMSwgbW1yMikgIC8vIHVzZSBNTVggdmVyc2lvbgorI2RlZmluZSBWX1BNQVhVQihtbXIxLCBtbXIyKSAgICAgICAgICBWX1BNQVhVQjIobW1yMSwgbW1yMiwgU0lNRF9UWVBFKSAKKyNkZWZpbmUgVl9QTUFYVUIyKG1tcjEsIG1tcjIsIHNpbWRfdHlwZSkgVl9QTUFYVUIzKG1tcjEsIG1tcjIsIHNpbWRfdHlwZSkgCisjZGVmaW5lIFZfUE1BWFVCMyhtbXIxLCBtbXIyLCBzaW1kX3R5cGUpIFZfUE1BWFVCXyMjc2ltZF90eXBlKG1tcjEsIG1tcjIpIAorCisvLyBzb21lIG1hY3JvcyBmb3IgcG1pbnViIGluc3RydWN0aW9uCisvLyAgICAgIFZfUE1JTlVCKG1tcjEsIG1tcjIsIG1tciB3b3JrIHJlZ2lzdGVyKSAgICAgbW1yMiBtYXkgTk9UID0gbW1ydworI2RlZmluZSBWX1BNSU5VQl9NTVgobW1yMSwgbW1yMiwgbW1ydykgXAorICAgICJwY21wZXFiICJtbXJ3IiwgIm1tcnciXG5cdCIgICAgICAgXAorICAgICJwc3VidXNiICJtbXIyIiwgIm1tcnciXG5cdCIgICAgICAgXAorICAgICJwYWRkdXNiICJtbXJ3IiwgIm1tcjEiXG5cdCIgICAgICAgXAorICAgICJwc3VidXNiICJtbXJ3IiwgIm1tcjEiXG5cdCIKKyNkZWZpbmUgVl9QTUlOVUJfTU1YRVhUKG1tcjEsIG1tcjIsIG1tcncpICAgICAgInBtaW51YiAibW1yMiIsICJtbXIxIlxuXHQiCisjZGVmaW5lIFZfUE1JTlVCXzNETk9XKG1tcjEsIG1tcjIsIG1tcncpICAgIFZfUE1JTlVCX01NWChtbXIxLCBtbXIyLCBtbXJ3KSAgLy8gdXNlIE1NWCB2ZXJzaW9uCisjZGVmaW5lIFZfUE1JTlVCKG1tcjEsIG1tcjIsIG1tcncpICAgICAgICAgIFZfUE1JTlVCMihtbXIxLCBtbXIyLCBtbXJ3LCBTSU1EX1RZUEUpIAorI2RlZmluZSBWX1BNSU5VQjIobW1yMSwgbW1yMiwgbW1ydywgc2ltZF90eXBlKSBWX1BNSU5VQjMobW1yMSwgbW1yMiwgbW1ydywgc2ltZF90eXBlKSAKKyNkZWZpbmUgVl9QTUlOVUIzKG1tcjEsIG1tcjIsIG1tcncsIHNpbWRfdHlwZSkgVl9QTUlOVUJfIyNzaW1kX3R5cGUobW1yMSwgbW1yMiwgbW1ydykgCisKKy8vIHNvbWUgbWFjcm9zIGZvciBtb3ZudHEgaW5zdHJ1Y3Rpb24KKy8vICAgICAgVl9NT1ZOVFEobW1yMSwgbW1yMikgCisjZGVmaW5lIFZfTU9WTlRRX01NWChtbXIxLCBtbXIyKSAgICAgICJtb3ZxICAgIm1tcjIiLCAibW1yMSJcblx0IgorI2RlZmluZSBWX01PVk5UUV8zRE5PVyhtbXIxLCBtbXIyKSAgICAibW92cSAgICJtbXIyIiwgIm1tcjEiXG5cdCIKKyNkZWZpbmUgVl9NT1ZOVFFfTU1YRVhUKG1tcjEsIG1tcjIpICAgICAgIm1vdm50cSAibW1yMiIsICJtbXIxIlxuXHQiCisjZGVmaW5lIFZfTU9WTlRRKG1tcjEsIG1tcjIpICAgICAgICAgIFZfTU9WTlRRMihtbXIxLCBtbXIyLCBTSU1EX1RZUEUpIAorI2RlZmluZSBWX01PVk5UUTIobW1yMSwgbW1yMiwgc2ltZF90eXBlKSBWX01PVk5UUTMobW1yMSwgbW1yMiwgc2ltZF90eXBlKSAKKyNkZWZpbmUgVl9NT1ZOVFEzKG1tcjEsIG1tcjIsIHNpbWRfdHlwZSkgVl9NT1ZOVFFfIyNzaW1kX3R5cGUobW1yMSwgbW1yMikKKworLy8gZW5kIG9mIG1hY3JvcworCmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL2xpbmVhci5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzQ1MzUzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXIuYwpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBCaWxseSBCaWdncyA8dmVrdG9yQGR1bWJ0ZXJtLm5ldD4uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0Bjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIFJlbGljZW5zZWQgZm9yIEdTdHJlYW1lciBmcm9tIEdQTCB0byBMR1BMIHdpdGggcGVybWl0IGZyb20gQmlsbHkgQmlnZ3MuCisgKiBTZWU6IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTE2MzU3OAorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RkZWludGVybGFjZW1ldGhvZC5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEhBVkVfT1JDCisjaW5jbHVkZSA8b3JjL29yYy5oPgorI2VuZGlmCisjaW5jbHVkZSAidHZ0aW1lLmgiCisKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX0xJTkVBUgkoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9saW5lYXJfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9JU19ERUlOVEVSTEFDRV9NRVRIT0RfTElORUFSKG9iaikJCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9MSU5FQVIpKQorI2RlZmluZSBHU1RfSVNfREVJTlRFUkxBQ0VfTUVUSE9EX0xJTkVBUl9DTEFTUyhrbGFzcykJKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfTElORUFSKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9MSU5FQVJfR0VUX0NMQVNTKG9iaikJKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfTElORUFSLCBHc3REZWludGVybGFjZU1ldGhvZExpbmVhckNsYXNzKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9MSU5FQVIob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX0xJTkVBUiwgR3N0RGVpbnRlcmxhY2VNZXRob2RMaW5lYXIpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX0xJTkVBUl9DTEFTUyhrbGFzcykJKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfTElORUFSLCBHc3REZWludGVybGFjZU1ldGhvZExpbmVhckNsYXNzKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9MSU5FQVJfQ0FTVChvYmopCSgoR3N0RGVpbnRlcmxhY2VNZXRob2RMaW5lYXIqKShvYmopKQorCitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9nZXRfdHlwZSAodm9pZCk7CisKK3R5cGVkZWYgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgR3N0RGVpbnRlcmxhY2VNZXRob2RMaW5lYXI7Cit0eXBlZGVmIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgR3N0RGVpbnRlcmxhY2VNZXRob2RMaW5lYXJDbGFzczsKKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9jIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBndWludDggKiBzMSwgY29uc3QgZ3VpbnQ4ICogczIsIGdpbnQgc2l6ZSkKK3sKKyAgZGVpbnRlcmxhY2VfbGluZV9saW5lYXIgKG91dCwgczEsIHMyLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wYWNrZWRfYyAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9jIChzZWxmLCBvdXQsIHNjYW5saW5lcy0+dDAsIHNjYW5saW5lcy0+YjAsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX3BsYW5hcl95X2MgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYyAoc2VsZiwgb3V0LCBzY2FubGluZXMtPnQwLCBzY2FubGluZXMtPmIwLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wbGFuYXJfdV9jIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2MgKHNlbGYsIG91dCwgc2NhbmxpbmVzLT50MCwgc2NhbmxpbmVzLT5iMCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfcGxhbmFyX3ZfYyAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9jIChzZWxmLCBvdXQsIHNjYW5saW5lcy0+dDAsIHNjYW5saW5lcy0+YjAsIHNpemUpOworfQorCitHX0RFRklORV9UWVBFIChHc3REZWludGVybGFjZU1ldGhvZExpbmVhciwgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9saW5lYXIsCisgICAgR1NUX1RZUEVfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9jbGFzc19pbml0IChHc3REZWludGVybGFjZU1ldGhvZExpbmVhckNsYXNzICoKKyAgICBrbGFzcykKK3sKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqZGltX2NsYXNzID0gKEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKikga2xhc3M7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgKmRpc21fY2xhc3MgPQorICAgICAgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgKikga2xhc3M7CisKKyAgZGltX2NsYXNzLT5maWVsZHNfcmVxdWlyZWQgPSAxOworICBkaW1fY2xhc3MtPm5hbWUgPSAiVGVsZXZpc2lvbjogRnVsbCByZXNvbHV0aW9uIjsKKyAgZGltX2NsYXNzLT5uaWNrID0gImxpbmVhciI7CisgIGRpbV9jbGFzcy0+bGF0ZW5jeSA9IDA7CisKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXV5MiA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXZ5dSA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfdXl2eSA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYXl1diA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYXJnYiA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYWJnciA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiYSA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyYSA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3IgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MTIgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MjEgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl95ID0KKyAgICAgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9wbGFuYXJfeV9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdSA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfcGxhbmFyX3VfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3YgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX3BsYW5hcl92X2M7CisKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2RfbGluZWFyX2luaXQgKEdzdERlaW50ZXJsYWNlTWV0aG9kTGluZWFyICogc2VsZikKK3sKK30KZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvbGluZWFyYmxlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGU0YTBiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9saW5lYXJibGVuZC5jCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogTGluZWFyIGJsZW5kIGRlaW50ZXJsYWNpbmcgcGx1Z2luLiAgVGhlIGlkZWEgZm9yIHRoaXMgYWxnb3JpdGhtIGNhbWUKKyAqIGZyb20gdGhlIGxpbmVhciBibGVuZCBkZWludGVybGFjZXIgd2hpY2ggb3JpZ2luYXRlZCBpbiB0aGUgbXBsYXllcgorICogc291cmNlcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgQmlsbHkgQmlnZ3MgPHZla3RvckBkdW1idGVybS5uZXQ+LgorICogQ29weXJpZ2h0IChDKSAyMDA4LDIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBSZWxpY2Vuc2VkIGZvciBHU3RyZWFtZXIgZnJvbSBHUEwgdG8gTEdQTCB3aXRoIHBlcm1pdCBmcm9tIEJpbGx5IEJpZ2dzLgorICogU2VlOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM1NzgKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX09SQworI2luY2x1ZGUgPG9yYy9vcmMuaD4KKyNlbmRpZgorI2luY2x1ZGUgInR2dGltZS5oIgorCisjZGVmaW5lIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9MSU5FQVJfQkxFTkQJKGdzdF9kZWludGVybGFjZV9tZXRob2RfbGluZWFyX2JsZW5kX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfSVNfREVJTlRFUkxBQ0VfTUVUSE9EX0xJTkVBUl9CTEVORChvYmopCQkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfTElORUFSX0JMRU5EKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9MSU5FQVJfQkxFTkRfQ0xBU1Moa2xhc3MpCShHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX0xJTkVBUl9CTEVORCkpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfTElORUFSX0JMRU5EX0dFVF9DTEFTUyhvYmopCShHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX0xJTkVBUl9CTEVORCwgR3N0RGVpbnRlcmxhY2VNZXRob2RMaW5lYXJCbGVuZENsYXNzKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9MSU5FQVJfQkxFTkQob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX0xJTkVBUl9CTEVORCwgR3N0RGVpbnRlcmxhY2VNZXRob2RMaW5lYXJCbGVuZCkpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfTElORUFSX0JMRU5EX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9MSU5FQVJfQkxFTkQsIEdzdERlaW50ZXJsYWNlTWV0aG9kTGluZWFyQmxlbmRDbGFzcykpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfTElORUFSX0JMRU5EX0NBU1Qob2JqKQkoKEdzdERlaW50ZXJsYWNlTWV0aG9kTGluZWFyQmxlbmQqKShvYmopKQorCitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9ibGVuZF9nZXRfdHlwZSAodm9pZCk7CisKK3R5cGVkZWYgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgR3N0RGVpbnRlcmxhY2VNZXRob2RMaW5lYXJCbGVuZDsKK3R5cGVkZWYgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RDbGFzcyBHc3REZWludGVybGFjZU1ldGhvZExpbmVhckJsZW5kQ2xhc3M7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kX2MgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IGd1aW50OCAqIHQwLCBjb25zdCBndWludDggKiBiMCwgY29uc3QgZ3VpbnQ4ICogbTEsCisgICAgZ2ludCBzaXplKQoreworICBpZiAobTEgPT0gTlVMTCkgeworICAgIGRlaW50ZXJsYWNlX2xpbmVfbGluZWFyIChvdXQsIHQwLCBiMCwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgZGVpbnRlcmxhY2VfbGluZV9saW5lYXJfYmxlbmQgKG91dCwgdDAsIGIwLCBtMSwgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZF9wYWNrZWRfYyAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZF9jIChzZWxmLCBvdXQsIHNjYW5saW5lcy0+dDAsIHNjYW5saW5lcy0+YjAsCisgICAgICBzY2FubGluZXMtPm0xLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZF9wbGFuYXJfeV9jIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kX2MgKHNlbGYsIG91dCwgc2NhbmxpbmVzLT50MCwgc2NhbmxpbmVzLT5iMCwKKyAgICAgIHNjYW5saW5lcy0+bTEsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kX3BsYW5hcl91X2MgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmRfYyAoc2VsZiwgb3V0LCBzY2FubGluZXMtPnQwLCBzY2FubGluZXMtPmIwLAorICAgICAgc2NhbmxpbmVzLT5tMSwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmRfcGxhbmFyX3ZfYyAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZF9jIChzZWxmLCBvdXQsIHNjYW5saW5lcy0+dDAsIHNjYW5saW5lcy0+YjAsCisgICAgICBzY2FubGluZXMtPm0xLCBzaXplKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX2MgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IGd1aW50OCAqIG0wLCBjb25zdCBndWludDggKiB0MSwgY29uc3QgZ3VpbnQ4ICogYjEsCisgICAgZ2ludCBzaXplKQoreworICBpZiAodDEgPT0gTlVMTCkgeworICAgIG1lbWNweSAob3V0LCBtMCwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgZGVpbnRlcmxhY2VfbGluZV9saW5lYXJfYmxlbmQgKG91dCwgdDEsIGIxLCBtMCwgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZDJfcGFja2VkX2MgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX2MgKHNlbGYsIG91dCwgc2NhbmxpbmVzLT5tMCwgc2NhbmxpbmVzLT50MSwKKyAgICAgIHNjYW5saW5lcy0+YjEsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kMl9wbGFuYXJfeV9jIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqCisgICAgc2VsZiwgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywKKyAgICBndWludCBzaXplKQoreworICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX2MgKHNlbGYsIG91dCwgc2NhbmxpbmVzLT5tMCwgc2NhbmxpbmVzLT50MSwKKyAgICAgIHNjYW5saW5lcy0+YjEsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kMl9wbGFuYXJfdV9jIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqCisgICAgc2VsZiwgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywKKyAgICBndWludCBzaXplKQoreworICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX2MgKHNlbGYsIG91dCwgc2NhbmxpbmVzLT5tMCwgc2NhbmxpbmVzLT50MSwKKyAgICAgIHNjYW5saW5lcy0+YjEsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kMl9wbGFuYXJfdl9jIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqCisgICAgc2VsZiwgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywKKyAgICBndWludCBzaXplKQoreworICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX2MgKHNlbGYsIG91dCwgc2NhbmxpbmVzLT5tMCwgc2NhbmxpbmVzLT50MSwKKyAgICAgIHNjYW5saW5lcy0+YjEsIHNpemUpOworfQorCitHX0RFRklORV9UWVBFIChHc3REZWludGVybGFjZU1ldGhvZExpbmVhckJsZW5kLAorICAgIGdzdF9kZWludGVybGFjZV9tZXRob2RfbGluZWFyX2JsZW5kLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EKTsKKworc3RhdGljIHZvaWQKKyAgICBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9ibGVuZF9jbGFzc19pbml0CisgICAgKEdzdERlaW50ZXJsYWNlTWV0aG9kTGluZWFyQmxlbmRDbGFzcyAqIGtsYXNzKQoreworICBHc3REZWludGVybGFjZU1ldGhvZENsYXNzICpkaW1fY2xhc3MgPSAoR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RDbGFzcyAqZGlzbV9jbGFzcyA9CisgICAgICAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RDbGFzcyAqKSBrbGFzczsKKworICBkaW1fY2xhc3MtPmZpZWxkc19yZXF1aXJlZCA9IDI7CisgIGRpbV9jbGFzcy0+bmFtZSA9ICJCbHVyOiBUZW1wb3JhbCI7CisgIGRpbV9jbGFzcy0+bmljayA9ICJsaW5lYXJibGVuZCI7CisgIGRpbV9jbGFzcy0+bGF0ZW5jeSA9IDE7CisKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXV5MiA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmRfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3l2eXUgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV91eXZ5ID0KKyAgICAgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZF9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYXl1diA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmRfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2FyZ2IgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9yZ2JhID0KKyAgICAgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZF9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYWJnciA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmRfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2JncmEgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9yZ2IgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3IgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9udjEyID0KKyAgICAgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZF9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYyMSA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmRfcGFja2VkX2M7CisKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3kgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kX3BsYW5hcl95X2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl91ID0KKyAgICAgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZF9wbGFuYXJfdV9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdiA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmRfcGxhbmFyX3ZfYzsKKworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3l1eTIgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3l2eXUgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3V5dnkgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2F5dXYgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2FyZ2IgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2FiZ3IgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3JnYmEgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2JncmEgPSBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3JnYiA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZDJfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfYmdyID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kMl9wYWNrZWRfYzsKKworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3BsYW5hcl95ID0KKyAgICAgIGRlaW50ZXJsYWNlX3NjYW5saW5lX2xpbmVhcl9ibGVuZDJfcGxhbmFyX3lfYzsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9wbGFuYXJfdSA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV9saW5lYXJfYmxlbmQyX3BsYW5hcl91X2M7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3YgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfbGluZWFyX2JsZW5kMl9wbGFuYXJfdl9jOworCit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9ibGVuZF9pbml0IChHc3REZWludGVybGFjZU1ldGhvZExpbmVhckJsZW5kICoKKyAgICBzZWxmKQoreworfQpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9tbXguaCBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvbW14LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBlNTgyYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvbW14LmgKQEAgLTAsMCArMSw3MjMgQEAKKy8qCW1teC5oCisKKwlNdWx0aU1lZGlhIGVYdGVuc2lvbnMgR0NDIGludGVyZmFjZSBsaWJyYXJ5IGZvciBJQTMyLgorCisJVG8gdXNlIHRoaXMgbGlicmFyeSwgc2ltcGx5IGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZQorCWFuZCBjb21waWxlIHdpdGggR0NDLiAgWW91IE1VU1QgaGF2ZSBpbmxpbmluZyBlbmFibGVkCisJaW4gb3JkZXIgZm9yIG1teF9vaygpIHRvIHdvcms7IHRoaXMgY2FuIGJlIGRvbmUgYnkKKwlzaW1wbHkgdXNpbmcgLU8gb24gdGhlIEdDQyBjb21tYW5kIGxpbmUuCisKKwlDb21waWxpbmcgd2l0aCAtRE1NWF9UUkFDRSB3aWxsIGNhdXNlIGRldGFpbGVkIHRyYWNlCisJb3V0cHV0IHRvIGJlIHNlbnQgdG8gc3RkZXJyIGZvciBlYWNoIG1teCBvcGVyYXRpb24uCisJVGhpcyBhZGRzIGxvdHMgb2YgY29kZSwgYW5kIG9idmlvdXNseSBzbG93cyBleGVjdXRpb24gdG8KKwlhIGNyYXdsLCBidXQgY2FuIGJlIHZlcnkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCisKKwlUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkKKwlFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCisJTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKwlBTkQgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworCTE5OTctOTggYnkgSC4gRGlldHogYW5kIFIuIEZpc2hlcgorCisgSGlzdG9yeToKKwk5Ny05OCoJUi5GaXNoZXIJRWFybHkgdmVyc2lvbnMKKwk5ODA1MDEJUi5GaXNoZXIJT3JpZ2luYWwgUmVsZWFzZQorCTk4MDYxMSoJSC5EaWV0egkJUmV3cml0ZSwgY29ycmVjdGx5IGltcGxlbWVudGluZyBpbmxpbmVzLCBhbmQKKwkJUi5GaXNoZXIJIGluY2x1ZGluZyBkaXJlY3QgcmVnaXN0ZXIgYWNjZXNzZXMuCisJOTgwNjE2CVIuRmlzaGVyCVJlbGVhc2Ugb2YgOTgwNjExIGFzIDk4MDYxNi4KKwk5ODA3MTQJUi5GaXNoZXIJTWlub3IgY29ycmVjdGlvbnMgdG8gTWFrZWZpbGUsIGV0Yy4KKwk5ODA3MTUJUi5GaXNoZXIJbW14X29rKCkgbm93IHByZXZlbnRzIG9wdGltaXplciBmcm9tIHVzaW5nCisJCQkJIGNsb2JiZXJlZCB2YWx1ZXMuCisJCQkJbW14X29rKCkgbm93IGNoZWNrcyBpZiBjcHVpZCBpbnN0cnVjdGlvbiBpcworCQkJCSBhdmFpbGFibGUgYmVmb3JlIHRyeWluZyB0byB1c2UgaXQuCisJOTgwNzI2KglSLkZpc2hlcgltbV9zdXBwb3J0KCkgc2VhcmNoZXMgZm9yIEFNRCAzRE5vdywgQ3lyaXgKKwkJCQkgRXh0ZW5kZWQgTU1YLCBhbmQgc3RhbmRhcmQgTU1YLiAgSXQgcmV0dXJucyBhCisJCQkJIHZhbHVlIHdoaWNoIGlzIHBvc2l0aXZlIGlmIGFueSBvZiB0aGVzZSBhcmUKKwkJCQkgc3VwcG9ydGVkLCBhbmQgY2FuIGJlIG1hc2tlZCB3aXRoIGNvbnN0YW50cyB0bworCQkJCSBzZWUgd2hpY2guICBtbXhfb2soKSBpcyBub3cgYSBjYWxsIHRvIHRoaXMKKwk5ODA3MjYqCVIuRmlzaGVyCUFkZGVkIGkyciBzdXBwb3J0IGZvciBzaGlmdCBmdW5jdGlvbnMKKwk5ODA5MTkJUi5GaXNoZXIJRml4ZWQgQU1EIGV4dGVuZGVkIGZlYXR1cmUgcmVjb2duaXRpb24gYnVnLgorCTk4MDkyMQlSLkZpc2hlcglBZGRlZCBkZWZpbml0aW9uL2NoZWNrIGZvciBfTU1YX0guCisJCQkJQWRkZWQgImZsb2F0IHNbMl0iIHRvIG1teF90IGZvciB1c2Ugd2l0aAorCQkJCSAgM0ROb3cgYW5kIEVNTVguICBTbyBzYW1lIG1teF90IGNhbiBiZSB1c2VkLgorCTk4MTAxMwlSLkZpc2hlcglGaXhlZCBjcHVpZCBmdW5jdGlvbiAxIGJ1ZyAobG9va2VkIGF0IHdyb25nIHJlZykKKwkJCQlGaXhlZCBwc2xscV9pMnIgZXJyb3IgaW4gbW14dGVzdC5jCisKKwkqIFVucmVsZWFzZWQgKGludGVybmFsIG9yIGludGVyaW0pIHZlcnNpb25zCisKKyBOb3RlczoKKwlJdCBhcHBlYXJzIHRoYXQgdGhlIGxhdGVzdCBnYXMgaGFzIHRoZSBwYW5kIHByb2JsZW0gZml4ZWQsIHRoZXJlZm9yZQorCSAgSSdsbCB1bmRlZmluZSBCUk9LRU5fUEFORCBieSBkZWZhdWx0LgorCVN0cmluZyBjb21wYXJlcyBtYXkgYmUgcXVpY2tlciB0aGFuIHRoZSBtdWx0aXBsZSB0ZXN0L2p1bXBzIGluIHZlbmRvcgorCSAgdGVzdCBzZXF1ZW5jZSBpbiBtbXhfb2soKSwgYnV0IEknbSBub3QgY29uY2VybmVkIHdpdGggdGhhdCByaWdodCBub3cuCisKKyBBY2tub3dsZWRnbWVudHM6CisJSnVzc2kgTGFha28gZm9yIHBvaW50aW5nIG91dCB0aGUgZXJyb3JzIHVsdGltYXRlbHkgZm91bmQgdG8gYmUKKwkgIGNvbm5lY3RlZCB0byB0aGUgZmFpbHVyZSB0byBub3RpZnkgdGhlIG9wdGltaXplciBvZiBjbG9iYmVyZWQgdmFsdWVzLgorCVJvZ2VyIEhhcmRpbWFuIGZvciByZW1pbmRpbmcgdXMgdGhhdCBDUFVJRCBpc24ndCBldmVyeXdoZXJlLCBhbmQgdGhhdAorCSAgc29tZW9uZSBtYXkgYWN0dWFsbHkgdHJ5IHRvIHVzZSB0aGlzIG9uIGEgbWFjaGluZSB3aXRob3V0IENQVUlELgorCSAgQWxzbyBmb3Igc3VnZ2VzdGluZyBjb2RlIGZvciBjaGVja2luZyB0aGlzLgorCVJvYmVydCBEYWxlIGZvciBwb2ludGluZyBvdXQgdGhlIEFNRCByZWNvZ25pdGlvbiBidWcuCisJSmltbXkgTWF5ZmllbGQgYW5kIENhcmwgV2l0dHkgZm9yIHBvaW50aW5nIG91dCB0aGUgSW50ZWwgcmVjb2duaXRpb24KKwkgIGJ1Zy4KKwlDYXJsIFdpdHR5IGZvciBwb2ludGluZyBvdXQgdGhlIHBzbGxxX2kyciB0ZXN0IGJ1Zy4KKyovCisKKyNpZm5kZWYgX01NWF9ICisjZGVmaW5lIF9NTVhfSAorCisvKiNkZWZpbmUgTU1YX1RSQUNFICovCisKKy8qCVdhcm5pbmc6ICBhdCB0aGlzIHdyaXRpbmcsIHRoZSB2ZXJzaW9uIG9mIEdBUyBwYWNrYWdlZAorCXdpdGggbW9zdCBMaW51eCBkaXN0cmlidXRpb25zIGRvZXMgbm90IGhhbmRsZSB0aGUKKwlwYXJhbGxlbCBBTkQgb3BlcmF0aW9uIG1uZW1vbmljIGNvcnJlY3RseS4gIElmIHRoZQorCXN5bWJvbCBCUk9LRU5fUEFORCBpcyBkZWZpbmVkLCBhIHNsb3dlciBhbHRlcm5hdGl2ZQorCWNvZGluZyB3aWxsIGJlIHVzZWQuICBJZiBleGVjdXRpb24gb2YgbW14dGVzdCByZXN1bHRzCisJaW4gYW4gaWxsZWdhbCBpbnN0cnVjdGlvbiBmYXVsdCwgZGVmaW5lIHRoaXMgc3ltYm9sLgorKi8KKyN1bmRlZglCUk9LRU5fUEFORAorCisKKy8qCVRoZSB0eXBlIG9mIGFuIHZhbHVlIHRoYXQgZml0cyBpbiBhbiBNTVggcmVnaXN0ZXIKKwkobm90ZSB0aGF0IGxvbmcgbG9uZyBjb25zdGFudCB2YWx1ZXMgTVVTVCBiZSBzdWZmaXhlZAorCSBieSBMTCBhbmQgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlcyBieSBVTEwsIGxlc3QKKwkgdGhleSBiZSB0cnVuY2F0ZWQgYnkgdGhlIGNvbXBpbGVyKQorKi8KK3R5cGVkZWYJdW5pb24geworCWxvbmcgbG9uZwkJcTsJLyogUXVhZHdvcmQgKDY0LWJpdCkgdmFsdWUgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcJdXE7CS8qIFVuc2lnbmVkIFF1YWR3b3JkICovCisJaW50CQkJZFsyXTsJLyogMiBEb3VibGV3b3JkICgzMi1iaXQpIHZhbHVlcyAqLworCXVuc2lnbmVkIGludAkJdWRbMl07CS8qIDIgVW5zaWduZWQgRG91Ymxld29yZCAqLworCXNob3J0CQkJd1s0XTsJLyogNCBXb3JkICgxNi1iaXQpIHZhbHVlcyAqLworCXVuc2lnbmVkIHNob3J0CQl1d1s0XTsJLyogNCBVbnNpZ25lZCBXb3JkICovCisJY2hhcgkJCWJbOF07CS8qIDggQnl0ZSAoOC1iaXQpIHZhbHVlcyAqLworCXVuc2lnbmVkIGNoYXIJCXViWzhdOwkvKiA4IFVuc2lnbmVkIEJ5dGUgKi8KKwlmbG9hdAkJCXNbMl07CS8qIFNpbmdsZS1wcmVjaXNpb24gKDMyLWJpdCkgdmFsdWUgKi8KK30gbW14X3Q7CisKKworLyoJRnVuY3Rpb24gdG8gdGVzdCBpZiBtdWx0aW1lZGlhIGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLi4uCisqLworc3RhdGljIGlubGluZSBpbnQKK21tX3N1cHBvcnQodm9pZCkKK3sKKwkvKiBSZXR1cm5zIDEgaWYgTU1YIGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLAorCSAgIDMgaWYgQ3lyaXggTU1YIGFuZCBFeHRlbmRlZCBNTVggaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQKKwkgICA1IGlmIEFNRCBNTVggYW5kIDNETm93ISBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZAorCSAgIDAgaWYgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBhbnkgb2YgdGhlc2UKKwkqLworCXJlZ2lzdGVyIGludCBydmFsID0gMDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJLyogU2VlIGlmIENQVUlEIGluc3RydWN0aW9uIGlzIHN1cHBvcnRlZCAuLi4gKi8KKwkJLyogLi4uIEdldCBjb3BpZXMgb2YgRUZMQUdTIGludG8gZWF4IGFuZCBlY3ggKi8KKwkJInB1c2hmXG5cdCIKKwkJInBvcGwgJSVlYXhcblx0IgorCQkibW92bCAlJWVheCwgJSVlY3hcblx0IgorCisJCS8qIC4uLiBUb2dnbGUgdGhlIElEIGJpdCBpbiBvbmUgY29weSBhbmQgc3RvcmUgKi8KKwkJLyogICAgIHRvIHRoZSBFRkxBR1MgcmVnICovCisJCSJ4b3JsICQweDIwMDAwMCwgJSVlYXhcblx0IgorCQkicHVzaCAlJWVheFxuXHQiCisJCSJwb3BmXG5cdCIKKworCQkvKiAuLi4gR2V0IHRoZSAoaG9wZWZ1bGx5IG1vZGlmaWVkKSBFRkxBR1MgKi8KKwkJInB1c2hmXG5cdCIKKwkJInBvcGwgJSVlYXhcblx0IgorCisJCS8qIC4uLiBDb21wYXJlIGFuZCB0ZXN0IHJlc3VsdCAqLworCQkieG9ybCAlJWVheCwgJSVlY3hcblx0IgorCQkidGVzdGwgJDB4MjAwMDAwLCAlJWVjeFxuXHQiCisJCSJqeiBOb3RTdXBwb3J0ZWQxXG5cdCIJCS8qIE5vdGhpbmcgc3VwcG9ydGVkICovCisKKworCQkvKiBHZXQgc3RhbmRhcmQgQ1BVSUQgaW5mb3JtYXRpb24sIGFuZAorCQkgICAgICAgZ28gdG8gYSBzcGVjaWZpYyB2ZW5kb3Igc2VjdGlvbiAqLworCQkibW92bCAkMCwgJSVlYXhcblx0IgorCQkiY3B1aWRcblx0IgorCisJCS8qIENoZWNrIGZvciBJbnRlbCAqLworCQkiY21wbCAkMHg3NTZlNjU0NywgJSVlYnhcblx0IgorCQkiam5lIFRyeUFNRFxuXHQiCisJCSJjbXBsICQweDQ5NjU2ZTY5LCAlJWVkeFxuXHQiCisJCSJqbmUgVHJ5QU1EXG5cdCIKKwkJImNtcGwgJDB4NmM2NTc0NmUsICUlZWN4XG4iCisJCSJqbmUgVHJ5QU1EXG5cdCIKKwkJImptcCBJbnRlbFxuXHQiCisKKwkJLyogQ2hlY2sgZm9yIEFNRCAqLworCQkiXG5UcnlBTUQ6XG5cdCIKKwkJImNtcGwgJDB4Njg3NDc1NDEsICUlZWJ4XG5cdCIKKwkJImpuZSBUcnlDeXJpeFxuXHQiCisJCSJjbXBsICQweDY5NzQ2ZTY1LCAlJWVkeFxuXHQiCisJCSJqbmUgVHJ5Q3lyaXhcblx0IgorCQkiY21wbCAkMHg0NDRkNDE2MywgJSVlY3hcbiIKKwkJImpuZSBUcnlDeXJpeFxuXHQiCisJCSJqbXAgQU1EXG5cdCIKKworCQkvKiBDaGVjayBmb3IgQ3lyaXggKi8KKwkJIlxuVHJ5Q3lyaXg6XG5cdCIKKwkJImNtcGwgJDB4Njk3Mjc5NDMsICUlZWJ4XG5cdCIKKwkJImpuZSBOb3RTdXBwb3J0ZWQyXG5cdCIKKwkJImNtcGwgJDB4NzM2ZTQ5NzgsICUlZWR4XG5cdCIKKwkJImpuZSBOb3RTdXBwb3J0ZWQzXG5cdCIKKwkJImNtcGwgJDB4NjQ2MTY1NzQsICUlZWN4XG5cdCIKKwkJImpuZSBOb3RTdXBwb3J0ZWQ0XG5cdCIKKwkJLyogRHJvcCB0aHJvdWdoIHRvIEN5cml4Li4uICovCisKKworCQkvKiBDeXJpeCBTZWN0aW9uICovCisJCS8qIFNlZSBpZiBleHRlbmRlZCBDUFVJRCBpcyBzdXBwb3J0ZWQgKi8KKwkJIm1vdmwgJDB4ODAwMDAwMDAsICUlZWF4XG5cdCIKKwkJImNwdWlkXG5cdCIKKwkJImNtcGwgJDB4ODAwMDAwMDAsICUlZWF4XG5cdCIKKwkJImpsIE1NWHRlc3Rcblx0IgkvKiBUcnkgc3RhbmRhcmQgQ1BVSUQgaW5zdGVhZCAqLworCisJCS8qIEV4dGVuZGVkIENQVUlEIHN1cHBvcnRlZCwgc28gZ2V0IGV4dGVuZGVkIGZlYXR1cmVzICovCisJCSJtb3ZsICQweDgwMDAwMDAxLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisJCSJ0ZXN0bCAkMHgwMDgwMDAwMCwgJSVlYXhcblx0IgkvKiBUZXN0IGZvciBNTVggKi8KKwkJImp6IE5vdFN1cHBvcnRlZDVcblx0IgkJLyogTU1YIG5vdCBzdXBwb3J0ZWQgKi8KKwkJInRlc3RsICQweDAxMDAwMDAwLCAlJWVheFxuXHQiCS8qIFRlc3QgZm9yIEV4dCdkIE1NWCAqLworCQkiam56IEVNTVhTdXBwb3J0ZWRcblx0IgorCQkibW92bCAkMSwgJTBcblxuXHQiCQkvKiBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cbiIKKwkJIkVNTVhTdXBwb3J0ZWQ6XG5cdCIKKwkJIm1vdmwgJDMsICUwXG5cblx0IgkJLyogRU1NWCBhbmQgTU1YIFN1cHBvcnRlZCAqLworCQkiam1wIFJldHVyblxuXHQiCisKKworCQkvKiBBTUQgU2VjdGlvbiAqLworCQkiQU1EOlxuXHQiCisKKwkJLyogU2VlIGlmIGV4dGVuZGVkIENQVUlEIGlzIHN1cHBvcnRlZCAqLworCQkibW92bCAkMHg4MDAwMDAwMCwgJSVlYXhcblx0IgorCQkiY3B1aWRcblx0IgorCQkiY21wbCAkMHg4MDAwMDAwMCwgJSVlYXhcblx0IgorCQkiamwgTU1YdGVzdFxuXHQiCS8qIFRyeSBzdGFuZGFyZCBDUFVJRCBpbnN0ZWFkICovCisKKwkJLyogRXh0ZW5kZWQgQ1BVSUQgc3VwcG9ydGVkLCBzbyBnZXQgZXh0ZW5kZWQgZmVhdHVyZXMgKi8KKwkJIm1vdmwgJDB4ODAwMDAwMDEsICUlZWF4XG5cdCIKKwkJImNwdWlkXG5cdCIKKwkJInRlc3RsICQweDAwODAwMDAwLCAlJWVkeFxuXHQiCS8qIFRlc3QgZm9yIE1NWCAqLworCQkianogTm90U3VwcG9ydGVkNlxuXHQiCQkvKiBNTVggbm90IHN1cHBvcnRlZCAqLworCQkidGVzdGwgJDB4ODAwMDAwMDAsICUlZWR4XG5cdCIJLyogVGVzdCBmb3IgM0ROb3chICovCisJCSJqbnogVGhyZWVETm93U3VwcG9ydGVkXG5cdCIKKwkJIm1vdmwgJDEsICUwXG5cblx0IgkJLyogTU1YIFN1cHBvcnRlZCAqLworCQkiam1wIFJldHVyblxuXG4iCisJCSJUaHJlZUROb3dTdXBwb3J0ZWQ6XG5cdCIKKwkJIm1vdmwgJDUsICUwXG5cblx0IgkJLyogM0ROb3chIGFuZCBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cdCIKKworCisJCS8qIEludGVsIFNlY3Rpb24gKi8KKwkJIkludGVsOlxuXHQiCisKKwkJLyogQ2hlY2sgZm9yIE1NWCAqLworCQkiTU1YdGVzdDpcblx0IgorCQkibW92bCAkMSwgJSVlYXhcblx0IgorCQkiY3B1aWRcblx0IgorCQkidGVzdGwgJDB4MDA4MDAwMDAsICUlZWR4XG5cdCIJLyogVGVzdCBmb3IgTU1YICovCisJCSJqeiBOb3RTdXBwb3J0ZWQ3XG5cdCIJCS8qIE1NWCBOb3Qgc3VwcG9ydGVkICovCisJCSJtb3ZsICQxLCAlMFxuXG5cdCIJCS8qIE1NWCBTdXBwb3J0ZWQgKi8KKwkJImptcCBSZXR1cm5cblx0IgorCisJCS8qIE5vdGhpbmcgc3VwcG9ydGVkICovCisJCSJcbk5vdFN1cHBvcnRlZDE6XG5cdCIKKwkJIiNtb3ZsICQxMDEsICUwXG5cblx0IgorCQkiXG5Ob3RTdXBwb3J0ZWQyOlxuXHQiCisJCSIjbW92bCAkMTAyLCAlMFxuXG5cdCIKKwkJIlxuTm90U3VwcG9ydGVkMzpcblx0IgorCQkiI21vdmwgJDEwMywgJTBcblxuXHQiCisJCSJcbk5vdFN1cHBvcnRlZDQ6XG5cdCIKKwkJIiNtb3ZsICQxMDQsICUwXG5cblx0IgorCQkiXG5Ob3RTdXBwb3J0ZWQ1OlxuXHQiCisJCSIjbW92bCAkMTA1LCAlMFxuXG5cdCIKKwkJIlxuTm90U3VwcG9ydGVkNjpcblx0IgorCQkiI21vdmwgJDEwNiwgJTBcblxuXHQiCisJCSJcbk5vdFN1cHBvcnRlZDc6XG5cdCIKKwkJIiNtb3ZsICQxMDcsICUwXG5cblx0IgorCQkibW92bCAkMCwgJTBcblxuXHQiCisKKwkJIlJldHVybjpcblx0IgorCQk6ICI9YSIgKHJ2YWwpCisJCTogLyogbm8gaW5wdXQgKi8KKwkJOiAiZWF4IiwgImVieCIsICJlY3giLCAiZWR4IgorCSk7CisKKwkvKiBSZXR1cm4gKi8KKwlyZXR1cm4ocnZhbCk7Cit9CisKKy8qCUZ1bmN0aW9uIHRvIHRlc3QgaWYgbW14IGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLi4uCisqLworc3RhdGljIGlubGluZSBpbnQKK21teF9vayh2b2lkKQoreworCS8qIFJldHVybnMgMSBpZiBNTVggaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQsIDAgb3RoZXJ3aXNlICovCisJcmV0dXJuICggbW1fc3VwcG9ydCgpICYgMHgxICk7Cit9CisKKworLyoJSGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIGluc3RydWN0aW9uIG1hY3JvcyB0aGF0IGZvbGxvdy4uLgorCShub3RlIHRoYXQgbWVtb3J5LXRvLXJlZ2lzdGVyLCBtMnIsIGluc3RydWN0aW9ucyBhcmUgbmVhcmx5CisJIGFzIGVmZmljaWVudCBhcyByZWdpc3Rlci10by1yZWdpc3RlciwgcjJyLCBpbnN0cnVjdGlvbnM7CisJIGhvd2V2ZXIsIG1lbW9yeS10by1tZW1vcnkgaW5zdHJ1Y3Rpb25zIGFyZSByZWFsbHkgc2ltdWxhdGVkCisJIGFzIGEgY29udmVuaWVuY2UsIGFuZCBhcmUgb25seSAxLzMgYXMgZWZmaWNpZW50KQorKi8KKyNpZmRlZglNTVhfVFJBQ0UKKworLyoJSW5jbHVkZSB0aGUgc3R1ZmYgZm9yIHByaW50aW5nIGEgdHJhY2UgdG8gc3RkZXJyLi4uCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZQltbXhfaTJyKG9wLCBpbW0sIHJlZykgXAorCXsgXAorCQltbXhfdCBtbXhfdHJhY2U7IFwKKwkJbW14X3RyYWNlID0gKGltbSk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNvcCAiX2kycigiICNpbW0gIj0weCUwMTZsbHgsICIsIG1teF90cmFjZS5xKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWcgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjcmVnICI9MHglMDE2bGx4KSA9PiAiLCBtbXhfdHJhY2UucSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUwLCAlJSIgI3JlZyBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCQkgICAgICA6ICJYIiAoaW1tKSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI3JlZyAiPTB4JTAxNmxseFxuIiwgbW14X3RyYWNlLnEpOyBcCisJfQorCisjZGVmaW5lCW1teF9tMnIob3AsIG1lbSwgcmVnKSBcCisJeyBcCisJCW1teF90IG1teF90cmFjZTsgXAorCQltbXhfdHJhY2UgPSAobWVtKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI29wICJfbTJyKCIgI21lbSAiPTB4JTAxNmxseCwgIiwgbW14X3RyYWNlLnEpOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZyAiLCAlMCIgXAorCQkJCSAgICAgIDogIj1YIiAobW14X3RyYWNlKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNyZWcgIj0weCUwMTZsbHgpID0+ICIsIG1teF90cmFjZS5xKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAorCQkJCSAgICAgIDogIlgiIChtZW0pKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWcgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjcmVnICI9MHglMDE2bGx4XG4iLCBtbXhfdHJhY2UucSk7IFwKKwl9CisKKyNkZWZpbmUJbW14X3IybShvcCwgcmVnLCBtZW0pIFwKKwl7IFwKKwkJbW14X3QgbW14X3RyYWNlOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZyAiLCAlMCIgXAorCQkJCSAgICAgIDogIj1YIiAobW14X3RyYWNlKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNvcCAiX3IybSgiICNyZWcgIj0weCUwMTZsbHgsICIsIG1teF90cmFjZS5xKTsgXAorCQltbXhfdHJhY2UgPSAobWVtKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI21lbSAiPTB4JTAxNmxseCkgPT4gIiwgbW14X3RyYWNlLnEpOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlJSIgI3JlZyAiLCAlMCIgXAorCQkJCSAgICAgIDogIj1YIiAobWVtKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJbW14X3RyYWNlID0gKG1lbSk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNtZW0gIj0weCUwMTZsbHhcbiIsIG1teF90cmFjZS5xKTsgXAorCX0KKworI2RlZmluZQltbXhfcjJyKG9wLCByZWdzLCByZWdkKSBcCisJeyBcCisJCW1teF90IG1teF90cmFjZTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWdzICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI29wICJfcjJyKCIgI3JlZ3MgIj0weCUwMTZsbHgsICIsIG1teF90cmFjZS5xKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWdkICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI3JlZ2QgIj0weCUwMTZsbHgpID0+ICIsIG1teF90cmFjZS5xKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJSIgI3JlZ3MgIiwgJSIgI3JlZ2QpOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZ2QgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjcmVnZCAiPTB4JTAxNmxseFxuIiwgbW14X3RyYWNlLnEpOyBcCisJfQorCisjZGVmaW5lCW1teF9tMm0ob3AsIG1lbXMsIG1lbWQpIFwKKwl7IFwKKwkJbW14X3QgbW14X3RyYWNlOyBcCisJCW1teF90cmFjZSA9IChtZW1zKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI29wICJfbTJtKCIgI21lbXMgIj0weCUwMTZsbHgsICIsIG1teF90cmFjZS5xKTsgXAorCQltbXhfdHJhY2UgPSAobWVtZCk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNtZW1kICI9MHglMDE2bGx4KSA9PiAiLCBtbXhfdHJhY2UucSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUwLCAlJW1tMFxuXHQiIFwKKwkJCQkgICAgICAjb3AgIiAlMSwgJSVtbTBcblx0IiBcCisJCQkJICAgICAgIm1vdnEgJSVtbTAsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtZW1kKSBcCisJCQkJICAgICAgOiAiWCIgKG1lbXMpKTsgXAorCQltbXhfdHJhY2UgPSAobWVtZCk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNtZW1kICI9MHglMDE2bGx4XG4iLCBtbXhfdHJhY2UucSk7IFwKKwl9CisKKyNlbHNlCisKKy8qCVRoZXNlIG1hY3JvcyBhcmUgYSBsb3Qgc2ltcGxlciB3aXRob3V0IHRoZSB0cmFjaW5nLi4uCisqLworCisjZGVmaW5lCW1teF9pMnIob3AsIGltbSwgcmVnKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICQiICNpbW0gIiwgJSUiICNyZWcgXAorCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyk7CisKKyNkZWZpbmUJbW14X20ycihvcCwgbWVtLCByZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJtIiAobWVtKSkKKworI2RlZmluZQltbXhfcjJtKG9wLCByZWcsIG1lbSkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlJSIgI3JlZyAiLCAlMCIgXAorCQkJICAgICAgOiAiPW0iIChtZW0pIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyApCisKKyNkZWZpbmUJbW14X3IycihvcCwgcmVncywgcmVnZCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlIiAjcmVncyAiLCAlIiAjcmVnZCkKKworI2RlZmluZQltbXhfbTJtKG9wLCBtZW1zLCBtZW1kKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUwLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICNvcCAiICUxLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICJtb3ZxICUlbW0wLCAlMCIgXAorCQkJICAgICAgOiAiPW0iIChtZW1kKSBcCisJCQkgICAgICA6ICJtIiAobWVtcykpCisKKyNlbmRpZgorCisKKy8qCTF4NjQgTU9WZSBRdWFkd29yZAorCSh0aGlzIGlzIGJvdGggYSBsb2FkIGFuZCBhIHN0b3JlLi4uCisJIGluIGZhY3QsIGl0IGlzIHRoZSBvbmx5IHdheSB0byBzdG9yZSkKKyovCisjZGVmaW5lCW1vdnFfbTJyKHZhciwgcmVnKQltbXhfbTJyKG1vdnEsIHZhciwgcmVnKQorI2RlZmluZQltb3ZxX3IybShyZWcsIHZhcikJbW14X3IybShtb3ZxLCByZWcsIHZhcikKKyNkZWZpbmUJbW92cV9yMnIocmVncywgcmVnZCkJbW14X3Iycihtb3ZxLCByZWdzLCByZWdkKQorI2RlZmluZQltb3ZxKHZhcnMsIHZhcmQpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJTEsICUlbW0wXG5cdCIgXAorCQkJICAgICAgIm1vdnEgJSVtbTAsICUwIiBcCisJCQkgICAgICA6ICI9WCIgKHZhcmQpIFwKKwkJCSAgICAgIDogIlgiICh2YXJzKSkKKworCisvKgkxeDMyIE1PVmUgRG91Ymxld29yZAorCShsaWtlIG1vdnEsIHRoaXMgaXMgYm90aCBsb2FkIGFuZCBzdG9yZS4uLgorCSBidXQgaXMgbW9zdCB1c2VmdWwgZm9yIG1vdmluZyB0aGluZ3MgYmV0d2VlbgorCSBtbXggcmVnaXN0ZXJzIGFuZCBvcmRpbmFyeSByZWdpc3RlcnMpCisqLworI2RlZmluZQltb3ZkX20ycih2YXIsIHJlZykJbW14X20ycihtb3ZkLCB2YXIsIHJlZykKKyNkZWZpbmUJbW92ZF9yMm0ocmVnLCB2YXIpCW1teF9yMm0obW92ZCwgcmVnLCB2YXIpCisjZGVmaW5lCW1vdmRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIobW92ZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJbW92ZCh2YXJzLCB2YXJkKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZkICUxLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICJtb3ZkICUlbW0wLCAlMCIgXAorCQkJICAgICAgOiAiPVgiICh2YXJkKSBcCisJCQkgICAgICA6ICJYIiAodmFycykpCisKKworLyoJMngzMiwgNHgxNiwgYW5kIDh4OCBQYXJhbGxlbCBBRERzCisqLworI2RlZmluZQlwYWRkZF9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZGQsIHZhciwgcmVnKQorI2RlZmluZQlwYWRkZF9yMnIocmVncywgcmVnZCkJbW14X3IycihwYWRkZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZGQodmFycywgdmFyZCkJbW14X20ybShwYWRkZCwgdmFycywgdmFyZCkKKworI2RlZmluZQlwYWRkd19tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHcsIHZhciwgcmVnKQorI2RlZmluZQlwYWRkd19yMnIocmVncywgcmVnZCkJbW14X3IycihwYWRkdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHcodmFycywgdmFyZCkJbW14X20ybShwYWRkdywgdmFycywgdmFyZCkKKworI2RlZmluZQlwYWRkYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZGIsIHZhciwgcmVnKQorI2RlZmluZQlwYWRkYl9yMnIocmVncywgcmVnZCkJbW14X3IycihwYWRkYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZGIodmFycywgdmFyZCkJbW14X20ybShwYWRkYiwgdmFycywgdmFyZCkKKworCisvKgk0eDE2IGFuZCA4eDggUGFyYWxsZWwgQUREcyB1c2luZyBTYXR1cmF0aW9uIGFyaXRobWV0aWMKKyovCisjZGVmaW5lCXBhZGRzd19tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHN3LCB2YXIsIHJlZykKKyNkZWZpbmUJcGFkZHN3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBhZGRzdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHN3KHZhcnMsIHZhcmQpCW1teF9tMm0ocGFkZHN3LCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBhZGRzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHNiLCB2YXIsIHJlZykKKyNkZWZpbmUJcGFkZHNiX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBhZGRzYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHNiKHZhcnMsIHZhcmQpCW1teF9tMm0ocGFkZHNiLCB2YXJzLCB2YXJkKQorCisKKy8qCTR4MTYgYW5kIDh4OCBQYXJhbGxlbCBBRERzIHVzaW5nIFVuc2lnbmVkIFNhdHVyYXRpb24gYXJpdGhtZXRpYworKi8KKyNkZWZpbmUJcGFkZHVzd19tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHVzdywgdmFyLCByZWcpCisjZGVmaW5lCXBhZGR1c3dfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFkZHVzdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHVzdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBhZGR1c3csIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcGFkZHVzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHVzYiwgdmFyLCByZWcpCisjZGVmaW5lCXBhZGR1c2JfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFkZHVzYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHVzYih2YXJzLCB2YXJkKQltbXhfbTJtKHBhZGR1c2IsIHZhcnMsIHZhcmQpCisKKworLyoJMngzMiwgNHgxNiwgYW5kIDh4OCBQYXJhbGxlbCBTVUJzCisqLworI2RlZmluZQlwc3ViZF9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YmQsIHZhciwgcmVnKQorI2RlZmluZQlwc3ViZF9yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3ViZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YmQodmFycywgdmFyZCkJbW14X20ybShwc3ViZCwgdmFycywgdmFyZCkKKworI2RlZmluZQlwc3Vid19tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YncsIHZhciwgcmVnKQorI2RlZmluZQlwc3Vid19yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3VidywgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YncodmFycywgdmFyZCkJbW14X20ybShwc3VidywgdmFycywgdmFyZCkKKworI2RlZmluZQlwc3ViYl9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YmIsIHZhciwgcmVnKQorI2RlZmluZQlwc3ViYl9yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3ViYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YmIodmFycywgdmFyZCkJbW14X20ybShwc3ViYiwgdmFycywgdmFyZCkKKworCisvKgk0eDE2IGFuZCA4eDggUGFyYWxsZWwgU1VCcyB1c2luZyBTYXR1cmF0aW9uIGFyaXRobWV0aWMKKyovCisjZGVmaW5lCXBzdWJzd19tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnN3LCB2YXIsIHJlZykKKyNkZWZpbmUJcHN1YnN3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzdWJzdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YnN3KHZhcnMsIHZhcmQpCW1teF9tMm0ocHN1YnN3LCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBzdWJzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnNiLCB2YXIsIHJlZykKKyNkZWZpbmUJcHN1YnNiX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzdWJzYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YnNiKHZhcnMsIHZhcmQpCW1teF9tMm0ocHN1YnNiLCB2YXJzLCB2YXJkKQorCisKKy8qCTR4MTYgYW5kIDh4OCBQYXJhbGxlbCBTVUJzIHVzaW5nIFVuc2lnbmVkIFNhdHVyYXRpb24gYXJpdGhtZXRpYworKi8KKyNkZWZpbmUJcHN1YnVzd19tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnVzdywgdmFyLCByZWcpCisjZGVmaW5lCXBzdWJ1c3dfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHN1YnVzdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YnVzdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBzdWJ1c3csIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHN1YnVzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnVzYiwgdmFyLCByZWcpCisjZGVmaW5lCXBzdWJ1c2JfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHN1YnVzYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YnVzYih2YXJzLCB2YXJkKQltbXhfbTJtKHBzdWJ1c2IsIHZhcnMsIHZhcmQpCisKKworLyoJNHgxNiBQYXJhbGxlbCBNVUxzIGdpdmluZyBMb3cgNHgxNiBwb3J0aW9ucyBvZiByZXN1bHRzCisqLworI2RlZmluZQlwbXVsbHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBtdWxsdywgdmFyLCByZWcpCisjZGVmaW5lCXBtdWxsd19yMnIocmVncywgcmVnZCkJbW14X3IycihwbXVsbHcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBtdWxsdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBtdWxsdywgdmFycywgdmFyZCkKKworCisvKgk0eDE2IFBhcmFsbGVsIE1VTHMgZ2l2aW5nIEhpZ2ggNHgxNiBwb3J0aW9ucyBvZiByZXN1bHRzCisqLworI2RlZmluZQlwbXVsaHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBtdWxodywgdmFyLCByZWcpCisjZGVmaW5lCXBtdWxod19yMnIocmVncywgcmVnZCkJbW14X3IycihwbXVsaHcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBtdWxodyh2YXJzLCB2YXJkKQltbXhfbTJtKHBtdWxodywgdmFycywgdmFyZCkKKworCisvKgk0eDE2LT4yeDMyIFBhcmFsbGVsIE11bC1BREQKKwkobXVscyBsaWtlIHBtdWxsdywgdGhlbiBhZGRzIGFkamFjZW50IDE2LWJpdCBmaWVsZHMKKwkgaW4gdGhlIG11bHRpcGx5IHJlc3VsdCB0byBtYWtlIHRoZSBmaW5hbCAyeDMyIHJlc3VsdCkKKyovCisjZGVmaW5lCXBtYWRkd2RfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBtYWRkd2QsIHZhciwgcmVnKQorI2RlZmluZQlwbWFkZHdkX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBtYWRkd2QsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBtYWRkd2QodmFycywgdmFyZCkJbW14X20ybShwbWFkZHdkLCB2YXJzLCB2YXJkKQorCisKKy8qCTF4NjQgYml0d2lzZSBBTkQKKyovCisjaWZkZWYJQlJPS0VOX1BBTkQKKyNkZWZpbmUJcGFuZF9tMnIodmFyLCByZWcpIFwKKwl7IFwKKwkJbW14X20ycihwYW5kbiwgKG1teF90KSAtMUxMLCByZWcpOyBcCisJCW1teF9tMnIocGFuZG4sIHZhciwgcmVnKTsgXAorCX0KKyNkZWZpbmUJcGFuZF9yMnIocmVncywgcmVnZCkgXAorCXsgXAorCQltbXhfbTJyKHBhbmRuLCAobW14X3QpIC0xTEwsIHJlZ2QpOyBcCisJCW1teF9yMnIocGFuZG4sIHJlZ3MsIHJlZ2QpOyBcCisJfQorI2RlZmluZQlwYW5kKHZhcnMsIHZhcmQpIFwKKwl7IFwKKwkJbW92cV9tMnIodmFyZCwgbW0wKTsgXAorCQltbXhfbTJyKHBhbmRuLCAobW14X3QpIC0xTEwsIG1tMCk7IFwKKwkJbW14X20ycihwYW5kbiwgdmFycywgbW0wKTsgXAorCQltb3ZxX3IybShtbTAsIHZhcmQpOyBcCisJfQorI2Vsc2UKKyNkZWZpbmUJcGFuZF9tMnIodmFyLCByZWcpCW1teF9tMnIocGFuZCwgdmFyLCByZWcpCisjZGVmaW5lCXBhbmRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFuZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFuZCh2YXJzLCB2YXJkKQltbXhfbTJtKHBhbmQsIHZhcnMsIHZhcmQpCisjZW5kaWYKKworCisvKgkxeDY0IGJpdHdpc2UgQU5EIHdpdGggTm90IHRoZSBkZXN0aW5hdGlvbgorKi8KKyNkZWZpbmUJcGFuZG5fbTJyKHZhciwgcmVnKQltbXhfbTJyKHBhbmRuLCB2YXIsIHJlZykKKyNkZWZpbmUJcGFuZG5fcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFuZG4sIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBhbmRuKHZhcnMsIHZhcmQpCW1teF9tMm0ocGFuZG4sIHZhcnMsIHZhcmQpCisKKworLyoJMXg2NCBiaXR3aXNlIE9SCisqLworI2RlZmluZQlwb3JfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBvciwgdmFyLCByZWcpCisjZGVmaW5lCXBvcl9yMnIocmVncywgcmVnZCkJbW14X3Iycihwb3IsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBvcih2YXJzLCB2YXJkKQltbXhfbTJtKHBvciwgdmFycywgdmFyZCkKKworCisvKgkxeDY0IGJpdHdpc2UgZVhjbHVzaXZlIE9SCisqLworI2RlZmluZQlweG9yX20ycih2YXIsIHJlZykJbW14X20ycihweG9yLCB2YXIsIHJlZykKKyNkZWZpbmUJcHhvcl9yMnIocmVncywgcmVnZCkJbW14X3IycihweG9yLCByZWdzLCByZWdkKQorI2RlZmluZQlweG9yKHZhcnMsIHZhcmQpCW1teF9tMm0ocHhvciwgdmFycywgdmFyZCkKKworCisvKgkyeDMyLCA0eDE2LCBhbmQgOHg4IFBhcmFsbGVsIENvTVBhcmUgZm9yIEVRdWFsaXR5CisJKHJlc3VsdGluZyBmaWVsZHMgYXJlIGVpdGhlciAwIG9yIC0xKQorKi8KKyNkZWZpbmUJcGNtcGVxZF9tMnIodmFyLCByZWcpCW1teF9tMnIocGNtcGVxZCwgdmFyLCByZWcpCisjZGVmaW5lCXBjbXBlcWRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGNtcGVxZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGNtcGVxZCh2YXJzLCB2YXJkKQltbXhfbTJtKHBjbXBlcWQsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcGNtcGVxd19tMnIodmFyLCByZWcpCW1teF9tMnIocGNtcGVxdywgdmFyLCByZWcpCisjZGVmaW5lCXBjbXBlcXdfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGNtcGVxdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcGNtcGVxdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBjbXBlcXcsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcGNtcGVxYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGNtcGVxYiwgdmFyLCByZWcpCisjZGVmaW5lCXBjbXBlcWJfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGNtcGVxYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGNtcGVxYih2YXJzLCB2YXJkKQltbXhfbTJtKHBjbXBlcWIsIHZhcnMsIHZhcmQpCisKKworLyoJMngzMiwgNHgxNiwgYW5kIDh4OCBQYXJhbGxlbCBDb01QYXJlIGZvciBHcmVhdGVyIFRoYW4KKwkocmVzdWx0aW5nIGZpZWxkcyBhcmUgZWl0aGVyIDAgb3IgLTEpCisqLworI2RlZmluZQlwY21wZ3RkX20ycih2YXIsIHJlZykJbW14X20ycihwY21wZ3RkLCB2YXIsIHJlZykKKyNkZWZpbmUJcGNtcGd0ZF9yMnIocmVncywgcmVnZCkJbW14X3IycihwY21wZ3RkLCByZWdzLCByZWdkKQorI2RlZmluZQlwY21wZ3RkKHZhcnMsIHZhcmQpCW1teF9tMm0ocGNtcGd0ZCwgdmFycywgdmFyZCkKKworI2RlZmluZQlwY21wZ3R3X20ycih2YXIsIHJlZykJbW14X20ycihwY21wZ3R3LCB2YXIsIHJlZykKKyNkZWZpbmUJcGNtcGd0d19yMnIocmVncywgcmVnZCkJbW14X3IycihwY21wZ3R3LCByZWdzLCByZWdkKQorI2RlZmluZQlwY21wZ3R3KHZhcnMsIHZhcmQpCW1teF9tMm0ocGNtcGd0dywgdmFycywgdmFyZCkKKworI2RlZmluZQlwY21wZ3RiX20ycih2YXIsIHJlZykJbW14X20ycihwY21wZ3RiLCB2YXIsIHJlZykKKyNkZWZpbmUJcGNtcGd0Yl9yMnIocmVncywgcmVnZCkJbW14X3IycihwY21wZ3RiLCByZWdzLCByZWdkKQorI2RlZmluZQlwY21wZ3RiKHZhcnMsIHZhcmQpCW1teF9tMm0ocGNtcGd0YiwgdmFycywgdmFyZCkKKworCisvKgkxeDY0LCAyeDMyLCBhbmQgNHgxNiBQYXJhbGxlbCBTaGlmdCBMZWZ0IExvZ2ljYWwKKyovCisjZGVmaW5lCXBzbGxxX2kycihpbW0sIHJlZykJbW14X2kycihwc2xscSwgaW1tLCByZWcpCisjZGVmaW5lCXBzbGxxX20ycih2YXIsIHJlZykJbW14X20ycihwc2xscSwgdmFyLCByZWcpCisjZGVmaW5lCXBzbGxxX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzbGxxLCByZWdzLCByZWdkKQorI2RlZmluZQlwc2xscSh2YXJzLCB2YXJkKQltbXhfbTJtKHBzbGxxLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBzbGxkX2kycihpbW0sIHJlZykJbW14X2kycihwc2xsZCwgaW1tLCByZWcpCisjZGVmaW5lCXBzbGxkX20ycih2YXIsIHJlZykJbW14X20ycihwc2xsZCwgdmFyLCByZWcpCisjZGVmaW5lCXBzbGxkX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzbGxkLCByZWdzLCByZWdkKQorI2RlZmluZQlwc2xsZCh2YXJzLCB2YXJkKQltbXhfbTJtKHBzbGxkLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBzbGx3X2kycihpbW0sIHJlZykJbW14X2kycihwc2xsdywgaW1tLCByZWcpCisjZGVmaW5lCXBzbGx3X20ycih2YXIsIHJlZykJbW14X20ycihwc2xsdywgdmFyLCByZWcpCisjZGVmaW5lCXBzbGx3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzbGx3LCByZWdzLCByZWdkKQorI2RlZmluZQlwc2xsdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBzbGx3LCB2YXJzLCB2YXJkKQorCisKKy8qCTF4NjQsIDJ4MzIsIGFuZCA0eDE2IFBhcmFsbGVsIFNoaWZ0IFJpZ2h0IExvZ2ljYWwKKyovCisjZGVmaW5lCXBzcmxxX2kycihpbW0sIHJlZykJbW14X2kycihwc3JscSwgaW1tLCByZWcpCisjZGVmaW5lCXBzcmxxX20ycih2YXIsIHJlZykJbW14X20ycihwc3JscSwgdmFyLCByZWcpCisjZGVmaW5lCXBzcmxxX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzcmxxLCByZWdzLCByZWdkKQorI2RlZmluZQlwc3JscSh2YXJzLCB2YXJkKQltbXhfbTJtKHBzcmxxLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBzcmxkX2kycihpbW0sIHJlZykJbW14X2kycihwc3JsZCwgaW1tLCByZWcpCisjZGVmaW5lCXBzcmxkX20ycih2YXIsIHJlZykJbW14X20ycihwc3JsZCwgdmFyLCByZWcpCisjZGVmaW5lCXBzcmxkX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzcmxkLCByZWdzLCByZWdkKQorI2RlZmluZQlwc3JsZCh2YXJzLCB2YXJkKQltbXhfbTJtKHBzcmxkLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBzcmx3X2kycihpbW0sIHJlZykJbW14X2kycihwc3JsdywgaW1tLCByZWcpCisjZGVmaW5lCXBzcmx3X20ycih2YXIsIHJlZykJbW14X20ycihwc3JsdywgdmFyLCByZWcpCisjZGVmaW5lCXBzcmx3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzcmx3LCByZWdzLCByZWdkKQorI2RlZmluZQlwc3Jsdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBzcmx3LCB2YXJzLCB2YXJkKQorCisKKy8qCTJ4MzIgYW5kIDR4MTYgUGFyYWxsZWwgU2hpZnQgUmlnaHQgQXJpdGhtZXRpYworKi8KKyNkZWZpbmUJcHNyYWRfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzcmFkLCBpbW0sIHJlZykKKyNkZWZpbmUJcHNyYWRfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzcmFkLCB2YXIsIHJlZykKKyNkZWZpbmUJcHNyYWRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNyYWQsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzcmFkKHZhcnMsIHZhcmQpCW1teF9tMm0ocHNyYWQsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHNyYXdfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzcmF3LCBpbW0sIHJlZykKKyNkZWZpbmUJcHNyYXdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzcmF3LCB2YXIsIHJlZykKKyNkZWZpbmUJcHNyYXdfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNyYXcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzcmF3KHZhcnMsIHZhcmQpCW1teF9tMm0ocHNyYXcsIHZhcnMsIHZhcmQpCisKKworLyoJMngzMi0+NHgxNiBhbmQgNHgxNi0+OHg4IFBBQ0sgYW5kIFNpZ25lZCBTYXR1cmF0ZQorCShwYWNrcyBzb3VyY2UgYW5kIGRlc3QgZmllbGRzIGludG8gZGVzdCBpbiB0aGF0IG9yZGVyKQorKi8KKyNkZWZpbmUJcGFja3NzZHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBhY2tzc2R3LCB2YXIsIHJlZykKKyNkZWZpbmUJcGFja3NzZHdfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocGFja3NzZHcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBhY2tzc2R3KHZhcnMsIHZhcmQpCW1teF9tMm0ocGFja3NzZHcsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcGFja3Nzd2JfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBhY2tzc3diLCB2YXIsIHJlZykKKyNkZWZpbmUJcGFja3Nzd2JfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocGFja3Nzd2IsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBhY2tzc3diKHZhcnMsIHZhcmQpCW1teF9tMm0ocGFja3Nzd2IsIHZhcnMsIHZhcmQpCisKKworLyoJNHgxNi0+OHg4IFBBQ0sgYW5kIFVuc2lnbmVkIFNhdHVyYXRlCisJKHBhY2tzIHNvdXJjZSBhbmQgZGVzdCBmaWVsZHMgaW50byBkZXN0IGluIHRoYXQgb3JkZXIpCisqLworI2RlZmluZQlwYWNrdXN3Yl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFja3Vzd2IsIHZhciwgcmVnKQorI2RlZmluZQlwYWNrdXN3Yl9yMnIocmVncywgcmVnZCkgbW14X3IycihwYWNrdXN3YiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFja3Vzd2IodmFycywgdmFyZCkJbW14X20ybShwYWNrdXN3YiwgdmFycywgdmFyZCkKKworCisvKgkyeDMyLT4xeDY0LCA0eDE2LT4yeDMyLCBhbmQgOHg4LT40eDE2IFVOUGFDSyBMb3cKKwkoaW50ZXJsZWF2ZXMgbG93IGhhbGYgb2YgZGVzdCB3aXRoIGxvdyBoYWxmIG9mIHNvdXJjZQorCSBhcyBwYWRkaW5nIGluIGVhY2ggcmVzdWx0IGZpZWxkKQorKi8KKyNkZWZpbmUJcHVucGNrbGRxX20ycih2YXIsIHJlZykJbW14X20ycihwdW5wY2tsZHEsIHZhciwgcmVnKQorI2RlZmluZQlwdW5wY2tsZHFfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocHVucGNrbGRxLCByZWdzLCByZWdkKQorI2RlZmluZQlwdW5wY2tsZHEodmFycywgdmFyZCkJbW14X20ybShwdW5wY2tsZHEsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHVucGNrbHdkX20ycih2YXIsIHJlZykJbW14X20ycihwdW5wY2tsd2QsIHZhciwgcmVnKQorI2RlZmluZQlwdW5wY2tsd2RfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocHVucGNrbHdkLCByZWdzLCByZWdkKQorI2RlZmluZQlwdW5wY2tsd2QodmFycywgdmFyZCkJbW14X20ybShwdW5wY2tsd2QsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHVucGNrbGJ3X20ycih2YXIsIHJlZykJbW14X20ycihwdW5wY2tsYncsIHZhciwgcmVnKQorI2RlZmluZQlwdW5wY2tsYndfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocHVucGNrbGJ3LCByZWdzLCByZWdkKQorI2RlZmluZQlwdW5wY2tsYncodmFycywgdmFyZCkJbW14X20ybShwdW5wY2tsYncsIHZhcnMsIHZhcmQpCisKKworLyoJMngzMi0+MXg2NCwgNHgxNi0+MngzMiwgYW5kIDh4OC0+NHgxNiBVTlBhQ0sgSGlnaAorCShpbnRlcmxlYXZlcyBoaWdoIGhhbGYgb2YgZGVzdCB3aXRoIGhpZ2ggaGFsZiBvZiBzb3VyY2UKKwkgYXMgcGFkZGluZyBpbiBlYWNoIHJlc3VsdCBmaWVsZCkKKyovCisjZGVmaW5lCXB1bnBja2hkcV9tMnIodmFyLCByZWcpCW1teF9tMnIocHVucGNraGRxLCB2YXIsIHJlZykKKyNkZWZpbmUJcHVucGNraGRxX3IycihyZWdzLCByZWdkKSBtbXhfcjJyKHB1bnBja2hkcSwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHVucGNraGRxKHZhcnMsIHZhcmQpCW1teF9tMm0ocHVucGNraGRxLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXB1bnBja2h3ZF9tMnIodmFyLCByZWcpCW1teF9tMnIocHVucGNraHdkLCB2YXIsIHJlZykKKyNkZWZpbmUJcHVucGNraHdkX3IycihyZWdzLCByZWdkKSBtbXhfcjJyKHB1bnBja2h3ZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHVucGNraHdkKHZhcnMsIHZhcmQpCW1teF9tMm0ocHVucGNraHdkLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXB1bnBja2hid19tMnIodmFyLCByZWcpCW1teF9tMnIocHVucGNraGJ3LCB2YXIsIHJlZykKKyNkZWZpbmUJcHVucGNraGJ3X3IycihyZWdzLCByZWdkKSBtbXhfcjJyKHB1bnBja2hidywgcmVncywgcmVnZCkKKyNkZWZpbmUJcHVucGNraGJ3KHZhcnMsIHZhcmQpCW1teF9tMm0ocHVucGNraGJ3LCB2YXJzLCB2YXJkKQorCisKKy8qCUVtcHR5IE1NeCBTdGF0ZQorCSh1c2VkIHRvIGNsZWFuLXVwIHdoZW4gZ29pbmcgZnJvbSBtbXggdG8gZmxvYXQgdXNlCisJIG9mIHRoZSByZWdpc3RlcnMgdGhhdCBhcmUgc2hhcmVkIGJ5IGJvdGg7IG5vdGUgdGhhdAorCSB0aGVyZSBpcyBubyBmbG9hdC10by1tbXggb3BlcmF0aW9uIG5lZWRlZCwgYmVjYXVzZQorCSBvbmx5IHRoZSBmbG9hdCB0YWcgd29yZCBpbmZvIGlzIGNvcnJ1cHRpYmxlKQorKi8KKyNpZmRlZglNTVhfVFJBQ0UKKworI2RlZmluZQllbW1zKCkgXAorCXsgXAorCQlmcHJpbnRmKHN0ZGVyciwgImVtbXMoKVxuIik7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlbW1zIik7IFwKKwl9CisKKyNlbHNlCisKKyNkZWZpbmUJZW1tcygpCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlbW1zIikKKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9wbHVnaW5zLmggYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3BsdWdpbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODA4NWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9wbHVnaW5zLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBCaWxseSBCaWdncyA8dmVrdG9yQGR1bWJ0ZXJtLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0Bjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIFJlbGljZW5zZWQgZm9yIEdTdHJlYW1lciBmcm9tIEdQTCB0byBMR1BMIHdpdGggcGVybWl0IGZyb20gQmlsbHkgQmlnZ3MuCisgKiBTZWU6IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTE2MzU3OAorICovCisKKyNpZm5kZWYgVFZUSU1FX1BMVUdJTlNfSF9JTkNMVURFRAorI2RlZmluZSBUVlRJTUVfUExVR0lOU19IX0lOQ0xVREVECisKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfVE9NU01PQ09NUCAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF90b21zbW9jb21wX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfVFlQRV9ERUlOVEVSTEFDRV9HUkVFRFlfSCAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfaF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfR1JFRURZX0wgKGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2xfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9UWVBFX0RFSU5URVJMQUNFX1ZGSVIgKGdzdF9kZWludGVybGFjZV9tZXRob2RfdmZpcl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTElORUFSIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTElORUFSX0JMRU5EIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9ibGVuZF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfU0NBTEVSX0JPQiAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9zY2FsZXJfYm9iX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfVFlQRV9ERUlOVEVSTEFDRV9XRUFWRSAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF93ZWF2ZV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfV0VBVkVfVEZGIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX3RmZl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfV0VBVkVfQkZGIChnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX2JmZl9nZXRfdHlwZSAoKSkKKworR1R5cGUgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF90b21zbW9jb21wX2dldF90eXBlICh2b2lkKTsKK0dUeXBlIGdzdF9kZWludGVybGFjZV9tZXRob2RfZ3JlZWR5X2hfZ2V0X3R5cGUgKHZvaWQpOworR1R5cGUgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9ncmVlZHlfbF9nZXRfdHlwZSAodm9pZCk7CitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3ZmaXJfZ2V0X3R5cGUgKHZvaWQpOworCitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9nZXRfdHlwZSAodm9pZCk7CitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX2xpbmVhcl9ibGVuZF9nZXRfdHlwZSAodm9pZCk7CitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3NjYWxlcl9ib2JfZ2V0X3R5cGUgKHZvaWQpOworR1R5cGUgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF93ZWF2ZV9nZXRfdHlwZSAodm9pZCk7CitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX3RmZl9nZXRfdHlwZSAodm9pZCk7CitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX2JmZl9nZXRfdHlwZSAodm9pZCk7CisKKyNlbmRpZiAvKiBUVlRJTUVfUExVR0lOU19IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3NjYWxlcmJvYi5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9zY2FsZXJib2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDIwYmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9zY2FsZXJib2IuYwpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIERvdWJsZSBsaW5lcworICogQ29weXJpZ2h0IChDKSAyMDA4LDIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGRlaW50ZXJsYWNlbWV0aG9kLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1NDQUxFUl9CT0IJKGdzdF9kZWludGVybGFjZV9tZXRob2Rfc2NhbGVyX2JvYl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9TQ0FMRVJfQk9CKG9iaikJCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9TQ0FMRVJfQk9CKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9TQ0FMRVJfQk9CX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9TQ0FMRVJfQk9CKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9TQ0FMRVJfQk9CX0dFVF9DTEFTUyhvYmopCShHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1NDQUxFUl9CT0IsIEdzdERlaW50ZXJsYWNlTWV0aG9kU2NhbGVyQm9iQ2xhc3MpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX1NDQUxFUl9CT0Iob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1NDQUxFUl9CT0IsIEdzdERlaW50ZXJsYWNlTWV0aG9kU2NhbGVyQm9iKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9TQ0FMRVJfQk9CX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9TQ0FMRVJfQk9CLCBHc3REZWludGVybGFjZU1ldGhvZFNjYWxlckJvYkNsYXNzKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9TQ0FMRVJfQk9CX0NBU1Qob2JqKQkoKEdzdERlaW50ZXJsYWNlTWV0aG9kU2NhbGVyQm9iKikob2JqKSkKKworR1R5cGUgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9zY2FsZXJfYm9iX2dldF90eXBlICh2b2lkKTsKKwordHlwZWRlZiBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCBHc3REZWludGVybGFjZU1ldGhvZFNjYWxlckJvYjsKK3R5cGVkZWYgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RDbGFzcyBHc3REZWludGVybGFjZU1ldGhvZFNjYWxlckJvYkNsYXNzOworCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT50MCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9zY2FubGluZV9zY2FsZXJfYm9iX3BsYW5hcl95IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+dDAsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wbGFuYXJfdSAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPnQwLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX3NjYWxlcl9ib2JfcGxhbmFyX3YgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT50MCwgc2l6ZSk7Cit9CisKK0dfREVGSU5FX1RZUEUgKEdzdERlaW50ZXJsYWNlTWV0aG9kU2NhbGVyQm9iLCBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3NjYWxlcl9ib2IsCisgICAgR1NUX1RZUEVfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3NjYWxlcl9ib2JfY2xhc3NfaW5pdCAoR3N0RGVpbnRlcmxhY2VNZXRob2RTY2FsZXJCb2JDbGFzcworICAgICoga2xhc3MpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKmRpbV9jbGFzcyA9IChHc3REZWludGVybGFjZU1ldGhvZENsYXNzICopIGtsYXNzOworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzICpkaXNtX2NsYXNzID0KKyAgICAgIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzICopIGtsYXNzOworCisgIGRpbV9jbGFzcy0+ZmllbGRzX3JlcXVpcmVkID0gMjsKKyAgZGltX2NsYXNzLT5uYW1lID0gIkRvdWJsZSBsaW5lcyI7CisgIGRpbV9jbGFzcy0+bmljayA9ICJzY2FsZXJib2IiOworICBkaW1fY2xhc3MtPmxhdGVuY3kgPSAxOworCisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2F5dXYgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3l1eTIgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3l2eXUgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3V5dnkgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MTIgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MjEgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2FyZ2IgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2FiZ3IgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3JnYmEgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2JncmEgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3JnYiA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3NjYWxlcl9ib2JfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3IgPSBkZWludGVybGFjZV9zY2FubGluZV9zY2FsZXJfYm9iX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3kgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wbGFuYXJfeTsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3UgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wbGFuYXJfdTsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3YgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfc2NhbGVyX2JvYl9wbGFuYXJfdjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2Rfc2NhbGVyX2JvYl9pbml0IChHc3REZWludGVybGFjZU1ldGhvZFNjYWxlckJvYiAqIHNlbGYpCit7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3NzZS5oIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9zc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTAwZWUwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS9zc2UuaApAQCAtMCwwICsxLDk5MiBAQAorLyoJc3NlLmgKKworCVN0cmVhbWluZyBTSU1EIEV4dGVuc3Rpb25zIChhLmsuYS4gS2F0bWFpIE5ldyBJbnN0cnVjdGlvbnMpCisJR0NDIGludGVyZmFjZSBsaWJyYXJ5IGZvciBJQTMyLgorCisJVG8gdXNlIHRoaXMgbGlicmFyeSwgc2ltcGx5IGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZQorCWFuZCBjb21waWxlIHdpdGggR0NDLiAgWW91IE1VU1QgaGF2ZSBpbmxpbmluZyBlbmFibGVkCisJaW4gb3JkZXIgZm9yIHNzZV9vaygpIHRvIHdvcms7IHRoaXMgY2FuIGJlIGRvbmUgYnkKKwlzaW1wbHkgdXNpbmcgLU8gb24gdGhlIEdDQyBjb21tYW5kIGxpbmUuCisKKwlDb21waWxpbmcgd2l0aCAtRFNTRV9UUkFDRSB3aWxsIGNhdXNlIGRldGFpbGVkIHRyYWNlCisJb3V0cHV0IHRvIGJlIHNlbnQgdG8gc3RkZXJyIGZvciBlYWNoIHNzZSBvcGVyYXRpb24uCisJVGhpcyBhZGRzIGxvdHMgb2YgY29kZSwgYW5kIG9idmlvdXNseSBzbG93cyBleGVjdXRpb24gdG8KKwlhIGNyYXdsLCBidXQgY2FuIGJlIHZlcnkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCisKKwlUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkKKwlFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCisJTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKwlBTkQgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworCTE5OTkgYnkgUi4gRmlzaGVyCisJQmFzZWQgb24gbGlibW14IGJ5IEguIERpZXR6IGFuZCBSLiBGaXNoZXIKKworIE5vdGVzOgorCVRoaXMgaXMgc3RpbGwgZXh0cmVtZWx5IGFscGhhLgorCUJlY2F1c2UgdGhpcyBsaWJyYXJ5IGRlcGVuZHMgb24gYW4gYXNzZW1ibGVyIHdoaWNoIHVuZGVyc3RhbmRzIHRoZQorCSBTU0Ugb3Bjb2RlcywgeW91IHByb2JhYmx5IHdvbid0IGJlIGFibGUgdG8gdXNlIHRoaXMgeWV0LgorCUZvciBub3csIGRvIG5vdCB1c2UgVFJBQ0UgdmVyc2lvbnMuICBUaGVzZSBib3RoIG1ha2UgdXNlCisJIG9mIHRoZSBNTVggcmVnaXN0ZXJzLCBub3QgdGhlIFNTRSByZWdpc3RlcnMuICBUaGlzIHdpbGwgYmUgcmVzb2x2ZWQKKwkgYXQgYSBsYXRlciBkYXRlLgorIFRvRG86CisJUmV3cml0ZSBUUkFDRSBtYWNyb3MKKwlNYWpvciBEZWJ1Z2dpbmcgV29yaworKi8KKworI2lmbmRlZiBfU1NFX0gKKyNkZWZpbmUgX1NTRV9ICisKKworCisvKglUaGUgdHlwZSBvZiBhbiB2YWx1ZSB0aGF0IGZpdHMgaW4gYW4gU1NFIHJlZ2lzdGVyCisJKG5vdGUgdGhhdCBsb25nIGxvbmcgY29uc3RhbnQgdmFsdWVzIE1VU1QgYmUgc3VmZml4ZWQKKwkgYnkgTEwgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZXMgYnkgVUxMLCBsZXN0CisJIHRoZXkgYmUgdHJ1bmNhdGVkIGJ5IHRoZSBjb21waWxlcikKKyovCit0eXBlZGVmCXVuaW9uIHsKKwlmbG9hdAkJCXNmWzRdOwkvKiBTaW5nbGUtcHJlY2lzaW9uICgzMi1iaXQpIHZhbHVlICovCit9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgxNikpKSBzc2VfdDsJLyogT24gYSAxNiBieXRlICgxMjgtYml0KSBib3VuZGFyeSAqLworCisKKyNpZiAwCisvKglGdW5jdGlvbiB0byB0ZXN0IGlmIG11bHRpbWVkaWEgaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQuLi4KKyovCitpbmxpbmUgZXh0ZXJuIGludAorbW1fc3VwcG9ydCh2b2lkKQoreworCS8qIFJldHVybnMgMSBpZiBNTVggaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQsCisJICAgMyBpZiBDeXJpeCBNTVggYW5kIEV4dGVuZGVkIE1NWCBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZAorCSAgIDUgaWYgQU1EIE1NWCBhbmQgM0ROb3chIGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkCisJICAgOSBpZiBNTVggYW5kIFNTRSBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZAorCSAgIDAgaWYgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBhbnkgb2YgdGhlc2UKKwkqLworCXJlZ2lzdGVyIGludCBydmFsID0gMDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJLyogU2VlIGlmIENQVUlEIGluc3RydWN0aW9uIGlzIHN1cHBvcnRlZCAuLi4gKi8KKwkJLyogLi4uIEdldCBjb3BpZXMgb2YgRUZMQUdTIGludG8gZWF4IGFuZCBlY3ggKi8KKwkJInB1c2hmXG5cdCIKKwkJInBvcGwgJSVlYXhcblx0IgorCQkibW92bCAlJWVheCwgJSVlY3hcblx0IgorCisJCS8qIC4uLiBUb2dnbGUgdGhlIElEIGJpdCBpbiBvbmUgY29weSBhbmQgc3RvcmUgKi8KKwkJLyogICAgIHRvIHRoZSBFRkxBR1MgcmVnICovCisJCSJ4b3JsICQweDIwMDAwMCwgJSVlYXhcblx0IgorCQkicHVzaCAlJWVheFxuXHQiCisJCSJwb3BmXG5cdCIKKworCQkvKiAuLi4gR2V0IHRoZSAoaG9wZWZ1bGx5IG1vZGlmaWVkKSBFRkxBR1MgKi8KKwkJInB1c2hmXG5cdCIKKwkJInBvcGwgJSVlYXhcblx0IgorCisJCS8qIC4uLiBDb21wYXJlIGFuZCB0ZXN0IHJlc3VsdCAqLworCQkieG9ybCAlJWVheCwgJSVlY3hcblx0IgorCQkidGVzdGwgJDB4MjAwMDAwLCAlJWVjeFxuXHQiCisJCSJqeiBOb3RTdXBwb3J0ZWQxXG5cdCIJCS8qIENQVUlEIG5vdCBzdXBwb3J0ZWQgKi8KKworCisJCS8qIEdldCBzdGFuZGFyZCBDUFVJRCBpbmZvcm1hdGlvbiwgYW5kCisJCSAgICAgICBnbyB0byBhIHNwZWNpZmljIHZlbmRvciBzZWN0aW9uICovCisJCSJtb3ZsICQwLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisKKwkJLyogQ2hlY2sgZm9yIEludGVsICovCisJCSJjbXBsICQweDc1NmU2NTQ3LCAlJWVieFxuXHQiCisJCSJqbmUgVHJ5QU1EXG5cdCIKKwkJImNtcGwgJDB4NDk2NTZlNjksICUlZWR4XG5cdCIKKwkJImpuZSBUcnlBTURcblx0IgorCQkiY21wbCAkMHg2YzY1NzQ2ZSwgJSVlY3hcbiIKKwkJImpuZSBUcnlBTURcblx0IgorCQkiam1wIEludGVsXG5cdCIKKworCQkvKiBDaGVjayBmb3IgQU1EICovCisJCSJcblRyeUFNRDpcblx0IgorCQkiY21wbCAkMHg2ODc0NzU0MSwgJSVlYnhcblx0IgorCQkiam5lIFRyeUN5cml4XG5cdCIKKwkJImNtcGwgJDB4Njk3NDZlNjUsICUlZWR4XG5cdCIKKwkJImpuZSBUcnlDeXJpeFxuXHQiCisJCSJjbXBsICQweDQ0NGQ0MTYzLCAlJWVjeFxuIgorCQkiam5lIFRyeUN5cml4XG5cdCIKKwkJImptcCBBTURcblx0IgorCisJCS8qIENoZWNrIGZvciBDeXJpeCAqLworCQkiXG5UcnlDeXJpeDpcblx0IgorCQkiY21wbCAkMHg2OTcyNzk0MywgJSVlYnhcblx0IgorCQkiam5lIE5vdFN1cHBvcnRlZDJcblx0IgorCQkiY21wbCAkMHg3MzZlNDk3OCwgJSVlZHhcblx0IgorCQkiam5lIE5vdFN1cHBvcnRlZDNcblx0IgorCQkiY21wbCAkMHg2NDYxNjU3NCwgJSVlY3hcblx0IgorCQkiam5lIE5vdFN1cHBvcnRlZDRcblx0IgorCQkvKiBEcm9wIHRocm91Z2ggdG8gQ3lyaXguLi4gKi8KKworCisJCS8qIEN5cml4IFNlY3Rpb24gKi8KKwkJLyogU2VlIGlmIGV4dGVuZGVkIENQVUlEIGxldmVsIDgwMDAwMDAxIGlzIHN1cHBvcnRlZCAqLworCQkvKiBUaGUgdmFsdWUgb2YgQ1BVSUQvODAwMDAwMDEgZm9yIHRoZSA2eDg2TVggaXMgdW5kZWZpbmVkCisJCSAgIGFjY29yZGluZyB0byB0aGUgQ3lyaXggQ1BVIERldGVjdGlvbiBHdWlkZSAoUHJlbGltaW5hcnkKKwkJICAgUmV2LiAxLjAxIHRhYmxlIDEpLCBzbyB3ZSdsbCBjaGVjayB0aGUgdmFsdWUgb2YgZWF4IGZvcgorCQkgICBDUFVJRC8wIHRvIHNlZSBpZiBzdGFuZGFyZCBDUFVJRCBsZXZlbCAyIGlzIHN1cHBvcnRlZC4KKwkJICAgQWNjb3JkaW5nIHRvIHRoZSB0YWJsZSwgdGhlIG9ubHkgQ1BVIHdoaWNoIHN1cHBvcnRzIGxldmVsCisJCSAgIDIgaXMgYWxzbyB0aGUgb25seSBvbmUgd2hpY2ggc3VwcG9ydHMgZXh0ZW5kZWQgQ1BVSUQgbGV2ZWxzLgorCQkqLworCQkiY21wbCAkMHgyLCAlJWVheFxuXHQiCisJCSJqbmUgTU1YdGVzdFxuXHQiCS8qIFVzZSBzdGFuZGFyZCBDUFVJRCBpbnN0ZWFkICovCisKKwkJLyogRXh0ZW5kZWQgQ1BVSUQgc3VwcG9ydGVkIChpbiB0aGVvcnkpLCBzbyBnZXQgZXh0ZW5kZWQKKwkJICAgZmVhdHVyZXMgKi8KKwkJIm1vdmwgJDB4ODAwMDAwMDEsICUlZWF4XG5cdCIKKwkJImNwdWlkXG5cdCIKKwkJInRlc3RsICQweDAwODAwMDAwLCAlJWVheFxuXHQiCS8qIFRlc3QgZm9yIE1NWCAqLworCQkianogTm90U3VwcG9ydGVkNVxuXHQiCQkvKiBNTVggbm90IHN1cHBvcnRlZCAqLworCQkidGVzdGwgJDB4MDEwMDAwMDAsICUlZWF4XG5cdCIJLyogVGVzdCBmb3IgRXh0J2QgTU1YICovCisJCSJqbnogRU1NWFN1cHBvcnRlZFxuXHQiCisJCSJtb3ZsICQxLCAlMDpcblxuXHQiCQkvKiBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cbiIKKwkJIkVNTVhTdXBwb3J0ZWQ6XG5cdCIKKwkJIm1vdmwgJDMsICUwOlxuXG5cdCIJCS8qIEVNTVggYW5kIE1NWCBTdXBwb3J0ZWQgKi8KKwkJImptcCBSZXR1cm5cblx0IgorCisKKwkJLyogQU1EIFNlY3Rpb24gKi8KKwkJIkFNRDpcblx0IgorCisJCS8qIFNlZSBpZiBleHRlbmRlZCBDUFVJRCBpcyBzdXBwb3J0ZWQgKi8KKwkJIm1vdmwgJDB4ODAwMDAwMDAsICUlZWF4XG5cdCIKKwkJImNwdWlkXG5cdCIKKwkJImNtcGwgJDB4ODAwMDAwMDAsICUlZWF4XG5cdCIKKwkJImpsIE1NWHRlc3Rcblx0IgkvKiBVc2Ugc3RhbmRhcmQgQ1BVSUQgaW5zdGVhZCAqLworCisJCS8qIEV4dGVuZGVkIENQVUlEIHN1cHBvcnRlZCwgc28gZ2V0IGV4dGVuZGVkIGZlYXR1cmVzICovCisJCSJtb3ZsICQweDgwMDAwMDAxLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisJCSJ0ZXN0bCAkMHgwMDgwMDAwMCwgJSVlZHhcblx0IgkvKiBUZXN0IGZvciBNTVggKi8KKwkJImp6IE5vdFN1cHBvcnRlZDZcblx0IgkJLyogTU1YIG5vdCBzdXBwb3J0ZWQgKi8KKwkJInRlc3RsICQweDgwMDAwMDAwLCAlJWVkeFxuXHQiCS8qIFRlc3QgZm9yIDNETm93ISAqLworCQkiam56IFRocmVlRE5vd1N1cHBvcnRlZFxuXHQiCisJCSJtb3ZsICQxLCAlMDpcblxuXHQiCQkvKiBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cbiIKKwkJIlRocmVlRE5vd1N1cHBvcnRlZDpcblx0IgorCQkibW92bCAkNSwgJTA6XG5cblx0IgkJLyogM0ROb3chIGFuZCBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cdCIKKworCisJCS8qIEludGVsIFNlY3Rpb24gKi8KKwkJIkludGVsOlxuXHQiCisKKwkJLyogQ2hlY2sgZm9yIFNTRSAqLworCQkiU1NFdGVzdDpcblx0IgorCQkibW92bCAkMSwgJSVlYXhcblx0IgorCQkiY3B1aWRcblx0IgorCQkidGVzdGwgJDB4MDIwMDAwMDAsICUlZWR4XG5cdCIJLyogVGVzdCBmb3IgU1NFICovCisJCSJqeiBNTVh0ZXN0XG5cdCIJCS8qIFNTRSBOb3Qgc3VwcG9ydGVkICovCisJCSJtb3ZsICQ5LCAlMDpcblxuXHQiCQkvKiBTU0UgU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cdCIKKworCQkvKiBDaGVjayBmb3IgTU1YICovCisJCSJNTVh0ZXN0OlxuXHQiCisJCSJtb3ZsICQxLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisJCSJ0ZXN0bCAkMHgwMDgwMDAwMCwgJSVlZHhcblx0IgkvKiBUZXN0IGZvciBNTVggKi8KKwkJImp6IE5vdFN1cHBvcnRlZDdcblx0IgkJLyogTU1YIE5vdCBzdXBwb3J0ZWQgKi8KKwkJIm1vdmwgJDEsICUwOlxuXG5cdCIJCS8qIE1NWCBTdXBwb3J0ZWQgKi8KKwkJImptcCBSZXR1cm5cblx0IgorCisJCS8qIE5vdGhpbmcgc3VwcG9ydGVkICovCisJCSJcbk5vdFN1cHBvcnRlZDE6XG5cdCIKKwkJIiNtb3ZsICQxMDEsICUwOlxuXG5cdCIKKwkJIlxuTm90U3VwcG9ydGVkMjpcblx0IgorCQkiI21vdmwgJDEwMiwgJTA6XG5cblx0IgorCQkiXG5Ob3RTdXBwb3J0ZWQzOlxuXHQiCisJCSIjbW92bCAkMTAzLCAlMDpcblxuXHQiCisJCSJcbk5vdFN1cHBvcnRlZDQ6XG5cdCIKKwkJIiNtb3ZsICQxMDQsICUwOlxuXG5cdCIKKwkJIlxuTm90U3VwcG9ydGVkNTpcblx0IgorCQkiI21vdmwgJDEwNSwgJTA6XG5cblx0IgorCQkiXG5Ob3RTdXBwb3J0ZWQ2OlxuXHQiCisJCSIjbW92bCAkMTA2LCAlMDpcblxuXHQiCisJCSJcbk5vdFN1cHBvcnRlZDc6XG5cdCIKKwkJIiNtb3ZsICQxMDcsICUwOlxuXG5cdCIKKwkJIm1vdmwgJDAsICUwOlxuXG5cdCIKKworCQkiUmV0dXJuOlxuXHQiCisJCTogIj1hIiAocnZhbCkKKwkJOiAvKiBubyBpbnB1dCAqLworCQk6ICJlYXgiLCAiZWJ4IiwgImVjeCIsICJlZHgiCisJKTsKKworCS8qIFJldHVybiAqLworCXJldHVybihydmFsKTsKK30KKworLyoJRnVuY3Rpb24gdG8gdGVzdCBpZiBzc2UgaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQuLi4KKyovCitpbmxpbmUgZXh0ZXJuIGludAorc3NlX29rKHZvaWQpCit7CisJLyogUmV0dXJucyAxIGlmIFNTRSBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZCwgMCBvdGhlcndpc2UgKi8KKwlyZXR1cm4gKCAobW1fc3VwcG9ydCgpICYgMHg4KSA+PiAzICApOworfQorI2VuZGlmCisKKworCisvKglIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgaW5zdHJ1Y3Rpb24gbWFjcm9zIHRoYXQgZm9sbG93Li4uCisJKG5vdGUgdGhhdCBtZW1vcnktdG8tcmVnaXN0ZXIsIG0yciwgaW5zdHJ1Y3Rpb25zIGFyZSBuZWFybHkKKwkgYXMgZWZmaWNpZW50IGFzIHJlZ2lzdGVyLXRvLXJlZ2lzdGVyLCByMnIsIGluc3RydWN0aW9uczsKKwkgaG93ZXZlciwgbWVtb3J5LXRvLW1lbW9yeSBpbnN0cnVjdGlvbnMgYXJlIHJlYWxseSBzaW11bGF0ZWQKKwkgYXMgYSBjb252ZW5pZW5jZSwgYW5kIGFyZSBvbmx5IDEvMyBhcyBlZmZpY2llbnQpCisqLworI2lmZGVmCVNTRV9UUkFDRQorCisvKglJbmNsdWRlIHRoZSBzdHVmZiBmb3IgcHJpbnRpbmcgYSB0cmFjZSB0byBzdGRlcnIuLi4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lCXNzZV9pMnIob3AsIGltbSwgcmVnKSBcCisJeyBcCisJCXNzZV90IHNzZV90cmFjZTsgXAorCQlzc2VfdHJhY2UudXEgPSAoaW1tKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI29wICJfaTJyKCIgI2ltbSAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCXNzZV90cmFjZS5kWzFdLCBzc2VfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChzc2VfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI3JlZyAiPTB4JTA4eCUwOHgpID0+ICIsIFwKKwkJCXNzZV90cmFjZS5kWzFdLCBzc2VfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUwLCAlJSIgI3JlZyBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCQkgICAgICA6ICJYIiAoaW1tKSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChzc2VfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI3JlZyAiPTB4JTA4eCUwOHhcbiIsIFwKKwkJCXNzZV90cmFjZS5kWzFdLCBzc2VfdHJhY2UuZFswXSk7IFwKKwl9CisKKyNkZWZpbmUJc3NlX20ycihvcCwgbWVtLCByZWcpIFwKKwl7IFwKKwkJc3NlX3Qgc3NlX3RyYWNlOyBcCisJCXNzZV90cmFjZSA9IChtZW0pOyBcCisJCWZwcmludGYoc3RkZXJyLCAjb3AgIl9tMnIoIiAjbWVtICI9MHglMDh4JTA4eCwgIiwgXAorCQkJc3NlX3RyYWNlLmRbMV0sIHNzZV90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWcgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKHNzZV90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjcmVnICI9MHglMDh4JTA4eCkgPT4gIiwgXAorCQkJc3NlX3RyYWNlLmRbMV0sIHNzZV90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAorCQkJCSAgICAgIDogIlgiIChtZW0pKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWcgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKHNzZV90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjcmVnICI9MHglMDh4JTA4eFxuIiwgXAorCQkJc3NlX3RyYWNlLmRbMV0sIHNzZV90cmFjZS5kWzBdKTsgXAorCX0KKworI2RlZmluZQlzc2VfcjJtKG9wLCByZWcsIG1lbSkgXAorCXsgXAorCQlzc2VfdCBzc2VfdHJhY2U7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChzc2VfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI29wICJfcjJtKCIgI3JlZyAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCXNzZV90cmFjZS5kWzFdLCBzc2VfdHJhY2UuZFswXSk7IFwKKwkJc3NlX3RyYWNlID0gKG1lbSk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNtZW0gIj0weCUwOHglMDh4KSA9PiAiLCBcCisJCQlzc2VfdHJhY2UuZFsxXSwgc3NlX3RyYWNlLmRbMF0pOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlJSIgI3JlZyAiLCAlMCIgXAorCQkJCSAgICAgIDogIj1YIiAobWVtKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJc3NlX3RyYWNlID0gKG1lbSk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNtZW0gIj0weCUwOHglMDh4XG4iLCBcCisJCQlzc2VfdHJhY2UuZFsxXSwgc3NlX3RyYWNlLmRbMF0pOyBcCisJfQorCisjZGVmaW5lCXNzZV9yMnIob3AsIHJlZ3MsIHJlZ2QpIFwKKwl7IFwKKwkJc3NlX3Qgc3NlX3RyYWNlOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZ3MgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKHNzZV90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjb3AgIl9yMnIoIiAjcmVncyAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCXNzZV90cmFjZS5kWzFdLCBzc2VfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnZCAiLCAlMCIgXAorCQkJCSAgICAgIDogIj1YIiAoc3NlX3RyYWNlKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNyZWdkICI9MHglMDh4JTA4eCkgPT4gIiwgXAorCQkJc3NlX3RyYWNlLmRbMV0sIHNzZV90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJSIgI3JlZ3MgIiwgJSIgI3JlZ2QpOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZ2QgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKHNzZV90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjcmVnZCAiPTB4JTA4eCUwOHhcbiIsIFwKKwkJCXNzZV90cmFjZS5kWzFdLCBzc2VfdHJhY2UuZFswXSk7IFwKKwl9CisKKyNkZWZpbmUJc3NlX20ybShvcCwgbWVtcywgbWVtZCkgXAorCXsgXAorCQlzc2VfdCBzc2VfdHJhY2U7IFwKKwkJc3NlX3RyYWNlID0gKG1lbXMpOyBcCisJCWZwcmludGYoc3RkZXJyLCAjb3AgIl9tMm0oIiAjbWVtcyAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCXNzZV90cmFjZS5kWzFdLCBzc2VfdHJhY2UuZFswXSk7IFwKKwkJc3NlX3RyYWNlID0gKG1lbWQpOyBcCisJCWZwcmludGYoc3RkZXJyLCAjbWVtZCAiPTB4JTA4eCUwOHgpID0+ICIsIFwKKwkJCXNzZV90cmFjZS5kWzFdLCBzc2VfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUwLCAlJW1tMFxuXHQiIFwKKwkJCQkgICAgICAjb3AgIiAlMSwgJSVtbTBcblx0IiBcCisJCQkJICAgICAgIm1vdnEgJSVtbTAsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtZW1kKSBcCisJCQkJICAgICAgOiAiWCIgKG1lbXMpKTsgXAorCQlzc2VfdHJhY2UgPSAobWVtZCk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNtZW1kICI9MHglMDh4JTA4eFxuIiwgXAorCQkJc3NlX3RyYWNlLmRbMV0sIHNzZV90cmFjZS5kWzBdKTsgXAorCX0KKworI2Vsc2UKKworLyoJVGhlc2UgbWFjcm9zIGFyZSBhIGxvdCBzaW1wbGVyIHdpdGhvdXQgdGhlIHRyYWNpbmcuLi4KKyovCisKKyNkZWZpbmUJc3NlX2kycihvcCwgaW1tLCByZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJYIiAoaW1tKSApCisKKyNkZWZpbmUJc3NlX20ycihvcCwgbWVtLCByZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJYIiAobWVtKSkKKworI2RlZmluZQlzc2VfcjJtKG9wLCByZWcsIG1lbSkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlJSIgI3JlZyAiLCAlMCIgXAorCQkJICAgICAgOiAiPVgiIChtZW0pIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyApCisKKyNkZWZpbmUJc3NlX3IycihvcCwgcmVncywgcmVnZCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlIiAjcmVncyAiLCAlIiAjcmVnZCkKKworI2RlZmluZQlzc2VfcjJyaShvcCwgcmVncywgcmVnZCwgaW1tKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUwLCAlJSIgI3JlZ3MgIiwgJSUiICNyZWdkIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJYIiAoaW1tKSApCisKKy8qIExvYWQgZGF0YSBmcm9tIG1lbXMgdG8geG1tcmVnLCBvcGVyYXRlIG9uIHhtbXJlZywgYW5kIHN0b3JlIGRhdGEgdG8gbWVtZCAqLworI2RlZmluZQlzc2VfbTJtKG9wLCBtZW1zLCBtZW1kLCB4bW1yZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnVwcyAlMCwgJSV4bW0wXG5cdCIgXAorCQkJICAgICAgI29wICIgJTEsICUleG1tMFxuXHQiIFwKKwkJCSAgICAgICJtb3Z1cHMgJSVtbTAsICUwIiBcCisJCQkgICAgICA6ICI9WCIgKG1lbWQpIFwKKwkJCSAgICAgIDogIlgiIChtZW1zKSkKKworI2RlZmluZQlzc2VfbTJyaShvcCwgbWVtLCByZWcsIHN1Ym9wKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUwLCAlJSIgI3JlZyAiLCAiICNzdWJvcCBcCisJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAorCQkJICAgICAgOiAiWCIgKG1lbSkpCisKKyNkZWZpbmUJc3NlX20ybWkob3AsIG1lbXMsIG1lbWQsIHhtbXJlZywgc3Vib3ApIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnVwcyAlMCwgJSV4bW0wXG5cdCIgXAorCQkJICAgICAgI29wICIgJTEsICUleG1tMCwgIiAjc3Vib3AgIlxuXHQiIFwKKwkJCSAgICAgICJtb3Z1cHMgJSVtbTAsICUwIiBcCisJCQkgICAgICA6ICI9WCIgKG1lbWQpIFwKKwkJCSAgICAgIDogIlgiIChtZW1zKSkKKyNlbmRpZgorCisKKworCisvKgkxeDEyOCBNT1ZlIEFsaWduZWQgZm91ciBQYWNrZWQgU2luZ2xlLWZwCisqLworI2RlZmluZQltb3ZhcHNfbTJyKHZhciwgcmVnKQlzc2VfbTJyKG1vdmFwcywgdmFyLCByZWcpCisjZGVmaW5lCW1vdmFwc19yMm0ocmVnLCB2YXIpCXNzZV9yMm0obW92YXBzLCByZWcsIHZhcikKKyNkZWZpbmUJbW92YXBzX3IycihyZWdzLCByZWdkKQlzc2VfcjJyKG1vdmFwcywgcmVncywgcmVnZCkKKyNkZWZpbmUJbW92YXBzKHZhcnMsIHZhcmQpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmFwcyAlMSwgJSVtbTBcblx0IiBcCisJCQkgICAgICAibW92YXBzICUlbW0wLCAlMCIgXAorCQkJICAgICAgOiAiPVgiICh2YXJkKSBcCisJCQkgICAgICA6ICJYIiAodmFycykpCisKKworLyoJMXgxMjggTU9WZSBhbGlnbmVkIE5vbi1UZW1wb3JhbCBmb3VyIFBhY2tlZCBTaW5nbGUtZnAKKyovCisjZGVmaW5lCW1vdm50cHNfcjJtKHhtbXJlZywgdmFyKQlzc2VfcjJtKG1vdm50cHMsIHhtbXJlZywgdmFyKQorCisKKy8qCTF4NjQgTU9WZSBOb24tVGVtcG9yYWwgUXVhZHdvcmQKKyovCisjZGVmaW5lCW1vdm50cV9yMm0obW1yZWcsIHZhcikJCXNzZV9yMm0obW92bnRxLCBtbXJlZywgdmFyKQorCisKKy8qCTF4MTI4IE1PVmUgVW5hbGlnbmVkIGZvdXIgUGFja2VkIFNpbmdsZS1mcAorKi8KKyNkZWZpbmUJbW92dXBzX20ycih2YXIsIHJlZykJc3NlX20ycihtb3Z1cHMsIHZhciwgcmVnKQorI2RlZmluZQltb3Z1cHNfcjJtKHJlZywgdmFyKQlzc2VfcjJtKG1vdnVwcywgcmVnLCB2YXIpCisjZGVmaW5lCW1vdnVwc19yMnIocmVncywgcmVnZCkJc3NlX3Iycihtb3Z1cHMsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCW1vdnVwcyh2YXJzLCB2YXJkKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3Z1cHMgJTEsICUlbW0wXG5cdCIgXAorCQkJICAgICAgIm1vdnVwcyAlJW1tMCwgJTAiIFwKKwkJCSAgICAgIDogIj1YIiAodmFyZCkgXAorCQkJICAgICAgOiAiWCIgKHZhcnMpKQorCisKKy8qCU1PVmUgSGlnaCB0byBMb3cgUGFja2VkIFNpbmdsZS1mcAorCWhpZ2ggaGFsZiBvZiA0eDMyZiAoeCkgLT4gbG93IGhhbGYgb2YgNHgzMmYgKHkpCisqLworI2RlZmluZQltb3ZobHBzX3IycihyZWdzLCByZWdkKQlzc2VfcjJyKG1vdmhscHMsIHJlZ3MsIHJlZ2QpCisKKworLyoJTU9WZSBMb3cgdG8gSGlnaCBQYWNrZWQgU2luZ2xlLWZwCisJbG93IGhhbGYgb2YgNHgzMmYgKHgpIC0+IGhpZ2ggaGFsZiBvZiA0eDMyZiAoeSkKKyovCisjZGVmaW5lCW1vdmxocHNfcjJyKHJlZ3MsIHJlZ2QpCXNzZV9yMnIobW92bGhwcywgcmVncywgcmVnZCkKKworCisvKglNT1ZlIEhpZ2ggUGFja2VkIFNpbmdsZS1mcAorCTJ4MzJmIC0+IGhpZ2ggaGFsZiBvZiA0eDMyZgorKi8KKyNkZWZpbmUJbW92aHBzX20ycih2YXIsIHJlZykJc3NlX20ycihtb3ZocHMsIHZhciwgcmVnKQorI2RlZmluZQltb3ZocHNfcjJtKHJlZywgdmFyKQlzc2VfcjJtKG1vdmhwcywgcmVnLCB2YXIpCisjZGVmaW5lCW1vdmhwcyh2YXJzLCB2YXJkKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZocHMgJTEsICUlbW0wXG5cdCIgXAorCQkJICAgICAgIm1vdmhwcyAlJW1tMCwgJTAiIFwKKwkJCSAgICAgIDogIj1YIiAodmFyZCkgXAorCQkJICAgICAgOiAiWCIgKHZhcnMpKQorCisKKy8qCU1PVmUgTG93IFBhY2tlZCBTaW5nbGUtZnAKKwkyeDMyZiAtPiBsb3cgaGFsZiBvZiA0eDMyZgorKi8KKyNkZWZpbmUJbW92bHBzX20ycih2YXIsIHJlZykJc3NlX20ycihtb3ZscHMsIHZhciwgcmVnKQorI2RlZmluZQltb3ZscHNfcjJtKHJlZywgdmFyKQlzc2VfcjJtKG1vdmxwcywgcmVnLCB2YXIpCisjZGVmaW5lCW1vdmxwcyh2YXJzLCB2YXJkKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZscHMgJTEsICUlbW0wXG5cdCIgXAorCQkJICAgICAgIm1vdmxwcyAlJW1tMCwgJTAiIFwKKwkJCSAgICAgIDogIj1YIiAodmFyZCkgXAorCQkJICAgICAgOiAiWCIgKHZhcnMpKQorCisKKy8qCU1PVmUgU2NhbGFyIFNpbmdsZS1mcAorCWxvd2VzdCBmaWVsZCBvZiA0eDMyZiAoeCkgLT4gbG93ZXN0IGZpZWxkIG9mIDR4MzJmICh5KQorKi8KKyNkZWZpbmUJbW92c3NfbTJyKHZhciwgcmVnKQlzc2VfbTJyKG1vdnNzLCB2YXIsIHJlZykKKyNkZWZpbmUJbW92c3NfcjJtKHJlZywgdmFyKQlzc2VfcjJtKG1vdnNzLCByZWcsIHZhcikKKyNkZWZpbmUJbW92c3NfcjJyKHJlZ3MsIHJlZ2QpCXNzZV9yMnIobW92c3MsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCW1vdnNzKHZhcnMsIHZhcmQpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnNzICUxLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICJtb3ZzcyAlJW1tMCwgJTAiIFwKKwkJCSAgICAgIDogIj1YIiAodmFyZCkgXAorCQkJICAgICAgOiAiWCIgKHZhcnMpKQorCisKKy8qCTR4MTYgUGFja2VkIFNIVUZmbGUgV29yZAorKi8KKyNkZWZpbmUJcHNodWZ3X20ycih2YXIsIHJlZywgaW5kZXgpCXNzZV9tMnJpKHBzaHVmdywgdmFyLCByZWcsIGluZGV4KQorI2RlZmluZQlwc2h1ZndfcjJyKHJlZ3MsIHJlZ2QsIGluZGV4KQlzc2VfcjJyaShwc2h1ZncsIHJlZ3MsIHJlZ2QsIGluZGV4KQorCisKKy8qCTF4MTI4IFNIVUZmbGUgUGFja2VkIFNpbmdsZS1mcAorKi8KKyNkZWZpbmUJc2h1ZnBzX20ycih2YXIsIHJlZywgaW5kZXgpCXNzZV9tMnJpKHNodWZwcywgdmFyLCByZWcsIGluZGV4KQorI2RlZmluZQlzaHVmcHNfcjJyKHJlZ3MsIHJlZ2QsIGluZGV4KQlzc2VfcjJyaShzaHVmcHMsIHJlZ3MsIHJlZ2QsIGluZGV4KQorCisKKy8qCUNvblZlclQgUGFja2VkIHNpZ25lZCBJbnQzMiB0bygyKSBQYWNrZWQgU2luZ2xlLWZwCisqLworI2RlZmluZQljdnRwaTJwc19tMnIodmFyLCB4bW1yZWcpCXNzZV9tMnIoY3Z0cGkycHMsIHZhciwgeG1tcmVnKQorI2RlZmluZQljdnRwaTJwc19yMnIobW1yZWcsIHhtbXJlZykJc3NlX3IycihjdnRwaTJwcywgbW1yZWcsIHhtbXJlZykKKworCisvKglDb25WZXJUIFBhY2tlZCBTaW5nbGUtZnAgdG8oMikgUGFja2VkIHNpZ25lZCBJbnQzMgorKi8KKyNkZWZpbmUJY3Z0cHMycGlfbTJyKHZhciwgbW1yZWcpCXNzZV9tMnIoY3Z0cHMycGksIHZhciwgbW1yZWcpCisjZGVmaW5lCWN2dHBzMnBpX3Iycih4bW1yZWcsIG1tcmVnKQlzc2VfcjJyKGN2dHBzMnBpLCBtbXJlZywgeG1tcmVnKQorCisKKy8qCUNvblZlclQgd2l0aCBUcnVuY2F0ZSBQYWNrZWQgU2luZ2xlLWZwIHRvKDIpIFBhY2tlZCBJbnQzMgorKi8KKyNkZWZpbmUJY3Z0dHBzMnBpX20ycih2YXIsIG1tcmVnKQlzc2VfbTJyKGN2dHRwczJwaSwgdmFyLCBtbXJlZykKKyNkZWZpbmUJY3Z0dHBzMnBpX3Iycih4bW1yZWcsIG1tcmVnKQlzc2VfcjJyKGN2dHRwczJwaSwgbW1yZWcsIHhtbXJlZykKKworCisvKglDb25WZXJUIFNpZ25lZCBJbnQzMiB0bygyKSBTaW5nbGUtZnAgKFNjYWxhcikKKyovCisjZGVmaW5lCWN2dHNpMnNzX20ycih2YXIsIHhtbXJlZykJc3NlX20ycihjdnRzaTJzcywgdmFyLCB4bW1yZWcpCisjZGVmaW5lCWN2dHNpMnNzX3IycihyZWcsIHhtbXJlZykJc3NlX3IycihjdnRzaTJzcywgcmVnLCB4bW1yZWcpCisKKworLyoJQ29uVmVyVCBTY2FsYXIgU2luZ2xlLWZwIHRvKDIpIFNpZ25lZCBJbnQzMgorKi8KKyNkZWZpbmUJY3Z0c3Myc2lfbTJyKHZhciwgcmVnKQkJc3NlX20ycihjdnRzczJzaSwgdmFyLCByZWcpCisjZGVmaW5lCWN2dHNzMnNpX3Iycih4bW1yZWcsIHJlZykJc3NlX3IycihjdnRzczJzaSwgeG1tcmVnLCByZWcpCisKKworLyoJQ29uVmVyVCB3aXRoIFRydW5jYXRlIFNjYWxhciBTaW5nbGUtZnAgdG8oMikgU2lnbmVkIEludDMyCisqLworI2RlZmluZQljdnR0c3Myc2lfbTJyKHZhciwgcmVnKQkJc3NlX20ycihjdnRzczJzaSwgdmFyLCByZWcpCisjZGVmaW5lCWN2dHRzczJzaV9yMnIoeG1tcmVnLCByZWcpCXNzZV9yMnIoY3Z0c3Myc2ksIHhtbXJlZywgcmVnKQorCisKKy8qCVBhcmFsbGVsIEVYVFJhY3QgV29yZCBmcm9tIDR4MTYKKyovCisjZGVmaW5lCXBleHRyd19yMnIobW1yZWcsIHJlZywgZmllbGQpCXNzZV9yMnJpKHBleHRydywgbW1yZWcsIHJlZywgZmllbGQpCisKKworLyoJUGFyYWxsZWwgSU5TZVJ0IFdvcmQgZnJvbSA0eDE2CisqLworI2RlZmluZQlwaW5zcndfcjJyKHJlZywgbW1yZWcsIGZpZWxkKQlzc2VfcjJyaShwaW5zcncsIHJlZywgbW1yZWcsIGZpZWxkKQorCisKKworLyoJTU9WZSBNYVNLIGZyb20gUGFja2VkIFNpbmdsZS1mcAorKi8KKyNpZmRlZglTU0VfVFJBQ0UKKwkjZGVmaW5lCW1vdm1za3BzKHhtbXJlZywgcmVnKSBcCisJeyBcCisJCWZwcmludGYoc3RkZXJyLCAibW92bXNrcHMoKVxuIik7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3Ztc2twcyAlIiAjeG1tcmVnICIsICUiICNyZWcpIFwKKwl9CisjZWxzZQorCSNkZWZpbmUJbW92bXNrcHMoeG1tcmVnLCByZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdm1za3BzICUiICN4bW1yZWcgIiwgJSIgI3JlZykKKyNlbmRpZgorCisKKy8qCVBhcmFsbGVsIE1PVmUgTWFTSyBmcm9tIG1teCByZWcgdG8gMzItYml0IHJlZworKi8KKyNpZmRlZglTU0VfVFJBQ0UKKwkjZGVmaW5lCXBtb3Ztc2tiKG1tcmVnLCByZWcpIFwKKwl7IFwKKwkJZnByaW50ZihzdGRlcnIsICJtb3Ztc2twcygpXG4iKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdm1za3BzICUiICNtbXJlZyAiLCAlIiAjcmVnKSBcCisJfQorI2Vsc2UKKwkjZGVmaW5lCXBtb3Ztc2tiKG1tcmVnLCByZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdm1za3BzICUiICNtbXJlZyAiLCAlIiAjcmVnKQorI2VuZGlmCisKKworLyoJTUFTS2VkIE1PVmUgZnJvbSA4eDggdG8gbWVtb3J5IHBvaW50ZWQgdG8gYnkgKGUpZGkgcmVnaXN0ZXIKKyovCisjZGVmaW5lCW1hc2ttb3ZxKG1tcmVncywgZmllbGRyZWcpCXNzZV9yMnJpKG1hc2ttb3ZxLCBtbXJlZ3MsIGZpZWxkcmVnKQorCisKKworCisvKgk0eDMyZiBQYXJhbGxlbCBBRERzCisqLworI2RlZmluZQlhZGRwc19tMnIodmFyLCByZWcpCQlzc2VfbTJyKGFkZHBzLCB2YXIsIHJlZykKKyNkZWZpbmUJYWRkcHNfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKGFkZHBzLCByZWdzLCByZWdkKQorI2RlZmluZQlhZGRwcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm0oYWRkcHMsIHZhcnMsIHZhcmQsIHhtbXJlZykKKworCisvKglMb3dlc3QgRmllbGQgb2YgNHgzMmYgUGFyYWxsZWwgQUREcworKi8KKyNkZWZpbmUJYWRkc3NfbTJyKHZhciwgcmVnKQkJc3NlX20ycihhZGRzcywgdmFyLCByZWcpCisjZGVmaW5lCWFkZHNzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycihhZGRzcywgcmVncywgcmVnZCkKKyNkZWZpbmUJYWRkc3ModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtKGFkZHNzLCB2YXJzLCB2YXJkLCB4bW1yZWcpCisKKworLyoJNHgzMmYgUGFyYWxsZWwgU1VCcworKi8KKyNkZWZpbmUJc3VicHNfbTJyKHZhciwgcmVnKQkJc3NlX20ycihzdWJwcywgdmFyLCByZWcpCisjZGVmaW5lCXN1YnBzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycihzdWJwcywgcmVncywgcmVnZCkKKyNkZWZpbmUJc3VicHModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtKHN1YnBzLCB2YXJzLCB2YXJkLCB4bW1yZWcpCisKKworLyoJTG93ZXN0IEZpZWxkIG9mIDR4MzJmIFBhcmFsbGVsIFNVQnMKKyovCisjZGVmaW5lCXN1YnNzX20ycih2YXIsIHJlZykJCXNzZV9tMnIoc3Vic3MsIHZhciwgcmVnKQorI2RlZmluZQlzdWJzc19yMnIocmVncywgcmVnZCkJCXNzZV9yMnIoc3Vic3MsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXN1YnNzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybShzdWJzcywgdmFycywgdmFyZCwgeG1tcmVnKQorCisKKy8qCTh4OHUgLT4gNHgxNnUgUGFja2VkIFN1bSBvZiBBYnNvbHV0ZSBEaWZmZXJlbmNlcworKi8KKyNkZWZpbmUJcHNhZGJ3X20ycih2YXIsIHJlZykJCXNzZV9tMnIocHNhZGJ3LCB2YXIsIHJlZykKKyNkZWZpbmUJcHNhZGJ3X3IycihyZWdzLCByZWdkKQkJc3NlX3Iycihwc2FkYncsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzYWRidyh2YXJzLCB2YXJkLCBtbXJlZykJc3NlX20ybShwc2FkYncsIHZhcnMsIHZhcmQsIG1tcmVnKQorCisKKy8qCTR4MTZ1IFBhcmFsbGVsIE1VTCBIaWdoIFVuc2lnbmVkCisqLworI2RlZmluZQlwbXVsaHV3X20ycih2YXIsIHJlZykJCXNzZV9tMnIocG11bGh1dywgdmFyLCByZWcpCisjZGVmaW5lCXBtdWxodXdfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKHBtdWxodXcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBtdWxodXcodmFycywgdmFyZCwgbW1yZWcpCXNzZV9tMm0ocG11bGh1dywgdmFycywgdmFyZCwgbW1yZWcpCisKKworLyoJNHgzMmYgUGFyYWxsZWwgTVVMcworKi8KKyNkZWZpbmUJbXVscHNfbTJyKHZhciwgcmVnKQkJc3NlX20ycihtdWxwcywgdmFyLCByZWcpCisjZGVmaW5lCW11bHBzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycihtdWxwcywgcmVncywgcmVnZCkKKyNkZWZpbmUJbXVscHModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtKG11bHBzLCB2YXJzLCB2YXJkLCB4bW1yZWcpCisKKworLyoJTG93ZXN0IEZpZWxkIG9mIDR4MzJmIFBhcmFsbGVsIE1VTHMKKyovCisjZGVmaW5lCW11bHNzX20ycih2YXIsIHJlZykJCXNzZV9tMnIobXVsc3MsIHZhciwgcmVnKQorI2RlZmluZQltdWxzc19yMnIocmVncywgcmVnZCkJCXNzZV9yMnIobXVsc3MsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCW11bHNzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybShtdWxzcywgdmFycywgdmFyZCwgeG1tcmVnKQorCisKKy8qCTR4MzJmIFBhcmFsbGVsIERJVnMKKyovCisjZGVmaW5lCWRpdnBzX20ycih2YXIsIHJlZykJCXNzZV9tMnIoZGl2cHMsIHZhciwgcmVnKQorI2RlZmluZQlkaXZwc19yMnIocmVncywgcmVnZCkJCXNzZV9yMnIoZGl2cHMsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCWRpdnBzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybShkaXZwcywgdmFycywgdmFyZCwgeG1tcmVnKQorCisKKy8qCUxvd2VzdCBGaWVsZCBvZiA0eDMyZiBQYXJhbGxlbCBESVZzCisqLworI2RlZmluZQlkaXZzc19tMnIodmFyLCByZWcpCQlzc2VfbTJyKGRpdnNzLCB2YXIsIHJlZykKKyNkZWZpbmUJZGl2c3NfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKGRpdnNzLCByZWdzLCByZWdkKQorI2RlZmluZQlkaXZzcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm0oZGl2c3MsIHZhcnMsIHZhcmQsIHhtbXJlZykKKworCisvKgk0eDMyZiBQYXJhbGxlbCBSZWNpcHJvY2FscworKi8KKyNkZWZpbmUJcmNwcHNfbTJyKHZhciwgcmVnKQkJc3NlX20ycihyY3BwcywgdmFyLCByZWcpCisjZGVmaW5lCXJjcHBzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycihyY3BwcywgcmVncywgcmVnZCkKKyNkZWZpbmUJcmNwcHModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtKHJjcHBzLCB2YXJzLCB2YXJkLCB4bW1yZWcpCisKKworLyoJTG93ZXN0IEZpZWxkIG9mIDR4MzJmIFBhcmFsbGVsIFJlY2lwcm9jYWxzCisqLworI2RlZmluZQlyY3Bzc19tMnIodmFyLCByZWcpCQlzc2VfbTJyKHJjcHNzLCB2YXIsIHJlZykKKyNkZWZpbmUJcmNwc3NfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKHJjcHNzLCByZWdzLCByZWdkKQorI2RlZmluZQlyY3Bzcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm0ocmNwc3MsIHZhcnMsIHZhcmQsIHhtbXJlZykKKworCisvKgk0eDMyZiBQYXJhbGxlbCBTcXVhcmUgUm9vdCBvZiBSZWNpcHJvY2FscworKi8KKyNkZWZpbmUJcnNxcnRwc19tMnIodmFyLCByZWcpCQlzc2VfbTJyKHJzcXJ0cHMsIHZhciwgcmVnKQorI2RlZmluZQlyc3FydHBzX3IycihyZWdzLCByZWdkKQkJc3NlX3Iycihyc3FydHBzLCByZWdzLCByZWdkKQorI2RlZmluZQlyc3FydHBzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybShyc3FydHBzLCB2YXJzLCB2YXJkLCB4bW1yZWcpCisKKworLyoJTG93ZXN0IEZpZWxkIG9mIDR4MzJmIFBhcmFsbGVsIFNxdWFyZSBSb290IG9mIFJlY2lwcm9jYWxzCisqLworI2RlZmluZQlyc3FydHNzX20ycih2YXIsIHJlZykJCXNzZV9tMnIocnNxcnRzcywgdmFyLCByZWcpCisjZGVmaW5lCXJzcXJ0c3NfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKHJzcXJ0c3MsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXJzcXJ0c3ModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtKHJzcXJ0c3MsIHZhcnMsIHZhcmQsIHhtbXJlZykKKworCisvKgk0eDMyZiBQYXJhbGxlbCBTcXVhcmUgUm9vdHMKKyovCisjZGVmaW5lCXNxcnRwc19tMnIodmFyLCByZWcpCQlzc2VfbTJyKHNxcnRwcywgdmFyLCByZWcpCisjZGVmaW5lCXNxcnRwc19yMnIocmVncywgcmVnZCkJCXNzZV9yMnIoc3FydHBzLCByZWdzLCByZWdkKQorI2RlZmluZQlzcXJ0cHModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtKHNxcnRwcywgdmFycywgdmFyZCwgeG1tcmVnKQorCisKKy8qCUxvd2VzdCBGaWVsZCBvZiA0eDMyZiBQYXJhbGxlbCBTcXVhcmUgUm9vdHMKKyovCisjZGVmaW5lCXNxcnRzc19tMnIodmFyLCByZWcpCQlzc2VfbTJyKHNxcnRzcywgdmFyLCByZWcpCisjZGVmaW5lCXNxcnRzc19yMnIocmVncywgcmVnZCkJCXNzZV9yMnIoc3FydHNzLCByZWdzLCByZWdkKQorI2RlZmluZQlzcXJ0c3ModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtKHNxcnRzcywgdmFycywgdmFyZCwgeG1tcmVnKQorCisKKy8qCTh4OHUgYW5kIDR4MTZ1IFBhcmFsbGVsIEFWZXJhR2UKKyovCisjZGVmaW5lCXBhdmdiX20ycih2YXIsIHJlZykJCXNzZV9tMnIocGF2Z2IsIHZhciwgcmVnKQorI2RlZmluZQlwYXZnYl9yMnIocmVncywgcmVnZCkJCXNzZV9yMnIocGF2Z2IsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBhdmdiKHZhcnMsIHZhcmQsIG1tcmVnKQlzc2VfbTJtKHBhdmdiLCB2YXJzLCB2YXJkLCBtbXJlZykKKworI2RlZmluZQlwYXZnd19tMnIodmFyLCByZWcpCQlzc2VfbTJyKHBhdmd3LCB2YXIsIHJlZykKKyNkZWZpbmUJcGF2Z3dfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKHBhdmd3LCByZWdzLCByZWdkKQorI2RlZmluZQlwYXZndyh2YXJzLCB2YXJkLCBtbXJlZykJc3NlX20ybShwYXZndywgdmFycywgdmFyZCwgbW1yZWcpCisKKworLyoJMXgxMjggYml0d2lzZSBBTkQKKyovCisjZGVmaW5lCWFuZHBzX20ycih2YXIsIHJlZykJCXNzZV9tMnIoYW5kcHMsIHZhciwgcmVnKQorI2RlZmluZQlhbmRwc19yMnIocmVncywgcmVnZCkJCXNzZV9yMnIoYW5kcHMsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCWFuZHBzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybShhbmRwcywgdmFycywgdmFyZCwgeG1tcmVnKQorCisKKy8qCTF4MTI4IGJpdHdpc2UgQU5EIHdpdGggTm90IHRoZSBkZXN0aW5hdGlvbgorKi8KKyNkZWZpbmUJYW5kbnBzX20ycih2YXIsIHJlZykJCXNzZV9tMnIoYW5kbnBzLCB2YXIsIHJlZykKKyNkZWZpbmUJYW5kbnBzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycihhbmRucHMsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCWFuZG5wcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm0oYW5kbnBzLCB2YXJzLCB2YXJkLCB4bW1yZWcpCisKKworLyoJMXgxMjggYml0d2lzZSBPUgorKi8KKyNkZWZpbmUJb3Jwc19tMnIodmFyLCByZWcpCQlzc2VfbTJyKG9ycHMsIHZhciwgcmVnKQorI2RlZmluZQlvcnBzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycihvcnBzLCByZWdzLCByZWdkKQorI2RlZmluZQlvcnBzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybShvcnBzLCB2YXJzLCB2YXJkLCB4bW1yZWcpCisKKworLyoJMXgxMjggYml0d2lzZSBlWGNsdXNpdmUgT1IKKyovCisjZGVmaW5lCXhvcnBzX20ycih2YXIsIHJlZykJCXNzZV9tMnIoeG9ycHMsIHZhciwgcmVnKQorI2RlZmluZQl4b3Jwc19yMnIocmVncywgcmVnZCkJCXNzZV9yMnIoeG9ycHMsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXhvcnBzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybSh4b3JwcywgdmFycywgdmFyZCwgeG1tcmVnKQorCisKKy8qCTh4OHUsIDR4MTYsIGFuZCA0eDMyZiBQYXJhbGxlbCBNYXhpbXVtCisqLworI2RlZmluZQlwbWF4dWJfbTJyKHZhciwgcmVnKQkJc3NlX20ycihwbWF4dWIsIHZhciwgcmVnKQorI2RlZmluZQlwbWF4dWJfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKHBtYXh1YiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcG1heHViKHZhcnMsIHZhcmQsIG1tcmVnKQlzc2VfbTJtKHBtYXh1YiwgdmFycywgdmFyZCwgbW1yZWcpCisKKyNkZWZpbmUJcG1heHN3X20ycih2YXIsIHJlZykJCXNzZV9tMnIocG1heHN3LCB2YXIsIHJlZykKKyNkZWZpbmUJcG1heHN3X3IycihyZWdzLCByZWdkKQkJc3NlX3IycihwbWF4c3csIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBtYXhzdyh2YXJzLCB2YXJkLCBtbXJlZykJc3NlX20ybShwbWF4c3csIHZhcnMsIHZhcmQsIG1tcmVnKQorCisjZGVmaW5lCW1heHBzX20ycih2YXIsIHJlZykJCXNzZV9tMnIobWF4cHMsIHZhciwgcmVnKQorI2RlZmluZQltYXhwc19yMnIocmVncywgcmVnZCkJCXNzZV9yMnIobWF4cHMsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCW1heHBzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybShtYXhwcywgdmFycywgdmFyZCwgeG1tcmVnKQorCisKKy8qCUxvd2VzdCBGaWVsZCBvZiA0eDMyZiBQYXJhbGxlbCBNYXhpbXVtCisqLworI2RlZmluZQltYXhzc19tMnIodmFyLCByZWcpCQlzc2VfbTJyKG1heHNzLCB2YXIsIHJlZykKKyNkZWZpbmUJbWF4c3NfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKG1heHNzLCByZWdzLCByZWdkKQorI2RlZmluZQltYXhzcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm0obWF4c3MsIHZhcnMsIHZhcmQsIHhtbXJlZykKKworCisvKgk4eDh1LCA0eDE2LCBhbmQgNHgzMmYgUGFyYWxsZWwgTWluaW11bQorKi8KKyNkZWZpbmUJcG1pbnViX20ycih2YXIsIHJlZykJCXNzZV9tMnIocG1pbnViLCB2YXIsIHJlZykKKyNkZWZpbmUJcG1pbnViX3IycihyZWdzLCByZWdkKQkJc3NlX3IycihwbWludWIsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBtaW51Yih2YXJzLCB2YXJkLCBtbXJlZykJc3NlX20ybShwbWludWIsIHZhcnMsIHZhcmQsIG1tcmVnKQorCisjZGVmaW5lCXBtaW5zd19tMnIodmFyLCByZWcpCQlzc2VfbTJyKHBtaW5zdywgdmFyLCByZWcpCisjZGVmaW5lCXBtaW5zd19yMnIocmVncywgcmVnZCkJCXNzZV9yMnIocG1pbnN3LCByZWdzLCByZWdkKQorI2RlZmluZQlwbWluc3codmFycywgdmFyZCwgbW1yZWcpCXNzZV9tMm0ocG1pbnN3LCB2YXJzLCB2YXJkLCBtbXJlZykKKworI2RlZmluZQltaW5wc19tMnIodmFyLCByZWcpCQlzc2VfbTJyKG1pbnBzLCB2YXIsIHJlZykKKyNkZWZpbmUJbWlucHNfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKG1pbnBzLCByZWdzLCByZWdkKQorI2RlZmluZQltaW5wcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm0obWlucHMsIHZhcnMsIHZhcmQsIHhtbXJlZykKKworCisvKglMb3dlc3QgRmllbGQgb2YgNHgzMmYgUGFyYWxsZWwgTWluaW11bQorKi8KKyNkZWZpbmUJbWluc3NfbTJyKHZhciwgcmVnKQkJc3NlX20ycihtaW5zcywgdmFyLCByZWcpCisjZGVmaW5lCW1pbnNzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycihtaW5zcywgcmVncywgcmVnZCkKKyNkZWZpbmUJbWluc3ModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtKG1pbnNzLCB2YXJzLCB2YXJkLCB4bW1yZWcpCisKKworLyoJNHgzMmYgUGFyYWxsZWwgQ29NUGFyZXMKKwkocmVzdWx0aW5nIGZpZWxkcyBhcmUgZWl0aGVyIDAgb3IgLTEpCisqLworI2RlZmluZQljbXBwc19tMnIodmFyLCByZWcsIG9wKQkJc3NlX20ycmkoY21wcHMsIHZhciwgcmVnLCBvcCkKKyNkZWZpbmUJY21wcHNfcjJyKHJlZ3MsIHJlZ2QsIG9wKQlzc2VfcjJyaShjbXBwcywgcmVncywgcmVnZCwgb3ApCisjZGVmaW5lCWNtcHBzKHZhcnMsIHZhcmQsIG9wLCB4bW1yZWcpCXNzZV9tMm1pKGNtcHBzLCB2YXJzLCB2YXJkLCB4bW1yZWcsIG9wKQorCisjZGVmaW5lCWNtcGVxcHNfbTJyKHZhciwgcmVnKQkJc3NlX20ycmkoY21wcHMsIHZhciwgcmVnLCAwKQorI2RlZmluZQljbXBlcXBzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycmkoY21wcHMsIHJlZ3MsIHJlZ2QsIDApCisjZGVmaW5lCWNtcGVxcHModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtaShjbXBwcywgdmFycywgdmFyZCwgeG1tcmVnLCAwKQorCisjZGVmaW5lCWNtcGx0cHNfbTJyKHZhciwgcmVnKQkJc3NlX20ycmkoY21wcHMsIHZhciwgcmVnLCAxKQorI2RlZmluZQljbXBsdHBzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycmkoY21wcHMsIHJlZ3MsIHJlZ2QsIDEpCisjZGVmaW5lCWNtcGx0cHModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtaShjbXBwcywgdmFycywgdmFyZCwgeG1tcmVnLCAxKQorCisjZGVmaW5lCWNtcGxlcHNfbTJyKHZhciwgcmVnKQkJc3NlX20ycmkoY21wcHMsIHZhciwgcmVnLCAyKQorI2RlZmluZQljbXBsZXBzX3IycihyZWdzLCByZWdkKQkJc3NlX3IycmkoY21wcHMsIHJlZ3MsIHJlZ2QsIDIpCisjZGVmaW5lCWNtcGxlcHModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtaShjbXBwcywgdmFycywgdmFyZCwgeG1tcmVnLCAyKQorCisjZGVmaW5lCWNtcHVub3JkcHNfbTJyKHZhciwgcmVnKQlzc2VfbTJyaShjbXBwcywgdmFyLCByZWcsIDMpCisjZGVmaW5lCWNtcHVub3JkcHNfcjJyKHJlZ3MsIHJlZ2QpCXNzZV9yMnJpKGNtcHBzLCByZWdzLCByZWdkLCAzKQorI2RlZmluZQljbXB1bm9yZHBzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybWkoY21wcHMsIHZhcnMsIHZhcmQsIHhtbXJlZywgMykKKworI2RlZmluZQljbXBuZXFwc19tMnIodmFyLCByZWcpCQlzc2VfbTJyaShjbXBwcywgdmFyLCByZWcsIDQpCisjZGVmaW5lCWNtcG5lcXBzX3IycihyZWdzLCByZWdkKQlzc2VfcjJyaShjbXBwcywgcmVncywgcmVnZCwgNCkKKyNkZWZpbmUJY21wbmVxcHModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtaShjbXBwcywgdmFycywgdmFyZCwgeG1tcmVnLCA0KQorCisjZGVmaW5lCWNtcG5sdHBzX20ycih2YXIsIHJlZykJCXNzZV9tMnJpKGNtcHBzLCB2YXIsIHJlZywgNSkKKyNkZWZpbmUJY21wbmx0cHNfcjJyKHJlZ3MsIHJlZ2QpCXNzZV9yMnJpKGNtcHBzLCByZWdzLCByZWdkLCA1KQorI2RlZmluZQljbXBubHRwcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm1pKGNtcHBzLCB2YXJzLCB2YXJkLCB4bW1yZWcsIDUpCisKKyNkZWZpbmUJY21wbmxlcHNfbTJyKHZhciwgcmVnKQkJc3NlX20ycmkoY21wcHMsIHZhciwgcmVnLCA2KQorI2RlZmluZQljbXBubGVwc19yMnIocmVncywgcmVnZCkJc3NlX3IycmkoY21wcHMsIHJlZ3MsIHJlZ2QsIDYpCisjZGVmaW5lCWNtcG5sZXBzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybWkoY21wcHMsIHZhcnMsIHZhcmQsIHhtbXJlZywgNikKKworI2RlZmluZQljbXBvcmRwc19tMnIodmFyLCByZWcpCQlzc2VfbTJyaShjbXBwcywgdmFyLCByZWcsIDcpCisjZGVmaW5lCWNtcG9yZHBzX3IycihyZWdzLCByZWdkKQlzc2VfcjJyaShjbXBwcywgcmVncywgcmVnZCwgNykKKyNkZWZpbmUJY21wb3JkcHModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtaShjbXBwcywgdmFycywgdmFyZCwgeG1tcmVnLCA3KQorCisKKy8qCUxvd2VzdCBGaWVsZCBvZiA0eDMyZiBQYXJhbGxlbCBDb01QYXJlcworCShyZXN1bHRpbmcgZmllbGRzIGFyZSBlaXRoZXIgMCBvciAtMSkKKyovCisjZGVmaW5lCWNtcHNzX20ycih2YXIsIHJlZywgb3ApCQlzc2VfbTJyaShjbXBzcywgdmFyLCByZWcsIG9wKQorI2RlZmluZQljbXBzc19yMnIocmVncywgcmVnZCwgb3ApCXNzZV9yMnJpKGNtcHNzLCByZWdzLCByZWdkLCBvcCkKKyNkZWZpbmUJY21wc3ModmFycywgdmFyZCwgb3AsIHhtbXJlZykJc3NlX20ybWkoY21wc3MsIHZhcnMsIHZhcmQsIHhtbXJlZywgb3ApCisKKyNkZWZpbmUJY21wZXFzc19tMnIodmFyLCByZWcpCQlzc2VfbTJyaShjbXBzcywgdmFyLCByZWcsIDApCisjZGVmaW5lCWNtcGVxc3NfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyaShjbXBzcywgcmVncywgcmVnZCwgMCkKKyNkZWZpbmUJY21wZXFzcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm1pKGNtcHNzLCB2YXJzLCB2YXJkLCB4bW1yZWcsIDApCisKKyNkZWZpbmUJY21wbHRzc19tMnIodmFyLCByZWcpCQlzc2VfbTJyaShjbXBzcywgdmFyLCByZWcsIDEpCisjZGVmaW5lCWNtcGx0c3NfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyaShjbXBzcywgcmVncywgcmVnZCwgMSkKKyNkZWZpbmUJY21wbHRzcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm1pKGNtcHNzLCB2YXJzLCB2YXJkLCB4bW1yZWcsIDEpCisKKyNkZWZpbmUJY21wbGVzc19tMnIodmFyLCByZWcpCQlzc2VfbTJyaShjbXBzcywgdmFyLCByZWcsIDIpCisjZGVmaW5lCWNtcGxlc3NfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyaShjbXBzcywgcmVncywgcmVnZCwgMikKKyNkZWZpbmUJY21wbGVzcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm1pKGNtcHNzLCB2YXJzLCB2YXJkLCB4bW1yZWcsIDIpCisKKyNkZWZpbmUJY21wdW5vcmRzc19tMnIodmFyLCByZWcpCXNzZV9tMnJpKGNtcHNzLCB2YXIsIHJlZywgMykKKyNkZWZpbmUJY21wdW5vcmRzc19yMnIocmVncywgcmVnZCkJc3NlX3IycmkoY21wc3MsIHJlZ3MsIHJlZ2QsIDMpCisjZGVmaW5lCWNtcHVub3Jkc3ModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtaShjbXBzcywgdmFycywgdmFyZCwgeG1tcmVnLCAzKQorCisjZGVmaW5lCWNtcG5lcXNzX20ycih2YXIsIHJlZykJCXNzZV9tMnJpKGNtcHNzLCB2YXIsIHJlZywgNCkKKyNkZWZpbmUJY21wbmVxc3NfcjJyKHJlZ3MsIHJlZ2QpCXNzZV9yMnJpKGNtcHNzLCByZWdzLCByZWdkLCA0KQorI2RlZmluZQljbXBuZXFzcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm1pKGNtcHNzLCB2YXJzLCB2YXJkLCB4bW1yZWcsIDQpCisKKyNkZWZpbmUJY21wbmx0c3NfbTJyKHZhciwgcmVnKQkJc3NlX20ycmkoY21wc3MsIHZhciwgcmVnLCA1KQorI2RlZmluZQljbXBubHRzc19yMnIocmVncywgcmVnZCkJc3NlX3IycmkoY21wc3MsIHJlZ3MsIHJlZ2QsIDUpCisjZGVmaW5lCWNtcG5sdHNzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybWkoY21wc3MsIHZhcnMsIHZhcmQsIHhtbXJlZywgNSkKKworI2RlZmluZQljbXBubGVzc19tMnIodmFyLCByZWcpCQlzc2VfbTJyaShjbXBzcywgdmFyLCByZWcsIDYpCisjZGVmaW5lCWNtcG5sZXNzX3IycihyZWdzLCByZWdkKQlzc2VfcjJyaShjbXBzcywgcmVncywgcmVnZCwgNikKKyNkZWZpbmUJY21wbmxlc3ModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtaShjbXBzcywgdmFycywgdmFyZCwgeG1tcmVnLCA2KQorCisjZGVmaW5lCWNtcG9yZHNzX20ycih2YXIsIHJlZykJCXNzZV9tMnJpKGNtcHNzLCB2YXIsIHJlZywgNykKKyNkZWZpbmUJY21wb3Jkc3NfcjJyKHJlZ3MsIHJlZ2QpCXNzZV9yMnJpKGNtcHNzLCByZWdzLCByZWdkLCA3KQorI2RlZmluZQljbXBvcmRzcyh2YXJzLCB2YXJkLCB4bW1yZWcpCXNzZV9tMm1pKGNtcHNzLCB2YXJzLCB2YXJkLCB4bW1yZWcsIDcpCisKKworLyoJTG93ZXN0IEZpZWxkIG9mIDR4MzJmIFBhcmFsbGVsIENvTVBhcmVzIHRvIHNldCBFRkxBR1MKKwkocmVzdWx0aW5nIGZpZWxkcyBhcmUgZWl0aGVyIDAgb3IgLTEpCisqLworI2RlZmluZQljb21pc3NfbTJyKHZhciwgcmVnKQkJc3NlX20ycihjb21pc3MsIHZhciwgcmVnKQorI2RlZmluZQljb21pc3NfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKGNvbWlzcywgcmVncywgcmVnZCkKKyNkZWZpbmUJY29taXNzKHZhcnMsIHZhcmQsIHhtbXJlZykJc3NlX20ybShjb21pc3MsIHZhcnMsIHZhcmQsIHhtbXJlZykKKworCisvKglMb3dlc3QgRmllbGQgb2YgNHgzMmYgVW5vcmRlcmVkIFBhcmFsbGVsIENvTVBhcmVzIHRvIHNldCBFRkxBR1MKKwkocmVzdWx0aW5nIGZpZWxkcyBhcmUgZWl0aGVyIDAgb3IgLTEpCisqLworI2RlZmluZQl1Y29taXNzX20ycih2YXIsIHJlZykJCXNzZV9tMnIodWNvbWlzcywgdmFyLCByZWcpCisjZGVmaW5lCXVjb21pc3NfcjJyKHJlZ3MsIHJlZ2QpCQlzc2VfcjJyKHVjb21pc3MsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXVjb21pc3ModmFycywgdmFyZCwgeG1tcmVnKQlzc2VfbTJtKHVjb21pc3MsIHZhcnMsIHZhcmQsIHhtbXJlZykKKworCisvKgkyLSg0eDMyZikgLT4gNHgzMmYgVU5QYUNLIExvdyBQYWNrZWQgU2luZ2xlLWZwCisJKGludGVybGVhdmVzIGxvdyBoYWxmIG9mIGRlc3Qgd2l0aCBsb3cgaGFsZiBvZiBzb3VyY2UKKwkgYXMgcGFkZGluZyBpbiBlYWNoIHJlc3VsdCBmaWVsZCkKKyovCisjZGVmaW5lCXVucGNrbHBzX20ycih2YXIsIHJlZykJCXNzZV9tMnIodW5wY2tscHMsIHZhciwgcmVnKQorI2RlZmluZQl1bnBja2xwc19yMnIocmVncywgcmVnZCkJc3NlX3Iycih1bnBja2xwcywgcmVncywgcmVnZCkKKworCisvKgkyLSg0eDMyZikgLT4gNHgzMmYgVU5QYUNLIEhpZ2ggUGFja2VkIFNpbmdsZS1mcAorCShpbnRlcmxlYXZlcyBoaWdoIGhhbGYgb2YgZGVzdCB3aXRoIGhpZ2ggaGFsZiBvZiBzb3VyY2UKKwkgYXMgcGFkZGluZyBpbiBlYWNoIHJlc3VsdCBmaWVsZCkKKyovCisjZGVmaW5lCXVucGNraHBzX20ycih2YXIsIHJlZykJCXNzZV9tMnIodW5wY2tocHMsIHZhciwgcmVnKQorI2RlZmluZQl1bnBja2hwc19yMnIocmVncywgcmVnZCkJc3NlX3Iycih1bnBja2hwcywgcmVncywgcmVnZCkKKworCisKKy8qCUZwIGFuZCBtbVggUmVTVE9SZSBzdGF0ZQorKi8KKyNpZmRlZglTU0VfVFJBQ0UKKwkjZGVmaW5lCWZ4cnN0b3IobWVtKSBcCisJeyBcCisJCWZwcmludGYoc3RkZXJyLCAiZnhyc3RvcigpXG4iKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImZ4cnN0b3IgJTAiIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJYIiAobWVtKSkgXAorCX0KKyNlbHNlCisJI2RlZmluZQlmeHJzdG9yKG1lbSkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgiZnhyc3RvciAlMCIgXAorCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCSAgICAgIDogIlgiIChtZW0pKQorI2VuZGlmCisKKworLyoJRnAgYW5kIG1tWCBTQVZFIHN0YXRlCisqLworI2lmZGVmCVNTRV9UUkFDRQorCSNkZWZpbmUJZnhzYXZlKG1lbSkgXAorCXsgXAorCQlmcHJpbnRmKHN0ZGVyciwgImZ4c2F2ZSgpXG4iKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImZ4c2F2ZSAlMCIgXAorCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCSAgICAgIDogIlgiIChtZW0pKSBcCisJfQorI2Vsc2UKKwkjZGVmaW5lCWZ4c2F2ZShtZW0pIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImZ4c2F2ZSAlMCIgXAorCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCSAgICAgIDogIlgiIChtZW0pKQorI2VuZGlmCisKKworLyoJU1RvcmUgc3RyZWFNaW5nIHNpbWQgZVh0ZW5zaW9ucyBDb250cm9sL1N0YXR1cyBSZWdpc3RlcgorKi8KKyNpZmRlZglTU0VfVFJBQ0UKKwkjZGVmaW5lCXN0bXhjc3IobWVtKSBcCisJeyBcCisJCWZwcmludGYoc3RkZXJyLCAic3RteGNzcigpXG4iKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN0bXhjc3IgJTAiIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJYIiAobWVtKSkgXAorCX0KKyNlbHNlCisJI2RlZmluZQlzdG14Y3NyKG1lbSkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgic3RteGNzciAlMCIgXAorCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCSAgICAgIDogIlgiIChtZW0pKQorI2VuZGlmCisKKworLyoJTG9hRCBzdHJlYU1pbmcgc2ltZCBlWHRlbnNpb25zIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyCisqLworI2lmZGVmCVNTRV9UUkFDRQorCSNkZWZpbmUJbGRteGNzcihtZW0pIFwKKwl7IFwKKwkJZnByaW50ZihzdGRlcnIsICJsZG14Y3NyKClcbiIpOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibGRteGNzciAlMCIgXAorCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCSAgICAgIDogIlgiIChtZW0pKSBcCisJfQorI2Vsc2UKKwkjZGVmaW5lCWxkbXhjc3IobWVtKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsZG14Y3NyICUwIiBcCisJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAorCQkJICAgICAgOiAiWCIgKG1lbSkpCisjZW5kaWYKKworCisvKglTdG9yZSBGRU5DRSAtIGVuZm9yY2Ugb3JkZXJpbmcgb2Ygc3RvcmVzIGJlZm9yZSBmZW5jZSB2cy4gc3RvcmVzCisJb2NjdXJpbmcgYWZ0ZXIgZmVuY2UgaW4gc291cmNlIGNvZGUuCisqLworI2lmZGVmCVNTRV9UUkFDRQorCSNkZWZpbmUJc2ZlbmNlKCkgXAorCXsgXAorCQlmcHJpbnRmKHN0ZGVyciwgInNmZW5jZSgpXG4iKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInNmZW5jZVxuXHQiKSBcCisJfQorI2Vsc2UKKwkjZGVmaW5lCXNmZW5jZSgpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInNmZW5jZVxuXHQiKQorI2VuZGlmCisKKworLyoJUFJFRkVUQ0ggZGF0YSB1c2luZyBUMCwgVDEsIFQyLCBvciBOVEEgaGludAorCQlUMCAgPSBQcmVmZXRjaCBpbnRvIGFsbCBjYWNoZSBsZXZlbHMKKwkJVDEgID0gUHJlZmV0Y2ggaW50byBhbGwgY2FjaGUgbGV2ZWxzIGV4Y2VwdCAwdGggbGV2ZWwKKwkJVDIgID0gUHJlZmV0Y2ggaW50byBhbGwgY2FjaGUgbGV2ZWxzIGV4Y2VwdCAwdGggYW5kIDFzdCBsZXZlbHMKKwkJTlRBID0gUHJlZmV0Y2ggZGF0YSBpbnRvIG5vbi10ZW1wb3JhbCBjYWNoZSBzdHJ1Y3R1cmUKKyovCisjaWZkZWYJU1NFX1RSQUNFCisjZWxzZQorCSNkZWZpbmUJcHJlZmV0Y2gobWVtLCBoaW50KSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJwcmVmZXRjaCIgI2hpbnQgIiAlMCIgXAorCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCSAgICAgIDogIlgiIChtZW0pKQorCisJI2RlZmluZQlwcmVmZXRjaHQwKG1lbSkJCXByZWZldGNoKG1lbSwgdDApCisJI2RlZmluZQlwcmVmZXRjaHQxKG1lbSkJCXByZWZldGNoKG1lbSwgdDEpCisJI2RlZmluZQlwcmVmZXRjaHQyKG1lbSkJCXByZWZldGNoKG1lbSwgdDIpCisJI2RlZmluZQlwcmVmZXRjaG50YShtZW0pCXByZWZldGNoKG1lbSwgbnRhKQorI2VuZGlmCisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzZTcyYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC5jCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEJpbGx5IEJpZ2dzIDx2ZWt0b3JAZHVtYnRlcm0ubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA4LDIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBSZWxpY2Vuc2VkIGZvciBHU3RyZWFtZXIgZnJvbSBHUEwgdG8gTEdQTCB3aXRoIHBlcm1pdCBmcm9tIFRvbSBCYXJyeS4KKyAqIFNlZTogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNTc4CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2lmZGVmIEhBVkVfT1JDCisjaW5jbHVkZSA8b3JjL29yYy5oPgorI2VuZGlmCisjaW5jbHVkZSAiZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaCIKKyNpbmNsdWRlICJwbHVnaW5zLmgiCisKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1RPTVNNT0NPTVAJKGdzdF9kZWludGVybGFjZV9tZXRob2RfdG9tc21vY29tcF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9UT01TTU9DT01QKG9iaikJCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9UT01TTU9DT01QKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9UT01TTU9DT01QX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9UT01TTU9DT01QKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9UT01TTU9DT01QX0dFVF9DTEFTUyhvYmopCShHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1RPTVNNT0NPTVAsIEdzdERlaW50ZXJsYWNlTWV0aG9kVG9tc01vQ29tcENsYXNzKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9UT01TTU9DT01QKG9iaikJCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9UT01TTU9DT01QLCBHc3REZWludGVybGFjZU1ldGhvZFRvbXNNb0NvbXApKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX1RPTVNNT0NPTVBfQ0xBU1Moa2xhc3MpCShHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1RPTVNNT0NPTVAsIEdzdERlaW50ZXJsYWNlTWV0aG9kVG9tc01vQ29tcENsYXNzKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9UT01TTU9DT01QX0NBU1Qob2JqKQkoKEdzdERlaW50ZXJsYWNlTWV0aG9kVG9tc01vQ29tcCopKG9iaikpCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kIHBhcmVudDsKKworICBndWludCBzZWFyY2hfZWZmb3J0OworICBnYm9vbGVhbiBzdHJhbmdlX2JvYjsKK30gR3N0RGVpbnRlcmxhY2VNZXRob2RUb21zTW9Db21wOworCit0eXBlZGVmIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgR3N0RGVpbnRlcmxhY2VNZXRob2RUb21zTW9Db21wQ2xhc3M7CisKK3N0YXRpYyB2b2lkCitGaWVsZGNvcHkgKGd1aW50OCAqIGRlc3QsIGNvbnN0IGd1aW50OCAqIHNyYywgZ2ludCBjb3VudCwKKyAgICBnaW50IHJvd3MsIGdpbnQgZHN0X3BpdGNoLCBnaW50IHNyY19waXRjaCkKK3sKKyAgZ2ludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKKyAgICBtZW1jcHkgKGRlc3QsIHNyYywgY291bnQpOworICAgIHNyYyArPSBzcmNfcGl0Y2g7CisgICAgZGVzdCArPSBkc3RfcGl0Y2g7CisgIH0KK30KKworI2RlZmluZSBVU0VfRk9SX0RTQ0FMRVIKKworI2RlZmluZSBJU19DCisjZGVmaW5lIFNJTURfVFlQRSBDCisjZGVmaW5lIEZVTkNUX05BTUUgdG9tc21vY29tcERTY2FsZXJfQworI2luY2x1ZGUgInRvbXNtb2NvbXAvVG9tc01vQ29tcEFsbC5pbmMiCisjdW5kZWYgIElTX0MKKyN1bmRlZiAgU0lNRF9UWVBFCisjdW5kZWYgIEZVTkNUX05BTUUKKworI2lmZGVmIEJVSUxEX1g4Nl9BU00KKworI2luY2x1ZGUgInRvbXNtb2NvbXAvdG9tc21vY29tcG1hY3Jvcy5oIgorI2luY2x1ZGUgIng4Ni02NF9tYWNyb3MuaW5jIgorCisjZGVmaW5lIElTX01NWAorI2RlZmluZSBTSU1EX1RZUEUgTU1YCisjZGVmaW5lIEZVTkNUX05BTUUgdG9tc21vY29tcERTY2FsZXJfTU1YCisjaW5jbHVkZSAidG9tc21vY29tcC9Ub21zTW9Db21wQWxsLmluYyIKKyN1bmRlZiAgSVNfTU1YCisjdW5kZWYgIFNJTURfVFlQRQorI3VuZGVmICBGVU5DVF9OQU1FCisKKyNkZWZpbmUgSVNfM0ROT1cKKyNkZWZpbmUgU0lNRF9UWVBFIDNETk9XCisjZGVmaW5lIEZVTkNUX05BTUUgdG9tc21vY29tcERTY2FsZXJfM0ROT1cKKyNpbmNsdWRlICJ0b21zbW9jb21wL1RvbXNNb0NvbXBBbGwuaW5jIgorI3VuZGVmICBJU18zRE5PVworI3VuZGVmICBTSU1EX1RZUEUKKyN1bmRlZiAgRlVOQ1RfTkFNRQorCisjZGVmaW5lIElTX01NWEVYVAorI2RlZmluZSBTSU1EX1RZUEUgTU1YRVhUCisjZGVmaW5lIEZVTkNUX05BTUUgdG9tc21vY29tcERTY2FsZXJfTU1YRVhUCisjaW5jbHVkZSAidG9tc21vY29tcC9Ub21zTW9Db21wQWxsLmluYyIKKyN1bmRlZiAgSVNfTU1YRVhUCisjdW5kZWYgIFNJTURfVFlQRQorI3VuZGVmICBGVU5DVF9OQU1FCisKKyNlbmRpZgorCitHX0RFRklORV9UWVBFIChHc3REZWludGVybGFjZU1ldGhvZFRvbXNNb0NvbXAsCisgICAgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF90b21zbW9jb21wLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0QpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9TRUFSQ0hfRUZGT1JULAorICBQUk9QX1NUUkFOR0VfQk9CCit9OworCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF90b21zbW9jb21wX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REZWludGVybGFjZU1ldGhvZFRvbXNNb0NvbXAgKnNlbGYgPQorICAgICAgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9UT01TTU9DT01QIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TRUFSQ0hfRUZGT1JUOgorICAgICAgc2VsZi0+c2VhcmNoX2VmZm9ydCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVFJBTkdFX0JPQjoKKyAgICAgIHNlbGYtPnN0cmFuZ2VfYm9iID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2RfdG9tc21vY29tcF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RUb21zTW9Db21wICpzZWxmID0KKyAgICAgIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfVE9NU01PQ09NUCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU0VBUkNIX0VGRk9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzZWxmLT5zZWFyY2hfZWZmb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVFJBTkdFX0JPQjoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzZWxmLT5zdHJhbmdlX2JvYik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorICAgIGdzdF9kZWludGVybGFjZV9tZXRob2RfdG9tc21vY29tcF9jbGFzc19pbml0CisgICAgKEdzdERlaW50ZXJsYWNlTWV0aG9kVG9tc01vQ29tcENsYXNzICoga2xhc3MpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKmRpbV9jbGFzcyA9IChHc3REZWludGVybGFjZU1ldGhvZENsYXNzICopIGtsYXNzOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworI2lmZGVmIEJVSUxEX1g4Nl9BU00KKyAgZ3VpbnQgY3B1X2ZsYWdzID0KKyAgICAgIG9yY190YXJnZXRfZ2V0X2RlZmF1bHRfZmxhZ3MgKG9yY190YXJnZXRfZ2V0X2J5X25hbWUgKCJtbXgiKSk7CisjZW5kaWYKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3RvbXNtb2NvbXBfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3RvbXNtb2NvbXBfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU0VBUkNIX0VGRk9SVCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgic2VhcmNoLWVmZm9ydCIsCisgICAgICAgICAgIlNlYXJjaCBFZmZvcnQiLAorICAgICAgICAgICJTZWFyY2ggRWZmb3J0IiwgMCwgMjcsIDUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykKKyAgICAgICk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TVFJBTkdFX0JPQiwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgic3RyYW5nZS1ib2IiLAorICAgICAgICAgICJTdHJhbmdlIEJvYiIsCisgICAgICAgICAgIlVzZSBzdHJhbmdlIGJvYiIsIEZBTFNFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpCisgICAgICApOworCisgIGRpbV9jbGFzcy0+ZmllbGRzX3JlcXVpcmVkID0gNDsKKyAgZGltX2NsYXNzLT5uYW1lID0gIk1vdGlvbiBBZGFwdGl2ZTogTW90aW9uIFNlYXJjaCI7CisgIGRpbV9jbGFzcy0+bmljayA9ICJ0b21zbW9jb21wIjsKKyAgZGltX2NsYXNzLT5sYXRlbmN5ID0gMTsKKworI2lmZGVmIEJVSUxEX1g4Nl9BU00KKyAgaWYgKGNwdV9mbGFncyAmIE9SQ19UQVJHRVRfTU1YX01NWEVYVCkgeworICAgIGRpbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfeXV5MiA9IHRvbXNtb2NvbXBEU2NhbGVyX01NWEVYVDsKKyAgICBkaW1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l2eXUgPSB0b21zbW9jb21wRFNjYWxlcl9NTVhFWFQ7CisgIH0gZWxzZSBpZiAoY3B1X2ZsYWdzICYgT1JDX1RBUkdFVF9NTVhfM0ROT1cpIHsKKyAgICBkaW1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l1eTIgPSB0b21zbW9jb21wRFNjYWxlcl8zRE5PVzsKKyAgICBkaW1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l2eXUgPSB0b21zbW9jb21wRFNjYWxlcl8zRE5PVzsKKyAgfSBlbHNlIGlmIChjcHVfZmxhZ3MgJiBPUkNfVEFSR0VUX01NWF9NTVgpIHsKKyAgICBkaW1fY2xhc3MtPmRlaW50ZXJsYWNlX2ZyYW1lX3l1eTIgPSB0b21zbW9jb21wRFNjYWxlcl9NTVg7CisgICAgZGltX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV95dnl1ID0gdG9tc21vY29tcERTY2FsZXJfTU1YOworICB9IGVsc2UgeworICAgIGRpbV9jbGFzcy0+ZGVpbnRlcmxhY2VfZnJhbWVfeXV5MiA9IHRvbXNtb2NvbXBEU2NhbGVyX0M7CisgICAgZGltX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV95dnl1ID0gdG9tc21vY29tcERTY2FsZXJfQzsKKyAgfQorI2Vsc2UKKyAgZGltX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV95dXkyID0gdG9tc21vY29tcERTY2FsZXJfQzsKKyAgZGltX2NsYXNzLT5kZWludGVybGFjZV9mcmFtZV95dnl1ID0gdG9tc21vY29tcERTY2FsZXJfQzsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF90b21zbW9jb21wX2luaXQgKEdzdERlaW50ZXJsYWNlTWV0aG9kVG9tc01vQ29tcCAqIHNlbGYpCit7CisgIHNlbGYtPnNlYXJjaF9lZmZvcnQgPSA1OworICBzZWxmLT5zdHJhbmdlX2JvYiA9IEZBTFNFOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3AwQS5pbmMgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcDBBLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWQ5YWVjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3AwQS5pbmMKQEAgLTAsMCArMSwxNSBAQAorLy8gLSotIGMrKyAtKi0KKworLy8gU2VhcmNoZXMganVzdCB0aGUgY2VudGVyIHBpeGVsLCBpbiBib3RoIHRoZSBvbGQKKy8vICBhbmQgbmV3IGZpZWxkcywgYnV0IHRha2VzIGF2ZXJhZ2VzLiBUaGlzIGlzIGFuIGV2ZW4KKy8vIHBpeGVsIGFkZHJlc3MuIEFueSBjaHJvbWEgbWF0Y2ggd2lsbCBiZSB1c2VkLiAoWVVZMikKKy8vIFdlIGJlc3QgbGlrZSBmaW5kaW5nIDAgbW90aW9uIHNvIHdlIHdpbGwgYmlhcyBldmVyeXRoaW5nIHdlIGZvdW5kIHByZXZpb3VzbHkKKy8vIHVwIGJ5IGEgbGl0dGxlLCBhbmQgYWRqdXN0IGxhdGVyCisKKyNpZmRlZiBJU19TU0UyCisJCSJwYWRkdXNiICJfT05FUyIsICUleG1tN1xuXHQiCQkJCS8vIGJpYXMgdG93YXJkIG5vIG1vdGlvbgorI2Vsc2UKKwkJInBhZGR1c2IgIl9PTkVTIiwgJSVtbTdcblx0IiAJCQkJLy8gYmlhcyB0b3dhcmQgbm8gbW90aW9uCisjZW5kaWYKKworICAgICAgICBNRVJHRTRQSVhhdmcoIiglJSJYREkiLCAlJSJYQ1giKSIsICIoJSUiWFNJIiwgJSUiWENYIikiKSAgLy8gY2VudGVyLCBpbiBvbGQgYW5kIG5ldwpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BCb3R0b20uaW5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BCb3R0b20uaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNTYwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEJvdHRvbS5pbmMKQEAgLTAsMCArMSwxNzQgQEAKKy8vIC0qLSBjKysgLSotICAgICAgIAorCisvLyBWZXJzaW9uIGZvciBub24tU1NFMgorCisjaWZuZGVmIElTX0MKKworI2lmZGVmIFNLSVBfU0VBUkNICisgICAgICAgICAgICAibW92cSAgICAlJW1tNiwgJSVtbTBcblx0IiAgICAgICAgICAgIC8vIGp1c3QgdXNlIHRoZSByZXN1bHRzIG9mIG91ciB3aWVyZCBib2IKKyNlbHNlCisKKworICAgICAgICAgICAgLy8gSkEgOS9EZWMvMjAwMgorICAgICAgICAgICAgLy8gZmFpbGVkIGV4cGVyaW1lbnQKKyAgICAgICAgICAgIC8vIGJ1dCBsZWF2ZSBpbiBwbGFjZWhvbGRlciBmb3IgbWUgdG8gcGxheSBhYm91dAorI2lmZGVmIERPTlRfVVNFX1NUUkFOR0VfQk9CCisgICAgICAgICAgICAvLyBVc2UgdGhlIGJlc3Qgd2VhdmUgaWYgZGlmZnMgbGVzcyB0aGFuIDEwIGFzIHRoYXQKKyAgICAgICAgICAgIC8vIG1lYW5zIHRoZSBpbWFnZSBpcyBzdGlsbCBvciBtb3ZpbmcgY2xlYW5seQorICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbW90aW9uIHdlIHdpbGwgY2xpcCB3aGljaCB3aWxsIGNhdGNoIGFueXRoaW5nCisgICAgICAgICAgICAicHN1YnVzYiAiX0ZPVVJTIiwgJSVtbTdcblx0IiAgICAgICAgICAvLyBzZXRzIGJpdHMgdG8gemVybyBpZiB3ZWF2ZSBkaWZmIDwgNAorICAgICAgICAgICAgInB4b3IgICAgJSVtbTAsICUlbW0wXG5cdCIKKyAgICAgICAgICAgICJwY21wZXFiICUlbW0wLCAlJW1tN1xuXHQiICAgICAgICAgICAgLy8gYWxsIGZmIHdoZXJlIHdlYXZlIGJldHRlciwgZWxzZSAwMAorICAgICAgICAgICAgInBjbXBlcWIgJSVtbTcsICUlbW0wXG5cdCIgICAgICAgICAgICAvLyBhbGwgZmYgd2hlcmUgYm9iIGJldHRlciwgZWxzZSAwMAorICAgICAgICAgICAgInBhbmQgICAgJSVtbTYsICUlbW0wXG5cdCIgICAgICAgICAgICAvLyB1c2UgYm9iIGZvciB0aGVzZSBwaXhlbCB2YWx1ZXMKKyAgICAgICAgICAgICJwYW5kICAgICUlbW01LCAlJW1tN1xuXHQiICAgICAgICAgICAgLy8gdXNlIHdlYXZlIGZvciB0aGVzZQorICAgICAgICAgICAgInBvciAgICAgJSVtbTcsICUlbW0wXG5cdCIgICAgICAgICAgICAvLyBjb21iaW5lIGJvdGgKKyNlbHNlCisgICAgICAgICAgICAvLyBVc2UgdGhlIGJldHRlciBvZiBib2Igb3Igd2VhdmUKKyAgICAgICAgICAgIC8vICAgICAgcG1pbnViICBtbTQsIFRFTlMgICAgICAgICAgIC8vIHRoZSBtb3N0IHdlIGNhcmUgYWJvdXQKKyAgICAgICAgICAgIFZfUE1JTlVCICgiJSVtbTQiLCBfVEVOUywgIiUlbW0wIikgICAvLyB0aGUgbW9zdCB3ZSBjYXJlIGFib3V0CisgICAgICAgICAgICAKKyAgICAgICAgICAgICJwc3VidXNiICUlbW00LCAlJW1tN1xuXHQiICAgICAgICAgICAgLy8gZm9yZWdpdmUgdGhhdCBtdWNoIGZyb20gd2VhdmUgZXN0PworICAgICAgICAgICAgInBzdWJ1c2IgIl9GT1VSUyIsICUlbW03XG5cdCIgICAgICAgLy8gYmlhcyBpdCBhIGJpdCB0b3dhcmQgd2VhdmUKKyAgICAgICAgICAgICJweG9yICAgICUlbW0wLCAlJW1tMFxuXHQiCisgICAgICAgICAgICAicGNtcGVxYiAlJW1tMCwgJSVtbTdcblx0IiAgICAgICAgICAgIC8vIGFsbCBmZiB3aGVyZSB3ZWF2ZSBiZXR0ZXIsIGVsc2UgMDAKKyAgICAgICAgICAgICJwY21wZXFiICUlbW03LCAlJW1tMFxuXHQiICAgICAgICAgICAgLy8gYWxsIGZmIHdoZXJlIGJvYiBiZXR0ZXIsIGVsc2UgMDAKKyAgICAgICAgICAgICJwYW5kICAgICUlbW02LCAlJW1tMFxuXHQiICAgICAgICAgICAgLy8gdXNlIGJvYiBmb3IgdGhlc2UgcGl4ZWwgdmFsdWVzCisgICAgICAgICAgICAicGFuZCAgICAlJW1tNSwgJSVtbTdcblx0IiAgICAgICAgICAgIC8vIHVzZSB3ZWF2ZSBmb3IgdGhlc2UKKyAgICAgICAgICAgICJwb3IgICAgICUlbW03LCAlJW1tMFxuXHQiICAgICAgICAgICAgLy8gY29tYmluZSBib3RoCisjZW5kaWYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gICAgICBwbWludWIgIG1tMCwgTWF4X1ZhbHMgICAgICAgLy8gYnV0IGNsaXAgdG8gY2F0Y2ggdGhlIHN0cmF5IGVycm9yCisgICAgICAgICAgICAgICAgVl9QTUlOVUIgKCIlJW1tMCIsIF9NYXhfVmFscywgIiUlbW0xIikgLy8gYnV0IGNsaXAgdG8gY2F0Y2ggdGhlIHN0cmF5IGVycm9yCisgICAgICAgICAgICAgICAgLy8gICAgICBwbWF4dWIgIG1tMCwgTWluX1ZhbHMKKyAgICAgICAgICAgICAgICBWX1BNQVhVQiAoIiUlbW0wIiwgX01pbl9WYWxzKQorICAgICAgICAgICAgICAgIAorI2VuZGlmCisKKworICAgICAgICAgICAgTU9WWCIgICAgICJfcERlc3QiLCAlJSJYQVgiXG5cdCIKKyAgICAgICAgICAgICAgICAKKyNpZmRlZiBVU0VfVkVSVElDQUxfRklMVEVSCisgICAgICAgICAgICAibW92cSAgICAlJW1tMCwgJSVtbTFcblx0IgorICAgICAgICAgICAgLy8gICAgICBwYXZnYiAgIG1tMCwgcXdvcmQgcHRyWyJYQlgiXQorICAgICAgICAgICAgVl9QQVZHQiAoIiUlbW0wIiwgIiglJSJYQlgiKSIsICIlJW1tMiIsIF9TaGlmdE1hc2spCisgICAgICAgICAgICAvLyAgICAgIG1vdm50cSAgcXdvcmQgcHRyWyJYQVgiKyJYRFgiXSwgbW0wCisgICAgICAgICAgICBWX01PVk5UUSAoIiglIlhBWCIsICUlIlhEWCIpIiwgIiUlbW0wIikKKyAgICAgICAgICAgIC8vICAgICAgcGF2Z2IgICBtbTEsIHF3b3JkIHB0clsiWEJYIisiWENYIl0KKyAgICAgICAgICAgIFZfUEFWR0IgKCIlJW1tMSIsICIoJSUiWEJYIiwgJSUiWENYIikiLCAiJSVtbTIiLCBfU2hpZnRNYXNrKQorCSAgICAvL0ZJWE1FOiBYRFggb3IgWEFYISEKKyAgICAgICAgICAgICJhZGRxICAgIl9kc3RfcGl0Y2h3IiwgJSUiWEJYCisgICAgICAgICAgICAvLyAgICAgIG1vdm50cSAgcXdvcmQgcHRyWyJYQVgiKyJYRFgiXSwgbW0xCisgICAgICAgICAgICBWX01PVk5UUSAoIiglJSJYQVgiLCAlJSJYRFgiKSIsICIlJW1tMSIpCisjZWxzZQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gICAgICBtb3ZudHEgIHF3b3JkIHB0clsiWEFYIisiWERYIl0sIG1tMAorICAgICAgICAgICAgICAgIFZfTU9WTlRRICgiKCUlIlhBWCIsICUlIlhEWCIpIiwgIiUlbW0wIikKKyNlbmRpZgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICBMRUFYIiAgICA4KCUlIlhEWCIpLCAlJSJYRFgiXG5cdCIgICAgICAgLy8gYnVtcCBvZmZzZXQgcG9pbnRlcgorICAgICAgICAgICBDTVBYIiAgICAiX0xhc3Q4IiwgJSUiWERYIlxuXHQiICAgICAgIC8vIGRvbmUgd2l0aCBsaW5lPworICAgICAgICAgICAiamIgICAgICAxYlxuXHQiICAgICAgICAgICAgICAgICAgICAvLyB5CisKKyAgICAgICAgICAgTU9WWCIgIl9vbGRieCIsICUlIlhCWCJcblx0IgorCisgICAgICAgIDogLyogbm8gb3V0cHV0cyAqLworCisgICAgICAgIDogIm0iKHBCb2IpLAorICAgICAgICAgICJtIihzcmNfcGl0Y2gyKSwKKyAgICAgICAgICAibSIoU2hpZnRNYXNrKSwKKyAgICAgICAgICAibSIocERlc3QpLAorICAgICAgICAgICJtIihkc3RfcGl0Y2h3KSwKKyAgICAgICAgICAibSIoTGFzdDgpLAorICAgICAgICAgICJtIihwU3JjKSwKKyAgICAgICAgICAibSIocFNyY1ApLAorICAgICAgICAgICJtIihwQm9iUCksCisgICAgICAgICAgIm0iKERpZmZUaHJlcyksCisgICAgICAgICAgIm0iKE1pbl9WYWxzKSwKKyAgICAgICAgICAibSIoTWF4X1ZhbHMpLAorICAgICAgICAgICJtIihGT1VSUyksCisgICAgICAgICAgIm0iKFRFTlMpLAorICAgICAgICAgICJtIihPTkVTKSwKKyAgICAgICAgICAibSIoVVZNYXNrKSwKKyAgICAgICAgICAibSIoTWF4X01vdiksCisgICAgICAgICAgIm0iKFlNYXNrKSwKKyAgICAgICAgICAibSIob2xkYngpCisKKyAgICAgICAgOiBYQVgsIFhDWCwgWERYLCBYU0ksIFhESSwKKyAgICAgICAgICAic3QiLCAic3QoMSkiLCAic3QoMikiLCAic3QoMykiLCAic3QoNCkiLCAic3QoNSkiLCAic3QoNikiLCAic3QoNykiLAorI2lmZGVmIF9fTU1YX18KKyAgICAgICAgICAibW0wIiwgIm1tMSIsICJtbTIiLCAibW0zIiwgIm1tNCIsICJtbTUiLCAibW02IiwgIm1tNyIsCisjZW5kaWYKKyAgICAgICAgICAibWVtb3J5IiwgImNjIgorICAgICAgICApOworCisgICAgICAgIC8vIGFkanVzdCBmb3IgbmV4dCBsaW5lCisgICAgICAgIHBTcmMgICs9IHNyY19waXRjaDI7CisgICAgICAgIHBTcmNQICs9IHNyY19waXRjaDI7CisgICAgICAgIHBEZXN0ICs9IGRzdF9waXRjaDI7CisgICAgICAgIHBCb2IgICs9IHNyY19waXRjaDI7CisgICAgICAgIHBCb2JQICs9IHNyY19waXRjaDI7CisgICAgfQorICAgIAorICAgIHJldHVybiAwOworI2Vsc2UKKyNpZmRlZiBTS0lQX1NFQVJDSAorICAgICAgICAgICAgb3V0WzBdID0gYmVzdFswXTsgICAgICAgICAgICAvLyBqdXN0IHVzZSB0aGUgcmVzdWx0cyBvZiBvdXIgd2llcmQgYm9iCisJICAgIG91dFsxXSA9IGJlc3RbMV07CisjZWxzZQorICAgICAgICAgICAgZGlmZlswXSA9IGRpZmZbMF0gLSBNSU4gKGRpZmZbMF0sIDEwKSAtIDQ7CisJICAgIGRpZmZbMV0gPSBkaWZmWzFdIC0gTUlOIChkaWZmWzFdIC0gMTApIC0gNDsKKwkgICAgaWYgKGRpZmZbMF0gPCAwKQorCSAgICAgIG91dFswXSA9IHdlYXZlWzBdOworCSAgICBlbHNlCisJICAgICAgb3V0WzBdID0gYmVzdFswXTsKKwkgICAgCisJICAgIGlmIChkaWZmWzFdIDwgMCkKKwkgICAgICBvdXRbMV0gPSB3ZWF2ZVsxXTsKKwkgICAgZWxzZQorCSAgICAgIG91dFsxXSA9IGJlc3RbMV07CisKKworCSAgICBvdXRbMF0gPSBDTEFNUCAob3V0WzBdLCBNaW5WYWxzWzBdLCBNYXhWYWxzWzBdKTsKKwkgICAgb3V0WzFdID0gQ0xBTVAgKG91dFsxXSwgTWluVmFsc1sxXSwgTWF4VmFsc1sxXSk7CisjZW5kaWYKKworI2lmZGVmIFVTRV9WRVJUSUNBTF9GSUxURVIKKyAgICAgICAgICAgIHBEZXN0W3hdID0gKG91dFswXSArIHBCb2JbMF0pIC8gMjsKKwkgICAgcERlc3RbeCArIGRzdF9waXRjaHddID0gKHBCb2Jbc3JjX3BpdGNoMl0gKyBvdXRbMF0pIC8gMjsKKyAgICAgICAgICAgIHBEZXN0W3ggKyAxXSA9IChvdXRbMV0gKyBwQm9iWzFdKSAvIDI7CisJICAgIHBEZXN0W3ggKyAxICsgZHN0X3BpdGNod10gPSAocEJvYltzcmNfcGl0Y2gyICsgMV0gKyBvdXRbMV0pIC8gMjsKKyNlbHNlCisgICAgICAgICAgICBwRGVzdFt4XSA9IG91dFswXTsKKwkgICAgcERlc3RbeCsxXSA9IG91dFsxXTsKKyNlbmRpZgorICAgICAgICAgICAgcEJvYiArPSAyOworICAgICAgICAgICAgcEJvYlAgKz0gMjsKKyAgICAgICAgICAgIHBTcmMgKz0gMjsKKyAgICAgICAgICAgIHBTcmNQICs9IDI7CisJfQorICAgICAgICAvLyBhZGp1c3QgZm9yIG5leHQgbGluZQorICAgICAgICBwU3JjICA9IHNyY19waXRjaDIgKiAoeSsxKSArIHBXZWF2ZVNyYzsKKyAgICAgICAgcFNyY1AgPSBzcmNfcGl0Y2gyICogKHkrMSkgKyBwV2VhdmVTcmNQOworICAgICAgICBwRGVzdCA9IGRzdF9waXRjaDIgKiAoeSsxKSArIHBXZWF2ZURlc3QgKyBkc3RfcGl0Y2gyOworCisKKwlpZiAoVG9wRmlyc3QpCisJeworCQlwQm9iID0gcENvcHlTcmMgKyBzcmNfcGl0Y2gyOworCQlwQm9iUCA9IHBDb3B5U3JjUCArIHNyY19waXRjaDI7CisJfQorCWVsc2UKKwl7CisJCXBCb2IgPSAgcENvcHlTcmM7CisJCXBCb2JQID0gIHBDb3B5U3JjUDsKKwl9CisKKyAgICAgICAgcEJvYiAgKz0gc3JjX3BpdGNoMiAqICh5KzEpOworICAgICAgICBwQm9iUCArPSBzcmNfcGl0Y2gyICogKHkrMSk7CisgICAgfQorICAgIAorICAgIHJldHVybiAwOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wRWRnZUEuaW5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BFZGdlQS5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwOGZlOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wRWRnZUEuaW5jCkBAIC0wLDAgKzEsMTEgQEAKKy8vIC0qLSBjKysgLSotCisKKy8vIFNlYXJjaGVzIDIgcGl4ZWwgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0LCBpbiBib3RoIHRoZSBvbGQKKy8vICBhbmQgbmV3IGZpZWxkcywgYnV0IHRha2VzIGF2ZXJhZ2VzLiBUaGVzZSBhcmUgZXZlbgorLy8gcGl4ZWwgYWRkcmVzc2VzLiBDaHJvbWEgbWF0Y2ggd2lsbCBiZSB1c2VkLiAoWVVZMikKKyAgICAgICAgTUVSR0U0UElYYXZnKCItNCglJSJYREkiKSIsICI0KCUlIlhTSSIsICUlIlhDWCIsIDIpIikgIC8vIHVwIGxlZnQsIGRvd24gcmlnaHQKKyAgICAgICAgTUVSR0U0UElYYXZnKCI0KCUlIlhESSIpIiwgIi00KCUlIlhTSSIsICUlIlhDWCIsIDIpIikgIC8vIHVwIHJpZ2h0LCBkb3duIGxlZnQKKyAgICAgICAgTUVSR0U0UElYYXZnKCItNCglJSJYREkiLCAlJSJYQ1giKSIsICI0KCUlIlhTSSIsICUlIlhDWCIpIikgLy8gbGVmdCwgcmlnaHQKKyAgICAgICAgTUVSR0U0UElYYXZnKCI0KCUlIlhESSIsICUlIlhDWCIpIiwgIi00KCUlIlhTSSIsICUlIlhDWCIpIikgLy8gcmlnaHQsIGxlZnQKKyAgICAgICAgTUVSR0U0UElYYXZnKCItNCglJSJYREkiLCAlJSJYQ1giLCAyKSIsICI0KCUlIlhTSSIpIikgICAvLyBkb3duIGxlZnQsIHVwIHJpZ2h0CisgICAgICAgIE1FUkdFNFBJWGF2ZygiNCglJSJYREkiLCAlJSJYQ1giLCAyKSIsICItNCglJSJYU0kiKSIpICAgLy8gZG93biByaWdodCwgdXAgbGVmdApkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BFZGdlQTguaW5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BFZGdlQTguaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NDFjM2YKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcEVkZ2VBOC5pbmMKQEAgLTAsMCArMSwxMiBAQAorLy8gLSotIGMrKyAtKi0KKworLy8gU2VhcmNoZXMgNCBwaXhlbCB0byB0aGUgbGVmdCBhbmQgcmlnaHQsIGluIGJvdGggdGhlIG9sZAorLy8gIGFuZCBuZXcgZmllbGRzLCBidXQgdGFrZXMgYXZlcmFnZXMuIFRoZXNlIGFyZSBldmVuCisvLyBwaXhlbCBhZGRyZXNzZXMuIENocm9tYSBtYXRjaCB3aWxsIGJlIHVzZWQuIChZVVkyKQorICAgICAgICBNRVJHRTRQSVhhdmcoIi04KCUlIlhESSIpIiwgIjgoJSUiWFNJIiwgJSUiWENYIiwgMikiKSAgLy8gdXAgbGVmdCwgZG93biByaWdodAorICAgICAgICBNRVJHRTRQSVhhdmcoIjgoJSUiWERJIikiLCAiLTgoJSUiWFNJIiwgJSUiWENYIiwgMikiKSAgLy8gdXAgcmlnaHQsIGRvd24gbGVmdAorICAgICAgICBNRVJHRTRQSVhhdmcoIi04KCUlIlhESSIsICUlIlhDWCIpIiwgIjgoJSUiWFNJIiwgJSUiWENYIikiKSAvLyBsZWZ0LCByaWdodAorICAgICAgICBNRVJHRTRQSVhhdmcoIjgoJSUiWERJIiwgJSUiWENYIikiLCAiLTgoJSUiWFNJIiwgJSUiWENYIikiKSAvLyByaWdodCwgbGVmdAorICAgICAgICBNRVJHRTRQSVhhdmcoIi04KCUlIlhESSIsICUlIlhDWCIsIDIpIiwgIjgoJSUiWFNJIikiKSAgIC8vIGRvd24gbGVmdCwgdXAgcmlnaHQKKyAgICAgICAgTUVSR0U0UElYYXZnKCI4KCUlIlhESSIsICUlIlhDWCIsIDIpIiwgIi04KCUlIlhTSSIpIikgICAvLyBkb3duIHJpZ2h0LCB1cCBsZWZ0CisKZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wT2RkQS5pbmMgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEEuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNTM3NWYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEEuaW5jCkBAIC0wLDAgKzEsMTAgQEAKKy8vIC0qLSBjKysgLSotCisKKy8vIFNlYXJjaGVzIDEgcGl4ZWwgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0LCBpbiBib3RoIHRoZSBvbGQKKy8vICBhbmQgbmV3IGZpZWxkcywgYnV0IHRha2VzIGF2ZXJhZ2VzLiBUaGVzZSBhcmUgb2RkCisvLyBwaXhlbCBhZGRyZXNzZXMuIEFueSBjaHJvbWEgbWF0Y2ggd2lsbCBub3QgYmUgdXNlZC4gKFlVWTIpCisgICAgICAgIE1FUkdFNFBJWGF2ZygiLTIoJSUiWERJIikiLCAiMiglJSJYU0kiLCAlJSJYQ1giLCAyKSIpICAvLyB1cCBsZWZ0LCBkb3duIHJpZ2h0CisgICAgICAgIE1FUkdFNFBJWGF2ZygiMiglJSJYREkiKSIsICItMiglJSJYU0kiLCAlJSJYQ1giLCAyKSIpICAvLyB1cCByaWdodCwgZG93biBsZWZ0CisgICAgICAgIE1FUkdFNFBJWGF2ZygiLTIoJSUiWERJIiwgJSUiWENYIiwgMikiLCAiMiglJSJYU0kiKSIpICAgLy8gZG93biBsZWZ0LCB1cCByaWdodAorICAgICAgICBNRVJHRTRQSVhhdmcoIjIoJSUiWERJIiwgJSUiWENYIiwgMikiLCAiLTIoJSUiWFNJIikiKSAgIC8vIGRvd24gcmlnaHQsIHVwIGxlZnQgICAKKyNpbmNsdWRlICJTZWFyY2hMb29wT2RkQTIuaW5jIgpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBMi5pbmMgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEEyLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDNmNmZiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBMi5pbmMKQEAgLTAsMCArMSw1IEBACisvLyBTZWFyY2hlcyAxIHBpeGVsIHRvIHRoZSBsZWZ0IGFuZCByaWdodCwgaW4gYm90aCB0aGUgb2xkCisvLyBhbmQgbmV3IGZpZWxkcywgYnV0IHRha2VzIGF2ZXJhZ2VzLiBUaGVzZSBhcmUgb2RkCisvLyBwaXhlbCBhZGRyZXNzZXMuIEFueSBjaHJvbWEgbWF0Y2ggd2lsbCBub3QgYmUgdXNlZC4gKFlVWTIpCisgICAgICAgIE1FUkdFNFBJWGF2ZygiLTIoJSUiWERJIiwgJSUiWENYIikiLCAiMiglJSJYU0kiLCAlJSJYQ1giKSIpIC8vIGxlZnQsIHJpZ2h0CisgICAgICAgIE1FUkdFNFBJWGF2ZygiMiglJSJYREkiLCAlJSJYQ1giKSIsICItMiglJSJYU0kiLCAlJSJYQ1giKSIpIC8vIHJpZ2h0LCBsZWZ0CmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEE2LmluYyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wT2RkQTYuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYWUwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEE2LmluYwpAQCAtMCwwICsxLDExIEBACisvLyAtKi0gYysrIC0qLQorCisvLyBTZWFyY2hlcyAzIHBpeGVscyB0byB0aGUgbGVmdCBhbmQgcmlnaHQsIGluIGJvdGggdGhlIG9sZAorLy8gIGFuZCBuZXcgZmllbGRzLCBidXQgdGFrZXMgYXZlcmFnZXMuIFRoZXNlIGFyZSBvZGQKKy8vIHBpeGVsIGFkZHJlc3Nlcy4gQW55IGNocm9tYSBtYXRjaCB3aWxsIG5vdCBiZSB1c2VkLiAoWVVZMikKKyAgICAgICAgTUVSR0U0UElYYXZnKCItNiglJSJYREkiKSIsICI2KCUlIlhTSSIsICUlIlhDWCIsIDIpIikgIC8vIHVwIGxlZnQsIGRvd24gcmlnaHQKKyAgICAgICAgTUVSR0U0UElYYXZnKCI2KCUlIlhESSIpIiwgIi02KCUlIlhTSSIsICUlIlhDWCIsIDIpIikgIC8vIHVwIHJpZ2h0LCBkb3duIGxlZnQKKyAgICAgICAgTUVSR0U0UElYYXZnKCItNiglJSJYREkiLCAlJSJYQ1giKSIsICI2KCUlIlhTSSIsICUlIlhDWCIpIikgLy8gbGVmdCwgcmlnaHQKKyAgICAgICAgTUVSR0U0UElYYXZnKCI2KCUlIlhESSIsICUlIlhDWCIpIiwgIi02KCUlIlhTSSIsICUlIlhDWCIpIikgLy8gcmlnaHQsIGxlZnQKKyAgICAgICAgTUVSR0U0UElYYXZnKCItNiglJSJYREkiLCAlJSJYQ1giLCAyKSIsICI2KCUlIlhTSSIpIikgICAvLyBkb3duIGxlZnQsIHVwIHJpZ2h0CisgICAgICAgIE1FUkdFNFBJWGF2ZygiNiglJSJYREkiLCAlJSJYQ1giLCAyKSIsICItNiglJSJYU0kiKSIpICAgLy8gZG93biByaWdodCwgdXAgbGVmdApkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBSC5pbmMgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEFILmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTllM2M3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBSC5pbmMKQEAgLTAsMCArMSwxMCBAQAorLy8gU2VhcmNoZXMgMSBwaXhlbCB0byB0aGUgbGVmdCBhbmQgcmlnaHQsIGluIGJvdGggdGhlIG9sZA0KKy8vICBhbmQgbmV3IGZpZWxkcywgYnV0IHRha2VzIHYtaGFsZiBwZWwgYXZlcmFnZXMuIFRoZXNlIGFyZSBvZGQNCisvLyBwaXhlbCBhZGRyZXNzZXMuIEFueSBjaHJvbWEgbWF0Y2ggd2lsbCBub3QgYmUgdXNlZC4gKFlVWTIpDQorCQlfX2FzbQ0KKwkJew0KKyAgICAgICAgTUVSR0U0UElYYXZnSCgiWERJIi0yLCAiWERJIisiWENYIi0yLCAiWFNJIisiWENYIisyLCAiWFNJIisyKiJYQ1giKzIpICAvLyB1cCBsZWZ0LCBkb3duIHJpZ2h0DQorICAgICAgICBNRVJHRTRQSVhhdmdIKCJYREkiKzIsICJYREkiKyJYQ1giKzIsICJYU0kiKyJYQ1giLTIsICJYU0kiKzIqIlhDWCItMikgICAvLyB1cCByaWdodCwgZG93biBsZWZ0DQorICAgICAgICBNRVJHRTRQSVhhdmdIKCJYREkiKzIqIlhDWCItMiwgIlhESSIrIlhDWCItMiwgIlhTSSIrIlhDWCIrMiwgIlhTSSIrMikgICAvLyBkb3duIGxlZnQsIHVwIHJpZ2h0DQorICAgICAgICBNRVJHRTRQSVhhdmdIKCJYREkiKzIqIlhDWCIrMiwgIlhESSIrIlhDWCIrMiwgIlhTSSIrIlhDWCItMiwgIlhTSSItMikgICAvLyBkb3duIHJpZ2h0LCB1cCBsZWZ0ICAgDQorCQl9DQpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBSDIuaW5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BPZGRBSDIuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkN2Q4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcE9kZEFIMi5pbmMKQEAgLTAsMCArMSw1IEBACisvLyBTZWFyY2hlcyAxIHBpeGVsIHRvIHRoZSBsZWZ0IGFuZCByaWdodCwgaW4gYm90aCB0aGUgb2xkCisvLyAgYW5kIG5ldyBmaWVsZHMsIGJ1dCB0YWtlcyB2ZXJ0aWNhbCBhdmVyYWdlcy4gVGhlc2UgYXJlIG9kZAorLy8gcGl4ZWwgYWRkcmVzc2VzLiBBbnkgY2hyb21hIG1hdGNoIHdpbGwgbm90IGJlIHVzZWQuIChZVVkyKQorICAgICBNRVJHRTRQSVhhdmdIKCItMiglJSJYREkiLCAlJSJYQ1giKSIsICIoJSUiWERJIiwgJSUiWENYIikiLCAiKCUlIlhTSSIsICUlIlhDWCIpIiwgIjIoJSUiWFNJIiwgJSUiWENYIikiKSAvLyBsZWZ0LCByaWdodAorICAgICBNRVJHRTRQSVhhdmdIKCIyKCUlIlhESSIsICUlIlhDWCIpIiwgIiglJSJYREkiLCAlJSJYQ1giKSIsICIoJSUiWFNJIiwgJSUiWENYIikiLCAiLTIoJSUiWFNJIiwgJSUiWENYIikiKSAvLyByaWdodCwgbGVmdApkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BUb3AuaW5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BUb3AuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NWM3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFRvcC5pbmMKQEAgLTAsMCArMSwyNTQgQEAKKy8vIC0qLSBjKysgLSotCisKK3Vuc2lnbmVkIGNoYXIqIHBEZXN0OworY29uc3QgdW5zaWduZWQgY2hhciogcFNyY1A7Citjb25zdCB1bnNpZ25lZCBjaGFyKiBwU3JjOworY29uc3QgdW5zaWduZWQgY2hhciogcEJvYjsKK2NvbnN0IHVuc2lnbmVkIGNoYXIqIHBCb2JQOworCisvLyBsb25nIGlzIGludDMyIG9uIEFSQ0hfMzY4LCBpbnQ2NCBvbiBBUkNIX0FNRDY0LiBEZWNsYXJpbmcgaXQgdGhpcyB3YXkKKy8vIHNhdmVzIGEgbG90IG9mIHhvcidzIHRvIGRlbGV0ZSA2NGJpdCBnYXJiYWdlLgorCisjaWYgZGVmaW5lZChEQkxfUkVTSVpFKSB8fCBkZWZpbmVkKFVTRV9GT1JfRFNDQUxFUikKK2xvbmcJICAgIHNyY19waXRjaDIgPSBzcmNfcGl0Y2g7CQkJLy8gZXZlbiAmIG9kZCBsaW5lcyBhcmUgbm90IGludGVybGVhdmVkIGluIERTY2FsZXIKKyNlbHNlCitsb25nCSAgICBzcmNfcGl0Y2gyID0gMiAqIHNyY19waXRjaDsJCS8vIGV2ZW4gJiBvZGQgbGluZXMgYXJlIGludGVybGVhdmVkIGluIEF2aXN5bnRoCisjZW5kaWYKKworCitsb25nCSAgICBkc3RfcGl0Y2gyID0gMiAqIGRzdF9waXRjaDsKK2xvbmcgICAgICAgIHk7CisKK2xvbmcgICAgIExhc3Q4OworCisJcFNyYyAgPSBwV2VhdmVTcmM7CQkJLy8gcG9pbnRzIDEgd2VhdmUgbGluZSBhYm92ZQorCXBTcmNQID0gcFdlYXZlU3JjUDsJCQkvLyAiIAorCisjaWZkZWYgREJMX1JFU0laRQorCSAgICAgICAgCisjaWZkZWYgVVNFX1ZFUlRJQ0FMX0ZJTFRFUgorCXBEZXN0ID0gcFdlYXZlRGVzdCArIGRzdF9waXRjaDI7CisjZWxzZQorCXBEZXN0ID0gcFdlYXZlRGVzdCArIDMqZHN0X3BpdGNoOworI2VuZGlmCisKKyNlbHNlCisKKyNpZmRlZiBVU0VfVkVSVElDQUxfRklMVEVSCisJcERlc3QgPSBwV2VhdmVEZXN0ICsgZHN0X3BpdGNoOworI2Vsc2UKKwlwRGVzdCA9IHBXZWF2ZURlc3QgKyBkc3RfcGl0Y2gyOworI2VuZGlmCisKKyNlbmRpZgorCisJaWYgKFRvcEZpcnN0KQorCXsKKwkJcEJvYiA9IHBDb3B5U3JjICsgc3JjX3BpdGNoMjsgICAgICAvLyByZW1lbWJlciBvbmUgd2VhdmUgbGluZSBqdXN0IGNvcGllZCBwcmV2aW91c2x5CisJCXBCb2JQID0gcENvcHlTcmNQICsgc3JjX3BpdGNoMjsKKwl9CisJZWxzZQorCXsKKwkJcEJvYiA9ICBwQ29weVNyYzsKKwkJcEJvYlAgPSAgcENvcHlTcmNQOworCX0KKworI2lmbmRlZiBJU19DCisKKyNpZm5kZWYgX3BCb2IKKyNkZWZpbmUgX3BCb2IgICAgICAgIiUwIgorI2RlZmluZSBfc3JjX3BpdGNoMiAiJTEiCisjZGVmaW5lIF9TaGlmdE1hc2sgICIlMiIKKyNkZWZpbmUgX3BEZXN0ICAgICAgIiUzIgorI2RlZmluZSBfZHN0X3BpdGNodyAiJTQiCisjZGVmaW5lIF9MYXN0OCAgICAgICIlNSIKKyNkZWZpbmUgX3BTcmMgICAgICAgIiU2IgorI2RlZmluZSBfcFNyY1AgICAgICAiJTciCisjZGVmaW5lIF9wQm9iUCAgICAgICIlOCIKKyNkZWZpbmUgX0RpZmZUaHJlcyAgIiU5IgorI2RlZmluZSBfTWluX1ZhbHMgICAiJTEwIgorI2RlZmluZSBfTWF4X1ZhbHMgICAiJTExIgorI2RlZmluZSBfRk9VUlMgICAgICAiJTEyIgorI2RlZmluZSBfVEVOUyAgICAgICAiJTEzIgorI2RlZmluZSBfT05FUyAgICAgICAiJTE0IgorI2RlZmluZSBfVVZNYXNrICAgICAiJTE1IgorI2RlZmluZSBfTWF4X01vdiAgICAiJTE2IgorI2RlZmluZSBfWU1hc2sgICAgICAiJTE3IgorI2RlZmluZSBfb2xkYnggICAgICAiJTE4IgorI2VuZGlmCisgICAgICAgIExhc3Q4ID0gKHJvd3NpemUtOCk7CisKKwlmb3IgKHk9MTsgeSA8IEZsZEhlaWdodC0xOyB5KyspCQorCXsJCisgICAgICAgICAgbG9uZwlkc3RfcGl0Y2h3ID0gZHN0X3BpdGNoOyAvLyBsb2NhbCBzdG9yIHNvIGFzbSBjYW4gcmVmCisgICAgICAgICAgaW50NjRfdCBNYXhfTW92ICAgPSAweDA0MDQwNDA0MDQwNDA0MDR1bGw7IAorICAgICAgICAgIGludDY0X3QgRGlmZlRocmVzID0gMHgwZjBmMGYwZjBmMGYwZjBmdWxsOyAKKyAgICAgICAgICBpbnQ2NF90IFlNYXNrICAgICA9IDB4MDBmZjAwZmYwMGZmMDBmZnVsbDsgLy8ga2VlcHMgb25seSBsdW1hCisgICAgICAgICAgaW50NjRfdCBVVk1hc2sgICAgPSAweGZmMDBmZjAwZmYwMGZmMDB1bGw7IC8vIGtlZXBzIG9ubHkgY2hyb21hCisgICAgICAgICAgaW50NjRfdCBURU5TICAgICAgPSAweDBhMGEwYTBhMGEwYTBhMGF1bGw7IAorICAgICAgICAgIGludDY0X3QgRk9VUlMgICAgID0gMHgwNDA0MDQwNDA0MDQwNDA0dWxsOyAKKyAgICAgICAgICBpbnQ2NF90IE9ORVMgICAgICA9IDB4MDEwMTAxMDEwMTAxMDEwMXVsbDsgCisgICAgICAgICAgaW50NjRfdCBNaW5fVmFscyAgPSAweDAwMDAwMDAwMDAwMDAwMDB1bGw7CisgICAgICAgICAgaW50NjRfdCBNYXhfVmFscyAgPSAweDAwMDAwMDAwMDAwMDAwMDB1bGw7CisgICAgICAgICAgaW50NjRfdCBTaGlmdE1hc2sgPSAweGZlZmZmZWZmZmVmZmZlZmZ1bGw7CisKKyAgICAgICAgICBsb25nIG9sZGJ4ID0gMDsKKworCQkvLyBwcmV0ZW5kIGl0J3MgaW5kZW50ZWQgLS0+PgorICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXworICAgICAgICAgICAgKAorICAgICAgICAgICAgIC8vIExvb3AgZ2VuZXJhbCByZWcgdXNhZ2UKKyAgICAgICAgICAgICAvLworICAgICAgICAgICAgIC8vIFhBWCAtIHBCb2JQLCB0aGVuIHBEZXN0IAorICAgICAgICAgICAgIC8vIFhCWCAtIHBCb2IKKyAgICAgICAgICAgICAvLyBYQ1ggLSBzcmNfcGl0Y2gyCisgICAgICAgICAgICAgLy8gWERYIC0gY3VycmVudCBvZmZzZXQKKyAgICAgICAgICAgICAvLyBYREkgLSBwcmV2IHdlYXZlIHBpeGVscywgMSBsaW5lIHVwCisgICAgICAgICAgICAgLy8gWFNJIC0gbmV4dCB3ZWF2ZSBwaXhlbHMsIDEgbGluZSB1cAorCisgICAgICAgICAgICAgLy8gU2F2ZSAiWEJYIiAoLWZQSUMpCisJICAgICBNT1ZYIiAlJSJYQlgiLCAiX29sZGJ4IlxuXHQiCisgICAgICAgICAgICAgCisgICAgICAgICAgICAgLy8gc2ltcGxlIGJvYiBmaXJzdCA4IGJ5dGVzCisgICAgICAgICAgICAgTU9WWCIJIl9wQm9iIiwgICAgICAgICUlIlhCWCJcblx0IgorICAgICAgICAgICAgIE1PVlgiCSJfc3JjX3BpdGNoMiIsICAlJSJYQ1giXG5cdCIKKworI2lmZGVmIFVTRV9WRVJUSUNBTF9GSUxURVIKKyAgICAgICAgICAgICAibW92cQkgICAgKCUlIlhCWCIpLCAgICAgICAgJSVtbTBcblx0IgorICAgICAgICAgICAgICJtb3ZxCSAgICAoJSUiWEJYIiwgJSUiWENYIiksICUlbW0xXG5cdCIgLy8sIHF3b3JkIHB0clsiWEJYIisiWENYIl0KKyAgICAgICAgICAgICAibW92cQkgICAgJSVtbTAsICAgICAgICAgICUlbW0yXG5cdCIKKyAgICAgICAgICAgICBWX1BBVkdCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTMiLCBfU2hpZnRNYXNrKQkJLy8gaGFsZndheSBiZXR3ZWVuCisgICAgICAgICAgICAgVl9QQVZHQiAoIiUlbW0wIiwgIiUlbW0yIiwgIiUlbW0zIiwgX1NoaWZ0TWFzaykJCS8vIDEvNCB3YXkKKyAgICAgICAgICAgICBWX1BBVkdCICgiJSVtbTEiLCAiJSVtbTIiLCAiJSVtbTMiLCBfU2hpZnRNYXNrKQkJLy8gMy80IHdheQorICAgICAgICAgICAgIE1PVlgiCQkiX3BEZXN0IiwgICAgICAgJSUiWERJIlxuXHQiCisgICAgICAgICAgICAgTU9WWCIJCSJfZHN0X3BpdGNodyIsICAlJSJYQVgiXG5cdCIKKyAgICAgICAgICAgICBWX01PVk5UUQkoIiglJSJYREkiKSIsICIlJW1tMCIpCisgICAgICAgICAgICAgVl9NT1ZOVFEJKCIoJSUiWERJIiwgJSUiWEFYIikiLCAiJSVtbTEiKSAvLyBxd29yZCBwdHJbIlhESSIrIlhBWCJdLCBtbTEKKworICAgICAgICAgICAgIC8vIHNpbXBsZSBib2IgbGFzdCA4IGJ5dGVzCisgICAgICAgICAgICAgTU9WWCIJCSJfTGFzdDgiLCAlJSJYRFgiXG5cdCIKKyAgICAgICAgICAgICBMRUFYIgkJKCUlIlhCWCIsICUlIlhEWCIpLCAlJSJYU0kiXG5cdCIgIC8vIFsiWEJYIisiWERYIl0KKyAgICAgICAgICAgICAibW92cQkgICAgKCUlIlhTSSIpLCAlJW1tMFxuXHQiCisgICAgICAgICAgICAgIm1vdnEJICAgICglJSJYU0kiLCAlJSJYQ1giKSwgJSVtbTFcblx0IiAgICAvLyBxd29yZCBwdHJbIlhTSSIrIlhDWCJdCisgICAgICAgICAgICAgIm1vdnEJICAgICUlbW0wLCAlJW1tMlxuXHQiCisgICAgICAgICAgICAgVl9QQVZHQiAoIiUlbW0yIiwgIiUlbW0xIiwgIiUlbW0zIiwgX1NoaWZ0TWFzaykJCS8vIGhhbGZ3YXkgYmV0d2VlbgorICAgICAgICAgICAgIFZfUEFWR0IgKCIlJW1tMCIsICIlJW1tMiIsICIlJW1tMyIsIF9TaGlmdE1hc2spCQkvLyAxLzQgd2F5CisgICAgICAgICAgICAgVl9QQVZHQiAoIiUlbW0xIiwgIiUlbW0yIiwgIiUlbW0zIiwgX1NoaWZ0TWFzaykJCS8vIDMvNCB3YXkKKyAgICAgICAgICAgICBBRERYIgkJJSUiWERYIiwgJSUiWERJIlxuXHQiCQkJCQkJLy8gbGFzdCA4IGJ5dGVzIG9mIGRlc3QKKyAgICAgICAgICAgICBWX01PVk5UUQkoIiUlIlhESSIiLCAiJSVtbTAiKQorICAgICAgICAgICAgIFZfTU9WTlRRCSgiKCUlIlhESSIsICUlIlhBWCIpIiwgIiUlbW0xIikgLy8gcXdvcmQgcHRyWyJYREkiKyJYQVgiXSwgbW0xKQorCisjZWxzZQorICAgICAgICAgICAgICJtb3ZxCSglJSJYQlgiKSwgJSVtbTBcblx0IgorICAgICAgICAgICAgIC8vCQlwYXZnYgltbTAsIHF3b3JkIHB0clsiWEJYIisiWENYIl0KKyAgICAgICAgICAgICBWX1BBVkdCICgiJSVtbTAiLCAiKCUlIlhCWCIsICUlIlhDWCIpIiwgIiUlbW0yIiwgX1NoaWZ0TWFzaykgLy8gcXdvcmQgcHRyWyJYQlgiKyJYQ1giXSwgbW0yLCBTaGlmdE1hc2spCisgICAgICAgICAgICAgTU9WWCIJCSJfcERlc3QiLCAlJSJYREkiXG5cdCIKKyAgICAgICAgICAgICBWX01PVk5UUQkoIiglJSJYREkiKSIsICIlJW1tMCIpCisKKyAgICAgICAgICAgICAvLyBzaW1wbGUgYm9iIGxhc3QgOCBieXRlcworICAgICAgICAgICAgIE1PVlgiCQkiX0xhc3Q4IiwgJSUiWERYIlxuXHQiCisgICAgICAgICAgICAgTEVBWCIJCSglJSJYQlgiLCAlJSJYRFgiKSwgJSUiWFNJIlxuXHQiIC8vIlhTSSIsIFsiWEJYIisiWERYIl0KKyAgICAgICAgICAgICAibW92cQkgICAgKCUlIlhTSSIpLCAlJW1tMFxuXHQiCisgICAgICAgICAgICAgLy8JCXBhdmdiCW1tMCwgcXdvcmQgcHRyWyJYU0kiKyJYQ1giXQorICAgICAgICAgICAgIFZfUEFWR0IJKCIlJW1tMCIsICIoJSUiWFNJIiwgJSUiWENYIikiLCAiJSVtbTIiLCBfU2hpZnRNYXNrKSAvLyBxd29yZCBwdHJbIlhTSSIrIlhDWCJdLCBtbTIsIFNoaWZ0TWFzaykKKyAgICAgICAgICAgICBWX01PVk5UUQkoIiglJSJYREkiLCAlJSJYRFgiKSIsICIlJW1tMCIpIC8vIHF3b3JkIHB0clsiWERJIisiWERYIl0sIG1tMCkKKyNlbmRpZgorICAgICAgICAgICAgIC8vIG5vdyBsb29wIGFuZCBnZXQgdGhlIG1pZGRsZSBxd29yZHMKKyAgICAgICAgICAgICBNT1ZYIgkJIl9wU3JjIiwgJSUiWFNJIlxuXHQiCisgICAgICAgICAgICAgTU9WWCIJCSJfcFNyY1AiLCAlJSJYREkiXG5cdCIKKyAgICAgICAgICAgICBNT1ZYIgkJJDgsICUlIlhEWCJcblx0IgkJCQkvLyBjdXJyIG9mZnNldCBsb25nbyBhbGwgbGluZXMKKworICAgICAgICAgICAgICIxOlxuXHQiCQorICAgICAgICAgICAgIE1PVlgiCQkiX3BCb2JQIiwgJSUiWEFYIlxuXHQiCisgICAgICAgICAgICAgQUREWCIJCSQ4LCAlJSJYREkiXG5cdCIKKyAgICAgICAgICAgICBBRERYIgkJJDgsICUlIlhTSSJcblx0IgorICAgICAgICAgICAgIEFERFgiCQkkOCwgJSUiWEJYIlxuXHQiCisgICAgICAgICAgICAgQUREWCIJCSUlIlhEWCIsICUlIlhBWCJcblx0IgorCisjaWZkZWYgVVNFX1NUUkFOR0VfQk9CCisjaW5jbHVkZSAiU3RyYW5nZUJvYi5pbmMiCisjZWxzZQorI2luY2x1ZGUgIldpZXJkQm9iLmluYyIKKyNlbmRpZgorCisgICAgICAgICAgICAgLy8gRm9yIG5vbi1TU0UyOgorICAgICAgICAgICAgIC8vIHRocm91Z2ggb3V0IG1vc3Qgb2YgdGhlIHJlc3Qgb2YgdGhpcyBsb29wIHdlIHdpbGwgbWFpbnRhaW4KKyAgICAgICAgICAgICAvLwltbTQJCW91ciBtaW4gYm9iIHZhbHVlCisgICAgICAgICAgICAgLy8JbW01CQliZXN0IHdlYXZlIHBpeGVscyBzbyBmYXIKKyAgICAgICAgICAgICAvLyBtbTYJCW91ciBtYXggQm9iIHZhbHVlIAorICAgICAgICAgICAgIC8vCW1tNwkJYmVzdCB3ZWlnaHRlZCBwaXhlbCByYXRpbmdzIHNvIGZhcgorICAgICAgICAgICAgIAorICAgICAgICAgICAgIC8vIFdlIHdpbGwga2VlcCBhIHNsaWdodCBiaWFzIHRvIHVzaW5nIHRoZSB3ZWF2ZSBwaXhlbHMKKyAgICAgICAgICAgICAvLyBmcm9tIHRoZSBjdXJyZW50IGxvY2F0aW9uLCBieSByYXRpbmcgdGhlbSBieSB0aGUgbWluIGRpc3RhbmNlCisgICAgICAgICAgICAgLy8gZnJvbSB0aGUgQm9iIHZhbHVlIGluc3RlYWQgb2YgdGhlIGF2ZyBkaXN0YW5jZSBmcm9tIHRoYXQgdmFsdWUuCisgICAgICAgICAgICAgLy8gb3VyIGJlc3QgYW5kIG9ubHkgcmF0aW5nIHNvIGZhcgorICAgICAgICAgICAgICJwY21wZXFiCSUlbW03LCAlJW1tN1xuXHQiCQkJLy8gZmZmZiwgc2F5IHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nIGdvb2QgeWV0CisKKyNlbHNlCisgICAgICAgIExhc3Q4ID0gKHJvd3NpemUgLSA0KTsKKworCWZvciAoeT0xOyB5IDwgRmxkSGVpZ2h0LTE7IHkrKykKKwl7CisJICAjaWZkZWYgVVNFX1NUUkFOR0VfQk9CCisJICBsb25nIERpZmZUaHJlcyA9IDB4MGY7CisJICAjZW5kaWYKKworCSAgI2lmbmRlZiBTS0lQX1NFQVJDSAorCSAgbG9uZyB3ZWF2ZVsyXSwgTWF4VmFsc1syXSwgTWluVmFsc1syXTsKKwkgICNlbmRpZgorCisJICBsb25nIGRpZmZbMl0sIGJlc3RbMl0sIGF2Z1syXSwgZGlmZjJbMl0sIG91dFsyXSwgeDsKKworI2lmZGVmIFVTRV9WRVJUSUNBTF9GSUxURVIKKyAgICAgICAgICAgICBwRGVzdFswXSA9ICgzICogcEJvYlswXSArIHBCb2Jbc3JjX3BpdGNoMl0pIC8gNDsKKyAgICAgICAgICAgICBwRGVzdFsxXSA9ICgzICogcEJvYlsxXSArIHBCb2Jbc3JjX3BpdGNoMiArIDFdKSAvIDQ7CisgICAgICAgICAgICAgcERlc3RbMl0gPSAoMyAqIHBCb2JbMl0gKyBwQm9iW3NyY19waXRjaDIgKyAyXSkgLyA0OworICAgICAgICAgICAgIHBEZXN0WzNdID0gKDMgKiBwQm9iWzNdICsgcEJvYltzcmNfcGl0Y2gyICsgM10pIC8gNDsKKwkgICAgIHBEZXN0W2RzdF9waXRjaHddID0gKHBCb2JbMF0gKyAzICogcEJvYltzcmNfcGl0Y2gyXSkgLyA0OworCSAgICAgcERlc3RbZHN0X3BpdGNodyArIDFdID0gKHBCb2JbMV0gKyAzICogcEJvYltzcmNfcGl0Y2gyICsgMV0pIC8gNDsKKwkgICAgIHBEZXN0W2RzdF9waXRjaHcgKyAyXSA9IChwQm9iWzJdICsgMyAqIHBCb2Jbc3JjX3BpdGNoMiArIDJdKSAvIDQ7CisJICAgICBwRGVzdFtkc3RfcGl0Y2h3ICsgM10gPSAocEJvYlszXSArIDMgKiBwQm9iW3NyY19waXRjaDIgKyAzXSkgLyA0OworCisgICAgICAgICAgICAgLy8gc2ltcGxlIGJvYiBsYXN0IGJ5dGUKKwkgICAgIHBEZXN0W0xhc3Q4XSA9ICgzICogcEJvYltMYXN0OF0gKyBwQm9iW0xhc3Q4ICsgc3JjX3BpdGNoMl0pIC8gNDsKKwkgICAgIHBEZXN0W0xhc3Q4ICsgMV0gPSAoMyAqIHBCb2JbTGFzdDggKyAxXSArIHBCb2JbTGFzdDggKyBzcmNfcGl0Y2gyICsgMV0pIC8gNDsKKwkgICAgIHBEZXN0W0xhc3Q4ICsgMl0gPSAoMyAqIHBCb2JbTGFzdDggKyAyXSArIHBCb2JbTGFzdDggKyBzcmNfcGl0Y2gyICsgMl0pIC8gNDsKKwkgICAgIHBEZXN0W0xhc3Q4ICsgM10gPSAoMyAqIHBCb2JbTGFzdDggKyAzXSArIHBCb2JbTGFzdDggKyBzcmNfcGl0Y2gyICsgM10pIC8gNDsKKwkgICAgIHBEZXN0W0xhc3Q4ICsgc3JjX3BpdGNoMl0gPSAocEJvYltMYXN0OF0gKyAzICogcEJvYltMYXN0OCArIHNyY19waXRjaDJdKSAvIDQ7CisJICAgICBwRGVzdFtMYXN0OCArIHNyY19waXRjaDIgKyAxXSA9IChwQm9iW0xhc3Q4ICsgMV0gKyAzICogcEJvYltMYXN0OCArIHNyY19waXRjaDIgKyAxXSkgLyA0OworCSAgICAgcERlc3RbTGFzdDggKyBzcmNfcGl0Y2gyICsgMl0gPSAocEJvYltMYXN0OCArIDJdICsgMyAqIHBCb2JbTGFzdDggKyBzcmNfcGl0Y2gyICsgMl0pIC8gNDsKKwkgICAgIHBEZXN0W0xhc3Q4ICsgc3JjX3BpdGNoMiArIDNdID0gKHBCb2JbTGFzdDggKyAzXSArIDMgKiBwQm9iW0xhc3Q4ICsgc3JjX3BpdGNoMiArIDNdKSAvIDQ7CisjZWxzZQorICAgICAgICAgICAgIHBEZXN0WzBdID0gKHBCb2JbMF0gKyBwQm9iW3NyY19waXRjaDIgKyAxXSkgLyAyOworICAgICAgICAgICAgIHBEZXN0WzFdID0gKHBCb2JbMV0gKyBwQm9iW3NyY19waXRjaDIgKyAxXSkgLyAyOworICAgICAgICAgICAgIHBEZXN0WzJdID0gKHBCb2JbMl0gKyBwQm9iW3NyY19waXRjaDIgKyAyXSkgLyAyOworICAgICAgICAgICAgIHBEZXN0WzNdID0gKHBCb2JbM10gKyBwQm9iW3NyY19waXRjaDIgKyAzXSkgLyAyOworCisgICAgICAgICAgICAgLy8gc2ltcGxlIGJvYiBsYXN0IGJ5dGUKKwkgICAgIHBEZXN0W0xhc3Q4XSA9IChwQm9iW0xhc3Q4XSArIHBCb2JbTGFzdDggKyBzcmNfcGl0Y2gyXSkgLyAyOworCSAgICAgcERlc3RbTGFzdDggKyAxXSA9IChwQm9iW0xhc3Q4ICsgMV0gKyBwQm9iW0xhc3Q4ICsgc3JjX3BpdGNoMiArIDFdKSAvIDI7CisJICAgICBwRGVzdFtMYXN0OCArIDJdID0gKHBCb2JbTGFzdDggKyAyXSArIHBCb2JbTGFzdDggKyBzcmNfcGl0Y2gyICsgMl0pIC8gMjsKKwkgICAgIHBEZXN0W0xhc3Q4ICsgM10gPSAocEJvYltMYXN0OCArIDNdICsgcEJvYltMYXN0OCArIHNyY19waXRjaDIgKyAzXSkgLyAyOworI2VuZGlmCisKKyAgICAgICAgICAgICBwQm9iICs9IDQ7CisJICAgICBwQm9iUCArPSA0OworCSAgICAgcFNyYyArPSA0OworCSAgICAgcFNyY1AgKz0gNDsKKworICAgICAgICAgICAgIGZvciAoeD00OyB4IDwgTGFzdDg7IHggKz0gMikgeworCisjaWZkZWYgVVNFX1NUUkFOR0VfQk9CCisjaW5jbHVkZSAiU3RyYW5nZUJvYi5pbmMiCisjZWxzZQorI2luY2x1ZGUgIldpZXJkQm9iLmluYyIKKyNlbmRpZgorCisgICAgICAgICAgICAgLy8gV2Ugd2lsbCBrZWVwIGEgc2xpZ2h0IGJpYXMgdG8gdXNpbmcgdGhlIHdlYXZlIHBpeGVscworICAgICAgICAgICAgIC8vIGZyb20gdGhlIGN1cnJlbnQgbG9jYXRpb24sIGJ5IHJhdGluZyB0aGVtIGJ5IHRoZSBtaW4gZGlzdGFuY2UKKyAgICAgICAgICAgICAvLyBmcm9tIHRoZSBCb2IgdmFsdWUgaW5zdGVhZCBvZiB0aGUgYXZnIGRpc3RhbmNlIGZyb20gdGhhdCB2YWx1ZS4KKyAgICAgICAgICAgICAvLyBvdXIgYmVzdCBhbmQgb25seSByYXRpbmcgc28gZmFyCisgICAgICAgICAgICAgZGlmZlswXSA9IGRpZmZbMV0gPSAyNTU7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFZBLmluYyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TZWFyY2hMb29wVkEuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlM2QxOWIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFZBLmluYwpAQCAtMCwwICsxLDYgQEAKKy8vIC0qLSBjKysgLSotCisKKy8vIFNlYXJjaGVzIHRoZSBjZW50ZXIgdmVydGljYWwgbGluZSBhYm92ZSBjZW50ZXIgYW5kIGJlbG93LCBpbiBib3RoIHRoZSBvbGQgCisvLyBhbmQgbmV3IGZpZWxkcywgYnV0IHRha2VzIGF2ZXJhZ2VzLiAgVGhlc2UgYXJlIGV2ZW4gcGl4ZWwgYWRkcmVzc2VzLgorICAgICAgICBNRVJHRTRQSVhhdmcoIiglJSJYREkiLCAlJSJYQ1giLCAyKSIsICIoJSUiWFNJIikiKQkvLyBkb3duLCB1cAorICAgICAgICBNRVJHRTRQSVhhdmcoIiglJSJYREkiKSIsICIoJSUiWFNJIiwgJSUiWENYIiwgMikiKQkvLyB1cCwgZG93bgpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BWQUguaW5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1NlYXJjaExvb3BWQUguaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMTU1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvU2VhcmNoTG9vcFZBSC5pbmMKQEAgLTAsMCArMSw2IEBACisvLyAtKi0gYysrIC0qLQorCisvLyBTZWFyY2hlcyB0aGUgY2VudGVyIHZlcnRpY2FsIGxpbmUgYWJvdmUgY2VudGVyIGFuZCBiZWxvdywgaW4gYm90aCB0aGUgb2xkIAorLy8gYW5kIG5ldyBmaWVsZHMsIGJ1dCB0YWtlcyBhdmVyYWdlcy4gIFRoZXNlIGFyZSBldmVuIHBpeGVsIGFkZHJlc3Nlcy4KKyAgICAgICAgTUVSR0U0UElYYXZnSCgiKCUlIlhESSIsICUlIlhDWCIsIDIpIiwgIiglJSJYREkiLCAlJSJYQ1giKSIsICIoJSUiWFNJIiwgJSUiWENYIikiLCAiKCUlIlhTSSIpIikJLy8gZG93biwgdXAKKyAgICAgICAgTUVSR0U0UElYYXZnSCgiKCUlIlhESSIpIiwgIiglJSJYREkiLCAlJSJYQ1giKSIsICIoJSUiWFNJIiwgJSUiWENYIikiLCAiKCUlIlhTSSIsICUlIlhDWCIsIDIpIikJLy8gdXAsIGRvd24KZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TdHJhbmdlQm9iLmluYyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9TdHJhbmdlQm9iLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWI0Yzg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1N0cmFuZ2VCb2IuaW5jCkBAIC0wLDAgKzEsNDM1IEBACisvLyAtKi0gYysrIC0qLQorCQkKKwkJLy8gRmlyc3QsIGdldCBhbmQgc2F2ZSBvdXIgcG9zc2libGUgQm9iIHZhbHVlcworCQkvLyBBc3N1bWUgb3VyIHBpeGVscyBhcmUgbGF5ZWQgb3V0IGFzIGZvbGxvd3Mgd2l0aCB4IHRoZSBjYWxjJ2QgYm9iIHZhbHVlCisJCS8vIGFuZCB0aGUgb3RoZXIgcGl4ZWxzIGFyZSBmcm9tIHRoZSBjdXJyZW50IGZpZWxkCisJCS8vICAKKwkJLy8JICBqIGEgYiBjIGsJCWN1cnJlbnQgZmllbGQKKwkJLy8gICAgICAgICAgICB4CQkJY2FsY3VsYXRlZCBsaW5lCisJCS8vICAgICAgICBtIGQgZSBmIG4JCWN1cnJlbnQgZmllbGQKKwkJLy8KKwkJLy8gd2UgY2FsYyB0aGUgYm9iIHZhbHVlIGx1bWEgdmFsdWUgYXM6CisgICAgICAgIC8vIGlmIHxqIC0gbnwgPCBUaHJlcyAmJiB8YSAtIG18ID4gVGhyZXMgCisgICAgICAgIC8vICBhdmcoaixuKQorICAgICAgICAvLyBlbmQgaWYKKyAgICAgICAgLy8gaWYgfGsgLSBtfCA8IFRocmVzICYmIHxjIC0gbnwgPiBUaHJlcyAKKyAgICAgICAgLy8gIGF2ZyhrLG0pCisgICAgICAgIC8vIGVuZCBpZgorICAgICAgICAvLyBpZiB8YyAtIGR8IDwgVGhyZXMgJiYgfGIgLSBmfCA+IFRocmVzIAorICAgICAgICAvLyAgYXZnKGMsZCkKKyAgICAgICAgLy8gZW5kIGlmCisgICAgICAgIC8vIGlmIHxhIC0gZnwgPCBUaHJlcyAmJiB8YiAtIGR8ID4gVGhyZXMgCisgICAgICAgIC8vICBhdmcoYSxmKQorICAgICAgICAvLyBlbmQgaWYKKyAgICAgICAgLy8gaWYgfGIgLSBlfCA8IFRocmVzCisgICAgICAgIC8vICBhdmcoYixlKQorICAgICAgICAvLyBlbmQgaWYKKyAgICAgICAgLy8gcGlja3VwIGFueSB0aGluZyBub3QgeWV0IHNldCB3aXRoIGF2ZyhiLGUpCisKKyNpZm5kZWYgSVNfQworCisJCS8vIGosIG4KKyAgICAgICAgInB4b3IgJSVtbTUsICUlbW01XG5cdCIKKyAgICAgICAgInB4b3IgJSVtbTYsICUlbW02XG5cdCIKKyAgICAgICAgInB4b3IgJSVtbTcsICUlbW03XG5cdCIKKworCQkibW92cSAgICAtMiglJSJYQlgiKSwgJSVtbTBcblx0IgkJLy8gdmFsdWUgYSBmcm9tIHRvcCBsZWZ0CQkKKwkJIm1vdnEgICAgLTQoJSUiWEJYIiwgJSUiWENYIiksICUlbW0xXG5cdCIJLy8gdmFsdWUgbSBmcm9tIGJvdHRvbSByaWdodAkJCQorICAgICAgICAKKwkJIm1vdnEJJSVtbTAsICUlbW0zXG5cdCIKKwkJInBzdWJ1c2IJJSVtbTEsICUlbW0zXG5cdCIKKwkJInBzdWJ1c2IgJSVtbTAsICUlbW0xXG5cdCIKKwkJInBvcgkJJSVtbTEsICUlbW0zXG5cdCIJCQkJCS8vIGFicyhhLG0pCisKKwkJInBzdWJ1c2IgIl9EaWZmVGhyZXMiLCAlJW1tM1xuXHQiCQkvLyBub256ZXJvIHdoZXJlIGFicyhhLG0pID4gVGhyZXMgZWxzZSAwCisJCSJweG9yCSUlbW00LCAlJW1tNFxuXHQiCisJCSJwY21wZXFiICUlbW00LCAlJW1tM1xuXHQiCQkJLy8gbm93IGZmIHdoZXJlIGFicyhhLG0pIDwgVGhyZXMsIGVsc2UgMDAJCisJCSJwY21wZXFiCSUlbW0zLCAlJW1tNFxuXHQiCQkJLy8gaGVyZSBmZiB3aGVyZSBhYnMoYSxtKSA+IFRocmVzLCBlbHNlIDAwCisKKworCQkibW92cSAgICAtNCglJSJYQlgiKSwgJSVtbTBcblx0IgkJLy8gdmFsdWUgagorCQkibW92cSAgICA0KCUlIlhCWCIsICUlIlhDWCIpLCAlJW1tMVxuXHQiCS8vIHZhbHVlIG4KKwkJIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIJCQkJCQorCQlWX1BBVkdCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTMiLCBfU2hpZnRNYXNrKQkvLyBhdmcoaixuKQorICAgICAgICAibW92cQklJW1tMCwgJSVtbTNcblx0IgorCQkicHN1YnVzYgklJW1tMSwgJSVtbTBcblx0IgorCQkicHN1YnVzYiAlJW1tMywgJSVtbTFcblx0IgorCQkicG9yCQklJW1tMSwgJSVtbTBcblx0IgkJCQkJLy8gYWJzKGosbikKKworICAgICAgICAibW92cSAgICAlJW1tMCwgJSVtbTFcblx0IgorCQkicHN1YnVzYiAiX0RpZmZUaHJlcyIsICUlbW0xXG5cdCIJCS8vIG5vbnplcm8gd2hlcmUgYWJzKGosbikgPiBUaHJlcyBlbHNlIDAKKwkJInB4b3IJJSVtbTMsICUlbW0zXG5cdCIKKwkJInBjbXBlcWIgJSVtbTMsICUlbW0xXG5cdCIJCQkvLyBub3cgZmYgd2hlcmUgYWJzKGosbikgPCBUaHJlcywgZWxzZSAwMAkKKworICAgICAgICAicGFuZCAgICAlJW1tNCwgJSVtbTFcblx0IgorICAgICAgICAicGFuZCAgICAlJW1tMSwgJSVtbTJcblx0IgorICAgICAgICAicGFuZCAgICAlJW1tMSwgJSVtbTBcblx0IgorCisgICAgICAgICJtb3ZxICAgICUlbW0xLCAlJW1tM1xuXHQiCisgICAgICAgICJweG9yICAgICUlbW01LCAlJW1tM1xuXHQiCisgICAgICAgICJwYW5kICAgICUlbW0zLCAlJW1tNlxuXHQiCisgICAgICAgICJwYW5kICAgICUlbW0zLCAlJW1tN1xuXHQiCisgICAgICAgICJwYW5kICAgICUlbW0zLCAlJW1tNVxuXHQiCisKKyAgICAgICAgInBvciAgICAgJSVtbTEsICUlbW01XG5cdCIKKyAgICAgICAgInBvciAgICAgJSVtbTIsICUlbW02XG5cdCIKKyAgICAgICAgInBvciAgICAgJSVtbTAsICUlbW03XG5cdCIKKyAgICAgICAgCisgICAgICAgIC8vIGsgJiBtCisJCSJtb3ZxICAgIDIoJSUiWEJYIiksICUlbW0wXG5cdCIJCS8vIHZhbHVlIGMgZnJvbSB0b3AgbGVmdAkJCisJCSJtb3ZxICAgIDQoJSUiWEJYIiwgJSUiWENYIiksICUlbW0xXG5cdCIJLy8gdmFsdWUgbiBmcm9tIGJvdHRvbSByaWdodAkJCQorCisJCSJtb3ZxCSUlbW0wLCAlJW1tM1xuXHQiCisJCSJwc3VidXNiCSUlbW0xLCAlJW1tM1xuXHQiCisJCSJwc3VidXNiICUlbW0wLCAlJW1tMVxuXHQiCisJCSJwb3IJCSUlbW0xLCAlJW1tM1xuXHQiCQkJCQkvLyBhYnMoYyxuKQorCisJCSJwc3VidXNiICJfRGlmZlRocmVzIiwgJSVtbTNcblx0IgkJLy8gbm9uemVybyB3aGVyZSBhYnMoYyxuKSA+IFRocmVzIGVsc2UgMAorCQkicHhvcgklJW1tNCwgJSVtbTRcblx0IgorCQkicGNtcGVxYiAlJW1tNCwgJSVtbTNcblx0IgkJCS8vIG5vdyBmZiB3aGVyZSBhYnMoYyxuKSA8IFRocmVzLCBlbHNlIDAwCQorCQkicGNtcGVxYgklJW1tMywgJSVtbTRcblx0IgkJCS8vIGhlcmUgZmYgd2hlcmUgYWJzKGMsbikgPiBUaHJlcywgZWxzZSAwMAorCisKKwkJIm1vdnEgICAgNCglJSJYQlgiKSwgJSVtbTBcblx0IgkJLy8gdmFsdWUgaworCQkibW92cSAgICAtNCglJSJYQlgiLCAlJSJYQ1giKSwgJSVtbTFcblx0IgkvLyB2YWx1ZSBtCisJCSJtb3ZxCSUlbW0wLCAlJW1tMlxuXHQiCQkJCQkKKwkJVl9QQVZHQiAoIiUlbW0yIiwgIiUlbW0xIiwgIiUlbW0zIiwgX1NoaWZ0TWFzaykJLy8gYXZnKGssbSkKKyAgICAgICAgIm1vdnEJJSVtbTAsICUlbW0zXG5cdCIKKwkJInBzdWJ1c2IJJSVtbTEsICUlbW0wXG5cdCIKKwkJInBzdWJ1c2IgJSVtbTMsICUlbW0xXG5cdCIKKwkJInBvcgkJJSVtbTEsICUlbW0wXG5cdCIJCQkJCS8vIGFicyhrLG0pCisKKyAgICAgICAgIm1vdnEgICAgJSVtbTAsICUlbW0xXG5cdCIKKwkJInBzdWJ1c2IgIl9EaWZmVGhyZXMiLCAlJW1tMVxuXHQiCQkvLyBub256ZXJvIHdoZXJlIGFicyhrLG0pID4gVGhyZXMgZWxzZSAwCisJCSJweG9yCSUlbW0zLCAlJW1tM1xuXHQiCisJCSJwY21wZXFiICUlbW0zLCAlJW1tMVxuXHQiCQkJLy8gbm93IGZmIHdoZXJlIGFicyhrLG0pIDwgVGhyZXMsIGVsc2UgMDAJCisKKyAgICAgICAgInBhbmQgICAgJSVtbTQsICUlbW0xXG5cdCIKKyAgICAgICAgCisgICAgICAgICJwYW5kICAgICUlbW0xLCAlJW1tMlxuXHQiCisgICAgICAgICJwYW5kICAgICUlbW0xLCAlJW1tMFxuXHQiCisKKyAgICAgICAgIm1vdnEgICAgJSVtbTEsICUlbW0zXG5cdCIKKyAgICAgICAgInB4b3IgICAgJSVtbTUsICUlbW0zXG5cdCIKKyAgICAgICAgInBhbmQgICAgJSVtbTMsICUlbW02XG5cdCIKKyAgICAgICAgInBhbmQgICAgJSVtbTMsICUlbW03XG5cdCIKKyAgICAgICAgInBhbmQgICAgJSVtbTMsICUlbW01XG5cdCIKKworICAgICAgICAicG9yICAgICAlJW1tMSwgJSVtbTVcblx0IgorICAgICAgICAicG9yICAgICAlJW1tMiwgJSVtbTZcblx0IgorICAgICAgICAicG9yICAgICAlJW1tMCwgJSVtbTdcblx0IgorCisKKyAgICAgICAgLy8gYyAmIGQKKwkJIm1vdnEgICAgKCUlIlhCWCIpLCAlJW1tMFxuXHQiCQkvLyB2YWx1ZSBiIGZyb20gdG9wIGxlZnQJCQorCQkibW92cSAgICAyKCUlIlhCWCIsICUlIlhDWCIpLCAlJW1tMVxuXHQiCS8vIHZhbHVlIGYgZnJvbSBib3R0b20gcmlnaHQJCQkKKworCQkibW92cQklJW1tMCwgJSVtbTNcblx0IgorCQkicHN1YnVzYgklJW1tMSwgJSVtbTNcblx0IgorCQkicHN1YnVzYiAlJW1tMCwgJSVtbTFcblx0IgorCQkicG9yCQklJW1tMSwgJSVtbTNcblx0IgkJCQkJLy8gYWJzKGIsZikKKworCQkicHN1YnVzYiAiX0RpZmZUaHJlcyIsICUlbW0zXG5cdCIJCS8vIG5vbnplcm8gd2hlcmUgYWJzKGIsZikgPiBUaHJlcyBlbHNlIDAKKwkJInB4b3IJJSVtbTQsICUlbW00XG5cdCIKKwkJInBjbXBlcWIgJSVtbTQsICUlbW0zXG5cdCIJCQkvLyBub3cgZmYgd2hlcmUgYWJzKGIsZikgPCBUaHJlcywgZWxzZSAwMAkKKwkJInBjbXBlcWIJJSVtbTMsICUlbW00XG5cdCIJCQkvLyBoZXJlIGZmIHdoZXJlIGFicyhiLGYpID4gVGhyZXMsIGVsc2UgMDAKKworCQkibW92cSAgICAyKCUlIlhCWCIpLCAlJW1tMFxuXHQiCQkvLyB2YWx1ZSBjCisJCSJtb3ZxICAgIC0yKCUlIlhCWCIsICUlIlhDWCIpLCAlJW1tMVxuXHQiCS8vIHZhbHVlIGQKKwkJIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIJCQkJCQorCQlWX1BBVkdCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTMiLCBfU2hpZnRNYXNrKQkvLyBhdmcoYyxkKQorICAgICAgICAibW92cQklJW1tMCwgJSVtbTNcblx0IgorCQkicHN1YnVzYgklJW1tMSwgJSVtbTBcblx0IgorCQkicHN1YnVzYiAlJW1tMywgJSVtbTFcblx0IgorCQkicG9yCQklJW1tMSwgJSVtbTBcblx0IgkJCQkJLy8gYWJzKGMsZCkKKworICAgICAgICAibW92cSAgICAlJW1tMCwgJSVtbTFcblx0IgorCQkicHN1YnVzYiAiX0RpZmZUaHJlcyIsICUlbW0xXG5cdCIJCS8vIG5vbnplcm8gd2hlcmUgYWJzKGMsZCkgPiBUaHJlcyBlbHNlIDAKKwkJInB4b3IJJSVtbTMsICUlbW0zXG5cdCIKKyAgICAgICAgInBjbXBlcWIgJSVtbTMsICUlbW0xXG5cdCIJCQkvLyBub3cgZmYgd2hlcmUgYWJzKGMsZCkgPCBUaHJlcywgZWxzZSAwMAkKKworICAgICAgICAicGFuZCAgICAlJW1tNCwgJSVtbTFcblx0IgorCisgICAgICAgICJwYW5kICAgICUlbW0xLCAlJW1tMlxuXHQiCisgICAgICAgICJwYW5kICAgICUlbW0xLCAlJW1tMFxuXHQiCisKKyAgICAgICAgIm1vdnEgICAgJSVtbTEsICUlbW0zXG5cdCIKKyAgICAgICAgInB4b3IgICAgJSVtbTUsICUlbW0zXG5cdCIKKyAgICAgICAgInBhbmQgICAgJSVtbTMsICUlbW02XG5cdCIKKyAgICAgICAgInBhbmQgICAgJSVtbTMsICUlbW03XG5cdCIKKyAgICAgICAgInBhbmQgICAgJSVtbTMsICUlbW01XG5cdCIKKworICAgICAgICAicG9yICAgICAlJW1tMSwgJSVtbTVcblx0IgorICAgICAgICAicG9yICAgICAlJW1tMiwgJSVtbTZcblx0IgorICAgICAgICAicG9yICAgICAlJW1tMCwgJSVtbTdcblx0IgorCisgICAgICAgIC8vIGEgJiBmCisJCSJtb3ZxICAgICglJSJYQlgiKSwgJSVtbTBcblx0IgkJLy8gdmFsdWUgYiBmcm9tIHRvcCBsZWZ0CQkKKwkJIm1vdnEgICAgLTIoJSUiWEJYIiwgJSUiWENYIiksICUlbW0xXG5cdCIJLy8gdmFsdWUgZCBmcm9tIGJvdHRvbSByaWdodAkJCQorCisJCSJtb3ZxCSUlbW0wLCAlJW1tM1xuXHQiCisJCSJwc3VidXNiCSUlbW0xLCAlJW1tM1xuXHQiCisJCSJwc3VidXNiICUlbW0wLCAlJW1tMVxuXHQiCisJCSJwb3IJCSUlbW0xLCAlJW1tM1xuXHQiCQkJCQkvLyBhYnMoYixkKQorCisJCSJwc3VidXNiICJfRGlmZlRocmVzIiwgJSVtbTNcblx0IgkvLyBub256ZXJvIHdoZXJlIGFicyhiLGQpID4gVGhyZXMgZWxzZSAwCisJCSJweG9yCSUlbW00LCAlJW1tNFxuXHQiCisJCSJwY21wZXFiICUlbW00LCAlJW1tM1xuXHQiCQkJLy8gbm93IGZmIHdoZXJlIGFicyhiLGQpIDwgVGhyZXMsIGVsc2UgMDAJCisJCSJwY21wZXFiCSUlbW0zLCAlJW1tNFxuXHQiCQkJLy8gaGVyZSBmZiB3aGVyZSBhYnMoYixkKSA+IFRocmVzLCBlbHNlIDAwCisKKwkJIm1vdnEgICAgLTIoJSUiWEJYIiksICUlbW0wXG5cdCIJCS8vIHZhbHVlIGEKKwkJIm1vdnEgICAgMiglJSJYQlgiLCAlJSJYQ1giKSwgJSVtbTFcblx0IgkvLyB2YWx1ZSBmCisJCSJtb3ZxCSUlbW0wLCAlJW1tMlxuXHQiCQkJCQkKKwkJVl9QQVZHQiAoIiUlbW0yIiwgIiUlbW0xIiwgIiUlbW0zIiwgX1NoaWZ0TWFzaykJLy8gYXZnKGEsZikKKyAgICAgICAgIm1vdnEJJSVtbTAsICUlbW0zXG5cdCIKKyAgICAgICAgInBzdWJ1c2IJJSVtbTEsICUlbW0wXG5cdCIKKwkJInBzdWJ1c2IgJSVtbTMsICUlbW0xXG5cdCIKKwkJInBvcgkJJSVtbTEsICUlbW0wXG5cdCIJCQkJCS8vIGFicyhhLGYpCisKKyAgICAgICAgIm1vdnEgICAgJSVtbTAsICUlbW0xXG5cdCIKKwkJInBzdWJ1c2IgIl9EaWZmVGhyZXMiLCAlJW1tMVxuXHQiCQkvLyBub256ZXJvIHdoZXJlIGFicyhhLGYpID4gVGhyZXMgZWxzZSAwCisJCSJweG9yCSUlbW0zLCAlJW1tM1xuXHQiCisJCSJwY21wZXFiICUlbW0zLCAlJW1tMVxuXHQiCQkJLy8gbm93IGZmIHdoZXJlIGFicyhhLGYpIDwgVGhyZXMsIGVsc2UgMDAJCisKKyAgICAgICAgInBhbmQgICAgJSVtbTQsICUlbW0xXG5cdCIKKworICAgICAgICAicGFuZCAgICAlJW1tMSwgJSVtbTJcblx0IgorICAgICAgICAicGFuZCAgICAlJW1tMSwgJSVtbTBcblx0IgorICAgICAgICAgICAgCisgICAgICAgICJtb3ZxICAgICUlbW0xLCAlJW1tM1xuXHQiCisgICAgICAgICJweG9yICAgICUlbW01LCAlJW1tM1xuXHQiCisgICAgICAgICJwYW5kICAgICUlbW0zLCAlJW1tNlxuXHQiCisgICAgICAgICJwYW5kICAgICUlbW0zLCAlJW1tN1xuXHQiCisgICAgICAgICJwYW5kICAgICUlbW0zLCAlJW1tNVxuXHQiCisKKyAgICAgICAgInBvciAgICAgJSVtbTEsICUlbW01XG5cdCIKKyAgICAgICAgInBvciAgICAgJSVtbTIsICUlbW02XG5cdCIKKyAgICAgICAgInBvciAgICAgJSVtbTAsICUlbW03XG5cdCIKKyAgICAgICAgICAgCisgCQkicGFuZAkiX1lNYXNrIiwgJSVtbTVcblx0IgkJLy8gbWFzayBvdXQgY2hyb21hIGZyb20gaGVyZQorIAkJInBhbmQJIl9ZTWFzayIsICUlbW02XG5cdCIJCQkvLyBtYXNrIG91dCBjaHJvbWEgZnJvbSBoZXJlCisgCQkicGFuZAkiX1lNYXNrIiwgJSVtbTdcblx0IgkJCS8vIG1hc2sgb3V0IGNocm9tYSBmcm9tIGhlcmUKKworCQkvLyBiLGUKKwkJIm1vdnEgICAgKCUlIlhCWCIpLCAlJW1tMFxuXHQiCQkvLyB2YWx1ZSBiIGZyb20gdG9wIAkJCisJCSJtb3ZxICAgICglJSJYQlgiLCAlJSJYQ1giKSwgJSVtbTFcblx0IgkvLyB2YWx1ZSBlIGZyb20gYm90dG9tIAorCQkibW92cQklJW1tMCwgJSVtbTJcblx0IgkJCQkJCisJCVZfUEFWR0IgKCIlJW1tMiIsICIlJW1tMSIsICIlJW1tMyIsIF9TaGlmdE1hc2spCS8vIGF2ZyhiLGUpCisgICAgICAgICJtb3ZxCSUlbW0wLCAlJW1tM1xuXHQiCisgICAgICAgICJwc3VidXNiCSUlbW0xLCAlJW1tMFxuXHQiCisJCSJwc3VidXNiICUlbW0zLCAlJW1tMVxuXHQiCisJCSJwb3IJCSUlbW0xLCAlJW1tMFxuXHQiCQkJCQkvLyBhYnMoYixlKQorCisgICAgICAgICJtb3ZxICAgICUlbW0wLCAlJW1tMVxuXHQiCisJCSJwc3VidXNiICJfRGlmZlRocmVzIiwgJSVtbTFcblx0IgkJLy8gbm9uemVybyB3aGVyZSBhYnMoYixlKSA+IFRocmVzIGVsc2UgMAorCQkicHhvcgklJW1tMywgJSVtbTNcblx0IgorCQkicGNtcGVxYiAlJW1tMywgJSVtbTFcblx0IgkJLy8gbm93IGZmIHdoZXJlIGFicyhiLGUpIDwgVGhyZXMsIGVsc2UgMDAJCisKKyAgICAgICAgInBhbmQgICAgJSVtbTEsICUlbW0yXG5cdCIKKyAgICAgICAgInBhbmQgICAgJSVtbTEsICUlbW0wXG5cdCIKKworICAgICAgICAibW92cSAgICAlJW1tMSwgJSVtbTNcblx0IgorICAgICAgICAicHhvciAgICAlJW1tNSwgJSVtbTNcblx0IgorICAgICAgICAicGFuZCAgICAlJW1tMywgJSVtbTZcblx0IgorICAgICAgICAicGFuZCAgICAlJW1tMywgJSVtbTdcblx0IgorICAgICAgICAicGFuZCAgICAlJW1tMywgJSVtbTVcblx0IgorCisgICAgICAgICJwb3IgICAgICUlbW0xLCAlJW1tNVxuXHQiCisgICAgICAgICJwb3IgICAgICUlbW0yLCAlJW1tNlxuXHQiCisgICAgICAgICJwb3IgICAgICUlbW0wLCAlJW1tN1xuXHQiCisKKwkJLy8gYm9iIGluIGFueSBsZWZ0b3ZlcnMKKwkJIm1vdnEgICAgKCUlIlhCWCIpLCAlJW1tMFxuXHQiCQkvLyB2YWx1ZSBiIGZyb20gdG9wIAkJCisJCSJtb3ZxICAgICglJSJYQlgiLCAlJSJYQ1giKSwgJSVtbTFcblx0IgkvLyB2YWx1ZSBlIGZyb20gYm90dG9tIAorCisKKy8vIFdlIHdpbGwgYWxzbyBjYWxjIGhlcmUgdGhlIG1heC9taW4gdmFsdWVzIHRvIGxhdGVyIGxpbWl0IGNvbWIKKy8vIHNvIHRoZSBtYXggZXhjdXJzaW9uIHdpbGwgbm90IGV4Y2VlZCB0aGUgTWF4X0NvbWIgY29uc3RhbnQKKworI2lmZGVmIFNLSVBfU0VBUkNICQkKKwkJIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIKKy8vCQlwbWludWIJJSVtbTIsICUlbW0xCisJCVZfUE1JTlVCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTQiKQorCisvLwkJcG1heHViCSUlbW02LCAlJW1tMgkJCS8vIGNsaXAgb3VyIGN1cnJlbnQgcmVzdWx0cyBzbyBmYXIgdG8gYmUgYWJvdmUgdGhpcworCQlWX1BNQVhVQiAoIiUlbW02IiwgIiUlbW0yIikKKyAgICAgICAgIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIKKwkJVl9QTUFYVUIgKCIlJW1tMiIsICIlJW1tMSIpCisvLwkJcG1pbnViCSUlbW02LCAlJW1tMgkJCS8vIGNsaXAgb3VyIGN1cnJlbnQgcmVzdWx0cyBzbyBmYXIgdG8gYmUgYmVsb3cgdGhpcworCQlWX1BNSU5VQiAoIiUlbW02IiwgIiUlbW0yIiwgIiUlbW00IikKKworI2Vsc2UKKyAgICAgICAgIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIKKwkJIm1vdnEJKCUlIlhBWCIpLCAlJW1tNFxuXHQiCisJCSJwc3VidXNiICUlbW00LCAlJW1tMlxuXHQiCisJCSJwc3VidXNiICUlbW0wLCAlJW1tNFxuXHQiCisJCSJwb3IJCSUlbW0yLCAlJW1tNFxuXHQiCQkJLy8gYWJzIGRpZmYKKwkJCisJCSJtb3ZxCSUlbW0xLCAlJW1tMlxuXHQiCisJCSJtb3ZxCSglJSJYQVgiLCAlJSJYQ1giKSwgJSVtbTNcblx0IgorCQkicHN1YnVzYiAlJW1tMywgJSVtbTJcblx0IgorCQkicHN1YnVzYiAlJW1tMSwgJSVtbTNcblx0IgorCQkicG9yCQklJW1tMiwgJSVtbTNcblx0IgkJCS8vIGFicyBkaWZmCisvLwkJcG1heHViICAlJW1tMywgJSVtbTQJCQkvLyB0b3Agb3IgYm90dG9tIHBpeGVsIG1vdmVkIG1vc3QKKwkJVl9QTUFYVUIgKCIlJW1tMyIsICIlJW1tNCIpCQkJLy8gdG9wIG9yIGJvdHRvbSBwaXhlbCBtb3ZlZCBtb3N0CisgICAgICAgICJwc3VidXNiICJfRGlmZlRocmVzIiwgJSVtbTNcblx0IgkJLy8gbW92ZWQgbW9yZSB0aGFuIGFsbG93ZWQ/IG9yIGdvZXMgdG8gMD8KKwkJInB4b3IJJSVtbTQsICUlbW00XG5cdCIKKwkJInBjbXBlcWIgJSVtbTQsICUlbW0zXG5cdCIJCQkvLyBub3cgZmYgd2hlcmUgbG93IG1vdGlvbiwgZWxzZSBoaWdoIG1vdGlvbgorCQkKKwkJIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIKKy8vCQlwbWludWIJJSVtbTIsICUlbW0xCisJCVZfUE1JTlVCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTQiKQorCisvLwkJcG1heHViCSUlbW02LCAlJW1tMgkJCS8vIGNsaXAgb3VyIGN1cnJlbnQgcmVzdWx0cyBzbyBmYXIgdG8gYmUgYWJvdmUgdGhpcworCQlWX1BNQVhVQiAoIiUlbW02IiwgIiUlbW0yIikKKworICAgICAgICAicHN1YnVzYiAlJW1tMywgJSVtbTJcblx0IgkJCS8vIG1heWJlIGRlY3JlYXNlIGl0IHRvIDAwMDAuLiBpZiBubyBzdXJyb3VuZCBtb3Rpb24KKwkJIm1vdnEJJSVtbTIsICJfTWluX1ZhbHMiXG5cdCIKKworCQkibW92cQklJW1tMCwgJSVtbTJcblx0IgorCQlWX1BNQVhVQiAoIiUlbW0yIiwgIiUlbW0xIikKKy8vCQlwbWludWIJJSVtbTYsICUlbW0yCQkJLy8gY2xpcCBvdXIgY3VycmVudCByZXN1bHRzIHNvIGZhciB0byBiZSBiZWxvdyB0aGlzCisJCVZfUE1JTlVCICgiJSVtbTYiLCAiJSVtbTIiLCAiJSVtbTQiKQorICAgICAgICAicGFkZHVzYiAlJW1tMywgJSVtbTJcblx0IgkJCS8vIG1heWJlIGluY3JlYXNlIGl0IHRvIGZmZmZmZiBpZiBubyBzdXJyb3VuZCBtb3Rpb24KKwkJIm1vdnEJJSVtbTIsICJfTWF4X1ZhbHMiXG5cdCIKKyNlbmRpZgorCQkJCisJCSJtb3ZxCSUlbW0wLCAlJW1tMlxuXHQiCQkJCQkJCisvLwkJcGF2Z2IJJSVtbTIsICUlbW0xCQkJCQkvLyBhdmcoYixlKQorCQlWX1BBVkdCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTMiLCBfU2hpZnRNYXNrKQkvLyBhdmcoYixlKQorCQkJCQorICAgICAgICAibW92cQklJW1tMCwgJSVtbTNcblx0IgorCQkicHN1YnVzYgklJW1tMSwgJSVtbTNcblx0IgorCQkicHN1YnVzYiAlJW1tMCwgJSVtbTFcblx0IgorCQkicG9yCQklJW1tMSwgJSVtbTNcblx0IgkJCS8vIGFicyhiLGUpCisJCSJtb3ZxCSUlbW0zLCAlJW1tMVxuXHQiCQkJLy8ga2VlcCBjb3B5IG9mIGRpZmZzCisgICAgICAgICAgICAKKwkJInB4b3IJJSVtbTQsICUlbW00XG5cdCIJCQkKKwkJInBzdWJ1c2IgJSVtbTcsICUlbW0zXG5cdCIJCQkvLyBub256ZXJvIHdoZXJlIG5ldyB3ZWlnaHRzIGJpZ2dlciwgZWxzZSAwCisJCSJwY21wZXFiICUlbW00LCAlJW1tM1xuXHQiCQkJLy8gbm93IGZmIHdoZXJlIG5ldyBiZXR0ZXIsIGVsc2UgMDAJCisgICAgICAgICJwY21wZXFiICUlbW0wLCAlJW1tMFxuXHQiCisgICAgICAgICJwYW5kbiAgICUlbW0wLCAlJW1tNVxuXHQiCisgICAgICAgICJwb3IgICAgICUlbW01LCAlJW1tM1xuXHQiCisJCSJwY21wZXFiCSUlbW0zLCAlJW1tNFxuXHQiCQkJLy8gaGVyZSBmZiB3aGVyZSBvbGQgYmV0dGVyLCBlbHNlIDAwCisKKwkJInBhbmQJJSVtbTMsICUlbW0xXG5cdCIKKwkJInBhbmQJJSVtbTMsICUlbW0yXG5cdCIKKyAgICAgICAgCisJCSJwYW5kICAgICUlbW00LCAlJW1tNlxuXHQiCisJCSJwYW5kICAgICUlbW00LCAlJW1tN1xuXHQiCisKKwkJInBvcgkJJSVtbTIsICUlbW02XG5cdCIJCQkvLyBvdXIgeDIgdmFsdWUKKwkJInBvcgkJJSVtbTEsICUlbW03XG5cdCIJCQkvLyBvdXIgeDIgZGlmZnMKKwkJIm1vdnEJJSVtbTcsICUlbW00XG5cdCIJCQkvLyBzYXZlIGFzIGJvYiB1bmNlcnRhaW50eSBpbmRpY2F0b3IKKworI2Vsc2UKKworICAgICAgICBkaWZmWzBdID0gLTE7CisgICAgICAgIGRpZmZbMV0gPSAtMTsKKwliZXN0WzBdID0gMDsKKwliZXN0WzFdID0gMDsKKwkvLyBqLCBuCisgICAgICAgIGlmIChBQlMgKHBCb2JbLTJdIC0gcEJvYltzcmNfcGl0Y2gyIC0gNF0pIDwgRGlmZlRocmVzICYmCisJICAgIEFCUyAocEJvYlstNF0gLSBwQm9iW3NyY19waXRjaDIgKyA0XSkgPiBEaWZmVGhyZXMpIHsKKwkgICBiZXN0WzBdID0gKHBCb2JbLTJdICsgcEJvYltzcmNfcGl0Y2gyIC0gNF0pIC8gMjsKKwkgICBkaWZmWzBdID0gQUJTIChwQm9iWy0yXSAtIHBCb2Jbc3JjX3BpdGNoMiAtIDRdKTsKKwl9CisgICAgICAgIGlmIChBQlMgKHBCb2JbLTFdIC0gcEJvYltzcmNfcGl0Y2gyIC0gM10pIDwgRGlmZlRocmVzICYmCisJICAgIEFCUyAocEJvYlstM10gLSBwQm9iW3NyY19waXRjaDIgKyA1XSkgPiBEaWZmVGhyZXMpIHsKKwkgICBiZXN0WzFdID0gKHBCb2JbLTFdICsgcEJvYltzcmNfcGl0Y2gyIC0gM10pIC8gMjsKKwkgICBkaWZmWzFdID0gQUJTIChwQm9iWy0xXSAtIHBCb2Jbc3JjX3BpdGNoMiAtIDNdKTsKKwl9CisKKyAgICAgICAgLy8gayAmIG0KKyAgICAgICAgaWYgKEFCUyAocEJvYlsyXSAtIHBCb2Jbc3JjX3BpdGNoMiArIDRdKSA8IERpZmZUaHJlcyAmJgorCSAgICBBQlMgKHBCb2JbNF0gLSBwQm9iW3NyY19waXRjaDIgLSA0XSkgPiBEaWZmVGhyZXMpIHsKKwkgICBiZXN0WzBdID0gKHBCb2JbNF0gKyBwQm9iW3NyY19waXRjaDIgLSA0XSkgLyAyOworCSAgIGRpZmZbMF0gPSBBQlMgKHBCb2JbNF0gLSBwQm9iW3NyY19waXRjaDIgLSA0XSk7CisJfQorCisgICAgICAgIGlmIChBQlMgKHBCb2JbM10gLSBwQm9iW3NyY19waXRjaDIgKyA1XSkgPCBEaWZmVGhyZXMgJiYKKwkgICAgQUJTIChwQm9iWzVdIC0gcEJvYltzcmNfcGl0Y2gyIC0gM10pID4gRGlmZlRocmVzKSB7CisJICAgYmVzdFsxXSA9IChwQm9iWzVdICsgcEJvYltzcmNfcGl0Y2gyIC0gM10pIC8gMjsKKwkgICBkaWZmWzFdID0gQUJTIChwQm9iWzVdIC0gcEJvYltzcmNfcGl0Y2gyIC0gM10pOworCX0KKworICAgICAgICAvLyBjICYgZAorCWlmIChBQlMgKHBCb2JbMF0gLSBwQm9iW3NyY19waXRjaDIgKyAyXSkgPCBEaWZmVGhyZXMgJiYKKwkgICAgQUJTIChwQm9iWzJdIC0gcEJvYltzcmNfcGl0Y2gyIC0gMl0pID4gRGlmZlRocmVzKSB7CisJICAgYmVzdFswXSA9IChwQm9iWzJdICsgcEJvYltzcmNfcGl0Y2gyIC0gMl0pIC8gMjsKKwkgICBkaWZmWzBdID0gQUJTIChwQm9iWzJdIC0gcEJvYltzcmNfcGl0Y2gyIC0gMl0pOworCX0KKworCWlmIChBQlMgKHBCb2JbMV0gLSBwQm9iW3NyY19waXRjaDIgKyAzXSkgPCBEaWZmVGhyZXMgJiYKKwkgICAgQUJTIChwQm9iWzNdIC0gcEJvYltzcmNfcGl0Y2gyIC0gMV0pID4gRGlmZlRocmVzKSB7CisJICAgYmVzdFsxXSA9IChwQm9iWzNdICsgcEJvYltzcmNfcGl0Y2gyIC0gMV0pIC8gMjsKKwkgICBkaWZmWzFdID0gQUJTIChwQm9iWzNdIC0gcEJvYltzcmNfcGl0Y2gyIC0gMV0pOworCX0KKworICAgICAgICAvLyBhICYgZgorCWlmIChBQlMgKHBCb2JbMF0gLSBwQm9iW3NyY19waXRjaDIgLSAyXSkgPCBEaWZmVGhyZXMgJiYKKwkgICAgQUJTIChwQm9iWy0yXSAtIHBCb2Jbc3JjX3BpdGNoMiArIDJdKSA+IERpZmZUaHJlcykgeworCSAgIGJlc3RbMF0gPSAocEJvYlstMl0gKyBwQm9iW3NyY19waXRjaDIgKyAyXSkgLyAyOworCSAgIGRpZmZbMF0gPSBBQlMgKHBCb2JbLTJdIC0gcEJvYltzcmNfcGl0Y2gyICsgMl0pOworCX0KKworCWlmIChBQlMgKHBCb2JbMV0gLSBwQm9iW3NyY19waXRjaDIgLSAxXSkgPCBEaWZmVGhyZXMgJiYKKwkgICAgQUJTIChwQm9iWy0xXSAtIHBCb2Jbc3JjX3BpdGNoMiArIDNdKSA+IERpZmZUaHJlcykgeworCSAgIGJlc3RbMV0gPSAocEJvYlstMV0gKyBwQm9iW3NyY19waXRjaDIgKyAzXSkgLyAyOworCSAgIGRpZmZbMV0gPSBBQlMgKHBCb2JbLTFdIC0gcEJvYltzcmNfcGl0Y2gyICsgM10pOworCX0KKworCS8vIGIsZQorCWlmIChBQlMgKHBCb2JbMF0gLSBwQm9iW3NyY19waXRjaDJdKSA8IERpZmZUaHJlcykgeworCSAgIGJlc3RbMF0gPSAocEJvYlswXSArIHBCb2Jbc3JjX3BpdGNoMl0pIC8gMjsKKwkgICBkaWZmWzBdID0gQUJTIChwQm9iWzBdIC0gcEJvYltzcmNfcGl0Y2gyXSk7CisJfQorCisJaWYgKEFCUyAocEJvYlsxXSAtIHBCb2Jbc3JjX3BpdGNoMiArIDFdKSA8IERpZmZUaHJlcykgeworCSAgIGJlc3RbMV0gPSAocEJvYlsxXSArIHBCb2Jbc3JjX3BpdGNoMiArIDFdKSAvIDI7CisJICAgZGlmZlsxXSA9IEFCUyAocEJvYlsxXSAtIHBCb2Jbc3JjX3BpdGNoMiArIDFdKTsKKwl9CisKKworLy8gV2Ugd2lsbCBhbHNvIGNhbGMgaGVyZSB0aGUgbWF4L21pbiB2YWx1ZXMgdG8gbGF0ZXIgbGltaXQgY29tYgorLy8gc28gdGhlIG1heCBleGN1cnNpb24gd2lsbCBub3QgZXhjZWVkIHRoZSBNYXhfQ29tYiBjb25zdGFudAorCisjaWZkZWYgU0tJUF9TRUFSQ0gKKwkJYmVzdFswXSA9IENMQU1QIChiZXN0WzBdLCBNSU4gKHBCb2Jbc3JjX3BpdGNoMl0sIHBCb2JbMF0pLCBNQVggKHBCb2Jbc3JjX3BpdGNoMl0sIHBCb2JbMF0pKTsKKwkJYmVzdFsxXSA9IENMQU1QIChiZXN0WzFdLCBNSU4gKHBCb2Jbc3JjX3BpdGNoMiArIDFdLCBwQm9iWzFdKSwgTUFYIChwQm9iW3NyY19waXRjaDIgKyAxXSwgcEJvYlsxXSkpOworI2Vsc2UKKwkJbW92WzBdID0gTUFYIChBQlMgKHBCb2JbMF0gLSBwQm9iUFswXSksIEFCUyAocEJvYltzcmNfcGl0Y2gyXSAtIHBCb2JQW3NyY19waXRjaDJdKSk7CisJCW1vdlsxXSA9IE1BWCAoQUJTIChwQm9iWzFdIC0gcEJvYlBbMV0pLCBBQlMgKHBCb2Jbc3JjX3BpdGNoMiArIDFdIC0gcEJvYlBbc3JjX3BpdGNoMiArIDFdKSk7CisKKwkJTWluVmFsc1swXSA9IDA7CisJCU1pblZhbHNbMV0gPSAwOworCQlNYXhWYWxzWzBdID0gMjU1OworCQlNYXhWYWxzWzFdID0gMjU1OworCQlpZiAobW92WzBdID4gRGlmZlRocmVzKSB7CisJCSAgTWluVmFsc1swXSA9IE1BWCAoTUlOIChwQm9iWzBdLCBwQm9iW3NyY19waXRjaDJdKSwgYmVzdFswXSk7CisJCSAgTWF4VmFsc1swXSA9IE1JTiAoTUFYIChwQm9iWzBdLCBwQm9iW3NyY19waXRjaDJdKSwgYmVzdFswXSk7CisJCX0KKwkJCisJCWlmIChtb3ZbMV0gPiBEaWZmVGhyZXMpIHsKKwkJICBNaW5WYWxzWzFdID0gTUFYIChNSU4gKHBCb2JbMV0sIHBCb2Jbc3JjX3BpdGNoMisxXSksIGJlc3RbMV0pOworCQkgIE1heFZhbHNbMV0gPSBNSU4gKE1BWCAocEJvYlsxXSwgcEJvYltzcmNfcGl0Y2gyKzFdKSwgYmVzdFsxXSk7CisJCX0KKworCQliZXN0WzBdID0gQ0xBTVAgKGJlc3RbMF0sIE1JTiAocEJvYltzcmNfcGl0Y2gyXSwgcEJvYlswXSksIE1BWCAocEJvYltzcmNfcGl0Y2gyXSwgcEJvYlswXSkpOworCQliZXN0WzFdID0gQ0xBTVAgKGJlc3RbMV0sIE1JTiAocEJvYltzcmNfcGl0Y2gyICsgMV0sIHBCb2JbMV0pLCBNQVggKHBCb2Jbc3JjX3BpdGNoMiArIDFdLCBwQm9iWzFdKSk7CisjZW5kaWYKKwkJYXZnWzBdID0gKHBCb2Jbc3JjX3BpdGNoMl0gKyBwQm9iWzBdKSAvIDI7CisJCWF2Z1sxXSA9IChwQm9iW3NyY19waXRjaDIgKyAxXSArIHBCb2JbMV0pIC8gMjsKKwkJZGlmZjJbMF0gPSBBQlMgKHBCb2Jbc3JjX3BpdGNoMiArIDFdIC0gcEJvYlsxXSk7CisJCWRpZmYyWzFdID0gQUJTIChwQm9iW3NyY19waXRjaDIgKyAxXSAtIHBCb2JbMV0pOworCisJCWlmIChkaWZmWzBdID09IC0xIHx8IGRpZmYyWzBdIDwgZGlmZlswXSkgeworCQkgIGJlc3RbMF0gPSBhdmdbMF07CisJCSAgZGlmZlswXSA9IGRpZmYyWzBdOworCQl9CisKKwkJaWYgKGRpZmZbMV0gPT0gLTEgfHwgZGlmZjJbMV0gPCBkaWZmWzFdKSB7CisJCSAgYmVzdFsxXSA9IGF2Z1sxXTsKKwkJICBkaWZmWzFdID0gZGlmZjJbMV07CisJCX0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwuaW5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNThiYmEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvVG9tc01vQ29tcEFsbC5pbmMKQEAgLTAsMCArMSwyNjYgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUb20gQmFycnkgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIFJlbGljZW5zZWQgZm9yIEdTdHJlYW1lciBmcm9tIEdQTCB0byBMR1BMIHdpdGggcGVybWl0IGZyb20gVG9tIEJhcnJ5LgorICogU2VlOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM1NzgKKyAqLworCisKKyNpZm5kZWYgVG9wRmlyc3QKKyNkZWZpbmUgVG9wRmlyc3QgSXNPZGQKKyNlbmRpZgorCisjaWZkZWYgU0VGVU5DCisjdW5kZWYgU0VGVU5DCisjZW5kaWYKKworI2lmIGRlZmluZWQoSVNfTU1YRVhUKQorI2RlZmluZSBTRUZVTkMoeCkgU2VhcmNoX0VmZm9ydF9NTVhFWFRfIyN4KGludCBzcmNfcGl0Y2gsIGludCBkc3RfcGl0Y2gsIGludCByb3dzaXplLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwV2VhdmVTcmMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBXZWF2ZVNyY1AsIHVuc2lnbmVkIGNoYXIgKnBXZWF2ZURlc3QsIGludCBJc09kZCwgY29uc3QgdW5zaWduZWQgY2hhciAqcENvcHlTcmMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBDb3B5U3JjUCwgaW50IEZsZEhlaWdodCkKKyNlbGlmIGRlZmluZWQoSVNfM0ROT1cpCisjZGVmaW5lIFNFRlVOQyh4KSBTZWFyY2hfRWZmb3J0XzNETk9XXyMjeChpbnQgc3JjX3BpdGNoLCBpbnQgZHN0X3BpdGNoLCBpbnQgcm93c2l6ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcFdlYXZlU3JjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwV2VhdmVTcmNQLCB1bnNpZ25lZCBjaGFyICpwV2VhdmVEZXN0LCBpbnQgSXNPZGQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBDb3B5U3JjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwQ29weVNyY1AsIGludCBGbGRIZWlnaHQpCisjZWxpZiBkZWZpbmVkKElTX01NWCkKKyNkZWZpbmUgU0VGVU5DKHgpIFNlYXJjaF9FZmZvcnRfTU1YXyMjeChpbnQgc3JjX3BpdGNoLCBpbnQgZHN0X3BpdGNoLCBpbnQgcm93c2l6ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcFdlYXZlU3JjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwV2VhdmVTcmNQLCB1bnNpZ25lZCBjaGFyICpwV2VhdmVEZXN0LCBpbnQgSXNPZGQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBDb3B5U3JjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwQ29weVNyY1AsIGludCBGbGRIZWlnaHQpCisjZWxzZQorI2RlZmluZSBTRUZVTkMoeCkgU2VhcmNoX0VmZm9ydF9DXyMjeChpbnQgc3JjX3BpdGNoLCBpbnQgZHN0X3BpdGNoLCBpbnQgcm93c2l6ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqcFdlYXZlU3JjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwV2VhdmVTcmNQLCB1bnNpZ25lZCBjaGFyICpwV2VhdmVEZXN0LCBpbnQgSXNPZGQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBDb3B5U3JjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwQ29weVNyY1AsIGludCBGbGRIZWlnaHQpCisjZW5kaWYKKworI2luY2x1ZGUgIlRvbXNNb0NvbXBBbGwyLmluYyIKKworI2RlZmluZSBVU0VfU1RSQU5HRV9CT0IKKworI2luY2x1ZGUgIlRvbXNNb0NvbXBBbGwyLmluYyIKKworI3VuZGVmIFVTRV9TVFJBTkdFX0JPQgorCisjdW5kZWYgU0VGVU5DCisjaWYgZGVmaW5lZChJU19NTVhFWFQpCisjZGVmaW5lIFNFRlVOQyh4KSBTZWFyY2hfRWZmb3J0X01NWEVYVF8jI3goc3JjX3BpdGNoLCBkc3RfcGl0Y2gsIHJvd3NpemUsIHBXZWF2ZVNyYywgcFdlYXZlU3JjUCwgcFdlYXZlRGVzdCwgSXNPZGQsIHBDb3B5U3JjLCBwQ29weVNyY1AsIEZsZEhlaWdodCkKKyNlbGlmIGRlZmluZWQoSVNfM0ROT1cpCisjZGVmaW5lIFNFRlVOQyh4KSBTZWFyY2hfRWZmb3J0XzNETk9XXyMjeChzcmNfcGl0Y2gsIGRzdF9waXRjaCwgcm93c2l6ZSwgcFdlYXZlU3JjLCBwV2VhdmVTcmNQLCBwV2VhdmVEZXN0LCBJc09kZCwgcENvcHlTcmMsIHBDb3B5U3JjUCwgRmxkSGVpZ2h0KQorI2VsaWYgZGVmaW5lZChJU19NTVgpCisjZGVmaW5lIFNFRlVOQyh4KSBTZWFyY2hfRWZmb3J0X01NWF8jI3goc3JjX3BpdGNoLCBkc3RfcGl0Y2gsIHJvd3NpemUsIHBXZWF2ZVNyYywgcFdlYXZlU3JjUCwgcFdlYXZlRGVzdCwgSXNPZGQsIHBDb3B5U3JjLCBwQ29weVNyY1AsIEZsZEhlaWdodCkKKyNlbHNlCisjZGVmaW5lIFNFRlVOQyh4KSBTZWFyY2hfRWZmb3J0X0NfIyN4KHNyY19waXRjaCwgZHN0X3BpdGNoLCByb3dzaXplLCBwV2VhdmVTcmMsIHBXZWF2ZVNyY1AsIHBXZWF2ZURlc3QsIElzT2RkLCBwQ29weVNyYywgcENvcHlTcmNQLCBGbGRIZWlnaHQpCisjZW5kaWYKKworc3RhdGljIHZvaWQgRlVOQ1RfTkFNRShHc3REZWludGVybGFjZU1ldGhvZCAqZF9tZXRob2QsCisJY29uc3QgR3N0RGVpbnRlcmxhY2VGaWVsZCogaGlzdG9yeSwgZ3VpbnQgaGlzdG9yeV9jb3VudCwKKwlHc3RWaWRlb0ZyYW1lICpvdXRmcmFtZSwgaW50IGN1cl9maWVsZF9pZHgpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kVG9tc01vQ29tcCAqc2VsZiA9IEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfVE9NU01PQ09NUCAoZF9tZXRob2QpOworICBnbG9uZyBTZWFyY2hFZmZvcnQgPSBzZWxmLT5zZWFyY2hfZWZmb3J0OworICBnaW50IFVzZVN0cmFuZ2VCb2IgPSBzZWxmLT5zdHJhbmdlX2JvYjsKKyAgZ2ludCBJc09kZDsKKyAgY29uc3QgZ3VpbnQ4ICpwV2VhdmVTcmM7CisgIGNvbnN0IGd1aW50OCAqcFdlYXZlU3JjUDsKKyAgZ3VpbnQ4ICpwV2VhdmVEZXN0OworICBjb25zdCBndWludDggKnBDb3B5U3JjOworICBjb25zdCBndWludDggKnBDb3B5U3JjUDsKKyAgZ3VpbnQ4ICpwQ29weURlc3Q7CisgIGdpbnQgc3JjX3BpdGNoOworICBnaW50IGRzdF9waXRjaDsKKyAgZ2ludCByb3dzaXplOworICBnaW50IEZsZEhlaWdodDsKKworICBpZiAoY3VyX2ZpZWxkX2lkeCArIDIgPiBoaXN0b3J5X2NvdW50IHx8IGN1cl9maWVsZF9pZHggPCAxKSB7CisgICAgR3N0RGVpbnRlcmxhY2VNZXRob2QgKmJhY2t1cF9tZXRob2Q7CisgICAgCisgICAgYmFja3VwX21ldGhvZCA9IGdfb2JqZWN0X25ldyAoZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF9saW5lYXJfZ2V0X3R5cGUoKSwKKyAgICAgICAgTlVMTCk7CisKKyAgICBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3NldHVwIChiYWNrdXBfbWV0aG9kLCBkX21ldGhvZC0+dmluZm8pOworICAgIGdzdF9kZWludGVybGFjZV9tZXRob2RfZGVpbnRlcmxhY2VfZnJhbWUgKGJhY2t1cF9tZXRob2QsCisgICAgICAgIGhpc3RvcnksIGhpc3RvcnlfY291bnQsIG91dGZyYW1lLCBjdXJfZmllbGRfaWR4KTsKKworICAgIGdfb2JqZWN0X3VucmVmIChiYWNrdXBfbWV0aG9kKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBkb3VibGUgc3RyaWRlIGRvIGFkZHJlc3MganVzdCBldmVyeSBvZGQvZXZlbiBzY2FubGluZSAqLworICBzcmNfcGl0Y2ggPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRmcmFtZSwgMCkgKiAyOworICBkc3RfcGl0Y2ggPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRmcmFtZSwgMCk7CisgIHJvd3NpemUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRmcmFtZSwgMCk7CisKKyAgRmxkSGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChzZWxmLT5wYXJlbnQudmluZm8pIC8gMjsKKworICBwQ29weVNyYyAgID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGhpc3RvcnlbaGlzdG9yeV9jb3VudC0xXS5mcmFtZSwgMCk7CisgIGlmIChoaXN0b3J5W2hpc3RvcnlfY291bnQgLSAxXS5mbGFncyAmIFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pCisgICAgcENvcHlTcmMgKz0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoaGlzdG9yeVtoaXN0b3J5X2NvdW50LTFdLmZyYW1lLCAwKTsKKyAgcENvcHlTcmNQICA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChoaXN0b3J5W2hpc3RvcnlfY291bnQtM10uZnJhbWUsIDApOworICBpZiAoaGlzdG9yeVtoaXN0b3J5X2NvdW50IC0gM10uZmxhZ3MgJiBQSUNUVVJFX0lOVEVSTEFDRURfQk9UVE9NKQorICAgIHBDb3B5U3JjUCArPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChoaXN0b3J5W2hpc3RvcnlfY291bnQtM10uZnJhbWUsIDApOworICBwV2VhdmVTcmMgID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGhpc3RvcnlbaGlzdG9yeV9jb3VudC0yXS5mcmFtZSwgMCk7CisgIGlmIChoaXN0b3J5W2hpc3RvcnlfY291bnQgLSAyXS5mbGFncyAmIFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pCisgICAgcFdlYXZlU3JjICs9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGhpc3RvcnlbaGlzdG9yeV9jb3VudC0yXS5mcmFtZSwgMCk7CisgIHBXZWF2ZVNyY1AgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaGlzdG9yeVtoaXN0b3J5X2NvdW50LTRdLmZyYW1lLCAwKTsKKyAgaWYgKGhpc3RvcnlbaGlzdG9yeV9jb3VudCAtIDRdLmZsYWdzICYgUElDVFVSRV9JTlRFUkxBQ0VEX0JPVFRPTSkKKyAgICBwV2VhdmVTcmNQICs9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGhpc3RvcnlbaGlzdG9yeV9jb3VudC00XS5mcmFtZSwgMCk7CisKKyAgLyogdXNlIGJvdHRvbSBmaWVsZCBhbmQgaW50ZXJsYWNlIHRvcCBmaWVsZCAqLworICBpZiAoaGlzdG9yeVtoaXN0b3J5X2NvdW50LTJdLmZsYWdzID09IFBJQ1RVUkVfSU5URVJMQUNFRF9CT1RUT00pIHsKKyAgICBJc09kZCAgICAgID0gMTsKKworICAgIC8vIGlmIHdlIGhhdmUgYW4gb2RkIGZpZWxkIHdlIGNvcHkgYW4gZXZlbiBmaWVsZCBhbmQgd2VhdmUgYW4gb2RkIGZpZWxkCisgICAgcENvcHlEZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dGZyYW1lLCAwKTsKKyAgICBwV2VhdmVEZXN0ID0gcENvcHlEZXN0ICsgZHN0X3BpdGNoOworICB9CisgIC8qIGRvIGl0IHZpY2UgdmVyY2EgKi8KKyAgZWxzZSB7CisKKyAgICBJc09kZCAgICAgID0gMDsKKyAgICAvLyBpZiB3ZSBoYXZlIGFuIGV2ZW4gZmllbGQgd2UgY29weSBhbiBvZGQgZmllbGQgYW5kIHdlYXZlIGFuIGV2ZW4gZmllbGQKKyAgICBwQ29weURlc3QgPSAoZ3VpbnQ4ICopIEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRmcmFtZSwgMCkgKyBkc3RfcGl0Y2g7CisgICAgcFdlYXZlRGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRmcmFtZSwgMCk7CisgIH0KKworICAKKyAgLy8gY29weSAxc3QgYW5kIGxhc3Qgd2VhdmUgbGluZXMgCisgIEZpZWxkY29weShwV2VhdmVEZXN0LCBwQ29weVNyYywgcm93c2l6ZSwJCQorCSAgICAxLCBkc3RfcGl0Y2gqMiwgc3JjX3BpdGNoKTsKKyAgRmllbGRjb3B5KHBXZWF2ZURlc3QrKEZsZEhlaWdodC0xKSpkc3RfcGl0Y2gqMiwKKwkgICAgcENvcHlTcmMrKEZsZEhlaWdodC0xKSpzcmNfcGl0Y2gsIHJvd3NpemUsIAorCSAgICAxLCBkc3RfcGl0Y2gqMiwgc3JjX3BpdGNoKTsKKyAgCisjaWZkZWYgVVNFX1ZFUlRJQ0FMX0ZJTFRFUgorICAvLyBWZXJ0aWNhbCBGaWx0ZXIgY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZCBmb3IgRFNjYWxlciAhIQorICAvLyBjb3B5IDFzdCBhbmQgbGFzdCBsaW5lcyB0aGUgY29weSBmaWVsZAorICBGaWVsZGNvcHkocENvcHlEZXN0LCBwQ29weVNyYywgcm93c2l6ZSwgCisJICAgIDEsIGRzdF9waXRjaCoyLCBzcmNfcGl0Y2gpOworICBGaWVsZGNvcHkocENvcHlEZXN0KyhGbGRIZWlnaHQtMSkqZHN0X3BpdGNoKjIsCisJICAgIHBDb3B5U3JjKyhGbGRIZWlnaHQtMSkqc3JjX3BpdGNoLCByb3dzaXplLCAKKwkgICAgMSwgZHN0X3BpdGNoKjIsIHNyY19waXRjaCk7CisjZWxzZQorICAKKyAgLy8gY29weSBhbGwgb2YgdGhlIGNvcHkgZmllbGQKKyAgRmllbGRjb3B5KHBDb3B5RGVzdCwgcENvcHlTcmMsIHJvd3NpemUsIAorCSAgICBGbGRIZWlnaHQsIGRzdF9waXRjaCoyLCBzcmNfcGl0Y2gpOworI2VuZGlmCQorICAvLyB0aGVuIGdvIGZpbGwgaW4gdGhlIGhhcmQgcGFydCwgYmVpbmcgdmFyaW91c2x5IGxhenkgZGVwZW5kaW5nIHVwb24KKyAgLy8gU2VhcmNoRWZmb3J0CisKKyAgaWYoIVVzZVN0cmFuZ2VCb2IpIHsKKyAgICBpZiAoU2VhcmNoRWZmb3J0ID09IDApCisgICAgICB7CisJU0VGVU5DKDApOworICAgICAgfQorICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAxKQorICAgICAgeworCVNFRlVOQygxKTsKKyAgICAgIH0KKyAgICAvKgllbHNlIGlmIChTZWFyY2hFZmZvcnQgPD0gMikKKwl7CisJU0VGVU5DKDIpOworCX0KKyAgICAqLworICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAzKQorICAgICAgeworCVNFRlVOQygzKTsKKyAgICAgIH0KKyAgICBlbHNlIGlmIChTZWFyY2hFZmZvcnQgPD0gNSkKKyAgICAgIHsKKwlTRUZVTkMoNSk7CisgICAgICB9CisgICAgZWxzZSBpZiAoU2VhcmNoRWZmb3J0IDw9IDkpCisgICAgICB7CisJU0VGVU5DKDkpOworICAgICAgfQorICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAxMSkKKyAgICAgIHsKKwlTRUZVTkMoMTEpOworICAgICAgfQorICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAxMykKKyAgICAgIHsKKwlTRUZVTkMoMTMpOworICAgICAgfQorICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAxNSkKKyAgICAgIHsKKwlTRUZVTkMoMTUpOworICAgICAgfQorICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAxOSkKKyAgICAgIHsKKwlTRUZVTkMoMTkpOworICAgICAgfQorICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAyMSkKKyAgICAgIHsKKwlTRUZVTkMoMjEpOworICAgICAgfQorICAgIGVsc2UgCisgICAgICB7CisJU0VGVU5DKE1heCk7CisgICAgICB9CisgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChTZWFyY2hFZmZvcnQgPT0gMCkKKwl7CisJICBTRUZVTkMoMFNCKTsKKwl9CisgICAgICBlbHNlIGlmIChTZWFyY2hFZmZvcnQgPD0gMSkKKwl7CisJICBTRUZVTkMoMVNCKTsKKwl9CisgICAgICAvKgllbHNlIGlmIChTZWFyY2hFZmZvcnQgPD0gMikKKwkJeworCQlTRUZVTkMoMlNCKTsKKwkJfQorICAgICAgKi8KKyAgICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAzKQorCXsKKwkgIFNFRlVOQygzU0IpOworCX0KKyAgICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSA1KQorCXsKKwkgIFNFRlVOQyg1U0IpOworCX0KKyAgICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSA5KQorCXsKKwkgIFNFRlVOQyg5U0IpOworCX0KKyAgICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAxMSkKKwl7CisJICBTRUZVTkMoMTFTQik7CisJfQorICAgICAgZWxzZSBpZiAoU2VhcmNoRWZmb3J0IDw9IDEzKQorCXsKKwkgIFNFRlVOQygxM1NCKTsKKwl9CisgICAgICBlbHNlIGlmIChTZWFyY2hFZmZvcnQgPD0gMTUpCisJeworCSAgU0VGVU5DKDE1U0IpOworCX0KKyAgICAgIGVsc2UgaWYgKFNlYXJjaEVmZm9ydCA8PSAxOSkKKwl7CisJICBTRUZVTkMoMTlTQik7CisJfQorICAgICAgZWxzZSBpZiAoU2VhcmNoRWZmb3J0IDw9IDIxKQorCXsKKwkgIFNFRlVOQygyMVNCKTsKKwl9CisgICAgICBlbHNlIAorCXsKKwkgIFNFRlVOQyhNYXhTQik7CisJfQorICAgIH0KKworI2lmIGRlZmluZWQoQlVJTERfWDg2X0FTTSkgJiYgIWRlZmluZWQoSVNfQykKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oImVtbXMiKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1RvbXNNb0NvbXBBbGwyLmluYyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsMi5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYzNDRlYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC9Ub21zTW9Db21wQWxsMi5pbmMKQEAgLTAsMCArMSwyNDMgQEAKKy8vIC0qLSBjKysgLSotCisKKyNpZmRlZiBTRUFSQ0hfRUZGT1JUX0ZVTkMKKyN1bmRlZiBTRUFSQ0hfRUZGT1JUX0ZVTkMKKyNlbmRpZgorCisjaWZkZWYgVVNFX1NUUkFOR0VfQk9CCisjZGVmaW5lIFNFQVJDSF9FRkZPUlRfRlVOQyhuKSBTRUZVTkMobiMjU0IpCisjZWxzZQorI2RlZmluZSBTRUFSQ0hfRUZGT1JUX0ZVTkMobikgU0VGVU5DKG4pCisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgU0VBUkNIX0VGRk9SVF9GVU5DKDApCQkvLyB3ZSBkb24ndCB0cnkgYXQgYWxsIDstKQoreworCQkvL3NlZSBTZWFyY2hfRWZmb3J0X01heCgpIGZvciBjb21tZW50cworI2RlZmluZSBTS0lQX1NFQVJDSAorI2luY2x1ZGUgIlNlYXJjaExvb3BUb3AuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BCb3R0b20uaW5jIgorI3VuZGVmIFNLSVBfU0VBUkNICit9CisKK3N0YXRpYyBpbmxpbmUgaW50IFNFQVJDSF9FRkZPUlRfRlVOQygxKQoreworI2lmZGVmIElTX0MKKyNkZWZpbmUgU0tJUF9TRUFSQ0gKKyNpbmNsdWRlICJTZWFyY2hMb29wVG9wLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wQm90dG9tLmluYyIKKyN1bmRlZiBTS0lQX1NFQVJDSAorI2Vsc2UKKwkJLy9zZWUgU2VhcmNoX0VmZm9ydF9NYXgoKSBmb3IgY29tbWVudHMKKyNpbmNsdWRlICJTZWFyY2hMb29wVG9wLmluYyIKKwlSRVNFVF9DSFJPTUEJCS8vIHByZXRlbmQgY2hyb21hIGRpZmZzIHdhcyAyNTUgZWFjaAorI2luY2x1ZGUgIlNlYXJjaExvb3AwQS5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcEJvdHRvbS5pbmMiCisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBpbnQgU0VBUkNIX0VGRk9SVF9GVU5DKDMpCit7CisjaWZkZWYgSVNfQworI2RlZmluZSBTS0lQX1NFQVJDSAorI2luY2x1ZGUgIlNlYXJjaExvb3BUb3AuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BCb3R0b20uaW5jIgorI3VuZGVmIFNLSVBfU0VBUkNICisjZWxzZQorCQkvL3NlZSBTZWFyY2hfRWZmb3J0X01heCgpIGZvciBjb21tZW50cworI2luY2x1ZGUgIlNlYXJjaExvb3BUb3AuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BPZGRBMi5pbmMiCisJUkVTRVRfQ0hST01BCQkvLyBwcmV0ZW5kIGNocm9tYSBkaWZmcyB3YXMgMjU1IGVhY2gKKyNpbmNsdWRlICJTZWFyY2hMb29wMEEuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BCb3R0b20uaW5jIgorI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgaW50IFNFQVJDSF9FRkZPUlRfRlVOQyg1KQoreworI2lmZGVmIElTX0MKKyNkZWZpbmUgU0tJUF9TRUFSQ0gKKyNpbmNsdWRlICJTZWFyY2hMb29wVG9wLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wQm90dG9tLmluYyIKKyN1bmRlZiBTS0lQX1NFQVJDSAorI2Vsc2UKKwkJLy9zZWUgU2VhcmNoX0VmZm9ydF9NYXgoKSBmb3IgY29tbWVudHMKKyNpbmNsdWRlICJTZWFyY2hMb29wVG9wLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wT2RkQTIuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BPZGRBSDIuaW5jIgorCVJFU0VUX0NIUk9NQQkJLy8gcHJldGVuZCBjaHJvbWEgZGlmZnMgd2FzIDI1NSBlYWNoCisjaW5jbHVkZSAiU2VhcmNoTG9vcDBBLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wQm90dG9tLmluYyIKKyNlbmRpZgorfQorCisvLyAzeDMgc2VhcmNoCitzdGF0aWMgaW5saW5lIGludCBTRUFSQ0hfRUZGT1JUX0ZVTkMoOSkKK3sKKyNpZmRlZiBJU19DCisjZGVmaW5lIFNLSVBfU0VBUkNICisjaW5jbHVkZSAiU2VhcmNoTG9vcFRvcC5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcEJvdHRvbS5pbmMiCisjdW5kZWYgU0tJUF9TRUFSQ0gKKyNlbHNlCisJCS8vc2VlIFNlYXJjaEVmZm9ydE1heCgpIGZvciBjb21tZW50cworI2luY2x1ZGUgIlNlYXJjaExvb3BUb3AuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BPZGRBLmluYyIKKwlSRVNFVF9DSFJPTUEJCQkvLyBwcmV0ZW5kIGNocm9tYSBkaWZmcyB3YXMgMjU1IGVhY2gKKyNpbmNsdWRlICJTZWFyY2hMb29wVkEuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3AwQS5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcEJvdHRvbS5pbmMiCisjZW5kaWYKK30KKworLy8gU2VhcmNoIDkgd2l0aCAyIEgtaGFsZiBwZWxzIGFkZGVkCitzdGF0aWMgaW5saW5lIGludCBTRUFSQ0hfRUZGT1JUX0ZVTkMoMTEpCit7CisjaWZkZWYgSVNfQworI2RlZmluZSBTS0lQX1NFQVJDSAorI2luY2x1ZGUgIlNlYXJjaExvb3BUb3AuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BCb3R0b20uaW5jIgorI3VuZGVmIFNLSVBfU0VBUkNICisjZWxzZQorCQkvL3NlZSBTZWFyY2hFZmZvcnRNYXgoKSBmb3IgY29tbWVudHMKKyNpbmNsdWRlICJTZWFyY2hMb29wVG9wLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wT2RkQS5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcE9kZEFIMi5pbmMiCisJUkVTRVRfQ0hST01BCQkJLy8gcHJldGVuZCBjaHJvbWEgZGlmZnMgd2FzIDI1NSBlYWNoCisjaW5jbHVkZSAiU2VhcmNoTG9vcFZBLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wMEEuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BCb3R0b20uaW5jIgorI2VuZGlmCit9CisKKy8vIFNlYXJjaCAxMSB3aXRoIDIgVi1oYWxmIHBlbHMgYWRkZWQKK3N0YXRpYyBpbmxpbmUgaW50IFNFQVJDSF9FRkZPUlRfRlVOQygxMykKK3sKKyNpZmRlZiBJU19DCisjZGVmaW5lIFNLSVBfU0VBUkNICisjaW5jbHVkZSAiU2VhcmNoTG9vcFRvcC5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcEJvdHRvbS5pbmMiCisjdW5kZWYgU0tJUF9TRUFSQ0gKKyNlbHNlCisJCS8vc2VlIFNlYXJjaEVmZm9ydE1heCgpIGZvciBjb21tZW50cworI2luY2x1ZGUgIlNlYXJjaExvb3BUb3AuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BPZGRBLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wT2RkQUgyLmluYyIKKwlSRVNFVF9DSFJPTUEJCQkvLyBwcmV0ZW5kIGNocm9tYSBkaWZmcyB3YXMgMjU1IGVhY2gKKyNpbmNsdWRlICJTZWFyY2hMb29wVkFILmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wVkEuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3AwQS5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcEJvdHRvbS5pbmMiCisjZW5kaWYKK30KKworLy8gNXgzCitzdGF0aWMgaW5saW5lIGludCBTRUFSQ0hfRUZGT1JUX0ZVTkMoMTUpCit7CisjaWZkZWYgSVNfQworI2RlZmluZSBTS0lQX1NFQVJDSAorI2luY2x1ZGUgIlNlYXJjaExvb3BUb3AuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BCb3R0b20uaW5jIgorI3VuZGVmIFNLSVBfU0VBUkNICisjZWxzZQorCQkvL3NlZSBTZWFyY2hFZmZvcnRNYXgoKSBmb3IgY29tbWVudHMKKyNpbmNsdWRlICJTZWFyY2hMb29wVG9wLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wT2RkQS5pbmMiCisJUkVTRVRfQ0hST01BCQkJLy8gcHJldGVuZCBjaHJvbWEgZGlmZnMgd2FzIDI1NSBlYWNoCisjaW5jbHVkZSAiU2VhcmNoTG9vcEVkZ2VBLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wVkEuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3AwQS5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcEJvdHRvbS5pbmMiCisjZW5kaWYKK30KKworLy8gNXgzICsgNCBoYWxmIHBlbHMKK3N0YXRpYyBpbmxpbmUgaW50IFNFQVJDSF9FRkZPUlRfRlVOQygxOSkKK3sKKyNpZmRlZiBJU19DCisjZGVmaW5lIFNLSVBfU0VBUkNICisjaW5jbHVkZSAiU2VhcmNoTG9vcFRvcC5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcEJvdHRvbS5pbmMiCisjdW5kZWYgU0tJUF9TRUFSQ0gKKyNlbHNlCisJCS8vc2VlIFNlYXJjaEVmZm9ydE1heCgpIGZvciBjb21tZW50cworI2luY2x1ZGUgIlNlYXJjaExvb3BUb3AuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BPZGRBLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wT2RkQUgyLmluYyIKKwlSRVNFVF9DSFJPTUEJCQkvLyBwcmV0ZW5kIGNocm9tYSBkaWZmcyB3YXMgMjU1IGVhY2gKKyNpbmNsdWRlICJTZWFyY2hMb29wRWRnZUEuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BWQUguaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BWQS5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcDBBLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wQm90dG9tLmluYyIKKyNlbmRpZgorfQorCisvLyBIYW5kbGUgb25lIDR4MSBibG9jayBvZiBwaXhlbHMKKy8vIFNlYXJjaCBhIDd4MyBhcmVhLCBubyBoYWxmIHBlbHMKKworc3RhdGljIGlubGluZSBpbnQgU0VBUkNIX0VGRk9SVF9GVU5DKDIxKQoreworI2lmZGVmIElTX0MKKyNkZWZpbmUgU0tJUF9TRUFSQ0gKKyNpbmNsdWRlICJTZWFyY2hMb29wVG9wLmluYyIKKyNpbmNsdWRlICJTZWFyY2hMb29wQm90dG9tLmluYyIKKyN1bmRlZiBTS0lQX1NFQVJDSAorI2Vsc2UKKwkJLy9zZWUgU2VhcmNoTG9vcFRvcC5pbmMgZm9yIGNvbW1lbnRzCisjaW5jbHVkZSAiU2VhcmNoTG9vcFRvcC5pbmMiCisKKwkJLy8gb2RkIGFkZHJlc3NlcyAtLSB0aGUgcGl4ZWxzIGF0IG9kZCBhZGRyZXNzIHdvdWxkbid0IGdlbmVyYXRlCisJCS8vIGdvb2QgbHVtYSB2YWx1ZXMgYnV0IHdlIHdpbGwgbWFzayB0aG9zZSBvZmYKKworI2luY2x1ZGUgIlNlYXJjaExvb3BPZGRBNi5pbmMiICAvLyA0IG9kZCB2IGhhbGYgcGVscywgMyB0byBsZWZ0ICYgcmlnaHQKKyNpbmNsdWRlICJTZWFyY2hMb29wT2RkQS5pbmMiICAgLy8gNiBvZGQgcGVscywgMSB0byBsZWZ0ICYgcmlnaHQKKworCVJFU0VUX0NIUk9NQQkJLy8gcHJldGVuZCBjaHJvbWEgZGlmZnMgd2FzIDI1NSBlYWNoCisKKwkJLy8gZXZlbiBhZGRyZXNzZXMgLS0gdXNlIGJvdGggbHVtYSBhbmQgY2hyb21hIGZyb20gdGhlc2UKKwkJLy8gc2VhcmNoIGF2ZXJhZ2VzIG9mIDIgcGl4ZWxzIGxlZnQgYW5kIHJpZ2h0CisjaW5jbHVkZSAiU2VhcmNoTG9vcEVkZ2VBLmluYyIKKwkJLy8gc2VhcmNoIHZlcnRpY2FsIGxpbmUgYW5kIGF2ZXJhZ2VzLCAtMSwwLCsxCisjaW5jbHVkZSAiU2VhcmNoTG9vcFZBLmluYyIKKwkJLy8gYmxlbmQgb3VyIHJlc3VsdHMgYW5kIGxvb3AKKyNpbmNsdWRlICJTZWFyY2hMb29wMEEuaW5jIgorI2luY2x1ZGUgIlNlYXJjaExvb3BCb3R0b20uaW5jIgorI2VuZGlmCit9CisKKy8vIEhhbmRsZSBvbmUgNHgxIGJsb2NrIG9mIHBpeGVscworLy8gU2VhcmNoIGEgOXgzIGFyZWEsIG5vIGhhbGYgcGVscworc3RhdGljIGlubGluZSBpbnQgU0VBUkNIX0VGRk9SVF9GVU5DKE1heCkKK3sKKyNpZmRlZiBJU19DCisjZGVmaW5lIFNLSVBfU0VBUkNICisjaW5jbHVkZSAiU2VhcmNoTG9vcFRvcC5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcEJvdHRvbS5pbmMiCisjdW5kZWYgU0tJUF9TRUFSQ0gKKyNlbHNlCisJCS8vc2VlIFNlYXJjaExvb3BUb3AuaW5jIGZvciBjb21tZW50cworI2luY2x1ZGUgIlNlYXJjaExvb3BUb3AuaW5jIgorCisJCS8vIG9kZCBhZGRyZXNzZXMgLS0gdGhlIHBpeGVscyBhdCBvZGQgYWRkcmVzcyB3b3VsZG4ndCBnZW5lcmF0ZQorCQkvLyBnb29kIGx1bWEgdmFsdWVzIGJ1dCB3ZSB3aWxsIG1hc2sgdGhvc2Ugb2ZmCisKKyNpbmNsdWRlICJTZWFyY2hMb29wT2RkQTYuaW5jIiAgLy8gNCBvZGQgdiBoYWxmIHBlbHMsIDMgdG8gbGVmdCAmIHJpZ2h0CisjaW5jbHVkZSAiU2VhcmNoTG9vcE9kZEEuaW5jIiAgIC8vIDYgb2RkIHBlbHMsIDEgdG8gbGVmdCAmIHJpZ2h0CisKKwlSRVNFVF9DSFJPTUEJCS8vIHByZXRlbmQgY2hyb21hIGRpZmZzIHdhcyAyNTUgZWFjaAorCisJCS8vIGV2ZW4gYWRkcmVzc2VzIC0tIHVzZSBib3RoIGx1bWEgYW5kIGNocm9tYSBmcm9tIHRoZXNlCisJCS8vIHNlYXJjaCBhdmVyYWdlcyBvZiA0IHBpeGVscyBsZWZ0IGFuZCByaWdodAorI2luY2x1ZGUgIlNlYXJjaExvb3BFZGdlQTguaW5jIgorCQkvLyBzZWFyY2ggYXZlcmFnZXMgb2YgMiBwaXhlbHMgbGVmdCBhbmQgcmlnaHQKKyNpbmNsdWRlICJTZWFyY2hMb29wRWRnZUEuaW5jIgorCQkvLyBzZWFyY2ggdmVydGljYWwgbGluZSBhbmQgYXZlcmFnZXMsIC0xLDAsKzEKKyNpbmNsdWRlICJTZWFyY2hMb29wVkEuaW5jIgorCQkvLyBibGVuZCBvdXIgcmVzdWx0cyBhbmQgbG9vcAorI2luY2x1ZGUgIlNlYXJjaExvb3AwQS5pbmMiCisjaW5jbHVkZSAiU2VhcmNoTG9vcEJvdHRvbS5pbmMiCisjZW5kaWYKK30KKworI3VuZGVmIFNFQVJDSF9FRkZPUlRfRlVOQworCmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3RvbXNtb2NvbXAvV2llcmRCb2IuaW5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1dpZXJkQm9iLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGJiYjgzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL1dpZXJkQm9iLmluYwpAQCAtMCwwICsxLDI4NiBAQAorLy8gLSotIGMrKyAtKi0KKworCQkvLyBGaXJzdCwgZ2V0IGFuZCBzYXZlIG91ciBwb3NzaWJsZSBCb2IgdmFsdWVzCisJCS8vIEFzc3VtZSBvdXIgcGl4ZWxzIGFyZSBsYXllZCBvdXQgYXMgZm9sbG93cyB3aXRoIHggdGhlIGNhbGMnZCBib2IgdmFsdWUKKwkJLy8gYW5kIHRoZSBvdGhlciBwaXhlbHMgYXJlIGZyb20gdGhlIGN1cnJlbnQgZmllbGQKKwkJLy8gIAorCQkvLyAgICAgICAgaiBhIGIgYyBrCQljdXJyZW50IGZpZWxkCisJCS8vICAgICAgICAgICAgeAkJCWNhbGN1bGF0ZWQgbGluZQorCQkvLyAgICAgICAgbSBkIGUgZiBuCQljdXJyZW50IGZpZWxkCisJCS8vCisJCS8vIHdlIGNhbGMgdGhlIGJvYiB2YWx1ZSBhczoKKwkJLy8JCXgyID0gZWl0aGVyIGF2ZyhhLGYpLCBhdmcoYyxkKSwgYXZnKGIsZSksIGF2ZyhqLG4pLCBvciBhdmcoayxtKQorCQkgCisJCS8vIHNlbGVjdGVkIGZvciB0aGUJc21hbGxlc3Qgb2YgYWJzKGEsZiksIGFicyhjLGQpLCBvciBhYnMoYixlKSwgZXRjLgorCisjaWZuZGVmIElTX0MKKwkJLy8gYSxmCisJCSJtb3ZxICAgIC0yKCUlIlhCWCIpLCAlJW1tMFxuXHQiCQkvLyB2YWx1ZSBhIGZyb20gdG9wIGxlZnQJCQorCQkibW92cSAgICAyKCUlIlhCWCIsICUlIlhDWCIpLCAlJW1tMVxuXHQiCS8vIHZhbHVlIGYgZnJvbSBib3R0b20gcmlnaHQJCQkKKwkJIm1vdnEJJSVtbTAsICUlbW02XG5cdCIJCQkJCQorLy8JCXBhdmdiCSUlbW02LCAlJW1tMQkJCQkJLy8gYXZnKGEsZiksIGFsc28gYmVzdCBzbyBmYXIKKwkJVl9QQVZHQiAoIiUlbW02IiwgIiUlbW0xIiwgIiUlbW03IiwgX1NoaWZ0TWFzaykJLy8gYXZnKGEsZiksIGFsc28gYmVzdCBzbyBmYXIKKyAgICAgICAgIm1vdnEJJSVtbTAsICUlbW03XG5cdCIKKwkJInBzdWJ1c2IJICUlbW0xLCAlJW1tN1xuXHQiCisJCSJwc3VidXNiICUlbW0wLCAlJW1tMVxuXHQiCisJCSJwb3IJCSUlbW0xLCAlJW1tN1xuXHQiCQkJCQkvLyBhYnMgZGlmZiwgYWxzbyBiZXN0IHNvIGZhcgorCisJCS8vIGMsZAorCQkibW92cSAgICAyKCUlIlhCWCIpLCAlJW1tMFxuXHQiCQkvLyB2YWx1ZSBhIGZyb20gdG9wIGxlZnQJCQorCQkibW92cSAgICAtMiglJSJYQlgiLCAlJSJYQ1giKSwgJSVtbTFcblx0IgkvLyB2YWx1ZSBmIGZyb20gYm90dG9tIHJpZ2h0CQkJCisJCSJtb3ZxCSUlbW0wLCAlJW1tMlxuXHQiCQkJCQkJCisvLwkJcGF2Z2IJJSVtbTIsICUlbW0xCQkJCQkvLyBhdmcoYyxkKQorCQlWX1BBVkdCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTMiLCBfU2hpZnRNYXNrKQkvLyBhdmcoYyxkKQorICAgICAgICAibW92cQklJW1tMCwgJSVtbTNcblx0IgorCQkicHN1YnVzYgklJW1tMSwgJSVtbTNcblx0IgorCQkicHN1YnVzYiAlJW1tMCwgJSVtbTFcblx0IgorCQkicG9yCQklJW1tMSwgJSVtbTNcblx0IgkJCQkJLy8gYWJzKGMsZCkKKwkJIm1vdnEJJSVtbTMsICUlbW0xXG5cdCIJCQkJCS8vIGtlZXAgY29weQorCisJCSJwc3VidXNiICUlbW03LCAlJW1tM1xuXHQiCQkJLy8gbm9uemVybyB3aGVyZSBuZXcgd2VpZ2h0cyBiaWdnZXIsIGVsc2UgMAorCQkicHhvcgklJW1tNCwgJSVtbTRcblx0IgorCQkicGNtcGVxYiAlJW1tNCwgJSVtbTNcblx0IgkJCS8vIG5vdyBmZiB3aGVyZSBuZXcgYmV0dGVyLCBlbHNlIDAwCQorCQkicGNtcGVxYgklJW1tMywgJSVtbTRcblx0IgkJCS8vIGhlcmUgZmYgd2hlcmUgb2xkIGJldHRlciwgZWxzZSAwMAorCisJCSJwYW5kCSUlbW0zLCAlJW1tMVxuXHQiCQkJLy8ga2VlcCBvbmx5IGJldHRlciBuZXcgYXZnIGFuZCBhYnMKKwkJInBhbmQJJSVtbTMsICUlbW0yXG5cdCIKKworCQkicGFuZAklJW1tNCwgJSVtbTZcblx0IgorCQkicGFuZCAgICAlJW1tNCwgJSVtbTdcblx0IgorCisJCSJwb3IJCSUlbW0yLCAlJW1tNlxuXHQiCQkJLy8gYW5kIG1lcmdlIG5ldyAmIG9sZCB2YWxzIGtlZXBpbmcgYmVzdAorCQkicG9yCQklJW1tMSwgJSVtbTdcblx0IgorCQkicG9yCQkiX1VWTWFzayIsICUlbW03XG5cdCIJCQkvLyBidXQgd2Uga25vdyBjaHJvbWEgaXMgd29ydGhsZXNzIHNvIGZhcgorCQkicGFuZAkiX1lNYXNrIiwgJSVtbTVcblx0IgkJCS8vIG1hc2sgb3V0IGNocm9tYSBmcm9tIGhlcmUgYWxzbworCisJCS8vIGosbgorCQkibW92cSAgICAtNCglJSJYQlgiKSwgJSVtbTBcblx0IgkJLy8gdmFsdWUgaiBmcm9tIHRvcCBsZWZ0CQkKKwkJIm1vdnEgICAgNCglJSJYQlgiLCAlJSJYQ1giKSwgJSVtbTFcblx0IgkvLyB2YWx1ZSBuIGZyb20gYm90dG9tIHJpZ2h0CQkJCisJCSJtb3ZxCSUlbW0wLCAlJW1tMlxuXHQiCQkJCQkJCisvLwkJcGF2Z2IJJSVtbTIsICUlbW0xCQkJCQkvLyBhdmcoaixuKQorCQlWX1BBVkdCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTMiLCBfU2hpZnRNYXNrKQkvLyBhdmcoaixuKQorICAgICAgICAibW92cQklJW1tMCwgJSVtbTNcblx0IgorCQkicHN1YnVzYgklJW1tMSwgJSVtbTNcblx0IgorCQkicHN1YnVzYiAlJW1tMCwgJSVtbTFcblx0IgorCQkicG9yCQklJW1tMSwgJSVtbTNcblx0IgkJCQkJLy8gYWJzKGotbikKKwkJIm1vdnEJJSVtbTMsICUlbW0xXG5cdCIJCQkJCS8vIGtlZXAgY29weQorCisJCSJwc3VidXNiICUlbW03LCAlJW1tM1xuXHQiCQkJLy8gbm9uemVybyB3aGVyZSBuZXcgd2VpZ2h0cyBiaWdnZXIsIGVsc2UgMAorCQkicHhvcgklJW1tNCwgJSVtbTRcblx0IgorCQkicGNtcGVxYiAlJW1tNCwgJSVtbTNcblx0IgkJCS8vIG5vdyBmZiB3aGVyZSBuZXcgYmV0dGVyLCBlbHNlIDAwCQorCQkicGNtcGVxYgklJW1tMywgJSVtbTRcblx0IgkJCS8vIGhlcmUgZmYgd2hlcmUgb2xkIGJldHRlciwgZWxzZSAwMAorCisJCSJwYW5kCSUlbW0zLCAlJW1tMVxuXHQiCQkJLy8ga2VlcCBvbmx5IGJldHRlciBuZXcgYXZnIGFuZCBhYnMKKwkJInBhbmQJJSVtbTIsICUlbW0zXG5cdCIKKworCQkicGFuZAklJW1tNCwgJSVtbTZcblx0IgorCQkicGFuZCAgICAlJW1tNCwgJSVtbTdcblx0IgorCisJCSJwb3IJCSUlbW0zLCAlJW1tNlxuXHQiCQkJLy8gYW5kIG1lcmdlIG5ldyAmIG9sZCB2YWxzIGtlZXBpbmcgYmVzdAorCQkicG9yCQklJW1tMSwgJSVtbTdcblx0IgkJCS8vICIKKworCQkvLyBrLCBtCisJCSJtb3ZxICAgIDQoJSUiWEJYIiksICUlbW0wXG5cdCIJCS8vIHZhbHVlIGsgZnJvbSB0b3AgcmlnaHQJCQorCQkibW92cSAgICAtNCglJSJYQlgiLCAlJSJYQ1giKSwgJSVtbTFcblx0IgkvLyB2YWx1ZSBuIGZyb20gYm90dG9tIGxlZnQJCQkKKwkJIm1vdnEJJSVtbTAsICUlbW00XG5cdCIJCQkJCQkKKy8vCQlwYXZnYgklJW1tNCwgJSVtbTEJCQkJCS8vIGF2ZyhrLG0pCisJCVZfUEFWR0IgKCIlJW1tNCIsICIlJW1tMSIsICIlJW1tMyIsIF9TaGlmdE1hc2spCS8vIGF2ZyhrLG0pCisKKyAgICAgICAgIm1vdnEJJSVtbTAsICUlbW0zXG5cdCIKKwkJInBzdWJ1c2IJJSVtbTEsICUlbW0zXG5cdCIKKwkJInBzdWJ1c2IgJSVtbTAsICUlbW0xXG5cdCIKKwkJInBvcgkJJSVtbTEsICUlbW0zXG5cdCIJCQkJCS8vIGFicyhrLG0pCisJCSJtb3ZxCSUlbW0zLCAlJW1tMVxuXHQiCQkJCQkvLyBrZWVwIGNvcHkKKyAgICAgICAgICAgIAorCQkibW92cQklJW1tNCwgJSVtbTJcblx0IgkJCS8vIGF2ZyhrLG0pCisKKwkJInBzdWJ1c2IgJSVtbTcsICUlbW0zXG5cdCIJCQkvLyBub256ZXJvIHdoZXJlIG5ldyB3ZWlnaHRzIGJpZ2dlciwgZWxzZSAwCisJCSJweG9yCSUlbW00LCAlJW1tNFxuXHQiCisJCSJwY21wZXFiICUlbW00LCAlJW1tM1xuXHQiCQkJLy8gbm93IGZmIHdoZXJlIG5ldyBiZXR0ZXIsIGVsc2UgMDAJCisJCSJwY21wZXFiCSUlbW0zLCAlJW1tNFxuXHQiCQkJLy8gaGVyZSBmZiB3aGVyZSBvbGQgYmV0dGVyLCBlbHNlIDAwCisKKwkJInBhbmQJJSVtbTMsICUlbW0xXG5cdCIJCQkvLyBrZWVwIG9ubHkgYmV0dGVyIG5ldyBhdmcgYW5kIGFicworCQkicGFuZAklJW1tMiwgJSVtbTNcblx0IgorICAgICAgICAgICAgCisJCSJwYW5kCSUlbW00LCAlJW1tNlxuXHQiCisJCSJwYW5kICAgICUlbW00LCAlJW1tN1xuXHQiCisKKwkJInBvcgkJJSVtbTMsICUlbW02XG5cdCIJCQkvLyBhbmQgbWVyZ2UgbmV3ICYgb2xkIHZhbHMga2VlcGluZyBiZXN0CisJCSJwb3IJCSUlbW0xLCAlJW1tN1xuXHQiCQkJLy8gIgorCisJCS8vIGIsZQorCQkibW92cSAgICAoJSUiWEJYIiksICUlbW0wXG5cdCIJCS8vIHZhbHVlIGIgZnJvbSB0b3AgCQkKKwkJIm1vdnEgICAgKCUlIlhCWCIsICUlIlhDWCIpLCAlJW1tMVxuXHQiCS8vIHZhbHVlIGUgZnJvbSBib3R0b20gCisKKy8vIFdlIHdpbGwgYWxzbyBjYWxjIGhlcmUgdGhlIG1heC9taW4gdmFsdWVzIHRvIGxhdGVyIGxpbWl0IGNvbWIKKy8vIHNvIHRoZSBtYXggZXhjdXJzaW9uIHdpbGwgbm90IGV4Y2VlZCB0aGUgTWF4X0NvbWIgY29uc3RhbnQKKworI2lmZGVmIFNLSVBfU0VBUkNICQkKKwkJIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIKKy8vCQlwbWludWIJJSVtbTIsICUlbW0xCisJCVZfUE1JTlVCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTQiKQorCisvLwkJcG1heHViCSUlbW02LCAlJW1tMgkJCS8vIGNsaXAgb3VyIGN1cnJlbnQgcmVzdWx0cyBzbyBmYXIgdG8gYmUgYWJvdmUgdGhpcworCQlWX1BNQVhVQiAoIiUlbW02IiwgIiUlbW0yIikKKwkJIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIKKwkJVl9QTUFYVUIgKCIlJW1tMiIsICIlJW1tMSIpCisvLwkJcG1pbnViCSUlbW02LCAlJW1tMgkJCS8vIGNsaXAgb3VyIGN1cnJlbnQgcmVzdWx0cyBzbyBmYXIgdG8gYmUgYmVsb3cgdGhpcworCQlWX1BNSU5VQiAoIiUlbW02IiwgIiUlbW0yIiwgIiUlbW00IikKKworI2Vsc2UKKyAgICAgICAgIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIKKwkJIm1vdnEJKCUlIlhBWCIpLCAlJW1tNFxuXHQiCisJCSJwc3VidXNiICUlbW00LCAlJW1tMlxuXHQiCisJCSJwc3VidXNiICUlbW0wLCAlJW1tNFxuXHQiCisJCSJwb3IJCSUlbW0yLCAlJW1tNFxuXHQiCQkJLy8gYWJzIGRpZmYKKwkJCisJCSJtb3ZxCSUlbW0xLCAlJW1tMlxuXHQiCisJCSJtb3ZxCSglJSJYQVgiLCAlJSJYQ1giKSwgJSVtbTNcblx0IgorCQkicHN1YnVzYiAlJW1tMywgJSVtbTJcblx0IgorCQkicHN1YnVzYiAlJW1tMSwgJSVtbTNcblx0IgorCQkicG9yCQklJW1tMiwgJSVtbTNcblx0IgkJCS8vIGFicyBkaWZmCisvLwkJcG1heHViICAlJW1tMywgJSVtbTQJCQkvLyB0b3Agb3IgYm90dG9tIHBpeGVsIG1vdmVkIG1vc3QKKwkJVl9QTUFYVUIgKCIlJW1tMyIsICIlJW1tNCIpCQkJLy8gdG9wIG9yIGJvdHRvbSBwaXhlbCBtb3ZlZCBtb3N0CisgICAgICAgICJwc3VidXNiICJfTWF4X01vdiIsICUlbW0zXG5cdCIJCS8vIG1vdmVkIG1vcmUgdGhhbiBhbGxvd2VkPyBvciBnb2VzIHRvIDA/CisJCSJweG9yCSUlbW00LCAlJW1tNFxuXHQiCisJCSJwY21wZXFiICUlbW00LCAlJW1tM1xuXHQiCQkJLy8gbm93IGZmIHdoZXJlIGxvdyBtb3Rpb24sIGVsc2UgaGlnaCBtb3Rpb24KKwkJCisJCSJtb3ZxCSUlbW0wLCAlJW1tMlxuXHQiCisvLwkJcG1pbnViCSUlbW0yLCAlJW1tMQorCQlWX1BNSU5VQiAoIiUlbW0yIiwgIiUlbW0xIiwgIiUlbW00IikKKworLy8JCXBtYXh1YgklJW1tNiwgJSVtbTIJCQkvLyBjbGlwIG91ciBjdXJyZW50IHJlc3VsdHMgc28gZmFyIHRvIGJlIGFib3ZlIHRoaXMKKwkJVl9QTUFYVUIgKCIlJW1tNiIsICIlJW1tMiIpCisKKwkJInBzdWJ1c2IgJSVtbTMsICUlbW0yXG5cdCIJCQkvLyBtYXliZSBkZWNyZWFzZSBpdCB0byAwMDAwLi4gaWYgbm8gc3Vycm91bmQgbW90aW9uCisJCSJtb3ZxCSUlbW0yLCAiX01pbl9WYWxzIlxuXHQiCisKKwkJIm1vdnEJJSVtbTAsICUlbW0yXG5cdCIKKwkJVl9QTUFYVUIgKCIlJW1tMiIsICIlJW1tMSIpCisvLwkJcG1pbnViCSUlbW02LCAlJW1tMgkJCS8vIGNsaXAgb3VyIGN1cnJlbnQgcmVzdWx0cyBzbyBmYXIgdG8gYmUgYmVsb3cgdGhpcworCQlWX1BNSU5VQiAoIiUlbW02IiwgIiUlbW0yIiwgIiUlbW00IikKKyAgICAgICAgInBhZGR1c2IgJSVtbTMsICUlbW0yXG5cdCIJCQkvLyBtYXliZSBpbmNyZWFzZSBpdCB0byBmZmZmZmYgaWYgbm8gc3Vycm91bmQgbW90aW9uCisJCSJtb3ZxCSUlbW0yLCAiX01heF9WYWxzIlxuXHQiCisjZW5kaWYKKyAgICAgICAgCisJCSJtb3ZxCSUlbW0wLCAlJW1tMlxuXHQiCQkJCQkJCisvLwkJcGF2Z2IJJSVtbTIsICUlbW0xCQkJCQkvLyBhdmcoYixlKQorCQlWX1BBVkdCICgiJSVtbTIiLCAiJSVtbTEiLCAiJSVtbTMiLCBfU2hpZnRNYXNrKQkvLyBhdmcoYixlKQorCQkJCQorICAgICAgICAibW92cQklJW1tMCwgJSVtbTNcblx0IgorCQkicHN1YnVzYgklJW1tMSwgJSVtbTNcblx0IgorCQkicHN1YnVzYiAlJW1tMCwgJSVtbTFcblx0IgorCQkicG9yCQklJW1tMSwgJSVtbTNcblx0IgkJCS8vIGFicyhjLGQpCisJCSJtb3ZxCSUlbW0zLCAlJW1tMVxuXHQiCQkJLy8ga2VlcCBjb3B5IG9mIGRpZmZzCisKKwkJInB4b3IJJSVtbTQsICUlbW00XG5cdCIJCQkKKwkJInBzdWJ1c2IgJSVtbTcsICUlbW0zXG5cdCIJCQkvLyBub256ZXJvIHdoZXJlIG5ldyB3ZWlnaHRzIGJpZ2dlciwgZWxzZSAwCisJCSJwY21wZXFiICUlbW00LCAlJW1tM1xuXHQiCQkJLy8gbm93IGZmIHdoZXJlIG5ldyBiZXR0ZXIsIGVsc2UgMDAJCisKKwkJInBjbXBlcWIJJSVtbTMsICUlbW00XG5cdCIJCQkvLyBoZXJlIGZmIHdoZXJlIG9sZCBiZXR0ZXIsIGVsc2UgMDAKKworCQkicGFuZAklJW1tMywgJSVtbTFcblx0IgorCQkicGFuZAklJW1tMywgJSVtbTJcblx0IgorCisJCSJwYW5kICAgICUlbW00LCAlJW1tNlxuXHQiCisJCSJwYW5kICAgICUlbW00LCAlJW1tN1xuXHQiCisKKwkJInBvcgkJJSVtbTIsICUlbW02XG5cdCIJCQkvLyBvdXIgeDIgdmFsdWUKKwkJInBvcgkJJSVtbTEsICUlbW03XG5cdCIJCQkvLyBvdXIgeDIgZGlmZnMKKwkJIm1vdnEJJSVtbTcsICUlbW00XG5cdCIJCQkvLyBzYXZlIGFzIGJvYiB1bmNlcnRhaW50eSBpbmRpY2F0b3IKKworI2Vsc2UKKworICAgICAgICAvLyBhLGYKKyAgICAgICAgYmVzdFswXSA9IChwQm9iWy0yXSArIHBCb2Jbc3JjX3BpdGNoMiArIDJdKSAvIDI7CisJZGlmZlswXSA9IEFCUyAocEJvYlstMl0gLSBwQm9iW3NyY19waXRjaDIgKyAyXSk7CisgICAgICAgIGJlc3RbMV0gPSAocEJvYlstMV0gKyBwQm9iW3NyY19waXRjaDIgKyAzXSkgLyAyOworCWRpZmZbMV0gPSBBQlMgKHBCb2JbLTFdIC0gcEJvYltzcmNfcGl0Y2gyICsgM10pOworCisgICAgICAgIC8vIGMsZAorCWlmIChBQlMgKHBCb2JbMl0gLSBwQm9iW3NyY19waXRjaDIgLSAyXSkgPCBkaWZmWzBdKSB7CisgICAgICAgICAgYmVzdFswXSA9IChwQm9iWzJdICsgcEJvYltzcmNfcGl0Y2gyIC0gMl0pIC8gMjsKKwkgIGRpZmZbMF0gPSBBQlMgKHBCb2JbMl0gLSBwQm9iW3NyY19waXRjaDIgLSAyXSk7CisJfQorCisJaWYgKEFCUyAocEJvYlszXSAtIHBCb2Jbc3JjX3BpdGNoMiAtIDFdKSA8IGRpZmZbMV0pIHsKKyAgICAgICAgICBiZXN0WzFdID0gKHBCb2JbM10gKyBwQm9iW3NyY19waXRjaDIgLSAxXSkgLyAyOworCSAgZGlmZlsxXSA9IEFCUyAocEJvYlszXSAtIHBCb2Jbc3JjX3BpdGNoMiAtIDFdKTsKKwl9CisKKwkvLyBqLG4KKwlpZiAoQUJTIChwQm9iWy00XSAtIHBCb2Jbc3JjX3BpdGNoMiArIDRdKSA8IGRpZmZbMF0pIHsKKyAgICAgICAgICBiZXN0WzBdID0gKHBCb2JbLTRdICsgcEJvYltzcmNfcGl0Y2gyICsgNF0pIC8gMjsKKwkgIGRpZmZbMF0gPSBBQlMgKHBCb2JbLTRdIC0gcEJvYltzcmNfcGl0Y2gyICsgNF0pOworCX0KKworCWlmIChBQlMgKHBCb2JbLTNdIC0gcEJvYltzcmNfcGl0Y2gyICsgNV0pIDwgZGlmZlsxXSkgeworICAgICAgICAgIGJlc3RbMV0gPSAocEJvYlstM10gKyBwQm9iW3NyY19waXRjaDIgKyA1XSkgLyAyOworCSAgZGlmZlsxXSA9IEFCUyAocEJvYlstM10gLSBwQm9iW3NyY19waXRjaDIgKyA1XSk7CisJfQorCisJLy8gayxtCisJaWYgKEFCUyAocEJvYls0XSAtIHBCb2Jbc3JjX3BpdGNoMiAtIDRdKSA8IGRpZmZbMF0pIHsKKyAgICAgICAgICBiZXN0WzBdID0gKHBCb2JbNF0gKyBwQm9iW3NyY19waXRjaDIgLSA0XSkgLyAyOworCSAgZGlmZlswXSA9IEFCUyAocEJvYlstNF0gLSBwQm9iW3NyY19waXRjaDIgLSA0XSk7CisJfQorCisJaWYgKEFCUyAocEJvYls1XSAtIHBCb2Jbc3JjX3BpdGNoMiAtIDNdKSA8IGRpZmZbMV0pIHsKKyAgICAgICAgICBiZXN0WzFdID0gKHBCb2JbNV0gKyBwQm9iW3NyY19waXRjaDIgLSAzXSkgLyAyOworCSAgZGlmZlsxXSA9IEFCUyAocEJvYlstM10gLSBwQm9iW3NyY19waXRjaDIgLSAzXSk7CisJfQorCS8vIGssbQorCWlmIChBQlMgKHBCb2JbNF0gLSBwQm9iW3NyY19waXRjaDIgLSA0XSkgPCBkaWZmWzBdKSB7CisgICAgICAgICAgYmVzdFswXSA9IChwQm9iWzRdICsgcEJvYltzcmNfcGl0Y2gyIC0gNF0pIC8gMjsKKwkgIGRpZmZbMF0gPSBBQlMgKHBCb2JbLTRdIC0gcEJvYltzcmNfcGl0Y2gyIC0gNF0pOworCX0KKwkKKwlpZiAoQUJTIChwQm9iWzVdIC0gcEJvYltzcmNfcGl0Y2gyIC0gM10pIDwgZGlmZlsxXSkgeworICAgICAgICAgIGJlc3RbMV0gPSAocEJvYls1XSArIHBCb2Jbc3JjX3BpdGNoMiAtIDNdKSAvIDI7CisJICBkaWZmWzFdID0gQUJTIChwQm9iWy0zXSAtIHBCb2Jbc3JjX3BpdGNoMiAtIDNdKTsKKwl9CisKKy8vIFdlIHdpbGwgYWxzbyBjYWxjIGhlcmUgdGhlIG1heC9taW4gdmFsdWVzIHRvIGxhdGVyIGxpbWl0IGNvbWIKKy8vIHNvIHRoZSBtYXggZXhjdXJzaW9uIHdpbGwgbm90IGV4Y2VlZCB0aGUgTWF4X0NvbWIgY29uc3RhbnQKKworI2lmZGVmIFNLSVBfU0VBUkNICisJCWJlc3RbMF0gPSBDTEFNUCAoYmVzdFswXSwgTUlOIChwQm9iW3NyY19waXRjaDJdLCBwQm9iWzBdKSwgTUFYIChwQm9iW3NyY19waXRjaDJdLCBwQm9iWzBdKSk7CisJCWJlc3RbMV0gPSBDTEFNUCAoYmVzdFsxXSwgTUlOIChwQm9iW3NyY19waXRjaDIgKyAxXSwgcEJvYlsxXSksIE1BWCAocEJvYltzcmNfcGl0Y2gyICsgMV0sIHBCb2JbMV0pKTsKKyNlbHNlCisJCW1vdlswXSA9IE1BWCAoQUJTIChwQm9iWzBdIC0gcEJvYlBbMF0pLCBBQlMgKHBCb2Jbc3JjX3BpdGNoMl0gLSBwQm9iUFtzcmNfcGl0Y2gyXSkpOworCQltb3ZbMV0gPSBNQVggKEFCUyAocEJvYlsxXSAtIHBCb2JQWzFdKSwgQUJTIChwQm9iW3NyY19waXRjaDIgKyAxXSAtIHBCb2JQW3NyY19waXRjaDIgKyAxXSkpOworCisJCU1pblZhbHNbMF0gPSAwOworCQlNaW5WYWxzWzFdID0gMDsKKwkJTWF4VmFsc1swXSA9IDI1NTsKKwkJTWF4VmFsc1sxXSA9IDI1NTsKKworCQlpZiAobW92WzBdID4gTWF4X01vdlswXSkgeworCQkgIE1pblZhbHNbMF0gPSBNQVggKE1JTiAocEJvYlswXSwgcEJvYltzcmNfcGl0Y2gyXSksIGJlc3RbMF0pOworCQkgIE1heFZhbHNbMF0gPSBNSU4gKE1BWCAocEJvYlswXSwgcEJvYltzcmNfcGl0Y2gyXSksIGJlc3RbMF0pOworCQl9CisJCQorCQlpZiAobW92WzFdID4gTWF4X01vdlsxXSkgeworCQkgIE1pblZhbHNbMV0gPSBNQVggKE1JTiAocEJvYlsxXSwgcEJvYltzcmNfcGl0Y2gyICsgMV0pLCBiZXN0WzFdKTsKKwkJICBNYXhWYWxzWzFdID0gTUlOIChNQVggKHBCb2JbMV0sIHBCb2Jbc3JjX3BpdGNoMiArIDFdKSwgYmVzdFsxXSk7CisJCX0KKworCQliZXN0WzBdID0gQ0xBTVAgKGJlc3RbMF0sIE1JTiAocEJvYltzcmNfcGl0Y2gyXSwgcEJvYlswXSksIE1BWCAocEJvYltzcmNfcGl0Y2gyXSwgcEJvYlswXSkpOworCQliZXN0WzFdID0gQ0xBTVAgKGJlc3RbMV0sIE1JTiAocEJvYltzcmNfcGl0Y2gyICsgMV0sIHBCb2JbMV0pLCBNQVggKHBCb2Jbc3JjX3BpdGNoMiArIDFdLCBwQm9iWzFdKSk7CisjZW5kaWYKKworCQlhdmdbMF0gPSAocEJvYltzcmNfcGl0Y2gyXSArIHBCb2JbMF0pIC8gMjsKKwkJYXZnWzFdID0gKHBCb2Jbc3JjX3BpdGNoMiArIDFdICsgcEJvYlsxXSkgLyAyOworCQlkaWZmMlswXSA9IEFCUyAocEJvYltzcmNfcGl0Y2gyXSAtIHBCb2JbMF0pOworCQlkaWZmMlsxXSA9IEFCUyAocEJvYltzcmNfcGl0Y2gyICsgMV0gLSBwQm9iWzFdKTsKKworCQlpZiAoZGlmZjJbMF0gPCBkaWZmWzBdKSB7CisJCSAgYmVzdFswXSA9IGF2Z1swXTsKKwkJICBkaWZmWzBdID0gZGlmZjJbMF07CisJCX0KKworCQlpZiAoZGlmZjJbMV0gPCBkaWZmWzFdKSB7CisJCSAgYmVzdFsxXSA9IGF2Z1sxXTsKKwkJICBkaWZmWzFdID0gZGlmZjJbMV07CisJCX0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS90b21zbW9jb21wL3RvbXNtb2NvbXBtYWNyb3MuaCBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC90b21zbW9jb21wbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4MTQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdG9tc21vY29tcC90b21zbW9jb21wbWFjcm9zLmgKQEAgLTAsMCArMSwxNjQgQEAKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8vIERlZmluZSBhIGZldyBtYWNyb3MgZm9yIENQVSBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb25zLiAKKy8vIEkgc3VzcGVjdCBJIGRvbid0IHJlYWxseSB1bmRlcnN0YW5kIGhvdyB0aGUgQyBtYWNybyBwcmVwcm9jZXNzb3Igd29ya3MgYnV0CisvLyB0aGlzIHNlZW1zIHRvIGdldCB0aGUgam9iIGRvbmUuICAgICAgICAgIC8vIFRSQiA3LzAxCisKKy8vIEJFRk9SRSBVU0lORyBUSEVTRSBZT1UgTVVTVCBTRVQ6CisKKy8vICNkZWZpbmUgU0lNRF9UWVBFIE1NWEVYVCAgICAgICAgICAgIChvciBNTVggb3IgM0ROT1cpCisKKy8vIHNvbWUgbWFjcm9zIGZvciBwYXZnYiBpbnN0cnVjdGlvbgorLy8gICAgICBWX1BBVkdCKG1tcjEsIG1tcjIsIG1tciB3b3JrIHJlZ2lzdGVyLCBzbWFzaykgbW1yMiBtYXkgPSBtbXJ3IGlmIHlvdSBjYW4gdHJhc2ggaXQKKworI2RlZmluZSBWX1BBVkdCX01NWChtbXIxLCBtbXIyLCBtbXJ3LCBzbWFzaykgXAorCSJtb3ZxICAgICJtbXIyIiwgICJtbXJ3IlxuXHQiICAgICAgICAgICAgXAorCSJwYW5kICAgICJzbWFzayIsICJtbXJ3IlxuXHQiICAgICAgICAgICAgXAorCSJwc3JsdyAgICQxLCAgICAgICJtbXJ3IlxuXHQiICAgICAgICAgICAgXAorCSJwYW5kICAgICJzbWFzayIsICJtbXIxIlxuXHQiICAgICAgICAgICAgXAorCSJwc3JsdyAgICQxLCAgICAgICJtbXIxIlxuXHQiICAgICAgICAgICAgXAorCSJwYWRkdXNiICJtbXJ3IiwgICJtbXIxIlxuXHQiCisjZGVmaW5lIFZfUEFWR0JfTU1YRVhUKG1tcjEsIG1tcjIsIG1tcncsIHNtYXNrKSAgICAgICJwYXZnYiAgICJtbXIyIiwgIm1tcjEiXG5cdCIKKyNkZWZpbmUgVl9QQVZHQl8zRE5PVyhtbXIxLCBtbXIyLCBtbXJ3LCBzbWFzaykgICAgInBhdmd1c2IgIm1tcjIiLCAibW1yMSJcblx0IgorI2RlZmluZSBWX1BBVkdCKG1tcjEsIG1tcjIsIG1tcncsIHNtYXNrKSAgICAgICAgICBWX1BBVkdCMihtbXIxLCBtbXIyLCBtbXJ3LCBzbWFzaywgU0lNRF9UWVBFKSAKKyNkZWZpbmUgVl9QQVZHQjIobW1yMSwgbW1yMiwgbW1ydywgc21hc2ssIHNpbWRfdHlwZSkgVl9QQVZHQjMobW1yMSwgbW1yMiwgbW1ydywgc21hc2ssIHNpbWRfdHlwZSkgCisjZGVmaW5lIFZfUEFWR0IzKG1tcjEsIG1tcjIsIG1tcncsIHNtYXNrLCBzaW1kX3R5cGUpIFZfUEFWR0JfIyNzaW1kX3R5cGUobW1yMSwgbW1yMiwgbW1ydywgc21hc2spIAorCisvLyBzb21lIG1hY3JvcyBmb3IgcG1heHViIGluc3RydWN0aW9uCisjZGVmaW5lIFZfUE1BWFVCX01NWChtbXIxLCBtbXIyKSBcCisgICAgInBzdWJ1c2IgIm1tcjIiLCAibW1yMSJcblx0IiBcCisgICAgInBhZGR1c2IgIm1tcjIiLCAibW1yMSJcblx0IgorI2RlZmluZSBWX1BNQVhVQl9NTVhFWFQobW1yMSwgbW1yMikgICAgICAicG1heHViICJtbXIyIiwgIm1tcjEiXG5cdCIKKyNkZWZpbmUgVl9QTUFYVUJfM0ROT1cobW1yMSwgbW1yMikgICAgVl9QTUFYVUJfTU1YKG1tcjEsIG1tcjIpICAvLyB1c2UgTU1YIHZlcnNpb24KKyNkZWZpbmUgVl9QTUFYVUIobW1yMSwgbW1yMikgICAgICAgICAgVl9QTUFYVUIyKG1tcjEsIG1tcjIsIFNJTURfVFlQRSkgCisjZGVmaW5lIFZfUE1BWFVCMihtbXIxLCBtbXIyLCBzaW1kX3R5cGUpIFZfUE1BWFVCMyhtbXIxLCBtbXIyLCBzaW1kX3R5cGUpIAorI2RlZmluZSBWX1BNQVhVQjMobW1yMSwgbW1yMiwgc2ltZF90eXBlKSBWX1BNQVhVQl8jI3NpbWRfdHlwZShtbXIxLCBtbXIyKSAKKworLy8gc29tZSBtYWNyb3MgZm9yIHBtaW51YiBpbnN0cnVjdGlvbgorLy8gICAgICBWX1BNSU5VQihtbXIxLCBtbXIyLCBtbXIgd29yayByZWdpc3RlcikgICAgIG1tcjIgbWF5IE5PVCA9IG1tcncKKyNkZWZpbmUgVl9QTUlOVUJfTU1YKG1tcjEsIG1tcjIsIG1tcncpIFwKKyAgICAicGNtcGVxYiAibW1ydyIsICJtbXJ3IlxuXHQiICAgICAgIFwKKyAgICAicHN1YnVzYiAibW1yMiIsICJtbXJ3IlxuXHQiICAgICAgIFwKKyAgICAicGFkZHVzYiAibW1ydyIsICJtbXIxIlxuXHQiICAgICAgIFwKKyAgICAicHN1YnVzYiAibW1ydyIsICJtbXIxIlxuXHQiCisjZGVmaW5lIFZfUE1JTlVCX01NWEVYVChtbXIxLCBtbXIyLCBtbXJ3KSAgICAgICJwbWludWIgIm1tcjIiLCAibW1yMSJcblx0IgorI2RlZmluZSBWX1BNSU5VQl8zRE5PVyhtbXIxLCBtbXIyLCBtbXJ3KSAgICBWX1BNSU5VQl9NTVgobW1yMSwgbW1yMiwgbW1ydykgIC8vIHVzZSBNTVggdmVyc2lvbgorI2RlZmluZSBWX1BNSU5VQihtbXIxLCBtbXIyLCBtbXJ3KSAgICAgICAgICBWX1BNSU5VQjIobW1yMSwgbW1yMiwgbW1ydywgU0lNRF9UWVBFKSAKKyNkZWZpbmUgVl9QTUlOVUIyKG1tcjEsIG1tcjIsIG1tcncsIHNpbWRfdHlwZSkgVl9QTUlOVUIzKG1tcjEsIG1tcjIsIG1tcncsIHNpbWRfdHlwZSkgCisjZGVmaW5lIFZfUE1JTlVCMyhtbXIxLCBtbXIyLCBtbXJ3LCBzaW1kX3R5cGUpIFZfUE1JTlVCXyMjc2ltZF90eXBlKG1tcjEsIG1tcjIsIG1tcncpIAorCisvLyBzb21lIG1hY3JvcyBmb3IgbW92bnRxIGluc3RydWN0aW9uCisvLyAgICAgIFZfTU9WTlRRKG1tcjEsIG1tcjIpIAorI2RlZmluZSBWX01PVk5UUV9NTVgobW1yMSwgbW1yMikgICAgICAibW92cSAgICJtbXIyIiwgIm1tcjEiXG5cdCIKKyNkZWZpbmUgVl9NT1ZOVFFfM0ROT1cobW1yMSwgbW1yMikgICAgIm1vdnEgICAibW1yMiIsICJtbXIxIlxuXHQiCisjZGVmaW5lIFZfTU9WTlRRX01NWEVYVChtbXIxLCBtbXIyKSAgICAgICJtb3ZudHEgIm1tcjIiLCAibW1yMSJcblx0IgorI2RlZmluZSBWX01PVk5UUShtbXIxLCBtbXIyKSAgICAgICAgICBWX01PVk5UUTIobW1yMSwgbW1yMiwgU0lNRF9UWVBFKSAKKyNkZWZpbmUgVl9NT1ZOVFEyKG1tcjEsIG1tcjIsIHNpbWRfdHlwZSkgVl9NT1ZOVFEzKG1tcjEsIG1tcjIsIHNpbWRfdHlwZSkgCisjZGVmaW5lIFZfTU9WTlRRMyhtbXIxLCBtbXIyLCBzaW1kX3R5cGUpIFZfTU9WTlRRXyMjc2ltZF90eXBlKG1tcjEsIG1tcjIpCisKKy8vIGVuZCBvZiBtYWNyb3MKKworI2lmZGVmIElTX1NTRTIKKworI2RlZmluZSBNRVJHRTRQSVhhdmcoUEFERFIxLCBQQUREUjIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdmRxdSAgIlBBRERSMSIsICAgJSV4bW0wXG5cdCIgICAgICAgLyogb3VyIDQgcGl4ZWxzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ZHF1ICAiUEFERFIyIiwgICAlJXhtbTFcblx0IiAgICAgICAvKiBvdXIgcGl4ZWwyIHZhbHVlICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZkcWEgICUleG1tMCwgICAgICUleG1tMlxuXHQiICAgICAgIC8qIGFub3RoZXIgY29weSBvZiBvdXIgcGl4ZWwxIHZhbHVlICovICAgICAgICBcCisgICAgIm1vdmRxYSAgJSV4bW0xLCAgICAgJSV4bW0zXG5cdCIgICAgICAgLyogYW5vdGhlciBjb3B5IG9mIG91ciBwaXhlbDEgdmFsdWUgKi8gICAgICAgIFwKKyAgICAicHN1YnVzYiAlJXhtbTEsICAgICAlJXhtbTJcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3VidXNiICUleG1tMCwgICAgICUleG1tM1xuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvciAgICAgJSV4bW0zLCAgICAgJSV4bW0yXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGF2Z2IgICAlJXhtbTEsICAgICAlJXhtbTBcblx0IiAgICAgICAvKiBhdmcgb2YgMiBwaXhlbHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZkcWEgICUleG1tMiwgICAgICUleG1tM1xuXHQiICAgICAgIC8qIGFub3RoZXIgY29weSBvZiBvdXIgb3VyIHdlaWdodHMgKi8gICAgICAgICBcCisgICAgInB4b3IgICAgJSV4bW0xLCAgICAgJSV4bW0xXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHN1YnVzYiAlJXhtbTcsICAgICAlJXhtbTNcblx0IiAgICAgICAvKiBub256ZXJvIHdoZXJlIG9sZCB3ZWlnaHRzIGxvd2VyLCBlbHNlIDAgKi8gXAorICAgICJwY21wZXFiICUleG1tMSwgICAgICUleG1tM1xuXHQiICAgICAgIC8qIG5vdyBmZiB3aGVyZSBuZXcgYmV0dGVyLCBlbHNlIDAwICovICAgICAgICBcCisgICAgInBjbXBlcWIgJSV4bW0zLCAgICAgJSV4bW0xXG5cdCIgICAgICAgLyogaGVyZSBmZiB3aGVyZSBvbGQgYmV0dGVyLCBlbHNlIDAwICovICAgICAgIFwKKyAgICAicGFuZCAgICAlJXhtbTMsICAgICAlJXhtbTBcblx0IiAgICAgICAvKiBrZWVwIG9ubHkgYmV0dGVyIG5ldyBwaXhlbHMgKi8gICAgICAgICAgICAgXAorICAgICJwYW5kICAgICUleG1tMywgICAgICUleG1tMlxuXHQiICAgICAgIC8qIGFuZCB3ZWlnaHRzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBhbmQgICAgJSV4bW0xLCAgICAgJSV4bW01XG5cdCIgICAgICAgLyoga2VlcCBvbmx5IGJldHRlciBvbGQgcGl4ZWxzICovICAgICAgICAgICAgIFwKKyAgICAicGFuZCAgICAlJXhtbTEsICAgICAlJXhtbTdcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3IgICAgICUleG1tMCwgICAgICUleG1tNVxuXHQiICAgICAgIC8qIGFuZCBtZXJnZSBuZXcgJiBvbGQgdmFscyAqLyAgICAgICAgICAgICAgICBcCisgICAgInBvciAgICAgJSV4bW0yLCAgICAgJSV4bW03XG5cdCIKKworI2RlZmluZSBNRVJHRTRQSVhhdmdIKFBBRERSMUEsIFBBRERSMUIsIFBBRERSMkEsIFBBRERSMkIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdmRxdSAgIlBBRERSMUEiLCAgICUleG1tMFxuXHQiICAgICAgLyogb3VyIDQgcGl4ZWxzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ZHF1ICAiUEFERFIyQSIsICAgJSV4bW0xXG5cdCIgICAgICAvKiBvdXIgcGl4ZWwyIHZhbHVlICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZkcXUgICJQQUREUjFCIiwgICAlJXhtbTJcblx0IiAgICAgIC8qIG91ciA0IHBpeGVscyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdmRxdSAgIlBBRERSMkIiLCAgICUleG1tM1xuXHQiICAgICAgLyogb3VyIHBpeGVsMiB2YWx1ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGF2Z2IgICAlJXhtbTIsICAgICAgJSV4bW0wXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYXZnYiAgICUleG1tMywgICAgICAlJXhtbTFcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdmRxYSAgJSV4bW0wLCAgICAgICUleG1tMlxuXHQiICAgICAgLyogYW5vdGhlciBjb3B5IG9mIG91ciBwaXhlbDEgdmFsdWUgKi8gICAgICAgIFwKKyAgICAibW92ZHFhICAlJXhtbTEsICAgICAgJSV4bW0zXG5cdCIgICAgICAvKiBhbm90aGVyIGNvcHkgb2Ygb3VyIHBpeGVsMSB2YWx1ZSAqLyAgICAgICAgXAorICAgICJwc3VidXNiICUleG1tMSwgICAgICAlJXhtbTJcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBzdWJ1c2IgJSV4bW0wLCAgICAgICUleG1tM1xuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9yICAgICAlJXhtbTMsICAgICAgJSV4bW0yXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYXZnYiAgICUleG1tMSwgICAgICAlJXhtbTBcblx0IiAgICAgIC8qIGF2ZyBvZiAyIHBpeGVscyAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdmRxYSAgJSV4bW0yLCAgICAgICUleG1tM1xuXHQiICAgICAgLyogYW5vdGhlciBjb3B5IG9mIG91ciBvdXIgd2VpZ2h0cyAqLyAgICAgICAgIFwKKyAgICAicHhvciAgICAlJXhtbTEsICAgICAgJSV4bW0xXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3VidXNiICUleG1tNywgICAgICAlJXhtbTNcblx0IiAgICAgIC8qIG5vbnplcm8gd2hlcmUgb2xkIHdlaWdodHMgbG93ZXIsIGVsc2UgMCAqLyBcCisgICAgInBjbXBlcWIgJSV4bW0xLCAgICAgICUleG1tM1xuXHQiICAgICAgLyogbm93IGZmIHdoZXJlIG5ldyBiZXR0ZXIsIGVsc2UgMDAgKi8gICAgICAgIFwKKyAgICAicGNtcGVxYiAlJXhtbTMsICAgICAgJSV4bW0xXG5cdCIgICAgICAvKiBoZXJlIGZmIHdoZXJlIG9sZCBiZXR0ZXIsIGVsc2UgMDAgKi8gICAgICAgXAorICAgICJwYW5kICAgICUleG1tMywgICAgICAlJXhtbTBcblx0IiAgICAgIC8qIGtlZXAgb25seSBiZXR0ZXIgbmV3IHBpeGVscyAqLyAgICAgICAgICAgICBcCisgICAgInBhbmQgICAgJSV4bW0zLCAgICAgICUleG1tMlxuXHQiICAgICAgLyogYW5kIHdlaWdodHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFuZCAgICAlJXhtbTEsICAgICAgJSV4bW01XG5cdCIgICAgICAvKiBrZWVwIG9ubHkgYmV0dGVyIG9sZCBwaXhlbHMgKi8gICAgICAgICAgICAgXAorICAgICJwYW5kICAgICUleG1tMSwgICAgICAlJXhtbTdcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvciAgICAgJSV4bW0wLCAgICAgICUleG1tNVxuXHQiICAgICAgLyogYW5kIG1lcmdlIG5ldyAmIG9sZCB2YWxzICovICAgICAgICAgICAgICAgIFwKKyAgICAicG9yICAgICAlJXhtbTIsICAgICAgJSV4bW03XG5cdCIKKworI2RlZmluZSBSRVNFVF9DSFJPTUEgInBvciAiX1VWTWFzayIsICUleG1tN1xuXHQiCisKKyNlbHNlIC8vIGlmZGVmIElTX1NTRTIKKworI2RlZmluZSBNRVJHRTRQSVhhdmcoUEFERFIxLCBQQUREUjIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAiUEFERFIxIiwgICAlJW1tMFxuXHQiICAgICAgIC8qIG91ciA0IHBpeGVscyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgIlBBRERSMiIsICAgJSVtbTFcblx0IiAgICAgICAvKiBvdXIgcGl4ZWwyIHZhbHVlICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICUlbW0wLCAgICAgICUlbW0yXG5cdCIgICAgICAgLyogYW5vdGhlciBjb3B5IG9mIG91ciBwaXhlbDEgdmFsdWUgKi8gICAgICAgIFwKKyAgICAibW92cSAgICAlJW1tMSwgICAgICAlJW1tM1xuXHQiICAgICAgIC8qIGFub3RoZXIgY29weSBvZiBvdXIgcGl4ZWwxIHZhbHVlICovICAgICAgICBcCisgICAgInBzdWJ1c2IgJSVtbTEsICAgICAgJSVtbTJcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3VidXNiICUlbW0wLCAgICAgICUlbW0zXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9yICAgICAlJW1tMywgICAgICAlJW1tMlxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVl9QQVZHQiAoIiUlbW0wIiwgIiUlbW0xIiwgIiUlbW0zIiwgX1NoaWZ0TWFzaykgLyogYXZnIG9mIDIgcGl4ZWxzICovICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICUlbW0yLCAgICAgICUlbW0zXG5cdCIgICAgICAgLyogYW5vdGhlciBjb3B5IG9mIG91ciBvdXIgd2VpZ2h0cyAqLyAgICAgICAgIFwKKyAgICAicHhvciAgICAlJW1tMSwgICAgICAlJW1tMVxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBzdWJ1c2IgJSVtbTcsICAgICAgJSVtbTNcblx0IiAgICAgICAvKiBub256ZXJvIHdoZXJlIG9sZCB3ZWlnaHRzIGxvd2VyLCBlbHNlIDAgKi8gXAorICAgICJwY21wZXFiICUlbW0xLCAgICAgICUlbW0zXG5cdCIgICAgICAgLyogbm93IGZmIHdoZXJlIG5ldyBiZXR0ZXIsIGVsc2UgMDAgKi8gICAgICAgIFwKKyAgICAicGNtcGVxYiAlJW1tMywgICAgICAlJW1tMVxuXHQiICAgICAgIC8qIGhlcmUgZmYgd2hlcmUgb2xkIGJldHRlciwgZWxzZSAwMCAqLyAgICAgICBcCisgICAgInBhbmQgICAgJSVtbTMsICAgICAgJSVtbTBcblx0IiAgICAgICAvKiBrZWVwIG9ubHkgYmV0dGVyIG5ldyBwaXhlbHMgKi8gICAgICAgICAgICAgXAorICAgICJwYW5kICAgICUlbW0zLCAgICAgICUlbW0yXG5cdCIgICAgICAgLyogYW5kIHdlaWdodHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicGFuZCAgICAlJW1tMSwgICAgICAlJW1tNVxuXHQiICAgICAgIC8qIGtlZXAgb25seSBiZXR0ZXIgb2xkIHBpeGVscyAqLyAgICAgICAgICAgICBcCisgICAgInBhbmQgICAgJSVtbTEsICAgICAgJSVtbTdcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3IgICAgICUlbW0wLCAgICAgICUlbW01XG5cdCIgICAgICAgLyogYW5kIG1lcmdlIG5ldyAmIG9sZCB2YWxzICovICAgICAgICAgICAgICAgIFwKKyAgICAicG9yICAgICAlJW1tMiwgICAgICAlJW1tN1xuXHQiCisKKyNkZWZpbmUgTUVSR0U0UElYYXZnSChQQUREUjFBLCBQQUREUjFCLCBQQUREUjJBLCBQQUREUjJCKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgIlBBRERSMUEiLCAgICUlbW0wXG5cdCIgICAgICAvKiBvdXIgNCBwaXhlbHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtb3ZxICAgICJQQUREUjJBIiwgICAlJW1tMVxuXHQiICAgICAgLyogb3VyIHBpeGVsMiB2YWx1ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92cSAgICAiUEFERFIxQiIsICAgJSVtbTJcblx0IiAgICAgIC8qIG91ciA0IHBpeGVscyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgIlBBRERSMkIiLCAgICUlbW0zXG5cdCIgICAgICAvKiBvdXIgcGl4ZWwyIHZhbHVlICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZfUEFWR0IoIiUlbW0wIiwgIiUlbW0yIiwgIiUlbW0yIiwgX1NoaWZ0TWFzaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWX1BBVkdCKCIlJW1tMSIsICIlJW1tMyIsICIlJW1tMyIsIF9TaGlmdE1hc2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgJSVtbTAsICAgICAgICUlbW0yXG5cdCIgICAgICAvKiBhbm90aGVyIGNvcHkgb2Ygb3VyIHBpeGVsMSB2YWx1ZSAqLyAgICAgICAgXAorICAgICJtb3ZxICAgICUlbW0xLCAgICAgICAlJW1tM1xuXHQiICAgICAgLyogYW5vdGhlciBjb3B5IG9mIG91ciBwaXhlbDEgdmFsdWUgKi8gICAgICAgIFwKKyAgICAicHN1YnVzYiAlJW1tMSwgICAgICAgJSVtbTJcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBzdWJ1c2IgJSVtbTAsICAgICAgICUlbW0zXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3IgICAgICUlbW0zLCAgICAgICAlJW1tMlxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWX1BBVkdCKCIlJW1tMCIsICIlJW1tMSIsICIlJW1tMyIsIF9TaGlmdE1hc2spICAgLyogYXZnIG9mIDIgcGl4ZWxzICovICAgICAgICAgICAgICBcCisgICAgIm1vdnEgICAgJSVtbTIsICAgICAgICUlbW0zXG5cdCIgICAgICAvKiBhbm90aGVyIGNvcHkgb2Ygb3VyIG91ciB3ZWlnaHRzICovICAgICAgICAgXAorICAgICJweG9yICAgICUlbW0xLCAgICAgICAlJW1tMVxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHN1YnVzYiAlJW1tNywgICAgICAgJSVtbTNcblx0IiAgICAgIC8qIG5vbnplcm8gd2hlcmUgb2xkIHdlaWdodHMgbG93ZXIsIGVsc2UgMCAqLyBcCisgICAgInBjbXBlcWIgJSVtbTEsICAgICAgICUlbW0zXG5cdCIgICAgICAvKiBub3cgZmYgd2hlcmUgbmV3IGJldHRlciwgZWxzZSAwMCAqLyAgICAgICAgXAorICAgICJwY21wZXFiICUlbW0zLCAgICAgICAlJW1tMVxuXHQiICAgICAgLyogaGVyZSBmZiB3aGVyZSBvbGQgYmV0dGVyLCBlbHNlIDAwICovICAgICAgIFwKKyAgICAicGFuZCAgICAlJW1tMywgICAgICAgJSVtbTBcblx0IiAgICAgIC8qIGtlZXAgb25seSBiZXR0ZXIgbmV3IHBpeGVscyAqLyAgICAgICAgICAgICBcCisgICAgInBhbmQgICAgJSVtbTMsICAgICAgICUlbW0yXG5cdCIgICAgICAvKiBhbmQgd2VpZ2h0cyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYW5kICAgICUlbW0xLCAgICAgICAlJW1tNVxuXHQiICAgICAgLyoga2VlcCBvbmx5IGJldHRlciBvbGQgcGl4ZWxzICovICAgICAgICAgICAgIFwKKyAgICAicGFuZCAgICAlJW1tMSwgICAgICAgJSVtbTdcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvciAgICAgJSVtbTAsICAgICAgICUlbW01XG5cdCIgICAgICAvKiBhbmQgbWVyZ2UgbmV3ICYgb2xkIHZhbHMgKi8gICAgICAgICAgICAgICAgXAorICAgICJwb3IgICAgICUlbW0yLCAgICAgICAlJW1tN1xuXHQiCisKKyNkZWZpbmUgUkVTRVRfQ0hST01BICJwb3IgIl9VVk1hc2siLCAlJW1tN1xuXHQiCisKKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS90dnRpbWUvdmZpci5jIGIvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS92ZmlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA2MTg5NQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvdmZpci5jCkBAIC0wLDAgKzEsMzE0IEBACisvKgorICoKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA0IEJpbGx5IEJpZ2dzIDx2ZWt0b3JAZHVtYnRlcm0ubmV0PgorICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzIEZhYnJpY2UgQmVsbGFyZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgZnJvbSBmZm1wZWcsIHNlZSBodHRwOi8vZmZtcGVnLm9yZy8gKExHUEwpCisgKiBhbmQgbW9kaWZpY2F0aW9ucyBieSBCaWxseSBCaWdncy4KKyAqCisgKiBSZWxpY2Vuc2VkIGZvciBHU3RyZWFtZXIgZnJvbSBHUEwgdG8gTEdQTCB3aXRoIHBlcm1pdCBmcm9tIEJpbGx5IEJpZ2dzLgorICogU2VlOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM1NzgKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX09SQworI2luY2x1ZGUgPG9yYy9vcmMuaD4KKyNlbmRpZgorI2luY2x1ZGUgInR2dGltZS5oIgorCisjZGVmaW5lIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9WRklSCShnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3ZmaXJfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9JU19ERUlOVEVSTEFDRV9NRVRIT0RfVkZJUihvYmopCQkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfVkZJUikpCisjZGVmaW5lIEdTVF9JU19ERUlOVEVSTEFDRV9NRVRIT0RfVkZJUl9DTEFTUyhrbGFzcykJKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfVkZJUikpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfVkZJUl9HRVRfQ0xBU1Mob2JqKQkoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9WRklSLCBHc3REZWludGVybGFjZU1ldGhvZFZGSVJDbGFzcykpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfVkZJUihvYmopCQkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfVkZJUiwgR3N0RGVpbnRlcmxhY2VNZXRob2RWRklSKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9WRklSX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9WRklSLCBHc3REZWludGVybGFjZU1ldGhvZFZGSVJDbGFzcykpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfVkZJUl9DQVNUKG9iaikJKChHc3REZWludGVybGFjZU1ldGhvZFZGSVIqKShvYmopKQorCitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3ZmaXJfZ2V0X3R5cGUgKHZvaWQpOworCit0eXBlZGVmIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kIEdzdERlaW50ZXJsYWNlTWV0aG9kVkZJUjsKKwordHlwZWRlZiBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzIEdzdERlaW50ZXJsYWNlTWV0aG9kVkZJUkNsYXNzOworCisvKgorICogVGhlIE1QRUcyIHNwZWMgdXNlcyBhIHNsaWdodGx5IGhhcnNoZXIgZmlsdGVyLCB0aGV5IHNwZWNpZnkKKyAqIFstMSA4IDIgOCAtMV0uICBmZm1wZWcgdXNlcyBhIHNpbWlsYXIgZmlsdGVyIGJ1dCB3aXRoIG1vcmUgb2YKKyAqIGEgdGVuZGFuY3kgdG8gYmx1ciB0aGFuIHRvIHVzZSB0aGUgbG9jYWwgaW5mb3JtYXRpb24uICBUaGUKKyAqIGZpbHRlciB0YXBzIGhlcmUgYXJlOiBbLTEgNCAyIDQgLTFdLgorICovCisKKyAvKgorICAqIEMgaW1wbGVtZW50YXRpb24uCisgICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2RlaW50ZXJsYWNlX2MgKGd1aW50OCAqIGRzdCwgY29uc3QgZ3VpbnQ4ICogbHVtX200LCBjb25zdCBndWludDggKiBsdW1fbTMsCisgICAgY29uc3QgZ3VpbnQ4ICogbHVtX20yLCBjb25zdCBndWludDggKiBsdW1fbTEsIGNvbnN0IGd1aW50OCAqIGx1bSwgZ2ludCBzaXplKQoreworICBpZiAobHVtX20yID09IE5VTEwpIHsKKyAgICBkZWludGVybGFjZV9saW5lX2xpbmVhciAoZHN0LCBsdW1fbTEsIGx1bV9tMywgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgZGVpbnRlcmxhY2VfbGluZV92ZmlyIChkc3QsIGx1bV9tNCwgbHVtX20zLCBsdW1fbTIsIGx1bV9tMSwgbHVtLCBzaXplKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfYyAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBkc3QsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGNvbnN0IGd1aW50OCAqbHVtX200ID0gc2NhbmxpbmVzLT50dDE7CisgIGNvbnN0IGd1aW50OCAqbHVtX20zID0gc2NhbmxpbmVzLT50MDsKKyAgY29uc3QgZ3VpbnQ4ICpsdW1fbTIgPSBzY2FubGluZXMtPm0xOworICBjb25zdCBndWludDggKmx1bV9tMSA9IHNjYW5saW5lcy0+YjA7CisgIGNvbnN0IGd1aW50OCAqbHVtID0gc2NhbmxpbmVzLT5iYjE7CisKKyAgZGVpbnRlcmxhY2VfYyAoZHN0LCBsdW1fbTQsIGx1bV9tMywgbHVtX20yLCBsdW1fbTEsIGx1bSwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9saW5lX3BsYW5hcl95X2MgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwgZ3VpbnQ4ICogZHN0LAorICAgIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBjb25zdCBndWludDggKmx1bV9tNCA9IHNjYW5saW5lcy0+dHQxOworICBjb25zdCBndWludDggKmx1bV9tMyA9IHNjYW5saW5lcy0+dDA7CisgIGNvbnN0IGd1aW50OCAqbHVtX20yID0gc2NhbmxpbmVzLT5tMTsKKyAgY29uc3QgZ3VpbnQ4ICpsdW1fbTEgPSBzY2FubGluZXMtPmIwOworICBjb25zdCBndWludDggKmx1bSA9IHNjYW5saW5lcy0+YmIxOworCisgIGRlaW50ZXJsYWNlX2MgKGRzdCwgbHVtX200LCBsdW1fbTMsIGx1bV9tMiwgbHVtX20xLCBsdW0sIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2VfbGluZV9wbGFuYXJfdV9jIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsIGd1aW50OCAqIGRzdCwKKyAgICBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgY29uc3QgZ3VpbnQ4ICpsdW1fbTQgPSBzY2FubGluZXMtPnR0MTsKKyAgY29uc3QgZ3VpbnQ4ICpsdW1fbTMgPSBzY2FubGluZXMtPnQwOworICBjb25zdCBndWludDggKmx1bV9tMiA9IHNjYW5saW5lcy0+bTE7CisgIGNvbnN0IGd1aW50OCAqbHVtX20xID0gc2NhbmxpbmVzLT5iMDsKKyAgY29uc3QgZ3VpbnQ4ICpsdW0gPSBzY2FubGluZXMtPmJiMTsKKworICBkZWludGVybGFjZV9jIChkc3QsIGx1bV9tNCwgbHVtX20zLCBsdW1fbTIsIGx1bV9tMSwgbHVtLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX2xpbmVfcGxhbmFyX3ZfYyAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBkc3QsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGNvbnN0IGd1aW50OCAqbHVtX200ID0gc2NhbmxpbmVzLT50dDE7CisgIGNvbnN0IGd1aW50OCAqbHVtX20zID0gc2NhbmxpbmVzLT50MDsKKyAgY29uc3QgZ3VpbnQ4ICpsdW1fbTIgPSBzY2FubGluZXMtPm0xOworICBjb25zdCBndWludDggKmx1bV9tMSA9IHNjYW5saW5lcy0+YjA7CisgIGNvbnN0IGd1aW50OCAqbHVtID0gc2NhbmxpbmVzLT5iYjE7CisKKyAgZGVpbnRlcmxhY2VfYyAoZHN0LCBsdW1fbTQsIGx1bV9tMywgbHVtX20yLCBsdW1fbTEsIGx1bSwgc2l6ZSk7Cit9CisKKyN1bmRlZiBCVUlMRF9YODZfQVNNCisKKyNpZmRlZiBCVUlMRF9YODZfQVNNCisjaW5jbHVkZSAibW14LmgiCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2VfbW14IChndWludDggKiBkc3QsIGNvbnN0IGd1aW50OCAqIGx1bV9tNCwgY29uc3QgZ3VpbnQ4ICogbHVtX20zLAorICAgIGNvbnN0IGd1aW50OCAqIGx1bV9tMiwgY29uc3QgZ3VpbnQ4ICogbHVtX20xLCBjb25zdCBndWludDggKiBsdW0sIGdpbnQgc2l6ZSkKK3sKKyAgbW14X3Qgcm91bmRlcjsKKworICByb3VuZGVyLnV3WzBdID0gNDsKKyAgcm91bmRlci51d1sxXSA9IDQ7CisgIHJvdW5kZXIudXdbMl0gPSA0OworICByb3VuZGVyLnV3WzNdID0gNDsKKyAgcHhvcl9yMnIgKG1tNywgbW03KTsKKyAgbW92cV9tMnIgKHJvdW5kZXIsIG1tNik7CisKKyAgZm9yICg7IHNpemUgPiAzOyBzaXplIC09IDQpIHsKKyAgICBtb3ZkX20yciAoKmx1bV9tNCwgbW0wKTsKKyAgICBtb3ZkX20yciAoKmx1bV9tMywgbW0xKTsKKyAgICBtb3ZkX20yciAoKmx1bV9tMiwgbW0yKTsKKyAgICBtb3ZkX20yciAoKmx1bV9tMSwgbW0zKTsKKyAgICBtb3ZkX20yciAoKmx1bSwgbW00KTsKKyAgICBwdW5wY2tsYndfcjJyIChtbTcsIG1tMCk7CisgICAgcHVucGNrbGJ3X3IyciAobW03LCBtbTEpOworICAgIHB1bnBja2xid19yMnIgKG1tNywgbW0yKTsKKyAgICBwdW5wY2tsYndfcjJyIChtbTcsIG1tMyk7CisgICAgcHVucGNrbGJ3X3IyciAobW03LCBtbTQpOworICAgIHBhZGR3X3IyciAobW0zLCBtbTEpOworICAgIHBzbGx3X2kyciAoMSwgbW0yKTsKKyAgICBwYWRkd19yMnIgKG1tNCwgbW0wKTsKKyAgICBwc2xsd19pMnIgKDIsIG1tMSk7ICAgICAgICAgLy8gMgorICAgIHBhZGR3X3IyciAobW02LCBtbTIpOworICAgIHBhZGR3X3IyciAobW0yLCBtbTEpOworICAgIHBzdWJ1c3dfcjJyIChtbTAsIG1tMSk7CisgICAgcHNybHdfaTJyICgzLCBtbTEpOyAgICAgICAgIC8vIDMKKyAgICBwYWNrdXN3Yl9yMnIgKG1tNywgbW0xKTsKKyAgICBtb3ZkX3IybSAobW0xLCAqZHN0KTsKKyAgICBsdW1fbTQgKz0gNDsKKyAgICBsdW1fbTMgKz0gNDsKKyAgICBsdW1fbTIgKz0gNDsKKyAgICBsdW1fbTEgKz0gNDsKKyAgICBsdW0gKz0gNDsKKyAgICBkc3QgKz0gNDsKKyAgfQorICBlbW1zICgpOworCisgIC8qIEhhbmRsZSBvZGQgd2lkdGhzICovCisgIGlmIChzaXplID4gMCkKKyAgICBkZWludGVybGFjZV9jIChkc3QsIGx1bV9tNCwgbHVtX20zLCBsdW1fbTIsIGx1bV9tMSwgbHVtLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX2xpbmVfcGFja2VkX21teCAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBkc3QsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMpCit7CisgIGNvbnN0IGd1aW50OCAqbHVtX200ID0gc2NhbmxpbmVzLT50dDE7CisgIGNvbnN0IGd1aW50OCAqbHVtX20zID0gc2NhbmxpbmVzLT50MDsKKyAgY29uc3QgZ3VpbnQ4ICpsdW1fbTIgPSBzY2FubGluZXMtPm0xOworICBjb25zdCBndWludDggKmx1bV9tMSA9IHNjYW5saW5lcy0+YjA7CisgIGNvbnN0IGd1aW50OCAqbHVtID0gc2NhbmxpbmVzLT5iYjE7CisgIGdpbnQgc2l6ZSA9IHNlbGYtPnBhcmVudC5yb3dfc3RyaWRlWzBdOworCisgIGRlaW50ZXJsYWNlX21teCAoZHN0LCBsdW1fbTQsIGx1bV9tMywgbHVtX20yLCBsdW1fbTEsIGx1bSwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9saW5lX3BsYW5hcl95X21teCAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBkc3QsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMpCit7CisgIGNvbnN0IGd1aW50OCAqbHVtX200ID0gc2NhbmxpbmVzLT50dDE7CisgIGNvbnN0IGd1aW50OCAqbHVtX20zID0gc2NhbmxpbmVzLT50MDsKKyAgY29uc3QgZ3VpbnQ4ICpsdW1fbTIgPSBzY2FubGluZXMtPm0xOworICBjb25zdCBndWludDggKmx1bV9tMSA9IHNjYW5saW5lcy0+YjA7CisgIGNvbnN0IGd1aW50OCAqbHVtID0gc2NhbmxpbmVzLT5iYjE7CisgIGdpbnQgc2l6ZSA9IHNlbGYtPnBhcmVudC5yb3dfc3RyaWRlWzBdOworCisgIGRlaW50ZXJsYWNlX21teCAoZHN0LCBsdW1fbTQsIGx1bV9tMywgbHVtX20yLCBsdW1fbTEsIGx1bSwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9saW5lX3BsYW5hcl91X21teCAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBkc3QsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMpCit7CisgIGNvbnN0IGd1aW50OCAqbHVtX200ID0gc2NhbmxpbmVzLT50dDE7CisgIGNvbnN0IGd1aW50OCAqbHVtX20zID0gc2NhbmxpbmVzLT50MDsKKyAgY29uc3QgZ3VpbnQ4ICpsdW1fbTIgPSBzY2FubGluZXMtPm0xOworICBjb25zdCBndWludDggKmx1bV9tMSA9IHNjYW5saW5lcy0+YjA7CisgIGNvbnN0IGd1aW50OCAqbHVtID0gc2NhbmxpbmVzLT5iYjE7CisgIGdpbnQgc2l6ZSA9IHNlbGYtPnBhcmVudC5yb3dfc3RyaWRlWzFdOworCisgIGRlaW50ZXJsYWNlX21teCAoZHN0LCBsdW1fbTQsIGx1bV9tMywgbHVtX20yLCBsdW1fbTEsIGx1bSwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9saW5lX3BsYW5hcl92X21teCAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBkc3QsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMpCit7CisgIGNvbnN0IGd1aW50OCAqbHVtX200ID0gc2NhbmxpbmVzLT50dDE7CisgIGNvbnN0IGd1aW50OCAqbHVtX20zID0gc2NhbmxpbmVzLT50MDsKKyAgY29uc3QgZ3VpbnQ4ICpsdW1fbTIgPSBzY2FubGluZXMtPm0xOworICBjb25zdCBndWludDggKmx1bV9tMSA9IHNjYW5saW5lcy0+YjA7CisgIGNvbnN0IGd1aW50OCAqbHVtID0gc2NhbmxpbmVzLT5iYjE7CisgIGdpbnQgc2l6ZSA9IHNlbGYtPnBhcmVudC5yb3dfc3RyaWRlWzJdOworCisgIGRlaW50ZXJsYWNlX21teCAoZHN0LCBsdW1fbTQsIGx1bV9tMywgbHVtX20yLCBsdW1fbTEsIGx1bSwgc2l6ZSk7Cit9CisjZW5kaWYKKworR19ERUZJTkVfVFlQRSAoR3N0RGVpbnRlcmxhY2VNZXRob2RWRklSLCBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3ZmaXIsCisgICAgR1NUX1RZUEVfREVJTlRFUkxBQ0VfU0lNUExFX01FVEhPRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3ZmaXJfY2xhc3NfaW5pdCAoR3N0RGVpbnRlcmxhY2VNZXRob2RWRklSQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqZGltX2NsYXNzID0gKEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKikga2xhc3M7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgKmRpc21fY2xhc3MgPQorICAgICAgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgKikga2xhc3M7CisjaWZkZWYgQlVJTERfWDg2X0FTTQorICBndWludCBjcHVfZmxhZ3MgPQorICAgICAgb3JjX3RhcmdldF9nZXRfZGVmYXVsdF9mbGFncyAob3JjX3RhcmdldF9nZXRfYnlfbmFtZSAoIm1teCIpKTsKKyNlbmRpZgorCisgIGRpbV9jbGFzcy0+ZmllbGRzX3JlcXVpcmVkID0gMjsKKyAgZGltX2NsYXNzLT5uYW1lID0gIkJsdXIgVmVydGljYWwiOworICBkaW1fY2xhc3MtPm5pY2sgPSAidmZpciI7CisgIGRpbV9jbGFzcy0+bGF0ZW5jeSA9IDE7CisKKyNpZmRlZiBCVUlMRF9YODZfQVNNCisgIGlmIChjcHVfZmxhZ3MgJiBPUkNfVEFSR0VUX01NWF9NTVgpIHsKKyAgICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9heXV2ID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfbW14OworICAgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3l1eTIgPSBkZWludGVybGFjZV9saW5lX3BhY2tlZF9tbXg7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXZ5dSA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX21teDsKKyAgICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV91eXZ5ID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfbW14OworICAgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MTIgPSBkZWludGVybGFjZV9saW5lX3BhY2tlZF9tbXg7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYyMSA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX21teDsKKyAgICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9hcmdiID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfbW14OworICAgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2FiZ3IgPSBkZWludGVybGFjZV9saW5lX3BhY2tlZF9tbXg7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiYSA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX21teDsKKyAgICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3JhID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfbW14OworICAgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3JnYiA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX21teDsKKyAgICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3IgPSBkZWludGVybGFjZV9saW5lX3BhY2tlZF9tbXg7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3kgPSBkZWludGVybGFjZV9saW5lX3BsYW5hcl95X21teDsKKyAgICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdSA9IGRlaW50ZXJsYWNlX2xpbmVfcGxhbmFyX3VfbW14OworICAgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl92ID0gZGVpbnRlcmxhY2VfbGluZV9wbGFuYXJfdl9tbXg7CisgIH0gZWxzZSB7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXV5MiA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXZ5dSA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfdXl2eSA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYXl1diA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYxMiA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYyMSA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYXJnYiA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYWJnciA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiYSA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyYSA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgICAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfYzsKKyAgICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3IgPSBkZWludGVybGFjZV9saW5lX3BhY2tlZF9jOworICAgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl95ID0gZGVpbnRlcmxhY2VfbGluZV9wbGFuYXJfeV9jOworICAgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl91ID0gZGVpbnRlcmxhY2VfbGluZV9wbGFuYXJfdV9jOworICAgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl92ID0gZGVpbnRlcmxhY2VfbGluZV9wbGFuYXJfdl9jOworICB9CisjZWxzZQorICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9heXV2ID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXV5MiA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3l2eXUgPSBkZWludGVybGFjZV9saW5lX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV91eXZ5ID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYxMiA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MjEgPSBkZWludGVybGFjZV9saW5lX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9hcmdiID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYWJnciA9IGRlaW50ZXJsYWNlX2xpbmVfcGFja2VkX2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3JnYmEgPSBkZWludGVybGFjZV9saW5lX3BhY2tlZF9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3JhID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyID0gZGVpbnRlcmxhY2VfbGluZV9wYWNrZWRfYzsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3kgPSBkZWludGVybGFjZV9saW5lX3BsYW5hcl95X2M7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl91ID0gZGVpbnRlcmxhY2VfbGluZV9wbGFuYXJfdV9jOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdiA9IGRlaW50ZXJsYWNlX2xpbmVfcGxhbmFyX3ZfYzsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF92ZmlyX2luaXQgKEdzdERlaW50ZXJsYWNlTWV0aG9kVkZJUiAqIHNlbGYpCit7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlLmMgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA0Yzg4OQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmUuYwpAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIFdlYXZlIGZyYW1lcworICogQ29weXJpZ2h0IChDKSAyMDAyIEJpbGx5IEJpZ2dzIDx2ZWt0b3JAZHVtYnRlcm0ubmV0Pi4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBSZWxpY2Vuc2VkIGZvciBHU3RyZWFtZXIgZnJvbSBHUEwgdG8gTEdQTCB3aXRoIHBlcm1pdCBmcm9tIEJpbGx5IEJpZ2dzLgorICogU2VlOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM1NzgKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkUJKGdzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9JU19ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkUob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRV9DTEFTUyhrbGFzcykJKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkUpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX0dFVF9DTEFTUyhvYmopCShHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFLCBHc3REZWludGVybGFjZU1ldGhvZFdlYXZlQ2xhc3MpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFKG9iaikJCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRSwgR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZSkpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkVfQ0xBU1Moa2xhc3MpCShHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFLCBHc3REZWludGVybGFjZU1ldGhvZFdlYXZlQ2xhc3MpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX0NBU1Qob2JqKQkoKEdzdERlaW50ZXJsYWNlTWV0aG9kV2VhdmUqKShvYmopKQorCitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX2dldF90eXBlICh2b2lkKTsKKwordHlwZWRlZiBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCBHc3REZWludGVybGFjZU1ldGhvZFdlYXZlOwordHlwZWRlZiBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzIEdzdERlaW50ZXJsYWNlTWV0aG9kV2VhdmVDbGFzczsKKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZCAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGlmIChzY2FubGluZXMtPm0xID09IE5VTEwpIHsKKyAgICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT50MCwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTEsIHNpemUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wbGFuYXJfeSAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGlmIChzY2FubGluZXMtPm0xID09IE5VTEwpIHsKKyAgICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT50MCwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTEsIHNpemUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wbGFuYXJfdSAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGlmIChzY2FubGluZXMtPm0xID09IE5VTEwpIHsKKyAgICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT50MCwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTEsIHNpemUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wbGFuYXJfdiAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIGlmIChzY2FubGluZXMtPm0xID09IE5VTEwpIHsKKyAgICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT50MCwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTEsIHNpemUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5X3NjYW5saW5lX3BhY2tlZCAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBvdXQsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0wLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2NvcHlfc2NhbmxpbmVfcGxhbmFyX3kgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwgZ3VpbnQ4ICogb3V0LAorICAgIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5X3NjYW5saW5lX3BsYW5hcl91IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsIGd1aW50OCAqIG91dCwKKyAgICBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTAsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorY29weV9zY2FubGluZV9wbGFuYXJfdiAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBvdXQsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0wLCBzaXplKTsKK30KKworR19ERUZJTkVfVFlQRSAoR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZSwgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF93ZWF2ZSwKKyAgICBHU1RfVFlQRV9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EKTsKKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfY2xhc3NfaW5pdCAoR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZUNsYXNzICoga2xhc3MpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKmRpbV9jbGFzcyA9IChHc3REZWludGVybGFjZU1ldGhvZENsYXNzICopIGtsYXNzOworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzICpkaXNtX2NsYXNzID0KKyAgICAgIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzICopIGtsYXNzOworCisgIGRpbV9jbGFzcy0+ZmllbGRzX3JlcXVpcmVkID0gMjsKKyAgZGltX2NsYXNzLT5uYW1lID0gIldlYXZlIjsKKyAgZGltX2NsYXNzLT5uaWNrID0gIndlYXZlIjsKKyAgZGltX2NsYXNzLT5sYXRlbmN5ID0gMTsKKworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9heXV2ID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV95dXkyID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV95dnl1ID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV91eXZ5ID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9udjEyID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9udjIxID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9hcmdiID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9hYmdyID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9yZ2JhID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3JhID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9yZ2IgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2JnciA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3kgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGxhbmFyX3k7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl91ID0KKyAgICAgIGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BsYW5hcl91OworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdiA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wbGFuYXJfdjsKKworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2F5dXYgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV95dXkyID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfeXZ5dSA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3V5dnkgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9udjEyID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfbnYyMSA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2FyZ2IgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9hYmdyID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfcmdiYSA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2JncmEgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9yZ2IgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9iZ3IgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9wbGFuYXJfeSA9IGNvcHlfc2NhbmxpbmVfcGxhbmFyX3k7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3UgPSBjb3B5X3NjYW5saW5lX3BsYW5hcl91OworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3BsYW5hcl92ID0gY29weV9zY2FubGluZV9wbGFuYXJfdjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfaW5pdCAoR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZSAqIHNlbGYpCit7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlYmZmLmMgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZlYmZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyNGU5NgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmViZmYuYwpAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIFdlYXZlIGZyYW1lcywgYm90dG9tLWZpZWxkLWZpcnN0LgorICogQ29weXJpZ2h0IChDKSAyMDAzIEJpbGx5IEJpZ2dzIDx2ZWt0b3JAZHVtYnRlcm0ubmV0Pi4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBSZWxpY2Vuc2VkIGZvciBHU3RyZWFtZXIgZnJvbSBHUEwgdG8gTEdQTCB3aXRoIHBlcm1pdCBmcm9tIEJpbGx5IEJpZ2dzLgorICogU2VlOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM1NzgKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0ZGVpbnRlcmxhY2VtZXRob2QuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkVfQkZGCShnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX2JmZl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRV9CRkYob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX0JGRikpCisjZGVmaW5lIEdTVF9JU19ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkVfQkZGX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRV9CRkYpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX0JGRl9HRVRfQ0xBU1Mob2JqKQkoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRV9CRkYsIEdzdERlaW50ZXJsYWNlTWV0aG9kV2VhdmVCRkZDbGFzcykpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkVfQkZGKG9iaikJCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRV9CRkYsIEdzdERlaW50ZXJsYWNlTWV0aG9kV2VhdmVCRkYpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX0JGRl9DTEFTUyhrbGFzcykJKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkVfQkZGLCBHc3REZWludGVybGFjZU1ldGhvZFdlYXZlQkZGQ2xhc3MpKQorI2RlZmluZSBHU1RfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX0JGRl9DQVNUKG9iaikJKChHc3REZWludGVybGFjZU1ldGhvZFdlYXZlQkZGKikob2JqKSkKKworR1R5cGUgZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF93ZWF2ZV9iZmZfZ2V0X3R5cGUgKHZvaWQpOworCit0eXBlZGVmIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kIEdzdERlaW50ZXJsYWNlTWV0aG9kV2VhdmVCRkY7Cit0eXBlZGVmIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZUJGRkNsYXNzOworCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgaWYgKHNjYW5saW5lcy0+bTEgPT0gTlVMTCkgeworICAgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPmIwLCBzaXplKTsKKyAgfSBlbHNlIHsKKyAgICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMSwgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BsYW5hcl95IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgaWYgKHNjYW5saW5lcy0+bTEgPT0gTlVMTCkgeworICAgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPmIwLCBzaXplKTsKKyAgfSBlbHNlIHsKKyAgICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMSwgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BsYW5hcl91IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgaWYgKHNjYW5saW5lcy0+bTEgPT0gTlVMTCkgeworICAgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPmIwLCBzaXplKTsKKyAgfSBlbHNlIHsKKyAgICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMSwgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2RlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BsYW5hcl92IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgaWYgKHNjYW5saW5lcy0+bTEgPT0gTlVMTCkgeworICAgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPmIwLCBzaXplKTsKKyAgfSBlbHNlIHsKKyAgICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMSwgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NvcHlfc2NhbmxpbmVfcGFja2VkIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsIGd1aW50OCAqIG91dCwKKyAgICBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTAsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorY29weV9zY2FubGluZV9wbGFuYXJfeSAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLCBndWludDggKiBvdXQsCisgICAgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0wLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2NvcHlfc2NhbmxpbmVfcGxhbmFyX3UgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwgZ3VpbnQ4ICogb3V0LAorICAgIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5X3NjYW5saW5lX3BsYW5hcl92IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsIGd1aW50OCAqIG91dCwKKyAgICBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTAsIHNpemUpOworfQorCitHX0RFRklORV9UWVBFIChHc3REZWludGVybGFjZU1ldGhvZFdlYXZlQkZGLCBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX2JmZiwKKyAgICBHU1RfVFlQRV9ERUlOVEVSTEFDRV9TSU1QTEVfTUVUSE9EKTsKKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfYmZmX2NsYXNzX2luaXQgKEdzdERlaW50ZXJsYWNlTWV0aG9kV2VhdmVCRkZDbGFzcyAqCisgICAga2xhc3MpCit7CisgIEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKmRpbV9jbGFzcyA9IChHc3REZWludGVybGFjZU1ldGhvZENsYXNzICopIGtsYXNzOworICBHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzICpkaXNtX2NsYXNzID0KKyAgICAgIChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZENsYXNzICopIGtsYXNzOworCisgIGRpbV9jbGFzcy0+ZmllbGRzX3JlcXVpcmVkID0gMjsKKyAgZGltX2NsYXNzLT5uYW1lID0gIlByb2dyZXNzaXZlOiBCb3R0b20gRmllbGQgRmlyc3QiOworICBkaW1fY2xhc3MtPm5pY2sgPSAid2VhdmViZmYiOworICBkaW1fY2xhc3MtPmxhdGVuY3kgPSAxOworCisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2F5dXYgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3l1eTIgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3l2eXUgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3V5dnkgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MTIgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX252MjEgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2FyZ2IgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2FiZ3IgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3JnYmEgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX2JncmEgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3JnYiA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfeSA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wbGFuYXJfeTsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3UgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGxhbmFyX3U7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl92ID0KKyAgICAgIGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BsYW5hcl92OworCisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfYXl1diA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3l1eTIgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV95dnl1ID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfdXl2eSA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX252MTIgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9udjIxID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfYXJnYiA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2FiZ3IgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9yZ2JhID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfYmdyYSA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3JnYiA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX2JnciA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3BsYW5hcl95ID0gY29weV9zY2FubGluZV9wbGFuYXJfeTsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9wbGFuYXJfdSA9IGNvcHlfc2NhbmxpbmVfcGxhbmFyX3U7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3YgPSBjb3B5X3NjYW5saW5lX3BsYW5hcl92OworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF93ZWF2ZV9iZmZfaW5pdCAoR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZUJGRiAqIHNlbGYpCit7Cit9CmRpZmYgLS1naXQgYS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZldGZmLmMgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3dlYXZldGZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzYmIyZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kZWludGVybGFjZS90dnRpbWUvd2VhdmV0ZmYuYwpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIFdlYXZlIGZyYW1lcywgdG9wLWZpZWxkLWZpcnN0LgorICogQ29weXJpZ2h0IChDKSAyMDAzIEJpbGx5IEJpZ2dzIDx2ZWt0b3JAZHVtYnRlcm0ubmV0Pi4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBSZWxpY2Vuc2VkIGZvciBHU3RyZWFtZXIgZnJvbSBHUEwgdG8gTEdQTCB3aXRoIHBlcm1pdCBmcm9tIEJpbGx5IEJpZ2dzLgorICogU2VlOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM1NzgKKyAqLworCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RkZWludGVybGFjZW1ldGhvZC5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRV9URkYJKGdzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfdGZmX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfSVNfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX1RGRihvYmopCQkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkVfVEZGKSkKKyNkZWZpbmUgR1NUX0lTX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRV9URkZfQ0xBU1Moa2xhc3MpCShHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX1RGRikpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkVfVEZGX0dFVF9DTEFTUyhvYmopCShHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX1RGRiwgR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZVRGRkNsYXNzKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRV9URkYob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfREVJTlRFUkxBQ0VfTUVUSE9EX1dFQVZFX1RGRiwgR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZVRGRikpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkVfVEZGX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX0RFSU5URVJMQUNFX01FVEhPRF9XRUFWRV9URkYsIEdzdERlaW50ZXJsYWNlTWV0aG9kV2VhdmVURkZDbGFzcykpCisjZGVmaW5lIEdTVF9ERUlOVEVSTEFDRV9NRVRIT0RfV0VBVkVfVEZGX0NBU1Qob2JqKQkoKEdzdERlaW50ZXJsYWNlTWV0aG9kV2VhdmVURkYqKShvYmopKQorCitHVHlwZSBnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX3RmZl9nZXRfdHlwZSAodm9pZCk7CisKK3R5cGVkZWYgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZVRGRjsKK3R5cGVkZWYgR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2RDbGFzcyBHc3REZWludGVybGFjZU1ldGhvZFdlYXZlVEZGQ2xhc3M7CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBpZiAoc2NhbmxpbmVzLT5tMSA9PSBOVUxMKSB7CisgICAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+dDAsIHNpemUpOworICB9IGVsc2UgeworICAgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0xLCBzaXplKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGxhbmFyX3kgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBpZiAoc2NhbmxpbmVzLT5tMSA9PSBOVUxMKSB7CisgICAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+dDAsIHNpemUpOworICB9IGVsc2UgeworICAgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0xLCBzaXplKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGxhbmFyX3UgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBpZiAoc2NhbmxpbmVzLT5tMSA9PSBOVUxMKSB7CisgICAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+dDAsIHNpemUpOworICB9IGVsc2UgeworICAgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0xLCBzaXplKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGxhbmFyX3YgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBpZiAoc2NhbmxpbmVzLT5tMSA9PSBOVUxMKSB7CisgICAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+dDAsIHNpemUpOworICB9IGVsc2UgeworICAgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0xLCBzaXplKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorY29weV9zY2FubGluZV9wYWNrZWQgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5X3NjYW5saW5lX3BsYW5hcl95IChHc3REZWludGVybGFjZVNpbXBsZU1ldGhvZCAqIHNlbGYsCisgICAgZ3VpbnQ4ICogb3V0LCBjb25zdCBHc3REZWludGVybGFjZVNjYW5saW5lRGF0YSAqIHNjYW5saW5lcywgZ3VpbnQgc2l6ZSkKK3sKKyAgbWVtY3B5IChvdXQsIHNjYW5saW5lcy0+bTAsIHNpemUpOworfQorCitzdGF0aWMgdm9pZAorY29weV9zY2FubGluZV9wbGFuYXJfdSAoR3N0RGVpbnRlcmxhY2VTaW1wbGVNZXRob2QgKiBzZWxmLAorICAgIGd1aW50OCAqIG91dCwgY29uc3QgR3N0RGVpbnRlcmxhY2VTY2FubGluZURhdGEgKiBzY2FubGluZXMsIGd1aW50IHNpemUpCit7CisgIG1lbWNweSAob3V0LCBzY2FubGluZXMtPm0wLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2NvcHlfc2NhbmxpbmVfcGxhbmFyX3YgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kICogc2VsZiwKKyAgICBndWludDggKiBvdXQsIGNvbnN0IEdzdERlaW50ZXJsYWNlU2NhbmxpbmVEYXRhICogc2NhbmxpbmVzLCBndWludCBzaXplKQoreworICBtZW1jcHkgKG91dCwgc2NhbmxpbmVzLT5tMCwgc2l6ZSk7Cit9CisKK0dfREVGSU5FX1RZUEUgKEdzdERlaW50ZXJsYWNlTWV0aG9kV2VhdmVURkYsIGdzdF9kZWludGVybGFjZV9tZXRob2Rfd2VhdmVfdGZmLAorICAgIEdTVF9UWVBFX0RFSU5URVJMQUNFX1NJTVBMRV9NRVRIT0QpOworCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsYWNlX21ldGhvZF93ZWF2ZV90ZmZfY2xhc3NfaW5pdCAoR3N0RGVpbnRlcmxhY2VNZXRob2RXZWF2ZVRGRkNsYXNzICoKKyAgICBrbGFzcykKK3sKKyAgR3N0RGVpbnRlcmxhY2VNZXRob2RDbGFzcyAqZGltX2NsYXNzID0gKEdzdERlaW50ZXJsYWNlTWV0aG9kQ2xhc3MgKikga2xhc3M7CisgIEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgKmRpc21fY2xhc3MgPQorICAgICAgKEdzdERlaW50ZXJsYWNlU2ltcGxlTWV0aG9kQ2xhc3MgKikga2xhc3M7CisKKyAgZGltX2NsYXNzLT5maWVsZHNfcmVxdWlyZWQgPSAyOworICBkaW1fY2xhc3MtPm5hbWUgPSAiUHJvZ3Jlc3NpdmU6IFRvcCBGaWVsZCBGaXJzdCI7CisgIGRpbV9jbGFzcy0+bmljayA9ICJ3ZWF2ZXRmZiI7CisgIGRpbV9jbGFzcy0+bGF0ZW5jeSA9IDE7CisKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYXl1diA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXV5MiA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfeXZ5dSA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfdXl2eSA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYxMiA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfbnYyMSA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYXJnYiA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYWJnciA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiYSA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfYmdyYSA9IGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcmdiID0gZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9iZ3IgPSBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmludGVycG9sYXRlX3NjYW5saW5lX3BsYW5hcl95ID0KKyAgICAgIGRlaW50ZXJsYWNlX3NjYW5saW5lX3dlYXZlX3BsYW5hcl95OworICBkaXNtX2NsYXNzLT5pbnRlcnBvbGF0ZV9zY2FubGluZV9wbGFuYXJfdSA9CisgICAgICBkZWludGVybGFjZV9zY2FubGluZV93ZWF2ZV9wbGFuYXJfdTsKKyAgZGlzbV9jbGFzcy0+aW50ZXJwb2xhdGVfc2NhbmxpbmVfcGxhbmFyX3YgPQorICAgICAgZGVpbnRlcmxhY2Vfc2NhbmxpbmVfd2VhdmVfcGxhbmFyX3Y7CisKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9heXV2ID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfeXV5MiA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3l2eXUgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV91eXZ5ID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfbnYxMiA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX252MjEgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9hcmdiID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfYWJnciA9IGNvcHlfc2NhbmxpbmVfcGFja2VkOworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3JnYmEgPSBjb3B5X3NjYW5saW5lX3BhY2tlZDsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9iZ3JhID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfcmdiID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfYmdyID0gY29weV9zY2FubGluZV9wYWNrZWQ7CisgIGRpc21fY2xhc3MtPmNvcHlfc2NhbmxpbmVfcGxhbmFyX3kgPSBjb3B5X3NjYW5saW5lX3BsYW5hcl95OworICBkaXNtX2NsYXNzLT5jb3B5X3NjYW5saW5lX3BsYW5hcl91ID0gY29weV9zY2FubGluZV9wbGFuYXJfdTsKKyAgZGlzbV9jbGFzcy0+Y29weV9zY2FubGluZV9wbGFuYXJfdiA9IGNvcHlfc2NhbmxpbmVfcGxhbmFyX3Y7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxhY2VfbWV0aG9kX3dlYXZlX3RmZl9pbml0IChHc3REZWludGVybGFjZU1ldGhvZFdlYXZlVEZGICogc2VsZikKK3sKK30KZGlmZiAtLWdpdCBhL2dzdC9kZWludGVybGFjZS90dnRpbWUveDg2LTY0X21hY3Jvcy5pbmMgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3g4Ni02NF9tYWNyb3MuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMmUzYzcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lL3g4Ni02NF9tYWNyb3MuaW5jCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgRGlyayBaaWVnZWxtZWllciA8ZHppZWdlbEBnbXguZGU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIAorICogU2VlOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM1NzgKKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGNvcGllZCBmcm9tIFRWVElNRSdzIHNvdXJjZXMuCisgKiBPcmlnaW5hbCBhdXRob3I6IEFjaGltIFNjaG5laWRlciA8YmF0Y2hhbGxAbW9yZG9yLmNoPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmbmRlZiBYQVgKKworI2lmIGRlZmluZWQgKEhBVkVfQ1BVX0kzODYpICYmICFkZWZpbmVkKEhBVkVfQ1BVX1g4Nl82NCkKKworI2RlZmluZSBYQVggICAiZWF4IgorI2RlZmluZSBYQlggICAiZWJ4IgorI2RlZmluZSBYQ1ggICAiZWN4IgorI2RlZmluZSBYRFggICAiZWR4IgorI2RlZmluZSBYU0kgICAiZXNpIgorI2RlZmluZSBYREkgICAiZWRpIgorI2RlZmluZSBYU1AgICAiZXNwIgorI2RlZmluZSBNT1ZYICAibW92bCIKKyNkZWZpbmUgTEVBWCAgImxlYWwiCisjZGVmaW5lIERFQ1ggICJkZWNsIgorI2RlZmluZSBQVVNIWCAicHVzaGwiCisjZGVmaW5lIFBPUFggICJwb3BsIgorI2RlZmluZSBDTVBYICAiY21wbCIKKyNkZWZpbmUgQUREWCAgImFkZGwiCisjZGVmaW5lIFNITFggICJzaGxsIgorI2RlZmluZSBTSFJYICAic2hybCIKKyNkZWZpbmUgU1VCWCAgInN1YmwiCisKKyNlbGlmIGRlZmluZWQgKEhBVkVfQ1BVX1g4Nl82NCkKKworI2RlZmluZSBYQVggICAicmF4IgorI2RlZmluZSBYQlggICAicmJ4IgorI2RlZmluZSBYQ1ggICAicmN4IgorI2RlZmluZSBYRFggICAicmR4IgorI2RlZmluZSBYU0kgICAicnNpIgorI2RlZmluZSBYREkgICAicmRpIgorI2RlZmluZSBYU1AgICAicnNwIgorI2RlZmluZSBNT1ZYICAibW92cSIKKyNkZWZpbmUgTEVBWCAgImxlYXEiCisjZGVmaW5lIERFQ1ggICJkZWNxIgorI2RlZmluZSBQVVNIWCAicHVzaHEiCisjZGVmaW5lIFBPUFggICJwb3BxIgorI2RlZmluZSBDTVBYICAiY21wcSIKKyNkZWZpbmUgQUREWCAgImFkZHEiCisjZGVmaW5lIFNITFggICJzaGxxIgorI2RlZmluZSBTSFJYICAic2hycSIKKyNkZWZpbmUgU1VCWCAgInN1YnEiCisKKyNlbHNlCisjZXJyb3IgVW5kZWZpbmVkIGFyY2hpdGVjdHVyZS4gRGVmaW5lIGVpdGhlciBBUkNIX1g4NiBvciBBUkNIX1g4Nl82NC4KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9kdG1mL01ha2VmaWxlLmFtIGIvZ3N0L2R0bWYvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmOGNlOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kdG1mL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTYgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGR0bWYubGEKKworbGliZ3N0ZHRtZl9sYV9TT1VSQ0VTID0gZ3N0ZHRtZnNyYy5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdzdHJ0cGR0bWZzcmMuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICBnc3RydHBkdG1mZGVwYXkuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICBnc3RkdG1mLmMKKworbm9pbnN0X0hFQURFUlMgPSBnc3RkdG1mc3JjLmggXAorICAgICAgICAgICAgICAgICBnc3RydHBkdG1mc3JjLmggXAorICAgICAgICAgICAgICAgICBnc3RydHBkdG1mZGVwYXkuaCBcCisgICAgICAgICAgICAgICAgIGdzdGR0bWZjb21tb24uaAorCitsaWJnc3RkdG1mX2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdGR0bWZfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0cnRwLUBHU1RfQVBJX1ZFUlNJT05AIFwKKwkkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoTElCTSkKK2xpYmdzdGR0bWZfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQpkaWZmIC0tZ2l0IGEvZ3N0L2R0bWYvZ3N0ZHRtZi5jIGIvZ3N0L2R0bWYvZ3N0ZHRtZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYzQwMDEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZHRtZi9nc3RkdG1mLmMKQEAgLTAsMCArMSw0NSBAQAorLyogR1N0cmVhbWVyIERUTUYgcGx1Z2luCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0ZHRtZnNyYy5oIgorI2luY2x1ZGUgImdzdHJ0cGR0bWZzcmMuaCIKKyNpbmNsdWRlICJnc3RydHBkdG1mZGVwYXkuaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBpZiAoIWdzdF9kdG1mX3NyY19wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2R0bWZfc3JjX3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfZHRtZl9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBkdG1mLCAiRFRNRiBwbHVnaW5zIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC9kdG1mL2dzdGR0bWZjb21tb24uaCBiL2dzdC9kdG1mL2dzdGR0bWZjb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmYyNmNjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2R0bWYvZ3N0ZHRtZmNvbW1vbi5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIEdTdHJlYW1lciBEVE1GIHBsdWdpbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0RUTUZfQ09NTU9OX0hfXworI2RlZmluZSBfX0dTVF9SVFBfRFRNRl9DT01NT05fSF9fCisKKyNpbmNsdWRlIDxnc3QvbWF0aC1jb21wYXQuaD4KKworI2RlZmluZSBNSU5fSU5URVJfRElHSVRfSU5URVJWQUwgMTAwICAgICAvKiBtcyAqLworI2RlZmluZSBNSU5fUFVMU0VfRFVSQVRJT04gICAgICAgMjUwICAgICAvKiBtcyAqLworCisjZGVmaW5lIE1JTl9WT0xVTUUgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1BWF9WT0xVTUUgICAgICAgICAgICAgICAzNgorCisjZGVmaW5lIE1JTl9FVkVOVCAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1BWF9FVkVOVCAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBNSU5fRVZFTlRfU1RSSU5HICAgICAgICAgIjAiCisjZGVmaW5lIE1BWF9FVkVOVF9TVFJJTkcgICAgICAgICAiMTUiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGV2ZW50Ojg7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgRFRNRiBldmVudCAqLworI2lmIEdfQllURV9PUkRFUiA9PSBHX0xJVFRMRV9FTkRJQU4KKyAgdW5zaWduZWQgdm9sdW1lOjY7ICAgICAgICAgICAgLyogcG93ZXIgbGV2ZWwgb2YgdGhlIHRvbmUsIGluIGRCbTAgKi8KKyAgdW5zaWduZWQgcjoxOyAgICAgICAgICAgICAgICAgLyogUmVzZXJ2ZWQtYml0ICovCisgIHVuc2lnbmVkIGU6MTsgICAgICAgICAgICAgICAgIC8qIEVuZC1iaXQgKi8KKyNlbGlmIEdfQllURV9PUkRFUiA9PSBHX0JJR19FTkRJQU4KKyAgdW5zaWduZWQgZToxOyAgICAgICAgICAgICAgICAgLyogRW5kLWJpdCAqLworICB1bnNpZ25lZCByOjE7ICAgICAgICAgICAgICAgICAvKiBSZXNlcnZlZC1iaXQgKi8KKyAgdW5zaWduZWQgdm9sdW1lOjY7ICAgICAgICAgICAgLyogcG93ZXIgbGV2ZWwgb2YgdGhlIHRvbmUsIGluIGRCbTAgKi8KKyNlbHNlCisjZXJyb3IgIkdfQllURV9PUkRFUiBzaG91bGQgYmUgYmlnIG9yIGxpdHRsZSBlbmRpYW4uIgorI2VuZGlmCisgIHVuc2lnbmVkIGR1cmF0aW9uOjE2OyAgICAgICAgIC8qIER1cmF0aW9uIG9mIGRpZ2l0LCBpbiB0aW1lc3RhbXAgdW5pdHMgKi8KK30gR3N0UlRQRFRNRlBheWxvYWQ7CisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfRFRNRl9DT01NT05fSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZHRtZi9nc3RkdG1mc3JjLmMgYi9nc3QvZHRtZi9nc3RkdG1mc3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhmMGYwOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kdG1mL2dzdGR0bWZzcmMuYwpAQCAtMCwwICsxLDk5OCBAQAorLyogR1N0cmVhbWVyIERUTUYgc291cmNlCisgKgorICogZ3N0ZHRtZnNyYy5jOgorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IENvbGxhYm9yYS4KKyAqICAgQ29udGFjdDogWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IE5va2lhIENvcnBvcmF0aW9uLgorICogICBDb250YWN0OiBaZWVzaGFuIEFsaSA8emVlc2hhbi5hbGlAbm9raWEuY29tPgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgMjAwMCwyMDA1IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZHRtZnNyYworICogQHNlZV9hbHNvOiBydHBkdG1zcmMsIHJ0cGR0bWZtdXh4CisgKgorICogVGhlIERUTUZTcmMgZWxlbWVudCBnZW5lcmF0ZXMgRFRNRiAoSVRVLVQgUS4yMyBTcGVjaWZpY2F0aW9uKSB0b25lIHBhY2tldHMgb24gcmVxdWVzdAorICogZnJvbSBhcHBsaWNhdGlvbi4gVGhlIGFwcGxpY2F0aW9uIGNvbW11bmljYXRlcyB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYQorICogRFRNRiBldmVudCB1c2luZyBjdXN0b20gdXBzdHJlYW0gZ3N0cmVhbWVyIGV2ZW50cy4gVG8gcmVwb3J0IGEgRFRNRiBldmVudCwgYW4KKyAqIGFwcGxpY2F0aW9uIG11c3Qgc2VuZCBhbiBldmVudCBvZiB0eXBlIEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU0sIGhhdmluZyBhCisgKiBzdHJ1Y3R1cmUgb2YgbmFtZSAiZHRtZi1ldmVudCIgd2l0aCBmaWVsZHMgc2V0IGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nCisgKiB0YWJsZToKKyAqCisgKiA8aW5mb3JtYWx0YWJsZT4KKyAqIDx0Z3JvdXAgY29scz0nNCc+CisgKiA8Y29sc3BlYyBjb2xuYW1lPSdOYW1lJyAvPgorICogPGNvbHNwZWMgY29sbmFtZT0nVHlwZScgLz4KKyAqIDxjb2xzcGVjIGNvbG5hbWU9J1Bvc3NpYmxlIHZhbHVlcycgLz4KKyAqIDxjb2xzcGVjIGNvbG5hbWU9J1B1cnBvc2UnIC8+CisgKiA8dGhlYWQ+CisgKiA8cm93PgorICogPGVudHJ5Pk5hbWU8L2VudHJ5PgorICogPGVudHJ5PkdUeXBlPC9lbnRyeT4KKyAqIDxlbnRyeT5Qb3NzaWJsZSB2YWx1ZXM8L2VudHJ5PgorICogPGVudHJ5PlB1cnBvc2U8L2VudHJ5PgorICogPC9yb3c+CisgKiA8L3RoZWFkPgorICogPHRib2R5PgorICogPHJvdz4KKyAqIDxlbnRyeT50eXBlPC9lbnRyeT4KKyAqIDxlbnRyeT5HX1RZUEVfSU5UPC9lbnRyeT4KKyAqIDxlbnRyeT4wLTE8L2VudHJ5PgorICogPGVudHJ5PlRoZSBhcHBsaWNhdGlvbiB1c2VzIHRoaXMgZmllbGQgdG8gc3BlY2lmeSB3aGljaCBvZiB0aGUgdHdvIG1ldGhvZHMKKyAqIHNwZWNpZmllZCBpbiBSRkMgMjgzMyB0byB1c2UuIFRoZSB2YWx1ZSBzaG91bGQgYmUgMCBmb3IgdG9uZXMgYW5kIDEgZm9yCisgKiBuYW1lZCBldmVudHMuIFRvbmVzIGFyZSBzcGVjaWZpZWQgYnkgdGhlaXIgZnJlcXVlbmNpZXMgYW5kIGV2ZW50cyBhcmUgc3BlY2llZAorICogYnkgdGhlaXIgbnVtYmVyLiBUaGlzIGVsZW1lbnQgY2FuIG9ubHkgdGFrZSBldmVudHMgYXMgaW5wdXQuIERvIG5vdCBjb25mdXNlCisgKiB3aXRoICJtZXRob2QiIHdoaWNoIHNwZWNpZmllZCB0aGUgb3V0cHV0LgorICogPC9lbnRyeT4KKyAqIDwvcm93PgorICogPHJvdz4KKyAqIDxlbnRyeT5udW1iZXI8L2VudHJ5PgorICogPGVudHJ5PkdfVFlQRV9JTlQ8L2VudHJ5PgorICogPGVudHJ5PjAtMTU8L2VudHJ5PgorICogPGVudHJ5PlRoZSBldmVudCBudW1iZXIuPC9lbnRyeT4KKyAqIDwvcm93PgorICogPHJvdz4KKyAqIDxlbnRyeT52b2x1bWU8L2VudHJ5PgorICogPGVudHJ5PkdfVFlQRV9JTlQ8L2VudHJ5PgorICogPGVudHJ5PjAtMzY8L2VudHJ5PgorICogPGVudHJ5PlRoaXMgZmllbGQgZGVzY3JpYmVzIHRoZSBwb3dlciBsZXZlbCBvZiB0aGUgdG9uZSwgZXhwcmVzc2VkIGluIGRCbTAKKyAqIGFmdGVyIGRyb3BwaW5nIHRoZSBzaWduLiBQb3dlciBsZXZlbHMgcmFuZ2UgZnJvbSAwIHRvIC02MyBkQm0wLiBUaGUgcmFuZ2Ugb2YKKyAqIHZhbGlkIERUTUYgaXMgZnJvbSAwIHRvIC0zNiBkQm0wLiBDYW4gYmUgb21pdHRlZCBpZiBzdGFydCBpcyBzZXQgdG8gRkFMU0UuCisgKiA8L2VudHJ5PgorICogPC9yb3c+CisgKiA8cm93PgorICogPGVudHJ5PnN0YXJ0PC9lbnRyeT4KKyAqIDxlbnRyeT5HX1RZUEVfQk9PTEVBTjwvZW50cnk+CisgKiA8ZW50cnk+VHJ1ZSBvciBGYWxzZTwvZW50cnk+CisgKiA8ZW50cnk+V2hldGhlciB0aGUgZXZlbnQgaXMgc3RhcnRpbmcgb3IgZW5kaW5nLjwvZW50cnk+CisgKiA8L3Jvdz4KKyAqIDxyb3c+CisgKiA8ZW50cnk+bWV0aG9kPC9lbnRyeT4KKyAqIDxlbnRyeT5HX1RZUEVfSU5UPC9lbnRyeT4KKyAqIDxlbnRyeT4yPC9lbnRyeT4KKyAqIDxlbnRyeT5UaGUgbWV0aG9kIHVzZWQgZm9yIHNlbmRpbmcgZXZlbnQsIHRoaXMgZWxlbWVudCB3aWxsIHJlYWN0IGlmIHRoaXMKKyAqIGZpZWxkIGlzIGFic2VudCBvciAyLgorICogPC9lbnRyeT4KKyAqIDwvcm93PgorICogPC90Ym9keT4KKyAqIDwvdGdyb3VwPgorICogPC9pbmZvcm1hbHRhYmxlPgorICoKKyAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgaW5mb3JtcyB0aGUgcGlwZWxpbmUgKGFuZCBpbiB0dXJuLCB0aGUKKyAqIERUTUZTcmMgZWxlbWVudCBpbnNpZGUgdGhlIHBpcGVsaW5lKSBhYm91dCB0aGUgc3RhcnQgb2YgYSBEVE1GIG5hbWVkCisgKiBldmVudCAnMScgb2Ygdm9sdW1lIC0yNSBkQm0wOgorICoKKyAqIDxwcm9ncmFtbGlzdGluZz4KKyAqIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiZHRtZi1ldmVudCIsCisgKiAgICAgICAgICAgICAgICAgICAgInR5cGUiLCBHX1RZUEVfSU5ULCAxLAorICogICAgICAgICAgICAgICAgICAgICJudW1iZXIiLCBHX1RZUEVfSU5ULCAxLAorICogICAgICAgICAgICAgICAgICAgICJ2b2x1bWUiLCBHX1RZUEVfSU5ULCAyNSwKKyAqICAgICAgICAgICAgICAgICAgICAic3RhcnQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgKgorICogZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwgc3RydWN0dXJlKTsKKyAqIGdzdF9lbGVtZW50X3NlbmRfZXZlbnQgKHBpcGVsaW5lLCBldmVudCk7CisgKiA8L3Byb2dyYW1saXN0aW5nPgorICoKKyAqIFdoZW4gYSBEVE1GIHRvbmUgYWN0dWFsbHkgc3RhcnRzIG9yIHN0b3AsIGEgImR0bWYtZXZlbnQtcHJvY2Vzc2VkIgorICogZWxlbWVudCAjR3N0TWVzc2FnZSB3aXRoIHRoZSBzYW1lIGZpZWxkcyBhcyB0aGUgImR0bWYtZXZlbnQiCisgKiAjR3N0RXZlbnQgdGhhdCB3YXMgdXNlZCB0byByZXF1ZXN0IHRoZSBldmVudC4gQWxzbywgaWYgYW55IGV2ZW50CisgKiBoYXMgbm90IGJlZW4gcHJvY2Vzc2VkIHdoZW4gdGhlIGVsZW1lbnQgZ29lcyBmcm9tIHRoZSBQQVVTRUQgdG8gdGhlCisgKiBSRUFEWSBzdGF0ZSwgdGhlbiBhICJkdG1mLWV2ZW50LWRyb3BwZWQiIG1lc3NhZ2UgaXMgcG9zdGVkIG9uIHRoZQorICogI0dzdEJ1cyBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUgcmVjZWl2ZWQuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSAiZ3N0ZHRtZmNvbW1vbi5oIgorCisjaW5jbHVkZSAiZ3N0ZHRtZnNyYy5oIgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNkZWZpbmUgR1NUX1RPTkVfRFRNRl9UWVBFX0VWRU5UIDEKKyNkZWZpbmUgREVGQVVMVF9QQUNLRVRfSU5URVJWQUwgIDUwICAgICAvKiBtcyAqLworI2RlZmluZSBNSU5fUEFDS0VUX0lOVEVSVkFMICAgICAgMTAgICAgIC8qIG1zICovCisjZGVmaW5lIE1BWF9QQUNLRVRfSU5URVJWQUwgICAgICA1MCAgICAgLyogbXMgKi8KKyNkZWZpbmUgREVGQVVMVF9TQU1QTEVfUkFURSAgICAgIDgwMDAKKyNkZWZpbmUgU0FNUExFX1NJWkUgICAgICAgICAgICAgIDE2CisjZGVmaW5lIENIQU5ORUxTICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1JTl9EVVRZX0NZQ0xFICAgICAgICAgICAoTUlOX0lOVEVSX0RJR0lUX0lOVEVSVkFMICsgTUlOX1BVTFNFX0RVUkFUSU9OKQorCisKK3R5cGVkZWYgc3RydWN0IHN0X2R0bWZfa2V5Cit7CisgIGNvbnN0IGNoYXIgKmV2ZW50X25hbWU7CisgIGludCBldmVudF9lbmNvZGluZzsKKyAgZmxvYXQgbG93X2ZyZXF1ZW5jeTsKKyAgZmxvYXQgaGlnaF9mcmVxdWVuY3k7Cit9IERUTUZfS0VZOworCitzdGF0aWMgY29uc3QgRFRNRl9LRVkgRFRNRl9LRVlTW10gPSB7CisgIHsiRFRNRl9LRVlfRVZFTlRfMCIsIDAsIDk0MSwgMTMzNn0sCisgIHsiRFRNRl9LRVlfRVZFTlRfMSIsIDEsIDY5NywgMTIwOX0sCisgIHsiRFRNRl9LRVlfRVZFTlRfMiIsIDIsIDY5NywgMTMzNn0sCisgIHsiRFRNRl9LRVlfRVZFTlRfMyIsIDMsIDY5NywgMTQ3N30sCisgIHsiRFRNRl9LRVlfRVZFTlRfNCIsIDQsIDc3MCwgMTIwOX0sCisgIHsiRFRNRl9LRVlfRVZFTlRfNSIsIDUsIDc3MCwgMTMzNn0sCisgIHsiRFRNRl9LRVlfRVZFTlRfNiIsIDYsIDc3MCwgMTQ3N30sCisgIHsiRFRNRl9LRVlfRVZFTlRfNyIsIDcsIDg1MiwgMTIwOX0sCisgIHsiRFRNRl9LRVlfRVZFTlRfOCIsIDgsIDg1MiwgMTMzNn0sCisgIHsiRFRNRl9LRVlfRVZFTlRfOSIsIDksIDg1MiwgMTQ3N30sCisgIHsiRFRNRl9LRVlfRVZFTlRfUyIsIDEwLCA5NDEsIDEyMDl9LAorICB7IkRUTUZfS0VZX0VWRU5UX1AiLCAxMSwgOTQxLCAxNDc3fSwKKyAgeyJEVE1GX0tFWV9FVkVOVF9BIiwgMTIsIDY5NywgMTYzM30sCisgIHsiRFRNRl9LRVlfRVZFTlRfQiIsIDEzLCA3NzAsIDE2MzN9LAorICB7IkRUTUZfS0VZX0VWRU5UX0MiLCAxNCwgODUyLCAxNjMzfSwKKyAgeyJEVE1GX0tFWV9FVkVOVF9EIiwgMTUsIDk0MSwgMTYzM30sCit9OworCisjZGVmaW5lIE1BWF9EVE1GX0VWRU5UUyAxNgorCitlbnVtCit7CisgIERUTUZfS0VZX0VWRU5UXzEgPSAxLAorICBEVE1GX0tFWV9FVkVOVF8yID0gMiwKKyAgRFRNRl9LRVlfRVZFTlRfMyA9IDMsCisgIERUTUZfS0VZX0VWRU5UXzQgPSA0LAorICBEVE1GX0tFWV9FVkVOVF81ID0gNSwKKyAgRFRNRl9LRVlfRVZFTlRfNiA9IDYsCisgIERUTUZfS0VZX0VWRU5UXzcgPSA3LAorICBEVE1GX0tFWV9FVkVOVF84ID0gOCwKKyAgRFRNRl9LRVlfRVZFTlRfOSA9IDksCisgIERUTUZfS0VZX0VWRU5UXzAgPSAwLAorICBEVE1GX0tFWV9FVkVOVF9TVEFSID0gMTAsCisgIERUTUZfS0VZX0VWRU5UX1BPVU5EID0gMTEsCisgIERUTUZfS0VZX0VWRU5UX0EgPSAxMiwKKyAgRFRNRl9LRVlfRVZFTlRfQiA9IDEzLAorICBEVE1GX0tFWV9FVkVOVF9DID0gMTQsCisgIERUTUZfS0VZX0VWRU5UX0QgPSAxNSwKK307CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9kdG1mX3NyY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfZHRtZl9zcmNfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfSU5URVJWQUwsCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X2R0bWZfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgXCIiIEdTVF9BVURJT19ORSAoUzE2KSAiXCIsICIKKyAgICAgICAgInJhdGUgPSAiIEdTVF9BVURJT19SQVRFX1JBTkdFICIsICIgImNoYW5uZWxzID0gKGludCkgMSIpCisgICAgKTsKKworI2RlZmluZSBwYXJlbnRfY2xhc3MgZ3N0X2R0bWZfc3JjX3BhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0RFRNRlNyYywgZ3N0X2R0bWZfc3JjLCBHU1RfVFlQRV9CQVNFX1NSQyk7CisKK3N0YXRpYyB2b2lkIGdzdF9kdG1mX3NyY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9kdG1mX3NyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfZHRtZl9zcmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIGdib29sZWFuIGdzdF9kdG1mX3NyY19oYW5kbGVfZXZlbnQgKEdzdEJhc2VTcmMgKiBzcmMsIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9kdG1mX3NyY19zZW5kX2V2ZW50IChHc3RFbGVtZW50ICogc3JjLCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfZHRtZl9zcmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9kdG1mX3NyY19jcmVhdGUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjLAorICAgIGd1aW50NjQgb2Zmc2V0LCBndWludCBsZW5ndGgsIEdzdEJ1ZmZlciAqKiBidWZmZXIpOworc3RhdGljIHZvaWQgZ3N0X2R0bWZfc3JjX2FkZF9zdGFydF9ldmVudCAoR3N0RFRNRlNyYyAqIGR0bWZzcmMsCisgICAgZ2ludCBldmVudF9udW1iZXIsIGdpbnQgZXZlbnRfdm9sdW1lKTsKK3N0YXRpYyB2b2lkIGdzdF9kdG1mX3NyY19hZGRfc3RvcF9ldmVudCAoR3N0RFRNRlNyYyAqIGR0bWZzcmMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2R0bWZfc3JjX3VubG9jayAoR3N0QmFzZVNyYyAqIHNyYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZHRtZl9zcmNfdW5sb2NrX3N0b3AgKEdzdEJhc2VTcmMgKiBzcmMpOworc3RhdGljIGdib29sZWFuIGdzdF9kdG1mX3NyY19uZWdvdGlhdGUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZHRtZl9zcmNfcXVlcnkgKEdzdEJhc2VTcmMgKiBiYXNlc3JjLCBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworCitzdGF0aWMgdm9pZAorZ3N0X2R0bWZfc3JjX2NsYXNzX2luaXQgKEdzdERUTUZTcmNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEJhc2VTcmNDbGFzcyAqZ3N0YmFzZXNyY19jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBnc3RiYXNlc3JjX2NsYXNzID0gR1NUX0JBU0VfU1JDX0NMQVNTIChrbGFzcyk7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworCisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9kdG1mX3NyY19kZWJ1ZywgImR0bWZzcmMiLCAwLCAiZHRtZnNyYyBlbGVtZW50Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X2R0bWZfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIkRUTUYgdG9uZSBnZW5lcmF0b3IiLCAiU291cmNlL0F1ZGlvIiwgIkdlbmVyYXRlcyBEVE1GIHRvbmVzIiwKKyAgICAgICJZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPiIpOworCisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfZHRtZl9zcmNfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9kdG1mX3NyY19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9kdG1mX3NyY19nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9JTlRFUlZBTCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiaW50ZXJ2YWwiLCAiSW50ZXJ2YWwgYmV0d2VlbiB0b25lIHBhY2tldHMiLAorICAgICAgICAgICJJbnRlcnZhbCBpbiBtcyBiZXR3ZWVuIHR3byB0b25lIHBhY2tldHMiLCBNSU5fUEFDS0VUX0lOVEVSVkFMLAorICAgICAgICAgIE1BWF9QQUNLRVRfSU5URVJWQUwsIERFRkFVTFRfUEFDS0VUX0lOVEVSVkFMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2R0bWZfc3JjX2NoYW5nZV9zdGF0ZSk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPnNlbmRfZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2R0bWZfc3JjX3NlbmRfZXZlbnQpOworICBnc3RiYXNlc3JjX2NsYXNzLT51bmxvY2sgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2R0bWZfc3JjX3VubG9jayk7CisgIGdzdGJhc2VzcmNfY2xhc3MtPnVubG9ja19zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kdG1mX3NyY191bmxvY2tfc3RvcCk7CisKKyAgZ3N0YmFzZXNyY19jbGFzcy0+ZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2R0bWZfc3JjX2hhbmRsZV9ldmVudCk7CisgIGdzdGJhc2VzcmNfY2xhc3MtPmNyZWF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZHRtZl9zcmNfY3JlYXRlKTsKKyAgZ3N0YmFzZXNyY19jbGFzcy0+bmVnb3RpYXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kdG1mX3NyY19uZWdvdGlhdGUpOworICBnc3RiYXNlc3JjX2NsYXNzLT5xdWVyeSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZHRtZl9zcmNfcXVlcnkpOworfQorCitzdGF0aWMgdm9pZAorZXZlbnRfZnJlZSAoR3N0RFRNRlNyY0V2ZW50ICogZXZlbnQpCit7CisgIGlmIChldmVudCkKKyAgICBnX3NsaWNlX2ZyZWUgKEdzdERUTUZTcmNFdmVudCwgZXZlbnQpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2R0bWZfc3JjX2luaXQgKEdzdERUTUZTcmMgKiBkdG1mc3JjKQoreworICAvKiB3ZSBvcGVyYXRlIGluIHRpbWUgKi8KKyAgZ3N0X2Jhc2Vfc3JjX3NldF9mb3JtYXQgKEdTVF9CQVNFX1NSQyAoZHRtZnNyYyksIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9iYXNlX3NyY19zZXRfbGl2ZSAoR1NUX0JBU0VfU1JDIChkdG1mc3JjKSwgVFJVRSk7CisKKyAgZHRtZnNyYy0+aW50ZXJ2YWwgPSBERUZBVUxUX1BBQ0tFVF9JTlRFUlZBTDsKKworICBkdG1mc3JjLT5ldmVudF9xdWV1ZSA9IGdfYXN5bmNfcXVldWVfbmV3X2Z1bGwgKChHRGVzdHJveU5vdGlmeSkgZXZlbnRfZnJlZSk7CisgIGR0bWZzcmMtPmxhc3RfZXZlbnQgPSBOVUxMOworCisgIGR0bWZzcmMtPnNhbXBsZV9yYXRlID0gREVGQVVMVF9TQU1QTEVfUkFURTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkdG1mc3JjLCAiaW5pdCBkb25lIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHRtZl9zcmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdERUTUZTcmMgKmR0bWZzcmM7CisKKyAgZHRtZnNyYyA9IEdTVF9EVE1GX1NSQyAob2JqZWN0KTsKKworICBpZiAoZHRtZnNyYy0+ZXZlbnRfcXVldWUpIHsKKyAgICBnX2FzeW5jX3F1ZXVlX3VucmVmIChkdG1mc3JjLT5ldmVudF9xdWV1ZSk7CisgICAgZHRtZnNyYy0+ZXZlbnRfcXVldWUgPSBOVUxMOworICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF9kdG1mX3NyY19wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHRtZl9zcmNfaGFuZGxlX2R0bWZfZXZlbnQgKEdzdERUTUZTcmMgKiBkdG1mc3JjLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBjb25zdCBHc3RTdHJ1Y3R1cmUgKmV2ZW50X3N0cnVjdHVyZTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3JldDsKKyAgR3N0U3RhdGUgc3RhdGU7CisgIGdpbnQgZXZlbnRfdHlwZTsKKyAgZ2Jvb2xlYW4gc3RhcnQ7CisgIGdpbnQgbWV0aG9kOworICBHc3RDbG9ja1RpbWUgbGFzdF9zdG9wOworICBnaW50IGV2ZW50X251bWJlcjsKKyAgZ2ludCBldmVudF92b2x1bWU7CisgIGdib29sZWFuIGNvcnJlY3Rfb3JkZXI7CisKKyAgc3JldCA9IGdzdF9lbGVtZW50X2dldF9zdGF0ZSAoR1NUX0VMRU1FTlQgKGR0bWZzcmMpLCAmc3RhdGUsIE5VTEwsIDApOworICBpZiAoc3JldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MgfHwgc3RhdGUgIT0gR1NUX1NUQVRFX1BMQVlJTkcpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdG1mc3JjLCAiZHRtZi1ldmVudCwgYnV0IG5vdCBpbiBQTEFZSU5HIHN0YXRlIik7CisgICAgZ290byBmYWlsdXJlOworICB9CisKKyAgZXZlbnRfc3RydWN0dXJlID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoZXZlbnRfc3RydWN0dXJlLCAidHlwZSIsICZldmVudF90eXBlKSB8fAorICAgICAgIWdzdF9zdHJ1Y3R1cmVfZ2V0X2Jvb2xlYW4gKGV2ZW50X3N0cnVjdHVyZSwgInN0YXJ0IiwgJnN0YXJ0KSB8fAorICAgICAgKHN0YXJ0ID09IFRSVUUgJiYgZXZlbnRfdHlwZSAhPSBHU1RfVE9ORV9EVE1GX1RZUEVfRVZFTlQpKQorICAgIGdvdG8gZmFpbHVyZTsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChldmVudF9zdHJ1Y3R1cmUsICJtZXRob2QiLCAmbWV0aG9kKSkgeworICAgIGlmIChtZXRob2QgIT0gMikgeworICAgICAgZ290byBmYWlsdXJlOworICAgIH0KKyAgfQorCisgIGlmIChzdGFydCkKKyAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoZXZlbnRfc3RydWN0dXJlLCAibnVtYmVyIiwgJmV2ZW50X251bWJlcikgfHwKKyAgICAgICAgIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoZXZlbnRfc3RydWN0dXJlLCAidm9sdW1lIiwgJmV2ZW50X3ZvbHVtZSkpCisgICAgICBnb3RvIGZhaWx1cmU7CisKKworICBHU1RfT0JKRUNUX0xPQ0sgKGR0bWZzcmMpOworICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfY2xvY2tfdGltZSAoZXZlbnRfc3RydWN0dXJlLCAibGFzdC1zdG9wIiwgJmxhc3Rfc3RvcCkpCisgICAgZHRtZnNyYy0+bGFzdF9zdG9wID0gbGFzdF9zdG9wOworICBlbHNlCisgICAgZHRtZnNyYy0+bGFzdF9zdG9wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgY29ycmVjdF9vcmRlciA9IChzdGFydCAhPSBkdG1mc3JjLT5sYXN0X2V2ZW50X3dhc19zdGFydCk7CisgIGR0bWZzcmMtPmxhc3RfZXZlbnRfd2FzX3N0YXJ0ID0gc3RhcnQ7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKworICBpZiAoIWNvcnJlY3Rfb3JkZXIpCisgICAgZ290byBmYWlsdXJlOworCisgIGlmIChzdGFydCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJSZWNlaXZlZCBzdGFydCBldmVudCAlZCB3aXRoIHZvbHVtZSAlZCIsCisgICAgICAgIGV2ZW50X251bWJlciwgZXZlbnRfdm9sdW1lKTsKKyAgICBnc3RfZHRtZl9zcmNfYWRkX3N0YXJ0X2V2ZW50IChkdG1mc3JjLCBldmVudF9udW1iZXIsIGV2ZW50X3ZvbHVtZSk7CisgIH0KKworICBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdG1mc3JjLCAiUmVjZWl2ZWQgc3RvcCBldmVudCIpOworICAgIGdzdF9kdG1mX3NyY19hZGRfc3RvcF9ldmVudCAoZHRtZnNyYyk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK2ZhaWx1cmU6CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHRtZl9zcmNfaGFuZGxlX2V2ZW50IChHc3RCYXNlU3JjICogc3JjLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3REVE1GU3JjICpkdG1mc3JjOworICBnYm9vbGVhbiByZXN1bHQgPSBGQUxTRTsKKworICBkdG1mc3JjID0gR1NUX0RUTUZfU1JDIChzcmMpOworCisgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAiUmVjZWl2ZWQgYW4gJXMgZXZlbnQgb24gdGhlIHNyYyBwYWQiLAorICAgICAgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU06CisgICAgICBpZiAoZ3N0X2V2ZW50X2hhc19uYW1lIChldmVudCwgImR0bWYtZXZlbnQiKSkgeworICAgICAgICByZXN1bHQgPSBnc3RfZHRtZl9zcmNfaGFuZGxlX2R0bWZfZXZlbnQgKGR0bWZzcmMsIGV2ZW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgcmVzdWx0ID0gR1NUX0JBU0VfU1JDX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5ldmVudCAoc3JjLCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfZHRtZl9zcmNfc2VuZF9ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdERUTUZTcmMgKmR0bWZzcmMgPSBHU1RfRFRNRl9TUkMgKGVsZW1lbnQpOworICBnYm9vbGVhbiByZXQ7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGR0bWZzcmMsICJSZWNlaXZlZCBhbiAlcyBldmVudCB2aWEgc2VuZF9ldmVudCIsCisgICAgICBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NVU1RPTV9CT1RIOgorICAgIGNhc2UgR1NUX0VWRU5UX0NVU1RPTV9CT1RIX09PQjoKKyAgICBjYXNlIEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU06CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU06CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU1fT09COgorICAgICAgaWYgKGdzdF9ldmVudF9oYXNfbmFtZSAoZXZlbnQsICJkdG1mLWV2ZW50IikpIHsKKyAgICAgICAgcmV0ID0gZ3N0X2R0bWZfc3JjX2hhbmRsZV9kdG1mX2V2ZW50IChkdG1mc3JjLCBldmVudCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zZW5kX2V2ZW50IChlbGVtZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHRtZl9zcmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdERUTUZTcmMgKmR0bWZzcmM7CisKKyAgZHRtZnNyYyA9IEdTVF9EVE1GX1NSQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfSU5URVJWQUw6CisgICAgICBkdG1mc3JjLT5pbnRlcnZhbCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9kdG1mX3NyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0RFRNRlNyYyAqZHRtZnNyYzsKKworICBkdG1mc3JjID0gR1NUX0RUTUZfU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9JTlRFUlZBTDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBkdG1mc3JjLT5pbnRlcnZhbCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHRtZl9wcmVwYXJlX3RpbWVzdGFtcHMgKEdzdERUTUZTcmMgKiBkdG1mc3JjKQoreworICBHc3RDbG9ja1RpbWUgbGFzdF9zdG9wOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZHRtZnNyYyk7CisgIGxhc3Rfc3RvcCA9IGR0bWZzcmMtPmxhc3Rfc3RvcDsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGR0bWZzcmMpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAobGFzdF9zdG9wKSkgeworICAgIHRpbWVzdGFtcCA9IGxhc3Rfc3RvcDsKKyAgfSBlbHNlIHsKKyAgICBHc3RDbG9jayAqY2xvY2s7CisKKyAgICAvKiBJZiB0aGVyZSBpcyBubyB2YWxpZCBzdGFydCB0aW1lLCBsZXRzIHVzZSBub3cgYXMgdGhlIHN0YXJ0IHRpbWUgKi8KKworICAgIGNsb2NrID0gZ3N0X2VsZW1lbnRfZ2V0X2Nsb2NrIChHU1RfRUxFTUVOVCAoZHRtZnNyYykpOworICAgIGlmIChjbG9jayAhPSBOVUxMKSB7CisgICAgICB0aW1lc3RhbXAgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKGNsb2NrKQorICAgICAgICAgIC0gZ3N0X2VsZW1lbnRfZ2V0X2Jhc2VfdGltZSAoR1NUX0VMRU1FTlQgKGR0bWZzcmMpKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGNsb2NrKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2NoYXIgKmR0bWZfbmFtZSA9IGdzdF9lbGVtZW50X2dldF9uYW1lIChkdG1mc3JjKTsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGR0bWZzcmMsICJObyBjbG9jayBzZXQgZm9yIGVsZW1lbnQgJXMiLCBkdG1mX25hbWUpOworICAgICAgZHRtZnNyYy0+dGltZXN0YW1wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgIGdfZnJlZSAoZHRtZl9uYW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvKiBNYWtlIHN1cmUgdGhlIHRpbWVzdGFtcCBhbHdheXMgZ29lcyBmb3J3YXJkICovCisgIGlmICh0aW1lc3RhbXAgPiBkdG1mc3JjLT50aW1lc3RhbXApCisgICAgZHRtZnNyYy0+dGltZXN0YW1wID0gdGltZXN0YW1wOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2R0bWZfc3JjX2FkZF9zdGFydF9ldmVudCAoR3N0RFRNRlNyYyAqIGR0bWZzcmMsIGdpbnQgZXZlbnRfbnVtYmVyLAorICAgIGdpbnQgZXZlbnRfdm9sdW1lKQoreworCisgIEdzdERUTUZTcmNFdmVudCAqZXZlbnQgPSBnX3NsaWNlX25ldzAgKEdzdERUTUZTcmNFdmVudCk7CisgIGV2ZW50LT5ldmVudF90eXBlID0gRFRNRl9FVkVOVF9UWVBFX1NUQVJUOworICBldmVudC0+c2FtcGxlID0gMDsKKyAgZXZlbnQtPmV2ZW50X251bWJlciA9IENMQU1QIChldmVudF9udW1iZXIsIE1JTl9FVkVOVCwgTUFYX0VWRU5UKTsKKyAgZXZlbnQtPnZvbHVtZSA9IENMQU1QIChldmVudF92b2x1bWUsIE1JTl9WT0xVTUUsIE1BWF9WT0xVTUUpOworCisgIGdfYXN5bmNfcXVldWVfcHVzaCAoZHRtZnNyYy0+ZXZlbnRfcXVldWUsIGV2ZW50KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kdG1mX3NyY19hZGRfc3RvcF9ldmVudCAoR3N0RFRNRlNyYyAqIGR0bWZzcmMpCit7CisKKyAgR3N0RFRNRlNyY0V2ZW50ICpldmVudCA9IGdfc2xpY2VfbmV3MCAoR3N0RFRNRlNyY0V2ZW50KTsKKyAgZXZlbnQtPmV2ZW50X3R5cGUgPSBEVE1GX0VWRU5UX1RZUEVfU1RPUDsKKyAgZXZlbnQtPnNhbXBsZSA9IDA7CisgIGV2ZW50LT5ldmVudF9udW1iZXIgPSAwOworICBldmVudC0+dm9sdW1lID0gMDsKKworICBnX2FzeW5jX3F1ZXVlX3B1c2ggKGR0bWZzcmMtPmV2ZW50X3F1ZXVlLCBldmVudCk7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X2R0bWZfc3JjX2dlbmVyYXRlX3NpbGVuY2UgKGZsb2F0IGR1cmF0aW9uLCBnaW50IHNhbXBsZV9yYXRlKQoreworICBnaW50IGJ1Zl9zaXplOworCisgIC8qIENyZWF0ZSBhIGJ1ZmZlciB3aXRoIGRhdGEgc2V0IHRvIDAgKi8KKyAgYnVmX3NpemUgPSAoKGR1cmF0aW9uIC8gMTAwMCkgKiBzYW1wbGVfcmF0ZSAqIFNBTVBMRV9TSVpFICogQ0hBTk5FTFMpIC8gODsKKworICByZXR1cm4gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ19tYWxsb2MwIChidWZfc2l6ZSksIGJ1Zl9zaXplKTsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfZHRtZl9zcmNfZ2VuZXJhdGVfdG9uZSAoR3N0RFRNRlNyY0V2ZW50ICogZXZlbnQsIERUTUZfS0VZIGtleSwKKyAgICBmbG9hdCBkdXJhdGlvbiwgZ2ludCBzYW1wbGVfcmF0ZSkKK3sKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdzdE1hcEluZm8gbWFwOworICBnaW50MTYgKnA7CisgIGdpbnQgdG9uZV9zaXplOworICBkb3VibGUgaSA9IDA7CisgIGRvdWJsZSBhbXBsaXR1ZGUsIGYxLCBmMjsKKyAgZG91YmxlIHZvbHVtZV9mYWN0b3I7CisgIHN0YXRpYyBHc3RBbGxvY2F0aW9uUGFyYW1zIHBhcmFtcyA9IHsgMCwgMSwgMCwgMCwgfTsKKworICAvKiBDcmVhdGUgYSBidWZmZXIgZm9yIHRoZSB0b25lICovCisgIHRvbmVfc2l6ZSA9ICgoZHVyYXRpb24gLyAxMDAwKSAqIHNhbXBsZV9yYXRlICogU0FNUExFX1NJWkUgKiBDSEFOTkVMUykgLyA4OworCisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCB0b25lX3NpemUsICZwYXJhbXMpOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgcCA9IChnaW50MTYgKikgbWFwLmRhdGE7CisKKyAgdm9sdW1lX2ZhY3RvciA9IHBvdyAoMTAsICgtZXZlbnQtPnZvbHVtZSkgLyAyMCk7CisKKyAgLyoKKyAgICogRm9yIGVhY2ggc2FtcGxlIHBvaW50IHdlIGNhbGN1bGF0ZSAneCcgYXMgdGhlCisgICAqIHRoZSBhbXBsaXR1ZGUgdmFsdWUuCisgICAqLworICBmb3IgKGkgPSAwOyBpIDwgKHRvbmVfc2l6ZSAvIChTQU1QTEVfU0laRSAvIDgpKTsgaSsrKSB7CisgICAgLyoKKyAgICAgKiBXZSBhZGQgdGhlIGZ1bmRhbWVudGFsIGZyZXF1ZW5jaWVzIHRvZ2V0aGVyLgorICAgICAqLworICAgIGYxID0gc2luICgyICogTV9QSSAqIGtleS5sb3dfZnJlcXVlbmN5ICogKGV2ZW50LT5zYW1wbGUgLyBzYW1wbGVfcmF0ZSkpOworICAgIGYyID0gc2luICgyICogTV9QSSAqIGtleS5oaWdoX2ZyZXF1ZW5jeSAqIChldmVudC0+c2FtcGxlIC8gc2FtcGxlX3JhdGUpKTsKKworICAgIGFtcGxpdHVkZSA9IChmMSArIGYyKSAvIDI7CisKKyAgICAvKiBBZGp1c3QgdGhlIHZvbHVtZSAqLworICAgIGFtcGxpdHVkZSAqPSB2b2x1bWVfZmFjdG9yOworCisgICAgLyogTWFrZSB0aGUgWy0xOjFdIGludGVydmFsIGludG8gYSBbLTMyNzY3OjMyNzY3XSBpbnRlcnZhbCAqLworICAgIGFtcGxpdHVkZSAqPSAzMjc2NzsKKworICAgIC8qIFN0b3JlIGl0IGluIHRoZSBkYXRhIGJ1ZmZlciAqLworICAgICoocCsrKSA9IChnaW50MTYpIGFtcGxpdHVkZTsKKworICAgIChldmVudC0+c2FtcGxlKSsrOworICB9CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICByZXR1cm4gYnVmZmVyOworfQorCisKKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfZHRtZl9zcmNfY3JlYXRlX25leHRfdG9uZV9wYWNrZXQgKEdzdERUTUZTcmMgKiBkdG1mc3JjLAorICAgIEdzdERUTUZTcmNFdmVudCAqIGV2ZW50KQoreworICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisgIGdib29sZWFuIHNlbmRfc2lsZW5jZSA9IEZBTFNFOworCisgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAiQ3JlYXRpbmcgYnVmZmVyIGZvciB0b25lICVzIiwKKyAgICAgIERUTUZfS0VZU1tldmVudC0+ZXZlbnRfbnVtYmVyXS5ldmVudF9uYW1lKTsKKworICBpZiAoZXZlbnQtPnBhY2tldF9jb3VudCAqIGR0bWZzcmMtPmludGVydmFsIDwgTUlOX0lOVEVSX0RJR0lUX0lOVEVSVkFMKSB7CisgICAgc2VuZF9zaWxlbmNlID0gVFJVRTsKKyAgfQorCisgIGlmIChzZW5kX3NpbGVuY2UpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoZHRtZnNyYywgIkdlbmVyYXRpbmcgc2lsZW5jZSIpOworICAgIGJ1ZiA9IGdzdF9kdG1mX3NyY19nZW5lcmF0ZV9zaWxlbmNlIChkdG1mc3JjLT5pbnRlcnZhbCwKKyAgICAgICAgZHRtZnNyYy0+c2FtcGxlX3JhdGUpOworICB9IGVsc2UgeworICAgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAiR2VuZXJhdGluZyB0b25lIik7CisgICAgYnVmID0gZ3N0X2R0bWZfc3JjX2dlbmVyYXRlX3RvbmUgKGV2ZW50LCBEVE1GX0tFWVNbZXZlbnQtPmV2ZW50X251bWJlcl0sCisgICAgICAgIGR0bWZzcmMtPmludGVydmFsLCBkdG1mc3JjLT5zYW1wbGVfcmF0ZSk7CisgIH0KKyAgZXZlbnQtPnBhY2tldF9jb3VudCsrOworCisKKyAgLyogdGltZXN0YW1wIGFuZCBkdXJhdGlvbiBvZiBHc3RCdWZmZXIgKi8KKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKSA9IGR0bWZzcmMtPmludGVydmFsICogR1NUX01TRUNPTkQ7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpID0gZHRtZnNyYy0+dGltZXN0YW1wOworCisgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAiQ3JlYXRpbmcgbmV3IGJ1ZmZlciB3aXRoIGV2ZW50ICV1IGR1cmF0aW9uICIKKyAgICAgICIgZ3N0OiAlIiBHU1RfVElNRV9GT1JNQVQgIiBhdCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBldmVudC0+ZXZlbnRfbnVtYmVyLCBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpKSk7CisKKyAgZHRtZnNyYy0+dGltZXN0YW1wICs9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1Zik7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kdG1mX3NyY19wb3N0X21lc3NhZ2UgKEdzdERUTUZTcmMgKiBkdG1mc3JjLCBjb25zdCBnY2hhciAqIG1lc3NhZ2VfbmFtZSwKKyAgICBHc3REVE1GU3JjRXZlbnQgKiBldmVudCkKK3sKKyAgR3N0U3RydWN0dXJlICpzID0gTlVMTDsKKworICBzd2l0Y2ggKGV2ZW50LT5ldmVudF90eXBlKSB7CisgICAgY2FzZSBEVE1GX0VWRU5UX1RZUEVfU1RBUlQ6CisgICAgICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKG1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAidHlwZSIsIEdfVFlQRV9JTlQsIDEsCisgICAgICAgICAgIm1ldGhvZCIsIEdfVFlQRV9JTlQsIDIsCisgICAgICAgICAgInN0YXJ0IiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsCisgICAgICAgICAgIm51bWJlciIsIEdfVFlQRV9JTlQsIGV2ZW50LT5ldmVudF9udW1iZXIsCisgICAgICAgICAgInZvbHVtZSIsIEdfVFlQRV9JTlQsIGV2ZW50LT52b2x1bWUsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEVE1GX0VWRU5UX1RZUEVfU1RPUDoKKyAgICAgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAobWVzc2FnZV9uYW1lLAorICAgICAgICAgICJ0eXBlIiwgR19UWVBFX0lOVCwgMSwgIm1ldGhvZCIsIEdfVFlQRV9JTlQsIDIsCisgICAgICAgICAgInN0YXJ0IiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFRNRl9FVkVOVF9UWVBFX1BBVVNFX1RBU0s6CisgICAgICByZXR1cm47CisgIH0KKworICBpZiAocykKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UIChkdG1mc3JjKSwKKyAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2VsZW1lbnQgKEdTVF9PQkpFQ1QgKGR0bWZzcmMpLCBzKSk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZHRtZl9zcmNfY3JlYXRlIChHc3RCYXNlU3JjICogYmFzZXNyYywgZ3VpbnQ2NCBvZmZzZXQsCisgICAgZ3VpbnQgbGVuZ3RoLCBHc3RCdWZmZXIgKiogYnVmZmVyKQoreworICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisgIEdzdERUTUZTcmNFdmVudCAqZXZlbnQ7CisgIEdzdERUTUZTcmMgKmR0bWZzcmM7CisgIEdzdENsb2NrICpjbG9jazsKKyAgR3N0Q2xvY2tJRCAqY2xvY2tpZDsKKyAgR3N0Q2xvY2tSZXR1cm4gY2xvY2tyZXQ7CisKKyAgZHRtZnNyYyA9IEdTVF9EVE1GX1NSQyAoYmFzZXNyYyk7CisKKyAgZG8geworCisgICAgaWYgKGR0bWZzcmMtPmxhc3RfZXZlbnQgPT0gTlVMTCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgInBvcHBpbmciKTsKKyAgICAgIGV2ZW50ID0gZ19hc3luY19xdWV1ZV9wb3AgKGR0bWZzcmMtPmV2ZW50X3F1ZXVlKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgInBvcHBlZCAlZCIsIGV2ZW50LT5ldmVudF90eXBlKTsKKworICAgICAgc3dpdGNoIChldmVudC0+ZXZlbnRfdHlwZSkgeworICAgICAgICBjYXNlIERUTUZfRVZFTlRfVFlQRV9TVE9QOgorICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZHRtZnNyYywKKyAgICAgICAgICAgICAgIlJlY2VpdmVkIGEgRFRNRiBzdG9wIGV2ZW50IHdoZW4gYWxyZWFkeSBzdG9wcGVkIik7CisgICAgICAgICAgZ3N0X2R0bWZfc3JjX3Bvc3RfbWVzc2FnZSAoZHRtZnNyYywgImR0bWYtZXZlbnQtZHJvcHBlZCIsIGV2ZW50KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEVE1GX0VWRU5UX1RZUEVfU1RBUlQ6CisgICAgICAgICAgZ3N0X2R0bWZfcHJlcGFyZV90aW1lc3RhbXBzIChkdG1mc3JjKTsKKworICAgICAgICAgIGV2ZW50LT5wYWNrZXRfY291bnQgPSAwOworICAgICAgICAgIGR0bWZzcmMtPmxhc3RfZXZlbnQgPSBldmVudDsKKyAgICAgICAgICBldmVudCA9IE5VTEw7CisgICAgICAgICAgZ3N0X2R0bWZfc3JjX3Bvc3RfbWVzc2FnZSAoZHRtZnNyYywgImR0bWYtZXZlbnQtcHJvY2Vzc2VkIiwKKyAgICAgICAgICAgICAgZHRtZnNyYy0+bGFzdF9ldmVudCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFRNRl9FVkVOVF9UWVBFX1BBVVNFX1RBU0s6CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBXZSdyZSBwdXNoaW5nIGl0IGJhY2sgYmVjYXVzZSBpdCBoYXMgdG8gc3RheSBpbiB0aGVyZSB1bnRpbAorICAgICAgICAgICAqIHRoZSB0YXNrIGlzIHJlYWxseSBwYXVzZWQgKGFuZCB0aGUgcXVldWUgd2lsbCB0aGVuIGJlIGZsdXNoZWQpCisgICAgICAgICAgICovCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgInB1c2hpbmcgcGF1c2VfdGFzay4uLiIpOworICAgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZHRtZnNyYyk7CisgICAgICAgICAgaWYgKGR0bWZzcmMtPnBhdXNlZCkgeworICAgICAgICAgICAgZ19hc3luY19xdWV1ZV9wdXNoIChkdG1mc3JjLT5ldmVudF9xdWV1ZSwgZXZlbnQpOworICAgICAgICAgICAgZ290byBwYXVzZWRfbG9ja2VkOworICAgICAgICAgIH0KKyAgICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZHRtZnNyYyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoZXZlbnQpCisgICAgICAgIGdfc2xpY2VfZnJlZSAoR3N0RFRNRlNyY0V2ZW50LCBldmVudCk7CisgICAgfSBlbHNlIGlmIChkdG1mc3JjLT5sYXN0X2V2ZW50LT5wYWNrZXRfY291bnQgKiBkdG1mc3JjLT5pbnRlcnZhbCA+PQorICAgICAgICBNSU5fRFVUWV9DWUNMRSkgeworICAgICAgZXZlbnQgPSBnX2FzeW5jX3F1ZXVlX3RyeV9wb3AgKGR0bWZzcmMtPmV2ZW50X3F1ZXVlKTsKKworICAgICAgaWYgKGV2ZW50ICE9IE5VTEwpIHsKKworICAgICAgICBzd2l0Y2ggKGV2ZW50LT5ldmVudF90eXBlKSB7CisgICAgICAgICAgY2FzZSBEVE1GX0VWRU5UX1RZUEVfU1RBUlQ6CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGR0bWZzcmMsCisgICAgICAgICAgICAgICAgIlJlY2VpdmVkIHR3byBjb25zZWN1dGl2ZSBEVE1GIHN0YXJ0IGV2ZW50cyIpOworICAgICAgICAgICAgZ3N0X2R0bWZfc3JjX3Bvc3RfbWVzc2FnZSAoZHRtZnNyYywgImR0bWYtZXZlbnQtZHJvcHBlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRFRNRl9FVkVOVF9UWVBFX1NUT1A6CisgICAgICAgICAgICBnX3NsaWNlX2ZyZWUgKEdzdERUTUZTcmNFdmVudCwgZHRtZnNyYy0+bGFzdF9ldmVudCk7CisgICAgICAgICAgICBkdG1mc3JjLT5sYXN0X2V2ZW50ID0gTlVMTDsKKyAgICAgICAgICAgIGdzdF9kdG1mX3NyY19wb3N0X21lc3NhZ2UgKGR0bWZzcmMsICJkdG1mLWV2ZW50LXByb2Nlc3NlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRFRNRl9FVkVOVF9UWVBFX1BBVVNFX1RBU0s6CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogV2UncmUgcHVzaGluZyBpdCBiYWNrIGJlY2F1c2UgaXQgaGFzIHRvIHN0YXkgaW4gdGhlcmUgdW50aWwKKyAgICAgICAgICAgICAqIHRoZSB0YXNrIGlzIHJlYWxseSBwYXVzZWQgKGFuZCB0aGUgcXVldWUgd2lsbCB0aGVuIGJlIGZsdXNoZWQpCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJwdXNoaW5nIHBhdXNlX3Rhc2suLi4iKTsKKworICAgICAgICAgICAgR1NUX09CSkVDVF9MT0NLIChkdG1mc3JjKTsKKyAgICAgICAgICAgIGlmIChkdG1mc3JjLT5wYXVzZWQpIHsKKyAgICAgICAgICAgICAgZ19hc3luY19xdWV1ZV9wdXNoIChkdG1mc3JjLT5ldmVudF9xdWV1ZSwgZXZlbnQpOworICAgICAgICAgICAgICBnb3RvIHBhdXNlZF9sb2NrZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZHRtZnNyYyk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGdfc2xpY2VfZnJlZSAoR3N0RFRNRlNyY0V2ZW50LCBldmVudCk7CisgICAgICB9CisgICAgfQorICB9IHdoaWxlIChkdG1mc3JjLT5sYXN0X2V2ZW50ID09IE5VTEwpOworCisgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAiZW5kIGV2ZW50IGNoZWNrLCBub3cgd2FpdCBmb3IgdGhlIHByb3BlciB0aW1lIik7CisKKyAgY2xvY2sgPSBnc3RfZWxlbWVudF9nZXRfY2xvY2sgKEdTVF9FTEVNRU5UIChiYXNlc3JjKSk7CisKKyAgY2xvY2tpZCA9IGdzdF9jbG9ja19uZXdfc2luZ2xlX3Nob3RfaWQgKGNsb2NrLCBkdG1mc3JjLT50aW1lc3RhbXAgKworICAgICAgZ3N0X2VsZW1lbnRfZ2V0X2Jhc2VfdGltZSAoR1NUX0VMRU1FTlQgKGR0bWZzcmMpKSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGNsb2NrKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGR0bWZzcmMpOworICBpZiAoIWR0bWZzcmMtPnBhdXNlZCkgeworICAgIGR0bWZzcmMtPmNsb2NraWQgPSBjbG9ja2lkOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKworICAgIGNsb2NrcmV0ID0gZ3N0X2Nsb2NrX2lkX3dhaXQgKGNsb2NraWQsIE5VTEwpOworCisgICAgR1NUX09CSkVDVF9MT0NLIChkdG1mc3JjKTsKKyAgICBpZiAoZHRtZnNyYy0+cGF1c2VkKQorICAgICAgY2xvY2tyZXQgPSBHU1RfQ0xPQ0tfVU5TQ0hFRFVMRUQ7CisgIH0gZWxzZSB7CisgICAgY2xvY2tyZXQgPSBHU1RfQ0xPQ0tfVU5TQ0hFRFVMRUQ7CisgIH0KKyAgZ3N0X2Nsb2NrX2lkX3VucmVmIChjbG9ja2lkKTsKKyAgZHRtZnNyYy0+Y2xvY2tpZCA9IE5VTEw7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKworICBpZiAoY2xvY2tyZXQgPT0gR1NUX0NMT0NLX1VOU0NIRURVTEVEKSB7CisgICAgZ290byBwYXVzZWQ7CisgIH0KKworICBidWYgPSBnc3RfZHRtZl9zcmNfY3JlYXRlX25leHRfdG9uZV9wYWNrZXQgKGR0bWZzcmMsIGR0bWZzcmMtPmxhc3RfZXZlbnQpOworCisgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAiQ3JlYXRlZCBidWZmZXIgb2Ygc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikpOworICAqYnVmZmVyID0gYnVmOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworcGF1c2VkX2xvY2tlZDoKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGR0bWZzcmMpOworCitwYXVzZWQ6CisKKyAgaWYgKGR0bWZzcmMtPmxhc3RfZXZlbnQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdG1mc3JjLCAiU3RvcHBpbmcgY3VycmVudCBldmVudCIpOworICAgIC8qIERvbid0IGZvcmdldCB0byByZWxlYXNlIHRoZSBzdHJlYW0gbG9jayAqLworICAgIGdfc2xpY2VfZnJlZSAoR3N0RFRNRlNyY0V2ZW50LCBkdG1mc3JjLT5sYXN0X2V2ZW50KTsKKyAgICBkdG1mc3JjLT5sYXN0X2V2ZW50ID0gTlVMTDsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19GTFVTSElORzsKKworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdG1mX3NyY191bmxvY2sgKEdzdEJhc2VTcmMgKiBzcmMpCit7CisgIEdzdERUTUZTcmMgKmR0bWZzcmMgPSBHU1RfRFRNRl9TUkMgKHNyYyk7CisgIEdzdERUTUZTcmNFdmVudCAqZXZlbnQgPSBOVUxMOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJDYWxsZWQgdW5sb2NrIik7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkdG1mc3JjKTsKKyAgZHRtZnNyYy0+cGF1c2VkID0gVFJVRTsKKyAgaWYgKGR0bWZzcmMtPmNsb2NraWQpIHsKKyAgICBnc3RfY2xvY2tfaWRfdW5zY2hlZHVsZSAoZHRtZnNyYy0+Y2xvY2tpZCk7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGR0bWZzcmMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJQdXNoaW5nIHRoZSBQQVVTRV9UQVNLIGV2ZW50IG9uIHVubG9jayByZXF1ZXN0Iik7CisgIGV2ZW50ID0gZ19zbGljZV9uZXcwIChHc3REVE1GU3JjRXZlbnQpOworICBldmVudC0+ZXZlbnRfdHlwZSA9IERUTUZfRVZFTlRfVFlQRV9QQVVTRV9UQVNLOworICBnX2FzeW5jX3F1ZXVlX3B1c2ggKGR0bWZzcmMtPmV2ZW50X3F1ZXVlLCBldmVudCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfZHRtZl9zcmNfdW5sb2NrX3N0b3AgKEdzdEJhc2VTcmMgKiBzcmMpCit7CisgIEdzdERUTUZTcmMgKmR0bWZzcmMgPSBHU1RfRFRNRl9TUkMgKHNyYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgIlVubG9jayBzdG9wcGVkIik7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkdG1mc3JjKTsKKyAgZHRtZnNyYy0+cGF1c2VkID0gRkFMU0U7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKworICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdG1mX3NyY19uZWdvdGlhdGUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKQoreworICBHc3REVE1GU3JjICpkdG1mc3JjID0gR1NUX0RUTUZfU1JDIChiYXNlc3JjKTsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0U3RydWN0dXJlICpzOworICBnYm9vbGVhbiByZXQ7CisKKyAgY2FwcyA9IGdzdF9wYWRfZ2V0X2FsbG93ZWRfY2FwcyAoR1NUX0JBU0VfU1JDX1BBRCAoYmFzZXNyYykpOworCisgIGlmICghY2FwcykKKyAgICBjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9CQVNFX1NSQ19QQUQgKGJhc2VzcmMpKTsKKworICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKGNhcHMpKSB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGNhcHMgPSBnc3RfY2Fwc190cnVuY2F0ZSAoY2Fwcyk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGNhcHMpOworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9pbnQgKHMsICJyYXRlIiwgREVGQVVMVF9TQU1QTEVfUkFURSk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJyYXRlIiwgJmR0bWZzcmMtPnNhbXBsZV9yYXRlKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGR0bWZzcmMsICJDb3VsZCBub3QgZ2V0IHJhdGUiKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0ID0gZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX0JBU0VfU1JDX1BBRCAoYmFzZXNyYyksIGNhcHMpOworCisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kdG1mX3NyY19xdWVyeSAoR3N0QmFzZVNyYyAqIGJhc2VzcmMsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdERUTUZTcmMgKmR0bWZzcmMgPSBHU1RfRFRNRl9TUkMgKGJhc2VzcmMpOworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9MQVRFTkNZOgorICAgIHsKKyAgICAgIEdzdENsb2NrVGltZSBsYXRlbmN5OworCisgICAgICBsYXRlbmN5ID0gZHRtZnNyYy0+aW50ZXJ2YWwgKiBHU1RfTVNFQ09ORDsKKyAgICAgIGdzdF9xdWVyeV9zZXRfbGF0ZW5jeSAocXVlcnksIGdzdF9iYXNlX3NyY19pc19saXZlIChiYXNlc3JjKSwgbGF0ZW5jeSwKKyAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJSZXBvcnRpbmcgbGF0ZW5jeSBvZiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobGF0ZW5jeSkpOworICAgICAgcmVzID0gVFJVRTsKKyAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gR1NUX0JBU0VfU1JDX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5xdWVyeSAoYmFzZXNyYywgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9kdG1mX3NyY19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3REVE1GU3JjICpkdG1mc3JjOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXN1bHQ7CisgIGdib29sZWFuIG5vX3ByZXJvbGwgPSBGQUxTRTsKKyAgR3N0RFRNRlNyY0V2ZW50ICpldmVudCA9IE5VTEw7CisKKyAgZHRtZnNyYyA9IEdTVF9EVE1GX1NSQyAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIC8qIEZsdXNoaW5nIHRoZSBldmVudCBxdWV1ZSAqLworICAgICAgZXZlbnQgPSBnX2FzeW5jX3F1ZXVlX3RyeV9wb3AgKGR0bWZzcmMtPmV2ZW50X3F1ZXVlKTsKKworICAgICAgd2hpbGUgKGV2ZW50ICE9IE5VTEwpIHsKKyAgICAgICAgZ3N0X2R0bWZfc3JjX3Bvc3RfbWVzc2FnZSAoZHRtZnNyYywgImR0bWYtZXZlbnQtZHJvcHBlZCIsIGV2ZW50KTsKKyAgICAgICAgZ19zbGljZV9mcmVlIChHc3REVE1GU3JjRXZlbnQsIGV2ZW50KTsKKyAgICAgICAgZXZlbnQgPSBnX2FzeW5jX3F1ZXVlX3RyeV9wb3AgKGR0bWZzcmMtPmV2ZW50X3F1ZXVlKTsKKyAgICAgIH0KKyAgICAgIGR0bWZzcmMtPmxhc3RfZXZlbnRfd2FzX3N0YXJ0ID0gRkFMU0U7CisgICAgICBkdG1mc3JjLT50aW1lc3RhbXAgPSAwOworICAgICAgbm9fcHJlcm9sbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoKHJlc3VsdCA9CisgICAgICAgICAgR1NUX0VMRU1FTlRfQ0xBU1MgKGdzdF9kdG1mX3NyY19wYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsCisgICAgICAgICAgICAgIHRyYW5zaXRpb24pKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpCisgICAgZ290byBmYWlsdXJlOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QTEFZSU5HX1RPX1BBVVNFRDoKKyAgICAgIG5vX3ByZXJvbGwgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJGbHVzaGluZyBldmVudCBxdWV1ZSIpOworICAgICAgLyogRmx1c2hpbmcgdGhlIGV2ZW50IHF1ZXVlICovCisgICAgICBldmVudCA9IGdfYXN5bmNfcXVldWVfdHJ5X3BvcCAoZHRtZnNyYy0+ZXZlbnRfcXVldWUpOworCisgICAgICB3aGlsZSAoZXZlbnQgIT0gTlVMTCkgeworICAgICAgICBnc3RfZHRtZl9zcmNfcG9zdF9tZXNzYWdlIChkdG1mc3JjLCAiZHRtZi1ldmVudC1kcm9wcGVkIiwgZXZlbnQpOworICAgICAgICBnX3NsaWNlX2ZyZWUgKEdzdERUTUZTcmNFdmVudCwgZXZlbnQpOworICAgICAgICBldmVudCA9IGdfYXN5bmNfcXVldWVfdHJ5X3BvcCAoZHRtZnNyYy0+ZXZlbnRfcXVldWUpOworICAgICAgfQorICAgICAgZHRtZnNyYy0+bGFzdF9ldmVudF93YXNfc3RhcnQgPSBGQUxTRTsKKworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKG5vX3ByZXJvbGwgJiYgcmVzdWx0ID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUykKKyAgICByZXN1bHQgPSBHU1RfU1RBVEVfQ0hBTkdFX05PX1BSRVJPTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsKKworICAvKiBFUlJPUlMgKi8KK2ZhaWx1cmU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkdG1mc3JjLCAicGFyZW50IGZhaWxlZCBzdGF0ZSBjaGFuZ2UiKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKK2dib29sZWFuCitnc3RfZHRtZl9zcmNfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJkdG1mc3JjIiwKKyAgICAgIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX0RUTUZfU1JDKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9kdG1mL2dzdGR0bWZzcmMuaCBiL2dzdC9kdG1mL2dzdGR0bWZzcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDQ0MGJjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2R0bWYvZ3N0ZHRtZnNyYy5oCkBAIC0wLDAgKzEsMTAxIEBACisvKiBHU3RyZWFtZXIgRFRNRiBzb3VyY2UKKyAqCisgKiBnc3RkdG1mc3JjLmg6CisgKgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gQ29sbGFib3JhLgorICogICBDb250YWN0OiBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gTm9raWEgQ29ycG9yYXRpb24uCisgKiAgIENvbnRhY3Q6IFplZXNoYW4gQWxpIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfRFRNRl9TUkNfSF9fCisjZGVmaW5lIF9fR1NUX0RUTUZfU1JDX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9nc3RidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlc3JjLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfRFRNRl9TUkMgICAgICAgICAgICAgICAoZ3N0X2R0bWZfc3JjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9EVE1GX1NSQyhvYmopICAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0RUTUZfU1JDLEdzdERUTUZTcmMpKQorI2RlZmluZSBHU1RfRFRNRl9TUkNfQ0xBU1Moa2xhc3MpICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0RUTUZfU1JDLEdzdERUTUZTcmNDbGFzcykpCisjZGVmaW5lIEdTVF9EVE1GX1NSQ19HRVRfQ0xBU1Mob2JqKSAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9EVE1GX1NSQywgR3N0RFRNRlNyY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0RUTUZfU1JDKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfRFRNRl9TUkMpKQorI2RlZmluZSBHU1RfSVNfRFRNRl9TUkNfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0RUTUZfU1JDKSkKKyNkZWZpbmUgR1NUX0RUTUZfU1JDX0NBU1Qob2JqKSAgICAgICAgICAoKEdzdERUTUZTcmMgKikob2JqKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3REVE1GU3JjIEdzdERUTUZTcmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0RFRNRlNyY0NsYXNzIEdzdERUTUZTcmNDbGFzczsKKworZW51bSBfR3N0RFRNRkV2ZW50VHlwZQoreworICBEVE1GX0VWRU5UX1RZUEVfU1RBUlQsCisgIERUTUZfRVZFTlRfVFlQRV9TVE9QLAorICBEVE1GX0VWRU5UX1RZUEVfUEFVU0VfVEFTSworfTsKKwordHlwZWRlZiBlbnVtIF9Hc3REVE1GRXZlbnRUeXBlIEdzdERUTUZFdmVudFR5cGU7CisKK3N0cnVjdCBfR3N0RFRNRlNyY0V2ZW50Cit7CisgIEdzdERUTUZFdmVudFR5cGUgZXZlbnRfdHlwZTsKKyAgZG91YmxlIHNhbXBsZTsKKyAgZ3VpbnQxNiBldmVudF9udW1iZXI7CisgIGd1aW50MTYgdm9sdW1lOworICBndWludDMyIHBhY2tldF9jb3VudDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9Hc3REVE1GU3JjRXZlbnQgR3N0RFRNRlNyY0V2ZW50OworCisvKioKKyAqIEdzdERUTUZTcmM6CisgKiBAZWxlbWVudDogdGhlIHBhcmVudCBlbGVtZW50LgorICoKKyAqIFRoZSBvcGFxdWUgI0dzdERUTUZTcmMgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0RFRNRlNyYworeworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgR3N0QmFzZVNyYyBwYXJlbnQ7CisgIEdBc3luY1F1ZXVlICpldmVudF9xdWV1ZTsKKyAgR3N0RFRNRlNyY0V2ZW50ICpsYXN0X2V2ZW50OworICBnYm9vbGVhbiBsYXN0X2V2ZW50X3dhc19zdGFydDsKKworICBndWludDE2IGludGVydmFsOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworCisgIGdib29sZWFuIHBhdXNlZDsKKyAgR3N0Q2xvY2tJRCBjbG9ja2lkOworCisgIEdzdENsb2NrVGltZSBsYXN0X3N0b3A7CisKKyAgZ2ludCBzYW1wbGVfcmF0ZTsKK307CisKKworc3RydWN0IF9Hc3REVE1GU3JjQ2xhc3MKK3sKKyAgR3N0QmFzZVNyY0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9kdG1mX3NyY19nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9kdG1mX3NyY19wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9EVE1GX1NSQ19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jIGIvZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc4MjdiZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kdG1mL2dzdHJ0cGR0bWZkZXBheS5jCkBAIC0wLDAgKzEsNTM0IEBACisvKiBHc3RSdHBEdG1mRGVwYXkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQ29sbGFib3JhIExpbWl0ZWQKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbgorICogICBDb250YWN0OiBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHBkdG1mZGVwYXkKKyAqIEBzZWVfYWxzbzogcnRwZHRtZnNyYywgcnRwZHRtZm11eAorICoKKyAqIFRoaXMgZWxlbWVudCB0YWtlcyBSVFAgRFRNRiBwYWNrZXRzIGFuZCBwcm9kdWNlcyBzb3VuZC4gSXQgYWxzbyBlbWl0cyBhCisgKiBtZXNzYWdlIG9uIHRoZSAjR3N0QnVzLgorICoKKyAqIFRoZSBtZXNzYWdlIGlzIGNhbGxlZCAiZHRtZi1ldmVudCIgYW5kIGhhcyB0aGUgZm9sbG93aW5nIGZpZWxkcworICogPGluZm9ybWFsdGFibGU+CisgKiA8dGdyb3VwIGNvbHM9JzQnPgorICogPGNvbHNwZWMgY29sbmFtZT0nTmFtZScgLz4KKyAqIDxjb2xzcGVjIGNvbG5hbWU9J1R5cGUnIC8+CisgKiA8Y29sc3BlYyBjb2xuYW1lPSdQb3NzaWJsZSB2YWx1ZXMnIC8+CisgKiA8Y29sc3BlYyBjb2xuYW1lPSdQdXJwb3NlJyAvPgorICogPHRoZWFkPgorICogPHJvdz4KKyAqIDxlbnRyeT5OYW1lPC9lbnRyeT4KKyAqIDxlbnRyeT5HVHlwZTwvZW50cnk+CisgKiA8ZW50cnk+UG9zc2libGUgdmFsdWVzPC9lbnRyeT4KKyAqIDxlbnRyeT5QdXJwb3NlPC9lbnRyeT4KKyAqIDwvcm93PgorICogPC90aGVhZD4KKyAqIDx0Ym9keT4KKyAqIDxyb3c+CisgKiA8ZW50cnk+dHlwZTwvZW50cnk+CisgKiA8ZW50cnk+R19UWVBFX0lOVDwvZW50cnk+CisgKiA8ZW50cnk+MC0xPC9lbnRyeT4KKyAqIDxlbnRyeT5XaGljaCBvZiB0aGUgdHdvIG1ldGhvZHMKKyAqIHNwZWNpZmllZCBpbiBSRkMgMjgzMyB0byB1c2UuIFRoZSB2YWx1ZSBzaG91bGQgYmUgMCBmb3IgdG9uZXMgYW5kIDEgZm9yCisgKiBuYW1lZCBldmVudHMuIFRvbmVzIGFyZSBzcGVjaWZpZWQgYnkgdGhlaXIgZnJlcXVlbmNpZXMgYW5kIGV2ZW50cyBhcmUgc3BlY2llZAorICogYnkgdGhlaXIgbnVtYmVyLiBUaGlzIGVsZW1lbnQgY3VycmVudGx5IG9ubHkgcmVjb2duaXplcyBldmVudHMuCisgKiBEbyBub3QgY29uZnVzZSB3aXRoICJtZXRob2QiIHdoaWNoIHNwZWNpZmllZCB0aGUgb3V0cHV0LgorICogPC9lbnRyeT4KKyAqIDwvcm93PgorICogPHJvdz4KKyAqIDxlbnRyeT5udW1iZXI8L2VudHJ5PgorICogPGVudHJ5PkdfVFlQRV9JTlQ8L2VudHJ5PgorICogPGVudHJ5PjAtMTY8L2VudHJ5PgorICogPGVudHJ5PlRoZSBldmVudCBudW1iZXIuPC9lbnRyeT4KKyAqIDwvcm93PgorICogPHJvdz4KKyAqIDxlbnRyeT52b2x1bWU8L2VudHJ5PgorICogPGVudHJ5PkdfVFlQRV9JTlQ8L2VudHJ5PgorICogPGVudHJ5PjAtMzY8L2VudHJ5PgorICogPGVudHJ5PlRoaXMgZmllbGQgZGVzY3JpYmVzIHRoZSBwb3dlciBsZXZlbCBvZiB0aGUgdG9uZSwgZXhwcmVzc2VkIGluIGRCbTAKKyAqIGFmdGVyIGRyb3BwaW5nIHRoZSBzaWduLiBQb3dlciBsZXZlbHMgcmFuZ2UgZnJvbSAwIHRvIC02MyBkQm0wLiBUaGUgcmFuZ2Ugb2YKKyAqIHZhbGlkIERUTUYgaXMgZnJvbSAwIHRvIC0zNiBkQm0wLgorICogPC9lbnRyeT4KKyAqIDwvcm93PgorICogPHJvdz4KKyAqIDxlbnRyeT5tZXRob2Q8L2VudHJ5PgorICogPGVudHJ5PkdfVFlQRV9JTlQ8L2VudHJ5PgorICogPGVudHJ5PjE8L2VudHJ5PgorICogPGVudHJ5PlRoaXMgZmllbGQgd2lsbCBhbHdheXMgYmVlbiAxIChpZSBSVFAgZXZlbnQpIGZyb20gdGhpcyBlbGVtZW50LgorICogPC9lbnRyeT4KKyAqIDwvcm93PgorICogPC90Ym9keT4KKyAqIDwvdGdyb3VwPgorICogPC9pbmZvcm1hbHRhYmxlPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdHJ0cGR0bWZkZXBheS5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworI2RlZmluZSBERUZBVUxUX1BBQ0tFVF9JTlRFUlZBTCAgNTAgICAgIC8qIG1zICovCisjZGVmaW5lIE1JTl9QQUNLRVRfSU5URVJWQUwgICAgICAxMCAgICAgLyogbXMgKi8KKyNkZWZpbmUgTUFYX1BBQ0tFVF9JTlRFUlZBTCAgICAgIDUwICAgICAvKiBtcyAqLworI2RlZmluZSBTQU1QTEVfUkFURSAgICAgICAgICAgICAgODAwMAorI2RlZmluZSBTQU1QTEVfU0laRSAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgQ0hBTk5FTFMgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUlOX0RVVFlfQ1lDTEUgICAgICAgICAgIChNSU5fSU5URVJfRElHSVRfSU5URVJWQUwgKyBNSU5fUFVMU0VfRFVSQVRJT04pCisKKyNkZWZpbmUgTUlOX1VOSVRfVElNRSAgICAgICAgICAgIDAKKyNkZWZpbmUgTUFYX1VOSVRfVElNRSAgICAgICAgICAgIDEwMDAKKyNkZWZpbmUgREVGQVVMVF9VTklUX1RJTUUgICAgICAgIDAKKworI2RlZmluZSBERUZBVUxUX01BWF9EVVJBVElPTiAgICAgMAorCit0eXBlZGVmIHN0cnVjdCBzdF9kdG1mX2tleQoreworICBmbG9hdCBsb3dfZnJlcXVlbmN5OworICBmbG9hdCBoaWdoX2ZyZXF1ZW5jeTsKK30gRFRNRl9LRVk7CisKK3N0YXRpYyBjb25zdCBEVE1GX0tFWSBEVE1GX0tFWVNbXSA9IHsKKyAgezk0MSwgMTMzNn0sCisgIHs2OTcsIDEyMDl9LAorICB7Njk3LCAxMzM2fSwKKyAgezY5NywgMTQ3N30sCisgIHs3NzAsIDEyMDl9LAorICB7NzcwLCAxMzM2fSwKKyAgezc3MCwgMTQ3N30sCisgIHs4NTIsIDEyMDl9LAorICB7ODUyLCAxMzM2fSwKKyAgezg1MiwgMTQ3N30sCisgIHs5NDEsIDEyMDl9LAorICB7OTQxLCAxNDc3fSwKKyAgezY5NywgMTYzM30sCisgIHs3NzAsIDE2MzN9LAorICB7ODUyLCAxNjMzfSwKKyAgezk0MSwgMTYzM30sCit9OworCisjZGVmaW5lIE1BWF9EVE1GX0VWRU5UUyAxNgorCitlbnVtCit7CisgIERUTUZfS0VZX0VWRU5UXzEgPSAxLAorICBEVE1GX0tFWV9FVkVOVF8yID0gMiwKKyAgRFRNRl9LRVlfRVZFTlRfMyA9IDMsCisgIERUTUZfS0VZX0VWRU5UXzQgPSA0LAorICBEVE1GX0tFWV9FVkVOVF81ID0gNSwKKyAgRFRNRl9LRVlfRVZFTlRfNiA9IDYsCisgIERUTUZfS0VZX0VWRU5UXzcgPSA3LAorICBEVE1GX0tFWV9FVkVOVF84ID0gOCwKKyAgRFRNRl9LRVlfRVZFTlRfOSA9IDksCisgIERUTUZfS0VZX0VWRU5UXzAgPSAwLAorICBEVE1GX0tFWV9FVkVOVF9TVEFSID0gMTAsCisgIERUTUZfS0VZX0VWRU5UX1BPVU5EID0gMTEsCisgIERUTUZfS0VZX0VWRU5UX0EgPSAxMiwKKyAgRFRNRl9LRVlfRVZFTlRfQiA9IDEzLAorICBEVE1GX0tFWV9FVkVOVF9DID0gMTQsCisgIERUTUZfS0VZX0VWRU5UX0QgPSAxNSwKK307CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9ydHBfZHRtZl9kZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfcnRwX2R0bWZfZGVwYXlfZGVidWcKKworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9VTklUX1RJTUUsCisgIFBST1BfTUFYX0RVUkFUSU9OCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9kdG1mX2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIFwiIiBHU1RfQVVESU9fTkUgKFMxNikgIlwiLCAiCisgICAgICAgICJyYXRlID0gIiBHU1RfQVVESU9fUkFURV9SQU5HRSAiLCAiICJjaGFubmVscyA9IChpbnQpIDEiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2R0bWZfZGVwYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgWyAwLCBNQVggXSwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiVEVMRVBIT05FLUVWRU5UXCIiKQorICAgICk7CisKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cERUTUZEZXBheSwgZ3N0X3J0cF9kdG1mX2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfZHRtZl9kZXBheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2R0bWZfZGVwYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9kdG1mX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmKTsKK2dib29sZWFuIGdzdF9ydHBfZHRtZl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZmlsdGVyLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHRtZl9kZXBheV9jbGFzc19pbml0IChHc3RSdHBEVE1GRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfQ0xBU1MgKGtsYXNzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2R0bWZfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9kdG1mX2RlcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfcnRwX2R0bWZfZGVwYXlfZGVidWcsCisgICAgICAicnRwZHRtZmRlcGF5IiwgMCwgInJ0cGR0bWZkZXBheSBlbGVtZW50Iik7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIERUTUYgcGFja2V0IGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsiLAorICAgICAgIkdlbmVyYXRlcyBEVE1GIFNvdW5kIGZyb20gdGVsZXBob25lLWV2ZW50IFJUUCBwYWNrZXRzIiwKKyAgICAgICJZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPiIpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdG1mX2RlcGF5X3NldF9wcm9wZXJ0eSk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdG1mX2RlcGF5X2dldF9wcm9wZXJ0eSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9VTklUX1RJTUUsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInVuaXQtdGltZSIsICJEdXJhdGlvbiB1bml0dGltZSIsCisgICAgICAgICAgIlRoZSBzbWFsbGVzdCB1bml0IChtcykgdGhlIGR1cmF0aW9uIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAoMCBkaXNhYmxlcyBpdCkiLAorICAgICAgICAgIE1JTl9VTklUX1RJTUUsIE1BWF9VTklUX1RJTUUsIERFRkFVTFRfVU5JVF9USU1FLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfTUFYX0RVUkFUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJtYXgtZHVyYXRpb24iLCAiTWF4aW11bSBkdXJhdGlvbiIsCisgICAgICAgICAgIlRoZSBtYXh1bWltdW0gZHVyYXRpb24gKG1zKSBvZiB0aGUgb3V0Z29pbmcgc291bmRwYWNrZXQuICIKKyAgICAgICAgICAiKDAgPSBubyBsaW1pdCkiLCAwLCBHX01BWFVJTlQsIERFRkFVTFRfTUFYX0RVUkFUSU9OLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3MgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfZHRtZl9kZXBheV9wcm9jZXNzKTsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfZHRtZl9kZXBheV9zZXRjYXBzKTsKKworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9kdG1mX2RlcGF5X2luaXQgKEdzdFJ0cERUTUZEZXBheSAqIHJ0cGR0bWZkZXBheSkKK3sKKyAgcnRwZHRtZmRlcGF5LT51bml0X3RpbWUgPSBERUZBVUxUX1VOSVRfVElNRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHRtZl9kZXBheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwRFRNRkRlcGF5ICpydHBkdG1mZGVwYXk7CisKKyAgcnRwZHRtZmRlcGF5ID0gR1NUX1JUUF9EVE1GX0RFUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9VTklUX1RJTUU6CisgICAgICBydHBkdG1mZGVwYXktPnVuaXRfdGltZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfRFVSQVRJT046CisgICAgICBydHBkdG1mZGVwYXktPm1heF9kdXJhdGlvbiA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHRtZl9kZXBheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwRFRNRkRlcGF5ICpydHBkdG1mZGVwYXk7CisKKyAgcnRwZHRtZmRlcGF5ID0gR1NUX1JUUF9EVE1GX0RFUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9VTklUX1RJTUU6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnRwZHRtZmRlcGF5LT51bml0X3RpbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9EVVJBVElPTjoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHBkdG1mZGVwYXktPm1heF9kdXJhdGlvbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2R0bWZfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGZpbHRlciwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKmZpbHRlcmNhcHMsICpzcmNjYXBzOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBnaW50IGNsb2NrX3JhdGUgPSA4MDAwOyAgICAgICAvKiBkZWZhdWx0ICovCisKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpOworICBmaWx0ZXItPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIGZpbHRlcmNhcHMgPQorICAgICAgZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChmaWx0ZXIpKTsKKworICBmaWx0ZXJjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoZmlsdGVyY2Fwcyk7CisgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGZpbHRlcmNhcHMsICJyYXRlIiwgR19UWVBFX0lOVCwgY2xvY2tfcmF0ZSwgTlVMTCk7CisKKyAgc3JjY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAoZmlsdGVyKSwKKyAgICAgIGZpbHRlcmNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoZmlsdGVyY2Fwcyk7CisKKyAgZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKGZpbHRlciksIHNyY2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X2R0bWZfc3JjX2dlbmVyYXRlX3RvbmUgKEdzdFJ0cERUTUZEZXBheSAqIHJ0cGR0bWZkZXBheSwKKyAgICBHc3RSVFBEVE1GUGF5bG9hZCBwYXlsb2FkKQoreworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdpbnQxNiAqcDsKKyAgZ2ludCB0b25lX3NpemU7CisgIGRvdWJsZSBpID0gMDsKKyAgZG91YmxlIGFtcGxpdHVkZSwgZjEsIGYyOworICBkb3VibGUgdm9sdW1lX2ZhY3RvcjsKKyAgRFRNRl9LRVkga2V5ID0gRFRNRl9LRVlTW3BheWxvYWQuZXZlbnRdOworICBndWludDMyIGNsb2NrX3JhdGU7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgKmRlcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9ERVBBWUxPQUQgKHJ0cGR0bWZkZXBheSk7CisgIGdpbnQgdm9sdW1lOworICBzdGF0aWMgR3N0QWxsb2NhdGlvblBhcmFtcyBwYXJhbXMgPSB7IDAsIDEsIDAsIDAsIH07CisKKyAgY2xvY2tfcmF0ZSA9IGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZTsKKworICAvKiBDcmVhdGUgYSBidWZmZXIgZm9yIHRoZSB0b25lICovCisgIHRvbmVfc2l6ZSA9IChwYXlsb2FkLmR1cmF0aW9uICogU0FNUExFX1NJWkUgKiBDSEFOTkVMUykgLyA4OworICBidWYgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgdG9uZV9zaXplLCAmcGFyYW1zKTsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKSA9IHBheWxvYWQuZHVyYXRpb24gKiBHU1RfU0VDT05EIC8gY2xvY2tfcmF0ZTsKKyAgdm9sdW1lID0gcGF5bG9hZC52b2x1bWU7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIHAgPSAoZ2ludDE2ICopIG1hcC5kYXRhOworCisgIHZvbHVtZV9mYWN0b3IgPSBwb3cgKDEwLCAoLXZvbHVtZSkgLyAyMCk7CisKKyAgLyoKKyAgICogRm9yIGVhY2ggc2FtcGxlIHBvaW50IHdlIGNhbGN1bGF0ZSAneCcgYXMgdGhlCisgICAqIHRoZSBhbXBsaXR1ZGUgdmFsdWUuCisgICAqLworICBmb3IgKGkgPSAwOyBpIDwgKHRvbmVfc2l6ZSAvIChTQU1QTEVfU0laRSAvIDgpKTsgaSsrKSB7CisgICAgLyoKKyAgICAgKiBXZSBhZGQgdGhlIGZ1bmRhbWVudGFsIGZyZXF1ZW5jaWVzIHRvZ2V0aGVyLgorICAgICAqLworICAgIGYxID0gc2luICgyICogTV9QSSAqIGtleS5sb3dfZnJlcXVlbmN5ICogKHJ0cGR0bWZkZXBheS0+c2FtcGxlIC8KKyAgICAgICAgICAgIGNsb2NrX3JhdGUpKTsKKyAgICBmMiA9IHNpbiAoMiAqIE1fUEkgKiBrZXkuaGlnaF9mcmVxdWVuY3kgKiAocnRwZHRtZmRlcGF5LT5zYW1wbGUgLworICAgICAgICAgICAgY2xvY2tfcmF0ZSkpOworCisgICAgYW1wbGl0dWRlID0gKGYxICsgZjIpIC8gMjsKKworICAgIC8qIEFkanVzdCB0aGUgdm9sdW1lICovCisgICAgYW1wbGl0dWRlICo9IHZvbHVtZV9mYWN0b3I7CisKKyAgICAvKiBNYWtlIHRoZSBbLTE6MV0gaW50ZXJ2YWwgaW50byBhIFstMzI3Njc6MzI3NjddIGludGVydmFsICovCisgICAgYW1wbGl0dWRlICo9IDMyNzY3OworCisgICAgLyogU3RvcmUgaXQgaW4gdGhlIGRhdGEgYnVmZmVyICovCisgICAgKihwKyspID0gKGdpbnQxNikgYW1wbGl0dWRlOworCisgICAgKHJ0cGR0bWZkZXBheS0+c2FtcGxlKSsrOworICB9CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICByZXR1cm4gYnVmOworfQorCisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9kdG1mX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKworICBHc3RSdHBEVE1GRGVwYXkgKnJ0cGR0bWZkZXBheSA9IE5VTEw7CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgZ2ludCBwYXlsb2FkX2xlbjsKKyAgZ3VpbnQ4ICpwYXlsb2FkID0gTlVMTDsKKyAgZ3VpbnQzMiB0aW1lc3RhbXA7CisgIEdzdFJUUERUTUZQYXlsb2FkIGR0bWZfcGF5bG9hZDsKKyAgZ2Jvb2xlYW4gbWFya2VyOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSA9IE5VTEw7CisgIEdzdE1lc3NhZ2UgKmR0bWZfbWVzc2FnZSA9IE5VTEw7CisgIEdzdFJUUEJ1ZmZlciBydHBidWZmZXIgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworCisgIHJ0cGR0bWZkZXBheSA9IEdTVF9SVFBfRFRNRl9ERVBBWSAoZGVwYXlsb2FkKTsKKworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGJ1ZiwgR1NUX01BUF9SRUFELCAmcnRwYnVmZmVyKTsKKworICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAoJnJ0cGJ1ZmZlcik7CisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cGJ1ZmZlcik7CisKKyAgaWYgKHBheWxvYWRfbGVuICE9IHNpemVvZiAoR3N0UlRQRFRNRlBheWxvYWQpKQorICAgIGdvdG8gYmFkX3BhY2tldDsKKworICBtZW1jcHkgKCZkdG1mX3BheWxvYWQsIHBheWxvYWQsIHNpemVvZiAoR3N0UlRQRFRNRlBheWxvYWQpKTsKKworICBpZiAoZHRtZl9wYXlsb2FkLmV2ZW50ID4gTUFYX0VWRU5UKQorICAgIGdvdG8gYmFkX3BhY2tldDsKKworICBtYXJrZXIgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyICgmcnRwYnVmZmVyKTsKKworICB0aW1lc3RhbXAgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wICgmcnRwYnVmZmVyKTsKKworICBkdG1mX3BheWxvYWQuZHVyYXRpb24gPSBnX250b2hzIChkdG1mX3BheWxvYWQuZHVyYXRpb24pOworCisgIC8qIGNsaXAgdG8gd2hvbGUgdW5pdHMgb2YgdW5pdF90aW1lICovCisgIGlmIChydHBkdG1mZGVwYXktPnVuaXRfdGltZSkgeworICAgIGd1aW50IHVuaXRfdGltZV9jbG9jayA9CisgICAgICAgIChydHBkdG1mZGVwYXktPnVuaXRfdGltZSAqIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSkgLyAxMDAwOworICAgIGlmIChkdG1mX3BheWxvYWQuZHVyYXRpb24gJSB1bml0X3RpbWVfY2xvY2spIHsKKyAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyB0aGUgZHVyYXRpb24gKi8KKyAgICAgIGlmIChkdG1mX3BheWxvYWQuZHVyYXRpb24gPCBHX01BWFVJTlQxNiAtIHVuaXRfdGltZV9jbG9jaykKKyAgICAgICAgZHRtZl9wYXlsb2FkLmR1cmF0aW9uICs9IHVuaXRfdGltZV9jbG9jayAtCisgICAgICAgICAgICAoZHRtZl9wYXlsb2FkLmR1cmF0aW9uICUgdW5pdF90aW1lX2Nsb2NrKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZHRtZl9wYXlsb2FkLmR1cmF0aW9uIC09IGR0bWZfcGF5bG9hZC5kdXJhdGlvbiAlIHVuaXRfdGltZV9jbG9jazsKKyAgICB9CisgIH0KKworICAvKiBjbGlwIHRvIG1heCBkdXJhdGlvbiAqLworICBpZiAocnRwZHRtZmRlcGF5LT5tYXhfZHVyYXRpb24pIHsKKyAgICBndWludCBtYXhfZHVyYXRpb25fY2xvY2sgPQorICAgICAgICAocnRwZHRtZmRlcGF5LT5tYXhfZHVyYXRpb24gKiBkZXBheWxvYWQtPmNsb2NrX3JhdGUpIC8gMTAwMDsKKworICAgIGlmIChtYXhfZHVyYXRpb25fY2xvY2sgPCBHX01BWFVJTlQxNiAmJgorICAgICAgICBkdG1mX3BheWxvYWQuZHVyYXRpb24gPiBtYXhfZHVyYXRpb25fY2xvY2spCisgICAgICBkdG1mX3BheWxvYWQuZHVyYXRpb24gPSBtYXhfZHVyYXRpb25fY2xvY2s7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJSZWNlaXZlZCBuZXcgUlRQIERUTUYgcGFja2V0IDogIgorICAgICAgIm1hcmtlcj0lZCAtIHRpbWVzdGFtcD0ldSAtIGV2ZW50PSVkIC0gZHVyYXRpb249JWQiLAorICAgICAgbWFya2VyLCB0aW1lc3RhbXAsIGR0bWZfcGF5bG9hZC5ldmVudCwgZHRtZl9wYXlsb2FkLmR1cmF0aW9uKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsCisgICAgICAiUHJldmlvdXMgaW5mb3JtYXRpb24gOiB0aW1lc3RhbXA9JXUgLSBkdXJhdGlvbj0lZCIsCisgICAgICBydHBkdG1mZGVwYXktPnByZXZpb3VzX3RzLCBydHBkdG1mZGVwYXktPnByZXZpb3VzX2R1cmF0aW9uKTsKKworICAvKiBGaXJzdCBwYWNrZXQgKi8KKyAgaWYgKG1hcmtlciB8fCBydHBkdG1mZGVwYXktPnByZXZpb3VzX3RzICE9IHRpbWVzdGFtcCkgeworICAgIHJ0cGR0bWZkZXBheS0+c2FtcGxlID0gMDsKKyAgICBydHBkdG1mZGVwYXktPnByZXZpb3VzX3RzID0gdGltZXN0YW1wOworICAgIHJ0cGR0bWZkZXBheS0+cHJldmlvdXNfZHVyYXRpb24gPSBkdG1mX3BheWxvYWQuZHVyYXRpb247CisgICAgcnRwZHRtZmRlcGF5LT5maXJzdF9nc3RfdHMgPSBHU1RfQlVGRkVSX1BUUyAoYnVmKTsKKworICAgIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiZHRtZi1ldmVudCIsCisgICAgICAgICJudW1iZXIiLCBHX1RZUEVfSU5ULCBkdG1mX3BheWxvYWQuZXZlbnQsCisgICAgICAgICJ2b2x1bWUiLCBHX1RZUEVfSU5ULCBkdG1mX3BheWxvYWQudm9sdW1lLAorICAgICAgICAidHlwZSIsIEdfVFlQRV9JTlQsIDEsICJtZXRob2QiLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgICBpZiAoc3RydWN0dXJlKSB7CisgICAgICBkdG1mX21lc3NhZ2UgPQorICAgICAgICAgIGdzdF9tZXNzYWdlX25ld19lbGVtZW50IChHU1RfT0JKRUNUIChkZXBheWxvYWQpLCBzdHJ1Y3R1cmUpOworICAgICAgaWYgKGR0bWZfbWVzc2FnZSkgeworICAgICAgICBpZiAoIWdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKGRlcGF5bG9hZCksIGR0bWZfbWVzc2FnZSkpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChkZXBheWxvYWQsCisgICAgICAgICAgICAgICJVbmFibGUgdG8gc2VuZCBkdG1mLWV2ZW50IG1lc3NhZ2UgdG8gYnVzIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlcGF5bG9hZCwgIlVuYWJsZSB0byBjcmVhdGUgZHRtZi1ldmVudCBtZXNzYWdlIik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlcGF5bG9hZCwgIlVuYWJsZSB0byBjcmVhdGUgZHRtZi1ldmVudCBzdHJ1Y3R1cmUiKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ3VpbnQxNiBkdXJhdGlvbiA9IGR0bWZfcGF5bG9hZC5kdXJhdGlvbjsKKyAgICBkdG1mX3BheWxvYWQuZHVyYXRpb24gLT0gcnRwZHRtZmRlcGF5LT5wcmV2aW91c19kdXJhdGlvbjsKKyAgICAvKiBJZiBsYXRlIGJ1ZmZlciwgaWdub3JlICovCisgICAgaWYgKGR1cmF0aW9uID4gcnRwZHRtZmRlcGF5LT5wcmV2aW91c19kdXJhdGlvbikKKyAgICAgIHJ0cGR0bWZkZXBheS0+cHJldmlvdXNfZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgIm5ldyBwcmV2aW91cyBkdXJhdGlvbiA6ICVkIC0gbmV3IGR1cmF0aW9uIDogJWQiCisgICAgICAiIC0gZGlmZiAgOiAlZCAtIGNsb2NrIHJhdGUgOiAlZCAtIHRpbWVzdGFtcCA6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBydHBkdG1mZGVwYXktPnByZXZpb3VzX2R1cmF0aW9uLCBkdG1mX3BheWxvYWQuZHVyYXRpb24sCisgICAgICAocnRwZHRtZmRlcGF5LT5wcmV2aW91c19kdXJhdGlvbiAtIGR0bWZfcGF5bG9hZC5kdXJhdGlvbiksCisgICAgICBkZXBheWxvYWQtPmNsb2NrX3JhdGUsIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpKTsKKworICAvKiBJZiBsYXRlIG9yIGR1cGxpY2F0ZSBwYWNrZXQgKGxpa2UgdGhlIHJlZHVuZGFudCBlbmQgcGFja2V0KS4gSWdub3JlICovCisgIGlmIChkdG1mX3BheWxvYWQuZHVyYXRpb24gPiAwKSB7CisgICAgb3V0YnVmID0gZ3N0X2R0bWZfc3JjX2dlbmVyYXRlX3RvbmUgKHJ0cGR0bWZkZXBheSwgZHRtZl9wYXlsb2FkKTsKKworCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBydHBkdG1mZGVwYXktPmZpcnN0X2dzdF90cyArCisgICAgICAgIChydHBkdG1mZGVwYXktPnByZXZpb3VzX2R1cmF0aW9uIC0gZHRtZl9wYXlsb2FkLmR1cmF0aW9uKSAqCisgICAgICAgIEdTVF9TRUNPTkQgLyBkZXBheWxvYWQtPmNsb2NrX3JhdGU7CisgICAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPQorICAgICAgICAocnRwZHRtZmRlcGF5LT5wcmV2aW91c19kdXJhdGlvbiAtIGR0bWZfcGF5bG9hZC5kdXJhdGlvbikgKgorICAgICAgICBHU1RfU0VDT05EIC8gZGVwYXlsb2FkLT5jbG9ja19yYXRlOworICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAob3V0YnVmKSA9IHJ0cGR0bWZkZXBheS0+cHJldmlvdXNfZHVyYXRpb24gKgorICAgICAgICBHU1RfU0VDT05EIC8gZGVwYXlsb2FkLT5jbG9ja19yYXRlOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLAorICAgICAgICAidGltZXN0YW1wIDogJSIgR19HVUlOVDY0X0ZPUk1BVCAiIC0gdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpLCBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKSkpOworCisgIH0KKworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cGJ1ZmZlcik7CisKKyAgcmV0dXJuIG91dGJ1ZjsKKworYmFkX3BhY2tldDoKKyAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwZHRtZmRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICgiUGFja2V0IGRpZCBub3QgdmFsaWRhdGUiKSwgKE5VTEwpKTsKKworICBpZiAocnRwYnVmZmVyLmJ1ZmZlciAhPSBOVUxMKQorICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwYnVmZmVyKTsKKworICByZXR1cm4gTlVMTDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfZHRtZl9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGR0bWZkZXBheSIsCisgICAgICBHU1RfUkFOS19NQVJHSU5BTCwgR1NUX1RZUEVfUlRQX0RUTUZfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmggYi9nc3QvZHRtZi9nc3RydHBkdG1mZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWVkMTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2R0bWYvZ3N0cnRwZHRtZmRlcGF5LmgKQEAgLTAsMCArMSw2OCBAQAorLyogR3N0UnRwRHRtZkRlcGF5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IENvbGxhYm9yYSBMaW1pdGVkCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24KKyAqICAgQ29udGFjdDogWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9EVE1GX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfRFRNRl9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKKyNpbmNsdWRlICJnc3RkdG1mY29tbW9uLmgiCisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0RUTUZfREVQQVkgXAorICAoZ3N0X3J0cF9kdG1mX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfRFRNRl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9EVE1GX0RFUEFZLEdzdFJ0cERUTUZEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfRFRNRl9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfRFRNRl9ERVBBWSxHc3RSdHBEVE1GRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfRFRNRl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9EVE1GX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9EVE1GX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9EVE1GX0RFUEFZKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBEVE1GRGVwYXkgR3N0UnRwRFRNRkRlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cERUTUZEZXBheUNsYXNzIEdzdFJ0cERUTUZEZXBheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cERUTUZEZXBheQoreworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisgIGRvdWJsZSBzYW1wbGU7CisgIGd1aW50MzIgcHJldmlvdXNfdHM7CisgIGd1aW50MTYgcHJldmlvdXNfZHVyYXRpb247CisgIEdzdENsb2NrVGltZSBmaXJzdF9nc3RfdHM7CisgIGd1aW50IHVuaXRfdGltZTsKKyAgZ3VpbnQgbWF4X2R1cmF0aW9uOworfTsKKworc3RydWN0IF9Hc3RSdHBEVE1GRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9kdG1mX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9kdG1mX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1JUUF9EVE1GX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jIGIvZ3N0L2R0bWYvZ3N0cnRwZHRtZnNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNzgzZDMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZHRtZi9nc3RydHBkdG1mc3JjLmMKQEAgLTAsMCArMSwxMTg3IEBACisvKiBHU3RyZWFtZXIgUlRQIERUTUYgc291cmNlCisgKgorICogZ3N0cnRwZHRtZnNyYy5jOgorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IE5va2lhIENvcnBvcmF0aW9uLgorICogICBDb250YWN0OiBaZWVzaGFuIEFsaSA8emVlc2hhbi5hbGlAbm9raWEuY29tPgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgMjAwMCwyMDA1IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwZHRtZnNyYworICogQHNlZV9hbHNvOiBkdG1mc3JjLCBydHBkdG1mZGVwYXksIHJ0cGR0bWZtdXgKKyAqCisgKiBUaGUgUlRQRFRNRlNyYyBlbGVtZW50IGdlbmVyYXRlcyBSVFAgRFRNRiAoUkZDIDI4MzMpIGV2ZW50IHBhY2tldHMgb24gcmVxdWVzdAorICogZnJvbSBhcHBsaWNhdGlvbi4gVGhlIGFwcGxpY2F0aW9uIGNvbW11bmljYXRlcyB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYQorICogRFRNRiBldmVudCB1c2luZyBjdXN0b20gdXBzdHJlYW0gZ3N0cmVhbWVyIGV2ZW50cy4gVG8gcmVwb3J0IGEgRFRNRiBldmVudCwgYW4KKyAqIGFwcGxpY2F0aW9uIG11c3Qgc2VuZCBhbiBldmVudCBvZiB0eXBlIEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU0sIGhhdmluZyBhCisgKiBzdHJ1Y3R1cmUgb2YgbmFtZSAiZHRtZi1ldmVudCIgd2l0aCBmaWVsZHMgc2V0IGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nCisgKiB0YWJsZToKKyAqCisgKiA8aW5mb3JtYWx0YWJsZT4KKyAqIDx0Z3JvdXAgY29scz0nNCc+CisgKiA8Y29sc3BlYyBjb2xuYW1lPSdOYW1lJyAvPgorICogPGNvbHNwZWMgY29sbmFtZT0nVHlwZScgLz4KKyAqIDxjb2xzcGVjIGNvbG5hbWU9J1Bvc3NpYmxlIHZhbHVlcycgLz4KKyAqIDxjb2xzcGVjIGNvbG5hbWU9J1B1cnBvc2UnIC8+CisgKiA8dGhlYWQ+CisgKiA8cm93PgorICogPGVudHJ5Pk5hbWU8L2VudHJ5PgorICogPGVudHJ5PkdUeXBlPC9lbnRyeT4KKyAqIDxlbnRyeT5Qb3NzaWJsZSB2YWx1ZXM8L2VudHJ5PgorICogPGVudHJ5PlB1cnBvc2U8L2VudHJ5PgorICogPC9yb3c+CisgKiA8L3RoZWFkPgorICogPHRib2R5PgorICogPHJvdz4KKyAqIDxlbnRyeT50eXBlPC9lbnRyeT4KKyAqIDxlbnRyeT5HX1RZUEVfSU5UPC9lbnRyeT4KKyAqIDxlbnRyeT4wLTE8L2VudHJ5PgorICogPGVudHJ5PlRoZSBhcHBsaWNhdGlvbiB1c2VzIHRoaXMgZmllbGQgdG8gc3BlY2lmeSB3aGljaCBvZiB0aGUgdHdvIG1ldGhvZHMKKyAqIHNwZWNpZmllZCBpbiBSRkMgMjgzMyB0byB1c2UuIFRoZSB2YWx1ZSBzaG91bGQgYmUgMCBmb3IgdG9uZXMgYW5kIDEgZm9yCisgKiBuYW1lZCBldmVudHMuIFRvbmVzIGFyZSBzcGVjaWZpZWQgYnkgdGhlaXIgZnJlcXVlbmNpZXMgYW5kIGV2ZW50cyBhcmUgc3BlY2llZAorICogYnkgdGhlaXIgbnVtYmVyLiBUaGlzIGVsZW1lbnQgY2FuIG9ubHkgdGFrZSBldmVudHMgYXMgaW5wdXQuIERvIG5vdCBjb25mdXNlCisgKiB3aXRoICJtZXRob2QiIHdoaWNoIHNwZWNpZmllZCB0aGUgb3V0cHV0LgorICogPC9lbnRyeT4KKyAqIDwvcm93PgorICogPHJvdz4KKyAqIDxlbnRyeT5udW1iZXI8L2VudHJ5PgorICogPGVudHJ5PkdfVFlQRV9JTlQ8L2VudHJ5PgorICogPGVudHJ5PjAtMTU8L2VudHJ5PgorICogPGVudHJ5PlRoZSBldmVudCBudW1iZXIuPC9lbnRyeT4KKyAqIDwvcm93PgorICogPHJvdz4KKyAqIDxlbnRyeT52b2x1bWU8L2VudHJ5PgorICogPGVudHJ5PkdfVFlQRV9JTlQ8L2VudHJ5PgorICogPGVudHJ5PjAtMzY8L2VudHJ5PgorICogPGVudHJ5PlRoaXMgZmllbGQgZGVzY3JpYmVzIHRoZSBwb3dlciBsZXZlbCBvZiB0aGUgdG9uZSwgZXhwcmVzc2VkIGluIGRCbTAKKyAqIGFmdGVyIGRyb3BwaW5nIHRoZSBzaWduLiBQb3dlciBsZXZlbHMgcmFuZ2UgZnJvbSAwIHRvIC02MyBkQm0wLiBUaGUgcmFuZ2Ugb2YKKyAqIHZhbGlkIERUTUYgaXMgZnJvbSAwIHRvIC0zNiBkQm0wLiBDYW4gYmUgb21pdHRlZCBpZiBzdGFydCBpcyBzZXQgdG8gRkFMU0UuCisgKiA8L2VudHJ5PgorICogPC9yb3c+CisgKiA8cm93PgorICogPGVudHJ5PnN0YXJ0PC9lbnRyeT4KKyAqIDxlbnRyeT5HX1RZUEVfQk9PTEVBTjwvZW50cnk+CisgKiA8ZW50cnk+VHJ1ZSBvciBGYWxzZTwvZW50cnk+CisgKiA8ZW50cnk+V2hldGhlciB0aGUgZXZlbnQgaXMgc3RhcnRpbmcgb3IgZW5kaW5nLjwvZW50cnk+CisgKiA8L3Jvdz4KKyAqIDxyb3c+CisgKiA8ZW50cnk+bWV0aG9kPC9lbnRyeT4KKyAqIDxlbnRyeT5HX1RZUEVfSU5UPC9lbnRyeT4KKyAqIDxlbnRyeT4xPC9lbnRyeT4KKyAqIDxlbnRyeT5UaGUgbWV0aG9kIHVzZWQgZm9yIHNlbmRpbmcgZXZlbnQsIHRoaXMgZWxlbWVudCB3aWxsIHJlYWN0IGlmIHRoaXMKKyAqIGZpZWxkIGlzIGFic2VudCBvciAxLgorICogPC9lbnRyeT4KKyAqIDwvcm93PgorICogPC90Ym9keT4KKyAqIDwvdGdyb3VwPgorICogPC9pbmZvcm1hbHRhYmxlPgorICoKKyAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgaW5mb3JtcyB0aGUgcGlwZWxpbmUgKGFuZCBpbiB0dXJuLCB0aGUKKyAqIFJUUERUTUZTcmMgZWxlbWVudCBpbnNpZGUgdGhlIHBpcGVsaW5lKSBhYm91dCB0aGUgc3RhcnQgb2YgYW4gUlRQIERUTUYgbmFtZWQKKyAqIGV2ZW50ICcxJyBvZiB2b2x1bWUgLTI1IGRCbTA6CisgKgorICogPHByb2dyYW1saXN0aW5nPgorICogc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJkdG1mLWV2ZW50IiwKKyAqICAgICAgICAgICAgICAgICAgICAidHlwZSIsIEdfVFlQRV9JTlQsIDEsCisgKiAgICAgICAgICAgICAgICAgICAgIm51bWJlciIsIEdfVFlQRV9JTlQsIDEsCisgKiAgICAgICAgICAgICAgICAgICAgInZvbHVtZSIsIEdfVFlQRV9JTlQsIDI1LAorICogICAgICAgICAgICAgICAgICAgICJzdGFydCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAqCisgKiBldmVudCA9IGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNLCBzdHJ1Y3R1cmUpOworICogZ3N0X2VsZW1lbnRfc2VuZF9ldmVudCAocGlwZWxpbmUsIGV2ZW50KTsKKyAqIDwvcHJvZ3JhbWxpc3Rpbmc+CisgKgorICogV2hlbiBhIERUTUYgdG9uZSBhY3R1YWxseSBzdGFydHMgb3Igc3RvcCwgYSAiZHRtZi1ldmVudC1wcm9jZXNzZWQiCisgKiBlbGVtZW50ICNHc3RNZXNzYWdlIHdpdGggdGhlIHNhbWUgZmllbGRzIGFzIHRoZSAiZHRtZi1ldmVudCIKKyAqICNHc3RFdmVudCB0aGF0IHdhcyB1c2VkIHRvIHJlcXVlc3QgdGhlIGV2ZW50LiBBbHNvLCBpZiBhbnkgZXZlbnQKKyAqIGhhcyBub3QgYmVlbiBwcm9jZXNzZWQgd2hlbiB0aGUgZWxlbWVudCBnb2VzIGZyb20gdGhlIFBBVVNFRCB0byB0aGUKKyAqIFJFQURZIHN0YXRlLCB0aGVuIGEgImR0bWYtZXZlbnQtZHJvcHBlZCIgbWVzc2FnZSBpcyBwb3N0ZWQgb24gdGhlCisgKiAjR3N0QnVzIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgd2VyZSByZWNlaXZlZC4KKyAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlICJnc3RydHBkdG1mc3JjLmgiCisKKyNkZWZpbmUgR1NUX1JUUF9EVE1GX1RZUEVfRVZFTlQgIDEKKyNkZWZpbmUgREVGQVVMVF9QVElNRSAgICAgICAgICAgIDQwICAgICAvKiBtcyAqLworI2RlZmluZSBERUZBVUxUX1NTUkMgICAgICAgICAgICAgLTEKKyNkZWZpbmUgREVGQVVMVF9QVCAgICAgICAgICAgICAgIDk2CisjZGVmaW5lIERFRkFVTFRfVElNRVNUQU1QX09GRlNFVCAtMQorI2RlZmluZSBERUZBVUxUX1NFUU5VTV9PRkZTRVQgICAgLTEKKyNkZWZpbmUgREVGQVVMVF9DTE9DS19SQVRFICAgICAgIDgwMDAKKworI2RlZmluZSBERUZBVUxUX1BBQ0tFVF9SRURVTkRBTkNZIDEKKyNkZWZpbmUgTUlOX1BBQ0tFVF9SRURVTkRBTkNZIDEKKyNkZWZpbmUgTUFYX1BBQ0tFVF9SRURVTkRBTkNZIDUKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF9kdG1mX3NyY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfcnRwX2R0bWZfc3JjX2RlYnVnCisKKy8qIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfU1NSQywKKyAgUFJPUF9USU1FU1RBTVBfT0ZGU0VULAorICBQUk9QX1NFUU5VTV9PRkZTRVQsCisgIFBST1BfUFQsCisgIFBST1BfQ0xPQ0tfUkFURSwKKyAgUFJPUF9USU1FU1RBTVAsCisgIFBST1BfU0VRTlVNLAorICBQUk9QX1JFRFVOREFOQ1kKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2R0bWZfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSBbIDk2LCAxMjcgXSwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsgMCwgTUFYIF0sICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIlRFTEVQSE9ORS1FVkVOVFwiIikKKyAgICAvKiAgImV2ZW50cyA9IChzdHJpbmcpIFwiMC0xNVwiICovCisgICAgKTsKKworCitHX0RFRklORV9UWVBFIChHc3RSVFBEVE1GU3JjLCBnc3RfcnRwX2R0bWZfc3JjLCBHU1RfVFlQRV9CQVNFX1NSQyk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfZHRtZl9zcmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2R0bWZfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfZHRtZl9zcmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfZHRtZl9zcmNfaGFuZGxlX2V2ZW50IChHc3RCYXNlU3JjICogYmFzZXNyYywKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX2R0bWZfc3JjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2R0bWZfc3JjX2FkZF9zdGFydF9ldmVudCAoR3N0UlRQRFRNRlNyYyAqIGR0bWZzcmMsCisgICAgZ2ludCBldmVudF9udW1iZXIsIGdpbnQgZXZlbnRfdm9sdW1lKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfZHRtZl9zcmNfYWRkX3N0b3BfZXZlbnQgKEdzdFJUUERUTUZTcmMgKiBkdG1mc3JjKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfZHRtZl9zcmNfdW5sb2NrIChHc3RCYXNlU3JjICogc3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2R0bWZfc3JjX3VubG9ja19zdG9wIChHc3RCYXNlU3JjICogc3JjKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfZHRtZl9zcmNfY3JlYXRlIChHc3RCYXNlU3JjICogYmFzZXNyYywKKyAgICBndWludDY0IG9mZnNldCwgZ3VpbnQgbGVuZ3RoLCBHc3RCdWZmZXIgKiogYnVmZmVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2R0bWZfc3JjX25lZ290aWF0ZSAoR3N0QmFzZVNyYyAqIGJhc2VzcmMpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfZHRtZl9zcmNfcXVlcnkgKEdzdEJhc2VTcmMgKiBiYXNlc3JjLCBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9kdG1mX3NyY19jbGFzc19pbml0IChHc3RSVFBEVE1GU3JjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RCYXNlU3JjQ2xhc3MgKmdzdGJhc2VzcmNfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgZ3N0YmFzZXNyY19jbGFzcyA9IEdTVF9CQVNFX1NSQ19DTEFTUyAoa2xhc3MpOworICBnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3J0cF9kdG1mX3NyY19kZWJ1ZywKKyAgICAgICJydHBkdG1mc3JjIiwgMCwgInJ0cGR0bWZzcmMgZWxlbWVudCIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZHRtZl9zcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIERUTUYgcGFja2V0IGdlbmVyYXRvciIsICJTb3VyY2UvTmV0d29yayIsCisgICAgICAiR2VuZXJhdGVzIFJUUCBEVE1GIHBhY2tldHMiLCAiWmVlc2hhbiBBbGkgPHplZXNoYW4uYWxpQG5va2lhLmNvbT4iKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2R0bWZfc3JjX2ZpbmFsaXplKTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2R0bWZfc3JjX3NldF9wcm9wZXJ0eSk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdG1mX3NyY19nZXRfcHJvcGVydHkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfVElNRVNUQU1QLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJ0aW1lc3RhbXAiLCAiVGltZXN0YW1wIiwKKyAgICAgICAgICAiVGhlIFJUUCB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgcHJvY2Vzc2VkIHBhY2tldCIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCAwLCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1NFUU5VTSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgic2VxbnVtIiwgIlNlcXVlbmNlIG51bWJlciIsCisgICAgICAgICAgIlRoZSBSVFAgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBsYXN0IHByb2Nlc3NlZCBwYWNrZXQiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVCwgMCwgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfVElNRVNUQU1QX09GRlNFVCwgZ19wYXJhbV9zcGVjX2ludCAoInRpbWVzdGFtcC1vZmZzZXQiLAorICAgICAgICAgICJUaW1lc3RhbXAgT2Zmc2V0IiwKKyAgICAgICAgICAiT2Zmc2V0IHRvIGFkZCB0byBhbGwgb3V0Z29pbmcgdGltZXN0YW1wcyAoLTEgPSByYW5kb20pIiwgLTEsCisgICAgICAgICAgR19NQVhJTlQsIERFRkFVTFRfVElNRVNUQU1QX09GRlNFVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9TRVFOVU1fT0ZGU0VULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInNlcW51bS1vZmZzZXQiLCAiU2VxdWVuY2UgbnVtYmVyIE9mZnNldCIsCisgICAgICAgICAgIk9mZnNldCB0byBhZGQgdG8gYWxsIG91dGdvaW5nIHNlcW51bSAoLTEgPSByYW5kb20pIiwgLTEsIEdfTUFYSU5ULAorICAgICAgICAgIERFRkFVTFRfU0VRTlVNX09GRlNFVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQ0xPQ0tfUkFURSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiY2xvY2stcmF0ZSIsICJjbG9ja3JhdGUiLAorICAgICAgICAgICJUaGUgY2xvY2stcmF0ZSBhdCB3aGljaCB0byBnZW5lcmF0ZSB0aGUgZHRtZiBwYWNrZXRzIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfQ0xPQ0tfUkFURSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9TU1JDLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJzc3JjIiwgIlNTUkMiLAorICAgICAgICAgICJUaGUgU1NSQyBvZiB0aGUgcGFja2V0cyAoLTEgPT0gcmFuZG9tKSIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCBERUZBVUxUX1NTUkMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfUFQsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInB0IiwgInBheWxvYWQgdHlwZSIsCisgICAgICAgICAgIlRoZSBwYXlsb2FkIHR5cGUgb2YgdGhlIHBhY2tldHMiLAorICAgICAgICAgIDAsIDB4ODAsIERFRkFVTFRfUFQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1JFRFVOREFOQ1ksCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInBhY2tldC1yZWR1bmRhbmN5IiwgIlBhY2tldCBSZWR1bmRhbmN5IiwKKyAgICAgICAgICAiTnVtYmVyIG9mIHBhY2tldHMgdG8gc2VuZCB0byBpbmRpY2F0ZSBzdGFydCBhbmQgc3RvcCBkdG1mIGV2ZW50cyIsCisgICAgICAgICAgTUlOX1BBQ0tFVF9SRURVTkRBTkNZLCBNQVhfUEFDS0VUX1JFRFVOREFOQ1ksCisgICAgICAgICAgREVGQVVMVF9QQUNLRVRfUkVEVU5EQU5DWSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfZHRtZl9zcmNfY2hhbmdlX3N0YXRlKTsKKworICBnc3RiYXNlc3JjX2NsYXNzLT51bmxvY2sgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdG1mX3NyY191bmxvY2spOworICBnc3RiYXNlc3JjX2NsYXNzLT51bmxvY2tfc3RvcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdG1mX3NyY191bmxvY2tfc3RvcCk7CisKKyAgZ3N0YmFzZXNyY19jbGFzcy0+ZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdG1mX3NyY19oYW5kbGVfZXZlbnQpOworICBnc3RiYXNlc3JjX2NsYXNzLT5jcmVhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdG1mX3NyY19jcmVhdGUpOworICBnc3RiYXNlc3JjX2NsYXNzLT5uZWdvdGlhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdG1mX3NyY19uZWdvdGlhdGUpOworICBnc3RiYXNlc3JjX2NsYXNzLT5xdWVyeSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2R0bWZfc3JjX3F1ZXJ5KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHRtZl9zcmNfZXZlbnRfZnJlZSAoR3N0UlRQRFRNRlNyY0V2ZW50ICogZXZlbnQpCit7CisgIGlmIChldmVudCkgeworICAgIGlmIChldmVudC0+cGF5bG9hZCkKKyAgICAgIGdfc2xpY2VfZnJlZSAoR3N0UlRQRFRNRlBheWxvYWQsIGV2ZW50LT5wYXlsb2FkKTsKKyAgICBnX3NsaWNlX2ZyZWUgKEdzdFJUUERUTUZTcmNFdmVudCwgZXZlbnQpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2R0bWZfc3JjX2luaXQgKEdzdFJUUERUTUZTcmMgKiBvYmplY3QpCit7CisgIGdzdF9iYXNlX3NyY19zZXRfZm9ybWF0IChHU1RfQkFTRV9TUkMgKG9iamVjdCksIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9iYXNlX3NyY19zZXRfbGl2ZSAoR1NUX0JBU0VfU1JDIChvYmplY3QpLCBUUlVFKTsKKworICBvYmplY3QtPnNzcmMgPSBERUZBVUxUX1NTUkM7CisgIG9iamVjdC0+c2VxbnVtX29mZnNldCA9IERFRkFVTFRfU0VRTlVNX09GRlNFVDsKKyAgb2JqZWN0LT50c19vZmZzZXQgPSBERUZBVUxUX1RJTUVTVEFNUF9PRkZTRVQ7CisgIG9iamVjdC0+cHQgPSBERUZBVUxUX1BUOworICBvYmplY3QtPmNsb2NrX3JhdGUgPSBERUZBVUxUX0NMT0NLX1JBVEU7CisgIG9iamVjdC0+cHRpbWUgPSBERUZBVUxUX1BUSU1FOworICBvYmplY3QtPnBhY2tldF9yZWR1bmRhbmN5ID0gREVGQVVMVF9QQUNLRVRfUkVEVU5EQU5DWTsKKworICBvYmplY3QtPmV2ZW50X3F1ZXVlID0KKyAgICAgIGdfYXN5bmNfcXVldWVfbmV3X2Z1bGwgKChHRGVzdHJveU5vdGlmeSkgZ3N0X3J0cF9kdG1mX3NyY19ldmVudF9mcmVlKTsKKyAgb2JqZWN0LT5wYXlsb2FkID0gTlVMTDsKKworICBHU1RfREVCVUdfT0JKRUNUIChvYmplY3QsICJpbml0IGRvbmUiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHRtZl9zcmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJUUERUTUZTcmMgKmR0bWZzcmM7CisKKyAgZHRtZnNyYyA9IEdTVF9SVFBfRFRNRl9TUkMgKG9iamVjdCk7CisKKyAgaWYgKGR0bWZzcmMtPmV2ZW50X3F1ZXVlKSB7CisgICAgZ19hc3luY19xdWV1ZV91bnJlZiAoZHRtZnNyYy0+ZXZlbnRfcXVldWUpOworICAgIGR0bWZzcmMtPmV2ZW50X3F1ZXVlID0gTlVMTDsKKyAgfQorCisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF9ydHBfZHRtZl9zcmNfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9kdG1mX3NyY19oYW5kbGVfZHRtZl9ldmVudCAoR3N0UlRQRFRNRlNyYyAqIGR0bWZzcmMsCisgICAgY29uc3QgR3N0U3RydWN0dXJlICogZXZlbnRfc3RydWN0dXJlKQoreworICBnaW50IGV2ZW50X3R5cGU7CisgIGdib29sZWFuIHN0YXJ0OworICBnaW50IG1ldGhvZDsKKyAgR3N0Q2xvY2tUaW1lIGxhc3Rfc3RvcDsKKyAgZ2ludCBldmVudF9udW1iZXI7CisgIGdpbnQgZXZlbnRfdm9sdW1lOworICBnYm9vbGVhbiBjb3JyZWN0X29yZGVyOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChldmVudF9zdHJ1Y3R1cmUsICJ0eXBlIiwgJmV2ZW50X3R5cGUpIHx8CisgICAgICAhZ3N0X3N0cnVjdHVyZV9nZXRfYm9vbGVhbiAoZXZlbnRfc3RydWN0dXJlLCAic3RhcnQiLCAmc3RhcnQpIHx8CisgICAgICBldmVudF90eXBlICE9IEdTVF9SVFBfRFRNRl9UWVBFX0VWRU5UKQorICAgIGdvdG8gZmFpbHVyZTsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChldmVudF9zdHJ1Y3R1cmUsICJtZXRob2QiLCAmbWV0aG9kKSkgeworICAgIGlmIChtZXRob2QgIT0gMSkgeworICAgICAgZ290byBmYWlsdXJlOworICAgIH0KKyAgfQorCisgIGlmIChzdGFydCkKKyAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoZXZlbnRfc3RydWN0dXJlLCAibnVtYmVyIiwgJmV2ZW50X251bWJlcikgfHwKKyAgICAgICAgIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoZXZlbnRfc3RydWN0dXJlLCAidm9sdW1lIiwgJmV2ZW50X3ZvbHVtZSkpCisgICAgICBnb3RvIGZhaWx1cmU7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkdG1mc3JjKTsKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2Nsb2NrX3RpbWUgKGV2ZW50X3N0cnVjdHVyZSwgImxhc3Qtc3RvcCIsICZsYXN0X3N0b3ApKQorICAgIGR0bWZzcmMtPmxhc3Rfc3RvcCA9IGxhc3Rfc3RvcDsKKyAgZWxzZQorICAgIGR0bWZzcmMtPmxhc3Rfc3RvcCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGNvcnJlY3Rfb3JkZXIgPSAoc3RhcnQgIT0gZHRtZnNyYy0+bGFzdF9ldmVudF93YXNfc3RhcnQpOworICBkdG1mc3JjLT5sYXN0X2V2ZW50X3dhc19zdGFydCA9IHN0YXJ0OworICBHU1RfT0JKRUNUX1VOTE9DSyAoZHRtZnNyYyk7CisKKyAgaWYgKCFjb3JyZWN0X29yZGVyKQorICAgIGdvdG8gZmFpbHVyZTsKKworICBpZiAoc3RhcnQpIHsKKyAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoZXZlbnRfc3RydWN0dXJlLCAibnVtYmVyIiwgJmV2ZW50X251bWJlcikgfHwKKyAgICAgICAgIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoZXZlbnRfc3RydWN0dXJlLCAidm9sdW1lIiwgJmV2ZW50X3ZvbHVtZSkpCisgICAgICBnb3RvIGZhaWx1cmU7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdG1mc3JjLCAiUmVjZWl2ZWQgc3RhcnQgZXZlbnQgJWQgd2l0aCB2b2x1bWUgJWQiLAorICAgICAgICBldmVudF9udW1iZXIsIGV2ZW50X3ZvbHVtZSk7CisgICAgZ3N0X3J0cF9kdG1mX3NyY19hZGRfc3RhcnRfZXZlbnQgKGR0bWZzcmMsIGV2ZW50X251bWJlciwgZXZlbnRfdm9sdW1lKTsKKyAgfQorCisgIGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJSZWNlaXZlZCBzdG9wIGV2ZW50Iik7CisgICAgZ3N0X3J0cF9kdG1mX3NyY19hZGRfc3RvcF9ldmVudCAoZHRtZnNyYyk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK2ZhaWx1cmU6CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2R0bWZfc3JjX2hhbmRsZV9jdXN0b21fdXBzdHJlYW0gKEdzdFJUUERUTUZTcmMgKiBkdG1mc3JjLAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlc3VsdCA9IEZBTFNFOworICBnY2hhciAqc3RydWN0X3N0cjsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisKKyAgR3N0U3RhdGUgc3RhdGU7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICByZXQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKEdTVF9FTEVNRU5UIChkdG1mc3JjKSwgJnN0YXRlLCBOVUxMLCAwKTsKKyAgaWYgKHJldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MgfHwgc3RhdGUgIT0gR1NUX1NUQVRFX1BMQVlJTkcpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdG1mc3JjLCAiUmVjZWl2ZWQgZXZlbnQgd2hpbGUgbm90IGluIFBMQVlJTkcgc3RhdGUiKTsKKyAgICBnb3RvIHJldDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJSZWNlaXZlZCBldmVudCBpcyBvZiBvdXIgaW50ZXJlc3QiKTsKKyAgc3RydWN0dXJlID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKyAgc3RydWN0X3N0ciA9IGdzdF9zdHJ1Y3R1cmVfdG9fc3RyaW5nIChzdHJ1Y3R1cmUpOworICBHU1RfREVCVUdfT0JKRUNUIChkdG1mc3JjLCAiRXZlbnQgaGFzIHN0cnVjdHVyZSAlcyIsIHN0cnVjdF9zdHIpOworICBnX2ZyZWUgKHN0cnVjdF9zdHIpOworICBpZiAoc3RydWN0dXJlICYmIGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImR0bWYtZXZlbnQiKSkKKyAgICByZXN1bHQgPSBnc3RfcnRwX2R0bWZfc3JjX2hhbmRsZV9kdG1mX2V2ZW50IChkdG1mc3JjLCBzdHJ1Y3R1cmUpOworCityZXQ6CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9kdG1mX3NyY19oYW5kbGVfZXZlbnQgKEdzdEJhc2VTcmMgKiBiYXNlc3JjLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSVFBEVE1GU3JjICpkdG1mc3JjOworICBnYm9vbGVhbiByZXN1bHQgPSBGQUxTRTsKKworICBkdG1mc3JjID0gR1NUX1JUUF9EVE1GX1NSQyAoYmFzZXNyYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgIlJlY2VpdmVkIGFuIGV2ZW50IG9uIHRoZSBzcmMgcGFkIik7CisgIGlmIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU0pIHsKKyAgICByZXN1bHQgPSBnc3RfcnRwX2R0bWZfc3JjX2hhbmRsZV9jdXN0b21fdXBzdHJlYW0gKGR0bWZzcmMsIGV2ZW50KTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2R0bWZfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSVFBEVE1GU3JjICpkdG1mc3JjOworCisgIGR0bWZzcmMgPSBHU1RfUlRQX0RUTUZfU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9USU1FU1RBTVBfT0ZGU0VUOgorICAgICAgZHRtZnNyYy0+dHNfb2Zmc2V0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0VRTlVNX09GRlNFVDoKKyAgICAgIGR0bWZzcmMtPnNlcW51bV9vZmZzZXQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTE9DS19SQVRFOgorICAgICAgZHRtZnNyYy0+Y2xvY2tfcmF0ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGR0bWZzcmMtPmRpcnR5ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TU1JDOgorICAgICAgZHRtZnNyYy0+c3NyYyA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QVDoKKyAgICAgIGR0bWZzcmMtPnB0ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgZHRtZnNyYy0+ZGlydHkgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFRFVOREFOQ1k6CisgICAgICBkdG1mc3JjLT5wYWNrZXRfcmVkdW5kYW5jeSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHRtZl9zcmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJUUERUTUZTcmMgKmR0bWZzcmM7CisKKyAgZHRtZnNyYyA9IEdTVF9SVFBfRFRNRl9TUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1RJTUVTVEFNUF9PRkZTRVQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBkdG1mc3JjLT50c19vZmZzZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NFUU5VTV9PRkZTRVQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBkdG1mc3JjLT5zZXFudW1fb2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTE9DS19SQVRFOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIGR0bWZzcmMtPmNsb2NrX3JhdGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NTUkM6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgZHRtZnNyYy0+c3NyYyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUFQ6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgZHRtZnNyYy0+cHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RJTUVTVEFNUDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBkdG1mc3JjLT5ydHBfdGltZXN0YW1wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TRVFOVU06CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgZHRtZnNyYy0+c2VxbnVtKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRURVTkRBTkNZOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIGR0bWZzcmMtPnBhY2tldF9yZWR1bmRhbmN5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2R0bWZfcHJlcGFyZV90aW1lc3RhbXBzIChHc3RSVFBEVE1GU3JjICogZHRtZnNyYykKK3sKKyAgR3N0Q2xvY2tUaW1lIGxhc3Rfc3RvcDsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGR0bWZzcmMpOworICBsYXN0X3N0b3AgPSBkdG1mc3JjLT5sYXN0X3N0b3A7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGxhc3Rfc3RvcCkpIHsKKyAgICBkdG1mc3JjLT5zdGFydF90aW1lc3RhbXAgPSBsYXN0X3N0b3A7CisgIH0gZWxzZSB7CisgICAgR3N0Q2xvY2sgKmNsb2NrID0gZ3N0X2VsZW1lbnRfZ2V0X2Nsb2NrIChHU1RfRUxFTUVOVCAoZHRtZnNyYykpOworCisgICAgaWYgKGNsb2NrID09IE5VTEwpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBkdG1mc3JjLT5zdGFydF90aW1lc3RhbXAgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKGNsb2NrKQorICAgICAgICAtIGdzdF9lbGVtZW50X2dldF9iYXNlX3RpbWUgKEdTVF9FTEVNRU5UIChkdG1mc3JjKSk7CisgICAgZ3N0X29iamVjdF91bnJlZiAoY2xvY2spOworICB9CisKKyAgLyogSWYgdGhlIGxhc3Qgc3RvcCB3YXMgaW4gdGhlIHBhc3QsIHRoZW4gbGV0cyBhZGQgdGhlIGJ1ZmZlcnMgdG9nZXRoZXIgKi8KKyAgaWYgKGR0bWZzcmMtPnN0YXJ0X3RpbWVzdGFtcCA8IGR0bWZzcmMtPnRpbWVzdGFtcCkKKyAgICBkdG1mc3JjLT5zdGFydF90aW1lc3RhbXAgPSBkdG1mc3JjLT50aW1lc3RhbXA7CisKKyAgZHRtZnNyYy0+dGltZXN0YW1wID0gZHRtZnNyYy0+c3RhcnRfdGltZXN0YW1wOworCisgIGR0bWZzcmMtPnJ0cF90aW1lc3RhbXAgPSBkdG1mc3JjLT50c19iYXNlICsKKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJkdTVF9CQVNFX1NSQworICAgICAgICAgIChkdG1mc3JjKS0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLCBkdG1mc3JjLT50aW1lc3RhbXApLAorICAgICAgZHRtZnNyYy0+Y2xvY2tfcmF0ZSwgR1NUX1NFQ09ORCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHRtZl9zcmNfYWRkX3N0YXJ0X2V2ZW50IChHc3RSVFBEVE1GU3JjICogZHRtZnNyYywgZ2ludCBldmVudF9udW1iZXIsCisgICAgZ2ludCBldmVudF92b2x1bWUpCit7CisKKyAgR3N0UlRQRFRNRlNyY0V2ZW50ICpldmVudCA9IGdfc2xpY2VfbmV3MCAoR3N0UlRQRFRNRlNyY0V2ZW50KTsKKyAgZXZlbnQtPmV2ZW50X3R5cGUgPSBSVFBfRFRNRl9FVkVOVF9UWVBFX1NUQVJUOworCisgIGV2ZW50LT5wYXlsb2FkID0gZ19zbGljZV9uZXcwIChHc3RSVFBEVE1GUGF5bG9hZCk7CisgIGV2ZW50LT5wYXlsb2FkLT5ldmVudCA9IENMQU1QIChldmVudF9udW1iZXIsIE1JTl9FVkVOVCwgTUFYX0VWRU5UKTsKKyAgZXZlbnQtPnBheWxvYWQtPnZvbHVtZSA9IENMQU1QIChldmVudF92b2x1bWUsIE1JTl9WT0xVTUUsIE1BWF9WT0xVTUUpOworCisgIGdfYXN5bmNfcXVldWVfcHVzaCAoZHRtZnNyYy0+ZXZlbnRfcXVldWUsIGV2ZW50KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHRtZl9zcmNfYWRkX3N0b3BfZXZlbnQgKEdzdFJUUERUTUZTcmMgKiBkdG1mc3JjKQoreworCisgIEdzdFJUUERUTUZTcmNFdmVudCAqZXZlbnQgPSBnX3NsaWNlX25ldzAgKEdzdFJUUERUTUZTcmNFdmVudCk7CisgIGV2ZW50LT5ldmVudF90eXBlID0gUlRQX0RUTUZfRVZFTlRfVFlQRV9TVE9QOworCisgIGdfYXN5bmNfcXVldWVfcHVzaCAoZHRtZnNyYy0+ZXZlbnRfcXVldWUsIGV2ZW50KTsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9kdG1mX3ByZXBhcmVfcnRwX2hlYWRlcnMgKEdzdFJUUERUTUZTcmMgKiBkdG1mc3JjLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cGJ1ZikKK3sKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3NzcmMgKHJ0cGJ1ZiwgZHRtZnNyYy0+Y3VycmVudF9zc3JjKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3BheWxvYWRfdHlwZSAocnRwYnVmLCBkdG1mc3JjLT5wdCk7CisgIC8qIE9ubHkgdGhlIHZlcnkgZmlyc3QgcGFja2V0IGdldHMgYSBtYXJrZXIgKi8KKyAgaWYgKGR0bWZzcmMtPmZpcnN0X3BhY2tldCkgeworICAgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKHJ0cGJ1ZiwgVFJVRSk7CisgIH0gZWxzZSBpZiAoZHRtZnNyYy0+bGFzdF9wYWNrZXQpIHsKKyAgICBkdG1mc3JjLT5wYXlsb2FkLT5lID0gMTsKKyAgfQorCisgIGR0bWZzcmMtPnNlcW51bSsrOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfc2VxIChydHBidWYsIGR0bWZzcmMtPnNlcW51bSk7CisKKyAgLyogdGltZXN0YW1wIG9mIFJUUCBoZWFkZXIgKi8KKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3RpbWVzdGFtcCAocnRwYnVmLCBkdG1mc3JjLT5ydHBfdGltZXN0YW1wKTsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX2R0bWZfc3JjX2NyZWF0ZV9uZXh0X3J0cF9wYWNrZXQgKEdzdFJUUERUTUZTcmMgKiBkdG1mc3JjKQoreworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0UlRQRFRNRlBheWxvYWQgKnBheWxvYWQ7CisgIEdzdFJUUEJ1ZmZlciBydHBidWZmZXIgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworCisgIGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoc2l6ZW9mIChHc3RSVFBEVE1GUGF5bG9hZCksIDAsIDApOworCisgIGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQURXUklURSwgJnJ0cGJ1ZmZlcik7CisKKyAgZ3N0X3J0cF9kdG1mX3ByZXBhcmVfcnRwX2hlYWRlcnMgKGR0bWZzcmMsICZydHBidWZmZXIpOworCisgIC8qIHRpbWVzdGFtcCBhbmQgZHVyYXRpb24gb2YgR3N0QnVmZmVyICovCisgIC8qIFJlZHVuZGFudCBidWZmZXIgaGF2ZSBubyBkdXJhdGlvbiAuLi4gKi8KKyAgaWYgKGR0bWZzcmMtPnJlZHVuZGFuY3lfY291bnQgPiAxKQorICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikgPSAwOworICBlbHNlCisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKSA9IGR0bWZzcmMtPnB0aW1lICogR1NUX01TRUNPTkQ7CisgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gZHRtZnNyYy0+dGltZXN0YW1wOworCisgIHBheWxvYWQgPSAoR3N0UlRQRFRNRlBheWxvYWQgKikgZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHBidWZmZXIpOworCisgIC8qIGNvcHkgcGF5bG9hZCBhbmQgY29udmVydCB0byBuZXR3b3JrLWJ5dGUgb3JkZXIgKi8KKyAgbWVtbW92ZSAocGF5bG9hZCwgZHRtZnNyYy0+cGF5bG9hZCwgc2l6ZW9mIChHc3RSVFBEVE1GUGF5bG9hZCkpOworCisgIHBheWxvYWQtPmR1cmF0aW9uID0gZ19odG9ucyAocGF5bG9hZC0+ZHVyYXRpb24pOworCisgIGlmIChkdG1mc3JjLT5yZWR1bmRhbmN5X2NvdW50IDw9IDEgJiYgZHRtZnNyYy0+bGFzdF9wYWNrZXQpIHsKKyAgICBHc3RDbG9ja1RpbWUgaW50ZXJfZGlnaXRfaW50ZXJ2YWwgPSBNSU5fSU5URVJfRElHSVRfSU5URVJWQUw7CisKKyAgICBpZiAoaW50ZXJfZGlnaXRfaW50ZXJ2YWwgJSBkdG1mc3JjLT5wdGltZSAhPSAwKQorICAgICAgaW50ZXJfZGlnaXRfaW50ZXJ2YWwgKz0gZHRtZnNyYy0+cHRpbWUgLQorICAgICAgICAgIChNSU5fSU5URVJfRElHSVRfSU5URVJWQUwgJSBkdG1mc3JjLT5wdGltZSk7CisKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpICs9IGludGVyX2RpZ2l0X2ludGVydmFsICogR1NUX01TRUNPTkQ7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoZHRtZnNyYywgIkNyZWF0aW5nIG5ldyBidWZmZXIgd2l0aCBldmVudCAldSBkdXJhdGlvbiAiCisgICAgICAiIGdzdDogJSIgR1NUX1RJTUVfRk9STUFUICIgYXQgJSIgR1NUX1RJTUVfRk9STUFUICIocnRwIHRzOiV1IGR1cjoldSkiLAorICAgICAgZHRtZnNyYy0+cGF5bG9hZC0+ZXZlbnQsIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikpLCBkdG1mc3JjLT5ydHBfdGltZXN0YW1wLAorICAgICAgZHRtZnNyYy0+cGF5bG9hZC0+ZHVyYXRpb24pOworCisgIC8qIGR1cmF0aW9uIG9mIERUTUYgcGF5bG9hZGZvciB0aGUgTkVYVCBwYWNrZXQgKi8KKyAgLyogbm90IHVwZGF0ZWQgZm9yIHJlZHVuZGFudCBwYWNrZXRzICovCisgIGlmIChkdG1mc3JjLT5yZWR1bmRhbmN5X2NvdW50IDw9IDEpCisgICAgZHRtZnNyYy0+cGF5bG9hZC0+ZHVyYXRpb24gKz0gZHRtZnNyYy0+cHRpbWUgKiBkdG1mc3JjLT5jbG9ja19yYXRlIC8gMTAwMDsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGR0bWZzcmMtPnRpbWVzdGFtcCkpCisgICAgZHRtZnNyYy0+dGltZXN0YW1wICs9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1Zik7CisKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHBidWZmZXIpOworCisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBHc3RNZXNzYWdlICoKK2dzdF9kdG1mX3NyY19wcmVwYXJlX21lc3NhZ2UgKEdzdFJUUERUTUZTcmMgKiBkdG1mc3JjLAorICAgIGNvbnN0IGdjaGFyICogbWVzc2FnZV9uYW1lLCBHc3RSVFBEVE1GU3JjRXZlbnQgKiBldmVudCkKK3sKKyAgR3N0U3RydWN0dXJlICpzOworCisgIHN3aXRjaCAoZXZlbnQtPmV2ZW50X3R5cGUpIHsKKyAgICBjYXNlIFJUUF9EVE1GX0VWRU5UX1RZUEVfU1RBUlQ6CisgICAgICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKG1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAidHlwZSIsIEdfVFlQRV9JTlQsIDEsCisgICAgICAgICAgIm1ldGhvZCIsIEdfVFlQRV9JTlQsIDEsCisgICAgICAgICAgInN0YXJ0IiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsCisgICAgICAgICAgIm51bWJlciIsIEdfVFlQRV9JTlQsIGV2ZW50LT5wYXlsb2FkLT5ldmVudCwKKyAgICAgICAgICAidm9sdW1lIiwgR19UWVBFX0lOVCwgZXZlbnQtPnBheWxvYWQtPnZvbHVtZSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJUUF9EVE1GX0VWRU5UX1RZUEVfU1RPUDoKKyAgICAgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAobWVzc2FnZV9uYW1lLAorICAgICAgICAgICJ0eXBlIiwgR19UWVBFX0lOVCwgMSwgIm1ldGhvZCIsIEdfVFlQRV9JTlQsIDEsCisgICAgICAgICAgInN0YXJ0IiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUlRQX0RUTUZfRVZFTlRfVFlQRV9QQVVTRV9UQVNLOgorICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIGdzdF9tZXNzYWdlX25ld19lbGVtZW50IChHU1RfT0JKRUNUIChkdG1mc3JjKSwgcyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHRtZl9zcmNfcG9zdF9tZXNzYWdlIChHc3RSVFBEVE1GU3JjICogZHRtZnNyYywgY29uc3QgZ2NoYXIgKiBtZXNzYWdlX25hbWUsCisgICAgR3N0UlRQRFRNRlNyY0V2ZW50ICogZXZlbnQpCit7CisgIEdzdE1lc3NhZ2UgKm0gPSBnc3RfZHRtZl9zcmNfcHJlcGFyZV9tZXNzYWdlIChkdG1mc3JjLCBtZXNzYWdlX25hbWUsIGV2ZW50KTsKKworCisgIGlmIChtKQorICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKGR0bWZzcmMpLCBtKTsKK30KKworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9kdG1mX3NyY19jcmVhdGUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjLCBndWludDY0IG9mZnNldCwKKyAgICBndWludCBsZW5ndGgsIEdzdEJ1ZmZlciAqKiBidWZmZXIpCit7CisgIEdzdFJUUERUTUZTcmNFdmVudCAqZXZlbnQ7CisgIEdzdFJUUERUTUZTcmMgKmR0bWZzcmM7CisgIEdzdENsb2NrICpjbG9jazsKKyAgR3N0Q2xvY2tJRCAqY2xvY2tpZDsKKyAgR3N0Q2xvY2tSZXR1cm4gY2xvY2tyZXQ7CisgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisgIEdRdWV1ZSBtZXNzYWdlcyA9IEdfUVVFVUVfSU5JVDsKKworICBkdG1mc3JjID0gR1NUX1JUUF9EVE1GX1NSQyAoYmFzZXNyYyk7CisKKyAgZG8geworCisgICAgaWYgKGR0bWZzcmMtPnBheWxvYWQgPT0gTlVMTCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgInBvcHBpbmciKTsKKyAgICAgIGV2ZW50ID0gZ19hc3luY19xdWV1ZV9wb3AgKGR0bWZzcmMtPmV2ZW50X3F1ZXVlKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgInBvcHBlZCAlZCIsIGV2ZW50LT5ldmVudF90eXBlKTsKKworICAgICAgc3dpdGNoIChldmVudC0+ZXZlbnRfdHlwZSkgeworICAgICAgICBjYXNlIFJUUF9EVE1GX0VWRU5UX1RZUEVfU1RPUDoKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGR0bWZzcmMsCisgICAgICAgICAgICAgICJSZWNlaXZlZCBhIERUTUYgc3RvcCBldmVudCB3aGVuIGFscmVhZHkgc3RvcHBlZCIpOworICAgICAgICAgIGdzdF9kdG1mX3NyY19wb3N0X21lc3NhZ2UgKGR0bWZzcmMsICJkdG1mLWV2ZW50LWRyb3BwZWQiLCBldmVudCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSVFBfRFRNRl9FVkVOVF9UWVBFX1NUQVJUOgorICAgICAgICAgIGR0bWZzcmMtPmZpcnN0X3BhY2tldCA9IFRSVUU7CisgICAgICAgICAgZHRtZnNyYy0+bGFzdF9wYWNrZXQgPSBGQUxTRTsKKyAgICAgICAgICAvKiBTZXQgdGhlIHJlZHVuZGFuY3kgb24gdGhlIGZpcnN0IHBhY2tldCAqLworICAgICAgICAgIGR0bWZzcmMtPnJlZHVuZGFuY3lfY291bnQgPSBkdG1mc3JjLT5wYWNrZXRfcmVkdW5kYW5jeTsKKyAgICAgICAgICBpZiAoIWdzdF9ydHBfZHRtZl9wcmVwYXJlX3RpbWVzdGFtcHMgKGR0bWZzcmMpKQorICAgICAgICAgICAgZ290byBub19jbG9jazsKKworICAgICAgICAgIGdfcXVldWVfcHVzaF90YWlsICgmbWVzc2FnZXMsCisgICAgICAgICAgICAgIGdzdF9kdG1mX3NyY19wcmVwYXJlX21lc3NhZ2UgKGR0bWZzcmMsICJkdG1mLWV2ZW50LXByb2Nlc3NlZCIsCisgICAgICAgICAgICAgICAgICBldmVudCkpOworICAgICAgICAgIGR0bWZzcmMtPnBheWxvYWQgPSBldmVudC0+cGF5bG9hZDsKKyAgICAgICAgICBkdG1mc3JjLT5wYXlsb2FkLT5kdXJhdGlvbiA9CisgICAgICAgICAgICAgIGR0bWZzcmMtPnB0aW1lICogZHRtZnNyYy0+Y2xvY2tfcmF0ZSAvIDEwMDA7CisgICAgICAgICAgZXZlbnQtPnBheWxvYWQgPSBOVUxMOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUlRQX0RUTUZfRVZFTlRfVFlQRV9QQVVTRV9UQVNLOgorICAgICAgICAgIC8qCisgICAgICAgICAgICogV2UncmUgcHVzaGluZyBpdCBiYWNrIGJlY2F1c2UgaXQgaGFzIHRvIHN0YXkgaW4gdGhlcmUgdW50aWwKKyAgICAgICAgICAgKiB0aGUgdGFzayBpcyByZWFsbHkgcGF1c2VkIChhbmQgdGhlIHF1ZXVlIHdpbGwgdGhlbiBiZSBmbHVzaGVkCisgICAgICAgICAgICovCisgICAgICAgICAgR1NUX09CSkVDVF9MT0NLIChkdG1mc3JjKTsKKyAgICAgICAgICBpZiAoZHRtZnNyYy0+cGF1c2VkKSB7CisgICAgICAgICAgICBnX2FzeW5jX3F1ZXVlX3B1c2ggKGR0bWZzcmMtPmV2ZW50X3F1ZXVlLCBldmVudCk7CisgICAgICAgICAgICBnb3RvIHBhdXNlZF9sb2NrZWQ7CisgICAgICAgICAgfQorICAgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZ3N0X3J0cF9kdG1mX3NyY19ldmVudF9mcmVlIChldmVudCk7CisgICAgfSBlbHNlIGlmICghZHRtZnNyYy0+Zmlyc3RfcGFja2V0ICYmICFkdG1mc3JjLT5sYXN0X3BhY2tldCAmJgorICAgICAgICAoZHRtZnNyYy0+dGltZXN0YW1wIC0gZHRtZnNyYy0+c3RhcnRfdGltZXN0YW1wKSAvIEdTVF9NU0VDT05EID49CisgICAgICAgIE1JTl9QVUxTRV9EVVJBVElPTikgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgInRyeSBwb3BwaW5nIik7CisgICAgICBldmVudCA9IGdfYXN5bmNfcXVldWVfdHJ5X3BvcCAoZHRtZnNyYy0+ZXZlbnRfcXVldWUpOworCisKKyAgICAgIGlmIChldmVudCAhPSBOVUxMKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJ0cnkgcG9wcGVkICVkIiwgZXZlbnQtPmV2ZW50X3R5cGUpOworCisgICAgICAgIHN3aXRjaCAoZXZlbnQtPmV2ZW50X3R5cGUpIHsKKyAgICAgICAgICBjYXNlIFJUUF9EVE1GX0VWRU5UX1RZUEVfU1RBUlQ6CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGR0bWZzcmMsCisgICAgICAgICAgICAgICAgIlJlY2VpdmVkIHR3byBjb25zZWN1dGl2ZSBEVE1GIHN0YXJ0IGV2ZW50cyIpOworICAgICAgICAgICAgZ3N0X2R0bWZfc3JjX3Bvc3RfbWVzc2FnZSAoZHRtZnNyYywgImR0bWYtZXZlbnQtZHJvcHBlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBSVFBfRFRNRl9FVkVOVF9UWVBFX1NUT1A6CisgICAgICAgICAgICBkdG1mc3JjLT5maXJzdF9wYWNrZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGR0bWZzcmMtPmxhc3RfcGFja2V0ID0gVFJVRTsKKyAgICAgICAgICAgIC8qIFNldCB0aGUgcmVkdW5kYW5jeSBvbiB0aGUgbGFzdCBwYWNrZXQgKi8KKyAgICAgICAgICAgIGR0bWZzcmMtPnJlZHVuZGFuY3lfY291bnQgPSBkdG1mc3JjLT5wYWNrZXRfcmVkdW5kYW5jeTsKKyAgICAgICAgICAgIGdfcXVldWVfcHVzaF90YWlsICgmbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgZ3N0X2R0bWZfc3JjX3ByZXBhcmVfbWVzc2FnZSAoZHRtZnNyYywgImR0bWYtZXZlbnQtcHJvY2Vzc2VkIiwKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBSVFBfRFRNRl9FVkVOVF9UWVBFX1BBVVNFX1RBU0s6CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogV2UncmUgcHVzaGluZyBpdCBiYWNrIGJlY2F1c2UgaXQgaGFzIHRvIHN0YXkgaW4gdGhlcmUgdW50aWwKKyAgICAgICAgICAgICAqIHRoZSB0YXNrIGlzIHJlYWxseSBwYXVzZWQgKGFuZCB0aGUgcXVldWUgd2lsbCB0aGVuIGJlIGZsdXNoZWQpCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJwdXNoaW5nIHBhdXNlX3Rhc2suLi4iKTsKKyAgICAgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZHRtZnNyYyk7CisgICAgICAgICAgICBpZiAoZHRtZnNyYy0+cGF1c2VkKSB7CisgICAgICAgICAgICAgIGdfYXN5bmNfcXVldWVfcHVzaCAoZHRtZnNyYy0+ZXZlbnRfcXVldWUsIGV2ZW50KTsKKyAgICAgICAgICAgICAgZ290byBwYXVzZWRfbG9ja2VkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGR0bWZzcmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZ3N0X3J0cF9kdG1mX3NyY19ldmVudF9mcmVlIChldmVudCk7CisgICAgICB9CisgICAgfQorICB9IHdoaWxlIChkdG1mc3JjLT5wYXlsb2FkID09IE5VTEwpOworCisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgIlByb2Nlc3NlZCBldmVudHMsIG5vdyBsZXRzIHdhaXQgb24gdGhlIGNsb2NrIik7CisKKyAgY2xvY2sgPSBnc3RfZWxlbWVudF9nZXRfY2xvY2sgKEdTVF9FTEVNRU5UIChiYXNlc3JjKSk7CisgIGlmICghY2xvY2spCisgICAgZ290byBub19jbG9jazsKKyAgY2xvY2tpZCA9IGdzdF9jbG9ja19uZXdfc2luZ2xlX3Nob3RfaWQgKGNsb2NrLCBkdG1mc3JjLT50aW1lc3RhbXAgKworICAgICAgZ3N0X2VsZW1lbnRfZ2V0X2Jhc2VfdGltZSAoR1NUX0VMRU1FTlQgKGR0bWZzcmMpKSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGNsb2NrKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGR0bWZzcmMpOworICBpZiAoIWR0bWZzcmMtPnBhdXNlZCkgeworICAgIGR0bWZzcmMtPmNsb2NraWQgPSBjbG9ja2lkOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKworICAgIGNsb2NrcmV0ID0gZ3N0X2Nsb2NrX2lkX3dhaXQgKGNsb2NraWQsIE5VTEwpOworCisgICAgR1NUX09CSkVDVF9MT0NLIChkdG1mc3JjKTsKKyAgICBpZiAoZHRtZnNyYy0+cGF1c2VkKQorICAgICAgY2xvY2tyZXQgPSBHU1RfQ0xPQ0tfVU5TQ0hFRFVMRUQ7CisgIH0gZWxzZSB7CisgICAgY2xvY2tyZXQgPSBHU1RfQ0xPQ0tfVU5TQ0hFRFVMRUQ7CisgIH0KKyAgZ3N0X2Nsb2NrX2lkX3VucmVmIChjbG9ja2lkKTsKKyAgZHRtZnNyYy0+Y2xvY2tpZCA9IE5VTEw7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKworICB3aGlsZSAoKG1lc3NhZ2UgPSBnX3F1ZXVlX3BvcF9oZWFkICgmbWVzc2FnZXMpKSAhPSBOVUxMKQorICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKGR0bWZzcmMpLCBtZXNzYWdlKTsKKworICBpZiAoY2xvY2tyZXQgPT0gR1NUX0NMT0NLX1VOU0NIRURVTEVEKSB7CisgICAgZ290byBwYXVzZWQ7CisgIH0KKworc2VuZF9sYXN0OgorCisgIGlmIChkdG1mc3JjLT5kaXJ0eSkKKyAgICBpZiAoIWdzdF9ydHBfZHRtZl9zcmNfbmVnb3RpYXRlIChiYXNlc3JjKSkKKyAgICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKworICAvKiBjcmVhdGUgYnVmZmVyIHRvIGhvbGQgdGhlIHBheWxvYWQgKi8KKyAgKmJ1ZmZlciA9IGdzdF9ydHBfZHRtZl9zcmNfY3JlYXRlX25leHRfcnRwX3BhY2tldCAoZHRtZnNyYyk7CisKKyAgaWYgKGR0bWZzcmMtPnJlZHVuZGFuY3lfY291bnQpCisgICAgZHRtZnNyYy0+cmVkdW5kYW5jeV9jb3VudC0tOworCisgIC8qIE9ubHkgdGhlIHZlcnkgZmlyc3Qgb25lIGhhcyBhIG1hcmtlciAqLworICBkdG1mc3JjLT5maXJzdF9wYWNrZXQgPSBGQUxTRTsKKworICAvKiBUaGlzIGlzIHRoZSBlbmQgb2YgdGhlIGV2ZW50ICovCisgIGlmIChkdG1mc3JjLT5sYXN0X3BhY2tldCA9PSBUUlVFICYmIGR0bWZzcmMtPnJlZHVuZGFuY3lfY291bnQgPT0gMCkgeworCisgICAgZ19zbGljZV9mcmVlIChHc3RSVFBEVE1GUGF5bG9hZCwgZHRtZnNyYy0+cGF5bG9hZCk7CisgICAgZHRtZnNyYy0+cGF5bG9hZCA9IE5VTEw7CisKKyAgICBkdG1mc3JjLT5sYXN0X3BhY2tldCA9IEZBTFNFOworICB9CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCitwYXVzZWRfbG9ja2VkOgorCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKworcGF1c2VkOgorCisgIGlmIChkdG1mc3JjLT5wYXlsb2FkKSB7CisgICAgZHRtZnNyYy0+Zmlyc3RfcGFja2V0ID0gRkFMU0U7CisgICAgZHRtZnNyYy0+bGFzdF9wYWNrZXQgPSBUUlVFOworICAgIC8qIFNldCB0aGUgcmVkdW5kYW5jIG9uIHRoZSBsYXN0IHBhY2tldCAqLworICAgIGR0bWZzcmMtPnJlZHVuZGFuY3lfY291bnQgPSBkdG1mc3JjLT5wYWNrZXRfcmVkdW5kYW5jeTsKKyAgICBnb3RvIHNlbmRfbGFzdDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRkxVU0hJTkc7CisgIH0KKworbm9fY2xvY2s6CisgIEdTVF9FTEVNRU5UX0VSUk9SIChkdG1mc3JjLCBTVFJFQU0sIE1VWCwgKCJObyBhdmFpbGFibGUgY2xvY2siKSwKKyAgICAgICgiTm8gYXZhaWxhYmxlIGNsb2NrIikpOworICBnc3RfcGFkX3BhdXNlX3Rhc2sgKEdTVF9CQVNFX1NSQ19QQUQgKGR0bWZzcmMpKTsKKyAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9kdG1mX3NyY19uZWdvdGlhdGUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKQoreworICBHc3RDYXBzICpzcmNjYXBzLCAqcGVlcmNhcHM7CisgIEdzdFJUUERUTUZTcmMgKmR0bWZzcmMgPSBHU1RfUlRQX0RUTUZfU1JDIChiYXNlc3JjKTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIC8qIGZpbGwgaW4gdGhlIGRlZmF1bHRzLCB0aGVyZSBwcm9wZXJ0aWVzIGNhbm5vdCBiZSBuZWdvdGlhdGVkLiAqLworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtcnRwIiwKKyAgICAgICJtZWRpYSIsIEdfVFlQRV9TVFJJTkcsICJhdWRpbyIsCisgICAgICAiZW5jb2RpbmctbmFtZSIsIEdfVFlQRV9TVFJJTkcsICJURUxFUEhPTkUtRVZFTlQiLCBOVUxMKTsKKworICAvKiB0aGUgcGVlciBjYXBzIGNhbiBvdmVycmlkZSBzb21lIG9mIHRoZSBkZWZhdWx0cyAqLworICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChHU1RfQkFTRV9TUkNfUEFEIChiYXNlc3JjKSwgTlVMTCk7CisgIGlmIChwZWVyY2FwcyA9PSBOVUxMKSB7CisgICAgLyogbm8gcGVlciBjYXBzLCBqdXN0IGFkZCB0aGUgb3RoZXIgcHJvcGVydGllcyAqLworICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKHNyY2NhcHMsCisgICAgICAgICJwYXlsb2FkIiwgR19UWVBFX0lOVCwgZHRtZnNyYy0+cHQsCisgICAgICAgICJzc3JjIiwgR19UWVBFX1VJTlQsIGR0bWZzcmMtPmN1cnJlbnRfc3NyYywKKyAgICAgICAgInRpbWVzdGFtcC1vZmZzZXQiLCBHX1RZUEVfVUlOVCwgZHRtZnNyYy0+dHNfYmFzZSwKKyAgICAgICAgImNsb2NrLXJhdGUiLCBHX1RZUEVfSU5ULCBkdG1mc3JjLT5jbG9ja19yYXRlLAorICAgICAgICAic2VxbnVtLW9mZnNldCIsIEdfVFlQRV9VSU5ULCBkdG1mc3JjLT5zZXFudW1fYmFzZSwgTlVMTCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdG1mc3JjLCAibm8gcGVlciBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgc3JjY2Fwcyk7CisgIH0gZWxzZSB7CisgICAgR3N0Q2FwcyAqdGVtcDsKKyAgICBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgY29uc3QgR1ZhbHVlICp2YWx1ZTsKKyAgICBnaW50IHB0OworICAgIGdpbnQgY2xvY2tfcmF0ZTsKKworICAgIC8qIHBlZXIgcHJvdmlkZXMgY2FwcyB3ZSBjYW4gdXNlIHRvIGZpeGF0ZSwgaW50ZXJzZWN0LiBUaGlzIGFsd2F5cyByZXR1cm5zIGEKKyAgICAgKiB3cml0YWJsZSBjYXBzLiAqLworICAgIHRlbXAgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHNyY2NhcHMsIHBlZXJjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKworICAgIGlmICghdGVtcCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgIkNvdWxkIG5vdCBnZXQgaW50ZXJzZWN0aW9uIHdpdGggcGVlciBjYXBzIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5ICh0ZW1wKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgIkludGVyc2VjdGlvbiB3aXRoIHBlZXIgY2FwcyBpcyBlbXB0eSIpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHRlbXApOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIG5vdyBmaXhhdGUsIHN0YXJ0IGJ5IHRha2luZyB0aGUgZmlyc3QgY2FwcyAqLworICAgIHRlbXAgPSBnc3RfY2Fwc190cnVuY2F0ZSAodGVtcCk7CisgICAgdGVtcCA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKHRlbXApOworICAgIHNyY2NhcHMgPSB0ZW1wOworCisgICAgLyogZ2V0IGZpcnN0IHN0cnVjdHVyZSAqLworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChzcmNjYXBzLCAwKTsKKworICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJwYXlsb2FkIiwgJnB0KSkgeworICAgICAgLyogdXNlIHBlZXIgcHQgKi8KKyAgICAgIGR0bWZzcmMtPnB0ID0gcHQ7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZHRtZnNyYywgInVzaW5nIHBlZXIgcHQgJWQiLCBwdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgInBheWxvYWQiKSkgeworICAgICAgICAvKiBjYW4gb25seSBmaXhhdGUgaWYgdGhlcmUgaXMgYSBmaWVsZCAqLworICAgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAocywgInBheWxvYWQiLCBkdG1mc3JjLT5wdCk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgInBheWxvYWQiLCAmcHQpOworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZHRtZnNyYywgInVzaW5nIHBlZXIgcHQgJWQiLCBwdCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBubyBwdCBmaWVsZCwgdXNlIHRoZSBpbnRlcm5hbCBwdCAqLworICAgICAgICBwdCA9IGR0bWZzcmMtPnB0OworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgInBheWxvYWQiLCBHX1RZUEVfSU5ULCBwdCwgTlVMTCk7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAidXNpbmcgaW50ZXJuYWwgcHQgJWQiLCBwdCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpIHsKKyAgICAgIGR0bWZzcmMtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGR0bWZzcmMsICJ1c2luZyBjbG9jay1yYXRlIGZyb20gY2FwcyAlZCIsCisgICAgICAgICAgZHRtZnNyYy0+Y2xvY2tfcmF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAidXNpbmcgZXhpc3RpbmcgY2xvY2stcmF0ZSAlZCIsCisgICAgICAgICAgZHRtZnNyYy0+Y2xvY2tfcmF0ZSk7CisgICAgfQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiY2xvY2stcmF0ZSIsIEdfVFlQRV9JTlQsIGR0bWZzcmMtPmNsb2NrX3JhdGUsIE5VTEwpOworCisKKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGRfdHlwZWQgKHMsICJzc3JjIiwgR19UWVBFX1VJTlQpKSB7CisgICAgICB2YWx1ZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAic3NyYyIpOworICAgICAgZHRtZnNyYy0+Y3VycmVudF9zc3JjID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGR0bWZzcmMsICJ1c2luZyBwZWVyIHNzcmMgJTA4eCIsIGR0bWZzcmMtPmN1cnJlbnRfc3NyYyk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEZJWE1FLCBmaXhhdGVfbmVhcmVzdF91aW50IHdvdWxkIGJlIGV2ZW4gYmV0dGVyICovCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgInNzcmMiLCBHX1RZUEVfVUlOVCwgZHRtZnNyYy0+Y3VycmVudF9zc3JjLCBOVUxMKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAidXNpbmcgaW50ZXJuYWwgc3NyYyAlMDh4IiwKKyAgICAgICAgICBkdG1mc3JjLT5jdXJyZW50X3NzcmMpOworICAgIH0KKworICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZF90eXBlZCAocywgInRpbWVzdGFtcC1vZmZzZXQiLCBHX1RZUEVfVUlOVCkpIHsKKyAgICAgIHZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJ0aW1lc3RhbXAtb2Zmc2V0Iik7CisgICAgICBkdG1mc3JjLT50c19iYXNlID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGR0bWZzcmMsICJ1c2luZyBwZWVyIHRpbWVzdGFtcC1vZmZzZXQgJXUiLAorICAgICAgICAgIGR0bWZzcmMtPnRzX2Jhc2UpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBGSVhNRSwgZml4YXRlX25lYXJlc3RfdWludCB3b3VsZCBiZSBldmVuIGJldHRlciAqLworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJ0aW1lc3RhbXAtb2Zmc2V0IiwgR19UWVBFX1VJTlQsIGR0bWZzcmMtPnRzX2Jhc2UsCisgICAgICAgICAgTlVMTCk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZHRtZnNyYywgInVzaW5nIGludGVybmFsIHRpbWVzdGFtcC1vZmZzZXQgJXUiLAorICAgICAgICAgIGR0bWZzcmMtPnRzX2Jhc2UpOworICAgIH0KKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGRfdHlwZWQgKHMsICJzZXFudW0tb2Zmc2V0IiwgR19UWVBFX1VJTlQpKSB7CisgICAgICB2YWx1ZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAic2VxbnVtLW9mZnNldCIpOworICAgICAgZHRtZnNyYy0+c2VxbnVtX2Jhc2UgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZHRtZnNyYywgInVzaW5nIHBlZXIgc2VxbnVtLW9mZnNldCAldSIsCisgICAgICAgICAgZHRtZnNyYy0+c2VxbnVtX2Jhc2UpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBGSVhNRSwgZml4YXRlX25lYXJlc3RfdWludCB3b3VsZCBiZSBldmVuIGJldHRlciAqLworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJzZXFudW0tb2Zmc2V0IiwgR19UWVBFX1VJTlQsIGR0bWZzcmMtPnNlcW51bV9iYXNlLAorICAgICAgICAgIE5VTEwpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGR0bWZzcmMsICJ1c2luZyBpbnRlcm5hbCBzZXFudW0tb2Zmc2V0ICV1IiwKKyAgICAgICAgICBkdG1mc3JjLT5zZXFudW1fYmFzZSk7CisgICAgfQorCisgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkX3R5cGVkIChzLCAicHRpbWUiLCBHX1RZUEVfVUlOVCkpIHsKKyAgICAgIHZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJwdGltZSIpOworICAgICAgZHRtZnNyYy0+cHRpbWUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZHRtZnNyYywgInVzaW5nIHBlZXIgcHRpbWUgJXUiLCBkdG1mc3JjLT5wdGltZSk7CisgICAgfSBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZF90eXBlZCAocywgIm1heHB0aW1lIiwgR19UWVBFX1VJTlQpKSB7CisgICAgICB2YWx1ZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAibWF4cHRpbWUiKTsKKyAgICAgIGR0bWZzcmMtPnB0aW1lID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGR0bWZzcmMsICJ1c2luZyBwZWVyIG1heHB0aW1lIGFzIHB0aW1lICV1IiwKKyAgICAgICAgICBkdG1mc3JjLT5wdGltZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEZJWE1FLCBmaXhhdGVfbmVhcmVzdF91aW50IHdvdWxkIGJlIGV2ZW4gYmV0dGVyICovCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgInB0aW1lIiwgR19UWVBFX1VJTlQsIGR0bWZzcmMtPnB0aW1lLCBOVUxMKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkdG1mc3JjLCAidXNpbmcgaW50ZXJuYWwgcHRpbWUgJXUiLCBkdG1mc3JjLT5wdGltZSk7CisgICAgfQorCisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkdG1mc3JjLCAid2l0aCBwZWVyIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBzcmNjYXBzKTsKKyAgfQorCisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9CQVNFX1NSQ19QQUQgKGJhc2VzcmMpLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIGR0bWZzcmMtPmRpcnR5ID0gRkFMU0U7CisKKyAgcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfZHRtZl9zcmNfcXVlcnkgKEdzdEJhc2VTcmMgKiBiYXNlc3JjLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RSVFBEVE1GU3JjICpkdG1mc3JjID0gR1NUX1JUUF9EVE1GX1NSQyAoYmFzZXNyYyk7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0xBVEVOQ1k6CisgICAgeworICAgICAgR3N0Q2xvY2tUaW1lIGxhdGVuY3k7CisKKyAgICAgIGxhdGVuY3kgPSBkdG1mc3JjLT5wdGltZSAqIEdTVF9NU0VDT05EOworICAgICAgZ3N0X3F1ZXJ5X3NldF9sYXRlbmN5IChxdWVyeSwgZ3N0X2Jhc2Vfc3JjX2lzX2xpdmUgKGJhc2VzcmMpLCBsYXRlbmN5LAorICAgICAgICAgIEdTVF9DTE9DS19USU1FX05PTkUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgIlJlcG9ydGluZyBsYXRlbmN5IG9mICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChsYXRlbmN5KSk7CisgICAgICByZXMgPSBUUlVFOworICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBHU1RfQkFTRV9TUkNfQ0xBU1MgKGdzdF9ydHBfZHRtZl9zcmNfcGFyZW50X2NsYXNzKS0+cXVlcnkgKGJhc2VzcmMsCisgICAgICAgICAgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9kdG1mX3NyY19yZWFkeV90b19wYXVzZWQgKEdzdFJUUERUTUZTcmMgKiBkdG1mc3JjKQoreworICBpZiAoZHRtZnNyYy0+c3NyYyA9PSAtMSkKKyAgICBkdG1mc3JjLT5jdXJyZW50X3NzcmMgPSBnX3JhbmRvbV9pbnQgKCk7CisgIGVsc2UKKyAgICBkdG1mc3JjLT5jdXJyZW50X3NzcmMgPSBkdG1mc3JjLT5zc3JjOworCisgIGlmIChkdG1mc3JjLT5zZXFudW1fb2Zmc2V0ID09IC0xKQorICAgIGR0bWZzcmMtPnNlcW51bV9iYXNlID0gZ19yYW5kb21faW50X3JhbmdlICgwLCBHX01BWFVJTlQxNik7CisgIGVsc2UKKyAgICBkdG1mc3JjLT5zZXFudW1fYmFzZSA9IGR0bWZzcmMtPnNlcW51bV9vZmZzZXQ7CisgIGR0bWZzcmMtPnNlcW51bSA9IGR0bWZzcmMtPnNlcW51bV9iYXNlOworCisgIGlmIChkdG1mc3JjLT50c19vZmZzZXQgPT0gLTEpCisgICAgZHRtZnNyYy0+dHNfYmFzZSA9IGdfcmFuZG9tX2ludCAoKTsKKyAgZWxzZQorICAgIGR0bWZzcmMtPnRzX2Jhc2UgPSBkdG1mc3JjLT50c19vZmZzZXQ7CisKKyAgZHRtZnNyYy0+dGltZXN0YW1wID0gMDsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2R0bWZfc3JjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJUUERUTUZTcmMgKmR0bWZzcmM7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJlc3VsdDsKKyAgZ2Jvb2xlYW4gbm9fcHJlcm9sbCA9IEZBTFNFOworICBHc3RSVFBEVE1GU3JjRXZlbnQgKmV2ZW50ID0gTlVMTDsKKworICBkdG1mc3JjID0gR1NUX1JUUF9EVE1GX1NSQyAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGdzdF9ydHBfZHRtZl9zcmNfcmVhZHlfdG9fcGF1c2VkIChkdG1mc3JjKTsKKworICAgICAgLyogRmx1c2hpbmcgdGhlIGV2ZW50IHF1ZXVlICovCisgICAgICB3aGlsZSAoKGV2ZW50ID0gZ19hc3luY19xdWV1ZV90cnlfcG9wIChkdG1mc3JjLT5ldmVudF9xdWV1ZSkpICE9IE5VTEwpIHsKKyAgICAgICAgZ3N0X2R0bWZfc3JjX3Bvc3RfbWVzc2FnZSAoZHRtZnNyYywgImR0bWYtZXZlbnQtZHJvcHBlZCIsIGV2ZW50KTsKKyAgICAgICAgZ3N0X3J0cF9kdG1mX3NyY19ldmVudF9mcmVlIChldmVudCk7CisgICAgICB9CisgICAgICBkdG1mc3JjLT5sYXN0X2V2ZW50X3dhc19zdGFydCA9IEZBTFNFOworCisgICAgICBub19wcmVyb2xsID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmICgocmVzdWx0ID0KKyAgICAgICAgICBHU1RfRUxFTUVOVF9DTEFTUyAoZ3N0X3J0cF9kdG1mX3NyY19wYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUKKyAgICAgICAgICAoZWxlbWVudCwgdHJhbnNpdGlvbikpID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICBnb3RvIGZhaWx1cmU7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgbm9fcHJlcm9sbCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorCisgICAgICAvKiBGbHVzaGluZyB0aGUgZXZlbnQgcXVldWUgKi8KKyAgICAgIHdoaWxlICgoZXZlbnQgPSBnX2FzeW5jX3F1ZXVlX3RyeV9wb3AgKGR0bWZzcmMtPmV2ZW50X3F1ZXVlKSkgIT0gTlVMTCkgeworICAgICAgICBnc3RfZHRtZl9zcmNfcG9zdF9tZXNzYWdlIChkdG1mc3JjLCAiZHRtZi1ldmVudC1kcm9wcGVkIiwgZXZlbnQpOworICAgICAgICBnc3RfcnRwX2R0bWZfc3JjX2V2ZW50X2ZyZWUgKGV2ZW50KTsKKyAgICAgIH0KKyAgICAgIGR0bWZzcmMtPmxhc3RfZXZlbnRfd2FzX3N0YXJ0ID0gRkFMU0U7CisKKyAgICAgIC8qIEluZGljYXRlIHRoYXQgd2UgZG9uJ3QgZG8gUFJFX1JPTEwgKi8KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKG5vX3ByZXJvbGwgJiYgcmVzdWx0ID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUykKKyAgICByZXN1bHQgPSBHU1RfU1RBVEVfQ0hBTkdFX05PX1BSRVJPTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsKKworICAvKiBFUlJPUlMgKi8KK2ZhaWx1cmU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkdG1mc3JjLCAicGFyZW50IGZhaWxlZCBzdGF0ZSBjaGFuZ2UiKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2R0bWZfc3JjX3VubG9jayAoR3N0QmFzZVNyYyAqIHNyYykKK3sKKyAgR3N0UlRQRFRNRlNyYyAqZHRtZnNyYyA9IEdTVF9SVFBfRFRNRl9TUkMgKHNyYyk7CisgIEdzdFJUUERUTUZTcmNFdmVudCAqZXZlbnQgPSBOVUxMOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJDYWxsZWQgdW5sb2NrIik7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkdG1mc3JjKTsKKyAgZHRtZnNyYy0+cGF1c2VkID0gVFJVRTsKKyAgaWYgKGR0bWZzcmMtPmNsb2NraWQpIHsKKyAgICBnc3RfY2xvY2tfaWRfdW5zY2hlZHVsZSAoZHRtZnNyYy0+Y2xvY2tpZCk7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGR0bWZzcmMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGR0bWZzcmMsICJQdXNoaW5nIHRoZSBQQVVTRV9UQVNLIGV2ZW50IG9uIHVubG9jayByZXF1ZXN0Iik7CisgIGV2ZW50ID0gZ19zbGljZV9uZXcwIChHc3RSVFBEVE1GU3JjRXZlbnQpOworICBldmVudC0+ZXZlbnRfdHlwZSA9IFJUUF9EVE1GX0VWRU5UX1RZUEVfUEFVU0VfVEFTSzsKKyAgZ19hc3luY19xdWV1ZV9wdXNoIChkdG1mc3JjLT5ldmVudF9xdWV1ZSwgZXZlbnQpOworCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9kdG1mX3NyY191bmxvY2tfc3RvcCAoR3N0QmFzZVNyYyAqIHNyYykKK3sKKyAgR3N0UlRQRFRNRlNyYyAqZHRtZnNyYyA9IEdTVF9SVFBfRFRNRl9TUkMgKHNyYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZHRtZnNyYywgIlVubG9jayBzdG9wcGVkIik7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkdG1mc3JjKTsKKyAgZHRtZnNyYy0+cGF1c2VkID0gRkFMU0U7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkdG1mc3JjKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfZHRtZl9zcmNfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBkdG1mc3JjIiwKKyAgICAgIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX1JUUF9EVE1GX1NSQyk7Cit9CmRpZmYgLS1naXQgYS9nc3QvZHRtZi9nc3RydHBkdG1mc3JjLmggYi9nc3QvZHRtZi9nc3RydHBkdG1mc3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U5MjU2YwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9kdG1mL2dzdHJ0cGR0bWZzcmMuaApAQCAtMCwwICsxLDExNSBAQAorLyogR1N0cmVhbWVyIFJUUCBEVE1GIHNvdXJjZQorICoKKyAqIGdzdHJ0cGR0bWZzcmMuaDoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqICAgQ29udGFjdDogWmVlc2hhbiBBbGkgPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfRFRNRl9TUkNfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9EVE1GX1NSQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlc3JjLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworI2luY2x1ZGUgImdzdGR0bWZjb21tb24uaCIKKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9SVFBfRFRNRl9TUkMJCShnc3RfcnRwX2R0bWZfc3JjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfRFRNRl9TUkMob2JqKQkJKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9EVE1GX1NSQyxHc3RSVFBEVE1GU3JjKSkKKyNkZWZpbmUgR1NUX1JUUF9EVE1GX1NSQ19DTEFTUyhrbGFzcykJKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0RUTUZfU1JDLEdzdFJUUERUTUZTcmNDbGFzcykpCisjZGVmaW5lIEdTVF9SVFBfRFRNRl9TUkNfR0VUX0NMQVNTKG9iaikgICAgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfUlRQX0RUTUZfU1JDLCBHc3RSVFBEVE1GU3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0RUTUZfU1JDKG9iaikJCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfRFRNRl9TUkMpKQorI2RlZmluZSBHU1RfSVNfUlRQX0RUTUZfU1JDX0NMQVNTKGtsYXNzKQkoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfRFRNRl9TUkMpKQorI2RlZmluZSBHU1RfUlRQX0RUTUZfU1JDX0NBU1Qob2JqKQkJKChHc3RSVFBEVE1GU3JjICopKG9iaikpCit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQRFRNRlNyYyBHc3RSVFBEVE1GU3JjOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUERUTUZTcmNDbGFzcyBHc3RSVFBEVE1GU3JjQ2xhc3M7CisKKworCitlbnVtIF9Hc3RSVFBEVE1GRXZlbnRUeXBlCit7CisgIFJUUF9EVE1GX0VWRU5UX1RZUEVfU1RBUlQsCisgIFJUUF9EVE1GX0VWRU5UX1RZUEVfU1RPUCwKKyAgUlRQX0RUTUZfRVZFTlRfVFlQRV9QQVVTRV9UQVNLCit9OworCit0eXBlZGVmIGVudW0gX0dzdFJUUERUTUZFdmVudFR5cGUgR3N0UlRQRFRNRkV2ZW50VHlwZTsKKworc3RydWN0IF9Hc3RSVFBEVE1GU3JjRXZlbnQKK3sKKyAgR3N0UlRQRFRNRkV2ZW50VHlwZSBldmVudF90eXBlOworICBHc3RSVFBEVE1GUGF5bG9hZCAqcGF5bG9hZDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBEVE1GU3JjRXZlbnQgR3N0UlRQRFRNRlNyY0V2ZW50OworCisvKioKKyAqIEdzdFJUUERUTUZTcmM6CisgKiBAZWxlbWVudDogdGhlIHBhcmVudCBlbGVtZW50LgorICoKKyAqIFRoZSBvcGFxdWUgI0dzdFJUUERUTUZTcmMgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0UlRQRFRNRlNyYworeworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgR3N0QmFzZVNyYyBiYXNlc3JjOworCisgIEdBc3luY1F1ZXVlICpldmVudF9xdWV1ZTsKKyAgR3N0Q2xvY2tJRCBjbG9ja2lkOworICBnYm9vbGVhbiBwYXVzZWQ7CisgIEdzdFJUUERUTUZQYXlsb2FkICpwYXlsb2FkOworCisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisgIEdzdENsb2NrVGltZSBzdGFydF90aW1lc3RhbXA7CisgIGdib29sZWFuIGZpcnN0X3BhY2tldDsKKyAgZ2Jvb2xlYW4gbGFzdF9wYWNrZXQ7CisgIGd1aW50MzIgdHNfYmFzZTsKKyAgZ3VpbnQxNiBzZXFudW1fYmFzZTsKKyAgZ2ludDE2IHNlcW51bV9vZmZzZXQ7CisgIGd1aW50MTYgc2VxbnVtOworICBnaW50MzIgdHNfb2Zmc2V0OworICBndWludDMyIHJ0cF90aW1lc3RhbXA7CisgIGd1aW50IHB0OworICBndWludCBzc3JjOworICBndWludCBjdXJyZW50X3NzcmM7CisgIGd1aW50MTYgcHRpbWU7CisgIGd1aW50MTYgcGFja2V0X3JlZHVuZGFuY3k7CisgIGd1aW50MzIgY2xvY2tfcmF0ZTsKKyAgZ2Jvb2xlYW4gbGFzdF9ldmVudF93YXNfc3RhcnQ7CisKKyAgR3N0Q2xvY2tUaW1lIGxhc3Rfc3RvcDsKKworICBnYm9vbGVhbiBkaXJ0eTsKKyAgZ3VpbnQxNiByZWR1bmRhbmN5X2NvdW50OworfTsKKworc3RydWN0IF9Hc3RSVFBEVE1GU3JjQ2xhc3MKK3sKKyAgR3N0QmFzZVNyY0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfZHRtZl9zcmNfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2R0bWZfc3JjX3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19HU1RfUlRQX0RUTUZfU1JDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2R0bWYvbWVzb24uYnVpbGQgYi9nc3QvZHRtZi9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjcyMDFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2R0bWYvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxNiBAQAorZHRtZl9zb3VyY2VzID0gWworICAnZ3N0ZHRtZnNyYy5jJywKKyAgJ2dzdHJ0cGR0bWZzcmMuYycsCisgICdnc3RydHBkdG1mZGVwYXkuYycsCisgICdnc3RkdG1mLmMnCitdCisKK2dzdGR0bWYgPSBsaWJyYXJ5KCdnc3RkdG1mJywKKyAgZHRtZl9zb3VyY2VzLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnc3RydHBfZGVwLCBsaWJtXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKKwpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvTElDRU5TRSBiL2dzdC9lZmZlY3R2L0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlZGViZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L0xJQ0VOU0UKQEAgLTAsMCArMSwxNCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIEVmZmVjVFY6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgRlVLVUNISSBLZW50YXJvdQorICoKKyAqIEVmZmVjVFYgaXMgZnJlZSBzb2Z0d2FyZS4gV2UgcmVsZWFzZSB0aGlzIHByb2R1Y3QgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGUgbGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGUgZmlsZQorICogQ09QWUlORy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCisgKiBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KZGlmZiAtLWdpdCBhL2dzdC9lZmZlY3R2L01ha2VmaWxlLmFtIGIvZ3N0L2VmZmVjdHYvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjNzA3NgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjEgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGVmZmVjdHYubGEKKworbGliZ3N0ZWZmZWN0dl9sYV9TT1VSQ0VTID0gXAorCWdzdGVmZmVjdHYuYyBnc3RlZGdlLmMgZ3N0YWdpbmcuYyBnc3RkaWNlLmMgZ3N0d2FycC5jIFwKKwlnc3RzaGFnYWRlbGljLmMgZ3N0dmVydGlnby5jIGdzdHJldi5jIGdzdHF1YXJrLmMgZ3N0b3AuYyBcCisJZ3N0cmFkaW9hYy5jIGdzdHN0cmVhay5jIGdzdHJpcHBsZS5jCitsaWJnc3RlZmZlY3R2X2xhX0NGTEFHUyA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9DRkxBR1MpIFwKKwktSSQodG9wX3NyY2RpcikvZ3N0L3ZpZGVvZmlsdGVyCitsaWJnc3RlZmZlY3R2X2xhX0xJQkFERCA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R2aWRlby1AR1NUX0FQSV9WRVJTSU9OQCBcCisJJChHU1RfQkFTRV9MSUJTKSBcCisJJChHU1RfTElCUykgXAorCSQoTElCTSkKK2xpYmdzdGVmZmVjdHZfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdGVmZmVjdHYuaCBnc3RhZ2luZy5oIGdzdGRpY2UuaCBnc3RlZGdlLmggXAorICAgICAgICBnc3RxdWFyay5oIGdzdHJldi5oIGdzdHNoYWdhZGVsaWMuaCBnc3R2ZXJ0aWdvLmggZ3N0d2FycC5oIGdzdG9wLmggXAorCWdzdHJhZGlvYWMuaCBnc3RzdHJlYWsuaCBnc3RyaXBwbGUuaApkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuYyBiL2dzdC9lZmZlY3R2L2dzdGFnaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxYjYzYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L2dzdGFnaW5nLmMKQEAgLTAsMCArMSw0MDIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogRWZmZWNUViAtIFJlYWx0aW1lIERpZ2l0YWwgVmlkZW8gRWZmZWN0b3IKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZVS1VDSEkgS2VudGFyb3UKKyAqCisgKiBBZ2luZ1RWIC0gZmlsbS1hZ2luZyBlZmZlY3QuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYWdpbmd0dgorICoKKyAqIEFnaW5nVFYgYWdlcyBhIHZpZGVvIHN0cmVhbSBpbiByZWFsdGltZSwgY2hhbmdlcyB0aGUgY29sb3JzIGFuZCBhZGRzCisgKiBzY3JhdGNoZXMgYW5kIGR1c3QuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIGFnaW5ndHYgISB2aWRlb2NvbnZlcnQgISBhdXRvdmlkZW9zaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIHNob3dzIHRoZSBlZmZlY3Qgb2YgYWdpbmd0diBvbiBhIHRlc3Qgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJnc3RhZ2luZy5oIgorI2luY2x1ZGUgImdzdGVmZmVjdHYuaCIKKworc3RhdGljIGNvbnN0IGdpbnQgZHhbOF0gPSB7IDEsIDEsIDAsIC0xLCAtMSwgLTEsIDAsIDEgfTsKK3N0YXRpYyBjb25zdCBnaW50IGR5WzhdID0geyAwLCAtMSwgLTEsIC0xLCAwLCAxLCAxLCAxIH07CisKK2VudW0KK3sKKyAgUFJPUF8wID0gMCwKKyAgUFJPUF9TQ1JBVENIX0xJTkVTLAorICBQUk9QX0NPTE9SX0FHSU5HLAorICBQUk9QX1BJVFMsCisgIFBST1BfRFVTVFMKK307CisKKyNkZWZpbmUgREVGQVVMVF9TQ1JBVENIX0xJTkVTIDcKKyNkZWZpbmUgREVGQVVMVF9DT0xPUl9BR0lORyBUUlVFCisjZGVmaW5lIERFRkFVTFRfUElUUyBUUlVFCisjZGVmaW5lIERFRkFVTFRfRFVTVFMgVFJVRQorCisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorI2RlZmluZSBDQVBTX1NUUiBHU1RfVklERU9fQ0FQU19NQUtFICgieyBCR1J4LCBSR0J4IH0iKQorI2Vsc2UKKyNkZWZpbmUgQ0FQU19TVFIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgeFJHQiwgeEJHUiB9IikKKyNlbmRpZgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X2FnaW5ndHZfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKENBUFNfU1RSKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfYWdpbmd0dl9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoQ0FQU19TVFIpCisgICAgKTsKKworR19ERUZJTkVfVFlQRSAoR3N0QWdpbmdUViwgZ3N0X2FnaW5ndHYsIEdTVF9UWVBFX1ZJREVPX0ZJTFRFUik7CisKK3N0YXRpYyB2b2lkCitjb2xvcmFnaW5nIChndWludDMyICogc3JjLCBndWludDMyICogZGVzdCwgZ2ludCB2aWRlb19hcmVhLCBnaW50ICogYykKK3sKKyAgZ3VpbnQzMiBhLCBiOworICBnaW50IGk7CisgIGdpbnQgY190bXAgPSAqYzsKKworICBjX3RtcCAtPSAoZ2ludCkgKGZhc3RyYW5kICgpKSA+PiAyODsKKyAgaWYgKGNfdG1wIDwgMCkKKyAgICBjX3RtcCA9IDA7CisgIGlmIChjX3RtcCA+IDB4MTgpCisgICAgY190bXAgPSAweDE4OworCisgIGZvciAoaSA9IDA7IGkgPCB2aWRlb19hcmVhOyBpKyspIHsKKyAgICBhID0gKnNyYysrOworICAgIGIgPSAoYSAmIDB4ZmNmY2ZjKSA+PiAyOworICAgICpkZXN0KysgPQorICAgICAgICBhIC0gYiArIChjX3RtcCB8IChjX3RtcCA8PCA4KSB8IChjX3RtcCA8PCAxNikpICsKKyAgICAgICAgKChmYXN0cmFuZCAoKSA+PiA4KSAmIDB4MTAxMDEwKTsKKyAgfQorICAqYyA9IGNfdG1wOworfQorCisKK3N0YXRpYyB2b2lkCitzY3JhdGNoaW5nIChzY3JhdGNoICogc2NyYXRjaGVzLCBnaW50IHNjcmF0Y2hfbGluZXMsIGd1aW50MzIgKiBkZXN0LCBnaW50IHdpZHRoLAorICAgIGdpbnQgaGVpZ2h0KQoreworICBnaW50IGksIHksIHkxLCB5MjsKKyAgZ3VpbnQzMiAqcCwgYSwgYjsKKyAgc2NyYXRjaCAqc2NyYXRjaDsKKworICBmb3IgKGkgPSAwOyBpIDwgc2NyYXRjaF9saW5lczsgaSsrKSB7CisgICAgc2NyYXRjaCA9ICZzY3JhdGNoZXNbaV07CisKKyAgICBpZiAoc2NyYXRjaC0+bGlmZSkgeworICAgICAgc2NyYXRjaC0+eCA9IHNjcmF0Y2gtPnggKyBzY3JhdGNoLT5keDsKKworICAgICAgaWYgKHNjcmF0Y2gtPnggPCAwIHx8IHNjcmF0Y2gtPnggPiB3aWR0aCAqIDI1NikgeworICAgICAgICBzY3JhdGNoLT5saWZlID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBwID0gZGVzdCArIChzY3JhdGNoLT54ID4+IDgpOworICAgICAgaWYgKHNjcmF0Y2gtPmluaXQpIHsKKyAgICAgICAgeTEgPSBzY3JhdGNoLT5pbml0OworICAgICAgICBzY3JhdGNoLT5pbml0ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHkxID0gMDsKKyAgICAgIH0KKyAgICAgIHNjcmF0Y2gtPmxpZmUtLTsKKyAgICAgIGlmIChzY3JhdGNoLT5saWZlKSB7CisgICAgICAgIHkyID0gaGVpZ2h0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgeTIgPSBmYXN0cmFuZCAoKSAlIGhlaWdodDsKKyAgICAgIH0KKyAgICAgIGZvciAoeSA9IHkxOyB5IDwgeTI7IHkrKykgeworICAgICAgICBhID0gKnAgJiAweGZlZmVmZjsKKyAgICAgICAgYSArPSAweDIwMjAyMDsKKyAgICAgICAgYiA9IGEgJiAweDEwMTAxMDA7CisgICAgICAgICpwID0gYSB8IChiIC0gKGIgPj4gOCkpOworICAgICAgICBwICs9IHdpZHRoOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoKGZhc3RyYW5kICgpICYgMHhmMDAwMDAwMCkgPT0gMCkgeworICAgICAgICBzY3JhdGNoLT5saWZlID0gMiArIChmYXN0cmFuZCAoKSA+PiAyNyk7CisgICAgICAgIHNjcmF0Y2gtPnggPSBmYXN0cmFuZCAoKSAlICh3aWR0aCAqIDI1Nik7CisgICAgICAgIHNjcmF0Y2gtPmR4ID0gKChpbnQpIGZhc3RyYW5kICgpKSA+PiAyMzsKKyAgICAgICAgc2NyYXRjaC0+aW5pdCA9IChmYXN0cmFuZCAoKSAlIChoZWlnaHQgLSAxKSkgKyAxOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZHVzdHMgKGd1aW50MzIgKiBkZXN0LCBnaW50IHdpZHRoLCBnaW50IGhlaWdodCwgZ2ludCAqIGR1c3RfaW50ZXJ2YWwsCisgICAgZ2ludCBhcmVhX3NjYWxlKQoreworICBnaW50IGksIGo7CisgIGdpbnQgZG51bTsKKyAgZ2ludCBkLCBsZW47CisgIGd1aW50IHgsIHk7CisKKyAgaWYgKCpkdXN0X2ludGVydmFsID09IDApIHsKKyAgICBpZiAoKGZhc3RyYW5kICgpICYgMHhmMDAwMDAwMCkgPT0gMCkgeworICAgICAgKmR1c3RfaW50ZXJ2YWwgPSBmYXN0cmFuZCAoKSA+PiAyOTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGRudW0gPSBhcmVhX3NjYWxlICogNCArIChmYXN0cmFuZCAoKSA+PiAyNyk7CisKKyAgZm9yIChpID0gMDsgaSA8IGRudW07IGkrKykgeworICAgIHggPSBmYXN0cmFuZCAoKSAlIHdpZHRoOworICAgIHkgPSBmYXN0cmFuZCAoKSAlIGhlaWdodDsKKyAgICBkID0gZmFzdHJhbmQgKCkgPj4gMjk7CisgICAgbGVuID0gZmFzdHJhbmQgKCkgJSBhcmVhX3NjYWxlICsgNTsKKyAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKyAgICAgIGRlc3RbeSAqIHdpZHRoICsgeF0gPSAweDEwMTAxMDsKKyAgICAgIHkgKz0gZHlbZF07CisgICAgICB4ICs9IGR4W2RdOworCisgICAgICBpZiAoeSA+PSBoZWlnaHQgfHwgeCA+PSB3aWR0aCkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGQgPSAoZCArIGZhc3RyYW5kICgpICUgMyAtIDEpICYgNzsKKyAgICB9CisgIH0KKyAgKmR1c3RfaW50ZXJ2YWwgPSAqZHVzdF9pbnRlcnZhbCAtIDE7Cit9CisKK3N0YXRpYyB2b2lkCitwaXRzIChndWludDMyICogZGVzdCwgZ2ludCB3aWR0aCwgZ2ludCBoZWlnaHQsIGdpbnQgYXJlYV9zY2FsZSwKKyAgICBnaW50ICogcGl0c19pbnRlcnZhbCkKK3sKKyAgZ2ludCBpLCBqOworICBnaW50IHBudW0sIHNpemUsIHBudW1zY2FsZTsKKyAgZ3VpbnQgeCwgeTsKKworICBwbnVtc2NhbGUgPSBhcmVhX3NjYWxlICogMjsKKyAgaWYgKCpwaXRzX2ludGVydmFsKSB7CisgICAgcG51bSA9IHBudW1zY2FsZSArIChmYXN0cmFuZCAoKSAlIHBudW1zY2FsZSk7CisKKyAgICAqcGl0c19pbnRlcnZhbCA9ICpwaXRzX2ludGVydmFsIC0gMTsKKyAgfSBlbHNlIHsKKyAgICBwbnVtID0gZmFzdHJhbmQgKCkgJSBwbnVtc2NhbGU7CisKKyAgICBpZiAoKGZhc3RyYW5kICgpICYgMHhmODAwMDAwMCkgPT0gMCkgeworICAgICAgKnBpdHNfaW50ZXJ2YWwgPSAoZmFzdHJhbmQgKCkgPj4gMjgpICsgMjA7CisgICAgfQorICB9CisgIGZvciAoaSA9IDA7IGkgPCBwbnVtOyBpKyspIHsKKyAgICB4ID0gZmFzdHJhbmQgKCkgJSAod2lkdGggLSAxKTsKKyAgICB5ID0gZmFzdHJhbmQgKCkgJSAoaGVpZ2h0IC0gMSk7CisKKyAgICBzaXplID0gZmFzdHJhbmQgKCkgPj4gMjg7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CisgICAgICB4ID0geCArIGZhc3RyYW5kICgpICUgMyAtIDE7CisgICAgICB5ID0geSArIGZhc3RyYW5kICgpICUgMyAtIDE7CisKKyAgICAgIGlmICh5ID49IGhlaWdodCB8fCB4ID49IHdpZHRoKQorICAgICAgICBicmVhazsKKworICAgICAgZGVzdFt5ICogd2lkdGggKyB4XSA9IDB4YzBjMGMwOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2FnaW5ndHZfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEFnaW5nVFYgKmFnaW5ndHYgPSBHU1RfQUdJTkdUViAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGFnaW5ndHYpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU0NSQVRDSF9MSU5FUzoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBhZ2luZ3R2LT5zY3JhdGNoX2xpbmVzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT0xPUl9BR0lORzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBhZ2luZ3R2LT5jb2xvcl9hZ2luZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUElUUzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBhZ2luZ3R2LT5waXRzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9EVVNUUzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBhZ2luZ3R2LT5kdXN0cyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoYWdpbmd0dik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWdpbmd0dl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0QWdpbmdUViAqYWdpbmd0diA9IEdTVF9BR0lOR1RWIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TQ1JBVENIX0xJTkVTOgorICAgICAgYWdpbmd0di0+c2NyYXRjaF9saW5lcyA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT0xPUl9BR0lORzoKKyAgICAgIGFnaW5ndHYtPmNvbG9yX2FnaW5nID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BJVFM6CisgICAgICBhZ2luZ3R2LT5waXRzID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RVU1RTOgorICAgICAgYWdpbmd0di0+ZHVzdHMgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hZ2luZ3R2X3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpCit7CisgIEdzdEFnaW5nVFYgKmFnaW5ndHYgPSBHU1RfQUdJTkdUViAodHJhbnMpOworCisgIGFnaW5ndHYtPmNvbG9yYWdpbmdfc3RhdGUgPSAweDE4OworICBhZ2luZ3R2LT5kdXN0X2ludGVydmFsID0gMDsKKyAgYWdpbmd0di0+cGl0c19pbnRlcnZhbCA9IDA7CisKKyAgbWVtc2V0IChhZ2luZ3R2LT5zY3JhdGNoZXMsIDAsIHNpemVvZiAoYWdpbmd0di0+c2NyYXRjaGVzKSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYWdpbmd0dl90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogZmlsdGVyLCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSkKK3sKKyAgR3N0QWdpbmdUViAqYWdpbmd0diA9IEdTVF9BR0lOR1RWIChmaWx0ZXIpOworICBnaW50IGFyZWFfc2NhbGU7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIHN0cmVhbV90aW1lOworICBnaW50IHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgdmlkZW9fc2l6ZTsKKyAgZ3VpbnQzMiAqc3JjLCAqZGVzdDsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5fZnJhbWUtPmJ1ZmZlcik7CisgIHN0cmVhbV90aW1lID0KKyAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpLT5zZWdtZW50LAorICAgICAgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGFnaW5ndHYsICJzeW5jIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKGFnaW5ndHYpLCBzdHJlYW1fdGltZSk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworICBzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMCk7CisgIHZpZGVvX3NpemUgPSBzdHJpZGUgKiBoZWlnaHQgLyA0OworCisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICBhcmVhX3NjYWxlID0gd2lkdGggKiBoZWlnaHQgLyA2NCAvIDQ4MDsKKyAgaWYgKGFyZWFfc2NhbGUgPD0gMCkKKyAgICBhcmVhX3NjYWxlID0gMTsKKworICBpZiAoYWdpbmd0di0+Y29sb3JfYWdpbmcpCisgICAgY29sb3JhZ2luZyAoc3JjLCBkZXN0LCB2aWRlb19zaXplLCAmYWdpbmd0di0+Y29sb3JhZ2luZ19zdGF0ZSk7CisgIGVsc2UKKyAgICBtZW1jcHkgKGRlc3QsIHNyYywgc3RyaWRlICogaGVpZ2h0KTsKKworICBzY3JhdGNoaW5nIChhZ2luZ3R2LT5zY3JhdGNoZXMsIGFnaW5ndHYtPnNjcmF0Y2hfbGluZXMsIGRlc3QsIHdpZHRoLCBoZWlnaHQpOworICBpZiAoYWdpbmd0di0+cGl0cykKKyAgICBwaXRzIChkZXN0LCB3aWR0aCwgaGVpZ2h0LCBhcmVhX3NjYWxlLCAmYWdpbmd0di0+cGl0c19pbnRlcnZhbCk7CisgIGlmIChhcmVhX3NjYWxlID4gMSAmJiBhZ2luZ3R2LT5kdXN0cykKKyAgICBkdXN0cyAoZGVzdCwgd2lkdGgsIGhlaWdodCwgJmFnaW5ndHYtPmR1c3RfaW50ZXJ2YWwsIGFyZWFfc2NhbGUpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hZ2luZ3R2X2NsYXNzX2luaXQgKEdzdEFnaW5nVFZDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9hZ2luZ3R2X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2FnaW5ndHZfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU0NSQVRDSF9MSU5FUywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgic2NyYXRjaC1saW5lcyIsICJTY3JhdGNoIExpbmVzIiwKKyAgICAgICAgICAiTnVtYmVyIG9mIHNjcmF0Y2ggbGluZXMiLCAwLCBTQ1JBVENIX01BWCwgREVGQVVMVF9TQ1JBVENIX0xJTkVTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NPTE9SX0FHSU5HLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJjb2xvci1hZ2luZyIsICJDb2xvciBBZ2luZyIsCisgICAgICAgICAgIkNvbG9yIEFnaW5nIiwgREVGQVVMVF9DT0xPUl9BR0lORywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QSVRTLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJwaXRzIiwgIlBpdHMiLAorICAgICAgICAgICJQaXRzIiwgREVGQVVMVF9QSVRTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RVU1RTLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJkdXN0cyIsICJEdXN0cyIsCisgICAgICAgICAgIkR1c3RzIiwgREVGQVVMVF9EVVNUUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkFnaW5nVFYgZWZmZWN0IiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJBZ2luZ1RWIGFkZHMgYWdlIHRvIHZpZGVvIGlucHV0IHVzaW5nIHNjcmF0Y2hlcyBhbmQgZHVzdCIsCisgICAgICAiU2FtIExhbnRpbmdhIDxzbG91a2VuQGRldm9sdXRpb24uY29tPiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9hZ2luZ3R2X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfYWdpbmd0dl9zcmNfdGVtcGxhdGUpOworCisgIHRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWdpbmd0dl9zdGFydCk7CisKKyAgdmZpbHRlcl9jbGFzcy0+dHJhbnNmb3JtX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWdpbmd0dl90cmFuc2Zvcm1fZnJhbWUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FnaW5ndHZfaW5pdCAoR3N0QWdpbmdUViAqIGFnaW5ndHYpCit7CisgIGFnaW5ndHYtPnNjcmF0Y2hfbGluZXMgPSBERUZBVUxUX1NDUkFUQ0hfTElORVM7CisgIGFnaW5ndHYtPmNvbG9yX2FnaW5nID0gREVGQVVMVF9DT0xPUl9BR0lORzsKKyAgYWdpbmd0di0+cGl0cyA9IERFRkFVTFRfUElUUzsKKyAgYWdpbmd0di0+ZHVzdHMgPSBERUZBVUxUX0RVU1RTOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0YWdpbmcuaCBiL2dzdC9lZmZlY3R2L2dzdGFnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0NjZkMQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L2dzdGFnaW5nLmgKQEAgLTAsMCArMSw4OSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBFZmZlY1RWIC0gUmVhbHRpbWUgRGlnaXRhbCBWaWRlbyBFZmZlY3RvcgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgRlVLVUNISSBLZW50YXJvdQorICoKKyAqIEFnaW5nVFYgLSBmaWxtLWFnaW5nIGVmZmVjdC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0FHSU5HX0hfXworI2RlZmluZSBfX0dTVF9BR0lOR19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2ZpbHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQUdJTkdUViBcCisgIChnc3RfYWdpbmd0dl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQUdJTkdUVihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0FHSU5HVFYsR3N0QWdpbmdUVikpCisjZGVmaW5lIEdTVF9BR0lOR1RWX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0FHSU5HVFYsR3N0QWdpbmdUVkNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FHSU5HVFYob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9BR0lOR1RWKSkKKyNkZWZpbmUgR1NUX0lTX0FHSU5HVFZfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfQUdJTkdUVikpCisKK3R5cGVkZWYgc3RydWN0IF9zY3JhdGNoCit7CisgIGdpbnQgbGlmZTsKKyAgZ2ludCB4OworICBnaW50IGR4OworICBnaW50IGluaXQ7Cit9IHNjcmF0Y2g7CisjZGVmaW5lIFNDUkFUQ0hfTUFYIDIwCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBZ2luZ1RWIEdzdEFnaW5nVFY7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QWdpbmdUVkNsYXNzIEdzdEFnaW5nVFZDbGFzczsKKworc3RydWN0IF9Hc3RBZ2luZ1RWCit7CisgIEdzdFZpZGVvRmlsdGVyIHZpZGVvZmlsdGVyOworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIGdib29sZWFuIGNvbG9yX2FnaW5nOworICBnYm9vbGVhbiBwaXRzOworICBnYm9vbGVhbiBkdXN0czsKKworICBnaW50IGNvbG9yYWdpbmdfc3RhdGU7CisKKyAgc2NyYXRjaCBzY3JhdGNoZXNbU0NSQVRDSF9NQVhdOworICBnaW50IHNjcmF0Y2hfbGluZXM7CisKKyAgZ2ludCBkdXN0X2ludGVydmFsOworICBnaW50IHBpdHNfaW50ZXJ2YWw7CisKK307CisKK3N0cnVjdCBfR3N0QWdpbmdUVkNsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2FnaW5ndHZfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQUdJTkdfSF9fICovCisKZGlmZiAtLWdpdCBhL2dzdC9lZmZlY3R2L2dzdGRpY2UuYyBiL2dzdC9lZmZlY3R2L2dzdGRpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzZlMTExCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvZ3N0ZGljZS5jCkBAIC0wLDAgKzEsMzE1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBkaWNlLmM6IGEgJ2RpY2luZycgZWZmZWN0CisgKiAgY29weXJpZ2h0IChjKSAyMDAxIFNhbSBNZXJ0ZW5zLiAgVGhpcyBjb2RlIGlzIHN1YmplY3QgdG8gdGhlIHByb3Zpc2lvbnMgb2YKKyAqICB0aGUgR05VIExpYnJhcnkgUHVibGljIExpY2Vuc2UuCisgKgorICogSSBzdXBwb3NlIHRoaXMgbG9va3Mgc2ltaWxhciB0byBQdXp6bGVUViwgYnV0IGl0J3Mgbm90LiBUaGUgc2NyZWVuIGlzCisgKiBkaXZpZGVkIGludG8gc21hbGwgc3F1YXJlcywgZWFjaCBvZiB3aGljaCBpcyByb3RhdGVkIGVpdGhlciAwLCA5MCwgMTgwIG9yCisgKiAyNzAgZGVncmVlcy4gIFRoZSBhbW91bnQgb2Ygcm90YXRpb24gZm9yIGVhY2ggc3F1YXJlIGlzIGNob3NlbiBhdCByYW5kb20uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZGljZXR2CisgKgorICogRGljZVRWICdkaWNlcycgdGhlIHNjcmVlbiB1cCBpbnRvIG1hbnkgc21hbGwgc3F1YXJlcywgZWFjaCBkZWZhdWx0aW5nCisgKiB0byBhIHNpemUgb2YgMTYgcGl4ZWxzIGJ5IDE2IHBpeGVscy4uIEVhY2ggc3F1YXJlIGlzIHJvdGF0ZWQgcmFuZG9tbHkKKyAqIGluIG9uZSBvZiBmb3VyIGRpcmVjdGlvbnM6IHVwIChubyBjaGFuZ2UpLCBkb3duICgxODAgZGVncmVlcywgb3IKKyAqIHVwc2lkZSBkb3duKSwgcmlnaHQgKDkwIGRlZ3JlZXMgY2xvY2t3aXNlKSwgb3IgbGVmdCAoOTAgZGVncmVlcworICogY291bnRlcmNsb2Nrd2lzZSkuIFRoZSBkaXJlY3Rpb24gb2YgZWFjaCBzcXVhcmUgbm9ybWFsbHkgcmVtYWlucworICogY29uc2lzdGVudCBiZXR3ZWVuIGVhY2ggZnJhbWUuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIGRpY2V0diAhIHZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgc2hvd3MgdGhlIGVmZmVjdCBvZiBkaWNldHYgb24gYSB0ZXN0IHN0cmVhbS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RkaWNlLmgiCisjaW5jbHVkZSAiZ3N0ZWZmZWN0di5oIgorCisjZGVmaW5lIERFRkFVTFRfQ1VCRV9CSVRTICAgNAorI2RlZmluZSBNQVhfQ1VCRV9CSVRTICAgICAgIDUKKyNkZWZpbmUgTUlOX0NVQkVfQklUUyAgICAgICAwCisKK3R5cGVkZWYgZW51bSBfZGljZV9kaXIKK3sKKyAgRElDRV9VUCA9IDAsCisgIERJQ0VfUklHSFQgPSAxLAorICBESUNFX0RPV04gPSAyLAorICBESUNFX0xFRlQgPSAzCit9IERpY2VEaXI7CisKKyNkZWZpbmUgZ3N0X2RpY2V0dl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3REaWNlVFYsIGdzdF9kaWNldHYsIEdTVF9UWVBFX1ZJREVPX0ZJTFRFUik7CisKK3N0YXRpYyB2b2lkIGdzdF9kaWNldHZfY3JlYXRlX21hcCAoR3N0RGljZVRWICogZmlsdGVyLCBHc3RWaWRlb0luZm8gKiBpbmZvKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9kaWNldHZfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IFJHQngsIHhSR0IsIEJHUngsIHhCR1IgfSIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfZGljZXR2X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBSR0J4LCB4UkdCLCBCR1J4LCB4QkdSIH0iKSkKKyAgICApOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9DVUJFX0JJVFMKK307CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RpY2V0dl9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0RGljZVRWICpmaWx0ZXIgPSBHU1RfRElDRVRWICh2ZmlsdGVyKTsKKworICBnX2ZyZWUgKGZpbHRlci0+ZGljZW1hcCk7CisgIGZpbHRlci0+ZGljZW1hcCA9CisgICAgICAoZ3VpbnQ4ICopIGdfbWFsbG9jIChHU1RfVklERU9fSU5GT19XSURUSCAoaW5faW5mbykgKgorICAgICAgR1NUX1ZJREVPX0lORk9fV0lEVEggKGluX2luZm8pKTsKKyAgZ3N0X2RpY2V0dl9jcmVhdGVfbWFwIChmaWx0ZXIsIGluX2luZm8pOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2RpY2V0dl90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUpCit7CisgIEdzdERpY2VUViAqZmlsdGVyID0gR1NUX0RJQ0VUViAodmZpbHRlcik7CisgIGd1aW50MzIgKnNyYywgKmRlc3Q7CisgIGdpbnQgaSwgbWFwX3gsIG1hcF95LCBtYXBfaSwgYmFzZSwgZHgsIGR5LCBkaTsKKyAgZ2ludCB2aWRlb19zdHJpZGUsIGdfY3ViZV9iaXRzLCBnX2N1YmVfc2l6ZTsKKyAgZ2ludCBnX21hcF9oZWlnaHQsIGdfbWFwX3dpZHRoOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBzdHJlYW1fdGltZTsKKyAgY29uc3QgZ3VpbnQ4ICpkaWNlbWFwOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbl9mcmFtZS0+YnVmZmVyKTsKKyAgc3RyZWFtX3RpbWUgPQorICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZHU1RfQkFTRV9UUkFOU0ZPUk0gKHZmaWx0ZXIpLT5zZWdtZW50LAorICAgICAgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgInN5bmMgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW1fdGltZSkpCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoZmlsdGVyKSwgc3RyZWFtX3RpbWUpOworCisgIHNyYyA9IChndWludDMyICopIEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSAoZ3VpbnQzMiAqKSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKyAgdmlkZW9fc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoaW5fZnJhbWUsIDApOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgZ19jdWJlX2JpdHMgPSBmaWx0ZXItPmdfY3ViZV9iaXRzOworICBnX2N1YmVfc2l6ZSA9IGZpbHRlci0+Z19jdWJlX3NpemU7CisgIGdfbWFwX2hlaWdodCA9IGZpbHRlci0+Z19tYXBfaGVpZ2h0OworICBnX21hcF93aWR0aCA9IGZpbHRlci0+Z19tYXBfd2lkdGg7CisKKyAgZGljZW1hcCA9IGZpbHRlci0+ZGljZW1hcDsKKyAgdmlkZW9fc3RyaWRlIC89IDQ7CisKKyAgbWFwX2kgPSAwOworICBmb3IgKG1hcF95ID0gMDsgbWFwX3kgPCBnX21hcF9oZWlnaHQ7IG1hcF95KyspIHsKKyAgICBmb3IgKG1hcF94ID0gMDsgbWFwX3ggPCBnX21hcF93aWR0aDsgbWFwX3grKykgeworICAgICAgYmFzZSA9IChtYXBfeSA8PCBnX2N1YmVfYml0cykgKiB2aWRlb19zdHJpZGUgKyAobWFwX3ggPDwgZ19jdWJlX2JpdHMpOworCisgICAgICBzd2l0Y2ggKGRpY2VtYXBbbWFwX2ldKSB7CisgICAgICAgIGNhc2UgRElDRV9VUDoKKyAgICAgICAgICBmb3IgKGR5ID0gMDsgZHkgPCBnX2N1YmVfc2l6ZTsgZHkrKykgeworICAgICAgICAgICAgaSA9IGJhc2UgKyBkeSAqIHZpZGVvX3N0cmlkZTsKKyAgICAgICAgICAgIGZvciAoZHggPSAwOyBkeCA8IGdfY3ViZV9zaXplOyBkeCsrKSB7CisgICAgICAgICAgICAgIGRlc3RbaV0gPSBzcmNbaV07CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRElDRV9MRUZUOgorICAgICAgICAgIGZvciAoZHkgPSAwOyBkeSA8IGdfY3ViZV9zaXplOyBkeSsrKSB7CisgICAgICAgICAgICBpID0gYmFzZSArIGR5ICogdmlkZW9fc3RyaWRlOworCisgICAgICAgICAgICBmb3IgKGR4ID0gMDsgZHggPCBnX2N1YmVfc2l6ZTsgZHgrKykgeworICAgICAgICAgICAgICBkaSA9IGJhc2UgKyAoZHggKiB2aWRlb19zdHJpZGUpICsgKGdfY3ViZV9zaXplIC0gZHkgLSAxKTsKKyAgICAgICAgICAgICAgZGVzdFtkaV0gPSBzcmNbaV07CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRElDRV9ET1dOOgorICAgICAgICAgIGZvciAoZHkgPSAwOyBkeSA8IGdfY3ViZV9zaXplOyBkeSsrKSB7CisgICAgICAgICAgICBkaSA9IGJhc2UgKyBkeSAqIHZpZGVvX3N0cmlkZTsKKyAgICAgICAgICAgIGkgPSBiYXNlICsgKGdfY3ViZV9zaXplIC0gZHkgLSAxKSAqIHZpZGVvX3N0cmlkZSArIGdfY3ViZV9zaXplOworICAgICAgICAgICAgZm9yIChkeCA9IDA7IGR4IDwgZ19jdWJlX3NpemU7IGR4KyspIHsKKyAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICBkZXN0W2RpXSA9IHNyY1tpXTsKKyAgICAgICAgICAgICAgZGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRElDRV9SSUdIVDoKKyAgICAgICAgICBmb3IgKGR5ID0gMDsgZHkgPCBnX2N1YmVfc2l6ZTsgZHkrKykgeworICAgICAgICAgICAgaSA9IGJhc2UgKyAoZHkgKiB2aWRlb19zdHJpZGUpOworICAgICAgICAgICAgZm9yIChkeCA9IDA7IGR4IDwgZ19jdWJlX3NpemU7IGR4KyspIHsKKyAgICAgICAgICAgICAgZGkgPSBiYXNlICsgZHkgKyAoZ19jdWJlX3NpemUgLSBkeCAtIDEpICogdmlkZW9fc3RyaWRlOworICAgICAgICAgICAgICBkZXN0W2RpXSA9IHNyY1tpXTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIG1hcF9pKys7CisgICAgfQorICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kaWNldHZfY3JlYXRlX21hcCAoR3N0RGljZVRWICogZmlsdGVyLCBHc3RWaWRlb0luZm8gKiBpbmZvKQoreworICBnaW50IHgsIHksIGk7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKworICB3aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIIChpbmZvKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbmZvKTsKKworICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkKKyAgICByZXR1cm47CisKKyAgZmlsdGVyLT5nX21hcF9oZWlnaHQgPSBoZWlnaHQgPj4gZmlsdGVyLT5nX2N1YmVfYml0czsKKyAgZmlsdGVyLT5nX21hcF93aWR0aCA9IHdpZHRoID4+IGZpbHRlci0+Z19jdWJlX2JpdHM7CisgIGZpbHRlci0+Z19jdWJlX3NpemUgPSAxIDw8IGZpbHRlci0+Z19jdWJlX2JpdHM7CisKKyAgaSA9IDA7CisKKyAgZm9yICh5ID0gMDsgeSA8IGZpbHRlci0+Z19tYXBfaGVpZ2h0OyB5KyspIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgZmlsdGVyLT5nX21hcF93aWR0aDsgeCsrKSB7CisgICAgICAvLyBkaWNlbWFwW2ldID0gKChpICsgeSkgJiAweDMpOyAvKiBVcCwgRG93biwgTGVmdCBvciBSaWdodCAqLworICAgICAgZmlsdGVyLT5kaWNlbWFwW2ldID0gKGZhc3RyYW5kICgpID4+IDI0KSAmIDB4MDM7CisgICAgICBpKys7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGljZXR2X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REaWNlVFYgKmZpbHRlciA9IEdTVF9ESUNFVFYgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0NVQkVfQklUUzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgICAgIGZpbHRlci0+Z19jdWJlX2JpdHMgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdzdF9kaWNldHZfY3JlYXRlX21hcCAoZmlsdGVyLCAmR1NUX1ZJREVPX0ZJTFRFUiAoZmlsdGVyKS0+aW5faW5mbyk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9kaWNldHZfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdERpY2VUViAqZmlsdGVyID0gR1NUX0RJQ0VUViAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ1VCRV9CSVRTOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZmlsdGVyLT5nX2N1YmVfYml0cyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGljZXR2X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3REaWNlVFYgKmZpbHRlciA9IEdTVF9ESUNFVFYgKG9iamVjdCk7CisKKyAgZ19mcmVlIChmaWx0ZXItPmRpY2VtYXApOworICBmaWx0ZXItPmRpY2VtYXAgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kaWNldHZfY2xhc3NfaW5pdCAoR3N0RGljZVRWQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9kaWNldHZfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfZGljZXR2X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfZGljZXR2X2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ1VCRV9CSVRTLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInNxdWFyZS1iaXRzIiwgIlNxdWFyZSBCaXRzIiwgIlRoZSBzaXplIG9mIHRoZSBTcXVhcmVzIiwKKyAgICAgICAgICBNSU5fQ1VCRV9CSVRTLCBNQVhfQ1VCRV9CSVRTLCBERUZBVUxUX0NVQkVfQklUUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkRpY2VUViBlZmZlY3QiLAorICAgICAgIkZpbHRlci9FZmZlY3QvVmlkZW8iLAorICAgICAgIidEaWNlcycgdGhlIHNjcmVlbiB1cCBpbnRvIG1hbnkgc21hbGwgc3F1YXJlcyIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmJlPiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9kaWNldHZfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9kaWNldHZfc3JjX3RlbXBsYXRlKTsKKworICB2ZmlsdGVyX2NsYXNzLT5zZXRfaW5mbyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGljZXR2X3NldF9pbmZvKTsKKyAgdmZpbHRlcl9jbGFzcy0+dHJhbnNmb3JtX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGljZXR2X3RyYW5zZm9ybV9mcmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGljZXR2X2luaXQgKEdzdERpY2VUViAqIGZpbHRlcikKK3sKKyAgZmlsdGVyLT5kaWNlbWFwID0gTlVMTDsKKyAgZmlsdGVyLT5nX2N1YmVfYml0cyA9IERFRkFVTFRfQ1VCRV9CSVRTOworICBmaWx0ZXItPmdfY3ViZV9zaXplID0gMDsKKyAgZmlsdGVyLT5nX21hcF9oZWlnaHQgPSAwOworICBmaWx0ZXItPmdfbWFwX3dpZHRoID0gMDsKK30KZGlmZiAtLWdpdCBhL2dzdC9lZmZlY3R2L2dzdGRpY2UuaCBiL2dzdC9lZmZlY3R2L2dzdGRpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzE0Yzk3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvZ3N0ZGljZS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIGRpY2UuYzogYSAnZGljaW5nJyBlZmZlY3QKKyAqICBjb3B5cmlnaHQgKGMpIDIwMDEgU2FtIE1lcnRlbnMuICBUaGlzIGNvZGUgaXMgc3ViamVjdCB0byB0aGUgcHJvdmlzaW9ucyBvZgorICogIHRoZSBHTlUgTGlicmFyeSBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBJIHN1cHBvc2UgdGhpcyBsb29rcyBzaW1pbGFyIHRvIFB1enpsZVRWLCBidXQgaXQncyBub3QuIFRoZSBzY3JlZW4gaXMKKyAqIGRpdmlkZWQgaW50byBzbWFsbCBzcXVhcmVzLCBlYWNoIG9mIHdoaWNoIGlzIHJvdGF0ZWQgZWl0aGVyIDAsIDkwLCAxODAgb3IKKyAqIDI3MCBkZWdyZWVzLiAgVGhlIGFtb3VudCBvZiByb3RhdGlvbiBmb3IgZWFjaCBzcXVhcmUgaXMgY2hvc2VuIGF0IHJhbmRvbS4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0RJQ0VfSF9fCisjZGVmaW5lIF9fR1NUX0RJQ0VfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9maWx0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0RJQ0VUViBcCisgIChnc3RfZGljZXR2X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9ESUNFVFYob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9ESUNFVFYsR3N0RGljZVRWKSkKKyNkZWZpbmUgR1NUX0RJQ0VUVl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9ESUNFVFYsR3N0RGljZVRWQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfRElDRVRWKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfRElDRVRWKSkKKyNkZWZpbmUgR1NUX0lTX0RJQ0VUVl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9ESUNFVFYpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0RGljZVRWIEdzdERpY2VUVjsKK3R5cGVkZWYgc3RydWN0IF9Hc3REaWNlVFZDbGFzcyBHc3REaWNlVFZDbGFzczsKKworc3RydWN0IF9Hc3REaWNlVFYKK3sKKyAgR3N0VmlkZW9GaWx0ZXIgdmlkZW9maWx0ZXI7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgZ3VpbnQ4ICpkaWNlbWFwOworCisgIGdpbnQgZ19jdWJlX2JpdHM7CisgIGdpbnQgZ19jdWJlX3NpemU7CisgIGdpbnQgZ19tYXBfaGVpZ2h0OworICBnaW50IGdfbWFwX3dpZHRoOworfTsKKworc3RydWN0IF9Hc3REaWNlVFZDbGFzcworeworICBHc3RWaWRlb0ZpbHRlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9kaWNldHZfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfRElDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9lZmZlY3R2L2dzdGVkZ2UuYyBiL2dzdC9lZmZlY3R2L2dzdGVkZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2ZlYjk5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5jCkBAIC0wLDAgKzEsMjU0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBFZmZlY1RWOgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgRlVLVUNISSBLZW50YXJvdQorICoKKyAqIEVkZ2VUViAtIGRldGVjdHMgZWRnZSBhbmQgZGlzcGxheSBpdCBpbiBnb29kIG9sZCBjb21wdXRlciB3YXkKKyAqCisgKiBFZmZlY1RWIGlzIGZyZWUgc29mdHdhcmUuIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWVkZ2V0dgorICoKKyAqIEVkZ2VUViBkZXRlY3RzIGVkZ2VzIGFuZCBkaXNwbGF5IGl0IGluIGdvb2Qgb2xkIGxvdyByZXNvbHV0aW9uCisgKiBjb21wdXRlciB3YXkuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIGVkZ2V0diAhIHZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgc2hvd3MgdGhlIGVmZmVjdCBvZiBlZGdldHYgb24gYSB0ZXN0IHN0cmVhbS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RlZGdlLmgiCisKKyNkZWZpbmUgZ3N0X2VkZ2V0dl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RFZGdlVFYsIGdzdF9lZGdldHYsIEdTVF9UWVBFX1ZJREVPX0ZJTFRFUik7CisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIENBUFNfU1RSIEdTVF9WSURFT19DQVBTX01BS0UgKCJ7ICBCR1J4LCBSR0J4IH0iKQorI2Vsc2UKKyNkZWZpbmUgQ0FQU19TVFIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgIHhCR1IsIHhSR0IgfSIpCisjZW5kaWYKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9lZGdldHZfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKENBUFNfU1RSKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfZWRnZXR2X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChDQVBTX1NUUikKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9lZGdldHZfc2V0X2luZm8gKEdzdFZpZGVvRmlsdGVyICogZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0RWRnZVRWICplZGdldHYgPSBHU1RfRURHRVRWIChmaWx0ZXIpOworICBndWludCBtYXBfc2l6ZTsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKGluX2luZm8pOworICBoZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluX2luZm8pOworCisgIGVkZ2V0di0+bWFwX3dpZHRoID0gd2lkdGggLyA0OworICBlZGdldHYtPm1hcF9oZWlnaHQgPSBoZWlnaHQgLyA0OworICBlZGdldHYtPnZpZGVvX3dpZHRoX21hcmdpbiA9IHdpZHRoICUgNDsKKworICBtYXBfc2l6ZSA9IGVkZ2V0di0+bWFwX3dpZHRoICogZWRnZXR2LT5tYXBfaGVpZ2h0ICogc2l6ZW9mIChndWludDMyKSAqIDI7CisKKyAgZ19mcmVlIChlZGdldHYtPm1hcCk7CisgIGVkZ2V0di0+bWFwID0gKGd1aW50MzIgKikgZ19tYWxsb2MwIChtYXBfc2l6ZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZWRnZXR2X3RyYW5zZm9ybV9mcmFtZSAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSkKK3sKKyAgR3N0RWRnZVRWICpmaWx0ZXIgPSBHU1RfRURHRVRWICh2ZmlsdGVyKTsKKyAgZ2ludCB4LCB5LCByLCBnLCBiOworICBndWludDMyICpzcmMsICpkZXN0OworICBndWludDMyIHAsIHE7CisgIGd1aW50MzIgdjAsIHYxLCB2MiwgdjM7CisgIGdpbnQgd2lkdGgsIG1hcF9oZWlnaHQsIG1hcF93aWR0aDsKKyAgZ2ludCB2aWRlb193aWR0aF9tYXJnaW47CisgIGd1aW50MzIgKm1hcDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICBtYXAgPSBmaWx0ZXItPm1hcDsKKyAgbWFwX2hlaWdodCA9IGZpbHRlci0+bWFwX2hlaWdodDsKKyAgbWFwX3dpZHRoID0gZmlsdGVyLT5tYXBfd2lkdGg7CisgIHZpZGVvX3dpZHRoX21hcmdpbiA9IGZpbHRlci0+dmlkZW9fd2lkdGhfbWFyZ2luOworCisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworCisgIHNyYyArPSB3aWR0aCAqIDQgKyA0OworICBkZXN0ICs9IHdpZHRoICogNCArIDQ7CisKKyAgZm9yICh5ID0gMTsgeSA8IG1hcF9oZWlnaHQgLSAxOyB5KyspIHsKKyAgICBmb3IgKHggPSAxOyB4IDwgbWFwX3dpZHRoIC0gMTsgeCsrKSB7CisgICAgICBwID0gKnNyYzsKKyAgICAgIHEgPSAqKHNyYyAtIDQpOworCisgICAgICAvKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgcGl4ZWwgYW5kIGxlZnQgbmVpZ2hib3IuICovCisgICAgICByID0gKChwICYgMHhmZjAwMDApIC0gKHEgJiAweGZmMDAwMCkpID4+IDE2OworICAgICAgZyA9ICgocCAmIDB4ZmYwMCkgLSAocSAmIDB4ZmYwMCkpID4+IDg7CisgICAgICBiID0gKHAgJiAweGZmKSAtIChxICYgMHhmZik7CisgICAgICByICo9IHI7CisgICAgICBnICo9IGc7CisgICAgICBiICo9IGI7CisgICAgICByID0gciA+PiA1OyAgICAgICAgICAgICAgIC8qIFRvIGxhY2sgdGhlIGxvd2VyIGJpdCBmb3Igc2F0dXJhdGVkIGFkZGl0aW9uLCAgKi8KKyAgICAgIGcgPSBnID4+IDU7ICAgICAgICAgICAgICAgLyogZGV2aWRlIHRoZSB2YWx1ZSB3aXRoIDMyLCBpbnN0ZWFkIG9mIDE2LiBJdCBpcyAqLworICAgICAgYiA9IGIgPj4gNDsgICAgICAgICAgICAgICAvKiBzYW1lIGFzIGB2MiAmPSAweGZlZmVmZicgKi8KKyAgICAgIGlmIChyID4gMTI3KQorICAgICAgICByID0gMTI3OworICAgICAgaWYgKGcgPiAxMjcpCisgICAgICAgIGcgPSAxMjc7CisgICAgICBpZiAoYiA+IDI1NSkKKyAgICAgICAgYiA9IDI1NTsKKyAgICAgIHYyID0gKHIgPDwgMTcpIHwgKGcgPDwgOSkgfCBiOworCisgICAgICAvKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgcGl4ZWwgYW5kIHVwcGVyIG5laWdoYm9yLiAqLworICAgICAgcSA9ICooc3JjIC0gd2lkdGggKiA0KTsKKyAgICAgIHIgPSAoKHAgJiAweGZmMDAwMCkgLSAocSAmIDB4ZmYwMDAwKSkgPj4gMTY7CisgICAgICBnID0gKChwICYgMHhmZjAwKSAtIChxICYgMHhmZjAwKSkgPj4gODsKKyAgICAgIGIgPSAocCAmIDB4ZmYpIC0gKHEgJiAweGZmKTsKKyAgICAgIHIgKj0gcjsKKyAgICAgIGcgKj0gZzsKKyAgICAgIGIgKj0gYjsKKyAgICAgIHIgPSByID4+IDU7CisgICAgICBnID0gZyA+PiA1OworICAgICAgYiA9IGIgPj4gNDsKKyAgICAgIGlmIChyID4gMTI3KQorICAgICAgICByID0gMTI3OworICAgICAgaWYgKGcgPiAxMjcpCisgICAgICAgIGcgPSAxMjc7CisgICAgICBpZiAoYiA+IDI1NSkKKyAgICAgICAgYiA9IDI1NTsKKyAgICAgIHYzID0gKHIgPDwgMTcpIHwgKGcgPDwgOSkgfCBiOworCisgICAgICB2MCA9IG1hcFsoeSAtIDEpICogbWFwX3dpZHRoICogMiArIHggKiAyXTsKKyAgICAgIHYxID0gbWFwW3kgKiBtYXBfd2lkdGggKiAyICsgKHggLSAxKSAqIDIgKyAxXTsKKyAgICAgIG1hcFt5ICogbWFwX3dpZHRoICogMiArIHggKiAyXSA9IHYyOworICAgICAgbWFwW3kgKiBtYXBfd2lkdGggKiAyICsgeCAqIDIgKyAxXSA9IHYzOworICAgICAgciA9IHYwICsgdjE7CisgICAgICBnID0gciAmIDB4MDEwMTAxMDA7CisgICAgICBkZXN0WzBdID0gciB8IChnIC0gKGcgPj4gOCkpOworICAgICAgciA9IHYwICsgdjM7CisgICAgICBnID0gciAmIDB4MDEwMTAxMDA7CisgICAgICBkZXN0WzFdID0gciB8IChnIC0gKGcgPj4gOCkpOworICAgICAgZGVzdFsyXSA9IHYzOworICAgICAgZGVzdFszXSA9IHYzOworICAgICAgciA9IHYyICsgdjE7CisgICAgICBnID0gciAmIDB4MDEwMTAxMDA7CisgICAgICBkZXN0W3dpZHRoXSA9IHIgfCAoZyAtIChnID4+IDgpKTsKKyAgICAgIHIgPSB2MiArIHYzOworICAgICAgZyA9IHIgJiAweDAxMDEwMTAwOworICAgICAgZGVzdFt3aWR0aCArIDFdID0gciB8IChnIC0gKGcgPj4gOCkpOworICAgICAgZGVzdFt3aWR0aCArIDJdID0gdjM7CisgICAgICBkZXN0W3dpZHRoICsgM10gPSB2MzsKKyAgICAgIGRlc3Rbd2lkdGggKiAyXSA9IHYyOworICAgICAgZGVzdFt3aWR0aCAqIDIgKyAxXSA9IHYyOworICAgICAgZGVzdFt3aWR0aCAqIDIgKyAyXSA9IDA7CisgICAgICBkZXN0W3dpZHRoICogMiArIDNdID0gMDsKKyAgICAgIGRlc3Rbd2lkdGggKiAzXSA9IHYyOworICAgICAgZGVzdFt3aWR0aCAqIDMgKyAxXSA9IHYyOworICAgICAgZGVzdFt3aWR0aCAqIDMgKyAyXSA9IDA7CisgICAgICBkZXN0W3dpZHRoICogMyArIDNdID0gMDsKKworICAgICAgc3JjICs9IDQ7CisgICAgICBkZXN0ICs9IDQ7CisgICAgfQorICAgIHNyYyArPSB3aWR0aCAqIDMgKyA4ICsgdmlkZW9fd2lkdGhfbWFyZ2luOworICAgIGRlc3QgKz0gd2lkdGggKiAzICsgOCArIHZpZGVvX3dpZHRoX21hcmdpbjsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2VkZ2V0dl9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICBHc3RFZGdlVFYgKmVkZ2V0diA9IEdTVF9FREdFVFYgKHRyYW5zKTsKKworICBpZiAoZWRnZXR2LT5tYXApCisgICAgbWVtc2V0IChlZGdldHYtPm1hcCwgMCwKKyAgICAgICAgZWRnZXR2LT5tYXBfd2lkdGggKiBlZGdldHYtPm1hcF9oZWlnaHQgKiBzaXplb2YgKGd1aW50MzIpICogMik7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2VkZ2V0dl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0RWRnZVRWICplZGdldHYgPSBHU1RfRURHRVRWIChvYmplY3QpOworCisgIGdfZnJlZSAoZWRnZXR2LT5tYXApOworICBlZGdldHYtPm1hcCA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2VkZ2V0dl9jbGFzc19pbml0IChHc3RFZGdlVFZDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2VkZ2V0dl9maW5hbGl6ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiRWRnZVRWIGVmZmVjdCIsCisgICAgICAiRmlsdGVyL0VmZmVjdC9WaWRlbyIsCisgICAgICAiQXBwbHkgZWRnZSBkZXRlY3Qgb24gdmlkZW8iLCAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNoZWxsby5iZT4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfZWRnZXR2X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfZWRnZXR2X3NyY190ZW1wbGF0ZSk7CisKKyAgdHJhbnNfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9lZGdldHZfc3RhcnQpOworCisgIHZmaWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9lZGdldHZfc2V0X2luZm8pOworICB2ZmlsdGVyX2NsYXNzLT50cmFuc2Zvcm1fZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9lZGdldHZfdHJhbnNmb3JtX2ZyYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9lZGdldHZfaW5pdCAoR3N0RWRnZVRWICogZWRnZXR2KQoreworfQpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5oIGIvZ3N0L2VmZmVjdHYvZ3N0ZWRnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MGMzMTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZWZmZWN0di9nc3RlZGdlLmgKQEAgLTAsMCArMSw3MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogRWZmZWNUVjoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZVS1VDSEkgS2VudGFyb3UKKyAqCisgKiBFZGdlVFYgLSBkZXRlY3RzIGVkZ2UgYW5kIGRpc3BsYXkgaXQgaW4gZ29vZCBvbGQgY29tcHV0ZXIgd2F5CisgKgorICogRWZmZWNUViBpcyBmcmVlIHNvZnR3YXJlLiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0VER0VfSF9fCisjZGVmaW5lIF9fR1NUX0VER0VfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9maWx0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0VER0VUViBcCisgIChnc3RfZWRnZXR2X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9FREdFVFYob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9FREdFVFYsR3N0RWRnZVRWKSkKKyNkZWZpbmUgR1NUX0VER0VUVl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9FREdFVFYsR3N0RWRnZVRWQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfRURHRVRWKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfRURHRVRWKSkKKyNkZWZpbmUgR1NUX0lTX0VER0VUVl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9FREdFVFYpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0RWRnZVRWIEdzdEVkZ2VUVjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RFZGdlVFZDbGFzcyBHc3RFZGdlVFZDbGFzczsKKworc3RydWN0IF9Hc3RFZGdlVFYKK3sKKyAgR3N0VmlkZW9GaWx0ZXIgdmlkZW9maWx0ZXI7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgZ2ludCBtYXBfd2lkdGgsIG1hcF9oZWlnaHQ7CisgIGd1aW50MzIgKm1hcDsKKyAgZ2ludCB2aWRlb193aWR0aF9tYXJnaW47Cit9OworCitzdHJ1Y3QgX0dzdEVkZ2VUVkNsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2VkZ2V0dl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9FREdFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0ZWZmZWN0di5jIGIvZ3N0L2VmZmVjdHYvZ3N0ZWZmZWN0di5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOWZmYzAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZWZmZWN0di9nc3RlZmZlY3R2LmMKQEAgLTAsMCArMSw4MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIEVmZmVjVFY6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgRlVLVUNISSBLZW50YXJvdQorICoKKyAqIEVmZmVjVFYgaXMgZnJlZSBzb2Z0d2FyZS4gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0ZWZmZWN0di5oIgorI2luY2x1ZGUgImdzdGFnaW5nLmgiCisjaW5jbHVkZSAiZ3N0ZGljZS5oIgorI2luY2x1ZGUgImdzdGVkZ2UuaCIKKyNpbmNsdWRlICJnc3RxdWFyay5oIgorI2luY2x1ZGUgImdzdHJldi5oIgorI2luY2x1ZGUgImdzdHNoYWdhZGVsaWMuaCIKKyNpbmNsdWRlICJnc3R2ZXJ0aWdvLmgiCisjaW5jbHVkZSAiZ3N0d2FycC5oIgorI2luY2x1ZGUgImdzdG9wLmgiCisjaW5jbHVkZSAiZ3N0cmFkaW9hYy5oIgorI2luY2x1ZGUgImdzdHN0cmVhay5oIgorI2luY2x1ZGUgImdzdHJpcHBsZS5oIgorCitzdHJ1Y3QgX2VsZW1lbnRzX2VudHJ5Cit7CisgIGNvbnN0IGdjaGFyICpuYW1lOworICAgIEdUeXBlICgqdHlwZSkgKHZvaWQpOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBfZWxlbWVudHNfZW50cnkgX2VsZW1lbnRzW10gPSB7CisgIHsiZWRnZXR2IiwgZ3N0X2VkZ2V0dl9nZXRfdHlwZX0sCisgIHsiYWdpbmd0diIsIGdzdF9hZ2luZ3R2X2dldF90eXBlfSwKKyAgeyJkaWNldHYiLCBnc3RfZGljZXR2X2dldF90eXBlfSwKKyAgeyJ3YXJwdHYiLCBnc3Rfd2FycHR2X2dldF90eXBlfSwKKyAgeyJzaGFnYWRlbGljdHYiLCBnc3Rfc2hhZ2FkZWxpY3R2X2dldF90eXBlfSwKKyAgeyJ2ZXJ0aWdvdHYiLCBnc3RfdmVydGlnb3R2X2dldF90eXBlfSwKKyAgeyJyZXZ0diIsIGdzdF9yZXZ0dl9nZXRfdHlwZX0sCisgIHsicXVhcmt0diIsIGdzdF9xdWFya3R2X2dldF90eXBlfSwKKyAgeyJvcHR2IiwgZ3N0X29wdHZfZ2V0X3R5cGV9LAorICB7InJhZGlvYWN0diIsIGdzdF9yYWRpb2FjdHZfZ2V0X3R5cGV9LAorICB7InN0cmVha3R2IiwgZ3N0X3N0cmVha3R2X2dldF90eXBlfSwKKyAgeyJyaXBwbGV0diIsIGdzdF9yaXBwbGV0dl9nZXRfdHlwZX0sCisgIHtOVUxMLCAwfSwKK307CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgZ2ludCBpID0gMDsKKworICB3aGlsZSAoX2VsZW1lbnRzW2ldLm5hbWUpIHsKKyAgICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sIF9lbGVtZW50c1tpXS5uYW1lLAorICAgICAgICAgICAgR1NUX1JBTktfTk9ORSwgKF9lbGVtZW50c1tpXS50eXBlKSAoKSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgaSsrOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBlZmZlY3R2LAorICAgICJlZmZlY3QgcGx1Z2lucyBmcm9tIHRoZSBlZmZlY3R2IHByb2plY3QiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9nc3QvZWZmZWN0di9nc3RlZmZlY3R2LmggYi9nc3QvZWZmZWN0di9nc3RlZmZlY3R2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwMDc5OQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L2dzdGVmZmVjdHYuaApAQCAtMCwwICsxLDMzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogRWZmZWNUVjoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBGVUtVQ0hJIEtlbnRhcm91CisgKgorICogIEVmZmVjVFYgaXMgZnJlZSBzb2Z0d2FyZS4gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK3N0YXRpYyBpbmxpbmUgZ3VpbnQKK2Zhc3RyYW5kICh2b2lkKQoreworICBzdGF0aWMgZ3VpbnQgZmFzdHJhbmRfdmFsOworCisgIHJldHVybiAoZmFzdHJhbmRfdmFsID0gZmFzdHJhbmRfdmFsICogMTEwMzUxNTI0NSArIDEyMzQ1KTsKK30KKwpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0b3AuYyBiL2dzdC9lZmZlY3R2L2dzdG9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgzODc4ZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L2dzdG9wLmMKQEAgLTAsMCArMSw0MTggQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogRWZmZWNUViAtIFJlYWx0aW1lIERpZ2l0YWwgVmlkZW8gRWZmZWN0b3IKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IEZVS1VDSEkgS2VudGFybworICoKKyAqIE9wVFYgLSBPcHRpY2FsIGFydCBtZWV0cyByZWFsLXRpbWUgdmlkZW8gZWZmZWN0LgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgRlVLVUNISSBLZW50YXJvCisgKgorICogRWZmZWNUViBpcyBmcmVlIHNvZnR3YXJlLiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtb3B0dgorICoKKyAqIFRyYWRpdGlvbmFsIGJsYWNrLXdoaXRlIG9wdGljYWwgYW5pbWF0aW9uIGlzIG5vdyByZXN1cnJlY3RlZCBhcyBhCisgKiByZWFsLXRpbWUgdmlkZW8gZWZmZWN0LiBJbnB1dCBpbWFnZXMgYXJlIGJpbmFyaXplZCBhbmQgY29tYmluZWQgd2l0aAorICogdmFyaW91cyBvcHRpY2FsIHBhdHRlcm4uCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIG9wdHYgISB2aWRlb2NvbnZlcnQgISBhdXRvdmlkZW9zaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIHNob3dzIHRoZSBlZmZlY3Qgb2Ygb3B0diBvbiBhIHRlc3Qgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RvcC5oIgorI2luY2x1ZGUgImdzdGVmZmVjdHYuaCIKKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCitlbnVtCit7CisgIE9QX1NQSVJBTDEgPSAwLAorICBPUF9TUElSQUwyLAorICBPUF9QQVJBQk9MQSwKKyAgT1BfSFNUUklQRQorfTsKKworI2RlZmluZSBHU1RfVFlQRV9PUFRWX01PREUgKGdzdF9vcHR2X21vZGVfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X29wdHZfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHR5cGUgPSAwOworCisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGVudW12YWx1ZVtdID0geworICAgIHtPUF9TUElSQUwxLCAiTWFlbHN0cm9tIiwgIm1hZWxzdHJvbSJ9LAorICAgIHtPUF9TUElSQUwyLCAiUmFkaWF0aW9uIiwgInJhZGlhdGlvbiJ9LAorICAgIHtPUF9QQVJBQk9MQSwgIkhvcml6b250YWwgU3RyaXBlcyIsCisgICAgICAgICJob3Jpem9udGFsLXN0cmlwZXMifSwKKyAgICB7T1BfSFNUUklQRSwgIlZlcnRpY2FsIFN0cmlwZXMiLCAidmVydGljYWwtc3RyaXBlcyJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIXR5cGUpIHsKKyAgICB0eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdE9wVFZNb2RlIiwgZW51bXZhbHVlKTsKKyAgfQorICByZXR1cm4gdHlwZTsKK30KKworI2RlZmluZSBERUZBVUxUX01PREUgT1BfU1BJUkFMMQorI2RlZmluZSBERUZBVUxUX1NQRUVEIDE2CisjZGVmaW5lIERFRkFVTFRfVEhSRVNIT0xEIDYwCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX01PREUsCisgIFBST1BfU1BFRUQsCisgIFBST1BfVEhSRVNIT0xECit9OworCitzdGF0aWMgZ3VpbnQzMiBwYWxldHRlWzI1Nl07CisKKyNkZWZpbmUgZ3N0X29wdHZfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0T3BUViwgZ3N0X29wdHYsIEdTVF9UWVBFX1ZJREVPX0ZJTFRFUik7CisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIENBUFNfU1RSIEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IEJHUngsIFJHQnggfSIpCisjZWxzZQorI2RlZmluZSBDQVBTX1NUUiBHU1RfVklERU9fQ0FQU19NQUtFICgieyB4QkdSLCB4UkdCIH0iKQorI2VuZGlmCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3Rfb3B0dl9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoQ0FQU19TVFIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9vcHR2X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChDQVBTX1NUUikKKyAgICApOworCitzdGF0aWMgdm9pZAoraW5pdFBhbGV0dGUgKHZvaWQpCit7CisgIGdpbnQgaTsKKyAgZ3VpbnQ4IHY7CisKKyAgZm9yIChpID0gMDsgaSA8IDExMjsgaSsrKSB7CisgICAgcGFsZXR0ZVtpXSA9IDA7CisgICAgcGFsZXR0ZVtpICsgMTI4XSA9IDB4ZmZmZmZmOworICB9CisgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgdiA9IDE2ICogKGkgKyAxKSAtIDE7CisgICAgcGFsZXR0ZVtpICsgMTEyXSA9ICh2IDw8IDE2KSB8ICh2IDw8IDgpIHwgdjsKKyAgICB2ID0gMjU1IC0gdjsKKyAgICBwYWxldHRlW2kgKyAyNDBdID0gKHYgPDwgMTYpIHwgKHYgPDwgOCkgfCB2OworICB9Cit9CisKK3N0YXRpYyB2b2lkCitzZXRPcG1hcCAoZ2ludDggKiBvcG1hcFs0XSwgZ2ludCB3aWR0aCwgZ2ludCBoZWlnaHQpCit7CisgIGdpbnQgaSwgaiwgeCwgeTsKKyNpZm5kZWYgUFMyCisgIGdkb3VibGUgeHgsIHl5LCByLCBhdCwgcnI7CisjZWxzZQorICBnZmxvYXQgeHgsIHl5LCByLCBhdCwgcnI7CisjZW5kaWYKKyAgZ2ludCBzY2k7CisKKyAgc2NpID0gNjQwIC8gd2lkdGg7CisgIGkgPSAwOworICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICB5eSA9IChnZG91YmxlKSAoeSAtIGhlaWdodCAvIDIpIC8gd2lkdGg7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgIHh4ID0gKGdkb3VibGUpIHggLyB3aWR0aCAtIDAuNTsKKyNpZm5kZWYgUFMyCisgICAgICByID0gc3FydCAoeHggKiB4eCArIHl5ICogeXkpOworICAgICAgYXQgPSBhdGFuMiAoeHgsIHl5KTsKKyNlbHNlCisgICAgICByID0gc3FydGYgKHh4ICogeHggKyB5eSAqIHl5KTsKKyAgICAgIGF0ID0gYXRhbjJmICh4eCwgeXkpOworI2VuZGlmCisKKyAgICAgIG9wbWFwW09QX1NQSVJBTDFdW2ldID0gKChndWludCkKKyAgICAgICAgICAoKGF0IC8gR19QSSAqIDI1NikgKyAociAqIDQwMDApKSkgJiAyNTU7CisKKyAgICAgIGogPSByICogMzAwIC8gMzI7CisgICAgICByciA9IHIgKiAzMDAgLSBqICogMzI7CisgICAgICBqICo9IDY0OworICAgICAgaiArPSAocnIgPiAyOCkgPyAocnIgLSAyOCkgKiAxNiA6IDA7CisgICAgICBvcG1hcFtPUF9TUElSQUwyXVtpXSA9ICgoZ3VpbnQpCisgICAgICAgICAgKChhdCAvIEdfUEkgKiA0MDk2KSArIChyICogMTYwMCkgLSBqKSkgJiAyNTU7CisKKyAgICAgIG9wbWFwW09QX1BBUkFCT0xBXVtpXSA9CisgICAgICAgICAgKChndWludCkgKHl5IC8gKHh4ICogeHggKiAwLjMgKyAwLjEpICogNDAwKSkgJiAyNTU7CisgICAgICBvcG1hcFtPUF9IU1RSSVBFXVtpXSA9IHggKiA4ICogc2NpOworICAgICAgaSsrOworICAgIH0KKyAgfQorfQorCisvKiBUYWtlbiBmcm9tIGVmZmVjdHYvaW1hZ2UuYyAqLworLyogWSB2YWx1ZSBmaWx0ZXJzICovCitzdGF0aWMgdm9pZAoraW1hZ2VfeV9vdmVyIChndWludDMyICogc3JjLCBndWludDggKiBkaWZmLCBnaW50IHlfdGhyZXNob2xkLCBnaW50IHZpZGVvX2FyZWEpCit7CisgIGdpbnQgaTsKKyAgZ2ludCBSLCBHLCBCLCB2OworICBndWludDggKnAgPSBkaWZmOworCisgIGZvciAoaSA9IHZpZGVvX2FyZWE7IGkgPiAwOyBpLS0pIHsKKyAgICBSID0gKCgqc3JjKSAmIDB4ZmYwMDAwKSA+PiAoMTYgLSAxKTsKKyAgICBHID0gKCgqc3JjKSAmIDB4ZmYwMCkgPj4gKDggLSAyKTsKKyAgICBCID0gKCpzcmMpICYgMHhmZjsKKyAgICB2ID0geV90aHJlc2hvbGQgKiA3IC0gKFIgKyBHICsgQik7CisgICAgKnAgPSAoZ3VpbnQ4KSAodiA+PiAyNCk7CisgICAgc3JjKys7CisgICAgcCsrOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfb3B0dl90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUpCit7CisgIEdzdE9wVFYgKmZpbHRlciA9IEdTVF9PUFRWICh2ZmlsdGVyKTsKKyAgZ3VpbnQzMiAqc3JjLCAqZGVzdDsKKyAgZ2ludDggKnA7CisgIGd1aW50OCAqZGlmZjsKKyAgZ2ludCB4LCB5LCB3aWR0aCwgaGVpZ2h0OworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBzdHJlYW1fdGltZTsKKyAgZ3VpbnQ4IHBoYXNlOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbl9mcmFtZS0+YnVmZmVyKTsKKyAgc3RyZWFtX3RpbWUgPQorICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZHU1RfQkFTRV9UUkFOU0ZPUk0gKHZmaWx0ZXIpLT5zZWdtZW50LAorICAgICAgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgInN5bmMgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW1fdGltZSkpCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoZmlsdGVyKSwgc3RyZWFtX3RpbWUpOworCisgIGlmIChHX1VOTElLRUxZIChmaWx0ZXItPm9wbWFwWzBdID09IE5VTEwpKQorICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgc3dpdGNoIChmaWx0ZXItPm1vZGUpIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgMDoKKyAgICAgIHAgPSBmaWx0ZXItPm9wbWFwW09QX1NQSVJBTDFdOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgcCA9IGZpbHRlci0+b3BtYXBbT1BfU1BJUkFMMl07CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBwID0gZmlsdGVyLT5vcG1hcFtPUF9QQVJBQk9MQV07CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBwID0gZmlsdGVyLT5vcG1hcFtPUF9IU1RSSVBFXTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgZmlsdGVyLT5waGFzZSAtPSBmaWx0ZXItPnNwZWVkOworCisgIGRpZmYgPSBmaWx0ZXItPmRpZmY7CisgIGltYWdlX3lfb3ZlciAoc3JjLCBkaWZmLCBmaWx0ZXItPnRocmVzaG9sZCwgd2lkdGggKiBoZWlnaHQpOworICBwaGFzZSA9IGZpbHRlci0+cGhhc2U7CisKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICpkZXN0KysgPSBwYWxldHRlWygoKGd1aW50OCkgKCpwICsgcGhhc2UpKSBeICpkaWZmKyspICYgMjU1XTsKKyAgICAgIHArKzsKKyAgICB9CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGZpbHRlcik7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vcHR2X3NldF9pbmZvIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsIEdzdENhcHMgKiBpbmNhcHMsCisgICAgR3N0VmlkZW9JbmZvICogaW5faW5mbywgR3N0Q2FwcyAqIG91dGNhcHMsIEdzdFZpZGVvSW5mbyAqIG91dF9pbmZvKQoreworICBHc3RPcFRWICpmaWx0ZXIgPSBHU1RfT1BUViAodmZpbHRlcik7CisgIGdpbnQgaSwgd2lkdGgsIGhlaWdodDsKKworICB3aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIIChpbl9pbmZvKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbl9pbmZvKTsKKworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgZ19mcmVlIChmaWx0ZXItPm9wbWFwW2ldKTsKKyAgICBmaWx0ZXItPm9wbWFwW2ldID0gZ19uZXcgKGdpbnQ4LCB3aWR0aCAqIGhlaWdodCk7CisgIH0KKyAgc2V0T3BtYXAgKGZpbHRlci0+b3BtYXAsIHdpZHRoLCBoZWlnaHQpOworCisgIGdfZnJlZSAoZmlsdGVyLT5kaWZmKTsKKyAgZmlsdGVyLT5kaWZmID0gZ19uZXcgKGd1aW50OCwgd2lkdGggKiBoZWlnaHQpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vcHR2X3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpCit7CisgIEdzdE9wVFYgKmZpbHRlciA9IEdTVF9PUFRWICh0cmFucyk7CisKKyAgZmlsdGVyLT5waGFzZSA9IDA7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3B0dl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0T3BUViAqZmlsdGVyID0gR1NUX09QVFYgKG9iamVjdCk7CisKKyAgaWYgKGZpbHRlci0+b3BtYXBbMF0pIHsKKyAgICBnaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICBnX2ZyZWUgKGZpbHRlci0+b3BtYXBbaV0pOworICAgICAgZmlsdGVyLT5vcG1hcFtpXSA9IE5VTEw7CisgICAgfQorICB9CisKKyAgZ19mcmVlIChmaWx0ZXItPmRpZmYpOworICBmaWx0ZXItPmRpZmYgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vcHR2X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RPcFRWICpmaWx0ZXIgPSBHU1RfT1BUViAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZmlsdGVyLT5tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NQRUVEOgorICAgICAgZmlsdGVyLT5zcGVlZCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUkVTSE9MRDoKKyAgICAgIGZpbHRlci0+dGhyZXNob2xkID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vcHR2X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RPcFRWICpmaWx0ZXIgPSBHU1RfT1BUViAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTU9ERToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBmaWx0ZXItPm1vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NQRUVEOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZmlsdGVyLT5zcGVlZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSRVNIT0xEOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIGZpbHRlci0+dGhyZXNob2xkKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9vcHR2X2NsYXNzX2luaXQgKEdzdE9wVFZDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9vcHR2X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X29wdHZfZ2V0X3Byb3BlcnR5OworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X29wdHZfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJtb2RlIiwgIk1vZGUiLAorICAgICAgICAgICJNb2RlIiwgR1NUX1RZUEVfT1BUVl9NT0RFLCBERUZBVUxUX01PREUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TUEVFRCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJzcGVlZCIsICJTcGVlZCIsCisgICAgICAgICAgIkVmZmVjdCBzcGVlZCIsIEdfTUlOSU5ULCBHX01BWElOVCwgREVGQVVMVF9TUEVFRCwKKyAgICAgICAgICBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJFU0hPTEQsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInRocmVzaG9sZCIsICJUaHJlc2hvbGQiLAorICAgICAgICAgICJMdW1hIHRocmVzaG9sZCIsIDAsIEdfTUFYSU5ULCBERUZBVUxUX1RIUkVTSE9MRCwKKyAgICAgICAgICBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIk9wVFYgZWZmZWN0IiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJPcHRpY2FsIGFydCBtZWV0cyByZWFsLXRpbWUgdmlkZW8gZWZmZWN0IiwKKyAgICAgICJGVUtVQ0hJLCBLZW50YXJvdSA8ZnVrdWNoaUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LCAiCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X29wdHZfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9vcHR2X3NyY190ZW1wbGF0ZSk7CisKKyAgdHJhbnNfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vcHR2X3N0YXJ0KTsKKworICB2ZmlsdGVyX2NsYXNzLT5zZXRfaW5mbyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3B0dl9zZXRfaW5mbyk7CisgIHZmaWx0ZXJfY2xhc3MtPnRyYW5zZm9ybV9mcmFtZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3B0dl90cmFuc2Zvcm1fZnJhbWUpOworCisgIGluaXRQYWxldHRlICgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29wdHZfaW5pdCAoR3N0T3BUViAqIGZpbHRlcikKK3sKKyAgZmlsdGVyLT5zcGVlZCA9IERFRkFVTFRfU1BFRUQ7CisgIGZpbHRlci0+bW9kZSA9IERFRkFVTFRfTU9ERTsKKyAgZmlsdGVyLT50aHJlc2hvbGQgPSBERUZBVUxUX1RIUkVTSE9MRDsKK30KZGlmZiAtLWdpdCBhL2dzdC9lZmZlY3R2L2dzdG9wLmggYi9nc3QvZWZmZWN0di9nc3RvcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NzI0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZWZmZWN0di9nc3RvcC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogRWZmZWNUViAtIFJlYWx0aW1lIERpZ2l0YWwgVmlkZW8gRWZmZWN0b3IKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IEZVS1VDSEkgS2VudGFybworICoKKyAqIE9wVFYgLSBPcHRpY2FsIGFydCBtZWV0cyByZWFsLXRpbWUgdmlkZW8gZWZmZWN0LgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgRlVLVUNISSBLZW50YXJvCisgKgorICogRWZmZWNUViBpcyBmcmVlIHNvZnR3YXJlLiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9PUF9IX18KKyNkZWZpbmUgX19HU1RfT1BfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9maWx0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX09QVFYgXAorICAoZ3N0X29wdHZfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX09QVFYob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9PUFRWLEdzdE9wVFYpKQorI2RlZmluZSBHU1RfT1BUVl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9PUFRWLEdzdE9wVFZDbGFzcykpCisjZGVmaW5lIEdTVF9JU19PUFRWKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfT1BUVikpCisjZGVmaW5lIEdTVF9JU19PUFRWX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX09QVFYpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0T3BUViBHc3RPcFRWOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9wVFZDbGFzcyBHc3RPcFRWQ2xhc3M7CisKK3N0cnVjdCBfR3N0T3BUVgoreworICBHc3RWaWRlb0ZpbHRlciBlbGVtZW50OworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIGdpbnQgbW9kZTsKKyAgZ2ludCBzcGVlZDsKKyAgZ3VpbnQgdGhyZXNob2xkOworCisgIGdpbnQ4ICpvcG1hcFs0XTsKKyAgZ3VpbnQ4ICpkaWZmOworICBndWludDggcGhhc2U7Cit9OworCitzdHJ1Y3QgX0dzdE9wVFZDbGFzcworeworICBHc3RWaWRlb0ZpbHRlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9vcHR2X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX09QX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuYyBiL2dzdC9lZmZlY3R2L2dzdHF1YXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhZGU3NQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L2dzdHF1YXJrLmMKQEAgLTAsMCArMSwyOTkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIEVmZmVjVFY6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBGVUtVQ0hJIEtlbnRhcm91CisgKgorICogUXVhcmtUViAtIG1vdGlvbiBkaXNvbHZlci4KKyAqCisgKiAgRWZmZWNUViBpcyBmcmVlIHNvZnR3YXJlLiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcXVhcmt0dgorICoKKyAqIFF1YXJrVFYgZGlzb2x2ZXMgbW92aW5nIG9iamVjdHMuIEl0IHBpY2tzIHVwIHBpeGVscyBmcm9tCisgKiB0aGUgbGFzdCBmcmFtZXMgcmFuZG9tbHkuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIHF1YXJrdHYgISB2aWRlb2NvbnZlcnQgISBhdXRvdmlkZW9zaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIHNob3dzIHRoZSBlZmZlY3Qgb2YgcXVhcmt0diBvbiBhIHRlc3Qgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RxdWFyay5oIgorI2luY2x1ZGUgImdzdGVmZmVjdHYuaCIKKworLyogbnVtYmVyIG9mIGZyYW1lcyBvZiB0aW1lLWJ1ZmZlci4gSXQgc2hvdWxkIGJlIGFzIGEgY29uZmlndXJhYmxlIHBhcmFtYXRlciAqLworLyogVGhpcyBudW1iZXIgYWxzbyBtdXN0IGJlIDJebiBqdXN0IGZvciB0aGUgc3BlZWQuICovCisjZGVmaW5lIFBMQU5FUyAxNgorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9QTEFORVMKK307CisKKyNkZWZpbmUgZ3N0X3F1YXJrdHZfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UXVhcmtUViwgZ3N0X3F1YXJrdHYsIEdTVF9UWVBFX1ZJREVPX0ZJTFRFUik7CisKK3N0YXRpYyB2b2lkIGdzdF9xdWFya3R2X3BsYW5ldGFibGVfY2xlYXIgKEdzdFF1YXJrVFYgKiBmaWx0ZXIpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3F1YXJrdHZfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IHhSR0IsIHhCR1IsIEJHUngsIFJHQnggfSIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcXVhcmt0dl9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgeFJHQiwgeEJHUiwgQkdSeCwgUkdCeCB9IikpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuCitnc3RfcXVhcmt0dl9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0UXVhcmtUViAqZmlsdGVyID0gR1NUX1FVQVJLVFYgKHZmaWx0ZXIpOworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgd2lkdGggPSBHU1RfVklERU9fSU5GT19XSURUSCAoaW5faW5mbyk7CisgIGhlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5faW5mbyk7CisKKyAgZ3N0X3F1YXJrdHZfcGxhbmV0YWJsZV9jbGVhciAoZmlsdGVyKTsKKyAgZmlsdGVyLT5hcmVhID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcXVhcmt0dl90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUpCit7CisgIEdzdFF1YXJrVFYgKmZpbHRlciA9IEdTVF9RVUFSS1RWICh2ZmlsdGVyKTsKKyAgZ2ludCBhcmVhOworICBndWludDMyICpzcmMsICpkZXN0OworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworICBHc3RCdWZmZXIgKipwbGFuZXRhYmxlOworICBnaW50IHBsYW5lcywgY3VycmVudF9wbGFuZTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5fZnJhbWUtPmJ1ZmZlcik7CisgIHRpbWVzdGFtcCA9CisgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJkdTVF9CQVNFX1RSQU5TRk9STSAodmZpbHRlciktPnNlZ21lbnQsCisgICAgICBHU1RfRk9STUFUX1RJTUUsIHRpbWVzdGFtcCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAic3luYyB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHRpbWVzdGFtcCkpCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoZmlsdGVyKSwgdGltZXN0YW1wKTsKKworICBpZiAoR19VTkxJS0VMWSAoZmlsdGVyLT5wbGFuZXRhYmxlID09IE5VTEwpKQorICAgIHJldHVybiBHU1RfRkxPV19GTFVTSElORzsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworICBhcmVhID0gZmlsdGVyLT5hcmVhOworICBwbGFuZXRhYmxlID0gZmlsdGVyLT5wbGFuZXRhYmxlOworICBwbGFuZXMgPSBmaWx0ZXItPnBsYW5lczsKKyAgY3VycmVudF9wbGFuZSA9IGZpbHRlci0+Y3VycmVudF9wbGFuZTsKKworICBpZiAocGxhbmV0YWJsZVtjdXJyZW50X3BsYW5lXSkKKyAgICBnc3RfYnVmZmVyX3VucmVmIChwbGFuZXRhYmxlW2N1cnJlbnRfcGxhbmVdKTsKKyAgcGxhbmV0YWJsZVtjdXJyZW50X3BsYW5lXSA9IGdzdF9idWZmZXJfcmVmIChpbl9mcmFtZS0+YnVmZmVyKTsKKworICAvKiBGb3IgZWFjaCBwaXhlbCAqLworICB3aGlsZSAoLS1hcmVhKSB7CisgICAgR3N0QnVmZmVyICpyYW5kOworCisgICAgLyogcGljayBhIHJhbmRvbSBidWZmZXIgKi8KKyAgICByYW5kID0gcGxhbmV0YWJsZVsoY3VycmVudF9wbGFuZSArIChmYXN0cmFuZCAoKSA+PiAyNCkpICUgcGxhbmVzXTsKKworICAgIC8qIENvcHkgdGhlIHBpeGVsIGZyb20gdGhlIHJhbmRvbSBidWZmZXIgdG8gZGVzdCwgRklYTUUsIHNsb3cgKi8KKyAgICBpZiAocmFuZCkKKyAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAocmFuZCwgYXJlYSAqIDQsICZkZXN0W2FyZWFdLCA0KTsKKyAgICBlbHNlCisgICAgICBkZXN0W2FyZWFdID0gc3JjW2FyZWFdOworICB9CisKKyAgZmlsdGVyLT5jdXJyZW50X3BsYW5lLS07CisgIGlmIChmaWx0ZXItPmN1cnJlbnRfcGxhbmUgPCAwKQorICAgIGZpbHRlci0+Y3VycmVudF9wbGFuZSA9IHBsYW5lcyAtIDE7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdWFya3R2X3BsYW5ldGFibGVfY2xlYXIgKEdzdFF1YXJrVFYgKiBmaWx0ZXIpCit7CisgIGdpbnQgaTsKKworICBpZiAoZmlsdGVyLT5wbGFuZXRhYmxlID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXItPnBsYW5lczsgaSsrKSB7CisgICAgaWYgKEdTVF9JU19CVUZGRVIgKGZpbHRlci0+cGxhbmV0YWJsZVtpXSkpIHsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGZpbHRlci0+cGxhbmV0YWJsZVtpXSk7CisgICAgfQorICAgIGZpbHRlci0+cGxhbmV0YWJsZVtpXSA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcXVhcmt0dl9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICBHc3RRdWFya1RWICpmaWx0ZXIgPSBHU1RfUVVBUktUViAodHJhbnMpOworCisgIGlmIChmaWx0ZXItPnBsYW5ldGFibGUpIHsKKyAgICBnc3RfcXVhcmt0dl9wbGFuZXRhYmxlX2NsZWFyIChmaWx0ZXIpOworICAgIGdfZnJlZSAoZmlsdGVyLT5wbGFuZXRhYmxlKTsKKyAgfQorICBmaWx0ZXItPnBsYW5ldGFibGUgPQorICAgICAgKEdzdEJ1ZmZlciAqKikgZ19tYWxsb2MwIChmaWx0ZXItPnBsYW5lcyAqIHNpemVvZiAoR3N0QnVmZmVyICopKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdWFya3R2X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RRdWFya1RWICpmaWx0ZXIgPSBHU1RfUVVBUktUViAob2JqZWN0KTsKKworICBpZiAoZmlsdGVyLT5wbGFuZXRhYmxlKSB7CisgICAgZ3N0X3F1YXJrdHZfcGxhbmV0YWJsZV9jbGVhciAoZmlsdGVyKTsKKyAgICBnX2ZyZWUgKGZpbHRlci0+cGxhbmV0YWJsZSk7CisgICAgZmlsdGVyLT5wbGFuZXRhYmxlID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdWFya3R2X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RRdWFya1RWICpmaWx0ZXIgPSBHU1RfUVVBUktUViAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QTEFORVM6CisgICAgeworICAgICAgZ2ludCBuZXdfbl9wbGFuZXMgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIEdzdEJ1ZmZlciAqKm5ld19wbGFuZXRhYmxlOworICAgICAgZ2ludCBpOworCisgICAgICAvKiBJZiB0aGUgbnVtYmVyIG9mIHBsYW5lcyBjaGFuZ2VkLCBjb3B5IGFjcm9zcyBhbnkgZXhpc3RpbmcgcGxhbmVzICovCisgICAgICBpZiAobmV3X25fcGxhbmVzICE9IGZpbHRlci0+cGxhbmVzKSB7CisgICAgICAgIG5ld19wbGFuZXRhYmxlID0KKyAgICAgICAgICAgIChHc3RCdWZmZXIgKiopIGdfbWFsbG9jMCAobmV3X25fcGxhbmVzICogc2l6ZW9mIChHc3RCdWZmZXIgKikpOworCisgICAgICAgIGlmIChmaWx0ZXItPnBsYW5ldGFibGUpIHsKKyAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IG5ld19uX3BsYW5lcykgJiYgKGkgPCBmaWx0ZXItPnBsYW5lcyk7IGkrKykgeworICAgICAgICAgICAgbmV3X3BsYW5ldGFibGVbaV0gPSBmaWx0ZXItPnBsYW5ldGFibGVbaV07CisgICAgICAgICAgfQorICAgICAgICAgIGZvciAoOyBpIDwgZmlsdGVyLT5wbGFuZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKGZpbHRlci0+cGxhbmV0YWJsZVtpXSkKKyAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoZmlsdGVyLT5wbGFuZXRhYmxlW2ldKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ19mcmVlIChmaWx0ZXItPnBsYW5ldGFibGUpOworICAgICAgICB9CisKKyAgICAgICAgZmlsdGVyLT5wbGFuZXRhYmxlID0gbmV3X3BsYW5ldGFibGU7CisgICAgICAgIGZpbHRlci0+cGxhbmVzID0gbmV3X25fcGxhbmVzOworICAgICAgICBmaWx0ZXItPmN1cnJlbnRfcGxhbmUgPSBmaWx0ZXItPnBsYW5lcyAtIDE7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdWFya3R2X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RRdWFya1RWICpmaWx0ZXIgPSBHU1RfUVVBUktUViAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUExBTkVTOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZmlsdGVyLT5wbGFuZXMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3F1YXJrdHZfY2xhc3NfaW5pdCAoR3N0UXVhcmtUVkNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqdHJhbnNfY2xhc3MgPSAoR3N0QmFzZVRyYW5zZm9ybUNsYXNzICopIGtsYXNzOworICBHc3RWaWRlb0ZpbHRlckNsYXNzICp2ZmlsdGVyX2NsYXNzID0gKEdzdFZpZGVvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3F1YXJrdHZfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcXVhcmt0dl9nZXRfcHJvcGVydHk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcXVhcmt0dl9maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BMQU5FUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJwbGFuZXMiLCAiUGxhbmVzIiwKKyAgICAgICAgICAiTnVtYmVyIG9mIHBsYW5lcyIsIDEsIDY0LCBQTEFORVMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJRdWFya1RWIGVmZmVjdCIsCisgICAgICAiRmlsdGVyL0VmZmVjdC9WaWRlbyIsCisgICAgICAiTW90aW9uIGRpc3NvbHZlciIsICJGVUtVQ0hJLCBLZW50YXJvdSA8ZnVrdWNoaUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3F1YXJrdHZfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9xdWFya3R2X3NyY190ZW1wbGF0ZSk7CisKKyAgdHJhbnNfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9xdWFya3R2X3N0YXJ0KTsKKworICB2ZmlsdGVyX2NsYXNzLT5zZXRfaW5mbyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcXVhcmt0dl9zZXRfaW5mbyk7CisgIHZmaWx0ZXJfY2xhc3MtPnRyYW5zZm9ybV9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3F1YXJrdHZfdHJhbnNmb3JtX2ZyYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdWFya3R2X2luaXQgKEdzdFF1YXJrVFYgKiBmaWx0ZXIpCit7CisgIGZpbHRlci0+cGxhbmVzID0gUExBTkVTOworICBmaWx0ZXItPmN1cnJlbnRfcGxhbmUgPSBmaWx0ZXItPnBsYW5lcyAtIDE7Cit9CmRpZmYgLS1naXQgYS9nc3QvZWZmZWN0di9nc3RxdWFyay5oIGIvZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTU3NzU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvZ3N0cXVhcmsuaApAQCAtMCwwICsxLDcxIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBFZmZlY1RWOgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgRlVLVUNISSBLZW50YXJvdQorICoKKyAqIFF1YXJrVFYgLSBtb3Rpb24gZGlzb2x2ZXIuCisgKgorICogIEVmZmVjVFYgaXMgZnJlZSBzb2Z0d2FyZS4gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUVVBUktfSF9fCisjZGVmaW5lIF9fR1NUX1FVQVJLX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9RVUFSS1RWIFwKKyAgKGdzdF9xdWFya3R2X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9RVUFSS1RWKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUVVBUktUVixHc3RRdWFya1RWKSkKKyNkZWZpbmUgR1NUX1FVQVJLVFZfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUVVBUktUVixHc3RRdWFya1RWQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUVVBUktUVihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1FVQVJLVFYpKQorI2RlZmluZSBHU1RfSVNfUVVBUktUVl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9RVUFSS1RWKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFF1YXJrVFYgR3N0UXVhcmtUVjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RRdWFya1RWQ2xhc3MgR3N0UXVhcmtUVkNsYXNzOworCitzdHJ1Y3QgX0dzdFF1YXJrVFYKK3sKKyAgR3N0VmlkZW9GaWx0ZXIgZWxlbWVudDsKKworICAvKiA8IHByaXZhdGUgPiAqLworICBnaW50IGFyZWE7CisgIGdpbnQgcGxhbmVzOworICBnaW50IGN1cnJlbnRfcGxhbmU7CisgIEdzdEJ1ZmZlciAqKnBsYW5ldGFibGU7Cit9OworCitzdHJ1Y3QgX0dzdFF1YXJrVFZDbGFzcworeworICBHc3RWaWRlb0ZpbHRlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9xdWFya3R2X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1FVQVJLX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5jIGIvZ3N0L2VmZmVjdHYvZ3N0cmFkaW9hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjM2ODQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZWZmZWN0di9nc3RyYWRpb2FjLmMKQEAgLTAsMCArMSw2MjIgQEAKKy8qIEdTdHJlYW1lcgorICogQ3JhZGlvYWN5cmlnaHQgKEMpIDwyMDA5PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBFZmZlY1RWIC0gUmVhbHRpbWUgRGlnaXRhbCBWaWRlbyBFZmZlY3RvcgorICogQ3JhZGlvYWN5cmlnaHQgKEMpIDIwMDEtMjAwNiBGVUtVQ0hJIEtlbnRhcm8KKyAqCisgKiBSYWRpb2FjVFYgLSBtb3Rpb24tZW5saWdodG1lbnQgZWZmZWN0LgorICogQ3JhZGlvYWN5cmlnaHQgKEMpIDIwMDEtMjAwMiBGVUtVQ0hJIEtlbnRhcm8KKyAqCisgKiBFZmZlY1RWIGlzIGZyZWUgc29mdHdhcmUuIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIHJhZGlvYWN0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhyYWRpb2FjZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjcmFkaW9hY3kgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1yYWRpb2FjdHYKKyAqCisgKiBSYWRpb2FjVFYgZG9lcyAqTk9UKiBkZXRlY3QgYSByYWRpb2FjdGl2aXR5LiBJdCBkZXRlY3RzIGEgZGlmZmVyZW5jZQorICogZnJvbSBwcmV2aW91cyBmcmFtZSBhbmQgYmx1cnMgaXQuCisgKiAKKyAqIFJhZGlvYWNUViBoYXMgNCBtb2RlLCBub3JtYWwsIHN0cm9iZTEsIHN0cm9iZTIgYW5kIHRyaWdnZXIuCisgKiBJbiB0cmlnZ2VyIG1vZGUsIGVmZmVjdCBhcHBlYXJzIG9ubHkgd2hlbiB0aGUgdHJpZ2dlciBwcm9wZXJ0eSBpcyAlVFJVRS4KKyAqCisgKiBzdHJvYmUxIGFuZCBzdHJvYmUyIG1vZGUgZHJvcHMgc29tZSBmcmFtZXMuIHN0cm9iZTEgbW9kZSB1c2VzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAqIGN1cnJlbnQgZnJhbWUgYW5kIHByZXZpb3VzIGZyYW1lIGRyb3BwZWQsIHdoaWxlIHN0cm9iZTIgbW9kZSB1c2VzIHRoZSBkaWZmZXJlbmNlIGZyb20KKyAqIHByZXZpb3VzIGZyYW1lIGRpc3BsYXllZC4gVGhlIGVmZmVjdCBvZiBzdHJvYmUyIGlzIHN0cm9uZ2VyIHRoYW4gc3Ryb2JlMS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgdmlkZW90ZXN0c3JjICEgcmFkaW9hY3R2ICEgdmlkZW9jb252ZXJ0ICEgYXV0b3ZpZGVvc2luaworICogXXwgVGhpcyBwaXBlbGluZSBzaG93cyB0aGUgZWZmZWN0IG9mIHJhZGlvYWN0diBvbiBhIHRlc3Qgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RyYWRpb2FjLmgiCisjaW5jbHVkZSAiZ3N0ZWZmZWN0di5oIgorCitlbnVtCit7CisgIFJBRElPQUNfTk9STUFMID0gMCwKKyAgUkFESU9BQ19TVFJPQkUsCisgIFJBRElPQUNfU1RST0JFMiwKKyAgUkFESU9BQ19UUklHR0VSCit9OworCitlbnVtCit7CisgIENPTE9SX1JFRCA9IDAsCisgIENPTE9SX0dSRUVOLAorICBDT0xPUl9CTFVFLAorICBDT0xPUl9XSElURQorfTsKKworI2RlZmluZSBHU1RfVFlQRV9SQURJT0FDVFZfTU9ERSAoZ3N0X3JhZGlvYWN0dl9tb2RlX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9yYWRpb2FjdHZfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHR5cGUgPSAwOworCisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGVudW12YWx1ZVtdID0geworICAgIHtSQURJT0FDX05PUk1BTCwgIk5vcm1hbCIsICJub3JtYWwifSwKKyAgICB7UkFESU9BQ19TVFJPQkUsICJTdHJvYmUgMSIsICJzdHJvYmUxIn0sCisgICAge1JBRElPQUNfU1RST0JFMiwgIlN0cm9iZSAyIiwgInN0cm9iZTIifSwKKyAgICB7UkFESU9BQ19UUklHR0VSLCAiVHJpZ2dlciIsICJ0cmlnZ2VyIn0sCisgICAgezAsIE5VTEwsIE5VTEx9LAorICB9OworCisgIGlmICghdHlwZSkgeworICAgIHR5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0UmFkaW9hY1RWTW9kZSIsIGVudW12YWx1ZSk7CisgIH0KKyAgcmV0dXJuIHR5cGU7Cit9CisKKyNkZWZpbmUgR1NUX1RZUEVfUkFESU9BQ1RWX0NPTE9SIChnc3RfcmFkaW9hY3R2X2NvbG9yX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9yYWRpb2FjdHZfY29sb3JfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB0eXBlID0gMDsKKworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBlbnVtdmFsdWVbXSA9IHsKKyAgICB7Q09MT1JfUkVELCAiUmVkIiwgInJlZCJ9LAorICAgIHtDT0xPUl9HUkVFTiwgIkdyZWVuIiwgImdyZWVuIn0sCisgICAge0NPTE9SX0JMVUUsICJCbHVlIiwgImJsdWUifSwKKyAgICB7Q09MT1JfV0hJVEUsICJXaGl0ZSIsICJ3aGl0ZSJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIXR5cGUpIHsKKyAgICB0eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFJhZGlvYWNUVkNvbG9yIiwgZW51bXZhbHVlKTsKKyAgfQorICByZXR1cm4gdHlwZTsKK30KKworI2RlZmluZSBERUZBVUxUX01PREUgUkFESU9BQ19OT1JNQUwKKyNkZWZpbmUgREVGQVVMVF9DT0xPUiBDT0xPUl9XSElURQorI2RlZmluZSBERUZBVUxUX0lOVEVSVkFMIDMKKyNkZWZpbmUgREVGQVVMVF9UUklHR0VSIEZBTFNFCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX01PREUsCisgIFBST1BfQ09MT1IsCisgIFBST1BfSU5URVJWQUwsCisgIFBST1BfVFJJR0dFUgorfTsKKworI2RlZmluZSBDT0xPUlMgMzIKKyNkZWZpbmUgUEFUVEVSTiA0CisjZGVmaW5lIE1BR0lDX1RIUkVTSE9MRCA0MAorI2RlZmluZSBSQVRJTyAwLjk1CisKK3N0YXRpYyBndWludDMyIHBhbGV0dGVzW0NPTE9SUyAqIFBBVFRFUk5dOworc3RhdGljIGNvbnN0IGdpbnQgc3dhcF90YWJbXSA9IHsgMiwgMSwgMCwgMyB9OworCisjZGVmaW5lIGdzdF9yYWRpb2FjdHZfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UmFkaW9hY1RWLCBnc3RfcmFkaW9hY3R2LCBHU1RfVFlQRV9WSURFT19GSUxURVIpOworCisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorI2RlZmluZSBDQVBTX1NUUiBHU1RfVklERU9fQ0FQU19NQUtFICgieyBSR0J4LCBCR1J4IH0iKQorI2Vsc2UKKyNkZWZpbmUgQ0FQU19TVFIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgeEJHUiwgeFJHQiB9IikKKyNlbmRpZgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3JhZGlvYWN0dl9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoQ0FQU19TVFIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9yYWRpb2FjdHZfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKENBUFNfU1RSKQorICAgICk7CisKK3N0YXRpYyB2b2lkCittYWtlUGFsZXR0ZSAodm9pZCkKK3sKKyAgZ2ludCBpOworCisjZGVmaW5lIERFTFRBICgyNTUvKENPTE9SUy8yLTEpKQorCisgIC8qIHJlZCwgZ3JlZSwgYmx1ZSAqLworICBmb3IgKGkgPSAwOyBpIDwgQ09MT1JTIC8gMjsgaSsrKSB7CisgICAgcGFsZXR0ZXNbaV0gPSBpICogREVMVEE7CisgICAgcGFsZXR0ZXNbQ09MT1JTICsgaV0gPSAoaSAqIERFTFRBKSA8PCA4OworICAgIHBhbGV0dGVzW0NPTE9SUyAqIDIgKyBpXSA9IChpICogREVMVEEpIDw8IDE2OworICB9CisgIGZvciAoaSA9IDA7IGkgPCBDT0xPUlMgLyAyOyBpKyspIHsKKyAgICBwYWxldHRlc1tpICsgQ09MT1JTIC8gMl0gPSAyNTUgfCAoaSAqIERFTFRBKSA8PCAxNiB8IChpICogREVMVEEpIDw8IDg7CisgICAgcGFsZXR0ZXNbQ09MT1JTICsgaSArIENPTE9SUyAvIDJdID0KKyAgICAgICAgKDI1NSA8PCA4KSB8IChpICogREVMVEEpIDw8IDE2IHwgaSAqIERFTFRBOworICAgIHBhbGV0dGVzW0NPTE9SUyAqIDIgKyBpICsgQ09MT1JTIC8gMl0gPQorICAgICAgICAoMjU1IDw8IDE2KSB8IChpICogREVMVEEpIDw8IDggfCBpICogREVMVEE7CisgIH0KKyAgLyogd2hpdGUgKi8KKyAgZm9yIChpID0gMDsgaSA8IENPTE9SUzsgaSsrKSB7CisgICAgcGFsZXR0ZXNbQ09MT1JTICogMyArIGldID0gKDI1NSAqIGkgLyBDT0xPUlMpICogMHgxMDEwMTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgQ09MT1JTICogUEFUVEVSTjsgaSsrKSB7CisgICAgcGFsZXR0ZXNbaV0gPSBwYWxldHRlc1tpXSAmIDB4ZmVmZWZmOworICB9CisjdW5kZWYgREVMVEEKK30KKworI2RlZmluZSBWSURFT19IV0lEVEggKGZpbHRlci0+YnVmX3dpZHRoLzIpCisjZGVmaW5lIFZJREVPX0hIRUlHSFQgKGZpbHRlci0+YnVmX2hlaWdodC8yKQorCisvKiB0aGlzIHRhYmxlIGFzc3VtZXMgdGhhdCB2aWRlb193aWR0aCBpcyB0aW1lcyBvZiAzMiAqLworc3RhdGljIHZvaWQKK3NldFRhYmxlIChHc3RSYWRpb2FjVFYgKiBmaWx0ZXIpCit7CisgIGd1aW50IGJpdHM7CisgIGdpbnQgeCwgeSwgdHgsIHR5LCB4eDsKKyAgZ2ludCBwdHIsIHByZXZwdHI7CisKKyAgcHJldnB0ciA9IChnaW50KSAoMC41ICsgUkFUSU8gKiAoLVZJREVPX0hXSURUSCkgKyBWSURFT19IV0lEVEgpOworICBmb3IgKHh4ID0gMDsgeHggPCAoZmlsdGVyLT5idWZfd2lkdGhfYmxvY2tzKTsgeHgrKykgeworICAgIGJpdHMgPSAwOworICAgIGZvciAoeCA9IDA7IHggPCAzMjsgeCsrKSB7CisgICAgICBwdHIgPSAoZ2ludCkgKDAuNSArIFJBVElPICogKHh4ICogMzIgKyB4IC0gVklERU9fSFdJRFRIKSArIFZJREVPX0hXSURUSCk7CisgICAgICBiaXRzID0gYml0cyA+PiAxOworICAgICAgaWYgKHB0ciAhPSBwcmV2cHRyKQorICAgICAgICBiaXRzIHw9IDB4ODAwMDAwMDA7CisgICAgICBwcmV2cHRyID0gcHRyOworICAgIH0KKyAgICBmaWx0ZXItPmJsdXJ6b29teFt4eF0gPSBiaXRzOworICB9CisKKyAgdHkgPSAoZ2ludCkgKDAuNSArIFJBVElPICogKC1WSURFT19ISEVJR0hUKSArIFZJREVPX0hIRUlHSFQpOworICB0eCA9IChnaW50KSAoMC41ICsgUkFUSU8gKiAoLVZJREVPX0hXSURUSCkgKyBWSURFT19IV0lEVEgpOworICB4eCA9IChnaW50KSAoMC41ICsgUkFUSU8gKiAoZmlsdGVyLT5idWZfd2lkdGggLSAxIC0gVklERU9fSFdJRFRIKSArCisgICAgICBWSURFT19IV0lEVEgpOworICBmaWx0ZXItPmJsdXJ6b29teVswXSA9IHR5ICogZmlsdGVyLT5idWZfd2lkdGggKyB0eDsKKyAgcHJldnB0ciA9IHR5ICogZmlsdGVyLT5idWZfd2lkdGggKyB4eDsKKyAgZm9yICh5ID0gMTsgeSA8IGZpbHRlci0+YnVmX2hlaWdodDsgeSsrKSB7CisgICAgdHkgPSAoZ2ludCkgKDAuNSArIFJBVElPICogKHkgLSBWSURFT19ISEVJR0hUKSArIFZJREVPX0hIRUlHSFQpOworICAgIGZpbHRlci0+Ymx1cnpvb215W3ldID0gdHkgKiBmaWx0ZXItPmJ1Zl93aWR0aCArIHR4IC0gcHJldnB0cjsKKyAgICBwcmV2cHRyID0gdHkgKiBmaWx0ZXItPmJ1Zl93aWR0aCArIHh4OworICB9Cit9CisKKyN1bmRlZiBWSURFT19IV0lEVEgKKyN1bmRlZiBWSURFT19ISEVJR0hUCisKK3N0YXRpYyB2b2lkCitibHVyIChHc3RSYWRpb2FjVFYgKiBmaWx0ZXIpCit7CisgIGdpbnQgeCwgeTsKKyAgZ2ludCB3aWR0aDsKKyAgZ3VpbnQ4ICpwLCAqcTsKKyAgZ3VpbnQ4IHY7CisgIEdzdFZpZGVvSW5mbyAqaW5mbzsKKworICBpbmZvID0gJkdTVF9WSURFT19GSUxURVIgKGZpbHRlciktPmluX2luZm87CisKKyAgd2lkdGggPSBmaWx0ZXItPmJ1Zl93aWR0aDsKKyAgcCA9IGZpbHRlci0+Ymx1cnpvb21idWYgKyBHU1RfVklERU9fSU5GT19XSURUSCAoaW5mbykgKyAxOworICBxID0gcCArIGZpbHRlci0+YnVmX2FyZWE7CisKKyAgZm9yICh5ID0gZmlsdGVyLT5idWZfaGVpZ2h0IC0gMjsgeSA+IDA7IHktLSkgeworICAgIGZvciAoeCA9IHdpZHRoIC0gMjsgeCA+IDA7IHgtLSkgeworICAgICAgdiA9ICgqKHAgLSB3aWR0aCkgKyAqKHAgLSAxKSArICoocCArIDEpICsgKihwICsgd2lkdGgpKSAvIDQgLSAxOworICAgICAgaWYgKHYgPT0gMjU1KQorICAgICAgICB2ID0gMDsKKyAgICAgICpxID0gdjsKKyAgICAgIHArKzsKKyAgICAgIHErKzsKKyAgICB9CisgICAgcCArPSAyOworICAgIHEgKz0gMjsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorem9vbSAoR3N0UmFkaW9hY1RWICogZmlsdGVyKQoreworICBnaW50IGIsIHgsIHk7CisgIGd1aW50OCAqcCwgKnE7CisgIGdpbnQgYmxvY2tzLCBoZWlnaHQ7CisgIGdpbnQgZHg7CisKKyAgcCA9IGZpbHRlci0+Ymx1cnpvb21idWYgKyBmaWx0ZXItPmJ1Zl9hcmVhOworICBxID0gZmlsdGVyLT5ibHVyem9vbWJ1ZjsKKyAgaGVpZ2h0ID0gZmlsdGVyLT5idWZfaGVpZ2h0OworICBibG9ja3MgPSBmaWx0ZXItPmJ1Zl93aWR0aF9ibG9ja3M7CisKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgcCArPSBmaWx0ZXItPmJsdXJ6b29teVt5XTsKKyAgICBmb3IgKGIgPSAwOyBiIDwgYmxvY2tzOyBiKyspIHsKKyAgICAgIGR4ID0gZmlsdGVyLT5ibHVyem9vbXhbYl07CisgICAgICBmb3IgKHggPSAwOyB4IDwgMzI7IHgrKykgeworICAgICAgICBwICs9IChkeCAmIDEpOworICAgICAgICAqcSsrID0gKnA7CisgICAgICAgIGR4ID0gZHggPj4gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2JsdXJ6b29tY29yZSAoR3N0UmFkaW9hY1RWICogZmlsdGVyKQoreworICBibHVyIChmaWx0ZXIpOworICB6b29tIChmaWx0ZXIpOworfQorCisvKiBCYWNrZ3JvdW5kIGltYWdlIGlzIHJlZnJlc2hlZCBldmVyeSBmcmFtZSAqLworc3RhdGljIHZvaWQKK2ltYWdlX2Jnc3VidHJhY3RfdXBkYXRlX3kgKGd1aW50MzIgKiBzcmMsIGdpbnQxNiAqIGJhY2tncm91bmQsIGd1aW50OCAqIGRpZmYsCisgICAgZ2ludCB2aWRlb19hcmVhLCBnaW50IHlfdGhyZXNob2xkKQoreworICBnaW50IGk7CisgIGdpbnQgUiwgRywgQjsKKyAgZ3VpbnQzMiAqcDsKKyAgZ2ludDE2ICpxOworICBndWludDggKnI7CisgIGdpbnQgdjsKKworICBwID0gc3JjOworICBxID0gYmFja2dyb3VuZDsKKyAgciA9IGRpZmY7CisgIGZvciAoaSA9IDA7IGkgPCB2aWRlb19hcmVhOyBpKyspIHsKKyAgICBSID0gKCgqcCkgJiAweGZmMDAwMCkgPj4gKDE2IC0gMSk7CisgICAgRyA9ICgoKnApICYgMHhmZjAwKSA+PiAoOCAtIDIpOworICAgIEIgPSAoKnApICYgMHhmZjsKKyAgICB2ID0gKFIgKyBHICsgQikgLSAoZ2ludCkgKCpxKTsKKyAgICAqcSA9IChnaW50MTYpIChSICsgRyArIEIpOworICAgICpyID0gKCh2ICsgeV90aHJlc2hvbGQpID4+IDI0KSB8ICgoeV90aHJlc2hvbGQgLSB2KSA+PiAyNCk7CisKKyAgICBwKys7CisgICAgcSsrOworICAgIHIrKzsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3JhZGlvYWN0dl90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwKKyAgICBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUpCit7CisgIEdzdFJhZGlvYWNUViAqZmlsdGVyID0gR1NUX1JBRElPQUNUViAodmZpbHRlcik7CisgIGd1aW50MzIgKnNyYywgKmRlc3Q7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIHN0cmVhbV90aW1lOworICBnaW50IHgsIHksIHdpZHRoLCBoZWlnaHQ7CisgIGd1aW50MzIgYSwgYjsKKyAgZ3VpbnQ4ICpkaWZmLCAqcDsKKyAgZ3VpbnQzMiAqcGFsZXR0ZTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5fZnJhbWUtPmJ1ZmZlcik7CisgIHN0cmVhbV90aW1lID0KKyAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpLT5zZWdtZW50LAorICAgICAgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgInN5bmMgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW1fdGltZSkpCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoZmlsdGVyKSwgc3RyZWFtX3RpbWUpOworCisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworI2lmIEdfQllURV9PUkRFUiA9PSBHX0xJVFRMRV9FTkRJQU4KKyAgaWYgKEdTVF9WSURFT19GUkFNRV9GT1JNQVQgKGluX2ZyYW1lKSA9PSBHU1RfVklERU9fRk9STUFUX1JHQngpIHsKKyAgICBwYWxldHRlID0gJnBhbGV0dGVzW0NPTE9SUyAqIGZpbHRlci0+Y29sb3JdOworICB9IGVsc2UgeworICAgIHBhbGV0dGUgPSAmcGFsZXR0ZXNbQ09MT1JTICogc3dhcF90YWJbZmlsdGVyLT5jb2xvcl1dOworICB9CisjZWxzZQorICBpZiAoR1NUX1ZJREVPX0ZSQU1FX0ZPUk1BVCAoaW5fZnJhbWUpID09IEdTVF9WSURFT19GT1JNQVRfeEJHUikgeworICAgIHBhbGV0dGUgPSAmcGFsZXR0ZXNbQ09MT1JTICogZmlsdGVyLT5jb2xvcl07CisgIH0gZWxzZSB7CisgICAgcGFsZXR0ZSA9ICZwYWxldHRlc1tDT0xPUlMgKiBzd2FwX3RhYltmaWx0ZXItPmNvbG9yXV07CisgIH0KKyNlbmRpZgorICBkaWZmID0gZmlsdGVyLT5kaWZmOworCisgIGlmIChmaWx0ZXItPm1vZGUgPT0gMyAmJiBmaWx0ZXItPnRyaWdnZXIpCisgICAgZmlsdGVyLT5zbmFwdGltZSA9IDA7CisgIGVsc2UgaWYgKGZpbHRlci0+bW9kZSA9PSAzICYmICFmaWx0ZXItPnRyaWdnZXIpCisgICAgZmlsdGVyLT5zbmFwdGltZSA9IDE7CisKKyAgaWYgKGZpbHRlci0+bW9kZSAhPSAyIHx8IGZpbHRlci0+c25hcHRpbWUgPD0gMCkgeworICAgIGltYWdlX2Jnc3VidHJhY3RfdXBkYXRlX3kgKHNyYywgZmlsdGVyLT5iYWNrZ3JvdW5kLCBkaWZmLAorICAgICAgICB3aWR0aCAqIGhlaWdodCwgTUFHSUNfVEhSRVNIT0xEICogNyk7CisgICAgaWYgKGZpbHRlci0+bW9kZSA9PSAwIHx8IGZpbHRlci0+c25hcHRpbWUgPD0gMCkgeworICAgICAgZGlmZiArPSBmaWx0ZXItPmJ1Zl9tYXJnaW5fbGVmdDsKKyAgICAgIHAgPSBmaWx0ZXItPmJsdXJ6b29tYnVmOworICAgICAgZm9yICh5ID0gMDsgeSA8IGZpbHRlci0+YnVmX2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBmaWx0ZXItPmJ1Zl93aWR0aDsgeCsrKSB7CisgICAgICAgICAgcFt4XSB8PSBkaWZmW3hdID4+IDM7CisgICAgICAgIH0KKyAgICAgICAgZGlmZiArPSB3aWR0aDsKKyAgICAgICAgcCArPSBmaWx0ZXItPmJ1Zl93aWR0aDsKKyAgICAgIH0KKyAgICAgIGlmIChmaWx0ZXItPm1vZGUgPT0gMSB8fCBmaWx0ZXItPm1vZGUgPT0gMikgeworICAgICAgICBtZW1jcHkgKGZpbHRlci0+c25hcGZyYW1lLCBzcmMsIHdpZHRoICogaGVpZ2h0ICogNCk7CisgICAgICB9CisgICAgfQorICB9CisgIGJsdXJ6b29tY29yZSAoZmlsdGVyKTsKKworICBpZiAoZmlsdGVyLT5tb2RlID09IDEgfHwgZmlsdGVyLT5tb2RlID09IDIpIHsKKyAgICBzcmMgPSBmaWx0ZXItPnNuYXBmcmFtZTsKKyAgfQorICBwID0gZmlsdGVyLT5ibHVyem9vbWJ1ZjsKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgZm9yICh4ID0gMDsgeCA8IGZpbHRlci0+YnVmX21hcmdpbl9sZWZ0OyB4KyspIHsKKyAgICAgICpkZXN0KysgPSAqc3JjKys7CisgICAgfQorICAgIGZvciAoeCA9IDA7IHggPCBmaWx0ZXItPmJ1Zl93aWR0aDsgeCsrKSB7CisgICAgICBhID0gKnNyYysrICYgMHhmZWZlZmY7CisgICAgICBiID0gcGFsZXR0ZVsqcCsrXTsKKyAgICAgIGEgKz0gYjsKKyAgICAgIGIgPSBhICYgMHgxMDEwMTAwOworICAgICAgKmRlc3QrKyA9IGEgfCAoYiAtIChiID4+IDgpKTsKKyAgICB9CisgICAgZm9yICh4ID0gMDsgeCA8IGZpbHRlci0+YnVmX21hcmdpbl9yaWdodDsgeCsrKSB7CisgICAgICAqZGVzdCsrID0gKnNyYysrOworICAgIH0KKyAgfQorCisgIGlmIChmaWx0ZXItPm1vZGUgPT0gMSB8fCBmaWx0ZXItPm1vZGUgPT0gMikgeworICAgIGZpbHRlci0+c25hcHRpbWUtLTsKKyAgICBpZiAoZmlsdGVyLT5zbmFwdGltZSA8IDApIHsKKyAgICAgIGZpbHRlci0+c25hcHRpbWUgPSBmaWx0ZXItPmludGVydmFsOworICAgIH0KKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3JhZGlvYWN0dl9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0UmFkaW9hY1RWICpmaWx0ZXIgPSBHU1RfUkFESU9BQ1RWICh2ZmlsdGVyKTsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKGluX2luZm8pOworICBoZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluX2luZm8pOworCisgIGZpbHRlci0+YnVmX3dpZHRoX2Jsb2NrcyA9IHdpZHRoIC8gMzI7CisgIGlmIChmaWx0ZXItPmJ1Zl93aWR0aF9ibG9ja3MgPiAyNTUpCisgICAgZ290byB0b29fd2lkZTsKKworICBmaWx0ZXItPmJ1Zl93aWR0aCA9IGZpbHRlci0+YnVmX3dpZHRoX2Jsb2NrcyAqIDMyOworICBmaWx0ZXItPmJ1Zl9oZWlnaHQgPSBoZWlnaHQ7CisgIGZpbHRlci0+YnVmX2FyZWEgPSBmaWx0ZXItPmJ1Zl9oZWlnaHQgKiBmaWx0ZXItPmJ1Zl93aWR0aDsKKyAgZmlsdGVyLT5idWZfbWFyZ2luX2xlZnQgPSAod2lkdGggLSBmaWx0ZXItPmJ1Zl93aWR0aCkgLyAyOworICBmaWx0ZXItPmJ1Zl9tYXJnaW5fcmlnaHQgPQorICAgICAgaGVpZ2h0IC0gZmlsdGVyLT5idWZfd2lkdGggLSBmaWx0ZXItPmJ1Zl9tYXJnaW5fbGVmdDsKKworICBnX2ZyZWUgKGZpbHRlci0+Ymx1cnpvb21idWYpOworICBmaWx0ZXItPmJsdXJ6b29tYnVmID0gZ19uZXcwIChndWludDgsIGZpbHRlci0+YnVmX2FyZWEgKiAyKTsKKworICBnX2ZyZWUgKGZpbHRlci0+Ymx1cnpvb214KTsKKyAgZmlsdGVyLT5ibHVyem9vbXggPSBnX25ldzAgKGdpbnQsIGZpbHRlci0+YnVmX3dpZHRoKTsKKworICBnX2ZyZWUgKGZpbHRlci0+Ymx1cnpvb215KTsKKyAgZmlsdGVyLT5ibHVyem9vbXkgPSBnX25ldzAgKGdpbnQsIGZpbHRlci0+YnVmX2hlaWdodCk7CisKKyAgZ19mcmVlIChmaWx0ZXItPnNuYXBmcmFtZSk7CisgIGZpbHRlci0+c25hcGZyYW1lID0gZ19uZXcgKGd1aW50MzIsIHdpZHRoICogaGVpZ2h0KTsKKworICBnX2ZyZWUgKGZpbHRlci0+ZGlmZik7CisgIGZpbHRlci0+ZGlmZiA9IGdfbmV3IChndWludDgsIHdpZHRoICogaGVpZ2h0KTsKKworICBnX2ZyZWUgKGZpbHRlci0+YmFja2dyb3VuZCk7CisgIGZpbHRlci0+YmFja2dyb3VuZCA9IGdfbmV3MCAoZ2ludDE2LCB3aWR0aCAqIGhlaWdodCk7CisKKyAgc2V0VGFibGUgKGZpbHRlcik7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCit0b29fd2lkZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgImZyYW1lIHRvbyB3aWRlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3JhZGlvYWN0dl9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICBHc3RSYWRpb2FjVFYgKmZpbHRlciA9IEdTVF9SQURJT0FDVFYgKHRyYW5zKTsKKworICBmaWx0ZXItPnNuYXB0aW1lID0gMDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9yYWRpb2FjdHZfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJhZGlvYWNUViAqZmlsdGVyID0gR1NUX1JBRElPQUNUViAob2JqZWN0KTsKKworICBnX2ZyZWUgKGZpbHRlci0+c25hcGZyYW1lKTsKKyAgZmlsdGVyLT5zbmFwZnJhbWUgPSBOVUxMOworCisgIGdfZnJlZSAoZmlsdGVyLT5ibHVyem9vbWJ1Zik7CisgIGZpbHRlci0+Ymx1cnpvb21idWYgPSBOVUxMOworCisgIGdfZnJlZSAoZmlsdGVyLT5kaWZmKTsKKyAgZmlsdGVyLT5kaWZmID0gTlVMTDsKKworICBnX2ZyZWUgKGZpbHRlci0+YmFja2dyb3VuZCk7CisgIGZpbHRlci0+YmFja2dyb3VuZCA9IE5VTEw7CisKKyAgZ19mcmVlIChmaWx0ZXItPmJsdXJ6b29teCk7CisgIGZpbHRlci0+Ymx1cnpvb214ID0gTlVMTDsKKworICBnX2ZyZWUgKGZpbHRlci0+Ymx1cnpvb215KTsKKyAgZmlsdGVyLT5ibHVyem9vbXkgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9yYWRpb2FjdHZfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJhZGlvYWNUViAqZmlsdGVyID0gR1NUX1JBRElPQUNUViAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZmlsdGVyLT5tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgaWYgKGZpbHRlci0+bW9kZSA9PSAzKQorICAgICAgICBmaWx0ZXItPnNuYXB0aW1lID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT0xPUjoKKyAgICAgIGZpbHRlci0+Y29sb3IgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSU5URVJWQUw6CisgICAgICBmaWx0ZXItPmludGVydmFsID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RSSUdHRVI6CisgICAgICBmaWx0ZXItPnRyaWdnZXIgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JhZGlvYWN0dl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UmFkaW9hY1RWICpmaWx0ZXIgPSBHU1RfUkFESU9BQ1RWIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGZpbHRlci0+bW9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ09MT1I6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgZmlsdGVyLT5jb2xvcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSU5URVJWQUw6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgZmlsdGVyLT5pbnRlcnZhbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVFJJR0dFUjoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBmaWx0ZXItPnRyaWdnZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3JhZGlvYWN0dl9jbGFzc19pbml0IChHc3RSYWRpb2FjVFZDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9yYWRpb2FjdHZfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcmFkaW9hY3R2X2dldF9wcm9wZXJ0eTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9yYWRpb2FjdHZfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJtb2RlIiwgIk1vZGUiLAorICAgICAgICAgICJNb2RlIiwgR1NUX1RZUEVfUkFESU9BQ1RWX01PREUsIERFRkFVTFRfTU9ERSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NPTE9SLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJjb2xvciIsICJDb2xvciIsCisgICAgICAgICAgIkNvbG9yIiwgR1NUX1RZUEVfUkFESU9BQ1RWX0NPTE9SLCBERUZBVUxUX0NPTE9SLAorICAgICAgICAgIEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lOVEVSVkFMLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJpbnRlcnZhbCIsICJJbnRlcnZhbCIsCisgICAgICAgICAgIlNuYXBzaG90IGludGVydmFsIChpbiBzdHJvYmUgbW9kZSkiLCAwLCBHX01BWElOVCwgREVGQVVMVF9JTlRFUlZBTCwKKyAgICAgICAgICBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UUklHR0VSLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJ0cmlnZ2VyIiwgIlRyaWdnZXIiLAorICAgICAgICAgICJUcmlnZ2VyIChpbiB0cmlnZ2VyIG1vZGUpIiwgREVGQVVMVF9UUklHR0VSLAorICAgICAgICAgIEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUmFkaW9hY1RWIGVmZmVjdCIsCisgICAgICAiRmlsdGVyL0VmZmVjdC9WaWRlbyIsCisgICAgICAibW90aW9uLWVubGlnaHRtZW50IGVmZmVjdCIsCisgICAgICAiRlVLVUNISSwgS2VudGFyb3UgPGZ1a3VjaGlAdXNlcnMuc291cmNlZm9yZ2UubmV0PiwgIgorICAgICAgIlNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9yYWRpb2FjdHZfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9yYWRpb2FjdHZfc3JjX3RlbXBsYXRlKTsKKworICB0cmFuc19jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3JhZGlvYWN0dl9zdGFydCk7CisKKyAgdmZpbHRlcl9jbGFzcy0+c2V0X2luZm8gPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3JhZGlvYWN0dl9zZXRfaW5mbyk7CisgIHZmaWx0ZXJfY2xhc3MtPnRyYW5zZm9ybV9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3JhZGlvYWN0dl90cmFuc2Zvcm1fZnJhbWUpOworCisgIG1ha2VQYWxldHRlICgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JhZGlvYWN0dl9pbml0IChHc3RSYWRpb2FjVFYgKiBmaWx0ZXIpCit7CisgIGZpbHRlci0+bW9kZSA9IERFRkFVTFRfTU9ERTsKKyAgZmlsdGVyLT5jb2xvciA9IERFRkFVTFRfQ09MT1I7CisgIGZpbHRlci0+aW50ZXJ2YWwgPSBERUZBVUxUX0lOVEVSVkFMOworICBmaWx0ZXItPnRyaWdnZXIgPSBERUZBVUxUX1RSSUdHRVI7Cit9CmRpZmYgLS1naXQgYS9nc3QvZWZmZWN0di9nc3RyYWRpb2FjLmggYi9nc3QvZWZmZWN0di9nc3RyYWRpb2FjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkN2M5OQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L2dzdHJhZGlvYWMuaApAQCAtMCwwICsxLDg3IEBACisvKiBHU3RyZWFtZXIKKyAqIENyYWRpb2FjeXJpZ2h0IChDKSA8MjAwOT4gU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogRWZmZWNUViAtIFJlYWx0aW1lIERpZ2l0YWwgVmlkZW8gRWZmZWN0b3IKKyAqIENyYWRpb2FjeXJpZ2h0IChDKSAyMDAxLTIwMDYgRlVLVUNISSBLZW50YXJvCisgKgorICogUmFkaW9hY1RWIC0gbW90aW9uLWVubGlnaHRtZW50IGVmZmVjdC4KKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZVS1VDSEkgS2VudGFybworICoKKyAqIEVmZmVjVFYgaXMgZnJlZSBzb2Z0d2FyZS4gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgcmFkaW9hY3Rpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaHJhZGlvYWNlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNyYWRpb2FjeSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUkFESU9BQ19IX18KKyNkZWZpbmUgX19HU1RfUkFESU9BQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2ZpbHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUkFESU9BQ1RWIFwKKyAgKGdzdF9yYWRpb2FjdHZfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JBRElPQUNUVihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JBRElPQUNUVixHc3RSYWRpb2FjVFYpKQorI2RlZmluZSBHU1RfUkFESU9BQ1RWX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JBRElPQUNUVixHc3RSYWRpb2FjVFZDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SQURJT0FDVFYob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SQURJT0FDVFYpKQorI2RlZmluZSBHU1RfSVNfUkFESU9BQ1RWX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JBRElPQUNUVikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSYWRpb2FjVFYgR3N0UmFkaW9hY1RWOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJhZGlvYWNUVkNsYXNzIEdzdFJhZGlvYWNUVkNsYXNzOworCitzdHJ1Y3QgX0dzdFJhZGlvYWNUVgoreworICBHc3RWaWRlb0ZpbHRlciBlbGVtZW50OworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIGdpbnQgbW9kZTsKKyAgZ2ludCBjb2xvcjsKKyAgZ3VpbnQgaW50ZXJ2YWw7CisgIGdib29sZWFuIHRyaWdnZXI7CisKKyAgZ2ludCBzbmFwdGltZTsKKworICBndWludDMyICpzbmFwZnJhbWU7CisgIGd1aW50OCAqYmx1cnpvb21idWY7CisgIGd1aW50OCAqZGlmZjsKKyAgZ2ludDE2ICpiYWNrZ3JvdW5kOworICBnaW50ICpibHVyem9vbXg7CisgIGdpbnQgKmJsdXJ6b29teTsKKworICBnaW50IGJ1Zl93aWR0aF9ibG9ja3M7CisgIGdpbnQgYnVmX3dpZHRoOworICBnaW50IGJ1Zl9oZWlnaHQ7CisgIGdpbnQgYnVmX2FyZWE7CisgIGdpbnQgYnVmX21hcmdpbl9yaWdodDsKKyAgZ2ludCBidWZfbWFyZ2luX2xlZnQ7Cit9OworCitzdHJ1Y3QgX0dzdFJhZGlvYWNUVkNsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3JhZGlvYWN0dl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SQURJT0FDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0cmV2LmMgYi9nc3QvZWZmZWN0di9nc3RyZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjk1OTUwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvZ3N0cmV2LmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBFZmZlY1RWOgorICogQ29weXJpZ2h0IChDKSAyMDAxIEZVS1VDSEkgS2VudGFyb3UKKyAqCisgKiBFZmZlY1RWIC0gUmVhbHRpbWUgRGlnaXRhbCBWaWRlbyBFZmZlY3RvcgorICogQ29weXJpZ2h0IChDKSAyMDAxIEZVS1VDSEkgS2VudGFyb3UKKyAqCisgKiByZXZUViBiYXNlZCBvbiBSdXR0LUV0cmEgVmlkZW8gU3ludGhlc2l6ZXIgMTk3ND8KKworICogKGMpMjAwMiBFZCBUYW5uZW5iYXVtCisgKgorICogVGhpcyBlZmZlY3QgYWN0cyBsaWtlIGEgd2F2ZWZvcm0gbW9uaXRvciBvbiBlYWNoIGxpbmUuCisgKiBJdCB3YXMgb3JpZ2luYWxseSBkb25lIGJ5IGRlZmxlY3RpbmcgdGhlIGVsZWN0cm9uIGJlYW0gb24gYSBtb25pdG9yIHVzaW5nCisgKiBhZGRpdGlvbmFsIGVsZWN0cm9tYWduZXRzIG9uIHRoZSB5b2tlIG9mIGEgYi93IENSVC4gCisgKiBIZXJlIGl0IGlzIGVtdWxhdGVkIGRpZ2l0YWxseS4KKworICogRXhwZXJpbWFlbnRhbCB0YXBlcyB3ZXJlIG1hZGUgd2l0aCB0aGlzIHN5c3RlbSBieSBCaWxsIGFuZCAKKyAqIExvdWlzZSBFdHJhIGFuZCBXb29keSBhbmQgU3RlaW5hIFZhc3Vsa2EKKworICogVGhlIGxpbmUgc3BhY2luZyBjYW4gYmUgY29udHJvbGxlZCB1c2luZyB0aGUgMSBhbmQgMiBLZXlzLgorICogVGhlIGdhaW4gaXMgY29udHJvbGxlZCB1c2luZyB0aGUgMyBhbmQgNCBrZXlzLgorICogVGhlIHVwZGF0ZSByYXRlIGlzIGNvbnRyb2xsZWQgdXNpbmcgdGhlIDAgYW5kIC0ga2V5cy4KKyAKKyAqIEVmZmVjVFYgaXMgZnJlZSBzb2Z0d2FyZS4gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJldnR2CisgKgorICogUmV2VFYgYWN0cyBsaWtlIGEgdmlkZW8gd2F2ZWZvcm0gbW9uaXRvciBmb3IgZWFjaCBsaW5lIG9mIHZpZGVvCisgKiBwcm9jZXNzZWQuIFRoaXMgY3JlYXRlcyBhIHBzZXVkbyAzRCBlZmZlY3QgYmFzZWQgb24gdGhlIGJyaWdodG5lc3MKKyAqIG9mIHRoZSB2aWRlbyBhbG9uZyBlYWNoIGxpbmUuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIHJldnR2ICEgdmlkZW9jb252ZXJ0ICEgYXV0b3ZpZGVvc2luaworICogXXwgVGhpcyBwaXBlbGluZSBzaG93cyB0aGUgZWZmZWN0IG9mIHJldnR2IG9uIGEgdGVzdCBzdHJlYW0uCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHJldi5oIgorCisjZGVmaW5lIFRIRV9DT0xPUiAweGZmZmZmZmZmCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0RFTEFZLAorICBQUk9QX0xJTkVTUEFDRSwKKyAgUFJPUF9HQUlOCit9OworCisjZGVmaW5lIGdzdF9yZXZ0dl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSZXZUViwgZ3N0X3JldnR2LCBHU1RfVFlQRV9WSURFT19GSUxURVIpOworCisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorI2RlZmluZSBDQVBTX1NUUiBHU1RfVklERU9fQ0FQU19NQUtFICgieyBCR1J4LCBSR0J4IH0iKQorI2Vsc2UKKyNkZWZpbmUgQ0FQU19TVFIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgeEJHUiwgeFJHQiB9IikKKyNlbmRpZgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3JldnR2X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChDQVBTX1NUUikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3JldnR2X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChDQVBTX1NUUikKKyAgICApOworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3JldnR2X3RyYW5zZm9ybV9mcmFtZSAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsCisgICAgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSkKK3sKKyAgR3N0UmV2VFYgKmZpbHRlciA9IEdTVF9SRVZUViAodmZpbHRlcik7CisgIGd1aW50MzIgKnNyYywgKmRlc3Q7CisgIGdpbnQgd2lkdGgsIGhlaWdodCwgc3N0cmlkZSwgZHN0cmlkZTsKKyAgZ3VpbnQzMiAqbnNyYzsKKyAgZ2ludCB5LCB4LCBSLCBHLCBCLCB5dmFsOworICBnaW50IGxpbmVzcGFjZSwgdnNjYWxlOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBzdHJlYW1fdGltZTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5fZnJhbWUtPmJ1ZmZlcik7CisgIHN0cmVhbV90aW1lID0KKyAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmR1NUX0JBU0VfVFJBTlNGT1JNICh2ZmlsdGVyKS0+c2VnbWVudCwKKyAgICAgIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJzeW5jIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKGZpbHRlciksIHN0cmVhbV90aW1lKTsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBzc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisgIGRzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRfZnJhbWUsIDApOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKTsKKworICAvKiBDbGVhciBldmVyeXRoaW5nIHRvIGJsYWNrICovCisgIG1lbXNldCAoZGVzdCwgMCwgZHN0cmlkZSAqIGhlaWdodCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworICBsaW5lc3BhY2UgPSBmaWx0ZXItPmxpbmVzcGFjZTsKKyAgdnNjYWxlID0gZmlsdGVyLT52c2NhbGU7CisKKyAgLyogZHJhdyB0aGUgb2Zmc2V0IGxpbmVzICovCisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gbGluZXNwYWNlKSB7CisgICAgZm9yICh4ID0gMDsgeCA8PSB3aWR0aDsgeCsrKSB7CisgICAgICBuc3JjID0gc3JjICsgKHkgKiBzc3RyaWRlIC8gNCkgKyB4OworCisgICAgICAvKiBDYWxjIFkgVmFsdWUgZm9yIGN1cnBpeCAqLworICAgICAgUiA9ICgoKm5zcmMpICYgMHhmZjAwMDApID4+ICgxNiAtIDEpOworICAgICAgRyA9ICgoKm5zcmMpICYgMHhmZjAwKSA+PiAoOCAtIDIpOworICAgICAgQiA9ICgqbnNyYykgJiAweGZmOworCisgICAgICB5dmFsID0geSAtICgoc2hvcnQpIChSICsgRyArIEIpIC8gdnNjYWxlKTsKKworICAgICAgaWYgKHl2YWwgPiAwKSB7CisgICAgICAgIGRlc3RbeCArICh5dmFsICogZHN0cmlkZSAvIDQpXSA9IFRIRV9DT0xPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGZpbHRlcik7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JldnR2X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSZXZUViAqZmlsdGVyID0gR1NUX1JFVlRWIChvYmplY3QpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFTEFZOgorICAgICAgZmlsdGVyLT52Z3JhYnRpbWUgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9MSU5FU1BBQ0U6CisgICAgICBmaWx0ZXItPmxpbmVzcGFjZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0dBSU46CisgICAgICBmaWx0ZXItPnZzY2FsZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9yZXZ0dl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UmV2VFYgKmZpbHRlciA9IEdTVF9SRVZUViAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfREVMQVk6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBmaWx0ZXItPnZncmFidGltZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTElORVNQQUNFOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZmlsdGVyLT5saW5lc3BhY2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0dBSU46CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBmaWx0ZXItPnZzY2FsZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcmV2dHZfY2xhc3NfaW5pdCAoR3N0UmV2VFZDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RWaWRlb0ZpbHRlckNsYXNzICp2ZmlsdGVyX2NsYXNzID0gKEdzdFZpZGVvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3JldnR2X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3JldnR2X2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0RFTEFZLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImRlbGF5IiwgIkRlbGF5IiwgIkRlbGF5IGluIGZyYW1lcyBiZXR3ZWVuIHVwZGF0ZXMiLAorICAgICAgICAgIDEsIDEwMCwgMSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfTElORVNQQUNFLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImxpbmVzcGFjZSIsICJMaW5lc3BhY2UiLCAiQ29udHJvbCBsaW5lIHNwYWNpbmciLCAxLAorICAgICAgICAgIDEwMCwgNiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfR0FJTiwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJnYWluIiwgIkdhaW4iLCAiQ29udHJvbCBnYWluIiwgMSwgMjAwLCA1MCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlJldlRWIGVmZmVjdCIsCisgICAgICAiRmlsdGVyL0VmZmVjdC9WaWRlbyIsCisgICAgICAiQSB2aWRlbyB3YXZlZm9ybSBtb25pdG9yIGZvciBlYWNoIGxpbmUgb2YgdmlkZW8gcHJvY2Vzc2VkIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuYmU+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3JldnR2X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcmV2dHZfc3JjX3RlbXBsYXRlKTsKKworICB2ZmlsdGVyX2NsYXNzLT50cmFuc2Zvcm1fZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9yZXZ0dl90cmFuc2Zvcm1fZnJhbWUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JldnR2X2luaXQgKEdzdFJldlRWICogcmVzdHYpCit7CisgIHJlc3R2LT52Z3JhYnRpbWUgPSAxOworICByZXN0di0+dmdyYWIgPSAwOworICByZXN0di0+bGluZXNwYWNlID0gNjsKKyAgcmVzdHYtPnZzY2FsZSA9IDUwOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0cmV2LmggYi9nc3QvZWZmZWN0di9nc3RyZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTgzMTFiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvZ3N0cmV2LmgKQEAgLTAsMCArMSw4NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIEVmZmVjVFY6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgRlVLVUNISSBLZW50YXJvdQorICoKKyAqIEVmZmVjVFYgLSBSZWFsdGltZSBEaWdpdGFsIFZpZGVvIEVmZmVjdG9yCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgRlVLVUNISSBLZW50YXJvdQorICoKKyAqIHJldlRWIGJhc2VkIG9uIFJ1dHQtRXRyYSBWaWRlbyBTeW50aGVzaXplciAxOTc0PworCisgKiAoYykyMDAyIEVkIFRhbm5lbmJhdW0KKyAqCisgKiBUaGlzIGVmZmVjdCBhY3RzIGxpa2UgYSB3YXZlZm9ybSBtb25pdG9yIG9uIGVhY2ggbGluZS4KKyAqIEl0IHdhcyBvcmlnaW5hbGx5IGRvbmUgYnkgZGVmbGVjdGluZyB0aGUgZWxlY3Ryb24gYmVhbSBvbiBhIG1vbml0b3IgdXNpbmcKKyAqIGFkZGl0aW9uYWwgZWxlY3Ryb21hZ25ldHMgb24gdGhlIHlva2Ugb2YgYSBiL3cgQ1JULiAKKyAqIEhlcmUgaXQgaXMgZW11bGF0ZWQgZGlnaXRhbGx5LgorCisgKiBFeHBlcmltYWVudGFsIHRhcGVzIHdlcmUgbWFkZSB3aXRoIHRoaXMgc3lzdGVtIGJ5IEJpbGwgYW5kIAorICogTG91aXNlIEV0cmEgYW5kIFdvb2R5IGFuZCBTdGVpbmEgVmFzdWxrYQorCisgKiBUaGUgbGluZSBzcGFjaW5nIGNhbiBiZSBjb250cm9sbGVkIHVzaW5nIHRoZSAxIGFuZCAyIEtleXMuCisgKiBUaGUgZ2FpbiBpcyBjb250cm9sbGVkIHVzaW5nIHRoZSAzIGFuZCA0IGtleXMuCisgKiBUaGUgdXBkYXRlIHJhdGUgaXMgY29udHJvbGxlZCB1c2luZyB0aGUgMCBhbmQgLSBrZXlzLgorIAorICogRWZmZWNUViBpcyBmcmVlIHNvZnR3YXJlLiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SRVZfSF9fCisjZGVmaW5lIF9fR1NUX1JFVl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2ZpbHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUkVWVFYgXAorICAoZ3N0X3JldnR2X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SRVZUVihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JFVlRWLEdzdFJldlRWKSkKKyNkZWZpbmUgR1NUX1JFVlRWX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JFVlRWLEdzdFJldlRWQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUkVWVFYob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SRVZUVikpCisjZGVmaW5lIEdTVF9JU19SRVZUVl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SRVZUVikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSZXZUViBHc3RSZXZUVjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSZXZUVkNsYXNzIEdzdFJldlRWQ2xhc3M7CisKK3N0cnVjdCBfR3N0UmV2VFYKK3sKKyAgR3N0VmlkZW9GaWx0ZXIgdmlkZW9maWx0ZXI7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgZ2ludCB2Z3JhYnRpbWU7CisgIGdpbnQgdmdyYWI7CisgIGdpbnQgbGluZXNwYWNlOworICBnaW50IHZzY2FsZTsKK307CisKK3N0cnVjdCBfR3N0UmV2VFZDbGFzcworeworICBHc3RWaWRlb0ZpbHRlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9yZXZ0dl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SRVZfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZWZmZWN0di9nc3RyaXBwbGUuYyBiL2dzdC9lZmZlY3R2L2dzdHJpcHBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YWM2ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZWZmZWN0di9nc3RyaXBwbGUuYwpAQCAtMCwwICsxLDYxMSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBFZmZlY1RWIC0gUmVhbHRpbWUgRGlnaXRhbCBWaWRlbyBFZmZlY3RvcgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgRlVLVUNISSBLZW50YXJvCisgKgorICogUmlwcGxlVFYgLSBXYXRlciByaXBwbGUgZWZmZWN0LgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgRlVLVUNISSBLZW50YXJvCisgKgorICogVGhpcyBjb21iaW5lcyB0aGUgUmlwcGxlVFYgYW5kIEJhbHRhblRWIGVmZmVjdHMsIHdoaWNoIGFyZQorICogdmVyeSBzaW1pbGFyLiBCYWx0YW5UViBpcyB1c2VkIGlmIHRoZSBmZWVkYmFjayBwcm9wZXJ0eSBpcyBzZXQKKyAqIHRvIFRSVUUsIG90aGVyd2lzZSBSaXBwbGVUViBpcyB1c2VkLgorICoKKyAqIEVmZmVjVFYgaXMgZnJlZSBzb2Z0d2FyZS4gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJpcHBsZXR2CisgKgorICogUmlwcGxlVFYgZG9lcyByaXBwbGUgbWFyayBlZmZlY3Qgb24gdGhlIHZpZGVvIGlucHV0LiBUaGUgcmlwcGxlIGlzIGNhdXNlZAorICogYnkgbW90aW9uIG9yIHJhbmRvbSByYWluIGRyb3BzLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiB2aWRlb3Rlc3RzcmMgISByaXBwbGV0diAhIHZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgc2hvd3MgdGhlIGVmZmVjdCBvZiByaXBwbGV0diBvbiBhIHRlc3Qgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RyaXBwbGUuaCIKKyNpbmNsdWRlICJnc3RlZmZlY3R2LmgiCisKKyNkZWZpbmUgREVGQVVMVF9NT0RFIDAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUkVTRVQsCisgIFBST1BfTU9ERQorfTsKKworc3RhdGljIGdpbnQgc3FydGFibGVbMjU2XTsKKworI2RlZmluZSBHU1RfVFlQRV9SSVBQTEVUVl9NT0RFIChnc3RfcmlwcGxldHZfbW9kZV9nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3RfcmlwcGxldHZfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHR5cGUgPSAwOworCisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGVudW12YWx1ZVtdID0geworICAgIHswLCAiTW90aW9uIERldGVjdGlvbiIsICJtb3Rpb24tZGV0ZWN0aW9uIn0sCisgICAgezEsICJSYWluIiwgInJhaW4ifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0sCisgIH07CisKKyAgaWYgKCF0eXBlKSB7CisgICAgdHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RSaXBwbGVUVk1vZGUiLCBlbnVtdmFsdWUpOworICB9CisgIHJldHVybiB0eXBlOworfQorCisjZGVmaW5lIGdzdF9yaXBwbGV0dl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSaXBwbGVUViwgZ3N0X3JpcHBsZXR2LCBHU1RfVFlQRV9WSURFT19GSUxURVIpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3JpcHBsZXR2X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBCR1J4LCBSR0J4LCB4QkdSLCB4UkdCIH0iKSkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3JpcHBsZXR2X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBCR1J4LCBSR0J4LCB4QkdSLCB4UkdCIH0iKSkKKyAgICApOworCitzdGF0aWMgY29uc3QgZ2ludCBwb2ludCA9IDE2Oworc3RhdGljIGNvbnN0IGdpbnQgaW1wYWN0ID0gMjsKK3N0YXRpYyBjb25zdCBnaW50IGRlY2F5ID0gODsKK3N0YXRpYyBjb25zdCBnaW50IGxvb3BudW0gPSAyOworCitzdGF0aWMgdm9pZAorc2V0VGFibGUgKHZvaWQpCit7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKyAgICBzcXJ0YWJsZVtpXSA9IGkgKiBpOworICB9CisgIGZvciAoaSA9IDE7IGkgPD0gMTI4OyBpKyspIHsKKyAgICBzcXJ0YWJsZVsyNTYgLSBpXSA9IC1pICogaTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAoraW1hZ2VfYmdzZXRfeSAoZ3VpbnQzMiAqIHNyYywgZ2ludDE2ICogYmFja2dyb3VuZCwgZ2ludCB2aWRlb19hcmVhKQoreworICBnaW50IGk7CisgIGdpbnQgUiwgRywgQjsKKyAgZ3VpbnQzMiAqcDsKKyAgZ2ludDE2ICpxOworCisgIHAgPSBzcmM7CisgIHEgPSBiYWNrZ3JvdW5kOworICBmb3IgKGkgPSAwOyBpIDwgdmlkZW9fYXJlYTsgaSsrKSB7CisgICAgUiA9ICgoKnApICYgMHhmZjAwMDApID4+ICgxNiAtIDEpOworICAgIEcgPSAoKCpwKSAmIDB4ZmYwMCkgPj4gKDggLSAyKTsKKyAgICBCID0gKCpwKSAmIDB4ZmY7CisgICAgKnEgPSAoZ2ludDE2KSAoUiArIEcgKyBCKTsKKyAgICBwKys7CisgICAgcSsrOworICB9Cit9CisKK3N0YXRpYyBnaW50CitzZXRCYWNrZ3JvdW5kIChHc3RSaXBwbGVUViAqIGZpbHRlciwgZ3VpbnQzMiAqIHNyYykKK3sKKyAgR3N0VmlkZW9JbmZvICppbmZvOworCisgIGluZm8gPSAmR1NUX1ZJREVPX0ZJTFRFUiAoZmlsdGVyKS0+aW5faW5mbzsKKworICBpbWFnZV9iZ3NldF95IChzcmMsIGZpbHRlci0+YmFja2dyb3VuZCwKKyAgICAgIEdTVF9WSURFT19JTkZPX1dJRFRIIChpbmZvKSAqIEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5mbykpOworICBmaWx0ZXItPmJnX2lzX3NldCA9IFRSVUU7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpbWFnZV9iZ3N1YnRyYWN0X3VwZGF0ZV95IChndWludDMyICogc3JjLCBnaW50MTYgKiBiYWNrZ3JvdW5kLCBndWludDggKiBkaWZmLAorICAgIGdpbnQgdmlkZW9fYXJlYSkKK3sKKyAgZ2ludCBpOworICBnaW50IFIsIEcsIEI7CisgIGd1aW50MzIgKnA7CisgIGdpbnQxNiAqcTsKKyAgZ3VpbnQ4ICpyOworICBnaW50IHY7CisKKyAgcCA9IHNyYzsKKyAgcSA9IGJhY2tncm91bmQ7CisgIHIgPSBkaWZmOworICBmb3IgKGkgPSAwOyBpIDwgdmlkZW9fYXJlYTsgaSsrKSB7CisgICAgUiA9ICgoKnApICYgMHhmZjAwMDApID4+ICgxNiAtIDEpOworICAgIEcgPSAoKCpwKSAmIDB4ZmYwMCkgPj4gKDggLSAyKTsKKyAgICBCID0gKCpwKSAmIDB4ZmY7CisgICAgdiA9IChSICsgRyArIEIpIC0gKGdpbnQpICgqcSk7CisgICAgKnEgPSAoZ2ludDE2KSAoUiArIEcgKyBCKTsKKyAgICAqciA9ICgodiArIDcwICogNykgPj4gMjQpIHwgKCg3MCAqIDcgLSB2KSA+PiAyNCk7CisKKyAgICBwKys7CisgICAgcSsrOworICAgIHIrKzsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorbW90aW9uZGV0ZWN0IChHc3RSaXBwbGVUViAqIGZpbHRlciwgZ3VpbnQzMiAqIHNyYykKK3sKKyAgZ3VpbnQ4ICpkaWZmID0gZmlsdGVyLT5kaWZmOworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgKnAsICpxOworICBnaW50IHgsIHksIGg7CisgIEdzdFZpZGVvSW5mbyAqaW5mbzsKKworICBpbmZvID0gJkdTVF9WSURFT19GSUxURVIgKGZpbHRlciktPmluX2luZm87CisKKyAgd2lkdGggPSBHU1RfVklERU9fSU5GT19XSURUSCAoaW5mbyk7CisgIGhlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5mbyk7CisKKyAgaWYgKCFmaWx0ZXItPmJnX2lzX3NldCkKKyAgICBzZXRCYWNrZ3JvdW5kIChmaWx0ZXIsIHNyYyk7CisKKyAgaW1hZ2VfYmdzdWJ0cmFjdF91cGRhdGVfeSAoc3JjLCBmaWx0ZXItPmJhY2tncm91bmQsIGZpbHRlci0+ZGlmZiwKKyAgICAgIHdpZHRoICogaGVpZ2h0KTsKKyAgcCA9IGZpbHRlci0+bWFwMSArIGZpbHRlci0+bWFwX3cgKyAxOworICBxID0gZmlsdGVyLT5tYXAyICsgZmlsdGVyLT5tYXBfdyArIDE7CisgIGRpZmYgKz0gd2lkdGggKyAyOworCisgIGZvciAoeSA9IGZpbHRlci0+bWFwX2ggLSAyOyB5ID4gMDsgeS0tKSB7CisgICAgZm9yICh4ID0gZmlsdGVyLT5tYXBfdyAtIDI7IHggPiAwOyB4LS0pIHsKKyAgICAgIGggPSAoZ2ludCkgKiBkaWZmICsgKGdpbnQpICogKGRpZmYgKyAxKSArIChnaW50KSAqIChkaWZmICsgd2lkdGgpICsKKyAgICAgICAgICAoZ2ludCkgKiAoZGlmZiArIHdpZHRoICsgMSk7CisgICAgICBpZiAoaCA+IDApIHsKKyAgICAgICAgKnAgPSBoIDw8IChwb2ludCArIGltcGFjdCAtIDgpOworICAgICAgICAqcSA9ICpwOworICAgICAgfQorICAgICAgcCsrOworICAgICAgcSsrOworICAgICAgZGlmZiArPSAyOworICAgIH0KKyAgICBkaWZmICs9IHdpZHRoICsgMjsKKyAgICBwICs9IDI7CisgICAgcSArPSAyOworICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZHJvcCAoZ2ludCBwb3dlciwgZ2ludCAqIG1hcDEsIGdpbnQgKiBtYXAyLCBnaW50IG1hcF93LCBnaW50IG1hcF9oKQoreworICBnaW50IHgsIHk7CisgIGdpbnQgKnAsICpxOworCisgIHggPSBmYXN0cmFuZCAoKSAlIChtYXBfdyAtIDQpICsgMjsKKyAgeSA9IGZhc3RyYW5kICgpICUgKG1hcF9oIC0gNCkgKyAyOworICBwID0gbWFwMSArIHkgKiBtYXBfdyArIHg7CisgIHEgPSBtYXAyICsgeSAqIG1hcF93ICsgeDsKKyAgKnAgPSBwb3dlcjsKKyAgKnEgPSBwb3dlcjsKKyAgKihwIC0gbWFwX3cpID0gKihwIC0gMSkgPSAqKHAgKyAxKSA9ICoocCArIG1hcF93KSA9IHBvd2VyIC8gMjsKKyAgKihwIC0gbWFwX3cgLSAxKSA9ICoocCAtIG1hcF93ICsgMSkgPSAqKHAgKyBtYXBfdyAtIDEpID0gKihwICsgbWFwX3cgKyAxKSA9CisgICAgICBwb3dlciAvIDQ7CisgICoocSAtIG1hcF93KSA9ICoocSAtIDEpID0gKihxICsgMSkgPSAqKHEgKyBtYXBfdykgPSBwb3dlciAvIDI7CisgICoocSAtIG1hcF93IC0gMSkgPSAqKHEgLSBtYXBfdyArIDEpID0gKihxICsgbWFwX3cgLSAxKSA9ICoocCArIG1hcF93ICsgMSkgPQorICAgICAgcG93ZXIgLyA0OworfQorCitzdGF0aWMgdm9pZAorcmFpbmRyb3AgKEdzdFJpcHBsZVRWICogZmlsdGVyKQoreworICBnaW50IGk7CisKKyAgaWYgKGZpbHRlci0+cGVyaW9kID09IDApIHsKKyAgICBzd2l0Y2ggKGZpbHRlci0+cmFpbl9zdGF0KSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIGZpbHRlci0+cGVyaW9kID0gKGZhc3RyYW5kICgpID4+IDIzKSArIDEwMDsKKyAgICAgICAgZmlsdGVyLT5kcm9wX3Byb2IgPSAwOworICAgICAgICBmaWx0ZXItPmRyb3BfcHJvYl9pbmNyZW1lbnQgPSAweDAwZmZmZmZmIC8gZmlsdGVyLT5wZXJpb2Q7CisgICAgICAgIGZpbHRlci0+ZHJvcF9wb3dlciA9ICgtKGZhc3RyYW5kICgpID4+IDI4KSAtIDIpIDw8IHBvaW50OworICAgICAgICBmaWx0ZXItPmRyb3BzX3Blcl9mcmFtZV9tYXggPSAyIDw8IChmYXN0cmFuZCAoKSA+PiAzMCk7IC8vIDIsNCw4IG9yIDE2CisgICAgICAgIGZpbHRlci0+cmFpbl9zdGF0ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICAgIGZpbHRlci0+ZHJvcF9wcm9iID0gMHgwMGZmZmZmZjsKKyAgICAgICAgZmlsdGVyLT5kcm9wc19wZXJfZnJhbWUgPSAxOworICAgICAgICBmaWx0ZXItPmRyb3BfcHJvYl9pbmNyZW1lbnQgPSAxOworICAgICAgICBmaWx0ZXItPnBlcmlvZCA9IChmaWx0ZXItPmRyb3BzX3Blcl9mcmFtZV9tYXggLSAxKSAqIDE2OworICAgICAgICBmaWx0ZXItPnJhaW5fc3RhdCA9IDI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBmaWx0ZXItPnBlcmlvZCA9IChmYXN0cmFuZCAoKSA+PiAyMikgKyAxMDAwOworICAgICAgICBmaWx0ZXItPmRyb3BfcHJvYl9pbmNyZW1lbnQgPSAwOworICAgICAgICBmaWx0ZXItPnJhaW5fc3RhdCA9IDM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOgorICAgICAgICBmaWx0ZXItPnBlcmlvZCA9IChmaWx0ZXItPmRyb3BzX3Blcl9mcmFtZV9tYXggLSAxKSAqIDE2OworICAgICAgICBmaWx0ZXItPmRyb3BfcHJvYl9pbmNyZW1lbnQgPSAtMTsKKyAgICAgICAgZmlsdGVyLT5yYWluX3N0YXQgPSA0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgZmlsdGVyLT5wZXJpb2QgPSAoZmFzdHJhbmQgKCkgPj4gMjQpICsgNjA7CisgICAgICAgIGZpbHRlci0+ZHJvcF9wcm9iX2luY3JlbWVudCA9IC0oZmlsdGVyLT5kcm9wX3Byb2IgLyBmaWx0ZXItPnBlcmlvZCk7CisgICAgICAgIGZpbHRlci0+cmFpbl9zdGF0ID0gNTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDU6CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaWx0ZXItPnBlcmlvZCA9IChmYXN0cmFuZCAoKSA+PiAyMykgKyA1MDA7CisgICAgICAgIGZpbHRlci0+ZHJvcF9wcm9iID0gMDsKKyAgICAgICAgZmlsdGVyLT5yYWluX3N0YXQgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgc3dpdGNoIChmaWx0ZXItPnJhaW5fc3RhdCkgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSAwOgorICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgIGNhc2UgNToKKyAgICAgIGlmICgoZmFzdHJhbmQgKCkgPj4gOCkgPCBmaWx0ZXItPmRyb3BfcHJvYikgeworICAgICAgICBkcm9wIChmaWx0ZXItPmRyb3BfcG93ZXIsIGZpbHRlci0+bWFwMSwgZmlsdGVyLT5tYXAyLCBmaWx0ZXItPm1hcF93LAorICAgICAgICAgICAgZmlsdGVyLT5tYXBfaCk7CisgICAgICB9CisgICAgICBmaWx0ZXItPmRyb3BfcHJvYiArPSBmaWx0ZXItPmRyb3BfcHJvYl9pbmNyZW1lbnQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgY2FzZSAzOgorICAgIGNhc2UgNDoKKyAgICAgIGZvciAoaSA9IGZpbHRlci0+ZHJvcHNfcGVyX2ZyYW1lIC8gMTY7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgZHJvcCAoZmlsdGVyLT5kcm9wX3Bvd2VyLCBmaWx0ZXItPm1hcDEsIGZpbHRlci0+bWFwMiwgZmlsdGVyLT5tYXBfdywKKyAgICAgICAgICAgIGZpbHRlci0+bWFwX2gpOworICAgICAgfQorICAgICAgZmlsdGVyLT5kcm9wc19wZXJfZnJhbWUgKz0gZmlsdGVyLT5kcm9wX3Byb2JfaW5jcmVtZW50OworICAgICAgYnJlYWs7CisgIH0KKyAgZmlsdGVyLT5wZXJpb2QtLTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9yaXBwbGV0dl90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwKKyAgICBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUpCit7CisgIEdzdFJpcHBsZVRWICpmaWx0ZXIgPSBHU1RfUklQUExFVFYgKHZmaWx0ZXIpOworICBndWludDMyICpzcmMsICpkZXN0OworICBnaW50IHgsIHksIGk7CisgIGdpbnQgZHgsIGR5LCBvX2R4OworICBnaW50IGgsIHY7CisgIGdpbnQgbV93LCBtX2gsIHZfdywgdl9oOworICBnaW50ICpwLCAqcSwgKnI7CisgIGdpbnQ4ICp2cDsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwgc3RyZWFtX3RpbWU7CisKKyAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluX2ZyYW1lLT5idWZmZXIpOworICBzdHJlYW1fdGltZSA9CisgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJkdTVF9CQVNFX1RSQU5TRk9STSAodmZpbHRlciktPnNlZ21lbnQsCisgICAgICBHU1RfRk9STUFUX1RJTUUsIHRpbWVzdGFtcCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAic3luYyB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHN0cmVhbV90aW1lKSkKKyAgICBnc3Rfb2JqZWN0X3N5bmNfdmFsdWVzIChHU1RfT0JKRUNUIChmaWx0ZXIpLCBzdHJlYW1fdGltZSk7CisKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAwKTsKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgLyogaW1wYWN0IGZyb20gdGhlIG1vdGlvbiBvciByYWluIGRyb3AgKi8KKyAgaWYgKGZpbHRlci0+bW9kZSkKKyAgICByYWluZHJvcCAoZmlsdGVyKTsKKyAgZWxzZQorICAgIG1vdGlvbmRldGVjdCAoZmlsdGVyLCBzcmMpOworCisgIG1fdyA9IGZpbHRlci0+bWFwX3c7CisgIG1faCA9IGZpbHRlci0+bWFwX2g7CisgIHZfdyA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpOworICB2X2ggPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSk7CisKKyAgLyogc2ltdWxhdGUgc3VyZmFjZSB3YXZlICovCisKKyAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSAzMCB0aW1lcyBwZXIgc2Vjb25kLiBUbyBpbmNyZWFzZSBhIHNwZWVkCisgICAqIG9mIHdhdmUsIGl0ZXJhdGVzIHRoaXMgbG9vcCBzZXZlcmFsIHRpbWVzLiAqLworICBmb3IgKGkgPSBsb29wbnVtOyBpID4gMDsgaS0tKSB7CisgICAgLyogd2F2ZSBzaW11bGF0aW9uICovCisgICAgcCA9IGZpbHRlci0+bWFwMSArIG1fdyArIDE7CisgICAgcSA9IGZpbHRlci0+bWFwMiArIG1fdyArIDE7CisgICAgciA9IGZpbHRlci0+bWFwMyArIG1fdyArIDE7CisgICAgZm9yICh5ID0gbV9oIC0gMjsgeSA+IDA7IHktLSkgeworICAgICAgZm9yICh4ID0gbV93IC0gMjsgeCA+IDA7IHgtLSkgeworICAgICAgICBoID0gKihwIC0gbV93IC0gMSkgKyAqKHAgLSBtX3cgKyAxKSArICoocCArIG1fdyAtIDEpICsgKihwICsgbV93ICsgMSkKKyAgICAgICAgICAgICsgKihwIC0gbV93KSArICoocCAtIDEpICsgKihwICsgMSkgKyAqKHAgKyBtX3cpIC0gKCpwKSAqIDk7CisgICAgICAgIGggPSBoID4+IDM7CisgICAgICAgIHYgPSAqcCAtICpxOworICAgICAgICB2ICs9IGggLSAodiA+PiBkZWNheSk7CisgICAgICAgICpyID0gdiArICpwOworICAgICAgICBwKys7CisgICAgICAgIHErKzsKKyAgICAgICAgcisrOworICAgICAgfQorICAgICAgcCArPSAyOworICAgICAgcSArPSAyOworICAgICAgciArPSAyOworICAgIH0KKworICAgIC8qIGxvdyBwYXNzIGZpbHRlciAqLworICAgIHAgPSBmaWx0ZXItPm1hcDMgKyBtX3cgKyAxOworICAgIHEgPSBmaWx0ZXItPm1hcDIgKyBtX3cgKyAxOworICAgIGZvciAoeSA9IG1faCAtIDI7IHkgPiAwOyB5LS0pIHsKKyAgICAgIGZvciAoeCA9IG1fdyAtIDI7IHggPiAwOyB4LS0pIHsKKyAgICAgICAgaCA9ICoocCAtIG1fdykgKyAqKHAgLSAxKSArICoocCArIDEpICsgKihwICsgbV93KSArICgqcCkgKiA2MDsKKyAgICAgICAgKnEgPSBoID4+IDY7CisgICAgICAgIHArKzsKKyAgICAgICAgcSsrOworICAgICAgfQorICAgICAgcCArPSAyOworICAgICAgcSArPSAyOworICAgIH0KKworICAgIHAgPSBmaWx0ZXItPm1hcDE7CisgICAgZmlsdGVyLT5tYXAxID0gZmlsdGVyLT5tYXAyOworICAgIGZpbHRlci0+bWFwMiA9IHA7CisgIH0KKworICB2cCA9IGZpbHRlci0+dnRhYmxlOworICBwID0gZmlsdGVyLT5tYXAxOworICBmb3IgKHkgPSBtX2ggLSAxOyB5ID4gMDsgeS0tKSB7CisgICAgZm9yICh4ID0gbV93IC0gMTsgeCA+IDA7IHgtLSkgeworICAgICAgLyogZGlmZmVyZW5jZSBvZiB0aGUgaGVpZ2h0IGJldHdlZW4gdHdvIHZveGVsLiBUaGV5IGFyZSB0d2ljZWQgdG8KKyAgICAgICAqIGVtcGhhc2lzZSB0aGUgd2F2ZS4gKi8KKyAgICAgIHZwWzBdID0gc3FydGFibGVbKChwWzBdIC0gcFsxXSkgPj4gKHBvaW50IC0gMSkpICYgMHhmZl07CisgICAgICB2cFsxXSA9IHNxcnRhYmxlWygocFswXSAtIHBbbV93XSkgPj4gKHBvaW50IC0gMSkpICYgMHhmZl07CisgICAgICBwKys7CisgICAgICB2cCArPSAyOworICAgIH0KKyAgICBwKys7CisgICAgdnAgKz0gMjsKKyAgfQorCisgIHZwID0gZmlsdGVyLT52dGFibGU7CisKKyAgLyogZHJhdyByZWZyYWN0ZWQgaW1hZ2UuIFRoZSB2ZWN0b3IgdGFibGUgaXMgc3RyZXRjaGVkLiAqLworICBmb3IgKHkgPSAwOyB5IDwgdl9oOyB5ICs9IDIpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgdl93OyB4ICs9IDIpIHsKKyAgICAgIGggPSAoZ2ludCkgdnBbMF07CisgICAgICB2ID0gKGdpbnQpIHZwWzFdOworICAgICAgZHggPSB4ICsgaDsKKyAgICAgIGR5ID0geSArIHY7CisgICAgICBkeCA9IENMQU1QIChkeCwgMCwgKHZfdyAtIDIpKTsKKyAgICAgIGR5ID0gQ0xBTVAgKGR5LCAwLCAodl9oIC0gMikpOworICAgICAgZGVzdFswXSA9IHNyY1tkeSAqIHZfdyArIGR4XTsKKworICAgICAgb19keCA9IGR4OworCisgICAgICBkeCA9IHggKyAxICsgKGggKyAoZ2ludCkgdnBbMl0pIC8gMjsKKyAgICAgIGR4ID0gQ0xBTVAgKGR4LCAwLCAodl93IC0gMikpOworICAgICAgZGVzdFsxXSA9IHNyY1tkeSAqIHZfdyArIGR4XTsKKworICAgICAgZHkgPSB5ICsgMSArICh2ICsgKGdpbnQpIHZwW21fdyAqIDIgKyAxXSkgLyAyOworICAgICAgZHkgPSBDTEFNUCAoZHksIDAsICh2X2ggLSAyKSk7CisgICAgICBkZXN0W3Zfd10gPSBzcmNbZHkgKiB2X3cgKyBvX2R4XTsKKworICAgICAgZGVzdFt2X3cgKyAxXSA9IHNyY1tkeSAqIHZfdyArIGR4XTsKKyAgICAgIGRlc3QgKz0gMjsKKyAgICAgIHZwICs9IDI7CisgICAgfQorICAgIGRlc3QgKz0gdl93OworICAgIHZwICs9IDI7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGZpbHRlcik7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9yaXBwbGV0dl9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0UmlwcGxlVFYgKmZpbHRlciA9IEdTVF9SSVBQTEVUViAodmZpbHRlcik7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKworICB3aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIIChpbl9pbmZvKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbl9pbmZvKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgIGZpbHRlci0+bWFwX2ggPSBoZWlnaHQgLyAyICsgMTsKKyAgZmlsdGVyLT5tYXBfdyA9IHdpZHRoIC8gMiArIDE7CisKKyAgLyogd2Ugb3ZlciBhbGxvY2F0ZSB0aGUgYnVmZmVycywgYXMgdGhlIHJlbmRlciBjb2RlIGRvZXMgbm90IGhhbmRsZSBjbGlwcGluZworICAgKiB2ZXJ5IHdlbGwgKi8KKyAgZ19mcmVlIChmaWx0ZXItPm1hcCk7CisgIGZpbHRlci0+bWFwID0gZ19uZXcwIChnaW50LCAoMSArIGZpbHRlci0+bWFwX2gpICogZmlsdGVyLT5tYXBfdyAqIDMpOworCisgIGZpbHRlci0+bWFwMSA9IGZpbHRlci0+bWFwOworICBmaWx0ZXItPm1hcDIgPSBmaWx0ZXItPm1hcCArIGZpbHRlci0+bWFwX3cgKiBmaWx0ZXItPm1hcF9oOworICBmaWx0ZXItPm1hcDMgPSBmaWx0ZXItPm1hcCArIGZpbHRlci0+bWFwX3cgKiBmaWx0ZXItPm1hcF9oICogMjsKKworICBnX2ZyZWUgKGZpbHRlci0+dnRhYmxlKTsKKyAgZmlsdGVyLT52dGFibGUgPSBnX25ldzAgKGdpbnQ4LCAoMSArIGZpbHRlci0+bWFwX2gpICogZmlsdGVyLT5tYXBfdyAqIDIpOworCisgIGdfZnJlZSAoZmlsdGVyLT5iYWNrZ3JvdW5kKTsKKyAgZmlsdGVyLT5iYWNrZ3JvdW5kID0gZ19uZXcwIChnaW50MTYsIHdpZHRoICogKGhlaWdodCArIDEpKTsKKworICBnX2ZyZWUgKGZpbHRlci0+ZGlmZik7CisgIGZpbHRlci0+ZGlmZiA9IGdfbmV3MCAoZ3VpbnQ4LCB3aWR0aCAqIChoZWlnaHQgKyAxKSk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9yaXBwbGV0dl9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICBHc3RSaXBwbGVUViAqZmlsdGVyID0gR1NUX1JJUFBMRVRWICh0cmFucyk7CisKKyAgZmlsdGVyLT5iZ19pc19zZXQgPSBGQUxTRTsKKworICBmaWx0ZXItPnBlcmlvZCA9IDA7CisgIGZpbHRlci0+cmFpbl9zdGF0ID0gMDsKKyAgZmlsdGVyLT5kcm9wX3Byb2IgPSAwOworICBmaWx0ZXItPmRyb3BfcHJvYl9pbmNyZW1lbnQgPSAwOworICBmaWx0ZXItPmRyb3BzX3Blcl9mcmFtZV9tYXggPSAwOworICBmaWx0ZXItPmRyb3BzX3Blcl9mcmFtZSA9IDA7CisgIGZpbHRlci0+ZHJvcF9wb3dlciA9IDA7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcmlwcGxldHZfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJpcHBsZVRWICpmaWx0ZXIgPSBHU1RfUklQUExFVFYgKG9iamVjdCk7CisKKyAgZ19mcmVlIChmaWx0ZXItPm1hcCk7CisgIGZpbHRlci0+bWFwID0gTlVMTDsKKworICBnX2ZyZWUgKGZpbHRlci0+dnRhYmxlKTsKKyAgZmlsdGVyLT52dGFibGUgPSBOVUxMOworCisgIGdfZnJlZSAoZmlsdGVyLT5iYWNrZ3JvdW5kKTsKKyAgZmlsdGVyLT5iYWNrZ3JvdW5kID0gTlVMTDsKKworICBnX2ZyZWUgKGZpbHRlci0+ZGlmZik7CisgIGZpbHRlci0+ZGlmZiA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JpcHBsZXR2X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSaXBwbGVUViAqZmlsdGVyID0gR1NUX1JJUFBMRVRWIChvYmplY3QpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1JFU0VUOnsKKyAgICAgIG1lbXNldCAoZmlsdGVyLT5tYXAsIDAsCisgICAgICAgICAgZmlsdGVyLT5tYXBfaCAqIGZpbHRlci0+bWFwX3cgKiAyICogc2l6ZW9mIChnaW50KSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX01PREU6CisgICAgICBmaWx0ZXItPm1vZGUgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JpcHBsZXR2X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSaXBwbGVUViAqZmlsdGVyID0gR1NUX1JJUFBMRVRWIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGZpbHRlci0+bW9kZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcmlwcGxldHZfY2xhc3NfaW5pdCAoR3N0UmlwcGxlVFZDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9yaXBwbGV0dl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9yaXBwbGV0dl9nZXRfcHJvcGVydHk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcmlwcGxldHZfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SRVNFVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgicmVzZXQiLCAiUmVzZXQiLAorICAgICAgICAgICJSZXNldCBhbGwgY3VycmVudCByaXBwbGVzIiwgRkFMU0UsCisgICAgICAgICAgR19QQVJBTV9XUklUQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJtb2RlIiwgIk1vZGUiLAorICAgICAgICAgICJNb2RlIiwgR1NUX1RZUEVfUklQUExFVFZfTU9ERSwgREVGQVVMVF9NT0RFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUmlwcGxlVFYgZWZmZWN0IiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJSaXBwbGVUViBkb2VzIHJpcHBsZSBtYXJrIGVmZmVjdCBvbiB0aGUgdmlkZW8gaW5wdXQiLAorICAgICAgIkZVS1VDSEksIEtlbnRhcm91IDxmdWt1Y2hpQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4sICIKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcmlwcGxldHZfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9yaXBwbGV0dl9zcmNfdGVtcGxhdGUpOworCisgIHRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcmlwcGxldHZfc3RhcnQpOworCisgIHZmaWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9yaXBwbGV0dl9zZXRfaW5mbyk7CisgIHZmaWx0ZXJfY2xhc3MtPnRyYW5zZm9ybV9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3JpcHBsZXR2X3RyYW5zZm9ybV9mcmFtZSk7CisKKyAgc2V0VGFibGUgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcmlwcGxldHZfaW5pdCAoR3N0UmlwcGxlVFYgKiBmaWx0ZXIpCit7CisgIGZpbHRlci0+bW9kZSA9IERFRkFVTFRfTU9ERTsKKworICAvKiBGSVhNRTogcmVtb3ZlIHRoaXMgd2hlbiBtZW1vcnkgY29ycnVwdGlvbiBhZnRlciByZXNpemVzIGFyZSBmaXhlZCAqLworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChHU1RfQkFTRV9UUkFOU0ZPUk1fU1JDX1BBRCAoZmlsdGVyKSk7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKEdTVF9CQVNFX1RSQU5TRk9STV9TSU5LX1BBRCAoZmlsdGVyKSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvZWZmZWN0di9nc3RyaXBwbGUuaCBiL2dzdC9lZmZlY3R2L2dzdHJpcHBsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOWU1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZWZmZWN0di9nc3RyaXBwbGUuaApAQCAtMCwwICsxLDg2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIEVmZmVjVFYgLSBSZWFsdGltZSBEaWdpdGFsIFZpZGVvIEVmZmVjdG9yCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBGVUtVQ0hJIEtlbnRhcm8KKyAqCisgKiBSaXBwbGVUViAtIFdhdGVyIHJpcHBsZSBlZmZlY3QuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBGVUtVQ0hJIEtlbnRhcm8KKyAqCisgKiBFZmZlY1RWIGlzIGZyZWUgc29mdHdhcmUuIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JJUFBMRV9IX18KKyNkZWZpbmUgX19HU1RfUklQUExFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SSVBQTEVUViBcCisgIChnc3RfcmlwcGxldHZfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JJUFBMRVRWKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUklQUExFVFYsR3N0UmlwcGxlVFYpKQorI2RlZmluZSBHU1RfUklQUExFVFZfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUklQUExFVFYsR3N0UmlwcGxlVFZDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SSVBQTEVUVihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JJUFBMRVRWKSkKKyNkZWZpbmUgR1NUX0lTX1JJUFBMRVRWX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JJUFBMRVRWKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJpcHBsZVRWIEdzdFJpcHBsZVRWOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJpcHBsZVRWQ2xhc3MgR3N0UmlwcGxlVFZDbGFzczsKKworc3RydWN0IF9Hc3RSaXBwbGVUVgoreworICBHc3RWaWRlb0ZpbHRlciBlbGVtZW50OworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIGdpbnQgbW9kZTsKKworICBnaW50MTYgKmJhY2tncm91bmQ7CisgIGd1aW50OCAqZGlmZjsKKworICBnaW50ICptYXAsICptYXAxLCAqbWFwMiwgKm1hcDM7CisgIGdpbnQgbWFwX2gsIG1hcF93OworCisgIGdpbnQ4ICp2dGFibGU7CisKKyAgZ2Jvb2xlYW4gYmdfaXNfc2V0OworCisgIGdpbnQgcGVyaW9kOworICBnaW50IHJhaW5fc3RhdDsKKyAgZ3VpbnQgZHJvcF9wcm9iOworICBnaW50IGRyb3BfcHJvYl9pbmNyZW1lbnQ7CisgIGdpbnQgZHJvcHNfcGVyX2ZyYW1lX21heDsKKyAgZ2ludCBkcm9wc19wZXJfZnJhbWU7CisgIGdpbnQgZHJvcF9wb3dlcjsKK307CisKK3N0cnVjdCBfR3N0UmlwcGxlVFZDbGFzcworeworICBHc3RWaWRlb0ZpbHRlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9yaXBwbGV0dl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SSVBQTEVfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmMgYi9nc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxYTE1MQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L2dzdHNoYWdhZGVsaWMuYwpAQCAtMCwwICsxLDI1NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIEVmZmVjVFY6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgRlVLVUNISSBLZW50YXJvdQorICoKKyAqIEluc3BpcmVkIGJ5IEFkcmlhbiBMaWtpbidzIHNjcmlwdCBmb3IgdGhlIEdJTVAuCisgKiBFZmZlY1RWIGlzIGZyZWUgc29mdHdhcmUuICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXNoYWdhZGVsaWN0dgorICoKKyAqIE9oIGJlaGF2ZSwgU2hhZ2VkZWxpY1RWIG1ha2VzIGltYWdlcyBzaGFnYWRlbGljIQorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiB2aWRlb3Rlc3RzcmMgISBzaGFnYWRlbGljdHYgISB2aWRlb2NvbnZlcnQgISBhdXRvdmlkZW9zaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIHNob3dzIHRoZSBlZmZlY3Qgb2Ygc2hhZ2FkZWxpY3R2IG9uIGEgdGVzdCBzdHJlYW0uCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHNoYWdhZGVsaWMuaCIKKyNpbmNsdWRlICJnc3RlZmZlY3R2LmgiCisKKyNpZm5kZWYgTV9QSQorI2RlZmluZSBNX1BJICAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CisjZW5kaWYKKworI2RlZmluZSBnc3Rfc2hhZ2FkZWxpY3R2X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFNoYWdhZGVsaWNUViwgZ3N0X3NoYWdhZGVsaWN0diwgR1NUX1RZUEVfVklERU9fRklMVEVSKTsKKworc3RhdGljIHZvaWQgZ3N0X3NoYWdhZGVsaWNfaW5pdGlhbGl6ZSAoR3N0U2hhZ2FkZWxpY1RWICogZmlsdGVyLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8pOworCisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorI2RlZmluZSBDQVBTX1NUUiBHU1RfVklERU9fQ0FQU19NQUtFICgiQkdSeCIpCisjZWxzZQorI2RlZmluZSBDQVBTX1NUUiBHU1RfVklERU9fQ0FQU19NQUtFICgieFJHQiIpCisjZW5kaWYKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9zaGFnYWRlbGljdHZfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKENBUFNfU1RSKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3Rfc2hhZ2FkZWxpY3R2X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChDQVBTX1NUUikKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zaGFnYWRlbGljdHZfc2V0X2luZm8gKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwgR3N0Q2FwcyAqIGluY2FwcywKKyAgICBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLCBHc3RDYXBzICogb3V0Y2FwcywgR3N0VmlkZW9JbmZvICogb3V0X2luZm8pCit7CisgIEdzdFNoYWdhZGVsaWNUViAqZmlsdGVyID0gR1NUX1NIQUdBREVMSUNUViAodmZpbHRlcik7CisgIGdpbnQgd2lkdGgsIGhlaWdodCwgYXJlYTsKKworICB3aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIIChpbl9pbmZvKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbl9pbmZvKTsKKworICBhcmVhID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgZ19mcmVlIChmaWx0ZXItPnJpcHBsZSk7CisgIGdfZnJlZSAoZmlsdGVyLT5zcGlyYWwpOworICBmaWx0ZXItPnJpcHBsZSA9IChndWludDggKikgZ19tYWxsb2MgKGFyZWEgKiA0KTsKKyAgZmlsdGVyLT5zcGlyYWwgPSAoZ3VpbnQ4ICopIGdfbWFsbG9jIChhcmVhKTsKKworICBnc3Rfc2hhZ2FkZWxpY19pbml0aWFsaXplIChmaWx0ZXIsIGluX2luZm8pOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NoYWdhZGVsaWNfaW5pdGlhbGl6ZSAoR3N0U2hhZ2FkZWxpY1RWICogZmlsdGVyLCBHc3RWaWRlb0luZm8gKiBpbmZvKQoreworICBpbnQgaSwgeCwgeTsKKyNpZmRlZiBQUzIKKyAgZmxvYXQgeHgsIHl5OworI2Vsc2UKKyAgZG91YmxlIHh4LCB5eTsKKyNlbmRpZgorICBnaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgd2lkdGggPSBHU1RfVklERU9fSU5GT19XSURUSCAoaW5mbyk7CisgIGhlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5mbyk7CisKKyAgaSA9IDA7CisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQgKiAyOyB5KyspIHsKKyAgICB5eSA9IHkgLSBoZWlnaHQ7CisgICAgeXkgKj0geXk7CisKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGggKiAyOyB4KyspIHsKKyAgICAgIHh4ID0geCAtIHdpZHRoOworI2lmZGVmIFBTMgorICAgICAgZmlsdGVyLT5yaXBwbGVbaSsrXSA9ICgodW5zaWduZWQgaW50KSAoc3FydGYgKHh4ICogeHggKyB5eSkgKiA4KSkgJiAyNTU7CisjZWxzZQorICAgICAgZmlsdGVyLT5yaXBwbGVbaSsrXSA9ICgodW5zaWduZWQgaW50KSAoc3FydCAoeHggKiB4eCArIHl5KSAqIDgpKSAmIDI1NTsKKyNlbmRpZgorICAgIH0KKyAgfQorCisgIGkgPSAwOworICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICB5eSA9IHkgLSBoZWlnaHQgLyAyOworCisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgIHh4ID0geCAtIHdpZHRoIC8gMjsKKyNpZmRlZiBQUzIKKyAgICAgIGZpbHRlci0+c3BpcmFsW2krK10gPSAoKHVuc2lnbmVkIGludCkKKyAgICAgICAgICAoKGF0YW4yZiAoeHgsCisgICAgICAgICAgICAgICAgICAgICAgeXkpIC8gKChmbG9hdCkgTV9QSSkgKiAyNTYgKiA5KSArIChzcXJ0ZiAoeHggKiB4eCArCisgICAgICAgICAgICAgICAgICAgICAgeXkgKiB5eSkgKiA1KSkpICYgMjU1OworI2Vsc2UKKyAgICAgIGZpbHRlci0+c3BpcmFsW2krK10gPSAoKHVuc2lnbmVkIGludCkKKyAgICAgICAgICAoKGF0YW4yICh4eCwgeXkpIC8gTV9QSSAqIDI1NiAqIDkpICsgKHNxcnQgKHh4ICogeHggKworICAgICAgICAgICAgICAgICAgICAgIHl5ICogeXkpICogNSkpKSAmIDI1NTsKKyNlbmRpZgorLyogSGVyZSBpcyBhbm90aGVyIFN3aW5nZXIhCisgKiAoKGF0YW4yKHh4LCB5eSkvTV9QSSoyNTYpICsgKHNxcnQoeHgqeHgreXkqeXkpKjEwKSkmMjU1OworICovCisgICAgfQorICB9CisgIGZpbHRlci0+cnggPSBmYXN0cmFuZCAoKSAlIHdpZHRoOworICBmaWx0ZXItPnJ5ID0gZmFzdHJhbmQgKCkgJSBoZWlnaHQ7CisgIGZpbHRlci0+YnggPSBmYXN0cmFuZCAoKSAlIHdpZHRoOworICBmaWx0ZXItPmJ5ID0gZmFzdHJhbmQgKCkgJSBoZWlnaHQ7CisgIGZpbHRlci0+cnZ4ID0gLTI7CisgIGZpbHRlci0+cnZ5ID0gLTI7CisgIGZpbHRlci0+YnZ4ID0gMjsKKyAgZmlsdGVyLT5idnkgPSAyOworICBmaWx0ZXItPnBoYXNlID0gMDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9zaGFnYWRlbGljdHZfdHJhbnNmb3JtX2ZyYW1lIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsCisgICAgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLCBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lKQoreworICBHc3RTaGFnYWRlbGljVFYgKmZpbHRlciA9IEdTVF9TSEFHQURFTElDVFYgKHZmaWx0ZXIpOworICBndWludDMyICpzcmMsICpkZXN0OworICBnaW50IHgsIHk7CisgIGd1aW50MzIgdjsKKyAgZ3VpbnQ4IHIsIGcsIGI7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICB2ID0gKnNyYysrIHwgMHgxMDEwMTAwOworICAgICAgdiA9ICh2IC0gMHg3MDcwNjApICYgMHgxMDEwMTAwOworICAgICAgdiAtPSB2ID4+IDg7CisvKiBUcnkgYW5vdGhlciBCYWJlISAKKyAqIHYgPSAqc3JjKys7CisgKiAqZGVzdCsrID0gdiAmICgocjw8MTYpfChnPDw4KXxiKTsKKyAqLworICAgICAgciA9ICgoZ2ludDgpIChmaWx0ZXItPnJpcHBsZVsoZmlsdGVyLT5yeSArIHkpICogd2lkdGggKiAyICsgZmlsdGVyLT5yeCArCisgICAgICAgICAgICAgICAgICB4XSArIGZpbHRlci0+cGhhc2UgKiAyKSkgPj4gNzsKKyAgICAgIGcgPSAoKGdpbnQ4KSAoZmlsdGVyLT5zcGlyYWxbeSAqIHdpZHRoICsgeF0gKyBmaWx0ZXItPnBoYXNlICogMykpID4+IDc7CisgICAgICBiID0gKChnaW50OCkgKGZpbHRlci0+cmlwcGxlWyhmaWx0ZXItPmJ5ICsgeSkgKiB3aWR0aCAqIDIgKyBmaWx0ZXItPmJ4ICsKKyAgICAgICAgICAgICAgICAgIHhdIC0gZmlsdGVyLT5waGFzZSkpID4+IDc7CisgICAgICAqZGVzdCsrID0gdiAmICgociA8PCAxNikgfCAoZyA8PCA4KSB8IGIpOworICAgIH0KKyAgfQorCisgIGZpbHRlci0+cGhhc2UgLT0gODsKKyAgaWYgKChmaWx0ZXItPnJ4ICsgZmlsdGVyLT5ydngpIDwgMCB8fCAoZmlsdGVyLT5yeCArIGZpbHRlci0+cnZ4KSA+PSB3aWR0aCkKKyAgICBmaWx0ZXItPnJ2eCA9IC1maWx0ZXItPnJ2eDsKKyAgaWYgKChmaWx0ZXItPnJ5ICsgZmlsdGVyLT5ydnkpIDwgMCB8fCAoZmlsdGVyLT5yeSArIGZpbHRlci0+cnZ5KSA+PSBoZWlnaHQpCisgICAgZmlsdGVyLT5ydnkgPSAtZmlsdGVyLT5ydnk7CisgIGlmICgoZmlsdGVyLT5ieCArIGZpbHRlci0+YnZ4KSA8IDAgfHwgKGZpbHRlci0+YnggKyBmaWx0ZXItPmJ2eCkgPj0gd2lkdGgpCisgICAgZmlsdGVyLT5idnggPSAtZmlsdGVyLT5idng7CisgIGlmICgoZmlsdGVyLT5ieSArIGZpbHRlci0+YnZ5KSA8IDAgfHwgKGZpbHRlci0+YnkgKyBmaWx0ZXItPmJ2eSkgPj0gaGVpZ2h0KQorICAgIGZpbHRlci0+YnZ5ID0gLWZpbHRlci0+YnZ5OworICBmaWx0ZXItPnJ4ICs9IGZpbHRlci0+cnZ4OworICBmaWx0ZXItPnJ5ICs9IGZpbHRlci0+cnZ5OworICBmaWx0ZXItPmJ4ICs9IGZpbHRlci0+YnZ4OworICBmaWx0ZXItPmJ5ICs9IGZpbHRlci0+YnZ5OworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zaGFnYWRlbGljdHZfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFNoYWdhZGVsaWNUViAqZmlsdGVyID0gR1NUX1NIQUdBREVMSUNUViAob2JqZWN0KTsKKworICBnX2ZyZWUgKGZpbHRlci0+cmlwcGxlKTsKKyAgZmlsdGVyLT5yaXBwbGUgPSBOVUxMOworCisgIGdfZnJlZSAoZmlsdGVyLT5zcGlyYWwpOworICBmaWx0ZXItPnNwaXJhbCA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NoYWdhZGVsaWN0dl9jbGFzc19pbml0IChHc3RTaGFnYWRlbGljVFZDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RWaWRlb0ZpbHRlckNsYXNzICp2ZmlsdGVyX2NsYXNzID0gKEdzdFZpZGVvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3Rfc2hhZ2FkZWxpY3R2X2ZpbmFsaXplOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJTaGFnYWRlbGljVFYiLAorICAgICAgIkZpbHRlci9FZmZlY3QvVmlkZW8iLAorICAgICAgIk9oIGJlaGF2ZSwgU2hhZ2VkZWxpY1RWIG1ha2VzIGltYWdlcyBzaGFnYWRlbGljISIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGNoZWxsby5iZT4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc2hhZ2FkZWxpY3R2X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc2hhZ2FkZWxpY3R2X3NyY190ZW1wbGF0ZSk7CisKKyAgdmZpbHRlcl9jbGFzcy0+c2V0X2luZm8gPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NoYWdhZGVsaWN0dl9zZXRfaW5mbyk7CisgIHZmaWx0ZXJfY2xhc3MtPnRyYW5zZm9ybV9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NoYWdhZGVsaWN0dl90cmFuc2Zvcm1fZnJhbWUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NoYWdhZGVsaWN0dl9pbml0IChHc3RTaGFnYWRlbGljVFYgKiBmaWx0ZXIpCit7CisgIGZpbHRlci0+cmlwcGxlID0gTlVMTDsKKyAgZmlsdGVyLT5zcGlyYWwgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5oIGIvZ3N0L2VmZmVjdHYvZ3N0c2hhZ2FkZWxpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OWNiZjQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZWZmZWN0di9nc3RzaGFnYWRlbGljLmgKQEAgLTAsMCArMSw3MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIEVmZmVjVFY6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgRlVLVUNISSBLZW50YXJvdQorICoKKyAqIEluc3BpcmVkIGJ5IEFkcmlhbiBMaWtpbidzIHNjcmlwdCBmb3IgdGhlIEdJTVAuCisgKiBFZmZlY1RWIGlzIGZyZWUgc29mdHdhcmUuICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfU0hBR0FERUxJQ19IX18KKyNkZWZpbmUgX19HU1RfU0hBR0FERUxJQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2ZpbHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfU0hBR0FERUxJQ1RWIFwKKyAgKGdzdF9zaGFnYWRlbGljdHZfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1NIQUdBREVMSUNUVihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1NIQUdBREVMSUNUVixHc3RTaGFnYWRlbGljVFYpKQorI2RlZmluZSBHU1RfU0hBR0FERUxJQ1RWX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1NIQUdBREVMSUNUVixHc3RTaGFnYWRlbGljVFZDbGFzcykpCisjZGVmaW5lIEdTVF9JU19TSEFHQURFTElDVFYob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9TSEFHQURFTElDVFYpKQorI2RlZmluZSBHU1RfSVNfU0hBR0FERUxJQ1RWX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1NIQUdBREVMSUNUVikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RTaGFnYWRlbGljVFYgR3N0U2hhZ2FkZWxpY1RWOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNoYWdhZGVsaWNUVkNsYXNzIEdzdFNoYWdhZGVsaWNUVkNsYXNzOworCitzdHJ1Y3QgX0dzdFNoYWdhZGVsaWNUVgoreworICBHc3RWaWRlb0ZpbHRlciB2aWRlb2ZpbHRlcjsKKworICAvKiA8IHByaXZhdGUgPiAqLworICBndWludDggKnJpcHBsZTsKKyAgZ3VpbnQ4ICpzcGlyYWw7CisgIGd1aW50OCBwaGFzZTsKKyAgZ2ludCByeCwgcnk7CisgIGdpbnQgYngsIGJ5OworICBnaW50IHJ2eCwgcnZ5OworICBnaW50IGJ2eCwgYnZ5OworfTsKKworc3RydWN0IF9Hc3RTaGFnYWRlbGljVFZDbGFzcworeworICBHc3RWaWRlb0ZpbHRlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9zaGFnYWRlbGljdHZfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfU0hBR0FERUxJQ19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9lZmZlY3R2L2dzdHN0cmVhay5jIGIvZ3N0L2VmZmVjdHYvZ3N0c3RyZWFrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlZDE1MAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L2dzdHN0cmVhay5jCkBAIC0wLDAgKzEsMjY1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIEVmZmVjVFYgLSBSZWFsdGltZSBEaWdpdGFsIFZpZGVvIEVmZmVjdG9yCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBGVUtVQ0hJIEtlbnRhcm8KKyAqCisgKiBTdHJlYWtUViAtIGFmdGVyaW1hZ2UgZWZmZWN0b3IuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBGVUtVQ0hJIEtlbnRhcm8KKyAqCisgKiBUaGlzIGNvbWJpbmVzIHRoZSBTdHJlYWtUViBhbmQgQmFsdGFuVFYgZWZmZWN0cywgd2hpY2ggYXJlCisgKiB2ZXJ5IHNpbWlsYXIuIEJhbHRhblRWIGlzIHVzZWQgaWYgdGhlIGZlZWRiYWNrIHByb3BlcnR5IGlzIHNldAorICogdG8gVFJVRSwgb3RoZXJ3aXNlIFN0cmVha1RWIGlzIHVzZWQuCisgKgorICogRWZmZWNUViBpcyBmcmVlIHNvZnR3YXJlLiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtc3RyZWFrdHYKKyAqCisgKiBTdHJlYWtUViBtYWtlcyBhZnRlciBpbWFnZXMgb2YgbW92aW5nIG9iamVjdHMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIHN0cmVha3R2ICEgdmlkZW9jb252ZXJ0ICEgYXV0b3ZpZGVvc2luaworICogXXwgVGhpcyBwaXBlbGluZSBzaG93cyB0aGUgZWZmZWN0IG9mIHN0cmVha3R2IG9uIGEgdGVzdCBzdHJlYW0uCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHN0cmVhay5oIgorI2luY2x1ZGUgImdzdGVmZmVjdHYuaCIKKworI2RlZmluZSBERUZBVUxUX0ZFRURCQUNLIEZBTFNFCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0ZFRURCQUNLCit9OworCisjZGVmaW5lIGdzdF9zdHJlYWt0dl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RTdHJlYWtUViwgZ3N0X3N0cmVha3R2LCBHU1RfVFlQRV9WSURFT19GSUxURVIpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3N0cmVha3R2X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBCR1J4LCBSR0J4LCB4QkdSLCB4UkdCIH0iKSkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3N0cmVha3R2X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBCR1J4LCBSR0J4LCB4QkdSLCB4UkdCIH0iKSkKKyAgICApOworCisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfc3RyZWFrdHZfdHJhbnNmb3JtX2ZyYW1lIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsCisgICAgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLCBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lKQoreworICBHc3RTdHJlYWtUViAqZmlsdGVyID0gR1NUX1NUUkVBS1RWICh2ZmlsdGVyKTsKKyAgZ3VpbnQzMiAqc3JjLCAqZGVzdDsKKyAgZ2ludCBpLCBjZjsKKyAgZ2ludCB2aWRlb19hcmVhLCB3aWR0aCwgaGVpZ2h0OworICBndWludDMyICoqcGxhbmV0YWJsZSA9IGZpbHRlci0+cGxhbmV0YWJsZTsKKyAgZ2ludCBwbGFuZSA9IGZpbHRlci0+cGxhbmU7CisgIGd1aW50IHN0cmlkZV9tYXNrLCBzdHJpZGVfc2hpZnQsIHN0cmlkZTsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIHZpZGVvX2FyZWEgPSB3aWR0aCAqIGhlaWdodDsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgIGlmIChmaWx0ZXItPmZlZWRiYWNrKSB7CisgICAgc3RyaWRlX21hc2sgPSAweGZjZmNmY2ZjOworICAgIHN0cmlkZSA9IDg7CisgICAgc3RyaWRlX3NoaWZ0ID0gMjsKKyAgfSBlbHNlIHsKKyAgICBzdHJpZGVfbWFzayA9IDB4ZjhmOGY4Zjg7CisgICAgc3RyaWRlID0gNDsKKyAgICBzdHJpZGVfc2hpZnQgPSAzOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHZpZGVvX2FyZWE7IGkrKykgeworICAgIHBsYW5ldGFibGVbcGxhbmVdW2ldID0gKHNyY1tpXSAmIHN0cmlkZV9tYXNrKSA+PiBzdHJpZGVfc2hpZnQ7CisgIH0KKworICBjZiA9IHBsYW5lICYgKHN0cmlkZSAtIDEpOworICBpZiAoZmlsdGVyLT5mZWVkYmFjaykgeworICAgIGZvciAoaSA9IDA7IGkgPCB2aWRlb19hcmVhOyBpKyspIHsKKyAgICAgIGRlc3RbaV0gPSBwbGFuZXRhYmxlW2NmXVtpXQorICAgICAgICAgICsgcGxhbmV0YWJsZVtjZiArIHN0cmlkZV1baV0KKyAgICAgICAgICArIHBsYW5ldGFibGVbY2YgKyBzdHJpZGUgKiAyXVtpXQorICAgICAgICAgICsgcGxhbmV0YWJsZVtjZiArIHN0cmlkZSAqIDNdW2ldOworICAgICAgcGxhbmV0YWJsZVtwbGFuZV1baV0gPSAoZGVzdFtpXSAmIHN0cmlkZV9tYXNrKSA+PiBzdHJpZGVfc2hpZnQ7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCB2aWRlb19hcmVhOyBpKyspIHsKKyAgICAgIGRlc3RbaV0gPSBwbGFuZXRhYmxlW2NmXVtpXQorICAgICAgICAgICsgcGxhbmV0YWJsZVtjZiArIHN0cmlkZV1baV0KKyAgICAgICAgICArIHBsYW5ldGFibGVbY2YgKyBzdHJpZGUgKiAyXVtpXQorICAgICAgICAgICsgcGxhbmV0YWJsZVtjZiArIHN0cmlkZSAqIDNdW2ldCisgICAgICAgICAgKyBwbGFuZXRhYmxlW2NmICsgc3RyaWRlICogNF1baV0KKyAgICAgICAgICArIHBsYW5ldGFibGVbY2YgKyBzdHJpZGUgKiA1XVtpXQorICAgICAgICAgICsgcGxhbmV0YWJsZVtjZiArIHN0cmlkZSAqIDZdW2ldCisgICAgICAgICAgKyBwbGFuZXRhYmxlW2NmICsgc3RyaWRlICogN11baV07CisgICAgfQorICB9CisKKyAgcGxhbmUrKzsKKyAgZmlsdGVyLT5wbGFuZSA9IHBsYW5lICYgKFBMQU5FUyAtIDEpOworICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3N0cmVha3R2X3NldF9pbmZvIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsIEdzdENhcHMgKiBpbmNhcHMsCisgICAgR3N0VmlkZW9JbmZvICogaW5faW5mbywgR3N0Q2FwcyAqIG91dGNhcHMsIEdzdFZpZGVvSW5mbyAqIG91dF9pbmZvKQoreworICBHc3RTdHJlYWtUViAqZmlsdGVyID0gR1NUX1NUUkVBS1RWICh2ZmlsdGVyKTsKKyAgZ2ludCBpLCB3aWR0aCwgaGVpZ2h0OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKGluX2luZm8pOworICBoZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluX2luZm8pOworCisgIGdfZnJlZSAoZmlsdGVyLT5wbGFuZWJ1ZmZlcik7CisKKyAgZmlsdGVyLT5wbGFuZWJ1ZmZlciA9IGdfbmV3MCAoZ3VpbnQzMiwgd2lkdGggKiBoZWlnaHQgKiA0ICogUExBTkVTKTsKKworICBmb3IgKGkgPSAwOyBpIDwgUExBTkVTOyBpKyspCisgICAgZmlsdGVyLT5wbGFuZXRhYmxlW2ldID0gJmZpbHRlci0+cGxhbmVidWZmZXJbd2lkdGggKiBoZWlnaHQgKiBpXTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3RyZWFrdHZfc3RhcnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucykKK3sKKyAgR3N0U3RyZWFrVFYgKmZpbHRlciA9IEdTVF9TVFJFQUtUViAodHJhbnMpOworCisgIGZpbHRlci0+cGxhbmUgPSAwOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3N0cmVha3R2X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RTdHJlYWtUViAqZmlsdGVyID0gR1NUX1NUUkVBS1RWIChvYmplY3QpOworCisgIGlmIChmaWx0ZXItPnBsYW5lYnVmZmVyKSB7CisgICAgZ19mcmVlIChmaWx0ZXItPnBsYW5lYnVmZmVyKTsKKyAgICBmaWx0ZXItPnBsYW5lYnVmZmVyID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zdHJlYWt0dl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0U3RyZWFrVFYgKmZpbHRlciA9IEdTVF9TVFJFQUtUViAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfRkVFREJBQ0s6CisgICAgICBpZiAoR19VTkxJS0VMWSAoR1NUX1NUQVRFIChmaWx0ZXIpID49IEdTVF9TVEFURV9QQVVTRUQpKSB7CisgICAgICAgIGdfd2FybmluZyAoIkNoYW5naW5nIHRoZSBcImZlZWRiYWNrXCIgcHJvcGVydHkgb25seSBhbGxvd2VkICIKKyAgICAgICAgICAgICJpbiBzdGF0ZSA8IFBMQVlJTkciKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBmaWx0ZXItPmZlZWRiYWNrID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3N0cmVha3R2X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTdHJlYWtUViAqZmlsdGVyID0gR1NUX1NUUkVBS1RWIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9GRUVEQkFDSzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBmaWx0ZXItPmZlZWRiYWNrKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9zdHJlYWt0dl9jbGFzc19pbml0IChHc3RTdHJlYWtUVkNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqdHJhbnNfY2xhc3MgPSAoR3N0QmFzZVRyYW5zZm9ybUNsYXNzICopIGtsYXNzOworICBHc3RWaWRlb0ZpbHRlckNsYXNzICp2ZmlsdGVyX2NsYXNzID0gKEdzdFZpZGVvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3N0cmVha3R2X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3N0cmVha3R2X2dldF9wcm9wZXJ0eTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9zdHJlYWt0dl9maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0ZFRURCQUNLLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJmZWVkYmFjayIsICJGZWVkYmFjayIsCisgICAgICAgICAgIkZlZWRiYWNrIiwgREVGQVVMVF9GRUVEQkFDSywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiU3RyZWFrVFYgZWZmZWN0IiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJTdHJlYWtUViBtYWtlcyBhZnRlciBpbWFnZXMgb2YgbW92aW5nIG9iamVjdHMiLAorICAgICAgIkZVS1VDSEksIEtlbnRhcm91IDxmdWt1Y2hpQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4sICIKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc3RyZWFrdHZfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9zdHJlYWt0dl9zcmNfdGVtcGxhdGUpOworCisgIHRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3RyZWFrdHZfc3RhcnQpOworCisgIHZmaWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zdHJlYWt0dl9zZXRfaW5mbyk7CisgIHZmaWx0ZXJfY2xhc3MtPnRyYW5zZm9ybV9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3N0cmVha3R2X3RyYW5zZm9ybV9mcmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3RyZWFrdHZfaW5pdCAoR3N0U3RyZWFrVFYgKiBmaWx0ZXIpCit7CisgIGZpbHRlci0+ZmVlZGJhY2sgPSBERUZBVUxUX0ZFRURCQUNLOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0c3RyZWFrLmggYi9nc3QvZWZmZWN0di9nc3RzdHJlYWsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDkzNjJkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvZ3N0c3RyZWFrLmgKQEAgLTAsMCArMSw3NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBFZmZlY1RWIC0gUmVhbHRpbWUgRGlnaXRhbCBWaWRlbyBFZmZlY3RvcgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgRlVLVUNISSBLZW50YXJvCisgKgorICogU3RyZWFrVFYgLSBhZnRlcmltYWdlIGVmZmVjdG9yLgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgRlVLVUNISSBLZW50YXJvCisgKgorICogRWZmZWNUViBpcyBmcmVlIHNvZnR3YXJlLiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9TVFJFQUtfSF9fCisjZGVmaW5lIF9fR1NUX1NUUkVBS19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2ZpbHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfU1RSRUFLVFYgXAorICAoZ3N0X3N0cmVha3R2X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9TVFJFQUtUVihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1NUUkVBS1RWLEdzdFN0cmVha1RWKSkKKyNkZWZpbmUgR1NUX1NUUkVBS1RWX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1NUUkVBS1RWLEdzdFN0cmVha1RWQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfU1RSRUFLVFYob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9TVFJFQUtUVikpCisjZGVmaW5lIEdTVF9JU19TVFJFQUtUVl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9TVFJFQUtUVikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RTdHJlYWtUViBHc3RTdHJlYWtUVjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RTdHJlYWtUVkNsYXNzIEdzdFN0cmVha1RWQ2xhc3M7CisKKyNkZWZpbmUgUExBTkVTIDMyCisKK3N0cnVjdCBfR3N0U3RyZWFrVFYKK3sKKyAgR3N0VmlkZW9GaWx0ZXIgZWxlbWVudDsKKworICAvKiA8IHByaXZhdGUgPiAqLworICBnYm9vbGVhbiBmZWVkYmFjazsKKworICBndWludDMyICpwbGFuZWJ1ZmZlcjsKKyAgZ3VpbnQzMiAqcGxhbmV0YWJsZVtQTEFORVNdOworICBnaW50IHBsYW5lOworfTsKKworc3RydWN0IF9Hc3RTdHJlYWtUVkNsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3N0cmVha3R2X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1NUUkVBS19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYyBiL2dzdC9lZmZlY3R2L2dzdHZlcnRpZ28uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDlhN2QyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvZ3N0dmVydGlnby5jCkBAIC0wLDAgKzEsMzI3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogRWZmZWNUVjoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBGVUtVQ0hJIEtlbnRhcm91CisgKgorICogRWZmZWNUViBpcyBmcmVlIHNvZnR3YXJlLiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtdmVydGlnb3R2CisgKgorICogVmVydGlnb1RWIGlzIGEgbG9vcGJhY2sgYWxwaGEgYmxlbmRpbmcgZWZmZWN0b3Igd2l0aCByb3RhdGluZyBhbmQgc2NhbGluZy4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgdmlkZW90ZXN0c3JjICEgdmVydGlnb3R2ICEgdmlkZW9jb252ZXJ0ICEgYXV0b3ZpZGVvc2luaworICogXXwgVGhpcyBwaXBlbGluZSBzaG93cyB0aGUgZWZmZWN0IG9mIHZlcnRpZ290diBvbiBhIHRlc3Qgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3R2ZXJ0aWdvLmgiCisKKyNkZWZpbmUgZ3N0X3ZlcnRpZ290dl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RWZXJ0aWdvVFYsIGdzdF92ZXJ0aWdvdHYsIEdTVF9UWVBFX1ZJREVPX0ZJTFRFUik7CisKKy8qIEZpbHRlciBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9TUEVFRCwKKyAgUFJPUF9aT09NX1NQRUVECit9OworCisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorI2RlZmluZSBDQVBTX1NUUiBHU1RfVklERU9fQ0FQU19NQUtFICgieyBSR0J4LCBCR1J4IH0iKQorI2Vsc2UKKyNkZWZpbmUgQ0FQU19TVFIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgeFJHQiwgeEJHUiB9IikKKyNlbmRpZgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3ZlcnRpZ290dl9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoQ0FQU19TVFIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF92ZXJ0aWdvdHZfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKENBUFNfU1RSKQorICAgICk7CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZlcnRpZ290dl9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0VmVydGlnb1RWICpmaWx0ZXIgPSBHU1RfVkVSVElHT1RWICh2ZmlsdGVyKTsKKyAgZ2ludCBhcmVhLCB3aWR0aCwgaGVpZ2h0OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKGluX2luZm8pOworICBoZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKGluX2luZm8pOworCisgIGFyZWEgPSB3aWR0aCAqIGhlaWdodDsKKworICBnX2ZyZWUgKGZpbHRlci0+YnVmZmVyKTsKKyAgZmlsdGVyLT5idWZmZXIgPSAoZ3VpbnQzMiAqKSBnX21hbGxvYzAgKGFyZWEgKiAyICogc2l6ZW9mIChndWludDMyKSk7CisKKyAgZmlsdGVyLT5jdXJyZW50X2J1ZmZlciA9IGZpbHRlci0+YnVmZmVyOworICBmaWx0ZXItPmFsdF9idWZmZXIgPSBmaWx0ZXItPmJ1ZmZlciArIGFyZWE7CisgIGZpbHRlci0+cGhhc2UgPSAwOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZlcnRpZ290dl9zZXRfcGFybXMgKEdzdFZlcnRpZ29UViAqIGZpbHRlcikKK3sKKyAgZG91YmxlIHZ4LCB2eTsKKyAgZG91YmxlIHQ7CisgIGRvdWJsZSB4LCB5OworICBkb3VibGUgZGl6ejsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBHc3RWaWRlb0luZm8gKmluZm87CisKKyAgZGl6eiA9IHNpbiAoZmlsdGVyLT5waGFzZSkgKiAxMCArIHNpbiAoZmlsdGVyLT5waGFzZSAqIDEuOSArIDUpICogNTsKKworICBpbmZvID0gJkdTVF9WSURFT19GSUxURVIgKGZpbHRlciktPmluX2luZm87CisKKyAgd2lkdGggPSBHU1RfVklERU9fSU5GT19XSURUSCAoaW5mbyk7CisgIGhlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5mbyk7CisKKyAgeCA9IHdpZHRoIC8gMjsKKyAgeSA9IGhlaWdodCAvIDI7CisKKyAgdCA9ICh4ICogeCArIHkgKiB5KSAqIGZpbHRlci0+em9vbXJhdGU7CisKKyAgaWYgKHdpZHRoID4gaGVpZ2h0KSB7CisgICAgaWYgKGRpenogPj0gMCkgeworICAgICAgaWYgKGRpenogPiB4KQorICAgICAgICBkaXp6ID0geDsKKyAgICAgIHZ4ID0gKHggKiAoeCAtIGRpenopICsgeSAqIHkpIC8gdDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGRpenogPCAteCkKKyAgICAgICAgZGl6eiA9IC14OworICAgICAgdnggPSAoeCAqICh4ICsgZGl6eikgKyB5ICogeSkgLyB0OworICAgIH0KKyAgICB2eSA9IChkaXp6ICogeSkgLyB0OworICB9IGVsc2UgeworICAgIGlmIChkaXp6ID49IDApIHsKKyAgICAgIGlmIChkaXp6ID4geSkKKyAgICAgICAgZGl6eiA9IHk7CisgICAgICB2eCA9ICh4ICogeCArIHkgKiAoeSAtIGRpenopKSAvIHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChkaXp6IDwgLXkpCisgICAgICAgIGRpenogPSAteTsKKyAgICAgIHZ4ID0gKHggKiB4ICsgeSAqICh5ICsgZGl6eikpIC8gdDsKKyAgICB9CisgICAgdnkgPSAoZGl6eiAqIHgpIC8gdDsKKyAgfQorICBmaWx0ZXItPmR4ID0gdnggKiA2NTUzNjsKKyAgZmlsdGVyLT5keSA9IHZ5ICogNjU1MzY7CisgIGZpbHRlci0+c3ggPSAoLXZ4ICogeCArIHZ5ICogeSArIHggKyBjb3MgKGZpbHRlci0+cGhhc2UgKiA1KSAqIDIpICogNjU1MzY7CisgIGZpbHRlci0+c3kgPSAoLXZ4ICogeSAtIHZ5ICogeCArIHkgKyBzaW4gKGZpbHRlci0+cGhhc2UgKiA2KSAqIDIpICogNjU1MzY7CisKKyAgZmlsdGVyLT5waGFzZSArPSBmaWx0ZXItPnBoYXNlX2luY3JlbWVudDsKKyAgaWYgKGZpbHRlci0+cGhhc2UgPiA1NzAwMDAwKQorICAgIGZpbHRlci0+cGhhc2UgPSAwOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3ZlcnRpZ290dl90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwKKyAgICBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUpCit7CisgIEdzdFZlcnRpZ29UViAqZmlsdGVyID0gR1NUX1ZFUlRJR09UViAodmZpbHRlcik7CisgIGd1aW50MzIgKnNyYywgKmRlc3QsICpwOworICBndWludDMyIHY7CisgIGdpbnQgeCwgeSwgb3gsIG95LCBpLCB3aWR0aCwgaGVpZ2h0LCBhcmVhLCBzc3RyaWRlLCBkc3RyaWRlOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBzdHJlYW1fdGltZTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5fZnJhbWUtPmJ1ZmZlcik7CisgIHN0cmVhbV90aW1lID0KKyAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpLT5zZWdtZW50LAorICAgICAgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwgInN5bmMgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW1fdGltZSkpCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoZmlsdGVyKSwgc3RyZWFtX3RpbWUpOworCisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIHNzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMCk7CisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsKKyAgZHN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIGFyZWEgPSB3aWR0aCAqIGhlaWdodDsKKworICBzc3RyaWRlIC89IDQ7CisgIGRzdHJpZGUgLz0gNDsKKworICBnc3RfdmVydGlnb3R2X3NldF9wYXJtcyAoZmlsdGVyKTsKKyAgcCA9IGZpbHRlci0+YWx0X2J1ZmZlcjsKKworICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICBveCA9IGZpbHRlci0+c3g7CisgICAgb3kgPSBmaWx0ZXItPnN5OworCisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgIGkgPSAob3kgPj4gMTYpICogd2lkdGggKyAob3ggPj4gMTYpOworICAgICAgaWYgKGkgPCAwKQorICAgICAgICBpID0gMDsKKyAgICAgIGlmIChpID49IGFyZWEpCisgICAgICAgIGkgPSBhcmVhOworCisgICAgICB2ID0gZmlsdGVyLT5jdXJyZW50X2J1ZmZlcltpXSAmIDB4ZmNmY2ZmOworICAgICAgdiA9ICh2ICogMykgKyAoc3JjW3hdICYgMHhmY2ZjZmYpOworCisgICAgICAqcCsrID0gZGVzdFt4XSA9ICh2ID4+IDIpOworICAgICAgb3ggKz0gZmlsdGVyLT5keDsKKyAgICAgIG95ICs9IGZpbHRlci0+ZHk7CisgICAgfQorICAgIGZpbHRlci0+c3ggLT0gZmlsdGVyLT5keTsKKyAgICBmaWx0ZXItPnN5ICs9IGZpbHRlci0+ZHg7CisKKyAgICBzcmMgKz0gc3N0cmlkZTsKKyAgICBkZXN0ICs9IGRzdHJpZGU7CisgIH0KKworICBwID0gZmlsdGVyLT5jdXJyZW50X2J1ZmZlcjsKKyAgZmlsdGVyLT5jdXJyZW50X2J1ZmZlciA9IGZpbHRlci0+YWx0X2J1ZmZlcjsKKyAgZmlsdGVyLT5hbHRfYnVmZmVyID0gcDsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZlcnRpZ290dl9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICBHc3RWZXJ0aWdvVFYgKmZpbHRlciA9IEdTVF9WRVJUSUdPVFYgKHRyYW5zKTsKKworICBmaWx0ZXItPnBoYXNlID0gMC4wOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZlcnRpZ290dl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VmVydGlnb1RWICpmaWx0ZXIgPSBHU1RfVkVSVElHT1RWIChvYmplY3QpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZmlsdGVyKTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1NQRUVEOgorICAgICAgZmlsdGVyLT5waGFzZV9pbmNyZW1lbnQgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1pPT01fU1BFRUQ6CisgICAgICBmaWx0ZXItPnpvb21yYXRlID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoZmlsdGVyKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92ZXJ0aWdvdHZfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFZlcnRpZ29UViAqZmlsdGVyID0gR1NUX1ZFUlRJR09UViAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU1BFRUQ6CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIGZpbHRlci0+cGhhc2VfaW5jcmVtZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9aT09NX1NQRUVEOgorICAgICAgZ192YWx1ZV9zZXRfZmxvYXQgKHZhbHVlLCBmaWx0ZXItPnpvb21yYXRlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92ZXJ0aWdvdHZfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFZlcnRpZ29UViAqZmlsdGVyID0gR1NUX1ZFUlRJR09UViAob2JqZWN0KTsKKworICBnX2ZyZWUgKGZpbHRlci0+YnVmZmVyKTsKKyAgZmlsdGVyLT5idWZmZXIgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92ZXJ0aWdvdHZfY2xhc3NfaW5pdCAoR3N0VmVydGlnb1RWQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzICp0cmFuc19jbGFzcyA9IChHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKikga2xhc3M7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgKnZmaWx0ZXJfY2xhc3MgPSAoR3N0VmlkZW9GaWx0ZXJDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdmVydGlnb3R2X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3ZlcnRpZ290dl9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3ZlcnRpZ290dl9maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1NQRUVELAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgic3BlZWQiLCAiU3BlZWQiLCAiQ29udHJvbCB0aGUgc3BlZWQgb2YgbW92ZW1lbnQiLAorICAgICAgICAgIDAuMDEsIDEwMC4wLCAwLjAyLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9aT09NX1NQRUVELAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgiem9vbS1zcGVlZCIsICJab29tIFNwZWVkIiwKKyAgICAgICAgICAiQ29udHJvbCB0aGUgcmF0ZSBvZiB6b29taW5nIiwgMS4wMSwgMS4xLCAxLjAxLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJWZXJ0aWdvVFYgZWZmZWN0IiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJBIGxvb3BiYWNrIGFscGhhIGJsZW5kaW5nIGVmZmVjdG9yIHdpdGggcm90YXRpbmcgYW5kIHNjYWxpbmciLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5iZT4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfdmVydGlnb3R2X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfdmVydGlnb3R2X3NyY190ZW1wbGF0ZSk7CisKKyAgdHJhbnNfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92ZXJ0aWdvdHZfc3RhcnQpOworCisgIHZmaWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92ZXJ0aWdvdHZfc2V0X2luZm8pOworICB2ZmlsdGVyX2NsYXNzLT50cmFuc2Zvcm1fZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92ZXJ0aWdvdHZfdHJhbnNmb3JtX2ZyYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92ZXJ0aWdvdHZfaW5pdCAoR3N0VmVydGlnb1RWICogZmlsdGVyKQoreworICBmaWx0ZXItPmJ1ZmZlciA9IE5VTEw7CisgIGZpbHRlci0+cGhhc2UgPSAwLjA7CisgIGZpbHRlci0+cGhhc2VfaW5jcmVtZW50ID0gMC4wMjsKKyAgZmlsdGVyLT56b29tcmF0ZSA9IDEuMDE7Cit9CmRpZmYgLS1naXQgYS9nc3QvZWZmZWN0di9nc3R2ZXJ0aWdvLmggYi9nc3QvZWZmZWN0di9nc3R2ZXJ0aWdvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljMjI1YgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lZmZlY3R2L2dzdHZlcnRpZ28uaApAQCAtMCwwICsxLDcxIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogRWZmZWNUVjoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBGVUtVQ0hJIEtlbnRhcm91CisgKgorICogRWZmZWNUViBpcyBmcmVlIHNvZnR3YXJlLiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9WRVJUSUdPX0hfXworI2RlZmluZSBfX0dTVF9WRVJUSUdPX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WRVJUSUdPVFYgXAorICAoZ3N0X3ZlcnRpZ290dl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfVkVSVElHT1RWKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVkVSVElHT1RWLEdzdFZlcnRpZ29UVikpCisjZGVmaW5lIEdTVF9WRVJUSUdPVFZfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVkVSVElHT1RWLEdzdFZlcnRpZ29UVkNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1ZFUlRJR09UVihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1ZFUlRJR09UVikpCisjZGVmaW5lIEdTVF9JU19WRVJUSUdPVFZfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVkVSVElHT1RWKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZlcnRpZ29UViBHc3RWZXJ0aWdvVFY7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VmVydGlnb1RWQ2xhc3MgR3N0VmVydGlnb1RWQ2xhc3M7CisKK3N0cnVjdCBfR3N0VmVydGlnb1RWCit7CisgIEdzdFZpZGVvRmlsdGVyIHZpZGVvZmlsdGVyOworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIGd1aW50MzIgKmJ1ZmZlcjsKKyAgZ3VpbnQzMiAqY3VycmVudF9idWZmZXIsICphbHRfYnVmZmVyOworICBnaW50IGR4LCBkeTsKKyAgZ2ludCBzeCwgc3k7CisgIGdkb3VibGUgcGhhc2U7CisgIGdkb3VibGUgcGhhc2VfaW5jcmVtZW50OworICBnZG91YmxlIHpvb21yYXRlOworfTsKKworc3RydWN0IF9Hc3RWZXJ0aWdvVFZDbGFzcworeworICBHc3RWaWRlb0ZpbHRlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF92ZXJ0aWdvdHZfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfVkVSVElHT19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9lZmZlY3R2L2dzdHdhcnAuYyBiL2dzdC9lZmZlY3R2L2dzdHdhcnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDFlZDhjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvZ3N0d2FycC5jCkBAIC0wLDAgKzEsMjY2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBFZmZlY1RWIC0gUmVhbHRpbWUgRGlnaXRhbCBWaWRlbyBFZmZlY3RvcgorICogQ29weXJpZ2h0IChDKSAyMDAxIEZVS1VDSEkgS2VudGFyb3UKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyAocHJvYmFibHkpIGdlbmVyYXRlZCBmcm9tIGdzdHZpZGVvdGVtcGxhdGUuYywKKyAqIGdzdHZpZGVvdGVtcGxhdGUuYyx2IDEuMTEgMjAwNC8wMS8wNyAwODo1Njo0NSBkcyBFeHAgCisgKi8KKworLyogRnJvbSBtYWluLmMgb2Ygd2FycC0xLjE6CisgKgorICogICAgICBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIgZGVtbworICogICAgICBSZWFsdGltZSBwaWN0dXJlICdnb29pbmcnCisgKiAgICAgIGJ5IHNhbSBsYW50aW5nYSBzbG91a2VuQGRldm9sdXRpb24uY29tCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtd2FycHR2CisgKgorICogV2FycFRWIGRvZXMgcmVhbHRpbWUgZ29vJ2luZyBvZiB0aGUgdmlkZW8gaW5wdXQuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIHdhcnB0diAhIHZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgc2hvd3MgdGhlIGVmZmVjdCBvZiB3YXJwdHYgb24gYSB0ZXN0IHN0cmVhbS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZ3N0d2FycC5oIgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb21ldGEuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9wb29sLmg+CisKKyNpZm5kZWYgTV9QSQorI2RlZmluZSBNX1BJICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKKyNlbmRpZgorCisjZGVmaW5lIGdzdF93YXJwdHZfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0V2FycFRWLCBnc3Rfd2FycHR2LCBHU1RfVFlQRV9WSURFT19GSUxURVIpOworCitzdGF0aWMgdm9pZCBpbml0U2luVGFibGUgKCk7CitzdGF0aWMgdm9pZCBpbml0RGlzdFRhYmxlIChHc3RXYXJwVFYgKiBmaWx0ZXIsIGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0KTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF93YXJwdHZfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IFJHQngsIHhSR0IsIEJHUngsIHhCR1IgfSIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3Rfd2FycHR2X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBSR0J4LCB4UkdCLCBCR1J4LCB4QkdSIH0iKSkKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXJwdHZfc2V0X2luZm8gKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwgR3N0Q2FwcyAqIGluY2FwcywKKyAgICBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLCBHc3RDYXBzICogb3V0Y2FwcywgR3N0VmlkZW9JbmZvICogb3V0X2luZm8pCit7CisgIEdzdFdhcnBUViAqZmlsdGVyID0gR1NUX1dBUlBUViAodmZpbHRlcik7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKworICB3aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIIChpbl9pbmZvKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbl9pbmZvKTsKKworICBnX2ZyZWUgKGZpbHRlci0+ZGlzdHRhYmxlKTsKKyAgZmlsdGVyLT5kaXN0dGFibGUgPSBnX21hbGxvYyAod2lkdGggKiBoZWlnaHQgKiBzaXplb2YgKGd1aW50MzIpKTsKKyAgaW5pdERpc3RUYWJsZSAoZmlsdGVyLCB3aWR0aCwgaGVpZ2h0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdpbnQzMiBzaW50YWJsZVsxMDI0ICsgMjU2XTsKKworc3RhdGljIHZvaWQKK2luaXRTaW5UYWJsZSAodm9pZCkKK3sKKyAgZ2ludDMyICp0cHRyLCAqdHNpbnB0cjsKKyAgZ2ludCBpOworCisgIHRzaW5wdHIgPSB0cHRyID0gc2ludGFibGU7CisKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICAqdHB0cisrID0gKGludCkgKHNpbiAoaSAqIE1fUEkgLyA1MTIpICogMzI3NjcpOworCisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAqdHB0cisrID0gKnRzaW5wdHIrKzsKK30KKworc3RhdGljIHZvaWQKK2luaXREaXN0VGFibGUgKEdzdFdhcnBUViAqIGZpbHRlciwgZ2ludCB3aWR0aCwgZ2ludCBoZWlnaHQpCit7CisgIGdpbnQzMiBoYWxmdywgaGFsZmgsICpkaXN0cHRyOworICBnaW50IHgsIHk7CisgIGZsb2F0IG07CisKKyAgaGFsZncgPSB3aWR0aCA+PiAxOworICBoYWxmaCA9IGhlaWdodCA+PiAxOworCisgIGRpc3RwdHIgPSBmaWx0ZXItPmRpc3R0YWJsZTsKKworICBtID0gc3FydCAoKGRvdWJsZSkgKGhhbGZ3ICogaGFsZncgKyBoYWxmaCAqIGhhbGZoKSk7CisKKyAgZm9yICh5ID0gLWhhbGZoOyB5IDwgaGFsZmg7IHkrKykKKyAgICBmb3IgKHggPSAtaGFsZnc7IHggPCBoYWxmdzsgeCsrKQorI2lmZGVmIFBTMgorICAgICAgKmRpc3RwdHIrKyA9ICgoaW50KSAoKHNxcnRmICh4ICogeCArIHkgKiB5KSAqIDUxMS45OTk5KSAvIG0pKSA8PCAxOworI2Vsc2UKKyAgICAgICpkaXN0cHRyKysgPSAoKGludCkgKChzcXJ0ICh4ICogeCArIHkgKiB5KSAqIDUxMS45OTk5KSAvIG0pKSA8PCAxOworI2VuZGlmCit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfd2FycHR2X3RyYW5zZm9ybV9mcmFtZSAoR3N0VmlkZW9GaWx0ZXIgKiBmaWx0ZXIsIEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lKQoreworICBHc3RXYXJwVFYgKndhcnB0diA9IEdTVF9XQVJQVFYgKGZpbHRlcik7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCB4dywgeXcsIGN3OworICBnaW50MzIgYywgaSwgeCwgeSwgZHgsIGR5LCBtYXh4LCBtYXh5OworICBnaW50MzIgKmN0cHRyLCAqZGlzdHB0cjsKKyAgZ2ludDMyICpjdGFibGU7CisgIGd1aW50MzIgKnNyYywgKmRlc3Q7CisgIGdpbnQgc3N0cmlkZSwgZHN0cmlkZTsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgc3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGluX2ZyYW1lLCAwKTsKKyAgZHN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dF9mcmFtZSwgMCk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAod2FycHR2KTsKKyAgeHcgPSAoZ2ludCkgKHNpbiAoKHdhcnB0di0+dHZhbCArIDEwMCkgKiBNX1BJIC8gMTI4KSAqIDMwKTsKKyAgeXcgPSAoZ2ludCkgKHNpbiAoKHdhcnB0di0+dHZhbCkgKiBNX1BJIC8gMjU2KSAqIC0zNSk7CisgIGN3ID0gKGdpbnQpIChzaW4gKCh3YXJwdHYtPnR2YWwgLSA3MCkgKiBNX1BJIC8gNjQpICogNTApOworICB4dyArPSAoZ2ludCkgKHNpbiAoKHdhcnB0di0+dHZhbCAtIDEwKSAqIE1fUEkgLyA1MTIpICogNDApOworICB5dyArPSAoZ2ludCkgKHNpbiAoKHdhcnB0di0+dHZhbCArIDMwKSAqIE1fUEkgLyA1MTIpICogNDApOworCisgIGN0cHRyID0gd2FycHR2LT5jdGFibGU7CisgIGRpc3RwdHIgPSB3YXJwdHYtPmRpc3R0YWJsZTsKKyAgY3RhYmxlID0gd2FycHR2LT5jdGFibGU7CisKKyAgYyA9IDA7CisKKyAgZm9yICh4ID0gMDsgeCA8IDUxMjsgeCsrKSB7CisgICAgaSA9IChjID4+IDMpICYgMHgzRkU7CisgICAgKmN0cHRyKysgPSAoKHNpbnRhYmxlW2ldICogeXcpID4+IDE1KTsKKyAgICAqY3RwdHIrKyA9ICgoc2ludGFibGVbaSArIDI1Nl0gKiB4dykgPj4gMTUpOworICAgIGMgKz0gY3c7CisgIH0KKyAgbWF4eCA9IHdpZHRoIC0gMjsKKyAgbWF4eSA9IGhlaWdodCAtIDI7CisKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodCAtIDE7IHkrKykgeworICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICBpID0gKmRpc3RwdHIrKzsKKyAgICAgIGR4ID0gY3RhYmxlW2kgKyAxXSArIHg7CisgICAgICBkeSA9IGN0YWJsZVtpXSArIHk7CisKKyAgICAgIGlmIChkeCA8IDApCisgICAgICAgIGR4ID0gMDsKKyAgICAgIGVsc2UgaWYgKGR4ID4gbWF4eCkKKyAgICAgICAgZHggPSBtYXh4OworCisgICAgICBpZiAoZHkgPCAwKQorICAgICAgICBkeSA9IDA7CisgICAgICBlbHNlIGlmIChkeSA+IG1heHkpCisgICAgICAgIGR5ID0gbWF4eTsKKworICAgICAgZGVzdFt4XSA9IHNyY1tkeSAqIHNzdHJpZGUgLyA0ICsgZHhdOworICAgIH0KKyAgICBkZXN0ICs9IGRzdHJpZGUgLyA0OworICB9CisKKyAgd2FycHR2LT50dmFsID0gKHdhcnB0di0+dHZhbCArIDEpICYgNTExOworICBHU1RfT0JKRUNUX1VOTE9DSyAod2FycHR2KTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhcnB0dl9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICBHc3RXYXJwVFYgKndhcnB0diA9IEdTVF9XQVJQVFYgKHRyYW5zKTsKKworICB3YXJwdHYtPnR2YWwgPSAwOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3dhcnB0dl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0V2FycFRWICp3YXJwdHYgPSBHU1RfV0FSUFRWIChvYmplY3QpOworCisgIGdfZnJlZSAod2FycHR2LT5kaXN0dGFibGUpOworICB3YXJwdHYtPmRpc3R0YWJsZSA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3dhcnB0dl9jbGFzc19pbml0IChHc3RXYXJwVFZDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3dhcnB0dl9maW5hbGl6ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiV2FycFRWIGVmZmVjdCIsCisgICAgICAiRmlsdGVyL0VmZmVjdC9WaWRlbyIsCisgICAgICAiV2FycFRWIGRvZXMgcmVhbHRpbWUgZ29vJ2luZyBvZiB0aGUgdmlkZW8gaW5wdXQiLAorICAgICAgIlNhbSBMYW50aW5nYSA8c2xvdWtlbkBkZXZvbHV0aW9uLmNvbT4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfd2FycHR2X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfd2FycHR2X3NyY190ZW1wbGF0ZSk7CisKKyAgdHJhbnNfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXJwdHZfc3RhcnQpOworCisgIHZmaWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXJwdHZfc2V0X2luZm8pOworICB2ZmlsdGVyX2NsYXNzLT50cmFuc2Zvcm1fZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXJwdHZfdHJhbnNmb3JtX2ZyYW1lKTsKKworICBpbml0U2luVGFibGUgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2FycHR2X2luaXQgKEdzdFdhcnBUViAqIHdhcnB0dikKK3sKKyAgLyogbm90aGluZyB0byBkbyAqLworfQpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvZ3N0d2FycC5oIGIvZ3N0L2VmZmVjdHYvZ3N0d2FycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZWVlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZWZmZWN0di9nc3R3YXJwLmgKQEAgLTAsMCArMSw2NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogRWZmZWNUViAtIFJlYWx0aW1lIERpZ2l0YWwgVmlkZW8gRWZmZWN0b3IKKyAqIENvcHlyaWdodCAoQykgMjAwMSBGVUtVQ0hJIEtlbnRhcm91CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9XQVJQX0hfXworI2RlZmluZSBfX0dTVF9XQVJQX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9XQVJQVFYgXAorICAoZ3N0X3dhcnB0dl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfV0FSUFRWKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfV0FSUFRWLEdzdFdhcnBUVikpCisjZGVmaW5lIEdTVF9XQVJQVFZfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfV0FSUFRWLEdzdFdhcnBUVkNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1dBUlBUVihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1dBUlBUVikpCisjZGVmaW5lIEdTVF9JU19XQVJQVFZfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfV0FSUFRWKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFdhcnBUViBHc3RXYXJwVFY7Cit0eXBlZGVmIHN0cnVjdCBfR3N0V2FycFRWQ2xhc3MgR3N0V2FycFRWQ2xhc3M7CisKK3N0cnVjdCBfR3N0V2FycFRWCit7CisgIEdzdFZpZGVvRmlsdGVyIHZpZGVvZmlsdGVyOworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIGdpbnQzMiAqZGlzdHRhYmxlOworICBnaW50MzIgY3RhYmxlWzEwMjRdOworICBnaW50IHR2YWw7Cit9OworCitzdHJ1Y3QgX0dzdFdhcnBUVkNsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3dhcnB0dl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9XQVJQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2VmZmVjdHYvbWVzb24uYnVpbGQgYi9nc3QvZWZmZWN0di9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWQ5N2UwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VmZmVjdHYvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxNCBAQAorZWZmZWN0X3NvdXJjZXMgPSBbCisgICdnc3RlZmZlY3R2LmMnLCAnZ3N0ZWRnZS5jJywgJ2dzdGFnaW5nLmMnLCAnZ3N0ZGljZS5jJywgJ2dzdHdhcnAuYycsCisgICdnc3RzaGFnYWRlbGljLmMnLCAnZ3N0dmVydGlnby5jJywgJ2dzdHJldi5jJywgJ2dzdHF1YXJrLmMnLCAnZ3N0b3AuYycsCisgICdnc3RyYWRpb2FjLmMnLCAnZ3N0c3RyZWFrLmMnLCAnZ3N0cmlwcGxlLmMnCitdCisKK2dzdGVmZmVjdHYgPSBsaWJyYXJ5KCdnc3RlZmZlY3R2JywKKyAgZWZmZWN0X3NvdXJjZXMsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0X2RlcCwgZ3N0YmFzZV9kZXAsIGdzdHZpZGVvX2RlcCwgbGlibV0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvZXF1YWxpemVyLy5naXRpZ25vcmUgYi9nc3QvZXF1YWxpemVyLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0OWI2NwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lcXVhbGl6ZXIvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACitkZW1vCmRpZmYgLS1naXQgYS9nc3QvZXF1YWxpemVyL0dzdElpckVxdWFsaXplcjEwQmFuZHMucHJzIGIvZ3N0L2VxdWFsaXplci9Hc3RJaXJFcXVhbGl6ZXIxMEJhbmRzLnBycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjI2MWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VxdWFsaXplci9Hc3RJaXJFcXVhbGl6ZXIxMEJhbmRzLnBycwpAQCAtMCwwICsxLDE3NCBAQAorW19wcmVzZXRzX10KK3ZlcnNpb249MC4xMAorZWxlbWVudC1uYW1lPUdzdElpckVxdWFsaXplcjEwQmFuZHMKKworW2JhbGxhZF0KK2JhbmQwPTQKK2JhbmQxPTMuNzUKK2JhbmQyPTIuNQorYmFuZDM9MAorYmFuZDQ9LTQKK2JhbmQ1PS02CitiYW5kNj0tMworYmFuZDc9MAorYmFuZDg9Mi41CitiYW5kOT05CisKK1tjbGFzc2ljXQorYmFuZDA9MAorYmFuZDE9MAorYmFuZDI9MAorYmFuZDM9MAorYmFuZDQ9MAorYmFuZDU9MAorYmFuZDY9LTYKK2JhbmQ3PS03CitiYW5kOD0tNworYmFuZDk9LTkuNQorCitbY2x1Yl0KK2JhbmQwPTAKK2JhbmQxPTAKK2JhbmQyPTgKK2JhbmQzPTYKK2JhbmQ0PTUuNQorYmFuZDU9NQorYmFuZDY9MworYmFuZDc9MAorYmFuZDg9MAorYmFuZDk9MAorCitbZGFuY2VdCitiYW5kMD05LjYKK2JhbmQxPTcKK2JhbmQyPTIuNQorYmFuZDM9MAorYmFuZDQ9MAorYmFuZDU9LTUuNgorYmFuZDY9LTcKK2JhbmQ3PS03CitiYW5kOD0wCitiYW5kOT0wCisKK1twb3BdCitiYW5kMD0tMS42CitiYW5kMT00LjUKK2JhbmQyPTcKK2JhbmQzPTgKK2JhbmQ0PTUuNgorYmFuZDU9MAorYmFuZDY9LTIuNQorYmFuZDc9LTIKK2JhbmQ4PS0xLjYKK2JhbmQ5PS0xLjUKKworW3JlZ2dhZV0KK2JhbmQwPTAKK2JhbmQxPTAKK2JhbmQyPTAKK2JhbmQzPS01LjUKK2JhbmQ0PTAKK2JhbmQ1PTYuNQorYmFuZDY9Ni41CitiYW5kNz0wCitiYW5kOD0wCitiYW5kOT0wCisKK1tyb2NrXQorYmFuZDA9OAorYmFuZDE9NQorYmFuZDI9LTUuNQorYmFuZDM9LTgKK2JhbmQ0PS0zCitiYW5kNT00CitiYW5kNj04CitiYW5kNz0xMQorYmFuZDg9MTEKK2JhbmQ5PTExLjUKKworW3NrYV0KK2JhbmQwPS0yLjUKK2JhbmQxPS01CitiYW5kMj0tNAorYmFuZDM9MAorYmFuZDQ9NAorYmFuZDU9NS41CitiYW5kNj04CitiYW5kNz05CitiYW5kOD0xMQorYmFuZDk9OQorCitbc29mdF0KK2JhbmQwPTUKK2JhbmQxPTEuNQorYmFuZDI9MAorYmFuZDM9LTIuNQorYmFuZDQ9MAorYmFuZDU9NAorYmFuZDY9OAorYmFuZDc9OQorYmFuZDg9MTEKK2JhbmQ5PTEyCisKK1t0ZWNobm9dCitiYW5kMD04CitiYW5kMT01LjUKK2JhbmQyPTAKK2JhbmQzPS01LjUKK2JhbmQ0PS01CitiYW5kNT0wCitiYW5kNj04CitiYW5kNz0xMAorYmFuZDg9MTAKK2JhbmQ5PTkKKworCitbcGFydHldCitiYW5kMD03CitiYW5kMT03CitiYW5kMj0wCitiYW5kMz0wCitiYW5kND0wCitiYW5kNT0wCitiYW5kNj0wCitiYW5kNz0wCitiYW5kOD03CitiYW5kOT03CisKKworW21vcmUgYmFzc10KK2JhbmQwPS04CitiYW5kMT0xMAorYmFuZDI9MTAKK2JhbmQzPTUuNQorYmFuZDQ9MS41CitiYW5kNT0tNAorYmFuZDY9LTgKK2JhbmQ3PS0xMAorYmFuZDg9LTExCitiYW5kOT0tMTEKKworW21vcmUgYmFzcyBhbmQgdHJlYmxlXQorYmFuZDA9OAorYmFuZDE9NS41CitiYW5kMj0wCitiYW5kMz0tNworYmFuZDQ9LTUKK2JhbmQ1PTEuNQorYmFuZDY9OAorYmFuZDc9MTEuMgorYmFuZDg9MTIKK2JhbmQ5PTEyCisKK1ttb3JlIHRyZWJsZV0KK2JhbmQwPS0xMAorYmFuZDE9LTEwCitiYW5kMj0tMTAKK2JhbmQzPS00CitiYW5kND0yLjUKK2JhbmQ1PTExCitiYW5kNj0xNgorYmFuZDc9MTYKK2JhbmQ4PTE2CitiYW5kOT0xOAorCmRpZmYgLS1naXQgYS9nc3QvZXF1YWxpemVyL0dzdElpckVxdWFsaXplcjNCYW5kcy5wcnMgYi9nc3QvZXF1YWxpemVyL0dzdElpckVxdWFsaXplcjNCYW5kcy5wcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4ZWY1YQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lcXVhbGl6ZXIvR3N0SWlyRXF1YWxpemVyM0JhbmRzLnBycwpAQCAtMCwwICsxLDE0IEBACitbX3ByZXNldHNfXQordmVyc2lvbj0wLjEwCitlbGVtZW50LW5hbWU9R3N0SWlyRXF1YWxpemVyM0JhbmRzCisKK1ttb3JlIGJhc3NdCitiYW5kMD03Ljc1CitiYW5kMT0wCitiYW5kMj0wCisKK1ttb3JlIHRyZWJibGVdCitiYW5kMD0wCitiYW5kMT0wCitiYW5kMj02LjAKKwpkaWZmIC0tZ2l0IGEvZ3N0L2VxdWFsaXplci9NYWtlZmlsZS5hbSBiL2dzdC9lcXVhbGl6ZXIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1OWY3NAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lcXVhbGl6ZXIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyMSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0ZXF1YWxpemVyLmxhCisKK2xpYmdzdGVxdWFsaXplcl9sYV9TT1VSQ0VTID0gXAorICAgICAgICBnc3RpaXJlcXVhbGl6ZXIuYyBnc3RpaXJlcXVhbGl6ZXIuaCBcCisgICAgICAgIGdzdGlpcmVxdWFsaXplcm5iYW5kcy5jIGdzdGlpcmVxdWFsaXplcm5iYW5kcy5oIFwKKyAgICAgICAgZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmMgZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmggXAorICAgICAgICBnc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmMgZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5oCisKK2xpYmdzdGVxdWFsaXplcl9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgXAorCSQoR1NUX0NGTEFHUykKK2xpYmdzdGVxdWFsaXplcl9sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgXAorCS1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0JBU0VfTElCUykgXAorCSQoR1NUX0xJQlMpICQoTElCTSkKK2xpYmdzdGVxdWFsaXplcl9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0aWlyZXF1YWxpemVyLmgKKworcHJlc2V0ZGlyID0gJChkYXRhZGlyKS9nc3RyZWFtZXItJChHU1RfQVBJX1ZFUlNJT04pL3ByZXNldHMKK3ByZXNldF9EQVRBID0gR3N0SWlyRXF1YWxpemVyM0JhbmRzLnBycyBHc3RJaXJFcXVhbGl6ZXIxMEJhbmRzLnBycworCitFWFRSQV9ESVNUID0gJChwcmVzZXRfREFUQSkKZGlmZiAtLWdpdCBhL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmMgYi9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMDI5NmIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5jCkBAIC0wLDAgKzEsOTE5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDQ+IEJlbmphbWluIE90dGUgPG90dGVAZ25vbWUub3JnPgorICogICAgICAgICAgICAgICA8MjAwNz4gU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICogICAgICAgICAgICAgICA8MjAwNz4gU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0aWlyZXF1YWxpemVyLmgiCisjaW5jbHVkZSAiZ3N0aWlyZXF1YWxpemVybmJhbmRzLmgiCisjaW5jbHVkZSAiZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmgiCisjaW5jbHVkZSAiZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5oIgorCisjaW5jbHVkZSAiZ3N0L2dsaWItY29tcGF0LXByaXZhdGUuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZIChlcXVhbGl6ZXJfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZXF1YWxpemVyX2RlYnVnCisKKyNkZWZpbmUgQkFORFNfTE9DSyhlcXUpIGdfbXV0ZXhfbG9jaygmZXF1LT5iYW5kc19sb2NrKQorI2RlZmluZSBCQU5EU19VTkxPQ0soZXF1KSBnX211dGV4X3VubG9jaygmZXF1LT5iYW5kc19sb2NrKQorCitzdGF0aWMgdm9pZCBnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9pbnRlcmZhY2VfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwKKyAgICBncG9pbnRlciBpZmFjZV9kYXRhKTsKKworc3RhdGljIHZvaWQgZ3N0X2lpcl9lcXVhbGl6ZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2lpcl9lcXVhbGl6ZXJfc2V0dXAgKEdzdEF1ZGlvRmlsdGVyICogZmlsdGVyLAorICAgIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2lpcl9lcXVhbGl6ZXJfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogYnRyYW5zLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CitzdGF0aWMgdm9pZCBzZXRfcGFzc3Rocm91Z2ggKEdzdElpckVxdWFsaXplciAqIGVxdSk7CisKKyNkZWZpbmUgQUxMT1dFRF9DQVBTIFwKKyAgICAiYXVkaW8veC1yYXcsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIGZvcm1hdD0oc3RyaW5nKSB7IkdTVF9BVURJT19ORShTMTYpIiwiR1NUX0FVRElPX05FKEYzMikiLCIgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdTVF9BVURJT19ORShGNjQpIiB9LCAiICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIHJhdGU9KGludClbMTAwMCxNQVhdLCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIGNoYW5uZWxzPShpbnQpWzEsTUFYXSwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkIgorCisjZGVmaW5lIGdzdF9paXJfZXF1YWxpemVyX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RJaXJFcXVhbGl6ZXIsIGdzdF9paXJfZXF1YWxpemVyLAorICAgIEdTVF9UWVBFX0FVRElPX0ZJTFRFUiwKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX0NISUxEX1BST1hZLAorICAgICAgICBnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9pbnRlcmZhY2VfaW5pdCkKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1BSRVNFVCwgTlVMTCkpOworCisKKy8qIGNoaWxkIG9iamVjdCAqLworCitlbnVtCit7CisgIFBST1BfR0FJTiA9IDEsCisgIFBST1BfRlJFUSwKKyAgUFJPUF9CQU5EV0lEVEgsCisgIFBST1BfVFlQRQorfTsKKwordHlwZWRlZiBlbnVtCit7CisgIEJBTkRfVFlQRV9QRUFLID0gMCwKKyAgQkFORF9UWVBFX0xPV19TSEVMRiwKKyAgQkFORF9UWVBFX0hJR0hfU0hFTEYKK30gR3N0SWlyRXF1YWxpemVyQmFuZFR5cGU7CisKKyNkZWZpbmUgR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl9CQU5EX1RZUEUgKGdzdF9paXJfZXF1YWxpemVyX2JhbmRfdHlwZV9nZXRfdHlwZSAoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF90eXBlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZ3R5cGUgPSAwOworCisgIGlmIChndHlwZSA9PSAwKSB7CisgICAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAgICB7QkFORF9UWVBFX1BFQUssICJQZWFrIGZpbHRlciAoZGVmYXVsdCBmb3IgaW5uZXIgYmFuZHMpIiwgInBlYWsifSwKKyAgICAgIHtCQU5EX1RZUEVfTE9XX1NIRUxGLCAiTG93IHNoZWxmIGZpbHRlciAoZGVmYXVsdCBmb3IgZmlyc3QgYmFuZCkiLAorICAgICAgICAgICJsb3ctc2hlbGYifSwKKyAgICAgIHtCQU5EX1RZUEVfSElHSF9TSEVMRiwgIkhpZ2ggc2hlbGYgZmlsdGVyIChkZWZhdWx0IGZvciBsYXN0IGJhbmQpIiwKKyAgICAgICAgICAiaGlnaC1zaGVsZiJ9LAorICAgICAgezAsIE5VTEwsIE5VTEx9CisgICAgfTsKKworICAgIGd0eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdElpckVxdWFsaXplckJhbmRUeXBlIiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gZ3R5cGU7Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdElpckVxdWFsaXplckJhbmRDbGFzcyBHc3RJaXJFcXVhbGl6ZXJCYW5kQ2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl9CQU5EIFwKKyAgKGdzdF9paXJfZXF1YWxpemVyX2JhbmRfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0lJUl9FUVVBTElaRVJfQkFORChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfQkFORCxHc3RJaXJFcXVhbGl6ZXJCYW5kKSkKKyNkZWZpbmUgR1NUX0lJUl9FUVVBTElaRVJfQkFORF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9JSVJfRVFVQUxJWkVSX0JBTkQsR3N0SWlyRXF1YWxpemVyQmFuZENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0lJUl9FUVVBTElaRVJfQkFORChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfQkFORCkpCisjZGVmaW5lIEdTVF9JU19JSVJfRVFVQUxJWkVSX0JBTkRfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl9CQU5EKSkKKworc3RydWN0IF9Hc3RJaXJFcXVhbGl6ZXJCYW5kCit7CisgIEdzdE9iamVjdCBvYmplY3Q7CisKKyAgLyo8IHByaXZhdGUgPiAqLworICAvKiBjZW50ZXIgZnJlcXVlbmN5IGFuZCBnYWluICovCisgIGdkb3VibGUgZnJlcTsKKyAgZ2RvdWJsZSBnYWluOworICBnZG91YmxlIHdpZHRoOworICBHc3RJaXJFcXVhbGl6ZXJCYW5kVHlwZSB0eXBlOworCisgIC8qIHNlY29uZCBvcmRlciBpaXIgZmlsdGVyICovCisgIGdkb3VibGUgYjEsIGIyOyAgICAgICAgICAgICAgIC8qIElJUiBjb2VmZmljaWVudHMgZm9yIG91dHB1dHMgKi8KKyAgZ2RvdWJsZSBhMCwgYTEsIGEyOyAgICAgICAgICAgLyogSUlSIGNvZWZmaWNpZW50cyBmb3IgaW5wdXRzICovCit9OworCitzdHJ1Y3QgX0dzdElpckVxdWFsaXplckJhbmRDbGFzcworeworICBHc3RPYmplY3RDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitzdGF0aWMgR1R5cGUgZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9nZXRfdHlwZSAodm9pZCk7CisKK3N0YXRpYyB2b2lkCitnc3RfaWlyX2VxdWFsaXplcl9iYW5kX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RJaXJFcXVhbGl6ZXJCYW5kICpiYW5kID0gR1NUX0lJUl9FUVVBTElaRVJfQkFORCAob2JqZWN0KTsKKyAgR3N0SWlyRXF1YWxpemVyICplcXUgPQorICAgICAgR1NUX0lJUl9FUVVBTElaRVIgKGdzdF9vYmplY3RfZ2V0X3BhcmVudCAoR1NUX09CSkVDVCAoYmFuZCkpKTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfR0FJTjp7CisgICAgICBnZG91YmxlIGdhaW47CisKKyAgICAgIGdhaW4gPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhbmQsICJnYWluID0gJWxmIC0+ICVsZiIsIGJhbmQtPmdhaW4sIGdhaW4pOworICAgICAgaWYgKGdhaW4gIT0gYmFuZC0+Z2FpbikgeworICAgICAgICBCQU5EU19MT0NLIChlcXUpOworICAgICAgICBlcXUtPm5lZWRfbmV3X2NvZWZmaWNpZW50cyA9IFRSVUU7CisgICAgICAgIGJhbmQtPmdhaW4gPSBnYWluOworICAgICAgICBzZXRfcGFzc3Rocm91Z2ggKGVxdSk7CisgICAgICAgIEJBTkRTX1VOTE9DSyAoZXF1KTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFuZCwgImNoYW5nZWQgZ2FpbiA9ICVsZiAiLCBiYW5kLT5nYWluKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfRlJFUTp7CisgICAgICBnZG91YmxlIGZyZXE7CisKKyAgICAgIGZyZXEgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhbmQsICJmcmVxID0gJWxmIC0+ICVsZiIsIGJhbmQtPmZyZXEsIGZyZXEpOworICAgICAgaWYgKGZyZXEgIT0gYmFuZC0+ZnJlcSkgeworICAgICAgICBCQU5EU19MT0NLIChlcXUpOworICAgICAgICBlcXUtPm5lZWRfbmV3X2NvZWZmaWNpZW50cyA9IFRSVUU7CisgICAgICAgIGJhbmQtPmZyZXEgPSBmcmVxOworICAgICAgICBCQU5EU19VTkxPQ0sgKGVxdSk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhbmQsICJjaGFuZ2VkIGZyZXEgPSAlbGYgIiwgYmFuZC0+ZnJlcSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0JBTkRXSURUSDp7CisgICAgICBnZG91YmxlIHdpZHRoOworCisgICAgICB3aWR0aCA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFuZCwgIndpZHRoID0gJWxmIC0+ICVsZiIsIGJhbmQtPndpZHRoLCB3aWR0aCk7CisgICAgICBpZiAod2lkdGggIT0gYmFuZC0+d2lkdGgpIHsKKyAgICAgICAgQkFORFNfTE9DSyAoZXF1KTsKKyAgICAgICAgZXF1LT5uZWVkX25ld19jb2VmZmljaWVudHMgPSBUUlVFOworICAgICAgICBiYW5kLT53aWR0aCA9IHdpZHRoOworICAgICAgICBCQU5EU19VTkxPQ0sgKGVxdSk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhbmQsICJjaGFuZ2VkIHdpZHRoID0gJWxmICIsIGJhbmQtPndpZHRoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfVFlQRTp7CisgICAgICBHc3RJaXJFcXVhbGl6ZXJCYW5kVHlwZSB0eXBlOworCisgICAgICB0eXBlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFuZCwgInR5cGUgPSAlZCAtPiAlZCIsIGJhbmQtPnR5cGUsIHR5cGUpOworICAgICAgaWYgKHR5cGUgIT0gYmFuZC0+dHlwZSkgeworICAgICAgICBCQU5EU19MT0NLIChlcXUpOworICAgICAgICBlcXUtPm5lZWRfbmV3X2NvZWZmaWNpZW50cyA9IFRSVUU7CisgICAgICAgIGJhbmQtPnR5cGUgPSB0eXBlOworICAgICAgICBCQU5EU19VTkxPQ0sgKGVxdSk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhbmQsICJjaGFuZ2VkIHR5cGUgPSAlZCAiLCBiYW5kLT50eXBlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgZ3N0X29iamVjdF91bnJlZiAoZXF1KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9paXJfZXF1YWxpemVyX2JhbmRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdElpckVxdWFsaXplckJhbmQgKmJhbmQgPSBHU1RfSUlSX0VRVUFMSVpFUl9CQU5EIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9HQUlOOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgYmFuZC0+Z2Fpbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRlJFUToKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIGJhbmQtPmZyZXEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkRXSURUSDoKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIGJhbmQtPndpZHRoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UWVBFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIGJhbmQtPnR5cGUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9jbGFzc19pbml0IChHc3RJaXJFcXVhbGl6ZXJCYW5kQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfaWlyX2VxdWFsaXplcl9iYW5kX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2lpcl9lcXVhbGl6ZXJfYmFuZF9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9HQUlOLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImdhaW4iLCAiZ2FpbiIsCisgICAgICAgICAgImdhaW4gZm9yIHRoZSBmcmVxdWVuY3kgYmFuZCByYW5naW5nIGZyb20gLTI0LjAgZEIgdG8gKzEyLjAgZEIiLAorICAgICAgICAgIC0yNC4wLCAxMi4wLCAwLjAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRlJFUSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJmcmVxIiwgImZyZXEiLAorICAgICAgICAgICJjZW50ZXIgZnJlcXVlbmN5IG9mIHRoZSBiYW5kIiwKKyAgICAgICAgICAwLjAsIDEwMDAwMC4wLCAwLjAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORFdJRFRILAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImJhbmR3aWR0aCIsICJiYW5kd2lkdGgiLAorICAgICAgICAgICJkaWZmZXJlbmNlIGJldHdlZW4gYmFuZGVkZ2VzIGluIEh6IiwKKyAgICAgICAgICAwLjAsIDEwMDAwMC4wLCAxLjAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVFlQRSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgidHlwZSIsICJUeXBlIiwKKyAgICAgICAgICAiRmlsdGVyIHR5cGUiLCBHU1RfVFlQRV9JSVJfRVFVQUxJWkVSX0JBTkRfVFlQRSwKKyAgICAgICAgICBCQU5EX1RZUEVfUEVBSywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaWlyX2VxdWFsaXplcl9iYW5kX2luaXQgKEdzdElpckVxdWFsaXplckJhbmQgKiBiYW5kLAorICAgIEdzdElpckVxdWFsaXplckJhbmRDbGFzcyAqIGtsYXNzKQoreworICBiYW5kLT5mcmVxID0gMC4wOworICBiYW5kLT5nYWluID0gMC4wOworICBiYW5kLT53aWR0aCA9IDEuMDsKKyAgYmFuZC0+dHlwZSA9IEJBTkRfVFlQRV9QRUFLOworfQorCitzdGF0aWMgR1R5cGUKK2dzdF9paXJfZXF1YWxpemVyX2JhbmRfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB0eXBlID0gMDsKKworICBpZiAoR19VTkxJS0VMWSAoIXR5cGUpKSB7CisgICAgY29uc3QgR1R5cGVJbmZvIHR5cGVfaW5mbyA9IHsKKyAgICAgIHNpemVvZiAoR3N0SWlyRXF1YWxpemVyQmFuZENsYXNzKSwKKyAgICAgIE5VTEwsCisgICAgICBOVUxMLAorICAgICAgKEdDbGFzc0luaXRGdW5jKSBnc3RfaWlyX2VxdWFsaXplcl9iYW5kX2NsYXNzX2luaXQsCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICAgIHNpemVvZiAoR3N0SWlyRXF1YWxpemVyQmFuZCksCisgICAgICAwLAorICAgICAgKEdJbnN0YW5jZUluaXRGdW5jKSBnc3RfaWlyX2VxdWFsaXplcl9iYW5kX2luaXQsCisgICAgfTsKKyAgICB0eXBlID0KKyAgICAgICAgZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoR1NUX1RZUEVfT0JKRUNULCAiR3N0SWlyRXF1YWxpemVyQmFuZCIsCisgICAgICAgICZ0eXBlX2luZm8sIDApOworICB9CisgIHJldHVybiAodHlwZSk7Cit9CisKKworLyogY2hpbGQgcHJveHkgaWZhY2UgKi8KK3N0YXRpYyBHT2JqZWN0ICoKK2dzdF9paXJfZXF1YWxpemVyX2NoaWxkX3Byb3h5X2dldF9jaGlsZF9ieV9pbmRleCAoR3N0Q2hpbGRQcm94eSAqIGNoaWxkX3Byb3h5LAorICAgIGd1aW50IGluZGV4KQoreworICBHc3RJaXJFcXVhbGl6ZXIgKmVxdSA9IEdTVF9JSVJfRVFVQUxJWkVSIChjaGlsZF9wcm94eSk7CisgIEdPYmplY3QgKnJldDsKKworICBCQU5EU19MT0NLIChlcXUpOworICBpZiAoR19VTkxJS0VMWSAoaW5kZXggPj0gZXF1LT5mcmVxX2JhbmRfY291bnQpKSB7CisgICAgQkFORFNfVU5MT0NLIChlcXUpOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChpbmRleCA8IGVxdS0+ZnJlcV9iYW5kX2NvdW50LCBOVUxMKTsKKyAgfQorCisgIHJldCA9IGdfb2JqZWN0X3JlZiAoR19PQkpFQ1QgKGVxdS0+YmFuZHNbaW5kZXhdKSk7CisgIEJBTkRTX1VOTE9DSyAoZXF1KTsKKworICBHU1RfTE9HX09CSkVDVCAoZXF1LCAicmV0dXJuIGNoaWxkWyVkXSAlIiBHU1RfUFRSX0ZPUk1BVCwgaW5kZXgsIHJldCk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBndWludAorZ3N0X2lpcl9lcXVhbGl6ZXJfY2hpbGRfcHJveHlfZ2V0X2NoaWxkcmVuX2NvdW50IChHc3RDaGlsZFByb3h5ICogY2hpbGRfcHJveHkpCit7CisgIEdzdElpckVxdWFsaXplciAqZXF1ID0gR1NUX0lJUl9FUVVBTElaRVIgKGNoaWxkX3Byb3h5KTsKKworICBHU1RfTE9HICgid2UgaGF2ZSAlZCBjaGlsZHJlbiIsIGVxdS0+ZnJlcV9iYW5kX2NvdW50KTsKKyAgcmV0dXJuIGVxdS0+ZnJlcV9iYW5kX2NvdW50OworfQorCitzdGF0aWMgdm9pZAorZ3N0X2lpcl9lcXVhbGl6ZXJfY2hpbGRfcHJveHlfaW50ZXJmYWNlX2luaXQgKGdwb2ludGVyIGdfaWZhY2UsCisgICAgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0Q2hpbGRQcm94eUludGVyZmFjZSAqaWZhY2UgPSBnX2lmYWNlOworCisgIEdTVF9ERUJVRyAoImluaXRpYWxpemluZyBpZmFjZSIpOworCisgIGlmYWNlLT5nZXRfY2hpbGRfYnlfaW5kZXggPSBnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9nZXRfY2hpbGRfYnlfaW5kZXg7CisgIGlmYWNlLT5nZXRfY2hpbGRyZW5fY291bnQgPSBnc3RfaWlyX2VxdWFsaXplcl9jaGlsZF9wcm94eV9nZXRfY2hpbGRyZW5fY291bnQ7Cit9CisKKy8qIGVxdWFsaXplciBpbXBsZW1lbnRhdGlvbiAqLworCitzdGF0aWMgdm9pZAorZ3N0X2lpcl9lcXVhbGl6ZXJfY2xhc3NfaW5pdCAoR3N0SWlyRXF1YWxpemVyQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyAqYXVkaW9fZmlsdGVyX2NsYXNzID0gKEdzdEF1ZGlvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqYnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9paXJfZXF1YWxpemVyX2ZpbmFsaXplOworICBhdWRpb19maWx0ZXJfY2xhc3MtPnNldHVwID0gZ3N0X2lpcl9lcXVhbGl6ZXJfc2V0dXA7CisgIGJ0cmFuc19jbGFzcy0+dHJhbnNmb3JtX2lwID0gZ3N0X2lpcl9lcXVhbGl6ZXJfdHJhbnNmb3JtX2lwOworICBidHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9pcF9vbl9wYXNzdGhyb3VnaCA9IEZBTFNFOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQUxMT1dFRF9DQVBTKTsKKyAgZ3N0X2F1ZGlvX2ZpbHRlcl9jbGFzc19hZGRfcGFkX3RlbXBsYXRlcyAoYXVkaW9fZmlsdGVyX2NsYXNzLCBjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2lpcl9lcXVhbGl6ZXJfaW5pdCAoR3N0SWlyRXF1YWxpemVyICogZXEpCit7CisgIGdfbXV0ZXhfaW5pdCAoJmVxLT5iYW5kc19sb2NrKTsKKyAgLyogQmFuZCBnYWlucyBhcmUgMCBieSBkZWZhdWx0LCBwYXNzdGhyb3VnaCB1bnRpbCB0aGV5IGFyZSBjaGFuZ2VkICovCisgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfcGFzc3Rocm91Z2ggKEdTVF9CQVNFX1RSQU5TRk9STSAoZXEpLCBUUlVFKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9paXJfZXF1YWxpemVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RJaXJFcXVhbGl6ZXIgKmVxdSA9IEdTVF9JSVJfRVFVQUxJWkVSIChvYmplY3QpOworICBnaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGVxdS0+ZnJlcV9iYW5kX2NvdW50OyBpKyspIHsKKyAgICBpZiAoZXF1LT5iYW5kc1tpXSkKKyAgICAgIGdzdF9vYmplY3RfdW5wYXJlbnQgKEdTVF9PQkpFQ1QgKGVxdS0+YmFuZHNbaV0pKTsKKyAgICBlcXUtPmJhbmRzW2ldID0gTlVMTDsKKyAgfQorICBlcXUtPmZyZXFfYmFuZF9jb3VudCA9IDA7CisKKyAgZ19mcmVlIChlcXUtPmJhbmRzKTsKKyAgZ19mcmVlIChlcXUtPmhpc3RvcnkpOworCisgIGdfbXV0ZXhfY2xlYXIgKCZlcXUtPmJhbmRzX2xvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworLyogRmlsdGVyIHRha2VuIGZyb20KKyAqCisgKiBUaGUgRXF1aXZhbGVuY2Ugb2YgVmFyaW91cyBNZXRob2RzIG9mIENvbXB1dGluZworICogQmlxdWFkIENvZWZmaWNpZW50cyBmb3IgQXVkaW8gUGFyYW1ldHJpYyBFcXVhbGl6ZXJzCisgKgorICogYnkgUm9iZXJ0IEJyaXN0b3ctSm9obnNvbgorICoKKyAqIGh0dHA6Ly93d3cuYWVzLm9yZy9lLWxpYi9icm93c2UuY2ZtP2VsaWI9NjMyNgorICogaHR0cDovL3d3dy5tdXNpY2RzcC5vcmcvZmlsZXMvRVEtQ29lZmZpY2llbnRzLnBkZgorICogaHR0cDovL3d3dy5tdXNpY2RzcC5vcmcvZmlsZXMvQXVkaW8tRVEtQ29va2Jvb2sudHh0CisgKgorICogVGhlIGJhbmR3aWR0aCBtZXRob2QgdGhhdCB3ZSB1c2UgaGVyZSBpcyB0aGUgcHJlZmVycmVkCisgKiBvbmUgZnJvbSB0aGlzIGFydGljbGUgdHJhbnNmb3JtZWQgZnJvbSBvY3RhdmVzIHRvIGZyZXF1ZW5jeQorICogaW4gSHouCisgKi8KK3N0YXRpYyBpbmxpbmUgZ2RvdWJsZQorYXJnX3RvX3NjYWxlIChnZG91YmxlIGFyZykKK3sKKyAgcmV0dXJuIChwb3cgKDEwLjAsIGFyZyAvIDQwLjApKTsKK30KKworc3RhdGljIGdkb3VibGUKK2NhbGN1bGF0ZV9vbWVnYSAoZ2RvdWJsZSBmcmVxLCBnaW50IHJhdGUpCit7CisgIGdkb3VibGUgb21lZ2E7CisKKyAgaWYgKGZyZXEgLyByYXRlID49IDAuNSkKKyAgICBvbWVnYSA9IEdfUEk7CisgIGVsc2UgaWYgKGZyZXEgPD0gMC4wKQorICAgIG9tZWdhID0gMC4wOworICBlbHNlCisgICAgb21lZ2EgPSAyLjAgKiBHX1BJICogKGZyZXEgLyByYXRlKTsKKworICByZXR1cm4gb21lZ2E7Cit9CisKK3N0YXRpYyBnZG91YmxlCitjYWxjdWxhdGVfYncgKEdzdElpckVxdWFsaXplckJhbmQgKiBiYW5kLCBnaW50IHJhdGUpCit7CisgIGdkb3VibGUgYncgPSAwLjA7CisKKyAgaWYgKGJhbmQtPndpZHRoIC8gcmF0ZSA+PSAwLjUpIHsKKyAgICAvKiBJZiBiYW5kd2lkdGggPT0gMC41IHRoZSBjYWxjdWxhdGlvbiBiZWxvdyBmYWlscyBhcyB0YW4oR19QSS8yKQorICAgICAqIGlzIHVuZGVmaW5lZC4gU28gc2V0IHRoZSBiYW5kd2lkdGggdG8gYSBzbGlnaHRseSBzbWFsbGVyIHZhbHVlLgorICAgICAqLworICAgIGJ3ID0gR19QSSAtIDAuMDAwMDAwMDE7CisgIH0gZWxzZSBpZiAoYmFuZC0+d2lkdGggPD0gMC4wKSB7CisgICAgLyogSWYgYmFuZHdpZHRoID09IDAgdGhpcyBiYW5kIHdvbid0IGNoYW5nZSBhbnl0aGluZyBzbyBzZXQKKyAgICAgKiB0aGUgY29lZmZpY2llbnRzIGFjY29yZGluZ2x5LiBUaGUgY29lZmZpY2llbnQgY2FsY3VsYXRpb24KKyAgICAgKiBiZWxvdyB3b3VsZCBjcmVhdGUgY29lZmZpY2llbnRzIHRoYXQgZm9yIHNvbWUgcmVhc29uIGFtcGxpZnkKKyAgICAgKiB0aGUgYmFuZC4KKyAgICAgKi8KKyAgICBiYW5kLT5hMCA9IDEuMDsKKyAgICBiYW5kLT5hMSA9IDAuMDsKKyAgICBiYW5kLT5hMiA9IDAuMDsKKyAgICBiYW5kLT5iMSA9IDAuMDsKKyAgICBiYW5kLT5iMiA9IDAuMDsKKyAgfSBlbHNlIHsKKyAgICBidyA9IDIuMCAqIEdfUEkgKiAoYmFuZC0+d2lkdGggLyByYXRlKTsKKyAgfQorICByZXR1cm4gYnc7Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cF9wZWFrX2ZpbHRlciAoR3N0SWlyRXF1YWxpemVyICogZXF1LCBHc3RJaXJFcXVhbGl6ZXJCYW5kICogYmFuZCkKK3sKKyAgZ2ludCByYXRlID0gR1NUX0FVRElPX0ZJTFRFUl9SQVRFIChlcXUpOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKHJhdGUpOworCisgIHsKKyAgICBnZG91YmxlIGdhaW4sIG9tZWdhLCBidzsKKyAgICBnZG91YmxlIGFscGhhLCBhbHBoYTEsIGFscGhhMiwgYjA7CisKKyAgICBnYWluID0gYXJnX3RvX3NjYWxlIChiYW5kLT5nYWluKTsKKyAgICBvbWVnYSA9IGNhbGN1bGF0ZV9vbWVnYSAoYmFuZC0+ZnJlcSwgcmF0ZSk7CisgICAgYncgPSBjYWxjdWxhdGVfYncgKGJhbmQsIHJhdGUpOworICAgIGlmIChidyA9PSAwLjApCisgICAgICBnb3RvIG91dDsKKworICAgIGFscGhhID0gdGFuIChidyAvIDIuMCk7CisKKyAgICBhbHBoYTEgPSBhbHBoYSAqIGdhaW47CisgICAgYWxwaGEyID0gYWxwaGEgLyBnYWluOworCisgICAgYjAgPSAoMS4wICsgYWxwaGEyKTsKKworICAgIGJhbmQtPmEwID0gKDEuMCArIGFscGhhMSkgLyBiMDsKKyAgICBiYW5kLT5hMSA9ICgtMi4wICogY29zIChvbWVnYSkpIC8gYjA7CisgICAgYmFuZC0+YTIgPSAoMS4wIC0gYWxwaGExKSAvIGIwOworICAgIGJhbmQtPmIxID0gKDIuMCAqIGNvcyAob21lZ2EpKSAvIGIwOworICAgIGJhbmQtPmIyID0gLSgxLjAgLSBhbHBoYTIpIC8gYjA7CisKKyAgb3V0OgorICAgIEdTVF9JTkZPCisgICAgICAgICgiZ2FpbiA9ICU1LjFmLCB3aWR0aD0gJTcuMmYsIGZyZXEgPSAlNy4yZiwgYTAgPSAlNy41ZywgYTEgPSAlNy41ZywgYTI9JTcuNWcgYjEgPSAlNy41ZywgYjIgPSAlNy41ZyIsCisgICAgICAgIGJhbmQtPmdhaW4sIGJhbmQtPndpZHRoLCBiYW5kLT5mcmVxLCBiYW5kLT5hMCwgYmFuZC0+YTEsIGJhbmQtPmEyLAorICAgICAgICBiYW5kLT5iMSwgYmFuZC0+YjIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cF9sb3dfc2hlbGZfZmlsdGVyIChHc3RJaXJFcXVhbGl6ZXIgKiBlcXUsIEdzdElpckVxdWFsaXplckJhbmQgKiBiYW5kKQoreworICBnaW50IHJhdGUgPSBHU1RfQVVESU9fRklMVEVSX1JBVEUgKGVxdSk7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAocmF0ZSk7CisKKyAgeworICAgIGdkb3VibGUgZ2Fpbiwgb21lZ2EsIGJ3OworICAgIGdkb3VibGUgYWxwaGEsIGRlbHRhLCBiMDsKKyAgICBnZG91YmxlIGVncCwgZWdtOworCisgICAgZ2FpbiA9IGFyZ190b19zY2FsZSAoYmFuZC0+Z2Fpbik7CisgICAgb21lZ2EgPSBjYWxjdWxhdGVfb21lZ2EgKGJhbmQtPmZyZXEsIHJhdGUpOworICAgIGJ3ID0gY2FsY3VsYXRlX2J3IChiYW5kLCByYXRlKTsKKyAgICBpZiAoYncgPT0gMC4wKQorICAgICAgZ290byBvdXQ7CisKKyAgICBlZ20gPSBnYWluIC0gMS4wOworICAgIGVncCA9IGdhaW4gKyAxLjA7CisgICAgYWxwaGEgPSB0YW4gKGJ3IC8gMi4wKTsKKworICAgIGRlbHRhID0gMi4wICogc3FydCAoZ2FpbikgKiBhbHBoYTsKKyAgICBiMCA9IGVncCArIGVnbSAqIGNvcyAob21lZ2EpICsgZGVsdGE7CisKKyAgICBiYW5kLT5hMCA9ICgoZWdwIC0gZWdtICogY29zIChvbWVnYSkgKyBkZWx0YSkgKiBnYWluKSAvIGIwOworICAgIGJhbmQtPmExID0gKChlZ20gLSBlZ3AgKiBjb3MgKG9tZWdhKSkgKiAyLjAgKiBnYWluKSAvIGIwOworICAgIGJhbmQtPmEyID0gKChlZ3AgLSBlZ20gKiBjb3MgKG9tZWdhKSAtIGRlbHRhKSAqIGdhaW4pIC8gYjA7CisgICAgYmFuZC0+YjEgPSAoKGVnbSArIGVncCAqIGNvcyAob21lZ2EpKSAqIDIuMCkgLyBiMDsKKyAgICBiYW5kLT5iMiA9IC0oKGVncCArIGVnbSAqIGNvcyAob21lZ2EpIC0gZGVsdGEpKSAvIGIwOworCisKKyAgb3V0OgorICAgIEdTVF9JTkZPCisgICAgICAgICgiZ2FpbiA9ICU1LjFmLCB3aWR0aD0gJTcuMmYsIGZyZXEgPSAlNy4yZiwgYTAgPSAlNy41ZywgYTEgPSAlNy41ZywgYTI9JTcuNWcgYjEgPSAlNy41ZywgYjIgPSAlNy41ZyIsCisgICAgICAgIGJhbmQtPmdhaW4sIGJhbmQtPndpZHRoLCBiYW5kLT5mcmVxLCBiYW5kLT5hMCwgYmFuZC0+YTEsIGJhbmQtPmEyLAorICAgICAgICBiYW5kLT5iMSwgYmFuZC0+YjIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cF9oaWdoX3NoZWxmX2ZpbHRlciAoR3N0SWlyRXF1YWxpemVyICogZXF1LCBHc3RJaXJFcXVhbGl6ZXJCYW5kICogYmFuZCkKK3sKKyAgZ2ludCByYXRlID0gR1NUX0FVRElPX0ZJTFRFUl9SQVRFIChlcXUpOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKHJhdGUpOworCisgIHsKKyAgICBnZG91YmxlIGdhaW4sIG9tZWdhLCBidzsKKyAgICBnZG91YmxlIGFscGhhLCBkZWx0YSwgYjA7CisgICAgZ2RvdWJsZSBlZ3AsIGVnbTsKKworICAgIGdhaW4gPSBhcmdfdG9fc2NhbGUgKGJhbmQtPmdhaW4pOworICAgIG9tZWdhID0gY2FsY3VsYXRlX29tZWdhIChiYW5kLT5mcmVxLCByYXRlKTsKKyAgICBidyA9IGNhbGN1bGF0ZV9idyAoYmFuZCwgcmF0ZSk7CisgICAgaWYgKGJ3ID09IDAuMCkKKyAgICAgIGdvdG8gb3V0OworCisgICAgZWdtID0gZ2FpbiAtIDEuMDsKKyAgICBlZ3AgPSBnYWluICsgMS4wOworICAgIGFscGhhID0gdGFuIChidyAvIDIuMCk7CisKKyAgICBkZWx0YSA9IDIuMCAqIHNxcnQgKGdhaW4pICogYWxwaGE7CisgICAgYjAgPSBlZ3AgLSBlZ20gKiBjb3MgKG9tZWdhKSArIGRlbHRhOworCisgICAgYmFuZC0+YTAgPSAoKGVncCArIGVnbSAqIGNvcyAob21lZ2EpICsgZGVsdGEpICogZ2FpbikgLyBiMDsKKyAgICBiYW5kLT5hMSA9ICgoZWdtICsgZWdwICogY29zIChvbWVnYSkpICogLTIuMCAqIGdhaW4pIC8gYjA7CisgICAgYmFuZC0+YTIgPSAoKGVncCArIGVnbSAqIGNvcyAob21lZ2EpIC0gZGVsdGEpICogZ2FpbikgLyBiMDsKKyAgICBiYW5kLT5iMSA9ICgoZWdtIC0gZWdwICogY29zIChvbWVnYSkpICogLTIuMCkgLyBiMDsKKyAgICBiYW5kLT5iMiA9IC0oKGVncCAtIGVnbSAqIGNvcyAob21lZ2EpIC0gZGVsdGEpKSAvIGIwOworCisKKyAgb3V0OgorICAgIEdTVF9JTkZPCisgICAgICAgICgiZ2FpbiA9ICU1LjFmLCB3aWR0aD0gJTcuMmYsIGZyZXEgPSAlNy4yZiwgYTAgPSAlNy41ZywgYTEgPSAlNy41ZywgYTI9JTcuNWcgYjEgPSAlNy41ZywgYjIgPSAlNy41ZyIsCisgICAgICAgIGJhbmQtPmdhaW4sIGJhbmQtPndpZHRoLCBiYW5kLT5mcmVxLCBiYW5kLT5hMCwgYmFuZC0+YTEsIGJhbmQtPmEyLAorICAgICAgICBiYW5kLT5iMSwgYmFuZC0+YjIpOworICB9Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggYmFuZHNfbG9jayBhbmQgdHJhbnNmb3JtIGxvY2shICovCitzdGF0aWMgdm9pZAorc2V0X3Bhc3N0aHJvdWdoIChHc3RJaXJFcXVhbGl6ZXIgKiBlcXUpCit7CisgIGdpbnQgaTsKKyAgZ2Jvb2xlYW4gcGFzc3Rocm91Z2ggPSBUUlVFOworCisgIGZvciAoaSA9IDA7IGkgPCBlcXUtPmZyZXFfYmFuZF9jb3VudDsgaSsrKSB7CisgICAgcGFzc3Rocm91Z2ggPSBwYXNzdGhyb3VnaCAmJiAoZXF1LT5iYW5kc1tpXS0+Z2FpbiA9PSAwLjApOworICB9CisKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAoR1NUX0JBU0VfVFJBTlNGT1JNIChlcXUpLCBwYXNzdGhyb3VnaCk7CisgIEdTVF9ERUJVRyAoIlBhc3N0aHJvdWdoIG1vZGU6ICVkXG4iLCBwYXNzdGhyb3VnaCk7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggYmFuZHNfbG9jayBhbmQgdHJhbnNmb3JtIGxvY2shICovCitzdGF0aWMgdm9pZAordXBkYXRlX2NvZWZmaWNpZW50cyAoR3N0SWlyRXF1YWxpemVyICogZXF1KQoreworICBnaW50IGksIG4gPSBlcXUtPmZyZXFfYmFuZF9jb3VudDsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgaWYgKGVxdS0+YmFuZHNbaV0tPnR5cGUgPT0gQkFORF9UWVBFX1BFQUspCisgICAgICBzZXR1cF9wZWFrX2ZpbHRlciAoZXF1LCBlcXUtPmJhbmRzW2ldKTsKKyAgICBlbHNlIGlmIChlcXUtPmJhbmRzW2ldLT50eXBlID09IEJBTkRfVFlQRV9MT1dfU0hFTEYpCisgICAgICBzZXR1cF9sb3dfc2hlbGZfZmlsdGVyIChlcXUsIGVxdS0+YmFuZHNbaV0pOworICAgIGVsc2UKKyAgICAgIHNldHVwX2hpZ2hfc2hlbGZfZmlsdGVyIChlcXUsIGVxdS0+YmFuZHNbaV0pOworICB9CisKKyAgZXF1LT5uZWVkX25ld19jb2VmZmljaWVudHMgPSBGQUxTRTsKK30KKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCB0cmFuc2Zvcm0gbG9jayEgKi8KK3N0YXRpYyB2b2lkCithbGxvY19oaXN0b3J5IChHc3RJaXJFcXVhbGl6ZXIgKiBlcXUsIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIC8qIGZyZWUgKyBhbGxvYyA9IG5vIG1lbWNweSAqLworICBnX2ZyZWUgKGVxdS0+aGlzdG9yeSk7CisgIGVxdS0+aGlzdG9yeSA9CisgICAgICBnX21hbGxvYzAgKGVxdS0+aGlzdG9yeV9zaXplICogR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKGluZm8pICoKKyAgICAgIGVxdS0+ZnJlcV9iYW5kX2NvdW50KTsKK30KKwordm9pZAorZ3N0X2lpcl9lcXVhbGl6ZXJfY29tcHV0ZV9mcmVxdWVuY2llcyAoR3N0SWlyRXF1YWxpemVyICogZXF1LCBndWludCBuZXdfY291bnQpCit7CisgIGd1aW50IG9sZF9jb3VudCwgaTsKKyAgZ2RvdWJsZSBmcmVxMCwgZnJlcTEsIHN0ZXA7CisgIGdjaGFyIG5hbWVbMjBdOworCisgIGlmIChlcXUtPmZyZXFfYmFuZF9jb3VudCA9PSBuZXdfY291bnQpCisgICAgcmV0dXJuOworCisgIEJBTkRTX0xPQ0sgKGVxdSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGVxdS0+ZnJlcV9iYW5kX2NvdW50ID09IG5ld19jb3VudCkpIHsKKyAgICBCQU5EU19VTkxPQ0sgKGVxdSk7CisgICAgcmV0dXJuOworICB9CisKKyAgb2xkX2NvdW50ID0gZXF1LT5mcmVxX2JhbmRfY291bnQ7CisgIGVxdS0+ZnJlcV9iYW5kX2NvdW50ID0gbmV3X2NvdW50OworICBHU1RfREVCVUcgKCJiYW5kcyAldSAtPiAldSIsIG9sZF9jb3VudCwgbmV3X2NvdW50KTsKKworICBpZiAob2xkX2NvdW50IDwgbmV3X2NvdW50KSB7CisgICAgLyogYWRkIG5ldyBiYW5kcyAqLworICAgIGVxdS0+YmFuZHMgPSBnX3JlYWxsb2MgKGVxdS0+YmFuZHMsIHNpemVvZiAoR3N0T2JqZWN0ICopICogbmV3X2NvdW50KTsKKyAgICBmb3IgKGkgPSBvbGRfY291bnQ7IGkgPCBuZXdfY291bnQ7IGkrKykgeworICAgICAgLyogb3RoZXJ3aXNlIHRoZXkgZ2V0IG5hbWVzIGxpa2UgJ2lpcmVxdWFsaXplcmJhbmQ1JyAqLworICAgICAgc3ByaW50ZiAobmFtZSwgImJhbmQldSIsIGkpOworICAgICAgZXF1LT5iYW5kc1tpXSA9IGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl9CQU5ELAorICAgICAgICAgICJuYW1lIiwgbmFtZSwgTlVMTCk7CisgICAgICBHU1RfREVCVUcgKCJhZGRpbmcgYmFuZFslZF09JXAiLCBpLCBlcXUtPmJhbmRzW2ldKTsKKworICAgICAgZ3N0X29iamVjdF9zZXRfcGFyZW50IChHU1RfT0JKRUNUIChlcXUtPmJhbmRzW2ldKSwgR1NUX09CSkVDVCAoZXF1KSk7CisgICAgICBnc3RfY2hpbGRfcHJveHlfY2hpbGRfYWRkZWQgKEdTVF9DSElMRF9QUk9YWSAoZXF1KSwKKyAgICAgICAgICBHX09CSkVDVCAoZXF1LT5iYW5kc1tpXSksIG5hbWUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBmcmVlIHVudXNlZCBiYW5kcyAqLworICAgIGZvciAoaSA9IG5ld19jb3VudDsgaSA8IG9sZF9jb3VudDsgaSsrKSB7CisgICAgICBHU1RfREVCVUcgKCJyZW1vdmluZyBiYW5kWyVkXT0lcCIsIGksIGVxdS0+YmFuZHNbaV0pOworICAgICAgZ3N0X2NoaWxkX3Byb3h5X2NoaWxkX3JlbW92ZWQgKEdTVF9DSElMRF9QUk9YWSAoZXF1KSwKKyAgICAgICAgICBHX09CSkVDVCAoZXF1LT5iYW5kc1tpXSksIEdTVF9PQkpFQ1RfTkFNRSAoZXF1LT5iYW5kc1tpXSkpOworICAgICAgZ3N0X29iamVjdF91bnBhcmVudCAoR1NUX09CSkVDVCAoZXF1LT5iYW5kc1tpXSkpOworICAgICAgZXF1LT5iYW5kc1tpXSA9IE5VTEw7CisgICAgfQorICB9CisKKyAgYWxsb2NfaGlzdG9yeSAoZXF1LCBHU1RfQVVESU9fRklMVEVSX0lORk8gKGVxdSkpOworCisgIC8qIHNldCBjZW50ZXIgZnJlcXVlbmNpZXMgYW5kIG5hbWUgYmFuZCBvYmplY3RzCisgICAqIEZJWE1FOiBhcmchIHdlIGNhbid0IGNoYW5nZSB0aGUgbmFtZSBvZiBwYXJlbnRlZCBvYmplY3RzIDooCisgICAqICAgYXBwbGljYXRpb24gc2hvdWxkIHJlYWQgYmFuZC0+ZnJlcSB0byBnZXQgdGhlIG5hbWUKKyAgICovCisKKyAgc3RlcCA9IHBvdyAoSElHSEVTVF9GUkVRIC8gTE9XRVNUX0ZSRVEsIDEuMCAvIG5ld19jb3VudCk7CisgIGZyZXEwID0gTE9XRVNUX0ZSRVE7CisgIGZvciAoaSA9IDA7IGkgPCBuZXdfY291bnQ7IGkrKykgeworICAgIGZyZXExID0gZnJlcTAgKiBzdGVwOworCisgICAgaWYgKGkgPT0gMCkKKyAgICAgIGVxdS0+YmFuZHNbaV0tPnR5cGUgPSBCQU5EX1RZUEVfTE9XX1NIRUxGOworICAgIGVsc2UgaWYgKGkgPT0gbmV3X2NvdW50IC0gMSkKKyAgICAgIGVxdS0+YmFuZHNbaV0tPnR5cGUgPSBCQU5EX1RZUEVfSElHSF9TSEVMRjsKKyAgICBlbHNlCisgICAgICBlcXUtPmJhbmRzW2ldLT50eXBlID0gQkFORF9UWVBFX1BFQUs7CisKKyAgICBlcXUtPmJhbmRzW2ldLT5mcmVxID0gZnJlcTAgKyAoKGZyZXExIC0gZnJlcTApIC8gMi4wKTsKKyAgICBlcXUtPmJhbmRzW2ldLT53aWR0aCA9IGZyZXExIC0gZnJlcTA7CisgICAgR1NUX0RFQlVHICgiYmFuZFslMmRdID0gJyVsZiciLCBpLCBlcXUtPmJhbmRzW2ldLT5mcmVxKTsKKworICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKGVxdS0+YmFuZHNbaV0pLCAiYmFuZHdpZHRoIik7CisgICAgZ19vYmplY3Rfbm90aWZ5IChHX09CSkVDVCAoZXF1LT5iYW5kc1tpXSksICJmcmVxIik7CisgICAgZ19vYmplY3Rfbm90aWZ5IChHX09CSkVDVCAoZXF1LT5iYW5kc1tpXSksICJ0eXBlIik7CisKKyAgICAvKgorICAgICAgIGlmKGVxdS0+YmFuZHNbaV0tPmZyZXE8MTAwMDAuMCkKKyAgICAgICBzcHJpbnRmIChuYW1lLCIlZEh6IiwoZ2ludCllcXUtPmJhbmRzW2ldLT5mcmVxKTsKKyAgICAgICBlbHNlCisgICAgICAgc3ByaW50ZiAobmFtZSwiJWRrSHoiLChnaW50KShlcXUtPmJhbmRzW2ldLT5mcmVxLzEwMDAuMCkpOworICAgICAgIGdzdF9vYmplY3Rfc2V0X25hbWUoIEdTVF9PQkpFQ1QgKGVxdS0+YmFuZHNbaV0pLCBuYW1lKTsKKyAgICAgICBHU1RfREVCVUcgKCJiYW5kWyUyZF0gPSAnJXMnIixpLG5hbWUpOworICAgICAqLworICAgIGZyZXEwID0gZnJlcTE7CisgIH0KKworICBlcXUtPm5lZWRfbmV3X2NvZWZmaWNpZW50cyA9IFRSVUU7CisgIEJBTkRTX1VOTE9DSyAoZXF1KTsKK30KKworLyogc3RhcnQgb2YgY29kZSB0aGF0IGlzIHR5cGUgc3BlY2lmaWMgKi8KKworI2RlZmluZSBDUkVBVEVfT1BUSU1JWkVEX0ZVTkNUSU9OU19JTlQoVFlQRSxCSUdfVFlQRSxNSU5fVkFMLE1BWF9WQUwpICAgXAordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCSUdfVFlQRSB4MSwgeDI7ICAgICAgICAgIC8qIGhpc3Rvcnkgb2YgaW5wdXQgdmFsdWVzIGZvciBhIGZpbHRlciAqLyAgXAorICBCSUdfVFlQRSB5MSwgeTI7ICAgICAgICAgIC8qIGhpc3Rvcnkgb2Ygb3V0cHV0IHZhbHVlcyBmb3IgYSBmaWx0ZXIgKi8gXAorfSBTZWNvbmRPcmRlckhpc3RvcnkgIyMgVFlQRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGlubGluZSBCSUdfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorb25lX3N0ZXBfICMjIFRZUEUgKEdzdElpckVxdWFsaXplckJhbmQgKmZpbHRlciwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNlY29uZE9yZGVySGlzdG9yeSAjIyBUWVBFICpoaXN0b3J5LCBCSUdfVFlQRSBpbnB1dCkgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBjYWxjdWxhdGUgb3V0cHV0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCSUdfVFlQRSBvdXRwdXQgPSBmaWx0ZXItPmEwICogaW5wdXQgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZmlsdGVyLT5hMSAqIGhpc3RvcnktPngxICsgZmlsdGVyLT5hMiAqIGhpc3RvcnktPngyICsgICAgICAgICAgICAgXAorICAgICAgZmlsdGVyLT5iMSAqIGhpc3RvcnktPnkxICsgZmlsdGVyLT5iMiAqIGhpc3RvcnktPnkyOyAgICAgICAgICAgICAgXAorICAvKiB1cGRhdGUgaGlzdG9yeSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoaXN0b3J5LT55MiA9IGhpc3RvcnktPnkxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoaXN0b3J5LT55MSA9IG91dHB1dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoaXN0b3J5LT54MiA9IGhpc3RvcnktPngxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoaXN0b3J5LT54MSA9IGlucHV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gb3V0cHV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGNvbnN0IGd1aW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraGlzdG9yeV9zaXplXyAjIyBUWVBFID0gc2l6ZW9mIChTZWNvbmRPcmRlckhpc3RvcnkgIyMgVFlQRSk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZ3N0X2lpcl9lcXVfcHJvY2Vzc18gIyMgVFlQRSAoR3N0SWlyRXF1YWxpemVyICplcXUsIGd1aW50OCAqZGF0YSwgICAgICAgXAorZ3VpbnQgc2l6ZSwgZ3VpbnQgY2hhbm5lbHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBndWludCBmcmFtZXMgPSBzaXplIC8gY2hhbm5lbHMgLyBzaXplb2YgKFRZUEUpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICBndWludCBpLCBjLCBmLCBuZiA9IGVxdS0+ZnJlcV9iYW5kX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCSUdfVFlQRSBjdXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHc3RJaXJFcXVhbGl6ZXJCYW5kICoqZmlsdGVycyA9IGVxdS0+YmFuZHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVzOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNlY29uZE9yZGVySGlzdG9yeSAjIyBUWVBFICpoaXN0b3J5ID0gZXF1LT5oaXN0b3J5OyAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgYysrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY3VyID0gKigoVFlQRSAqKSBkYXRhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZm9yIChmID0gMDsgZiA8IG5mOyBmKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjdXIgPSBvbmVfc3RlcF8gIyMgVFlQRSAoZmlsdGVyc1tmXSwgaGlzdG9yeSwgY3VyKTsgICAgICAgICAgICAgXAorICAgICAgICBoaXN0b3J5Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY3VyID0gQ0xBTVAgKGN1ciwgTUlOX1ZBTCwgTUFYX1ZBTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKigoVFlQRSAqKSBkYXRhKSA9IChUWVBFKSBmbG9vciAoY3VyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZGF0YSArPSBzaXplb2YgKFRZUEUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENSRUFURV9PUFRJTUlaRURfRlVOQ1RJT05TKFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRZUEUgeDEsIHgyOyAgICAgICAgICAvKiBoaXN0b3J5IG9mIGlucHV0IHZhbHVlcyBmb3IgYSBmaWx0ZXIgKi8gIFwKKyAgVFlQRSB5MSwgeTI7ICAgICAgICAgIC8qIGhpc3Rvcnkgb2Ygb3V0cHV0IHZhbHVlcyBmb3IgYSBmaWx0ZXIgKi8gXAorfSBTZWNvbmRPcmRlckhpc3RvcnkgIyMgVFlQRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGlubGluZSBUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorb25lX3N0ZXBfICMjIFRZUEUgKEdzdElpckVxdWFsaXplckJhbmQgKmZpbHRlciwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNlY29uZE9yZGVySGlzdG9yeSAjIyBUWVBFICpoaXN0b3J5LCBUWVBFIGlucHV0KSAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBjYWxjdWxhdGUgb3V0cHV0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUWVBFIG91dHB1dCA9IGZpbHRlci0+YTAgKiBpbnB1dCArIGZpbHRlci0+YTEgKiBoaXN0b3J5LT54MSArICAgICAgICAgXAorICAgICAgZmlsdGVyLT5hMiAqIGhpc3RvcnktPngyICsgZmlsdGVyLT5iMSAqIGhpc3RvcnktPnkxICsgICAgICAgICAgICAgXAorICAgICAgZmlsdGVyLT5iMiAqIGhpc3RvcnktPnkyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiB1cGRhdGUgaGlzdG9yeSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoaXN0b3J5LT55MiA9IGhpc3RvcnktPnkxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoaXN0b3J5LT55MSA9IG91dHB1dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoaXN0b3J5LT54MiA9IGhpc3RvcnktPngxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoaXN0b3J5LT54MSA9IGlucHV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gb3V0cHV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGNvbnN0IGd1aW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraGlzdG9yeV9zaXplXyAjIyBUWVBFID0gc2l6ZW9mIChTZWNvbmRPcmRlckhpc3RvcnkgIyMgVFlQRSk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZ3N0X2lpcl9lcXVfcHJvY2Vzc18gIyMgVFlQRSAoR3N0SWlyRXF1YWxpemVyICplcXUsIGd1aW50OCAqZGF0YSwgICAgICAgXAorZ3VpbnQgc2l6ZSwgZ3VpbnQgY2hhbm5lbHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBndWludCBmcmFtZXMgPSBzaXplIC8gY2hhbm5lbHMgLyBzaXplb2YgKFRZUEUpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICBndWludCBpLCBjLCBmLCBuZiA9IGVxdS0+ZnJlcV9iYW5kX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUWVBFIGN1cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHc3RJaXJFcXVhbGl6ZXJCYW5kICoqZmlsdGVycyA9IGVxdS0+YmFuZHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVzOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNlY29uZE9yZGVySGlzdG9yeSAjIyBUWVBFICpoaXN0b3J5ID0gZXF1LT5oaXN0b3J5OyAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgYysrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY3VyID0gKigoVFlQRSAqKSBkYXRhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZm9yIChmID0gMDsgZiA8IG5mOyBmKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjdXIgPSBvbmVfc3RlcF8gIyMgVFlQRSAoZmlsdGVyc1tmXSwgaGlzdG9yeSwgY3VyKTsgICAgICAgICAgICAgXAorICAgICAgICBoaXN0b3J5Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKigoVFlQRSAqKSBkYXRhKSA9IChUWVBFKSBjdXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZGF0YSArPSBzaXplb2YgKFRZUEUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitDUkVBVEVfT1BUSU1JWkVEX0ZVTkNUSU9OU19JTlQgKGdpbnQxNiwgZ2Zsb2F0LCAtMzI3NjguMCwgMzI3NjcuMCk7CitDUkVBVEVfT1BUSU1JWkVEX0ZVTkNUSU9OUyAoZ2Zsb2F0KTsKK0NSRUFURV9PUFRJTUlaRURfRlVOQ1RJT05TIChnZG91YmxlKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9paXJfZXF1YWxpemVyX3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJ0cmFucywgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RBdWRpb0ZpbHRlciAqZmlsdGVyID0gR1NUX0FVRElPX0ZJTFRFUiAoYnRyYW5zKTsKKyAgR3N0SWlyRXF1YWxpemVyICplcXUgPSBHU1RfSUlSX0VRVUFMSVpFUiAoYnRyYW5zKTsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdpbnQgY2hhbm5lbHMgPSBHU1RfQVVESU9fRklMVEVSX0NIQU5ORUxTIChmaWx0ZXIpOworICBnYm9vbGVhbiBuZWVkX25ld19jb2VmZmljaWVudHM7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGNoYW5uZWxzIDwgMSB8fCBlcXUtPnByb2Nlc3MgPT0gTlVMTCkpCisgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworCisgIEJBTkRTX0xPQ0sgKGVxdSk7CisgIG5lZWRfbmV3X2NvZWZmaWNpZW50cyA9IGVxdS0+bmVlZF9uZXdfY29lZmZpY2llbnRzOworICBCQU5EU19VTkxPQ0sgKGVxdSk7CisKKyAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1Zik7CisgIHRpbWVzdGFtcCA9CisgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJmJ0cmFucy0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXApOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAodGltZXN0YW1wKSkgeworICAgIEdzdElpckVxdWFsaXplckJhbmQgKipmaWx0ZXJzID0gZXF1LT5iYW5kczsKKyAgICBndWludCBmLCBuZiA9IGVxdS0+ZnJlcV9iYW5kX2NvdW50OworCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoZXF1KSwgdGltZXN0YW1wKTsKKworICAgIC8qIHN5bmMgdmFsdWVzIGZvciBiYW5kcyB0b28gKi8KKyAgICAvKiBGSVhNRTogaXRlcmF0aW5nIGVxdS0+YmFuZHMgaXMgbm90IHRocmVhZC1zYWZlIGhlcmUgKi8KKyAgICBmb3IgKGYgPSAwOyBmIDwgbmY7IGYrKykgeworICAgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoZmlsdGVyc1tmXSksIHRpbWVzdGFtcCk7CisgICAgfQorICB9CisKKyAgQkFORFNfTE9DSyAoZXF1KTsKKyAgaWYgKG5lZWRfbmV3X2NvZWZmaWNpZW50cykgeworICAgIHVwZGF0ZV9jb2VmZmljaWVudHMgKGVxdSk7CisgIH0KKyAgQkFORFNfVU5MT0NLIChlcXUpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgZXF1LT5wcm9jZXNzIChlcXUsIG1hcC5kYXRhLCBtYXAuc2l6ZSwgY2hhbm5lbHMpOworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfaWlyX2VxdWFsaXplcl9zZXR1cCAoR3N0QXVkaW9GaWx0ZXIgKiBhdWRpbywgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgR3N0SWlyRXF1YWxpemVyICplcXUgPSBHU1RfSUlSX0VRVUFMSVpFUiAoYXVkaW8pOworCisgIHN3aXRjaCAoR1NUX0FVRElPX0lORk9fRk9STUFUIChpbmZvKSkgeworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMTY6CisgICAgICBlcXUtPmhpc3Rvcnlfc2l6ZSA9IGhpc3Rvcnlfc2l6ZV9naW50MTY7CisgICAgICBlcXUtPnByb2Nlc3MgPSBnc3RfaWlyX2VxdV9wcm9jZXNzX2dpbnQxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GMzI6CisgICAgICBlcXUtPmhpc3Rvcnlfc2l6ZSA9IGhpc3Rvcnlfc2l6ZV9nZmxvYXQ7CisgICAgICBlcXUtPnByb2Nlc3MgPSBnc3RfaWlyX2VxdV9wcm9jZXNzX2dmbG9hdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GNjQ6CisgICAgICBlcXUtPmhpc3Rvcnlfc2l6ZSA9IGhpc3Rvcnlfc2l6ZV9nZG91YmxlOworICAgICAgZXF1LT5wcm9jZXNzID0gZ3N0X2lpcl9lcXVfcHJvY2Vzc19nZG91YmxlOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGFsbG9jX2hpc3RvcnkgKGVxdSwgaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGVxdWFsaXplcl9kZWJ1ZywgImVxdWFsaXplciIsIDAsICJlcXVhbGl6ZXIiKTsKKworICBpZiAoIShnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiZXF1YWxpemVyLW5iYW5kcyIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgICAgIEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfTkJBTkRTKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghKGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJlcXVhbGl6ZXItM2JhbmRzIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICAgICAgR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl8zQkFORFMpKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCEoZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImVxdWFsaXplci0xMGJhbmRzIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICAgICAgR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl8xMEJBTkRTKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgZXF1YWxpemVyLAorICAgICJHU3RyZWFtZXIgYXVkaW8gZXF1YWxpemVycyIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplci5oIGIvZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmE3MGVlZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyLmgKQEAgLTAsMCArMSw3NiBAQAorLyogR1N0cmVhbWVyIElJUiBlcXVhbGl6ZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDQ+IEJlbmphbWluIE90dGUgPG90dGVAZ25vbWUub3JnPgorICogICAgICAgICAgICAgICA8MjAwNz4gU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfSUlSX0VRVUFMSVpFUl9fCisjZGVmaW5lIF9fR1NUX0lJUl9FUVVBTElaRVJfXworCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RJaXJFcXVhbGl6ZXIgR3N0SWlyRXF1YWxpemVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdElpckVxdWFsaXplckNsYXNzIEdzdElpckVxdWFsaXplckNsYXNzOwordHlwZWRlZiBzdHJ1Y3QgX0dzdElpckVxdWFsaXplckJhbmQgR3N0SWlyRXF1YWxpemVyQmFuZDsKKworI2RlZmluZSBHU1RfVFlQRV9JSVJfRVFVQUxJWkVSIFwKKyAgKGdzdF9paXJfZXF1YWxpemVyX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9JSVJfRVFVQUxJWkVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfSUlSX0VRVUFMSVpFUixHc3RJaXJFcXVhbGl6ZXIpKQorI2RlZmluZSBHU1RfSUlSX0VRVUFMSVpFUl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9JSVJfRVFVQUxJWkVSLEdzdElpckVxdWFsaXplckNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0lJUl9FUVVBTElaRVIob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9JSVJfRVFVQUxJWkVSKSkKKyNkZWZpbmUgR1NUX0lTX0lJUl9FUVVBTElaRVJfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfSUlSX0VRVUFMSVpFUikpCisKKyNkZWZpbmUgTE9XRVNUX0ZSRVEgKDIwLjApCisjZGVmaW5lIEhJR0hFU1RfRlJFUSAoMjAwMDAuMCkKKwordHlwZWRlZiB2b2lkICgqUHJvY2Vzc0Z1bmMpIChHc3RJaXJFcXVhbGl6ZXIgKiBlcSwgZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSwKKyAgICBndWludCBjaGFubmVscyk7CisKK3N0cnVjdCBfR3N0SWlyRXF1YWxpemVyCit7CisgIEdzdEF1ZGlvRmlsdGVyIGF1ZGlvZmlsdGVyOworCisgIC8qPCBwcml2YXRlID4qLworCisgIEdNdXRleCBiYW5kc19sb2NrOworICBHc3RJaXJFcXVhbGl6ZXJCYW5kICoqYmFuZHM7CisKKyAgLyogcHJvcGVydGllcyAqLworICBndWludCBmcmVxX2JhbmRfY291bnQ7CisgIC8qIGZvciBlYWNoIGJhbmQgYW5kIGNoYW5uZWwgKi8KKyAgZ3BvaW50ZXIgaGlzdG9yeTsKKyAgZ3VpbnQgaGlzdG9yeV9zaXplOworCisgIGdib29sZWFuIG5lZWRfbmV3X2NvZWZmaWNpZW50czsKKworICBQcm9jZXNzRnVuYyBwcm9jZXNzOworfTsKKworc3RydWN0IF9Hc3RJaXJFcXVhbGl6ZXJDbGFzcworeworICBHc3RBdWRpb0ZpbHRlckNsYXNzIGF1ZGlvZmlsdGVyX2NsYXNzOworfTsKKworZXh0ZXJuIHZvaWQgZ3N0X2lpcl9lcXVhbGl6ZXJfY29tcHV0ZV9mcmVxdWVuY2llcyAoR3N0SWlyRXF1YWxpemVyICogZXF1LCBndWludCBuZXdfY291bnQpOworCitleHRlcm4gR1R5cGUgZ3N0X2lpcl9lcXVhbGl6ZXJfZ2V0X3R5cGUodm9pZCk7CisKKyNlbmRpZiAvKiBfX0dTVF9JSVJfRVFVQUxJWkVSX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5jIGIvZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiYmY1MwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5jCkBAIC0wLDAgKzEsMjI5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1lcXVhbGl6ZXItMTBiYW5kcworICoKKyAqIFRoZSAxMCBiYW5kIGVxdWFsaXplciBlbGVtZW50IGFsbG93cyB0byBjaGFuZ2UgdGhlIGdhaW4gb2YgMTAgZXF1YWxseSBkaXN0cmlidXRlZAorICogZnJlcXVlbmN5IGJhbmRzIGJldHdlZW4gMzAgSHogYW5kIDE1IGtIei4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj1zb25nLm9nZyAhIG9nZ2RlbXV4ICEgdm9yYmlzZGVjICEgYXVkaW9jb252ZXJ0ICEgZXF1YWxpemVyLTEwYmFuZHMgYmFuZDI9My4wICEgYWxzYXNpbmsKKyAqIF18IFRoaXMgcmFpc2VzIHRoZSB2b2x1bWUgb2YgdGhlIDNyZCBiYW5kIHdoaWNoIGlzIGF0IDExOSBIeiBieSAzIGRiLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RpaXJlcXVhbGl6ZXIuaCIKKyNpbmNsdWRlICJnc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmgiCisKKworZW51bQoreworICBQUk9QX0JBTkQwID0gMSwKKyAgUFJPUF9CQU5EMSwKKyAgUFJPUF9CQU5EMiwKKyAgUFJPUF9CQU5EMywKKyAgUFJPUF9CQU5ENCwKKyAgUFJPUF9CQU5ENSwKKyAgUFJPUF9CQU5ENiwKKyAgUFJPUF9CQU5ENywKKyAgUFJPUF9CQU5EOCwKKyAgUFJPUF9CQU5EOSwKK307CisKK3N0YXRpYyB2b2lkIGdzdF9paXJfZXF1YWxpemVyXzEwYmFuZHNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2lpcl9lcXVhbGl6ZXJfMTBiYW5kc19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKGVxdWFsaXplcl9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBlcXVhbGl6ZXJfZGVidWcKKworCisjZGVmaW5lIGdzdF9paXJfZXF1YWxpemVyXzEwYmFuZHNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0SWlyRXF1YWxpemVyMTBCYW5kcywgZ3N0X2lpcl9lcXVhbGl6ZXJfMTBiYW5kcywKKyAgICBHU1RfVFlQRV9JSVJfRVFVQUxJWkVSKTsKKworLyogZXF1YWxpemVyIGltcGxlbWVudGF0aW9uICovCisKK3N0YXRpYyB2b2lkCitnc3RfaWlyX2VxdWFsaXplcl8xMGJhbmRzX2NsYXNzX2luaXQgKEdzdElpckVxdWFsaXplcjEwQmFuZHNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9paXJfZXF1YWxpemVyXzEwYmFuZHNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfaWlyX2VxdWFsaXplcl8xMGJhbmRzX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0JBTkQwLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImJhbmQwIiwgIjI5IEh6IiwKKyAgICAgICAgICAiZ2FpbiBmb3IgdGhlIGZyZXF1ZW5jeSBiYW5kIDI5IEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQiIsCisgICAgICAgICAgLTI0LjAsIDEyLjAsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORDEsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZDEiLCAiNTkgSHoiLAorICAgICAgICAgICJnYWluIGZvciB0aGUgZnJlcXVlbmN5IGJhbmQgNTkgSHosIHJhbmdpbmcgZnJvbSAtMjQgZEIgdG8gKzEyIGRCIiwKKyAgICAgICAgICAtMjQuMCwgMTIuMCwgMC4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CQU5EMiwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJiYW5kMiIsICIxMTkgSHoiLAorICAgICAgICAgICJnYWluIGZvciB0aGUgZnJlcXVlbmN5IGJhbmQgMTE5IEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQiIsCisgICAgICAgICAgLTI0LjAsIDEyLjAsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORDMsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZDMiLCAiMjM3IEh6IiwKKyAgICAgICAgICAiZ2FpbiBmb3IgdGhlIGZyZXF1ZW5jeSBiYW5kIDIzNyBIeiwgcmFuZ2luZyBmcm9tIC0yNCBkQiB0byArMTIgZEIiLAorICAgICAgICAgIC0yNC4wLCAxMi4wLCAwLjAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0JBTkQ0LAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImJhbmQ0IiwgIjQ3NCBIeiIsCisgICAgICAgICAgImdhaW4gZm9yIHRoZSBmcmVxdWVuY3kgYmFuZCA0NzQgSHosIHJhbmdpbmcgZnJvbSAtMjQgZEIgdG8gKzEyIGRCIiwKKyAgICAgICAgICAtMjQuMCwgMTIuMCwgMC4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CQU5ENSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJiYW5kNSIsICI5NDcgSHoiLAorICAgICAgICAgICJnYWluIGZvciB0aGUgZnJlcXVlbmN5IGJhbmQgOTQ3IEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQiIsCisgICAgICAgICAgLTI0LjAsIDEyLjAsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORDYsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZDYiLCAiMTg4OSBIeiIsCisgICAgICAgICAgImdhaW4gZm9yIHRoZSBmcmVxdWVuY3kgYmFuZCAxODg5IEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQiIsCisgICAgICAgICAgLTI0LjAsIDEyLjAsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORDcsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZDciLCAiMzc3MCBIeiIsCisgICAgICAgICAgImdhaW4gZm9yIHRoZSBmcmVxdWVuY3kgYmFuZCAzNzcwIEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQiIsCisgICAgICAgICAgLTI0LjAsIDEyLjAsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORDgsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZDgiLCAiNzUyMyBIeiIsCisgICAgICAgICAgImdhaW4gZm9yIHRoZSBmcmVxdWVuY3kgYmFuZCA3NTIzIEh6LCByYW5naW5nIGZyb20gLTI0IGRCIHRvICsxMiBkQiIsCisgICAgICAgICAgLTI0LjAsIDEyLjAsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORDksCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZDkiLCAiMTUwMTEgSHoiLAorICAgICAgICAgICJnYWluIGZvciB0aGUgZnJlcXVlbmN5IGJhbmQgMTUwMTEgSHosIHJhbmdpbmcgZnJvbSAtMjQgZEIgdG8gKzEyIGRCIiwKKyAgICAgICAgICAtMjQuMCwgMTIuMCwgMC4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiMTAgQmFuZCBFcXVhbGl6ZXIiLAorICAgICAgIkZpbHRlci9FZmZlY3QvQXVkaW8iLAorICAgICAgIkRpcmVjdCBGb3JtIDEwIGJhbmQgSUlSIGVxdWFsaXplciIsCisgICAgICAiU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2lpcl9lcXVhbGl6ZXJfMTBiYW5kc19pbml0IChHc3RJaXJFcXVhbGl6ZXIxMEJhbmRzICogZXF1X24pCit7CisgIEdzdElpckVxdWFsaXplciAqZXF1ID0gR1NUX0lJUl9FUVVBTElaRVIgKGVxdV9uKTsKKworICBnc3RfaWlyX2VxdWFsaXplcl9jb21wdXRlX2ZyZXF1ZW5jaWVzIChlcXUsIDEwKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9paXJfZXF1YWxpemVyXzEwYmFuZHNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdENoaWxkUHJveHkgKmVxdSA9IEdTVF9DSElMRF9QUk9YWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQkFORDA6CisgICAgICBnc3RfY2hpbGRfcHJveHlfc2V0X3Byb3BlcnR5IChlcXUsICJiYW5kMDo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CQU5EMToKKyAgICAgIGdzdF9jaGlsZF9wcm94eV9zZXRfcHJvcGVydHkgKGVxdSwgImJhbmQxOjpnYWluIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkQyOgorICAgICAgZ3N0X2NoaWxkX3Byb3h5X3NldF9wcm9wZXJ0eSAoZXF1LCAiYmFuZDI6OmdhaW4iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORDM6CisgICAgICBnc3RfY2hpbGRfcHJveHlfc2V0X3Byb3BlcnR5IChlcXUsICJiYW5kMzo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CQU5ENDoKKyAgICAgIGdzdF9jaGlsZF9wcm94eV9zZXRfcHJvcGVydHkgKGVxdSwgImJhbmQ0OjpnYWluIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkQ1OgorICAgICAgZ3N0X2NoaWxkX3Byb3h5X3NldF9wcm9wZXJ0eSAoZXF1LCAiYmFuZDU6OmdhaW4iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORDY6CisgICAgICBnc3RfY2hpbGRfcHJveHlfc2V0X3Byb3BlcnR5IChlcXUsICJiYW5kNjo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CQU5ENzoKKyAgICAgIGdzdF9jaGlsZF9wcm94eV9zZXRfcHJvcGVydHkgKGVxdSwgImJhbmQ3OjpnYWluIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkQ4OgorICAgICAgZ3N0X2NoaWxkX3Byb3h5X3NldF9wcm9wZXJ0eSAoZXF1LCAiYmFuZDg6OmdhaW4iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORDk6CisgICAgICBnc3RfY2hpbGRfcHJveHlfc2V0X3Byb3BlcnR5IChlcXUsICJiYW5kOTo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9paXJfZXF1YWxpemVyXzEwYmFuZHNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdENoaWxkUHJveHkgKmVxdSA9IEdTVF9DSElMRF9QUk9YWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQkFORDA6CisgICAgICBnc3RfY2hpbGRfcHJveHlfZ2V0X3Byb3BlcnR5IChlcXUsICJiYW5kMDo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CQU5EMToKKyAgICAgIGdzdF9jaGlsZF9wcm94eV9nZXRfcHJvcGVydHkgKGVxdSwgImJhbmQxOjpnYWluIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkQyOgorICAgICAgZ3N0X2NoaWxkX3Byb3h5X2dldF9wcm9wZXJ0eSAoZXF1LCAiYmFuZDI6OmdhaW4iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORDM6CisgICAgICBnc3RfY2hpbGRfcHJveHlfZ2V0X3Byb3BlcnR5IChlcXUsICJiYW5kMzo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CQU5ENDoKKyAgICAgIGdzdF9jaGlsZF9wcm94eV9nZXRfcHJvcGVydHkgKGVxdSwgImJhbmQ0OjpnYWluIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkQ1OgorICAgICAgZ3N0X2NoaWxkX3Byb3h5X2dldF9wcm9wZXJ0eSAoZXF1LCAiYmFuZDU6OmdhaW4iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORDY6CisgICAgICBnc3RfY2hpbGRfcHJveHlfZ2V0X3Byb3BlcnR5IChlcXUsICJiYW5kNjo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CQU5ENzoKKyAgICAgIGdzdF9jaGlsZF9wcm94eV9nZXRfcHJvcGVydHkgKGVxdSwgImJhbmQ3OjpnYWluIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkQ4OgorICAgICAgZ3N0X2NoaWxkX3Byb3h5X2dldF9wcm9wZXJ0eSAoZXF1LCAiYmFuZDg6OmdhaW4iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORDk6CisgICAgICBnc3RfY2hpbGRfcHJveHlfZ2V0X3Byb3BlcnR5IChlcXUsICJiYW5kOTo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5oIGIvZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2NjcyMQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyMTBiYW5kcy5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfSUlSX0VRVUFMSVpFUl8xMEJBTkRTX18KKyNkZWZpbmUgX19HU1RfSUlSX0VRVUFMSVpFUl8xMEJBTkRTX18KKworI2luY2x1ZGUgImdzdGlpcmVxdWFsaXplci5oIgorCit0eXBlZGVmIHN0cnVjdCBfR3N0SWlyRXF1YWxpemVyMTBCYW5kcyBHc3RJaXJFcXVhbGl6ZXIxMEJhbmRzOwordHlwZWRlZiBzdHJ1Y3QgX0dzdElpckVxdWFsaXplcjEwQmFuZHNDbGFzcyBHc3RJaXJFcXVhbGl6ZXIxMEJhbmRzQ2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl8xMEJBTkRTIFwKKyAgKGdzdF9paXJfZXF1YWxpemVyXzEwYmFuZHNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0lJUl9FUVVBTElaRVJfMTBCQU5EUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfMTBCQU5EUyxHc3RJaXJFcXVhbGl6ZXIxMEJhbmRzKSkKKyNkZWZpbmUgR1NUX0lJUl9FUVVBTElaRVJfMTBCQU5EU19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9JSVJfRVFVQUxJWkVSXzEwQkFORFMsR3N0SWlyRXF1YWxpemVyMTBCYW5kc0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0lJUl9FUVVBTElaRVJfMTBCQU5EUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfMTBCQU5EUykpCisjZGVmaW5lIEdTVF9JU19JSVJfRVFVQUxJWkVSXzEwQkFORFNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl8xMEJBTkRTKSkKKworc3RydWN0IF9Hc3RJaXJFcXVhbGl6ZXIxMEJhbmRzCit7CisgIEdzdElpckVxdWFsaXplciBlcXVhbGl6ZXI7Cit9OworCitzdHJ1Y3QgX0dzdElpckVxdWFsaXplcjEwQmFuZHNDbGFzcworeworICBHc3RJaXJFcXVhbGl6ZXJDbGFzcyBlcXVhbGl6ZXJfY2xhc3M7Cit9OworCitleHRlcm4gR1R5cGUgZ3N0X2lpcl9lcXVhbGl6ZXJfMTBiYW5kc19nZXRfdHlwZSh2b2lkKTsKKworI2VuZGlmIC8qIF9fR1NUX0lJUl9FUVVBTElaRVJfMTBCQU5EU19fICovCmRpZmYgLS1naXQgYS9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5jIGIvZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIzYmFuZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmYxNGVkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXIzYmFuZHMuYwpAQCAtMCwwICsxLDE0MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZXF1YWxpemVyLTNiYW5kcworICoKKyAqIFRoZSAzLWJhbmQgZXF1YWxpemVyIGVsZW1lbnQgYWxsb3dzIHRvIGNoYW5nZSB0aGUgZ2FpbiBvZiBhIGxvdyBmcmVxdWVuY3ksCisgKiBtZWRpdW0gZnJlcXVlbmN5IGFuZCBoaWdoIGZyZXF1ZW5jeSBiYW5kLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXNvbmcub2dnICEgb2dnZGVtdXggISB2b3JiaXNkZWMgISBhdWRpb2NvbnZlcnQgISBlcXVhbGl6ZXItM2JhbmRzIGJhbmQxPTYuMCAhIGFsc2FzaW5rCisgKiBdfCBUaGlzIHJhaXNlcyB0aGUgdm9sdW1lIG9mIHRoZSAybmQgYmFuZCwgd2hpY2ggaXMgYXQgMTExMCBIeiwgYnkgNiBkYi4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0aWlyZXF1YWxpemVyLmgiCisjaW5jbHVkZSAiZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmgiCisKK2VudW0KK3sKKyAgUFJPUF9CQU5EMCA9IDEsCisgIFBST1BfQkFORDEsCisgIFBST1BfQkFORDIsCit9OworCitzdGF0aWMgdm9pZCBnc3RfaWlyX2VxdWFsaXplcl8zYmFuZHNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2lpcl9lcXVhbGl6ZXJfM2JhbmRzX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworR1NUX0RFQlVHX0NBVEVHT1JZX0VYVEVSTiAoZXF1YWxpemVyX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGVxdWFsaXplcl9kZWJ1ZworCisjZGVmaW5lIGdzdF9paXJfZXF1YWxpemVyXzNiYW5kc19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RJaXJFcXVhbGl6ZXIzQmFuZHMsIGdzdF9paXJfZXF1YWxpemVyXzNiYW5kcywKKyAgICBHU1RfVFlQRV9JSVJfRVFVQUxJWkVSKTsKKworLyogZXF1YWxpemVyIGltcGxlbWVudGF0aW9uICovCisKK3N0YXRpYyB2b2lkCitnc3RfaWlyX2VxdWFsaXplcl8zYmFuZHNfY2xhc3NfaW5pdCAoR3N0SWlyRXF1YWxpemVyM0JhbmRzQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfaWlyX2VxdWFsaXplcl8zYmFuZHNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfaWlyX2VxdWFsaXplcl8zYmFuZHNfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORDAsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZDAiLCAiMTEwIEh6IiwKKyAgICAgICAgICAiZ2FpbiBmb3IgdGhlIGZyZXF1ZW5jeSBiYW5kIDEwMCBIeiwgcmFuZ2luZyBmcm9tIC0yNC4wIHRvICsxMi4wIiwKKyAgICAgICAgICAtMjQuMCwgMTIuMCwgMC4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CQU5EMSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJiYW5kMSIsICIxMTAwIEh6IiwKKyAgICAgICAgICAiZ2FpbiBmb3IgdGhlIGZyZXF1ZW5jeSBiYW5kIDExMDAgSHosIHJhbmdpbmcgZnJvbSAtMjQuMCB0byArMTIuMCIsCisgICAgICAgICAgLTI0LjAsIDEyLjAsIDAuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORDIsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZDIiLCAiMTEga0h6IiwKKyAgICAgICAgICAiZ2FpbiBmb3IgdGhlIGZyZXF1ZW5jeSBiYW5kIDExIGtIeiwgcmFuZ2luZyBmcm9tIC0yNC4wIHRvICsxMi4wIiwKKyAgICAgICAgICAtMjQuMCwgMTIuMCwgMC4wLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiMyBCYW5kIEVxdWFsaXplciIsCisgICAgICAiRmlsdGVyL0VmZmVjdC9BdWRpbyIsCisgICAgICAiRGlyZWN0IEZvcm0gMyBiYW5kIElJUiBlcXVhbGl6ZXIiLCAiU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2lpcl9lcXVhbGl6ZXJfM2JhbmRzX2luaXQgKEdzdElpckVxdWFsaXplcjNCYW5kcyAqIGVxdV9uKQoreworICBHc3RJaXJFcXVhbGl6ZXIgKmVxdSA9IEdTVF9JSVJfRVFVQUxJWkVSIChlcXVfbik7CisKKyAgZ3N0X2lpcl9lcXVhbGl6ZXJfY29tcHV0ZV9mcmVxdWVuY2llcyAoZXF1LCAzKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9paXJfZXF1YWxpemVyXzNiYW5kc19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0Q2hpbGRQcm94eSAqZXF1ID0gR1NUX0NISUxEX1BST1hZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9CQU5EMDoKKyAgICAgIGdzdF9jaGlsZF9wcm94eV9zZXRfcHJvcGVydHkgKGVxdSwgImJhbmQwOjpnYWluIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkQxOgorICAgICAgZ3N0X2NoaWxkX3Byb3h5X3NldF9wcm9wZXJ0eSAoZXF1LCAiYmFuZDE6OmdhaW4iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORDI6CisgICAgICBnc3RfY2hpbGRfcHJveHlfc2V0X3Byb3BlcnR5IChlcXUsICJiYW5kMjo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9paXJfZXF1YWxpemVyXzNiYW5kc19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0Q2hpbGRQcm94eSAqZXF1ID0gR1NUX0NISUxEX1BST1hZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9CQU5EMDoKKyAgICAgIGdzdF9jaGlsZF9wcm94eV9nZXRfcHJvcGVydHkgKGVxdSwgImJhbmQwOjpnYWluIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkQxOgorICAgICAgZ3N0X2NoaWxkX3Byb3h5X2dldF9wcm9wZXJ0eSAoZXF1LCAiYmFuZDE6OmdhaW4iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORDI6CisgICAgICBnc3RfY2hpbGRfcHJveHlfZ2V0X3Byb3BlcnR5IChlcXUsICJiYW5kMjo6Z2FpbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVyM2JhbmRzLmggYi9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OTBmY2EKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcjNiYW5kcy5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfSUlSX0VRVUFMSVpFUl8zQkFORFNfXworI2RlZmluZSBfX0dTVF9JSVJfRVFVQUxJWkVSXzNCQU5EU19fCisKKyNpbmNsdWRlICJnc3RpaXJlcXVhbGl6ZXIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdElpckVxdWFsaXplcjNCYW5kcyBHc3RJaXJFcXVhbGl6ZXIzQmFuZHM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0SWlyRXF1YWxpemVyM0JhbmRzQ2xhc3MgR3N0SWlyRXF1YWxpemVyM0JhbmRzQ2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl8zQkFORFMgXAorICAoZ3N0X2lpcl9lcXVhbGl6ZXJfM2JhbmRzX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9JSVJfRVFVQUxJWkVSXzNCQU5EUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfM0JBTkRTLEdzdElpckVxdWFsaXplcjNCYW5kcykpCisjZGVmaW5lIEdTVF9JSVJfRVFVQUxJWkVSXzNCQU5EU19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9JSVJfRVFVQUxJWkVSXzNCQU5EUyxHc3RJaXJFcXVhbGl6ZXIzQmFuZHNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19JSVJfRVFVQUxJWkVSXzNCQU5EUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfM0JBTkRTKSkKKyNkZWZpbmUgR1NUX0lTX0lJUl9FUVVBTElaRVJfM0JBTkRTX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfM0JBTkRTKSkKKworc3RydWN0IF9Hc3RJaXJFcXVhbGl6ZXIzQmFuZHMKK3sKKyAgR3N0SWlyRXF1YWxpemVyIGVxdWFsaXplcjsKK307CisKK3N0cnVjdCBfR3N0SWlyRXF1YWxpemVyM0JhbmRzQ2xhc3MKK3sKKyAgR3N0SWlyRXF1YWxpemVyQ2xhc3MgZXF1YWxpemVyX2NsYXNzOworfTsKKworZXh0ZXJuIEdUeXBlIGdzdF9paXJfZXF1YWxpemVyXzNiYW5kc19nZXRfdHlwZSh2b2lkKTsKKworI2VuZGlmIC8qIF9fR1NUX0lJUl9FUVVBTElaRVJfM0JBTkRTX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9lcXVhbGl6ZXIvZ3N0aWlyZXF1YWxpemVybmJhbmRzLmMgYi9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MzI1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5jCkBAIC0wLDAgKzEsMTY0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDQ+IEJlbmphbWluIE90dGUgPG90dGVAZ25vbWUub3JnPgorICogICAgICAgICAgICAgICA8MjAwNz4gU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWVxdWFsaXplci1uYmFuZHMKKyAqCisgKiBUaGUgbi1iYW5kIGVxdWFsaXplciBlbGVtZW50IGlzIGEgZnVsbHkgcGFyYW1ldHJpYyBlcXVhbGl6ZXIuIEl0IGFsbG93cyB0bworICogc2VsZWN0IGJldHdlZW4gMSBhbmQgNjQgYmFuZHMgYW5kIGhhcyBwcm9wZXJ0aWVzIG9uIGVhY2ggYmFuZCB0byBjaGFuZ2UKKyAqIHRoZSBjZW50ZXIgZnJlcXVlbmN5LCBiYW5kIHdpZHRoIGFuZCBnYWluLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXNvbmcub2dnICEgb2dnZGVtdXggISB2b3JiaXNkZWMgISBhdWRpb2NvbnZlcnQgISBlcXVhbGl6ZXItbmJhbmRzIG51bS1iYW5kcz0xNSBiYW5kNTo6Z2Fpbj02LjAgISBhbHNhc2luaworICogXXwgVGhpcyBtYWtlIHRoZSBlcXVhbGl6ZXIgdXNlIDE1IGJhbmRzIGFuZCByYWlzZXMgdGhlIHZvbHVtZSBvZiB0aGUgNXRoIGJhbmQgYnkgNiBkYi4KKyAqIDwvcmVmc2VjdDI+CisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBjb2RlPC90aXRsZT4KKyAqIHxbCisgKiAjaW5jbHVkZSAmbHQ7Z3N0L2dzdC5oJmd0OworICogCisgKiAuLi4KKyAqIHR5cGVkZWYgc3RydWN0IHsKKyAqICAgZ2Zsb2F0IGZyZXE7CisgKiAgIGdmbG9hdCB3aWR0aDsKKyAqICAgZ2Zsb2F0IGdhaW47CisgKiB9IEdzdEVxdWFsaXplckJhbmRTdGF0ZTsKKyAqIAorICogLi4uCisgKiAKKyAqICAgR3N0RWxlbWVudCAqZXF1YWxpemVyOworICogICBHT2JqZWN0ICpiYW5kOworICogICBnaW50IGk7CisgKiAgIEdzdEVxdWFsaXplckJhbmRTdGF0ZSBzdGF0ZVtdID0geworICogICAgIHsgMTIwLjAsICAgNTAuMCwgLSAzLjB9LAorICogICAgIHsgNTAwLjAsICAgMjAuMCwgIDEyLjB9LAorICogICAgIHsxNTAzLjAsICAgIDIuMCwgLTIwLjB9LAorICogICAgIHs2MDAwLjAsIDEwMDAuMCwgICA2LjB9LAorICogICAgIHszMDAwLjAsICAxMjAuMCwgICAyLjB9CisgKiAgIH07CisgKiAKKyAqIC4uLgorICogCisgKiAgIGVxdWFsaXplciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImVxdWFsaXplci1uYmFuZHMiLCAiZXF1YWxpemVyIik7CisgKiAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGVxdWFsaXplciksICJudW0tYmFuZHMiLCA1LCBOVUxMKTsKKyAqIAorICogLi4uCisgKiAKKyAqICAgZm9yIChpID0gMDsgaSAmbHQ7IDU7IGkrKykgeworICogICAgIGJhbmQgPSBnc3RfY2hpbGRfcHJveHlfZ2V0X2NoaWxkX2J5X2luZGV4IChHU1RfQ0hJTERfUFJPWFkgKGVxdWFsaXplciksIGkpOworICogICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGJhbmQpLCAiZnJlcSIsIHN0YXRlW2ldLmZyZXEsCisgKiAgICAgICAgICJiYW5kd2lkdGgiLCBzdGF0ZVtpXS53aWR0aCwKKyAqIAkiZ2FpbiIsIHN0YXRlW2ldLmdhaW4pOworICogICAgIGdfb2JqZWN0X3VucmVmIChHX09CSkVDVCAoYmFuZCkpOworICogICB9CisgKiAKKyAqIC4uLgorICogXXwKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0aWlyZXF1YWxpemVyLmgiCisjaW5jbHVkZSAiZ3N0aWlyZXF1YWxpemVybmJhbmRzLmgiCisKKworZW51bQoreworICBQUk9QX05VTV9CQU5EUyA9IDEKK307CisKK3N0YXRpYyB2b2lkIGdzdF9paXJfZXF1YWxpemVyX25iYW5kc19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfaWlyX2VxdWFsaXplcl9uYmFuZHNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitHU1RfREVCVUdfQ0FURUdPUllfRVhURVJOIChlcXVhbGl6ZXJfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZXF1YWxpemVyX2RlYnVnCisKKyNkZWZpbmUgZ3N0X2lpcl9lcXVhbGl6ZXJfbmJhbmRzX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdElpckVxdWFsaXplck5CYW5kcywgZ3N0X2lpcl9lcXVhbGl6ZXJfbmJhbmRzLAorICAgIEdTVF9UWVBFX0lJUl9FUVVBTElaRVIpOworCisvKiBlcXVhbGl6ZXIgaW1wbGVtZW50YXRpb24gKi8KKworc3RhdGljIHZvaWQKK2dzdF9paXJfZXF1YWxpemVyX25iYW5kc19jbGFzc19pbml0IChHc3RJaXJFcXVhbGl6ZXJOQmFuZHNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9paXJfZXF1YWxpemVyX25iYW5kc19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9paXJfZXF1YWxpemVyX25iYW5kc19nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9OVU1fQkFORFMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm51bS1iYW5kcyIsICJudW0tYmFuZHMiLAorICAgICAgICAgICJudW1iZXIgb2YgZGlmZmVyZW50IGJhbmRzIHRvIHVzZSIsIDEsIDY0LCAxMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHX1BBUkFNX0NPTlNUUlVDVCkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJOIEJhbmQgRXF1YWxpemVyIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L0F1ZGlvIiwKKyAgICAgICJEaXJlY3QgRm9ybSBJSVIgZXF1YWxpemVyIiwKKyAgICAgICJCZW5qYW1pbiBPdHRlIDxvdHRlQGdub21lLm9yZz4sIiAiIFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9paXJfZXF1YWxpemVyX25iYW5kc19pbml0IChHc3RJaXJFcXVhbGl6ZXJOQmFuZHMgKiBlcXVfbikKK3sKKyAgR3N0SWlyRXF1YWxpemVyICplcXUgPSBHU1RfSUlSX0VRVUFMSVpFUiAoZXF1X24pOworCisgIGdzdF9paXJfZXF1YWxpemVyX2NvbXB1dGVfZnJlcXVlbmNpZXMgKGVxdSwgMTApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2lpcl9lcXVhbGl6ZXJfbmJhbmRzX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RJaXJFcXVhbGl6ZXIgKmVxdSA9IEdTVF9JSVJfRVFVQUxJWkVSIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9OVU1fQkFORFM6CisgICAgICBnc3RfaWlyX2VxdWFsaXplcl9jb21wdXRlX2ZyZXF1ZW5jaWVzIChlcXUsIGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaWlyX2VxdWFsaXplcl9uYmFuZHNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdElpckVxdWFsaXplciAqZXF1ID0gR1NUX0lJUl9FUVVBTElaRVIgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX05VTV9CQU5EUzoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBlcXUtPmZyZXFfYmFuZF9jb3VudCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvZXF1YWxpemVyL2dzdGlpcmVxdWFsaXplcm5iYW5kcy5oIGIvZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTE5YTFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2VxdWFsaXplci9nc3RpaXJlcXVhbGl6ZXJuYmFuZHMuaApAQCAtMCwwICsxLDUyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDQ+IEJlbmphbWluIE90dGUgPG90dGVAZ25vbWUub3JnPgorICogICAgICAgICAgICAgICA8MjAwNz4gU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfSUlSX0VRVUFMSVpFUl9OQkFORFNfXworI2RlZmluZSBfX0dTVF9JSVJfRVFVQUxJWkVSX05CQU5EU19fCisKKyNpbmNsdWRlICJnc3RpaXJlcXVhbGl6ZXIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdElpckVxdWFsaXplck5CYW5kcyBHc3RJaXJFcXVhbGl6ZXJOQmFuZHM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0SWlyRXF1YWxpemVyTkJhbmRzQ2xhc3MgR3N0SWlyRXF1YWxpemVyTkJhbmRzQ2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfSUlSX0VRVUFMSVpFUl9OQkFORFMgXAorICAoZ3N0X2lpcl9lcXVhbGl6ZXJfbmJhbmRzX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9JSVJfRVFVQUxJWkVSX05CQU5EUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfTkJBTkRTLEdzdElpckVxdWFsaXplck5CYW5kcykpCisjZGVmaW5lIEdTVF9JSVJfRVFVQUxJWkVSX05CQU5EU19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9JSVJfRVFVQUxJWkVSX05CQU5EUyxHc3RJaXJFcXVhbGl6ZXJOQmFuZHNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19JSVJfRVFVQUxJWkVSX05CQU5EUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfTkJBTkRTKSkKKyNkZWZpbmUgR1NUX0lTX0lJUl9FUVVBTElaRVJfTkJBTkRTX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0lJUl9FUVVBTElaRVJfTkJBTkRTKSkKKworc3RydWN0IF9Hc3RJaXJFcXVhbGl6ZXJOQmFuZHMKK3sKKyAgR3N0SWlyRXF1YWxpemVyIGVxdWFsaXplcjsKK307CisKK3N0cnVjdCBfR3N0SWlyRXF1YWxpemVyTkJhbmRzQ2xhc3MKK3sKKyAgR3N0SWlyRXF1YWxpemVyQ2xhc3MgZXF1YWxpemVyX2NsYXNzOworfTsKKworZXh0ZXJuIEdUeXBlIGdzdF9paXJfZXF1YWxpemVyX25iYW5kc19nZXRfdHlwZSh2b2lkKTsKKworI2VuZGlmIC8qIF9fR1NUX0lJUl9FUVVBTElaRVJfTkJBTkRTX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9lcXVhbGl6ZXIvbWVzb24uYnVpbGQgYi9nc3QvZXF1YWxpemVyL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OTgxZmIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZXF1YWxpemVyL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTggQEAKK2VxX3NvdXJjZXMgPSBbCisgICdnc3RpaXJlcXVhbGl6ZXIuYycsCisgICdnc3RpaXJlcXVhbGl6ZXJuYmFuZHMuYycsCisgICdnc3RpaXJlcXVhbGl6ZXIzYmFuZHMuYycsCisgICdnc3RpaXJlcXVhbGl6ZXIxMGJhbmRzLmMnLAorXQorCitnc3RlcXVhbGl6ZXIgPSBsaWJyYXJ5KCdnc3RlcXVhbGl6ZXInLAorICBlcV9zb3VyY2VzLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnc3RhdWRpb19kZXAsIGxpYm1dLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQorCitpbnN0YWxsX2RhdGEoc291cmNlczogWydHc3RJaXJFcXVhbGl6ZXIzQmFuZHMucHJzJywKKyAgJ0dzdElpckVxdWFsaXplcjEwQmFuZHMucHJzJ10sIGluc3RhbGxfZGlyOiBwcmVzZXRkaXIpCmRpZmYgLS1naXQgYS9nc3QvZmx2L01ha2VmaWxlLmFtIGIvZ3N0L2Zsdi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGExMDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2Zsdi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEyIEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RmbHYubGEKKworbGliZ3N0Zmx2X2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpCitsaWJnc3RmbHZfbGFfTElCQUREID0gLWxnc3RwYnV0aWxzLUBHU1RfQVBJX1ZFUlNJT05AIC1sZ3N0YXVkaW8tQEdTVF9BUElfVkVSU0lPTkAgXAorICAgICAgICAtbGdzdHZpZGVvLUBHU1RfQVBJX1ZFUlNJT05AIC1sZ3N0dGFnLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpICQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykKK2xpYmdzdGZsdl9sYV9MREZMQUdTID0gJHtHU1RfUExVR0lOX0xERkxBR1N9CitsaWJnc3RmbHZfbGFfU09VUkNFUyA9IGdzdGZsdmRlbXV4LmMgZ3N0Zmx2bXV4LmMKKworbm9pbnN0X0hFQURFUlMgPSBnc3RmbHZkZW11eC5oIGdzdGZsdm11eC5oIGFtZmRlZnMuaCBnc3RpbmRleC5oCisKK0VYVFJBX0RJU1QgPSBnc3RpbmRleC5jIGdzdG1lbWluZGV4LmMKZGlmZiAtLWdpdCBhL2dzdC9mbHYvYW1mZGVmcy5oIGIvZ3N0L2Zsdi9hbWZkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlNzcyNQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9mbHYvYW1mZGVmcy5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBKYW4gU2NobWlkdCA8dGhheXRhbkBub3JhaXNpbi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0FNRkRFRlNfSF9fCisjZGVmaW5lIF9fQU1GREVGU19IX18KKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2RlZmluZSBBTUYwX05VTUJFUl9NQVJLRVIgMHgwCisjZGVmaW5lIEFNRjBfQk9PTEVBTl9NQVJLRVIgMHgxCisjZGVmaW5lIEFNRjBfU1RSSU5HX01BUktFUiAweDIKKyNkZWZpbmUgQU1GMF9PQkpFQ1RfTUFSS0VSIDB4MworI2RlZmluZSBBTUYwX01PVklFQ0xJUF9NQVJLRVIgMHg0IC8qIFJlc2VydmVkLCBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIEFNRjBfTlVMTF9NQVJLRVIgMHg1CisjZGVmaW5lIEFNRjBfVU5ERUZJTkVEX01BUktFUiAweDYKKyNkZWZpbmUgQU1GMF9SRUZFUkVOQ0VfTUFSS0VSIDB4NworI2RlZmluZSBBTUYwX0VDTUFfQVJSQVlfTUFSS0VSIDB4OAorI2RlZmluZSBBTUYwX09CSkVDVF9FTkRfTUFSS0VSIDB4OQorI2RlZmluZSBBTUYwX1NUUklDVF9BUlJBWV9NQVJLRVIgMHhBCisjZGVmaW5lIEFNRjBfREFURV9NQVJLRVIgMHhCCisjZGVmaW5lIEFNRjBfTE9OR19TVFJJTkdfTUFSS0VSIDB4QworI2RlZmluZSBBTUYwX1VOU1VQUE9SVEVEX01BUktFUiAweEQKKyNkZWZpbmUgQU1GMF9SRUNPUkRTRVRfTUFSS0VSIDB4RSAvKiBSZXNlcnZlZCwgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBBTUYwX1hNTF9ET0NVTUVOVF9NQVJLRVIgMHhGCisjZGVmaW5lIEFNRjBfVFlQRURfT0JKRUNUX01BUktFUiAweDEwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2Zsdi9nc3RmbHZkZW11eC5jIGIvZ3N0L2Zsdi9nc3RmbHZkZW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMGZhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZmx2L2dzdGZsdmRlbXV4LmMKQEAgLTAsMCArMSwzNjY3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IEp1bGllbiBNb3V0dGUgPGp1bGllbkBtb3V0dGUubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWZsdmRlbXV4CisgKgorICogZmx2ZGVtdXggZGVtdXhlcyBhbiBGTFYgZmlsZSBpbnRvIHRoZSBkaWZmZXJlbnQgY29udGFpbmVkIHN0cmVhbXMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249L3BhdGgvdG8vZmx2ICEgZmx2ZGVtdXggISBhdWRpb2NvbnZlcnQgISBhdXRvYXVkaW9zaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIGRlbXV4ZXMgYW4gRkxWIGZpbGUgYW5kIG91dHB1dHMgdGhlIGNvbnRhaW5lZCByYXcgYXVkaW8gc3RyZWFtcy4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0Zmx2ZGVtdXguaCIKKyNpbmNsdWRlICJnc3RmbHZtdXguaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXJlYWRlci5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJ5dGV3cml0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvcGJ1dGlscy9kZXNjcmlwdGlvbnMuaD4KKyNpbmNsdWRlIDxnc3QvcGJ1dGlscy9wYnV0aWxzLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3RhZy90YWcuaD4KKworLyogRklYTUU6IGRvbid0IHJlbHkgb24gb3duIEdzdEluZGV4ICovCisjaW5jbHVkZSAiZ3N0aW5kZXguYyIKKyNpbmNsdWRlICJnc3RtZW1pbmRleC5jIgorI2RlZmluZSBHU1RfQVNTT0NJQVRJT05fRkxBR19OT05FIEdTVF9JTkRFWF9BU1NPQ0lBVElPTl9GTEFHX05PTkUKKyNkZWZpbmUgR1NUX0FTU09DSUFUSU9OX0ZMQUdfS0VZX1VOSVQgR1NUX0lOREVYX0FTU09DSUFUSU9OX0ZMQUdfS0VZX1VOSVQKKyNkZWZpbmUgR1NUX0FTU09DSUFUSU9OX0ZMQUdfREVMVEFfVU5JVCBHU1RfSU5ERVhfQVNTT0NJQVRJT05fRkxBR19ERUxUQV9VTklUCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBmbHZfc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtZmx2IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgYXVkaW9fc3JjX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoImF1ZGlvIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFMKKyAgICAoImF1ZGlvL3gtYWRwY20sIGxheW91dCA9IChzdHJpbmcpIHN3ZiwgY2hhbm5lbHMgPSAoaW50KSB7IDEsIDIgfSwgcmF0ZSA9IChpbnQpIHsgNTUxMiwgMTEwMjUsIDIyMDUwLCA0NDEwMCB9OyAiCisgICAgICAgICJhdWRpby9tcGVnLCBtcGVndmVyc2lvbiA9IChpbnQpIDEsIGxheWVyID0gKGludCkgMywgY2hhbm5lbHMgPSAoaW50KSB7IDEsIDIgfSwgcmF0ZSA9IChpbnQpIHsgNTUxMiwgODAwMCwgMTEwMjUsIDIyMDUwLCA0NDEwMCB9LCBwYXJzZWQgPSAoYm9vbGVhbikgVFJVRTsgIgorICAgICAgICAiYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb24gPSAoaW50KSA0LCBzdHJlYW0tZm9ybWF0ID0gKHN0cmluZykgcmF3LCBmcmFtZWQgPSAoYm9vbGVhbikgVFJVRTsgIgorICAgICAgICAiYXVkaW8veC1uZWxseW1vc2VyLCBjaGFubmVscyA9IChpbnQpIHsgMSwgMiB9LCByYXRlID0gKGludCkgeyA1NTEyLCA4MDAwLCAxMTAyNSwgMTYwMDAsIDIyMDUwLCA0NDEwMCB9OyAiCisgICAgICAgICJhdWRpby94LXJhdywgZm9ybWF0ID0gKHN0cmluZykgeyBVOCwgUzE2TEUgfSwgbGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsIGNoYW5uZWxzID0gKGludCkgeyAxLCAyIH0sIHJhdGUgPSAoaW50KSB7IDU1MTIsIDExMDI1LCAyMjA1MCwgNDQxMDAgfTsgIgorICAgICAgICAiYXVkaW8veC1hbGF3LCBjaGFubmVscyA9IChpbnQpIHsgMSwgMiB9LCByYXRlID0gKGludCkgeyA1NTEyLCAxMTAyNSwgMjIwNTAsIDQ0MTAwIH07ICIKKyAgICAgICAgImF1ZGlvL3gtbXVsYXcsIGNoYW5uZWxzID0gKGludCkgeyAxLCAyIH0sIHJhdGUgPSAoaW50KSB7IDU1MTIsIDExMDI1LCAyMjA1MCwgNDQxMDAgfTsgIgorICAgICAgICAiYXVkaW8veC1zcGVleCwgY2hhbm5lbHMgPSAoaW50KSAxLCByYXRlID0gKGludCkgMTYwMDA7IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgdmlkZW9fc3JjX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInZpZGVvIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWZsYXNoLXZpZGVvLCBmbHZ2ZXJzaW9uPShpbnQpIDE7ICIKKyAgICAgICAgInZpZGVvL3gtZmxhc2gtc2NyZWVuOyAiCisgICAgICAgICJ2aWRlby94LXZwNi1mbGFzaDsgIiAidmlkZW8veC12cDYtYWxwaGE7ICIKKyAgICAgICAgInZpZGVvL3gtaDI2NCwgc3RyZWFtLWZvcm1hdD1hdmM7IikKKyAgICApOworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChmbHZkZW11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBmbHZkZW11eF9kZWJ1ZworCisjZGVmaW5lIGdzdF9mbHZfZGVtdXhfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0Rmx2RGVtdXgsIGdzdF9mbHZfZGVtdXgsIEdTVF9UWVBFX0VMRU1FTlQpOworCisvKiA5IGJ5dGVzIG9mIGhlYWRlciArIDQgYnl0ZXMgb2YgZmlyc3QgcHJldmlvdXMgdGFnIHNpemUgKi8KKyNkZWZpbmUgRkxWX0hFQURFUl9TSVpFIDEzCisvKiAxIGJ5dGUgb2YgdGFnIHR5cGUgKyAzIGJ5dGVzIG9mIHRhZyBkYXRhIHNpemUgKi8KKyNkZWZpbmUgRkxWX1RBR19UWVBFX1NJWkUgNAorCisvKiB0d28gc2Vjb25kcyAtIGNvbnNpZGVyIGR0cyBhcmUgcmVzeW5jZWQgdG8gYW5vdGhlciBiYXNlIGlmIHRoaXMgZGlmZmVyZW50ICovCisjZGVmaW5lIFJFU1lOQ19USFJFU0hPTEQgMjAwMAorCisvKiBob3cgbXVjaCBzdHJlYW0gdGltZSB0byB3YWl0IGZvciBhdWRpbyB0YWdzIHRvIGFwcGVhciBhZnRlciB3ZSBoYXZlIHZpZGVvLCBvciB2aWNlIHZlcnNhICovCisjZGVmaW5lIE5PX01PUkVfUEFEU19USFJFU0hPTEQgKDYgKiBHU1RfU0VDT05EKQorCitzdGF0aWMgZ2Jvb2xlYW4gZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1c2ggKEdzdEZsdkRlbXV4ICogZGVtdXgsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2Zsdl9kZW11eF9oYW5kbGVfc2Vla19wdWxsIChHc3RGbHZEZW11eCAqIGRlbXV4LAorICAgIEdzdEV2ZW50ICogZXZlbnQsIGdib29sZWFuIHNlZWtpbmcpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2Zsdl9kZW11eF9xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UXVlcnkgKiBxdWVyeSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2Zsdl9kZW11eF9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgR3N0SW5kZXggKmdzdF9mbHZfZGVtdXhfZ2V0X2luZGV4IChHc3RFbGVtZW50ICogZWxlbWVudCk7CisKK3N0YXRpYyB2b2lkIGdzdF9mbHZfZGVtdXhfcHVzaF90YWdzIChHc3RGbHZEZW11eCAqIGRlbXV4KTsKKworc3RhdGljIHZvaWQKK2dzdF9mbHZfZGVtdXhfcGFyc2VfYW5kX2FkZF9pbmRleF9lbnRyeSAoR3N0Rmx2RGVtdXggKiBkZW11eCwgR3N0Q2xvY2tUaW1lIHRzLAorICAgIGd1aW50NjQgcG9zLCBnYm9vbGVhbiBrZXlmcmFtZSkKK3sKKyAgR3N0SW5kZXhBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbnNbMl07CisgIEdzdEluZGV4ICppbmRleDsKKyAgR3N0SW5kZXhFbnRyeSAqZW50cnk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LAorICAgICAgImFkZGluZyBrZXk9JWQgYXNzb2NpYXRpb24gJSIgR1NUX1RJTUVfRk9STUFUICItPiAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAga2V5ZnJhbWUsIEdTVF9USU1FX0FSR1MgKHRzKSwgcG9zKTsKKworICAvKiBpZiB1cHN0cmVhbSBpcyBub3Qgc2Vla2FibGUgdGhlcmUgaXMgbm8gcG9pbnQgaW4gYnVpbGRpbmcgYW4gaW5kZXggKi8KKyAgaWYgKCFkZW11eC0+dXBzdHJlYW1fc2Vla2FibGUpCisgICAgcmV0dXJuOworCisgIGluZGV4ID0gZ3N0X2Zsdl9kZW11eF9nZXRfaW5kZXggKEdTVF9FTEVNRU5UIChkZW11eCkpOworCisgIGlmICghaW5kZXgpCisgICAgcmV0dXJuOworCisgIC8qIGVudHJ5IG1heSBhbHJlYWR5IGhhdmUgYmVlbiBhZGRlZCBiZWZvcmUsIGF2b2lkIGFkZGluZyBpbmRlZmluaXRlbHkgKi8KKyAgZW50cnkgPSBnc3RfaW5kZXhfZ2V0X2Fzc29jX2VudHJ5IChpbmRleCwgZGVtdXgtPmluZGV4X2lkLAorICAgICAgR1NUX0lOREVYX0xPT0tVUF9FWEFDVCwgR1NUX0FTU09DSUFUSU9OX0ZMQUdfTk9ORSwgR1NUX0ZPUk1BVF9CWVRFUywgcG9zKTsKKworICBpZiAoZW50cnkpIHsKKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgICAgZ2ludDY0IHRpbWUgPSAwOworICAgIGdib29sZWFuIGtleTsKKworICAgIGdzdF9pbmRleF9lbnRyeV9hc3NvY19tYXAgKGVudHJ5LCBHU1RfRk9STUFUX1RJTUUsICZ0aW1lKTsKKyAgICBrZXkgPSAhICEoR1NUX0lOREVYX0FTU09DX0ZMQUdTIChlbnRyeSkgJiBHU1RfQVNTT0NJQVRJT05fRkxBR19LRVlfVU5JVCk7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAicG9zaXRpb24gYWxyZWFkeSBtYXBwZWQgdG8gdGltZSAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgIiwga2V5ZnJhbWUgJWQiLCBHU1RfVElNRV9BUkdTICh0aW1lKSwga2V5KTsKKyAgICAvKiB0aGVyZSBpcyBub3QgcmVhbGx5IGEgd2F5IHRvIGRlbGV0ZSB0aGUgZXhpc3Rpbmcgb25lICovCisgICAgaWYgKHRpbWUgIT0gdHMgfHwga2V5ICE9ICEgIWtleWZyYW1lKQorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJtZXRhZGF0YSBtaXNtYXRjaCIpOworI2VuZGlmCisgICAgZ3N0X29iamVjdF91bnJlZiAoaW5kZXgpOworICAgIHJldHVybjsKKyAgfQorCisgIGFzc29jaWF0aW9uc1swXS5mb3JtYXQgPSBHU1RfRk9STUFUX1RJTUU7CisgIGFzc29jaWF0aW9uc1swXS52YWx1ZSA9IHRzOworICBhc3NvY2lhdGlvbnNbMV0uZm9ybWF0ID0gR1NUX0ZPUk1BVF9CWVRFUzsKKyAgYXNzb2NpYXRpb25zWzFdLnZhbHVlID0gcG9zOworCisgIGdzdF9pbmRleF9hZGRfYXNzb2NpYXRpb252IChpbmRleCwgZGVtdXgtPmluZGV4X2lkLAorICAgICAgKGtleWZyYW1lKSA/IEdTVF9BU1NPQ0lBVElPTl9GTEFHX0tFWV9VTklUIDoKKyAgICAgIEdTVF9BU1NPQ0lBVElPTl9GTEFHX0RFTFRBX1VOSVQsIDIsCisgICAgICAoY29uc3QgR3N0SW5kZXhBc3NvY2lhdGlvbiAqKSAmYXNzb2NpYXRpb25zKTsKKworICBpZiAocG9zID4gZGVtdXgtPmluZGV4X21heF9wb3MpCisgICAgZGVtdXgtPmluZGV4X21heF9wb3MgPSBwb3M7CisgIGlmICh0cyA+IGRlbXV4LT5pbmRleF9tYXhfdGltZSkKKyAgICBkZW11eC0+aW5kZXhfbWF4X3RpbWUgPSB0czsKKworICBnc3Rfb2JqZWN0X3VucmVmIChpbmRleCk7Cit9CisKK3N0YXRpYyBnY2hhciAqCitGTFZfR0VUX1NUUklORyAoR3N0Qnl0ZVJlYWRlciAqIHJlYWRlcikKK3sKKyAgZ3VpbnQxNiBzdHJpbmdfc2l6ZSA9IDA7CisgIGdjaGFyICpzdHJpbmcgPSBOVUxMOworICBjb25zdCBndWludDggKnN0ciA9IE5VTEw7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlYWRlciAhPSBOVUxMLCBOVUxMKTsKKworICBpZiAoR19VTkxJS0VMWSAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2JlIChyZWFkZXIsICZzdHJpbmdfc2l6ZSkpKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChHX1VOTElLRUxZIChzdHJpbmdfc2l6ZSA+IGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nIChyZWFkZXIpKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBzdHJpbmcgPSBnX3RyeV9tYWxsb2MwIChzdHJpbmdfc2l6ZSArIDEpOworICBpZiAoR19VTkxJS0VMWSAoIXN0cmluZykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChHX1VOTElLRUxZICghZ3N0X2J5dGVfcmVhZGVyX2dldF9kYXRhIChyZWFkZXIsIHN0cmluZ19zaXplLCAmc3RyKSkpIHsKKyAgICBnX2ZyZWUgKHN0cmluZyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBtZW1jcHkgKHN0cmluZywgc3RyLCBzdHJpbmdfc2l6ZSk7CisgIGlmICghZ191dGY4X3ZhbGlkYXRlIChzdHJpbmcsIHN0cmluZ19zaXplLCBOVUxMKSkgeworICAgIGdfZnJlZSAoc3RyaW5nKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBzdHJpbmc7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X2RlbXV4X2NoZWNrX3NlZWthYmlsaXR5IChHc3RGbHZEZW11eCAqIGRlbXV4KQoreworICBHc3RRdWVyeSAqcXVlcnk7CisgIGdpbnQ2NCBzdGFydCA9IC0xLCBzdG9wID0gLTE7CisKKyAgZGVtdXgtPnVwc3RyZWFtX3NlZWthYmxlID0gRkFMU0U7CisKKyAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X3NlZWtpbmcgKEdTVF9GT1JNQVRfQllURVMpOworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeSAoZGVtdXgtPnNpbmtwYWQsIHF1ZXJ5KSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic2Vla2luZyBxdWVyeSBmYWlsZWQiKTsKKyAgICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKyAgICByZXR1cm47CisgIH0KKworICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksIE5VTEwsICZkZW11eC0+dXBzdHJlYW1fc2Vla2FibGUsCisgICAgICAmc3RhcnQsICZzdG9wKTsKKworICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKworICAvKiB0cnkgaGFyZGVyIHRvIHF1ZXJ5IHVwc3RyZWFtIHNpemUgaWYgd2UgZGlkbid0IGdldCBpdCB0aGUgZmlyc3QgdGltZSAqLworICBpZiAoZGVtdXgtPnVwc3RyZWFtX3NlZWthYmxlICYmIHN0b3AgPT0gLTEpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImRvaW5nIGR1cmF0aW9uIHF1ZXJ5IHRvIGZpeCB1cCB1bnNldCBzdG9wIik7CisgICAgZ3N0X3BhZF9wZWVyX3F1ZXJ5X2R1cmF0aW9uIChkZW11eC0+c2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywgJnN0b3ApOworICB9CisKKyAgLyogaWYgdXBzdHJlYW0gZG9lc24ndCBrbm93IHRoZSBzaXplLCBpdCdzIGxpa2VseSB0aGF0IGl0J3Mgbm90IHNlZWthYmxlIGluCisgICAqIHByYWN0aWNlIGV2ZW4gaWYgaXQgdGVjaG5pY2FsbHkgbWF5IGJlIHNlZWthYmxlICovCisgIGlmIChkZW11eC0+dXBzdHJlYW1fc2Vla2FibGUgJiYgKHN0YXJ0ICE9IDAgfHwgc3RvcCA8PSBzdGFydCkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInNlZWthYmxlIGJ1dCB1bmtub3duIHN0YXJ0L3N0b3AgLT4gZGlzYWJsZSIpOworICAgIGRlbXV4LT51cHN0cmVhbV9zZWVrYWJsZSA9IEZBTFNFOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJ1cHN0cmVhbSBzZWVrYWJsZTogJWQiLCBkZW11eC0+dXBzdHJlYW1fc2Vla2FibGUpOworfQorCitzdGF0aWMgR3N0RGF0ZVRpbWUgKgorcGFyc2VfZmx2X2RlbXV4X3BhcnNlX2RhdGVfc3RyaW5nIChjb25zdCBnY2hhciAqIHMpCit7CisgIHN0YXRpYyBjb25zdCBnY2hhciBtb250aHNbMTJdWzRdID0geworICAgICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLAorICAgICJNYXkiLCAiSnVuIiwgIkp1bCIsICJBdWciLAorICAgICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiCisgIH07CisgIEdzdERhdGVUaW1lICpkdCA9IE5VTEw7CisgIGdjaGFyICoqdG9rZW5zOworICBndWludDY0IGQ7CisgIGdjaGFyICplbmRwdHIsICpzdHJpcHBlZDsKKyAgZ2ludCBpLCBoaCwgbW0sIHNzOworICBnaW50IHllYXIgPSAtMSwgbW9udGggPSAtMSwgZGF5ID0gLTE7CisgIGdpbnQgaG91ciA9IC0xLCBtaW51dGUgPSAtMSwgc2Vjb25kcyA9IC0xOworCisgIHN0cmlwcGVkID0gZ19zdHJzdHJpcCAoZ19zdHJkdXAgKHMpKTsKKworICAvKiAiRnJpIE9jdCAxNSAxNToxMzoxNiAyMDA0IiBuZWVkcyB0byBiZSBwYXJzZWQgKi8KKyAgdG9rZW5zID0gZ19zdHJzcGxpdCAoc3RyaXBwZWQsICIgIiwgLTEpOworCisgIGdfZnJlZSAoc3RyaXBwZWQpOworCisgIGlmIChnX3N0cnZfbGVuZ3RoICh0b2tlbnMpICE9IDUpCisgICAgZ290byBvdXQ7CisKKyAgLyogeWVhciAqLworICBkID0gZ19hc2NpaV9zdHJ0b3VsbCAodG9rZW5zWzRdLCAmZW5kcHRyLCAxMCk7CisgIGlmIChkID09IDAgJiYgKmVuZHB0ciAhPSAnXDAnKQorICAgIGdvdG8gb3V0OworCisgIHllYXIgPSBkOworCisgIC8qIG1vbnRoICovCisgIGlmIChzdHJsZW4gKHRva2Vuc1sxXSkgIT0gMykKKyAgICBnb3RvIG91dDsKKyAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKKyAgICBpZiAoIXN0cmNtcCAodG9rZW5zWzFdLCBtb250aHNbaV0pKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKGkgPT0gMTIpCisgICAgZ290byBvdXQ7CisKKyAgbW9udGggPSBpICsgMTsKKworICAvKiBkYXkgKi8KKyAgZCA9IGdfYXNjaWlfc3RydG91bGwgKHRva2Vuc1syXSwgJmVuZHB0ciwgMTApOworICBpZiAoZCA9PSAwICYmICplbmRwdHIgIT0gJ1wwJykKKyAgICBnb3RvIG91dDsKKworICBkYXkgPSBkOworCisgIC8qIHRpbWUgKi8KKyAgaGggPSBtbSA9IHNzID0gMDsKKyAgaWYgKHNzY2FuZiAodG9rZW5zWzNdLCAiJWQ6JWQ6JWQiLCAmaGgsICZtbSwgJnNzKSA8IDIpCisgICAgZ290byBvdXQ7CisgIGlmIChoaCA+PSAwICYmIGhoIDwgMjQgJiYgbW0gPj0gMCAmJiBtbSA8IDYwICYmIHNzID49IDAgJiYgc3MgPCA2MCkgeworICAgIGhvdXIgPSBoaDsKKyAgICBtaW51dGUgPSBtbTsKKyAgICBzZWNvbmRzID0gc3M7CisgIH0KKworb3V0OgorCisgIGlmICh0b2tlbnMpCisgICAgZ19zdHJmcmVldiAodG9rZW5zKTsKKworICBpZiAoeWVhciA+IDApCisgICAgZHQgPSBnc3RfZGF0ZV90aW1lX25ldyAoMC4wLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZHMpOworCisgIHJldHVybiBkdDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmx2X2RlbXV4X3BhcnNlX21ldGFkYXRhX2l0ZW0gKEdzdEZsdkRlbXV4ICogZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiByZWFkZXIsCisgICAgZ2Jvb2xlYW4gKiBlbmRfbWFya2VyKQoreworICBnY2hhciAqdGFnX25hbWUgPSBOVUxMOworICBndWludDggdGFnX3R5cGUgPSAwOworCisgIC8qIEluaXRpYWxpemUgdGhlIGVuZF9tYXJrZXIgZmxhZyB0byBGQUxTRSAqLworICAqZW5kX21hcmtlciA9IEZBTFNFOworCisgIC8qIE5hbWUgb2YgdGhlIHRhZyAqLworICB0YWdfbmFtZSA9IEZMVl9HRVRfU1RSSU5HIChyZWFkZXIpOworICBpZiAoR19VTkxJS0VMWSAoIXRhZ19uYW1lKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJmYWlsZWQgcmVhZGluZyB0YWcgbmFtZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIFdoYXQga2luZCBvZiBvYmplY3QgaXMgdGhhdCAqLworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKHJlYWRlciwgJnRhZ190eXBlKSkKKyAgICBnb3RvIGVycm9yOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAidGFnIG5hbWUgJXMsIHRhZyB0eXBlICVkIiwgdGFnX25hbWUsIHRhZ190eXBlKTsKKworICBzd2l0Y2ggKHRhZ190eXBlKSB7CisgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgLyogRG91YmxlICovCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZSBhIHVuaW9uIHRvIHJlYWQgdGhlIHVpbnQ2NCBhbmQgdGhlbiBhcyBhIGRvdWJsZSAqLworICAgICAgZ2RvdWJsZSBkID0gMDsKKworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2Zsb2F0NjRfYmUgKHJlYWRlciwgJmQpKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIiVzID0+IChkb3VibGUpICVmIiwgdGFnX25hbWUsIGQpOworCisgICAgICBpZiAoIXN0cmNtcCAodGFnX25hbWUsICJkdXJhdGlvbiIpKSB7CisgICAgICAgIGRlbXV4LT5kdXJhdGlvbiA9IGQgKiBHU1RfU0VDT05EOworCisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKGRlbXV4LT50YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgICBHU1RfVEFHX0RVUkFUSU9OLCBkZW11eC0+ZHVyYXRpb24sIE5VTEwpOworICAgICAgfSBlbHNlIGlmICghc3RyY21wICh0YWdfbmFtZSwgIkFzcGVjdFJhdGlvWCIpKSB7CisgICAgICAgIGRlbXV4LT5wYXJfeCA9IGQ7CisgICAgICAgIGRlbXV4LT5nb3RfcGFyID0gVFJVRTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAodGFnX25hbWUsICJBc3BlY3RSYXRpb1kiKSkgeworICAgICAgICBkZW11eC0+cGFyX3kgPSBkOworICAgICAgICBkZW11eC0+Z290X3BhciA9IFRSVUU7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKHRhZ19uYW1lLCAid2lkdGgiKSkgeworICAgICAgICBkZW11eC0+dyA9IGQ7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKHRhZ19uYW1lLCAiaGVpZ2h0IikpIHsKKyAgICAgICAgZGVtdXgtPmggPSBkOworICAgICAgfSBlbHNlIGlmICghc3RyY21wICh0YWdfbmFtZSwgImZyYW1lcmF0ZSIpKSB7CisgICAgICAgIGRlbXV4LT5mcmFtZXJhdGUgPSBkOworICAgICAgfSBlbHNlIGlmICghc3RyY21wICh0YWdfbmFtZSwgImF1ZGlvZGF0YXJhdGUiKSkgeworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkIChkZW11eC0+YXVkaW9fdGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICAgICAgR1NUX1RBR19OT01JTkFMX0JJVFJBVEUsIChndWludCkgKGQgKiAxMDI0KSwgTlVMTCk7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKHRhZ19uYW1lLCAidmlkZW9kYXRhcmF0ZSIpKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKGRlbXV4LT52aWRlb190YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgICBHU1RfVEFHX05PTUlOQUxfQklUUkFURSwgKGd1aW50KSAoZCAqIDEwMjQpLCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoZGVtdXgsICJUYWcgXCclc1wnIG5vdCBoYW5kbGVkIiwgdGFnX25hbWUpOworICAgICAgfQorCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgLyogQm9vbGVhbiAqLworICAgIHsKKyAgICAgIGd1aW50OCBiID0gMDsKKworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ4IChyZWFkZXIsICZiKSkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICIlcyA9PiAoYm9vbGVhbikgJWQiLCB0YWdfbmFtZSwgYik7CisKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoZGVtdXgsICJUYWcgXCclc1wnIG5vdCBoYW5kbGVkIiwgdGFnX25hbWUpOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgLyogU3RyaW5nICovCisgICAgeworICAgICAgZ2NoYXIgKnMgPSBOVUxMOworCisgICAgICBzID0gRkxWX0dFVF9TVFJJTkcgKHJlYWRlcik7CisgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIiVzID0+IChzdHJpbmcpICVzIiwgdGFnX25hbWUsIHMpOworCisgICAgICBpZiAoIXN0cmNtcCAodGFnX25hbWUsICJjcmVhdGlvbmRhdGUiKSkgeworICAgICAgICBHc3REYXRlVGltZSAqZHQ7CisKKyAgICAgICAgZHQgPSBwYXJzZV9mbHZfZGVtdXhfcGFyc2VfZGF0ZV9zdHJpbmcgKHMpOworICAgICAgICBpZiAoZHQgPT0gTlVMTCkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiRmFpbGVkIHRvIHBhcnNlICclcycgaW50byBkYXRldGltZSIsIHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKGRlbXV4LT50YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgICAgIEdTVF9UQUdfREFURV9USU1FLCBkdCwgTlVMTCk7CisgICAgICAgICAgZ3N0X2RhdGVfdGltZV91bnJlZiAoZHQpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKHRhZ19uYW1lLCAiY3JlYXRvciIpKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKGRlbXV4LT50YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgICBHU1RfVEFHX0FSVElTVCwgcywgTlVMTCk7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKHRhZ19uYW1lLCAidGl0bGUiKSkgeworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkIChkZW11eC0+dGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICAgICAgR1NUX1RBR19USVRMRSwgcywgTlVMTCk7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKHRhZ19uYW1lLCAibWV0YWRhdGFjcmVhdG9yIikpIHsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAoZGVtdXgtPnRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgICAgICAgIEdTVF9UQUdfRU5DT0RFUiwgcywgTlVMTCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKGRlbXV4LCAiVGFnIFwnJXNcJyBub3QgaGFuZGxlZCIsIHRhZ19uYW1lKTsKKyAgICAgIH0KKworICAgICAgZ19mcmVlIChzKTsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgIC8qIE9iamVjdCAqLworICAgIHsKKyAgICAgIGdib29sZWFuIGVuZF9vZl9vYmplY3RfbWFya2VyID0gRkFMU0U7CisKKyAgICAgIHdoaWxlICghZW5kX29mX29iamVjdF9tYXJrZXIpIHsKKyAgICAgICAgZ2Jvb2xlYW4gb2sgPSBnc3RfZmx2X2RlbXV4X3BhcnNlX21ldGFkYXRhX2l0ZW0gKGRlbXV4LCByZWFkZXIsCisgICAgICAgICAgICAmZW5kX29mX29iamVjdF9tYXJrZXIpOworCisgICAgICAgIGlmIChHX1VOTElLRUxZICghb2spKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgImZhaWxlZCByZWFkaW5nIGEgdGFnLCBza2lwcGluZyIpOworICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgODogICAgICAgICAgICAgICAgICAgIC8qIEVDTUEgYXJyYXkgKi8KKyAgICB7CisgICAgICBndWludDMyIG5iX2VsZW1zID0gMDsKKyAgICAgIGdib29sZWFuIGVuZF9vZl9vYmplY3RfbWFya2VyID0gRkFMU0U7CisKKyAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKHJlYWRlciwgJm5iX2VsZW1zKSkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJ0aGVyZSBhcmUgYXBwcm94LiAlZCBlbGVtZW50cyBpbiB0aGUgYXJyYXkiLAorICAgICAgICAgIG5iX2VsZW1zKTsKKworICAgICAgd2hpbGUgKCFlbmRfb2Zfb2JqZWN0X21hcmtlcikgeworICAgICAgICBnYm9vbGVhbiBvayA9IGdzdF9mbHZfZGVtdXhfcGFyc2VfbWV0YWRhdGFfaXRlbSAoZGVtdXgsIHJlYWRlciwKKyAgICAgICAgICAgICZlbmRfb2Zfb2JqZWN0X21hcmtlcik7CisKKyAgICAgICAgaWYgKEdfVU5MSUtFTFkgKCFvaykpIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiZmFpbGVkIHJlYWRpbmcgYSB0YWcsIHNraXBwaW5nIik7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA5OiAgICAgICAgICAgICAgICAgICAgLyogRW5kIG1hcmtlciAqLworICAgIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZW5kIG1hcmtlciA/Iik7CisgICAgICBpZiAodGFnX25hbWVbMF0gPT0gJ1wwJykgeworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZW5kIG1hcmtlciBkZXRlY3RlZCIpOworCisgICAgICAgICplbmRfbWFya2VyID0gVFJVRTsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMTA6ICAgICAgICAgICAgICAgICAgIC8qIEFycmF5ICovCisgICAgeworICAgICAgZ3VpbnQzMiBuYl9lbGVtcyA9IDA7CisKKyAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKHJlYWRlciwgJm5iX2VsZW1zKSkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJhcnJheSBoYXMgJWQgZWxlbWVudHMiLCBuYl9lbGVtcyk7CisKKyAgICAgIGlmICghc3RyY21wICh0YWdfbmFtZSwgInRpbWVzIikpIHsKKyAgICAgICAgaWYgKGRlbXV4LT50aW1lcykgeworICAgICAgICAgIGdfYXJyYXlfZnJlZSAoZGVtdXgtPnRpbWVzLCBUUlVFKTsKKyAgICAgICAgfQorICAgICAgICBkZW11eC0+dGltZXMgPSBnX2FycmF5X25ldyAoRkFMU0UsIFRSVUUsIHNpemVvZiAoZ2RvdWJsZSkpOworICAgICAgfSBlbHNlIGlmICghc3RyY21wICh0YWdfbmFtZSwgImZpbGVwb3NpdGlvbnMiKSkgeworICAgICAgICBpZiAoZGVtdXgtPmZpbGVwb3NpdGlvbnMpIHsKKyAgICAgICAgICBnX2FycmF5X2ZyZWUgKGRlbXV4LT5maWxlcG9zaXRpb25zLCBUUlVFKTsKKyAgICAgICAgfQorICAgICAgICBkZW11eC0+ZmlsZXBvc2l0aW9ucyA9IGdfYXJyYXlfbmV3IChGQUxTRSwgVFJVRSwgc2l6ZW9mIChnZG91YmxlKSk7CisgICAgICB9CisKKyAgICAgIHdoaWxlIChuYl9lbGVtcy0tKSB7CisgICAgICAgIGd1aW50OCBlbGVtX3R5cGUgPSAwOworCisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAocmVhZGVyLCAmZWxlbV90eXBlKSkKKyAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgIHN3aXRjaCAoZWxlbV90eXBlKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGdkb3VibGUgZDsKKworICAgICAgICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2Zsb2F0NjRfYmUgKHJlYWRlciwgJmQpKQorICAgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImVsZW1lbnQgaXMgYSBkb3VibGUgJWYiLCBkKTsKKworICAgICAgICAgICAgaWYgKCFzdHJjbXAgKHRhZ19uYW1lLCAidGltZXMiKSAmJiBkZW11eC0+dGltZXMpIHsKKyAgICAgICAgICAgICAgZ19hcnJheV9hcHBlbmRfdmFsIChkZW11eC0+dGltZXMsIGQpOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wICh0YWdfbmFtZSwgImZpbGVwb3NpdGlvbnMiKSAmJgorICAgICAgICAgICAgICAgIGRlbXV4LT5maWxlcG9zaXRpb25zKSB7CisgICAgICAgICAgICAgIGdfYXJyYXlfYXBwZW5kX3ZhbCAoZGVtdXgtPmZpbGVwb3NpdGlvbnMsIGQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAidW5zdXBwb3J0ZWQgYXJyYXkgZWxlbWVudCB0eXBlICVkIiwKKyAgICAgICAgICAgICAgICBlbGVtX3R5cGUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDExOiAgICAgICAgICAgICAgICAgICAvKiBEYXRlICovCisgICAgeworICAgICAgZ2RvdWJsZSBkID0gMDsKKyAgICAgIGdpbnQxNiBpID0gMDsKKworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2Zsb2F0NjRfYmUgKHJlYWRlciwgJmQpKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfaW50MTZfYmUgKHJlYWRlciwgJmkpKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAiJXMgPT4gKGRhdGUgYXMgYSBkb3VibGUpICVmLCB0aW1lem9uZSBvZmZzZXQgJWQiLCB0YWdfbmFtZSwgZCwgaSk7CisKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoZGVtdXgsICJUYWcgXCclc1wnIG5vdCBoYW5kbGVkIiwgdGFnX25hbWUpOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJ1bnN1cHBvcnRlZCB0YWcgdHlwZSAlZCIsIHRhZ190eXBlKTsKKyAgfQorCisgIGdfZnJlZSAodGFnX25hbWUpOworCisgIHJldHVybiBUUlVFOworCitlcnJvcjoKKyAgZ19mcmVlICh0YWdfbmFtZSk7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2Zsdl9kZW11eF9jbGVhcl90YWdzIChHc3RGbHZEZW11eCAqIGRlbXV4KQoreworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImNsZWFyaW5nIHRhZ2xpc3QiKTsKKworICBpZiAoZGVtdXgtPnRhZ2xpc3QpIHsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKGRlbXV4LT50YWdsaXN0KTsKKyAgfQorICBkZW11eC0+dGFnbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIGdzdF90YWdfbGlzdF9zZXRfc2NvcGUgKGRlbXV4LT50YWdsaXN0LCBHU1RfVEFHX1NDT1BFX0dMT0JBTCk7CisKKyAgaWYgKGRlbXV4LT5hdWRpb190YWdzKSB7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmIChkZW11eC0+YXVkaW9fdGFncyk7CisgIH0KKyAgZGVtdXgtPmF1ZGlvX3RhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgIGlmIChkZW11eC0+dmlkZW9fdGFncykgeworICAgIGdzdF90YWdfbGlzdF91bnJlZiAoZGVtdXgtPnZpZGVvX3RhZ3MpOworICB9CisgIGRlbXV4LT52aWRlb190YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbHZfZGVtdXhfcGFyc2VfdGFnX3NjcmlwdCAoR3N0Rmx2RGVtdXggKiBkZW11eCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RCeXRlUmVhZGVyIHJlYWRlcjsKKyAgZ3VpbnQ4IHR5cGUgPSAwOworICBHc3RNYXBJbmZvIG1hcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSA+PSA3LCBHU1RfRkxPV19FUlJPUik7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZyZWFkZXIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisKKyAgZ3N0X2J5dGVfcmVhZGVyX3NraXBfdW5jaGVja2VkICgmcmVhZGVyLCA3KTsKKworICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJwYXJzaW5nIGEgc2NyaXB0IHRhZyIpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAoJnJlYWRlciwgJnR5cGUpKQorICAgIGdvdG8gY2xlYW51cDsKKworICAvKiBNdXN0IGJlIHN0cmluZyAqLworICBpZiAodHlwZSA9PSAyKSB7CisgICAgZ2NoYXIgKmZ1bmN0aW9uX25hbWU7CisgICAgZ3VpbnQgaTsKKworICAgIGZ1bmN0aW9uX25hbWUgPSBGTFZfR0VUX1NUUklORyAoJnJlYWRlcik7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJmdW5jdGlvbiBuYW1lIGlzICVzIiwgR1NUX1NUUl9OVUxMIChmdW5jdGlvbl9uYW1lKSk7CisKKyAgICBpZiAoZnVuY3Rpb25fbmFtZSAhPSBOVUxMICYmIHN0cmNtcCAoZnVuY3Rpb25fbmFtZSwgIm9uTWV0YURhdGEiKSA9PSAwKSB7CisgICAgICBnYm9vbGVhbiBlbmRfbWFya2VyID0gRkFMU0U7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIndlIGhhdmUgYSBtZXRhZGF0YSBzY3JpcHQgb2JqZWN0Iik7CisKKyAgICAgIGdzdF9mbHZfZGVtdXhfY2xlYXJfdGFncyAoZGVtdXgpOworCisgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZyZWFkZXIsICZ0eXBlKSkgeworICAgICAgICBnX2ZyZWUgKGZ1bmN0aW9uX25hbWUpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIDg6CisgICAgICAgIHsKKyAgICAgICAgICBndWludDMyIG5iX2VsZW1zID0gMDsKKworICAgICAgICAgIC8qIEVDTUEgYXJyYXkgKi8KKyAgICAgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmcmVhZGVyLCAmbmJfZWxlbXMpKSB7CisgICAgICAgICAgICBnX2ZyZWUgKGZ1bmN0aW9uX25hbWUpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaXMganVzdCBhIGhpbnQsIHNvbWUgZmlsZXMgaGF2ZQorICAgICAgICAgICAgIG5iX2VsZW1lbnRzID09IDAgYW5kIGFjdHVhbGx5IGNvbnRhaW4gaXRlbXMuICovCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJ0aGVyZSBhcmUgYXBwcm94LiAlZCBlbGVtZW50cyBpbiB0aGUgYXJyYXkiLAorICAgICAgICAgICAgICBuYl9lbGVtcyk7CisgICAgICAgIH0KKyAgICAgICAgICAvKiBmYWxsdGhyb3VnaCB0byByZWFkIGRhdGEgKi8KKyAgICAgICAgY2FzZSAzOgorICAgICAgICB7CisgICAgICAgICAgLyogT2JqZWN0ICovCisgICAgICAgICAgd2hpbGUgKCFlbmRfbWFya2VyKSB7CisgICAgICAgICAgICBnYm9vbGVhbiBvayA9CisgICAgICAgICAgICAgICAgZ3N0X2Zsdl9kZW11eF9wYXJzZV9tZXRhZGF0YV9pdGVtIChkZW11eCwgJnJlYWRlciwgJmVuZF9tYXJrZXIpOworCisgICAgICAgICAgICBpZiAoR19VTkxJS0VMWSAoIW9rKSkgeworICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiZmFpbGVkIHJlYWRpbmcgYSB0YWcsIHNraXBwaW5nIik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVW5oYW5kbGVkIHNjcmlwdCBkYXRhIHR5cGUgOiAlZCIsIHR5cGUpOworICAgICAgICAgIGdfZnJlZSAoZnVuY3Rpb25fbmFtZSk7CisgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgfQorCisgICAgICBnc3RfZmx2X2RlbXV4X3B1c2hfdGFncyAoZGVtdXgpOworICAgIH0KKworICAgIGdfZnJlZSAoZnVuY3Rpb25fbmFtZSk7CisKKyAgICBpZiAoZGVtdXgtPnRpbWVzICYmIGRlbXV4LT5maWxlcG9zaXRpb25zKSB7CisgICAgICBndWludCBudW07CisKKyAgICAgIC8qIElmIGFuIGluZGV4IHdhcyBmb3VuZCwgaW5zZXJ0IGFzc29jaWF0aW9ucyAqLworICAgICAgbnVtID0gTUlOIChkZW11eC0+dGltZXMtPmxlbiwgZGVtdXgtPmZpbGVwb3NpdGlvbnMtPmxlbik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgICAgZ3VpbnQ2NCB0aW1lLCBmaWxlcG9zaXRpb247CisKKyAgICAgICAgdGltZSA9IGdfYXJyYXlfaW5kZXggKGRlbXV4LT50aW1lcywgZ2RvdWJsZSwgaSkgKiBHU1RfU0VDT05EOworICAgICAgICBmaWxlcG9zaXRpb24gPSBnX2FycmF5X2luZGV4IChkZW11eC0+ZmlsZXBvc2l0aW9ucywgZ2RvdWJsZSwgaSk7CisgICAgICAgIGdzdF9mbHZfZGVtdXhfcGFyc2VfYW5kX2FkZF9pbmRleF9lbnRyeSAoZGVtdXgsIHRpbWUsIGZpbGVwb3NpdGlvbiwKKyAgICAgICAgICAgIFRSVUUpOworICAgICAgfQorICAgICAgZGVtdXgtPmluZGV4ZWQgPSBUUlVFOworICAgIH0KKyAgfQorCitjbGVhbnVwOgorICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgoraGF2ZV9ncm91cF9pZCAoR3N0Rmx2RGVtdXggKiBkZW11eCkKK3sKKyAgR3N0RXZlbnQgKmV2ZW50OworCisgIGV2ZW50ID0gZ3N0X3BhZF9nZXRfc3RpY2t5X2V2ZW50IChkZW11eC0+c2lua3BhZCwgR1NUX0VWRU5UX1NUUkVBTV9TVEFSVCwgMCk7CisgIGlmIChldmVudCkgeworICAgIGlmIChnc3RfZXZlbnRfcGFyc2VfZ3JvdXBfaWQgKGV2ZW50LCAmZGVtdXgtPmdyb3VwX2lkKSkKKyAgICAgIGRlbXV4LT5oYXZlX2dyb3VwX2lkID0gVFJVRTsKKyAgICBlbHNlCisgICAgICBkZW11eC0+aGF2ZV9ncm91cF9pZCA9IEZBTFNFOworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICB9IGVsc2UgaWYgKCFkZW11eC0+aGF2ZV9ncm91cF9pZCkgeworICAgIGRlbXV4LT5oYXZlX2dyb3VwX2lkID0gVFJVRTsKKyAgICBkZW11eC0+Z3JvdXBfaWQgPSBnc3RfdXRpbF9ncm91cF9pZF9uZXh0ICgpOworICB9CisKKyAgcmV0dXJuIGRlbXV4LT5oYXZlX2dyb3VwX2lkOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbHZfZGVtdXhfYXVkaW9fbmVnb3RpYXRlIChHc3RGbHZEZW11eCAqIGRlbXV4LCBndWludDMyIGNvZGVjX3RhZywKKyAgICBndWludDMyIHJhdGUsIGd1aW50MzIgY2hhbm5lbHMsIGd1aW50MzIgd2lkdGgpCit7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMLCAqb2xkX2NhcHM7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworICBndWludCBhZGp1c3RlZF9yYXRlID0gcmF0ZTsKKyAgR3N0RXZlbnQgKmV2ZW50OworICBnY2hhciAqc3RyZWFtX2lkOworCisgIHN3aXRjaCAoY29kZWNfdGFnKSB7CisgICAgY2FzZSAxOgorICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LWFkcGNtIiwgImxheW91dCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgICAgInN3ZiIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgIGNhc2UgMTQ6CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL21wZWciLAorICAgICAgICAgICJtcGVndmVyc2lvbiIsIEdfVFlQRV9JTlQsIDEsICJsYXllciIsIEdfVFlQRV9JTlQsIDMsCisgICAgICAgICAgInBhcnNlZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMDoKKyAgICBjYXNlIDM6CisgICAgeworICAgICAgR3N0QXVkaW9Gb3JtYXQgZm9ybWF0OworCisgICAgICAvKiBBc3N1bWluZyBsaXR0bGUgZW5kaWFuIGZvciAwIChha2EgZW5kaWFubmVzcyBvZiB0aGUKKyAgICAgICAqIHN5c3RlbSBvbiB3aGljaCB0aGUgZmlsZSB3YXMgY3JlYXRlZCkgYXMgbW9zdCBwZW9wbGUKKyAgICAgICAqIGFyZSBwcm9iYWJseSB1c2luZyBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzICovCisgICAgICBmb3JtYXQgPSBnc3RfYXVkaW9fZm9ybWF0X2J1aWxkX2ludGVnZXIgKCh3aWR0aCA9PSA4KSA/IEZBTFNFIDogVFJVRSwKKyAgICAgICAgICBHX0xJVFRMRV9FTkRJQU4sIHdpZHRoLCB3aWR0aCk7CisKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBnc3RfYXVkaW9fZm9ybWF0X3RvX3N0cmluZyAoZm9ybWF0KSwKKyAgICAgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA0OgorICAgIGNhc2UgNToKKyAgICBjYXNlIDY6CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtbmVsbHltb3NlciIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICB7CisgICAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICAgIGlmICghZGVtdXgtPmF1ZGlvX2NvZGVjX2RhdGEpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJkb24ndCBoYXZlIEFBQyBjb2RlYyBkYXRhIHlldCIpOworICAgICAgICByZXQgPSBUUlVFOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisKKyAgICAgIGdzdF9idWZmZXJfbWFwIChkZW11eC0+YXVkaW9fY29kZWNfZGF0YSwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICAgICAgLyogdXNlIGNvZGVjLWRhdGEgdG8gZXh0cmFjdCBhbmQgdmVyaWZ5IHNhbXBsZXJhdGUgKi8KKyAgICAgIGlmIChtYXAuc2l6ZSA+PSAyKSB7CisgICAgICAgIGdpbnQgZnJlcV9pbmRleDsKKworICAgICAgICBmcmVxX2luZGV4ID0gR1NUX1JFQURfVUlOVDE2X0JFIChtYXAuZGF0YSk7CisgICAgICAgIGZyZXFfaW5kZXggPSAoZnJlcV9pbmRleCAmIDB4MDc4MCkgPj4gNzsKKyAgICAgICAgYWRqdXN0ZWRfcmF0ZSA9CisgICAgICAgICAgICBnc3RfY29kZWNfdXRpbHNfYWFjX2dldF9zYW1wbGVfcmF0ZV9mcm9tX2luZGV4IChmcmVxX2luZGV4KTsKKworICAgICAgICBpZiAoYWRqdXN0ZWRfcmF0ZSAmJiAocmF0ZSAhPSBhZGp1c3RlZF9yYXRlKSkgeworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIkFqdXN0aW5nIEFBQyBzYW1wbGUgcmF0ZSAlZCAtPiAlZCIsIHJhdGUsCisgICAgICAgICAgICAgIGFkanVzdGVkX3JhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFkanVzdGVkX3JhdGUgPSByYXRlOworICAgICAgICB9CisgICAgICB9CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChkZW11eC0+YXVkaW9fY29kZWNfZGF0YSwgJm1hcCk7CisKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8vbXBlZyIsCisgICAgICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgNCwgImZyYW1lZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLAorICAgICAgICAgICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgInJhdyIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgNzoKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC1hbGF3Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtbXVsYXciKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTE6CisgICAgeworICAgICAgR1ZhbHVlIHN0cmVhbWhlYWRlciA9IEdfVkFMVUVfSU5JVDsKKyAgICAgIEdWYWx1ZSB2YWx1ZSA9IEdfVkFMVUVfSU5JVDsKKyAgICAgIEdzdEJ5dGVXcml0ZXIgdzsKKyAgICAgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICAgICAgR3N0QnVmZmVyICpidWY7CisgICAgICBHc3RUYWdMaXN0ICp0YWdzOworCisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtc3BlZXgiKTsKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImdlbmVyYXRpbmcgc3BlZXggaGVhZGVyIik7CisKKyAgICAgIC8qIFNwZWV4IGRlY29kZXIgZXhwZWN0cyBzdHJlYW1oZWFkZXIgdG8gYmUgeyBbaGVhZGVyXSwgW2NvbW1lbnRdIH0gKi8KKyAgICAgIGdfdmFsdWVfaW5pdCAoJnN0cmVhbWhlYWRlciwgR1NUX1RZUEVfQVJSQVkpOworCisgICAgICAvKiBoZWFkZXIgcGFydCAqLworICAgICAgZ3N0X2J5dGVfd3JpdGVyX2luaXRfd2l0aF9zaXplICgmdywgODAsIFRSVUUpOworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmdywgKGd1aW50OCAqKSAiU3BlZXggICAiLCA4KTsKKyAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfZGF0YSAoJncsIChndWludDggKikgIjEuMS4xMiIsIDcpOworICAgICAgZ3N0X2J5dGVfd3JpdGVyX2ZpbGwgKCZ3LCAwLCAxMyk7CisgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJncsIDEpOyAgICAvKiB2ZXJzaW9uICovCisgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJncsIDgwKTsgICAvKiBoZWFkZXJfc2l6ZSAqLworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZ3LCAxNjAwMCk7ICAgICAgICAvKiByYXRlICovCisgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJncsIDEpOyAgICAvKiBtb2RlOiBXaWRlYmFuZCAqLworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZ3LCA0KTsgICAgLyogbW9kZV9iaXRzdHJlYW1fdmVyc2lvbiAqLworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZ3LCAxKTsgICAgLyogbmJfY2hhbm5lbHM6IDEgKi8KKyAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmdywgLTEpOyAgIC8qIGJpdHJhdGUgKi8KKyAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmdywgMHg1MCk7IC8qIGZyYW1lX3NpemUgKi8KKyAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmdywgMCk7ICAgIC8qIFZCUiAqLworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZ3LCAxKTsgICAgLyogZnJhbWVzX3Blcl9wYWNrZXQgKi8KKyAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmdywgMCk7ICAgIC8qIGV4dHJhX2hlYWRlcnMgKi8KKyAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmdywgMCk7ICAgIC8qIHJlc2VydmVkMSAqLworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZ3LCAwKTsgICAgLyogcmVzZXJ2ZWQyICovCisgICAgICBnX2Fzc2VydCAoZ3N0X2J5dGVfd3JpdGVyX2dldF9zaXplICgmdykgPT0gODApOworCisgICAgICBnX3ZhbHVlX2luaXQgKCZ2YWx1ZSwgR1NUX1RZUEVfQlVGRkVSKTsKKyAgICAgIGdfdmFsdWVfdGFrZV9ib3hlZCAoJnZhbHVlLCBnc3RfYnl0ZV93cml0ZXJfcmVzZXRfYW5kX2dldF9idWZmZXIgKCZ3KSk7CisgICAgICBnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX3ZhbHVlICgmc3RyZWFtaGVhZGVyLCAmdmFsdWUpOworICAgICAgZ192YWx1ZV91bnNldCAoJnZhbHVlKTsKKworICAgICAgLyogY29tbWVudCBwYXJ0ICovCisgICAgICBnX3ZhbHVlX2luaXQgKCZ2YWx1ZSwgR1NUX1RZUEVfQlVGRkVSKTsKKyAgICAgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgICAgYnVmID0gZ3N0X3RhZ19saXN0X3RvX3ZvcmJpc2NvbW1lbnRfYnVmZmVyICh0YWdzLCBOVUxMLCAwLCAiTm8gY29tbWVudHMiKTsKKyAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFncyk7CisgICAgICBnX3ZhbHVlX3Rha2VfYm94ZWQgKCZ2YWx1ZSwgYnVmKTsKKyAgICAgIGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfdmFsdWUgKCZzdHJlYW1oZWFkZXIsICZ2YWx1ZSk7CisgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdmFsdWUpOworCisgICAgICBnc3Rfc3RydWN0dXJlX3Rha2VfdmFsdWUgKHN0cnVjdHVyZSwgInN0cmVhbWhlYWRlciIsICZzdHJlYW1oZWFkZXIpOworCisgICAgICBjaGFubmVscyA9IDE7CisgICAgICBhZGp1c3RlZF9yYXRlID0gMTYwMDA7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJ1bnN1cHBvcnRlZCBhdWRpbyBjb2RlYyB0YWcgJXUiLCBjb2RlY190YWcpOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoIWNhcHMpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgImZhaWxlZCBjcmVhdGluZyBjYXBzIGZvciBhdWRpbyBwYWQiKTsKKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgInJhdGUiLCBHX1RZUEVfSU5ULCBhZGp1c3RlZF9yYXRlLAorICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgY2hhbm5lbHMsIE5VTEwpOworCisgIGlmIChkZW11eC0+YXVkaW9fY29kZWNfZGF0YSkgeworICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLAorICAgICAgICBkZW11eC0+YXVkaW9fY29kZWNfZGF0YSwgTlVMTCk7CisgIH0KKworICBvbGRfY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoZGVtdXgtPmF1ZGlvX3BhZCk7CisgIGlmICghb2xkX2NhcHMpIHsKKyAgICBzdHJlYW1faWQgPQorICAgICAgICBnc3RfcGFkX2NyZWF0ZV9zdHJlYW1faWQgKGRlbXV4LT5hdWRpb19wYWQsIEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwKKyAgICAgICAgImF1ZGlvIik7CisKKyAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0IChzdHJlYW1faWQpOworICAgIGlmIChoYXZlX2dyb3VwX2lkIChkZW11eCkpCisgICAgICBnc3RfZXZlbnRfc2V0X2dyb3VwX2lkIChldmVudCwgZGVtdXgtPmdyb3VwX2lkKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKGRlbXV4LT5hdWRpb19wYWQsIGV2ZW50KTsKKyAgICBnX2ZyZWUgKHN0cmVhbV9pZCk7CisgIH0KKyAgaWYgKCFvbGRfY2FwcyB8fCAhZ3N0X2NhcHNfaXNfZXF1YWwgKG9sZF9jYXBzLCBjYXBzKSkKKyAgICByZXQgPSBnc3RfcGFkX3NldF9jYXBzIChkZW11eC0+YXVkaW9fcGFkLCBjYXBzKTsKKyAgZWxzZQorICAgIHJldCA9IFRSVUU7CisKKyAgaWYgKG9sZF9jYXBzKQorICAgIGdzdF9jYXBzX3VucmVmIChvbGRfY2Fwcyk7CisKK2RvbmU6CisgIGlmIChHX0xJS0VMWSAocmV0KSkgeworICAgIC8qIFN0b3JlIHRoZSBjYXBzIHdlIGdvdCBmcm9tIHRhZ3MgKi8KKyAgICBkZW11eC0+YXVkaW9fY29kZWNfdGFnID0gY29kZWNfdGFnOworICAgIGRlbXV4LT5yYXRlID0gcmF0ZTsKKyAgICBkZW11eC0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICBkZW11eC0+d2lkdGggPSB3aWR0aDsKKworICAgIGlmIChjYXBzKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eC0+YXVkaW9fcGFkLCAic3VjY2Vzc2Z1bGx5IG5lZ290aWF0ZWQgY2FwcyAlIgorICAgICAgICAgIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICAgICAgZ3N0X2Zsdl9kZW11eF9wdXNoX3RhZ3MgKGRlbXV4KTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgtPmF1ZGlvX3BhZCwgImRlbGF5ZWQgc2V0dGluZyBjYXBzIik7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgtPmF1ZGlvX3BhZCwgImZhaWxlZCBuZWdvdGlhdGluZyBjYXBzICUiCisgICAgICAgIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKyAgfQorCisgIGlmIChjYXBzKQorICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworYmVhY2g6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2Zsdl9kZW11eF9wdXNoX3NyY19ldmVudCAoR3N0Rmx2RGVtdXggKiBkZW11eCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICBpZiAoZGVtdXgtPmF1ZGlvX3BhZCkKKyAgICByZXQgfD0gZ3N0X3BhZF9wdXNoX2V2ZW50IChkZW11eC0+YXVkaW9fcGFkLCBnc3RfZXZlbnRfcmVmIChldmVudCkpOworCisgIGlmIChkZW11eC0+dmlkZW9fcGFkKQorICAgIHJldCB8PSBnc3RfcGFkX3B1c2hfZXZlbnQgKGRlbXV4LT52aWRlb19wYWQsIGdzdF9ldmVudF9yZWYgKGV2ZW50KSk7CisKKyAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9mbHZfZGVtdXhfYWRkX2NvZGVjX3RhZyAoR3N0Rmx2RGVtdXggKiBkZW11eCwgY29uc3QgZ2NoYXIgKiB0YWcsCisgICAgR3N0UGFkICogcGFkKQoreworICBpZiAocGFkKSB7CisgICAgR3N0Q2FwcyAqY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFkKTsKKworICAgIGlmIChjYXBzKSB7CisgICAgICBnY2hhciAqY29kZWNfbmFtZSA9IGdzdF9wYl91dGlsc19nZXRfY29kZWNfZGVzY3JpcHRpb24gKGNhcHMpOworCisgICAgICBpZiAoY29kZWNfbmFtZSkgeworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkIChkZW11eC0+dGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICAgICAgdGFnLCBjb2RlY19uYW1lLCBOVUxMKTsKKyAgICAgICAgZ19mcmVlIChjb2RlY19uYW1lKTsKKyAgICAgIH0KKworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2Zsdl9kZW11eF9wdXNoX3RhZ3MgKEdzdEZsdkRlbXV4ICogZGVtdXgpCit7CisgIGdzdF9mbHZfZGVtdXhfYWRkX2NvZGVjX3RhZyAoZGVtdXgsIEdTVF9UQUdfQVVESU9fQ09ERUMsIGRlbXV4LT5hdWRpb19wYWQpOworICBnc3RfZmx2X2RlbXV4X2FkZF9jb2RlY190YWcgKGRlbXV4LCBHU1RfVEFHX1ZJREVPX0NPREVDLCBkZW11eC0+dmlkZW9fcGFkKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInB1c2hpbmcgJSIgR1NUX1BUUl9GT1JNQVQsIGRlbXV4LT50YWdsaXN0KTsKKworICBnc3RfZmx2X2RlbXV4X3B1c2hfc3JjX2V2ZW50IChkZW11eCwKKyAgICAgIGdzdF9ldmVudF9uZXdfdGFnIChnc3RfdGFnX2xpc3RfY29weSAoZGVtdXgtPnRhZ2xpc3QpKSk7CisKKyAgaWYgKGRlbXV4LT5hdWRpb19wYWQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eC0+YXVkaW9fcGFkLCAicHVzaGluZyBhdWRpbyAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgZGVtdXgtPmF1ZGlvX3RhZ3MpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoZGVtdXgtPmF1ZGlvX3BhZCwKKyAgICAgICAgZ3N0X2V2ZW50X25ld190YWcgKGdzdF90YWdfbGlzdF9jb3B5IChkZW11eC0+YXVkaW9fdGFncykpKTsKKyAgfQorCisgIGlmIChkZW11eC0+dmlkZW9fcGFkKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgtPnZpZGVvX3BhZCwgInB1c2hpbmcgdmlkZW8gJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgIGRlbXV4LT52aWRlb190YWdzKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKGRlbXV4LT52aWRlb19wYWQsCisgICAgICAgIGdzdF9ldmVudF9uZXdfdGFnIChnc3RfdGFnX2xpc3RfY29weSAoZGVtdXgtPnZpZGVvX3RhZ3MpKSk7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmx2X2RlbXV4X3VwZGF0ZV9yZXN5bmMgKEdzdEZsdkRlbXV4ICogZGVtdXgsIGd1aW50MzIgZHRzLCBnYm9vbGVhbiBkaXNjb250LAorICAgIGd1aW50MzIgKiBsYXN0LCBHc3RDbG9ja1RpbWUgKiBvZmZzZXQpCit7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworICBnaW50MzIgZGR0cyA9IGR0cyAtICpsYXN0OworICBpZiAoIWRpc2NvbnQgJiYgZGR0cyA8PSAtUkVTWU5DX1RIUkVTSE9MRCkgeworICAgIC8qIFRoZW9yZXRpY2FsbHksIHdlIHNob3VsZCB1c2Ugc3Vic3RyYWN0IHRoZSBkdXJhdGlvbiBvZiB0aGUgbGFzdCBidWZmZXIsCisgICAgICAgYnV0IHRoaXMgZGVtdXhlciBzZW5kcyBubyBkdXJhdGlvbnMgb24gYnVmZmVycywgbm90IHN1cmUgaWYgaXQgY2Fubm90CisgICAgICAga25vdywgb3IganVzdCBkb2VzIG5vdCBjYXJlIHRvIGNhbGN1bGF0ZS4gKi8KKyAgICAqb2Zmc2V0IC09IGRkdHMgKiBHU1RfTVNFQ09ORDsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAiTGFyZ2UgZHRzIGdhcCAoJSIgR19HSU5UMzJfRk9STUFUICIgbXMpLCBhc3N1bWluZyByZXN5bmMsIG9mZnNldCBub3cgJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFUICIiLCBkZHRzLCBHU1RfVElNRV9BUkdTICgqb2Zmc2V0KSk7CisKKyAgICByZXQgPSBUUlVFOworICB9CisgICpsYXN0ID0gZHRzOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZmx2X2RlbXV4X3BhcnNlX3RhZ19hdWRpbyAoR3N0Rmx2RGVtdXggKiBkZW11eCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludDMyIHB0cyA9IDAsIGNvZGVjX3RhZyA9IDAsIHJhdGUgPSA1NTEyLCB3aWR0aCA9IDgsIGNoYW5uZWxzID0gMTsKKyAgZ3VpbnQzMiBjb2RlY19kYXRhID0gMCwgcHRzX2V4dCA9IDA7CisgIGd1aW50OCBmbGFncyA9IDA7CisgIEdzdE1hcEluZm8gbWFwOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ3VpbnQ4ICpkYXRhOworCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgInBhcnNpbmcgYW4gYXVkaW8gdGFnIik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFkZW11eC0+YXVkaW9fcGFkICYmIGRlbXV4LT5ub19tb3JlX3BhZHMpKSB7CisjaWZuZGVmIEdTVF9ESVNBQkxFX0RFQlVHCisgICAgaWYgKEdfVU5MSUtFTFkgKCFkZW11eC0+bm9fYXVkaW9fd2FybmVkKSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAiU2lnbmFsZWQgbm8tbW9yZS1wYWRzIGFscmVhZHkgYnV0IGhhZCBubyBhdWRpbyBwYWQgLS0gaWdub3JpbmciKTsKKyAgICAgIGRlbXV4LT5ub19hdWRpb193YXJuZWQgPSBUUlVFOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpID09IGRlbXV4LT50YWdfc2l6ZSwKKyAgICAgIEdTVF9GTE9XX0VSUk9SKTsKKworICAvKiBFcnJvciBvdXQgb24gdGFncyB3aXRoIHRvbyBzbWFsbCBoZWFkZXJzICovCisgIGlmIChnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpIDwgMTEpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZW11eCwgIlRvbyBzbWFsbCB0YWcgc2l6ZSAoJSIgR19HU0laRV9GT1JNQVQgIikiLAorICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBkYXRhID0gbWFwLmRhdGE7CisKKyAgLyogR3JhYiBpbmZvcm1hdGlvbiBhYm91dCBhdWRpbyB0YWcgKi8KKyAgcHRzID0gR1NUX1JFQURfVUlOVDI0X0JFIChkYXRhKTsKKyAgLyogcmVhZCB0aGUgcHRzIGV4dGVuc2lvbiB0byAzMiBiaXRzIGludGVnZXIgKi8KKyAgcHRzX2V4dCA9IEdTVF9SRUFEX1VJTlQ4IChkYXRhICsgMyk7CisgIC8qIENvbWJpbmUgdGhlbSAqLworICBwdHMgfD0gcHRzX2V4dCA8PCAyNDsKKworICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJwdHMgYnl0ZXMgJTAyWCAlMDJYICUwMlggJTAyWCAoJWQpIiwgZGF0YVswXSwgZGF0YVsxXSwKKyAgICAgIGRhdGFbMl0sIGRhdGFbM10sIHB0cyk7CisKKyAgLyogU2tpcCB0aGUgc3RyZWFtIGlkIGFuZCBnbyBkaXJlY3RseSB0byB0aGUgZmxhZ3MgKi8KKyAgZmxhZ3MgPSBHU1RfUkVBRF9VSU5UOCAoZGF0YSArIDcpOworCisgIC8qIFNpbGVudGx5IHNraXAgYnVmZmVycyB3aXRoIG5vIGRhdGEgKi8KKyAgaWYgKG1hcC5zaXplID09IDExKQorICAgIGdvdG8gYmVhY2g7CisKKyAgLyogQ2hhbm5lbHMgKi8KKyAgaWYgKGZsYWdzICYgMHgwMSkgeworICAgIGNoYW5uZWxzID0gMjsKKyAgfQorICAvKiBXaWR0aCAqLworICBpZiAoZmxhZ3MgJiAweDAyKSB7CisgICAgd2lkdGggPSAxNjsKKyAgfQorICAvKiBTYW1wbGluZyByYXRlICovCisgIGlmICgoZmxhZ3MgJiAweDBDKSA9PSAweDBDKSB7CisgICAgcmF0ZSA9IDQ0MTAwOworICB9IGVsc2UgaWYgKChmbGFncyAmIDB4MEMpID09IDB4MDgpIHsKKyAgICByYXRlID0gMjIwNTA7CisgIH0gZWxzZSBpZiAoKGZsYWdzICYgMHgwQykgPT0gMHgwNCkgeworICAgIHJhdGUgPSAxMTAyNTsKKyAgfQorICAvKiBDb2RlYyB0YWcgKi8KKyAgY29kZWNfdGFnID0gZmxhZ3MgPj4gNDsKKyAgaWYgKGNvZGVjX3RhZyA9PSAxMCkgeyAgICAgICAgLyogQUFDIGhhcyBhbiBleHRyYSBieXRlIGZvciBwYWNrZXQgdHlwZSAqLworICAgIGNvZGVjX2RhdGEgPSAyOworICB9IGVsc2UgeworICAgIGNvZGVjX2RhdGEgPSAxOworICB9CisKKyAgLyogY29kZWMgdGFncyB3aXRoIHNwZWNpYWwgcmF0ZXMgKi8KKyAgaWYgKGNvZGVjX3RhZyA9PSA1IHx8IGNvZGVjX3RhZyA9PSAxNCkKKyAgICByYXRlID0gODAwMDsKKyAgZWxzZSBpZiAoKGNvZGVjX3RhZyA9PSA0KSB8fCAoY29kZWNfdGFnID09IDExKSkKKyAgICByYXRlID0gMTYwMDA7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiYXVkaW8gdGFnIHdpdGggJWQgY2hhbm5lbHMsICVkSHogc2FtcGxpbmcgcmF0ZSwgIgorICAgICAgIiVkIGJpdHMgd2lkdGgsIGNvZGVjIHRhZyAldSAoZmxhZ3MgJTAyWCkiLCBjaGFubmVscywgcmF0ZSwgd2lkdGgsCisgICAgICBjb2RlY190YWcsIGZsYWdzKTsKKworICBpZiAoY29kZWNfdGFnID09IDEwKSB7CisgICAgZ3VpbnQ4IGFhY19wYWNrZXRfdHlwZSA9IEdTVF9SRUFEX1VJTlQ4IChkYXRhICsgOCk7CisKKyAgICBzd2l0Y2ggKGFhY19wYWNrZXRfdHlwZSkgeworICAgICAgY2FzZSAwOgorICAgICAgeworICAgICAgICAvKiBBdWRpb1NwZWNpZmljQ29uZmlnIGRhdGEgKi8KKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiZ290IGFuIEFBQyBjb2RlYyBkYXRhIHBhY2tldCIpOworICAgICAgICBpZiAoZGVtdXgtPmF1ZGlvX2NvZGVjX2RhdGEpIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChkZW11eC0+YXVkaW9fY29kZWNfZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZGVtdXgtPmF1ZGlvX2NvZGVjX2RhdGEgPQorICAgICAgICAgICAgZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAoYnVmZmVyLCBHU1RfQlVGRkVSX0NPUFlfTUVNT1JZLAorICAgICAgICAgICAgNyArIGNvZGVjX2RhdGEsIGRlbXV4LT50YWdfZGF0YV9zaXplIC0gY29kZWNfZGF0YSk7CisKKyAgICAgICAgLyogVXNlIHRoYXQgYnVmZmVyIGRhdGEgaW4gdGhlIGNhcHMgKi8KKyAgICAgICAgaWYgKGRlbXV4LT5hdWRpb19wYWQpCisgICAgICAgICAgZ3N0X2Zsdl9kZW11eF9hdWRpb19uZWdvdGlhdGUgKGRlbXV4LCBjb2RlY190YWcsIHJhdGUsIGNoYW5uZWxzLAorICAgICAgICAgICAgICB3aWR0aCk7CisgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICB9CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmICghZGVtdXgtPmF1ZGlvX2NvZGVjX2RhdGEpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChkZW11eCwgImdvdCBBQUMgYXVkaW8gcGFja2V0IGJlZm9yZSBjb2RlYyBkYXRhIik7CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgICAgZ290byBiZWFjaDsKKyAgICAgICAgfQorICAgICAgICAvKiBBQUMgcmF3IHBhY2tldCAqLworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJnb3QgYSByYXcgQUFDIGF1ZGlvIHBhY2tldCIpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJpbnZhbGlkIEFBQyBwYWNrZXQgdHlwZSAldSIsCisgICAgICAgICAgICBhYWNfcGFja2V0X3R5cGUpOworICAgIH0KKyAgfQorCisgIC8qIElmIHdlIGRvbid0IGhhdmUgb3VyIGF1ZGlvIHBhZCBjcmVhdGVkLCB0aGVuIGNyZWF0ZSBpdC4gKi8KKyAgaWYgKEdfVU5MSUtFTFkgKCFkZW11eC0+YXVkaW9fcGFkKSkgeworICAgIGRlbXV4LT5hdWRpb19wYWQgPQorICAgICAgICBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlCisgICAgICAgIChHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKGRlbXV4KSwgImF1ZGlvIiksICJhdWRpbyIpOworICAgIGlmIChHX1VOTElLRUxZICghZGVtdXgtPmF1ZGlvX3BhZCkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJmYWlsZWQgY3JlYXRpbmcgYXVkaW8gcGFkIik7CisgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgIGdvdG8gYmVhY2g7CisgICAgfQorCisgICAgLyogU2V0IGZ1bmN0aW9ucyBvbiB0aGUgcGFkICovCisgICAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKGRlbXV4LT5hdWRpb19wYWQsCisgICAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx2X2RlbXV4X3F1ZXJ5KSk7CisgICAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKGRlbXV4LT5hdWRpb19wYWQsCisgICAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx2X2RlbXV4X3NyY19ldmVudCkpOworCisgICAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoZGVtdXgtPmF1ZGlvX3BhZCk7CisKKyAgICAvKiBNYWtlIGl0IGFjdGl2ZSAqLworICAgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoZGVtdXgtPmF1ZGlvX3BhZCwgVFJVRSk7CisKKyAgICAvKiBOZWdvdGlhdGUgY2FwcyAqLworICAgIGlmICghZ3N0X2Zsdl9kZW11eF9hdWRpb19uZWdvdGlhdGUgKGRlbXV4LCBjb2RlY190YWcsIHJhdGUsIGNoYW5uZWxzLAorICAgICAgICAgICAgd2lkdGgpKSB7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChkZW11eC0+YXVkaW9fcGFkKTsKKyAgICAgIGRlbXV4LT5hdWRpb19wYWQgPSBOVUxMOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICBnb3RvIGJlYWNoOworICAgIH0KKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoZGVtdXgtPmF1ZGlvX3BhZCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImNyZWF0ZWQgYXVkaW8gcGFkIHdpdGggY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgICBjYXBzKTsKKyAgICAgIGlmIChjYXBzKQorICAgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBXZSBuZWVkIHRvIHNldCBjYXBzIGJlZm9yZSBhZGRpbmcgKi8KKyAgICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoZGVtdXgpLAorICAgICAgICBnc3Rfb2JqZWN0X3JlZiAoZGVtdXgtPmF1ZGlvX3BhZCkpOworICAgIGdzdF9mbG93X2NvbWJpbmVyX2FkZF9wYWQgKGRlbXV4LT5mbG93Y29tYmluZXIsIGRlbXV4LT5hdWRpb19wYWQpOworCisgICAgLyogV2Ugb25seSBlbWl0IG5vIG1vcmUgcGFkcyB3aGVuIHdlIGhhdmUgYXVkaW8gYW5kIHZpZGVvLiBJbmRlZWQgd2UgY2FuCisgICAgICogbm90IHRydXN0IHRoZSBGTFYgaGVhZGVyIHRvIHRlbGwgdXMgaWYgdGhlcmUgd2lsbCBiZSBvbmx5IGF1ZGlvIG9yCisgICAgICogb25seSB2aWRlbyBhbmQgd2Ugd291bGQganVzdCBicmVhayBkaXNjb3Zlcnkgb2Ygc29tZSBmaWxlcyAqLworICAgIGlmIChkZW11eC0+YXVkaW9fcGFkICYmIGRlbXV4LT52aWRlb19wYWQpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZW1pdHRpbmcgbm8gbW9yZSBwYWRzIik7CisgICAgICBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgKEdTVF9FTEVNRU5UIChkZW11eCkpOworICAgICAgZGVtdXgtPm5vX21vcmVfcGFkcyA9IFRSVUU7CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgaWYgY2FwcyBoYXZlIGNoYW5nZWQgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHJhdGUgIT0gZGVtdXgtPnJhdGUgfHwgY2hhbm5lbHMgIT0gZGVtdXgtPmNoYW5uZWxzIHx8CisgICAgICAgICAgY29kZWNfdGFnICE9IGRlbXV4LT5hdWRpb19jb2RlY190YWcgfHwgd2lkdGggIT0gZGVtdXgtPndpZHRoKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiYXVkaW8gc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkLCBjaGFuZ2luZyBjYXBzIik7CisKKyAgICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZkZW11eC0+YXVkaW9fY29kZWNfZGF0YSwgTlVMTCk7CisKKyAgICAvKiBOZWdvdGlhdGUgY2FwcyAqLworICAgIGlmICghZ3N0X2Zsdl9kZW11eF9hdWRpb19uZWdvdGlhdGUgKGRlbXV4LCBjb2RlY190YWcsIHJhdGUsIGNoYW5uZWxzLAorICAgICAgICAgICAgd2lkdGgpKSB7CisgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgIGdvdG8gYmVhY2g7CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhbnl0aGluZyB0byBwdXNoICovCisgIGlmIChkZW11eC0+dGFnX2RhdGFfc2l6ZSA8PSBjb2RlY19kYXRhKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiTm90aGluZyBsZWZ0IGluIHRoaXMgdGFnLCByZXR1cm5pbmciKTsKKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgLyogQ3JlYXRlIGJ1ZmZlciBmcm9tIHBhZCAqLworICBvdXRidWYgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9NRU1PUlksCisgICAgICA3ICsgY29kZWNfZGF0YSwgZGVtdXgtPnRhZ19kYXRhX3NpemUgLSBjb2RlY19kYXRhKTsKKworICAvKiBkZXRlY3QgKGFuZCBkZWVtIHRvIGJlIHJlc3luY3MpICBsYXJnZSBwdHMgZ2FwcyAqLworICBpZiAoZ3N0X2Zsdl9kZW11eF91cGRhdGVfcmVzeW5jIChkZW11eCwgcHRzLCBkZW11eC0+YXVkaW9fbmVlZF9kaXNjb250LAorICAgICAgICAgICZkZW11eC0+bGFzdF9hdWRpb19wdHMsICZkZW11eC0+YXVkaW9fdGltZV9vZmZzZXQpKSB7CisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfUkVTWU5DKTsKKyAgfQorCisgIC8qIEZpbGwgYnVmZmVyIHdpdGggZGF0YSAqLworICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA9IHB0cyAqIEdTVF9NU0VDT05EICsgZGVtdXgtPmF1ZGlvX3RpbWVfb2Zmc2V0OworICBHU1RfQlVGRkVSX0RUUyAob3V0YnVmKSA9IEdTVF9CVUZGRVJfUFRTIChvdXRidWYpOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBkZW11eC0+YXVkaW9fb2Zmc2V0Kys7CisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAob3V0YnVmKSA9IGRlbXV4LT5hdWRpb19vZmZzZXQ7CisKKyAgaWYgKGRlbXV4LT5kdXJhdGlvbiA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FIHx8CisgICAgICBkZW11eC0+ZHVyYXRpb24gPCBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSkKKyAgICBkZW11eC0+ZHVyYXRpb24gPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKTsKKworICAvKiBPbmx5IGFkZCBhdWRpbyBmcmFtZXMgdG8gdGhlIGluZGV4IGlmIHdlIGhhdmUgbm8gdmlkZW8sCisgICAqIGFuZCBpZiB0aGUgaW5kZXggaXMgbm90IHlldCBjb21wbGV0ZSAqLworICBpZiAoIWRlbXV4LT5oYXNfdmlkZW8gJiYgIWRlbXV4LT5pbmRleGVkKSB7CisgICAgZ3N0X2Zsdl9kZW11eF9wYXJzZV9hbmRfYWRkX2luZGV4X2VudHJ5IChkZW11eCwKKyAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZiksIGRlbXV4LT5jdXJfdGFnX29mZnNldCwgVFJVRSk7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoZGVtdXgtPmF1ZGlvX25lZWRfZGlzY29udCkpIHsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICBkZW11eC0+YXVkaW9fbmVlZF9kaXNjb250ID0gRkFMU0U7CisgIH0KKworICBkZW11eC0+c2VnbWVudC5wb3NpdGlvbiA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpOworCisgIC8qIERvIHdlIG5lZWQgYSBuZXdzZWdtZW50IGV2ZW50ID8gKi8KKyAgaWYgKEdfVU5MSUtFTFkgKGRlbXV4LT5hdWRpb19uZWVkX3NlZ21lbnQpKSB7CisgICAgaWYgKCFkZW11eC0+bmV3X3NlZ19ldmVudCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJwdXNoaW5nIG5ld3NlZ21lbnQgZnJvbSAlIgorICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+c2VnbWVudC5wb3NpdGlvbiksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZGVtdXgtPnNlZ21lbnQuc3RvcCkpOworICAgICAgZGVtdXgtPnNlZ21lbnQuc3RhcnQgPSBkZW11eC0+c2VnbWVudC50aW1lID0gZGVtdXgtPnNlZ21lbnQucG9zaXRpb247CisgICAgICBkZW11eC0+bmV3X3NlZ19ldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmRlbXV4LT5zZWdtZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJwdXNoaW5nIHByZS1nZW5lcmF0ZWQgbmV3c2VnbWVudCBldmVudCIpOworICAgIH0KKworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoZGVtdXgtPmF1ZGlvX3BhZCwgZ3N0X2V2ZW50X3JlZiAoZGVtdXgtPm5ld19zZWdfZXZlbnQpKTsKKworICAgIGRlbXV4LT5hdWRpb19uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwKKyAgICAgICJwdXNoaW5nICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgYnVmZmVyIGF0IHB0cyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIgd2l0aCBkdXJhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQgIiwgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWYpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSksIEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpKTsKKworICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkZW11eC0+YXVkaW9fc3RhcnQpKSB7CisgICAgZGVtdXgtPmF1ZGlvX3N0YXJ0ID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1Zik7CisgIH0KKyAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZGVtdXgtPmF1ZGlvX2ZpcnN0X3RzKSkgeworICAgIGRlbXV4LT5hdWRpb19maXJzdF90cyA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpOworICB9CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFkZW11eC0+bm9fbW9yZV9wYWRzCisgICAgICAgICAgJiYgKEdTVF9DTE9DS19ESUZGIChkZW11eC0+YXVkaW9fc3RhcnQsCisgICAgICAgICAgICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSkgPiBOT19NT1JFX1BBRFNfVEhSRVNIT0xEKSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgIlNpZ25hbGxpbmcgbm8tbW9yZS1wYWRzIGJlY2F1c2Ugbm8gdmlkZW8gc3RyZWFtIHdhcyBmb3VuZCIKKyAgICAgICAgIiBhZnRlciA2IHNlY29uZHMgb2YgYXVkaW8iKTsKKyAgICBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgKEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSk7CisgICAgZGVtdXgtPm5vX21vcmVfcGFkcyA9IFRSVUU7CisgIH0KKworICAvKiBQdXNoIGRvd25zdHJlYW0gKi8KKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChkZW11eC0+YXVkaW9fcGFkLCBvdXRidWYpOworCisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spICYmCisgICAgICBkZW11eC0+c2VnbWVudC5yYXRlIDwgMC4wICYmIHJldCA9PSBHU1RfRkxPV19FT1MgJiYKKyAgICAgIGRlbXV4LT5zZWdtZW50LnBvc2l0aW9uID4gZGVtdXgtPnNlZ21lbnQuc3RvcCkgeworICAgIC8qIEluIHJldmVyc2UgcGxheWJhY2sgd2UgY2FuIGdldCBhIEdTVF9GTE9XX0VPUyB3aGVuCisgICAgICogd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHNlZ21lbnQsIHNvIHdlIGp1c3QgbmVlZCB0byBqdW1wCisgICAgICogYmFjayB0byB0aGUgcHJldmlvdXMgc2VjdGlvbi4gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImRvd25zdHJlYW0gaGFzIHJlYWNoZWQgZW5kIG9mIHNlZ21lbnQiKTsKKyAgICBkZW11eC0+YXVkaW9fZG9uZSA9IFRSVUU7CisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIHJldCA9IGdzdF9mbG93X2NvbWJpbmVyX3VwZGF0ZV9wYWRfZmxvdyAoZGVtdXgtPmZsb3djb21iaW5lciwKKyAgICAgIGRlbXV4LT5hdWRpb19wYWQsIHJldCk7CisKK2JlYWNoOgorICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2Zsdl9kZW11eF92aWRlb19uZWdvdGlhdGUgKEdzdEZsdkRlbXV4ICogZGVtdXgsIGd1aW50MzIgY29kZWNfdGFnKQoreworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEwsICpvbGRfY2FwczsKKyAgR3N0RXZlbnQgKmV2ZW50OworICBnY2hhciAqc3RyZWFtX2lkOworCisgIC8qIEdlbmVyYXRlIGNhcHMgZm9yIHRoYXQgcGFkICovCisgIHN3aXRjaCAoY29kZWNfdGFnKSB7CisgICAgY2FzZSAyOgorICAgICAgY2FwcyA9CisgICAgICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtZmxhc2gtdmlkZW8iLCAiZmx2dmVyc2lvbiIsIEdfVFlQRV9JTlQsCisgICAgICAgICAgMSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtZmxhc2gtc2NyZWVuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtdnA2LWZsYXNoIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtdnA2LWFscGhhIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICBpZiAoIWRlbXV4LT52aWRlb19jb2RlY19kYXRhKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZG9uJ3QgaGF2ZSBoMjY0IGNvZGVjIGRhdGEgeWV0Iik7CisgICAgICAgIHJldCA9IFRSVUU7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICAgIGNhcHMgPQorICAgICAgICAgIGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWgyNjQiLCAic3RyZWFtLWZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgICAgImF2YyIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgICAvKiBUaGUgZm9sbG93aW5nIHR3byBhcmUgbm9uLXN0YW5kYXJkIGJ1dCBhcHBhcmVudGx5IHVzZWQsIHNlZSBpbiBmZm1wZWcKKyAgICAgICAqIGh0dHBzOi8vZ2l0LnZpZGVvbGFuLm9yZy8/cD1mZm1wZWcuZ2l0O2E9YmxvYjtmPWxpYmF2Zm9ybWF0L2ZsdmRlYy5jO2g9MmJmMWUwNTllMWNiZWViNzllNGFmOTU0MmRhMjNmNDU2MGUxY2Y1OTtoYj1iMThkNmM1ODAwMGJlZWQ4NzJkNmJiMWZlN2QwZmJlNzVhZTI2YWVmI2wyNTQKKyAgICAgICAqIGh0dHBzOi8vZ2l0LnZpZGVvbGFuLm9yZy8/cD1mZm1wZWcuZ2l0O2E9YmxvYjtmPWxpYmF2Zm9ybWF0L2ZsdmRlYy5jO2g9MmJmMWUwNTllMWNiZWViNzllNGFmOTU0MmRhMjNmNDU2MGUxY2Y1OTtoYj1iMThkNmM1ODAwMGJlZWQ4NzJkNmJiMWZlN2QwZmJlNzVhZTI2YWVmI2wyODIKKyAgICAgICAqLworICAgIGNhc2UgODoKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8veC1oMjYzIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDk6CisgICAgICBjYXBzID0KKyAgICAgICAgICBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8vbXBlZyIsICJtcGVndmVyc2lvbiIsIEdfVFlQRV9JTlQsIDQsCisgICAgICAgICAgInN5c3RlbXN0cmVhbSIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgInVuc3VwcG9ydGVkIHZpZGVvIGNvZGVjIHRhZyAldSIsIGNvZGVjX3RhZyk7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoIWNhcHMpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgImZhaWxlZCBjcmVhdGluZyBjYXBzIGZvciB2aWRlbyBwYWQiKTsKKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgaWYgKGRlbXV4LT5nb3RfcGFyKSB7CisgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgInBpeGVsLWFzcGVjdC1yYXRpbyIsIEdTVF9UWVBFX0ZSQUNUSU9OLAorICAgICAgICBkZW11eC0+cGFyX3gsIGRlbXV4LT5wYXJfeSwgTlVMTCk7CisgIH0KKworICBpZiAoR19MSUtFTFkgKGRlbXV4LT53KSkgeworICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIGRlbXV4LT53LCBOVUxMKTsKKyAgfQorCisgIGlmIChHX0xJS0VMWSAoZGVtdXgtPmgpKSB7CisgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImhlaWdodCIsIEdfVFlQRV9JTlQsIGRlbXV4LT5oLCBOVUxMKTsKKyAgfQorCisgIGlmIChHX0xJS0VMWSAoZGVtdXgtPmZyYW1lcmF0ZSkpIHsKKyAgICBnaW50IG51bSA9IDAsIGRlbiA9IDA7CisKKyAgICBnc3RfdmlkZW9fZ3Vlc3NfZnJhbWVyYXRlIChHU1RfU0VDT05EIC8gZGVtdXgtPmZyYW1lcmF0ZSwgJm51bSwgJmRlbik7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgtPnZpZGVvX3BhZCwKKyAgICAgICAgImZwcyB0byBiZSB1c2VkIG9uIGNhcHMgJWYgKGFzIGEgZnJhY3Rpb24gPSAlZC8lZCkiLCBkZW11eC0+ZnJhbWVyYXRlLAorICAgICAgICBudW0sIGRlbik7CisKKyAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sIG51bSwgZGVuLCBOVUxMKTsKKyAgfQorCisgIGlmIChkZW11eC0+dmlkZW9fY29kZWNfZGF0YSkgeworICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLAorICAgICAgICBkZW11eC0+dmlkZW9fY29kZWNfZGF0YSwgTlVMTCk7CisgIH0KKworICBvbGRfY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoZGVtdXgtPnZpZGVvX3BhZCk7CisgIGlmICghb2xkX2NhcHMpIHsKKyAgICBzdHJlYW1faWQgPQorICAgICAgICBnc3RfcGFkX2NyZWF0ZV9zdHJlYW1faWQgKGRlbXV4LT52aWRlb19wYWQsIEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwKKyAgICAgICAgInZpZGVvIik7CisgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoc3RyZWFtX2lkKTsKKyAgICBnX2ZyZWUgKHN0cmVhbV9pZCk7CisKKyAgICBpZiAoaGF2ZV9ncm91cF9pZCAoZGVtdXgpKQorICAgICAgZ3N0X2V2ZW50X3NldF9ncm91cF9pZCAoZXZlbnQsIGRlbXV4LT5ncm91cF9pZCk7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChkZW11eC0+dmlkZW9fcGFkLCBldmVudCk7CisgIH0KKworICBpZiAoIW9sZF9jYXBzIHx8ICFnc3RfY2Fwc19pc19lcXVhbCAob2xkX2NhcHMsIGNhcHMpKQorICAgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKGRlbXV4LT52aWRlb19wYWQsIGNhcHMpOworICBlbHNlCisgICAgcmV0ID0gVFJVRTsKKworICBpZiAob2xkX2NhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKG9sZF9jYXBzKTsKKworZG9uZToKKyAgaWYgKEdfTElLRUxZIChyZXQpKSB7CisgICAgLyogU3RvcmUgdGhlIGNhcHMgd2UgaGF2ZSBzZXQgKi8KKyAgICBkZW11eC0+dmlkZW9fY29kZWNfdGFnID0gY29kZWNfdGFnOworCisgICAgaWYgKGNhcHMpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LT52aWRlb19wYWQsICJzdWNjZXNzZnVsbHkgbmVnb3RpYXRlZCBjYXBzICUiCisgICAgICAgICAgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgICAgICBnc3RfZmx2X2RlbXV4X3B1c2hfdGFncyAoZGVtdXgpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eC0+dmlkZW9fcGFkLCAiZGVsYXllZCBzZXR0aW5nIGNhcHMiKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eC0+dmlkZW9fcGFkLCAiZmFpbGVkIG5lZ290aWF0aW5nIGNhcHMgJSIKKyAgICAgICAgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworICB9CisKKyAgaWYgKGNhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCitiZWFjaDoKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbHZfZGVtdXhfcGFyc2VfdGFnX3ZpZGVvIChHc3RGbHZEZW11eCAqIGRlbXV4LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGd1aW50MzIgZHRzID0gMCwgY29kZWNfZGF0YSA9IDEsIGR0c19leHQgPSAwOworICBnaW50MzIgY3RzID0gMDsKKyAgZ2Jvb2xlYW4ga2V5ZnJhbWUgPSBGQUxTRTsKKyAgZ3VpbnQ4IGZsYWdzID0gMCwgY29kZWNfdGFnID0gMDsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmRhdGE7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikgPT0gZGVtdXgtPnRhZ19zaXplLAorICAgICAgR1NUX0ZMT1dfRVJST1IpOworCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgInBhcnNpbmcgYSB2aWRlbyB0YWciKTsKKworICBpZiBHX1VOTElLRUxZCisgICAgKCFkZW11eC0+dmlkZW9fcGFkICYmIGRlbXV4LT5ub19tb3JlX3BhZHMpIHsKKyNpZm5kZWYgR1NUX0RJU0FCTEVfREVCVUcKKyAgICBpZiBHX1VOTElLRUxZCisgICAgICAoIWRlbXV4LT5ub192aWRlb193YXJuZWQpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgIlNpZ25hbGVkIG5vLW1vcmUtcGFkcyBhbHJlYWR5IGJ1dCBoYWQgbm8gdmlkZW8gcGFkIC0tIGlnbm9yaW5nIik7CisgICAgICBkZW11eC0+bm9fdmlkZW9fd2FybmVkID0gVFJVRTsKKyAgICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgICB9CisKKyAgaWYgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikgPCAxMikgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlbXV4LCAiVG9vIHNtYWxsIHRhZyBzaXplIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworCisgIC8qIEdyYWIgaW5mb3JtYXRpb24gYWJvdXQgdmlkZW8gdGFnICovCisgIGR0cyA9IEdTVF9SRUFEX1VJTlQyNF9CRSAoZGF0YSk7CisgIC8qIHJlYWQgdGhlIGR0cyBleHRlbnNpb24gdG8gMzIgYml0cyBpbnRlZ2VyICovCisgIGR0c19leHQgPSBHU1RfUkVBRF9VSU5UOCAoZGF0YSArIDMpOworICAvKiBDb21iaW5lIHRoZW0gKi8KKyAgZHRzIHw9IGR0c19leHQgPDwgMjQ7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiZHRzIGJ5dGVzICUwMlggJTAyWCAlMDJYICUwMlggKCVkKSIsIGRhdGFbMF0sIGRhdGFbMV0sCisgICAgICBkYXRhWzJdLCBkYXRhWzNdLCBkdHMpOworCisgIC8qIFNraXAgdGhlIHN0cmVhbSBpZCBhbmQgZ28gZGlyZWN0bHkgdG8gdGhlIGZsYWdzICovCisgIGZsYWdzID0gR1NUX1JFQURfVUlOVDggKGRhdGEgKyA3KTsKKworICAvKiBLZXlmcmFtZSAqLworICBpZiAoKGZsYWdzID4+IDQpID09IDEpIHsKKyAgICBrZXlmcmFtZSA9IFRSVUU7CisgIH0KKyAgLyogQ29kZWMgdGFnICovCisgIGNvZGVjX3RhZyA9IGZsYWdzICYgMHgwRjsKKyAgaWYgKGNvZGVjX3RhZyA9PSA0IHx8IGNvZGVjX3RhZyA9PSA1KSB7CisgICAgY29kZWNfZGF0YSA9IDI7CisgIH0gZWxzZSBpZiAoY29kZWNfdGFnID09IDcpIHsKKyAgICBjb2RlY19kYXRhID0gNTsKKworICAgIGN0cyA9IEdTVF9SRUFEX1VJTlQyNF9CRSAoZGF0YSArIDkpOworICAgIGN0cyA9IChjdHMgKyAweGZmODAwMDAwKSBeIDB4ZmY4MDAwMDA7CisKKyAgICBpZiAoY3RzIDwgMCAmJiBBQlMgKGN0cykgPiBkdHMpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlbXV4LCAiRGV0ZWN0ZWQgYSBuZWdhdGl2ZSBjb21wb3NpdGlvbiB0aW1lIG9mZnNldCAiCisgICAgICAgICAgIiclZCcgdGhhdCB3b3VsZCBsZWFkIHRvIG5lZ2F0aXZlIFBUUywgZml4aW5nIiwgY3RzKTsKKyAgICAgIGN0cyArPSBBQlMgKGN0cykgLSBkdHM7CisgICAgfQorCisgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiZ290IGN0cyAlZCIsIGN0cyk7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJ2aWRlbyB0YWcgd2l0aCBjb2RlYyB0YWcgJXUsIGtleWZyYW1lICglZCkgIgorICAgICAgIihmbGFncyAlMDJYKSIsIGNvZGVjX3RhZywga2V5ZnJhbWUsIGZsYWdzKTsKKworICBpZiAoY29kZWNfdGFnID09IDcpIHsKKyAgICBndWludDggYXZjX3BhY2tldF90eXBlID0gR1NUX1JFQURfVUlOVDggKGRhdGEgKyA4KTsKKworICAgIHN3aXRjaCAoYXZjX3BhY2tldF90eXBlKSB7CisgICAgICBjYXNlIDA6CisgICAgICB7CisgICAgICAgIGlmIChkZW11eC0+dGFnX2RhdGFfc2l6ZSA8IGNvZGVjX2RhdGEpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChkZW11eCwgIkdvdCBpbnZhbGlkIEguMjY0IGNvZGVjLCBpZ25vcmluZy4iKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkIGRhdGEgKi8KKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiZ290IGFuIEguMjY0IGNvZGVjIGRhdGEgcGFja2V0Iik7CisgICAgICAgIGlmIChkZW11eC0+dmlkZW9fY29kZWNfZGF0YSkgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGRlbXV4LT52aWRlb19jb2RlY19kYXRhKTsKKyAgICAgICAgfQorICAgICAgICBkZW11eC0+dmlkZW9fY29kZWNfZGF0YSA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKGJ1ZmZlciwKKyAgICAgICAgICAgIEdTVF9CVUZGRVJfQ09QWV9NRU1PUlksIDcgKyBjb2RlY19kYXRhLAorICAgICAgICAgICAgZGVtdXgtPnRhZ19kYXRhX3NpemUgLSBjb2RlY19kYXRhKTs7CisgICAgICAgIC8qIFVzZSB0aGF0IGJ1ZmZlciBkYXRhIGluIHRoZSBjYXBzICovCisgICAgICAgIGlmIChkZW11eC0+dmlkZW9fcGFkKQorICAgICAgICAgIGdzdF9mbHZfZGVtdXhfdmlkZW9fbmVnb3RpYXRlIChkZW11eCwgY29kZWNfdGFnKTsKKyAgICAgICAgZ290byBiZWFjaDsKKyAgICAgIH0KKyAgICAgIGNhc2UgMToKKyAgICAgICAgLyogSC4yNjQgTkFMVSBwYWNrZXQgKi8KKyAgICAgICAgaWYgKCFkZW11eC0+dmlkZW9fY29kZWNfZGF0YSkgeworICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlbXV4LCAiZ290IEguMjY0IHZpZGVvIHBhY2tldCBiZWZvcmUgY29kZWMgZGF0YSIpOworICAgICAgICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICAgIH0KKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiZ290IGEgSC4yNjQgTkFMVSB2aWRlbyBwYWNrZXQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiaW52YWxpZCB2aWRlbyBwYWNrZXQgdHlwZSAldSIsCisgICAgICAgICAgICBhdmNfcGFja2V0X3R5cGUpOworICAgIH0KKyAgfQorCisgIC8qIElmIHdlIGRvbid0IGhhdmUgb3VyIHZpZGVvIHBhZCBjcmVhdGVkLCB0aGVuIGNyZWF0ZSBpdC4gKi8KKyAgaWYgKEdfVU5MSUtFTFkgKCFkZW11eC0+dmlkZW9fcGFkKSkgeworICAgIGRlbXV4LT52aWRlb19wYWQgPQorICAgICAgICBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlCisgICAgICAgIChHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKGRlbXV4KSwgInZpZGVvIiksICJ2aWRlbyIpOworICAgIGlmIChHX1VOTElLRUxZICghZGVtdXgtPnZpZGVvX3BhZCkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJmYWlsZWQgY3JlYXRpbmcgdmlkZW8gcGFkIik7CisgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgIGdvdG8gYmVhY2g7CisgICAgfQorCisgICAgLyogU2V0IGZ1bmN0aW9ucyBvbiB0aGUgcGFkICovCisgICAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKGRlbXV4LT52aWRlb19wYWQsCisgICAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx2X2RlbXV4X3F1ZXJ5KSk7CisgICAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKGRlbXV4LT52aWRlb19wYWQsCisgICAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx2X2RlbXV4X3NyY19ldmVudCkpOworCisgICAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoZGVtdXgtPnZpZGVvX3BhZCk7CisKKyAgICAvKiBNYWtlIGl0IGFjdGl2ZSAqLworICAgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoZGVtdXgtPnZpZGVvX3BhZCwgVFJVRSk7CisKKyAgICAvKiBOZWVkcyB0byBiZSBhY3RpdmUgYmVmb3JlIHNldHRpbmcgY2FwcyAqLworICAgIGlmICghZ3N0X2Zsdl9kZW11eF92aWRlb19uZWdvdGlhdGUgKGRlbXV4LCBjb2RlY190YWcpKSB7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChkZW11eC0+dmlkZW9fcGFkKTsKKyAgICAgIGRlbXV4LT52aWRlb19wYWQgPSBOVUxMOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICBnb3RvIGJlYWNoOworICAgIH0KKworICAgIC8qIFdoZW4gd2UgdmUgc2V0IHBpeGVsLWFzcGVjdC1yYXRpbyB3ZSB1c2UgdGhhdCBib29sZWFuIHRvIGRldGVjdCBhCisgICAgICogbWV0YWRhdGEgdGFnIHRoYXQgd291bGQgY29tZSBsYXRlciBhbmQgdHJpZ2dlciBhIGNhcHMgY2hhbmdlICovCisgICAgZGVtdXgtPmdvdF9wYXIgPSBGQUxTRTsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChkZW11eC0+dmlkZW9fcGFkKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiY3JlYXRlZCB2aWRlbyBwYWQgd2l0aCBjYXBzICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICAgIGNhcHMpOworICAgICAgaWYgKGNhcHMpCisgICAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIFdlIG5lZWQgdG8gc2V0IGNhcHMgYmVmb3JlIGFkZGluZyAqLworICAgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChkZW11eCksCisgICAgICAgIGdzdF9vYmplY3RfcmVmIChkZW11eC0+dmlkZW9fcGFkKSk7CisgICAgZ3N0X2Zsb3dfY29tYmluZXJfYWRkX3BhZCAoZGVtdXgtPmZsb3djb21iaW5lciwgZGVtdXgtPnZpZGVvX3BhZCk7CisKKyAgICAvKiBXZSBvbmx5IGVtaXQgbm8gbW9yZSBwYWRzIHdoZW4gd2UgaGF2ZSBhdWRpbyBhbmQgdmlkZW8uIEluZGVlZCB3ZSBjYW4KKyAgICAgKiBub3QgdHJ1c3QgdGhlIEZMViBoZWFkZXIgdG8gdGVsbCB1cyBpZiB0aGVyZSB3aWxsIGJlIG9ubHkgYXVkaW8gb3IKKyAgICAgKiBvbmx5IHZpZGVvIGFuZCB3ZSB3b3VsZCBqdXN0IGJyZWFrIGRpc2NvdmVyeSBvZiBzb21lIGZpbGVzICovCisgICAgaWYgKGRlbXV4LT5hdWRpb19wYWQgJiYgZGVtdXgtPnZpZGVvX3BhZCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJlbWl0dGluZyBubyBtb3JlIHBhZHMiKTsKKyAgICAgIGdzdF9lbGVtZW50X25vX21vcmVfcGFkcyAoR1NUX0VMRU1FTlQgKGRlbXV4KSk7CisgICAgICBkZW11eC0+bm9fbW9yZV9wYWRzID0gVFJVRTsKKyAgICB9CisgIH0KKworICAvKiBDaGVjayBpZiBjYXBzIGhhdmUgY2hhbmdlZCAqLworICBpZiAoR19VTkxJS0VMWSAoY29kZWNfdGFnICE9IGRlbXV4LT52aWRlb19jb2RlY190YWcgfHwgZGVtdXgtPmdvdF9wYXIpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJ2aWRlbyBzZXR0aW5ncyBoYXZlIGNoYW5nZWQsIGNoYW5naW5nIGNhcHMiKTsKKyAgICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZkZW11eC0+dmlkZW9fY29kZWNfZGF0YSwgTlVMTCk7CisKKyAgICBpZiAoIWdzdF9mbHZfZGVtdXhfdmlkZW9fbmVnb3RpYXRlIChkZW11eCwgY29kZWNfdGFnKSkgeworICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICBnb3RvIGJlYWNoOworICAgIH0KKworICAgIC8qIFdoZW4gd2UgdmUgc2V0IHBpeGVsLWFzcGVjdC1yYXRpbyB3ZSB1c2UgdGhhdCBib29sZWFuIHRvIGRldGVjdCBhCisgICAgICogbWV0YWRhdGEgdGFnIHRoYXQgd291bGQgY29tZSBsYXRlciBhbmQgdHJpZ2dlciBhIGNhcHMgY2hhbmdlICovCisgICAgZGVtdXgtPmdvdF9wYXIgPSBGQUxTRTsKKyAgfQorCisgIC8qIENoZWNrIGlmIHdlIGhhdmUgYW55dGhpbmcgdG8gcHVzaCAqLworICBpZiAoZGVtdXgtPnRhZ19kYXRhX3NpemUgPD0gY29kZWNfZGF0YSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIk5vdGhpbmcgbGVmdCBpbiB0aGlzIHRhZywgcmV0dXJuaW5nIik7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIC8qIENyZWF0ZSBidWZmZXIgZnJvbSBwYWQgKi8KKyAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAoYnVmZmVyLCBHU1RfQlVGRkVSX0NPUFlfTUVNT1JZLAorICAgICAgNyArIGNvZGVjX2RhdGEsIGRlbXV4LT50YWdfZGF0YV9zaXplIC0gY29kZWNfZGF0YSk7CisKKyAgLyogZGV0ZWN0IChhbmQgZGVlbSB0byBiZSByZXN5bmNzKSAgbGFyZ2UgZHRzIGdhcHMgKi8KKyAgaWYgKGdzdF9mbHZfZGVtdXhfdXBkYXRlX3Jlc3luYyAoZGVtdXgsIGR0cywgZGVtdXgtPnZpZGVvX25lZWRfZGlzY29udCwKKyAgICAgICAgICAmZGVtdXgtPmxhc3RfdmlkZW9fZHRzLCAmZGVtdXgtPnZpZGVvX3RpbWVfb2Zmc2V0KSkgeworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1JFU1lOQyk7CisgIH0KKworICAvKiBGaWxsIGJ1ZmZlciB3aXRoIGRhdGEgKi8KKyAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiZHRzICV1IHB0cyAldSBjdHMgJWQiLCBkdHMsIGR0cyArIGN0cywgY3RzKTsKKworICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA9CisgICAgICAoZHRzICsgY3RzKSAqIEdTVF9NU0VDT05EICsgZGVtdXgtPnZpZGVvX3RpbWVfb2Zmc2V0OworICBHU1RfQlVGRkVSX0RUUyAob3V0YnVmKSA9IGR0cyAqIEdTVF9NU0VDT05EICsgZGVtdXgtPnZpZGVvX3RpbWVfb2Zmc2V0OworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBkZW11eC0+dmlkZW9fb2Zmc2V0Kys7CisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAob3V0YnVmKSA9IGRlbXV4LT52aWRlb19vZmZzZXQ7CisKKyAgaWYgKGRlbXV4LT5kdXJhdGlvbiA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FIHx8CisgICAgICBkZW11eC0+ZHVyYXRpb24gPCBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSkKKyAgICBkZW11eC0+ZHVyYXRpb24gPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKTsKKworICBpZiAoIWtleWZyYW1lKQorICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgIGlmICghZGVtdXgtPmluZGV4ZWQpIHsKKyAgICBnc3RfZmx2X2RlbXV4X3BhcnNlX2FuZF9hZGRfaW5kZXhfZW50cnkgKGRlbXV4LAorICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSwgZGVtdXgtPmN1cl90YWdfb2Zmc2V0LCBrZXlmcmFtZSk7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoZGVtdXgtPnZpZGVvX25lZWRfZGlzY29udCkpIHsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICBkZW11eC0+dmlkZW9fbmVlZF9kaXNjb250ID0gRkFMU0U7CisgIH0KKworICBkZW11eC0+c2VnbWVudC5wb3NpdGlvbiA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpOworCisgIC8qIERvIHdlIG5lZWQgYSBuZXdzZWdtZW50IGV2ZW50ID8gKi8KKyAgaWYgKEdfVU5MSUtFTFkgKGRlbXV4LT52aWRlb19uZWVkX3NlZ21lbnQpKSB7CisgICAgaWYgKCFkZW11eC0+bmV3X3NlZ19ldmVudCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJwdXNoaW5nIG5ld3NlZ21lbnQgZnJvbSAlIgorICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+c2VnbWVudC5wb3NpdGlvbiksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZGVtdXgtPnNlZ21lbnQuc3RvcCkpOworICAgICAgZGVtdXgtPnNlZ21lbnQuc3RhcnQgPSBkZW11eC0+c2VnbWVudC50aW1lID0gZGVtdXgtPnNlZ21lbnQucG9zaXRpb247CisgICAgICBkZW11eC0+bmV3X3NlZ19ldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmRlbXV4LT5zZWdtZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJwdXNoaW5nIHByZS1nZW5lcmF0ZWQgbmV3c2VnbWVudCBldmVudCIpOworICAgIH0KKworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoZGVtdXgtPnZpZGVvX3BhZCwgZ3N0X2V2ZW50X3JlZiAoZGVtdXgtPm5ld19zZWdfZXZlbnQpKTsKKworICAgIGRlbXV4LT52aWRlb19uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwKKyAgICAgICJwdXNoaW5nICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgYnVmZmVyIGF0IGR0cyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIgd2l0aCBkdXJhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQgIiwgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICIsIGtleWZyYW1lICglZCkiLCBnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWYpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVFMgKG91dGJ1ZikpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSksIEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpLAorICAgICAga2V5ZnJhbWUpOworCisgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGRlbXV4LT52aWRlb19zdGFydCkpIHsKKyAgICBkZW11eC0+dmlkZW9fc3RhcnQgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKTsKKyAgfQorICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkZW11eC0+YXVkaW9fZmlyc3RfdHMpKSB7CisgICAgZGVtdXgtPnZpZGVvX2ZpcnN0X3RzID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1Zik7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoIWRlbXV4LT5ub19tb3JlX3BhZHMKKyAgICAgICAgICAmJiAoR1NUX0NMT0NLX0RJRkYgKGRlbXV4LT52aWRlb19zdGFydCwKKyAgICAgICAgICAgICAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpKSA+IE5PX01PUkVfUEFEU19USFJFU0hPTEQpKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAiU2lnbmFsbGluZyBuby1tb3JlLXBhZHMgYmVjYXVzZSBubyBhdWRpbyBzdHJlYW0gd2FzIGZvdW5kIgorICAgICAgICAiIGFmdGVyIDYgc2Vjb25kcyBvZiB2aWRlbyIpOworICAgIGdzdF9lbGVtZW50X25vX21vcmVfcGFkcyAoR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpKTsKKyAgICBkZW11eC0+bm9fbW9yZV9wYWRzID0gVFJVRTsKKyAgfQorCisgIC8qIFB1c2ggZG93bnN0cmVhbSAqLworICByZXQgPSBnc3RfcGFkX3B1c2ggKGRlbXV4LT52aWRlb19wYWQsIG91dGJ1Zik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykgJiYKKyAgICAgIGRlbXV4LT5zZWdtZW50LnJhdGUgPCAwLjAgJiYgcmV0ID09IEdTVF9GTE9XX0VPUyAmJgorICAgICAgZGVtdXgtPnNlZ21lbnQucG9zaXRpb24gPiBkZW11eC0+c2VnbWVudC5zdG9wKSB7CisgICAgLyogSW4gcmV2ZXJzZSBwbGF5YmFjayB3ZSBjYW4gZ2V0IGEgR1NUX0ZMT1dfRU9TIHdoZW4KKyAgICAgKiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgc2VnbWVudCwgc28gd2UganVzdCBuZWVkIHRvIGp1bXAKKyAgICAgKiBiYWNrIHRvIHRoZSBwcmV2aW91cyBzZWN0aW9uLiAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZG93bnN0cmVhbSBoYXMgcmVhY2hlZCBlbmQgb2Ygc2VnbWVudCIpOworICAgIGRlbXV4LT52aWRlb19kb25lID0gVFJVRTsKKyAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgcmV0ID0gZ3N0X2Zsb3dfY29tYmluZXJfdXBkYXRlX3BhZF9mbG93IChkZW11eC0+Zmxvd2NvbWJpbmVyLAorICAgICAgZGVtdXgtPnZpZGVvX3BhZCwgcmV0KTsKKworYmVhY2g6CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2dzdF9mbHZfZGVtdXhfcGFyc2VfdGFnX3RpbWVzdGFtcCAoR3N0Rmx2RGVtdXggKiBkZW11eCwgZ2Jvb2xlYW4gaW5kZXgsCisgICAgR3N0QnVmZmVyICogYnVmZmVyLCBzaXplX3QgKiB0YWdfc2l6ZSkKK3sKKyAgZ3VpbnQzMiBkdHMgPSAwLCBkdHNfZXh0ID0gMDsKKyAgZ3VpbnQzMiB0YWdfZGF0YV9zaXplOworICBndWludDggdHlwZTsKKyAgZ2Jvb2xlYW4ga2V5ZnJhbWUgPSBUUlVFOworICBHc3RDbG9ja1RpbWUgcmV0ID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgc2l6ZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSA+PSAxMiwKKyAgICAgIEdTVF9DTE9DS19USU1FX05PTkUpOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgc2l6ZSA9IG1hcC5zaXplOworCisgIHR5cGUgPSBkYXRhWzBdOworCisgIGlmICh0eXBlICE9IDkgJiYgdHlwZSAhPSA4ICYmIHR5cGUgIT0gMTgpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiVW5zdXBwb3J0ZWQgdGFnIHR5cGUgJXUiLCBkYXRhWzBdKTsKKyAgICBnb3RvIGV4aXQ7CisgIH0KKworICBpZiAodHlwZSA9PSA5KQorICAgIGRlbXV4LT5oYXNfdmlkZW8gPSBUUlVFOworICBlbHNlIGlmICh0eXBlID09IDgpCisgICAgZGVtdXgtPmhhc19hdWRpbyA9IFRSVUU7CisKKyAgdGFnX2RhdGFfc2l6ZSA9IEdTVF9SRUFEX1VJTlQyNF9CRSAoZGF0YSArIDEpOworCisgIGlmIChzaXplID49IHRhZ19kYXRhX3NpemUgKyAxMSArIDQpIHsKKyAgICBpZiAoR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhICsgdGFnX2RhdGFfc2l6ZSArIDExKSAhPSB0YWdfZGF0YV9zaXplICsgMTEpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJJbnZhbGlkIHRhZyBzaXplIik7CisgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICB9CisKKyAgaWYgKHRhZ19zaXplKQorICAgICp0YWdfc2l6ZSA9IHRhZ19kYXRhX3NpemUgKyAxMSArIDQ7CisKKyAgZGF0YSArPSA0OworCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgImR0cyBieXRlcyAlMDJYICUwMlggJTAyWCAlMDJYIiwgZGF0YVswXSwgZGF0YVsxXSwKKyAgICAgIGRhdGFbMl0sIGRhdGFbM10pOworCisgIC8qIEdyYWIgdGltZXN0YW1wIG9mIHRhZyB0YWcgKi8KKyAgZHRzID0gR1NUX1JFQURfVUlOVDI0X0JFIChkYXRhKTsKKyAgLyogcmVhZCB0aGUgZHRzIGV4dGVuc2lvbiB0byAzMiBiaXRzIGludGVnZXIgKi8KKyAgZHRzX2V4dCA9IEdTVF9SRUFEX1VJTlQ4IChkYXRhICsgMyk7CisgIC8qIENvbWJpbmUgdGhlbSAqLworICBkdHMgfD0gZHRzX2V4dCA8PCAyNDsKKworICBpZiAodHlwZSA9PSA5KSB7CisgICAgZGF0YSArPSA3OworCisgICAga2V5ZnJhbWUgPSAoKGRhdGFbMF0gPj4gNCkgPT0gMSk7CisgIH0KKworICByZXQgPSBkdHMgKiBHU1RfTVNFQ09ORDsKKyAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiZHRzOiAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHJldCkpOworCisgIGlmIChpbmRleCAmJiAhZGVtdXgtPmluZGV4ZWQgJiYgKHR5cGUgPT0gOSB8fCAodHlwZSA9PSA4CisgICAgICAgICAgICAgICYmICFkZW11eC0+aGFzX3ZpZGVvKSkpIHsKKyAgICBnc3RfZmx2X2RlbXV4X3BhcnNlX2FuZF9hZGRfaW5kZXhfZW50cnkgKGRlbXV4LCByZXQsIGRlbXV4LT5vZmZzZXQsCisgICAgICAgIGtleWZyYW1lKTsKKyAgfQorCisgIGlmIChkZW11eC0+ZHVyYXRpb24gPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSB8fCBkZW11eC0+ZHVyYXRpb24gPCByZXQpCisgICAgZGVtdXgtPmR1cmF0aW9uID0gcmV0OworCitleGl0OgorICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2Zsdl9kZW11eF9wYXJzZV90YWdfdHlwZSAoR3N0Rmx2RGVtdXggKiBkZW11eCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludDggdGFnX3R5cGUgPSAwOworICBHc3RNYXBJbmZvIG1hcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSA+PSA0LCBHU1RfRkxPV19FUlJPUik7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICB0YWdfdHlwZSA9IG1hcC5kYXRhWzBdOworCisgIC8qIFRhZyBzaXplIGlzIDEgYnl0ZSBvZiB0eXBlICsgMyBieXRlcyBvZiBzaXplICsgNyBieXRlcyArIHRhZyBkYXRhIHNpemUgKworICAgKiA0IGJ5dGVzIG9mIHByZXZpb3VzIHRhZyBzaXplICovCisgIGRlbXV4LT50YWdfZGF0YV9zaXplID0gR1NUX1JFQURfVUlOVDI0X0JFIChtYXAuZGF0YSArIDEpOworICBkZW11eC0+dGFnX3NpemUgPSBkZW11eC0+dGFnX2RhdGFfc2l6ZSArIDExOworCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgInRhZyBkYXRhIHNpemUgaXMgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgIGRlbXV4LT50YWdfZGF0YV9zaXplKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIHN3aXRjaCAodGFnX3R5cGUpIHsKKyAgICBjYXNlIDk6CisgICAgICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfVEFHX1ZJREVPOworICAgICAgZGVtdXgtPmhhc192aWRlbyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfVEFHX0FVRElPOworICAgICAgZGVtdXgtPmhhc19hdWRpbyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE4OgorICAgICAgZGVtdXgtPnN0YXRlID0gRkxWX1NUQVRFX1RBR19TQ1JJUFQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgInVuc3VwcG9ydGVkIHRhZyB0eXBlICV1IiwgdGFnX3R5cGUpOworICAgICAgZGVtdXgtPnN0YXRlID0gRkxWX1NUQVRFX1NLSVA7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2Zsdl9kZW11eF9wYXJzZV9oZWFkZXIgKEdzdEZsdkRlbXV4ICogZGVtdXgsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikgPj0gOSwgR1NUX0ZMT1dfRVJST1IpOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgLyogQ2hlY2sgZm9yIHRoZSBGTFYgdGFnICovCisgIGlmIChtYXAuZGF0YVswXSA9PSAnRicgJiYgbWFwLmRhdGFbMV0gPT0gJ0wnICYmIG1hcC5kYXRhWzJdID09ICdWJykgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiRkxWIGhlYWRlciBkZXRlY3RlZCIpOworICB9IGVsc2UgeworICAgIGlmIChHX1VOTElLRUxZIChkZW11eC0+c3RyaWN0KSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgImludmFsaWQgaGVhZGVyIHRhZyBkZXRlY3RlZCIpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgICAgZ290byBiZWFjaDsKKyAgICB9CisgIH0KKworICBpZiAobWFwLmRhdGFbM10gPT0gJzEnKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJGTFYgdmVyc2lvbiAxIGRldGVjdGVkIik7CisgIH0gZWxzZSB7CisgICAgaWYgKEdfVU5MSUtFTFkgKGRlbXV4LT5zdHJpY3QpKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiaW52YWxpZCBoZWFkZXIgdmVyc2lvbiBkZXRlY3RlZCIpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgICAgZ290byBiZWFjaDsKKyAgICB9CisKKyAgfQorCisgIC8qIE5vdyBsb29rIGF0IGF1ZGlvL3ZpZGVvIGZsYWdzICovCisgIHsKKyAgICBndWludDggZmxhZ3MgPSBtYXAuZGF0YVs0XTsKKworICAgIGRlbXV4LT5oYXNfdmlkZW8gPSBkZW11eC0+aGFzX2F1ZGlvID0gRkFMU0U7CisKKyAgICBpZiAoZmxhZ3MgJiAxKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInRoZXJlIGlzIGEgdmlkZW8gc3RyZWFtIik7CisgICAgICBkZW11eC0+aGFzX3ZpZGVvID0gVFJVRTsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgNCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJ0aGVyZSBpcyBhbiBhdWRpbyBzdHJlYW0iKTsKKyAgICAgIGRlbXV4LT5oYXNfYXVkaW8gPSBUUlVFOworICAgIH0KKyAgfQorCisgIC8qIGRvIGEgb25lLXRpbWUgc2Vla2FiaWxpdHkgY2hlY2sgKi8KKyAgZ3N0X2Zsdl9kZW11eF9jaGVja19zZWVrYWJpbGl0eSAoZGVtdXgpOworCisgIC8qIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHJlc3QgKi8KKyAgZGVtdXgtPm5lZWRfaGVhZGVyID0gRkFMU0U7CisKK2JlYWNoOgorICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X2RlbXV4X2ZsdXNoIChHc3RGbHZEZW11eCAqIGRlbXV4LCBnYm9vbGVhbiBkaXNjb250KQoreworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImZsdXNoaW5nIHF1ZXVlZCBkYXRhIGluIHRoZSBGTFYgZGVtdXhlciIpOworCisgIGdzdF9hZGFwdGVyX2NsZWFyIChkZW11eC0+YWRhcHRlcik7CisKKyAgZGVtdXgtPmF1ZGlvX25lZWRfZGlzY29udCA9IFRSVUU7CisgIGRlbXV4LT52aWRlb19uZWVkX2Rpc2NvbnQgPSBUUlVFOworCisgIGRlbXV4LT5mbHVzaGluZyA9IEZBTFNFOworCisgIC8qIE9ubHkgaW4gcHVzaCBtb2RlIGFuZCBpZiB3ZSdyZSBub3QgZHVyaW5nIGEgc2VlayAqLworICBpZiAoIWRlbXV4LT5yYW5kb21fYWNjZXNzICYmIGRlbXV4LT5zdGF0ZSAhPSBGTFZfU1RBVEVfU0VFSykgeworICAgIC8qIEFmdGVyIGEgZmx1c2ggd2UgZXhwZWN0IGEgdGFnX3R5cGUgKi8KKyAgICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfVEFHX1RZUEU7CisgICAgLyogV2UgcmVzZXQgdGhlIG9mZnNldCBhbmQgd2lsbCBnZXQgb25lIGZyb20gZmlyc3QgcHVzaCAqLworICAgIGRlbXV4LT5vZmZzZXQgPSAwOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X2RlbXV4X2NsZWFudXAgKEdzdEZsdkRlbXV4ICogZGVtdXgpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiY2xlYW5pbmcgdXAgRkxWIGRlbXV4ZXIiKTsKKworICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfSEVBREVSOworCisgIGRlbXV4LT5oYXZlX2dyb3VwX2lkID0gRkFMU0U7CisgIGRlbXV4LT5ncm91cF9pZCA9IEdfTUFYVUlOVDsKKworICBkZW11eC0+Zmx1c2hpbmcgPSBGQUxTRTsKKyAgZGVtdXgtPm5lZWRfaGVhZGVyID0gVFJVRTsKKyAgZGVtdXgtPmF1ZGlvX25lZWRfc2VnbWVudCA9IFRSVUU7CisgIGRlbXV4LT52aWRlb19uZWVkX3NlZ21lbnQgPSBUUlVFOworICBkZW11eC0+YXVkaW9fbmVlZF9kaXNjb250ID0gVFJVRTsKKyAgZGVtdXgtPnZpZGVvX25lZWRfZGlzY29udCA9IFRSVUU7CisKKyAgZGVtdXgtPmhhc19hdWRpbyA9IEZBTFNFOworICBkZW11eC0+aGFzX3ZpZGVvID0gRkFMU0U7CisgIGRlbXV4LT5nb3RfcGFyID0gRkFMU0U7CisKKyAgZGVtdXgtPmluZGV4ZWQgPSBGQUxTRTsKKyAgZGVtdXgtPnVwc3RyZWFtX3NlZWthYmxlID0gRkFMU0U7CisgIGRlbXV4LT5maWxlX3NpemUgPSAwOworCisgIGRlbXV4LT5pbmRleF9tYXhfcG9zID0gMDsKKyAgZGVtdXgtPmluZGV4X21heF90aW1lID0gMDsKKworICBkZW11eC0+YXVkaW9fc3RhcnQgPSBkZW11eC0+dmlkZW9fc3RhcnQgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBkZW11eC0+bGFzdF9hdWRpb19wdHMgPSBkZW11eC0+bGFzdF92aWRlb19kdHMgPSAwOworICBkZW11eC0+YXVkaW9fdGltZV9vZmZzZXQgPSBkZW11eC0+dmlkZW9fdGltZV9vZmZzZXQgPSAwOworCisgIGRlbXV4LT5ub19tb3JlX3BhZHMgPSBGQUxTRTsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9ERUJVRworICBkZW11eC0+bm9fYXVkaW9fd2FybmVkID0gRkFMU0U7CisgIGRlbXV4LT5ub192aWRlb193YXJuZWQgPSBGQUxTRTsKKyNlbmRpZgorCisgIGdzdF9zZWdtZW50X2luaXQgKCZkZW11eC0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKworICBkZW11eC0+dyA9IGRlbXV4LT5oID0gMDsKKyAgZGVtdXgtPmZyYW1lcmF0ZSA9IDAuMDsKKyAgZGVtdXgtPnBhcl94ID0gZGVtdXgtPnBhcl95ID0gMTsKKyAgZGVtdXgtPnZpZGVvX29mZnNldCA9IDA7CisgIGRlbXV4LT5hdWRpb19vZmZzZXQgPSAwOworICBkZW11eC0+b2Zmc2V0ID0gZGVtdXgtPmN1cl90YWdfb2Zmc2V0ID0gMDsKKyAgZGVtdXgtPnRhZ19zaXplID0gZGVtdXgtPnRhZ19kYXRhX3NpemUgPSAwOworICBkZW11eC0+ZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIGlmIChkZW11eC0+bmV3X3NlZ19ldmVudCkgeworICAgIGdzdF9ldmVudF91bnJlZiAoZGVtdXgtPm5ld19zZWdfZXZlbnQpOworICAgIGRlbXV4LT5uZXdfc2VnX2V2ZW50ID0gTlVMTDsKKyAgfQorCisgIGdzdF9hZGFwdGVyX2NsZWFyIChkZW11eC0+YWRhcHRlcik7CisKKyAgaWYgKGRlbXV4LT5hdWRpb19jb2RlY19kYXRhKSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoZGVtdXgtPmF1ZGlvX2NvZGVjX2RhdGEpOworICAgIGRlbXV4LT5hdWRpb19jb2RlY19kYXRhID0gTlVMTDsKKyAgfQorCisgIGlmIChkZW11eC0+dmlkZW9fY29kZWNfZGF0YSkgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKGRlbXV4LT52aWRlb19jb2RlY19kYXRhKTsKKyAgICBkZW11eC0+dmlkZW9fY29kZWNfZGF0YSA9IE5VTEw7CisgIH0KKworICBpZiAoZGVtdXgtPmF1ZGlvX3BhZCkgeworICAgIGdzdF9mbG93X2NvbWJpbmVyX3JlbW92ZV9wYWQgKGRlbXV4LT5mbG93Y29tYmluZXIsIGRlbXV4LT5hdWRpb19wYWQpOworICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UIChkZW11eCksIGRlbXV4LT5hdWRpb19wYWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGRlbXV4LT5hdWRpb19wYWQpOworICAgIGRlbXV4LT5hdWRpb19wYWQgPSBOVUxMOworICB9CisKKyAgaWYgKGRlbXV4LT52aWRlb19wYWQpIHsKKyAgICBnc3RfZmxvd19jb21iaW5lcl9yZW1vdmVfcGFkIChkZW11eC0+Zmxvd2NvbWJpbmVyLCBkZW11eC0+dmlkZW9fcGFkKTsKKyAgICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVCAoZGVtdXgpLCBkZW11eC0+dmlkZW9fcGFkKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChkZW11eC0+dmlkZW9fcGFkKTsKKyAgICBkZW11eC0+dmlkZW9fcGFkID0gTlVMTDsKKyAgfQorCisgIGlmIChkZW11eC0+dGltZXMpIHsKKyAgICBnX2FycmF5X2ZyZWUgKGRlbXV4LT50aW1lcywgVFJVRSk7CisgICAgZGVtdXgtPnRpbWVzID0gTlVMTDsKKyAgfQorCisgIGlmIChkZW11eC0+ZmlsZXBvc2l0aW9ucykgeworICAgIGdfYXJyYXlfZnJlZSAoZGVtdXgtPmZpbGVwb3NpdGlvbnMsIFRSVUUpOworICAgIGRlbXV4LT5maWxlcG9zaXRpb25zID0gTlVMTDsKKyAgfQorCisgIGdzdF9mbHZfZGVtdXhfY2xlYXJfdGFncyAoZGVtdXgpOworfQorCisvKgorICogQ3JlYXRlIGFuZCBwdXNoIGEgZmx1c2hpbmcgc2VlayBldmVudCB1cHN0cmVhbQorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2Zsdl9kZW11eF9zZWVrX3RvX29mZnNldCAoR3N0Rmx2RGVtdXggKiBkZW11eCwgZ3VpbnQ2NCBvZmZzZXQpCit7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgZ2Jvb2xlYW4gcmVzID0gMDsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlNlZWtpbmcgdG8gJSIgR19HVUlOVDY0X0ZPUk1BVCwgb2Zmc2V0KTsKKworICBldmVudCA9CisgICAgICBnc3RfZXZlbnRfbmV3X3NlZWsgKDEuMCwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICAgIEdTVF9TRUVLX0ZMQUdfRkxVU0ggfCBHU1RfU0VFS19GTEFHX0FDQ1VSQVRFLCBHU1RfU0VFS19UWVBFX1NFVCwgb2Zmc2V0LAorICAgICAgR1NUX1NFRUtfVFlQRV9OT05FLCAtMSk7CisKKyAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChkZW11eC0+c2lua3BhZCwgZXZlbnQpOworCisgIGlmIChyZXMpCisgICAgZGVtdXgtPm9mZnNldCA9IG9mZnNldDsKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbHZfZGVtdXhfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdEZsdkRlbXV4ICpkZW11eCA9IE5VTEw7CisKKyAgZGVtdXggPSBHU1RfRkxWX0RFTVVYIChwYXJlbnQpOworCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwKKyAgICAgICJyZWNlaXZlZCBidWZmZXIgb2YgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyBhdCBvZmZzZXQgJSIKKyAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlciksCisgICAgICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpID09IDApKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJiZWdpbm5pbmcgb2YgZmlsZSwgZXhwZWN0IGhlYWRlciIpOworICAgIGRlbXV4LT5zdGF0ZSA9IEZMVl9TVEFURV9IRUFERVI7CisgICAgZGVtdXgtPm9mZnNldCA9IDA7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoZGVtdXgtPm9mZnNldCA9PSAwICYmIEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpICE9IDApKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJvZmZzZXQgd2FzIHplcm8sIHN5bmNocm9uaXppbmcgd2l0aCBidWZmZXIncyIpOworICAgIGRlbXV4LT5vZmZzZXQgPSBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKTsKKyAgfQorCisgIGlmIChHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiRGlzY29udGludWl0eSIpOworICAgIGdzdF9hZGFwdGVyX2NsZWFyIChkZW11eC0+YWRhcHRlcik7CisgIH0KKworICBnc3RfYWRhcHRlcl9wdXNoIChkZW11eC0+YWRhcHRlciwgYnVmZmVyKTsKKworICBpZiAoZGVtdXgtPnNlZWtpbmcpIHsKKyAgICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfU0VFSzsKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgICBkZW11eC0+c2Vla2luZyA9IEZBTFNFOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgIH0KKworcGFyc2U6CisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJnb3QgZmxvdyByZXR1cm4gJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmV0KSk7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIGlmIChHX1VOTElLRUxZIChkZW11eC0+Zmx1c2hpbmcpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJ3ZSBhcmUgbm93IGZsdXNoaW5nLCBleGl0aW5nIHBhcnNlciBsb29wIik7CisgICAgcmV0ID0gR1NUX0ZMT1dfRkxVU0hJTkc7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIHN3aXRjaCAoZGVtdXgtPnN0YXRlKSB7CisgICAgY2FzZSBGTFZfU1RBVEVfSEVBREVSOgorICAgIHsKKyAgICAgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGRlbXV4LT5hZGFwdGVyKSA+PSBGTFZfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgICAgICAgYnVmZmVyID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGRlbXV4LT5hZGFwdGVyLCBGTFZfSEVBREVSX1NJWkUpOworCisgICAgICAgIHJldCA9IGdzdF9mbHZfZGVtdXhfcGFyc2VfaGVhZGVyIChkZW11eCwgYnVmZmVyKTsKKworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgICAgICBkZW11eC0+b2Zmc2V0ICs9IEZMVl9IRUFERVJfU0laRTsKKworICAgICAgICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfVEFHX1RZUEU7CisgICAgICAgIGdvdG8gcGFyc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBnb3RvIGJlYWNoOworICAgICAgfQorICAgIH0KKyAgICBjYXNlIEZMVl9TVEFURV9UQUdfVFlQRToKKyAgICB7CisgICAgICBpZiAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZW11eC0+YWRhcHRlcikgPj0gRkxWX1RBR19UWVBFX1NJWkUpIHsKKyAgICAgICAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgICAgICAgLyogUmVtZW1iZXIgdGhlIHRhZyBvZmZzZXQgaW4gYnl0ZXMgKi8KKyAgICAgICAgZGVtdXgtPmN1cl90YWdfb2Zmc2V0ID0gZGVtdXgtPm9mZnNldDsKKworICAgICAgICBidWZmZXIgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoZGVtdXgtPmFkYXB0ZXIsIEZMVl9UQUdfVFlQRV9TSVpFKTsKKworICAgICAgICByZXQgPSBnc3RfZmx2X2RlbXV4X3BhcnNlX3RhZ190eXBlIChkZW11eCwgYnVmZmVyKTsKKworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgICAgICBkZW11eC0+b2Zmc2V0ICs9IEZMVl9UQUdfVFlQRV9TSVpFOworCisgICAgICAgIC8qIGxhc3QgdGFnIGlzIG5vdCBhbiBpbmRleCA9PiBubyBpbmRleC9kb24ndCBrbm93IHdoZXJlIHRoZSBpbmRleCBpcworICAgICAgICAgKiBzZWVrIGJhY2sgdG8gdGhlIGJlZ2lubmluZyAqLworICAgICAgICBpZiAoZGVtdXgtPnNlZWtfZXZlbnQgJiYgZGVtdXgtPnN0YXRlICE9IEZMVl9TVEFURV9UQUdfU0NSSVBUKQorICAgICAgICAgIGdvdG8gbm9faW5kZXg7CisKKyAgICAgICAgZ290byBwYXJzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICB9CisgICAgfQorICAgIGNhc2UgRkxWX1NUQVRFX1RBR19WSURFTzoKKyAgICB7CisgICAgICBpZiAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZW11eC0+YWRhcHRlcikgPj0gZGVtdXgtPnRhZ19zaXplKSB7CisgICAgICAgIEdzdEJ1ZmZlciAqYnVmZmVyOworCisgICAgICAgIGJ1ZmZlciA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChkZW11eC0+YWRhcHRlciwgZGVtdXgtPnRhZ19zaXplKTsKKworICAgICAgICByZXQgPSBnc3RfZmx2X2RlbXV4X3BhcnNlX3RhZ192aWRlbyAoZGVtdXgsIGJ1ZmZlcik7CisKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICAgICAgZGVtdXgtPm9mZnNldCArPSBkZW11eC0+dGFnX3NpemU7CisKKyAgICAgICAgZGVtdXgtPnN0YXRlID0gRkxWX1NUQVRFX1RBR19UWVBFOworICAgICAgICBnb3RvIHBhcnNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ290byBiZWFjaDsKKyAgICAgIH0KKyAgICB9CisgICAgY2FzZSBGTFZfU1RBVEVfVEFHX0FVRElPOgorICAgIHsKKyAgICAgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGRlbXV4LT5hZGFwdGVyKSA+PSBkZW11eC0+dGFnX3NpemUpIHsKKyAgICAgICAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgICAgICAgYnVmZmVyID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGRlbXV4LT5hZGFwdGVyLCBkZW11eC0+dGFnX3NpemUpOworCisgICAgICAgIHJldCA9IGdzdF9mbHZfZGVtdXhfcGFyc2VfdGFnX2F1ZGlvIChkZW11eCwgYnVmZmVyKTsKKworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgICAgICBkZW11eC0+b2Zmc2V0ICs9IGRlbXV4LT50YWdfc2l6ZTsKKworICAgICAgICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfVEFHX1RZUEU7CisgICAgICAgIGdvdG8gcGFyc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBnb3RvIGJlYWNoOworICAgICAgfQorICAgIH0KKyAgICBjYXNlIEZMVl9TVEFURV9UQUdfU0NSSVBUOgorICAgIHsKKyAgICAgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGRlbXV4LT5hZGFwdGVyKSA+PSBkZW11eC0+dGFnX3NpemUpIHsKKyAgICAgICAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgICAgICAgYnVmZmVyID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGRlbXV4LT5hZGFwdGVyLCBkZW11eC0+dGFnX3NpemUpOworCisgICAgICAgIHJldCA9IGdzdF9mbHZfZGVtdXhfcGFyc2VfdGFnX3NjcmlwdCAoZGVtdXgsIGJ1ZmZlcik7CisKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICAgICAgZGVtdXgtPm9mZnNldCArPSBkZW11eC0+dGFnX3NpemU7CisKKyAgICAgICAgZGVtdXgtPnN0YXRlID0gRkxWX1NUQVRFX1RBR19UWVBFOworCisgICAgICAgIC8qIGlmIHRoZXJlJ3MgYSBzZWVrIGV2ZW50IHdlJ3JlIGhlcmUgZm9yIHRoZSBpbmRleCBzbyBpZiB3ZSBkb24ndCBoYXZlIGl0CisgICAgICAgICAqIHdlIHNlZWsgYmFjayB0byB0aGUgYmVnaW5uaW5nICovCisgICAgICAgIGlmIChkZW11eC0+c2Vla19ldmVudCkgeworICAgICAgICAgIGlmIChkZW11eC0+aW5kZXhlZCkKKyAgICAgICAgICAgIGRlbXV4LT5zdGF0ZSA9IEZMVl9TVEFURV9TRUVLOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdvdG8gbm9faW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBnb3RvIHBhcnNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ290byBiZWFjaDsKKyAgICAgIH0KKyAgICB9CisgICAgY2FzZSBGTFZfU1RBVEVfU0VFSzoKKyAgICB7CisgICAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICAgIHJldCA9IEdTVF9GTE9XX09LOworCisgICAgICBpZiAoIWRlbXV4LT5pbmRleGVkKSB7CisgICAgICAgIGlmIChkZW11eC0+b2Zmc2V0ID09IGRlbXV4LT5maWxlX3NpemUgLSBzaXplb2YgKGd1aW50MzIpKSB7CisgICAgICAgICAgZ3VpbnQ2NCBzZWVrX29mZnNldDsKKyAgICAgICAgICBndWludDggKmRhdGE7CisKKyAgICAgICAgICBkYXRhID0gZ3N0X2FkYXB0ZXJfdGFrZSAoZGVtdXgtPmFkYXB0ZXIsIDQpOworICAgICAgICAgIGlmICghZGF0YSkKKyAgICAgICAgICAgIGdvdG8gbm9faW5kZXg7CisKKyAgICAgICAgICBzZWVrX29mZnNldCA9IGRlbXV4LT5maWxlX3NpemUgLSBzaXplb2YgKGd1aW50MzIpIC0KKyAgICAgICAgICAgICAgR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhKTsKKyAgICAgICAgICBnX2ZyZWUgKGRhdGEpOworCisgICAgICAgICAgR1NUX0lORk9fT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgIlNlZWtpbmcgdG8gYmVnaW5uaW5nIG9mIGxhc3QgdGFnIGF0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICAgIHNlZWtfb2Zmc2V0KTsKKyAgICAgICAgICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfVEFHX1RZUEU7CisgICAgICAgICAgZmx2X2RlbXV4X3NlZWtfdG9fb2Zmc2V0IChkZW11eCwgc2Vla19vZmZzZXQpOworICAgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgIGdvdG8gbm9faW5kZXg7CisgICAgICB9CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAgICAgZXZlbnQgPSBkZW11eC0+c2Vla19ldmVudDsKKyAgICAgIGRlbXV4LT5zZWVrX2V2ZW50ID0gTlVMTDsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisKKyAgICAgIC8qIGNhbGN1bGF0ZSBhbmQgcGVyZm9ybSBzZWVrICovCisgICAgICBpZiAoIWZsdl9kZW11eF9oYW5kbGVfc2Vla19wdXNoIChkZW11eCwgZXZlbnQpKQorICAgICAgICBnb3RvIHNlZWtfZmFpbGVkOworCisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGRlbXV4LT5zdGF0ZSA9IEZMVl9TVEFURV9UQUdfVFlQRTsKKyAgICAgIGdvdG8gYmVhY2g7CisgICAgfQorICAgIGNhc2UgRkxWX1NUQVRFX1NLSVA6CisgICAgICAvKiBTa2lwIHVua25vd24gdGFncyAoc2V0IGluIF9wYXJzZV90YWdfdHlwZSgpKSAqLworICAgICAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoZGVtdXgtPmFkYXB0ZXIpID49IGRlbXV4LT50YWdfc2l6ZSkgeworICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAoZGVtdXgtPmFkYXB0ZXIsIGRlbXV4LT50YWdfc2l6ZSk7CisgICAgICAgIGRlbXV4LT5vZmZzZXQgKz0gZGVtdXgtPnRhZ19zaXplOworICAgICAgICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfVEFHX1RZUEU7CisgICAgICAgIGdvdG8gcGFyc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBnb3RvIGJlYWNoOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInVuZXhwZWN0ZWQgZGVtdXhlciBzdGF0ZSIpOworICB9CisKK2JlYWNoOgorICByZXR1cm4gcmV0OworCisvKiBFUlJPUlMgKi8KK25vX2luZGV4OgorICB7CisgICAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgICAgZGVtdXgtPnNlZWtpbmcgPSBGQUxTRTsKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGRlbXV4LT5zZWVrX2V2ZW50KTsKKyAgICBkZW11eC0+c2Vla19ldmVudCA9IE5VTEw7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAiZmFpbGVkIHRvIGZpbmQgYW4gaW5kZXgsIHNlZWtpbmcgYmFjayB0byBiZWdpbm5pbmciKTsKKyAgICBmbHZfZGVtdXhfc2Vla190b19vZmZzZXQgKGRlbXV4LCAwKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK3NlZWtfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlbXV4LCBTVFJFQU0sIERFTVVYLCAoTlVMTCksICgic2VlayBmYWlsZWQiKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbHZfZGVtdXhfcHVsbF9yYW5nZSAoR3N0Rmx2RGVtdXggKiBkZW11eCwgR3N0UGFkICogcGFkLCBndWludDY0IG9mZnNldCwKKyAgICBndWludCBzaXplLCBHc3RCdWZmZXIgKiogYnVmZmVyKQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKworICByZXQgPSBnc3RfcGFkX3B1bGxfcmFuZ2UgKHBhZCwgb2Zmc2V0LCBzaXplLCBidWZmZXIpOworICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICJmYWlsZWQgd2hlbiBwdWxsaW5nICVkIGJ5dGVzIGZyb20gb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIjogJXMiLAorICAgICAgICBzaXplLCBvZmZzZXQsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICAqYnVmZmVyID0gTlVMTDsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgaWYgKEdfVU5MSUtFTFkgKCpidWZmZXIgJiYgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoKmJ1ZmZlcikgIT0gc2l6ZSkpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAicGFydGlhbCBwdWxsIGdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiIHdoZW4gZXhwZWN0aW5nICVkIGZyb20gb2Zmc2V0ICUiCisgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGdzdF9idWZmZXJfZ2V0X3NpemUgKCpidWZmZXIpLCBzaXplLCBvZmZzZXQpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKCpidWZmZXIpOworICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgICAqYnVmZmVyID0gTlVMTDsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbHZfZGVtdXhfcHVsbF90YWcgKEdzdFBhZCAqIHBhZCwgR3N0Rmx2RGVtdXggKiBkZW11eCkKK3sKKyAgR3N0QnVmZmVyICpidWZmZXIgPSBOVUxMOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIC8qIFN0b3JlIHRhZyBvZmZzZXQgKi8KKyAgZGVtdXgtPmN1cl90YWdfb2Zmc2V0ID0gZGVtdXgtPm9mZnNldDsKKworICAvKiBHZXQgdGhlIGZpcnN0IDQgYnl0ZXMgdG8gaWRlbnRpZnkgdGFnIHR5cGUgYW5kIHNpemUgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKChyZXQgPSBnc3RfZmx2X2RlbXV4X3B1bGxfcmFuZ2UgKGRlbXV4LCBwYWQsIGRlbXV4LT5vZmZzZXQsCisgICAgICAgICAgICAgICAgICBGTFZfVEFHX1RZUEVfU0laRSwgJmJ1ZmZlcikpICE9IEdTVF9GTE9XX09LKSkKKyAgICBnb3RvIGJlYWNoOworCisgIC8qIElkZW50aWZ5IHRhZyB0eXBlICovCisgIHJldCA9IGdzdF9mbHZfZGVtdXhfcGFyc2VfdGFnX3R5cGUgKGRlbXV4LCBidWZmZXIpOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykpCisgICAgZ290byBiZWFjaDsKKworICAvKiBKdW1wIG92ZXIgdGFnIHR5cGUgKyBzaXplICovCisgIGRlbXV4LT5vZmZzZXQgKz0gRkxWX1RBR19UWVBFX1NJWkU7CisKKyAgLyogUHVsbCB0aGUgd2hvbGUgdGFnICovCisgIGJ1ZmZlciA9IE5VTEw7CisgIGlmIChHX1VOTElLRUxZICgocmV0ID0gZ3N0X2Zsdl9kZW11eF9wdWxsX3JhbmdlIChkZW11eCwgcGFkLCBkZW11eC0+b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgZGVtdXgtPnRhZ19zaXplLCAmYnVmZmVyKSkgIT0gR1NUX0ZMT1dfT0spKQorICAgIGdvdG8gYmVhY2g7CisKKyAgc3dpdGNoIChkZW11eC0+c3RhdGUpIHsKKyAgICBjYXNlIEZMVl9TVEFURV9UQUdfVklERU86CisgICAgICByZXQgPSBnc3RfZmx2X2RlbXV4X3BhcnNlX3RhZ192aWRlbyAoZGVtdXgsIGJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZMVl9TVEFURV9UQUdfQVVESU86CisgICAgICByZXQgPSBnc3RfZmx2X2RlbXV4X3BhcnNlX3RhZ19hdWRpbyAoZGVtdXgsIGJ1ZmZlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZMVl9TVEFURV9UQUdfU0NSSVBUOgorICAgICAgcmV0ID0gZ3N0X2Zsdl9kZW11eF9wYXJzZV90YWdfc2NyaXB0IChkZW11eCwgYnVmZmVyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAidW5leHBlY3RlZCBzdGF0ZSAlZCIsIGRlbXV4LT5zdGF0ZSk7CisgIH0KKworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIC8qIEp1bXAgb3ZlciB0aGF0IHBhcnQgd2UndmUganVzdCBwYXJzZWQgKi8KKyAgZGVtdXgtPm9mZnNldCArPSBkZW11eC0+dGFnX3NpemU7CisKKyAgLyogTWFrZSBzdXJlIHdlIHJlaW5pdGlhbGl6ZSB0aGUgdGFnIHNpemUgKi8KKyAgZGVtdXgtPnRhZ19zaXplID0gMDsKKworICAvKiBSZWFkeSBmb3IgdGhlIG5leHQgdGFnICovCisgIGRlbXV4LT5zdGF0ZSA9IEZMVl9TVEFURV9UQUdfVFlQRTsKKworICBpZiAoR19VTkxJS0VMWSAocmV0ID09IEdTVF9GTE9XX05PVF9MSU5LRUQpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgInBhcnNpbmcgdGhpcyB0YWcgcmV0dXJuZWQgbm90LWxpbmtlZCBhbmQgIgorICAgICAgICAibmVpdGhlciB2aWRlbyBub3IgYXVkaW8gYXJlIGxpbmtlZCIpOworICB9CisKK2JlYWNoOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2Zsdl9kZW11eF9wdWxsX2hlYWRlciAoR3N0UGFkICogcGFkLCBHc3RGbHZEZW11eCAqIGRlbXV4KQoreworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgLyogR2V0IHRoZSBmaXJzdCA5IGJ5dGVzICovCisgIGlmIChHX1VOTElLRUxZICgocmV0ID0gZ3N0X2Zsdl9kZW11eF9wdWxsX3JhbmdlIChkZW11eCwgcGFkLCBkZW11eC0+b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgRkxWX0hFQURFUl9TSVpFLCAmYnVmZmVyKSkgIT0gR1NUX0ZMT1dfT0spKQorICAgIGdvdG8gYmVhY2g7CisKKyAgcmV0ID0gZ3N0X2Zsdl9kZW11eF9wYXJzZV9oZWFkZXIgKGRlbXV4LCBidWZmZXIpOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgLyogSnVtcCBvdmVyIHRoZSBoZWFkZXIgbm93ICovCisgIGRlbXV4LT5vZmZzZXQgKz0gRkxWX0hFQURFUl9TSVpFOworICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfVEFHX1RZUEU7CisKK2JlYWNoOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X2Zsdl9kZW11eF9tb3ZlX3RvX29mZnNldCAoR3N0Rmx2RGVtdXggKiBkZW11eCwgZ2ludDY0IG9mZnNldCwKKyAgICBnYm9vbGVhbiByZXNldCkKK3sKKyAgZGVtdXgtPm9mZnNldCA9IG9mZnNldDsKKworICAvKiBUZWxsIGFsbCB0aGUgc3RyZWFtIHdlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHBvc2l0aW9uIChkaXNjb250KSAqLworICBkZW11eC0+YXVkaW9fbmVlZF9kaXNjb250ID0gVFJVRTsKKyAgZGVtdXgtPnZpZGVvX25lZWRfZGlzY29udCA9IFRSVUU7CisKKyAgLyogbmV4dCBzZWN0aW9uIHNldHVwICovCisgIGRlbXV4LT5mcm9tX29mZnNldCA9IC0xOworICBkZW11eC0+YXVkaW9fZG9uZSA9IGRlbXV4LT52aWRlb19kb25lID0gRkFMU0U7CisgIGRlbXV4LT5hdWRpb19maXJzdF90cyA9IGRlbXV4LT52aWRlb19maXJzdF90cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgaWYgKHJlc2V0KSB7CisgICAgZGVtdXgtPmZyb21fb2Zmc2V0ID0gLTE7CisgICAgZGVtdXgtPnRvX29mZnNldCA9IEdfTUFYSU5UNjQ7CisgIH0KKworICAvKiBJZiB3ZSBzZWVrZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSBwYXJzZSB0aGUgaGVhZGVyIGFnYWluICovCisgIGlmIChHX1VOTElLRUxZICghZGVtdXgtPm9mZnNldCkpIHsKKyAgICBkZW11eC0+c3RhdGUgPSBGTFZfU1RBVEVfSEVBREVSOworICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBvciBwYXJzZSBhIHRhZyAqLworICAgIGRlbXV4LT5zdGF0ZSA9IEZMVl9TVEFURV9UQUdfVFlQRTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2Zsdl9kZW11eF9zZWVrX3RvX3ByZXZfa2V5ZnJhbWUgKEdzdEZsdkRlbXV4ICogZGVtdXgpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfRU9TOworICBHc3RJbmRleCAqaW5kZXg7CisgIEdzdEluZGV4RW50cnkgKmVudHJ5ID0gTlVMTDsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICJ0ZXJtaW5hdGVkIHNlY3Rpb24gc3RhcnRlZCBhdCBvZmZzZXQgJSIgR19HSU5UNjRfRk9STUFULAorICAgICAgZGVtdXgtPmZyb21fb2Zmc2V0KTsKKworICAvKiB3ZSBhcmUgZG9uZSBpZiB3ZSBnb3QgYWxsIGF1ZGlvIGFuZCB2aWRlbyAqLworICBpZiAoKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZGVtdXgtPmF1ZGlvX2ZpcnN0X3RzKSB8fAorICAgICAgICAgIGRlbXV4LT5hdWRpb19maXJzdF90cyA8IGRlbXV4LT5zZWdtZW50LnN0YXJ0KSAmJgorICAgICAgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZGVtdXgtPnZpZGVvX2ZpcnN0X3RzKSB8fAorICAgICAgICAgIGRlbXV4LT52aWRlb19maXJzdF90cyA8IGRlbXV4LT5zZWdtZW50LnN0YXJ0KSkKKyAgICBnb3RvIGRvbmU7CisKKyAgaWYgKGRlbXV4LT5mcm9tX29mZnNldCA8PSAwKQorICAgIGdvdG8gZG9uZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImxvY2F0aW5nIHByZXZpb3VzIHBvc2l0aW9uIik7CisKKyAgaW5kZXggPSBnc3RfZmx2X2RlbXV4X2dldF9pbmRleCAoR1NUX0VMRU1FTlQgKGRlbXV4KSk7CisKKyAgLyogbG9jYXRlIGluZGV4IGVudHJ5IGJlZm9yZSBwcmV2aW91cyBzdGFydCBwb3NpdGlvbiAqLworICBpZiAoaW5kZXgpIHsKKyAgICBlbnRyeSA9IGdzdF9pbmRleF9nZXRfYXNzb2NfZW50cnkgKGluZGV4LCBkZW11eC0+aW5kZXhfaWQsCisgICAgICAgIEdTVF9JTkRFWF9MT09LVVBfQkVGT1JFLCBHU1RfQVNTT0NJQVRJT05fRkxBR19LRVlfVU5JVCwKKyAgICAgICAgR1NUX0ZPUk1BVF9CWVRFUywgZGVtdXgtPmZyb21fb2Zmc2V0IC0gMSk7CisKKyAgICBpZiAoZW50cnkpIHsKKyAgICAgIGdpbnQ2NCBieXRlcyA9IDAsIHRpbWUgPSAwOworCisgICAgICBnc3RfaW5kZXhfZW50cnlfYXNzb2NfbWFwIChlbnRyeSwgR1NUX0ZPUk1BVF9CWVRFUywgJmJ5dGVzKTsKKyAgICAgIGdzdF9pbmRleF9lbnRyeV9hc3NvY19tYXAgKGVudHJ5LCBHU1RfRk9STUFUX1RJTUUsICZ0aW1lKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJmb3VuZCBpbmRleCBlbnRyeSBmb3IgJSIgR19HSU5UNjRfRk9STUFUCisgICAgICAgICAgIiBhdCAlIiBHU1RfVElNRV9GT1JNQVQgIiwgc2Vla2luZyB0byAlIiBHX0dJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgZGVtdXgtPm9mZnNldCAtIDEsIEdTVF9USU1FX0FSR1MgKHRpbWUpLCBieXRlcyk7CisKKyAgICAgIC8qIHNldHVwIGZvciBuZXh0IHNlY3Rpb24gKi8KKyAgICAgIGRlbXV4LT50b19vZmZzZXQgPSBkZW11eC0+ZnJvbV9vZmZzZXQ7CisgICAgICBnc3RfZmx2X2RlbXV4X21vdmVfdG9fb2Zmc2V0IChkZW11eCwgYnl0ZXMsIEZBTFNFKTsKKyAgICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIH0KKworICAgIGdzdF9vYmplY3RfdW5yZWYgKGluZGV4KTsKKyAgfQorCitkb25lOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2Zsdl9kZW11eF9jcmVhdGVfaW5kZXggKEdzdEZsdkRlbXV4ICogZGVtdXgsIGdpbnQ2NCBwb3MsIEdzdENsb2NrVGltZSB0cykKK3sKKyAgZ2ludDY0IHNpemU7CisgIHNpemVfdCB0YWdfc2l6ZTsKKyAgZ3VpbnQ2NCBvbGRfb2Zmc2V0OworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0Q2xvY2tUaW1lIHRhZ190aW1lOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIGlmICghZ3N0X3BhZF9wZWVyX3F1ZXJ5X2R1cmF0aW9uIChkZW11eC0+c2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywgJnNpemUpKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImJ1aWxkaW5nIGluZGV4IGF0ICUiIEdfR0lOVDY0X0ZPUk1BVAorICAgICAgIiBsb29raW5nIGZvciB0aW1lICUiIEdTVF9USU1FX0ZPUk1BVCwgcG9zLCBHU1RfVElNRV9BUkdTICh0cykpOworCisgIG9sZF9vZmZzZXQgPSBkZW11eC0+b2Zmc2V0OworICBkZW11eC0+b2Zmc2V0ID0gcG9zOworCisgIGJ1ZmZlciA9IE5VTEw7CisgIHdoaWxlICgocmV0ID0gZ3N0X2Zsdl9kZW11eF9wdWxsX3JhbmdlIChkZW11eCwgZGVtdXgtPnNpbmtwYWQsIGRlbXV4LT5vZmZzZXQsCisgICAgICAgICAgICAgIDEyLCAmYnVmZmVyKSkgPT0gR1NUX0ZMT1dfT0spIHsKKyAgICB0YWdfdGltZSA9CisgICAgICAgIGdzdF9mbHZfZGVtdXhfcGFyc2VfdGFnX3RpbWVzdGFtcCAoZGVtdXgsIFRSVUUsIGJ1ZmZlciwgJnRhZ19zaXplKTsKKworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgYnVmZmVyID0gTlVMTDsKKworICAgIGlmIChHX1VOTElLRUxZICh0YWdfdGltZSA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FIHx8IHRhZ190aW1lID4gdHMpKQorICAgICAgZ290byBleGl0OworCisgICAgZGVtdXgtPm9mZnNldCArPSB0YWdfc2l6ZTsKKyAgfQorCisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRU9TKSB7CisgICAgLyogZmlsZSByYW4gb3V0LCBzbyBtYXJrIHdlIGhhdmUgY29tcGxldGUgaW5kZXggKi8KKyAgICBkZW11eC0+aW5kZXhlZCA9IFRSVUU7CisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgIH0KKworZXhpdDoKKyAgZGVtdXgtPm9mZnNldCA9IG9sZF9vZmZzZXQ7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdpbnQ2NAorZ3N0X2Zsdl9kZW11eF9nZXRfbWV0YWRhdGEgKEdzdEZsdkRlbXV4ICogZGVtdXgpCit7CisgIGdpbnQ2NCByZXQgPSAwLCBvZmZzZXQ7CisgIHNpemVfdCB0YWdfc2l6ZSwgc2l6ZTsKKyAgR3N0QnVmZmVyICpidWZmZXIgPSBOVUxMOworICBHc3RNYXBJbmZvIG1hcDsKKworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAoZGVtdXgtPnNpbmtwYWQsIEdTVF9GT1JNQVRfQllURVMsICZvZmZzZXQpKQorICAgIGdvdG8gZXhpdDsKKworICByZXQgPSBvZmZzZXQ7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAidXBzdHJlYW0gc2l6ZTogJSIgR19HSU5UNjRfRk9STUFULCBvZmZzZXQpOworICBpZiAoR19VTkxJS0VMWSAob2Zmc2V0IDwgNCkpCisgICAgZ290byBleGl0OworCisgIG9mZnNldCAtPSA0OworICBpZiAoR1NUX0ZMT1dfT0sgIT0gZ3N0X2Zsdl9kZW11eF9wdWxsX3JhbmdlIChkZW11eCwgZGVtdXgtPnNpbmtwYWQsIG9mZnNldCwKKyAgICAgICAgICA0LCAmYnVmZmVyKSkKKyAgICBnb3RvIGV4aXQ7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgdGFnX3NpemUgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKG1hcC5kYXRhKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJsYXN0IHRhZyBzaXplOiAlIiBHX0dTSVpFX0ZPUk1BVCwgdGFnX3NpemUpOworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICBidWZmZXIgPSBOVUxMOworCisgIGlmIChHX1VOTElLRUxZIChvZmZzZXQgPCB0YWdfc2l6ZSkpCisgICAgZ290byBleGl0OworCisgIG9mZnNldCAtPSB0YWdfc2l6ZTsKKyAgaWYgKEdTVF9GTE9XX09LICE9IGdzdF9mbHZfZGVtdXhfcHVsbF9yYW5nZSAoZGVtdXgsIGRlbXV4LT5zaW5rcGFkLCBvZmZzZXQsCisgICAgICAgICAgMTIsICZidWZmZXIpKQorICAgIGdvdG8gZXhpdDsKKworICAvKiBhIGNvbnNpc3RlbmN5IGNoZWNrICovCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHNpemUgPSBHU1RfUkVBRF9VSU5UMjRfQkUgKG1hcC5kYXRhICsgMSk7CisgIGlmIChzaXplICE9IHRhZ19zaXplIC0gMTEpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAidGFnIHNpemUgJSIgR19HU0laRV9GT1JNQVQgIiwgZXhwZWN0ZWQgJSIgR19HU0laRV9GT1JNQVQKKyAgICAgICAgIiwgY29ycnVwdCBvciB0cnVuY2F0ZWQgZmlsZSIsIHNpemUsIHRhZ19zaXplIC0gMTEpOworICAgIGdvdG8gZXhpdDsKKyAgfQorCisgIC8qIHRyeSB0byB1cGRhdGUgZHVyYXRpb24gd2l0aCB0aW1lc3RhbXAgaW4gYW55IGNhc2UgKi8KKyAgZ3N0X2Zsdl9kZW11eF9wYXJzZV90YWdfdGltZXN0YW1wIChkZW11eCwgRkFMU0UsIGJ1ZmZlciwgJnNpemUpOworCisgIC8qIG1heWJlIGdldCBzb21lIG1vcmUgbWV0YWRhdGEgKi8KKyAgaWYgKG1hcC5kYXRhWzBdID09IDE4KSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzY3JpcHQgdGFnLCBwdWxsaW5nIGl0IHRvIHBhcnNlIik7CisgICAgb2Zmc2V0ICs9IDQ7CisgICAgaWYgKEdTVF9GTE9XX09LID09IGdzdF9mbHZfZGVtdXhfcHVsbF9yYW5nZSAoZGVtdXgsIGRlbXV4LT5zaW5rcGFkLCBvZmZzZXQsCisgICAgICAgICAgICB0YWdfc2l6ZSwgJmJ1ZmZlcikpCisgICAgICBnc3RfZmx2X2RlbXV4X3BhcnNlX3RhZ19zY3JpcHQgKGRlbXV4LCBidWZmZXIpOworICB9IGVsc2UgeworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIH0KKworZXhpdDoKKyAgaWYgKGJ1ZmZlcikKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X2RlbXV4X2xvb3AgKEdzdFBhZCAqIHBhZCkKK3sKKyAgR3N0Rmx2RGVtdXggKmRlbXV4ID0gTlVMTDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICBkZW11eCA9IEdTVF9GTFZfREVNVVggKGdzdF9wYWRfZ2V0X3BhcmVudCAocGFkKSk7CisKKyAgLyogcHVsbCBpbiBkYXRhICovCisgIHN3aXRjaCAoZGVtdXgtPnN0YXRlKSB7CisgICAgY2FzZSBGTFZfU1RBVEVfVEFHX1RZUEU6CisgICAgICBpZiAoZGVtdXgtPmZyb21fb2Zmc2V0ID09IC0xKQorICAgICAgICBkZW11eC0+ZnJvbV9vZmZzZXQgPSBkZW11eC0+b2Zmc2V0OworICAgICAgcmV0ID0gZ3N0X2Zsdl9kZW11eF9wdWxsX3RhZyAocGFkLCBkZW11eCk7CisgICAgICAvKiBpZiB3ZSBoYXZlIHNlZW4gcmVhbCBkYXRhLCB3ZSBwcm9iYWJseSBwYXNzZWQgYSBwb3NzaWJsZSBtZXRhZGF0YQorICAgICAgICogaGVhZGVyIGxvY2F0ZWQgYXQgc3RhcnQuICBTbyBpZiB3ZSBkbyBub3QgeWV0IGhhdmUgYW4gaW5kZXgsCisgICAgICAgKiB0cnkgdG8gcGljayB1cCBtZXRhZGF0YSAoaW5kZXgsIGR1cmF0aW9uKSBhdCB0aGUgZW5kICovCisgICAgICBpZiAoR19VTkxJS0VMWSAoIWRlbXV4LT5maWxlX3NpemUgJiYgIWRlbXV4LT5pbmRleGVkICYmCisgICAgICAgICAgICAgIChkZW11eC0+aGFzX3ZpZGVvIHx8IGRlbXV4LT5oYXNfYXVkaW8pKSkKKyAgICAgICAgZGVtdXgtPmZpbGVfc2l6ZSA9IGdzdF9mbHZfZGVtdXhfZ2V0X21ldGFkYXRhIChkZW11eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZMVl9TVEFURV9ET05FOgorICAgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGTFZfU1RBVEVfU0VFSzoKKyAgICAgIC8qIHNlZWsgaXNzdWVkIHdpdGggaW5zdWZmaWNpZW50IGluZGV4OworICAgICAgICogc2NhbiBmb3IgaW5kZXggaW4gdGFzayB0aHJlYWQgZnJvbSBjdXJyZW50IG1heGltdW0gb2Zmc2V0IHRvCisgICAgICAgKiBkZXNpcmVkIHRpbWUgYW5kIHRoZW4gcGVyZm9ybSBzZWVrICovCisgICAgICAvKiBUT0RPIG1heWJlIHNvbWUgYnVmZmVyaW5nIG1lc3NhZ2Ugb3Igc28gdG8gaW5kaWNhdGUgc2NhbiBwcm9ncmVzcyAqLworICAgICAgcmV0ID0gZ3N0X2Zsdl9kZW11eF9jcmVhdGVfaW5kZXggKGRlbXV4LCBkZW11eC0+aW5kZXhfbWF4X3BvcywKKyAgICAgICAgICBkZW11eC0+c2Vla190aW1lKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gcGF1c2U7CisgICAgICAvKiBwb3NpdGlvbiBhbmQgc3RhdGUgYXJyYW5nZWQgYnkgc2VlaywKKyAgICAgICAqIGFsc28gdW5yZWZzIGV2ZW50ICovCisgICAgICBnc3RfZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1bGwgKGRlbXV4LCBkZW11eC0+c2Vla19ldmVudCwgRkFMU0UpOworICAgICAgZGVtdXgtPnNlZWtfZXZlbnQgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9mbHZfZGVtdXhfcHVsbF9oZWFkZXIgKHBhZCwgZGVtdXgpOworICAgICAgLyogaW5kZXggc2NhbnMgc3RhcnQgYWZ0ZXIgaGVhZGVyICovCisgICAgICBkZW11eC0+aW5kZXhfbWF4X3BvcyA9IGRlbXV4LT5vZmZzZXQ7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChkZW11eC0+c2VnbWVudC5yYXRlIDwgMC4wKSB7CisgICAgLyogY2hlY2sgZW5kIG9mIHNlY3Rpb24gKi8KKyAgICBpZiAoKGdpbnQ2NCkgZGVtdXgtPm9mZnNldCA+PSBkZW11eC0+dG9fb2Zmc2V0IHx8CisgICAgICAgIGRlbXV4LT5zZWdtZW50LnBvc2l0aW9uID49IGRlbXV4LT5zZWdtZW50LnN0b3AgKyAyICogR1NUX1NFQ09ORCB8fAorICAgICAgICAoZGVtdXgtPmF1ZGlvX2RvbmUgJiYgZGVtdXgtPnZpZGVvX2RvbmUpKQorICAgICAgcmV0ID0gZ3N0X2Zsdl9kZW11eF9zZWVrX3RvX3ByZXZfa2V5ZnJhbWUgKGRlbXV4KTsKKyAgfSBlbHNlIHsKKyAgICAvKiBjaGVjayBFT1MgY29uZGl0aW9uICovCisgICAgaWYgKChkZW11eC0+c2VnbWVudC5zdG9wICE9IC0xKSAmJgorICAgICAgICAoZGVtdXgtPnNlZ21lbnQucG9zaXRpb24gPj0gZGVtdXgtPnNlZ21lbnQuc3RvcCkpIHsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgICB9CisgIH0KKworICAvKiBwYXVzZSBpZiBzb21ldGhpbmcgd2VudCB3cm9uZyBvciBhdCBlbmQgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykpCisgICAgZ290byBwYXVzZTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChkZW11eCk7CisKKyAgcmV0dXJuOworCitwYXVzZToKKyAgeworICAgIGNvbnN0IGdjaGFyICpyZWFzb24gPSBnc3RfZmxvd19nZXRfbmFtZSAocmV0KTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgInBhdXNpbmcgdGFzaywgcmVhc29uICVzIiwgcmVhc29uKTsKKyAgICBnc3RfcGFkX3BhdXNlX3Rhc2sgKHBhZCk7CisKKyAgICBpZiAocmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgICAgLyogaGFuZGxlIGVuZC1vZi1zdHJlYW0vc2VnbWVudCAqLworICAgICAgLyogc28gYWxpZ24gb3VyIHBvc2l0aW9uIHdpdGggdGhlIGVuZCBvZiBpdCwgaWYgdGhlcmUgaXMgb25lCisgICAgICAgKiB0aGlzIGVuc3VyZXMgYSBzdWJzZXF1ZW50IHdpbGwgYXJyaXZlIGF0IGNvcnJlY3QgYmFzZS9hY2MgdGltZSAqLworICAgICAgaWYgKGRlbXV4LT5zZWdtZW50LnJhdGUgPiAwLjAgJiYKKyAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZGVtdXgtPnNlZ21lbnQuc3RvcCkpCisgICAgICAgIGRlbXV4LT5zZWdtZW50LnBvc2l0aW9uID0gZGVtdXgtPnNlZ21lbnQuc3RvcDsKKyAgICAgIGVsc2UgaWYgKGRlbXV4LT5zZWdtZW50LnJhdGUgPCAwLjApCisgICAgICAgIGRlbXV4LT5zZWdtZW50LnBvc2l0aW9uID0gZGVtdXgtPnNlZ21lbnQuc3RhcnQ7CisKKyAgICAgIC8qIHBlcmZvcm0gRU9TIGxvZ2ljICovCisgICAgICBpZiAoIWRlbXV4LT5ub19tb3JlX3BhZHMpIHsKKyAgICAgICAgZ3N0X2VsZW1lbnRfbm9fbW9yZV9wYWRzIChHU1RfRUxFTUVOVF9DQVNUIChkZW11eCkpOworICAgICAgICBkZW11eC0+bm9fbW9yZV9wYWRzID0gVFJVRTsKKyAgICAgIH0KKworICAgICAgaWYgKGRlbXV4LT5zZWdtZW50LmZsYWdzICYgR1NUX1NFR01FTlRfRkxBR19TRUdNRU5UKSB7CisgICAgICAgIGdpbnQ2NCBzdG9wOworCisgICAgICAgIC8qIGZvciBzZWdtZW50IHBsYXliYWNrIHdlIG5lZWQgdG8gcG9zdCB3aGVuIChpbiBzdHJlYW0gdGltZSkKKyAgICAgICAgICogd2Ugc3RvcHBlZCwgdGhpcyBpcyBlaXRoZXIgc3RvcCAod2hlbiBzZXQpIG9yIHRoZSBkdXJhdGlvbi4gKi8KKyAgICAgICAgaWYgKChzdG9wID0gZGVtdXgtPnNlZ21lbnQuc3RvcCkgPT0gLTEpCisgICAgICAgICAgc3RvcCA9IGRlbXV4LT5zZWdtZW50LmR1cmF0aW9uOworCisgICAgICAgIGlmIChkZW11eC0+c2VnbWVudC5yYXRlID49IDApIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJTZW5kaW5nIHNlZ21lbnQgZG9uZSwgYXQgZW5kIG9mIHNlZ21lbnQiKTsKKyAgICAgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwKKyAgICAgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X3NlZ21lbnRfZG9uZSAoR1NUX09CSkVDVF9DQVNUIChkZW11eCksCisgICAgICAgICAgICAgICAgICBHU1RfRk9STUFUX1RJTUUsIHN0b3ApKTsKKyAgICAgICAgICBnc3RfZmx2X2RlbXV4X3B1c2hfc3JjX2V2ZW50IChkZW11eCwKKyAgICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19zZWdtZW50X2RvbmUgKEdTVF9GT1JNQVRfVElNRSwgc3RvcCkpOworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBSZXZlcnNlIHBsYXliYWNrICovCisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiU2VuZGluZyBzZWdtZW50IGRvbmUsIGF0IGJlZ2lubmluZyBvZiAiCisgICAgICAgICAgICAgICJzZWdtZW50Iik7CisgICAgICAgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChkZW11eCksCisgICAgICAgICAgICAgIGdzdF9tZXNzYWdlX25ld19zZWdtZW50X2RvbmUgKEdTVF9PQkpFQ1RfQ0FTVCAoZGVtdXgpLAorICAgICAgICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBkZW11eC0+c2VnbWVudC5zdGFydCkpOworICAgICAgICAgIGdzdF9mbHZfZGVtdXhfcHVzaF9zcmNfZXZlbnQgKGRlbXV4LAorICAgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZ21lbnRfZG9uZSAoR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgICAgICAgICAgZGVtdXgtPnNlZ21lbnQuc3RhcnQpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogbm9ybWFsIHBsYXliYWNrLCBzZW5kIEVPUyB0byBhbGwgbGlua2VkIHBhZHMgKi8KKyAgICAgICAgaWYgKCFkZW11eC0+bm9fbW9yZV9wYWRzKSB7CisgICAgICAgICAgZ3N0X2VsZW1lbnRfbm9fbW9yZV9wYWRzIChHU1RfRUxFTUVOVCAoZGVtdXgpKTsKKyAgICAgICAgICBkZW11eC0+bm9fbW9yZV9wYWRzID0gVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIlNlbmRpbmcgRU9TLCBhdCBlbmQgb2Ygc3RyZWFtIik7CisgICAgICAgIGlmICghZGVtdXgtPmF1ZGlvX3BhZCAmJiAhZGVtdXgtPnZpZGVvX3BhZCkKKyAgICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgRkFJTEVELAorICAgICAgICAgICAgICAoIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIpLCAoIkdvdCBFT1MgYmVmb3JlIGFueSBkYXRhIikpOworICAgICAgICBlbHNlIGlmICghZ3N0X2Zsdl9kZW11eF9wdXNoX3NyY19ldmVudCAoZGVtdXgsIGdzdF9ldmVudF9uZXdfZW9zICgpKSkKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiZmFpbGVkIHB1c2hpbmcgRU9TIG9uIHN0cmVhbXMiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJldCA9PSBHU1RfRkxPV19OT1RfTElOS0VEIHx8IHJldCA8IEdTVF9GTE9XX0VPUykgeworICAgICAgR1NUX0VMRU1FTlRfRkxPV19FUlJPUiAoZGVtdXgsIHJldCk7CisgICAgICBnc3RfZmx2X2RlbXV4X3B1c2hfc3JjX2V2ZW50IChkZW11eCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworICAgIH0KKyAgICBnc3Rfb2JqZWN0X3VucmVmIChkZW11eCk7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyBndWludDY0Citnc3RfZmx2X2RlbXV4X2ZpbmRfb2Zmc2V0IChHc3RGbHZEZW11eCAqIGRlbXV4LCBHc3RTZWdtZW50ICogc2VnbWVudCwKKyAgICBHc3RTZWVrRmxhZ3Mgc2Vla19mbGFncykKK3sKKyAgZ2ludDY0IGJ5dGVzID0gMDsKKyAgZ2ludDY0IHRpbWUgPSAwOworICBHc3RJbmRleCAqaW5kZXg7CisgIEdzdEluZGV4RW50cnkgKmVudHJ5OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZWdtZW50ICE9IE5VTEwsIDApOworCisgIHRpbWUgPSBzZWdtZW50LT5wb3NpdGlvbjsKKworICBpbmRleCA9IGdzdF9mbHZfZGVtdXhfZ2V0X2luZGV4IChHU1RfRUxFTUVOVCAoZGVtdXgpKTsKKworICBpZiAoaW5kZXgpIHsKKyAgICAvKiBMZXQncyBjaGVjayBpZiB3ZSBoYXZlIGFuIGluZGV4IGVudHJ5IGZvciB0aGF0IHNlZWsgdGltZSAqLworICAgIGVudHJ5ID0gZ3N0X2luZGV4X2dldF9hc3NvY19lbnRyeSAoaW5kZXgsIGRlbXV4LT5pbmRleF9pZCwKKyAgICAgICAgc2Vla19mbGFncyAmIEdTVF9TRUVLX0ZMQUdfU05BUF9BRlRFUiA/CisgICAgICAgIEdTVF9JTkRFWF9MT09LVVBfQUZURVIgOiBHU1RfSU5ERVhfTE9PS1VQX0JFRk9SRSwKKyAgICAgICAgR1NUX0FTU09DSUFUSU9OX0ZMQUdfS0VZX1VOSVQsIEdTVF9GT1JNQVRfVElNRSwgdGltZSk7CisKKyAgICBpZiAoZW50cnkpIHsKKyAgICAgIGdzdF9pbmRleF9lbnRyeV9hc3NvY19tYXAgKGVudHJ5LCBHU1RfRk9STUFUX0JZVEVTLCAmYnl0ZXMpOworICAgICAgZ3N0X2luZGV4X2VudHJ5X2Fzc29jX21hcCAoZW50cnksIEdTVF9GT1JNQVRfVElNRSwgJnRpbWUpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImZvdW5kIGluZGV4IGVudHJ5IGZvciAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAiIGF0ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBzZWVraW5nIHRvICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChzZWdtZW50LT5wb3NpdGlvbiksIEdTVF9USU1FX0FSR1MgKHRpbWUpLCBieXRlcyk7CisKKyAgICAgIC8qIEtleSBmcmFtZSBzZWVraW5nICovCisgICAgICBpZiAoc2Vla19mbGFncyAmIEdTVF9TRUVLX0ZMQUdfS0VZX1VOSVQpIHsKKyAgICAgICAgLyogQWRqdXN0IHRoZSBzZWdtZW50IHNvIHRoYXQgdGhlIGtleWZyYW1lIGZpdHMgaW4gKi8KKyAgICAgICAgc2VnbWVudC0+c3RhcnQgPSBzZWdtZW50LT50aW1lID0gdGltZTsKKyAgICAgICAgc2VnbWVudC0+cG9zaXRpb24gPSB0aW1lOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIm5vIGluZGV4IGVudHJ5IGZvdW5kIGZvciAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc2VnbWVudC0+c3RhcnQpKTsKKyAgICB9CisKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChpbmRleCk7CisgIH0KKworICByZXR1cm4gYnl0ZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1c2ggKEdzdEZsdkRlbXV4ICogZGVtdXgsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdEZvcm1hdCBmb3JtYXQ7CisgIEdzdFNlZWtGbGFncyBmbGFnczsKKyAgR3N0U2Vla1R5cGUgc3RhcnRfdHlwZSwgc3RvcF90eXBlOworICBnaW50NjQgc3RhcnQsIHN0b3A7CisgIGdkb3VibGUgcmF0ZTsKKyAgZ2Jvb2xlYW4gdXBkYXRlLCBmbHVzaCwgcmV0OworICBHc3RTZWdtZW50IHNlZWtzZWdtZW50OworCisgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgJnJhdGUsICZmb3JtYXQsICZmbGFncywKKyAgICAgICZzdGFydF90eXBlLCAmc3RhcnQsICZzdG9wX3R5cGUsICZzdG9wKTsKKworICBpZiAoZm9ybWF0ICE9IEdTVF9GT1JNQVRfVElNRSkKKyAgICBnb3RvIHdyb25nX2Zvcm1hdDsKKworICBmbHVzaCA9ICEgIShmbGFncyAmIEdTVF9TRUVLX0ZMQUdfRkxVU0gpOworCisgIC8qIFdvcmsgb24gYSBjb3B5IHVudGlsIHdlIGFyZSBzdXJlIHRoZSBzZWVrIHN1Y2NlZWRlZC4gKi8KKyAgbWVtY3B5ICgmc2Vla3NlZ21lbnQsICZkZW11eC0+c2VnbWVudCwgc2l6ZW9mIChHc3RTZWdtZW50KSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzZWdtZW50IGJlZm9yZSBjb25maWd1cmUgJSIgR1NUX1NFR01FTlRfRk9STUFULAorICAgICAgJmRlbXV4LT5zZWdtZW50KTsKKworICAvKiBBcHBseSB0aGUgc2VlayB0byBvdXIgc2VnbWVudCAqLworICBnc3Rfc2VnbWVudF9kb19zZWVrICgmc2Vla3NlZ21lbnQsIHJhdGUsIGZvcm1hdCwgZmxhZ3MsCisgICAgICBzdGFydF90eXBlLCBzdGFydCwgc3RvcF90eXBlLCBzdG9wLCAmdXBkYXRlKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInNlZ21lbnQgY29uZmlndXJlZCAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsCisgICAgICAmc2Vla3NlZ21lbnQpOworCisgIGlmIChmbHVzaCB8fCBzZWVrc2VnbWVudC5wb3NpdGlvbiAhPSBkZW11eC0+c2VnbWVudC5wb3NpdGlvbikgeworICAgIC8qIERvIHRoZSBhY3R1YWwgc2Vla2luZyAqLworICAgIGd1aW50NjQgb2Zmc2V0ID0gZ3N0X2Zsdl9kZW11eF9maW5kX29mZnNldCAoZGVtdXgsICZzZWVrc2VnbWVudCwgZmxhZ3MpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJnZW5lcmF0aW5nIGFuIHVwc3RyZWFtIHNlZWsgYXQgcG9zaXRpb24gJSIKKyAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgb2Zmc2V0KTsKKyAgICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKGRlbXV4LT5zaW5rcGFkLAorICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZWsgKHNlZWtzZWdtZW50LnJhdGUsIEdTVF9GT1JNQVRfQllURVMsCisgICAgICAgICAgICBmbGFncyB8IEdTVF9TRUVLX0ZMQUdfQUNDVVJBVEUsIEdTVF9TRUVLX1RZUEVfU0VULAorICAgICAgICAgICAgb2Zmc2V0LCBHU1RfU0VFS19UWVBFX05PTkUsIDApKTsKKyAgICBpZiAoR19VTkxJS0VMWSAoIXJldCkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJ1cHN0cmVhbSBzZWVrIGZhaWxlZCIpOworICAgIH0KKworICAgIGdzdF9mbG93X2NvbWJpbmVyX3Jlc2V0IChkZW11eC0+Zmxvd2NvbWJpbmVyKTsKKyAgICAvKiBUZWxsIGFsbCB0aGUgc3RyZWFtIHdlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHBvc2l0aW9uIChkaXNjb250KSAqLworICAgIGRlbXV4LT5hdWRpb19uZWVkX2Rpc2NvbnQgPSBUUlVFOworICAgIGRlbXV4LT52aWRlb19uZWVkX2Rpc2NvbnQgPSBUUlVFOworICB9IGVsc2UgeworICAgIHJldCA9IFRSVUU7CisgIH0KKworICBpZiAocmV0KSB7CisgICAgLyogT2sgc2VlayBzdWNjZWVkZWQsIHRha2UgdGhlIG5ld2x5IGNvbmZpZ3VyZWQgc2VnbWVudCAqLworICAgIG1lbWNweSAoJmRlbXV4LT5zZWdtZW50LCAmc2Vla3NlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworCisgICAgLyogVGVsbCBhbGwgdGhlIHN0cmVhbSBhIG5ldyBzZWdtZW50IGlzIG5lZWRlZCAqLworICAgIGRlbXV4LT5hdWRpb19uZWVkX3NlZ21lbnQgPSBUUlVFOworICAgIGRlbXV4LT52aWRlb19uZWVkX3NlZ21lbnQgPSBUUlVFOworICAgIC8qIENsZWFuIGFueSBwb3RlbnRpYWwgbmV3c2VnbWVudCBldmVudCBrZXB0IGZvciB0aGUgc3RyZWFtcy4gVGhlIGZpcnN0CisgICAgICogc3RyZWFtIG5lZWRpbmcgYSBuZXcgc2VnbWVudCB3aWxsIGNyZWF0ZSBhIG5ldyBvbmUuICovCisgICAgaWYgKEdfVU5MSUtFTFkgKGRlbXV4LT5uZXdfc2VnX2V2ZW50KSkgeworICAgICAgZ3N0X2V2ZW50X3VucmVmIChkZW11eC0+bmV3X3NlZ19ldmVudCk7CisgICAgICBkZW11eC0+bmV3X3NlZ19ldmVudCA9IE5VTEw7CisgICAgfQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAicHJlcGFyaW5nIG5ld3NlZ21lbnQgZnJvbSAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGRlbXV4LT5zZWdtZW50LnN0YXJ0KSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoZGVtdXgtPnNlZ21lbnQuc3RvcCkpOworICAgIGRlbXV4LT5uZXdfc2VnX2V2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmZGVtdXgtPnNlZ21lbnQpOworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICB9IGVsc2UgeworICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAoZGVtdXgtPnNpbmtwYWQsIGV2ZW50KTsKKyAgfQorCisgIHJldHVybiByZXQ7CisKKy8qIEVSUk9SUyAqLword3JvbmdfZm9ybWF0OgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIndlIG9ubHkgc3VwcG9ydCBzZWVraW5nIGluIFRJTUUgZm9ybWF0Iik7CisgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2Zsdl9kZW11eF9oYW5kbGVfc2Vla19wdXNoIChHc3RGbHZEZW11eCAqIGRlbXV4LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RGb3JtYXQgZm9ybWF0OworCisgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgTlVMTCwgJmZvcm1hdCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKGZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAid2Ugb25seSBzdXBwb3J0IHNlZWtpbmcgaW4gVElNRSBmb3JtYXQiKTsKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBGaXJzdCB0cnkgdXBzdHJlYW0gKi8KKyAgaWYgKGdzdF9wYWRfcHVzaF9ldmVudCAoZGVtdXgtPnNpbmtwYWQsIGdzdF9ldmVudF9yZWYgKGV2ZW50KSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlVwc3RyZWFtIHN1Y2Nlc3NmdWxseSBzZWVrZWQiKTsKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGlmICghZGVtdXgtPmluZGV4ZWQpIHsKKyAgICBndWludDY0IHNlZWtfb2Zmc2V0ID0gMDsKKyAgICBnYm9vbGVhbiBidWlsZGluZ19pbmRleDsKKworICAgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAgIC8qIGhhbmRsZSB0aGUgc2VlayBpbiB0aGUgY2hhaW4gZnVuY3Rpb24gKi8KKyAgICBkZW11eC0+c2Vla2luZyA9IFRSVUU7CisgICAgZGVtdXgtPnN0YXRlID0gRkxWX1NUQVRFX1NFRUs7CisKKyAgICAvKiBjb3B5IHRoZSBldmVudCAqLworICAgIGlmIChkZW11eC0+c2Vla19ldmVudCkKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZGVtdXgtPnNlZWtfZXZlbnQpOworICAgIGRlbXV4LT5zZWVrX2V2ZW50ID0gZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworCisgICAgLyogc2V0IHRoZSBidWlsZGluZ19pbmRleCBmbGFnIHNvIHRoYXQgb25seSBvbmUgdGhyZWFkIGNhbiBzZXR1cCB0aGUKKyAgICAgKiBzdHJ1Y3R1cmVzIGZvciBpbmRleCBzZWVraW5nLiAqLworICAgIGJ1aWxkaW5nX2luZGV4ID0gZGVtdXgtPmJ1aWxkaW5nX2luZGV4OworICAgIGlmICghYnVpbGRpbmdfaW5kZXgpIHsKKyAgICAgIGRlbXV4LT5idWlsZGluZ19pbmRleCA9IFRSVUU7CisgICAgICBpZiAoIWRlbXV4LT5maWxlX3NpemUKKyAgICAgICAgICAmJiAhZ3N0X3BhZF9wZWVyX3F1ZXJ5X2R1cmF0aW9uIChkZW11eC0+c2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICAgICAgICAgICAgJmRlbXV4LT5maWxlX3NpemUpKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJGYWlsZWQgdG8gcXVlcnkgdXBzdHJlYW0gZmlsZSBzaXplIik7CisgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKworICAgICAgLyogd2UgaG9wZSB0aGUgbGFzdCB0YWcgaXMgYSBzY3JpcHRkYXRhb2JqZWN0IGNvbnRhaW5pbmcgYW4gaW5kZXgKKyAgICAgICAqIHRoZSBzaXplIG9mIHRoZSBsYXN0IHRhZyBpcyBnaXZlbiBpbiB0aGUgbGFzdCBndWludDMyIGJpdHMKKyAgICAgICAqIHRoZW4gd2Ugc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YWcsIHBhcnNlIGl0IGFuZCBob3BlZnVsbHkgb2J0YWluIGFuIGluZGV4ICovCisgICAgICBzZWVrX29mZnNldCA9IGRlbXV4LT5maWxlX3NpemUgLSBzaXplb2YgKGd1aW50MzIpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgIkZpbGUgc2l6ZSBvYnRhaW5lZCwgc2Vla2luZyB0byAlIiBHX0dVSU5UNjRfRk9STUFULCBzZWVrX29mZnNldCk7CisgICAgfQorICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisKKyAgICBpZiAoIWJ1aWxkaW5nX2luZGV4KSB7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGRlbXV4LCAiU2Vla2luZyB0byBsYXN0IDQgYnl0ZXMgYXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICBzZWVrX29mZnNldCk7CisgICAgICByZXR1cm4gZmx2X2RlbXV4X3NlZWtfdG9fb2Zmc2V0IChkZW11eCwgc2Vla19vZmZzZXQpOworICAgIH0KKworICAgIC8qIEZJWE1FOiB3ZSBoYXZlIHRvIGFsd2F5cyByZXR1cm4gdHJ1ZSBzbyB0aGF0IHdlIGRvbid0IGJsb2NrIHRoZSBzZWVrCisgICAgICogdGhyZWFkLgorICAgICAqIE5vdGU6IG1heWJlIGl0IGlzIE9LIHRvIHJldHVybiB0cnVlIGlmIHdlJ3JlIHN0aWxsIGJ1aWxkaW5nIHRoZSBpbmRleCAqLworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIGZsdl9kZW11eF9oYW5kbGVfc2Vla19wdXNoIChkZW11eCwgZXZlbnQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbHZfZGVtdXhfaGFuZGxlX3NlZWtfcHVsbCAoR3N0Rmx2RGVtdXggKiBkZW11eCwgR3N0RXZlbnQgKiBldmVudCwKKyAgICBnYm9vbGVhbiBzZWVraW5nKQoreworICBHc3RGb3JtYXQgZm9ybWF0OworICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgIEdzdFNlZWtUeXBlIHN0YXJ0X3R5cGUsIHN0b3BfdHlwZTsKKyAgZ2ludDY0IHN0YXJ0LCBzdG9wOworICBnZG91YmxlIHJhdGU7CisgIGdib29sZWFuIHVwZGF0ZSwgZmx1c2gsIHJldCA9IEZBTFNFOworICBHc3RTZWdtZW50IHNlZWtzZWdtZW50OworCisgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgJnJhdGUsICZmb3JtYXQsICZmbGFncywKKyAgICAgICZzdGFydF90eXBlLCAmc3RhcnQsICZzdG9wX3R5cGUsICZzdG9wKTsKKworICBpZiAoZm9ybWF0ICE9IEdTVF9GT1JNQVRfVElNRSkKKyAgICBnb3RvIHdyb25nX2Zvcm1hdDsKKworICAvKiBtYXJrIHNlZWtpbmcgdGhyZWFkIGVudGVyaW5nIGZsdXNoaW5nL3BhdXNpbmcgKi8KKyAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgIGlmIChzZWVraW5nKQorICAgIGRlbXV4LT5zZWVraW5nID0gc2Vla2luZzsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKworICBmbHVzaCA9ICEgIShmbGFncyAmIEdTVF9TRUVLX0ZMQUdfRkxVU0gpOworCisgIGlmIChmbHVzaCkgeworICAgIC8qIEZsdXNoIHN0YXJ0IHVwIGFuZCBkb3duc3RyZWFtIHRvIG1ha2Ugc3VyZSBkYXRhIGZsb3cgYW5kIGxvb3BzIGFyZQorICAgICAgIGlkbGUgKi8KKyAgICBnc3RfZmx2X2RlbXV4X3B1c2hfc3JjX2V2ZW50IChkZW11eCwgZ3N0X2V2ZW50X25ld19mbHVzaF9zdGFydCAoKSk7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChkZW11eC0+c2lua3BhZCwgZ3N0X2V2ZW50X25ld19mbHVzaF9zdGFydCAoKSk7CisgIH0gZWxzZSB7CisgICAgLyogUGF1c2UgdGhlIHB1bGxpbmcgdGFzayAqLworICAgIGdzdF9wYWRfcGF1c2VfdGFzayAoZGVtdXgtPnNpbmtwYWQpOworICB9CisKKyAgLyogVGFrZSB0aGUgc3RyZWFtIGxvY2sgKi8KKyAgR1NUX1BBRF9TVFJFQU1fTE9DSyAoZGVtdXgtPnNpbmtwYWQpOworCisgIGlmIChmbHVzaCkgeworICAgIC8qIFN0b3AgZmx1c2hpbmcgdXBzdHJlYW0gd2UgbmVlZCB0byBwdWxsICovCisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChkZW11eC0+c2lua3BhZCwgZ3N0X2V2ZW50X25ld19mbHVzaF9zdG9wIChUUlVFKSk7CisgIH0KKworICAvKiBXb3JrIG9uIGEgY29weSB1bnRpbCB3ZSBhcmUgc3VyZSB0aGUgc2VlayBzdWNjZWVkZWQuICovCisgIG1lbWNweSAoJnNlZWtzZWdtZW50LCAmZGVtdXgtPnNlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic2VnbWVudCBiZWZvcmUgY29uZmlndXJlICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwKKyAgICAgICZkZW11eC0+c2VnbWVudCk7CisKKyAgLyogQXBwbHkgdGhlIHNlZWsgdG8gb3VyIHNlZ21lbnQgKi8KKyAgZ3N0X3NlZ21lbnRfZG9fc2VlayAoJnNlZWtzZWdtZW50LCByYXRlLCBmb3JtYXQsIGZsYWdzLAorICAgICAgc3RhcnRfdHlwZSwgc3RhcnQsIHN0b3BfdHlwZSwgc3RvcCwgJnVwZGF0ZSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzZWdtZW50IGNvbmZpZ3VyZWQgJSIgR1NUX1NFR01FTlRfRk9STUFULAorICAgICAgJnNlZWtzZWdtZW50KTsKKworICBpZiAoZmx1c2ggfHwgc2Vla3NlZ21lbnQucG9zaXRpb24gIT0gZGVtdXgtPnNlZ21lbnQucG9zaXRpb24pIHsKKyAgICAvKiBEbyB0aGUgYWN0dWFsIHNlZWtpbmcgKi8KKyAgICAvKiBpbmRleCBpcyByZWxpYWJsZSBpZiBpdCBpcyBjb21wbGV0ZSBvciB3ZSBkbyBub3QgZ28gdG8gZmFyIGFoZWFkICovCisgICAgaWYgKHNlZWtpbmcgJiYgIWRlbXV4LT5pbmRleGVkICYmCisgICAgICAgIHNlZWtzZWdtZW50LnBvc2l0aW9uID4gZGVtdXgtPmluZGV4X21heF90aW1lICsgMTAgKiBHU1RfU0VDT05EKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImRlbGF5aW5nIHNlZWsgdG8gcG9zdC1zY2FuOyAiCisgICAgICAgICAgIiBpbmRleCBvbmx5IHVwIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+aW5kZXhfbWF4X3RpbWUpKTsKKyAgICAgIC8qIHN0b3AgZmx1c2hpbmcgZm9yIG5vdyAqLworICAgICAgaWYgKGZsdXNoKQorICAgICAgICBnc3RfZmx2X2RlbXV4X3B1c2hfc3JjX2V2ZW50IChkZW11eCwgZ3N0X2V2ZW50X25ld19mbHVzaF9zdG9wIChUUlVFKSk7CisgICAgICAvKiBkZWxlZ2F0ZSBzY2FubmluZyBhbmQgaW5kZXggYnVpbGRpbmcgdG8gdGFzayB0aHJlYWQgdG8gYXZvaWQKKyAgICAgICAqIG9jY3VweWluZyBtYWluIChVSSkgbG9vcCAqLworICAgICAgaWYgKGRlbXV4LT5zZWVrX2V2ZW50KQorICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGRlbXV4LT5zZWVrX2V2ZW50KTsKKyAgICAgIGRlbXV4LT5zZWVrX2V2ZW50ID0gZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworICAgICAgZGVtdXgtPnNlZWtfdGltZSA9IHNlZWtzZWdtZW50LnBvc2l0aW9uOworICAgICAgZGVtdXgtPnN0YXRlID0gRkxWX1NUQVRFX1NFRUs7CisgICAgICAvKiBkbyBub3Qga25vdyBhYm91dCBzdWNjZXMgeWV0LCBidXQgd2UgZGlkIGNhcmUgYW5kIGhhbmRsZWQgaXQgKi8KKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgLyogbm93IGluZGV4IHNob3VsZCBiZSBhcyByZWxpYWJsZSBhcyBpdCBjYW4gYmUgZm9yIGN1cnJlbnQgcHVycG9zZSAqLworICAgIGdzdF9mbHZfZGVtdXhfbW92ZV90b19vZmZzZXQgKGRlbXV4LAorICAgICAgICBnc3RfZmx2X2RlbXV4X2ZpbmRfb2Zmc2V0IChkZW11eCwgJnNlZWtzZWdtZW50LCBmbGFncyksIFRSVUUpOworICAgIHJldCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gVFJVRTsKKyAgfQorCisgIGlmIChmbHVzaCkgeworICAgIC8qIFN0b3AgZmx1c2hpbmcsIHRoZSBzaW5rcyBhcmUgYXQgdGltZSAwIG5vdyAqLworICAgIGdzdF9mbHZfZGVtdXhfcHVzaF9zcmNfZXZlbnQgKGRlbXV4LCBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0b3AgKFRSVUUpKTsKKyAgfQorCisgIGlmIChyZXQpIHsKKyAgICAvKiBPayBzZWVrIHN1Y2NlZWRlZCwgdGFrZSB0aGUgbmV3bHkgY29uZmlndXJlZCBzZWdtZW50ICovCisgICAgbWVtY3B5ICgmZGVtdXgtPnNlZ21lbnQsICZzZWVrc2VnbWVudCwgc2l6ZW9mIChHc3RTZWdtZW50KSk7CisKKyAgICAvKiBOb3RpZnkgYWJvdXQgdGhlIHN0YXJ0IG9mIGEgbmV3IHNlZ21lbnQgKi8KKyAgICBpZiAoZGVtdXgtPnNlZ21lbnQuZmxhZ3MgJiBHU1RfU0VHTUVOVF9GTEFHX1NFR01FTlQpIHsKKyAgICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKGRlbXV4KSwKKyAgICAgICAgICBnc3RfbWVzc2FnZV9uZXdfc2VnbWVudF9zdGFydCAoR1NUX09CSkVDVCAoZGVtdXgpLAorICAgICAgICAgICAgICBkZW11eC0+c2VnbWVudC5mb3JtYXQsIGRlbXV4LT5zZWdtZW50LnBvc2l0aW9uKSk7CisgICAgfQorCisgICAgZ3N0X2Zsb3dfY29tYmluZXJfcmVzZXQgKGRlbXV4LT5mbG93Y29tYmluZXIpOworICAgIC8qIFRlbGwgYWxsIHRoZSBzdHJlYW0gYSBuZXcgc2VnbWVudCBpcyBuZWVkZWQgKi8KKyAgICBkZW11eC0+YXVkaW9fbmVlZF9zZWdtZW50ID0gVFJVRTsKKyAgICBkZW11eC0+dmlkZW9fbmVlZF9zZWdtZW50ID0gVFJVRTsKKyAgICAvKiBDbGVhbiBhbnkgcG90ZW50aWFsIG5ld3NlZ21lbnQgZXZlbnQga2VwdCBmb3IgdGhlIHN0cmVhbXMuIFRoZSBmaXJzdAorICAgICAqIHN0cmVhbSBuZWVkaW5nIGEgbmV3IHNlZ21lbnQgd2lsbCBjcmVhdGUgYSBuZXcgb25lLiAqLworICAgIGlmIChHX1VOTElLRUxZIChkZW11eC0+bmV3X3NlZ19ldmVudCkpIHsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZGVtdXgtPm5ld19zZWdfZXZlbnQpOworICAgICAgZGVtdXgtPm5ld19zZWdfZXZlbnQgPSBOVUxMOworICAgIH0KKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInByZXBhcmluZyBuZXdzZWdtZW50IGZyb20gJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFUICIgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+c2VnbWVudC5zdGFydCksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGRlbXV4LT5zZWdtZW50LnN0b3ApKTsKKyAgICBkZW11eC0+bmV3X3NlZ19ldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmRlbXV4LT5zZWdtZW50KTsKKyAgfQorCitleGl0OgorICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgc2Vla2luZyA9IGRlbXV4LT5zZWVraW5nICYmICFzZWVraW5nOworICBkZW11eC0+c2Vla2luZyA9IEZBTFNFOworICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworCisgIC8qIGlmIHdlIGRldGVjdCBhbiBleHRlcm5hbCBzZWVrIGhhdmluZyBzdGFydGVkIChhbmQgcG9zc2libHkgYWxyZWFkeSBoYXZpbmcKKyAgICogZmx1c2hlZCksIGRvIG5vdCByZXN0YXJ0IHRhc2sgdG8gZ2l2ZSBpdCBhIGNoYW5jZS4KKyAgICogT3RoZXJ3aXNlIGV4dGVybmFsIG9uZSdzIGZsdXNoaW5nIHdpbGwgdGFrZSBjYXJlIHRvIHBhdXNlIHRhc2sgKi8KKyAgaWYgKHNlZWtpbmcpIHsKKyAgICBnc3RfcGFkX3BhdXNlX3Rhc2sgKGRlbXV4LT5zaW5rcGFkKTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfcGFkX3N0YXJ0X3Rhc2sgKGRlbXV4LT5zaW5rcGFkLAorICAgICAgICAoR3N0VGFza0Z1bmN0aW9uKSBnc3RfZmx2X2RlbXV4X2xvb3AsIGRlbXV4LT5zaW5rcGFkLCBOVUxMKTsKKyAgfQorCisgIEdTVF9QQURfU1RSRUFNX1VOTE9DSyAoZGVtdXgtPnNpbmtwYWQpOworCisgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLword3JvbmdfZm9ybWF0OgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIndlIG9ubHkgc3VwcG9ydCBzZWVraW5nIGluIFRJTUUgZm9ybWF0Iik7CisgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorfQorCisvKiBJZiB3ZSBjYW4gcHVsbCB0aGF0J3MgcHJlZmVyZWQgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2Zsdl9kZW11eF9zaW5rX2FjdGl2YXRlIChHc3RQYWQgKiBzaW5rcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQpCit7CisgIEdzdFF1ZXJ5ICpxdWVyeTsKKyAgZ2Jvb2xlYW4gcHVsbF9tb2RlOworCisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19zY2hlZHVsaW5nICgpOworCisgIGlmICghZ3N0X3BhZF9wZWVyX3F1ZXJ5IChzaW5rcGFkLCBxdWVyeSkpIHsKKyAgICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKyAgICBnb3RvIGFjdGl2YXRlX3B1c2g7CisgIH0KKworICBwdWxsX21vZGUgPSBnc3RfcXVlcnlfaGFzX3NjaGVkdWxpbmdfbW9kZV93aXRoX2ZsYWdzIChxdWVyeSwKKyAgICAgIEdTVF9QQURfTU9ERV9QVUxMLCBHU1RfU0NIRURVTElOR19GTEFHX1NFRUtBQkxFKTsKKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisKKyAgaWYgKCFwdWxsX21vZGUpCisgICAgZ290byBhY3RpdmF0ZV9wdXNoOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmtwYWQsICJhY3RpdmF0aW5nIHB1bGwiKTsKKyAgcmV0dXJuIGdzdF9wYWRfYWN0aXZhdGVfbW9kZSAoc2lua3BhZCwgR1NUX1BBRF9NT0RFX1BVTEwsIFRSVUUpOworCithY3RpdmF0ZV9wdXNoOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2lua3BhZCwgImFjdGl2YXRpbmcgcHVzaCIpOworICAgIHJldHVybiBnc3RfcGFkX2FjdGl2YXRlX21vZGUgKHNpbmtwYWQsIEdTVF9QQURfTU9ERV9QVVNILCBUUlVFKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbHZfZGVtdXhfc2lua19hY3RpdmF0ZV9tb2RlIChHc3RQYWQgKiBzaW5rcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UGFkTW9kZSBtb2RlLCBnYm9vbGVhbiBhY3RpdmUpCit7CisgIGdib29sZWFuIHJlczsKKyAgR3N0Rmx2RGVtdXggKmRlbXV4OworCisgIGRlbXV4ID0gR1NUX0ZMVl9ERU1VWCAocGFyZW50KTsKKworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIEdTVF9QQURfTU9ERV9QVVNIOgorICAgICAgZGVtdXgtPnJhbmRvbV9hY2Nlc3MgPSBGQUxTRTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9QQURfTU9ERV9QVUxMOgorICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICBkZW11eC0+cmFuZG9tX2FjY2VzcyA9IFRSVUU7CisgICAgICAgIHJlcyA9IGdzdF9wYWRfc3RhcnRfdGFzayAoc2lua3BhZCwgKEdzdFRhc2tGdW5jdGlvbikgZ3N0X2Zsdl9kZW11eF9sb29wLAorICAgICAgICAgICAgc2lua3BhZCwgTlVMTCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkZW11eC0+cmFuZG9tX2FjY2VzcyA9IEZBTFNFOworICAgICAgICByZXMgPSBnc3RfcGFkX3N0b3BfdGFzayAoc2lua3BhZCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbHZfZGVtdXhfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdEZsdkRlbXV4ICpkZW11eDsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgZGVtdXggPSBHU1RfRkxWX0RFTVVYIChwYXJlbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiaGFuZGxpbmcgZXZlbnQgJXMiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUQVJUOgorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJ0cnlpbmcgdG8gZm9yY2UgY2hhaW4gZnVuY3Rpb24gdG8gZXhpdCIpOworICAgICAgZGVtdXgtPmZsdXNoaW5nID0gVFJVRTsKKyAgICAgIHJldCA9IGdzdF9mbHZfZGVtdXhfcHVzaF9zcmNfZXZlbnQgKGRlbXV4LCBldmVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJmbHVzaGluZyBGTFYgZGVtdXhlciIpOworICAgICAgZ3N0X2Zsdl9kZW11eF9mbHVzaCAoZGVtdXgsIFRSVUUpOworICAgICAgcmV0ID0gZ3N0X2Zsdl9kZW11eF9wdXNoX3NyY19ldmVudCAoZGVtdXgsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICB7CisgICAgICBHc3RJbmRleCAqaW5kZXg7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAicmVjZWl2ZWQgRU9TIik7CisKKyAgICAgIGluZGV4ID0gZ3N0X2Zsdl9kZW11eF9nZXRfaW5kZXggKEdTVF9FTEVNRU5UIChkZW11eCkpOworCisgICAgICBpZiAoaW5kZXgpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJjb21taXR0aW5nIGluZGV4Iik7CisgICAgICAgIGdzdF9pbmRleF9jb21taXQgKGluZGV4LCBkZW11eC0+aW5kZXhfaWQpOworICAgICAgICBnc3Rfb2JqZWN0X3VucmVmIChpbmRleCk7CisgICAgICB9CisKKyAgICAgIGlmICghZGVtdXgtPmF1ZGlvX3BhZCAmJiAhZGVtdXgtPnZpZGVvX3BhZCkgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgRkFJTEVELAorICAgICAgICAgICAgKCJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iKSwgKCJHb3QgRU9TIGJlZm9yZSBhbnkgZGF0YSIpKTsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWRlbXV4LT5ub19tb3JlX3BhZHMpIHsKKyAgICAgICAgICBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgKEdTVF9FTEVNRU5UIChkZW11eCkpOworICAgICAgICAgIGRlbXV4LT5ub19tb3JlX3BhZHMgPSBUUlVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFnc3RfZmx2X2RlbXV4X3B1c2hfc3JjX2V2ZW50IChkZW11eCwgZXZlbnQpKQorICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJmYWlsZWQgcHVzaGluZyBFT1Mgb24gc3RyZWFtcyIpOworICAgICAgfQorICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgIHsKKyAgICAgIEdzdFNlZ21lbnQgaW5fc2VnbWVudDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJyZWNlaXZlZCBuZXcgc2VnbWVudCIpOworCisgICAgICBnc3RfZXZlbnRfY29weV9zZWdtZW50IChldmVudCwgJmluX3NlZ21lbnQpOworCisgICAgICBpZiAoaW5fc2VnbWVudC5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICAgIC8qIHRpbWUgc2VnbWVudCwgdGhpcyBpcyBwZXJmZWN0LCBjb3B5IG92ZXIgdGhlIHZhbHVlcy4gKi8KKyAgICAgICAgbWVtY3B5ICgmZGVtdXgtPnNlZ21lbnQsICZpbl9zZWdtZW50LCBzaXplb2YgKGluX3NlZ21lbnQpKTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIk5FV1NFR01FTlQ6ICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwKKyAgICAgICAgICAgICZkZW11eC0+c2VnbWVudCk7CisKKyAgICAgICAgLyogYW5kIGZvcndhcmQgKi8KKyAgICAgICAgcmV0ID0gZ3N0X2Zsdl9kZW11eF9wdXNoX3NyY19ldmVudCAoZGVtdXgsIGV2ZW50KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIG5vbi10aW1lIGZvcm1hdCAqLworICAgICAgICBkZW11eC0+YXVkaW9fbmVlZF9zZWdtZW50ID0gVFJVRTsKKyAgICAgICAgZGVtdXgtPnZpZGVvX25lZWRfc2VnbWVudCA9IFRSVUU7CisgICAgICAgIHJldCA9IFRSVUU7CisgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgICBpZiAoZGVtdXgtPm5ld19zZWdfZXZlbnQpIHsKKyAgICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGRlbXV4LT5uZXdfc2VnX2V2ZW50KTsKKyAgICAgICAgICBkZW11eC0+bmV3X3NlZ19ldmVudCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdzdF9mbG93X2NvbWJpbmVyX3Jlc2V0IChkZW11eC0+Zmxvd2NvbWJpbmVyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbHZfZGVtdXhfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0Rmx2RGVtdXggKmRlbXV4OworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBkZW11eCA9IEdTVF9GTFZfREVNVVggKHBhcmVudCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJoYW5kbGluZyBldmVudCAlcyIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICAgIC8qIFRyeSB0byBwdXNoIHVwc3RyZWFtIGZpcnN0ICovCisgICAgICBnc3RfZXZlbnRfcmVmIChldmVudCk7CisgICAgICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKGRlbXV4LT5zaW5rcGFkLCBldmVudCk7CisgICAgICBpZiAocmV0KSB7CisgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChkZW11eC0+cmFuZG9tX2FjY2VzcykgeworICAgICAgICByZXQgPSBnc3RfZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1bGwgKGRlbXV4LCBldmVudCwgVFJVRSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBnc3RfZmx2X2RlbXV4X2hhbmRsZV9zZWVrX3B1c2ggKGRlbXV4LCBldmVudCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChkZW11eC0+c2lua3BhZCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbHZfZGVtdXhfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXMgPSBUUlVFOworICBHc3RGbHZEZW11eCAqZGVtdXg7CisKKyAgZGVtdXggPSBHU1RfRkxWX0RFTVVYIChwYXJlbnQpOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0RVUkFUSU9OOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9kdXJhdGlvbiAocXVlcnksICZmb3JtYXQsIE5VTEwpOworCisgICAgICAvKiBkdXJhdGlvbiBpcyB0aW1lIG9ubHkgKi8KKyAgICAgIGlmIChmb3JtYXQgIT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZHVyYXRpb24gcXVlcnkgb25seSBzdXBwb3J0ZWQgZm9yIHRpbWUgIgorICAgICAgICAgICAgImZvcm1hdCIpOworICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgZ290byBiZWFjaDsKKyAgICAgIH0KKworICAgICAgLyogVHJ5IHRvIHB1c2ggdXBzdHJlYW0gZmlyc3QgKi8KKyAgICAgIHJlcyA9IGdzdF9wYWRfcGVlcl9xdWVyeSAoZGVtdXgtPnNpbmtwYWQsIHF1ZXJ5KTsKKyAgICAgIGlmIChyZXMpCisgICAgICAgIGdvdG8gYmVhY2g7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgImR1cmF0aW9uIHF1ZXJ5LCByZXBseWluZyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZGVtdXgtPmR1cmF0aW9uKSk7CisKKyAgICAgIGdzdF9xdWVyeV9zZXRfZHVyYXRpb24gKHF1ZXJ5LCBHU1RfRk9STUFUX1RJTUUsIGRlbXV4LT5kdXJhdGlvbik7CisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX1BPU0lUSU9OOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9wb3NpdGlvbiAocXVlcnksICZmb3JtYXQsIE5VTEwpOworCisgICAgICAvKiBwb3NpdGlvbiBpcyB0aW1lIG9ubHkgKi8KKyAgICAgIGlmIChmb3JtYXQgIT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAicG9zaXRpb24gcXVlcnkgb25seSBzdXBwb3J0ZWQgZm9yIHRpbWUgIgorICAgICAgICAgICAgImZvcm1hdCIpOworICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgZ290byBiZWFjaDsKKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAicG9zaXRpb24gcXVlcnksIHJlcGx5aW5nICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+c2VnbWVudC5wb3NpdGlvbikpOworCisgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgR1NUX0ZPUk1BVF9USU1FLCBkZW11eC0+c2VnbWVudC5wb3NpdGlvbik7CisKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR1NUX1FVRVJZX1NFRUtJTkc6eworICAgICAgR3N0Rm9ybWF0IGZtdDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3NlZWtpbmcgKHF1ZXJ5LCAmZm10LCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICAgICAgLyogRmlyc3QgYXNrIHVwc3RyZWFtICovCisgICAgICBpZiAoZm10ID09IEdTVF9GT1JNQVRfVElNRSAmJiBnc3RfcGFkX3BlZXJfcXVlcnkgKGRlbXV4LT5zaW5rcGFkLCBxdWVyeSkpIHsKKyAgICAgICAgZ2Jvb2xlYW4gc2Vla2FibGU7CisKKyAgICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3NlZWtpbmcgKHF1ZXJ5LCBOVUxMLCAmc2Vla2FibGUsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoc2Vla2FibGUpIHsKKyAgICAgICAgICByZXMgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXMgPSBUUlVFOworICAgICAgLyogRklYTUUsIGNoZWNrIGluZGV4IHRoaXMgd2F5IGlzIG5vdCB0aHJlYWQgc2FmZSAqLworICAgICAgaWYgKGZtdCAhPSBHU1RfRk9STUFUX1RJTUUgfHwgIWRlbXV4LT5pbmRleCkgeworICAgICAgICBnc3RfcXVlcnlfc2V0X3NlZWtpbmcgKHF1ZXJ5LCBmbXQsIEZBTFNFLCAtMSwgLTEpOworICAgICAgfSBlbHNlIGlmIChkZW11eC0+cmFuZG9tX2FjY2VzcykgeworICAgICAgICBnc3RfcXVlcnlfc2V0X3NlZWtpbmcgKHF1ZXJ5LCBHU1RfRk9STUFUX1RJTUUsIFRSVUUsIDAsCisgICAgICAgICAgICBkZW11eC0+ZHVyYXRpb24pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR3N0UXVlcnkgKnBlZXJxdWVyeSA9IGdzdF9xdWVyeV9uZXdfc2Vla2luZyAoR1NUX0ZPUk1BVF9CWVRFUyk7CisgICAgICAgIGdib29sZWFuIHNlZWthYmxlID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5IChkZW11eC0+c2lua3BhZCwgcGVlcnF1ZXJ5KTsKKworICAgICAgICBpZiAoc2Vla2FibGUpCisgICAgICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3NlZWtpbmcgKHBlZXJxdWVyeSwgTlVMTCwgJnNlZWthYmxlLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgZ3N0X3F1ZXJ5X3VucmVmIChwZWVycXVlcnkpOworCisgICAgICAgIGlmIChzZWVrYWJsZSkKKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X3NlZWtpbmcgKHF1ZXJ5LCBHU1RfRk9STUFUX1RJTUUsIHNlZWthYmxlLCAwLAorICAgICAgICAgICAgICBkZW11eC0+ZHVyYXRpb24pOworICAgICAgICBlbHNlCisgICAgICAgICAgZ3N0X3F1ZXJ5X3NldF9zZWVraW5nIChxdWVyeSwgR1NUX0ZPUk1BVF9USU1FLCBGQUxTRSwgLTEsIC0xKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9TRUdNRU5UOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisgICAgICBnaW50NjQgc3RhcnQsIHN0b3A7CisKKyAgICAgIGZvcm1hdCA9IGRlbXV4LT5zZWdtZW50LmZvcm1hdDsKKworICAgICAgc3RhcnQgPQorICAgICAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmZGVtdXgtPnNlZ21lbnQsIGZvcm1hdCwKKyAgICAgICAgICBkZW11eC0+c2VnbWVudC5zdGFydCk7CisgICAgICBpZiAoKHN0b3AgPSBkZW11eC0+c2VnbWVudC5zdG9wKSA9PSAtMSkKKyAgICAgICAgc3RvcCA9IGRlbXV4LT5zZWdtZW50LmR1cmF0aW9uOworICAgICAgZWxzZQorICAgICAgICBzdG9wID0gZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZkZW11eC0+c2VnbWVudCwgZm9ybWF0LCBzdG9wKTsKKworICAgICAgZ3N0X3F1ZXJ5X3NldF9zZWdtZW50IChxdWVyeSwgZGVtdXgtPnNlZ21lbnQucmF0ZSwgZm9ybWF0LCBzdGFydCwgc3RvcCk7CisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX0xBVEVOQ1k6CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKK2JlYWNoOgorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2Zsdl9kZW11eF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RGbHZEZW11eCAqZGVtdXg7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBkZW11eCA9IEdTVF9GTFZfREVNVVggKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICAvKiBJZiB0aGlzIGlzIG91ciBvd24gaW5kZXggZGVzdHJveSBpdCBhcyB0aGUKKyAgICAgICAqIG9sZCBlbnRyaWVzIG1pZ2h0IGJlIHdyb25nIGZvciB0aGUgbmV3IHN0cmVhbSAqLworICAgICAgaWYgKGRlbXV4LT5vd25faW5kZXgpIHsKKyAgICAgICAgZ3N0X29iamVjdF91bnJlZiAoZGVtdXgtPmluZGV4KTsKKyAgICAgICAgZGVtdXgtPmluZGV4ID0gTlVMTDsKKyAgICAgICAgZGVtdXgtPm93bl9pbmRleCA9IEZBTFNFOworICAgICAgfQorCisgICAgICAvKiBJZiBubyBpbmRleCB3YXMgY3JlYXRlZCwgZ2VuZXJhdGUgb25lICovCisgICAgICBpZiAoR19VTkxJS0VMWSAoIWRlbXV4LT5pbmRleCkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJubyBpbmRleCBwcm92aWRlZCBjcmVhdGluZyBvdXIgb3duIik7CisKKyAgICAgICAgZGVtdXgtPmluZGV4ID0gZ19vYmplY3RfbmV3IChnc3RfbWVtX2luZGV4X2dldF90eXBlICgpLCBOVUxMKTsKKworICAgICAgICBnc3RfaW5kZXhfZ2V0X3dyaXRlcl9pZCAoZGVtdXgtPmluZGV4LCBHU1RfT0JKRUNUIChkZW11eCksCisgICAgICAgICAgICAmZGVtdXgtPmluZGV4X2lkKTsKKyAgICAgICAgZGVtdXgtPm93bl9pbmRleCA9IFRSVUU7CisgICAgICB9CisgICAgICBnc3RfZmx2X2RlbXV4X2NsZWFudXAgKGRlbXV4KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICByZXR1cm4gcmV0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfZmx2X2RlbXV4X2NsZWFudXAgKGRlbXV4KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorZ3N0X2Zsdl9kZW11eF9zZXRfaW5kZXggKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RJbmRleCAqIGluZGV4KQoreworICBHc3RGbHZEZW11eCAqZGVtdXggPSBHU1RfRkxWX0RFTVVYIChlbGVtZW50KTsKKyAgR3N0SW5kZXggKm9sZF9pbmRleDsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKworICBvbGRfaW5kZXggPSBkZW11eC0+aW5kZXg7CisKKyAgaWYgKGluZGV4KSB7CisgICAgZGVtdXgtPmluZGV4ID0gZ3N0X29iamVjdF9yZWYgKGluZGV4KTsKKyAgICBkZW11eC0+b3duX2luZGV4ID0gRkFMU0U7CisgIH0gZWxzZQorICAgIGRlbXV4LT5pbmRleCA9IE5VTEw7CisKKyAgaWYgKG9sZF9pbmRleCkKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChkZW11eC0+aW5kZXgpOworCisgIGdzdF9vYmplY3RfcmVmIChpbmRleCk7CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKworICAvKiBvYmplY3QgbG9jayBtaWdodCBiZSB0YWtlbiBhZ2FpbiAqLworICBpZiAoaW5kZXgpCisgICAgZ3N0X2luZGV4X2dldF93cml0ZXJfaWQgKGluZGV4LCBHU1RfT0JKRUNUIChlbGVtZW50KSwgJmRlbXV4LT5pbmRleF9pZCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJTZXQgaW5kZXggJSIgR1NUX1BUUl9GT1JNQVQsIGRlbXV4LT5pbmRleCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoaW5kZXgpOworfQorI2VuZGlmCisKK3N0YXRpYyBHc3RJbmRleCAqCitnc3RfZmx2X2RlbXV4X2dldF9pbmRleCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdEluZGV4ICpyZXN1bHQgPSBOVUxMOworCisgIEdzdEZsdkRlbXV4ICpkZW11eCA9IEdTVF9GTFZfREVNVVggKGVsZW1lbnQpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICBpZiAoZGVtdXgtPmluZGV4KQorICAgIHJlc3VsdCA9IGdzdF9vYmplY3RfcmVmIChkZW11eC0+aW5kZXgpOworICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X2RlbXV4X2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdEZsdkRlbXV4ICpkZW11eCA9IEdTVF9GTFZfREVNVVggKG9iamVjdCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJkaXNwb3NpbmcgRkxWIGRlbXV4ZXIiKTsKKworICBpZiAoZGVtdXgtPmFkYXB0ZXIpIHsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAoZGVtdXgtPmFkYXB0ZXIpOworICAgIGdfb2JqZWN0X3VucmVmIChkZW11eC0+YWRhcHRlcik7CisgICAgZGVtdXgtPmFkYXB0ZXIgPSBOVUxMOworICB9CisKKyAgaWYgKGRlbXV4LT50YWdsaXN0KSB7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmIChkZW11eC0+dGFnbGlzdCk7CisgICAgZGVtdXgtPnRhZ2xpc3QgPSBOVUxMOworICB9CisKKyAgaWYgKGRlbXV4LT5hdWRpb190YWdzKSB7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmIChkZW11eC0+YXVkaW9fdGFncyk7CisgICAgZGVtdXgtPmF1ZGlvX3RhZ3MgPSBOVUxMOworICB9CisKKyAgaWYgKGRlbXV4LT52aWRlb190YWdzKSB7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmIChkZW11eC0+dmlkZW9fdGFncyk7CisgICAgZGVtdXgtPnZpZGVvX3RhZ3MgPSBOVUxMOworICB9CisKKyAgaWYgKGRlbXV4LT5mbG93Y29tYmluZXIpIHsKKyAgICBnc3RfZmxvd19jb21iaW5lcl9mcmVlIChkZW11eC0+Zmxvd2NvbWJpbmVyKTsKKyAgICBkZW11eC0+Zmxvd2NvbWJpbmVyID0gTlVMTDsKKyAgfQorCisgIGlmIChkZW11eC0+bmV3X3NlZ19ldmVudCkgeworICAgIGdzdF9ldmVudF91bnJlZiAoZGVtdXgtPm5ld19zZWdfZXZlbnQpOworICAgIGRlbXV4LT5uZXdfc2VnX2V2ZW50ID0gTlVMTDsKKyAgfQorCisgIGlmIChkZW11eC0+YXVkaW9fY29kZWNfZGF0YSkgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKGRlbXV4LT5hdWRpb19jb2RlY19kYXRhKTsKKyAgICBkZW11eC0+YXVkaW9fY29kZWNfZGF0YSA9IE5VTEw7CisgIH0KKworICBpZiAoZGVtdXgtPnZpZGVvX2NvZGVjX2RhdGEpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChkZW11eC0+dmlkZW9fY29kZWNfZGF0YSk7CisgICAgZGVtdXgtPnZpZGVvX2NvZGVjX2RhdGEgPSBOVUxMOworICB9CisKKyAgaWYgKGRlbXV4LT5hdWRpb19wYWQpIHsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChkZW11eC0+YXVkaW9fcGFkKTsKKyAgICBkZW11eC0+YXVkaW9fcGFkID0gTlVMTDsKKyAgfQorCisgIGlmIChkZW11eC0+dmlkZW9fcGFkKSB7CisgICAgZ3N0X29iamVjdF91bnJlZiAoZGVtdXgtPnZpZGVvX3BhZCk7CisgICAgZGVtdXgtPnZpZGVvX3BhZCA9IE5VTEw7CisgIH0KKworICBpZiAoZGVtdXgtPmluZGV4KSB7CisgICAgZ3N0X29iamVjdF91bnJlZiAoZGVtdXgtPmluZGV4KTsKKyAgICBkZW11eC0+aW5kZXggPSBOVUxMOworICB9CisKKyAgaWYgKGRlbXV4LT50aW1lcykgeworICAgIGdfYXJyYXlfZnJlZSAoZGVtdXgtPnRpbWVzLCBUUlVFKTsKKyAgICBkZW11eC0+dGltZXMgPSBOVUxMOworICB9CisKKyAgaWYgKGRlbXV4LT5maWxlcG9zaXRpb25zKSB7CisgICAgZ19hcnJheV9mcmVlIChkZW11eC0+ZmlsZXBvc2l0aW9ucywgVFJVRSk7CisgICAgZGVtdXgtPmZpbGVwb3NpdGlvbnMgPSBOVUxMOworICB9CisKKyAgR1NUX0NBTExfUEFSRU5UIChHX09CSkVDVF9DTEFTUywgZGlzcG9zZSwgKG9iamVjdCkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2Zsdl9kZW11eF9jbGFzc19pbml0IChHc3RGbHZEZW11eENsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9mbHZfZGVtdXhfZGlzcG9zZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbHZfZGVtdXhfY2hhbmdlX3N0YXRlKTsKKworI2lmIDAKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+c2V0X2luZGV4ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbHZfZGVtdXhfc2V0X2luZGV4KTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Z2V0X2luZGV4ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbHZfZGVtdXhfZ2V0X2luZGV4KTsKKyNlbmRpZgorCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmZsdl9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmYXVkaW9fc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmdmlkZW9fc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkZMViBEZW11eGVyIiwKKyAgICAgICJDb2RlYy9EZW11eGVyIiwgIkRlbXV4IEZMViBmZWVkcyBpbnRvIGRpZ2l0YWwgc3RyZWFtcyIsCisgICAgICAiSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X2RlbXV4X2luaXQgKEdzdEZsdkRlbXV4ICogZGVtdXgpCit7CisgIGRlbXV4LT5zaW5rcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZmx2X3NpbmtfdGVtcGxhdGUsICJzaW5rIik7CisKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKGRlbXV4LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbHZfZGVtdXhfc2lua19ldmVudCkpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoZGVtdXgtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Zsdl9kZW11eF9jaGFpbikpOworICBnc3RfcGFkX3NldF9hY3RpdmF0ZV9mdW5jdGlvbiAoZGVtdXgtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Zsdl9kZW11eF9zaW5rX2FjdGl2YXRlKSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2YXRlbW9kZV9mdW5jdGlvbiAoZGVtdXgtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Zsdl9kZW11eF9zaW5rX2FjdGl2YXRlX21vZGUpKTsKKworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoZGVtdXgpLCBkZW11eC0+c2lua3BhZCk7CisKKyAgZGVtdXgtPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIGRlbXV4LT5mbG93Y29tYmluZXIgPSBnc3RfZmxvd19jb21iaW5lcl9uZXcgKCk7CisKKyAgZGVtdXgtPm93bl9pbmRleCA9IEZBTFNFOworCisgIEdTVF9PQkpFQ1RfRkxBR19TRVQgKGRlbXV4LCBHU1RfRUxFTUVOVF9GTEFHX0lOREVYQUJMRSk7CisKKyAgZ3N0X2Zsdl9kZW11eF9jbGVhbnVwIChkZW11eCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGZsdmRlbXV4X2RlYnVnLCAiZmx2ZGVtdXgiLCAwLCAiRkxWIGRlbXV4ZXIiKTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJmbHZkZW11eCIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICAgZ3N0X2Zsdl9kZW11eF9nZXRfdHlwZSAoKSkgfHwKKyAgICAgICFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiZmx2bXV4IiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgICAgICBnc3RfZmx2X211eF9nZXRfdHlwZSAoKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGZsdiwgIkZMViBtdXhpbmcgYW5kIGRlbXV4aW5nIHBsdWdpbiIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L2Zsdi9nc3RmbHZkZW11eC5oIGIvZ3N0L2Zsdi9nc3RmbHZkZW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYjE3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZmx2L2dzdGZsdmRlbXV4LmgKQEAgLTAsMCArMSwxNjkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gSnVsaWVuIE1vdXR0ZSA8anVsaWVuQG1vdXR0ZS5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0ZMVl9ERU1VWF9IX18KKyNkZWZpbmUgX19GTFZfREVNVVhfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGZsb3djb21iaW5lci5oPgorI2luY2x1ZGUgImdzdGluZGV4LmgiCisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfRkxWX0RFTVVYIFwKKyAgKGdzdF9mbHZfZGVtdXhfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0ZMVl9ERU1VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0ZMVl9ERU1VWCxHc3RGbHZEZW11eCkpCisjZGVmaW5lIEdTVF9GTFZfREVNVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfRkxWX0RFTVVYLEdzdEZsdkRlbXV4Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfRkxWX0RFTVVYKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfRkxWX0RFTVVYKSkKKyNkZWZpbmUgR1NUX0lTX0ZMVl9ERU1VWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9GTFZfREVNVVgpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdEZsdkRlbXV4IEdzdEZsdkRlbXV4OwordHlwZWRlZiBzdHJ1Y3QgX0dzdEZsdkRlbXV4Q2xhc3MgR3N0Rmx2RGVtdXhDbGFzczsKKwordHlwZWRlZiBlbnVtCit7CisgIEZMVl9TVEFURV9IRUFERVIsCisgIEZMVl9TVEFURV9UQUdfVFlQRSwKKyAgRkxWX1NUQVRFX1RBR19WSURFTywKKyAgRkxWX1NUQVRFX1RBR19BVURJTywKKyAgRkxWX1NUQVRFX1RBR19TQ1JJUFQsCisgIEZMVl9TVEFURV9TRUVLLAorICBGTFZfU1RBVEVfRE9ORSwKKyAgRkxWX1NUQVRFX1NLSVAsCisgIEZMVl9TVEFURV9OT05FCit9IEdzdEZsdkRlbXV4U3RhdGU7CisKK3N0cnVjdCBfR3N0Rmx2RGVtdXgKK3sKKyAgR3N0RWxlbWVudCBlbGVtZW50OworCisgIEdzdFBhZCAqc2lua3BhZDsKKworICBHc3RQYWQgKmF1ZGlvX3BhZDsKKyAgR3N0UGFkICp2aWRlb19wYWQ7CisKKyAgZ2Jvb2xlYW4gaGF2ZV9ncm91cF9pZDsKKyAgZ3VpbnQgZ3JvdXBfaWQ7CisKKyAgLyogPHByaXZhdGU+ICovCisgIAorICBHc3RJbmRleCAqaW5kZXg7CisgIGdpbnQgaW5kZXhfaWQ7CisgIGdib29sZWFuIG93bl9pbmRleDsKKyAgCisgIEdBcnJheSAqIHRpbWVzOworICBHQXJyYXkgKiBmaWxlcG9zaXRpb25zOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisKKyAgR3N0Rmxvd0NvbWJpbmVyICpmbG93Y29tYmluZXI7CisKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIEdzdEV2ZW50ICpuZXdfc2VnX2V2ZW50OworCisgIEdzdFRhZ0xpc3QgKnRhZ2xpc3Q7CisgIEdzdFRhZ0xpc3QgKmF1ZGlvX3RhZ3M7CisgIEdzdFRhZ0xpc3QgKnZpZGVvX3RhZ3M7CisKKyAgR3N0Rmx2RGVtdXhTdGF0ZSBzdGF0ZTsKKworICBndWludDY0IG9mZnNldDsKKyAgZ3VpbnQ2NCBjdXJfdGFnX29mZnNldDsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uOworICBndWludDY0IHRhZ19zaXplOworICBndWludDY0IHRhZ19kYXRhX3NpemU7CisKKyAgLyogQXVkaW8gaW5mb3MgKi8KKyAgZ3VpbnQxNiByYXRlOworICBndWludDE2IGNoYW5uZWxzOworICBndWludDE2IHdpZHRoOworICBndWludDE2IGF1ZGlvX2NvZGVjX3RhZzsKKyAgZ3VpbnQ2NCBhdWRpb19vZmZzZXQ7CisgIGdib29sZWFuIGF1ZGlvX25lZWRfZGlzY29udDsKKyAgZ2Jvb2xlYW4gYXVkaW9fbmVlZF9zZWdtZW50OworICBnYm9vbGVhbiBhdWRpb19saW5rZWQ7CisgIEdzdEJ1ZmZlciAqIGF1ZGlvX2NvZGVjX2RhdGE7CisgIEdzdENsb2NrVGltZSBhdWRpb19zdGFydDsKKyAgZ3VpbnQzMiBsYXN0X2F1ZGlvX3B0czsKKyAgR3N0Q2xvY2tUaW1lIGF1ZGlvX3RpbWVfb2Zmc2V0OworCisgIC8qIFZpZGVvIGluZm9zICovCisgIGd1aW50MzIgdzsKKyAgZ3VpbnQzMiBoOworICBndWludDMyIHBhcl94OworICBndWludDMyIHBhcl95OworICBndWludDE2IHZpZGVvX2NvZGVjX3RhZzsKKyAgZ3VpbnQ2NCB2aWRlb19vZmZzZXQ7CisgIGdib29sZWFuIHZpZGVvX25lZWRfZGlzY29udDsKKyAgZ2Jvb2xlYW4gdmlkZW9fbmVlZF9zZWdtZW50OworICBnYm9vbGVhbiB2aWRlb19saW5rZWQ7CisgIGdib29sZWFuIGdvdF9wYXI7CisgIEdzdEJ1ZmZlciAqIHZpZGVvX2NvZGVjX2RhdGE7CisgIEdzdENsb2NrVGltZSB2aWRlb19zdGFydDsKKyAgZ3VpbnQzMiBsYXN0X3ZpZGVvX2R0czsKKyAgR3N0Q2xvY2tUaW1lIHZpZGVvX3RpbWVfb2Zmc2V0OworICBnZG91YmxlIGZyYW1lcmF0ZTsKKworICBnYm9vbGVhbiByYW5kb21fYWNjZXNzOworICBnYm9vbGVhbiBuZWVkX2hlYWRlcjsKKyAgZ2Jvb2xlYW4gaGFzX2F1ZGlvOworICBnYm9vbGVhbiBoYXNfdmlkZW87CisgIGdib29sZWFuIHN0cmljdDsKKyAgZ2Jvb2xlYW4gZmx1c2hpbmc7CisKKyAgZ2Jvb2xlYW4gbm9fbW9yZV9wYWRzOworCisjaWZuZGVmIEdTVF9ESVNBQkxFX0RFQlVHCisgIGdib29sZWFuIG5vX2F1ZGlvX3dhcm5lZDsKKyAgZ2Jvb2xlYW4gbm9fdmlkZW9fd2FybmVkOworI2VuZGlmCisKKyAgZ2Jvb2xlYW4gc2Vla2luZzsKKyAgZ2Jvb2xlYW4gYnVpbGRpbmdfaW5kZXg7CisgIGdib29sZWFuIGluZGV4ZWQ7IC8qIFRSVUUgaWYgaW5kZXggaXMgY29tcGxldGVseSBidWlsdCAqLworICBnYm9vbGVhbiB1cHN0cmVhbV9zZWVrYWJsZTsgLyogVFJVRSBpZiB1cHN0cmVhbSBpcyBzZWVrYWJsZSAqLworICBnaW50NjQgZmlsZV9zaXplOworICBHc3RFdmVudCAqc2Vla19ldmVudDsKKyAgZ2ludDY0IHNlZWtfdGltZTsKKworICBHc3RDbG9ja1RpbWUgaW5kZXhfbWF4X3RpbWU7CisgIGdpbnQ2NCBpbmRleF9tYXhfcG9zOworCisgIC8qIHJldmVyc2UgcGxheWJhY2sgKi8KKyAgR3N0Q2xvY2tUaW1lIHZpZGVvX2ZpcnN0X3RzOworICBHc3RDbG9ja1RpbWUgYXVkaW9fZmlyc3RfdHM7CisgIGdib29sZWFuIHZpZGVvX2RvbmU7CisgIGdib29sZWFuIGF1ZGlvX2RvbmU7CisgIGdpbnQ2NCBmcm9tX29mZnNldDsKKyAgZ2ludDY0IHRvX29mZnNldDsKK307CisKK3N0cnVjdCBfR3N0Rmx2RGVtdXhDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2Zsdl9kZW11eF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19GTFZfREVNVVhfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZmx2L2dzdGZsdm11eC5jIGIvZ3N0L2Zsdi9nc3RmbHZtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzkwN2UwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2Zsdi9nc3RmbHZtdXguYwpAQCAtMCwwICsxLDE4MDggQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwyMDA5IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTcgQ29sbGFib3JhIEx0ZAorICogIEBhdXRob3I6IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICogIEBhdXRob3I6IFZpbmNlbnQgUGVucXVlcmMnaCA8dmluY2VudC5wZW5xdWVyY2hAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1mbHZtdXgKKyAqCisgKiBmbHZtdXggbXV4ZXMgZGlmZmVyZW50IHN0cmVhbXMgaW50byBhbiBGTFYgZmlsZS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgZmx2bXV4IG5hbWU9bXV4ICEgZmlsZXNpbmsgbG9jYXRpb249dGVzdC5mbHYgIGF1ZGlvdGVzdHNyYyBzYW1wbGVzcGVyYnVmZmVyPTQ0MTAwIG51bS1idWZmZXJzPTEwICEgZmFhYyAhIG11eC4gIHZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0yNTAgISB2aWRlby94LXJhdyxmcmFtZXJhdGU9MjUvMSAhIHgyNjRlbmMgISBtdXguCisgKiBdfCBUaGlzIHBpcGVsaW5lIGVuY29kZXMgYSB0ZXN0IGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW0gYW5kIG11eGVzIGJvdGggaW50byBhbiBGTFYgZmlsZS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RmbHZtdXguaCIKKyNpbmNsdWRlICJhbWZkZWZzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGZsdm11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBmbHZtdXhfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfU1RSRUFNQUJMRSwKKyAgUFJPUF9NRVRBREFUQUNSRUFUT1IKK307CisKKyNkZWZpbmUgREVGQVVMVF9TVFJFQU1BQkxFIEZBTFNFCisjZGVmaW5lIE1BWF9JTkRFWF9FTlRSSUVTIDEyOAorI2RlZmluZSBERUZBVUxUX01FVEFEQVRBQ1JFQVRPUiAiR1N0cmVhbWVyICIgUEFDS0FHRV9WRVJTSU9OICIgRkxWIG11eGVyIgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtZmx2IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgdmlkZW9zaW5rX3RlbXBsID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJ2aWRlbyIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWZsYXNoLXZpZGVvOyAiCisgICAgICAgICJ2aWRlby94LWZsYXNoLXNjcmVlbjsgIgorICAgICAgICAidmlkZW8veC12cDYtZmxhc2g7ICIgInZpZGVvL3gtdnA2LWFscGhhOyAiCisgICAgICAgICJ2aWRlby94LWgyNjQsIHN0cmVhbS1mb3JtYXQ9YXZjOyIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGF1ZGlvc2lua190ZW1wbCA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgiYXVkaW8iLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTCisgICAgKCJhdWRpby94LWFkcGNtLCBsYXlvdXQgPSAoc3RyaW5nKSBzd2YsIGNoYW5uZWxzID0gKGludCkgeyAxLCAyIH0sIHJhdGUgPSAoaW50KSB7IDU1MTIsIDExMDI1LCAyMjA1MCwgNDQxMDAgfTsgIgorICAgICAgICAiYXVkaW8vbXBlZywgbXBlZ3ZlcnNpb24gPSAoaW50KSAxLCBsYXllciA9IChpbnQpIDMsIGNoYW5uZWxzID0gKGludCkgeyAxLCAyIH0sIHJhdGUgPSAoaW50KSB7IDU1MTIsIDgwMDAsIDExMDI1LCAyMjA1MCwgNDQxMDAgfSwgcGFyc2VkID0gKGJvb2xlYW4pIFRSVUU7ICIKKyAgICAgICAgImF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uID0gKGludCkgeyA0LCAyIH0sIHN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSByYXc7ICIKKyAgICAgICAgImF1ZGlvL3gtbmVsbHltb3NlciwgY2hhbm5lbHMgPSAoaW50KSB7IDEsIDIgfSwgcmF0ZSA9IChpbnQpIHsgNTUxMiwgODAwMCwgMTEwMjUsIDE2MDAwLCAyMjA1MCwgNDQxMDAgfTsgIgorICAgICAgICAiYXVkaW8veC1yYXcsIGZvcm1hdCA9IChzdHJpbmcpIHsgVTgsIFMxNkxFfSwgbGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsIGNoYW5uZWxzID0gKGludCkgeyAxLCAyIH0sIHJhdGUgPSAoaW50KSB7IDU1MTIsIDExMDI1LCAyMjA1MCwgNDQxMDAgfTsgIgorICAgICAgICAiYXVkaW8veC1hbGF3LCBjaGFubmVscyA9IChpbnQpIHsgMSwgMiB9LCByYXRlID0gKGludCkgeyA1NTEyLCAxMTAyNSwgMjIwNTAsIDQ0MTAwIH07ICIKKyAgICAgICAgImF1ZGlvL3gtbXVsYXcsIGNoYW5uZWxzID0gKGludCkgeyAxLCAyIH0sIHJhdGUgPSAoaW50KSB7IDU1MTIsIDExMDI1LCAyMjA1MCwgNDQxMDAgfTsgIgorICAgICAgICAiYXVkaW8veC1zcGVleCwgY2hhbm5lbHMgPSAoaW50KSAxLCByYXRlID0gKGludCkgMTYwMDA7IikKKyAgICApOworCitHX0RFRklORV9UWVBFIChHc3RGbHZNdXhQYWQsIGdzdF9mbHZfbXV4X3BhZCwgR1NUX1RZUEVfQUdHUkVHQVRPUl9QQUQpOworCisjZGVmaW5lIGdzdF9mbHZfbXV4X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RGbHZNdXgsIGdzdF9mbHZfbXV4LCBHU1RfVFlQRV9BR0dSRUdBVE9SLAorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfVEFHX1NFVFRFUiwgTlVMTCkpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2Zsdl9tdXhfYWdncmVnYXRlIChHc3RBZ2dyZWdhdG9yICogYWdncmVnYXRvciwgZ2Jvb2xlYW4gdGltZW91dCk7CitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbHZfbXV4X3NpbmtfZXZlbnQgKEdzdEFnZ3JlZ2F0b3IgKiBhZ2dyZWdhdG9yLCBHc3RBZ2dyZWdhdG9yUGFkICogcGFkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgR3N0QWdncmVnYXRvclBhZCAqZ3N0X2Zsdl9tdXhfY3JlYXRlX25ld19wYWQgKEdzdEFnZ3JlZ2F0b3IgKiBhZ2csCisgICAgR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgY29uc3QgZ2NoYXIgKiByZXFfbmFtZSwgY29uc3QgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIHZvaWQgZ3N0X2Zsdl9tdXhfcmVsZWFzZV9wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWQgKiBwYWQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2Zsdl9tdXhfdmlkZW9fcGFkX3NldGNhcHMgKEdzdEZsdk11eFBhZCAqIHBhZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2Zsdl9tdXhfYXVkaW9fcGFkX3NldGNhcHMgKEdzdEZsdk11eFBhZCAqIHBhZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CisKK3N0YXRpYyB2b2lkIGdzdF9mbHZfbXV4X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9mbHZfbXV4X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9mbHZfbXV4X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIHZvaWQgZ3N0X2Zsdl9tdXhfcmVzZXQgKEdzdEVsZW1lbnQgKiBlbGVtZW50KTsKK3N0YXRpYyB2b2lkIGdzdF9mbHZfbXV4X3Jlc2V0X3BhZCAoR3N0Rmx2TXV4UGFkICogcGFkKTsKKworc3RhdGljIHZvaWQgZ3N0X2Zsdl9tdXhfcGFkX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9mbHZfbXV4X3N0YXJ0IChHc3RBZ2dyZWdhdG9yICogYWdncmVnYXRvcik7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZmx2X211eF9mbHVzaCAoR3N0QWdncmVnYXRvciAqIGFnZ3JlZ2F0b3IpOworc3RhdGljIEdzdENsb2NrVGltZSBnc3RfZmx2X211eF9nZXRfbmV4dF90aW1lIChHc3RBZ2dyZWdhdG9yICogYWdncmVnYXRvcik7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZmx2X211eF93cml0ZV9lb3MgKEdzdEZsdk11eCAqIG11eCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZmx2X211eF93cml0ZV9oZWFkZXIgKEdzdEZsdk11eCAqIG11eCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZmx2X211eF9yZXdyaXRlX2hlYWRlciAoR3N0Rmx2TXV4ICogbXV4KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZmx2X211eF9hcmVfYWxsX3BhZHNfZW9zIChHc3RGbHZNdXggKiBtdXgpOworCisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZmx2X211eF9wYWRfZmx1c2ggKEdzdEFnZ3JlZ2F0b3JQYWQgKiBwYWQsIEdzdEFnZ3JlZ2F0b3IgKiBhZ2dyZWdhdG9yKQoreworICBHc3RGbHZNdXhQYWQgKmZsdnBhZCA9IEdTVF9GTFZfTVVYX1BBRCAocGFkKTsKKworICBmbHZwYWQtPmxhc3RfdGltZXN0YW1wID0gMDsKKyAgZmx2cGFkLT5wdHMgPSBHU1RfQ0xPQ0tfU1RJTUVfTk9ORTsKKyAgZmx2cGFkLT5kdHMgPSBHU1RfQ0xPQ0tfU1RJTUVfTk9ORTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X211eF9wYWRfY2xhc3NfaW5pdCAoR3N0Rmx2TXV4UGFkQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0QWdncmVnYXRvclBhZENsYXNzICphZ2dyZWdhdG9ycGFkX2NsYXNzID0gKEdzdEFnZ3JlZ2F0b3JQYWRDbGFzcyAqKSBrbGFzczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9mbHZfbXV4X3BhZF9maW5hbGl6ZTsKKworICBhZ2dyZWdhdG9ycGFkX2NsYXNzLT5mbHVzaCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx2X211eF9wYWRfZmx1c2gpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2Zsdl9tdXhfcGFkX2luaXQgKEdzdEZsdk11eFBhZCAqIHBhZCkKK3sKKyAgZ3N0X2Zsdl9tdXhfcmVzZXRfcGFkIChwYWQpOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBnZG91YmxlIHBvc2l0aW9uOworICBnZG91YmxlIHRpbWU7Cit9IEdzdEZsdk11eEluZGV4RW50cnk7CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X211eF9pbmRleF9lbnRyeV9mcmVlIChHc3RGbHZNdXhJbmRleEVudHJ5ICogZW50cnkpCit7CisgIGdfc2xpY2VfZnJlZSAoR3N0Rmx2TXV4SW5kZXhFbnRyeSwgZW50cnkpOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK19nc3RfYnVmZmVyX25ld193cmFwcGVkIChncG9pbnRlciBtZW0sIGdzaXplIHNpemUsIEdGcmVlRnVuYyBmcmVlX2Z1bmMpCit7CisgIEdzdEJ1ZmZlciAqYnVmOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3ICgpOworICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKGJ1ZiwKKyAgICAgIGdzdF9tZW1vcnlfbmV3X3dyYXBwZWQgKGZyZWVfZnVuYyA/IDAgOiBHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksCisgICAgICAgICAgbWVtLCBzaXplLCAwLCBzaXplLCBtZW0sIGZyZWVfZnVuYykpOworCisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lkCitfZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChnc2l6ZSBzaXplLCBHc3RCdWZmZXIgKiogYnVmZmVyLCBndWludDggKiogZGF0YSkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoZGF0YSAhPSBOVUxMKTsKKyAgZ19yZXR1cm5faWZfZmFpbCAoYnVmZmVyICE9IE5VTEwpOworCisgICpkYXRhID0gZ19tYWxsb2MgKHNpemUpOworICAqYnVmZmVyID0gX2dzdF9idWZmZXJfbmV3X3dyYXBwZWQgKCpkYXRhLCBzaXplLCBnX2ZyZWUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2Zsdl9tdXhfY2xhc3NfaW5pdCAoR3N0Rmx2TXV4Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdEFnZ3JlZ2F0b3JDbGFzcyAqZ3N0YWdncmVnYXRvcl9jbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZmx2bXV4X2RlYnVnLCAiZmx2bXV4IiwgMCwgIkZMViBtdXhlciIpOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YWdncmVnYXRvcl9jbGFzcyA9IChHc3RBZ2dyZWdhdG9yQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2Zsdl9tdXhfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfZmx2X211eF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2Zsdl9tdXhfZmluYWxpemU7CisKKyAgLyogRklYTUU6IGlkZWFsbHkgdGhlIHJpZ2h0IG1vZGUgb2Ygb3BlcmF0aW9uIHNob3VsZCBiZSBkZXRlY3RlZAorICAgKiBhdXRvbWF0aWNhbGx5IHVzaW5nIHF1ZXJpZXMgd2hlbiBwYXJhbWV0ZXIgbm90IHNwZWNpZmllZC4gKi8KKyAgLyoqCisgICAqIEdzdEZsdk11eDpzdHJlYW1hYmxlCisgICAqCisgICAqIElmIFRydWUsIHRoZSBvdXRwdXQgd2lsbCBiZSBzdHJlYW1pbmcgZnJpZW5kbHkuIChpZSB3aXRob3V0IGluZGV4ZXMgYW5kCisgICAqIGR1cmF0aW9uKQorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TVFJFQU1BQkxFLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzdHJlYW1hYmxlIiwgInN0cmVhbWFibGUiLAorICAgICAgICAgICJJZiBzZXQgdG8gdHJ1ZSwgdGhlIG91dHB1dCBzaG91bGQgYmUgYXMgaWYgaXQgaXMgdG8gYmUgc3RyZWFtZWQgIgorICAgICAgICAgICJhbmQgaGVuY2Ugbm8gaW5kZXhlcyB3cml0dGVuIG9yIGR1cmF0aW9uIHdyaXR0ZW4uIiwKKyAgICAgICAgICBERUZBVUxUX1NUUkVBTUFCTEUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01FVEFEQVRBQ1JFQVRPUiwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJtZXRhZGF0YWNyZWF0b3IiLCAibWV0YWRhdGFjcmVhdG9yIiwKKyAgICAgICAgICAiVGhlIHZhbHVlIG9mIG1ldGFkYXRhY3JlYXRvciBpbiB0aGUgbWV0YSBwYWNrZXQuIiwKKyAgICAgICAgICBOVUxMLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RhZ2dyZWdhdG9yX2NsYXNzLT5jcmVhdGVfbmV3X3BhZCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Zsdl9tdXhfY3JlYXRlX25ld19wYWQpOworICBnc3RlbGVtZW50X2NsYXNzLT5yZWxlYXNlX3BhZCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx2X211eF9yZWxlYXNlX3BhZCk7CisKKyAgZ3N0YWdncmVnYXRvcl9jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Zsdl9tdXhfc3RhcnQpOworICBnc3RhZ2dyZWdhdG9yX2NsYXNzLT5hZ2dyZWdhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Zsdl9tdXhfYWdncmVnYXRlKTsKKyAgZ3N0YWdncmVnYXRvcl9jbGFzcy0+c2lua19ldmVudCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx2X211eF9zaW5rX2V2ZW50KTsKKyAgZ3N0YWdncmVnYXRvcl9jbGFzcy0+Zmx1c2ggPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2Zsdl9tdXhfZmx1c2gpOworICBnc3RhZ2dyZWdhdG9yX2NsYXNzLT5nZXRfbmV4dF90aW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx2X211eF9nZXRfbmV4dF90aW1lKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZV93aXRoX2d0eXBlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJnZpZGVvc2lua190ZW1wbCwgR1NUX1RZUEVfRkxWX01VWF9QQUQpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZV93aXRoX2d0eXBlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmF1ZGlvc2lua190ZW1wbCwgR1NUX1RZUEVfRkxWX01VWF9QQUQpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbCk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJGTFYgbXV4ZXIiLAorICAgICAgIkNvZGVjL011eGVyIiwKKyAgICAgICJNdXhlcyB2aWRlby9hdWRpbyBzdHJlYW1zIGludG8gYSBGTFYgc3RyZWFtIiwKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZmx2bXV4X2RlYnVnLCAiZmx2bXV4IiwgMCwgIkZMViBtdXhlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2Zsdl9tdXhfaW5pdCAoR3N0Rmx2TXV4ICogbXV4KQoreworICBtdXgtPnNyY3BhZCA9IEdTVF9BR0dSRUdBVE9SX0NBU1QgKG11eCktPnNyY3BhZDsKKworICAvKiBwcm9wZXJ0eSAqLworICBtdXgtPnN0cmVhbWFibGUgPSBERUZBVUxUX1NUUkVBTUFCTEU7CisgIG11eC0+bWV0YWRhdGFjcmVhdG9yID0gZ19zdHJkdXAgKERFRkFVTFRfTUVUQURBVEFDUkVBVE9SKTsKKworICBtdXgtPm5ld190YWdzID0gRkFMU0U7CisKKyAgZ3N0X2Zsdl9tdXhfcmVzZXQgKEdTVF9FTEVNRU5UIChtdXgpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9mbHZfbXV4X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RGbHZNdXggKm11eCA9IEdTVF9GTFZfTVVYIChvYmplY3QpOworCisgIGdzdF9mbHZfbXV4X3Jlc2V0IChHU1RfRUxFTUVOVCAob2JqZWN0KSk7CisgIGdfZnJlZSAobXV4LT5tZXRhZGF0YWNyZWF0b3IpOworCisgIEdfT0JKRUNUX0NMQVNTIChnc3RfZmx2X211eF9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9mbHZfbXV4X3BhZF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0Rmx2TXV4UGFkICpwYWQgPSBHU1RfRkxWX01VWF9QQUQgKG9iamVjdCk7CisKKyAgZ3N0X2Zsdl9tdXhfcmVzZXRfcGFkIChwYWQpOworCisgIEdfT0JKRUNUX0NMQVNTIChnc3RfZmx2X211eF9wYWRfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZmx2X211eF9mbHVzaCAoR3N0QWdncmVnYXRvciAqIGFnZ3JlZ2F0b3IpCit7CisgIC8qIFRPRE86IFdoYXQgaXMgdGhlIHJpZ2h0IGJlaGF2aW91ciBvbiBmbHVzaD8gU2hvdWxkIHdlIGp1c3QgaWdub3JlIGl0ID8KKyAgICogVGhpcyBzdGlsbCBuZWVkcyB0byBiZSBkZWZpbmVkLiAqLworCisgIGdzdF9mbHZfbXV4X3Jlc2V0IChHU1RfRUxFTUVOVCAoYWdncmVnYXRvcikpOworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2Zsdl9tdXhfc3RhcnQgKEdzdEFnZ3JlZ2F0b3IgKiBhZ2dyZWdhdG9yKQoreworICBnc3RfZmx2X211eF9yZXNldCAoR1NUX0VMRU1FTlQgKGFnZ3JlZ2F0b3IpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X211eF9yZXNldCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdEZsdk11eCAqbXV4ID0gR1NUX0ZMVl9NVVggKGVsZW1lbnQpOworCisgIGdfbGlzdF9mb3JlYWNoIChtdXgtPmluZGV4LCAoR0Z1bmMpIGdzdF9mbHZfbXV4X2luZGV4X2VudHJ5X2ZyZWUsIE5VTEwpOworICBnX2xpc3RfZnJlZSAobXV4LT5pbmRleCk7CisgIG11eC0+aW5kZXggPSBOVUxMOworICBtdXgtPmJ5dGVfY291bnQgPSAwOworCisgIG11eC0+ZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBtdXgtPm5ld190YWdzID0gRkFMU0U7CisgIG11eC0+Zmlyc3RfdGltZXN0YW1wID0gR1NUX0NMT0NLX1NUSU1FX05PTkU7CisKKyAgbXV4LT5zdGF0ZSA9IEdTVF9GTFZfTVVYX1NUQVRFX0hFQURFUjsKKworICAvKiB0YWdzICovCisgIGdzdF90YWdfc2V0dGVyX3Jlc2V0X3RhZ3MgKEdTVF9UQUdfU0VUVEVSIChtdXgpKTsKK30KKworLyogRXh0cmFjdCBwZXItY29kZWMgcmVsZXZhbnQgdGFncyBmb3IKKyAqIGluc2VydGlvbiBpbnRvIHRoZSBtZXRhZGF0YSBsYXRlciAtIGllIGJpdHJhdGUsCisgKiBidXQgbWF5YmUgb3RoZXJzIGluIHRoZSBmdXR1cmUgKi8KK3N0YXRpYyB2b2lkCitnc3RfZmx2X211eF9zdG9yZV9jb2RlY190YWdzIChHc3RGbHZNdXggKiBtdXgsCisgICAgR3N0Rmx2TXV4UGFkICogZmx2cGFkLCBHc3RUYWdMaXN0ICogbGlzdCkKK3sKKyAgLyogTG9vayBmb3IgYSBiaXRyYXRlIGFzIGVpdGhlciBub21pbmFsIG9yIGFjdHVhbCBiaXRyYXRlIHRhZyAqLworICBpZiAoZ3N0X3RhZ19saXN0X2dldF91aW50IChsaXN0LCBHU1RfVEFHX05PTUlOQUxfQklUUkFURSwgJmZsdnBhZC0+Yml0cmF0ZSkKKyAgICAgIHx8IGdzdF90YWdfbGlzdF9nZXRfdWludCAobGlzdCwgR1NUX1RBR19CSVRSQVRFLCAmZmx2cGFkLT5iaXRyYXRlKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgIlN0b3JlZCBiaXRyYXRlIGZvciBwYWQgJSIgR1NUX1BUUl9GT1JNQVQgIiA9ICV1IiwKKyAgICAgICAgZmx2cGFkLCBmbHZwYWQtPmJpdHJhdGUpOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2Zsdl9tdXhfc2lua19ldmVudCAoR3N0QWdncmVnYXRvciAqIGFnZ3JlZ2F0b3IsIEdzdEFnZ3JlZ2F0b3JQYWQgKiBwYWQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0Rmx2TXV4ICptdXggPSBHU1RfRkxWX01VWCAoYWdncmVnYXRvcik7CisgIEdzdEZsdk11eFBhZCAqZmx2cGFkID0gKEdzdEZsdk11eFBhZCAqKSBwYWQ7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfY2FwcyAoZXZlbnQsICZjYXBzKTsKKworICAgICAgaWYgKG11eC0+dmlkZW9fcGFkID09IGZsdnBhZCkgeworICAgICAgICByZXQgPSBnc3RfZmx2X211eF92aWRlb19wYWRfc2V0Y2FwcyAoZmx2cGFkLCBjYXBzKTsKKyAgICAgIH0gZWxzZSBpZiAobXV4LT5hdWRpb19wYWQgPT0gZmx2cGFkKSB7CisgICAgICAgIHJldCA9IGdzdF9mbHZfbXV4X2F1ZGlvX3BhZF9zZXRjYXBzIChmbHZwYWQsIGNhcHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfVEFHOnsKKyAgICAgIEdzdFRhZ0xpc3QgKmxpc3Q7CisgICAgICBHc3RUYWdTZXR0ZXIgKnNldHRlciA9IEdTVF9UQUdfU0VUVEVSIChtdXgpOworICAgICAgY29uc3QgR3N0VGFnTWVyZ2VNb2RlIG1vZGUgPSBnc3RfdGFnX3NldHRlcl9nZXRfdGFnX21lcmdlX21vZGUgKHNldHRlcik7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV90YWcgKGV2ZW50LCAmbGlzdCk7CisgICAgICBnc3RfdGFnX3NldHRlcl9tZXJnZV90YWdzIChzZXR0ZXIsIGxpc3QsIG1vZGUpOworICAgICAgZ3N0X2Zsdl9tdXhfc3RvcmVfY29kZWNfdGFncyAobXV4LCBmbHZwYWQsIGxpc3QpOworICAgICAgbXV4LT5uZXdfdGFncyA9IFRSVUU7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmICghcmV0KQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gR1NUX0FHR1JFR0FUT1JfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKGFnZ3JlZ2F0b3IsIHBhZCwKKyAgICAgIGV2ZW50KTs7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2Zsdl9tdXhfdmlkZW9fcGFkX3NldGNhcHMgKEdzdEZsdk11eFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdEZsdk11eCAqbXV4ID0gR1NUX0ZMVl9NVVggKGdzdF9wYWRfZ2V0X3BhcmVudCAocGFkKSk7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIEdzdFN0cnVjdHVyZSAqczsKKworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKHN0cmNtcCAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyksICJ2aWRlby94LWZsYXNoLXZpZGVvIikgPT0gMCkgeworICAgIHBhZC0+Y29kZWMgPSAyOworICB9IGVsc2UgaWYgKHN0cmNtcCAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyksICJ2aWRlby94LWZsYXNoLXNjcmVlbiIpID09IDApIHsKKyAgICBwYWQtPmNvZGVjID0gMzsKKyAgfSBlbHNlIGlmIChzdHJjbXAgKGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHMpLCAidmlkZW8veC12cDYtZmxhc2giKSA9PSAwKSB7CisgICAgcGFkLT5jb2RlYyA9IDQ7CisgIH0gZWxzZSBpZiAoc3RyY21wIChnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKSwgInZpZGVvL3gtdnA2LWFscGhhIikgPT0gMCkgeworICAgIHBhZC0+Y29kZWMgPSA1OworICB9IGVsc2UgaWYgKHN0cmNtcCAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyksICJ2aWRlby94LWgyNjQiKSA9PSAwKSB7CisgICAgcGFkLT5jb2RlYyA9IDc7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gRkFMU0U7CisgIH0KKworICBpZiAocmV0ICYmIGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAiY29kZWNfZGF0YSIpKSB7CisgICAgY29uc3QgR1ZhbHVlICp2YWwgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgImNvZGVjX2RhdGEiKTsKKworICAgIGlmICh2YWwpCisgICAgICBwYWQtPmNvZGVjX2RhdGEgPSBnc3RfYnVmZmVyX3JlZiAoZ3N0X3ZhbHVlX2dldF9idWZmZXIgKHZhbCkpOworICB9CisKKyAgZ3N0X29iamVjdF91bnJlZiAobXV4KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9mbHZfbXV4X2F1ZGlvX3BhZF9zZXRjYXBzIChHc3RGbHZNdXhQYWQgKiBwYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RGbHZNdXggKm11eCA9IEdTVF9GTFZfTVVYIChnc3RfcGFkX2dldF9wYXJlbnQgKHBhZCkpOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGlmIChzdHJjbXAgKGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHMpLCAiYXVkaW8veC1hZHBjbSIpID09IDApIHsKKyAgICBjb25zdCBnY2hhciAqbGF5b3V0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAibGF5b3V0Iik7CisgICAgaWYgKGxheW91dCAmJiBzdHJjbXAgKGxheW91dCwgInN3ZiIpID09IDApIHsKKyAgICAgIHBhZC0+Y29kZWMgPSAxOworICAgIH0gZWxzZSB7CisgICAgICByZXQgPSBGQUxTRTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wIChnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKSwgImF1ZGlvL21wZWciKSA9PSAwKSB7CisgICAgZ2ludCBtcGVndmVyc2lvbjsKKworICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJtcGVndmVyc2lvbiIsICZtcGVndmVyc2lvbikpIHsKKyAgICAgIGlmIChtcGVndmVyc2lvbiA9PSAxKSB7CisgICAgICAgIGdpbnQgbGF5ZXI7CisKKyAgICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImxheWVyIiwgJmxheWVyKSAmJiBsYXllciA9PSAzKSB7CisgICAgICAgICAgZ2ludCByYXRlOworCisgICAgICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgInJhdGUiLCAmcmF0ZSkgJiYgcmF0ZSA9PSA4MDAwKQorICAgICAgICAgICAgcGFkLT5jb2RlYyA9IDE0OworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBhZC0+Y29kZWMgPSAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldCA9IEZBTFNFOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKG1wZWd2ZXJzaW9uID09IDQgfHwgbXBlZ3ZlcnNpb24gPT0gMikgeworICAgICAgICBwYWQtPmNvZGVjID0gMTA7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0ID0gRkFMU0U7CisgICAgfQorICB9IGVsc2UgaWYgKHN0cmNtcCAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyksICJhdWRpby94LW5lbGx5bW9zZXIiKSA9PSAwKSB7CisgICAgZ2ludCByYXRlLCBjaGFubmVsczsKKworICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJyYXRlIiwgJnJhdGUpCisgICAgICAgICYmIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImNoYW5uZWxzIiwgJmNoYW5uZWxzKSkgeworICAgICAgaWYgKGNoYW5uZWxzID09IDEgJiYgcmF0ZSA9PSAxNjAwMCkKKyAgICAgICAgcGFkLT5jb2RlYyA9IDQ7CisgICAgICBlbHNlIGlmIChjaGFubmVscyA9PSAxICYmIHJhdGUgPT0gODAwMCkKKyAgICAgICAgcGFkLT5jb2RlYyA9IDU7CisgICAgICBlbHNlCisgICAgICAgIHBhZC0+Y29kZWMgPSA2OworICAgIH0gZWxzZSB7CisgICAgICBwYWQtPmNvZGVjID0gNjsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wIChnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKSwgImF1ZGlvL3gtcmF3IikgPT0gMCkgeworICAgIEdzdEF1ZGlvSW5mbyBpbmZvOworCisgICAgaWYgKGdzdF9hdWRpb19pbmZvX2Zyb21fY2FwcyAoJmluZm8sIGNhcHMpKSB7CisgICAgICBwYWQtPmNvZGVjID0gMzsKKworICAgICAgaWYgKEdTVF9BVURJT19JTkZPX1dJRFRIICgmaW5mbykgPT0gOCkKKyAgICAgICAgcGFkLT53aWR0aCA9IDA7CisgICAgICBlbHNlIGlmIChHU1RfQVVESU9fSU5GT19XSURUSCAoJmluZm8pID09IDE2KQorICAgICAgICBwYWQtPndpZHRoID0gMTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgfSBlbHNlCisgICAgICByZXQgPSBGQUxTRTsKKyAgfSBlbHNlIGlmIChzdHJjbXAgKGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHMpLCAiYXVkaW8veC1hbGF3IikgPT0gMCkgeworICAgIHBhZC0+Y29kZWMgPSA3OworICB9IGVsc2UgaWYgKHN0cmNtcCAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyksICJhdWRpby94LW11bGF3IikgPT0gMCkgeworICAgIHBhZC0+Y29kZWMgPSA4OworICB9IGVsc2UgaWYgKHN0cmNtcCAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyksICJhdWRpby94LXNwZWV4IikgPT0gMCkgeworICAgIHBhZC0+Y29kZWMgPSAxMTsKKyAgfSBlbHNlIHsKKyAgICByZXQgPSBGQUxTRTsKKyAgfQorCisgIGlmIChyZXQpIHsKKyAgICBnaW50IHJhdGUsIGNoYW5uZWxzOworCisgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgInJhdGUiLCAmcmF0ZSkpIHsKKyAgICAgIGlmIChwYWQtPmNvZGVjID09IDEwKQorICAgICAgICBwYWQtPnJhdGUgPSAzOworICAgICAgZWxzZSBpZiAocmF0ZSA9PSA1NTEyKQorICAgICAgICBwYWQtPnJhdGUgPSAwOworICAgICAgZWxzZSBpZiAocmF0ZSA9PSAxMTAyNSkKKyAgICAgICAgcGFkLT5yYXRlID0gMTsKKyAgICAgIGVsc2UgaWYgKHJhdGUgPT0gMjIwNTApCisgICAgICAgIHBhZC0+cmF0ZSA9IDI7CisgICAgICBlbHNlIGlmIChyYXRlID09IDQ0MTAwKQorICAgICAgICBwYWQtPnJhdGUgPSAzOworICAgICAgZWxzZSBpZiAocmF0ZSA9PSA4MDAwICYmIChwYWQtPmNvZGVjID09IDUgfHwgcGFkLT5jb2RlYyA9PSAxNCkpCisgICAgICAgIHBhZC0+cmF0ZSA9IDA7CisgICAgICBlbHNlIGlmIChyYXRlID09IDE2MDAwICYmIChwYWQtPmNvZGVjID09IDQgfHwgcGFkLT5jb2RlYyA9PSAxMSkpCisgICAgICAgIHBhZC0+cmF0ZSA9IDA7CisgICAgICBlbHNlCisgICAgICAgIHJldCA9IEZBTFNFOworICAgIH0gZWxzZSBpZiAocGFkLT5jb2RlYyA9PSAxMCkgeworICAgICAgcGFkLT5yYXRlID0gMzsKKyAgICB9IGVsc2UgeworICAgICAgcmV0ID0gRkFMU0U7CisgICAgfQorCisgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImNoYW5uZWxzIiwgJmNoYW5uZWxzKSkgeworICAgICAgaWYgKHBhZC0+Y29kZWMgPT0gNCB8fCBwYWQtPmNvZGVjID09IDUKKyAgICAgICAgICB8fCBwYWQtPmNvZGVjID09IDYgfHwgcGFkLT5jb2RlYyA9PSAxMSkKKyAgICAgICAgcGFkLT5jaGFubmVscyA9IDA7CisgICAgICBlbHNlIGlmIChwYWQtPmNvZGVjID09IDEwKQorICAgICAgICBwYWQtPmNoYW5uZWxzID0gMTsKKyAgICAgIGVsc2UgaWYgKGNoYW5uZWxzID09IDEpCisgICAgICAgIHBhZC0+Y2hhbm5lbHMgPSAwOworICAgICAgZWxzZSBpZiAoY2hhbm5lbHMgPT0gMikKKyAgICAgICAgcGFkLT5jaGFubmVscyA9IDE7CisgICAgICBlbHNlCisgICAgICAgIHJldCA9IEZBTFNFOworICAgIH0gZWxzZSBpZiAocGFkLT5jb2RlYyA9PSA0IHx8IHBhZC0+Y29kZWMgPT0gNSB8fCBwYWQtPmNvZGVjID09IDYpIHsKKyAgICAgIHBhZC0+Y2hhbm5lbHMgPSAwOworICAgIH0gZWxzZSBpZiAocGFkLT5jb2RlYyA9PSAxMCkgeworICAgICAgcGFkLT5jaGFubmVscyA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldCA9IEZBTFNFOworICAgIH0KKworICAgIGlmIChwYWQtPmNvZGVjICE9IDMpCisgICAgICBwYWQtPndpZHRoID0gMTsKKyAgfQorCisgIGlmIChyZXQgJiYgZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHMsICJjb2RlY19kYXRhIikpIHsKKyAgICBjb25zdCBHVmFsdWUgKnZhbCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAiY29kZWNfZGF0YSIpOworCisgICAgaWYgKHZhbCkKKyAgICAgIHBhZC0+Y29kZWNfZGF0YSA9IGdzdF9idWZmZXJfcmVmIChnc3RfdmFsdWVfZ2V0X2J1ZmZlciAodmFsKSk7CisgIH0KKworICBnc3Rfb2JqZWN0X3VucmVmIChtdXgpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X211eF9yZXNldF9wYWQgKEdzdEZsdk11eFBhZCAqIHBhZCkKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAicmVzZXR0aW5nIHBhZCIpOworCisgIGlmIChwYWQtPmNvZGVjX2RhdGEpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAocGFkLT5jb2RlY19kYXRhKTsKKyAgcGFkLT5jb2RlY19kYXRhID0gTlVMTDsKKyAgcGFkLT5jb2RlYyA9IEdfTUFYVUlOVDsKKyAgcGFkLT5yYXRlID0gR19NQVhVSU5UOworICBwYWQtPndpZHRoID0gR19NQVhVSU5UOworICBwYWQtPmNoYW5uZWxzID0gR19NQVhVSU5UOworCisgIGdzdF9mbHZfbXV4X3BhZF9mbHVzaCAoR1NUX0FHR1JFR0FUT1JfUEFEX0NBU1QgKHBhZCksIE5VTEwpOworfQorCitzdGF0aWMgR3N0QWdncmVnYXRvclBhZCAqCitnc3RfZmx2X211eF9jcmVhdGVfbmV3X3BhZCAoR3N0QWdncmVnYXRvciAqIGFnZywKKyAgICBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIHJlcV9uYW1lLCBjb25zdCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICprbGFzcyA9IEdTVF9FTEVNRU5UX0dFVF9DTEFTUyAoYWdnKTsKKyAgR3N0QWdncmVnYXRvclBhZCAqYWdncGFkOworICBHc3RGbHZNdXggKm11eCA9IEdTVF9GTFZfTVVYIChhZ2cpOworICBHc3RGbHZNdXhQYWQgKnBhZCA9IE5VTEw7CisgIGNvbnN0IGdjaGFyICpuYW1lID0gTlVMTDsKKyAgZ2Jvb2xlYW4gdmlkZW87CisKKyAgaWYgKG11eC0+c3RhdGUgIT0gR1NUX0ZMVl9NVVhfU1RBVEVfSEVBREVSKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsICJDYW4ndCByZXF1ZXN0IHBhZHMgYWZ0ZXIgd3JpdGluZyBoZWFkZXIiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmICh0ZW1wbCA9PSBnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywgImF1ZGlvIikpIHsKKyAgICBpZiAobXV4LT5hdWRpb19wYWQpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAiQWxyZWFkeSBoYXZlIGFuIGF1ZGlvIHBhZCIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG5hbWUgPSAiYXVkaW8iOworICAgIHZpZGVvID0gRkFMU0U7CisgIH0gZWxzZSBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJ2aWRlbyIpKSB7CisgICAgaWYgKG11eC0+dmlkZW9fcGFkKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgIkFscmVhZHkgaGF2ZSBhIHZpZGVvIHBhZCIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG5hbWUgPSAidmlkZW8iOworICAgIHZpZGVvID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgIkludmFsaWQgdGVtcGxhdGUiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGFnZ3BhZCA9CisgICAgICBHU1RfQUdHUkVHQVRPUl9DTEFTUyAoZ3N0X2Zsdl9tdXhfcGFyZW50X2NsYXNzKS0+Y3JlYXRlX25ld19wYWQgKGFnZywKKyAgICAgIHRlbXBsLCBuYW1lLCBjYXBzKTsKKyAgaWYgKGFnZ3BhZCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHBhZCA9IEdTVF9GTFZfTVVYX1BBRCAoYWdncGFkKTsKKworICBnc3RfZmx2X211eF9yZXNldF9wYWQgKHBhZCk7CisKKyAgaWYgKHZpZGVvKQorICAgIG11eC0+dmlkZW9fcGFkID0gcGFkOworICBlbHNlCisgICAgbXV4LT5hdWRpb19wYWQgPSBwYWQ7CisKKyAgcmV0dXJuIGFnZ3BhZDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9mbHZfbXV4X3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKQoreworICBHc3RGbHZNdXggKm11eCA9IEdTVF9GTFZfTVVYIChlbGVtZW50KTsKKyAgR3N0Rmx2TXV4UGFkICpmbHZwYWQgPSBHU1RfRkxWX01VWF9QQUQgKHBhZCk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChwYWQsIEZBTFNFKTsKKyAgZ3N0X2Zsdl9tdXhfcmVzZXRfcGFkIChmbHZwYWQpOworCisgIGlmIChmbHZwYWQgPT0gbXV4LT52aWRlb19wYWQpIHsKKyAgICBtdXgtPnZpZGVvX3BhZCA9IE5VTEw7CisgIH0gZWxzZSBpZiAoZmx2cGFkID09IG11eC0+YXVkaW9fcGFkKSB7CisgICAgbXV4LT5hdWRpb19wYWQgPSBOVUxMOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFkLCAiUGFkIGlzIG5vdCBrbm93biBhdWRpbyBvciB2aWRlbyBwYWQiKTsKKyAgfQorCisgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKGVsZW1lbnQsIHBhZCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZmx2X211eF9wdXNoIChHc3RGbHZNdXggKiBtdXgsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgLyogcHVzaGluZyB0aGUgYnVmZmVyIHRoYXQgcmV3cml0ZXMgdGhlIGhlYWRlciB3aWxsIG1ha2UgaXQgbm8gbG9uZ2VyIGJlIHRoZQorICAgKiB0b3RhbCBvdXRwdXQgc2l6ZSBpbiBieXRlcywgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIGF0IHRoYXQgcG9pbnQgKi8KKyAgbXV4LT5ieXRlX2NvdW50ICs9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcik7CisKKyAgcmV0dXJuIGdzdF9hZ2dyZWdhdG9yX2ZpbmlzaF9idWZmZXIgKEdTVF9BR0dSRUdBVE9SX0NBU1QgKG11eCksIGJ1ZmZlcik7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X2Zsdl9tdXhfY3JlYXRlX2hlYWRlciAoR3N0Rmx2TXV4ICogbXV4KQoreworICBHc3RCdWZmZXIgKmhlYWRlcjsKKyAgZ3VpbnQ4ICpkYXRhOworICBnYm9vbGVhbiBoYXZlX2F1ZGlvOworICBnYm9vbGVhbiBoYXZlX3ZpZGVvOworCisgIF9nc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDkgKyA0LCAmaGVhZGVyLCAmZGF0YSk7CisKKyAgZGF0YVswXSA9ICdGJzsKKyAgZGF0YVsxXSA9ICdMJzsKKyAgZGF0YVsyXSA9ICdWJzsKKyAgZGF0YVszXSA9IDB4MDE7ICAgICAgICAgICAgICAgLyogVmVyc2lvbiAqLworCisgIGhhdmVfYXVkaW8gPSAobXV4LT5hdWRpb19wYWQgJiYgbXV4LT5hdWRpb19wYWQtPmNvZGVjICE9IEdfTUFYVUlOVCk7CisgIGhhdmVfdmlkZW8gPSAobXV4LT52aWRlb19wYWQgJiYgbXV4LT52aWRlb19wYWQtPmNvZGVjICE9IEdfTUFYVUlOVCk7CisKKyAgZGF0YVs0XSA9IChoYXZlX2F1ZGlvIDw8IDIpIHwgaGF2ZV92aWRlbzsgICAgIC8qIGZsYWdzICovCisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyA1LCA5KTsgICAgLyogZGF0YSBvZmZzZXQgKi8KKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDksIDApOyAgICAvKiBwcmV2aW91cyB0YWcgc2l6ZSAqLworCisgIHJldHVybiBoZWFkZXI7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X2Zsdl9tdXhfcHJlYWxsb2NhdGVfaW5kZXggKEdzdEZsdk11eCAqIG11eCkKK3sKKyAgR3N0QnVmZmVyICp0bXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ2ludCBwcmVhbGxvY2F0ZV9zaXplOworCisgIC8qIHByZWFsbG9jYXRlIGluZGV4IG9mIHNpemU6CisgICAqICAtICdrZXlmcmFtZXMnIEVDTUEgYXJyYXkga2V5OiAyICsgOSA9IDExIGJ5dGVzCisgICAqICAtIG5lc3RlZCBFQ01BIGFycmF5IGhlYWRlciwgbGVuZ3RoIGFuZCBlbmQgbWFya2VyOiA4IGJ5dGVzCisgICAqICAtICd0aW1lcycgYW5kICdmaWxlcG9zaXRpb25zJyBrZXlzOiAyMiBieXRlcworICAgKiAgLSB0d28gc3RyaWN0IGFycmF5cyBoZWFkZXJzIGFuZCBsZW5ndGhzOiAxMCBieXRlcworICAgKiAgLSBlYWNoIGluZGV4IGVudHJ5OiAxOCBieXRlcworICAgKi8KKyAgcHJlYWxsb2NhdGVfc2l6ZSA9IDExICsgOCArIDIyICsgMTAgKyBNQVhfSU5ERVhfRU5UUklFUyAqIDE4OworICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJwcmVhbGxvY2F0aW5nICVkIGJ5dGVzIGZvciB0aGUgaW5kZXgiLAorICAgICAgcHJlYWxsb2NhdGVfc2l6ZSk7CisKKyAgX2dzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAocHJlYWxsb2NhdGVfc2l6ZSwgJnRtcCwgJmRhdGEpOworCisgIC8qIHByZWZpbGwgdGhlIHNwYWNlIHdpdGggYSBnc3RmaWxsZXI6IDxzcGFjZXM+IHNjcmlwdCB0YWcgdmFyaWFibGUgKi8KKyAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSwgOSk7ICAgICAgICAvKiA5IGNoYXJhY3RlcnMgKi8KKyAgbWVtY3B5IChkYXRhICsgMiwgImdzdGZpbGxlciIsIDkpOworICBHU1RfV1JJVEVfVUlOVDggKGRhdGEgKyAxMSwgQU1GMF9TVFJJTkdfTUFSS0VSKTsgICAgICAvKiBhIHN0cmluZyB2YWx1ZSAqLworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhICsgMTIsIHByZWFsbG9jYXRlX3NpemUgLSAxNCk7CisgIG1lbXNldCAoZGF0YSArIDE0LCAnICcsIHByZWFsbG9jYXRlX3NpemUgLSAxNCk7ICAgICAgIC8qIHRoZSByZXN0IGlzIHNwYWNlcyAqLworICByZXR1cm4gdG1wOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9mbHZfbXV4X2NyZWF0ZV9udW1iZXJfc2NyaXB0X3ZhbHVlIChjb25zdCBnY2hhciAqIG5hbWUsIGdkb3VibGUgdmFsdWUpCit7CisgIEdzdEJ1ZmZlciAqdG1wOworICBndWludDggKmRhdGE7CisgIGdzaXplIGxlbiA9IHN0cmxlbiAobmFtZSk7CisKKyAgX2dzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMiArIGxlbiArIDEgKyA4LCAmdG1wLCAmZGF0YSk7CisKKyAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSwgbGVuKTsKKyAgZGF0YSArPSAyOyAgICAgICAgICAgICAgICAgICAgLyogbmFtZSBsZW5ndGggKi8KKyAgbWVtY3B5IChkYXRhLCBuYW1lLCBsZW4pOworICBkYXRhICs9IGxlbjsKKyAgKmRhdGErKyA9IEFNRjBfTlVNQkVSX01BUktFUjsgLyogZG91YmxlIHR5cGUgKi8KKyAgR1NUX1dSSVRFX0RPVUJMRV9CRSAoZGF0YSwgdmFsdWUpOworCisgIHJldHVybiB0bXA7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X2Zsdl9tdXhfY3JlYXRlX21ldGFkYXRhIChHc3RGbHZNdXggKiBtdXgsIGdib29sZWFuIGZ1bGwpCit7CisgIGNvbnN0IEdzdFRhZ0xpc3QgKnRhZ3M7CisgIEdzdEJ1ZmZlciAqc2NyaXB0X3RhZywgKnRtcDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ2ludCBpLCBuX3RhZ3MsIHRhZ3Nfd3JpdHRlbiA9IDA7CisKKyAgdGFncyA9IGdzdF90YWdfc2V0dGVyX2dldF90YWdfbGlzdCAoR1NUX1RBR19TRVRURVIgKG11eCkpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgInRhZ3MgPSAlIiBHU1RfUFRSX0ZPUk1BVCwgdGFncyk7CisKKyAgLyogRklYTUUgcGVyaGFwcyBzb21lIGJ5dGV3cml0ZXInaW5nIGhlcmUgLi4uICovCisKKyAgX2dzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTEsICZzY3JpcHRfdGFnLCAmZGF0YSk7CisKKyAgZGF0YVswXSA9IDE4OworCisgIC8qIERhdGEgc2l6ZSwgdW5rbm93biBmb3Igbm93ICovCisgIGRhdGFbMV0gPSAwOworICBkYXRhWzJdID0gMDsKKyAgZGF0YVszXSA9IDA7CisKKyAgLyogVGltZXN0YW1wICovCisgIGRhdGFbNF0gPSBkYXRhWzVdID0gZGF0YVs2XSA9IGRhdGFbN10gPSAwOworCisgIC8qIFN0cmVhbSBJRCAqLworICBkYXRhWzhdID0gZGF0YVs5XSA9IGRhdGFbMTBdID0gMDsKKworICBfZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMywgJnRtcCwgJmRhdGEpOworICBkYXRhWzBdID0gQU1GMF9TVFJJTkdfTUFSS0VSOyAvKiBzdHJpbmcgKi8KKyAgZGF0YVsxXSA9IDA7CisgIGRhdGFbMl0gPSAxMDsgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCAxMCAqLworICBtZW1jcHkgKCZkYXRhWzNdLCAib25NZXRhRGF0YSIsIDEwKTsKKworICBzY3JpcHRfdGFnID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHNjcmlwdF90YWcsIHRtcCk7CisKKyAgbl90YWdzID0gKHRhZ3MpID8gZ3N0X3RhZ19saXN0X25fdGFncyAodGFncykgOiAwOworICBfZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg1LCAmdG1wLCAmZGF0YSk7CisgIGRhdGFbMF0gPSA4OyAgICAgICAgICAgICAgICAgIC8qIEVDTUEgYXJyYXkgKi8KKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDEsIG5fdGFncyk7CisgIHNjcmlwdF90YWcgPSBnc3RfYnVmZmVyX2FwcGVuZCAoc2NyaXB0X3RhZywgdG1wKTsKKworICBpZiAoIWZ1bGwpCisgICAgZ290byB0YWdzOworCisgIC8qIFNvbWUgcGxheWVycyBleHBlY3QgdGhlICdkdXJhdGlvbicgdG8gYmUgYWx3YXlzIHNldC4gRmlsbCBpdCBvdXQgbGF0ZXIsCisgICAgIGFmdGVyIHF1ZXJ5aW5nIHRoZSBwYWRzIG9yIGFmdGVyIGdldHRpbmcgRU9TICovCisgIGlmICghbXV4LT5zdHJlYW1hYmxlKSB7CisgICAgdG1wID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX251bWJlcl9zY3JpcHRfdmFsdWUgKCJkdXJhdGlvbiIsIDg2NDAwKTsKKyAgICBzY3JpcHRfdGFnID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHNjcmlwdF90YWcsIHRtcCk7CisgICAgdGFnc193cml0dGVuKys7CisKKyAgICAvKiBTb21ldGltZXMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0b3RhbCBmaWxlIHNpemUgaXMgdXNlZnVsIGZvciB0aGUKKyAgICAgICBwbGF5ZXIuIEl0IHdpbGwgYmUgZmlsbGVkIGxhdGVyLCBhZnRlciBnZXR0aW5nIEVPUyAqLworICAgIHRtcCA9IGdzdF9mbHZfbXV4X2NyZWF0ZV9udW1iZXJfc2NyaXB0X3ZhbHVlICgiZmlsZXNpemUiLCAwKTsKKyAgICBzY3JpcHRfdGFnID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHNjcmlwdF90YWcsIHRtcCk7CisgICAgdGFnc193cml0dGVuKys7CisKKyAgICAvKiBQcmVhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGluZGV4IHRvIGJlIHdyaXR0ZW4gYXQgRU9TICovCisgICAgdG1wID0gZ3N0X2Zsdl9tdXhfcHJlYWxsb2NhdGVfaW5kZXggKG11eCk7CisgICAgc2NyaXB0X3RhZyA9IGdzdF9idWZmZXJfYXBwZW5kIChzY3JpcHRfdGFnLCB0bXApOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgIm5vdCBwcmVhbGxvY2F0aW5nIGluZGV4LCBzdHJlYW1hYmxlIG1vZGUiKTsKKyAgfQorCit0YWdzOgorICBmb3IgKGkgPSAwOyB0YWdzICYmIGkgPCBuX3RhZ3M7IGkrKykgeworICAgIGNvbnN0IGdjaGFyICp0YWdfbmFtZSA9IGdzdF90YWdfbGlzdF9udGhfdGFnX25hbWUgKHRhZ3MsIGkpOworICAgIGlmICghc3RyY21wICh0YWdfbmFtZSwgR1NUX1RBR19EVVJBVElPTikpIHsKKyAgICAgIGd1aW50NjQgZHVyOworCisgICAgICBpZiAoIWdzdF90YWdfbGlzdF9nZXRfdWludDY0ICh0YWdzLCBHU1RfVEFHX0RVUkFUSU9OLCAmZHVyKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBtdXgtPmR1cmF0aW9uID0gZHVyOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAodGFnX25hbWUsIEdTVF9UQUdfQVJUSVNUKSB8fAorICAgICAgICAhc3RyY21wICh0YWdfbmFtZSwgR1NUX1RBR19USVRMRSkpIHsKKyAgICAgIGdjaGFyICpzOworICAgICAgY29uc3QgZ2NoYXIgKnQgPSBOVUxMOworCisgICAgICBpZiAoIXN0cmNtcCAodGFnX25hbWUsIEdTVF9UQUdfQVJUSVNUKSkKKyAgICAgICAgdCA9ICJjcmVhdG9yIjsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKHRhZ19uYW1lLCBHU1RfVEFHX1RJVExFKSkKKyAgICAgICAgdCA9ICJ0aXRsZSI7CisKKyAgICAgIGlmICghZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ3MsIHRhZ19uYW1lLCAmcykpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBfZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgyICsgc3RybGVuICh0KSArIDEgKyAyICsgc3RybGVuIChzKSwKKyAgICAgICAgICAmdG1wLCAmZGF0YSk7CisgICAgICBkYXRhWzBdID0gMDsgICAgICAgICAgICAgIC8qIHRhZyBuYW1lIGxlbmd0aCAqLworICAgICAgZGF0YVsxXSA9IHN0cmxlbiAodCk7CisgICAgICBtZW1jcHkgKCZkYXRhWzJdLCB0LCBzdHJsZW4gKHQpKTsKKyAgICAgIGRhdGFbMiArIHN0cmxlbiAodCldID0gMjsgLyogc3RyaW5nICovCisgICAgICBkYXRhWzMgKyBzdHJsZW4gKHQpXSA9IChzdHJsZW4gKHMpID4+IDgpICYgMHhmZjsKKyAgICAgIGRhdGFbNCArIHN0cmxlbiAodCldID0gKHN0cmxlbiAocykpICYgMHhmZjsKKyAgICAgIG1lbWNweSAoJmRhdGFbNSArIHN0cmxlbiAodCldLCBzLCBzdHJsZW4gKHMpKTsKKyAgICAgIHNjcmlwdF90YWcgPSBnc3RfYnVmZmVyX2FwcGVuZCAoc2NyaXB0X3RhZywgdG1wKTsKKworICAgICAgZ19mcmVlIChzKTsKKyAgICAgIHRhZ3Nfd3JpdHRlbisrOworICAgIH0KKyAgfQorCisgIGlmICghZnVsbCkKKyAgICBnb3RvIGVuZDsKKworICBpZiAobXV4LT5kdXJhdGlvbiA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgR0xpc3QgKmw7CisgICAgZ3VpbnQ2NCBkdXI7CisKKyAgICBmb3IgKGwgPSBHU1RfRUxFTUVOVF9DQVNUIChtdXgpLT5zaW5rcGFkczsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICAgIEdzdEZsdk11eFBhZCAqcGFkID0gR1NUX0ZMVl9NVVhfUEFEIChsLT5kYXRhKTsKKworICAgICAgaWYgKGdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAoR1NUX1BBRCAocGFkKSwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgICAgICAoZ2ludDY0ICopICYgZHVyKSAmJiBkdXIgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgICAgICBpZiAobXV4LT5kdXJhdGlvbiA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgICAgICAgIG11eC0+ZHVyYXRpb24gPSBkdXI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtdXgtPmR1cmF0aW9uID0gTUFYIChkdXIsIG11eC0+ZHVyYXRpb24pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmICghbXV4LT5zdHJlYW1hYmxlICYmIG11eC0+ZHVyYXRpb24gIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgIGdkb3VibGUgZDsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgIGQgPSBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChtdXgtPmR1cmF0aW9uKTsKKyAgICBkIC89IChnZG91YmxlKSBHU1RfU0VDT05EOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAiZGV0ZXJtaW5lZCB0aGUgZHVyYXRpb24gdG8gYmUgJWYiLCBkKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoc2NyaXB0X3RhZywgJm1hcCwgR1NUX01BUF9XUklURSk7CisgICAgR1NUX1dSSVRFX0RPVUJMRV9CRSAobWFwLmRhdGEgKyAyOSArIDIgKyA4ICsgMSwgZCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc2NyaXB0X3RhZywgJm1hcCk7CisgIH0KKworICBpZiAobXV4LT52aWRlb19wYWQgJiYgbXV4LT52aWRlb19wYWQtPmNvZGVjICE9IEdfTUFYVUlOVCkgeworICAgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworCisgICAgaWYgKG11eC0+dmlkZW9fcGFkKQorICAgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX1BBRCAobXV4LT52aWRlb19wYWQpKTsKKworICAgIGlmIChjYXBzICE9IE5VTEwpIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqczsKKyAgICAgIGdpbnQgc2l6ZTsKKyAgICAgIGdpbnQgbnVtLCBkZW47CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgInB1dHRpbmcgdmlkZW9jb2RlY2lkICVkIGluIHRoZSBtZXRhZGF0YSIsCisgICAgICAgICAgbXV4LT52aWRlb19wYWQtPmNvZGVjKTsKKworICAgICAgdG1wID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX251bWJlcl9zY3JpcHRfdmFsdWUgKCJ2aWRlb2NvZGVjaWQiLAorICAgICAgICAgIG11eC0+dmlkZW9fcGFkLT5jb2RlYyk7CisgICAgICBzY3JpcHRfdGFnID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHNjcmlwdF90YWcsIHRtcCk7CisgICAgICB0YWdzX3dyaXR0ZW4rKzsKKworICAgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAid2lkdGgiLCAmc2l6ZSkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAicHV0dGluZyB3aWR0aCAlZCBpbiB0aGUgbWV0YWRhdGEiLCBzaXplKTsKKworICAgICAgICB0bXAgPSBnc3RfZmx2X211eF9jcmVhdGVfbnVtYmVyX3NjcmlwdF92YWx1ZSAoIndpZHRoIiwgc2l6ZSk7CisgICAgICAgIHNjcmlwdF90YWcgPSBnc3RfYnVmZmVyX2FwcGVuZCAoc2NyaXB0X3RhZywgdG1wKTsKKyAgICAgICAgdGFnc193cml0dGVuKys7CisgICAgICB9CisKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJoZWlnaHQiLCAmc2l6ZSkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAicHV0dGluZyBoZWlnaHQgJWQgaW4gdGhlIG1ldGFkYXRhIiwgc2l6ZSk7CisKKyAgICAgICAgdG1wID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX251bWJlcl9zY3JpcHRfdmFsdWUgKCJoZWlnaHQiLCBzaXplKTsKKyAgICAgICAgc2NyaXB0X3RhZyA9IGdzdF9idWZmZXJfYXBwZW5kIChzY3JpcHRfdGFnLCB0bXApOworICAgICAgICB0YWdzX3dyaXR0ZW4rKzsKKyAgICAgIH0KKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ZyYWN0aW9uIChzLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgJm51bSwgJmRlbikpIHsKKyAgICAgICAgZ2RvdWJsZSBkOworCisgICAgICAgIGQgPSBudW07CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgInB1dHRpbmcgQXNwZWN0UmF0aW9YICVmIGluIHRoZSBtZXRhZGF0YSIsIGQpOworCisgICAgICAgIHRtcCA9IGdzdF9mbHZfbXV4X2NyZWF0ZV9udW1iZXJfc2NyaXB0X3ZhbHVlICgiQXNwZWN0UmF0aW9YIiwgZCk7CisgICAgICAgIHNjcmlwdF90YWcgPSBnc3RfYnVmZmVyX2FwcGVuZCAoc2NyaXB0X3RhZywgdG1wKTsKKyAgICAgICAgdGFnc193cml0dGVuKys7CisKKyAgICAgICAgZCA9IGRlbjsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAicHV0dGluZyBBc3BlY3RSYXRpb1kgJWYgaW4gdGhlIG1ldGFkYXRhIiwgZCk7CisKKyAgICAgICAgdG1wID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX251bWJlcl9zY3JpcHRfdmFsdWUgKCJBc3BlY3RSYXRpb1kiLCBkKTsKKyAgICAgICAgc2NyaXB0X3RhZyA9IGdzdF9idWZmZXJfYXBwZW5kIChzY3JpcHRfdGFnLCB0bXApOworICAgICAgICB0YWdzX3dyaXR0ZW4rKzsKKyAgICAgIH0KKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ZyYWN0aW9uIChzLCAiZnJhbWVyYXRlIiwgJm51bSwgJmRlbikpIHsKKyAgICAgICAgZ2RvdWJsZSBkOworCisgICAgICAgIGdzdF91dGlsX2ZyYWN0aW9uX3RvX2RvdWJsZSAobnVtLCBkZW4sICZkKTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAicHV0dGluZyBmcmFtZXJhdGUgJWYgaW4gdGhlIG1ldGFkYXRhIiwgZCk7CisKKyAgICAgICAgdG1wID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX251bWJlcl9zY3JpcHRfdmFsdWUgKCJmcmFtZXJhdGUiLCBkKTsKKyAgICAgICAgc2NyaXB0X3RhZyA9IGdzdF9idWZmZXJfYXBwZW5kIChzY3JpcHRfdGFnLCB0bXApOworICAgICAgICB0YWdzX3dyaXR0ZW4rKzsKKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAicHV0dGluZyB2aWRlb2RhdGFyYXRlICV1IEtCL3MgaW4gdGhlIG1ldGFkYXRhIiwKKyAgICAgICAgICBtdXgtPnZpZGVvX3BhZC0+Yml0cmF0ZSAvIDEwMjQpOworICAgICAgdG1wID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX251bWJlcl9zY3JpcHRfdmFsdWUgKCJ2aWRlb2RhdGFyYXRlIiwKKyAgICAgICAgICBtdXgtPnZpZGVvX3BhZC0+Yml0cmF0ZSAvIDEwMjQpOworICAgICAgc2NyaXB0X3RhZyA9IGdzdF9idWZmZXJfYXBwZW5kIChzY3JpcHRfdGFnLCB0bXApOworICAgICAgdGFnc193cml0dGVuKys7CisgICAgfQorICB9CisKKyAgaWYgKG11eC0+YXVkaW9fcGFkICYmIG11eC0+YXVkaW9fcGFkLT5jb2RlYyAhPSBHX01BWFVJTlQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJwdXR0aW5nIGF1ZGlvY29kZWNpZCAlZCBpbiB0aGUgbWV0YWRhdGEiLAorICAgICAgICBtdXgtPmF1ZGlvX3BhZC0+Y29kZWMpOworCisgICAgdG1wID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX251bWJlcl9zY3JpcHRfdmFsdWUgKCJhdWRpb2NvZGVjaWQiLAorICAgICAgICBtdXgtPmF1ZGlvX3BhZC0+Y29kZWMpOworICAgIHNjcmlwdF90YWcgPSBnc3RfYnVmZmVyX2FwcGVuZCAoc2NyaXB0X3RhZywgdG1wKTsKKyAgICB0YWdzX3dyaXR0ZW4rKzsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgInB1dHRpbmcgYXVkaW9kYXRhcmF0ZSAldSBLQi9zIGluIHRoZSBtZXRhZGF0YSIsCisgICAgICAgIG11eC0+YXVkaW9fcGFkLT5iaXRyYXRlIC8gMTAyNCk7CisgICAgdG1wID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX251bWJlcl9zY3JpcHRfdmFsdWUgKCJhdWRpb2RhdGFyYXRlIiwKKyAgICAgICAgbXV4LT5hdWRpb19wYWQtPmJpdHJhdGUgLyAxMDI0KTsKKyAgICBzY3JpcHRfdGFnID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHNjcmlwdF90YWcsIHRtcCk7CisgICAgdGFnc193cml0dGVuKys7CisgIH0KKworICBfZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgyICsgMTUgKyAxICsgMiArIHN0cmxlbiAobXV4LT5tZXRhZGF0YWNyZWF0b3IpLAorICAgICAgJnRtcCwgJmRhdGEpOworICBkYXRhWzBdID0gMDsgICAgICAgICAgICAgICAgICAvKiAxNSBieXRlcyBuYW1lICovCisgIGRhdGFbMV0gPSAxNTsKKyAgbWVtY3B5ICgmZGF0YVsyXSwgIm1ldGFkYXRhY3JlYXRvciIsIDE1KTsKKyAgZGF0YVsxN10gPSAyOyAgICAgICAgICAgICAgICAgLyogc3RyaW5nICovCisgIGRhdGFbMThdID0gKHN0cmxlbiAobXV4LT5tZXRhZGF0YWNyZWF0b3IpID4+IDgpICYgMHhmZjsKKyAgZGF0YVsxOV0gPSAoc3RybGVuIChtdXgtPm1ldGFkYXRhY3JlYXRvcikpICYgMHhmZjsKKyAgbWVtY3B5ICgmZGF0YVsyMF0sIG11eC0+bWV0YWRhdGFjcmVhdG9yLCBzdHJsZW4gKG11eC0+bWV0YWRhdGFjcmVhdG9yKSk7CisgIHNjcmlwdF90YWcgPSBnc3RfYnVmZmVyX2FwcGVuZCAoc2NyaXB0X3RhZywgdG1wKTsKKworICB0YWdzX3dyaXR0ZW4rKzsKKworICB7CisgICAgR1RpbWVWYWwgdHYgPSB7IDAsIH07CisgICAgdGltZV90IHNlY3M7CisgICAgc3RydWN0IHRtICp0bTsKKyAgICBnY2hhciAqczsKKyAgICBzdGF0aWMgY29uc3QgZ2NoYXIgKndlZWtkYXlzW10gPSB7CisgICAgICAiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IgorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGdjaGFyICptb250aHNbXSA9IHsKKyAgICAgICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLAorICAgICAgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiCisgICAgfTsKKworICAgIGdfZ2V0X2N1cnJlbnRfdGltZSAoJnR2KTsKKyAgICBzZWNzID0gdHYudHZfc2VjOworICAgIHRtID0gZ210aW1lICgmc2Vjcyk7CisKKyAgICBzID0gZ19zdHJkdXBfcHJpbnRmICgiJXMgJXMgJWQgJTAyZDolMDJkOiUwMmQgJWQiLCB3ZWVrZGF5c1t0bS0+dG1fd2RheV0sCisgICAgICAgIG1vbnRoc1t0bS0+dG1fbW9uXSwgdG0tPnRtX21kYXksIHRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjLAorICAgICAgICB0bS0+dG1feWVhciArIDE5MDApOworCisgICAgX2dzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMiArIDEyICsgMSArIDIgKyBzdHJsZW4gKHMpLCAmdG1wLCAmZGF0YSk7CisgICAgZGF0YVswXSA9IDA7ICAgICAgICAgICAgICAgIC8qIDEyIGJ5dGVzIG5hbWUgKi8KKyAgICBkYXRhWzFdID0gMTI7CisgICAgbWVtY3B5ICgmZGF0YVsyXSwgImNyZWF0aW9uZGF0ZSIsIDEyKTsKKyAgICBkYXRhWzE0XSA9IDI7ICAgICAgICAgICAgICAgLyogc3RyaW5nICovCisgICAgZGF0YVsxNV0gPSAoc3RybGVuIChzKSA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVsxNl0gPSAoc3RybGVuIChzKSkgJiAweGZmOworICAgIG1lbWNweSAoJmRhdGFbMTddLCBzLCBzdHJsZW4gKHMpKTsKKyAgICBzY3JpcHRfdGFnID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHNjcmlwdF90YWcsIHRtcCk7CisKKyAgICBnX2ZyZWUgKHMpOworICAgIHRhZ3Nfd3JpdHRlbisrOworICB9CisKK2VuZDoKKworICBpZiAoIXRhZ3Nfd3JpdHRlbikgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKHNjcmlwdF90YWcpOworICAgIHNjcmlwdF90YWcgPSBOVUxMOworICAgIGdvdG8gZXhpdDsKKyAgfQorCisgIF9nc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDIgKyAwICsgMSwgJnRtcCwgJmRhdGEpOworICBkYXRhWzBdID0gMDsgICAgICAgICAgICAgICAgICAvKiAwIGJ5dGUgc2l6ZSAqLworICBkYXRhWzFdID0gMDsKKyAgZGF0YVsyXSA9IDk7ICAgICAgICAgICAgICAgICAgLyogZW5kIG1hcmtlciAqLworICBzY3JpcHRfdGFnID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHNjcmlwdF90YWcsIHRtcCk7CisKKworICBfZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg0LCAmdG1wLCAmZGF0YSk7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEsIGdzdF9idWZmZXJfZ2V0X3NpemUgKHNjcmlwdF90YWcpKTsKKyAgc2NyaXB0X3RhZyA9IGdzdF9idWZmZXJfYXBwZW5kIChzY3JpcHRfdGFnLCB0bXApOworCisgIGdzdF9idWZmZXJfbWFwIChzY3JpcHRfdGFnLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgbWFwLmRhdGFbMV0gPSAoKGdzdF9idWZmZXJfZ2V0X3NpemUgKHNjcmlwdF90YWcpIC0gMTEgLSA0KSA+PiAxNikgJiAweGZmOworICBtYXAuZGF0YVsyXSA9ICgoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoc2NyaXB0X3RhZykgLSAxMSAtIDQpID4+IDgpICYgMHhmZjsKKyAgbWFwLmRhdGFbM10gPSAoKGdzdF9idWZmZXJfZ2V0X3NpemUgKHNjcmlwdF90YWcpIC0gMTEgLSA0KSA+PiAwKSAmIDB4ZmY7CisKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAobWFwLmRhdGEgKyAxMSArIDEzICsgMSwgdGFnc193cml0dGVuKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoc2NyaXB0X3RhZywgJm1hcCk7CisKK2V4aXQ6CisgIHJldHVybiBzY3JpcHRfdGFnOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9mbHZfbXV4X2J1ZmZlcl90b190YWdfaW50ZXJuYWwgKEdzdEZsdk11eCAqIG11eCwgR3N0QnVmZmVyICogYnVmZmVyLAorICAgIEdzdEZsdk11eFBhZCAqIHBhZCwgZ2Jvb2xlYW4gaXNfY29kZWNfZGF0YSkKK3sKKyAgR3N0QnVmZmVyICp0YWc7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludCBzaXplOworICBndWludDMyIHB0cywgZHRzLCBjdHM7CisgIGd1aW50OCAqZGF0YSwgKmJkYXRhID0gTlVMTDsKKyAgZ3NpemUgYnNpemUgPSAwOworCisgIGlmICghR1NUX0NMT0NLX1NUSU1FX0lTX1ZBTElEIChwYWQtPmR0cykpIHsKKyAgICBwdHMgPSBkdHMgPSBwYWQtPmxhc3RfdGltZXN0YW1wIC8gR1NUX01TRUNPTkQ7CisgIH0gZWxzZSB7CisgICAgcHRzID0gcGFkLT5wdHMgLyBHU1RfTVNFQ09ORDsKKyAgICBkdHMgPSBwYWQtPmR0cyAvIEdTVF9NU0VDT05EOworICB9CisKKyAgLyogQmUgc2FmZSBpbiBjYXNlIFRTIGFyZSBidWdneSAqLworICBpZiAocHRzID4gZHRzKQorICAgIGN0cyA9IHB0cyAtIGR0czsKKyAgZWxzZQorICAgIGN0cyA9IDA7CisKKyAgLyogVGltZXN0YW1wIG11c3Qgc3RhcnQgYXQgemVybyAqLworICBpZiAoR1NUX0NMT0NLX1NUSU1FX0lTX1ZBTElEIChtdXgtPmZpcnN0X3RpbWVzdGFtcCkpIHsKKyAgICBkdHMgLT0gbXV4LT5maXJzdF90aW1lc3RhbXAgLyBHU1RfTVNFQ09ORDsKKyAgICBwdHMgPSBkdHMgKyBjdHM7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAobXV4LCAiZ290IHB0cyAlaSBkdHMgJWkgY3RzICVpIiwgcHRzLCBkdHMsIGN0cyk7CisKKyAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBiZGF0YSA9IG1hcC5kYXRhOworICAgIGJzaXplID0gbWFwLnNpemU7CisgIH0KKworICBzaXplID0gMTE7CisgIGlmIChtdXgtPnZpZGVvX3BhZCA9PSBwYWQpIHsKKyAgICBzaXplICs9IDE7CisgICAgaWYgKHBhZC0+Y29kZWMgPT0gNykKKyAgICAgIHNpemUgKz0gNCArIGJzaXplOworICAgIGVsc2UKKyAgICAgIHNpemUgKz0gYnNpemU7CisgIH0gZWxzZSB7CisgICAgc2l6ZSArPSAxOworICAgIGlmIChwYWQtPmNvZGVjID09IDEwKQorICAgICAgc2l6ZSArPSAxICsgYnNpemU7CisgICAgZWxzZQorICAgICAgc2l6ZSArPSBic2l6ZTsKKyAgfQorICBzaXplICs9IDQ7CisKKyAgX2dzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZSwgJnRhZywgJmRhdGEpOworICBtZW1zZXQgKGRhdGEsIDAsIHNpemUpOworCisgIGRhdGFbMF0gPSAobXV4LT52aWRlb19wYWQgPT0gcGFkKSA/IDkgOiA4OworCisgIGRhdGFbMV0gPSAoKHNpemUgLSAxMSAtIDQpID4+IDE2KSAmIDB4ZmY7CisgIGRhdGFbMl0gPSAoKHNpemUgLSAxMSAtIDQpID4+IDgpICYgMHhmZjsKKyAgZGF0YVszXSA9ICgoc2l6ZSAtIDExIC0gNCkgPj4gMCkgJiAweGZmOworCisgIEdTVF9XUklURV9VSU5UMjRfQkUgKGRhdGEgKyA0LCBkdHMpOworICBkYXRhWzddID0gKCgoZ3VpbnQpIGR0cykgPj4gMjQpICYgMHhmZjsKKworICBkYXRhWzhdID0gZGF0YVs5XSA9IGRhdGFbMTBdID0gMDsKKworICBpZiAobXV4LT52aWRlb19wYWQgPT0gcGFkKSB7CisgICAgaWYgKGJ1ZmZlciAmJiBHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKSkKKyAgICAgIGRhdGFbMTFdIHw9IDIgPDwgNDsKKyAgICBlbHNlCisgICAgICBkYXRhWzExXSB8PSAxIDw8IDQ7CisKKyAgICBkYXRhWzExXSB8PSBwYWQtPmNvZGVjICYgMHgwZjsKKworICAgIGlmIChwYWQtPmNvZGVjID09IDcpIHsKKyAgICAgIGlmIChpc19jb2RlY19kYXRhKSB7CisgICAgICAgIGRhdGFbMTJdID0gMDsKKyAgICAgICAgR1NUX1dSSVRFX1VJTlQyNF9CRSAoZGF0YSArIDEzLCAwKTsKKyAgICAgIH0gZWxzZSBpZiAoYnNpemUgPT0gMCkgeworICAgICAgICAvKiBBVkMgZW5kIG9mIHNlcXVlbmNlICovCisgICAgICAgIGRhdGFbMTJdID0gMjsKKyAgICAgICAgR1NUX1dSSVRFX1VJTlQyNF9CRSAoZGF0YSArIDEzLCAwKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEFDViBOQUxVICovCisgICAgICAgIGRhdGFbMTJdID0gMTsKKyAgICAgICAgR1NUX1dSSVRFX1VJTlQyNF9CRSAoZGF0YSArIDEzLCBjdHMpOworICAgICAgfQorICAgICAgbWVtY3B5IChkYXRhICsgMTEgKyAxICsgNCwgYmRhdGEsIGJzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVtY3B5IChkYXRhICsgMTEgKyAxLCBiZGF0YSwgYnNpemUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBkYXRhWzExXSB8PSAocGFkLT5jb2RlYyA8PCA0KSAmIDB4ZjA7CisgICAgZGF0YVsxMV0gfD0gKHBhZC0+cmF0ZSA8PCAyKSAmIDB4MGM7CisgICAgZGF0YVsxMV0gfD0gKHBhZC0+d2lkdGggPDwgMSkgJiAweDAyOworICAgIGRhdGFbMTFdIHw9IChwYWQtPmNoYW5uZWxzIDw8IDApICYgMHgwMTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgIkNyZWF0aW5nIGJ5dGUgJTAyeCB3aXRoICIKKyAgICAgICAgImNvZGVjOiVkLCByYXRlOiVkLCB3aWR0aDolZCwgY2hhbm5lbHM6JWQiLAorICAgICAgICBkYXRhWzExXSwgcGFkLT5jb2RlYywgcGFkLT5yYXRlLCBwYWQtPndpZHRoLCBwYWQtPmNoYW5uZWxzKTsKKworICAgIGlmIChwYWQtPmNvZGVjID09IDEwKSB7CisgICAgICBkYXRhWzEyXSA9IGlzX2NvZGVjX2RhdGEgPyAwIDogMTsKKworICAgICAgbWVtY3B5IChkYXRhICsgMTEgKyAxICsgMSwgYmRhdGEsIGJzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVtY3B5IChkYXRhICsgMTEgKyAxLCBiZGF0YSwgYnNpemUpOworICAgIH0KKyAgfQorCisgIGlmIChidWZmZXIpCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgc2l6ZSAtIDQsIHNpemUgLSA0KTsKKworICBHU1RfQlVGRkVSX1BUUyAodGFnKSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIEdTVF9CVUZGRVJfRFRTICh0YWcpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAodGFnKSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgaWYgKGJ1ZmZlcikgeworICAgIC8qIGlmIHdlIGFyZSBzdHJlYW1hYmxlIHdlIGNvcHkgb3ZlciB0aW1lc3RhbXBzIGFuZCBvZmZzZXRzLAorICAgICAgIGlmIG5vdCBqdXN0IGNvcHkgdGhlIG9mZnNldHMgKi8KKyAgICBpZiAobXV4LT5zdHJlYW1hYmxlKSB7CisgICAgICBnc3RfYnVmZmVyX2NvcHlfaW50byAodGFnLCBidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9USU1FU1RBTVBTLCAwLCAtMSk7CisgICAgICBHU1RfQlVGRkVSX09GRlNFVCAodGFnKSA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisgICAgICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKHRhZykgPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfQlVGRkVSX09GRlNFVCAodGFnKSA9IEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpOworICAgICAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EICh0YWcpID0gR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWZmZXIpOworICAgIH0KKworICAgIC8qIG1hcmsgdGhlIGJ1ZmZlciBpZiBpdCdzIGFuIGF1ZGlvIGJ1ZmZlciBhbmQgdGhlcmUncyBhbHNvIHZpZGVvIGJlaW5nIG11eGVkCisgICAgICogb3IgaXQncyBhIHZpZGVvIGludGVyZnJhbWUgKi8KKyAgICBpZiAobXV4LT52aWRlb19wYWQgPT0gcGFkICYmCisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpKQorICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAodGFnLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAodGFnLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgR1NUX0JVRkZFUl9PRkZTRVQgKHRhZykgPSBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKHRhZykgPQorICAgICAgICBHU1RfQlVGRkVSX09GRlNFVF9OT05FOworICB9CisKKyAgcmV0dXJuIHRhZzsKK30KKworc3RhdGljIGlubGluZSBHc3RCdWZmZXIgKgorZ3N0X2Zsdl9tdXhfYnVmZmVyX3RvX3RhZyAoR3N0Rmx2TXV4ICogbXV4LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgR3N0Rmx2TXV4UGFkICogcGFkKQoreworICByZXR1cm4gZ3N0X2Zsdl9tdXhfYnVmZmVyX3RvX3RhZ19pbnRlcm5hbCAobXV4LCBidWZmZXIsIHBhZCwgRkFMU0UpOworfQorCitzdGF0aWMgaW5saW5lIEdzdEJ1ZmZlciAqCitnc3RfZmx2X211eF9jb2RlY19kYXRhX2J1ZmZlcl90b190YWcgKEdzdEZsdk11eCAqIG11eCwgR3N0QnVmZmVyICogYnVmZmVyLAorICAgIEdzdEZsdk11eFBhZCAqIHBhZCkKK3sKKyAgcmV0dXJuIGdzdF9mbHZfbXV4X2J1ZmZlcl90b190YWdfaW50ZXJuYWwgKG11eCwgYnVmZmVyLCBwYWQsIFRSVUUpOworfQorCitzdGF0aWMgaW5saW5lIEdzdEJ1ZmZlciAqCitnc3RfZmx2X211eF9lb3NfdG9fdGFnIChHc3RGbHZNdXggKiBtdXgsIEdzdEZsdk11eFBhZCAqIHBhZCkKK3sKKyAgcmV0dXJuIGdzdF9mbHZfbXV4X2J1ZmZlcl90b190YWdfaW50ZXJuYWwgKG11eCwgTlVMTCwgcGFkLCBGQUxTRSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X211eF9wdXRfYnVmZmVyX2luX3N0cmVhbWhlYWRlciAoR1ZhbHVlICogc3RyZWFtaGVhZGVyLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR1ZhbHVlIHZhbHVlID0geyAwIH07CisgIEdzdEJ1ZmZlciAqYnVmOworCisgIGdfdmFsdWVfaW5pdCAoJnZhbHVlLCBHU1RfVFlQRV9CVUZGRVIpOworICBidWYgPSBnc3RfYnVmZmVyX2NvcHkgKGJ1ZmZlcik7CisgIGdzdF92YWx1ZV9zZXRfYnVmZmVyICgmdmFsdWUsIGJ1Zik7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfdmFsdWUgKHN0cmVhbWhlYWRlciwgJnZhbHVlKTsKKyAgZ192YWx1ZV91bnNldCAoJnZhbHVlKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbHZfbXV4X3dyaXRlX2hlYWRlciAoR3N0Rmx2TXV4ICogbXV4KQoreworICBHc3RCdWZmZXIgKmhlYWRlciwgKm1ldGFkYXRhOworICBHc3RCdWZmZXIgKnZpZGVvX2NvZGVjX2RhdGEsICphdWRpb19jb2RlY19kYXRhOworICBHc3RDYXBzICpjYXBzOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR1ZhbHVlIHN0cmVhbWhlYWRlciA9IHsgMCB9OworICBHTGlzdCAqbDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgLyogaWYgbm90IHN0cmVhbWluZywgY2hlY2sgaWYgZG93bnN0cmVhbSBpcyBzZWVrYWJsZSAqLworICBpZiAoIW11eC0+c3RyZWFtYWJsZSkgeworICAgIGdib29sZWFuIHNlZWthYmxlOworICAgIEdzdFF1ZXJ5ICpxdWVyeTsKKworICAgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19zZWVraW5nIChHU1RfRk9STUFUX0JZVEVTKTsKKyAgICBpZiAoZ3N0X3BhZF9wZWVyX3F1ZXJ5IChtdXgtPnNyY3BhZCwgcXVlcnkpKSB7CisgICAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksIE5VTEwsICZzZWVrYWJsZSwgTlVMTCwgTlVMTCk7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKG11eCwgImRvd25zdHJlYW0gaXMgJXNzZWVrYWJsZSIsIHNlZWthYmxlID8gIiIgOiAibm90ICIpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBoYXZlIHRvIGFzc3VtZSBzZWVraW5nIGlzIHN1cHBvcnRlZCBpZiBxdWVyeSBub3QgaGFuZGxlZCBkb3duc3RyZWFtICovCisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgImRvd25zdHJlYW0gZGlkIG5vdCBoYW5kbGUgc2Vla2luZyBxdWVyeSIpOworICAgICAgc2Vla2FibGUgPSBGQUxTRTsKKyAgICB9CisgICAgaWYgKCFzZWVrYWJsZSkgeworICAgICAgbXV4LT5zdHJlYW1hYmxlID0gVFJVRTsKKyAgICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKG11eCksICJzdHJlYW1hYmxlIik7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgImRvd25zdHJlYW0gaXMgbm90IHNlZWthYmxlLCBidXQgIgorICAgICAgICAgICJzdHJlYW1hYmxlPWZhbHNlLiBXaWxsIGlnbm9yZSB0aGF0IGFuZCBjcmVhdGUgc3RyZWFtYWJsZSBvdXRwdXQgIgorICAgICAgICAgICJpbnN0ZWFkIik7CisgICAgfQorICAgIGdzdF9xdWVyeV91bnJlZiAocXVlcnkpOworICB9CisKKyAgaGVhZGVyID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX2hlYWRlciAobXV4KTsKKyAgbWV0YWRhdGEgPSBnc3RfZmx2X211eF9jcmVhdGVfbWV0YWRhdGEgKG11eCwgVFJVRSk7CisgIHZpZGVvX2NvZGVjX2RhdGEgPSBOVUxMOworICBhdWRpb19jb2RlY19kYXRhID0gTlVMTDsKKworICBmb3IgKGwgPSBHU1RfRUxFTUVOVF9DQVNUIChtdXgpLT5zaW5rcGFkczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworICAgIEdzdEZsdk11eFBhZCAqcGFkID0gbC0+ZGF0YTsKKworICAgIC8qIEdldCBILjI2NCBhbmQgQUFDIGNvZGVjIGRhdGEsIGlmIHByZXNlbnQgKi8KKyAgICBpZiAocGFkICYmIG11eC0+dmlkZW9fcGFkID09IHBhZCAmJiBwYWQtPmNvZGVjID09IDcpIHsKKyAgICAgIGlmIChwYWQtPmNvZGVjX2RhdGEgPT0gTlVMTCkKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsICJDb2RlYyBkYXRhIGZvciB2aWRlbyBzdHJlYW0gbm90IGZvdW5kLCAiCisgICAgICAgICAgICAib3V0cHV0IG1pZ2h0IG5vdCBiZSBwbGF5YWJsZSIpOworICAgICAgZWxzZQorICAgICAgICB2aWRlb19jb2RlY19kYXRhID0KKyAgICAgICAgICAgIGdzdF9mbHZfbXV4X2NvZGVjX2RhdGFfYnVmZmVyX3RvX3RhZyAobXV4LCBwYWQtPmNvZGVjX2RhdGEsIHBhZCk7CisgICAgfSBlbHNlIGlmIChwYWQgJiYgbXV4LT5hdWRpb19wYWQgPT0gcGFkICYmIHBhZC0+Y29kZWMgPT0gMTApIHsKKyAgICAgIGlmIChwYWQtPmNvZGVjX2RhdGEgPT0gTlVMTCkKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsICJDb2RlYyBkYXRhIGZvciBhdWRpbyBzdHJlYW0gbm90IGZvdW5kLCAiCisgICAgICAgICAgICAib3V0cHV0IG1pZ2h0IG5vdCBiZSBwbGF5YWJsZSIpOworICAgICAgZWxzZQorICAgICAgICBhdWRpb19jb2RlY19kYXRhID0KKyAgICAgICAgICAgIGdzdF9mbHZfbXV4X2NvZGVjX2RhdGFfYnVmZmVyX3RvX3RhZyAobXV4LCBwYWQtPmNvZGVjX2RhdGEsIHBhZCk7CisgICAgfQorICB9CisKKyAgLyogbWFyayBidWZmZXJzIHRoYXQgd2lsbCBnbyBpbiB0aGUgc3RyZWFtaGVhZGVyICovCisgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGhlYWRlciwgR1NUX0JVRkZFUl9GTEFHX0hFQURFUik7CisgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG1ldGFkYXRhLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKyAgaWYgKHZpZGVvX2NvZGVjX2RhdGEgIT0gTlVMTCkgeworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKHZpZGVvX2NvZGVjX2RhdGEsIEdTVF9CVUZGRVJfRkxBR19IRUFERVIpOworICAgIC8qIG1hcmsgYXMgYSBkZWx0YSB1bml0LCBzbyBkb3duc3RyZWFtIHdpbGwgbm90IHRyeSB0byBzeW5jaHJvbml6ZSBvbiB0aGF0CisgICAgICogYnVmZmVyIC0gdG8gYWN0dWFsbHkgc3RhcnQgcGxheWJhY2sgeW91IG5lZWQgYSByZWFsIHZpZGVvIGtleWZyYW1lICovCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAodmlkZW9fY29kZWNfZGF0YSwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworICB9CisgIGlmIChhdWRpb19jb2RlY19kYXRhICE9IE5VTEwpIHsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChhdWRpb19jb2RlY19kYXRhLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKyAgfQorCisgIC8qIHB1dCBidWZmZXJzIGluIHN0cmVhbWhlYWRlciAqLworICBnX3ZhbHVlX2luaXQgKCZzdHJlYW1oZWFkZXIsIEdTVF9UWVBFX0FSUkFZKTsKKyAgZ3N0X2Zsdl9tdXhfcHV0X2J1ZmZlcl9pbl9zdHJlYW1oZWFkZXIgKCZzdHJlYW1oZWFkZXIsIGhlYWRlcik7CisgIGdzdF9mbHZfbXV4X3B1dF9idWZmZXJfaW5fc3RyZWFtaGVhZGVyICgmc3RyZWFtaGVhZGVyLCBtZXRhZGF0YSk7CisgIGlmICh2aWRlb19jb2RlY19kYXRhICE9IE5VTEwpCisgICAgZ3N0X2Zsdl9tdXhfcHV0X2J1ZmZlcl9pbl9zdHJlYW1oZWFkZXIgKCZzdHJlYW1oZWFkZXIsIHZpZGVvX2NvZGVjX2RhdGEpOworICBpZiAoYXVkaW9fY29kZWNfZGF0YSAhPSBOVUxMKQorICAgIGdzdF9mbHZfbXV4X3B1dF9idWZmZXJfaW5fc3RyZWFtaGVhZGVyICgmc3RyZWFtaGVhZGVyLCBhdWRpb19jb2RlY19kYXRhKTsKKworICAvKiBjcmVhdGUgdGhlIGNhcHMgYW5kIHB1dCB0aGUgc3RyZWFtaGVhZGVyIGluIHRoZW0gKi8KKyAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LWZsdiIpOworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKHN0cnVjdHVyZSwgInN0cmVhbWhlYWRlciIsICZzdHJlYW1oZWFkZXIpOworICBnX3ZhbHVlX3Vuc2V0ICgmc3RyZWFtaGVhZGVyKTsKKworICBnc3RfYWdncmVnYXRvcl9zZXRfc3JjX2NhcHMgKEdTVF9BR0dSRUdBVE9SX0NBU1QgKG11eCksIGNhcHMpOworCisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAvKiBwdXNoIHRoZSBoZWFkZXIgYnVmZmVyLCB0aGUgbWV0YWRhdGEgYW5kIHRoZSBjb2RlYyBpbmZvLCBpZiBhbnkgKi8KKyAgcmV0ID0gZ3N0X2Zsdl9tdXhfcHVzaCAobXV4LCBoZWFkZXIpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZmFpbHVyZV9oZWFkZXI7CisgIHJldCA9IGdzdF9mbHZfbXV4X3B1c2ggKG11eCwgbWV0YWRhdGEpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZmFpbHVyZV9tZXRhZGF0YTsKKyAgaWYgKHZpZGVvX2NvZGVjX2RhdGEgIT0gTlVMTCkgeworICAgIHJldCA9IGdzdF9mbHZfbXV4X3B1c2ggKG11eCwgdmlkZW9fY29kZWNfZGF0YSk7CisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgIGdvdG8gZmFpbHVyZV92aWRlb19jb2RlY19kYXRhOworICB9CisgIGlmIChhdWRpb19jb2RlY19kYXRhICE9IE5VTEwpIHsKKyAgICByZXQgPSBnc3RfZmx2X211eF9wdXNoIChtdXgsIGF1ZGlvX2NvZGVjX2RhdGEpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIGZhaWx1cmVfYXVkaW9fY29kZWNfZGF0YTsKKyAgfQorICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKK2ZhaWx1cmVfaGVhZGVyOgorICBnc3RfYnVmZmVyX3VucmVmIChtZXRhZGF0YSk7CisKK2ZhaWx1cmVfbWV0YWRhdGE6CisgIGlmICh2aWRlb19jb2RlY19kYXRhICE9IE5VTEwpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAodmlkZW9fY29kZWNfZGF0YSk7CisKK2ZhaWx1cmVfdmlkZW9fY29kZWNfZGF0YToKKyAgaWYgKGF1ZGlvX2NvZGVjX2RhdGEgIT0gTlVMTCkKKyAgICBnc3RfYnVmZmVyX3VucmVmIChhdWRpb19jb2RlY19kYXRhKTsKKworZmFpbHVyZV9hdWRpb19jb2RlY19kYXRhOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Q2xvY2tUaW1lCitnc3RfZmx2X211eF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoY29uc3QgR3N0U2VnbWVudCAqIHNlZ21lbnQsIEdzdENsb2NrVGltZSB0KQoreworICAvKiB3ZSBjYW4gZ2V0IGEgZHRzIGJlZm9yZSB0aGUgc2VnbWVudCwgaWYgZHRzIDwgcHRzIGFuZCBwdHMgaXMgaW5zaWRlCisgICAqIHRoZSBzZWdtZW50LCBzbyB3ZSBjb25zaWRlciBlYXJseSB0aW1lcyBhcyAwICovCisgIGlmICh0IDwgc2VnbWVudC0+c3RhcnQpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKHNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X211eF91cGRhdGVfaW5kZXggKEdzdEZsdk11eCAqIG11eCwgR3N0QnVmZmVyICogYnVmZmVyLAorICAgIEdzdEZsdk11eFBhZCAqIHBhZCkKK3sKKyAgLyoKKyAgICogQWRkIHRoZSB0YWcgYnl0ZSBvZmZzZXQgYW5kIHRvIHRoZSBpbmRleCBpZiBpdCdzIGEgdmFsaWQgc2VlayBwb2ludCwgd2hpY2gKKyAgICogbWVhbnMgaXQncyBlaXRoZXIgYSB2aWRlbyBrZXlmcmFtZSBvciBpZiB0aGVyZSBpcyBubyB2aWRlbyBwYWQgKGluIHRoYXQKKyAgICogY2FzZSBldmVyeSBGTFYgdGFnIGlzIGEgdmFsaWQgc2VlayBwb2ludCkKKyAgICovCisgIGlmIChtdXgtPnZpZGVvX3BhZCA9PSBwYWQgJiYKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpKQorICAgIHJldHVybjsKKworICBpZiAoR1NUX0JVRkZFUl9QVFNfSVNfVkFMSUQgKGJ1ZmZlcikpIHsKKyAgICBHc3RGbHZNdXhJbmRleEVudHJ5ICplbnRyeSA9IGdfc2xpY2VfbmV3IChHc3RGbHZNdXhJbmRleEVudHJ5KTsKKyAgICBHc3RDbG9ja1RpbWUgcHRzID0KKyAgICAgICAgZ3N0X2Zsdl9tdXhfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZHU1RfQUdHUkVHQVRPUl9QQUQKKyAgICAgICAgKHBhZCktPnNlZ21lbnQsIEdTVF9CVUZGRVJfUFRTIChidWZmZXIpKTsKKyAgICBlbnRyeS0+cG9zaXRpb24gPSBtdXgtPmJ5dGVfY291bnQ7CisgICAgZW50cnktPnRpbWUgPSBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChwdHMpIC8gR1NUX1NFQ09ORDsKKyAgICBtdXgtPmluZGV4ID0gZ19saXN0X3ByZXBlbmQgKG11eC0+aW5kZXgsIGVudHJ5KTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2Zsdl9tdXhfd3JpdGVfYnVmZmVyIChHc3RGbHZNdXggKiBtdXgsIEdzdEZsdk11eFBhZCAqIHBhZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEJ1ZmZlciAqdGFnOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0Q2xvY2tUaW1lIGR0cyA9CisgICAgICBnc3RfZmx2X211eF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJkdTVF9BR0dSRUdBVE9SX1BBRCAocGFkKS0+c2VnbWVudCwKKyAgICAgIEdTVF9CVUZGRVJfRFRTIChidWZmZXIpKTsKKworICAvKiBjbGlwcGluZyBmdW5jdGlvbiBhcnJhbmdlZCBmb3IgcnVubmluZ190aW1lICovCisKKyAgaWYgKCFtdXgtPnN0cmVhbWFibGUpCisgICAgZ3N0X2Zsdl9tdXhfdXBkYXRlX2luZGV4IChtdXgsIGJ1ZmZlciwgcGFkKTsKKworICB0YWcgPSBnc3RfZmx2X211eF9idWZmZXJfdG9fdGFnIChtdXgsIGJ1ZmZlciwgcGFkKTsKKworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIHJldCA9IGdzdF9mbHZfbXV4X3B1c2ggKG11eCwgdGFnKTsKKworICBpZiAocmV0ID09IEdTVF9GTE9XX09LICYmIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkdHMpKQorICAgIHBhZC0+bGFzdF90aW1lc3RhbXAgPSBkdHM7CisKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorZ3N0X2Zsdl9tdXhfZGV0ZXJtaW5lX2R1cmF0aW9uIChHc3RGbHZNdXggKiBtdXgpCit7CisgIEdMaXN0ICpsOworICBHc3RDbG9ja1RpbWUgZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgInRyeWluZyB0byBkZXRlcm1pbmUgdGhlIGR1cmF0aW9uICIKKyAgICAgICJmcm9tIHBhZCB0aW1lc3RhbXBzIik7CisKKyAgZm9yIChsID0gR1NUX0VMRU1FTlRfQ0FTVCAobXV4KS0+c2lua3BhZHM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKKyAgICBHc3RGbHZNdXhQYWQgKnBhZCA9IEdTVF9GTFZfTVVYX1BBRCAobC0+ZGF0YSk7CisKKyAgICBpZiAocGFkICYmIChwYWQtPmxhc3RfdGltZXN0YW1wICE9IEdTVF9DTE9DS19USU1FX05PTkUpKSB7CisgICAgICBpZiAoZHVyYXRpb24gPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICAgICAgZHVyYXRpb24gPSBwYWQtPmxhc3RfdGltZXN0YW1wOworICAgICAgZWxzZQorICAgICAgICBkdXJhdGlvbiA9IE1BWCAoZHVyYXRpb24sIHBhZC0+bGFzdF90aW1lc3RhbXApOworICAgIH0KKyAgfQorCisgIHJldHVybiBkdXJhdGlvbjsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmx2X211eF9hcmVfYWxsX3BhZHNfZW9zIChHc3RGbHZNdXggKiBtdXgpCit7CisgIEdMaXN0ICpsOworCisgIGZvciAobCA9IEdTVF9FTEVNRU5UX0NBU1QgKG11eCktPnNpbmtwYWRzOyBsOyBsID0gbC0+bmV4dCkgeworICAgIEdzdEZsdk11eFBhZCAqcGFkID0gR1NUX0ZMVl9NVVhfUEFEIChsLT5kYXRhKTsKKworICAgIGlmICghZ3N0X2FnZ3JlZ2F0b3JfcGFkX2lzX2VvcyAoR1NUX0FHR1JFR0FUT1JfUEFEIChwYWQpKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbHZfbXV4X3dyaXRlX2VvcyAoR3N0Rmx2TXV4ICogbXV4KQoreworICBHc3RCdWZmZXIgKnRhZzsKKworICBpZiAobXV4LT52aWRlb19wYWQgPT0gTlVMTCkKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgdGFnID0gZ3N0X2Zsdl9tdXhfZW9zX3RvX3RhZyAobXV4LCBtdXgtPnZpZGVvX3BhZCk7CisKKyAgcmV0dXJuIGdzdF9mbHZfbXV4X3B1c2ggKG11eCwgdGFnKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbHZfbXV4X3Jld3JpdGVfaGVhZGVyIChHc3RGbHZNdXggKiBtdXgpCit7CisgIEdzdEJ1ZmZlciAqcmV3cml0ZSwgKmluZGV4LCAqdG1wOworICBHc3RFdmVudCAqZXZlbnQ7CisgIGd1aW50OCAqZGF0YTsKKyAgZ2RvdWJsZSBkOworICBHTGlzdCAqbDsKKyAgZ3VpbnQzMiBpbmRleF9sZW4sIGFsbG9jYXRlX3NpemU7CisgIGd1aW50MzIgaSwgaW5kZXhfc2tpcDsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworICBHc3RDbG9ja1RpbWUgZHVyOworCisgIGlmIChtdXgtPnN0cmVhbWFibGUpCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIC8qIHNlZWsgYmFjayB0byB0aGUgcHJlYWxsb2NhdGVkIGluZGV4IHNwYWNlICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX0JZVEVTKTsKKyAgc2VnbWVudC5zdGFydCA9IHNlZ21lbnQudGltZSA9IDEzICsgMjk7CisgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCk7CisgIGlmICghZ3N0X3BhZF9wdXNoX2V2ZW50IChtdXgtPnNyY3BhZCwgZXZlbnQpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsICJTZWVrIHRvIHJld3JpdGUgaGVhZGVyIGZhaWxlZCIpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorCisgIC8qIGRldGVybWluZSBkdXJhdGlvbiBub3cgYmFzZWQgb24gb3VyIG93biB0aW1lc3RhbXBpbmcsCisgICAqIHNvIHRoYXQgaXQgaXMgbGlrZWx5IG1hbnkgdGltZXMgYmV0dGVyIGFuZCBjb25zaXN0ZW50CisgICAqIHRoYW4gd2hhdGV2ZXIgb2J0YWluZWQgYnkgc29tZSBxdWVyeSAqLworICBkdXIgPSBnc3RfZmx2X211eF9kZXRlcm1pbmVfZHVyYXRpb24gKG11eCk7CisgIGlmIChkdXIgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICBtdXgtPmR1cmF0aW9uID0gZHVyOworCisgIC8qIHJld3JpdGUgdGhlIGR1cmF0aW9uIHRhZyAqLworICBkID0gZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAobXV4LT5kdXJhdGlvbik7CisgIGQgLz0gKGdkb3VibGUpIEdTVF9TRUNPTkQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAiZGV0ZXJtaW5lZCB0aGUgZmluYWwgZHVyYXRpb24gdG8gYmUgJWYiLCBkKTsKKworICByZXdyaXRlID0gZ3N0X2Zsdl9tdXhfY3JlYXRlX251bWJlcl9zY3JpcHRfdmFsdWUgKCJkdXJhdGlvbiIsIGQpOworCisgIC8qIHJld3JpdGUgdGhlIGZpbGVzaXplIHRhZyAqLworICBkID0gZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAobXV4LT5ieXRlX2NvdW50KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJwdXR0aW5nIHRvdGFsIGZpbGVzaXplICVmIGluIHRoZSBtZXRhZGF0YSIsIGQpOworCisgIHRtcCA9IGdzdF9mbHZfbXV4X2NyZWF0ZV9udW1iZXJfc2NyaXB0X3ZhbHVlICgiZmlsZXNpemUiLCBkKTsKKyAgcmV3cml0ZSA9IGdzdF9idWZmZXJfYXBwZW5kIChyZXdyaXRlLCB0bXApOworCisgIGlmICghbXV4LT5pbmRleCkgeworICAgIC8qIG5vIGluZGV4LCBzbyBwdXNoIGJ1ZmZlciBhbmQgcmV0dXJuICovCisgICAgcmV0dXJuIGdzdF9mbHZfbXV4X3B1c2ggKG11eCwgcmV3cml0ZSk7CisgIH0KKworICAvKiByZXdyaXRlIHRoZSBpbmRleCAqLworICBtdXgtPmluZGV4ID0gZ19saXN0X3JldmVyc2UgKG11eC0+aW5kZXgpOworICBpbmRleF9sZW4gPSBnX2xpc3RfbGVuZ3RoIChtdXgtPmluZGV4KTsKKworICAvKiBXZSB3cml0ZSBhdCBtb3N0IE1BWF9JTkRFWF9FTlRSSUVTIGVsZW1lbnRzICovCisgIGlmIChpbmRleF9sZW4gPiBNQVhfSU5ERVhfRU5UUklFUykgeworICAgIGluZGV4X3NraXAgPSAxICsgaW5kZXhfbGVuIC8gTUFYX0lOREVYX0VOVFJJRVM7CisgICAgaW5kZXhfbGVuID0gKGluZGV4X2xlbiArIGluZGV4X3NraXAgLSAxKSAvIGluZGV4X3NraXA7CisgIH0gZWxzZSB7CisgICAgaW5kZXhfc2tpcCA9IDE7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJJbmRleCBsZW5ndGggaXMgJWQiLCBpbmRleF9sZW4pOworICAvKiBzZWUgc2l6ZSBjYWxjdWxhdGlvbiBpbiBnc3RfZmx2X211eF9wcmVhbGxvY2F0ZV9pbmRleCAqLworICBhbGxvY2F0ZV9zaXplID0gMTEgKyA4ICsgMjIgKyAxMCArIGluZGV4X2xlbiAqIDE4OworICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJBbGxvY2F0aW5nICVkIGJ5dGVzIGZvciBpbmRleCIsIGFsbG9jYXRlX3NpemUpOworICBfZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChhbGxvY2F0ZV9zaXplLCAmaW5kZXgsICZkYXRhKTsKKworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhLCA5KTsgICAgICAgIC8qIHRoZSAna2V5ZnJhbWVzJyBrZXkgKi8KKyAgbWVtY3B5IChkYXRhICsgMiwgImtleWZyYW1lcyIsIDkpOworICBHU1RfV1JJVEVfVUlOVDggKGRhdGEgKyAxMSwgOCk7ICAgICAgIC8qIG5lc3RlZCBFQ01BIGFycmF5ICovCisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyAxMiwgMik7ICAgLyogdHdvIGVsZW1lbnRzICovCisgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEgKyAxNiwgNSk7ICAgLyogZmlyc3Qgc3RyaW5nIGtleTogJ3RpbWVzJyAqLworICBtZW1jcHkgKGRhdGEgKyAxOCwgInRpbWVzIiwgNSk7CisgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDIzLCAxMCk7ICAgICAgLyogc3RyaWN0IGFycmF5ICovCisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyAyNCwgaW5kZXhfbGVuKTsKKyAgZGF0YSArPSAyODsKKworICAvKiB0aGUga2V5ZnJhbWVzJyB0aW1lcyAqLworICBmb3IgKGkgPSAwLCBsID0gbXV4LT5pbmRleDsgbDsgbCA9IGwtPm5leHQsIGkrKykgeworICAgIEdzdEZsdk11eEluZGV4RW50cnkgKmVudHJ5ID0gbC0+ZGF0YTsKKworICAgIGlmIChpICUgaW5kZXhfc2tpcCAhPSAwKQorICAgICAgY29udGludWU7CisgICAgR1NUX1dSSVRFX1VJTlQ4IChkYXRhLCAwKTsgIC8qIG51bWVyaWMgKGFrYSBkb3VibGUpICovCisgICAgR1NUX1dSSVRFX0RPVUJMRV9CRSAoZGF0YSArIDEsIGVudHJ5LT50aW1lKTsKKyAgICBkYXRhICs9IDk7CisgIH0KKworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhLCAxMyk7ICAgICAgIC8qIHNlY29uZCBzdHJpbmcga2V5OiAnZmlsZXBvc2l0aW9ucycgKi8KKyAgbWVtY3B5IChkYXRhICsgMiwgImZpbGVwb3NpdGlvbnMiLCAxMyk7CisgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDE1LCAxMCk7ICAgICAgLyogc3RyaWN0IGFycmF5ICovCisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyAxNiwgaW5kZXhfbGVuKTsKKyAgZGF0YSArPSAyMDsKKworICAvKiB0aGUga2V5ZnJhbWVzJyBmaWxlIHBvc2l0aW9ucyAqLworICBmb3IgKGkgPSAwLCBsID0gbXV4LT5pbmRleDsgbDsgbCA9IGwtPm5leHQsIGkrKykgeworICAgIEdzdEZsdk11eEluZGV4RW50cnkgKmVudHJ5ID0gbC0+ZGF0YTsKKworICAgIGlmIChpICUgaW5kZXhfc2tpcCAhPSAwKQorICAgICAgY29udGludWU7CisgICAgR1NUX1dSSVRFX1VJTlQ4IChkYXRhLCAwKTsKKyAgICBHU1RfV1JJVEVfRE9VQkxFX0JFIChkYXRhICsgMSwgZW50cnktPnBvc2l0aW9uKTsKKyAgICBkYXRhICs9IDk7CisgIH0KKworICBHU1RfV1JJVEVfVUlOVDI0X0JFIChkYXRhLCA5KTsgICAgICAgIC8qIGZpbmlzaCB0aGUgRUNNQSBhcnJheSAqLworCisgIC8qIElmIHRoZXJlIGlzIHNwYWNlIGxlZnQgaW4gdGhlIHByZWZpbGxlZCBhcmVhLCByZWluc2VydCB0aGUgZmlsbGVyLgorICAgICBUaGVyZSBpcyBhdCBsZWFzdCAxOCAgYnl0ZXMgZnJlZSwgc28gaXQgd2lsbCBhbHdheXMgZml0LiAqLworICBpZiAoaW5kZXhfbGVuIDwgTUFYX0lOREVYX0VOVFJJRVMpIHsKKyAgICBHc3RCdWZmZXIgKnRtcDsKKyAgICBndWludDggKmRhdGE7CisgICAgZ3VpbnQzMiByZW1haW5pbmdfZmlsbGVyX3NpemU7CisKKyAgICBfZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxNCwgJnRtcCwgJmRhdGEpOworICAgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEsIDkpOworICAgIG1lbWNweSAoZGF0YSArIDIsICJnc3RmaWxsZXIiLCA5KTsKKyAgICBHU1RfV1JJVEVfVUlOVDggKGRhdGEgKyAxMSwgMik7ICAgICAvKiBzdHJpbmcgKi8KKworICAgIC8qIFRoZXJlIGlzIDE4IGJ5dGVzIHBlciByZW1haW5pbmcgaW5kZXggZW50cnkgbWludXMgd2hhdCBpcyB1c2VkIGZvcgorICAgICAqIHRoZSdnc3RmaWxsZXInIGtleS4gVGhlIHJlc3QgaXMgYWxyZWFkeSBmaWxsZWQgd2l0aCBzcGFjZXMsIHNvIGp1c3QgbmVlZAorICAgICAqIHRvIHVwZGF0ZSBsZW5ndGguICovCisgICAgcmVtYWluaW5nX2ZpbGxlcl9zaXplID0gKE1BWF9JTkRFWF9FTlRSSUVTIC0gaW5kZXhfbGVuKSAqIDE4IC0gMTQ7CisgICAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAiUmVtYWluaW5nIGZpbGxlciBzaXplIGlzICVkIGJ5dGVzIiwKKyAgICAgICAgcmVtYWluaW5nX2ZpbGxlcl9zaXplKTsKKyAgICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhICsgMTIsIHJlbWFpbmluZ19maWxsZXJfc2l6ZSk7CisgICAgaW5kZXggPSBnc3RfYnVmZmVyX2FwcGVuZCAoaW5kZXgsIHRtcCk7CisgIH0KKworICByZXdyaXRlID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHJld3JpdGUsIGluZGV4KTsKKworICByZXR1cm4gZ3N0X2Zsdl9tdXhfcHVzaCAobXV4LCByZXdyaXRlKTsKK30KKworc3RhdGljIEdzdEZsdk11eFBhZCAqCitnc3RfZmx2X211eF9maW5kX2Jlc3RfcGFkIChHc3RBZ2dyZWdhdG9yICogYWdncmVnYXRvciwgR3N0Q2xvY2tUaW1lICogdHMpCit7CisgIEdzdEFnZ3JlZ2F0b3JQYWQgKmFwYWQ7CisgIEdzdEZsdk11eFBhZCAqcGFkLCAqYmVzdCA9IE5VTEw7CisgIEdMaXN0ICpsOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0Q2xvY2tUaW1lIGJlc3RfdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIGZvciAobCA9IEdTVF9FTEVNRU5UX0NBU1QgKGFnZ3JlZ2F0b3IpLT5zaW5rcGFkczsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICBhcGFkID0gR1NUX0FHR1JFR0FUT1JfUEFEIChsLT5kYXRhKTsKKyAgICBwYWQgPSBHU1RfRkxWX01VWF9QQUQgKGwtPmRhdGEpOworICAgIGJ1ZmZlciA9IGdzdF9hZ2dyZWdhdG9yX3BhZF9wZWVrX2J1ZmZlciAoR1NUX0FHR1JFR0FUT1JfUEFEIChwYWQpKTsKKyAgICBpZiAoIWJ1ZmZlcikKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChiZXN0X3RzID09IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICAgIGJlc3QgPSBwYWQ7CisgICAgICBiZXN0X3RzID0gZ3N0X2Zsdl9tdXhfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZhcGFkLT5zZWdtZW50LAorICAgICAgICAgIEdTVF9CVUZGRVJfRFRTX09SX1BUUyAoYnVmZmVyKSk7CisgICAgfSBlbHNlIGlmIChHU1RfQlVGRkVSX0RUU19PUl9QVFMgKGJ1ZmZlcikgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgICAgZ2ludDY0IHQgPSBnc3RfZmx2X211eF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJmFwYWQtPnNlZ21lbnQsCisgICAgICAgICAgR1NUX0JVRkZFUl9EVFNfT1JfUFRTIChidWZmZXIpKTsKKyAgICAgIGlmICh0IDwgYmVzdF90cykgeworICAgICAgICBiZXN0ID0gcGFkOworICAgICAgICBiZXN0X3RzID0gdDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgR1NUX0RFQlVHX09CSkVDVCAoYWdncmVnYXRvciwKKyAgICAgICJCZXN0IHBhZCBmb3VuZCB3aXRoICUiIEdTVF9USU1FX0ZPUk1BVCAiOiAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKGJlc3RfdHMpLCBiZXN0KTsKKyAgaWYgKHRzKQorICAgICp0cyA9IGJlc3RfdHM7CisgIHJldHVybiBiZXN0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2Zsdl9tdXhfYWdncmVnYXRlIChHc3RBZ2dyZWdhdG9yICogYWdncmVnYXRvciwgZ2Jvb2xlYW4gdGltZW91dCkKK3sKKyAgR3N0Rmx2TXV4ICptdXggPSBHU1RfRkxWX01VWCAoYWdncmVnYXRvcik7CisgIEdzdEZsdk11eFBhZCAqYmVzdDsKKyAgZ2ludDY0IGJlc3RfdGltZSA9IEdTVF9DTE9DS19TVElNRV9OT05FOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0Q2xvY2tUaW1lIHRzOworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IE5VTEw7CisKKyAgaWYgKG11eC0+c3RhdGUgPT0gR1NUX0ZMVl9NVVhfU1RBVEVfSEVBREVSKSB7CisgICAgaWYgKEdTVF9FTEVNRU5UX0NBU1QgKG11eCktPnNpbmtwYWRzID09IE5VTEwpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksCisgICAgICAgICAgKCJObyBpbnB1dCBzdHJlYW1zIGNvbmZpZ3VyZWQiKSk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorCisgICAgcmV0ID0gZ3N0X2Zsdl9tdXhfd3JpdGVfaGVhZGVyIChtdXgpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICByZXR1cm4gcmV0OworICAgIG11eC0+c3RhdGUgPSBHU1RfRkxWX01VWF9TVEFURV9EQVRBOworCisgICAgYmVzdCA9IGdzdF9mbHZfbXV4X2ZpbmRfYmVzdF9wYWQgKGFnZ3JlZ2F0b3IsICZ0cyk7CisgICAgaWYgKGJlc3QgJiYgR1NUX0NMT0NLX1NUSU1FX0lTX1ZBTElEICh0cykpCisgICAgICBtdXgtPmZpcnN0X3RpbWVzdGFtcCA9IHRzOworICAgIGVsc2UKKyAgICAgIG11eC0+Zmlyc3RfdGltZXN0YW1wID0gMDsKKyAgfSBlbHNlIHsKKyAgICBiZXN0ID0gZ3N0X2Zsdl9tdXhfZmluZF9iZXN0X3BhZCAoYWdncmVnYXRvciwgJnRzKTsKKyAgfQorCisgIGlmIChtdXgtPm5ld190YWdzKSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBnc3RfZmx2X211eF9jcmVhdGVfbWV0YWRhdGEgKG11eCwgRkFMU0UpOworICAgIGlmIChidWYpCisgICAgICBnc3RfZmx2X211eF9wdXNoIChtdXgsIGJ1Zik7CisgICAgbXV4LT5uZXdfdGFncyA9IEZBTFNFOworICB9CisKKyAgaWYgKGJlc3QpIHsKKyAgICBidWZmZXIgPSBnc3RfYWdncmVnYXRvcl9wYWRfcG9wX2J1ZmZlciAoR1NUX0FHR1JFR0FUT1JfUEFEIChiZXN0KSk7CisgICAgZ19hc3NlcnQgKGJ1ZmZlcik7CisgICAgYmVzdC0+ZHRzID0KKyAgICAgICAgZ3N0X2Zsdl9tdXhfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZHU1RfQUdHUkVHQVRPUl9QQUQKKyAgICAgICAgKGJlc3QpLT5zZWdtZW50LCBHU1RfQlVGRkVSX0RUU19PUl9QVFMgKGJ1ZmZlcikpOworCisgICAgaWYgKEdTVF9DTE9DS19TVElNRV9JU19WQUxJRCAoYmVzdC0+ZHRzKSkKKyAgICAgIGJlc3RfdGltZSA9IGJlc3QtPmR0cyAtIG11eC0+Zmlyc3RfdGltZXN0YW1wOworCisgICAgaWYgKEdTVF9CVUZGRVJfUFRTX0lTX1ZBTElEIChidWZmZXIpKQorICAgICAgYmVzdC0+cHRzID0KKyAgICAgICAgICBnc3RfZmx2X211eF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJkdTVF9BR0dSRUdBVE9SX1BBRAorICAgICAgICAgIChiZXN0KS0+c2VnbWVudCwgR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcikpOworICAgIGVsc2UKKyAgICAgIGJlc3QtPnB0cyA9IGJlc3QtPmR0czsKKworICAgIEdTVF9MT0dfT0JKRUNUIChiZXN0LCAiZ290IGJ1ZmZlciBQVFMgJSIgR1NUX1RJTUVfRk9STUFUICIgRFRTICUiCisgICAgICAgIEdTVF9TVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGJlc3QtPnB0cyksCisgICAgICAgIEdTVF9TVElNRV9BUkdTIChiZXN0LT5kdHMpKTsKKyAgfSBlbHNlIHsKKyAgICBiZXN0X3RpbWUgPSBHU1RfQ0xPQ0tfU1RJTUVfTk9ORTsKKyAgfQorCisgIC8qIFRoZSBGTFYgdGltZXN0YW1wIGlzIGFuIGludDMyIGZpZWxkLiBGb3Igbm9uLWxpdmUgc3RyZWFtcyBlcnJvciBvdXQgaWYgYQorICAgICBiaWdnZXIgdGltZXN0YW1wIGlzIHNlZW4sIGZvciBsaXZlIHRoZSB0aW1lc3RhbXAgd2lsbCBnZXQgd3JhcHBlZCBpbgorICAgICBnc3RfZmx2X211eF9idWZmZXJfdG9fdGFnICovCisgIGlmICghbXV4LT5zdHJlYW1hYmxlICYmIChHU1RfQ0xPQ0tfU1RJTUVfSVNfVkFMSUQgKGJlc3RfdGltZSkpCisgICAgICAmJiBiZXN0X3RpbWUgLyBHU1RfTVNFQ09ORCA+IEdfTUFYSU5UMzIpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgIlRpbWVzdGFtcCBsYXJnZXIgdGhhbiBGTFYgc3VwcG9ydHMgLSBFT1MiKTsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICB9CisgICAgYmVzdCA9IE5VTEw7CisgIH0KKworICBpZiAoYmVzdCkgeworICAgIHJldHVybiBnc3RfZmx2X211eF93cml0ZV9idWZmZXIgKG11eCwgYmVzdCwgYnVmZmVyKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZ3N0X2Zsdl9tdXhfYXJlX2FsbF9wYWRzX2VvcyAobXV4KSkgeworICAgICAgZ3N0X2Zsdl9tdXhfd3JpdGVfZW9zIChtdXgpOworICAgICAgZ3N0X2Zsdl9tdXhfcmV3cml0ZV9oZWFkZXIgKG11eCk7CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKG11eC0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgICAgfQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2Zsdl9tdXhfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEZsdk11eCAqbXV4ID0gR1NUX0ZMVl9NVVggKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1NUUkVBTUFCTEU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgbXV4LT5zdHJlYW1hYmxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NRVRBREFUQUNSRUFUT1I6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBtdXgtPm1ldGFkYXRhY3JlYXRvcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx2X211eF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0Rmx2TXV4ICptdXggPSBHU1RfRkxWX01VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU1RSRUFNQUJMRToKKyAgICAgIG11eC0+c3RyZWFtYWJsZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGlmIChtdXgtPnN0cmVhbWFibGUpCisgICAgICAgIGdzdF90YWdfc2V0dGVyX3NldF90YWdfbWVyZ2VfbW9kZSAoR1NUX1RBR19TRVRURVIgKG11eCksCisgICAgICAgICAgICBHU1RfVEFHX01FUkdFX1JFUExBQ0UpOworICAgICAgZWxzZQorICAgICAgICBnc3RfdGFnX3NldHRlcl9zZXRfdGFnX21lcmdlX21vZGUgKEdTVF9UQUdfU0VUVEVSIChtdXgpLAorICAgICAgICAgICAgR1NUX1RBR19NRVJHRV9LRUVQKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NRVRBREFUQUNSRUFUT1I6CisgICAgICBnX2ZyZWUgKG11eC0+bWV0YWRhdGFjcmVhdG9yKTsKKyAgICAgIGlmICghZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsICJtZXRhZGF0YWNyZWF0b3IgcHJvcGVydHkgY2FuIG5vdCBiZSBOVUxMIik7CisgICAgICAgIG11eC0+bWV0YWRhdGFjcmVhdG9yID0gZ19zdHJkdXAgKERFRkFVTFRfTUVUQURBVEFDUkVBVE9SKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG11eC0+bWV0YWRhdGFjcmVhdG9yID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2dzdF9mbHZfbXV4X2dldF9uZXh0X3RpbWVfZm9yX3NlZ21lbnQgKEdzdEFnZ3JlZ2F0b3IgKiBhZ2dyZWdhdG9yLAorICAgIGNvbnN0IEdzdFNlZ21lbnQgKiBzZWdtZW50KQoreworICBHc3RDbG9ja1RpbWUgbmV4dF90aW1lOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoYWdncmVnYXRvcik7CisgIGlmIChzZWdtZW50LT5wb3NpdGlvbiA9PSAtMSB8fCBzZWdtZW50LT5wb3NpdGlvbiA8IHNlZ21lbnQtPnN0YXJ0KQorICAgIG5leHRfdGltZSA9IHNlZ21lbnQtPnN0YXJ0OworICBlbHNlCisgICAgbmV4dF90aW1lID0gc2VnbWVudC0+cG9zaXRpb247CisKKyAgaWYgKHNlZ21lbnQtPnN0b3AgIT0gLTEgJiYgbmV4dF90aW1lID4gc2VnbWVudC0+c3RvcCkKKyAgICBuZXh0X3RpbWUgPSBzZWdtZW50LT5zdG9wOworCisgIG5leHRfdGltZSA9IGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLCBuZXh0X3RpbWUpOworICBHU1RfT0JKRUNUX1VOTE9DSyAoYWdncmVnYXRvcik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYWdncmVnYXRvciwgIm5leHRfdGltZTogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAobmV4dF90aW1lKSk7CisgIHJldHVybiBuZXh0X3RpbWU7Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2dzdF9mbHZfbXV4X2dldF9uZXh0X3RpbWUgKEdzdEFnZ3JlZ2F0b3IgKiBhZ2dyZWdhdG9yKQoreworICByZXR1cm4gZ3N0X2Zsdl9tdXhfZ2V0X25leHRfdGltZV9mb3Jfc2VnbWVudCAoYWdncmVnYXRvciwKKyAgICAgICZhZ2dyZWdhdG9yLT5zZWdtZW50KTsKK30KZGlmZiAtLWdpdCBhL2dzdC9mbHYvZ3N0Zmx2bXV4LmggYi9nc3QvZmx2L2dzdGZsdm11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYjUwOTMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZmx2L2dzdGZsdm11eC5oCkBAIC0wLDAgKzEsMTEwIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsMjAwOSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDE3IENvbGxhYm9yYSBMdGQKKyAqICBAYXV0aG9yOiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqICBAYXV0aG9yOiBWaW5jZW50IFBlbnF1ZXJjJ2ggPHZpbmNlbnQucGVucXVlcmNoQGNvbGxhYm9yYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9GTFZfTVVYX0hfXworI2RlZmluZSBfX0dTVF9GTFZfTVVYX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFnZ3JlZ2F0b3IuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0ZMVl9NVVhfUEFEIChnc3RfZmx2X211eF9wYWRfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0ZMVl9NVVhfUEFEKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0ZMVl9NVVhfUEFELCBHc3RGbHZNdXhQYWQpKQorI2RlZmluZSBHU1RfRkxWX01VWF9QQURfQ0FTVChvYmopICgoR3N0Rmx2TXV4UGFkICopKG9iaikpCisjZGVmaW5lIEdTVF9GTFZfTVVYX1BBRF9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfRkxWX01VWF9QQUQsIEdzdEZsdk11eFBhZCkpCisjZGVmaW5lIEdTVF9JU19GTFZfTVVYX1BBRChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9GTFZfTVVYX1BBRCkpCisjZGVmaW5lIEdTVF9JU19GTFZfTVVYX1BBRF9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfRkxWX01VWF9QQUQpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0Rmx2TXV4UGFkIEdzdEZsdk11eFBhZDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RGbHZNdXhQYWRDbGFzcyBHc3RGbHZNdXhQYWRDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9GTFZfTVVYIFwKKyAgKGdzdF9mbHZfbXV4X2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfRkxWX01VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfRkxWX01VWCwgR3N0Rmx2TXV4KSkKKyNkZWZpbmUgR1NUX0ZMVl9NVVhfQ0FTVChvYmopICgoR3N0Rmx2TXV4ICopb2JqKQorI2RlZmluZSBHU1RfRkxWX01VWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX0ZMVl9NVVgsIEdzdEZsdk11eENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0ZMVl9NVVgob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX0ZMVl9NVVgpKQorI2RlZmluZSBHU1RfSVNfRkxWX01VWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0ZMVl9NVVgpKQorCitzdHJ1Y3QgX0dzdEZsdk11eFBhZAoreworICBHc3RBZ2dyZWdhdG9yUGFkIGFnZ3JlZ2F0b3JfcGFkOworCisgIGd1aW50IGNvZGVjOworICBndWludCByYXRlOworICBndWludCB3aWR0aDsKKyAgZ3VpbnQgY2hhbm5lbHM7CisgIEdzdEJ1ZmZlciAqY29kZWNfZGF0YTsKKworICBndWludCBiaXRyYXRlOworCisgIEdzdENsb2NrVGltZSBsYXN0X3RpbWVzdGFtcDsKKyAgZ2ludDY0IHB0czsKKyAgZ2ludDY0IGR0czsKK307CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RGbHZNdXhQYWRDbGFzcyB7CisgIEdzdEFnZ3JlZ2F0b3JQYWRDbGFzcyBwYXJlbnQ7Cit9IEdzdEZsdk11eFBhZENsYXNzOworCit0eXBlZGVmIGVudW0KK3sKKyAgR1NUX0ZMVl9NVVhfU1RBVEVfSEVBREVSLAorICBHU1RfRkxWX01VWF9TVEFURV9EQVRBCit9IEdzdEZsdk11eFN0YXRlOworCit0eXBlZGVmIHN0cnVjdCBfR3N0Rmx2TXV4IHsKKyAgR3N0QWdncmVnYXRvciAgIGFnZ3JlZ2F0b3I7CisKKyAgR3N0UGFkICAgICAgICAgKnNyY3BhZDsKKworICAvKiA8cHJpdmF0ZT4gKi8KKyAgR3N0Rmx2TXV4U3RhdGUgc3RhdGU7CisgIEdzdEZsdk11eFBhZCAqYXVkaW9fcGFkOworICBHc3RGbHZNdXhQYWQgKnZpZGVvX3BhZDsKKyAgZ2Jvb2xlYW4gc3RyZWFtYWJsZTsKKyAgZ2NoYXIgKm1ldGFkYXRhY3JlYXRvcjsKKworICBHc3RUYWdMaXN0ICp0YWdzOworICBnYm9vbGVhbiBuZXdfdGFnczsKKyAgR0xpc3QgKmluZGV4OworICBndWludDY0IGJ5dGVfY291bnQ7CisgIGd1aW50NjQgZHVyYXRpb247CisgIGdpbnQ2NCBmaXJzdF90aW1lc3RhbXA7Cit9IEdzdEZsdk11eDsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEZsdk11eENsYXNzIHsKKyAgR3N0QWdncmVnYXRvckNsYXNzIHBhcmVudDsKK30gR3N0Rmx2TXV4Q2xhc3M7CisKK0dUeXBlICAgIGdzdF9mbHZfbXV4X3BhZF9nZXRfdHlwZSh2b2lkKTsKK0dUeXBlICAgIGdzdF9mbHZfbXV4X2dldF90eXBlICAgICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0ZMVl9NVVhfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZmx2L2dzdGluZGV4LmMgYi9nc3QvZmx2L2dzdGluZGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkN2ZhMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9mbHYvZ3N0aW5kZXguYwpAQCAtMCwwICsxLDEwMTkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDAxIFJpZGdlUnVuIChodHRwOi8vd3d3LnJpZGdlcnVuLmNvbS8pCisgKiBXcml0dGVuIGJ5IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAcmlkZ2VydW4uY29tPgorICoKKyAqIGdzdGluZGV4LmM6IEluZGV4IGZvciBtYXBwaW5ncyBhbmQgb3RoZXIgZGF0YQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjpnc3RpbmRleAorICogQHNob3J0X2Rlc2NyaXB0aW9uOiBHZW5lcmF0ZSBpbmRleGVzIG9uIG9iamVjdHMKKyAqIEBzZWVfYWxzbzogI0dzdEluZGV4RmFjdG9yeQorICoKKyAqIEdzdEluZGV4IGlzIHVzZWQgdG8gZ2VuZXJhdGUgYSBzdHJlYW0gaW5kZXggb2Ygb25lIG9yIG1vcmUgZWxlbWVudHMKKyAqIGluIGEgcGlwZWxpbmUuCisgKgorICogRWxlbWVudHMgd2lsbCBvdmVybG9hZCB0aGUgc2V0X2luZGV4IGFuZCBnZXRfaW5kZXggdmlydHVhbCBtZXRob2RzIGluCisgKiAjR3N0RWxlbWVudC4gV2hlbiBzdHJlYW1pbmcgZGF0YSwgdGhlIGVsZW1lbnQgd2lsbCBhZGQgaW5kZXggZW50cmllcyBpZiBpdAorICogaGFzIGFuIGluZGV4IHNldC4KKyAqCisgKiBFYWNoIGVsZW1lbnQgdGhhdCBhZGRzIHRvIHRoZSBpbmRleCB3aWxsIGRvIHRoYXQgdXNpbmcgYSB3cml0ZXJfaWQuIFRoZQorICogd3JpdGVyX2lkIGlzIG9idGFpbmVkIGZyb20gZ3N0X2luZGV4X2dldF93cml0ZXJfaWQoKS4KKyAqCisgKiBUaGUgYXBwbGljYXRpb24gdGhhdCB3YW50cyB0byBpbmRleCB0aGUgc3RyZWFtIHdpbGwgY3JlYXRlIGEgbmV3IGluZGV4IG9iamVjdAorICogdXNpbmcgZ3N0X2luZGV4X25ldygpIG9yIGdzdF9pbmRleF9mYWN0b3J5X21ha2UoKS4gVGhlIGluZGV4IGlzIGFzc2lnbmVkIHRvIGEKKyAqIHNwZWNpZmljIGVsZW1lbnQsIGEgYmluIG9yIHRoZSB3aG9sZSBwaXBlbGluZS4gVGhpcyB3aWxsIGNhdXNlIGluZGV4YWJsZQorICogZWxlbWVudHMgdG8gYWRkIGVudGlyZXMgdG8gdGhlIGluZGV4IHdoaWxlIHBsYXlpbmcuCisgKi8KKworLyogRklYTUU6IGNvbXBsZXRlIGdvYmplY3QgYW5ub3RhdGlvbnMgKi8KKy8qIEZJWE1FLTAuMTE6IGNsZWFudXAgQVBJCisgKiAtIG5vIG9uZSBzZWVtcyB0byB1c2UgR3N0SW5kZXhHcm91cCwgR3N0SW5kZXhDZXJ0YWludHkKKyAqCisgKiAtIHRoZSBBUEkgZm9yIGFwcGxpY2F0aW9uIHRvIHVzZSB0aGUgaW5kZXggaXMgbW9zdGx5IG1pc3NpbmcKKyAqICAgLSBhcHBzIG5lZWQgdG8gZ2V0IGEgbGlzdCBvZiB3cml0ZXJzCisgKiAgIC0gYXBwcyBuZWVkIHRvIGJlIGFibGUgdG8gaXRlcmF0ZSBvdmVyIGVhY2ggd3JpdGVycyBpbmRleCBlbnRyeSBjb2xsZWN0aW9uCisgKiAtIGdzdF9pbmRleF9nZXRfYXNzb2NfZW50cnkoKSBzaG91bGQgcGFzcyBvd25lcnNoaXAKKyAqICAgLSB0aGUgR3N0SW5kZXhFbnRyeSBzdHJ1Y3R1cmUgaXMgbGFyZ2UgYW5kIGNvbnRhaW5zIHJlcGV0aXRpdmUgaW5mb3JtYXRpb24KKyAqICAgLSB3ZSB3YW50IHRvIGFsbG93IEluZGV4ZXJzIHRvIGltcGxlbWVudCBhIHNhbmVyIHN0b3JhZ2UgYW5kIGNyZWF0ZQorICogICAgIEdzdEluZGV4RW50cmllcyBvbiBkZW1hbmQgKHRoZSBhcHAgaGFzIHRvIGZyZWUgdGhlbSksIG1pZ2h0IGV2ZW4gbWFrZQorICogICAgIHNlbnNlIHRvIGFzayB0aGUgYXBwIHRvIHByb3ZpZGUgYSBwdHIgYW5kIGZpbGwgaXQuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisvKiBJbmRleCBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIEVOVFJZX0FEREVELAorICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUkVTT0xWRVIKKyAgICAgIC8qIEZJTEwgTUUgKi8KK307CisKKyNpZiAwCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChpbmRleF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBpbmRleF9kZWJ1ZworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGdzdF9pbmRleF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9pbmRleF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfaW5kZXhfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0SW5kZXhHcm91cCAqZ3N0X2luZGV4X2dyb3VwX25ldyAoZ3VpbnQgZ3JvdXBudW0pOworc3RhdGljIHZvaWQgZ3N0X2luZGV4X2dyb3VwX2ZyZWUgKEdzdEluZGV4R3JvdXAgKiBncm91cCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfaW5kZXhfcGF0aF9yZXNvbHZlciAoR3N0SW5kZXggKiBpbmRleCwgR3N0T2JqZWN0ICogd3JpdGVyLAorICAgIGdjaGFyICoqIHdyaXRlcl9zdHJpbmcsIGdwb2ludGVyIGRhdGEpOworc3RhdGljIGdib29sZWFuIGdzdF9pbmRleF9ndHlwZV9yZXNvbHZlciAoR3N0SW5kZXggKiBpbmRleCwgR3N0T2JqZWN0ICogd3JpdGVyLAorICAgIGdjaGFyICoqIHdyaXRlcl9zdHJpbmcsIGdwb2ludGVyIGRhdGEpOworc3RhdGljIHZvaWQgZ3N0X2luZGV4X2FkZF9lbnRyeSAoR3N0SW5kZXggKiBpbmRleCwgR3N0SW5kZXhFbnRyeSAqIGVudHJ5KTsKKworc3RhdGljIGd1aW50IGdzdF9pbmRleF9zaWduYWxzW0xBU1RfU0lHTkFMXSA9IHsgMCB9OworCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RJbmRleFJlc29sdmVyTWV0aG9kIG1ldGhvZDsKKyAgR3N0SW5kZXhSZXNvbHZlciByZXNvbHZlcjsKKyAgZ3BvaW50ZXIgdXNlcl9kYXRhOworfQorUmVzb2x2ZXJFbnRyeTsKKworc3RhdGljIGNvbnN0IFJlc29sdmVyRW50cnkgcmVzb2x2ZXJzW10gPSB7CisgIHtHU1RfSU5ERVhfUkVTT0xWRVJfQ1VTVE9NLCBOVUxMLCBOVUxMfSwKKyAge0dTVF9JTkRFWF9SRVNPTFZFUl9HVFlQRSwgZ3N0X2luZGV4X2d0eXBlX3Jlc29sdmVyLCBOVUxMfSwKKyAge0dTVF9JTkRFWF9SRVNPTFZFUl9QQVRILCBnc3RfaW5kZXhfcGF0aF9yZXNvbHZlciwgTlVMTH0sCit9OworCisjZGVmaW5lIEdTVF9UWVBFX0lOREVYX1JFU09MVkVSIChnc3RfaW5kZXhfcmVzb2x2ZXJfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X2luZGV4X3Jlc29sdmVyX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgaW5kZXhfcmVzb2x2ZXJfdHlwZSA9IDA7CisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGluZGV4X3Jlc29sdmVyW10gPSB7CisgICAge0dTVF9JTkRFWF9SRVNPTFZFUl9DVVNUT00sICJHU1RfSU5ERVhfUkVTT0xWRVJfQ1VTVE9NIiwgImN1c3RvbSJ9LAorICAgIHtHU1RfSU5ERVhfUkVTT0xWRVJfR1RZUEUsICJHU1RfSU5ERVhfUkVTT0xWRVJfR1RZUEUiLCAiZ3R5cGUifSwKKyAgICB7R1NUX0lOREVYX1JFU09MVkVSX1BBVEgsICJHU1RfSU5ERVhfUkVTT0xWRVJfUEFUSCIsICJwYXRoIn0sCisgICAgezAsIE5VTEwsIE5VTEx9LAorICB9OworCisgIGlmICghaW5kZXhfcmVzb2x2ZXJfdHlwZSkgeworICAgIGluZGV4X3Jlc29sdmVyX3R5cGUgPQorICAgICAgICBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0Rmx2RGVtdXhJbmRleFJlc29sdmVyIiwgaW5kZXhfcmVzb2x2ZXIpOworICB9CisgIHJldHVybiBpbmRleF9yZXNvbHZlcl90eXBlOworfQorCitHVHlwZQorZ3N0X2luZGV4X2VudHJ5X2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgaW5kZXhfZW50cnlfdHlwZSA9IDA7CisKKyAgaWYgKCFpbmRleF9lbnRyeV90eXBlKSB7CisgICAgaW5kZXhfZW50cnlfdHlwZSA9IGdfYm94ZWRfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RGbHZEZW11eEluZGV4RW50cnkiLAorICAgICAgICAoR0JveGVkQ29weUZ1bmMpIGdzdF9pbmRleF9lbnRyeV9jb3B5LAorICAgICAgICAoR0JveGVkRnJlZUZ1bmMpIGdzdF9pbmRleF9lbnRyeV9mcmVlKTsKKyAgfQorICByZXR1cm4gaW5kZXhfZW50cnlfdHlwZTsKK30KKworI2lmIDAKKyNkZWZpbmUgX2RvX2luaXQgXAoreyBcCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChpbmRleF9kZWJ1ZywgIkdTVF9JTkRFWCIsIEdTVF9ERUJVR19CT0xELCBcCisgICAgICAiR2VuZXJpYyBpbmRleGluZyBzdXBwb3J0Iik7IFwKK30KKyNlbmRpZgorCit0eXBlZGVmIEdzdEluZGV4IEdzdEZsdkRlbXV4SW5kZXg7Cit0eXBlZGVmIEdzdEluZGV4Q2xhc3MgR3N0Rmx2RGVtdXhJbmRleENsYXNzOworLy90eXBlZGVmIEdzdEluZGV4RW50cnkgR3N0Rmx2RGVtdXhJbmRleEVudHJ5OworR19ERUZJTkVfVFlQRSAoR3N0Rmx2RGVtdXhJbmRleCwgZ3N0X2luZGV4LCBHU1RfVFlQRV9PQkpFQ1QpOworCitzdGF0aWMgdm9pZAorZ3N0X2luZGV4X2NsYXNzX2luaXQgKEdzdEluZGV4Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICAvKioKKyAgICogR3N0SW5kZXg6OmVudHJ5LWFkZGVkCisgICAqIEBnc3RpbmRleDogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsLgorICAgKiBAYXJnMTogVGhlIGVudHJ5IGFkZGVkIHRvIHRoZSBpbmRleC4KKyAgICoKKyAgICogSXMgZW1pdHRlZCB3aGVuIGEgbmV3IGVudHJ5IGlzIGFkZGVkIHRvIHRoZSBpbmRleC4KKyAgICovCisgIGdzdF9pbmRleF9zaWduYWxzW0VOVFJZX0FEREVEXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJlbnRyeS1hZGRlZCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksIEdfU0lHTkFMX1JVTl9MQVNULAorICAgICAgR19TVFJVQ1RfT0ZGU0VUIChHc3RJbmRleENsYXNzLCBlbnRyeV9hZGRlZCksIE5VTEwsIE5VTEwsCisgICAgICBOVUxMLCBHX1RZUEVfTk9ORSwgMSwgR1NUX1RZUEVfSU5ERVhfRU5UUlkpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9pbmRleF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9pbmRleF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2luZGV4X2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkVTT0xWRVIsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoInJlc29sdmVyIiwgIlJlc29sdmVyIiwKKyAgICAgICAgICAiU2VsZWN0IGEgcHJlZGVmaW5lZCBvYmplY3QgdG8gc3RyaW5nIG1hcHBlciIsCisgICAgICAgICAgR1NUX1RZUEVfSU5ERVhfUkVTT0xWRVIsIEdTVF9JTkRFWF9SRVNPTFZFUl9QQVRILAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2luZGV4X2luaXQgKEdzdEluZGV4ICogaW5kZXgpCit7CisgIGluZGV4LT5jdXJncm91cCA9IGdzdF9pbmRleF9ncm91cF9uZXcgKDApOworICBpbmRleC0+bWF4Z3JvdXAgPSAwOworICBpbmRleC0+Z3JvdXBzID0gZ19saXN0X3ByZXBlbmQgKE5VTEwsIGluZGV4LT5jdXJncm91cCk7CisKKyAgaW5kZXgtPndyaXRlcnMgPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsKKyAgaW5kZXgtPmxhc3RfaWQgPSAwOworCisgIGluZGV4LT5tZXRob2QgPSBHU1RfSU5ERVhfUkVTT0xWRVJfUEFUSDsKKyAgaW5kZXgtPnJlc29sdmVyID0gcmVzb2x2ZXJzW2luZGV4LT5tZXRob2RdLnJlc29sdmVyOworICBpbmRleC0+cmVzb2x2ZXJfdXNlcl9kYXRhID0gcmVzb2x2ZXJzW2luZGV4LT5tZXRob2RdLnVzZXJfZGF0YTsKKworICBHU1RfT0JKRUNUX0ZMQUdfU0VUIChpbmRleCwgR1NUX0lOREVYX1dSSVRBQkxFKTsKKyAgR1NUX09CSkVDVF9GTEFHX1NFVCAoaW5kZXgsIEdTVF9JTkRFWF9SRUFEQUJMRSk7CisKKyAgR1NUX0RFQlVHICgiY3JlYXRlZCBuZXcgaW5kZXgiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9pbmRleF9mcmVlX3dyaXRlciAoZ3BvaW50ZXIga2V5LCBncG9pbnRlciB2YWx1ZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RJbmRleEVudHJ5ICplbnRyeSA9IChHc3RJbmRleEVudHJ5ICopIHZhbHVlOworCisgIGlmIChlbnRyeSkgeworICAgIGdzdF9pbmRleF9lbnRyeV9mcmVlIChlbnRyeSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9pbmRleF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0SW5kZXggKmluZGV4ID0gR1NUX0lOREVYIChvYmplY3QpOworCisgIGlmIChpbmRleC0+Z3JvdXBzKSB7CisgICAgZ19saXN0X2ZvcmVhY2ggKGluZGV4LT5ncm91cHMsIChHRnVuYykgZ3N0X2luZGV4X2dyb3VwX2ZyZWUsIE5VTEwpOworICAgIGdfbGlzdF9mcmVlIChpbmRleC0+Z3JvdXBzKTsKKyAgICBpbmRleC0+Z3JvdXBzID0gTlVMTDsKKyAgfQorCisgIGlmIChpbmRleC0+d3JpdGVycykgeworICAgIGdfaGFzaF90YWJsZV9mb3JlYWNoIChpbmRleC0+d3JpdGVycywgZ3N0X2luZGV4X2ZyZWVfd3JpdGVyLCBOVUxMKTsKKyAgICBnX2hhc2hfdGFibGVfZGVzdHJveSAoaW5kZXgtPndyaXRlcnMpOworICAgIGluZGV4LT53cml0ZXJzID0gTlVMTDsKKyAgfQorCisgIGlmIChpbmRleC0+ZmlsdGVyX3VzZXJfZGF0YSAmJiBpbmRleC0+ZmlsdGVyX3VzZXJfZGF0YV9kZXN0cm95KQorICAgIGluZGV4LT5maWx0ZXJfdXNlcl9kYXRhX2Rlc3Ryb3kgKGluZGV4LT5maWx0ZXJfdXNlcl9kYXRhKTsKKworICBpZiAoaW5kZXgtPnJlc29sdmVyX3VzZXJfZGF0YSAmJiBpbmRleC0+cmVzb2x2ZXJfdXNlcl9kYXRhX2Rlc3Ryb3kpCisgICAgaW5kZXgtPnJlc29sdmVyX3VzZXJfZGF0YV9kZXN0cm95IChpbmRleC0+cmVzb2x2ZXJfdXNlcl9kYXRhKTsKKworICBHX09CSkVDVF9DTEFTUyAoZ3N0X2luZGV4X3BhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2luZGV4X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RJbmRleCAqaW5kZXg7CisKKyAgaW5kZXggPSBHU1RfSU5ERVggKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1JFU09MVkVSOgorICAgICAgaW5kZXgtPm1ldGhvZCA9IChHc3RJbmRleFJlc29sdmVyTWV0aG9kKSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBpbmRleC0+cmVzb2x2ZXIgPSByZXNvbHZlcnNbaW5kZXgtPm1ldGhvZF0ucmVzb2x2ZXI7CisgICAgICBpbmRleC0+cmVzb2x2ZXJfdXNlcl9kYXRhID0gcmVzb2x2ZXJzW2luZGV4LT5tZXRob2RdLnVzZXJfZGF0YTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9pbmRleF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0SW5kZXggKmluZGV4OworCisgIGluZGV4ID0gR1NUX0lOREVYIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9SRVNPTFZFUjoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBpbmRleC0+bWV0aG9kKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdEluZGV4R3JvdXAgKgorZ3N0X2luZGV4X2dyb3VwX25ldyAoZ3VpbnQgZ3JvdXBudW0pCit7CisgIEdzdEluZGV4R3JvdXAgKmluZGV4Z3JvdXAgPSBnX3NsaWNlX25ldyAoR3N0SW5kZXhHcm91cCk7CisKKyAgaW5kZXhncm91cC0+Z3JvdXBudW0gPSBncm91cG51bTsKKyAgaW5kZXhncm91cC0+ZW50cmllcyA9IE5VTEw7CisgIGluZGV4Z3JvdXAtPmNlcnRhaW50eSA9IEdTVF9JTkRFWF9VTktOT1dOOworICBpbmRleGdyb3VwLT5wZWVyZ3JvdXAgPSAtMTsKKworICBHU1RfREVCVUcgKCJjcmVhdGVkIG5ldyBpbmRleCBncm91cCAlZCIsIGdyb3VwbnVtKTsKKworICByZXR1cm4gaW5kZXhncm91cDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9pbmRleF9ncm91cF9mcmVlIChHc3RJbmRleEdyb3VwICogZ3JvdXApCit7CisgIGdfc2xpY2VfZnJlZSAoR3N0SW5kZXhHcm91cCwgZ3JvdXApOworfQorCisvKiBkbyBub3QgcmVzdXJyZWN0IHRoaXMsIGFkZCBhIGRlcml2ZWQgZHVtbXkgaW5kZXggY2xhc3MgaW5zdGVhZCAqLworI2lmIDAKKy8qKgorICogZ3N0X2luZGV4X25ldzoKKyAqCisgKiBDcmVhdGUgYSBuZXcgZHVtbXkgaW5kZXggb2JqZWN0LiBVc2UgZ3N0X2VsZW1lbnRfc2V0X2luZGV4KCkgdG8gYXNzaWduIHRoYXQKKyAqIHRvIGFuIGVsZW1lbnQgb3IgcGlwZWxpbmUuIFRoaXMgaW5kZXggaXMgbm90IHN0b3JpbmcgYW55dGhpbmcsIGJ1dCB3aWxsCisgKiBzdGlsbCBlbWl0IGUuZy4gdGhlICNHc3RJbmRleDo6ZW50cnktYWRkZWQgc2lnbmFsLgorICoKKyAqIFJldHVybnM6ICh0cmFuc2ZlciBmdWxsKTogYSBuZXcgaW5kZXggb2JqZWN0CisgKi8KK0dzdEluZGV4ICoKK2dzdF9pbmRleF9uZXcgKHZvaWQpCit7CisgIEdzdEluZGV4ICppbmRleDsKKworICBpbmRleCA9IGdfb2JqZWN0X25ld3YgKGdzdF9pbmRleF9nZXRfdHlwZSAoKSwgMCwgTlVMTCk7CisKKyAgcmV0dXJuIGluZGV4OworfQorI2VuZGlmCisKKy8qKgorICogZ3N0X2luZGV4X2NvbW1pdDoKKyAqIEBpbmRleDogdGhlIGluZGV4IHRvIGNvbW1pdAorICogQGlkOiB0aGUgd3JpdGVyIHRoYXQgY29tbWl0ZWQgdGhlIGluZGV4CisgKgorICogVGVsbCB0aGUgaW5kZXggdGhhdCB0aGUgd3JpdGVyIHdpdGggdGhlIGdpdmVuIGlkIGlzIGRvbmUKKyAqIHdpdGggdGhpcyBpbmRleCBhbmQgaXMgbm90IGdvaW5nIHRvIHdyaXRlIGFueSBtb3JlIGVudHJpZXMKKyAqIHRvIGl0LgorICovCit2b2lkCitnc3RfaW5kZXhfY29tbWl0IChHc3RJbmRleCAqIGluZGV4LCBnaW50IGlkKQoreworICBHc3RJbmRleENsYXNzICppY2xhc3M7CisKKyAgaWNsYXNzID0gR1NUX0lOREVYX0dFVF9DTEFTUyAoaW5kZXgpOworCisgIGlmIChpY2xhc3MtPmNvbW1pdCkKKyAgICBpY2xhc3MtPmNvbW1pdCAoaW5kZXgsIGlkKTsKK30KKworI2lmIDAKKy8qKgorICogZ3N0X2luZGV4X2dldF9ncm91cDoKKyAqIEBpbmRleDogdGhlIGluZGV4IHRvIGdldCB0aGUgY3VycmVudCBncm91cCBmcm9tCisgKgorICogR2V0IHRoZSBpZCBvZiB0aGUgY3VycmVudCBncm91cC4KKyAqCisgKiBSZXR1cm5zOiB0aGUgaWQgb2YgdGhlIGN1cnJlbnQgZ3JvdXAuCisgKi8KK2dpbnQKK2dzdF9pbmRleF9nZXRfZ3JvdXAgKEdzdEluZGV4ICogaW5kZXgpCit7CisgIHJldHVybiBpbmRleC0+Y3VyZ3JvdXAtPmdyb3VwbnVtOworfQorCisvKioKKyAqIGdzdF9pbmRleF9uZXdfZ3JvdXA6CisgKiBAaW5kZXg6IHRoZSBpbmRleCB0byBjcmVhdGUgdGhlIG5ldyBncm91cCBpbgorICoKKyAqIENyZWF0ZSBhIG5ldyBncm91cCBmb3IgdGhlIGdpdmVuIGluZGV4LiBJdCB3aWxsIGJlCisgKiBzZXQgYXMgdGhlIGN1cnJlbnQgZ3JvdXAuCisgKgorICogUmV0dXJuczogdGhlIGlkIG9mIHRoZSBuZXdseSBjcmVhdGVkIGdyb3VwLgorICovCitnaW50Citnc3RfaW5kZXhfbmV3X2dyb3VwIChHc3RJbmRleCAqIGluZGV4KQoreworICBpbmRleC0+Y3VyZ3JvdXAgPSBnc3RfaW5kZXhfZ3JvdXBfbmV3ICgrK2luZGV4LT5tYXhncm91cCk7CisgIGluZGV4LT5ncm91cHMgPSBnX2xpc3RfYXBwZW5kIChpbmRleC0+Z3JvdXBzLCBpbmRleC0+Y3VyZ3JvdXApOworICBHU1RfREVCVUcgKCJjcmVhdGVkIG5ldyBncm91cCAlZCBpbiBpbmRleCIsIGluZGV4LT5tYXhncm91cCk7CisgIHJldHVybiBpbmRleC0+bWF4Z3JvdXA7Cit9CisKKy8qKgorICogZ3N0X2luZGV4X3NldF9ncm91cDoKKyAqIEBpbmRleDogdGhlIGluZGV4IHRvIHNldCB0aGUgbmV3IGdyb3VwIGluCisgKiBAZ3JvdXBudW06IHRoZSBncm91cG51bWJlciB0byBzZXQKKyAqCisgKiBTZXQgdGhlIGN1cnJlbnQgZ3JvdXBudW1iZXIgdG8gdGhlIGdpdmVuIGFyZ3VtZW50LgorICoKKyAqIFJldHVybnM6IFRSVUUgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQsIEZBTFNFIGlmIHRoZSBncm91cAorICogZGlkIG5vdCBleGlzdC4KKyAqLworZ2Jvb2xlYW4KK2dzdF9pbmRleF9zZXRfZ3JvdXAgKEdzdEluZGV4ICogaW5kZXgsIGdpbnQgZ3JvdXBudW0pCit7CisgIEdMaXN0ICpsaXN0OworICBHc3RJbmRleEdyb3VwICppbmRleGdyb3VwOworCisgIC8qIGZpcnN0IGNoZWNrIGZvciBudWxsIGNoYW5nZSAqLworICBpZiAoZ3JvdXBudW0gPT0gaW5kZXgtPmN1cmdyb3VwLT5ncm91cG51bSkKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBlbHNlIHNlYXJjaCBmb3IgdGhlIHByb3BlciBncm91cCAqLworICBsaXN0ID0gaW5kZXgtPmdyb3VwczsKKyAgd2hpbGUgKGxpc3QpIHsKKyAgICBpbmRleGdyb3VwID0gKEdzdEluZGV4R3JvdXAgKikgKGxpc3QtPmRhdGEpOworICAgIGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCk7CisgICAgaWYgKGluZGV4Z3JvdXAtPmdyb3VwbnVtID09IGdyb3VwbnVtKSB7CisgICAgICBpbmRleC0+Y3VyZ3JvdXAgPSBpbmRleGdyb3VwOworICAgICAgR1NUX0RFQlVHICgic3dpdGNoZWQgdG8gaW5kZXggZ3JvdXAgJWQiLCBpbmRleGdyb3VwLT5ncm91cG51bSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKworICAvKiBjb3VsZG4ndCBmaW5kIHRoZSBncm91cCBpbiBxdWVzdGlvbiAqLworICBHU1RfREVCVUcgKCJjb3VsZG4ndCBmaW5kIGluZGV4IGdyb3VwICVkIiwgZ3JvdXBudW0pOworICByZXR1cm4gRkFMU0U7Cit9CisjZW5kaWYKKworI2lmIDAKKy8qKgorICogZ3N0X2luZGV4X3NldF9jZXJ0YWludHk6CisgKiBAaW5kZXg6IHRoZSBpbmRleCB0byBzZXQgdGhlIGNlcnRhaW50eSBvbgorICogQGNlcnRhaW50eTogdGhlIGNlcnRhaW50eSB0byBzZXQKKyAqCisgKiBTZXQgdGhlIGNlcnRhaW50eSBvZiB0aGUgZ2l2ZW4gaW5kZXguCisgKi8KK3ZvaWQKK2dzdF9pbmRleF9zZXRfY2VydGFpbnR5IChHc3RJbmRleCAqIGluZGV4LCBHc3RJbmRleENlcnRhaW50eSBjZXJ0YWludHkpCit7CisgIGluZGV4LT5jdXJncm91cC0+Y2VydGFpbnR5ID0gY2VydGFpbnR5OworfQorCisvKioKKyAqIGdzdF9pbmRleF9nZXRfY2VydGFpbnR5OgorICogQGluZGV4OiB0aGUgaW5kZXggdG8gZ2V0IHRoZSBjZXJ0YWludHkgb2YKKyAqCisgKiBHZXQgdGhlIGNlcnRhaW50eSBvZiB0aGUgZ2l2ZW4gaW5kZXguCisgKgorICogUmV0dXJuczogdGhlIGNlcnRhaW50eSBvZiB0aGUgaW5kZXguCisgKi8KK0dzdEluZGV4Q2VydGFpbnR5Citnc3RfaW5kZXhfZ2V0X2NlcnRhaW50eSAoR3N0SW5kZXggKiBpbmRleCkKK3sKKyAgcmV0dXJuIGluZGV4LT5jdXJncm91cC0+Y2VydGFpbnR5OworfQorI2VuZGlmCisKKyNpZiAwCisvKioKKyAqIGdzdF9pbmRleF9zZXRfZmlsdGVyOgorICogQGluZGV4OiB0aGUgaW5kZXggdG8gcmVnaXN0ZXIgdGhlIGZpbHRlciBvbgorICogQGZpbHRlcjogdGhlIGZpbHRlciB0byByZWdpc3RlcgorICogQHVzZXJfZGF0YTogZGF0YSBwYXNzZWQgdG8gdGhlIGZpbHRlciBmdW5jdGlvbgorICoKKyAqIExldHMgdGhlIGFwcCByZWdpc3RlciBhIGN1c3RvbSBmaWx0ZXIgZnVuY3Rpb24gc28gdGhhdAorICogaXQgY2FuIHNlbGVjdCB3aGF0IGVudHJpZXMgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgaW5kZXguCisgKi8KK3ZvaWQKK2dzdF9pbmRleF9zZXRfZmlsdGVyIChHc3RJbmRleCAqIGluZGV4LAorICAgIEdzdEluZGV4RmlsdGVyIGZpbHRlciwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfSU5ERVggKGluZGV4KSk7CisKKyAgZ3N0X2luZGV4X3NldF9maWx0ZXJfZnVsbCAoaW5kZXgsIGZpbHRlciwgdXNlcl9kYXRhLCBOVUxMKTsKK30KKworLyoqCisgKiBnc3RfaW5kZXhfc2V0X2ZpbHRlcl9mdWxsOgorICogQGluZGV4OiB0aGUgaW5kZXggdG8gcmVnaXN0ZXIgdGhlIGZpbHRlciBvbgorICogQGZpbHRlcjogdGhlIGZpbHRlciB0byByZWdpc3RlcgorICogQHVzZXJfZGF0YTogZGF0YSBwYXNzZWQgdG8gdGhlIGZpbHRlciBmdW5jdGlvbgorICogQHVzZXJfZGF0YV9kZXN0cm95OiBmdW5jdGlvbiB0byBjYWxsIHdoZW4gQHVzZXJfZGF0YSBpcyB1bnNldAorICoKKyAqIExldHMgdGhlIGFwcCByZWdpc3RlciBhIGN1c3RvbSBmaWx0ZXIgZnVuY3Rpb24gc28gdGhhdAorICogaXQgY2FuIHNlbGVjdCB3aGF0IGVudHJpZXMgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgaW5kZXguCisgKi8KK3ZvaWQKK2dzdF9pbmRleF9zZXRfZmlsdGVyX2Z1bGwgKEdzdEluZGV4ICogaW5kZXgsCisgICAgR3N0SW5kZXhGaWx0ZXIgZmlsdGVyLCBncG9pbnRlciB1c2VyX2RhdGEsIEdEZXN0cm95Tm90aWZ5IHVzZXJfZGF0YV9kZXN0cm95KQoreworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfSU5ERVggKGluZGV4KSk7CisKKyAgaWYgKGluZGV4LT5maWx0ZXJfdXNlcl9kYXRhICYmIGluZGV4LT5maWx0ZXJfdXNlcl9kYXRhX2Rlc3Ryb3kpCisgICAgaW5kZXgtPmZpbHRlcl91c2VyX2RhdGFfZGVzdHJveSAoaW5kZXgtPmZpbHRlcl91c2VyX2RhdGEpOworCisgIGluZGV4LT5maWx0ZXIgPSBmaWx0ZXI7CisgIGluZGV4LT5maWx0ZXJfdXNlcl9kYXRhID0gdXNlcl9kYXRhOworICBpbmRleC0+ZmlsdGVyX3VzZXJfZGF0YV9kZXN0cm95ID0gdXNlcl9kYXRhX2Rlc3Ryb3k7Cit9CisKKy8qKgorICogZ3N0X2luZGV4X3NldF9yZXNvbHZlcjoKKyAqIEBpbmRleDogdGhlIGluZGV4IHRvIHJlZ2lzdGVyIHRoZSByZXNvbHZlciBvbgorICogQHJlc29sdmVyOiB0aGUgcmVzb2x2ZXIgdG8gcmVnaXN0ZXIKKyAqIEB1c2VyX2RhdGE6IGRhdGEgcGFzc2VkIHRvIHRoZSByZXNvbHZlciBmdW5jdGlvbgorICoKKyAqIExldHMgdGhlIGFwcCByZWdpc3RlciBhIGN1c3RvbSBmdW5jdGlvbiB0byBtYXAgaW5kZXgKKyAqIGlkcyB0byB3cml0ZXIgZGVzY3JpcHRpb25zLgorICovCit2b2lkCitnc3RfaW5kZXhfc2V0X3Jlc29sdmVyIChHc3RJbmRleCAqIGluZGV4LAorICAgIEdzdEluZGV4UmVzb2x2ZXIgcmVzb2x2ZXIsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ3N0X2luZGV4X3NldF9yZXNvbHZlcl9mdWxsIChpbmRleCwgcmVzb2x2ZXIsIHVzZXJfZGF0YSwgTlVMTCk7Cit9CisKKy8qKgorICogZ3N0X2luZGV4X3NldF9yZXNvbHZlcl9mdWxsOgorICogQGluZGV4OiB0aGUgaW5kZXggdG8gcmVnaXN0ZXIgdGhlIHJlc29sdmVyIG9uCisgKiBAcmVzb2x2ZXI6IHRoZSByZXNvbHZlciB0byByZWdpc3RlcgorICogQHVzZXJfZGF0YTogZGF0YSBwYXNzZWQgdG8gdGhlIHJlc29sdmVyIGZ1bmN0aW9uCisgKiBAdXNlcl9kYXRhX2Rlc3Ryb3k6IGRlc3Ryb3kgZnVuY3Rpb24gZm9yIEB1c2VyX2RhdGEKKyAqCisgKiBMZXRzIHRoZSBhcHAgcmVnaXN0ZXIgYSBjdXN0b20gZnVuY3Rpb24gdG8gbWFwIGluZGV4CisgKiBpZHMgdG8gd3JpdGVyIGRlc2NyaXB0aW9ucy4KKyAqCisgKiBTaW5jZTogMC4xMC4xOAorICovCit2b2lkCitnc3RfaW5kZXhfc2V0X3Jlc29sdmVyX2Z1bGwgKEdzdEluZGV4ICogaW5kZXgsIEdzdEluZGV4UmVzb2x2ZXIgcmVzb2x2ZXIsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhLCBHRGVzdHJveU5vdGlmeSB1c2VyX2RhdGFfZGVzdHJveSkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX0lOREVYIChpbmRleCkpOworCisgIGlmIChpbmRleC0+cmVzb2x2ZXJfdXNlcl9kYXRhICYmIGluZGV4LT5yZXNvbHZlcl91c2VyX2RhdGFfZGVzdHJveSkKKyAgICBpbmRleC0+cmVzb2x2ZXJfdXNlcl9kYXRhX2Rlc3Ryb3kgKGluZGV4LT5yZXNvbHZlcl91c2VyX2RhdGEpOworCisgIGluZGV4LT5yZXNvbHZlciA9IHJlc29sdmVyOworICBpbmRleC0+cmVzb2x2ZXJfdXNlcl9kYXRhID0gdXNlcl9kYXRhOworICBpbmRleC0+cmVzb2x2ZXJfdXNlcl9kYXRhX2Rlc3Ryb3kgPSB1c2VyX2RhdGFfZGVzdHJveTsKKyAgaW5kZXgtPm1ldGhvZCA9IEdTVF9JTkRFWF9SRVNPTFZFUl9DVVNUT007Cit9CisjZW5kaWYKKworLyoqCisgKiBnc3RfaW5kZXhfZW50cnlfY29weToKKyAqIEBlbnRyeTogdGhlIGVudHJ5IHRvIGNvcHkKKyAqCisgKiBDb3BpZXMgYW4gZW50cnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyAqCisgKiBGcmVlLWZ1bmN0aW9uOiBnc3RfaW5kZXhfZW50cnlfZnJlZQorICoKKyAqIFJldHVybnM6ICh0cmFuc2ZlciBmdWxsKTogYSBuZXdseSBhbGxvY2F0ZWQgI0dzdEluZGV4RW50cnkuCisgKi8KK0dzdEluZGV4RW50cnkgKgorZ3N0X2luZGV4X2VudHJ5X2NvcHkgKEdzdEluZGV4RW50cnkgKiBlbnRyeSkKK3sKKyAgR3N0SW5kZXhFbnRyeSAqbmV3X2VudHJ5ID0gZ19zbGljZV9uZXcgKEdzdEluZGV4RW50cnkpOworCisgIG1lbWNweSAobmV3X2VudHJ5LCBlbnRyeSwgc2l6ZW9mIChHc3RJbmRleEVudHJ5KSk7CisgIHJldHVybiBuZXdfZW50cnk7Cit9CisKKy8qKgorICogZ3N0X2luZGV4X2VudHJ5X2ZyZWU6CisgKiBAZW50cnk6ICh0cmFuc2ZlciBmdWxsKTogdGhlIGVudHJ5IHRvIGZyZWUKKyAqCisgKiBGcmVlIHRoZSBtZW1vcnkgdXNlZCBieSB0aGUgZ2l2ZW4gZW50cnkuCisgKi8KK3ZvaWQKK2dzdF9pbmRleF9lbnRyeV9mcmVlIChHc3RJbmRleEVudHJ5ICogZW50cnkpCit7CisgIHN3aXRjaCAoZW50cnktPnR5cGUpIHsKKyAgICBjYXNlIEdTVF9JTkRFWF9FTlRSWV9JRDoKKyAgICAgIGlmIChlbnRyeS0+ZGF0YS5pZC5kZXNjcmlwdGlvbikgeworICAgICAgICBnX2ZyZWUgKGVudHJ5LT5kYXRhLmlkLmRlc2NyaXB0aW9uKTsKKyAgICAgICAgZW50cnktPmRhdGEuaWQuZGVzY3JpcHRpb24gPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfSU5ERVhfRU5UUllfQVNTT0NJQVRJT046CisgICAgICBpZiAoZW50cnktPmRhdGEuYXNzb2MuYXNzb2NzKSB7CisgICAgICAgIGdfZnJlZSAoZW50cnktPmRhdGEuYXNzb2MuYXNzb2NzKTsKKyAgICAgICAgZW50cnktPmRhdGEuYXNzb2MuYXNzb2NzID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0lOREVYX0VOVFJZX09CSkVDVDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0lOREVYX0VOVFJZX0ZPUk1BVDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgZ19zbGljZV9mcmVlIChHc3RJbmRleEVudHJ5LCBlbnRyeSk7Cit9CisKKyNpZiAwCisvKioKKyAqIGdzdF9pbmRleF9hZGRfZm9ybWF0OgorICogQGluZGV4OiB0aGUgaW5kZXggdG8gYWRkIHRoZSBlbnRyeSB0bworICogQGlkOiB0aGUgaWQgb2YgdGhlIGluZGV4IHdyaXRlcgorICogQGZvcm1hdDogdGhlIGZvcm1hdCB0byBhZGQgdG8gdGhlIGluZGV4CisgKgorICogQWRkcyBhIGZvcm1hdCBlbnRyeSBpbnRvIHRoZSBpbmRleC4gVGhpcyBmdW5jdGlvbiBpcworICogdXNlZCB0byBtYXAgZHluYW1pYyBHc3RGb3JtYXQgaWRzIHRvIHRoZWlyIG9yaWdpbmFsCisgKiBmb3JtYXQga2V5LgorICoKKyAqIEZyZWUtZnVuY3Rpb246IGdzdF9pbmRleF9lbnRyeV9mcmVlCisgKgorICogUmV0dXJuczogKHRyYW5zZmVyIGZ1bGwpOiBhIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGFkZGVkIGVudHJ5IGluIHRoZSBpbmRleC4KKyAqLworR3N0SW5kZXhFbnRyeSAqCitnc3RfaW5kZXhfYWRkX2Zvcm1hdCAoR3N0SW5kZXggKiBpbmRleCwgZ2ludCBpZCwgR3N0Rm9ybWF0IGZvcm1hdCkKK3sKKyAgR3N0SW5kZXhFbnRyeSAqZW50cnk7CisgIGNvbnN0IEdzdEZvcm1hdERlZmluaXRpb24gKmRlZjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX0lOREVYIChpbmRleCksIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZm9ybWF0ICE9IDAsIE5VTEwpOworCisgIGlmICghR1NUX0lOREVYX0lTX1dSSVRBQkxFIChpbmRleCkgfHwgaWQgPT0gLTEpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZW50cnkgPSBnX3NsaWNlX25ldyAoR3N0SW5kZXhFbnRyeSk7CisgIGVudHJ5LT50eXBlID0gR1NUX0lOREVYX0VOVFJZX0ZPUk1BVDsKKyAgZW50cnktPmlkID0gaWQ7CisgIGVudHJ5LT5kYXRhLmZvcm1hdC5mb3JtYXQgPSBmb3JtYXQ7CisKKyAgZGVmID0gZ3N0X2Zvcm1hdF9nZXRfZGV0YWlscyAoZm9ybWF0KTsKKyAgZW50cnktPmRhdGEuZm9ybWF0LmtleSA9IGRlZi0+bmljazsKKworICBnc3RfaW5kZXhfYWRkX2VudHJ5IChpbmRleCwgZW50cnkpOworCisgIHJldHVybiBlbnRyeTsKK30KKyNlbmRpZgorCisvKioKKyAqIGdzdF9pbmRleF9hZGRfaWQ6CisgKiBAaW5kZXg6IHRoZSBpbmRleCB0byBhZGQgdGhlIGVudHJ5IHRvCisgKiBAaWQ6IHRoZSBpZCBvZiB0aGUgaW5kZXggd3JpdGVyCisgKiBAZGVzY3JpcHRpb246IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgaW5kZXggd3JpdGVyCisgKgorICogQWRkIGFuIGlkIGVudHJ5IGludG8gdGhlIGluZGV4LgorICoKKyAqIFJldHVybnM6IGEgcG9pbnRlciB0byB0aGUgbmV3bHkgYWRkZWQgZW50cnkgaW4gdGhlIGluZGV4LgorICovCitHc3RJbmRleEVudHJ5ICoKK2dzdF9pbmRleF9hZGRfaWQgKEdzdEluZGV4ICogaW5kZXgsIGdpbnQgaWQsIGdjaGFyICogZGVzY3JpcHRpb24pCit7CisgIEdzdEluZGV4RW50cnkgKmVudHJ5OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfSU5ERVggKGluZGV4KSwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChkZXNjcmlwdGlvbiAhPSBOVUxMLCBOVUxMKTsKKworICBpZiAoIUdTVF9JTkRFWF9JU19XUklUQUJMRSAoaW5kZXgpIHx8IGlkID09IC0xKQorICAgIHJldHVybiBOVUxMOworCisgIGVudHJ5ID0gZ19zbGljZV9uZXcgKEdzdEluZGV4RW50cnkpOworICBlbnRyeS0+dHlwZSA9IEdTVF9JTkRFWF9FTlRSWV9JRDsKKyAgZW50cnktPmlkID0gaWQ7CisgIGVudHJ5LT5kYXRhLmlkLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisKKyAgZ3N0X2luZGV4X2FkZF9lbnRyeSAoaW5kZXgsIGVudHJ5KTsKKworICByZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2luZGV4X3BhdGhfcmVzb2x2ZXIgKEdzdEluZGV4ICogaW5kZXgsIEdzdE9iamVjdCAqIHdyaXRlciwKKyAgICBnY2hhciAqKiB3cml0ZXJfc3RyaW5nLCBncG9pbnRlciBkYXRhKQoreworICAqd3JpdGVyX3N0cmluZyA9IGdzdF9vYmplY3RfZ2V0X3BhdGhfc3RyaW5nICh3cml0ZXIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9pbmRleF9ndHlwZV9yZXNvbHZlciAoR3N0SW5kZXggKiBpbmRleCwgR3N0T2JqZWN0ICogd3JpdGVyLAorICAgIGdjaGFyICoqIHdyaXRlcl9zdHJpbmcsIGdwb2ludGVyIGRhdGEpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICh3cml0ZXIgIT0gTlVMTCwgRkFMU0UpOworCisgIGlmIChHU1RfSVNfUEFEICh3cml0ZXIpKSB7CisgICAgR3N0T2JqZWN0ICplbGVtZW50ID0gZ3N0X29iamVjdF9nZXRfcGFyZW50IChHU1RfT0JKRUNUICh3cml0ZXIpKTsKKyAgICBnY2hhciAqbmFtZTsKKworICAgIG5hbWUgPSBnc3Rfb2JqZWN0X2dldF9uYW1lICh3cml0ZXIpOworICAgIGlmIChlbGVtZW50KSB7CisgICAgICAqd3JpdGVyX3N0cmluZyA9IGdfc3RyZHVwX3ByaW50ZiAoIiVzLiVzIiwKKyAgICAgICAgICBHX09CSkVDVF9UWVBFX05BTUUgKGVsZW1lbnQpLCBuYW1lKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGVsZW1lbnQpOworICAgIH0gZWxzZSB7CisgICAgICAqd3JpdGVyX3N0cmluZyA9IG5hbWU7CisgICAgICBuYW1lID0gTlVMTDsKKyAgICB9CisKKyAgICBnX2ZyZWUgKG5hbWUpOworCisgIH0gZWxzZSB7CisgICAgKndyaXRlcl9zdHJpbmcgPSBnX3N0cmR1cCAoR19PQkpFQ1RfVFlQRV9OQU1FICh3cml0ZXIpKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIGdzdF9pbmRleF9nZXRfd3JpdGVyX2lkOgorICogQGluZGV4OiB0aGUgaW5kZXggdG8gZ2V0IGEgdW5pcXVlIHdyaXRlIGlkIGZvcgorICogQHdyaXRlcjogdGhlIEdzdE9iamVjdCB0byBhbGxvY2F0ZSBhbiBpZCBmb3IKKyAqIEBpZDogYSBwb2ludGVyIHRvIGEgZ2ludCB0byBob2xkIHRoZSBpZAorICoKKyAqIEJlZm9yZSBlbnRyaWVzIGNhbiBiZSBhZGRlZCB0byB0aGUgaW5kZXgsIGEgd3JpdGVyCisgKiBzaG91bGQgb2J0YWluIGEgdW5pcXVlIGlkLiBUaGUgbWV0aG9kcyB0byBhZGQgbmV3IGVudHJpZXMKKyAqIHRvIHRoZSBpbmRleCByZXF1aXJlIHRoaXMgaWQgYXMgYW4gYXJndW1lbnQuCisgKgorICogVGhlIGFwcGxpY2F0aW9uIGNhbiBpbXBsZW1lbnQgYSBjdXN0b20gZnVuY3Rpb24gdG8gbWFwIHRoZSB3cml0ZXIgb2JqZWN0CisgKiB0byBhIHN0cmluZy4gVGhhdCBzdHJpbmcgd2lsbCBiZSB1c2VkIHRvIHJlZ2lzdGVyIG9yIGxvb2sgdXAgYW4gaWQKKyAqIGluIHRoZSBpbmRleC4KKyAqCisgKiA8bm90ZT4KKyAqIFRoZSBjYWxsZXIgbXVzdCBub3QgaG9sZCBAd3JpdGVyJ3MgI0dTVF9PQkpFQ1RfTE9DSywgYXMgdGhlIGRlZmF1bHQKKyAqIHJlc29sdmVyIG1heSBjYWxsIGZ1bmN0aW9ucyB0aGF0IHRha2UgdGhlIG9iamVjdCBsb2NrIGFzIHdlbGwsIGFuZAorICogdGhlIGxvY2sgaXMgbm90IHJlY3Vyc2l2ZS4KKyAqIDwvbm90ZT4KKyAqCisgKiBSZXR1cm5zOiBUUlVFIGlmIHRoZSB3cml0ZXIgd291bGQgYmUgbWFwcGVkIHRvIGFuIGlkLgorICovCitnYm9vbGVhbgorZ3N0X2luZGV4X2dldF93cml0ZXJfaWQgKEdzdEluZGV4ICogaW5kZXgsIEdzdE9iamVjdCAqIHdyaXRlciwgZ2ludCAqIGlkKQoreworICBnY2hhciAqd3JpdGVyX3N0cmluZyA9IE5VTEw7CisgIEdzdEluZGV4RW50cnkgKmVudHJ5OworICBHc3RJbmRleENsYXNzICppY2xhc3M7CisgIGdib29sZWFuIHN1Y2Nlc3MgPSBGQUxTRTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX0lOREVYIChpbmRleCksIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19PQkpFQ1QgKHdyaXRlciksIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGlkLCBGQUxTRSk7CisKKyAgKmlkID0gLTE7CisKKyAgLyogZmlyc3QgdHJ5IHRvIGdldCBhIHByZXZpb3VzbHkgY2FjaGVkIGlkICovCisgIGVudHJ5ID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAoaW5kZXgtPndyaXRlcnMsIHdyaXRlcik7CisgIGlmIChlbnRyeSA9PSBOVUxMKSB7CisKKyAgICBpY2xhc3MgPSBHU1RfSU5ERVhfR0VUX0NMQVNTIChpbmRleCk7CisKKyAgICAvKiBsZXQgdGhlIGFwcCBtYWtlIGEgc3RyaW5nICovCisgICAgaWYgKGluZGV4LT5yZXNvbHZlcikgeworICAgICAgZ2Jvb2xlYW4gcmVzOworCisgICAgICByZXMgPQorICAgICAgICAgIGluZGV4LT5yZXNvbHZlciAoaW5kZXgsIHdyaXRlciwgJndyaXRlcl9zdHJpbmcsCisgICAgICAgICAgaW5kZXgtPnJlc29sdmVyX3VzZXJfZGF0YSk7CisgICAgICBpZiAoIXJlcykKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICBnX3dhcm5pbmcgKCJubyByZXNvbHZlciBmb3VuZCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIGlmIHRoZSBpbmRleCBoYXMgYSByZXNvbHZlciwgbWFrZSBpdCBtYXAgdGhpcyBzdHJpbmcgdG8gYW4gaWQgKi8KKyAgICBpZiAoaWNsYXNzLT5nZXRfd3JpdGVyX2lkKSB7CisgICAgICBzdWNjZXNzID0gaWNsYXNzLT5nZXRfd3JpdGVyX2lkIChpbmRleCwgaWQsIHdyaXRlcl9zdHJpbmcpOworICAgIH0KKyAgICAvKiBpZiB0aGUgaW5kZXggY291bGQgbm90IHJlc29sdmUsIHdlIGFsbG9jYXRlIG9uZSBvdXJzZWx2ZXMgKi8KKyAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICppZCA9ICsraW5kZXgtPmxhc3RfaWQ7CisgICAgfQorCisgICAgZW50cnkgPSBnc3RfaW5kZXhfYWRkX2lkIChpbmRleCwgKmlkLCB3cml0ZXJfc3RyaW5nKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAvKiBpbmRleCBpcyBwcm9iYWJseSBub3Qgd3JpdGFibGUsIG1ha2UgYW4gZW50cnkgYW55d2F5CisgICAgICAgKiB0byBrZWVwIGl0IGluIG91ciBjYWNoZSAqLworICAgICAgZW50cnkgPSBnX3NsaWNlX25ldyAoR3N0SW5kZXhFbnRyeSk7CisgICAgICBlbnRyeS0+dHlwZSA9IEdTVF9JTkRFWF9FTlRSWV9JRDsKKyAgICAgIGVudHJ5LT5pZCA9ICppZDsKKyAgICAgIGVudHJ5LT5kYXRhLmlkLmRlc2NyaXB0aW9uID0gd3JpdGVyX3N0cmluZzsKKyAgICB9CisgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoaW5kZXgtPndyaXRlcnMsIHdyaXRlciwgZW50cnkpOworICB9IGVsc2UgeworICAgICppZCA9IGVudHJ5LT5pZDsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2luZGV4X2FkZF9lbnRyeSAoR3N0SW5kZXggKiBpbmRleCwgR3N0SW5kZXhFbnRyeSAqIGVudHJ5KQoreworICBHc3RJbmRleENsYXNzICppY2xhc3M7CisKKyAgaWNsYXNzID0gR1NUX0lOREVYX0dFVF9DTEFTUyAoaW5kZXgpOworCisgIGlmIChpY2xhc3MtPmFkZF9lbnRyeSkgeworICAgIGljbGFzcy0+YWRkX2VudHJ5IChpbmRleCwgZW50cnkpOworICB9CisKKyAgZ19zaWduYWxfZW1pdCAoaW5kZXgsIGdzdF9pbmRleF9zaWduYWxzW0VOVFJZX0FEREVEXSwgMCwgZW50cnkpOworfQorCisvKioKKyAqIGdzdF9pbmRleF9hZGRfYXNzb2NpYXRpb252OgorICogQGluZGV4OiB0aGUgaW5kZXggdG8gYWRkIHRoZSBlbnRyeSB0bworICogQGlkOiB0aGUgaWQgb2YgdGhlIGluZGV4IHdyaXRlcgorICogQGZsYWdzOiBvcHRpbmFsIGZsYWdzIGZvciB0aGlzIGVudHJ5CisgKiBAbjogbnVtYmVyIG9mIGFzc29jaWF0aW9ucworICogQGxpc3Q6IGxpc3Qgb2YgYXNzb2NpYXRpb25zCisgKgorICogQXNzb2NpYXRlIGdpdmVuIGZvcm1hdC92YWx1ZSBwYWlycyB3aXRoIGVhY2ggb3RoZXIuCisgKgorICogUmV0dXJuczogYSBwb2ludGVyIHRvIHRoZSBuZXdseSBhZGRlZCBlbnRyeSBpbiB0aGUgaW5kZXguCisgKi8KK0dzdEluZGV4RW50cnkgKgorZ3N0X2luZGV4X2FkZF9hc3NvY2lhdGlvbnYgKEdzdEluZGV4ICogaW5kZXgsIGdpbnQgaWQsCisgICAgR3N0SW5kZXhBc3NvY2lhdGlvbkZsYWdzIGZsYWdzLCBnaW50IG4sIGNvbnN0IEdzdEluZGV4QXNzb2NpYXRpb24gKiBsaXN0KQoreworICBHc3RJbmRleEVudHJ5ICplbnRyeTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAobiA+IDAsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAobGlzdCAhPSBOVUxMLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19JTkRFWCAoaW5kZXgpLCBOVUxMKTsKKworICBpZiAoIUdTVF9JTkRFWF9JU19XUklUQUJMRSAoaW5kZXgpIHx8IGlkID09IC0xKQorICAgIHJldHVybiBOVUxMOworCisgIGVudHJ5ID0gZ19zbGljZV9uZXcgKEdzdEluZGV4RW50cnkpOworCisgIGVudHJ5LT50eXBlID0gR1NUX0lOREVYX0VOVFJZX0FTU09DSUFUSU9OOworICBlbnRyeS0+aWQgPSBpZDsKKyAgZW50cnktPmRhdGEuYXNzb2MuZmxhZ3MgPSBmbGFnczsKKyAgZW50cnktPmRhdGEuYXNzb2MuYXNzb2NzID0gZ19tZW1kdXAgKGxpc3QsIHNpemVvZiAoR3N0SW5kZXhBc3NvY2lhdGlvbikgKiBuKTsKKyAgZW50cnktPmRhdGEuYXNzb2MubmFzc29jcyA9IG47CisKKyAgZ3N0X2luZGV4X2FkZF9lbnRyeSAoaW5kZXgsIGVudHJ5KTsKKworICByZXR1cm4gZW50cnk7Cit9CisKKyNpZiAwCisvKioKKyAqIGdzdF9pbmRleF9hZGRfYXNzb2NpYXRpb246CisgKiBAaW5kZXg6IHRoZSBpbmRleCB0byBhZGQgdGhlIGVudHJ5IHRvCisgKiBAaWQ6IHRoZSBpZCBvZiB0aGUgaW5kZXggd3JpdGVyCisgKiBAZmxhZ3M6IG9wdGluYWwgZmxhZ3MgZm9yIHRoaXMgZW50cnkKKyAqIEBmb3JtYXQ6IHRoZSBmb3JtYXQgb2YgdGhlIHZhbHVlCisgKiBAdmFsdWU6IHRoZSB2YWx1ZQorICogQC4uLjogb3RoZXIgZm9ybWF0L3ZhbHVlIHBhaXJzIG9yIDAgdG8gZW5kIHRoZSBsaXN0CisgKgorICogQXNzb2NpYXRlIGdpdmVuIGZvcm1hdC92YWx1ZSBwYWlycyB3aXRoIGVhY2ggb3RoZXIuCisgKiBCZSBzdXJlIHRvIHBhc3MgZ2ludDY0IHZhbHVlcyB0byB0aGlzIGZ1bmN0aW9ucyB2YXJhcmdzLAorICogeW91IG1pZ2h0IHdhbnQgdG8gdXNlIGEgZ2ludDY0IGNhc3QgdG8gYmUgc3VyZS4KKyAqCisgKiBSZXR1cm5zOiBhIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGFkZGVkIGVudHJ5IGluIHRoZSBpbmRleC4KKyAqLworR3N0SW5kZXhFbnRyeSAqCitnc3RfaW5kZXhfYWRkX2Fzc29jaWF0aW9uIChHc3RJbmRleCAqIGluZGV4LCBnaW50IGlkLAorICAgIEdzdEluZGV4QXNzb2NpYXRpb25GbGFncyBmbGFncywgR3N0Rm9ybWF0IGZvcm1hdCwgZ2ludDY0IHZhbHVlLCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgR3N0SW5kZXhFbnRyeSAqZW50cnk7CisgIEdzdEluZGV4QXNzb2NpYXRpb24gKmxpc3Q7CisgIGdpbnQgbl9hc3NvY3MgPSAwOworICBHc3RGb3JtYXQgY3VyX2Zvcm1hdDsKKyAgR0FycmF5ICphcnJheTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX0lOREVYIChpbmRleCksIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZm9ybWF0ICE9IDAsIE5VTEwpOworCisgIGlmICghR1NUX0lOREVYX0lTX1dSSVRBQkxFIChpbmRleCkgfHwgaWQgPT0gLTEpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgYXJyYXkgPSBnX2FycmF5X25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKEdzdEluZGV4QXNzb2NpYXRpb24pKTsKKworICB7CisgICAgR3N0SW5kZXhBc3NvY2lhdGlvbiBhOworCisgICAgYS5mb3JtYXQgPSBmb3JtYXQ7CisgICAgYS52YWx1ZSA9IHZhbHVlOworICAgIG5fYXNzb2NzID0gMTsKKyAgICBnX2FycmF5X2FwcGVuZF92YWwgKGFycmF5LCBhKTsKKyAgfQorCisgIHZhX3N0YXJ0IChhcmdzLCB2YWx1ZSk7CisKKyAgd2hpbGUgKChjdXJfZm9ybWF0ID0gdmFfYXJnIChhcmdzLCBHc3RGb3JtYXQpKSkgeworICAgIEdzdEluZGV4QXNzb2NpYXRpb24gYTsKKworICAgIGEuZm9ybWF0ID0gY3VyX2Zvcm1hdDsKKyAgICBhLnZhbHVlID0gdmFfYXJnIChhcmdzLCBnaW50NjQpOworICAgIG5fYXNzb2NzKys7CisgICAgZ19hcnJheV9hcHBlbmRfdmFsIChhcnJheSwgYSk7CisgIH0KKworICB2YV9lbmQgKGFyZ3MpOworCisgIGxpc3QgPSAoR3N0SW5kZXhBc3NvY2lhdGlvbiAqKSBnX2FycmF5X2ZyZWUgKGFycmF5LCBGQUxTRSk7CisKKyAgZW50cnkgPSBnc3RfaW5kZXhfYWRkX2Fzc29jaWF0aW9udiAoaW5kZXgsIGlkLCBmbGFncywgbl9hc3NvY3MsIGxpc3QpOworICBnX2ZyZWUgKGxpc3QpOworCisgIHJldHVybiBlbnRyeTsKK30KKworLyoqCisgKiBnc3RfaW5kZXhfYWRkX29iamVjdDoKKyAqIEBpbmRleDogdGhlIGluZGV4IHRvIGFkZCB0aGUgb2JqZWN0IHRvCisgKiBAaWQ6IHRoZSBpZCBvZiB0aGUgaW5kZXggd3JpdGVyCisgKiBAa2V5OiBhIGtleSBmb3IgdGhlIG9iamVjdAorICogQHR5cGU6IHRoZSBHVHlwZSBvZiB0aGUgb2JqZWN0CisgKiBAb2JqZWN0OiBhIHBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBhZGQKKyAqCisgKiBBZGQgdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgaW5kZXggd2l0aCB0aGUgZ2l2ZW4ga2V5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKyAqCisgKiBSZXR1cm5zOiBhIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGFkZGVkIGVudHJ5IGluIHRoZSBpbmRleC4KKyAqLworR3N0SW5kZXhFbnRyeSAqCitnc3RfaW5kZXhfYWRkX29iamVjdCAoR3N0SW5kZXggKiBpbmRleCwgZ2ludCBpZCwgZ2NoYXIgKiBrZXksCisgICAgR1R5cGUgdHlwZSwgZ3BvaW50ZXIgb2JqZWN0KQoreworICBpZiAoIUdTVF9JTkRFWF9JU19XUklUQUJMRSAoaW5kZXgpIHx8IGlkID09IC0xKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKK3N0YXRpYyBnaW50Citnc3RfaW5kZXhfY29tcGFyZV9mdW5jIChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBpZiAoYSA8IGIpCisgICAgcmV0dXJuIC0xOworICBpZiAoYSA+IGIpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCisvKioKKyAqIGdzdF9pbmRleF9nZXRfYXNzb2NfZW50cnk6CisgKiBAaW5kZXg6IHRoZSBpbmRleCB0byBzZWFyY2gKKyAqIEBpZDogdGhlIGlkIG9mIHRoZSBpbmRleCB3cml0ZXIKKyAqIEBtZXRob2Q6IFRoZSBsb29rdXAgbWV0aG9kIHRvIHVzZQorICogQGZsYWdzOiBGbGFncyBmb3IgdGhlIGVudHJ5CisgKiBAZm9ybWF0OiB0aGUgZm9ybWF0IG9mIHRoZSB2YWx1ZQorICogQHZhbHVlOiB0aGUgdmFsdWUgdG8gZmluZAorICoKKyAqIEZpbmRzIHRoZSBnaXZlbiBmb3JtYXQvdmFsdWUgaW4gdGhlIGluZGV4CisgKgorICogUmV0dXJuczogdGhlIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWUgb3IgTlVMTCBpZiB0aGUKKyAqICAgdmFsdWUgd2FzIG5vdCBmb3VuZC4KKyAqLworR3N0SW5kZXhFbnRyeSAqCitnc3RfaW5kZXhfZ2V0X2Fzc29jX2VudHJ5IChHc3RJbmRleCAqIGluZGV4LCBnaW50IGlkLAorICAgIEdzdEluZGV4TG9va3VwTWV0aG9kIG1ldGhvZCwgR3N0SW5kZXhBc3NvY2lhdGlvbkZsYWdzIGZsYWdzLAorICAgIEdzdEZvcm1hdCBmb3JtYXQsIGdpbnQ2NCB2YWx1ZSkKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19JTkRFWCAoaW5kZXgpLCBOVUxMKTsKKworICBpZiAoaWQgPT0gLTEpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIGdzdF9pbmRleF9nZXRfYXNzb2NfZW50cnlfZnVsbCAoaW5kZXgsIGlkLCBtZXRob2QsIGZsYWdzLCBmb3JtYXQsCisgICAgICB2YWx1ZSwgZ3N0X2luZGV4X2NvbXBhcmVfZnVuYywgTlVMTCk7Cit9CisKKy8qKgorICogZ3N0X2luZGV4X2dldF9hc3NvY19lbnRyeV9mdWxsOgorICogQGluZGV4OiB0aGUgaW5kZXggdG8gc2VhcmNoCisgKiBAaWQ6IHRoZSBpZCBvZiB0aGUgaW5kZXggd3JpdGVyCisgKiBAbWV0aG9kOiBUaGUgbG9va3VwIG1ldGhvZCB0byB1c2UKKyAqIEBmbGFnczogRmxhZ3MgZm9yIHRoZSBlbnRyeQorICogQGZvcm1hdDogdGhlIGZvcm1hdCBvZiB0aGUgdmFsdWUKKyAqIEB2YWx1ZTogdGhlIHZhbHVlIHRvIGZpbmQKKyAqIEBmdW5jOiB0aGUgZnVuY3Rpb24gdXNlZCB0byBjb21wYXJlIGVudHJpZXMKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YSBwYXNzZWQgdG8gdGhlIGNvbXBhcmUgZnVuY3Rpb24KKyAqCisgKiBGaW5kcyB0aGUgZ2l2ZW4gZm9ybWF0L3ZhbHVlIGluIHRoZSBpbmRleCB3aXRoIHRoZSBnaXZlbgorICogY29tcGFyZSBmdW5jdGlvbiBhbmQgdXNlcl9kYXRhLgorICoKKyAqIFJldHVybnM6IHRoZSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlIG9yIE5VTEwgaWYgdGhlCisgKiAgIHZhbHVlIHdhcyBub3QgZm91bmQuCisgKi8KK0dzdEluZGV4RW50cnkgKgorZ3N0X2luZGV4X2dldF9hc3NvY19lbnRyeV9mdWxsIChHc3RJbmRleCAqIGluZGV4LCBnaW50IGlkLAorICAgIEdzdEluZGV4TG9va3VwTWV0aG9kIG1ldGhvZCwgR3N0SW5kZXhBc3NvY2lhdGlvbkZsYWdzIGZsYWdzLAorICAgIEdzdEZvcm1hdCBmb3JtYXQsIGdpbnQ2NCB2YWx1ZSwgR0NvbXBhcmVEYXRhRnVuYyBmdW5jLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdEluZGV4Q2xhc3MgKmljbGFzczsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX0lOREVYIChpbmRleCksIE5VTEwpOworCisgIGlmIChpZCA9PSAtMSkKKyAgICByZXR1cm4gTlVMTDsKKworICBpY2xhc3MgPSBHU1RfSU5ERVhfR0VUX0NMQVNTIChpbmRleCk7CisKKyAgaWYgKGljbGFzcy0+Z2V0X2Fzc29jX2VudHJ5KQorICAgIHJldHVybiBpY2xhc3MtPmdldF9hc3NvY19lbnRyeSAoaW5kZXgsIGlkLCBtZXRob2QsIGZsYWdzLCBmb3JtYXQsIHZhbHVlLAorICAgICAgICBmdW5jLCB1c2VyX2RhdGEpOworCisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIGdzdF9pbmRleF9lbnRyeV9hc3NvY19tYXA6CisgKiBAZW50cnk6IHRoZSBpbmRleCB0byBzZWFyY2gKKyAqIEBmb3JtYXQ6IHRoZSBmb3JtYXQgb2YgdGhlIHZhbHVlIHRoZSBmaW5kCisgKiBAdmFsdWU6IGEgcG9pbnRlciB0byBzdG9yZSB0aGUgdmFsdWUKKyAqCisgKiBHZXRzIGFsdGVybmF0aXZlIGZvcm1hdHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbmRleGVudHJ5LgorICoKKyAqIFJldHVybnM6IFRSVUUgaWYgdGhlcmUgd2FzIGEgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbgorICogZm9ybWF0LgorICovCitnYm9vbGVhbgorZ3N0X2luZGV4X2VudHJ5X2Fzc29jX21hcCAoR3N0SW5kZXhFbnRyeSAqIGVudHJ5LAorICAgIEdzdEZvcm1hdCBmb3JtYXQsIGdpbnQ2NCAqIHZhbHVlKQoreworICBnaW50IGk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGVudHJ5ICE9IE5VTEwsIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHZhbHVlICE9IE5VTEwsIEZBTFNFKTsKKworICBmb3IgKGkgPSAwOyBpIDwgR1NUX0lOREVYX05BU1NPQ1MgKGVudHJ5KTsgaSsrKSB7CisgICAgaWYgKEdTVF9JTkRFWF9BU1NPQ19GT1JNQVQgKGVudHJ5LCBpKSA9PSBmb3JtYXQpIHsKKyAgICAgICp2YWx1ZSA9IEdTVF9JTkRFWF9BU1NPQ19WQUxVRSAoZW50cnksIGkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKK30KZGlmZiAtLWdpdCBhL2dzdC9mbHYvZ3N0aW5kZXguaCBiL2dzdC9mbHYvZ3N0aW5kZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTUxZjljCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2Zsdi9nc3RpbmRleC5oCkBAIC0wLDAgKzEsNDQ4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwMCBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY2hlbGxvLmJlPgorICoKKyAqIGdzdGluZGV4Lmg6IEhlYWRlciBmb3IgR3N0SW5kZXgsIGJhc2UgY2xhc3MgdG8gaGFuZGxlIGVmZmljaWVudAorICogICAgICAgICAgICAgc3RvcmFnZSBvciBjYWNoaW5nIG9mIHNlZWtpbmcgaW5mb3JtYXRpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9JTkRFWF9IX18KKyNkZWZpbmUgX19HU1RfSU5ERVhfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0b2JqZWN0Lmg+CisjaW5jbHVkZSA8Z3N0L2dzdGZvcm1hdC5oPgorI2luY2x1ZGUgPGdzdC9nc3RwbHVnaW5mZWF0dXJlLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9JTkRFWCAgICAgICAgICAgICAgICAgIChnc3RfaW5kZXhfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9JTkRFWChvYmopICAgICAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfSU5ERVgsIEdzdEluZGV4KSkKKyNkZWZpbmUgR1NUX0lTX0lOREVYKG9iaikgICAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9JTkRFWCkpCisjZGVmaW5lIEdTVF9JTkRFWF9DTEFTUyhrbGFzcykgICAgICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9JTkRFWCwgR3N0SW5kZXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19JTkRFWF9DTEFTUyhrbGFzcykgICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9JTkRFWCkpCisjZGVmaW5lIEdTVF9JTkRFWF9HRVRfQ0xBU1Mob2JqKSAgICAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9JTkRFWCwgR3N0SW5kZXhDbGFzcykpCisKKyNkZWZpbmUgR1NUX1RZUEVfSU5ERVhfRU5UUlkgICAgICAgICAgICAoZ3N0X2luZGV4X2VudHJ5X2dldF90eXBlKCkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RJbmRleEVudHJ5IEdzdEluZGV4RW50cnk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0SW5kZXhHcm91cCBHc3RJbmRleEdyb3VwOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEluZGV4IEdzdEluZGV4OwordHlwZWRlZiBzdHJ1Y3QgX0dzdEluZGV4Q2xhc3MgR3N0SW5kZXhDbGFzczsKKworLyoqCisgKiBHc3RJbmRleENlcnRhaW50eToKKyAqIEBHU1RfSU5ERVhfVU5LTk9XTjogYWNjdXJhY3kgaXMgbm90IGtub3duCisgKiBAR1NUX0lOREVYX0NFUlRBSU46IGFjY3VyYWN5IGlzIHBlcmZlY3QKKyAqIEBHU1RfSU5ERVhfRlVaWlk6IGFjY3VyYWN5IGlzIGZ1enp5CisgKgorICogVGhlIGNlcnRhaW50eSBvZiBhIGdyb3VwIGluIHRoZSBpbmRleC4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX0lOREVYX1VOS05PV04sCisgIEdTVF9JTkRFWF9DRVJUQUlOLAorICBHU1RfSU5ERVhfRlVaWlkKK30gR3N0SW5kZXhDZXJ0YWludHk7CisKKy8qKgorICogR3N0SW5kZXhFbnRyeVR5cGU6CisgKiBAR1NUX0lOREVYX0VOVFJZX0lEOiBUaGlzIGVudHJ5IGlzIGFuIGlkIHRoYXQgbWFwcyBhbiBpbmRleCBpZCB0byBpdHMgb3duZXIgb2JqZWN0CisgKiBAR1NUX0lOREVYX0VOVFJZX0FTU09DSUFUSU9OOiBUaGlzIGVudHJ5IGlzIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gZm9ybWF0cworICogQEdTVF9JTkRFWF9FTlRSWV9PQkpFQ1Q6IEFuIG9iamVjdAorICogQEdTVF9JTkRFWF9FTlRSWV9GT1JNQVQ6IEEgZm9ybWF0IGRlZmluaXRpb24KKyAqCisgKiBUaGUgZGlmZmVyZW50IHR5cGVzIG9mIGVudHJpZXMgaW4gdGhlIGluZGV4LgorICovCit0eXBlZGVmIGVudW0geworICBHU1RfSU5ERVhfRU5UUllfSUQsCisgIEdTVF9JTkRFWF9FTlRSWV9BU1NPQ0lBVElPTiwKKyAgR1NUX0lOREVYX0VOVFJZX09CSkVDVCwKKyAgR1NUX0lOREVYX0VOVFJZX0ZPUk1BVAorfSBHc3RJbmRleEVudHJ5VHlwZTsKKworLyoqCisgKiBHc3RJbmRleExvb2t1cE1ldGhvZDoKKyAqIEBHU1RfSU5ERVhfTE9PS1VQX0VYQUNUOiBUaGVyZSBoYXMgdG8gYmUgYW4gZXhhY3QgaW5kZXhlbnRyeSB3aXRoIHRoZSBnaXZlbiBmb3JtYXQvdmFsdWUKKyAqIEBHU1RfSU5ERVhfTE9PS1VQX0JFRk9SRTogVGhlIGV4YWN0IGVudHJ5IG9yIHRoZSBvbmUgYmVmb3JlIGl0CisgKiBAR1NUX0lOREVYX0xPT0tVUF9BRlRFUjogVGhlIGV4YWN0IGVudHJ5IG9yIHRoZSBvbmUgYWZ0ZXIgaXQKKyAqCisgKiBTcGVjaWZ5IHRoZSBtZXRob2QgdG8gZmluZCBhbiBpbmRleCBlbnRyeSBpbiB0aGUgaW5kZXguCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEdTVF9JTkRFWF9MT09LVVBfRVhBQ1QsCisgIEdTVF9JTkRFWF9MT09LVVBfQkVGT1JFLAorICBHU1RfSU5ERVhfTE9PS1VQX0FGVEVSCit9IEdzdEluZGV4TG9va3VwTWV0aG9kOworCisvKioKKyAqIEdTVF9JTkRFWF9OQVNTT0NTOgorICogQGVudHJ5OiBUaGUgZW50cnkgdG8gcXVlcnkKKyAqCisgKiBHZXQgdGhlIG51bWJlciBvZiBhc3NvY2lhdGlvbnMgaW4gdGhlIGVudHJ5LgorICovCisjZGVmaW5lIEdTVF9JTkRFWF9OQVNTT0NTKGVudHJ5KSAgICAgICAgICAgICAgICAoKGVudHJ5KS0+ZGF0YS5hc3NvYy5uYXNzb2NzKQorCisvKioKKyAqIEdTVF9JTkRFWF9BU1NPQ19GTEFHUzoKKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHF1ZXJ5CisgKgorICogIEdldCB0aGUgZmxhZ3MgZm9yIHRoaXMgZW50cnkuCisgKi8KKyNkZWZpbmUgR1NUX0lOREVYX0FTU09DX0ZMQUdTKGVudHJ5KSAgICAgICAgICAgICgoZW50cnkpLT5kYXRhLmFzc29jLmZsYWdzKQorCisvKioKKyAqIEdTVF9JTkRFWF9BU1NPQ19GT1JNQVQ6CisgKiBAZW50cnk6IFRoZSBlbnRyeSB0byBxdWVyeQorICogQGk6IFRoZSBmb3JtYXQgaW5kZXgKKyAqCisgKiBHZXQgdGhlIGktdGggZm9ybWF0IG9mIHRoZSBlbnRyeS4KKyAqLworI2RlZmluZSBHU1RfSU5ERVhfQVNTT0NfRk9STUFUKGVudHJ5LGkpICAgICAgICAgKChlbnRyeSktPmRhdGEuYXNzb2MuYXNzb2NzWyhpKV0uZm9ybWF0KQorCisvKioKKyAqIEdTVF9JTkRFWF9BU1NPQ19WQUxVRToKKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHF1ZXJ5CisgKiBAaTogVGhlIHZhbHVlIGluZGV4CisgKgorICogR2V0IHRoZSBpLXRoIHZhbHVlIG9mIHRoZSBlbnRyeS4KKyAqLworI2RlZmluZSBHU1RfSU5ERVhfQVNTT0NfVkFMVUUoZW50cnksaSkgICAgICAgICAgKChlbnRyeSktPmRhdGEuYXNzb2MuYXNzb2NzWyhpKV0udmFsdWUpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RJbmRleEFzc29jaWF0aW9uIEdzdEluZGV4QXNzb2NpYXRpb247CisKKy8qKgorICogR3N0SW5kZXhBc3NvY2lhdGlvbjoKKyAqIEBmb3JtYXQ6IHRoZSBmb3JtYXQgb2YgdGhlIGFzc29jaWF0aW9uCisgKiBAdmFsdWU6IHRoZSB2YWx1ZSBvZiB0aGUgYXNzb2NpYXRpb24KKyAqCisgKiBBbiBhc3NvY2lhdGlvbiBpbiBhbiBlbnRyeS4KKyAqLworc3RydWN0IF9Hc3RJbmRleEFzc29jaWF0aW9uIHsKKyAgR3N0Rm9ybWF0ICAgICBmb3JtYXQ7CisgIGdpbnQ2NCAgICAgICAgdmFsdWU7Cit9OworCisvKioKKyAqIEdzdEluZGV4QXNzb2NpYXRpb25GbGFnczoKKyAqIEBHU1RfSU5ERVhfQVNTT0NJQVRJT05fRkxBR19OT05FOiBubyBleHRyYSBmbGFncworICogQEdTVF9JTkRFWF9BU1NPQ0lBVElPTl9GTEFHX0tFWV9VTklUOiB0aGUgZW50cnkgbWFya3MgYSBrZXkgdW5pdCwgYSBrZXkgdW5pdCBpcyBvbmUKKyAqICB0aGF0IG1hcmtzIGEgcGxhY2Ugd2hlcmUgb25lIGNhbiByYW5kb21seSBzZWVrIHRvLgorICogQEdTVF9JTkRFWF9BU1NPQ0lBVElPTl9GTEFHX0RFTFRBX1VOSVQ6IHRoZSBlbnRyeSBtYXJrcyBhIGRlbHRhIHVuaXQsIGEgZGVsdGEgdW5pdAorICogIGlzIG9uZSB0aGF0IG1hcmtzIGEgcGxhY2Ugd2hlcmUgb25lIGNhbiByZWxhdGl2ZWx5IHNlZWsgdG8uCisgKiBAR1NUX0lOREVYX0FTU09DSUFUSU9OX0ZMQUdfTEFTVDogZXh0cmEgdXNlciBkZWZpbmVkIGZsYWdzIHNob3VsZCBzdGFydCBoZXJlLgorICoKKyAqIEZsYWdzIGZvciBhbiBhc3NvY2lhdGlvbiBlbnRyeS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX0lOREVYX0FTU09DSUFUSU9OX0ZMQUdfTk9ORSAgICAgICA9IDAsCisgIEdTVF9JTkRFWF9BU1NPQ0lBVElPTl9GTEFHX0tFWV9VTklUICAgPSAoMSA8PCAwKSwKKyAgR1NUX0lOREVYX0FTU09DSUFUSU9OX0ZMQUdfREVMVEFfVU5JVCA9ICgxIDw8IDEpLAorCisgIC8qIG5ldyBmbGFncyBzaG91bGQgc3RhcnQgaGVyZSAqLworICBHU1RfSU5ERVhfQVNTT0NJQVRJT05fRkxBR19MQVNUICAgICA9ICgxIDw8IDgpCit9IEdzdEluZGV4QXNzb2NpYXRpb25GbGFnczsKKworLyoqCisgKiBHU1RfSU5ERVhfRk9STUFUX0ZPUk1BVDoKKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHF1ZXJ5CisgKgorICogR2V0IHRoZSBmb3JtYXQgb2YgdGhlIGZvcm1hdCBlbnRyeQorICovCisjZGVmaW5lIEdTVF9JTkRFWF9GT1JNQVRfRk9STUFUKGVudHJ5KSAgICAgICAgICAoKGVudHJ5KS0+ZGF0YS5mb3JtYXQuZm9ybWF0KQorCisvKioKKyAqIEdTVF9JTkRFWF9GT1JNQVRfS0VZOgorICogQGVudHJ5OiBUaGUgZW50cnkgdG8gcXVlcnkKKyAqCisgKiBHZXQgdGhlIGtleSBvZiB0aGUgZm9ybWF0IGVudHJ5CisgKi8KKyNkZWZpbmUgR1NUX0lOREVYX0ZPUk1BVF9LRVkoZW50cnkpICAgICAgICAgICAgICgoZW50cnkpLT5kYXRhLmZvcm1hdC5rZXkpCisKKy8qKgorICogR1NUX0lOREVYX0lEX0lOVkFMSUQ6CisgKgorICogQ29uc3RhbnQgZm9yIGFuIGludmFsaWQgaW5kZXggaWQKKyAqLworI2RlZmluZSBHU1RfSU5ERVhfSURfSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgKC0xKQorCisvKioKKyAqIEdTVF9JTkRFWF9JRF9ERVNDUklQVElPTjoKKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHF1ZXJ5CisgKgorICogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgaWQgZW50cnkKKyAqLworI2RlZmluZSBHU1RfSU5ERVhfSURfREVTQ1JJUFRJT04oZW50cnkpICAgICAgICAgKChlbnRyeSktPmRhdGEuaWQuZGVzY3JpcHRpb24pCisKKy8qKgorICogR3N0SW5kZXhFbnRyeToKKyAqCisgKiBUaGUgYmFzaWMgZWxlbWVudCBvZiBhbiBpbmRleC4KKyAqLworc3RydWN0IF9Hc3RJbmRleEVudHJ5IHsKKyAgLyo8IHByaXZhdGUgPiovCisgIEdzdEluZGV4RW50cnlUeXBlICAgICAgdHlwZTsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICBpZDsKKworICB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgIGdjaGFyICAgICAgICAgICAgICpkZXNjcmlwdGlvbjsKKyAgICB9IGlkOworICAgIHN0cnVjdCB7CisgICAgICBnaW50ICAgICAgICAgICAgICAgbmFzc29jczsKKyAgICAgIEdzdEluZGV4QXNzb2NpYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICphc3NvY3M7CisgICAgICBHc3RJbmRleEFzc29jaWF0aW9uRmxhZ3MgICAgICBmbGFnczsKKyAgICB9IGFzc29jOworICAgIHN0cnVjdCB7CisgICAgICBnY2hhciAgICAgICAgICAgICAqa2V5OworICAgICAgR1R5cGUgICAgICAgICAgICAgIHR5cGU7CisgICAgICBncG9pbnRlciAgICAgICAgICAgb2JqZWN0OworICAgIH0gb2JqZWN0OworICAgIHN0cnVjdCB7CisgICAgICBHc3RGb3JtYXQgICAgICAgICAgZm9ybWF0OworICAgICAgY29uc3QgZ2NoYXIgICAgICAgKmtleTsKKyAgICB9IGZvcm1hdDsKKyAgfSBkYXRhOworfTsKKworLyoqCisgKiBHc3RJbmRleEdyb3VwOgorICoKKyAqIEEgZ3JvdXAgb2YgcmVsYXRlZCBlbnRyaWVzIGluIGFuIGluZGV4LgorICovCisKK3N0cnVjdCBfR3N0SW5kZXhHcm91cCB7CisgIC8qPCBwcml2YXRlID4qLworICAvKiB1bmlxdWUgSUQgb2YgZ3JvdXAgaW4gaW5kZXggKi8KKyAgZ2ludCBncm91cG51bTsKKworICAvKiBsaXN0IG9mIGVudHJpZXMgKi8KKyAgR0xpc3QgKmVudHJpZXM7CisKKyAgLyogdGhlIGNlcnRhaW50eSBsZXZlbCBvZiB0aGUgZ3JvdXAgKi8KKyAgR3N0SW5kZXhDZXJ0YWludHkgY2VydGFpbnR5OworCisgIC8qIHBlZXIgZ3JvdXAgdGhhdCBjb250YWlucyBtb3JlIGNlcnRhaW4gZW50cmllcyAqLworICBnaW50IHBlZXJncm91cDsKK307CisKKy8qKgorICogR3N0SW5kZXhGaWx0ZXI6CisgKiBAaW5kZXg6IFRoZSBpbmRleCBiZWluZyBxdWVyaWVkCisgKiBAZW50cnk6IFRoZSBlbnRyeSB0byBiZSBhZGRlZC4KKyAqIEB1c2VyX2RhdGE6IFVzZXIgZGF0YSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLgorICoKKyAqIEZ1bmN0aW9uIHRvIGZpbHRlciBvdXQgZW50cmllcyBpbiB0aGUgaW5kZXguCisgKgorICogUmV0dXJuczogVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuICVUUlVFIGlmIHRoZSBlbnRyeSBpcyB0byBiZSBhZGRlZAorICogdG8gdGhlIGluZGV4LCAlRkFMU0Ugb3RoZXJ3aXNlLgorICoKKyAqLwordHlwZWRlZiBnYm9vbGVhbiAgICAgICAgKCpHc3RJbmRleEZpbHRlcikgICAgICAgICAgICAgICAoR3N0SW5kZXggKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0SW5kZXhFbnRyeSAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciB1c2VyX2RhdGEpOworLyoqCisgKiBHc3RJbmRleFJlc29sdmVyTWV0aG9kOgorICogQEdTVF9JTkRFWF9SRVNPTFZFUl9DVVNUT006IFVzZSBhIGN1c3RvbSByZXNvbHZlcgorICogQEdTVF9JTkRFWF9SRVNPTFZFUl9HVFlQRTogUmVzb2x2ZSBiYXNlZCBvbiB0aGUgR1R5cGUgb2YgdGhlIG9iamVjdAorICogQEdTVF9JTkRFWF9SRVNPTFZFUl9QQVRIOiBSZXNvbHZlIG9uIHRoZSBwYXRoIGluIGdyYXBoCisgKgorICogVGhlIG1ldGhvZCB1c2VkIHRvIHJlc29sdmUgaW5kZXggd3JpdGVycworICovCit0eXBlZGVmIGVudW0geworICBHU1RfSU5ERVhfUkVTT0xWRVJfQ1VTVE9NLAorICBHU1RfSU5ERVhfUkVTT0xWRVJfR1RZUEUsCisgIEdTVF9JTkRFWF9SRVNPTFZFUl9QQVRICit9IEdzdEluZGV4UmVzb2x2ZXJNZXRob2Q7CisKKy8qKgorICogR3N0SW5kZXhSZXNvbHZlcjoKKyAqIEBpbmRleDogdGhlIGluZGV4IGJlaW5nIHF1ZXJpZWQuCisgKiBAd3JpdGVyOiBUaGUgb2JqZWN0IHRoYXQgd2FudHMgdG8gd3JpdGUKKyAqIEB3cml0ZXJfc3RyaW5nOiBBIGRlc2NyaXB0aW9uIG9mIHRoZSB3cml0ZXIuCisgKiBAdXNlcl9kYXRhOiB1c2VyX2RhdGEgYXMgcmVnaXN0ZXJlZAorICoKKyAqIEZ1bmN0aW9uIHRvIHJlc29sdmUgaWRzIHRvIHdyaXRlciBkZXNjcmlwdGlvbnMuCisgKgorICogUmV0dXJuczogJVRSVUUgaWYgYW4gaWQgY291bGQgYmUgYXNzaWduZWQgdG8gdGhlIHdyaXRlci4KKyAqLwordHlwZWRlZiBnYm9vbGVhbiAgICAgICAgKCpHc3RJbmRleFJlc29sdmVyKSAgICAgICAgICAgICAoR3N0SW5kZXggKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0T2JqZWN0ICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKndyaXRlcl9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciB1c2VyX2RhdGEpOworCisvKioKKyAqIEdzdEluZGV4RmxhZ3M6CisgKiBAR1NUX0lOREVYX1dSSVRBQkxFOiBUaGUgaW5kZXggaXMgd3JpdGFibGUKKyAqIEBHU1RfSU5ERVhfUkVBREFCTEU6IFRoZSBpbmRleCBpcyByZWFkYWJsZQorICogQEdTVF9JTkRFWF9GTEFHX0xBU1Q6IEZpcnN0IGZsYWcgdGhhdCBjYW4gYmUgdXNlZCBieSBzdWJjbGFzc2VzCisgKgorICogRmxhZ3MgZm9yIHRoaXMgaW5kZXgKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX0lOREVYX1dSSVRBQkxFICAgID0gKEdTVF9PQkpFQ1RfRkxBR19MQVNUIDw8IDApLAorICBHU1RfSU5ERVhfUkVBREFCTEUgICAgPSAoR1NUX09CSkVDVF9GTEFHX0xBU1QgPDwgMSksCisKKyAgR1NUX0lOREVYX0ZMQUdfTEFTVCAgID0gKEdTVF9PQkpFQ1RfRkxBR19MQVNUIDw8IDgpCit9IEdzdEluZGV4RmxhZ3M7CisKKy8qKgorICogR1NUX0lOREVYX0lTX1JFQURBQkxFOgorICogQG9iajogVGhlIGluZGV4IHRvIGNoZWNrCisgKgorICogQ2hlY2sgaWYgdGhlIGluZGV4IGNhbiBiZSByZWFkIGZyb20KKyAqLworI2RlZmluZSBHU1RfSU5ERVhfSVNfUkVBREFCTEUob2JqKSAgICAoR1NUX09CSkVDVF9GTEFHX0lTX1NFVCAob2JqLCBHU1RfSU5ERVhfUkVBREFCTEUpKQorCisvKioKKyAqIEdTVF9JTkRFWF9JU19XUklUQUJMRToKKyAqIEBvYmo6IFRoZSBpbmRleCB0byBjaGVjaworICoKKyAqIENoZWNrIGlmIHRoZSBpbmRleCBjYW4gYmUgd3JpdHRlbiB0bworICovCisjZGVmaW5lIEdTVF9JTkRFWF9JU19XUklUQUJMRShvYmopICAgIChHU1RfT0JKRUNUX0ZMQUdfSVNfU0VUIChvYmosIEdTVF9JTkRFWF9XUklUQUJMRSkpCisKKy8qKgorICogR3N0SW5kZXg6CisgKgorICogT3BhcXVlICNHc3RJbmRleCBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0SW5kZXggeworICBHc3RPYmplY3QgICAgICAgICAgICAgIG9iamVjdDsKKworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgR0xpc3QgICAgICAgICAgICAgICAgICpncm91cHM7CisgIEdzdEluZGV4R3JvdXAgICAgICAgICAqY3VyZ3JvdXA7CisgIGdpbnQgICAgICAgICAgICAgICAgICAgbWF4Z3JvdXA7CisKKyAgR3N0SW5kZXhSZXNvbHZlck1ldGhvZCBtZXRob2Q7CisgIEdzdEluZGV4UmVzb2x2ZXIgICAgICAgcmVzb2x2ZXI7CisgIGdwb2ludGVyICAgICAgICAgICAgICAgcmVzb2x2ZXJfdXNlcl9kYXRhOworICBHRGVzdHJveU5vdGlmeSAgICAgICAgIHJlc29sdmVyX3VzZXJfZGF0YV9kZXN0cm95OworCisgIEdzdEluZGV4RmlsdGVyICAgICAgICAgZmlsdGVyOworICBncG9pbnRlciAgICAgICAgICAgICAgIGZpbHRlcl91c2VyX2RhdGE7CisgIEdEZXN0cm95Tm90aWZ5ICAgICAgICAgZmlsdGVyX3VzZXJfZGF0YV9kZXN0cm95OworCisgIEdIYXNoVGFibGUgICAgICAgICAgICAqd3JpdGVyczsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICBsYXN0X2lkOworCisgIC8qPCBwcml2YXRlID4qLworICBncG9pbnRlciBfZ3N0X3Jlc2VydmVkW0dTVF9QQURESU5HXTsKK307CisKK3N0cnVjdCBfR3N0SW5kZXhDbGFzcyB7CisgIEdzdE9iamVjdENsYXNzIHBhcmVudF9jbGFzczsKKworICAvKjwgcHJvdGVjdGVkID4qLworICBnYm9vbGVhbiAgICAgICgqZ2V0X3dyaXRlcl9pZCkgICAgICAgIChHc3RJbmRleCAqaW5kZXgsIGdpbnQgKmlkLCBnY2hhciAqd3JpdGVyKTsKKworICB2b2lkICAgICAgICAgICgqY29tbWl0KSAgICAgICAgICAgICAgIChHc3RJbmRleCAqaW5kZXgsIGdpbnQgaWQpOworCisgIC8qIGFic3RyYWN0IG1ldGhvZHMgKi8KKyAgdm9pZCAgICAgICAgICAoKmFkZF9lbnRyeSkgICAgICAgICAgICAoR3N0SW5kZXggKmluZGV4LCBHc3RJbmRleEVudHJ5ICplbnRyeSk7CisKKyAgR3N0SW5kZXhFbnRyeSogKCpnZXRfYXNzb2NfZW50cnkpICAgICAoR3N0SW5kZXggKmluZGV4LCBnaW50IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RJbmRleExvb2t1cE1ldGhvZCBtZXRob2QsIEdzdEluZGV4QXNzb2NpYXRpb25GbGFncyBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0Rm9ybWF0IGZvcm1hdCwgZ2ludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ29tcGFyZURhdGFGdW5jIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyIHVzZXJfZGF0YSk7CisgIC8qIHNpZ25hbHMgKi8KKyAgdm9pZCAgICAgICAgICAoKmVudHJ5X2FkZGVkKSAgICAgICAgICAoR3N0SW5kZXggKmluZGV4LCBHc3RJbmRleEVudHJ5ICplbnRyeSk7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIGdwb2ludGVyIF9nc3RfcmVzZXJ2ZWRbR1NUX1BBRERJTkddOworfTsKKworc3RhdGljCitHVHlwZSAgICAgICAgICAgICAgICAgICBnc3RfaW5kZXhfZ2V0X3R5cGUgICAgICAgICAgICAgICh2b2lkKTsKKworI2lmIDAKK0dzdEluZGV4KiAgICAgICAgICAgICAgIGdzdF9pbmRleF9uZXcgICAgICAgICAgICAgICAgICAgKHZvaWQpOworI2VuZGlmCit2b2lkICAgICAgICAgICAgICAgICAgICBnc3RfaW5kZXhfY29tbWl0ICAgICAgICAgICAgICAgIChHc3RJbmRleCAqaW5kZXgsIGdpbnQgaWQpOworCisjaWYgMAorZ2ludCAgICAgICAgICAgICAgICAgICAgZ3N0X2luZGV4X2dldF9ncm91cCAgICAgICAgICAgICAoR3N0SW5kZXggKmluZGV4KTsKK2dpbnQgICAgICAgICAgICAgICAgICAgIGdzdF9pbmRleF9uZXdfZ3JvdXAgICAgICAgICAgICAgKEdzdEluZGV4ICppbmRleCk7CitnYm9vbGVhbiAgICAgICAgICAgICAgICBnc3RfaW5kZXhfc2V0X2dyb3VwICAgICAgICAgICAgIChHc3RJbmRleCAqaW5kZXgsIGdpbnQgZ3JvdXBudW0pOworCit2b2lkICAgICAgICAgICAgICAgICAgICBnc3RfaW5kZXhfc2V0X2NlcnRhaW50eSAgICAgICAgIChHc3RJbmRleCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RJbmRleENlcnRhaW50eSBjZXJ0YWludHkpOworR3N0SW5kZXhDZXJ0YWludHkgICAgICAgZ3N0X2luZGV4X2dldF9jZXJ0YWludHkgICAgICAgICAoR3N0SW5kZXggKmluZGV4KTsKKworc3RhdGljCit2b2lkICAgICAgICAgICAgICAgICAgICBnc3RfaW5kZXhfc2V0X2ZpbHRlciAgICAgICAgICAgIChHc3RJbmRleCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RJbmRleEZpbHRlciBmaWx0ZXIsIGdwb2ludGVyIHVzZXJfZGF0YSk7CitzdGF0aWMKK3ZvaWQgICAgICAgICAgICAgICAgICAgIGdzdF9pbmRleF9zZXRfZmlsdGVyX2Z1bGwgICAgICAgKEdzdEluZGV4ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdEluZGV4RmlsdGVyIGZpbHRlciwgZ3BvaW50ZXIgdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Rlc3Ryb3lOb3RpZnkgdXNlcl9kYXRhX2Rlc3Ryb3kpOworCit2b2lkICAgICAgICAgICAgICAgICAgICBnc3RfaW5kZXhfc2V0X3Jlc29sdmVyICAgICAgICAgIChHc3RJbmRleCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RJbmRleFJlc29sdmVyIHJlc29sdmVyLCBncG9pbnRlciB1c2VyX2RhdGEpOwordm9pZCAgICAgICAgICAgICAgICAgICAgZ3N0X2luZGV4X3NldF9yZXNvbHZlcl9mdWxsICAgICAoR3N0SW5kZXggKmluZGV4LCBHc3RJbmRleFJlc29sdmVyIHJlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Rlc3Ryb3lOb3RpZnkgdXNlcl9kYXRhX2Rlc3Ryb3kpOworI2VuZGlmCisKK3N0YXRpYworZ2Jvb2xlYW4gICAgICAgICAgICAgICAgZ3N0X2luZGV4X2dldF93cml0ZXJfaWQgICAgICAgICAoR3N0SW5kZXggKmluZGV4LCBHc3RPYmplY3QgKndyaXRlciwgZ2ludCAqaWQpOworCisjaWYgMAorR3N0SW5kZXhFbnRyeSogICAgICAgICAgZ3N0X2luZGV4X2FkZF9mb3JtYXQgICAgICAgICAgICAoR3N0SW5kZXggKmluZGV4LCBnaW50IGlkLCBHc3RGb3JtYXQgZm9ybWF0KTsKKyNlbmRpZgorCitzdGF0aWMKK0dzdEluZGV4RW50cnkqICAgICAgICAgIGdzdF9pbmRleF9hZGRfYXNzb2NpYXRpb252ICAgICAgKEdzdEluZGV4ICogaW5kZXgsIGdpbnQgaWQsIEdzdEluZGV4QXNzb2NpYXRpb25GbGFncyBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgbiwgY29uc3QgR3N0SW5kZXhBc3NvY2lhdGlvbiAqIGxpc3QpOworI2lmIDAKK0dzdEluZGV4RW50cnkqICAgICAgICAgIGdzdF9pbmRleF9hZGRfYXNzb2NpYXRpb24gICAgICAgKEdzdEluZGV4ICppbmRleCwgZ2ludCBpZCwgR3N0SW5kZXhBc3NvY2lhdGlvbkZsYWdzIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0Rm9ybWF0IGZvcm1hdCwgZ2ludDY0IHZhbHVlLCAuLi4pCitHc3RJbmRleEVudHJ5KiAgICAgICAgICBnc3RfaW5kZXhfYWRkX29iamVjdCAgICAgICAgICAgIChHc3RJbmRleCAqaW5kZXgsIGdpbnQgaWQsIGdjaGFyICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVHlwZSB0eXBlLCBncG9pbnRlciBvYmplY3QpOworI2VuZGlmCisKK3N0YXRpYworR3N0SW5kZXhFbnRyeSogICAgICAgICAgZ3N0X2luZGV4X2FkZF9pZCAgICAgICAgICAgICAgICAoR3N0SW5kZXggKmluZGV4LCBnaW50IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKmRlc2NyaXB0aW9uKTsKKworc3RhdGljCitHc3RJbmRleEVudHJ5KiAgICAgICAgICBnc3RfaW5kZXhfZ2V0X2Fzc29jX2VudHJ5ICAgICAgIChHc3RJbmRleCAqaW5kZXgsIGdpbnQgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RJbmRleExvb2t1cE1ldGhvZCBtZXRob2QsIEdzdEluZGV4QXNzb2NpYXRpb25GbGFncyBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdEZvcm1hdCBmb3JtYXQsIGdpbnQ2NCB2YWx1ZSk7CitzdGF0aWMKK0dzdEluZGV4RW50cnkqICAgICAgICAgIGdzdF9pbmRleF9nZXRfYXNzb2NfZW50cnlfZnVsbCAgKEdzdEluZGV4ICppbmRleCwgZ2ludCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdEluZGV4TG9va3VwTWV0aG9kIG1ldGhvZCwgR3N0SW5kZXhBc3NvY2lhdGlvbkZsYWdzIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0Rm9ybWF0IGZvcm1hdCwgZ2ludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NvbXBhcmVEYXRhRnVuYyBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKworLyogd29ya2luZyB3aXRoIGluZGV4IGVudHJpZXMgKi8KK3N0YXRpYworR1R5cGUgZ3N0X2luZGV4X2VudHJ5X2dldF90eXBlICh2b2lkKTsKK3N0YXRpYworR3N0SW5kZXhFbnRyeSAqICAgICAgICAgZ3N0X2luZGV4X2VudHJ5X2NvcHkgICAgICAgICAgICAoR3N0SW5kZXhFbnRyeSAqZW50cnkpOworc3RhdGljCit2b2lkICAgICAgICAgICAgICAgICAgICBnc3RfaW5kZXhfZW50cnlfZnJlZSAgICAgICAgICAgIChHc3RJbmRleEVudHJ5ICplbnRyeSk7CitzdGF0aWMKK2dib29sZWFuICAgICAgICAgICAgICAgIGdzdF9pbmRleF9lbnRyeV9hc3NvY19tYXAgICAgICAgKEdzdEluZGV4RW50cnkgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0Rm9ybWF0IGZvcm1hdCwgZ2ludDY0ICp2YWx1ZSk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9JTkRFWF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9mbHYvZ3N0bWVtaW5kZXguYyBiL2dzdC9mbHYvZ3N0bWVtaW5kZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWY5OWMyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2Zsdi9nc3RtZW1pbmRleC5jCkBAIC0wLDAgKzEsNDMyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2RlZmluZSBHU1RfVFlQRV9NRU1fSU5ERVggICAgICAgICAgICAgIFwKKyAgKGdzdF9pbmRleF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX01FTV9JTkRFWChvYmopICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX01FTV9JTkRFWCwgR3N0TWVtSW5kZXgpKQorI2RlZmluZSBHU1RfTUVNX0lOREVYX0NMQVNTKGtsYXNzKSAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9NRU1fSU5ERVgsIEdzdE1lbUluZGV4Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfTUVNX0lOREVYKG9iaikgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfTUVNX0lOREVYKSkKKyNkZWZpbmUgR1NUX0lTX01FTV9JTkRFWF9DTEFTUyhrbGFzcykgICAgIFwKKyAgKEdTVF9UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX01FTV9JTkRFWCkpCisKKy8qCisgKiBPYmplY3QgbW9kZWw6CisgKgorICogQWxsIGVudHJpZXMgYXJlIHNpbXBseSBhZGRlZCB0byBhIEdMaXN0IGZpcnN0LiBUaGVuIHdlIGJ1aWxkCisgKiBhbiBpbmRleCB0byBlYWNoIGVudHJ5IGZvciBlYWNoIGlkL2Zvcm1hdAorICoKKyAqCisgKiAgbWVtaW5kZXgKKyAqICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLi4uCisgKiAgICAhICAgICAgICAgICAgICAgICAgIQorICogICBpZDEgICAgICAgICAgICAgICAgIGlkMgorICogICAgLS0tLS0tLS0tLS0tCisgKiAgICAhICAgICAgICAgICEKKyAqICAgZm9ybWF0MSAgZm9ybWF0MgorICogICAgISAgICAgICAgICAhCisgKiAgIEdUcmVlICAgICAgR1RyZWUKKyAqCisgKgorICogVGhlIG1lbWluZGV4IGNyZWF0ZXMgYSBNZW1JbmRleElkIG9iamVjdCBmb3IgZWFjaCB3cml0ZXIgaWQsIGEKKyAqIEhhc2h0YWJsZSBpcyBrZXB0IHRvIG1hcCB0aGUgaWQgdG8gdGhlIE1lbUluZGV4SWQKKyAqCisgKiBUaGUgTWVtSW5kZXhJZCBrZWVwcyBhIE1lbUluZGV4Rm9ybWF0SW5kZXggZm9yIGVhY2ggZm9ybWF0IHRoZQorICogc3BlY2lmaWMgd3JpdGVyIHdhbnRzIGluZGV4ZWQuCisgKgorICogVGhlIE1lbUluZGV4Rm9ybWF0SW5kZXgga2VlcHMgYWxsIHRoZSB2YWx1ZXMgb2YgdGhlIHBhcnRpY3VsYXIKKyAqIGZvcm1hdCBpbiBhIEdUcmVlLCBUaGUgdmFsdWVzIG9mIHRoZSBHVHJlZSBwb2ludCBiYWNrIHRvIHRoZSBlbnRyeS4KKyAqCisgKiBGaW5kaW5nIGEgdmFsdWUgZm9yIGFuIGlkL2Zvcm1hdCByZXF1aXJlcyBsb2NhdGluZyB0aGUgY29ycmVjdCBHVHJlZSwKKyAqIHRoZW4gZG8gYSBsb29rdXAgaW4gdGhlIFRyZWUgdG8gZ2V0IHRoZSByZXF1aXJlZCB2YWx1ZS4KKyAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RGb3JtYXQgZm9ybWF0OworICBnaW50IG9mZnNldDsKKyAgR1RyZWUgKnRyZWU7Cit9CitHc3RNZW1JbmRleEZvcm1hdEluZGV4OworCit0eXBlZGVmIHN0cnVjdAoreworICBnaW50IGlkOworICBHSGFzaFRhYmxlICpmb3JtYXRfaW5kZXg7Cit9CitHc3RNZW1JbmRleElkOworCit0eXBlZGVmIHN0cnVjdCBfR3N0TWVtSW5kZXggR3N0TWVtSW5kZXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0TWVtSW5kZXhDbGFzcyBHc3RNZW1JbmRleENsYXNzOworCitzdHJ1Y3QgX0dzdE1lbUluZGV4Cit7CisgIEdzdEluZGV4IHBhcmVudDsKKworICBHTGlzdCAqYXNzb2NpYXRpb25zOworCisgIEdIYXNoVGFibGUgKmlkX2luZGV4OworfTsKKworc3RydWN0IF9Hc3RNZW1JbmRleENsYXNzCit7CisgIEdzdEluZGV4Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworc3RhdGljIHZvaWQgZ3N0X21lbV9pbmRleF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9tZW1faW5kZXhfYWRkX2VudHJ5IChHc3RJbmRleCAqIGluZGV4LCBHc3RJbmRleEVudHJ5ICogZW50cnkpOworc3RhdGljIEdzdEluZGV4RW50cnkgKmdzdF9tZW1faW5kZXhfZ2V0X2Fzc29jX2VudHJ5IChHc3RJbmRleCAqIGluZGV4LCBnaW50IGlkLAorICAgIEdzdEluZGV4TG9va3VwTWV0aG9kIG1ldGhvZCwgR3N0SW5kZXhBc3NvY2lhdGlvbkZsYWdzIGZsYWdzLAorICAgIEdzdEZvcm1hdCBmb3JtYXQsIGdpbnQ2NCB2YWx1ZSwgR0NvbXBhcmVEYXRhRnVuYyBmdW5jLCBncG9pbnRlciB1c2VyX2RhdGEpOworCisjZGVmaW5lIENMQVNTKG1lbV9pbmRleCkgIEdTVF9NRU1fSU5ERVhfQ0xBU1MgKEdfT0JKRUNUX0dFVF9DTEFTUyAobWVtX2luZGV4KSkKKworc3RhdGljIEdUeXBlIGdzdF9tZW1faW5kZXhfZ2V0X3R5cGUgKHZvaWQpOworCit0eXBlZGVmIEdzdE1lbUluZGV4IEdzdEZsdkRlbXV4TWVtSW5kZXg7Cit0eXBlZGVmIEdzdE1lbUluZGV4Q2xhc3MgR3N0Rmx2RGVtdXhNZW1JbmRleENsYXNzOworR19ERUZJTkVfVFlQRSAoR3N0Rmx2RGVtdXhNZW1JbmRleCwgZ3N0X21lbV9pbmRleCwgR1NUX1RZUEVfSU5ERVgpOworCitzdGF0aWMgdm9pZAorZ3N0X21lbV9pbmRleF9jbGFzc19pbml0IChHc3RNZW1JbmRleENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0SW5kZXhDbGFzcyAqZ3N0aW5kZXhfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGluZGV4X2NsYXNzID0gKEdzdEluZGV4Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfbWVtX2luZGV4X2ZpbmFsaXplOworCisgIGdzdGluZGV4X2NsYXNzLT5hZGRfZW50cnkgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21lbV9pbmRleF9hZGRfZW50cnkpOworICBnc3RpbmRleF9jbGFzcy0+Z2V0X2Fzc29jX2VudHJ5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbWVtX2luZGV4X2dldF9hc3NvY19lbnRyeSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWVtX2luZGV4X2luaXQgKEdzdE1lbUluZGV4ICogaW5kZXgpCit7CisgIEdTVF9ERUJVRyAoImNyZWF0ZWQgbmV3IG1lbSBpbmRleCIpOworCisgIGluZGV4LT5hc3NvY2lhdGlvbnMgPSBOVUxMOworICBpbmRleC0+aWRfaW5kZXggPSBnX2hhc2hfdGFibGVfbmV3IChnX2ludF9oYXNoLCBnX2ludF9lcXVhbCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWVtX2luZGV4X2ZyZWVfZm9ybWF0IChncG9pbnRlciBrZXksIGdwb2ludGVyIHZhbHVlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdE1lbUluZGV4Rm9ybWF0SW5kZXggKmluZGV4ID0gKEdzdE1lbUluZGV4Rm9ybWF0SW5kZXggKikgdmFsdWU7CisKKyAgaWYgKGluZGV4LT50cmVlKSB7CisgICAgZ190cmVlX2Rlc3Ryb3kgKGluZGV4LT50cmVlKTsKKyAgfQorCisgIGdfc2xpY2VfZnJlZSAoR3N0TWVtSW5kZXhGb3JtYXRJbmRleCwgaW5kZXgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X21lbV9pbmRleF9mcmVlX2lkIChncG9pbnRlciBrZXksIGdwb2ludGVyIHZhbHVlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdE1lbUluZGV4SWQgKmlkX2luZGV4ID0gKEdzdE1lbUluZGV4SWQgKikgdmFsdWU7CisKKyAgaWYgKGlkX2luZGV4LT5mb3JtYXRfaW5kZXgpIHsKKyAgICBnX2hhc2hfdGFibGVfZm9yZWFjaCAoaWRfaW5kZXgtPmZvcm1hdF9pbmRleCwgZ3N0X21lbV9pbmRleF9mcmVlX2Zvcm1hdCwKKyAgICAgICAgTlVMTCk7CisgICAgZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKGlkX2luZGV4LT5mb3JtYXRfaW5kZXgpOworICAgIGlkX2luZGV4LT5mb3JtYXRfaW5kZXggPSBOVUxMOworICB9CisKKyAgZ19zbGljZV9mcmVlIChHc3RNZW1JbmRleElkLCBpZF9pbmRleCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWVtX2luZGV4X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RNZW1JbmRleCAqbWVtaW5kZXggPSBHU1RfTUVNX0lOREVYIChvYmplY3QpOworCisgIC8qIERlbGV0ZSB0aGUgdHJlZXMgcmVmZXJlbmNpbmcgdGhlIGFzc29jaWF0aW9ucyBmaXJzdCAqLworICBpZiAobWVtaW5kZXgtPmlkX2luZGV4KSB7CisgICAgZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKG1lbWluZGV4LT5pZF9pbmRleCwgZ3N0X21lbV9pbmRleF9mcmVlX2lkLCBOVUxMKTsKKyAgICBnX2hhc2hfdGFibGVfZGVzdHJveSAobWVtaW5kZXgtPmlkX2luZGV4KTsKKyAgICBtZW1pbmRleC0+aWRfaW5kZXggPSBOVUxMOworICB9CisKKyAgLyogVGhlbiBkZWxldGUgdGhlIGFzc29jaWF0aW9ucyB0aGVtc2VsdmVzICovCisgIGlmIChtZW1pbmRleC0+YXNzb2NpYXRpb25zKSB7CisgICAgZ19saXN0X2ZvcmVhY2ggKG1lbWluZGV4LT5hc3NvY2lhdGlvbnMsIChHRnVuYykgZ3N0X2luZGV4X2VudHJ5X2ZyZWUsIE5VTEwpOworICAgIGdfbGlzdF9mcmVlIChtZW1pbmRleC0+YXNzb2NpYXRpb25zKTsKKyAgICBtZW1pbmRleC0+YXNzb2NpYXRpb25zID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChnc3RfbWVtX2luZGV4X3BhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X21lbV9pbmRleF9hZGRfaWQgKEdzdEluZGV4ICogaW5kZXgsIEdzdEluZGV4RW50cnkgKiBlbnRyeSkKK3sKKyAgR3N0TWVtSW5kZXggKm1lbWluZGV4ID0gR1NUX01FTV9JTkRFWCAoaW5kZXgpOworICBHc3RNZW1JbmRleElkICppZF9pbmRleDsKKworICBpZF9pbmRleCA9IGdfaGFzaF90YWJsZV9sb29rdXAgKG1lbWluZGV4LT5pZF9pbmRleCwgJmVudHJ5LT5pZCk7CisKKyAgaWYgKCFpZF9pbmRleCkgeworICAgIGlkX2luZGV4ID0gZ19zbGljZV9uZXcwIChHc3RNZW1JbmRleElkKTsKKworICAgIGlkX2luZGV4LT5pZCA9IGVudHJ5LT5pZDsKKyAgICBpZF9pbmRleC0+Zm9ybWF0X2luZGV4ID0gZ19oYXNoX3RhYmxlX25ldyAoZ19pbnRfaGFzaCwgZ19pbnRfZXF1YWwpOworICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKG1lbWluZGV4LT5pZF9pbmRleCwgJmlkX2luZGV4LT5pZCwgaWRfaW5kZXgpOworICB9Cit9CisKK3N0YXRpYyBnaW50CittZW1faW5kZXhfY29tcGFyZSAoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0TWVtSW5kZXhGb3JtYXRJbmRleCAqaW5kZXggPSB1c2VyX2RhdGE7CisgIGdpbnQ2NCB2YWwxLCB2YWwyOworICBnaW50NjQgZGlmZjsKKworICB2YWwxID0gR1NUX0lOREVYX0FTU09DX1ZBTFVFICgoKEdzdEluZGV4RW50cnkgKikgYSksIGluZGV4LT5vZmZzZXQpOworICB2YWwyID0gR1NUX0lOREVYX0FTU09DX1ZBTFVFICgoKEdzdEluZGV4RW50cnkgKikgYiksIGluZGV4LT5vZmZzZXQpOworCisgIGRpZmYgPSAodmFsMiAtIHZhbDEpOworCisgIHJldHVybiAoZGlmZiA9PSAwID8gMCA6IChkaWZmID4gMCA/IDEgOiAtMSkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X21lbV9pbmRleF9pbmRleF9mb3JtYXQgKEdzdE1lbUluZGV4SWQgKiBpZF9pbmRleCwgR3N0SW5kZXhFbnRyeSAqIGVudHJ5LAorICAgIGdpbnQgYXNzb2MpCit7CisgIEdzdE1lbUluZGV4Rm9ybWF0SW5kZXggKmluZGV4OworICBHc3RGb3JtYXQgKmZvcm1hdDsKKworICBmb3JtYXQgPSAmR1NUX0lOREVYX0FTU09DX0ZPUk1BVCAoZW50cnksIGFzc29jKTsKKworICBpbmRleCA9IGdfaGFzaF90YWJsZV9sb29rdXAgKGlkX2luZGV4LT5mb3JtYXRfaW5kZXgsIGZvcm1hdCk7CisKKyAgaWYgKCFpbmRleCkgeworICAgIGluZGV4ID0gZ19zbGljZV9uZXcwIChHc3RNZW1JbmRleEZvcm1hdEluZGV4KTsKKworICAgIGluZGV4LT5mb3JtYXQgPSAqZm9ybWF0OworICAgIGluZGV4LT5vZmZzZXQgPSBhc3NvYzsKKyAgICBpbmRleC0+dHJlZSA9IGdfdHJlZV9uZXdfd2l0aF9kYXRhIChtZW1faW5kZXhfY29tcGFyZSwgaW5kZXgpOworCisgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoaWRfaW5kZXgtPmZvcm1hdF9pbmRleCwgJmluZGV4LT5mb3JtYXQsIGluZGV4KTsKKyAgfQorCisgIGdfdHJlZV9pbnNlcnQgKGluZGV4LT50cmVlLCBlbnRyeSwgZW50cnkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X21lbV9pbmRleF9hZGRfYXNzb2NpYXRpb24gKEdzdEluZGV4ICogaW5kZXgsIEdzdEluZGV4RW50cnkgKiBlbnRyeSkKK3sKKyAgR3N0TWVtSW5kZXggKm1lbWluZGV4ID0gR1NUX01FTV9JTkRFWCAoaW5kZXgpOworICBHc3RNZW1JbmRleElkICppZF9pbmRleDsKKworICBtZW1pbmRleC0+YXNzb2NpYXRpb25zID0gZ19saXN0X3ByZXBlbmQgKG1lbWluZGV4LT5hc3NvY2lhdGlvbnMsIGVudHJ5KTsKKworICBpZF9pbmRleCA9IGdfaGFzaF90YWJsZV9sb29rdXAgKG1lbWluZGV4LT5pZF9pbmRleCwgJmVudHJ5LT5pZCk7CisgIGlmIChpZF9pbmRleCkgeworICAgIGdpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBHU1RfSU5ERVhfTkFTU09DUyAoZW50cnkpOyBpKyspIHsKKyAgICAgIGdzdF9tZW1faW5kZXhfaW5kZXhfZm9ybWF0IChpZF9pbmRleCwgZW50cnksIGkpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X21lbV9pbmRleF9hZGRfb2JqZWN0IChHc3RJbmRleCAqIGluZGV4LCBHc3RJbmRleEVudHJ5ICogZW50cnkpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWVtX2luZGV4X2FkZF9mb3JtYXQgKEdzdEluZGV4ICogaW5kZXgsIEdzdEluZGV4RW50cnkgKiBlbnRyeSkKK3sKK30KKworc3RhdGljIHZvaWQKK2dzdF9tZW1faW5kZXhfYWRkX2VudHJ5IChHc3RJbmRleCAqIGluZGV4LCBHc3RJbmRleEVudHJ5ICogZW50cnkpCit7CisgIEdTVF9MT0dfT0JKRUNUIChpbmRleCwgImFkZGVkIHRoaXMgZW50cnkiKTsKKworICBzd2l0Y2ggKGVudHJ5LT50eXBlKSB7CisgICAgY2FzZSBHU1RfSU5ERVhfRU5UUllfSUQ6CisgICAgICBnc3RfbWVtX2luZGV4X2FkZF9pZCAoaW5kZXgsIGVudHJ5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0lOREVYX0VOVFJZX0FTU09DSUFUSU9OOgorICAgICAgZ3N0X21lbV9pbmRleF9hZGRfYXNzb2NpYXRpb24gKGluZGV4LCBlbnRyeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9JTkRFWF9FTlRSWV9PQkpFQ1Q6CisgICAgICBnc3RfbWVtX2luZGV4X2FkZF9vYmplY3QgKGluZGV4LCBlbnRyeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9JTkRFWF9FTlRSWV9GT1JNQVQ6CisgICAgICBnc3RfbWVtX2luZGV4X2FkZF9mb3JtYXQgKGluZGV4LCBlbnRyeSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ2ludDY0IHZhbHVlOworICBHc3RNZW1JbmRleEZvcm1hdEluZGV4ICppbmRleDsKKyAgZ2Jvb2xlYW4gZXhhY3Q7CisgIEdzdEluZGV4RW50cnkgKmxvd2VyOworICBnaW50NjQgbG93X2RpZmY7CisgIEdzdEluZGV4RW50cnkgKmhpZ2hlcjsKKyAgZ2ludDY0IGhpZ2hfZGlmZjsKK30KK0dzdE1lbUluZGV4U2VhcmNoRGF0YTsKKworc3RhdGljIGdpbnQKK21lbV9pbmRleF9zZWFyY2ggKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKQoreworICBHc3RNZW1JbmRleFNlYXJjaERhdGEgKmRhdGEgPSAoR3N0TWVtSW5kZXhTZWFyY2hEYXRhICopIGI7CisgIEdzdE1lbUluZGV4Rm9ybWF0SW5kZXggKmluZGV4ID0gZGF0YS0+aW5kZXg7CisgIGdpbnQ2NCB2YWwxLCB2YWwyOworICBnaW50NjQgZGlmZjsKKworICB2YWwxID0gR1NUX0lOREVYX0FTU09DX1ZBTFVFICgoKEdzdEluZGV4RW50cnkgKikgYSksIGluZGV4LT5vZmZzZXQpOworICB2YWwyID0gZGF0YS0+dmFsdWU7CisKKyAgZGlmZiA9ICh2YWwxIC0gdmFsMik7CisgIGlmIChkaWZmID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgLyogZXhhY3QgbWF0Y2hpbmcsIGRvbid0IHVwZGF0ZSBsb3cvaGlnaCAqLworICBpZiAoZGF0YS0+ZXhhY3QpCisgICAgcmV0dXJuIChkaWZmID4gMCA/IDEgOiAtMSk7CisKKyAgaWYgKGRpZmYgPCAwKSB7CisgICAgaWYgKGRpZmYgPiBkYXRhLT5sb3dfZGlmZikgeworICAgICAgZGF0YS0+bG93X2RpZmYgPSBkaWZmOworICAgICAgZGF0YS0+bG93ZXIgPSAoR3N0SW5kZXhFbnRyeSAqKSBhOworICAgIH0KKyAgICBkaWZmID0gLTE7CisgIH0gZWxzZSB7CisgICAgaWYgKGRpZmYgPCBkYXRhLT5oaWdoX2RpZmYpIHsKKyAgICAgIGRhdGEtPmhpZ2hfZGlmZiA9IGRpZmY7CisgICAgICBkYXRhLT5oaWdoZXIgPSAoR3N0SW5kZXhFbnRyeSAqKSBhOworICAgIH0KKyAgICBkaWZmID0gMTsKKyAgfQorCisgIHJldHVybiBkaWZmOworfQorCitzdGF0aWMgR3N0SW5kZXhFbnRyeSAqCitnc3RfbWVtX2luZGV4X2dldF9hc3NvY19lbnRyeSAoR3N0SW5kZXggKiBpbmRleCwgZ2ludCBpZCwKKyAgICBHc3RJbmRleExvb2t1cE1ldGhvZCBtZXRob2QsCisgICAgR3N0SW5kZXhBc3NvY2lhdGlvbkZsYWdzIGZsYWdzLAorICAgIEdzdEZvcm1hdCBmb3JtYXQsIGdpbnQ2NCB2YWx1ZSwgR0NvbXBhcmVEYXRhRnVuYyBmdW5jLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdE1lbUluZGV4ICptZW1pbmRleCA9IEdTVF9NRU1fSU5ERVggKGluZGV4KTsKKyAgR3N0TWVtSW5kZXhJZCAqaWRfaW5kZXg7CisgIEdzdE1lbUluZGV4Rm9ybWF0SW5kZXggKmZvcm1hdF9pbmRleDsKKyAgR3N0SW5kZXhFbnRyeSAqZW50cnk7CisgIEdzdE1lbUluZGV4U2VhcmNoRGF0YSBkYXRhOworCisgIGlkX2luZGV4ID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAobWVtaW5kZXgtPmlkX2luZGV4LCAmaWQpOworICBpZiAoIWlkX2luZGV4KQorICAgIHJldHVybiBOVUxMOworCisgIGZvcm1hdF9pbmRleCA9IGdfaGFzaF90YWJsZV9sb29rdXAgKGlkX2luZGV4LT5mb3JtYXRfaW5kZXgsICZmb3JtYXQpOworICBpZiAoIWZvcm1hdF9pbmRleCkKKyAgICByZXR1cm4gTlVMTDsKKworICBkYXRhLnZhbHVlID0gdmFsdWU7CisgIGRhdGEuaW5kZXggPSBmb3JtYXRfaW5kZXg7CisgIGRhdGEuZXhhY3QgPSAobWV0aG9kID09IEdTVF9JTkRFWF9MT09LVVBfRVhBQ1QpOworCisgIC8qIHNldHVwIGRhdGEgZm9yIGxvdy9oaWdoIGNoZWNrcyBpZiB3ZSBhcmUgbm90IGxvb2tpbmcKKyAgICogZm9yIGFuIGV4YWN0IG1hdGNoICovCisgIGlmICghZGF0YS5leGFjdCkgeworICAgIGRhdGEubG93X2RpZmYgPSBHX01JTklOVDY0OworICAgIGRhdGEubG93ZXIgPSBOVUxMOworICAgIGRhdGEuaGlnaF9kaWZmID0gR19NQVhJTlQ2NDsKKyAgICBkYXRhLmhpZ2hlciA9IE5VTEw7CisgIH0KKworICBlbnRyeSA9IGdfdHJlZV9zZWFyY2ggKGZvcm1hdF9pbmRleC0+dHJlZSwgbWVtX2luZGV4X3NlYXJjaCwgJmRhdGEpOworCisgIC8qIGdldCB0aGUgbG93L2hpZ2ggdmFsdWVzIGlmIHdlJ3JlIG5vdCBleGFjdCAqLworICBpZiAoZW50cnkgPT0gTlVMTCAmJiAhZGF0YS5leGFjdCkgeworICAgIGlmIChtZXRob2QgPT0gR1NUX0lOREVYX0xPT0tVUF9CRUZPUkUpCisgICAgICBlbnRyeSA9IGRhdGEubG93ZXI7CisgICAgZWxzZSBpZiAobWV0aG9kID09IEdTVF9JTkRFWF9MT09LVVBfQUZURVIpIHsKKyAgICAgIGVudHJ5ID0gZGF0YS5oaWdoZXI7CisgICAgfQorICB9CisKKyAgaWYgKGVudHJ5ICYmICgoR1NUX0lOREVYX0FTU09DX0ZMQUdTIChlbnRyeSkgJiBmbGFncykgIT0gZmxhZ3MpKSB7CisgICAgaWYgKG1ldGhvZCAhPSBHU1RfSU5ERVhfTE9PS1VQX0VYQUNUKSB7CisgICAgICBHTGlzdCAqbF9lbnRyeSA9IGdfbGlzdF9maW5kIChtZW1pbmRleC0+YXNzb2NpYXRpb25zLCBlbnRyeSk7CisKKyAgICAgIGVudHJ5ID0gTlVMTDsKKworICAgICAgd2hpbGUgKGxfZW50cnkpIHsKKyAgICAgICAgZW50cnkgPSAoR3N0SW5kZXhFbnRyeSAqKSBsX2VudHJ5LT5kYXRhOworCisgICAgICAgIGlmIChlbnRyeS0+aWQgPT0gaWQgJiYgKEdTVF9JTkRFWF9BU1NPQ19GTEFHUyAoZW50cnkpICYgZmxhZ3MpID09IGZsYWdzKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChtZXRob2QgPT0gR1NUX0lOREVYX0xPT0tVUF9CRUZPUkUpCisgICAgICAgICAgbF9lbnRyeSA9IGdfbGlzdF9uZXh0IChsX2VudHJ5KTsKKyAgICAgICAgZWxzZSBpZiAobWV0aG9kID09IEdTVF9JTkRFWF9MT09LVVBfQUZURVIpIHsKKyAgICAgICAgICBsX2VudHJ5ID0gZ19saXN0X3ByZXZpb3VzIChsX2VudHJ5KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBlbnRyeSA9IE5VTEw7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGVudHJ5OworfQorCisjaWYgMAorZ2Jvb2xlYW4KK2dzdF9tZW1faW5kZXhfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR3N0SW5kZXhGYWN0b3J5ICpmYWN0b3J5OworCisgIGZhY3RvcnkgPSBnc3RfaW5kZXhfZmFjdG9yeV9uZXcgKCJtZW1pbmRleCIsCisgICAgICAiQSBpbmRleCB0aGF0IHN0b3JlcyBlbnRyaWVzIGluIG1lbW9yeSIsIGdzdF9tZW1faW5kZXhfZ2V0X3R5cGUgKCkpOworCisgIGlmIChmYWN0b3J5ID09IE5VTEwpIHsKKyAgICBnX3dhcm5pbmcgKCJmYWlsZWQgdG8gY3JlYXRlIG1lbWluZGV4IGZhY3RvcnkiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBHU1RfUExVR0lOX0ZFQVRVUkUgKGZhY3RvcnkpLT5wbHVnaW5fbmFtZSA9IHBsdWdpbi0+ZGVzYy5uYW1lOworICBHU1RfUExVR0lOX0ZFQVRVUkUgKGZhY3RvcnkpLT5sb2FkZWQgPSBUUlVFOworCisgIGdzdF9yZWdpc3RyeV9hZGRfZmVhdHVyZSAoZ3N0X3JlZ2lzdHJ5X2dldF9kZWZhdWx0ICgpLAorICAgICAgR1NUX1BMVUdJTl9GRUFUVVJFIChmYWN0b3J5KSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9mbHYvbWVzb24uYnVpbGQgYi9nc3QvZmx2L21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MTkwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZmx2L21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsOCBAQAorZ3N0Zmx2ID0gbGlicmFyeSgnZ3N0Zmx2JywKKyAgJ2dzdGZsdmRlbXV4LmMnLCAnZ3N0Zmx2bXV4LmMnLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdHBidXRpbHNfZGVwLCBnc3R2aWRlb19kZXAsIGdzdHRhZ19kZXAsIGdzdGF1ZGlvX2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvZmx4L01ha2VmaWxlLmFtIGIvZ3N0L2ZseC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODkzNGVhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ZseC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDggQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGZseGRlYy5sYQorCitsaWJnc3RmbHhkZWNfbGFfU09VUkNFUyA9IGdzdGZseGRlYy5jIGZseF9jb2xvci5jCitsaWJnc3RmbHhkZWNfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdGZseGRlY19sYV9MSUJBREQgPSAkKEdTVF9CQVNFX0xJQlMpICAkKEdTVF9MSUJTKQorbGliZ3N0Zmx4ZGVjX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBmbHhfZm10LmggZmx4X2NvbG9yLmggZ3N0Zmx4ZGVjLmgKZGlmZiAtLWdpdCBhL2dzdC9mbHgvZmx4X2NvbG9yLmMgYi9nc3QvZmx4L2ZseF9jb2xvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNTgxMzUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZmx4L2ZseF9jb2xvci5jCkBAIC0wLDAgKzEsMTE3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAdGVtcGxlLWJhcHRpc3QuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImZseF9jb2xvci5oIgorCitGbHhDb2xvclNwYWNlQ29udmVydGVyICoKK2ZseF9jb2xvcnNwYWNlX2NvbnZlcnRlcl9uZXcgKGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0KQoreworICBGbHhDb2xvclNwYWNlQ29udmVydGVyICpuZXcgPSBnX21hbGxvYyAoc2l6ZW9mIChGbHhDb2xvclNwYWNlQ29udmVydGVyKSk7CisKKyAgbmV3LT53aWR0aCA9IHdpZHRoOworICBuZXctPmhlaWdodCA9IGhlaWdodDsKKworICBtZW1zZXQgKG5ldy0+cGFsdmVjLCAwLCBzaXplb2YgKG5ldy0+cGFsdmVjKSk7CisgIHJldHVybiBuZXc7Cit9CisKK3ZvaWQKK2ZseF9jb2xvcnNwYWNlX2NvbnZlcnRlcl9kZXN0cm95IChGbHhDb2xvclNwYWNlQ29udmVydGVyICogZmx4cGFsKQoreworICBnX3JldHVybl9pZl9mYWlsIChmbHhwYWwgIT0gTlVMTCk7CisKKyAgZ19mcmVlIChmbHhwYWwpOworfQorCit2b2lkCitmbHhfY29sb3JzcGFjZV9jb252ZXJ0IChGbHhDb2xvclNwYWNlQ29udmVydGVyICogZmx4cGFsLCBndWNoYXIgKiBzcmMsCisgICAgZ3VjaGFyICogZGVzdCkKK3sKKyAgZ3VpbnQgc2l6ZSwgY29sOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKGZseHBhbCAhPSBOVUxMKTsKKyAgZ19yZXR1cm5faWZfZmFpbCAoc3JjICE9IGRlc3QpOworCisKKyAgc2l6ZSA9IGZseHBhbC0+d2lkdGggKiBmbHhwYWwtPmhlaWdodDsKKworICB3aGlsZSAoc2l6ZS0tKSB7CisgICAgY29sID0gKCpzcmMrKyAqIDMpOworCisjaWYgR19CWVRFX09SREVSID09IEdfQklHX0VORElBTgorICAgICpkZXN0KysgPSAwOworICAgICpkZXN0KysgPSBmbHhwYWwtPnBhbHZlY1tjb2xdOworICAgICpkZXN0KysgPSBmbHhwYWwtPnBhbHZlY1tjb2wgKyAxXTsKKyAgICAqZGVzdCsrID0gZmx4cGFsLT5wYWx2ZWNbY29sICsgMl07CisjZWxzZQorICAgICpkZXN0KysgPSBmbHhwYWwtPnBhbHZlY1tjb2wgKyAyXTsKKyAgICAqZGVzdCsrID0gZmx4cGFsLT5wYWx2ZWNbY29sICsgMV07CisgICAgKmRlc3QrKyA9IGZseHBhbC0+cGFsdmVjW2NvbF07CisgICAgKmRlc3QrKyA9IDA7CisjZW5kaWYKKyAgfQorCit9CisKKwordm9pZAorZmx4X3NldF9wYWxldHRlX3ZlY3RvciAoRmx4Q29sb3JTcGFjZUNvbnZlcnRlciAqIGZseHBhbCwgZ3VpbnQgc3RhcnQsIGd1aW50IG51bSwKKyAgICBndWNoYXIgKiBuZXdwYWwsIGdpbnQgc2NhbGUpCit7CisgIGd1aW50IGdyYWI7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoZmx4cGFsICE9IE5VTEwpOworICBnX3JldHVybl9pZl9mYWlsIChzdGFydCA8IDB4MTAwKTsKKworICBncmFiID0gKChzdGFydCArIG51bSkgPiAweDEwMCA/IDB4MTAwIC0gc3RhcnQgOiBudW0pOworCisgIGlmIChzY2FsZSkgeworICAgIGdpbnQgaSA9IDA7CisKKyAgICBzdGFydCAqPSAzOworICAgIHdoaWxlIChncmFiKSB7CisgICAgICBmbHhwYWwtPnBhbHZlY1tzdGFydCsrXSA9IG5ld3BhbFtpKytdIDw8IHNjYWxlOworICAgICAgZmx4cGFsLT5wYWx2ZWNbc3RhcnQrK10gPSBuZXdwYWxbaSsrXSA8PCBzY2FsZTsKKyAgICAgIGZseHBhbC0+cGFsdmVjW3N0YXJ0KytdID0gbmV3cGFsW2krK10gPDwgc2NhbGU7CisgICAgICBncmFiLS07CisgICAgfQorICB9IGVsc2UgeworICAgIG1lbWNweSAoJmZseHBhbC0+cGFsdmVjW3N0YXJ0ICogM10sIG5ld3BhbCwgZ3JhYiAqIDMpOworICB9Cit9CisKK3ZvaWQKK2ZseF9zZXRfY29sb3IgKEZseENvbG9yU3BhY2VDb252ZXJ0ZXIgKiBmbHhwYWwsIGd1aW50IGNvbHIsIGd1aW50IHJlZCwKKyAgICBndWludCBncmVlbiwgZ3VpbnQgYmx1ZSwgZ2ludCBzY2FsZSkKK3sKKworICBnX3JldHVybl9pZl9mYWlsIChmbHhwYWwgIT0gTlVMTCk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKGNvbHIgPCAweDEwMCk7CisKKyAgZmx4cGFsLT5wYWx2ZWNbKGNvbHIgKiAzKV0gPSByZWQgPDwgc2NhbGU7CisgIGZseHBhbC0+cGFsdmVjWyhjb2xyICogMykgKyAxXSA9IGdyZWVuIDw8IHNjYWxlOworICBmbHhwYWwtPnBhbHZlY1soY29sciAqIDMpICsgMl0gPSBibHVlIDw8IHNjYWxlOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2ZseC9mbHhfY29sb3IuaCBiL2dzdC9mbHgvZmx4X2NvbG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzNmFiNwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9mbHgvZmx4X2NvbG9yLmgKQEAgLTAsMCArMSw1MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19GTFhfQ09MT1JfSF9fCisjZGVmaW5lIF9fRkxYX0NPTE9SX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgZW51bSB7CisgIEZMWF9DT0xPUlNQQUNFX1JHQjgsCisgIEZMWF9DT0xPUlNQQUNFX1JHQjMyLAorfSBGbHhDb2xvclNwYWNlVHlwZTsKKworCit0eXBlZGVmIHN0cnVjdCBfRmx4Q29sb3JTcGFjZUNvbnZlcnRlciBGbHhDb2xvclNwYWNlQ29udmVydGVyOworCitzdHJ1Y3QgX0ZseENvbG9yU3BhY2VDb252ZXJ0ZXIgeworICBndWludCAgICAgIHdpZHRoOworICBndWludCAgICAgIGhlaWdodDsKKyAgZ3VjaGFyICAgICAgcGFsdmVjWzc2OF07Cit9OworCit2b2lkIGZseF9jb2xvcnNwYWNlX2NvbnZlcnRlcl9kZXN0cm95KEZseENvbG9yU3BhY2VDb252ZXJ0ZXIgKmZseHBhbCk7Cit2b2lkIGZseF9jb2xvcnNwYWNlX2NvbnZlcnQoRmx4Q29sb3JTcGFjZUNvbnZlcnRlciAqZmx4cGFsLCBndWNoYXIgKnNyYywgZ3VjaGFyICpkZXN0KTsKK0ZseENvbG9yU3BhY2VDb252ZXJ0ZXIgKiBmbHhfY29sb3JzcGFjZV9jb252ZXJ0ZXJfbmV3KGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0KTsKKwordm9pZCBmbHhfc2V0X3BhbGV0dGVfdmVjdG9yKEZseENvbG9yU3BhY2VDb252ZXJ0ZXIgKmZseHBhbCwgZ3VpbnQgc3RhcnQsIGd1aW50IG51bSwgCisgICAgICAgICAgZ3VjaGFyICpuZXdwYWwsIGdpbnQgc2NhbGUpOwordm9pZCBmbHhfc2V0X2NvbG9yKEZseENvbG9yU3BhY2VDb252ZXJ0ZXIgKmZseHBhbCwgZ3VpbnQgY29sciwgZ3VpbnQgcmVkLCBndWludCBncmVlbiwKKyAgICAgICAgICBndWludCBibHVlLCBnaW50IHNjYWxlKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fRkxYX0NPTE9SX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2ZseC9mbHhfZm10LmggYi9nc3QvZmx4L2ZseF9mbXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmZmMjAwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ZseC9mbHhfZm10LmgKQEAgLTAsMCArMSwxMjggQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfRkxYX0ZNVF9IX18KKyNkZWZpbmUgX19HU1RfRkxYX0ZNVF9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR19CRUdJTl9ERUNMUworCitlbnVtIEZseF9UeXBlQ2h1bmsKK3sKKwkvKiBmcmFtZSBjaHVua3MgKi8KKwlGTFhfUFJFRklYX1RZUEUJCT0gMHhmMTAwLAorCUZMWF9TQ1JJUFRfQ0hVTksJPSAweGYxZTAsCisJRkxYX0ZSQU1FX1RZUEUJCT0gMHhmMWZhLAorCUZMWF9TRUdNRU5UX1RBQkxFCT0gMHhmMWZiLAorCUZMWF9IVUZGTUFOX1RBQkxFCT0gMHhmMWZjLAorCisJLyogc3ViIGNodW5rcyAqLworCUZMWF9DRUxfREFUQQkJPSAzLAorCUZMWF9DT0xPUjI1NgkJPSA0LAorCUZMWF9TUzIJCQk9IDcsCisgICAgICAgIEZMWF9DT0xPUjY0CQk9IDExLAorICAgICAgICBGTFhfTEMJCQk9IDEyLAorICAgICAgICBGTFhfQkxBQ0sJCT0gMTMsCisgICAgICAgIEZMWF9CUlVOCQk9IDE1LAorICAgICAgICBGTFhfQ09QWQkJPSAxNiwKKyAgICAgICAgRkxYX01JTkkJCT0gMTgsCisJRkxYX0RUQV9SVU4JCT0gMjUsCisJRkxYX0RUQV9DT1BZCQk9IDI2LAorCUZMWF9EVEFfTEMJCT0gMjcsCisJRkxYX0xBQkVMCQk9IDMxLAorCUZMWF9CTVBfTUFTSwkJPSAzMiwKKwlGTFhfTUxFVl9NQVNLCQk9IDMzLAorCUZMWF9TRUdNRU5UCQk9IDM0LAorCUZMWF9LRVlfSU1BR0UJCT0gMzUsCisJRkxYX0tFWV9QQUwJCT0gMzYsCisJRkxYX1JFR0lPTgkJPSAzNywKKwlGTFhfV0FWRQkJPSAzOCwKKwlGTFhfVVNFUlNUUklORwkJPSAzOSwKKwlGTFhfUkdOX01BU0sJCT0gNDAKKworfTsKKworZW51bSBGbHhfTWFnaWNIZHIKK3sKKwlGTFhfTUFHSUNIRFJfRkxJCT0gMHhhZjExLAorCUZMWF9NQUdJQ0hEUl9GTEMJPSAweGFmMTIsCisJRkxYX01BR0lDSERSX0ZMWAk9IDB4YWY0NCwKKwlGTFhfTUFHSUNIRFJfSFVGRkJXVAk9IDB4YWYzMAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgX0ZseEhlYWRlciAKK3sKKwlndWludDMyCXNpemU7CisJZ3VpbnQxNiB0eXBlOworCWd1aW50MTYJZnJhbWVzOworCWd1aW50MTYgd2lkdGgsaGVpZ2h0LGRlcHRoLGZsYWdzOworCWd1aW50MzIgc3BlZWQ7CisJZ3VpbnQxNiByZXNlcnZlZDE7CisJLyogRkxDICovIAorCWd1aW50MzIgY3JlYXRlZCxjcmVhdG9yLHVwZGF0ZWQsdXBkYXRlcjsKKwlndWludDE2IGFzcGVjdF9keCwgYXNwZWN0X2R5OworCS8qIEVHSSAqLworCWd1aW50MTYgZXh0X2ZsYWdzLGtleWZyYW1lcyx0b3RhbGZyYW1lczsKKwlndWludDMyIHJlcV9tZW1vcnk7CisJZ3VpbnQxNiBtYXhfcmVnaW9ucyx0cmFuc3BfbnVtOworCWd1Y2hhcglyZXNlcnZlZDJbMjRdOworCS8qIEZMQyAqLworCWd1aW50MzIgb2ZyYW1lMSxvZnJhbWUyOworCWd1Y2hhcglyZXNlcnZlZDNbNDBdOworfSBGbHhIZWFkZXI7CisjZGVmaW5lIEZseEhlYWRlclNpemUgMTI4CisKK3R5cGVkZWYgc3RydWN0IF9GbHhGcmFtZUNodW5rCit7CisJZ3VpbnQzMglzaXplOworCWd1aW50MTYJaWQ7Cit9IEZseEZyYW1lQ2h1bms7CisjZGVmaW5lIEZseEZyYW1lQ2h1bmtTaXplIDYKKwordHlwZWRlZiBzdHJ1Y3QgX0ZseFByZWZpeENodW5rCit7CisJZ3VpbnQxNiBjaHVua3M7CisJZ3VjaGFyICByZXNlcnZlZFs4XTsKK30gRmx4UHJlZml4Q2h1bms7CisKK3R5cGVkZWYgc3RydWN0IF9GbHhTZWdtZW50VGFibGUKK3sKKwlndWludDE2IHNlZ21lbnRzOworfSBGbHhTZWdtZW50VGFibGU7CisKK3R5cGVkZWYgc3RydWN0IF9GbHhIdWZmbWFuVGFibGUKK3sKKwlndWludDE2IGNvZGVsZW5ndGg7CisJZ3VpbnQxNiBudW1jb2RlczsKKwlndWNoYXIJcmVzZXJ2ZWRbNl07Cit9IEZseEh1ZmZtYW5UYWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QgX0ZseEZyYW1lVHlwZQoreworCWd1aW50MTYgY2h1bmtzOworCWd1aW50MTYgZGVsYXk7CisJZ3VjaGFyCXJlc2VydmVkWzZdOworfSBGbHhGcmFtZVR5cGU7CisjZGVmaW5lIEZseEZyYW1lVHlwZVNpemUgMTAKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0ZMWF9GTVRfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZmx4L2dzdGZseGRlYy5jIGIvZ3N0L2ZseC9nc3RmbHhkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2Q1NTJhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ZseC9nc3RmbHhkZWMuYwpAQCAtMCwwICsxLDk5OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQHRlbXBsZS1iYXB0aXN0LmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMTY+IE1hdHRoZXcgV2F0ZXJzIDxtYXR0aGV3QGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZmx4ZGVjCisgKgorICogVGhpcyBlbGVtZW50IGRlY29kZXMgZmxpL2ZsYy9mbHgtdmlkZW8gaW50byByYXcgdmlkZW8KKyAqLworLyoKKyAqIGh0dHA6Ly93d3cuY29vbHV0aWxzLmNvbS9Gb3JtYXRzL0ZMSQorICogaHR0cDovL3dvb2RzaG9sZS5lci51c2dzLmdvdi9vcGVyYXRpb25zL21vZGVsaW5nL2ZsYy5odG1sCisgKiBodHRwOi8vd3d3LmNvbXB1cGhhc2UuY29tL2ZsaWMuaHRtCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZmx4X2ZtdC5oIgorI2luY2x1ZGUgImdzdGZseGRlYy5oIgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjZGVmaW5lIEpJRkZJRSAgKEdTVF9TRUNPTkQvNzApCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGZseGRlY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBmbHhkZWNfZGVidWcKKworLyogaW5wdXQgKi8KK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWZsaSIpCisgICAgKTsKKworI2lmIEdfQllURV9PUkRFUiA9PSBHX0JJR19FTkRJQU4KKyNkZWZpbmUgUkdCX09SREVSICJ4UkdCIgorI2Vsc2UKKyNkZWZpbmUgUkdCX09SREVSICJCR1J4IgorI2VuZGlmCisKKy8qIG91dHB1dCAqLworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY192aWRlb19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoUkdCX09SREVSKSkKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfZmx4ZGVjX2Rpc3Bvc2UgKEdzdEZseERlYyAqIGZseGRlYyk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9mbHhkZWNfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ZseGRlY19zaW5rX2V2ZW50X2hhbmRsZXIgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X2ZseGRlY19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ZseGRlY19zcmNfcXVlcnlfaGFuZGxlciAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UXVlcnkgKiBxdWVyeSk7CisKK3N0YXRpYyBnYm9vbGVhbiBmbHhfZGVjb2RlX2NvbG9yIChHc3RGbHhEZWMgKiBmbHhkZWMsIEdzdEJ5dGVSZWFkZXIgKiByZWFkZXIsCisgICAgR3N0Qnl0ZVdyaXRlciAqIHdyaXRlciwgZ2ludCBzY2FsZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZmx4X2RlY29kZV9icnVuIChHc3RGbHhEZWMgKiBmbHhkZWMsCisgICAgR3N0Qnl0ZVJlYWRlciAqIHJlYWRlciwgR3N0Qnl0ZVdyaXRlciAqIHdyaXRlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZmx4X2RlY29kZV9kZWx0YV9mbGkgKEdzdEZseERlYyAqIGZseGRlYywKKyAgICBHc3RCeXRlUmVhZGVyICogcmVhZGVyLCBHc3RCeXRlV3JpdGVyICogd3JpdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBmbHhfZGVjb2RlX2RlbHRhX2ZsYyAoR3N0Rmx4RGVjICogZmx4ZGVjLAorICAgIEdzdEJ5dGVSZWFkZXIgKiByZWFkZXIsIEdzdEJ5dGVXcml0ZXIgKiB3cml0ZXIpOworCisjZGVmaW5lIHJuZGFsaWduKG9mZikgKChvZmYpICsgKChvZmYpICYgMSkpCisKKyNkZWZpbmUgZ3N0X2ZseGRlY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RGbHhEZWMsIGdzdF9mbHhkZWMsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZAorZ3N0X2ZseGRlY19jbGFzc19pbml0IChHc3RGbHhEZWNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IChHT2JqZWN0RmluYWxpemVGdW5jKSBnc3RfZmx4ZGVjX2Rpc3Bvc2U7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGZseGRlY19kZWJ1ZywgImZseGRlYyIsIDAsICJGTFggdmlkZW8gZGVjb2RlciIpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx4ZGVjX2NoYW5nZV9zdGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkZMWCB2aWRlbyBkZWNvZGVyIiwKKyAgICAgICJDb2RlYy9EZWNvZGVyL1ZpZGVvIiwKKyAgICAgICJGTEMvRkxJL0ZMWCB2aWRlbyBkZWNvZGVyIiwKKyAgICAgICJTZXBwIFdpam5hbmRzIDxtcnJhenpAZ2FyYmFnZS1jb2RlcnoubmV0PiwgWmVlc2hhbiBBbGkgPHplZW5peEBnbWFpbC5jb20+Iik7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXQgKCZzaW5rX2ZhY3RvcnkpKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgIGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCAoJnNyY192aWRlb19mYWN0b3J5KSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx4ZGVjX2luaXQgKEdzdEZseERlYyAqIGZseGRlYykKK3sKKyAgZmx4ZGVjLT5zaW5rcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rX2ZhY3RvcnksICJzaW5rIik7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChmbHhkZWMpLCBmbHhkZWMtPnNpbmtwYWQpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoZmx4ZGVjLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9mbHhkZWNfY2hhaW4pKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKGZseGRlYy0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZmx4ZGVjX3NpbmtfZXZlbnRfaGFuZGxlcikpOworCisgIGZseGRlYy0+c3JjcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmNfdmlkZW9fZmFjdG9yeSwgInNyYyIpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoZmx4ZGVjKSwgZmx4ZGVjLT5zcmNwYWQpOworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAoZmx4ZGVjLT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ZseGRlY19zcmNfcXVlcnlfaGFuZGxlcikpOworCisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKGZseGRlYy0+c3JjcGFkKTsKKworICBmbHhkZWMtPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZmx4ZGVjX2Rpc3Bvc2UgKEdzdEZseERlYyAqIGZseGRlYykKK3sKKyAgaWYgKGZseGRlYy0+YWRhcHRlcikgeworICAgIGdfb2JqZWN0X3VucmVmIChmbHhkZWMtPmFkYXB0ZXIpOworICAgIGZseGRlYy0+YWRhcHRlciA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAoKEdPYmplY3QgKikgZmx4ZGVjKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZmx4ZGVjX3NyY19xdWVyeV9oYW5kbGVyIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RGbHhEZWMgKmZseGRlYyA9IChHc3RGbHhEZWMgKikgcGFyZW50OworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9EVVJBVElPTjoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfZHVyYXRpb24gKHF1ZXJ5LCAmZm9ybWF0LCBOVUxMKTsKKworICAgICAgaWYgKGZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUpCisgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgZ3N0X3F1ZXJ5X3NldF9kdXJhdGlvbiAocXVlcnksIGZvcm1hdCwgZmx4ZGVjLT5kdXJhdGlvbik7CisKKyAgICAgIHJldCA9IFRSVUU7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorZG9uZToKKyAgaWYgKCFyZXQpCisgICAgcmV0ID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ZseGRlY19zaW5rX2V2ZW50X2hhbmRsZXIgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdEZseERlYyAqZmx4ZGVjOworICBnYm9vbGVhbiByZXQ7CisKKyAgZmx4ZGVjID0gR1NUX0ZMWERFQyAocGFyZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgIHsKKyAgICAgIGdzdF9ldmVudF9jb3B5X3NlZ21lbnQgKGV2ZW50LCAmZmx4ZGVjLT5zZWdtZW50KTsKKyAgICAgIGlmIChmbHhkZWMtPnNlZ21lbnQuZm9ybWF0ICE9IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChmbHhkZWMsICJnZW5lcmF0aW5nIFRJTUUgc2VnbWVudCIpOworICAgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmZmx4ZGVjLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZmbHhkZWMtPnNlZ21lbnQpOworICAgICAgfQorCisgICAgICBpZiAoZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChmbHhkZWMtPnNyY3BhZCkpIHsKKyAgICAgICAgcmV0ID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmx4ZGVjLT5uZWVkX3NlZ21lbnQgPSBUUlVFOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJmZseGRlYy0+c2VnbWVudCwgR1NUX0ZPUk1BVF9VTkRFRklORUQpOworICAgICAgcmV0ID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitmbHhfZGVjb2RlX2NodW5rcyAoR3N0Rmx4RGVjICogZmx4ZGVjLCBndWxvbmcgbl9jaHVua3MsIEdzdEJ5dGVSZWFkZXIgKiByZWFkZXIsCisgICAgR3N0Qnl0ZVdyaXRlciAqIHdyaXRlcikKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICB3aGlsZSAobl9jaHVua3MtLSkgeworICAgIEdzdEJ5dGVSZWFkZXIgY2h1bms7CisgICAgZ3VpbnQzMiBzaXplOworICAgIGd1aW50MTYgdHlwZTsKKworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKHJlYWRlciwgJnNpemUpKQorICAgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2xlIChyZWFkZXIsICZ0eXBlKSkKKyAgICAgIGdvdG8gcGFyc2VfZXJyb3I7CisgICAgR1NUX0xPR19PQkpFQ1QgKGZseGRlYywgImNodW5rIGhhcyB0eXBlIDB4JTAyeCBzaXplICVkIiwgdHlwZSwgc2l6ZSk7CisKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfc3ViX3JlYWRlciAocmVhZGVyLCAmY2h1bmssCisgICAgICAgICAgICBzaXplIC0gRmx4RnJhbWVDaHVua1NpemUpKSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChmbHhkZWMsICJJbmNvcnJlY3Qgc2l6ZSBpbiB0aGUgY2h1bmsgaGVhZGVyIik7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBGTFhfQ09MT1I2NDoKKyAgICAgICAgcmV0ID0gZmx4X2RlY29kZV9jb2xvciAoZmx4ZGVjLCAmY2h1bmssIHdyaXRlciwgMik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZMWF9DT0xPUjI1NjoKKyAgICAgICAgcmV0ID0gZmx4X2RlY29kZV9jb2xvciAoZmx4ZGVjLCAmY2h1bmssIHdyaXRlciwgMCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZMWF9CUlVOOgorICAgICAgICByZXQgPSBmbHhfZGVjb2RlX2JydW4gKGZseGRlYywgJmNodW5rLCB3cml0ZXIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTFhfTEM6CisgICAgICAgIHJldCA9IGZseF9kZWNvZGVfZGVsdGFfZmxpIChmbHhkZWMsICZjaHVuaywgd3JpdGVyKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRkxYX1NTMjoKKyAgICAgICAgcmV0ID0gZmx4X2RlY29kZV9kZWx0YV9mbGMgKGZseGRlYywgJmNodW5rLCB3cml0ZXIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGTFhfQkxBQ0s6CisgICAgICAgIHJldCA9IGdzdF9ieXRlX3dyaXRlcl9maWxsICh3cml0ZXIsIDAsIGZseGRlYy0+c2l6ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZMWF9NSU5JOgorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJVbmltcGxlbWVudGVkIGNodW5rIHR5cGU6IDB4JTAyeCBzaXplOiAlZCAtIHNraXBwaW5nIiwKKyAgICAgICAgICAgIHR5cGUsIHNpemUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIXJldCkKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKKworcGFyc2VfZXJyb3I6CisgIEdTVF9FUlJPUl9PQkpFQ1QgKGZseGRlYywgIkZhaWxlZCB0byBkZWNvZGUgY2h1bmsiKTsKK2Vycm9yOgorICByZXR1cm4gRkFMU0U7Cit9CisKKworc3RhdGljIGdib29sZWFuCitmbHhfZGVjb2RlX2NvbG9yIChHc3RGbHhEZWMgKiBmbHhkZWMsIEdzdEJ5dGVSZWFkZXIgKiByZWFkZXIsCisgICAgR3N0Qnl0ZVdyaXRlciAqIHdyaXRlciwgZ2ludCBzY2FsZSkKK3sKKyAgZ3VpbnQ4IGNvdW50LCBpbmR4OworICBndWludDE2IHBhY2tzOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKHJlYWRlciwgJnBhY2tzKSkKKyAgICBnb3RvIGVycm9yOworICBpbmR4ID0gMDsKKworICBHU1RfTE9HICgiR3N0Rmx4RGVjOiBjbWFwIHBhY2tzOiAlZCIsIChndWludCkgcGFja3MpOworICB3aGlsZSAocGFja3MtLSkgeworICAgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgICBndWludDE2IGFjdHVhbF9jb3VudDsKKworICAgIC8qIGNvbG9yIG1hcCBpbmRleCArIHNraXAgY291bnQgKi8KKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKHJlYWRlciwgJmluZHgpKQorICAgICAgZ290byBlcnJvcjsKKworICAgIC8qIG51bWJlciBvZiByZ2IgdHJpcGxldHMgKi8KKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKHJlYWRlciwgJmNvdW50KSkKKyAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBhY3R1YWxfY291bnQgPSBjb3VudCA9PSAwID8gMjU2IDogY291bnQ7CisKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfZGF0YSAocmVhZGVyLCBjb3VudCAqIDMsICZkYXRhKSkKKyAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoZmx4ZGVjLCAiY21hcCBjb3VudDogJWQgKGluZHg6ICVkKSIsIGFjdHVhbF9jb3VudCwgaW5keCk7CisgICAgZmx4X3NldF9wYWxldHRlX3ZlY3RvciAoZmx4ZGVjLT5jb252ZXJ0ZXIsIGluZHgsIGFjdHVhbF9jb3VudCwKKyAgICAgICAgKGd1Y2hhciAqKSBkYXRhLCBzY2FsZSk7CisgIH0KKworICByZXR1cm4gVFJVRTsKKworZXJyb3I6CisgIEdTVF9FUlJPUl9PQkpFQ1QgKGZseGRlYywgIkVycm9yIGRlY29kaW5nIGNvbG9yIHBhbGV0dGUiKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2ZseF9kZWNvZGVfYnJ1biAoR3N0Rmx4RGVjICogZmx4ZGVjLCBHc3RCeXRlUmVhZGVyICogcmVhZGVyLAorICAgIEdzdEJ5dGVXcml0ZXIgKiB3cml0ZXIpCit7CisgIGd1bG9uZyBsaW5lcywgcm93OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChmbHhkZWMgIT0gTlVMTCwgRkFMU0UpOworCisgIGxpbmVzID0gZmx4ZGVjLT5oZHIuaGVpZ2h0OworICB3aGlsZSAobGluZXMtLSkgeworICAgIC8qIHBhY2tldCBjb3VudC4gIAorICAgICAqIHNob3VsZCBub3QgYmUgdXNlZCBhbnltb3JlLCBzaW5jZSB0aGUgZmxjIGZvcm1hdCBjYW4KKyAgICAgKiBjb250YWluIG1vcmUgdGhlbiAyNTUgUkxFIHBhY2tldHMuIHdlIHVzZSB0aGUgZnJhbWUgCisgICAgICogd2lkdGggaW5zdGVhZC4gCisgICAgICovCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAocmVhZGVyLCAxKSkKKyAgICAgIGdvdG8gZXJyb3I7CisKKyAgICByb3cgPSBmbHhkZWMtPmhkci53aWR0aDsKKyAgICB3aGlsZSAocm93KSB7CisgICAgICBnaW50OCBjb3VudDsKKworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2ludDggKHJlYWRlciwgJmNvdW50KSkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgaWYgKGNvdW50IDw9IDApIHsKKyAgICAgICAgY29uc3QgZ3VpbnQ4ICpkYXRhOworCisgICAgICAgIC8qIGxpdGVyYWwgcnVuICovCisgICAgICAgIGNvdW50ID0gQUJTIChjb3VudCk7CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGZseGRlYywgImhhdmUgbGl0ZXJhbCBydW4gb2Ygc2l6ZSAlZCIsIGNvdW50KTsKKworICAgICAgICBpZiAoY291bnQgPiByb3cpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChmbHhkZWMsICJJbnZhbGlkIEJSVU4gbGluZSBkZXRlY3RlZC4gIgorICAgICAgICAgICAgICAiYnl0ZXMgdG8gd3JpdGUgZXhjZWVkcyB0aGUgZW5kIG9mIHRoZSByb3ciKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgcm93IC09IGNvdW50OworCisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF9kYXRhIChyZWFkZXIsIGNvdW50LCAmZGF0YSkpCisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKCFnc3RfYnl0ZV93cml0ZXJfcHV0X2RhdGEgKHdyaXRlciwgZGF0YSwgY291bnQpKQorICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICB9IGVsc2UgeworICAgICAgICBndWludDggeDsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZmx4ZGVjLCAiaGF2ZSByZXBsaWNhdGUgcnVuIG9mIHNpemUgJWQiLCBjb3VudCk7CisKKyAgICAgICAgaWYgKGNvdW50ID4gcm93KSB7CisgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoZmx4ZGVjLCAiSW52YWxpZCBCUlVOIHBhY2tldCBkZXRlY3RlZC4iCisgICAgICAgICAgICAgICJieXRlcyB0byB3cml0ZSBleGNlZWRzIHRoZSBlbmQgb2YgdGhlIHJvdyIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHJlcGxpY2F0ZSBydW4gKi8KKyAgICAgICAgcm93IC09IGNvdW50OworCisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAocmVhZGVyLCAmeCkpCisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKCFnc3RfYnl0ZV93cml0ZXJfZmlsbCAod3JpdGVyLCB4LCBjb3VudCkpCisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKKworZXJyb3I6CisgIEdTVF9FUlJPUl9PQkpFQ1QgKGZseGRlYywgIkZhaWxlZCB0byBkZWNvZGUgQlJVTiBwYWNrZXQiKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2ZseF9kZWNvZGVfZGVsdGFfZmxpIChHc3RGbHhEZWMgKiBmbHhkZWMsIEdzdEJ5dGVSZWFkZXIgKiByZWFkZXIsCisgICAgR3N0Qnl0ZVdyaXRlciAqIHdyaXRlcikKK3sKKyAgZ3VpbnQxNiBzdGFydF9saW5lLCBsaW5lczsKKyAgZ3VpbnQgbGluZV9zdGFydF9pOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChmbHhkZWMgIT0gTlVMTCwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZmx4ZGVjLT5kZWx0YV9kYXRhICE9IE5VTEwsIEZBTFNFKTsKKworICAvKiB1c2UgbGFzdCBmcmFtZSBmb3IgZGVsdGEgKi8KKyAgaWYgKCFnc3RfYnl0ZV93cml0ZXJfcHV0X2RhdGEgKHdyaXRlciwgZmx4ZGVjLT5kZWx0YV9kYXRhLCBmbHhkZWMtPnNpemUpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAocmVhZGVyLCAmc3RhcnRfbGluZSkpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAocmVhZGVyLCAmbGluZXMpKQorICAgIGdvdG8gZXJyb3I7CisgIEdTVF9MT0dfT0JKRUNUIChmbHhkZWMsICJoZWlnaHQgJWQgc3RhcnQgbGluZSAlZCBsaW5lIGNvdW50ICVkIiwKKyAgICAgIGZseGRlYy0+aGRyLmhlaWdodCwgc3RhcnRfbGluZSwgbGluZXMpOworCisgIGlmIChzdGFydF9saW5lICsgbGluZXMgPiBmbHhkZWMtPmhkci5oZWlnaHQpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChmbHhkZWMsICJJbnZhbGlkIEZMSSBwYWNrZXQgZGV0ZWN0ZWQuIHRvbyBtYW55IGxpbmVzLiIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGxpbmVfc3RhcnRfaSA9IGZseGRlYy0+aGRyLndpZHRoICogc3RhcnRfbGluZTsKKyAgaWYgKCFnc3RfYnl0ZV93cml0ZXJfc2V0X3BvcyAod3JpdGVyLCBsaW5lX3N0YXJ0X2kpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgd2hpbGUgKGxpbmVzLS0pIHsKKyAgICBndWludDggcGFja2V0czsKKworICAgIC8qIHBhY2tldCBjb3VudCAqLworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAocmVhZGVyLCAmcGFja2V0cykpCisgICAgICBnb3RvIGVycm9yOworICAgIEdTVF9MT0dfT0JKRUNUIChmbHhkZWMsICJoYXZlICVkIHBhY2tldHMiLCBwYWNrZXRzKTsKKworICAgIHdoaWxlIChwYWNrZXRzLS0pIHsKKyAgICAgIC8qIHNraXAgY291bnQgKi8KKyAgICAgIGd1aW50OCBza2lwOworICAgICAgZ2ludDggY291bnQ7CisgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKHJlYWRlciwgJnNraXApKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAvKiBza2lwIGJ5dGVzICovCisgICAgICBpZiAoIWdzdF9ieXRlX3dyaXRlcl9zZXRfcG9zICh3cml0ZXIsCisgICAgICAgICAgICAgIGdzdF9ieXRlX3dyaXRlcl9nZXRfcG9zICh3cml0ZXIpICsgc2tpcCkpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgIC8qIFJMRSBjb3VudCAqLworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2ludDggKHJlYWRlciwgJmNvdW50KSkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgaWYgKGNvdW50IDwgMCkgeworICAgICAgICBndWludDggeDsKKworICAgICAgICAvKiBsaXRlcmFsIHJ1biAqLworICAgICAgICBjb3VudCA9IEFCUyAoY291bnQpOworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZmx4ZGVjLCAiaGF2ZSBsaXRlcmFsIHJ1biBvZiBzaXplICVkIGF0IG9mZnNldCAlZCIsCisgICAgICAgICAgICBjb3VudCwgc2tpcCk7CisKKyAgICAgICAgaWYgKHNraXAgKyBjb3VudCA+IGZseGRlYy0+aGRyLndpZHRoKSB7CisgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoZmx4ZGVjLCAiSW52YWxpZCBGTEkgcGFja2V0IGRldGVjdGVkLiAiCisgICAgICAgICAgICAgICJsaW5lIHRvbyBsb25nLiIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAocmVhZGVyLCAmeCkpCisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKCFnc3RfYnl0ZV93cml0ZXJfZmlsbCAod3JpdGVyLCB4LCBjb3VudCkpCisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGd1aW50OCAqZGF0YTsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZmx4ZGVjLCAiaGF2ZSByZXBsaWNhdGUgcnVuIG9mIHNpemUgJWQgYXQgb2Zmc2V0ICVkIiwKKyAgICAgICAgICAgIGNvdW50LCBza2lwKTsKKworICAgICAgICBpZiAoc2tpcCArIGNvdW50ID4gZmx4ZGVjLT5oZHIud2lkdGgpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChmbHhkZWMsICJJbnZhbGlkIEZMSSBwYWNrZXQgZGV0ZWN0ZWQuICIKKyAgICAgICAgICAgICAgImxpbmUgdG9vIGxvbmcuIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogcmVwbGljYXRlIHJ1biAqLworICAgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfZGF0YSAocmVhZGVyLCBjb3VudCwgJmRhdGEpKQorICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmICghZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICh3cml0ZXIsIGRhdGEsIGNvdW50KSkKKyAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgfQorICAgIH0KKyAgICBsaW5lX3N0YXJ0X2kgKz0gZmx4ZGVjLT5oZHIud2lkdGg7CisgICAgaWYgKCFnc3RfYnl0ZV93cml0ZXJfc2V0X3BvcyAod3JpdGVyLCBsaW5lX3N0YXJ0X2kpKQorICAgICAgZ290byBlcnJvcjsKKyAgfQorCisgIHJldHVybiBUUlVFOworCitlcnJvcjoKKyAgR1NUX0VSUk9SX09CSkVDVCAoZmx4ZGVjLCAiRmFpbGVkIHRvIGRlY29kZSBGTEkgcGFja2V0Iik7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitmbHhfZGVjb2RlX2RlbHRhX2ZsYyAoR3N0Rmx4RGVjICogZmx4ZGVjLCBHc3RCeXRlUmVhZGVyICogcmVhZGVyLAorICAgIEdzdEJ5dGVXcml0ZXIgKiB3cml0ZXIpCit7CisgIGd1aW50MTYgbGluZXMsIHN0YXJ0X2w7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGZseGRlYyAhPSBOVUxMLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChmbHhkZWMtPmRlbHRhX2RhdGEgIT0gTlVMTCwgRkFMU0UpOworCisgIC8qIHVzZSBsYXN0IGZyYW1lIGZvciBkZWx0YSAqLworICBpZiAoIWdzdF9ieXRlX3dyaXRlcl9wdXRfZGF0YSAod3JpdGVyLCBmbHhkZWMtPmRlbHRhX2RhdGEsIGZseGRlYy0+c2l6ZSkpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAocmVhZGVyLCAmbGluZXMpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKGxpbmVzID4gZmx4ZGVjLT5oZHIuaGVpZ2h0KSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZmx4ZGVjLCAiSW52YWxpZCBGTEMgcGFja2V0IGRldGVjdGVkLiB0b28gbWFueSBsaW5lcy4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBzdGFydF9sID0gbGluZXM7CisKKyAgd2hpbGUgKGxpbmVzKSB7CisgICAgZ3VpbnQxNiBvcGNvZGU7CisKKyAgICBpZiAoIWdzdF9ieXRlX3dyaXRlcl9zZXRfcG9zICh3cml0ZXIsCisgICAgICAgICAgICBmbHhkZWMtPmhkci53aWR0aCAqIChzdGFydF9sIC0gbGluZXMpKSkKKyAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAvKiBwcm9jZXNzIG9wY29kZShzKSAqLworICAgIHdoaWxlIChUUlVFKSB7CisgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2xlIChyZWFkZXIsICZvcGNvZGUpKQorICAgICAgICBnb3RvIGVycm9yOworICAgICAgaWYgKChvcGNvZGUgJiAweGMwMDApID09IDApCisgICAgICAgIGJyZWFrOworCisgICAgICBpZiAoKG9wY29kZSAmIDB4YzAwMCkgPT0gMHhjMDAwKSB7CisgICAgICAgIC8qIGxpbmUgc2tpcCBjb3VudCAqLworICAgICAgICBndWxvbmcgc2tpcCA9ICgweDEwMDAwIC0gb3Bjb2RlKTsKKyAgICAgICAgaWYgKHNraXAgPiBmbHhkZWMtPmhkci5oZWlnaHQpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChmbHhkZWMsICJJbnZhbGlkIEZMQyBwYWNrZXQgZGV0ZWN0ZWQuICIKKyAgICAgICAgICAgICAgInNraXAgbGluZSBjb3VudCB0b28gYmlnLiIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBzdGFydF9sICs9IHNraXA7CisgICAgICAgIGlmICghZ3N0X2J5dGVfd3JpdGVyX3NldF9wb3MgKHdyaXRlciwKKyAgICAgICAgICAgICAgICBnc3RfYnl0ZV93cml0ZXJfZ2V0X3BvcyAod3JpdGVyKSArIGZseGRlYy0+aGRyLndpZHRoICogc2tpcCkpCisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGxhc3QgcGl4ZWwgKi8KKyAgICAgICAgaWYgKCFnc3RfYnl0ZV93cml0ZXJfc2V0X3BvcyAod3JpdGVyLAorICAgICAgICAgICAgICAgIGdzdF9ieXRlX3dyaXRlcl9nZXRfcG9zICh3cml0ZXIpICsgZmx4ZGVjLT5oZHIud2lkdGgpKQorICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmICghZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50OCAod3JpdGVyLCBvcGNvZGUgJiAweGZmKSkKKyAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgfQorICAgIH0KKworICAgIC8qIGxhc3Qgb3Bjb2RlIGlzIHRoZSBwYWNrZXQgY291bnQgKi8KKyAgICBHU1RfTE9HX09CSkVDVCAoZmx4ZGVjLCAiaGF2ZSAlZCBwYWNrZXRzIiwgb3Bjb2RlKTsKKyAgICB3aGlsZSAob3Bjb2RlLS0pIHsKKyAgICAgIC8qIHNraXAgY291bnQgKi8KKyAgICAgIGd1aW50OCBza2lwOworICAgICAgZ2ludDggY291bnQ7CisKKyAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAocmVhZGVyLCAmc2tpcCkpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICBpZiAoIWdzdF9ieXRlX3dyaXRlcl9zZXRfcG9zICh3cml0ZXIsCisgICAgICAgICAgICAgIGdzdF9ieXRlX3dyaXRlcl9nZXRfcG9zICh3cml0ZXIpICsgc2tpcCkpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgIC8qIFJMRSBjb3VudCAqLworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2ludDggKHJlYWRlciwgJmNvdW50KSkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgaWYgKGNvdW50IDwgMCkgeworICAgICAgICBndWludDE2IHg7CisKKyAgICAgICAgLyogcmVwbGljYXRlIHdvcmQgcnVuICovCisgICAgICAgIGNvdW50ID0gQUJTIChjb3VudCk7CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGZseGRlYywgImhhdmUgcmVwbGljYXRlIHJ1biBvZiBzaXplICVkIGF0IG9mZnNldCAlZCIsCisgICAgICAgICAgICBjb3VudCwgc2tpcCk7CisKKyAgICAgICAgaWYgKHNraXAgKyBjb3VudCA+IGZseGRlYy0+aGRyLndpZHRoKSB7CisgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoZmx4ZGVjLCAiSW52YWxpZCBGTEMgcGFja2V0IGRldGVjdGVkLiAiCisgICAgICAgICAgICAgICJsaW5lIHRvbyBsb25nLiIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKHJlYWRlciwgJngpKQorICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAgICAgICBpZiAoIWdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDE2X2xlICh3cml0ZXIsIHgpKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGZseGRlYywgImhhdmUgbGl0ZXJhbCBydW4gb2Ygc2l6ZSAlZCBhdCBvZmZzZXQgJWQiLAorICAgICAgICAgICAgY291bnQsIHNraXApOworCisgICAgICAgIGlmIChza2lwICsgY291bnQgPiBmbHhkZWMtPmhkci53aWR0aCkgeworICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGZseGRlYywgIkludmFsaWQgRkxDIHBhY2tldCBkZXRlY3RlZC4gIgorICAgICAgICAgICAgICAibGluZSB0b28gbG9uZy4iKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgICAgIGd1aW50MTYgeDsKKworICAgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKHJlYWRlciwgJngpKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICBpZiAoIWdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDE2X2xlICh3cml0ZXIsIHgpKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBsaW5lcy0tOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKK2Vycm9yOgorICBHU1RfRVJST1JfT0JKRUNUIChmbHhkZWMsICJGYWlsZWQgdG8gZGVjb2RlIEZMSSBwYWNrZXQiKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK19yZWFkX2ZseF9oZWFkZXIgKEdzdEZseERlYyAqIGZseGRlYywgR3N0Qnl0ZVJlYWRlciAqIHJlYWRlciwgRmx4SGVhZGVyICogZmx4aCkKK3sKKyAgbWVtc2V0IChmbHhoLCAwLCBzaXplb2YgKCpmbHhoKSk7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9sZSAocmVhZGVyLCAmZmx4aC0+c2l6ZSkpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKGZseGgtPnNpemUgPCBGbHhIZWFkZXJTaXplKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZmx4ZGVjLCAiSW52YWxpZCBmaWxlIHNpemUgaW4gdGhlIGhlYWRlciIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKHJlYWRlciwgJmZseGgtPnR5cGUpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKHJlYWRlciwgJmZseGgtPmZyYW1lcykpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAocmVhZGVyLCAmZmx4aC0+d2lkdGgpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKHJlYWRlciwgJmZseGgtPmhlaWdodCkpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAocmVhZGVyLCAmZmx4aC0+ZGVwdGgpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKHJlYWRlciwgJmZseGgtPmZsYWdzKSkKKyAgICBnb3RvIGVycm9yOworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2xlIChyZWFkZXIsICZmbHhoLT5zcGVlZCkpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAocmVhZGVyLCAyKSkgICAgICAgIC8qIHJlc2VydmVkICovCisgICAgZ290byBlcnJvcjsKKyAgLyogRkxDICovCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKHJlYWRlciwgJmZseGgtPmNyZWF0ZWQpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKHJlYWRlciwgJmZseGgtPmNyZWF0b3IpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKHJlYWRlciwgJmZseGgtPnVwZGF0ZWQpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKHJlYWRlciwgJmZseGgtPnVwZGF0ZXIpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKHJlYWRlciwgJmZseGgtPmFzcGVjdF9keCkpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAocmVhZGVyLCAmZmx4aC0+YXNwZWN0X2R5KSkKKyAgICBnb3RvIGVycm9yOworICAvKiBFR0kgKi8KKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAocmVhZGVyLCAmZmx4aC0+ZXh0X2ZsYWdzKSkKKyAgICBnb3RvIGVycm9yOworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2xlIChyZWFkZXIsICZmbHhoLT5rZXlmcmFtZXMpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKHJlYWRlciwgJmZseGgtPnRvdGFsZnJhbWVzKSkKKyAgICBnb3RvIGVycm9yOworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2xlIChyZWFkZXIsICZmbHhoLT5yZXFfbWVtb3J5KSkKKyAgICBnb3RvIGVycm9yOworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2xlIChyZWFkZXIsICZmbHhoLT5tYXhfcmVnaW9ucykpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAocmVhZGVyLCAmZmx4aC0+dHJhbnNwX251bSkpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAocmVhZGVyLCAyNCkpICAgICAgIC8qIHJlc2VydmVkICovCisgICAgZ290byBlcnJvcjsKKyAgLyogRkxDICovCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKHJlYWRlciwgJmZseGgtPm9mcmFtZTEpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKHJlYWRlciwgJmZseGgtPm9mcmFtZTIpKQorICAgIGdvdG8gZXJyb3I7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKHJlYWRlciwgNDApKSAgICAgICAvKiByZXNlcnZlZCAqLworICAgIGdvdG8gZXJyb3I7CisKKyAgcmV0dXJuIFRSVUU7CisKK2Vycm9yOgorICBHU1RfRVJST1JfT0JKRUNUIChmbHhkZWMsICJFcnJvciByZWFkaW5nIGZpbGUgaGVhZGVyIik7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9mbHhkZWNfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdEJ5dGVSZWFkZXIgcmVhZGVyOworICBHc3RCdWZmZXIgKmlucHV0OworICBHc3RNYXBJbmZvIG1hcF9pbmZvOworICBHc3RDYXBzICpjYXBzOworICBndWludCBhdmFpbGFibGU7CisgIEdzdEZsb3dSZXR1cm4gcmVzID0gR1NUX0ZMT1dfT0s7CisKKyAgR3N0Rmx4RGVjICpmbHhkZWM7CisgIEZseEhlYWRlciAqZmx4aDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoYnVmICE9IE5VTEwsIEdTVF9GTE9XX0VSUk9SKTsKKyAgZmx4ZGVjID0gKEdzdEZseERlYyAqKSBwYXJlbnQ7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChmbHhkZWMgIT0gTlVMTCwgR1NUX0ZMT1dfRVJST1IpOworCisgIGdzdF9hZGFwdGVyX3B1c2ggKGZseGRlYy0+YWRhcHRlciwgYnVmKTsKKyAgYXZhaWxhYmxlID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChmbHhkZWMtPmFkYXB0ZXIpOworICBpbnB1dCA9IGdzdF9hZGFwdGVyX2dldF9idWZmZXIgKGZseGRlYy0+YWRhcHRlciwgYXZhaWxhYmxlKTsKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAoaW5wdXQsICZtYXBfaW5mbywgR1NUX01BUF9SRUFEKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChmbHhkZWMsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIiVzIiwgIkZhaWxlZCB0byBtYXAgYnVmZmVyIiksIChOVUxMKSk7CisgICAgZ290byBlcnJvcjsKKyAgfQorICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJnJlYWRlciwgbWFwX2luZm8uZGF0YSwgbWFwX2luZm8uc2l6ZSk7CisKKyAgaWYgKGZseGRlYy0+c3RhdGUgPT0gR1NUX0ZMWERFQ19SRUFEX0hFQURFUikgeworICAgIGlmIChhdmFpbGFibGUgPj0gRmx4SGVhZGVyU2l6ZSkgeworICAgICAgR3N0Qnl0ZVJlYWRlciBoZWFkZXI7CisgICAgICBHc3RDYXBzICp0ZW1wbDsKKworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3N1Yl9yZWFkZXIgKCZyZWFkZXIsICZoZWFkZXIsIEZseEhlYWRlclNpemUpKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChmbHhkZWMsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAgICAgKCIlcyIsICJDb3VsZCBub3QgcmVhZCBoZWFkZXIiKSwgKE5VTEwpKTsKKyAgICAgICAgZ290byB1bm1hcF9pbnB1dF9lcnJvcjsKKyAgICAgIH0KKyAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChmbHhkZWMtPmFkYXB0ZXIsIEZseEhlYWRlclNpemUpOworICAgICAgYXZhaWxhYmxlIC09IEZseEhlYWRlclNpemU7CisKKyAgICAgIGlmICghX3JlYWRfZmx4X2hlYWRlciAoZmx4ZGVjLCAmaGVhZGVyLCAmZmx4ZGVjLT5oZHIpKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChmbHhkZWMsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAgICAgKCIlcyIsICJGYWlsZWQgdG8gcGFyc2UgaGVhZGVyIiksIChOVUxMKSk7CisgICAgICAgIGdvdG8gdW5tYXBfaW5wdXRfZXJyb3I7CisgICAgICB9CisKKyAgICAgIGZseGggPSAmZmx4ZGVjLT5oZHI7CisKKyAgICAgIC8qIGNoZWNrIGhlYWRlciAqLworICAgICAgaWYgKGZseGgtPnR5cGUgIT0gRkxYX01BR0lDSERSX0ZMSSAmJgorICAgICAgICAgIGZseGgtPnR5cGUgIT0gRkxYX01BR0lDSERSX0ZMQyAmJiBmbHhoLT50eXBlICE9IEZMWF9NQUdJQ0hEUl9GTFgpIHsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGZseGRlYywgU1RSRUFNLCBXUk9OR19UWVBFLCAoTlVMTCksCisgICAgICAgICAgICAoIm5vdCBhIGZseCBmaWxlICh0eXBlICV4KSIsIGZseGgtPnR5cGUpKTsKKyAgICAgICAgZ290byB1bm1hcF9pbnB1dF9lcnJvcjsKKyAgICAgIH0KKworICAgICAgR1NUX0lORk9fT0JKRUNUIChmbHhkZWMsICJzaXplICAgICAgOiAgJWQiLCBmbHhoLT5zaXplKTsKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoZmx4ZGVjLCAiZnJhbWVzICAgIDogICVkIiwgZmx4aC0+ZnJhbWVzKTsKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoZmx4ZGVjLCAid2lkdGggICAgIDogICVkIiwgZmx4aC0+d2lkdGgpOworICAgICAgR1NUX0lORk9fT0JKRUNUIChmbHhkZWMsICJoZWlnaHQgICAgOiAgJWQiLCBmbHhoLT5oZWlnaHQpOworICAgICAgR1NUX0lORk9fT0JKRUNUIChmbHhkZWMsICJkZXB0aCAgICAgOiAgJWQiLCBmbHhoLT5kZXB0aCk7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGZseGRlYywgInNwZWVkICAgICA6ICAlZCIsIGZseGgtPnNwZWVkKTsKKworICAgICAgZmx4ZGVjLT5uZXh0X3RpbWUgPSAwOworCisgICAgICBpZiAoZmx4aC0+dHlwZSA9PSBGTFhfTUFHSUNIRFJfRkxJKSB7CisgICAgICAgIGZseGRlYy0+ZnJhbWVfdGltZSA9IEpJRkZJRSAqIGZseGgtPnNwZWVkOworICAgICAgfSBlbHNlIGlmIChmbHhoLT5zcGVlZCA9PSAwKSB7CisgICAgICAgIGZseGRlYy0+ZnJhbWVfdGltZSA9IEdTVF9TRUNPTkQgLyA3MDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZseGRlYy0+ZnJhbWVfdGltZSA9IGZseGgtPnNwZWVkICogR1NUX01TRUNPTkQ7CisgICAgICB9CisKKyAgICAgIGZseGRlYy0+ZHVyYXRpb24gPSBmbHhoLT5mcmFtZXMgKiBmbHhkZWMtPmZyYW1lX3RpbWU7CisgICAgICBHU1RfTE9HICgiZHVyYXRpb24gICA6ICAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZmx4ZGVjLT5kdXJhdGlvbikpOworCisgICAgICB0ZW1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChmbHhkZWMtPnNyY3BhZCk7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfY29weSAodGVtcGwpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHRlbXBsKTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsCisgICAgICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgZmx4aC0+d2lkdGgsCisgICAgICAgICAgImhlaWdodCIsIEdfVFlQRV9JTlQsIGZseGgtPmhlaWdodCwKKyAgICAgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sIChnaW50KSBHU1RfTVNFQ09ORCwKKyAgICAgICAgICAoZ2ludCkgZmx4ZGVjLT5mcmFtZV90aW1lIC8gMTAwMCwgTlVMTCk7CisKKyAgICAgIGdzdF9wYWRfc2V0X2NhcHMgKGZseGRlYy0+c3JjcGFkLCBjYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgICAgaWYgKGZseGRlYy0+bmVlZF9zZWdtZW50KSB7CisgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoZmx4ZGVjLT5zcmNwYWQsCisgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZmbHhkZWMtPnNlZ21lbnQpKTsKKyAgICAgICAgZmx4ZGVjLT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgICAgIH0KKworICAgICAgLyogemVybyBtZWFucyA4ICovCisgICAgICBpZiAoZmx4aC0+ZGVwdGggPT0gMCkKKyAgICAgICAgZmx4aC0+ZGVwdGggPSA4OworCisgICAgICBpZiAoZmx4aC0+ZGVwdGggIT0gOCkgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZmx4ZGVjLCBTVFJFQU0sIFdST05HX1RZUEUsCisgICAgICAgICAgICAoIiVzIiwgIkRvbid0IGtub3cgaG93IHRvIGRlY29kZSBub24gOCBiaXQgZGVwdGggc3RyZWFtcyIpLCAoTlVMTCkpOworICAgICAgICBnb3RvIHVubWFwX2lucHV0X2Vycm9yOworICAgICAgfQorCisgICAgICBmbHhkZWMtPmNvbnZlcnRlciA9CisgICAgICAgICAgZmx4X2NvbG9yc3BhY2VfY29udmVydGVyX25ldyAoZmx4aC0+d2lkdGgsIGZseGgtPmhlaWdodCk7CisKKyAgICAgIGlmIChmbHhoLT50eXBlID09IEZMWF9NQUdJQ0hEUl9GTEMgfHwgZmx4aC0+dHlwZSA9PSBGTFhfTUFHSUNIRFJfRkxYKSB7CisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoZmx4ZGVjLCAiKEZMQykgYXNwZWN0X2R4IDogICVkIiwgZmx4aC0+YXNwZWN0X2R4KTsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChmbHhkZWMsICIoRkxDKSBhc3BlY3RfZHkgOiAgJWQiLCBmbHhoLT5hc3BlY3RfZHkpOworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKGZseGRlYywgIihGTEMpIG9mcmFtZTEgICA6ICAweCUwOHgiLCBmbHhoLT5vZnJhbWUxKTsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChmbHhkZWMsICIoRkxDKSBvZnJhbWUyICAgOiAgMHglMDh4IiwgZmx4aC0+b2ZyYW1lMik7CisgICAgICB9CisKKyAgICAgIGZseGRlYy0+c2l6ZSA9ICgoZ3VpbnQpIGZseGgtPndpZHRoICogKGd1aW50KSBmbHhoLT5oZWlnaHQpOworICAgICAgaWYgKGZseGRlYy0+c2l6ZSA+PSBHX01BWFNJWkUgLyA0KSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChmbHhkZWMsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAgICAgKCIlcyIsICJDYW5ub3QgYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5IiksIChOVUxMKSk7CisgICAgICAgIGdvdG8gdW5tYXBfaW5wdXRfZXJyb3I7CisgICAgICB9CisKKyAgICAgIC8qIGNyZWF0ZSBkZWx0YSBhbmQgb3V0cHV0IGZyYW1lICovCisgICAgICBmbHhkZWMtPmZyYW1lX2RhdGEgPSBnX21hbGxvYzAgKGZseGRlYy0+c2l6ZSk7CisgICAgICBmbHhkZWMtPmRlbHRhX2RhdGEgPSBnX21hbGxvYzAgKGZseGRlYy0+c2l6ZSk7CisKKyAgICAgIGZseGRlYy0+c3RhdGUgPSBHU1RfRkxYREVDX1BMQVlJTkc7CisgICAgfQorICB9IGVsc2UgaWYgKGZseGRlYy0+c3RhdGUgPT0gR1NUX0ZMWERFQ19QTEFZSU5HKSB7CisgICAgR3N0QnVmZmVyICpvdXQ7CisKKyAgICAvKiB3aGlsZSB3ZSBoYXZlIGVub3VnaCBkYXRhIGluIHRoZSBhZGFwdGVyICovCisgICAgd2hpbGUgKGF2YWlsYWJsZSA+PSBGbHhGcmFtZUNodW5rU2l6ZSAmJiByZXMgPT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgIGd1aW50MzIgc2l6ZTsKKyAgICAgIGd1aW50MTYgdHlwZTsKKworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9sZSAoJnJlYWRlciwgJnNpemUpKQorICAgICAgICBnb3RvIHBhcnNlX2Vycm9yOworICAgICAgaWYgKGF2YWlsYWJsZSA8IHNpemUpCisgICAgICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisKKyAgICAgIGF2YWlsYWJsZSAtPSBzaXplOworICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGZseGRlYy0+YWRhcHRlciwgc2l6ZSk7CisKKyAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfbGUgKCZyZWFkZXIsICZ0eXBlKSkKKyAgICAgICAgZ290byBwYXJzZV9lcnJvcjsKKworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgRkxYX0ZSQU1FX1RZUEU6eworICAgICAgICAgIEdzdEJ5dGVSZWFkZXIgY2h1bmtzOworICAgICAgICAgIEdzdEJ5dGVXcml0ZXIgd3JpdGVyOworICAgICAgICAgIGd1aW50MTYgbl9jaHVua3M7CisgICAgICAgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAoZmx4ZGVjLCAiSGF2ZSBmcmFtZSB0eXBlIDB4JTAyeCBvZiBzaXplICVkIiwgdHlwZSwKKyAgICAgICAgICAgICAgc2l6ZSk7CisKKyAgICAgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfc3ViX3JlYWRlciAoJnJlYWRlciwgJmNodW5rcywKKyAgICAgICAgICAgICAgICAgIHNpemUgLSBGbHhGcmFtZUNodW5rU2l6ZSkpCisgICAgICAgICAgICBnb3RvIHBhcnNlX2Vycm9yOworCisgICAgICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9sZSAoJmNodW5rcywgJm5fY2h1bmtzKSkKKyAgICAgICAgICAgIGdvdG8gcGFyc2VfZXJyb3I7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGZseGRlYywgIkhhdmUgJWQgY2h1bmtzIiwgbl9jaHVua3MpOworCisgICAgICAgICAgaWYgKG5fY2h1bmtzID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmY2h1bmtzLCA4KSkgICAgICAgLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgICAgIGdvdG8gcGFyc2VfZXJyb3I7CisKKyAgICAgICAgICBnc3RfYnl0ZV93cml0ZXJfaW5pdF93aXRoX2RhdGEgKCZ3cml0ZXIsIGZseGRlYy0+ZnJhbWVfZGF0YSwKKyAgICAgICAgICAgICAgZmx4ZGVjLT5zaXplLCBUUlVFKTsKKworICAgICAgICAgIC8qIGRlY29kZSBjaHVua3MgKi8KKyAgICAgICAgICBpZiAoIWZseF9kZWNvZGVfY2h1bmtzIChmbHhkZWMsIG5fY2h1bmtzLCAmY2h1bmtzLCAmd3JpdGVyKSkgeworICAgICAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGZseGRlYywgU1RSRUFNLCBERUNPREUsCisgICAgICAgICAgICAgICAgKCIlcyIsICJDb3VsZCBub3QgZGVjb2RlIGNodW5rIiksIE5VTEwpOworICAgICAgICAgICAgZ290byB1bm1hcF9pbnB1dF9lcnJvcjsKKyAgICAgICAgICB9CisgICAgICAgICAgZ3N0X2J5dGVfd3JpdGVyX3Jlc2V0ICgmd3JpdGVyKTsKKworICAgICAgICAgIC8qIHNhdmUgY29weSBvZiB0aGUgY3VycmVudCBmcmFtZSBmb3IgcG9zc2libGUgZGVsdGEuICovCisgICAgICAgICAgbWVtY3B5IChmbHhkZWMtPmRlbHRhX2RhdGEsIGZseGRlYy0+ZnJhbWVfZGF0YSwgZmx4ZGVjLT5zaXplKTsKKworICAgICAgICAgIG91dCA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoZmx4ZGVjLT5zaXplICogNCk7CisgICAgICAgICAgaWYgKCFnc3RfYnVmZmVyX21hcCAob3V0LCAmbWFwLCBHU1RfTUFQX1dSSVRFKSkgeworICAgICAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGZseGRlYywgU1RSRUFNLCBERUNPREUsCisgICAgICAgICAgICAgICAgKCIlcyIsICJDb3VsZCBub3QgbWFwIG91dHB1dCBidWZmZXIiKSwgTlVMTCk7CisgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChvdXQpOworICAgICAgICAgICAgZ290byB1bm1hcF9pbnB1dF9lcnJvcjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBjb252ZXJ0IGN1cnJlbnQgZnJhbWUuICovCisgICAgICAgICAgZmx4X2NvbG9yc3BhY2VfY29udmVydCAoZmx4ZGVjLT5jb252ZXJ0ZXIsIGZseGRlYy0+ZnJhbWVfZGF0YSwKKyAgICAgICAgICAgICAgbWFwLmRhdGEpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dCwgJm1hcCk7CisKKyAgICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0KSA9IGZseGRlYy0+bmV4dF90aW1lOworICAgICAgICAgIGZseGRlYy0+bmV4dF90aW1lICs9IGZseGRlYy0+ZnJhbWVfdGltZTsKKworICAgICAgICAgIHJlcyA9IGdzdF9wYWRfcHVzaCAoZmx4ZGVjLT5zcmNwYWQsIG91dCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChmbHhkZWMsICJVbmtub3duIGZyYW1lIHR5cGUgMHglMDJ4LCBza2lwcGluZyAlZCIsCisgICAgICAgICAgICAgIHR5cGUsIHNpemUpOworICAgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZyZWFkZXIsIHNpemUgLSBGbHhGcmFtZUNodW5rU2l6ZSkpCisgICAgICAgICAgICBnb3RvIHBhcnNlX2Vycm9yOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCituZWVkX21vcmVfZGF0YToKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5wdXQsICZtYXBfaW5mbyk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGlucHV0KTsKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK3BhcnNlX2Vycm9yOgorICBHU1RfRUxFTUVOVF9FUlJPUiAoZmx4ZGVjLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICgiJXMiLCAiRmFpbGVkIHRvIHBhcnNlIHN0cmVhbSIpLCAoTlVMTCkpOwordW5tYXBfaW5wdXRfZXJyb3I6CisgIGdzdF9idWZmZXJfdW5tYXAgKGlucHV0LCAmbWFwX2luZm8pOworZXJyb3I6CisgIGdzdF9idWZmZXJfdW5yZWYgKGlucHV0KTsKKyAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9mbHhkZWNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0Rmx4RGVjICpmbHhkZWM7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBmbHhkZWMgPSBHU1RfRkxYREVDIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAoZmx4ZGVjLT5hZGFwdGVyKTsKKyAgICAgIGZseGRlYy0+c3RhdGUgPSBHU1RfRkxYREVDX1JFQURfSEVBREVSOworICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJmZseGRlYy0+c2VnbWVudCwgR1NUX0ZPUk1BVF9VTkRFRklORUQpOworICAgICAgZmx4ZGVjLT5uZWVkX3NlZ21lbnQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19QTEFZSU5HOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGlmIChmbHhkZWMtPmZyYW1lX2RhdGEpIHsKKyAgICAgICAgZ19mcmVlIChmbHhkZWMtPmZyYW1lX2RhdGEpOworICAgICAgICBmbHhkZWMtPmZyYW1lX2RhdGEgPSBOVUxMOworICAgICAgfQorICAgICAgaWYgKGZseGRlYy0+ZGVsdGFfZGF0YSkgeworICAgICAgICBnX2ZyZWUgKGZseGRlYy0+ZGVsdGFfZGF0YSk7CisgICAgICAgIGZseGRlYy0+ZGVsdGFfZGF0YSA9IE5VTEw7CisgICAgICB9CisgICAgICBpZiAoZmx4ZGVjLT5jb252ZXJ0ZXIpIHsKKyAgICAgICAgZmx4X2NvbG9yc3BhY2VfY29udmVydGVyX2Rlc3Ryb3kgKGZseGRlYy0+Y29udmVydGVyKTsKKyAgICAgICAgZmx4ZGVjLT5jb252ZXJ0ZXIgPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImZseGRlYyIsCisgICAgICBHU1RfUkFOS19QUklNQVJZLCBHU1RfVFlQRV9GTFhERUMpOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgZmx4ZGVjLAorICAgICJGTEMvRkxJL0ZMWCB2aWRlbyBkZWNvZGVyIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC9mbHgvZ3N0Zmx4ZGVjLmggYi9nc3QvZmx4L2dzdGZseGRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NDg2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZmx4L2dzdGZseGRlYy5oCkBAIC0wLDAgKzEsODcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0ZMWF9ERUNPREVSX0hfXworI2RlZmluZSBfX0dTVF9GTFhfREVDT0RFUl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RieXRlcmVhZGVyLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXdyaXRlci5oPgorI2luY2x1ZGUgImZseF9jb2xvci5oIgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgZW51bSB7CisgIEdTVF9GTFhERUNfUkVBRF9IRUFERVIsCisgIEdTVF9GTFhERUNfUExBWUlORywKK30gR3N0Rmx4RGVjU3RhdGU7CisJCisKKy8qIERlZmluaXRpb24gb2Ygc3RydWN0dXJlIHN0b3JpbmcgZGF0YSBmb3IgdGhpcyBlbGVtZW50LiAqLwordHlwZWRlZiBzdHJ1Y3QgX0dzdEZseERlYyAgR3N0Rmx4RGVjOworCitzdHJ1Y3QgX0dzdEZseERlYyB7CisgIEdzdEVsZW1lbnQgZWxlbWVudDsKKworICBHc3RQYWQgKnNpbmtwYWQsICpzcmNwYWQ7CisKKyAgR3N0U2VnbWVudCBzZWdtZW50OworICBnYm9vbGVhbiBuZWVkX3NlZ21lbnQ7CisKKyAgZ2Jvb2xlYW4gYWN0aXZlLCBuZXdfbWV0YTsKKworICBndWludDggKmRlbHRhX2RhdGEsICpmcmFtZV9kYXRhOworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBnc2l6ZSBzaXplOworICBHc3RGbHhEZWNTdGF0ZSBzdGF0ZTsKKyAgZ2ludDY0IGZyYW1lX3RpbWU7CisgIGdpbnQ2NCBuZXh0X3RpbWU7CisgIGdpbnQ2NCBkdXJhdGlvbjsKKworICBGbHhDb2xvclNwYWNlQ29udmVydGVyICpjb252ZXJ0ZXI7CisKKyAgRmx4SGVhZGVyIGhkcjsKK307CisKKy8qIFN0YW5kYXJkIGRlZmluaXRpb24gZGVmaW5pbmcgYSBjbGFzcyBmb3IgdGhpcyBlbGVtZW50LiAqLwordHlwZWRlZiBzdHJ1Y3QgX0dzdEZseERlY0NsYXNzIEdzdEZseERlY0NsYXNzOworc3RydWN0IF9Hc3RGbHhEZWNDbGFzcyB7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCisvKiBTdGFuZGFyZCBtYWNyb3MgZm9yIGRlZmluaW5nIHR5cGVzIGZvciB0aGlzIGVsZW1lbnQuICAqLworI2RlZmluZSBHU1RfVFlQRV9GTFhERUMgXAorICAoZ3N0X2ZseGRlY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfRkxYREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfRkxYREVDLEdzdEZseERlYykpCisjZGVmaW5lIEdTVF9GTFhERUNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfRkxYREVDLEdzdEZseERlY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0ZMWERFQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0ZMWERFQykpCisjZGVmaW5lIEdTVF9JU19GTFhERUNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfRkxYREVDKSkKKworLyogU3RhbmRhcmQgZnVuY3Rpb24gcmV0dXJuaW5nIHR5cGUgaW5mb3JtYXRpb24uICovCitHVHlwZSBnc3RfZmx4ZGVjX2dldF90eXBlKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfRkxYX0RFQ09ERVJfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvZmx4L21lc29uLmJ1aWxkIGIvZ3N0L2ZseC9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjdjOWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ZseC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDggQEAKK2ZseGRlYyA9IGxpYnJhcnkoJ2dzdGZseGRlYycsCisgICdnc3RmbHhkZWMuYycsICdmbHhfY29sb3IuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0YmFzZV9kZXAsIGdzdHZpZGVvX2RlcCwgZ3N0X2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvZ29vbS8uZ2l0aWdub3JlIGIvZ3N0L2dvb20vLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjA5MDUwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vLmdpdGlnbm9yZQpAQCAtMCwwICsxLDExIEBACitNYWtlZmlsZQorTWFrZWZpbGUuaW4KKyoubworKi5sbworKi5sYQorLmRlcHMKKy5saWJzCitnb29tc2xfbGV4LmMKK2dvb21zbF95YWNjLmMKK2dvb21zbF95YWNjLmgKKwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vTWFrZWZpbGUuYW0gYi9nc3QvZ29vbS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzAxYjEwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NiBAQAorCitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3Rnb29tLmxhCisKK1BQQ19GSUxFUz1wcGNfem9vbV91bHRpbWF0ZS5zIHBwY19kcmF3aW5ncy5zIHBwY19kcmF3aW5ncy5oIHBwY196b29tX3VsdGltYXRlLmgKK01NWF9GSUxFUz1tbXguYyB4bW14LmMgbW14LmggeG1teC5oCisKK2lmIEhBVkVfQ1BVX1BQQworIyBkaXNhYmxlIHVudGlsIHNvbWVvbmUgZmlndXJlcyBvdXQgaG93IHRvIGJ1aWxkIHRoZXNlIGNvcnJlY3RseSBvbiBwcGMKKyNBUkNIX0ZJTEVTID0gJChQUENfRklMRVMpCitBUkNIX0ZJTEVTID0KK2VuZGlmCitpZiBIQVZFX0NQVV9QUEM2NAorIyBkaXNhYmxlIHVudGlsIHNvbWVvbmUgZmlndXJlcyBvdXQgaG93IHRvIGJ1aWxkIHRoZXNlIGNvcnJlY3RseSBvbiBwcGMKKyNBUkNIX0ZJTEVTID0gJChQUENfRklMRVMpCitBUkNIX0ZJTEVTID0KK2VuZGlmCitpZiBIQVZFX0NQVV9JMzg2CitBUkNIX0ZJTEVTID0gJChNTVhfRklMRVMpCitBUkNIX0NGTEFHUyA9IC1EQlVJTERfTU1YCitlbmRpZgorCQkJCQorbGliZ3N0Z29vbV9sYV9TT1VSQ0VTID0JCQkJCQlcCisJZ3N0Z29vbS5jIGdzdGdvb20uaAkJCQkJXAorCWRyYXdtZXRob2RzLmMgZHJhd21ldGhvZHMuaAkJCQlcCisJc291bmRfdGVzdGVyLmMgc291bmRfdGVzdGVyLmgJCQkJXAorCW1hdGh0b29scy5jIG1hdGh0b29scy5oCQkJCQlcCisJbGluZXMuYyBsaW5lcy5oIGlmcy5jIGlmcy5oIHN1cmYzZC5jIHN1cmYzZC5oCQlcCisJdGVudGFjbGUzZC5jIHRlbnRhY2xlM2QuaCB2M2QuYyB2M2QuaAkJCVwKKwljb252b2x2ZV9meC5jIGZseWluZ19zdGFyc19meC5jCQkJCVwKKwlnb29tX2Z4LmggZ29vbV92aXN1YWxfZnguaAkJCQlcCisJbW90aWZfZ29vbTEuaCBtb3RpZl9nb29tMi5oCQkJCVwKKwlwbHVnaW5faW5mby5jIGdvb21fcGx1Z2luX2luZm8uaAkJCVwKKwlnb29tX3Rvb2xzLmMJCQkJCQlcCisJY29uZmlnX3BhcmFtLmMgZmlsdGVycy5jIGdvb21fY29yZS5jIGdyYXBoaWMuYwkJXAorCWdvb20uaCBnb29tX3R5cGVkZWZzLmggZ29vbV9ncmFwaGljLmgJCQlcCisJZ29vbV9jb25maWdfcGFyYW0uaCBnb29tX3Zpc3VhbF9meC5oIGdvb21fZmlsdGVycy5oCVwKKwlnb29tX3Rvb2xzLmggZ29vbV90b29scy5oIGdvb21fY29uZmlnLmgJCQlcCisJJChBUkNIX0ZJTEVTKQorCitsaWJnc3Rnb29tX2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoR09PTV9GSUxURVJfQ0ZMQUdTKSAkKEFSQ0hfQ0ZMQUdTKSAkKE9SQ19DRkxBR1MpCitsaWJnc3Rnb29tX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHBidXRpbHMtJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykgJChMSUJNKSAkKE9SQ19MSUJTKQorbGliZ3N0Z29vbV9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK0VYVFJBX0RJU1QgPSAkKFBQQ19GSUxFUykgJChNTVhfRklMRVMpCisKKy5OT1RQQVJBTExFTDoKZGlmZiAtLWdpdCBhL2dzdC9nb29tL1JFQURNRSBiL2dzdC9nb29tL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGFmMmJhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vUkVBRE1FCkBAIC0wLDAgKzEsMTMgQEAKK1RoZSBHb29tIHBsdWdpbiBpcyBiYXNlZCBvbiB0aGUgR29vbSB2aXN1YWxpemF0aW9uIGNvZGUgZnJvbQordGhlIEdvb20gaG9tZXBhZ2UgZm91bmQgYXQ6IAoraHR0cDovL2lvcy5mcmVlLmZyLz9wYWdlPXByb2pldCZxdW9pPTEgCisKK0xpa2UgdGhlIG9yaWdpbmFsIGxpYnJhcnkgc28gaXMgdGhlIEdvb20gcGx1Z2luIGF2YWlsYWJsZSB1bmRlciB0aGUgTEdQTCBsaWNlbnNlCisKK1RoaXMgaXMgYmFzZWQgb24gZ29vbTJrNCB3aXRoIGNoYW5nZXMgdG8gcGx1Z2luX2luZm8uYyBhbmQgbW14LmggdG8gdXNlIE9yYyBmb3IgQ1BVCitkZXRlY3Rpb24gYW5kIEdTdHJlYW1lci1zcGVjaWZpYyBpZmRlZidzIGZvciBhcmNoaXRlY3R1cmUgZGV0ZWN0aW9uLgorCitUaGVzZSBmaWxlcyBhcmUgbm90IGluIHVzZSByaWdodCBub3c6CitmaWx0ZXJzX21teC5zCitnb29tc2wqCitzdXJmM2QucwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vY29uZmlnX3BhcmFtLmMgYi9nc3QvZ29vbS9jb25maWdfcGFyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTEyNzdmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vY29uZmlnX3BhcmFtLmMKQEAgLTAsMCArMSwxNDIgQEAKKy8qIEdvb20gUHJvamVjdAorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gSmVhbi1DaHJpc3RvcGhlIEhvZWx0IDxqZWtvQGZyZWUuZnI+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImdvb21fY29uZmlnX3BhcmFtLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyB2b2lkCitlbXB0eV9mY3QgKFBsdWdpblBhcmFtICogZHVtbXkpCit7Cit9CisKK3ZvaWQKK2dvb21fc2VjdXJlX3BhcmFtIChQbHVnaW5QYXJhbSAqIHApCit7CisgIHAtPmNoYW5nZWQgPSBlbXB0eV9mY3Q7CisgIHAtPmNoYW5nZV9saXN0ZW5lciA9IGVtcHR5X2ZjdDsKKyAgcC0+dXNlcl9kYXRhID0gMDsKKyAgcC0+bmFtZSA9IHAtPmRlc2MgPSAwOworICBwLT5ydyA9IDE7Cit9CisKK3ZvaWQKK2dvb21fc2VjdXJlX2ZfcGFyYW0gKFBsdWdpblBhcmFtICogcCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgc2VjdXJlX3BhcmFtIChwKTsKKworICBwLT5uYW1lID0gbmFtZTsKKyAgcC0+dHlwZSA9IFBBUkFNX0ZMT0FUVkFMOworICBGVkFMICgqcCkgPSAwLjVmOworICBGTUlOICgqcCkgPSAwLjBmOworICBGTUFYICgqcCkgPSAxLjBmOworICBGU1RFUCAoKnApID0gMC4wMWY7Cit9CisKK3ZvaWQKK2dvb21fc2VjdXJlX2ZfZmVlZGJhY2sgKFBsdWdpblBhcmFtICogcCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgc2VjdXJlX2ZfcGFyYW0gKHAsIG5hbWUpOworCisgIHAtPnJ3ID0gMDsKK30KKwordm9pZAorZ29vbV9zZWN1cmVfc19wYXJhbSAoUGx1Z2luUGFyYW0gKiBwLCBjb25zdCBjaGFyICpuYW1lKQoreworICBzZWN1cmVfcGFyYW0gKHApOworCisgIHAtPm5hbWUgPSBuYW1lOworICBwLT50eXBlID0gUEFSQU1fU1RSVkFMOworICBTVkFMICgqcCkgPSAwOworfQorCit2b2lkCitnb29tX3NlY3VyZV9iX3BhcmFtIChQbHVnaW5QYXJhbSAqIHAsIGNvbnN0IGNoYXIgKm5hbWUsIGludCB2YWx1ZSkKK3sKKyAgc2VjdXJlX3BhcmFtIChwKTsKKworICBwLT5uYW1lID0gbmFtZTsKKyAgcC0+dHlwZSA9IFBBUkFNX0JPT0xWQUw7CisgIEJWQUwgKCpwKSA9IHZhbHVlOworfQorCit2b2lkCitnb29tX3NlY3VyZV9pX3BhcmFtIChQbHVnaW5QYXJhbSAqIHAsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIHNlY3VyZV9wYXJhbSAocCk7CisKKyAgcC0+bmFtZSA9IG5hbWU7CisgIHAtPnR5cGUgPSBQQVJBTV9JTlRWQUw7CisgIElWQUwgKCpwKSA9IDUwOworICBJTUlOICgqcCkgPSAwOworICBJTUFYICgqcCkgPSAxMDA7CisgIElTVEVQICgqcCkgPSAxOworfQorCit2b2lkCitnb29tX3NlY3VyZV9pX2ZlZWRiYWNrIChQbHVnaW5QYXJhbSAqIHAsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIHNlY3VyZV9pX3BhcmFtIChwLCBuYW1lKTsKKworICBwLT5ydyA9IDA7Cit9CisKK3ZvaWQKK2dvb21fcGx1Z2luX3BhcmFtZXRlcnMgKFBsdWdpblBhcmFtZXRlcnMgKiBwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmIpCit7CisgIHAtPm5hbWUgPSBuYW1lOworICBwLT5kZXNjID0gIiI7CisgIHAtPm5iUGFyYW1zID0gbmI7CisgIHAtPnBhcmFtcyA9IG1hbGxvYyAobmIgKiBzaXplb2YgKFBsdWdpblBhcmFtICopKTsKK30KKwordm9pZAorZ29vbV9wbHVnaW5fcGFyYW1ldGVyc19mcmVlIChQbHVnaW5QYXJhbWV0ZXJzICogcCkKK3sKKyAgZnJlZSAocC0+cGFyYW1zKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkCitnb29tX3NldF9zdHJfcGFyYW1fdmFsdWUgKFBsdWdpblBhcmFtICogcCwgY29uc3QgY2hhciAqc3RyKQoreworICBpbnQgbGVuID0gc3RybGVuIChzdHIpOworCisgIGlmIChTVkFMICgqcCkpCisgICAgU1ZBTCAoKnApID0gKGNoYXIgKikgcmVhbGxvYyAoU1ZBTCAoKnApLCBsZW4gKyAxKTsKKyAgZWxzZQorICAgIFNWQUwgKCpwKSA9IChjaGFyICopIG1hbGxvYyAobGVuICsgMSk7CisgIG1lbWNweSAoU1ZBTCAoKnApLCBzdHIsIGxlbiArIDEpOworfQorCit2b2lkCitnb29tX3NldF9saXN0X3BhcmFtX3ZhbHVlIChQbHVnaW5QYXJhbSAqIHAsIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgaW50IGxlbiA9IHN0cmxlbiAoc3RyKTsKKworI2lmZGVmIFZFUkJPU0UKKyAgcHJpbnRmICgiJXM6ICVkXG4iLCBzdHIsIGxlbik7CisjZW5kaWYKKyAgaWYgKExWQUwgKCpwKSkKKyAgICBMVkFMICgqcCkgPSAoY2hhciAqKSByZWFsbG9jIChMVkFMICgqcCksIGxlbiArIDEpOworICBlbHNlCisgICAgTFZBTCAoKnApID0gKGNoYXIgKikgbWFsbG9jIChsZW4gKyAxKTsKKyAgbWVtY3B5IChMVkFMICgqcCksIHN0ciwgbGVuICsgMSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvZ29vbS9jb252b2x2ZV9meC5jIGIvZ3N0L2dvb20vY29udm9sdmVfZnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODBlMTEzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vY29udm9sdmVfZnguYwpAQCAtMCwwICsxLDM2OCBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgImdvb21fZnguaCIKKyNpbmNsdWRlICJnb29tX3BsdWdpbl9pbmZvLmgiCisjaW5jbHVkZSAiZ29vbV9jb25maWcuaCIKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLy8jZGVmaW5lIENPTlZfTU9USUZfVyAzMgorLy8jZGVmaW5lIENPTlZfTU9USUZfV01BU0sgMHgxZgorCisvKiBEZWZpbmUgaWYgeW91IGxpa2UgdGhlIHdhY2t5IEdPT00gbG9nbzogKi8KKyN1bmRlZiBEUkFXX01PVElGCisKKyNkZWZpbmUgQ09OVl9NT1RJRl9XIDEyOAorI2RlZmluZSBDT05WX01PVElGX1dNQVNLIDB4N2YKKwordHlwZWRlZiBjaGFyIE1vdGlmW0NPTlZfTU9USUZfV11bQ09OVl9NT1RJRl9XXTsKKworI2luY2x1ZGUgIm1vdGlmX2dvb20xLmgiCisjaW5jbHVkZSAibW90aWZfZ29vbTIuaCIKKworI2RlZmluZSBOQl9USEVUQSA1MTIKKwordHlwZWRlZiBzdHJ1Y3QgX0NPTlZfREFUQQoreworICBQbHVnaW5QYXJhbSBsaWdodDsKKyAgUGx1Z2luUGFyYW0gZmFjdG9yX2Fkal9wOworICBQbHVnaW5QYXJhbSBmYWN0b3JfcDsKKyAgUGx1Z2luUGFyYW1ldGVycyBwYXJhbXM7CisKKyAgLyogcm90b3pvb20gKi8KKyAgaW50IHRoZXRhOworICBmbG9hdCBmdGhldGE7CisgIGludCBoX3NpbltOQl9USEVUQV07CisgIGludCBoX2Nvc1tOQl9USEVUQV07CisgIGludCBoX2hlaWdodDsKKyAgZmxvYXQgdmlzaWJpbGl0eTsKKyAgTW90aWYgY29udl9tb3RpZjsKKyAgaW50IGludmVyc2VfbW90aWY7CisKK30gQ29udkRhdGE7CisKKy8qIGluaXQgcm90b3pvb20gdGFibGVzICovCitzdGF0aWMgdm9pZAorY29tcHV0ZV90YWJsZXMgKFZpc3VhbEZYICogX3RoaXMsIFBsdWdpbkluZm8gKiBpbmZvKQoreworICBDb252RGF0YSAqZGF0YSA9IChDb252RGF0YSAqKSBfdGhpcy0+ZnhfZGF0YTsKKyAgZG91YmxlIHNjcmVlbl9jb2VmOworICBpbnQgaTsKKyAgZG91YmxlIGg7CisgIGRvdWJsZSByYWRpYW47CisKKyAgaWYgKGRhdGEtPmhfaGVpZ2h0ID09IGluZm8tPnNjcmVlbi5oZWlnaHQpCisgICAgcmV0dXJuOworCisgIHNjcmVlbl9jb2VmID0gMi4wICogMzAwLjAgLyAoZG91YmxlKSBpbmZvLT5zY3JlZW4uaGVpZ2h0OworICBkYXRhLT5oX2hlaWdodCA9IGluZm8tPnNjcmVlbi5oZWlnaHQ7CisKKyAgZm9yIChpID0gMDsgaSA8IE5CX1RIRVRBOyBpKyspIHsKKyAgICByYWRpYW4gPSAyICogaSAqIEdfUEkgLyBOQl9USEVUQTsKKyAgICBoID0gKDAuMiArIGNvcyAocmFkaWFuKSAvIDE1LjAgKiBzaW4gKHJhZGlhbiAqIDIuMCArIDEyLjEyMykpICogc2NyZWVuX2NvZWY7CisgICAgZGF0YS0+aF9jb3NbaV0gPSAweDEwMDAwICogKC1oICogY29zIChyYWRpYW4pICogY29zIChyYWRpYW4pKTsKKyAgICBkYXRhLT5oX3NpbltpXSA9IDB4MTAwMDAgKiAoaCAqIHNpbiAocmFkaWFuICsgMS41NykgKiBzaW4gKHJhZGlhbikpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfbW90aWYgKENvbnZEYXRhICogZGF0YSwgTW90aWYgbW90aWYpCit7CisgIGludCBpLCBqOworCisgIGZvciAoaSA9IDA7IGkgPCBDT05WX01PVElGX1c7ICsraSkKKyAgICBmb3IgKGogPSAwOyBqIDwgQ09OVl9NT1RJRl9XOyArK2opCisgICAgICBkYXRhLT5jb252X21vdGlmW2ldW2pdID0KKyAgICAgICAgICBtb3RpZltDT05WX01PVElGX1cgLSBpIC0gMV1bQ09OVl9NT1RJRl9XIC0gaiAtIDFdOworfQorCitzdGF0aWMgdm9pZAorY29udm9sdmVfaW5pdCAoVmlzdWFsRlggKiBfdGhpcywgUGx1Z2luSW5mbyAqIGluZm8pCit7CisgIENvbnZEYXRhICpkYXRhOworCisgIGRhdGEgPSAoQ29udkRhdGEgKikgbWFsbG9jIChzaXplb2YgKENvbnZEYXRhKSk7CisgIF90aGlzLT5meF9kYXRhID0gKHZvaWQgKikgZGF0YTsKKworICBzZWN1cmVfZl9wYXJhbSAoJmRhdGEtPmxpZ2h0LCAiU2NyZWVuIEJyaWdodG5lc3MiKTsKKyAgZGF0YS0+bGlnaHQucGFyYW0uZnZhbC5tYXggPSAzMDAuMGY7CisgIGRhdGEtPmxpZ2h0LnBhcmFtLmZ2YWwuc3RlcCA9IDEuMGY7CisgIGRhdGEtPmxpZ2h0LnBhcmFtLmZ2YWwudmFsdWUgPSAxMDAuMGY7CisKKyAgc2VjdXJlX2ZfcGFyYW0gKCZkYXRhLT5mYWN0b3JfYWRqX3AsICJGbGFzaCBJbnRlbnNpdHkiKTsKKyAgZGF0YS0+ZmFjdG9yX2Fkal9wLnBhcmFtLmZ2YWwubWF4ID0gMjAwLjBmOworICBkYXRhLT5mYWN0b3JfYWRqX3AucGFyYW0uZnZhbC5zdGVwID0gMS4wZjsKKyAgZGF0YS0+ZmFjdG9yX2Fkal9wLnBhcmFtLmZ2YWwudmFsdWUgPSA3MC4wZjsKKworICBzZWN1cmVfZl9mZWVkYmFjayAoJmRhdGEtPmZhY3Rvcl9wLCAiRmFjdG9yIik7CisKKyAgcGx1Z2luX3BhcmFtZXRlcnMgKCZkYXRhLT5wYXJhbXMsICJCcmlnaHQgRmxhc2giLCA1KTsKKyAgZGF0YS0+cGFyYW1zLnBhcmFtc1swXSA9ICZkYXRhLT5saWdodDsKKyAgZGF0YS0+cGFyYW1zLnBhcmFtc1sxXSA9ICZkYXRhLT5mYWN0b3JfYWRqX3A7CisgIGRhdGEtPnBhcmFtcy5wYXJhbXNbMl0gPSAwOworICBkYXRhLT5wYXJhbXMucGFyYW1zWzNdID0gJmRhdGEtPmZhY3Rvcl9wOworICBkYXRhLT5wYXJhbXMucGFyYW1zWzRdID0gMDsKKworICBkYXRhLT5oX2hlaWdodCA9IDA7CisKKyAgLyogaW5pdCByb3Rvem9vbSB0YWJsZXMgKi8KKyAgY29tcHV0ZV90YWJsZXMgKF90aGlzLCBpbmZvKTsKKyAgZGF0YS0+dGhldGEgPSAwOworICBkYXRhLT5mdGhldGEgPSAwLjA7CisgIGRhdGEtPnZpc2liaWxpdHkgPSAxLjA7CisgIHNldF9tb3RpZiAoZGF0YSwgQ09OVl9NT1RJRjIpOworICBkYXRhLT5pbnZlcnNlX21vdGlmID0gMDsKKworICBfdGhpcy0+cGFyYW1zID0gJmRhdGEtPnBhcmFtczsKK30KKworc3RhdGljIHZvaWQKK2NvbnZvbHZlX2ZyZWUgKFZpc3VhbEZYICogX3RoaXMpCit7CisgIENvbnZEYXRhICpkYXRhID0gKENvbnZEYXRhICopIF90aGlzLT5meF9kYXRhOworCisgIGdvb21fcGx1Z2luX3BhcmFtZXRlcnNfZnJlZSAoJmRhdGEtPnBhcmFtcyk7CisKKyAgZnJlZSAoX3RoaXMtPmZ4X2RhdGEpOworfQorCisjaWZkZWYgRFJBV19NT1RJRgorc3RhdGljIHZvaWQKK2NyZWF0ZV9vdXRwdXRfd2l0aF9icmlnaHRuZXNzIChWaXN1YWxGWCAqIF90aGlzLCBQaXhlbCAqIHNyYywgUGl4ZWwgKiBkZXN0LAorICAgIFBsdWdpbkluZm8gKiBpbmZvLCBpbnQgaWZmKQoreworICBDb252RGF0YSAqZGF0YSA9IChDb252RGF0YSAqKSBfdGhpcy0+ZnhfZGF0YTsKKworICBpbnQgeCwgeTsKKyAgaW50IGkgPSAwOyAgICAgICAgICAgICAgICAgICAgLy9pbmZvLT5zY3JlZW4uaGVpZ2h0ICogaW5mby0+c2NyZWVuLndpZHRoIC0gMTsKKworICBjb25zdCBpbnQgYyA9IGRhdGEtPmhfY29zW2RhdGEtPnRoZXRhXTsKKyAgY29uc3QgaW50IHMgPSBkYXRhLT5oX3NpbltkYXRhLT50aGV0YV07CisKKyAgY29uc3QgaW50IHhpID0gLShpbmZvLT5zY3JlZW4ud2lkdGggLyAyKSAqIGM7CisgIGNvbnN0IGludCB5aSA9IChpbmZvLT5zY3JlZW4ud2lkdGggLyAyKSAqIHM7CisKKyAgY29uc3QgaW50IHhqID0gLShpbmZvLT5zY3JlZW4uaGVpZ2h0IC8gMikgKiBzOworICBjb25zdCBpbnQgeWogPSAtKGluZm8tPnNjcmVlbi5oZWlnaHQgLyAyKSAqIGM7CisKKyAgaW50IHhwcmltZSA9IHhqOworICBpbnQgeXByaW1lID0geWo7CisKKyAgaW50IGlmZnRhYlsxNl07CisKKyAgaWYgKGRhdGEtPmludmVyc2VfbW90aWYpIHsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQorICAgICAgaWZmdGFiW2ldID0gKGRvdWJsZSkgaWZmICooMS4wICsgZGF0YS0+dmlzaWJpbGl0eSAqICgxNS4wIC0gaSkgLyAxNS4wKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQorICAgICAgaWZmdGFiW2ldID0gKGRvdWJsZSkgaWZmIC8gKDEuMCArIGRhdGEtPnZpc2liaWxpdHkgKiAoMTUuMCAtIGkpIC8gMTUuMCk7CisgIH0KKworICBmb3IgKHkgPSBpbmZvLT5zY3JlZW4uaGVpZ2h0OyB5LS07KSB7CisgICAgaW50IHh0ZXgsIHl0ZXg7CisKKyAgICB4dGV4ID0geHByaW1lICsgeGkgKyBDT05WX01PVElGX1cgKiAweDEwMDAwIC8gMjsKKyAgICB4cHJpbWUgKz0gczsKKworICAgIHl0ZXggPSB5cHJpbWUgKyB5aSArIENPTlZfTU9USUZfVyAqIDB4MTAwMDAgLyAyOworICAgIHlwcmltZSArPSBjOworCisjaWZkZWYgSEFWRV9NTVgKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIlxuXHQgcHhvciAgJSVtbTcsICAlJW1tNyIgICAgLyogbW03ID0gMCAgICovCisgICAgICAgICJcblx0IG1vdmQgJVt4dGV4XSwgICUlbW0yIiAiXG5cdCBtb3ZkICVbeXRleF0sICAlJW1tMyIgIlxuXHQgcHVucGNrbGRxICUlbW0zLCAlJW1tMiIgICAvKiBtbTIgPSBbIHl0ZXggfCB4dGV4IF0gKi8KKyAgICAgICAgIlxuXHQgbW92ZCAlW2NdLCAgICAgJSVtbTQiICJcblx0IG1vdmQgJVtzXSwgICAgICUlbW02IiAiXG5cdCBweG9yICAlJW1tNSwgICAlJW1tNSIgIlxuXHQgcHN1YmQgJSVtbTYsICAgJSVtbTUiICJcblx0IHB1bnBja2xkcSAlJW1tNSwgJSVtbTQiICAgLyogbW00ID0gWyAtcyB8IGMgXSAgICAgICovCisgICAgICAgICJcblx0IG1vdmQgJVttb3RpZl0sICUlbW02IiAgICAgLyogbW02ID0gbW90aWYgICAgICAgICAgICovCisgICAgICAgIDo6W3h0ZXhdICJnIiAoeHRleCksW3l0ZXhdICJnIiAoeXRleCkKKyAgICAgICAgLFtjXSAiZyIgKGMpLFtzXSAiZyIgKHMpCisgICAgICAgICxbbW90aWZdICJnIiAoJmRhdGEtPmNvbnZfbW90aWZbMF1bMF0pKTsKKworICAgIGZvciAoeCA9IGluZm8tPnNjcmVlbi53aWR0aDsgeC0tOykgeworICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJcblx0IG1vdmQgICVbc3JjXSwgJSVtbTAiICAvKiBtbTAgPSBzcmMgKi8KKyAgICAgICAgICAiXG5cdCBwYWRkZCAlJW1tNCwgJSVtbTIiICAgICAvKiBbIHl0ZXggfCB4dGV4IF0gKz0gWyAtcyB8IHMgXSAqLworICAgICAgICAgICJcblx0IG1vdmQgICUlZXNpLCAlJW1tNSIgICAgIC8qIHNhdmUgZXNpIGludG8gbW01ICovCisgICAgICAgICAgIlxuXHQgbW92cSAgJSVtbTIsICUlbW0zIiAiXG5cdCBwc3JsZCAgJDE2LCAgJSVtbTMiICAgLyogbW0zID0gWyAoeXRleD4+MTYpIHwgKHh0ZXg+PjE2KSBdICovCisgICAgICAgICAgIlxuXHQgbW92ZCAgJSVtbTMsICUlZWF4IiAgICAgLyogZWF4ID0geHRleCcgKi8KKyAgICAgICAgICAiXG5cdCBwc3JscSAkMjUsICAgJSVtbTMiICJcblx0IG1vdmQgICUlbW0zLCAlJWVjeCIgICAvKiBlY3ggPSB5dGV4JyA8PCA3ICovCisgICAgICAgICAgIlxuXHQgYW5kbCAgJDEyNywgJSVlYXgiICJcblx0IGFuZGwgICQxNjI1NiwgJSVlY3giICJcblx0IGFkZGwgICUlZWN4LCAlJWVheCIgIlxuXHQgbW92ZCAgJSVtbTYsICUlZXNpIiAgICAgICAvKiBlc2kgPSBtb3RpZiAqLworICAgICAgICAgICJcblx0IHhvcmwgICUlZWN4LCAlJWVjeCIgIlxuXHQgbW92YiAgKCUlZWF4LCUlZXNpKSwgJSVjbCIgIlxuXHQgbW92bCAgJVtpZmZ0YWJdLCAlJWVheCIgIlxuXHQgbW92ZCAgJSVtbTUsICUlZXNpIiAgICAvKiByZXN0b3JlIGVzaSBmcm9tIG1tNSAqLworICAgICAgICAgICJcblx0IG1vdmQgICglJWVheCwlJWVjeCw0KSwgJSVtbTEiICAgLyogbW0xID0gWzB8MHwwfGlmZjJdICovCisgICAgICAgICAgIlxuXHQgcHVucGNrbHdkICUlbW0xLCAlJW1tMSIKKyAgICAgICAgICAiXG5cdCBwdW5wY2tsYncgJSVtbTcsICUlbW0wIgorICAgICAgICAgICJcblx0IHB1bnBja2xkcSAlJW1tMSwgJSVtbTEiCisgICAgICAgICAgIlxuXHQgcHNybHcgICAgICQxLCAgICAlJW1tMCIKKyAgICAgICAgICAiXG5cdCBwc3JsdyAgICAgJDIsICAgICUlbW0xIgorICAgICAgICAgICJcblx0IHBtdWxsdyAgICAlJW1tMSwgJSVtbTAiCisgICAgICAgICAgIlxuXHQgcHNybHcgICAgICQ1LCAgICAlJW1tMCIKKyAgICAgICAgICAiXG5cdCBwYWNrdXN3YiAgJSVtbTcsICUlbW0wIgorICAgICAgICAgICJcblx0IG1vdmQgICAgICAlJW1tMCwgJVtkZXN0XSI6W2Rlc3RdICI9ZyIgKGRlc3RbaV0udmFsKQorICAgICAgICAgIDpbc3JjXSAiZyIgKHNyY1tpXS52YWwpCisgICAgICAgICAgLFtpZmZ0YWJdICJnIiAoJmlmZnRhYlswXSkKKyAgICAgICAgICA6ImVheCIsICJlY3giKTsKKworICAgICAgaSsrOworICAgIH0KKyNlbHNlCisgICAgZm9yICh4ID0gaW5mby0+c2NyZWVuLndpZHRoOyB4LS07KSB7CisKKyAgICAgIGludCBpZmYyOworICAgICAgdW5zaWduZWQgaW50IGYwLCBmMSwgZjIsIGYzOworCisgICAgICB4dGV4ICs9IGM7CisgICAgICB5dGV4IC09IHM7CisKKyAgICAgIGlmZjIgPQorICAgICAgICAgIGlmZnRhYlsoaW50KSBkYXRhLT5jb252X21vdGlmWyh5dGV4ID4+IDE2KSAmIENPTlZfTU9USUZfV01BU0tdWyh4dGV4CisgICAgICAgICAgICAgICAgICA+PiAxNikgJiBDT05WX01PVElGX1dNQVNLXV07CisKKyNkZWZpbmUgc2F0KGEpICgoYSk+MHhGRj8weEZGOihhKSkKKyAgICAgIGYwID0gc3JjW2ldLnZhbDsKKyAgICAgIGYxID0gKChmMCA+PiBSX09GRlNFVCkgJiAweEZGKSAqIGlmZjIgPj4gODsKKyAgICAgIGYyID0gKChmMCA+PiBHX09GRlNFVCkgJiAweEZGKSAqIGlmZjIgPj4gODsKKyAgICAgIGYzID0gKChmMCA+PiBCX09GRlNFVCkgJiAweEZGKSAqIGlmZjIgPj4gODsKKyAgICAgIGRlc3RbaV0udmFsID0KKyAgICAgICAgICAoc2F0IChmMSkgPDwgUl9PRkZTRVQpIHwgKHNhdCAoZjIpIDw8IEdfT0ZGU0VUKSB8IChzYXQgKGYzKSA8PAorICAgICAgICAgIEJfT0ZGU0VUKTsKKy8qCisgICAgICBmMCA9IChzcmNbaV0uY29wWzBdICogaWZmMikgPj4gODsKKyAgICAgIGYxID0gKHNyY1tpXS5jb3BbMV0gKiBpZmYyKSA+PiA4OworICAgICAgZjIgPSAoc3JjW2ldLmNvcFsyXSAqIGlmZjIpID4+IDg7CisgICAgICBmMyA9IChzcmNbaV0uY29wWzNdICogaWZmMikgPj4gODsKKworICAgICAgZGVzdFtpXS5jb3BbMF0gPSAoZjAgJiAweGZmZmZmZjAwKSA/IDB4ZmYgOiAodW5zaWduZWQgY2hhcilmMDsKKyAgICAgIGRlc3RbaV0uY29wWzFdID0gKGYxICYgMHhmZmZmZmYwMCkgPyAweGZmIDogKHVuc2lnbmVkIGNoYXIpZjE7CisgICAgICBkZXN0W2ldLmNvcFsyXSA9IChmMiAmIDB4ZmZmZmZmMDApID8gMHhmZiA6ICh1bnNpZ25lZCBjaGFyKWYyOworICAgICAgZGVzdFtpXS5jb3BbM10gPSAoZjMgJiAweGZmZmZmZjAwKSA/IDB4ZmYgOiAodW5zaWduZWQgY2hhcilmMzsKKyovCisgICAgICBpKys7CisgICAgfQorI2VuZGlmCisgIH0KKyNpZmRlZiBIQVZFX01NWAorICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIlxuXHQgZW1tcyIpOworI2VuZGlmCisKKyAgY29tcHV0ZV90YWJsZXMgKF90aGlzLCBpbmZvKTsKK30KKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzdGRpbnQuaD4KKworc3RhdGljIHVpbnQ2NF90IEdldFRpY2soKQoreworICB1aW50NjRfdCB4OworICBhc20gdm9sYXRpbGUgKCJSRFRTQyIgOiAiPUEiICh4KSk7CisgIHJldHVybiB4OworfSovCisKKworc3RhdGljIHZvaWQKK2NvbnZvbHZlX2FwcGx5IChWaXN1YWxGWCAqIF90aGlzLCBQaXhlbCAqIHNyYywgUGl4ZWwgKiBkZXN0LCBQbHVnaW5JbmZvICogaW5mbykKK3sKKworICBDb252RGF0YSAqZGF0YSA9IChDb252RGF0YSAqKSBfdGhpcy0+ZnhfZGF0YTsKKyNpZmRlZiBEUkFXX01PVElGCisgIGZsb2F0IGZmOworICBpbnQgaWZmOworCisgIGZmID0gKEZWQUwgKGRhdGEtPmZhY3Rvcl9wKSAqIEZWQUwgKGRhdGEtPmZhY3Rvcl9hZGpfcCkgKworICAgICAgRlZBTCAoZGF0YS0+bGlnaHQpKSAvIDEwMC4wZjsKKyAgaWZmID0gKHVuc2lnbmVkIGludCkgKGZmICogMjU2KTsKKyNlbmRpZgorCisgIHsKKyAgICBkb3VibGUgZmN5Y2xlID0gKGRvdWJsZSkgaW5mby0+Y3ljbGU7CisgICAgZG91YmxlIHJvdGF0ZV9wYXJhbSwgcm90YXRlX2NvZWY7CisgICAgZmxvYXQgSU5DUkVBU0VfUkFURSA9IDEuNTsKKyAgICBmbG9hdCBERUNBWV9SQVRFID0gMC45NTU7CisKKyAgICBpZiAoRlZBTCAoaW5mby0+c291bmQubGFzdF9nb29tX3ApID4gMC44KQorICAgICAgRlZBTCAoZGF0YS0+ZmFjdG9yX3ApICs9IEZWQUwgKGluZm8tPnNvdW5kLmdvb21fcG93ZXJfcCkgKiBJTkNSRUFTRV9SQVRFOworICAgIEZWQUwgKGRhdGEtPmZhY3Rvcl9wKSAqPSBERUNBWV9SQVRFOworCisgICAgcm90YXRlX3BhcmFtID0gRlZBTCAoaW5mby0+c291bmQubGFzdF9nb29tX3ApOworICAgIGlmIChyb3RhdGVfcGFyYW0gPCAwLjApCisgICAgICByb3RhdGVfcGFyYW0gPSAwLjA7CisgICAgcm90YXRlX3BhcmFtICs9IEZWQUwgKGluZm8tPnNvdW5kLmdvb21fcG93ZXJfcCk7CisKKyAgICByb3RhdGVfY29lZiA9IDQuMCArIEZWQUwgKGluZm8tPnNvdW5kLmdvb21fcG93ZXJfcCkgKiA2LjA7CisgICAgZGF0YS0+ZnRoZXRhID0gKGRhdGEtPmZ0aGV0YSArIHJvdGF0ZV9jb2VmICogc2luIChyb3RhdGVfcGFyYW0gKiA2LjMpKTsKKyAgICBkYXRhLT50aGV0YSA9ICgodW5zaWduZWQgaW50KSBkYXRhLT5mdGhldGEpICUgTkJfVEhFVEE7CisgICAgZGF0YS0+dmlzaWJpbGl0eSA9CisgICAgICAgIChjb3MgKGZjeWNsZSAqIDAuMDAxICsgMS41KSAqIHNpbiAoZmN5Y2xlICogMC4wMDgpICsKKyAgICAgICAgY29zIChmY3ljbGUgKiAwLjAxMSArIDUuMCkgLSAwLjggKyBpbmZvLT5zb3VuZC5zcGVlZHZhcikgKiAxLjU7CisgICAgaWYgKGRhdGEtPnZpc2liaWxpdHkgPCAwLjApCisgICAgICBkYXRhLT52aXNpYmlsaXR5ID0gMC4wOworICAgIGRhdGEtPmZhY3Rvcl9wLmNoYW5nZV9saXN0ZW5lciAoJmRhdGEtPmZhY3Rvcl9wKTsKKyAgfQorCisgIGlmIChkYXRhLT52aXNpYmlsaXR5IDwgMC4wMSkgeworICAgIHN3aXRjaCAoZ29vbV9pcmFuZCAoaW5mby0+Z1JhbmRvbSwgMzAwKSkgeworICAgICAgY2FzZSAxOgorICAgICAgICBzZXRfbW90aWYgKGRhdGEsIENPTlZfTU9USUYxKTsKKyAgICAgICAgZGF0YS0+aW52ZXJzZV9tb3RpZiA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBzZXRfbW90aWYgKGRhdGEsIENPTlZfTU9USUYyKTsKKyAgICAgICAgZGF0YS0+aW52ZXJzZV9tb3RpZiA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorI2lmZGVmIERSQVdfTU9USUYKKyAgaWYgKChmZiA+IDAuOThmKSAmJiAoZmYgPCAxLjAyZikpCisgICAgbWVtY3B5IChkZXN0LCBzcmMsIGluZm8tPnNjcmVlbi5zaXplICogc2l6ZW9mIChQaXhlbCkpOworICBlbHNlCisgICAgY3JlYXRlX291dHB1dF93aXRoX2JyaWdodG5lc3MgKF90aGlzLCBzcmMsIGRlc3QsIGluZm8sIGlmZik7CisjZWxzZQorICBtZW1jcHkgKGRlc3QsIHNyYywgaW5mby0+c2NyZWVuLnNpemUgKiBzaXplb2YgKFBpeGVsKSk7CisjZW5kaWYKKworLyoKKy8vICAgQmVuY2hpbmcgc3VpdGUuLi4KKyAgIHsKKyAgICB1aW50NjRfdCBiZWZvcmUsIGFmdGVyOworICAgIGRvdWJsZSAgIHRpbWVkOworICAgIHN0YXRpYyBkb3VibGUgc3RpbWVkID0gMTAwMDAuMDsKKyAgICBiZWZvcmUgPSBHZXRUaWNrKCk7CisgICAgZGF0YS0+dmlzaWJpbGl0eSA9IDEuMDsKKyAgICBjcmVhdGVfb3V0cHV0X3dpdGhfYnJpZ2h0bmVzcyhfdGhpcyxzcmMsZGVzdCxpbmZvLGlmZik7CisgICAgYWZ0ZXIgID0gR2V0VGljaygpOworICAgIHRpbWVkID0gKGRvdWJsZSkoKGFmdGVyLWJlZm9yZSkgLyBpbmZvLT5zY3JlZW4uc2l6ZSk7CisgICAgaWYgKHRpbWVkIDwgc3RpbWVkKSB7CisgICAgICBzdGltZWQgPSB0aW1lZDsKKyAgICAgIHByaW50ZiAoIkNMSyA9ICUzLjBmIENQUFxuIiwgc3RpbWVkKTsKKyAgICB9CisgIH0KKyovCit9CisKK3ZvaWQKK2NvbnZvbHZlX2NyZWF0ZSAoVmlzdWFsRlggKiB2ZngpCit7CisgIHZmeC0+aW5pdCA9IGNvbnZvbHZlX2luaXQ7CisgIHZmeC0+ZnJlZSA9IGNvbnZvbHZlX2ZyZWU7CisgIHZmeC0+YXBwbHkgPSBjb252b2x2ZV9hcHBseTsKKyAgdmZ4LT5meF9kYXRhID0gTlVMTDsKKyAgdmZ4LT5wYXJhbXMgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vZHJhd21ldGhvZHMuYyBiL2dzdC9nb29tL2RyYXdtZXRob2RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdmMGNmMQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2RyYXdtZXRob2RzLmMKQEAgLTAsMCArMSwyMjIgQEAKKy8qIEdvb20gUHJvamVjdAorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gaU9TLVNvZnR3YXJlCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpbmNsdWRlICJkcmF3bWV0aG9kcy5oIgorCisjZGVmaW5lIERSQVdNRVRIT0RfUExVUyhfb3V0LF9iYWNrYnVmLF9jb2wpIFwKK3tcCisgICAgICBpbnQgdHJhPTAsaT0wO1wKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmJyYSA9ICh1bnNpZ25lZCBjaGFyKikmKF9iYWNrYnVmKTtcCisgICAgICB1bnNpZ25lZCBjaGFyICpkcmEgPSAodW5zaWduZWQgY2hhciopJihfb3V0KTtcCisgICAgICB1bnNpZ25lZCBjaGFyICpjcmEgPSAodW5zaWduZWQgY2hhciopJihfY29sKTtcCisgICAgICBmb3IgKDtpPDQ7aSsrKSB7XAorCQkJCXRyYSA9ICpjcmE7XAorCQkJCXRyYSArPSAqYnJhO1wKKwkJCQlpZiAodHJhPjI1NSkgdHJhPTI1NTtcCisJCQkJKmRyYSA9IHRyYTtcCisJCQkJKytkcmE7KytjcmE7KyticmE7XAorCQkJfVwKK30KKworI2RlZmluZSBEUkFXTUVUSE9EIERSQVdNRVRIT0RfUExVUygqcCwqcCxjb2wpCisKK3ZvaWQKK2RyYXdfbGluZSAoUGl4ZWwgKiBkYXRhLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsIGludCBjb2wsIGludCBzY3JlZW54LAorICAgIGludCBzY3JlZW55KQoreworICBpbnQgeCwgeSwgZHgsIGR5LCB5eSwgeHg7CisgIFBpeGVsICpwOworCisgIGlmICgoeTEgPCAwKSB8fCAoeTIgPCAwKSB8fCAoeDEgPCAwKSB8fCAoeDIgPCAwKSB8fCAoeTEgPj0gc2NyZWVueSkKKyAgICAgIHx8ICh5MiA+PSBzY3JlZW55KSB8fCAoeDEgPj0gc2NyZWVueCkgfHwgKHgyID49IHNjcmVlbngpKQorICAgIHJldHVybjsKKworICAvKiBjbGlwIHRvIHRvcCBlZGdlIAorICAgICBpZiAoKHkxIDwgMCkgJiYgKHkyIDwgMCkpCisgICAgIHJldHVybjsKKworICAgICBpZiAoeTEgPCAwKSB7CisgICAgIHgxICs9ICh5MSAqICh4MSAtIHgyKSkgLyAoeTIgLSB5MSk7CisgICAgIHkxID0gMDsKKyAgICAgfQorICAgICBpZiAoeTIgPCAwKSB7CisgICAgIHgyICs9ICh5MiAqICh4MSAtIHgyKSkgLyAoeTIgLSB5MSk7CisgICAgIHkyID0gMDsKKyAgICAgfQorCisgICAgIGNsaXAgdG8gYm90dG9tIGVkZ2UgCisgICAgIGlmICgoeTEgPj0gc2NyZWVueSkgJiYgKHkyID49IHNjcmVlbnkpKQorICAgICByZXR1cm47CisgICAgIGlmICh5MSA+PSBzY3JlZW55KSB7CisgICAgIHgxIC09ICgoc2NyZWVueSAtIHkxKSAqICh4MSAtIHgyKSkgLyAoeTIgLSB5MSk7CisgICAgIHkxID0gc2NyZWVueSAtIDE7CisgICAgIH0KKyAgICAgaWYgKHkyID49IHNjcmVlbnkpIHsKKyAgICAgeDIgLT0gKChzY3JlZW55IC0geTIpICogKHgxIC0geDIpKSAvICh5MiAtIHkxKTsKKyAgICAgeTIgPSBzY3JlZW55IC0gMTsKKyAgICAgfQorICAgICBjbGlwIHRvIGxlZnQgZWRnZSAKKyAgICAgaWYgKCh4MSA8IDApICYmICh4MiA8IDApKQorICAgICByZXR1cm47CisgICAgIGlmICh4MSA8IDApIHsKKyAgICAgeTEgKz0gKHgxICogKHkxIC0geTIpKSAvICh4MiAtIHgxKTsKKyAgICAgeDEgPSAwOworICAgICB9CisgICAgIGlmICh4MiA8IDApIHsKKyAgICAgeTIgKz0gKHgyICogKHkxIC0geTIpKSAvICh4MiAtIHgxKTsKKyAgICAgeDIgPSAwOworICAgICB9CisgICAgIGNsaXAgdG8gcmlnaHQgZWRnZSAKKyAgICAgaWYgKCh4MSA+PSBzY3JlZW54KSAmJiAoeDIgPj0gc2NyZWVueCkpCisgICAgIHJldHVybjsKKyAgICAgaWYgKHgxID49IHNjcmVlbngpIHsKKyAgICAgeTEgLT0gKChzY3JlZW54IC0geDEpICogKHkxIC0geTIpKSAvICh4MiAtIHgxKTsKKyAgICAgeDEgPSBzY3JlZW54IC0gMTsKKyAgICAgfQorICAgICBpZiAoeDIgPj0gc2NyZWVueCkgeworICAgICB5MiAtPSAoKHNjcmVlbnggLSB4MikgKiAoeTEgLSB5MikpIC8gKHgyIC0geDEpOworICAgICB4MiA9IHNjcmVlbnggLSAxOworICAgICB9CisgICAqLworCisgIGR4ID0geDIgLSB4MTsKKyAgZHkgPSB5MiAtIHkxOworICBpZiAoeDEgPiB4MikgeworICAgIGludCB0bXA7CisKKyAgICB0bXAgPSB4MTsKKyAgICB4MSA9IHgyOworICAgIHgyID0gdG1wOworICAgIHRtcCA9IHkxOworICAgIHkxID0geTI7CisgICAgeTIgPSB0bXA7CisgICAgZHggPSB4MiAtIHgxOworICAgIGR5ID0geTIgLSB5MTsKKyAgfQorCisgIC8qIHZlcnRpY2FsIGxpbmUgKi8KKyAgaWYgKGR4ID09IDApIHsKKyAgICBpZiAoeTEgPCB5MikgeworICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHkxKSArIHgxXSk7CisgICAgICBmb3IgKHkgPSB5MTsgeSA8PSB5MjsgeSsrKSB7CisgICAgICAgIERSQVdNRVRIT0Q7CisgICAgICAgIHAgKz0gc2NyZWVueDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHkyKSArIHgxXSk7CisgICAgICBmb3IgKHkgPSB5MjsgeSA8PSB5MTsgeSsrKSB7CisgICAgICAgIERSQVdNRVRIT0Q7CisgICAgICAgIHAgKz0gc2NyZWVueDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIC8qIGhvcml6b250YWwgbGluZSAqLworICBpZiAoZHkgPT0gMCkgeworICAgIGlmICh4MSA8IHgyKSB7CisgICAgICBwID0gJihkYXRhWyhzY3JlZW54ICogeTEpICsgeDFdKTsKKyAgICAgIGZvciAoeCA9IHgxOyB4IDw9IHgyOyB4KyspIHsKKyAgICAgICAgRFJBV01FVEhPRDsKKyAgICAgICAgcCsrOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICBwID0gJihkYXRhWyhzY3JlZW54ICogeTEpICsgeDJdKTsKKyAgICAgIGZvciAoeCA9IHgyOyB4IDw9IHgxOyB4KyspIHsKKyAgICAgICAgRFJBV01FVEhPRDsKKyAgICAgICAgcCsrOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAvKiAxICAgICovCisgIC8qIFwgICAqLworICAvKiBcICAqLworICAvKiAyICovCisgIGlmICh5MiA+IHkxKSB7CisgICAgLyogc3RlZXAgKi8KKyAgICBpZiAoZHkgPiBkeCkgeworICAgICAgZHggPSAoKGR4IDw8IDE2KSAvIGR5KTsKKyAgICAgIHggPSB4MSA8PCAxNjsKKyAgICAgIGZvciAoeSA9IHkxOyB5IDw9IHkyOyB5KyspIHsKKyAgICAgICAgeHggPSB4ID4+IDE2OworICAgICAgICBwID0gJihkYXRhWyhzY3JlZW54ICogeSkgKyB4eF0pOworICAgICAgICBEUkFXTUVUSE9EOworICAgICAgICBpZiAoeHggPCAoc2NyZWVueCAtIDEpKSB7CisgICAgICAgICAgcCsrOworICAgICAgICAgIC8qIERSQVdNRVRIT0Q7ICovCisgICAgICAgIH0KKyAgICAgICAgeCArPSBkeDsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogc2hhbGxvdyAqLworICAgIGVsc2UgeworICAgICAgZHkgPSAoKGR5IDw8IDE2KSAvIGR4KTsKKyAgICAgIHkgPSB5MSA8PCAxNjsKKyAgICAgIGZvciAoeCA9IHgxOyB4IDw9IHgyOyB4KyspIHsKKyAgICAgICAgeXkgPSB5ID4+IDE2OworICAgICAgICBwID0gJihkYXRhWyhzY3JlZW54ICogeXkpICsgeF0pOworICAgICAgICBEUkFXTUVUSE9EOworICAgICAgICBpZiAoeXkgPCAoc2NyZWVueSAtIDEpKSB7CisgICAgICAgICAgcCArPSBzY3JlZW55OworICAgICAgICAgIC8qIERSQVdNRVRIT0Q7ICovCisgICAgICAgIH0KKyAgICAgICAgeSArPSBkeTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogMiAqLworICAvKiAvICAqLworICAvKiAvICAgKi8KKyAgLyogMSAgICAqLworICBlbHNlIHsKKyAgICAvKiBzdGVlcCAqLworICAgIGlmICgtZHkgPiBkeCkgeworICAgICAgZHggPSAoKGR4IDw8IDE2KSAvIC1keSk7CisgICAgICB4ID0gKHgxICsgMSkgPDwgMTY7CisgICAgICBmb3IgKHkgPSB5MTsgeSA+PSB5MjsgeS0tKSB7CisgICAgICAgIHh4ID0geCA+PiAxNjsKKyAgICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHkpICsgeHhdKTsKKyAgICAgICAgRFJBV01FVEhPRDsKKyAgICAgICAgaWYgKHh4IDwgKHNjcmVlbnggLSAxKSkgeworICAgICAgICAgIHAtLTsKKyAgICAgICAgICAvKiBEUkFXTUVUSE9EOyAqLworICAgICAgICB9CisgICAgICAgIHggKz0gZHg7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIHNoYWxsb3cgKi8KKyAgICBlbHNlIHsKKyAgICAgIGR5ID0gKChkeSA8PCAxNikgLyBkeCk7CisgICAgICB5ID0geTEgPDwgMTY7CisgICAgICBmb3IgKHggPSB4MTsgeCA8PSB4MjsgeCsrKSB7CisgICAgICAgIHl5ID0geSA+PiAxNjsKKyAgICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHl5KSArIHhdKTsKKyAgICAgICAgRFJBV01FVEhPRDsKKyAgICAgICAgaWYgKHl5IDwgKHNjcmVlbnkgLSAxKSkgeworICAgICAgICAgIHAgKz0gc2NyZWVueTsKKyAgICAgICAgICAvKiBEUkFXTUVUSE9EOyAqLworICAgICAgICB9CisgICAgICAgIHkgKz0gZHk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvZ29vbS9kcmF3bWV0aG9kcy5oIGIvZ3N0L2dvb20vZHJhd21ldGhvZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjg2Mjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vZHJhd21ldGhvZHMuaApAQCAtMCwwICsxLDI3IEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZuZGVmIF9EUkFXTUVUSE9EU19ICisjZGVmaW5lIF9EUkFXTUVUSE9EU19ICisKKyNpbmNsdWRlICJnb29tX2NvbmZpZy5oIgorI2luY2x1ZGUgImdvb21fZ3JhcGhpYy5oIgorCit2b2lkIGRyYXdfbGluZSAoUGl4ZWwgKmRhdGEsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IGNvbCwgaW50IHNjcmVlbngsIGludCBzY3JlZW55KTsKKworI2VuZGlmIC8qIF9EUkFXTUVUSE9EU19IICovCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9maWx0ZXJzLmMgYi9nc3QvZ29vbS9maWx0ZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzZDIwMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2ZpbHRlcnMuYwpAQCAtMCwwICsxLDg2MiBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLy8gLS0tIENIVUkgRU4gVFJBSU4gREUgU1VQUFJJTUVSIExFUyBFWFRFUk4gUkVTT0xYIEVUIENfUkVTT0xZIC0tLQorCisvKiBmaWx0ZXIuYyB2ZXJzaW9uIDAuNworKiBjb250aWVudCBsZXMgZmlsdHJlcyBhcHBsaWNhYmxlIGEgdW4gYnVmZmVyCisqIGNyZWF0aW9uIDogMDEvMTAvMjAwMAorKiAgLWFqb3V0IGRlIHNpbkZpbHRlcigpCisqICAtYWpvdXQgZGUgem9vbUZpbHRlcigpCisqICAtY29waWUgZGUgem9vbUZpbHRlcigpIGVuIHpvb21GaWx0ZXJSR0IoKSwgZ2VyYW50IGxlcyAzIGNvdWxldXJzCisqICAtb3B0aW1pc2F0aW9uIGRlIHNpbkZpbHRlciAodXRpbGlzYW50IHVuZSB0YWJsZSBkZSBzaW4pCisqCS1hc20KKyoJLW9wdGltaXNhdGlvbiBkZSBsYSBwcm9jZWR1cmUgZGUgZ2VuZXJhdGlvbiBkdSBidWZmZXIgZGUgdHJhbnNmb3JtYXRpb24KKyoJCWxhIHZpdGVzc2UgZXN0IG1haW50ZW5hbnQgY29tcHJpc2UgZGFucyBbMC4uMTI4XSBhdSBsaWV1IGRlIFswLi4xMDBdCisqLworCisvKiAjZGVmaW5lIF9ERUJVR19QSVhFTCAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdvb21fZmlsdGVycy5oIgorI2luY2x1ZGUgImdvb21fZ3JhcGhpYy5oIgorI2luY2x1ZGUgImdvb21fdG9vbHMuaCIKKyNpbmNsdWRlICJnb29tX3BsdWdpbl9pbmZvLmgiCisjaW5jbHVkZSAiZ29vbV9meC5oIgorI2luY2x1ZGUgInYzZC5oIgorCisvKiBUT0RPIDogTU9WRSBUSElTIEFXQVkgISEhICovCisvKiBqZWtvOiBqJ2FpIGVzc2F5ZXIgZGUgbGUgdmlyZXIsIG1haXMgc2kgb24gdmV1dCBsZXMgbGFpc3NlciBpbmxpbmUgYydlc3QgdW4gcGV1IGxvdXJkby4uLiAqLworc3RhdGljIGlubGluZSB2b2lkCitzZXRQaXhlbFJHQiAoUGx1Z2luSW5mbyAqIGdvb21JbmZvLCBQaXhlbCAqIGJ1ZmZlciwgVWludCB4LCBVaW50IHksIENvbG9yIGMpCit7CisgIFBpeGVsIGk7CisKKyAgaS5jaGFubmVscy5iID0gYy5iOworICBpLmNoYW5uZWxzLmcgPSBjLnY7CisgIGkuY2hhbm5lbHMuciA9IGMucjsKKyAgKihidWZmZXIgKyAoeCArIHkgKiBnb29tSW5mby0+c2NyZWVuLndpZHRoKSkgPSBpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NldFBpeGVsUkdCXyAoUGl4ZWwgKiBidWZmZXIsIFVpbnQgeCwgQ29sb3IgYykKK3sKKyAgYnVmZmVyW3hdLmNoYW5uZWxzLnIgPSBjLnI7CisgIGJ1ZmZlclt4XS5jaGFubmVscy5nID0gYy52OworICBidWZmZXJbeF0uY2hhbm5lbHMuYiA9IGMuYjsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitnZXRQaXhlbFJHQl8gKFBpeGVsICogYnVmZmVyLCBVaW50IHgsIENvbG9yICogYykKK3sKKyAgUGl4ZWwgaSA9ICooYnVmZmVyICsgeCk7CisKKyAgYy0+YiA9IGkuY2hhbm5lbHMuYjsKKyAgYy0+diA9IGkuY2hhbm5lbHMuZzsKKyAgYy0+ciA9IGkuY2hhbm5lbHMucjsKK30KKworLyogRU5EIFRPRE8gKi8KKworCisvKiBERVBSRUNBVEVEICovCisvLyByZXRvdXJuZSB4Pj5zICwgZW4gdGVzdGFudCBsZSBzaWduZSBkZSB4CisvLyNkZWZpbmUgU2hpZnRSaWdodChfeCxfcykgKCgoX3gpPDApID8gLSgtKF94KT4+KF9zKSkgOiAoKF94KT4+KF9zKSkpCisvLyNkZWZpbmUgRUZGRUNUX0RJU1RPUlMgNAorLy8jZGVmaW5lIEVGRkVDVF9ESVNUT1JTX1NMIDIKKy8vI2RlZmluZSBJTlRFUkxBQ0VfQUREIDkKKy8vI2RlZmluZSBJTlRFUkxBQ0VfQU5EIDB4ZgorLyogRU5EIERFUFJFQ0FURUQgKi8KKworI2RlZmluZSBCVUZGUE9JTlROQiAxNgorI2RlZmluZSBCVUZGUE9JTlROQkYgMTYuMGYKKyNkZWZpbmUgQlVGRlBPSU5UTUFTSyAweGZmZmYKKworI2RlZmluZSBzcXJ0cGVydGUgMTYKKy8qIGZhaXJlIDogYSAlIHNxcnRwZXJ0ZSA8PT4gYSAmIHBlcnRlbWFzayAqLworI2RlZmluZSBQRVJURU1BU0sgMHhmCisvKiBmYWlyZSA6IGEgLyBzcXJ0cGVydGUgPD0+IGEgPj4gUEVSVEVERUMgKi8KKyNkZWZpbmUgUEVSVEVERUMgNAorCisvKiBwdXJlIGMgdmVyc2lvbiBvZiB0aGUgem9vbSBmaWx0ZXIgKi8KK3N0YXRpYyB2b2lkIGNfem9vbSAoUGl4ZWwgKiBleHBpeDEsIFBpeGVsICogZXhwaXgyLCB1bnNpZ25lZCBpbnQgcHJldlgsCisgICAgdW5zaWduZWQgaW50IHByZXZZLCBzaWduZWQgaW50ICpicnV0Uywgc2lnbmVkIGludCAqYnJ1dEQsIGludCBidWZmcmF0aW8sCisgICAgaW50IHByZWNhbENvZWZbQlVGRlBPSU5UTkJdW0JVRkZQT0lOVE5CXSk7CisKKy8qIHNpbXBsZSB3cmFwcGVyIHRvIGdpdmUgaXQgdGhlIHNhbWUgcHJvdG8gdGhhbiB0aGUgb3RoZXJzICovCit2b2lkCit6b29tX2ZpbHRlcl9jIChpbnQgc2l6ZVgsIGludCBzaXplWSwgUGl4ZWwgKiBzcmMsIFBpeGVsICogZGVzdCwgaW50ICpicnV0UywKKyAgICBpbnQgKmJydXRELCBpbnQgYnVmZnJhdGlvLCBpbnQgcHJlY2FsQ29lZlsxNl1bMTZdKQoreworICBjX3pvb20gKHNyYywgZGVzdCwgc2l6ZVgsIHNpemVZLCBicnV0UywgYnJ1dEQsIGJ1ZmZyYXRpbywgcHJlY2FsQ29lZik7Cit9CisKK3N0YXRpYyB2b2lkIGdlbmVyYXRlUHJlY2FsQ29lZiAoaW50IHByZWNhbENvZWZbQlVGRlBPSU5UTkJdW0JVRkZQT0lOVE5CXSk7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1pPT01fRklMVEVSX0ZYX1dSQVBQRVJfREFUQQoreworCisgIFBsdWdpblBhcmFtIGVuYWJsZWRfYnA7CisgIFBsdWdpblBhcmFtZXRlcnMgcGFyYW1zOworCisgIHVuc2lnbmVkIGludCAqY29lZmZzLCAqZnJlZWNvZWZmczsKKworICBzaWduZWQgaW50ICpicnV0UywgKmZyZWVicnV0UzsgICAgICAgIC8qIHNvdXJjZSAqLworICBzaWduZWQgaW50ICpicnV0RCwgKmZyZWVicnV0RDsgICAgICAgIC8qIGRlc3QgKi8KKyAgc2lnbmVkIGludCAqYnJ1dFQsICpmcmVlYnJ1dFQ7ICAgICAgICAvKiB0ZW1wIChlbiBjb3VycyBkZSBnZW5lcmF0aW9uKSAqLworCisgIGd1aW50MzIgem9vbV93aWR0aDsKKworICB1bnNpZ25lZCBpbnQgcHJldlgsIHByZXZZOworCisgIGZsb2F0IGdlbmVyYWxfc3BlZWQ7CisgIGludCByZXZlcnNlOyAgICAgICAgICAgICAgICAgIC8qIHJldmVyc2UgdGhlIHNwZWVkICovCisgIGNoYXIgdGhlTW9kZTsKKyAgaW50IHdhdmVFZmZlY3Q7CisgIGludCBoeXBlcmNvc0VmZmVjdDsKKyAgaW50IHZQbGFuZUVmZmVjdDsKKyAgaW50IGhQbGFuZUVmZmVjdDsKKyAgY2hhciBub2lzaWZ5OworICBpbnQgbWlkZGxlWCwgbWlkZGxlWTsKKworICBpbnQgbXVzdEluaXRCdWZmZXJzOworICBpbnQgaW50ZXJsYWNlX3N0YXJ0OworCisgICAgLyoqIG1vZGlmIGJ5IGpla28gOiBmaXhlZHBvaW50IDogYnVmZnJhdGlvbiA9ICgxNjoxNikgKGRvbmMgMDw9YnVmZnJhdGlvbjw9Ml4xNikgKi8KKyAgaW50IGJ1ZmZyYXRpbzsKKyAgaW50ICpmaXJlZGVjOworCisgICAgLyoqIG1vZGlmIGQnb3B0aW0gYnkgSmVrbyA6IHByZWNhbGN1bCBkZXMgNCBjb2VmcyByZXN1bHRhbnQgZGVzIDIgcG9zICovCisgIGludCBwcmVjYWxDb2VmW0JVRkZQT0lOVE5CXVtCVUZGUE9JTlROQl07CisKKyAgICAvKiogY2FsY3VsYXRlUFhhbmRQWSBzdGF0aWNzICovCisgIGludCB3YXZlOworICBpbnQgd2F2ZXNwOworCit9IFpvb21GaWx0ZXJGWFdyYXBwZXJEYXRhOworCisKKworCitzdGF0aWMgaW5saW5lIHZvaWQKK3pvb21WZWN0b3IgKHYyZyAqIHZlY3RldXIsIFpvb21GaWx0ZXJGWFdyYXBwZXJEYXRhICogZGF0YSwgZmxvYXQgWCwgZmxvYXQgWSkKK3sKKyAgZmxvYXQgdngsIHZ5OworICBmbG9hdCBzcV9kaXN0ID0gWCAqIFggKyBZICogWTsKKworICAvKiAgICBzeCA9IChYIDwgMC4wZikgPyAtMS4wZiA6IDEuMGY7CisgICAgIHN5ID0gKFkgPCAwLjBmKSA/IC0xLjBmIDogMS4wZjsKKyAgICovCisgIGZsb2F0IGNvZWZWaXRlc3NlID0gKDEuMGYgKyBkYXRhLT5nZW5lcmFsX3NwZWVkKSAvIDUwLjBmOworCisgIC8vIEVmZmVjdHMKKworICAvKiBDZW50cmFsaXplZCBGWCAqLworCisgIHN3aXRjaCAoZGF0YS0+dGhlTW9kZSkgeworICAgIGNhc2UgQ1JZU1RBTF9CQUxMX01PREU6CisgICAgICBjb2VmVml0ZXNzZSAtPSAoc3FfZGlzdCAtIDAuM2YpIC8gMTUuMGY7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFNVUxFVFRFX01PREU6CisgICAgICBjb2VmVml0ZXNzZSArPSBzcV9kaXN0ICogMy41ZjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV0FWRV9NT0RFOgorICAgICAgY29lZlZpdGVzc2UgKz0gc2luIChzcV9kaXN0ICogMjAuMGYpIC8gMTAwLjBmOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQ1JVTkNIX01PREU6CisgICAgICBjb2VmVml0ZXNzZSArPSBzcV9kaXN0IC8gMTAuMGY7CisgICAgICBicmVhazsKKyAgICAgIC8vY2FzZSBIWVBFUkNPUzFfTU9ERToKKyAgICAgIGJyZWFrOworICAgICAgLy9jYXNlIEhZUEVSQ09TMl9NT0RFOgorICAgICAgYnJlYWs7CisgICAgICAvL2Nhc2UgWU9OTFlfTU9ERToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1BFRURXQVlfTU9ERToKKyAgICAgIGNvZWZWaXRlc3NlICo9IDQuMGYgKiBZOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKGNvZWZWaXRlc3NlIDwgLTIuMDFmKQorICAgIGNvZWZWaXRlc3NlID0gLTIuMDFmOworICBpZiAoY29lZlZpdGVzc2UgPiAyLjAxZikKKyAgICBjb2VmVml0ZXNzZSA9IDIuMDFmOworCisgIHZ4ID0gY29lZlZpdGVzc2UgKiBYOworICB2eSA9IGNvZWZWaXRlc3NlICogWTsKKworICAvKiBBbXVsZXR0ZSAyICovCisgIC8vIHZ4ID0gWCAqIHRhbihkaXN0KTsKKyAgLy8gdnkgPSBZICogdGFuKGRpc3QpOworCisgIC8qIFJvdGF0ZSAqLworICAvL3Z4ID0gKFgrWSkqMC4xOworICAvL3Z5ID0gKFktWCkqMC4xOworCisKKyAgLy8gRWZmZWN0cyBhZGRzLW9uCisKKyAgLyogTm9pc2UgKi8KKyAgaWYgKGRhdGEtPm5vaXNpZnkpIHsKKyAgICB2eCArPSAoKChmbG9hdCkgcmFuZCAoKSkgLyAoKGZsb2F0KSBSQU5EX01BWCkgLSAwLjVmKSAvIDUwLjBmOworICAgIHZ5ICs9ICgoKGZsb2F0KSByYW5kICgpKSAvICgoZmxvYXQpIFJBTkRfTUFYKSAtIDAuNWYpIC8gNTAuMGY7CisgIH0KKworICAvKiBIeXBlcmNvcyAqLworICBpZiAoZGF0YS0+aHlwZXJjb3NFZmZlY3QpIHsKKyAgICB2eCArPSBzaW4gKFkgKiAxMC4wZikgLyAxMjAuMGY7CisgICAgdnkgKz0gc2luIChYICogMTAuMGYpIC8gMTIwLjBmOworICB9CisKKyAgLyogSCBQbGFuZSAqLworICBpZiAoZGF0YS0+aFBsYW5lRWZmZWN0KQorICAgIHZ4ICs9IFkgKiAwLjAwMjVmICogZGF0YS0+aFBsYW5lRWZmZWN0OworCisgIC8qIFYgUGxhbmUgKi8KKyAgaWYgKGRhdGEtPnZQbGFuZUVmZmVjdCkKKyAgICB2eSArPSBYICogMC4wMDI1ZiAqIGRhdGEtPnZQbGFuZUVmZmVjdDsKKworICAvKiBUT0RPIDogV2F0ZXIgTW9kZSAqLworICAvLyAgICBpZiAoZGF0YS0+d2F2ZUVmZmVjdCkKKworICB2ZWN0ZXVyLT54ID0gdng7CisgIHZlY3RldXItPnkgPSB2eTsKK30KKworCisvKgorICogTWFrZXMgYSBzdHJpcGUgb2YgYSB0cmFuc2Zvcm0gYnVmZmVyIChicnV0VCkKKyAqCisgKiBUaGUgdHJhbnNmb3JtIGlzIChpbiBvcmRlcikgOgorICogVHJhbnNsYXRpb24gKC1kYXRhLT5taWRkbGVYLCAtZGF0YS0+bWlkZGxlWSkKKyAqIEhvbW90aGV0aWUgKENlbnRlciA6IDAsMCAgIENvZWZmIDogMi9kYXRhLT5wcmV2WCkKKyAqLworc3RhdGljIHZvaWQKK21ha2Vab29tQnVmZmVyU3RyaXBlIChab29tRmlsdGVyRlhXcmFwcGVyRGF0YSAqIGRhdGEsIGludCBJTlRFUkxBQ0VfSU5DUikKK3sKKyAgLy8gUG9zaXRpb24gb2YgdGhlIHBpeGVsIHRvIGNvbXB1dGUgaW4gcGl4bWFwIGNvb3JkaW5hdGVzCisgIFVpbnQgeCwgeTsKKworICAvLyBXaGVyZSAodmVydGljYWx5KSB0byBzdG9wIGdlbmVyYXRpbmcgdGhlIGJ1ZmZlciBzdHJpcGUKKyAgaW50IG1heEVuZDsKKworICAvLyBSYXRpbyBmcm9tIHBpeG1hcCB0byBub3JtYWxpemVkIGNvb3JkaW5hdGVzCisgIGZsb2F0IHJhdGlvID0gMi4wZiAvICgoZmxvYXQpIGRhdGEtPnByZXZYKTsKKworICAvLyBSYXRpbyBmcm9tIG5vcm1hbGl6ZWQgdG8gdmlydHVhbCBwaXhtYXAgY29vcmRpbmF0ZXMKKyAgZmxvYXQgaW52X3JhdGlvID0gQlVGRlBPSU5UTkJGIC8gcmF0aW87CisgIGZsb2F0IG1pbiA9IHJhdGlvIC8gQlVGRlBPSU5UTkJGOworCisgIC8vIFkgcG9zaXRpb24gb2YgdGhlIHBpeGVsIHRvIGNvbXB1dGUgaW4gbm9ybWFsaXplZCBjb29yZGluYXRlcworICBmbG9hdCBZID0gKChmbG9hdCkgKGRhdGEtPmludGVybGFjZV9zdGFydCAtIGRhdGEtPm1pZGRsZVkpKSAqIHJhdGlvOworCisgIG1heEVuZCA9IGRhdGEtPnByZXZZOworICBpZiAobWF4RW5kID4gKGRhdGEtPmludGVybGFjZV9zdGFydCArIElOVEVSTEFDRV9JTkNSKSkKKyAgICBtYXhFbmQgPSAoZGF0YS0+aW50ZXJsYWNlX3N0YXJ0ICsgSU5URVJMQUNFX0lOQ1IpOworCisgIGZvciAoeSA9IGRhdGEtPmludGVybGFjZV9zdGFydDsKKyAgICAgICh5IDwgZGF0YS0+cHJldlkpICYmICgoc2lnbmVkIGludCkgeSA8IG1heEVuZCk7IHkrKykgeworICAgIFVpbnQgcHJlbXVsX3lfcHJldlggPSB5ICogZGF0YS0+cHJldlggKiAyOworICAgIGZsb2F0IFggPSAtKChmbG9hdCkgZGF0YS0+bWlkZGxlWCkgKiByYXRpbzsKKworICAgIGZvciAoeCA9IDA7IHggPCBkYXRhLT5wcmV2WDsgeCsrKSB7CisgICAgICB2MmcgdmVjdG9yOworCisgICAgICB6b29tVmVjdG9yICgmdmVjdG9yLCBkYXRhLCBYLCBZKTsKKworICAgICAgLyogRmluaXNoIGFuZCBhdm9pZCBudWxsIGRpc3BsYWNlbWVudCAqLworICAgICAgaWYgKGZhYnMgKHZlY3Rvci54KSA8IG1pbikKKyAgICAgICAgdmVjdG9yLnggPSAodmVjdG9yLnggPCAwLjBmKSA/IC1taW4gOiBtaW47CisgICAgICBpZiAoZmFicyAodmVjdG9yLnkpIDwgbWluKQorICAgICAgICB2ZWN0b3IueSA9ICh2ZWN0b3IueSA8IDAuMGYpID8gLW1pbiA6IG1pbjsKKworICAgICAgZGF0YS0+YnJ1dFRbcHJlbXVsX3lfcHJldlhdID0KKyAgICAgICAgICAoKGludCkgKChYIC0gdmVjdG9yLngpICogaW52X3JhdGlvKSArCisgICAgICAgICAgKChpbnQpIChkYXRhLT5taWRkbGVYICogQlVGRlBPSU5UTkIpKSk7CisgICAgICBkYXRhLT5icnV0VFtwcmVtdWxfeV9wcmV2WCArIDFdID0KKyAgICAgICAgICAoKGludCkgKChZIC0gdmVjdG9yLnkpICogaW52X3JhdGlvKSArCisgICAgICAgICAgKChpbnQpIChkYXRhLT5taWRkbGVZICogQlVGRlBPSU5UTkIpKSk7CisgICAgICBwcmVtdWxfeV9wcmV2WCArPSAyOworICAgICAgWCArPSByYXRpbzsKKyAgICB9CisgICAgWSArPSByYXRpbzsKKyAgfQorICBkYXRhLT5pbnRlcmxhY2Vfc3RhcnQgKz0gSU5URVJMQUNFX0lOQ1I7CisgIGlmICh5ID49IGRhdGEtPnByZXZZIC0gMSkKKyAgICBkYXRhLT5pbnRlcmxhY2Vfc3RhcnQgPSAtMTsKK30KKworCisvKgorICogY2FsY3VsZXIgcHggZXQgcHkgZW4gZm9uY3Rpb24gZGUgeCx5LG1pZGRsZVgsbWlkZGxlWSBldCB0aGVNb2RlCisgKiBweCBldCBweSBpbmRpcXVlIGxhIG5vdXZlbGxlIHBvc2l0aW9uIChlbiBzcXJ0cGVydGUgaWVtZSBkZSBwaXhlbCkKKyAqICh2YWxldXIgKiAxNikKKyAKKyBpbmxpbmUgdm9pZCBjYWxjdWxhdGVQWGFuZFBZIChQbHVnaW5JbmZvICpnb29tSW5mbywgWm9vbUZpbHRlckZYV3JhcHBlckRhdGEgKmRhdGEsIGludCB4LCBpbnQgeSwgaW50ICpweCwgaW50ICpweSkKKyB7CisgICAgIGlmIChkYXRhLT50aGVNb2RlID09IFdBVEVSX01PREUpIHsKKyAgICAgICAgIGludCB5eTsKKyAgICAgICAgIAorICAgICAgICAgeXkgPSB5ICsgZ29vbV9pcmFuZChnb29tSW5mby0+Z1JhbmRvbSwgNCkgLSBnb29tX2lyYW5kKGdvb21JbmZvLT5nUmFuZG9tLCA0KSArIGRhdGEtPndhdmUgLyAxMDsKKyAgICAgICAgIGlmICh5eSA8IDApCisgICAgICAgICAgICAgeXkgPSAwOworICAgICAgICAgaWYgKHl5ID49IChzaWduZWQgaW50KWdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0KQorICAgICAgICAgICAgIHl5ID0gZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQgLSAxOworICAgICAgICAgCisgICAgICAgICAqcHggPSAoeCA8PCA0KSArIGRhdGEtPmZpcmVkZWNbeXldICsgKGRhdGEtPndhdmUgLyAxMCk7CisgICAgICAgICAqcHkgPSAoeSA8PCA0KSArIDEzMiAtICgoZGF0YS0+dml0ZXNzZSA8IDEzMSkgPyBkYXRhLT52aXRlc3NlIDogMTMwKTsKKyAgICAgICAgIAorICAgICAgICAgZGF0YS0+d2F2ZXNwICs9IGdvb21faXJhbmQoZ29vbUluZm8tPmdSYW5kb20sIDMpIC0gZ29vbV9pcmFuZChnb29tSW5mby0+Z1JhbmRvbSwgMyk7CisgICAgICAgICBpZiAoZGF0YS0+d2F2ZSA8IC0xMCkKKyAgICAgICAgICAgICBkYXRhLT53YXZlc3AgKz0gMjsKKyAgICAgICAgIGlmIChkYXRhLT53YXZlID4gMTApCisgICAgICAgICAgICAgZGF0YS0+d2F2ZXNwIC09IDI7CisgICAgICAgICBkYXRhLT53YXZlICs9IChkYXRhLT53YXZlc3AgLyAxMCkgKyBnb29tX2lyYW5kKGdvb21JbmZvLT5nUmFuZG9tLCAzKSAtIGdvb21faXJhbmQoZ29vbUluZm8tPmdSYW5kb20sIDMpOworICAgICAgICAgaWYgKGRhdGEtPndhdmVzcCA+IDEwMCkKKyAgICAgICAgICAgICBkYXRhLT53YXZlc3AgPSAoZGF0YS0+d2F2ZXNwICogOSkgLyAxMDsKKyAgICAgfQorICAgICBlbHNlIHsKKyAgICAgICAgIGludCAgICAgZGlzdCA9IDAsIHZ4OSwgdnk5OworICAgICAgICAgaW50ICAgICB2eCwgdnk7CisgICAgICAgICBpbnQgICAgIHBweCwgcHB5OworICAgICAgICAgaW50ICAgICBmdml0ZXNzZSA9IGRhdGEtPnZpdGVzc2UgPDwgNDsKKyAgICAgICAgIAorICAgICAgICAgaWYgKGRhdGEtPm5vaXNpZnkpIHsKKyAgICAgICAgICAgICB4ICs9IGdvb21faXJhbmQoZ29vbUluZm8tPmdSYW5kb20sIGRhdGEtPm5vaXNpZnkpIC0gZ29vbV9pcmFuZChnb29tSW5mby0+Z1JhbmRvbSwgZGF0YS0+bm9pc2lmeSk7CisgICAgICAgICAgICAgeSArPSBnb29tX2lyYW5kKGdvb21JbmZvLT5nUmFuZG9tLCBkYXRhLT5ub2lzaWZ5KSAtIGdvb21faXJhbmQoZ29vbUluZm8tPmdSYW5kb20sIGRhdGEtPm5vaXNpZnkpOworICAgICAgICAgfQorICAgICAgICAgdnggPSAoeCAtIGRhdGEtPm1pZGRsZVgpIDw8IDk7CisgICAgICAgICB2eSA9ICh5IC0gZGF0YS0+bWlkZGxlWSkgPDwgOTsKKyAgICAgICAgIAorICAgICAgICAgaWYgKGRhdGEtPmhQbGFuZUVmZmVjdCkKKyAgICAgICAgICAgICB2eCArPSBkYXRhLT5oUGxhbmVFZmZlY3QgKiAoeSAtIGRhdGEtPm1pZGRsZVkpOworICAgICAgICAgCisgICAgICAgICBpZiAoZGF0YS0+dlBsYW5lRWZmZWN0KQorICAgICAgICAgICAgIHZ5ICs9IGRhdGEtPnZQbGFuZUVmZmVjdCAqICh4IC0gZGF0YS0+bWlkZGxlWCk7CisgICAgICAgICAKKyAgICAgICAgIGlmIChkYXRhLT53YXZlRWZmZWN0KSB7CisgICAgICAgICAgICAgZnZpdGVzc2UgKj0KKyAgICAgICAgICAgICAxMDI0ICsKKyAgICAgICAgICAgICBTaGlmdFJpZ2h0IChnb29tSW5mby0+c2ludGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKHVuc2lnbmVkIHNob3J0KSAoZGlzdCAqIDB4ZmZmZiArIEVGRkVDVF9ESVNUT1JTKV0sIDYpOworICAgICAgICAgICAgIGZ2aXRlc3NlIC89IDEwMjQ7CisgICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgIGlmIChkYXRhLT5oeXBlcmNvc0VmZmVjdCkgeworICAgICAgICAgICAgIHZ4ICs9IFNoaWZ0UmlnaHQgKGdvb21JbmZvLT5zaW50YWJsZVsoLXZ5ICsgZGlzdCkgJiAweGZmZmZdLCAxKTsKKyAgICAgICAgICAgICB2eSArPSBTaGlmdFJpZ2h0IChnb29tSW5mby0+c2ludGFibGVbKHZ4ICsgZGlzdCkgJiAweGZmZmZdLCAxKTsKKyAgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgdng5ID0gU2hpZnRSaWdodCAodngsIDkpOworICAgICAgICAgdnk5ID0gU2hpZnRSaWdodCAodnksIDkpOworICAgICAgICAgZGlzdCA9IHZ4OSAqIHZ4OSArIHZ5OSAqIHZ5OTsKKyAgICAgICAgIAorICAgICAgICAgc3dpdGNoIChkYXRhLT50aGVNb2RlKSB7CisgICAgICAgICAgICAgY2FzZSBXQVZFX01PREU6CisgICAgICAgICAgICAgICAgIGZ2aXRlc3NlICo9CisgICAgICAgICAgICAgICAgIDEwMjQgKworICAgICAgICAgICAgICAgICBTaGlmdFJpZ2h0IChnb29tSW5mby0+c2ludGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyh1bnNpZ25lZCBzaG9ydCkgKGRpc3QgKiAweGZmZmYgKiBFRkZFQ1RfRElTVE9SUyldLCA2KTsKKyAgICAgICAgICAgICAgICAgZnZpdGVzc2U+Pj0xMDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgY2FzZSBDUllTVEFMX0JBTExfTU9ERToKKyAgICAgICAgICAgICAgICAgZnZpdGVzc2UgKz0gKGRpc3QgPj4gKDEwLUVGRkVDVF9ESVNUT1JTX1NMKSk7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIGNhc2UgQU1VTEVUVEVfTU9ERToKKyAgICAgICAgICAgICAgICAgZnZpdGVzc2UgLT0gKGRpc3QgPj4gKDQgLSBFRkZFQ1RfRElTVE9SU19TTCkpOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICBjYXNlIFNDUlVOQ0hfTU9ERToKKyAgICAgICAgICAgICAgICAgZnZpdGVzc2UgLT0gKGRpc3QgPj4gKDEwIC0gRUZGRUNUX0RJU1RPUlNfU0wpKTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgY2FzZSBIWVBFUkNPUzFfTU9ERToKKyAgICAgICAgICAgICAgICAgdnggPSB2eCArIFNoaWZ0UmlnaHQgKGdvb21JbmZvLT5zaW50YWJsZVsoLXZ5ICsgZGlzdCkgJiAweGZmZmZdLCAxKTsKKyAgICAgICAgICAgICAgICAgdnkgPSB2eSArIFNoaWZ0UmlnaHQgKGdvb21JbmZvLT5zaW50YWJsZVsodnggKyBkaXN0KSAmIDB4ZmZmZl0sIDEpOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICBjYXNlIEhZUEVSQ09TMl9NT0RFOgorICAgICAgICAgICAgICAgICB2eCA9CisgICAgICAgICAgICAgICAgIHZ4ICsgU2hpZnRSaWdodCAoZ29vbUluZm8tPnNpbnRhYmxlWygtU2hpZnRSaWdodCAodnksIDEpICsgZGlzdCkgJiAweGZmZmZdLCAwKTsKKyAgICAgICAgICAgICAgICAgdnkgPQorICAgICAgICAgICAgICAgICAgICAgdnkgKyBTaGlmdFJpZ2h0IChnb29tSW5mby0+c2ludGFibGVbKFNoaWZ0UmlnaHQgKHZ4LCAxKSArIGRpc3QpICYgMHhmZmZmXSwgMCk7CisgICAgICAgICAgICAgICAgIGZ2aXRlc3NlID0gMTI4IDw8IDQ7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIGNhc2UgWU9OTFlfTU9ERToKKyAgICAgICAgICAgICAgICAgZnZpdGVzc2UgKj0gMTAyNCArIFNoaWZ0UmlnaHQgKGdvb21JbmZvLT5zaW50YWJsZVt2eSAmIDB4ZmZmZl0sIDYpOworICAgICAgICAgICAgICAgICBmdml0ZXNzZSA+Pj0gMTA7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIGNhc2UgU1BFRURXQVlfTU9ERToKKyAgICAgICAgICAgICAgICAgZnZpdGVzc2UgLT0gKFNoaWZ0UmlnaHQodnksMTAtRUZGRUNUX0RJU1RPUlNfU0wpKTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgIGlmIChmdml0ZXNzZSA8IC0zMDI0KQorICAgICAgICAgICAgIGZ2aXRlc3NlID0gLTMwMjQ7CisgICAgICAgICAKKyAgICAgICAgIGlmICh2eCA8IDApCQkJCQkJCQkJLy8gcGIgYXZlYyBkZWNhbGFnZSBzdXIgbmIgbmVnYXRpZgorICAgICAgICAgICAgIHBweCA9IC0oLSh2eCAqIGZ2aXRlc3NlKSA+PiAxNik7CisgICAgICAgICAvLyAxNiA9IDkgKyA3ICg3ID0gbmIgY2hpZmZyZSB2aXJndWxlIGRlIHZpdGVzc2UgKiAodiA9IDEyOCA9PiBpbW1vYmlsZSkKKyAgICAgICAgIC8vICAgICogKiAqICogKiA5ID0gbmIgY2hpZmZyZSB2aXJndWxlIGRlIHZ4KSAKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBwcHggPSAoKHZ4ICogZnZpdGVzc2UpID4+IDE2KTsKKyAgICAgICAgIAorICAgICAgICAgaWYgKHZ5IDwgMCkKKyAgICAgICAgICAgICBwcHkgPSAtKC0odnkgKiBmdml0ZXNzZSkgPj4gMTYpOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgIHBweSA9ICgodnkgKiBmdml0ZXNzZSkgPj4gMTYpOworICAgICAgICAgCisgICAgICAgICAqcHggPSAoZGF0YS0+bWlkZGxlWCA8PCA0KSArIHBweDsKKyAgICAgICAgICpweSA9IChkYXRhLT5taWRkbGVZIDw8IDQpICsgcHB5OworICAgICB9CisgfQorICovCisKKworCitzdGF0aWMgdm9pZAorY196b29tIChQaXhlbCAqIGV4cGl4MSwgUGl4ZWwgKiBleHBpeDIsIHVuc2lnbmVkIGludCBwcmV2WCwgdW5zaWduZWQgaW50IHByZXZZLAorICAgIHNpZ25lZCBpbnQgKmJydXRTLCBzaWduZWQgaW50ICpicnV0RCwgaW50IGJ1ZmZyYXRpbywgaW50IHByZWNhbENvZWZbMTZdWzE2XSkKK3sKKyAgaW50IG15UG9zLCBteVBvczI7CisgIENvbG9yIGNvdWxldXI7CisKKyAgdW5zaWduZWQgaW50IGF4ID0gKHByZXZYIC0gMSkgPDwgUEVSVEVERUMsIGF5ID0gKHByZXZZIC0gMSkgPDwgUEVSVEVERUM7CisKKyAgaW50IGJ1ZnNpemUgPSBwcmV2WCAqIHByZXZZICogMjsKKyAgaW50IGJ1ZndpZHRoID0gcHJldlg7CisKKyAgZXhwaXgxWzBdLnZhbCA9IGV4cGl4MVtwcmV2WCAtIDFdLnZhbCA9IGV4cGl4MVtwcmV2WCAqIHByZXZZIC0gMV0udmFsID0KKyAgICAgIGV4cGl4MVtwcmV2WCAqIHByZXZZIC0gcHJldlhdLnZhbCA9IDA7CisKKyAgZm9yIChteVBvcyA9IDA7IG15UG9zIDwgYnVmc2l6ZTsgbXlQb3MgKz0gMikgeworICAgIENvbG9yIGNvbDEsIGNvbDIsIGNvbDMsIGNvbDQ7CisgICAgaW50IGMxLCBjMiwgYzMsIGM0LCBweCwgcHk7CisgICAgaW50IHBvczsKKyAgICBpbnQgY29lZmZzOworCisgICAgaW50IGJydXRTbXlwb3MgPSBicnV0U1tteVBvc107CisKKyAgICBteVBvczIgPSBteVBvcyArIDE7CisKKyAgICBweCA9IGJydXRTbXlwb3MgKyAoKChicnV0RFtteVBvc10gLQorICAgICAgICAgICAgICAgIGJydXRTbXlwb3MpICogYnVmZnJhdGlvKSA+PiBCVUZGUE9JTlROQik7CisgICAgYnJ1dFNteXBvcyA9IGJydXRTW215UG9zMl07CisgICAgcHkgPSBicnV0U215cG9zICsgKCgoYnJ1dERbbXlQb3MyXSAtCisgICAgICAgICAgICAgICAgYnJ1dFNteXBvcykgKiBidWZmcmF0aW8pID4+IEJVRkZQT0lOVE5CKTsKKworICAgIGlmICgocHkgPj0gYXkpIHx8IChweCA+PSBheCkpIHsKKyAgICAgIHBvcyA9IGNvZWZmcyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHBvcyA9ICgocHggPj4gUEVSVEVERUMpICsgcHJldlggKiAocHkgPj4gUEVSVEVERUMpKTsKKyAgICAgIC8qIGNvZWYgZW4gbW9kdWxvIDE1ICovCisgICAgICBjb2VmZnMgPSBwcmVjYWxDb2VmW3B4ICYgUEVSVEVNQVNLXVtweSAmIFBFUlRFTUFTS107CisgICAgfQorICAgIGdldFBpeGVsUkdCXyAoZXhwaXgxLCBwb3MsICZjb2wxKTsKKyAgICBnZXRQaXhlbFJHQl8gKGV4cGl4MSwgcG9zICsgMSwgJmNvbDIpOworICAgIGdldFBpeGVsUkdCXyAoZXhwaXgxLCBwb3MgKyBidWZ3aWR0aCwgJmNvbDMpOworICAgIGdldFBpeGVsUkdCXyAoZXhwaXgxLCBwb3MgKyBidWZ3aWR0aCArIDEsICZjb2w0KTsKKworICAgIGMxID0gY29lZmZzOworICAgIGMyID0gKGMxID4+IDgpICYgMHhGRjsKKyAgICBjMyA9IChjMSA+PiAxNikgJiAweEZGOworICAgIGM0ID0gKGMxID4+IDI0KSAmIDB4RkY7CisgICAgYzEgPSBjMSAmIDB4ZmY7CisKKyAgICBjb3VsZXVyLnIgPSBjb2wxLnIgKiBjMSArIGNvbDIuciAqIGMyICsgY29sMy5yICogYzMgKyBjb2w0LnIgKiBjNDsKKyAgICBpZiAoY291bGV1ci5yID4gNSkKKyAgICAgIGNvdWxldXIuciAtPSA1OworICAgIGNvdWxldXIuciA+Pj0gODsKKworICAgIGNvdWxldXIudiA9IGNvbDEudiAqIGMxICsgY29sMi52ICogYzIgKyBjb2wzLnYgKiBjMyArIGNvbDQudiAqIGM0OworICAgIGlmIChjb3VsZXVyLnYgPiA1KQorICAgICAgY291bGV1ci52IC09IDU7CisgICAgY291bGV1ci52ID4+PSA4OworCisgICAgY291bGV1ci5iID0gY29sMS5iICogYzEgKyBjb2wyLmIgKiBjMiArIGNvbDMuYiAqIGMzICsgY29sNC5iICogYzQ7CisgICAgaWYgKGNvdWxldXIuYiA+IDUpCisgICAgICBjb3VsZXVyLmIgLT0gNTsKKyAgICBjb3VsZXVyLmIgPj49IDg7CisKKyAgICBzZXRQaXhlbFJHQl8gKGV4cGl4MiwgbXlQb3MgPj4gMSwgY291bGV1cik7CisgIH0KK30KKworLyoqIGdlbmVyYXRlIHRoZSB3YXRlciBmeCBob3Jpem9udGFsIGRpcmVjdGlvbiBidWZmZXIgKi8KK3N0YXRpYyB2b2lkCitnZW5lcmF0ZVRoZVdhdGVyRlhIb3Jpem9udGFsRGlyZWN0aW9uQnVmZmVyIChQbHVnaW5JbmZvICogZ29vbUluZm8sCisgICAgWm9vbUZpbHRlckZYV3JhcHBlckRhdGEgKiBkYXRhKQoreworCisgIGludCBsb29wdjsKKyAgaW50IGRlY2MgPSBnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgOCkgLSA0OworICBpbnQgc3BkYyA9IGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCA4KSAtIDQ7CisgIGludCBhY2NlbCA9IGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCA4KSAtIDQ7CisKKyAgZm9yIChsb29wdiA9IGRhdGEtPnByZXZZOyBsb29wdiAhPSAwOykgeworCisgICAgbG9vcHYtLTsKKyAgICBkYXRhLT5maXJlZGVjW2xvb3B2XSA9IGRlY2M7CisgICAgZGVjYyArPSBzcGRjIC8gMTA7CisgICAgc3BkYyArPQorICAgICAgICBnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMykgLSBnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMyk7CisKKyAgICBpZiAoZGVjYyA+IDQpCisgICAgICBzcGRjIC09IDE7CisgICAgaWYgKGRlY2MgPCAtNCkKKyAgICAgIHNwZGMgKz0gMTsKKworICAgIGlmIChzcGRjID4gMzApCisgICAgICBzcGRjID0gc3BkYyAtIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAzKSArIGFjY2VsIC8gMTA7CisgICAgaWYgKHNwZGMgPCAtMzApCisgICAgICBzcGRjID0gc3BkYyArIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAzKSArIGFjY2VsIC8gMTA7CisKKyAgICBpZiAoZGVjYyA+IDggJiYgc3BkYyA+IDEpCisgICAgICBzcGRjIC09IGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAzKSAtIDI7CisKKyAgICBpZiAoZGVjYyA8IC04ICYmIHNwZGMgPCAtMSkKKyAgICAgIHNwZGMgKz0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDMpICsgMjsKKworICAgIGlmIChkZWNjID4gOCB8fCBkZWNjIDwgLTgpCisgICAgICBkZWNjID0gZGVjYyAqIDggLyA5OworCisgICAgYWNjZWwgKz0KKyAgICAgICAgZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDIpIC0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDIpOworICAgIGlmIChhY2NlbCA+IDIwKQorICAgICAgYWNjZWwgLT0gMjsKKyAgICBpZiAoYWNjZWwgPCAtMjApCisgICAgICBhY2NlbCArPSAyOworICB9Cit9CisKKworCisvKioKKyogTWFpbiB3b3JrIGZvciB0aGUgZHluYW1pYyBkaXNwbGFjZW1lbnQgbWFwLgorICogCisgKiBSZWFkcyBkYXRhIGZyb20gcGl4MSwgd3JpdGUgdG8gcGl4Mi4KKyAqCisgKiBVc2VmdWwgZGF0YXMgZm9yIHRoaXMgRlggYXJlIHN0b3JlZCBpbiBab29tRmlsdGVyRGF0YS4KKyAqIAorICogSWYgeW91IHRoaW5rIHRoYXQgdGhpcyBpcyBhIHN0cmFuZ2UgZnVuY3Rpb24gbmFtZSwgbGV0IG1lIHNheSB0aGF0IGEgbG9uZyB0aW1lIGFnbywKKyAqICB0aGVyZSBoYXMgYmVlbiBhIHNsb3cgdmVyc2lvbiBhbmQgYSBncmF5LWxldmVsIG9ubHkgb25lLiBUaGVuIGNhbWUgdGhlc2UgZnVuY3Rpb24sCisgKiAgZmFzdCBhbmQgd29ya2luIGluIFJHQiBjb2xvcnNwYWNlICEgbmljZSBidXQgaXQgb25seSB3YXMgYXBwbHlpbmcgYSB6b29tIHRvIHRoZSBpbWFnZS4KKyAqICBTbyB0aGF0IGlzIHdoeSB5b3UgaGF2ZSB0aGlzIG5hbWUsIGZvciB0aGUgbm9zdGFsZ3kgb2YgdGhlIGZpcnN0IGRheXMgb2YgZ29vbQorICogIHdoZW4gaXQgd2FzIGp1c3QgYSB0aW55IHByb2dyYW0gd3JpdGVuIGluIFR1cmJvIFBhc2NhbCBvbiBteSBpNDg2Li4uCisgKi8KK3ZvaWQKK3pvb21GaWx0ZXJGYXN0UkdCIChQbHVnaW5JbmZvICogZ29vbUluZm8sIFBpeGVsICogcGl4MSwgUGl4ZWwgKiBwaXgyLAorICAgIFpvb21GaWx0ZXJEYXRhICogemYsIFVpbnQgcmVzeCwgVWludCByZXN5LCBpbnQgc3dpdGNoSW5jciwgZmxvYXQgc3dpdGNoTXVsdCkKK3sKKyAgVWludCB4LCB5OworCisgIFpvb21GaWx0ZXJGWFdyYXBwZXJEYXRhICpkYXRhID0KKyAgICAgIChab29tRmlsdGVyRlhXcmFwcGVyRGF0YSAqKSBnb29tSW5mby0+em9vbUZpbHRlcl9meC5meF9kYXRhOworCisgIGlmICghQlZBTCAoZGF0YS0+ZW5hYmxlZF9icCkpCisgICAgcmV0dXJuOworCisgICAgLyoqIGNoYW5nZW1lbnQgZGUgdGFpbGxlICoqLworICBpZiAoKGRhdGEtPnByZXZYICE9IHJlc3gpIHx8IChkYXRhLT5wcmV2WSAhPSByZXN5KSkgeworICAgIGRhdGEtPnByZXZYID0gcmVzeDsKKyAgICBkYXRhLT5wcmV2WSA9IHJlc3k7CisKKyAgICBpZiAoZGF0YS0+YnJ1dFMpCisgICAgICBmcmVlIChkYXRhLT5mcmVlYnJ1dFMpOworICAgIGRhdGEtPmJydXRTID0gMDsKKyAgICBpZiAoZGF0YS0+YnJ1dEQpCisgICAgICBmcmVlIChkYXRhLT5mcmVlYnJ1dEQpOworICAgIGRhdGEtPmJydXREID0gMDsKKyAgICBpZiAoZGF0YS0+YnJ1dFQpCisgICAgICBmcmVlIChkYXRhLT5mcmVlYnJ1dFQpOworICAgIGRhdGEtPmJydXRUID0gMDsKKworICAgIGRhdGEtPm1pZGRsZVggPSByZXN4IC8gMjsKKyAgICBkYXRhLT5taWRkbGVZID0gcmVzeSAvIDI7CisgICAgZGF0YS0+bXVzdEluaXRCdWZmZXJzID0gMTsKKyAgICBpZiAoZGF0YS0+ZmlyZWRlYykKKyAgICAgIGZyZWUgKGRhdGEtPmZpcmVkZWMpOworICAgIGRhdGEtPmZpcmVkZWMgPSAwOworICB9CisKKyAgaWYgKGRhdGEtPmludGVybGFjZV9zdGFydCAhPSAtMikKKyAgICB6ZiA9IE5VTEw7CisKKyAgICAvKiogY2hhbmdlbWVudCBkZSBjb25maWcgKiovCisgIGlmICh6ZikgeworICAgIGRhdGEtPnJldmVyc2UgPSB6Zi0+cmV2ZXJzZTsKKyAgICBkYXRhLT5nZW5lcmFsX3NwZWVkID0gKGZsb2F0KSAoemYtPnZpdGVzc2UgLSAxMjgpIC8gMTI4LjBmOworICAgIGlmIChkYXRhLT5yZXZlcnNlKQorICAgICAgZGF0YS0+Z2VuZXJhbF9zcGVlZCA9IC1kYXRhLT5nZW5lcmFsX3NwZWVkOworICAgIGRhdGEtPm1pZGRsZVggPSB6Zi0+bWlkZGxlWDsKKyAgICBkYXRhLT5taWRkbGVZID0gemYtPm1pZGRsZVk7CisgICAgZGF0YS0+dGhlTW9kZSA9IHpmLT5tb2RlOworICAgIGRhdGEtPmhQbGFuZUVmZmVjdCA9IHpmLT5oUGxhbmVFZmZlY3Q7CisgICAgZGF0YS0+dlBsYW5lRWZmZWN0ID0gemYtPnZQbGFuZUVmZmVjdDsKKyAgICBkYXRhLT53YXZlRWZmZWN0ID0gemYtPndhdmVFZmZlY3Q7CisgICAgZGF0YS0+aHlwZXJjb3NFZmZlY3QgPSB6Zi0+aHlwZXJjb3NFZmZlY3Q7CisgICAgZGF0YS0+bm9pc2lmeSA9IHpmLT5ub2lzaWZ5OworICAgIGRhdGEtPmludGVybGFjZV9zdGFydCA9IDA7CisgIH0KKworCisgIGlmIChkYXRhLT5tdXN0SW5pdEJ1ZmZlcnMpIHsKKworICAgIGRhdGEtPm11c3RJbml0QnVmZmVycyA9IDA7CisgICAgZGF0YS0+ZnJlZWJydXRTID0KKyAgICAgICAgKHNpZ25lZCBpbnQgKikgY2FsbG9jIChyZXN4ICogcmVzeSAqIDIgKyAxMjgsIHNpemVvZiAodW5zaWduZWQgaW50KSk7CisgICAgZGF0YS0+YnJ1dFMgPQorICAgICAgICAoZ2ludDMyICopICgoMSArICgodWludHB0cl90KSAoZGF0YS0+ZnJlZWJydXRTKSkgLyAxMjgpICogMTI4KTsKKworICAgIGRhdGEtPmZyZWVicnV0RCA9CisgICAgICAgIChzaWduZWQgaW50ICopIGNhbGxvYyAocmVzeCAqIHJlc3kgKiAyICsgMTI4LCBzaXplb2YgKHVuc2lnbmVkIGludCkpOworICAgIGRhdGEtPmJydXREID0KKyAgICAgICAgKGdpbnQzMiAqKSAoKDEgKyAoKHVpbnRwdHJfdCkgKGRhdGEtPmZyZWVicnV0RCkpIC8gMTI4KSAqIDEyOCk7CisKKyAgICBkYXRhLT5mcmVlYnJ1dFQgPQorICAgICAgICAoc2lnbmVkIGludCAqKSBjYWxsb2MgKHJlc3ggKiByZXN5ICogMiArIDEyOCwgc2l6ZW9mICh1bnNpZ25lZCBpbnQpKTsKKyAgICBkYXRhLT5icnV0VCA9CisgICAgICAgIChnaW50MzIgKikgKCgxICsgKCh1aW50cHRyX3QpIChkYXRhLT5mcmVlYnJ1dFQpKSAvIDEyOCkgKiAxMjgpOworCisgICAgZGF0YS0+YnVmZnJhdGlvID0gMDsKKworICAgIGRhdGEtPmZpcmVkZWMgPSAoaW50ICopIG1hbGxvYyAoZGF0YS0+cHJldlkgKiBzaXplb2YgKGludCkpOworICAgIGdlbmVyYXRlVGhlV2F0ZXJGWEhvcml6b250YWxEaXJlY3Rpb25CdWZmZXIgKGdvb21JbmZvLCBkYXRhKTsKKworICAgIGRhdGEtPmludGVybGFjZV9zdGFydCA9IDA7CisgICAgbWFrZVpvb21CdWZmZXJTdHJpcGUgKGRhdGEsIHJlc3kpOworCisgICAgLyogQ29weSB0aGUgZGF0YSBmcm9tIHRlbXAgdG8gZGVzdCBhbmQgc291cmNlICovCisgICAgbWVtY3B5IChkYXRhLT5icnV0UywgZGF0YS0+YnJ1dFQsIHJlc3ggKiByZXN5ICogMiAqIHNpemVvZiAoaW50KSk7CisgICAgbWVtY3B5IChkYXRhLT5icnV0RCwgZGF0YS0+YnJ1dFQsIHJlc3ggKiByZXN5ICogMiAqIHNpemVvZiAoaW50KSk7CisgIH0KKworICAvKiBnZW5lcmF0aW9uIGR1IGJ1ZmZlciBkZSB0cmFucyAqLworICBpZiAoZGF0YS0+aW50ZXJsYWNlX3N0YXJ0ID09IC0xKSB7CisKKyAgICAvKiBzYXV2ZWdhcmRlIGRlIGwnZXRhdCBhY3R1ZWwgZGFucyBsYSBub3V2ZWxsZSBzb3VyY2UKKyAgICAgKiBUT0RPOiB3cml0ZSB0aGF0IGluIE1NWCAoaGFzIGJlZW4gZG9uZSBpbiBwcmV2aW91cyB2ZXJzaW9uLCBidXQgZGlkIG5vdCBmb2xsb3cgc29tZSBuZXcgZm9uY3Rpb25uYWxpdGllcykgKi8KKyAgICB5ID0gZGF0YS0+cHJldlggKiBkYXRhLT5wcmV2WSAqIDI7CisgICAgZm9yICh4ID0gMDsgeCA8IHk7IHggKz0gMikgeworICAgICAgaW50IGJydXRTbXlwb3MgPSBkYXRhLT5icnV0U1t4XTsKKyAgICAgIGludCB4MiA9IHggKyAxOworCisgICAgICBkYXRhLT5icnV0U1t4XSA9CisgICAgICAgICAgYnJ1dFNteXBvcyArICgoKGRhdGEtPmJydXREW3hdIC0KKyAgICAgICAgICAgICAgICAgIGJydXRTbXlwb3MpICogZGF0YS0+YnVmZnJhdGlvKSA+PiBCVUZGUE9JTlROQik7CisgICAgICBicnV0U215cG9zID0gZGF0YS0+YnJ1dFNbeDJdOworICAgICAgZGF0YS0+YnJ1dFNbeDJdID0KKyAgICAgICAgICBicnV0U215cG9zICsgKCgoZGF0YS0+YnJ1dERbeDJdIC0KKyAgICAgICAgICAgICAgICAgIGJydXRTbXlwb3MpICogZGF0YS0+YnVmZnJhdGlvKSA+PiBCVUZGUE9JTlROQik7CisgICAgfQorICAgIGRhdGEtPmJ1ZmZyYXRpbyA9IDA7CisgIH0KKworICBpZiAoZGF0YS0+aW50ZXJsYWNlX3N0YXJ0ID09IC0xKSB7CisgICAgc2lnbmVkIGludCAqdG1wOworCisgICAgdG1wID0gZGF0YS0+YnJ1dEQ7CisgICAgZGF0YS0+YnJ1dEQgPSBkYXRhLT5icnV0VDsKKyAgICBkYXRhLT5icnV0VCA9IHRtcDsKKyAgICB0bXAgPSBkYXRhLT5mcmVlYnJ1dEQ7CisgICAgZGF0YS0+ZnJlZWJydXREID0gZGF0YS0+ZnJlZWJydXRUOworICAgIGRhdGEtPmZyZWVicnV0VCA9IHRtcDsKKyAgICBkYXRhLT5pbnRlcmxhY2Vfc3RhcnQgPSAtMjsKKyAgfQorCisgIGlmIChkYXRhLT5pbnRlcmxhY2Vfc3RhcnQgPj0gMCkgeworICAgIC8qIGNyZWF0aW9uIGRlIGxhIG5vdXZlbGxlIGRlc3RpbmF0aW9uICovCisgICAgbWFrZVpvb21CdWZmZXJTdHJpcGUgKGRhdGEsIHJlc3kgLyAxNik7CisgIH0KKworICBpZiAoc3dpdGNoSW5jciAhPSAwKSB7CisgICAgZGF0YS0+YnVmZnJhdGlvICs9IHN3aXRjaEluY3I7CisgICAgaWYgKGRhdGEtPmJ1ZmZyYXRpbyA+IEJVRkZQT0lOVE1BU0spCisgICAgICBkYXRhLT5idWZmcmF0aW8gPSBCVUZGUE9JTlRNQVNLOworICB9CisKKyAgaWYgKHN3aXRjaE11bHQgIT0gMS4wZikgeworICAgIGRhdGEtPmJ1ZmZyYXRpbyA9IChpbnQpICgoZmxvYXQpIEJVRkZQT0lOVE1BU0sgKiAoMS4wZiAtIHN3aXRjaE11bHQpICsKKyAgICAgICAgKGZsb2F0KSBkYXRhLT5idWZmcmF0aW8gKiBzd2l0Y2hNdWx0KTsKKyAgfQorCisgIGRhdGEtPnpvb21fd2lkdGggPSBkYXRhLT5wcmV2WDsKKworICBnb29tSW5mby0+bWV0aG9kcy56b29tX2ZpbHRlciAoZGF0YS0+cHJldlgsIGRhdGEtPnByZXZZLCBwaXgxLCBwaXgyLAorICAgICAgZGF0YS0+YnJ1dFMsIGRhdGEtPmJydXRELCBkYXRhLT5idWZmcmF0aW8sIGRhdGEtPnByZWNhbENvZWYpOworfQorCitzdGF0aWMgdm9pZAorZ2VuZXJhdGVQcmVjYWxDb2VmIChpbnQgcHJlY2FsQ29lZlsxNl1bMTZdKQoreworICBpbnQgY29lZmgsIGNvZWZ2OworCisgIGZvciAoY29lZmggPSAwOyBjb2VmaCA8IDE2OyBjb2VmaCsrKSB7CisgICAgZm9yIChjb2VmdiA9IDA7IGNvZWZ2IDwgMTY7IGNvZWZ2KyspIHsKKworICAgICAgaW50IGk7CisgICAgICBpbnQgZGlmZmNvZWZmaDsKKyAgICAgIGludCBkaWZmY29lZmZ2OworCisgICAgICBkaWZmY29lZmZoID0gc3FydHBlcnRlIC0gY29lZmg7CisgICAgICBkaWZmY29lZmZ2ID0gc3FydHBlcnRlIC0gY29lZnY7CisKKyAgICAgIGlmICghKGNvZWZoIHx8IGNvZWZ2KSkgeworICAgICAgICBpID0gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgVWludCBpMSwgaTIsIGkzLCBpNDsKKworICAgICAgICBpMSA9IGRpZmZjb2VmZmggKiBkaWZmY29lZmZ2OworICAgICAgICBpMiA9IGNvZWZoICogZGlmZmNvZWZmdjsKKyAgICAgICAgaTMgPSBkaWZmY29lZmZoICogY29lZnY7CisgICAgICAgIGk0ID0gY29lZmggKiBjb2VmdjsKKworICAgICAgICAvLyBUT0RPOiBmYWlyZSBtaWV1eC4uLgorICAgICAgICBpZiAoaTEpCisgICAgICAgICAgaTEtLTsKKyAgICAgICAgaWYgKGkyKQorICAgICAgICAgIGkyLS07CisgICAgICAgIGlmIChpMykKKyAgICAgICAgICBpMy0tOworICAgICAgICBpZiAoaTQpCisgICAgICAgICAgaTQtLTsKKworICAgICAgICBpID0gKGkxKSB8IChpMiA8PCA4KSB8IChpMyA8PCAxNikgfCAoaTQgPDwgMjQpOworICAgICAgfQorICAgICAgcHJlY2FsQ29lZltjb2VmaF1bY29lZnZdID0gaTsKKyAgICB9CisgIH0KK30KKworLyogVmlzdWFsRlggV3JhcHBlciAqLworCitzdGF0aWMgdm9pZAorem9vbUZpbHRlclZpc3VhbEZYV3JhcHBlcl9pbml0IChzdHJ1Y3QgX1ZJU1VBTF9GWCAqX3RoaXMsIFBsdWdpbkluZm8gKiBpbmZvKQoreworICBab29tRmlsdGVyRlhXcmFwcGVyRGF0YSAqZGF0YSA9CisgICAgICAoWm9vbUZpbHRlckZYV3JhcHBlckRhdGEgKikgbWFsbG9jIChzaXplb2YgKFpvb21GaWx0ZXJGWFdyYXBwZXJEYXRhKSk7CisKKyAgZGF0YS0+Y29lZmZzID0gMDsKKyAgZGF0YS0+ZnJlZWNvZWZmcyA9IDA7CisgIGRhdGEtPmJydXRTID0gMDsKKyAgZGF0YS0+ZnJlZWJydXRTID0gMDsKKyAgZGF0YS0+YnJ1dEQgPSAwOworICBkYXRhLT5mcmVlYnJ1dEQgPSAwOworICBkYXRhLT5icnV0VCA9IDA7CisgIGRhdGEtPmZyZWVicnV0VCA9IDA7CisgIGRhdGEtPnByZXZYID0gMDsKKyAgZGF0YS0+cHJldlkgPSAwOworCisgIGRhdGEtPm11c3RJbml0QnVmZmVycyA9IDE7CisgIGRhdGEtPmludGVybGFjZV9zdGFydCA9IC0yOworCisgIGRhdGEtPmdlbmVyYWxfc3BlZWQgPSAwLjBmOworICBkYXRhLT5yZXZlcnNlID0gMDsKKyAgZGF0YS0+dGhlTW9kZSA9IEFNVUxFVFRFX01PREU7CisgIGRhdGEtPndhdmVFZmZlY3QgPSAwOworICBkYXRhLT5oeXBlcmNvc0VmZmVjdCA9IDA7CisgIGRhdGEtPnZQbGFuZUVmZmVjdCA9IDA7CisgIGRhdGEtPmhQbGFuZUVmZmVjdCA9IDA7CisgIGRhdGEtPm5vaXNpZnkgPSAyOworCisgICAgLyoqIG1vZGlmIGJ5IGpla28gOiBmaXhlZHBvaW50IDogYnVmZnJhdGlvbiA9ICgxNjoxNikgKGRvbmMgMDw9YnVmZnJhdGlvbjw9Ml4xNikgKi8KKyAgZGF0YS0+YnVmZnJhdGlvID0gMDsKKyAgZGF0YS0+ZmlyZWRlYyA9IDA7CisKKyAgZGF0YS0+d2F2ZSA9IGRhdGEtPndhdmVzcCA9IDA7CisKKyAgc2VjdXJlX2JfcGFyYW0gKCZkYXRhLT5lbmFibGVkX2JwLCAiRW5hYmxlZCIsIDEpOworCisgIHBsdWdpbl9wYXJhbWV0ZXJzICgmZGF0YS0+cGFyYW1zLCAiWm9vbSBGaWx0ZXIiLCAxKTsKKyAgZGF0YS0+cGFyYW1zLnBhcmFtc1swXSA9ICZkYXRhLT5lbmFibGVkX2JwOworCisgIF90aGlzLT5wYXJhbXMgPSAmZGF0YS0+cGFyYW1zOworICBfdGhpcy0+ZnhfZGF0YSA9ICh2b2lkICopIGRhdGE7CisKKyAgICAvKiogbW9kaWYgZCdvcHRpbSBieSBKZWtvIDogcHJlY2FsY3VsIGRlcyA0IGNvZWZzIHJlc3VsdGFudCBkZXMgMiBwb3MgKi8KKyAgZ2VuZXJhdGVQcmVjYWxDb2VmIChkYXRhLT5wcmVjYWxDb2VmKTsKK30KKworc3RhdGljIHZvaWQKK3pvb21GaWx0ZXJWaXN1YWxGWFdyYXBwZXJfZnJlZSAoc3RydWN0IF9WSVNVQUxfRlggKl90aGlzKQoreworICBab29tRmlsdGVyRlhXcmFwcGVyRGF0YSAqZGF0YSA9IChab29tRmlsdGVyRlhXcmFwcGVyRGF0YSAqKSBfdGhpcy0+ZnhfZGF0YTsKKworICBpZiAoZGF0YS0+ZnJlZWJydXRUKQorICAgIGZyZWUgKGRhdGEtPmZyZWVicnV0VCk7CisgIGlmIChkYXRhLT5mcmVlYnJ1dFMpCisgICAgZnJlZSAoZGF0YS0+ZnJlZWJydXRTKTsKKyAgaWYgKGRhdGEtPmZyZWVicnV0RCkKKyAgICBmcmVlIChkYXRhLT5mcmVlYnJ1dEQpOworICBpZiAoZGF0YS0+ZmlyZWRlYykKKyAgICBmcmVlIChkYXRhLT5maXJlZGVjKTsKKworICBnb29tX3BsdWdpbl9wYXJhbWV0ZXJzX2ZyZWUgKF90aGlzLT5wYXJhbXMpOworCisgIGZyZWUgKF90aGlzLT5meF9kYXRhKTsKK30KKworc3RhdGljIHZvaWQKK3pvb21GaWx0ZXJWaXN1YWxGWFdyYXBwZXJfYXBwbHkgKHN0cnVjdCBfVklTVUFMX0ZYICpfdGhpcywgUGl4ZWwgKiBzcmMsCisgICAgUGl4ZWwgKiBkZXN0LCBQbHVnaW5JbmZvICogaW5mbykKK3sKK30KKwordm9pZAorem9vbUZpbHRlclZpc3VhbEZYV3JhcHBlcl9jcmVhdGUgKFZpc3VhbEZYICogZngpCit7CisgIGZ4LT5pbml0ID0gem9vbUZpbHRlclZpc3VhbEZYV3JhcHBlcl9pbml0OworICBmeC0+ZnJlZSA9IHpvb21GaWx0ZXJWaXN1YWxGWFdyYXBwZXJfZnJlZTsKKyAgZngtPmFwcGx5ID0gem9vbUZpbHRlclZpc3VhbEZYV3JhcHBlcl9hcHBseTsKKyAgZngtPnBhcmFtcyA9IE5VTEw7CisgIGZ4LT5meF9kYXRhID0gTlVMTDsKK30KKworCisvKiBUT0RPIDogTU9WRSBUSElTIEFXQVkgKi8KKwordm9pZAorcG9pbnRGaWx0ZXIgKFBsdWdpbkluZm8gKiBnb29tSW5mbywgUGl4ZWwgKiBwaXgxLCBDb2xvciBjLCBmbG9hdCB0MSwgZmxvYXQgdDIsCisgICAgZmxvYXQgdDMsIGZsb2F0IHQ0LCBVaW50IGN5Y2xlKQoreworICBVaW50IHggPSAoVWludCkgKChpbnQpIChnb29tSW5mby0+c2NyZWVuLndpZHRoIC8gMikKKyAgICAgICsgKGludCkgKHQxICogY29zICgoZmxvYXQpIGN5Y2xlIC8gdDMpKSk7CisgIFVpbnQgeSA9IChVaW50KSAoKGludCkgKGdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0IC8gMikKKyAgICAgICsgKGludCkgKHQyICogc2luICgoZmxvYXQpIGN5Y2xlIC8gdDQpKSk7CisKKyAgaWYgKCh4ID4gMSkgJiYgKHkgPiAxKSAmJiAoeCA8IGdvb21JbmZvLT5zY3JlZW4ud2lkdGggLSAyKQorICAgICAgJiYgKHkgPCBnb29tSW5mby0+c2NyZWVuLmhlaWdodCAtIDIpKSB7CisgICAgc2V0UGl4ZWxSR0IgKGdvb21JbmZvLCBwaXgxLCB4ICsgMSwgeSwgYyk7CisgICAgc2V0UGl4ZWxSR0IgKGdvb21JbmZvLCBwaXgxLCB4LCB5ICsgMSwgYyk7CisgICAgc2V0UGl4ZWxSR0IgKGdvb21JbmZvLCBwaXgxLCB4ICsgMSwgeSArIDEsIFdISVRFKTsKKyAgICBzZXRQaXhlbFJHQiAoZ29vbUluZm8sIHBpeDEsIHggKyAyLCB5ICsgMSwgYyk7CisgICAgc2V0UGl4ZWxSR0IgKGdvb21JbmZvLCBwaXgxLCB4ICsgMSwgeSArIDIsIGMpOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvZ29vbS9maWx0ZXJzX21teC5zIGIvZ3N0L2dvb20vZmlsdGVyc19tbXgucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzIwZDA1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vZmlsdGVyc19tbXgucwpAQCAtMCwwICsxLDIxNiBAQAorOyBHb29tIFByb2plY3QKKzsgQ29weXJpZ2h0IChDKSA8MjAwMT4gSmVhbi1DaHJpc3RvcGhlIEhvZWx0IDxqZWtvQGZyZWUuZnI+Cis7Cis7IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKzsgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsKKzsgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOworOyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworOyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorOyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKzsgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCis7Cis7Ly8KKzsvLyBoaXN0b3J5Cis7Ly8gMDcvMDEvMjAwMSA6IENoYW5naW5nIEZFTU1TIHRvIEVNTVMgOiBzbG93ZXIuLi4gYnV0IHJ1biBvbiBpbnRlbCBtYWNoaW5lcworOy8vCTAzLzAxLzIwMDEgOiBXSURUSCBhbmQgSEVJR0hUIGFyZSBub3cgdmFyaWFibGUKKzsvLwkyOC8xMi8yMDAwIDogYWRkaW5nIGNvbW1lbnRzIHRvIHRoZSBjb2RlLCBzdXBwcmVzcyBzb21lIHVzZWxlc3MgbGluZXMKKzsvLwkyNy8xMi8yMDAwIDogcmVkdWNpbmcgbWVtb3J5IGFjY2Vzcy4uLiBpbXByb3ZpbmcgcGVyZm9ybWFuY2UgYnkgMjAlCis7Ly8JCWNvZWZmaWNpZW50cyBhcmUgbm93IG9uIDEgYnl0ZQorOy8vCTIyLzEyLzIwMDAgOiBDaGFuZ2luZyBkYXRhIHN0cnVjdHVyZQorOy8vCTE2LzEyLzIwMDAgOiBBVCZUIHZlcnNpb24KKzsvLwkxNC8xMi8yMDAwIDogdW5yb2xsaW5nIGxvb3AKKzsvLwkxMi8xMi8yMDAwIDogNjQgYml0cyBtZW1vcnkgYWNjZXNzCisKKworLmRhdGEKKworY2hhaW5lOgorCS5zdHJpbmcJInBvcyA9ICVkXG5cMCIKKwkubG9uZyAweDAKKwkJCit0aGV6ZXJvOgorCS5sb25nIDB4MDAwMDAwMDAKKwkubG9uZyAweDAwMDAwMDAwCisKKy50ZXh0CisKKy5nbG9ibCBtbXhfem9vbQkJOy8vIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgYnkgQyBwcm9ncmFtCisvKiAuZXh0ZXJuIGNvZWZmcwkJOy8vIHRoZSB0cmFuc2Zvcm1hdGlvbiBidWZmZXIgKi8KKy5leHRlcm4gZXhwaXgxLGV4cGl4MiA7Ly8gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYnVmZmVyCisuZXh0ZXJuIG1teF96b29tX3NpemUsIHpvb21fd2lkdGggOy8vIHNpemUgb2YgdGhlIGJ1ZmZlcnMKKworLmV4dGVybiBicnV0UyxicnV0RCxidWZmcmF0aW8scHJlY2FsQ29lZixwcmV2WCxwcmV2WQorCisjZGVmaW5lIFBFUlRFTUFTSyAxNQorLyogZmFpcmUgOiBhIC8gc3FydHBlcnRlIDw9PiBhID4+IFBFUlRFREVDKi8KKyNkZWZpbmUgUEVSVEVERUMgNAorCisuYWxpZ24gMTYKK21teF96b29tOgorCisJCXB1c2hsICVlYnAKKwkJbW92bCAlZXNwLCVlYnAKKwkJc3VibCAkMTIsJWVzcAorCisJCW1vdmwgcHJldlgsJWVheAorCQlkZWNsICVlYXgKKwkJc2FybCAkNCwlZWF4CisJCW1vdmwgJWVheCwtNCglZWJwKQorCisJCW1vdmwgcHJldlksJWVheAorCQlkZWNsICVlYXgKKwkJc2FybCAkNCwlZWF4CisJCW1vdmwgJWVheCwtOCglZWJwKQorCis7Ly8gaW5pdGlhbGlzYXRpb24gZHUgbW03IO+/vSB6ZXJvCisJCW1vdnEgKHRoZXplcm8pLCAlbW03CisKK21vdmwgbW14X3pvb21fc2l6ZSwgJWVjeAorZGVjbCAlZWN4CisKKy53aGlsZToKKwk7Ly8gZXNpIDwtIG5vdXZlbGxlIHBvc2l0aW9uCisJbW92bCBicnV0UywgJWVheAorCWxlYWwgKCVlYXgsICVlY3gsIDgpLCVlYXgKKworCW1vdmwgKCVlYXgpLCVlZHggLyogPSBicnV0Uy5weCAoYnJ1dFNteXBvcykgKi8KKwltb3ZsIDQoJWVheCksJWVheCAvKiA9IGJydXRTLnB5ICovCisKKwltb3ZsIGJydXRELCVlYngKKwlsZWFsICglZWJ4LCAlZWN4LCA4KSwlZWJ4CisJbW92bCAoJWVieCksJWVzaQorCXN1YmwgJWVkeCwgJWVzaQorCWltdWxsIGJ1ZmZyYXRpbywlZXNpCisJc2FybCAkMTYsJWVzaQorCWFkZGwgJWVkeCwlZXNpIC8qIGVzaSA9IHB4ICovCisKKwkvKiBlYXggY29udGllbnQgZGVqYSBicnV0Uy5weSA9IGxlIG5vdXZlYXUgYnJ1dFNteXBvcyovCisJLyogZWJ4IHBvaW50ZSBzdXIgYnJ1dERbbXlQb3NdICovCisJbW92bCA0KCVlYngpLCVlZGkKKwlzdWJsICVlYXgsJWVkaQorCWltdWxsIGJ1ZmZyYXRpbywlZWRpCisJc2FybCAkMTYsJWVkaQorCWFkZGwgJWVheCwlZWRpIC8qIGVkaSA9IHB5ICovCisKKy8qCQlwdXNobCAlZWF4CisJCXB1c2hsICVlYngqLworLyoJCXBvcGwgJWVieAorCQlwb3BsICVlYXgqLworCQkKKwltb3ZsICVlc2ksJWVheAorCWFuZGwgJDE1LCVlYXggLyogZWF4ID0gY29lZmggKi8KKwltb3ZsICVlZGksJWVieAorCWFuZGwgJDE1LCVlYnggLyogZWJ4ID0gY29lZnYgKi8KKworCWxlYWwgMCgsJWVieCw0KSwlZWJ4CisJc2FsbCAkNiwlZWF4CisJYWRkbCAlZWJ4LCVlYXgKKwltb3ZsICRwcmVjYWxDb2VmLCVlYngKKy8qCW1vdmQgKCVlYXgsJWVieCksJW1tNiovIC8qIG1tNiA9IGNvZWZmcyAqLworCisJY21wbCAtOCglZWJwKSwlZWRpCisJamdlIC50aGVuMQorCWNtcGwgLTQoJWVicCksJWVzaQorCWpnZSAudGhlbjEKKworCXNhcmwgJDQsJWVzaQorCXNhcmwgJDQsJWVkaQorCWltdWxsIHpvb21fd2lkdGgsJWVkaQorCWxlYWwgKCVlc2ksJWVkaSksJWVzaQorCWptcCAuZmluc2kxCisKKy50aGVuMToKKwltb3ZsICQwLCVlc2kKKy5maW5zaTE6CisKKwkvKiogYXByZXMgY2UgY2FsY3VsLCAlZXNpID0gcG9zLCAlbW02ID0gY29lZmZzICoqLworLyoJcHVzaGwgJWVzaQorCXB1c2hsICRjaGFpbmUKKwljYWxsIHByaW50ZgorCWFkZGwgJDgsJWVzcCovCisKKwltb3ZsIGV4cGl4MSwlZWF4CisKKwk7Ly8gcmVjdXBlcmF0aW9uIGRlcyBkZXV4IHByZW1pZXJzIHBpeGVscyBkYW5zIG1tMCBldCBtbTEKKy8qCW1vdnEgKCVlYXgsJWVzaSw0KSwgJW1tMAkJLyogYjEtdjEtcjEtYTEtYjItdjItcjItYTIgKi8KKwltb3ZxICVtbTAsICVtbTEJCQkJLyogYjEtdjEtcjEtYTEtYjItdjItcjItYTIgKi8KKworCTsvLyBkZXBhY2thZ2UgZHUgcHJlbWllciBwaXhlbAorCXB1bnBja2xidyAlbW03LCAlbW0wCS8qIDAwLWIyLTAwLXYyLTAwLXIyLTAwLWEyICovCisKKwltb3ZxICVtbTYsICVtbTUJCQkvKiA/Py0/Py0/Py0/Py1jNC1jMy1jMi1jMSAqLworCTsvLyBkZXBhY2thZ2UgZHUgMmllbWUgcGl4ZWwKKwlwdW5wY2toYncgJW1tNywgJW1tMQkvKiAwMC1iMS0wMC12MS0wMC1yMS0wMC1hMSAqLworCisJOy8vIGV4dHJhY3Rpb24gZGVzIGNvZWZmaWNpZW50cy4uLgorCXB1bnBja2xidyAlbW01LCAlbW02CS8qIGM0LWM0LWMzLWMzLWMyLWMyLWMxLWMxICovCisJbW92cSAlbW02LCAlbW00CQkJLyogYzQtYzQtYzMtYzMtYzItYzItYzEtYzEgKi8KKwltb3ZxICVtbTYsICVtbTUJCQkvKiBjNC1jNC1jMy1jMy1jMi1jMi1jMS1jMSAqLworCisJcHVucGNrbGJ3ICVtbTUsICVtbTYJLyogYzItYzItYzItYzItYzEtYzEtYzEtYzEgKi8KKwlwdW5wY2toYncgJW1tNSwgJW1tNAkvKiBjNC1jNC1jNC1jNC1jMy1jMy1jMy1jMyAqLworCisJbW92cSAlbW02LCAlbW0zCQkJLyogYzItYzItYzItYzItYzEtYzEtYzEtYzEgKi8KKwlwdW5wY2tsYncgJW1tNywgJW1tNgkvKiAwMC1jMS0wMC1jMS0wMC1jMS0wMC1jMSAqLworCXB1bnBja2hidyAlbW03LCAlbW0zCS8qIDAwLWMyLTAwLWMyLTAwLWMyLTAwLWMyICovCisJCisJOy8vIG11bHRpcGxpY2F0aW9uIGRlcyBwaXhlbHMgcGFyIGxlcyBjb2VmZmljaWVudHMKKwlwbXVsbHcgJW1tNiwgJW1tMAkJLyogYzEqYjItYzEqdjItYzEqcjItYzEqYTIgKi8KKwlwbXVsbHcgJW1tMywgJW1tMQkJLyogYzIqYjEtYzIqdjEtYzIqcjEtYzIqYTEgKi8KKwlwYWRkdyAlbW0xLCAlbW0wCisJCisJOy8vIC4uLmV4dHJhY3Rpb24gZGVzIDIgZGVybmllcnMgY29lZmZpY2llbnRzCisJbW92cSAlbW00LCAlbW01CQkJLyogYzQtYzQtYzQtYzQtYzMtYzMtYzMtYzMgKi8KKwlwdW5wY2tsYncgJW1tNywgJW1tNAkvKiAwMC1jMy0wMC1jMy0wMC1jMy0wMC1jMyAqLworCXB1bnBja2hidyAlbW03LCAlbW01CS8qIDAwLWM0LTAwLWM0LTAwLWM0LTAwLWM0ICovCisKKwkvKiBham91dGVyIGxhIGxvbmd1ZXVyIGRlIGxpZ25lIGEgZXNpICovCisJYWRkbCBwcmV2WCwlZXNpCisJCQorCTsvLyByZWN1cGVyYXRpb24gZGVzIDIgZGVybmllcnMgcGl4ZWxzCisvKgltb3ZxICglZWF4LCVlc2ksNCksICVtbTEqLworCW1vdnEgJW1tMSwgJW1tMgorCQorCTsvLyBkZXBhY2thZ2UgZGVzIHBpeGVscworCXB1bnBja2xidyAlbW03LCAlbW0xCisJcHVucGNraGJ3ICVtbTcsICVtbTIKKwkKKwk7Ly8gbXVsdGlwbGljYXRpb24gcGFzIGxlcyBjb2VmZnMKKwlwbXVsbHcgJW1tNCwgJW1tMQorCXBtdWxsdyAlbW01LCAlbW0yCisJCisJOy8vIGFqb3V0IGRlcyB2YWxldXJzIG9idGVudWVzIO+/vSBsYSB2YWxldXIgZmluYWxlCisJcGFkZHcgJW1tMSwgJW1tMAorCXBhZGR3ICVtbTIsICVtbTAKKworCTsvLyBkaXZpc2lvbiBwYXIgMjU2ID0gMTYrMTYrMTYrMTYsIHB1aXMgcmVwYWNrYWdlIGR1IHBpeGVsIGZpbmFsCisJcHNybHcgJDgsICVtbTAKKwlwYWNrdXN3YiAlbW03LCAlbW0wCisJCisJOy8vIHBhc3NhZ2UgYXUgc3VpdmFudAorCisJOy8vIGVucmVnaXN0cmVtZW50IGR1IHJlc3VsdGF0CisJbW92bCBleHBpeDIsJWVheAorLyoJbW92ZCAlbW0wLCglZWF4LCVlY3gsNCkqLworCisJZGVjbCAlZWN4CisJOy8vIHRlc3QgZGUgZmluIGR1IHRhbnRxdWUKKwljbXBsICQwLCAlZWN4CQkJCTsvLyA0MDB4MzAwCisKKwlqeiAuZmluX3doaWxlCisJam1wIC53aGlsZQorCisuZmluX3doaWxlOgorCWVtbXMKKworCW1vdmwgJWVicCwlZXNwCisJcG9wbCAlZWJwCisKKwlyZXQgICAgICAgICAgICAgICAgICA7Ly9UaGUgRW5kCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9mbHlpbmdfc3RhcnNfZnguYyBiL2dzdC9nb29tL2ZseWluZ19zdGFyc19meC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMzVlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9mbHlpbmdfc3RhcnNfZnguYwpAQCAtMCwwICsxLDM2MSBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgImdvb21fZnguaCIKKyNpbmNsdWRlICJnb29tX3BsdWdpbl9pbmZvLmgiCisjaW5jbHVkZSAiZ29vbV90b29scy5oIgorCisjaW5jbHVkZSAibWF0aHRvb2xzLmgiCisKKy8qIFRPRE86LS0gRkFJUkUgUFJPUFJFTUVOVC4uLiBCT0FILi4uICovCisjZGVmaW5lIE5DT0wgMTUKKworLypzdGF0aWMgY29uc3QgaW50IGNvbHZhbFtdID0geworMHhmZGY2ZjUsCisweGZhZTRlNCwKKzB4ZjdkMWQxLAorMHhmM2I2YjUsCisweGVmYTJhMiwKKzB4ZWM5MTkwLAorMHhlYTgyODIsCisweGU4NzU3NSwKKzB4ZTQ2MDYwLAorMHhlMTRiNGMsCisweGRlM2IzYiwKKzB4ZGMyZDJmLAorMHhkOTI3MjYsCisweGQ4MTYxOSwKKzB4ZDUwYzA5LAorMAorfTsKKyovCitzdGF0aWMgY29uc3QgaW50IGNvbHZhbFtdID0geworICAweDE0MTYxODFhLAorICAweDE0MTkxODFhLAorICAweDE0MWYxODFhLAorICAweDE0MjYxODFhLAorICAweDE0MmExODFhLAorICAweDE0MmYxODFhLAorICAweDE0MzYxODFhLAorICAweDE0MmYxODE5LAorICAweDE0MjYxNjE1LAorICAweDEzMjAxNDExLAorICAweDExMWExMDBhLAorICAweDBjMTgwNTA4LAorICAweDA4MTAwMzA0LAorICAweDAwMDUwMTAxLAorICAweDAKK307CisKKworLyogVGhlIGRpZmZlcmVudCBtb2RlcyBvZiB0aGUgdmlzdWFsIEZYLgorICogUHV0IHRoaXMgdmFsdWVzIG9uIGZ4X21vZGUgKi8KKyNkZWZpbmUgRklSRVdPUktTX0ZYIDAKKyNkZWZpbmUgUkFJTl9GWCAxCisjZGVmaW5lIEZPVU5UQUlOX0ZYIDIKKyNkZWZpbmUgTEFTVF9GWCAzCisKK3R5cGVkZWYgc3RydWN0IF9GU19TVEFSCit7CisgIGZsb2F0IHgsIHk7CisgIGZsb2F0IHZ4LCB2eTsKKyAgZmxvYXQgYXgsIGF5OworICBmbG9hdCBhZ2UsIHZhZ2U7Cit9IFN0YXI7CisKK3R5cGVkZWYgc3RydWN0IF9GU19EQVRBCit7CisKKyAgaW50IGZ4X21vZGU7CisgIGludCBuYlN0YXJzOworCisgIGludCBtYXhTdGFyczsKKyAgU3RhciAqc3RhcnM7CisKKyAgZmxvYXQgbWluX2FnZTsKKyAgZmxvYXQgbWF4X2FnZTsKKworICBQbHVnaW5QYXJhbSBtaW5fYWdlX3A7CisgIFBsdWdpblBhcmFtIG1heF9hZ2VfcDsKKyAgUGx1Z2luUGFyYW0gbmJTdGFyc19wOworICBQbHVnaW5QYXJhbSBuYlN0YXJzX2xpbWl0X3A7CisgIFBsdWdpblBhcmFtIGZ4X21vZGVfcDsKKworICBQbHVnaW5QYXJhbWV0ZXJzIHBhcmFtczsKK30gRlNEYXRhOworCitzdGF0aWMgdm9pZAorZnNfaW5pdCAoVmlzdWFsRlggKiBfdGhpcywgUGx1Z2luSW5mbyAqIGluZm8pCit7CisKKyAgRlNEYXRhICpkYXRhOworCisgIGRhdGEgPSAoRlNEYXRhICopIG1hbGxvYyAoc2l6ZW9mIChGU0RhdGEpKTsKKworICBkYXRhLT5meF9tb2RlID0gRklSRVdPUktTX0ZYOworICBkYXRhLT5tYXhTdGFycyA9IDQwOTY7CisgIGRhdGEtPnN0YXJzID0gKFN0YXIgKikgbWFsbG9jIChkYXRhLT5tYXhTdGFycyAqIHNpemVvZiAoU3RhcikpOworICBkYXRhLT5uYlN0YXJzID0gMDsKKworICBzZWN1cmVfaV9wYXJhbSAoJmRhdGEtPm1heF9hZ2VfcCwgIkZpcmV3b3JrcyBTbWFsbGVzdCBCb21icyIpOworICBJVkFMIChkYXRhLT5tYXhfYWdlX3ApID0gODA7CisgIElNSU4gKGRhdGEtPm1heF9hZ2VfcCkgPSAwOworICBJTUFYIChkYXRhLT5tYXhfYWdlX3ApID0gMTAwOworICBJU1RFUCAoZGF0YS0+bWF4X2FnZV9wKSA9IDE7CisKKyAgc2VjdXJlX2lfcGFyYW0gKCZkYXRhLT5taW5fYWdlX3AsICJGaXJld29ya3MgTGFyZ2VzdCBCb21icyIpOworICBJVkFMIChkYXRhLT5taW5fYWdlX3ApID0gOTk7CisgIElNSU4gKGRhdGEtPm1pbl9hZ2VfcCkgPSAwOworICBJTUFYIChkYXRhLT5taW5fYWdlX3ApID0gMTAwOworICBJU1RFUCAoZGF0YS0+bWluX2FnZV9wKSA9IDE7CisKKyAgc2VjdXJlX2lfcGFyYW0gKCZkYXRhLT5uYlN0YXJzX2xpbWl0X3AsICJNYXggTnVtYmVyIG9mIFBhcnRpY3VsZXMiKTsKKyAgSVZBTCAoZGF0YS0+bmJTdGFyc19saW1pdF9wKSA9IDUxMjsKKyAgSU1JTiAoZGF0YS0+bmJTdGFyc19saW1pdF9wKSA9IDA7CisgIElNQVggKGRhdGEtPm5iU3RhcnNfbGltaXRfcCkgPSBkYXRhLT5tYXhTdGFyczsKKyAgSVNURVAgKGRhdGEtPm5iU3RhcnNfbGltaXRfcCkgPSA2NDsKKworICBzZWN1cmVfaV9wYXJhbSAoJmRhdGEtPmZ4X21vZGVfcCwgIkZYIE1vZGUiKTsKKyAgSVZBTCAoZGF0YS0+ZnhfbW9kZV9wKSA9IGRhdGEtPmZ4X21vZGU7CisgIElNSU4gKGRhdGEtPmZ4X21vZGVfcCkgPSAxOworICBJTUFYIChkYXRhLT5meF9tb2RlX3ApID0gMzsKKyAgSVNURVAgKGRhdGEtPmZ4X21vZGVfcCkgPSAxOworCisgIHNlY3VyZV9mX2ZlZWRiYWNrICgmZGF0YS0+bmJTdGFyc19wLCAiTnVtYmVyIG9mIFBhcnRpY3VsZXMgKCUgb2YgTWF4KSIpOworCisgIHBsdWdpbl9wYXJhbWV0ZXJzICgmZGF0YS0+cGFyYW1zLCAiUGFydGljdWxlIFN5c3RlbSIsIDcpOworICBkYXRhLT5wYXJhbXMucGFyYW1zWzBdID0gJmRhdGEtPmZ4X21vZGVfcDsKKyAgZGF0YS0+cGFyYW1zLnBhcmFtc1sxXSA9ICZkYXRhLT5uYlN0YXJzX2xpbWl0X3A7CisgIGRhdGEtPnBhcmFtcy5wYXJhbXNbMl0gPSAwOworICBkYXRhLT5wYXJhbXMucGFyYW1zWzNdID0gJmRhdGEtPm1pbl9hZ2VfcDsKKyAgZGF0YS0+cGFyYW1zLnBhcmFtc1s0XSA9ICZkYXRhLT5tYXhfYWdlX3A7CisgIGRhdGEtPnBhcmFtcy5wYXJhbXNbNV0gPSAwOworICBkYXRhLT5wYXJhbXMucGFyYW1zWzZdID0gJmRhdGEtPm5iU3RhcnNfcDsKKworICBfdGhpcy0+cGFyYW1zID0gJmRhdGEtPnBhcmFtczsKKyAgX3RoaXMtPmZ4X2RhdGEgPSAodm9pZCAqKSBkYXRhOworfQorCitzdGF0aWMgdm9pZAorZnNfZnJlZSAoVmlzdWFsRlggKiBfdGhpcykKK3sKKyAgRlNEYXRhICpkYXRhID0gKEZTRGF0YSAqKSBfdGhpcy0+ZnhfZGF0YTsKKworICBnb29tX3BsdWdpbl9wYXJhbWV0ZXJzX2ZyZWUgKCZkYXRhLT5wYXJhbXMpOworCisgIGZyZWUgKGRhdGEtPnN0YXJzKTsKKyAgZnJlZSAoX3RoaXMtPmZ4X2RhdGEpOworfQorCisKKy8qKgorICogQ3JlZSB1bmUgbm91dmVsbGUgJ2JvbWJlJywgYydlc3QgYSBkaXJlIHVuZSBwYXJ0aWN1bGUgYXBwYXJ0ZW5hbnQgYSB1bmUgZnVzZWUgZCdhcnRpZmljZS4KKyAqLworc3RhdGljIHZvaWQKK2FkZEFCb21iIChGU0RhdGEgKiBmcywgaW50IG14LCBpbnQgbXksIGZsb2F0IHJhZGl1cywgZmxvYXQgdmFnZSwgZmxvYXQgZ3Jhdml0eSwKKyAgICBQbHVnaW5JbmZvICogaW5mbykKK3sKKworICBpbnQgaSA9IGZzLT5uYlN0YXJzOworICBmbG9hdCBybzsKKyAgaW50IHRoZXRhOworCisgIGlmIChmcy0+bmJTdGFycyA+PSBmcy0+bWF4U3RhcnMpCisgICAgcmV0dXJuOworICBmcy0+bmJTdGFycysrOworCisgIGZzLT5zdGFyc1tpXS54ID0gbXg7CisgIGZzLT5zdGFyc1tpXS55ID0gbXk7CisKKyAgcm8gPSByYWRpdXMgKiAoZmxvYXQpIGdvb21faXJhbmQgKGluZm8tPmdSYW5kb20sIDEwMCkgLyAxMDAuMGY7CisgIHJvICo9IChmbG9hdCkgZ29vbV9pcmFuZCAoaW5mby0+Z1JhbmRvbSwgMTAwKSAvIDEwMC4wZiArIDEuMGY7CisgIHRoZXRhID0gZ29vbV9pcmFuZCAoaW5mby0+Z1JhbmRvbSwgMjU2KTsKKworICBmcy0+c3RhcnNbaV0udnggPSBybyAqIGNvczI1Nlt0aGV0YV07CisgIGZzLT5zdGFyc1tpXS52eSA9IC0wLjJmICsgcm8gKiBzaW4yNTZbdGhldGFdOworCisgIGZzLT5zdGFyc1tpXS5heCA9IDA7CisgIGZzLT5zdGFyc1tpXS5heSA9IGdyYXZpdHk7CisKKyAgZnMtPnN0YXJzW2ldLmFnZSA9IDA7CisgIGlmICh2YWdlIDwgZnMtPm1pbl9hZ2UpCisgICAgdmFnZSA9IGZzLT5taW5fYWdlOworICBmcy0+c3RhcnNbaV0udmFnZSA9IHZhZ2U7Cit9CisKKworLyoqCisgKiBNZXQgYSBqb3VyIGxhIHBvc2l0aW9uIGV0IHZpdGVzc2UgZCd1bmUgcGFydGljdWxlLgorICovCitzdGF0aWMgdm9pZAordXBkYXRlU3RhciAoU3RhciAqIHMpCit7CisgIHMtPnggKz0gcy0+dng7CisgIHMtPnkgKz0gcy0+dnk7CisgIHMtPnZ4ICs9IHMtPmF4OworICBzLT52eSArPSBzLT5heTsKKyAgcy0+YWdlICs9IHMtPnZhZ2U7Cit9CisKKworLyoqCisgKiBBam91dGUgZGUgbm91dmVsbGVzIHBhcnRpY3VsZXMgYXUgbW9tZW50IGQndW4gZXZlbmVtZW50IHNvbm9yZS4KKyAqLworc3RhdGljIHZvaWQKK2ZzX3NvdW5kX2V2ZW50X29jY3VyZWQgKFZpc3VhbEZYICogX3RoaXMsIFBsdWdpbkluZm8gKiBpbmZvKQoreworCisgIEZTRGF0YSAqZGF0YSA9IChGU0RhdGEgKikgX3RoaXMtPmZ4X2RhdGE7CisgIGludCBpOworCisgIGludCBtYXggPSAoaW50KSAoKDEuMGYgKyBpbmZvLT5zb3VuZC5nb29tUG93ZXIpICogZ29vbV9pcmFuZCAoaW5mby0+Z1JhbmRvbSwKKyAgICAgICAgICAxNTApKSArIDEwMDsKKyAgZmxvYXQgcmFkaXVzID0KKyAgICAgICgxLjBmICsgaW5mby0+c291bmQuZ29vbVBvd2VyKSAqIChmbG9hdCkgKGdvb21faXJhbmQgKGluZm8tPmdSYW5kb20sCisgICAgICAgICAgMTUwKSArIDUwKSAvIDMwMDsKKyAgaW50IG14OworICBpbnQgbXk7CisgIGZsb2F0IHZhZ2UsIGdyYXZpdHkgPSAwLjAyZjsKKworICBzd2l0Y2ggKGRhdGEtPmZ4X21vZGUpIHsKKyAgICBjYXNlIEZJUkVXT1JLU19GWDoKKyAgICB7CisgICAgICBkb3VibGUgZHgsIGR5OworCisgICAgICBkbyB7CisgICAgICAgIG14ID0gZ29vbV9pcmFuZCAoaW5mby0+Z1JhbmRvbSwgaW5mby0+c2NyZWVuLndpZHRoKTsKKyAgICAgICAgbXkgPSBnb29tX2lyYW5kIChpbmZvLT5nUmFuZG9tLCBpbmZvLT5zY3JlZW4uaGVpZ2h0KTsKKyAgICAgICAgZHggPSAobXggLSBpbmZvLT5zY3JlZW4ud2lkdGggLyAyKTsKKyAgICAgICAgZHkgPSAobXkgLSBpbmZvLT5zY3JlZW4uaGVpZ2h0IC8gMik7CisgICAgICB9IHdoaWxlIChkeCAqIGR4ICsgZHkgKiBkeSA8CisgICAgICAgICAgKGluZm8tPnNjcmVlbi5oZWlnaHQgLyAyKSAqIChpbmZvLT5zY3JlZW4uaGVpZ2h0IC8gMikpOworICAgICAgdmFnZSA9IGRhdGEtPm1heF9hZ2UgKiAoMS4wZiAtIGluZm8tPnNvdW5kLmdvb21Qb3dlcik7CisgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBSQUlOX0ZYOgorICAgICAgbXggPSBnb29tX2lyYW5kIChpbmZvLT5nUmFuZG9tLCBpbmZvLT5zY3JlZW4ud2lkdGgpOworICAgICAgaWYgKG14ID4gaW5mby0+c2NyZWVuLndpZHRoIC8gMikKKyAgICAgICAgbXggPSBpbmZvLT5zY3JlZW4ud2lkdGg7CisgICAgICBlbHNlCisgICAgICAgIG14ID0gMDsKKyAgICAgIG15ID0gLShpbmZvLT5zY3JlZW4uaGVpZ2h0IC8gMykgLSBnb29tX2lyYW5kIChpbmZvLT5nUmFuZG9tLAorICAgICAgICAgIGluZm8tPnNjcmVlbi53aWR0aCAvIDMpOworICAgICAgcmFkaXVzICo9IDEuNTsKKyAgICAgIHZhZ2UgPSAwLjAwMmY7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVU5UQUlOX0ZYOgorICAgICAgbXkgPSBpbmZvLT5zY3JlZW4uaGVpZ2h0ICsgMjsKKyAgICAgIHZhZ2UgPSAwLjAwMWY7CisgICAgICByYWRpdXMgKz0gMS4wZjsKKyAgICAgIG14ID0gaW5mby0+c2NyZWVuLndpZHRoIC8gMjsKKyAgICAgIGdyYXZpdHkgPSAwLjA0ZjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm47CisgICAgICAvKiBteSA9IGkgUiBBIE4gRCAoaW5mby0+c2NyZWVuLmhlaWdodCk7IHZhZ2UgPSAwLjAxZjsgKi8KKyAgfQorCisgIHJhZGl1cyAqPSBpbmZvLT5zY3JlZW4uaGVpZ2h0IC8gMjAwLjBmOyAgICAgICAvKiB3aHkgMjAwID8gYmVjYXVzZSB0aGUgRlggd2FzIGRldmVsb3BwZWQgb24gMzIweDIwMCAqLworICBtYXggKj0gaW5mby0+c2NyZWVuLmhlaWdodCAvIDIwMC4wZjsKKworICBpZiAoaW5mby0+c291bmQudGltZVNpbmNlTGFzdEJpZ0dvb20gPCAxKSB7CisgICAgcmFkaXVzICo9IDEuNTsKKyAgICBtYXggKj0gMjsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgbWF4OyArK2kpCisgICAgYWRkQUJvbWIgKGRhdGEsIG14LCBteSwgcmFkaXVzLCB2YWdlLCBncmF2aXR5LCBpbmZvKTsKK30KKworCisvKioKKyAqIE1haW4gbWV0aG9kZSBvZiB0aGUgRlguCisgKi8KK3N0YXRpYyB2b2lkCitmc19hcHBseSAoVmlzdWFsRlggKiBfdGhpcywgUGl4ZWwgKiBzcmMsIFBpeGVsICogZGVzdCwgUGx1Z2luSW5mbyAqIGluZm8pCit7CisKKyAgaW50IGk7CisgIGludCBjb2w7CisgIEZTRGF0YSAqZGF0YSA9IChGU0RhdGEgKikgX3RoaXMtPmZ4X2RhdGE7CisKKyAgLyogR2V0IHRoZSBuZXcgcGFyYW1ldGVycyB2YWx1ZXMgKi8KKyAgZGF0YS0+bWluX2FnZSA9IDEuMGYgLSAoZmxvYXQpIElWQUwgKGRhdGEtPm1pbl9hZ2VfcCkgLyAxMDAuMGY7CisgIGRhdGEtPm1heF9hZ2UgPSAxLjBmIC0gKGZsb2F0KSBJVkFMIChkYXRhLT5tYXhfYWdlX3ApIC8gMTAwLjBmOworICBGVkFMIChkYXRhLT5uYlN0YXJzX3ApID0gKGZsb2F0KSBkYXRhLT5uYlN0YXJzIC8gKGZsb2F0KSBkYXRhLT5tYXhTdGFyczsKKyAgZGF0YS0+bmJTdGFyc19wLmNoYW5nZV9saXN0ZW5lciAoJmRhdGEtPm5iU3RhcnNfcCk7CisgIGRhdGEtPm1heFN0YXJzID0gSVZBTCAoZGF0YS0+bmJTdGFyc19saW1pdF9wKTsKKyAgZGF0YS0+ZnhfbW9kZSA9IElWQUwgKGRhdGEtPmZ4X21vZGVfcCk7CisKKyAgLyogbG9vayBmb3IgZXZlbnRzICovCisgIGlmIChpbmZvLT5zb3VuZC50aW1lU2luY2VMYXN0R29vbSA8IDEpIHsKKyAgICBmc19zb3VuZF9ldmVudF9vY2N1cmVkIChfdGhpcywgaW5mbyk7CisgICAgaWYgKGdvb21faXJhbmQgKGluZm8tPmdSYW5kb20sIDIwKSA9PSAxKSB7CisgICAgICBJVkFMIChkYXRhLT5meF9tb2RlX3ApID0gZ29vbV9pcmFuZCAoaW5mby0+Z1JhbmRvbSwgKExBU1RfRlggKiAzKSk7CisgICAgICBkYXRhLT5meF9tb2RlX3AuY2hhbmdlX2xpc3RlbmVyICgmZGF0YS0+ZnhfbW9kZV9wKTsKKyAgICB9CisgIH0KKworICAvKiB1cGRhdGUgcGFydGljdWxlcyAqLworICBmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bmJTdGFyczsgKytpKSB7CisgICAgdXBkYXRlU3RhciAoJmRhdGEtPnN0YXJzW2ldKTsKKworICAgIC8qIGRlYWQgcGFydGljdWxlICovCisgICAgaWYgKGRhdGEtPnN0YXJzW2ldLmFnZSA+PSBOQ09MKQorICAgICAgY29udGludWU7CisKKyAgICAvKiBjaG9vc2UgdGhlIGNvbG9yIG9mIHRoZSBwYXJ0aWN1bGUgKi8KKyAgICBjb2wgPSBjb2x2YWxbKGludCkgZGF0YS0+c3RhcnNbaV0uYWdlXTsKKworICAgIC8qIGRyYXdzIHRoZSBwYXJ0aWN1bGUgKi8KKyAgICBpbmZvLT5tZXRob2RzLmRyYXdfbGluZSAoZGVzdCwgKGludCkgZGF0YS0+c3RhcnNbaV0ueCwKKyAgICAgICAgKGludCkgZGF0YS0+c3RhcnNbaV0ueSwKKyAgICAgICAgKGludCkgKGRhdGEtPnN0YXJzW2ldLnggLSBkYXRhLT5zdGFyc1tpXS52eCAqIDYpLAorICAgICAgICAoaW50KSAoZGF0YS0+c3RhcnNbaV0ueSAtIGRhdGEtPnN0YXJzW2ldLnZ5ICogNiksIGNvbCwKKyAgICAgICAgKGludCkgaW5mby0+c2NyZWVuLndpZHRoLCAoaW50KSBpbmZvLT5zY3JlZW4uaGVpZ2h0KTsKKyAgICBpbmZvLT5tZXRob2RzLmRyYXdfbGluZSAoZGVzdCwgKGludCkgZGF0YS0+c3RhcnNbaV0ueCwKKyAgICAgICAgKGludCkgZGF0YS0+c3RhcnNbaV0ueSwKKyAgICAgICAgKGludCkgKGRhdGEtPnN0YXJzW2ldLnggLSBkYXRhLT5zdGFyc1tpXS52eCAqIDIpLAorICAgICAgICAoaW50KSAoZGF0YS0+c3RhcnNbaV0ueSAtIGRhdGEtPnN0YXJzW2ldLnZ5ICogMiksIGNvbCwKKyAgICAgICAgKGludCkgaW5mby0+c2NyZWVuLndpZHRoLCAoaW50KSBpbmZvLT5zY3JlZW4uaGVpZ2h0KTsKKyAgfQorCisgIC8qIGxvb2sgZm9yIGRlYWQgcGFydGljdWxlcyAqLworICBmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bmJTdGFyczspIHsKKworICAgIGlmICgoZGF0YS0+c3RhcnNbaV0ueCA+IGluZm8tPnNjcmVlbi53aWR0aCArIDY0KQorICAgICAgICB8fCAoKGRhdGEtPnN0YXJzW2ldLnZ5ID49IDApCisgICAgICAgICAgICAmJiAoZGF0YS0+c3RhcnNbaV0ueSAtIDE2ICogZGF0YS0+c3RhcnNbaV0udnkgPgorICAgICAgICAgICAgICAgIGluZm8tPnNjcmVlbi5oZWlnaHQpKQorICAgICAgICB8fCAoZGF0YS0+c3RhcnNbaV0ueCA8IC02NCkKKyAgICAgICAgfHwgKGRhdGEtPnN0YXJzW2ldLmFnZSA+PSBOQ09MKSkgeworICAgICAgZGF0YS0+c3RhcnNbaV0gPSBkYXRhLT5zdGFyc1tkYXRhLT5uYlN0YXJzIC0gMV07CisgICAgICBkYXRhLT5uYlN0YXJzLS07CisgICAgfSBlbHNlCisgICAgICArK2k7CisgIH0KK30KKwordm9pZAorZmx5aW5nX3N0YXJfY3JlYXRlIChWaXN1YWxGWCAqIHZmeCkKK3sKKyAgdmZ4LT5pbml0ID0gZnNfaW5pdDsKKyAgdmZ4LT5mcmVlID0gZnNfZnJlZTsKKyAgdmZ4LT5hcHBseSA9IGZzX2FwcGx5OworICB2ZngtPmZ4X2RhdGEgPSBOVUxMOworICB2ZngtPnBhcmFtcyA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9nc3QvZ29vbS9nb29tLmggYi9nc3QvZ29vbS9nb29tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJhMDkzNgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2dvb20uaApAQCAtMCwwICsxLDQyIEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZuZGVmIF9HT09NQ09SRV9ICisjZGVmaW5lIF9HT09NQ09SRV9ICisKKyNpbmNsdWRlICJnb29tX2NvbmZpZy5oIgorI2luY2x1ZGUgImdvb21fcGx1Z2luX2luZm8uaCIKKworI2RlZmluZSBOQl9GWCAxMAorCitQbHVnaW5JbmZvICpnb29tX2luaXQgKGd1aW50MzIgcmVzeCwgZ3VpbnQzMiByZXN5KTsKK3ZvaWQgZ29vbV9zZXRfcmVzb2x1dGlvbiAoUGx1Z2luSW5mbyAqZ29vbUluZm8sIGd1aW50MzIgcmVzeCwgZ3VpbnQzMiByZXN5KTsKKworLyoKKyAqIGZvcmNlTW9kZSA9PSAwIDogZG8gbm90aGluZworICogZm9yY2VNb2RlID09IC0xIDogbG9jayB0aGUgRlgKKyAqIGZvcmNlTW9kZSA9PSAxLi5OQl9GWCA6IGZvcmNlIGEgc3dpdGNoIHRvIEZYIG4jIGZvcmNlTW9kZQorICovCitndWludDMyICpnb29tX3VwZGF0ZSAoUGx1Z2luSW5mbyAqZ29vbUluZm8sIGdpbnQxNiBkYXRhWzJdWzUxMl0sIGludCBmb3JjZU1vZGUsIGZsb2F0IGZwcyk7CisKKy8qIHJldHVybnMgMCBpZiB0aGUgYnVmZmVyIHdhc24ndCBhY2NlcHRlZCAqLworaW50IGdvb21fc2V0X3NjcmVlbmJ1ZmZlcihQbHVnaW5JbmZvICpnb29tSW5mbywgdm9pZCAqYnVmZmVyKTsKKwordm9pZCBnb29tX2Nsb3NlIChQbHVnaW5JbmZvICpnb29tSW5mbyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vZ29vbV9jb25maWcuaCBiL2dzdC9nb29tL2dvb21fY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI2NGJmZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2dvb21fY29uZmlnLmgKQEAgLTAsMCArMSw0NSBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgPGdsaWIuaD4KKworI2lmIEdfQllURV9PUkRFUiA9PSBHX0JJR19FTkRJQU4KKyNkZWZpbmUgQ09MT1JfQVJHQgorI2Vsc2UKKyNkZWZpbmUgQ09MT1JfQkdSQQorI2VuZGlmCisKKyNpZiAxCisvKiBuZGVmIENPTE9SX0JHUkEgKi8KKy8qKiBwb3NpdGlvbiBkZXMgY29tcG9zYW50ZXMgKiovCisgICAgI2RlZmluZSBCTEVVIDAKKyAgICAjZGVmaW5lIFZFUlQgMQorICAgICNkZWZpbmUgUk9VR0UgMgorICAgICNkZWZpbmUgQUxQSEEgMworI2Vsc2UKKyAgICAjZGVmaW5lIFJPVUdFIDEKKyAgICAjZGVmaW5lIEJMRVUgMworICAgICNkZWZpbmUgVkVSVCAyCisgICAgI2RlZmluZSBBTFBIQSAwCisjZW5kaWYKKworI2lmIGRlZmluZWQgKEJVSUxEX01NWCkgJiYgZGVmaW5lZCAoSEFWRV9HQ0NfQVNNKQorCisjZGVmaW5lIEhBVkVfTU1YCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vZ29vbV9jb25maWdfcGFyYW0uaCBiL2dzdC9nb29tL2dvb21fY29uZmlnX3BhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwOGRhOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2dvb21fY29uZmlnX3BhcmFtLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qIEdvb20gUHJvamVjdAorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gaU9TLVNvZnR3YXJlCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpZm5kZWYgX0NPTkZJR19QQVJBTV9ICisjZGVmaW5lIF9DT05GSUdfUEFSQU1fSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qCisgKiBGaWxlIGNyZWF0ZWQgb24gMjAwMy0wNS0yNCBieSBKZWtvLgorICogKGMpMjAwMywgSkMgSG9lbHQgZm9yIGlPUy1zb2Z0d2FyZS4KKyAqCisgKiBMR1BMIExpY2VuY2UuCisgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgUEFSQU1fSU5UVkFMLAorICBQQVJBTV9GTE9BVFZBTCwKKyAgUEFSQU1fQk9PTFZBTCwKKyAgUEFSQU1fU1RSVkFMLAorICBQQVJBTV9MSVNUVkFMLAorfSBQYXJhbVR5cGU7CisKK3N0cnVjdCBJbnRWYWwgeworICBpbnQgdmFsdWU7CisgIGludCBtaW47CisgIGludCBtYXg7CisgIGludCBzdGVwOworfTsKK3N0cnVjdCBGbG9hdFZhbCB7CisgIGZsb2F0IHZhbHVlOworICBmbG9hdCBtaW47CisgIGZsb2F0IG1heDsKKyAgZmxvYXQgc3RlcDsKK307CitzdHJ1Y3QgU3RyVmFsIHsKKyAgY2hhciAqdmFsdWU7Cit9Oworc3RydWN0IExpc3RWYWwgeworICBjaGFyICp2YWx1ZTsKKyAgaW50IG5iQ2hvaWNlczsKKyAgY2hhciAqKmNob2ljZXM7Cit9Oworc3RydWN0IEJvb2xWYWwgeworICBpbnQgdmFsdWU7Cit9OworCisKK3R5cGVkZWYgc3RydWN0IF9QQVJBTSB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGNvbnN0IGNoYXIgKmRlc2M7CisgIGNoYXIgcnc7CisgIFBhcmFtVHlwZSB0eXBlOworICB1bmlvbiB7CisgICAgc3RydWN0IEludFZhbCBpdmFsOworICAgIHN0cnVjdCBGbG9hdFZhbCBmdmFsOworICAgIHN0cnVjdCBTdHJWYWwgc3ZhbDsKKyAgICBzdHJ1Y3QgTGlzdFZhbCBzbGlzdDsKKyAgICBzdHJ1Y3QgQm9vbFZhbCBidmFsOworICB9IHBhcmFtOworICAKKyAgLyogdXNlZCBieSB0aGUgY29yZSB0byBpbmZvcm0gdGhlIEdVSSBvZiBhIGNoYW5nZSAqLworICB2b2lkICgqY2hhbmdlX2xpc3RlbmVyKShzdHJ1Y3QgX1BBUkFNICpfdGhpcyk7CisKKyAgLyogdXNlZCBieSB0aGUgR1VJIHRvIGluZm9ybSB0aGUgY29yZSBvZiBhIGNoYW5nZSAqLworICB2b2lkICgqY2hhbmdlZCkoc3RydWN0IF9QQVJBTSAqX3RoaXMpOworICAKKyAgdm9pZCAqdXNlcl9kYXRhOyAvKiBjYW4gYmUgdXNlZCBieSB0aGUgR1VJICovCit9IFBsdWdpblBhcmFtOworCisjZGVmaW5lIElWQUwocCkgKChwKS5wYXJhbS5pdmFsLnZhbHVlKQorI2RlZmluZSBTVkFMKHApICgocCkucGFyYW0uc3ZhbC52YWx1ZSkKKyNkZWZpbmUgRlZBTChwKSAoKHApLnBhcmFtLmZ2YWwudmFsdWUpCisjZGVmaW5lIEJWQUwocCkgKChwKS5wYXJhbS5idmFsLnZhbHVlKQorI2RlZmluZSBMVkFMKHApICgocCkucGFyYW0uc2xpc3QudmFsdWUpCisKKyNkZWZpbmUgRk1JTihwKSAoKHApLnBhcmFtLmZ2YWwubWluKQorI2RlZmluZSBGTUFYKHApICgocCkucGFyYW0uZnZhbC5tYXgpCisjZGVmaW5lIEZTVEVQKHApICgocCkucGFyYW0uZnZhbC5zdGVwKQorCisjZGVmaW5lIElNSU4ocCkgKChwKS5wYXJhbS5pdmFsLm1pbikKKyNkZWZpbmUgSU1BWChwKSAoKHApLnBhcmFtLml2YWwubWF4KQorI2RlZmluZSBJU1RFUChwKSAoKHApLnBhcmFtLml2YWwuc3RlcCkKKwordm9pZCBnb29tX3NlY3VyZV9wYXJhbShQbHVnaW5QYXJhbSAqcCk7CisKK3ZvaWQgZ29vbV9zZWN1cmVfZl9wYXJhbShQbHVnaW5QYXJhbSAqcCwgY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIGdvb21fc2VjdXJlX2lfcGFyYW0oUGx1Z2luUGFyYW0gKnAsIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBnb29tX3NlY3VyZV9iX3BhcmFtKFBsdWdpblBhcmFtICpwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgdmFsdWUpOwordm9pZCBnb29tX3NlY3VyZV9zX3BhcmFtKFBsdWdpblBhcmFtICpwLCBjb25zdCBjaGFyICpuYW1lKTsKKwordm9pZCBnb29tX3NlY3VyZV9mX2ZlZWRiYWNrKFBsdWdpblBhcmFtICpwLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgZ29vbV9zZWN1cmVfaV9mZWVkYmFjayhQbHVnaW5QYXJhbSAqcCwgY29uc3QgY2hhciAqbmFtZSk7CisKK3ZvaWQgZ29vbV9zZXRfc3RyX3BhcmFtX3ZhbHVlKFBsdWdpblBhcmFtICpwLCBjb25zdCBjaGFyICpzdHIpOwordm9pZCBnb29tX3NldF9saXN0X3BhcmFtX3ZhbHVlKFBsdWdpblBhcmFtICpwLCBjb25zdCBjaGFyICpzdHIpOworICAgIAordHlwZWRlZiBzdHJ1Y3QgX1BBUkFNRVRFUlMgeworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCBjaGFyICpkZXNjOworICBpbnQgbmJQYXJhbXM7CisgIFBsdWdpblBhcmFtICoqcGFyYW1zOworfSBQbHVnaW5QYXJhbWV0ZXJzOworCit2b2lkIGdvb21fcGx1Z2luX3BhcmFtZXRlcnMoUGx1Z2luUGFyYW1ldGVycyAqcCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5iKTsKK3ZvaWQgZ29vbV9wbHVnaW5fcGFyYW1ldGVyc19mcmVlKFBsdWdpblBhcmFtZXRlcnMgKnApOworCisjZGVmaW5lIHNlY3VyZV9wYXJhbSBnb29tX3NlY3VyZV9wYXJhbQorI2RlZmluZSBzZWN1cmVfZl9wYXJhbSBnb29tX3NlY3VyZV9mX3BhcmFtCisjZGVmaW5lIHNlY3VyZV9pX3BhcmFtIGdvb21fc2VjdXJlX2lfcGFyYW0KKyNkZWZpbmUgc2VjdXJlX2JfcGFyYW0gZ29vbV9zZWN1cmVfYl9wYXJhbQorI2RlZmluZSBzZWN1cmVfc19wYXJhbSBnb29tX3NlY3VyZV9zX3BhcmFtCisjZGVmaW5lIHNlY3VyZV9mX2ZlZWRiYWNrIGdvb21fc2VjdXJlX2ZfZmVlZGJhY2sKKyNkZWZpbmUgc2VjdXJlX2lfZmVlZGJhY2sgZ29vbV9zZWN1cmVfaV9mZWVkYmFjaworI2RlZmluZSBzZXRfbGlzdF9wYXJhbV92YWx1ZSBnb29tX3NldF9saXN0X3BhcmFtX3ZhbHVlCisjZGVmaW5lIHNldF9zdHJfcGFyYW1fdmFsdWUgZ29vbV9zZXRfc3RyX3BhcmFtX3ZhbHVlCisjZGVmaW5lIHBsdWdpbl9wYXJhbWV0ZXJzIGdvb21fcGx1Z2luX3BhcmFtZXRlcnMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9nb29tX2NvcmUuYyBiL2dzdC9nb29tL2dvb21fY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMWQ0ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9nb29tX2NvcmUuYwpAQCAtMCwwICsxLDg1NiBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBKZWFuLUNocmlzdG9waGUgSG9lbHQgPGpla29AZnJlZS5mcj4KKyAqCisgKiBnb29tX2NvcmUuYzpDb250YWlucyB0aGUgY29yZSBvZiBnb29tJ3Mgd29yay4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdvb20uaCIKKyNpbmNsdWRlICJnb29tX3Rvb2xzLmgiCisjaW5jbHVkZSAiZ29vbV9maWx0ZXJzLmgiCisjaW5jbHVkZSAibGluZXMuaCIKKyNpbmNsdWRlICJpZnMuaCIKKyNpbmNsdWRlICJ0ZW50YWNsZTNkLmgiCisKKyNpbmNsdWRlICJzb3VuZF90ZXN0ZXIuaCIKKyNpbmNsdWRlICJnb29tX3BsdWdpbl9pbmZvLmgiCisjaW5jbHVkZSAiZ29vbV9meC5oIgorCisvKiAjZGVmaW5lIFZFUkJPU0UgKi8KKworI2RlZmluZSBTVE9QX1NQRUVEIDEyOAorLyogVE9ETzogcHV0IHRoYXQgYXMgdmFyaWFibGUgaW4gUGx1Z2luSW5mbyAqLworI2RlZmluZSBUSU1FX0JUV19DSEcgMzAwCisKK3N0YXRpYyB2b2lkIGNob29zZV9hX2dvb21fbGluZSAoUGx1Z2luSW5mbyAqIGdvb21JbmZvLCBmbG9hdCAqcGFyYW0xLAorICAgIGZsb2F0ICpwYXJhbTIsIGludCAqY291bGV1ciwgaW50ICptb2RlLCBmbG9hdCAqYW1wbGl0dWRlLCBpbnQgZmFyKTsKKworc3RhdGljIHZvaWQKK2luaXRfYnVmZmVycyAoUGx1Z2luSW5mbyAqIGdvb21JbmZvLCBpbnQgYnVmZnNpemUpCit7CisgIGdvb21JbmZvLT5waXhlbCA9IChndWludDMyICopIG1hbGxvYyAoYnVmZnNpemUgKiBzaXplb2YgKGd1aW50MzIpICsgMTI4KTsKKyAgbWVtc2V0IChnb29tSW5mby0+cGl4ZWwsIDAsIGJ1ZmZzaXplICogc2l6ZW9mIChndWludDMyKSArIDEyOCk7CisgIGdvb21JbmZvLT5iYWNrID0gKGd1aW50MzIgKikgbWFsbG9jIChidWZmc2l6ZSAqIHNpemVvZiAoZ3VpbnQzMikgKyAxMjgpOworICBtZW1zZXQgKGdvb21JbmZvLT5iYWNrLCAwLCBidWZmc2l6ZSAqIHNpemVvZiAoZ3VpbnQzMikgKyAxMjgpOworICBnb29tSW5mby0+Y29udiA9IChQaXhlbCAqKSBtYWxsb2MgKGJ1ZmZzaXplICogc2l6ZW9mIChndWludDMyKSArIDEyOCk7CisgIG1lbXNldCAoZ29vbUluZm8tPmNvbnYsIDAsIGJ1ZmZzaXplICogc2l6ZW9mIChndWludDMyKSArIDEyOCk7CisKKyAgZ29vbUluZm8tPm91dHB1dEJ1ZiA9IGdvb21JbmZvLT5jb252OworCisgIGdvb21JbmZvLT5wMSA9IChQaXhlbCAqKSAoKDEgKyAoKHVpbnRwdHJfdCkgKGdvb21JbmZvLT5waXhlbCkpIC8gMTI4KSAqIDEyOCk7CisgIGdvb21JbmZvLT5wMiA9IChQaXhlbCAqKSAoKDEgKyAoKHVpbnRwdHJfdCkgKGdvb21JbmZvLT5iYWNrKSkgLyAxMjgpICogMTI4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgSU5JVCAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKiovCitQbHVnaW5JbmZvICoKK2dvb21faW5pdCAoZ3VpbnQzMiByZXN4LCBndWludDMyIHJlc3kpCit7CisgIFBsdWdpbkluZm8gKmdvb21JbmZvID0gKFBsdWdpbkluZm8gKikgbWFsbG9jIChzaXplb2YgKFBsdWdpbkluZm8pKTsKKworI2lmZGVmIFZFUkJPU0UKKyAgcHJpbnRmICgiR09PTTogaW5pdCAoJWQsICVkKTtcbiIsIHJlc3gsIHJlc3kpOworI2VuZGlmCisKKyAgcGx1Z2luX2luZm9faW5pdCAoZ29vbUluZm8sIDQpOworCisgIGdvb21JbmZvLT5zY3JlZW4ud2lkdGggPSByZXN4OworICBnb29tSW5mby0+c2NyZWVuLmhlaWdodCA9IHJlc3k7CisgIGdvb21JbmZvLT5zY3JlZW4uc2l6ZSA9IHJlc3ggKiByZXN5OworCisgIGluaXRfYnVmZmVycyAoZ29vbUluZm8sIGdvb21JbmZvLT5zY3JlZW4uc2l6ZSk7CisgIGdvb21JbmZvLT5nUmFuZG9tID0gZ29vbV9yYW5kb21faW5pdCAoKHVpbnRwdHJfdCkgZ29vbUluZm8tPnBpeGVsKTsKKworICBnb29tSW5mby0+Y3ljbGUgPSAwOworCisgIGZseWluZ19zdGFyX2NyZWF0ZSAoJmdvb21JbmZvLT5zdGFyX2Z4KTsKKyAgZ29vbUluZm8tPnN0YXJfZnguaW5pdCAoJmdvb21JbmZvLT5zdGFyX2Z4LCBnb29tSW5mbyk7CisKKyAgem9vbUZpbHRlclZpc3VhbEZYV3JhcHBlcl9jcmVhdGUgKCZnb29tSW5mby0+em9vbUZpbHRlcl9meCk7CisgIGdvb21JbmZvLT56b29tRmlsdGVyX2Z4LmluaXQgKCZnb29tSW5mby0+em9vbUZpbHRlcl9meCwgZ29vbUluZm8pOworCisgIHRlbnRhY2xlX2Z4X2NyZWF0ZSAoJmdvb21JbmZvLT50ZW50YWNsZXNfZngpOworICBnb29tSW5mby0+dGVudGFjbGVzX2Z4LmluaXQgKCZnb29tSW5mby0+dGVudGFjbGVzX2Z4LCBnb29tSW5mbyk7CisKKyAgY29udm9sdmVfY3JlYXRlICgmZ29vbUluZm8tPmNvbnZvbHZlX2Z4KTsKKyAgZ29vbUluZm8tPmNvbnZvbHZlX2Z4LmluaXQgKCZnb29tSW5mby0+Y29udm9sdmVfZngsIGdvb21JbmZvKTsKKworICBwbHVnaW5faW5mb19hZGRfdmlzdWFsIChnb29tSW5mbywgMCwgJmdvb21JbmZvLT56b29tRmlsdGVyX2Z4KTsKKyAgcGx1Z2luX2luZm9fYWRkX3Zpc3VhbCAoZ29vbUluZm8sIDEsICZnb29tSW5mby0+dGVudGFjbGVzX2Z4KTsKKyAgcGx1Z2luX2luZm9fYWRkX3Zpc3VhbCAoZ29vbUluZm8sIDIsICZnb29tSW5mby0+c3Rhcl9meCk7CisgIHBsdWdpbl9pbmZvX2FkZF92aXN1YWwgKGdvb21JbmZvLCAzLCAmZ29vbUluZm8tPmNvbnZvbHZlX2Z4KTsKKworICBpZnNfdmlzdWFsZnhfY3JlYXRlICgmZ29vbUluZm8tPmlmc19meCk7CisgIGdvb21JbmZvLT5pZnNfZnguaW5pdCAoJmdvb21JbmZvLT5pZnNfZngsIGdvb21JbmZvKTsKKworICBnb29tSW5mby0+Z21saW5lMSA9IGdvb21fbGluZXNfaW5pdCAoZ29vbUluZm8sIHJlc3gsIGdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0LAorICAgICAgR01MX0hMSU5FLCBnb29tSW5mby0+c2NyZWVuLmhlaWdodCwgR01MX0JMQUNLLAorICAgICAgR01MX0NJUkNMRSwgMC40ZiAqIChmbG9hdCkgZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQsIEdNTF9WRVJUKTsKKyAgZ29vbUluZm8tPmdtbGluZTIgPSBnb29tX2xpbmVzX2luaXQgKGdvb21JbmZvLCByZXN4LCBnb29tSW5mby0+c2NyZWVuLmhlaWdodCwKKyAgICAgIEdNTF9ITElORSwgMCwgR01MX0JMQUNLLAorICAgICAgR01MX0NJUkNMRSwgMC4yZiAqIChmbG9hdCkgZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQsIEdNTF9SRUQpOworCisgIC8qIGdvb21fc2V0X21haW5fc2NyaXB0KGdvb21JbmZvLCBnb29tSW5mby0+bWFpbl9zY3JpcHRfc3RyKTsgKi8KKworICByZXR1cm4gZ29vbUluZm87Cit9CisKKworCit2b2lkCitnb29tX3NldF9yZXNvbHV0aW9uIChQbHVnaW5JbmZvICogZ29vbUluZm8sIGd1aW50MzIgcmVzeCwgZ3VpbnQzMiByZXN5KQoreworICBmcmVlIChnb29tSW5mby0+cGl4ZWwpOworICBmcmVlIChnb29tSW5mby0+YmFjayk7CisgIGZyZWUgKGdvb21JbmZvLT5jb252KTsKKworICBnb29tSW5mby0+c2NyZWVuLndpZHRoID0gcmVzeDsKKyAgZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQgPSByZXN5OworICBnb29tSW5mby0+c2NyZWVuLnNpemUgPSByZXN4ICogcmVzeTsKKworICBpbml0X2J1ZmZlcnMgKGdvb21JbmZvLCBnb29tSW5mby0+c2NyZWVuLnNpemUpOworCisgIC8qIGluaXRfaWZzIChnb29tSW5mbywgcmVzeCwgZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQpOyAqLworICBnb29tSW5mby0+aWZzX2Z4LmZyZWUgKCZnb29tSW5mby0+aWZzX2Z4KTsKKyAgZ29vbUluZm8tPmlmc19meC5pbml0ICgmZ29vbUluZm8tPmlmc19meCwgZ29vbUluZm8pOworCisgIGdvb21fbGluZXNfc2V0X3JlcyAoZ29vbUluZm8tPmdtbGluZTEsIHJlc3gsIGdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0KTsKKyAgZ29vbV9saW5lc19zZXRfcmVzIChnb29tSW5mby0+Z21saW5lMiwgcmVzeCwgZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQpOworfQorCitpbnQKK2dvb21fc2V0X3NjcmVlbmJ1ZmZlciAoUGx1Z2luSW5mbyAqIGdvb21JbmZvLCB2b2lkICpidWZmZXIpCit7CisgIGdvb21JbmZvLT5vdXRwdXRCdWYgPSAoUGl4ZWwgKikgYnVmZmVyOworICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgVVBEQVRFICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworKiBXQVJOSU5HOiB0aGlzIGlzIGEgNjAwIGxpbmVzIGZ1bmN0aW9uICEgKDIxLTExLTIwMDMpCisqLworZ3VpbnQzMiAqCitnb29tX3VwZGF0ZSAoUGx1Z2luSW5mbyAqIGdvb21JbmZvLCBnaW50MTYgZGF0YVsyXVs1MTJdLCBpbnQgZm9yY2VNb2RlLAorICAgIGZsb2F0IGZwcykKK3sKKyAgUGl4ZWwgKnJldHVybl92YWw7CisgIGd1aW50MzIgcG9pbnRXaWR0aDsKKyAgZ3VpbnQzMiBwb2ludEhlaWdodDsKKyAgaW50IGk7CisgIGZsb2F0IGxhcmdmYWN0b3I7ICAgICAgICAgICAgIC8qIGVsYXJnaXNzZW1lbnQgZGUgbCdpbnRlcnZhbGxlIGQn77+9dm9sdXRpb24gZGVzIHBvaW50cyAqLworICBQaXhlbCAqdG1wOworCisgIFpvb21GaWx0ZXJEYXRhICpwemZkOworCisgIC8qIHRlc3QgaWYgdGhlIGNvbmZpZyBoYXMgY2hhbmdlZCwgdXBkYXRlIGl0IGlmIHNvICovCisgIHBvaW50V2lkdGggPSAoZ29vbUluZm8tPnNjcmVlbi53aWR0aCAqIDIpIC8gNTsKKyAgcG9pbnRIZWlnaHQgPSAoKGdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0KSAqIDIpIC8gNTsKKworICAvKiAhIGV0dWRlIGR1IHNpZ25hbCAuLi4gKi8KKyAgZXZhbHVhdGVfc291bmQgKGRhdGEsICYoZ29vbUluZm8tPnNvdW5kKSk7CisKKyAgLyogZ29vbV9leGVjdXRlX21haW5fc2NyaXB0KGdvb21JbmZvKTsgKi8KKworICAvKiAhIGNhbGN1bCBkdSBkZXBsYWNlbWVudCBkZXMgcGV0aXRzIHBvaW50cyAuLi4gKi8KKyAgbGFyZ2ZhY3RvciA9CisgICAgICBnb29tSW5mby0+c291bmQuc3BlZWR2YXIgLyAxNTAuMGYgKyBnb29tSW5mby0+c291bmQudm9sdW1lIC8gMS41ZjsKKworICBpZiAobGFyZ2ZhY3RvciA+IDEuNWYpCisgICAgbGFyZ2ZhY3RvciA9IDEuNWY7CisKKyAgZ29vbUluZm8tPnVwZGF0ZS5kZWNheV9pZnMtLTsKKyAgaWYgKGdvb21JbmZvLT51cGRhdGUuZGVjYXlfaWZzID4gMCkKKyAgICBnb29tSW5mby0+dXBkYXRlLmlmc19pbmNyICs9IDI7CisgIGlmIChnb29tSW5mby0+dXBkYXRlLmRlY2F5X2lmcyA9PSAwKQorICAgIGdvb21JbmZvLT51cGRhdGUuaWZzX2luY3IgPSAwOworCisgIGlmIChnb29tSW5mby0+dXBkYXRlLnJlY2F5X2lmcykgeworICAgIGdvb21JbmZvLT51cGRhdGUuaWZzX2luY3IgLT0gMjsKKyAgICBnb29tSW5mby0+dXBkYXRlLnJlY2F5X2lmcy0tOworICAgIGlmICgoZ29vbUluZm8tPnVwZGF0ZS5yZWNheV9pZnMgPT0gMCkgJiYgKGdvb21JbmZvLT51cGRhdGUuaWZzX2luY3IgPD0gMCkpCisgICAgICBnb29tSW5mby0+dXBkYXRlLmlmc19pbmNyID0gMTsKKyAgfQorCisgIGlmIChnb29tSW5mby0+dXBkYXRlLmlmc19pbmNyID4gMCkKKyAgICBnb29tSW5mby0+aWZzX2Z4LmFwcGx5ICgmZ29vbUluZm8tPmlmc19meCwgZ29vbUluZm8tPnAyLCBnb29tSW5mby0+cDEsCisgICAgICAgIGdvb21JbmZvKTsKKworICBpZiAoZ29vbUluZm8tPmN1ckdTdGF0ZS0+ZHJhd1BvaW50cykgeworICAgIGZvciAoaSA9IDE7IGkgKiAxNSA8PSBnb29tSW5mby0+c291bmQuc3BlZWR2YXIgKiA4MC4wZiArIDE1OyBpKyspIHsKKyAgICAgIGdvb21JbmZvLT51cGRhdGUubG9vcHZhciArPSBnb29tSW5mby0+c291bmQuc3BlZWR2YXIgKiA1MCArIDE7CisKKyAgICAgIHBvaW50RmlsdGVyIChnb29tSW5mbywgZ29vbUluZm8tPnAxLAorICAgICAgICAgIFlFTExPVywKKyAgICAgICAgICAoKHBvaW50V2lkdGggLSA2LjBmKSAqIGxhcmdmYWN0b3IgKyA1LjBmKSwKKyAgICAgICAgICAoKHBvaW50SGVpZ2h0IC0gNi4wZikgKiBsYXJnZmFjdG9yICsgNS4wZiksCisgICAgICAgICAgaSAqIDE1Mi4wZiwgMTI4LjBmLCBnb29tSW5mby0+dXBkYXRlLmxvb3B2YXIgKyBpICogMjAzMik7CisgICAgICBwb2ludEZpbHRlciAoZ29vbUluZm8sIGdvb21JbmZvLT5wMSwgT1JBTkdFLAorICAgICAgICAgICgocG9pbnRXaWR0aCAvIDIpICogbGFyZ2ZhY3RvcikgLyBpICsgMTAuMGYgKiBpLAorICAgICAgICAgICgocG9pbnRIZWlnaHQgLyAyKSAqIGxhcmdmYWN0b3IpIC8gaSArIDEwLjBmICogaSwKKyAgICAgICAgICA5Ni4wZiwgaSAqIDgwLjBmLCBnb29tSW5mby0+dXBkYXRlLmxvb3B2YXIgLyBpKTsKKyAgICAgIHBvaW50RmlsdGVyIChnb29tSW5mbywgZ29vbUluZm8tPnAxLCBWSU9MRVQsCisgICAgICAgICAgKChwb2ludEhlaWdodCAvIDMgKyA1LjBmKSAqIGxhcmdmYWN0b3IpIC8gaSArIDEwLjBmICogaSwKKyAgICAgICAgICAoKHBvaW50SGVpZ2h0IC8gMyArIDUuMGYpICogbGFyZ2ZhY3RvcikgLyBpICsgMTAuMGYgKiBpLAorICAgICAgICAgIGkgKyAxMjIuMGYsIDEzNC4wZiwgZ29vbUluZm8tPnVwZGF0ZS5sb29wdmFyIC8gaSk7CisgICAgICBwb2ludEZpbHRlciAoZ29vbUluZm8sIGdvb21JbmZvLT5wMSwgQkxBQ0ssCisgICAgICAgICAgKChwb2ludEhlaWdodCAvIDMpICogbGFyZ2ZhY3RvciArIDIwLjBmKSwKKyAgICAgICAgICAoKHBvaW50SGVpZ2h0IC8gMykgKiBsYXJnZmFjdG9yICsgMjAuMGYpLAorICAgICAgICAgIDU4LjBmLCBpICogNjYuMGYsIGdvb21JbmZvLT51cGRhdGUubG9vcHZhciAvIGkpOworICAgICAgcG9pbnRGaWx0ZXIgKGdvb21JbmZvLCBnb29tSW5mby0+cDEsIFdISVRFLAorICAgICAgICAgIChwb2ludEhlaWdodCAqIGxhcmdmYWN0b3IgKyAxMC4wZiAqIGkpIC8gaSwKKyAgICAgICAgICAocG9pbnRIZWlnaHQgKiBsYXJnZmFjdG9yICsgMTAuMGYgKiBpKSAvIGksCisgICAgICAgICAgNjYuMGYsIDc0LjBmLCBnb29tSW5mby0+dXBkYXRlLmxvb3B2YXIgKyBpICogNTAwKTsKKyAgICB9CisgIH0KKworICAvKiBwYXIgZO+/vWZhdXQgcGFzIGRlIGNoYW5nZW1lbnQgZGUgem9vbSAqLworICBwemZkID0gTlVMTDsKKworICAvKiAKKyAgICogVGVzdCBmb3JjZU1vZGUKKyAgICovCisjaWZkZWYgVkVSQk9TRQorICBpZiAoZm9yY2VNb2RlICE9IDApIHsKKyAgICBwcmludGYgKCJmb3JjZW1vZGUgPSAlZFxuIiwgZm9yY2VNb2RlKTsKKyAgfQorI2VuZGlmCisKKworICAvKiBkaW1pbnVlciBkZSAxIGxlIHRlbXBzIGRlIGxvY2thZ2UgKi8KKyAgLyogbm90ZSBwb3VyIGNldXggcXVpIG4nb250IHBhcyBzdWl2aXMgOiBsZSBsb2NrdmFyIHBlcm1ldCBkJ2VtcGVjaGVyIHVuICovCisgIC8qIGNoYW5nZW1lbnQgZCdldGF0IGR1IHBsdWdpbiBqdXN0ZSBhcHJlcyB1biBhdXRyZSBjaGFuZ2VtZW50IGQnZXRhdC4gb2tpICovCisgIGlmICgtLWdvb21JbmZvLT51cGRhdGUubG9ja3ZhciA8IDApCisgICAgZ29vbUluZm8tPnVwZGF0ZS5sb2NrdmFyID0gMDsKKworICAvKiBvbiB2ZXJpZmllIHF1J2lsIG5lIHNlIHBhcyB1biB0cnVjIGludGVycmVzc2FudCBhdmVjIGxlIHNvbi4gKi8KKyAgaWYgKChnb29tSW5mby0+c291bmQudGltZVNpbmNlTGFzdEdvb20gPT0gMCkKKyAgICAgIHx8IChmb3JjZU1vZGUgPiAwKQorICAgICAgfHwgKGdvb21JbmZvLT51cGRhdGUuY3ljbGVzU2luY2VMYXN0Q2hhbmdlID4gVElNRV9CVFdfQ0hHKSkgeworCisgICAgLyogY2hhbmdlbWVudCBldmVudHVlbCBkZSBtb2RlICovCisgICAgaWYgKGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAxNikgPT0gMCkKKyAgICAgIHN3aXRjaCAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDM0KSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5oeXBlcmNvc0VmZmVjdCA9CisgICAgICAgICAgICAgIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAyKTsKKyAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLm1vZGUgPSBXQVZFX01PREU7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5yZXZlcnNlID0gMDsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLndhdmVFZmZlY3QgPQorICAgICAgICAgICAgICAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDMpID09IDApOworICAgICAgICAgIGlmIChnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMikpCisgICAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnZpdGVzc2UgPQorICAgICAgICAgICAgICAgIChnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnZpdGVzc2UgKyAxMjcpID4+IDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLm1vZGUgPSBDUllTVEFMX0JBTExfTU9ERTsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLndhdmVFZmZlY3QgPSAwOworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEuaHlwZXJjb3NFZmZlY3QgPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5tb2RlID0gQU1VTEVUVEVfTU9ERTsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLndhdmVFZmZlY3QgPSAwOworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEuaHlwZXJjb3NFZmZlY3QgPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5tb2RlID0gV0FURVJfTU9ERTsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLndhdmVFZmZlY3QgPSAwOworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEuaHlwZXJjb3NFZmZlY3QgPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5tb2RlID0gU0NSVU5DSF9NT0RFOworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEud2F2ZUVmZmVjdCA9IDA7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5oeXBlcmNvc0VmZmVjdCA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgY2FzZSAxNToKKyAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLm1vZGUgPSBIWVBFUkNPUzFfTU9ERTsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLndhdmVFZmZlY3QgPSAwOworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEuaHlwZXJjb3NFZmZlY3QgPQorICAgICAgICAgICAgICAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDMpID09IDApOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5tb2RlID0gSFlQRVJDT1MyX01PREU7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS53YXZlRWZmZWN0ID0gMDsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLmh5cGVyY29zRWZmZWN0ID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICBjYXNlIDE3OgorICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEubW9kZSA9IENSWVNUQUxfQkFMTF9NT0RFOworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEud2F2ZUVmZmVjdCA9CisgICAgICAgICAgICAgIChnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgNCkgPT0gMCk7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5oeXBlcmNvc0VmZmVjdCA9CisgICAgICAgICAgICAgIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICBjYXNlIDE4OgorICAgICAgICBjYXNlIDE5OgorICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEubW9kZSA9IFNDUlVOQ0hfTU9ERTsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLndhdmVFZmZlY3QgPSAxOworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEuaHlwZXJjb3NFZmZlY3QgPSAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI5OgorICAgICAgICBjYXNlIDMwOgorICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEubW9kZSA9IFlPTkxZX01PREU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzE6CisgICAgICAgIGNhc2UgMzI6CisgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5tb2RlID0gU1BFRURXQVlfTU9ERTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLm1vZGUgPSBOT1JNQUxfTU9ERTsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLndhdmVFZmZlY3QgPSAwOworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEuaHlwZXJjb3NFZmZlY3QgPSAwOworICAgICAgfQorICB9CisKKyAgLyogdG91dCBjZWNpIG5lIHNlcmEgZmFpdCBxdSdlbiBjYXMgZGUgbm9uLWJsb2NhZ2UgKi8KKyAgaWYgKGdvb21JbmZvLT51cGRhdGUubG9ja3ZhciA9PSAwKSB7CisgICAgLyogcmVwZXJhZ2UgZGUgZ29vbSAoYWNjZWxlcmF0aW9uIGZvcnRlIGRlIGwnYWNjZWxlcmF0aW9uIGR1IHZvbHVtZSkgKi8KKyAgICAvKiAtPiBjb3VwIGRlIGJvb3N0IGRlIGxhIHZpdGVzc2Ugc2kgYmVzb2luLi4gKi8KKyAgICBpZiAoZ29vbUluZm8tPnNvdW5kLnRpbWVTaW5jZUxhc3RHb29tID09IDApIHsKKworICAgICAgaW50IGk7CisKKyAgICAgIGdvb21JbmZvLT51cGRhdGUuZ29vbXZhcisrOworCisgICAgICAvKiBTRUxFQ1RJT04gT0YgVEhFIEdPT00gU1RBVEUgKi8KKyAgICAgIGlmICgoIWdvb21JbmZvLT51cGRhdGUuc3RhdGVTZWxlY3Rpb25CbG9ja2VyKQorICAgICAgICAgICYmIChnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMykpKSB7CisgICAgICAgIGdvb21JbmZvLT51cGRhdGUuc3RhdGVTZWxlY3Rpb25SbmQgPQorICAgICAgICAgICAgZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIGdvb21JbmZvLT5zdGF0ZXNSYW5nZU1heCk7CisgICAgICAgIGdvb21JbmZvLT51cGRhdGUuc3RhdGVTZWxlY3Rpb25CbG9ja2VyID0gMzsKKyAgICAgIH0gZWxzZSBpZiAoZ29vbUluZm8tPnVwZGF0ZS5zdGF0ZVNlbGVjdGlvbkJsb2NrZXIpCisgICAgICAgIGdvb21JbmZvLT51cGRhdGUuc3RhdGVTZWxlY3Rpb25CbG9ja2VyLS07CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBnb29tSW5mby0+c3RhdGVzTnVtYmVyOyBpKyspCisgICAgICAgIGlmICgoZ29vbUluZm8tPnVwZGF0ZS5zdGF0ZVNlbGVjdGlvblJuZCA+PSBnb29tSW5mby0+c3RhdGVzW2ldLnJhbmdlbWluKQorICAgICAgICAgICAgJiYgKGdvb21JbmZvLT51cGRhdGUuc3RhdGVTZWxlY3Rpb25SbmQgPD0KKyAgICAgICAgICAgICAgICBnb29tSW5mby0+c3RhdGVzW2ldLnJhbmdlbWF4KSkKKyAgICAgICAgICBnb29tSW5mby0+Y3VyR1N0YXRlID0gJihnb29tSW5mby0+c3RhdGVzW2ldKTsKKworICAgICAgaWYgKChnb29tSW5mby0+Y3VyR1N0YXRlLT5kcmF3SUZTKSAmJiAoZ29vbUluZm8tPnVwZGF0ZS5pZnNfaW5jciA8PSAwKSkgeworICAgICAgICBnb29tSW5mby0+dXBkYXRlLnJlY2F5X2lmcyA9IDU7CisgICAgICAgIGdvb21JbmZvLT51cGRhdGUuaWZzX2luY3IgPSAxMTsKKyAgICAgIH0KKworICAgICAgaWYgKCghZ29vbUluZm8tPmN1ckdTdGF0ZS0+ZHJhd0lGUykgJiYgKGdvb21JbmZvLT51cGRhdGUuaWZzX2luY3IgPiAwKQorICAgICAgICAgICYmIChnb29tSW5mby0+dXBkYXRlLmRlY2F5X2lmcyA8PSAwKSkKKyAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS5kZWNheV9pZnMgPSAxMDA7CisKKyAgICAgIGlmICghZ29vbUluZm8tPmN1ckdTdGF0ZS0+ZHJhd1Njb3BlKQorICAgICAgICBnb29tSW5mby0+dXBkYXRlLnN0b3BfbGluZXMgPSAweGYwMDAgJiA1OworCisgICAgICBpZiAoIWdvb21JbmZvLT5jdXJHU3RhdGUtPmRyYXdTY29wZSkgeworICAgICAgICBnb29tSW5mby0+dXBkYXRlLnN0b3BfbGluZXMgPSAwOworICAgICAgICBnb29tSW5mby0+dXBkYXRlLmxpbmVNb2RlID0gZ29vbUluZm8tPnVwZGF0ZS5kcmF3TGluZXNEdXJhdGlvbjsKKyAgICAgIH0KKworICAgICAgLyogaWYgKGdvb21JbmZvLT51cGRhdGUuZ29vbXZhciAlIDEgPT0gMCkgKi8KKyAgICAgIHsKKyAgICAgICAgZ3VpbnQzMiB2dG1wOworICAgICAgICBndWludDMyIG5ld3ZpdDsKKworICAgICAgICBnb29tSW5mby0+dXBkYXRlLmxvY2t2YXIgPSA1MDsKKyAgICAgICAgbmV3dml0ID0KKyAgICAgICAgICAgIFNUT1BfU1BFRUQgKyAxIC0KKyAgICAgICAgICAgICgoZmxvYXQpIDMuNWYgKiBsb2cxMCAoZ29vbUluZm8tPnNvdW5kLnNwZWVkdmFyICogNjAgKyAxKSk7CisgICAgICAgIC8qIHJldGFibGlyIGxlIHpvb20gYXZhbnQuLiAqLworICAgICAgICBpZiAoKGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEucmV2ZXJzZSkKKyAgICAgICAgICAgICYmICghKGdvb21JbmZvLT5jeWNsZSAlIDEzKSkgJiYgKHJhbmQgKCkgJSA1ID09IDApKSB7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5yZXZlcnNlID0gMDsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnZpdGVzc2UgPSBTVE9QX1NQRUVEIC0gMjsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLmxvY2t2YXIgPSA3NTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDEwKSA9PSAwKSB7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5yZXZlcnNlID0gMTsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLmxvY2t2YXIgPSAxMDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDEwKSA9PSAwKQorICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudml0ZXNzZSA9IFNUT1BfU1BFRUQgLSAxOworICAgICAgICBpZiAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDEyKSA9PSAwKQorICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudml0ZXNzZSA9IFNUT1BfU1BFRUQgKyAxOworCisgICAgICAgIC8qIGNoYW5nZW1lbnQgZGUgbWlsaWV1Li4gKi8KKyAgICAgICAgc3dpdGNoIChnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMjUpKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLm1pZGRsZVkgPQorICAgICAgICAgICAgICAgIGdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0IC0gMTsKKyAgICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEubWlkZGxlWCA9CisgICAgICAgICAgICAgICAgZ29vbUluZm8tPnNjcmVlbi53aWR0aCAvIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5taWRkbGVYID0KKyAgICAgICAgICAgICAgICBnb29tSW5mby0+c2NyZWVuLndpZHRoIC0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLm1pZGRsZVggPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEubWlkZGxlWSA9CisgICAgICAgICAgICAgICAgZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQgLyAyOworICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5taWRkbGVYID0KKyAgICAgICAgICAgICAgICBnb29tSW5mby0+c2NyZWVuLndpZHRoIC8gMjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5tb2RlID09IFdBVEVSX01PREUpCisgICAgICAgICAgICB8fCAoZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5tb2RlID09IFlPTkxZX01PREUpCisgICAgICAgICAgICB8fCAoZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5tb2RlID09IEFNVUxFVFRFX01PREUpKSB7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5taWRkbGVYID0gZ29vbUluZm8tPnNjcmVlbi53aWR0aCAvIDI7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5taWRkbGVZID0gZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQgLyAyOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoICh2dG1wID0gKGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAxNSkpKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS52UGxhbmVFZmZlY3QgPQorICAgICAgICAgICAgICAgIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAzKQorICAgICAgICAgICAgICAgIC0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDMpOworICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5oUGxhbmVFZmZlY3QgPQorICAgICAgICAgICAgICAgIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAzKQorICAgICAgICAgICAgICAgIC0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS52UGxhbmVFZmZlY3QgPSAwOworICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5oUGxhbmVFZmZlY3QgPQorICAgICAgICAgICAgICAgIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCA4KQorICAgICAgICAgICAgICAgIC0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS52UGxhbmVFZmZlY3QgPQorICAgICAgICAgICAgICAgIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCA1KQorICAgICAgICAgICAgICAgIC0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDUpOworICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5oUGxhbmVFZmZlY3QgPQorICAgICAgICAgICAgICAgIC1nb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnZQbGFuZUVmZmVjdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEuaFBsYW5lRWZmZWN0ID0KKyAgICAgICAgICAgICAgICA1ICsgZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDgpOworICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS52UGxhbmVFZmZlY3QgPQorICAgICAgICAgICAgICAgIC1nb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLmhQbGFuZUVmZmVjdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudlBsYW5lRWZmZWN0ID0KKyAgICAgICAgICAgICAgICA1ICsgZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDgpOworICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5oUGxhbmVFZmZlY3QgPQorICAgICAgICAgICAgICAgIC1nb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLmhQbGFuZUVmZmVjdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLmhQbGFuZUVmZmVjdCA9IDA7CisgICAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnZQbGFuZUVmZmVjdCA9CisgICAgICAgICAgICAgICAgZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDEwKQorICAgICAgICAgICAgICAgIC0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDEwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLmhQbGFuZUVmZmVjdCA9CisgICAgICAgICAgICAgICAgZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDEwKQorICAgICAgICAgICAgICAgIC0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDEwKTsKKyAgICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudlBsYW5lRWZmZWN0ID0KKyAgICAgICAgICAgICAgICBnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMTApCisgICAgICAgICAgICAgICAgLSBnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMTApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICh2dG1wIDwgMTApIHsKKyAgICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS52UGxhbmVFZmZlY3QgPSAwOworICAgICAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLmhQbGFuZUVmZmVjdCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDUpICE9IDApCisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5ub2lzaWZ5ID0gMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5ub2lzaWZ5ID0KKyAgICAgICAgICAgICAgZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDIpICsgMTsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLmxvY2t2YXIgKj0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLm1vZGUgPT0gQU1VTEVUVEVfTU9ERSkgeworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudlBsYW5lRWZmZWN0ID0gMDsKKyAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLmhQbGFuZUVmZmVjdCA9IDA7CisgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5ub2lzaWZ5ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5taWRkbGVYID09IDEpCisgICAgICAgICAgICB8fCAoZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5taWRkbGVYID09CisgICAgICAgICAgICAgICAgKHNpZ25lZCBpbnQpIGdvb21JbmZvLT5zY3JlZW4ud2lkdGggLSAxKSkgeworICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudlBsYW5lRWZmZWN0ID0gMDsKKyAgICAgICAgICBpZiAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDIpKQorICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5oUGxhbmVFZmZlY3QgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChzaWduZWQgaW50KSBuZXd2aXQgPCBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnZpdGVzc2UpIHsgICAgLyogb24gYWNjZWxlcmUgKi8KKyAgICAgICAgICBwemZkID0gJmdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGE7CisgICAgICAgICAgaWYgKCgobmV3dml0IDwgU1RPUF9TUEVFRCAtIDcpICYmCisgICAgICAgICAgICAgICAgICAoZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS52aXRlc3NlIDwgU1RPUF9TUEVFRCAtIDYpICYmCisgICAgICAgICAgICAgICAgICAoZ29vbUluZm8tPmN5Y2xlICUgMyA9PSAwKSkKKyAgICAgICAgICAgICAgfHwgKGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCA0MCkgPT0gMCkpIHsKKyAgICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudml0ZXNzZSA9CisgICAgICAgICAgICAgICAgU1RPUF9TUEVFRCAtIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAyKQorICAgICAgICAgICAgICAgICsgZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDIpOworICAgICAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5yZXZlcnNlID0KKyAgICAgICAgICAgICAgICAhZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5yZXZlcnNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnZpdGVzc2UgPQorICAgICAgICAgICAgICAgIChuZXd2aXQgKyBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnZpdGVzc2UgKiA3KSAvIDg7CisgICAgICAgICAgfQorICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUubG9ja3ZhciArPSA1MDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoZ29vbUluZm8tPnVwZGF0ZS5sb2NrdmFyID4gMTUwKSB7CisgICAgICAgIGdvb21JbmZvLT51cGRhdGUuc3dpdGNoSW5jciA9IGdvb21JbmZvLT51cGRhdGUuc3dpdGNoSW5jckFtb3VudDsKKyAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS5zd2l0Y2hNdWx0ID0gMS4wZjsKKyAgICAgIH0KKyAgICB9CisgICAgLyogbW9kZSBtZWdhLWxlbnQgKi8KKyAgICBpZiAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDcwMCkgPT0gMCkgeworICAgICAgLyogCisgICAgICAgKiBwcmludGYgKCJjb3VwIGR1IHNvcnQuLi5cbiIpIDsKKyAgICAgICAqLworICAgICAgcHpmZCA9ICZnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhOworICAgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS52aXRlc3NlID0gU1RPUF9TUEVFRCAtIDE7CisgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnBlcnRlZGVjID0gODsKKyAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEuc3FydHBlcnRlID0gMTY7CisgICAgICBnb29tSW5mby0+dXBkYXRlLmdvb212YXIgPSAxOworICAgICAgZ29vbUluZm8tPnVwZGF0ZS5sb2NrdmFyICs9IDUwOworICAgICAgZ29vbUluZm8tPnVwZGF0ZS5zd2l0Y2hJbmNyID0gZ29vbUluZm8tPnVwZGF0ZS5zd2l0Y2hJbmNyQW1vdW50OworICAgICAgZ29vbUluZm8tPnVwZGF0ZS5zd2l0Y2hNdWx0ID0gMS4wZjsKKyAgICB9CisgIH0KKworICAvKgorICAgKiBncm9zIGZyZWluIHNpIGxhIG11c2lxdWUgZXN0IGNhbG1lCisgICAqLworICBpZiAoKGdvb21JbmZvLT5zb3VuZC5zcGVlZHZhciA8IDAuMDFmKQorICAgICAgJiYgKGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudml0ZXNzZSA8IFNUT1BfU1BFRUQgLSA0KQorICAgICAgJiYgKGdvb21JbmZvLT5jeWNsZSAlIDE2ID09IDApKSB7CisgICAgcHpmZCA9ICZnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhOworICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudml0ZXNzZSArPSAzOworICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEucGVydGVkZWMgPSA4OworICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEuc3FydHBlcnRlID0gMTY7CisgICAgZ29vbUluZm8tPnVwZGF0ZS5nb29tdmFyID0gMDsKKyAgfQorCisgIC8qCisgICAqIGJhaXNzZXIgcmVndWxpZXJlbWVudCBsYSB2aXRlc3NlLi4uCisgICAqLworICBpZiAoKGdvb21JbmZvLT5jeWNsZSAlIDczID09IDApCisgICAgICAmJiAoZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS52aXRlc3NlIDwgU1RPUF9TUEVFRCAtIDUpKSB7CisgICAgcHpmZCA9ICZnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhOworICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudml0ZXNzZSsrOworICB9CisKKyAgLyoKKyAgICogYXJyZXRlciBkZSBkZWNy77+9bWVudGVyIGF1IGJvdXQgZCd1biBjZXJ0YWluIHRlbXBzCisgICAqLworICBpZiAoKGdvb21JbmZvLT5jeWNsZSAlIDEwMSA9PSAwKQorICAgICAgJiYgKGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEucGVydGVkZWMgPT0gNykpIHsKKyAgICBwemZkID0gJmdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGE7CisgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5wZXJ0ZWRlYyA9IDg7CisgICAgZ29vbUluZm8tPnVwZGF0ZS56b29tRmlsdGVyRGF0YS5zcXJ0cGVydGUgPSAxNjsKKyAgfQorCisgIC8qCisgICAqIFBlcm1ldCBkZSBmb3JjZXIgdW4gZWZmZXQuCisgICAqLworICBpZiAoKGZvcmNlTW9kZSA+IDApICYmIChmb3JjZU1vZGUgPD0gTkJfRlgpKSB7CisgICAgcHpmZCA9ICZnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhOworICAgIHB6ZmQtPm1vZGUgPSBmb3JjZU1vZGUgLSAxOworICB9CisKKyAgaWYgKGZvcmNlTW9kZSA9PSAtMSkgeworICAgIHB6ZmQgPSBOVUxMOworICB9CisKKyAgLyoKKyAgICogQ2hhbmdlbWVudCBkJ2VmZmV0IGRlIHpvb20gIQorICAgKi8KKyAgaWYgKHB6ZmQgIT0gTlVMTCkgeworICAgIGludCBkaWY7CisKKyAgICBnb29tSW5mby0+dXBkYXRlLmN5Y2xlc1NpbmNlTGFzdENoYW5nZSA9IDA7CisKKyAgICBnb29tSW5mby0+dXBkYXRlLnN3aXRjaEluY3IgPSBnb29tSW5mby0+dXBkYXRlLnN3aXRjaEluY3JBbW91bnQ7CisKKyAgICBkaWYgPQorICAgICAgICBnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhLnZpdGVzc2UgLQorICAgICAgICBnb29tSW5mby0+dXBkYXRlLnByZXZpb3VzWm9vbVNwZWVkOworICAgIGlmIChkaWYgPCAwKQorICAgICAgZGlmID0gLWRpZjsKKworICAgIGlmIChkaWYgPiAyKSB7CisgICAgICBnb29tSW5mby0+dXBkYXRlLnN3aXRjaEluY3IgKj0gKGRpZiArIDIpIC8gMjsKKyAgICB9CisgICAgZ29vbUluZm8tPnVwZGF0ZS5wcmV2aW91c1pvb21TcGVlZCA9CisgICAgICAgIGdvb21JbmZvLT51cGRhdGUuem9vbUZpbHRlckRhdGEudml0ZXNzZTsKKyAgICBnb29tSW5mby0+dXBkYXRlLnN3aXRjaE11bHQgPSAxLjBmOworCisgICAgaWYgKCgoZ29vbUluZm8tPnNvdW5kLnRpbWVTaW5jZUxhc3RHb29tID09IDApCisgICAgICAgICAgICAmJiAoZ29vbUluZm8tPnNvdW5kLnRvdGFsZ29vbSA8IDIpKSB8fCAoZm9yY2VNb2RlID4gMCkpIHsKKyAgICAgIGdvb21JbmZvLT51cGRhdGUuc3dpdGNoSW5jciA9IDA7CisgICAgICBnb29tSW5mby0+dXBkYXRlLnN3aXRjaE11bHQgPSBnb29tSW5mby0+dXBkYXRlLnN3aXRjaE11bHRBbW91bnQ7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChnb29tSW5mby0+dXBkYXRlLmN5Y2xlc1NpbmNlTGFzdENoYW5nZSA+IFRJTUVfQlRXX0NIRykgeworICAgICAgcHpmZCA9ICZnb29tSW5mby0+dXBkYXRlLnpvb21GaWx0ZXJEYXRhOworICAgICAgZ29vbUluZm8tPnVwZGF0ZS5jeWNsZXNTaW5jZUxhc3RDaGFuZ2UgPSAwOworICAgIH0gZWxzZQorICAgICAgZ29vbUluZm8tPnVwZGF0ZS5jeWNsZXNTaW5jZUxhc3RDaGFuZ2UrKzsKKyAgfQorCisjaWZkZWYgVkVSQk9TRQorICBpZiAocHpmZCkgeworICAgIHByaW50ZiAoIkdPT006IHB6ZmQtPm1vZGUgPSAlZFxuIiwgcHpmZC0+bW9kZSk7CisgIH0KKyNlbmRpZgorCisgIC8qIFpvb20gaGVyZSAhICovCisgIHpvb21GaWx0ZXJGYXN0UkdCIChnb29tSW5mbywgZ29vbUluZm8tPnAxLCBnb29tSW5mby0+cDIsIHB6ZmQsCisgICAgICBnb29tSW5mby0+c2NyZWVuLndpZHRoLCBnb29tSW5mby0+c2NyZWVuLmhlaWdodCwKKyAgICAgIGdvb21JbmZvLT51cGRhdGUuc3dpdGNoSW5jciwgZ29vbUluZm8tPnVwZGF0ZS5zd2l0Y2hNdWx0KTsKKworICAvKgorICAgKiBBZmZpY2hhZ2UgdGVudGFjdWxlCisgICAqLworCisgIGdvb21JbmZvLT50ZW50YWNsZXNfZnguYXBwbHkgKCZnb29tSW5mby0+dGVudGFjbGVzX2Z4LCBnb29tSW5mby0+cDEsCisgICAgICBnb29tSW5mby0+cDIsIGdvb21JbmZvKTsKKyAgZ29vbUluZm8tPnN0YXJfZnguYXBwbHkgKCZnb29tSW5mby0+c3Rhcl9meCwgZ29vbUluZm8tPnAyLCBnb29tSW5mby0+cDEsCisgICAgICBnb29tSW5mbyk7CisKKyAgLyoKKyAgICogR2VzdGlvbiBkdSBTY29wZQorICAgKi8KKworICAvKgorICAgKiBhcnJldCBkZW1hbmRlCisgICAqLworICBpZiAoKGdvb21JbmZvLT51cGRhdGUuc3RvcF9saW5lcyAmIDB4ZjAwMCkKKyAgICAgIHx8ICghZ29vbUluZm8tPmN1ckdTdGF0ZS0+ZHJhd1Njb3BlKSkgeworICAgIGZsb2F0IHBhcmFtMSA9IDAsIHBhcmFtMiA9IDAsIGFtcGxpdHVkZTsKKyAgICBpbnQgY291bGV1cjsKKyAgICBpbnQgbW9kZTsKKworICAgIGNob29zZV9hX2dvb21fbGluZSAoZ29vbUluZm8sICZwYXJhbTEsICZwYXJhbTIsICZjb3VsZXVyLCAmbW9kZSwgJmFtcGxpdHVkZSwKKyAgICAgICAgMSk7CisgICAgY291bGV1ciA9IEdNTF9CTEFDSzsKKworICAgIGdvb21fbGluZXNfc3dpdGNoX3RvIChnb29tSW5mby0+Z21saW5lMSwgbW9kZSwgcGFyYW0xLCBhbXBsaXR1ZGUsIGNvdWxldXIpOworICAgIGdvb21fbGluZXNfc3dpdGNoX3RvIChnb29tSW5mby0+Z21saW5lMiwgbW9kZSwgcGFyYW0yLCBhbXBsaXR1ZGUsIGNvdWxldXIpOworICAgIGdvb21JbmZvLT51cGRhdGUuc3RvcF9saW5lcyAmPSAweDBmZmY7CisgIH0KKworICAvKgorICAgKiBhcnJldCBhbGVhdG9yZS4uIGNoYW5nZW1lbnQgZGUgbW9kZSBkZSBsaWduZS4uCisgICAqLworICBpZiAoZ29vbUluZm8tPnVwZGF0ZS5saW5lTW9kZSAhPSBnb29tSW5mby0+dXBkYXRlLmRyYXdMaW5lc0R1cmF0aW9uKSB7CisgICAgZ29vbUluZm8tPnVwZGF0ZS5saW5lTW9kZS0tOworICAgIGlmIChnb29tSW5mby0+dXBkYXRlLmxpbmVNb2RlID09IC0xKQorICAgICAgZ29vbUluZm8tPnVwZGF0ZS5saW5lTW9kZSA9IDA7CisgIH0gZWxzZSBpZiAoKGdvb21JbmZvLT5jeWNsZSAlIDgwID09IDApCisgICAgICAmJiAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDUpID09IDApICYmIGdvb21JbmZvLT51cGRhdGUubGluZU1vZGUpCisgICAgZ29vbUluZm8tPnVwZGF0ZS5saW5lTW9kZS0tOworCisgIGlmICgoZ29vbUluZm8tPmN5Y2xlICUgMTIwID09IDApCisgICAgICAmJiAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDQpID09IDApCisgICAgICAmJiAoZ29vbUluZm8tPmN1ckdTdGF0ZS0+ZHJhd1Njb3BlKSkgeworICAgIGlmIChnb29tSW5mby0+dXBkYXRlLmxpbmVNb2RlID09IDApCisgICAgICBnb29tSW5mby0+dXBkYXRlLmxpbmVNb2RlID0gZ29vbUluZm8tPnVwZGF0ZS5kcmF3TGluZXNEdXJhdGlvbjsKKyAgICBlbHNlIGlmIChnb29tSW5mby0+dXBkYXRlLmxpbmVNb2RlID09IGdvb21JbmZvLT51cGRhdGUuZHJhd0xpbmVzRHVyYXRpb24pIHsKKyAgICAgIGZsb2F0IHBhcmFtMSwgcGFyYW0yLCBhbXBsaXR1ZGU7CisgICAgICBpbnQgY291bGV1cjEsIGNvdWxldXIyOworICAgICAgaW50IG1vZGU7CisKKyAgICAgIGdvb21JbmZvLT51cGRhdGUubGluZU1vZGUtLTsKKyAgICAgIGNob29zZV9hX2dvb21fbGluZSAoZ29vbUluZm8sICZwYXJhbTEsICZwYXJhbTIsICZjb3VsZXVyMSwKKyAgICAgICAgICAmbW9kZSwgJmFtcGxpdHVkZSwgZ29vbUluZm8tPnVwZGF0ZS5zdG9wX2xpbmVzKTsKKworICAgICAgY291bGV1cjIgPSA1IC0gY291bGV1cjE7CisgICAgICBpZiAoZ29vbUluZm8tPnVwZGF0ZS5zdG9wX2xpbmVzKSB7CisgICAgICAgIGdvb21JbmZvLT51cGRhdGUuc3RvcF9saW5lcy0tOworICAgICAgICBpZiAoZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDIpKQorICAgICAgICAgIGNvdWxldXIyID0gY291bGV1cjEgPSBHTUxfQkxBQ0s7CisgICAgICB9CisKKyAgICAgIGdvb21fbGluZXNfc3dpdGNoX3RvIChnb29tSW5mby0+Z21saW5lMSwgbW9kZSwgcGFyYW0xLCBhbXBsaXR1ZGUsCisgICAgICAgICAgY291bGV1cjEpOworICAgICAgZ29vbV9saW5lc19zd2l0Y2hfdG8gKGdvb21JbmZvLT5nbWxpbmUyLCBtb2RlLCBwYXJhbTIsIGFtcGxpdHVkZSwKKyAgICAgICAgICBjb3VsZXVyMik7CisgICAgfQorICB9CisKKyAgLyoKKyAgICogc2kgb24gZXN0IGRhbnMgdW4gZ29vbSA6IGFmZmljaGVyIGxlcyBsaWduZXMuLi4KKyAgICovCisgIGlmICgoZ29vbUluZm8tPnVwZGF0ZS5saW5lTW9kZSAhPSAwKQorICAgICAgfHwgKGdvb21JbmZvLT5zb3VuZC50aW1lU2luY2VMYXN0R29vbSA8IDUpKSB7CisgICAgZ29vbUluZm8tPmdtbGluZTItPnBvd2VyID0gZ29vbUluZm8tPmdtbGluZTEtPnBvd2VyOworCisgICAgZ29vbV9saW5lc19kcmF3IChnb29tSW5mbywgZ29vbUluZm8tPmdtbGluZTEsIGRhdGFbMF0sIGdvb21JbmZvLT5wMik7CisgICAgZ29vbV9saW5lc19kcmF3IChnb29tSW5mbywgZ29vbUluZm8tPmdtbGluZTIsIGRhdGFbMV0sIGdvb21JbmZvLT5wMik7CisKKyAgICBpZiAoKChnb29tSW5mby0+Y3ljbGUgJSAxMjEpID09IDkpCisgICAgICAgICYmIChnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMykgPT0gMSkKKyAgICAgICAgJiYgKChnb29tSW5mby0+dXBkYXRlLmxpbmVNb2RlID09IDApCisgICAgICAgICAgICB8fCAoZ29vbUluZm8tPnVwZGF0ZS5saW5lTW9kZSA9PQorICAgICAgICAgICAgICAgIGdvb21JbmZvLT51cGRhdGUuZHJhd0xpbmVzRHVyYXRpb24pKSkgeworICAgICAgZmxvYXQgcGFyYW0xLCBwYXJhbTIsIGFtcGxpdHVkZTsKKyAgICAgIGludCBjb3VsZXVyMSwgY291bGV1cjI7CisgICAgICBpbnQgbW9kZTsKKworICAgICAgY2hvb3NlX2FfZ29vbV9saW5lIChnb29tSW5mbywgJnBhcmFtMSwgJnBhcmFtMiwgJmNvdWxldXIxLAorICAgICAgICAgICZtb2RlLCAmYW1wbGl0dWRlLCBnb29tSW5mby0+dXBkYXRlLnN0b3BfbGluZXMpOworICAgICAgY291bGV1cjIgPSA1IC0gY291bGV1cjE7CisKKyAgICAgIGlmIChnb29tSW5mby0+dXBkYXRlLnN0b3BfbGluZXMpIHsKKyAgICAgICAgZ29vbUluZm8tPnVwZGF0ZS5zdG9wX2xpbmVzLS07CisgICAgICAgIGlmIChnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMikpCisgICAgICAgICAgY291bGV1cjIgPSBjb3VsZXVyMSA9IEdNTF9CTEFDSzsKKyAgICAgIH0KKyAgICAgIGdvb21fbGluZXNfc3dpdGNoX3RvIChnb29tSW5mby0+Z21saW5lMSwgbW9kZSwgcGFyYW0xLCBhbXBsaXR1ZGUsCisgICAgICAgICAgY291bGV1cjEpOworICAgICAgZ29vbV9saW5lc19zd2l0Y2hfdG8gKGdvb21JbmZvLT5nbWxpbmUyLCBtb2RlLCBwYXJhbTIsIGFtcGxpdHVkZSwKKyAgICAgICAgICBjb3VsZXVyMik7CisgICAgfQorICB9CisKKyAgcmV0dXJuX3ZhbCA9IGdvb21JbmZvLT5wMTsKKyAgdG1wID0gZ29vbUluZm8tPnAxOworICBnb29tSW5mby0+cDEgPSBnb29tSW5mby0+cDI7CisgIGdvb21JbmZvLT5wMiA9IHRtcDsKKworICAvKiBhZmZpY2hhZ2UgZXQgc3dhcHBhZ2UgZGVzIGJ1ZmZlcnMuLiAqLworICBnb29tSW5mby0+Y3ljbGUrKzsKKworICBnb29tSW5mby0+Y29udm9sdmVfZnguYXBwbHkgKCZnb29tSW5mby0+Y29udm9sdmVfZngsIHJldHVybl92YWwsCisgICAgICBnb29tSW5mby0+b3V0cHV0QnVmLCBnb29tSW5mbyk7CisKKyAgcmV0dXJuIChndWludDMyICopIGdvb21JbmZvLT5vdXRwdXRCdWY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgIENMT1NFICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZ29vbV9jbG9zZSAoUGx1Z2luSW5mbyAqIGdvb21JbmZvKQoreworICBpZiAoZ29vbUluZm8tPnBpeGVsICE9IE5VTEwpCisgICAgZnJlZSAoZ29vbUluZm8tPnBpeGVsKTsKKyAgaWYgKGdvb21JbmZvLT5iYWNrICE9IE5VTEwpCisgICAgZnJlZSAoZ29vbUluZm8tPmJhY2spOworICBpZiAoZ29vbUluZm8tPmNvbnYgIT0gTlVMTCkKKyAgICBmcmVlIChnb29tSW5mby0+Y29udik7CisKKyAgZ29vbUluZm8tPnBpeGVsID0gZ29vbUluZm8tPmJhY2sgPSBOVUxMOworICBnb29tSW5mby0+Y29udiA9IE5VTEw7CisgIGdvb21fcmFuZG9tX2ZyZWUgKGdvb21JbmZvLT5nUmFuZG9tKTsKKyAgZ29vbV9saW5lc19mcmVlICgmZ29vbUluZm8tPmdtbGluZTEpOworICBnb29tX2xpbmVzX2ZyZWUgKCZnb29tSW5mby0+Z21saW5lMik7CisKKyAgLyogcmVsZWFzZV9pZnMgKCk7ICovCisgIGdvb21JbmZvLT5pZnNfZnguZnJlZSAoJmdvb21JbmZvLT5pZnNfZngpOworICBnb29tSW5mby0+Y29udm9sdmVfZnguZnJlZSAoJmdvb21JbmZvLT5jb252b2x2ZV9meCk7CisgIGdvb21JbmZvLT5zdGFyX2Z4LmZyZWUgKCZnb29tSW5mby0+c3Rhcl9meCk7CisgIGdvb21JbmZvLT50ZW50YWNsZXNfZnguZnJlZSAoJmdvb21JbmZvLT50ZW50YWNsZXNfZngpOworICBnb29tSW5mby0+em9vbUZpbHRlcl9meC5mcmVlICgmZ29vbUluZm8tPnpvb21GaWx0ZXJfZngpOworCisgIHBsdWdpbl9pbmZvX2ZyZWUgKGdvb21JbmZvKTsKKyAgZnJlZSAoZ29vbUluZm8pOworfQorCisKKy8qICoqKiAqLwordm9pZAorY2hvb3NlX2FfZ29vbV9saW5lIChQbHVnaW5JbmZvICogZ29vbUluZm8sIGZsb2F0ICpwYXJhbTEsIGZsb2F0ICpwYXJhbTIsCisgICAgaW50ICpjb3VsZXVyLCBpbnQgKm1vZGUsIGZsb2F0ICphbXBsaXR1ZGUsIGludCBmYXIpCit7CisgICptb2RlID0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDMpOworICAqYW1wbGl0dWRlID0gMS4wZjsKKyAgc3dpdGNoICgqbW9kZSkgeworICAgIGNhc2UgR01MX0NJUkNMRToKKyAgICAgIGlmIChmYXIpIHsKKyAgICAgICAgKnBhcmFtMSA9ICpwYXJhbTIgPSAwLjQ3ZjsKKyAgICAgICAgKmFtcGxpdHVkZSA9IDAuOGY7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAzKSA9PSAwKSB7CisgICAgICAgICpwYXJhbTEgPSAqcGFyYW0yID0gMDsKKyAgICAgICAgKmFtcGxpdHVkZSA9IDMuMGY7CisgICAgICB9IGVsc2UgaWYgKGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAyKSkgeworICAgICAgICAqcGFyYW0xID0gMC40MGYgKiBnb29tSW5mby0+c2NyZWVuLmhlaWdodDsKKyAgICAgICAgKnBhcmFtMiA9IDAuMjJmICogZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAqcGFyYW0xID0gKnBhcmFtMiA9IGdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0ICogMC4zNTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR01MX0hMSU5FOgorICAgICAgaWYgKGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCA0KSB8fCBmYXIpIHsKKyAgICAgICAgKnBhcmFtMSA9IGdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0IC8gNzsKKyAgICAgICAgKnBhcmFtMiA9IDYuMGYgKiBnb29tSW5mby0+c2NyZWVuLmhlaWdodCAvIDcuMGY7CisgICAgICB9IGVsc2UgeworICAgICAgICAqcGFyYW0xID0gKnBhcmFtMiA9IGdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0IC8gMi4wZjsKKyAgICAgICAgKmFtcGxpdHVkZSA9IDIuMGY7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdNTF9WTElORToKKyAgICAgIGlmIChnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMykgfHwgZmFyKSB7CisgICAgICAgICpwYXJhbTEgPSBnb29tSW5mby0+c2NyZWVuLndpZHRoIC8gNy4wZjsKKyAgICAgICAgKnBhcmFtMiA9IDYuMGYgKiBnb29tSW5mby0+c2NyZWVuLndpZHRoIC8gNy4wZjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpwYXJhbTEgPSAqcGFyYW0yID0gZ29vbUluZm8tPnNjcmVlbi53aWR0aCAvIDIuMGY7CisgICAgICAgICphbXBsaXR1ZGUgPSAxLjVmOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICpwYXJhbTEgPSAqcGFyYW0yID0gMDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgKmNvdWxldXIgPSBnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgNik7Cit9CmRpZmYgLS1naXQgYS9nc3QvZ29vbS9nb29tX2ZpbHRlcnMuaCBiL2dzdC9nb29tL2dvb21fZmlsdGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMDk2ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9nb29tX2ZpbHRlcnMuaApAQCAtMCwwICsxLDcwIEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZuZGVmIEZJTFRFUlNfSAorI2RlZmluZSBGSUxURVJTX0gKKworI2luY2x1ZGUgImdvb21fY29uZmlnLmgiCisjaW5jbHVkZSAiZ29vbV90eXBlZGVmcy5oIgorI2luY2x1ZGUgImdvb21fdmlzdWFsX2Z4LmgiCisjaW5jbHVkZSAiZ29vbV9ncmFwaGljLmgiCisKK3ZvaWQgem9vbUZpbHRlclZpc3VhbEZYV3JhcHBlcl9jcmVhdGUoVmlzdWFsRlggKmZ4KTsKKworc3RydWN0IF9aT09NX0ZJTFRFUl9EQVRBCit7CisJaW50ICAgICB2aXRlc3NlOyAgICAgICAgICAgLyogMTI4ID0gdml0ZXNzZSBudWxlLi4uICogKiAyNTYgPSBlbiBhcnJpZXJlIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGh5cGVyIHZpdGUuLiAqICogMCA9IGVuIGF2YW50IGh5cGUgdml0ZS4gKi8KKwl1bnNpZ25lZCBjaGFyIHBlcnRlZGVjOworCXVuc2lnbmVkIGNoYXIgc3FydHBlcnRlOworCWludCAgICAgbWlkZGxlWCwgbWlkZGxlWTsgIC8qIG1pbGlldSBkZSBsJ2VmZmV0ICovCisJY2hhciAgICByZXZlcnNlOyAgICAgICAgICAgLyogaW52ZXJzZSBsYSB2aXRlc3NlICovCisJY2hhciAgICBtb2RlOyAgICAgICAgICAgICAgLyogdHlwZSBkJ2VmZmV0IO+/vSBhcHBsaXF1ZXIgKGNmIGxlcyAjZGVmaW5lKSAqLworCS8qKiBAc2luY2UgSnVuZSAyMDAxICovCisJaW50ICAgICBoUGxhbmVFZmZlY3Q7ICAgICAgLyogZGV2aWF0aW9uIGhvcml0b250YWxlICovCisJaW50ICAgICB2UGxhbmVFZmZlY3Q7ICAgICAgLyogZGV2aWF0aW9uIHZlcnRpY2FsZSAqLworCS8qKiBAc2luY2UgQXByaWwgMjAwMiAqLworCWludCAgICAgd2F2ZUVmZmVjdDsgICAgICAgIC8qIGFwcGxpcXVlIHVuZSAic3VyY291Y2hlIiBkZSB3YXZlIGVmZmVjdCAqLworCWludCAgICAgaHlwZXJjb3NFZmZlY3Q7ICAgIC8qIGFwcGxpcXVlIHVuZSAic3VyY291Y2hlIGRlIGh5cGVyY29zIGVmZmVjdCAqLworCisJY2hhciAgICBub2lzaWZ5OyAgICAgICAgICAgLyogYWpvdXRlIHVuIGJydWl0IGEgbGEgdHJhbnNmb3JtYXRpb24gKi8KK307CisKKyNkZWZpbmUgTk9STUFMX01PREUgMAorI2RlZmluZSBXQVZFX01PREUgMQorI2RlZmluZSBDUllTVEFMX0JBTExfTU9ERSAyCisjZGVmaW5lIFNDUlVOQ0hfTU9ERSAzCisjZGVmaW5lIEFNVUxFVFRFX01PREUgNAorI2RlZmluZSBXQVRFUl9NT0RFIDUKKyNkZWZpbmUgSFlQRVJDT1MxX01PREUgNgorI2RlZmluZSBIWVBFUkNPUzJfTU9ERSA3CisjZGVmaW5lIFlPTkxZX01PREUgOAorI2RlZmluZSBTUEVFRFdBWV9NT0RFIDkKKwordm9pZCBwb2ludEZpbHRlciAoUGx1Z2luSW5mbyAqZ29vbUluZm8sIFBpeGVsICogcGl4MSwgQ29sb3IgYywKKyAgICAgICAgICAgICAgICAgIGZsb2F0IHQxLCBmbG9hdCB0MiwgZmxvYXQgdDMsIGZsb2F0IHQ0LCBndWludDMyIGN5Y2xlKTsKKworLyogZmlsdHJlIGRlIHpvb20gOgorICogbGUgY29udGVudSBkZSBwaXgxIGVzdCBjb3BpZSBkYW5zIHBpeDIuCisgKiB6ZiA6IHNpIG5vbiBOVUxMLCBjb25maWd1cmUgbCdlZmZldC4KKyAqIHJlc3gscmVzeSA6IHRhaWxsZSBkZXMgYnVmZmVycy4KKyAqLwordm9pZCB6b29tRmlsdGVyRmFzdFJHQiAoUGx1Z2luSW5mbyAqZ29vbUluZm8sIFBpeGVsICogcGl4MSwgUGl4ZWwgKiBwaXgyLCBab29tRmlsdGVyRGF0YSAqIHpmLCBndWludDMyIHJlc3gsCisgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIHJlc3ksIGludCBzd2l0Y2hJbmNyLCBmbG9hdCBzd2l0Y2hNdWx0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9nb29tX2Z4LmggYi9nc3QvZ29vbS9nb29tX2Z4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4MmQ2YwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2dvb21fZnguaApAQCAtMCwwICsxLDMwIEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZuZGVmIF9HT09NX0ZYX0gKKyNkZWZpbmUgX0dPT01fRlhfSAorCisjaW5jbHVkZSAiZ29vbV92aXN1YWxfZnguaCIKKyNpbmNsdWRlICJnb29tX3BsdWdpbl9pbmZvLmgiCisKK3ZvaWQgY29udm9sdmVfY3JlYXRlIChWaXN1YWxGWCAqdmZ4KTsKK3ZvaWQgZmx5aW5nX3N0YXJfY3JlYXRlIChWaXN1YWxGWCAqdmZ4KTsKKwordm9pZCB6b29tX2ZpbHRlcl9jKGludCBzaXplWCwgaW50IHNpemVZLCBQaXhlbCAqc3JjLCBQaXhlbCAqZGVzdCwgaW50ICpicnV0UywgaW50ICpicnV0RCwgaW50IGJ1ZmZyYXRpbywgaW50IHByZWNhbENvZWZbMTZdWzE2XSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vZ29vbV9ncmFwaGljLmggYi9nc3QvZ29vbS9nb29tX2dyYXBoaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGRkZTM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vZ29vbV9ncmFwaGljLmgKQEAgLTAsMCArMSw5MiBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBHUkFQSElDX0gKKyNkZWZpbmUgR1JBUEhJQ19ICisKK3R5cGVkZWYgdW5zaWduZWQgaW50IFVpbnQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIHNob3J0IHIsIHYsIGI7Cit9CitDb2xvcjsKKworZXh0ZXJuIGNvbnN0IENvbG9yIEJMQUNLOworZXh0ZXJuIGNvbnN0IENvbG9yIFdISVRFOworZXh0ZXJuIGNvbnN0IENvbG9yIFJFRDsKK2V4dGVybiBjb25zdCBDb2xvciBCTFVFOworZXh0ZXJuIGNvbnN0IENvbG9yIEdSRUVOOworZXh0ZXJuIGNvbnN0IENvbG9yIFlFTExPVzsKK2V4dGVybiBjb25zdCBDb2xvciBPUkFOR0U7CitleHRlcm4gY29uc3QgQ29sb3IgVklPTEVUOworCisKKyNpZmRlZiBDT0xPUl9CR1JBCisKKyNkZWZpbmUgQl9DSEFOTkVMIDB4RkYwMDAwMDAKKyNkZWZpbmUgR19DSEFOTkVMIDB4MDBGRjAwMDAKKyNkZWZpbmUgUl9DSEFOTkVMIDB4MDAwMEZGMDAKKyNkZWZpbmUgQV9DSEFOTkVMIDB4MDAwMDAwRkYKKyNkZWZpbmUgQl9PRkZTRVQgIDI0CisjZGVmaW5lIEdfT0ZGU0VUICAxNgorI2RlZmluZSBSX09GRlNFVCAgOAorI2RlZmluZSBBX09GRlNFVCAgMAorCit0eXBlZGVmIHVuaW9uIF9QSVhFTCB7CisgIHN0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciBiOworICAgIHVuc2lnbmVkIGNoYXIgZzsKKyAgICB1bnNpZ25lZCBjaGFyIHI7CisgICAgdW5zaWduZWQgY2hhciBhOworICB9IGNoYW5uZWxzOworICB1bnNpZ25lZCBpbnQgdmFsOworICB1bnNpZ25lZCBjaGFyIGNvcFs0XTsKK30gUGl4ZWw7CisKKyNlbHNlCisKKyNkZWZpbmUgQV9DSEFOTkVMIDB4RkYwMDAwMDAKKyNkZWZpbmUgUl9DSEFOTkVMIDB4MDBGRjAwMDAKKyNkZWZpbmUgR19DSEFOTkVMIDB4MDAwMEZGMDAKKyNkZWZpbmUgQl9DSEFOTkVMIDB4MDAwMDAwRkYKKyNkZWZpbmUgQV9PRkZTRVQgIDI0CisjZGVmaW5lIFJfT0ZGU0VUICAxNgorI2RlZmluZSBHX09GRlNFVCAgOAorI2RlZmluZSBCX09GRlNFVCAgMAorCit0eXBlZGVmIHVuaW9uIF9QSVhFTCB7CisgIHN0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciBhOworICAgIHVuc2lnbmVkIGNoYXIgcjsKKyAgICB1bnNpZ25lZCBjaGFyIGc7CisgICAgdW5zaWduZWQgY2hhciBiOworICB9IGNoYW5uZWxzOworICB1bnNpZ25lZCBpbnQgdmFsOworICB1bnNpZ25lZCBjaGFyIGNvcFs0XTsKK30gUGl4ZWw7CisKKyNlbmRpZiAvKiBDT0xPUl9CR1JBICovCisKKy8qCitpbmxpbmUgdm9pZCBzZXRQaXhlbFJHQiAoUGl4ZWwgKiBidWZmZXIsIFVpbnQgeCwgVWludCB5LCBDb2xvciBjKTsKK2lubGluZSB2b2lkIGdldFBpeGVsUkdCIChQaXhlbCAqIGJ1ZmZlciwgVWludCB4LCBVaW50IHksIENvbG9yICogYyk7CisqLworCisKKyNlbmRpZiAvKiBHUkFQSElDX0ggKi8KZGlmZiAtLWdpdCBhL2dzdC9nb29tL2dvb21fcGx1Z2luX2luZm8uaCBiL2dzdC9nb29tL2dvb21fcGx1Z2luX2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTBlOTZlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vZ29vbV9wbHVnaW5faW5mby5oCkBAIC0wLDAgKzEsMTgxIEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZuZGVmIF9QTFVHSU5fSU5GT19ICisjZGVmaW5lIF9QTFVHSU5fSU5GT19ICisKKyNpbmNsdWRlICJnb29tX3R5cGVkZWZzLmgiCisKKyNpbmNsdWRlICJnb29tX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiZ29vbV9ncmFwaGljLmgiCisjaW5jbHVkZSAiZ29vbV9jb25maWdfcGFyYW0uaCIKKyNpbmNsdWRlICJnb29tX3Zpc3VhbF9meC5oIgorI2luY2x1ZGUgImdvb21fZmlsdGVycy5oIgorI2luY2x1ZGUgImdvb21fdG9vbHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIgZHJhd0lGUzsKKwljaGFyIGRyYXdQb2ludHM7CisJY2hhciBkcmF3VGVudGFjbGU7CisKKwljaGFyIGRyYXdTY29wZTsKKwlpbnQgZmFyU2NvcGU7CisKKwlpbnQgcmFuZ2VtaW47CisJaW50IHJhbmdlbWF4OworfSBHb29tU3RhdGU7CisKKyNkZWZpbmUgU1RBVEVTX01BWF9OQiAxMjgKKworLyoqCisgKiBHaXZlcyBpbmZvcm1hdGlvbnMgYWJvdXQgdGhlIHNvdW5kLgorICovCitzdHJ1Y3QgX1NPVU5EX0lORk8geworCisJLyogbm90YSA6IGEgR29vbSBpcyBqdXN0IGEgc291bmQgZXZlbnQuLi4gKi8KKworCWludCB0aW1lU2luY2VMYXN0R29vbTsgICAvKiA+PSAwICovCisJZmxvYXQgZ29vbVBvd2VyOyAgICAgICAgIC8qIHBvd2VyIG9mIHRoZSBsYXN0IEdvb20gWzAuLjFdICovCisKKwlpbnQgdGltZVNpbmNlTGFzdEJpZ0dvb207ICAgLyogPj0gMCAqLworCisJZmxvYXQgdm9sdW1lOyAgICAgLyogWzAuLjFdICovCisJc2hvcnQgc2FtcGxlc1syXVs1MTJdOworCisJLyogb3RoZXIgImludGVybmFsIiBkYXRhcyBmb3IgdGhlIHNvdW5kX3Rlc3RlciAqLworCWZsb2F0IGdvb21fbGltaXQ7IC8qIGF1dG8tdXBkYXRlZCBsaW1pdCBvZiBnb29tX2RldGVjdGlvbiAqLworCWZsb2F0IGJpZ0dvb21MaW1pdDsKKwlmbG9hdCBhY2NlbHZhcjsgICAvKiBhY2NlbGVyYXRpb24gb2YgdGhlIHNvdW5kIC0gWzAuLjFdICovCisJZmxvYXQgc3BlZWR2YXI7ICAgLyogc3BlZWQgb2YgdGhlIHNvdW5kIC0gWzAuLjEwMF0gKi8KKwlpbnQgYWxsVGltZXNNYXg7CisJaW50IHRvdGFsZ29vbTsgICAgLyogbnVtYmVyIG9mIGdvb20gc2luY2UgbGFzdCByZXNldAorCQkJICAgKiAoYSByZXNldCBldmVyeSA2NCBjeWNsZXMpICovCisKKwlmbG9hdCBwcm92X21heDsgICAvKiBhY2NlbCBtYXggc2luY2UgbGFzdCByZXNldCAqLworCisJaW50IGN5Y2xlOworCisJLyogcHJpdmF0ZSAqLworCVBsdWdpblBhcmFtIHZvbHVtZV9wOworCVBsdWdpblBhcmFtIHNwZWVkX3A7CisJUGx1Z2luUGFyYW0gYWNjZWxfcDsKKwlQbHVnaW5QYXJhbSBnb29tX2xpbWl0X3A7CisgICAgICAgIFBsdWdpblBhcmFtIGdvb21fcG93ZXJfcDsKKwlQbHVnaW5QYXJhbSBsYXN0X2dvb21fcDsKKwlQbHVnaW5QYXJhbSBsYXN0X2JpZ2dvb21fcDsKKwlQbHVnaW5QYXJhbSBiaWdnb29tX3NwZWVkX2xpbWl0X3A7CisJUGx1Z2luUGFyYW0gYmlnZ29vbV9mYWN0b3JfcDsKKworCVBsdWdpblBhcmFtZXRlcnMgcGFyYW1zOyAvKiBjb250YWlucyB0aGUgcHJldmlvdXNseSBkZWZpbmVkIHBhcmFtZXRlcnMuICovCit9OworCisKKy8qKgorICogQWxsb3dzIEZYcyB0byBrbm93IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwbHVnaW4uCisgKi8KK3N0cnVjdCBfUExVR0lOX0lORk8geworCisJLyogcHVibGljIGRhdGFzICovCisKKwlpbnQgbmJQYXJhbXM7CisJUGx1Z2luUGFyYW1ldGVycyAqcGFyYW1zOworCisJLyogcHJpdmF0ZSBkYXRhcyAqLworCisJc3RydWN0IF9TSVpFX1RZUEUgeworCQlpbnQgd2lkdGg7CisJCWludCBoZWlnaHQ7CisJCWludCBzaXplOyAgIC8qID09IHNjcmVlbi5oZWlnaHQgKiBzY3JlZW4ud2lkdGguICovCisJfSBzY3JlZW47CisKKwlTb3VuZEluZm8gc291bmQ7CisKKwlpbnQgbmJWaXN1YWxzOworCVZpc3VhbEZYICoqdmlzdWFsczsgLyogcG9pbnRlcnMgb24gYWxsIHRoZSB2aXN1YWwgZnggKi8KKworCS8qKiBUaGUga25vd24gRlggKi8KKwlWaXN1YWxGWCBjb252b2x2ZV9meDsKKwlWaXN1YWxGWCBzdGFyX2Z4OworCVZpc3VhbEZYIHpvb21GaWx0ZXJfZng7CisJVmlzdWFsRlggdGVudGFjbGVzX2Z4OworCVZpc3VhbEZYIGlmc19meDsKKworCS8qKiBpbWFnZSBidWZmZXJzICovCisJZ3VpbnQzMiAqcGl4ZWw7CisJZ3VpbnQzMiAqYmFjazsKKwlQaXhlbCAqcDEsICpwMjsKKwlQaXhlbCAqY29udjsKKyAgUGl4ZWwgKm91dHB1dEJ1ZjsKKworCS8qKiBzdGF0ZSBvZiBnb29tICovCisJZ3VpbnQzMiBjeWNsZTsKKwlHb29tU3RhdGUgc3RhdGVzW1NUQVRFU19NQVhfTkJdOworCWludCBzdGF0ZXNOdW1iZXI7CisJaW50IHN0YXRlc1JhbmdlTWF4OworCisJR29vbVN0YXRlICpjdXJHU3RhdGU7CisKKwkvKiogZWZmZXQgZGUgbGlnbmUuLiAqLworCUdNTGluZSAqZ21saW5lMTsKKwlHTUxpbmUgKmdtbGluZTI7CisKKwkvKiogc2ludXMgdGFibGUgKi8KKwlpbnQgc2ludGFibGVbMHgxMDAwMF07CisKKwkvKiBJTlRFUk5BTFMgKi8KKwkKKwkvKiogZ29vbV91cGRhdGUgaW50ZXJuYWxzLgorCSAqIEkgdG9vayBhbGwgc3RhdGljIHZhcmlhYmxlcyBmcm9tIGdvb21fdXBkYXRlIGFuZCBwdXQgdGhlbSBoZXJlLi4gZm9yIHRoZSBtb21lbnQuCisJICovCisJc3RydWN0IHsKKwkJaW50IGxvY2t2YXI7ICAgICAgICAgICAgICAgLyogcG91ciBlbXBlY2hlciBkZSBub3V2ZWF1eCBjaGFuZ2VtZW50cyAqLworCQlpbnQgZ29vbXZhcjsgICAgICAgICAgICAgICAvKiBib3VjbGUgZGVzIGdvb21zICovCisJCWludCBsb29wdmFyOyAgICAgICAgICAgICAgIC8qIG1vdXZlbWVudCBkZXMgcG9pbnRzICovCisJCWludCBzdG9wX2xpbmVzOworCQlpbnQgaWZzX2luY3I7ICAgICAgICAgICAgICAvKiBkZXNzaW5lciBsJ2lmcyAoMCA9IG5vbjogPiA9IGluY3JlbWVudCkgKi8KKwkJaW50IGRlY2F5X2lmczsgICAgICAgICAgICAgLyogZGlzcGFyaXRpb24gZGUgbCdpZnMgKi8KKwkJaW50IHJlY2F5X2lmczsgICAgICAgICAgICAgLyogZGVkaXNwYXJpdGlvbiBkZSBsJ2lmcyAqLworCQlpbnQgY3ljbGVzU2luY2VMYXN0Q2hhbmdlOyAvKiBub21icmUgZGUgQ3ljbGUgRGVwdWlzIERlcm5pZXIgQ2hhbmdlbWVudCAqLworCQlpbnQgZHJhd0xpbmVzRHVyYXRpb247ICAgICAvKiBkdXJlZSBkZSBsYSB0cmFuc2l0aW9uIGVudHJlIGFmZmljaGVyIGxlcyBsaWduZXMgb3UgcGFzICovCisJCWludCBsaW5lTW9kZTsgICAgICAgICAgICAgIC8qIGwnZWZmZXQgbGluZWFpcmUgYSBkZXNzaW5lciAqLworCQlmbG9hdCBzd2l0Y2hNdWx0QW1vdW50OyAgICAvKiBTV0lUQ0hNVUxUICgyOS4wZi8zMC4wZikgKi8KKwkJaW50IHN3aXRjaEluY3JBbW91bnQ7ICAgICAgLyogMHg3ZiAqLworCQlmbG9hdCBzd2l0Y2hNdWx0OyAgICAgICAgICAvKiAxLjBmICovCisJCWludCBzd2l0Y2hJbmNyOyAgICAgICAgICAgIC8qICA9IFNXSVRDSElOQ1I7ICovCisJCWludCBzdGF0ZVNlbGVjdGlvblJuZDsKKwkJaW50IHN0YXRlU2VsZWN0aW9uQmxvY2tlcjsKKwkJaW50IHByZXZpb3VzWm9vbVNwZWVkOworCQlab29tRmlsdGVyRGF0YSB6b29tRmlsdGVyRGF0YTsgICAgICAgICAgICAgICAgCisJfSB1cGRhdGU7CisKKwlzdHJ1Y3QgeworCQl2b2lkICgqZHJhd19saW5lKSAoUGl4ZWwgKmRhdGEsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IGNvbCwgaW50IHNjcmVlbngsIGludCBzY3JlZW55KTsKKwkJdm9pZCAoKnpvb21fZmlsdGVyKSAoaW50IHNpemVYLCBpbnQgc2l6ZVksIFBpeGVsICpzcmMsIFBpeGVsICpkZXN0LCBpbnQgKmJydXRTLCBpbnQgKmJydXRELCBpbnQgYnVmZnJhdGlvLCBpbnQgcHJlY2FsQ29lZlsxNl1bMTZdKTsKKwl9IG1ldGhvZHM7CisJCisJR29vbVJhbmRvbSAqZ1JhbmRvbTsKK307CisKK3ZvaWQgcGx1Z2luX2luZm9faW5pdChQbHVnaW5JbmZvICpwLCBpbnQgbmJWaXN1YWwpOyAKK3ZvaWQgcGx1Z2luX2luZm9fZnJlZShQbHVnaW5JbmZvICpwKTsKKworLyogaSA9IFswLi5wLT5uYlZpc3VhbC0xXSAqLwordm9pZCBwbHVnaW5faW5mb19hZGRfdmlzdWFsKFBsdWdpbkluZm8gKnAsIGludCBpLCBWaXN1YWxGWCAqdmlzdWFsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9nb29tX3Rvb2xzLmMgYi9nc3QvZ29vbS9nb29tX3Rvb2xzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3NThmZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2dvb21fdG9vbHMuYwpAQCAtMCwwICsxLDUwIEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaW5jbHVkZSAiZ29vbV90b29scy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitHb29tUmFuZG9tICoKK2dvb21fcmFuZG9tX2luaXQgKGludCBpKQoreworICBHb29tUmFuZG9tICpncmFuZG9tID0gKEdvb21SYW5kb20gKikgbWFsbG9jIChzaXplb2YgKEdvb21SYW5kb20pKTsKKworICBzcmFuZCAoaSk7CisgIGdyYW5kb20tPnBvcyA9IDE7CisgIGdvb21fcmFuZG9tX3VwZGF0ZV9hcnJheSAoZ3JhbmRvbSwgR09PTV9OQl9SQU5EKTsKKyAgcmV0dXJuIGdyYW5kb207Cit9CisKK3ZvaWQKK2dvb21fcmFuZG9tX2ZyZWUgKEdvb21SYW5kb20gKiBncmFuZG9tKQoreworICBmcmVlIChncmFuZG9tKTsKK30KKwordm9pZAorZ29vbV9yYW5kb21fdXBkYXRlX2FycmF5IChHb29tUmFuZG9tICogZ3JhbmRvbSwgaW50IG51bWJlck9mVmFsdWVzVG9DaGFuZ2UpCit7CisgIHdoaWxlIChudW1iZXJPZlZhbHVlc1RvQ2hhbmdlID4gMCkgeworI2lmIFJBTkRfTUFYIDwgMHgxMDAwMAorICAgIGdyYW5kb20tPmFycmF5W2dyYW5kb20tPnBvcysrXSA9ICgocmFuZCAoKSA8PCAxNikgKyByYW5kICgpKSAvIDEyNzsKKyNlbHNlCisgICAgZ3JhbmRvbS0+YXJyYXlbZ3JhbmRvbS0+cG9zKytdID0gcmFuZCAoKSAvIDEyNzsKKyNlbmRpZgorICAgIG51bWJlck9mVmFsdWVzVG9DaGFuZ2UtLTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vZ29vbV90b29scy5oIGIvZ3N0L2dvb20vZ29vbV90b29scy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjUyNDAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9nb29tX3Rvb2xzLmgKQEAgLTAsMCArMSw1MyBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBfR09PTVRPT0xTX0gKKyNkZWZpbmUgX0dPT01UT09MU19ICisKKyNpbmNsdWRlICJnb29tX2NvbmZpZy5oIgorCisvKioKKyAqIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHdyYXBwZXIgZm9yIGZhc3RlciByYW5kb20gbnVtYmVyLgorICovCisKKyNkZWZpbmUgR09PTV9OQl9SQU5EIDB4MTAwMDAKKwordHlwZWRlZiBzdHJ1Y3QgX0dPT01fUkFORE9NIHsKKwlpbnQgYXJyYXlbR09PTV9OQl9SQU5EXTsKKwl1bnNpZ25lZCBzaG9ydCBwb3M7Cit9IEdvb21SYW5kb207CisKK0dvb21SYW5kb20gKmdvb21fcmFuZG9tX2luaXQoaW50IGkpOwordm9pZCBnb29tX3JhbmRvbV9mcmVlKEdvb21SYW5kb20gKmdyYW5kb20pOworCitpbmxpbmUgc3RhdGljIGludCBnb29tX3JhbmRvbShHb29tUmFuZG9tICpncmFuZG9tKSB7CisJCisJZ3JhbmRvbS0+cG9zKys7IC8qIHdvcmtzIGJlY2F1c2UgcG9zIGlzIGFuIHVuc2lnbmVkIHNob3J0ICovCisJcmV0dXJuIGdyYW5kb20tPmFycmF5W2dyYW5kb20tPnBvc107Cit9CisKK2lubGluZSBzdGF0aWMgaW50IGdvb21faXJhbmQoR29vbVJhbmRvbSAqZ3JhbmRvbSwgaW50IGkpIHsKKworCWdyYW5kb20tPnBvcysrOworCXJldHVybiBncmFuZG9tLT5hcnJheVtncmFuZG9tLT5wb3NdICUgaTsKK30KKworLyogY2FsbGVkIHRvIGNoYW5nZSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB2YWx1ZSBpbiB0aGUgYXJyYXksIHNvIHRoYXQgdGhlIGFycmF5IGRvZXMgbm90IHJlbWFpbiB0aGUgc2FtZSovCit2b2lkIGdvb21fcmFuZG9tX3VwZGF0ZV9hcnJheShHb29tUmFuZG9tICpncmFuZG9tLCBpbnQgbnVtYmVyT2ZWYWx1ZXNUb0NoYW5nZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vZ29vbV90eXBlZGVmcy5oIGIvZ3N0L2dvb20vZ29vbV90eXBlZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYTMzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9nb29tX3R5cGVkZWZzLmgKQEAgLTAsMCArMSwyOSBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBfR09PTV9UWVBFREVGU19ICisjZGVmaW5lIF9HT09NX1RZUEVERUZTX0gKKwordHlwZWRlZiBzdHJ1Y3QgX1BMVUdJTl9JTkZPIFBsdWdpbkluZm87Cit0eXBlZGVmIHN0cnVjdCBfU09VTkRfSU5GTyBTb3VuZEluZm87Cit0eXBlZGVmIHN0cnVjdCBfR01MSU5FIEdNTGluZTsKK3R5cGVkZWYgc3RydWN0IF9HTVVOSVRQT0lOVEVSIEdNVW5pdFBvaW50ZXI7Cit0eXBlZGVmIHN0cnVjdCBfWk9PTV9GSUxURVJfREFUQSBab29tRmlsdGVyRGF0YTsKK3R5cGVkZWYgc3RydWN0IF9WSVNVQUxfRlggVmlzdWFsRlg7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vZ29vbV92aXN1YWxfZnguaCBiL2dzdC9nb29tL2dvb21fdmlzdWFsX2Z4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiNWE0OQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2dvb21fdmlzdWFsX2Z4LmgKQEAgLTAsMCArMSwzNSBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBKZWFuLUNocmlzdG9waGUgSG9lbHQgPGpla29AZnJlZS5mcj4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBfVklTVUFMX0ZYX0gKKyNkZWZpbmUgX1ZJU1VBTF9GWF9ICisKKyNpbmNsdWRlICJnb29tX2NvbmZpZ19wYXJhbS5oIgorI2luY2x1ZGUgImdvb21fZ3JhcGhpYy5oIgorI2luY2x1ZGUgImdvb21fdHlwZWRlZnMuaCIKKworc3RydWN0IF9WSVNVQUxfRlggeworICB2b2lkICgqaW5pdCkgKHN0cnVjdCBfVklTVUFMX0ZYICpfdGhpcywgUGx1Z2luSW5mbyAqaW5mbyk7CisgIHZvaWQgKCpmcmVlKSAoc3RydWN0IF9WSVNVQUxfRlggKl90aGlzKTsKKyAgdm9pZCAoKmFwcGx5KSAoc3RydWN0IF9WSVNVQUxfRlggKl90aGlzLCBQaXhlbCAqc3JjLCBQaXhlbCAqZGVzdCwgUGx1Z2luSW5mbyAqaW5mbyk7CisgIHZvaWQgKmZ4X2RhdGE7CisKKyAgUGx1Z2luUGFyYW1ldGVycyAqcGFyYW1zOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9nb29tc2xfbGV4LmwgYi9nc3QvZ29vbS9nb29tc2xfbGV4LmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E3ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2dvb21zbF9sZXgubApAQCAtMCwwICsxLDk0IEBACisleworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdvb21zbC5oIgorI2luY2x1ZGUgImdvb21zbF9wcml2YXRlLmgiCisjaW5jbHVkZSAiZ29vbXNsX3lhY2MuaCIKK3ZvaWQgeXllcnJvcihjaGFyICopOwordm9pZCB5eXBhcnNlKHZvaWQpOworCitHb29tU0wgKmN1cnJlbnRHb29tU0w7CitzdGF0aWMgaW50ICBzdHJpbmdfc2l6ZTsKK3N0YXRpYyBjaGFyIHN0cmluZ1sxMDI0XTsKKyV9CisKK0RJR0lUICAgIFswLTldCitYRElHSVQgICBbMC05YS1mXQorSUQgICAgICAgW2EtekEtWl9AJl1bYS16QS1aMC05X1wuXSoKKworJVMgQ19DT01NRU5UCislUyBMSU5FX0NPTU1FTlQKKyVTIFNUUklORworCislJQorCis8TElORV9DT01NRU5ULENfQ09NTUVOVCxJTklUSUFMPl5bIFx0XSpcbiAgICAgICAgICAgeyArK2N1cnJlbnRHb29tU0wtPm51bV9saW5lczsgLyogSWdub3JlIGVtcHR5IGxpbmVzICovIH0KKzxMSU5FX0NPTU1FTlQsQ19DT01NRU5ULElOSVRJQUw+XlsgXHRdKiIvLyJbXlxuXSpcbiB7ICsrY3VycmVudEdvb21TTC0+bnVtX2xpbmVzOyAvKiBJZ25vcmUgZW1wdHkgbGluZXMgKi8gfQorCis8TElORV9DT01NRU5UPlxuICAgIHsgKytjdXJyZW50R29vbVNMLT5udW1fbGluZXM7IHl5bHZhbC5jaGFyVmFsdWU9Knl5dGV4dDsgQkVHSU4gSU5JVElBTDsgcmV0dXJuICdcbic7IH0KKzxJTklUSUFMPlxuICAgICAgICAgeyArK2N1cnJlbnRHb29tU0wtPm51bV9saW5lczsgeXlsdmFsLmNoYXJWYWx1ZT0qeXl0ZXh0OyByZXR1cm4gJ1xuJzsgfQorCis8Q19DT01NRU5UPiIqLyIgICAgICAgICAgICAgICAgeyBCRUdJTiBJTklUSUFMOyB9Cis8Q19DT01NRU5UPlxuICAgICAgICAgICAgICAgICAgeyArK2N1cnJlbnRHb29tU0wtPm51bV9saW5lczsgfQorPENfQ09NTUVOVCxMSU5FX0NPTU1FTlQ+LiAgICAgIHsgLyogZWF0IHVwIGNvbW1lbnQgKi8gfQorCis8SU5JVElBTD4iI1JTVF9MSU5FIyIgICAgICAgICAgICAgeyBjdXJyZW50R29vbVNMLT5udW1fbGluZXMgPSAwOyB9Cis8SU5JVElBTD4iI0ZJTEUgIi4qIiMiICAgICAgICAgICAgeyBjdXJyZW50R29vbVNMLT5udW1fbGluZXMgPSAwOyAvKiBwcmludGYoIiVzXG4iLCB5eXRleHQpOyAqLyB9Cis8SU5JVElBTD4iIyJbXlxuXSogICAgICAgICAgICAgICAgeyAvKiBpZ25vcmUgcHJlcHJvY2Vzc29yIGxpbmVzICovIH0KKworPElOSVRJQUw+Ii8qIiAgICAgICAgICAgICAgICB7IEJFR0lOIENfQ09NTUVOVDsgfQorPElOSVRJQUw+Ii8vIiAgICAgICAgICAgICAgICB7IEJFR0lOIExJTkVfQ09NTUVOVDsgfQorPElOSVRJQUw+XCIgICAgICAgICAgICAgICAgICB7IEJFR0lOIFNUUklORzsgc3RyaW5nX3NpemU9MDsgfQorCis8U1RSSU5HPiJcXG4iICAgICAgICAgICAgICAgIHsgc3RyaW5nW3N0cmluZ19zaXplKytdID0gJ1xuJzsgfQorPFNUUklORz4iXFxcIiIgICAgICAgICAgICAgICB7IHN0cmluZ1tzdHJpbmdfc2l6ZSsrXSA9ICdcIic7IH0KKzxTVFJJTkc+XCIgICAgICAgICAgICAgICAgICAgeyAvKiBmaW4gZGUgbGEgY2hhaW5lOiBvbiBjcmVlIGxlIHBvaW50ZXVyIHF1aSB2YSBiaWVuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTiBJTklUSUFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1tzdHJpbmdfc2l6ZV09MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBnc2xfbWFsbG9jKGN1cnJlbnRHb29tU0wsIHN0cmluZ19zaXplKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSgoY2hhciopY3VycmVudEdvb21TTC0+cHRyQXJyYXlbdG1wXSxzdHJpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoeXlsdmFsLnN0clZhbHVlLCAiMHglMDh4IiwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTFRZUEVfUFRSOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Cis8U1RSSU5HPi4gICAgICAgICAgICAgICAgICAgIHsgc3RyaW5nW3N0cmluZ19zaXplKytdID0gKnl5dGV4dDsgfQorCis8SU5JVElBTD4iZmxvYXQiICAgICAgICAgICAgICAgICB7IHJldHVybiBGTE9BVF9USzsgfQorPElOSVRJQUw+ImludCIgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gSU5UX1RLOyAgIH0KKzxJTklUSUFMPiJib29sZWFuIiAgICAgICAgICAgICAgIHsgcmV0dXJuIElOVF9USzsgICB9Cis8SU5JVElBTD4icHRyIiAgICAgICAgICAgICAgICAgICB7IHJldHVybiBQVFJfVEs7ICAgfQorPElOSVRJQUw+InN0cmluZyIgICAgICAgICAgICAgICAgeyByZXR1cm4gUFRSX1RLOyAgIH0KKzxJTklUSUFMPiJkZWNsYXJlIiAgICAgICAgICAgICAgIHsgcmV0dXJuIERFQ0xBUkU7ICB9Cis8SU5JVElBTD4iZXh0ZXJuYWwiICAgICAgICAgICAgICB7IHJldHVybiBFWFRFUk5BTDsgfQorPElOSVRJQUw+InN0cnVjdCIgICAgICAgICAgICAgICAgeyByZXR1cm4gU1RSVUNUOyAgIH0KKzxJTklUSUFMPiJub3QiICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIE5PVDsgICAgICB9Cis8SU5JVElBTD4id2hpbGUiICAgICAgICAgICAgICAgICB7IHJldHVybiBXSElMRTsgICAgfSAKKzxJTklUSUFMPiJkbyIgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIERPOyAgICAgICB9Cis8SU5JVElBTD4iZm9yIiAgICAgICAgICAgICAgICAgICB7IHJldHVybiBGT1I7ICAgICAgfQorPElOSVRJQUw+ImluIiAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gSU47ICAgICAgIH0KKzxJTklUSUFMPiJ0cnVlIiAgICAgICAgICAgICAgICAgIHsgc3RybmNweSh5eWx2YWwuc3RyVmFsdWUsICIxIiwgMjA0Nyk7ICAgIHJldHVybiBMVFlQRV9JTlRFR0VSOyB9Cis8SU5JVElBTD4iZmFsc2UiICAgICAgICAgICAgICAgICB7IHN0cm5jcHkoeXlsdmFsLnN0clZhbHVlLCAiMCIsIDIwNDcpOyAgICByZXR1cm4gTFRZUEVfSU5URUdFUjsgfQorPElOSVRJQUw+e0lEfSAgICAgICAgICAgICAgICAgICAgeyBzdHJuY3B5KHl5bHZhbC5zdHJWYWx1ZSwgeXl0ZXh0LCAyMDQ3KTsgcmV0dXJuIExUWVBFX1ZBUjsgICAgIH0KKzxJTklUSUFMPntESUdJVH0rICAgICAgICAgICAgICAgIHsgc3RybmNweSh5eWx2YWwuc3RyVmFsdWUsIHl5dGV4dCwgMjA0Nyk7IHJldHVybiBMVFlQRV9JTlRFR0VSOyB9Cis8SU5JVElBTD5cJy5cJyAgICAgICAgICAgICAgICAgICB7IHNwcmludGYoeXlsdmFsLnN0clZhbHVlLCAiJWQiLCAoaW50KXl5dGV4dFsxXSk7IHJldHVybiBMVFlQRV9JTlRFR0VSOyB9Cis8SU5JVElBTD4iMHgie1hESUdJVH0rICAgICAgICAgICB7IHN0cm5jcHkoeXlsdmFsLnN0clZhbHVlLCB5eXRleHQsIDIwNDcpOyByZXR1cm4gTFRZUEVfSU5URUdFUjsgfQorPElOSVRJQUw+e0RJR0lUfSsiLiJ7RElHSVR9KiAgICAgeyBzdHJuY3B5KHl5bHZhbC5zdHJWYWx1ZSwgeXl0ZXh0LCAyMDQ3KTsgcmV0dXJuIExUWVBFX0ZMT0FUOyAgIH0KKzxJTklUSUFMPntESUdJVH0rIiUiICAgICAgICAgICAgIHsgc3ByaW50Zih5eWx2YWwuc3RyVmFsdWUsICIlMy4yZiIsIGF0b2YoeXl0ZXh0KS8xMDAuMGYpOyByZXR1cm4gTFRZUEVfRkxPQVQ7IH0KKzxJTklUSUFMPiIrPSIgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIFBMVVNfRVE7IH0KKzxJTklUSUFMPiIqPSIgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIE1VTF9FUTsgfQorPElOSVRJQUw+Ii09IiAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gU1VCX0VROyB9Cis8SU5JVElBTD4iLz0iICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBESVZfRVE7IH0KKzxJTklUSUFMPiI8PSIgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIExPV19FUTsgIH0KKzxJTklUSUFMPiI+PSIgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIFNVUF9FUTsgIH0KKzxJTklUSUFMPiIhPSIgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIE5PVF9FUTsgIH0KKzxJTklUSUFMPiI8PiIgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIE5PVF9FUTsgIH0KKzxJTklUSUFMPlsgXHRdKyAgICAgICAgICAgICAgICAgIC8qIGVhdCB1cCB3aGl0ZXNwYWNlICovCis8SU5JVElBTD4uICAgICAgICAgICAgICAgICAgICAgICB7IHl5bHZhbC5jaGFyVmFsdWUgPSAqeXl0ZXh0OyByZXR1cm4gKnl5dGV4dDsgICAgfQorCislJQorCisKK2ludCB5eXdyYXAodm9pZCkgeyByZXR1cm4gMTsgeXl1bnB1dCgwLDApOyB9CisKZGlmZiAtLWdpdCBhL2dzdC9nb29tL2dvb21zbF95YWNjLnkgYi9nc3QvZ29vbS9nb29tc2xfeWFjYy55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ODkzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9nb29tc2xfeWFjYy55CkBAIC0wLDAgKzEsMTQzOCBAQAorLyoqCisgKiBjb3B5cmlnaHQgMjAwNCwgSmVhbi1DaHJpc3RvcGhlIEhvZWx0IDxqZWtvQGlvcy1zb2Z0d2FyZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlLgorICovCisleworICAgICNpbmNsdWRlIDxzdGRpby5oPgorICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAjaW5jbHVkZSA8c3RyaW5nLmg+CisgICAgI2luY2x1ZGUgPGdsaWIuaD4KKyAgICAjaW5jbHVkZSAiZ29vbXNsLmgiCisgICAgI2luY2x1ZGUgImdvb21zbF9wcml2YXRlLmgiCisKKyNkZWZpbmUgU1RSVUNUX0FMSUdOTUVOVCAxNgorLyogI2RlZmluZSBWRVJCT1NFICAqLworCisgICAgaW50IHl5bGV4KHZvaWQpOworICAgIHZvaWQgeXllcnJvcihjaGFyICopOworICAgIGV4dGVybiBHb29tU0wgKmN1cnJlbnRHb29tU0w7CisKKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5vZGVOZXcoY29uc3QgY2hhciAqc3RyLCBpbnQgdHlwZSwgaW50IGxpbmVfbnVtYmVyKTsKKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5vZGVDbG9uZShOb2RlVHlwZSAqbm9kZSk7CisgICAgc3RhdGljIHZvaWQgbm9kZUZyZWVJbnRlcm5hbHMoTm9kZVR5cGUgKm5vZGUpOworICAgIHN0YXRpYyB2b2lkIG5vZGVGcmVlKE5vZGVUeXBlICpub2RlKTsKKworICAgIHN0YXRpYyB2b2lkIGNvbW1pdF9ub2RlKE5vZGVUeXBlICpub2RlLCBpbnQgcmVsZWFzZUlmVGVtcCk7CisgICAgc3RhdGljIHZvaWQgcHJlY29tbWl0X25vZGUoTm9kZVR5cGUgKm5vZGUpOworCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfY29uc3RJbnQoY29uc3QgY2hhciAqc3RyLCBpbnQgbGluZV9udW1iZXIpOworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X2NvbnN0RmxvYXQoY29uc3QgY2hhciAqc3RyLCBpbnQgbGluZV9udW1iZXIpOworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X2NvbnN0UHRyKGNvbnN0IGNoYXIgKnN0ciwgaW50IGxpbmVfbnVtYmVyKTsKKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5ld192YXIoY29uc3QgY2hhciAqc3RyLCBpbnQgbGluZV9udW1iZXIpOworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X25vcChjb25zdCBjaGFyICpzdHIpOworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X29wKGNvbnN0IGNoYXIgKnN0ciwgaW50IHR5cGUsIGludCBuYk9wKTsKKworICAgIHN0YXRpYyBpbnQgIGFsbG9jYXRlTGFiZWwoKTsKKyAgICBzdGF0aWMgaW50ICBhbGxvY2F0ZVRlbXAoKTsKKyAgICBzdGF0aWMgdm9pZCByZWxlYXNlVGVtcChpbnQgbik7CisgICAgc3RhdGljIHZvaWQgcmVsZWFzZUFsbFRlbXBzKCk7CisKKyAgICBzdGF0aWMgaW50IGlzX3RtcF9leHByKE5vZGVUeXBlICpub2RlKSB7CisgICAgICAgIGlmIChub2RlLT5zdHIpIHsKKyAgICAgICAgICAgIHJldHVybiAoIXN0cm5jbXAobm9kZS0+c3RyLCJfaV90bXBfIiw3KSkKKyAgICAgICAgICAgICAgfHwgKCFzdHJuY21wKG5vZGUtPnN0ciwiX2ZfdG1wXyIsNykpCisgICAgICAgICAgICAgIHx8ICghc3RybmNtcChub2RlLT5zdHIsIl9wX3RtcCIsNykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvKiBwcmU6IGlzX3RtcF9leHByKG5vZGUpOyAqLworICAgIHN0YXRpYyBpbnQgZ2V0X3RtcF9pZChOb2RlVHlwZSAqbm9kZSkgIHsgcmV0dXJuIGF0b2koKG5vZGUtPnN0cikrNSk7IH0KKworICAgIHN0YXRpYyBpbnQgaXNfY29tbXV0YXRpdmVfZXhwcihpbnQgaXR5cGUpCisgICAgeyAvKiB7e3sgKi8KKyAgICAgICAgcmV0dXJuIChpdHlwZSA9PSBJTlNUUl9BREQpCisgICAgICAgICAgICB8fCAoaXR5cGUgPT0gSU5TVFJfTVVMKQorICAgICAgICAgICAgfHwgKGl0eXBlID09IElOU1RSX0lTRVFVQUwpOworICAgIH0gLyogfX19ICovCisKKyAgICBzdGF0aWMgdm9pZCBHU0xfUFVUX0xBQkVMKGNoYXIgKm5hbWUsIGludCBsaW5lX251bWJlcikKKyAgICB7IC8qIHt7eyAqLworI2lmZGVmIFZFUkJPU0UKKyAgICAgIHByaW50ZigibGFiZWwgJXNcbiIsIG5hbWUpOworI2VuZGlmCisgICAgICBjdXJyZW50R29vbVNMLT5pbnN0ciA9IGdzbF9pbnN0cl9pbml0KGN1cnJlbnRHb29tU0wsICJsYWJlbCIsIElOU1RSX0xBQkVMLCAxLCBsaW5lX251bWJlcik7CisgICAgICBnc2xfaW5zdHJfYWRkX3BhcmFtKGN1cnJlbnRHb29tU0wtPmluc3RyLCBuYW1lLCBUWVBFX0xBQkVMKTsKKyAgICB9IC8qIH19fSAqLworICAgIHN0YXRpYyB2b2lkIEdTTF9QVVRfSlVNUChjaGFyICpuYW1lLCBpbnQgbGluZV9udW1iZXIpCisgICAgeyAvKiB7e3sgKi8KKyNpZmRlZiBWRVJCT1NFCisgICAgICBwcmludGYoImp1bXAgJXNcbiIsIG5hbWUpOworI2VuZGlmCisgICAgICBjdXJyZW50R29vbVNMLT5pbnN0ciA9IGdzbF9pbnN0cl9pbml0KGN1cnJlbnRHb29tU0wsICJqdW1wIiwgSU5TVFJfSlVNUCwgMSwgbGluZV9udW1iZXIpOworICAgICAgZ3NsX2luc3RyX2FkZF9wYXJhbShjdXJyZW50R29vbVNMLT5pbnN0ciwgbmFtZSwgVFlQRV9MQUJFTCk7CisgICAgfSAvKiB9fX0gKi8KKworICAgIHN0YXRpYyB2b2lkIEdTTF9QVVRfSlhYWChjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgaW50IGluc3RyX2lkLCBpbnQgbGluZV9udW1iZXIpCisgICAgeyAvKiB7e3sgKi8KKyNpZmRlZiBWRVJCT1NFCisgICAgICBwcmludGYoIiVzICVzXG4iLCBpbmFtZSwgbmFtZSk7CisjZW5kaWYKKyAgICAgIGN1cnJlbnRHb29tU0wtPmluc3RyID0gZ3NsX2luc3RyX2luaXQoY3VycmVudEdvb21TTCwgaW5hbWUsIGluc3RyX2lkLCAxLCBsaW5lX251bWJlcik7CisgICAgICBnc2xfaW5zdHJfYWRkX3BhcmFtKGN1cnJlbnRHb29tU0wtPmluc3RyLCBuYW1lLCBUWVBFX0xBQkVMKTsKKyAgICB9IC8qIH19fSAqLworICAgIHN0YXRpYyB2b2lkIEdTTF9QVVRfSlpFUk8oY2hhciAqbmFtZSxpbnQgbGluZV9udW1iZXIpCisgICAgeyAvKiB7e3sgKi8KKyAgICAgIEdTTF9QVVRfSlhYWChuYW1lLCJqemVyby5pIixJTlNUUl9KWkVSTyxsaW5lX251bWJlcik7CisgICAgfSAvKiB9fX0gKi8KKyAgICBzdGF0aWMgdm9pZCBHU0xfUFVUX0pOWkVSTyhjaGFyICpuYW1lLCBpbnQgbGluZV9udW1iZXIpCisgICAgeyAvKiB7e3sgKi8KKyAgICAgIEdTTF9QVVRfSlhYWChuYW1lLCJqbnplcm8uaSIsSU5TVFJfSk5aRVJPLGxpbmVfbnVtYmVyKTsKKyAgICB9IC8qIH19fSAqLworCisgICAgLyogU3RydWN0dXJlcyBNYW5hZ2VtZW50ICovCisKKyNkZWZpbmUgQUxJR05fQUREUihfYWRkcixfYWxpZ24pIHtcCisgICBpZiAoX2FsaWduPjEpIHtcCisgICAgICAgaW50IF9kZWMgPSAoX2FkZHIlX2FsaWduKTtcCisgICAgICAgaWYgKF9kZWMgIT0gMCkgX2FkZHIgKz0gX2FsaWduIC0gX2RlYztcCisgICB9fQorCisgICAgLyogKi8KKyAgICB2b2lkIGdzbF9wcmVwYXJlX3N0cnVjdChHU0xfU3RydWN0ICpzLCBpbnQgc19hbGlnbiwgaW50IGlfYWxpZ24sIGludCBmX2FsaWduKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgaW50IGNvbnN1bWVkID0gMDsKKyAgICAgIGludCBpYmxrPTAsIGZibGs9MDsKKworICAgICAgcy0+aUJsb2NrWzBdLnNpemUgPSAwOworICAgICAgcy0+aUJsb2NrWzBdLmRhdGEgPSAwOworICAgICAgcy0+ZkJsb2NrWzBdLnNpemUgPSAwOworICAgICAgcy0+ZkJsb2NrWzBdLmRhdGEgPSAwOworCisgICAgICAvKiBQcmVwYXJlIHN1Yi1zdHJ1Y3QgYW5kIGNhbGN1bGF0ZSBzcGFjZSBuZWVkZWQgZm9yIHRoZWlyIHN0b3JhZ2UgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYkZpZWxkczsgKytpKQorICAgICAgeworICAgICAgICBpZiAocy0+ZmllbGRzW2ldLT50eXBlIDwgRklSU1RfUkVTRVJWRUQpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgaj0wOworICAgICAgICAgIEdTTF9TdHJ1Y3QgKnN1YnN0cnVjdCA9IGN1cnJlbnRHb29tU0wtPmdzbF9zdHJ1Y3Rbcy0+ZmllbGRzW2ldLT50eXBlXTsKKyAgICAgICAgICBjb25zdW1lZCArPSBzaXplb2YoaW50KTsgLyogc3RvY2tlIGxlIHByZWZpeCAqLworICAgICAgICAgIEFMSUdOX0FERFIoY29uc3VtZWQsIHNfYWxpZ24pOworICAgICAgICAgIHMtPmZpZWxkc1tpXS0+b2Zmc2V0SW5TdHJ1Y3QgPSBjb25zdW1lZDsKKyAgICAgICAgICBnc2xfcHJlcGFyZV9zdHJ1Y3Qoc3Vic3RydWN0LCBzX2FsaWduLCBpX2FsaWduLCBmX2FsaWduKTsKKyAgICAgICAgICBmb3Ioaj0wO3N1YnN0cnVjdC0+aUJsb2NrW2pdLnNpemU+MDsrK2opIHsKKyAgICAgICAgICAgIHMtPmlCbG9ja1tpYmxrXS5kYXRhID0gY29uc3VtZWQgKyBzdWJzdHJ1Y3QtPmlCbG9ja1tqXS5kYXRhOworICAgICAgICAgICAgcy0+aUJsb2NrW2libGtdLnNpemUgPSBzdWJzdHJ1Y3QtPmlCbG9ja1tqXS5zaXplOworICAgICAgICAgICAgaWJsaysrOworICAgICAgICAgIH0KKyAgICAgICAgICBmb3Ioaj0wO3N1YnN0cnVjdC0+ZkJsb2NrW2pdLnNpemU+MDsrK2opIHsKKyAgICAgICAgICAgIHMtPmZCbG9ja1tmYmxrXS5kYXRhID0gY29uc3VtZWQgKyBzdWJzdHJ1Y3QtPmZCbG9ja1tqXS5kYXRhOworICAgICAgICAgICAgcy0+ZkJsb2NrW2ZibGtdLnNpemUgPSBzdWJzdHJ1Y3QtPmZCbG9ja1tqXS5zaXplOworICAgICAgICAgICAgZmJsaysrOworICAgICAgICAgIH0KKyAgICAgICAgICBjb25zdW1lZCArPSBzdWJzdHJ1Y3QtPnNpemU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogVGhlbiBwcmVwYXJlIGludGVnZXJzICovCisgICAgICBBTElHTl9BRERSKGNvbnN1bWVkLCBpX2FsaWduKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYkZpZWxkczsgKytpKQorICAgICAgeworICAgICAgICBpZiAocy0+ZmllbGRzW2ldLT50eXBlID09IElOU1RSX0lOVCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChzLT5pQmxvY2tbaWJsa10uc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBzLT5pQmxvY2tbaWJsa10uc2l6ZSA9IDE7CisgICAgICAgICAgICBzLT5pQmxvY2tbaWJsa10uZGF0YSA9IGNvbnN1bWVkOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5pQmxvY2tbaWJsa10uc2l6ZSArPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICBzLT5maWVsZHNbaV0tPm9mZnNldEluU3RydWN0ID0gY29uc3VtZWQ7CisgICAgICAgICAgY29uc3VtZWQgKz0gc2l6ZW9mKGludCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWJsaysrOworICAgICAgcy0+aUJsb2NrW2libGtdLnNpemUgPSAwOworICAgICAgcy0+aUJsb2NrW2libGtdLmRhdGEgPSAwOworCisgICAgICAvKiBUaGVuIHByZXBhcmUgZmxvYXRzICovCisgICAgICBBTElHTl9BRERSKGNvbnN1bWVkLCBmX2FsaWduKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYkZpZWxkczsgKytpKQorICAgICAgeworICAgICAgICBpZiAocy0+ZmllbGRzW2ldLT50eXBlID09IElOU1RSX0ZMT0FUKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHMtPmZCbG9ja1tmYmxrXS5zaXplID09IDApIHsKKyAgICAgICAgICAgIHMtPmZCbG9ja1tmYmxrXS5zaXplID0gMTsKKyAgICAgICAgICAgIHMtPmZCbG9ja1tmYmxrXS5kYXRhID0gY29uc3VtZWQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPmZCbG9ja1tmYmxrXS5zaXplICs9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIHMtPmZpZWxkc1tpXS0+b2Zmc2V0SW5TdHJ1Y3QgPSBjb25zdW1lZDsKKyAgICAgICAgICBjb25zdW1lZCArPSBzaXplb2YoaW50KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmYmxrKys7CisgICAgICBzLT5mQmxvY2tbZmJsa10uc2l6ZSA9IDA7CisgICAgICBzLT5mQmxvY2tbZmJsa10uZGF0YSA9IDA7CisgICAgICAKKyAgICAgIC8qIEZpbmFsbHkgcHJlcGFyZSBwb2ludGVycyAqLworICAgICAgQUxJR05fQUREUihjb25zdW1lZCwgaV9hbGlnbik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJGaWVsZHM7ICsraSkKKyAgICAgIHsKKyAgICAgICAgaWYgKHMtPmZpZWxkc1tpXS0+dHlwZSA9PSBJTlNUUl9QVFIpCisgICAgICAgIHsKKyAgICAgICAgICBzLT5maWVsZHNbaV0tPm9mZnNldEluU3RydWN0ID0gY29uc3VtZWQ7CisgICAgICAgICAgY29uc3VtZWQgKz0gc2l6ZW9mKGludCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHMtPnNpemUgPSBjb25zdW1lZDsKKyAgICB9CisKKyAgICAvKiBSZXR1cm5zIHRoZSBJRCBvZiBhIHN0cnVjdCBmcm9tIGl0cyBuYW1lICovCisgICAgaW50IGdzbF9nZXRfc3RydWN0X2lkKGNvbnN0IGNoYXIgKm5hbWUpIC8qIHt7eyAqLworICAgIHsKKyAgICAgIEhhc2hWYWx1ZSAqcmV0ID0gZ29vbV9oYXNoX2dldChjdXJyZW50R29vbVNMLT5zdHJ1Y3RJRFMsIG5hbWUpOworICAgICAgaWYgKHJldCAhPSBOVUxMKSByZXR1cm4gcmV0LT5pOworICAgICAgcmV0dXJuIC0xOworICAgIH0gLyogfX19ICovCisKKyAgICAvKiBBZGRzIHRoZSBkZWZpbml0aW9uIG9mIGEgc3RydWN0ICovCisgICAgdm9pZCBnc2xfYWRkX3N0cnVjdChjb25zdCBjaGFyICpuYW1lLCBHU0xfU3RydWN0ICpnc2xfc3RydWN0KSAvKiB7e3sgKi8KKyAgICB7CisgICAgICAvKiBQcmVwYXJlIHRoZSBzdHJ1Y3Q6IGllIGNhbGN1bGF0ZSBpbnRlcm5hbCBzdG9yYWdlIGZvcm1hdCAqLworICAgICAgZ3NsX3ByZXBhcmVfc3RydWN0KGdzbF9zdHJ1Y3QsIFNUUlVDVF9BTElHTk1FTlQsIFNUUlVDVF9BTElHTk1FTlQsIFNUUlVDVF9BTElHTk1FTlQpOworICAgICAgCisgICAgICAvKiBJZiB0aGUgc3RydWN0IGRvZXMgbm90IGFscmVhZHkgZXhpc3RzICovCisgICAgICBpZiAoZ3NsX2dldF9zdHJ1Y3RfaWQobmFtZSkgPCAwKQorICAgICAgeworICAgICAgICAvKiBhZGRzIGl0ICovCisgICAgICAgIGludCBpZCA9IGN1cnJlbnRHb29tU0wtPm5iU3RydWN0SUQrKzsKKyAgICAgICAgZ29vbV9oYXNoX3B1dF9pbnQoY3VycmVudEdvb21TTC0+c3RydWN0SURTLCBuYW1lLCBpZCk7CisgICAgICAgIGlmIChjdXJyZW50R29vbVNMLT5nc2xfc3RydWN0X3NpemUgPD0gaWQpIHsKKyAgICAgICAgICBjdXJyZW50R29vbVNMLT5nc2xfc3RydWN0X3NpemUgKj0gMjsKKyAgICAgICAgICBjdXJyZW50R29vbVNMLT5nc2xfc3RydWN0ID0gKEdTTF9TdHJ1Y3QqKilyZWFsbG9jKGN1cnJlbnRHb29tU0wtPmdzbF9zdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoR1NMX1N0cnVjdCopICogY3VycmVudEdvb21TTC0+Z3NsX3N0cnVjdF9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50R29vbVNMLT5nc2xfc3RydWN0W2lkXSA9IGdzbF9zdHJ1Y3Q7CisgICAgICB9CisgICAgfSAvKiB9fX0gKi8KKyAgICAKKyAgICAvKiBDcmVhdGVzIGEgZmllbGQgZm9yIGEgc3RydWN0ICovCisgICAgR1NMX1N0cnVjdEZpZWxkICpnc2xfbmV3X3N0cnVjdF9maWVsZChjb25zdCBjaGFyICpuYW1lLCBpbnQgdHlwZSkKKyAgICB7CisgICAgICBHU0xfU3RydWN0RmllbGQgKmZpZWxkID0gKEdTTF9TdHJ1Y3RGaWVsZCopbWFsbG9jKHNpemVvZihHU0xfU3RydWN0RmllbGQpKTsKKyAgICAgIHN0cmNweShmaWVsZC0+bmFtZSwgbmFtZSk7CisgICAgICBmaWVsZC0+dHlwZSA9IHR5cGU7CisgICAgICByZXR1cm4gZmllbGQ7CisgICAgfQorICAgIAorICAgIC8qIENyZWF0ZSBhcyBmaWVsZCBmb3IgYSBzdHJ1Y3Qgd2hpY2ggd2lsbCBiZSBhIHN0cnVjdCBpdHNlbGYgKi8KKyAgICBHU0xfU3RydWN0RmllbGQgKmdzbF9uZXdfc3RydWN0X2ZpZWxkX3N0cnVjdChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlKQorICAgIHsKKyAgICAgIEdTTF9TdHJ1Y3RGaWVsZCAqZmllbGQgPSBnc2xfbmV3X3N0cnVjdF9maWVsZChuYW1lLCBnc2xfZ2V0X3N0cnVjdF9pZCh0eXBlKSk7CisgICAgICBpZiAoZmllbGQtPnR5cGUgPCAwKSB7CisgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworI2lmIDAKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogTGluZSAlZCwgVW5rbm93biBzdHJ1Y3R1cmU6ICclcydcbiIsCisgICAgICAgICAgICAgICAgY3VycmVudEdvb21TTC0+bnVtX2xpbmVzLCB0eXBlKTsKKyAgICAgICAgZXhpdCgxKTsKKyNlbmRpZgorICAgICAgfQorICAgICAgcmV0dXJuIGZpZWxkOworICAgIH0KKworICAgIC8qIENyZWF0ZXMgYSBTdHJ1Y3QgKi8KKyAgICBHU0xfU3RydWN0ICpnc2xfbmV3X3N0cnVjdChHU0xfU3RydWN0RmllbGQgKmZpZWxkKQorICAgIHsKKyAgICAgIEdTTF9TdHJ1Y3QgKnMgPSAoR1NMX1N0cnVjdCopbWFsbG9jKHNpemVvZihHU0xfU3RydWN0KSk7CisgICAgICBzLT5uYkZpZWxkcyA9IDE7CisgICAgICBzLT5maWVsZHNbMF0gPSBmaWVsZDsKKyAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIC8qIEFkZHMgYSBmaWVsZCB0byBhIHN0cnVjdCAqLworICAgIHZvaWQgZ3NsX2FkZF9zdHJ1Y3RfZmllbGQoR1NMX1N0cnVjdCAqcywgR1NMX1N0cnVjdEZpZWxkICpmaWVsZCkKKyAgICB7CisgICAgICBzLT5maWVsZHNbcy0+bmJGaWVsZHMrK10gPSBmaWVsZDsKKyAgICB9CisKKyAgICBpbnQgZ3NsX3R5cGVfb2ZfdmFyKEdvb21IYXNoICpucywgY29uc3QgY2hhciAqbmFtZSkKKyAgICB7CisgICAgICAgIGNoYXIgdHlwZV9vZlsyNTZdOworICAgICAgICBIYXNoVmFsdWUgKmh2OworICAgICAgICBzcHJpbnRmKHR5cGVfb2YsICJfX3R5cGVfb2ZfJXMiLCBuYW1lKTsKKyAgICAgICAgaHYgPSBnb29tX2hhc2hfZ2V0KG5zLCB0eXBlX29mKTsKKyAgICAgICAgaWYgKGh2ICE9IE5VTEwpCisgICAgICAgICAgcmV0dXJuIGh2LT5pOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBVbmtub3duIHZhcmlhYmxlIHR5cGU6ICclcydcbiIsIG5hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgZ3NsX2RlY2xhcmVfdmFyKEdvb21IYXNoICpucywgY29uc3QgY2hhciAqbmFtZSwgaW50IHR5cGUsIHZvaWQgKnNwYWNlKQorICAgIHsKKyAgICAgICAgY2hhciB0eXBlX29mWzI1Nl07CisgICAgICAgIGlmIChuYW1lWzBdID09ICdAJykgeyBucyA9IGN1cnJlbnRHb29tU0wtPnZhcnM7IH0KKworICAgICAgICBpZiAoc3BhY2UgPT0gTlVMTCkgeworICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBJTlNUUl9JTlQ6CisgICAgICAgICAgICBjYXNlIElOU1RSX0ZMT0FUOgorICAgICAgICAgICAgY2FzZSBJTlNUUl9QVFI6CisgICAgICAgICAgICAgIHNwYWNlID0gZ29vbV9oZWFwX21hbGxvY193aXRoX2FsaWdubWVudChjdXJyZW50R29vbVNMLT5kYXRhX2hlYXAsCisgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSwgc2l6ZW9mKGludCkpOworICAgICAgICAgICAgYnJlYWs7CisjaWYgMAorICAgICAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJXaGF0IHRoZSBmdWNrIVxuIik7CisgICAgICAgICAgICAgIGV4aXQoMSk7CisjZW5kaWYKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8qIE9uIGEgdW4gc3RydWN0X2lkICovCisgICAgICAgICAgICAgIHNwYWNlID0gZ29vbV9oZWFwX21hbGxvY193aXRoX2FsaWdubWVudF9wcmVmaXhlZChjdXJyZW50R29vbVNMLT5kYXRhX2hlYXAsCisgICAgICAgICAgICAgICAgICBjdXJyZW50R29vbVNMLT5nc2xfc3RydWN0W3R5cGVdLT5zaXplLCBTVFJVQ1RfQUxJR05NRU5ULCBzaXplb2YoaW50KSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdvb21faGFzaF9wdXRfcHRyKG5zLCBuYW1lLCAodm9pZCopc3BhY2UpOworICAgICAgICBzcHJpbnRmKHR5cGVfb2YsICJfX3R5cGVfb2ZfJXMiLCBuYW1lKTsKKyAgICAgICAgZ29vbV9oYXNoX3B1dF9pbnQobnMsIHR5cGVfb2YsIHR5cGUpOworCisgICAgICAgIC8qIEVuc3VpdGUgbGUgaGFjazogb24gYWpvdXRlIGxlcyBjaGFtcHMgZW4gdGFudCBxdWUgdmFyaWFibGVzLiAqLworICAgICAgICBpZiAodHlwZSA8IEZJUlNUX1JFU0VSVkVEKQorICAgICAgICB7CisgICAgICAgICAgaW50IGk7CisgICAgICAgICAgR1NMX1N0cnVjdCAqZ3NsX3N0cnVjdCA9IGN1cnJlbnRHb29tU0wtPmdzbF9zdHJ1Y3RbdHlwZV07CisgICAgICAgICAgKChpbnQqKXNwYWNlKVstMV0gPSB0eXBlOyAvKiBzdG9ja2FnZSBkdSB0eXBlIGRhbnMgbGUgcHJlZml4ZSBkZSBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ3NsX3N0cnVjdC0+bmJGaWVsZHM7ICsraSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGZ1bGxfbmFtZVsyNTZdOworICAgICAgICAgICAgY2hhciAqY3NwYWNlID0gKGNoYXIqKXNwYWNlICsgZ3NsX3N0cnVjdC0+ZmllbGRzW2ldLT5vZmZzZXRJblN0cnVjdDsKKyAgICAgICAgICAgIHNwcmludGYoZnVsbF9uYW1lLCAiJXMuJXMiLCBuYW1lLCBnc2xfc3RydWN0LT5maWVsZHNbaV0tPm5hbWUpOworICAgICAgICAgICAgZ3NsX2RlY2xhcmVfdmFyKG5zLCBmdWxsX25hbWUsIGdzbF9zdHJ1Y3QtPmZpZWxkc1tpXS0+dHlwZSwgY3NwYWNlKTsKKyAgICAgICAgICB9CisgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBEZWNsYXJlIGEgdmFyaWFibGUgd2hpY2ggd2lsbCBiZSBhIHN0cnVjdCAqLworICAgIHN0YXRpYyB2b2lkIGdzbF9zdHJ1Y3RfZGVjbChHb29tSGFzaCAqbmFtZXNwYWNlLCBjb25zdCBjaGFyICpzdHJ1Y3RfbmFtZSwgY29uc3QgY2hhciAqbmFtZSkKKyAgICB7CisgICAgICAgIGludCAgc3RydWN0X2lkID0gZ3NsX2dldF9zdHJ1Y3RfaWQoc3RydWN0X25hbWUpOworICAgICAgICBnc2xfZGVjbGFyZV92YXIobmFtZXNwYWNlLCBuYW1lLCBzdHJ1Y3RfaWQsIE5VTEwpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGdzbF9mbG9hdF9kZWNsX2dsb2JhbChjb25zdCBjaGFyICpuYW1lKQorICAgIHsKKyAgICAgICAgZ3NsX2RlY2xhcmVfdmFyKGN1cnJlbnRHb29tU0wtPnZhcnMsIG5hbWUsIElOU1RSX0ZMT0FULCBOVUxMKTsKKyAgICB9CisgICAgc3RhdGljIHZvaWQgZ3NsX2ludF9kZWNsX2dsb2JhbChjb25zdCBjaGFyICpuYW1lKQorICAgIHsKKyAgICAgICAgZ3NsX2RlY2xhcmVfdmFyKGN1cnJlbnRHb29tU0wtPnZhcnMsIG5hbWUsIElOU1RSX0lOVCwgTlVMTCk7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIGdzbF9wdHJfZGVjbF9nbG9iYWwoY29uc3QgY2hhciAqbmFtZSkKKyAgICB7CisgICAgICAgIGdzbF9kZWNsYXJlX3ZhcihjdXJyZW50R29vbVNMLT52YXJzLCBuYW1lLCBJTlNUUl9QVFIsIE5VTEwpOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBnc2xfc3RydWN0X2RlY2xfZ2xvYmFsX2Zyb21faWQoY29uc3QgY2hhciAqbmFtZSwgaW50IGlkKQorICAgIHsKKyAgICAgICAgZ3NsX2RlY2xhcmVfdmFyKGN1cnJlbnRHb29tU0wtPnZhcnMsIG5hbWUsIGlkLCBOVUxMKTsKKyAgICB9CisgICAgCisgICAgLyogRkxPQVQgKi8KKyAgICBzdGF0aWMgdm9pZCBnc2xfZmxvYXRfZGVjbF9sb2NhbChjb25zdCBjaGFyICpuYW1lKQorICAgIHsKKyAgICAgICAgZ3NsX2RlY2xhcmVfdmFyKGN1cnJlbnRHb29tU0wtPm5hbWVzcGFjZXNbY3VycmVudEdvb21TTC0+Y3VycmVudE5TXSwgbmFtZSwgSU5TVFJfRkxPQVQsIE5VTEwpOworICAgIH0KKyAgICAvKiBJTlQgKi8KKyAgICBzdGF0aWMgdm9pZCBnc2xfaW50X2RlY2xfbG9jYWwoY29uc3QgY2hhciAqbmFtZSkKKyAgICB7CisgICAgICAgIGdzbF9kZWNsYXJlX3ZhcihjdXJyZW50R29vbVNMLT5uYW1lc3BhY2VzW2N1cnJlbnRHb29tU0wtPmN1cnJlbnROU10sIG5hbWUsIElOU1RSX0lOVCwgTlVMTCk7CisgICAgfQorICAgIC8qIFBUUiAqLworICAgIHN0YXRpYyB2b2lkIGdzbF9wdHJfZGVjbF9sb2NhbChjb25zdCBjaGFyICpuYW1lKQorICAgIHsKKyAgICAgICAgZ3NsX2RlY2xhcmVfdmFyKGN1cnJlbnRHb29tU0wtPm5hbWVzcGFjZXNbY3VycmVudEdvb21TTC0+Y3VycmVudE5TXSwgbmFtZSwgSU5TVFJfUFRSLCBOVUxMKTsKKyAgICB9CisgICAgLyogU1RSVUNUICovCisgICAgc3RhdGljIHZvaWQgZ3NsX3N0cnVjdF9kZWNsX2xvY2FsKGNvbnN0IGNoYXIgKnN0cnVjdF9uYW1lLCBjb25zdCBjaGFyICpuYW1lKQorICAgIHsKKyAgICAgICAgZ3NsX3N0cnVjdF9kZWNsKGN1cnJlbnRHb29tU0wtPm5hbWVzcGFjZXNbY3VycmVudEdvb21TTC0+Y3VycmVudE5TXSxzdHJ1Y3RfbmFtZSxuYW1lKTsKKyAgICB9CisKKworICAgIHN0YXRpYyB2b2lkIGNvbW1pdF90ZXN0MihOb2RlVHlwZSAqc2V0LGNvbnN0IGNoYXIgKnR5cGUsIGludCBpbnN0cik7CisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfY2FsbChjb25zdCBjaGFyICpuYW1lLCBOb2RlVHlwZSAqYWZmZWN0X2xpc3QpOworCisgICAgLyogU0VUVEVSICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfc2V0KE5vZGVUeXBlICpsdmFsdWUsIE5vZGVUeXBlICpleHByZXNzaW9uKQorICAgIHsgLyoge3t7ICovCisgICAgICAgIE5vZGVUeXBlICpzZXQgPSBuZXdfb3AoInNldCIsIE9QUl9TRVQsIDIpOworICAgICAgICBzZXQtPnVub2RlLm9wci5vcFswXSA9IGx2YWx1ZTsKKyAgICAgICAgc2V0LT51bm9kZS5vcHIub3BbMV0gPSBleHByZXNzaW9uOworICAgICAgICByZXR1cm4gc2V0OworICAgIH0gLyogfX19ICovCisgICAgc3RhdGljIHZvaWQgY29tbWl0X3NldChOb2RlVHlwZSAqc2V0KQorICAgIHsgLyoge3t7ICovCisgICAgICBjb21taXRfdGVzdDIoc2V0LCJzZXQiLElOU1RSX1NFVCk7CisgICAgfSAvKiB9fX0gKi8KKworICAgIC8qIFBMVVNfRVEgKi8KKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5ld19wbHVzX2VxKE5vZGVUeXBlICpsdmFsdWUsIE5vZGVUeXBlICpleHByZXNzaW9uKSAvKiB7e3sgKi8KKyAgICB7CisgICAgICAgIE5vZGVUeXBlICpzZXQgPSBuZXdfb3AoInBsdXNfZXEiLCBPUFJfUExVU19FUSwgMik7CisgICAgICAgIHNldC0+dW5vZGUub3ByLm9wWzBdID0gbHZhbHVlOworICAgICAgICBzZXQtPnVub2RlLm9wci5vcFsxXSA9IGV4cHJlc3Npb247CisgICAgICAgIHJldHVybiBzZXQ7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIGNvbW1pdF9wbHVzX2VxKE5vZGVUeXBlICpzZXQpCisgICAgeworICAgICAgICBwcmVjb21taXRfbm9kZShzZXQtPnVub2RlLm9wci5vcFsxXSk7CisjaWZkZWYgVkVSQk9TRQorICAgICAgICBwcmludGYoImFkZCAlcyAlc1xuIiwgc2V0LT51bm9kZS5vcHIub3BbMF0tPnN0ciwgc2V0LT51bm9kZS5vcHIub3BbMV0tPnN0cik7CisjZW5kaWYKKyAgICAgICAgY3VycmVudEdvb21TTC0+aW5zdHIgPSBnc2xfaW5zdHJfaW5pdChjdXJyZW50R29vbVNMLCAiYWRkIiwgSU5TVFJfQURELCAyLCBzZXQtPmxpbmVfbnVtYmVyKTsKKyAgICAgICAgY29tbWl0X25vZGUoc2V0LT51bm9kZS5vcHIub3BbMF0sMCk7CisgICAgICAgIGNvbW1pdF9ub2RlKHNldC0+dW5vZGUub3ByLm9wWzFdLDEpOworICAgIH0gLyogfX19ICovCisKKyAgICAvKiBTVUJfRVEgKi8KKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5ld19zdWJfZXEoTm9kZVR5cGUgKmx2YWx1ZSwgTm9kZVR5cGUgKmV4cHJlc3Npb24pIC8qIHt7eyAqLworICAgIHsKKyAgICAgICAgTm9kZVR5cGUgKnNldCA9IG5ld19vcCgic3ViX2VxIiwgT1BSX1NVQl9FUSwgMik7CisgICAgICAgIHNldC0+dW5vZGUub3ByLm9wWzBdID0gbHZhbHVlOworICAgICAgICBzZXQtPnVub2RlLm9wci5vcFsxXSA9IGV4cHJlc3Npb247CisgICAgICAgIHJldHVybiBzZXQ7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIGNvbW1pdF9zdWJfZXEoTm9kZVR5cGUgKnNldCkKKyAgICB7CisgICAgICAgIHByZWNvbW1pdF9ub2RlKHNldC0+dW5vZGUub3ByLm9wWzFdKTsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIHByaW50Zigic3ViICVzICVzXG4iLCBzZXQtPnVub2RlLm9wci5vcFswXS0+c3RyLCBzZXQtPnVub2RlLm9wci5vcFsxXS0+c3RyKTsKKyNlbmRpZgorICAgICAgICBjdXJyZW50R29vbVNMLT5pbnN0ciA9IGdzbF9pbnN0cl9pbml0KGN1cnJlbnRHb29tU0wsICJzdWIiLCBJTlNUUl9TVUIsIDIsIHNldC0+bGluZV9udW1iZXIpOworICAgICAgICBjb21taXRfbm9kZShzZXQtPnVub2RlLm9wci5vcFswXSwwKTsKKyAgICAgICAgY29tbWl0X25vZGUoc2V0LT51bm9kZS5vcHIub3BbMV0sMSk7CisgICAgfSAvKiB9fX0gKi8KKworICAgIC8qIE1VTF9FUSAqLworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X211bF9lcShOb2RlVHlwZSAqbHZhbHVlLCBOb2RlVHlwZSAqZXhwcmVzc2lvbikgLyoge3t7ICovCisgICAgeworICAgICAgICBOb2RlVHlwZSAqc2V0ID0gbmV3X29wKCJtdWxfZXEiLCBPUFJfTVVMX0VRLCAyKTsKKyAgICAgICAgc2V0LT51bm9kZS5vcHIub3BbMF0gPSBsdmFsdWU7CisgICAgICAgIHNldC0+dW5vZGUub3ByLm9wWzFdID0gZXhwcmVzc2lvbjsKKyAgICAgICAgcmV0dXJuIHNldDsKKyAgICB9CisgICAgc3RhdGljIHZvaWQgY29tbWl0X211bF9lcShOb2RlVHlwZSAqc2V0KQorICAgIHsKKyAgICAgICAgcHJlY29tbWl0X25vZGUoc2V0LT51bm9kZS5vcHIub3BbMV0pOworI2lmZGVmIFZFUkJPU0UKKyAgICAgICAgcHJpbnRmKCJtdWwgJXMgJXNcbiIsIHNldC0+dW5vZGUub3ByLm9wWzBdLT5zdHIsIHNldC0+dW5vZGUub3ByLm9wWzFdLT5zdHIpOworI2VuZGlmCisgICAgICAgIGN1cnJlbnRHb29tU0wtPmluc3RyID0gZ3NsX2luc3RyX2luaXQoY3VycmVudEdvb21TTCwgIm11bCIsIElOU1RSX01VTCwgMiwgc2V0LT5saW5lX251bWJlcik7CisgICAgICAgIGNvbW1pdF9ub2RlKHNldC0+dW5vZGUub3ByLm9wWzBdLDApOworICAgICAgICBjb21taXRfbm9kZShzZXQtPnVub2RlLm9wci5vcFsxXSwxKTsKKyAgICB9IC8qIH19fSAqLworCisgICAgLyogRElWX0VRICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfZGl2X2VxKE5vZGVUeXBlICpsdmFsdWUsIE5vZGVUeXBlICpleHByZXNzaW9uKSAvKiB7e3sgKi8KKyAgICB7CisgICAgICAgIE5vZGVUeXBlICpzZXQgPSBuZXdfb3AoImRpdl9lcSIsIE9QUl9ESVZfRVEsIDIpOworICAgICAgICBzZXQtPnVub2RlLm9wci5vcFswXSA9IGx2YWx1ZTsKKyAgICAgICAgc2V0LT51bm9kZS5vcHIub3BbMV0gPSBleHByZXNzaW9uOworICAgICAgICByZXR1cm4gc2V0OworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBjb21taXRfZGl2X2VxKE5vZGVUeXBlICpzZXQpCisgICAgeworICAgICAgICBwcmVjb21taXRfbm9kZShzZXQtPnVub2RlLm9wci5vcFsxXSk7CisjaWZkZWYgVkVSQk9TRQorICAgICAgICBwcmludGYoImRpdiAlcyAlc1xuIiwgc2V0LT51bm9kZS5vcHIub3BbMF0tPnN0ciwgc2V0LT51bm9kZS5vcHIub3BbMV0tPnN0cik7CisjZW5kaWYKKyAgICAgICAgY3VycmVudEdvb21TTC0+aW5zdHIgPSBnc2xfaW5zdHJfaW5pdChjdXJyZW50R29vbVNMLCAiZGl2IiwgSU5TVFJfRElWLCAyLCBzZXQtPmxpbmVfbnVtYmVyKTsKKyAgICAgICAgY29tbWl0X25vZGUoc2V0LT51bm9kZS5vcHIub3BbMF0sMCk7CisgICAgICAgIGNvbW1pdF9ub2RlKHNldC0+dW5vZGUub3ByLm9wWzFdLDEpOworICAgIH0gLyogfX19ICovCisKKyAgICAvKiBjb21tb2RpdHkgbWV0aG9kIGZvciBhZGQsIG11bHQsIC4uLiAqLworCisgICAgc3RhdGljIHZvaWQgcHJlY29tbWl0X2V4cHIoTm9kZVR5cGUgKmV4cHIsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBpbnN0cl9pZCkKKyAgICB7IC8qIHt7eyAqLworICAgICAgICBOb2RlVHlwZSAqdG1wLCAqdG1wY3B5OworICAgICAgICBpbnQgdG9BZGQ7CisKKyAgICAgICAgLyogY29tcHV0ZSAibGVmdCIgYW5kICJyaWdodCIgKi8KKyAgICAgICAgc3dpdGNoIChleHByLT51bm9kZS5vcHIubmJPcCkgeworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgcHJlY29tbWl0X25vZGUoZXhwci0+dW5vZGUub3ByLm9wWzFdKTsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIHByZWNvbW1pdF9ub2RlKGV4cHItPnVub2RlLm9wci5vcFswXSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNfdG1wX2V4cHIoZXhwci0+dW5vZGUub3ByLm9wWzBdKSkgeworICAgICAgICAgICAgdG1wID0gZXhwci0+dW5vZGUub3ByLm9wWzBdOworICAgICAgICAgICAgdG9BZGQgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGlzX2NvbW11dGF0aXZlX2V4cHIoaW5zdHJfaWQpICYmIChleHByLT51bm9kZS5vcHIubmJPcD09MikgJiYgaXNfdG1wX2V4cHIoZXhwci0+dW5vZGUub3ByLm9wWzFdKSkgeworICAgICAgICAgICAgdG1wID0gZXhwci0+dW5vZGUub3ByLm9wWzFdOworICAgICAgICAgICAgdG9BZGQgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY2hhciBzdG1wWzI1Nl07CisgICAgICAgICAgICAvKiBkZWNsYXJlIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIHRvIHN0b3JlIHRoZSByZXN1bHQgKi8KKyAgICAgICAgICAgIGlmIChleHByLT51bm9kZS5vcHIub3BbMF0tPnR5cGUgPT0gQ09OU1RfSU5UX05PREUpIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHN0bXAsIl9pX3RtcF8laSIsYWxsb2NhdGVUZW1wKCkpOworICAgICAgICAgICAgICAgIGdzbF9pbnRfZGVjbF9nbG9iYWwoc3RtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChleHByLT51bm9kZS5vcHIub3BbMF0tPnR5cGUgPT0gQ09OU1RfRkxPQVRfTk9ERSkgeworICAgICAgICAgICAgICAgIHNwcmludGYoc3RtcCwiX2ZfdG1wJWkiLGFsbG9jYXRlVGVtcCgpKTsKKyAgICAgICAgICAgICAgICBnc2xfZmxvYXRfZGVjbF9nbG9iYWwoc3RtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChleHByLT51bm9kZS5vcHIub3BbMF0tPnR5cGUgPT0gQ09OU1RfUFRSX05PREUpIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHN0bXAsIl9wX3RtcCVpIixhbGxvY2F0ZVRlbXAoKSk7CisgICAgICAgICAgICAgICAgZ3NsX3B0cl9kZWNsX2dsb2JhbChzdG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCB0eXBlID0gZ3NsX3R5cGVfb2ZfdmFyKGV4cHItPnVub2RlLm9wci5vcFswXS0+dm5hbWVzcGFjZSwgZXhwci0+dW5vZGUub3ByLm9wWzBdLT5zdHIpOworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IElOU1RSX0ZMT0FUKSB7CisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RtcCwiX2ZfdG1wXyVpIixhbGxvY2F0ZVRlbXAoKSk7CisgICAgICAgICAgICAgICAgICAgIGdzbF9mbG9hdF9kZWNsX2dsb2JhbChzdG1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBJTlNUUl9QVFIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdG1wLCJfcF90bXBfJWkiLGFsbG9jYXRlVGVtcCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZ3NsX3B0cl9kZWNsX2dsb2JhbChzdG1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBJTlNUUl9JTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdG1wLCJfaV90bXBfJWkiLGFsbG9jYXRlVGVtcCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZ3NsX2ludF9kZWNsX2dsb2JhbChzdG1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyNpZiAwCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IExpbmUgJWQsIENvdWxkIG5vdCBmaW5kIHZhcmlhYmxlICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwci0+bGluZV9udW1iZXIsIGV4cHItPnVub2RlLm9wci5vcFswXS0+c3RyKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsgLyogdHlwZSBpcyBhIHN0cnVjdF9pZCAqLworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0bXAsIl9zX3RtcF8laSIsYWxsb2NhdGVUZW1wKCkpOworICAgICAgICAgICAgICAgICAgICBnc2xfc3RydWN0X2RlY2xfZ2xvYmFsX2Zyb21faWQoc3RtcCx0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bXAgPSBuZXdfdmFyKHN0bXAsZXhwci0+bGluZV9udW1iZXIpOworCisgICAgICAgICAgICAvKiBzZXQgdGhlIHRtcCB0byB0aGUgdmFsdWUgb2YgIm9wMSIgKi8KKyAgICAgICAgICAgIHRtcGNweSA9IG5vZGVDbG9uZSh0bXApOworICAgICAgICAgICAgY29tbWl0X25vZGUobmV3X3NldCh0bXAsZXhwci0+dW5vZGUub3ByLm9wWzBdKSwwKTsKKyAgICAgICAgICAgIHRvQWRkID0gMTsKKworICAgICAgICAgICAgdG1wID0gdG1wY3B5OworICAgICAgICB9CisKKyAgICAgICAgLyogYWRkIG9wMiB0byB0bXAgKi8KKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIGlmIChleHByLT51bm9kZS5vcHIubmJPcCA9PSAyKQorICAgICAgICAgIHByaW50ZigiJXMgJXMgJXNcbiIsIHR5cGUsIHRtcC0+c3RyLCBleHByLT51bm9kZS5vcHIub3BbdG9BZGRdLT5zdHIpOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmKCIlcyAlc1xuIiwgdHlwZSwgdG1wLT5zdHIpOworI2VuZGlmCisgICAgICAgIGN1cnJlbnRHb29tU0wtPmluc3RyID0gZ3NsX2luc3RyX2luaXQoY3VycmVudEdvb21TTCwgdHlwZSwgaW5zdHJfaWQsIGV4cHItPnVub2RlLm9wci5uYk9wLCBleHByLT5saW5lX251bWJlcik7CisgICAgICAgIHRtcGNweSA9IG5vZGVDbG9uZSh0bXApOworICAgICAgICBjb21taXRfbm9kZSh0bXAsMCk7CisgICAgICAgIGlmIChleHByLT51bm9kZS5vcHIubmJPcCA9PSAyKSB7CisgICAgICAgICAgY29tbWl0X25vZGUoZXhwci0+dW5vZGUub3ByLm9wW3RvQWRkXSwxKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAvKiByZWRlZmluZSB0aGUgQUREIG5vZGUgbm93IGFzIHRoZSBjb21wdXRlZCB2YXJpYWJsZSAqLworICAgICAgICBub2RlRnJlZUludGVybmFscyhleHByKTsKKyAgICAgICAgKmV4cHIgPSAqdG1wY3B5OworICAgICAgICBmcmVlKHRtcGNweSk7CisgICAgfSAvKiB9fX0gKi8KKworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X2V4cHIxKGNvbnN0IGNoYXIgKm5hbWUsIGludCBpZCwgTm9kZVR5cGUgKmV4cHIxKQorICAgIHsgLyoge3t7ICovCisgICAgICAgIE5vZGVUeXBlICphZGQgPSBuZXdfb3AobmFtZSwgaWQsIDEpOworICAgICAgICBhZGQtPnVub2RlLm9wci5vcFswXSA9IGV4cHIxOworICAgICAgICByZXR1cm4gYWRkOworICAgIH0gLyogfX19ICovCisKKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5ld19leHByMihjb25zdCBjaGFyICpuYW1lLCBpbnQgaWQsIE5vZGVUeXBlICpleHByMSwgTm9kZVR5cGUgKmV4cHIyKQorICAgIHsgLyoge3t7ICovCisgICAgICAgIE5vZGVUeXBlICphZGQgPSBuZXdfb3AobmFtZSwgaWQsIDIpOworICAgICAgICBhZGQtPnVub2RlLm9wci5vcFswXSA9IGV4cHIxOworICAgICAgICBhZGQtPnVub2RlLm9wci5vcFsxXSA9IGV4cHIyOworICAgICAgICByZXR1cm4gYWRkOworICAgIH0gLyogfX19ICovCisKKyAgICAvKiBBREQgKi8KKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5ld19hZGQoTm9kZVR5cGUgKmV4cHIxLCBOb2RlVHlwZSAqZXhwcjIpIHsgLyoge3t7ICovCisgICAgICAgIHJldHVybiBuZXdfZXhwcjIoImFkZCIsIE9QUl9BREQsIGV4cHIxLCBleHByMik7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIHByZWNvbW1pdF9hZGQoTm9kZVR5cGUgKmFkZCkgeworICAgICAgICBwcmVjb21taXRfZXhwcihhZGQsImFkZCIsSU5TVFJfQUREKTsKKyAgICB9IC8qIH19fSAqLworCisgICAgLyogU1VCICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfc3ViKE5vZGVUeXBlICpleHByMSwgTm9kZVR5cGUgKmV4cHIyKSB7IC8qIHt7eyAqLworICAgICAgICByZXR1cm4gbmV3X2V4cHIyKCJzdWIiLCBPUFJfU1VCLCBleHByMSwgZXhwcjIpOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBwcmVjb21taXRfc3ViKE5vZGVUeXBlICpzdWIpIHsKKyAgICAgICAgcHJlY29tbWl0X2V4cHIoc3ViLCJzdWIiLElOU1RSX1NVQik7CisgICAgfSAvKiB9fX0gKi8KKworICAgIC8qIE5FRyAqLworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X25lZyhOb2RlVHlwZSAqZXhwcikgeyAvKiB7e3sgKi8KKyAgICAgICAgTm9kZVR5cGUgKnplcm9Db25zdCA9IE5VTEw7CisgICAgICAgIGlmIChleHByLT50eXBlID09IENPTlNUX0lOVF9OT0RFKQorICAgICAgICAgIHplcm9Db25zdCA9IG5ld19jb25zdEludCgiMCIsIGN1cnJlbnRHb29tU0wtPm51bV9saW5lcyk7CisgICAgICAgIGVsc2UgaWYgKGV4cHItPnR5cGUgPT0gQ09OU1RfRkxPQVRfTk9ERSkKKyAgICAgICAgICB6ZXJvQ29uc3QgPSBuZXdfY29uc3RGbG9hdCgiMC4wIiwgY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKTsKKyAgICAgICAgZWxzZSBpZiAoZXhwci0+dHlwZSA9PSBDT05TVF9QVFJfTk9ERSkgeworICAgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworI2lmIDAKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBMaW5lICVkLCBDb3VsZCBub3QgbmVnYXRlIGNvbnN0IHBvaW50ZXIuXG4iLAorICAgICAgICAgICAgY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKTsKKyAgICAgICAgICBleGl0KDEpOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgdHlwZSA9IGdzbF90eXBlX29mX3ZhcihleHByLT52bmFtZXNwYWNlLCBleHByLT5zdHIpOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gSU5TVFJfRkxPQVQpCisgICAgICAgICAgICAgIHplcm9Db25zdCA9IG5ld19jb25zdEZsb2F0KCIwLjAiLCBjdXJyZW50R29vbVNMLT5udW1fbGluZXMpOworICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBJTlNUUl9QVFIpIHsKKyAgICAgICAgICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisjaWYgMAorICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBMaW5lICVkLCBDb3VsZCBub3QgbmVnYXRlIHBvaW50ZXIuXG4iLAorICAgICAgICAgICAgICAgIGN1cnJlbnRHb29tU0wtPm51bV9saW5lcyk7CisgICAgICAgICAgICAgIGV4aXQoMSk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gSU5TVFJfSU5UKQorICAgICAgICAgICAgICB6ZXJvQ29uc3QgPSBuZXdfY29uc3RJbnQoIjAiLCBjdXJyZW50R29vbVNMLT5udW1fbGluZXMpOworICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAtMSkgeworICAgICAgICAgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworI2lmIDAKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBMaW5lICVkLCBDb3VsZCBub3QgZmluZCB2YXJpYWJsZSAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwci0+bGluZV9udW1iZXIsIGV4cHItPnVub2RlLm9wci5vcFswXS0+c3RyKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsgLyogdHlwZSBpcyBhIHN0cnVjdF9pZCAqLworICAgICAgICAgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworI2lmIDAKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBMaW5lICVkLCBDb3VsZCBub3QgbmVnYXRlIHN0cnVjdCAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwci0+bGluZV9udW1iZXIsIGV4cHItPnN0cik7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXdfZXhwcjIoInN1YiIsIE9QUl9TVUIsIHplcm9Db25zdCwgZXhwcik7CisgICAgfQorICAgIC8qIH19fSAqLworCisgICAgLyogTVVMICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfbXVsKE5vZGVUeXBlICpleHByMSwgTm9kZVR5cGUgKmV4cHIyKSB7IC8qIHt7eyAqLworICAgICAgICByZXR1cm4gbmV3X2V4cHIyKCJtdWwiLCBPUFJfTVVMLCBleHByMSwgZXhwcjIpOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBwcmVjb21taXRfbXVsKE5vZGVUeXBlICptdWwpIHsKKyAgICAgICAgcHJlY29tbWl0X2V4cHIobXVsLCJtdWwiLElOU1RSX01VTCk7CisgICAgfSAvKiB9fX0gKi8KKyAgICAKKyAgICAvKiBESVYgKi8KKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5ld19kaXYoTm9kZVR5cGUgKmV4cHIxLCBOb2RlVHlwZSAqZXhwcjIpIHsgLyoge3t7ICovCisgICAgICAgIHJldHVybiBuZXdfZXhwcjIoImRpdiIsIE9QUl9ESVYsIGV4cHIxLCBleHByMik7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIHByZWNvbW1pdF9kaXYoTm9kZVR5cGUgKm11bCkgeworICAgICAgICBwcmVjb21taXRfZXhwcihtdWwsImRpdiIsSU5TVFJfRElWKTsKKyAgICB9IC8qIH19fSAqLworCisgICAgLyogQ0FMTCBFWFBSRVNTSU9OICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfY2FsbF9leHByKGNvbnN0IGNoYXIgKm5hbWUsIE5vZGVUeXBlICphZmZlY3RfbGlzdCkgeyAvKiB7e3sgKi8KKyAgICAgICAgTm9kZVR5cGUgKmNhbGwgPSBuZXdfY2FsbChuYW1lLGFmZmVjdF9saXN0KTsKKyAgICAgICAgTm9kZVR5cGUgKm5vZGUgPSBuZXdfZXhwcjEobmFtZSwgT1BSX0NBTExfRVhQUiwgY2FsbCk7CisgICAgICAgIG5vZGUtPnZuYW1lc3BhY2UgPSBnc2xfZmluZF9uYW1lc3BhY2UobmFtZSk7CisgICAgICAgIGlmIChub2RlLT52bmFtZXNwYWNlID09IE5VTEwpCisgICAgICAgICAgLyogZnByaW50ZihzdGRlcnIsICJFUlJPUjogTGluZSAlZCwgTm8gcmV0dXJuIHR5cGUgZm9yOiAnJXMnXG4iLCBjdXJyZW50R29vbVNMLT5udW1fbGluZXMsIG5hbWUpOyAqLworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisgICAgc3RhdGljIHZvaWQgcHJlY29tbWl0X2NhbGxfZXhwcihOb2RlVHlwZSAqY2FsbCkgeworICAgICAgICBjaGFyIHN0bXBbMjU2XTsKKyAgICAgICAgTm9kZVR5cGUgKnRtcCwqdG1wY3B5OworICAgICAgICBpbnQgdHlwZSA9IGdzbF90eXBlX29mX3ZhcihjYWxsLT52bmFtZXNwYWNlLCBjYWxsLT5zdHIpOworICAgICAgICBpZiAodHlwZSA9PSBJTlNUUl9GTE9BVCkgeworICAgICAgICAgIHNwcmludGYoc3RtcCwiX2ZfdG1wXyVpIixhbGxvY2F0ZVRlbXAoKSk7CisgICAgICAgICAgZ3NsX2Zsb2F0X2RlY2xfZ2xvYmFsKHN0bXApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gSU5TVFJfUFRSKSB7CisgICAgICAgICAgc3ByaW50ZihzdG1wLCJfcF90bXBfJWkiLGFsbG9jYXRlVGVtcCgpKTsKKyAgICAgICAgICBnc2xfcHRyX2RlY2xfZ2xvYmFsKHN0bXApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gSU5TVFJfSU5UKSB7CisgICAgICAgICAgc3ByaW50ZihzdG1wLCJfaV90bXBfJWkiLGFsbG9jYXRlVGVtcCgpKTsKKyAgICAgICAgICBnc2xfaW50X2RlY2xfZ2xvYmFsKHN0bXApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gLTEpIHsKKyAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyNpZiAwCisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogTGluZSAlZCwgQ291bGQgbm90IGZpbmQgdmFyaWFibGUgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgIGNhbGwtPmxpbmVfbnVtYmVyLCBjYWxsLT5zdHIpOworICAgICAgICAgIGV4aXQoMSk7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLyogdHlwZSBpcyBhIHN0cnVjdF9pZCAqLworICAgICAgICAgIHNwcmludGYoc3RtcCwiX3NfdG1wXyVpIixhbGxvY2F0ZVRlbXAoKSk7CisgICAgICAgICAgZ3NsX3N0cnVjdF9kZWNsX2dsb2JhbF9mcm9tX2lkKHN0bXAsdHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgdG1wID0gbmV3X3ZhcihzdG1wLGNhbGwtPmxpbmVfbnVtYmVyKTsKKyAgICAgICAgY29tbWl0X25vZGUoY2FsbC0+dW5vZGUub3ByLm9wWzBdLDApOworICAgICAgICB0bXBjcHkgPSBub2RlQ2xvbmUodG1wKTsKKyAgICAgICAgY29tbWl0X25vZGUobmV3X3NldCh0bXAsbmV3X3ZhcihjYWxsLT5zdHIsY2FsbC0+bGluZV9udW1iZXIpKSwwKTsKKyAgICAgICAgCisgICAgICAgIG5vZGVGcmVlSW50ZXJuYWxzKGNhbGwpOworICAgICAgICAqY2FsbCA9ICp0bXBjcHk7CisgICAgICAgIGZyZWUodG1wY3B5KTsKKyAgICB9IC8qIH19fSAqLworCisgICAgc3RhdGljIHZvaWQgY29tbWl0X3Rlc3QyKE5vZGVUeXBlICpzZXQsY29uc3QgY2hhciAqdHlwZSwgaW50IGluc3RyKQorICAgIHsgLyoge3t7ICovCisgICAgICAgIE5vZGVUeXBlICp0bXA7CisgICAgICAgIGNoYXIgc3RtcFsyNTZdOworICAgICAgICBwcmVjb21taXRfbm9kZShzZXQtPnVub2RlLm9wci5vcFswXSk7CisgICAgICAgIHByZWNvbW1pdF9ub2RlKHNldC0+dW5vZGUub3ByLm9wWzFdKTsKKyAgICAgICAgdG1wID0gc2V0LT51bm9kZS5vcHIub3BbMF07CisgICAgICAgIAorICAgICAgICBzdG1wWzBdID0gMDsKKyAgICAgICAgaWYgKHNldC0+dW5vZGUub3ByLm9wWzBdLT50eXBlID09IENPTlNUX0lOVF9OT0RFKSB7CisgICAgICAgICAgICBzcHJpbnRmKHN0bXAsIl9pX3RtcF8laSIsYWxsb2NhdGVUZW1wKCkpOworICAgICAgICAgICAgZ3NsX2ludF9kZWNsX2dsb2JhbChzdG1wKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzZXQtPnVub2RlLm9wci5vcFswXS0+dHlwZSA9PSBDT05TVF9GTE9BVF9OT0RFKSB7CisgICAgICAgICAgICBzcHJpbnRmKHN0bXAsIl9mX3RtcCVpIixhbGxvY2F0ZVRlbXAoKSk7CisgICAgICAgICAgICBnc2xfZmxvYXRfZGVjbF9nbG9iYWwoc3RtcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc2V0LT51bm9kZS5vcHIub3BbMF0tPnR5cGUgPT0gQ09OU1RfUFRSX05PREUpIHsKKyAgICAgICAgICAgIHNwcmludGYoc3RtcCwiX3BfdG1wJWkiLGFsbG9jYXRlVGVtcCgpKTsKKyAgICAgICAgICAgIGdzbF9wdHJfZGVjbF9nbG9iYWwoc3RtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0bXBbMF0pIHsKKyAgICAgICAgICAgIE5vZGVUeXBlICp0bXBjcHk7CisgICAgICAgICAgICB0bXAgPSBuZXdfdmFyKHN0bXAsIHNldC0+bGluZV9udW1iZXIpOworICAgICAgICAgICAgdG1wY3B5ID0gbm9kZUNsb25lKHRtcCk7CisgICAgICAgICAgICBjb21taXRfbm9kZShuZXdfc2V0KHRtcCxzZXQtPnVub2RlLm9wci5vcFswXSksMCk7CisgICAgICAgICAgICB0bXAgPSB0bXBjcHk7CisgICAgICAgIH0KKworI2lmZGVmIFZFUkJPU0UKKyAgICAgICAgcHJpbnRmKCIlcyAlcyAlc1xuIiwgdHlwZSwgdG1wLT5zdHIsIHNldC0+dW5vZGUub3ByLm9wWzFdLT5zdHIpOworI2VuZGlmCisgICAgICAgIGN1cnJlbnRHb29tU0wtPmluc3RyID0gZ3NsX2luc3RyX2luaXQoY3VycmVudEdvb21TTCwgdHlwZSwgaW5zdHIsIDIsIHNldC0+bGluZV9udW1iZXIpOworICAgICAgICBjb21taXRfbm9kZSh0bXAsaW5zdHIhPUlOU1RSX1NFVCk7CisgICAgICAgIGNvbW1pdF9ub2RlKHNldC0+dW5vZGUub3ByLm9wWzFdLDEpOworICAgIH0gLyogfX19ICovCisgICAgCisgICAgLyogTk9UICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfbm90KE5vZGVUeXBlICpleHByMSkgeyAvKiB7e3sgKi8KKyAgICAgICAgcmV0dXJuIG5ld19leHByMSgibm90IiwgT1BSX05PVCwgZXhwcjEpOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBjb21taXRfbm90KE5vZGVUeXBlICpzZXQpCisgICAgeworICAgICAgICBjb21taXRfbm9kZShzZXQtPnVub2RlLm9wci5vcFswXSwwKTsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIHByaW50Zigibm90XG4iKTsKKyNlbmRpZgorICAgICAgICBjdXJyZW50R29vbVNMLT5pbnN0ciA9IGdzbF9pbnN0cl9pbml0KGN1cnJlbnRHb29tU0wsICJub3QiLCBJTlNUUl9OT1QsIDEsIHNldC0+bGluZV9udW1iZXIpOworICAgICAgICBnc2xfaW5zdHJfYWRkX3BhcmFtKGN1cnJlbnRHb29tU0wtPmluc3RyLCAifGR1bW15fCIsIFRZUEVfTEFCRUwpOworICAgIH0gLyogfX19ICovCisgICAgCisgICAgLyogRVFVICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfZXF1KE5vZGVUeXBlICpleHByMSwgTm9kZVR5cGUgKmV4cHIyKSB7IC8qIHt7eyAqLworICAgICAgICByZXR1cm4gbmV3X2V4cHIyKCJpc2VxdWFsIiwgT1BSX0VRVSwgZXhwcjEsIGV4cHIyKTsKKyAgICB9CisgICAgc3RhdGljIHZvaWQgY29tbWl0X2VxdShOb2RlVHlwZSAqbXVsKSB7CisgICAgICAgIGNvbW1pdF90ZXN0MihtdWwsImlzZXF1YWwiLElOU1RSX0lTRVFVQUwpOworICAgIH0gLyogfX19ICovCisgICAgCisgICAgLyogSU5GICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfbG93KE5vZGVUeXBlICpleHByMSwgTm9kZVR5cGUgKmV4cHIyKSB7IC8qIHt7eyAqLworICAgICAgICByZXR1cm4gbmV3X2V4cHIyKCJpc2xvd2VyIiwgT1BSX0xPVywgZXhwcjEsIGV4cHIyKTsKKyAgICB9CisgICAgc3RhdGljIHZvaWQgY29tbWl0X2xvdyhOb2RlVHlwZSAqbXVsKSB7CisgICAgICAgIGNvbW1pdF90ZXN0MihtdWwsImlzbG93ZXIiLElOU1RSX0lTTE9XRVIpOworICAgIH0gLyogfX19ICovCisKKyAgICAvKiBXSElMRSAqLworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X3doaWxlKE5vZGVUeXBlICpleHByZXNzaW9uLCBOb2RlVHlwZSAqaW5zdHIpIHsgLyoge3t7ICovCisgICAgICAgIE5vZGVUeXBlICpub2RlID0gbmV3X29wKCJ3aGlsZSIsIE9QUl9XSElMRSwgMik7CisgICAgICAgIG5vZGUtPnVub2RlLm9wci5vcFswXSA9IGV4cHJlc3Npb247CisgICAgICAgIG5vZGUtPnVub2RlLm9wci5vcFsxXSA9IGluc3RyOworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBjb21taXRfd2hpbGUoTm9kZVR5cGUgKm5vZGUpCisgICAgeworICAgICAgICBpbnQgbGJsID0gYWxsb2NhdGVMYWJlbCgpOworICAgICAgICBjaGFyIHN0YXJ0X3doaWxlWzEwMjRdLCB0ZXN0X3doaWxlWzEwMjRdOworICAgICAgICBzcHJpbnRmKHN0YXJ0X3doaWxlLCAifHN0YXJ0X3doaWxlXyVkfCIsIGxibCk7CisgICAgICAgIHNwcmludGYodGVzdF93aGlsZSwgInx0ZXN0X3doaWxlXyVkfCIsIGxibCk7CisgICAgICAgCisgICAgICAgIEdTTF9QVVRfSlVNUCh0ZXN0X3doaWxlLG5vZGUtPmxpbmVfbnVtYmVyKTsKKyAgICAgICAgR1NMX1BVVF9MQUJFTChzdGFydF93aGlsZSxub2RlLT5saW5lX251bWJlcik7CisKKyAgICAgICAgLyogY29kZSAqLworICAgICAgICBjb21taXRfbm9kZShub2RlLT51bm9kZS5vcHIub3BbMV0sMCk7CisKKyAgICAgICAgR1NMX1BVVF9MQUJFTCh0ZXN0X3doaWxlLG5vZGUtPmxpbmVfbnVtYmVyKTsKKyAgICAgICAgY29tbWl0X25vZGUobm9kZS0+dW5vZGUub3ByLm9wWzBdLDApOworICAgICAgICBHU0xfUFVUX0pOWkVSTyhzdGFydF93aGlsZSxub2RlLT5saW5lX251bWJlcik7CisgICAgfSAvKiB9fX0gKi8KKworICAgIC8qIEZPUiBFQUNIICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfc3RhdGljX2ZvcmVhY2goTm9kZVR5cGUgKnZhciwgTm9kZVR5cGUgKnZhcl9saXN0LCBOb2RlVHlwZSAqaW5zdHIpIHsgLyoge3t7ICovCisgICAgICAgIE5vZGVUeXBlICpub2RlID0gbmV3X29wKCJmb3IiLCBPUFJfRk9SRUFDSCwgMyk7CisgICAgICAgIG5vZGUtPnVub2RlLm9wci5vcFswXSA9IHZhcjsKKyAgICAgICAgbm9kZS0+dW5vZGUub3ByLm9wWzFdID0gdmFyX2xpc3Q7CisgICAgICAgIG5vZGUtPnVub2RlLm9wci5vcFsyXSA9IGluc3RyOworICAgICAgICBub2RlLT5saW5lX251bWJlciA9IGN1cnJlbnRHb29tU0wtPm51bV9saW5lczsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIGNvbW1pdF9mb3JlYWNoKE5vZGVUeXBlICpub2RlKQorICAgIHsKKyAgICAgICAgTm9kZVR5cGUgKmN1ciA9IG5vZGUtPnVub2RlLm9wci5vcFsxXTsKKyAgICAgICAgY2hhciB0bXBfZnVuY1syNTZdLCB0bXBfbG9vcFsyNTZdOworICAgICAgICBpbnQgbGJsID0gYWxsb2NhdGVMYWJlbCgpOworICAgICAgICBzcHJpbnRmKHRtcF9mdW5jLCAifGZvcmVhY2hfZnVuY18lZHwiLCBsYmwpOworICAgICAgICBzcHJpbnRmKHRtcF9sb29wLCAifGZvcmVhY2hfbG9vcF8lZHwiLCBsYmwpOworCisgICAgICAgIEdTTF9QVVRfSlVNUCh0bXBfbG9vcCwgbm9kZS0+bGluZV9udW1iZXIpOworICAgICAgICBHU0xfUFVUX0xBQkVMKHRtcF9mdW5jLCBub2RlLT5saW5lX251bWJlcik7CisKKyAgICAgICAgcHJlY29tbWl0X25vZGUobm9kZS0+dW5vZGUub3ByLm9wWzJdKTsKKyAgICAgICAgY29tbWl0X25vZGUobm9kZS0+dW5vZGUub3ByLm9wWzJdLCAwKTsKKworICAgICAgICBjdXJyZW50R29vbVNMLT5pbnN0ciA9IGdzbF9pbnN0cl9pbml0KGN1cnJlbnRHb29tU0wsICJyZXQiLCBJTlNUUl9SRVQsIDEsIG5vZGUtPmxpbmVfbnVtYmVyKTsKKyAgICAgICAgZ3NsX2luc3RyX2FkZF9wYXJhbShjdXJyZW50R29vbVNMLT5pbnN0ciwgInxkdW1teXwiLCBUWVBFX0xBQkVMKTsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIHByaW50ZigicmV0XG4iKTsKKyNlbmRpZgorICAgICAgICAKKyAgICAgICAgR1NMX1BVVF9MQUJFTCh0bXBfbG9vcCwgbm9kZS0+bGluZV9udW1iZXIpOworICAgICAgICAKKyAgICAgICAgd2hpbGUgKGN1ciAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgTm9kZVR5cGUgKngsICp2YXI7CisKKyAgICAgICAgICAvKiAxOiB4PXZhciAqLworICAgICAgICAgIHggICA9IG5vZGVDbG9uZShub2RlLT51bm9kZS5vcHIub3BbMF0pOworICAgICAgICAgIHZhciA9IG5vZGVDbG9uZShjdXItPnVub2RlLm9wci5vcFswXSk7CisgICAgICAgICAgY29tbWl0X25vZGUobmV3X3NldCh4LCB2YXIpLDApOworICAgICAgICAgIAorICAgICAgICAgIC8qIDI6IGluc3RyICovCisgICAgICAgICAgY3VycmVudEdvb21TTC0+aW5zdHIgPSBnc2xfaW5zdHJfaW5pdChjdXJyZW50R29vbVNMLCAiY2FsbCIsIElOU1RSX0NBTEwsIDEsIG5vZGUtPmxpbmVfbnVtYmVyKTsKKyAgICAgICAgICBnc2xfaW5zdHJfYWRkX3BhcmFtKGN1cnJlbnRHb29tU0wtPmluc3RyLCB0bXBfZnVuYywgVFlQRV9MQUJFTCk7CisjaWZkZWYgVkVSQk9TRQorICAgICAgICAgIHByaW50ZigiY2FsbCAlc1xuIiwgdG1wX2Z1bmMpOworI2VuZGlmCisgICAgICAgICAgCisgICAgICAgICAgLyogMzogdmFyPXggKi8KKyAgICAgICAgICB4ICAgPSBub2RlQ2xvbmUobm9kZS0+dW5vZGUub3ByLm9wWzBdKTsKKyAgICAgICAgICB2YXIgPSBjdXItPnVub2RlLm9wci5vcFswXTsKKyAgICAgICAgICBjb21taXRfbm9kZShuZXdfc2V0KHZhciwgeCksMCk7CisgICAgICAgICAgY3VyID0gY3VyLT51bm9kZS5vcHIub3BbMV07CisgICAgICAgIH0KKyAgICAgICAgbm9kZUZyZWUobm9kZS0+dW5vZGUub3ByLm9wWzBdKTsKKyAgICB9IC8qIH19fSAqLworCisgICAgLyogSUYgKi8KKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5ld19pZihOb2RlVHlwZSAqZXhwcmVzc2lvbiwgTm9kZVR5cGUgKmluc3RyKSB7IC8qIHt7eyAqLworICAgICAgICBOb2RlVHlwZSAqbm9kZSA9IG5ld19vcCgiaWYiLCBPUFJfSUYsIDIpOworICAgICAgICBub2RlLT51bm9kZS5vcHIub3BbMF0gPSBleHByZXNzaW9uOworICAgICAgICBub2RlLT51bm9kZS5vcHIub3BbMV0gPSBpbnN0cjsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIGNvbW1pdF9pZihOb2RlVHlwZSAqbm9kZSkgeworCisgICAgICAgIGNoYXIgc2xhYlsxMDI0XTsKKyAgICAgICAgc3ByaW50ZihzbGFiLCAifGVpZiVkfCIsIGFsbG9jYXRlTGFiZWwoKSk7CisgICAgICAgIGNvbW1pdF9ub2RlKG5vZGUtPnVub2RlLm9wci5vcFswXSwwKTsKKyAgICAgICAgR1NMX1BVVF9KWkVSTyhzbGFiLG5vZGUtPmxpbmVfbnVtYmVyKTsKKyAgICAgICAgLyogY29kZSAqLworICAgICAgICBjb21taXRfbm9kZShub2RlLT51bm9kZS5vcHIub3BbMV0sMCk7CisgICAgICAgIEdTTF9QVVRfTEFCRUwoc2xhYixub2RlLT5saW5lX251bWJlcik7CisgICAgfSAvKiB9fX0gKi8KKworICAgIC8qIEJMT0NLICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfYmxvY2soTm9kZVR5cGUgKmxhc3ROb2RlKSB7IC8qIHt7eyAqLworICAgICAgICBOb2RlVHlwZSAqYmxrID0gbmV3X29wKCJibG9jayIsIE9QUl9CTE9DSywgMik7CisgICAgICAgIGJsay0+dW5vZGUub3ByLm9wWzBdID0gbmV3X25vcCgic3RhcnRfb2ZfYmxvY2siKTsKKyAgICAgICAgYmxrLT51bm9kZS5vcHIub3BbMV0gPSBsYXN0Tm9kZTsgICAgICAgIAorICAgICAgICByZXR1cm4gYmxrOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBjb21taXRfYmxvY2soTm9kZVR5cGUgKm5vZGUpIHsKKyAgICAgICAgY29tbWl0X25vZGUobm9kZS0+dW5vZGUub3ByLm9wWzBdLT51bm9kZS5vcHIubmV4dCwwKTsKKyAgICB9IC8qIH19fSAqLworCisgICAgLyogRlVOQ1RJT04gSU5UUk8gKi8KKyAgICBzdGF0aWMgTm9kZVR5cGUgKm5ld19mdW5jdGlvbl9pbnRybyhjb25zdCBjaGFyICpuYW1lKSB7IC8qIHt7eyAqLworICAgICAgICBjaGFyIHN0bXBbMjU2XTsKKyAgICAgICAgaWYgKHN0cmxlbihuYW1lKSA8IDIwMCkgeworICAgICAgICAgICBzcHJpbnRmKHN0bXAsICJ8X19mdW5jXyVzfCIsIG5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXdfb3Aoc3RtcCwgT1BSX0ZVTkNfSU5UUk8sIDApOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBjb21taXRfZnVuY3Rpb25faW50cm8oTm9kZVR5cGUgKm5vZGUpIHsKKyAgICAgICAgY3VycmVudEdvb21TTC0+aW5zdHIgPSBnc2xfaW5zdHJfaW5pdChjdXJyZW50R29vbVNMLCAibGFiZWwiLCBJTlNUUl9MQUJFTCwgMSwgbm9kZS0+bGluZV9udW1iZXIpOworICAgICAgICBnc2xfaW5zdHJfYWRkX3BhcmFtKGN1cnJlbnRHb29tU0wtPmluc3RyLCBub2RlLT5zdHIsIFRZUEVfTEFCRUwpOworI2lmZGVmIFZFUkJPU0UKKyAgICAgICAgcHJpbnRmKCJsYWJlbCAlc1xuIiwgbm9kZS0+c3RyKTsKKyNlbmRpZgorICAgIH0gLyogfX19ICovCisKKyAgICAvKiBGVU5DVElPTiBPVVRSTyAqLworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X2Z1bmN0aW9uX291dHJvKCkgeyAvKiB7e3sgKi8KKyAgICAgICAgcmV0dXJuIG5ld19vcCgicmV0IiwgT1BSX0ZVTkNfT1VUUk8sIDApOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBjb21taXRfZnVuY3Rpb25fb3V0cm8oTm9kZVR5cGUgKm5vZGUpIHsKKyAgICAgICAgY3VycmVudEdvb21TTC0+aW5zdHIgPSBnc2xfaW5zdHJfaW5pdChjdXJyZW50R29vbVNMLCAicmV0IiwgSU5TVFJfUkVULCAxLCBub2RlLT5saW5lX251bWJlcik7CisgICAgICAgIGdzbF9pbnN0cl9hZGRfcGFyYW0oY3VycmVudEdvb21TTC0+aW5zdHIsICJ8ZHVtbXl8IiwgVFlQRV9MQUJFTCk7CisgICAgICAgIHJlbGVhc2VBbGxUZW1wcygpOworI2lmZGVmIFZFUkJPU0UKKyAgICAgICAgcHJpbnRmKCJyZXRcbiIpOworI2VuZGlmCisgICAgfSAvKiB9fX0gKi8KKyAgICAKKyAgICAvKiBBRkZFQ1RBVElPTiBMSVNUICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfYWZmZWNfbGlzdChOb2RlVHlwZSAqc2V0LCBOb2RlVHlwZSAqbmV4dCkgLyoge3t7ICovCisgICAgeworICAgICAgTm9kZVR5cGUgKm5vZGUgPSBuZXdfb3AoImFmZmVjdF9saXN0IiwgT1BSX0FGRkVDVF9MSVNULCAyKTsKKyAgICAgIG5vZGUtPnVub2RlLm9wci5vcFswXSA9IHNldDsKKyAgICAgIG5vZGUtPnVub2RlLm9wci5vcFsxXSA9IG5leHQ7CisgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfYWZmZWN0X2xpc3RfYWZ0ZXIoTm9kZVR5cGUgKmFmZmVjdF9saXN0KQorICAgIHsKKyAgICAgIE5vZGVUeXBlICpyZXQgID0gTlVMTDsKKyAgICAgIE5vZGVUeXBlICpjdXIgID0gIGFmZmVjdF9saXN0OworICAgICAgd2hpbGUoY3VyICE9IE5VTEwpIHsKKyAgICAgICAgTm9kZVR5cGUgKnNldCAgPSBjdXItPnVub2RlLm9wci5vcFswXTsKKyAgICAgICAgTm9kZVR5cGUgKm5leHQgPSBjdXItPnVub2RlLm9wci5vcFsxXTsKKyAgICAgICAgTm9kZVR5cGUgKmx2YWx1ZSAgICAgPSBzZXQtPnVub2RlLm9wci5vcFswXTsKKyAgICAgICAgTm9kZVR5cGUgKmV4cHJlc3Npb24gPSBzZXQtPnVub2RlLm9wci5vcFsxXTsKKyAgICAgICAgaWYgKChsdmFsdWUtPnN0clswXSA9PSAnJicpICYmIChleHByZXNzaW9uLT50eXBlID09IFZBUl9OT0RFKSkgeworICAgICAgICAgIE5vZGVUeXBlICpuc2V0ID0gbmV3X3NldChub2RlQ2xvbmUoZXhwcmVzc2lvbiksIG5vZGVDbG9uZShsdmFsdWUpKTsKKyAgICAgICAgICByZXQgID0gbmV3X2FmZmVjX2xpc3QobnNldCwgcmV0KTsKKyAgICAgICAgfQorICAgICAgICBjdXIgPSBuZXh0OworICAgICAgfQorICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgc3RhdGljIHZvaWQgY29tbWl0X2FmZmVjdF9saXN0KE5vZGVUeXBlICpub2RlKQorICAgIHsKKyAgICAgIE5vZGVUeXBlICpjdXIgPSBub2RlOworICAgICAgd2hpbGUoY3VyICE9IE5VTEwpIHsKKyAgICAgICAgTm9kZVR5cGUgKnNldCA9IGN1ci0+dW5vZGUub3ByLm9wWzBdOworICAgICAgICBwcmVjb21taXRfbm9kZShzZXQtPnVub2RlLm9wci5vcFswXSk7CisgICAgICAgIHByZWNvbW1pdF9ub2RlKHNldC0+dW5vZGUub3ByLm9wWzFdKTsKKyAgICAgICAgY3VyID0gY3VyLT51bm9kZS5vcHIub3BbMV07CisgICAgICB9CisgICAgICBjdXIgPSBub2RlOworICAgICAgd2hpbGUoY3VyICE9IE5VTEwpIHsKKyAgICAgICAgTm9kZVR5cGUgKnNldCA9IGN1ci0+dW5vZGUub3ByLm9wWzBdOworICAgICAgICBjb21taXRfbm9kZShzZXQsMCk7CisgICAgICAgIGN1ciA9IGN1ci0+dW5vZGUub3ByLm9wWzFdOworICAgICAgfQorICAgIH0gLyogfX19ICovCisKKyAgICAvKiBWQVIgTElTVCAqLworICAgIHN0YXRpYyBOb2RlVHlwZSAqbmV3X3Zhcl9saXN0KE5vZGVUeXBlICp2YXIsIE5vZGVUeXBlICpuZXh0KSAvKiB7e3sgKi8KKyAgICB7CisgICAgICBOb2RlVHlwZSAqbm9kZSA9IG5ld19vcCgidmFyX2xpc3QiLCBPUFJfVkFSX0xJU1QsIDIpOworICAgICAgbm9kZS0+dW5vZGUub3ByLm9wWzBdID0gdmFyOworICAgICAgbm9kZS0+dW5vZGUub3ByLm9wWzFdID0gbmV4dDsKKyAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBjb21taXRfdmFyX2xpc3QoTm9kZVR5cGUgKm5vZGUpCisgICAgeworICAgIH0gLyogfX19ICovCisKKyAgICAvKiBGVU5DVElPTiBDQUxMICovCisgICAgc3RhdGljIE5vZGVUeXBlICpuZXdfY2FsbChjb25zdCBjaGFyICpuYW1lLCBOb2RlVHlwZSAqYWZmZWN0X2xpc3QpIHsgLyoge3t7ICovCisgICAgICAgIEhhc2hWYWx1ZSAqZnZhbDsKKyAgICAgICAgZnZhbCA9IGdvb21faGFzaF9nZXQoY3VycmVudEdvb21TTC0+ZnVuY3Rpb25zLCBuYW1lKTsKKyAgICAgICAgaWYgKCFmdmFsKSB7CisgICAgICAgICAgICBnc2xfZGVjbGFyZV90YXNrKG5hbWUpOworICAgICAgICAgICAgZnZhbCA9IGdvb21faGFzaF9nZXQoY3VycmVudEdvb21TTC0+ZnVuY3Rpb25zLCBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZ2YWwpIHsKKyAgICAgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworI2lmIDAKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IExpbmUgJWQsIENvdWxkIG5vdCBmaW5kIGZ1bmN0aW9uICVzXG4iLCBjdXJyZW50R29vbVNMLT5udW1fbGluZXMsIG5hbWUpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBFeHRlcm5hbEZ1bmN0aW9uU3RydWN0ICpnZWYgPSAoRXh0ZXJuYWxGdW5jdGlvblN0cnVjdCopZnZhbC0+cHRyOworICAgICAgICAgICAgaWYgKGdlZi0+aXNfZXh0ZXJuKSB7CisgICAgICAgICAgICAgICAgTm9kZVR5cGUgKm5vZGUgPSAgbmV3X29wKG5hbWUsIE9QUl9FWFRfQ0FMTCwgMSk7CisgICAgICAgICAgICAgICAgbm9kZS0+dW5vZGUub3ByLm9wWzBdID0gYWZmZWN0X2xpc3Q7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBOb2RlVHlwZSAqbm9kZTsKKyAgICAgICAgICAgICAgICBjaGFyIHN0bXBbMjU2XTsKKyAgICAgICAgICAgICAgICBpZiAoc3RybGVuKG5hbWUpIDwgMjAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RtcCwgInxfX2Z1bmNfJXN8IiwgbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vZGUgPSBuZXdfb3Aoc3RtcCwgT1BSX0NBTEwsIDEpOworICAgICAgICAgICAgICAgIG5vZGUtPnVub2RlLm9wci5vcFswXSA9IGFmZmVjdF9saXN0OworICAgICAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHN0YXRpYyB2b2lkIGNvbW1pdF9leHRfY2FsbChOb2RlVHlwZSAqbm9kZSkgeworICAgICAgICBOb2RlVHlwZSAqYWxhZnRlciA9IG5ld19hZmZlY3RfbGlzdF9hZnRlcihub2RlLT51bm9kZS5vcHIub3BbMF0pOworICAgICAgICBjb21taXRfbm9kZShub2RlLT51bm9kZS5vcHIub3BbMF0sMCk7CisgICAgICAgIGN1cnJlbnRHb29tU0wtPmluc3RyID0gZ3NsX2luc3RyX2luaXQoY3VycmVudEdvb21TTCwgImV4dGNhbGwiLCBJTlNUUl9FWFRfQ0FMTCwgMSwgbm9kZS0+bGluZV9udW1iZXIpOworICAgICAgICBnc2xfaW5zdHJfYWRkX3BhcmFtKGN1cnJlbnRHb29tU0wtPmluc3RyLCBub2RlLT5zdHIsIFRZUEVfVkFSKTsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIHByaW50ZigiZXh0Y2FsbCAlc1xuIiwgbm9kZS0+c3RyKTsKKyNlbmRpZgorICAgICAgICBjb21taXRfbm9kZShhbGFmdGVyLDApOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBjb21taXRfY2FsbChOb2RlVHlwZSAqbm9kZSkgeworICAgICAgICBOb2RlVHlwZSAqYWxhZnRlciA9IG5ld19hZmZlY3RfbGlzdF9hZnRlcihub2RlLT51bm9kZS5vcHIub3BbMF0pOworICAgICAgICBjb21taXRfbm9kZShub2RlLT51bm9kZS5vcHIub3BbMF0sMCk7CisgICAgICAgIGN1cnJlbnRHb29tU0wtPmluc3RyID0gZ3NsX2luc3RyX2luaXQoY3VycmVudEdvb21TTCwgImNhbGwiLCBJTlNUUl9DQUxMLCAxLCBub2RlLT5saW5lX251bWJlcik7CisgICAgICAgIGdzbF9pbnN0cl9hZGRfcGFyYW0oY3VycmVudEdvb21TTC0+aW5zdHIsIG5vZGUtPnN0ciwgVFlQRV9MQUJFTCk7CisjaWZkZWYgVkVSQk9TRQorICAgICAgICBwcmludGYoImNhbGwgJXNcbiIsIG5vZGUtPnN0cik7CisjZW5kaWYKKyAgICAgICAgY29tbWl0X25vZGUoYWxhZnRlciwwKTsKKyAgICB9IC8qIH19fSAqLworCisgICAgLyoqICoqLworCisgICAgc3RhdGljIE5vZGVUeXBlICpyb290Tm9kZSA9IDA7IC8qIFRPRE86IHJlaW5pdGlhbGlzZXIgYSBjaGFxdWUgY29tcGlsYXRpb24uICovCisgICAgc3RhdGljIE5vZGVUeXBlICpsYXN0Tm9kZSA9IDA7CisgICAgc3RhdGljIE5vZGVUeXBlICpnc2xfYXBwZW5kKE5vZGVUeXBlICpjdXJOb2RlKSB7CisgICAgICAgIGlmIChjdXJOb2RlID09IDApIHJldHVybiAwOyAvKiB7e3sgKi8KKyAgICAgICAgaWYgKGxhc3ROb2RlKQorICAgICAgICAgICAgbGFzdE5vZGUtPnVub2RlLm9wci5uZXh0ID0gY3VyTm9kZTsKKyAgICAgICAgbGFzdE5vZGUgPSBjdXJOb2RlOworICAgICAgICB3aGlsZShsYXN0Tm9kZS0+dW5vZGUub3ByLm5leHQpIGxhc3ROb2RlID0gbGFzdE5vZGUtPnVub2RlLm9wci5uZXh0OworICAgICAgICBpZiAocm9vdE5vZGUgPT0gMCkKKyAgICAgICAgICAgIHJvb3ROb2RlID0gY3VyTm9kZTsKKyAgICAgICAgcmV0dXJuIGN1ck5vZGU7CisgICAgfSAvKiB9fX0gKi8KKworI2lmIDEKKyAgICBpbnQgYWxsb2NhdGVUZW1wKCkgeworICAgICAgcmV0dXJuIGFsbG9jYXRlTGFiZWwoKTsKKyAgICB9CisgICAgdm9pZCByZWxlYXNlQWxsVGVtcHMoKSB7fQorICAgIHZvaWQgcmVsZWFzZVRlbXAoaW50IG4pIHt9CisjZWxzZQorICAgIHN0YXRpYyBpbnQgbmJUZW1wID0gMDsKKyAgICBzdGF0aWMgaW50ICp0ZW1wQXJyYXkgPSAwOworICAgIHN0YXRpYyBpbnQgdGVtcEFycmF5U2l6ZSA9IDA7CisgICAgaW50IGFsbG9jYXRlVGVtcCgpIHsgLyogVE9ETzogYWxsb2NhdGVJVGVtcCwgYWxsb2NhdGVGVGVtcCAqLworICAgICAgICBpbnQgaSA9IDA7IC8qIHt7eyAqLworICAgICAgICBpZiAodGVtcEFycmF5ID09IDApIHsKKyAgICAgICAgICB0ZW1wQXJyYXlTaXplID0gMjU2OworICAgICAgICAgIHRlbXBBcnJheSA9IChpbnQqKW1hbGxvYyh0ZW1wQXJyYXlTaXplICogc2l6ZW9mKGludCkpOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgaW50IGo7CisgICAgICAgICAgZm9yIChqPTA7ajxuYlRlbXA7KytqKSB7CisgICAgICAgICAgICBpZiAodGVtcEFycmF5W2pdID09IGkpIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoaiA9PSBuYlRlbXApIHsKKyAgICAgICAgICAgIGlmIChuYlRlbXAgPT0gdGVtcEFycmF5U2l6ZSkgeworICAgICAgICAgICAgICB0ZW1wQXJyYXlTaXplICo9IDI7CisgICAgICAgICAgICAgIHRlbXBBcnJheSA9IChpbnQqKXJlYWxsb2ModGVtcEFycmF5LHRlbXBBcnJheVNpemUgKiBzaXplb2YoaW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ZW1wQXJyYXlbbmJUZW1wKytdID0gaTsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgIH0KKyAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9IC8qIH19fSAqLworICAgIHZvaWQgcmVsZWFzZUFsbFRlbXBzKCkgeworICAgICAgbmJUZW1wID0gMDsgLyoge3t7ICovCisgICAgfSAvKiB9fX0gKi8KKyAgICB2b2lkIHJlbGVhc2VUZW1wKGludCBuKSB7CisgICAgICBpbnQgajsgLyoge3t7ICovCisgICAgICBmb3IgKGo9MDtqPG5iVGVtcDsrK2opIHsKKyAgICAgICAgaWYgKHRlbXBBcnJheVtqXSA9PSBuKSB7CisgICAgICAgICAgdGVtcEFycmF5W2pdID0gdGVtcEFycmF5Wy0tbmJUZW1wXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gLyogfX19ICovCisjZW5kaWYKKworICAgIHN0YXRpYyBpbnQgbGFzdExhYmVsID0gMDsKKyAgICBpbnQgYWxsb2NhdGVMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuICsrbGFzdExhYmVsOyAvKiB7e3sgKi8KKyAgICB9IC8qIH19fSAqLworCisgICAgdm9pZCBnc2xfY29tbWl0X2NvbXBpbGF0aW9uKCkKKyAgICB7IC8qIHt7eyAqLworICAgICAgICBjb21taXRfbm9kZShyb290Tm9kZSwwKTsKKyAgICAgICAgcm9vdE5vZGUgPSAwOworICAgICAgICBsYXN0Tm9kZSA9IDA7CisgICAgfSAvKiB9fX0gKi8KKyAgICAKKyAgICB2b2lkIHByZWNvbW1pdF9ub2RlKE5vZGVUeXBlICpub2RlKQorICAgIHsgLyoge3t7ICovCisgICAgICAgIC8qIGRvIGhlcmUgc3R1ZmYgZm9yIGV4cHJlc3Npb24uLiBmb3IgZXhlbXBsZSAqLworICAgICAgICBpZiAobm9kZS0+dHlwZSA9PSBPUFJfTk9ERSkKKyAgICAgICAgICAgIHN3aXRjaChub2RlLT51bm9kZS5vcHIudHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgT1BSX0FERDogcHJlY29tbWl0X2FkZChub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUFJfU1VCOiBwcmVjb21taXRfc3ViKG5vZGUpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QUl9NVUw6IHByZWNvbW1pdF9tdWwobm9kZSk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BSX0RJVjogcHJlY29tbWl0X2Rpdihub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUFJfQ0FMTF9FWFBSOiBwcmVjb21taXRfY2FsbF9leHByKG5vZGUpOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICB9IC8qIH19fSAqLworICAgIAorICAgIHZvaWQgY29tbWl0X25vZGUoTm9kZVR5cGUgKm5vZGUsIGludCByZWxlYXNlSWZUbXApCisgICAgeyAvKiB7e3sgKi8KKyAgICAgICAgaWYgKG5vZGUgPT0gMCkgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgc3dpdGNoKG5vZGUtPnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgT1BSX05PREU6CisgICAgICAgICAgICAgICAgc3dpdGNoKG5vZGUtPnVub2RlLm9wci50eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BSX1NFVDogICAgICAgICAgIGNvbW1pdF9zZXQobm9kZSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9QUl9QTFVTX0VROiAgICAgICBjb21taXRfcGx1c19lcShub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BSX1NVQl9FUTogICAgICAgIGNvbW1pdF9zdWJfZXEobm9kZSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9QUl9NVUxfRVE6ICAgICAgICBjb21taXRfbXVsX2VxKG5vZGUpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUFJfRElWX0VROiAgICAgICAgY29tbWl0X2Rpdl9lcShub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BSX0lGOiAgICAgICAgICAgIGNvbW1pdF9pZihub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BSX1dISUxFOiAgICAgICAgIGNvbW1pdF93aGlsZShub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BSX0JMT0NLOiAgICAgICAgIGNvbW1pdF9ibG9jayhub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BSX0ZVTkNfSU5UUk86ICAgIGNvbW1pdF9mdW5jdGlvbl9pbnRybyhub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BSX0ZVTkNfT1VUUk86ICAgIGNvbW1pdF9mdW5jdGlvbl9vdXRybyhub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BSX0NBTEw6ICAgICAgICAgIGNvbW1pdF9jYWxsKG5vZGUpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUFJfRVhUX0NBTEw6ICAgICAgY29tbWl0X2V4dF9jYWxsKG5vZGUpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUFJfRVFVOiAgICAgICAgICAgY29tbWl0X2VxdShub2RlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BSX0xPVzogICAgICAgICAgIGNvbW1pdF9sb3cobm9kZSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9QUl9OT1Q6ICAgICAgICAgICBjb21taXRfbm90KG5vZGUpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUFJfQUZGRUNUX0xJU1Q6ICAgY29tbWl0X2FmZmVjdF9saXN0KG5vZGUpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUFJfRk9SRUFDSDogICAgICAgY29tbWl0X2ZvcmVhY2gobm9kZSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9QUl9WQVJfTElTVDogICAgICBjb21taXRfdmFyX2xpc3Qobm9kZSk7IGJyZWFrOworI2lmZGVmIFZFUkJPU0UKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFTVBUWV9OT0RFOiAgICAgICAgcHJpbnRmKCJOT1BcbiIpOyBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbW1pdF9ub2RlKG5vZGUtPnVub2RlLm9wci5uZXh0LDApOyAvKiByZWN1cnNpdmUgZm9yIHRoZSBtb21lbnQsIG1heWJlIGJldHRlciB0byBkbyBzb21ldGhpbmcgaXRlcmF0aXZlPyAqLworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFZBUl9OT0RFOiAgICAgICAgIGdzbF9pbnN0cl9zZXRfbmFtZXNwYWNlKGN1cnJlbnRHb29tU0wtPmluc3RyLCBub2RlLT52bmFtZXNwYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NsX2luc3RyX2FkZF9wYXJhbShjdXJyZW50R29vbVNMLT5pbnN0ciwgbm9kZS0+c3RyLCBUWVBFX1ZBUik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT05TVF9JTlRfTk9ERTogICBnc2xfaW5zdHJfYWRkX3BhcmFtKGN1cnJlbnRHb29tU0wtPmluc3RyLCBub2RlLT5zdHIsIFRZUEVfSU5URUdFUik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT05TVF9GTE9BVF9OT0RFOiBnc2xfaW5zdHJfYWRkX3BhcmFtKGN1cnJlbnRHb29tU0wtPmluc3RyLCBub2RlLT5zdHIsIFRZUEVfRkxPQVQpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ09OU1RfUFRSX05PREU6ICAgZ3NsX2luc3RyX2FkZF9wYXJhbShjdXJyZW50R29vbVNMLT5pbnN0ciwgbm9kZS0+c3RyLCBUWVBFX1BUUik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyZWxlYXNlSWZUbXAgJiYgaXNfdG1wX2V4cHIobm9kZSkpCisgICAgICAgICAgcmVsZWFzZVRlbXAoZ2V0X3RtcF9pZChub2RlKSk7CisgICAgICAgIAorICAgICAgICBub2RlRnJlZShub2RlKTsKKyAgICB9IC8qIH19fSAqLworCisgICAgTm9kZVR5cGUgKm5vZGVOZXcoY29uc3QgY2hhciAqc3RyLCBpbnQgdHlwZSwgaW50IGxpbmVfbnVtYmVyKSB7CisgICAgICAgIE5vZGVUeXBlICpub2RlID0gKE5vZGVUeXBlKiltYWxsb2Moc2l6ZW9mKE5vZGVUeXBlKSk7IC8qIHt7eyAqLworICAgICAgICBub2RlLT50eXBlID0gdHlwZTsKKyAgICAgICAgbm9kZS0+c3RyICA9IChjaGFyKiltYWxsb2Moc3RybGVuKHN0cikrMSk7CisgICAgICAgIG5vZGUtPnZuYW1lc3BhY2UgPSBOVUxMOworICAgICAgICBub2RlLT5saW5lX251bWJlciA9IGxpbmVfbnVtYmVyOworICAgICAgICBzdHJjcHkobm9kZS0+c3RyLCBzdHIpOworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9IC8qIH19fSAqLworICAgIHN0YXRpYyBOb2RlVHlwZSAqbm9kZUNsb25lKE5vZGVUeXBlICpub2RlKSB7CisgICAgICAgIE5vZGVUeXBlICpyZXQgPSBub2RlTmV3KG5vZGUtPnN0ciwgbm9kZS0+dHlwZSwgbm9kZS0+bGluZV9udW1iZXIpOyAvKiB7e3sgKi8KKyAgICAgICAgcmV0LT52bmFtZXNwYWNlID0gbm9kZS0+dm5hbWVzcGFjZTsKKyAgICAgICAgcmV0LT51bm9kZSA9IG5vZGUtPnVub2RlOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0gLyogfX19ICovCisKKyAgICB2b2lkIG5vZGVGcmVlSW50ZXJuYWxzKE5vZGVUeXBlICpub2RlKSB7CisgICAgICAgIGZyZWUobm9kZS0+c3RyKTsgLyoge3t7ICovCisgICAgfSAvKiB9fX0gKi8KKyAgICAKKyAgICB2b2lkIG5vZGVGcmVlKE5vZGVUeXBlICpub2RlKSB7CisgICAgICAgIG5vZGVGcmVlSW50ZXJuYWxzKG5vZGUpOyAvKiB7e3sgKi8KKyAgICAgICAgZnJlZShub2RlKTsKKyAgICB9IC8qIH19fSAqLworCisgICAgTm9kZVR5cGUgKm5ld19jb25zdEludChjb25zdCBjaGFyICpzdHIsIGludCBsaW5lX251bWJlcikgeworICAgICAgICBOb2RlVHlwZSAqbm9kZSA9IG5vZGVOZXcoc3RyLCBDT05TVF9JTlRfTk9ERSwgbGluZV9udW1iZXIpOyAvKiB7e3sgKi8KKyAgICAgICAgbm9kZS0+dW5vZGUuY29uc3RJbnQudmFsID0gYXRvaShzdHIpOworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9IC8qIH19fSAqLworCisgICAgTm9kZVR5cGUgKm5ld19jb25zdFB0cihjb25zdCBjaGFyICpzdHIsIGludCBsaW5lX251bWJlcikgeworICAgICAgICBOb2RlVHlwZSAqbm9kZSA9IG5vZGVOZXcoc3RyLCBDT05TVF9QVFJfTk9ERSwgbGluZV9udW1iZXIpOyAvKiB7e3sgKi8KKyAgICAgICAgbm9kZS0+dW5vZGUuY29uc3RQdHIuaWQgPSBzdHJ0b2woc3RyLE5VTEwsMCk7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0gLyogfX19ICovCisKKyAgICBOb2RlVHlwZSAqbmV3X2NvbnN0RmxvYXQoY29uc3QgY2hhciAqc3RyLCBpbnQgbGluZV9udW1iZXIpIHsKKyAgICAgICAgTm9kZVR5cGUgKm5vZGUgPSBub2RlTmV3KHN0ciwgQ09OU1RfRkxPQVRfTk9ERSwgbGluZV9udW1iZXIpOyAvKiB7e3sgKi8KKyAgICAgICAgbm9kZS0+dW5vZGUuY29uc3RGbG9hdC52YWwgPSBhdG9mKHN0cik7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0gLyogfX19ICovCisKKyAgICBOb2RlVHlwZSAqbmV3X3Zhcihjb25zdCBjaGFyICpzdHIsIGludCBsaW5lX251bWJlcikgeworICAgICAgICBOb2RlVHlwZSAqbm9kZSA9IG5vZGVOZXcoc3RyLCBWQVJfTk9ERSwgbGluZV9udW1iZXIpOyAvKiB7e3sgKi8KKyAgICAgICAgbm9kZS0+dm5hbWVzcGFjZSA9IGdzbF9maW5kX25hbWVzcGFjZShzdHIpOworICAgICAgICBpZiAobm9kZS0+dm5hbWVzcGFjZSA9PSAwKSB7CisgICAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyNpZiAwCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBMaW5lICVkLCBWYXJpYWJsZSBub3QgZm91bmQ6ICclcydcbiIsIGxpbmVfbnVtYmVyLCBzdHIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0gLyogfX19ICovCisgICAgCisgICAgTm9kZVR5cGUgKm5ld19ub3AoY29uc3QgY2hhciAqc3RyKSB7CisgICAgICAgIE5vZGVUeXBlICpub2RlID0gbmV3X29wKHN0ciwgRU1QVFlfTk9ERSwgMCk7IC8qIHt7eyAqLworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9IC8qIH19fSAqLworICAgIAorICAgIE5vZGVUeXBlICpuZXdfb3AoY29uc3QgY2hhciAqc3RyLCBpbnQgdHlwZSwgaW50IG5iT3ApIHsKKyAgICAgICAgaW50IGk7IC8qIHt7eyAqLworICAgICAgICBOb2RlVHlwZSAqbm9kZSA9IG5vZGVOZXcoc3RyLCBPUFJfTk9ERSwgY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKTsKKyAgICAgICAgbm9kZS0+dW5vZGUub3ByLm5leHQgPSAwOworICAgICAgICBub2RlLT51bm9kZS5vcHIudHlwZSA9IHR5cGU7CisgICAgICAgIG5vZGUtPnVub2RlLm9wci5uYk9wID0gbmJPcDsKKyAgICAgICAgZm9yIChpPTA7aTxuYk9wOysraSkgbm9kZS0+dW5vZGUub3ByLm9wW2ldID0gMDsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfSAvKiB9fX0gKi8KKworCisgICAgdm9pZCBnc2xfZGVjbGFyZV9nbG9iYWxfdmFyaWFibGUoaW50IHR5cGUsIGNoYXIgKm5hbWUpIHsKKyAgICAgIHN3aXRjaCh0eXBlKXsKKyAgICAgICAgY2FzZSAtMTogYnJlYWs7CisgICAgICAgIGNhc2UgRkxPQVRfVEs6Z3NsX2Zsb2F0X2RlY2xfZ2xvYmFsKG5hbWUpO2JyZWFrOworICAgICAgICBjYXNlIElOVF9USzogIGdzbF9pbnRfZGVjbF9nbG9iYWwobmFtZSk7YnJlYWs7CisgICAgICAgIGNhc2UgUFRSX1RLOiAgZ3NsX3B0cl9kZWNsX2dsb2JhbChuYW1lKTticmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgIGludCBpZCA9IHR5cGUgLSAxMDAwOworICAgICAgICAgIGdzbF9zdHJ1Y3RfZGVjbF9nbG9iYWxfZnJvbV9pZChuYW1lLGlkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworJX0KKworJXVuaW9uIHsKKyAgICBpbnQgaW50VmFsdWU7CisgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICBjaGFyIGNoYXJWYWx1ZTsKKyAgICBjaGFyIHN0clZhbHVlWzIwNDhdOworICAgIE5vZGVUeXBlICpuUHRyOworICAgIEdvb21IYXNoICpuYW1lc3BhY2U7CisgICAgR1NMX1N0cnVjdCAqZ3NsX3N0cnVjdDsKKyAgICBHU0xfU3RydWN0RmllbGQgKmdzbF9zdHJ1Y3RfZmllbGQ7CisgIH07CisgIAorJXRva2VuIDxzdHJWYWx1ZT4gICBMVFlQRV9JTlRFR0VSCisldG9rZW4gPHN0clZhbHVlPiAgIExUWVBFX0ZMT0FUCisldG9rZW4gPHN0clZhbHVlPiAgIExUWVBFX1ZBUgorJXRva2VuIDxzdHJWYWx1ZT4gICBMVFlQRV9QVFIKKworJXRva2VuIFBUUl9USyBJTlRfVEsgRkxPQVRfVEsgREVDTEFSRSBFWFRFUk5BTCBXSElMRSBETyBOT1QgUExVU19FUSBTVUJfRVEgRElWX0VRIE1VTF9FUSBTVVBfRVEgTE9XX0VRIE5PVF9FUSBTVFJVQ1QgRk9SIElOCisKKyV0eXBlIDxpbnRWYWx1ZT4gcmV0dXJuX3R5cGUKKyV0eXBlIDxuUHRyPiBleHByZXNzaW9uIGNvbnN0VmFsdWUgaW5zdHJ1Y3Rpb24gdGVzdCBmdW5jX2NhbGwgZnVuY19jYWxsX2V4cHJlc3Npb24KKyV0eXBlIDxuUHRyPiBzdGFydF9ibG9jayBhZmZlY3RhdGlvbl9saXN0IGFmZmVjdGF0aW9uX2luX2xpc3QgYWZmZWN0YXRpb24gZGVjbGFyYXRpb24KKyV0eXBlIDxuUHRyPiB2YXJfbGlzdF9jb250ZW50IHZhcl9saXN0CisldHlwZSA8c3RyVmFsdWU+IHRhc2tfbmFtZSBleHRfdGFza19uYW1lIAorJXR5cGUgPG5hbWVzcGFjZT4gbGVhdmVfbmFtZXNwYWNlCisldHlwZSA8Z3NsX3N0cnVjdD4gc3RydWN0X21lbWJlcnMKKyV0eXBlIDxnc2xfc3RydWN0X2ZpZWxkPiBzdHJ1Y3RfbWVtYmVyCislbGVmdCAnXG4nCislbGVmdCBQTFVTX0VRIFNVQl9FUSBNVUxfRVEgRElWX0VRCislbGVmdCBOT1QKKyVsZWZ0ICc9JyAnPCcgJz4nCislbGVmdCAnKycgJy0nCislbGVmdCAnLycgJyonCisKKyUlCisKKy8qIC0tLS0tLS0tLS0tLS0tIEdsb2JhbCBhcmNoaXRlY2h0dXJlIG9mIGEgR1NMIHByb2dyYW0gLS0tLS0tLS0tLS0tKi8KKworZ3NsOiBnc2xfY29kZSBmdW5jdGlvbl9vdXRybyBnc2xfZGVmX2Z1bmN0aW9ucyA7CisKK2dzbF9jb2RlOiBnc2xfY29kZSBpbnN0cnVjdGlvbiAgICAgICAgICAgICAgeyBnc2xfYXBwZW5kKCQyKTsgfQorICAgfCBnc2xfY29kZSBFWFRFUk5BTCAnPCcgZXh0X3Rhc2tfbmFtZSAnPicgcmV0dXJuX3R5cGUgJ1xuJyBsZWF2ZV9uYW1lc3BhY2UgICAgICAgICAgICAgeyBnc2xfZGVjbGFyZV9nbG9iYWxfdmFyaWFibGUoJDYsJDQpOyB9CisgICB8IGdzbF9jb2RlIEVYVEVSTkFMICc8JyBleHRfdGFza19uYW1lICc6JyBhcmdsaXN0ICc+JyByZXR1cm5fdHlwZSAnXG4nIGxlYXZlX25hbWVzcGFjZSB7IGdzbF9kZWNsYXJlX2dsb2JhbF92YXJpYWJsZSgkOCwkNCk7IH0KKyAgIHwgZ3NsX2NvZGUgREVDTEFSRSAnPCcgdGFza19uYW1lICc+JyByZXR1cm5fdHlwZSAgJ1xuJyBsZWF2ZV9uYW1lc3BhY2UgICAgICAgICAgICAgICAgIHsgZ3NsX2RlY2xhcmVfZ2xvYmFsX3ZhcmlhYmxlKCQ2LCQ0KTsgfQorICAgfCBnc2xfY29kZSBERUNMQVJFICc8JyB0YXNrX25hbWUgJzonIGFyZ2xpc3QgJz4nIHJldHVybl90eXBlICdcbicgbGVhdmVfbmFtZXNwYWNlICAgICAgeyBnc2xfZGVjbGFyZV9nbG9iYWxfdmFyaWFibGUoJDgsJDQpOyB9CisgICB8IGdzbF9jb2RlIHN0cnVjdF9kZWNsYXJhdGlvbgorICAgfCBnc2xfY29kZSAnXG4nCisgICB8CisgICA7CisKKy8qIC0tLS0tLS0tLS0tLS0gRGVjbGFyYXRpb24gb2YgYSBzdHJ1Y3R1cmUgLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdF9kZWNsYXJhdGlvbjogU1RSVUNUICAnPCcgTFRZUEVfVkFSICAnOicgc3RydWN0X21lbWJlcnMgJz4nICdcbicgeyBnc2xfYWRkX3N0cnVjdCgkMywgJDUpOyB9CisgICAgICAgICAgICAgICAgICA7CisKK3N0cnVjdF9tZW1iZXJzOiBvcHRfbmwgc3RydWN0X21lbWJlciAgICAgICAgICAgICAgICAgICAgeyAkJCA9IGdzbF9uZXdfc3RydWN0KCQyKTsgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHwgc3RydWN0X21lbWJlcnMgJywnIG9wdF9ubCBzdHJ1Y3RfbWVtYmVyIHsgJCQgPSAkMTsgZ3NsX2FkZF9zdHJ1Y3RfZmllbGQoJDEsICQ0KTsgfQorICAgICAgICAgICAgICA7CisKK3N0cnVjdF9tZW1iZXI6IElOVF9USyAgICBMVFlQRV9WQVIgeyAkJCA9IGdzbF9uZXdfc3RydWN0X2ZpZWxkKCQyLCBJTlNUUl9JTlQpOyB9CisgICAgICAgICAgICAgfCBGTE9BVF9USyAgTFRZUEVfVkFSIHsgJCQgPSBnc2xfbmV3X3N0cnVjdF9maWVsZCgkMiwgSU5TVFJfRkxPQVQpOyB9CisgICAgICAgICAgICAgfCBQVFJfVEsgICAgTFRZUEVfVkFSIHsgJCQgPSBnc2xfbmV3X3N0cnVjdF9maWVsZCgkMiwgSU5TVFJfUFRSKTsgfQorICAgICAgICAgICAgIHwgTFRZUEVfVkFSIExUWVBFX1ZBUiB7ICQkID0gZ3NsX25ld19zdHJ1Y3RfZmllbGRfc3RydWN0KCQyLCAkMSk7IH0KKyAgICAgICAgICAgICA7CisKKy8qIC0tLS0tLS0tLS0tLS0gRm9uY3Rpb24gZGVjbGFyYXRpb25zIC0tLS0tLS0tLS0tLS0tICovCisKK2V4dF90YXNrX25hbWU6IExUWVBFX1ZBUiB7IGdzbF9kZWNsYXJlX2V4dGVybmFsX3Rhc2soJDEpOyBnc2xfZW50ZXJuYW1lc3BhY2UoJDEpOyBzdHJjcHkoJCQsJDEpOyB9CisgICAgICAgICAgICAgOwordGFza19uYW1lOiAgICAgTFRZUEVfVkFSIHsgZ3NsX2RlY2xhcmVfdGFzaygkMSk7IGdzbF9lbnRlcm5hbWVzcGFjZSgkMSk7IHN0cmNweSgkJCwkMSk7IHN0cmNweSgkJCwkMSk7IH0KKyAgICAgICAgIDsKKworcmV0dXJuX3R5cGU6ICAgICAgeyAkJD0tMTsgfQorICB8ICc6JyBJTlRfVEsgICAgeyAkJD1JTlRfVEs7IH0KKyAgfCAnOicgRkxPQVRfVEsgIHsgJCQ9RkxPQVRfVEs7IH0KKyAgfCAnOicgUFRSX1RLICAgIHsgJCQ9UFRSX1RLOyB9CisgIHwgJzonIExUWVBFX1ZBUiB7ICQkPSAxMDAwICsgZ3NsX2dldF9zdHJ1Y3RfaWQoJDIpOyB9CisgIDsKKworYXJnbGlzdDogZW1wdHlfZGVjbGFyYXRpb24KKyAgICAgICB8IGVtcHR5X2RlY2xhcmF0aW9uICcsJyBhcmdsaXN0CisgICAgICAgOworCisvKiAtLS0tLS0tLS0tLS0tIEZvbmN0aW9uIGRlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0gKi8KKworZ3NsX2RlZl9mdW5jdGlvbnM6IGdzbF9kZWZfZnVuY3Rpb25zIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgOworCitmdW5jdGlvbjogZnVuY3Rpb25faW50cm8gZ3NsX2NvZGUgZnVuY3Rpb25fb3V0cm8geyBnc2xfbGVhdmVuYW1lc3BhY2UoKTsgfQorCitmdW5jdGlvbl9pbnRybzogJzwnIHRhc2tfbmFtZSAnPicgcmV0dXJuX3R5cGUgJ1xuJyAgICAgICAgICAgICB7IGdzbF9hcHBlbmQobmV3X2Z1bmN0aW9uX2ludHJvKCQyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzbF9kZWNsYXJlX2dsb2JhbF92YXJpYWJsZSgkNCwkMik7IH0KKyAgICAgICAgICAgICAgfCAnPCcgdGFza19uYW1lICc6JyBhcmdsaXN0ICc+JyByZXR1cm5fdHlwZSAnXG4nIHsgZ3NsX2FwcGVuZChuZXdfZnVuY3Rpb25faW50cm8oJDIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NsX2RlY2xhcmVfZ2xvYmFsX3ZhcmlhYmxlKCQ2LCQyKTsgfQorICAgICAgICAgICAgICA7CitmdW5jdGlvbl9vdXRybzogeyBnc2xfYXBwZW5kKG5ld19mdW5jdGlvbl9vdXRybygpKTsgfSA7CisKK2xlYXZlX25hbWVzcGFjZTogICAgICB7ICQkID0gZ3NsX2xlYXZlbmFtZXNwYWNlKCk7ICAgfTsKKworLyogLS0tLS0tLS0tLS0tIFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0gKi8KKworZGVjbGFyYXRpb246IEZMT0FUX1RLIExUWVBFX1ZBUiAnPScgZXhwcmVzc2lvbiB7IGdzbF9mbG9hdF9kZWNsX2xvY2FsKCQyKTsgJCQgPSBuZXdfc2V0KG5ld192YXIoJDIsY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKSwgJDQpOyB9CisgICAgICAgICAgIHwgSU5UX1RLICAgTFRZUEVfVkFSICc9JyBleHByZXNzaW9uIHsgZ3NsX2ludF9kZWNsX2xvY2FsKCQyKTsgICAkJCA9IG5ld19zZXQobmV3X3ZhcigkMixjdXJyZW50R29vbVNMLT5udW1fbGluZXMpLCAkNCk7IH0KKyAgICAgICAgICAgfCBQVFJfVEsgICBMVFlQRV9WQVIgJz0nIGV4cHJlc3Npb24geyBnc2xfcHRyX2RlY2xfbG9jYWwoJDIpOyAgICQkID0gbmV3X3NldChuZXdfdmFyKCQyLGN1cnJlbnRHb29tU0wtPm51bV9saW5lcyksICQ0KTsgfQorICAgICAgICAgICB8IExUWVBFX1ZBUiBMVFlQRV9WQVIgJz0nIGV4cHJlc3Npb24geyBnc2xfc3RydWN0X2RlY2xfbG9jYWwoJDEsJDIpOyAkJCA9IG5ld19zZXQobmV3X3ZhcigkMixjdXJyZW50R29vbVNMLT5udW1fbGluZXMpLCAkNCk7IH0KKyAgICAgICAgICAgfCBlbXB0eV9kZWNsYXJhdGlvbiAgICAgICAgICAgICAgICB7ICQkID0gMDsgfQorICAgICAgICAgICA7CisKK2VtcHR5X2RlY2xhcmF0aW9uOiBGTE9BVF9USyAgTFRZUEVfVkFSIHsgZ3NsX2Zsb2F0X2RlY2xfbG9jYWwoJDIpOyAgICAgICB9CisgICAgICAgICAgICAgICAgIHwgSU5UX1RLICAgIExUWVBFX1ZBUiB7IGdzbF9pbnRfZGVjbF9sb2NhbCgkMik7ICAgICAgICAgfQorICAgICAgICAgICAgICAgICB8IFBUUl9USyAgICBMVFlQRV9WQVIgeyBnc2xfcHRyX2RlY2xfbG9jYWwoJDIpOyAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgfCBMVFlQRV9WQVIgTFRZUEVfVkFSIHsgZ3NsX3N0cnVjdF9kZWNsX2xvY2FsKCQxLCQyKTsgICB9CisgICAgICAgICAgICAgICAgIDsKKworLyogLS0tLS0tLS0tLS0tLS0gSW5zdHJ1Y3Rpb25zIGFuZCBFeHByZXNzaW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW5zdHJ1Y3Rpb246IGFmZmVjdGF0aW9uICdcbicgeyAkJCA9ICQxOyB9CisgICAgICAgICAgIHwgZGVjbGFyYXRpb24gJ1xuJyB7ICQkID0gJDE7IH0KKyAgICAgICAgICAgfCAnKCcgdGVzdCAnKScgJz8nIG9wdF9ubCBpbnN0cnVjdGlvbiAgICAgeyAkJCA9IG5ld19pZigkMiwkNik7IH0KKyAgICAgICAgICAgfCBXSElMRSB0ZXN0IG9wdF9ubCBETyBvcHRfbmwgaW5zdHJ1Y3Rpb24geyAkJCA9IG5ld193aGlsZSgkMiwkNik7IH0KKyAgICAgICAgICAgfCAneycgJ1xuJyBzdGFydF9ibG9jayBnc2xfY29kZSAnfScgJ1xuJyAgeyBsYXN0Tm9kZSA9ICQzLT51bm9kZS5vcHIub3BbMV07ICQkPSQzOyB9CisgICAgICAgICAgIHwgZnVuY19jYWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJCQgPSAkMTsgfQorICAgICAgICAgICB8IExUWVBFX1ZBUiBQTFVTX0VRIGV4cHJlc3Npb24geyAkJCA9IG5ld19wbHVzX2VxKG5ld192YXIoJDEsY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKSwkMyk7IH0KKyAgICAgICAgICAgfCBMVFlQRV9WQVIgU1VCX0VRIGV4cHJlc3Npb24gIHsgJCQgPSBuZXdfc3ViX2VxKG5ld192YXIoJDEsY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKSwkMyk7IH0KKyAgICAgICAgICAgfCBMVFlQRV9WQVIgTVVMX0VRIGV4cHJlc3Npb24gIHsgJCQgPSBuZXdfbXVsX2VxKG5ld192YXIoJDEsY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKSwkMyk7IH0KKyAgICAgICAgICAgfCBMVFlQRV9WQVIgRElWX0VRIGV4cHJlc3Npb24gIHsgJCQgPSBuZXdfZGl2X2VxKG5ld192YXIoJDEsY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKSwkMyk7IH0KKyAgICAgICAgICAgfCBGT1IgTFRZUEVfVkFSIElOIHZhcl9saXN0IERPIGluc3RydWN0aW9uIHsgJCQgPSBuZXdfc3RhdGljX2ZvcmVhY2gobmV3X3ZhcigkMiwgY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKSwgJDQsICQ2KTsgfQorICAgICAgICAgICA7CisKK3Zhcl9saXN0OiAnKCcgdmFyX2xpc3RfY29udGVudCAnKScgICAgICB7ICQkID0gJDI7IH0KKyAgICAgICAgOwordmFyX2xpc3RfY29udGVudDogTFRZUEVfVkFSICAgICAgICAgICAgIHsgJCQgPSBuZXdfdmFyX2xpc3QobmV3X3ZhcigkMSxjdXJyZW50R29vbVNMLT5udW1fbGluZXMpLCBOVUxMKTsgfQorICAgICAgICAgICB8IExUWVBFX1ZBUiB2YXJfbGlzdF9jb250ZW50IHsgJCQgPSBuZXdfdmFyX2xpc3QobmV3X3ZhcigkMSxjdXJyZW50R29vbVNMLT5udW1fbGluZXMpLCAkMik7ICAgfQorICAgICAgICAgICA7CisKK2FmZmVjdGF0aW9uOiBMVFlQRV9WQVIgJz0nIGV4cHJlc3Npb24geyAkJCA9IG5ld19zZXQobmV3X3ZhcigkMSxjdXJyZW50R29vbVNMLT5udW1fbGluZXMpLCQzKTsgfSA7CisKK3N0YXJ0X2Jsb2NrOiB7ICQkID0gbmV3X2Jsb2NrKGxhc3ROb2RlKTsgbGFzdE5vZGUgPSAkJC0+dW5vZGUub3ByLm9wWzBdOyB9CisgICAgICAgICAgIDsKKworZXhwcmVzc2lvbjogTFRZUEVfVkFSICAgeyAkJCA9IG5ld192YXIoJDEsY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKTsgfQorICAgICAgICAgIHwgY29uc3RWYWx1ZSAgeyAkJCA9ICQxOyB9CisgICAgICAgICAgfCBleHByZXNzaW9uICcqJyBleHByZXNzaW9uIHsgJCQgPSBuZXdfbXVsKCQxLCQzKTsgfSAKKyAgICAgICAgICB8IGV4cHJlc3Npb24gJy8nIGV4cHJlc3Npb24geyAkJCA9IG5ld19kaXYoJDEsJDMpOyB9IAorICAgICAgICAgIHwgZXhwcmVzc2lvbiAnKycgZXhwcmVzc2lvbiB7ICQkID0gbmV3X2FkZCgkMSwkMyk7IH0gCisgICAgICAgICAgfCBleHByZXNzaW9uICctJyBleHByZXNzaW9uIHsgJCQgPSBuZXdfc3ViKCQxLCQzKTsgfSAKKyAgICAgICAgICB8ICctJyBleHByZXNzaW9uICAgICAgICAgICAgeyAkJCA9IG5ld19uZWcoJDIpOyAgICB9CisgICAgICAgICAgfCAnKCcgZXhwcmVzc2lvbiAnKScgICAgICAgIHsgJCQgPSAkMjsgfQorICAgICAgICAgIHwgZnVuY19jYWxsX2V4cHJlc3Npb24gICAgICB7ICQkID0gJDE7IH0KKyAgICAgICAgICA7CisKK3Rlc3Q6IGV4cHJlc3Npb24gJz0nIGV4cHJlc3Npb24geyAkJCA9IG5ld19lcXUoJDEsJDMpOyB9IAorICAgIHwgZXhwcmVzc2lvbiAnPCcgZXhwcmVzc2lvbiB7ICQkID0gbmV3X2xvdygkMSwkMyk7IH0gCisgICAgfCBleHByZXNzaW9uICc+JyBleHByZXNzaW9uIHsgJCQgPSBuZXdfbG93KCQzLCQxKTsgfQorICAgIHwgZXhwcmVzc2lvbiBTVVBfRVEgZXhwcmVzc2lvbiB7ICQkID0gbmV3X25vdChuZXdfbG93KCQxLCQzKSk7IH0KKyAgICB8IGV4cHJlc3Npb24gTE9XX0VRIGV4cHJlc3Npb24geyAkJCA9IG5ld19ub3QobmV3X2xvdygkMywkMSkpOyB9CisgICAgfCBleHByZXNzaW9uIE5PVF9FUSBleHByZXNzaW9uIHsgJCQgPSBuZXdfbm90KG5ld19lcXUoJDEsJDMpKTsgfQorICAgIHwgTk9UIHRlc3QgICAgICAgICAgICAgICAgICB7ICQkID0gbmV3X25vdCgkMik7ICAgIH0KKyAgICA7CisKK2NvbnN0VmFsdWU6IExUWVBFX0ZMT0FUICAgeyAkJCA9IG5ld19jb25zdEZsb2F0KCQxLGN1cnJlbnRHb29tU0wtPm51bV9saW5lcyk7IH0KKyAgICAgICAgICB8IExUWVBFX0lOVEVHRVIgeyAkJCA9IG5ld19jb25zdEludCgkMSxjdXJyZW50R29vbVNMLT5udW1fbGluZXMpOyB9IAorICAgICAgICAgIHwgTFRZUEVfUFRSICAgICB7ICQkID0gbmV3X2NvbnN0UHRyKCQxLGN1cnJlbnRHb29tU0wtPm51bV9saW5lcyk7IH0gCisgICAgICAgICAgOworCisvKiAtLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIENhbGxzIC0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitmdW5jX2NhbGw6ICAgdGFza19uYW1lICdcbicgbGVhdmVfbmFtZXNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICB7ICQkID0gbmV3X2NhbGwoJDEsTlVMTCk7IH0KKyAgICAgICAgICAgfCB0YXNrX25hbWUgJzonIGFmZmVjdGF0aW9uX2xpc3QgJ1xuJyBsZWF2ZV9uYW1lc3BhY2UgICAgICAgICB7ICQkID0gbmV3X2NhbGwoJDEsJDMpOyB9CisgICAgICAgICAgIHwgJ1snIHRhc2tfbmFtZSAnXScgJ1xuJyBsZWF2ZV9uYW1lc3BhY2UgICAgICAgICAgICAgICAgICB7ICQkID0gbmV3X2NhbGwoJDIsTlVMTCk7IH0KKyAgICAgICAgICAgfCAnWycgdGFza19uYW1lICc6JyBhZmZlY3RhdGlvbl9saXN0ICddJyAnXG4nIGxlYXZlX25hbWVzcGFjZSB7ICQkID0gbmV3X2NhbGwoJDIsJDQpOyB9CisgICAgICAgICAgIDsKKworZnVuY19jYWxsX2V4cHJlc3Npb246CisgICAgICAgICAgICAnWycgdGFza19uYW1lIGxlYXZlX25hbWVzcGFjZSAnXScgICAgICAgICAgICAgICAgICAgICAgeyAkJCA9IG5ld19jYWxsX2V4cHIoJDIsTlVMTCk7IH0KKyAgICAgICAgICB8ICdbJyB0YXNrX25hbWUgJzonIGFmZmVjdGF0aW9uX2xpc3QgJ10nIGxlYXZlX25hbWVzcGFjZSB7ICQkID0gbmV3X2NhbGxfZXhwcigkMiwkNCk7IH0KKyAgICAgICAgICA7CisgICAgICAgICAgICAgCithZmZlY3RhdGlvbl9saXN0OiBhZmZlY3RhdGlvbl9pbl9saXN0IGFmZmVjdGF0aW9uX2xpc3QgICAgIHsgJCQgPSBuZXdfYWZmZWNfbGlzdCgkMSwkMik7ICAgfQorICAgICAgICAgICAgfCBhZmZlY3RhdGlvbl9pbl9saXN0ICAgICAgICAgICAgICAgICAgICAgICAgICB7ICQkID0gbmV3X2FmZmVjX2xpc3QoJDEsTlVMTCk7IH0KKworYWZmZWN0YXRpb25faW5fbGlzdDogTFRZUEVfVkFSICc9JyBsZWF2ZV9uYW1lc3BhY2UgZXhwcmVzc2lvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc2xfcmVlbnRlcm5hbWVzcGFjZSgkMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJCA9IG5ld19zZXQobmV3X3ZhcigkMSxjdXJyZW50R29vbVNMLT5udW1fbGluZXMpLCQ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgfCAnOicgbGVhdmVfbmFtZXNwYWNlIGV4cHJlc3Npb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NsX3JlZW50ZXJuYW1lc3BhY2UoJDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCQgPSBuZXdfc2V0KG5ld192YXIoIiZ0aGlzIiwgY3VycmVudEdvb21TTC0+bnVtX2xpbmVzKSwkMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIDsKKworCisvKiAtLS0tLS0tLS0tLS0gTWlzYyAtLS0tLS0tLS0tICovCisKK29wdF9ubDogJ1xuJyB8IDsKKyAgICAgICAgICAgCisKKyUlCisKKwordm9pZCB5eWVycm9yKGNoYXIgKnN0cikKK3sgLyoge3t7ICovCisgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisjaWYgMAorICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IExpbmUgJWQsICVzXG4iLCBjdXJyZW50R29vbVNMLT5udW1fbGluZXMsIHN0cik7CisgICAgY3VycmVudEdvb21TTC0+Y29tcGlsYXRpb25PSyA9IDA7CisgICAgZXhpdCgxKTsKKyNlbmRpZgorfSAvKiB9fX0gKi8KKwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vZ3JhcGhpYy5jIGIvZ3N0L2dvb20vZ3JhcGhpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMzA0NDgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9ncmFwaGljLmMKQEAgLTAsMCArMSwyOCBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgImdvb21fZ3JhcGhpYy5oIgorCitjb25zdCBDb2xvciBCTEFDSyA9IHsgMCwgMCwgMCB9OworY29uc3QgQ29sb3IgV0hJVEUgPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKK2NvbnN0IENvbG9yIFJFRCA9IHsgMHhmZiwgMHgwNSwgMHgwNSB9OworY29uc3QgQ29sb3IgR1JFRU4gPSB7IDB4MDUsIDB4ZmYsIDB4MDUgfTsKK2NvbnN0IENvbG9yIEJMVUUgPSB7IDB4MDUsIDB4MDUsIDB4ZmYgfTsKK2NvbnN0IENvbG9yIFlFTExPVyA9IHsgMHhmZiwgMHhmZiwgMHgzMyB9OworY29uc3QgQ29sb3IgT1JBTkdFID0geyAweGZmLCAweGNjLCAweDA1IH07Citjb25zdCBDb2xvciBWSU9MRVQgPSB7IDB4NTUsIDB4MDUsIDB4ZmYgfTsKZGlmZiAtLWdpdCBhL2dzdC9nb29tL2dzdGdvb20uYyBiL2dzdC9nb29tL2dzdGdvb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmJlOTQxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vZ3N0Z29vbS5jCkBAIC0wLDAgKzEsMjEwIEBACisvKiBnc3Rnb29tLmM6IGltcGxlbWVudGF0aW9uIG9mIGdvb20gZHJhd2luZyBlbGVtZW50CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAxPiBSaWNoYXJkIEJvdWx0b24gPHJpY2hhcmRAdGFydGFydXMub3JnPgorICogICAgICAgICAgIChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbSBhdCBmbHVlbmRvIGRvdCBjb20+CisgKiAgICAgICAgICAgKEMpIDwyMDExPiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnMgYXQgZ21haWwgZG90IGNvbT4KKyAqICAgICAgICAgICAoQykgPDIwMTU+IEx1aXMgZGUgQmV0aGVuY291cnQgPGx1aXNAZGViZXRoZW5jb3VydC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZ29vbQorICogQHNlZV9hbHNvOiBzeW5hZXN0aGVzaWEKKyAqCisgKiBHb29tIGlzIGFuIGF1ZGlvIHZpc3VhbGlzYXRpb24gZWxlbWVudC4gSXQgY3JlYXRlcyB3YXJwaW5nIHN0cnVjdHVyZXMKKyAqIGJhc2VkIG9uIHRoZSBpbmNvbWluZyBhdWRpbyBzaWduYWwuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyAhIGdvb20gISB2aWRlb2NvbnZlcnQgISB4dmltYWdlc2luaworICogXXwKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0Z29vbS5oIgorI2luY2x1ZGUgImdvb20uaCIKKworI2lmIEhBVkVfT1JDCisjaW5jbHVkZSA8b3JjL29yYy5oPgorI2VuZGlmCisKK0dTVF9ERUJVR19DQVRFR09SWSAoZ29vbV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnb29tX2RlYnVnCisKKyNkZWZpbmUgREVGQVVMVF9XSURUSCAgMzIwCisjZGVmaW5lIERFRkFVTFRfSEVJR0hUIDI0MAorCisvKiBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgQVJHXzAKKyAgICAgIC8qIEZJTEwgTUUgKi8KK307CisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19CSUdfRU5ESUFOCisjZGVmaW5lIFJHQl9PUkRFUiAieFJHQiIKKyNlbHNlCisjZGVmaW5lIFJHQl9PUkRFUiAiQkdSeCIKKyNlbmRpZgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoUkdCX09SREVSKSkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsICAgIC8qIHRoZSBuYW1lIG9mIHRoZSBwYWRzICovCisgICAgR1NUX1BBRF9TSU5LLCAgICAgICAgICAgICAgIC8qIHR5cGUgb2YgdGhlIHBhZCAqLworICAgIEdTVF9QQURfQUxXQVlTLCAgICAgICAgICAgICAvKiBBTFdBWVMvU09NRVRJTUVTICovCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChTMTYpICIsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDgwMDAsIDk2MDAwIF0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQ7ICIKKyAgICAgICAgImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzE2KSAiLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyA4MDAwLCA5NjAwMCBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDIsICIKKyAgICAgICAgImNoYW5uZWwtbWFzayA9IChiaXRtYXNrKSAweDMsICIgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkIikKKyAgICApOworCisKK3N0YXRpYyB2b2lkIGdzdF9nb29tX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9nb29tX3NldHVwIChHc3RBdWRpb1Zpc3VhbGl6ZXIgKiBiYXNlKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZ29vbV9yZW5kZXIgKEdzdEF1ZGlvVmlzdWFsaXplciAqIGJhc2UsIEdzdEJ1ZmZlciAqIGF1ZGlvLAorICAgIEdzdFZpZGVvRnJhbWUgKiB2aWRlbyk7CisKK0dfREVGSU5FX1RZUEUgKEdzdEdvb20sIGdzdF9nb29tLCBHU1RfVFlQRV9BVURJT19WSVNVQUxJWkVSKTsKKworc3RhdGljIHZvaWQKK2dzdF9nb29tX2NsYXNzX2luaXQgKEdzdEdvb21DbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0QXVkaW9WaXN1YWxpemVyQ2xhc3MgKnZpc3VhbGl6ZXJfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICB2aXN1YWxpemVyX2NsYXNzID0gKEdzdEF1ZGlvVmlzdWFsaXplckNsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2dvb21fZmluYWxpemU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkdPT006IHdoYXQgYSBHT09NISIsCisgICAgICAiVmlzdWFsaXphdGlvbiIsCisgICAgICAiVGFrZXMgZnJhbWVzIG9mIGRhdGEgYW5kIG91dHB1dHMgdmlkZW8gZnJhbWVzIHVzaW5nIHRoZSBHT09NIGZpbHRlciIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4iKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworCisgIHZpc3VhbGl6ZXJfY2xhc3MtPnNldHVwID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nb29tX3NldHVwKTsKKyAgdmlzdWFsaXplcl9jbGFzcy0+cmVuZGVyID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nb29tX3JlbmRlcik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ29vbV9pbml0IChHc3RHb29tICogZ29vbSkKK3sKKyAgZ29vbS0+d2lkdGggPSBERUZBVUxUX1dJRFRIOworICBnb29tLT5oZWlnaHQgPSBERUZBVUxUX0hFSUdIVDsKKyAgZ29vbS0+Y2hhbm5lbHMgPSAwOworCisgIGdvb20tPnBsdWdpbiA9IGdvb21faW5pdCAoZ29vbS0+d2lkdGgsIGdvb20tPmhlaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ29vbV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0R29vbSAqZ29vbSA9IEdTVF9HT09NIChvYmplY3QpOworCisgIGdvb21fY2xvc2UgKGdvb20tPnBsdWdpbik7CisgIGdvb20tPnBsdWdpbiA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF9nb29tX3BhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9nb29tX3NldHVwIChHc3RBdWRpb1Zpc3VhbGl6ZXIgKiBiYXNlKQoreworICBHc3RHb29tICpnb29tID0gR1NUX0dPT00gKGJhc2UpOworCisgIGdvb20tPndpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKCZiYXNlLT52aW5mbyk7CisgIGdvb20tPmhlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoJmJhc2UtPnZpbmZvKTsKKyAgZ29vbV9zZXRfcmVzb2x1dGlvbiAoZ29vbS0+cGx1Z2luLCBnb29tLT53aWR0aCwgZ29vbS0+aGVpZ2h0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ29vbV9yZW5kZXIgKEdzdEF1ZGlvVmlzdWFsaXplciAqIGJhc2UsIEdzdEJ1ZmZlciAqIGF1ZGlvLAorICAgIEdzdFZpZGVvRnJhbWUgKiB2aWRlbykKK3sKKyAgR3N0R29vbSAqZ29vbSA9IEdTVF9HT09NIChiYXNlKTsKKyAgR3N0TWFwSW5mbyBhbWFwOworICBnaW50MTYgZGF0YWluWzJdW0dPT01fU0FNUExFU107CisgIGdpbnQxNiAqYWRhdGE7CisgIGdpbnQgaTsKKworICAvKiBnZXQgbmV4dCBHT09NX1NBTVBMRVMsIHdlIGhhdmUgYXQgbGVhc3QgdGhpcyBhbW91bnQgb2Ygc2FtcGxlcyAqLworICBnc3RfYnVmZmVyX21hcCAoYXVkaW8sICZhbWFwLCBHU1RfTUFQX1JFQUQpOworICBhZGF0YSA9IChnaW50MTYgKikgYW1hcC5kYXRhOworCisgIGlmIChnb29tLT5jaGFubmVscyA9PSAyKSB7CisgICAgZm9yIChpID0gMDsgaSA8IEdPT01fU0FNUExFUzsgaSsrKSB7CisgICAgICBkYXRhaW5bMF1baV0gPSAqYWRhdGErKzsKKyAgICAgIGRhdGFpblsxXVtpXSA9ICphZGF0YSsrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgR09PTV9TQU1QTEVTOyBpKyspIHsKKyAgICAgIGRhdGFpblswXVtpXSA9ICphZGF0YTsKKyAgICAgIGRhdGFpblsxXVtpXSA9ICphZGF0YSsrOworICAgIH0KKyAgfQorCisgIHZpZGVvLT5kYXRhWzBdID0gZ29vbV91cGRhdGUgKGdvb20tPnBsdWdpbiwgZGF0YWluLCAwLCAwKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYXVkaW8sICZhbWFwKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ29vbV9kZWJ1ZywgImdvb20iLCAwLCAiZ29vbSB2aXN1YWxpc2F0aW9uIGVsZW1lbnQiKTsKKworI2lmIEhBVkVfT1JDCisgIG9yY19pbml0ICgpOworI2VuZGlmCisKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJnb29tIiwgR1NUX1JBTktfTk9ORSwgR1NUX1RZUEVfR09PTSk7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBnb29tLAorICAgICJHT09NIHZpc3VhbGl6YXRpb24gZmlsdGVyIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC9nb29tL2dzdGdvb20uaCBiL2dzdC9nb29tL2dzdGdvb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTk3NWRkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vZ3N0Z29vbS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIGdzdGdvb20uYzogaW1wbGVtZW50YXRpb24gb2YgZ29vbSBkcmF3aW5nIGVsZW1lbnQKKyAqIENvcHlyaWdodCAoQykgPDIwMDE+IFJpY2hhcmQgQm91bHRvbiA8cmljaGFyZEB0YXJ0YXJ1cy5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDE1PiBMdWlzIGRlIEJldGhlbmNvdXJ0IDxsdWlzQGRlYmV0aGVuY291cnQuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfR09PTV9IX18KKyNkZWZpbmUgX19HU1RfR09PTV9IX18KKworI2luY2x1ZGUgPGdzdC9wYnV0aWxzL2dzdGF1ZGlvdmlzdWFsaXplci5oPgorCisjaW5jbHVkZSAiZ29vbS5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR09PTV9TQU1QTEVTIDUxMgorCisjZGVmaW5lIEdTVF9UWVBFX0dPT00gICAgICAgICAgICAoZ3N0X2dvb21fZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0dPT00ob2JqKSAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9HT09NLEdzdEdvb20pKQorI2RlZmluZSBHU1RfR09PTV9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfR09PTSxHc3RHb29tQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfR09PTShvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0dPT00pKQorI2RlZmluZSBHU1RfSVNfR09PTV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfR09PTSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RHb29tIEdzdEdvb207Cit0eXBlZGVmIHN0cnVjdCBfR3N0R29vbUNsYXNzIEdzdEdvb21DbGFzczsKKworc3RydWN0IF9Hc3RHb29tCit7CisgIEdzdEF1ZGlvVmlzdWFsaXplciBwYXJlbnQ7CisKKyAgLyogaW5wdXQgdHJhY2tpbmcgKi8KKyAgZ2ludCBjaGFubmVsczsKKworICAvKiB2aWRlbyBzdGF0ZSAqLworICBnaW50IHdpZHRoOworICBnaW50IGhlaWdodDsKKworICAvKiBnb29tIHN0dWZmICovCisgIFBsdWdpbkluZm8gKnBsdWdpbjsKK307CisKK3N0cnVjdCBfR3N0R29vbUNsYXNzCit7CisgIEdzdEF1ZGlvVmlzdWFsaXplckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9nb29tX2dldF90eXBlICh2b2lkKTsKK2dib29sZWFuIGdzdF9nb29tX3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfR09PTV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vaWZzLmMgYi9nc3QvZ29vbS9pZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDM4ZTMxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vaWZzLmMKQEAgLTAsMCArMSw3NzQgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTk3IGJ5IE1hc3NpbWlubyBQYXNjYWwgPFBhc2NhbC5NYXNzaW1vbkBlbnMuZnI+CisgKgorICogaWZzLmM6IG1vZGlmaWVkIGl0ZXJhdGVkIGZ1bmN0aW9ucyBzeXN0ZW0gZm9yIGdvb20uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisgKiBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgQVMgSVMgd2l0aCBubyB3YXJyYW50aWVzIG9mIGFueSBraW5kLiAgVGhlIGF1dGhvcgorICogc2hhbGwgaGF2ZSBubyBsaWFiaWxpdHkgd2l0aCByZXNwZWN0IHRvIHRoZSBpbmZyaW5nZW1lbnQgb2YgY29weXJpZ2h0cywKKyAqIHRyYWRlIHNlY3JldHMgb3IgYW55IHBhdGVudHMgYnkgdGhpcyBmaWxlIG9yIGFueSBwYXJ0IHRoZXJlb2YuICBJbiBubworICogZXZlbnQgd2lsbCB0aGUgYXV0aG9yIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZSBvciBwcm9maXRzIG9yCisgKiBvdGhlciBzcGVjaWFsLCBpbmRpcmVjdCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLgorICoKKyAqIElmIHRoaXMgbW9kZSBpcyB3ZWlyZCBhbmQgeW91IGhhdmUgYW4gb2xkIE1ldHJvWCBzZXJ2ZXIsIGl0IGlzIGJ1Z2d5LgorICogVGhlcmUgaXMgYSBmcmVlIFN1U0UtZW5oYW5jZWQgTWV0cm9YIFggc2VydmVyIHRoYXQgaXMgZmluZS4KKyAqCisgKiBXaGVuIHNob3duIGlmcywgRGlhbmEgUm9zZSAoNCB5ZWFycyBvbGQpIHNhaWQsICJJdCBsb29rcyBsaWtlIGRhbmNpbmcuIgorICoKKyAqIFJldmlzaW9uIEhpc3Rvcnk6CisgKiAxMy1EZWMtMjAwMzogQWRkZWQgc29tZSBnb29tIHNwZWNpZmljIHN0dWZmcyAodG8gbWFrZSBpZnMgYSBWaXN1YWxGWCkuCisgKiAxMS1BcHItMjAwMjogamVrb0Bpb3Mtc29mdHdhcmUuY29tOiBNYWtlIGlmcy5jIHN5c3RlbS1pbmRlbmRhbnQuIChpZnMuaCBhZGRlZCkKKyAqIDAxLU5vdi0yMDAwOiBBbGxvY2F0aW9uIGNoZWNrcworICogMTAtTWF5LTE5OTc6IGp3ekBqd3oub3JnOiB0dXJuZWQgaW50byBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KKyAqICAgICAgICAgICAgICBNYWRlIGl0IHJlbmRlciBpbnRvIGFuIG9mZnNjcmVlbiBiaXRtYXAgYW5kIHRoZW4gY29weQorICogICAgICAgICAgICAgIHRoYXQgb250byB0aGUgc2NyZWVuLCB0byByZWR1Y2UgZmxpY2tlci4KKyAqLworCisvKiAjaWZkZWYgU1RBTkRBTE9ORSAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJnb29tX2NvbmZpZy5oIgorCisjaWZkZWYgSEFWRV9NTVgKKyNpbmNsdWRlICJtbXguaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ29vbV9ncmFwaGljLmgiCisjaW5jbHVkZSAiaWZzLmgiCisjaW5jbHVkZSAiZ29vbV90b29scy5oIgorCit0eXBlZGVmIHN0cnVjdCBfaWZzUG9pbnQKK3sKKyAgZ2ludDMyIHgsIHk7Cit9CitJRlNQb2ludDsKKworCisjZGVmaW5lIE1PREVfaWZzCisKKyNkZWZpbmUgUFJPR0NMQVNTICJJRlMiCisKKyNkZWZpbmUgSEFDS19JTklUIGluaXRfaWZzCisjZGVmaW5lIEhBQ0tfRFJBVyBkcmF3X2lmcworCisjZGVmaW5lIGlmc19vcHRzIHhsb2NrbW9yZV9vcHRzCisKKyNkZWZpbmUgREVGQVVMVFMgIipkZWxheTogMjAwMDAgXG4iIFwKKyIqbmNvbG9yczogMTAwIFxuIgorCisjZGVmaW5lIFNNT09USF9DT0xPUlMKKworI2RlZmluZSBMUkFORCgpICAgICAgICAgICAgKChsb25nKSAoZ29vbV9yYW5kb20oZ29vbUluZm8tPmdSYW5kb20pICYgMHg3ZmZmZmZmZikpCisjZGVmaW5lIE5SQU5EKG4pICAgICAgICAgICAoKGludCkgKExSQU5EKCkgJSAobikpKQorCisjaWYgUkFORF9NQVggPCAweDEwMDAwCisjZGVmaW5lIE1BWFJBTkQgKCgoZmxvYXQpKFJBTkRfTUFYPDE2KSsoKGZsb2F0KVJBTkRfTUFYKSsxLjBmKS8xMjcuMGYpCisjZWxzZQorI2RlZmluZSBNQVhSQU5EICAgICAgICAgICAgKDIxNDc0ODM2NDguMC8xMjcuMCkgLyogdW5zaWduZWQgMTw8MzEgLyAxMjcuMCAoY2YgZ29vbV90b29scykgYXMgYSBmbG9hdCAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBmbG9hdCBEQkw7Cit0eXBlZGVmIGludCBGX1BUOworCisvKiB0eXBlZGVmIGZsb2F0ICAgICAgICAgICAgICAgRl9QVDsgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZJWCAxMgorI2RlZmluZSBVTklUICAgKCAxPDxGSVggKQorI2RlZmluZSBNQVhfU0lNSSAgNgorCisjZGVmaW5lIE1BWF9ERVBUSF8yICAxMAorI2RlZmluZSBNQVhfREVQVEhfMyAgNgorI2RlZmluZSBNQVhfREVQVEhfNCAgNAorI2RlZmluZSBNQVhfREVQVEhfNSAgMgorCisvKiBQUkVWSU9VUyBWQUxVRSAKKyNkZWZpbmUgTUFYX1NJTUkgIDYKKworICogc2V0dGluZ3MgZm9yIGEgUEMgMTIwTWh6Li4uICoKKyNkZWZpbmUgTUFYX0RFUFRIXzIgIDEwCisjZGVmaW5lIE1BWF9ERVBUSF8zICA2CisjZGVmaW5lIE1BWF9ERVBUSF80ICA0CisjZGVmaW5lIE1BWF9ERVBUSF81ICAzCisqLworCisjZGVmaW5lIERCTF9Ub19GX1BUKHgpICAoRl9QVCkoIChEQkwpKFVOSVQpKih4KSApCisKK3R5cGVkZWYgc3RydWN0IFNpbWlsaXR1ZGVfU3RydWN0IFNJTUk7Cit0eXBlZGVmIHN0cnVjdCBGcmFjdGFsX1N0cnVjdCBGUkFDVEFMOworCitzdHJ1Y3QgU2ltaWxpdHVkZV9TdHJ1Y3QKK3sKKworICBEQkwgY194LCBjX3k7CisgIERCTCByLCByMiwgQSwgQTI7CisgIEZfUFQgQ3QsIFN0LCBDdDIsIFN0MjsKKyAgRl9QVCBDeCwgQ3k7CisgIEZfUFQgUiwgUjI7Cit9OworCisKK3N0cnVjdCBGcmFjdGFsX1N0cnVjdAoreworCisgIGludCBOYl9TaW1pOworICBTSU1JIENvbXBvbmVudHNbNSAqIE1BWF9TSU1JXTsKKyAgaW50IERlcHRoLCBDb2w7CisgIGludCBDb3VudCwgU3BlZWQ7CisgIGludCBXaWR0aCwgSGVpZ2h0LCBMeCwgTHk7CisgIERCTCByX21lYW4sIGRyX21lYW4sIGRyMl9tZWFuOworICBpbnQgQ3VyX1B0LCBNYXhfUHQ7CisKKyAgSUZTUG9pbnQgKkJ1ZmZlcjEsICpCdWZmZXIyOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX0lGU19EQVRBCit7CisgIEZSQUNUQUwgKlJvb3Q7CisgIEZSQUNUQUwgKkN1cl9GOworCisgIC8qIFVzZWQgYnkgdGhlIFRyYWNlIHJlY3Vyc2l2ZSBtZXRob2QgKi8KKyAgSUZTUG9pbnQgKkJ1ZjsKKyAgaW50IEN1cl9QdDsKKyAgaW50IGluaXRhbGl6ZWQ7Cit9IElmc0RhdGE7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgREJMCitHYXVzc19SYW5kIChQbHVnaW5JbmZvICogZ29vbUluZm8sIERCTCBjLCBEQkwgQSwgREJMIFMpCit7CisgIERCTCB5OworCisgIHkgPSAoREJMKSBMUkFORCAoKSAvIE1BWFJBTkQ7CisgIHkgPSBBICogKDEuMCAtIGV4cCAoLXkgKiB5ICogUykpIC8gKDEuMCAtIGV4cCAoLVMpKTsKKyAgaWYgKE5SQU5EICgyKSkKKyAgICByZXR1cm4gKGMgKyB5KTsKKyAgcmV0dXJuIChjIC0geSk7Cit9CisKK3N0YXRpYyBEQkwKK0hhbGZfR2F1c3NfUmFuZCAoUGx1Z2luSW5mbyAqIGdvb21JbmZvLCBEQkwgYywgREJMIEEsIERCTCBTKQoreworICBEQkwgeTsKKworICB5ID0gKERCTCkgTFJBTkQgKCkgLyBNQVhSQU5EOworICB5ID0gQSAqICgxLjAgLSBleHAgKC15ICogeSAqIFMpKSAvICgxLjAgLSBleHAgKC1TKSk7CisgIHJldHVybiAoYyArIHkpOworfQorCitzdGF0aWMgdm9pZAorUmFuZG9tX1NpbWlzIChQbHVnaW5JbmZvICogZ29vbUluZm8sIEZSQUNUQUwgKiBGLCBTSU1JICogQ3VyLCBpbnQgaSkKK3sKKyAgd2hpbGUgKGktLSkgeworICAgIEN1ci0+Y194ID0gR2F1c3NfUmFuZCAoZ29vbUluZm8sIDAuMCwgLjgsIDQuMCk7CisgICAgQ3VyLT5jX3kgPSBHYXVzc19SYW5kIChnb29tSW5mbywgMC4wLCAuOCwgNC4wKTsKKyAgICBDdXItPnIgPSBHYXVzc19SYW5kIChnb29tSW5mbywgRi0+cl9tZWFuLCBGLT5kcl9tZWFuLCAzLjApOworICAgIEN1ci0+cjIgPSBIYWxmX0dhdXNzX1JhbmQgKGdvb21JbmZvLCAwLjAsIEYtPmRyMl9tZWFuLCAyLjApOworICAgIEN1ci0+QSA9IEdhdXNzX1JhbmQgKGdvb21JbmZvLCAwLjAsIDM2MC4wLCA0LjApICogKEdfUEkgLyAxODAuMCk7CisgICAgQ3VyLT5BMiA9IEdhdXNzX1JhbmQgKGdvb21JbmZvLCAwLjAsIDM2MC4wLCA0LjApICogKEdfUEkgLyAxODAuMCk7CisgICAgQ3VyKys7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2ZyZWVfaWZzX2J1ZmZlcnMgKEZSQUNUQUwgKiBGcmFjdGFsKQoreworICBpZiAoRnJhY3RhbC0+QnVmZmVyMSAhPSBOVUxMKSB7CisgICAgKHZvaWQpIGZyZWUgKCh2b2lkICopIEZyYWN0YWwtPkJ1ZmZlcjEpOworICAgIEZyYWN0YWwtPkJ1ZmZlcjEgPSAoSUZTUG9pbnQgKikgTlVMTDsKKyAgfQorICBpZiAoRnJhY3RhbC0+QnVmZmVyMiAhPSBOVUxMKSB7CisgICAgKHZvaWQpIGZyZWUgKCh2b2lkICopIEZyYWN0YWwtPkJ1ZmZlcjIpOworICAgIEZyYWN0YWwtPkJ1ZmZlcjIgPSAoSUZTUG9pbnQgKikgTlVMTDsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitmcmVlX2lmcyAoRlJBQ1RBTCAqIEZyYWN0YWwpCit7CisgIGZyZWVfaWZzX2J1ZmZlcnMgKEZyYWN0YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAoraW5pdF9pZnMgKFBsdWdpbkluZm8gKiBnb29tSW5mbywgSWZzRGF0YSAqIGRhdGEpCit7CisgIGludCBpOworICBGUkFDVEFMICpGcmFjdGFsOworICBpbnQgd2lkdGggPSBnb29tSW5mby0+c2NyZWVuLndpZHRoOworICBpbnQgaGVpZ2h0ID0gZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQ7CisKKyAgaWYgKGRhdGEtPlJvb3QgPT0gTlVMTCkgeworICAgIGRhdGEtPlJvb3QgPSAoRlJBQ1RBTCAqKSBtYWxsb2MgKHNpemVvZiAoRlJBQ1RBTCkpOworICAgIGlmIChkYXRhLT5Sb290ID09IE5VTEwpCisgICAgICByZXR1cm47CisgICAgZGF0YS0+Um9vdC0+QnVmZmVyMSA9IChJRlNQb2ludCAqKSBOVUxMOworICAgIGRhdGEtPlJvb3QtPkJ1ZmZlcjIgPSAoSUZTUG9pbnQgKikgTlVMTDsKKyAgfQorICBGcmFjdGFsID0gZGF0YS0+Um9vdDsKKworICBmcmVlX2lmc19idWZmZXJzIChGcmFjdGFsKTsKKworICBpID0gKE5SQU5EICg0KSkgKyAyOyAgICAgICAgICAvKiBOdW1iZXIgb2YgY2VudGVycyAqLworICBzd2l0Y2ggKGkpIHsKKyAgICBjYXNlIDM6CisgICAgICBGcmFjdGFsLT5EZXB0aCA9IE1BWF9ERVBUSF8zOworICAgICAgRnJhY3RhbC0+cl9tZWFuID0gLjY7CisgICAgICBGcmFjdGFsLT5kcl9tZWFuID0gLjQ7CisgICAgICBGcmFjdGFsLT5kcjJfbWVhbiA9IC4zOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDQ6CisgICAgICBGcmFjdGFsLT5EZXB0aCA9IE1BWF9ERVBUSF80OworICAgICAgRnJhY3RhbC0+cl9tZWFuID0gLjU7CisgICAgICBGcmFjdGFsLT5kcl9tZWFuID0gLjQ7CisgICAgICBGcmFjdGFsLT5kcjJfbWVhbiA9IC4zOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDU6CisgICAgICBGcmFjdGFsLT5EZXB0aCA9IE1BWF9ERVBUSF81OworICAgICAgRnJhY3RhbC0+cl9tZWFuID0gLjU7CisgICAgICBGcmFjdGFsLT5kcl9tZWFuID0gLjQ7CisgICAgICBGcmFjdGFsLT5kcjJfbWVhbiA9IC4zOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgMjoKKyAgICAgIEZyYWN0YWwtPkRlcHRoID0gTUFYX0RFUFRIXzI7CisgICAgICBGcmFjdGFsLT5yX21lYW4gPSAuNzsKKyAgICAgIEZyYWN0YWwtPmRyX21lYW4gPSAuMzsKKyAgICAgIEZyYWN0YWwtPmRyMl9tZWFuID0gLjQ7CisgICAgICBicmVhazsKKyAgfQorICBGcmFjdGFsLT5OYl9TaW1pID0gaTsKKyAgRnJhY3RhbC0+TWF4X1B0ID0gRnJhY3RhbC0+TmJfU2ltaSAtIDE7CisgIGZvciAoaSA9IDA7IGkgPD0gRnJhY3RhbC0+RGVwdGggKyAyOyArK2kpCisgICAgRnJhY3RhbC0+TWF4X1B0ICo9IEZyYWN0YWwtPk5iX1NpbWk7CisKKyAgaWYgKChGcmFjdGFsLT5CdWZmZXIxID0gKElGU1BvaW50ICopIGNhbGxvYyAoRnJhY3RhbC0+TWF4X1B0LAorICAgICAgICAgICAgICBzaXplb2YgKElGU1BvaW50KSkpID09IE5VTEwpIHsKKyAgICBmcmVlX2lmcyAoRnJhY3RhbCk7CisgICAgcmV0dXJuOworICB9CisgIGlmICgoRnJhY3RhbC0+QnVmZmVyMiA9IChJRlNQb2ludCAqKSBjYWxsb2MgKEZyYWN0YWwtPk1heF9QdCwKKyAgICAgICAgICAgICAgc2l6ZW9mIChJRlNQb2ludCkpKSA9PSBOVUxMKSB7CisgICAgZnJlZV9pZnMgKEZyYWN0YWwpOworICAgIHJldHVybjsKKyAgfQorCisgIEZyYWN0YWwtPlNwZWVkID0gNjsKKyAgRnJhY3RhbC0+V2lkdGggPSB3aWR0aDsgICAgICAgLyogbW9kaWYgYnkgSmVLbyAqLworICBGcmFjdGFsLT5IZWlnaHQgPSBoZWlnaHQ7ICAgICAvKiBtb2RpZiBieSBKZUtvICovCisgIEZyYWN0YWwtPkN1cl9QdCA9IDA7CisgIEZyYWN0YWwtPkNvdW50ID0gMDsKKyAgRnJhY3RhbC0+THggPSAoRnJhY3RhbC0+V2lkdGggLSAxKSAvIDI7CisgIEZyYWN0YWwtPkx5ID0gKEZyYWN0YWwtPkhlaWdodCAtIDEpIC8gMjsKKyAgRnJhY3RhbC0+Q29sID0gcmFuZCAoKSAlICh3aWR0aCAqIGhlaWdodCk7ICAgIC8qIG1vZGlmIGJ5IEplS28gKi8KKworICBSYW5kb21fU2ltaXMgKGdvb21JbmZvLCBGcmFjdGFsLCBGcmFjdGFsLT5Db21wb25lbnRzLCA1ICogTUFYX1NJTUkpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorVHJhbnNmb3JtIChTSU1JICogU2ltaSwgRl9QVCB4bywgRl9QVCB5bywgRl9QVCAqIHgsIEZfUFQgKiB5KQoreworICBGX1BUIHh4LCB5eTsKKworICB4byA9IHhvIC0gU2ltaS0+Q3g7CisgIHhvID0gKHhvICogU2ltaS0+UikgPj4gRklYOyAgIC8qIC8gVU5JVDsgKi8KKyAgeW8gPSB5byAtIFNpbWktPkN5OworICB5byA9ICh5byAqIFNpbWktPlIpID4+IEZJWDsgICAvKiAvIFVOSVQ7ICovCisKKyAgeHggPSB4byAtIFNpbWktPkN4OworICB4eCA9ICh4eCAqIFNpbWktPlIyKSA+PiBGSVg7ICAvKiAvIFVOSVQ7ICovCisgIHl5ID0gLXlvIC0gU2ltaS0+Q3k7CisgIHl5ID0gKHl5ICogU2ltaS0+UjIpID4+IEZJWDsgIC8qIC8gVU5JVDsgKi8KKworICAqeCA9ICgoeG8gKiBTaW1pLT5DdCAtIHlvICogU2ltaS0+U3QgKyB4eCAqIFNpbWktPkN0MiAtIHl5ICogU2ltaS0+U3QyKQorICAgICAgPj4gRklYIC8qIC8gVU5JVCAqLyApICsgU2ltaS0+Q3g7CisgICp5ID0gKCh4byAqIFNpbWktPlN0ICsgeW8gKiBTaW1pLT5DdCArIHh4ICogU2ltaS0+U3QyICsgeXkgKiBTaW1pLT5DdDIpCisgICAgICA+PiBGSVggLyogLyBVTklUICovICkgKyBTaW1pLT5DeTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK1RyYWNlIChGUkFDVEFMICogRiwgRl9QVCB4bywgRl9QVCB5bywgSWZzRGF0YSAqIGRhdGEpCit7CisgIEZfUFQgeCwgeSwgaTsKKyAgU0lNSSAqQ3VyOworCisgIEN1ciA9IGRhdGEtPkN1cl9GLT5Db21wb25lbnRzOworICBmb3IgKGkgPSBkYXRhLT5DdXJfRi0+TmJfU2ltaTsgaTsgLS1pLCBDdXIrKykgeworICAgIFRyYW5zZm9ybSAoQ3VyLCB4bywgeW8sICZ4LCAmeSk7CisKKyAgICBkYXRhLT5CdWYtPnggPSBGLT5MeCArICgoeCAqIEYtPkx4KSA+PiAoRklYICsgMSkgLyogLyhVTklUKjIpICovICk7CisgICAgZGF0YS0+QnVmLT55ID0gRi0+THkgLSAoKHkgKiBGLT5MeSkgPj4gKEZJWCArIDEpIC8qIC8oVU5JVCoyKSAqLyApOworICAgIGRhdGEtPkJ1ZisrOworCisgICAgZGF0YS0+Q3VyX1B0Kys7CisKKyAgICBpZiAoRi0+RGVwdGggJiYgKCh4IC0geG8pID4+IDQpICYmICgoeSAtIHlvKSA+PiA0KSkgeworICAgICAgRi0+RGVwdGgtLTsKKyAgICAgIFRyYWNlIChGLCB4LCB5LCBkYXRhKTsKKyAgICAgIEYtPkRlcHRoKys7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitEcmF3X0ZyYWN0YWwgKElmc0RhdGEgKiBkYXRhKQoreworICBGUkFDVEFMICpGID0gZGF0YS0+Um9vdDsKKyAgaW50IGksIGo7CisgIEZfUFQgeCwgeSwgeG8sIHlvOworICBTSU1JICpDdXIsICpTaW1pOworCisgIGZvciAoQ3VyID0gRi0+Q29tcG9uZW50cywgaSA9IEYtPk5iX1NpbWk7IGk7IC0taSwgQ3VyKyspIHsKKyAgICBDdXItPkN4ID0gREJMX1RvX0ZfUFQgKEN1ci0+Y194KTsKKyAgICBDdXItPkN5ID0gREJMX1RvX0ZfUFQgKEN1ci0+Y195KTsKKworICAgIEN1ci0+Q3QgPSBEQkxfVG9fRl9QVCAoY29zIChDdXItPkEpKTsKKyAgICBDdXItPlN0ID0gREJMX1RvX0ZfUFQgKHNpbiAoQ3VyLT5BKSk7CisgICAgQ3VyLT5DdDIgPSBEQkxfVG9fRl9QVCAoY29zIChDdXItPkEyKSk7CisgICAgQ3VyLT5TdDIgPSBEQkxfVG9fRl9QVCAoc2luIChDdXItPkEyKSk7CisKKyAgICBDdXItPlIgPSBEQkxfVG9fRl9QVCAoQ3VyLT5yKTsKKyAgICBDdXItPlIyID0gREJMX1RvX0ZfUFQgKEN1ci0+cjIpOworICB9CisKKworICBkYXRhLT5DdXJfUHQgPSAwOworICBkYXRhLT5DdXJfRiA9IEY7CisgIGRhdGEtPkJ1ZiA9IEYtPkJ1ZmZlcjI7CisgIGZvciAoQ3VyID0gRi0+Q29tcG9uZW50cywgaSA9IEYtPk5iX1NpbWk7IGk7IC0taSwgQ3VyKyspIHsKKyAgICB4byA9IEN1ci0+Q3g7CisgICAgeW8gPSBDdXItPkN5OworICAgIGZvciAoU2ltaSA9IEYtPkNvbXBvbmVudHMsIGogPSBGLT5OYl9TaW1pOyBqOyAtLWosIFNpbWkrKykgeworICAgICAgaWYgKFNpbWkgPT0gQ3VyKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIFRyYW5zZm9ybSAoU2ltaSwgeG8sIHlvLCAmeCwgJnkpOworICAgICAgVHJhY2UgKEYsIHgsIHksIGRhdGEpOworICAgIH0KKyAgfQorCisgIC8qIEVyYXNlIHByZXZpb3VzICovCisKKyAgRi0+Q3VyX1B0ID0gZGF0YS0+Q3VyX1B0OworICBkYXRhLT5CdWYgPSBGLT5CdWZmZXIxOworICBGLT5CdWZmZXIxID0gRi0+QnVmZmVyMjsKKyAgRi0+QnVmZmVyMiA9IGRhdGEtPkJ1ZjsKK30KKworCitzdGF0aWMgSUZTUG9pbnQgKgorZHJhd19pZnMgKFBsdWdpbkluZm8gKiBnb29tSW5mbywgaW50ICpuYnB0LCBJZnNEYXRhICogZGF0YSkKK3sKKyAgaW50IGk7CisgIERCTCB1LCB1dSwgdiwgdnYsIHUwLCB1MSwgdTIsIHUzOworICBTSU1JICpTLCAqUzEsICpTMiwgKlMzLCAqUzQ7CisgIEZSQUNUQUwgKkY7CisKKyAgaWYgKGRhdGEtPlJvb3QgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgRiA9IGRhdGEtPlJvb3Q7CisgIGlmIChGLT5CdWZmZXIxID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgdSA9IChEQkwpIChGLT5Db3VudCkgKiAoREJMKSAoRi0+U3BlZWQpIC8gMTAwMC4wOworICB1dSA9IHUgKiB1OworICB2ID0gMS4wIC0gdTsKKyAgdnYgPSB2ICogdjsKKyAgdTAgPSB2diAqIHY7CisgIHUxID0gMy4wICogdnYgKiB1OworICB1MiA9IDMuMCAqIHYgKiB1dTsKKyAgdTMgPSB1ICogdXU7CisKKyAgUyA9IEYtPkNvbXBvbmVudHM7CisgIFMxID0gUyArIEYtPk5iX1NpbWk7CisgIFMyID0gUzEgKyBGLT5OYl9TaW1pOworICBTMyA9IFMyICsgRi0+TmJfU2ltaTsKKyAgUzQgPSBTMyArIEYtPk5iX1NpbWk7CisKKyAgZm9yIChpID0gRi0+TmJfU2ltaTsgaTsgLS1pLCBTKyssIFMxKyssIFMyKyssIFMzKyssIFM0KyspIHsKKyAgICBTLT5jX3ggPSB1MCAqIFMxLT5jX3ggKyB1MSAqIFMyLT5jX3ggKyB1MiAqIFMzLT5jX3ggKyB1MyAqIFM0LT5jX3g7CisgICAgUy0+Y195ID0gdTAgKiBTMS0+Y195ICsgdTEgKiBTMi0+Y195ICsgdTIgKiBTMy0+Y195ICsgdTMgKiBTNC0+Y195OworICAgIFMtPnIgPSB1MCAqIFMxLT5yICsgdTEgKiBTMi0+ciArIHUyICogUzMtPnIgKyB1MyAqIFM0LT5yOworICAgIFMtPnIyID0gdTAgKiBTMS0+cjIgKyB1MSAqIFMyLT5yMiArIHUyICogUzMtPnIyICsgdTMgKiBTNC0+cjI7CisgICAgUy0+QSA9IHUwICogUzEtPkEgKyB1MSAqIFMyLT5BICsgdTIgKiBTMy0+QSArIHUzICogUzQtPkE7CisgICAgUy0+QTIgPSB1MCAqIFMxLT5BMiArIHUxICogUzItPkEyICsgdTIgKiBTMy0+QTIgKyB1MyAqIFM0LT5BMjsKKyAgfQorCisgIERyYXdfRnJhY3RhbCAoZGF0YSk7CisKKyAgaWYgKEYtPkNvdW50ID49IDEwMDAgLyBGLT5TcGVlZCkgeworICAgIFMgPSBGLT5Db21wb25lbnRzOworICAgIFMxID0gUyArIEYtPk5iX1NpbWk7CisgICAgUzIgPSBTMSArIEYtPk5iX1NpbWk7CisgICAgUzMgPSBTMiArIEYtPk5iX1NpbWk7CisgICAgUzQgPSBTMyArIEYtPk5iX1NpbWk7CisKKyAgICBmb3IgKGkgPSBGLT5OYl9TaW1pOyBpOyAtLWksIFMrKywgUzErKywgUzIrKywgUzMrKywgUzQrKykgeworICAgICAgUzItPmNfeCA9IDIuMCAqIFM0LT5jX3ggLSBTMy0+Y194OworICAgICAgUzItPmNfeSA9IDIuMCAqIFM0LT5jX3kgLSBTMy0+Y195OworICAgICAgUzItPnIgPSAyLjAgKiBTNC0+ciAtIFMzLT5yOworICAgICAgUzItPnIyID0gMi4wICogUzQtPnIyIC0gUzMtPnIyOworICAgICAgUzItPkEgPSAyLjAgKiBTNC0+QSAtIFMzLT5BOworICAgICAgUzItPkEyID0gMi4wICogUzQtPkEyIC0gUzMtPkEyOworCisgICAgICAqUzEgPSAqUzQ7CisgICAgfQorICAgIFJhbmRvbV9TaW1pcyAoZ29vbUluZm8sIEYsIEYtPkNvbXBvbmVudHMgKyAzICogRi0+TmJfU2ltaSwgRi0+TmJfU2ltaSk7CisKKyAgICBSYW5kb21fU2ltaXMgKGdvb21JbmZvLCBGLCBGLT5Db21wb25lbnRzICsgNCAqIEYtPk5iX1NpbWksIEYtPk5iX1NpbWkpOworCisgICAgRi0+Q291bnQgPSAwOworICB9IGVsc2UKKyAgICBGLT5Db3VudCsrOworCisgIEYtPkNvbCsrOworCisgICgqbmJwdCkgPSBkYXRhLT5DdXJfUHQ7CisgIHJldHVybiBGLT5CdWZmZXIyOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCityZWxlYXNlX2lmcyAoSWZzRGF0YSAqIGRhdGEpCit7CisgIGlmIChkYXRhLT5Sb290ICE9IE5VTEwpIHsKKyAgICBmcmVlX2lmcyAoZGF0YS0+Um9vdCk7CisgICAgKHZvaWQpIGZyZWUgKCh2b2lkICopIGRhdGEtPlJvb3QpOworICAgIGRhdGEtPlJvb3QgPSAoRlJBQ1RBTCAqKSBOVUxMOworICB9Cit9CisKKyNkZWZpbmUgUkFORCgpIGdvb21fcmFuZG9tKGdvb21JbmZvLT5nUmFuZG9tKQorCitzdGF0aWMgdm9pZAoraWZzX3VwZGF0ZSAoUGx1Z2luSW5mbyAqIGdvb21JbmZvLCBQaXhlbCAqIGRhdGEsIFBpeGVsICogYmFjaywgaW50IGluY3JlbWVudCwKKyAgICBJZnNEYXRhICogZnhfZGF0YSkKK3sKKyAgc3RhdGljIHVuc2lnbmVkIGludCBjb3VsZXVyID0gMHhjMGMwYzBjMDsKKyAgc3RhdGljIGludCB2WzRdID0geyAyLCA0LCAzLCAyIH07CisgIHN0YXRpYyBpbnQgY29sWzRdID0geyAyLCA0LCAzLCAyIH07CisKKyNkZWZpbmUgTU9EX01FUiAwCisjZGVmaW5lIE1PRF9GRVUgMQorI2RlZmluZSBNT0RfTUVSVkVSIDIKKyAgc3RhdGljIGludCBtb2RlID0gTU9EX01FUlZFUjsKKyAgc3RhdGljIGludCBqdXN0Q2hhbmdlZCA9IDA7CisgIHN0YXRpYyBpbnQgY3ljbGUgPSAwOworICBpbnQgY3ljbGUxMDsKKworICBpbnQgbmJwdCA9IDA7CisgIElGU1BvaW50ICpwb2ludHM7CisgIGludCBpOworCisgIHVuc2lnbmVkIGludCBjb3VsZXVyc2wgPSBjb3VsZXVyOworICBpbnQgd2lkdGggPSBnb29tSW5mby0+c2NyZWVuLndpZHRoOworICBpbnQgaGVpZ2h0ID0gZ29vbUluZm8tPnNjcmVlbi5oZWlnaHQ7CisKKyAgY3ljbGUrKzsKKyAgaWYgKGN5Y2xlID49IDgwKQorICAgIGN5Y2xlID0gMDsKKworICBpZiAoY3ljbGUgPCA0MCkKKyAgICBjeWNsZTEwID0gY3ljbGUgLyAxMDsKKyAgZWxzZQorICAgIGN5Y2xlMTAgPSA3IC0gY3ljbGUgLyAxMDsKKworICB7CisgICAgdW5zaWduZWQgY2hhciAqdG1wID0gKHVuc2lnbmVkIGNoYXIgKikgJmNvdWxldXJzbDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICp0bXAgPSAoKnRtcCkgPj4gY3ljbGUxMDsKKyAgICAgIHRtcCsrOworICAgIH0KKyAgfQorCisgIHBvaW50cyA9IGRyYXdfaWZzIChnb29tSW5mbywgJm5icHQsIGZ4X2RhdGEpOworICBuYnB0LS07CisKKyNpZmRlZiBIQVZFX01NWAorICBtb3ZkX20yciAoY291bGV1cnNsLCBtbTEpOworICBwdW5wY2tsZHFfcjJyIChtbTEsIG1tMSk7CisgIGZvciAoaSA9IDA7IGkgPCBuYnB0OyBpICs9IGluY3JlbWVudCkgeworICAgIGludCB4ID0gcG9pbnRzW2ldLng7CisgICAgaW50IHkgPSBwb2ludHNbaV0ueTsKKworICAgIGlmICgoeCA8IHdpZHRoKSAmJiAoeSA8IGhlaWdodCkgJiYgKHggPiAwKSAmJiAoeSA+IDApKSB7CisgICAgICBpbnQgcG9zID0geCArICh5ICogd2lkdGgpOworCisgICAgICBtb3ZkX20yciAoYmFja1twb3NdLCBtbTApOworICAgICAgcGFkZHVzYl9yMnIgKG1tMSwgbW0wKTsKKyAgICAgIG1vdmRfcjJtIChtbTAsIGRhdGFbcG9zXSk7CisgICAgfQorICB9CisgIGVtbXMgKCk7ICAgICAvKl9fYXNtX18gX192b2xhdGlsZV9fICgiZW1tcyIpOyovCisjZWxzZQorICBmb3IgKGkgPSAwOyBpIDwgbmJwdDsgaSArPSBpbmNyZW1lbnQpIHsKKyAgICBpbnQgeCA9IChpbnQpIHBvaW50c1tpXS54ICYgMHg3ZmZmZmZmZjsKKyAgICBpbnQgeSA9IChpbnQpIHBvaW50c1tpXS55ICYgMHg3ZmZmZmZmZjsKKworICAgIGlmICgoeCA8IHdpZHRoKSAmJiAoeSA8IGhlaWdodCkpIHsKKyAgICAgIGludCBwb3MgPSB4ICsgKGludCkgKHkgKiB3aWR0aCk7CisgICAgICBpbnQgdHJhID0gMCwgaSA9IDA7CisgICAgICB1bnNpZ25lZCBjaGFyICpicmEgPSAodW5zaWduZWQgY2hhciAqKSAmYmFja1twb3NdOworICAgICAgdW5zaWduZWQgY2hhciAqZHJhID0gKHVuc2lnbmVkIGNoYXIgKikgJmRhdGFbcG9zXTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmNyYSA9ICh1bnNpZ25lZCBjaGFyICopICZjb3VsZXVyc2w7CisKKyAgICAgIGZvciAoOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIHRyYSA9ICpjcmE7CisgICAgICAgIHRyYSArPSAqYnJhOworICAgICAgICBpZiAodHJhID4gMjU1KQorICAgICAgICAgIHRyYSA9IDI1NTsKKyAgICAgICAgKmRyYSA9IHRyYTsKKyAgICAgICAgKytkcmE7CisgICAgICAgICsrY3JhOworICAgICAgICArK2JyYTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZiAvKk1NWCovCisgICAgICBqdXN0Q2hhbmdlZC0tOworCisgIGNvbFtBTFBIQV0gPSBjb3VsZXVyID4+IChBTFBIQSAqIDgpICYgMHhmZjsKKyAgY29sW0JMRVVdID0gY291bGV1ciA+PiAoQkxFVSAqIDgpICYgMHhmZjsKKyAgY29sW1ZFUlRdID0gY291bGV1ciA+PiAoVkVSVCAqIDgpICYgMHhmZjsKKyAgY29sW1JPVUdFXSA9IGNvdWxldXIgPj4gKFJPVUdFICogOCkgJiAweGZmOworCisgIGlmIChtb2RlID09IE1PRF9NRVIpIHsKKyAgICBjb2xbQkxFVV0gKz0gdltCTEVVXTsKKyAgICBpZiAoY29sW0JMRVVdID4gMjU1KSB7CisgICAgICBjb2xbQkxFVV0gPSAyNTU7CisgICAgICB2W0JMRVVdID0gLShSQU5EICgpICUgNCkgLSAxOworICAgIH0KKyAgICBpZiAoY29sW0JMRVVdIDwgMzIpIHsKKyAgICAgIGNvbFtCTEVVXSA9IDMyOworICAgICAgdltCTEVVXSA9IChSQU5EICgpICUgNCkgKyAxOworICAgIH0KKworICAgIGNvbFtWRVJUXSArPSB2W1ZFUlRdOworICAgIGlmIChjb2xbVkVSVF0gPiAyMDApIHsKKyAgICAgIGNvbFtWRVJUXSA9IDIwMDsKKyAgICAgIHZbVkVSVF0gPSAtKFJBTkQgKCkgJSAzKSAtIDI7CisgICAgfQorICAgIGlmIChjb2xbVkVSVF0gPiBjb2xbQkxFVV0pIHsKKyAgICAgIGNvbFtWRVJUXSA9IGNvbFtCTEVVXTsKKyAgICAgIHZbVkVSVF0gPSB2W0JMRVVdOworICAgIH0KKyAgICBpZiAoY29sW1ZFUlRdIDwgMzIpIHsKKyAgICAgIGNvbFtWRVJUXSA9IDMyOworICAgICAgdltWRVJUXSA9IChSQU5EICgpICUgMykgKyAyOworICAgIH0KKworICAgIGNvbFtST1VHRV0gKz0gdltST1VHRV07CisgICAgaWYgKGNvbFtST1VHRV0gPiA2NCkgeworICAgICAgY29sW1JPVUdFXSA9IDY0OworICAgICAgdltST1VHRV0gPSAtKFJBTkQgKCkgJSA0KSAtIDE7CisgICAgfQorICAgIGlmIChjb2xbUk9VR0VdIDwgMCkgeworICAgICAgY29sW1JPVUdFXSA9IDA7CisgICAgICB2W1JPVUdFXSA9IChSQU5EICgpICUgNCkgKyAxOworICAgIH0KKworICAgIGNvbFtBTFBIQV0gKz0gdltBTFBIQV07CisgICAgaWYgKGNvbFtBTFBIQV0gPiAwKSB7CisgICAgICBjb2xbQUxQSEFdID0gMDsKKyAgICAgIHZbQUxQSEFdID0gLShSQU5EICgpICUgNCkgLSAxOworICAgIH0KKyAgICBpZiAoY29sW0FMUEhBXSA8IDApIHsKKyAgICAgIGNvbFtBTFBIQV0gPSAwOworICAgICAgdltBTFBIQV0gPSAoUkFORCAoKSAlIDQpICsgMTsKKyAgICB9CisKKyAgICBpZiAoKChjb2xbVkVSVF0gPiAzMikgJiYgKGNvbFtST1VHRV0gPCBjb2xbVkVSVF0gKyA0MCkKKyAgICAgICAgICAgICYmIChjb2xbVkVSVF0gPCBjb2xbUk9VR0VdICsgMjApICYmIChjb2xbQkxFVV0gPCA2NCkKKyAgICAgICAgICAgICYmIChSQU5EICgpICUgMjAgPT0gMCkpICYmIChqdXN0Q2hhbmdlZCA8IDApKSB7CisgICAgICBtb2RlID0gKFJBTkQgKCkgJSAzKSA/IE1PRF9GRVUgOiBNT0RfTUVSVkVSOworICAgICAganVzdENoYW5nZWQgPSAyNTA7CisgICAgfQorICB9IGVsc2UgaWYgKG1vZGUgPT0gTU9EX01FUlZFUikgeworICAgIGNvbFtCTEVVXSArPSB2W0JMRVVdOworICAgIGlmIChjb2xbQkxFVV0gPiAxMjgpIHsKKyAgICAgIGNvbFtCTEVVXSA9IDEyODsKKyAgICAgIHZbQkxFVV0gPSAtKFJBTkQgKCkgJSA0KSAtIDE7CisgICAgfQorICAgIGlmIChjb2xbQkxFVV0gPCAxNikgeworICAgICAgY29sW0JMRVVdID0gMTY7CisgICAgICB2W0JMRVVdID0gKFJBTkQgKCkgJSA0KSArIDE7CisgICAgfQorCisgICAgY29sW1ZFUlRdICs9IHZbVkVSVF07CisgICAgaWYgKGNvbFtWRVJUXSA+IDIwMCkgeworICAgICAgY29sW1ZFUlRdID0gMjAwOworICAgICAgdltWRVJUXSA9IC0oUkFORCAoKSAlIDMpIC0gMjsKKyAgICB9CisgICAgaWYgKGNvbFtWRVJUXSA+IGNvbFtBTFBIQV0pIHsKKyAgICAgIGNvbFtWRVJUXSA9IGNvbFtBTFBIQV07CisgICAgICB2W1ZFUlRdID0gdltBTFBIQV07CisgICAgfQorICAgIGlmIChjb2xbVkVSVF0gPCAzMikgeworICAgICAgY29sW1ZFUlRdID0gMzI7CisgICAgICB2W1ZFUlRdID0gKFJBTkQgKCkgJSAzKSArIDI7CisgICAgfQorCisgICAgY29sW1JPVUdFXSArPSB2W1JPVUdFXTsKKyAgICBpZiAoY29sW1JPVUdFXSA+IDEyOCkgeworICAgICAgY29sW1JPVUdFXSA9IDEyODsKKyAgICAgIHZbUk9VR0VdID0gLShSQU5EICgpICUgNCkgLSAxOworICAgIH0KKyAgICBpZiAoY29sW1JPVUdFXSA8IDApIHsKKyAgICAgIGNvbFtST1VHRV0gPSAwOworICAgICAgdltST1VHRV0gPSAoUkFORCAoKSAlIDQpICsgMTsKKyAgICB9CisKKyAgICBjb2xbQUxQSEFdICs9IHZbQUxQSEFdOworICAgIGlmIChjb2xbQUxQSEFdID4gMjU1KSB7CisgICAgICBjb2xbQUxQSEFdID0gMjU1OworICAgICAgdltBTFBIQV0gPSAtKFJBTkQgKCkgJSA0KSAtIDE7CisgICAgfQorICAgIGlmIChjb2xbQUxQSEFdIDwgMCkgeworICAgICAgY29sW0FMUEhBXSA9IDA7CisgICAgICB2W0FMUEhBXSA9IChSQU5EICgpICUgNCkgKyAxOworICAgIH0KKworICAgIGlmICgoKGNvbFtWRVJUXSA+IDMyKSAmJiAoY29sW1JPVUdFXSA8IGNvbFtWRVJUXSArIDQwKQorICAgICAgICAgICAgJiYgKGNvbFtWRVJUXSA8IGNvbFtST1VHRV0gKyAyMCkgJiYgKGNvbFtCTEVVXSA8IDY0KQorICAgICAgICAgICAgJiYgKFJBTkQgKCkgJSAyMCA9PSAwKSkgJiYgKGp1c3RDaGFuZ2VkIDwgMCkpIHsKKyAgICAgIG1vZGUgPSAoUkFORCAoKSAlIDMpID8gTU9EX0ZFVSA6IE1PRF9NRVI7CisgICAgICBqdXN0Q2hhbmdlZCA9IDI1MDsKKyAgICB9CisgIH0gZWxzZSBpZiAobW9kZSA9PSBNT0RfRkVVKSB7CisKKyAgICBjb2xbQkxFVV0gKz0gdltCTEVVXTsKKyAgICBpZiAoY29sW0JMRVVdID4gNjQpIHsKKyAgICAgIGNvbFtCTEVVXSA9IDY0OworICAgICAgdltCTEVVXSA9IC0oUkFORCAoKSAlIDQpIC0gMTsKKyAgICB9CisgICAgaWYgKGNvbFtCTEVVXSA8IDApIHsKKyAgICAgIGNvbFtCTEVVXSA9IDA7CisgICAgICB2W0JMRVVdID0gKFJBTkQgKCkgJSA0KSArIDE7CisgICAgfQorCisgICAgY29sW1ZFUlRdICs9IHZbVkVSVF07CisgICAgaWYgKGNvbFtWRVJUXSA+IDIwMCkgeworICAgICAgY29sW1ZFUlRdID0gMjAwOworICAgICAgdltWRVJUXSA9IC0oUkFORCAoKSAlIDMpIC0gMjsKKyAgICB9CisgICAgaWYgKGNvbFtWRVJUXSA+IGNvbFtST1VHRV0gKyAyMCkgeworICAgICAgY29sW1ZFUlRdID0gY29sW1JPVUdFXSArIDIwOworICAgICAgdltWRVJUXSA9IC0oUkFORCAoKSAlIDMpIC0gMjsKKyAgICAgIHZbUk9VR0VdID0gKFJBTkQgKCkgJSA0KSArIDE7CisgICAgICB2W0JMRVVdID0gKFJBTkQgKCkgJSA0KSArIDE7CisgICAgfQorICAgIGlmIChjb2xbVkVSVF0gPCAwKSB7CisgICAgICBjb2xbVkVSVF0gPSAwOworICAgICAgdltWRVJUXSA9IChSQU5EICgpICUgMykgKyAyOworICAgIH0KKworICAgIGNvbFtST1VHRV0gKz0gdltST1VHRV07CisgICAgaWYgKGNvbFtST1VHRV0gPiAyNTUpIHsKKyAgICAgIGNvbFtST1VHRV0gPSAyNTU7CisgICAgICB2W1JPVUdFXSA9IC0oUkFORCAoKSAlIDQpIC0gMTsKKyAgICB9CisgICAgaWYgKGNvbFtST1VHRV0gPiBjb2xbVkVSVF0gKyA0MCkgeworICAgICAgY29sW1JPVUdFXSA9IGNvbFtWRVJUXSArIDQwOworICAgICAgdltST1VHRV0gPSAtKFJBTkQgKCkgJSA0KSAtIDE7CisgICAgfQorICAgIGlmIChjb2xbUk9VR0VdIDwgMCkgeworICAgICAgY29sW1JPVUdFXSA9IDA7CisgICAgICB2W1JPVUdFXSA9IChSQU5EICgpICUgNCkgKyAxOworICAgIH0KKworICAgIGNvbFtBTFBIQV0gKz0gdltBTFBIQV07CisgICAgaWYgKGNvbFtBTFBIQV0gPiAwKSB7CisgICAgICBjb2xbQUxQSEFdID0gMDsKKyAgICAgIHZbQUxQSEFdID0gLShSQU5EICgpICUgNCkgLSAxOworICAgIH0KKyAgICBpZiAoY29sW0FMUEhBXSA8IDApIHsKKyAgICAgIGNvbFtBTFBIQV0gPSAwOworICAgICAgdltBTFBIQV0gPSAoUkFORCAoKSAlIDQpICsgMTsKKyAgICB9CisKKyAgICBpZiAoKChjb2xbUk9VR0VdIDwgNjQpICYmIChjb2xbVkVSVF0gPiAzMikgJiYgKGNvbFtWRVJUXSA8IGNvbFtCTEVVXSkKKyAgICAgICAgICAgICYmIChjb2xbQkxFVV0gPiAzMikKKyAgICAgICAgICAgICYmIChSQU5EICgpICUgMjAgPT0gMCkpICYmIChqdXN0Q2hhbmdlZCA8IDApKSB7CisgICAgICBtb2RlID0gKFJBTkQgKCkgJSAyKSA/IE1PRF9NRVIgOiBNT0RfTUVSVkVSOworICAgICAganVzdENoYW5nZWQgPSAyNTA7CisgICAgfQorICB9CisKKyAgY291bGV1ciA9IChjb2xbQUxQSEFdIDw8IChBTFBIQSAqIDgpKQorICAgICAgfCAoY29sW0JMRVVdIDw8IChCTEVVICogOCkpCisgICAgICB8IChjb2xbVkVSVF0gPDwgKFZFUlQgKiA4KSkKKyAgICAgIHwgKGNvbFtST1VHRV0gPDwgKFJPVUdFICogOCkpOworfQorCisvKiogVklTVUFMX0ZYIFdSQVBQRVIgRk9SIElGUyAqLworCitzdGF0aWMgdm9pZAoraWZzX3ZmeF9hcHBseSAoVmlzdWFsRlggKiBfdGhpcywgUGl4ZWwgKiBzcmMsIFBpeGVsICogZGVzdCwKKyAgICBQbHVnaW5JbmZvICogZ29vbUluZm8pCit7CisKKyAgSWZzRGF0YSAqZGF0YSA9IChJZnNEYXRhICopIF90aGlzLT5meF9kYXRhOworCisgIGlmICghZGF0YS0+aW5pdGFsaXplZCkgeworICAgIGRhdGEtPmluaXRhbGl6ZWQgPSAxOworICAgIGluaXRfaWZzIChnb29tSW5mbywgZGF0YSk7CisgIH0KKyAgaWZzX3VwZGF0ZSAoZ29vbUluZm8sIGRlc3QsIHNyYywgZ29vbUluZm8tPnVwZGF0ZS5pZnNfaW5jciwgZGF0YSk7CisgIC8qVE9ETzogdHJvdXZlciBtZWlsbGV1ciBzb2x1Y2UgcG91ciBpbmNyZW1lbnQgKG1ldHRyZSBsZSBjb2RlIGRlIGdlc3Rpb24gZGUgbCdpZnMgZGFucyBjZSBmaWNoaWVyOiBpZnNfdmZ4X2FwcGx5KSAqLworfQorCitzdGF0aWMgdm9pZAoraWZzX3ZmeF9pbml0IChWaXN1YWxGWCAqIF90aGlzLCBQbHVnaW5JbmZvICogaW5mbykKK3sKKworICBJZnNEYXRhICpkYXRhID0gKElmc0RhdGEgKikgbWFsbG9jIChzaXplb2YgKElmc0RhdGEpKTsKKworICBkYXRhLT5Sb290ID0gKEZSQUNUQUwgKikgTlVMTDsKKyAgZGF0YS0+aW5pdGFsaXplZCA9IDA7CisgIF90aGlzLT5meF9kYXRhID0gZGF0YTsKK30KKworc3RhdGljIHZvaWQKK2lmc192ZnhfZnJlZSAoVmlzdWFsRlggKiBfdGhpcykKK3sKKyAgSWZzRGF0YSAqZGF0YSA9IChJZnNEYXRhICopIF90aGlzLT5meF9kYXRhOworCisgIHJlbGVhc2VfaWZzIChkYXRhKTsKKyAgZnJlZSAoZGF0YSk7Cit9CisKK3ZvaWQKK2lmc192aXN1YWxmeF9jcmVhdGUgKFZpc3VhbEZYICogdmZ4KQoreworCisgIHZmeC0+aW5pdCA9IGlmc192ZnhfaW5pdDsKKyAgdmZ4LT5mcmVlID0gaWZzX3ZmeF9mcmVlOworICB2ZngtPmFwcGx5ID0gaWZzX3ZmeF9hcHBseTsKKyAgdmZ4LT5meF9kYXRhID0gTlVMTDsKKyAgdmZ4LT5wYXJhbXMgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vaWZzLmggYi9nc3QvZ29vbS9pZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDAzNzczCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vaWZzLmgKQEAgLTAsMCArMSw1NCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcgYnkgTWFzc2ltaW5vIFBhc2NhbCA8UGFzY2FsLk1hc3NpbW9uQGVucy5mcj4KKyAqCisgKiBpZnMuaDogbW9kaWZpZWQgaXRlcmF0ZWQgZnVuY3Rpb25zIHN5c3RlbSBmb3IgZ29vbS4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyAqIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCBBUyBJUyB3aXRoIG5vIHdhcnJhbnRpZXMgb2YgYW55IGtpbmQuICBUaGUgYXV0aG9yCisgKiBzaGFsbCBoYXZlIG5vIGxpYWJpbGl0eSB3aXRoIHJlc3BlY3QgdG8gdGhlIGluZnJpbmdlbWVudCBvZiBjb3B5cmlnaHRzLAorICogdHJhZGUgc2VjcmV0cyBvciBhbnkgcGF0ZW50cyBieSB0aGlzIGZpbGUgb3IgYW55IHBhcnQgdGhlcmVvZi4gIEluIG5vCisgKiBldmVudCB3aWxsIHRoZSBhdXRob3IgYmUgbGlhYmxlIGZvciBhbnkgbG9zdCByZXZlbnVlIG9yIHByb2ZpdHMgb3IKKyAqIG90aGVyIHNwZWNpYWwsIGluZGlyZWN0IGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMuCisgKgorICogSWYgdGhpcyBtb2RlIGlzIHdlaXJkIGFuZCB5b3UgaGF2ZSBhbiBvbGQgTWV0cm9YIHNlcnZlciwgaXQgaXMgYnVnZ3kuCisgKiBUaGVyZSBpcyBhIGZyZWUgU3VTRS1lbmhhbmNlZCBNZXRyb1ggWCBzZXJ2ZXIgdGhhdCBpcyBmaW5lLgorICoKKyAqIFdoZW4gc2hvd24gaWZzLCBEaWFuYSBSb3NlICg0IHllYXJzIG9sZCkgc2FpZCwgIkl0IGxvb2tzIGxpa2UgZGFuY2luZy4iCisgKgorICogUmV2aXNpb24gSGlzdG9yeToKKyAqIDEzLURlYy0yMDAzOiBBZGRlZCBzb21lIGdvb20gc3BlY2lmaWMgc3R1ZmZzICh0byBtYWtlIGlmcyBhIFZpc3VhbEZYKS4KKyAqIDExLUFwci0yMDAyOiBqZWtvQGlvcy1zb2Z0d2FyZS5jb206IE1ha2UgaWZzLmMgc3lzdGVtLWluZGVuZGFudC4gKGlmcy5oIGFkZGVkKQorICogMDEtTm92LTIwMDA6IEFsbG9jYXRpb24gY2hlY2tzCisgKiAxMC1NYXktMTk5Nzogand6QGp3ei5vcmc6IHR1cm5lZCBpbnRvIGEgc3RhbmRhbG9uZSBwcm9ncmFtLgorICogICAgICAgICAgICAgIE1hZGUgaXQgcmVuZGVyIGludG8gYW4gb2Zmc2NyZWVuIGJpdG1hcCBhbmQgdGhlbiBjb3B5CisgKiAgICAgICAgICAgICAgdGhhdCBvbnRvIHRoZSBzY3JlZW4sIHRvIHJlZHVjZSBmbGlja2VyLgorICovCisKKyNpZm5kZWYgSUZTX0gKKyNkZWZpbmUgSUZTX0gKKworI2luY2x1ZGUgImdvb21fY29uZmlnLmgiCisjaW5jbHVkZSAiZ29vbV9ncmFwaGljLmgiCisjaW5jbHVkZSAiZ29vbV9wbHVnaW5faW5mby5oIgorI2luY2x1ZGUgImdvb21fdmlzdWFsX2Z4LmgiCisKK3ZvaWQgaWZzX3Zpc3VhbGZ4X2NyZWF0ZShWaXN1YWxGWCAqdmZ4KTsKKworLyogaW5pdCBpZnMgZm9yIGEgKHdpZHRoKXgoaGVpZ2h0KSBvdXRwdXQuICogLwordm9pZCBpbml0X2lmcyAoUGx1Z2luSW5mbyAqZ29vbUluZm8sIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKy8gKiBkcmF3IGFuIGlmcyBvbiB0aGUgYnVmZmVyICh3aGljaCBzaXplIGlzIHdpZHRoICogaGVpZ2h0KQorICAgaW5jcmVtZW50IG1lYW5zIHRoYXQgd2UgZHJhdyAxL2luY3JlbWVudCBvZiB0aGUgaWZzJ3MgcG9pbnRzICogLwordm9pZCBpZnNfdXBkYXRlIChQbHVnaW5JbmZvICpnb29tSW5mbywgUGl4ZWwgKiBidWZmZXIsIFBpeGVsICogYmFjaywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgaW5jcmVtZW50KTsKKworLyAqIGZyZWUgYWxsIGlmcydzIGRhdGEuICogLwordm9pZCByZWxlYXNlX2lmcyAodm9pZCk7CisqLworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vbGluZXMuYyBiL2dzdC9nb29tL2xpbmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjMWVkYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL2xpbmVzLmMKQEAgLTAsMCArMSwyNTcgQEAKKy8qIEdvb20gUHJvamVjdAorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gaU9TLVNvZnR3YXJlCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImxpbmVzLmgiCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZ29vbV90b29scy5oIgorI2luY2x1ZGUgImRyYXdtZXRob2RzLmgiCisjaW5jbHVkZSAiZ29vbV9wbHVnaW5faW5mby5oIgorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIKK2xpZ2h0ZW4gKHVuc2lnbmVkIGNoYXIgdmFsdWUsIGZsb2F0IHBvd2VyKQoreworICBpbnQgdmFsID0gdmFsdWU7CisgIGZsb2F0IHQgPSAoZmxvYXQpIHZhbCAqIGxvZzEwIChwb3dlcikgLyAyLjA7CisKKyAgaWYgKHQgPiAwKSB7CisgICAgdmFsID0gKGludCkgdDsgICAgICAgICAgICAgIC8qICgzMi4wZiAqIGxvZyAodCkpOyAqLworICAgIGlmICh2YWwgPiAyNTUpCisgICAgICB2YWwgPSAyNTU7CisgICAgaWYgKHZhbCA8IDApCisgICAgICB2YWwgPSAwOworICAgIHJldHVybiB2YWw7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2xpZ2h0ZW5jb2xvciAoZ3VpbnQzMiAqIGNvbCwgZmxvYXQgcG93ZXIpCit7CisgIHVuc2lnbmVkIGNoYXIgKmNvbG9yOworCisgIGNvbG9yID0gKHVuc2lnbmVkIGNoYXIgKikgY29sOworICAqY29sb3IgPSBsaWdodGVuICgqY29sb3IsIHBvd2VyKTsKKyAgY29sb3IrKzsKKyAgKmNvbG9yID0gbGlnaHRlbiAoKmNvbG9yLCBwb3dlcik7CisgIGNvbG9yKys7CisgICpjb2xvciA9IGxpZ2h0ZW4gKCpjb2xvciwgcG93ZXIpOworICBjb2xvcisrOworICAqY29sb3IgPSBsaWdodGVuICgqY29sb3IsIHBvd2VyKTsKK30KKworCisKK3N0YXRpYyB2b2lkCitnZW5saW5lIChpbnQgaWQsIGZsb2F0IHBhcmFtLCBHTVVuaXRQb2ludGVyICogbCwgaW50IHJ4LCBpbnQgcnkpCit7CisgIGludCBpOworCisgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIEdNTF9ITElORToKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA1MTI7IGkrKykgeworICAgICAgICBsW2ldLnggPSAoKGZsb2F0KSBpICogcngpIC8gNTEyLjBmOworICAgICAgICBsW2ldLnkgPSBwYXJhbTsKKyAgICAgICAgbFtpXS5hbmdsZSA9IEdfUEkgLyAyLjBmOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIGNhc2UgR01MX1ZMSU5FOgorICAgICAgZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKSB7CisgICAgICAgIGxbaV0ueSA9ICgoZmxvYXQpIGkgKiByeSkgLyA1MTIuMGY7CisgICAgICAgIGxbaV0ueCA9IHBhcmFtOworICAgICAgICBsW2ldLmFuZ2xlID0gMC4wZjsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICBjYXNlIEdNTF9DSVJDTEU6CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspIHsKKyAgICAgICAgZmxvYXQgY29zYSwgc2luYTsKKworICAgICAgICBsW2ldLmFuZ2xlID0gMi4wZiAqIEdfUEkgKiAoZmxvYXQpIGkgLyA1MTIuMGY7CisgICAgICAgIGNvc2EgPSBwYXJhbSAqIGNvcyAobFtpXS5hbmdsZSk7CisgICAgICAgIHNpbmEgPSBwYXJhbSAqIHNpbiAobFtpXS5hbmdsZSk7CisgICAgICAgIGxbaV0ueCA9ICgoZmxvYXQpIHJ4IC8gMi4wZikgKyBjb3NhOworICAgICAgICBsW2ldLnkgPSAoZmxvYXQpIHJ5IC8gMi4wZiArIHNpbmE7CisgICAgICB9CisgICAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIGd1aW50MzIKK2dldGNvdWxldXIgKGludCBtb2RlKQoreworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIEdNTF9SRUQ6CisgICAgICByZXR1cm4gKDIzMCA8PCAoUk9VR0UgKiA4KSkgfCAoMTIwIDw8IChWRVJUICogOCkpIHwgKDE4IDw8IChCTEVVICogOCkpOworICAgIGNhc2UgR01MX09SQU5HRV9KOgorICAgICAgcmV0dXJuICgxMjAgPDwgKFZFUlQgKiA4KSkgfCAoMjUyIDw8IChST1VHRSAqIDgpKSB8ICgxOCA8PCAoQkxFVSAqIDgpKTsKKyAgICBjYXNlIEdNTF9PUkFOR0VfVjoKKyAgICAgIHJldHVybiAoMTYwIDw8IChWRVJUICogOCkpIHwgKDIzNiA8PCAoUk9VR0UgKiA4KSkgfCAoNDAgPDwgKEJMRVUgKiA4KSk7CisgICAgY2FzZSBHTUxfQkxFVUJMQU5DOgorICAgICAgcmV0dXJuICg0MCA8PCAoQkxFVSAqIDgpKSB8ICgyMjAgPDwgKFJPVUdFICogOCkpIHwgKDE0MCA8PCAoVkVSVCAqIDgpKTsKKyAgICBjYXNlIEdNTF9WRVJUOgorICAgICAgcmV0dXJuICgyMDAgPDwgKFZFUlQgKiA4KSkgfCAoODAgPDwgKFJPVUdFICogOCkpIHwgKDE4IDw8IChCTEVVICogOCkpOworICAgIGNhc2UgR01MX0JMRVU6CisgICAgICByZXR1cm4gKDI1MCA8PCAoQkxFVSAqIDgpKSB8ICgzMCA8PCAoVkVSVCAqIDgpKSB8ICg4MCA8PCAoUk9VR0UgKiA4KSk7CisgICAgY2FzZSBHTUxfQkxBQ0s6CisgICAgICByZXR1cm4gKDE2IDw8IChCTEVVICogOCkpIHwgKDE2IDw8IChWRVJUICogOCkpIHwgKDE2IDw8IChST1VHRSAqIDgpKTsKKyAgfQorICByZXR1cm4gMDsKK30KKwordm9pZAorZ29vbV9saW5lc19zZXRfcmVzIChHTUxpbmUgKiBnbWwsIGludCByeCwgaW50IHJ5KQoreworICBpZiAoZ21sICE9IE5VTEwpIHsKKyAgICBnbWwtPnNjcmVlblggPSByeDsKKyAgICBnbWwtPnNjcmVlblkgPSByeTsKKworICAgIGdlbmxpbmUgKGdtbC0+SURkZXN0LCBnbWwtPnBhcmFtLCBnbWwtPnBvaW50czIsIHJ4LCByeSk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAorZ29vbV9saW5lc19tb3ZlIChHTUxpbmUgKiBsKQoreworICBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciAqYzEsICpjMjsKKworICBmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspIHsKKyAgICBsLT5wb2ludHNbaV0ueCA9IChsLT5wb2ludHMyW2ldLnggKyAzOS4wZiAqIGwtPnBvaW50c1tpXS54KSAvIDQwLjBmOworICAgIGwtPnBvaW50c1tpXS55ID0gKGwtPnBvaW50czJbaV0ueSArIDM5LjBmICogbC0+cG9pbnRzW2ldLnkpIC8gNDAuMGY7CisgICAgbC0+cG9pbnRzW2ldLmFuZ2xlID0KKyAgICAgICAgKGwtPnBvaW50czJbaV0uYW5nbGUgKyAzOS4wZiAqIGwtPnBvaW50c1tpXS5hbmdsZSkgLyA0MC4wZjsKKyAgfQorCisgIGMxID0gKHVuc2lnbmVkIGNoYXIgKikgJmwtPmNvbG9yOworICBjMiA9ICh1bnNpZ25lZCBjaGFyICopICZsLT5jb2xvcjI7CisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICBpbnQgY2MxLCBjYzI7CisKKyAgICBjYzEgPSAqYzE7CisgICAgY2MyID0gKmMyOworICAgICpjMSA9ICh1bnNpZ25lZCBjaGFyKSAoKGNjMSAqIDYzICsgY2MyKSA+PiA2KTsKKyAgICArK2MxOworICAgICsrYzI7CisgIH0KKworICBsLT5wb3dlciArPSBsLT5wb3dpbmM7CisgIGlmIChsLT5wb3dlciA8IDEuMWYpIHsKKyAgICBsLT5wb3dlciA9IDEuMWY7CisgICAgbC0+cG93aW5jID0gKGZsb2F0KSAoZ29vbV9pcmFuZCAobC0+Z29vbUluZm8tPmdSYW5kb20sIDIwKSArIDEwKSAvIDMwMC4wZjsKKyAgfQorICBpZiAobC0+cG93ZXIgPiAxNy41ZikgeworICAgIGwtPnBvd2VyID0gMTcuNWY7CisgICAgbC0+cG93aW5jID0gLShmbG9hdCkgKGdvb21faXJhbmQgKGwtPmdvb21JbmZvLT5nUmFuZG9tLCAyMCkgKyAxMCkgLyAzMDAuMGY7CisgIH0KKworICBsLT5hbXBsaXR1ZGUgPSAoOTkuMGYgKiBsLT5hbXBsaXR1ZGUgKyBsLT5hbXBsaXR1ZGVGKSAvIDEwMC4wZjsKK30KKwordm9pZAorZ29vbV9saW5lc19zd2l0Y2hfdG8gKEdNTGluZSAqIGdtbCwgaW50IElEZGVzdCwKKyAgICBmbG9hdCBwYXJhbSwgZmxvYXQgYW1wbGl0dWRlLCBpbnQgY29sKQoreworICBnZW5saW5lIChJRGRlc3QsIHBhcmFtLCBnbWwtPnBvaW50czIsIGdtbC0+c2NyZWVuWCwgZ21sLT5zY3JlZW5ZKTsKKyAgZ21sLT5JRGRlc3QgPSBJRGRlc3Q7CisgIGdtbC0+cGFyYW0gPSBwYXJhbTsKKyAgZ21sLT5hbXBsaXR1ZGVGID0gYW1wbGl0dWRlOworICBnbWwtPmNvbG9yMiA9IGdldGNvdWxldXIgKGNvbCk7Cit9CisKK0dNTGluZSAqCitnb29tX2xpbmVzX2luaXQgKFBsdWdpbkluZm8gKiBnb29tSW5mbywgaW50IHJ4LCBpbnQgcnksCisgICAgaW50IElEc3JjLCBmbG9hdCBwYXJhbVMsIGludCBjb3VsUywgaW50IElEZGVzdCwgZmxvYXQgcGFyYW1ELCBpbnQgY291bEQpCit7CisgIEdNTGluZSAqbCA9IChHTUxpbmUgKikgbWFsbG9jIChzaXplb2YgKEdNTGluZSkpOworCisgIGwtPmdvb21JbmZvID0gZ29vbUluZm87CisKKyAgbC0+cG9pbnRzID0gKEdNVW5pdFBvaW50ZXIgKikgbWFsbG9jICg1MTIgKiBzaXplb2YgKEdNVW5pdFBvaW50ZXIpKTsKKyAgbC0+cG9pbnRzMiA9IChHTVVuaXRQb2ludGVyICopIG1hbGxvYyAoNTEyICogc2l6ZW9mIChHTVVuaXRQb2ludGVyKSk7CisgIGwtPm5iUG9pbnRzID0gNTEyOworCisgIGwtPklEZGVzdCA9IElEZGVzdDsKKyAgbC0+cGFyYW0gPSBwYXJhbUQ7CisKKyAgbC0+YW1wbGl0dWRlID0gbC0+YW1wbGl0dWRlRiA9IDEuMGY7CisKKyAgZ2VubGluZSAoSURzcmMsIHBhcmFtUywgbC0+cG9pbnRzLCByeCwgcnkpOworICBnZW5saW5lIChJRGRlc3QsIHBhcmFtRCwgbC0+cG9pbnRzMiwgcngsIHJ5KTsKKworICBsLT5jb2xvciA9IGdldGNvdWxldXIgKGNvdWxTKTsKKyAgbC0+Y29sb3IyID0gZ2V0Y291bGV1ciAoY291bEQpOworCisgIGwtPnNjcmVlblggPSByeDsKKyAgbC0+c2NyZWVuWSA9IHJ5OworCisgIGwtPnBvd2VyID0gMC4wZjsKKyAgbC0+cG93aW5jID0gMC4wMWY7CisKKyAgZ29vbV9saW5lc19zd2l0Y2hfdG8gKGwsIElEZGVzdCwgcGFyYW1ELCAxLjBmLCBjb3VsRCk7CisKKyAgcmV0dXJuIGw7Cit9CisKK3ZvaWQKK2dvb21fbGluZXNfZnJlZSAoR01MaW5lICoqIGwpCit7CisgIGZyZWUgKCgqbCktPnBvaW50czIpOworICBmcmVlICgoKmwpLT5wb2ludHMpOworICBmcmVlICgqbCk7CisgIGwgPSBOVUxMOworfQorCit2b2lkCitnb29tX2xpbmVzX2RyYXcgKFBsdWdpbkluZm8gKiBwbHVnLCBHTUxpbmUgKiBsaW5lLCBnaW50MTYgZGF0YVs1MTJdLCBQaXhlbCAqIHApCit7CisgIGlmIChsaW5lICE9IE5VTEwpIHsKKyAgICBpbnQgaSwgeDEsIHkxOworICAgIGd1aW50MzIgY29sb3IgPSBsaW5lLT5jb2xvcjsKKyAgICBHTVVuaXRQb2ludGVyICpwdCA9ICYobGluZS0+cG9pbnRzWzBdKTsKKworICAgIGZsb2F0IGNvc2EgPSBjb3MgKHB0LT5hbmdsZSkgLyAxMDAwLjBmOworICAgIGZsb2F0IHNpbmEgPSBzaW4gKHB0LT5hbmdsZSkgLyAxMDAwLjBmOworCisgICAgbGlnaHRlbmNvbG9yICgmY29sb3IsIGxpbmUtPnBvd2VyKTsKKworICAgIHgxID0gKGludCkgKHB0LT54ICsgY29zYSAqIGxpbmUtPmFtcGxpdHVkZSAqIGRhdGFbMF0pOworICAgIHkxID0gKGludCkgKHB0LT55ICsgc2luYSAqIGxpbmUtPmFtcGxpdHVkZSAqIGRhdGFbMF0pOworCisgICAgZm9yIChpID0gMTsgaSA8IDUxMjsgaSsrKSB7CisgICAgICBpbnQgeDIsIHkyOworICAgICAgR01Vbml0UG9pbnRlciAqcHQgPSAmKGxpbmUtPnBvaW50c1tpXSk7CisKKyAgICAgIGZsb2F0IGNvc2EgPSBjb3MgKHB0LT5hbmdsZSkgLyAxMDAwLjBmOworICAgICAgZmxvYXQgc2luYSA9IHNpbiAocHQtPmFuZ2xlKSAvIDEwMDAuMGY7CisKKyAgICAgIHgyID0gKGludCkgKHB0LT54ICsgY29zYSAqIGxpbmUtPmFtcGxpdHVkZSAqIGRhdGFbaV0pOworICAgICAgeTIgPSAoaW50KSAocHQtPnkgKyBzaW5hICogbGluZS0+YW1wbGl0dWRlICogZGF0YVtpXSk7CisKKyAgICAgIHBsdWctPm1ldGhvZHMuZHJhd19saW5lIChwLCB4MSwgeTEsIHgyLCB5MiwgY29sb3IsIGxpbmUtPnNjcmVlblgsCisgICAgICAgICAgbGluZS0+c2NyZWVuWSk7CisKKyAgICAgIHgxID0geDI7CisgICAgICB5MSA9IHkyOworICAgIH0KKyAgICBnb29tX2xpbmVzX21vdmUgKGxpbmUpOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvZ29vbS9saW5lcy5oIGIvZ3N0L2dvb20vbGluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2Q1MGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vbGluZXMuaApAQCAtMCwwICsxLDk0IEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0xJTkVTX0gKKyNkZWZpbmUgX0xJTkVTX0gKKworI2luY2x1ZGUgImdvb21fdHlwZWRlZnMuaCIKKyNpbmNsdWRlICJnb29tX2dyYXBoaWMuaCIKKyNpbmNsdWRlICJnb29tX2NvbmZpZy5oIgorCitzdHJ1Y3QgX0dNVU5JVFBPSU5URVIKK3sKKwlmbG9hdCAgIHg7CisJZmxvYXQgICB5OworCWZsb2F0ICAgYW5nbGU7Cit9OworCisvKiB0YWJsZWF1IGRlIHBvaW50cyAqLworc3RydWN0IF9HTUxJTkUKK3sKKworCUdNVW5pdFBvaW50ZXIgKnBvaW50czsKKwlHTVVuaXRQb2ludGVyICpwb2ludHMyOworCWludCAgICAgSURkZXN0OworCWZsb2F0ICAgcGFyYW07CisJZmxvYXQgICBhbXBsaXR1ZGVGOworCWZsb2F0ICAgYW1wbGl0dWRlOworCisJaW50ICAgICBuYlBvaW50czsKKwlndWludDMyIGNvbG9yOyAgICAgLyogcG91ciBsJ2luc3RhbnQgamUgc3RvY2tlIGxhIGNvdWxldXIgYSB0ZXJtZSwgb24gc3RvY2tlcmEgbGUgbW9kZSBjb3VsZXVyIGV0IGwnb24gYW5pbWVyYSAqLworCWd1aW50MzIgY29sb3IyOworCisJaW50ICAgICBzY3JlZW5YOworCWludCAgICAgc2NyZWVuWTsKKworCWZsb2F0ICAgcG93ZXI7CisJZmxvYXQgICBwb3dpbmM7CisKKwlQbHVnaW5JbmZvICpnb29tSW5mbzsKK307CisKKy8qIGxlcyBJRCBwb3NzaWJsZXMgKi8KKworI2RlZmluZSBHTUxfQ0lSQ0xFIDAKKy8qIChwYXJhbSA9IHJhZGl1cykgKi8KKworI2RlZmluZSBHTUxfSExJTkUgMQorLyogKHBhcmFtID0geSkgKi8KKworI2RlZmluZSBHTUxfVkxJTkUgMgorLyogKHBhcmFtID0geCkgKi8KKworLyogbGVzIG1vZGVzIGNvdWxldXIgcG9zc2libGUgKHNpIHR1IG1ldHMgdW4gYXV0cmUgYydlc3Qgbm9pcikgKi8KKworI2RlZmluZSBHTUxfQkxFVUJMQU5DIDAKKyNkZWZpbmUgR01MX1JFRCAxCisjZGVmaW5lIEdNTF9PUkFOR0VfViAyCisjZGVmaW5lIEdNTF9PUkFOR0VfSiAzCisjZGVmaW5lIEdNTF9WRVJUIDQKKyNkZWZpbmUgR01MX0JMRVUgNQorI2RlZmluZSBHTUxfQkxBQ0sgNgorCisvKiBjb25zdHJ1aXQgdW4gZWZmZXQgZGUgbGluZSAodW5lIGxpZ25lIGhvcml0b250YWxlIHBvdXIgY29tbWVuY2VyKSAqLworR01MaW5lICpnb29tX2xpbmVzX2luaXQgKFBsdWdpbkluZm8gKmdvb21JbmZvLCBpbnQgcngsIGludCByeSwKKwkJCSBpbnQgSURzcmMsIGZsb2F0IHBhcmFtUywgaW50IG1vZGVDb3VsU3JjLAorCQkJIGludCBJRGRlc3QsIGZsb2F0IHBhcmFtRCwgaW50IG1vZGVDb3VsRGVzdCk7CisKK3ZvaWQgICAgZ29vbV9saW5lc19zd2l0Y2hfdG8gKEdNTGluZSAqIGdtbCwgaW50IElEZGVzdCwgZmxvYXQgcGFyYW0sCisJCQlmbG9hdCBhbXBsaXR1ZGUsCisJCQlpbnQgbW9kZUNvdWwpOworCit2b2lkICAgIGdvb21fbGluZXNfc2V0X3JlcyAoR01MaW5lICogZ21sLCBpbnQgcngsIGludCByeSk7CisKK3ZvaWQgICAgZ29vbV9saW5lc19mcmVlIChHTUxpbmUgKiogZ21sKTsKKwordm9pZCAgICBnb29tX2xpbmVzX2RyYXcgKFBsdWdpbkluZm8gKnBsdWdJbmZvLCBHTUxpbmUgKiBnbWwsIGdpbnQxNiBkYXRhWzUxMl0sIFBpeGVsICpwKTsKKworI2VuZGlmIC8qIF9MSU5FU19IICovCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9tYXRodG9vbHMuYyBiL2dzdC9nb29tL21hdGh0b29scy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMTkwYmYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9tYXRodG9vbHMuYwpAQCAtMCwwICsxLDEwNiBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBKZWFuLUNocmlzdG9waGUgSG9lbHQgPGpla29AZnJlZS5mcj4KKyAqCisgKiBnb29tX2NvcmUuYzpDb250YWlucyB0aGUgY29yZSBvZiBnb29tJ3Mgd29yay4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAibWF0aHRvb2xzLmgiCisKK2Zsb2F0IHNpbjI1NlsyNTZdID0geworICAwLCAwLjAyNDU0MTIsIDAuMDQ5MDY3NywgMC4wNzM1NjQ2LCAwLjA5ODAxNzEsIDAuMTIyNDExLCAwLjE0NjczLCAwLjE3MDk2MiwKKyAgMC4xOTUwOSwgMC4yMTkxMDEsIDAuMjQyOTgsIDAuMjY2NzEzLCAwLjI5MDI4NSwgMC4zMTM2ODIsIDAuMzM2ODksCisgIDAuMzU5ODk1LCAwLjM4MjY4MywgMC40MDUyNDEsIDAuNDI3NTU1LCAwLjQ0OTYxMSwgMC40NzEzOTcsIDAuNDkyODk4LAorICAwLjUxNDEwMywgMC41MzQ5OTgsIDAuNTU1NTcsIDAuNTc1ODA4LCAwLjU5NTY5OSwgMC42MTUyMzIsIDAuNjM0MzkzLAorICAwLjY1MzE3MywgMC42NzE1NTksIDAuNjg5NTQxLCAwLjcwNzEwNywgMC43MjQyNDcsIDAuNzQwOTUxLCAwLjc1NzIwOSwKKyAgMC43NzMwMSwgMC43ODgzNDYsIDAuODAzMjA4LCAwLjgxNzU4NSwgMC44MzE0NywgMC44NDQ4NTQsIDAuODU3NzI5LAorICAwLjg3MDA4NywgMC44ODE5MjEsIDAuODkzMjI0LCAwLjkwMzk4OSwgMC45MTQyMSwgMC45MjM4OCwgMC45MzI5OTMsCisgIDAuOTQxNTQ0LCAwLjk0OTUyOCwgMC45NTY5NCwgMC45NjM3NzYsIDAuOTcwMDMxLCAwLjk3NTcwMiwgMC45ODA3ODUsCisgIDAuOTg1Mjc4LCAwLjk4OTE3NywgMC45OTI0OCwgMC45OTUxODUsIDAuOTk3MjksIDAuOTk4Nzk1LCAwLjk5OTY5OSwgMSwKKyAgMC45OTk2OTksIDAuOTk4Nzk1LCAwLjk5NzI5LCAwLjk5NTE4NSwgMC45OTI0OCwgMC45ODkxNzcsIDAuOTg1Mjc4LAorICAwLjk4MDc4NSwgMC45NzU3MDIsIDAuOTcwMDMxLCAwLjk2Mzc3NiwgMC45NTY5NCwgMC45NDk1MjgsIDAuOTQxNTQ0LAorICAwLjkzMjk5MywgMC45MjM4OCwgMC45MTQyMSwgMC45MDM5ODksIDAuODkzMjI0LCAwLjg4MTkyMSwgMC44NzAwODcsCisgIDAuODU3NzI5LCAwLjg0NDg1NCwgMC44MzE0NywgMC44MTc1ODUsIDAuODAzMjA4LCAwLjc4ODM0NiwgMC43NzMwMSwKKyAgMC43NTcyMDksIDAuNzQwOTUxLCAwLjcyNDI0NywgMC43MDcxMDcsIDAuNjg5NTQxLCAwLjY3MTU1OSwgMC42NTMxNzMsCisgIDAuNjM0MzkzLCAwLjYxNTIzMiwgMC41OTU2OTksIDAuNTc1ODA4LCAwLjU1NTU3LCAwLjUzNDk5OCwgMC41MTQxMDMsCisgIDAuNDkyODk4LCAwLjQ3MTM5NywgMC40NDk2MTEsIDAuNDI3NTU1LCAwLjQwNTI0MSwgMC4zODI2ODMsIDAuMzU5ODk1LAorICAwLjMzNjg5LCAwLjMxMzY4MiwgMC4yOTAyODUsIDAuMjY2NzEzLCAwLjI0Mjk4LCAwLjIxOTEwMSwgMC4xOTUwOSwKKyAgMC4xNzA5NjIsIDAuMTQ2NzMsIDAuMTIyNDExLCAwLjA5ODAxNzEsIDAuMDczNTY0NiwgMC4wNDkwNjc3LCAwLjAyNDU0MTIsCisgIDEuMjI0NjVlLTE2LCAtMC4wMjQ1NDEyLCAtMC4wNDkwNjc3LCAtMC4wNzM1NjQ2LCAtMC4wOTgwMTcxLCAtMC4xMjI0MTEsCisgIC0wLjE0NjczLCAtMC4xNzA5NjIsIC0wLjE5NTA5LCAtMC4yMTkxMDEsIC0wLjI0Mjk4LCAtMC4yNjY3MTMsIC0wLjI5MDI4NSwKKyAgLTAuMzEzNjgyLCAtMC4zMzY4OSwgLTAuMzU5ODk1LCAtMC4zODI2ODMsIC0wLjQwNTI0MSwgLTAuNDI3NTU1LAorICAtMC40NDk2MTEsIC0wLjQ3MTM5NywgLTAuNDkyODk4LCAtMC41MTQxMDMsIC0wLjUzNDk5OCwgLTAuNTU1NTcsCisgIC0wLjU3NTgwOCwgLTAuNTk1Njk5LCAtMC42MTUyMzIsIC0wLjYzNDM5MywgLTAuNjUzMTczLCAtMC42NzE1NTksCisgIC0wLjY4OTU0MSwgLTAuNzA3MTA3LCAtMC43MjQyNDcsIC0wLjc0MDk1MSwgLTAuNzU3MjA5LCAtMC43NzMwMSwKKyAgLTAuNzg4MzQ2LCAtMC44MDMyMDgsIC0wLjgxNzU4NSwgLTAuODMxNDcsIC0wLjg0NDg1NCwgLTAuODU3NzI5LAorICAtMC44NzAwODcsIC0wLjg4MTkyMSwgLTAuODkzMjI0LCAtMC45MDM5ODksIC0wLjkxNDIxLCAtMC45MjM4OCwgLTAuOTMyOTkzLAorICAtMC45NDE1NDQsIC0wLjk0OTUyOCwgLTAuOTU2OTQsIC0wLjk2Mzc3NiwgLTAuOTcwMDMxLCAtMC45NzU3MDIsCisgIC0wLjk4MDc4NSwgLTAuOTg1Mjc4LCAtMC45ODkxNzcsIC0wLjk5MjQ4LCAtMC45OTUxODUsIC0wLjk5NzI5LCAtMC45OTg3OTUsCisgIC0wLjk5OTY5OSwgLTEsIC0wLjk5OTY5OSwgLTAuOTk4Nzk1LCAtMC45OTcyOSwgLTAuOTk1MTg1LCAtMC45OTI0OCwKKyAgLTAuOTg5MTc3LCAtMC45ODUyNzgsIC0wLjk4MDc4NSwgLTAuOTc1NzAyLCAtMC45NzAwMzEsIC0wLjk2Mzc3NiwKKyAgLTAuOTU2OTQsIC0wLjk0OTUyOCwgLTAuOTQxNTQ0LCAtMC45MzI5OTMsIC0wLjkyMzg4LCAtMC45MTQyMSwgLTAuOTAzOTg5LAorICAtMC44OTMyMjQsIC0wLjg4MTkyMSwgLTAuODcwMDg3LCAtMC44NTc3MjksIC0wLjg0NDg1NCwgLTAuODMxNDcsCisgIC0wLjgxNzU4NSwgLTAuODAzMjA4LCAtMC43ODgzNDYsIC0wLjc3MzAxLCAtMC43NTcyMDksIC0wLjc0MDk1MSwKKyAgLTAuNzI0MjQ3LCAtMC43MDcxMDcsIC0wLjY4OTU0MSwgLTAuNjcxNTU5LCAtMC42NTMxNzMsIC0wLjYzNDM5MywKKyAgLTAuNjE1MjMyLCAtMC41OTU2OTksIC0wLjU3NTgwOCwgLTAuNTU1NTcsIC0wLjUzNDk5OCwgLTAuNTE0MTAzLAorICAtMC40OTI4OTgsIC0wLjQ3MTM5NywgLTAuNDQ5NjExLCAtMC40Mjc1NTUsIC0wLjQwNTI0MSwgLTAuMzgyNjgzLAorICAtMC4zNTk4OTUsIC0wLjMzNjg5LCAtMC4zMTM2ODIsIC0wLjI5MDI4NSwgLTAuMjY2NzEzLCAtMC4yNDI5OCwgLTAuMjE5MTAxLAorICAtMC4xOTUwOSwgLTAuMTcwOTYyLCAtMC4xNDY3MywgLTAuMTIyNDExLCAtMC4wOTgwMTcxLCAtMC4wNzM1NjQ2LAorICAtMC4wNDkwNjc3LCAtMC4wMjQ1NDEyCit9OworCitmbG9hdCBjb3MyNTZbMjU2XSA9IHsKKyAgMCwgMC45OTk2OTksIDAuOTk4Nzk1LCAwLjk5NzI5LCAwLjk5NTE4NSwgMC45OTI0OCwgMC45ODkxNzcsIDAuOTg1Mjc4LAorICAwLjk4MDc4NSwgMC45NzU3MDIsIDAuOTcwMDMxLCAwLjk2Mzc3NiwgMC45NTY5NCwgMC45NDk1MjgsIDAuOTQxNTQ0LAorICAwLjkzMjk5MywgMC45MjM4OCwgMC45MTQyMSwgMC45MDM5ODksIDAuODkzMjI0LCAwLjg4MTkyMSwgMC44NzAwODcsCisgIDAuODU3NzI5LCAwLjg0NDg1NCwgMC44MzE0NywgMC44MTc1ODUsIDAuODAzMjA4LCAwLjc4ODM0NiwgMC43NzMwMSwKKyAgMC43NTcyMDksIDAuNzQwOTUxLCAwLjcyNDI0NywgMC43MDcxMDcsIDAuNjg5NTQxLCAwLjY3MTU1OSwgMC42NTMxNzMsCisgIDAuNjM0MzkzLCAwLjYxNTIzMiwgMC41OTU2OTksIDAuNTc1ODA4LCAwLjU1NTU3LCAwLjUzNDk5OCwgMC41MTQxMDMsCisgIDAuNDkyODk4LCAwLjQ3MTM5NywgMC40NDk2MTEsIDAuNDI3NTU1LCAwLjQwNTI0MSwgMC4zODI2ODMsIDAuMzU5ODk1LAorICAwLjMzNjg5LCAwLjMxMzY4MiwgMC4yOTAyODUsIDAuMjY2NzEzLCAwLjI0Mjk4LCAwLjIxOTEwMSwgMC4xOTUwOSwKKyAgMC4xNzA5NjIsIDAuMTQ2NzMsIDAuMTIyNDExLCAwLjA5ODAxNzEsIDAuMDczNTY0NiwgMC4wNDkwNjc3LCAwLjAyNDU0MTIsCisgIDYuMTIzMjNlLTE3LCAtMC4wMjQ1NDEyLCAtMC4wNDkwNjc3LCAtMC4wNzM1NjQ2LCAtMC4wOTgwMTcxLCAtMC4xMjI0MTEsCisgIC0wLjE0NjczLCAtMC4xNzA5NjIsIC0wLjE5NTA5LCAtMC4yMTkxMDEsIC0wLjI0Mjk4LCAtMC4yNjY3MTMsIC0wLjI5MDI4NSwKKyAgLTAuMzEzNjgyLCAtMC4zMzY4OSwgLTAuMzU5ODk1LCAtMC4zODI2ODMsIC0wLjQwNTI0MSwgLTAuNDI3NTU1LAorICAtMC40NDk2MTEsIC0wLjQ3MTM5NywgLTAuNDkyODk4LCAtMC41MTQxMDMsIC0wLjUzNDk5OCwgLTAuNTU1NTcsCisgIC0wLjU3NTgwOCwgLTAuNTk1Njk5LCAtMC42MTUyMzIsIC0wLjYzNDM5MywgLTAuNjUzMTczLCAtMC42NzE1NTksCisgIC0wLjY4OTU0MSwgLTAuNzA3MTA3LCAtMC43MjQyNDcsIC0wLjc0MDk1MSwgLTAuNzU3MjA5LCAtMC43NzMwMSwKKyAgLTAuNzg4MzQ2LCAtMC44MDMyMDgsIC0wLjgxNzU4NSwgLTAuODMxNDcsIC0wLjg0NDg1NCwgLTAuODU3NzI5LAorICAtMC44NzAwODcsIC0wLjg4MTkyMSwgLTAuODkzMjI0LCAtMC45MDM5ODksIC0wLjkxNDIxLCAtMC45MjM4OCwgLTAuOTMyOTkzLAorICAtMC45NDE1NDQsIC0wLjk0OTUyOCwgLTAuOTU2OTQsIC0wLjk2Mzc3NiwgLTAuOTcwMDMxLCAtMC45NzU3MDIsCisgIC0wLjk4MDc4NSwgLTAuOTg1Mjc4LCAtMC45ODkxNzcsIC0wLjk5MjQ4LCAtMC45OTUxODUsIC0wLjk5NzI5LCAtMC45OTg3OTUsCisgIC0wLjk5OTY5OSwgLTEsIC0wLjk5OTY5OSwgLTAuOTk4Nzk1LCAtMC45OTcyOSwgLTAuOTk1MTg1LCAtMC45OTI0OCwKKyAgLTAuOTg5MTc3LCAtMC45ODUyNzgsIC0wLjk4MDc4NSwgLTAuOTc1NzAyLCAtMC45NzAwMzEsIC0wLjk2Mzc3NiwKKyAgLTAuOTU2OTQsIC0wLjk0OTUyOCwgLTAuOTQxNTQ0LCAtMC45MzI5OTMsIC0wLjkyMzg4LCAtMC45MTQyMSwgLTAuOTAzOTg5LAorICAtMC44OTMyMjQsIC0wLjg4MTkyMSwgLTAuODcwMDg3LCAtMC44NTc3MjksIC0wLjg0NDg1NCwgLTAuODMxNDcsCisgIC0wLjgxNzU4NSwgLTAuODAzMjA4LCAtMC43ODgzNDYsIC0wLjc3MzAxLCAtMC43NTcyMDksIC0wLjc0MDk1MSwKKyAgLTAuNzI0MjQ3LCAtMC43MDcxMDcsIC0wLjY4OTU0MSwgLTAuNjcxNTU5LCAtMC42NTMxNzMsIC0wLjYzNDM5MywKKyAgLTAuNjE1MjMyLCAtMC41OTU2OTksIC0wLjU3NTgwOCwgLTAuNTU1NTcsIC0wLjUzNDk5OCwgLTAuNTE0MTAzLAorICAtMC40OTI4OTgsIC0wLjQ3MTM5NywgLTAuNDQ5NjExLCAtMC40Mjc1NTUsIC0wLjQwNTI0MSwgLTAuMzgyNjgzLAorICAtMC4zNTk4OTUsIC0wLjMzNjg5LCAtMC4zMTM2ODIsIC0wLjI5MDI4NSwgLTAuMjY2NzEzLCAtMC4yNDI5OCwgLTAuMjE5MTAxLAorICAtMC4xOTUwOSwgLTAuMTcwOTYyLCAtMC4xNDY3MywgLTAuMTIyNDExLCAtMC4wOTgwMTcxLCAtMC4wNzM1NjQ2LAorICAtMC4wNDkwNjc3LCAtMC4wMjQ1NDEyLCAtMS44MzY5N2UtMTYsIDAuMDI0NTQxMiwgMC4wNDkwNjc3LCAwLjA3MzU2NDYsCisgIDAuMDk4MDE3MSwgMC4xMjI0MTEsIDAuMTQ2NzMsIDAuMTcwOTYyLCAwLjE5NTA5LCAwLjIxOTEwMSwgMC4yNDI5OCwKKyAgMC4yNjY3MTMsIDAuMjkwMjg1LCAwLjMxMzY4MiwgMC4zMzY4OSwgMC4zNTk4OTUsIDAuMzgyNjgzLCAwLjQwNTI0MSwKKyAgMC40Mjc1NTUsIDAuNDQ5NjExLCAwLjQ3MTM5NywgMC40OTI4OTgsIDAuNTE0MTAzLCAwLjUzNDk5OCwgMC41NTU1NywKKyAgMC41NzU4MDgsIDAuNTk1Njk5LCAwLjYxNTIzMiwgMC42MzQzOTMsIDAuNjUzMTczLCAwLjY3MTU1OSwgMC42ODk1NDEsCisgIDAuNzA3MTA3LCAwLjcyNDI0NywgMC43NDA5NTEsIDAuNzU3MjA5LCAwLjc3MzAxLCAwLjc4ODM0NiwgMC44MDMyMDgsCisgIDAuODE3NTg1LCAwLjgzMTQ3LCAwLjg0NDg1NCwgMC44NTc3MjksIDAuODcwMDg3LCAwLjg4MTkyMSwgMC44OTMyMjQsCisgIDAuOTAzOTg5LCAwLjkxNDIxLCAwLjkyMzg4LCAwLjkzMjk5MywgMC45NDE1NDQsIDAuOTQ5NTI4LCAwLjk1Njk0LAorICAwLjk2Mzc3NiwgMC45NzAwMzEsIDAuOTc1NzAyLCAwLjk4MDc4NSwgMC45ODUyNzgsIDAuOTg5MTc3LCAwLjk5MjQ4LAorICAwLjk5NTE4NSwgMC45OTcyOSwgMC45OTg3OTUsIDAuOTk5Njk5Cit9OwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vbWF0aHRvb2xzLmggYi9nc3QvZ29vbS9tYXRodG9vbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzQwZGFiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vbWF0aHRvb2xzLmgKQEAgLTAsMCArMSw1OCBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBKZWFuLUNocmlzdG9waGUgSG9lbHQgPGpla29AZnJlZS5mcj4KKyAqCisgKiBnb29tX2NvcmUuYzpDb250YWlucyB0aGUgY29yZSBvZiBnb29tJ3Mgd29yay4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisgI2lmbmRlZiBNQVRIVE9PTFNfSAorI2RlZmluZSBNQVRIVE9PTFNfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjZGVmaW5lIF9kb3VibGUyZml4bWFnaWMgKDY4NzE5NDc2NzM2LjAqMS41KQorLyogMl4zNiAqIDEuNSwgICg1Mi1fc2hpZnRhbXQ9MzYpIHVzZXMgbGltaXRlZCBwcmVjaXNpY2lvbiB0byBmbG9vciAqLworI2RlZmluZSBfc2hpZnRhbXQgMTYKKy8qIDE2LjE2IGZpeGVkIHBvaW50IHJlcHJlc2VudGF0aW9uICovCisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19CSUdfRU5ESUFOCisjZGVmaW5lIGlleHBfCQkJCTAKKyNkZWZpbmUgaW1hbl8JCQkJMQorI2Vsc2UKKyNkZWZpbmUgaWV4cF8JCQkJMQorI2RlZmluZSBpbWFuXwkJCQkwCisjZW5kaWYgLyogQmlnRW5kaWFuXyAqLworCisvKiBUT0RPOiB0aGlzIG9wdGltaXphdGlvbiBpcyB2ZXJ5IGVmZmljaWVudDogcHV0IGl0IGFnYWluIHdoZW4gYWxsIHdvcmtzCisjaWZkZWYgSEFWRV9NTVgKKyNkZWZpbmUgRjJJKGRibCxpKSB7ZG91YmxlIGQgPSBkYmwgKyBfZG91YmxlMmZpeG1hZ2ljOyBpID0gKChpbnQqKSZkKVtpbWFuX10gPj4gX3NoaWZ0YW10O30KKyNlbHNlKi8KKyNkZWZpbmUgRjJJKGRibCxpKSBpPShpbnQpZGJsOworLyojZW5kaWYqLworCisjaWYgMAorI2RlZmluZSBTSU5DT1MoZixzLGMpIFwKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJmc2luY29zIiA6ICI9dCIgKGMpLCAiPXUiIChzKSA6ICIwIiAoZikpCisjZWxzZQorI2RlZmluZSBTSU5DT1MoZixzLGMpIHtzPXNpbihmKTtjPWNvcyhmKTt9CisjZW5kaWYKKworZXh0ZXJuIGZsb2F0IHNpbjI1NlsyNTZdOworZXh0ZXJuIGZsb2F0IGNvczI1NlsyNTZdOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vbWVzb24uYnVpbGQgYi9nc3QvZ29vbS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2Q4M2EzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vbWVzb24uYnVpbGQKQEAgLTAsMCArMSwyOSBAQAorZ29vbV9zb3VyY2VzID0gWworICAnZ3N0Z29vbS5jJywKKyAgJ2RyYXdtZXRob2RzLmMnLAorICAnc291bmRfdGVzdGVyLmMnLAorICAnbWF0aHRvb2xzLmMnLAorICAnbGluZXMuYycsCisgICdpZnMuYycsCisgICdzdXJmM2QuYycsCisgICd0ZW50YWNsZTNkLmMnLAorICAndjNkLmMnLAorICAnY29udm9sdmVfZnguYycsCisgICdmbHlpbmdfc3RhcnNfZnguYycsCisgICdwbHVnaW5faW5mby5jJywKKyAgJ2dvb21fdG9vbHMuYycsCisgICdjb25maWdfcGFyYW0uYycsCisgICdmaWx0ZXJzLmMnLAorICAnZ29vbV9jb3JlLmMnLAorICAnZ3JhcGhpYy5jJywKK10KKworCitnc3Rnb29tID0gbGlicmFyeSgnZ3N0Z29vbScsCisgIGdvb21fc291cmNlcywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3RfZGVwLCBnc3RwYnV0aWxzX2RlcCwgZ3N0YmFzZV9kZXAsIG9yY19kZXAsIGxpYm1dLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vbW14LmMgYi9nc3QvZ29vbS9tbXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzJhNmM0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vbW14LmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCW1teC5jCisKKwlNdWx0aU1lZGlhIGVYdGVuc2lvbnMgR0NDIGludGVyZmFjZSBsaWJyYXJ5IGZvciBJQTMyLgorCisJVG8gdXNlIHRoaXMgbGlicmFyeSwgc2ltcGx5IGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZQorCWFuZCBjb21waWxlIHdpdGggR0NDLiAgWW91IE1VU1QgaGF2ZSBpbmxpbmluZyBlbmFibGVkCisJaW4gb3JkZXIgZm9yIG1teF9vaygpIHRvIHdvcms7IHRoaXMgY2FuIGJlIGRvbmUgYnkKKwlzaW1wbHkgdXNpbmcgLU8gb24gdGhlIEdDQyBjb21tYW5kIGxpbmUuCisKKwlDb21waWxpbmcgd2l0aCAtRE1NWF9UUkFDRSB3aWxsIGNhdXNlIGRldGFpbGVkIHRyYWNlCisJb3V0cHV0IHRvIGJlIHNlbnQgdG8gc3RkZXJyIGZvciBlYWNoIG1teCBvcGVyYXRpb24uCisJVGhpcyBhZGRzIGxvdHMgb2YgY29kZSwgYW5kIG9idmlvdXNseSBzbG93cyBleGVjdXRpb24gdG8KKwlhIGNyYXdsLCBidXQgY2FuIGJlIHZlcnkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCisKKwlUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkKKwlFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCisJTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKwlBTkQgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworCTE5OTctOTkgYnkgSC4gRGlldHogYW5kIFIuIEZpc2hlcgorCisgTm90ZXM6CisJSXQgYXBwZWFycyB0aGF0IHRoZSBsYXRlc3QgZ2FzIGhhcyB0aGUgcGFuZCBwcm9ibGVtIGZpeGVkLCB0aGVyZWZvcmUKKwkgIEknbGwgdW5kZWZpbmUgQlJPS0VOX1BBTkQgYnkgZGVmYXVsdC4KKyovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdvb21fY29uZmlnLmgiCisKKyNpZmRlZiBIQVZFX01NWAorCisjZGVmaW5lIEJVRkZQT0lOVE5CIDE2CisjZGVmaW5lIEJVRkZQT0lOVE1BU0sgMHhmZmZmCisjZGVmaW5lIEJVRkZJTkNSIDB4ZmYKKworI2luY2x1ZGUgIm1teC5oIgorI2luY2x1ZGUgImdvb21fZ3JhcGhpYy5oIgorCisjZGVmaW5lIHNxcnRwZXJ0ZSAxNgorLy8gZmFpcmUgOiBhICUgc3FydHBlcnRlIDw9PiBhICYgcGVydGVtYXNrCisjZGVmaW5lIFBFUlRFTUFTSyAweGYKKy8vIGZhaXJlIDogYSAvIHNxcnRwZXJ0ZSA8PT4gYSA+PiBQRVJURURFQworI2RlZmluZSBQRVJURURFQyA0CisKK2ludAorbW14X3N1cHBvcnRlZCAodm9pZCkKK3sKKyAgcmV0dXJuIChtbV9zdXBwb3J0ICgpICYgMHgxKTsKK30KKwordm9pZAorem9vbV9maWx0ZXJfbW14IChpbnQgcHJldlgsIGludCBwcmV2WSwKKyAgICBQaXhlbCAqIGV4cGl4MSwgUGl4ZWwgKiBleHBpeDIsCisgICAgaW50ICpicnV0UywgaW50ICpicnV0RCwgaW50IGJ1ZmZyYXRpbywgaW50IHByZWNhbENvZWZbMTZdWzE2XSkKK3sKKyAgdW5zaWduZWQgaW50IGF4ID0gKHByZXZYIC0gMSkgPDwgUEVSVEVERUMsIGF5ID0gKHByZXZZIC0gMSkgPDwgUEVSVEVERUM7CisKKyAgaW50IGJ1ZnNpemUgPSBwcmV2WCAqIHByZXZZOworICBpbnQgbG9vcDsKKworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInB4b3IgJW1tNywlbW03Iik7CisKKyAgZm9yIChsb29wID0gMDsgbG9vcCA8IGJ1ZnNpemU7IGxvb3ArKykgeworICAgIC8qICAgICAgaW50IGNvdWxldXI7ICovCisgICAgaW50IHB4LCBweTsKKyAgICBpbnQgcG9zOworICAgIGludCBjb2VmZnM7CisKKyAgICBpbnQgbXlQb3MgPSBsb29wIDw8IDEsIG15UG9zMiA9IG15UG9zICsgMTsKKyAgICBpbnQgYnJ1dFNteXBvcyA9IGJydXRTW215UG9zXTsKKworICAgIHB4ID0gYnJ1dFNteXBvcyArICgoKGJydXREW215UG9zXSAtCisgICAgICAgICAgICAgICAgYnJ1dFNteXBvcykgKiBidWZmcmF0aW8pID4+IEJVRkZQT0lOVE5CKTsKKyAgICBicnV0U215cG9zID0gYnJ1dFNbbXlQb3MyXTsKKyAgICBweSA9IGJydXRTbXlwb3MgKyAoKChicnV0RFtteVBvczJdIC0KKyAgICAgICAgICAgICAgICBicnV0U215cG9zKSAqIGJ1ZmZyYXRpbykgPj4gQlVGRlBPSU5UTkIpOworCisgICAgaWYgKChweSA+PSBheSkgfHwgKHB4ID49IGF4KSkgeworICAgICAgcG9zID0gY29lZmZzID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgcG9zID0gKChweCA+PiBQRVJURURFQykgKyBwcmV2WCAqIChweSA+PiBQRVJURURFQykpOworICAgICAgLy8gY29lZiBlbiBtb2R1bG8gMTUKKyAgICAgIGNvZWZmcyA9IHByZWNhbENvZWZbcHggJiBQRVJURU1BU0tdW3B5ICYgUEVSVEVNQVNLXTsKKyAgICB9CisKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmQgJTIsICUlbW02IFxuXHQiCisgICAgICAgIC8qIHJlY3VwZXJhdGlvbiBkZXMgZGV1eCBwcmVtaWVycyBwaXhlbHMgZGFucyBtbTAgZXQgbW0xICovCisgICAgICAgICJtb3ZxICglMywlMSw0KSwgJSVtbTAgXG5cdCIgICAgLyogYjEtdjEtcjEtYTEtYjItdjItcjItYTIgKi8KKyAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0xIFxuXHQiICAgICAgICAvKiBiMS12MS1yMS1hMS1iMi12Mi1yMi1hMiAqLworICAgICAgICAvKiBkZXBhY2thZ2UgZHUgcHJlbWllciBwaXhlbCAqLworICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMCBcblx0IiAgIC8qIDAwLWIyLTAwLXYyLTAwLXIyLTAwLWEyICovCisgICAgICAgICJtb3ZxICUlbW02LCAlJW1tNSBcblx0IiAgICAgICAgLyogPz8tPz8tPz8tPz8tYzQtYzMtYzItYzEgKi8KKyAgICAgICAgLyogZGVwYWNrYWdlIGR1IDJpZW1lIHBpeGVsICovCisgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0xIFxuXHQiICAgLyogMDAtYjEtMDAtdjEtMDAtcjEtMDAtYTEgKi8KKyAgICAgICAgLyogZXh0cmFjdGlvbiBkZXMgY29lZmZpY2llbnRzLi4uICovCisgICAgICAgICJwdW5wY2tsYncgJSVtbTUsICUlbW02IFxuXHQiICAgLyogYzQtYzQtYzMtYzMtYzItYzItYzEtYzEgKi8KKyAgICAgICAgIm1vdnEgJSVtbTYsICUlbW00IFxuXHQiICAgICAgICAvKiBjNC1jNC1jMy1jMy1jMi1jMi1jMS1jMSAqLworICAgICAgICAibW92cSAlJW1tNiwgJSVtbTUgXG5cdCIgICAgICAgIC8qIGM0LWM0LWMzLWMzLWMyLWMyLWMxLWMxICovCisgICAgICAgICJwdW5wY2tsYncgJSVtbTUsICUlbW02IFxuXHQiICAgLyogYzItYzItYzItYzItYzEtYzEtYzEtYzEgKi8KKyAgICAgICAgInB1bnBja2hidyAlJW1tNSwgJSVtbTQgXG5cdCIgICAvKiBjNC1jNC1jNC1jNC1jMy1jMy1jMy1jMyAqLworICAgICAgICAibW92cSAlJW1tNiwgJSVtbTMgXG5cdCIgICAgICAgIC8qIGMyLWMyLWMyLWMyLWMxLWMxLWMxLWMxICovCisgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW02IFxuXHQiICAgLyogMDAtYzEtMDAtYzEtMDAtYzEtMDAtYzEgKi8KKyAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTMgXG5cdCIgICAvKiAwMC1jMi0wMC1jMi0wMC1jMi0wMC1jMiAqLworICAgICAgICAvKiBtdWx0aXBsaWNhdGlvbiBkZXMgcGl4ZWxzIHBhciBsZXMgY29lZmZpY2llbnRzICovCisgICAgICAgICJwbXVsbHcgJSVtbTYsICUlbW0wIFxuXHQiICAgICAgLyogYzEqYjItYzEqdjItYzEqcjItYzEqYTIgKi8KKyAgICAgICAgInBtdWxsdyAlJW1tMywgJSVtbTEgXG5cdCIgICAgICAvKiBjMipiMS1jMip2MS1jMipyMS1jMiphMSAqLworICAgICAgICAicGFkZHcgJSVtbTEsICUlbW0wIFxuXHQiCisgICAgICAgIC8qIC4uLmV4dHJhY3Rpb24gZGVzIDIgZGVybmllcnMgY29lZmZpY2llbnRzICovCisgICAgICAgICJtb3ZxICUlbW00LCAlJW1tNSBcblx0IiAgICAgICAgLyogYzQtYzQtYzQtYzQtYzMtYzMtYzMtYzMgKi8KKyAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTQgXG5cdCIgICAvKiAwMC1jMy0wMC1jMy0wMC1jMy0wMC1jMyAqLworICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tNSBcblx0IiAgIC8qIDAwLWM0LTAwLWM0LTAwLWM0LTAwLWM0ICovCisgICAgICAgIC8qIGFqb3V0ZXIgbGEgbG9uZ3VldXIgZGUgbGlnbmUgYSBlc2kgKi8KKyAgICAgICAgImFkZGwgOCglJWVicCksJTEgXG5cdCIKKyAgICAgICAgLyogcmVjdXBlcmF0aW9uIGRlcyAyIGRlcm5pZXJzIHBpeGVscyAqLworICAgICAgICAibW92cSAoJTMsJTEsNCksICUlbW0xIFxuXHQiICJtb3ZxICUlbW0xLCAlJW1tMiBcblx0IgorICAgICAgICAvKiBkZXBhY2thZ2UgZGVzIHBpeGVscyAqLworICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMSBcblx0IiAicHVucGNraGJ3ICUlbW03LCAlJW1tMiBcblx0IgorICAgICAgICAvKiBtdWx0aXBsaWNhdGlvbiBwYXMgbGVzIGNvZWZmcyAqLworICAgICAgICAicG11bGx3ICUlbW00LCAlJW1tMSBcblx0IiAicG11bGx3ICUlbW01LCAlJW1tMiBcblx0IgorICAgICAgICAvKiBham91dCBkZXMgdmFsZXVycyBvYnRlbnVlcyA/IGxhIHZhbGV1ciBmaW5hbGUgKi8KKyAgICAgICAgInBhZGR3ICUlbW0xLCAlJW1tMCBcblx0IiAicGFkZHcgJSVtbTIsICUlbW0wIFxuXHQiCisgICAgICAgIC8qIGRpdmlzaW9uIHBhciAyNTYgPSAxNisxNisxNisxNiwgcHVpcyByZXBhY2thZ2UgZHUgcGl4ZWwgZmluYWwgKi8KKyAgICAgICAgInBzcmx3ICQ4LCAlJW1tMCBcblx0IgorICAgICAgICAicGFja3Vzd2IgJSVtbTcsICUlbW0wIFxuXHQiICJtb3ZkICUlbW0wLCUwIFxuXHQiOiI9ZyIgKGV4cGl4Mltsb29wXSkKKyAgICAgICAgOiJyIiAocG9zKSwgInIiIChjb2VmZnMpLCAiciIgKGV4cGl4MSkKKworICAgICAgICApOworCisgICAgZW1tcyAoKTsKKyAgfQorfQorCisjZGVmaW5lIERSQVdNRVRIT0RfUExVU19NTVgoX291dCxfYmFja2J1ZixfY29sKSBcCit7IFwKKwltb3ZkX20ycihfYmFja2J1ZiwgbW0wKTsgXAorCXBhZGR1c2JfbTJyKF9jb2wsIG1tMCk7IFwKKwltb3ZkX3IybShtbTAsIF9vdXQpOyBcCit9CisKKyNkZWZpbmUgRFJBV01FVEhPRCBEUkFXTUVUSE9EX1BMVVNfTU1YKCpwLCpwLGNvbCkKKwordm9pZAorZHJhd19saW5lX21teCAoUGl4ZWwgKiBkYXRhLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsIGludCBjb2wsCisgICAgaW50IHNjcmVlbngsIGludCBzY3JlZW55KQoreworICBpbnQgeCwgeSwgZHgsIGR5LCB5eSwgeHg7CisgIFBpeGVsICpwOworCisgIGlmICgoeTEgPCAwKSB8fCAoeTIgPCAwKSB8fCAoeDEgPCAwKSB8fCAoeDIgPCAwKSB8fCAoeTEgPj0gc2NyZWVueSkKKyAgICAgIHx8ICh5MiA+PSBzY3JlZW55KSB8fCAoeDEgPj0gc2NyZWVueCkgfHwgKHgyID49IHNjcmVlbngpKQorICAgIGdvdG8gZW5kX29mX2xpbmU7CisKKyAgZHggPSB4MiAtIHgxOworICBkeSA9IHkyIC0geTE7CisgIGlmICh4MSA+PSB4MikgeworICAgIGludCB0bXA7CisKKyAgICB0bXAgPSB4MTsKKyAgICB4MSA9IHgyOworICAgIHgyID0gdG1wOworICAgIHRtcCA9IHkxOworICAgIHkxID0geTI7CisgICAgeTIgPSB0bXA7CisgICAgZHggPSB4MiAtIHgxOworICAgIGR5ID0geTIgLSB5MTsKKyAgfQorCisgIC8qIHZlcnRpY2FsIGxpbmUgKi8KKyAgaWYgKGR4ID09IDApIHsKKyAgICBpZiAoeTEgPCB5MikgeworICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHkxKSArIHgxXSk7CisgICAgICBmb3IgKHkgPSB5MTsgeSA8PSB5MjsgeSsrKSB7CisgICAgICAgIERSQVdNRVRIT0Q7CisgICAgICAgIHAgKz0gc2NyZWVueDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHkyKSArIHgxXSk7CisgICAgICBmb3IgKHkgPSB5MjsgeSA8PSB5MTsgeSsrKSB7CisgICAgICAgIERSQVdNRVRIT0Q7CisgICAgICAgIHAgKz0gc2NyZWVueDsKKyAgICAgIH0KKyAgICB9CisgICAgZ290byBlbmRfb2ZfbGluZTsKKyAgfQorICAvKiBob3Jpem9udGFsIGxpbmUgKi8KKyAgaWYgKGR5ID09IDApIHsKKyAgICBpZiAoeDEgPCB4MikgeworICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHkxKSArIHgxXSk7CisgICAgICBmb3IgKHggPSB4MTsgeCA8PSB4MjsgeCsrKSB7CisgICAgICAgIERSQVdNRVRIT0Q7CisgICAgICAgIHArKzsKKyAgICAgIH0KKyAgICAgIGdvdG8gZW5kX29mX2xpbmU7CisgICAgfSBlbHNlIHsKKyAgICAgIHAgPSAmKGRhdGFbKHNjcmVlbnggKiB5MSkgKyB4Ml0pOworICAgICAgZm9yICh4ID0geDI7IHggPD0geDE7IHgrKykgeworICAgICAgICBEUkFXTUVUSE9EOworICAgICAgICBwKys7CisgICAgICB9CisgICAgICBnb3RvIGVuZF9vZl9saW5lOworICAgIH0KKyAgfQorICAvKiAxICAgICovCisgIC8qICBcICAgKi8KKyAgLyogICBcICAqLworICAvKiAgICAyICovCisgIGlmICh5MiA+IHkxKSB7CisgICAgLyogc3RlZXAgKi8KKyAgICBpZiAoZHkgPiBkeCkgeworICAgICAgZHggPSAoKGR4IDw8IDE2KSAvIGR5KTsKKyAgICAgIHggPSB4MSA8PCAxNjsKKyAgICAgIGZvciAoeSA9IHkxOyB5IDw9IHkyOyB5KyspIHsKKyAgICAgICAgeHggPSB4ID4+IDE2OworICAgICAgICBwID0gJihkYXRhWyhzY3JlZW54ICogeSkgKyB4eF0pOworICAgICAgICBEUkFXTUVUSE9EOworICAgICAgICBpZiAoeHggPCAoc2NyZWVueCAtIDEpKSB7CisgICAgICAgICAgcCsrOworICAgICAgICAgIC8qIERSQVdNRVRIT0Q7ICovCisgICAgICAgIH0KKyAgICAgICAgeCArPSBkeDsKKyAgICAgIH0KKyAgICAgIGdvdG8gZW5kX29mX2xpbmU7CisgICAgfQorICAgIC8qIHNoYWxsb3cgKi8KKyAgICBlbHNlIHsKKyAgICAgIGR5ID0gKChkeSA8PCAxNikgLyBkeCk7CisgICAgICB5ID0geTEgPDwgMTY7CisgICAgICBmb3IgKHggPSB4MTsgeCA8PSB4MjsgeCsrKSB7CisgICAgICAgIHl5ID0geSA+PiAxNjsKKyAgICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHl5KSArIHhdKTsKKyAgICAgICAgRFJBV01FVEhPRDsKKyAgICAgICAgaWYgKHl5IDwgKHNjcmVlbnkgLSAxKSkgeworICAgICAgICAgIHAgKz0gc2NyZWVueTsKKyAgICAgICAgICAvKiBEUkFXTUVUSE9EOyAqLworICAgICAgICB9CisgICAgICAgIHkgKz0gZHk7CisgICAgICB9CisgICAgfQorICB9CisgIC8qICAgIDIgKi8KKyAgLyogICAvICAqLworICAvKiAgLyAgICovCisgIC8qIDEgICAgKi8KKyAgZWxzZSB7CisgICAgLyogc3RlZXAgKi8KKyAgICBpZiAoLWR5ID4gZHgpIHsKKyAgICAgIGR4ID0gKChkeCA8PCAxNikgLyAtZHkpOworICAgICAgeCA9ICh4MSArIDEpIDw8IDE2OworICAgICAgZm9yICh5ID0geTE7IHkgPj0geTI7IHktLSkgeworICAgICAgICB4eCA9IHggPj4gMTY7CisgICAgICAgIHAgPSAmKGRhdGFbKHNjcmVlbnggKiB5KSArIHh4XSk7CisgICAgICAgIERSQVdNRVRIT0Q7CisgICAgICAgIGlmICh4eCA8IChzY3JlZW54IC0gMSkpIHsKKyAgICAgICAgICBwLS07CisgICAgICAgICAgLyogRFJBV01FVEhPRDsgKi8KKyAgICAgICAgfQorICAgICAgICB4ICs9IGR4OworICAgICAgfQorICAgICAgZ290byBlbmRfb2ZfbGluZTsKKyAgICB9CisgICAgLyogc2hhbGxvdyAqLworICAgIGVsc2UgeworICAgICAgZHkgPSAoKGR5IDw8IDE2KSAvIGR4KTsKKyAgICAgIHkgPSB5MSA8PCAxNjsKKyAgICAgIGZvciAoeCA9IHgxOyB4IDw9IHgyOyB4KyspIHsKKyAgICAgICAgeXkgPSB5ID4+IDE2OworICAgICAgICBwID0gJihkYXRhWyhzY3JlZW54ICogeXkpICsgeF0pOworICAgICAgICBEUkFXTUVUSE9EOworICAgICAgICBpZiAoeXkgPCAoc2NyZWVueSAtIDEpKSB7CisgICAgICAgICAgcCArPSBzY3JlZW55OworICAgICAgICAgIC8qIERSQVdNRVRIT0Q7ICovCisgICAgICAgIH0KKyAgICAgICAgeSArPSBkeTsKKyAgICAgIH0KKyAgICAgIGdvdG8gZW5kX29mX2xpbmU7CisgICAgfQorICB9CitlbmRfb2ZfbGluZToKKyAgZW1tcyAoKTsKKyAgLyogX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlbW1zIik7ICovCit9CisjZWxzZQoraW50CittbXhfc3VwcG9ydGVkICh2b2lkKQoreworICByZXR1cm4gKDApOworfQorI2VuZGlmIC8qIEhBVkVfTU1YICovCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9tbXguaCBiL2dzdC9nb29tL21teC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NDllMTAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9tbXguaApAQCAtMCwwICsxLDc0MSBAQAorLyoJbW14LmgKKworCU11bHRpTWVkaWEgZVh0ZW5zaW9ucyBHQ0MgaW50ZXJmYWNlIGxpYnJhcnkgZm9yIElBMzIuCisKKwlUbyB1c2UgdGhpcyBsaWJyYXJ5LCBzaW1wbHkgaW5jbHVkZSB0aGlzIGhlYWRlciBmaWxlCisJYW5kIGNvbXBpbGUgd2l0aCBHQ0MuICBZb3UgTVVTVCBoYXZlIGlubGluaW5nIGVuYWJsZWQKKwlpbiBvcmRlciBmb3IgbW14X29rKCkgdG8gd29yazsgdGhpcyBjYW4gYmUgZG9uZSBieQorCXNpbXBseSB1c2luZyAtTyBvbiB0aGUgR0NDIGNvbW1hbmQgbGluZS4KKworCUNvbXBpbGluZyB3aXRoIC1ETU1YX1RSQUNFIHdpbGwgY2F1c2UgZGV0YWlsZWQgdHJhY2UKKwlvdXRwdXQgdG8gYmUgc2VudCB0byBzdGRlcnIgZm9yIGVhY2ggbW14IG9wZXJhdGlvbi4KKwlUaGlzIGFkZHMgbG90cyBvZiBjb2RlLCBhbmQgb2J2aW91c2x5IHNsb3dzIGV4ZWN1dGlvbiB0bworCWEgY3Jhd2wsIGJ1dCBjYW4gYmUgdmVyeSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KKworCVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWQorCUVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKwlMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorCUFORCBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFLgorCisJMTk5Ny05OSBieSBILiBEaWV0eiBhbmQgUi4gRmlzaGVyCisKKyBOb3RlczoKKwlJdCBhcHBlYXJzIHRoYXQgdGhlIGxhdGVzdCBnYXMgaGFzIHRoZSBwYW5kIHByb2JsZW0gZml4ZWQsIHRoZXJlZm9yZQorCSAgSSdsbCB1bmRlZmluZSBCUk9LRU5fUEFORCBieSBkZWZhdWx0LgorKi8KKworI2lmbmRlZiBfTU1YX0gKKyNkZWZpbmUgX01NWF9ICisKKyNpbmNsdWRlICJnb29tX2dyYXBoaWMuaCIKKworLyoJV2FybmluZzogIGF0IHRoaXMgd3JpdGluZywgdGhlIHZlcnNpb24gb2YgR0FTIHBhY2thZ2VkCisJd2l0aCBtb3N0IExpbnV4IGRpc3RyaWJ1dGlvbnMgZG9lcyBub3QgaGFuZGxlIHRoZQorCXBhcmFsbGVsIEFORCBvcGVyYXRpb24gbW5lbW9uaWMgY29ycmVjdGx5LiAgSWYgdGhlCisJc3ltYm9sIEJST0tFTl9QQU5EIGlzIGRlZmluZWQsIGEgc2xvd2VyIGFsdGVybmF0aXZlCisJY29kaW5nIHdpbGwgYmUgdXNlZC4gIElmIGV4ZWN1dGlvbiBvZiBtbXh0ZXN0IHJlc3VsdHMKKwlpbiBhbiBpbGxlZ2FsIGluc3RydWN0aW9uIGZhdWx0LCBkZWZpbmUgdGhpcyBzeW1ib2wuCisqLworI3VuZGVmCUJST0tFTl9QQU5ECisKKworLyoJVGhlIHR5cGUgb2YgYW4gdmFsdWUgdGhhdCBmaXRzIGluIGFuIE1NWCByZWdpc3RlcgorCShub3RlIHRoYXQgbG9uZyBsb25nIGNvbnN0YW50IHZhbHVlcyBNVVNUIGJlIHN1ZmZpeGVkCisJIGJ5IExMIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWVzIGJ5IFVMTCwgbGVzdAorCSB0aGV5IGJlIHRydW5jYXRlZCBieSB0aGUgY29tcGlsZXIpCisqLwordHlwZWRlZgl1bmlvbiB7CisJbG9uZyBsb25nCQlxOwkvKiBRdWFkd29yZCAoNjQtYml0KSB2YWx1ZSAqLworCXVuc2lnbmVkIGxvbmcgbG9uZwl1cTsJLyogVW5zaWduZWQgUXVhZHdvcmQgKi8KKwlpbnQJCQlkWzJdOwkvKiAyIERvdWJsZXdvcmQgKDMyLWJpdCkgdmFsdWVzICovCisJdW5zaWduZWQgaW50CQl1ZFsyXTsJLyogMiBVbnNpZ25lZCBEb3VibGV3b3JkICovCisJc2hvcnQJCQl3WzRdOwkvKiA0IFdvcmQgKDE2LWJpdCkgdmFsdWVzICovCisJdW5zaWduZWQgc2hvcnQJCXV3WzRdOwkvKiA0IFVuc2lnbmVkIFdvcmQgKi8KKwljaGFyCQkJYls4XTsJLyogOCBCeXRlICg4LWJpdCkgdmFsdWVzICovCisJdW5zaWduZWQgY2hhcgkJdWJbOF07CS8qIDggVW5zaWduZWQgQnl0ZSAqLworCWZsb2F0CQkJc1syXTsJLyogU2luZ2xlLXByZWNpc2lvbiAoMzItYml0KSB2YWx1ZSAqLworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoOCkpKSBtbXhfdDsJLyogT24gYW4gOC1ieXRlICg2NC1iaXQpIGJvdW5kYXJ5ICovCisKKworCisvKglGdW5jdGlvbiB0byB0ZXN0IGlmIG11bHRpbWVkaWEgaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQuLi4KKyovCitzdGF0aWMgaW50CittbV9zdXBwb3J0KHZvaWQpCit7CisJLyogUmV0dXJucyAxIGlmIE1NWCBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZCwKKwkgICAzIGlmIEN5cml4IE1NWCBhbmQgRXh0ZW5kZWQgTU1YIGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkCisJICAgNSBpZiBBTUQgTU1YIGFuZCAzRE5vdyEgaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQKKwkJIDEzIGlmIEFNRCBFeHRlbmRlZCBNTVgsICYzZE5vdyBzdXBwb3J0ZWQKKwkgICAwIGlmIGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgYW55IG9mIHRoZXNlCisJKi8KKwlyZWdpc3RlciBpbnQgcnZhbCA9IDA7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCS8qIFNlZSBpZiBDUFVJRCBpbnN0cnVjdGlvbiBpcyBzdXBwb3J0ZWQgLi4uICovCisJCS8qIC4uLiBHZXQgY29waWVzIG9mIEVGTEFHUyBpbnRvIGVheCBhbmQgZWN4ICovCisgICAgInB1c2hsICUlZWJ4XG5cdCIKKwkJInB1c2hmXG5cdCIKKwkJInBvcGwgJSVlYXhcblx0IgorCQkibW92bCAlJWVheCwgJSVlY3hcblx0IgorCisJCS8qIC4uLiBUb2dnbGUgdGhlIElEIGJpdCBpbiBvbmUgY29weSBhbmQgc3RvcmUgKi8KKwkJLyogICAgIHRvIHRoZSBFRkxBR1MgcmVnICovCisJCSJ4b3JsICQweDIwMDAwMCwgJSVlYXhcblx0IgorCQkicHVzaCAlJWVheFxuXHQiCisJCSJwb3BmXG5cdCIKKworCQkvKiAuLi4gR2V0IHRoZSAoaG9wZWZ1bGx5IG1vZGlmaWVkKSBFRkxBR1MgKi8KKwkJInB1c2hmXG5cdCIKKwkJInBvcGwgJSVlYXhcblx0IgorCisJCS8qIC4uLiBDb21wYXJlIGFuZCB0ZXN0IHJlc3VsdCAqLworCQkieG9ybCAlJWVheCwgJSVlY3hcblx0IgorCQkidGVzdGwgJDB4MjAwMDAwLCAlJWVjeFxuXHQiCisJCSJqeiBOb3RTdXBwb3J0ZWQxXG5cdCIJCS8qIENQVUlEIG5vdCBzdXBwb3J0ZWQgKi8KKworCisJCS8qIEdldCBzdGFuZGFyZCBDUFVJRCBpbmZvcm1hdGlvbiwgYW5kCisJCSAgICAgICBnbyB0byBhIHNwZWNpZmljIHZlbmRvciBzZWN0aW9uICovCisJCSJtb3ZsICQwLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisKKwkJLyogQ2hlY2sgZm9yIEludGVsICovCisJCSJjbXBsICQweDc1NmU2NTQ3LCAlJWVieFxuXHQiCisJCSJqbmUgVHJ5QU1EXG5cdCIKKwkJImNtcGwgJDB4NDk2NTZlNjksICUlZWR4XG5cdCIKKwkJImpuZSBUcnlBTURcblx0IgorCQkiY21wbCAkMHg2YzY1NzQ2ZSwgJSVlY3hcbiIKKwkJImpuZSBUcnlBTURcblx0IgorCQkiam1wIEludGVsXG5cdCIKKworCQkvKiBDaGVjayBmb3IgQU1EICovCisJCSJcblRyeUFNRDpcblx0IgorCQkiY21wbCAkMHg2ODc0NzU0MSwgJSVlYnhcblx0IgorCQkiam5lIFRyeUN5cml4XG5cdCIKKwkJImNtcGwgJDB4Njk3NDZlNjUsICUlZWR4XG5cdCIKKwkJImpuZSBUcnlDeXJpeFxuXHQiCisJCSJjbXBsICQweDQ0NGQ0MTYzLCAlJWVjeFxuIgorCQkiam5lIFRyeUN5cml4XG5cdCIKKwkJImptcCBBTURcblx0IgorCisJCS8qIENoZWNrIGZvciBDeXJpeCAqLworCQkiXG5UcnlDeXJpeDpcblx0IgorCQkiY21wbCAkMHg2OTcyNzk0MywgJSVlYnhcblx0IgorCQkiam5lIE5vdFN1cHBvcnRlZDJcblx0IgorCQkiY21wbCAkMHg3MzZlNDk3OCwgJSVlZHhcblx0IgorCQkiam5lIE5vdFN1cHBvcnRlZDNcblx0IgorCQkiY21wbCAkMHg2NDYxNjU3NCwgJSVlY3hcblx0IgorCQkiam5lIE5vdFN1cHBvcnRlZDRcblx0IgorCQkvKiBEcm9wIHRocm91Z2ggdG8gQ3lyaXguLi4gKi8KKworCisJCS8qIEN5cml4IFNlY3Rpb24gKi8KKwkJLyogU2VlIGlmIGV4dGVuZGVkIENQVUlEIGxldmVsIDgwMDAwMDAxIGlzIHN1cHBvcnRlZCAqLworCQkvKiBUaGUgdmFsdWUgb2YgQ1BVSUQvODAwMDAwMDEgZm9yIHRoZSA2eDg2TVggaXMgdW5kZWZpbmVkCisJCSAgIGFjY29yZGluZyB0byB0aGUgQ3lyaXggQ1BVIERldGVjdGlvbiBHdWlkZSAoUHJlbGltaW5hcnkKKwkJICAgUmV2LiAxLjAxIHRhYmxlIDEpLCBzbyB3ZSdsbCBjaGVjayB0aGUgdmFsdWUgb2YgZWF4IGZvcgorCQkgICBDUFVJRC8wIHRvIHNlZSBpZiBzdGFuZGFyZCBDUFVJRCBsZXZlbCAyIGlzIHN1cHBvcnRlZC4KKwkJICAgQWNjb3JkaW5nIHRvIHRoZSB0YWJsZSwgdGhlIG9ubHkgQ1BVIHdoaWNoIHN1cHBvcnRzIGxldmVsCisJCSAgIDIgaXMgYWxzbyB0aGUgb25seSBvbmUgd2hpY2ggc3VwcG9ydHMgZXh0ZW5kZWQgQ1BVSUQgbGV2ZWxzLgorCQkqLworCQkiY21wbCAkMHgyLCAlJWVheFxuXHQiCisJCSJqbmUgTU1YdGVzdFxuXHQiCS8qIFVzZSBzdGFuZGFyZCBDUFVJRCBpbnN0ZWFkICovCisKKwkJLyogRXh0ZW5kZWQgQ1BVSUQgc3VwcG9ydGVkIChpbiB0aGVvcnkpLCBzbyBnZXQgZXh0ZW5kZWQKKwkJICAgZmVhdHVyZXMgKi8KKwkJIm1vdmwgJDB4ODAwMDAwMDEsICUlZWF4XG5cdCIKKwkJImNwdWlkXG5cdCIKKwkJInRlc3RsICQweDAwODAwMDAwLCAlJWVheFxuXHQiCS8qIFRlc3QgZm9yIE1NWCAqLworCQkianogTm90U3VwcG9ydGVkNVxuXHQiCQkvKiBNTVggbm90IHN1cHBvcnRlZCAqLworCQkidGVzdGwgJDB4MDEwMDAwMDAsICUlZWF4XG5cdCIJLyogVGVzdCBmb3IgRXh0J2QgTU1YICovCisJCSJqbnogRU1NWFN1cHBvcnRlZFxuXHQiCisJCSJtb3ZsICQxLCAlMFxuXG5cdCIJCS8qIE1NWCBTdXBwb3J0ZWQgKi8KKwkJImptcCBSZXR1cm5cblxuIgorCQkiRU1NWFN1cHBvcnRlZDpcblx0IgorCQkibW92bCAkMywgJTBcblxuXHQiCQkvKiBFTU1YIGFuZCBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cdCIKKworCisJCS8qIEFNRCBTZWN0aW9uICovCisJCSJBTUQ6XG5cdCIKKworCQkvKiBTZWUgaWYgZXh0ZW5kZWQgQ1BVSUQgaXMgc3VwcG9ydGVkICovCisJCSJtb3ZsICQweDgwMDAwMDAwLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisJCSJjbXBsICQweDgwMDAwMDAwLCAlJWVheFxuXHQiCisJCSJqbCBNTVh0ZXN0XG5cdCIJLyogVXNlIHN0YW5kYXJkIENQVUlEIGluc3RlYWQgKi8KKworCQkvKiBFeHRlbmRlZCBDUFVJRCBzdXBwb3J0ZWQsIHNvIGdldCBleHRlbmRlZCBmZWF0dXJlcyAqLworCQkibW92bCAkMHg4MDAwMDAwMSwgJSVlYXhcblx0IgorCQkiY3B1aWRcblx0IgorCQkidGVzdGwgJDB4MDA4MDAwMDAsICUlZWR4XG5cdCIJLyogVGVzdCBmb3IgTU1YICovCisJCSJqeiBOb3RTdXBwb3J0ZWQ2XG5cdCIJCS8qIE1NWCBub3Qgc3VwcG9ydGVkICovCisJCSJ0ZXN0bCAkMHg4MDAwMDAwMCwgJSVlZHhcblx0IgkvKiBUZXN0IGZvciAzRE5vdyEgKi8KKwkJImpueiBUaHJlZUROb3dTdXBwb3J0ZWRcblx0IgorCQkibW92bCAkMSwgJTBcblxuXHQiCQkvKiBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cbiIKKwkJIlRocmVlRE5vd1N1cHBvcnRlZDpcblx0IgorCQkidGVzdGwgJDB4NDAwMDAwMDAsICUlZWR4XG5cdCIgLyogVGVzdCBBTUQgRXh0ZW5kZWQgTU1YICovCisJCSJqbnogQU1EWE1NWFN1cHBvcnRlZFxuXHQiCisJCSJtb3ZsICQ1LCAlMFxuXG5cdCIJCS8qIDNETm93ISBhbmQgTU1YIFN1cHBvcnRlZCAqLworCQkiam1wIFJldHVyblxuXHQiCisJCSJBTURYTU1YU3VwcG9ydGVkOlxuXHQiCisJCSJtb3ZsICQxMywgJTBcblxuXHQiCQkvKiBYTU1YLCAzRE5vdyEgYW5kIE1NWCBTdXBwb3J0ZWQgKi8KKwkJImptcCBSZXR1cm5cblx0IgorCisKKwkJLyogSW50ZWwgU2VjdGlvbiAqLworCQkiSW50ZWw6XG5cdCIKKworCQkvKiBDaGVjayBmb3IgTU1YICovCisJCSJNTVh0ZXN0OlxuXHQiCisJCSJtb3ZsICQxLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisJCSJ0ZXN0bCAkMHgwMDgwMDAwMCwgJSVlZHhcblx0IgkvKiBUZXN0IGZvciBNTVggKi8KKwkJImp6IE5vdFN1cHBvcnRlZDdcblx0IgkJLyogTU1YIE5vdCBzdXBwb3J0ZWQgKi8KKwkJIm1vdmwgJDEsICUwXG5cblx0IgkJLyogTU1YIFN1cHBvcnRlZCAqLworCQkiam1wIFJldHVyblxuXHQiCisKKwkJLyogTm90aGluZyBzdXBwb3J0ZWQgKi8KKwkJIlxuTm90U3VwcG9ydGVkMTpcblx0IgorCQkiI21vdmwgJDEwMSwgJTBcblxuXHQiCisJCSJcbk5vdFN1cHBvcnRlZDI6XG5cdCIKKwkJIiNtb3ZsICQxMDIsICUwXG5cblx0IgorCQkiXG5Ob3RTdXBwb3J0ZWQzOlxuXHQiCisJCSIjbW92bCAkMTAzLCAlMFxuXG5cdCIKKwkJIlxuTm90U3VwcG9ydGVkNDpcblx0IgorCQkiI21vdmwgJDEwNCwgJTBcblxuXHQiCisJCSJcbk5vdFN1cHBvcnRlZDU6XG5cdCIKKwkJIiNtb3ZsICQxMDUsICUwXG5cblx0IgorCQkiXG5Ob3RTdXBwb3J0ZWQ2OlxuXHQiCisJCSIjbW92bCAkMTA2LCAlMFxuXG5cdCIKKwkJIlxuTm90U3VwcG9ydGVkNzpcblx0IgorCQkiI21vdmwgJDEwNywgJTBcblxuXHQiCisJCSJtb3ZsICQwLCAlMFxuXG5cdCIKKworCQkiUmV0dXJuOlxuXHQiCisgICAgInBvcGwgJSVlYnhcblx0IgorCQk6ICI9WCIgKHJ2YWwpCisJCTogLyogbm8gaW5wdXQgKi8KKwkJOiAiZWF4IiwgImVjeCIsICJlZHgiCisJKTsKKworCS8qIFJldHVybiAqLworCXJldHVybihydmFsKTsKK30KKworLyoJRnVuY3Rpb24gdG8gdGVzdCBpZiBtbXggaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQuLi4KKyovCitzdGF0aWMgaW5saW5lIGludAorbW14X29rKHZvaWQpCit7CisJLyogUmV0dXJucyAxIGlmIE1NWCBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZCwgMCBvdGhlcndpc2UgKi8KKwlyZXR1cm4gKCBtbV9zdXBwb3J0KCkgJiAweDEgKTsKK30KKworaW50IG1teF9zdXBwb3J0ZWQgKHZvaWQpOworaW50IHhtbXhfc3VwcG9ydGVkICh2b2lkKTsKKworCisvKiBNTVggb3B0aW1pemVkIGltcGxlbWVudGF0aW9ucyAqLwordm9pZCBkcmF3X2xpbmVfbW14IChQaXhlbCAqZGF0YSwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgY29sLCBpbnQgc2NyZWVueCwgaW50IHNjcmVlbnkpOwordm9pZCBkcmF3X2xpbmVfeG1teCAoUGl4ZWwgKmRhdGEsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgaW50IGNvbCwgaW50IHNjcmVlbngsIGludCBzY3JlZW55KTsKK3ZvaWQgem9vbV9maWx0ZXJfbW14IChpbnQgcHJldlgsIGludCBwcmV2WSwgUGl4ZWwgKmV4cGl4MSwgUGl4ZWwgKmV4cGl4MiwKKwkJICAgICAgaW50ICpicnV0UywgaW50ICpicnV0RCwgaW50IGJ1ZmZyYXRpbywgaW50IHByZWNhbENvZWZbMTZdWzE2XSk7Cit2b2lkIHpvb21fZmlsdGVyX3htbXggKGludCBwcmV2WCwgaW50IHByZXZZLCBQaXhlbCAqZXhwaXgxLCBQaXhlbCAqZXhwaXgyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxicnVTLCBpbnQgKmxicnVELCBpbnQgYnVmZnJhdGlvLCBpbnQgcHJlY2FsQ29lZlsxNl1bMTZdKTsKKworCisvKglIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgaW5zdHJ1Y3Rpb24gbWFjcm9zIHRoYXQgZm9sbG93Li4uCisJKG5vdGUgdGhhdCBtZW1vcnktdG8tcmVnaXN0ZXIsIG0yciwgaW5zdHJ1Y3Rpb25zIGFyZSBuZWFybHkKKwkgYXMgZWZmaWNpZW50IGFzIHJlZ2lzdGVyLXRvLXJlZ2lzdGVyLCByMnIsIGluc3RydWN0aW9uczsKKwkgaG93ZXZlciwgbWVtb3J5LXRvLW1lbW9yeSBpbnN0cnVjdGlvbnMgYXJlIHJlYWxseSBzaW11bGF0ZWQKKwkgYXMgYSBjb252ZW5pZW5jZSwgYW5kIGFyZSBvbmx5IDEvMyBhcyBlZmZpY2llbnQpCisqLworI2lmZGVmCU1NWF9UUkFDRQorCisvKglJbmNsdWRlIHRoZSBzdHVmZiBmb3IgcHJpbnRpbmcgYSB0cmFjZSB0byBzdGRlcnIuLi4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lCW1teF9pMnIob3AsIGltbSwgcmVnKSBcCisJeyBcCisJCW1teF90IG1teF90cmFjZTsgXAorCQltbXhfdHJhY2UudXEgPSAoaW1tKTsgXAorCQlwcmludGYoI29wICJfaTJyKCIgI2ltbSAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlwcmludGYoI3JlZyAiPTB4JTA4eCUwOHgpID0+ICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUwLCAlJSIgI3JlZyBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCQkgICAgICA6ICJYIiAoaW1tKSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlwcmludGYoI3JlZyAiPTB4JTA4eCUwOHhcbiIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwl9CisKKyNkZWZpbmUJbW14X20ycihvcCwgbWVtLCByZWcpIFwKKwl7IFwKKwkJbW14X3QgbW14X3RyYWNlOyBcCisJCW1teF90cmFjZSA9IChtZW0pOyBcCisJCXByaW50Zigjb3AgIl9tMnIoIiAjbWVtICI9MHglMDh4JTA4eCwgIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWcgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCXByaW50ZigjcmVnICI9MHglMDh4JTA4eCkgPT4gIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAorCQkJCSAgICAgIDogIm0iIChtZW0pKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWcgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCXByaW50ZigjcmVnICI9MHglMDh4JTA4eFxuIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCX0KKworI2RlZmluZQltbXhfcjJtKG9wLCByZWcsIG1lbSkgXAorCXsgXAorCQltbXhfdCBtbXhfdHJhY2U7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlwcmludGYoI29wICJfcjJtKCIgI3JlZyAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJbW14X3RyYWNlID0gKG1lbSk7IFwKKwkJcHJpbnRmKCNtZW0gIj0weCUwOHglMDh4KSA9PiAiLCBcCisJCQltbXhfdHJhY2UuZFsxXSwgbW14X3RyYWNlLmRbMF0pOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlJSIgI3JlZyAiLCAlMCIgXAorCQkJCSAgICAgIDogIj1tIiAobWVtKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJbW14X3RyYWNlID0gKG1lbSk7IFwKKwkJcHJpbnRmKCNtZW0gIj0weCUwOHglMDh4XG4iLCBcCisJCQltbXhfdHJhY2UuZFsxXSwgbW14X3RyYWNlLmRbMF0pOyBcCisJfQorCisjZGVmaW5lCW1teF9yMnIob3AsIHJlZ3MsIHJlZ2QpIFwKKwl7IFwKKwkJbW14X3QgbW14X3RyYWNlOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZ3MgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCXByaW50Zigjb3AgIl9yMnIoIiAjcmVncyAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnZCAiLCAlMCIgXAorCQkJCSAgICAgIDogIj1YIiAobW14X3RyYWNlKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJcHJpbnRmKCNyZWdkICI9MHglMDh4JTA4eCkgPT4gIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJSIgI3JlZ3MgIiwgJSIgI3JlZ2QpOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZ2QgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCXByaW50ZigjcmVnZCAiPTB4JTA4eCUwOHhcbiIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwl9CisKKyNkZWZpbmUJbW14X20ybShvcCwgbWVtcywgbWVtZCkgXAorCXsgXAorCQltbXhfdCBtbXhfdHJhY2U7IFwKKwkJbW14X3RyYWNlID0gKG1lbXMpOyBcCisJCXByaW50Zigjb3AgIl9tMm0oIiAjbWVtcyAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJbW14X3RyYWNlID0gKG1lbWQpOyBcCisJCXByaW50ZigjbWVtZCAiPTB4JTA4eCUwOHgpID0+ICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUwLCAlJW1tMFxuXHQiIFwKKwkJCQkgICAgICAjb3AgIiAlMSwgJSVtbTBcblx0IiBcCisJCQkJICAgICAgIm1vdnEgJSVtbTAsICUwIiBcCisJCQkJICAgICAgOiAiPW0iIChtZW1kKSBcCisJCQkJICAgICAgOiAibSIgKG1lbXMpKTsgXAorCQltbXhfdHJhY2UgPSAobWVtZCk7IFwKKwkJcHJpbnRmKCNtZW1kICI9MHglMDh4JTA4eFxuIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCX0KKworI2Vsc2UKKworLyoJVGhlc2UgbWFjcm9zIGFyZSBhIGxvdCBzaW1wbGVyIHdpdGhvdXQgdGhlIHRyYWNpbmcuLi4KKyovCisKKyNkZWZpbmUJbW14X2kycihvcCwgaW1tLCByZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJYIiAoaW1tKSApCisKKyNkZWZpbmUJbW14X20ycihvcCwgbWVtLCByZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJtIiAobWVtKSkKKworI2RlZmluZQltbXhfcjJtKG9wLCByZWcsIG1lbSkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlJSIgI3JlZyAiLCAlMCIgXAorCQkJICAgICAgOiAiPW0iIChtZW0pIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyApCisKKyNkZWZpbmUJbW14X3IycihvcCwgcmVncywgcmVnZCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlIiAjcmVncyAiLCAlIiAjcmVnZCkKKworI2RlZmluZQltbXhfbTJtKG9wLCBtZW1zLCBtZW1kKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUwLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICNvcCAiICUxLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICJtb3ZxICUlbW0wLCAlMCIgXAorCQkJICAgICAgOiAiPW0iIChtZW1kKSBcCisJCQkgICAgICA6ICJtIiAobWVtcykpCisKKyNlbmRpZgorCisKKy8qCTF4NjQgTU9WZSBRdWFkd29yZAorCSh0aGlzIGlzIGJvdGggYSBsb2FkIGFuZCBhIHN0b3JlLi4uCisJIGluIGZhY3QsIGl0IGlzIHRoZSBvbmx5IHdheSB0byBzdG9yZSkKKyovCisjZGVmaW5lCW1vdnFfbTJyKHZhciwgcmVnKQltbXhfbTJyKG1vdnEsIHZhciwgcmVnKQorI2RlZmluZQltb3ZxX3IybShyZWcsIHZhcikJbW14X3IybShtb3ZxLCByZWcsIHZhcikKKyNkZWZpbmUJbW92cV9yMnIocmVncywgcmVnZCkJbW14X3Iycihtb3ZxLCByZWdzLCByZWdkKQorI2RlZmluZQltb3ZxKHZhcnMsIHZhcmQpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJTEsICUlbW0wXG5cdCIgXAorCQkJICAgICAgIm1vdnEgJSVtbTAsICUwIiBcCisJCQkgICAgICA6ICI9WCIgKHZhcmQpIFwKKwkJCSAgICAgIDogIlgiICh2YXJzKSkKKworCisvKgkxeDMyIE1PVmUgRG91Ymxld29yZAorCShsaWtlIG1vdnEsIHRoaXMgaXMgYm90aCBsb2FkIGFuZCBzdG9yZS4uLgorCSBidXQgaXMgbW9zdCB1c2VmdWwgZm9yIG1vdmluZyB0aGluZ3MgYmV0d2VlbgorCSBtbXggcmVnaXN0ZXJzIGFuZCBvcmRpbmFyeSByZWdpc3RlcnMpCisqLworI2RlZmluZQltb3ZkX20ycih2YXIsIHJlZykJbW14X20ycihtb3ZkLCB2YXIsIHJlZykKKyNkZWZpbmUJbW92ZF9yMm0ocmVnLCB2YXIpCW1teF9yMm0obW92ZCwgcmVnLCB2YXIpCisjZGVmaW5lCW1vdmRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIobW92ZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJbW92ZCh2YXJzLCB2YXJkKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZkICUxLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICJtb3ZkICUlbW0wLCAlMCIgXAorCQkJICAgICAgOiAiPVgiICh2YXJkKSBcCisJCQkgICAgICA6ICJYIiAodmFycykpCisKKworLyoJMngzMiwgNHgxNiwgYW5kIDh4OCBQYXJhbGxlbCBBRERzCisqLworI2RlZmluZQlwYWRkZF9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZGQsIHZhciwgcmVnKQorI2RlZmluZQlwYWRkZF9yMnIocmVncywgcmVnZCkJbW14X3IycihwYWRkZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZGQodmFycywgdmFyZCkJbW14X20ybShwYWRkZCwgdmFycywgdmFyZCkKKworI2RlZmluZQlwYWRkd19tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHcsIHZhciwgcmVnKQorI2RlZmluZQlwYWRkd19yMnIocmVncywgcmVnZCkJbW14X3IycihwYWRkdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHcodmFycywgdmFyZCkJbW14X20ybShwYWRkdywgdmFycywgdmFyZCkKKworI2RlZmluZQlwYWRkYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZGIsIHZhciwgcmVnKQorI2RlZmluZQlwYWRkYl9yMnIocmVncywgcmVnZCkJbW14X3IycihwYWRkYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZGIodmFycywgdmFyZCkJbW14X20ybShwYWRkYiwgdmFycywgdmFyZCkKKworCisvKgk0eDE2IGFuZCA4eDggUGFyYWxsZWwgQUREcyB1c2luZyBTYXR1cmF0aW9uIGFyaXRobWV0aWMKKyovCisjZGVmaW5lCXBhZGRzd19tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHN3LCB2YXIsIHJlZykKKyNkZWZpbmUJcGFkZHN3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBhZGRzdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHN3KHZhcnMsIHZhcmQpCW1teF9tMm0ocGFkZHN3LCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBhZGRzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHNiLCB2YXIsIHJlZykKKyNkZWZpbmUJcGFkZHNiX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBhZGRzYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHNiKHZhcnMsIHZhcmQpCW1teF9tMm0ocGFkZHNiLCB2YXJzLCB2YXJkKQorCisKKy8qCTR4MTYgYW5kIDh4OCBQYXJhbGxlbCBBRERzIHVzaW5nIFVuc2lnbmVkIFNhdHVyYXRpb24gYXJpdGhtZXRpYworKi8KKyNkZWZpbmUJcGFkZHVzd19tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHVzdywgdmFyLCByZWcpCisjZGVmaW5lCXBhZGR1c3dfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFkZHVzdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHVzdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBhZGR1c3csIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcGFkZHVzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFkZHVzYiwgdmFyLCByZWcpCisjZGVmaW5lCXBhZGR1c2JfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocGFkZHVzYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFkZHVzYih2YXJzLCB2YXJkKQltbXhfbTJtKHBhZGR1c2IsIHZhcnMsIHZhcmQpCisKKworLyoJMngzMiwgNHgxNiwgYW5kIDh4OCBQYXJhbGxlbCBTVUJzCisqLworI2RlZmluZQlwc3ViZF9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YmQsIHZhciwgcmVnKQorI2RlZmluZQlwc3ViZF9yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3ViZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YmQodmFycywgdmFyZCkJbW14X20ybShwc3ViZCwgdmFycywgdmFyZCkKKworI2RlZmluZQlwc3Vid19tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YncsIHZhciwgcmVnKQorI2RlZmluZQlwc3Vid19yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3VidywgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YncodmFycywgdmFyZCkJbW14X20ybShwc3VidywgdmFycywgdmFyZCkKKworI2RlZmluZQlwc3ViYl9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YmIsIHZhciwgcmVnKQorI2RlZmluZQlwc3ViYl9yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3ViYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YmIodmFycywgdmFyZCkJbW14X20ybShwc3ViYiwgdmFycywgdmFyZCkKKworCisvKgk0eDE2IGFuZCA4eDggUGFyYWxsZWwgU1VCcyB1c2luZyBTYXR1cmF0aW9uIGFyaXRobWV0aWMKKyovCisjZGVmaW5lCXBzdWJzd19tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnN3LCB2YXIsIHJlZykKKyNkZWZpbmUJcHN1YnN3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzdWJzdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YnN3KHZhcnMsIHZhcmQpCW1teF9tMm0ocHN1YnN3LCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBzdWJzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnNiLCB2YXIsIHJlZykKKyNkZWZpbmUJcHN1YnNiX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBzdWJzYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YnNiKHZhcnMsIHZhcmQpCW1teF9tMm0ocHN1YnNiLCB2YXJzLCB2YXJkKQorCisKKy8qCTR4MTYgYW5kIDh4OCBQYXJhbGxlbCBTVUJzIHVzaW5nIFVuc2lnbmVkIFNhdHVyYXRpb24gYXJpdGhtZXRpYworKi8KKyNkZWZpbmUJcHN1YnVzd19tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnVzdywgdmFyLCByZWcpCisjZGVmaW5lCXBzdWJ1c3dfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHN1YnVzdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YnVzdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBzdWJ1c3csIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHN1YnVzYl9tMnIodmFyLCByZWcpCW1teF9tMnIocHN1YnVzYiwgdmFyLCByZWcpCisjZGVmaW5lCXBzdWJ1c2JfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHN1YnVzYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHN1YnVzYih2YXJzLCB2YXJkKQltbXhfbTJtKHBzdWJ1c2IsIHZhcnMsIHZhcmQpCisKKworLyoJNHgxNiBQYXJhbGxlbCBNVUxzIGdpdmluZyBMb3cgNHgxNiBwb3J0aW9ucyBvZiByZXN1bHRzCisqLworI2RlZmluZQlwbXVsbHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBtdWxsdywgdmFyLCByZWcpCisjZGVmaW5lCXBtdWxsd19yMnIocmVncywgcmVnZCkJbW14X3IycihwbXVsbHcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBtdWxsdyh2YXJzLCB2YXJkKQltbXhfbTJtKHBtdWxsdywgdmFycywgdmFyZCkKKworCisvKgk0eDE2IFBhcmFsbGVsIE1VTHMgZ2l2aW5nIEhpZ2ggNHgxNiBwb3J0aW9ucyBvZiByZXN1bHRzCisqLworI2RlZmluZQlwbXVsaHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBtdWxodywgdmFyLCByZWcpCisjZGVmaW5lCXBtdWxod19yMnIocmVncywgcmVnZCkJbW14X3IycihwbXVsaHcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBtdWxodyh2YXJzLCB2YXJkKQltbXhfbTJtKHBtdWxodywgdmFycywgdmFyZCkKKworCisvKgk0eDE2LT4yeDMyIFBhcmFsbGVsIE11bC1BREQKKwkobXVscyBsaWtlIHBtdWxsdywgdGhlbiBhZGRzIGFkamFjZW50IDE2LWJpdCBmaWVsZHMKKwkgaW4gdGhlIG11bHRpcGx5IHJlc3VsdCB0byBtYWtlIHRoZSBmaW5hbCAyeDMyIHJlc3VsdCkKKyovCisjZGVmaW5lCXBtYWRkd2RfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBtYWRkd2QsIHZhciwgcmVnKQorI2RlZmluZQlwbWFkZHdkX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBtYWRkd2QsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBtYWRkd2QodmFycywgdmFyZCkJbW14X20ybShwbWFkZHdkLCB2YXJzLCB2YXJkKQorCisKKy8qCTF4NjQgYml0d2lzZSBBTkQKKyovCisjaWZkZWYJQlJPS0VOX1BBTkQKKyNkZWZpbmUJcGFuZF9tMnIodmFyLCByZWcpIFwKKwl7IFwKKwkJbW14X20ycihwYW5kbiwgKG1teF90KSAtMUxMLCByZWcpOyBcCisJCW1teF9tMnIocGFuZG4sIHZhciwgcmVnKTsgXAorCX0KKyNkZWZpbmUJcGFuZF9yMnIocmVncywgcmVnZCkgXAorCXsgXAorCQltbXhfbTJyKHBhbmRuLCAobW14X3QpIC0xTEwsIHJlZ2QpOyBcCisJCW1teF9yMnIocGFuZG4sIHJlZ3MsIHJlZ2QpIFwKKwl9CisjZGVmaW5lCXBhbmQodmFycywgdmFyZCkgXAorCXsgXAorCQltb3ZxX20ycih2YXJkLCBtbTApOyBcCisJCW1teF9tMnIocGFuZG4sIChtbXhfdCkgLTFMTCwgbW0wKTsgXAorCQltbXhfbTJyKHBhbmRuLCB2YXJzLCBtbTApOyBcCisJCW1vdnFfcjJtKG1tMCwgdmFyZCk7IFwKKwl9CisjZWxzZQorI2RlZmluZQlwYW5kX20ycih2YXIsIHJlZykJbW14X20ycihwYW5kLCB2YXIsIHJlZykKKyNkZWZpbmUJcGFuZF9yMnIocmVncywgcmVnZCkJbW14X3IycihwYW5kLCByZWdzLCByZWdkKQorI2RlZmluZQlwYW5kKHZhcnMsIHZhcmQpCW1teF9tMm0ocGFuZCwgdmFycywgdmFyZCkKKyNlbmRpZgorCisKKy8qCTF4NjQgYml0d2lzZSBBTkQgd2l0aCBOb3QgdGhlIGRlc3RpbmF0aW9uCisqLworI2RlZmluZQlwYW5kbl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFuZG4sIHZhciwgcmVnKQorI2RlZmluZQlwYW5kbl9yMnIocmVncywgcmVnZCkJbW14X3IycihwYW5kbiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFuZG4odmFycywgdmFyZCkJbW14X20ybShwYW5kbiwgdmFycywgdmFyZCkKKworCisvKgkxeDY0IGJpdHdpc2UgT1IKKyovCisjZGVmaW5lCXBvcl9tMnIodmFyLCByZWcpCW1teF9tMnIocG9yLCB2YXIsIHJlZykKKyNkZWZpbmUJcG9yX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBvciwgcmVncywgcmVnZCkKKyNkZWZpbmUJcG9yKHZhcnMsIHZhcmQpCW1teF9tMm0ocG9yLCB2YXJzLCB2YXJkKQorCisKKy8qCTF4NjQgYml0d2lzZSBlWGNsdXNpdmUgT1IKKyovCisjZGVmaW5lCXB4b3JfbTJyKHZhciwgcmVnKQltbXhfbTJyKHB4b3IsIHZhciwgcmVnKQorI2RlZmluZQlweG9yX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHB4b3IsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXB4b3IodmFycywgdmFyZCkJbW14X20ybShweG9yLCB2YXJzLCB2YXJkKQorCisKKy8qCTJ4MzIsIDR4MTYsIGFuZCA4eDggUGFyYWxsZWwgQ29NUGFyZSBmb3IgRVF1YWxpdHkKKwkocmVzdWx0aW5nIGZpZWxkcyBhcmUgZWl0aGVyIDAgb3IgLTEpCisqLworI2RlZmluZQlwY21wZXFkX20ycih2YXIsIHJlZykJbW14X20ycihwY21wZXFkLCB2YXIsIHJlZykKKyNkZWZpbmUJcGNtcGVxZF9yMnIocmVncywgcmVnZCkJbW14X3IycihwY21wZXFkLCByZWdzLCByZWdkKQorI2RlZmluZQlwY21wZXFkKHZhcnMsIHZhcmQpCW1teF9tMm0ocGNtcGVxZCwgdmFycywgdmFyZCkKKworI2RlZmluZQlwY21wZXF3X20ycih2YXIsIHJlZykJbW14X20ycihwY21wZXF3LCB2YXIsIHJlZykKKyNkZWZpbmUJcGNtcGVxd19yMnIocmVncywgcmVnZCkJbW14X3IycihwY21wZXF3LCByZWdzLCByZWdkKQorI2RlZmluZQlwY21wZXF3KHZhcnMsIHZhcmQpCW1teF9tMm0ocGNtcGVxdywgdmFycywgdmFyZCkKKworI2RlZmluZQlwY21wZXFiX20ycih2YXIsIHJlZykJbW14X20ycihwY21wZXFiLCB2YXIsIHJlZykKKyNkZWZpbmUJcGNtcGVxYl9yMnIocmVncywgcmVnZCkJbW14X3IycihwY21wZXFiLCByZWdzLCByZWdkKQorI2RlZmluZQlwY21wZXFiKHZhcnMsIHZhcmQpCW1teF9tMm0ocGNtcGVxYiwgdmFycywgdmFyZCkKKworCisvKgkyeDMyLCA0eDE2LCBhbmQgOHg4IFBhcmFsbGVsIENvTVBhcmUgZm9yIEdyZWF0ZXIgVGhhbgorCShyZXN1bHRpbmcgZmllbGRzIGFyZSBlaXRoZXIgMCBvciAtMSkKKyovCisjZGVmaW5lCXBjbXBndGRfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBjbXBndGQsIHZhciwgcmVnKQorI2RlZmluZQlwY21wZ3RkX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBjbXBndGQsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBjbXBndGQodmFycywgdmFyZCkJbW14X20ybShwY21wZ3RkLCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBjbXBndHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBjbXBndHcsIHZhciwgcmVnKQorI2RlZmluZQlwY21wZ3R3X3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBjbXBndHcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBjbXBndHcodmFycywgdmFyZCkJbW14X20ybShwY21wZ3R3LCB2YXJzLCB2YXJkKQorCisjZGVmaW5lCXBjbXBndGJfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBjbXBndGIsIHZhciwgcmVnKQorI2RlZmluZQlwY21wZ3RiX3IycihyZWdzLCByZWdkKQltbXhfcjJyKHBjbXBndGIsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBjbXBndGIodmFycywgdmFyZCkJbW14X20ybShwY21wZ3RiLCB2YXJzLCB2YXJkKQorCisKKy8qCTF4NjQsIDJ4MzIsIGFuZCA0eDE2IFBhcmFsbGVsIFNoaWZ0IExlZnQgTG9naWNhbAorKi8KKyNkZWZpbmUJcHNsbHFfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzbGxxLCBpbW0sIHJlZykKKyNkZWZpbmUJcHNsbHFfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzbGxxLCB2YXIsIHJlZykKKyNkZWZpbmUJcHNsbHFfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNsbHEsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzbGxxKHZhcnMsIHZhcmQpCW1teF9tMm0ocHNsbHEsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHNsbGRfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzbGxkLCBpbW0sIHJlZykKKyNkZWZpbmUJcHNsbGRfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzbGxkLCB2YXIsIHJlZykKKyNkZWZpbmUJcHNsbGRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNsbGQsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzbGxkKHZhcnMsIHZhcmQpCW1teF9tMm0ocHNsbGQsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHNsbHdfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzbGx3LCBpbW0sIHJlZykKKyNkZWZpbmUJcHNsbHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzbGx3LCB2YXIsIHJlZykKKyNkZWZpbmUJcHNsbHdfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNsbHcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzbGx3KHZhcnMsIHZhcmQpCW1teF9tMm0ocHNsbHcsIHZhcnMsIHZhcmQpCisKKworLyoJMXg2NCwgMngzMiwgYW5kIDR4MTYgUGFyYWxsZWwgU2hpZnQgUmlnaHQgTG9naWNhbAorKi8KKyNkZWZpbmUJcHNybHFfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzcmxxLCBpbW0sIHJlZykKKyNkZWZpbmUJcHNybHFfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzcmxxLCB2YXIsIHJlZykKKyNkZWZpbmUJcHNybHFfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNybHEsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzcmxxKHZhcnMsIHZhcmQpCW1teF9tMm0ocHNybHEsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHNybGRfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzcmxkLCBpbW0sIHJlZykKKyNkZWZpbmUJcHNybGRfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzcmxkLCB2YXIsIHJlZykKKyNkZWZpbmUJcHNybGRfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNybGQsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzcmxkKHZhcnMsIHZhcmQpCW1teF9tMm0ocHNybGQsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHNybHdfaTJyKGltbSwgcmVnKQltbXhfaTJyKHBzcmx3LCBpbW0sIHJlZykKKyNkZWZpbmUJcHNybHdfbTJyKHZhciwgcmVnKQltbXhfbTJyKHBzcmx3LCB2YXIsIHJlZykKKyNkZWZpbmUJcHNybHdfcjJyKHJlZ3MsIHJlZ2QpCW1teF9yMnIocHNybHcsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXBzcmx3KHZhcnMsIHZhcmQpCW1teF9tMm0ocHNybHcsIHZhcnMsIHZhcmQpCisKKworLyoJMngzMiBhbmQgNHgxNiBQYXJhbGxlbCBTaGlmdCBSaWdodCBBcml0aG1ldGljCisqLworI2RlZmluZQlwc3JhZF9pMnIoaW1tLCByZWcpCW1teF9pMnIocHNyYWQsIGltbSwgcmVnKQorI2RlZmluZQlwc3JhZF9tMnIodmFyLCByZWcpCW1teF9tMnIocHNyYWQsIHZhciwgcmVnKQorI2RlZmluZQlwc3JhZF9yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3JhZCwgcmVncywgcmVnZCkKKyNkZWZpbmUJcHNyYWQodmFycywgdmFyZCkJbW14X20ybShwc3JhZCwgdmFycywgdmFyZCkKKworI2RlZmluZQlwc3Jhd19pMnIoaW1tLCByZWcpCW1teF9pMnIocHNyYXcsIGltbSwgcmVnKQorI2RlZmluZQlwc3Jhd19tMnIodmFyLCByZWcpCW1teF9tMnIocHNyYXcsIHZhciwgcmVnKQorI2RlZmluZQlwc3Jhd19yMnIocmVncywgcmVnZCkJbW14X3Iycihwc3JhdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcHNyYXcodmFycywgdmFyZCkJbW14X20ybShwc3JhdywgdmFycywgdmFyZCkKKworCisvKgkyeDMyLT40eDE2IGFuZCA0eDE2LT44eDggUEFDSyBhbmQgU2lnbmVkIFNhdHVyYXRlCisJKHBhY2tzIHNvdXJjZSBhbmQgZGVzdCBmaWVsZHMgaW50byBkZXN0IGluIHRoYXQgb3JkZXIpCisqLworI2RlZmluZQlwYWNrc3Nkd19tMnIodmFyLCByZWcpCW1teF9tMnIocGFja3NzZHcsIHZhciwgcmVnKQorI2RlZmluZQlwYWNrc3Nkd19yMnIocmVncywgcmVnZCkgbW14X3IycihwYWNrc3NkdywgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFja3NzZHcodmFycywgdmFyZCkJbW14X20ybShwYWNrc3NkdywgdmFycywgdmFyZCkKKworI2RlZmluZQlwYWNrc3N3Yl9tMnIodmFyLCByZWcpCW1teF9tMnIocGFja3Nzd2IsIHZhciwgcmVnKQorI2RlZmluZQlwYWNrc3N3Yl9yMnIocmVncywgcmVnZCkgbW14X3IycihwYWNrc3N3YiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGFja3Nzd2IodmFycywgdmFyZCkJbW14X20ybShwYWNrc3N3YiwgdmFycywgdmFyZCkKKworCisvKgk0eDE2LT44eDggUEFDSyBhbmQgVW5zaWduZWQgU2F0dXJhdGUKKwkocGFja3Mgc291cmNlIGFuZCBkZXN0IGZpZWxkcyBpbnRvIGRlc3QgaW4gdGhhdCBvcmRlcikKKyovCisjZGVmaW5lCXBhY2t1c3diX20ycih2YXIsIHJlZykJbW14X20ycihwYWNrdXN3YiwgdmFyLCByZWcpCisjZGVmaW5lCXBhY2t1c3diX3IycihyZWdzLCByZWdkKSBtbXhfcjJyKHBhY2t1c3diLCByZWdzLCByZWdkKQorI2RlZmluZQlwYWNrdXN3Yih2YXJzLCB2YXJkKQltbXhfbTJtKHBhY2t1c3diLCB2YXJzLCB2YXJkKQorCisKKy8qCTJ4MzItPjF4NjQsIDR4MTYtPjJ4MzIsIGFuZCA4eDgtPjR4MTYgVU5QYUNLIExvdworCShpbnRlcmxlYXZlcyBsb3cgaGFsZiBvZiBkZXN0IHdpdGggbG93IGhhbGYgb2Ygc291cmNlCisJIGFzIHBhZGRpbmcgaW4gZWFjaCByZXN1bHQgZmllbGQpCisqLworI2RlZmluZQlwdW5wY2tsZHFfbTJyKHZhciwgcmVnKQltbXhfbTJyKHB1bnBja2xkcSwgdmFyLCByZWcpCisjZGVmaW5lCXB1bnBja2xkcV9yMnIocmVncywgcmVnZCkgbW14X3IycihwdW5wY2tsZHEsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXB1bnBja2xkcSh2YXJzLCB2YXJkKQltbXhfbTJtKHB1bnBja2xkcSwgdmFycywgdmFyZCkKKworI2RlZmluZQlwdW5wY2tsd2RfbTJyKHZhciwgcmVnKQltbXhfbTJyKHB1bnBja2x3ZCwgdmFyLCByZWcpCisjZGVmaW5lCXB1bnBja2x3ZF9yMnIocmVncywgcmVnZCkgbW14X3IycihwdW5wY2tsd2QsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXB1bnBja2x3ZCh2YXJzLCB2YXJkKQltbXhfbTJtKHB1bnBja2x3ZCwgdmFycywgdmFyZCkKKworI2RlZmluZQlwdW5wY2tsYndfbTJyKHZhciwgcmVnKQltbXhfbTJyKHB1bnBja2xidywgdmFyLCByZWcpCisjZGVmaW5lCXB1bnBja2xid19yMnIocmVncywgcmVnZCkgbW14X3IycihwdW5wY2tsYncsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCXB1bnBja2xidyh2YXJzLCB2YXJkKQltbXhfbTJtKHB1bnBja2xidywgdmFycywgdmFyZCkKKworCisvKgkyeDMyLT4xeDY0LCA0eDE2LT4yeDMyLCBhbmQgOHg4LT40eDE2IFVOUGFDSyBIaWdoCisJKGludGVybGVhdmVzIGhpZ2ggaGFsZiBvZiBkZXN0IHdpdGggaGlnaCBoYWxmIG9mIHNvdXJjZQorCSBhcyBwYWRkaW5nIGluIGVhY2ggcmVzdWx0IGZpZWxkKQorKi8KKyNkZWZpbmUJcHVucGNraGRxX20ycih2YXIsIHJlZykJbW14X20ycihwdW5wY2toZHEsIHZhciwgcmVnKQorI2RlZmluZQlwdW5wY2toZHFfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocHVucGNraGRxLCByZWdzLCByZWdkKQorI2RlZmluZQlwdW5wY2toZHEodmFycywgdmFyZCkJbW14X20ybShwdW5wY2toZHEsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHVucGNraHdkX20ycih2YXIsIHJlZykJbW14X20ycihwdW5wY2tod2QsIHZhciwgcmVnKQorI2RlZmluZQlwdW5wY2tod2RfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocHVucGNraHdkLCByZWdzLCByZWdkKQorI2RlZmluZQlwdW5wY2tod2QodmFycywgdmFyZCkJbW14X20ybShwdW5wY2tod2QsIHZhcnMsIHZhcmQpCisKKyNkZWZpbmUJcHVucGNraGJ3X20ycih2YXIsIHJlZykJbW14X20ycihwdW5wY2toYncsIHZhciwgcmVnKQorI2RlZmluZQlwdW5wY2toYndfcjJyKHJlZ3MsIHJlZ2QpIG1teF9yMnIocHVucGNraGJ3LCByZWdzLCByZWdkKQorI2RlZmluZQlwdW5wY2toYncodmFycywgdmFyZCkJbW14X20ybShwdW5wY2toYncsIHZhcnMsIHZhcmQpCisKKworLyoJRW1wdHkgTU14IFN0YXRlCisJKHVzZWQgdG8gY2xlYW4tdXAgd2hlbiBnb2luZyBmcm9tIG1teCB0byBmbG9hdCB1c2UKKwkgb2YgdGhlIHJlZ2lzdGVycyB0aGF0IGFyZSBzaGFyZWQgYnkgYm90aDsgbm90ZSB0aGF0CisJIHRoZXJlIGlzIG5vIGZsb2F0LXRvLW1teCBvcGVyYXRpb24gbmVlZGVkLCBiZWNhdXNlCisJIG9ubHkgdGhlIGZsb2F0IHRhZyB3b3JkIGluZm8gaXMgY29ycnVwdGlibGUpCisqLworI2lmZGVmCU1NWF9UUkFDRQorCisjaWZkZWYgX19jbGFuZ19fCisjZGVmaW5lIGVtbXMoKSBcCisJeyBcCisJCXByaW50ZigiZW1tcygpXG4iKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVtbXMiKTsgXAorCX0KKyNlbHNlCisjZGVmaW5lCWVtbXMoKSBcCisJeyBcCisJCXByaW50ZigiZW1tcygpXG4iKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVtbXMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdCgxKSIsInN0KDIpIiwic3QoMykiLCJzdCg0KSIsInN0KDUpIiwic3QoNikiLCJzdCg3KSIpOyBcCisJfQorI2VuZGlmCisKKyNlbHNlCisKKyNpZmRlZiBfX2NsYW5nX18KKyNkZWZpbmUJZW1tcygpIF9fYXNtX18gX192b2xhdGlsZV9fICgiZW1tcyIpCisjZWxzZQorI2RlZmluZQllbW1zKCkgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlbW1zIjo6OiBcCisgICAgICAgICAgICAgICAgICAgICAgInN0KDEpIiwic3QoMikiLCJzdCgzKSIsInN0KDQpIiwic3QoNSkiLCJzdCg2KSIsInN0KDcpIikKKyNlbmRpZgorCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2dzdC9nb29tL21vdGlmX2dvb20xLmggYi9nc3QvZ29vbS9tb3RpZl9nb29tMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZjM4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9tb3RpZl9nb29tMS5oCkBAIC0wLDAgKzEsMTA0NCBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworc3RhdGljIE1vdGlmIENPTlZfTU9USUYxID0geworCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDksOSw3LDIsMiw5LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDExLAorCTExLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTIsNyw0LDAsMCwwLDIsMCwwLDMsMTQsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTIsMTAsOSw5LDQsMSwwLAorCTEsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxMCwzLDAsMCwwLDEsMSwzLDUsMCwwLDEsMTQsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsNiwzLDEsMSw0LDksMSwKKwkxLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTAsMywwLDAsMiw3LDEzLDE0LDE0LDE0LDcsMCwwLDIsMTQsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTIsMSw5LDE1LDE1LDE1LDE1LDMsCisJMCwxMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEyLDQsCisJMCwwLDIsMTAsMTUsMTUsMTUsMTUsMTUsMTUsMSwwLDAsMTAsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsOSwwLDIsMTQsMTUsMTUsMTUsNywKKwkwLDksMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCw2LDAsMCwKKwkyLDksMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTMsMCwwLDMsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTEsMCwwLDEwLDE1LDE1LDE1LDksCisJMCw5LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTMsMywwLDEsNSwKKwk1LDQsNCw0LDYsMTIsMTUsMTUsMTUsMTMsMCwwLDcsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMCwwLDUsMTUsMTUsMTUsMTAsCisJMCw3LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTEsMSwwLDMsMywxLAorCTAsMCwwLDAsMCwwLDUsMTMsMTUsMTIsMCwwLDEzLDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDE0LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE0LDAsMCwxLDE1LDE1LDE1LDEyLAorCTAsMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEwLDEsMiw0LDAsMCwxLAorCTksMTIsMTIsMTIsOSwzLDAsMiwxNCw1LDAsNywxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCw3LDQsNCwxLDEsMTIsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMSwwLDAsMTIsMTUsMTUsMTUsCisJMSwwLDEyLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTAsMCwzLDIsMCwwLDMsMTIsCisJMTUsMTUsMTUsMTUsMTUsMTQsMiwxLDEzLDIsMCwxMiwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCwzLDAsMCwwLDAsMCwyLAorCTEzLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE0LDEsMCwwLDgsMTUsMTUsMTUsCisJMSwwLDksMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMiwyLDEsMCwwLDAsOSwxNCwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNCwxLDEsMTEsMCwzLDE0LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDcsNCwxMSwxMiwxMCwxLDAsCisJMywxMiwxNSwxNSwxNSwxNSwxNSwxNSwxMywxLDEsMCw0LDE1LDE1LDE1LAorCTIsMCwxMCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE0LDIsMSwwLDAsMywxMiwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxMSwwLDUsOSwxLDEyLDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDUsMSwxMywxNSwxNSwxMiwxLAorCTAsMSw5LDE1LDE1LDE1LDE1LDE1LDE0LDIsNSwwLDEsMTQsMTUsMTUsCisJMiwwLDcsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNCwzLDAsMCwwLDcsMTQsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsOSwwLDgsNyw0LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDcsMCw3LDgsMTEsMTUsMTMsCisJMiwwLDAsMywxMCwxNSwxNSwxNSwxNSw1LDExLDAsMCwxMSwxNSwxNSwKKwk2LDAsMiwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDYsMCwwLDAsOCwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSw2LDAsNCwwLDYsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTQsOSwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMSwwLDMsMywwLDgsMTUsCisJMTQsNSwwLDAsMCw0LDEyLDE1LDE1LDUsMTMsMiwwLDYsMTUsMTUsCisJMTIsMCwwLDExLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTAsMCwwLDAsOCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxMCwxLDcsNiw0LDEzLDE1LDE1LDE1LDE1LDEzLDExLAorCTYsMCw4LDExLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEsMSwxMSwyLDAsNSwKKwkxNCwxNSw4LDAsMCwwLDAsNywxNSw1LDE0LDYsMCwyLDE1LDE1LAorCTE1LDMsMCw1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTMsMSwwLDAsNywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSw3LDksMTUsMTUsMTUsMTUsMTUsMTUsMTIsNiwyLDEsCisJMSwxLDgsNiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw0LDAsNiwxMiwxLDAsCisJMywxMywxNSwxMSwyLDAsMCwwLDgsNCwxNCwxMCwwLDAsMTMsMTUsCisJMTUsNywwLDEsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSw1LDAsMCw1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDEzLDE1LDE1LDE1LDE1LDE0LDgsMywxLDIsNywxMSwKKwk1LDQsNSw2LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDgsMCwxLDE0LDExLDAsCisJMCwxLDksMTUsMTQsNSwwLDAsMiw0LDE0LDEzLDAsMCwxMCwxNSwKKwkxNSwxMiwwLDAsMTIsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxMCwwLDAsMSwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNCwxMyw3LDIsMCw1LDksMTUsMTUsMTUsCisJNSwzLDYsOSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywwLDAsOSwxNSwxMiwKKwkyLDAsMCw0LDEzLDE0LDQsMCwzLDIsMTIsMTUsMSwwLDUsMTUsCisJMTUsMTQsMSwwLDgsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwyLDAsMCw5LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDEyLDExLDYsMSwwLDIsMywxMCwxNSwxNSwxNSwxNSw3LAorCTEsMiw0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDUsMCwzLDE0LDE1LAorCTksMiwwLDAsMSw2LDEyLDEzLDEzLDEsOSwxMiwwLDAsMiwxNCwKKwkxNSwxNSw0LDAsNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDEwLDAsMCwyLDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTEzLDksNiwwLDEsMiw5LDEwLDE1LDE1LDE1LDE1LDE0LDcsMSwwLAorCTYsMiw0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDExLDAsMCw5LDE1LAorCTQsNCwxMSw2LDEsMCwwLDEsMSwwLDEwLDQsMCwwLDAsMTIsCisJMTUsMTUsOSwwLDEsMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwzLDAsMCw4LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDEyLDQsNCwKKwkxLDEsMywxMCwxMiwxNSwxNSwxNSwxNSwxNSw5LDIsMSwwLDEsNiwKKwk2LDAsMTAsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsNCwwLDMsMTQsCisJNCwzLDE1LDE1LDE0LDksNyw5LDEsMCwwLDAsMCwxLDAsNywKKwkxNSwxNSwxMywwLDAsOSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTEzLDAsMCwxLDE0LDE1LDE1LDE1LDE1LDE1LDEyLDksMSwwLDEsNCwKKwk3LDE1LDE1LDE1LDE1LDE1LDE1LDE0LDgsMiwwLDAsMCwyLDEzLDksCisJMCw0LDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDExLDAsMCw5LAorCTMsMCw4LDE0LDE1LDE1LDE1LDE1LDEwLDUsNCw0LDcsNCwwLDMsCisJMTUsMTUsMTUsNCwwLDMsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwk1LDAsMCw1LDE1LDE1LDE1LDE1LDE0LDgsNyw4LDEwLDEyLDE0LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDExLDEsMCwwLDAsNSwxMSwxNSwxMywxLAorCTEsMTMsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMywwLDQsCisJNCwwLDAsMiw2LDEwLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEwLDAsMCwKKwkxMiwxNSwxNSw5LDAsMCwxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTEsMCwwLDEwLDE1LDE1LDE1LDE1LDE1LDEzLDE0LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE0LDcsMSwwLDAsMywxMiwxNSwxNSwxNSw2LDAsCisJNywxNSwxNSwxNSwxMiwxMCw5LDEwLDEyLDE0LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDksMCwwLAorCTgsMywxLDQsMSwwLDEsMTIsMTUsMTUsMTUsMTUsMTUsMTQsMiwwLAorCTYsMTUsMTUsMTUsMiwwLDYsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkwLDAsMSwxNCwxNSwxNSwxNSwxNSwxNCw1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDcsMiwwLDAsMSw4LDE1LDE1LDE1LDE1LDEyLDAsMiwKKwkxNCwxNSwxMiw0LDAsMCwwLDAsMCwxLDUsMTAsMTQsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMCwwLAorCTUsNCwxLDE0LDE1LDEwLDcsMTMsMTUsMTUsMTUsMTUsMTUsMTUsOCwwLAorCTEsMTQsMTUsMTUsNywwLDEsMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywKKwkwLDAsNCwxNSwxNSwxNSwxNSwxNSwxMywyLDEzLDE1LDE1LDE1LDE1LDE1LAorCTEyLDcsMCwwLDAsMCw1LDEyLDE1LDE1LDE1LDE1LDE0LDMsMCw5LAorCTExLDEsMCwwLDEsMSwwLDEsMCwwLDAsMCwyLDEyLDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE0LDE1LDE1LDE1LDE1LDE1LDE1LDIsMCwKKwk1LDIsMSwxNCwxNSwxNCwxMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMiwwLAorCTAsMTAsMTUsMTUsMTMsMCwwLDksMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMiwKKwkwLDAsNCwxNSwxNSwxNSwxNSwxNSwxMiwwLDEyLDE1LDE1LDE1LDEyLDYsCisJMCwwLDAsMCw2LDE0LDE1LDE1LDE1LDE1LDE1LDE1LDcsMCwwLDEyLAorCTEsMCwwLDIsMiwxLDEsNywxMiw4LDMsMCwwLDEsMTMsMTUsCisJMTUsMTUsMTUsMTUsMTUsOCw0LDgsMTIsMTUsMTUsMTUsMTUsMTUsOCwwLAorCTQsMiwwLDE0LDE1LDExLDksMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMywKKwkwLDUsMTUsMTUsMTUsNSwwLDMsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMiwKKwkwLDAsNCwxNSwxNSwxNSwxNSwxNSwxMiwwLDEyLDE1LDEzLDMsMSwwLAorCTAsMCw1LDEyLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEyLDAsMCw3LDcsCisJMCwwLDAsMCwwLDAsMCwxLDEyLDE1LDE1LDEyLDMsMCw1LDE1LAorCTE1LDE1LDE1LDE0LDUsMCwwLDAsMCwyLDIsMyw3LDE0LDksOCwKKwkxNCwyLDEsMTQsMTUsMiwxMiwxMywxNSwxNSwxNSwxNSwxNSwxNSwxNSw5LAorCTAsMCwxMywxNSwxNSwxMCwwLDAsMTIsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywKKwkwLDAsNSwxNSwxNSwxNSwxNSwxNSwxMiwwLDExLDEwLDEsMCwwLDEsCisJNSwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw2LDAsMiw3LDAsCisJMCwwLDAsMSwyLDcsNCwwLDMsMTQsMTUsMTUsMTQsMiwwLDEyLAorCTE1LDE1LDE1LDksMCwxLDIsMSwwLDAsMCwwLDAsMSwzLDcsCisJMTUsMywwLDE0LDE1LDQsMTIsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsCisJMSwwLDgsMTUsMTUsMTQsMSwwLDgsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywKKwkwLDAsNCwxNSwxNSwxNSwxNSwxNSwxMiwwLDIsMCwwLDEsMTAsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTIsMCwwLDYsMCwwLAorCTAsMSwxMCwxNCwxNSwxNSwxMSwxLDAsOSwxNSwxNSwxNSw4LDAsOSwKKwkxNSwxNSwxMiw0LDgsMTQsMTUsOCwxLDAsMCwwLDAsMCwxLDksCisJMTUsMiwwLDEzLDE1LDEsOSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwk2LDAsMSwxNCwxNSwxNCwxLDAsMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE0LAorCTEsMCwxLDE0LDE1LDE1LDE1LDE1LDEyLDEsMyw3LDksMTMsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMywwLDIsMywwLDQsCisJMCw4LDE1LDE1LDE1LDE1LDE1LDEzLDEsMiwxNCwxNSwxNSwxMCwwLDYsCisJMTUsMTQsMiw2LDE1LDE1LDE1LDEsMyw3LDMsMCwwLDAsMCwxLAorCTExLDEsMCwxMSwxMiwwLDEyLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTExLDAsMCw5LDE1LDE1LDQsMCwwLDEyLDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJNiwwLDAsOSwxNSwxNSwxNSwxNSwxNSwxMiwxNCwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMSwwLDAsMywwLDgsMTQsCisJMiw1LDE1LDE1LDE1LDE1LDE1LDE1LDUsMCw4LDE1LDE1LDEyLDAsNCwKKwkxNSw1LDIsMTQsMTUsMTUsMTAsMCwxMywxNSwxMywyLDQsNSw1LDAsCisJOSwxLDAsMTAsOSwxLDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTEzLDAsMCwzLDE1LDE1LDksMCwwLDgsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxMiwwLDAsMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwzLDAsMSwxLDUsMTQsMTUsCisJMTEsMCwxMiwxNSwxNSwxNSwxNSwxNSwxNCwxLDEsMTQsMTUsMTIsMCw0LAorCTEwLDAsOSwxNSwxNSwxMSwxLDgsMTUsMTUsOCwxLDE0LDE1LDE0LDIsCisJNSwwLDAsMTAsNiwyLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDMsMCwwLDEyLDE1LDEzLDAsMCwyLDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMywwLDAsMTAsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTAsMCwwLDEsMCwxMSwxNSwxNSwKKwkxNSwyLDYsMTUsMTUsMTUsMTUsMTUsMTUsNiwwLDksMTUsMTMsMCw2LAorCTMsMCwxMywxNSwxNCwyLDYsMTUsMTUsMTMsMSw4LDE1LDE1LDE1LDQsCisJMywxLDAsMTAsNywyLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDksMCwwLDYsMTUsMTUsMywwLDAsMTMsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSw5LDAsMCwyLDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDExLDEwLDIsMCwzLDAsMywxNSwxNSwxNSwKKwkxNSw4LDEsMTQsMTUsMTUsMTUsMTUsMTUsMTMsMCwyLDE1LDksMSwxMCwKKwkwLDMsMTUsMTUsNiwyLDE0LDE1LDE0LDMsMSwxNCwxNSwxNSwxNSwyLAorCTQsMCwwLDEyLDUsMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNCwxLDAsMSwxNCwxNSw1LDAsMCwxMiwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDQsMCwwLDYsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMTIsCisJMTIsOSw1LDQsNCwzLDAsMCwwLDAsNCwwLDgsMTUsMTUsMTUsCisJMTUsMTMsMSwxMCwxNSwxNSwxNSwxNSwxNSwxNSwyLDAsMTEsMyw1LDEwLAorCTAsNywxNSw5LDEsMTEsMTUsMTUsOCwwLDYsMTUsMTUsMTUsMTAsMCwKKwkzLDAsMCwxMywzLDYsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsNiwwLDAsMTIsMTUsNSwwLDAsNywxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDEzLDEsMCwwLDgsMTQsMTUsMTUsMTMsNiw0LDQsMSwwLAorCTAsMCwwLDAsMCwwLDIsMCwwLDQsMywwLDEyLDE1LDE1LDE1LAorCTE1LDE1LDUsMywxNSwxNSwxNSwxNSwxNCw4LDAsMCwxLDEsMTIsOSwKKwkwLDksMTAsMCw2LDE1LDE1LDE1LDIsMiwxNCwxNSwxNSwxMywyLDAsCisJNCwwLDEsMTMsMCwxMCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxMywxLDAsMTAsMTUsMTAsMCwwLDUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSw5LDAsMCwwLDMsMiwyLDEsMCwwLDAsMSw0LAorCTQsNSwxMCwxMiwxMiwxMiwxMSwwLDAsMTEsNCwwLDEyLDE1LDE1LDE1LAorCTE1LDE1LDEyLDAsNywxMywxNSwxNSw1LDAsMCwwLDEsNiwxNSw5LAorCTAsMywwLDAsMSw2LDE0LDEwLDAsMTIsMTUsMTUsMTEsMiwwLDIsCisJMywwLDMsMTIsMSwxMSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwzLDAsNiw4LDcsMCwwLDUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSw5LDEsMCwwLDAsMiw2LDEwLDEyLDEyLDE0LDE1LAorCTE1LDE1LDE1LDE1LDExLDUsNCwwLDIsMTQsNCwwLDEyLDE1LDE1LDE1LAorCTE1LDE1LDE1LDQsMCwzLDEzLDYsMCwwLDAsMSwyLDE0LDE1LDEyLAorCTAsMCwwLDAsMCwwLDIsMiw2LDE1LDE0LDgsMCwwLDAsNywKKwk0LDAsNCwxMiwwLDEyLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDEyLDAsMCwwLDAsMCwwLDEsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxMiwyLDAsMCwwLDEsNiwxMSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwyLDEsMCwwLDksMTUsNiwwLDcsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTMsMiwwLDAsMCwwLDAsMCwxLDEyLDE1LDE1LDE1LAorCTQsMCwwLDAsMCwwLDAsNiwxMyw2LDEsMCwwLDQsMTMsMTUsCisJNiwwLDYsMTIsMCwxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNCw1LDAsMCwwLDAsMCw1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTQsNSwwLDAsMCwwLDAsMiw0LDUsCisJNywzLDYsMywwLDIsMCwyLDE1LDE1LDExLDAsMCw5LDE1LDE1LAorCTE1LDE1LDE1LDE1LDExLDAsMCwwLDAsMCwyLDExLDE1LDE1LDE1LDE1LAorCTEyLDEsMCwwLDEsNCw2LDEwLDIsMCwwLDAsNywxNCwxNSwxNSwKKwk5LDAsOSw5LDAsMTIsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTMsOSw4LDksNywxMywxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEyLDYsMSwwLDAsMCwwLDAsCisJMCwwLDAsMiw4LDAsMCw5LDE1LDE1LDE0LDQsMCwwLDMsMTAsCisJMTQsMTUsMTUsMTUsMTUsMTMsMywwLDAsNCwxNCwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxMSwyLDAsMCwxLDEsMCwwLDAsMSwxMSwxNSwxNSwxNSwxNSwKKwk5LDAsMTAsNSwzLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMTIsMTAsNSw0LDYsCisJMiw0LDEwLDE0LDgsMCwxLDE0LDE1LDE1LDE1LDE0LDUsMCwwLDAsCisJMSwyLDQsNCw0LDMsMSwyLDksMTQsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTEsMTEsMTMsMTAsOSw5LDExLDE1LDE1LDE1LDE1LDE1LDE1LAorCTEwLDAsOCwyLDQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkyLDcsMTUsMTQsMSwwLDYsMTUsMTUsMTUsMTUsMTUsMTUsMTAsNiw0LAorCTIsMiw0LDQsNCwzLDksMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTEsMCwzLDEsNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDExLAorCTEsMTAsMTUsOSwwLDAsMTMsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTEsMCwxMSwxMSwxMSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDIsCisJNSwxNSwxNCwyLDAsNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNCwxLDEzLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTAsMSwKKwkxMywxNSwxMSwwLDAsMTIsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDgsMSwKKwkxNSwxNSw1LDAsMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxMCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEyLDIsMywKKwkxNSwxNCwxLDAsNywxNSwxNSwxNSwxNSwxNSwxMywxNSwxNSwxNSwxNSwxNCwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywxMiwxMiwxMSw5LDQsNywxNCwxNSwKKwkxNCwxMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE0LDMsMCwxMCwKKwkxNSw5LDAsMCw4LDcsNCwyLDIsMSwwLDMsNCwzLDQsOSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNCwxMywxMSw3LDQsMiwwLDAsMCwwLDAsMCwxLDEyLDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE0LDEzLDExLDcsNCwyLDIsMTMsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMiwwLDMsMTEsCisJNywxLDAsMCwwLDAsMCwxLDQsOSwxMSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCwxMiwxMSw5LDcsNCwKKwkzLDEsMCwwLDAsMCwwLDAsMCwwLDAsMiwxMSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywxMSw4LAorCTQsMywxLDAsMCwwLDAsMyw4LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMTEsMywwLDAsMCwKKwkwLDAsMCwyLDYsOSwxMiwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxMyw5LDYsMywxLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMSw0LDcsMTEsMTIsMTIsMTIsMTQsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMTIsMTEsNyw0LDIsMCwwLDAsCisJMCwwLDAsMSw1LDEwLDEzLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTQsMTIsNywzLDEsMCwwLDAsMiw1LAorCTIsMCwyLDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE0LDEzLDEyLAorCTExLDksNiw0LDIsMCwwLDAsMCwwLDAsMCwwLDEsMiw0LAorCTUsOSwxMSwxMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNCwxMiwxMSw3LDQsMywxLDAsMCwwLDAsMCwwLDAsMSwKKwk0LDUsMTAsMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxMywxMCw1LDEsMCwwLDAsMSwwLDAsMiwxMywxNCwKKwkxLDAsOCwxNSwxNSwxNCwxMiwxMSw5LDgsNCwzLDIsMSwwLDAsCisJMCwwLDAsMCwxLDMsMiwzLDUsOSwxMCwxMiwxMywxNCwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywxMSwxMCw2LDQsCisJMywxLDAsMCwwLDAsMCwwLDAsMCwxLDQsNywxMSwxMywxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDExLDQsMCwwLDAsMSw0LDksMTMsMTMsMSwwLDAsMSw3LAorCTAsMCw3LDgsNSwyLDAsMCwwLDAsMCwwLDEsMiwzLDQsCisJNSw5LDEwLDEyLDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE0LDExLDgsNCwzLDEsMCwwLDAsMCwwLAorCTAsMCwwLDAsMSw0LDUsOSwxMiwxMywxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNCwxMiw5LDgsOCw3LDQsMiw1LDQsNSw1LDEyLDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMTAsNSwKKwkxLDAsMSwzLDYsMTEsMTQsMTUsMTUsMTUsMTUsMTMsMTIsOCwzLDIsCisJMCwwLDEsMSwzLDMsNCw1LDgsMTAsMTIsMTMsMTQsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTMsCisJMTEsOSw2LDQsMiwxLDAsMCwwLDAsMCwwLDAsMSwyLDQsCisJNiwxMCwxMSwxMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywxMSw5LDcsCisJNCwyLDEsMCwwLDAsMCwyLDQsNywxMiwxNCwxNCwxNCwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEwLDUsMSwxLDMsCisJOCwxMiwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw5LAorCTMsMTEsMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsOCw2LDksOSw5LDksOSw4LDUsNCw0LDMsMSwwLAorCTAsMCwwLDAsMSwyLDMsMiw0LDUsOSwxMSwxMiwxNCwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCwxMiw5LDUsMiwwLDAsMCwwLAorCTAsMSwyLDQsNywxMCwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE0LDksNCwxLDMsOSwxMywxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywKKwkxMSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxMywzLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwyLDMsCisJNSw4LDEwLDEyLDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDEyLDUsMiwwLDAsMCwxLDMsNCw3LDEwLAorCTEyLDEzLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTMsMTEsMTMsMTMsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMTIsMTIsMTIsMTMsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsOCwxLDAsMSw0LDcsMTEsMTMsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxMyw3LDgsMTEsMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0KKwl9OwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vbW90aWZfZ29vbTIuaCBiL2dzdC9nb29tL21vdGlmX2dvb20yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRlOTJhZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL21vdGlmX2dvb20yLmgKQEAgLTAsMCArMSwxMDQ0IEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCitzdGF0aWMgTW90aWYgQ09OVl9NT1RJRjIgPSB7CisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTIsNSwxNCwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDEyLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEwLDEsMTQsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxMCwwLDEyLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDYsMCwxMiwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDcsMCw4LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDIsMCwxMCwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDYsMCwyLDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDUsMCwwLDEwLAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsOSwwLDAsMTIsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsOSwwLDAsMSwxNCwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDgsMCwwLDgsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsOCwzLDAsMCwwLDksMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxMSwwLDAsMiwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxMyw5LDUsMyw0LDEsMCwwLDAsMCw3LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTQsNCwwLDAsNCwxMSwxMywxMywxNSwxNSwxNCwxMiwxMCw4LDUsCisJNiw0LDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxNCwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDEyLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsOSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTEzLDksMTAsMTMsMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTIsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDIsNSw2LDAsMCwwLDAsMTIsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwk1LDAsMCwwLDMsMTAsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTQsOSwyLDEsMCwwLDAsMSw0LDYsNiwxLAorCTAsMCwwLDgsMTMsMTUsMTUsMTUsMTIsMSwwLDIsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCwKKwkyLDAsMCwwLDAsMCw0LDEyLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDMsMCwwLDEwLDE1LDE1LDE1LDEwLAorCTAsMCw0LDE1LDE1LDE1LDE1LDE1LDE1LDIsMCw2LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsNSwKKwkzLDExLDUsMCwwLDAsMCwwLDQsMTEsMTQsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsNywwLDAsMTMsMTUsMTUsMTUsMTEsCisJMCwwLDcsMTUsMTUsMTUsMTUsMTUsMTUsMSwwLDksMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw5LDAsCisJMTMsMTUsMTUsMTIsNSwwLDAsMCwwLDAsMSw4LDE0LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDcsMCwxLDE0LDE1LDE1LDE1LDExLAorCTAsMCw3LDE1LDE1LDE1LDE1LDE1LDE0LDAsMCw5LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTEsMSwxMCwKKwkxNSwxNSwxNSwxNSwxNSwxMSw1LDAsMCwwLDAsMCwxLDYsMTMsMTUsCisJMTUsMTUsMTUsMTUsMTQsOCwxMSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw2LDAsMiwxNSwxNSwxNSwxNSwxMSwKKwkwLDAsNiwxNSwxNSwxNSwxNSwxNSwxMywwLDAsMTEsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMSwxLDYsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsNSwwLDAsMCwwLDAsMCw2LAorCTE0LDE1LDE1LDE1LDYsMCw0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDcsMCw1LDE1LDE1LDE1LDE1LDExLAorCTAsMCw1LDE1LDE1LDE1LDE1LDE1LDEyLDAsMCwxMiwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDIsMSwxMywxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMiwyLDAsMCwwLDAsMCwKKwkxLDYsMTEsNywwLDAsNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw3LDAsNywxNSwxNSwxNSwxNSwxMSwKKwkwLDAsNiwxNSwxNSwxNSwxNSwxNSwxMiwwLDAsMTIsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw1LDAsNywxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMSw1LDAsMCwwLAorCTAsMCwwLDAsMCwxLDExLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDcsMCwxMCwxNSwxNSwxNSwxNSwxMSwKKwkwLDAsNiwxNSwxNSwxNSwxNSwxNSwxMiwwLDAsMTIsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMCwwLDQsMTQsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTMsNywwLAorCTAsMCwwLDAsMCwxLDYsMTIsMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsNywwLDEwLDE1LDE1LDE1LDE1LDExLAorCTAsMCw3LDE1LDE1LDE1LDE1LDE1LDEyLDAsMCwxMiwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDEsMSwxMiwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywKKwk1LDAsMCwwLDAsMCwwLDAsMywxMCwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw3LDAsMTAsMTUsMTUsMTUsMTUsMTEsCisJMCwwLDcsMTUsMTUsMTUsMTUsMTUsMTEsMCwwLDEzLDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsNCwwLDgsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTMsMCwwLDAsMSwwLDAsMCwwLDEsMTMsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsNywwLDEwLDE1LDE1LDE1LDE1LDExLAorCTAsMCw4LDE1LDE1LDE1LDE1LDE1LDgsMCwyLDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsOSwwLDQsMTQsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsCisJNCwwLDAsNSwxMywxMiw2LDIsMCwyLDEzLDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDcsMCwxMCwxNSwxNSwxNSwxNSwxMSwKKwkwLDAsNywxNSwxNSwxNSwxNSwxNSw0LDAsNCwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDEsMSwxMywxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMSwKKwkwLDAsMSwxMywxNSwxNSwxNSwxNCw5LDEzLDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDUsMCw2LDE1LDE1LDE1LDE1LDExLAorCTAsMCw4LDE1LDE1LDE1LDE1LDE1LDIsMCw4LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsNSwwLDksMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTQsMTEsMTUsMTUsMTUsMTUsMTUsMTUsMTUsOSwKKwkwLDAsMTAsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsNCwwLDQsMTUsMTUsMTUsMTUsMTEsCisJMCwwLDcsMTUsMTUsMTUsMTUsMTMsMCwwLDExLDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTAsMCwzLDE0LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE0LDMsMCwxMywxNSwxNSwxNSwxNSwxNSwxNSwxNCwKKwk5LDExLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDQsMCw0LDE1LDE1LDE1LDE1LDExLAorCTAsMCw4LDE1LDE1LDE1LDE1LDEyLDAsMCwxMiwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE0LDIsMSwxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNCwzLDAsMCw5LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDYsMCwzLDE1LDE1LDE1LDE1LDEzLAorCTEsMCw4LDE1LDE1LDE1LDE1LDEyLDAsMCwxMiwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDksMCw1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE0LDQsMCwwLDAsMTAsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsOCwwLDIsMTUsMTUsMTUsMTUsMTUsCisJMywwLDEzLDE1LDE1LDE1LDE1LDEyLDAsMCwxMiwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDEzLDIsMSwxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSw3LDAsMCwwLDAsOCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMCwwLDEsMTQsMTUsMTUsMTUsMTUsCisJMTEsNSwxNSwxNSwxNSwxNSwxNSwxMiwwLDAsMTEsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSw2LDAsNywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSw4LDAsMCwwLDAsMCwwLDksMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTIsMCwwLDEyLDE1LDE1LDE1LDE1LAorCTE1LDE0LDE1LDE1LDE1LDE1LDE1LDEwLDAsMCwxMiwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDEzLDEsMiwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxMCwwLDAsMCw2LDYsMCwwLDAsNSwxMiwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMiwxMiwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMywwLDAsMTEsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsOSwwLDEsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSw3LDAsOCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSw5LDAsMCw0LDE1LDE1LDgsMCwwLDAsMSw1LDEzLDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEyLDgsNyw2LDUsMywKKwkzLDMsNCwxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw3LDAsNiwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCwxLDAsMTAsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsNiwwLDMsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxMywxLDAsMTMsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTQsNyw4LDEzLDE1LDE1LDE1LDExLDIsMCwwLDAsMCw1LDExLAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDMsMCwwLDAsMCwwLDAsCisJMCwwLDAsNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMiwxLDAsMCwKKwkzLDExLDE1LDE1LDE1LDE1LDE1LDE1LDEzLDEsMCwxMCwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwzLDAsNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDksMCw1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE0LDgsMSwwLDAsMCwwLAorCTQsMTIsMTUsMTUsMTUsMTUsMTUsMTUsNCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDIsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsNCwwLDAsMCwKKwkwLDAsOSwxNSwxNSwxNSwxNSwxNSwxNCwxLDAsMTAsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMiwwLDksMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNCw0LDAsMTEsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsOCwyLDAsMCwKKwkwLDAsNCwxMCwxNCwxNSwxNSwxNSw0LDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMywxNSwxNSwxNSwxNSwxNSwxNSwxNSw2LDAsMCwwLDIsCisJMywwLDAsOCwxNSwxNSwxNSwxNSwxNCwxLDAsMTAsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMSwwLDksMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNCw1LDAsNCwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCw5LDMsCisJMCwwLDAsMCwyLDUsMTAsMTUsNSwwLDEsMTEsMTEsMTIsMTMsMTUsCisJMTEsMCwwLDcsMTUsMTUsMTUsMTUsMTUsMTUsOCwwLDAsMCwxLDEyLAorCTE0LDYsMCwwLDcsMTQsMTUsMTUsMTQsMSwwLDksMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMiwwLDEwLDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJOSwwLDEsMTMsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsCisJMTAsMiwwLDAsMCwwLDEsMTQsNCwwLDEsMTQsMTUsMTUsMTUsMTUsCisJOSwwLDAsOSwxNSwxNSwxNSwxNSwxNSw5LDAsMCwwLDAsOSwxNSwKKwkxNSwxNSw3LDAsMCw2LDE0LDE1LDE1LDMsMCw2LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDEsMCw5LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsOSwKKwkwLDAsMSwxMCwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxMywxLDAsMCwwLDEsMTQsMywwLDAsMTQsMTUsMTUsMTUsMTUsCisJNSwwLDAsMTEsMTUsMTUsMTUsMTUsMTMsMSwwLDAsMCw2LDE1LDE1LAorCTE1LDE1LDE1LDgsMCwwLDIsMTAsMTUsNiwwLDMsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMiwwLDEwLDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTMsMSwKKwkwLDAsMCwwLDMsOSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSw2LDEsMCwwLDAsOCwxNSwxLDAsMCwxNCwxNSwxNSwxNSwxNSwKKwk0LDAsMCwxMywxNSwxNSwxNSwxNCw0LDAsMCwwLDMsMTQsMTUsMTUsCisJMTUsMTUsMTUsMTUsNSwwLDAsMSwxNCw5LDAsMSwxNCwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxLDAsOSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDEsCisJMCwwLDAsMCwwLDAsNCwxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwk5LDAsMCwwLDAsNywxNSwxNSwxLDAsMCwxNCwxNSwxNSwxNSwxNCwKKwkyLDAsMSwxNCwxNSwxNSwxNSwxMiwwLDAsMCwzLDEzLDE1LDE1LDE1LAorCTE1LDE1LDE1LDksMCwwLDAsMSwxNCwxMiwwLDAsMTIsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTQsMSwwLDEwLDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTIsCisJMywwLDAsMCwwLDAsMCwxLDgsMTQsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsOSwKKwkwLDAsMCwwLDcsMTUsMTUsMTUsMSwwLDAsMTQsMTUsMTUsMTUsMTMsCisJMCwwLDEsMTUsMTUsMTUsMTUsMTIsMCwwLDAsNiwxNCwxNSwxNSwxNSwKKwkxNSwxNSwxMiwwLDAsMCwwLDMsMTQsMTIsMCwwLDEyLDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDEyLDAsMCwxMiwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDEzLDMsMCwwLDAsMCwwLDAsMSw2LDEzLDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEyLDAsCisJMCwwLDAsMywxNSwxNSwxNSwxMiwwLDAsMCwxNCwxNSwxNSwxNSwxMSwKKwkwLDAsMywxNSwxNSwxNSwxNSwxNSwxMiw3LDAsMCw0LDE0LDE1LDE1LAorCTE1LDExLDEsMCwwLDAsNCwxMywxNSwxMiwwLDAsMTIsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTAsMCwxLDE0LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTIsNywwLDAsMCwwLDAsMCwwLDMsOCwxMiwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw0LDAsCisJMCwwLDEsMTMsMTUsMTUsMTUsNiwwLDAsMCwxNCwxNSwxNSwxNSw4LAorCTAsMCw3LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDgsMSwwLDIsMTMsMTUsCisJMTQsMiwwLDAsMCw0LDE0LDE1LDE1LDEzLDEsMCwxMCwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSw5LDAsMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDExLDYsMiwwLDAsMCwwLDAsMCwwLDEsCisJMTAsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsOCwwLDAsCisJMCwwLDEwLDE1LDE1LDE1LDE1LDQsMCwwLDEsMTUsMTUsMTUsMTUsNCwKKwkwLDAsOCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMCwxLDAsMSw4LAorCTIsMCwwLDAsNSwxNSwxNSwxNSwxNSwxNSwyLDAsNiwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSw5LDAsMSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDksMSwwLDAsMCwwLDAsMCwKKwkwLDEsNywxMywxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSw5LDAsMCwwLAorCTAsNiwxNSwxNSwxNSwxNSwxNSw0LDAsMCw0LDE1LDE1LDE1LDE0LDEsCisJMCwwLDksMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTIsMiwwLDAsCisJMCwwLDAsNCwxNCwxNSwxNSwxNSwxNSwxNSw0LDAsNCwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSw3LDAsMCwxNCwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE0LDExLDYsMiwwLDAsMCwKKwkwLDAsMCwwLDEsOSwxMiwxNSwxNSwxNSwxNSwxNCwzLDAsMCwwLAorCTQsMTUsMTUsMTUsMTUsMTUsMTUsNCwwLDAsMyw2LDQsNCwyLDAsCisJMCwwLDEzLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEyLDEsMCwKKwkwLDAsMywxNCwxNSwxNSwxNSwxNSwxNSwxNSw0LDAsNCwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSw1LDAsMCwxMiwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDgsMiwwLAorCTAsMCwwLDAsMCwwLDAsMSw5LDE1LDE1LDUsMCwwLDAsMCwKKwkxMiwxNSwxNSwxNSwxNSwxNSwxNSw0LDAsMCwwLDAsMCwwLDAsMCwKKwkwLDMsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsNCwwLAorCTAsMSwxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSw2LDAsMSwxNCwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSw1LDAsMCwxMywxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEyLAorCTcsMSwwLDAsMCwwLDAsMCwwLDUsNywwLDAsMCwwLDEwLAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDcsMCwwLDAsMCwwLDAsMCwwLAorCTEsMTAsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMywwLAorCTMsMTIsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTIsMCwwLDEyLDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDUsMCwwLDEsMSw0LDExLDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTEsNiwxLDAsMCwwLDAsMCwwLDAsMCwwLDcsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsNyw0LDQsNCw1LDksMTIsMTMsCisJMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTEsOSwKKwkxNCwxNSwxNSwxNCwxMiwxMSwxMSwxMSwxMCw5LDcsMCwwLDUsMTMsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTIsMSwwLDAsMCwwLDAsMCwxMCwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE0LDcsMSwwLDAsMCwwLDAsMywxNCwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxMywyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4LAorCTE1LDE1LDE1LDE1LDE1LDExLDAsMCwwLDAsMCwwLDAsOSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDEzLDUsMCwwLDAsMCwxMiwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSw4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTAsNSw2LDcsNyw3LDksMTQsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSw4LDMsMiwyLDIsMiw1LDE0LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEwLDMsMCw2LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDEzLDMsMSwwLDEsMCwxLDEsMiw0LDQsMyw5LDE0LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTIsNCwwLDEsNiw3LDcsNCwxLDMsMTMsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTQsMTAsMTMsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTEsMTEsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNCwyLDAsNCwxMywxNSwxNSwxNSwxNSwxMCwwLDEyLAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE0LDEzLDE0LDEyLDEyLDEyLDEyLDEyLDEyLDEyLAorCTEyLDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDQsMTQsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSw3LDEsNSwxNCwxNSwxNSwxNSwxNSwxNSwxMiwxLDExLAorCTE1LDE1LDE1LDEzLDEyLDEzLDE1LDE1LDE0LDExLDEzLDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDExLDYsMywxLDEsMSwwLDAsMCwwLDAsMCwwLAorCTAsMSw0LDcsMTEsMTQsMTUsMTUsMTUsMTQsNCwxNSwxMywxMCwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNCw3LDQsNSwKKwkxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDEzLDEsMSwxNCwxNSwxNSwxNCwxMCwxMiwxNSwxMSwxLDEyLAorCTE1LDE1LDExLDEsMCw0LDE1LDE1LDYsMCwyLDE0LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE0LDgsNiwzLDMsMiwyLDEsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDMsMTEsMTUsMTUsMTEsOCwxNSwxMiw2LDE1LDksCisJOCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMCw0LDQsMSwKKwk0LDE1LDE1LDE1LDE1LDExLDYsMiw4LDE0LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTIsMCw0LDE1LDE1LDE1LDExLDIsMTAsMTUsOSwxLDEzLAorCTE1LDEzLDEsNyw2LDIsMTQsMTQsMSwyLDEsMTQsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTMsMTIsMTIsMTIsMTIsMTIsMTIsCisJMTEsMTEsMTEsMTAsOSwxMCwxMiwxNSwxNSw2LDcsMTUsOSw0LDE1LDQsCisJMSwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwyLDExLDE1LDQsCisJNCwxNSwxNSwxNSwxNSwzLDksNCwwLDksMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxMiwwLDQsMTUsMTUsMTUsNSwwLDYsNiwxLDksMTUsCisJMTUsNCwxLDEzLDEwLDEsMTMsOSwyLDcsMSwxNCwxNCwxNCwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwzLDUsMTUsMyw1LDE0LDEsCisJMCwxMiwxMyw5LDE0LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDIsMiw0LDEsCisJNiwxNSwxNSwxNSwxNCwxLDUsNiwwLDksMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxMiwwLDQsMTUsMTUsMTUsMTIsNCwyLDIsMTAsMTUsMTUsCisJMTEsMCw2LDE1LDEyLDAsMTAsNyw5LDEwLDEsMTQsNywxNCwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxMywxMiwxMSwxMSwxMCw5LDksMTAsMTEsMTMsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMSw5LDE1LDIsNywxNCwxLAorCTAsMTAsNywwLDgsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTEsNCw0LDQsCisJMTMsMTUsMTUsMTUsMTUsMTAsMiwyLDQsMTQsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxMiwwLDQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJNCwyLDE0LDE1LDE1LDEsOSw1LDE0LDksMSwxNCw4LDE0LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDEwLDMsMCwxLDAsMCwwLDAsMCwwLDUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMSw5LDE0LDEsOCwxNCwxLAorCTAsMTEsMTMsNiwxMSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDEyLDAsNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxMSwKKwkwLDYsMTUsMTUsMTUsMSw1LDMsMTMsMTAsMCw2LDgsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTMsMTIsMTIsMTEsMTAsOSw5LDEwLDExLDEzLAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEsOSwxMiwxLDExLDE1LDQsCisJMSwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNCwxMCw0LDIsMTIsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxMiwxLDMsMTQsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsNCwKKwkzLDE0LDE1LDE1LDE1LDUsMSw4LDE1LDE0LDUsMiw5LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDExLDksMTMsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMSw5LDEyLDEsMTIsMTUsMTMsCisJMTEsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTAsMiw5LDIsMywxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE0LDQsMCw1LDE0LDE1LDE1LDE1LDE1LDE1LDE1LDExLDAsCisJNiwxNSwxNSwxNSwxNSwxNSwxNCwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw4LDEsMCwzLDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDEsOSwxNSwxMSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwk3LDEsMTIsNiwxLDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTEsMSwwLDMsOCw5LDksMTAsMTEsOSw1LDQsCisJMTMsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTIsOSwxMywxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSw1LDExLDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTEwLDMsNCwxLDUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxMiwyLDAsMCwwLDAsMCwwLDEsOCwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNCwxMiwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDEzLDgsOCwxMCw5LDEwLDExLDE0LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9LAorCXsxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwKKwkxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNSwxNX0sCisJezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorCTE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fSwKKwl7MTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsCisJMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTUsMTV9CisJfTsKZGlmZiAtLWdpdCBhL2dzdC9nb29tL3BsdWdpbl9pbmZvLmMgYi9nc3QvZ29vbS9wbHVnaW5faW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZDU3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9wbHVnaW5faW5mby5jCkBAIC0wLDAgKzEsMjYyIEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnb29tX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiZ29vbV9wbHVnaW5faW5mby5oIgorI2luY2x1ZGUgImdvb21fZnguaCIKKyNpbmNsdWRlICJkcmF3bWV0aG9kcy5oIgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfT1JDCisjaW5jbHVkZSA8b3JjL29yYy5oPgorI2VuZGlmCisKKworI2lmIGRlZmluZWQgKEhBVkVfQ1BVX1BQQzY0KSB8fCBkZWZpbmVkIChIQVZFX0NQVV9QUEMpCisjaW5jbHVkZSAicHBjX3pvb21fdWx0aW1hdGUuaCIKKyNpbmNsdWRlICJwcGNfZHJhd2luZ3MuaCIKKyNlbmRpZiAvKiBIQVZFX0NQVV9QUEM2NCB8fCBIQVZFX0NQVV9QUEMgKi8KKworCisjaWZkZWYgSEFWRV9NTVgKKyNpbmNsdWRlICJtbXguaCIKKyNlbmRpZiAvKiBIQVZFX01NWCAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKGdvb21fZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ29vbV9kZWJ1ZworCitzdGF0aWMgdm9pZAorc2V0T3B0aW1pemVkTWV0aG9kcyAoUGx1Z2luSW5mbyAqIHApCit7CisjaWZkZWYgSEFWRV9PUkMKKyAgdW5zaWduZWQgaW50IGNwdUZsYXZvdXIgPQorICAgICAgb3JjX3RhcmdldF9nZXRfZGVmYXVsdF9mbGFncyAob3JjX3RhcmdldF9nZXRfYnlfbmFtZSAoIm1teCIpKTsKKyNlbHNlCisgIHVuc2lnbmVkIGludCBjcHVGbGF2b3VyID0gMDsKKyNlbmRpZgorCisgIC8qIHNldCBkZWZhdWx0IG1ldGhvZHMgKi8KKyAgcC0+bWV0aG9kcy5kcmF3X2xpbmUgPSBkcmF3X2xpbmU7CisgIHAtPm1ldGhvZHMuem9vbV9maWx0ZXIgPSB6b29tX2ZpbHRlcl9jOworLyogICAgcC0+bWV0aG9kcy5jcmVhdGVfb3V0cHV0X3dpdGhfYnJpZ2h0bmVzcyA9IGNyZWF0ZV9vdXRwdXRfd2l0aF9icmlnaHRuZXNzOyovCisKKyAgR1NUX0lORk8gKCJvcmMgY3B1IGZsYWdzOiAweCUwOHgiLCBjcHVGbGF2b3VyKTsKKworLyogRklYTUU6IHdoYXQgYWJvdXQgSEFWRV9DUFVfWDg2XzY0ID8gKi8KKyNpZmRlZiBIQVZFX0NQVV9JMzg2CisjaWZkZWYgSEFWRV9NTVgKKyNpZmRlZiBIQVZFX09SQworICBHU1RfSU5GTyAoImhhdmUgYW4geDg2Iik7CisgIGlmIChjcHVGbGF2b3VyICYgT1JDX1RBUkdFVF9NTVhfTU1YRVhUKSB7CisgICAgR1NUX0lORk8gKCJFeHRlbmRlZCBNTVggZGV0ZWN0ZWQuIFVzaW5nIHRoZSBmYXN0ZXN0IG1ldGhvZHMhIik7CisgICAgcC0+bWV0aG9kcy5kcmF3X2xpbmUgPSBkcmF3X2xpbmVfeG1teDsKKyAgICBwLT5tZXRob2RzLnpvb21fZmlsdGVyID0gem9vbV9maWx0ZXJfeG1teDsKKyAgfSBlbHNlIGlmIChjcHVGbGF2b3VyICYgT1JDX1RBUkdFVF9NTVhfTU1YKSB7CisgICAgR1NUX0lORk8gKCJNTVggZGV0ZWN0ZWQuIFVzaW5nIGZhc3QgbWV0aG9kcyEiKTsKKyAgICBwLT5tZXRob2RzLmRyYXdfbGluZSA9IGRyYXdfbGluZV9tbXg7CisgICAgcC0+bWV0aG9kcy56b29tX2ZpbHRlciA9IHpvb21fZmlsdGVyX21teDsKKyAgfSBlbHNlIHsKKyAgICBHU1RfSU5GTyAoIlRvbyBiYWQgISBObyBTSU1EIG9wdGltaXphdGlvbiBhdmFpbGFibGUgZm9yIHlvdXIgQ1BVLiIpOworICB9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmIC8qIEhBVkVfQ1BVX0kzODYgKi8KKworLyogZGlzYWJsZSBhbGwgUFBDIHN0dWZmIHVudGlsIHNvbWVvbmUgZmluZHMgb3V0IHdoYXQgdG8gdXNlIGhlcmUgaW5zdGVhZCBvZgorICogQ1BVX09QVElPTl82NF9CSVRTLCBhbmQgdW50aWwgc29tZW9uZSBmaXhlcyB0aGUgYXNzZW1ibHkgYnVpbGQgZm9yIHBwYyAqLworI2lmIDAKKyNpZmRlZiBIQVZFX0NQVV9QUEM2NAorICBpZiAoKGNwdUZsYXZvdXIgJiBDUFVfT1BUSU9OXzY0X0JJVFMpICE9IDApIHsKKy8qICAgICAgICAgICAgcC0+bWV0aG9kcy5jcmVhdGVfb3V0cHV0X3dpdGhfYnJpZ2h0bmVzcyA9IHBwY19icmlnaHRuZXNzX0c1OyAgICAgICAgKi8KKyAgICBwLT5tZXRob2RzLnpvb21fZmlsdGVyID0gcHBjX3pvb21fZ2VuZXJpYzsKKyAgfQorI2VuZGlmIC8qIEhBVkVfQ1BVX1BQQzY0ICovCisKKyNpZmRlZiBIQVZFX0NQVV9QUEMKKyAgaWYgKChjcHVGbGF2b3VyICYgT1JDX1RBUkdFVF9BTFRJVkVDX0FMVElWRUMpICE9IDApIHsKKy8qICAgICAgICAgICAgcC0+bWV0aG9kcy5jcmVhdGVfb3V0cHV0X3dpdGhfYnJpZ2h0bmVzcyA9IHBwY19icmlnaHRuZXNzX0c0OyAgICAgICAgKi8KKyAgICBwLT5tZXRob2RzLnpvb21fZmlsdGVyID0gcHBjX3pvb21fRzQ7CisgIH0gZWxzZSB7CisvKiAgICAgICAgICAgIHAtPm1ldGhvZHMuY3JlYXRlX291dHB1dF93aXRoX2JyaWdodG5lc3MgPSBwcGNfYnJpZ2h0bmVzc19nZW5lcmljOyovCisgICAgcC0+bWV0aG9kcy56b29tX2ZpbHRlciA9IHBwY196b29tX2dlbmVyaWM7CisgIH0KKyNlbmRpZiAvKiBIQVZFX0NQVV9QUEMgKi8KKyNlbmRpZgorfQorCit2b2lkCitwbHVnaW5faW5mb19pbml0IChQbHVnaW5JbmZvICogcHAsIGludCBuYlZpc3VhbHMpCit7CisKKyAgaW50IGk7CisKKyAgbWVtc2V0IChwcCwgMCwgc2l6ZW9mIChQbHVnaW5JbmZvKSk7CisKKyAgcHAtPnNvdW5kLnNwZWVkdmFyID0gcHAtPnNvdW5kLmFjY2VsdmFyID0gcHAtPnNvdW5kLnRvdGFsZ29vbSA9IDA7CisgIHBwLT5zb3VuZC5wcm92X21heCA9IDA7CisgIHBwLT5zb3VuZC5nb29tX2xpbWl0ID0gMTsKKyAgcHAtPnNvdW5kLmFsbFRpbWVzTWF4ID0gMTsKKyAgcHAtPnNvdW5kLnRpbWVTaW5jZUxhc3RHb29tID0gMTsKKyAgcHAtPnNvdW5kLnRpbWVTaW5jZUxhc3RCaWdHb29tID0gMTsKKyAgcHAtPnNvdW5kLmN5Y2xlID0gMDsKKworICBzZWN1cmVfZl9mZWVkYmFjayAoJnBwLT5zb3VuZC52b2x1bWVfcCwgIlNvdW5kIFZvbHVtZSIpOworICBzZWN1cmVfZl9mZWVkYmFjayAoJnBwLT5zb3VuZC5hY2NlbF9wLCAiU291bmQgQWNjZWxlcmF0aW9uIik7CisgIHNlY3VyZV9mX2ZlZWRiYWNrICgmcHAtPnNvdW5kLnNwZWVkX3AsICJTb3VuZCBTcGVlZCIpOworICBzZWN1cmVfZl9mZWVkYmFjayAoJnBwLT5zb3VuZC5nb29tX2xpbWl0X3AsICJHb29tIExpbWl0Iik7CisgIHNlY3VyZV9mX2ZlZWRiYWNrICgmcHAtPnNvdW5kLmxhc3RfZ29vbV9wLCAiR29vbSBEZXRlY3Rpb24iKTsKKyAgc2VjdXJlX2ZfZmVlZGJhY2sgKCZwcC0+c291bmQubGFzdF9iaWdnb29tX3AsICJCaWcgR29vbSBEZXRlY3Rpb24iKTsKKyAgc2VjdXJlX2ZfZmVlZGJhY2sgKCZwcC0+c291bmQuZ29vbV9wb3dlcl9wLCAiR29vbSBQb3dlciIpOworCisgIHNlY3VyZV9pX3BhcmFtICgmcHAtPnNvdW5kLmJpZ2dvb21fc3BlZWRfbGltaXRfcCwgIkJpZyBHb29tIFNwZWVkIExpbWl0Iik7CisgIElWQUwgKHBwLT5zb3VuZC5iaWdnb29tX3NwZWVkX2xpbWl0X3ApID0gMTA7CisgIElNSU4gKHBwLT5zb3VuZC5iaWdnb29tX3NwZWVkX2xpbWl0X3ApID0gMDsKKyAgSU1BWCAocHAtPnNvdW5kLmJpZ2dvb21fc3BlZWRfbGltaXRfcCkgPSAxMDA7CisgIElTVEVQIChwcC0+c291bmQuYmlnZ29vbV9zcGVlZF9saW1pdF9wKSA9IDE7CisKKyAgc2VjdXJlX2lfcGFyYW0gKCZwcC0+c291bmQuYmlnZ29vbV9mYWN0b3JfcCwgIkJpZyBHb29tIEZhY3RvciIpOworICBJVkFMIChwcC0+c291bmQuYmlnZ29vbV9mYWN0b3JfcCkgPSAxMDsKKyAgSU1JTiAocHAtPnNvdW5kLmJpZ2dvb21fZmFjdG9yX3ApID0gMDsKKyAgSU1BWCAocHAtPnNvdW5kLmJpZ2dvb21fZmFjdG9yX3ApID0gMTAwOworICBJU1RFUCAocHAtPnNvdW5kLmJpZ2dvb21fZmFjdG9yX3ApID0gMTsKKworICBwbHVnaW5fcGFyYW1ldGVycyAoJnBwLT5zb3VuZC5wYXJhbXMsICJTb3VuZCIsIDExKTsKKworICBwcC0+bmJQYXJhbXMgPSAwOworICBwcC0+cGFyYW1zID0gTlVMTDsKKyAgcHAtPm5iVmlzdWFscyA9IG5iVmlzdWFsczsKKyAgcHAtPnZpc3VhbHMgPSAoVmlzdWFsRlggKiopIG1hbGxvYyAoc2l6ZW9mIChWaXN1YWxGWCAqKSAqIG5iVmlzdWFscyk7CisKKyAgcHAtPnNvdW5kLnBhcmFtcy5wYXJhbXNbMF0gPSAmcHAtPnNvdW5kLmJpZ2dvb21fc3BlZWRfbGltaXRfcDsKKyAgcHAtPnNvdW5kLnBhcmFtcy5wYXJhbXNbMV0gPSAmcHAtPnNvdW5kLmJpZ2dvb21fZmFjdG9yX3A7CisgIHBwLT5zb3VuZC5wYXJhbXMucGFyYW1zWzJdID0gMDsKKyAgcHAtPnNvdW5kLnBhcmFtcy5wYXJhbXNbM10gPSAmcHAtPnNvdW5kLnZvbHVtZV9wOworICBwcC0+c291bmQucGFyYW1zLnBhcmFtc1s0XSA9ICZwcC0+c291bmQuYWNjZWxfcDsKKyAgcHAtPnNvdW5kLnBhcmFtcy5wYXJhbXNbNV0gPSAmcHAtPnNvdW5kLnNwZWVkX3A7CisgIHBwLT5zb3VuZC5wYXJhbXMucGFyYW1zWzZdID0gMDsKKyAgcHAtPnNvdW5kLnBhcmFtcy5wYXJhbXNbN10gPSAmcHAtPnNvdW5kLmdvb21fbGltaXRfcDsKKyAgcHAtPnNvdW5kLnBhcmFtcy5wYXJhbXNbOF0gPSAmcHAtPnNvdW5kLmdvb21fcG93ZXJfcDsKKyAgcHAtPnNvdW5kLnBhcmFtcy5wYXJhbXNbOV0gPSAmcHAtPnNvdW5kLmxhc3RfZ29vbV9wOworICBwcC0+c291bmQucGFyYW1zLnBhcmFtc1sxMF0gPSAmcHAtPnNvdW5kLmxhc3RfYmlnZ29vbV9wOworCisgIHBwLT5zdGF0ZXNOdW1iZXIgPSA4OworICBwcC0+c3RhdGVzUmFuZ2VNYXggPSA1MTA7CisgIHsKKyAgICBHb29tU3RhdGUgc3RhdGVzWzhdID0geworICAgICAgezEsIDAsIDAsIDEsIDQsIDAsIDEwMH0KKyAgICAgICwKKyAgICAgIHsxLCAwLCAwLCAwLCAxLCAxMDEsIDE0MH0KKyAgICAgICwKKyAgICAgIHsxLCAwLCAwLCAxLCAyLCAxNDEsIDIwMH0KKyAgICAgICwKKyAgICAgIHswLCAxLCAwLCAxLCAyLCAyMDEsIDI2MH0KKyAgICAgICwKKyAgICAgIHswLCAxLCAwLCAxLCAwLCAyNjEsIDMzMH0KKyAgICAgICwKKyAgICAgIHswLCAxLCAxLCAxLCA0LCAzMzEsIDQwMH0KKyAgICAgICwKKyAgICAgIHswLCAwLCAxLCAwLCA1LCA0MDEsIDQ1MH0KKyAgICAgICwKKyAgICAgIHswLCAwLCAxLCAxLCAxLCA0NTEsIDUxMH0KKyAgICB9OworICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpCisgICAgICBwcC0+c3RhdGVzW2ldID0gc3RhdGVzW2ldOworICB9CisgIHBwLT5jdXJHU3RhdGUgPSAmKHBwLT5zdGF0ZXNbNl0pOworCisgIC8qIGRhdGFzIGZvciB0aGUgdXBkYXRlIGxvb3AgKi8KKyAgcHAtPnVwZGF0ZS5sb2NrdmFyID0gMDsKKyAgcHAtPnVwZGF0ZS5nb29tdmFyID0gMDsKKyAgcHAtPnVwZGF0ZS5sb29wdmFyID0gMDsKKyAgcHAtPnVwZGF0ZS5zdG9wX2xpbmVzID0gMDsKKyAgcHAtPnVwZGF0ZS5pZnNfaW5jciA9IDE7ICAgICAgLyogZGVzc2luZXIgbCdpZnMgKDAgPSBub246ID4gPSBpbmNyZW1lbnQpICovCisgIHBwLT51cGRhdGUuZGVjYXlfaWZzID0gMDsgICAgIC8qIGRpc3Bhcml0aW9uIGRlIGwnaWZzICovCisgIHBwLT51cGRhdGUucmVjYXlfaWZzID0gMDsgICAgIC8qIGRlZGlzcGFyaXRpb24gZGUgbCdpZnMgKi8KKyAgcHAtPnVwZGF0ZS5jeWNsZXNTaW5jZUxhc3RDaGFuZ2UgPSAwOworICBwcC0+dXBkYXRlLmRyYXdMaW5lc0R1cmF0aW9uID0gODA7CisgIHBwLT51cGRhdGUubGluZU1vZGUgPSBwcC0+dXBkYXRlLmRyYXdMaW5lc0R1cmF0aW9uOworCisgIHBwLT51cGRhdGUuc3dpdGNoTXVsdEFtb3VudCA9ICgyOS4wZiAvIDMwLjBmKTsKKyAgcHAtPnVwZGF0ZS5zd2l0Y2hJbmNyQW1vdW50ID0gMHg3ZjsKKyAgcHAtPnVwZGF0ZS5zd2l0Y2hNdWx0ID0gMS4wZjsKKyAgcHAtPnVwZGF0ZS5zd2l0Y2hJbmNyID0gcHAtPnVwZGF0ZS5zd2l0Y2hJbmNyQW1vdW50OworCisgIHBwLT51cGRhdGUuc3RhdGVTZWxlY3Rpb25SbmQgPSAwOworICBwcC0+dXBkYXRlLnN0YXRlU2VsZWN0aW9uQmxvY2tlciA9IDA7CisgIHBwLT51cGRhdGUucHJldmlvdXNab29tU3BlZWQgPSAxMjg7CisKKyAgeworICAgIFpvb21GaWx0ZXJEYXRhIHpmZCA9IHsKKyAgICAgIDEyNywgOCwgMTYsCisgICAgICAxLCAxLCAwLCBOT1JNQUxfTU9ERSwKKyAgICAgIDAsIDAsIDAsIDAsIDAKKyAgICB9OworICAgIHBwLT51cGRhdGUuem9vbUZpbHRlckRhdGEgPSB6ZmQ7CisgIH0KKworICBzZXRPcHRpbWl6ZWRNZXRob2RzIChwcCk7CisKKyAgZm9yIChpID0gMDsgaSA8IDB4ZmZmZjsgaSsrKSB7CisgICAgcHAtPnNpbnRhYmxlW2ldID0KKyAgICAgICAgKGludCkgKDEwMjQgKiBzaW4gKChkb3VibGUpIGkgKiAzNjAgLyAoc2l6ZW9mIChwcC0+c2ludGFibGUpIC8KKyAgICAgICAgICAgICAgICBzaXplb2YgKHBwLT5zaW50YWJsZVswXSkgLSAxKSAqIDMuMTQxNTkyIC8gMTgwKSArIC41KTsKKyAgICAvKiBzaW50YWJsZSBbdXNdID0gKGludCkoMTAyNC4wZiAqIHNpbiAodXMqMiozLjMxNDE1Zi8weGZmZmYpKSA7ICovCisgIH0KK30KKwordm9pZAorcGx1Z2luX2luZm9fYWRkX3Zpc3VhbCAoUGx1Z2luSW5mbyAqIHAsIGludCBpLCBWaXN1YWxGWCAqIHZpc3VhbCkKK3sKKyAgcC0+dmlzdWFsc1tpXSA9IHZpc3VhbDsKKyAgaWYgKGkgPT0gcC0+bmJWaXN1YWxzIC0gMSkgeworICAgICsraTsKKyAgICBwLT5uYlBhcmFtcyA9IDE7CisgICAgd2hpbGUgKGktLSkgeworICAgICAgaWYgKHAtPnZpc3VhbHNbaV0tPnBhcmFtcykKKyAgICAgICAgcC0+bmJQYXJhbXMrKzsKKyAgICB9CisgICAgcC0+cGFyYW1zID0KKyAgICAgICAgKFBsdWdpblBhcmFtZXRlcnMgKikgbWFsbG9jIChzaXplb2YgKFBsdWdpblBhcmFtZXRlcnMpICogcC0+bmJQYXJhbXMpOworICAgIGkgPSBwLT5uYlZpc3VhbHM7CisgICAgcC0+bmJQYXJhbXMgPSAxOworICAgIHAtPnBhcmFtc1swXSA9IHAtPnNvdW5kLnBhcmFtczsKKyAgICB3aGlsZSAoaS0tKSB7CisgICAgICBpZiAocC0+dmlzdWFsc1tpXS0+cGFyYW1zKQorICAgICAgICBwLT5wYXJhbXNbcC0+bmJQYXJhbXMrK10gPSAqKHAtPnZpc3VhbHNbaV0tPnBhcmFtcyk7CisgICAgfQorICB9Cit9CisKK3ZvaWQKK3BsdWdpbl9pbmZvX2ZyZWUgKFBsdWdpbkluZm8gKiBwKQoreworICBnb29tX3BsdWdpbl9wYXJhbWV0ZXJzX2ZyZWUgKCZwLT5zb3VuZC5wYXJhbXMpOworCisgIGlmIChwLT5wYXJhbXMpCisgICAgZnJlZSAocC0+cGFyYW1zKTsKKyAgZnJlZSAocC0+dmlzdWFscyk7Cit9CmRpZmYgLS1naXQgYS9nc3QvZ29vbS9wcGNfZHJhd2luZ3MuaCBiL2dzdC9nb29tL3BwY19kcmF3aW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNWFkZjYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9wcGNfZHJhd2luZ3MuaApAQCAtMCwwICsxLDI4IEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IEd1aWxsYXVtZSBCb3Jpb3MsIGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIEdlbmVyaWMgUG93ZXJQQyBDb2RlICovCit2b2lkIHBwY19icmlnaHRuZXNzX2dlbmVyaWMoUGl4ZWwgKnNyYywgUGl4ZWwgKmRlc3QsIGludCBzaXplLCBpbnQgY29lZmYpOworCisvKiBHNCBTcGVjaWZpYyBQb3dlclBDIENvZGUgKFBvc3NpYmxlIHVzZSBvZiBBbHRpdmVjIGFuZCBEYXRhIFN0cmVhbXMpICovCit2b2lkIHBwY19icmlnaHRuZXNzX0c0KFBpeGVsICpzcmMsIFBpeGVsICpkZXN0LCBpbnQgc2l6ZSwgaW50IGNvZWZmKTsKKworLyogRzUgU3BlY2lmaWMgUG93ZXJQQyBDb2RlIChQb3NzaWJsZSB1c2Ugb2YgQWx0aXZlYykgKi8KK3ZvaWQgcHBjX2JyaWdodG5lc3NfRzUoUGl4ZWwgKnNyYywgUGl4ZWwgKmRlc3QsIGludCBzaXplLCBpbnQgY29lZmYpOworCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9wcGNfZHJhd2luZ3MucyBiL2dzdC9nb29tL3BwY19kcmF3aW5ncy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0M2NjZTcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9wcGNfZHJhd2luZ3MucwpAQCAtMCwwICsxLDM5NCBAQAorOyBQb3dlclBDIG9wdGltaXplZCBkcmF3aW5nIG1ldGhvZHMgZm9yIEdvb20KKzsgwqkgMjAwMyBHdWlsbGF1bWUgQm9yaW9zCis7IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKzsgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsKKzsgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOworOyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworOyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorOyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKzsgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKzsgQ2hhbmdlIGxvZyA6Cis7IDMwIE1heSAyMDAzIDogRmlsZSBjcmVhdGlvbgorCis7IFNlY3Rpb24gZGVmaW5pdGlvbiA6IFdlIHVzZSBhIHJlYWQgb25seSBjb2RlIHNlY3Rpb24gZm9yIHRoZSB3aG9sZSBmaWxlCisuc2VjdGlvbiBfX1RFWFQsX190ZXh0LHJlZ3VsYXIscHVyZV9pbnN0cnVjdGlvbnMKKworCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFNpbmdsZSAzMmIgcGl4ZWwgZHJhd2luZyBtYWNyb3MKKzsgVXNhZ2UgOgorOyAJRFJBV01FVEhPRF9YWFhYX01BQ1JPICpwaXhlbElOLCAqcGl4ZWxPVVQsIENPTE9SLCBXUjEsIFdSMiwgV1IzLCBXUjQKKzsJT25seSB0aGUgd29yayByZWdpc3RlcnMgKFdSKSBjYW4gYmUgdG91Y2hlZCBieSB0aGUgbWFjcm9zCis7Cis7IEF2YWlsYWJsZSBtZXRob2RzIDoKKzsJRFJBV01FVEhPRF9ERkxUX01BQ1JPIDogRGVmYXVsdCBkcmF3aW5nIG1ldGhvZCAoQWN0dWFsbHkgT1ZSVykKKzsJRFJBV01FVEhPRF9QTFVTX01BQ1JPIDogUlZCIFNhdHVyYXRlZCBwZXIgY2hhbm5lbCBhZGRpdGlvbiAoU0xPV0VTVCkKKzsJRFJBV01FVEhPRF9IQUxGX01BQ1JPIDogNTAlIFRyYW5zcGFyZW5jeSBjb2xvciBkcmF3aW5nCis7CURSQVdNRVRIT0RfT1ZSV19NQUNSTyA6IERpcmVjdCBDT0xPUiBkcmF3aW5nIChGQVNURVNUKQorOwlEUkFXTUVUSE9EX0JfT1JfTUFDUk8gOiBCaXR3aXNlIE9SCis7CURSQVdNRVRIT0RfQkFORF9NQUNSTyA6IEJpdHdpc2UgQU5ECis7CURSQVdNRVRIT0RfQlhPUl9NQUNSTyA6IEJpdHdpc2UgWE9SCis7CURSQVdNRVRIT0RfQk5PVF9NQUNSTyA6IEJpdHdpc2UgTk9UCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy5tYWNybyBEUkFXTUVUSE9EX09WUldfTUFDUk8KKyAgICBzdHcJCSQyLDAoJDEpCTs7ICokMSA8LSAkMgorLmVuZG1hY3JvCisKKy5tYWNybyBEUkFXTUVUSE9EX0JfT1JfTUFDUk8KKyAgICBsd3oJCSQzLDAoJDApCTs7ICQzIDwtICokMAorICAgIG9yCQkkMywkMywkMgk7OyAkMyA8LSAkMyB8ICQyCisgICAgc3R3CQkkMywwKCQxKQk7OyAqJDEgPC0gJDMKKy5lbmRtYWNybworCisubWFjcm8gRFJBV01FVEhPRF9CQU5EX01BQ1JPCisgICAgbHd6CQkkMywwKCQwKQk7OyAkMyA8LSAqJDAKKyAgICBhbmQJCSQzLCQzLCQyCTs7ICQzIDwtICQzICYgJDIKKyAgICBzdHcJCSQzLDAoJDEpCTs7ICokMSA8LSAkMworLmVuZG1hY3JvCisKKy5tYWNybyBEUkFXTUVUSE9EX0JYT1JfTUFDUk8KKyAgICBsd3oJCSQzLDAoJDApCTs7ICQzIDwtICokMAorICAgIHhvcgkJJDMsJDMsJDIJOzsgJDMgPC0gJDMgXiAkMgorICAgIHN0dwkJJDMsMCgkMSkJOzsgKiQxIDwtICQzCisuZW5kbWFjcm8KKworLm1hY3JvIERSQVdNRVRIT0RfQk5PVF9NQUNSTworICAgIGx3egkJJDMsMCgkMCkJOzsgJDMgPC0gKiQwCisgICAgbmFuZAkkMywkMywkMwk7OyAkMyA8LSB+JDMKKyAgICBzdHcJCSQzLDAoJDEpCTs7ICokMSA8LSAkMworLmVuZG1hY3JvCisKKy5tYWNybyBEUkFXTUVUSE9EX1BMVVNfTUFDUk8KKyAgICBsd3oJCSQ0LDAoJDApCTs7ICQ0IDwtICokMAorICAgIGFuZGkuCSQzLCQ0LDB4RkYwMAk7OyAkMyA8LSAkNCAmIDB4MDAwMEZGMDAKKyAgICBhbmRpLgkkNSwkMiwweEZGMDAJOzsgJDUgPC0gJDIgJiAweDAwMDBGRjAwCisgICAgYWRkCQkkMywkMywkNQk7OyAkMyA8LSAkMyArICQ1CisgICAgcmx3aW5tCSQ1LCQzLDE1LDAsMAk7OyAkNSA8LSAwIHwgKCQzWzE1XSA8PCAxNSkKKyAgICBzcmF3aQkkNSwkNSwyMwk7OyAkNSA8LSAkNSA+PiAyMyAoYWxnZWJyYWljIGZvciBzaWduIGV4dGVuc2lvbikKKyAgICBvcgkJJDMsJDMsJDUJOzsgJDMgPC0gJDMgfCAkNQorICAgIGxpcwkJJDUsMHhGRgkJOzsgJDUgPC0gMHgwMEZGMDBGRgorICAgIGFkZGkJJDUsJDUsMHhGRgorICAgIGFuZAkJJDQsJDQsJDUJOzsgJDQgPC0gJDQgJiAkNQorICAgIGFuZAkJJDYsJDIsJDUJOzsgJDYgPC0gJDIgJiAkNQorICAgIGFkZAkJJDQsJDQsJDYJOzsgJDQgPC0gJDQgKyAkNgorICAgIHJsd2lubQkkNiwkNCw3LDAsMAk7OyAkNiA8LSAwIHwgKCQ0WzddIDw8IDcpCisgICAgc3Jhd2kJJDYsJDYsMTUJOzsgJDYgPC0gJDYgPj4gMTUgKGFsZ2VicmFpYyBmb3Igc2lnbiBleHRlbnNpb24pCisgICAgcmx3aW5tCSQ1LCQ0LDIzLDAsMAk7OyAkNSA8LSAwIHwgKCQ0WzIzXSA8PCAyMykKKyAgICBzcmF3aQkkNSwkNSwzMQk7OyAkNSA8LSAkNSA+PiAzMSAoYWxnZWJyYWljIGZvciBzaWduIGV4dGVuc2lvbikKKyAgICBybHdpbWkJJDYsJDUsMCwyNCwzMQk7OyAkNlsyNC4uMzFdIDwtICQ1WzI0Li4zMV0KKyAgICBvcgkJJDQsJDQsJDYJOzsgJDQgPC0gJDQgfCAkNgorICAgIHJsd2ltaQkkNCwkMywwLDE2LDIzCTs7ICQ0WzE2Li4yM10gPC0gJDNbMTYuLjIzXQorICAgIHN0dwkJJDQsMCgkMSkJOzsgKiQxIDwtICQ0CisuZW5kbWFjcm8KKworLm1hY3JvCURSQVdNRVRIT0RfSEFMRl9NQUNSTworICAgIGx3egkJJDQsMCgkMCkJOzsgJDQgPC0gKiQwCisgICAgYW5kaS4JJDMsJDQsMHhGRjAwCTs7ICQzIDwtICQ0ICYgMHgwMDAwRkYwMAorICAgIGFuZGkuCSQ1LCQyLDB4RkYwMAk7OyAkNSA8LSAkMiAmIDB4MDAwMEZGMDAKKyAgICBhZGQJCSQzLCQzLCQ1CTs7ICQzIDwtICQzICsgJDUKKyAgICBsaXMJCSQ1LDB4RkYJCTs7ICQ1IDwtIDB4MDBGRjAwRkYKKyAgICBhZGRpCSQ1LCQ1LDB4RkYKKyAgICBhbmQJCSQ0LCQ0LCQ1CTs7ICQ0IDwtICQ0ICYgJDUKKyAgICBhbmQJCSQ1LCQyLCQ1CTs7ICQ1IDwtICQyICYgJDUKKyAgICBhZGQJCSQ0LCQ0LCQ1CTs7ICQ0IDwtICQ0ICsgJDUKKyAgICBzcndpCSQ0LCQ0LDEJCTs7ICQ0IDwtICQ0ID4+IDEKKyAgICBybHdpbWkJJDQsJDMsMzEsMTYsMjMJOzsgJDRbMTYuLjIzXSA8LSAkM1sxNS4uMjJdCisgICAgc3R3CQkkNCwwKCQxKQk7OyAqJDEgPC0gJDQKKy5lbmRtYWNybworCisubWFjcm8gRFJBV01FVEhPRF9ERkxUX01BQ1JPCisgICAgRFJBV01FVEhPRF9QTFVTX01BQ1JPCisuZW5kbWFjcm8KKworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKworOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyB2b2lkIERSQVdNRVRIT0RfUExVU19QUEModW5zaWduZWQgaW50ICogYnVmLCB1bnNpZ25lZCBpbnQgX2NvbCk7Cis7IHZvaWQgRFJBV01FVEhPRF9QTFVTXzJfUFBDKHVuc2lnbmVkICogaW4sIHVuc2lnbmVkIGludCAqIG91dCwgdW5zaWduZWQgaW50IF9jb2wpOworOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLmdsb2JsIF9EUkFXTUVUSE9EX1BMVVNfMl9QUEMKKy5hbGlnbiAzCitfRFJBV01FVEhPRF9QTFVTXzJfUFBDOgorICAgIERSQVdNRVRIT0RfUExVU19NQUNSTwlyMyxyNCxyNSxyNixyNyxyOCxyOQorICAgIGJscgkJCQk7OyByZXR1cm4KKworLmdsb2JsIF9EUkFXTUVUSE9EX1BMVVNfUFBDCisuYWxpZ24gMworX0RSQVdNRVRIT0RfUExVU19QUEM6CisgICAgRFJBV01FVEhPRF9QTFVTX01BQ1JPCXIzLHIzLHI0LHI1LHI2LHI3LHI5CisgICAgYmxyCQkJCTs7IHJldHVybgorCisKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsgdm9pZCBEUkFXTUVUSE9EX0hBTEZfUFBDKHVuc2lnbmVkIGludCAqIGJ1ZiwgdW5zaWduZWQgaW50IF9jb2wpOworOyB2b2lkIERSQVdNRVRIT0RfSEFMRl8yX1BQQyh1bnNpZ25lZCAqIGluLCB1bnNpZ25lZCBpbnQgKiBvdXQsIHVuc2lnbmVkIGludCBfY29sKTsKKzsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy5nbG9ibCBfRFJBV01FVEhPRF9IQUxGXzJfUFBDCisuYWxpZ24gMworX0RSQVdNRVRIT0RfSEFMRl8yX1BQQzoKKyAgICBEUkFXTUVUSE9EX0hBTEZfTUFDUk8JcjMscjQscjUscjYscjcscjgKKyAgICBibHIJCQkJOzsgcmV0dXJuCisKKy5nbG9ibCBfRFJBV01FVEhPRF9IQUxGX1BQQworLmFsaWduIDMKK19EUkFXTUVUSE9EX0hBTEZfUFBDOgorICAgIERSQVdNRVRIT0RfSEFMRl9NQUNSTwlyMyxyMyxyNCxyNSxyNixyNworICAgIGJscgkJCQk7OyByZXR1cm4KKworCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7IHZvaWQgRFJBV19MSU5FX1BQQyh1bnNpZ25lZCBpbnQgKmRhdGEsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiwgdW5zaWduZWQgaW50IGNvbCwKKzsgCQkJdW5zaWduZWQgaW50IHNjcmVlbngsIHVuc2lnbmVkIGludCBzY3JlZW55KQorOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLmdsb2JsIF9EUkFXX0xJTkVfUFBDCisuYWxpZ24gMworX0RSQVdfTElORV9QUEM6CisgICAgOzsgTk9UIElNUExFTUVOVEVEIFlFVAorICAgIGJscgkJCQk7OyByZXR1cm4KKworCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7IHZvaWQgX3BwY19icmlnaHRuZXNzKFBpeGVsICogc3JjLCBQaXhlbCAqIGRlc3QsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBpbnQgY29lZmYpCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKworLmNvbnN0CisuYWxpZ24gNAordmVjdG9yWkVSTzoKKyAgICAubG9uZyAwLDAsMCwwCisgICAgLmxvbmcgMHgxMDEwMTAwMCwgMHgxMDEwMTAwMSwgMHgxMDEwMTAwMiwgMHgxMDEwMTAwMworICAgIC5sb25nIDB4MTAxMDEwMDQsIDB4MTAxMDEwMDUsIDB4MTAxMDEwMDYsIDB4MTAxMDEwMDcKKyAgICAubG9uZyAweDEwMTAxMDA4LCAweDEwMTAxMDA5LCAweDEwMTAxMDBBLCAweDEwMTAxMDBCCisgICAgLmxvbmcgMHgxMDEwMTAwQywgMHgxMDEwMTAwRCwgMHgxMDEwMTAwRSwgMHgxMDEwMTAwRgorCisKKy5zZWN0aW9uIF9fVEVYVCxfX3RleHQscmVndWxhcixwdXJlX2luc3RydWN0aW9ucworCisuZ2xvYmwgX3BwY19icmlnaHRuZXNzX0c0CisuYWxpZ24gMworX3BwY19icmlnaHRuZXNzX0c0OgorCisKKzs7IFBvd2VyUEMgQWx0aXZlYyBjb2RlCisgICAgc3J3aSAgICByNSxyNSwyCisgICAgbXRjdHIgICByNQorCis7O3Zyc2F2ZQorICAgIG1mc3ByICAgcjExLDI1NgorICAgIGxpcyAgICAgcjEyLDB4Q0ZGQworICAgIG10c3ByICAgMjU2LHIxMgorCisgICAgICAgIG1mbHIgcjAKKyAgICAgICAgYmNsIDIwLDMxLCJMMDAwMDAwMDAwMDEkcGIiCisiTDAwMDAwMDAwMDAxJHBiIjoKKyAgICAgICAgbWZsciByMTAKKyAgICAgICAgbXRsciByMAorCisgICAgYWRkaXMgICByOSxyMTAsaGExNih2ZWN0b3JaRVJPLSJMMDAwMDAwMDAwMDEkcGIiKQorICAgIGFkZGkgICAgcjkscjksbG8xNih2ZWN0b3JaRVJPLSJMMDAwMDAwMDAwMDEkcGIiKQorICAgIAorICAgIHZ4b3IgICAgdjAsdjAsdjAgOzsgVjAgPSBOVUxMIHZlY3RvcgorCisgICAgYWRkaSAgICByOSxyOSwxNgorICAgIGx2eCAgICAgdjEwLDAscjkKKyAgICBhZGRpICAgIHI5LHI5LDE2CisgICAgbHZ4ICAgICB2MTEsMCxyOQorICAgIGFkZGkgICAgcjkscjksMTYKKyAgICBsdnggICAgIHYxMiwwLHI5CisgICAgYWRkaSAgICByOSxyOSwxNgorICAgIGx2eCAgICAgdjEzLDAscjkKKworICAgIGFkZGlzICAgcjkscjEwLGhhMTYodmVjdG9ydG1wd29yay0iTDAwMDAwMDAwMDAxJHBiIikKKyAgICBhZGRpICAgIHI5LHI5LGxvMTYodmVjdG9ydG1wd29yay0iTDAwMDAwMDAwMDAxJHBiIikKKyAgICBzdHcgICAgIHI2LDAocjkpCisgICAgbGkgICAgICByNiw4CisgICAgc3R3ICAgICByNiw0KHI5KQorICAgIGx2eCAgICAgdjksMCxyOQorICAgIGxpICAgICAgcjksMTI4CisgICAgdnNwbHR3ICB2OCx2OSwwCisgICAgdnNwbHR3ICB2OSx2OSwxCisKKzs7IGVsdCBjb3VudGVyCisgICAgbGkgICAgICByOSwwCisgICAgbGlzICAgICByNywweDBGMDEKKyAgICBiIEw3CisuYWxpZ24gNAorTDc6CisgICAgbHZ4ICAgICB2MSxyOSxyMworCisgICAgdnBlcm0gICB2NCx2MSx2MCx2MTAKKyAgICA7KioqKioqKioqKioqKioqKioqKioqCisgICAgIGFkZCByMTAscjkscjMKKyAgICA7KioqKioqKioqKioqKioqKioqKioqCisgICAgdnBlcm0gICB2NSx2MSx2MCx2MTEKKyAgICB2cGVybSAgIHY2LHYxLHYwLHYxMgorICAgIHZwZXJtICAgdjcsdjEsdjAsdjEzCisKKyAgICB2bXVsb3VoICB2NCx2NCx2OAorICAgIDsqKioqKioqKioqKioqKioqKioqKioKKyAgICAgZHN0ICAgICByMTAscjcsMworICAgIDsqKioqKioqKioqKioqKioqKioqKioKKyAgICB2bXVsb3VoICB2NSx2NSx2OAorICAgIHZtdWxvdWggIHY2LHY2LHY4CisgICAgdm11bG91aCAgdjcsdjcsdjgKKyAgICB2c3J3ICAgICB2NCx2NCx2OQorICAgIHZzcncgICAgIHY1LHY1LHY5CisgICAgdnNydyAgICAgdjYsdjYsdjkKKyAgICB2c3J3ICAgICB2Nyx2Nyx2OSAKKyAgICAKKyAgICB2cGt1d3VzIHY0LHY0LHY1CisgICAgdnBrdXd1cyB2Nix2Nix2NworICAgIHZwa3VodXMgdjEsdjQsdjYKKworICAgIHN0dnggICAgdjEscjkscjQKKyAgICBhZGRpICAgIHI5LHI5LDE2CisKKyAgICBiZG56IEw3CisKKyAgICBtdHNwciAgIDI1NixyMTEKKyAgICBibHIKKworCisuZ2xvYmwgX3BwY19icmlnaHRuZXNzX0c1CisuYWxpZ24gMworX3BwY19icmlnaHRuZXNzX0c1OgorCis7OyBQb3dlclBDIEFsdGl2ZWMgRzUgY29kZQorICAgIHNyd2kgICAgcjUscjUsMgorICAgIG10Y3RyICAgcjUKKworOzt2cnNhdmUKKyAgICBtZnNwciAgIHIxMSwyNTYKKyAgICBsaXMgICAgIHIxMiwweENGRkMKKyAgICBtdHNwciAgIDI1NixyMTIKKworICAgICAgICBtZmxyIHIwCisgICAgICAgIGJjbCAyMCwzMSwiTDAwMDAwMDAwMDAyJHBiIgorIkwwMDAwMDAwMDAwMiRwYiI6CisgICAgICAgIG1mbHIgcjEwCisgICAgICAgIG10bHIgcjAKKworICAgIGFkZGlzICAgcjkscjEwLGhhMTYodmVjdG9yWkVSTy0iTDAwMDAwMDAwMDAyJHBiIikKKyAgICBhZGRpICAgIHI5LHI5LGxvMTYodmVjdG9yWkVSTy0iTDAwMDAwMDAwMDAyJHBiIikKKyAgICAKKyAgICB2eG9yICAgIHYwLHYwLHYwIDs7IFYwID0gTlVMTCB2ZWN0b3IKKworICAgIGFkZGkgICAgcjkscjksMTYKKyAgICBsdnggICAgIHYxMCwwLHI5CisgICAgYWRkaSAgICByOSxyOSwxNgorICAgIGx2eCAgICAgdjExLDAscjkKKyAgICBhZGRpICAgIHI5LHI5LDE2CisgICAgbHZ4ICAgICB2MTIsMCxyOQorICAgIGFkZGkgICAgcjkscjksMTYKKyAgICBsdnggICAgIHYxMywwLHI5CisKKyAgICBhZGRpcyAgIHI5LHIxMCxoYTE2KHZlY3RvcnRtcHdvcmstIkwwMDAwMDAwMDAwMiRwYiIpCisgICAgYWRkaSAgICByOSxyOSxsbzE2KHZlY3RvcnRtcHdvcmstIkwwMDAwMDAwMDAwMiRwYiIpCisgICAgc3R3ICAgICByNiwwKHI5KQorICAgIGxpICAgICAgcjYsOAorICAgIHN0dyAgICAgcjYsNChyOSkKKyAgICBsdnggICAgIHY5LDAscjkKKyAgICBsaSAgICAgIHI5LDEyOAorICAgIHZzcGx0dyAgdjgsdjksMAorICAgIHZzcGx0dyAgdjksdjksMQorCis7OyBlbHQgY291bnRlcgorICAgIGxpICAgICAgcjksMAorICAgIGxpcyAgICAgcjcsMHgwRjAxCisgICAgYiBMNgorLmFsaWduIDQKK0w2OgorICAgIGx2eCAgICAgdjEscjkscjMKKworICAgIHZwZXJtICAgdjQsdjEsdjAsdjEwCisgICAgOyoqKioqKioqKioqKioqKioqKioqKgorICAgIGFkZCByMTAscjkscjMKKyAgICA7KioqKioqKioqKioqKioqKioqKioqCisgICAgdnBlcm0gICB2NSx2MSx2MCx2MTEKKyAgICB2cGVybSAgIHY2LHYxLHYwLHYxMgorICAgIHZwZXJtICAgdjcsdjEsdjAsdjEzCisKKyAgICB2bXVsb3VoICB2NCx2NCx2OAorICAgIHZtdWxvdWggIHY1LHY1LHY4CisgICAgdm11bG91aCAgdjYsdjYsdjgKKyAgICB2bXVsb3VoICB2Nyx2Nyx2OAorICAgIHZzcncgICAgIHY0LHY0LHY5CisgICAgdnNydyAgICAgdjUsdjUsdjkKKyAgICB2c3J3ICAgICB2Nix2Nix2OQorICAgIHZzcncgICAgIHY3LHY3LHY5IAorICAgIAorICAgIHZwa3V3dXMgdjQsdjQsdjUKKyAgICB2cGt1d3VzIHY2LHY2LHY3CisgICAgdnBrdWh1cyB2MSx2NCx2NgorCisgICAgc3R2eCAgICB2MSxyOSxyNAorICAgIGFkZGkgICAgcjkscjksMTYKKworICAgIGJkbnogTDYKKworICAgIG10c3ByICAgMjU2LHIxMQorICAgIGJscgorCisKKy5nbG9ibCBfcHBjX2JyaWdodG5lc3NfZ2VuZXJpYworLmFsaWduIDMKK19wcGNfYnJpZ2h0bmVzc19nZW5lcmljOgorICAgIGxpcyAgIHIxMiwweDAwRkYKKyAgICBvcmkgICByMTIscjEyLDB4MDBGRgorICAgIHN1YmkgIHIzLHIzLDQKKyAgICBzdWJpICByNCxyNCw0CisgICAgbXRjdHIgcjUKKyAgICBiIEwxCisuYWxpZ24gNAorTDE6CisgICAgbHd6dSAgcjcsNChyMykKKworICAgIHJsd2lubSAgcjgscjcsMTYsMjQsMzEKKyAgICBybHdpbm0gIHI5LHI3LDI0LDI0LDMxCisgICAgbXVsbHcgICByOCxyOCxyNgorICAgIHJsd2lubSAgcjEwLHI3LDAsMjQsMzEKKyAgICBtdWxsdyAgIHI5LHI5LHI2CisgICAgc3J3aSAgICByOCxyOCw4CisgICAgbXVsbHcgICByMTAscjEwLHI2CisgICAgc3J3aSAgICByOSxyOSw4CisKKyAgICBybHdpbm0uIHIxMSxyOCwwLDAsMjMKKyAgICBiZXEgICAgIEwyCisgICAgbGkgICAgICByOCwweEZGCitMMjoKKyAgICBzcndpICAgIHIxMCxyMTAsOAorICAgIHJsd2lubS4gcjExLHI5LDAsMCwyMworICAgIGJlcSAgICAgTDMKKyAgICBsaSAgICAgIHI5LDB4RkYKK0wzOgorICAgIHJsd2lubSAgcjcscjgsMTYsOCwxNQorICAgIHJsd2lubS4gcjExLHIxMCwwLDAsMjMKKyAgICBiZXEgICAgIEw0CisgICAgbGkgICAgICByMTAsMHhGRgorTDQ6CisgICAgcmx3aW1pICByNyxyOSw4LDE2LDIzCisgICAgcmx3aW1pICByNyxyMTAsMCwyNCwzMQorCisgICAgc3R3dSAgICByNyw0KHI0KQorICAgIGJkbnogTDEKKworICAgIGJscgorCisKKworLnN0YXRpY19kYXRhCisuYWxpZ24gNAordmVjdG9ydG1wd29yazoKKyAgICAubG9uZyAwLDAsMCwwCisKZGlmZiAtLWdpdCBhL2dzdC9nb29tL3BwY196b29tX3VsdGltYXRlLmggYi9nc3QvZ29vbS9wcGNfem9vbV91bHRpbWF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMmM4YTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9wcGNfem9vbV91bHRpbWF0ZS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIEdvb20gUHJvamVjdAorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gR3VpbGxhdW1lIEJvcmlvcywgaU9TLVNvZnR3YXJlCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyogR2VuZXJpYyBQb3dlclBDIENvZGUgKi8KK3ZvaWQgcHBjX3pvb21fZ2VuZXJpYyAoaW50IHNpemVYLCBpbnQgc2l6ZVksIFBpeGVsICpzcmMsIFBpeGVsICpkZXN0LCBpbnQgKmJydXRTLCBpbnQgKmJydXRELCBpbnQgYnVmZnJhdGlvLCBpbnQgcHJlY2FsQ29lZlsxNl1bMTZdKTsKKworLyogRzQgU3BlY2lmaWMgUG93ZXJQQyBDb2RlIChQb3NzaWJsZSB1c2Ugb2YgQWx0aXZlYyBhbmQgRGF0YSBTdHJlYW1zKSAqLwordm9pZCBwcGNfem9vbV9HNCAoaW50IHNpemVYLCBpbnQgc2l6ZVksIFBpeGVsICpzcmMsIFBpeGVsICpkZXN0LCBpbnQgKmJydXRTLCBpbnQgKmJydXRELCBpbnQgYnVmZnJhdGlvLCBpbnQgcHJlY2FsQ29lZlsxNl1bMTZdKTsKKwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vcHBjX3pvb21fdWx0aW1hdGUucyBiL2dzdC9nb29tL3BwY196b29tX3VsdGltYXRlLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3ZWM1MAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL3BwY196b29tX3VsdGltYXRlLnMKQEAgLTAsMCArMSwzMzYgQEAKKzsgUG93ZXJQQyBvcHRpbWl6ZWQgem9vbSBmb3IgR29vbQorOyDCqSAyMDAxLTIwMDMgR3VpbGxhdW1lIEJvcmlvcworOyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCis7IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7Cis7IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsKKzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKzsgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKzsgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCis7IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCis7IENoYW5nZSBsb2cgOgorOyAyMSBEZWMgMjAwMyA6IFVzZSBvZiBhbHRpdmVjIGlzIG5vdyBkZXRlcm1pbmVkIHdpdGggYSBwYXJhbWV0ZXIKKworOyBTZWN0aW9uIGRlZmluaXRpb24gOiBXZSB1c2UgYSByZWFkIG9ubHkgc2VjdGlvbgorLnRleHQKKworOyBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBjYWxsIGJ5IEMgcHJvZ3JhbSA6IHBwY196b29tCis7IFdlIGRlY2xhcmUgdGhpcyBsYWJlbCBhcyBhIGdsb2JhbCB0byBleHRlbmQgaXRzIHNjb3BlIG91dHNpZGUgdGhpcyBmaWxlCisuZ2xvYmwgX3BwY196b29tX2dlbmVyaWMKKy5nbG9ibCBfcHBjX3pvb21fRzQKKworOyBEZXNjcmlwdGlvbiA6Cis7IFRoaXMgcm91dGluZSBkeW5hbWljYWxseSBjb21wdXRlcyBhbmQgYXBwbGllcyBhIHpvb20gZmlsdGVyCisKKzsgcGFyYW1ldGVycyA6Cis7IHIzICA8PT4gdW5zaWduZWQgaW50IHNpemVYIChpbiBwaXhlbHMpCis7IHI0ICA8PT4gdW5zaWduZWQgaW50IHNpemVZIChpbiBwaXhlbHMpCis7IHI1ICA8PT4gdW5zaWduZWQgaW50ICogZnJvbXBpeG1hcAorOyByNiAgPD0+IHVuc2lnbmVkIGludCAqIHRvcGl4bWFwCis7IHI3ICA8PT4gdW5zaWduZWQgaW50ICogYnJ1dFMKKzsgcjggIDw9PiB1bnNpZ25lZCBpbnQgKiBicnV0RAorOyByOSAgPD0+IHVuc2lnbmVkIGludCBidWZmcmF0aW8KKzsgcjEwIDw9PiBpbnQgWzE2XVsxNl0gcHJlY2FsY2NvZWZmcworCis7IGdsb2JhbHMgYWZ0ZXIgaW5pdAorOyByNSAgPD0+IGZyb21waXhtYXAgLSAxIGJ5dGUgbmVlZGVkIGZvciBwcmVpbmNyZW1lbnRhbCBmZXRjaCAocmVwbGFjZXMgcjUpCis7IHI2ICA8PT4gdG9waXhtYXAgLSAxIGJ5dGUgbmVlZGVkIGZvciBwcmVpbmNyZW1lbnRhbCBmZXRjaCAocmVwbGFjZXMgcjYpCis7IHIzIDw9PiBheCA9IHggbWF4IGluIDE2dGggb2YgcGl4ZWxzIChyZXBsYWNlcyBvbGQgcjMpCis7IHI0IDw9PiBheSA9IHkgbWF4IGluIDE2dGggb2YgcGl4ZWxzIChyZXBsYWNlcyBvbGQgcjQpCis7IHIyMCA8PT4gcm93IHNpemUgaW4gYnl0ZXMKKzsgcjEyIDw9PiAweEZGMDBGRiAobWFzayBmb3IgcGFyYWxsZWwgMzIgYml0cyBwaXhzIGNvbXB1dGluZykKKzsgcjMwIDw9PiBicnV0UyAtIDEgYnl0ZSBuZWVkZWQgZm9yIHByZWluY3JlbWVudGFsIGZldGNoIChyZXBsYWNlcyByNykKKzsgcjMxIDw9PiBicnV0RCAtIDEgYnl0ZSBuZWVkZWQgZm9yIHByZWluY3JlbWVudGFsIGZldGNoIChyZXBsYWNlcyByOCkKKworOyBBQkkgbm90ZXMgOgorOyByMSBpcyB0aGUgU3RhY2sgUG9pbnRlciAoU1ApID0+IERvIG5vdCB1c2UKKzsgcjEzLi5yMzEgYXJlIG5vbi12b2xhdGlsZXMgPT4gRG8gbm90IHVzZQorCitfcHBjX3pvb21fZ2VuZXJpYzoKKworOyBTYXZlcyB0aGUgdXNlZCBub24gdm9sYXRpbGUgcmVnaXN0ZXJzIGluIHRoZSBNYWNoLU8gc3RhY2sgcyBSZWQtWm9uZQorc3RtdyAJcjE4LC01NihyMSkKKworOyBpbml0CitsaSAgICAgIHIxOCwwCQk7IERlZmF1bHQgdmFsdWUgaWYgb3V0IG9mIHJhbmdlIDogMCAoQmxhY2spCittciAgICAgIHIxMSxyMTAKK2xpcyAgICAgcjEyLDB4RkYKK211bGx3ICAgcjIscjMscjQJOyBOdW1iZXIgb2YgcGl4ZWxzIHRvIGNvbXB1dGUKK3N1YmkgICAgcjMwLHI4LDAKK3Nsd2kJcjIwLHIzLDIKK3NyYXdpICAgcjE5LHIyMCwyCitvcmkgICAgIHIxMixyMTIsMHhGRgorc3ViaSAgICByMyxyMywxCitzdWJpICAgIHI0LHI0LDEKK210c3ByCWN0cixyMgkJOyBJbml0IHRoZSBsb29wIGNvdW50IChvbmUgbG9vcCBwZXIgcGl4ZWwgY29tcHV0ZWQpCitzdWJpICAgIHIzMSxyNywwCitzdWJpICAgIHI2LHI2LDQKK3Nsd2kJcjMscjMsNAorc2x3aQlyNCxyNCw0CisKKztwcmUgaW5pdCBmb3IgbG9vcAorbHd6CXIyLDAocjMxKSAgICA7IHB4Citsd3oJcjI5LDQocjMxKSAgIDsgcHkKK2x3eglyOCwwKHIzMCkgICAgOyBweDIKK2x3eglyMTAsNChyMzApICAgOyBweTIKKworYiAgICAgICBMMQorLmFsaWduICA1CitMMToKKworOyBjb21wdXRlcyBkeW5hbWljYWxseSB0aGUgcG9zaXRpb24gdG8gZmV0Y2gKK3N1YiAgICAgcjgscjgscjIKK3N1YiAgICAgcjEwLHIxMCxyMjkKK211bGx3ICAgcjgscjgscjkKK2FkZGkgICAgcjMxLHIzMSw4CittdWxsdyAgIHIxMCxyMTAscjkKK2FkZGkgICAgcjMwLHIzMCw4CisKK3NyYXdpICAgcjgscjgsMTYKK3NyYXdpICAgcjEwLHIxMCwxNgorYWRkICAgICByMixyMixyOAorYWRkICAgICByMjkscjI5LHIxMAorCis7IGlmIHB4PmF4IG9yIHB5PmF5IGdvdG8gb3V0b2ZyYW5nZQorOyBjb21wdXRlcyB0aGUgYXR0ZW51YXRpb24gY29lZmZzIGFuZCB0aGUgb3JpZ2luYWwgcG9pbnQgYWRkcmVzcworcmx3aW5tICByMTAscjIsNiwyOC02LDMxLTYgOyByMTAgPC0gKHIyIDw8IDIpICYgMHgwMDAwMDJEMCAgIChyMTA9KHIyJTE2KSo0KjE2KQorY21wbCAgICBjcjQsMCxyMixyMworcmx3aW1pICByMTAsIHIyOSwgMiwgMjgtMiwgMzEtMiA7IHIxMCA8LSAoKHIyOSA8PCAyKSAmIDB4MDAwMDAwMkQpIHwgKHIxMCAmICEweDAwMDAwMDJEKSAgICAgIChyMTA9KHIxMCUxNikqNCB8IHIxMCkKK2NtcGwgICAgY3I3LDAscjI5LHI0CitzcmF3aSAgIHIyOSxyMjksNCAgICAgOyBwb3MgY29tcHV0aW5nCitiZ2UtCWNyNCxMNAorc3Jhd2kgICByMixyMiw0ICAgICAgIDsgcG9zIGNvbXB1dGluZworbXVsbHcgICByMjksIHIyOSxyMTkgIDsgcG9zIGNvbXB1dGluZworYmdlLQljcjcsTDQKKworOyBDaGFubmVscyBub3RhdGlvbiA6IDAwMTEyMjMzIChBQVJSVlZCQikKKworYWRkICAgICByMixyMixyMjkgICAgCQk7IHBvcyBjb21wdXRpbmcKK2x3enggICAgcjEwLHIxMSxyMTAJCTsgTG9hZHMgY29lZnMKK3Nsd2kgICAgcjIscjIsMiAgICAgIAkJOyBwb3MgY29tcHV0aW5nCithZGQJcjIscjIscjUgICAgIAkJOyBwb3MgY29tcHV0aW5nCitybHdpbm0gIHIyMSxyMTAsMCwyNCwzMQkgICAgICAgIDsgSXNvbGF0ZXMgY29lZjEgKD8/Pz8/PzExIC0+IDAwMDAwMDExKQorbHd6CXIyNSwwKHIyKQkJOyBMb2FkcyBjb2wxIC0+IHIyNQorbHd6CXIyNiw0KHIyKQkJOyBMb2FkcyBjb2wyIC0+IHIyNgorcmx3aW5tICByMjIscjEwLDI0LDI0LDMxCTsgSXNvbGF0ZXMgY29lZjIgKD8/Pz8yMj8/IC0+IDAwMDAwMDIyKQorcmx3aW5tICByMjMscjEwLDE2LDI0LDMxCTsgSXNvbGF0ZXMgY29lZjMgKD8/MzM/Pz8/IC0+IDAwMDAwMDMzKQorYWRkCXIyLHIyLHIyMAkJOyBBZGRzIG9uZSBsaW5lIGZvciBmdXR1cmUgbG9hZCBvZiBjb2wzIGFuZCBjb2w0CithbmQJcjgsIHIyNSxyMTIJCTsgTWFza3MgY29sMSBjaGFubmVscyAxICYgMyA6IDB4MDBYWDAwWFgKK3Jsd2lubSAgcjI0LHIxMCw4LDI0LDMxCQk7IElzb2xhdGVzIGNvZWY0ICg0ND8/Pz8/PyAtPiAwMDAwMDA0NCkKK2FuZGkuCXIyNSxyMjUsMHhGRjAwCQk7IE1hc2tzIGNvbDEgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorbXVsbHcJcjgsIHI4LCByMjEJCTsgQXBwbGllcyBjb2VmMSBvbiBjb2wxIGNoYW5uZWxzIDEgJiAzCisKKworOyBjb21wdXRlcyBmaW5hbCBwaXhlbCBjb2xvcgorYW5kCXIxMCxyMjYscjEyCQk7IE1hc2tzIGNvbDIgY2hhbm5lbHMgMSAmIDMgOiAweDAwWFgwMFhYCitsd3oJcjI3LDAocjIpCQk7IExvYWRzIGNvbDMgLT4gcjI3CittdWxsdwlyMTAscjEwLHIyMgkJOyBBcHBsaWVzIGNvZWYyIG9uIGNvbDIgY2hhbm5lbHMgMSAmIDMKK211bGx3CXIyNSxyMjUscjIxCQk7IEFwcGxpZXMgY29lZjEgb24gY29sMSBjaGFubmVsIDIKK2FuZGkuCXIyOSxyMjYsMHhGRjAwCQk7IE1hc2tzIGNvbDIgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorbXVsbHcJcjI5LHIyOSxyMjIJCTsgQXBwbGllcyBjb2VmMiBvbiBjb2wyIGNoYW5uZWwgMgorbHd6CXIyOCw0KHIyKQkJOyBMb2FkcyBjb2w0IC0+IHIyOAorYWRkCXI4ICxyOCAscjEwCQk7IEFkZHMgY29sMSAmIGNvbDIgY2hhbm5lbHMgMSAmIDMKK2FuZAlyMTAscjI3LHIxMgkJOyBNYXNrcyBjb2wzIGNoYW5uZWxzIDEgJiAzIDogMHgwMFhYMDBYWAorYWRkCXIyNSxyMjUscjI5CQk7IEFkZHMgY29sMSAmIGNvbDIgY2hhbm5lbCAyCittdWxsdwlyMTAscjEwLHIyMwkJOyBBcHBsaWVzIGNvZWYzIG9uIGNvbDMgY2hhbm5lbHMgMSAmIDMKK2FuZGkuCXIyOSxyMjcsMHhGRjAwCQk7IE1hc2tzIGNvbDMgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorbXVsbHcJcjI5LHIyOSxyMjMJCTsgQXBwbGllcyBjb2VmMyBvbiBjb2wzIGNoYW5uZWwgMgorbHd6CXIyLDAocjMxKQkJOyBweAorYWRkCXI3ICxyOCAscjEwCQk7IEFkZHMgY29sMyB0byAoY29sMSArIGNvbDIpIGNoYW5uZWxzIDEgJiAzCithbmQJcjEwLHIyOCxyMTIJCTsgTWFza3MgY29sNCBjaGFubmVscyAxICYgMyA6IDB4MDBYWDAwWFgKK211bGx3CXIxMCxyMTAscjI0CQk7IEFwcGxpZXMgY29lZjQgb24gY29sNCBjaGFubmVscyAxICYgMworYWRkCXIyNSxyMjUscjI5CQk7IEFkZHMgY29sIDMgdG8gKGNvbDEgKyBjb2wyKSBjaGFubmVsIDIKK2x3eiAJcjgsMChyMzApICAgIAkJOyBweDIKK2FuZGkuCXIyOCxyMjgsMHhGRjAwCQk7IE1hc2tzIGNvbDQgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorYWRkCXI3ICxyNyAscjEwCQk7IEFkZHMgY29sNCB0byAoY29sMSArIGNvbDIgKyBjb2wzKSBjaGFubmVscyAxICYgMworbHd6CXIxMCw0KHIzMCkgICAJCTsgcHkyCittdWxsdwlyMjgscjI4LHIyNAkJOyBBcHBsaWVzIGNvZWY0IG9uIGNvbDQgY2hhbm5lbCAyCitzcmF3aQlyNywgcjcsIDgJCTsgKHN1bSBvZiBjaGFubmVscyAxICYgMykgPj4gOAorbHd6CXIyOSw0KHIzMSkgICAgICAgICAgICAgIDsgcHkKK2FkZAlyMjUscjI1LHIyOAkJOyBBZGRzIGNvbCA0IHRvIChjb2wxICsgY29sMiArIGNvbDMpIGNoYW5uZWwgMgorcmx3aW1pICByNywgcjI1LCAyNCwgMTYsIDIzCTsgKCgoc3VtIG9mIGNoYW5uZWxzIDIpID4+IDggKSAmIDB4MDAwMEZGMDApIHwgKChzdW0gb2YgY2hhbm5lbHMgMSBhbmQgMykgJiAweEZGRkYwMEZGKQorc3R3dQlyNyw0KHI2KQkJOyBTdG9yZXMgdGhlIGNvbXB1dGVkIHBpeGVsCitiZG56CUwxCQkJOyBJdGVyYXRlIGFnYWluIGlmIG5lZWRlZAorYiAgICAgICBMMwk7Z290byBlbmQJOyBJZiBub3QsIHJldHVybnMgZnJvbSB0aGUgZnVuY3Rpb24KKworCis7IGlmIG91dCBvZiByYW5nZQorTDQ6CitzdHd1CXIxOCw0KHI2KQorbHd6CXI4LDAocjMwKSAgICA7IHB4MgorbHd6CXIxMCw0KHIzMCkgICA7IHB5MgorbHd6CXIyLDAocjMxKSAgICA7IHB4Citsd3oJcjI5LDQocjMxKSAgIDsgcHkKK2JkbnoJTDEKKworCitMMzoKKworOyBSZXN0b3JlIHNhdmVkIHJlZ2lzdGVycyBhbmQgcmV0dXJuCitsbXcJcjE4LC01NihyMSkKK2JscgorCisKKworCisKKworCisKK19wcGNfem9vbV9HNDoKKworOyBTYXZlcyB0aGUgdXNlZCBub24gdm9sYXRpbGUgcmVnaXN0ZXJzIGluIHRoZSBNYWNoLU8gc3RhY2sgcyBSZWQtWm9uZQorc3RtdyAJcjE3LC02MChyMSkKKworOyBpbml0CitsaSAgICAgIHIxOCwwCQk7IERlZmF1bHQgdmFsdWUgaWYgb3V0IG9mIHJhbmdlIDogMCAoQmxhY2spCittciAgICAgIHIxMSxyMTAKK2xpcyAgICAgcjEyLDB4RkYKK211bGx3ICAgcjIscjMscjQJOyBOdW1iZXIgb2YgcGl4ZWxzIHRvIGNvbXB1dGUKK3N1YmkgICAgcjMwLHI4LDAKK3Nsd2kJcjIwLHIzLDIKK3NyYXdpICAgcjE5LHIyMCwyCitvcmkgICAgIHIxMixyMTIsMHhGRgorc3ViaSAgICByMyxyMywxCitzdWJpICAgIHI0LHI0LDEKK210c3ByCWN0cixyMgkJOyBJbml0IHRoZSBsb29wIGNvdW50IChvbmUgbG9vcCBwZXIgcGl4ZWwgY29tcHV0ZWQpCitzdWJpICAgIHIzMSxyNywwCitzdWJpICAgIHI2LHI2LDQKK3Nsd2kJcjMscjMsNAorc2x3aQlyNCxyNCw0CisKKztwcmUgaW5pdCBmb3IgbG9vcAorbHd6CXIyLDAocjMxKSAgICA7IHB4Citsd3oJcjI5LDQocjMxKSAgIDsgcHkKK2x3eglyOCwwKHIzMCkgICAgOyBweDIKK2x3eglyMTAsNChyMzApICAgOyBweTIKKworOyoqKioqKioqKioqKioqKioqKioqKgorbGlzICAgICByMTcsMHgwRjAxCisKK2IgICAgICAgTDEwMAorLmFsaWduICA1CitMMTAwOgorCithZGRpICAgIHI2LHI2LDQKKworOyBPcHRpbWl6YXRpb24gdG8gZW5zdXJlIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKzsgd29uJ3QgYmUgbG9hZGVkIGludG8gdGhlIGRhdGEgY2FjaGUKK3Jsd2lubS4gcjAscjYsMCwyNywzMQorYm5lKyAgICBMNTAwCitkY2J6ICAgIDAscjYKKztkY2JhICAgIDAscjYKK0w1MDA6CisKKzsgY29tcHV0ZXMgZHluYW1pY2FsbHkgdGhlIHBvc2l0aW9uIHRvIGZldGNoCis7bXVsbHcgICByOCxyOCxyMjkKKzttdWxsdyAgIHIyLHIyLHIyOQorO2FkZCAgICAgcjIscjgscjIKKztzcmF3aSAgIHIyLHIyLDE3CisKK3N1YiAgICAgcjgscjgscjIKK3N1YiAgICAgcjEwLHIxMCxyMjkKK211bGx3ICAgcjgscjgscjkKK2FkZGkgICAgcjMxLHIzMSw4CittdWxsdyAgIHIxMCxyMTAscjkKK2FkZGkgICAgcjMwLHIzMCw4CisKK2RzdCAgICAgcjMwLHIxNywwCisKK3NyYXdpICAgIHI4LHI4LDE2CitzcmF3aSAgICByMTAscjEwLDE2CithZGQgICAgIHIyLHIyLHI4CithZGQgICAgIHIyOSxyMjkscjEwCisKK2RzdCAgICAgcjMxLHIxNywxCisKKzsgaWYgcHg+YXggb3IgcHk+YXkgZ290byBvdXRvZnJhbmdlCis7IGNvbXB1dGVzIHRoZSBhdHRlbnVhdGlvbiBjb2VmZnMgYW5kIHRoZSBvcmlnaW5hbCBwb2ludCBhZGRyZXNzCitybHdpbm0gIHIxMCxyMiw2LDI4LTYsMzEtNiA7IHIxMCA8LSAocjIgPDwgMikgJiAweDAwMDAwMkQwICAgKHIxMD0ocjIlMTYpKjQqMTYpCitjbXBsICAgIGNyNCwwLHIyLHIzCitybHdpbWkgIHIxMCwgcjI5LCAyLCAyOC0yLCAzMS0yIDsgcjEwIDwtICgocjI5IDw8IDIpICYgMHgwMDAwMDAyRCkgfCAocjEwICYgITB4MDAwMDAwMkQpICAgICAgKHIxMD0ocjI5JTE2KSo0IHwgcjEwKQorY21wbCAgICBjcjcsMCxyMjkscjQKK3NyYXdpICAgcjI5LHIyOSw0ICAgICA7IHBvcyBjb21wdXRpbmcKK2JnZS0JY3I0LEw0MDAKK3NyYXdpICAgcjIscjIsNCAgICAgICA7IHBvcyBjb21wdXRpbmcKK211bGx3ICAgcjI5LCByMjkscjE5ICA7IHBvcyBjb21wdXRpbmcKK2JnZS0JY3I3LEw0MDAKKworOyBDaGFubmVscyBub3RhdGlvbiA6IDAwMTEyMjMzIChBQVJSVlZCQikKKworYWRkICAgICByMixyMixyMjkgICAgCQk7IHBvcyBjb21wdXRpbmcKK2x3enggICAgcjEwLHIxMSxyMTAJCTsgTG9hZHMgY29lZnMKK3Nsd2kgICAgcjIscjIsMiAgICAgIAkJOyBwb3MgY29tcHV0aW5nCithZGQJcjIscjIscjUgICAgIAkJOyBwb3MgY29tcHV0aW5nCitybHdpbm0gIHIyMSxyMTAsMCwyNCwzMQkgICAgICAgIDsgSXNvbGF0ZXMgY29lZjEgKD8/Pz8/PzExIC0+IDAwMDAwMDExKQorbHd6CXIyNSwwKHIyKQkJOyBMb2FkcyBjb2wxIC0+IHIyNQorbHd6CXIyNiw0KHIyKQkJOyBMb2FkcyBjb2wyIC0+IHIyNgorcmx3aW5tICByMjIscjEwLDI0LDI0LDMxCTsgSXNvbGF0ZXMgY29lZjIgKD8/Pz8yMj8/IC0+IDAwMDAwMDIyKQorcmx3aW5tICByMjMscjEwLDE2LDI0LDMxCTsgSXNvbGF0ZXMgY29lZjMgKD8/MzM/Pz8/IC0+IDAwMDAwMDMzKQorYWRkCXIyLHIyLHIyMAkJOyBBZGRzIG9uZSBsaW5lIGZvciBmdXR1cmUgbG9hZCBvZiBjb2wzIGFuZCBjb2w0CithbmQJcjgsIHIyNSxyMTIJCTsgTWFza3MgY29sMSBjaGFubmVscyAxICYgMyA6IDB4MDBYWDAwWFgKK3Jsd2lubSAgcjI0LHIxMCw4LDI0LDMxCQk7IElzb2xhdGVzIGNvZWY0ICg0ND8/Pz8/PyAtPiAwMDAwMDA0NCkKK2RzdCAgICAgcjIscjE3LDIKK3Jsd2lubSAgcjI1LHIyNSwwLDE2LDIzCQk7IE1hc2tzIGNvbDEgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorO2FuZGkuCXIyNSxyMjUsMHhGRjAwCQk7IE1hc2tzIGNvbDEgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorbXVsbHcJcjgsIHI4LCByMjEJCTsgQXBwbGllcyBjb2VmMSBvbiBjb2wxIGNoYW5uZWxzIDEgJiAzCisKKworOyBjb21wdXRlcyBmaW5hbCBwaXhlbCBjb2xvcgorYW5kCXIxMCxyMjYscjEyCQk7IE1hc2tzIGNvbDIgY2hhbm5lbHMgMSAmIDMgOiAweDAwWFgwMFhYCitsd3oJcjI3LDAocjIpCQk7IExvYWRzIGNvbDMgLT4gcjI3CittdWxsdwlyMTAscjEwLHIyMgkJOyBBcHBsaWVzIGNvZWYyIG9uIGNvbDIgY2hhbm5lbHMgMSAmIDMKK211bGx3CXIyNSxyMjUscjIxCQk7IEFwcGxpZXMgY29lZjEgb24gY29sMSBjaGFubmVsIDIKK3Jsd2lubSAgcjI5LHIyNiwwLDE2LDIzCQk7IE1hc2tzIGNvbDIgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorO2FuZGkuCXIyOSxyMjYsMHhGRjAwCQk7IE1hc2tzIGNvbDIgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorbXVsbHcJcjI5LHIyOSxyMjIJCTsgQXBwbGllcyBjb2VmMiBvbiBjb2wyIGNoYW5uZWwgMgorbHd6CXIyOCw0KHIyKQkJOyBMb2FkcyBjb2w0IC0+IHIyOAorYWRkCXI4ICxyOCAscjEwCQk7IEFkZHMgY29sMSAmIGNvbDIgY2hhbm5lbHMgMSAmIDMKK2FuZAlyMTAscjI3LHIxMgkJOyBNYXNrcyBjb2wzIGNoYW5uZWxzIDEgJiAzIDogMHgwMFhYMDBYWAorYWRkCXIyNSxyMjUscjI5CQk7IEFkZHMgY29sMSAmIGNvbDIgY2hhbm5lbCAyCittdWxsdwlyMTAscjEwLHIyMwkJOyBBcHBsaWVzIGNvZWYzIG9uIGNvbDMgY2hhbm5lbHMgMSAmIDMKK3Jsd2lubSAgcjI5LHIyNywwLDE2LDIzCQk7IE1hc2tzIGNvbDMgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorO2FuZGkuCXIyOSxyMjcsMHhGRjAwCQk7IE1hc2tzIGNvbDMgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorbXVsbHcJcjI5LHIyOSxyMjMJCTsgQXBwbGllcyBjb2VmMyBvbiBjb2wzIGNoYW5uZWwgMgorbHd6CXIyLDAocjMxKQkJOyBweAorYWRkCXI3ICxyOCAscjEwCQk7IEFkZHMgY29sMyB0byAoY29sMSArIGNvbDIpIGNoYW5uZWxzIDEgJiAzCithbmQJcjEwLHIyOCxyMTIJCTsgTWFza3MgY29sNCBjaGFubmVscyAxICYgMyA6IDB4MDBYWDAwWFgKK211bGx3CXIxMCxyMTAscjI0CQk7IEFwcGxpZXMgY29lZjQgb24gY29sNCBjaGFubmVscyAxICYgMworYWRkCXIyNSxyMjUscjI5CQk7IEFkZHMgY29sIDMgdG8gKGNvbDEgKyBjb2wyKSBjaGFubmVsIDIKK2x3eiAJcjgsMChyMzApICAgIAkJOyBweDIKK3Jsd2lubSAgcjI4LHIyOCwwLDE2LDIzCQk7IE1hc2tzIGNvbDQgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorO2FuZGkuCXIyOCxyMjgsMHhGRjAwCQk7IE1hc2tzIGNvbDQgY2hhbm5lbCAyIDogMHgwMDAwWFgwMAorYWRkCXI3ICxyNyAscjEwCQk7IEFkZHMgY29sNCB0byAoY29sMSArIGNvbDIgKyBjb2wzKSBjaGFubmVscyAxICYgMworbHd6CXIxMCw0KHIzMCkgICAJCTsgcHkyCittdWxsdwlyMjgscjI4LHIyNAkJOyBBcHBsaWVzIGNvZWY0IG9uIGNvbDQgY2hhbm5lbCAyCitzcmF3aQlyNywgcjcsIDgJCTsgKHN1bSBvZiBjaGFubmVscyAxICYgMykgPj4gOAorbHd6CXIyOSw0KHIzMSkgICAgICAgICAgICAgIDsgcHkKK2FkZAlyMjUscjI1LHIyOAkJOyBBZGRzIGNvbCA0IHRvIChjb2wxICsgY29sMiArIGNvbDMpIGNoYW5uZWwgMgorcmx3aW1pICByNywgcjI1LCAyNCwgMTYsIDIzCTsgKCgoc3VtIG9mIGNoYW5uZWxzIDIpID4+IDggKSAmIDB4MDAwMEZGMDApIHwgKChzdW0gb2YgY2hhbm5lbHMgMSBhbmQgMykgJiAweEZGRkYwMEZGKQorc3R3CXI3LDAocjYpCQk7IFN0b3JlcyB0aGUgY29tcHV0ZWQgcGl4ZWwKK2JkbnoJTDEwMAkJCTsgSXRlcmF0ZSBhZ2FpbiBpZiBuZWVkZWQKK2IgICAgICAgTDMwMAk7Z290byBlbmQJOyBJZiBub3QsIHJldHVybnMgZnJvbSB0aGUgZnVuY3Rpb24KKworCis7IGlmIG91dCBvZiByYW5nZQorTDQwMDoKK3N0dwlyMTgsMChyNikKK2x3eglyOCwwKHIzMCkgICAgOyBweDIKK2x3eglyMTAsNChyMzApICAgOyBweTIKK2x3eglyMiwwKHIzMSkgICAgOyBweAorbHd6CXIyOSw0KHIzMSkgICA7IHB5CitiZG56CUwxMDAKKworCitMMzAwOgorCis7IFJlc3RvcmUgc2F2ZWQgcmVnaXN0ZXJzIGFuZCByZXR1cm4KK2xtdwlyMTcsLTYwKHIxKQorYmxyCmRpZmYgLS1naXQgYS9nc3QvZ29vbS9zb3VuZF90ZXN0ZXIuYyBiL2dzdC9nb29tL3NvdW5kX3Rlc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMmYwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9zb3VuZF90ZXN0ZXIuYwpAQCAtMCwwICsxLDE2MSBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgInNvdW5kX3Rlc3Rlci5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIHNvbWUgY29uc3RhbnRzICovCisjZGVmaW5lIEJJR19HT09NX0RVUkFUSU9OIDEwMAorI2RlZmluZSBCSUdfR09PTV9TUEVFRF9MSU1JVCAwLjFmCisKKyNkZWZpbmUgQUNDRUxfTVVMVCAwLjk1ZgorI2RlZmluZSBTUEVFRF9NVUxUIDAuOTlmCisKKwordm9pZAorZXZhbHVhdGVfc291bmQgKGdpbnQxNiBkYXRhWzJdWzUxMl0sIFNvdW5kSW5mbyAqIGluZm8pCit7CisKKyAgaW50IGk7CisgIGZsb2F0IGRpZmFjY2VsOworICBmbG9hdCBwcmV2c3BlZWQ7CisKKyAgLyogZmluZCB0aGUgbWF4ICovCisgIGludCBpbmN2YXIgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCA1MTI7IGkgKz0gMikgeworICAgIGlmIChpbmN2YXIgPCBkYXRhWzBdW2ldKQorICAgICAgaW5jdmFyID0gZGF0YVswXVtpXTsKKyAgfQorCisgIGlmIChpbmN2YXIgPiBpbmZvLT5hbGxUaW1lc01heCkKKyAgICBpbmZvLT5hbGxUaW1lc01heCA9IGluY3ZhcjsKKworICAvKiB2b2x1bWUgc29ub3JlICovCisgIGluZm8tPnZvbHVtZSA9IChmbG9hdCkgaW5jdmFyIC8gKGZsb2F0KSBpbmZvLT5hbGxUaW1lc01heDsKKyAgbWVtY3B5IChpbmZvLT5zYW1wbGVzWzBdLCBkYXRhWzBdLCA1MTIgKiBzaXplb2YgKHNob3J0KSk7CisgIG1lbWNweSAoaW5mby0+c2FtcGxlc1sxXSwgZGF0YVsxXSwgNTEyICogc2l6ZW9mIChzaG9ydCkpOworCisgIGRpZmFjY2VsID0gaW5mby0+YWNjZWx2YXI7CisgIGluZm8tPmFjY2VsdmFyID0gaW5mby0+dm9sdW1lOyAgICAgICAgLyogYWNjZWwgZW50cmUgMCBldCAxICovCisKKyAgLyogdHJhbnNmb3JtYXRpb25zIHN1ciBsYSB2aXRlc3NlIGR1IHNvbiAqLworICBpZiAoaW5mby0+c3BlZWR2YXIgPiAxLjBmKQorICAgIGluZm8tPnNwZWVkdmFyID0gMS4wZjsKKworICBpZiAoaW5mby0+c3BlZWR2YXIgPCAwLjFmKQorICAgIGluZm8tPmFjY2VsdmFyICo9ICgxLjBmIC0gKGZsb2F0KSBpbmZvLT5zcGVlZHZhcik7CisgIGVsc2UgaWYgKGluZm8tPnNwZWVkdmFyIDwgMC4zZikKKyAgICBpbmZvLT5hY2NlbHZhciAqPSAoMC45ZiAtIChmbG9hdCkgKGluZm8tPnNwZWVkdmFyIC0gMC4xZikgLyAyLjBmKTsKKyAgZWxzZQorICAgIGluZm8tPmFjY2VsdmFyICo9ICgwLjhmIC0gKGZsb2F0KSAoaW5mby0+c3BlZWR2YXIgLSAwLjNmKSAvIDQuMGYpOworCisgIC8qIGFkb3VjaXNzZW1lbnQgZGUgbCdhY2NlbGVyYXRpb24gKi8KKyAgaW5mby0+YWNjZWx2YXIgKj0gQUNDRUxfTVVMVDsKKyAgaWYgKGluZm8tPmFjY2VsdmFyIDwgMCkKKyAgICBpbmZvLT5hY2NlbHZhciA9IDA7CisKKyAgZGlmYWNjZWwgPSBpbmZvLT5hY2NlbHZhciAtIGRpZmFjY2VsOworICBpZiAoZGlmYWNjZWwgPCAwKQorICAgIGRpZmFjY2VsID0gLWRpZmFjY2VsOworCisgIC8qIG1pc2UgYSBqb3VyIGRlIGxhIHZpdGVzc2UgKi8KKyAgcHJldnNwZWVkID0gaW5mby0+c3BlZWR2YXI7CisgIGluZm8tPnNwZWVkdmFyID0gKGluZm8tPnNwZWVkdmFyICsgZGlmYWNjZWwgKiAwLjVmKSAvIDI7CisgIGluZm8tPnNwZWVkdmFyICo9IFNQRUVEX01VTFQ7CisgIGluZm8tPnNwZWVkdmFyID0gKGluZm8tPnNwZWVkdmFyICsgMy4wZiAqIHByZXZzcGVlZCkgLyA0LjBmOworICBpZiAoaW5mby0+c3BlZWR2YXIgPCAwKQorICAgIGluZm8tPnNwZWVkdmFyID0gMDsKKyAgaWYgKGluZm8tPnNwZWVkdmFyID4gMSkKKyAgICBpbmZvLT5zcGVlZHZhciA9IDE7CisKKyAgLyogdGVtcHMgZHUgZ29vbSAqLworICBpbmZvLT50aW1lU2luY2VMYXN0R29vbSsrOworICBpbmZvLT50aW1lU2luY2VMYXN0QmlnR29vbSsrOworICBpbmZvLT5jeWNsZSsrOworCisgIC8qIGRldGVjdGlvbiBkZXMgbm91dmVhdXggZ29vbXMgKi8KKyAgaWYgKChpbmZvLT5zcGVlZHZhciA+IChmbG9hdCkgSVZBTCAoaW5mby0+YmlnZ29vbV9zcGVlZF9saW1pdF9wKSAvIDEwMC4wZikKKyAgICAgICYmIChpbmZvLT5hY2NlbHZhciA+IGluZm8tPmJpZ0dvb21MaW1pdCkKKyAgICAgICYmIChpbmZvLT50aW1lU2luY2VMYXN0QmlnR29vbSA+IEJJR19HT09NX0RVUkFUSU9OKSkgeworICAgIGluZm8tPnRpbWVTaW5jZUxhc3RCaWdHb29tID0gMDsKKyAgfQorCisgIGlmIChpbmZvLT5hY2NlbHZhciA+IGluZm8tPmdvb21fbGltaXQpIHsKKyAgICAvKiBUT0RPOiB0ZXN0ZXIgJiYgKGluZm8tPnRpbWVTaW5jZUxhc3RHb29tID4gMjApKSB7ICovCisgICAgaW5mby0+dG90YWxnb29tKys7CisgICAgaW5mby0+dGltZVNpbmNlTGFzdEdvb20gPSAwOworICAgIGluZm8tPmdvb21Qb3dlciA9IGluZm8tPmFjY2VsdmFyIC0gaW5mby0+Z29vbV9saW1pdDsKKyAgfQorCisgIGlmIChpbmZvLT5hY2NlbHZhciA+IGluZm8tPnByb3ZfbWF4KQorICAgIGluZm8tPnByb3ZfbWF4ID0gaW5mby0+YWNjZWx2YXI7CisKKyAgaWYgKGluZm8tPmdvb21fbGltaXQgPiAxKQorICAgIGluZm8tPmdvb21fbGltaXQgPSAxOworCisgIC8qIHRvdXRlIGxlcyAyIHNlY29uZGVzIDogdu+/vXJpZmllciBzaSBsZSB0YXV4IGRlIGdvb20gZXN0IGNvcnJlY3QKKyAgICogZXQgbGUgbW9kaWZpZXIgc2lub24uLiAqLworICBpZiAoaW5mby0+Y3ljbGUgJSA2NCA9PSAwKSB7CisgICAgaWYgKGluZm8tPnNwZWVkdmFyIDwgMC4wMWYpCisgICAgICBpbmZvLT5nb29tX2xpbWl0ICo9IDAuOTE7CisgICAgaWYgKGluZm8tPnRvdGFsZ29vbSA+IDQpIHsKKyAgICAgIGluZm8tPmdvb21fbGltaXQgKz0gMC4wMjsKKyAgICB9CisgICAgaWYgKGluZm8tPnRvdGFsZ29vbSA+IDcpIHsKKyAgICAgIGluZm8tPmdvb21fbGltaXQgKj0gMS4wM2Y7CisgICAgICBpbmZvLT5nb29tX2xpbWl0ICs9IDAuMDM7CisgICAgfQorICAgIGlmIChpbmZvLT50b3RhbGdvb20gPiAxNikgeworICAgICAgaW5mby0+Z29vbV9saW1pdCAqPSAxLjA1ZjsKKyAgICAgIGluZm8tPmdvb21fbGltaXQgKz0gMC4wNDsKKyAgICB9CisgICAgaWYgKGluZm8tPnRvdGFsZ29vbSA9PSAwKSB7CisgICAgICBpbmZvLT5nb29tX2xpbWl0ID0gaW5mby0+cHJvdl9tYXggLSAwLjAyOworICAgIH0KKyAgICBpZiAoKGluZm8tPnRvdGFsZ29vbSA9PSAxKSAmJiAoaW5mby0+Z29vbV9saW1pdCA+IDAuMDIpKQorICAgICAgaW5mby0+Z29vbV9saW1pdCAtPSAwLjAxOworICAgIGluZm8tPnRvdGFsZ29vbSA9IDA7CisgICAgaW5mby0+YmlnR29vbUxpbWl0ID0KKyAgICAgICAgaW5mby0+Z29vbV9saW1pdCAqICgxLjBmICsKKyAgICAgICAgKGZsb2F0KSBJVkFMIChpbmZvLT5iaWdnb29tX2ZhY3Rvcl9wKSAvIDUwMC4wZik7CisgICAgaW5mby0+cHJvdl9tYXggPSAwOworICB9CisKKyAgLyogbWlzZSBhIGpvdXIgZGVzIHBhcmFtZXRyZXMgcG91ciBsYSBHVUkgKi8KKyAgRlZBTCAoaW5mby0+dm9sdW1lX3ApID0gaW5mby0+dm9sdW1lOworICBpbmZvLT52b2x1bWVfcC5jaGFuZ2VfbGlzdGVuZXIgKCZpbmZvLT52b2x1bWVfcCk7CisgIEZWQUwgKGluZm8tPnNwZWVkX3ApID0gaW5mby0+c3BlZWR2YXIgKiA0OworICBpbmZvLT5zcGVlZF9wLmNoYW5nZV9saXN0ZW5lciAoJmluZm8tPnNwZWVkX3ApOworICBGVkFMIChpbmZvLT5hY2NlbF9wKSA9IGluZm8tPmFjY2VsdmFyOworICBpbmZvLT5hY2NlbF9wLmNoYW5nZV9saXN0ZW5lciAoJmluZm8tPmFjY2VsX3ApOworCisgIEZWQUwgKGluZm8tPmdvb21fbGltaXRfcCkgPSBpbmZvLT5nb29tX2xpbWl0OworICBpbmZvLT5nb29tX2xpbWl0X3AuY2hhbmdlX2xpc3RlbmVyICgmaW5mby0+Z29vbV9saW1pdF9wKTsKKyAgRlZBTCAoaW5mby0+Z29vbV9wb3dlcl9wKSA9IGluZm8tPmdvb21Qb3dlcjsKKyAgaW5mby0+Z29vbV9wb3dlcl9wLmNoYW5nZV9saXN0ZW5lciAoJmluZm8tPmdvb21fcG93ZXJfcCk7CisgIEZWQUwgKGluZm8tPmxhc3RfZ29vbV9wKSA9IDEuMCAtICgoZmxvYXQpIGluZm8tPnRpbWVTaW5jZUxhc3RHb29tIC8gMjAuMGYpOworICBpbmZvLT5sYXN0X2dvb21fcC5jaGFuZ2VfbGlzdGVuZXIgKCZpbmZvLT5sYXN0X2dvb21fcCk7CisgIEZWQUwgKGluZm8tPmxhc3RfYmlnZ29vbV9wKSA9CisgICAgICAxLjAgLSAoKGZsb2F0KSBpbmZvLT50aW1lU2luY2VMYXN0QmlnR29vbSAvIDQwLjBmKTsKKyAgaW5mby0+bGFzdF9iaWdnb29tX3AuY2hhbmdlX2xpc3RlbmVyICgmaW5mby0+bGFzdF9iaWdnb29tX3ApOworCisgIC8qIGJpZ0dvb21MaW1pdCA9PWdvb21MaW1pdCo5LzgrNyA/ICovCit9CmRpZmYgLS1naXQgYS9nc3QvZ29vbS9zb3VuZF90ZXN0ZXIuaCBiL2dzdC9nb29tL3NvdW5kX3Rlc3Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NTFkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbS9zb3VuZF90ZXN0ZXIuaApAQCAtMCwwICsxLDI5IEBACisvKiBHb29tIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IGlPUy1Tb2Z0d2FyZQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZuZGVmIF9TT1VORF9URVNURVJfSAorI2RlZmluZSBfU09VTkRfVEVTVEVSX0gKKworI2luY2x1ZGUgImdvb21fcGx1Z2luX2luZm8uaCIKKyNpbmNsdWRlICJnb29tX2NvbmZpZy5oIgorCisvKiogY2hhbmdlIGxlcyBkb25uZWVzIGR1IFNvdW5kSW5mbyAqLwordm9pZCBldmFsdWF0ZV9zb3VuZChnaW50MTYgZGF0YVsyXVs1MTJdLCBTb3VuZEluZm8gKnNuZEluZm8pOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vc3VyZjNkLmMgYi9nc3QvZ29vbS9zdXJmM2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDcyODRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vc3VyZjNkLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qIEdvb20gUHJvamVjdAorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gaU9TLVNvZnR3YXJlCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpbmNsdWRlICJzdXJmM2QuaCIKKyNpbmNsdWRlICJnb29tX3BsdWdpbl9pbmZvLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZ3JpZDNkICoKK2dyaWQzZF9uZXcgKGludCBzaXpleCwgaW50IGRlZngsIGludCBzaXpleiwgaW50IGRlZnosIHYzZCBjZW50ZXIpCit7CisgIGludCB4ID0gZGVmeDsKKyAgaW50IHkgPSBkZWZ6OworICBncmlkM2QgKmcgPSBtYWxsb2MgKHNpemVvZiAoZ3JpZDNkKSk7CisgIHN1cmYzZCAqcyA9ICYoZy0+c3VyZik7CisKKyAgcy0+bmJ2ZXJ0ZXggPSB4ICogeTsKKyAgcy0+dmVydGV4ID0gbWFsbG9jICh4ICogeSAqIHNpemVvZiAodjNkKSk7CisgIHMtPnN2ZXJ0ZXggPSBtYWxsb2MgKHggKiB5ICogc2l6ZW9mICh2M2QpKTsKKyAgcy0+Y2VudGVyID0gY2VudGVyOworCisgIGctPmRlZnggPSBkZWZ4OworICBnLT5zaXpleCA9IHNpemV4OworICBnLT5kZWZ6ID0gZGVmejsKKyAgZy0+c2l6ZXogPSBzaXplejsKKyAgZy0+bW9kZSA9IDA7CisKKyAgd2hpbGUgKHkpIHsKKyAgICAtLXk7CisgICAgeCA9IGRlZng7CisgICAgd2hpbGUgKHgpIHsKKyAgICAgIC0teDsKKyAgICAgIHMtPnZlcnRleFt4ICsgZGVmeCAqIHldLnggPSAoZmxvYXQpICh4IC0gZGVmeCAvIDIpICogc2l6ZXggLyBkZWZ4OworICAgICAgcy0+dmVydGV4W3ggKyBkZWZ4ICogeV0ueSA9IDA7CisgICAgICBzLT52ZXJ0ZXhbeCArIGRlZnggKiB5XS56ID0gKGZsb2F0KSAoeSAtIGRlZnogLyAyKSAqIHNpemV6IC8gZGVmejsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGc7Cit9CisKK3ZvaWQKK2dyaWQzZF9mcmVlIChncmlkM2QgKiBnKQoreworICBzdXJmM2QgKnMgPSAmKGctPnN1cmYpOworCisgIGZyZWUgKHMtPnZlcnRleCk7CisgIGZyZWUgKHMtPnN2ZXJ0ZXgpOworCisgIGZyZWUgKGcpOworfQorCit2b2lkCitncmlkM2RfZHJhdyAoUGx1Z2luSW5mbyAqIHBsdWcsIGdyaWQzZCAqIGcsIGludCBjb2xvciwgaW50IGNvbG9ybG93LAorICAgIGludCBkaXN0LCBQaXhlbCAqIGJ1ZiwgUGl4ZWwgKiBiYWNrLCBpbnQgVywgaW50IEgpCit7CisKKyAgaW50IHg7CisgIHYyZCB2MiwgdjJ4OworCisgIHYyZCAqdjJfYXJyYXkgPSBtYWxsb2MgKGctPnN1cmYubmJ2ZXJ0ZXggKiBzaXplb2YgKHYyZCkpOworCisgIHYzZF90b192MmQgKGctPnN1cmYuc3ZlcnRleCwgZy0+c3VyZi5uYnZlcnRleCwgVywgSCwgZGlzdCwgdjJfYXJyYXkpOworCisgIGZvciAoeCA9IDA7IHggPCBnLT5kZWZ4OyB4KyspIHsKKyAgICBpbnQgejsKKworICAgIHYyeCA9IHYyX2FycmF5W3hdOworCisgICAgZm9yICh6ID0gMTsgeiA8IGctPmRlZno7IHorKykgeworICAgICAgdjIgPSB2Ml9hcnJheVt6ICogZy0+ZGVmeCArIHhdOworICAgICAgaWYgKCgodjIueCAhPSAtNjY2KSB8fCAodjIueSAhPSAtNjY2KSkKKyAgICAgICAgICAmJiAoKHYyeC54ICE9IC02NjYpIHx8ICh2MngueSAhPSAtNjY2KSkpIHsKKyAgICAgICAgcGx1Zy0+bWV0aG9kcy5kcmF3X2xpbmUgKGJ1ZiwgdjJ4LngsIHYyeC55LCB2Mi54LCB2Mi55LCBjb2xvcmxvdywgVywgSCk7CisgICAgICAgIHBsdWctPm1ldGhvZHMuZHJhd19saW5lIChiYWNrLCB2MngueCwgdjJ4LnksIHYyLngsIHYyLnksIGNvbG9yLCBXLCBIKTsKKyAgICAgIH0KKyAgICAgIHYyeCA9IHYyOworICAgIH0KKyAgfQorCisgIGZyZWUgKHYyX2FycmF5KTsKK30KKwordm9pZAorc3VyZjNkX3JvdGF0ZSAoc3VyZjNkICogcywgZmxvYXQgYW5nbGUpCit7CisgIGludCBpOworICBmbG9hdCBjb3NhOworICBmbG9hdCBzaW5hOworCisgIFNJTkNPUyAoYW5nbGUsIHNpbmEsIGNvc2EpOworICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJ2ZXJ0ZXg7IGkrKykgeworICAgIFlfUk9UQVRFX1YzRCAocy0+dmVydGV4W2ldLCBzLT5zdmVydGV4W2ldLCBjb3NhLCBzaW5hKTsKKyAgfQorfQorCit2b2lkCitzdXJmM2RfdHJhbnNsYXRlIChzdXJmM2QgKiBzKQoreworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJ2ZXJ0ZXg7IGkrKykgeworICAgIFRSQU5TTEFURV9WM0QgKHMtPmNlbnRlciwgcy0+c3ZlcnRleFtpXSk7CisgIH0KK30KKwordm9pZAorZ3JpZDNkX3VwZGF0ZSAoZ3JpZDNkICogZywgZmxvYXQgYW5nbGUsIGZsb2F0ICp2YWxzLCBmbG9hdCBkaXN0KQoreworICBpbnQgaTsKKyAgZmxvYXQgY29zYTsKKyAgZmxvYXQgc2luYTsKKyAgc3VyZjNkICpzID0gJihnLT5zdXJmKTsKKyAgdjNkIGNhbSA9IHMtPmNlbnRlcjsKKworICBjYW0ueiArPSBkaXN0OworCisgIFNJTkNPUyAoKGFuZ2xlIC8gNC4zZiksIHNpbmEsIGNvc2EpOworICBjYW0ueSArPSBzaW5hICogMi4wZjsKKyAgU0lOQ09TIChhbmdsZSwgc2luYSwgY29zYSk7CisKKyAgaWYgKGctPm1vZGUgPT0gMCkgeworICAgIGlmICh2YWxzKQorICAgICAgZm9yIChpID0gMDsgaSA8IGctPmRlZng7IGkrKykKKyAgICAgICAgcy0+dmVydGV4W2ldLnkgPSBzLT52ZXJ0ZXhbaV0ueSAqIDAuMiArIHZhbHNbaV0gKiAwLjg7CisKKyAgICBmb3IgKGkgPSBnLT5kZWZ4OyBpIDwgcy0+bmJ2ZXJ0ZXg7IGkrKykgeworICAgICAgcy0+dmVydGV4W2ldLnkgKj0gMC4yNTVmOworICAgICAgcy0+dmVydGV4W2ldLnkgKz0gKHMtPnZlcnRleFtpIC0gZy0+ZGVmeF0ueSAqIDAuNzc3Zik7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHMtPm5idmVydGV4OyBpKyspIHsKKyAgICBZX1JPVEFURV9WM0QgKHMtPnZlcnRleFtpXSwgcy0+c3ZlcnRleFtpXSwgY29zYSwgc2luYSk7CisgICAgVFJBTlNMQVRFX1YzRCAoY2FtLCBzLT5zdmVydGV4W2ldKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vc3VyZjNkLmggYi9nc3QvZ29vbS9zdXJmM2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGEyMTgwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vc3VyZjNkLmgKQEAgLTAsMCArMSw1NyBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBfU1VSRjNEX0gKKyNkZWZpbmUgX1NVUkYzRF9ICisKKyNpbmNsdWRlICJ2M2QuaCIKKyNpbmNsdWRlICJnb29tX2dyYXBoaWMuaCIKKyNpbmNsdWRlICJnb29tX3R5cGVkZWZzLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2M2QgKnZlcnRleDsKKwl2M2QgKnN2ZXJ0ZXg7CisJaW50IG5idmVydGV4OworCisJdjNkIGNlbnRlcjsKK30gc3VyZjNkOworCit0eXBlZGVmIHN0cnVjdCB7CisJc3VyZjNkIHN1cmY7CisJCisJaW50IGRlZng7CisJaW50IHNpemV4OworCWludCBkZWZ6OworCWludCBzaXplejsKKwlpbnQgbW9kZTsKK30gZ3JpZDNkOworCisvKiBoaS1sZXZlbCAqLworCisvKiB3b3JrcyBvbiBncmlkM2QgKi8KK2dyaWQzZCAqZ3JpZDNkX25ldyAoaW50IHNpemV4LCBpbnQgZGVmeCwgaW50IHNpemV6LCBpbnQgZGVmeiwgdjNkIGNlbnRlcik7Cit2b2lkIGdyaWQzZF9mcmVlIChncmlkM2QgKmcpOwordm9pZCBncmlkM2RfdXBkYXRlIChncmlkM2QgKnMsIGZsb2F0IGFuZ2xlLCBmbG9hdCAqdmFscywgZmxvYXQgZGlzdCk7CisKKy8qIGxvdyBsZXZlbCAqLwordm9pZCBzdXJmM2RfZHJhdyAoc3VyZjNkICpzLCBpbnQgY29sb3IsIGludCBkaXN0LCBpbnQgKmJ1ZiwgaW50ICpiYWNrLCBpbnQgVyxpbnQgSCk7Cit2b2lkIGdyaWQzZF9kcmF3IChQbHVnaW5JbmZvICpwbHVnLCBncmlkM2QgKmcsIGludCBjb2xvciwgaW50IGNvbG9ybG93LCBpbnQgZGlzdCwgUGl4ZWwgKmJ1ZiwgUGl4ZWwgKmJhY2ssIGludCBXLGludCBIKTsKK3ZvaWQgc3VyZjNkX3JvdGF0ZSAoc3VyZjNkICpzLCBmbG9hdCBhbmdsZSk7Cit2b2lkIHN1cmYzZF90cmFuc2xhdGUgKHN1cmYzZCAqcyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20vc3VyZjNkLnMgYi9nc3QvZ29vbS9zdXJmM2QucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGM4YzVkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vc3VyZjNkLnMKQEAgLTAsMCArMSw0ODQgQEAKKwkuZmlsZQkic3VyZjNkLmMiCisJLnZlcnNpb24JIjAxLjAxIgorZ2NjMl9jb21waWxlZC46CisudGV4dAorCS5hbGlnbiA0CisuZ2xvYmwgZ3JpZDNkX25ldworCS50eXBlCSBncmlkM2RfbmV3LEBmdW5jdGlvbgorZ3JpZDNkX25ldzoKKwlwdXNobCAlZWJwCisJbW92bCAlZXNwLCVlYnAKKwlzdWJsICQ0NCwlZXNwCisJcHVzaGwgJWVkaQorCXB1c2hsICVlc2kKKwlwdXNobCAlZWJ4CisJbW92bCAyMCglZWJwKSwlZWF4CisJbW92bCAxMiglZWJwKSwlZXNpCisJbW92bCAlZWF4LC04KCVlYnApCisJYWRkbCAkLTEyLCVlc3AKKwlwdXNobCAkNDQKKwljYWxsIG1hbGxvYworCW1vdmwgJWVzaSwlZWR4CisJaW11bGwgLTgoJWVicCksJWVkeAorCW1vdmwgJWVheCwlZWRpCisJbW92bCAlZWR4LC0xMiglZWJwKQorCWxlYWwgKCVlZHgsJWVkeCwyKSwlZWJ4CisJbW92bCAlZWR4LDgoJWVkaSkKKwlhZGRsICQtMTIsJWVzcAorCXNhbGwgJDIsJWVieAorCXB1c2hsICVlYngKKwljYWxsIG1hbGxvYworCWFkZGwgJDMyLCVlc3AKKwltb3ZsICVlYXgsKCVlZGkpCisJYWRkbCAkLTEyLCVlc3AKKwlwdXNobCAlZWJ4CisJY2FsbCBtYWxsb2MKKwltb3ZsICVlYXgsNCglZWRpKQorCW1vdmwgMjQoJWVicCksJWVheAorCW1vdmwgJWVheCwxMiglZWRpKQorCW1vdmwgMjgoJWVicCksJWVheAorCW1vdmwgJWVheCwxNiglZWRpKQorCW1vdmwgMzIoJWVicCksJWVheAorCW1vdmwgJWVheCwyMCglZWRpKQorCW1vdmwgOCglZWJwKSwlZWF4CisJbW92bCAlZWF4LDI4KCVlZGkpCisJbW92bCAlZXNpLDI0KCVlZGkpCisJbW92bCAtOCglZWJwKSwlZWR4CisJbW92bCAxNiglZWJwKSwlZWF4CisJbW92bCAlZWR4LDMyKCVlZGkpCisJbW92bCAlZWF4LDM2KCVlZGkpCisJbW92bCAkMCw0MCglZWRpKQorCXRlc3RsICVlZHgsJWVkeAorCWplIC5MNDgwCisJbW92bCAlZXNpLCVlYXgKKwltb3ZsICVlc2ksLTI4KCVlYnApCisJc2hybCAkMzEsJWVheAorCWFkZGwgJWVheCwlZXNpCisJbW92bCAtOCglZWJwKSwlZWF4CisJc2hybCAkMzEsJWVheAorCWFkZGwgLTgoJWVicCksJWVheAorCW1vdmwgLTEyKCVlYnApLCVlZHgKKwlzYXJsICQxLCVlYXgKKwltb3ZsICVlZHgsLTI0KCVlYnApCisJbmVnbCAtMjgoJWVicCkKKwltb3ZsICVlc2ksLTE2KCVlYnApCisJbW92bCAlZWF4LC0yMCglZWJwKQorCS5wMmFsaWduIDQsLDcKKy5MNDgxOgorCW1vdmwgLTI4KCVlYnApLCVlYXgKKwlhZGRsICVlYXgsLTI0KCVlYnApCisJZGVjbCAtOCglZWJwKQorCW1vdmwgMTIoJWVicCksJWVzaQorCXRlc3RsICVlc2ksJWVzaQorCWplIC5MNDc5CisJbW92bCAtOCglZWJwKSwlZWF4CisJc3VibCAtMjAoJWVicCksJWVheAorCW1vdmwgJWVheCwtNCglZWJwKQorCWZpbGRsIC00KCVlYnApCisJbW92bCAlZXNpLC00KCVlYnApCisJbW92bCAtMjQoJWVicCksJWVkeAorCWxlYWwgKCVlZHgsJWVzaSksJWVheAorCW1vdmwgLTE2KCVlYnApLCVlYngKKwlmaWxkbCAxNiglZWJwKQorCWxlYWwgKCVlYXgsJWVheCwyKSwlZWF4CisJc2FybCAkMSwlZWJ4CisJbGVhbCAwKCwlZWF4LDQpLCVlY3gKKwlmbXVscCAlc3QsJXN0KDEpCisJZmlsZGwgMjAoJWVicCkKKwlmZGl2cnAgJXN0LCVzdCgxKQorCWZpbGRsIDgoJWVicCkKKwlmaWxkbCAtNCglZWJwKQorCWptcCAuTDQ4NAorLkw0ODc6CisJZnhjaCAlc3QoMikKKwkucDJhbGlnbiA0LCw3CisuTDQ4NDoKKwlkZWNsICVlc2kKKwltb3ZsICVlc2ksJWVheAorCW1vdmwgKCVlZGkpLCVlZHgKKwlzdWJsICVlYngsJWVheAorCW1vdmwgJWVheCwtNCglZWJwKQorCWZpbGRsIC00KCVlYnApCisJYWRkbCAkLTEyLCVlY3gKKwlmbXVsICVzdCgyKSwlc3QKKwlmZGl2ICVzdCgxKSwlc3QKKwlmc3RwcyAoJWVkeCwlZWN4KQorCWZ4Y2ggJXN0KDIpCisJbW92bCAoJWVkaSksJWVheAorCW1vdmwgJDAsNCglZWF4LCVlY3gpCisJbW92bCAoJWVkaSksJWVheAorCWZzdHMgOCglZWF4LCVlY3gpCisJdGVzdGwgJWVzaSwlZXNpCisJam5lIC5MNDg3CisJZnN0cCAlc3QoMCkKKwlmc3RwICVzdCgwKQorCWZzdHAgJXN0KDApCisuTDQ3OToKKwljbXBsICQwLC04KCVlYnApCisJam5lIC5MNDgxCisuTDQ4MDoKKwlsZWFsIC01NiglZWJwKSwlZXNwCisJcG9wbCAlZWJ4CisJbW92bCAlZWRpLCVlYXgKKwlwb3BsICVlc2kKKwlwb3BsICVlZGkKKwlsZWF2ZQorCXJldAorLkxmZTE6CisJLnNpemUJIGdyaWQzZF9uZXcsLkxmZTEtZ3JpZDNkX25ldworLnNlY3Rpb24JLnJvZGF0YQorCS5hbGlnbiA4CisuTEM0ODoKKwkubG9uZyAweDAsMHgzZmUwMDAwMAorCS5hbGlnbiA0CisuTEM0OToKKwkubG9uZyAweDNmMTk5OTlhCisJLmFsaWduIDQKKy5MQzUwOgorCS5sb25nIDB4M2VlM2Q3MGEKKy50ZXh0CisJLmFsaWduIDQKKy5nbG9ibCBncmlkM2RfdXBkYXRlCisJLnR5cGUJIGdyaWQzZF91cGRhdGUsQGZ1bmN0aW9uCitncmlkM2RfdXBkYXRlOgorCXB1c2hsICVlYnAKKwltb3ZsICVlc3AsJWVicAorCXN1YmwgJDMyLCVlc3AKKwlwdXNobCAlZXNpCisJcHVzaGwgJWVieAorCWZsZHMgMTIoJWVicCkKKwltb3ZsIDgoJWVicCksJWVieAorCW1vdmwgMTYoJWVicCksJWVjeAorCWZsZCAlc3QoMCkKKyNBUFAKKwlmc2luCisjTk9fQVBQCisJZnN0cHMgLTQoJWVicCkKKwlmbGRzIC00KCVlYnApCisJZnhjaCAlc3QoMSkKKyNBUFAKKwlmY29zCisjTk9fQVBQCisJZnN0cHMgLTQoJWVicCkKKwlmbGRzIC00KCVlYnApCisJY21wbCAkMCw0MCglZWJ4KQorCWpuZSAuTDUxOQorCXRlc3RsICVlY3gsJWVjeAorCWplIC5MNTIwCisJeG9ybCAlZXNpLCVlc2kKKwljbXBsIDI0KCVlYngpLCVlc2kKKwlqZ2UgLkw1MjAKKwlmbGRsIC5MQzQ4CisJeG9ybCAlZWR4LCVlZHgKKwkucDJhbGlnbiA0LCw3CisuTDUyNDoKKwltb3ZsICglZWJ4KSwlZWF4CisJZmxkICVzdCgwKQorCWZsZCAlc3QoMSkKKwlmeGNoICVzdCgxKQorCWZtdWxzIDQoJWVheCwlZWR4KQorCWZ4Y2ggJXN0KDEpCisJZm11bHMgKCVlY3gsJWVzaSw0KQorCWZhZGRwICVzdCwlc3QoMSkKKwlpbmNsICVlc2kKKwlmc3RwcyA0KCVlYXgsJWVkeCkKKwlhZGRsICQxMiwlZWR4CisJY21wbCAyNCglZWJ4KSwlZXNpCisJamwgLkw1MjQKKwlmc3RwICVzdCgwKQorLkw1MjA6CisJbW92bCAyNCglZWJ4KSwlZXNpCisJY21wbCA4KCVlYngpLCVlc2kKKwlqZ2UgLkw1MTkKKwlsZWFsICglZXNpLCVlc2ksMiksJWVheAorCWZsZHMgLkxDNDkKKwlmbGRzIC5MQzUwCisJbGVhbCAwKCwlZWF4LDQpLCVlY3gKKwkucDJhbGlnbiA0LCw3CisuTDUyOToKKwltb3ZsICglZWJ4KSwlZWF4CisJZmxkcyA0KCVlYXgsJWVjeCkKKwlmbXVsICVzdCgyKSwlc3QKKwlmc3RwcyA0KCVlYXgsJWVjeCkKKwltb3ZsICVlc2ksJWVheAorCXN1YmwgMjQoJWVieCksJWVheAorCW1vdmwgKCVlYngpLCVlZHgKKwlsZWFsICglZWF4LCVlYXgsMiksJWVheAorCWZsZHMgNCglZWR4LCVlYXgsNCkKKwlmbXVsICVzdCgxKSwlc3QKKwlmYWRkcyA0KCVlZHgsJWVjeCkKKwlpbmNsICVlc2kKKwlmc3RwcyA0KCVlZHgsJWVjeCkKKwlhZGRsICQxMiwlZWN4CisJY21wbCA4KCVlYngpLCVlc2kKKwlqbCAuTDUyOQorCWZzdHAgJXN0KDApCisJZnN0cCAlc3QoMCkKKy5MNTE5OgorCXhvcmwgJWVzaSwlZXNpCisJY21wbCA4KCVlYngpLCVlc2kKKwlqZ2UgLkw1MzYKKwl4b3JsICVlY3gsJWVjeAorCS5wMmFsaWduIDQsLDcKKy5MNTM0OgorCW1vdmwgKCVlYngpLCVlYXgKKwlmbGRzICglZWF4LCVlY3gpCisJZmxkcyA4KCVlYXgsJWVjeCkKKwlmbXVsICVzdCgyKSwlc3QKKwlmeGNoICVzdCgxKQorCWZtdWwgJXN0KDMpLCVzdAorCWZzdWJwICVzdCwlc3QoMSkKKwltb3ZsIDQoJWVieCksJWVkeAorCWluY2wgJWVzaQorCWZzdHBzICglZWR4LCVlY3gpCisJbW92bCAoJWVieCksJWVheAorCWZsZHMgKCVlYXgsJWVjeCkKKwlmbGRzIDgoJWVheCwlZWN4KQorCWZ4Y2ggJXN0KDEpCisJZm11bCAlc3QoMiksJXN0CisJZnhjaCAlc3QoMSkKKwlmbXVsICVzdCgzKSwlc3QKKwlmYWRkcCAlc3QsJXN0KDEpCisJbW92bCA0KCVlYngpLCVlZHgKKwlmc3RwcyA4KCVlZHgsJWVjeCkKKwltb3ZsICglZWJ4KSwlZWF4CisJZmxkcyA0KCVlYXgsJWVjeCkKKwltb3ZsIDQoJWVieCksJWVkeAorCWZzdHBzIDQoJWVkeCwlZWN4KQorCW1vdmwgNCglZWJ4KSwlZWF4CisJZmxkcyAoJWVheCwlZWN4KQorCWZhZGRzIDEyKCVlYngpCisJZnN0cHMgKCVlYXgsJWVjeCkKKwltb3ZsIDQoJWVieCksJWVheAorCWZsZHMgNCglZWF4LCVlY3gpCisJZmFkZHMgMTYoJWVieCkKKwlmc3RwcyA0KCVlYXgsJWVjeCkKKwltb3ZsIDQoJWVieCksJWVheAorCWZsZHMgOCglZWF4LCVlY3gpCisJZmFkZHMgMjAoJWVieCkKKwlmc3RwcyA4KCVlYXgsJWVjeCkKKwlhZGRsICQxMiwlZWN4CisJY21wbCA4KCVlYngpLCVlc2kKKwlqbCAuTDUzNAorLkw1MzY6CisJZnN0cCAlc3QoMCkKKwlmc3RwICVzdCgwKQorCXBvcGwgJWVieAorCXBvcGwgJWVzaQorCWxlYXZlCisJcmV0CisuTGZlMjoKKwkuc2l6ZQkgZ3JpZDNkX3VwZGF0ZSwuTGZlMi1ncmlkM2RfdXBkYXRlCisuc2VjdGlvbgkucm9kYXRhCisJLmFsaWduIDQKKy5MQzUxOgorCS5sb25nIDB4NDAwMDAwMDAKKwkuYWxpZ24gOAorLkxDNTI6CisJLmxvbmcgMHgwLDB4NDIzODAwMDAKKy50ZXh0CisJLmFsaWduIDQKKy5nbG9ibCBzdXJmM2RfZHJhdworCS50eXBlCSBzdXJmM2RfZHJhdyxAZnVuY3Rpb24KK3N1cmYzZF9kcmF3OgorCXB1c2hsICVlYnAKKwltb3ZsICVlc3AsJWVicAorCXN1YmwgJDYwLCVlc3AKKwlwdXNobCAlZWRpCisJcHVzaGwgJWVzaQorCXB1c2hsICVlYngKKwltb3ZsICQwLC0yMCglZWJwKQorCW1vdmwgLTIwKCVlYnApLCVlZHgKKwltb3ZsIDgoJWVicCksJWVheAorCWNtcGwgOCglZWF4KSwlZWR4CisJamdlIC5MNDkzCisJZmxkbCAuTEM1MgorCWZsZHMgLkxDNTEKKwl4b3JsICVlZGksJWVkaQorCS5wMmFsaWduIDQsLDcKKy5MNDk1OgorCW1vdmwgOCglZWJwKSwlZWF4CisJbW92bCA0KCVlYXgpLCVlYXgKKwltb3ZsICVlYXgsLTM2KCVlYnApCisJZmNvbXMgOCglZWF4LCVlZGkpCisJZm5zdHN3ICVheAorCWFuZGIgJDY5LCVhaAorCWNtcGIgJDEsJWFoCisJam5lIC5MNDk2CisJZmlsZGwgMTYoJWVicCkKKwltb3ZsIC0zNiglZWJwKSwlZWR4CisJZmxkICVzdCgwKQorCWZtdWxzICglZWR4LCVlZGkpCisJZmRpdnMgOCglZWR4LCVlZGkpCisJZmxkICVzdCgzKQorCWZhZGRwICVzdCwlc3QoMSkKKwlmc3RwbCAtMzIoJWVicCkKKwltb3ZsIC0zMiglZWJwKSwlZWF4CisJbW92bCAtMjgoJWVicCksJWVkeAorCW1vdmwgJWVheCwtNDAoJWVicCkKKwlzYXJsICQxNiwtNDAoJWVicCkKKwltb3ZsIC0zNiglZWJwKSwlZWR4CisJZm11bHMgNCglZWR4LCVlZGkpCisJZmRpdnMgOCglZWR4LCVlZGkpCisJbW92bCAtNDAoJWVicCksJWVjeAorCWZsZCAlc3QoMikKKwlmYWRkcCAlc3QsJXN0KDEpCisJZnN0cGwgLTMyKCVlYnApCisJbW92bCAtMzIoJWVicCksJWVheAorCW1vdmwgLTI4KCVlYnApLCVlZHgKKwltb3ZsICVlYXgsLTQ0KCVlYnApCisJbW92bCAyOCglZWJwKSwlZWF4CisJc2FybCAkMSwlZWF4CisJYWRkbCAlZWF4LCVlY3gKKwltb3ZsIDMyKCVlYnApLCVlYXgKKwlzYXJsICQxNiwtNDQoJWVicCkKKwlzYXJsICQxLCVlYXgKKwltb3ZsICVlY3gsJWVieAorCXN1YmwgLTQ0KCVlYnApLCVlYXgKKwltb3ZsICVlYXgsJWVzaQorCWNtcGwgMjgoJWVicCksJWVieAorCWpnZSAuTDQ5NgorCXRlc3RsICVlY3gsJWVjeAorCWpsIC5MNDk2CisJY21wbCAzMiglZWJwKSwlZXNpCisJamdlIC5MNDk2CisJdGVzdGwgJWVheCwlZWF4CisJamdlIC5MNDk5CisuTDQ5NjoKKwl4b3JsICVlc2ksJWVzaQorCXhvcmwgJWVieCwlZWJ4CisuTDQ5OToKKwltb3ZsIDIwKCVlYnApLCVlYXgKKwltb3ZsICVlYngsJWVkeAorCWxlYWwgKCVlYXgsJWVkeCw0KSwlZWR4CisJbW92bCAyOCglZWJwKSwlZWF4CisJaW11bGwgJWVzaSwlZWF4CisJbGVhbCAoJWVkeCwlZWF4LDQpLCVlYXgKKwl0ZXN0bCAlZWJ4LCVlYngKKwlqZSAuTDQ5NAorCXRlc3RsICVlc2ksJWVzaQorCWplIC5MNDk0CisjQVBQCisJbW92ZCAoJWVheCksICVtbTAKKwlwYWRkdXNiIDEyKCVlYnApLCAlbW0wCisJbW92ZCAlbW0wLCAoJWVheCkKKyNOT19BUFAKKy5MNDk0OgorCWluY2wgLTIwKCVlYnApCisJYWRkbCAkMTIsJWVkaQorCW1vdmwgLTIwKCVlYnApLCVlYXgKKwltb3ZsIDgoJWVicCksJWVkeAorCWNtcGwgOCglZWR4KSwlZWF4CisJamwgLkw0OTUKKwlmc3RwICVzdCgwKQorCWZzdHAgJXN0KDApCisuTDQ5MzoKKwlwb3BsICVlYngKKwlwb3BsICVlc2kKKwlwb3BsICVlZGkKKwlsZWF2ZQorCXJldAorLkxmZTM6CisJLnNpemUJIHN1cmYzZF9kcmF3LC5MZmUzLXN1cmYzZF9kcmF3CisJLmFsaWduIDQKKy5nbG9ibCBzdXJmM2Rfcm90YXRlCisJLnR5cGUJIHN1cmYzZF9yb3RhdGUsQGZ1bmN0aW9uCitzdXJmM2Rfcm90YXRlOgorCXB1c2hsICVlYnAKKwltb3ZsICVlc3AsJWVicAorCXN1YmwgJDMyLCVlc3AKKwlwdXNobCAlZXNpCisJcHVzaGwgJWVieAorCWZsZHMgMTIoJWVicCkKKwltb3ZsIDgoJWVicCksJWVieAorCWZsZCAlc3QoMCkKKyNBUFAKKwlmc2luCisjTk9fQVBQCisJZnN0cHMgLTQoJWVicCkKKwlmbGRzIC00KCVlYnApCisJZnhjaCAlc3QoMSkKKyNBUFAKKwlmY29zCisjTk9fQVBQCisJZnN0cHMgLTQoJWVicCkKKwl4b3JsICVlc2ksJWVzaQorCWZsZHMgLTQoJWVicCkKKwljbXBsIDgoJWVieCksJWVzaQorCWpnZSAuTDUzNworCXhvcmwgJWVjeCwlZWN4CisJLnAyYWxpZ24gNCwsNworLkw1MDg6CisJbW92bCAoJWVieCksJWVheAorCWZsZHMgKCVlYXgsJWVjeCkKKwlmbGRzIDgoJWVheCwlZWN4KQorCWZtdWwgJXN0KDIpLCVzdAorCWZ4Y2ggJXN0KDEpCisJZm11bCAlc3QoMyksJXN0CisJZnN1YnAgJXN0LCVzdCgxKQorCW1vdmwgNCglZWJ4KSwlZWR4CisJaW5jbCAlZXNpCisJZnN0cHMgKCVlZHgsJWVjeCkKKwltb3ZsICglZWJ4KSwlZWF4CisJZmxkcyAoJWVheCwlZWN4KQorCWZsZHMgOCglZWF4LCVlY3gpCisJZnhjaCAlc3QoMSkKKwlmbXVsICVzdCgyKSwlc3QKKwlmeGNoICVzdCgxKQorCWZtdWwgJXN0KDMpLCVzdAorCWZhZGRwICVzdCwlc3QoMSkKKwltb3ZsIDQoJWVieCksJWVkeAorCWZzdHBzIDgoJWVkeCwlZWN4KQorCW1vdmwgKCVlYngpLCVlYXgKKwlmbGRzIDQoJWVheCwlZWN4KQorCW1vdmwgNCglZWJ4KSwlZWR4CisJZnN0cHMgNCglZWR4LCVlY3gpCisJYWRkbCAkMTIsJWVjeAorCWNtcGwgOCglZWJ4KSwlZXNpCisJamwgLkw1MDgKKy5MNTM3OgorCWZzdHAgJXN0KDApCisJZnN0cCAlc3QoMCkKKwlwb3BsICVlYngKKwlwb3BsICVlc2kKKwlsZWF2ZQorCXJldAorLkxmZTQ6CisJLnNpemUJIHN1cmYzZF9yb3RhdGUsLkxmZTQtc3VyZjNkX3JvdGF0ZQorCS5hbGlnbiA0CisuZ2xvYmwgc3VyZjNkX3RyYW5zbGF0ZQorCS50eXBlCSBzdXJmM2RfdHJhbnNsYXRlLEBmdW5jdGlvbgorc3VyZjNkX3RyYW5zbGF0ZToKKwlwdXNobCAlZWJwCisJbW92bCAlZXNwLCVlYnAKKwlwdXNobCAlZWJ4CisJbW92bCA4KCVlYnApLCVlY3gKKwl4b3JsICVlYngsJWVieAorCWNtcGwgOCglZWN4KSwlZWJ4CisJamdlIC5MNTEyCisJeG9ybCAlZWR4LCVlZHgKKwkucDJhbGlnbiA0LCw3CisuTDUxNDoKKwltb3ZsIDQoJWVjeCksJWVheAorCWZsZHMgKCVlYXgsJWVkeCkKKwlmYWRkcyAxMiglZWN4KQorCWluY2wgJWVieAorCWZzdHBzICglZWF4LCVlZHgpCisJbW92bCA0KCVlY3gpLCVlYXgKKwlmbGRzIDQoJWVheCwlZWR4KQorCWZhZGRzIDE2KCVlY3gpCisJZnN0cHMgNCglZWF4LCVlZHgpCisJbW92bCA0KCVlY3gpLCVlYXgKKwlmbGRzIDgoJWVheCwlZWR4KQorCWZhZGRzIDIwKCVlY3gpCisJZnN0cHMgOCglZWF4LCVlZHgpCisJYWRkbCAkMTIsJWVkeAorCWNtcGwgOCglZWN4KSwlZWJ4CisJamwgLkw1MTQKKy5MNTEyOgorCXBvcGwgJWVieAorCWxlYXZlCisJcmV0CisuTGZlNToKKwkuc2l6ZQkgc3VyZjNkX3RyYW5zbGF0ZSwuTGZlNS1zdXJmM2RfdHJhbnNsYXRlCisJLmlkZW50CSJHQ0M6IChHTlUpIDIuOTUuMyAxOTk5MTAzMCAocHJlcmVsZWFzZSkiCmRpZmYgLS1naXQgYS9nc3QvZ29vbS90ZW50YWNsZTNkLmMgYi9nc3QvZ29vbS90ZW50YWNsZTNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyZmZiYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL3RlbnRhY2xlM2QuYwpAQCAtMCwwICsxLDM1OCBAQAorLyogR29vbSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBpT1MtU29mdHdhcmUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAidjNkLmgiCisjaW5jbHVkZSAic3VyZjNkLmgiCisjaW5jbHVkZSAiZ29vbV90b29scy5oIgorI2luY2x1ZGUgImdvb21fY29uZmlnLmgiCisjaW5jbHVkZSAiZ29vbV9wbHVnaW5faW5mby5oIgorI2luY2x1ZGUgInRlbnRhY2xlM2QuaCIKKworI2RlZmluZSBEIDI1Ni4wZgorCisjZGVmaW5lIG5iZ3JpZCA2CisjZGVmaW5lIGRlZmluaXRpb254IDE1CisjZGVmaW5lIGRlZmluaXRpb256IDQ1CisKK3R5cGVkZWYgc3RydWN0IF9URU5UQUNMRV9GWF9EQVRBCit7CisgIFBsdWdpblBhcmFtIGVuYWJsZWRfYnA7CisgIFBsdWdpblBhcmFtZXRlcnMgcGFyYW1zOworCisgIGZsb2F0IGN5Y2xlOworICBncmlkM2QgKmdyaWxsZVtuYmdyaWRdOworICBmbG9hdCAqdmFsczsKKworI2RlZmluZSBOQl9URU5UQUNMRV9DT0xPUlMgNAorICBpbnQgY29sb3JzW05CX1RFTlRBQ0xFX0NPTE9SU107CisKKyAgaW50IGNvbDsKKyAgaW50IGRzdGNvbDsKKyAgZmxvYXQgbGlnOworICBmbG9hdCBsaWdzOworCisgIC8qIHN0YXRpY3MgZnJvbSBwcmV0dHlfbW92ZSAqLworICBmbG9hdCBkaXN0dDsKKyAgZmxvYXQgZGlzdHQyOworICBmbG9hdCByb3Q7ICAgICAgICAgICAgICAgICAgICAvKiBlbnRyZSAwIGV0IDIgKiBHX1BJICovCisgIGludCBoYXBwZW5zOworICBpbnQgcm90YXRpb247CisgIGludCBsb2NrOworfSBUZW50YWNsZUZYRGF0YTsKKworc3RhdGljIHZvaWQgdGVudGFjbGVfbmV3IChUZW50YWNsZUZYRGF0YSAqIGRhdGEpOworc3RhdGljIHZvaWQgdGVudGFjbGVfdXBkYXRlIChQbHVnaW5JbmZvICogZ29vbUluZm8sIFBpeGVsICogYnVmLCBQaXhlbCAqIGJhY2ssCisgICAgaW50IFcsIGludCBILCBzaG9ydFsyXVs1MTJdLCBmbG9hdCwgaW50IGRyYXdpdCwgVGVudGFjbGVGWERhdGEgKiBkYXRhKTsKK3N0YXRpYyB2b2lkIHRlbnRhY2xlX2ZyZWUgKFRlbnRhY2xlRlhEYXRhICogZGF0YSk7CisKKy8qIAorICogVmlzdWFsRlggd3JhcHBlciBmb3IgdGhlIHRlbnRhY2xlcworICovCisKK3N0YXRpYyB2b2lkCit0ZW50YWNsZV9meF9pbml0IChWaXN1YWxGWCAqIF90aGlzLCBQbHVnaW5JbmZvICogaW5mbykKK3sKKworICBUZW50YWNsZUZYRGF0YSAqZGF0YSA9IChUZW50YWNsZUZYRGF0YSAqKSBtYWxsb2MgKHNpemVvZiAoVGVudGFjbGVGWERhdGEpKTsKKworICBzZWN1cmVfYl9wYXJhbSAoJmRhdGEtPmVuYWJsZWRfYnAsICJFbmFibGVkIiwgMSk7CisgIHBsdWdpbl9wYXJhbWV0ZXJzICgmZGF0YS0+cGFyYW1zLCAiM0QgVGVudGFjbGVzIiwgMSk7CisgIGRhdGEtPnBhcmFtcy5wYXJhbXNbMF0gPSAmZGF0YS0+ZW5hYmxlZF9icDsKKworICBkYXRhLT5jeWNsZSA9IDAuMGY7CisgIGRhdGEtPmNvbCA9CisgICAgICAoMHgyOCA8PCAoUk9VR0UgKiA4KSkgfCAoMHgyYyA8PCAoVkVSVCAqIDgpKSB8ICgweDVmIDw8IChCTEVVICogOCkpOworICBkYXRhLT5kc3Rjb2wgPSAwOworICBkYXRhLT5saWcgPSAxLjE1ZjsKKyAgZGF0YS0+bGlncyA9IDAuMWY7CisKKyAgZGF0YS0+ZGlzdHQgPSAxMC4wZjsKKyAgZGF0YS0+ZGlzdHQyID0gMC4wZjsKKyAgZGF0YS0+cm90ID0gMC4wZjsgICAgICAgICAgICAgLyogZW50cmUgMCBldCAyICogR19QSSAqLworICBkYXRhLT5oYXBwZW5zID0gMDsKKworICBkYXRhLT5yb3RhdGlvbiA9IDA7CisgIGRhdGEtPmxvY2sgPSAwOworICBkYXRhLT5jb2xvcnNbMF0gPQorICAgICAgKDB4MTggPDwgKFJPVUdFICogOCkpIHwgKDB4NGMgPDwgKFZFUlQgKiA4KSkgfCAoMHgyZiA8PCAoQkxFVSAqIDgpKTsKKyAgZGF0YS0+Y29sb3JzWzFdID0KKyAgICAgICgweDQ4IDw8IChST1VHRSAqIDgpKSB8ICgweDJjIDw8IChWRVJUICogOCkpIHwgKDB4NmYgPDwgKEJMRVUgKiA4KSk7CisgIGRhdGEtPmNvbG9yc1syXSA9CisgICAgICAoMHg1OCA8PCAoUk9VR0UgKiA4KSkgfCAoMHgzYyA8PCAoVkVSVCAqIDgpKSB8ICgweDBmIDw8IChCTEVVICogOCkpOworICBkYXRhLT5jb2xvcnNbM10gPQorICAgICAgKDB4ODcgPDwgKFJPVUdFICogOCkpIHwgKDB4NTUgPDwgKFZFUlQgKiA4KSkgfCAoMHg3NCA8PCAoQkxFVSAqIDgpKTsKKyAgdGVudGFjbGVfbmV3IChkYXRhKTsKKworICBfdGhpcy0+cGFyYW1zID0gJmRhdGEtPnBhcmFtczsKKyAgX3RoaXMtPmZ4X2RhdGEgPSAodm9pZCAqKSBkYXRhOworfQorCitzdGF0aWMgdm9pZAordGVudGFjbGVfZnhfYXBwbHkgKFZpc3VhbEZYICogX3RoaXMsIFBpeGVsICogc3JjLCBQaXhlbCAqIGRlc3QsCisgICAgUGx1Z2luSW5mbyAqIGdvb21JbmZvKQoreworICBUZW50YWNsZUZYRGF0YSAqZGF0YSA9IChUZW50YWNsZUZYRGF0YSAqKSBfdGhpcy0+ZnhfZGF0YTsKKworICBpZiAoQlZBTCAoZGF0YS0+ZW5hYmxlZF9icCkpIHsKKyAgICB0ZW50YWNsZV91cGRhdGUgKGdvb21JbmZvLCBkZXN0LCBzcmMsIGdvb21JbmZvLT5zY3JlZW4ud2lkdGgsCisgICAgICAgIGdvb21JbmZvLT5zY3JlZW4uaGVpZ2h0LCBnb29tSW5mby0+c291bmQuc2FtcGxlcywKKyAgICAgICAgKGZsb2F0KSBnb29tSW5mby0+c291bmQuYWNjZWx2YXIsCisgICAgICAgIGdvb21JbmZvLT5jdXJHU3RhdGUtPmRyYXdUZW50YWNsZSwgZGF0YSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RlbnRhY2xlX2Z4X2ZyZWUgKFZpc3VhbEZYICogX3RoaXMpCit7CisgIHRlbnRhY2xlX2ZyZWUgKChUZW50YWNsZUZYRGF0YSAqKSBfdGhpcy0+ZnhfZGF0YSk7CisgIGZyZWUgKF90aGlzLT5meF9kYXRhKTsKK30KKwordm9pZAordGVudGFjbGVfZnhfY3JlYXRlIChWaXN1YWxGWCAqIGZ4KQoreworICBmeC0+aW5pdCA9IHRlbnRhY2xlX2Z4X2luaXQ7CisgIGZ4LT5hcHBseSA9IHRlbnRhY2xlX2Z4X2FwcGx5OworICBmeC0+ZnJlZSA9IHRlbnRhY2xlX2Z4X2ZyZWU7CisgIGZ4LT5meF9kYXRhID0gTlVMTDsKKyAgZngtPnBhcmFtcyA9IE5VTEw7Cit9CisKKy8qIC0tLS0tICovCisKK3N0YXRpYyB2b2lkCit0ZW50YWNsZV9mcmVlIChUZW50YWNsZUZYRGF0YSAqIGRhdGEpCit7CisgIGludCB0bXA7CisKKyAgLyogRlJFRSBHUklEICovCisgIGZvciAodG1wID0gMDsgdG1wIDwgbmJncmlkOyB0bXArKykKKyAgICBncmlkM2RfZnJlZSAoZGF0YS0+Z3JpbGxlW3RtcF0pOworICBmcmVlIChkYXRhLT52YWxzKTsKKworICBnb29tX3BsdWdpbl9wYXJhbWV0ZXJzX2ZyZWUgKCZkYXRhLT5wYXJhbXMpOworfQorCitzdGF0aWMgdm9pZAordGVudGFjbGVfbmV3IChUZW50YWNsZUZYRGF0YSAqIGRhdGEpCit7CisgIGludCB0bXA7CisKKyAgdjNkIGNlbnRlciA9IHsgMCwgLTE3LjAsIDAgfTsKKyAgZGF0YS0+dmFscyA9IChmbG9hdCAqKSBtYWxsb2MgKChkZWZpbml0aW9ueCArIDIwKSAqIHNpemVvZiAoZmxvYXQpKTsKKworICBmb3IgKHRtcCA9IDA7IHRtcCA8IG5iZ3JpZDsgdG1wKyspIHsKKyAgICBpbnQgeCwgejsKKworICAgIHogPSA0NSArIHJhbmQgKCkgJSAzMDsKKyAgICB4ID0gODUgKyByYW5kICgpICUgNTsKKyAgICBjZW50ZXIueiA9IHo7CisgICAgZGF0YS0+Z3JpbGxlW3RtcF0gPQorICAgICAgICBncmlkM2RfbmV3ICh4LCBkZWZpbml0aW9ueCwgeiwgZGVmaW5pdGlvbnogKyByYW5kICgpICUgMTAsIGNlbnRlcik7CisgICAgY2VudGVyLnkgKz0gODsKKyAgfQorfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIKK2xpZ2h0ZW4gKHVuc2lnbmVkIGNoYXIgdmFsdWUsIGZsb2F0IHBvd2VyKQoreworICBpbnQgdmFsID0gdmFsdWU7CisgIGZsb2F0IHQgPSAoZmxvYXQpIHZhbCAqIGxvZzEwIChwb3dlcikgLyAyLjA7CisKKyAgaWYgKHQgPiAwKSB7CisgICAgdmFsID0gKGludCkgdDsgICAgICAgICAgICAgIC8qICgzMi4wZiAqIGxvZyAodCkpOyAqLworICAgIGlmICh2YWwgPiAyNTUpCisgICAgICB2YWwgPSAyNTU7CisgICAgaWYgKHZhbCA8IDApCisgICAgICB2YWwgPSAwOworICAgIHJldHVybiB2YWw7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2xpZ2h0ZW5jb2xvciAoaW50ICpjb2wsIGZsb2F0IHBvd2VyKQoreworICB1bnNpZ25lZCBjaGFyICpjb2xvcjsKKworICBjb2xvciA9ICh1bnNpZ25lZCBjaGFyICopIGNvbDsKKyAgKmNvbG9yID0gbGlnaHRlbiAoKmNvbG9yLCBwb3dlcik7CisgIGNvbG9yKys7CisgICpjb2xvciA9IGxpZ2h0ZW4gKCpjb2xvciwgcG93ZXIpOworICBjb2xvcisrOworICAqY29sb3IgPSBsaWdodGVuICgqY29sb3IsIHBvd2VyKTsKKyAgY29sb3IrKzsKKyAgKmNvbG9yID0gbGlnaHRlbiAoKmNvbG9yLCBwb3dlcik7Cit9CisKKy8qIHJldG91cm5lIHg+PnMgLCBlbiB0ZXN0YW50IGxlIHNpZ25lIGRlIHggKi8KKyNkZWZpbmUgU2hpZnRSaWdodChfeCxfcykgKChfeDwwKSA/IC0oLV94Pj5fcykgOiAoX3g+Pl9zKSkKKworc3RhdGljIGludAorZXZvbHV0ZWNvbG9yICh1bnNpZ25lZCBpbnQgc3JjLCB1bnNpZ25lZCBpbnQgZGVzdCwKKyAgICB1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGluY3IpCit7CisKKyAgaW50IGNvbG9yID0gc3JjICYgKH5tYXNrKTsKKworICBzcmMgJj0gbWFzazsKKyAgZGVzdCAmPSBtYXNrOworCisgIGlmICgoc3JjICE9IG1hc2spCisgICAgICAmJiAoc3JjIDwgZGVzdCkpCisgICAgc3JjICs9IGluY3I7CisKKyAgaWYgKHNyYyA+IGRlc3QpCisgICAgc3JjIC09IGluY3I7CisgIHJldHVybiAoc3JjICYgbWFzaykgfCBjb2xvcjsKK30KKworc3RhdGljIHZvaWQKK3ByZXR0eV9tb3ZlIChQbHVnaW5JbmZvICogZ29vbUluZm8sIGZsb2F0IGN5Y2xlLCBmbG9hdCAqZGlzdCwgZmxvYXQgKmRpc3QyLAorICAgIGZsb2F0ICpyb3RhbmdsZSwgVGVudGFjbGVGWERhdGEgKiBmeF9kYXRhKQoreworCisgIGZsb2F0IHRtcDsKKworICAvKiBtYW55IG1hZ2ljIG51bWJlcnMgaGVyZS4uLiBJIGRvbid0IHJlYWxseSBsaWtlIHRoYXQuICovCisgIGlmIChmeF9kYXRhLT5oYXBwZW5zKQorICAgIGZ4X2RhdGEtPmhhcHBlbnMgLT0gMTsKKyAgZWxzZSBpZiAoZnhfZGF0YS0+bG9jayA9PSAwKSB7CisgICAgZnhfZGF0YS0+aGFwcGVucyA9CisgICAgICAgIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLAorICAgICAgICAyMDApID8gMCA6IDEwMCArIGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCA2MCk7CisgICAgZnhfZGF0YS0+bG9jayA9IGZ4X2RhdGEtPmhhcHBlbnMgKiAzIC8gMjsKKyAgfSBlbHNlCisgICAgZnhfZGF0YS0+bG9jay0tOworCisgIHRtcCA9IGZ4X2RhdGEtPmhhcHBlbnMgPyA4LjBmIDogMDsKKyAgKmRpc3QyID0gZnhfZGF0YS0+ZGlzdHQyID0gKHRtcCArIDE1LjBmICogZnhfZGF0YS0+ZGlzdHQyKSAvIDE2LjBmOworCisgIHRtcCA9IDMwICsgRCAtIDkwLjBmICogKDEuMGYgKyBzaW4gKGN5Y2xlICogMTkgLyAyMCkpOworICBpZiAoZnhfZGF0YS0+aGFwcGVucykKKyAgICB0bXAgKj0gMC42ZjsKKworICAqZGlzdCA9IGZ4X2RhdGEtPmRpc3R0ID0gKHRtcCArIDMuMGYgKiBmeF9kYXRhLT5kaXN0dCkgLyA0LjBmOworCisgIGlmICghZnhfZGF0YS0+aGFwcGVucykgeworICAgIHRtcCA9IEdfUEkgKiBzaW4gKGN5Y2xlKSAvIDMyICsgMyAqIEdfUEkgLyAyOworICB9IGVsc2UgeworICAgIGZ4X2RhdGEtPnJvdGF0aW9uID0KKyAgICAgICAgZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sCisgICAgICAgIDUwMCkgPyBmeF9kYXRhLT5yb3RhdGlvbiA6IGdvb21faXJhbmQgKGdvb21JbmZvLT5nUmFuZG9tLCAyKTsKKyAgICBpZiAoZnhfZGF0YS0+cm90YXRpb24pCisgICAgICBjeWNsZSAqPSAyLjBmICogR19QSTsKKyAgICBlbHNlCisgICAgICBjeWNsZSAqPSAtMS4wZiAqIEdfUEk7CisgICAgdG1wID0gY3ljbGUgLSAoR19QSSAqIDIuMCkgKiBmbG9vciAoY3ljbGUgLyAoR19QSSAqIDIuMCkpOworICB9CisKKyAgaWYgKGZhYnMgKHRtcCAtIGZ4X2RhdGEtPnJvdCkgPiBmYWJzICh0bXAgLSAoZnhfZGF0YS0+cm90ICsgMi4wICogR19QSSkpKSB7CisgICAgZnhfZGF0YS0+cm90ID0gKHRtcCArIDE1LjBmICogKGZ4X2RhdGEtPnJvdCArIDIgKiBHX1BJKSkgLyAxNi4wZjsKKyAgICBpZiAoZnhfZGF0YS0+cm90ID4gMi4wICogR19QSSkKKyAgICAgIGZ4X2RhdGEtPnJvdCAtPSAyLjAgKiBHX1BJOworICAgICpyb3RhbmdsZSA9IGZ4X2RhdGEtPnJvdDsKKyAgfSBlbHNlIGlmIChmYWJzICh0bXAgLSBmeF9kYXRhLT5yb3QpID4KKyAgICAgIGZhYnMgKHRtcCAtIChmeF9kYXRhLT5yb3QgLSAyLjAgKiBHX1BJKSkpIHsKKyAgICBmeF9kYXRhLT5yb3QgPSAodG1wICsgMTUuMGYgKiAoZnhfZGF0YS0+cm90IC0gMi4wICogR19QSSkpIC8gMTYuMGY7CisgICAgaWYgKGZ4X2RhdGEtPnJvdCA8IDAuMGYpCisgICAgICBmeF9kYXRhLT5yb3QgKz0gMi4wICogR19QSTsKKyAgICAqcm90YW5nbGUgPSBmeF9kYXRhLT5yb3Q7CisgIH0gZWxzZQorICAgICpyb3RhbmdsZSA9IGZ4X2RhdGEtPnJvdCA9ICh0bXAgKyAxNS4wZiAqIGZ4X2RhdGEtPnJvdCkgLyAxNi4wZjsKK30KKworc3RhdGljIHZvaWQKK3RlbnRhY2xlX3VwZGF0ZSAoUGx1Z2luSW5mbyAqIGdvb21JbmZvLCBQaXhlbCAqIGJ1ZiwgUGl4ZWwgKiBiYWNrLCBpbnQgVywgaW50IEgsCisgICAgc2hvcnQgZGF0YVsyXVs1MTJdLCBmbG9hdCByYXBwb3J0LCBpbnQgZHJhd2l0LCBUZW50YWNsZUZYRGF0YSAqIGZ4X2RhdGEpCit7CisKKyAgaW50IHRtcDsKKyAgaW50IHRtcDI7CisKKyAgaW50IGNvbG9yOworICBpbnQgY29sb3Jsb3c7CisKKyAgZmxvYXQgZGlzdCwgZGlzdDIsIHJvdGFuZ2xlOworCisgIGlmICgoIWRyYXdpdCkgJiYgKGZ4X2RhdGEtPmxpZ3MgPiAwLjBmKSkKKyAgICBmeF9kYXRhLT5saWdzID0gLWZ4X2RhdGEtPmxpZ3M7CisKKyAgZnhfZGF0YS0+bGlnICs9IGZ4X2RhdGEtPmxpZ3M7CisKKyAgaWYgKGZ4X2RhdGEtPmxpZyA+IDEuMDFmKSB7CisgICAgaWYgKChmeF9kYXRhLT5saWcgPiAxMC4wZikgfCAoZnhfZGF0YS0+bGlnIDwgMS4xZikpCisgICAgICBmeF9kYXRhLT5saWdzID0gLWZ4X2RhdGEtPmxpZ3M7CisKKyAgICBpZiAoKGZ4X2RhdGEtPmxpZyA8IDYuM2YpICYmIChnb29tX2lyYW5kIChnb29tSW5mby0+Z1JhbmRvbSwgMzApID09IDApKQorICAgICAgZnhfZGF0YS0+ZHN0Y29sID0gZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIE5CX1RFTlRBQ0xFX0NPTE9SUyk7CisKKyAgICBmeF9kYXRhLT5jb2wgPQorICAgICAgICBldm9sdXRlY29sb3IgKGZ4X2RhdGEtPmNvbCwgZnhfZGF0YS0+Y29sb3JzW2Z4X2RhdGEtPmRzdGNvbF0sIDB4ZmYsCisgICAgICAgIDB4MDEpOworICAgIGZ4X2RhdGEtPmNvbCA9CisgICAgICAgIGV2b2x1dGVjb2xvciAoZnhfZGF0YS0+Y29sLCBmeF9kYXRhLT5jb2xvcnNbZnhfZGF0YS0+ZHN0Y29sXSwgMHhmZjAwLAorICAgICAgICAweDAxMDApOworICAgIGZ4X2RhdGEtPmNvbCA9CisgICAgICAgIGV2b2x1dGVjb2xvciAoZnhfZGF0YS0+Y29sLCBmeF9kYXRhLT5jb2xvcnNbZnhfZGF0YS0+ZHN0Y29sXSwgMHhmZjAwMDAsCisgICAgICAgIDB4MDEwMDAwKTsKKyAgICBmeF9kYXRhLT5jb2wgPQorICAgICAgICBldm9sdXRlY29sb3IgKGZ4X2RhdGEtPmNvbCwgZnhfZGF0YS0+Y29sb3JzW2Z4X2RhdGEtPmRzdGNvbF0sCisgICAgICAgIDB4ZmYwMDAwMDAsIDB4MDEwMDAwMDApOworCisgICAgY29sb3IgPSBmeF9kYXRhLT5jb2w7CisgICAgY29sb3Jsb3cgPSBmeF9kYXRhLT5jb2w7CisKKyAgICBsaWdodGVuY29sb3IgKCZjb2xvciwgZnhfZGF0YS0+bGlnICogMi4wZiArIDIuMGYpOworICAgIGxpZ2h0ZW5jb2xvciAoJmNvbG9ybG93LCAoZnhfZGF0YS0+bGlnIC8gMy4wZikgKyAwLjY3Zik7CisKKyAgICByYXBwb3J0ID0gMS4wZiArIDIuMGYgKiAocmFwcG9ydCAtIDEuMGYpOworICAgIHJhcHBvcnQgKj0gMS4yZjsKKyAgICBpZiAocmFwcG9ydCA+IDEuMTJmKQorICAgICAgcmFwcG9ydCA9IDEuMTJmOworCisgICAgcHJldHR5X21vdmUgKGdvb21JbmZvLCBmeF9kYXRhLT5jeWNsZSwgJmRpc3QsICZkaXN0MiwgJnJvdGFuZ2xlLCBmeF9kYXRhKTsKKworICAgIGZvciAodG1wID0gMDsgdG1wIDwgbmJncmlkOyB0bXArKykgeworICAgICAgZm9yICh0bXAyID0gMDsgdG1wMiA8IGRlZmluaXRpb254OyB0bXAyKyspIHsKKyAgICAgICAgZmxvYXQgdmFsID0KKyAgICAgICAgICAgIChmbG9hdCkgKFNoaWZ0UmlnaHQgKGRhdGFbMF1bZ29vbV9pcmFuZCAoZ29vbUluZm8tPmdSYW5kb20sIDUxMSldLAorICAgICAgICAgICAgICAgIDEwKSkgKiByYXBwb3J0OworCisgICAgICAgIGZ4X2RhdGEtPnZhbHNbdG1wMl0gPSB2YWw7CisgICAgICB9CisKKyAgICAgIGdyaWQzZF91cGRhdGUgKGZ4X2RhdGEtPmdyaWxsZVt0bXBdLCByb3RhbmdsZSwgZnhfZGF0YS0+dmFscywgZGlzdDIpOworICAgIH0KKyAgICBmeF9kYXRhLT5jeWNsZSArPSAwLjAxZjsKKyAgICBmb3IgKHRtcCA9IDA7IHRtcCA8IG5iZ3JpZDsgdG1wKyspCisgICAgICBncmlkM2RfZHJhdyAoZ29vbUluZm8sIGZ4X2RhdGEtPmdyaWxsZVt0bXBdLCBjb2xvciwgY29sb3Jsb3csIGRpc3QsIGJ1ZiwKKyAgICAgICAgICBiYWNrLCBXLCBIKTsKKyAgfSBlbHNlIHsKKyAgICBmeF9kYXRhLT5saWcgPSAxLjA1ZjsKKyAgICBpZiAoZnhfZGF0YS0+bGlncyA8IDAuMGYpCisgICAgICBmeF9kYXRhLT5saWdzID0gLWZ4X2RhdGEtPmxpZ3M7CisgICAgcHJldHR5X21vdmUgKGdvb21JbmZvLCBmeF9kYXRhLT5jeWNsZSwgJmRpc3QsICZkaXN0MiwgJnJvdGFuZ2xlLCBmeF9kYXRhKTsKKyAgICBmeF9kYXRhLT5jeWNsZSArPSAwLjFmOworICAgIGlmIChmeF9kYXRhLT5jeWNsZSA+IDEwMDApCisgICAgICBmeF9kYXRhLT5jeWNsZSA9IDA7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9nb29tL3RlbnRhY2xlM2QuaCBiL2dzdC9nb29tL3RlbnRhY2xlM2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjNiYTkyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20vdGVudGFjbGUzZC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIEdvb20gUHJvamVjdAorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gaU9TLVNvZnR3YXJlCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpZm5kZWYgX1RFTlRBQ0xFM0RfSAorI2RlZmluZSBfVEVOVEFDTEUzRF9ICisKKyNpbmNsdWRlICJnb29tX3Zpc3VhbF9meC5oIgorCit2b2lkIHRlbnRhY2xlX2Z4X2NyZWF0ZShWaXN1YWxGWCAqZngpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9nb29tL3YzZC5jIGIvZ3N0L2dvb20vdjNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmNGYxMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL3YzZC5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIEdvb20gUHJvamVjdAorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gaU9TLVNvZnR3YXJlCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpbmNsdWRlICJ2M2QuaCIKKwordm9pZAordjNkX3RvX3YyZCAodjNkICogdjMsIGludCBuYnZlcnRleCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBmbG9hdCBkaXN0YW5jZSwKKyAgICB2MmQgKiB2MikKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG5idmVydGV4OyArK2kpIHsKKyAgICBpZiAodjNbaV0ueiA+IDIpIHsKKyAgICAgIGludCBYcCwgWXA7CisKKyAgICAgIEYySSAoKGRpc3RhbmNlICogdjNbaV0ueCAvIHYzW2ldLnopLCBYcCk7CisgICAgICBGMkkgKChkaXN0YW5jZSAqIHYzW2ldLnkgLyB2M1tpXS56KSwgWXApOworICAgICAgdjJbaV0ueCA9IFhwICsgKHdpZHRoID4+IDEpOworICAgICAgdjJbaV0ueSA9IC1ZcCArIChoZWlnaHQgPj4gMSk7CisgICAgfSBlbHNlCisgICAgICB2MltpXS54ID0gdjJbaV0ueSA9IC02NjY7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9nb29tL3YzZC5oIGIvZ3N0L2dvb20vdjNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1ZjkzOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL3YzZC5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIEdvb20gUHJvamVjdAorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gaU9TLVNvZnR3YXJlCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpZm5kZWYgX1YzRF9ICisjZGVmaW5lIF9WM0RfSAorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJtYXRodG9vbHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGZsb2F0IHgseSx6OworfSB2M2Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgeCx5OworfSB2MmQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBkb3VibGUgeCx5OworfSB2Mmc7CisKKy8qIAorICogcHJvamV0ZSBsZSB2ZXJ0ZXggM0Qgc3VyIGxlIHBsYW4gZCdhZmZpY2hhZ2UKKyAqIHJldG91cm5lICgwLDApIHNpIGxlIHBvaW50IG5lIGRvaXQgcGFzIGV0cmUgYWZmaWNoZS4KKyAqCisgKiBib25uZSB2YWxldXIgcG91ciBkaXN0YW5jZSA6IDI1NgorICovCisjZGVmaW5lIFYzRF9UT19WMkQodjMsdjIsd2lkdGgsaGVpZ2h0LGRpc3RhbmNlKSBcCit7IFwKKyAgaW50IFhwLCBZcDsgXAorICBpZiAodjMueiA+IDIpIHsgXAorCSBGMkkoKGRpc3RhbmNlICogdjMueCAvIHYzLnopLFhwKSA7IFwKKyAJIEYySSgoZGlzdGFuY2UgKiB2My55IC8gdjMueiksWXApIDsgXAorIAkgdjIueCA9IFhwICsgKHdpZHRoPj4xKTsgXAorCSB2Mi55ID0gLVlwICsgKGhlaWdodD4+MSk7IFwKKyAgfSBcCisgIGVsc2UgdjIueD12Mi55PS02NjY7IFwKK30KKwordm9pZCB2M2RfdG9fdjJkKHYzZCAqc3JjLCBpbnQgbmJ2ZXJ0ZXgsIGludCB3aWR0aCwgaW50IGhlaWdodCwgZmxvYXQgZGlzdGFuY2UsIHYyZCAqdjJfYXJyYXkpOworCisvKgorICogcm90YXRpb24gc2Vsb24gWSBkdSB2M2QgdmkgZCdhbmdsZSBhIChjb3NhPWNvcyhhKSwgc2luYT1zaW4oYSkpCisgKiBjZW50ZXJ6ID0gY2VudHJlIGRlIHJvdGF0aW9uIGVuIHoKKyAqLworI2RlZmluZSBZX1JPVEFURV9WM0QodmksdmYsc2luYSxjb3NhKVwKK3tcCisgdmYueCA9IHZpLnggKiBjb3NhIC0gdmkueiAqIHNpbmE7XAorIHZmLnogPSB2aS54ICogc2luYSArIHZpLnogKiBjb3NhO1wKKyB2Zi55ID0gdmkueTtcCit9CisKKy8qCisgKiB0cmFuc2xhdGlvbgorICovCisjZGVmaW5lIFRSQU5TTEFURV9WM0QodnNyYyx2ZGVzdClcCit7XAorIHZkZXN0LnggKz0gdnNyYy54O1wKKyB2ZGVzdC55ICs9IHZzcmMueTtcCisgdmRlc3QueiArPSB2c3JjLno7XAorfQorCisjZGVmaW5lIE1VTF9WM0QobGYsdikge3YueCo9bGY7di55Kj1sZjt2LnoqPWxmO30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvZ29vbS94bW14LmMgYi9nc3QvZ29vbS94bW14LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4N2NmOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL3htbXguYwpAQCAtMCwwICsxLDQwMiBAQAorLyoJeG1teC5jCisKKwllWHRlbmRlZCBNdWx0aU1lZGlhIGVYdGVuc2lvbnMgR0NDIGludGVyZmFjZSBsaWJyYXJ5IGZvciBJQTMyLgorCisJVG8gdXNlIHRoaXMgbGlicmFyeSwgc2ltcGx5IGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZQorCWFuZCBjb21waWxlIHdpdGggR0NDLiAgWW91IE1VU1QgaGF2ZSBpbmxpbmluZyBlbmFibGVkCisJaW4gb3JkZXIgZm9yIHhtbXhfb2soKSB0byB3b3JrOyB0aGlzIGNhbiBiZSBkb25lIGJ5CisJc2ltcGx5IHVzaW5nIC1PIG9uIHRoZSBHQ0MgY29tbWFuZCBsaW5lLgorCisJQ29tcGlsaW5nIHdpdGggLURYTU1YX1RSQUNFIHdpbGwgY2F1c2UgZGV0YWlsZWQgdHJhY2UKKwlvdXRwdXQgdG8gYmUgc2VudCB0byBzdGRlcnIgZm9yIGVhY2ggbW14IG9wZXJhdGlvbi4KKwlUaGlzIGFkZHMgbG90cyBvZiBjb2RlLCBhbmQgb2J2aW91c2x5IHNsb3dzIGV4ZWN1dGlvbiB0bworCWEgY3Jhd2wsIGJ1dCBjYW4gYmUgdmVyeSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KKworCVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWQorCUVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKwlMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorCUFORCBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFLgorCisJMTk5OSBieSBSLiBGaXNoZXIKKwlCYXNlZCBvbiBsaWJtbXgsIDE5OTctOTkgYnkgSC4gRGlldHogYW5kIFIuIEZpc2hlcgorCisgTm90ZXM6CisJSXQgYXBwZWFycyB0aGF0IHRoZSBsYXRlc3QgZ2FzIGhhcyB0aGUgcGFuZCBwcm9ibGVtIGZpeGVkLCB0aGVyZWZvcmUKKwkgIEknbGwgdW5kZWZpbmUgQlJPS0VOX1BBTkQgYnkgZGVmYXVsdC4KKyovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnb29tX2NvbmZpZy5oIgorCisjaWZkZWYgSEFWRV9NTVgKKworLyogYSBkZWZpbmlyIHBvdXIgYXZvaXIgZXhhY3RlbWVudCBsZSBtZW1lIHJlc3VsdGF0IHF1ZSBsYSBmb25jdGlvbiBDCisgKiAodW4gY2hvdWlsbGF0IHBsdXMgbGVudCkuLiBtYWlzIGxhIGRpZmZlcmVuY2UgZXN0IGFzc2V6IHBldSBub3RhYmxlLgorICovCisvLyAjZGVmaW5lIFNUUklDVF9DT01QQVQKKworI2RlZmluZSBCVUZGUE9JTlROQiAxNgorI2RlZmluZSBCVUZGUE9JTlRNQVNLIDB4ZmZmZgorI2RlZmluZSBCVUZGSU5DUiAweGZmCisKKyNkZWZpbmUgc3FydHBlcnRlIDE2CisvKiBmYWlyZSA6IGEgJSBzcXJ0cGVydGUgPD0+IGEgJiBwZXJ0ZW1hc2sqLworI2RlZmluZSBQRVJURU1BU0sgMHhmCisvKiBmYWlyZSA6IGEgLyBzcXJ0cGVydGUgPD0+IGEgPj4gUEVSVEVERUMqLworI2RlZmluZSBQRVJURURFQyA0CisKKworLyojZGVmaW5lIE1NWF9UUkFDRSovCisjaW5jbHVkZSAibW14LmgiCisvKiNpbmNsdWRlICJ4bW14LmgiKi8KKyNpbmNsdWRlICJnb29tX2dyYXBoaWMuaCIKKworaW50Cit4bW14X3N1cHBvcnRlZCAodm9pZCkKK3sKKyAgcmV0dXJuIChtbV9zdXBwb3J0ICgpICYgMHg4KSA+PiAzOworfQorCit2b2lkCit6b29tX2ZpbHRlcl94bW14IChpbnQgcHJldlgsIGludCBwcmV2WSwKKyAgICBQaXhlbCAqIGV4cGl4MSwgUGl4ZWwgKiBleHBpeDIsCisgICAgaW50ICpsYnJ1UywgaW50ICpsYnJ1RCwgaW50IGJ1ZmZyYXRpbywgaW50IHByZWNhbENvZWZbMTZdWzE2XSkKK3sKKyAgaW50IGJ1ZnNpemUgPSBwcmV2WCAqIHByZXZZOyAgLyogdGFpbGxlIGR1IGJ1ZmZlciAqLworICB2b2xhdGlsZSBpbnQgbG9vcDsgICAgICAgICAgICAvKiB2YXJpYWJsZSBkZSBib3VjbGUgKi8KKworICBtbXhfdCAqYnJ1dFMgPSAobW14X3QgKikgbGJydVM7ICAgICAgIC8qIGJ1ZmZlciBkZSB0cmFuc2Zvcm1hdGlvbiBzb3VyY2UgKi8KKyAgbW14X3QgKmJydXREID0gKG1teF90ICopIGxicnVEOyAgICAgICAvKiBidWZmZXIgZGUgdHJhbnNmb3JtYXRpb24gZGVzdCAqLworCisgIHZvbGF0aWxlIG1teF90IHByZXZYWTsKKyAgdm9sYXRpbGUgbW14X3QgcmF0aW94OworCisgIC8qICAgICAgdm9sYXRpbGUgbW14X3QgaW50ZXJwaXg7ICovCisKKyAgZXhwaXgxWzBdLnZhbCA9IGV4cGl4MVtwcmV2WCAtIDFdLnZhbCA9IGV4cGl4MVtwcmV2WCAqIHByZXZZIC0gMV0udmFsID0KKyAgICAgIGV4cGl4MVtwcmV2WCAqIHByZXZZIC0gcHJldlhdLnZhbCA9IDA7CisKKyAgcHJldlhZLnVkWzBdID0gKHByZXZYIC0gMSkgPDwgUEVSVEVERUM7CisgIHByZXZYWS51ZFsxXSA9IChwcmV2WSAtIDEpIDw8IFBFUlRFREVDOworCisgIHJhdGlveC5kWzBdID0gYnVmZnJhdGlvOworICByYXRpb3guZFsxXSA9IGJ1ZmZyYXRpbzsKKworICBhc20gdm9sYXRpbGUgKCJcblx0IG1vdnEgICVbcmF0aW9dLCAlJW1tNiIgIlxuXHQgcHNsbGQgJDE2LCAgICAgICUlbW02IiAgICAgICAvKiBtbTYgPSBbcmF0MTY9YnVmZnJhdGlvPDwxNiB8IHJhdDE2PWJ1ZmZyYXRpbzw8MTZdICovCisgICAgICAiXG5cdCBweG9yICAlJW1tNywgICAgJSVtbTciICAgICAgLyogbW03ID0gMCAqLworICAgICAgOjpbcmF0aW9dICJtIiAocmF0aW94KSk7CisKKyAgbG9vcCA9IDA7CisKKyAgLyoKKyAgICogTk9URSA6IG1tNiBldCBtbTcgbmUgc29udCBwYXMgbW9kaWZpZXMgZGFucyBsYSBib3VjbGUuCisgICAqLworICB3aGlsZSAobG9vcCA8IGJ1ZnNpemUpIHsKKyAgICAvKiBUaHJlYWQgIzEKKyAgICAgKiBwcmUgOiAgbW02ID0gW3JhdDE2fHJhdDE2XQorICAgICAqIHBvc3QgOiBtbTAgPSBTICsgKChELVMpKnJhdDE2IGZvcm1hdCBbWHxZXQorICAgICAqIG1vZGlmaWVkID0gbW0wLG1tMSxtbTIKKyAgICAgKi8KKworICAgIGFzbSB2b2xhdGlsZSAoIiMxIFxuXHQgbW92cSAwKCVbYnJ1dFNdKSwgJSVtbTAiICIjMSBcblx0IG1vdnEgMCglW2JydXREXSksICUlbW0xIiAiIzEgXG5cdCBwc3ViZCAgICUlbW0wLCAlJW1tMSIgICAgLyogbW0xID0gRCAtIFMgKi8KKyAgICAgICAgIiMxIFxuXHQgbW92cSAgICAlJW1tMSwgJSVtbTIiICAvKiBtbTIgPSBEIC0gUyAqLworICAgICAgICAiIzEgXG5cdCBwc2xsZCAgICAgJDE2LCAlJW1tMSIgIiMxIFxuXHQgcG11bGx3ICAlJW1tNiwgJSVtbTIiICIjMSBcblx0IHBtdWxodXcgJSVtbTYsICUlbW0xIiAiIzEgXG5cdCBwc2xsZCAgICQxNiwgICAlJW1tMCIgIiMxIFxuXHQgcGFkZGQgICAlJW1tMiwgJSVtbTEiICAgICAgLyogbW0xID0gKEQgLSBTKSAqIGJ1ZmZyYXRpbyA+PiAxNiAqLworICAgICAgICAiIzEgXG5cdCBwYWRkZCAgICUlbW0xLCAlJW1tMCIgIC8qIG1tMCA9IFMgKyBtbTEgKi8KKyAgICAgICAgIiMxIFxuXHQgcHNybGQgICAkMTYsICAgJSVtbTAiOjpbYnJ1dFNdICJyIiAoJmJydXRTW2xvb3BdKSwKKyAgICAgICAgW2JydXREXSAiciIgKCZicnV0RFtsb29wXSkKKyAgICAgICAgKTsgICAgICAgICAgICAgICAgICAgICAgLyogbW0wID0gUyAqLworCisgICAgLyoKKyAgICAgKiBwcmUgOiBtbTAgOiBwb3NpdGlvbiB2ZWN0b3Igb24gc2NyZWVuCisgICAgICogICAgICAgcHJldlhZIDogY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXItcmlnaHQgcG9pbnQgb24gc2NyZWVuCisgICAgICogcG9zdCA6IGNsaXBwZWQgbW0wCisgICAgICogbW9kaWZpZWQgOiBtbTAsbW0xLG1tMgorICAgICAqLworICAgIGFzbSB2b2xhdGlsZQorICAgICAgICAoIiMxIFxuXHQgbW92cSAlW3ByZXZYWV0sICUlbW0xIiAiIzEgXG5cdCBwY21wZ3RkICUlbW0wLCAgJSVtbTEiCisgICAgICAgIC8qIG1tMCBlbiBYIGNvbnRpZW50IChpZGVtIHBvdXIgWSkgOgorICAgICAgICAgKiAgIDExMTEgc2kgcHJldlhZID4gcHgKKyAgICAgICAgICogICAwMDAwIHNpIHByZXZYWSA8PSBweCAqLworI2lmZGVmIFNUUklDVF9DT01QQVQKKyAgICAgICAgIiMxIFxuXHQgbW92cSAgICAgICUlbW0xLCAlJW1tMiIKKyAgICAgICAgIiMxIFxuXHQgcHVucGNraGRxICUlbW0yLCAlJW1tMiIKKyAgICAgICAgIiMxIFxuXHQgcHVucGNrbGRxICUlbW0xLCAlJW1tMSIgIiMxIFxuXHQgcGFuZCAgICAgICUlbW0yLCAlJW1tMCIKKyNlbmRpZgorICAgICAgICAiIzEgXG5cdCBwYW5kICUlbW0xLCAlJW1tMCIgICAgIC8qIG9uIG1ldCBhIHplcm8gbGEgcGFydGllIHF1aSBkZWJvcmRlICovCisgICAgICAgIDo6W3ByZXZYWV0gIm0iIChwcmV2WFkpKTsKKworICAgIC8qIFRocmVhZCAjMgorICAgICAqIHByZSA6ICBtbTAgOiBjbGlwcGVkIHBvc2l0aW9uIG9uIHNjcmVlbgorICAgICAqCisgICAgICogcG9zdCA6IG1tMyA6IGNvZWZzIGZvciB0aGlzIHBvc2l0aW9uCisgICAgICogICAgICAgIG1tMSA6IFggdmVjdG9yIFswfFhdCisgICAgICoKKyAgICAgKiBtb2RpZiA6IGVheCxlc2kKKyAgICAgKi8KKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiMyIFxuXHQgbW92ZCAlJW1tMCwlJWVzaSIKKyAgICAgICAgIiMyIFxuXHQgbW92cSAlJW1tMCwlJW1tMSIKKyAgICAgICAgIiMyIFxuXHQgYW5kbCAkMTUsJSVlc2kiCisgICAgICAgICIjMiBcblx0IHBzcmxxICQzMiwlJW1tMSIKKyAgICAgICAgIiMyIFxuXHQgc2hsbCAkNiwlJWVzaSIKKyAgICAgICAgIiMyIFxuXHQgbW92ZCAlJW1tMSwlJWVheCIKKyAgICAgICAgIiMyIFxuXHQgYWRkbCAlW3ByZWNhbENvZWZdLCUlZXNpIgorICAgICAgICAiIzIgXG5cdCBhbmRsICQxNSwlJWVheCIKKyAgICAgICAgIiMyIFxuXHQgbW92ZCAoJSVlc2ksJSVlYXgsNCksJSVtbTMiOjpbcHJlY2FsQ29lZl0KKyAgICAgICAgImciIChwcmVjYWxDb2VmKToiZWF4IiwgImVzaSIpOworCisgICAgLyoKKyAgICAgKiBleHRyYWN0aW9uIGRlcyBjb2VmZmljaWVudHMuLi4gKFRocmVhZCAjMykKKyAgICAgKgorICAgICAqIHByZSA6IGNvZWYgZGFucyBtbTMKKyAgICAgKgorICAgICAqIHBvc3QgOiBjb2VmIGV4dHJhaXRzIGRhbnMgbW0zIChjMSAmIGMyKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgZXQgbW00IChjMyAmIGM0KQorICAgICAqCisgICAgICogbW9kaWYgOiBtbTUKKyAgICAgKi8KKworICAgIC8qIChUaHJlYWQgIzQpCisgICAgICogcHJlIDogbW0wIDogWSBwb3MgWyp8WV0KKyAgICAgKiAgICAgICBtbTEgOiBYIHBvcyBbKnxYXQorICAgICAqCisgICAgICogcG9zdCA6IG1tMCA6IGV4cGl4MVtwb3NpdGlvbl0KKyAgICAgKiAgICAgICAgbW0yIDogZXhwaXgxW3Bvc2l0aW9uK2xhcmdldXJdCisgICAgICoKKyAgICAgKiBtb2RpZiA6IGVheCwgZXNpCisgICAgICovCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCIjMiBcblx0IHBzcmxkICQ0LCAlJW1tMCIgIiMyIFxuXHQgcHNybGQgJDQsICUlbW0xIiAgIC8qIFBFUlRFREVDID0gJDQgKi8KKyAgICAgICAgIiM0IFxuXHQgbW92ZCAlJW1tMSwlJWVheCIKKyAgICAgICAgIiMzIFxuXHQgbW92cSAlJW1tMywlJW1tNSIKKyAgICAgICAgIiM0IFxuXHQgbXVsbCAlW3ByZXZYXSIKKyAgICAgICAgIiM0IFxuXHQgbW92ZCAlJW1tMCwlJWVzaSIKKyAgICAgICAgIiMzIFxuXHQgcHVucGNrbGJ3ICUlbW01LCAlJW1tMyIKKyAgICAgICAgIiM0IFxuXHQgYWRkbCAlJWVzaSwgJSVlYXgiCisgICAgICAgICIjMyBcblx0IG1vdnEgJSVtbTMsICUlbW00IgorICAgICAgICAiIzMgXG5cdCBtb3ZxICUlbW0zLCAlJW1tNSIKKyAgICAgICAgIiM0IFxuXHQgbW92bCAlW2V4cGl4MV0sICUlZXNpIgorICAgICAgICAiIzMgXG5cdCBwdW5wY2tsYncgJSVtbTUsICUlbW0zIgorICAgICAgICAiIzQgXG5cdCBtb3ZxICglJWVzaSwlJWVheCw0KSwlJW1tMCIKKyAgICAgICAgIiMzIFxuXHQgcHVucGNraGJ3ICUlbW01LCAlJW1tNCIKKyAgICAgICAgIiM0IFxuXHQgYWRkbCAlW3ByZXZYXSwlJWVheCIKKyAgICAgICAgIiM0IFxuXHQgbW92cSAoJSVlc2ksJSVlYXgsNCksJSVtbTIiOjpbZXhwaXgxXSAiZyIgKGV4cGl4MSkKKyAgICAgICAgLFtwcmV2WF0gImciIChwcmV2WCkKKyAgICAgICAgOiJlYXgiLCAiZXNpIiwgImVkeCIpOworCisgICAgLyoKKyAgICAgKiBwcmUgOiAgICAgICBtbTAgOiBleHBpeDFbcG9zaXRpb25dCisgICAgICogICAgICAgICAgICAgbW0yIDogZXhwaXgxW3Bvc2l0aW9uK2xhcmdldXJdCisgICAgICogICAgICAgbW0zICYgbW00IDogY29lZnMKKyAgICAgKi8KKworICAgIC8qIHJlY29waWUgZGVzIGRldXggcHJlbWllcnMgcGl4ZWxzIGRhbnMgbW0wIGV0IG1tMSAqLworICAgIG1vdnFfcjJyIChtbTAsIG1tMSk7ICAgICAgICAvKiBiMS12MS1yMS1hMS1iMi12Mi1yMi1hMiAqLworCisgICAgLyogZGVwYWNrYWdlIGR1IHByZW1pZXIgcGl4ZWwgKi8KKyAgICBwdW5wY2tsYndfcjJyIChtbTcsIG1tMCk7ICAgLyogMDAtYjItMDAtdjItMDAtcjItMDAtYTIgKi8KKworICAgIC8qIGV4dHJhY3Rpb24gZGVzIGNvZWZmaWNpZW50cy4uLiAqLworCisgICAgbW92cV9yMnIgKG1tMywgbW01KTsgICAgICAgIC8qIGMyLWMyLWMyLWMyLWMxLWMxLWMxLWMxICovCisKKyAgICAvKl5lbiBwYXJyYWxsZWxlXiAqLy8qIGRlcGFja2FnZSBkdSAyaWVtZSBwaXhlbCAqLworICAgIC8qXiAqLyBwdW5wY2toYndfcjJyIChtbTcsIG1tMSk7CisgICAgLyogMDAtYjEtMDAtdjEtMDAtcjEtMDAtYTEgKi8KKworICAgIHB1bnBja2xid19yMnIgKG1tNywgbW01KTsgICAvKiAwMC1jMS0wMC1jMS0wMC1jMS0wMC1jMSAqLworICAgIHB1bnBja2hid19yMnIgKG1tNywgbW0zKTsgICAvKiAwMC1jMi0wMC1jMi0wMC1jMi0wMC1jMiAqLworCisgICAgLyogbXVsdGlwbGljYXRpb24gZGVzIHBpeGVscyBwYXIgbGVzIGNvZWZmaWNpZW50cyAqLworICAgIHBtdWxsd19yMnIgKG1tNSwgbW0wKTsgICAgICAvKiBjMSpiMi1jMSp2Mi1jMSpyMi1jMSphMiAqLworICAgIHBtdWxsd19yMnIgKG1tMywgbW0xKTsgICAgICAvKiBjMipiMS1jMip2MS1jMipyMS1jMiphMSAqLworICAgIHBhZGR3X3IyciAobW0xLCBtbTApOworCisgICAgLyogLi4uZXh0cmFjdGlvbiBkZXMgMiBkZXJuaWVycyBjb2VmZmljaWVudHMgKi8KKyAgICBtb3ZxX3IyciAobW00LCBtbTUpOyAgICAgICAgLyogYzQtYzQtYzQtYzQtYzMtYzMtYzMtYzMgKi8KKyAgICBwdW5wY2tsYndfcjJyIChtbTcsIG1tNCk7ICAgLyogMDAtYzMtMDAtYzMtMDAtYzMtMDAtYzMgKi8KKyAgICBwdW5wY2toYndfcjJyIChtbTcsIG1tNSk7ICAgLyogMDAtYzQtMDAtYzQtMDAtYzQtMDAtYzQgKi8KKworICAgIC8qIHJlY3VwZXJhdGlvbiBkZXMgMiBkZXJuaWVycyBwaXhlbHMgKi8KKyAgICBtb3ZxX3IyciAobW0yLCBtbTEpOworCisgICAgLyogZGVwYWNrYWdlIGRlcyBwaXhlbHMgKi8KKyAgICBwdW5wY2tsYndfcjJyIChtbTcsIG1tMSk7CisgICAgcHVucGNraGJ3X3IyciAobW03LCBtbTIpOworCisgICAgLyogbXVsdGlwbGljYXRpb24gcGFzIGxlcyBjb2VmZnMgKi8KKyAgICBwbXVsbHdfcjJyIChtbTQsIG1tMSk7CisgICAgcG11bGx3X3IyciAobW01LCBtbTIpOworCisgICAgLyogYWpvdXQgZGVzIHZhbGV1cnMgb2J0ZW51ZXMg77+9IGxhIHZhbGV1ciBmaW5hbGUgKi8KKyAgICBwYWRkd19yMnIgKG1tMSwgbW0wKTsKKyAgICBwYWRkd19yMnIgKG1tMiwgbW0wKTsKKworICAgIC8qIGRpdmlzaW9uIHBhciAyNTYgPSAxNisxNisxNisxNiwgcHVpcyByZXBhY2thZ2UgZHUgcGl4ZWwgZmluYWwgKi8KKyAgICBwc3Jsd19pMnIgKDgsIG1tMCk7CisgICAgcGFja3Vzd2JfcjJyIChtbTcsIG1tMCk7CisKKyAgICBtb3ZkX3IybSAobW0wLCBleHBpeDJbbG9vcF0pOworCisgICAgKytsb29wOworICB9CisgIC8qIHRoaXMgd2FzIGZlbW1zLCB3aGljaCBpcyBBTUQgM2Rub3cgKi8KKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlbW1zXG4iKTsKK30KKworI2RlZmluZSBEUkFXTUVUSE9EX1BMVVNfWE1NWChfb3V0LF9iYWNrYnVmLF9jb2wpIFwKK3sgXAorCW1vdmRfbTJyKF9iYWNrYnVmLCBtbTApOyBcCisJcGFkZHVzYl9tMnIoX2NvbCwgbW0wKTsgXAorCW1vdmRfcjJtKG1tMCwgX291dCk7IFwKK30KKworI2RlZmluZSBEUkFXTUVUSE9EIERSQVdNRVRIT0RfUExVU19YTU1YKCpwLCpwLGNvbCkKKwordm9pZAorZHJhd19saW5lX3htbXggKFBpeGVsICogZGF0YSwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyLCBpbnQgY29sLAorICAgIGludCBzY3JlZW54LCBpbnQgc2NyZWVueSkKK3sKKyAgaW50IHgsIHksIGR4LCBkeSwgeXksIHh4OworICBQaXhlbCAqcDsKKworICBpZiAoKHkxIDwgMCkgfHwgKHkyIDwgMCkgfHwgKHgxIDwgMCkgfHwgKHgyIDwgMCkgfHwgKHkxID49IHNjcmVlbnkpCisgICAgICB8fCAoeTIgPj0gc2NyZWVueSkgfHwgKHgxID49IHNjcmVlbngpIHx8ICh4MiA+PSBzY3JlZW54KSkKKyAgICBnb3RvIGVuZF9vZl9saW5lOworCisgIGR4ID0geDIgLSB4MTsKKyAgZHkgPSB5MiAtIHkxOworICBpZiAoeDEgPj0geDIpIHsKKyAgICBpbnQgdG1wOworCisgICAgdG1wID0geDE7CisgICAgeDEgPSB4MjsKKyAgICB4MiA9IHRtcDsKKyAgICB0bXAgPSB5MTsKKyAgICB5MSA9IHkyOworICAgIHkyID0gdG1wOworICAgIGR4ID0geDIgLSB4MTsKKyAgICBkeSA9IHkyIC0geTE7CisgIH0KKworICAvKiB2ZXJ0aWNhbCBsaW5lICovCisgIGlmIChkeCA9PSAwKSB7CisgICAgaWYgKHkxIDwgeTIpIHsKKyAgICAgIHAgPSAmKGRhdGFbKHNjcmVlbnggKiB5MSkgKyB4MV0pOworICAgICAgZm9yICh5ID0geTE7IHkgPD0geTI7IHkrKykgeworICAgICAgICBEUkFXTUVUSE9EOworICAgICAgICBwICs9IHNjcmVlbng7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHAgPSAmKGRhdGFbKHNjcmVlbnggKiB5MikgKyB4MV0pOworICAgICAgZm9yICh5ID0geTI7IHkgPD0geTE7IHkrKykgeworICAgICAgICBEUkFXTUVUSE9EOworICAgICAgICBwICs9IHNjcmVlbng7CisgICAgICB9CisgICAgfQorICAgIGdvdG8gZW5kX29mX2xpbmU7CisgIH0KKyAgLyogaG9yaXpvbnRhbCBsaW5lICovCisgIGlmIChkeSA9PSAwKSB7CisgICAgaWYgKHgxIDwgeDIpIHsKKyAgICAgIHAgPSAmKGRhdGFbKHNjcmVlbnggKiB5MSkgKyB4MV0pOworICAgICAgZm9yICh4ID0geDE7IHggPD0geDI7IHgrKykgeworICAgICAgICBEUkFXTUVUSE9EOworICAgICAgICBwKys7CisgICAgICB9CisgICAgICBnb3RvIGVuZF9vZl9saW5lOworICAgIH0gZWxzZSB7CisgICAgICBwID0gJihkYXRhWyhzY3JlZW54ICogeTEpICsgeDJdKTsKKyAgICAgIGZvciAoeCA9IHgyOyB4IDw9IHgxOyB4KyspIHsKKyAgICAgICAgRFJBV01FVEhPRDsKKyAgICAgICAgcCsrOworICAgICAgfQorICAgICAgZ290byBlbmRfb2ZfbGluZTsKKyAgICB9CisgIH0KKyAgLyogMSAgICAqLworICAvKiAgXCAgICovCisgIC8qICAgXCAgKi8KKyAgLyogICAgMiAqLworICBpZiAoeTIgPiB5MSkgeworICAgIC8qIHN0ZWVwICovCisgICAgaWYgKGR5ID4gZHgpIHsKKyAgICAgIGR4ID0gKChkeCA8PCAxNikgLyBkeSk7CisgICAgICB4ID0geDEgPDwgMTY7CisgICAgICBmb3IgKHkgPSB5MTsgeSA8PSB5MjsgeSsrKSB7CisgICAgICAgIHh4ID0geCA+PiAxNjsKKyAgICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHkpICsgeHhdKTsKKyAgICAgICAgRFJBV01FVEhPRDsKKyAgICAgICAgaWYgKHh4IDwgKHNjcmVlbnggLSAxKSkgeworICAgICAgICAgIHArKzsKKyAgICAgICAgICAvKiBEUkFXTUVUSE9EOyAqLworICAgICAgICB9CisgICAgICAgIHggKz0gZHg7CisgICAgICB9CisgICAgICBnb3RvIGVuZF9vZl9saW5lOworICAgIH0KKyAgICAvKiBzaGFsbG93ICovCisgICAgZWxzZSB7CisgICAgICBkeSA9ICgoZHkgPDwgMTYpIC8gZHgpOworICAgICAgeSA9IHkxIDw8IDE2OworICAgICAgZm9yICh4ID0geDE7IHggPD0geDI7IHgrKykgeworICAgICAgICB5eSA9IHkgPj4gMTY7CisgICAgICAgIHAgPSAmKGRhdGFbKHNjcmVlbnggKiB5eSkgKyB4XSk7CisgICAgICAgIERSQVdNRVRIT0Q7CisgICAgICAgIGlmICh5eSA8IChzY3JlZW55IC0gMSkpIHsKKyAgICAgICAgICBwICs9IHNjcmVlbnk7CisgICAgICAgICAgLyogRFJBV01FVEhPRDsgKi8KKyAgICAgICAgfQorICAgICAgICB5ICs9IGR5OworICAgICAgfQorICAgIH0KKyAgfQorICAvKiAgICAyICovCisgIC8qICAgLyAgKi8KKyAgLyogIC8gICAqLworICAvKiAxICAgICovCisgIGVsc2UgeworICAgIC8qIHN0ZWVwICovCisgICAgaWYgKC1keSA+IGR4KSB7CisgICAgICBkeCA9ICgoZHggPDwgMTYpIC8gLWR5KTsKKyAgICAgIHggPSAoeDEgKyAxKSA8PCAxNjsKKyAgICAgIGZvciAoeSA9IHkxOyB5ID49IHkyOyB5LS0pIHsKKyAgICAgICAgeHggPSB4ID4+IDE2OworICAgICAgICBwID0gJihkYXRhWyhzY3JlZW54ICogeSkgKyB4eF0pOworICAgICAgICBEUkFXTUVUSE9EOworICAgICAgICBpZiAoeHggPCAoc2NyZWVueCAtIDEpKSB7CisgICAgICAgICAgcC0tOworICAgICAgICAgIC8qIERSQVdNRVRIT0Q7ICovCisgICAgICAgIH0KKyAgICAgICAgeCArPSBkeDsKKyAgICAgIH0KKyAgICAgIGdvdG8gZW5kX29mX2xpbmU7CisgICAgfQorICAgIC8qIHNoYWxsb3cgKi8KKyAgICBlbHNlIHsKKyAgICAgIGR5ID0gKChkeSA8PCAxNikgLyBkeCk7CisgICAgICB5ID0geTEgPDwgMTY7CisgICAgICBmb3IgKHggPSB4MTsgeCA8PSB4MjsgeCsrKSB7CisgICAgICAgIHl5ID0geSA+PiAxNjsKKyAgICAgICAgcCA9ICYoZGF0YVsoc2NyZWVueCAqIHl5KSArIHhdKTsKKyAgICAgICAgRFJBV01FVEhPRDsKKyAgICAgICAgaWYgKHl5IDwgKHNjcmVlbnkgLSAxKSkgeworICAgICAgICAgIHAgKz0gc2NyZWVueTsKKyAgICAgICAgICAvKiBEUkFXTUVUSE9EOyAqLworICAgICAgICB9CisgICAgICAgIHkgKz0gZHk7CisgICAgICB9CisgICAgICBnb3RvIGVuZF9vZl9saW5lOworICAgIH0KKyAgfQorZW5kX29mX2xpbmU6CisgIC8qIHRoaXMgd2FzIGZlbW1zLCB3aGljaCBpcyBBTUQgM2Rub3cgKi8KKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlbW1zXG4iKTsKK30KKyNlbHNlCitpbnQKK3htbXhfc3VwcG9ydGVkICh2b2lkKQoreworICByZXR1cm4gKDApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvZ29vbS94bW14LmggYi9nc3QvZ29vbS94bW14LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlZjM2MQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tL3htbXguaApAQCAtMCwwICsxLDUzNyBAQAorLyoJeG1teC5oCisKKwllWHRlbmRlZCBNdWx0aU1lZGlhIGVYdGVuc2lvbnMgR0NDIGludGVyZmFjZSBsaWJyYXJ5IGZvciBJQTMyLgorCisJVG8gdXNlIHRoaXMgbGlicmFyeSwgc2ltcGx5IGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZQorCWFuZCBjb21waWxlIHdpdGggR0NDLiAgWW91IE1VU1QgaGF2ZSBpbmxpbmluZyBlbmFibGVkCisJaW4gb3JkZXIgZm9yIHhtbXhfb2soKSB0byB3b3JrOyB0aGlzIGNhbiBiZSBkb25lIGJ5CisJc2ltcGx5IHVzaW5nIC1PIG9uIHRoZSBHQ0MgY29tbWFuZCBsaW5lLgorCisJQ29tcGlsaW5nIHdpdGggLURYTU1YX1RSQUNFIHdpbGwgY2F1c2UgZGV0YWlsZWQgdHJhY2UKKwlvdXRwdXQgdG8gYmUgc2VudCB0byBzdGRlcnIgZm9yIGVhY2ggbW14IG9wZXJhdGlvbi4KKwlUaGlzIGFkZHMgbG90cyBvZiBjb2RlLCBhbmQgb2J2aW91c2x5IHNsb3dzIGV4ZWN1dGlvbiB0bworCWEgY3Jhd2wsIGJ1dCBjYW4gYmUgdmVyeSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KKworCVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWQorCUVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKwlMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorCUFORCBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFLgorCisJMTk5OSBieSBSLiBGaXNoZXIKKwlCYXNlZCBvbiBsaWJtbXgsIDE5OTctOTkgYnkgSC4gRGlldHogYW5kIFIuIEZpc2hlcgorCisgTm90ZXM6CisJSXQgYXBwZWFycyB0aGF0IHRoZSBsYXRlc3QgZ2FzIGhhcyB0aGUgcGFuZCBwcm9ibGVtIGZpeGVkLCB0aGVyZWZvcmUKKwkgIEknbGwgdW5kZWZpbmUgQlJPS0VOX1BBTkQgYnkgZGVmYXVsdC4KKyovCisKKyNpZm5kZWYgX1hNTVhfSAorI2RlZmluZSBfWE1NWF9ICisKKworLyoJV2FybmluZzogIGF0IHRoaXMgd3JpdGluZywgdGhlIHZlcnNpb24gb2YgR0FTIHBhY2thZ2VkCisJd2l0aCBtb3N0IExpbnV4IGRpc3RyaWJ1dGlvbnMgZG9lcyBub3QgaGFuZGxlIHRoZQorCXBhcmFsbGVsIEFORCBvcGVyYXRpb24gbW5lbW9uaWMgY29ycmVjdGx5LiAgSWYgdGhlCisJc3ltYm9sIEJST0tFTl9QQU5EIGlzIGRlZmluZWQsIGEgc2xvd2VyIGFsdGVybmF0aXZlCisJY29kaW5nIHdpbGwgYmUgdXNlZC4gIElmIGV4ZWN1dGlvbiBvZiBtbXh0ZXN0IHJlc3VsdHMKKwlpbiBhbiBpbGxlZ2FsIGluc3RydWN0aW9uIGZhdWx0LCBkZWZpbmUgdGhpcyBzeW1ib2wuCisqLworI3VuZGVmCUJST0tFTl9QQU5ECisKKworLyoJVGhlIHR5cGUgb2YgYW4gdmFsdWUgdGhhdCBmaXRzIGluIGFuIChFeHRlbmRlZCkgTU1YIHJlZ2lzdGVyCisJKG5vdGUgdGhhdCBsb25nIGxvbmcgY29uc3RhbnQgdmFsdWVzIE1VU1QgYmUgc3VmZml4ZWQKKwkgYnkgTEwgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZXMgYnkgVUxMLCBsZXN0CisJIHRoZXkgYmUgdHJ1bmNhdGVkIGJ5IHRoZSBjb21waWxlcikKKyovCisjaWZuZGVmIF9NTVhfSAordHlwZWRlZgl1bmlvbiB7CisJbG9uZyBsb25nCQlxOwkvKiBRdWFkd29yZCAoNjQtYml0KSB2YWx1ZSAqLworCXVuc2lnbmVkIGxvbmcgbG9uZwl1cTsJLyogVW5zaWduZWQgUXVhZHdvcmQgKi8KKwlpbnQJCQlkWzJdOwkvKiAyIERvdWJsZXdvcmQgKDMyLWJpdCkgdmFsdWVzICovCisJdW5zaWduZWQgaW50CQl1ZFsyXTsJLyogMiBVbnNpZ25lZCBEb3VibGV3b3JkICovCisJc2hvcnQJCQl3WzRdOwkvKiA0IFdvcmQgKDE2LWJpdCkgdmFsdWVzICovCisJdW5zaWduZWQgc2hvcnQJCXV3WzRdOwkvKiA0IFVuc2lnbmVkIFdvcmQgKi8KKwljaGFyCQkJYls4XTsJLyogOCBCeXRlICg4LWJpdCkgdmFsdWVzICovCisJdW5zaWduZWQgY2hhcgkJdWJbOF07CS8qIDggVW5zaWduZWQgQnl0ZSAqLworCWZsb2F0CQkJc1syXTsJLyogU2luZ2xlLXByZWNpc2lvbiAoMzItYml0KSB2YWx1ZSAqLworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoOCkpKSBtbXhfdDsJLyogT24gYW4gOC1ieXRlICg2NC1iaXQpIGJvdW5kYXJ5ICovCisjZW5kaWYKKworCisKKy8qCUZ1bmN0aW9uIHRvIHRlc3QgaWYgbXVsdGltZWRpYSBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZC4uLgorKi8KK3N0YXRpYyBpbnQKK21tX3N1cHBvcnQodm9pZCkKK3sKKwkvKiBSZXR1cm5zIDEgaWYgTU1YIGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLAorCSAgIDMgaWYgQ3lyaXggTU1YIGFuZCBFeHRlbmRlZCBNTVggaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQKKwkgICA1IGlmIEFNRCBNTVggYW5kIDNETm93ISBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZAorCSAgIDAgaWYgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBhbnkgb2YgdGhlc2UKKwkqLworCXJlZ2lzdGVyIGludCBydmFsID0gMDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJLyogU2VlIGlmIENQVUlEIGluc3RydWN0aW9uIGlzIHN1cHBvcnRlZCAuLi4gKi8KKwkJLyogLi4uIEdldCBjb3BpZXMgb2YgRUZMQUdTIGludG8gZWF4IGFuZCBlY3ggKi8KKwkJInB1c2hmXG5cdCIKKwkJInBvcGwgJSVlYXhcblx0IgorCQkibW92bCAlJWVheCwgJSVlY3hcblx0IgorCisJCS8qIC4uLiBUb2dnbGUgdGhlIElEIGJpdCBpbiBvbmUgY29weSBhbmQgc3RvcmUgKi8KKwkJLyogICAgIHRvIHRoZSBFRkxBR1MgcmVnICovCisJCSJ4b3JsICQweDIwMDAwMCwgJSVlYXhcblx0IgorCQkicHVzaCAlJWVheFxuXHQiCisJCSJwb3BmXG5cdCIKKworCQkvKiAuLi4gR2V0IHRoZSAoaG9wZWZ1bGx5IG1vZGlmaWVkKSBFRkxBR1MgKi8KKwkJInB1c2hmXG5cdCIKKwkJInBvcGwgJSVlYXhcblx0IgorCisJCS8qIC4uLiBDb21wYXJlIGFuZCB0ZXN0IHJlc3VsdCAqLworCQkieG9ybCAlJWVheCwgJSVlY3hcblx0IgorCQkidGVzdGwgJDB4MjAwMDAwLCAlJWVjeFxuXHQiCisJCSJqeiBOb3RTdXBwb3J0ZWQxXG5cdCIJCS8qIENQVUlEIG5vdCBzdXBwb3J0ZWQgKi8KKworCisJCS8qIEdldCBzdGFuZGFyZCBDUFVJRCBpbmZvcm1hdGlvbiwgYW5kCisJCSAgICAgICBnbyB0byBhIHNwZWNpZmljIHZlbmRvciBzZWN0aW9uICovCisJCSJtb3ZsICQwLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisKKwkJLyogQ2hlY2sgZm9yIEludGVsICovCisJCSJjbXBsICQweDc1NmU2NTQ3LCAlJWVieFxuXHQiCisJCSJqbmUgVHJ5QU1EXG5cdCIKKwkJImNtcGwgJDB4NDk2NTZlNjksICUlZWR4XG5cdCIKKwkJImpuZSBUcnlBTURcblx0IgorCQkiY21wbCAkMHg2YzY1NzQ2ZSwgJSVlY3hcbiIKKwkJImpuZSBUcnlBTURcblx0IgorCQkiam1wIEludGVsXG5cdCIKKworCQkvKiBDaGVjayBmb3IgQU1EICovCisJCSJcblRyeUFNRDpcblx0IgorCQkiY21wbCAkMHg2ODc0NzU0MSwgJSVlYnhcblx0IgorCQkiam5lIFRyeUN5cml4XG5cdCIKKwkJImNtcGwgJDB4Njk3NDZlNjUsICUlZWR4XG5cdCIKKwkJImpuZSBUcnlDeXJpeFxuXHQiCisJCSJjbXBsICQweDQ0NGQ0MTYzLCAlJWVjeFxuIgorCQkiam5lIFRyeUN5cml4XG5cdCIKKwkJImptcCBBTURcblx0IgorCisJCS8qIENoZWNrIGZvciBDeXJpeCAqLworCQkiXG5UcnlDeXJpeDpcblx0IgorCQkiY21wbCAkMHg2OTcyNzk0MywgJSVlYnhcblx0IgorCQkiam5lIE5vdFN1cHBvcnRlZDJcblx0IgorCQkiY21wbCAkMHg3MzZlNDk3OCwgJSVlZHhcblx0IgorCQkiam5lIE5vdFN1cHBvcnRlZDNcblx0IgorCQkiY21wbCAkMHg2NDYxNjU3NCwgJSVlY3hcblx0IgorCQkiam5lIE5vdFN1cHBvcnRlZDRcblx0IgorCQkvKiBEcm9wIHRocm91Z2ggdG8gQ3lyaXguLi4gKi8KKworCisJCS8qIEN5cml4IFNlY3Rpb24gKi8KKwkJLyogU2VlIGlmIGV4dGVuZGVkIENQVUlEIGxldmVsIDgwMDAwMDAxIGlzIHN1cHBvcnRlZCAqLworCQkvKiBUaGUgdmFsdWUgb2YgQ1BVSUQvODAwMDAwMDEgZm9yIHRoZSA2eDg2TVggaXMgdW5kZWZpbmVkCisJCSAgIGFjY29yZGluZyB0byB0aGUgQ3lyaXggQ1BVIERldGVjdGlvbiBHdWlkZSAoUHJlbGltaW5hcnkKKwkJICAgUmV2LiAxLjAxIHRhYmxlIDEpLCBzbyB3ZSdsbCBjaGVjayB0aGUgdmFsdWUgb2YgZWF4IGZvcgorCQkgICBDUFVJRC8wIHRvIHNlZSBpZiBzdGFuZGFyZCBDUFVJRCBsZXZlbCAyIGlzIHN1cHBvcnRlZC4KKwkJICAgQWNjb3JkaW5nIHRvIHRoZSB0YWJsZSwgdGhlIG9ubHkgQ1BVIHdoaWNoIHN1cHBvcnRzIGxldmVsCisJCSAgIDIgaXMgYWxzbyB0aGUgb25seSBvbmUgd2hpY2ggc3VwcG9ydHMgZXh0ZW5kZWQgQ1BVSUQgbGV2ZWxzLgorCQkqLworCQkiY21wbCAkMHgyLCAlJWVheFxuXHQiCisJCSJqbmUgTU1YdGVzdFxuXHQiCS8qIFVzZSBzdGFuZGFyZCBDUFVJRCBpbnN0ZWFkICovCisKKwkJLyogRXh0ZW5kZWQgQ1BVSUQgc3VwcG9ydGVkIChpbiB0aGVvcnkpLCBzbyBnZXQgZXh0ZW5kZWQKKwkJICAgZmVhdHVyZXMgKi8KKwkJIm1vdmwgJDB4ODAwMDAwMDEsICUlZWF4XG5cdCIKKwkJImNwdWlkXG5cdCIKKwkJInRlc3RsICQweDAwODAwMDAwLCAlJWVheFxuXHQiCS8qIFRlc3QgZm9yIE1NWCAqLworCQkianogTm90U3VwcG9ydGVkNVxuXHQiCQkvKiBNTVggbm90IHN1cHBvcnRlZCAqLworCQkidGVzdGwgJDB4MDEwMDAwMDAsICUlZWF4XG5cdCIJLyogVGVzdCBmb3IgRXh0J2QgTU1YICovCisJCSJqbnogRU1NWFN1cHBvcnRlZFxuXHQiCisJCSJtb3ZsICQxLCAlMDpcblxuXHQiCQkvKiBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cbiIKKwkJIkVNTVhTdXBwb3J0ZWQ6XG5cdCIKKwkJIm1vdmwgJDMsICUwOlxuXG5cdCIJCS8qIEVNTVggYW5kIE1NWCBTdXBwb3J0ZWQgKi8KKwkJImptcCBSZXR1cm5cblx0IgorCisKKwkJLyogQU1EIFNlY3Rpb24gKi8KKwkJIkFNRDpcblx0IgorCisJCS8qIFNlZSBpZiBleHRlbmRlZCBDUFVJRCBpcyBzdXBwb3J0ZWQgKi8KKwkJIm1vdmwgJDB4ODAwMDAwMDAsICUlZWF4XG5cdCIKKwkJImNwdWlkXG5cdCIKKwkJImNtcGwgJDB4ODAwMDAwMDAsICUlZWF4XG5cdCIKKwkJImpsIE1NWHRlc3Rcblx0IgkvKiBVc2Ugc3RhbmRhcmQgQ1BVSUQgaW5zdGVhZCAqLworCisJCS8qIEV4dGVuZGVkIENQVUlEIHN1cHBvcnRlZCwgc28gZ2V0IGV4dGVuZGVkIGZlYXR1cmVzICovCisJCSJtb3ZsICQweDgwMDAwMDAxLCAlJWVheFxuXHQiCisJCSJjcHVpZFxuXHQiCisJCSJ0ZXN0bCAkMHgwMDgwMDAwMCwgJSVlZHhcblx0IgkvKiBUZXN0IGZvciBNTVggKi8KKwkJImp6IE5vdFN1cHBvcnRlZDZcblx0IgkJLyogTU1YIG5vdCBzdXBwb3J0ZWQgKi8KKwkJInRlc3RsICQweDgwMDAwMDAwLCAlJWVkeFxuXHQiCS8qIFRlc3QgZm9yIDNETm93ISAqLworCQkiam56IFRocmVlRE5vd1N1cHBvcnRlZFxuXHQiCisJCSJtb3ZsICQxLCAlMDpcblxuXHQiCQkvKiBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cbiIKKwkJIlRocmVlRE5vd1N1cHBvcnRlZDpcblx0IgorCQkibW92bCAkNSwgJTA6XG5cblx0IgkJLyogM0ROb3chIGFuZCBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cdCIKKworCisJCS8qIEludGVsIFNlY3Rpb24gKi8KKwkJIkludGVsOlxuXHQiCisKKwkJLyogQ2hlY2sgZm9yIE1NWCAqLworCQkiTU1YdGVzdDpcblx0IgorCQkibW92bCAkMSwgJSVlYXhcblx0IgorCQkiY3B1aWRcblx0IgorCQkidGVzdGwgJDB4MDA4MDAwMDAsICUlZWR4XG5cdCIJLyogVGVzdCBmb3IgTU1YICovCisJCSJqeiBOb3RTdXBwb3J0ZWQ3XG5cdCIJCS8qIE1NWCBOb3Qgc3VwcG9ydGVkICovCisJCSJtb3ZsICQxLCAlMDpcblxuXHQiCQkvKiBNTVggU3VwcG9ydGVkICovCisJCSJqbXAgUmV0dXJuXG5cdCIKKworCQkvKiBOb3RoaW5nIHN1cHBvcnRlZCAqLworCQkiXG5Ob3RTdXBwb3J0ZWQxOlxuXHQiCisJCSIjbW92bCAkMTAxLCAlMDpcblxuXHQiCisJCSJcbk5vdFN1cHBvcnRlZDI6XG5cdCIKKwkJIiNtb3ZsICQxMDIsICUwOlxuXG5cdCIKKwkJIlxuTm90U3VwcG9ydGVkMzpcblx0IgorCQkiI21vdmwgJDEwMywgJTA6XG5cblx0IgorCQkiXG5Ob3RTdXBwb3J0ZWQ0OlxuXHQiCisJCSIjbW92bCAkMTA0LCAlMDpcblxuXHQiCisJCSJcbk5vdFN1cHBvcnRlZDU6XG5cdCIKKwkJIiNtb3ZsICQxMDUsICUwOlxuXG5cdCIKKwkJIlxuTm90U3VwcG9ydGVkNjpcblx0IgorCQkiI21vdmwgJDEwNiwgJTA6XG5cblx0IgorCQkiXG5Ob3RTdXBwb3J0ZWQ3OlxuXHQiCisJCSIjbW92bCAkMTA3LCAlMDpcblxuXHQiCisJCSJtb3ZsICQwLCAlMDpcblxuXHQiCisKKwkJIlJldHVybjpcblx0IgorCQk6ICI9YSIgKHJ2YWwpCisJCTogLyogbm8gaW5wdXQgKi8KKwkJOiAiZWF4IiwgImVieCIsICJlY3giLCAiZWR4IgorCSk7CisKKwkvKiBSZXR1cm4gKi8KKwlyZXR1cm4ocnZhbCk7Cit9CisKKy8qCUZ1bmN0aW9uIHRvIHRlc3QgaWYgbW14IGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLi4uCisqLworI2lmbmRlZiBfWE1NWF9ICitpbmxpbmUgZXh0ZXJuIGludAorbW14X29rKHZvaWQpCit7CisJLyogUmV0dXJucyAxIGlmIE1NWCBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZCwgMCBvdGhlcndpc2UgKi8KKwlyZXR1cm4gKCBtbV9zdXBwb3J0KCkgJiAweDEgKTsKK30KKyNlbmRpZgorCisvKglGdW5jdGlvbiB0byB0ZXN0IGlmIHhtbXggaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQuLi4KKyovCitpbmxpbmUgZXh0ZXJuIGludAoreG1teF9vayh2b2lkKQoreworCS8qIFJldHVybnMgMSBpZiBFeHRlbmRlZCBNTVggaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQsIDAgb3RoZXJ3aXNlICovCisJcmV0dXJuICggKG1tX3N1cHBvcnQoKSAmIDB4MikgPj4gMSApOworfQorCisKKy8qCUhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBpbnN0cnVjdGlvbiBtYWNyb3MgdGhhdCBmb2xsb3cuLi4KKwkobm90ZSB0aGF0IG1lbW9yeS10by1yZWdpc3RlciwgbTJyLCBpbnN0cnVjdGlvbnMgYXJlIG5lYXJseQorCSBhcyBlZmZpY2llbnQgYXMgcmVnaXN0ZXItdG8tcmVnaXN0ZXIsIHIyciwgaW5zdHJ1Y3Rpb25zOworCSBob3dldmVyLCBtZW1vcnktdG8tbWVtb3J5IGluc3RydWN0aW9ucyBhcmUgcmVhbGx5IHNpbXVsYXRlZAorCSBhcyBhIGNvbnZlbmllbmNlLCBhbmQgYXJlIG9ubHkgMS8zIGFzIGVmZmljaWVudCkKKyovCisjaWZkZWYJWE1NWF9UUkFDRQorCisvKglJbmNsdWRlIHRoZSBzdHVmZiBmb3IgcHJpbnRpbmcgYSB0cmFjZSB0byBzdGRlcnIuLi4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lCW1teF9pMnIob3AsIGltbSwgcmVnKSBcCisJeyBcCisJCW1teF90IG1teF90cmFjZTsgXAorCQltbXhfdHJhY2UudXEgPSAoaW1tKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI29wICJfaTJyKCIgI2ltbSAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI3JlZyAiPTB4JTA4eCUwOHgpID0+ICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUwLCAlJSIgI3JlZyBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovIFwKKwkJCQkgICAgICA6ICJYIiAoaW1tKSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI3JlZyAiPTB4JTA4eCUwOHhcbiIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwl9CisKKyNkZWZpbmUJbW14X20ycihvcCwgbWVtLCByZWcpIFwKKwl7IFwKKwkJbW14X3QgbW14X3RyYWNlOyBcCisJCW1teF90cmFjZSA9IChtZW0pOyBcCisJCWZwcmludGYoc3RkZXJyLCAjb3AgIl9tMnIoIiAjbWVtICI9MHglMDh4JTA4eCwgIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWcgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjcmVnICI9MHglMDh4JTA4eCkgPT4gIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAorCQkJCSAgICAgIDogIlgiIChtZW0pKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdnEgJSUiICNyZWcgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjcmVnICI9MHglMDh4JTA4eFxuIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCX0KKworI2RlZmluZQltbXhfcjJtKG9wLCByZWcsIG1lbSkgXAorCXsgXAorCQltbXhfdCBtbXhfdHJhY2U7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnICIsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtbXhfdHJhY2UpIFwKKwkJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gKTsgXAorCQlmcHJpbnRmKHN0ZGVyciwgI29wICJfcjJtKCIgI3JlZyAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJbW14X3RyYWNlID0gKG1lbSk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNtZW0gIj0weCUwOHglMDh4KSA9PiAiLCBcCisJCQltbXhfdHJhY2UuZFsxXSwgbW14X3RyYWNlLmRbMF0pOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlJSIgI3JlZyAiLCAlMCIgXAorCQkJCSAgICAgIDogIj1YIiAobWVtKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJbW14X3RyYWNlID0gKG1lbSk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNtZW0gIj0weCUwOHglMDh4XG4iLCBcCisJCQltbXhfdHJhY2UuZFsxXSwgbW14X3RyYWNlLmRbMF0pOyBcCisJfQorCisjZGVmaW5lCW1teF9yMnIob3AsIHJlZ3MsIHJlZ2QpIFwKKwl7IFwKKwkJbW14X3QgbW14X3RyYWNlOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZ3MgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjb3AgIl9yMnIoIiAjcmVncyAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUlIiAjcmVnZCAiLCAlMCIgXAorCQkJCSAgICAgIDogIj1YIiAobW14X3RyYWNlKSBcCisJCQkJICAgICAgOiAvKiBub3RoaW5nICovICk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNyZWdkICI9MHglMDh4JTA4eCkgPT4gIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJSIgI3JlZ3MgIiwgJSIgI3JlZ2QpOyBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlJSIgI3JlZ2QgIiwgJTAiIFwKKwkJCQkgICAgICA6ICI9WCIgKG1teF90cmFjZSkgXAorCQkJCSAgICAgIDogLyogbm90aGluZyAqLyApOyBcCisJCWZwcmludGYoc3RkZXJyLCAjcmVnZCAiPTB4JTA4eCUwOHhcbiIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwl9CisKKyNkZWZpbmUJbW14X20ybShvcCwgbWVtcywgbWVtZCkgXAorCXsgXAorCQltbXhfdCBtbXhfdHJhY2U7IFwKKwkJbW14X3RyYWNlID0gKG1lbXMpOyBcCisJCWZwcmludGYoc3RkZXJyLCAjb3AgIl9tMm0oIiAjbWVtcyAiPTB4JTA4eCUwOHgsICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJbW14X3RyYWNlID0gKG1lbWQpOyBcCisJCWZwcmludGYoc3RkZXJyLCAjbWVtZCAiPTB4JTA4eCUwOHgpID0+ICIsIFwKKwkJCW1teF90cmFjZS5kWzFdLCBtbXhfdHJhY2UuZFswXSk7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUwLCAlJW1tMFxuXHQiIFwKKwkJCQkgICAgICAjb3AgIiAlMSwgJSVtbTBcblx0IiBcCisJCQkJICAgICAgIm1vdnEgJSVtbTAsICUwIiBcCisJCQkJICAgICAgOiAiPVgiIChtZW1kKSBcCisJCQkJICAgICAgOiAiWCIgKG1lbXMpKTsgXAorCQltbXhfdHJhY2UgPSAobWVtZCk7IFwKKwkJZnByaW50ZihzdGRlcnIsICNtZW1kICI9MHglMDh4JTA4eFxuIiwgXAorCQkJbW14X3RyYWNlLmRbMV0sIG1teF90cmFjZS5kWzBdKTsgXAorCX0KKworI2Vsc2UKKworLyoJVGhlc2UgbWFjcm9zIGFyZSBhIGxvdCBzaW1wbGVyIHdpdGhvdXQgdGhlIHRyYWNpbmcuLi4KKyovCisKKyNkZWZpbmUJbW14X2kycihvcCwgaW1tLCByZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJYIiAoaW1tKSApCisKKyNkZWZpbmUJbW14X20ycihvcCwgbWVtLCByZWcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKKwkJCSAgICAgIDogLyogbm90aGluZyAqLyBcCisJCQkgICAgICA6ICJYIiAobWVtKSkKKworI2RlZmluZQltbXhfbTJpcihvcCwgbWVtLCBycykgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlMCwgJSUiICNycyBcCisJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAorCQkJICAgICAgOiAiWCIgKG1lbSkgKQorCisjZGVmaW5lCW1teF9yMm0ob3AsIHJlZywgbWVtKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUlIiAjcmVnICIsICUwIiBcCisJCQkgICAgICA6ICI9WCIgKG1lbSkgXAorCQkJICAgICAgOiAvKiBub3RoaW5nICovICkKKworI2RlZmluZQltbXhfcjJyKG9wLCByZWdzLCByZWdkKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNvcCAiICUiICNyZWdzICIsICUiICNyZWdkKQorCisjZGVmaW5lCW1teF9yMmlyKG9wLCByczEsIHJzMikgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgjb3AgIiAlJSIgI3JzMSAiLCAlJSIgI3JzMiBcCisJCQkgICAgICA6IC8qIG5vdGhpbmcgKi8gXAorCQkJICAgICAgOiAvKiBub3RoaW5nICovICkKKworI2RlZmluZQltbXhfbTJtKG9wLCBtZW1zLCBtZW1kKSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZxICUwLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICNvcCAiICUxLCAlJW1tMFxuXHQiIFwKKwkJCSAgICAgICJtb3ZxICUlbW0wLCAlMCIgXAorCQkJICAgICAgOiAiPVgiIChtZW1kKSBcCisJCQkgICAgICA6ICJYIiAobWVtcykpCisKKyNlbmRpZgorCisKKworLyoJMXg2NCBNT1ZlIFF1YWR3b3JkCisJKHRoaXMgaXMgYm90aCBhIGxvYWQgYW5kIGEgc3RvcmUuLi4KKwkgaW4gZmFjdCwgaXQgaXMgdGhlIG9ubHkgd2F5IHRvIHN0b3JlKQorKi8KKyNkZWZpbmUJbW92cV9tMnIodmFyLCByZWcpCW1teF9tMnIobW92cSwgdmFyLCByZWcpCisjZGVmaW5lCW1vdnFfcjJtKHJlZywgdmFyKQltbXhfcjJtKG1vdnEsIHJlZywgdmFyKQorI2RlZmluZQltb3ZxX3IycihyZWdzLCByZWdkKQltbXhfcjJyKG1vdnEsIHJlZ3MsIHJlZ2QpCisjZGVmaW5lCW1vdnEodmFycywgdmFyZCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92cSAlMSwgJSVtbTBcblx0IiBcCisJCQkgICAgICAibW92cSAlJW1tMCwgJTAiIFwKKwkJCSAgICAgIDogIj1YIiAodmFyZCkgXAorCQkJICAgICAgOiAiWCIgKHZhcnMpKQorCisKKy8qCTF4MzIgTU9WZSBEb3VibGV3b3JkCisJKGxpa2UgbW92cSwgdGhpcyBpcyBib3RoIGxvYWQgYW5kIHN0b3JlLi4uCisJIGJ1dCBpcyBtb3N0IHVzZWZ1bCBmb3IgbW92aW5nIHRoaW5ncyBiZXR3ZWVuCisJIG1teCByZWdpc3RlcnMgYW5kIG9yZGluYXJ5IHJlZ2lzdGVycykKKyovCisjZGVmaW5lCW1vdmRfbTJyKHZhciwgcmVnKQltbXhfbTJyKG1vdmQsIHZhciwgcmVnKQorI2RlZmluZQltb3ZkX3IybShyZWcsIHZhcikJbW14X3IybShtb3ZkLCByZWcsIHZhcikKKyNkZWZpbmUJbW92ZF9yMnIocmVncywgcmVnZCkJbW14X3Iycihtb3ZkLCByZWdzLCByZWdkKQorI2RlZmluZQltb3ZkKHZhcnMsIHZhcmQpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmQgJTEsICUlbW0wXG5cdCIgXAorCQkJICAgICAgIm1vdmQgJSVtbTAsICUwIiBcCisJCQkgICAgICA6ICI9WCIgKHZhcmQpIFwKKwkJCSAgICAgIDogIlgiICh2YXJzKSkKKworCisKKy8qCTR4MTYgUGFyYWxsZWwgTUFHbml0dWRlCisqLworI2RlZmluZQlwbWFnd19tMnIodmFyLCByZWcpCW1teF9tMnIocG1hZ3csIHZhciwgcmVnKQorI2RlZmluZQlwbWFnd19yMnIocmVncywgcmVnZCkJbW14X3IycihwbWFndywgcmVncywgcmVnZCkKKyNkZWZpbmUJcG1hZ3codmFycywgdmFyZCkJbW14X20ybShwbWFndywgdmFycywgdmFyZCkKKworCisvKgk0eDE2IFBhcmFsbGVsIEFERHMgdXNpbmcgU2F0dXJhdGlvbiBhcml0aG1ldGljCisJYW5kIEltcGxpZWQgZGVzdGluYXRpb24KKyovCisjZGVmaW5lCXBhZGRzaXdfbTJpcih2YXIsIHJzKQkJbW14X20yaXIocGFkZHNpdywgdmFyLCBycykKKyNkZWZpbmUJcGFkZHNpd19yMmlyKHJzMSwgcnMyKQkJbW14X3IyaXIocGFkZHNpdywgcnMxLCByczIpCisjZGVmaW5lCXBhZGRzaXcodmFycywgdmFyZCkJCW1teF9tMm0ocGFkZHNpdywgdmFycywgdmFyZCkKKworCisvKgk0eDE2IFBhcmFsbGVsIFNVQnMgdXNpbmcgU2F0dXJhdGlvbiBhcml0aG1ldGljCisJYW5kIEltcGxpZWQgZGVzdGluYXRpb24KKyovCisjZGVmaW5lCXBzdWJzaXdfbTJpcih2YXIsIHJzKQkJbW14X20yaXIocHN1YnNpdywgdmFyLCBycykKKyNkZWZpbmUJcHN1YnNpd19yMmlyKHJzMSwgcnMyKQkJbW14X3IyaXIocHN1YnNpdywgcnMxLCByczIpCisjZGVmaW5lCXBzdWJzaXcodmFycywgdmFyZCkJCW1teF9tMm0ocHN1YnNpdywgdmFycywgdmFyZCkKKworCisvKgk0eDE2IFBhcmFsbGVsIE1VTHMgZ2l2aW5nIEhpZ2ggNHgxNiBwb3J0aW9ucyBvZiByZXN1bHRzCisJUm91bmRlZCB3aXRoIDEvMiBiaXQgMTUuCisqLworI2RlZmluZQlwbXVsaHJ3X20ycih2YXIsIHJlZykJbW14X20ycihwbXVsaHJ3LCB2YXIsIHJlZykKKyNkZWZpbmUJcG11bGhyd19yMnIocmVncywgcmVnZCkJbW14X3IycihwbXVsaHJ3LCByZWdzLCByZWdkKQorI2RlZmluZQlwbXVsaHJ3KHZhcnMsIHZhcmQpCW1teF9tMm0ocG11bGhydywgdmFycywgdmFyZCkKKworCisvKgk0eDE2IFBhcmFsbGVsIE1VTHMgZ2l2aW5nIEhpZ2ggNHgxNiBwb3J0aW9ucyBvZiByZXN1bHRzCisJUm91bmRlZCB3aXRoIDEvMiBiaXQgMTUsIHN0b3JpbmcgdG8gSW1wbGllZCByZWdpc3RlcgorKi8KKyNkZWZpbmUJcG11bGhyaXdfbTJpcih2YXIsIHJzKQkJbW14X20yaXIocG11bGhyaXcsIHZhciwgcnMpCisjZGVmaW5lCXBtdWxocml3X3IyaXIocnMxLCByczIpCQltbXhfcjJpcihwbXVsaHJpdywgcnMxLCByczIpCisjZGVmaW5lCXBtdWxocml3KHZhcnMsIHZhcmQpCQltbXhfbTJtKHBtdWxocml3LCB2YXJzLCB2YXJkKQorCisKKy8qCTR4MTYgUGFyYWxsZWwgTXVscyAoYW5kIEFDY3VtdWxhdGUpIGdpdmluZyBIaWdoIDR4MTYgcG9ydGlvbnMKKwlvZiByZXN1bHRzIFJvdW5kZWQgd2l0aCAxLzIgYml0IDE1LCBhY2N1bXVsYXRpbmcgd2l0aCBJbXBsaWVkIHJlZ2lzdGVyCisqLworI2RlZmluZQlwbWFjaHJpd19tMmlyKHZhciwgcnMpCQltbXhfbTJpcihwbWFjaHJpdywgdmFyLCBycykKKyNkZWZpbmUJcG1hY2hyaXdfcjJpcihyczEsIHJzMikJCW1teF9yMmlyKHBtYWNocml3LCByczEsIHJzMikKKyNkZWZpbmUJcG1hY2hyaXcodmFycywgdmFyZCkJCW1teF9tMm0ocG1hY2hyaXcsIHZhcnMsIHZhcmQpCisKKworLyoJOHg4dSBQYXJhbGxlbCBBVkVyYWdlCisqLworI2RlZmluZQlwYXZlYl9tMnIodmFyLCByZWcpCW1teF9tMnIocGF2ZWIsIHZhciwgcmVnKQorI2RlZmluZQlwYXZlYl9yMnIocmVncywgcmVnZCkJbW14X3IycihwYXZlYiwgcmVncywgcmVnZCkKKyNkZWZpbmUJcGF2ZWIodmFycywgdmFyZCkJbW14X20ybShwYXZlYiwgdmFycywgdmFyZCkKKworCisvKgk4eDh1IFBhcmFsbGVsIERJU1RhbmNlIGFuZCBhY2N1bXVsYXRlIHdpdGgKKwl1bnNpZ25lZCBzYXR1cmF0aW9uIHRvIEltcGxpZWQgcmVnaXN0ZXIKKyovCisjZGVmaW5lCXBkaXN0aWJfbTJpcih2YXIsIHJzKQkJbW14X20yaXIocGRpc3RpYiwgdmFyLCBycykKKyNkZWZpbmUJcGRpc3RpYih2YXJzLCB2YXJkKQkJbW14X20ybShwZGlzdGliLCB2YXJzLCB2YXJkKQorCisKKy8qCTh4OCBQYXJhbGxlbCBjb25kaXRpb25hbCBNb1ZlCisJaWYgaW1wbGllZCByZWdpc3RlciBmaWVsZCBpcyBaZXJvCisqLworI2RlZmluZQlwbXZ6Yl9tMmlyKHZhciwgcnMpCQltbXhfbTJpcihwbXZ6YiwgdmFyLCBycykKKworCisvKgk4eDggUGFyYWxsZWwgY29uZGl0aW9uYWwgTW9WZQorCWlmIGltcGxpZWQgcmVnaXN0ZXIgZmllbGQgaXMgTm90IFplcm8KKyovCisjZGVmaW5lCXBtdm56Yl9tMmlyKHZhciwgcnMpCQltbXhfbTJpcihwbXZuemIsIHZhciwgcnMpCisKKworLyoJOHg4IFBhcmFsbGVsIGNvbmRpdGlvbmFsIE1vVmUKKwlpZiBpbXBsaWVkIHJlZ2lzdGVyIGZpZWxkIGlzIExlc3MgdGhhbiBaZXJvCisqLworI2RlZmluZQlwbXZsemJfbTJpcih2YXIsIHJzKQkJbW14X20yaXIocG12bHpiLCB2YXIsIHJzKQorCisKKy8qCTh4OCBQYXJhbGxlbCBjb25kaXRpb25hbCBNb1ZlCisJaWYgaW1wbGllZCByZWdpc3RlciBmaWVsZCBpcyBHcmVhdGVyIHRoYW4gb3IgRXF1YWwgdG8gWmVybworKi8KKyNkZWZpbmUJcG12Z2V6Yl9tMmlyKHZhciwgcnMpCQltbXhfbTJpcihwbXZnZXpiLCB2YXIsIHJzKQorCisKKy8qCUZhc3QgRW1wdHkgTU14IFN0YXRlCisJKHVzZWQgdG8gY2xlYW4tdXAgd2hlbiBnb2luZyBmcm9tIG1teCB0byBmbG9hdCB1c2UKKwkgb2YgdGhlIHJlZ2lzdGVycyB0aGF0IGFyZSBzaGFyZWQgYnkgYm90aDsgbm90ZSB0aGF0CisJIHRoZXJlIGlzIG5vIGZsb2F0LXRvLXhtbXggb3BlcmF0aW9uIG5lZWRlZCwgYmVjYXVzZQorCSBvbmx5IHRoZSBmbG9hdCB0YWcgd29yZCBpbmZvIGlzIGNvcnJ1cHRpYmxlKQorKi8KKyNpZmRlZglYTU1YX1RSQUNFCisKKyNkZWZpbmUJZmVtbXMoKSBcCisJeyBcCisJCWZwcmludGYoc3RkZXJyLCAiZmVtbXMoKVxuIik7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJmZW1tcyIpOyBcCisJfQorCisjZWxzZQorCisjZGVmaW5lCWZlbW1zKCkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImZlbW1zIikKKworI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9nc3QvZ29vbTJrMS8uZ2l0aWdub3JlIGIvZ3N0L2dvb20yazEvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDFkNzgwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20yazEvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDggQEAKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorKi5vCisqLmxvCisqLmxhCisuZGVwcworLmxpYnMKKwpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20yazEvTWFrZWZpbGUuYW0gYi9nc3QvZ29vbTJrMS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzViYjcxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20yazEvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyOSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0Z29vbTJrMS5sYQorCitHT09NX0ZJTFRFUl9GSUxFUyA9IGZpbHRlcnMuYworR09PTV9GSUxURVJfQ0ZMQUdTID0gLVVNTVggLVVVU0VfQVNNCisKK25vaW5zdF9IRUFERVJTID0gZ3N0Z29vbS5oIGZpbHRlcnMuaCBnb29tX2NvcmUuaCBnb29tX3Rvb2xzLmggZ3JhcGhpYy5oIGxpbmVzLmgKKworbGliZ3N0Z29vbTJrMV9sYV9TT1VSQ0VTID0gZ3N0Z29vbS5jIGdvb21fY29yZS5jICQoR09PTV9GSUxURVJfRklMRVMpIGdyYXBoaWMuYyBcCisgICAgICAgICBsaW5lcy5jCisKK2xpYmdzdGdvb20yazFfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgJChHT09NX0ZJTFRFUl9DRkxBR1MpIFwKKwktRGdzdF9nb29tX2dldF90eXBlPWdzdF9nb29tMmsxX2dldF90eXBlCQlcCisJLURnb29tX2luaXQ9Z29vbTJrMV9pbml0CQkJCVwKKwktRGdvb21fY2xvc2U9Z29vbTJrMV9jbG9zZSAtRGdvb21fdXBkYXRlPWdvb20yazFfdXBkYXRlCVwKKwktRGdvb21fc2V0X3Jlc29sdXRpb249Z29vbTJrMV9zZXRfcmVzb2x1dGlvbgkJXAorCS1EZ29vbV9saW5lcz1nb29tMmsxX2xpbmVzCQkJCVwKKwktREJMQUNLPUdPT00ySzFfQkxBQ0sgLURXSElURT1HT09NMksxX1dISVRFCQlcCisJLURSRUQ9R09PTTJLMV9SRUQgLURCTFVFPUdPT00ySzFfQkxVRQkJCVwKKwktREdSRUVOPUdPT00ySzFfR1JFRU4gLURZRUxMT1c9R09PTTJLMV9ZRUxMT1cJCVwKKwktRE9SQU5HRT1HT09NMksxX09SQU5HRSAtRFZJT0xFVD1HT09NMksxX1ZJT0xFVAkJXAorCS1Eem9vbUZpbHRlckZhc3RSR0I9em9vbUZpbHRlckZhc3RSR0IyazEJCVwKKwktRHBvaW50RmlsdGVyPXBvaW50RmlsdGVyMmsxCQkJCVwKKwktRHpvb21GaWx0ZXJEZXN0cm95PXpvb21GaWx0ZXJEZXN0cm95MmsxCQlcCisJLUR6b29tRmlsdGVyTmV3PXpvb21GaWx0ZXJOZXcyazEKKworbGliZ3N0Z29vbTJrMV9sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RwYnV0aWxzLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoTElCTSkKK2xpYmdzdGdvb20yazFfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitFWFRSQV9ESVNUID0gZmlsdGVycy5jCmRpZmYgLS1naXQgYS9nc3QvZ29vbTJrMS9SRUFETUUgYi9nc3QvZ29vbTJrMS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyY2YxYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tMmsxL1JFQURNRQpAQCAtMCwwICsxLDUgQEAKK1RoZSBHb29tIHBsdWdpbiBpcyBiYXNlZCBvbiB0aGUgR29vbSB2aXN1YWxpemF0aW9uIGNvZGUgZnJvbQordGhlIEdvb20gaG9tZXBhZ2UgZm91bmQgYXQ6IAoraHR0cDovL2lvcy5mcmVlLmZyLz9wYWdlPXByb2pldCZxdW9pPTEgCisKK0xpa2UgdGhlIG9yaWdpbmFsIGxpYnJhcnkgc28gaXMgdGhlIEdvb20gcGx1Z2luIGF2YWlsYWJsZSB1bmRlciB0aGUgTEdQTCBsaWNlbnNlCmRpZmYgLS1naXQgYS9nc3QvZ29vbTJrMS9maWx0ZXJzLmMgYi9nc3QvZ29vbTJrMS9maWx0ZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QxYjkyYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tMmsxL2ZpbHRlcnMuYwpAQCAtMCwwICsxLDUzMSBAQAorLyogZmlsdGVyLmMgdmVyc2lvbiAwLjcKKyAqIGNvbnRpZW50IGxlcyBmaWx0cmVzIGFwcGxpY2FibGUgYSB1biBidWZmZXIKKyAqIGNyZWF0aW9uIDogMDEvMTAvMjAwMAorICogIC1ham91dCBkZSBzaW5GaWx0ZXIoKQorICogIC1ham91dCBkZSB6b29tRmlsdGVyKCkKKyAqICAtY29waWUgZGUgem9vbUZpbHRlcigpIGVuIHpvb21GaWx0ZXJSR0IoKSwgZ8OpcmFudCBsZXMgMyBjb3VsZXVycworICogIC1vcHRpbWlzYXRpb24gZGUgc2luRmlsdGVyICh1dGlsaXNhbnQgdW5lIHRhYmxlIGRlIHNpbikKKyAqICAgICAgLWFzbQorICogICAgICAtb3B0aW1pc2F0aW9uIGRlIGxhIHByb2NlZHVyZSBkZSBnw6luw6lyYXRpb24gZHUgYnVmZmVyIGRlIHRyYW5zZm9ybWF0aW9uCisgKiAgICAgICAgICAgICAgbGEgdml0ZXNzZSBlc3QgbWFpbnRlbmFudCBjb21wcmlzZSBkYW5zIFswLi4xMjhdIGF1IGxpZXUgZGUgWzAuLjEwMF0KKyovCisKKy8qI2RlZmluZSBfREVCVUdfUElYRUw7ICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImZpbHRlcnMuaCIKKyNpbmNsdWRlICJncmFwaGljLmgiCisjaW5jbHVkZSAiZ29vbV90b29scy5oIgorI2luY2x1ZGUgImdvb21fY29yZS5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgTU1YCisjZGVmaW5lIFVTRV9BU00KKyNlbmRpZgorI2lmZGVmIFBPV0VSUEMKKyNkZWZpbmUgVVNFX0FTTQorI2VuZGlmCisKKyNpZmRlZiBVU0VfQVNNCisjZGVmaW5lIEVGRkVDVF9ESVNUT1JTIDQKKyNlbHNlCisjZGVmaW5lIEVGRkVDVF9ESVNUT1JTIDEwCisjZW5kaWYKKworCisjaWZkZWYgVVNFX0FTTQorCisjaWZkZWYgTU1YCitpbnQgbW14X3pvb20gKCk7CitndWludDMyIG1teF96b29tX3NpemU7CisjZW5kaWYgLyogTU1YICovCisKKyNpZmRlZiBQT1dFUlBDCitleHRlcm4gdW5zaWduZWQgaW50IHVzZUFsdGl2ZWM7CitleHRlcm4gdm9pZCBwcGNfem9vbSAodm9pZCk7CitleHRlcm4gdm9pZCBwcGNfem9vbV9hbHRpdmVjICh2b2lkKTsKK3Vuc2lnbmVkIGludCBwcGNzaXplNDsKKyNlbmRpZiAvKiBQb3dlclBDICovCisKKwordW5zaWduZWQgaW50ICpjb2VmZnMgPSAwLCAqZnJlZWNvZWZmcyA9IDA7CitndWludDMyICpleHBpeDEgPSAwOyAgICAgICAgICAgIC8qIHBvaW50ZXVyIGV4cG9ydGUgdmVycyBwMSAqLworZ3VpbnQzMiAqZXhwaXgyID0gMDsgICAgICAgICAgICAvKiBwb2ludGV1ciBleHBvcnRlIHZlcnMgcDIgKi8KK2d1aW50MzIgem9vbV93aWR0aDsKKyNlbmRpZiAvKiBBU00gKi8KKworCitzdGF0aWMgaW50IGZpcnN0VGltZSA9IDE7CitzdGF0aWMgaW50IHNpbnRhYmxlWzB4ZmZmZl07CisKK1pvb21GaWx0ZXJEYXRhICoKK3pvb21GaWx0ZXJOZXcgKHZvaWQpCit7CisgIFpvb21GaWx0ZXJEYXRhICp6ZiA9IG1hbGxvYyAoc2l6ZW9mIChab29tRmlsdGVyRGF0YSkpOworCisgIHpmLT52aXRlc3NlID0gMTI4OworICB6Zi0+cGVydGVkZWMgPSA4OworICB6Zi0+c3FydHBlcnRlID0gMTY7CisgIHpmLT5taWRkbGVYID0gMTsKKyAgemYtPm1pZGRsZVkgPSAxOworICB6Zi0+cmV2ZXJzZSA9IDA7CisgIHpmLT5tb2RlID0gV0FWRV9NT0RFOworICB6Zi0+aFBsYW5lRWZmZWN0ID0gMDsKKyAgemYtPnZQbGFuZUVmZmVjdCA9IDA7CisgIHpmLT5ub2lzaWZ5ID0gMDsKKyAgemYtPmJ1ZmZzaXplID0gMDsKKyAgemYtPnJlc194ID0gMDsKKyAgemYtPnJlc195ID0gMDsKKworICB6Zi0+YnVmZmVyID0gTlVMTDsKKyAgemYtPmZpcmVkZWMgPSBOVUxMOworCisgIHpmLT53YXZlID0gMDsKKyAgemYtPndhdmVzcCA9IDA7CisKKyAgcmV0dXJuIHpmOworfQorCisvKiByZXRvdXJuZSB4Pj5zICwgZW4gdGVzdGFudCBsZSBzaWduZSBkZSB4ICovCitzdGF0aWMgaW5saW5lIGludAorU2hpZnRSaWdodCAoaW50IHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgcykKK3sKKyAgaWYgKHggPCAwKQorICAgIHJldHVybiAtKC14ID4+IHMpOworICBlbHNlCisgICAgcmV0dXJuIHggPj4gczsKK30KKworLyoKKyAgY2FsY3VsZXIgcHggZXQgcHkgZW4gZm9uY3Rpb24gZGUgeCx5LG1pZGRsZVgsbWlkZGxlWSBldCB0aGVNb2RlCisgIHB4IGV0IHB5IGluZGlxdWUgbGEgbm91dmVsbGUgcG9zaXRpb24gKGVuIHNxcnRwZXJ0ZSBpZW1lIGRlIHBpeGVsKQorICAodmFsZXVyICogMTYpCisqLworc3RhdGljIHZvaWQKK2NhbGN1bGF0ZVBYYW5kUFkgKEdvb21EYXRhICogZ2QsIGludCB4LCBpbnQgeSwgaW50ICpweCwgaW50ICpweSkKK3sKKyAgWm9vbUZpbHRlckRhdGEgKnpmID0gZ2QtPnpmZDsKKyAgaW50IG1pZGRsZVgsIG1pZGRsZVk7CisgIGd1aW50MzIgcmVzb2x5ID0gemYtPnJlc195OworICBpbnQgdlBsYW5lRWZmZWN0ID0gemYtPnZQbGFuZUVmZmVjdDsKKyAgaW50IGhQbGFuZUVmZmVjdCA9IHpmLT5oUGxhbmVFZmZlY3Q7CisgIGludCB2aXRlc3NlID0gemYtPnZpdGVzc2U7CisgIGNoYXIgdGhlTW9kZSA9IHpmLT5tb2RlOworCisgIGlmICh0aGVNb2RlID09IFdBVEVSX01PREUpIHsKKyAgICBpbnQgd2F2ZXNwID0gemYtPndhdmVzcDsKKyAgICBpbnQgd2F2ZSA9IHpmLT53YXZlOworICAgIGludCB5eSA9IHkgKyBSQU5EIChnZCkgJSA0ICsgd2F2ZSAvIDEwOworCisgICAgeXkgLT0gUkFORCAoZ2QpICUgNDsKKyAgICBpZiAoeXkgPCAwKQorICAgICAgeXkgPSAwOworICAgIGlmICh5eSA+PSByZXNvbHkpCisgICAgICB5eSA9IHJlc29seSAtIDE7CisKKyAgICAqcHggPSAoeCA8PCA0KSArIHpmLT5maXJlZGVjW3l5XSArICh3YXZlIC8gMTApOworICAgICpweSA9ICh5IDw8IDQpICsgMTMyIC0gKCh2aXRlc3NlIDwgMTMyKSA/IHZpdGVzc2UgOiAxMzEpOworCisgICAgd2F2ZXNwICs9IFJBTkQgKGdkKSAlIDM7CisgICAgd2F2ZXNwIC09IFJBTkQgKGdkKSAlIDM7CisgICAgaWYgKHdhdmUgPCAtMTApCisgICAgICB3YXZlc3AgKz0gMjsKKyAgICBpZiAod2F2ZSA+IDEwKQorICAgICAgd2F2ZXNwIC09IDI7CisgICAgd2F2ZSArPSAod2F2ZXNwIC8gMTApICsgUkFORCAoZ2QpICUgMzsKKyAgICB3YXZlIC09IFJBTkQgKGdkKSAlIDM7CisgICAgaWYgKHdhdmVzcCA+IDEwMCkKKyAgICAgIHdhdmVzcCA9ICh3YXZlc3AgKiA5KSAvIDEwOworCisgICAgemYtPndhdmVzcCA9IHdhdmVzcDsKKyAgICB6Zi0+d2F2ZSA9IHdhdmU7CisgIH0gZWxzZSB7CisgICAgaW50IGRpc3Q7CisgICAgcmVnaXN0ZXIgaW50IHZ4LCB2eTsKKyAgICBpbnQgZnZpdGVzc2UgPSB2aXRlc3NlIDw8IDQ7CisKKyAgICBtaWRkbGVYID0gemYtPm1pZGRsZVg7CisgICAgbWlkZGxlWSA9IHpmLT5taWRkbGVZOworCisgICAgaWYgKHpmLT5ub2lzaWZ5KSB7CisgICAgICB4ICs9IFJBTkQgKGdkKSAlIHpmLT5ub2lzaWZ5OworICAgICAgeCAtPSBSQU5EIChnZCkgJSB6Zi0+bm9pc2lmeTsKKyAgICAgIHkgKz0gUkFORCAoZ2QpICUgemYtPm5vaXNpZnk7CisgICAgICB5IC09IFJBTkQgKGdkKSAlIHpmLT5ub2lzaWZ5OworICAgIH0KKworICAgIGlmIChoUGxhbmVFZmZlY3QpCisgICAgICB2eCA9ICgoeCAtIG1pZGRsZVgpIDw8IDkpICsgaFBsYW5lRWZmZWN0ICogKHkgLSBtaWRkbGVZKTsKKyAgICBlbHNlCisgICAgICB2eCA9ICh4IC0gbWlkZGxlWCkgPDwgOTsKKworICAgIGlmICh2UGxhbmVFZmZlY3QpCisgICAgICB2eSA9ICgoeSAtIG1pZGRsZVkpIDw8IDkpICsgdlBsYW5lRWZmZWN0ICogKHggLSBtaWRkbGVYKTsKKyAgICBlbHNlCisgICAgICB2eSA9ICh5IC0gbWlkZGxlWSkgPDwgOTsKKworICAgIHN3aXRjaCAodGhlTW9kZSkgeworICAgICAgY2FzZSBXQVZFX01PREU6CisgICAgICAgIGRpc3QgPQorICAgICAgICAgICAgU2hpZnRSaWdodCAodngsIDkpICogU2hpZnRSaWdodCAodngsIDkpICsgU2hpZnRSaWdodCAodnksCisgICAgICAgICAgICA5KSAqIFNoaWZ0UmlnaHQgKHZ5LCA5KTsKKyAgICAgICAgZnZpdGVzc2UgKj0KKyAgICAgICAgICAgIDEwMjQgKworICAgICAgICAgICAgU2hpZnRSaWdodCAoc2ludGFibGVbKHVuc2lnbmVkIHNob3J0KSAoMHhmZmZmICogZGlzdCAqCisgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9ESVNUT1JTKV0sIDYpOworICAgICAgICBmdml0ZXNzZSAvPSAxMDI0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ1JZU1RBTF9CQUxMX01PREU6CisgICAgICAgIGRpc3QgPQorICAgICAgICAgICAgU2hpZnRSaWdodCAodngsIDkpICogU2hpZnRSaWdodCAodngsIDkpICsgU2hpZnRSaWdodCAodnksCisgICAgICAgICAgICA5KSAqIFNoaWZ0UmlnaHQgKHZ5LCA5KTsKKyAgICAgICAgZnZpdGVzc2UgKz0gKGRpc3QgKiBFRkZFQ1RfRElTVE9SUyA+PiAxMCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBTVVMRVRURV9NT0RFOgorICAgICAgICBkaXN0ID0KKyAgICAgICAgICAgIFNoaWZ0UmlnaHQgKHZ4LCA5KSAqIFNoaWZ0UmlnaHQgKHZ4LCA5KSArIFNoaWZ0UmlnaHQgKHZ5LAorICAgICAgICAgICAgOSkgKiBTaGlmdFJpZ2h0ICh2eSwgOSk7CisgICAgICAgIGZ2aXRlc3NlIC09IChkaXN0ICogRUZGRUNUX0RJU1RPUlMgPj4gNCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTQ1JVTkNIX01PREU6CisgICAgICAgIGRpc3QgPQorICAgICAgICAgICAgU2hpZnRSaWdodCAodngsIDkpICogU2hpZnRSaWdodCAodngsIDkpICsgU2hpZnRSaWdodCAodnksCisgICAgICAgICAgICA5KSAqIFNoaWZ0UmlnaHQgKHZ5LCA5KTsKKyAgICAgICAgZnZpdGVzc2UgLT0gKGRpc3QgKiBFRkZFQ1RfRElTVE9SUyA+PiA5KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICh2eCA8IDApCisgICAgICAqcHggPSAobWlkZGxlWCA8PCA0KSAtICgtKHZ4ICogZnZpdGVzc2UpID4+IDE2KTsKKyAgICBlbHNlCisgICAgICAqcHggPSAobWlkZGxlWCA8PCA0KSArICgodnggKiBmdml0ZXNzZSkgPj4gMTYpOworICAgIGlmICh2eSA8IDApCisgICAgICAqcHkgPSAobWlkZGxlWSA8PCA0KSAtICgtKHZ5ICogZnZpdGVzc2UpID4+IDE2KTsKKyAgICBlbHNlCisgICAgICAqcHkgPSAobWlkZGxlWSA8PCA0KSArICgodnkgKiBmdml0ZXNzZSkgPj4gMTYpOworICB9Cit9CisKKy8qI2RlZmluZSBfREVCVUcgKi8KKworc3RhdGljIGlubGluZSB2b2lkCitzZXRQaXhlbFJHQiAoVWludCAqIGJ1ZmZlciwgVWludCB4LCBVaW50IHksIENvbG9yIGMsCisgICAgZ3VpbnQzMiByZXNvbHgsIGd1aW50MzIgcmVzb2x5KQoreworLyogICAgICAgICAgICAgIGJ1ZmZlclsgeSpXSURUSCArIHggXSA9IChjLnI8PDE2KXwoYy52PDw4KXxjLmIgKi8KKyNpZmRlZiBfREVCVUdfUElYRUwKKyAgaWYgKHggKyB5ICogcmVzb2x4ID49IHJlc29seCAqIHJlc29seSkgeworICAgIGZwcmludGYgKHN0ZGVyciwgInNldFBpeGVsIEVSUk9SIDogaG9ycyBkdSB0YWJsZWF1Li4uICVpLCAlaVxuIiwgeCwgeSk7CisgICAgLypleGl0ICgxKSA7ICovCisgIH0KKyNlbmRpZgorCisjaWZkZWYgVVNFX0RHQQorICBidWZmZXJbeSAqIHJlc29seCArIHhdID0gKGMuYiA8PCAxNikgfCAoYy52IDw8IDgpIHwgYy5yOworI2Vsc2UKKyAgYnVmZmVyW3kgKiByZXNvbHggKyB4XSA9IChjLnIgPDwgMTYpIHwgKGMudiA8PCA4KSB8IGMuYjsKKyNlbmRpZgorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2V0UGl4ZWxSR0JfIChVaW50ICogYnVmZmVyLCBVaW50IHgsIENvbG9yIGMsIGd1aW50MzIgcmVzb2x4LCBndWludDMyIHJlc29seSkKK3sKKyNpZmRlZiBfREVCVUcKKyAgaWYgKHggPj0gcmVzb2x4ICogcmVzb2x5KSB7CisgICAgcHJpbnRmICgic2V0UGl4ZWwgRVJST1IgOiBob3JzIGR1IHRhYmxlYXUuLi4gJWkgPj0gJWkqJWkgKCVpKVxuIiwgeCwgcmVzb2x4LAorICAgICAgICByZXNvbHksIHJlc29seCAqIHJlc29seSk7CisgICAgZXhpdCAoMSk7CisgIH0KKyNlbmRpZgorCisjaWZkZWYgVVNFX0RHQQorICBidWZmZXJbeF0gPSAoYy5iIDw8IDE2KSB8IChjLnYgPDwgOCkgfCBjLnI7CisjZWxzZQorICBidWZmZXJbeF0gPSAoYy5yIDw8IDE2KSB8IChjLnYgPDwgOCkgfCBjLmI7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkCitnZXRQaXhlbFJHQl8gKFVpbnQgKiBidWZmZXIsIFVpbnQgeCwgQ29sb3IgKiBjLCBndWludDMyIHJlc29seCwgZ3VpbnQzMiByZXNvbHkpCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnRtcDg7CisKKyNpZmRlZiBfREVCVUcKKyAgaWYgKHggPj0gcmVzb2x4ICogcmVzb2x5KSB7CisgICAgcHJpbnRmICgiZ2V0UGl4ZWwgRVJST1IgOiBob3JzIGR1IHRhYmxlYXUuLi4gJWlcbiIsIHgpOworICAgIGV4aXQgKDEpOworICB9CisjZW5kaWYKKworI2lmZGVmIF9fQklHX0VORElBTl9fCisgIGMtPmIgPSAqKHVuc2lnbmVkIGNoYXIgKikgKHRtcDggPSAodW5zaWduZWQgY2hhciAqKSAoYnVmZmVyICsgeCkpOworICBjLT5yID0gKih1bnNpZ25lZCBjaGFyICopICgrK3RtcDgpOworICBjLT52ID0gKih1bnNpZ25lZCBjaGFyICopICgrK3RtcDgpOworICBjLT5iID0gKih1bnNpZ25lZCBjaGFyICopICgrK3RtcDgpOworCisjZWxzZQorICAvKiBBVFRFTlRJT04gQVUgUEVUSVQgSU5ESUVOICAqLworICB0bXA4ID0gKHVuc2lnbmVkIGNoYXIgKikgKGJ1ZmZlciArIHgpOworICBjLT5iID0gKih1bnNpZ25lZCBjaGFyICopICh0bXA4KyspOworICBjLT52ID0gKih1bnNpZ25lZCBjaGFyICopICh0bXA4KyspOworICBjLT5yID0gKih1bnNpZ25lZCBjaGFyICopICh0bXA4KTsKKy8qICAgICAgKmMgPSAoQ29sb3IpIGJ1ZmZlclt4K3kqV0lEVEhdIDsgKi8KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorem9vbUZpbHRlclNldFJlc29sdXRpb24gKEdvb21EYXRhICogZ2QsIFpvb21GaWx0ZXJEYXRhICogemYpCit7CisgIHVuc2lnbmVkIHNob3J0IHVzOworCisgIGlmICh6Zi0+YnVmZnNpemUgPj0gZ2QtPmJ1ZmZzaXplKSB7CisgICAgemYtPnJlc194ID0gZ2QtPnJlc29seDsKKyAgICB6Zi0+cmVzX3kgPSBnZC0+cmVzb2x5OworICAgIHpmLT5taWRkbGVYID0gZ2QtPnJlc29seCAvIDI7CisgICAgemYtPm1pZGRsZVkgPSBnZC0+cmVzb2x5IC0gMTsKKworICAgIHJldHVybjsKKyAgfQorI2lmbmRlZiBVU0VfQVNNCisgIGlmICh6Zi0+YnVmZmVyKQorICAgIGZyZWUgKHpmLT5idWZmZXIpOworICB6Zi0+YnVmZmVyID0gMDsKKyNlbHNlCisgIGlmIChjb2VmZnMpCisgICAgZnJlZSAoZnJlZWNvZWZmcyk7CisgIGNvZWZmcyA9IDA7CisjZW5kaWYKKyAgemYtPm1pZGRsZVggPSBnZC0+cmVzb2x4IC8gMjsKKyAgemYtPm1pZGRsZVkgPSBnZC0+cmVzb2x5IC0gMTsKKyAgemYtPnJlc194ID0gZ2QtPnJlc29seDsKKyAgemYtPnJlc195ID0gZ2QtPnJlc29seTsKKworICBpZiAoemYtPmZpcmVkZWMpCisgICAgZnJlZSAoemYtPmZpcmVkZWMpOworICB6Zi0+ZmlyZWRlYyA9IDA7CisKKyAgemYtPmJ1ZmZzaXplID0gZ2QtPnJlc29seCAqIGdkLT5yZXNvbHkgKiBzaXplb2YgKHVuc2lnbmVkIGludCk7CisKKyNpZmRlZiBVU0VfQVNNCisgIGZyZWVjb2VmZnMgPSAodW5zaWduZWQgaW50ICopCisgICAgICBtYWxsb2MgKHJlc3ggKiByZXN5ICogMiAqIHNpemVvZiAodW5zaWduZWQgaW50KSArIDEyOCk7CisgIGNvZWZmcyA9IChndWludDMyICopICgoMSArICgodW5zaWduZWQgaW50KSAoZnJlZWNvZWZmcykpIC8gMTI4KSAqIDEyOCk7CisKKyNlbHNlCisgIHpmLT5idWZmZXIgPSBjYWxsb2MgKHNpemVvZiAoZ3VpbnQzMiksIHpmLT5idWZmc2l6ZSAqIDUpOworICB6Zi0+cG9zMTAgPSB6Zi0+YnVmZmVyOworICB6Zi0+Y1swXSA9IHpmLT5wb3MxMCArIHpmLT5idWZmc2l6ZTsKKyAgemYtPmNbMV0gPSB6Zi0+Y1swXSArIHpmLT5idWZmc2l6ZTsKKyAgemYtPmNbMl0gPSB6Zi0+Y1sxXSArIHpmLT5idWZmc2l6ZTsKKyAgemYtPmNbM10gPSB6Zi0+Y1syXSArIHpmLT5idWZmc2l6ZTsKKyNlbmRpZgorICB6Zi0+ZmlyZWRlYyA9IChpbnQgKikgbWFsbG9jICh6Zi0+cmVzX3kgKiBzaXplb2YgKGludCkpOworCisgIGlmIChmaXJzdFRpbWUpIHsKKyAgICBmaXJzdFRpbWUgPSAwOworCisgICAgLyogZ2VuZXJhdGlvbiBkJ3VuZSB0YWJsZSBkZSBzaW51cyAqLworICAgIGZvciAodXMgPSAwOyB1cyA8IDB4ZmZmZjsgdXMrKykgeworICAgICAgc2ludGFibGVbdXNdID0gKGludCkgKDEwMjQuMGYgKiBzaW4gKHVzICogMiAqIDMuMzE0MTVmIC8gMHhmZmZmKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQKK3pvb21GaWx0ZXJEZXN0cm95IChab29tRmlsdGVyRGF0YSAqIHpmKQoreworICBpZiAoemYpIHsKKyAgICBpZiAoemYtPmZpcmVkZWMpCisgICAgICBmcmVlICh6Zi0+ZmlyZWRlYyk7CisgICAgaWYgKHpmLT5idWZmZXIpCisgICAgICBmcmVlICh6Zi0+YnVmZmVyKTsKKyAgICBmcmVlICh6Zik7CisgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZAorem9vbUZpbHRlckZhc3RSR0IgKEdvb21EYXRhICogZ29vbWRhdGEsIFpvb21GaWx0ZXJEYXRhICogemYsIGludCB6ZmRfdXBkYXRlKQoreworICBndWludDMyIHByZXZYID0gZ29vbWRhdGEtPnJlc29seDsKKyAgZ3VpbnQzMiBwcmV2WSA9IGdvb21kYXRhLT5yZXNvbHk7CisKKyAgZ3VpbnQzMiAqcGl4MSA9IGdvb21kYXRhLT5wMTsKKyAgZ3VpbnQzMiAqcGl4MiA9IGdvb21kYXRhLT5wMjsKKyAgdW5zaWduZWQgaW50ICpwb3MxMDsKKyAgdW5zaWduZWQgaW50ICoqYzsKKworICBVaW50IHgsIHk7CisKKy8qICBzdGF0aWMgdW5zaWduZWQgaW50IHByZXZYID0gMCwgcHJldlkgPSAwOyAqLworCisjaWZkZWYgVVNFX0FTTQorICBleHBpeDEgPSBwaXgxOworICBleHBpeDIgPSBwaXgyOworI2Vsc2UKKyAgQ29sb3IgY291bGV1cjsKKyAgQ29sb3IgY29sMSwgY29sMiwgY29sMywgY29sNDsKKyAgVWludCBwb3NpdGlvbjsKKyNlbmRpZgorCisgIGlmICgoZ29vbWRhdGEtPnJlc29seCAhPSB6Zi0+cmVzX3gpIHx8IChnb29tZGF0YS0+cmVzb2x5ICE9IHpmLT5yZXNfeSkpIHsKKyAgICB6b29tRmlsdGVyU2V0UmVzb2x1dGlvbiAoZ29vbWRhdGEsIHpmKTsKKyAgfQorCisgIHBvczEwID0gemYtPnBvczEwOworICBjID0gemYtPmM7CisKKyAgaWYgKHpmZF91cGRhdGUpIHsKKyAgICBndWNoYXIgc3FydHBlcnRlID0gemYtPnNxcnRwZXJ0ZTsKKyAgICBnaW50IHN0YXJ0X3kgPSAwOworCisgICAgaWYgKHpmLT5yZXZlcnNlKQorICAgICAgemYtPnZpdGVzc2UgPSAyNTYgLSB6Zi0+dml0ZXNzZTsKKworICAgIC8qIGdlbmVyYXRpb24gZHUgYnVmZmVyICovCisgICAgZm9yICh5ID0gMDsgeSA8IHpmLT5yZXNfeTsgeSsrKSB7CisgICAgICBnaW50IHlfMTYgPSB5IDw8IDQ7CisgICAgICBnaW50IG1heF9weCA9IChwcmV2WCAtIDEpICogc3FydHBlcnRlOworICAgICAgZ2ludCBtYXhfcHkgPSAocHJldlkgLSAxKSAqIHNxcnRwZXJ0ZTsKKworICAgICAgZm9yICh4ID0gMDsgeCA8IHpmLT5yZXNfeDsgeCsrKSB7CisgICAgICAgIGdpbnQgcHgsIHB5OworICAgICAgICBndWNoYXIgY29lZnYsIGNvZWZoOworCisgICAgICAgIC8qIGNhbGN1bGVyIHB4IGV0IHB5IGVuIGZvbmN0aW9uIGRlICovCisgICAgICAgIC8qICAgeCx5LG1pZGRsZVgsbWlkZGxlWSBldCB0aGVNb2RlICovCisgICAgICAgIGNhbGN1bGF0ZVBYYW5kUFkgKGdvb21kYXRhLCB4LCB5LCAmcHgsICZweSk7CisKKyAgICAgICAgaWYgKChweCA9PSB4IDw8IDQpICYmIChweSA9PSB5XzE2KSkKKyAgICAgICAgICBweSArPSA4OworCisgICAgICAgIGlmICgocHkgPCAwKSB8fCAocHggPCAwKSB8fCAocHkgPj0gbWF4X3B5KSB8fCAocHggPj0gbWF4X3B4KSkgeworI2lmZGVmIFVTRV9BU00KKyAgICAgICAgICBjb2VmZnNbKHkgKiBwcmV2WCArIHgpICogMl0gPSAwOworICAgICAgICAgIGNvZWZmc1soeSAqIHByZXZYICsgeCkgKiAyICsgMV0gPSAwOworI2Vsc2UKKyAgICAgICAgICBwb3MxMFtzdGFydF95ICsgeF0gPSAwOworICAgICAgICAgIGNbMF1bc3RhcnRfeSArIHhdID0gMDsKKyAgICAgICAgICBjWzFdW3N0YXJ0X3kgKyB4XSA9IDA7CisgICAgICAgICAgY1syXVtzdGFydF95ICsgeF0gPSAwOworICAgICAgICAgIGNbM11bc3RhcnRfeSArIHhdID0gMDsKKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGludCBucHgxMDsKKyAgICAgICAgICBpbnQgbnB5MTA7CisgICAgICAgICAgaW50IHBvczsKKworICAgICAgICAgIG5weDEwID0gKHB4IC8gc3FydHBlcnRlKTsKKyAgICAgICAgICBucHkxMCA9IChweSAvIHNxcnRwZXJ0ZSk7CisKKy8qICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5weDEwID49IHByZXZYKSBmcHJpbnRmKHN0ZGVyciwiZXJyb3IgbnB4OiVkIixucHgxMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChucHkxMCA+PSBwcmV2WSkgZnByaW50ZihzdGRlcnIsImVycm9yIG5weTolZCIsbnB5MTApOworKi8KKyAgICAgICAgICBjb2VmaCA9IHB4ICUgc3FydHBlcnRlOworICAgICAgICAgIGNvZWZ2ID0gcHkgJSBzcXJ0cGVydGU7CisjaWZkZWYgVVNFX0FTTQorICAgICAgICAgIHBvcyA9ICh5ICogcHJldlggKyB4KSAqIDI7CisgICAgICAgICAgY29lZmZzW3Bvc10gPSAobnB4MTAgKyBwcmV2WCAqIG5weTEwKSAqIDQ7CisKKyAgICAgICAgICBpZiAoIShjb2VmaCB8fCBjb2VmdikpCisgICAgICAgICAgICBjb2VmZnNbcG9zICsgMV0gPSAoc3FydHBlcnRlICogc3FydHBlcnRlIC0gMSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgY29lZmZzW3BvcyArIDFdID0gKChzcXJ0cGVydGUgLSBjb2VmaCkgKiAoc3FydHBlcnRlIC0gY29lZnYpKTsKKworICAgICAgICAgIGNvZWZmc1twb3MgKyAxXSB8PSAoY29lZmggKiAoc3FydHBlcnRlIC0gY29lZnYpKSA8PCA4OworICAgICAgICAgIGNvZWZmc1twb3MgKyAxXSB8PSAoKHNxcnRwZXJ0ZSAtIGNvZWZoKSAqIGNvZWZ2KSA8PCAxNjsKKyAgICAgICAgICBjb2VmZnNbcG9zICsgMV0gfD0gKGNvZWZoICogY29lZnYpIDw8IDI0OworI2Vsc2UKKyAgICAgICAgICBwb3MgPSBzdGFydF95ICsgeDsKKyAgICAgICAgICBwb3MxMFtwb3NdID0gbnB4MTAgKyBwcmV2WCAqIG5weTEwOworCisgICAgICAgICAgaWYgKCEoY29lZmggfHwgY29lZnYpKQorICAgICAgICAgICAgY1swXVtwb3NdID0gc3FydHBlcnRlICogc3FydHBlcnRlIC0gMTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBjWzBdW3Bvc10gPSAoc3FydHBlcnRlIC0gY29lZmgpICogKHNxcnRwZXJ0ZSAtIGNvZWZ2KTsKKworICAgICAgICAgIGNbMV1bcG9zXSA9IGNvZWZoICogKHNxcnRwZXJ0ZSAtIGNvZWZ2KTsKKyAgICAgICAgICBjWzJdW3Bvc10gPSAoc3FydHBlcnRlIC0gY29lZmgpICogY29lZnY7CisgICAgICAgICAgY1szXVtwb3NdID0gY29lZmggKiBjb2VmdjsKKyNlbmRpZgorICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBBZHZhbmNlIHN0YXJ0IG9mIGxpbmUgaW5kZXggKi8KKyAgICAgIHN0YXJ0X3kgKz0gcHJldlg7CisgICAgfQorICB9CisjaWZkZWYgVVNFX0FTTQorI2lmZGVmIE1NWAorICB6b29tX3dpZHRoID0gcHJldlg7CisgIG1teF96b29tX3NpemUgPSBwcmV2WCAqIHByZXZZOworICBtbXhfem9vbSAoKTsKKyNlbmRpZgorCisjaWZkZWYgUE9XRVJQQworICB6b29tX3dpZHRoID0gcHJldlg7CisgIGlmICh1c2VBbHRpdmVjKSB7CisgICAgcHBjc2l6ZTQgPSAoKHVuc2lnbmVkIGludCkgKHByZXZYICogcHJldlkpKSAvIDQ7CisgICAgcHBjX3pvb21fYWx0aXZlYyAoKTsKKyAgfSBlbHNlIHsKKyAgICBwcGNzaXplNCA9ICgodW5zaWduZWQgaW50KSAocHJldlggKiBwcmV2WSkpOworICAgIHBwY196b29tICgpOworICB9CisjZW5kaWYKKyNlbHNlCisgIGZvciAocG9zaXRpb24gPSAwOyBwb3NpdGlvbiA8IHByZXZYICogcHJldlk7IHBvc2l0aW9uKyspIHsKKyAgICBnZXRQaXhlbFJHQl8gKHBpeDEsIHBvczEwW3Bvc2l0aW9uXSwgJmNvbDEsIGdvb21kYXRhLT5yZXNvbHgsCisgICAgICAgIGdvb21kYXRhLT5yZXNvbHkpOworICAgIGdldFBpeGVsUkdCXyAocGl4MSwgcG9zMTBbcG9zaXRpb25dICsgMSwgJmNvbDIsIGdvb21kYXRhLT5yZXNvbHgsCisgICAgICAgIGdvb21kYXRhLT5yZXNvbHkpOworICAgIGdldFBpeGVsUkdCXyAocGl4MSwgcG9zMTBbcG9zaXRpb25dICsgcHJldlgsICZjb2wzLCBnb29tZGF0YS0+cmVzb2x4LAorICAgICAgICBnb29tZGF0YS0+cmVzb2x5KTsKKyAgICBnZXRQaXhlbFJHQl8gKHBpeDEsIHBvczEwW3Bvc2l0aW9uXSArIHByZXZYICsgMSwgJmNvbDQsIGdvb21kYXRhLT5yZXNvbHgsCisgICAgICAgIGdvb21kYXRhLT5yZXNvbHkpOworCisgICAgY291bGV1ci5yID0gY29sMS5yICogY1swXVtwb3NpdGlvbl0KKyAgICAgICAgKyBjb2wyLnIgKiBjWzFdW3Bvc2l0aW9uXQorICAgICAgICArIGNvbDMuciAqIGNbMl1bcG9zaXRpb25dCisgICAgICAgICsgY29sNC5yICogY1szXVtwb3NpdGlvbl07CisgICAgY291bGV1ci5yID4+PSB6Zi0+cGVydGVkZWM7CisKKyAgICBjb3VsZXVyLnYgPSBjb2wxLnYgKiBjWzBdW3Bvc2l0aW9uXQorICAgICAgICArIGNvbDIudiAqIGNbMV1bcG9zaXRpb25dCisgICAgICAgICsgY29sMy52ICogY1syXVtwb3NpdGlvbl0KKyAgICAgICAgKyBjb2w0LnYgKiBjWzNdW3Bvc2l0aW9uXTsKKyAgICBjb3VsZXVyLnYgPj49IHpmLT5wZXJ0ZWRlYzsKKworICAgIGNvdWxldXIuYiA9IGNvbDEuYiAqIGNbMF1bcG9zaXRpb25dCisgICAgICAgICsgY29sMi5iICogY1sxXVtwb3NpdGlvbl0KKyAgICAgICAgKyBjb2wzLmIgKiBjWzJdW3Bvc2l0aW9uXQorICAgICAgICArIGNvbDQuYiAqIGNbM11bcG9zaXRpb25dOworICAgIGNvdWxldXIuYiA+Pj0gemYtPnBlcnRlZGVjOworCisgICAgc2V0UGl4ZWxSR0JfIChwaXgyLCBwb3NpdGlvbiwgY291bGV1ciwgZ29vbWRhdGEtPnJlc29seCwgZ29vbWRhdGEtPnJlc29seSk7CisgIH0KKyNlbmRpZgorfQorCisKK3ZvaWQKK3BvaW50RmlsdGVyIChHb29tRGF0YSAqIGdvb21kYXRhLCBDb2xvciBjLAorICAgIGZsb2F0IHQxLCBmbG9hdCB0MiwgZmxvYXQgdDMsIGZsb2F0IHQ0LCBVaW50IGN5Y2xlKQoreworICBVaW50ICpwaXgxID0gZ29vbWRhdGEtPnAxOworICBab29tRmlsdGVyRGF0YSAqemYgPSBnb29tZGF0YS0+emZkOworICBVaW50IHggPSAoVWludCkgKHpmLT5taWRkbGVYICsgKGludCkgKHQxICogY29zICgoZmxvYXQpIGN5Y2xlIC8gdDMpKSk7CisgIFVpbnQgeSA9IChVaW50KSAoemYtPm1pZGRsZVkgKyAoaW50KSAodDIgKiBzaW4gKChmbG9hdCkgY3ljbGUgLyB0NCkpKTsKKworICBpZiAoKHggPiAxKSAmJiAoeSA+IDEpICYmICh4IDwgZ29vbWRhdGEtPnJlc29seCAtIDIpCisgICAgICAmJiAoeSA8IGdvb21kYXRhLT5yZXNvbHkgLSAyKSkgeworICAgIHNldFBpeGVsUkdCIChwaXgxLCB4ICsgMSwgeSwgYywgZ29vbWRhdGEtPnJlc29seCwgZ29vbWRhdGEtPnJlc29seSk7CisgICAgc2V0UGl4ZWxSR0IgKHBpeDEsIHgsIHkgKyAxLCBjLCBnb29tZGF0YS0+cmVzb2x4LCBnb29tZGF0YS0+cmVzb2x5KTsKKyAgICBzZXRQaXhlbFJHQiAocGl4MSwgeCArIDEsIHkgKyAxLCBXSElURSwgZ29vbWRhdGEtPnJlc29seCwgZ29vbWRhdGEtPnJlc29seSk7CisgICAgc2V0UGl4ZWxSR0IgKHBpeDEsIHggKyAyLCB5ICsgMSwgYywgZ29vbWRhdGEtPnJlc29seCwgZ29vbWRhdGEtPnJlc29seSk7CisgICAgc2V0UGl4ZWxSR0IgKHBpeDEsIHggKyAxLCB5ICsgMiwgYywgZ29vbWRhdGEtPnJlc29seCwgZ29vbWRhdGEtPnJlc29seSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9nb29tMmsxL2ZpbHRlcnMuaCBiL2dzdC9nb29tMmsxL2ZpbHRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDIwMDRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20yazEvZmlsdGVycy5oCkBAIC0wLDAgKzEsODMgQEAKKyNpZm5kZWYgRklMVEVSU19ICisjZGVmaW5lIEZJTFRFUlNfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSAiZ3JhcGhpYy5oIgorI2luY2x1ZGUgImdvb21fY29yZS5oIgorCisjZGVmaW5lIE5PUk1BTF9NT0RFIDAKKyNkZWZpbmUgV0FWRV9NT0RFIDEKKyNkZWZpbmUgQ1JZU1RBTF9CQUxMX01PREUgMgorI2RlZmluZSBTQ1JVTkNIX01PREUgMworI2RlZmluZSBBTVVMRVRURV9NT0RFIDQKKyNkZWZpbmUgV0FURVJfTU9ERSA1CisKK3N0cnVjdCBab29tRmlsdGVyRGF0YQoreworICBpbnQgdml0ZXNzZTsKKyAgdW5zaWduZWQgY2hhciBwZXJ0ZWRlYzsKKyAgdW5zaWduZWQgY2hhciBzcXJ0cGVydGU7CisgIGludCBtaWRkbGVYOworICBpbnQgbWlkZGxlWTsKKyAgY2hhciByZXZlcnNlOworICBjaGFyIG1vZGU7CisgICAgICAgIC8qKiBAc2luY2UgSnVuZSAyMDAxICovCisgIGludCBoUGxhbmVFZmZlY3Q7CisgIGludCB2UGxhbmVFZmZlY3Q7CisgIGNoYXIgbm9pc2lmeTsKKworICBndWludDMyIHJlc194OworICBndWludDMyIHJlc195OworICBndWludDMyIGJ1ZmZzaXplOworCisgIGd1aW50MzIgKmJ1ZmZlcjsKKyAgZ3VpbnQzMiAqcG9zMTA7CisgIGd1aW50MzIgKmNbNF07CisgIGludCAgICAgKmZpcmVkZWM7CisKKyAgaW50ICAgICB3YXZlOworICBpbnQgICAgIHdhdmVzcDsKK307CisKK3ZvaWQgcG9pbnRGaWx0ZXIoR29vbURhdGEgKmdvb21kYXRhLCBDb2xvciBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdDEsIGZsb2F0IHQyLCBmbG9hdCB0MywgZmxvYXQgdDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGN5Y2xlKTsKKworLyogZmlsdHJlIGRlIHpvb20gOgorIGxlIGNvbnRlbnUgZGUgcGl4MSBlc3QgY29waWUgZGFucyBwaXgyLCBhdmVjIGwnZWZmZXQgYXBwbGlxdcOpCisgbWlkeCBldCBtaWR5IHJlcHJlc2VudGUgbGUgY2VudHJlIGR1IHpvb20KKwordm9pZCB6b29tRmlsdGVyKFVpbnQgKnBpeDEsIFVpbnQgKnBpeDIsIFVpbnQgbWlkZGxlWCwgVWludCBtaWRkbGVZKTsKK3ZvaWQgem9vbUZpbHRlclJHQihVaW50ICpwaXgxLAorVWludCAqcGl4MiwKK1VpbnQgbWlkZGxlWCwKK1VpbnQgbWlkZGxlWSk7CisqLworCitab29tRmlsdGVyRGF0YSAqem9vbUZpbHRlck5ldyAodm9pZCk7Cit2b2lkIHpvb21GaWx0ZXJEZXN0cm95IChab29tRmlsdGVyRGF0YSAqemYpOwordm9pZCB6b29tRmlsdGVyRmFzdFJHQiAoR29vbURhdGEgKmdvb21kYXRhLCBab29tRmlsdGVyRGF0YSAqemYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgemZkX3VwZGF0ZSk7CisKKy8qIGZpbHRyZSBzaW4gOgorIGxlIGNvbnRlbnUgZGUgcGl4MSBlc3QgY29waWUgZGFucyBwaXgyLCBhdmVjIGwnZWZmZXQgYXBwbGlxdcOpCisgY3ljbGUgZXN0IGxhIHZhcmlhYmxlIGRlIHRlbXBzLgorIG1vZGUgdmF1dCBTSU5fTVVMIG91IFNJTl9BREQKKyByYXRlIGVzdCBsZSBwb3VyY2VudGFnZSBkZSBsJ2VmZmV0IGFwcGxpcXXDqQorIGxlbmdodCA6IGxhIGxvbmd1ZXVyIGQnb25kZSAoMS4uMTApIFs1XQorIHNwZWVkIDogbGEgdml0ZXNzZSAoMS4uMTAwKSBbMTBdCisqLworLyoKK3ZvaWQgc2luRmlsdGVyKFVpbnQgKnBpeDEsVWludCAqcGl4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVpbnQgY3ljbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50IHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGxlbmdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVpbnQgc3BlZWQpOworKi8KKworI2RlZmluZSBTSU5fTVVMIDEKKyNkZWZpbmUgU0lOX0FERCAyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20yazEvZmlsdGVyc19tbXgucyBiL2dzdC9nb29tMmsxL2ZpbHRlcnNfbW14LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3ZGU1NgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tMmsxL2ZpbHRlcnNfbW14LnMKQEAgLTAsMCArMSwxMzAgQEAKKzsvLyBmaWxlIDogbW14X3pvb20ucworOy8vIGF1dGhvciA6IEpDIEhvZWx0IDxqZWtvQGZyZWUuZnI+Cis7Ly8KKzsvLyBoaXN0b3J5Cis7Ly8gMDcvMDEvMjAwMSA6IENoYW5naW5nIEZFTU1TIHRvIEVNTVMgOiBzbG93ZXIuLi4gYnV0IHJ1biBvbiBpbnRlbCBtYWNoaW5lcworOy8vCTAzLzAxLzIwMDEgOiBXSURUSCBhbmQgSEVJR0hUIGFyZSBub3cgdmFyaWFibGUKKzsvLwkyOC8xMi8yMDAwIDogYWRkaW5nIGNvbW1lbnRzIHRvIHRoZSBjb2RlLCBzdXBwcmVzcyBzb21lIHVzZWxlc3MgbGluZXMKKzsvLwkyNy8xMi8yMDAwIDogcmVkdWNpbmcgbWVtb3J5IGFjY2Vzcy4uLiBpbXByb3ZpbmcgcGVyZm9ybWFuY2UgYnkgMjAlCis7Ly8JCWNvZWZmaWNpZW50cyBhcmUgbm93IG9uIDEgYnl0ZQorOy8vCTIyLzEyLzIwMDAgOiBDaGFuZ2luZyBkYXRhIHN0cnVjdHVyZQorOy8vCTE2LzEyLzIwMDAgOiBBVCZUIHZlcnNpb24KKzsvLwkxNC8xMi8yMDAwIDogdW5yb2xsaW5nIGxvb3AKKzsvLwkxMi8xMi8yMDAwIDogNjQgYml0cyBtZW1vcnkgYWNjZXNzCisKKworLmRhdGEKKwordGhlemVybzoKKwkubG9uZyAweDAwMDAwMDAwCisJLmxvbmcgMHgwMDAwMDAwMAorCisKKy50ZXh0CisKKy5nbG9ibCBtbXhfem9vbQkJOy8vIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgYnkgQyBwcm9ncmFtCisuZXh0ZXJuIGNvZWZmcwkJOy8vIHRoZSB0cmFuc2Zvcm1hdGlvbiBidWZmZXIKKy5leHRlcm4gZXhwaXgxLGV4cGl4MiA7Ly8gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYnVmZmVyCisuZXh0ZXJuIG1teF96b29tX3NpemUsIHpvb21fd2lkdGggOy8vIHNpemUgb2YgdGhlIGJ1ZmZlcnMKKworLmFsaWduIDE2CittbXhfem9vbToKKworcHVzaCAlZWJwCitwdXNoICVlc3AKKworOy8vIGluaXRpYWxpc2F0aW9uIGR1IG1tNyDgIHplcm8KK21vdnEgKHRoZXplcm8pLCAlbW03CisKK21vdmwgem9vbV93aWR0aCwgJWVheAorbW92bCAkNCwgJWVieAorbXVsbCAlZWJ4Cittb3ZsICVlYXgsICVlYnAKKworbW92bCAoY29lZmZzKSwgJWVheAorbW92bCAoZXhwaXgxKSwgJWVkeAorbW92bCAoZXhwaXgyKSwgJWVieAorbW92bCAkMTAsICVlZGkKK21vdmwgbW14X3pvb21fc2l6ZSwgJWVjeAorCisud2hpbGU6CisJOy8vIGVzaSA8LSBub3V2ZWxsZSBwb3NpdGlvbgorCW1vdmwgKCVlYXgpLCAlZXNpCisJbGVhbCAoJWVkeCwgJWVzaSksICVlc2kKKworCTsvLyByZWN1cGVyYXRpb24gZGVzIGRldXggcHJlbWllcnMgcGl4ZWxzIGRhbnMgbW0wIGV0IG1tMQorCW1vdnEgKCVlc2kpLCAlbW0wCQkvKiBiMS12MS1yMS1hMS1iMi12Mi1yMi1hMiAqLworCW1vdnEgJW1tMCwgJW1tMQkJCS8qIGIxLXYxLXIxLWExLWIyLXYyLXIyLWEyICovCisKKwk7Ly8gcmVjdXBlcmF0aW9uIGRlcyA0IGNvZWZmaWNpZW50cworCW1vdmQgNCglZWF4KSwgJW1tNgkJLyogPz8tPz8tPz8tPz8tYzQtYzMtYzItYzEgKi8KKwk7Ly8gZGVwYWNrYWdlIGR1IHByZW1pZXIgcGl4ZWwKKwlwdW5wY2tsYncgJW1tNywgJW1tMAkvKiAwMC1iMi0wMC12Mi0wMC1yMi0wMC1hMiAqLworCisJbW92cSAlbW02LCAlbW01CQkJLyogPz8tPz8tPz8tPz8tYzQtYzMtYzItYzEgKi8KKwk7Ly8gZGVwYWNrYWdlIGR1IDJpZW1lIHBpeGVsCisJcHVucGNraGJ3ICVtbTcsICVtbTEJLyogMDAtYjEtMDAtdjEtMDAtcjEtMDAtYTEgKi8KKworCTsvLyBleHRyYWN0aW9uIGRlcyBjb2VmZmljaWVudHMuLi4KKwlwdW5wY2tsYncgJW1tNSwgJW1tNgkvKiBjNC1jNC1jMy1jMy1jMi1jMi1jMS1jMSAqLworCW1vdnEgJW1tNiwgJW1tNAkJCS8qIGM0LWM0LWMzLWMzLWMyLWMyLWMxLWMxICovCisJbW92cSAlbW02LCAlbW01CQkJLyogYzQtYzQtYzMtYzMtYzItYzItYzEtYzEgKi8KKworCXB1bnBja2xidyAlbW01LCAlbW02CS8qIGMyLWMyLWMyLWMyLWMxLWMxLWMxLWMxICovCisJcHVucGNraGJ3ICVtbTUsICVtbTQJLyogYzQtYzQtYzQtYzQtYzMtYzMtYzMtYzMgKi8KKworCW1vdnEgJW1tNiwgJW1tMwkJCS8qIGMyLWMyLWMyLWMyLWMxLWMxLWMxLWMxICovCisJcHVucGNrbGJ3ICVtbTcsICVtbTYJLyogMDAtYzEtMDAtYzEtMDAtYzEtMDAtYzEgKi8KKwlwdW5wY2toYncgJW1tNywgJW1tMwkvKiAwMC1jMi0wMC1jMi0wMC1jMi0wMC1jMiAqLworCQorCTsvLyBtdWx0aXBsaWNhdGlvbiBkZXMgcGl4ZWxzIHBhciBsZXMgY29lZmZpY2llbnRzCisJcG11bGx3ICVtbTYsICVtbTAJCS8qIGMxKmIyLWMxKnYyLWMxKnIyLWMxKmEyICovCisJcG11bGx3ICVtbTMsICVtbTEJCS8qIGMyKmIxLWMyKnYxLWMyKnIxLWMyKmExICovCisJcGFkZHcgJW1tMSwgJW1tMAorCQorCTsvLyAuLi5leHRyYWN0aW9uIGRlcyAyIGRlcm5pZXJzIGNvZWZmaWNpZW50cworCW1vdnEgJW1tNCwgJW1tNQkJCS8qIGM0LWM0LWM0LWM0LWMzLWMzLWMzLWMzICovCisJcHVucGNrbGJ3ICVtbTcsICVtbTQJLyogMDAtYzMtMDAtYzMtMDAtYzMtMDAtYzMgKi8KKwlwdW5wY2toYncgJW1tNywgJW1tNQkvKiAwMC1jNC0wMC1jNC0wMC1jNC0wMC1jNCAqLworCisJOy8vIHJlY3VwZXJhdGlvbiBkZXMgMiBkZXJuaWVycyBwaXhlbHMKKwltb3ZxICglZXNpLCVlYnApLCAlbW0xCisJbW92cSAlbW0xLCAlbW0yCisJCisJOy8vIGRlcGFja2FnZSBkZXMgcGl4ZWxzCisJcHVucGNrbGJ3ICVtbTcsICVtbTEKKwlwdW5wY2toYncgJW1tNywgJW1tMgorCQorCTsvLyBtdWx0aXBsaWNhdGlvbiBwYXMgbGVzIGNvZWZmcworCXBtdWxsdyAlbW00LCAlbW0xCisJcG11bGx3ICVtbTUsICVtbTIKKwkKKwk7Ly8gYWpvdXQgZGVzIHZhbGV1cnMgb2J0ZW51ZXMg4CBsYSB2YWxldXIgZmluYWxlCisJcGFkZHcgJW1tMSwgJW1tMAorCXBhZGR3ICVtbTIsICVtbTAKKworCTsvLyBkaXZpc2lvbiBwYXIgMjU2ID0gMTYrMTYrMTYrMTYsIHB1aXMgcmVwYWNrYWdlIGR1IHBpeGVsIGZpbmFsCisJcHNybHcgJDgsICVtbTAKKwlwYWNrdXN3YiAlbW03LCAlbW0wCisJCisJOy8vIHBhc3NhZ2UgYXUgc3VpdmFudAorCWxlYWwgOCglZWF4KSwgJWVheAorCisJZGVjbCAlZWN4CisJOy8vIGVucmVnaXN0cmVtZW50IGR1IHJlc3VsdGF0CisJbW92ZCAlbW0wLCAoJWVieCkKKwlsZWFsIDQoJWVieCksICVlYngKKworCTsvLyB0ZXN0IGRlIGZpbiBkdSB0YW50cXVlCisJY21wbCAkMCwgJWVjeAkJCQk7Ly8gNDAweDMwMAorCitqeiAuZmluX3doaWxlCitqbXAgLndoaWxlCisKKy5maW5fd2hpbGU6CitlbW1zCisKK3BvcCAlZXNwCitwb3AgJWVicAorCityZXQgICAgICAgICAgICAgICAgICA7Ly9UaGUgRW5kCmRpZmYgLS1naXQgYS9nc3QvZ29vbTJrMS9nb29tX2NvcmUuYyBiL2dzdC9nb29tMmsxL2dvb21fY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZTY0NzAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbTJrMS9nb29tX2NvcmUuYwpAQCAtMCwwICsxLDQxMSBAQAorI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPGdsaWIuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdvb21fY29yZS5oIgorI2luY2x1ZGUgImdvb21fdG9vbHMuaCIKKyNpbmNsdWRlICJmaWx0ZXJzLmgiCisjaW5jbHVkZSAibGluZXMuaCIKKworLyojZGVmaW5lIFZFUkJPU0UgKi8KKworI2lmZGVmIFZFUkJPU0UKKyNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisKKyNkZWZpbmUgU1RPUF9TUEVFRCAxMjgKKwordm9pZAorZ29vbV9pbml0IChHb29tRGF0YSAqIGdvb21kYXRhLCBndWludDMyIHJlc3gsIGd1aW50MzIgcmVzeSkKK3sKKyNpZmRlZiBWRVJCT1NFCisgIHByaW50ZiAoIkdPT006IGluaXQgKCVkLCAlZCk7XG4iLCByZXN4LCByZXN5KTsKKyNlbmRpZgorICBnb29tZGF0YS0+cmVzb2x4ID0gMDsKKyAgZ29vbWRhdGEtPnJlc29seSA9IDA7CisgIGdvb21kYXRhLT5idWZmc2l6ZSA9IDA7CisKKyAgZ29vbWRhdGEtPnBpeGVsID0gTlVMTDsKKyAgZ29vbWRhdGEtPmJhY2sgPSBOVUxMOworICBnb29tZGF0YS0+cDEgPSBOVUxMOworICBnb29tZGF0YS0+cDIgPSBOVUxMOworCisgIGdvb21fc2V0X3Jlc29sdXRpb24gKGdvb21kYXRhLCByZXN4LCByZXN5KTsKKyAgUkFORF9JTklUIChnb29tZGF0YSwgR1BPSU5URVJfVE9fSU5UIChnb29tZGF0YS0+cGl4ZWwpKTsKKyAgZ29vbWRhdGEtPmN5Y2xlID0gMDsKKworCisgIGdvb21kYXRhLT5nb29tbGltaXQgPSAyOyAgICAgIC8qIHNlbnNpYmlsaXTDqSBkdSBnb29tICovCisgIGdvb21kYXRhLT56ZmQgPSB6b29tRmlsdGVyTmV3ICgpOworICBnb29tZGF0YS0+bG9ja3ZhciA9IDA7ICAgICAgICAvKiBwb3VyIGVtcGVjaGVyIGRlIG5vdXZlYXV4IGNoYW5nZW1lbnRzICovCisgIGdvb21kYXRhLT5nb29tdmFyID0gMDsgICAgICAgIC8qIGJvdWNsZSBkZXMgZ29vbXMgKi8KKyAgZ29vbWRhdGEtPnRvdGFsZ29vbSA9IDA7ICAgICAgLyogbm9tYnJlIGRlIGdvb21zIHBhciBzZWNvbmRzICovCisgIGdvb21kYXRhLT5hZ29vbSA9IDA7ICAgICAgICAgIC8qIHVuIGdvb20gYSBldSBsaWV1Li4gICAgICAgKi8KKyAgZ29vbWRhdGEtPmxvb3B2YXIgPSAwOyAgICAgICAgLyogbW91dmVtZW50IGRlcyBwb2ludHMgKi8KKyAgZ29vbWRhdGEtPnNwZWVkdmFyID0gMDsgICAgICAgLyogdml0ZXNzZSBkZXMgcGFydGljdWxlcyAqLworICBnb29tZGF0YS0+bGluZU1vZGUgPSAwOyAgICAgICAvKiBsJ2VmZmV0IGxpbmVhaXJlIGEgZGVzc2luZXIgKi8KK30KKwordm9pZAorZ29vbV9zZXRfcmVzb2x1dGlvbiAoR29vbURhdGEgKiBnb29tZGF0YSwgZ3VpbnQzMiByZXN4LCBndWludDMyIHJlc3kpCit7CisgIGd1aW50MzIgYnVmZnNpemUgPSByZXN4ICogcmVzeTsKKworICBpZiAoKGdvb21kYXRhLT5yZXNvbHggPT0gcmVzeCkgJiYgKGdvb21kYXRhLT5yZXNvbHkgPT0gcmVzeSkpCisgICAgcmV0dXJuOworCisgIGlmIChnb29tZGF0YS0+YnVmZnNpemUgPCBidWZmc2l6ZSkgeworICAgIGlmIChnb29tZGF0YS0+cGl4ZWwpCisgICAgICBmcmVlIChnb29tZGF0YS0+cGl4ZWwpOworICAgIGlmIChnb29tZGF0YS0+YmFjaykKKyAgICAgIGZyZWUgKGdvb21kYXRhLT5iYWNrKTsKKyAgICBnb29tZGF0YS0+cGl4ZWwgPSAoZ3VpbnQzMiAqKSBtYWxsb2MgKGJ1ZmZzaXplICogc2l6ZW9mIChndWludDMyKSArIDEyOCk7CisgICAgZ29vbWRhdGEtPmJhY2sgPSAoZ3VpbnQzMiAqKSBtYWxsb2MgKGJ1ZmZzaXplICogc2l6ZW9mIChndWludDMyKSArIDEyOCk7CisgICAgZ29vbWRhdGEtPmJ1ZmZzaXplID0gYnVmZnNpemU7CisKKyAgICBnb29tZGF0YS0+cDEgPSAodm9pZCAqKSAoKChndWludHB0cikgZ29vbWRhdGEtPnBpeGVsICsgMHg3ZikgJiAofjB4N2YpKTsKKyAgICBnb29tZGF0YS0+cDIgPSAodm9pZCAqKSAoKChndWludHB0cikgZ29vbWRhdGEtPmJhY2sgKyAweDdmKSAmICh+MHg3ZikpOworICB9CisKKyAgZ29vbWRhdGEtPnJlc29seCA9IHJlc3g7CisgIGdvb21kYXRhLT5yZXNvbHkgPSByZXN5OworCisgIG1lbXNldCAoZ29vbWRhdGEtPnBpeGVsLCAwLCBidWZmc2l6ZSAqIHNpemVvZiAoZ3VpbnQzMikgKyAxMjgpOworICBtZW1zZXQgKGdvb21kYXRhLT5iYWNrLCAwLCBidWZmc2l6ZSAqIHNpemVvZiAoZ3VpbnQzMikgKyAxMjgpOworfQorCitndWludDMyICoKK2dvb21fdXBkYXRlIChHb29tRGF0YSAqIGdvb21kYXRhLCBnaW50MTYgZGF0YVsyXVs1MTJdKQoreworICBndWludDMyICpyZXR1cm5fdmFsOworICBndWludDMyIHBvaW50V2lkdGg7CisgIGd1aW50MzIgcG9pbnRIZWlnaHQ7CisgIGludCBpbmN2YXI7ICAgICAgICAgICAgICAgICAgIC8qIHZvbHVtZSBkdSBzb24gKi8KKyAgaW50IGFjY2VsdmFyOyAgICAgICAgICAgICAgICAgLyogYWNjZWxlcmF0aW9uIGRlcyBwYXJ0aWN1bGVzICovCisgIGludCBpOworICBmbG9hdCBsYXJnZmFjdG9yOyAgICAgICAgICAgICAvKiBlbGFyZ2lzc2VtZW50IGRlIGwnaW50ZXJ2YWxsZSBkJ8Opdm9sdXRpb24gZGVzIHBvaW50cyAqLworICBpbnQgemZkX3VwZGF0ZSA9IDA7CisgIGludCByZXNvbHggPSBnb29tZGF0YS0+cmVzb2x4OworICBpbnQgcmVzb2x5ID0gZ29vbWRhdGEtPnJlc29seTsKKyAgWm9vbUZpbHRlckRhdGEgKnB6ZmQgPSBnb29tZGF0YS0+emZkOworICBndWludDMyICp0bXA7CisKKyAgLyogdGVzdCBpZiB0aGUgY29uZmlnIGhhcyBjaGFuZ2VkLCB1cGRhdGUgaXQgaWYgc28gKi8KKworICBwb2ludFdpZHRoID0gKHJlc29seCAqIDIpIC8gNTsKKyAgcG9pbnRIZWlnaHQgPSAocmVzb2x5ICogMikgLyA1OworCisgIC8qICEgZXR1ZGUgZHUgc2lnbmFsIC4uLiAqLworICBpbmN2YXIgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspIHsKKyAgICBpZiAoaW5jdmFyIDwgZGF0YVswXVtpXSkKKyAgICAgIGluY3ZhciA9IGRhdGFbMF1baV07CisgIH0KKworICBhY2NlbHZhciA9IGluY3ZhciAvIDUwMDA7CisgIGlmIChnb29tZGF0YS0+c3BlZWR2YXIgPiA1KSB7CisgICAgYWNjZWx2YXItLTsKKyAgICBpZiAoZ29vbWRhdGEtPnNwZWVkdmFyID4gMjApCisgICAgICBhY2NlbHZhci0tOworICAgIGlmIChnb29tZGF0YS0+c3BlZWR2YXIgPiA0MCkKKyAgICAgIGdvb21kYXRhLT5zcGVlZHZhciA9IDQwOworICB9CisgIGFjY2VsdmFyLS07CisgIGdvb21kYXRhLT5zcGVlZHZhciArPSBhY2NlbHZhcjsKKworICBpZiAoZ29vbWRhdGEtPnNwZWVkdmFyIDwgMCkKKyAgICBnb29tZGF0YS0+c3BlZWR2YXIgPSAwOworICBpZiAoZ29vbWRhdGEtPnNwZWVkdmFyID4gNDApCisgICAgZ29vbWRhdGEtPnNwZWVkdmFyID0gNDA7CisKKworICAvKiAhIGNhbGN1bCBkdSBkZXBsYWNlbWVudCBkZXMgcGV0aXRzIHBvaW50cyAuLi4gKi8KKworICBsYXJnZmFjdG9yID0KKyAgICAgICgoZmxvYXQpIGdvb21kYXRhLT5zcGVlZHZhciAvIDQwLjBmICsgKGZsb2F0KSBpbmN2YXIgLyA1MDAwMC4wZikgLyAxLjVmOworICBpZiAobGFyZ2ZhY3RvciA+IDEuNWYpCisgICAgbGFyZ2ZhY3RvciA9IDEuNWY7CisKKyAgZm9yIChpID0gMTsgaSAqIDE1IDw9IGdvb21kYXRhLT5zcGVlZHZhciArIDE1OyBpKyspIHsKKyAgICBnb29tZGF0YS0+bG9vcHZhciArPSBnb29tZGF0YS0+c3BlZWR2YXIgKyAxOworCisgICAgcG9pbnRGaWx0ZXIgKGdvb21kYXRhLAorICAgICAgICBZRUxMT1csCisgICAgICAgICgocG9pbnRXaWR0aCAtIDYuMGYpICogbGFyZ2ZhY3RvciArIDUuMGYpLAorICAgICAgICAoKHBvaW50SGVpZ2h0IC0gNi4wZikgKiBsYXJnZmFjdG9yICsgNS4wZiksCisgICAgICAgIGkgKiAxNTIuMGYsIDEyOC4wZiwgZ29vbWRhdGEtPmxvb3B2YXIgKyBpICogMjAzMik7CisgICAgcG9pbnRGaWx0ZXIgKGdvb21kYXRhLCBPUkFOR0UsCisgICAgICAgICgocG9pbnRXaWR0aCAvIDIpICogbGFyZ2ZhY3RvcikgLyBpICsgMTAuMGYgKiBpLAorICAgICAgICAoKHBvaW50SGVpZ2h0IC8gMikgKiBsYXJnZmFjdG9yKSAvIGkgKyAxMC4wZiAqIGksCisgICAgICAgIDk2LjBmLCBpICogODAuMGYsIGdvb21kYXRhLT5sb29wdmFyIC8gaSk7CisgICAgcG9pbnRGaWx0ZXIgKGdvb21kYXRhLCBWSU9MRVQsCisgICAgICAgICgocG9pbnRIZWlnaHQgLyAzICsgNS4wZikgKiBsYXJnZmFjdG9yKSAvIGkgKyAxMC4wZiAqIGksCisgICAgICAgICgocG9pbnRIZWlnaHQgLyAzICsgNS4wZikgKiBsYXJnZmFjdG9yKSAvIGkgKyAxMC4wZiAqIGksCisgICAgICAgIGkgKyAxMjIuMGYsIDEzNC4wZiwgZ29vbWRhdGEtPmxvb3B2YXIgLyBpKTsKKyAgICBwb2ludEZpbHRlciAoZ29vbWRhdGEsIEJMQUNLLAorICAgICAgICAoKHBvaW50SGVpZ2h0IC8gMykgKiBsYXJnZmFjdG9yICsgMjAuMGYpLAorICAgICAgICAoKHBvaW50SGVpZ2h0IC8gMykgKiBsYXJnZmFjdG9yICsgMjAuMGYpLAorICAgICAgICA1OC4wZiwgaSAqIDY2LjBmLCBnb29tZGF0YS0+bG9vcHZhciAvIGkpOworICAgIHBvaW50RmlsdGVyIChnb29tZGF0YSwgV0hJVEUsCisgICAgICAgIChwb2ludEhlaWdodCAqIGxhcmdmYWN0b3IgKyAxMC4wZiAqIGkpIC8gaSwKKyAgICAgICAgKHBvaW50SGVpZ2h0ICogbGFyZ2ZhY3RvciArIDEwLjBmICogaSkgLyBpLAorICAgICAgICA2Ni4wZiwgNzQuMGYsIGdvb21kYXRhLT5sb29wdmFyICsgaSAqIDUwMCk7CisgIH0KKworICAvKiBkaW1pbnVlciBkZSAxIGxlIHRlbXBzIGRlIGxvY2thZ2UgKi8KKyAgLyogbm90ZSBwb3VyIGNldXggcXVpIG4nb250IHBhcyBzdWl2aXMgOiBsZSBsb2NrdmFyIHBlcm1ldCBkJ2VtcGVjaGVyIHVuICovCisgIC8qIGNoYW5nZW1lbnQgZCdldGF0IGR1IHBsdWdpbnMganVzdGUgYXByZXMgdW4gYXV0cmUgY2hhbmdlbWVudCBkJ2V0YXQuIG9raSA/ICovCisgIGlmICgtLWdvb21kYXRhLT5sb2NrdmFyIDwgMCkKKyAgICBnb29tZGF0YS0+bG9ja3ZhciA9IDA7CisKKyAgLyogdGVtcHMgZHUgZ29vbSAqLworICBpZiAoLS1nb29tZGF0YS0+YWdvb20gPCAwKQorICAgIGdvb21kYXRhLT5hZ29vbSA9IDA7CisKKyAgLyogb24gdmVyaWZpZSBxdSdpbCBuZSBzZSBwYXMgdW4gdHJ1YyBpbnRlcnJlc3NhbnQgYXZlYyBsZSBzb24uICovCisgIGlmICgoYWNjZWx2YXIgPiBnb29tZGF0YS0+Z29vbWxpbWl0KSB8fCAoYWNjZWx2YXIgPCAtZ29vbWRhdGEtPmdvb21saW1pdCkpIHsKKyAgICAvKiBVTiBHT09NICEhISBZQUhPTyAhICovCisgICAgZ29vbWRhdGEtPnRvdGFsZ29vbSsrOworICAgIGdvb21kYXRhLT5hZ29vbSA9IDIwOyAgICAgICAvKiBtYWlzIHBkdCAyMCBjeWNsZXMsIGlsIG4neSBlbiBhdXJhIHBsdXMuICovCisgICAgZ29vbWRhdGEtPmxpbmVNb2RlID0gKGdvb21kYXRhLT5saW5lTW9kZSArIDEpICUgMjA7IC8qIFRvdXMgbGVzIDEwIGdvb21zIG9uIGNoYW5nZSBkZSBtb2RlIGxpbmVhaXJlICovCisKKyAgICAvKiBjaGFuZ2VtZW50IGV2ZW50dWVsIGRlIG1vZGUgKi8KKyAgICBzd2l0Y2ggKGlSQU5EIChnb29tZGF0YSwgMTApKSB7CisgICAgICBjYXNlIDA6CisgICAgICBjYXNlIDE6CisgICAgICBjYXNlIDI6CisgICAgICAgIHB6ZmQtPm1vZGUgPSBXQVZFX01PREU7CisgICAgICAgIHB6ZmQtPnZpdGVzc2UgPSBTVE9QX1NQRUVEIC0gMTsKKyAgICAgICAgcHpmZC0+cmV2ZXJzZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOgorICAgICAgY2FzZSA0OgorICAgICAgICBwemZkLT5tb2RlID0gQ1JZU1RBTF9CQUxMX01PREU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1OgorICAgICAgICBwemZkLT5tb2RlID0gQU1VTEVUVEVfTU9ERTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDY6CisgICAgICAgIHB6ZmQtPm1vZGUgPSBXQVRFUl9NT0RFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgcHpmZC0+bW9kZSA9IFNDUlVOQ0hfTU9ERTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBwemZkLT5tb2RlID0gTk9STUFMX01PREU7CisgICAgfQorICB9CisKKyAgLyogdG91dCBjZWNpIG5lIHNlcmEgZmFpdCBxdSdlbiBjYXMgZGUgbm9uLWJsb2NhZ2UgKi8KKyAgaWYgKGdvb21kYXRhLT5sb2NrdmFyID09IDApIHsKKyAgICAvKiByZXBlcmFnZSBkZSBnb29tIChhY2NlbGVyYXRpb24gZm9ydGUgZGUgbCdhY2NlbGVyYXRpb24gZHUgdm9sdW1lKSAqLworICAgIC8qIC0+IGNvdXAgZGUgYm9vc3QgZGUgbGEgdml0ZXNzZSBzaSBiZXNvaW4uLiAqLworICAgIGlmICgoYWNjZWx2YXIgPiBnb29tZGF0YS0+Z29vbWxpbWl0KSB8fCAoYWNjZWx2YXIgPCAtZ29vbWRhdGEtPmdvb21saW1pdCkpIHsKKyAgICAgIGdvb21kYXRhLT5nb29tdmFyKys7CisgICAgICAvKmlmIChnb29tdmFyICUgMSA9PSAwKSAqLworICAgICAgeworICAgICAgICBndWludDMyIHZ0bXA7CisgICAgICAgIGd1aW50MzIgbmV3dml0OworCisgICAgICAgIG5ld3ZpdCA9IFNUT1BfU1BFRUQgLSBnb29tZGF0YS0+c3BlZWR2YXIgLyAyOworICAgICAgICAvKiByZXRhYmxpciBsZSB6b29tIGF2YW50Li4gKi8KKyAgICAgICAgaWYgKChwemZkLT5yZXZlcnNlKSAmJiAoIShnb29tZGF0YS0+Y3ljbGUgJSAxMikpICYmIChyYW5kICgpICUgMyA9PSAwKSkgeworICAgICAgICAgIHB6ZmQtPnJldmVyc2UgPSAwOworICAgICAgICAgIHB6ZmQtPnZpdGVzc2UgPSBTVE9QX1NQRUVEIC0gMjsKKyAgICAgICAgICBnb29tZGF0YS0+bG9ja3ZhciA9IDUwOworICAgICAgICB9CisgICAgICAgIGlmIChpUkFORCAoZ29vbWRhdGEsIDEwKSA9PSAwKSB7CisgICAgICAgICAgcHpmZC0+cmV2ZXJzZSA9IDE7CisgICAgICAgICAgZ29vbWRhdGEtPmxvY2t2YXIgPSAxMDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBjaGFuZ2VtZW50IGRlIG1pbGlldS4uICovCisgICAgICAgIHN3aXRjaCAoaVJBTkQgKGdvb21kYXRhLCAyMCkpIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBwemZkLT5taWRkbGVZID0gcmVzb2x5IC0gMTsKKyAgICAgICAgICAgIHB6ZmQtPm1pZGRsZVggPSByZXNvbHggLyAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcHpmZC0+bWlkZGxlWCA9IHJlc29seCAtIDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBwemZkLT5taWRkbGVYID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwemZkLT5taWRkbGVZID0gcmVzb2x5IC8gMjsKKyAgICAgICAgICAgIHB6ZmQtPm1pZGRsZVggPSByZXNvbHggLyAyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHB6ZmQtPm1vZGUgPT0gV0FURVJfTU9ERSkgeworICAgICAgICAgIHB6ZmQtPm1pZGRsZVggPSByZXNvbHggLyAyOworICAgICAgICAgIHB6ZmQtPm1pZGRsZVkgPSByZXNvbHkgLyAyOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoICh2dG1wID0gKGlSQU5EIChnb29tZGF0YSwgMjcpKSkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHB6ZmQtPnZQbGFuZUVmZmVjdCA9IGlSQU5EIChnb29tZGF0YSwgMyk7CisgICAgICAgICAgICBwemZkLT52UGxhbmVFZmZlY3QgLT0gaVJBTkQgKGdvb21kYXRhLCAzKTsKKyAgICAgICAgICAgIHB6ZmQtPmhQbGFuZUVmZmVjdCA9IGlSQU5EIChnb29tZGF0YSwgMyk7CisgICAgICAgICAgICBwemZkLT5oUGxhbmVFZmZlY3QgLT0gaVJBTkQgKGdvb21kYXRhLCAzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHB6ZmQtPnZQbGFuZUVmZmVjdCA9IDA7CisgICAgICAgICAgICBwemZkLT5oUGxhbmVFZmZlY3QgPSBpUkFORCAoZ29vbWRhdGEsIDgpOworICAgICAgICAgICAgcHpmZC0+aFBsYW5lRWZmZWN0IC09IGlSQU5EIChnb29tZGF0YSwgOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBwemZkLT52UGxhbmVFZmZlY3QgPSBpUkFORCAoZ29vbWRhdGEsIDUpOworICAgICAgICAgICAgcHpmZC0+dlBsYW5lRWZmZWN0IC09IGlSQU5EIChnb29tZGF0YSwgNSk7CisgICAgICAgICAgICBwemZkLT5oUGxhbmVFZmZlY3QgPSAtcHpmZC0+dlBsYW5lRWZmZWN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgcHpmZC0+aFBsYW5lRWZmZWN0ID0gNSArIGlSQU5EIChnb29tZGF0YSwgOCk7CisgICAgICAgICAgICBwemZkLT52UGxhbmVFZmZlY3QgPSAtcHpmZC0+aFBsYW5lRWZmZWN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgcHpmZC0+dlBsYW5lRWZmZWN0ID0gNSArIGlSQU5EIChnb29tZGF0YSwgOCk7CisgICAgICAgICAgICBwemZkLT5oUGxhbmVFZmZlY3QgPSAtcHpmZC0+aFBsYW5lRWZmZWN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgIHB6ZmQtPmhQbGFuZUVmZmVjdCA9IDA7CisgICAgICAgICAgICBwemZkLT52UGxhbmVFZmZlY3QgPSBpUkFORCAoZ29vbWRhdGEsIDEwKTsKKyAgICAgICAgICAgIHB6ZmQtPnZQbGFuZUVmZmVjdCAtPSBpUkFORCAoZ29vbWRhdGEsIDEwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAodnRtcCA8IDEwKSB7CisgICAgICAgICAgICAgIHB6ZmQtPnZQbGFuZUVmZmVjdCA9IDA7CisgICAgICAgICAgICAgIHB6ZmQtPmhQbGFuZUVmZmVjdCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaVJBTkQgKGdvb21kYXRhLCAzKSAhPSAwKQorICAgICAgICAgIHB6ZmQtPm5vaXNpZnkgPSAwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBwemZkLT5ub2lzaWZ5ID0gaVJBTkQgKGdvb21kYXRhLCAzKSArIDI7CisgICAgICAgICAgZ29vbWRhdGEtPmxvY2t2YXIgKj0gMzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwemZkLT5tb2RlID09IEFNVUxFVFRFX01PREUpIHsKKyAgICAgICAgICBwemZkLT52UGxhbmVFZmZlY3QgPSAwOworICAgICAgICAgIHB6ZmQtPmhQbGFuZUVmZmVjdCA9IDA7CisgICAgICAgICAgcHpmZC0+bm9pc2lmeSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHB6ZmQtPm1pZGRsZVggPT0gMSkgfHwgKHB6ZmQtPm1pZGRsZVggPT0gcmVzb2x4IC0gMSkpIHsKKyAgICAgICAgICBwemZkLT52UGxhbmVFZmZlY3QgPSAwOworICAgICAgICAgIHB6ZmQtPmhQbGFuZUVmZmVjdCA9IGlSQU5EIChnb29tZGF0YSwgMikgPyAwIDogcHpmZC0+aFBsYW5lRWZmZWN0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld3ZpdCA8IHB6ZmQtPnZpdGVzc2UpIHsgICAvKiBvbiBhY2NlbGVyZSAqLworICAgICAgICAgIHpmZF91cGRhdGUgPSAxOworICAgICAgICAgIGlmICgoKG5ld3ZpdCA8IFNUT1BfU1BFRUQgLSA3KSAmJgorICAgICAgICAgICAgICAgICAgKHB6ZmQtPnZpdGVzc2UgPCBTVE9QX1NQRUVEIC0gNikgJiYKKyAgICAgICAgICAgICAgICAgIChnb29tZGF0YS0+Y3ljbGUgJSAzID09IDApKSB8fCAoaVJBTkQgKGdvb21kYXRhLCA0MCkgPT0gMCkpIHsKKyAgICAgICAgICAgIHB6ZmQtPnZpdGVzc2UgPSBTVE9QX1NQRUVEIC0gMTsKKyAgICAgICAgICAgIHB6ZmQtPnJldmVyc2UgPSAhcHpmZC0+cmV2ZXJzZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHpmZC0+dml0ZXNzZSA9IChuZXd2aXQgKyBwemZkLT52aXRlc3NlICogNCkgLyA1OworICAgICAgICAgIH0KKyAgICAgICAgICBnb29tZGF0YS0+bG9ja3ZhciArPSA1MDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvKiBtb2RlIG1lZ2EtbGVudCAqLworICAgIGlmIChpUkFORCAoZ29vbWRhdGEsIDEwMDApID09IDApIHsKKyAgICAgIC8qIAorICAgICAgICAgcHJpbnRmICgiY291cCBkdSBzb3J0Li4uXG4iKSA7CisgICAgICAgKi8KKyAgICAgIHpmZF91cGRhdGUgPSAxOworICAgICAgcHpmZC0+dml0ZXNzZSA9IFNUT1BfU1BFRUQgLSAxOworICAgICAgcHpmZC0+cGVydGVkZWMgPSA4OworICAgICAgcHpmZC0+c3FydHBlcnRlID0gMTY7CisgICAgICBnb29tZGF0YS0+Z29vbXZhciA9IDE7CisgICAgICBnb29tZGF0YS0+bG9ja3ZhciArPSA3MDsKKyAgICB9CisgIH0KKworICAvKiBncm9zIGZyZWluIHNpIGxhIG11c2lxdWUgZXN0IGNhbG1lICovCisgIGlmICgoZ29vbWRhdGEtPnNwZWVkdmFyIDwgMSkgJiYgKHB6ZmQtPnZpdGVzc2UgPCBTVE9QX1NQRUVEIC0gNCkKKyAgICAgICYmIChnb29tZGF0YS0+Y3ljbGUgJSAxNiA9PSAwKSkgeworICAgIC8qCisgICAgICAgcHJpbnRmICgiKytzbG93IHBhcnQuLi4gJWlcbiIsIHpmZC52aXRlc3NlKSA7CisgICAgICovCisgICAgemZkX3VwZGF0ZSA9IDE7CisgICAgcHpmZC0+dml0ZXNzZSArPSAzOworICAgIHB6ZmQtPnBlcnRlZGVjID0gODsKKyAgICBwemZkLT5zcXJ0cGVydGUgPSAxNjsKKyAgICBnb29tZGF0YS0+Z29vbXZhciA9IDA7CisgICAgLyoKKyAgICAgICBwcmludGYgKCItLXNsb3cgcGFydC4uLiAlaVxuIiwgemZkLnZpdGVzc2UpIDsKKyAgICAgKi8KKyAgfQorCisgIC8qIGJhaXNzZXIgcmVndWxpZXJlbWVudCBsYSB2aXRlc3NlLi4uICovCisgIGlmICgoZ29vbWRhdGEtPmN5Y2xlICUgNzMgPT0gMCkgJiYgKHB6ZmQtPnZpdGVzc2UgPCBTVE9QX1NQRUVEIC0gNSkpIHsKKyAgICAvKgorICAgICAgIHByaW50ZiAoInNsb3cgZG93bi4uLlxuIikgOworICAgICAqLworICAgIHpmZF91cGRhdGUgPSAxOworICAgIHB6ZmQtPnZpdGVzc2UrKzsKKyAgfQorCisgIC8qIGFycmV0ZXIgZGUgZGVjcsOpbWVudGVyIGF1IGJvdXQgZCd1biBjZXJ0YWluIHRlbXBzICovCisgIGlmICgoZ29vbWRhdGEtPmN5Y2xlICUgMTAxID09IDApICYmIChwemZkLT5wZXJ0ZWRlYyA9PSA3KSkgeworICAgIHpmZF91cGRhdGUgPSAxOworICAgIHB6ZmQtPnBlcnRlZGVjID0gODsKKyAgICBwemZkLT5zcXJ0cGVydGUgPSAxNjsKKyAgfQorCisgIC8qIFpvb20gaGVyZSAhICovCisgIHpvb21GaWx0ZXJGYXN0UkdCIChnb29tZGF0YSwgcHpmZCwgemZkX3VwZGF0ZSk7CisKKyAgLyogc2kgb24gZXN0IGRhbnMgdW4gZ29vbSA6IGFmZmljaGVyIGxlcyBsaWduZXMuLi4gKi8KKyAgaWYgKGdvb21kYXRhLT5hZ29vbSA+IDE1KQorICAgIGdvb21fbGluZXMgKGdvb21kYXRhLCBkYXRhLCAoKHB6ZmQtPm1pZGRsZVggPT0gcmVzb2x4IC8gMikKKyAgICAgICAgICAgICYmIChwemZkLT5taWRkbGVZID09IHJlc29seSAvIDIpCisgICAgICAgICAgICAmJiAocHpmZC0+bW9kZSAhPSBXQVRFUl9NT0RFKSkKKyAgICAgICAgPyAoZ29vbWRhdGEtPmxpbmVNb2RlIC8gMTApIDogMCwgZ29vbWRhdGEtPnAyLCBnb29tZGF0YS0+YWdvb20gLSAxNSk7CisKKyAgcmV0dXJuX3ZhbCA9IGdvb21kYXRhLT5wMjsKKyAgdG1wID0gZ29vbWRhdGEtPnAxOworICBnb29tZGF0YS0+cDEgPSBnb29tZGF0YS0+cDI7CisgIGdvb21kYXRhLT5wMiA9IHRtcDsKKworICAvKiBhZmZpY2hhZ2UgZXQgc3dhcHBhZ2UgZGVzIGJ1ZmZlcnMuLiAqLworICBnb29tZGF0YS0+Y3ljbGUrKzsKKworICAvKiB0b3VzIGxlcyAxMDAgY3ljbGVzIDogdsOpcmlmaWVyIHNpIGxlIHRhdXggZGUgZ29vbSBlc3QgY29ycmVjdCAqLworICAvKiBldCBsZSBtb2RpZmllciBzaW5vbi4uICovCisgIGlmICghKGdvb21kYXRhLT5jeWNsZSAlIDEwMCkpIHsKKyAgICBpZiAoZ29vbWRhdGEtPnRvdGFsZ29vbSA+IDE1KSB7CisgICAgICAvKiAgcHJpbnRmICgibGVzcyBnb29tc1xuIikgOyAqLworICAgICAgZ29vbWRhdGEtPmdvb21saW1pdCsrOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoKGdvb21kYXRhLT50b3RhbGdvb20gPT0gMCkgJiYgKGdvb21kYXRhLT5nb29tbGltaXQgPiAxKSkKKyAgICAgICAgZ29vbWRhdGEtPmdvb21saW1pdC0tOworICAgIH0KKyAgICBnb29tZGF0YS0+dG90YWxnb29tID0gMDsKKyAgfQorICByZXR1cm4gcmV0dXJuX3ZhbDsKK30KKwordm9pZAorZ29vbV9jbG9zZSAoR29vbURhdGEgKiBnb29tZGF0YSkKK3sKKyAgaWYgKGdvb21kYXRhLT5waXhlbCAhPSBOVUxMKQorICAgIGZyZWUgKGdvb21kYXRhLT5waXhlbCk7CisgIGlmIChnb29tZGF0YS0+YmFjayAhPSBOVUxMKQorICAgIGZyZWUgKGdvb21kYXRhLT5iYWNrKTsKKyAgaWYgKGdvb21kYXRhLT56ZmQgIT0gTlVMTCkgeworICAgIHpvb21GaWx0ZXJEZXN0cm95IChnb29tZGF0YS0+emZkKTsKKyAgICBnb29tZGF0YS0+emZkID0gTlVMTDsKKyAgfQorICBnb29tZGF0YS0+cGl4ZWwgPSBnb29tZGF0YS0+YmFjayA9IE5VTEw7CisgIFJBTkRfQ0xPU0UgKGdvb21kYXRhKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9nb29tMmsxL2dvb21fY29yZS5oIGIvZ3N0L2dvb20yazEvZ29vbV9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiYzBlZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tMmsxL2dvb21fY29yZS5oCkBAIC0wLDAgKzEsNDMgQEAKKyNpZm5kZWYgX0dPT01DT1JFX0gKKyNkZWZpbmUgX0dPT01DT1JFX0gKKworI2luY2x1ZGUgPGdsaWIuaD4KKwordHlwZWRlZiBzdHJ1Y3QgWm9vbUZpbHRlckRhdGEgWm9vbUZpbHRlckRhdGE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCisgKiogIFNIQVJFRCBEQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqLworICBndWludDMyICpwaXhlbDsKKyAgZ3VpbnQzMiAqYmFjazsKKyAgZ3VpbnQzMiAqcDEsICpwMjsKKyAgZ3VpbnQzMiBjeWNsZTsKKworICBndWludDMyIHJlc29seCwgcmVzb2x5LCBidWZmc2l6ZTsKKworICBpbnQgbG9ja3ZhcjsgICAgICAgLyogcG91ciBlbXBlY2hlciBkZSBub3V2ZWF1eCBjaGFuZ2VtZW50cyAqLworICBpbnQgZ29vbXZhcjsgICAgICAgLyogYm91Y2xlIGRlcyBnb29tcyAqLworICBpbnQgdG90YWxnb29tOyAgICAgLyogbm9tYnJlIGRlIGdvb21zIHBhciBzZWNvbmRzICovCisgIGludCBhZ29vbTsgICAgICAgICAvKiB1biBnb29tIGEgZXUgbGlldS4uICAgICAgICovCisgIGludCBsb29wdmFyOyAgICAgICAvKiBtb3V2ZW1lbnQgZGVzIHBvaW50cyAqLworICBpbnQgc3BlZWR2YXI7ICAgICAgLyogdml0ZXNzZSBkZXMgcGFydGljdWxlcyAqLworICBpbnQgbGluZU1vZGU7ICAgICAgLyogbCdlZmZldCBsaW5lYWlyZSBhIGRlc3NpbmVyICovCisgIGNoYXIgZ29vbWxpbWl0OyAgICAvKiBzZW5zaWJpbGl0w6kgZHUgZ29vbSAqLworCisgIFpvb21GaWx0ZXJEYXRhICp6ZmQ7CisgIAorICAvKiBSYW5kb20gdGFibGUgKi8KKyAgZ2ludCAgKnJhbmRfdGFiOworICBndWludCAgcmFuZF9wb3M7Cit9IEdvb21EYXRhOworCit2b2lkIGdvb21faW5pdCAoR29vbURhdGEgKmdvb21kYXRhLCBndWludDMyIHJlc3gsIGd1aW50MzIgcmVzeSk7Cit2b2lkIGdvb21fc2V0X3Jlc29sdXRpb24gKEdvb21EYXRhICpnb29tZGF0YSwgZ3VpbnQzMiByZXN4LCBndWludDMyIHJlc3kpOworCitndWludDMyICpnb29tX3VwZGF0ZSAoR29vbURhdGEgKmdvb21kYXRhLCBnaW50MTYgZGF0YSBbMl1bNTEyXSk7CisKK3ZvaWQgZ29vbV9jbG9zZSAoR29vbURhdGEgKmdvb21kYXRhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvZ29vbTJrMS9nb29tX3Rvb2xzLmggYi9nc3QvZ29vbTJrMS9nb29tX3Rvb2xzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE3OGRiYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tMmsxL2dvb21fdG9vbHMuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9HT09NVE9PTFNfSAorI2RlZmluZSBfR09PTVRPT0xTX0gKKworI2RlZmluZSBOQl9SQU5EIDB4MTAwMDAKKworI2RlZmluZSBSQU5EX0lOSVQoZ2QsaSkgXAorICAgICAgICBzcmFuZCAoaSk7IFwKKyAgICAgICAgaWYgKGdkLT5yYW5kX3RhYiA9PSBOVUxMKSBcCisgICAgICAgICAgICAgICAgZ2QtPnJhbmRfdGFiID0gZ19tYWxsb2MgKE5CX1JBTkQgKiBzaXplb2YoZ2ludCkpIDtcCisgICAgICAgIGdkLT5yYW5kX3BvcyA9IDA7IFwKKyAgICAgICAgd2hpbGUgKGdkLT5yYW5kX3BvcyA8IE5CX1JBTkQpIFwKKyAgICAgICAgICAgICAgICBnZC0+cmFuZF90YWIgW2dkLT5yYW5kX3BvcysrXSA9IHJhbmQgKCk7CisKKyNkZWZpbmUgUkFORChnZCkgXAorICAgICAgICAoZ2QtPnJhbmRfdGFiW2dkLT5yYW5kX3BvcyA9ICgoZ2QtPnJhbmRfcG9zICsgMSkgJSBOQl9SQU5EKV0pCisKKyNkZWZpbmUgUkFORF9DTE9TRShnZCkgXAorICAgICAgICBnX2ZyZWUgKGdkLT5yYW5kX3RhYik7IFwKKyAgICAgICAgZ2QtPnJhbmRfdGFiID0gTlVMTDsKKworLyojZGVmaW5lIGlSQU5EKGkpICgoZ3VpbnQzMikoKGZsb2F0KWkgKiBSQU5EKCkvUkFORF9NQVgpKSAqLworI2RlZmluZSBpUkFORChnZCxpKSAoUkFORChnZCkgJSBpKQorICAgICAgICAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20yazEvZ3JhcGhpYy5jIGIvZ3N0L2dvb20yazEvZ3JhcGhpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMGY5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbTJrMS9ncmFwaGljLmMKQEAgLTAsMCArMSwxNCBAQAorI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3JhcGhpYy5oIgorCitjb25zdCBDb2xvciBCTEFDSyA9IHsgMCwgMCwgMCB9OworY29uc3QgQ29sb3IgV0hJVEUgPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKK2NvbnN0IENvbG9yIFJFRCA9IHsgMHhmZiwgMCwgMCB9OworY29uc3QgQ29sb3IgR1JFRU4gPSB7IDAsIDB4ZmYsIDAgfTsKK2NvbnN0IENvbG9yIEJMVUUgPSB7IDAsIDAsIDB4ZmYgfTsKK2NvbnN0IENvbG9yIFlFTExPVyA9IHsgMHhmZiwgMHhmZiwgMHgzMyB9OworY29uc3QgQ29sb3IgT1JBTkdFID0geyAweGZmLCAweGNjLCAweDAwIH07Citjb25zdCBDb2xvciBWSU9MRVQgPSB7IDB4NTUsIDB4MDAsIDB4ZmYgfTsKZGlmZiAtLWdpdCBhL2dzdC9nb29tMmsxL2dyYXBoaWMuaCBiL2dzdC9nb29tMmsxL2dyYXBoaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTU0ZDdmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20yazEvZ3JhcGhpYy5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgR1JBUEhJQ19ICisjZGVmaW5lIEdSQVBISUNfSAorCisjaW5jbHVkZSA8Z2xpYi5oPiAgLyogZGVmaW5lcyBpbmxpbmUgZm9yIGJldHRlciBwb3J0YWJpbGl0eSAqLworCit0eXBlZGVmIHVuc2lnbmVkIGludCBVaW50OworCit0eXBlZGVmIHN0cnVjdAoreworICB1bnNpZ25lZCBzaG9ydCByLHYsYjsKK30KK0NvbG9yOworCitleHRlcm4gY29uc3QgQ29sb3IgQkxBQ0s7CitleHRlcm4gY29uc3QgQ29sb3IgV0hJVEU7CitleHRlcm4gY29uc3QgQ29sb3IgUkVEOworZXh0ZXJuIGNvbnN0IENvbG9yIEJMVUU7CitleHRlcm4gY29uc3QgQ29sb3IgR1JFRU47CitleHRlcm4gY29uc3QgQ29sb3IgWUVMTE9XOworZXh0ZXJuIGNvbnN0IENvbG9yIE9SQU5HRTsKK2V4dGVybiBjb25zdCBDb2xvciBWSU9MRVQ7CisKKyNlbmRpZiAvKkdSQVBISUNfSCovCmRpZmYgLS1naXQgYS9nc3QvZ29vbTJrMS9nc3Rnb29tLmMgYi9nc3QvZ29vbTJrMS9nc3Rnb29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZiZmNiYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tMmsxL2dzdGdvb20uYwpAQCAtMCwwICsxLDE5MyBAQAorLyogZ3N0Z29vbS5jOiBpbXBsZW1lbnRhdGlvbiBvZiBnb29tIGRyYXdpbmcgZWxlbWVudAorICogQ29weXJpZ2h0IChDKSA8MjAwMT4gUmljaGFyZCBCb3VsdG9uIDxyaWNoYXJkQHRhcnRhcnVzLm9yZz4KKyAqICAgICAgICAgICAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0gYXQgZmx1ZW5kbyBkb3QgY29tPgorICogICAgICAgICAgIChDKSA8MjAxNT4gTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1nb29tMmsxCisgKiBAc2VlX2Fsc286IGdvb20sIHN5bmFlc3RoZXNpYQorICoKKyAqIEdvb20yazEgaXMgYW4gYXVkaW8gdmlzdWFsaXNhdGlvbiBlbGVtZW50LiBJdCBjcmVhdGVzIHdhcnBpbmcgc3RydWN0dXJlcworICogYmFzZWQgb24gdGhlIGluY29tbWluZyBhdWRpbyBzaWduYWwuIEdvb20yazEgaXMgdGhlIG9sZGVyIHZlcnNpb24gb2YgdGhlCisgKiB2aXN1YWxpc2F0aW9uLiBBbHNvIGF2YWlsYWJsZSBpcyBnb29tMms0LCB3aXRoIGEgZGlmZmVyZW50IGxvb2suCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyAhIGdvb20yazEgISB2aWRlb2NvbnZlcnQgISB4dmltYWdlc2luaworICogXXwKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0Z29vbS5oIgorI2luY2x1ZGUgImdvb21fY29yZS5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnb29tMmsxX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdvb20yazFfZGVidWcKKworI2RlZmluZSBERUZBVUxUX1dJRFRIICAzMjAKKyNkZWZpbmUgREVGQVVMVF9IRUlHSFQgMjQwCisjZGVmaW5lIERFRkFVTFRfRlBTX04gIDI1CisjZGVmaW5lIERFRkFVTFRfRlBTX0QgIDEKKworI2lmIEdfQllURV9PUkRFUiA9PSBHX0JJR19FTkRJQU4KKyNkZWZpbmUgUkdCX09SREVSICJ4UkdCIgorI2Vsc2UKKyNkZWZpbmUgUkdCX09SREVSICJCR1J4IgorI2VuZGlmCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFIChSR0JfT1JERVIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwgICAgLyogdGhlIG5hbWUgb2YgdGhlIHBhZHMgKi8KKyAgICBHU1RfUEFEX1NJTkssICAgICAgICAgICAgICAgLyogdHlwZSBvZiB0aGUgcGFkICovCisgICAgR1NUX1BBRF9BTFdBWVMsICAgICAgICAgICAgIC8qIEFMV0FZUy9TT01FVElNRVMgKi8KKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKFMxNikgIiwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgODAwMCwgOTYwMDAgXSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZDsgIgorICAgICAgICAiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChTMTYpICIsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDgwMDAsIDk2MDAwIF0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMiwgIgorICAgICAgICAiY2hhbm5lbC1tYXNrID0gKGJpdG1hc2spIDB4MywgIiAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQiKQorICAgICk7CisKK3N0YXRpYyB2b2lkIGdzdF9nb29tMmsxX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9nb29tMmsxX3NldHVwIChHc3RBdWRpb1Zpc3VhbGl6ZXIgKiBiYXNlKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZ29vbTJrMV9yZW5kZXIgKEdzdEF1ZGlvVmlzdWFsaXplciAqIGJhc2UsCisgICAgR3N0QnVmZmVyICogYXVkaW8sIEdzdFZpZGVvRnJhbWUgKiB2aWRlbyk7CisKKworR19ERUZJTkVfVFlQRSAoR3N0R29vbTJrMSwgZ3N0X2dvb20yazEsIEdTVF9UWVBFX0FVRElPX1ZJU1VBTElaRVIpOworCitzdGF0aWMgdm9pZAorZ3N0X2dvb20yazFfY2xhc3NfaW5pdCAoR3N0R29vbTJrMUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RBdWRpb1Zpc3VhbGl6ZXJDbGFzcyAqdmlzdWFsaXplcl9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIHZpc3VhbGl6ZXJfY2xhc3MgPSAoR3N0QXVkaW9WaXN1YWxpemVyQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfZ29vbTJrMV9maW5hbGl6ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIkdPT006IHdoYXQgYSBHT09NISAyazEgZWRpdGlvbiIsICJWaXN1YWxpemF0aW9uIiwKKyAgICAgICJUYWtlcyBmcmFtZXMgb2YgZGF0YSBhbmQgb3V0cHV0cyB2aWRlbyBmcmFtZXMgdXNpbmcgdGhlIEdPT00gMmsxIGZpbHRlciIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4iKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnb29tMmsxX2RlYnVnLCAiZ29vbTJrMSIsIDAsCisgICAgICAiZ29vbTJrMSB2aXN1YWxpc2F0aW9uIGVsZW1lbnQiKTsKKworICB2aXN1YWxpemVyX2NsYXNzLT5zZXR1cCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZ29vbTJrMV9zZXR1cCk7CisgIHZpc3VhbGl6ZXJfY2xhc3MtPnJlbmRlciA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZ29vbTJrMV9yZW5kZXIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2dvb20yazFfaW5pdCAoR3N0R29vbTJrMSAqIGdvb20pCit7CisgIGdvb20tPndpZHRoID0gREVGQVVMVF9XSURUSDsKKyAgZ29vbS0+aGVpZ2h0ID0gREVGQVVMVF9IRUlHSFQ7CisgIGdvb20tPmNoYW5uZWxzID0gMDsKKworICBnb29tX2luaXQgKCYoZ29vbS0+Z29vbWRhdGEpLCBnb29tLT53aWR0aCwgZ29vbS0+aGVpZ2h0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9nb29tMmsxX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RHb29tMmsxICpnb29tID0gR1NUX0dPT00ySzEgKG9iamVjdCk7CisKKyAgZ29vbV9jbG9zZSAoJihnb29tLT5nb29tZGF0YSkpOworCisgIEdfT0JKRUNUX0NMQVNTIChnc3RfZ29vbTJrMV9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZ29vbTJrMV9zZXR1cCAoR3N0QXVkaW9WaXN1YWxpemVyICogYmFzZSkKK3sKKyAgR3N0R29vbTJrMSAqZ29vbSA9IEdTVF9HT09NMksxIChiYXNlKTsKKworICBnb29tLT53aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIICgmYmFzZS0+dmluZm8pOworICBnb29tLT5oZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZiYXNlLT52aW5mbyk7CisKKyAgZ29vbV9zZXRfcmVzb2x1dGlvbiAoJihnb29tLT5nb29tZGF0YSksIGdvb20tPndpZHRoLCBnb29tLT5oZWlnaHQpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9nb29tMmsxX3JlbmRlciAoR3N0QXVkaW9WaXN1YWxpemVyICogYmFzZSwgR3N0QnVmZmVyICogYXVkaW8sCisgICAgR3N0VmlkZW9GcmFtZSAqIHZpZGVvKQoreworICBHc3RHb29tMmsxICpnb29tID0gR1NUX0dPT00ySzEgKGJhc2UpOworICBHc3RNYXBJbmZvIGFtYXA7CisgIGdpbnQxNiBkYXRhaW5bMl1bR09PTTJLMV9TQU1QTEVTXTsKKyAgZ2ludDE2ICphZGF0YTsKKyAgZ2ludCBpOworCisgIC8qIGdldCBuZXh0IEdPT00ySzFfU0FNUExFUywgd2UgaGF2ZSBhdCBsZWFzdCB0aGlzIGFtb3VudCBvZiBzYW1wbGVzICovCisgIGdzdF9idWZmZXJfbWFwIChhdWRpbywgJmFtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGFkYXRhID0gKGdpbnQxNiAqKSBhbWFwLmRhdGE7CisKKyAgaWYgKGdvb20tPmNoYW5uZWxzID09IDIpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgR09PTTJLMV9TQU1QTEVTOyBpKyspIHsKKyAgICAgIGRhdGFpblswXVtpXSA9ICphZGF0YSsrOworICAgICAgZGF0YWluWzFdW2ldID0gKmFkYXRhKys7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCBHT09NMksxX1NBTVBMRVM7IGkrKykgeworICAgICAgZGF0YWluWzBdW2ldID0gKmFkYXRhOworICAgICAgZGF0YWluWzFdW2ldID0gKmFkYXRhKys7CisgICAgfQorICB9CisKKyAgdmlkZW8tPmRhdGFbMF0gPSBnb29tX3VwZGF0ZSAoJihnb29tLT5nb29tZGF0YSksIGRhdGFpbik7CisgIGdzdF9idWZmZXJfdW5tYXAgKGF1ZGlvLCAmYW1hcCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJnb29tMmsxIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIEdTVF9UWVBFX0dPT00ySzEpOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgZ29vbTJrMSwKKyAgICAiR09PTSAyazEgdmlzdWFsaXphdGlvbiBmaWx0ZXIiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20yazEvZ3N0Z29vbS5oIGIvZ3N0L2dvb20yazEvZ3N0Z29vbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYjgxOGIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbTJrMS9nc3Rnb29tLmgKQEAgLTAsMCArMSw2OCBAQAorLyogZ3N0Z29vbS5jOiBpbXBsZW1lbnRhdGlvbiBvZiBnb29tIGRyYXdpbmcgZWxlbWVudAorICogQ29weXJpZ2h0IChDKSA8MjAwMT4gUmljaGFyZCBCb3VsdG9uIDxyaWNoYXJkQHRhcnRhcnVzLm9yZz4KKyAqICAgICAgICAgICAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0gYXQgZmx1ZW5kbyBkb3QgY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAxNT4gTHVpcyBkZSBCZXRoZW5jb3VydCA8bHVpc0BkZWJldGhlbmNvdXJ0LmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0dPT01fSF9fCisjZGVmaW5lIF9fR1NUX0dPT01fSF9fCisKKyNpbmNsdWRlIDxnc3QvcGJ1dGlscy9nc3RhdWRpb3Zpc3VhbGl6ZXIuaD4KKworI2luY2x1ZGUgImdvb21fY29yZS5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR09PTTJLMV9TQU1QTEVTIDUxMgorCisjZGVmaW5lIEdTVF9UWVBFX0dPT00ySzEgICAgICAgICAgICAoZ3N0X2dvb20yazFfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0dPT00ySzEob2JqKSAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9HT09NMksxLEdzdEdvb20yazEpKQorI2RlZmluZSBHU1RfR09PTTJLMV9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfR09PTTJLMSxHc3RHb29tMmsxQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfR09PTTJLMShvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0dPT00ySzEpKQorI2RlZmluZSBHU1RfSVNfR09PTTJLMV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfR09PTTJLMSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RHb29tMmsxIEdzdEdvb20yazE7Cit0eXBlZGVmIHN0cnVjdCBfR3N0R29vbTJrMUNsYXNzIEdzdEdvb20yazFDbGFzczsKKworc3RydWN0IF9Hc3RHb29tMmsxCit7CisgIEdzdEF1ZGlvVmlzdWFsaXplciBwYXJlbnQ7CisKKyAgLyogaW5wdXQgdHJhY2tpbmcgKi8KKyAgZ2ludCBjaGFubmVsczsKKworICAvKiB2aWRlbyBzdGF0ZSAqLworICBnaW50IHdpZHRoOworICBnaW50IGhlaWdodDsKKworICAvKiBnb29tIHN0dWZmICovCisgIEdvb21EYXRhIGdvb21kYXRhOworfTsKKworc3RydWN0IF9Hc3RHb29tMmsxQ2xhc3MKK3sKKyAgR3N0QXVkaW9WaXN1YWxpemVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2dvb20yazFfZ2V0X3R5cGUgKHZvaWQpOworZ2Jvb2xlYW4gZ3N0X2dvb20yazFfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9HT09NX0hfXyAqLworCmRpZmYgLS1naXQgYS9nc3QvZ29vbTJrMS9saW5lcy5jIGIvZ3N0L2dvb20yazEvbGluZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDRiNjhlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2dvb20yazEvbGluZXMuYwpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqICBsaW5lcy5jCisgKiAgaVR1bmVzWFBsdWdJbgorICoKKyAqICBDcmVhdGVkIGJ5IGd1aWxsYXVtIG9uIFR1ZSBBdWcgMTQgMjAwMS4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDEgX19Db21wYW55TmFtZV9fLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJsaW5lcy5oIgorI2luY2x1ZGUgPG1hdGguaD4KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyCitsaWdodGVuICh1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBjaGFyIHBvd2VyKQoreworICB1bnNpZ25lZCBjaGFyIGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHBvd2VyOyBpKyspCisgICAgdmFsdWUgKz0gKDI1NSAtIHZhbHVlKSAvIDU7CisgIHJldHVybiB2YWx1ZTsKK30KKwordm9pZAorZ29vbV9saW5lcyAoR29vbURhdGEgKiBnb29tZGF0YSwgZ2ludDE2IGRhdGFbMl1bNTEyXSwgdW5zaWduZWQgaW50IElELAorICAgIHVuc2lnbmVkIGludCAqcCwgZ3VpbnQzMiBwb3dlcikKK3sKKyAgZ3VpbnQzMiBjb2xvcjE7CisgIGd1aW50MzIgY29sb3IyOworICBndWludDMyIHJlc29seCA9IGdvb21kYXRhLT5yZXNvbHg7CisgIGd1aW50MzIgcmVzb2x5ID0gZ29vbWRhdGEtPnJlc29seTsKKyAgdW5zaWduZWQgY2hhciAqY29sb3IgPSAxICsgKHVuc2lnbmVkIGNoYXIgKikgJmNvbG9yMTsKKworICBzd2l0Y2ggKElEKSB7CisgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgLyogSG9yaXpvbnRhbCBzdGVyZW8gbGluZXMgKi8KKyAgICB7CisgICAgICBjb2xvcjEgPSAweDAwMDBBQTAwOworICAgICAgY29sb3IyID0gMHgwMEFBMDAwMDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgIC8qIFN0ZXJlbyBjaXJjbGVzICovCisgICAgeworICAgICAgY29sb3IxID0gMHgwMEFBMzNERDsKKyAgICAgIGNvbG9yMiA9IDB4MDBBQTMzREQ7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDp7CisgICAgICBjb2xvcjEgPSBjb2xvcjIgPSAwOworICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgKmNvbG9yID0gbGlnaHRlbiAoKmNvbG9yLCBwb3dlcik7CisgIGNvbG9yKys7CisgICpjb2xvciA9IGxpZ2h0ZW4gKCpjb2xvciwgcG93ZXIpOworICBjb2xvcisrOworICAqY29sb3IgPSBsaWdodGVuICgqY29sb3IsIHBvd2VyKTsKKyAgY29sb3IgPSAxICsgKHVuc2lnbmVkIGNoYXIgKikgJmNvbG9yMjsKKyAgKmNvbG9yID0gbGlnaHRlbiAoKmNvbG9yLCBwb3dlcik7CisgIGNvbG9yKys7CisgICpjb2xvciA9IGxpZ2h0ZW4gKCpjb2xvciwgcG93ZXIpOworICBjb2xvcisrOworICAqY29sb3IgPSBsaWdodGVuICgqY29sb3IsIHBvd2VyKTsKKworICBzd2l0Y2ggKElEKSB7CisgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgLyogSG9yaXpvbnRhbCBzdGVyZW8gbGluZXMgKi8KKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKSB7CisgICAgICAgIGd1aW50MzIgcGxvdDsKKworICAgICAgICBwbG90ID0gaSAqIHJlc29seCAvIDUxMiArIChyZXNvbHkgLyA0ICsgZGF0YVswXVtpXSAvIDE2MDApICogcmVzb2x4OworICAgICAgICBwW3Bsb3RdID0gY29sb3IxOworICAgICAgICBwW3Bsb3QgKyAxXSA9IGNvbG9yMTsKKyAgICAgICAgcGxvdCA9IGkgKiByZXNvbHggLyA1MTIgKyAocmVzb2x5ICogMyAvIDQgLSBkYXRhWzFdW2ldIC8gMTYwMCkgKiByZXNvbHg7CisgICAgICAgIHBbcGxvdF0gPSBjb2xvcjI7CisgICAgICAgIHBbcGxvdCArIDFdID0gY29sb3IyOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgLyogU3RlcmVvIGNpcmNsZXMgKi8KKyAgICB7CisgICAgICBmbG9hdCB6OworICAgICAgdW5zaWduZWQgaW50IG1vblggPSByZXNvbHggLyAyOworICAgICAgZmxvYXQgbW9uWSA9IChmbG9hdCkgcmVzb2x5IC8gNDsKKyAgICAgIGZsb2F0IG1vblkyID0gKGZsb2F0KSByZXNvbHkgLyAyOworCisgICAgICBmb3IgKHogPSAwOyB6IDwgNi4yODMyZjsgeiArPSAxLjBmIC8gbW9uWSkgeworICAgICAgICAvKiBmbG9hdCBvZmZzZXQxID0gMTI4K2RhdGFbMV1bKHVuc2lnbmVkIGludCkoeio4MS4zM2YpXSkvMjAwMDAwOyAqLworICAgICAgICBwW21vblggKyAodW5zaWduZWQgaW50KSAoKG1vblkgKyAoKGZsb2F0KSByZXNvbHkpICogKDEyOCArCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdWyh1bnNpZ25lZCBpbnQpICh6ICogODEuMzNmKV0pIC8gMjAwMDAwKSAqCisgICAgICAgICAgICAgICAgY29zICh6KSArIHJlc29seCAqICh1bnNpZ25lZCBpbnQpIChtb25ZMiArIChtb25ZICsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoZmxvYXQpIHJlc29seSkgKiAoMTI4ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdWyh1bnNpZ25lZCBpbnQpICh6ICogODEuMzNmKV0pIC8gNDAwMDAwKSAqCisgICAgICAgICAgICAgICAgICAgIHNpbiAoeikpKV0gPSBjb2xvcjE7CisgICAgICAgIHBbbW9uWCArICh1bnNpZ25lZCBpbnQpICgobW9uWSAtICgoZmxvYXQpIHJlc29seSkgKiAoMTI4ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMF1bKHVuc2lnbmVkIGludCkgKHogKiA4MS4zM2YpXSkgLyAyMDAwMDApICoKKyAgICAgICAgICAgICAgICBjb3MgKHopICsgcmVzb2x4ICogKHVuc2lnbmVkIGludCkgKG1vblkyICsgKG1vblkgLQorICAgICAgICAgICAgICAgICAgICAgICAgKChmbG9hdCkgcmVzb2x5KSAqICgxMjggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMF1bKHVuc2lnbmVkIGludCkgKHogKiA4MS4zM2YpXSkgLyA0MDAwMDApICoKKyAgICAgICAgICAgICAgICAgICAgc2luICh6KSkpXSA9IGNvbG9yMjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L2dvb20yazEvbGluZXMuaCBiL2dzdC9nb29tMmsxL2xpbmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4ZjMzOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9nb29tMmsxL2xpbmVzLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqICBsaW5lcy5oCisgKiAgaUdvb20KKyAqCisgKiAgQ3JlYXRlZCBieSBndWlsbGF1bSBvbiBUdWUgQXVnIDE0IDIwMDEuCisgKiAgQ29weXJpZ2h0IChjKSAyMDAxIGlvcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKi8KKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlICJncmFwaGljLmgiCisjaW5jbHVkZSAiZ29vbV9jb3JlLmgiCisKK3ZvaWQgZ29vbV9saW5lcyhHb29tRGF0YSAqZ29vbWRhdGEsIGdpbnQxNiBkYXRhIFsyXVs1MTJdLCB1bnNpZ25lZCBpbnQgSUQsdW5zaWduZWQgaW50KiBwLCBndWludDMyIHBvd2VyKTsKKworCmRpZmYgLS1naXQgYS9nc3QvZ29vbTJrMS9tZXNvbi5idWlsZCBiL2dzdC9nb29tMmsxL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NjBiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvZ29vbTJrMS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDM5IEBACitnb29tMmsxX2FyZ3MgPSBbCisgICctRGdzdF9nb29tX2dldF90eXBlPWdzdF9nb29tMmsxX2dldF90eXBlJywKKyAgJy1EZ29vbV9pbml0PWdvb20yazFfaW5pdCcsCisgICctRGdvb21fY2xvc2U9Z29vbTJrMV9jbG9zZScsCisgICctRGdvb21fdXBkYXRlPWdvb20yazFfdXBkYXRlJywKKyAgJy1EZ29vbV9zZXRfcmVzb2x1dGlvbj1nb29tMmsxX3NldF9yZXNvbHV0aW9uJywKKyAgJy1EZ29vbV9saW5lcz1nb29tMmsxX2xpbmVzJywKKyAgJy1EQkxBQ0s9R09PTTJLMV9CTEFDSycsCisgICctRFdISVRFPUdPT00ySzFfV0hJVEUnLAorICAnLURSRUQ9R09PTTJLMV9SRUQnLAorICAnLURCTFVFPUdPT00ySzFfQkxVRScsCisgICctREdSRUVOPUdPT00ySzFfR1JFRU4nLAorICAnLURZRUxMT1c9R09PTTJLMV9ZRUxMT1cnLAorICAnLURPUkFOR0U9R09PTTJLMV9PUkFOR0UnLAorICAnLURWSU9MRVQ9R09PTTJLMV9WSU9MRVQnLAorICAnLUR6b29tRmlsdGVyRmFzdFJHQj16b29tRmlsdGVyRmFzdFJHQjJrMScsCisgICctRHBvaW50RmlsdGVyPXBvaW50RmlsdGVyMmsxJywKKyAgJy1Eem9vbUZpbHRlckRlc3Ryb3k9em9vbUZpbHRlckRlc3Ryb3kyazEnLAorICAnLUR6b29tRmlsdGVyTmV3PXpvb21GaWx0ZXJOZXcyazEnCitdCisKK2ZpbHRlcl9hcmdzID0gWyctVU1NWCcsICctVVVTRV9BU00nXQorCitnb29tMmsxX3NvdXJjZXMgPSBbCisgICdnc3Rnb29tLmMnLAorICAnZ29vbV9jb3JlLmMnLAorICAnZmlsdGVycy5jJywKKyAgJ2dyYXBoaWMuYycsCisgICdsaW5lcy5jJworXQorCitnc3Rnb29tMmsxID0gbGlicmFyeSgnZ3N0Z29vbTJrMScsCisgIGdvb20yazFfc291cmNlcywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzICsgZ29vbTJrMV9hcmdzICsgZmlsdGVyX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdHBidXRpbHNfZGVwLCBnc3RiYXNlX2RlcCwgbGlibV0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvaWN5ZGVtdXgvTWFrZWZpbGUuYW0gYi9nc3QvaWN5ZGVtdXgvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljMDIxZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pY3lkZW11eC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDggQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGljeWRlbXV4LmxhCisKK2xpYmdzdGljeWRlbXV4X2xhX1NPVVJDRVMgPSBnc3RpY3lkZW11eC5jCitsaWJnc3RpY3lkZW11eF9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQorbGliZ3N0aWN5ZGVtdXhfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dGFnLUBHU1RfQVBJX1ZFUlNJT05AICQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykKK2xpYmdzdGljeWRlbXV4X2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RpY3lkZW11eC5oCmRpZmYgLS1naXQgYS9nc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYyBiL2dzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZmRhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaWN5ZGVtdXgvZ3N0aWN5ZGVtdXguYwpAQCAtMCwwICsxLDY3NyBAQAorLyogLSotIE1vZGU6IEM7IHRhYi13aWR0aDogMjsgaW5kZW50LXRhYnMtbW9kZTogdDsgYy1iYXNpYy1vZmZzZXQ6IDIgLSotICovCisvKiBDb3B5cmlnaHQgMjAwNSBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKyAqICAgICAgICAgICAyMDA2IE1pY2hhZWwgU21pdGggPG1zbWl0aEBmbHVlbmRvLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IEJlbmphbWluIE90dGUgPG90dGVAZ25vbWUub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWljeWRlbXV4CisgKgorICogaWN5ZGVtdXggYWNjZXB0cyBkYXRhIHN0cmVhbXMgd2l0aCBJQ1kgbWV0YWRhdGEgYXQga25vd24gaW50ZXJ2YWxzLCBhcworICogdHJhbnNtaXR0ZWQgZnJvbSBhbiB1cHN0cmVhbSBlbGVtZW50ICh1c3VhbGx5IHJlYWQgYXMgcmVzcG9uc2UgaGVhZGVycyBmcm9tCisgKiBhbiBIVFRQIHN0cmVhbSkuIFRoZSBtaW1lIHR5cGUgb2YgdGhlIGRhdGEgYmV0d2VlbiB0aGUgdGFnIGJsb2NrcyBpcworICogZGV0ZWN0ZWQgdXNpbmcgdHlwZWZpbmQgZnVuY3Rpb25zLCBhbmQgdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBtaW1lIHR5cGUgc2V0CisgKiBvbiBvdXRnb2luZyBidWZmZXJzLiAKKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgc291cGh0dHBzcmMgbG9jYXRpb249aHR0cDovL3NvbWUuc2VydmVyLyBpcmFkaW8tbW9kZT10cnVlICEgaWN5ZGVtdXggISBmYWtlc2luayAtdAorICogXXwgVGhpcyBwaXBlbGluZSBzaG91bGQgcmVhZCBhbnkgYXZhaWxhYmxlIElDWSB0YWcgaW5mb3JtYXRpb24gYW5kIG91dHB1dCBpdC4KKyAqIFRoZSBjb250ZW50cyBvZiB0aGUgc3RyZWFtIHNob3VsZCBiZSBkZXRlY3RlZCwgYW5kIHRoZSBhcHByb3ByaWF0ZSBtaW1lCisgKiB0eXBlIHNldCBvbiBidWZmZXJzIHByb2R1Y2VkIGZyb20gaWN5ZGVtdXguIChVc2luZyBnbm9tZXZmc3NyYywgbmVvbmh0dHBzcmMKKyAqIG9yIGdpb3NyYyBpbnN0ZWFkIG9mIHNvdXBodHRwc3JjIHNob3VsZCBhbHNvIHdvcmsuKQorICogPC9yZWZzZWN0Mj4KKyAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisjaW5jbHVkZSA8Z3N0L3RhZy90YWcuaD4KKworI2luY2x1ZGUgImdzdGljeWRlbXV4LmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBJQ1lfVFlQRV9GSU5EX01BWF9TSVpFICg0MCoxMDI0KQorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChpY3lkZW11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAoaWN5ZGVtdXhfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LWljeSwgbWV0YWRhdGEtaW50ZXJ2YWwgPSAoaW50KVswLCBNQVhdIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiQU5ZIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfaWN5ZGVtdXhfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9pY3lkZW11eF9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfaWN5ZGVtdXhfaGFuZGxlX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9pY3lkZW11eF9hZGRfc3JjcGFkIChHc3RJQ1lEZW11eCAqIGljeWRlbXV4LAorICAgIEdzdENhcHMgKiBuZXdfY2Fwcyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ljeWRlbXV4X3JlbW92ZV9zcmNwYWQgKEdzdElDWURlbXV4ICogaWN5ZGVtdXgpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X2ljeWRlbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ljeWRlbXV4X3Npbmtfc2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RDYXBzICogY2Fwcyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfaWN5ZGVtdXhfc2VuZF90YWdfZXZlbnQgKEdzdElDWURlbXV4ICogaWN5ZGVtdXgsCisgICAgR3N0VGFnTGlzdCAqIHRhZ2xpc3QpOworCisKKyNkZWZpbmUgZ3N0X2ljeWRlbXV4X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdElDWURlbXV4LCBnc3RfaWN5ZGVtdXgsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZAorZ3N0X2ljeWRlbXV4X2NsYXNzX2luaXQgKEdzdElDWURlbXV4Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIHBhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19yZWYgKEdTVF9UWVBFX0VMRU1FTlQpOworCisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3RfaWN5ZGVtdXhfZGlzcG9zZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfaWN5ZGVtdXhfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfZmFjdG9yeSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIklDWSB0YWcgZGVtdXhlciIsCisgICAgICAiQ29kZWMvRGVtdXhlci9NZXRhZGF0YSIsCisgICAgICAiUmVhZCBhbmQgb3V0cHV0IElDWSB0YWdzIHdoaWxlIGRlbXV4aW5nIHRoZSBjb250ZW50cyIsCisgICAgICAiSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+LCAiCisgICAgICAiTWljaGFlbCBTbWl0aCA8bXNtaXRoQGZsdWVuZG8uY29tPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2ljeWRlbXV4X3Jlc2V0IChHc3RJQ1lEZW11eCAqIGljeWRlbXV4KQoreworICAvKiBVbmtub3duIGF0IHRoZSBtb21lbnQgKHRoaXMgaXMgYSBmYXRhbCBlcnJvciBpZiBkb24ndCBoYXZlIGEgdmFsdWUgYnkgdGhlCisgICAqIHRpbWUgd2UgZ2V0IHRvIG91ciBjaGFpbiBmdW5jdGlvbikKKyAgICovCisgIGljeWRlbXV4LT5tZXRhX2ludGVydmFsID0gLTE7CisgIGljeWRlbXV4LT5yZW1haW5pbmcgPSAwOworCisgIGljeWRlbXV4LT50eXBlZmluZGluZyA9IFRSVUU7CisKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJihpY3lkZW11eC0+c3JjX2NhcHMpLCBOVUxMKTsKKworICBnc3RfaWN5ZGVtdXhfcmVtb3ZlX3NyY3BhZCAoaWN5ZGVtdXgpOworCisgIGlmIChpY3lkZW11eC0+Y2FjaGVkX3RhZ3MpIHsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKGljeWRlbXV4LT5jYWNoZWRfdGFncyk7CisgICAgaWN5ZGVtdXgtPmNhY2hlZF90YWdzID0gTlVMTDsKKyAgfQorCisgIGlmIChpY3lkZW11eC0+Y2FjaGVkX2V2ZW50cykgeworICAgIGdfbGlzdF9mb3JlYWNoIChpY3lkZW11eC0+Y2FjaGVkX2V2ZW50cywKKyAgICAgICAgKEdGdW5jKSBnc3RfbWluaV9vYmplY3RfdW5yZWYsIE5VTEwpOworICAgIGdfbGlzdF9mcmVlIChpY3lkZW11eC0+Y2FjaGVkX2V2ZW50cyk7CisgICAgaWN5ZGVtdXgtPmNhY2hlZF9ldmVudHMgPSBOVUxMOworICB9CisKKyAgaWYgKGljeWRlbXV4LT5tZXRhX2FkYXB0ZXIpIHsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAoaWN5ZGVtdXgtPm1ldGFfYWRhcHRlcik7CisgICAgZ19vYmplY3RfdW5yZWYgKGljeWRlbXV4LT5tZXRhX2FkYXB0ZXIpOworICAgIGljeWRlbXV4LT5tZXRhX2FkYXB0ZXIgPSBOVUxMOworICB9CisKKyAgaWYgKGljeWRlbXV4LT50eXBlZmluZF9idWYpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChpY3lkZW11eC0+dHlwZWZpbmRfYnVmKTsKKyAgICBpY3lkZW11eC0+dHlwZWZpbmRfYnVmID0gTlVMTDsKKyAgfQorCisgIGlmIChpY3lkZW11eC0+Y29udGVudF90eXBlKSB7CisgICAgZ19mcmVlIChpY3lkZW11eC0+Y29udGVudF90eXBlKTsKKyAgICBpY3lkZW11eC0+Y29udGVudF90eXBlID0gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2ljeWRlbXV4X2luaXQgKEdzdElDWURlbXV4ICogaWN5ZGVtdXgpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqa2xhc3MgPSBHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKGljeWRlbXV4KTsKKworICBpY3lkZW11eC0+c2lua3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywKKyAgICAgICAgICAic2luayIpLCAic2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoaWN5ZGVtdXgtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ljeWRlbXV4X2NoYWluKSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChpY3lkZW11eC0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfaWN5ZGVtdXhfaGFuZGxlX2V2ZW50KSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChpY3lkZW11eCksIGljeWRlbXV4LT5zaW5rcGFkKTsKKworICBnc3RfaWN5ZGVtdXhfcmVzZXQgKGljeWRlbXV4KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfaWN5ZGVtdXhfc2lua19zZXRjYXBzIChHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RJQ1lEZW11eCAqaWN5ZGVtdXggPSBHU1RfSUNZREVNVVggKEdTVF9QQURfUEFSRU5UIChwYWQpKTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgY29uc3QgZ2NoYXIgKnRtcDsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAibWV0YWRhdGEtaW50ZXJ2YWwiLAorICAgICAgICAgICZpY3lkZW11eC0+bWV0YV9pbnRlcnZhbCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIElmIGluY29taW5nIGNhcHMgaGF2ZSB0aGUgSFRUUCBDb250ZW50LVR5cGUsIGNvcHkgdGhhdCBvdmVyICovCisgIGlmICgodG1wID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJjb250ZW50LXR5cGUiKSkpCisgICAgaWN5ZGVtdXgtPmNvbnRlbnRfdHlwZSA9IGdfc3RyZHVwICh0bXApOworCisgIC8qIFdlIGhhdmUgYSBtZXRhIGludGVydmFsLCBzbyBpbml0aWFsaXNlIHRoZSByZXN0ICovCisgIGljeWRlbXV4LT5yZW1haW5pbmcgPSBpY3lkZW11eC0+bWV0YV9pbnRlcnZhbDsKKyAgaWN5ZGVtdXgtPm1ldGFfcmVtYWluaW5nID0gMDsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaWN5ZGVtdXhfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0SUNZRGVtdXggKmljeWRlbXV4ID0gR1NUX0lDWURFTVVYIChvYmplY3QpOworCisgIGdzdF9pY3lkZW11eF9yZXNldCAoaWN5ZGVtdXgpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RDYXBzICpjYXBzOworICBHc3RQYWQgKnBhZDsKK30gQ29weVN0aWNreUV2ZW50c0RhdGE7CisKK3N0YXRpYyBnYm9vbGVhbgorY29weV9zdGlja3lfZXZlbnRzIChHc3RQYWQgKiBwYWQsIEdzdEV2ZW50ICoqIGV2ZW50LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIENvcHlTdGlja3lFdmVudHNEYXRhICpkYXRhID0gdXNlcl9kYXRhOworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoKmV2ZW50KSA+PSBHU1RfRVZFTlRfQ0FQUyAmJiBkYXRhLT5jYXBzKSB7CisgICAgZ3N0X3BhZF9zZXRfY2FwcyAoZGF0YS0+cGFkLCBkYXRhLT5jYXBzKTsKKyAgICBkYXRhLT5jYXBzID0gTlVMTDsKKyAgfQorCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoKmV2ZW50KSAhPSBHU1RfRVZFTlRfQ0FQUykKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKGRhdGEtPnBhZCwgZ3N0X2V2ZW50X3JlZiAoKmV2ZW50KSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ljeWRlbXV4X2FkZF9zcmNwYWQgKEdzdElDWURlbXV4ICogaWN5ZGVtdXgsIEdzdENhcHMgKiBuZXdfY2FwcykKK3sKKyAgaWYgKGljeWRlbXV4LT5zcmNfY2FwcyA9PSBOVUxMIHx8CisgICAgICAhZ3N0X2NhcHNfaXNfZXF1YWwgKG5ld19jYXBzLCBpY3lkZW11eC0+c3JjX2NhcHMpKSB7CisgICAgZ3N0X2NhcHNfcmVwbGFjZSAoJihpY3lkZW11eC0+c3JjX2NhcHMpLCBuZXdfY2Fwcyk7CisgICAgaWYgKGljeWRlbXV4LT5zcmNwYWQgIT0gTlVMTCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaWN5ZGVtdXgsICJDaGFuZ2luZyBzcmMgcGFkIGNhcHMgdG8gJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgaWN5ZGVtdXgtPnNyY19jYXBzKTsKKworICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAoaWN5ZGVtdXgtPnNyY3BhZCwgaWN5ZGVtdXgtPnNyY19jYXBzKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogQ2FwcyBuZXZlciBjaGFuZ2VkICovCisgICAgZ3N0X2NhcHNfdW5yZWYgKG5ld19jYXBzKTsKKyAgfQorCisgIGlmIChpY3lkZW11eC0+c3JjcGFkID09IE5VTEwpIHsKKyAgICBDb3B5U3RpY2t5RXZlbnRzRGF0YSBkYXRhOworCisgICAgaWN5ZGVtdXgtPnNyY3BhZCA9CisgICAgICAgIGdzdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUKKyAgICAgICAgKEdTVF9FTEVNRU5UX0dFVF9DTEFTUyAoaWN5ZGVtdXgpLCAic3JjIiksICJzcmMiKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCAoaWN5ZGVtdXgtPnNyY3BhZCAhPSBOVUxMLCBGQUxTRSk7CisKKyAgICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChpY3lkZW11eC0+c3JjcGFkKTsKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKGljeWRlbXV4LT5zcmNwYWQsIFRSVUUpOworCisgICAgZGF0YS5wYWQgPSBpY3lkZW11eC0+c3JjcGFkOworICAgIGRhdGEuY2FwcyA9IGljeWRlbXV4LT5zcmNfY2FwczsKKyAgICBnc3RfcGFkX3N0aWNreV9ldmVudHNfZm9yZWFjaCAoaWN5ZGVtdXgtPnNpbmtwYWQsIGNvcHlfc3RpY2t5X2V2ZW50cywKKyAgICAgICAgJmRhdGEpOworICAgIGlmIChkYXRhLmNhcHMpCisgICAgICBnc3RfcGFkX3NldF9jYXBzIChkYXRhLnBhZCwgZGF0YS5jYXBzKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGljeWRlbXV4LCAiQWRkaW5nIHNyYyBwYWQgd2l0aCBjYXBzICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICBpY3lkZW11eC0+c3JjX2NhcHMpOworCisgICAgaWYgKCEoZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKGljeWRlbXV4KSwgaWN5ZGVtdXgtPnNyY3BhZCkpKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIGdzdF9lbGVtZW50X25vX21vcmVfcGFkcyAoR1NUX0VMRU1FTlQgKGljeWRlbXV4KSk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfaWN5ZGVtdXhfcmVtb3ZlX3NyY3BhZCAoR3N0SUNZRGVtdXggKiBpY3lkZW11eCkKK3sKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKworICBpZiAoaWN5ZGVtdXgtPnNyY3BhZCAhPSBOVUxMKSB7CisgICAgcmVzID0gZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlQgKGljeWRlbXV4KSwgaWN5ZGVtdXgtPnNyY3BhZCk7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlcyAhPSBGQUxTRSwgRkFMU0UpOworICAgIGljeWRlbXV4LT5zcmNwYWQgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIHJlczsKK307CisKK3N0YXRpYyBnY2hhciAqCitnc3RfaWN5ZGVtdXhfdW5pY29kaWZ5IChjb25zdCBnY2hhciAqIHN0cikKK3sKKyAgY29uc3QgZ2NoYXIgKmVudl92YXJzW10gPSB7ICJHU1RfSUNZX1RBR19FTkNPRElORyIsCisgICAgIkdTVF9UQUdfRU5DT0RJTkciLCBOVUxMCisgIH07CisKKyAgcmV0dXJuIGdzdF90YWdfZnJlZWZvcm1fc3RyaW5nX3RvX3V0ZjggKHN0ciwgLTEsIGVudl92YXJzKTsKK30KKworLyogdGFrZXMgb3duZXJzaGlwIG9mIHRhZyBsaXN0ICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9pY3lkZW11eF90YWdfZm91bmQgKEdzdElDWURlbXV4ICogaWN5ZGVtdXgsIEdzdFRhZ0xpc3QgKiB0YWdzKQoreworICAvKiBzZW5kIHRoZSB0YWcgZXZlbnQgaWYgd2UgaGF2ZSBmaW5pc2hlZCB0eXBlZmluZGluZyBhbmQgaGF2ZSBhIHNyYyBwYWQgKi8KKyAgaWYgKGljeWRlbXV4LT5zcmNwYWQpCisgICAgcmV0dXJuIGdzdF9pY3lkZW11eF9zZW5kX3RhZ19ldmVudCAoaWN5ZGVtdXgsIHRhZ3MpOworCisgIC8qIGlmIHdlIGhhdmVuJ3QgYSBzb3VyY2UgcGFkIHlldCwgY2FjaGUgdGhlIHRhZ3MgKi8KKyAgaWYgKCFpY3lkZW11eC0+Y2FjaGVkX3RhZ3MpIHsKKyAgICBpY3lkZW11eC0+Y2FjaGVkX3RhZ3MgPSB0YWdzOworICB9IGVsc2UgeworICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKGljeWRlbXV4LT5jYWNoZWRfdGFncywgdGFncywKKyAgICAgICAgR1NUX1RBR19NRVJHRV9SRVBMQUNFX0FMTCk7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdzKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2ljeWRlbXV4X3BhcnNlX2FuZF9zZW5kX3RhZ3MgKEdzdElDWURlbXV4ICogaWN5ZGVtdXgpCit7CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgaW50IGxlbmd0aCwgaTsKKyAgZ2Jvb2xlYW4gdGFnc19mb3VuZCA9IEZBTFNFOworICBnY2hhciAqYnVmZmVyOworICBnY2hhciAqKnN0cmluZ3M7CisKKyAgbGVuZ3RoID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChpY3lkZW11eC0+bWV0YV9hZGFwdGVyKTsKKworICBkYXRhID0gZ3N0X2FkYXB0ZXJfbWFwIChpY3lkZW11eC0+bWV0YV9hZGFwdGVyLCBsZW5ndGgpOworCisgIC8qIE5vdywgY29weSB0aGlzIHRvIGEgYnVmZmVyIHdoZXJlIHdlIGNhbiBOVUxMLXRlcm1pbmF0ZSBpdCB0byBtYWtlIHRoaW5ncworICAgKiBhIGJpdCBlYXNpZXIsIHRoZW4gZG8gdGhhdCBwYXJzaW5nLiAqLworICBidWZmZXIgPSBnX3N0cm5kdXAgKChjb25zdCBnY2hhciAqKSBkYXRhLCBsZW5ndGgpOworCisgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBzdHJpbmdzID0gZ19zdHJzcGxpdCAoYnVmZmVyLCAiJzsiLCAwKTsKKworICBmb3IgKGkgPSAwOyBzdHJpbmdzW2ldOyBpKyspIHsKKyAgICBpZiAoIWdfYXNjaWlfc3RybmNhc2VjbXAgKHN0cmluZ3NbaV0sICJTdHJlYW1UaXRsZT0iLCAxMikpIHsKKyAgICAgIGNoYXIgKnRpdGxlID0gZ3N0X2ljeWRlbXV4X3VuaWNvZGlmeSAoc3RyaW5nc1tpXSArIDEzKTsKKyAgICAgIHRhZ3NfZm91bmQgPSBUUlVFOworCisgICAgICBpZiAodGl0bGUgJiYgKnRpdGxlKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwgR1NUX1RBR19USVRMRSwKKyAgICAgICAgICAgIHRpdGxlLCBOVUxMKTsKKyAgICAgICAgZ19mcmVlICh0aXRsZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghZ19hc2NpaV9zdHJuY2FzZWNtcCAoc3RyaW5nc1tpXSwgIlN0cmVhbVVybD0iLCAxMCkpIHsKKyAgICAgIGNoYXIgKnVybCA9IGdzdF9pY3lkZW11eF91bmljb2RpZnkgKHN0cmluZ3NbaV0gKyAxMSk7CisgICAgICB0YWdzX2ZvdW5kID0gVFJVRTsKKworICAgICAgaWYgKHVybCAmJiAqdXJsKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwgR1NUX1RBR19IT01FUEFHRSwKKyAgICAgICAgICAgIHVybCwgTlVMTCk7CisgICAgICAgIGdfZnJlZSAodXJsKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBnX3N0cmZyZWV2IChzdHJpbmdzKTsKKyAgZ19mcmVlIChidWZmZXIpOworICBnc3RfYWRhcHRlcl91bm1hcCAoaWN5ZGVtdXgtPm1ldGFfYWRhcHRlcik7CisgIGdzdF9hZGFwdGVyX2ZsdXNoIChpY3lkZW11eC0+bWV0YV9hZGFwdGVyLCBsZW5ndGgpOworCisgIGlmICh0YWdzX2ZvdW5kKQorICAgIGdzdF9pY3lkZW11eF90YWdfZm91bmQgKGljeWRlbXV4LCB0YWdzKTsKKyAgZWxzZQorICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFncyk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ljeWRlbXV4X2hhbmRsZV9ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdElDWURlbXV4ICppY3lkZW11eCA9IEdTVF9JQ1lERU1VWCAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmVzdWx0OworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1RBRzoKKyAgICB7CisgICAgICBHc3RUYWdMaXN0ICp0YWdzOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfdGFnIChldmVudCwgJnRhZ3MpOworICAgICAgcmVzdWx0ID0gZ3N0X2ljeWRlbXV4X3RhZ19mb3VuZCAoaWN5ZGVtdXgsIGdzdF90YWdfbGlzdF9jb3B5ICh0YWdzKSk7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICByZXN1bHQgPSBnc3RfaWN5ZGVtdXhfc2lua19zZXRjYXBzIChwYWQsIGNhcHMpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoaWN5ZGVtdXgtPnR5cGVmaW5kaW5nKSB7CisgICAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgICBnX2xpc3RfZm9yZWFjaCAoaWN5ZGVtdXgtPmNhY2hlZF9ldmVudHMsCisgICAgICAgICAgICAoR0Z1bmMpIGdzdF9taW5pX29iamVjdF91bnJlZiwgTlVMTCk7CisgICAgICAgIGdfbGlzdF9mcmVlIChpY3lkZW11eC0+Y2FjaGVkX2V2ZW50cyk7CisgICAgICAgIGljeWRlbXV4LT5jYWNoZWRfZXZlbnRzID0gTlVMTDsKKworICAgICAgICByZXR1cm4gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKCFHU1RfRVZFTlRfSVNfU1RJQ0tZIChldmVudCkpIHsKKyAgICAgICAgICBpY3lkZW11eC0+Y2FjaGVkX2V2ZW50cyA9CisgICAgICAgICAgICAgIGdfbGlzdF9hcHBlbmQgKGljeWRlbXV4LT5jYWNoZWRfZXZlbnRzLCBldmVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9pY3lkZW11eF9zZW5kX2NhY2hlZF9ldmVudHMgKEdzdElDWURlbXV4ICogaWN5ZGVtdXgpCit7CisgIEdMaXN0ICpsOworCisgIGZvciAobCA9IGljeWRlbXV4LT5jYWNoZWRfZXZlbnRzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KSB7CisgICAgR3N0RXZlbnQgKmV2ZW50ID0gR1NUX0VWRU5UIChsLT5kYXRhKTsKKworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoaWN5ZGVtdXgtPnNyY3BhZCwgZXZlbnQpOworICB9CisgIGdfbGlzdF9mcmVlIChpY3lkZW11eC0+Y2FjaGVkX2V2ZW50cyk7CisgIGljeWRlbXV4LT5jYWNoZWRfZXZlbnRzID0gTlVMTDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9pY3lkZW11eF90eXBlZmluZF9vcl9mb3J3YXJkIChHc3RJQ1lEZW11eCAqIGljeWRlbXV4LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIGlmIChpY3lkZW11eC0+dHlwZWZpbmRpbmcpIHsKKyAgICBHc3RCdWZmZXIgKnRmX2J1ZjsKKyAgICBHc3RDYXBzICpjYXBzID0gTlVMTDsKKyAgICBHc3RUeXBlRmluZFByb2JhYmlsaXR5IHByb2I7CisKKyAgICAvKiBJZiB3ZSBoYXZlIGEgY29udGVudC10eXBlIGZyb20gdXBzdHJlYW0sIGxldCdzIHNlZSBpZiB3ZSBjYW4gc2hvcnRjdXQKKyAgICAgKiB0eXBlZmluZGluZyAqLworICAgIGlmIChHX1VOTElLRUxZIChpY3lkZW11eC0+Y29udGVudF90eXBlKSkgeworICAgICAgaWYgKCFnX2FzY2lpX3N0cmNhc2VjbXAgKGljeWRlbXV4LT5jb250ZW50X3R5cGUsICJ2aWRlby9uc3YiKSkgeworICAgICAgICBHU1RfREVCVUcgKCJXZSBoYXZlIGEgTlNWIHN0cmVhbSIpOworICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtbnN2Iik7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUcgKCJVcHN0cmVhbSBDb250ZW50LVR5cGUgaXNuJ3Qgc3VwcG9ydGVkIik7CisgICAgICAgIGdfZnJlZSAoaWN5ZGVtdXgtPmNvbnRlbnRfdHlwZSk7CisgICAgICAgIGljeWRlbXV4LT5jb250ZW50X3R5cGUgPSBOVUxMOworICAgICAgfQorICAgIH0KKworICAgIGlmIChpY3lkZW11eC0+dHlwZWZpbmRfYnVmKSB7CisgICAgICBpY3lkZW11eC0+dHlwZWZpbmRfYnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKGljeWRlbXV4LT50eXBlZmluZF9idWYsIGJ1Zik7CisgICAgfSBlbHNlIHsKKyAgICAgIGljeWRlbXV4LT50eXBlZmluZF9idWYgPSBidWY7CisgICAgfQorCisgICAgLyogT25seSB0eXBlZmluZCBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZ290IHNvbWUgY2FwcyAqLworICAgIGlmIChjYXBzID09IE5VTEwpIHsKKyAgICAgIGNhcHMgPSBnc3RfdHlwZV9maW5kX2hlbHBlcl9mb3JfYnVmZmVyIChHU1RfT0JKRUNUIChpY3lkZW11eCksCisgICAgICAgICAgaWN5ZGVtdXgtPnR5cGVmaW5kX2J1ZiwgJnByb2IpOworCisgICAgICBpZiAoY2FwcyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChnc3RfYnVmZmVyX2dldF9zaXplIChpY3lkZW11eC0+dHlwZWZpbmRfYnVmKSA8CisgICAgICAgICAgICBJQ1lfVFlQRV9GSU5EX01BWF9TSVpFKSB7CisgICAgICAgICAgLyogSnVzdCBicmVhayBmb3IgbW9yZSBkYXRhICovCisgICAgICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgICAgICB9CisKKyAgICAgICAgLyogV2UgZmFpbGVkIHR5cGVmaW5kICovCisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChpY3lkZW11eCwgU1RSRUFNLCBUWVBFX05PVF9GT1VORCwgKE5VTEwpLAorICAgICAgICAgICAgKCJObyBjYXBzIGZvdW5kIGZvciBjb250ZW50cyB3aXRoaW4gYW4gSUNZIHN0cmVhbSIpKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoaWN5ZGVtdXgtPnR5cGVmaW5kX2J1Zik7CisgICAgICAgIGljeWRlbXV4LT50eXBlZmluZF9idWYgPSBOVUxMOworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFnc3RfaWN5ZGVtdXhfYWRkX3NyY3BhZCAoaWN5ZGVtdXgsIGNhcHMpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChpY3lkZW11eCwgIkZhaWxlZCB0byBhZGQgc3JjcGFkIik7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChpY3lkZW11eC0+dHlwZWZpbmRfYnVmKTsKKyAgICAgIGljeWRlbXV4LT50eXBlZmluZF9idWYgPSBOVUxMOworICAgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICAgIH0KKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICBpZiAoaWN5ZGVtdXgtPmNhY2hlZF9ldmVudHMpIHsKKyAgICAgIGdzdF9pY3lkZW11eF9zZW5kX2NhY2hlZF9ldmVudHMgKGljeWRlbXV4KTsKKyAgICB9CisKKyAgICBpZiAoaWN5ZGVtdXgtPmNhY2hlZF90YWdzKSB7CisgICAgICBnc3RfaWN5ZGVtdXhfc2VuZF90YWdfZXZlbnQgKGljeWRlbXV4LCBpY3lkZW11eC0+Y2FjaGVkX3RhZ3MpOworICAgICAgaWN5ZGVtdXgtPmNhY2hlZF90YWdzID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBNb3ZlIG9udG8gc3RyZWFtaW5nOiBjYWxsIG91cnNlbHZlcyByZWN1cnNpdmVseSB3aXRoIHRoZSB0eXBlZmluZCBidWZmZXIKKyAgICAgKiB0byBnZXQgdGhhdCBmb3J3YXJkZWQuICovCisgICAgaWN5ZGVtdXgtPnR5cGVmaW5kaW5nID0gRkFMU0U7CisKKyAgICB0Zl9idWYgPSBpY3lkZW11eC0+dHlwZWZpbmRfYnVmOworICAgIGljeWRlbXV4LT50eXBlZmluZF9idWYgPSBOVUxMOworICAgIHJldHVybiBnc3RfaWN5ZGVtdXhfdHlwZWZpbmRfb3JfZm9yd2FyZCAoaWN5ZGVtdXgsIHRmX2J1Zik7CisgIH0gZWxzZSB7CisgICAgaWYgKEdfVU5MSUtFTFkgKGljeWRlbXV4LT5zcmNwYWQgPT0gTlVMTCkpIHsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorCisgICAgYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChidWYpOworCisgICAgLyogTW9zdCB0aGluZ3MgZG9uJ3QgY2FyZSwgYW5kIGl0J3MgYSBwYWluIHRvIHRyYWNrICh3ZSBzaG91bGQgcHJlc2VydmUgYQorICAgICAqIDAgb2Zmc2V0IG9uIHRoZSBmaXJzdCBidWZmZXIgdGhvdWdoIGlmIGl0J3MgdGhlcmUsIGZvciBpZDNkZW11eCBldGMuKSAqLworICAgIGlmIChHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSAhPSAwKSB7CisgICAgICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisgICAgfQorCisgICAgcmV0dXJuIGdzdF9wYWRfcHVzaCAoaWN5ZGVtdXgtPnNyY3BhZCwgYnVmKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2ljeWRlbXV4X2FkZF9tZXRhIChHc3RJQ1lEZW11eCAqIGljeWRlbXV4LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIGlmICghaWN5ZGVtdXgtPm1ldGFfYWRhcHRlcikKKyAgICBpY3lkZW11eC0+bWV0YV9hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworCisgIGdzdF9hZGFwdGVyX3B1c2ggKGljeWRlbXV4LT5tZXRhX2FkYXB0ZXIsIGJ1Zik7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfaWN5ZGVtdXhfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdElDWURlbXV4ICppY3lkZW11eDsKKyAgZ3VpbnQgc2l6ZSwgY2h1bmssIG9mZnNldDsKKyAgR3N0QnVmZmVyICpzdWI7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgaWN5ZGVtdXggPSBHU1RfSUNZREVNVVggKHBhcmVudCk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGljeWRlbXV4LT5tZXRhX2ludGVydmFsIDwgMCkpCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICBpZiAoaWN5ZGVtdXgtPm1ldGFfaW50ZXJ2YWwgPT0gMCkgeworICAgIHJldCA9IGdzdF9pY3lkZW11eF90eXBlZmluZF9vcl9mb3J3YXJkIChpY3lkZW11eCwgYnVmKTsKKyAgICBidWYgPSBOVUxMOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIC8qIEdvIHRocm91Z2ggdGhlIGJ1ZmZlciwgY2hvcHBpbmcgaXQgaW50byBhcHByb3ByaWF0ZSBjaHVua3MuIEZvcndhcmQgYXMKKyAgICogdGFncyBvciBidWZmZXJzLCBhcyBhcHByb3ByaWF0ZQorICAgKi8KKyAgc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisgIG9mZnNldCA9IDA7CisgIHdoaWxlIChzaXplKSB7CisgICAgaWYgKGljeWRlbXV4LT5yZW1haW5pbmcpIHsKKyAgICAgIGNodW5rID0gKHNpemUgPD0gaWN5ZGVtdXgtPnJlbWFpbmluZykgPyBzaXplIDogaWN5ZGVtdXgtPnJlbWFpbmluZzsKKyAgICAgIGlmIChvZmZzZXQgPT0gMCAmJiBjaHVuayA9PSBzaXplKSB7CisgICAgICAgIHN1YiA9IGJ1ZjsKKyAgICAgICAgYnVmID0gTlVMTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN1YiA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX0FMTCwgb2Zmc2V0LCBjaHVuayk7CisgICAgICB9CisgICAgICBvZmZzZXQgKz0gY2h1bms7CisgICAgICBpY3lkZW11eC0+cmVtYWluaW5nIC09IGNodW5rOworICAgICAgc2l6ZSAtPSBjaHVuazsKKworICAgICAgLyogVGhpcyBidWZmZXIgZ29lcyBvbnRvIHR5cGVmaW5kaW5nLCBhbmQvb3IgZGlyZWN0bHkgcHVzaGVkIG91dCAqLworICAgICAgcmV0ID0gZ3N0X2ljeWRlbXV4X3R5cGVmaW5kX29yX2ZvcndhcmQgKGljeWRlbXV4LCBzdWIpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBkb25lOworICAgIH0gZWxzZSBpZiAoaWN5ZGVtdXgtPm1ldGFfcmVtYWluaW5nKSB7CisgICAgICBjaHVuayA9IChzaXplIDw9IGljeWRlbXV4LT5tZXRhX3JlbWFpbmluZykgPworICAgICAgICAgIHNpemUgOiBpY3lkZW11eC0+bWV0YV9yZW1haW5pbmc7CisgICAgICBzdWIgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWYsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIG9mZnNldCwgY2h1bmspOworICAgICAgZ3N0X2ljeWRlbXV4X2FkZF9tZXRhIChpY3lkZW11eCwgc3ViKTsKKworICAgICAgb2Zmc2V0ICs9IGNodW5rOworICAgICAgaWN5ZGVtdXgtPm1ldGFfcmVtYWluaW5nIC09IGNodW5rOworICAgICAgc2l6ZSAtPSBjaHVuazsKKworICAgICAgaWYgKGljeWRlbXV4LT5tZXRhX3JlbWFpbmluZyA9PSAwKSB7CisgICAgICAgIC8qIFBhcnNlIHRhZ3MgZnJvbSBtZXRhX2FkYXB0ZXIsIHNlbmQgb2ZmIGFzIHRhZyBtZXNzYWdlcyAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChpY3lkZW11eCwgIk5vIHJlbWFpbmluZyBtZXRhZGF0YSwgcGFyc2luZyBmb3IgdGFncyIpOworICAgICAgICBnc3RfaWN5ZGVtdXhfcGFyc2VfYW5kX3NlbmRfdGFncyAoaWN5ZGVtdXgpOworCisgICAgICAgIGljeWRlbXV4LT5yZW1haW5pbmcgPSBpY3lkZW11eC0+bWV0YV9pbnRlcnZhbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZ3VpbnQ4IGJ5dGU7CisgICAgICAvKiBXZSBuZWVkIHRvIHJlYWQgYSBzaW5nbGUgYnl0ZSAoYWx3YXlzIHNhZmUgYXQgdGhpcyBwb2ludCBpbiB0aGUgbG9vcCkKKyAgICAgICAqIHRvIGZpZ3VyZSBvdXQgaG93IG1hbnkgYnl0ZXMgb2YgbWV0YWRhdGEgZXhpc3QuIAorICAgICAgICogVGhlICdzcGVjJyB0ZWxscyB1cyB0byByZWFkIDE2ICogKGJ5dGVfdmFsdWUpIGJ5dGVzIG9mIG1ldGFkYXRhIGFmdGVyCisgICAgICAgKiB0aGlzICh6ZXJvIGlzIGNvbW1vbiwgYW5kIG1lYW5zIHRoZSBtZXRhZGF0YSBoYXNuJ3QgY2hhbmdlZCkuCisgICAgICAgKi8KKyAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoYnVmLCBvZmZzZXQsICZieXRlLCAxKTsKKyAgICAgIGljeWRlbXV4LT5tZXRhX3JlbWFpbmluZyA9IDE2ICogYnl0ZTsKKyAgICAgIGlmIChpY3lkZW11eC0+bWV0YV9yZW1haW5pbmcgPT0gMCkKKyAgICAgICAgaWN5ZGVtdXgtPnJlbWFpbmluZyA9IGljeWRlbXV4LT5tZXRhX2ludGVydmFsOworCisgICAgICBvZmZzZXQgKz0gMTsKKyAgICAgIHNpemUgLT0gMTsKKyAgICB9CisgIH0KKworZG9uZToKKyAgaWYgKGJ1ZikKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCitub3RfbmVnb3RpYXRlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoaWN5ZGVtdXgsICJtZXRhX2ludGVydmFsIG5vdCBzZXQsIGJ1ZmZlciBwcm9iYWJseSBoYWQgIgorICAgICAgICAibm8gY2FwcyBzZXQuIFRyeSBlbmFibGluZyBpcmFkaW8tbW9kZSBvbiB0aGUgaHR0cCBzb3VyY2UgZWxlbWVudCIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2ljeWRlbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0SUNZRGVtdXggKmljeWRlbXV4ID0gR1NUX0lDWURFTVVYIChlbGVtZW50KTsKKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X2ljeWRlbXV4X3Jlc2V0IChpY3lkZW11eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworLyogdGFrZXMgb3duZXJzaGlwIG9mIHRhZyBsaXN0ICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9pY3lkZW11eF9zZW5kX3RhZ19ldmVudCAoR3N0SUNZRGVtdXggKiBpY3lkZW11eCwgR3N0VGFnTGlzdCAqIHRhZ3MpCit7CisgIEdzdEV2ZW50ICpldmVudDsKKworICBldmVudCA9IGdzdF9ldmVudF9uZXdfdGFnICh0YWdzKTsKKyAgR1NUX0VWRU5UX1RJTUVTVEFNUCAoZXZlbnQpID0gMDsKKworICBHU1RfREVCVUdfT0JKRUNUIChpY3lkZW11eCwgIlNlbmRpbmcgdGFnIGV2ZW50IG9uIHNyYyBwYWQiKTsKKyAgcmV0dXJuIGdzdF9wYWRfcHVzaF9ldmVudCAoaWN5ZGVtdXgtPnNyY3BhZCwgZXZlbnQpOworCit9CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGljeWRlbXV4X2RlYnVnLCAiaWN5ZGVtdXgiLCAwLAorICAgICAgIkdTdHJlYW1lciBJQ1kgdGFnIGRlbXV4ZXIiKTsKKworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImljeWRlbXV4IiwKKyAgICAgIEdTVF9SQU5LX1BSSU1BUlksIEdTVF9UWVBFX0lDWURFTVVYKTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGljeWRlbXV4LAorICAgICJEZW11eCBJQ1kgdGFncyBmcm9tIGEgc3RyZWFtIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5oIGIvZ3N0L2ljeWRlbXV4L2dzdGljeWRlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwNTIxOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pY3lkZW11eC9nc3RpY3lkZW11eC5oCkBAIC0wLDAgKzEsODcgQEAKKy8qIENvcHlyaWdodCAyMDA1IEphbiBTY2htaWR0IDx0aGF5dGFuQG1hZC5zY2llbnRpc3QuY29tPgorICogICAgICAgICAgIDIwMDYgTWljaGFlbCBTbWl0aCA8bXNtaXRoQGZsdWVuZG8uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgQmVuamFtaW4gT3R0ZSA8b3R0ZUBnbm9tZS5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9JQ1lERU1VWF9IX18KKyNkZWZpbmUgX19HU1RfSUNZREVNVVhfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdHR5cGVmaW5kaGVscGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9JQ1lERU1VWCBcCisgIChnc3RfaWN5ZGVtdXhfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0lDWURFTVVYKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfSUNZREVNVVgsR3N0SUNZRGVtdXgpKQorI2RlZmluZSBHU1RfSUNZREVNVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfSUNZREVNVVgsR3N0SUNZRGVtdXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19JQ1lERU1VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0lDWURFTVVYKSkKKyNkZWZpbmUgR1NUX0lTX0lDWURFTVVYX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0lDWURFTVVYKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdElDWURlbXV4ICAgICAgR3N0SUNZRGVtdXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0SUNZRGVtdXhDbGFzcyBHc3RJQ1lEZW11eENsYXNzOworCitzdHJ1Y3QgX0dzdElDWURlbXV4Cit7CisgIEdzdEVsZW1lbnQgZWxlbWVudDsKKworICBHc3RQYWQgKnNpbmtwYWQsICpzcmNwYWQ7CisKKyAgLyogSW50ZXJ2YWwgYmV0d2VlbiBtZXRhZGF0YSB1cGRhdGVzICovCisgIGdpbnQgbWV0YV9pbnRlcnZhbDsKKworICAvKiBSZW1haW5pbmcgYnl0ZXMgdW50aWwgdGhlIG5leHQgbWV0YWRhdGEgdXBkYXRlICovCisgIGdpbnQgcmVtYWluaW5nOworCisgIC8qIFdoZW4gJ3JlbWFpbmluZycgaXMgemVybywgdGhpcyBob2xkcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIG1ldGFkYXRhIHdlCisgICAqIHN0aWxsIG5lZWQgdG8gcmVhZCwgb3IgemVybyBpZiB3ZSBkb24ndCB5ZXQga25vdyAod2hpY2ggbWVhbnMgd2UgbmVlZCB0bworICAgKiByZWFkIG9uZSBieXRlLCBhZnRlciB3aGljaCB3ZSBjYW4gaW5pdGlhbGlzZSB0aGlzIHByb3Blcmx5KSAqLworICBnaW50IG1ldGFfcmVtYWluaW5nOworCisgIC8qIENhcHMgZm9yIHRoZSBkYXRhIGVuY2xvc2VkICovCisgIEdzdENhcHMgKnNyY19jYXBzOworCisgIC8qIFRydWUgaWYgd2UncmUgc3RpbGwgdHlwZWZpbmRpbmcgKi8KKyAgZ2Jvb2xlYW4gdHlwZWZpbmRpbmc7CisKKyAgR3N0VGFnTGlzdCAqY2FjaGVkX3RhZ3M7CisgIEdMaXN0ICpjYWNoZWRfZXZlbnRzOworCisgIEdzdEFkYXB0ZXIgKm1ldGFfYWRhcHRlcjsKKworICBHc3RCdWZmZXIgKnR5cGVmaW5kX2J1ZjsKKworICAvKiB1cHN0cmVhbSBIVFRQIENvbnRlbnQtVHlwZSAqLworICBnY2hhciAqY29udGVudF90eXBlOworfTsKKworc3RydWN0IF9Hc3RJQ1lEZW11eENsYXNzIAoreworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2ljeWRlbXV4X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0lDWURFTVVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2ljeWRlbXV4L21lc29uLmJ1aWxkIGIvZ3N0L2ljeWRlbXV4L21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNWY4NTcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaWN5ZGVtdXgvbWVzb24uYnVpbGQKQEAgLTAsMCArMSw4IEBACitnc3RpY3lkZW11eCA9IGxpYnJhcnkoJ2dzdGljeWRlbXV4JywKKyAgJ2dzdGljeWRlbXV4LmMnLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdF9kZXAsIGdzdGJhc2VfZGVwLCBnc3R0YWdfZGVwLCB6bGliX2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvaWQzZGVtdXgvTWFrZWZpbGUuYW0gYi9nc3QvaWQzZGVtdXgvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0YTFhYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pZDNkZW11eC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDkgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdGlkM2RlbXV4LmxhCisKK2xpYmdzdGlkM2RlbXV4X2xhX1NPVVJDRVMgPSBnc3RpZDNkZW11eC5jCitsaWJnc3RpZDNkZW11eF9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAKK2xpYmdzdGlkM2RlbXV4X2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHRhZy1AR1NUX0FQSV9WRVJTSU9OQCBcCisJLWxnc3RwYnV0aWxzLUBHU1RfQVBJX1ZFUlNJT05AICQoR1NUX0JBU0VfTElCUykKK2xpYmdzdGlkM2RlbXV4X2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RpZDNkZW11eC5oCmRpZmYgLS1naXQgYS9nc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYyBiL2dzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OTFiYjgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaWQzZGVtdXgvZ3N0aWQzZGVtdXguYwpAQCAtMCwwICsxLDI4OSBAQAorLyogLSotIE1vZGU6IEM7IHRhYi13aWR0aDogMjsgaW5kZW50LXRhYnMtbW9kZTogdDsgYy1iYXNpYy1vZmZzZXQ6IDIgLSotICovCisvKiBHU3RyZWFtZXIgSUQzIHRhZyBkZW11eGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBCZW5qYW1pbiBPdHRlIDxvdHRlQGdub21lLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1pZDNkZW11eAorICoKKyAqIGlkM2RlbXV4IGFjY2VwdHMgZGF0YSBzdHJlYW1zIHdpdGggZWl0aGVyIChvciBib3RoKSBJRDN2MiByZWdpb25zIGF0IHRoZQorICogc3RhcnQsIG9yIElEM3YxIGF0IHRoZSBlbmQuIFRoZSBtaW1lIHR5cGUgb2YgdGhlIGRhdGEgYmV0d2VlbiB0aGUgdGFnIGJsb2NrcworICogaXMgZGV0ZWN0ZWQgdXNpbmcgdHlwZWZpbmQgZnVuY3Rpb25zLCBhbmQgdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBtaW1lIHR5cGUKKyAqIHNldCBvbiBvdXRnb2luZyBidWZmZXJzLiAKKyAqCisgKiBUaGUgZWxlbWVudCBpcyBvbmx5IGFibGUgdG8gcmVhZCBJRDN2MSB0YWdzIGZyb20gYSBzZWVrYWJsZSBzdHJlYW0sIGJlY2F1c2UKKyAqIHRoZXkgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gVGhhdCBpcywgd2hlbiBnZXRfcmFuZ2UgbW9kZSBpcyBzdXBwb3J0ZWQKKyAqIGJ5IHRoZSB1cHN0cmVhbSBlbGVtZW50cy4gSWYgZ2V0X3JhbmdlIG9wZXJhdGlvbiBpcyBhdmFpbGFibGUsIGlkM2RlbXV4IG1ha2VzCisgKiBpdCBhdmFpbGFibGUgZG93bnN0cmVhbS4gVGhpcyBtZWFucyB0aGF0IGVsZW1lbnRzIHdoaWNoIHJlcXVpcmUgZ2V0X3JhbmdlCisgKiBtb2RlLCBzdWNoIGFzIHdhdnBhcnNlLCBjYW4gb3BlcmF0ZSBvbiBmaWxlcyBjb250YWluaW5nIElEMyB0YWcgaW5mb3JtYXRpb24uCisgKgorICogVGhpcyBpZDNkZW11eCBlbGVtZW50IHJlcGxhY2VkIGFuIG9sZGVyIGVsZW1lbnQgd2l0aCB0aGUgc2FtZSBuYW1lIHdoaWNoCisgKiByZWxpZWQgb24gbGliaWQzdGFnIGZyb20gdGhlIE1BRCBwcm9qZWN0LgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPWZpbGUubXAzICEgaWQzZGVtdXggISBmYWtlc2luayAtdAorICogXXwgVGhpcyBwaXBlbGluZSBzaG91bGQgcmVhZCBhbnkgYXZhaWxhYmxlIElEMyB0YWcgaW5mb3JtYXRpb24gYW5kIG91dHB1dCBpdC4KKyAqIFRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBpbnNpZGUgdGhlIElEMyB0YWcgcmVnaW9ucyBzaG91bGQgYmUgZGV0ZWN0ZWQsIGFuZAorICogdGhlIGFwcHJvcHJpYXRlIG1pbWUgdHlwZSBzZXQgb24gYnVmZmVycyBwcm9kdWNlZCBmcm9tIGlkM2RlbXV4LgorICogPC9yZWZzZWN0Mj4KKyAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisjaW5jbHVkZSA8Z3N0L3RhZy90YWcuaD4KKyNpbmNsdWRlIDxnc3QvcGJ1dGlscy9wYnV0aWxzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RpZDNkZW11eC5oIgorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9QUkVGRVJfVjEKK307CisKKyNkZWZpbmUgREVGQVVMVF9QUkVGRVJfVjEgIEZBTFNFCisKK0dTVF9ERUJVR19DQVRFR09SWSAoaWQzZGVtdXhfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKGlkM2RlbXV4X2RlYnVnKQorCisjZGVmaW5lIElEM1YxX1RBR19TSVpFIDEyOAorI2RlZmluZSBJRDNWMl9IRFJfU0laRSBHU1RfVEFHX0lEM1YyX0hFQURFUl9TSVpFCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LWlkMyIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9pZDNkZW11eF9pZGVudGlmeV90YWcgKEdzdFRhZ0RlbXV4ICogZGVtdXgsCisgICAgR3N0QnVmZmVyICogYnVmZmVyLCBnYm9vbGVhbiBzdGFydF90YWcsIGd1aW50ICogdGFnX3NpemUpOworc3RhdGljIEdzdFRhZ0RlbXV4UmVzdWx0IGdzdF9pZDNkZW11eF9wYXJzZV90YWcgKEdzdFRhZ0RlbXV4ICogZGVtdXgsCisgICAgR3N0QnVmZmVyICogYnVmZmVyLCBnYm9vbGVhbiBzdGFydF90YWcsIGd1aW50ICogdGFnX3NpemUsCisgICAgR3N0VGFnTGlzdCAqKiB0YWdzKTsKK3N0YXRpYyBHc3RUYWdMaXN0ICpnc3RfaWQzZGVtdXhfbWVyZ2VfdGFncyAoR3N0VGFnRGVtdXggKiB0YWdkZW11eCwKKyAgICBjb25zdCBHc3RUYWdMaXN0ICogc3RhcnRfdGFncywgY29uc3QgR3N0VGFnTGlzdCAqIGVuZF90YWdzKTsKKworc3RhdGljIHZvaWQgZ3N0X2lkM2RlbXV4X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9pZDNkZW11eF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKKyNkZWZpbmUgZ3N0X2lkM2RlbXV4X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdElEM0RlbXV4LCBnc3RfaWQzZGVtdXgsIEdTVF9UWVBFX1RBR19ERU1VWCk7CisKK3N0YXRpYyB2b2lkCitnc3RfaWQzZGVtdXhfY2xhc3NfaW5pdCAoR3N0SUQzRGVtdXhDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RUYWdEZW11eENsYXNzICp0YWdkZW11eF9jbGFzcyA9IChHc3RUYWdEZW11eENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9pZDNkZW11eF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9pZDNkZW11eF9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QUkVGRVJfVjEsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInByZWZlci12MSIsICJQcmVmZXIgdmVyc2lvbiAxIHRhZyIsCisgICAgICAgICAgIlByZWZlciB0YWdzIGZyb20gSUQzdjEgdGFnIGF0IGVuZCBvZiBmaWxlIHdoZW4gYm90aCBJRDN2MSAiCisgICAgICAgICAgImFuZCBJRDN2MiB0YWdzIGFyZSBwcmVzZW50IiwgREVGQVVMVF9QUkVGRVJfVjEsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfZmFjdG9yeSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIklEMyB0YWcgZGVtdXhlciIsCisgICAgICAiQ29kZWMvRGVtdXhlci9NZXRhZGF0YSIsCisgICAgICAiUmVhZCBhbmQgb3V0cHV0IElEM3YxIGFuZCBJRDN2MiB0YWdzIHdoaWxlIGRlbXV4aW5nIHRoZSBjb250ZW50cyIsCisgICAgICAiSmFuIFNjaG1pZHQgPHRoYXl0YW5AbWFkLnNjaWVudGlzdC5jb20+Iik7CisKKyAgdGFnZGVtdXhfY2xhc3MtPmlkZW50aWZ5X3RhZyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfaWQzZGVtdXhfaWRlbnRpZnlfdGFnKTsKKyAgdGFnZGVtdXhfY2xhc3MtPnBhcnNlX3RhZyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfaWQzZGVtdXhfcGFyc2VfdGFnKTsKKyAgdGFnZGVtdXhfY2xhc3MtPm1lcmdlX3RhZ3MgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2lkM2RlbXV4X21lcmdlX3RhZ3MpOworCisgIHRhZ2RlbXV4X2NsYXNzLT5taW5fc3RhcnRfc2l6ZSA9IElEM1YyX0hEUl9TSVpFOworICB0YWdkZW11eF9jbGFzcy0+bWluX2VuZF9zaXplID0gSUQzVjFfVEFHX1NJWkU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaWQzZGVtdXhfaW5pdCAoR3N0SUQzRGVtdXggKiBpZDNkZW11eCkKK3sKKyAgaWQzZGVtdXgtPnByZWZlcl92MSA9IERFRkFVTFRfUFJFRkVSX1YxOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9pZDNkZW11eF9pZGVudGlmeV90YWcgKEdzdFRhZ0RlbXV4ICogZGVtdXgsIEdzdEJ1ZmZlciAqIGJ1ZiwKKyAgICBnYm9vbGVhbiBzdGFydF90YWcsIGd1aW50ICogdGFnX3NpemUpCit7CisgIGd1aW50OCBkYXRhWzNdOworCisgIGdzdF9idWZmZXJfZXh0cmFjdCAoYnVmLCAwLCBkYXRhLCAzKTsKKworICBpZiAoc3RhcnRfdGFnKSB7CisgICAgaWYgKGRhdGFbMF0gIT0gJ0knIHx8IGRhdGFbMV0gIT0gJ0QnIHx8IGRhdGFbMl0gIT0gJzMnKQorICAgICAgZ290byBub19tYXJrZXI7CisKKyAgICAqdGFnX3NpemUgPSBnc3RfdGFnX2dldF9pZDN2Ml90YWdfc2l6ZSAoYnVmKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZGF0YVswXSAhPSAnVCcgfHwgZGF0YVsxXSAhPSAnQScgfHwgZGF0YVsyXSAhPSAnRycpCisgICAgICBnb3RvIG5vX21hcmtlcjsKKworICAgICp0YWdfc2l6ZSA9IElEM1YxX1RBR19TSVpFOworICB9CisKKyAgR1NUX0lORk9fT0JKRUNUIChkZW11eCwgIkZvdW5kIElEM3YldSBtYXJrZXIsIHRhZ19zaXplID0gJXUiLAorICAgICAgKHN0YXJ0X3RhZykgPyAyIDogMSwgKnRhZ19zaXplKTsKKworICByZXR1cm4gVFJVRTsKKworbm9fbWFya2VyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJObyBJRDN2JXUgbWFya2VyIGZvdW5kIiwgKHN0YXJ0X3RhZykgPyAyIDogMSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaWQzZGVtdXhfYWRkX2NvbnRhaW5lcl9mb3JtYXQgKEdzdFRhZ0xpc3QgKiB0YWdzKQoreworICBHc3RDYXBzICpzaW5rX2NhcHM7CisKKyAgc2lua19jYXBzID0gZ3N0X3N0YXRpY19wYWRfdGVtcGxhdGVfZ2V0X2NhcHMgKCZzaW5rX2ZhY3RvcnkpOworICBnc3RfcGJfdXRpbHNfYWRkX2NvZGVjX2Rlc2NyaXB0aW9uX3RvX3RhZ19saXN0ICh0YWdzLAorICAgICAgR1NUX1RBR19DT05UQUlORVJfRk9STUFULCBzaW5rX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc2lua19jYXBzKTsKK30KKworc3RhdGljIEdzdFRhZ0RlbXV4UmVzdWx0Citnc3RfaWQzZGVtdXhfcGFyc2VfdGFnIChHc3RUYWdEZW11eCAqIGRlbXV4LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgZ2Jvb2xlYW4gc3RhcnRfdGFnLCBndWludCAqIHRhZ19zaXplLCBHc3RUYWdMaXN0ICoqIHRhZ3MpCit7CisgIGlmIChzdGFydF90YWcpIHsKKyAgICAqdGFnX3NpemUgPSBnc3RfdGFnX2dldF9pZDN2Ml90YWdfc2l6ZSAoYnVmZmVyKTsKKyAgICAqdGFncyA9IGdzdF90YWdfbGlzdF9mcm9tX2lkM3YyX3RhZyAoYnVmZmVyKTsKKworICAgIGlmIChHX0xJS0VMWSAoKnRhZ3MgIT0gTlVMTCkpIHsKKyAgICAgIGdzdF9pZDNkZW11eF9hZGRfY29udGFpbmVyX2Zvcm1hdCAoKnRhZ3MpOworICAgICAgcmV0dXJuIEdTVF9UQUdfREVNVVhfUkVTVUxUX09LOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gR1NUX1RBR19ERU1VWF9SRVNVTFRfQlJPS0VOX1RBRzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICp0YWdzID0gZ3N0X3RhZ19saXN0X25ld19mcm9tX2lkM3YxIChtYXAuZGF0YSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICAgIGlmIChHX1VOTElLRUxZICgqdGFncyA9PSBOVUxMKSkKKyAgICAgIHJldHVybiBHU1RfVEFHX0RFTVVYX1JFU1VMVF9CUk9LRU5fVEFHOworCisgICAgZ3N0X2lkM2RlbXV4X2FkZF9jb250YWluZXJfZm9ybWF0ICgqdGFncyk7CisgICAgKnRhZ19zaXplID0gSUQzVjFfVEFHX1NJWkU7CisgICAgcmV0dXJuIEdTVF9UQUdfREVNVVhfUkVTVUxUX09LOworICB9Cit9CisKK3N0YXRpYyBHc3RUYWdMaXN0ICoKK2dzdF9pZDNkZW11eF9tZXJnZV90YWdzIChHc3RUYWdEZW11eCAqIHRhZ2RlbXV4LCBjb25zdCBHc3RUYWdMaXN0ICogc3RhcnRfdGFncywKKyAgICBjb25zdCBHc3RUYWdMaXN0ICogZW5kX3RhZ3MpCit7CisgIEdzdElEM0RlbXV4ICppZDNkZW11eDsKKyAgR3N0VGFnTGlzdCAqbWVyZ2VkOworICBnYm9vbGVhbiBwcmVmZXJfdjE7CisKKyAgaWQzZGVtdXggPSBHU1RfSUQzREVNVVggKHRhZ2RlbXV4KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGlkM2RlbXV4KTsKKyAgcHJlZmVyX3YxID0gaWQzZGVtdXgtPnByZWZlcl92MTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGlkM2RlbXV4KTsKKworICAvKiB3ZSBtZXJnZSBpbiBSRVBMQUNFIG1vZGUsIHNvIHB1dCB0aGUgbGVzcyBpbXBvcnRhbnQgdGFncyBmaXJzdCAqLworICBpZiAocHJlZmVyX3YxKQorICAgIG1lcmdlZCA9IGdzdF90YWdfbGlzdF9tZXJnZSAoc3RhcnRfdGFncywgZW5kX3RhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSk7CisgIGVsc2UKKyAgICBtZXJnZWQgPSBnc3RfdGFnX2xpc3RfbWVyZ2UgKGVuZF90YWdzLCBzdGFydF90YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UpOworCisgIEdTVF9MT0dfT0JKRUNUIChpZDNkZW11eCwgInN0YXJ0ICB0YWdzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgc3RhcnRfdGFncyk7CisgIEdTVF9MT0dfT0JKRUNUIChpZDNkZW11eCwgImVuZCAgICB0YWdzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgZW5kX3RhZ3MpOworICBHU1RfTE9HX09CSkVDVCAoaWQzZGVtdXgsICJtZXJnZWQgdGFnczogJSIgR1NUX1BUUl9GT1JNQVQsIG1lcmdlZCk7CisKKyAgcmV0dXJuIG1lcmdlZDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9pZDNkZW11eF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0SUQzRGVtdXggKmlkM2RlbXV4OworCisgIGlkM2RlbXV4ID0gR1NUX0lEM0RFTVVYIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QUkVGRVJfVjE6eworICAgICAgR1NUX09CSkVDVF9MT0NLIChpZDNkZW11eCk7CisgICAgICBpZDNkZW11eC0+cHJlZmVyX3YxID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGlkM2RlbXV4KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaWQzZGVtdXhfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdElEM0RlbXV4ICppZDNkZW11eDsKKworICBpZDNkZW11eCA9IEdTVF9JRDNERU1VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUFJFRkVSX1YxOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChpZDNkZW11eCk7CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgaWQzZGVtdXgtPnByZWZlcl92MSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoaWQzZGVtdXgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChpZDNkZW11eF9kZWJ1ZywgImlkM2RlbXV4IiwgMCwKKyAgICAgICJHU3RyZWFtZXIgSUQzIHRhZyBkZW11eGVyIik7CisKKyAgZ3N0X3RhZ19yZWdpc3Rlcl9tdXNpY2JyYWluel90YWdzICgpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiaWQzZGVtdXgiLAorICAgICAgR1NUX1JBTktfUFJJTUFSWSwgR1NUX1RZUEVfSUQzREVNVVgpOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgaWQzZGVtdXgsCisgICAgIkRlbXV4IElEM3YxIGFuZCBJRDN2MiB0YWdzIGZyb20gYSBmaWxlIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5oIGIvZ3N0L2lkM2RlbXV4L2dzdGlkM2RlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU2MWRmZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pZDNkZW11eC9nc3RpZDNkZW11eC5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIEdTdHJlYW1lciBJRDMgdGFnIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IEJlbmphbWluIE90dGUgPG90dGVAZ25vbWUub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfSUQzREVNVVhfSF9fCisjZGVmaW5lIF9fR1NUX0lEM0RFTVVYX0hfXworCisjaW5jbHVkZSA8Z3N0L3RhZy9nc3R0YWdkZW11eC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfSUQzREVNVVggXAorICAoZ3N0X2lkM2RlbXV4X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9JRDNERU1VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0lEM0RFTVVYLEdzdElEM0RlbXV4KSkKKyNkZWZpbmUgR1NUX0lEM0RFTVVYX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0lEM0RFTVVYLEdzdElEM0RlbXV4Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfSUQzREVNVVgob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9JRDNERU1VWCkpCisjZGVmaW5lIEdTVF9JU19JRDNERU1VWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9JRDNERU1VWCkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RJRDNEZW11eCAgICAgIEdzdElEM0RlbXV4OwordHlwZWRlZiBzdHJ1Y3QgX0dzdElEM0RlbXV4Q2xhc3MgR3N0SUQzRGVtdXhDbGFzczsKKworc3RydWN0IF9Hc3RJRDNEZW11eAoreworICBHc3RUYWdEZW11eCB0YWdkZW11eDsKKworICBnYm9vbGVhbiBwcmVmZXJfdjE7ICAgICAvKiBwcmVmZXIgSUQzdjEgdGFncyBvdmVyIElEM3YyIHRhZ3M/ICovCit9OworCitzdHJ1Y3QgX0dzdElEM0RlbXV4Q2xhc3MgCit7CisgIEdzdFRhZ0RlbXV4Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2lkM2RlbXV4X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0lEM0RFTVVYX0hfXyAqLworCmRpZmYgLS1naXQgYS9nc3QvaWQzZGVtdXgvbWVzb24uYnVpbGQgYi9nc3QvaWQzZGVtdXgvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhlYTU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pZDNkZW11eC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDggQEAKK2dzdGlkM2RlbXV4ID0gbGlicmFyeSgnZ3N0aWQzZGVtdXgnLAorICAnZ3N0aWQzZGVtdXguYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0X2RlcCwgZ3N0YmFzZV9kZXAsIGdzdHRhZ19kZXAsIGdzdHBidXRpbHNfZGVwXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2dzdC9pbWFnZWZyZWV6ZS9NYWtlZmlsZS5hbSBiL2dzdC9pbWFnZWZyZWV6ZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTZkMDM0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ltYWdlZnJlZXplL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0aW1hZ2VmcmVlemUubGEKKworbGliZ3N0aW1hZ2VmcmVlemVfbGFfU09VUkNFUyA9IGdzdGltYWdlZnJlZXplLmMKKworbGliZ3N0aW1hZ2VmcmVlemVfbGFfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKQorbGliZ3N0aW1hZ2VmcmVlemVfbGFfTElCQUREID0gJChHU1RfTElCUykKK2xpYmdzdGltYWdlZnJlZXplX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RpbWFnZWZyZWV6ZS5oCmRpZmYgLS1naXQgYS9nc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYyBiL2dzdC9pbWFnZWZyZWV6ZS9nc3RpbWFnZWZyZWV6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTM4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuYwpAQCAtMCwwICsxLDkwOCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1pbWFnZWZyZWV6ZQorICoKKyAqIFRoZSBpbWFnZWZyZWV6ZSBlbGVtZW50IGdlbmVyYXRlcyBhIHN0aWxsIGZyYW1lIHZpZGVvIHN0cmVhbSBmcm9tCisgKiB0aGUgaW5wdXQuIEl0IGR1cGxpY2F0ZXMgdGhlIGZpcnN0IGZyYW1lIHdpdGggdGhlIGZyYW1lcmF0ZSByZXF1ZXN0ZWQKKyAqIGJ5IGRvd25zdHJlYW0sIGFsbG93cyBzZWVraW5nIGFuZCBhbnN3ZXJzIHF1ZXJpZXMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249c29tZS5wbmcgISBkZWNvZGViaW4gISBpbWFnZWZyZWV6ZSAhIGF1dG92aWRlb3NpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgc2hvd3MgYSBzdGlsbCBmcmFtZSBzdHJlYW0gb2YgYSBQTkcgZmlsZS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworLyogVGhpcyBpcyBiYXNlZCBvbiB0aGUgaW1hZ2VmcmVlemUgZWxlbWVudCBmcm9tIFBpVGlWaToKKyAqIGh0dHA6Ly9naXQuZ25vbWUub3JnL2Jyb3dzZS9waXRpdmkvdHJlZS9waXRpdmkvZWxlbWVudHMvaW1hZ2VmcmVlemUucHkKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oPgorCisjaW5jbHVkZSAiZ3N0aW1hZ2VmcmVlemUuaCIKKworc3RhdGljIHZvaWQgZ3N0X2ltYWdlX2ZyZWV6ZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9pbWFnZV9mcmVlemVfcmVzZXQgKEdzdEltYWdlRnJlZXplICogc2VsZik7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfaW1hZ2VfZnJlZXplX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9pbWFnZV9mcmVlemVfc2lua19jaGFpbiAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfaW1hZ2VfZnJlZXplX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9pbWFnZV9mcmVlemVfc2lua19zZXRjYXBzIChHc3RJbWFnZUZyZWV6ZSAqIHNlbGYsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdENhcHMgKmdzdF9pbWFnZV9mcmVlemVfc2lua19nZXRjYXBzIChHc3RJbWFnZUZyZWV6ZSAqIHNlbGYsCisgICAgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ltYWdlX2ZyZWV6ZV9zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKK3N0YXRpYyB2b2lkIGdzdF9pbWFnZV9mcmVlemVfc3JjX2xvb3AgKEdzdFBhZCAqIHBhZCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ltYWdlX2ZyZWV6ZV9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9pbWFnZV9mcmVlemVfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfcGFkX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1yYXciKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfcGFkX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwgR1NUX1BBRF9TUkMsIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtcmF3IikpOworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfaW1hZ2VfZnJlZXplX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9pbWFnZV9mcmVlemVfZGVidWcKKworI2RlZmluZSBnc3RfaW1hZ2VfZnJlZXplX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdEltYWdlRnJlZXplLCBnc3RfaW1hZ2VfZnJlZXplLCBHU1RfVFlQRV9FTEVNRU5UKTsKKworCitzdGF0aWMgdm9pZAorZ3N0X2ltYWdlX2ZyZWV6ZV9jbGFzc19pbml0IChHc3RJbWFnZUZyZWV6ZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfaW1hZ2VfZnJlZXplX2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ltYWdlX2ZyZWV6ZV9jaGFuZ2Vfc3RhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiU3RpbGwgZnJhbWUgc3RyZWFtIGdlbmVyYXRvciIsCisgICAgICAiRmlsdGVyL1ZpZGVvIiwKKyAgICAgICJHZW5lcmF0ZXMgYSBzdGlsbCBmcmFtZSBzdHJlYW0gZnJvbSBhbiBpbWFnZSIsCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmc2lua19wYWRfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZzcmNfcGFkX3RlbXBsYXRlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9pbWFnZV9mcmVlemVfaW5pdCAoR3N0SW1hZ2VGcmVlemUgKiBzZWxmKQoreworICBzZWxmLT5zaW5rcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rX3BhZF90ZW1wbGF0ZSwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHNlbGYtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ltYWdlX2ZyZWV6ZV9zaW5rX2NoYWluKSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChzZWxmLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9pbWFnZV9mcmVlemVfc2lua19ldmVudCkpOworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAoc2VsZi0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfaW1hZ2VfZnJlZXplX3NpbmtfcXVlcnkpKTsKKyAgR1NUX1BBRF9TRVRfUFJPWFlfQUxMT0NBVElPTiAoc2VsZi0+c2lua3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzZWxmKSwgc2VsZi0+c2lua3BhZCk7CisKKyAgc2VsZi0+c3JjcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmNfcGFkX3RlbXBsYXRlLCAic3JjIik7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChzZWxmLT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ltYWdlX2ZyZWV6ZV9zcmNfZXZlbnQpKTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHNlbGYtPnNyY3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfaW1hZ2VfZnJlZXplX3NyY19xdWVyeSkpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChzZWxmLT5zcmNwYWQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoc2VsZiksIHNlbGYtPnNyY3BhZCk7CisKKyAgZ19tdXRleF9pbml0ICgmc2VsZi0+bG9jayk7CisKKyAgZ3N0X2ltYWdlX2ZyZWV6ZV9yZXNldCAoc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaW1hZ2VfZnJlZXplX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RJbWFnZUZyZWV6ZSAqc2VsZiA9IEdTVF9JTUFHRV9GUkVFWkUgKG9iamVjdCk7CisKKyAgZ3N0X2ltYWdlX2ZyZWV6ZV9yZXNldCAoc2VsZik7CisKKyAgZ19tdXRleF9jbGVhciAoJnNlbGYtPmxvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9pbWFnZV9mcmVlemVfcmVzZXQgKEdzdEltYWdlRnJlZXplICogc2VsZikKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlJlc2V0dGluZyBpbnRlcm5hbCBzdGF0ZSIpOworCisgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZzZWxmLT5idWZmZXIsIE5VTEwpOworCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWxmLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBzZWxmLT5uZWVkX3NlZ21lbnQgPSBUUlVFOworCisgIHNlbGYtPmZwc19uID0gc2VsZi0+ZnBzX2QgPSAwOworICBzZWxmLT5vZmZzZXQgPSAwOworICBzZWxmLT5zZXFudW0gPSAwOworICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworCisgIGdfYXRvbWljX2ludF9zZXQgKCZzZWxmLT5zZWVraW5nLCAwKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfaW1hZ2VfZnJlZXplX3Npbmtfc2V0Y2FwcyAoR3N0SW1hZ2VGcmVlemUgKiBzZWxmLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgZ2ludCBmcHNfbiwgZnBzX2Q7CisgIEdzdENhcHMgKm90aGVyY2FwcywgKmludGVyc2VjdGlvbjsKKyAgZ3VpbnQgaSwgbjsKKyAgR3N0UGFkICpwYWQ7CisKKyAgcGFkID0gc2VsZi0+c2lua3BhZDsKKyAgY2FwcyA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIlNldHRpbmcgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICAvKiAxLiBSZW1vdmUgZnJhbWVyYXRlICovCisgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCAiZnJhbWVyYXRlIik7CisgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT05fUkFOR0UsIDAsIDEsIEdfTUFYSU5ULCAxLAorICAgICAgTlVMTCk7CisKKyAgLyogMi4gSW50ZXJzZWN0IHdpdGggdGVtcGxhdGUgY2FwcyAqLworICBvdGhlcmNhcHMgPSAoR3N0Q2FwcyAqKSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAocGFkKTsKKyAgaW50ZXJzZWN0aW9uID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChjYXBzLCBvdGhlcmNhcHMpOworICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJJbnRlcnNlY3Rpbmc6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAid2l0aDogJSIgR1NUX1BUUl9GT1JNQVQsIG90aGVyY2Fwcyk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgImdhdmU6ICUiIEdTVF9QVFJfRk9STUFULCBpbnRlcnNlY3Rpb24pOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChvdGhlcmNhcHMpOworICBjYXBzID0gaW50ZXJzZWN0aW9uOworICBpbnRlcnNlY3Rpb24gPSBvdGhlcmNhcHMgPSBOVUxMOworCisgIC8qIDMuIEludGVyc2VjdCB3aXRoIGRvd25zdHJlYW0gcGVlciBjYXBzICovCisgIG90aGVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChzZWxmLT5zcmNwYWQsIGNhcHMpOworICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJQZWVyIHF1ZXJ5IHJlc3VsdGVkOiAlIiBHU1RfUFRSX0ZPUk1BVCwgb3RoZXJjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBjYXBzID0gb3RoZXJjYXBzOworICBvdGhlcmNhcHMgPSBOVUxMOworCisgIC8qIDQuIEZvciBldmVyeSBjYW5kaWRhdGUgdHJ5IHRvIHVzZSBpdCBkb3duc3RyZWFtIHdpdGggZnJhbWVyYXRlIGFzCisgICAqIG5lYXIgYXMgcG9zc2libGUgdG8gMjUvMSAqLworICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgR3N0Q2FwcyAqY2FuZGlkYXRlID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9zdHJ1Y3R1cmVfY29weSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSkpOworCisgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2FuZGlkYXRlLCBzKTsKKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGRfdHlwZWQgKHMsICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTikgfHwKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9mcmFjdGlvbiAocywgImZyYW1lcmF0ZSIsIDI1LCAxKSkgeworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfZnJhY3Rpb24gKHMsICJmcmFtZXJhdGUiLCAmZnBzX24sICZmcHNfZCk7CisgICAgICBpZiAoZnBzX2QgIT0gMCkgeworICAgICAgICBpZiAoZ3N0X3BhZF9zZXRfY2FwcyAoc2VsZi0+c3JjcGFkLCBjYW5kaWRhdGUpKSB7CisgICAgICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICAgICAgc2VsZi0+ZnBzX24gPSBmcHNfbjsKKyAgICAgICAgICBzZWxmLT5mcHNfZCA9IGZwc19kOworICAgICAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiU2V0dGluZyBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBjYW5kaWRhdGUpOworICAgICAgICAgIHJldCA9IFRSVUU7CisgICAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhbmRpZGF0ZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFkLCAiSW52YWxpZCBjYXBzIHdpdGggZnJhbWVyYXRlICVkLyVkIiwgZnBzX24sCisgICAgICAgICAgICBmcHNfZCk7CisgICAgICB9CisgICAgfQorICAgIGdzdF9jYXBzX3VucmVmIChjYW5kaWRhdGUpOworICB9CisKKyAgaWYgKCFyZXQpCisgICAgR1NUX0VSUk9SX09CSkVDVCAocGFkLCAiTm8gdXNhYmxlIGNhcHMgZm91bmQiKTsKKworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogcmVtb3ZlIGZyYW1lcmF0ZSBpbiB3cml0YWJsZSBAY2FwcyAqLworc3RhdGljIHZvaWQKK2dzdF9pbWFnZV9mcmVlemVfcmVtb3ZlX2ZwcyAoR3N0SW1hZ2VGcmVlemUgKiBzZWxmLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2ludCBpLCBuOworCisgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCAiZnJhbWVyYXRlIik7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTl9SQU5HRSwgMCwgMSwgR19NQVhJTlQsCisgICAgICAgIDEsIE5VTEwpOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9pbWFnZV9mcmVlemVfc2lua19nZXRjYXBzIChHc3RJbWFnZUZyZWV6ZSAqIHNlbGYsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnJldCwgKnRtcCwgKnRlbXBsOworICBHc3RQYWQgKnBhZDsKKworICBwYWQgPSBzZWxmLT5zaW5rcGFkOworCisgIGlmIChmaWx0ZXIpIHsKKyAgICBmaWx0ZXIgPSBnc3RfY2Fwc19jb3B5IChmaWx0ZXIpOworICAgIGdzdF9pbWFnZV9mcmVlemVfcmVtb3ZlX2ZwcyAoc2VsZiwgZmlsdGVyKTsKKyAgfQorICB0ZW1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChwYWQpOworICB0bXAgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAoc2VsZi0+c3JjcGFkLCBmaWx0ZXIpOworICBpZiAodG1wKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNlbGYsICJwZWVyIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIHRtcCk7CisgICAgcmV0ID0gZ3N0X2NhcHNfaW50ZXJzZWN0ICh0bXAsIHRlbXBsKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoc2VsZiwgImdvaW5nIHRvIGNvcHkiKTsKKyAgICByZXQgPSBnc3RfY2Fwc19jb3B5ICh0ZW1wbCk7CisgIH0KKyAgaWYgKHRlbXBsKQorICAgIGdzdF9jYXBzX3VucmVmICh0ZW1wbCk7CisgIGlmIChmaWx0ZXIpCisgICAgZ3N0X2NhcHNfdW5yZWYgKGZpbHRlcik7CisKKyAgcmV0ID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocmV0KTsKKyAgZ3N0X2ltYWdlX2ZyZWV6ZV9yZW1vdmVfZnBzIChzZWxmLCByZXQpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJSZXR1cm5pbmcgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIHJldCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfaW1hZ2VfZnJlZXplX3NpbmtfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RJbWFnZUZyZWV6ZSAqc2VsZiA9IEdTVF9JTUFHRV9GUkVFWkUgKHBhcmVudCk7CisgIGdib29sZWFuIHJldDsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiSGFuZGxpbmcgcXVlcnkgb2YgdHlwZSAnJXMnIiwKKyAgICAgIGdzdF9xdWVyeV90eXBlX2dldF9uYW1lIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZjYXBzKTsKKyAgICAgIGNhcHMgPSBnc3RfaW1hZ2VfZnJlZXplX3NpbmtfZ2V0Y2FwcyAoc2VsZiwgY2Fwcyk7CisgICAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9pbWFnZV9mcmVlemVfY29udmVydCAoR3N0SW1hZ2VGcmVlemUgKiBzZWxmLAorICAgIEdzdEZvcm1hdCBzcmNfZm9ybWF0LCBnaW50NjQgc3JjX3ZhbHVlLAorICAgIEdzdEZvcm1hdCAqIGRlc3RfZm9ybWF0LCBnaW50NjQgKiBkZXN0X3ZhbHVlKQoreworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBpZiAoc3JjX2Zvcm1hdCA9PSAqZGVzdF9mb3JtYXQpIHsKKyAgICAqZGVzdF92YWx1ZSA9IHNyY192YWx1ZTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGlmIChzcmNfdmFsdWUgPT0gLTEpIHsKKyAgICAqZGVzdF92YWx1ZSA9IC0xOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgc3dpdGNoIChzcmNfZm9ybWF0KSB7CisgICAgY2FzZSBHU1RfRk9STUFUX0RFRkFVTFQ6eworICAgICAgc3dpdGNoICgqZGVzdF9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICAgICAgaWYgKHNlbGYtPmZwc19uID09IDApCisgICAgICAgICAgICAqZGVzdF92YWx1ZSA9IC0xOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpkZXN0X3ZhbHVlID0KKyAgICAgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNyY192YWx1ZSwgR1NUX1NFQ09ORCAqIHNlbGYtPmZwc19kLAorICAgICAgICAgICAgICAgIHNlbGYtPmZwc19uKTsKKyAgICAgICAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgICAgICAgIHJldCA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6eworICAgICAgc3dpdGNoICgqZGVzdF9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0RFRkFVTFQ6CisgICAgICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICAgICAgKmRlc3RfdmFsdWUgPQorICAgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNyY192YWx1ZSwgc2VsZi0+ZnBzX24sCisgICAgICAgICAgICAgIHNlbGYtPmZwc19kICogR1NUX1NFQ09ORCk7CisgICAgICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgICAgICByZXQgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ltYWdlX2ZyZWV6ZV9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RJbWFnZUZyZWV6ZSAqc2VsZiA9IEdTVF9JTUFHRV9GUkVFWkUgKHBhcmVudCk7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJIYW5kbGluZyBxdWVyeSBvZiB0eXBlICclcyciLAorICAgICAgZ3N0X3F1ZXJ5X3R5cGVfZ2V0X25hbWUgKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpKTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9DT05WRVJUOnsKKyAgICAgIEdzdEZvcm1hdCBzcmNfZm9ybWF0LCBkZXN0X2Zvcm1hdDsKKyAgICAgIGdpbnQ2NCBzcmNfdmFsdWUsIGRlc3RfdmFsdWU7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9jb252ZXJ0IChxdWVyeSwgJnNyY19mb3JtYXQsICZzcmNfdmFsdWUsICZkZXN0X2Zvcm1hdCwKKyAgICAgICAgICAmZGVzdF92YWx1ZSk7CisgICAgICByZXQgPQorICAgICAgICAgIGdzdF9pbWFnZV9mcmVlemVfY29udmVydCAoc2VsZiwgc3JjX2Zvcm1hdCwgc3JjX3ZhbHVlLCAmZGVzdF9mb3JtYXQsCisgICAgICAgICAgJmRlc3RfdmFsdWUpOworICAgICAgaWYgKHJldCkKKyAgICAgICAgZ3N0X3F1ZXJ5X3NldF9jb252ZXJ0IChxdWVyeSwgc3JjX2Zvcm1hdCwgc3JjX3ZhbHVlLCBkZXN0X2Zvcm1hdCwKKyAgICAgICAgICAgIGRlc3RfdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX1BPU0lUSU9OOnsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisgICAgICBnaW50NjQgcG9zaXRpb247CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9wb3NpdGlvbiAocXVlcnksICZmb3JtYXQsIE5VTEwpOworICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0RFRkFVTFQ6eworICAgICAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgICAgICAgIHBvc2l0aW9uID0gc2VsZi0+b2Zmc2V0OworICAgICAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICAgICAgcmV0ID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEdTVF9GT1JNQVRfVElNRTp7CisgICAgICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICAgICAgcG9zaXRpb24gPSBzZWxmLT5zZWdtZW50LnBvc2l0aW9uOworICAgICAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICAgICAgcmV0ID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAocmV0KSB7CisgICAgICAgIGdzdF9xdWVyeV9zZXRfcG9zaXRpb24gKHF1ZXJ5LCBmb3JtYXQsIHBvc2l0aW9uKTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLAorICAgICAgICAgICAgIlJldHVybmluZyBwb3NpdGlvbiAlIiBHX0dJTlQ2NF9GT1JNQVQgIiBpbiBmb3JtYXQgJXMiLCBwb3NpdGlvbiwKKyAgICAgICAgICAgIGdzdF9mb3JtYXRfZ2V0X25hbWUgKGZvcm1hdCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiUG9zaXRpb24gcXVlcnkgZmFpbGVkIik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfRFVSQVRJT046eworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgICAgIGdpbnQ2NCBkdXJhdGlvbjsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2R1cmF0aW9uIChxdWVyeSwgJmZvcm1hdCwgTlVMTCk7CisgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfVElNRTp7CisgICAgICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICAgICAgZHVyYXRpb24gPSBzZWxmLT5zZWdtZW50LnN0b3A7CisgICAgICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgICAgICByZXQgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9ERUZBVUxUOnsKKyAgICAgICAgICBnX211dGV4X2xvY2sgKCZzZWxmLT5sb2NrKTsKKyAgICAgICAgICBkdXJhdGlvbiA9IHNlbGYtPnNlZ21lbnQuc3RvcDsKKyAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gLTEpCisgICAgICAgICAgICBkdXJhdGlvbiA9CisgICAgICAgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChkdXJhdGlvbiwgc2VsZi0+ZnBzX24sCisgICAgICAgICAgICAgICAgR1NUX1NFQ09ORCAqIHNlbGYtPmZwc19kKTsKKyAgICAgICAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgICAgICAgIHJldCA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKHJldCkgeworICAgICAgICBnc3RfcXVlcnlfc2V0X2R1cmF0aW9uIChxdWVyeSwgZm9ybWF0LCBkdXJhdGlvbik7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwKKyAgICAgICAgICAgICJSZXR1cm5pbmcgZHVyYXRpb24gJSIgR19HSU5UNjRfRk9STUFUICIgaW4gZm9ybWF0ICVzIiwgZHVyYXRpb24sCisgICAgICAgICAgICBnc3RfZm9ybWF0X2dldF9uYW1lIChmb3JtYXQpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIkR1cmF0aW9uIHF1ZXJ5IGZhaWxlZCIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX1NFRUtJTkc6eworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgICAgIGdib29sZWFuIHNlZWthYmxlOworCisgICAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksICZmb3JtYXQsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgc2Vla2FibGUgPSAoZm9ybWF0ID09IEdTVF9GT1JNQVRfVElNRSB8fCBmb3JtYXQgPT0gR1NUX0ZPUk1BVF9ERUZBVUxUKTsKKworICAgICAgZ3N0X3F1ZXJ5X3NldF9zZWVraW5nIChxdWVyeSwgZm9ybWF0LCBzZWVrYWJsZSwgKHNlZWthYmxlID8gMCA6IC0xKSwgLTEpOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9MQVRFTkNZOgorICAgICAgLyogVGhpcyB3aWxsIG9ubHkgcmV0dXJuIGFuIGFjY3VyYXRlIGxhdGVuY3kgZm9yIHRoZSBmaXJzdCBidWZmZXIgc2luY2UKKyAgICAgICAqIGFsbCBmdXJ0aGVyIGJ1ZmZlcnMgb3V0cHV0dGVkIGJ5IHVzIGFyZSBqdXN0IGNvcGllcyBvZiB0aGF0IG9uZSwgYW5kCisgICAgICAgKiB0aGUgbGF0ZW5jeSBpcyAwIGluIHRoYXQgY2FzZS4gSG93ZXZlciwgbGF0ZW5jeSBjaGFuZ2VzIGFyZSBub3QKKyAgICAgICAqIHN0cmFpZ2h0Zm9yd2FyZCwgc28gbGV0J3MgZG8gdGhlIGNvbnNlcnZhdGl2ZSBmaXggZm9yIG5vdy4gKi8KKyAgICAgIHJldCA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9pbWFnZV9mcmVlemVfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdEltYWdlRnJlZXplICpzZWxmID0gR1NUX0lNQUdFX0ZSRUVaRSAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJHb3QgJXMgZXZlbnQiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICBnc3RfaW1hZ2VfZnJlZXplX3Npbmtfc2V0Y2FwcyAoc2VsZiwgY2Fwcyk7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRU9TOgorICAgICAgaWYgKCFzZWxmLT5idWZmZXIpIHsKKyAgICAgICAgLyogaWYgd2UgcmVjZWl2ZSBFT1MgYmVmb3JlIGEgYnVmZmVyIGFycml2ZXMsIHRoZW4gbGV0IGl0IHBhc3MgKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkVPUyB3aXRob3V0IGlucHV0IGJ1ZmZlciwgcGFzc2luZyBvbiIpOworICAgICAgICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNyY3BhZCwgZXZlbnQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJEcm9wcGluZyBldmVudCIpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RBUlQ6CisgICAgICBnc3RfaW1hZ2VfZnJlZXplX3Jlc2V0IChzZWxmKTsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNyY3BhZCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9pbWFnZV9mcmVlemVfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0SW1hZ2VGcmVlemUgKnNlbGYgPSBHU1RfSU1BR0VfRlJFRVpFIChwYXJlbnQpOworICBnYm9vbGVhbiByZXQ7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIkdvdCAlcyBldmVudCIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfTkFWSUdBVElPTjoKKyAgICBjYXNlIEdTVF9FVkVOVF9RT1M6CisgICAgY2FzZSBHU1RfRVZFTlRfTEFURU5DWToKKyAgICBjYXNlIEdTVF9FVkVOVF9TVEVQOgorICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiRHJvcHBpbmcgZXZlbnQiKTsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX1NFRUs6eworICAgICAgZ2RvdWJsZSByYXRlOworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgICAgIEdzdFNlZWtGbGFncyBmbGFnczsKKyAgICAgIEdzdFNlZWtUeXBlIHN0YXJ0X3R5cGUsIHN0b3BfdHlwZTsKKyAgICAgIGdpbnQ2NCBzdGFydCwgc3RvcDsKKyAgICAgIGdpbnQ2NCBsYXN0X3N0b3A7CisgICAgICBnYm9vbGVhbiBzdGFydF90YXNrOworICAgICAgZ2Jvb2xlYW4gZmx1c2g7CisgICAgICBndWludDMyIHNlcW51bTsKKworICAgICAgc2VxbnVtID0gZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KTsKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgJnJhdGUsICZmb3JtYXQsICZmbGFncywgJnN0YXJ0X3R5cGUsICZzdGFydCwKKyAgICAgICAgICAmc3RvcF90eXBlLCAmc3RvcCk7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKworICAgICAgZmx1c2ggPSAhICEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0ZMVVNIKTsKKworICAgICAgaWYgKGZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUgJiYgZm9ybWF0ICE9IEdTVF9GT1JNQVRfREVGQVVMVCkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChwYWQsICJTZWVrIGluIGludmFsaWQgZm9ybWF0OiAlcyIsCisgICAgICAgICAgICBnc3RfZm9ybWF0X2dldF9uYW1lIChmb3JtYXQpKTsKKyAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoZm9ybWF0ID09IEdTVF9GT1JNQVRfREVGQVVMVCkgeworICAgICAgICBmb3JtYXQgPSBHU1RfRk9STUFUX1RJTUU7CisgICAgICAgIGlmICghZ3N0X2ltYWdlX2ZyZWV6ZV9jb252ZXJ0IChzZWxmLCBHU1RfRk9STUFUX0RFRkFVTFQsIHN0YXJ0LCAmZm9ybWF0LAorICAgICAgICAgICAgICAgICZzdGFydCkKKyAgICAgICAgICAgIHx8ICFnc3RfaW1hZ2VfZnJlZXplX2NvbnZlcnQgKHNlbGYsIEdTVF9GT1JNQVRfREVGQVVMVCwgc3RvcCwKKyAgICAgICAgICAgICAgICAmZm9ybWF0LCAmc3RvcCkKKyAgICAgICAgICAgIHx8IHN0YXJ0ID09IC0xIHx8IHN0b3AgPT0gLTEpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChwYWQsCisgICAgICAgICAgICAgICJGYWlsZWQgdG8gY29udmVydCBzZWVrIGZyb20gREVGQVVMVCBmb3JtYXQgaW50byBUSU1FIGZvcm1hdCIpOworICAgICAgICAgIHJldCA9IEZBTFNFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChmbHVzaCkgeworICAgICAgICBHc3RFdmVudCAqZTsKKworICAgICAgICBnX2F0b21pY19pbnRfc2V0ICgmc2VsZi0+c2Vla2luZywgMSk7CisgICAgICAgIGUgPSBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0YXJ0ICgpOworICAgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZSwgc2VxbnVtKTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzZWxmLT5zcmNwYWQsIGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChzZWxmLT5zcmNwYWQpOworICAgICAgfQorCisgICAgICBHU1RfUEFEX1NUUkVBTV9MT0NLIChzZWxmLT5zcmNwYWQpOworCisgICAgICBnX211dGV4X2xvY2sgKCZzZWxmLT5sb2NrKTsKKworICAgICAgZ3N0X3NlZ21lbnRfZG9fc2VlayAoJnNlbGYtPnNlZ21lbnQsIHJhdGUsIGZvcm1hdCwgZmxhZ3MsIHN0YXJ0X3R5cGUsCisgICAgICAgICAgc3RhcnQsIHN0b3BfdHlwZSwgc3RvcCwgTlVMTCk7CisgICAgICBzZWxmLT5uZWVkX3NlZ21lbnQgPSBUUlVFOworICAgICAgbGFzdF9zdG9wID0gc2VsZi0+c2VnbWVudC5wb3NpdGlvbjsKKworICAgICAgc3RhcnRfdGFzayA9IHNlbGYtPmJ1ZmZlciAhPSBOVUxMOworICAgICAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKworICAgICAgaWYgKGZsdXNoKSB7CisgICAgICAgIEdzdEV2ZW50ICplOworCisgICAgICAgIGUgPSBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0b3AgKFRSVUUpOworICAgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZSwgc2VxbnVtKTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzZWxmLT5zcmNwYWQsIGUpOworICAgICAgICBnX2F0b21pY19pbnRfc2V0ICgmc2VsZi0+c2Vla2luZywgMCk7CisgICAgICB9CisKKyAgICAgIGlmIChmbGFncyAmIEdTVF9TRUVLX0ZMQUdfU0VHTUVOVCkgeworICAgICAgICBHc3RNZXNzYWdlICptOworCisgICAgICAgIG0gPSBnc3RfbWVzc2FnZV9uZXdfc2VnbWVudF9zdGFydCAoR1NUX09CSkVDVCAoc2VsZiksCisgICAgICAgICAgICBmb3JtYXQsIGxhc3Rfc3RvcCk7CisgICAgICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKHNlbGYpLCBtKTsKKyAgICAgIH0KKworICAgICAgc2VsZi0+c2VxbnVtID0gc2VxbnVtOworICAgICAgR1NUX1BBRF9TVFJFQU1fVU5MT0NLIChzZWxmLT5zcmNwYWQpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJTZWVrIHN1Y2Nlc3NmdWwiKTsKKworICAgICAgaWYgKHN0YXJ0X3Rhc2spIHsKKyAgICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisKKyAgICAgICAgaWYgKHNlbGYtPmJ1ZmZlciAhPSBOVUxMKQorICAgICAgICAgIGdzdF9wYWRfc3RhcnRfdGFzayAoc2VsZi0+c3JjcGFkLAorICAgICAgICAgICAgICAoR3N0VGFza0Z1bmN0aW9uKSBnc3RfaW1hZ2VfZnJlZXplX3NyY19sb29wLCBzZWxmLT5zcmNwYWQsIE5VTEwpOworCisgICAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisgICAgICB9CisKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RBUlQ6CisgICAgICBnc3RfaW1hZ2VfZnJlZXplX3Jlc2V0IChzZWxmKTsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNpbmtwYWQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9pbWFnZV9mcmVlemVfc2lua19jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RJbWFnZUZyZWV6ZSAqc2VsZiA9IEdTVF9JTUFHRV9GUkVFWkUgKHBhcmVudCk7CisKKyAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgIGlmIChzZWxmLT5idWZmZXIpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJBbHJlYWR5IGhhdmUgYSBidWZmZXIsIGRyb3BwaW5nIik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisgIH0KKworICBzZWxmLT5idWZmZXIgPSBidWZmZXI7CisKKyAgZ3N0X3BhZF9zdGFydF90YXNrIChzZWxmLT5zcmNwYWQsIChHc3RUYXNrRnVuY3Rpb24pIGdzdF9pbWFnZV9mcmVlemVfc3JjX2xvb3AsCisgICAgICBzZWxmLT5zcmNwYWQsIE5VTEwpOworICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICByZXR1cm4gR1NUX0ZMT1dfRU9TOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2ltYWdlX2ZyZWV6ZV9zcmNfbG9vcCAoR3N0UGFkICogcGFkKQoreworICBHc3RJbWFnZUZyZWV6ZSAqc2VsZiA9IEdTVF9JTUFHRV9GUkVFWkUgKEdTVF9QQURfUEFSRU5UIChwYWQpKTsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIGd1aW50NjQgb2Zmc2V0OworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCB0aW1lc3RhbXBfZW5kOworICBndWludDY0IGNzdGFydCwgY3N0b3A7CisgIGdib29sZWFuIGluX3NlZywgZW9zOworICBHc3RGbG93UmV0dXJuIGZsb3dfcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgZ19tdXRleF9sb2NrICgmc2VsZi0+bG9jayk7CisgIGlmICghZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChzZWxmLT5zcmNwYWQpKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocGFkLCAiTm90IG5lZ290aWF0ZWQgeWV0Iik7CisgICAgZmxvd19yZXQgPSBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgIGdvdG8gcGF1c2VfdGFzazsKKyAgfQorCisgIGlmICghc2VsZi0+YnVmZmVyKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocGFkLCAiSGF2ZSBubyBidWZmZXIgeWV0Iik7CisgICAgZmxvd19yZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPmxvY2spOworICAgIGdvdG8gcGF1c2VfdGFzazsKKyAgfQorICBidWZmZXIgPSBnc3RfYnVmZmVyX2NvcHkgKHNlbGYtPmJ1ZmZlcik7CisKKyAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5sb2NrKTsKKworICBpZiAoc2VsZi0+bmVlZF9zZWdtZW50KSB7CisgICAgR3N0RXZlbnQgKmU7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJQdXNoaW5nIFNFR01FTlQgZXZlbnQ6ICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwKKyAgICAgICAgJnNlbGYtPnNlZ21lbnQpOworICAgIGUgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWxmLT5zZWdtZW50KTsKKworICAgIGlmIChzZWxmLT5zZXFudW0pCisgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZSwgc2VsZi0+c2VxbnVtKTsKKworICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICAgIGlmIChzZWxmLT5zZWdtZW50LnJhdGUgPj0gMCkgeworICAgICAgc2VsZi0+b2Zmc2V0ID0KKyAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNlbGYtPnNlZ21lbnQuc3RhcnQsIHNlbGYtPmZwc19uLAorICAgICAgICAgIHNlbGYtPmZwc19kICogR1NUX1NFQ09ORCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNlbGYtPm9mZnNldCA9CisgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzZWxmLT5zZWdtZW50LnN0b3AsIHNlbGYtPmZwc19uLAorICAgICAgICAgIHNlbGYtPmZwc19kICogR1NUX1NFQ09ORCk7CisgICAgfQorICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisKKyAgICBzZWxmLT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc2VsZi0+c3JjcGFkLCBlKTsKKyAgfQorCisgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPmxvY2spOworICBvZmZzZXQgPSBzZWxmLT5vZmZzZXQ7CisKKyAgaWYgKHNlbGYtPmZwc19uICE9IDApIHsKKyAgICB0aW1lc3RhbXAgPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKG9mZnNldCwgc2VsZi0+ZnBzX2QgKiBHU1RfU0VDT05ELCBzZWxmLT5mcHNfbik7CisgICAgdGltZXN0YW1wX2VuZCA9CisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAob2Zmc2V0ICsgMSwgc2VsZi0+ZnBzX2QgKiBHU1RfU0VDT05ELAorICAgICAgICBzZWxmLT5mcHNfbik7CisgIH0gZWxzZSB7CisgICAgdGltZXN0YW1wID0gc2VsZi0+c2VnbWVudC5zdGFydDsKKyAgICB0aW1lc3RhbXBfZW5kID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgfQorCisgIGVvcyA9IChzZWxmLT5mcHNfbiA9PSAwICYmIG9mZnNldCA+IDApIHx8CisgICAgICAoc2VsZi0+c2VnbWVudC5yYXRlID49IDAgJiYgc2VsZi0+c2VnbWVudC5zdG9wICE9IC0xCisgICAgICAmJiB0aW1lc3RhbXAgPiBzZWxmLT5zZWdtZW50LnN0b3ApIHx8IChzZWxmLT5zZWdtZW50LnJhdGUgPCAwCisgICAgICAmJiBvZmZzZXQgPT0gMCkgfHwgKHNlbGYtPnNlZ21lbnQucmF0ZSA8IDAKKyAgICAgICYmIHNlbGYtPnNlZ21lbnQuc3RhcnQgIT0gLTEgJiYgdGltZXN0YW1wX2VuZCA8IHNlbGYtPnNlZ21lbnQuc3RhcnQpOworCisgIGlmIChzZWxmLT5mcHNfbiA9PSAwICYmIG9mZnNldCA+IDApCisgICAgaW5fc2VnID0gRkFMU0U7CisgIGVsc2UKKyAgICBpbl9zZWcgPQorICAgICAgICBnc3Rfc2VnbWVudF9jbGlwICgmc2VsZi0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXAsCisgICAgICAgIHRpbWVzdGFtcF9lbmQsICZjc3RhcnQsICZjc3RvcCk7CisKKyAgaWYgKGluX3NlZykgeworICAgIHNlbGYtPnNlZ21lbnQucG9zaXRpb24gPSBjc3RhcnQ7CisgICAgaWYgKHNlbGYtPnNlZ21lbnQucmF0ZSA+PSAwKQorICAgICAgc2VsZi0+c2VnbWVudC5wb3NpdGlvbiA9IGNzdG9wOworICB9CisKKyAgaWYgKHNlbGYtPnNlZ21lbnQucmF0ZSA+PSAwKQorICAgIHNlbGYtPm9mZnNldCsrOworICBlbHNlCisgICAgc2VsZi0+b2Zmc2V0LS07CisgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bG9jayk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiSGFuZGxpbmcgYnVmZmVyIHdpdGggdGltZXN0YW1wICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChpbl9zZWcpIHsKKyAgICBHU1RfQlVGRkVSX0RUUyAoYnVmZmVyKSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcikgPSBjc3RhcnQ7CisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSA9IGNzdG9wIC0gY3N0YXJ0OworICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpID0gb2Zmc2V0OworICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmZmVyKSA9IG9mZnNldCArIDE7CisgICAgZmxvd19yZXQgPSBnc3RfcGFkX3B1c2ggKHNlbGYtPnNyY3BhZCwgYnVmZmVyKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJQdXNoaW5nIGJ1ZmZlciByZXN1bHRlZCBpbiAlcyIsCisgICAgICAgIGdzdF9mbG93X2dldF9uYW1lIChmbG93X3JldCkpOworICAgIGlmIChmbG93X3JldCAhPSBHU1RfRkxPV19PSykKKyAgICAgIGdvdG8gcGF1c2VfdGFzazsKKyAgfSBlbHNlIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICB9CisKKyAgaWYgKGVvcykgeworICAgIGZsb3dfcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgIGdvdG8gcGF1c2VfdGFzazsKKyAgfQorCisgIHJldHVybjsKKworcGF1c2VfdGFzazoKKyAgeworICAgIGNvbnN0IGdjaGFyICpyZWFzb24gPSBnc3RfZmxvd19nZXRfbmFtZSAoZmxvd19yZXQpOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHNlbGYsICJwYXVzaW5nIHRhc2ssIHJlYXNvbiAlcyIsIHJlYXNvbik7CisgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChwYWQpOworCisgICAgaWYgKGZsb3dfcmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgICAgaWYgKChzZWxmLT5zZWdtZW50LmZsYWdzICYgR1NUX1NFRUtfRkxBR19TRUdNRU5UKSkgeworICAgICAgICBHc3RNZXNzYWdlICptOworICAgICAgICBHc3RFdmVudCAqZTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJTZW5kaW5nIHNlZ21lbnQgZG9uZSBhdCBlbmQgb2Ygc2VnbWVudCIpOworICAgICAgICBpZiAoc2VsZi0+c2VnbWVudC5yYXRlID49IDApIHsKKyAgICAgICAgICBtID0gZ3N0X21lc3NhZ2VfbmV3X3NlZ21lbnRfZG9uZSAoR1NUX09CSkVDVF9DQVNUIChzZWxmKSwKKyAgICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBzZWxmLT5zZWdtZW50LnN0b3ApOworICAgICAgICAgIGUgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnRfZG9uZSAoR1NUX0ZPUk1BVF9USU1FLCBzZWxmLT5zZWdtZW50LnN0b3ApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG0gPSBnc3RfbWVzc2FnZV9uZXdfc2VnbWVudF9kb25lIChHU1RfT0JKRUNUX0NBU1QgKHNlbGYpLAorICAgICAgICAgICAgICBHU1RfRk9STUFUX1RJTUUsIHNlbGYtPnNlZ21lbnQuc3RhcnQpOworICAgICAgICAgIGUgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnRfZG9uZSAoR1NUX0ZPUk1BVF9USU1FLCBzZWxmLT5zZWdtZW50LnN0YXJ0KTsKKyAgICAgICAgfQorICAgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHNlbGYpLCBtKTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzZWxmLT5zcmNwYWQsIGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR3N0RXZlbnQgKmUgPSBnc3RfZXZlbnRfbmV3X2VvcyAoKTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJTZW5kaW5nIEVPUyBhdCBlbmQgb2Ygc2VnbWVudCIpOworCisgICAgICAgIGlmIChzZWxmLT5zZXFudW0pCisgICAgICAgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGUsIHNlbGYtPnNlcW51bSk7CisgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc2VsZi0+c3JjcGFkLCBlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGZsb3dfcmV0ID09IEdTVF9GTE9XX05PVF9MSU5LRUQgfHwgZmxvd19yZXQgPCBHU1RfRkxPV19FT1MpIHsKKyAgICAgIEdzdEV2ZW50ICplID0gZ3N0X2V2ZW50X25ld19lb3MgKCk7CisKKyAgICAgIEdTVF9FTEVNRU5UX0ZMT1dfRVJST1IgKHNlbGYsIGZsb3dfcmV0KTsKKworICAgICAgaWYgKHNlbGYtPnNlcW51bSkKKyAgICAgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGUsIHNlbGYtPnNlcW51bSk7CisKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc2VsZi0+c3JjcGFkLCBlKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2ltYWdlX2ZyZWV6ZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RJbWFnZUZyZWV6ZSAqc2VsZiA9IEdTVF9JTUFHRV9GUkVFWkUgKGVsZW1lbnQpOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1M7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGdzdF9pbWFnZV9mcmVlemVfcmVzZXQgKHNlbGYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9wYWRfc3RvcF90YXNrIChzZWxmLT5zcmNwYWQpOworICAgICAgZ3N0X2ltYWdlX2ZyZWV6ZV9yZXNldCAoc2VsZik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSkKKyAgICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfaW1hZ2VfZnJlZXplX2RlYnVnLCAiaW1hZ2VmcmVlemUiLCAwLAorICAgICAgImltYWdlZnJlZXplIGVsZW1lbnQiKTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJpbWFnZWZyZWV6ZSIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfSU1BR0VfRlJFRVpFKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBpbWFnZWZyZWV6ZSwKKyAgICAiU3RpbGwgZnJhbWUgc3RyZWFtIGdlbmVyYXRvciIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmggYi9nc3QvaW1hZ2VmcmVlemUvZ3N0aW1hZ2VmcmVlemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWU4MDNiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ltYWdlZnJlZXplL2dzdGltYWdlZnJlZXplLmgKQEAgLTAsMCArMSw3NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9JTUFHRV9GUkVFWkVfSF9fCisjZGVmaW5lIF9fR1NUX0lNQUdFX0ZSRUVaRV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0lNQUdFX0ZSRUVaRSBcCisgIChnc3RfaW1hZ2VfZnJlZXplX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9JTUFHRV9GUkVFWkUob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9JTUFHRV9GUkVFWkUsR3N0SW1hZ2VGcmVlemUpKQorI2RlZmluZSBHU1RfSU1BR0VfRlJFRVpFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0lNQUdFX0ZSRUVaRSxHc3RJbWFnZUZyZWV6ZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lNQUdFX0ZSRUVaRV9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksR1NUX1RZUEVfSU1BR0VfRlJFRVpFLEdzdEltYWdlRnJlZXplQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfSU1BR0VfRlJFRVpFKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfSU1BR0VfRlJFRVpFKSkKKyNkZWZpbmUgR1NUX0lTX0lNQUdFX0ZSRUVaRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9JTUFHRV9GUkVFWkUpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0SW1hZ2VGcmVlemUgR3N0SW1hZ2VGcmVlemU7Cit0eXBlZGVmIHN0cnVjdCBfR3N0SW1hZ2VGcmVlemVDbGFzcyBHc3RJbWFnZUZyZWV6ZUNsYXNzOworCitzdHJ1Y3QgX0dzdEltYWdlRnJlZXplCit7CisgIEdzdEVsZW1lbnQgcGFyZW50OworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIEdzdFBhZCAqc2lua3BhZDsKKyAgR3N0UGFkICpzcmNwYWQ7CisKKyAgR011dGV4IGxvY2s7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBnaW50IGZwc19uLCBmcHNfZDsKKworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIGdib29sZWFuIG5lZWRfc2VnbWVudDsKKyAgZ3VpbnQgc2VxbnVtOworCisgIGd1aW50NjQgb2Zmc2V0OworCisgIC8qIFRSVUUgaWYgY3VycmVudGx5IGRvaW5nIGEgZmx1c2hpbmcgc2VlaywgcHJvdGVjdGVkCisgICAqIGJ5IHNyY3BhZCdzIHN0cmVhbSBsb2NrICovCisgIGdpbnQgc2Vla2luZzsKK307CisKK3N0cnVjdCBfR3N0SW1hZ2VGcmVlemVDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2ltYWdlX2ZyZWV6ZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9JTUFHRV9GUkVFWkVfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvaW1hZ2VmcmVlemUvbWVzb24uYnVpbGQgYi9nc3QvaW1hZ2VmcmVlemUvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FmNmEwMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pbWFnZWZyZWV6ZS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDggQEAKK2dzdGltYWdlZnJlZXplID0gbGlicmFyeSgnZ3N0aW1hZ2VmcmVlemUnLAorICAnZ3N0aW1hZ2VmcmVlemUuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBnbGliX2RlcHMgKyBbZ3N0X2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvaW50ZXJsZWF2ZS9NYWtlZmlsZS5hbSBiL2dzdC9pbnRlcmxlYXZlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMjhkM2UKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaW50ZXJsZWF2ZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDkgQEAKKworcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0aW50ZXJsZWF2ZS5sYQorCitsaWJnc3RpbnRlcmxlYXZlX2xhX1NPVVJDRVMgPSBwbHVnaW4uYyBpbnRlcmxlYXZlLmMgZGVpbnRlcmxlYXZlLmMKK2xpYmdzdGludGVybGVhdmVfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdGludGVybGVhdmVfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykKK2xpYmdzdGludGVybGVhdmVfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IHBsdWdpbi5oIGludGVybGVhdmUuaCBkZWludGVybGVhdmUuaApkaWZmIC0tZ2l0IGEvZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmMgYi9nc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODk3NDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ludGVybGVhdmUvZGVpbnRlcmxlYXZlLmMKQEAgLTAsMCArMSwxMDE5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwMCBXaW0gVGF5bWFucyA8d3RheUBjaGVsbG8uYmU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwNSBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogICAgICAgICAgICAgICAgICAgIDIwMDcgQW5keSBXaW5nbyA8d2luZ28gYXQgcG9ib3guY29tPgorICogICAgICAgICAgICAgICAgICAgIDIwMDggU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIGRlaW50ZXJsZWF2ZS5jOiBkZWludGVybGVhdmUgc2FtcGxlcworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIFRPRE86IAorICogICAgICAgLSBoYW5kbGUgY2hhbmdlcyBpbiBudW1iZXIgb2YgY2hhbm5lbHMKKyAqICAgICAgIC0gaGFuZGxlIGNoYW5nZXMgaW4gY2hhbm5lbCBwb3NpdGlvbnMKKyAqICAgICAgIC0gYmV0dGVyIGNhcHNuZWdvIGJ5IHVzaW5nIGEgYnVmZmVyIGFsbG9jIGZ1bmN0aW9uCisgKiAgICAgICAgIGFuZCBwYXNzaW5nIGRvd25zdHJlYW0gY2FwcyBjaGFuZ2VzIHVwc3RyZWFtIHRoZXJlCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtZGVpbnRlcmxlYXZlCisgKiBAc2VlX2Fsc286IGludGVybGVhdmUKKyAqCisgKiBTcGxpdHMgb25lIGludGVybGVhdmVkIG11bHRpY2hhbm5lbCBhdWRpbyBzdHJlYW0gaW50byBtYW55IG1vbm8gYXVkaW8gc3RyZWFtcy4KKyAqIAorICogVGhpcyBlbGVtZW50IGhhbmRsZXMgYWxsIHJhdyBhdWRpbyBmb3JtYXRzIGFuZCBzdXBwb3J0cyBjaGFuZ2luZyB0aGUgaW5wdXQgY2FwcyBhcyBsb25nIGFzCisgKiBhbGwgZG93bnN0cmVhbSBlbGVtZW50cyBjYW4gaGFuZGxlIHRoZSBuZXcgY2FwcyBhbmQgdGhlIG51bWJlciBvZiBjaGFubmVscyBhbmQgdGhlIGNoYW5uZWwKKyAqIHBvc2l0aW9ucyBzdGF5IHRoZSBzYW1lLiBUaGlzIHJlc3RyaWN0aW9uIHdpbGwgYmUgcmVtb3ZlZCBpbiBsYXRlciB2ZXJzaW9ucyBieSBhZGRpbmcgb3IKKyAqIHJlbW92aW5nIHNvbWUgc291cmNlIHBhZHMgYXMgcmVxdWlyZWQuCisgKiAKKyAqIEluIG1vc3QgY2FzZXMgYSBxdWV1ZSBhbmQgYW4gYXVkaW9jb252ZXJ0IGVsZW1lbnQgc2hvdWxkIGJlIGFkZGVkIGFmdGVyIGVhY2ggc291cmNlIHBhZAorICogYmVmb3JlIGZ1cnRoZXIgcHJvY2Vzc2luZyBvZiB0aGUgYXVkaW8gZGF0YS4KKyAqIAorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGZpbGVzcmMgbG9jYXRpb249L3BhdGgvdG8vZmlsZS5tcDMgISBkZWNvZGViaW4gISBhdWRpb2NvbnZlcnQgISAiYXVkaW8veC1yYXcsY2hhbm5lbHM9MiAhIGRlaW50ZXJsZWF2ZSBuYW1lPWQgIGQuc3JjXzAgISBxdWV1ZSAhIGF1ZGlvY29udmVydCAhIHZvcmJpc2VuYyAhIG9nZ211eCAhIGZpbGVzaW5rIGxvY2F0aW9uPWNoYW5uZWwxLm9nZyAgZC5zcmNfMSAhIHF1ZXVlICEgYXVkaW9jb252ZXJ0ICEgdm9yYmlzZW5jICEgb2dnbXV4ICEgZmlsZXNpbmsgbG9jYXRpb249Y2hhbm5lbDIub2dnCisgKiBdfCBEZWNvZGVzIGFuIE1QMyBmaWxlIGFuZCBlbmNvZGVzIHRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGludG8gc2VwYXJhdGUKKyAqIE9nZyBWb3JiaXMgZmlsZXMuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj1maWxlLm1wMyAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhICJhdWRpby94LXJhdyxjaGFubmVscz0yIiAhIGRlaW50ZXJsZWF2ZSBuYW1lPWQgIGludGVybGVhdmUgbmFtZT1pICEgYXVkaW9jb252ZXJ0ICEgd2F2ZW5jICEgZmlsZXNpbmsgbG9jYXRpb249dGVzdC53YXYgICAgZC5zcmNfMCAhIHF1ZXVlICEgYXVkaW9jb252ZXJ0ICEgaS5zaW5rXzEgICAgZC5zcmNfMSAhIHF1ZXVlICEgYXVkaW9jb252ZXJ0ICEgaS5zaW5rXzAKKyAqIF18IERlY29kZXMgYW5kIGRlaW50ZXJsZWF2ZXMgYSBTdGVyZW8gTVAzIGZpbGUgaW50byBzZXBhcmF0ZSBjaGFubmVscyBhbmQKKyAqIHRoZW4gaW50ZXJsZWF2ZXMgdGhlIGNoYW5uZWxzIGFnYWluIHRvIGEgV0FWIGZpbGUgd2l0aCB0aGUgY2hhbm5lbCB3aXRoIHRoZQorICogY2hhbm5lbHMgZXhjaGFuZ2VkLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJkZWludGVybGVhdmUuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X2RlaW50ZXJsZWF2ZV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfZGVpbnRlcmxlYXZlX2RlYnVnCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyY18ldSIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX0ZPUk1BVFNfQUxMICIsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsIGxheW91dCA9IChzdHJpbmcpIHtub24taW50ZXJsZWF2ZWQsIGludGVybGVhdmVkfSIpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fRk9STUFUU19BTEwgIiwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgWyAxLCBNQVggXSwgbGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQiKSk7CisKKyNkZWZpbmUgTUFLRV9GVU5DKHR5cGUpIFwKK3N0YXRpYyB2b2lkIGRlaW50ZXJsZWF2ZV8jI3R5cGUgKGd1aW50IyN0eXBlICpvdXQsIGd1aW50IyN0eXBlICppbiwgXAorICAgIGd1aW50IHN0cmlkZSwgZ3VpbnQgbmZyYW1lcykgXAoreyBcCisgIGdpbnQgaTsgXAorICBcCisgIGZvciAoaSA9IDA7IGkgPCBuZnJhbWVzOyBpKyspIHsgXAorICAgIG91dFtpXSA9ICppbjsgXAorICAgIGluICs9IHN0cmlkZTsgXAorICB9IFwKK30KKworTUFLRV9GVU5DICg4KTsKK01BS0VfRlVOQyAoMTYpOworTUFLRV9GVU5DICgzMik7CitNQUtFX0ZVTkMgKDY0KTsKKworc3RhdGljIHZvaWQKK2RlaW50ZXJsZWF2ZV8yNCAoZ3VpbnQ4ICogb3V0LCBndWludDggKiBpbiwgZ3VpbnQgc3RyaWRlLCBndWludCBuZnJhbWVzKQoreworICBnaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG5mcmFtZXM7IGkrKykgeworICAgIG1lbWNweSAob3V0LCBpbiwgMyk7CisgICAgb3V0ICs9IDM7CisgICAgaW4gKz0gc3RyaWRlICogMzsKKyAgfQorfQorCisjZGVmaW5lIGdzdF9kZWludGVybGVhdmVfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0RGVpbnRlcmxlYXZlLCBnc3RfZGVpbnRlcmxlYXZlLCBHU1RfVFlQRV9FTEVNRU5UKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfS0VFUF9QT1NJVElPTlMKK307CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9kZWludGVybGVhdmVfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZGVpbnRlcmxlYXZlX3Npbmtfc2V0Y2FwcyAoR3N0RGVpbnRlcmxlYXZlICogc2VsZiwKKyAgICBHc3RDYXBzICogY2Fwcyk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2RlaW50ZXJsZWF2ZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9kZWludGVybGVhdmVfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2RlaW50ZXJsZWF2ZV9zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9kZWludGVybGVhdmVfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworc3RhdGljIHZvaWQgZ3N0X2RlaW50ZXJsZWF2ZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfZGVpbnRlcmxlYXZlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworCitzdGF0aWMgdm9pZAorZ3N0X2RlaW50ZXJsZWF2ZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iaikKK3sKKyAgR3N0RGVpbnRlcmxlYXZlICpzZWxmID0gR1NUX0RFSU5URVJMRUFWRSAob2JqKTsKKworICBpZiAoc2VsZi0+cGVuZGluZ19ldmVudHMpIHsKKyAgICBnX2xpc3RfZm9yZWFjaCAoc2VsZi0+cGVuZGluZ19ldmVudHMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLCBOVUxMKTsKKyAgICBnX2xpc3RfZnJlZSAoc2VsZi0+cGVuZGluZ19ldmVudHMpOworICAgIHNlbGYtPnBlbmRpbmdfZXZlbnRzID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGVhdmVfY2xhc3NfaW5pdCAoR3N0RGVpbnRlcmxlYXZlQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X2RlaW50ZXJsZWF2ZV9kZWJ1ZywgImRlaW50ZXJsZWF2ZSIsIDAsCisgICAgICAiZGVpbnRlcmxlYXZlIGVsZW1lbnQiKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIkF1ZGlvIGRlaW50ZXJsZWF2ZXIiLCAiRmlsdGVyL0NvbnZlcnRlci9BdWRpbyIsCisgICAgICAiU3BsaXRzIG9uZSBpbnRlcmxlYXZlZCBtdWx0aWNoYW5uZWwgYXVkaW8gc3RyZWFtIGludG8gbWFueSBtb25vIGF1ZGlvIHN0cmVhbXMiLAorICAgICAgIkFuZHkgV2luZ28gPHdpbmdvIGF0IHBvYm94LmNvbT4sICIgIklhaW4gPGlhaW5AcHJldHR5cGVvcGxlLm9yZz4sICIKKyAgICAgICJTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9kZWludGVybGVhdmVfY2hhbmdlX3N0YXRlOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2RlaW50ZXJsZWF2ZV9maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2RlaW50ZXJsZWF2ZV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9kZWludGVybGVhdmVfZ2V0X3Byb3BlcnR5OworCisgIC8qKgorICAgKiBHc3REZWludGVybGVhdmU6a2VlcC1wb3NpdGlvbnMKKyAgICogCisgICAqIEtlZXAgcG9zaXRpb25zOiBXaGVuIGVuYWJsZSB0aGUgY2FwcyBvbiB0aGUgb3V0cHV0IGJ1ZmZlcnMgd2lsbAorICAgKiBjb250YWluIHRoZSBvcmlnaW5hbCBjaGFubmVsIHBvc2l0aW9ucy4gVGhpcyBjYW4gYmUgdXNlZCB0byBjb3JyZWN0bHkKKyAgICogaW50ZXJsZWF2ZSB0aGUgb3V0cHV0IGFnYWluIGxhdGVyIGJ1dCBjYW4gYWxzbyBsZWFkIHRvIHVud2FudGVkIGVmZmVjdHMKKyAgICogaWYgdGhlIG91dHB1dCBzaG91bGQgYmUgaGFuZGxlZCBhcyBNb25vLgorICAgKgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9LRUVQX1BPU0lUSU9OUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgia2VlcC1wb3NpdGlvbnMiLCAiS2VlcCBwb3NpdGlvbnMiLAorICAgICAgICAgICJLZWVwIHRoZSBvcmlnaW5hbCBjaGFubmVsIHBvc2l0aW9ucyBvbiB0aGUgb3V0cHV0IGJ1ZmZlcnMiLAorICAgICAgICAgIEZBTFNFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGVhdmVfaW5pdCAoR3N0RGVpbnRlcmxlYXZlICogc2VsZikKK3sKKyAgc2VsZi0+a2VlcF9wb3NpdGlvbnMgPSBGQUxTRTsKKyAgc2VsZi0+ZnVuYyA9IE5VTEw7CisgIGdzdF9hdWRpb19pbmZvX2luaXQgKCZzZWxmLT5hdWRpb19pbmZvKTsKKworICAvKiBBZGQgc2luayBwYWQgKi8KKyAgc2VsZi0+c2luayA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua190ZW1wbGF0ZSwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHNlbGYtPnNpbmssCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RlaW50ZXJsZWF2ZV9jaGFpbikpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoc2VsZi0+c2luaywKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGVpbnRlcmxlYXZlX3NpbmtfZXZlbnQpKTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHNlbGYtPnNpbmssCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RlaW50ZXJsZWF2ZV9zaW5rX3F1ZXJ5KSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzZWxmKSwgc2VsZi0+c2luayk7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdFBhZCAqcGFkOworfSBDb3B5U3RpY2t5RXZlbnRzRGF0YTsKKworc3RhdGljIGdib29sZWFuCitjb3B5X3N0aWNreV9ldmVudHMgKEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgQ29weVN0aWNreUV2ZW50c0RhdGEgKmRhdGEgPSB1c2VyX2RhdGE7CisKKyAgaWYgKEdTVF9FVkVOVF9UWVBFICgqZXZlbnQpID49IEdTVF9FVkVOVF9DQVBTICYmIGRhdGEtPmNhcHMpIHsKKyAgICBnc3RfcGFkX3NldF9jYXBzIChkYXRhLT5wYWQsIGRhdGEtPmNhcHMpOworICAgIGRhdGEtPmNhcHMgPSBOVUxMOworICB9CisKKyAgaWYgKEdTVF9FVkVOVF9UWVBFICgqZXZlbnQpICE9IEdTVF9FVkVOVF9DQVBTKQorICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoZGF0YS0+cGFkLCBnc3RfZXZlbnRfcmVmICgqZXZlbnQpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGVhdmVfYWRkX25ld19wYWRzIChHc3REZWludGVybGVhdmUgKiBzZWxmLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UGFkICpwYWQ7CisgIGd1aW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTICgmc2VsZi0+YXVkaW9faW5mbyk7IGkrKykgeworICAgIGdjaGFyICpuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic3JjXyV1IiwgaSk7CisgICAgR3N0Q2FwcyAqc3JjY2FwczsKKyAgICBHc3RBdWRpb0luZm8gaW5mbzsKKyAgICBHc3RBdWRpb0Zvcm1hdCBmb3JtYXQgPSBHU1RfQVVESU9fSU5GT19GT1JNQVQgKCZzZWxmLT5hdWRpb19pbmZvKTsKKyAgICBnaW50IHJhdGUgPSBHU1RfQVVESU9fSU5GT19SQVRFICgmc2VsZi0+YXVkaW9faW5mbyk7CisgICAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zaXRpb24gPSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9NT05POworICAgIENvcHlTdGlja3lFdmVudHNEYXRhIGRhdGE7CisKKyAgICAvKiBTZXQgY2hhbm5lbCBwb3NpdGlvbiBpZiB3ZSBrbm93IGl0ICovCisgICAgaWYgKHNlbGYtPmtlZXBfcG9zaXRpb25zKQorICAgICAgcG9zaXRpb24gPSBHU1RfQVVESU9fSU5GT19QT1NJVElPTiAoJnNlbGYtPmF1ZGlvX2luZm8sIGkpOworCisgICAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJmluZm8pOworICAgIGdzdF9hdWRpb19pbmZvX3NldF9mb3JtYXQgKCZpbmZvLCBmb3JtYXQsIHJhdGUsIDEsICZwb3NpdGlvbik7CisKKyAgICBzcmNjYXBzID0gZ3N0X2F1ZGlvX2luZm9fdG9fY2FwcyAoJmluZm8pOworCisgICAgcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmNfdGVtcGxhdGUsIG5hbWUpOworICAgIGdfZnJlZSAobmFtZSk7CisKKyAgICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChwYWQpOworICAgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChwYWQsCisgICAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGVpbnRlcmxlYXZlX3NyY19xdWVyeSkpOworICAgIGdzdF9wYWRfc2V0X2FjdGl2ZSAocGFkLCBUUlVFKTsKKworICAgIGRhdGEucGFkID0gcGFkOworICAgIGRhdGEuY2FwcyA9IHNyY2NhcHM7CisgICAgZ3N0X3BhZF9zdGlja3lfZXZlbnRzX2ZvcmVhY2ggKHNlbGYtPnNpbmssIGNvcHlfc3RpY2t5X2V2ZW50cywgJmRhdGEpOworICAgIGlmIChkYXRhLmNhcHMpCisgICAgICBnc3RfcGFkX3NldF9jYXBzIChwYWQsIGRhdGEuY2Fwcyk7CisgICAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHNlbGYpLCBwYWQpOworICAgIHNlbGYtPnNyY3BhZHMgPSBnX2xpc3RfcHJlcGVuZCAoc2VsZi0+c3JjcGFkcywgZ3N0X29iamVjdF9yZWYgKHBhZCkpOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworICB9CisKKyAgZ3N0X2VsZW1lbnRfbm9fbW9yZV9wYWRzIChHU1RfRUxFTUVOVCAoc2VsZikpOworICBzZWxmLT5zcmNwYWRzID0gZ19saXN0X3JldmVyc2UgKHNlbGYtPnNyY3BhZHMpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGVhdmVfc2V0X3BhZHNfY2FwcyAoR3N0RGVpbnRlcmxlYXZlICogc2VsZiwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdMaXN0ICpsOworICBnaW50IGk7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgZm9yIChsID0gc2VsZi0+c3JjcGFkcywgaSA9IDA7IGw7IGwgPSBsLT5uZXh0LCBpKyspIHsKKyAgICBHc3RQYWQgKnBhZCA9IEdTVF9QQUQgKGwtPmRhdGEpOworICAgIEdzdENhcHMgKnNyY2NhcHM7CisgICAgR3N0QXVkaW9JbmZvIGluZm87CisKKyAgICBpZiAoIWdzdF9hdWRpb19pbmZvX2Zyb21fY2FwcyAoJmluZm8sIGNhcHMpKSB7CisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc2VsZi0+a2VlcF9wb3NpdGlvbnMpCisgICAgICBHU1RfQVVESU9fSU5GT19QT1NJVElPTiAoJmluZm8sIDApID0KKyAgICAgICAgICBHU1RfQVVESU9fSU5GT19QT1NJVElPTiAoJnNlbGYtPmF1ZGlvX2luZm8sIGkpOworCisgICAgc3JjY2FwcyA9IGdzdF9hdWRpb19pbmZvX3RvX2NhcHMgKCZpbmZvKTsKKworICAgIGdzdF9wYWRfc2V0X2NhcHMgKHBhZCwgc3JjY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxlYXZlX3JlbW92ZV9wYWRzIChHc3REZWludGVybGVhdmUgKiBzZWxmKQoreworICBHTGlzdCAqbDsKKworICBHU1RfSU5GT19PQkpFQ1QgKHNlbGYsICJyZW1vdmluZyBwYWRzIik7CisKKyAgZm9yIChsID0gc2VsZi0+c3JjcGFkczsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICBHc3RQYWQgKnBhZCA9IEdTVF9QQUQgKGwtPmRhdGEpOworCisgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoc2VsZiksIHBhZCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocGFkKTsKKyAgfQorICBnX2xpc3RfZnJlZSAoc2VsZi0+c3JjcGFkcyk7CisgIHNlbGYtPnNyY3BhZHMgPSBOVUxMOworCisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzZWxmLT5zaW5rY2FwcywgTlVMTCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RlaW50ZXJsZWF2ZV9zZXRfcHJvY2Vzc19mdW5jdGlvbiAoR3N0RGVpbnRlcmxlYXZlICogc2VsZikKK3sKKyAgc3dpdGNoIChHU1RfQVVESU9fSU5GT19XSURUSCAoJnNlbGYtPmF1ZGlvX2luZm8pKSB7CisgICAgY2FzZSA4OgorICAgICAgc2VsZi0+ZnVuYyA9IChHc3REZWludGVybGVhdmVGdW5jKSBkZWludGVybGVhdmVfODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICBzZWxmLT5mdW5jID0gKEdzdERlaW50ZXJsZWF2ZUZ1bmMpIGRlaW50ZXJsZWF2ZV8xNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ6CisgICAgICBzZWxmLT5mdW5jID0gKEdzdERlaW50ZXJsZWF2ZUZ1bmMpIGRlaW50ZXJsZWF2ZV8yNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzI6CisgICAgICBzZWxmLT5mdW5jID0gKEdzdERlaW50ZXJsZWF2ZUZ1bmMpIGRlaW50ZXJsZWF2ZV8zMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjQ6CisgICAgICBzZWxmLT5mdW5jID0gKEdzdERlaW50ZXJsZWF2ZUZ1bmMpIGRlaW50ZXJsZWF2ZV82NDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RlaW50ZXJsZWF2ZV9jaGVja19jYXBzX2NoYW5nZSAoR3N0RGVpbnRlcmxlYXZlICogc2VsZiwKKyAgICBHc3RBdWRpb0luZm8gKiBvbGRfaW5mbywgR3N0QXVkaW9JbmZvICogbmV3X2luZm8pCit7CisgIGdpbnQgaTsKKyAgZ2Jvb2xlYW4gc2FtZV9sYXlvdXQgPSBUUlVFOworICBnYm9vbGVhbiB3YXNfdW5wb3NpdGlvbmVkOworICBnYm9vbGVhbiBpc191bnBvc2l0aW9uZWQgPSBHU1RfQVVESU9fSU5GT19JU19VTlBPU0lUSU9ORUQgKG5ld19pbmZvKTsKKyAgZ2ludCBuZXdfY2hhbm5lbHMgPSBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAobmV3X2luZm8pOworICBnaW50IG9sZF9jaGFubmVsczsKKworICB3YXNfdW5wb3NpdGlvbmVkID0gR1NUX0FVRElPX0lORk9fSVNfVU5QT1NJVElPTkVEIChvbGRfaW5mbyk7CisgIG9sZF9jaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChvbGRfaW5mbyk7CisKKyAgLyogV2UgYWxsb3cgY2FwcyBjaGFuZ2VzIGFzIGxvbmcgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscyBkb2Vzbid0IGNoYW5nZQorICAgKiBhbmQgdGhlIGNoYW5uZWwgcG9zaXRpb25zIHN0YXkgdGhlIHNhbWUuIF9nZXRjYXBzKCkgc2hvdWxkJ3ZlIGNhcmVkCisgICAqIGZvciB0aGlzIGFscmVhZHkgYnV0IGJldHRlciBiZSBzYWZlLgorICAgKi8KKyAgaWYgKG5ld19jaGFubmVscyAhPSBvbGRfY2hhbm5lbHMpCisgICAgZ290byBjYW5ub3RfY2hhbmdlX2NhcHM7CisKKyAgLyogTm93IGNoZWNrIHRoZSBjaGFubmVsIHBvc2l0aW9ucy4gSWYgd2UgaGFkIG5vIGNoYW5uZWwgcG9zaXRpb25zCisgICAqIGFuZCBnZXQgdGhlbSBvciB0aGUgb3RoZXIgd2F5IGFyb3VuZCB0aGluZ3MgaGF2ZSBjaGFuZ2VkLgorICAgKiBJZiB3ZSBoYWQgY2hhbm5lbCBwb3NpdGlvbnMgYW5kIGdldCBkaWZmZXJlbnQgb25lcyB0aGluZ3MgaGF2ZQorICAgKiBjaGFuZ2VkIHRvbyBvZiBjb3Vyc2UKKyAgICovCisgIGlmICgoIXdhc191bnBvc2l0aW9uZWQgJiYgaXNfdW5wb3NpdGlvbmVkKSB8fCAod2FzX3VucG9zaXRpb25lZAorICAgICAgICAgICYmICFpc191bnBvc2l0aW9uZWQpKQorICAgIGdvdG8gY2Fubm90X2NoYW5nZV9jYXBzOworCisgIGlmICghaXNfdW5wb3NpdGlvbmVkKSB7CisgICAgaWYgKEdTVF9BVURJT19JTkZPX0NIQU5ORUxTIChvbGRfaW5mbykgIT0KKyAgICAgICAgR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKG5ld19pbmZvKSkKKyAgICAgIGdvdG8gY2Fubm90X2NoYW5nZV9jYXBzOworICAgIGZvciAoaSA9IDA7IGkgPCBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAob2xkX2luZm8pOyBpKyspIHsKKyAgICAgIGlmIChuZXdfaW5mby0+cG9zaXRpb25baV0gIT0gb2xkX2luZm8tPnBvc2l0aW9uW2ldKSB7CisgICAgICAgIHNhbWVfbGF5b3V0ID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIXNhbWVfbGF5b3V0KQorICAgICAgZ290byBjYW5ub3RfY2hhbmdlX2NhcHM7CisgIH0KKworICByZXR1cm4gVFJVRTsKKworY2Fubm90X2NoYW5nZV9jYXBzOgorICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RlaW50ZXJsZWF2ZV9zaW5rX3NldGNhcHMgKEdzdERlaW50ZXJsZWF2ZSAqIHNlbGYsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RDYXBzICpzcmNjYXBzOworICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImdvdCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgaWYgKCFnc3RfYXVkaW9faW5mb19mcm9tX2NhcHMgKCZzZWxmLT5hdWRpb19pbmZvLCBjYXBzKSkKKyAgICBnb3RvIGludmFsaWRfY2FwczsKKworICBpZiAoIWdzdF9kZWludGVybGVhdmVfc2V0X3Byb2Nlc3NfZnVuY3Rpb24gKHNlbGYpKQorICAgIGdvdG8gdW5zdXBwb3J0ZWRfY2FwczsKKworICBpZiAoc2VsZi0+c2lua2NhcHMgJiYgIWdzdF9jYXBzX2lzX2VxdWFsIChjYXBzLCBzZWxmLT5zaW5rY2FwcykpIHsKKyAgICBHc3RBdWRpb0luZm8gb2xkX2luZm87CisKKyAgICBnc3RfYXVkaW9faW5mb19pbml0ICgmb2xkX2luZm8pOworICAgIGlmICghZ3N0X2F1ZGlvX2luZm9fZnJvbV9jYXBzICgmb2xkX2luZm8sIHNlbGYtPnNpbmtjYXBzKSkKKyAgICAgIGdvdG8gaW5mb19mcm9tX2NhcHNfZmFpbGVkOworCisgICAgaWYgKGdzdF9kZWludGVybGVhdmVfY2hlY2tfY2Fwc19jaGFuZ2UgKHNlbGYsICZvbGRfaW5mbywgJnNlbGYtPmF1ZGlvX2luZm8pKSB7CisgICAgICBpZiAoIWdzdF9kZWludGVybGVhdmVfc2V0X3Byb2Nlc3NfZnVuY3Rpb24gKHNlbGYpKQorICAgICAgICBnb3RvIGNhbm5vdF9jaGFuZ2VfY2FwczsKKyAgICB9IGVsc2UKKyAgICAgIGdvdG8gY2Fubm90X2NoYW5nZV9jYXBzOworCisgIH0KKworICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+c2lua2NhcHMsIGNhcHMpOworCisgIC8qIEdldCBzcmNwYWQgY2FwcyAqLworICBzcmNjYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChzcmNjYXBzLCAwKTsKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDEsIE5VTEwpOworICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAocywgImNoYW5uZWwtbWFzayIpOworCisgIC8qIElmIHdlIGFscmVhZHkgaGF2ZSBwYWRzLCB1cGRhdGUgdGhlIGNhcHMgb3RoZXJ3aXNlCisgICAqIGFkZCBuZXcgcGFkcyAqLworICBpZiAoc2VsZi0+c3JjcGFkcykgeworICAgIGlmICghZ3N0X2RlaW50ZXJsZWF2ZV9zZXRfcGFkc19jYXBzIChzZWxmLCBzcmNjYXBzKSkKKyAgICAgIGdvdG8gc2V0X2NhcHNfZmFpbGVkOworICB9IGVsc2UgeworICAgIGdzdF9kZWludGVybGVhdmVfYWRkX25ld19wYWRzIChzZWxmLCBzcmNjYXBzKTsKKyAgfQorCisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gVFJVRTsKKworY2Fubm90X2NoYW5nZV9jYXBzOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiY2FwcyBjaGFuZ2UgZnJvbSAlIiBHU1RfUFRSX0ZPUk1BVAorICAgICAgICAiIHRvICUiIEdTVF9QVFJfRk9STUFUICIgbm90IHN1cHBvcnRlZDogY2hhbm5lbCBudW1iZXIgb3IgY2hhbm5lbCAiCisgICAgICAgICJwb3NpdGlvbnMgY2hhbmdlIiwgc2VsZi0+c2lua2NhcHMsIGNhcHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQordW5zdXBwb3J0ZWRfY2FwczoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJjYXBzIG5vdCBzdXBwb3J0ZWQ6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfY2FwczoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJpbnZhbGlkIGNhcHMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3NldF9jYXBzX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJzZXRfY2FwcyBmYWlsZWQiKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbmZvX2Zyb21fY2Fwc19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiY291ZCBub3QgZ2V0IGluZm8gZnJvbSBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX3JlbW92ZV9jaGFubmVscyAoR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgZ2ludCBpLCBzaXplOworCisgIHNpemUgPSBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSk7CisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJjaGFubmVsLW1hc2siKTsKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAocywgImNoYW5uZWxzIik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK19fc2V0X2NoYW5uZWxzIChHc3RDYXBzICogY2FwcywgZ2ludCBjaGFubmVscykKK3sKKyAgR3N0U3RydWN0dXJlICpzOworICBnaW50IGksIHNpemU7CisKKyAgc2l6ZSA9IGdzdF9jYXBzX2dldF9zaXplIChjYXBzKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKyAgICBpZiAoY2hhbm5lbHMgPiAwKQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGNoYW5uZWxzLCBOVUxMKTsKKyAgICBlbHNlCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgImNoYW5uZWxzIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCBHX01BWElOVCwgTlVMTCk7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZGVpbnRlcmxlYXZlX3NpbmtfYWNjZXB0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdERlaW50ZXJsZWF2ZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEVBVkUgKHBhcmVudCk7CisgIEdzdENhcHMgKnRlbXBsX2NhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAocGFkKTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIHJldCA9IGdzdF9jYXBzX2Nhbl9pbnRlcnNlY3QgKHRlbXBsX2NhcHMsIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAodGVtcGxfY2Fwcyk7CisgIGlmIChyZXQgJiYgc2VsZi0+c2lua2NhcHMpIHsKKyAgICBHc3RBdWRpb0luZm8gbmV3X2luZm87CisKKyAgICBnc3RfYXVkaW9faW5mb19pbml0ICgmbmV3X2luZm8pOworICAgIGlmICghZ3N0X2F1ZGlvX2luZm9fZnJvbV9jYXBzICgmbmV3X2luZm8sIGNhcHMpKQorICAgICAgZ290byBpbmZvX2Zyb21fY2Fwc19mYWlsZWQ7CisgICAgcmV0ID0KKyAgICAgICAgZ3N0X2RlaW50ZXJsZWF2ZV9jaGVja19jYXBzX2NoYW5nZSAoc2VsZiwgJnNlbGYtPmF1ZGlvX2luZm8sICZuZXdfaW5mbyk7CisgIH0KKworICByZXR1cm4gcmV0OworCitpbmZvX2Zyb21fY2Fwc19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiY291ZCBub3QgZ2V0IGluZm8gZnJvbSBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9kZWludGVybGVhdmVfZ2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdERlaW50ZXJsZWF2ZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEVBVkUgKHBhcmVudCk7CisgIEdzdENhcHMgKnJldDsKKyAgR3N0SXRlcmF0b3IgKml0OworICBHc3RJdGVyYXRvclJlc3VsdCByZXM7CisgIEdWYWx1ZSB2ID0gR19WQUxVRV9JTklUOworCisgIGlmIChwYWQgIT0gc2VsZi0+c2luaykgeworICAgIHJldCA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFkKTsKKyAgICBpZiAocmV0KSB7CisgICAgICBpZiAoZmlsdGVyKSB7CisgICAgICAgIEdzdENhcHMgKnRtcCA9CisgICAgICAgICAgICBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCByZXQsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgICAgIGdzdF9jYXBzX3VucmVmIChyZXQpOworICAgICAgICByZXQgPSB0bXA7CisgICAgICB9CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgfQorCisgIC8qIEludGVyc2VjdCBhbGwgb2Ygb3VyIHBhZCB0ZW1wbGF0ZSBjYXBzIHdpdGggdGhlIHBlZXIgY2FwcyBvZiB0aGUgcGFkCisgICAqIHRvIGdldCBhbGwgZm9ybWF0cyB0aGF0IGFyZSBwb3NzaWJsZSB1cC0gYW5kIGRvd25zdHJlYW0uCisgICAqCisgICAqIEZvciB0aGUgcGFkIGZvciB3aGljaCB0aGUgY2FwcyBhcmUgcmVxdWVzdGVkIHdlIGRvbid0IHJlbW92ZSB0aGUgY2hhbm5lbAorICAgKiBpbmZvcm1hdGlvbnMgYXMgdGhleSBtdXN0IGJlIGluIHRoZSByZXR1cm5lZCBjYXBzIGFuZCBpbmNvbXBhdGliaWxpdGllcworICAgKiB3aWxsIGJlIGRldGVjdGVkIGhlcmUgYWxyZWFkeQorICAgKi8KKyAgcmV0ID0gZ3N0X2NhcHNfbmV3X2FueSAoKTsKKyAgaXQgPSBnc3RfZWxlbWVudF9pdGVyYXRlX3BhZHMgKEdTVF9FTEVNRU5UX0NBU1QgKHNlbGYpKTsKKworICBkbyB7CisgICAgcmVzID0gZ3N0X2l0ZXJhdG9yX25leHQgKGl0LCAmdik7CisgICAgc3dpdGNoIChyZXMpIHsKKyAgICAgIGNhc2UgR1NUX0lURVJBVE9SX09LOnsKKyAgICAgICAgR3N0UGFkICpvdXJwYWQgPSBHU1RfUEFEIChnX3ZhbHVlX2dldF9vYmplY3QgKCZ2KSk7CisgICAgICAgIEdzdENhcHMgKnBlZXJjYXBzID0gTlVMTCwgKm91cmNhcHM7CisgICAgICAgIEdzdENhcHMgKnRlbXBsX2NhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAob3VycGFkKTsKKworICAgICAgICBvdXJjYXBzID0gZ3N0X2NhcHNfY29weSAodGVtcGxfY2Fwcyk7CisgICAgICAgIGdzdF9jYXBzX3VucmVmICh0ZW1wbF9jYXBzKTsKKworICAgICAgICBpZiAocGFkID09IG91cnBhZCkgeworICAgICAgICAgIGlmIChHU1RfUEFEX0RJUkVDVElPTiAocGFkKSA9PSBHU1RfUEFEX1NJTkspCisgICAgICAgICAgICBfX3NldF9jaGFubmVscyAob3VyY2FwcywKKyAgICAgICAgICAgICAgICBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJnNlbGYtPmF1ZGlvX2luZm8pKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfX3NldF9jaGFubmVscyAob3VyY2FwcywgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgX19yZW1vdmVfY2hhbm5lbHMgKG91cmNhcHMpOworICAgICAgICAgIC8qIE9ubHkgYXNrIGZvciBwZWVyIGNhcHMgZm9yIG90aGVyIHBhZHMgdGhhbiBwYWQKKyAgICAgICAgICAgKiBhcyBvdGhlcndpc2UgZ3N0X3BhZF9wZWVyX2dldF9jYXBzKCkgbWlnaHQgY2FsbAorICAgICAgICAgICAqIGJhY2sgaW50byB0aGlzIGZ1bmN0aW9uIGFuZCBkZWFkbG9jaworICAgICAgICAgICAqLworICAgICAgICAgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKG91cnBhZCwgTlVMTCk7CisgICAgICAgICAgcGVlcmNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChwZWVyY2Fwcyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBJZiB0aGUgcGVlciBleGlzdHMgYW5kIGhhcyBjYXBzIGFkZCB0aGVtIHRvIHRoZSBpbnRlcnNlY3Rpb24sCisgICAgICAgICAqIG90aGVyd2lzZSBhc3N1bWUgdGhhdCB0aGUgcGVlciBhY2NlcHRzIGV2ZXJ5dGhpbmcgKi8KKyAgICAgICAgaWYgKHBlZXJjYXBzKSB7CisgICAgICAgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworICAgICAgICAgIEdzdENhcHMgKm9sZHJldCA9IHJldDsKKworICAgICAgICAgIF9fcmVtb3ZlX2NoYW5uZWxzIChwZWVyY2Fwcyk7CisKKyAgICAgICAgICBpbnRlcnNlY3Rpb24gPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHBlZXJjYXBzLCBvdXJjYXBzKTsKKworICAgICAgICAgIHJldCA9IGdzdF9jYXBzX2ludGVyc2VjdCAocmV0LCBpbnRlcnNlY3Rpb24pOworICAgICAgICAgIGdzdF9jYXBzX3VucmVmIChpbnRlcnNlY3Rpb24pOworICAgICAgICAgIGdzdF9jYXBzX3VucmVmIChwZWVyY2Fwcyk7CisgICAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKG9sZHJldCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR3N0Q2FwcyAqb2xkcmV0ID0gcmV0OworCisgICAgICAgICAgcmV0ID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChyZXQsIG91cmNhcHMpOworICAgICAgICAgIGdzdF9jYXBzX3VucmVmIChvbGRyZXQpOworICAgICAgICB9CisgICAgICAgIGdzdF9jYXBzX3VucmVmIChvdXJjYXBzKTsKKyAgICAgICAgZ192YWx1ZV9yZXNldCAoJnYpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgR1NUX0lURVJBVE9SX0RPTkU6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfRVJST1I6CisgICAgICAgIGdzdF9jYXBzX3VucmVmIChyZXQpOworICAgICAgICByZXQgPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfUkVTWU5DOgorICAgICAgICBnc3RfY2Fwc191bnJlZiAocmV0KTsKKyAgICAgICAgcmV0ID0gZ3N0X2NhcHNfbmV3X2FueSAoKTsKKyAgICAgICAgZ3N0X2l0ZXJhdG9yX3Jlc3luYyAoaXQpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKHJlcyAhPSBHU1RfSVRFUkFUT1JfRE9ORSAmJiByZXMgIT0gR1NUX0lURVJBVE9SX0VSUk9SKTsKKyAgZ192YWx1ZV91bnNldCAoJnYpOworICBnc3RfaXRlcmF0b3JfZnJlZSAoaXQpOworCisgIGlmIChmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICphdXg7CisKKyAgICBhdXggPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCByZXQsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHJldCk7CisgICAgcmV0ID0gYXV4OworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiSW50ZXJzZWN0ZWQgY2FwcyB0byAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGVhdmVfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdERlaW50ZXJsZWF2ZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEVBVkUgKHBhcmVudCk7CisgIGdib29sZWFuIHJldDsKKworICBHU1RfREVCVUcgKCJHb3QgJXMgZXZlbnQgb24gcGFkICVzOiVzIiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpLAorICAgICAgR1NUX0RFQlVHX1BBRF9OQU1FIChwYWQpKTsKKworICAvKiBTZW5kIEZMVVNIX1NUT1AsIEZMVVNIX1NUQVJUIGFuZCBFT1MgaW1tZWRpYXRlbHksIG5vIG1hdHRlciBpZgorICAgKiB3ZSBoYXZlIHNyYyBwYWRzIGFscmVhZHkgb3Igbm90LiBRdWV1ZSBhbGwgb3RoZXIgZXZlbnRzIGFuZAorICAgKiBwdXNoIHRoZW0gYWZ0ZXIgd2UgaGF2ZSBzcmMgcGFkcworICAgKi8KKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVEFSVDoKKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgICByZXQgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChldmVudCwgJmNhcHMpOworICAgICAgcmV0ID0gZ3N0X2RlaW50ZXJsZWF2ZV9zaW5rX3NldGNhcHMgKHNlbGYsIGNhcHMpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCFzZWxmLT5zcmNwYWRzICYmICFHU1RfRVZFTlRfSVNfU1RJQ0tZIChldmVudCkpIHsKKyAgICAgICAgLyogU3RpY2t5IGV2ZW50cyBhcmUgY29waWVkIHdoZW4gY3JlYXRpbmcgYSBuZXcgcGFkICovCisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZik7CisgICAgICAgIHNlbGYtPnBlbmRpbmdfZXZlbnRzID0gZ19saXN0X2FwcGVuZCAoc2VsZi0+cGVuZGluZ19ldmVudHMsIGV2ZW50KTsKKyAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNlbGYpOworICAgICAgICByZXQgPSBUUlVFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kZWludGVybGVhdmVfc2lua19xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIGdib29sZWFuIHJlczsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9DQVBTOnsKKyAgICAgIEdzdENhcHMgKmZpbHRlcjsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9jYXBzIChxdWVyeSwgJmZpbHRlcik7CisgICAgICBjYXBzID0gZ3N0X2RlaW50ZXJsZWF2ZV9nZXRjYXBzIChwYWQsIHBhcmVudCwgZmlsdGVyKTsKKyAgICAgIGdzdF9xdWVyeV9zZXRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCBjYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfQUNDRVBUX0NBUFM6eworICAgICAgR3N0Q2FwcyAqY2FwczsKKyAgICAgIGdib29sZWFuIHJldDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2FjY2VwdF9jYXBzIChxdWVyeSwgJmNhcHMpOworICAgICAgcmV0ID0gZ3N0X2RlaW50ZXJsZWF2ZV9zaW5rX2FjY2VwdGNhcHMgKHBhZCwgcGFyZW50LCBjYXBzKTsKKyAgICAgIGdzdF9xdWVyeV9zZXRfYWNjZXB0X2NhcHNfcmVzdWx0IChxdWVyeSwgcmV0KTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZGVpbnRlcmxlYXZlX3NyY19xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdERlaW50ZXJsZWF2ZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEVBVkUgKHBhcmVudCk7CisgIGdib29sZWFuIHJlczsKKworICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisKKyAgaWYgKHJlcyAmJiBHU1RfUVVFUllfVFlQRSAocXVlcnkpID09IEdTVF9RVUVSWV9EVVJBVElPTikgeworICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisgICAgZ2ludDY0IGR1cjsKKworICAgIGdzdF9xdWVyeV9wYXJzZV9kdXJhdGlvbiAocXVlcnksICZmb3JtYXQsICZkdXIpOworCisgICAgLyogTmVlZCB0byBkaXZpZGUgYnkgdGhlIG51bWJlciBvZiBjaGFubmVscyBpbiBieXRlIGZvcm1hdAorICAgICAqIHRvIGdldCB0aGUgY29ycmVjdCB2YWx1ZS4gQWxsIG90aGVyIGZvcm1hdHMgc2hvdWxkIGJlIGZpbmUKKyAgICAgKi8KKyAgICBpZiAoZm9ybWF0ID09IEdTVF9GT1JNQVRfQllURVMgJiYgZHVyICE9IC0xKQorICAgICAgZ3N0X3F1ZXJ5X3NldF9kdXJhdGlvbiAocXVlcnksIGZvcm1hdCwKKyAgICAgICAgICBkdXIgLyBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJnNlbGYtPmF1ZGlvX2luZm8pKTsKKyAgfSBlbHNlIGlmIChyZXMgJiYgR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSA9PSBHU1RfUVVFUllfUE9TSVRJT04pIHsKKyAgICBHc3RGb3JtYXQgZm9ybWF0OworICAgIGdpbnQ2NCBwb3M7CisKKyAgICBnc3RfcXVlcnlfcGFyc2VfcG9zaXRpb24gKHF1ZXJ5LCAmZm9ybWF0LCAmcG9zKTsKKworICAgIC8qIE5lZWQgdG8gZGl2aWRlIGJ5IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaW4gYnl0ZSBmb3JtYXQKKyAgICAgKiB0byBnZXQgdGhlIGNvcnJlY3QgdmFsdWUuIEFsbCBvdGhlciBmb3JtYXRzIHNob3VsZCBiZSBmaW5lCisgICAgICovCisgICAgaWYgKGZvcm1hdCA9PSBHU1RfRk9STUFUX0JZVEVTICYmIHBvcyAhPSAtMSkKKyAgICAgIGdzdF9xdWVyeV9zZXRfcG9zaXRpb24gKHF1ZXJ5LCBmb3JtYXQsCisgICAgICAgICAgcG9zIC8gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZzZWxmLT5hdWRpb19pbmZvKSk7CisgIH0gZWxzZSBpZiAocmVzICYmIEdTVF9RVUVSWV9UWVBFIChxdWVyeSkgPT0gR1NUX1FVRVJZX0NBUFMpIHsKKyAgICBHc3RDYXBzICpmaWx0ZXIsICpjYXBzOworCisgICAgZ3N0X3F1ZXJ5X3BhcnNlX2NhcHMgKHF1ZXJ5LCAmZmlsdGVyKTsKKyAgICBjYXBzID0gZ3N0X2RlaW50ZXJsZWF2ZV9nZXRjYXBzIChwYWQsIHBhcmVudCwgZmlsdGVyKTsKKyAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kZWludGVybGVhdmVfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdERlaW50ZXJsZWF2ZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEVBVkUgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0tFRVBfUE9TSVRJT05TOgorICAgICAgc2VsZi0+a2VlcF9wb3NpdGlvbnMgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGVpbnRlcmxlYXZlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REZWludGVybGVhdmUgKnNlbGYgPSBHU1RfREVJTlRFUkxFQVZFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9LRUVQX1BPU0lUSU9OUzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzZWxmLT5rZWVwX3Bvc2l0aW9ucyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZGVpbnRlcmxlYXZlX3Byb2Nlc3MgKEdzdERlaW50ZXJsZWF2ZSAqIHNlbGYsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ3VpbnQgY2hhbm5lbHMgPSBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJnNlbGYtPmF1ZGlvX2luZm8pOworICBndWludCBwYWRzX3B1c2hlZCA9IDAsIGJ1ZmZlcnNfYWxsb2NhdGVkID0gMDsKKyAgZ3VpbnQgbmZyYW1lcyA9CisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpIC8gY2hhbm5lbHMgLworICAgICAgKEdTVF9BVURJT19JTkZPX1dJRFRIICgmc2VsZi0+YXVkaW9faW5mbykgLyA4KTsKKyAgZ3VpbnQgYnVmc2l6ZSA9IG5mcmFtZXMgKiAoR1NUX0FVRElPX0lORk9fV0lEVEggKCZzZWxmLT5hdWRpb19pbmZvKSAvIDgpOworICBndWludCBpOworICBHTGlzdCAqc3JjczsKKyAgR3N0QnVmZmVyICoqYnVmZmVyc19vdXQgPSBnX25ldzAgKEdzdEJ1ZmZlciAqLCBjaGFubmVscyk7CisgIGd1aW50OCAqaW4sICpvdXQ7CisgIEdzdE1hcEluZm8gcmVhZF9pbmZvOworICBHTGlzdCAqcGVuZGluZ19ldmVudHMsICpsOworCisgIC8qIFNlbmQgYW55IHBlbmRpbmcgZXZlbnRzIHRvIGFsbCBzcmMgcGFkcyAqLworICBHU1RfT0JKRUNUX0xPQ0sgKHNlbGYpOworICBwZW5kaW5nX2V2ZW50cyA9IHNlbGYtPnBlbmRpbmdfZXZlbnRzOworICBzZWxmLT5wZW5kaW5nX2V2ZW50cyA9IE5VTEw7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzZWxmKTsKKworICBpZiAocGVuZGluZ19ldmVudHMpIHsKKyAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiU2VuZGluZyBwZW5kaW5nIGV2ZW50cyB0byBhbGwgc3JjIHBhZHMiKTsKKyAgICBmb3IgKGwgPSBwZW5kaW5nX2V2ZW50czsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICAgIGV2ZW50ID0gbC0+ZGF0YTsKKyAgICAgIGZvciAoc3JjcyA9IHNlbGYtPnNyY3BhZHM7IHNyY3MgIT0gTlVMTDsgc3JjcyA9IHNyY3MtPm5leHQpCisgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoR1NUX1BBRCAoc3Jjcy0+ZGF0YSksIGdzdF9ldmVudF9yZWYgKGV2ZW50KSk7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICB9CisgICAgZ19saXN0X2ZyZWUgKHBlbmRpbmdfZXZlbnRzKTsKKyAgfQorCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZyZWFkX2luZm8sIEdTVF9NQVBfUkVBRCk7CisKKyAgLyogQWxsb2NhdGUgYnVmZmVycyAqLworICBmb3IgKHNyY3MgPSBzZWxmLT5zcmNwYWRzLCBpID0gMDsgc3Jjczsgc3JjcyA9IHNyY3MtPm5leHQsIGkrKykgeworICAgIGJ1ZmZlcnNfb3V0W2ldID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIGJ1ZnNpemUsIE5VTEwpOworCisgICAgLyogTWFrZSBzdXJlIHdlIGdvdCBhIGNvcnJlY3QgYnVmZmVyLiBUaGUgb25seSBvdGhlciBjYXNlIHdlIGFsbG93CisgICAgICogaGVyZSBpcyBhbiB1bmxpa2VkIHBhZCAqLworICAgIGlmICghYnVmZmVyc19vdXRbaV0pCisgICAgICBnb3RvIGFsbG9jX2J1ZmZlcl9mYWlsZWQ7CisgICAgZWxzZSBpZiAoYnVmZmVyc19vdXRbaV0KKyAgICAgICAgJiYgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyc19vdXRbaV0pICE9IGJ1ZnNpemUpCisgICAgICBnb3RvIGFsbG9jX2J1ZmZlcl9iYWRfc2l6ZTsKKworICAgIGlmIChidWZmZXJzX291dFtpXSkgeworICAgICAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKGJ1ZmZlcnNfb3V0W2ldLCBidWYsIEdTVF9CVUZGRVJfQ09QWV9NRVRBREFUQSwgMCwKKyAgICAgICAgICAtMSk7CisgICAgICBidWZmZXJzX2FsbG9jYXRlZCsrOworICAgIH0KKyAgfQorCisgIC8qIFJldHVybiBOT1RfTElOS0VEIGlmIG5vIHBhZCB3YXMgbGlua2VkICovCisgIGlmICghYnVmZmVyc19hbGxvY2F0ZWQpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICJDb3VsZG4ndCBhbGxvY2F0ZSBhbnkgYnVmZmVycyBiZWNhdXNlIG5vIHBhZCB3YXMgbGlua2VkIik7CisgICAgcmV0ID0gR1NUX0ZMT1dfTk9UX0xJTktFRDsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiBkZWludGVybGVhdmUgKi8KKyAgZm9yIChzcmNzID0gc2VsZi0+c3JjcGFkcywgaSA9IDA7IHNyY3M7IHNyY3MgPSBzcmNzLT5uZXh0LCBpKyspIHsKKyAgICBHc3RQYWQgKnBhZCA9IChHc3RQYWQgKikgc3Jjcy0+ZGF0YTsKKyAgICBHc3RNYXBJbmZvIHdyaXRlX2luZm87CisKKyAgICBpbiA9IChndWludDggKikgcmVhZF9pbmZvLmRhdGE7CisgICAgaW4gKz0gaSAqIChHU1RfQVVESU9fSU5GT19XSURUSCAoJnNlbGYtPmF1ZGlvX2luZm8pIC8gOCk7CisgICAgaWYgKGJ1ZmZlcnNfb3V0W2ldKSB7CisgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyc19vdXRbaV0sICZ3cml0ZV9pbmZvLCBHU1RfTUFQX1dSSVRFKTsKKyAgICAgIG91dCA9IChndWludDggKikgd3JpdGVfaW5mby5kYXRhOworICAgICAgc2VsZi0+ZnVuYyAob3V0LCBpbiwgY2hhbm5lbHMsIG5mcmFtZXMpOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyc19vdXRbaV0sICZ3cml0ZV9pbmZvKTsKKworICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoIChwYWQsIGJ1ZmZlcnNfb3V0W2ldKTsKKyAgICAgIGJ1ZmZlcnNfb3V0W2ldID0gTlVMTDsKKyAgICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT0spCisgICAgICAgIHBhZHNfcHVzaGVkKys7CisgICAgICBlbHNlIGlmIChyZXQgPT0gR1NUX0ZMT1dfTk9UX0xJTktFRCkKKyAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICBlbHNlCisgICAgICAgIGdvdG8gcHVzaF9mYWlsZWQ7CisgICAgfQorICB9CisKKyAgLyogUmV0dXJuIE5PVF9MSU5LRUQgaWYgbm8gcGFkIHdhcyBsaW5rZWQgKi8KKyAgaWYgKCFwYWRzX3B1c2hlZCkKKyAgICByZXQgPSBHU1RfRkxPV19OT1RfTElOS0VEOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJQdXNoZWQgb24gJWQgcGFkcyIsIHBhZHNfcHVzaGVkKTsKKworZG9uZToKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmcmVhZF9pbmZvKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgZ19mcmVlIChidWZmZXJzX291dCk7CisgIHJldHVybiByZXQ7CisKK2FsbG9jX2J1ZmZlcl9mYWlsZWQ6CisgIHsKKyAgICBHU1RfV0FSTklORyAoImdzdF9wYWRfYWxsb2NfYnVmZmVyKCkgcmV0dXJuZWQgJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmV0KSk7CisgICAgZ290byBjbGVhbl9idWZmZXJzOworCisgIH0KK2FsbG9jX2J1ZmZlcl9iYWRfc2l6ZToKKyAgeworICAgIEdTVF9XQVJOSU5HICgiY2FsbGVkIGFsbG9jX2J1ZmZlcigpLCBidXQgZGlkbid0IGdldCByZXF1ZXN0ZWQgYnl0ZXMiKTsKKyAgICByZXQgPSBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICBnb3RvIGNsZWFuX2J1ZmZlcnM7CisgIH0KK3B1c2hfZmFpbGVkOgorICB7CisgICAgR1NUX0RFQlVHICgicHVzaCgpIGZhaWxlZCwgZmxvdyA9ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICAgIGdvdG8gY2xlYW5fYnVmZmVyczsKKyAgfQorY2xlYW5fYnVmZmVyczoKKyAgeworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJnJlYWRfaW5mbyk7CisgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKKyAgICAgIGlmIChidWZmZXJzX291dFtpXSkKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyc19vdXRbaV0pOworICAgIH0KKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIGdfZnJlZSAoYnVmZmVyc19vdXQpOworICAgIHJldHVybiByZXQ7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9kZWludGVybGVhdmVfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdERlaW50ZXJsZWF2ZSAqc2VsZiA9IEdTVF9ERUlOVEVSTEVBVkUgKHBhcmVudCk7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZWxmLT5mdW5jICE9IE5VTEwsIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9BVURJT19JTkZPX1dJRFRIICgmc2VsZi0+YXVkaW9faW5mbykgPiAwLAorICAgICAgR1NUX0ZMT1dfTk9UX05FR09USUFURUQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZzZWxmLT5hdWRpb19pbmZvKSA+IDAsCisgICAgICBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRCk7CisKKyAgcmV0ID0gZ3N0X2RlaW50ZXJsZWF2ZV9wcm9jZXNzIChzZWxmLCBidWZmZXIpOworCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImZsb3cgcmV0dXJuOiAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9kZWludGVybGVhdmVfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3REZWludGVybGVhdmUgKnNlbGYgPSBHU1RfREVJTlRFUkxFQVZFIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfZGVpbnRlcmxlYXZlX3JlbW92ZV9wYWRzIChzZWxmKTsKKworICAgICAgc2VsZi0+ZnVuYyA9IE5VTEw7CisKKyAgICAgIGlmIChzZWxmLT5wZW5kaW5nX2V2ZW50cykgeworICAgICAgICBnX2xpc3RfZm9yZWFjaCAoc2VsZi0+cGVuZGluZ19ldmVudHMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLAorICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGdfbGlzdF9mcmVlIChzZWxmLT5wZW5kaW5nX2V2ZW50cyk7CisgICAgICAgIHNlbGYtPnBlbmRpbmdfZXZlbnRzID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUExBWUlORzoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QTEFZSU5HX1RPX1BBVVNFRDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfZGVpbnRlcmxlYXZlX3JlbW92ZV9wYWRzIChzZWxmKTsKKworICAgICAgc2VsZi0+ZnVuYyA9IE5VTEw7CisKKyAgICAgIGlmIChzZWxmLT5wZW5kaW5nX2V2ZW50cykgeworICAgICAgICBnX2xpc3RfZm9yZWFjaCAoc2VsZi0+cGVuZGluZ19ldmVudHMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLAorICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGdfbGlzdF9mcmVlIChzZWxmLT5wZW5kaW5nX2V2ZW50cyk7CisgICAgICAgIHNlbGYtPnBlbmRpbmdfZXZlbnRzID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9nc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuaCBiL2dzdC9pbnRlcmxlYXZlL2RlaW50ZXJsZWF2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzE4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaW50ZXJsZWF2ZS9kZWludGVybGVhdmUuaApAQCAtMCwwICsxLDczIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwMCBXaW0gVGF5bWFucyA8d3RheUBjaGVsbG8uYmU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwNSBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogICAgICAgICAgICAgICAgICAgIDIwMDcgQW5keSBXaW5nbyA8d2luZ28gYXQgcG9ib3guY29tPgorICogICAgICAgICAgICAgICAgICAgIDIwMDggU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIGRlaW50ZXJsZWF2ZS5jOiBkZWludGVybGVhdmUgc2FtcGxlcworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19ERUlOVEVSTEVBVkVfSF9fCisjZGVmaW5lIF9fREVJTlRFUkxFQVZFX0hfXworCitHX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfREVJTlRFUkxFQVZFICAgICAgICAgICAgKGdzdF9kZWludGVybGVhdmVfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0RFSU5URVJMRUFWRShvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0RFSU5URVJMRUFWRSxHc3REZWludGVybGVhdmUpKQorI2RlZmluZSBHU1RfREVJTlRFUkxFQVZFX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9ERUlOVEVSTEVBVkUsR3N0RGVpbnRlcmxlYXZlQ2xhc3MpKQorI2RlZmluZSBHU1RfREVJTlRFUkxFQVZFX0dFVF9DTEFTUyhvYmopIFwKKyAgICAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLEdTVF9UWVBFX0RFSU5URVJMRUFWRSxHc3REZWludGVybGVhdmVDbGFzcykpCisjZGVmaW5lIEdTVF9JU19ERUlOVEVSTEVBVkUob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9ERUlOVEVSTEVBVkUpKQorI2RlZmluZSBHU1RfSVNfREVJTlRFUkxFQVZFX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9ERUlOVEVSTEVBVkUpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0RGVpbnRlcmxlYXZlIEdzdERlaW50ZXJsZWF2ZTsKK3R5cGVkZWYgc3RydWN0IF9Hc3REZWludGVybGVhdmVDbGFzcyBHc3REZWludGVybGVhdmVDbGFzczsKKwordHlwZWRlZiB2b2lkICgqR3N0RGVpbnRlcmxlYXZlRnVuYykgKGdwb2ludGVyIG91dCwgZ3BvaW50ZXIgaW4sIGd1aW50IHN0cmlkZSwgZ3VpbnQgbmZyYW1lcyk7CisKK3N0cnVjdCBfR3N0RGVpbnRlcmxlYXZlCit7CisgIEdzdEVsZW1lbnQgZWxlbWVudDsKKworICAvKjwgcHJpdmF0ZSA+ICovCisgIEdMaXN0ICpzcmNwYWRzOworICBHc3RDYXBzICpzaW5rY2FwczsKKyAgR3N0QXVkaW9JbmZvIGF1ZGlvX2luZm87CisgIGdib29sZWFuIGtlZXBfcG9zaXRpb25zOworCisgIEdzdFBhZCAqc2luazsKKworICBHc3REZWludGVybGVhdmVGdW5jIGZ1bmM7CisKKyAgR0xpc3QgKnBlbmRpbmdfZXZlbnRzOworfTsKKworc3RydWN0IF9Hc3REZWludGVybGVhdmVDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2RlaW50ZXJsZWF2ZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0RFSU5URVJMRUFWRV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYyBiL2dzdC9pbnRlcmxlYXZlL2ludGVybGVhdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDhkMGZmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5jCkBAIC0wLDAgKzEsMTMzOCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAgICAgIDIwMDAgV2ltIFRheW1hbnMgPHd0YXlAY2hlbGxvLmJlPgorICogICAgICAgICAgICAgICAgICAgIDIwMDUgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDA3IEFuZHkgV2luZ28gPHdpbmdvIGF0IHBvYm94LmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDA4IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLnJnPgorICoKKyAqIGludGVybGVhdmUuYzogaW50ZXJsZWF2ZSBzYW1wbGVzLCBtb3N0bHkgYmFzZWQgb24gYWRkZXIuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyogVE9ETzoKKyAqICAgICAgIC0gaGFuZGxlIGNhcHMgY2hhbmdlcworICogICAgICAgLSBoYW5kbGUgbW9yZSBxdWVyaWVzL2V2ZW50cworICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWludGVybGVhdmUKKyAqIEBzZWVfYWxzbzogZGVpbnRlcmxlYXZlCisgKgorICogTWVyZ2VzIHNlcGFyYXRlIG1vbm8gaW5wdXRzIGludG8gb25lIGludGVybGVhdmVkIHN0cmVhbS4KKyAqIAorICogVGhpcyBlbGVtZW50IGhhbmRsZXMgYWxsIHJhdyBmbG9hdGluZyBwb2ludCBzYW1wbGUgZm9ybWF0cyBhbmQgYWxsIHNpZ25lZCBpbnRlZ2VyIHNhbXBsZSBmb3JtYXRzLiBUaGUgZmlyc3QKKyAqIGNhcHMgb24gb25lIG9mIHRoZSBzaW5rcGFkcyB3aWxsIHNldCB0aGUgY2FwcyBvZiB0aGUgb3V0cHV0IHNvIHVzdWFsbHkgYW4gYXVkaW9jb252ZXJ0IGVsZW1lbnQgc2hvdWxkIGJlCisgKiBwbGFjZWQgYmVmb3JlIGV2ZXJ5IHNpbmtwYWQgb2YgaW50ZXJsZWF2ZS4KKyAqIAorICogSXQncyBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIG51bWJlciBvZiBjaGFubmVscyB3aGlsZSB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBieSBhZGRpbmcgb3IgcmVtb3ZpbmcKKyAqIHNvbWUgb2YgdGhlIHJlcXVlc3QgcGFkcyBidXQgdGhpcyB3aWxsIGNoYW5nZSB0aGUgY2FwcyBvZiB0aGUgb3V0cHV0IGJ1ZmZlcnMuIENoYW5naW5nIHRoZSBpbnB1dAorICogY2FwcyBpcyBfbm90XyBzdXBwb3J0ZWQgeWV0LgorICogCisgKiBUaGUgY2hhbm5lbCBudW1iZXIgb2YgZXZlcnkgc2lua3BhZCBpbiB0aGUgb3V0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgImNoYW5uZWwiIHByb3BlcnR5IG9mIHRoZSBwYWQuCisgKiAKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPWZpbGUubXAzICEgZGVjb2RlYmluICEgYXVkaW9jb252ZXJ0ICEgImF1ZGlvL3gtcmF3LGNoYW5uZWxzPTIiICEgZGVpbnRlcmxlYXZlIG5hbWU9ZCAgaW50ZXJsZWF2ZSBuYW1lPWkgISBhdWRpb2NvbnZlcnQgISB3YXZlbmMgISBmaWxlc2luayBsb2NhdGlvbj10ZXN0LndhdiAgICBkLnNyY18wICEgcXVldWUgISBhdWRpb2NvbnZlcnQgISBpLnNpbmtfMSAgICBkLnNyY18xICEgcXVldWUgISBhdWRpb2NvbnZlcnQgISBpLnNpbmtfMAorICogXXwgRGVjb2RlcyBhbmQgZGVpbnRlcmxlYXZlcyBhIFN0ZXJlbyBNUDMgZmlsZSBpbnRvIHNlcGFyYXRlIGNoYW5uZWxzIGFuZAorICogdGhlbiBpbnRlcmxlYXZlcyB0aGUgY2hhbm5lbHMgYWdhaW4gdG8gYSBXQVYgZmlsZSB3aXRoIHRoZSBjaGFubmVscworICogZXhjaGFuZ2VkLgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGludGVybGVhdmUgbmFtZT1pICEgYXVkaW9jb252ZXJ0ICEgd2F2ZW5jICEgZmlsZXNpbmsgbG9jYXRpb249ZmlsZS53YXYgIGZpbGVzcmMgbG9jYXRpb249ZmlsZTEud2F2ICEgZGVjb2RlYmluICEgYXVkaW9jb252ZXJ0ICEgImF1ZGlvL3gtcmF3LGNoYW5uZWxzPTEsY2hhbm5lbC1tYXNrPShiaXRtYXNrKTB4MSIgISBxdWV1ZSAhIGkuc2lua18wICAgZmlsZXNyYyBsb2NhdGlvbj1maWxlMi53YXYgISBkZWNvZGViaW4gISBhdWRpb2NvbnZlcnQgISAiYXVkaW8veC1yYXcsY2hhbm5lbHM9MSxjaGFubmVsLW1hc2s9KGJpdG1hc2spMHgyIiAhIHF1ZXVlICEgaS5zaW5rXzEKKyAqIF18IEludGVybGVhdmVzIHR3byBNb25vIFdBViBmaWxlcyB0byBhIHNpbmdsZSBTdGVyZW8gV0FWIGZpbGUuIEhhdmluZworICogY2hhbm5lbC1tYXNrcyBkZWZpbmVkIGluIHRoZSBzaW5rIHBhZHMgZW5zdXJlcyBhIHNhbmUgbWFwcGluZyBvZiB0aGUgbW9ubworICogc3RyZWFtcyBpbnRvIHRoZSBzdGVyZW8gc3RyZWFtLiBOT1RFOiB0aGUgcHJvcGVyIHdheSB0byBtYXAgY2hhbm5lbHMgaW4KKyAqIGNvZGUgaXMgYnkgdXNpbmcgdGhlIGNoYW5uZWwtcG9zaXRpb25zIHByb3BlcnR5IG9mIHRoZSBpbnRlcmxlYXZlIGVsZW1lbnQuCisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qIEZJWE1FIDAuMTE6IHN1cHByZXNzIHdhcm5pbmdzIGZvciBkZXByZWNhdGVkIEFQSSBzdWNoIGFzIEdWYWx1ZUFycmF5CisgKiB3aXRoIG5ld2VyIEdMaWIgdmVyc2lvbnMgKD49IDIuMzEuMCkgKi8KKyNkZWZpbmUgR0xJQl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImludGVybGVhdmUuaCIKKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby1lbnVtdHlwZXMuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X2ludGVybGVhdmVfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2ludGVybGVhdmVfZGVidWcKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmtfJXUiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX0ZPUk1BVFNfQUxMICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIHtub24taW50ZXJsZWF2ZWQsIGludGVybGVhdmVkfSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgWyAxLCBNQVggXSwgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fRk9STUFUU19BTEwgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQiKQorICAgICk7CisKKyNkZWZpbmUgTUFLRV9GVU5DKHR5cGUpIFwKK3N0YXRpYyB2b2lkIGludGVybGVhdmVfIyN0eXBlIChndWludCMjdHlwZSAqb3V0LCBndWludCMjdHlwZSAqaW4sIFwKKyAgICBndWludCBzdHJpZGUsIGd1aW50IG5mcmFtZXMpIFwKK3sgXAorICBnaW50IGk7IFwKKyAgXAorICBmb3IgKGkgPSAwOyBpIDwgbmZyYW1lczsgaSsrKSB7IFwKKyAgICAqb3V0ID0gaW5baV07IFwKKyAgICBvdXQgKz0gc3RyaWRlOyBcCisgIH0gXAorfQorCitNQUtFX0ZVTkMgKDgpOworTUFLRV9GVU5DICgxNik7CitNQUtFX0ZVTkMgKDMyKTsKK01BS0VfRlVOQyAoNjQpOworCitzdGF0aWMgdm9pZAoraW50ZXJsZWF2ZV8yNCAoZ3VpbnQ4ICogb3V0LCBndWludDggKiBpbiwgZ3VpbnQgc3RyaWRlLCBndWludCBuZnJhbWVzKQoreworICBnaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG5mcmFtZXM7IGkrKykgeworICAgIG1lbWNweSAob3V0LCBpbiwgMyk7CisgICAgb3V0ICs9IHN0cmlkZSAqIDM7CisgICAgaW4gKz0gMzsKKyAgfQorfQorCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RQYWQgcGFyZW50OworICBndWludCBjaGFubmVsOworfSBHc3RJbnRlcmxlYXZlUGFkOworCitlbnVtCit7CisgIFBST1BfUEFEXzAsCisgIFBST1BfUEFEX0NIQU5ORUwKK307CisKK3N0YXRpYyB2b2lkIGdzdF9pbnRlcmxlYXZlX3BhZF9jbGFzc19pbml0IChHc3RQYWRDbGFzcyAqIGtsYXNzKTsKKworI2RlZmluZSBHU1RfVFlQRV9JTlRFUkxFQVZFX1BBRCAoZ3N0X2ludGVybGVhdmVfcGFkX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9JTlRFUkxFQVZFX1BBRChwYWQpIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgocGFkKSxHU1RfVFlQRV9JTlRFUkxFQVZFX1BBRCxHc3RJbnRlcmxlYXZlUGFkKSkKKyNkZWZpbmUgR1NUX0lOVEVSTEVBVkVfUEFEX0NBU1QocGFkKSAoKEdzdEludGVybGVhdmVQYWQgKikgcGFkKQorI2RlZmluZSBHU1RfSVNfSU5URVJMRUFWRV9QQUQocGFkKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKHBhZCksR1NUX1RZUEVfSU5URVJMRUFWRV9QQUQpKQorc3RhdGljIEdUeXBlCitnc3RfaW50ZXJsZWF2ZV9wYWRfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB0eXBlID0gMDsKKworICBpZiAoR19VTkxJS0VMWSAodHlwZSA9PSAwKSkgeworICAgIHR5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljX3NpbXBsZSAoR1NUX1RZUEVfUEFELAorICAgICAgICBnX2ludGVybl9zdGF0aWNfc3RyaW5nICgiR3N0SW50ZXJsZWF2ZVBhZCIpLCBzaXplb2YgKEdzdFBhZENsYXNzKSwKKyAgICAgICAgKEdDbGFzc0luaXRGdW5jKSBnc3RfaW50ZXJsZWF2ZV9wYWRfY2xhc3NfaW5pdCwKKyAgICAgICAgc2l6ZW9mIChHc3RJbnRlcmxlYXZlUGFkKSwgTlVMTCwgMCk7CisgIH0KKyAgcmV0dXJuIHR5cGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaW50ZXJsZWF2ZV9wYWRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEludGVybGVhdmVQYWQgKnNlbGYgPSBHU1RfSU5URVJMRUFWRV9QQUQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BBRF9DSEFOTkVMOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNlbGYtPmNoYW5uZWwpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2ludGVybGVhdmVfcGFkX2NsYXNzX2luaXQgKEdzdFBhZENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2ludGVybGVhdmVfcGFkX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9QQURfQ0hBTk5FTCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiY2hhbm5lbCIsCisgICAgICAgICAgIkNoYW5uZWwgbnVtYmVyIiwKKyAgICAgICAgICAiTnVtYmVyIG9mIHRoZSBjaGFubmVsIG9mIHRoaXMgcGFkIGluIHRoZSBvdXRwdXQiLCAwLCBHX01BWFVJTlQsIDAsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKK30KKworI2RlZmluZSBnc3RfaW50ZXJsZWF2ZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RJbnRlcmxlYXZlLCBnc3RfaW50ZXJsZWF2ZSwgR1NUX1RZUEVfRUxFTUVOVCk7CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0NIQU5ORUxfUE9TSVRJT05TLAorICBQUk9QX0NIQU5ORUxfUE9TSVRJT05TX0ZST01fSU5QVVQKK307CisKK3N0YXRpYyB2b2lkIGdzdF9pbnRlcmxlYXZlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9pbnRlcmxlYXZlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdFBhZCAqZ3N0X2ludGVybGVhdmVfcmVxdWVzdF9uZXdfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIG5hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyB2b2lkIGdzdF9pbnRlcmxlYXZlX3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9pbnRlcmxlYXZlX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfaW50ZXJsZWF2ZV9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ludGVybGVhdmVfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9pbnRlcmxlYXZlX3NpbmtfZXZlbnQgKEdzdENvbGxlY3RQYWRzICogcGFkcywKKyAgICBHc3RDb2xsZWN0RGF0YSAqIGRhdGEsIEdzdEV2ZW50ICogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2ludGVybGVhdmVfc2lua19xdWVyeSAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLAorICAgIEdzdENvbGxlY3REYXRhICogZGF0YSwgR3N0UXVlcnkgKiBxdWVyeSwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9pbnRlcmxlYXZlX3Npbmtfc2V0Y2FwcyAoR3N0SW50ZXJsZWF2ZSAqIHNlbGYsCisgICAgR3N0UGFkICogcGFkLCBjb25zdCBHc3RDYXBzICogY2FwcywgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbyk7CisKK3N0YXRpYyBHc3RDYXBzICpnc3RfaW50ZXJsZWF2ZV9zaW5rX2dldGNhcHMgKEdzdFBhZCAqIHBhZCwgR3N0SW50ZXJsZWF2ZSAqIHNlbGYsCisgICAgR3N0Q2FwcyAqIGZpbHRlcik7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9pbnRlcmxlYXZlX2NvbGxlY3RlZCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLAorICAgIEdzdEludGVybGVhdmUgKiBzZWxmKTsKKworc3RhdGljIHZvaWQKK2dzdF9pbnRlcmxlYXZlX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RJbnRlcmxlYXZlICpzZWxmID0gR1NUX0lOVEVSTEVBVkUgKG9iamVjdCk7CisKKyAgaWYgKHNlbGYtPmNvbGxlY3QpIHsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzZWxmLT5jb2xsZWN0KTsKKyAgICBzZWxmLT5jb2xsZWN0ID0gTlVMTDsKKyAgfQorCisgIGlmIChzZWxmLT5jaGFubmVsX3Bvc2l0aW9ucworICAgICAgJiYgc2VsZi0+Y2hhbm5lbF9wb3NpdGlvbnMgIT0gc2VsZi0+aW5wdXRfY2hhbm5lbF9wb3NpdGlvbnMpIHsKKyAgICBnX3ZhbHVlX2FycmF5X2ZyZWUgKHNlbGYtPmNoYW5uZWxfcG9zaXRpb25zKTsKKyAgICBzZWxmLT5jaGFubmVsX3Bvc2l0aW9ucyA9IE5VTEw7CisgIH0KKworICBpZiAoc2VsZi0+aW5wdXRfY2hhbm5lbF9wb3NpdGlvbnMpIHsKKyAgICBnX3ZhbHVlX2FycmF5X2ZyZWUgKHNlbGYtPmlucHV0X2NoYW5uZWxfcG9zaXRpb25zKTsKKyAgICBzZWxmLT5pbnB1dF9jaGFubmVsX3Bvc2l0aW9ucyA9IE5VTEw7CisgIH0KKworICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+c2lua2NhcHMsIE5VTEwpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGdpbnQKK2NvbXBhcmVfcG9zaXRpb25zIChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBjb25zdCBnaW50IGkgPSAqKGNvbnN0IGdpbnQgKikgYTsKKyAgY29uc3QgZ2ludCBqID0gKihjb25zdCBnaW50ICopIGI7CisgIGNvbnN0IGdpbnQgKnBvcyA9IChjb25zdCBnaW50ICopIHVzZXJfZGF0YTsKKworICBpZiAocG9zW2ldIDwgcG9zW2pdKQorICAgIHJldHVybiAtMTsKKyAgZWxzZSBpZiAocG9zW2ldID4gcG9zW2pdKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ludGVybGVhdmVfY2hhbm5lbF9wb3NpdGlvbnNfdG9fbWFzayAoR1ZhbHVlQXJyYXkgKiBwb3NpdGlvbnMsCisgICAgZ2ludCBkZWZhdWx0X29yZGVyaW5nX21hcFs2NF0sIGd1aW50NjQgKiBtYXNrKQoreworICBnaW50IGk7CisgIGd1aW50IGNoYW5uZWxzOworICBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqcG9zOworICBnYm9vbGVhbiByZXQ7CisKKyAgY2hhbm5lbHMgPSBwb3NpdGlvbnMtPm5fdmFsdWVzOworICBwb3MgPSBnX25ldyAoR3N0QXVkaW9DaGFubmVsUG9zaXRpb24sIGNoYW5uZWxzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgeworICAgIEdWYWx1ZSAqdmFsOworCisgICAgdmFsID0gZ192YWx1ZV9hcnJheV9nZXRfbnRoIChwb3NpdGlvbnMsIGkpOworICAgIHBvc1tpXSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbCk7CisgIH0KKworICAvKiBzb3J0IHRoZSBkZWZhdWx0IG9yZGVyaW5nIG1hcCBhY2NvcmRpbmcgdG8gdGhlIHBvc2l0aW9uIG9yZGVyICovCisgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisgICAgZGVmYXVsdF9vcmRlcmluZ19tYXBbaV0gPSBpOworICB9CisgIGdfcXNvcnRfd2l0aF9kYXRhIChkZWZhdWx0X29yZGVyaW5nX21hcCwgY2hhbm5lbHMsCisgICAgICBzaXplb2YgKCpkZWZhdWx0X29yZGVyaW5nX21hcCksIGNvbXBhcmVfcG9zaXRpb25zLCBwb3MpOworCisgIHJldCA9IGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b19tYXNrIChwb3MsIGNoYW5uZWxzLCBGQUxTRSwgbWFzayk7CisgIGdfZnJlZSAocG9zKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X2ludGVybGVhdmVfc2V0X2NoYW5uZWxfcG9zaXRpb25zIChHc3RJbnRlcmxlYXZlICogc2VsZiwgR3N0U3RydWN0dXJlICogcykKK3sKKyAgaWYgKHNlbGYtPmNoYW5uZWxzIDw9IDY0ICYmCisgICAgICBzZWxmLT5jaGFubmVsX3Bvc2l0aW9ucyAhPSBOVUxMICYmCisgICAgICBzZWxmLT5jaGFubmVscyA9PSBzZWxmLT5jaGFubmVsX3Bvc2l0aW9ucy0+bl92YWx1ZXMpIHsKKyAgICBpZiAoIWdzdF9pbnRlcmxlYXZlX2NoYW5uZWxfcG9zaXRpb25zX3RvX21hc2sgKHNlbGYtPmNoYW5uZWxfcG9zaXRpb25zLAorICAgICAgICAgICAgc2VsZi0+ZGVmYXVsdF9jaGFubmVsc19vcmRlcmluZ19tYXAsICZzZWxmLT5jaGFubmVsX21hc2spKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNlbGYsICJJbnZhbGlkIGNoYW5uZWwgcG9zaXRpb25zLCB1c2luZyBOT05FIik7CisgICAgICBzZWxmLT5jaGFubmVsX21hc2sgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzZWxmLT5jaGFubmVsX21hc2sgPSAwOworICAgIGlmIChzZWxmLT5jaGFubmVscyA8PSA2NCkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiVXNpbmcgTk9ORSBjaGFubmVsIHBvc2l0aW9ucyIpOworICAgIH0KKyAgfQorICBnc3Rfc3RydWN0dXJlX3NldCAocywgImNoYW5uZWwtbWFzayIsIEdTVF9UWVBFX0JJVE1BU0ssIHNlbGYtPmNoYW5uZWxfbWFzaywKKyAgICAgIE5VTEwpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2ludGVybGVhdmVfc2VuZF9zdHJlYW1fc3RhcnQgKEdzdEludGVybGVhdmUgKiBzZWxmKQoreworICBHU1RfT0JKRUNUX0xPQ0sgKHNlbGYpOworICBpZiAoc2VsZi0+c2VuZF9zdHJlYW1fc3RhcnQpIHsKKyAgICBnY2hhciBzX2lkWzMyXTsKKworICAgIHNlbGYtPnNlbmRfc3RyZWFtX3N0YXJ0ID0gRkFMU0U7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNlbGYpOworCisgICAgLyogc3RyZWFtLXN0YXJ0IChGSVhNRTogY3JlYXRlIGlkIGJhc2VkIG9uIGlucHV0IGlkcykgKi8KKyAgICBnX3NucHJpbnRmIChzX2lkLCBzaXplb2YgKHNfaWQpLCAiaW50ZXJsZWF2ZS0lMDh4IiwgZ19yYW5kb21faW50ICgpKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNyYywgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKHNfaWQpKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9pbnRlcmxlYXZlX2NsYXNzX2luaXQgKEdzdEludGVybGVhdmVDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9pbnRlcmxlYXZlX2RlYnVnLCAiaW50ZXJsZWF2ZSIsIDAsCisgICAgICAiaW50ZXJsZWF2ZSBlbGVtZW50Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkF1ZGlvIGludGVybGVhdmVyIiwKKyAgICAgICJGaWx0ZXIvQ29udmVydGVyL0F1ZGlvIiwKKyAgICAgICJGb2xkcyBtYW55IG1vbm8gY2hhbm5lbHMgaW50byBvbmUgaW50ZXJsZWF2ZWQgYXVkaW8gc3RyZWFtIiwKKyAgICAgICJBbmR5IFdpbmdvIDx3aW5nbyBhdCBwb2JveC5jb20+LCAiCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsYXRlKTsKKworICAvKiBSZWZlcmVuY2UgR3N0SW50ZXJsZWF2ZVBhZCBjbGFzcyB0byBoYXZlIHRoZSB0eXBlIHJlZ2lzdGVyZWQgZnJvbQorICAgKiBhIHRocmVhZHNhZmUgY29udGV4dAorICAgKi8KKyAgZ190eXBlX2NsYXNzX3JlZiAoR1NUX1RZUEVfSU5URVJMRUFWRV9QQUQpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2ludGVybGVhdmVfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9pbnRlcmxlYXZlX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2ludGVybGVhdmVfZ2V0X3Byb3BlcnR5OworCisgIC8qKgorICAgKiBHc3RJbnRlcmxlYXZlOmNoYW5uZWwtcG9zaXRpb25zCisgICAqIAorICAgKiBDaGFubmVsIHBvc2l0aW9uczogVGhpcyBwcm9wZXJ0eSBjb250cm9scyB0aGUgY2hhbm5lbCBwb3NpdGlvbnMKKyAgICogdGhhdCBhcmUgdXNlZCBvbiB0aGUgc3JjIGNhcHMuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgc2hvdWxkIGJlCisgICAqIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2Ygc2luayBwYWRzIGFuZCB0aGUgYXJyYXkgc2hvdWxkIGNvbnRhaW4KKyAgICogYSB2YWxpZCBsaXN0IG9mIGNoYW5uZWwgcG9zaXRpb25zLiBUaGUgbi10aCBlbGVtZW50IG9mIHRoZSBhcnJheQorICAgKiBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIG4tdGggc2luayBwYWQuCisgICAqCisgICAqIFRoZXNlIGNoYW5uZWwgcG9zaXRpb25zIHdpbGwgb25seSBiZSB1c2VkIGlmIHRoZXkncmUgdmFsaWQgYW5kIHRoZQorICAgKiBudW1iZXIgb2YgZWxlbWVudHMgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscy4gSWYgdGhpcworICAgKiBpcyBub3QgZ2l2ZW4gYSBOT05FIGxheW91dCB3aWxsIGJlIHVzZWQuCisgICAqCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NIQU5ORUxfUE9TSVRJT05TLAorICAgICAgZ19wYXJhbV9zcGVjX3ZhbHVlX2FycmF5ICgiY2hhbm5lbC1wb3NpdGlvbnMiLCAiQ2hhbm5lbCBwb3NpdGlvbnMiLAorICAgICAgICAgICJDaGFubmVsIHBvc2l0aW9ucyB1c2VkIG9uIHRoZSBvdXRwdXQiLAorICAgICAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgiY2hhbm5lbC1wb3NpdGlvbiIsICJDaGFubmVsIHBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgIkNoYW5uZWwgcG9zaXRpb24gb2YgdGhlIG4tdGggaW5wdXQiLAorICAgICAgICAgICAgICBHU1RfVFlQRV9BVURJT19DSEFOTkVMX1BPU0lUSU9OLAorICAgICAgICAgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FLAorICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RJbnRlcmxlYXZlOmNoYW5uZWwtcG9zaXRpb25zLWZyb20taW5wdXQKKyAgICogCisgICAqIENoYW5uZWwgcG9zaXRpb25zIGZyb20gaW5wdXQ6IElmIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvICVUUlVFIHRoZSBjaGFubmVsCisgICAqIHBvc2l0aW9ucyB3aWxsIGJlIHRha2VuIGZyb20gdGhlIGlucHV0IGNhcHMgaWYgdmFsaWQgY2hhbm5lbCBwb3NpdGlvbnMgZm9yCisgICAqIHRoZSBvdXRwdXQgY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gdGhlbS4gSWYgdGhpcyBpcyBzZXQgdG8gJVRSVUUgc2V0dGluZyB0aGUKKyAgICogY2hhbm5lbC1wb3NpdGlvbnMgcHJvcGVydHkgb3ZlcndyaXRlcyB0aGlzIHByb3BlcnR5IGFnYWluLgorICAgKgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfQ0hBTk5FTF9QT1NJVElPTlNfRlJPTV9JTlBVVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiY2hhbm5lbC1wb3NpdGlvbnMtZnJvbS1pbnB1dCIsCisgICAgICAgICAgIkNoYW5uZWwgcG9zaXRpb25zIGZyb20gaW5wdXQiLAorICAgICAgICAgICJUYWtlIGNoYW5uZWwgcG9zaXRpb25zIGZyb20gdGhlIGlucHV0IiwgVFJVRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5yZXF1ZXN0X25ld19wYWQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9pbnRlcmxlYXZlX3JlcXVlc3RfbmV3X3BhZCk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPnJlbGVhc2VfcGFkID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfaW50ZXJsZWF2ZV9yZWxlYXNlX3BhZCk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ludGVybGVhdmVfY2hhbmdlX3N0YXRlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9pbnRlcmxlYXZlX2luaXQgKEdzdEludGVybGVhdmUgKiBzZWxmKQoreworICBzZWxmLT5zcmMgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNyY190ZW1wbGF0ZSwgInNyYyIpOworCisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChzZWxmLT5zcmMsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ludGVybGVhdmVfc3JjX3F1ZXJ5KSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChzZWxmLT5zcmMsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2ludGVybGVhdmVfc3JjX2V2ZW50KSk7CisKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHNlbGYpLCBzZWxmLT5zcmMpOworCisgIHNlbGYtPmNvbGxlY3QgPSBnc3RfY29sbGVjdF9wYWRzX25ldyAoKTsKKyAgZ3N0X2NvbGxlY3RfcGFkc19zZXRfZnVuY3Rpb24gKHNlbGYtPmNvbGxlY3QsCisgICAgICAoR3N0Q29sbGVjdFBhZHNGdW5jdGlvbikgZ3N0X2ludGVybGVhdmVfY29sbGVjdGVkLCBzZWxmKTsKKworICBzZWxmLT5pbnB1dF9jaGFubmVsX3Bvc2l0aW9ucyA9IGdfdmFsdWVfYXJyYXlfbmV3ICgwKTsKKyAgc2VsZi0+Y2hhbm5lbF9wb3NpdGlvbnNfZnJvbV9pbnB1dCA9IFRSVUU7CisgIHNlbGYtPmNoYW5uZWxfcG9zaXRpb25zID0gc2VsZi0+aW5wdXRfY2hhbm5lbF9wb3NpdGlvbnM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaW50ZXJsZWF2ZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0SW50ZXJsZWF2ZSAqc2VsZiA9IEdTVF9JTlRFUkxFQVZFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DSEFOTkVMX1BPU0lUSU9OUzoKKyAgICAgIGlmIChzZWxmLT5jaGFubmVsX3Bvc2l0aW9ucyAmJgorICAgICAgICAgIHNlbGYtPmNoYW5uZWxfcG9zaXRpb25zICE9IHNlbGYtPmlucHV0X2NoYW5uZWxfcG9zaXRpb25zKQorICAgICAgICBnX3ZhbHVlX2FycmF5X2ZyZWUgKHNlbGYtPmNoYW5uZWxfcG9zaXRpb25zKTsKKworICAgICAgc2VsZi0+Y2hhbm5lbF9wb3NpdGlvbnMgPSBnX3ZhbHVlX2R1cF9ib3hlZCAodmFsdWUpOworICAgICAgc2VsZi0+Y2hhbm5lbF9wb3NpdGlvbnNfZnJvbV9pbnB1dCA9IEZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NIQU5ORUxfUE9TSVRJT05TX0ZST01fSU5QVVQ6CisgICAgICBzZWxmLT5jaGFubmVsX3Bvc2l0aW9uc19mcm9tX2lucHV0ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworCisgICAgICBpZiAoc2VsZi0+Y2hhbm5lbF9wb3NpdGlvbnNfZnJvbV9pbnB1dCkgeworICAgICAgICBpZiAoc2VsZi0+Y2hhbm5lbF9wb3NpdGlvbnMgJiYKKyAgICAgICAgICAgIHNlbGYtPmNoYW5uZWxfcG9zaXRpb25zICE9IHNlbGYtPmlucHV0X2NoYW5uZWxfcG9zaXRpb25zKQorICAgICAgICAgIGdfdmFsdWVfYXJyYXlfZnJlZSAoc2VsZi0+Y2hhbm5lbF9wb3NpdGlvbnMpOworICAgICAgICBzZWxmLT5jaGFubmVsX3Bvc2l0aW9ucyA9IHNlbGYtPmlucHV0X2NoYW5uZWxfcG9zaXRpb25zOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2ludGVybGVhdmVfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEludGVybGVhdmUgKnNlbGYgPSBHU1RfSU5URVJMRUFWRSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ0hBTk5FTF9QT1NJVElPTlM6CisgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIHNlbGYtPmNoYW5uZWxfcG9zaXRpb25zKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DSEFOTkVMX1BPU0lUSU9OU19GUk9NX0lOUFVUOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNlbGYtPmNoYW5uZWxfcG9zaXRpb25zX2Zyb21faW5wdXQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgR3N0UGFkICoKK2dzdF9pbnRlcmxlYXZlX3JlcXVlc3RfbmV3X3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsCisgICAgY29uc3QgZ2NoYXIgKiByZXFfbmFtZSwgY29uc3QgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdEludGVybGVhdmUgKnNlbGYgPSBHU1RfSU5URVJMRUFWRSAoZWxlbWVudCk7CisgIEdzdFBhZCAqbmV3X3BhZDsKKyAgZ2NoYXIgKnBhZF9uYW1lOworICBnaW50IGNoYW5uZWwsIHBhZG51bWJlcjsKKyAgR1ZhbHVlIHZhbCA9IHsgMCwgfTsKKworICBpZiAodGVtcGwtPmRpcmVjdGlvbiAhPSBHU1RfUEFEX1NJTkspCisgICAgZ290byBub3Rfc2lua19wYWQ7CisKKyAgcGFkbnVtYmVyID0gZ19hdG9taWNfaW50X2FkZCAoJnNlbGYtPnBhZGNvdW50ZXIsIDEpOworCisgIGNoYW5uZWwgPSBnX2F0b21pY19pbnRfYWRkICgmc2VsZi0+Y2hhbm5lbHMsIDEpOworICBpZiAoIXNlbGYtPmNoYW5uZWxfcG9zaXRpb25zX2Zyb21faW5wdXQpCisgICAgY2hhbm5lbCA9IHBhZG51bWJlcjsKKworICBwYWRfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNpbmtfJXUiLCBwYWRudW1iZXIpOworICBuZXdfcGFkID0gR1NUX1BBRF9DQVNUIChnX29iamVjdF9uZXcgKEdTVF9UWVBFX0lOVEVSTEVBVkVfUEFELAorICAgICAgICAgICJuYW1lIiwgcGFkX25hbWUsICJkaXJlY3Rpb24iLCB0ZW1wbC0+ZGlyZWN0aW9uLAorICAgICAgICAgICJ0ZW1wbGF0ZSIsIHRlbXBsLCBOVUxMKSk7CisgIEdTVF9JTlRFUkxFQVZFX1BBRF9DQVNUIChuZXdfcGFkKS0+Y2hhbm5lbCA9IGNoYW5uZWw7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJyZXF1ZXN0ZWQgbmV3IHBhZCAlcyIsIHBhZF9uYW1lKTsKKyAgZ19mcmVlIChwYWRfbmFtZSk7CisKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAobmV3X3BhZCk7CisKKyAgZ3N0X2NvbGxlY3RfcGFkc19hZGRfcGFkIChzZWxmLT5jb2xsZWN0LCBuZXdfcGFkLCBzaXplb2YgKEdzdENvbGxlY3REYXRhKSwKKyAgICAgIE5VTEwsIFRSVUUpOworCisgIGdzdF9jb2xsZWN0X3BhZHNfc2V0X2V2ZW50X2Z1bmN0aW9uIChzZWxmLT5jb2xsZWN0LAorICAgICAgKEdzdENvbGxlY3RQYWRzRXZlbnRGdW5jdGlvbikKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfaW50ZXJsZWF2ZV9zaW5rX2V2ZW50KSwgc2VsZik7CisKKyAgZ3N0X2NvbGxlY3RfcGFkc19zZXRfcXVlcnlfZnVuY3Rpb24gKHNlbGYtPmNvbGxlY3QsCisgICAgICAoR3N0Q29sbGVjdFBhZHNRdWVyeUZ1bmN0aW9uKQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9pbnRlcmxlYXZlX3NpbmtfcXVlcnkpLCBzZWxmKTsKKworICBpZiAoIWdzdF9lbGVtZW50X2FkZF9wYWQgKGVsZW1lbnQsIG5ld19wYWQpKQorICAgIGdvdG8gY291bGRfbm90X2FkZDsKKworICBnX3ZhbHVlX2luaXQgKCZ2YWwsIEdTVF9UWVBFX0FVRElPX0NIQU5ORUxfUE9TSVRJT04pOworICBnX3ZhbHVlX3NldF9lbnVtICgmdmFsLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FKTsKKyAgc2VsZi0+aW5wdXRfY2hhbm5lbF9wb3NpdGlvbnMgPQorICAgICAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKHNlbGYtPmlucHV0X2NoYW5uZWxfcG9zaXRpb25zLCAmdmFsKTsKKyAgZ192YWx1ZV91bnNldCAoJnZhbCk7CisKKyAgLyogVXBkYXRlIHRoZSBzcmMgY2FwcyBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlbSAqLworICBpZiAoc2VsZi0+c2lua2NhcHMpIHsKKyAgICBHc3RDYXBzICpzcmNjYXBzOworICAgIEdzdFN0cnVjdHVyZSAqczsKKworICAgIC8qIFRha2UgbG9jayB0byBtYWtlIHN1cmUgcHJvY2Vzc2luZyBmaW5pc2hlcyBmaXJzdCAqLworICAgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZi0+Y29sbGVjdCk7CisKKyAgICBzcmNjYXBzID0gZ3N0X2NhcHNfY29weSAoc2VsZi0+c2lua2NhcHMpOworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChzcmNjYXBzLCAwKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBzZWxmLT5jaGFubmVscywgTlVMTCk7CisgICAgZ3N0X2ludGVybGVhdmVfc2V0X2NoYW5uZWxfcG9zaXRpb25zIChzZWxmLCBzKTsKKworICAgIGdzdF9pbnRlcmxlYXZlX3NlbmRfc3RyZWFtX3N0YXJ0IChzZWxmKTsKKyAgICBnc3RfcGFkX3NldF9jYXBzIChzZWxmLT5zcmMsIHNyY2NhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzZWxmLT5jb2xsZWN0KTsKKyAgfQorCisgIHJldHVybiBuZXdfcGFkOworCisgIC8qIGVycm9ycyAqLworbm90X3NpbmtfcGFkOgorICB7CisgICAgZ193YXJuaW5nICgiaW50ZXJsZWF2ZTogcmVxdWVzdGVkIG5ldyBwYWQgdGhhdCBpcyBub3QgYSBTSU5LIHBhZFxuIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2NvdWxkX25vdF9hZGQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiY291bGQgbm90IGFkZCBwYWQgJXMiLCBHU1RfUEFEX05BTUUgKG5ld19wYWQpKTsKKyAgICBnc3RfY29sbGVjdF9wYWRzX3JlbW92ZV9wYWQgKHNlbGYtPmNvbGxlY3QsIG5ld19wYWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKG5ld19wYWQpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaW50ZXJsZWF2ZV9yZWxlYXNlX3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIHBhZCkKK3sKKyAgR3N0SW50ZXJsZWF2ZSAqc2VsZiA9IEdTVF9JTlRFUkxFQVZFIChlbGVtZW50KTsKKyAgR0xpc3QgKmw7CisgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHBvc2l0aW9uOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19JTlRFUkxFQVZFX1BBRCAocGFkKSk7CisKKyAgLyogVGFrZSBsb2NrIHRvIG1ha2Ugc3VyZSB3ZSdyZSBub3QgY2hhbmdpbmcgdGhpcyB3aGVuIHByb2Nlc3NpbmcgYnVmZmVycyAqLworICBHU1RfT0JKRUNUX0xPQ0sgKHNlbGYtPmNvbGxlY3QpOworCisgIGdfYXRvbWljX2ludF9hZGQgKCZzZWxmLT5jaGFubmVscywgLTEpOworCisgIGlmIChnc3RfcGFkX2hhc19jdXJyZW50X2NhcHMgKHBhZCkpCisgICAgZ19hdG9taWNfaW50X2FkZCAoJnNlbGYtPmNvbmZpZ3VyZWRfc2lua3BhZHNfY291bnRlciwgLTEpOworCisgIHBvc2l0aW9uID0gR1NUX0lOVEVSTEVBVkVfUEFEX0NBU1QgKHBhZCktPmNoYW5uZWw7CisgIGdfdmFsdWVfYXJyYXlfcmVtb3ZlIChzZWxmLT5pbnB1dF9jaGFubmVsX3Bvc2l0aW9ucywgcG9zaXRpb24pOworCisgIC8qIFVwZGF0ZSBjaGFubmVsIG51bWJlcnMgKi8KKyAgR1NUX09CSkVDVF9MT0NLIChzZWxmKTsKKyAgZm9yIChsID0gR1NUX0VMRU1FTlRfQ0FTVCAoc2VsZiktPnNpbmtwYWRzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KSB7CisgICAgR3N0SW50ZXJsZWF2ZVBhZCAqaXBhZCA9IEdTVF9JTlRFUkxFQVZFX1BBRCAobC0+ZGF0YSk7CisKKyAgICBpZiAoR1NUX0lOVEVSTEVBVkVfUEFEX0NBU1QgKHBhZCktPmNoYW5uZWwgPCBpcGFkLT5jaGFubmVsKQorICAgICAgaXBhZC0+Y2hhbm5lbC0tOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzZWxmKTsKKworICAvKiBVcGRhdGUgdGhlIHNyYyBjYXBzIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGVtICovCisgIGlmIChzZWxmLT5zaW5rY2FwcykgeworICAgIGlmIChzZWxmLT5jaGFubmVscyA+IDApIHsKKyAgICAgIEdzdENhcHMgKnNyY2NhcHM7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgICAgIHNyY2NhcHMgPSBnc3RfY2Fwc19jb3B5IChzZWxmLT5zaW5rY2Fwcyk7CisgICAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoc3JjY2FwcywgMCk7CisKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBzZWxmLT5jaGFubmVscywgTlVMTCk7CisgICAgICBnc3RfaW50ZXJsZWF2ZV9zZXRfY2hhbm5lbF9wb3NpdGlvbnMgKHNlbGYsIHMpOworCisgICAgICBnc3RfaW50ZXJsZWF2ZV9zZW5kX3N0cmVhbV9zdGFydCAoc2VsZik7CisgICAgICBnc3RfcGFkX3NldF9jYXBzIChzZWxmLT5zcmMsIHNyY2NhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworICAgIH0gZWxzZSB7CisgICAgICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+c2lua2NhcHMsIE5VTEwpOworICAgIH0KKyAgfQorCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzZWxmLT5jb2xsZWN0KTsKKworICBnc3RfY29sbGVjdF9wYWRzX3JlbW92ZV9wYWQgKHNlbGYtPmNvbGxlY3QsIHBhZCk7CisgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKGVsZW1lbnQsIHBhZCk7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2ludGVybGVhdmVfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0SW50ZXJsZWF2ZSAqc2VsZjsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHNlbGYgPSBHU1RfSU5URVJMRUFWRSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgc2VsZi0+dGltZXN0YW1wID0gMDsKKyAgICAgIHNlbGYtPm9mZnNldCA9IDA7CisgICAgICBnc3RfZXZlbnRfcmVwbGFjZSAoJnNlbGYtPnBlbmRpbmdfc2VnbWVudCwgTlVMTCk7CisgICAgICBzZWxmLT5zZW5kX3N0cmVhbV9zdGFydCA9IFRSVUU7CisgICAgICBnc3RfY29sbGVjdF9wYWRzX3N0YXJ0IChzZWxmLT5jb2xsZWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUExBWUlORzoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIFN0b3AgYmVmb3JlIGNhbGxpbmcgdGhlIHBhcmVudCdzIHN0YXRlIGNoYW5nZSBmdW5jdGlvbiBhcworICAgKiBHc3RDb2xsZWN0UGFkcyBtaWdodCB0YWtlIGxvY2tzIGFuZCB3ZSB3b3VsZCBkZWFkbG9jayBpbiB0aGF0CisgICAqIGNhc2UKKyAgICovCisgIGlmICh0cmFuc2l0aW9uID09IEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZKQorICAgIGdzdF9jb2xsZWN0X3BhZHNfc3RvcCAoc2VsZi0+Y29sbGVjdCk7CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9jYXBzX3JlcGxhY2UgKCZzZWxmLT5zaW5rY2FwcywgTlVMTCk7CisgICAgICBnc3RfZXZlbnRfcmVwbGFjZSAoJnNlbGYtPnBlbmRpbmdfc2VnbWVudCwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitfX3JlbW92ZV9jaGFubmVscyAoR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgZ2ludCBpLCBzaXplOworCisgIHNpemUgPSBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSk7CisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJjaGFubmVsLW1hc2siKTsKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAocywgImNoYW5uZWxzIik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK19fc2V0X2NoYW5uZWxzIChHc3RDYXBzICogY2FwcywgZ2ludCBjaGFubmVscykKK3sKKyAgR3N0U3RydWN0dXJlICpzOworICBnaW50IGksIHNpemU7CisKKyAgc2l6ZSA9IGdzdF9jYXBzX2dldF9zaXplIChjYXBzKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKyAgICBpZiAoY2hhbm5lbHMgPiAwKQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGNoYW5uZWxzLCBOVUxMKTsKKyAgICBlbHNlCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgImNoYW5uZWxzIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCBHX01BWElOVCwgTlVMTCk7CisgIH0KK30KKworLyogd2UgY2FuIG9ubHkgYWNjZXB0IGNhcHMgdGhhdCB3ZSBhbmQgZG93bnN0cmVhbSBjYW4gaGFuZGxlLiAqLworc3RhdGljIEdzdENhcHMgKgorZ3N0X2ludGVybGVhdmVfc2lua19nZXRjYXBzIChHc3RQYWQgKiBwYWQsIEdzdEludGVybGVhdmUgKiBzZWxmLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnJlc3VsdCwgKnBlZXJjYXBzLCAqc2lua2NhcHM7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzZWxmKTsKKworICAvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgY2FwcyBvbiBvbmUgb2YgdGhlIHNpbmsgcGFkcyByZXR1cm4gdGhlbSAqLworICBpZiAoc2VsZi0+c2lua2NhcHMpIHsKKyAgICByZXN1bHQgPSBnc3RfY2Fwc19jb3B5IChzZWxmLT5zaW5rY2Fwcyk7CisgIH0gZWxzZSB7CisgICAgLyogZ2V0IHRoZSBkb3duc3RyZWFtIHBvc3NpYmxlIGNhcHMgKi8KKyAgICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChzZWxmLT5zcmMsIE5VTEwpOworCisgICAgLyogZ2V0IHRoZSBhbGxvd2VkIGNhcHMgb24gdGhpcyBzaW5rcGFkICovCisgICAgc2lua2NhcHMgPSBnc3RfY2Fwc19jb3B5IChnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAocGFkKSk7CisgICAgX19yZW1vdmVfY2hhbm5lbHMgKHNpbmtjYXBzKTsKKyAgICBpZiAocGVlcmNhcHMpIHsKKyAgICAgIHBlZXJjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocGVlcmNhcHMpOworICAgICAgX19yZW1vdmVfY2hhbm5lbHMgKHBlZXJjYXBzKTsKKyAgICAgIC8qIGlmIHRoZSBwZWVyIGhhcyBjYXBzLCBpbnRlcnNlY3QgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgImludGVyc2VjdGluZyBwZWVyIGFuZCB0ZW1wbGF0ZSBjYXBzIik7CisgICAgICByZXN1bHQgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHBlZXJjYXBzLCBzaW5rY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHNpbmtjYXBzKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogdGhlIHBlZXIgaGFzIG5vIGNhcHMgKG9yIHRoZXJlIGlzIG5vIHBlZXIpLCBqdXN0IHVzZSB0aGUgYWxsb3dlZCBjYXBzCisgICAgICAgKiBvZiB0aGlzIHNpbmtwYWQuICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJubyBwZWVyIGNhcHMsIHVzaW5nIHNpbmtjYXBzIik7CisgICAgICByZXN1bHQgPSBzaW5rY2FwczsKKyAgICB9CisgICAgX19zZXRfY2hhbm5lbHMgKHJlc3VsdCwgMSk7CisgIH0KKworICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7CisKKyAgaWYgKGZpbHRlciAhPSBOVUxMKSB7CisgICAgR3N0Q2FwcyAqY2FwcyA9IHJlc3VsdDsKKworICAgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJpbnRlcnNlY3RpbmcgZmlsdGVyIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQgIiB3aXRoICIKKyAgICAgICAgInByZWxpbWluYXJ5IHJlc3VsdCAlIiBHU1RfUFRSX0ZPUk1BVCwgZmlsdGVyLCBjYXBzKTsKKworICAgIHJlc3VsdCA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIGNhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiUmV0dXJuaW5nIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIHJlc3VsdCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9pbnRlcmxlYXZlX3NldF9wcm9jZXNzX2Z1bmN0aW9uIChHc3RJbnRlcmxlYXZlICogc2VsZikKK3sKKyAgc3dpdGNoIChzZWxmLT53aWR0aCkgeworICAgIGNhc2UgODoKKyAgICAgIHNlbGYtPmZ1bmMgPSAoR3N0SW50ZXJsZWF2ZUZ1bmMpIGludGVybGVhdmVfODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICBzZWxmLT5mdW5jID0gKEdzdEludGVybGVhdmVGdW5jKSBpbnRlcmxlYXZlXzE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoKKyAgICAgIHNlbGYtPmZ1bmMgPSAoR3N0SW50ZXJsZWF2ZUZ1bmMpIGludGVybGVhdmVfMjQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMyOgorICAgICAgc2VsZi0+ZnVuYyA9IChHc3RJbnRlcmxlYXZlRnVuYykgaW50ZXJsZWF2ZV8zMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjQ6CisgICAgICBzZWxmLT5mdW5jID0gKEdzdEludGVybGVhdmVGdW5jKSBpbnRlcmxlYXZlXzY0OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfaW50ZXJsZWF2ZV9zaW5rX3NldGNhcHMgKEdzdEludGVybGVhdmUgKiBzZWxmLCBHc3RQYWQgKiBwYWQsCisgICAgY29uc3QgR3N0Q2FwcyAqIGNhcHMsIGNvbnN0IEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfSU5URVJMRUFWRV9QQUQgKHBhZCksIEZBTFNFKTsKKworICAvKiBUT0RPOiBoYW5kbGUgY2FwcyBjaGFuZ2VzICovCisgIGlmIChzZWxmLT5zaW5rY2FwcyAmJiAhZ3N0X2NhcHNfaXNfc3Vic2V0IChjYXBzLCBzZWxmLT5zaW5rY2FwcykpIHsKKyAgICBnb3RvIGNhbm5vdF9jaGFuZ2VfY2FwczsKKyAgfSBlbHNlIHsKKyAgICBHc3RDYXBzICpzcmNjYXBzOworICAgIEdzdFN0cnVjdHVyZSAqczsKKyAgICBnYm9vbGVhbiByZXM7CisKKyAgICBzZWxmLT53aWR0aCA9IEdTVF9BVURJT19JTkZPX1dJRFRIIChpbmZvKTsKKyAgICBzZWxmLT5yYXRlID0gR1NUX0FVRElPX0lORk9fUkFURSAoaW5mbyk7CisKKyAgICBnc3RfaW50ZXJsZWF2ZV9zZXRfcHJvY2Vzc19mdW5jdGlvbiAoc2VsZik7CisKKyAgICBzcmNjYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHNyY2NhcHMsIDApOworCisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJjaGFubmVsLW1hc2siKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBzZWxmLT5jaGFubmVscywgImxheW91dCIsCisgICAgICAgIEdfVFlQRV9TVFJJTkcsICJpbnRlcmxlYXZlZCIsIE5VTEwpOworICAgIGdzdF9pbnRlcmxlYXZlX3NldF9jaGFubmVsX3Bvc2l0aW9ucyAoc2VsZiwgcyk7CisKKyAgICBnc3RfaW50ZXJsZWF2ZV9zZW5kX3N0cmVhbV9zdGFydCAoc2VsZik7CisgICAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoc2VsZi0+c3JjLCBzcmNjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgICBpZiAoIXJlcykKKyAgICAgIGdvdG8gc3JjX2RpZF9ub3RfYWNjZXB0OworICB9CisKKyAgaWYgKCFzZWxmLT5zaW5rY2FwcykgeworICAgIEdzdENhcHMgKnNpbmtjYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgICAgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoc2lua2NhcHMsIDApOworCisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJjaGFubmVsLW1hc2siKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJzZXR0aW5nIHNpbmtjYXBzICUiIEdTVF9QVFJfRk9STUFULCBzaW5rY2Fwcyk7CisKKyAgICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+c2lua2NhcHMsIHNpbmtjYXBzKTsKKworICAgIGdzdF9jYXBzX3VucmVmIChzaW5rY2Fwcyk7CisgIH0KKworICByZXR1cm4gVFJVRTsKKworY2Fubm90X2NoYW5nZV9jYXBzOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiY2FwcyBvZiAlIiBHU1RfUFRSX0ZPUk1BVCAiIGFscmVhZHkgc2V0LCBjYW4ndCAiCisgICAgICAgICJjaGFuZ2UiLCBzZWxmLT5zaW5rY2Fwcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitzcmNfZGlkX25vdF9hY2NlcHQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNlbGYsICJzcmMgZGlkIG5vdCBhY2NlcHQgc2V0Y2FwcygpIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ludGVybGVhdmVfc2lua19ldmVudCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLCBHc3RDb2xsZWN0RGF0YSAqIGRhdGEsCisgICAgR3N0RXZlbnQgKiBldmVudCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RJbnRlcmxlYXZlICpzZWxmID0gR1NUX0lOVEVSTEVBVkUgKHVzZXJfZGF0YSk7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgR1NUX0RFQlVHICgiR290ICVzIGV2ZW50IG9uIHBhZCAlczolcyIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSwKKyAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAoZGF0YS0+cGFkKSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZik7CisgICAgICBnc3RfZXZlbnRfcmVwbGFjZSAoJnNlbGYtPnBlbmRpbmdfc2VnbWVudCwgTlVMTCk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgIHsKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZik7CisgICAgICBnc3RfZXZlbnRfcmVwbGFjZSAoJnNlbGYtPnBlbmRpbmdfc2VnbWVudCwgZXZlbnQpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNlbGYpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKyAgICAgIEdzdEF1ZGlvSW5mbyBpbmZvOworICAgICAgR1ZhbHVlICp2YWw7CisgICAgICBndWludCBjaGFubmVsOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfY2FwcyAoZXZlbnQsICZjYXBzKTsKKworICAgICAgaWYgKCFnc3RfYXVkaW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNlbGYsICJpbnZhbGlkIHNpbmsgY2FwcyIpOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgZXZlbnQgPSBOVUxMOworICAgICAgICByZXQgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChzZWxmLT5jaGFubmVsX3Bvc2l0aW9uc19mcm9tX2lucHV0CisgICAgICAgICAgJiYgR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZpbmZvKSA9PSAxKSB7CisgICAgICAgIGNoYW5uZWwgPSBHU1RfSU5URVJMRUFWRV9QQURfQ0FTVCAoZGF0YS0+cGFkKS0+Y2hhbm5lbDsKKyAgICAgICAgdmFsID0gZ192YWx1ZV9hcnJheV9nZXRfbnRoIChzZWxmLT5pbnB1dF9jaGFubmVsX3Bvc2l0aW9ucywgY2hhbm5lbCk7CisgICAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbCwgR1NUX0FVRElPX0lORk9fUE9TSVRJT04gKCZpbmZvLCAwKSk7CisgICAgICB9CisKKyAgICAgIGlmICghZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChkYXRhLT5wYWQpKQorICAgICAgICBnX2F0b21pY19pbnRfYWRkICgmc2VsZi0+Y29uZmlndXJlZF9zaW5rcGFkc19jb3VudGVyLCAxKTsKKworICAgICAgLyogTGFzdCBjYXBzIHRoYXQgYXJlIHNldCBvbiBhIHNpbmsgcGFkIGFyZSB1c2VkIGFzIG91dHB1dCBjYXBzICovCisgICAgICBpZiAoZ19hdG9taWNfaW50X2dldCAoJnNlbGYtPmNvbmZpZ3VyZWRfc2lua3BhZHNfY291bnRlcikgPT0KKyAgICAgICAgICBzZWxmLT5jaGFubmVscykgeworICAgICAgICByZXQgPSBnc3RfaW50ZXJsZWF2ZV9zaW5rX3NldGNhcHMgKHNlbGYsIGRhdGEtPnBhZCwgY2FwcywgJmluZm8pOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgZXZlbnQgPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX1RBRzoKKyAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKHNlbGYsICJGSVhNRTogbWVyZ2UgdGFncyBhbmQgc2VuZCBhZnRlciBzdHJlYW0tc3RhcnQiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIG5vdyBHc3RDb2xsZWN0UGFkcyBjYW4gdGFrZSBjYXJlIG9mIHRoZSByZXN0LCBlLmcuIEVPUyAqLworICBpZiAoZXZlbnQgIT0gTlVMTCkKKyAgICByZXR1cm4gZ3N0X2NvbGxlY3RfcGFkc19ldmVudF9kZWZhdWx0IChwYWRzLCBkYXRhLCBldmVudCwgRkFMU0UpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ludGVybGVhdmVfc2lua19xdWVyeSAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLAorICAgIEdzdENvbGxlY3REYXRhICogZGF0YSwgR3N0UXVlcnkgKiBxdWVyeSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RJbnRlcmxlYXZlICpzZWxmID0gR1NUX0lOVEVSTEVBVkUgKHVzZXJfZGF0YSk7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgR1NUX0RFQlVHICgiR290ICVzIHF1ZXJ5IG9uIHBhZCAlczolcyIsIEdTVF9RVUVSWV9UWVBFX05BTUUgKHF1ZXJ5KSwKKyAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAoZGF0YS0+cGFkKSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpmaWx0ZXIsICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZmaWx0ZXIpOworICAgICAgY2FwcyA9IGdzdF9pbnRlcmxlYXZlX3NpbmtfZ2V0Y2FwcyAoZGF0YS0+cGFkLCBzZWxmLCBmaWx0ZXIpOworICAgICAgZ3N0X3F1ZXJ5X3NldF9jYXBzX3Jlc3VsdCAocXVlcnksIGNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gZ3N0X2NvbGxlY3RfcGFkc19xdWVyeV9kZWZhdWx0IChwYWRzLCBkYXRhLCBxdWVyeSwgRkFMU0UpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9pbnRlcmxlYXZlX3NyY19xdWVyeV9kdXJhdGlvbiAoR3N0SW50ZXJsZWF2ZSAqIHNlbGYsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIGdpbnQ2NCBtYXg7CisgIGdib29sZWFuIHJlczsKKyAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgR3N0SXRlcmF0b3IgKml0OworICBnYm9vbGVhbiBkb25lOworCisgIC8qIHBhcnNlIGZvcm1hdCAqLworICBnc3RfcXVlcnlfcGFyc2VfZHVyYXRpb24gKHF1ZXJ5LCAmZm9ybWF0LCBOVUxMKTsKKworICBtYXggPSAtMTsKKyAgcmVzID0gVFJVRTsKKyAgZG9uZSA9IEZBTFNFOworCisgIC8qIFRha2UgbWF4aW11bSBvZiBhbGwgZHVyYXRpb25zICovCisgIGl0ID0gZ3N0X2VsZW1lbnRfaXRlcmF0ZV9zaW5rX3BhZHMgKEdTVF9FTEVNRU5UX0NBU1QgKHNlbGYpKTsKKyAgd2hpbGUgKCFkb25lKSB7CisgICAgR3N0SXRlcmF0b3JSZXN1bHQgaXJlczsKKworICAgIEdWYWx1ZSBpdGVtID0geyAwLCB9OworCisgICAgaXJlcyA9IGdzdF9pdGVyYXRvcl9uZXh0IChpdCwgJml0ZW0pOworICAgIHN3aXRjaCAoaXJlcykgeworICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfRE9ORToKKyAgICAgICAgZG9uZSA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfT0s6CisgICAgICB7CisgICAgICAgIEdzdFBhZCAqcGFkID0gR1NUX1BBRF9DQVNUIChnX3ZhbHVlX2R1cF9vYmplY3QgKCZpdGVtKSk7CisKKyAgICAgICAgZ2ludDY0IGR1cmF0aW9uOworCisgICAgICAgIC8qIGFzayBzaW5rIHBlZXIgZm9yIGR1cmF0aW9uICovCisgICAgICAgIHJlcyAmPSBnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKHBhZCwgZm9ybWF0LCAmZHVyYXRpb24pOworICAgICAgICAvKiB0YWtlIG1heCBmcm9tIGFsbCB2YWxpZCByZXR1cm4gdmFsdWVzICovCisgICAgICAgIGlmIChyZXMpIHsKKyAgICAgICAgICAvKiB2YWxpZCB1bmtub3duIGxlbmd0aCwgc3RvcCBzZWFyY2hpbmcgKi8KKyAgICAgICAgICBpZiAoZHVyYXRpb24gPT0gLTEpIHsKKyAgICAgICAgICAgIG1heCA9IGR1cmF0aW9uOworICAgICAgICAgICAgZG9uZSA9IFRSVUU7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIGVsc2Ugc2VlIGlmIGJpZ2dlciB0aGFuIGN1cnJlbnQgbWF4ICovCisgICAgICAgICAgZWxzZSBpZiAoZHVyYXRpb24gPiBtYXgpCisgICAgICAgICAgICBtYXggPSBkdXJhdGlvbjsKKyAgICAgICAgfQorICAgICAgICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmaXRlbSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfUkVTWU5DOgorICAgICAgICBtYXggPSAtMTsKKyAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgICAgZ3N0X2l0ZXJhdG9yX3Jlc3luYyAoaXQpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGdzdF9pdGVyYXRvcl9mcmVlIChpdCk7CisKKyAgaWYgKHJlcykgeworICAgIC8qIElmIGluIGJ5dGVzIGZvcm1hdCB3ZSBoYXZlIHRvIG11bHRpcGx5IHdpdGggdGhlIG51bWJlciBvZiBjaGFubmVscworICAgICAqIHRvIGdldCB0aGUgY29ycmVjdCByZXN1bHRzLiBBbGwgb3RoZXIgZm9ybWF0cyBzaG91bGQgYmUgZmluZSAqLworICAgIGlmIChmb3JtYXQgPT0gR1NUX0ZPUk1BVF9CWVRFUyAmJiBtYXggIT0gLTEpCisgICAgICBtYXggKj0gc2VsZi0+Y2hhbm5lbHM7CisKKyAgICAvKiBhbmQgc3RvcmUgdGhlIG1heCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJUb3RhbCBkdXJhdGlvbiBpbiBmb3JtYXQgJXM6ICUiCisgICAgICAgIEdTVF9USU1FX0ZPUk1BVCwgZ3N0X2Zvcm1hdF9nZXRfbmFtZSAoZm9ybWF0KSwgR1NUX1RJTUVfQVJHUyAobWF4KSk7CisgICAgZ3N0X3F1ZXJ5X3NldF9kdXJhdGlvbiAocXVlcnksIGZvcm1hdCwgbWF4KTsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2ludGVybGVhdmVfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0SW50ZXJsZWF2ZSAqc2VsZiA9IEdTVF9JTlRFUkxFQVZFIChwYXJlbnQpOworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9QT1NJVElPTjoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfcG9zaXRpb24gKHF1ZXJ5LCAmZm9ybWF0LCBOVUxMKTsKKworICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICAgICAgLyogRklYTUUsIGJyaW5nIHRvIHN0cmVhbSB0aW1lLCBtaWdodCBiZSB0cmlja3kgKi8KKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgZm9ybWF0LCBzZWxmLT50aW1lc3RhbXApOworICAgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9CWVRFUzoKKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgZm9ybWF0LAorICAgICAgICAgICAgICBzZWxmLT5vZmZzZXQgKiBzZWxmLT5jaGFubmVscyAqIHNlbGYtPndpZHRoKTsKKyAgICAgICAgICByZXMgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfREVGQVVMVDoKKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgZm9ybWF0LCBzZWxmLT5vZmZzZXQpOworICAgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfRFVSQVRJT046CisgICAgICByZXMgPSBnc3RfaW50ZXJsZWF2ZV9zcmNfcXVlcnlfZHVyYXRpb24gKHNlbGYsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBGSVhNRSwgbmVlZHMgYSBjdXN0b20gcXVlcnkgaGFuZGxlciBiZWNhdXNlIHdlIGhhdmUgbXVsdGlwbGUKKyAgICAgICAqIHNpbmtwYWRzICovCisgICAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZm9yd2FyZF9ldmVudF9mdW5jIChjb25zdCBHVmFsdWUgKiBpdGVtLCBHVmFsdWUgKiByZXQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFBhZCAqcGFkID0gR1NUX1BBRF9DQVNUIChnX3ZhbHVlX2R1cF9vYmplY3QgKGl0ZW0pKTsKKyAgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiQWJvdXQgdG8gc2VuZCBldmVudCAlcyIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisgIGlmICghZ3N0X3BhZF9wdXNoX2V2ZW50IChwYWQsIGV2ZW50KSkgeworICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHJldCwgRkFMU0UpOworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFkLCAiU2VuZGluZyBldmVudCAgJXAgKCVzKSBmYWlsZWQuIiwKKyAgICAgICAgZXZlbnQsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisgIH0gZWxzZSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIlNlbnQgZXZlbnQgICVwICglcykuIiwKKyAgICAgICAgZXZlbnQsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisgIH0KKyAgZ3N0X29iamVjdF91bnJlZiAocGFkKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZm9yd2FyZF9ldmVudCAoR3N0SW50ZXJsZWF2ZSAqIHNlbGYsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdEl0ZXJhdG9yICppdDsKKyAgR1ZhbHVlIHZyZXQgPSB7IDAgfTsKKworICBHU1RfTE9HX09CSkVDVCAoc2VsZiwgIkZvcndhcmRpbmcgZXZlbnQgJXAgKCVzKSIsIGV2ZW50LAorICAgICAgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBnX3ZhbHVlX2luaXQgKCZ2cmV0LCBHX1RZUEVfQk9PTEVBTik7CisgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKCZ2cmV0LCBUUlVFKTsKKyAgaXQgPSBnc3RfZWxlbWVudF9pdGVyYXRlX3NpbmtfcGFkcyAoR1NUX0VMRU1FTlRfQ0FTVCAoc2VsZikpOworICBnc3RfaXRlcmF0b3JfZm9sZCAoaXQsIChHc3RJdGVyYXRvckZvbGRGdW5jdGlvbikgZm9yd2FyZF9ldmVudF9mdW5jLCAmdnJldCwKKyAgICAgIGV2ZW50KTsKKyAgZ3N0X2l0ZXJhdG9yX2ZyZWUgKGl0KTsKKyAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisKKyAgcmV0dXJuIGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKCZ2cmV0KTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9pbnRlcmxlYXZlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdEludGVybGVhdmUgKnNlbGYgPSBHU1RfSU5URVJMRUFWRSAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmVzdWx0OworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1FPUzoKKyAgICAgIC8qIFFvUyBtaWdodCBiZSB0cmlja3kgKi8KKyAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICB7CisgICAgICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgTlVMTCwgTlVMTCwgJmZsYWdzLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICAgICAgLyogY2hlY2sgaWYgd2UgYXJlIGZsdXNoaW5nICovCisgICAgICBpZiAoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0ZMVVNIKSB7CisgICAgICAgIC8qIG1ha2Ugc3VyZSB3ZSBhY2NlcHQgbm90aGluZyBhbnltb3JlIGFuZCByZXR1cm4gV1JPTkdfU1RBVEUgKi8KKyAgICAgICAgZ3N0X2NvbGxlY3RfcGFkc19zZXRfZmx1c2hpbmcgKHNlbGYtPmNvbGxlY3QsIFRSVUUpOworCisgICAgICAgIC8qIGZsdXNoaW5nIHNlZWssIHN0YXJ0IGZsdXNoIGRvd25zdHJlYW0sIHRoZSBmbHVzaCB3aWxsIGJlIGRvbmUKKyAgICAgICAgICogd2hlbiBhbGwgcGFkcyByZWNlaXZlZCBhIEZMVVNIX1NUT1AuICovCisgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc2VsZi0+c3JjLCBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0YXJ0ICgpKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCA9IGZvcndhcmRfZXZlbnQgKHNlbGYsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9OQVZJR0FUSU9OOgorICAgICAgLyogbmF2aWdhdGlvbiBpcyByYXRoZXIgcG9pbnRsZXNzLiAqLworICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyoganVzdCBmb3J3YXJkIHRoZSByZXN0IGZvciBub3cgKi8KKyAgICAgIHJlc3VsdCA9IGZvcndhcmRfZXZlbnQgKHNlbGYsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9pbnRlcmxlYXZlX2NvbGxlY3RlZCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLCBHc3RJbnRlcmxlYXZlICogc2VsZikKK3sKKyAgZ3VpbnQgc2l6ZTsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHU0xpc3QgKmNvbGxlY3RlZDsKKyAgZ3VpbnQgbnNhbXBsZXM7CisgIGd1aW50IG5jb2xsZWN0ZWQgPSAwOworICBnYm9vbGVhbiBlbXB0eSA9IFRSVUU7CisgIGdpbnQgd2lkdGggPSBzZWxmLT53aWR0aCAvIDg7CisgIEdzdE1hcEluZm8gd3JpdGVfaW5mbzsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCA9IC0xOworCisgIHNpemUgPSBnc3RfY29sbGVjdF9wYWRzX2F2YWlsYWJsZSAocGFkcyk7CisgIGlmIChzaXplID09IDApCisgICAgZ290byBlb3M7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlbGYtPmZ1bmMgIT0gTlVMTCwgR1NUX0ZMT1dfTk9UX05FR09USUFURUQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2VsZi0+d2lkdGggPiAwLCBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzZWxmLT5jaGFubmVscyA+IDAsIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNlbGYtPnJhdGUgPiAwLCBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRCk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNpemUgJSB3aWR0aCA9PSAwLCBHU1RfRkxPV19FUlJPUik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlN0YXJ0aW5nIHRvIGNvbGxlY3QgJXUgYnl0ZXMgZnJvbSAlZCBjaGFubmVscyIsIHNpemUsCisgICAgICBzZWxmLT5jaGFubmVscyk7CisKKyAgbnNhbXBsZXMgPSBzaXplIC8gd2lkdGg7CisKKyAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIHNpemUgKiBzZWxmLT5jaGFubmVscywgTlVMTCk7CisKKyAgaWYgKG91dGJ1ZiA9PSBOVUxMIHx8IGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZikgPCBzaXplICogc2VsZi0+Y2hhbm5lbHMpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWYpOworICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgfQorCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZ3cml0ZV9pbmZvLCBHU1RfTUFQX1dSSVRFKTsKKyAgbWVtc2V0ICh3cml0ZV9pbmZvLmRhdGEsIDAsIHNpemUgKiBzZWxmLT5jaGFubmVscyk7CisKKyAgZm9yIChjb2xsZWN0ZWQgPSBwYWRzLT5kYXRhOyBjb2xsZWN0ZWQgIT0gTlVMTDsgY29sbGVjdGVkID0gY29sbGVjdGVkLT5uZXh0KSB7CisgICAgR3N0Q29sbGVjdERhdGEgKmNkYXRhOworICAgIEdzdEJ1ZmZlciAqaW5idWY7CisgICAgZ3VpbnQ4ICpvdXRkYXRhOworICAgIEdzdE1hcEluZm8gaW5wdXRfaW5mbzsKKyAgICBnaW50IGNoYW5uZWw7CisKKyAgICBjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSBjb2xsZWN0ZWQtPmRhdGE7CisKKyAgICBpbmJ1ZiA9IGdzdF9jb2xsZWN0X3BhZHNfdGFrZV9idWZmZXIgKHBhZHMsIGNkYXRhLCBzaXplKTsKKyAgICBpZiAoaW5idWYgPT0gTlVMTCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoY2RhdGEtPnBhZCwgIk5vIGJ1ZmZlciBhdmFpbGFibGUiKTsKKyAgICAgIGdvdG8gbmV4dDsKKyAgICB9CisgICAgbmNvbGxlY3RlZCsrOworCisgICAgaWYgKHRpbWVzdGFtcCA9PSAtMSkKKyAgICAgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1Zik7CisKKyAgICBpZiAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoaW5idWYsIEdTVF9CVUZGRVJfRkxBR19HQVApKQorICAgICAgZ290byBuZXh0OworCisgICAgZW1wdHkgPSBGQUxTRTsKKyAgICBjaGFubmVsID0gR1NUX0lOVEVSTEVBVkVfUEFEX0NBU1QgKGNkYXRhLT5wYWQpLT5jaGFubmVsOworICAgIGlmIChzZWxmLT5jaGFubmVscyA8PSA2NCAmJiBzZWxmLT5jaGFubmVsX21hc2spIHsKKyAgICAgIGNoYW5uZWwgPSBzZWxmLT5kZWZhdWx0X2NoYW5uZWxzX29yZGVyaW5nX21hcFtjaGFubmVsXTsKKyAgICB9CisgICAgb3V0ZGF0YSA9IHdyaXRlX2luZm8uZGF0YSArIHdpZHRoICogY2hhbm5lbDsKKworICAgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZiwgJmlucHV0X2luZm8sIEdTVF9NQVBfUkVBRCk7CisgICAgc2VsZi0+ZnVuYyAob3V0ZGF0YSwgaW5wdXRfaW5mby5kYXRhLCBzZWxmLT5jaGFubmVscywgbnNhbXBsZXMpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmLCAmaW5wdXRfaW5mbyk7CisKKyAgbmV4dDoKKyAgICBpZiAoaW5idWYpCisgICAgICBnc3RfYnVmZmVyX3VucmVmIChpbmJ1Zik7CisgIH0KKworICBpZiAobmNvbGxlY3RlZCA9PSAwKSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmd3JpdGVfaW5mbyk7CisgICAgZ290byBlb3M7CisgIH0KKworICBHU1RfT0JKRUNUX0xPQ0sgKHNlbGYpOworICBpZiAoc2VsZi0+cGVuZGluZ19zZWdtZW50KSB7CisgICAgR3N0RXZlbnQgKmV2ZW50OworICAgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICAgIGV2ZW50ID0gc2VsZi0+cGVuZGluZ19zZWdtZW50OworICAgIHNlbGYtPnBlbmRpbmdfc2VnbWVudCA9IE5VTEw7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNlbGYpOworCisgICAgLyogY29udmVydCB0aGUgaW5wdXQgc2VnbWVudCB0byB0aW1lIG5vdyAqLworICAgIGdzdF9ldmVudF9jb3B5X3NlZ21lbnQgKGV2ZW50LCAmc2VnbWVudCk7CisKKyAgICBpZiAoc2VnbWVudC5mb3JtYXQgIT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKworICAgICAgLyogbm90IHRpbWUsIGNvbnZlcnQgKi8KKyAgICAgIHN3aXRjaCAoc2VnbWVudC5mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgICAgIHNlZ21lbnQuc3RhcnQgKj0gd2lkdGg7CisgICAgICAgICAgaWYgKHNlZ21lbnQuc3RvcCAhPSAtMSkKKyAgICAgICAgICAgIHNlZ21lbnQuc3RvcCAqPSB3aWR0aDsKKyAgICAgICAgICBpZiAoc2VnbWVudC5wb3NpdGlvbiAhPSAtMSkKKyAgICAgICAgICAgIHNlZ21lbnQucG9zaXRpb24gKj0gd2lkdGg7CisgICAgICAgICAgLyogZmFsbHRocm91Z2ggZm9yIHRoZSBzYW1wbGVzIGNhc2UgKi8KKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0RFRkFVTFQ6CisgICAgICAgICAgc2VnbWVudC5zdGFydCA9CisgICAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNlZ21lbnQuc3RhcnQsIEdTVF9TRUNPTkQsIHNlbGYtPnJhdGUpOworICAgICAgICAgIGlmIChzZWdtZW50LnN0b3AgIT0gLTEpCisgICAgICAgICAgICBzZWdtZW50LnN0b3AgPQorICAgICAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNlZ21lbnQuc3RvcCwgR1NUX1NFQ09ORCwKKyAgICAgICAgICAgICAgICBzZWxmLT5yYXRlKTsKKyAgICAgICAgICBpZiAoc2VnbWVudC5wb3NpdGlvbiAhPSAtMSkKKyAgICAgICAgICAgIHNlZ21lbnQucG9zaXRpb24gPQorICAgICAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNlZ21lbnQucG9zaXRpb24sIEdTVF9TRUNPTkQsCisgICAgICAgICAgICAgICAgc2VsZi0+cmF0ZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgR1NUX1dBUk5JTkcgKCJjYW4ndCBjb252ZXJ0IHNlZ21lbnQgdmFsdWVzIik7CisgICAgICAgICAgc2VnbWVudC5zdGFydCA9IDA7CisgICAgICAgICAgc2VnbWVudC5zdG9wID0gLTE7CisgICAgICAgICAgc2VnbWVudC5wb3NpdGlvbiA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpOworICAgIH0KKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbGYtPnNyYywgZXZlbnQpOworCisgICAgR1NUX09CSkVDVF9MT0NLIChzZWxmKTsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7CisKKyAgaWYgKHRpbWVzdGFtcCAhPSAtMSkgeworICAgIHNlbGYtPm9mZnNldCA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHRpbWVzdGFtcCwgc2VsZi0+cmF0ZSwKKyAgICAgICAgR1NUX1NFQ09ORCk7CisgICAgc2VsZi0+dGltZXN0YW1wID0gdGltZXN0YW1wOworICB9CisKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikgPSBzZWxmLT50aW1lc3RhbXA7CisgIEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpID0gc2VsZi0+b2Zmc2V0OworCisgIHNlbGYtPm9mZnNldCArPSBuc2FtcGxlczsKKyAgc2VsZi0+dGltZXN0YW1wID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoc2VsZi0+b2Zmc2V0LAorICAgICAgR1NUX1NFQ09ORCwgc2VsZi0+cmF0ZSk7CisKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9CisgICAgICBzZWxmLT50aW1lc3RhbXAgLSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKTsKKworICBpZiAoZW1wdHkpCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfR0FQKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWYsICZ3cml0ZV9pbmZvKTsKKworICBHU1RfTE9HX09CSkVDVCAoc2VsZiwgInB1c2hpbmcgb3V0YnVmLCB0aW1lc3RhbXAgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKG91dGJ1ZikpKTsKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChzZWxmLT5zcmMsIG91dGJ1Zik7CisKKyAgcmV0dXJuIHJldDsKKworZW9zOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIm5vIGRhdGEgYXZhaWxhYmxlLCBtdXN0IGJlIEVPUyIpOworICAgIGlmIChvdXRidWYpCisgICAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWYpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc2VsZi0+c3JjLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5oIGIvZ3N0L2ludGVybGVhdmUvaW50ZXJsZWF2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZWJlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaW50ZXJsZWF2ZS9pbnRlcmxlYXZlLmgKQEAgLTAsMCArMSw5MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAgICAgIDIwMDAgV2ltIFRheW1hbnMgPHd0YXlAY2hlbGxvLmJlPgorICogICAgICAgICAgICAgICAgICAgIDIwMDUgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDA3IEFuZHkgV2luZ28gPHdpbmdvIGF0IHBvYm94LmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDA4IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBpbnRlcmxlYXZlLmM6IGludGVybGVhdmUgc2FtcGxlcywgbW9zdGx5IGJhc2VkIG9uIGFkZGVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0lOVEVSTEVBVkVfSF9fCisjZGVmaW5lIF9fSU5URVJMRUFWRV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3Rjb2xsZWN0cGFkcy5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfSU5URVJMRUFWRSAgICAgICAgICAgIChnc3RfaW50ZXJsZWF2ZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfSU5URVJMRUFWRShvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0lOVEVSTEVBVkUsR3N0SW50ZXJsZWF2ZSkpCisjZGVmaW5lIEdTVF9JTlRFUkxFQVZFX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9JTlRFUkxFQVZFLEdzdEludGVybGVhdmVDbGFzcykpCisjZGVmaW5lIEdTVF9JTlRFUkxFQVZFX0dFVF9DTEFTUyhvYmopIFwKKyAgICAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLEdTVF9UWVBFX0lOVEVSTEVBVkUsR3N0SW50ZXJsZWF2ZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0lOVEVSTEVBVkUob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9JTlRFUkxFQVZFKSkKKyNkZWZpbmUgR1NUX0lTX0lOVEVSTEVBVkVfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0lOVEVSTEVBVkUpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0SW50ZXJsZWF2ZSBHc3RJbnRlcmxlYXZlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEludGVybGVhdmVDbGFzcyBHc3RJbnRlcmxlYXZlQ2xhc3M7CisKK3R5cGVkZWYgdm9pZCAoKkdzdEludGVybGVhdmVGdW5jKSAoZ3BvaW50ZXIgb3V0LCBncG9pbnRlciBpbiwgZ3VpbnQgc3RyaWRlLCBndWludCBuZnJhbWVzKTsKKworc3RydWN0IF9Hc3RJbnRlcmxlYXZlCit7CisgIEdzdEVsZW1lbnQgZWxlbWVudDsKKworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgR3N0Q29sbGVjdFBhZHMgKmNvbGxlY3Q7CisKKyAgZ2ludCBjaGFubmVsczsKKyAgZ2ludCBwYWRjb3VudGVyOworICBnaW50IHJhdGU7CisgIGdpbnQgd2lkdGg7CisKKyAgR1ZhbHVlQXJyYXkgKmNoYW5uZWxfcG9zaXRpb25zOworICBHVmFsdWVBcnJheSAqaW5wdXRfY2hhbm5lbF9wb3NpdGlvbnM7CisgIGdib29sZWFuIGNoYW5uZWxfcG9zaXRpb25zX2Zyb21faW5wdXQ7CisKKyAgZ2ludCBkZWZhdWx0X2NoYW5uZWxzX29yZGVyaW5nX21hcFs2NF07CisgIGd1aW50NjQgY2hhbm5lbF9tYXNrOworCisgIEdzdENhcHMgKnNpbmtjYXBzOworICBnaW50IGNvbmZpZ3VyZWRfc2lua3BhZHNfY291bnRlcjsKKworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworICBndWludDY0IG9mZnNldDsKKworICBHc3RFdmVudCAqcGVuZGluZ19zZWdtZW50OworCisgIEdzdEludGVybGVhdmVGdW5jIGZ1bmM7CisKKyAgR3N0UGFkICpzcmM7CisKKyAgZ2Jvb2xlYW4gc2VuZF9zdHJlYW1fc3RhcnQ7Cit9OworCitzdHJ1Y3QgX0dzdEludGVybGVhdmVDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2ludGVybGVhdmVfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19JTlRFUkxFQVZFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2ludGVybGVhdmUvbWVzb24uYnVpbGQgYi9nc3QvaW50ZXJsZWF2ZS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjhiMzZhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ludGVybGVhdmUvbWVzb24uYnVpbGQKQEAgLTAsMCArMSw4IEBACitnc3RpbnRlcmxlYXZlID0gbGlicmFyeSgnZ3N0aW50ZXJsZWF2ZScsCisgICdwbHVnaW4uYycsICdpbnRlcmxlYXZlLmMnLCAnZGVpbnRlcmxlYXZlLmMnLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnc3RhdWRpb19kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L2ludGVybGVhdmUvcGx1Z2luLmMgYi9nc3QvaW50ZXJsZWF2ZS9wbHVnaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWI3MjkwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2ludGVybGVhdmUvcGx1Z2luLmMKQEAgLTAsMCArMSw0MyBAQAorLyogR1N0cmVhbWVyIGludGVybGVhdmUgcGx1Z2luCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwNyBBbmR5IFdpbmdvIDx3aW5nbyBhdCBwb2JveC5jb20+CisgKgorICogcGx1Z2luLmM6IHRoZSBzdHVicyBmb3IgdGhlIGludGVybGVhdmUgcGx1Z2luCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAicGx1Z2luLmgiCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiaW50ZXJsZWF2ZSIsCisgICAgICAgICAgR1NUX1JBTktfTk9ORSwgZ3N0X2ludGVybGVhdmVfZ2V0X3R5cGUgKCkpIHx8CisgICAgICAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImRlaW50ZXJsZWF2ZSIsCisgICAgICAgICAgR1NUX1JBTktfTk9ORSwgZ3N0X2RlaW50ZXJsZWF2ZV9nZXRfdHlwZSAoKSkpCisgICAgcmV0dXJuIEZBTFNFOworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIGludGVybGVhdmUsCisgICAgIkF1ZGlvIGludGVybGVhdmVyL2RlaW50ZXJsZWF2ZXIiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9nc3QvaW50ZXJsZWF2ZS9wbHVnaW4uaCBiL2dzdC9pbnRlcmxlYXZlL3BsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NTY4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaW50ZXJsZWF2ZS9wbHVnaW4uaApAQCAtMCwwICsxLDMxIEBACisvKiBHU3RyZWFtZXIgaW50ZXJsZWF2ZSBwbHVnaW4KKyAqIENvcHlyaWdodCAoQykgMjAwNCwyMDA3IEFuZHkgV2luZ28gPHdpbmdvIGF0IHBvYm94LmNvbT4KKyAqCisgKiBwbHVnaW4uaDogdGhlIHN0dWJzIGZvciB0aGUgaW50ZXJsZWF2ZSBwbHVnaW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfUExVR0lOX0lOVEVSTEVBVkVfSF9fCisjZGVmaW5lIF9fR1NUX1BMVUdJTl9JTlRFUkxFQVZFX0hfXworCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAiaW50ZXJsZWF2ZS5oIgorI2luY2x1ZGUgImRlaW50ZXJsZWF2ZS5oIgorCisjZW5kaWYgLyogX19HU1RfUExVR0lOX0lOVEVSTEVBVkVfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L0dzdFFUTXV4LnBycyBiL2dzdC9pc29tcDQvR3N0UVRNdXgucHJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMWU2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L0dzdFFUTXV4LnBycwpAQCAtMCwwICsxLDYgQEAKK1tfcHJlc2V0c19dCit2ZXJzaW9uPTEuNi4wCitlbGVtZW50LW5hbWU9R3N0UVRNdXgKKworW1Byb2ZpbGUgWW91VHViZV0KK2Zhc3RzdGFydD10cnVlCmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L0xFR0FMIGIvZ3N0L2lzb21wNC9MRUdBTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWY2ZThmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9MRUdBTApAQCAtMCwwICsxLDEwIEBACitUaGlzIGlzIGEgZGVtdXhlciBzdXBwb3J0aW5nIGEgc3Vic2V0IG9mIHRoZSBRdWlja3RpbWUgdmlkZW8gY29udGFpbmVyCitmb3JtYXQgZGV2ZWxvcGVkIGJ5IEFwcGxlLiBBcHBsZSBhbmQgb3RoZXJzIGhhdmUgc29tZSBwYXRlbnRzIG9uCitzb21lIGZlYXR1cmVzIG9mIHRoZSBRdWlja3RpbWUgY29udGFpbmVyIGZvcm1hdCBpbiByZWdhcmRzIHRvIHRlY2hub2xvZ2llcworc3VjaCBhcyBRdWlja3RpbWVWUiBhbmQgUlRQIGhpbnRpbmcuIER1ZSB0byB0aGF0IGJlIGF3YXJlIHRoYXQgaWYgZXZlcgorc3VjaCBmZWF0dXJlcyBhcmUgYWRkZWQgdG8gdGhpcyBkZW11eGVyIGl0IHdvdWxkIG5lZWQgdG8gYmUgbW92ZWQgdG8gdGhlCistdWdseSBtb2R1bGUgb3IgdGhvc2UgZmVhdHVyZXMgbmVlZCB0byBjb21lIGFzIGFkZC1pbiBmdW5jdGlvbmFsaXR5IHN0b3JlZCBpbiAKK2Fub3RoZXIgbW9kdWxlLgorCitBcyB0aGUgcGx1Z2luIGlzIGFzIG9mIHRvZGF5J3MgZGF0ZSAoMTl0aCBvZiBKdW5lIDIwMDcpIGl0IGRvZXMgbm90IAordmlvbGF0ZSBhbnkgc29mdHdhcmUgcGF0ZW50cyB3ZSBrbm93IG9mLgpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9NYWtlZmlsZS5hbSBiL2dzdC9pc29tcDQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2Y2I0MgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NSBAQAorCitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3Rpc29tcDQubGEKKworbGliZ3N0aXNvbXA0X2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpCitsaWJnc3Rpc29tcDRfbGFfTElCQUREID0gXAorICAgICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSBcCisgICAgLWxnc3RyaWZmLUBHU1RfQVBJX1ZFUlNJT05AIFwKKyAgICAtbGdzdGF1ZGlvLUBHU1RfQVBJX1ZFUlNJT05AIFwKKyAgICAtbGdzdHZpZGVvLUBHU1RfQVBJX1ZFUlNJT05AIFwKKyAgICAtbGdzdHJ0cC1AR1NUX0FQSV9WRVJTSU9OQCBcCisgICAgLWxnc3R0YWctQEdTVF9BUElfVkVSU0lPTkAgXAorICAgIC1sZ3N0cGJ1dGlscy1AR1NUX0FQSV9WRVJTSU9OQCBcCisgICAgJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKFpMSUJfTElCUykKK2xpYmdzdGlzb21wNF9sYV9MREZMQUdTID0gJHtHU1RfUExVR0lOX0xERkxBR1N9CitsaWJnc3Rpc29tcDRfbGFfU09VUkNFUyA9IGlzb21wNC1wbHVnaW4uYyBnc3RydHB4cXRkZXBheS5jIFwKKwlxdGRlbXV4LmMgcXRkZW11eF90eXBlcy5jIHF0ZGVtdXhfZHVtcC5jIHF0ZGVtdXhfbGFuZy5jIFwKKwlnc3RxdG11eC5jIGdzdHF0bW9vdnJlY292ZXIuYyBhdG9tcy5jIGF0b21zcmVjb3ZlcnkuYyBkZXNjcmlwdG9ycy5jIFwKKwlwcm9wZXJ0aWVzLmMgZ3N0cXRtdXhtYXAuYyBnc3Rpc29mZi5jCisKK3ByZXNldGRpciA9ICQoZGF0YWRpcikvZ3N0cmVhbWVyLSQoR1NUX0FQSV9WRVJTSU9OKS9wcmVzZXRzCitwcmVzZXRfREFUQSA9IEdzdFFUTXV4LnBycworCitub2luc3RfSEVBREVSUyA9IFwKKwlxdGF0b21wYXJzZXIuaCAgIFwKKwlxdGRlbXV4LmggICAgICAgIFwKKwlxdGRlbXV4X3R5cGVzLmggIFwKKwlxdGRlbXV4X2RlYnVnLmggIFwKKwlxdGRlbXV4X2R1bXAuaCAgIFwKKwlxdGRlbXV4X2xhbmcuaCAgIFwKKwlxdHBhbGV0dGUuaCAgICAgIFwKKwlnc3RydHB4cXRkZXBheS5oIFwKKwlnc3RxdG11eC5oICAgICAgIFwKKwlnc3RxdG1vb3ZyZWNvdmVyLmggXAorCWF0b21zLmggICAgICAgICAgXAorCWF0b21zcmVjb3ZlcnkuaCAgXAorCWRlc2NyaXB0b3JzLmggICAgXAorCXByb3BlcnRpZXMuaCAgICAgXAorCWZvdXJjYy5oICAgICAgICAgXAorCWdzdGlzb2ZmLmggICAgICAgXAorCWdzdHF0bXV4bWFwLmgKKworRVhUUkFfRElTVCA9IFwKKwlnc3RxdG11eC1kb2MuYyBcCisJZ3N0cXRtdXgtZG9jLmggXAorCSQocHJlc2V0X0RBVEEpCmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L2F0b21zLmMgYi9nc3QvaXNvbXA0L2F0b21zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhNjkyNwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvYXRvbXMuYwpAQCAtMCwwICsxLDU1OTUgQEAKKy8qIFF1aWNrdGltZSBtdXhlciBwbHVnaW4gZm9yIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKgorICogVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIFNvdXJjZSBDb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlLgorICogU2VlIGZ1cnRoZXIgZXhwbGFuYXRpb24gYXR0YWNoZWQgaW4gTGljZW5zZSBTdGF0ZW1lbnQgKGRpc3RyaWJ1dGVkIGluIHRoZSBmaWxlCisgKiBMSUNFTlNFKS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImF0b21zLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJ5dGV3cml0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisvKgorICogQ3JlYXRlcyBhIG5ldyBBdG9tc0NvbnRleHQgZm9yIHRoZSBnaXZlbiBmbGF2b3IuCisgKi8KK0F0b21zQ29udGV4dCAqCithdG9tc19jb250ZXh0X25ldyAoQXRvbXNUcmVlRmxhdm9yIGZsYXZvcikKK3sKKyAgQXRvbXNDb250ZXh0ICpjb250ZXh0ID0gZ19uZXcwIChBdG9tc0NvbnRleHQsIDEpOworICBjb250ZXh0LT5mbGF2b3IgPSBmbGF2b3I7CisgIHJldHVybiBjb250ZXh0OworfQorCisvKgorICogRnJlZXMgYW4gQXRvbXNDb250ZXh0IGFuZCBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBpdAorICovCit2b2lkCithdG9tc19jb250ZXh0X2ZyZWUgKEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIGdfZnJlZSAoY29udGV4dCk7Cit9CisKKy8qIC0tIGNyZWF0aW9uLCBpbml0aWFsaXphdGlvbiwgY2xlYXIgYW5kIGZyZWUgZnVuY3Rpb25zIC0tICovCisKKyNkZWZpbmUgU0VDU19QRVJfREFZICgyNCAqIDYwICogNjApCisjZGVmaW5lIExFQVBfWUVBUlNfRlJPTV8xOTA0X1RPXzE5NzAgMTcKKworZ3VpbnQ2NAorYXRvbXNfZ2V0X2N1cnJlbnRfcXRfdGltZSAodm9pZCkKK3sKKyAgR1RpbWVWYWwgdGltZXZhbDsKKworICBnX2dldF9jdXJyZW50X3RpbWUgKCZ0aW1ldmFsKTsKKyAgLyogRklYTUUgdGhpcyBzaG91bGQgdXNlIFVUQyBjb29yZGluYXRlZCB0aW1lICovCisgIHJldHVybiB0aW1ldmFsLnR2X3NlYyArICgoKDE5NzAgLSAxOTA0KSAqIChndWludDY0KSAzNjUpICsKKyAgICAgIExFQVBfWUVBUlNfRlJPTV8xOTA0X1RPXzE5NzApICogU0VDU19QRVJfREFZOworfQorCitzdGF0aWMgdm9pZAorY29tbW9uX3RpbWVfaW5mb19pbml0IChUaW1lSW5mbyAqIHRpKQoreworICB0aS0+Y3JlYXRpb25fdGltZSA9IHRpLT5tb2RpZmljYXRpb25fdGltZSA9IGF0b21zX2dldF9jdXJyZW50X3F0X3RpbWUgKCk7CisgIHRpLT50aW1lc2NhbGUgPSAwOworICB0aS0+ZHVyYXRpb24gPSAwOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9oZWFkZXJfc2V0IChBdG9tICogaGVhZGVyLCBndWludDMyIGZvdXJjYywgZ2ludDMyIHNpemUsIGdpbnQ2NCBleHRfc2l6ZSkKK3sKKyAgaGVhZGVyLT50eXBlID0gZm91cmNjOworICBoZWFkZXItPnNpemUgPSBzaXplOworICBoZWFkZXItPmV4dGVuZGVkX3NpemUgPSBleHRfc2l6ZTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fY2xlYXIgKEF0b20gKiBhdG9tKQoreworfQorCitzdGF0aWMgdm9pZAorYXRvbV9mdWxsX2luaXQgKEF0b21GdWxsICogZnVsbCwgZ3VpbnQzMiBmb3VyY2MsIGdpbnQzMiBzaXplLCBnaW50NjQgZXh0X3NpemUsCisgICAgZ3VpbnQ4IHZlcnNpb24sIGd1aW50OCBmbGFnc1szXSkKK3sKKyAgYXRvbV9oZWFkZXJfc2V0ICgmKGZ1bGwtPmhlYWRlciksIGZvdXJjYywgc2l6ZSwgZXh0X3NpemUpOworICBmdWxsLT52ZXJzaW9uID0gdmVyc2lvbjsKKyAgZnVsbC0+ZmxhZ3NbMF0gPSBmbGFnc1swXTsKKyAgZnVsbC0+ZmxhZ3NbMV0gPSBmbGFnc1sxXTsKKyAgZnVsbC0+ZmxhZ3NbMl0gPSBmbGFnc1syXTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fZnVsbF9jbGVhciAoQXRvbUZ1bGwgKiBmdWxsKQoreworICBhdG9tX2NsZWFyICgmZnVsbC0+aGVhZGVyKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fZnVsbF9mcmVlIChBdG9tRnVsbCAqIGZ1bGwpCit7CisgIGF0b21fZnVsbF9jbGVhciAoZnVsbCk7CisgIGdfZnJlZSAoZnVsbCk7Cit9CisKK3N0YXRpYyBndWludDMyCithdG9tX2Z1bGxfZ2V0X2ZsYWdzX2FzX3VpbnQgKEF0b21GdWxsICogZnVsbCkKK3sKKyAgcmV0dXJuIGZ1bGwtPmZsYWdzWzBdIDw8IDE2IHwgZnVsbC0+ZmxhZ3NbMV0gPDwgOCB8IGZ1bGwtPmZsYWdzWzJdOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9mdWxsX3NldF9mbGFnc19hc191aW50IChBdG9tRnVsbCAqIGZ1bGwsIGd1aW50MzIgZmxhZ3NfYXNfdWludCkKK3sKKyAgZnVsbC0+ZmxhZ3NbMl0gPSBmbGFnc19hc191aW50ICYgMHhGRjsKKyAgZnVsbC0+ZmxhZ3NbMV0gPSAoZmxhZ3NfYXNfdWludCAmIDB4RkYwMCkgPj4gODsKKyAgZnVsbC0+ZmxhZ3NbMF0gPSAoZmxhZ3NfYXNfdWludCAmIDB4RkYwMDAwKSA+PiAxNjsKK30KKworc3RhdGljIEF0b21JbmZvICoKK2J1aWxkX2F0b21faW5mb193cmFwcGVyIChBdG9tICogYXRvbSwgZ3BvaW50ZXIgY29weV9mdW5jLCBncG9pbnRlciBmcmVlX2Z1bmMpCit7CisgIEF0b21JbmZvICppbmZvID0gTlVMTDsKKworICBpZiAoYXRvbSkgeworICAgIGluZm8gPSBnX25ldzAgKEF0b21JbmZvLCAxKTsKKworICAgIGluZm8tPmF0b20gPSBhdG9tOworICAgIGluZm8tPmNvcHlfZGF0YV9mdW5jID0gY29weV9mdW5jOworICAgIGluZm8tPmZyZWVfZnVuYyA9IGZyZWVfZnVuYzsKKyAgfQorCisgIHJldHVybiBpbmZvOworfQorCitzdGF0aWMgR0xpc3QgKgorYXRvbV9pbmZvX2xpc3RfcHJlcGVuZF9hdG9tIChHTGlzdCAqIGFpLCBBdG9tICogYXRvbSwKKyAgICBBdG9tQ29weURhdGFGdW5jIGNvcHlfZnVuYywgQXRvbUZyZWVGdW5jIGZyZWVfZnVuYykKK3sKKyAgaWYgKGF0b20pCisgICAgcmV0dXJuIGdfbGlzdF9wcmVwZW5kIChhaSwKKyAgICAgICAgYnVpbGRfYXRvbV9pbmZvX3dyYXBwZXIgKGF0b20sIGNvcHlfZnVuYywgZnJlZV9mdW5jKSk7CisgIGVsc2UKKyAgICByZXR1cm4gYWk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2luZm9fbGlzdF9mcmVlIChHTGlzdCAqIGFpKQoreworICB3aGlsZSAoYWkpIHsKKyAgICBBdG9tSW5mbyAqaW5mbyA9IChBdG9tSW5mbyAqKSBhaS0+ZGF0YTsKKworICAgIGluZm8tPmZyZWVfZnVuYyAoaW5mby0+YXRvbSk7CisgICAgZ19mcmVlIChpbmZvKTsKKyAgICBhaSA9IGdfbGlzdF9kZWxldGVfbGluayAoYWksIGFpKTsKKyAgfQorfQorCitzdGF0aWMgQXRvbURhdGEgKgorYXRvbV9kYXRhX25ldyAoZ3VpbnQzMiBmb3VyY2MpCit7CisgIEF0b21EYXRhICpkYXRhID0gZ19uZXcwIChBdG9tRGF0YSwgMSk7CisKKyAgYXRvbV9oZWFkZXJfc2V0ICgmZGF0YS0+aGVhZGVyLCBmb3VyY2MsIDAsIDApOworICByZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fZGF0YV9hbGxvY19tZW0gKEF0b21EYXRhICogZGF0YSwgZ3VpbnQzMiBzaXplKQoreworICBnX2ZyZWUgKGRhdGEtPmRhdGEpOworICBkYXRhLT5kYXRhID0gZ19uZXcwIChndWludDgsIHNpemUpOworICBkYXRhLT5kYXRhbGVuID0gc2l6ZTsKK30KKworc3RhdGljIEF0b21EYXRhICoKK2F0b21fZGF0YV9uZXdfZnJvbV9kYXRhIChndWludDMyIGZvdXJjYywgY29uc3QgZ3VpbnQ4ICogbWVtLCBnc2l6ZSBzaXplKQoreworICBBdG9tRGF0YSAqZGF0YSA9IGF0b21fZGF0YV9uZXcgKGZvdXJjYyk7CisKKyAgYXRvbV9kYXRhX2FsbG9jX21lbSAoZGF0YSwgc2l6ZSk7CisgIG1lbWNweSAoZGF0YS0+ZGF0YSwgbWVtLCBzaXplKTsKKyAgcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBBdG9tRGF0YSAqCithdG9tX2RhdGFfbmV3X2Zyb21fZ3N0X2J1ZmZlciAoZ3VpbnQzMiBmb3VyY2MsIGNvbnN0IEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgQXRvbURhdGEgKmRhdGEgPSBhdG9tX2RhdGFfbmV3IChmb3VyY2MpOworICBnc2l6ZSBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoKEdzdEJ1ZmZlciAqKSBidWYpOworCisgIGF0b21fZGF0YV9hbGxvY19tZW0gKGRhdGEsIHNpemUpOworICBnc3RfYnVmZmVyX2V4dHJhY3QgKChHc3RCdWZmZXIgKikgYnVmLCAwLCBkYXRhLT5kYXRhLCBzaXplKTsKKyAgcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2RhdGFfZnJlZSAoQXRvbURhdGEgKiBkYXRhKQoreworICBhdG9tX2NsZWFyICgmZGF0YS0+aGVhZGVyKTsKKyAgZ19mcmVlIChkYXRhLT5kYXRhKTsKKyAgZ19mcmVlIChkYXRhKTsKK30KKworc3RhdGljIEF0b21VVUlEICoKK2F0b21fdXVpZF9uZXcgKHZvaWQpCit7CisgIEF0b21VVUlEICp1dWlkID0gZ19uZXcwIChBdG9tVVVJRCwgMSk7CisKKyAgYXRvbV9oZWFkZXJfc2V0ICgmdXVpZC0+aGVhZGVyLCBGT1VSQ0NfdXVpZCwgMCwgMCk7CisgIHJldHVybiB1dWlkOworfQorCitzdGF0aWMgdm9pZAorYXRvbV91dWlkX2ZyZWUgKEF0b21VVUlEICogZGF0YSkKK3sKKyAgYXRvbV9jbGVhciAoJmRhdGEtPmhlYWRlcik7CisgIGdfZnJlZSAoZGF0YS0+ZGF0YSk7CisgIGdfZnJlZSAoZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2Z0eXBfaW5pdCAoQXRvbUZUWVAgKiBmdHlwLCBndWludDMyIG1ham9yLCBndWludDMyIHZlcnNpb24sIEdMaXN0ICogYnJhbmRzKQoreworICBnaW50IGluZGV4OworICBHTGlzdCAqaXQgPSBOVUxMOworCisgIGF0b21faGVhZGVyX3NldCAoJmZ0eXAtPmhlYWRlciwgRk9VUkNDX2Z0eXAsIDE2LCAwKTsKKyAgZnR5cC0+bWFqb3JfYnJhbmQgPSBtYWpvcjsKKyAgZnR5cC0+dmVyc2lvbiA9IHZlcnNpb247CisKKyAgLyogYWx3YXlzIGluY2x1ZGUgbWFqb3IgYnJhbmQgYXMgY29tcGF0aWJsZSBicmFuZCAqLworICBmdHlwLT5jb21wYXRpYmxlX2JyYW5kc19zaXplID0gZ19saXN0X2xlbmd0aCAoYnJhbmRzKSArIDE7CisgIGZ0eXAtPmNvbXBhdGlibGVfYnJhbmRzID0gZ19uZXcgKGd1aW50MzIsIGZ0eXAtPmNvbXBhdGlibGVfYnJhbmRzX3NpemUpOworCisgIGZ0eXAtPmNvbXBhdGlibGVfYnJhbmRzWzBdID0gbWFqb3I7CisgIGluZGV4ID0gMTsKKyAgZm9yIChpdCA9IGJyYW5kczsgaXQgIT0gTlVMTDsgaXQgPSBnX2xpc3RfbmV4dCAoaXQpKSB7CisgICAgZnR5cC0+Y29tcGF0aWJsZV9icmFuZHNbaW5kZXgrK10gPSBHUE9JTlRFUl9UT19VSU5UIChpdC0+ZGF0YSk7CisgIH0KK30KKworQXRvbUZUWVAgKgorYXRvbV9mdHlwX25ldyAoQXRvbXNDb250ZXh0ICogY29udGV4dCwgZ3VpbnQzMiBtYWpvciwgZ3VpbnQzMiB2ZXJzaW9uLAorICAgIEdMaXN0ICogYnJhbmRzKQoreworICBBdG9tRlRZUCAqZnR5cCA9IGdfbmV3MCAoQXRvbUZUWVAsIDEpOworCisgIGF0b21fZnR5cF9pbml0IChmdHlwLCBtYWpvciwgdmVyc2lvbiwgYnJhbmRzKTsKKyAgcmV0dXJuIGZ0eXA7Cit9CisKK3ZvaWQKK2F0b21fZnR5cF9mcmVlIChBdG9tRlRZUCAqIGZ0eXApCit7CisgIGF0b21fY2xlYXIgKCZmdHlwLT5oZWFkZXIpOworICBnX2ZyZWUgKGZ0eXAtPmNvbXBhdGlibGVfYnJhbmRzKTsKKyAgZnR5cC0+Y29tcGF0aWJsZV9icmFuZHMgPSBOVUxMOworICBnX2ZyZWUgKGZ0eXApOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9lc2RzX2luaXQgKEF0b21FU0RTICogZXNkcykKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZlc2RzLT5oZWFkZXIsIEZPVVJDQ19lc2RzLCAwLCAwLCAwLCBmbGFncyk7CisgIGRlc2NfZXNfaW5pdCAoJmVzZHMtPmVzKTsKK30KKworc3RhdGljIEF0b21FU0RTICoKK2F0b21fZXNkc19uZXcgKHZvaWQpCit7CisgIEF0b21FU0RTICplc2RzID0gZ19uZXcwIChBdG9tRVNEUywgMSk7CisKKyAgYXRvbV9lc2RzX2luaXQgKGVzZHMpOworICByZXR1cm4gZXNkczsKK30KKworc3RhdGljIHZvaWQKK2F0b21fZXNkc19mcmVlIChBdG9tRVNEUyAqIGVzZHMpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJmVzZHMtPmhlYWRlcik7CisgIGRlc2NfZXNfZGVzY3JpcHRvcl9jbGVhciAoJmVzZHMtPmVzKTsKKyAgZ19mcmVlIChlc2RzKTsKK30KKworc3RhdGljIEF0b21GUk1BICoKK2F0b21fZnJtYV9uZXcgKHZvaWQpCit7CisgIEF0b21GUk1BICpmcm1hID0gZ19uZXcwIChBdG9tRlJNQSwgMSk7CisKKyAgYXRvbV9oZWFkZXJfc2V0ICgmZnJtYS0+aGVhZGVyLCBGT1VSQ0NfZnJtYSwgMCwgMCk7CisgIHJldHVybiBmcm1hOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9mcm1hX2ZyZWUgKEF0b21GUk1BICogZnJtYSkKK3sKKyAgYXRvbV9jbGVhciAoJmZybWEtPmhlYWRlcik7CisgIGdfZnJlZSAoZnJtYSk7Cit9CisKK3N0YXRpYyBBdG9tV0FWRSAqCithdG9tX3dhdmVfbmV3ICh2b2lkKQoreworICBBdG9tV0FWRSAqd2F2ZSA9IGdfbmV3MCAoQXRvbVdBVkUsIDEpOworCisgIGF0b21faGVhZGVyX3NldCAoJndhdmUtPmhlYWRlciwgRk9VUkNDX3dhdmUsIDAsIDApOworICByZXR1cm4gd2F2ZTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fd2F2ZV9mcmVlIChBdG9tV0FWRSAqIHdhdmUpCit7CisgIGF0b21fY2xlYXIgKCZ3YXZlLT5oZWFkZXIpOworICBhdG9tX2luZm9fbGlzdF9mcmVlICh3YXZlLT5leHRlbnNpb25fYXRvbXMpOworICBnX2ZyZWUgKHdhdmUpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9lbHN0X2luaXQgKEF0b21FTFNUICogZWxzdCkKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisgIGF0b21fZnVsbF9pbml0ICgmZWxzdC0+aGVhZGVyLCBGT1VSQ0NfZWxzdCwgMCwgMCwgMCwgZmxhZ3MpOworICBlbHN0LT5lbnRyaWVzID0gMDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fZWxzdF9jbGVhciAoQXRvbUVMU1QgKiBlbHN0KQoreworICBHU0xpc3QgKndhbGtlcjsKKworICBhdG9tX2Z1bGxfY2xlYXIgKCZlbHN0LT5oZWFkZXIpOworICB3YWxrZXIgPSBlbHN0LT5lbnRyaWVzOworICB3aGlsZSAod2Fsa2VyKSB7CisgICAgZ19mcmVlICgoRWRpdExpc3RFbnRyeSAqKSB3YWxrZXItPmRhdGEpOworICAgIHdhbGtlciA9IGdfc2xpc3RfbmV4dCAod2Fsa2VyKTsKKyAgfQorICBnX3NsaXN0X2ZyZWUgKGVsc3QtPmVudHJpZXMpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9lZHRzX2luaXQgKEF0b21FRFRTICogZWR0cykKK3sKKyAgYXRvbV9oZWFkZXJfc2V0ICgmZWR0cy0+aGVhZGVyLCBGT1VSQ0NfZWR0cywgMCwgMCk7CisgIGF0b21fZWxzdF9pbml0ICgmZWR0cy0+ZWxzdCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2VkdHNfY2xlYXIgKEF0b21FRFRTICogZWR0cykKK3sKKyAgYXRvbV9jbGVhciAoJmVkdHMtPmhlYWRlcik7CisgIGF0b21fZWxzdF9jbGVhciAoJmVkdHMtPmVsc3QpOworfQorCitzdGF0aWMgQXRvbUVEVFMgKgorYXRvbV9lZHRzX25ldyAodm9pZCkKK3sKKyAgQXRvbUVEVFMgKmVkdHMgPSBnX25ldzAgKEF0b21FRFRTLCAxKTsKKyAgYXRvbV9lZHRzX2luaXQgKGVkdHMpOworICByZXR1cm4gZWR0czsKK30KKworc3RhdGljIHZvaWQKK2F0b21fZWR0c19mcmVlIChBdG9tRURUUyAqIGVkdHMpCit7CisgIGF0b21fZWR0c19jbGVhciAoZWR0cyk7CisgIGdfZnJlZSAoZWR0cyk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3RjbWlfaW5pdCAoQXRvbVRDTUkgKiB0Y21pKQoreworICBndWludDggZmxhZ3NbM10gPSB7IDAsIDAsIDAgfTsKKworICBhdG9tX2Z1bGxfaW5pdCAoJnRjbWktPmhlYWRlciwgRk9VUkNDX3RjbWksIDAsIDAsIDAsIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdGNtaV9jbGVhciAoQXRvbVRDTUkgKiB0Y21pKQoreworICBhdG9tX2Z1bGxfY2xlYXIgKCZ0Y21pLT5oZWFkZXIpOworICB0Y21pLT50ZXh0X2ZvbnQgPSAwOworICB0Y21pLT50ZXh0X2ZhY2UgPSAwOworICB0Y21pLT50ZXh0X3NpemUgPSAwOworICB0Y21pLT50ZXh0X2NvbG9yWzBdID0gMDsKKyAgdGNtaS0+dGV4dF9jb2xvclsxXSA9IDA7CisgIHRjbWktPnRleHRfY29sb3JbMl0gPSAwOworICB0Y21pLT5iZ19jb2xvclswXSA9IDA7CisgIHRjbWktPmJnX2NvbG9yWzFdID0gMDsKKyAgdGNtaS0+YmdfY29sb3JbMl0gPSAwOworICBnX2ZyZWUgKHRjbWktPmZvbnRfbmFtZSk7CisgIHRjbWktPmZvbnRfbmFtZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3RtY2RfaW5pdCAoQXRvbVRNQ0QgKiB0bWNkKQoreworICBhdG9tX2hlYWRlcl9zZXQgKCZ0bWNkLT5oZWFkZXIsIEZPVVJDQ190bWNkLCAwLCAwKTsKKyAgYXRvbV90Y21pX2luaXQgKCZ0bWNkLT50Y21pKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdG1jZF9jbGVhciAoQXRvbVRNQ0QgKiB0bWNkKQoreworICBhdG9tX2NsZWFyICgmdG1jZC0+aGVhZGVyKTsKKyAgYXRvbV90Y21pX2NsZWFyICgmdG1jZC0+dGNtaSk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2dtaW5faW5pdCAoQXRvbUdNSU4gKiBnbWluKQoreworICBndWludDggZmxhZ3NbM10gPSB7IDAsIDAsIDAgfTsKKworICBhdG9tX2Z1bGxfaW5pdCAoJmdtaW4tPmhlYWRlciwgRk9VUkNDX2dtaW4sIDAsIDAsIDAsIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fZ21pbl9jbGVhciAoQXRvbUdNSU4gKiBnbWluKQoreworICBhdG9tX2Z1bGxfY2xlYXIgKCZnbWluLT5oZWFkZXIpOworICBnbWluLT5ncmFwaGljc19tb2RlID0gMDsKKyAgZ21pbi0+b3Bjb2xvclswXSA9IDA7CisgIGdtaW4tPm9wY29sb3JbMV0gPSAwOworICBnbWluLT5vcGNvbG9yWzJdID0gMDsKKyAgZ21pbi0+YmFsYW5jZSA9IDA7CisgIGdtaW4tPnJlc2VydmVkID0gMDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fZ21oZF9pbml0IChBdG9tR01IRCAqIGdtaGQpCit7CisgIGF0b21faGVhZGVyX3NldCAoJmdtaGQtPmhlYWRlciwgRk9VUkNDX2dtaGQsIDAsIDApOworICBhdG9tX2dtaW5faW5pdCAoJmdtaGQtPmdtaW4pOworICBhdG9tX3RtY2RfaW5pdCAoJmdtaGQtPnRtY2QpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9nbWhkX2NsZWFyIChBdG9tR01IRCAqIGdtaGQpCit7CisgIGF0b21fY2xlYXIgKCZnbWhkLT5oZWFkZXIpOworICBhdG9tX2dtaW5fY2xlYXIgKCZnbWhkLT5nbWluKTsKKyAgYXRvbV90bWNkX2NsZWFyICgmZ21oZC0+dG1jZCk7Cit9CisKK3N0YXRpYyBBdG9tR01IRCAqCithdG9tX2dtaGRfbmV3ICh2b2lkKQoreworICBBdG9tR01IRCAqZ21oZCA9IGdfbmV3MCAoQXRvbUdNSEQsIDEpOworICBhdG9tX2dtaGRfaW5pdCAoZ21oZCk7CisgIHJldHVybiBnbWhkOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9nbWhkX2ZyZWUgKEF0b21HTUhEICogZ21oZCkKK3sKKyAgYXRvbV9nbWhkX2NsZWFyIChnbWhkKTsKKyAgZ19mcmVlIChnbWhkKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fc2FtcGxlX2VudHJ5X2luaXQgKFNhbXBsZVRhYmxlRW50cnkgKiBzZSwgZ3VpbnQzMiB0eXBlKQoreworICBhdG9tX2hlYWRlcl9zZXQgKCZzZS0+aGVhZGVyLCB0eXBlLCAwLCAwKTsKKworICBtZW1zZXQgKHNlLT5yZXNlcnZlZCwgMCwgc2l6ZW9mIChndWludDgpICogNik7CisgIHNlLT5kYXRhX3JlZmVyZW5jZV9pbmRleCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3NhbXBsZV9lbnRyeV9mcmVlIChTYW1wbGVUYWJsZUVudHJ5ICogc2UpCit7CisgIGF0b21fY2xlYXIgKCZzZS0+aGVhZGVyKTsKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV9lbnRyeV9tcDRhX2luaXQgKFNhbXBsZVRhYmxlRW50cnlNUDRBICogbXA0YSkKK3sKKyAgYXRvbV9zYW1wbGVfZW50cnlfaW5pdCAoJm1wNGEtPnNlLCBGT1VSQ0NfbXA0YSk7CisKKyAgbXA0YS0+dmVyc2lvbiA9IDA7CisgIG1wNGEtPnJldmlzaW9uX2xldmVsID0gMDsKKyAgbXA0YS0+dmVuZG9yID0gMDsKKyAgbXA0YS0+Y2hhbm5lbHMgPSAyOworICBtcDRhLT5zYW1wbGVfc2l6ZSA9IDE2OworICBtcDRhLT5jb21wcmVzc2lvbl9pZCA9IDA7CisgIG1wNGEtPnBhY2tldF9zaXplID0gMDsKKyAgbXA0YS0+c2FtcGxlX3JhdGUgPSAwOworICAvKiBmb2xsb3dpbmcgb25seSB1c2VkIGlmIHZlcnNpb24gaXMgMSAqLworICBtcDRhLT5zYW1wbGVzX3Blcl9wYWNrZXQgPSAwOworICBtcDRhLT5ieXRlc19wZXJfcGFja2V0ID0gMDsKKyAgbXA0YS0+Ynl0ZXNfcGVyX2ZyYW1lID0gMDsKKyAgbXA0YS0+Ynl0ZXNfcGVyX3NhbXBsZSA9IDA7CisKKyAgbXA0YS0+ZXh0ZW5zaW9uX2F0b21zID0gTlVMTDsKK30KKworc3RhdGljIFNhbXBsZVRhYmxlRW50cnlNUDRBICoKK3NhbXBsZV9lbnRyeV9tcDRhX25ldyAodm9pZCkKK3sKKyAgU2FtcGxlVGFibGVFbnRyeU1QNEEgKm1wNGEgPSBnX25ldzAgKFNhbXBsZVRhYmxlRW50cnlNUDRBLCAxKTsKKworICBzYW1wbGVfZW50cnlfbXA0YV9pbml0IChtcDRhKTsKKyAgcmV0dXJuIG1wNGE7Cit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfZW50cnlfbXA0YV9mcmVlIChTYW1wbGVUYWJsZUVudHJ5TVA0QSAqIG1wNGEpCit7CisgIGF0b21fc2FtcGxlX2VudHJ5X2ZyZWUgKCZtcDRhLT5zZSk7CisgIGF0b21faW5mb19saXN0X2ZyZWUgKG1wNGEtPmV4dGVuc2lvbl9hdG9tcyk7CisgIGdfZnJlZSAobXA0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfZW50cnlfdG1jZF9pbml0IChTYW1wbGVUYWJsZUVudHJ5VE1DRCAqIHRtY2QpCit7CisgIGF0b21fc2FtcGxlX2VudHJ5X2luaXQgKCZ0bWNkLT5zZSwgRk9VUkNDX3RtY2QpOworCisgIHRtY2QtPnRjX2ZsYWdzID0gMDsKKyAgdG1jZC0+dGltZXNjYWxlID0gMDsKKyAgdG1jZC0+ZnJhbWVfZHVyYXRpb24gPSAwOworICB0bWNkLT5uX2ZyYW1lcyA9IDA7CisKKyAgdG1jZC0+bmFtZS5sYW5ndWFnZV9jb2RlID0gMDsKKyAgZ19mcmVlICh0bWNkLT5uYW1lLm5hbWUpOworICB0bWNkLT5uYW1lLm5hbWUgPSBOVUxMOworfQorCitzdGF0aWMgU2FtcGxlVGFibGVFbnRyeVRNQ0QgKgorc2FtcGxlX2VudHJ5X3RtY2RfbmV3ICh2b2lkKQoreworICBTYW1wbGVUYWJsZUVudHJ5VE1DRCAqdG1jZCA9IGdfbmV3MCAoU2FtcGxlVGFibGVFbnRyeVRNQ0QsIDEpOworCisgIHNhbXBsZV9lbnRyeV90bWNkX2luaXQgKHRtY2QpOworICByZXR1cm4gdG1jZDsKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV9lbnRyeV90bWNkX2ZyZWUgKFNhbXBsZVRhYmxlRW50cnlUTUNEICogdG1jZCkKK3sKKyAgYXRvbV9zYW1wbGVfZW50cnlfZnJlZSAoJnRtY2QtPnNlKTsKKyAgZ19mcmVlICh0bWNkLT5uYW1lLm5hbWUpOworICBnX2ZyZWUgKHRtY2QpOworfQorCitzdGF0aWMgdm9pZAorc2FtcGxlX2VudHJ5X21wNHZfaW5pdCAoU2FtcGxlVGFibGVFbnRyeU1QNFYgKiBtcDR2LCBBdG9tc0NvbnRleHQgKiBjb250ZXh0KQoreworICBhdG9tX3NhbXBsZV9lbnRyeV9pbml0ICgmbXA0di0+c2UsIEZPVVJDQ19tcDR2KTsKKworICBtcDR2LT52ZXJzaW9uID0gMDsKKyAgbXA0di0+cmV2aXNpb25fbGV2ZWwgPSAwOworICBtcDR2LT52ZW5kb3IgPSAwOworCisgIG1wNHYtPnRlbXBvcmFsX3F1YWxpdHkgPSAwOworICBtcDR2LT5zcGF0aWFsX3F1YWxpdHkgPSAwOworCisgIC8qIHF0IGFuZCBJU08gYmFzZSBtZWRpYSBkbyBub3QgY29udHJhZGljdCwgYW5kIGV4YW1wbGVzIGFncmVlICovCisgIG1wNHYtPmhvcml6b250YWxfcmVzb2x1dGlvbiA9IDB4MDA0ODAwMDA7CisgIG1wNHYtPnZlcnRpY2FsX3Jlc29sdXRpb24gPSAweDAwNDgwMDAwOworCisgIG1wNHYtPmRhdGFzaXplID0gMDsKKyAgbXA0di0+ZnJhbWVfY291bnQgPSAxOworCisgIG1lbXNldCAobXA0di0+Y29tcHJlc3NvciwgMCwgc2l6ZW9mIChndWludDgpICogMzIpOworCisgIG1wNHYtPmRlcHRoID0gMDsKKyAgbXA0di0+Y29sb3JfdGFibGVfaWQgPSAwOworCisgIG1wNHYtPmV4dGVuc2lvbl9hdG9tcyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfZW50cnlfbXA0dl9mcmVlIChTYW1wbGVUYWJsZUVudHJ5TVA0ViAqIG1wNHYpCit7CisgIGF0b21fc2FtcGxlX2VudHJ5X2ZyZWUgKCZtcDR2LT5zZSk7CisgIGF0b21faW5mb19saXN0X2ZyZWUgKG1wNHYtPmV4dGVuc2lvbl9hdG9tcyk7CisgIGdfZnJlZSAobXA0dik7Cit9CisKK3N0YXRpYyBTYW1wbGVUYWJsZUVudHJ5TVA0ViAqCitzYW1wbGVfZW50cnlfbXA0dl9uZXcgKEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIFNhbXBsZVRhYmxlRW50cnlNUDRWICptcDR2ID0gZ19uZXcwIChTYW1wbGVUYWJsZUVudHJ5TVA0ViwgMSk7CisKKyAgc2FtcGxlX2VudHJ5X21wNHZfaW5pdCAobXA0diwgY29udGV4dCk7CisgIHJldHVybiBtcDR2OworfQorCitzdGF0aWMgdm9pZAorc2FtcGxlX2VudHJ5X3R4M2dfaW5pdCAoU2FtcGxlVGFibGVFbnRyeVRYM0cgKiB0eDNnKQoreworICBhdG9tX3NhbXBsZV9lbnRyeV9pbml0ICgmdHgzZy0+c2UsIEZPVVJDQ190eDNnKTsKKworICB0eDNnLT5kaXNwbGF5X2ZsYWdzID0gMDsKKyAgdHgzZy0+Zm9udF9pZCA9IDE7ICAgICAgICAgICAgLyogbXVzdCBiZSAxIGFzIHRoZXJlIGlzIGEgc2luZ2xlIGZvbnQgKi8KKyAgdHgzZy0+Zm9udF9mYWNlID0gMDsKKyAgdHgzZy0+Zm9yZWdyb3VuZF9jb2xvcl9yZ2JhID0gMHhGRkZGRkZGRjsgICAgIC8qIHdoaXRlLCBvcGFxdWUgKi8KKworICAvKiBjYW4ndCBzZXQgdGhpcyBub3cgKi8KKyAgdHgzZy0+ZGVmYXVsdF90ZXh0X2JveCA9IDA7CisgIHR4M2ctPmZvbnRfc2l6ZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfZW50cnlfdHgzZ19mcmVlIChTYW1wbGVUYWJsZUVudHJ5VFgzRyAqIHR4M2cpCit7CisgIGF0b21fc2FtcGxlX2VudHJ5X2ZyZWUgKCZ0eDNnLT5zZSk7CisgIGdfZnJlZSAodHgzZyk7Cit9CisKK3N0YXRpYyBTYW1wbGVUYWJsZUVudHJ5VFgzRyAqCitzYW1wbGVfZW50cnlfdHgzZ19uZXcgKHZvaWQpCit7CisgIFNhbXBsZVRhYmxlRW50cnlUWDNHICp0eDNnID0gZ19uZXcwIChTYW1wbGVUYWJsZUVudHJ5VFgzRywgMSk7CisKKyAgc2FtcGxlX2VudHJ5X3R4M2dfaW5pdCAodHgzZyk7CisgIHJldHVybiB0eDNnOworfQorCisKK3N0YXRpYyB2b2lkCithdG9tX3N0c2RfaW5pdCAoQXRvbVNUU0QgKiBzdHNkKQoreworICBndWludDggZmxhZ3NbM10gPSB7IDAsIDAsIDAgfTsKKworICBhdG9tX2Z1bGxfaW5pdCAoJnN0c2QtPmhlYWRlciwgRk9VUkNDX3N0c2QsIDAsIDAsIDAsIGZsYWdzKTsKKyAgc3RzZC0+ZW50cmllcyA9IE5VTEw7CisgIHN0c2QtPm5fZW50cmllcyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3N0c2RfcmVtb3ZlX2VudHJpZXMgKEF0b21TVFNEICogc3RzZCkKK3sKKyAgR0xpc3QgKndhbGtlcjsKKworICB3YWxrZXIgPSBzdHNkLT5lbnRyaWVzOworICB3aGlsZSAod2Fsa2VyKSB7CisgICAgR0xpc3QgKmF1eCA9IHdhbGtlcjsKKyAgICBTYW1wbGVUYWJsZUVudHJ5ICpzZSA9IChTYW1wbGVUYWJsZUVudHJ5ICopIGF1eC0+ZGF0YTsKKworICAgIHdhbGtlciA9IGdfbGlzdF9uZXh0ICh3YWxrZXIpOworICAgIHN0c2QtPmVudHJpZXMgPSBnX2xpc3RfcmVtb3ZlX2xpbmsgKHN0c2QtPmVudHJpZXMsIGF1eCk7CisKKyAgICBzd2l0Y2ggKHNlLT5raW5kKSB7CisgICAgICBjYXNlIEFVRElPOgorICAgICAgICBzYW1wbGVfZW50cnlfbXA0YV9mcmVlICgoU2FtcGxlVGFibGVFbnRyeU1QNEEgKikgc2UpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVklERU86CisgICAgICAgIHNhbXBsZV9lbnRyeV9tcDR2X2ZyZWUgKChTYW1wbGVUYWJsZUVudHJ5TVA0ViAqKSBzZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTVUJUSVRMRToKKyAgICAgICAgc2FtcGxlX2VudHJ5X3R4M2dfZnJlZSAoKFNhbXBsZVRhYmxlRW50cnlUWDNHICopIHNlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRJTUVDT0RFOgorICAgICAgICBzYW1wbGVfZW50cnlfdG1jZF9mcmVlICgoU2FtcGxlVGFibGVFbnRyeVRNQ0QgKikgc2UpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIGJlc3QgcG9zc2libGUgY2xlYW51cCAqLworICAgICAgICBhdG9tX3NhbXBsZV9lbnRyeV9mcmVlIChzZSk7CisgICAgfQorICAgIGdfbGlzdF9mcmVlIChhdXgpOworICB9CisgIHN0c2QtPm5fZW50cmllcyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3N0c2RfY2xlYXIgKEF0b21TVFNEICogc3RzZCkKK3sKKyAgYXRvbV9zdHNkX3JlbW92ZV9lbnRyaWVzIChzdHNkKTsKKyAgYXRvbV9mdWxsX2NsZWFyICgmc3RzZC0+aGVhZGVyKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fY3R0c19pbml0IChBdG9tQ1RUUyAqIGN0dHMpCit7CisgIGd1aW50OCBmbGFnc1szXSA9IHsgMCwgMCwgMCB9OworCisgIGF0b21fZnVsbF9pbml0ICgmY3R0cy0+aGVhZGVyLCBGT1VSQ0NfY3R0cywgMCwgMCwgMCwgZmxhZ3MpOworICBhdG9tX2FycmF5X2luaXQgKCZjdHRzLT5lbnRyaWVzLCAxMjgpOworICBjdHRzLT5kb19wdHMgPSBGQUxTRTsKK30KKworc3RhdGljIEF0b21DVFRTICoKK2F0b21fY3R0c19uZXcgKHZvaWQpCit7CisgIEF0b21DVFRTICpjdHRzID0gZ19uZXcwIChBdG9tQ1RUUywgMSk7CisKKyAgYXRvbV9jdHRzX2luaXQgKGN0dHMpOworICByZXR1cm4gY3R0czsKK30KKworc3RhdGljIHZvaWQKK2F0b21fY3R0c19mcmVlIChBdG9tQ1RUUyAqIGN0dHMpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJmN0dHMtPmhlYWRlcik7CisgIGF0b21fYXJyYXlfY2xlYXIgKCZjdHRzLT5lbnRyaWVzKTsKKyAgZ19mcmVlIChjdHRzKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fc3ZtaV9pbml0IChBdG9tU1ZNSSAqIHN2bWkpCit7CisgIGd1aW50OCBmbGFnc1szXSA9IHsgMCwgMCwgMCB9OworCisgIGF0b21fZnVsbF9pbml0ICgmc3ZtaS0+aGVhZGVyLCBGT1VSQ0Nfc3ZtaSwgMCwgMCwgMCwgZmxhZ3MpOworICBzdm1pLT5zdGVyZW9zY29waWNfY29tcG9zaXRpb25fdHlwZSA9IDB4MDA7CisgIHN2bWktPmlzX2xlZnRfZmlyc3QgPSBGQUxTRTsKK30KKworQXRvbVNWTUkgKgorYXRvbV9zdm1pX25ldyAoZ3VpbnQ4IHN0ZXJlb3Njb3BpY19jb21wb3NpdGlvbl90eXBlLCBnYm9vbGVhbiBpc19sZWZ0X2ZpcnN0KQoreworICBBdG9tU1ZNSSAqc3ZtaSA9IGdfbmV3MCAoQXRvbVNWTUksIDEpOworCisgIGF0b21fc3ZtaV9pbml0IChzdm1pKTsKKyAgc3ZtaS0+c3RlcmVvc2NvcGljX2NvbXBvc2l0aW9uX3R5cGUgPSBzdGVyZW9zY29waWNfY29tcG9zaXRpb25fdHlwZTsKKyAgc3ZtaS0+aXNfbGVmdF9maXJzdCA9IGlzX2xlZnRfZmlyc3Q7CisgIHJldHVybiBzdm1pOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9zdm1pX2ZyZWUgKEF0b21TVk1JICogc3ZtaSkKK3sKKyAgZ19mcmVlIChzdm1pKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fc3R0c19pbml0IChBdG9tU1RUUyAqIHN0dHMpCit7CisgIGd1aW50OCBmbGFnc1szXSA9IHsgMCwgMCwgMCB9OworCisgIGF0b21fZnVsbF9pbml0ICgmc3R0cy0+aGVhZGVyLCBGT1VSQ0Nfc3R0cywgMCwgMCwgMCwgZmxhZ3MpOworICBhdG9tX2FycmF5X2luaXQgKCZzdHRzLT5lbnRyaWVzLCA1MTIpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9zdHRzX2NsZWFyIChBdG9tU1RUUyAqIHN0dHMpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJnN0dHMtPmhlYWRlcik7CisgIGF0b21fYXJyYXlfY2xlYXIgKCZzdHRzLT5lbnRyaWVzKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fc3Rzel9pbml0IChBdG9tU1RTWiAqIHN0c3opCit7CisgIGd1aW50OCBmbGFnc1szXSA9IHsgMCwgMCwgMCB9OworCisgIGF0b21fZnVsbF9pbml0ICgmc3Rzei0+aGVhZGVyLCBGT1VSQ0Nfc3RzeiwgMCwgMCwgMCwgZmxhZ3MpOworICBhdG9tX2FycmF5X2luaXQgKCZzdHN6LT5lbnRyaWVzLCAxMDI0KTsKKyAgc3Rzei0+c2FtcGxlX3NpemUgPSAwOworICBzdHN6LT50YWJsZV9zaXplID0gMDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fc3Rzel9jbGVhciAoQXRvbVNUU1ogKiBzdHN6KQoreworICBhdG9tX2Z1bGxfY2xlYXIgKCZzdHN6LT5oZWFkZXIpOworICBhdG9tX2FycmF5X2NsZWFyICgmc3Rzei0+ZW50cmllcyk7CisgIHN0c3otPnRhYmxlX3NpemUgPSAwOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9zdHNjX2luaXQgKEF0b21TVFNDICogc3RzYykKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZzdHNjLT5oZWFkZXIsIEZPVVJDQ19zdHNjLCAwLCAwLCAwLCBmbGFncyk7CisgIGF0b21fYXJyYXlfaW5pdCAoJnN0c2MtPmVudHJpZXMsIDEyOCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3N0c2NfY2xlYXIgKEF0b21TVFNDICogc3RzYykKK3sKKyAgYXRvbV9mdWxsX2NsZWFyICgmc3RzYy0+aGVhZGVyKTsKKyAgYXRvbV9hcnJheV9jbGVhciAoJnN0c2MtPmVudHJpZXMpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9jbzY0X2luaXQgKEF0b21TVENPNjQgKiBjbzY0KQoreworICBndWludDggZmxhZ3NbM10gPSB7IDAsIDAsIDAgfTsKKworICBhdG9tX2Z1bGxfaW5pdCAoJmNvNjQtPmhlYWRlciwgRk9VUkNDX3N0Y28sIDAsIDAsIDAsIGZsYWdzKTsKKyAgYXRvbV9hcnJheV9pbml0ICgmY282NC0+ZW50cmllcywgMjU2KTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fc3RjbzY0X2NsZWFyIChBdG9tU1RDTzY0ICogc3RjbzY0KQoreworICBhdG9tX2Z1bGxfY2xlYXIgKCZzdGNvNjQtPmhlYWRlcik7CisgIGF0b21fYXJyYXlfY2xlYXIgKCZzdGNvNjQtPmVudHJpZXMpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9zdHNzX2luaXQgKEF0b21TVFNTICogc3RzcykKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZzdHNzLT5oZWFkZXIsIEZPVVJDQ19zdHNzLCAwLCAwLCAwLCBmbGFncyk7CisgIGF0b21fYXJyYXlfaW5pdCAoJnN0c3MtPmVudHJpZXMsIDEyOCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3N0c3NfY2xlYXIgKEF0b21TVFNTICogc3RzcykKK3sKKyAgYXRvbV9mdWxsX2NsZWFyICgmc3Rzcy0+aGVhZGVyKTsKKyAgYXRvbV9hcnJheV9jbGVhciAoJnN0c3MtPmVudHJpZXMpOworfQorCit2b2lkCithdG9tX3N0YmxfaW5pdCAoQXRvbVNUQkwgKiBzdGJsKQoreworICBhdG9tX2hlYWRlcl9zZXQgKCZzdGJsLT5oZWFkZXIsIEZPVVJDQ19zdGJsLCAwLCAwKTsKKworICBhdG9tX3N0dHNfaW5pdCAoJnN0YmwtPnN0dHMpOworICBhdG9tX3N0c3NfaW5pdCAoJnN0YmwtPnN0c3MpOworICBhdG9tX3N0c2RfaW5pdCAoJnN0YmwtPnN0c2QpOworICBhdG9tX3N0c3pfaW5pdCAoJnN0YmwtPnN0c3opOworICBhdG9tX3N0c2NfaW5pdCAoJnN0YmwtPnN0c2MpOworICBzdGJsLT5jdHRzID0gTlVMTDsKKyAgc3RibC0+c3ZtaSA9IE5VTEw7CisKKyAgYXRvbV9jbzY0X2luaXQgKCZzdGJsLT5zdGNvNjQpOworfQorCit2b2lkCithdG9tX3N0YmxfY2xlYXIgKEF0b21TVEJMICogc3RibCkKK3sKKyAgYXRvbV9jbGVhciAoJnN0YmwtPmhlYWRlcik7CisgIGF0b21fc3RzZF9jbGVhciAoJnN0YmwtPnN0c2QpOworICBhdG9tX3N0dHNfY2xlYXIgKCZzdGJsLT5zdHRzKTsKKyAgYXRvbV9zdHNzX2NsZWFyICgmc3RibC0+c3Rzcyk7CisgIGF0b21fc3RzY19jbGVhciAoJnN0YmwtPnN0c2MpOworICBhdG9tX3N0c3pfY2xlYXIgKCZzdGJsLT5zdHN6KTsKKyAgaWYgKHN0YmwtPmN0dHMpIHsKKyAgICBhdG9tX2N0dHNfZnJlZSAoc3RibC0+Y3R0cyk7CisgIH0KKyAgaWYgKHN0YmwtPnN2bWkpIHsKKyAgICBhdG9tX3N2bWlfZnJlZSAoc3RibC0+c3ZtaSk7CisgIH0KKyAgYXRvbV9zdGNvNjRfY2xlYXIgKCZzdGJsLT5zdGNvNjQpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV92bWhkX2luaXQgKEF0b21WTUhEICogdm1oZCwgQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAxIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZ2bWhkLT5oZWFkZXIsIEZPVVJDQ192bWhkLCAwLCAwLCAwLCBmbGFncyk7CisgIHZtaGQtPmdyYXBoaWNzX21vZGUgPSAweDA7CisgIG1lbXNldCAodm1oZC0+b3Bjb2xvciwgMCwgc2l6ZW9mIChndWludDE2KSAqIDMpOworCisgIGlmIChjb250ZXh0LT5mbGF2b3IgPT0gQVRPTVNfVFJFRV9GTEFWT1JfTU9WKSB7CisgICAgdm1oZC0+Z3JhcGhpY3NfbW9kZSA9IDB4NDA7CisgICAgdm1oZC0+b3Bjb2xvclswXSA9IDMyNzY4OworICAgIHZtaGQtPm9wY29sb3JbMV0gPSAzMjc2ODsKKyAgICB2bWhkLT5vcGNvbG9yWzJdID0gMzI3Njg7CisgIH0KK30KKworc3RhdGljIEF0b21WTUhEICoKK2F0b21fdm1oZF9uZXcgKEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIEF0b21WTUhEICp2bWhkID0gZ19uZXcwIChBdG9tVk1IRCwgMSk7CisKKyAgYXRvbV92bWhkX2luaXQgKHZtaGQsIGNvbnRleHQpOworICByZXR1cm4gdm1oZDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdm1oZF9mcmVlIChBdG9tVk1IRCAqIHZtaGQpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJnZtaGQtPmhlYWRlcik7CisgIGdfZnJlZSAodm1oZCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3NtaGRfaW5pdCAoQXRvbVNNSEQgKiBzbWhkKQoreworICBndWludDggZmxhZ3NbM10gPSB7IDAsIDAsIDAgfTsKKworICBhdG9tX2Z1bGxfaW5pdCAoJnNtaGQtPmhlYWRlciwgRk9VUkNDX3NtaGQsIDAsIDAsIDAsIGZsYWdzKTsKKyAgc21oZC0+YmFsYW5jZSA9IDA7CisgIHNtaGQtPnJlc2VydmVkID0gMDsKK30KKworc3RhdGljIEF0b21TTUhEICoKK2F0b21fc21oZF9uZXcgKHZvaWQpCit7CisgIEF0b21TTUhEICpzbWhkID0gZ19uZXcwIChBdG9tU01IRCwgMSk7CisKKyAgYXRvbV9zbWhkX2luaXQgKHNtaGQpOworICByZXR1cm4gc21oZDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fc21oZF9mcmVlIChBdG9tU01IRCAqIHNtaGQpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJnNtaGQtPmhlYWRlcik7CisgIGdfZnJlZSAoc21oZCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2htaGRfZnJlZSAoQXRvbUhNSEQgKiBobWhkKQoreworICBhdG9tX2Z1bGxfY2xlYXIgKCZobWhkLT5oZWFkZXIpOworICBnX2ZyZWUgKGhtaGQpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9oZGxyX2luaXQgKEF0b21IRExSICogaGRsciwgQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZoZGxyLT5oZWFkZXIsIEZPVVJDQ19oZGxyLCAwLCAwLCAwLCBmbGFncyk7CisKKyAgaGRsci0+Y29tcG9uZW50X3R5cGUgPSAwOworICBoZGxyLT5oYW5kbGVyX3R5cGUgPSAwOworICBoZGxyLT5tYW51ZmFjdHVyZXIgPSAwOworICBoZGxyLT5mbGFncyA9IDA7CisgIGhkbHItPmZsYWdzX21hc2sgPSAwOworICBoZGxyLT5uYW1lID0gZ19zdHJkdXAgKCIiKTsKKworICAvKiBTdG9yZSB0aGUgZmxhdm9yIHRvIGtub3cgaG93IHRvIHNlcmlhbGl6ZSB0aGUgJ25hbWUnIHN0cmluZyAqLworICBoZGxyLT5mbGF2b3IgPSBjb250ZXh0LT5mbGF2b3I7Cit9CisKK3N0YXRpYyBBdG9tSERMUiAqCithdG9tX2hkbHJfbmV3IChBdG9tc0NvbnRleHQgKiBjb250ZXh0KQoreworICBBdG9tSERMUiAqaGRsciA9IGdfbmV3MCAoQXRvbUhETFIsIDEpOworCisgIGF0b21faGRscl9pbml0IChoZGxyLCBjb250ZXh0KTsKKyAgcmV0dXJuIGhkbHI7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2hkbHJfY2xlYXIgKEF0b21IRExSICogaGRscikKK3sKKyAgYXRvbV9mdWxsX2NsZWFyICgmaGRsci0+aGVhZGVyKTsKKyAgaWYgKGhkbHItPm5hbWUpIHsKKyAgICBnX2ZyZWUgKGhkbHItPm5hbWUpOworICAgIGhkbHItPm5hbWUgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2hkbHJfZnJlZSAoQXRvbUhETFIgKiBoZGxyKQoreworICBhdG9tX2hkbHJfY2xlYXIgKGhkbHIpOworICBnX2ZyZWUgKGhkbHIpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV91cmxfaW5pdCAoQXRvbVVSTCAqIHVybCkKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAxIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZ1cmwtPmhlYWRlciwgRk9VUkNDX3VybF8sIDAsIDAsIDAsIGZsYWdzKTsKKyAgdXJsLT5sb2NhdGlvbiA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3VybF9mcmVlIChBdG9tVVJMICogdXJsKQoreworICBhdG9tX2Z1bGxfY2xlYXIgKCZ1cmwtPmhlYWRlcik7CisgIGlmICh1cmwtPmxvY2F0aW9uKSB7CisgICAgZ19mcmVlICh1cmwtPmxvY2F0aW9uKTsKKyAgICB1cmwtPmxvY2F0aW9uID0gTlVMTDsKKyAgfQorICBnX2ZyZWUgKHVybCk7Cit9CisKK3N0YXRpYyBBdG9tVVJMICoKK2F0b21fdXJsX25ldyAodm9pZCkKK3sKKyAgQXRvbVVSTCAqdXJsID0gZ19uZXcwIChBdG9tVVJMLCAxKTsKKworICBhdG9tX3VybF9pbml0ICh1cmwpOworICByZXR1cm4gdXJsOworfQorCitzdGF0aWMgQXRvbUZ1bGwgKgorYXRvbV9hbGlzX25ldyAodm9pZCkKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAxIH07CisgIEF0b21GdWxsICphbGlzID0gZ19uZXcwIChBdG9tRnVsbCwgMSk7CisKKyAgYXRvbV9mdWxsX2luaXQgKGFsaXMsIEZPVVJDQ19hbGlzLCAwLCAwLCAwLCBmbGFncyk7CisgIHJldHVybiBhbGlzOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9kcmVmX2luaXQgKEF0b21EUkVGICogZHJlZiwgQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZkcmVmLT5oZWFkZXIsIEZPVVJDQ19kcmVmLCAwLCAwLCAwLCBmbGFncyk7CisKKyAgLyogaW4gZWl0aGVyIGNhc2UsIGFsaXMgb3IgdXJsIGluaXQgYXJyYW5nZXMgdG8gc2V0IHNlbGYtY29udGFpbmVkIGZsYWcgKi8KKyAgaWYgKGNvbnRleHQtPmZsYXZvciA9PSBBVE9NU19UUkVFX0ZMQVZPUl9NT1YpIHsKKyAgICAvKiBhbGlzIGRyZWYgZm9yIHF0ICovCisgICAgQXRvbUZ1bGwgKmFsaXMgPSBhdG9tX2FsaXNfbmV3ICgpOworICAgIGRyZWYtPmVudHJpZXMgPSBnX2xpc3RfYXBwZW5kIChkcmVmLT5lbnRyaWVzLCBhbGlzKTsKKyAgfSBlbHNlIHsKKyAgICAvKiB1cmwgZm9yIGlzbyBzcGVjLCBhcyAnYWxpcycgbm90IHNwZWNpZmllZCB0aGVyZSAqLworICAgIEF0b21VUkwgKnVybCA9IGF0b21fdXJsX25ldyAoKTsKKyAgICBkcmVmLT5lbnRyaWVzID0gZ19saXN0X2FwcGVuZCAoZHJlZi0+ZW50cmllcywgdXJsKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorYXRvbV9kcmVmX2NsZWFyIChBdG9tRFJFRiAqIGRyZWYpCit7CisgIEdMaXN0ICp3YWxrZXI7CisKKyAgYXRvbV9mdWxsX2NsZWFyICgmZHJlZi0+aGVhZGVyKTsKKyAgd2Fsa2VyID0gZHJlZi0+ZW50cmllczsKKyAgd2hpbGUgKHdhbGtlcikgeworICAgIEdMaXN0ICphdXggPSB3YWxrZXI7CisgICAgQXRvbSAqYXRvbSA9IChBdG9tICopIGF1eC0+ZGF0YTsKKworICAgIHdhbGtlciA9IGdfbGlzdF9uZXh0ICh3YWxrZXIpOworICAgIGRyZWYtPmVudHJpZXMgPSBnX2xpc3RfcmVtb3ZlX2xpbmsgKGRyZWYtPmVudHJpZXMsIGF1eCk7CisgICAgc3dpdGNoIChhdG9tLT50eXBlKSB7CisgICAgICBjYXNlIEZPVVJDQ19hbGlzOgorICAgICAgICBhdG9tX2Z1bGxfZnJlZSAoKEF0b21GdWxsICopIGF0b20pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk9VUkNDX3VybF86CisgICAgICAgIGF0b21fdXJsX2ZyZWUgKChBdG9tVVJMICopIGF0b20pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIHdlIGRvIG5vdGhpbmcsIGJldHRlciBsZWFrIHRoYW4gY3Jhc2ggKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGdfbGlzdF9mcmVlIChhdXgpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2RpbmZfaW5pdCAoQXRvbURJTkYgKiBkaW5mLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0KQoreworICBhdG9tX2hlYWRlcl9zZXQgKCZkaW5mLT5oZWFkZXIsIEZPVVJDQ19kaW5mLCAwLCAwKTsKKyAgYXRvbV9kcmVmX2luaXQgKCZkaW5mLT5kcmVmLCBjb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fZGluZl9jbGVhciAoQXRvbURJTkYgKiBkaW5mKQoreworICBhdG9tX2NsZWFyICgmZGluZi0+aGVhZGVyKTsKKyAgYXRvbV9kcmVmX2NsZWFyICgmZGluZi0+ZHJlZik7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX21pbmZfaW5pdCAoQXRvbU1JTkYgKiBtaW5mLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0KQoreworICBhdG9tX2hlYWRlcl9zZXQgKCZtaW5mLT5oZWFkZXIsIEZPVVJDQ19taW5mLCAwLCAwKTsKKworICBtaW5mLT52bWhkID0gTlVMTDsKKyAgbWluZi0+c21oZCA9IE5VTEw7CisgIG1pbmYtPmhtaGQgPSBOVUxMOworICBtaW5mLT5nbWhkID0gTlVMTDsKKworICBpZiAoY29udGV4dC0+Zmxhdm9yID09IEFUT01TX1RSRUVfRkxBVk9SX01PVikgeworICAgIG1pbmYtPmhkbHIgPSBhdG9tX2hkbHJfbmV3IChjb250ZXh0KTsKKyAgICBtaW5mLT5oZGxyLT5jb21wb25lbnRfdHlwZSA9IEZPVVJDQ19kaGxyOworICAgIG1pbmYtPmhkbHItPmhhbmRsZXJfdHlwZSA9IEZPVVJDQ19hbGlzOworICB9IGVsc2UgeworICAgIG1pbmYtPmhkbHIgPSBOVUxMOworICB9CisgIGF0b21fZGluZl9pbml0ICgmbWluZi0+ZGluZiwgY29udGV4dCk7CisgIGF0b21fc3RibF9pbml0ICgmbWluZi0+c3RibCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX21pbmZfY2xlYXJfaGFuZGxlcnMgKEF0b21NSU5GICogbWluZikKK3sKKyAgaWYgKG1pbmYtPnZtaGQpIHsKKyAgICBhdG9tX3ZtaGRfZnJlZSAobWluZi0+dm1oZCk7CisgICAgbWluZi0+dm1oZCA9IE5VTEw7CisgIH0KKyAgaWYgKG1pbmYtPnNtaGQpIHsKKyAgICBhdG9tX3NtaGRfZnJlZSAobWluZi0+c21oZCk7CisgICAgbWluZi0+c21oZCA9IE5VTEw7CisgIH0KKyAgaWYgKG1pbmYtPmhtaGQpIHsKKyAgICBhdG9tX2htaGRfZnJlZSAobWluZi0+aG1oZCk7CisgICAgbWluZi0+aG1oZCA9IE5VTEw7CisgIH0KKyAgaWYgKG1pbmYtPmdtaGQpIHsKKyAgICBhdG9tX2dtaGRfZnJlZSAobWluZi0+Z21oZCk7CisgICAgbWluZi0+Z21oZCA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2F0b21fbWluZl9jbGVhciAoQXRvbU1JTkYgKiBtaW5mKQoreworICBhdG9tX2NsZWFyICgmbWluZi0+aGVhZGVyKTsKKyAgYXRvbV9taW5mX2NsZWFyX2hhbmRsZXJzIChtaW5mKTsKKyAgaWYgKG1pbmYtPmhkbHIpIHsKKyAgICBhdG9tX2hkbHJfZnJlZSAobWluZi0+aGRscik7CisgIH0KKyAgYXRvbV9kaW5mX2NsZWFyICgmbWluZi0+ZGluZik7CisgIGF0b21fc3RibF9jbGVhciAoJm1pbmYtPnN0YmwpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9tZGhkX2luaXQgKEF0b21NREhEICogbWRoZCkKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZtZGhkLT5oZWFkZXIsIEZPVVJDQ19tZGhkLCAwLCAwLCAwLCBmbGFncyk7CisgIGNvbW1vbl90aW1lX2luZm9faW5pdCAoJm1kaGQtPnRpbWVfaW5mbyk7CisgIC8qIHRlbXB0aW5nIGFzIGl0IG1heSBiZSB0byBzaW1wbHkgMC1pbml0aWFsaXplLAorICAgKiB0aGF0IHdpbGwgaGF2ZSB0aGUgZGVtdXhlciAoY29ycmVjdGx5KSBjb21lIHVwIHdpdGggJ2VuZycgYXMgbGFuZ3VhZ2UKKyAgICogc28gZXhwbGljaXRseSBzcGVjaWZ5IHVuZGVmaW5lZCBpbnN0ZWFkICovCisgIG1kaGQtPmxhbmd1YWdlX2NvZGUgPQorICAgICAgKCd1JyAtIDB4NjApICogMHg0MDAgKyAoJ24nIC0gMHg2MCkgKiAweDIwICsgKCdkJyAtIDB4NjApOworICBtZGhkLT5xdWFsaXR5ID0gMDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fbWRoZF9jbGVhciAoQXRvbU1ESEQgKiBtZGhkKQoreworICBhdG9tX2Z1bGxfY2xlYXIgKCZtZGhkLT5oZWFkZXIpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9tZGlhX2luaXQgKEF0b21NRElBICogbWRpYSwgQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgYXRvbV9oZWFkZXJfc2V0ICgmbWRpYS0+aGVhZGVyLCBGT1VSQ0NfbWRpYSwgMCwgMCk7CisKKyAgYXRvbV9tZGhkX2luaXQgKCZtZGlhLT5tZGhkKTsKKyAgYXRvbV9oZGxyX2luaXQgKCZtZGlhLT5oZGxyLCBjb250ZXh0KTsKKyAgYXRvbV9taW5mX2luaXQgKCZtZGlhLT5taW5mLCBjb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fbWRpYV9jbGVhciAoQXRvbU1ESUEgKiBtZGlhKQoreworICBhdG9tX2NsZWFyICgmbWRpYS0+aGVhZGVyKTsKKyAgYXRvbV9tZGhkX2NsZWFyICgmbWRpYS0+bWRoZCk7CisgIGF0b21faGRscl9jbGVhciAoJm1kaWEtPmhkbHIpOworICBhdG9tX21pbmZfY2xlYXIgKCZtZGlhLT5taW5mKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdGtoZF9pbml0IChBdG9tVEtIRCAqIHRraGQsIEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIC8qCisgICAqIGZsYWdzIGluZm8KKyAgICogMSAtPiB0cmFjayBlbmFibGVkCisgICAqIDIgLT4gdHJhY2sgaW4gbW92aWUKKyAgICogNCAtPiB0cmFjayBpbiBwcmV2aWV3CisgICAqLworICBndWludDggZmxhZ3NbM10gPSB7IDAsIDAsIDcgfTsKKworICBhdG9tX2Z1bGxfaW5pdCAoJnRraGQtPmhlYWRlciwgRk9VUkNDX3RraGQsIDAsIDAsIDAsIGZsYWdzKTsKKworICB0a2hkLT5jcmVhdGlvbl90aW1lID0gdGtoZC0+bW9kaWZpY2F0aW9uX3RpbWUgPSBhdG9tc19nZXRfY3VycmVudF9xdF90aW1lICgpOworICB0a2hkLT5kdXJhdGlvbiA9IDA7CisgIHRraGQtPnRyYWNrX0lEID0gMDsKKyAgdGtoZC0+cmVzZXJ2ZWQgPSAwOworCisgIHRraGQtPnJlc2VydmVkMlswXSA9IHRraGQtPnJlc2VydmVkMlsxXSA9IDA7CisgIHRraGQtPmxheWVyID0gMDsKKyAgdGtoZC0+YWx0ZXJuYXRlX2dyb3VwID0gMDsKKyAgdGtoZC0+dm9sdW1lID0gMDsKKyAgdGtoZC0+cmVzZXJ2ZWQzID0gMDsKKyAgbWVtc2V0ICh0a2hkLT5tYXRyaXgsIDAsIHNpemVvZiAoZ3VpbnQzMikgKiA5KTsKKyAgdGtoZC0+bWF0cml4WzBdID0gMSA8PCAxNjsKKyAgdGtoZC0+bWF0cml4WzRdID0gMSA8PCAxNjsKKyAgdGtoZC0+bWF0cml4WzhdID0gMTYzODQgPDwgMTY7CisgIHRraGQtPndpZHRoID0gMDsKKyAgdGtoZC0+aGVpZ2h0ID0gMDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdGtoZF9jbGVhciAoQXRvbVRLSEQgKiB0a2hkKQoreworICBhdG9tX2Z1bGxfY2xlYXIgKCZ0a2hkLT5oZWFkZXIpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9pbHN0X2luaXQgKEF0b21JTFNUICogaWxzdCkKK3sKKyAgYXRvbV9oZWFkZXJfc2V0ICgmaWxzdC0+aGVhZGVyLCBGT1VSQ0NfaWxzdCwgMCwgMCk7CisgIGlsc3QtPmVudHJpZXMgPSBOVUxMOworfQorCitzdGF0aWMgQXRvbUlMU1QgKgorYXRvbV9pbHN0X25ldyAodm9pZCkKK3sKKyAgQXRvbUlMU1QgKmlsc3QgPSBnX25ldzAgKEF0b21JTFNULCAxKTsKKworICBhdG9tX2lsc3RfaW5pdCAoaWxzdCk7CisgIHJldHVybiBpbHN0OworfQorCitzdGF0aWMgdm9pZAorYXRvbV9pbHN0X2ZyZWUgKEF0b21JTFNUICogaWxzdCkKK3sKKyAgaWYgKGlsc3QtPmVudHJpZXMpCisgICAgYXRvbV9pbmZvX2xpc3RfZnJlZSAoaWxzdC0+ZW50cmllcyk7CisgIGF0b21fY2xlYXIgKCZpbHN0LT5oZWFkZXIpOworICBnX2ZyZWUgKGlsc3QpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9tZXRhX2luaXQgKEF0b21NRVRBICogbWV0YSwgQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZtZXRhLT5oZWFkZXIsIEZPVVJDQ19tZXRhLCAwLCAwLCAwLCBmbGFncyk7CisgIGF0b21faGRscl9pbml0ICgmbWV0YS0+aGRsciwgY29udGV4dCk7CisgIC8qIEZJWE1FIChJU09NIHNheXMgdGhpcyBpcyBhbHdheXMgMCkgKi8KKyAgbWV0YS0+aGRsci5jb21wb25lbnRfdHlwZSA9IEZPVVJDQ19taGxyOworICBtZXRhLT5oZGxyLmhhbmRsZXJfdHlwZSA9IEZPVVJDQ19tZGlyOworICBtZXRhLT5pbHN0ID0gTlVMTDsKK30KKworc3RhdGljIEF0b21NRVRBICoKK2F0b21fbWV0YV9uZXcgKEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIEF0b21NRVRBICptZXRhID0gZ19uZXcwIChBdG9tTUVUQSwgMSk7CisKKyAgYXRvbV9tZXRhX2luaXQgKG1ldGEsIGNvbnRleHQpOworICByZXR1cm4gbWV0YTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fbWV0YV9mcmVlIChBdG9tTUVUQSAqIG1ldGEpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJm1ldGEtPmhlYWRlcik7CisgIGF0b21faGRscl9jbGVhciAoJm1ldGEtPmhkbHIpOworICBpZiAobWV0YS0+aWxzdCkKKyAgICBhdG9tX2lsc3RfZnJlZSAobWV0YS0+aWxzdCk7CisgIG1ldGEtPmlsc3QgPSBOVUxMOworICBnX2ZyZWUgKG1ldGEpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV91ZHRhX2luaXRfbWV0YXRhZ3MgKEF0b21VRFRBICogdWR0YSwgQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgaWYgKGNvbnRleHQtPmZsYXZvciAhPSBBVE9NU19UUkVFX0ZMQVZPUl8zR1ApIHsKKyAgICBpZiAoIXVkdGEtPm1ldGEpIHsKKyAgICAgIHVkdGEtPm1ldGEgPSBhdG9tX21ldGFfbmV3IChjb250ZXh0KTsKKyAgICB9CisgICAgaWYgKCF1ZHRhLT5tZXRhLT5pbHN0KSB7CisgICAgICB1ZHRhLT5tZXRhLT5pbHN0ID0gYXRvbV9pbHN0X25ldyAoKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2F0b21fdWR0YV9pbml0IChBdG9tVURUQSAqIHVkdGEsIEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIGF0b21faGVhZGVyX3NldCAoJnVkdGEtPmhlYWRlciwgRk9VUkNDX3VkdGEsIDAsIDApOworICB1ZHRhLT5tZXRhID0gTlVMTDsKKyAgdWR0YS0+Y29udGV4dCA9IGNvbnRleHQ7CisKKyAgYXRvbV91ZHRhX2luaXRfbWV0YXRhZ3MgKHVkdGEsIGNvbnRleHQpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV91ZHRhX2NsZWFyIChBdG9tVURUQSAqIHVkdGEpCit7CisgIGF0b21fY2xlYXIgKCZ1ZHRhLT5oZWFkZXIpOworICBpZiAodWR0YS0+bWV0YSkKKyAgICBhdG9tX21ldGFfZnJlZSAodWR0YS0+bWV0YSk7CisgIHVkdGEtPm1ldGEgPSBOVUxMOworICBpZiAodWR0YS0+ZW50cmllcykKKyAgICBhdG9tX2luZm9fbGlzdF9mcmVlICh1ZHRhLT5lbnRyaWVzKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdHJlZl9pbml0IChBdG9tVFJFRiAqIHRyZWYsIGd1aW50MzIgcmVmdHlwZSkKK3sKKyAgYXRvbV9oZWFkZXJfc2V0ICgmdHJlZi0+aGVhZGVyLCBGT1VSQ0NfdHJlZiwgMCwgMCk7CisgIHRyZWYtPnJlZnR5cGUgPSByZWZ0eXBlOworICBhdG9tX2FycmF5X2luaXQgKCZ0cmVmLT5lbnRyaWVzLCAxMjgpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cmVmX2NsZWFyIChBdG9tVFJFRiAqIHRyZWYpCit7CisgIGF0b21fY2xlYXIgKCZ0cmVmLT5oZWFkZXIpOworICB0cmVmLT5yZWZ0eXBlID0gMDsKKyAgYXRvbV9hcnJheV9jbGVhciAoJnRyZWYtPmVudHJpZXMpOworfQorCitBdG9tVFJFRiAqCithdG9tX3RyZWZfbmV3IChndWludDMyIHJlZnR5cGUpCit7CisgIEF0b21UUkVGICp0cmVmOworCisgIHRyZWYgPSBnX25ldzAgKEF0b21UUkVGLCAxKTsKKyAgYXRvbV90cmVmX2luaXQgKHRyZWYsIHJlZnR5cGUpOworCisgIHJldHVybiB0cmVmOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cmVmX2ZyZWUgKEF0b21UUkVGICogdHJlZikKK3sKKyAgYXRvbV90cmVmX2NsZWFyICh0cmVmKTsKKyAgZ19mcmVlICh0cmVmKTsKK30KKworLyogQ2xlYXIgYWRkZWQgdGFncywgYnV0IGtlZXAgdGhlIGNvbnRleHQvZmxhdm9yIHRoZSBzYW1lICovCit2b2lkCithdG9tX3VkdGFfY2xlYXJfdGFncyAoQXRvbVVEVEEgKiB1ZHRhKQoreworICBpZiAodWR0YS0+ZW50cmllcykgeworICAgIGF0b21faW5mb19saXN0X2ZyZWUgKHVkdGEtPmVudHJpZXMpOworICAgIHVkdGEtPmVudHJpZXMgPSBOVUxMOworICB9CisgIGlmICh1ZHRhLT5tZXRhICYmIHVkdGEtPm1ldGEtPmlsc3QtPmVudHJpZXMpIHsKKyAgICBhdG9tX2luZm9fbGlzdF9mcmVlICh1ZHRhLT5tZXRhLT5pbHN0LT5lbnRyaWVzKTsKKyAgICB1ZHRhLT5tZXRhLT5pbHN0LT5lbnRyaWVzID0gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorYXRvbV90YWdfZGF0YV9pbml0IChBdG9tVGFnRGF0YSAqIGRhdGEpCit7CisgIGd1aW50OCBmbGFnc1tdID0geyAwLCAwLCAwIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZkYXRhLT5oZWFkZXIsIEZPVVJDQ19kYXRhLCAwLCAwLCAwLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3RhZ19kYXRhX2NsZWFyIChBdG9tVGFnRGF0YSAqIGRhdGEpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJmRhdGEtPmhlYWRlcik7CisgIGdfZnJlZSAoZGF0YS0+ZGF0YSk7CisgIGRhdGEtPmRhdGFsZW4gPSAwOworfQorCisvKgorICogRm91cmNjIGlzIHRoZSB0YWcgZm91cmNjCisgKiBmbGFncyB3aWxsIGJlIHRydW5jYXRlZCB0byAyNGJpdHMKKyAqLworc3RhdGljIEF0b21UYWcgKgorYXRvbV90YWdfbmV3IChndWludDMyIGZvdXJjYywgZ3VpbnQzMiBmbGFnc19hc191aW50KQoreworICBBdG9tVGFnICp0YWcgPSBnX25ldzAgKEF0b21UYWcsIDEpOworCisgIHRhZy0+aGVhZGVyLnR5cGUgPSBmb3VyY2M7CisgIGF0b21fdGFnX2RhdGFfaW5pdCAoJnRhZy0+ZGF0YSk7CisgIGF0b21fZnVsbF9zZXRfZmxhZ3NfYXNfdWludCAoJnRhZy0+ZGF0YS5oZWFkZXIsIGZsYWdzX2FzX3VpbnQpOworICByZXR1cm4gdGFnOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90YWdfZnJlZSAoQXRvbVRhZyAqIHRhZykKK3sKKyAgYXRvbV9jbGVhciAoJnRhZy0+aGVhZGVyKTsKKyAgYXRvbV90YWdfZGF0YV9jbGVhciAoJnRhZy0+ZGF0YSk7CisgIGdfZnJlZSAodGFnKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fbXZoZF9pbml0IChBdG9tTVZIRCAqIG12aGQpCit7CisgIGd1aW50OCBmbGFnc1szXSA9IHsgMCwgMCwgMCB9OworCisgIGF0b21fZnVsbF9pbml0ICgmKG12aGQtPmhlYWRlciksIEZPVVJDQ19tdmhkLCBzaXplb2YgKEF0b21NVkhEKSwgMCwgMCwgZmxhZ3MpOworCisgIGNvbW1vbl90aW1lX2luZm9faW5pdCAoJm12aGQtPnRpbWVfaW5mbyk7CisKKyAgbXZoZC0+cHJlZmVyZWRfcmF0ZSA9IDEgPDwgMTY7CisgIG12aGQtPnZvbHVtZSA9IDEgPDwgODsKKyAgbXZoZC0+cmVzZXJ2ZWQzID0gMDsKKyAgbWVtc2V0IChtdmhkLT5yZXNlcnZlZDQsIDAsIHNpemVvZiAoZ3VpbnQzMlsyXSkpOworCisgIG1lbXNldCAobXZoZC0+bWF0cml4LCAwLCBzaXplb2YgKGd1aW50MzJbOV0pKTsKKyAgbXZoZC0+bWF0cml4WzBdID0gMSA8PCAxNjsKKyAgbXZoZC0+bWF0cml4WzRdID0gMSA8PCAxNjsKKyAgbXZoZC0+bWF0cml4WzhdID0gMTYzODQgPDwgMTY7CisKKyAgbXZoZC0+cHJldmlld190aW1lID0gMDsKKyAgbXZoZC0+cHJldmlld19kdXJhdGlvbiA9IDA7CisgIG12aGQtPnBvc3Rlcl90aW1lID0gMDsKKyAgbXZoZC0+c2VsZWN0aW9uX3RpbWUgPSAwOworICBtdmhkLT5zZWxlY3Rpb25fZHVyYXRpb24gPSAwOworICBtdmhkLT5jdXJyZW50X3RpbWUgPSAwOworCisgIG12aGQtPm5leHRfdHJhY2tfaWQgPSAxOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9tdmhkX2NsZWFyIChBdG9tTVZIRCAqIG12aGQpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJm12aGQtPmhlYWRlcik7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX21laGRfaW5pdCAoQXRvbU1FSEQgKiBtZWhkKQoreworICBndWludDggZmxhZ3NbM10gPSB7IDAsIDAsIDAgfTsKKworICBhdG9tX2Z1bGxfaW5pdCAoJm1laGQtPmhlYWRlciwgRk9VUkNDX21laGQsIDAsIDAsIDEsIGZsYWdzKTsKKyAgbWVoZC0+ZnJhZ21lbnRfZHVyYXRpb24gPSAwOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9tdmV4X2luaXQgKEF0b21NVkVYICogbXZleCkKK3sKKyAgYXRvbV9oZWFkZXJfc2V0ICgmbXZleC0+aGVhZGVyLCBGT1VSQ0NfbXZleCwgMCwgMCk7CisgIGF0b21fbWVoZF9pbml0ICgmbXZleC0+bWVoZCk7CisgIG12ZXgtPnRyZXhzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdHJha19pbml0IChBdG9tVFJBSyAqIHRyYWssIEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIGF0b21faGVhZGVyX3NldCAoJnRyYWstPmhlYWRlciwgRk9VUkNDX3RyYWssIDAsIDApOworCisgIGF0b21fdGtoZF9pbml0ICgmdHJhay0+dGtoZCwgY29udGV4dCk7CisgIHRyYWstPmNvbnRleHQgPSBjb250ZXh0OworICBhdG9tX3VkdGFfaW5pdCAoJnRyYWstPnVkdGEsIGNvbnRleHQpOworICB0cmFrLT5lZHRzID0gTlVMTDsKKyAgYXRvbV9tZGlhX2luaXQgKCZ0cmFrLT5tZGlhLCBjb250ZXh0KTsKKyAgdHJhay0+dHJlZiA9IE5VTEw7Cit9CisKK0F0b21UUkFLICoKK2F0b21fdHJha19uZXcgKEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIEF0b21UUkFLICp0cmFrID0gZ19uZXcwIChBdG9tVFJBSywgMSk7CisKKyAgYXRvbV90cmFrX2luaXQgKHRyYWssIGNvbnRleHQpOworICByZXR1cm4gdHJhazsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdHJha19jbGVhciAoQXRvbVRSQUsgKiB0cmFrKQoreworICBhdG9tX2NsZWFyICgmdHJhay0+aGVhZGVyKTsKKyAgYXRvbV90a2hkX2NsZWFyICgmdHJhay0+dGtoZCk7CisgIGlmICh0cmFrLT5lZHRzKQorICAgIGF0b21fZWR0c19mcmVlICh0cmFrLT5lZHRzKTsKKyAgYXRvbV91ZHRhX2NsZWFyICgmdHJhay0+dWR0YSk7CisgIGF0b21fbWRpYV9jbGVhciAoJnRyYWstPm1kaWEpOworICBpZiAodHJhay0+dHJlZikKKyAgICBhdG9tX3RyZWZfZnJlZSAodHJhay0+dHJlZik7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3RyYWtfZnJlZSAoQXRvbVRSQUsgKiB0cmFrKQoreworICBhdG9tX3RyYWtfY2xlYXIgKHRyYWspOworICBnX2ZyZWUgKHRyYWspOworfQorCisKK3N0YXRpYyB2b2lkCithdG9tX21vb3ZfaW5pdCAoQXRvbU1PT1YgKiBtb292LCBBdG9tc0NvbnRleHQgKiBjb250ZXh0KQoreworICBhdG9tX2hlYWRlcl9zZXQgKCYobW9vdi0+aGVhZGVyKSwgRk9VUkNDX21vb3YsIDAsIDApOworICBhdG9tX212aGRfaW5pdCAoJihtb292LT5tdmhkKSk7CisgIGF0b21fbXZleF9pbml0ICgmKG1vb3YtPm12ZXgpKTsKKyAgYXRvbV91ZHRhX2luaXQgKCZtb292LT51ZHRhLCBjb250ZXh0KTsKKyAgbW9vdi0+dHJha3MgPSBOVUxMOworICBtb292LT5jb250ZXh0ID0gKmNvbnRleHQ7Cit9CisKK0F0b21NT09WICoKK2F0b21fbW9vdl9uZXcgKEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIEF0b21NT09WICptb292ID0gZ19uZXcwIChBdG9tTU9PViwgMSk7CisKKyAgYXRvbV9tb292X2luaXQgKG1vb3YsIGNvbnRleHQpOworICByZXR1cm4gbW9vdjsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdHJleF9mcmVlIChBdG9tVFJFWCAqIHRyZXgpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJnRyZXgtPmhlYWRlcik7CisgIGdfZnJlZSAodHJleCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX212ZXhfY2xlYXIgKEF0b21NVkVYICogbXZleCkKK3sKKyAgR0xpc3QgKndhbGtlcjsKKworICBhdG9tX2NsZWFyICgmbXZleC0+aGVhZGVyKTsKKyAgd2Fsa2VyID0gbXZleC0+dHJleHM7CisgIHdoaWxlICh3YWxrZXIpIHsKKyAgICBhdG9tX3RyZXhfZnJlZSAoKEF0b21UUkVYICopIHdhbGtlci0+ZGF0YSk7CisgICAgd2Fsa2VyID0gZ19saXN0X25leHQgKHdhbGtlcik7CisgIH0KKyAgZ19saXN0X2ZyZWUgKG12ZXgtPnRyZXhzKTsKKyAgbXZleC0+dHJleHMgPSBOVUxMOworfQorCit2b2lkCithdG9tX21vb3ZfZnJlZSAoQXRvbU1PT1YgKiBtb292KQoreworICBHTGlzdCAqd2Fsa2VyOworCisgIGF0b21fY2xlYXIgKCZtb292LT5oZWFkZXIpOworICBhdG9tX212aGRfY2xlYXIgKCZtb292LT5tdmhkKTsKKworICB3YWxrZXIgPSBtb292LT50cmFrczsKKyAgd2hpbGUgKHdhbGtlcikgeworICAgIGF0b21fdHJha19mcmVlICgoQXRvbVRSQUsgKikgd2Fsa2VyLT5kYXRhKTsKKyAgICB3YWxrZXIgPSBnX2xpc3RfbmV4dCAod2Fsa2VyKTsKKyAgfQorICBnX2xpc3RfZnJlZSAobW9vdi0+dHJha3MpOworICBtb292LT50cmFrcyA9IE5VTEw7CisKKyAgYXRvbV91ZHRhX2NsZWFyICgmbW9vdi0+dWR0YSk7CisgIGF0b21fbXZleF9jbGVhciAoJm1vb3YtPm12ZXgpOworCisgIGdfZnJlZSAobW9vdik7Cit9CisKKy8qIC0tIGVuZCBvZiBpbml0IC8gZnJlZSAtLSAqLworCisvKiAtLSBjb3B5IGRhdGEgZnVuY3Rpb25zIC0tICovCisKK3N0YXRpYyBndWludDgKK2F0b21fZnVsbF9nZXRfdmVyc2lvbiAoQXRvbUZ1bGwgKiBmdWxsKQoreworICByZXR1cm4gZnVsbC0+dmVyc2lvbjsKK30KKworc3RhdGljIGd1aW50NjQKK2NvbW1vbl90aW1lX2luZm9fY29weV9kYXRhIChUaW1lSW5mbyAqIHRpLCBnYm9vbGVhbiB0cnVuY190b18zMiwKKyAgICBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICh0cnVuY190b18zMikgeworICAgIHByb3BfY29weV91aW50MzIgKChndWludDMyKSB0aS0+Y3JlYXRpb25fdGltZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV91aW50MzIgKChndWludDMyKSB0aS0+bW9kaWZpY2F0aW9uX3RpbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICBwcm9wX2NvcHlfdWludDMyICh0aS0+dGltZXNjYWxlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgcHJvcF9jb3B5X3VpbnQzMiAoKGd1aW50MzIpIHRpLT5kdXJhdGlvbiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICB9IGVsc2UgeworICAgIHByb3BfY29weV91aW50NjQgKHRpLT5jcmVhdGlvbl90aW1lLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgcHJvcF9jb3B5X3VpbnQ2NCAodGktPm1vZGlmaWNhdGlvbl90aW1lLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgcHJvcF9jb3B5X3VpbnQzMiAodGktPnRpbWVzY2FsZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV91aW50NjQgKHRpLT5kdXJhdGlvbiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICB9CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgdm9pZAorYXRvbV93cml0ZV9zaXplIChndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCwKKyAgICBndWludDY0IGF0b21fcG9zKQoreworICAvKiB0aGlzIG9ubHkgd29ya3MgZm9yIG5vbi1leHRlbmRlZCBhdG9tIHNpemUsIHdoaWNoIGlzIE9LCisgICAqICh0aG91Z2ggaXQgY291bGQgYmUgbWFkZSB0byBkbyBtZW1fbW92ZSwgZXRjIGFuZCB3cml0ZSBleHRlbmRlZCBzaXplKSAqLworICBwcm9wX2NvcHlfdWludDMyICgqb2Zmc2V0IC0gYXRvbV9wb3MsIGJ1ZmZlciwgc2l6ZSwgJmF0b21fcG9zKTsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fY29weV9lbXB0eSAoQXRvbSAqIGF0b20sIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBwcm9wX2NvcHlfdWludDMyICgwLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK2d1aW50NjQKK2F0b21fY29weV9kYXRhIChBdG9tICogYXRvbSwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICAvKiBjb3BpZXMgdHlwZSBhbmQgc2l6ZSAqLworICBwcm9wX2NvcHlfdWludDMyIChhdG9tLT5zaXplLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV9mb3VyY2MgKGF0b20tPnR5cGUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICAvKiBleHRlbmRlZCBzaXplIG5lZWRlZCAqLworICBpZiAoYXRvbS0+c2l6ZSA9PSAxKSB7CisgICAgLyogcmVhbGx5IHNob3VsZCBub3QgaGFwcGVuIG90aGVyIHRoYW4gd2l0aCBtZGF0IGF0b207CisgICAgICogd291bGQgYmUgYSBwcm9ibGVtIGZvciBzaXplIChyZSl3cml0ZSBjb2RlLCBub3QgdG8gbWVudGlvbiBtZW1vcnkgKi8KKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCAoYXRvbS0+dHlwZSA9PSBGT1VSQ0NfbWRhdCwgMCk7CisgICAgcHJvcF9jb3B5X3VpbnQ2NCAoYXRvbS0+ZXh0ZW5kZWRfc2l6ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICB9CisKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX2Z1bGxfY29weV9kYXRhIChBdG9tRnVsbCAqIGF0b20sIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fY29weV9kYXRhICgmYXRvbS0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByb3BfY29weV91aW50OCAoYXRvbS0+dmVyc2lvbiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDhfYXJyYXkgKGF0b20tPmZsYWdzLCAzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX2luZm9fbGlzdF9jb3B5X2RhdGEgKEdMaXN0ICogYWksIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICB3aGlsZSAoYWkpIHsKKyAgICBBdG9tSW5mbyAqaW5mbyA9IChBdG9tSW5mbyAqKSBhaS0+ZGF0YTsKKworICAgIGlmICghaW5mby0+Y29weV9kYXRhX2Z1bmMgKGluZm8tPmF0b20sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFpID0gZ19saXN0X25leHQgKGFpKTsKKyAgfQorCisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV9kYXRhX2NvcHlfZGF0YSAoQXRvbURhdGEgKiBkYXRhLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX2NvcHlfZGF0YSAoJmRhdGEtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGRhdGEtPmRhdGFsZW4pCisgICAgcHJvcF9jb3B5X3VpbnQ4X2FycmF5IChkYXRhLT5kYXRhLCBkYXRhLT5kYXRhbGVuLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX3V1aWRfY29weV9kYXRhIChBdG9tVVVJRCAqIHV1aWQsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fY29weV9kYXRhICgmdXVpZC0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwcm9wX2NvcHlfdWludDhfYXJyYXkgKHV1aWQtPnV1aWQsIDE2LCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIGlmICh1dWlkLT5kYXRhbGVuKQorICAgIHByb3BfY29weV91aW50OF9hcnJheSAodXVpZC0+ZGF0YSwgdXVpZC0+ZGF0YWxlbiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitndWludDY0CithdG9tX2Z0eXBfY29weV9kYXRhIChBdG9tRlRZUCAqIGZ0eXAsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fY29weV9kYXRhICgmZnR5cC0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwcm9wX2NvcHlfZm91cmNjIChmdHlwLT5tYWpvcl9icmFuZCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChmdHlwLT52ZXJzaW9uLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgcHJvcF9jb3B5X2ZvdXJjY19hcnJheSAoZnR5cC0+Y29tcGF0aWJsZV9icmFuZHMsIGZ0eXAtPmNvbXBhdGlibGVfYnJhbmRzX3NpemUsCisgICAgICBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK2d1aW50NjQKK2F0b21fbXZoZF9jb3B5X2RhdGEgKEF0b21NVkhEICogYXRvbSwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ4IHZlcnNpb247CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fZnVsbF9jb3B5X2RhdGEgKCYoYXRvbS0+aGVhZGVyKSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB2ZXJzaW9uID0gYXRvbV9mdWxsX2dldF92ZXJzaW9uICgmKGF0b20tPmhlYWRlcikpOworICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgY29tbW9uX3RpbWVfaW5mb19jb3B5X2RhdGEgKCZhdG9tLT50aW1lX2luZm8sIFRSVUUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICBjb21tb25fdGltZV9pbmZvX2NvcHlfZGF0YSAoJmF0b20tPnRpbWVfaW5mbywgRkFMU0UsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgfSBlbHNlIHsKKyAgICAqb2Zmc2V0ID0gb3JpZ2luYWxfb2Zmc2V0OworICAgIHJldHVybiAwOworICB9CisKKyAgcHJvcF9jb3B5X3VpbnQzMiAoYXRvbS0+cHJlZmVyZWRfcmF0ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDE2IChhdG9tLT52b2x1bWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQxNiAoYXRvbS0+cmVzZXJ2ZWQzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MzJfYXJyYXkgKGF0b20tPnJlc2VydmVkNCwgMiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyX2FycmF5IChhdG9tLT5tYXRyaXgsIDksIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMiAoYXRvbS0+cHJldmlld190aW1lLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MzIgKGF0b20tPnByZXZpZXdfZHVyYXRpb24sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMiAoYXRvbS0+cG9zdGVyX3RpbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMiAoYXRvbS0+c2VsZWN0aW9uX3RpbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMiAoYXRvbS0+c2VsZWN0aW9uX2R1cmF0aW9uLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MzIgKGF0b20tPmN1cnJlbnRfdGltZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIHByb3BfY29weV91aW50MzIgKGF0b20tPm5leHRfdHJhY2tfaWQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fdGtoZF9jb3B5X2RhdGEgKEF0b21US0hEICogdGtoZCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnRraGQtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoYXRvbV9mdWxsX2dldF92ZXJzaW9uICgmdGtoZC0+aGVhZGVyKSA9PSAwKSB7CisgICAgcHJvcF9jb3B5X3VpbnQzMiAoKGd1aW50MzIpIHRraGQtPmNyZWF0aW9uX3RpbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICBwcm9wX2NvcHlfdWludDMyICgoZ3VpbnQzMikgdGtoZC0+bW9kaWZpY2F0aW9uX3RpbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICBwcm9wX2NvcHlfdWludDMyICh0a2hkLT50cmFja19JRCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV91aW50MzIgKHRraGQtPnJlc2VydmVkLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgcHJvcF9jb3B5X3VpbnQzMiAoKGd1aW50MzIpIHRraGQtPmR1cmF0aW9uLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIH0gZWxzZSB7CisgICAgcHJvcF9jb3B5X3VpbnQ2NCAodGtoZC0+Y3JlYXRpb25fdGltZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV91aW50NjQgKHRraGQtPm1vZGlmaWNhdGlvbl90aW1lLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgcHJvcF9jb3B5X3VpbnQzMiAodGtoZC0+dHJhY2tfSUQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICBwcm9wX2NvcHlfdWludDMyICh0a2hkLT5yZXNlcnZlZCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV91aW50NjQgKHRraGQtPmR1cmF0aW9uLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyX2FycmF5ICh0a2hkLT5yZXNlcnZlZDIsIDIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQxNiAodGtoZC0+bGF5ZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQxNiAodGtoZC0+YWx0ZXJuYXRlX2dyb3VwLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKHRraGQtPnZvbHVtZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDE2ICh0a2hkLT5yZXNlcnZlZDMsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMl9hcnJheSAodGtoZC0+bWF0cml4LCA5LCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgcHJvcF9jb3B5X3VpbnQzMiAodGtoZC0+d2lkdGgsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMiAodGtoZC0+aGVpZ2h0LCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX2hkbHJfY29weV9kYXRhIChBdG9tSERMUiAqIGhkbHIsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fZnVsbF9jb3B5X2RhdGEgKCZoZGxyLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcHJvcF9jb3B5X2ZvdXJjYyAoaGRsci0+Y29tcG9uZW50X3R5cGUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X2ZvdXJjYyAoaGRsci0+aGFuZGxlcl90eXBlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV9mb3VyY2MgKGhkbHItPm1hbnVmYWN0dXJlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChoZGxyLT5mbGFncywgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChoZGxyLT5mbGFnc19tYXNrLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgaWYgKGhkbHItPmZsYXZvciA9PSBBVE9NU19UUkVFX0ZMQVZPUl9NT1YpIHsKKyAgICBwcm9wX2NvcHlfc2l6ZV9zdHJpbmcgKChndWludDggKikgaGRsci0+bmFtZSwgc3RybGVuIChoZGxyLT5uYW1lKSwgYnVmZmVyLAorICAgICAgICBzaXplLCBvZmZzZXQpOworICB9IGVsc2UgeworICAgIC8qIGFzc3VtZSBpc29tZWRpYSBiYXNlIGlzIG1vcmUgZ2VuZXJpYyBhbmQgdXNlIG51bGwgdGVybWluYXRlZCAqLworICAgIHByb3BfY29weV9udWxsX3Rlcm1pbmF0ZWRfc3RyaW5nIChoZGxyLT5uYW1lLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fdm1oZF9jb3B5X2RhdGEgKEF0b21WTUhEICogdm1oZCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnZtaGQtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcHJvcF9jb3B5X3VpbnQxNiAodm1oZC0+Z3JhcGhpY3NfbW9kZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDE2X2FycmF5ICh2bWhkLT5vcGNvbG9yLCAzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuIG9yaWdpbmFsX29mZnNldCAtICpvZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX3NtaGRfY29weV9kYXRhIChBdG9tU01IRCAqIHNtaGQsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fZnVsbF9jb3B5X2RhdGEgKCZzbWhkLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIHByb3BfY29weV91aW50MTYgKHNtaGQtPmJhbGFuY2UsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQxNiAoc21oZC0+cmVzZXJ2ZWQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gb3JpZ2luYWxfb2Zmc2V0IC0gKm9mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21faG1oZF9jb3B5X2RhdGEgKEF0b21ITUhEICogaG1oZCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJmhtaGQtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcHJvcF9jb3B5X3VpbnQxNiAoaG1oZC0+bWF4X3BkdV9zaXplLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKGhtaGQtPmF2Z19wZHVfc2l6ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChobWhkLT5tYXhfYml0cmF0ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChobWhkLT5hdmdfYml0cmF0ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChobWhkLT5zbGlkaW5nX2F2Z19iaXRyYXRlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuIG9yaWdpbmFsX29mZnNldCAtICpvZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX3RjbWlfY29weV9kYXRhIChBdG9tVENNSSAqIHRjbWksIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fZnVsbF9jb3B5X2RhdGEgKCZ0Y21pLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIHByb3BfY29weV91aW50MTYgKHRjbWktPnRleHRfZm9udCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDE2ICh0Y21pLT50ZXh0X2ZhY2UsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQxNiAodGNtaS0+dGV4dF9zaXplLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKHRjbWktPnRleHRfY29sb3JbMF0sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQxNiAodGNtaS0+dGV4dF9jb2xvclsxXSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDE2ICh0Y21pLT50ZXh0X2NvbG9yWzJdLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKHRjbWktPmJnX2NvbG9yWzBdLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKHRjbWktPmJnX2NvbG9yWzFdLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKHRjbWktPmJnX2NvbG9yWzJdLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIC8qIHJlc2VydmVkICovCisgIHByb3BfY29weV91aW50MTYgKDAsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3NpemVfc3RyaW5nICgoZ3VpbnQ4ICopIHRjbWktPmZvbnRfbmFtZSwgc3RybGVuICh0Y21pLT5mb250X25hbWUpLAorICAgICAgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiBvcmlnaW5hbF9vZmZzZXQgLSAqb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV90bWNkX2NvcHlfZGF0YSAoQXRvbVRNQ0QgKiB0bWNkLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX2NvcHlfZGF0YSAoJnRtY2QtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFhdG9tX3RjbWlfY29weV9kYXRhICgmdG1jZC0+dGNtaSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gb3JpZ2luYWxfb2Zmc2V0IC0gKm9mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fZ21pbl9jb3B5X2RhdGEgKEF0b21HTUlOICogZ21pbiwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJmdtaW4tPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcHJvcF9jb3B5X3VpbnQxNiAoZ21pbi0+Z3JhcGhpY3NfbW9kZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDE2IChnbWluLT5vcGNvbG9yWzBdLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKGdtaW4tPm9wY29sb3JbMV0sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQxNiAoZ21pbi0+b3Bjb2xvclsyXSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDggKGdtaW4tPmJhbGFuY2UsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgLyogcmVzZXJ2ZWQgKi8KKyAgcHJvcF9jb3B5X3VpbnQ4ICgwLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuIG9yaWdpbmFsX29mZnNldCAtICpvZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX2dtaGRfY29weV9kYXRhIChBdG9tR01IRCAqIGdtaGQsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fY29weV9kYXRhICgmZ21oZC0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIWF0b21fZ21pbl9jb3B5X2RhdGEgKCZnbWhkLT5nbWluLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIWF0b21fdG1jZF9jb3B5X2RhdGEgKCZnbWhkLT50bWNkLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiBvcmlnaW5hbF9vZmZzZXQgLSAqb2Zmc2V0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2F0b21fdXJsX3NhbWVfZmlsZV9mbGFnIChBdG9tVVJMICogdXJsKQoreworICByZXR1cm4gKHVybC0+aGVhZGVyLmZsYWdzWzJdICYgMHgxKSA9PSAxOworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV91cmxfY29weV9kYXRhIChBdG9tVVJMICogdXJsLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX2Z1bGxfY29weV9kYXRhICgmdXJsLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFhdG9tX3VybF9zYW1lX2ZpbGVfZmxhZyAodXJsKSkgeworICAgIHByb3BfY29weV9udWxsX3Rlcm1pbmF0ZWRfc3RyaW5nICh1cmwtPmxvY2F0aW9uLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gb3JpZ2luYWxfb2Zmc2V0IC0gKm9mZnNldDsKK30KKworZ3VpbnQ2NAorYXRvbV9zdHRzX2NvcHlfZGF0YSAoQXRvbVNUVFMgKiBzdHRzLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisgIGd1aW50IGk7CisKKyAgaWYgKCFhdG9tX2Z1bGxfY29weV9kYXRhICgmc3R0cy0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByb3BfY29weV91aW50MzIgKGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0dHMtPmVudHJpZXMpLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIC8qIG1pbmltaXplIHJlYWxsb2MgKi8KKyAgcHJvcF9jb3B5X2Vuc3VyZV9idWZmZXIgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LAorICAgICAgOCAqIGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0dHMtPmVudHJpZXMpKTsKKyAgZm9yIChpID0gMDsgaSA8IGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0dHMtPmVudHJpZXMpOyBpKyspIHsKKyAgICBTVFRTRW50cnkgKmVudHJ5ID0gJmF0b21fYXJyYXlfaW5kZXggKCZzdHRzLT5lbnRyaWVzLCBpKTsKKworICAgIHByb3BfY29weV91aW50MzIgKGVudHJ5LT5zYW1wbGVfY291bnQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICBwcm9wX2NvcHlfaW50MzIgKGVudHJ5LT5zYW1wbGVfZGVsdGEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgfQorCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV9zYW1wbGVfZW50cnlfY29weV9kYXRhIChTYW1wbGVUYWJsZUVudHJ5ICogc2UsIGd1aW50OCAqKiBidWZmZXIsCisgICAgZ3VpbnQ2NCAqIHNpemUsIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fY29weV9kYXRhICgmc2UtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDhfYXJyYXkgKHNlLT5yZXNlcnZlZCwgNiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDE2IChzZS0+ZGF0YV9yZWZlcmVuY2VfaW5kZXgsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fZXNkc19jb3B5X2RhdGEgKEF0b21FU0RTICogZXNkcywgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJmVzZHMtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFkZXNjX2VzX2Rlc2NyaXB0b3JfY29weV9kYXRhICgmZXNkcy0+ZXMsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX2ZybWFfY29weV9kYXRhIChBdG9tRlJNQSAqIGZybWEsIGd1aW50OCAqKiBidWZmZXIsCisgICAgZ3VpbnQ2NCAqIHNpemUsIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fY29weV9kYXRhICgmKGZybWEtPmhlYWRlciksIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkKKyAgICByZXR1cm4gMDsKKworICBwcm9wX2NvcHlfZm91cmNjIChmcm1hLT5tZWRpYV90eXBlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX2hpbnRfc2FtcGxlX2VudHJ5X2NvcHlfZGF0YSAoQXRvbUhpbnRTYW1wbGVFbnRyeSAqIGhzZSwgZ3VpbnQ4ICoqIGJ1ZmZlciwKKyAgICBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9zYW1wbGVfZW50cnlfY29weV9kYXRhICgmaHNlLT5zZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyIChoc2UtPnNpemUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQ4X2FycmF5IChoc2UtPmRhdGEsIGhzZS0+c2l6ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorc2FtcGxlX2VudHJ5X21wNGFfY29weV9kYXRhIChTYW1wbGVUYWJsZUVudHJ5TVA0QSAqIG1wNGEsIGd1aW50OCAqKiBidWZmZXIsCisgICAgZ3VpbnQ2NCAqIHNpemUsIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fc2FtcGxlX2VudHJ5X2NvcHlfZGF0YSAoJm1wNGEtPnNlLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByb3BfY29weV91aW50MTYgKG1wNGEtPnZlcnNpb24sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQxNiAobXA0YS0+cmV2aXNpb25fbGV2ZWwsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMiAobXA0YS0+dmVuZG9yLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKG1wNGEtPmNoYW5uZWxzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKG1wNGEtPnNhbXBsZV9zaXplLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKG1wNGEtPmNvbXByZXNzaW9uX2lkLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKG1wNGEtPnBhY2tldF9zaXplLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MzIgKG1wNGEtPnNhbXBsZV9yYXRlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgLyogdGhpcyBzaG91bGQgYWx3YXlzIGJlIDAgZm9yIG1wNCBmbGF2b3IgKi8KKyAgaWYgKG1wNGEtPnZlcnNpb24gPT0gMSkgeworICAgIHByb3BfY29weV91aW50MzIgKG1wNGEtPnNhbXBsZXNfcGVyX3BhY2tldCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV91aW50MzIgKG1wNGEtPmJ5dGVzX3Blcl9wYWNrZXQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICBwcm9wX2NvcHlfdWludDMyIChtcDRhLT5ieXRlc19wZXJfZnJhbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICBwcm9wX2NvcHlfdWludDMyIChtcDRhLT5ieXRlc19wZXJfc2FtcGxlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIH0KKworICBpZiAobXA0YS0+ZXh0ZW5zaW9uX2F0b21zKSB7CisgICAgaWYgKCFhdG9tX2luZm9fbGlzdF9jb3B5X2RhdGEgKG1wNGEtPmV4dGVuc2lvbl9hdG9tcywgYnVmZmVyLCBzaXplLCBvZmZzZXQpKQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK3NhbXBsZV9lbnRyeV9tcDR2X2NvcHlfZGF0YSAoU2FtcGxlVGFibGVFbnRyeU1QNFYgKiBtcDR2LCBndWludDggKiogYnVmZmVyLAorICAgIGd1aW50NjQgKiBzaXplLCBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX3NhbXBsZV9lbnRyeV9jb3B5X2RhdGEgKCZtcDR2LT5zZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDE2IChtcDR2LT52ZXJzaW9uLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKG1wNHYtPnJldmlzaW9uX2xldmVsLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV9mb3VyY2MgKG1wNHYtPnZlbmRvciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChtcDR2LT50ZW1wb3JhbF9xdWFsaXR5LCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MzIgKG1wNHYtPnNwYXRpYWxfcXVhbGl0eSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIHByb3BfY29weV91aW50MTYgKG1wNHYtPndpZHRoLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKG1wNHYtPmhlaWdodCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIHByb3BfY29weV91aW50MzIgKG1wNHYtPmhvcml6b250YWxfcmVzb2x1dGlvbiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChtcDR2LT52ZXJ0aWNhbF9yZXNvbHV0aW9uLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MzIgKG1wNHYtPmRhdGFzaXplLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgcHJvcF9jb3B5X3VpbnQxNiAobXA0di0+ZnJhbWVfY291bnQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBwcm9wX2NvcHlfZml4ZWRfc2l6ZV9zdHJpbmcgKChndWludDggKikgbXA0di0+Y29tcHJlc3NvciwgMzIsIGJ1ZmZlciwgc2l6ZSwKKyAgICAgIG9mZnNldCk7CisKKyAgcHJvcF9jb3B5X3VpbnQxNiAobXA0di0+ZGVwdGgsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQxNiAobXA0di0+Y29sb3JfdGFibGVfaWQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICAvKiBleHRyYSBhdG9tcyAqLworICBpZiAobXA0di0+ZXh0ZW5zaW9uX2F0b21zICYmCisgICAgICAhYXRvbV9pbmZvX2xpc3RfY29weV9kYXRhIChtcDR2LT5leHRlbnNpb25fYXRvbXMsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkKKyAgICByZXR1cm4gMDsKKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK3NhbXBsZV9lbnRyeV90eDNnX2NvcHlfZGF0YSAoU2FtcGxlVGFibGVFbnRyeVRYM0cgKiB0eDNnLCBndWludDggKiogYnVmZmVyLAorICAgIGd1aW50NjQgKiBzaXplLCBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX3NhbXBsZV9lbnRyeV9jb3B5X2RhdGEgKCZ0eDNnLT5zZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyICh0eDNnLT5kaXNwbGF5X2ZsYWdzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgLyogcmVzZXJ2ZWQgKi8KKyAgcHJvcF9jb3B5X3VpbnQ4ICgxLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50OCAoLTEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMiAoMCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIHByb3BfY29weV91aW50NjQgKHR4M2ctPmRlZmF1bHRfdGV4dF9ib3gsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICAvKiByZXNlcnZlZCAqLworICBwcm9wX2NvcHlfdWludDMyICgwLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgcHJvcF9jb3B5X3VpbnQxNiAodHgzZy0+Zm9udF9pZCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDggKHR4M2ctPmZvbnRfZmFjZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDggKHR4M2ctPmZvbnRfc2l6ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyICh0eDNnLT5mb3JlZ3JvdW5kX2NvbG9yX3JnYmEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICAvKiBpdCBtdXN0IGhhdmUgYSBmb250dGFibGUgYXRvbSAqLworICB7CisgICAgQXRvbSBhdG9tOworCisgICAgYXRvbV9oZWFkZXJfc2V0ICgmYXRvbSwgRk9VUkNDX2Z0YWIsIDE4LCAwKTsKKyAgICBpZiAoIWF0b21fY29weV9kYXRhICgmYXRvbSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKQorICAgICAgcmV0dXJuIDA7CisgICAgcHJvcF9jb3B5X3VpbnQxNiAoMSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOyAvKiBDb3VudCBtdXN0IGJlIDEgKi8KKyAgICBwcm9wX2NvcHlfdWludDE2ICgxLCBidWZmZXIsIHNpemUsIG9mZnNldCk7IC8qIEZvbnQgaWQ6IDEgKi8KKyAgICBwcm9wX2NvcHlfc2l6ZV9zdHJpbmcgKChndWludDggKikgIlNlcmlmIiwgNSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CitzYW1wbGVfZW50cnlfdG1jZF9jb3B5X2RhdGEgKFNhbXBsZVRhYmxlRW50cnlUTUNEICogdG1jZCwgZ3VpbnQ4ICoqIGJ1ZmZlciwKKyAgICBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9zYW1wbGVfZW50cnlfY29weV9kYXRhICgmdG1jZC0+c2UsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLyogcmVzZXJ2ZWQgKi8KKyAgcHJvcF9jb3B5X3VpbnQzMiAoMCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIHByb3BfY29weV91aW50MzIgKHRtY2QtPnRjX2ZsYWdzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MzIgKHRtY2QtPnRpbWVzY2FsZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyICh0bWNkLT5mcmFtZV9kdXJhdGlvbiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDggKHRtY2QtPm5fZnJhbWVzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgLyogcmVzZXJ2ZWQgKi8KKyAgcHJvcF9jb3B5X3VpbnQ4ICgwLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHsKKyAgICBBdG9tIGF0b207CisgICAgZ3VpbnQ2NCBuYW1lX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgICBhdG9tX2hlYWRlcl9zZXQgKCZhdG9tLCBGT1VSQ0NfbmFtZSwgMCwgMCk7CisgICAgaWYgKCFhdG9tX2NvcHlfZGF0YSAoJmF0b20sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkKKyAgICAgIHJldHVybiAwOworICAgIHByb3BfY29weV91aW50MTYgKHN0cmxlbiAodG1jZC0+bmFtZS5uYW1lKSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV91aW50MTYgKHRtY2QtPm5hbWUubGFuZ3VhZ2VfY29kZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV9maXhlZF9zaXplX3N0cmluZyAoKGd1aW50OCAqKSB0bWNkLT5uYW1lLm5hbWUsCisgICAgICAgIHN0cmxlbiAodG1jZC0+bmFtZS5uYW1lKSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgICAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgbmFtZV9vZmZzZXQpOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK2d1aW50NjQKK2F0b21fc3Rzel9jb3B5X2RhdGEgKEF0b21TVFNaICogc3RzeiwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworICBndWludCBpOworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnN0c3otPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyIChzdHN6LT5zYW1wbGVfc2l6ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChzdHN6LT50YWJsZV9zaXplLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIGlmIChzdHN6LT5zYW1wbGVfc2l6ZSA9PSAwKSB7CisgICAgLyogbWluaW1pemUgcmVhbGxvYyAqLworICAgIHByb3BfY29weV9lbnN1cmVfYnVmZmVyIChidWZmZXIsIHNpemUsIG9mZnNldCwgNCAqIHN0c3otPnRhYmxlX3NpemUpOworICAgIC8qIGVudHJ5IGNvdW50IG11c3QgbWF0Y2ggc2FtcGxlIGNvdW50ICovCisgICAgZ19hc3NlcnQgKGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0c3otPmVudHJpZXMpID09IHN0c3otPnRhYmxlX3NpemUpOworICAgIGZvciAoaSA9IDA7IGkgPCBhdG9tX2FycmF5X2dldF9sZW4gKCZzdHN6LT5lbnRyaWVzKTsgaSsrKSB7CisgICAgICBwcm9wX2NvcHlfdWludDMyIChhdG9tX2FycmF5X2luZGV4ICgmc3Rzei0+ZW50cmllcywgaSksIGJ1ZmZlciwgc2l6ZSwKKyAgICAgICAgICBvZmZzZXQpOworICAgIH0KKyAgfQorCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitndWludDY0CithdG9tX3N0c2NfY29weV9kYXRhIChBdG9tU1RTQyAqIHN0c2MsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKyAgZ3VpbnQgaSwgbGVuOworICBnYm9vbGVhbiBsYXN0X2VudHJpZXNfbWVyZ2VkID0gRkFMU0U7CisKKyAgaWYgKCFhdG9tX2Z1bGxfY29weV9kYXRhICgmc3RzYy0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qIExhc3QgdHdvIGVudHJpZXMgbWlnaHQgYmUgdGhlIHNhbWUgc2l6ZSBoZXJlIGFzIHdlIG9ubHkgbWVyZ2Ugb25jZSB0aGUKKyAgICogbmV4dCBjaHVuayBpcyBzdGFydGVkICovCisgIGlmICgobGVuID0gYXRvbV9hcnJheV9nZXRfbGVuICgmc3RzYy0+ZW50cmllcykpID4gMSAmJgorICAgICAgKChhdG9tX2FycmF5X2luZGV4ICgmc3RzYy0+ZW50cmllcywgbGVuIC0gMSkpLnNhbXBsZXNfcGVyX2NodW5rID09CisgICAgICAgICAgKGF0b21fYXJyYXlfaW5kZXggKCZzdHNjLT5lbnRyaWVzLCBsZW4gLSAyKSkuc2FtcGxlc19wZXJfY2h1bmspKSB7CisgICAgc3RzYy0+ZW50cmllcy5sZW4tLTsKKyAgICBsYXN0X2VudHJpZXNfbWVyZ2VkID0gVFJVRTsKKyAgfQorCisgIHByb3BfY29weV91aW50MzIgKGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0c2MtPmVudHJpZXMpLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIC8qIG1pbmltaXplIHJlYWxsb2MgKi8KKyAgcHJvcF9jb3B5X2Vuc3VyZV9idWZmZXIgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LAorICAgICAgMTIgKiBhdG9tX2FycmF5X2dldF9sZW4gKCZzdHNjLT5lbnRyaWVzKSk7CisKKyAgZm9yIChpID0gMDsgaSA8IGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0c2MtPmVudHJpZXMpOyBpKyspIHsKKyAgICBTVFNDRW50cnkgKmVudHJ5ID0gJmF0b21fYXJyYXlfaW5kZXggKCZzdHNjLT5lbnRyaWVzLCBpKTsKKworICAgIHByb3BfY29weV91aW50MzIgKGVudHJ5LT5maXJzdF9jaHVuaywgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV91aW50MzIgKGVudHJ5LT5zYW1wbGVzX3Blcl9jaHVuaywgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIHByb3BfY29weV91aW50MzIgKGVudHJ5LT5zYW1wbGVfZGVzY3JpcHRpb25faW5kZXgsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgfQorCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisKKyAgLyogTmVlZCB0byBhZGQgdGhlIGxhc3QgZW50cnkgYWdhaW4gYXMgaW4gInJvYnVzdCIgbXV4aW5nIG1vZGUgd2Ugd2lsbCBtb3N0CisgICAqIGxpa2VseSBhZGQgbmV3IHNhbXBsZXMgdG8gdGhlIGxhc3QgY2h1bmssIHRodXMgbWFraW5nIHRoZQorICAgKiBzYW1wbGVzX3Blcl9jaHVuayBpbiB0aGUgbGFzdCBvbmUgZGlmZmVyZW50IHRvIHRoZSBzZWNvbmQgdG8gbGFzdCBvbmUsCisgICAqIGFuZCB0aHVzIG1ha2luZyBpdCB3cm9uZyB0byBrZWVwIHRoZW0gbWVyZ2VkCisgICAqLworICBpZiAobGFzdF9lbnRyaWVzX21lcmdlZCkKKyAgICBzdHNjLT5lbnRyaWVzLmxlbisrOworCisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitndWludDY0CithdG9tX2N0dHNfY29weV9kYXRhIChBdG9tQ1RUUyAqIGN0dHMsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKyAgZ3VpbnQgaTsKKworICBpZiAoIWF0b21fZnVsbF9jb3B5X2RhdGEgKCZjdHRzLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcHJvcF9jb3B5X3VpbnQzMiAoYXRvbV9hcnJheV9nZXRfbGVuICgmY3R0cy0+ZW50cmllcyksIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgLyogbWluaW1pemUgcmVhbGxvYyAqLworICBwcm9wX2NvcHlfZW5zdXJlX2J1ZmZlciAoYnVmZmVyLCBzaXplLCBvZmZzZXQsCisgICAgICA4ICogYXRvbV9hcnJheV9nZXRfbGVuICgmY3R0cy0+ZW50cmllcykpOworICBmb3IgKGkgPSAwOyBpIDwgYXRvbV9hcnJheV9nZXRfbGVuICgmY3R0cy0+ZW50cmllcyk7IGkrKykgeworICAgIENUVFNFbnRyeSAqZW50cnkgPSAmYXRvbV9hcnJheV9pbmRleCAoJmN0dHMtPmVudHJpZXMsIGkpOworCisgICAgcHJvcF9jb3B5X3VpbnQzMiAoZW50cnktPnNhbXBsZWNvdW50LCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgcHJvcF9jb3B5X3VpbnQzMiAoZW50cnktPnNhbXBsZW9mZnNldCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK2d1aW50NjQKK2F0b21fc3ZtaV9jb3B5X2RhdGEgKEF0b21TVk1JICogc3ZtaSwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnN2bWktPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDggKHN2bWktPnN0ZXJlb3Njb3BpY19jb21wb3NpdGlvbl90eXBlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50OCAoc3ZtaS0+aXNfbGVmdF9maXJzdCA/IDEgOiAwLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIC8qIHN0ZXJlby1tb25vIGNoYW5nZSBjb3VudCAqLworICBwcm9wX2NvcHlfdWludDMyICgwLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK2d1aW50NjQKK2F0b21fc3RjbzY0X2NvcHlfZGF0YSAoQXRvbVNUQ082NCAqIHN0Y282NCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworICBndWludCBpOworICBnYm9vbGVhbiB0cnVuY190b18zMiA9IHN0Y282NC0+aGVhZGVyLmhlYWRlci50eXBlID09IEZPVVJDQ19zdGNvOworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnN0Y282NC0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByb3BfY29weV91aW50MzIgKGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0Y282NC0+ZW50cmllcyksIGJ1ZmZlciwgc2l6ZSwKKyAgICAgIG9mZnNldCk7CisKKyAgLyogbWluaW1pemUgcmVhbGxvYyAqLworICBwcm9wX2NvcHlfZW5zdXJlX2J1ZmZlciAoYnVmZmVyLCBzaXplLCBvZmZzZXQsCisgICAgICA4ICogYXRvbV9hcnJheV9nZXRfbGVuICgmc3RjbzY0LT5lbnRyaWVzKSk7CisgIGZvciAoaSA9IDA7IGkgPCBhdG9tX2FycmF5X2dldF9sZW4gKCZzdGNvNjQtPmVudHJpZXMpOyBpKyspIHsKKyAgICBndWludDY0IHZhbHVlID0KKyAgICAgICAgYXRvbV9hcnJheV9pbmRleCAoJnN0Y282NC0+ZW50cmllcywgaSkgKyBzdGNvNjQtPmNodW5rX29mZnNldDsKKworICAgIGlmICh0cnVuY190b18zMikgeworICAgICAgcHJvcF9jb3B5X3VpbnQzMiAoKGd1aW50MzIpIHZhbHVlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3BfY29weV91aW50NjQgKHZhbHVlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgfQorICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK2d1aW50NjQKK2F0b21fc3Rzc19jb3B5X2RhdGEgKEF0b21TVFNTICogc3RzcywgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworICBndWludCBpOworCisgIGlmIChhdG9tX2FycmF5X2dldF9sZW4gKCZzdHNzLT5lbnRyaWVzKSA9PSAwKSB7CisgICAgLyogRklYTUUgbm90IG5lZWRpbmcgdGhpcyBhdG9tIG1pZ2h0IGJlIGNvbmZ1c2VkIHdpdGggZXJyb3Igd2hpbGUgY29weWluZyAqLworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFhdG9tX2Z1bGxfY29weV9kYXRhICgmc3Rzcy0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByb3BfY29weV91aW50MzIgKGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0c3MtPmVudHJpZXMpLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIC8qIG1pbmltaXplIHJlYWxsb2MgKi8KKyAgcHJvcF9jb3B5X2Vuc3VyZV9idWZmZXIgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LAorICAgICAgNCAqIGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0c3MtPmVudHJpZXMpKTsKKyAgZm9yIChpID0gMDsgaSA8IGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0c3MtPmVudHJpZXMpOyBpKyspIHsKKyAgICBwcm9wX2NvcHlfdWludDMyIChhdG9tX2FycmF5X2luZGV4ICgmc3Rzcy0+ZW50cmllcywgaSksIGJ1ZmZlciwgc2l6ZSwKKyAgICAgICAgb2Zmc2V0KTsKKyAgfQorCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV9zdHNkX2NvcHlfZGF0YSAoQXRvbVNUU0QgKiBzdHNkLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisgIEdMaXN0ICp3YWxrZXI7CisKKyAgaWYgKCFhdG9tX2Z1bGxfY29weV9kYXRhICgmc3RzZC0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByb3BfY29weV91aW50MzIgKHN0c2QtPm5fZW50cmllcywgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGZvciAod2Fsa2VyID0gZ19saXN0X2xhc3QgKHN0c2QtPmVudHJpZXMpOyB3YWxrZXIgIT0gTlVMTDsKKyAgICAgIHdhbGtlciA9IGdfbGlzdF9wcmV2aW91cyAod2Fsa2VyKSkgeworICAgIFNhbXBsZVRhYmxlRW50cnkgKnNlID0gKFNhbXBsZVRhYmxlRW50cnkgKikgd2Fsa2VyLT5kYXRhOworCisgICAgc3dpdGNoICgoKEF0b20gKikgd2Fsa2VyLT5kYXRhKS0+dHlwZSkgeworICAgICAgY2FzZSBGT1VSQ0NfbXA0YToKKyAgICAgICAgaWYgKCFzYW1wbGVfZW50cnlfbXA0YV9jb3B5X2RhdGEgKChTYW1wbGVUYWJsZUVudHJ5TVA0QSAqKSB3YWxrZXItPmRhdGEsCisgICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZPVVJDQ19tcDR2OgorICAgICAgICBpZiAoIXNhbXBsZV9lbnRyeV9tcDR2X2NvcHlfZGF0YSAoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHdhbGtlci0+ZGF0YSwKKyAgICAgICAgICAgICAgICBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChzZS0+a2luZCA9PSBWSURFTykgeworICAgICAgICAgIGlmICghc2FtcGxlX2VudHJ5X21wNHZfY29weV9kYXRhICgoU2FtcGxlVGFibGVFbnRyeU1QNFYgKikKKyAgICAgICAgICAgICAgICAgIHdhbGtlci0+ZGF0YSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc2UtPmtpbmQgPT0gQVVESU8pIHsKKyAgICAgICAgICBpZiAoIXNhbXBsZV9lbnRyeV9tcDRhX2NvcHlfZGF0YSAoKFNhbXBsZVRhYmxlRW50cnlNUDRBICopCisgICAgICAgICAgICAgICAgICB3YWxrZXItPmRhdGEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHNlLT5raW5kID09IFNVQlRJVExFKSB7CisgICAgICAgICAgaWYgKCFzYW1wbGVfZW50cnlfdHgzZ19jb3B5X2RhdGEgKChTYW1wbGVUYWJsZUVudHJ5VFgzRyAqKQorICAgICAgICAgICAgICAgICAgd2Fsa2VyLT5kYXRhLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzZS0+a2luZCA9PSBUSU1FQ09ERSkgeworICAgICAgICAgIGlmICghc2FtcGxlX2VudHJ5X3RtY2RfY29weV9kYXRhICgoU2FtcGxlVGFibGVFbnRyeVRNQ0QgKikKKyAgICAgICAgICAgICAgICAgIHdhbGtlci0+ZGF0YSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCFhdG9tX2hpbnRfc2FtcGxlX2VudHJ5X2NvcHlfZGF0YSAoCisgICAgICAgICAgICAgICAgICAoQXRvbUhpbnRTYW1wbGVFbnRyeSAqKSB3YWxrZXItPmRhdGEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV9zdGJsX2NvcHlfZGF0YSAoQXRvbVNUQkwgKiBzdGJsLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX2NvcHlfZGF0YSAoJnN0YmwtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIWF0b21fc3RzZF9jb3B5X2RhdGEgKCZzdGJsLT5zdHNkLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIWF0b21fc3R0c19jb3B5X2RhdGEgKCZzdGJsLT5zdHRzLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvKiB0aGlzIGF0b20gaXMgb3B0aW9uYWwsIHNvIGxldCdzIGNoZWNrIGlmIHdlIG5lZWQgaXQKKyAgICogKHRvIGF2b2lkIGZhbHNlIGVycm9yKSAqLworICBpZiAoYXRvbV9hcnJheV9nZXRfbGVuICgmc3RibC0+c3Rzcy5lbnRyaWVzKSkgeworICAgIGlmICghYXRvbV9zdHNzX2NvcHlfZGF0YSAoJnN0YmwtPnN0c3MsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKCFhdG9tX3N0c2NfY29weV9kYXRhICgmc3RibC0+c3RzYywgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFhdG9tX3N0c3pfY29weV9kYXRhICgmc3RibC0+c3RzeiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHN0YmwtPmN0dHMgJiYgc3RibC0+Y3R0cy0+ZG9fcHRzKSB7CisgICAgaWYgKCFhdG9tX2N0dHNfY29weV9kYXRhIChzdGJsLT5jdHRzLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBpZiAoc3RibC0+c3ZtaSkgeworICAgIGlmICghYXRvbV9zdm1pX2NvcHlfZGF0YSAoc3RibC0+c3ZtaSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgaWYgKCFhdG9tX3N0Y282NF9jb3B5X2RhdGEgKCZzdGJsLT5zdGNvNjQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuIG9yaWdpbmFsX29mZnNldCAtICpvZmZzZXQ7Cit9CisKKworc3RhdGljIGd1aW50NjQKK2F0b21fZHJlZl9jb3B5X2RhdGEgKEF0b21EUkVGICogZHJlZiwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworICBHTGlzdCAqd2Fsa2VyOworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJmRyZWYtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyIChnX2xpc3RfbGVuZ3RoIChkcmVmLT5lbnRyaWVzKSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIHdhbGtlciA9IGRyZWYtPmVudHJpZXM7CisgIHdoaWxlICh3YWxrZXIgIT0gTlVMTCkgeworICAgIEF0b20gKmF0b20gPSAoQXRvbSAqKSB3YWxrZXItPmRhdGE7CisKKyAgICBpZiAoYXRvbS0+dHlwZSA9PSBGT1VSQ0NfdXJsXykgeworICAgICAgaWYgKCFhdG9tX3VybF9jb3B5X2RhdGEgKChBdG9tVVJMICopIGF0b20sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmIChhdG9tLT50eXBlID09IEZPVVJDQ19hbGlzKSB7CisgICAgICBpZiAoIWF0b21fZnVsbF9jb3B5X2RhdGEgKChBdG9tRnVsbCAqKSBhdG9tLCBidWZmZXIsIHNpemUsIG9mZnNldCkpCisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICBnX2Vycm9yICgiVW5zdXBwb3J0ZWQgYXRvbSB1c2VkIGluc2lkZSBkcmVmIGF0b20iKTsKKyAgICB9CisgICAgd2Fsa2VyID0gZ19saXN0X25leHQgKHdhbGtlcik7CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fZGluZl9jb3B5X2RhdGEgKEF0b21ESU5GICogZGluZiwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9jb3B5X2RhdGEgKCZkaW5mLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFhdG9tX2RyZWZfY29weV9kYXRhICgmZGluZi0+ZHJlZiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gb3JpZ2luYWxfb2Zmc2V0IC0gKm9mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fbWluZl9jb3B5X2RhdGEgKEF0b21NSU5GICogbWluZiwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9jb3B5X2RhdGEgKCZtaW5mLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKG1pbmYtPnZtaGQpIHsKKyAgICBpZiAoIWF0b21fdm1oZF9jb3B5X2RhdGEgKG1pbmYtPnZtaGQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9IGVsc2UgaWYgKG1pbmYtPnNtaGQpIHsKKyAgICBpZiAoIWF0b21fc21oZF9jb3B5X2RhdGEgKG1pbmYtPnNtaGQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9IGVsc2UgaWYgKG1pbmYtPmhtaGQpIHsKKyAgICBpZiAoIWF0b21faG1oZF9jb3B5X2RhdGEgKG1pbmYtPmhtaGQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9IGVsc2UgaWYgKG1pbmYtPmdtaGQpIHsKKyAgICBpZiAoIWF0b21fZ21oZF9jb3B5X2RhdGEgKG1pbmYtPmdtaGQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKG1pbmYtPmhkbHIpIHsKKyAgICBpZiAoIWF0b21faGRscl9jb3B5X2RhdGEgKG1pbmYtPmhkbHIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKCFhdG9tX2RpbmZfY29weV9kYXRhICgmbWluZi0+ZGluZiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFhdG9tX3N0YmxfY29weV9kYXRhICgmbWluZi0+c3RibCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fbWRoZF9jb3B5X2RhdGEgKEF0b21NREhEICogbWRoZCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJm1kaGQtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIWNvbW1vbl90aW1lX2luZm9fY29weV9kYXRhICgmbWRoZC0+dGltZV9pbmZvLAorICAgICAgICAgIGF0b21fZnVsbF9nZXRfdmVyc2lvbiAoJm1kaGQtPmhlYWRlcikgPT0gMCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDE2IChtZGhkLT5sYW5ndWFnZV9jb2RlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MTYgKG1kaGQtPnF1YWxpdHksIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fbWRpYV9jb3B5X2RhdGEgKEF0b21NRElBICogbWRpYSwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9jb3B5X2RhdGEgKCZtZGlhLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghYXRvbV9tZGhkX2NvcHlfZGF0YSAoJm1kaWEtPm1kaGQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghYXRvbV9oZGxyX2NvcHlfZGF0YSAoJm1kaWEtPmhkbHIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFhdG9tX21pbmZfY29weV9kYXRhICgmbWRpYS0+bWluZiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fZWxzdF9jb3B5X2RhdGEgKEF0b21FTFNUICogZWxzdCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworICBHU0xpc3QgKndhbGtlcjsKKworICBpZiAoIWF0b21fZnVsbF9jb3B5X2RhdGEgKCZlbHN0LT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcHJvcF9jb3B5X3VpbnQzMiAoZ19zbGlzdF9sZW5ndGggKGVsc3QtPmVudHJpZXMpLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgZm9yICh3YWxrZXIgPSBlbHN0LT5lbnRyaWVzOyB3YWxrZXIgIT0gTlVMTDsgd2Fsa2VyID0gZ19zbGlzdF9uZXh0ICh3YWxrZXIpKSB7CisgICAgRWRpdExpc3RFbnRyeSAqZW50cnkgPSAoRWRpdExpc3RFbnRyeSAqKSB3YWxrZXItPmRhdGE7CisgICAgcHJvcF9jb3B5X3VpbnQzMiAoZW50cnktPmR1cmF0aW9uLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgcHJvcF9jb3B5X3VpbnQzMiAoZW50cnktPm1lZGlhX3RpbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICBwcm9wX2NvcHlfdWludDMyIChlbnRyeS0+bWVkaWFfcmF0ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICB9CisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV90cmVmX2NvcHlfZGF0YSAoQXRvbVRSRUYgKiB0cmVmLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisgIGd1aW50IGk7CisKKyAgZ19hc3NlcnQgKGF0b21fYXJyYXlfZ2V0X2xlbiAoJnRyZWYtPmVudHJpZXMpID4gMCk7CisKKyAgaWYgKCFhdG9tX2NvcHlfZGF0YSAoJnRyZWYtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyICg4ICsgNCAqIGF0b21fYXJyYXlfZ2V0X2xlbiAoJnRyZWYtPmVudHJpZXMpLCBidWZmZXIsIHNpemUsCisgICAgICBvZmZzZXQpOworICBwcm9wX2NvcHlfZm91cmNjICh0cmVmLT5yZWZ0eXBlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIC8qIG1pbmltaXplIHJlYWxsb2MgKi8KKyAgcHJvcF9jb3B5X2Vuc3VyZV9idWZmZXIgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LAorICAgICAgNCAqIGF0b21fYXJyYXlfZ2V0X2xlbiAoJnRyZWYtPmVudHJpZXMpKTsKKyAgZm9yIChpID0gMDsgaSA8IGF0b21fYXJyYXlfZ2V0X2xlbiAoJnRyZWYtPmVudHJpZXMpOyBpKyspIHsKKyAgICBwcm9wX2NvcHlfdWludDMyIChhdG9tX2FycmF5X2luZGV4ICgmdHJlZi0+ZW50cmllcywgaSksIGJ1ZmZlciwgc2l6ZSwKKyAgICAgICAgb2Zmc2V0KTsKKyAgfQorCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV9lZHRzX2NvcHlfZGF0YSAoQXRvbUVEVFMgKiBlZHRzLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX2NvcHlfZGF0YSAoJihlZHRzLT5oZWFkZXIpLCBidWZmZXIsIHNpemUsIG9mZnNldCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCFhdG9tX2Vsc3RfY29weV9kYXRhICgmKGVkdHMtPmVsc3QpLCBidWZmZXIsIHNpemUsIG9mZnNldCkpCisgICAgcmV0dXJuIDA7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX3RhZ19kYXRhX2NvcHlfZGF0YSAoQXRvbVRhZ0RhdGEgKiBkYXRhLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX2Z1bGxfY29weV9kYXRhICgmZGF0YS0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByb3BfY29weV91aW50MzIgKGRhdGEtPnJlc2VydmVkLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50OF9hcnJheSAoZGF0YS0+ZGF0YSwgZGF0YS0+ZGF0YWxlbiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV90YWdfY29weV9kYXRhIChBdG9tVGFnICogdGFnLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX2NvcHlfZGF0YSAoJnRhZy0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghYXRvbV90YWdfZGF0YV9jb3B5X2RhdGEgKCZ0YWctPmRhdGEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX2lsc3RfY29weV9kYXRhIChBdG9tSUxTVCAqIGlsc3QsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fY29weV9kYXRhICgmaWxzdC0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvKiBleHRyYSBhdG9tcyAqLworICBpZiAoaWxzdC0+ZW50cmllcyAmJgorICAgICAgIWF0b21faW5mb19saXN0X2NvcHlfZGF0YSAoaWxzdC0+ZW50cmllcywgYnVmZmVyLCBzaXplLCBvZmZzZXQpKQorICAgIHJldHVybiAwOworCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV9tZXRhX2NvcHlfZGF0YSAoQXRvbU1FVEEgKiBtZXRhLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFhdG9tX2Z1bGxfY29weV9kYXRhICgmbWV0YS0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIWF0b21faGRscl9jb3B5X2RhdGEgKCZtZXRhLT5oZGxyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAobWV0YS0+aWxzdCkgeworICAgIGlmICghYXRvbV9pbHN0X2NvcHlfZGF0YSAobWV0YS0+aWxzdCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fdWR0YV9jb3B5X2RhdGEgKEF0b21VRFRBICogdWR0YSwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9jb3B5X2RhdGEgKCZ1ZHRhLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICh1ZHRhLT5tZXRhKSB7CisgICAgaWYgKCFhdG9tX21ldGFfY29weV9kYXRhICh1ZHRhLT5tZXRhLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBpZiAodWR0YS0+ZW50cmllcykgeworICAgIC8qIGV4dHJhIGF0b21zICovCisgICAgaWYgKCFhdG9tX2luZm9fbGlzdF9jb3B5X2RhdGEgKHVkdGEtPmVudHJpZXMsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkKKyAgICAgIHJldHVybiAwOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX21laGRfY29weV9kYXRhIChBdG9tTUVIRCAqIG1laGQsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWF0b21fZnVsbF9jb3B5X2RhdGEgKCZtZWhkLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgcHJvcF9jb3B5X3VpbnQ2NCAobWVoZC0+ZnJhZ21lbnRfZHVyYXRpb24sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fdHJleF9jb3B5X2RhdGEgKEF0b21UUkVYICogdHJleCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnRyZXgtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyICh0cmV4LT50cmFja19JRCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyICh0cmV4LT5kZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCwgYnVmZmVyLCBzaXplLAorICAgICAgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMiAodHJleC0+ZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQzMiAodHJleC0+ZGVmYXVsdF9zYW1wbGVfc2l6ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyICh0cmV4LT5kZWZhdWx0X3NhbXBsZV9mbGFncywgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorYXRvbV9tdmV4X2NvcHlfZGF0YSAoQXRvbU1WRVggKiBtdmV4LCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisgIEdMaXN0ICp3YWxrZXI7CisKKyAgaWYgKCFhdG9tX2NvcHlfZGF0YSAoJm12ZXgtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIWF0b21fbWVoZF9jb3B5X2RhdGEgKCZtdmV4LT5tZWhkLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHdhbGtlciA9IGdfbGlzdF9maXJzdCAobXZleC0+dHJleHMpOworICB3aGlsZSAod2Fsa2VyICE9IE5VTEwpIHsKKyAgICBpZiAoIWF0b21fdHJleF9jb3B5X2RhdGEgKChBdG9tVFJFWCAqKSB3YWxrZXItPmRhdGEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHdhbGtlciA9IGdfbGlzdF9uZXh0ICh3YWxrZXIpOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK2d1aW50NjQKK2F0b21fdHJha19jb3B5X2RhdGEgKEF0b21UUkFLICogdHJhaywgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9jb3B5X2RhdGEgKCZ0cmFrLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghYXRvbV90a2hkX2NvcHlfZGF0YSAoJnRyYWstPnRraGQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICh0cmFrLT50YXB0KSB7CisgICAgaWYgKCF0cmFrLT50YXB0LT5jb3B5X2RhdGFfZnVuYyAodHJhay0+dGFwdC0+YXRvbSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgaWYgKHRyYWstPmVkdHMpIHsKKyAgICBpZiAoIWF0b21fZWR0c19jb3B5X2RhdGEgKHRyYWstPmVkdHMsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIGlmICh0cmFrLT50cmVmKSB7CisgICAgLyogTWFrZSBzdXJlIHdlIG5lZWQgdGhpcyBhdG9tICh0aGVyZSBpcyBhIHJlZmVyZW5jZWQgdHJhY2sgKi8KKyAgICBpZiAoYXRvbV9hcnJheV9nZXRfbGVuICgmdHJhay0+dHJlZi0+ZW50cmllcykgPiAwKSB7CisgICAgICBpZiAoIWF0b21fdHJlZl9jb3B5X2RhdGEgKHRyYWstPnRyZWYsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoIWF0b21fbWRpYV9jb3B5X2RhdGEgKCZ0cmFrLT5tZGlhLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghYXRvbV91ZHRhX2NvcHlfZGF0YSAoJnRyYWstPnVkdGEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKKworZ3VpbnQ2NAorYXRvbV9tb292X2NvcHlfZGF0YSAoQXRvbU1PT1YgKiBhdG9tLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisgIEdMaXN0ICp3YWxrZXI7CisKKyAgaWYgKCFhdG9tX2NvcHlfZGF0YSAoJihhdG9tLT5oZWFkZXIpLCBidWZmZXIsIHNpemUsIG9mZnNldCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCFhdG9tX212aGRfY29weV9kYXRhICgmKGF0b20tPm12aGQpLCBidWZmZXIsIHNpemUsIG9mZnNldCkpCisgICAgcmV0dXJuIDA7CisKKyAgd2Fsa2VyID0gZ19saXN0X2ZpcnN0IChhdG9tLT50cmFrcyk7CisgIHdoaWxlICh3YWxrZXIgIT0gTlVMTCkgeworICAgIGlmICghYXRvbV90cmFrX2NvcHlfZGF0YSAoKEF0b21UUkFLICopIHdhbGtlci0+ZGF0YSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgd2Fsa2VyID0gZ19saXN0X25leHQgKHdhbGtlcik7CisgIH0KKworICBpZiAoIWF0b21fdWR0YV9jb3B5X2RhdGEgKCZhdG9tLT51ZHRhLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChhdG9tLT5mcmFnbWVudGVkKSB7CisgICAgaWYgKCFhdG9tX212ZXhfY29weV9kYXRhICgmYXRvbS0+bXZleCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fd2F2ZV9jb3B5X2RhdGEgKEF0b21XQVZFICogd2F2ZSwgZ3VpbnQ4ICoqIGJ1ZmZlciwKKyAgICBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9jb3B5X2RhdGEgKCYod2F2ZS0+aGVhZGVyKSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKQorICAgIHJldHVybiAwOworCisgIGlmICh3YXZlLT5leHRlbnNpb25fYXRvbXMpIHsKKyAgICBpZiAoIWF0b21faW5mb19saXN0X2NvcHlfZGF0YSAod2F2ZS0+ZXh0ZW5zaW9uX2F0b21zLCBidWZmZXIsIHNpemUsIG9mZnNldCkpCisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIGF0b21fd3JpdGVfc2l6ZSAoYnVmZmVyLCBzaXplLCBvZmZzZXQsIG9yaWdpbmFsX29mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCisvKiAtLSBlbmQgb2YgY29weSBkYXRhIGZ1bmN0aW9ucyAtLSAqLworCisvKiAtLSBnZW5lcmFsIGZ1bmN0aW9ucywgQVBJIGFuZCBzdXBwb3J0IGZ1bmN0aW9ucyAqLworCisvKiBhZGQgc2FtcGxlcyB0byB0YWJsZXMgKi8KKwordm9pZAorYXRvbV9zdHNjX2FkZF9uZXdfZW50cnkgKEF0b21TVFNDICogc3RzYywgZ3VpbnQzMiBmaXJzdF9jaHVuaywgZ3VpbnQzMiBuc2FtcGxlcykKK3sKKyAgZ2ludCBsZW47CisKKyAgaWYgKChsZW4gPSBhdG9tX2FycmF5X2dldF9sZW4gKCZzdHNjLT5lbnRyaWVzKSkgPiAxICYmCisgICAgICAoKGF0b21fYXJyYXlfaW5kZXggKCZzdHNjLT5lbnRyaWVzLCBsZW4gLSAxKSkuc2FtcGxlc19wZXJfY2h1bmsgPT0KKyAgICAgICAgICAoYXRvbV9hcnJheV9pbmRleCAoJnN0c2MtPmVudHJpZXMsIGxlbiAtIDIpKS5zYW1wbGVzX3Blcl9jaHVuaykpIHsKKyAgICBTVFNDRW50cnkgKm5lbnRyeTsKKworICAgIC8qIE1lcmdlIGxhc3QgdHdvIGVudHJpZXMgYXMgdGhleSBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBzYW1wbGVzIHBlciBjaHVuayAqLworICAgIG5lbnRyeSA9ICZhdG9tX2FycmF5X2luZGV4ICgmc3RzYy0+ZW50cmllcywgbGVuIC0gMSk7CisgICAgbmVudHJ5LT5maXJzdF9jaHVuayA9IGZpcnN0X2NodW5rOworICAgIG5lbnRyeS0+c2FtcGxlc19wZXJfY2h1bmsgPSBuc2FtcGxlczsKKyAgICBuZW50cnktPnNhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCA9IDE7CisgIH0gZWxzZSB7CisgICAgU1RTQ0VudHJ5IG5lbnRyeTsKKworICAgIG5lbnRyeS5maXJzdF9jaHVuayA9IGZpcnN0X2NodW5rOworICAgIG5lbnRyeS5zYW1wbGVzX3Blcl9jaHVuayA9IG5zYW1wbGVzOworICAgIG5lbnRyeS5zYW1wbGVfZGVzY3JpcHRpb25faW5kZXggPSAxOworICAgIGF0b21fYXJyYXlfYXBwZW5kICgmc3RzYy0+ZW50cmllcywgbmVudHJ5LCAxMjgpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3N0c2NfdXBkYXRlX2VudHJ5IChBdG9tU1RTQyAqIHN0c2MsIGd1aW50MzIgZmlyc3RfY2h1bmssIGd1aW50MzIgbnNhbXBsZXMpCit7CisgIGdpbnQgbGVuOworCisgIGxlbiA9IGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0c2MtPmVudHJpZXMpOworICBnX2Fzc2VydCAobGVuICE9IDApOworICBnX2Fzc2VydCAoYXRvbV9hcnJheV9pbmRleCAoJnN0c2MtPmVudHJpZXMsCisgICAgICAgICAgbGVuIC0gMSkuZmlyc3RfY2h1bmsgPT0gZmlyc3RfY2h1bmspOworCisgIGF0b21fYXJyYXlfaW5kZXggKCZzdHNjLT5lbnRyaWVzLCBsZW4gLSAxKS5zYW1wbGVzX3Blcl9jaHVuayArPSBuc2FtcGxlczsKK30KKworc3RhdGljIHZvaWQKK2F0b21fc3R0c19hZGRfZW50cnkgKEF0b21TVFRTICogc3R0cywgZ3VpbnQzMiBzYW1wbGVfY291bnQsIGdpbnQzMiBzYW1wbGVfZGVsdGEpCit7CisgIFNUVFNFbnRyeSAqZW50cnkgPSBOVUxMOworCisgIGlmIChHX0xJS0VMWSAoYXRvbV9hcnJheV9nZXRfbGVuICgmc3R0cy0+ZW50cmllcykgIT0gMCkpCisgICAgZW50cnkgPSAmYXRvbV9hcnJheV9pbmRleCAoJnN0dHMtPmVudHJpZXMsCisgICAgICAgIGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0dHMtPmVudHJpZXMpIC0gMSk7CisKKyAgaWYgKGVudHJ5ICYmIGVudHJ5LT5zYW1wbGVfZGVsdGEgPT0gc2FtcGxlX2RlbHRhKSB7CisgICAgZW50cnktPnNhbXBsZV9jb3VudCArPSBzYW1wbGVfY291bnQ7CisgIH0gZWxzZSB7CisgICAgU1RUU0VudHJ5IG5lbnRyeTsKKworICAgIG5lbnRyeS5zYW1wbGVfY291bnQgPSBzYW1wbGVfY291bnQ7CisgICAgbmVudHJ5LnNhbXBsZV9kZWx0YSA9IHNhbXBsZV9kZWx0YTsKKyAgICBhdG9tX2FycmF5X2FwcGVuZCAoJnN0dHMtPmVudHJpZXMsIG5lbnRyeSwgMjU2KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorYXRvbV9zdHN6X2FkZF9lbnRyeSAoQXRvbVNUU1ogKiBzdHN6LCBndWludDMyIG5zYW1wbGVzLCBndWludDMyIHNpemUpCit7CisgIGd1aW50MzIgaTsKKworICBzdHN6LT50YWJsZV9zaXplICs9IG5zYW1wbGVzOworICBpZiAoc3Rzei0+c2FtcGxlX3NpemUgIT0gMCkgeworICAgIC8qIGl0IGlzIGNvbnN0YW50IHNpemUsIHdlIGRvbid0IG5lZWQgZW50cmllcyAqLworICAgIHJldHVybjsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgbnNhbXBsZXM7IGkrKykgeworICAgIGF0b21fYXJyYXlfYXBwZW5kICgmc3Rzei0+ZW50cmllcywgc2l6ZSwgMTAyNCk7CisgIH0KK30KKworc3RhdGljIGd1aW50MzIKK2F0b21fc3RjbzY0X2dldF9lbnRyeV9jb3VudCAoQXRvbVNUQ082NCAqIHN0Y282NCkKK3sKKyAgcmV0dXJuIGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0Y282NC0+ZW50cmllcyk7Cit9CisKKy8qIHJldHVybnMgVFJVRSBpZiBhIG5ldyBlbnRyeSB3YXMgYWRkZWQgKi8KK3N0YXRpYyBnYm9vbGVhbgorYXRvbV9zdGNvNjRfYWRkX2VudHJ5IChBdG9tU1RDTzY0ICogc3RjbzY0LCBndWludDY0IGVudHJ5KQoreworICBndWludDMyIGxlbjsKKworICAvKiBPbmx5IGFkZCBhIG5ldyBlbnRyeSBpZiB0aGUgY2h1bmsgb2Zmc2V0IGNoYW5nZWQgKi8KKyAgaWYgKChsZW4gPSBhdG9tX2FycmF5X2dldF9sZW4gKCZzdGNvNjQtPmVudHJpZXMpKSAmJgorICAgICAgKChhdG9tX2FycmF5X2luZGV4ICgmc3RjbzY0LT5lbnRyaWVzLCBsZW4gLSAxKSkgPT0gZW50cnkpKQorICAgIHJldHVybiBGQUxTRTsKKworICBhdG9tX2FycmF5X2FwcGVuZCAoJnN0Y282NC0+ZW50cmllcywgZW50cnksIDI1Nik7CisgIGlmIChlbnRyeSA+IEdfTUFYVUlOVDMyKQorICAgIHN0Y282NC0+aGVhZGVyLmhlYWRlci50eXBlID0gRk9VUkNDX2NvNjQ7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK2F0b21fdHJlZl9hZGRfZW50cnkgKEF0b21UUkVGICogdHJlZiwgZ3VpbnQzMiBzYW1wbGUpCit7CisgIGF0b21fYXJyYXlfYXBwZW5kICgmdHJlZi0+ZW50cmllcywgc2FtcGxlLCA1MTIpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9zdHNzX2FkZF9lbnRyeSAoQXRvbVNUU1MgKiBzdHNzLCBndWludDMyIHNhbXBsZSkKK3sKKyAgYXRvbV9hcnJheV9hcHBlbmQgKCZzdHNzLT5lbnRyaWVzLCBzYW1wbGUsIDUxMik7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3N0YmxfYWRkX3N0c3NfZW50cnkgKEF0b21TVEJMICogc3RibCkKK3sKKyAgZ3VpbnQzMiBzYW1wbGVfaW5kZXggPSBzdGJsLT5zdHN6LnRhYmxlX3NpemU7CisKKyAgYXRvbV9zdHNzX2FkZF9lbnRyeSAoJnN0YmwtPnN0c3MsIHNhbXBsZV9pbmRleCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2N0dHNfYWRkX2VudHJ5IChBdG9tQ1RUUyAqIGN0dHMsIGd1aW50MzIgbnNhbXBsZXMsIGd1aW50MzIgb2Zmc2V0KQoreworICBDVFRTRW50cnkgKmVudHJ5ID0gTlVMTDsKKworICBpZiAoR19MSUtFTFkgKGF0b21fYXJyYXlfZ2V0X2xlbiAoJmN0dHMtPmVudHJpZXMpICE9IDApKQorICAgIGVudHJ5ID0gJmF0b21fYXJyYXlfaW5kZXggKCZjdHRzLT5lbnRyaWVzLAorICAgICAgICBhdG9tX2FycmF5X2dldF9sZW4gKCZjdHRzLT5lbnRyaWVzKSAtIDEpOworCisgIGlmIChlbnRyeSA9PSBOVUxMIHx8IGVudHJ5LT5zYW1wbGVvZmZzZXQgIT0gb2Zmc2V0KSB7CisgICAgQ1RUU0VudHJ5IG5lbnRyeTsKKworICAgIG5lbnRyeS5zYW1wbGVjb3VudCA9IG5zYW1wbGVzOworICAgIG5lbnRyeS5zYW1wbGVvZmZzZXQgPSBvZmZzZXQ7CisgICAgYXRvbV9hcnJheV9hcHBlbmQgKCZjdHRzLT5lbnRyaWVzLCBuZW50cnksIDI1Nik7CisgICAgaWYgKG9mZnNldCAhPSAwKQorICAgICAgY3R0cy0+ZG9fcHRzID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBlbnRyeS0+c2FtcGxlY291bnQgKz0gbnNhbXBsZXM7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2F0b21fc3RibF9hZGRfY3R0c19lbnRyeSAoQXRvbVNUQkwgKiBzdGJsLCBndWludDMyIG5zYW1wbGVzLCBndWludDMyIG9mZnNldCkKK3sKKyAgaWYgKHN0YmwtPmN0dHMgPT0gTlVMTCkgeworICAgIHN0YmwtPmN0dHMgPSBhdG9tX2N0dHNfbmV3ICgpOworICB9CisgIGF0b21fY3R0c19hZGRfZW50cnkgKHN0YmwtPmN0dHMsIG5zYW1wbGVzLCBvZmZzZXQpOworfQorCit2b2lkCithdG9tX3N0YmxfYWRkX3NhbXBsZXMgKEF0b21TVEJMICogc3RibCwgZ3VpbnQzMiBuc2FtcGxlcywgZ3VpbnQzMiBkZWx0YSwKKyAgICBndWludDMyIHNpemUsIGd1aW50NjQgY2h1bmtfb2Zmc2V0LCBnYm9vbGVhbiBzeW5jLCBnaW50NjQgcHRzX29mZnNldCkKK3sKKyAgYXRvbV9zdHRzX2FkZF9lbnRyeSAoJnN0YmwtPnN0dHMsIG5zYW1wbGVzLCBkZWx0YSk7CisgIGF0b21fc3Rzel9hZGRfZW50cnkgKCZzdGJsLT5zdHN6LCBuc2FtcGxlcywgc2l6ZSk7CisgIGlmIChhdG9tX3N0Y282NF9hZGRfZW50cnkgKCZzdGJsLT5zdGNvNjQsIGNodW5rX29mZnNldCkpIHsKKyAgICBhdG9tX3N0c2NfYWRkX25ld19lbnRyeSAoJnN0YmwtPnN0c2MsCisgICAgICAgIGF0b21fc3RjbzY0X2dldF9lbnRyeV9jb3VudCAoJnN0YmwtPnN0Y282NCksIG5zYW1wbGVzKTsKKyAgfSBlbHNlIHsKKyAgICBhdG9tX3N0c2NfdXBkYXRlX2VudHJ5ICgmc3RibC0+c3RzYywKKyAgICAgICAgYXRvbV9zdGNvNjRfZ2V0X2VudHJ5X2NvdW50ICgmc3RibC0+c3RjbzY0KSwgbnNhbXBsZXMpOworICB9CisKKyAgaWYgKHN5bmMpCisgICAgYXRvbV9zdGJsX2FkZF9zdHNzX2VudHJ5IChzdGJsKTsKKyAgLyogYWx3YXlzIHN0b3JlIHRvIGFycmFuZ2UgZm9yIGNvbnNpc3RlbnQgY29udGVudCAqLworICBhdG9tX3N0YmxfYWRkX2N0dHNfZW50cnkgKHN0YmwsIG5zYW1wbGVzLCBwdHNfb2Zmc2V0KTsKK30KKwordm9pZAorYXRvbV90cmFrX2FkZF9zYW1wbGVzIChBdG9tVFJBSyAqIHRyYWssIGd1aW50MzIgbnNhbXBsZXMsIGd1aW50MzIgZGVsdGEsCisgICAgZ3VpbnQzMiBzaXplLCBndWludDY0IGNodW5rX29mZnNldCwgZ2Jvb2xlYW4gc3luYywgZ2ludDY0IHB0c19vZmZzZXQpCit7CisgIEF0b21TVEJMICpzdGJsID0gJnRyYWstPm1kaWEubWluZi5zdGJsOworICBhdG9tX3N0YmxfYWRkX3NhbXBsZXMgKHN0YmwsIG5zYW1wbGVzLCBkZWx0YSwgc2l6ZSwgY2h1bmtfb2Zmc2V0LCBzeW5jLAorICAgICAgcHRzX29mZnNldCk7Cit9CisKKy8qIHRyYWsgYW5kIG1vb3YgbW9sZGluZyAqLworCitndWludDMyCithdG9tX3RyYWtfZ2V0X3RpbWVzY2FsZSAoQXRvbVRSQUsgKiB0cmFrKQoreworICByZXR1cm4gdHJhay0+bWRpYS5tZGhkLnRpbWVfaW5mby50aW1lc2NhbGU7Cit9CisKK2d1aW50MzIKK2F0b21fdHJha19nZXRfaWQgKEF0b21UUkFLICogdHJhaykKK3sKKyAgcmV0dXJuIHRyYWstPnRraGQudHJhY2tfSUQ7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3RyYWtfc2V0X2lkIChBdG9tVFJBSyAqIHRyYWssIGd1aW50MzIgaWQpCit7CisgIHRyYWstPnRraGQudHJhY2tfSUQgPSBpZDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fbW9vdl9hZGRfdHJleCAoQXRvbU1PT1YgKiBtb292LCBBdG9tVFJFWCAqIHRyZXgpCit7CisgIG1vb3YtPm12ZXgudHJleHMgPSBnX2xpc3RfYXBwZW5kIChtb292LT5tdmV4LnRyZXhzLCB0cmV4KTsKK30KKworc3RhdGljIEF0b21UUkVYICoKK2F0b21fdHJleF9uZXcgKEF0b21UUkFLICogdHJhaykKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisgIEF0b21UUkVYICp0cmV4ID0gZ19uZXcwIChBdG9tVFJFWCwgMSk7CisKKyAgYXRvbV9mdWxsX2luaXQgKCZ0cmV4LT5oZWFkZXIsIEZPVVJDQ190cmV4LCAwLCAwLCAwLCBmbGFncyk7CisKKyAgdHJleC0+dHJhY2tfSUQgPSB0cmFrLT50a2hkLnRyYWNrX0lEOworICB0cmV4LT5kZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCA9IDE7CisgIHRyZXgtPmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uID0gMDsKKyAgdHJleC0+ZGVmYXVsdF9zYW1wbGVfc2l6ZSA9IDA7CisgIHRyZXgtPmRlZmF1bHRfc2FtcGxlX2ZsYWdzID0gMDsKKworICByZXR1cm4gdHJleDsKK30KKwordm9pZAorYXRvbV9tb292X2FkZF90cmFrIChBdG9tTU9PViAqIG1vb3YsIEF0b21UUkFLICogdHJhaykKK3sKKyAgYXRvbV90cmFrX3NldF9pZCAodHJhaywgbW9vdi0+bXZoZC5uZXh0X3RyYWNrX2lkKyspOworICBtb292LT50cmFrcyA9IGdfbGlzdF9hcHBlbmQgKG1vb3YtPnRyYWtzLCB0cmFrKTsKKyAgLyogYWRkaXRpb25hbCB0cmFrIG1lYW5zIGFsc28gbmV3IHRyZXggKi8KKyAgYXRvbV9tb292X2FkZF90cmV4IChtb292LCBhdG9tX3RyZXhfbmV3ICh0cmFrKSk7Cit9CisKK2d1aW50CithdG9tX21vb3ZfZ2V0X3RyYWtfY291bnQgKEF0b21NT09WICogbW9vdikKK3sKKyAgcmV0dXJuIGdfbGlzdF9sZW5ndGggKG1vb3YtPnRyYWtzKTsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fdHJha19nZXRfZHVyYXRpb24gKEF0b21UUkFLICogdHJhaykKK3sKKyAgcmV0dXJuIHRyYWstPnRraGQuZHVyYXRpb247Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX3N0dHNfZ2V0X3RvdGFsX2R1cmF0aW9uIChBdG9tU1RUUyAqIHN0dHMpCit7CisgIGd1aW50IGk7CisgIGd1aW50NjQgc3VtID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgYXRvbV9hcnJheV9nZXRfbGVuICgmc3R0cy0+ZW50cmllcyk7IGkrKykgeworICAgIFNUVFNFbnRyeSAqZW50cnkgPSAmYXRvbV9hcnJheV9pbmRleCAoJnN0dHMtPmVudHJpZXMsIGkpOworCisgICAgc3VtICs9IChndWludDY0KSAoZW50cnktPnNhbXBsZV9jb3VudCkgKiBlbnRyeS0+c2FtcGxlX2RlbHRhOworICB9CisgIHJldHVybiBzdW07Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3RyYWtfdXBkYXRlX2R1cmF0aW9uIChBdG9tVFJBSyAqIHRyYWssIGd1aW50NjQgbW9vdl90aW1lc2NhbGUpCit7CisgIHRyYWstPm1kaWEubWRoZC50aW1lX2luZm8uZHVyYXRpb24gPQorICAgICAgYXRvbV9zdHRzX2dldF90b3RhbF9kdXJhdGlvbiAoJnRyYWstPm1kaWEubWluZi5zdGJsLnN0dHMpOworICBpZiAodHJhay0+bWRpYS5tZGhkLnRpbWVfaW5mby50aW1lc2NhbGUgIT0gMCkgeworICAgIHRyYWstPnRraGQuZHVyYXRpb24gPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHRyYWstPm1kaWEubWRoZC50aW1lX2luZm8uZHVyYXRpb24sCisgICAgICAgIG1vb3ZfdGltZXNjYWxlLCB0cmFrLT5tZGlhLm1kaGQudGltZV9pbmZvLnRpbWVzY2FsZSk7CisgIH0gZWxzZSB7CisgICAgdHJhay0+dGtoZC5kdXJhdGlvbiA9IDA7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RpbWVjb2RlX2F0b21fdHJha19zZXRfZHVyYXRpb24gKEF0b21UUkFLICogdHJhaywgZ3VpbnQ2NCBkdXJhdGlvbiwKKyAgICBndWludDY0IHRpbWVzY2FsZSkKK3sKKyAgU1RUU0VudHJ5ICplbnRyeTsKKyAgR0xpc3QgKml0ZXI7CisKKyAgLyogU2FuaXR5IGNoZWNrcyB0byBlbnN1cmUgd2UgaGF2ZSBhIHRpbWVjb2RlICovCisgIGdfYXNzZXJ0ICh0cmFrLT5tZGlhLm1pbmYuZ21oZCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGF0b21fYXJyYXlfZ2V0X2xlbiAoJnRyYWstPm1kaWEubWluZi5zdGJsLnN0dHMuZW50cmllcykgPT0gMSk7CisKKyAgZm9yIChpdGVyID0gdHJhay0+bWRpYS5taW5mLnN0Ymwuc3RzZC5lbnRyaWVzOyBpdGVyOworICAgICAgaXRlciA9IGdfbGlzdF9uZXh0IChpdGVyKSkgeworICAgIFNhbXBsZVRhYmxlRW50cnkgKmVudHJ5ID0gaXRlci0+ZGF0YTsKKyAgICBpZiAoZW50cnktPmtpbmQgPT0gVElNRUNPREUpIHsKKyAgICAgIFNhbXBsZVRhYmxlRW50cnlUTUNEICp0bWNkID0gKFNhbXBsZVRhYmxlRW50cnlUTUNEICopIGVudHJ5OworCisgICAgICBkdXJhdGlvbiA9IGR1cmF0aW9uICogdG1jZC0+dGltZXNjYWxlIC8gdGltZXNjYWxlOworICAgICAgdGltZXNjYWxlID0gdG1jZC0+dGltZXNjYWxlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgdHJhay0+dGtoZC5kdXJhdGlvbiA9IGR1cmF0aW9uOworICB0cmFrLT5tZGlhLm1kaGQudGltZV9pbmZvLmR1cmF0aW9uID0gZHVyYXRpb247CisgIHRyYWstPm1kaWEubWRoZC50aW1lX2luZm8udGltZXNjYWxlID0gdGltZXNjYWxlOworCisgIGVudHJ5ID0gJmF0b21fYXJyYXlfaW5kZXggKCZ0cmFrLT5tZGlhLm1pbmYuc3RibC5zdHRzLmVudHJpZXMsIDApOworICBlbnRyeS0+c2FtcGxlX2RlbHRhID0gZHVyYXRpb247Cit9CisKK3N0YXRpYyBndWludDMyCithdG9tX21vb3ZfZ2V0X3RpbWVzY2FsZSAoQXRvbU1PT1YgKiBtb292KQoreworICByZXR1cm4gbW9vdi0+bXZoZC50aW1lX2luZm8udGltZXNjYWxlOworfQorCit2b2lkCithdG9tX21vb3ZfdXBkYXRlX3RpbWVzY2FsZSAoQXRvbU1PT1YgKiBtb292LCBndWludDMyIHRpbWVzY2FsZSkKK3sKKyAgbW9vdi0+bXZoZC50aW1lX2luZm8udGltZXNjYWxlID0gdGltZXNjYWxlOworfQorCit2b2lkCithdG9tX21vb3ZfdXBkYXRlX2R1cmF0aW9uIChBdG9tTU9PViAqIG1vb3YpCit7CisgIEdMaXN0ICp0cmFrcyA9IG1vb3YtPnRyYWtzOworICBndWludDY0IGR1ciwgZHVyYXRpb24gPSAwOworCisgIHdoaWxlICh0cmFrcykgeworICAgIEF0b21UUkFLICp0cmFrID0gKEF0b21UUkFLICopIHRyYWtzLT5kYXRhOworCisgICAgLyogU2tpcCB0aW1lY29kZXMgZm9yIG5vdzogdGhleSBoYXZlIGEgcGxhY2Vob2xkZXIgZHVyYXRpb24gKi8KKyAgICBpZiAodHJhay0+bWRpYS5taW5mLmdtaGQgPT0gTlVMTCkgeworICAgICAgYXRvbV90cmFrX3VwZGF0ZV9kdXJhdGlvbiAodHJhaywgYXRvbV9tb292X2dldF90aW1lc2NhbGUgKG1vb3YpKTsKKyAgICAgIGR1ciA9IGF0b21fdHJha19nZXRfZHVyYXRpb24gKHRyYWspOworICAgICAgaWYgKGR1ciA+IGR1cmF0aW9uKQorICAgICAgICBkdXJhdGlvbiA9IGR1cjsKKyAgICB9CisgICAgdHJha3MgPSBnX2xpc3RfbmV4dCAodHJha3MpOworICB9CisgIC8qIE5vdyB1cGRhdGUgdGhlIGR1cmF0aW9uIG9mIHRoZSB0aW1lY29kZXMgKi8KKyAgdHJha3MgPSBtb292LT50cmFrczsKKyAgd2hpbGUgKHRyYWtzKSB7CisgICAgQXRvbVRSQUsgKnRyYWsgPSAoQXRvbVRSQUsgKikgdHJha3MtPmRhdGE7CisKKyAgICBpZiAodHJhay0+bWRpYS5taW5mLmdtaGQgIT0gTlVMTCkKKyAgICAgIHRpbWVjb2RlX2F0b21fdHJha19zZXRfZHVyYXRpb24gKHRyYWssIGR1cmF0aW9uLAorICAgICAgICAgIGF0b21fbW9vdl9nZXRfdGltZXNjYWxlIChtb292KSk7CisgICAgdHJha3MgPSBnX2xpc3RfbmV4dCAodHJha3MpOworICB9CisgIG1vb3YtPm12aGQudGltZV9pbmZvLmR1cmF0aW9uID0gZHVyYXRpb247CisgIG1vb3YtPm12ZXgubWVoZC5mcmFnbWVudF9kdXJhdGlvbiA9IGR1cmF0aW9uOworfQorCit2b2lkCithdG9tX21vb3Zfc2V0X2ZyYWdtZW50ZWQgKEF0b21NT09WICogbW9vdiwgZ2Jvb2xlYW4gZnJhZ21lbnRlZCkKK3sKKyAgbW9vdi0+ZnJhZ21lbnRlZCA9IGZyYWdtZW50ZWQ7Cit9CisKK3ZvaWQKK2F0b21fc3RjbzY0X2NodW5rc19zZXRfb2Zmc2V0IChBdG9tU1RDTzY0ICogc3RjbzY0LCBndWludDMyIG9mZnNldCkKK3sKKyAgc3RjbzY0LT5jaHVua19vZmZzZXQgPSBvZmZzZXQ7Cit9CisKK3ZvaWQKK2F0b21fbW9vdl9jaHVua3Nfc2V0X29mZnNldCAoQXRvbU1PT1YgKiBtb292LCBndWludDMyIG9mZnNldCkKK3sKKyAgR0xpc3QgKnRyYWtzID0gbW9vdi0+dHJha3M7CisKKyAgaWYgKG9mZnNldCA9PSBtb292LT5jaHVua3Nfb2Zmc2V0KQorICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisKKyAgd2hpbGUgKHRyYWtzKSB7CisgICAgQXRvbVRSQUsgKnRyYWsgPSAoQXRvbVRSQUsgKikgdHJha3MtPmRhdGE7CisKKyAgICBhdG9tX3N0Y282NF9jaHVua3Nfc2V0X29mZnNldCAoJnRyYWstPm1kaWEubWluZi5zdGJsLnN0Y282NCwgb2Zmc2V0KTsKKyAgICB0cmFrcyA9IGdfbGlzdF9uZXh0ICh0cmFrcyk7CisgIH0KKworICBtb292LT5jaHVua3Nfb2Zmc2V0ID0gb2Zmc2V0OworfQorCit2b2lkCithdG9tX3RyYWtfdXBkYXRlX2JpdHJhdGVzIChBdG9tVFJBSyAqIHRyYWssIGd1aW50MzIgYXZnX2JpdHJhdGUsCisgICAgZ3VpbnQzMiBtYXhfYml0cmF0ZSkKK3sKKyAgQXRvbUVTRFMgKmVzZHMgPSBOVUxMOworICBBdG9tRGF0YSAqYnRydCA9IE5VTEw7CisgIEF0b21XQVZFICp3YXZlID0gTlVMTDsKKyAgQXRvbVNUU0QgKnN0c2Q7CisgIEdMaXN0ICppdGVyOworICBHTGlzdCAqZXh0ZW5zaW9uaXRlciA9IE5VTEw7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAodHJhayAhPSBOVUxMKTsKKworICBpZiAoYXZnX2JpdHJhdGUgPT0gMCAmJiBtYXhfYml0cmF0ZSA9PSAwKQorICAgIHJldHVybjsKKworICBzdHNkID0gJnRyYWstPm1kaWEubWluZi5zdGJsLnN0c2Q7CisgIGZvciAoaXRlciA9IHN0c2QtPmVudHJpZXM7IGl0ZXI7IGl0ZXIgPSBnX2xpc3RfbmV4dCAoaXRlcikpIHsKKyAgICBTYW1wbGVUYWJsZUVudHJ5ICplbnRyeSA9IGl0ZXItPmRhdGE7CisKKyAgICBzd2l0Y2ggKGVudHJ5LT5raW5kKSB7CisgICAgICBjYXNlIEFVRElPOnsKKyAgICAgICAgU2FtcGxlVGFibGVFbnRyeU1QNEEgKmF1ZGlvZW50cnkgPSAoU2FtcGxlVGFibGVFbnRyeU1QNEEgKikgZW50cnk7CisgICAgICAgIGV4dGVuc2lvbml0ZXIgPSBhdWRpb2VudHJ5LT5leHRlbnNpb25fYXRvbXM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBWSURFTzp7CisgICAgICAgIFNhbXBsZVRhYmxlRW50cnlNUDRWICp2aWRlb2VudHJ5ID0gKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIGVudHJ5OworICAgICAgICBleHRlbnNpb25pdGVyID0gdmlkZW9lbnRyeS0+ZXh0ZW5zaW9uX2F0b21zOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGZvciAoOyBleHRlbnNpb25pdGVyOyBleHRlbnNpb25pdGVyID0gZ19saXN0X25leHQgKGV4dGVuc2lvbml0ZXIpKSB7CisgICAgQXRvbUluZm8gKmF0b21pbmZvID0gZXh0ZW5zaW9uaXRlci0+ZGF0YTsKKyAgICBpZiAoYXRvbWluZm8tPmF0b20tPnR5cGUgPT0gRk9VUkNDX2VzZHMpIHsKKyAgICAgIGVzZHMgPSAoQXRvbUVTRFMgKikgYXRvbWluZm8tPmF0b207CisgICAgfSBlbHNlIGlmIChhdG9taW5mby0+YXRvbS0+dHlwZSA9PSBGT1VSQ0NfYnRydCkgeworICAgICAgYnRydCA9IChBdG9tRGF0YSAqKSBhdG9taW5mby0+YXRvbTsKKyAgICB9IGVsc2UgaWYgKGF0b21pbmZvLT5hdG9tLT50eXBlID09IEZPVVJDQ193YXZlKSB7CisgICAgICB3YXZlID0gKEF0b21XQVZFICopIGF0b21pbmZvLT5hdG9tOworICAgIH0KKyAgfQorCisgIC8qIHdhdmUgbWlnaHQgaGF2ZSBhbiBlc2RzIGludGVybmFsbHkgKi8KKyAgaWYgKHdhdmUpIHsKKyAgICBmb3IgKGV4dGVuc2lvbml0ZXIgPSB3YXZlLT5leHRlbnNpb25fYXRvbXM7IGV4dGVuc2lvbml0ZXI7CisgICAgICAgIGV4dGVuc2lvbml0ZXIgPSBnX2xpc3RfbmV4dCAoZXh0ZW5zaW9uaXRlcikpIHsKKyAgICAgIEF0b21JbmZvICphdG9taW5mbyA9IGV4dGVuc2lvbml0ZXItPmRhdGE7CisgICAgICBpZiAoYXRvbWluZm8tPmF0b20tPnR5cGUgPT0gRk9VUkNDX2VzZHMpIHsKKyAgICAgICAgZXNkcyA9IChBdG9tRVNEUyAqKSBhdG9taW5mby0+YXRvbTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGVzZHMpIHsKKyAgICBpZiAoYXZnX2JpdHJhdGUgJiYgZXNkcy0+ZXMuZGVjX2NvbmZfZGVzYy5hdmdfYml0cmF0ZSA9PSAwKQorICAgICAgZXNkcy0+ZXMuZGVjX2NvbmZfZGVzYy5hdmdfYml0cmF0ZSA9IGF2Z19iaXRyYXRlOworICAgIGlmIChtYXhfYml0cmF0ZSAmJiBlc2RzLT5lcy5kZWNfY29uZl9kZXNjLm1heF9iaXRyYXRlID09IDApCisgICAgICBlc2RzLT5lcy5kZWNfY29uZl9kZXNjLm1heF9iaXRyYXRlID0gbWF4X2JpdHJhdGU7CisgIH0KKyAgaWYgKGJ0cnQpIHsKKyAgICAvKiB0eXBlKDRieXRlcykgKyBzaXplKDRieXRlcykgKyBidWZmZXJzaXplKDRieXRlcykgKworICAgICAqIG1heGJpdHJhdGUoYnl0ZXMpICsgYXZnYml0cmF0ZShieXRlcykgKi8KKyAgICBpZiAobWF4X2JpdHJhdGUgJiYgR1NUX1JFQURfVUlOVDMyX0JFIChidHJ0LT5kYXRhICsgNCkgPT0gMCkKKyAgICAgIEdTVF9XUklURV9VSU5UMzJfQkUgKGJ0cnQtPmRhdGEgKyA0LCBtYXhfYml0cmF0ZSk7CisgICAgaWYgKGF2Z19iaXRyYXRlICYmIEdTVF9SRUFEX1VJTlQzMl9CRSAoYnRydC0+ZGF0YSArIDgpID09IDApCisgICAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChidHJ0LT5kYXRhICsgOCwgYXZnX2JpdHJhdGUpOworICB9Cit9CisKK3ZvaWQKK2F0b21fdHJha190eDNnX3VwZGF0ZV9kaW1lbnNpb24gKEF0b21UUkFLICogdHJhaywgZ3VpbnQzMiB3aWR0aCwgZ3VpbnQzMiBoZWlnaHQpCit7CisgIEF0b21TVFNEICpzdHNkOworICBHTGlzdCAqaXRlcjsKKyAgU2FtcGxlVGFibGVFbnRyeVRYM0cgKnR4M2cgPSBOVUxMOworCisgIHN0c2QgPSAmdHJhay0+bWRpYS5taW5mLnN0Ymwuc3RzZDsKKyAgZm9yIChpdGVyID0gc3RzZC0+ZW50cmllczsgaXRlciAmJiB0eDNnID09IE5VTEw7IGl0ZXIgPSBnX2xpc3RfbmV4dCAoaXRlcikpIHsKKyAgICBTYW1wbGVUYWJsZUVudHJ5ICplbnRyeSA9IGl0ZXItPmRhdGE7CisKKyAgICBzd2l0Y2ggKGVudHJ5LT5raW5kKSB7CisgICAgICBjYXNlIFNVQlRJVExFOnsKKyAgICAgICAgdHgzZyA9IChTYW1wbGVUYWJsZUVudHJ5VFgzRyAqKSBlbnRyeTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBDdXJyZW50bHkgd2UgbmV2ZXIgc2V0IHRoZSB2ZXJ0aWNhbCBwbGFjZW1lbnQgZmxhZywgc28gd2UgZG9uJ3QKKyAgICogY2hlY2sgZm9yIGl0IHRvIHNldCB0aGUgZGltZW5zaW9ucyBkaWZmZXJlbnRseSBhcyB0aGUgc3BlYyBzYXlzLgorICAgKiBBbHdheXMgZG8gaXQgZm9yIHRoZSBub3Qgc2V0IGNhc2UgKi8KKyAgaWYgKHR4M2cpIHsKKyAgICB0eDNnLT5mb250X3NpemUgPSAwLjA1ICogaGVpZ2h0OworCisgICAgaGVpZ2h0ID0gMC4xNSAqIGhlaWdodDsKKyAgICB0cmFrLT50a2hkLndpZHRoID0gd2lkdGggPDwgMTY7CisgICAgdHJhay0+dGtoZC5oZWlnaHQgPSBoZWlnaHQgPDwgMTY7CisgICAgdHgzZy0+ZGVmYXVsdF90ZXh0X2JveCA9IHdpZHRoIHwgKGhlaWdodCA8PCAxNik7CisgIH0KK30KKworLyoKKyAqIE1ldGEgdGFncyBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2F0b21fdGFnX2RhdGFfYWxsb2NfZGF0YSAoQXRvbVRhZ0RhdGEgKiBkYXRhLCBndWludCBzaXplKQoreworICBnX2ZyZWUgKGRhdGEtPmRhdGEpOworICBkYXRhLT5kYXRhID0gZ19uZXcwIChndWludDgsIHNpemUpOworICBkYXRhLT5kYXRhbGVuID0gc2l6ZTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdWR0YV9hcHBlbmRfdGFnIChBdG9tVURUQSAqIHVkdGEsIEF0b21JbmZvICogdGFnKQoreworICBHTGlzdCAqKmVudHJpZXM7CisKKyAgaWYgKHVkdGEtPm1ldGEpCisgICAgZW50cmllcyA9ICZ1ZHRhLT5tZXRhLT5pbHN0LT5lbnRyaWVzOworICBlbHNlCisgICAgZW50cmllcyA9ICZ1ZHRhLT5lbnRyaWVzOworICAqZW50cmllcyA9IGdfbGlzdF9hcHBlbmQgKCplbnRyaWVzLCB0YWcpOworfQorCit2b2lkCithdG9tX3VkdGFfYWRkX3RhZyAoQXRvbVVEVEEgKiB1ZHRhLCBndWludDMyIGZvdXJjYywgZ3VpbnQzMiBmbGFncywKKyAgICBjb25zdCBndWludDggKiBkYXRhLCBndWludCBzaXplKQoreworICBBdG9tVGFnICp0YWc7CisgIEF0b21UYWdEYXRhICp0ZGF0YTsKKworICB0YWcgPSBhdG9tX3RhZ19uZXcgKGZvdXJjYywgZmxhZ3MpOworICB0ZGF0YSA9ICZ0YWctPmRhdGE7CisgIGF0b21fdGFnX2RhdGFfYWxsb2NfZGF0YSAodGRhdGEsIHNpemUpOworICBtZW1tb3ZlICh0ZGF0YS0+ZGF0YSwgZGF0YSwgc2l6ZSk7CisKKyAgYXRvbV91ZHRhX2FwcGVuZF90YWcgKHVkdGEsCisgICAgICBidWlsZF9hdG9tX2luZm9fd3JhcHBlciAoKEF0b20gKikgdGFnLCBhdG9tX3RhZ19jb3B5X2RhdGEsCisgICAgICAgICAgYXRvbV90YWdfZnJlZSkpOworfQorCit2b2lkCithdG9tX3VkdGFfYWRkX3N0cl90YWcgKEF0b21VRFRBICogdWR0YSwgZ3VpbnQzMiBmb3VyY2MsIGNvbnN0IGdjaGFyICogdmFsdWUpCit7CisgIGdpbnQgbGVuID0gc3RybGVuICh2YWx1ZSk7CisKKyAgaWYgKGxlbiA+IDApCisgICAgYXRvbV91ZHRhX2FkZF90YWcgKHVkdGEsIGZvdXJjYywgTUVUQURBVEFfVEVYVF9GTEFHLCAoZ3VpbnQ4ICopIHZhbHVlLCBsZW4pOworfQorCit2b2lkCithdG9tX3VkdGFfYWRkX3VpbnRfdGFnIChBdG9tVURUQSAqIHVkdGEsIGd1aW50MzIgZm91cmNjLCBndWludDMyIGZsYWdzLAorICAgIGd1aW50MzIgdmFsdWUpCit7CisgIGd1aW50OCBkYXRhWzhdID0geyAwLCB9OworCisgIGlmIChmbGFncykgeworICAgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEsIHZhbHVlKTsKKyAgICBhdG9tX3VkdGFfYWRkX3RhZyAodWR0YSwgZm91cmNjLCBmbGFncywgZGF0YSwgMik7CisgIH0gZWxzZSB7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDIsIHZhbHVlKTsKKyAgICBhdG9tX3VkdGFfYWRkX3RhZyAodWR0YSwgZm91cmNjLCBmbGFncywgZGF0YSwgOCk7CisgIH0KK30KKworI2RlZmluZSBHU1RfQlVGRkVSX05FV19SRUFET05MWShtZW0sIHNpemUpIFwKKyAgICBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwgbWVtLCBzaXplLCBcCisgICAgMCwgc2l6ZSwgbWVtLCBOVUxMKQorCit2b2lkCithdG9tX3VkdGFfYWRkX2Jsb2JfdGFnIChBdG9tVURUQSAqIHVkdGEsIGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUpCit7CisgIEF0b21EYXRhICpkYXRhX2F0b207CisgIGd1aW50IGxlbjsKKyAgZ3VpbnQzMiBmb3VyY2M7CisKKyAgaWYgKHNpemUgPCA4KQorICAgIHJldHVybjsKKworICAvKiBibG9iIGlzIHVucGFyc2VkIGF0b207CisgICAqIGV4dHJhY3Qgc2l6ZSBhbmQgZm91cmNjLCBhbmQgd3JhcCByZW1haW5kZXIgaW4gZGF0YSBhdG9tICovCisgIGxlbiA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoZGF0YSk7CisgIGZvdXJjYyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDQpOworICBpZiAobGVuID4gc2l6ZSkKKyAgICByZXR1cm47CisKKyAgZGF0YV9hdG9tID0gYXRvbV9kYXRhX25ld19mcm9tX2RhdGEgKGZvdXJjYywgZGF0YSArIDgsIGxlbiAtIDgpOworCisgIGF0b21fdWR0YV9hcHBlbmRfdGFnICh1ZHRhLAorICAgICAgYnVpbGRfYXRvbV9pbmZvX3dyYXBwZXIgKChBdG9tICopIGRhdGFfYXRvbSwgYXRvbV9kYXRhX2NvcHlfZGF0YSwKKyAgICAgICAgICBhdG9tX2RhdGFfZnJlZSkpOworfQorCit2b2lkCithdG9tX3VkdGFfYWRkXzNncF90YWcgKEF0b21VRFRBICogdWR0YSwgZ3VpbnQzMiBmb3VyY2MsIGd1aW50OCAqIGRhdGEsCisgICAgZ3VpbnQgc2l6ZSkKK3sKKyAgQXRvbURhdGEgKmRhdGFfYXRvbTsKKworICBkYXRhX2F0b20gPSBhdG9tX2RhdGFfbmV3IChmb3VyY2MpOworCisgIC8qIG5lZWQgZnVsbCBhdG9tICovCisgIGF0b21fZGF0YV9hbGxvY19tZW0gKGRhdGFfYXRvbSwgc2l6ZSArIDQpOworCisgIC8qIGZ1bGwgYXRvbTogdmVyc2lvbiBhbmQgZmxhZ3MgKi8KKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YV9hdG9tLT5kYXRhLCAwKTsKKyAgbWVtY3B5IChkYXRhX2F0b20tPmRhdGEgKyA0LCBkYXRhLCBzaXplKTsKKworICBhdG9tX3VkdGFfYXBwZW5kX3RhZyAodWR0YSwKKyAgICAgIGJ1aWxkX2F0b21faW5mb193cmFwcGVyICgoQXRvbSAqKSBkYXRhX2F0b20sIGF0b21fZGF0YV9jb3B5X2RhdGEsCisgICAgICAgICAgYXRvbV9kYXRhX2ZyZWUpKTsKK30KKworZ3VpbnQxNgorbGFuZ3VhZ2VfY29kZSAoY29uc3QgY2hhciAqbGFuZykKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGxhbmcgIT0gTlVMTCwgMCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzdHJsZW4gKGxhbmcpID09IDMsIDApOworCisgIHJldHVybiAoKChsYW5nWzBdIC0gMHg2MCkgJiAweDFGKSA8PCAxMCkgKyAoKChsYW5nWzFdIC0gMHg2MCkgJiAweDFGKSA8PCA1KSArCisgICAgICAoKGxhbmdbMl0gLSAweDYwKSAmIDB4MUYpOworfQorCit2b2lkCithdG9tX3VkdGFfYWRkXzNncF9zdHJfaW50X3RhZyAoQXRvbVVEVEEgKiB1ZHRhLCBndWludDMyIGZvdXJjYywKKyAgICBjb25zdCBnY2hhciAqIHZhbHVlLCBnaW50MTYgaXZhbHVlKQoreworICBnaW50IGxlbiA9IDAsIHNpemUgPSAwOworICBndWludDggKmRhdGE7CisKKyAgaWYgKHZhbHVlKSB7CisgICAgbGVuID0gc3RybGVuICh2YWx1ZSk7CisgICAgc2l6ZSA9IGxlbiArIDM7CisgIH0KKworICBpZiAoaXZhbHVlID49IDApCisgICAgc2l6ZSArPSAyOworCisgIGRhdGEgPSBnX21hbGxvYyAoc2l6ZSArIDMpOworICAvKiBsYW5ndWFnZSB0YWcgYW5kIG51bGwtdGVybWluYXRlZCBVVEYtOCBzdHJpbmcgKi8KKyAgaWYgKHZhbHVlKSB7CisgICAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSwgbGFuZ3VhZ2VfY29kZSAoR1NUX1FUX01VWF9ERUZBVUxUX1RBR19MQU5HVUFHRSkpOworICAgIC8qIGluY2x1ZGUgMCB0ZXJtaW5hdG9yICovCisgICAgbWVtY3B5IChkYXRhICsgMiwgdmFsdWUsIGxlbiArIDEpOworICB9CisgIC8qIDE2LWJpdCB1bnNpZ25lZCBpbnQgaWYgc3RhbmRhbG9uZSwgb3RoZXJ3aXNlIDgtYml0ICovCisgIGlmIChpdmFsdWUgPj0gMCkgeworICAgIGlmIChzaXplID09IDIpCisgICAgICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhICsgc2l6ZSAtIDIsIGl2YWx1ZSk7CisgICAgZWxzZSB7CisgICAgICBHU1RfV1JJVEVfVUlOVDggKGRhdGEgKyBzaXplIC0gMiwgaXZhbHVlICYgMHhGRik7CisgICAgICBzaXplLS07CisgICAgfQorICB9CisKKyAgYXRvbV91ZHRhX2FkZF8zZ3BfdGFnICh1ZHRhLCBmb3VyY2MsIGRhdGEsIHNpemUpOworICBnX2ZyZWUgKGRhdGEpOworfQorCit2b2lkCithdG9tX3VkdGFfYWRkXzNncF9zdHJfdGFnIChBdG9tVURUQSAqIHVkdGEsIGd1aW50MzIgZm91cmNjLCBjb25zdCBnY2hhciAqIHZhbHVlKQoreworICBhdG9tX3VkdGFfYWRkXzNncF9zdHJfaW50X3RhZyAodWR0YSwgZm91cmNjLCB2YWx1ZSwgLTEpOworfQorCit2b2lkCithdG9tX3VkdGFfYWRkXzNncF91aW50X3RhZyAoQXRvbVVEVEEgKiB1ZHRhLCBndWludDMyIGZvdXJjYywgZ3VpbnQxNiB2YWx1ZSkKK3sKKyAgYXRvbV91ZHRhX2FkZF8zZ3Bfc3RyX2ludF90YWcgKHVkdGEsIGZvdXJjYywgTlVMTCwgdmFsdWUpOworfQorCit2b2lkCithdG9tX3VkdGFfYWRkX3htcF90YWdzIChBdG9tVURUQSAqIHVkdGEsIEdzdEJ1ZmZlciAqIHhtcGJ1ZmZlcikKK3sKKyAgQXRvbURhdGEgKmRhdGFfYXRvbSA9IE5VTEw7CisKKyAgaWYgKHVkdGEtPmNvbnRleHQtPmZsYXZvciA9PSBBVE9NU19UUkVFX0ZMQVZPUl9NT1YpIHsKKyAgICBpZiAoeG1wYnVmZmVyKSB7CisgICAgICBkYXRhX2F0b20gPSBhdG9tX2RhdGFfbmV3X2Zyb21fZ3N0X2J1ZmZlciAoRk9VUkNDX1hNUF8sIHhtcGJ1ZmZlcik7CisgICAgICB1ZHRhLT5lbnRyaWVzID0gZ19saXN0X2FwcGVuZCAodWR0YS0+ZW50cmllcywKKyAgICAgICAgICBidWlsZF9hdG9tX2luZm9fd3JhcHBlciAoKEF0b20gKikgZGF0YV9hdG9tLCBhdG9tX2RhdGFfY29weV9kYXRhLAorICAgICAgICAgICAgICBhdG9tX2RhdGFfZnJlZSkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUcgKCJOb3QgYWRkaW5nIHhtcCB0byBtb292IGF0b20sIGl0IGlzIG9ubHkgdXNlZCBpbiAnbW92JyBmb3JtYXQiKTsKKyAgfQorfQorCisvKgorICogRnVuY3Rpb25zIGZvciBzcGVjaWZ5aW5nIG1lZGlhIHR5cGVzCisgKi8KKworc3RhdGljIHZvaWQKK2F0b21fbWluZl9zZXRfYXVkaW8gKEF0b21NSU5GICogbWluZikKK3sKKyAgYXRvbV9taW5mX2NsZWFyX2hhbmRsZXJzIChtaW5mKTsKKyAgbWluZi0+c21oZCA9IGF0b21fc21oZF9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX21pbmZfc2V0X3ZpZGVvIChBdG9tTUlORiAqIG1pbmYsIEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIGF0b21fbWluZl9jbGVhcl9oYW5kbGVycyAobWluZik7CisgIG1pbmYtPnZtaGQgPSBhdG9tX3ZtaGRfbmV3IChjb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fbWluZl9zZXRfc3VidGl0bGUgKEF0b21NSU5GICogbWluZikKK3sKKyAgYXRvbV9taW5mX2NsZWFyX2hhbmRsZXJzIChtaW5mKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21faGRscl9zZXRfdHlwZSAoQXRvbUhETFIgKiBoZGxyLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0LCBndWludDMyIGNvbXBfdHlwZSwKKyAgICBndWludDMyIGhkbHJfdHlwZSkKK3sKKyAgaWYgKGNvbnRleHQtPmZsYXZvciA9PSBBVE9NU19UUkVFX0ZMQVZPUl9NT1YpIHsKKyAgICBoZGxyLT5jb21wb25lbnRfdHlwZSA9IGNvbXBfdHlwZTsKKyAgfQorICBoZGxyLT5oYW5kbGVyX3R5cGUgPSBoZGxyX3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX2hkbHJfc2V0X25hbWUgKEF0b21IRExSICogaGRsciwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgZ19mcmVlIChoZGxyLT5uYW1lKTsKKyAgaGRsci0+bmFtZSA9IGdfc3RyZHVwIChuYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fbWRpYV9zZXRfaGRscl90eXBlX2F1ZGlvIChBdG9tTURJQSAqIG1kaWEsIEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIGF0b21faGRscl9zZXRfdHlwZSAoJm1kaWEtPmhkbHIsIGNvbnRleHQsIEZPVVJDQ19taGxyLCBGT1VSQ0Nfc291bik7CisgIC8qIFNvbWUgcGxheWVycyAobG93LWVuZCBoYXJkd2FyZSkgY2hlY2sgZm9yIHRoaXMgbmFtZSwgd2hpY2ggaXMgd2hhdAorICAgKiBRdWlja1RpbWUgaXRzZWxmIHNldHMgKi8KKyAgYXRvbV9oZGxyX3NldF9uYW1lICgmbWRpYS0+aGRsciwgIlNvdW5kSGFuZGxlciIpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9tZGlhX3NldF9oZGxyX3R5cGVfdmlkZW8gKEF0b21NRElBICogbWRpYSwgQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgYXRvbV9oZGxyX3NldF90eXBlICgmbWRpYS0+aGRsciwgY29udGV4dCwgRk9VUkNDX21obHIsIEZPVVJDQ192aWRlKTsKKyAgLyogU29tZSBwbGF5ZXJzIChsb3ctZW5kIGhhcmR3YXJlKSBjaGVjayBmb3IgdGhpcyBuYW1lLCB3aGljaCBpcyB3aGF0CisgICAqIFF1aWNrVGltZSBpdHNlbGYgc2V0cyAqLworICBhdG9tX2hkbHJfc2V0X25hbWUgKCZtZGlhLT5oZGxyLCAiVmlkZW9IYW5kbGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX21kaWFfc2V0X2hkbHJfdHlwZV9zdWJ0aXRsZSAoQXRvbU1ESUEgKiBtZGlhLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0KQoreworICBhdG9tX2hkbHJfc2V0X3R5cGUgKCZtZGlhLT5oZGxyLCBjb250ZXh0LCBGT1VSQ0NfbWhsciwgRk9VUkNDX3NidGwpOworCisgIC8qIEp1c3QgZm9sbG93cyB0aGUgcGF0dGVybiBmcm9tIHZpZGVvIGFuZCBhdWRpbyBhYm92ZSAqLworICBhdG9tX2hkbHJfc2V0X25hbWUgKCZtZGlhLT5oZGxyLCAiU3VidGl0bGVIYW5kbGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX21kaWFfc2V0X2F1ZGlvIChBdG9tTURJQSAqIG1kaWEsIEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIGF0b21fbWRpYV9zZXRfaGRscl90eXBlX2F1ZGlvIChtZGlhLCBjb250ZXh0KTsKKyAgYXRvbV9taW5mX3NldF9hdWRpbyAoJm1kaWEtPm1pbmYpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9tZGlhX3NldF92aWRlbyAoQXRvbU1ESUEgKiBtZGlhLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0KQoreworICBhdG9tX21kaWFfc2V0X2hkbHJfdHlwZV92aWRlbyAobWRpYSwgY29udGV4dCk7CisgIGF0b21fbWluZl9zZXRfdmlkZW8gKCZtZGlhLT5taW5mLCBjb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fbWRpYV9zZXRfc3VidGl0bGUgKEF0b21NRElBICogbWRpYSwgQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgYXRvbV9tZGlhX3NldF9oZGxyX3R5cGVfc3VidGl0bGUgKG1kaWEsIGNvbnRleHQpOworICBhdG9tX21pbmZfc2V0X3N1YnRpdGxlICgmbWRpYS0+bWluZik7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3RraGRfc2V0X2F1ZGlvIChBdG9tVEtIRCAqIHRraGQpCit7CisgIHRraGQtPnZvbHVtZSA9IDB4MDEwMDsKKyAgdGtoZC0+d2lkdGggPSB0a2hkLT5oZWlnaHQgPSAwOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90a2hkX3NldF92aWRlbyAoQXRvbVRLSEQgKiB0a2hkLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0LCBndWludDMyIHdpZHRoLAorICAgIGd1aW50MzIgaGVpZ2h0KQoreworICB0a2hkLT52b2x1bWUgPSAwOworCisgIC8qIHF0IGFuZCBJU08gYmFzZSBtZWRpYSBkbyBub3QgY29udHJhZGljdCwgYW5kIGV4YW1wbGVzIGFncmVlICovCisgIHRraGQtPndpZHRoID0gd2lkdGg7CisgIHRraGQtPmhlaWdodCA9IGhlaWdodDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdGtoZF9zZXRfc3VidGl0bGUgKEF0b21US0hEICogdGtoZCwgQXRvbXNDb250ZXh0ICogY29udGV4dCwgZ3VpbnQzMiB3aWR0aCwKKyAgICBndWludDMyIGhlaWdodCkKK3sKKyAgdGtoZC0+dm9sdW1lID0gMDsKKworICAvKiBxdCBhbmQgSVNPIGJhc2UgbWVkaWEgZG8gbm90IGNvbnRyYWRpY3QsIGFuZCBleGFtcGxlcyBhZ3JlZSAqLworICB0a2hkLT53aWR0aCA9IHdpZHRoOworICB0a2hkLT5oZWlnaHQgPSBoZWlnaHQ7Cit9CisKKworc3RhdGljIHZvaWQKK2F0b21fZWR0c19hZGRfZW50cnkgKEF0b21FRFRTICogZWR0cywgZ2ludCBpbmRleCwgRWRpdExpc3RFbnRyeSAqIGVudHJ5KQoreworICBFZGl0TGlzdEVudHJ5ICplID0KKyAgICAgIChFZGl0TGlzdEVudHJ5ICopIGdfc2xpc3RfbnRoX2RhdGEgKGVkdHMtPmVsc3QuZW50cmllcywgaW5kZXgpOworICAvKiBDcmVhdGUgYSBuZXcgZW50cnkgaWYgbWlzc2luZyAoYXBwZW5kcyB0byB0aGUgbGlzdCBpZiBpbmRleCBpcyBsYXJnZXIpICovCisgIGlmIChlID09IE5VTEwpIHsKKyAgICBlID0gZ19uZXcgKEVkaXRMaXN0RW50cnksIDEpOworICAgIGVkdHMtPmVsc3QuZW50cmllcyA9IGdfc2xpc3RfaW5zZXJ0IChlZHRzLT5lbHN0LmVudHJpZXMsIGUsIGluZGV4KTsKKyAgfQorCisgIC8qIFVwZGF0ZSB0aGUgZW50cnkgKi8KKyAgKmUgPSAqZW50cnk7Cit9CisKK3ZvaWQKK2F0b21fdHJha19lZHRzX2NsZWFyIChBdG9tVFJBSyAqIHRyYWspCit7CisgIGlmICh0cmFrLT5lZHRzKSB7CisgICAgYXRvbV9lZHRzX2ZyZWUgKHRyYWstPmVkdHMpOworICAgIHRyYWstPmVkdHMgPSBOVUxMOworICB9Cit9CisKKy8qCisgKiBVcGRhdGUgYW4gZW50cnkgaW4gdGhpcyB0cmFrIGVkaXRzIGxpc3QsIGNyZWF0aW5nIGl0IGlmIG5lZWRlZC4KKyAqIGluZGV4IGlzIHRoZSBpbmRleCBvZiB0aGUgZW50cnkgdG8gdXBkYXRlLCBvciBjcmVhdGUgaWYgaXQncyBwYXN0IHRoZSBlbmQuCisgKiBkdXJhdGlvbiBpcyBpbiB0aGUgbW9vdidzIHRpbWVzY2FsZQorICogbWVkaWFfdGltZSBpcyB0aGUgb2Zmc2V0IGluIHRoZSBtZWRpYSB0aW1lIHRvIHN0YXJ0IGZyb20gKG1lZGlhJ3MgdGltZXNjYWxlKQorICogcmF0ZSBpcyBhIDMyIGJpdHMgZml4ZWQtcG9pbnQKKyAqLwordm9pZAorYXRvbV90cmFrX3NldF9lbHN0X2VudHJ5IChBdG9tVFJBSyAqIHRyYWssIGdpbnQgaW5kZXgsCisgICAgZ3VpbnQzMiBkdXJhdGlvbiwgZ3VpbnQzMiBtZWRpYV90aW1lLCBndWludDMyIHJhdGUpCit7CisgIEVkaXRMaXN0RW50cnkgZW50cnk7CisKKyAgZW50cnkuZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgZW50cnkubWVkaWFfdGltZSA9IG1lZGlhX3RpbWU7CisgIGVudHJ5Lm1lZGlhX3JhdGUgPSByYXRlOworCisgIGlmICh0cmFrLT5lZHRzID09IE5VTEwpCisgICAgdHJhay0+ZWR0cyA9IGF0b21fZWR0c19uZXcgKCk7CisKKyAgYXRvbV9lZHRzX2FkZF9lbnRyeSAodHJhay0+ZWR0cywgaW5kZXgsICZlbnRyeSk7Cit9CisKKy8qIHJlLW5lZ290aWF0aW9uIGlzIHByZXZlbnRlZCBhdCB0b3AtbGV2ZWwsIHNvIG9ubHkgMSBlbnRyeSBleHBlY3RlZC4KKyAqIFF1aXRlIHNvbWUgbW9yZSBjYXJlIGhlcmUgYW5kIGVsc2V3aGVyZSBtYXkgYmUgbmVlZGVkIHRvCisgKiBzdXBwb3J0IHNldmVyYWwgZW50cmllcyAqLworc3RhdGljIFNhbXBsZVRhYmxlRW50cnlNUDRBICoKK2F0b21fdHJha19hZGRfYXVkaW9fZW50cnkgKEF0b21UUkFLICogdHJhaywgQXRvbXNDb250ZXh0ICogY29udGV4dCwKKyAgICBndWludDMyIHR5cGUpCit7CisgIEF0b21TVFNEICpzdHNkID0gJnRyYWstPm1kaWEubWluZi5zdGJsLnN0c2Q7CisgIFNhbXBsZVRhYmxlRW50cnlNUDRBICptcDRhID0gc2FtcGxlX2VudHJ5X21wNGFfbmV3ICgpOworCisgIG1wNGEtPnNlLmhlYWRlci50eXBlID0gdHlwZTsKKyAgbXA0YS0+c2Uua2luZCA9IEFVRElPOworICBtcDRhLT5jb21wcmVzc2lvbl9pZCA9IC0xOworICBtcDRhLT5zZS5kYXRhX3JlZmVyZW5jZV9pbmRleCA9IDE7CisKKyAgc3RzZC0+ZW50cmllcyA9IGdfbGlzdF9wcmVwZW5kIChzdHNkLT5lbnRyaWVzLCBtcDRhKTsKKyAgc3RzZC0+bl9lbnRyaWVzKys7CisgIHJldHVybiBtcDRhOworfQorCisvKiByZXR1cm4gbnVtYmVyIG9mIGNlbnRpZnJhbWVzIHBlciBzZWNvbmQgKi8KK2d1aW50CithdG9tX2ZyYW1lcmF0ZV90b190aW1lc2NhbGUgKGdpbnQgbiwgZ2ludCBkKQoreworICBpZiAobiA9PSAwKQorICAgIHJldHVybiAxMDAwMDsKKworICBpZiAoZCAhPSAxICYmIGQgIT0gMTAwMSkgeworICAgIC8qIG90aGVyd2lzZSB0aGVyZSBhcmUgcHJvYmFibHkgcm91bmRpbmcgZXJyb3JzIGFuZCB3ZSBzaG91bGQgcmF0aGVyIGd1ZXNzCisgICAgICogaWYgaXQncyBjbG9zZSBlbm91Z2ggdG8gYSB3ZWxsIGtub3duIGZyYW1lcmF0ZSAqLworICAgIGdzdF92aWRlb19ndWVzc19mcmFtZXJhdGUgKGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoZCwgR1NUX1NFQ09ORCwgbiksICZuLAorICAgICAgICAmZCk7CisgIH0KKworICByZXR1cm4gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChuLCAxMDAsIGQpOworfQorCitzdGF0aWMgU2FtcGxlVGFibGVFbnRyeVRNQ0QgKgorYXRvbV90cmFrX2FkZF90aW1lY29kZV9lbnRyeSAoQXRvbVRSQUsgKiB0cmFrLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0LAorICAgIGd1aW50MzIgdHJha190aW1lc2NhbGUsIEdzdFZpZGVvVGltZUNvZGUgKiB0YykKK3sKKyAgQXRvbVNUU0QgKnN0c2QgPSAmdHJhay0+bWRpYS5taW5mLnN0Ymwuc3RzZDsKKyAgU2FtcGxlVGFibGVFbnRyeVRNQ0QgKnRtY2QgPSBzYW1wbGVfZW50cnlfdG1jZF9uZXcgKCk7CisKKyAgZ19hc3NlcnQgKHRyYWtfdGltZXNjYWxlICE9IDApOworCisgIHRyYWstPm1kaWEuaGRsci5jb21wb25lbnRfdHlwZSA9IEZPVVJDQ19taGxyOworICB0cmFrLT5tZGlhLmhkbHIuaGFuZGxlcl90eXBlID0gRk9VUkNDX3RtY2Q7CisgIGdfZnJlZSAodHJhay0+bWRpYS5oZGxyLm5hbWUpOworICB0cmFrLT5tZGlhLmhkbHIubmFtZSA9IGdfc3RyZHVwICgiVGltZSBDb2RlIE1lZGlhIEhhbmRsZXIiKTsKKyAgdHJhay0+bWRpYS5tZGhkLnRpbWVfaW5mby50aW1lc2NhbGUgPSB0cmFrX3RpbWVzY2FsZTsKKworICB0bWNkLT5zZS5raW5kID0gVElNRUNPREU7CisgIHRtY2QtPnNlLmRhdGFfcmVmZXJlbmNlX2luZGV4ID0gMTsKKyAgdG1jZC0+dGNfZmxhZ3MgPSBUQ18yNEhfTUFYOworICBpZiAodGMtPmNvbmZpZy5mbGFncyAmPSBHU1RfVklERU9fVElNRV9DT0RFX0ZMQUdTX0RST1BfRlJBTUUpCisgICAgdG1jZC0+dGNfZmxhZ3MgfD0gVENfRFJPUF9GUkFNRTsKKyAgdG1jZC0+bmFtZS5sYW5ndWFnZV9jb2RlID0gMDsKKyAgdG1jZC0+bmFtZS5uYW1lID0gZ19zdHJkdXAgKCJUYXBlIik7CisgIHRtY2QtPnRpbWVzY2FsZSA9IHRyYWtfdGltZXNjYWxlOworICB0bWNkLT5mcmFtZV9kdXJhdGlvbiA9CisgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHRtY2QtPnRpbWVzY2FsZSwgdGMtPmNvbmZpZy5mcHNfZCwKKyAgICAgIHRjLT5jb25maWcuZnBzX24pOworICBpZiAodGMtPmNvbmZpZy5mcHNfZCA9PSAxMDAxKQorICAgIHRtY2QtPm5fZnJhbWVzID0gdGMtPmNvbmZpZy5mcHNfbiAvIDEwMDA7CisgIGVsc2UKKyAgICB0bWNkLT5uX2ZyYW1lcyA9IHRjLT5jb25maWcuZnBzX24gLyB0Yy0+Y29uZmlnLmZwc19kOworCisgIHN0c2QtPmVudHJpZXMgPSBnX2xpc3RfcHJlcGVuZCAoc3RzZC0+ZW50cmllcywgdG1jZCk7CisgIHN0c2QtPm5fZW50cmllcysrOworICByZXR1cm4gdG1jZDsKK30KKworc3RhdGljIFNhbXBsZVRhYmxlRW50cnlNUDRWICoKK2F0b21fdHJha19hZGRfdmlkZW9fZW50cnkgKEF0b21UUkFLICogdHJhaywgQXRvbXNDb250ZXh0ICogY29udGV4dCwKKyAgICBndWludDMyIHR5cGUpCit7CisgIFNhbXBsZVRhYmxlRW50cnlNUDRWICptcDR2ID0gc2FtcGxlX2VudHJ5X21wNHZfbmV3IChjb250ZXh0KTsKKyAgQXRvbVNUU0QgKnN0c2QgPSAmdHJhay0+bWRpYS5taW5mLnN0Ymwuc3RzZDsKKworICBtcDR2LT5zZS5oZWFkZXIudHlwZSA9IHR5cGU7CisgIG1wNHYtPnNlLmtpbmQgPSBWSURFTzsKKyAgbXA0di0+c2UuZGF0YV9yZWZlcmVuY2VfaW5kZXggPSAxOworICBtcDR2LT5ob3Jpem9udGFsX3Jlc29sdXRpb24gPSA3MiA8PCAxNjsKKyAgbXA0di0+dmVydGljYWxfcmVzb2x1dGlvbiA9IDcyIDw8IDE2OworICBpZiAoY29udGV4dC0+Zmxhdm9yID09IEFUT01TX1RSRUVfRkxBVk9SX01PVikgeworICAgIG1wNHYtPnNwYXRpYWxfcXVhbGl0eSA9IDUxMjsKKyAgICBtcDR2LT50ZW1wb3JhbF9xdWFsaXR5ID0gNTEyOworICB9CisKKyAgc3RzZC0+ZW50cmllcyA9IGdfbGlzdF9wcmVwZW5kIChzdHNkLT5lbnRyaWVzLCBtcDR2KTsKKyAgc3RzZC0+bl9lbnRyaWVzKys7CisgIHJldHVybiBtcDR2OworfQorCitzdGF0aWMgU2FtcGxlVGFibGVFbnRyeVRYM0cgKgorYXRvbV90cmFrX2FkZF9zdWJ0aXRsZV9lbnRyeSAoQXRvbVRSQUsgKiB0cmFrLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0LAorICAgIGd1aW50MzIgdHlwZSkKK3sKKyAgU2FtcGxlVGFibGVFbnRyeVRYM0cgKnR4M2cgPSBzYW1wbGVfZW50cnlfdHgzZ19uZXcgKCk7CisgIEF0b21TVFNEICpzdHNkID0gJnRyYWstPm1kaWEubWluZi5zdGJsLnN0c2Q7CisKKyAgdHgzZy0+c2UuaGVhZGVyLnR5cGUgPSB0eXBlOworICB0eDNnLT5zZS5raW5kID0gU1VCVElUTEU7CisgIHR4M2ctPnNlLmRhdGFfcmVmZXJlbmNlX2luZGV4ID0gMTsKKworICBzdHNkLT5lbnRyaWVzID0gZ19saXN0X3ByZXBlbmQgKHN0c2QtPmVudHJpZXMsIHR4M2cpOworICBzdHNkLT5uX2VudHJpZXMrKzsKKyAgcmV0dXJuIHR4M2c7Cit9CisKKwordm9pZAorYXRvbV90cmFrX3NldF9jb25zdGFudF9zaXplX3NhbXBsZXMgKEF0b21UUkFLICogdHJhaywgZ3VpbnQzMiBzYW1wbGVfc2l6ZSkKK3sKKyAgdHJhay0+bWRpYS5taW5mLnN0Ymwuc3Rzei5zYW1wbGVfc2l6ZSA9IHNhbXBsZV9zaXplOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cmFrX3NldF9hdWRpbyAoQXRvbVRSQUsgKiB0cmFrLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0KQoreworICBhdG9tX3RraGRfc2V0X2F1ZGlvICgmdHJhay0+dGtoZCk7CisgIGF0b21fbWRpYV9zZXRfYXVkaW8gKCZ0cmFrLT5tZGlhLCBjb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdHJha19zZXRfdmlkZW8gKEF0b21UUkFLICogdHJhaywgQXRvbXNDb250ZXh0ICogY29udGV4dCwgZ3VpbnQzMiB3aWR0aCwKKyAgICBndWludDMyIGhlaWdodCkKK3sKKyAgYXRvbV90a2hkX3NldF92aWRlbyAoJnRyYWstPnRraGQsIGNvbnRleHQsIHdpZHRoLCBoZWlnaHQpOworICBhdG9tX21kaWFfc2V0X3ZpZGVvICgmdHJhay0+bWRpYSwgY29udGV4dCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3RyYWtfc2V0X3N1YnRpdGxlIChBdG9tVFJBSyAqIHRyYWssIEF0b21zQ29udGV4dCAqIGNvbnRleHQpCit7CisgIGF0b21fdGtoZF9zZXRfc3VidGl0bGUgKCZ0cmFrLT50a2hkLCBjb250ZXh0LCAwLCAwKTsKKyAgYXRvbV9tZGlhX3NldF9zdWJ0aXRsZSAoJnRyYWstPm1kaWEsIGNvbnRleHQpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cmFrX3NldF9hdWRpb19jb21tb25zIChBdG9tVFJBSyAqIHRyYWssIEF0b21zQ29udGV4dCAqIGNvbnRleHQsCisgICAgZ3VpbnQzMiByYXRlKQoreworICBhdG9tX3RyYWtfc2V0X2F1ZGlvICh0cmFrLCBjb250ZXh0KTsKKyAgdHJhay0+bWRpYS5tZGhkLnRpbWVfaW5mby50aW1lc2NhbGUgPSByYXRlOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cmFrX3NldF92aWRlb19jb21tb25zIChBdG9tVFJBSyAqIHRyYWssIEF0b21zQ29udGV4dCAqIGNvbnRleHQsCisgICAgZ3VpbnQzMiByYXRlLCBndWludDMyIHdpZHRoLCBndWludDMyIGhlaWdodCkKK3sKKyAgYXRvbV90cmFrX3NldF92aWRlbyAodHJhaywgY29udGV4dCwgd2lkdGgsIGhlaWdodCk7CisgIHRyYWstPm1kaWEubWRoZC50aW1lX2luZm8udGltZXNjYWxlID0gcmF0ZTsKKyAgdHJhay0+dGtoZC53aWR0aCA9IHdpZHRoIDw8IDE2OworICB0cmFrLT50a2hkLmhlaWdodCA9IGhlaWdodCA8PCAxNjsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdHJha19zZXRfc3VidGl0bGVfY29tbW9ucyAoQXRvbVRSQUsgKiB0cmFrLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0KQoreworICBhdG9tX3RyYWtfc2V0X3N1YnRpdGxlICh0cmFrLCBjb250ZXh0KTsKKyAgdHJhay0+bWRpYS5tZGhkLnRpbWVfaW5mby50aW1lc2NhbGUgPSAxMDAwOworCisgIHRyYWstPnRraGQuYWx0ZXJuYXRlX2dyb3VwID0gMjsgICAgICAgLyogc2FtZSBmb3IgYWxsIHN1YnRpdGxlcyAqLworICB0cmFrLT50a2hkLmxheWVyID0gLTE7ICAgICAgICAvKiBhYm92ZSB2aWRlbyAobGF5ZXIgMCkgKi8KK30KKwordm9pZAorc2FtcGxlX3RhYmxlX2VudHJ5X2FkZF9leHRfYXRvbSAoU2FtcGxlVGFibGVFbnRyeSAqIHN0ZSwgQXRvbUluZm8gKiBleHQpCit7CisgIEdMaXN0ICoqbGlzdCA9IE5VTEw7CisgIGlmIChzdGUtPmtpbmQgPT0gQVVESU8pIHsKKyAgICBsaXN0ID0gJigoKFNhbXBsZVRhYmxlRW50cnlNUDRBICopIHN0ZSktPmV4dGVuc2lvbl9hdG9tcyk7CisgIH0gZWxzZSBpZiAoc3RlLT5raW5kID09IFZJREVPKSB7CisgICAgbGlzdCA9ICYoKChTYW1wbGVUYWJsZUVudHJ5TVA0ViAqKSBzdGUpLT5leHRlbnNpb25fYXRvbXMpOworICB9IGVsc2UgeworICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgIHJldHVybjsKKyAgfQorCisgICpsaXN0ID0gZ19saXN0X3ByZXBlbmQgKCpsaXN0LCBleHQpOworfQorCitTYW1wbGVUYWJsZUVudHJ5TVA0QSAqCithdG9tX3RyYWtfc2V0X2F1ZGlvX3R5cGUgKEF0b21UUkFLICogdHJhaywgQXRvbXNDb250ZXh0ICogY29udGV4dCwKKyAgICBBdWRpb1NhbXBsZUVudHJ5ICogZW50cnksIGd1aW50MzIgc2NhbGUsIEF0b21JbmZvICogZXh0LCBnaW50IHNhbXBsZV9zaXplKQoreworICBTYW1wbGVUYWJsZUVudHJ5TVA0QSAqc3RlOworCisgIGF0b21fdHJha19zZXRfYXVkaW9fY29tbW9ucyAodHJhaywgY29udGV4dCwgc2NhbGUpOworICBhdG9tX3N0c2RfcmVtb3ZlX2VudHJpZXMgKCZ0cmFrLT5tZGlhLm1pbmYuc3RibC5zdHNkKTsKKyAgc3RlID0gYXRvbV90cmFrX2FkZF9hdWRpb19lbnRyeSAodHJhaywgY29udGV4dCwgZW50cnktPmZvdXJjYyk7CisKKyAgdHJhay0+aXNfdmlkZW8gPSBGQUxTRTsKKyAgdHJhay0+aXNfaDI2NCA9IEZBTFNFOworCisgIHN0ZS0+dmVyc2lvbiA9IGVudHJ5LT52ZXJzaW9uOworICBzdGUtPmNvbXByZXNzaW9uX2lkID0gZW50cnktPmNvbXByZXNzaW9uX2lkOworICBzdGUtPnNhbXBsZV9zaXplID0gZW50cnktPnNhbXBsZV9zaXplOworICBzdGUtPnNhbXBsZV9yYXRlID0gZW50cnktPnNhbXBsZV9yYXRlIDw8IDE2OworICBzdGUtPmNoYW5uZWxzID0gZW50cnktPmNoYW5uZWxzOworCisgIHN0ZS0+c2FtcGxlc19wZXJfcGFja2V0ID0gZW50cnktPnNhbXBsZXNfcGVyX3BhY2tldDsKKyAgc3RlLT5ieXRlc19wZXJfc2FtcGxlID0gZW50cnktPmJ5dGVzX3Blcl9zYW1wbGU7CisgIHN0ZS0+Ynl0ZXNfcGVyX3BhY2tldCA9IGVudHJ5LT5ieXRlc19wZXJfcGFja2V0OworICBzdGUtPmJ5dGVzX3Blcl9mcmFtZSA9IGVudHJ5LT5ieXRlc19wZXJfZnJhbWU7CisKKyAgaWYgKGV4dCkKKyAgICBzdGUtPmV4dGVuc2lvbl9hdG9tcyA9IGdfbGlzdF9wcmVwZW5kIChzdGUtPmV4dGVuc2lvbl9hdG9tcywgZXh0KTsKKworICAvKiAwIHNpemUgbWVhbnMgdmFyaWFibGUgc2l6ZSAqLworICBhdG9tX3RyYWtfc2V0X2NvbnN0YW50X3NpemVfc2FtcGxlcyAodHJhaywgc2FtcGxlX3NpemUpOworCisgIHJldHVybiBzdGU7Cit9CisKK1NhbXBsZVRhYmxlRW50cnlUTUNEICoKK2F0b21fdHJha19zZXRfdGltZWNvZGVfdHlwZSAoQXRvbVRSQUsgKiB0cmFrLCBBdG9tc0NvbnRleHQgKiBjb250ZXh0LAorICAgIGd1aW50MzIgdHJha190aW1lc2NhbGUsIEdzdFZpZGVvVGltZUNvZGUgKiB0YykKK3sKKyAgU2FtcGxlVGFibGVFbnRyeVRNQ0QgKnN0ZTsKKyAgQXRvbUdNSEQgKmdtaGQgPSB0cmFrLT5tZGlhLm1pbmYuZ21oZDsKKworICBpZiAoY29udGV4dC0+Zmxhdm9yICE9IEFUT01TX1RSRUVfRkxBVk9SX01PVikgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgc3RlID0gYXRvbV90cmFrX2FkZF90aW1lY29kZV9lbnRyeSAodHJhaywgY29udGV4dCwgdHJha190aW1lc2NhbGUsIHRjKTsKKworICBnbWhkID0gYXRvbV9nbWhkX25ldyAoKTsKKyAgZ21oZC0+Z21pbi5ncmFwaGljc19tb2RlID0gMHgwMDQwOworICBnbWhkLT5nbWluLm9wY29sb3JbMF0gPSAweDgwMDA7CisgIGdtaGQtPmdtaW4ub3Bjb2xvclsxXSA9IDB4ODAwMDsKKyAgZ21oZC0+Z21pbi5vcGNvbG9yWzJdID0gMHg4MDAwOworICBnbWhkLT50bWNkLnRjbWkudGV4dF9zaXplID0gMTI7CisgIGdtaGQtPnRtY2QudGNtaS5mb250X25hbWUgPSBnX3N0cmR1cCAoIkNoaWNhZ28iKTsgICAgIC8qIFBhc2NhbCBzdHJpbmcgKi8KKworICB0cmFrLT5tZGlhLm1pbmYuZ21oZCA9IGdtaGQ7CisgIHRyYWstPmlzX3ZpZGVvID0gRkFMU0U7CisgIHRyYWstPmlzX2gyNjQgPSBGQUxTRTsKKworICByZXR1cm4gc3RlOworfQorCitzdGF0aWMgQXRvbUluZm8gKgorYnVpbGRfcGFzcF9leHRlbnNpb24gKGdpbnQgcGFyX3dpZHRoLCBnaW50IHBhcl9oZWlnaHQpCit7CisgIEF0b21EYXRhICphdG9tX2RhdGEgPSBhdG9tX2RhdGFfbmV3IChGT1VSQ0NfcGFzcCk7CisgIGd1aW50OCAqZGF0YTsKKworICBhdG9tX2RhdGFfYWxsb2NfbWVtIChhdG9tX2RhdGEsIDgpOworICBkYXRhID0gYXRvbV9kYXRhLT5kYXRhOworCisgIC8qIGloZHIgPSBpbWFnZSBoZWFkZXIgYm94ICovCisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEsIHBhcl93aWR0aCk7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyA0LCBwYXJfaGVpZ2h0KTsKKworICByZXR1cm4gYnVpbGRfYXRvbV9pbmZvX3dyYXBwZXIgKChBdG9tICopIGF0b21fZGF0YSwgYXRvbV9kYXRhX2NvcHlfZGF0YSwKKyAgICAgIGF0b21fZGF0YV9mcmVlKTsKK30KKworQXRvbUluZm8gKgorYnVpbGRfZmllbF9leHRlbnNpb24gKEdzdFZpZGVvSW50ZXJsYWNlTW9kZSBtb2RlLCBHc3RWaWRlb0ZpZWxkT3JkZXIgb3JkZXIpCit7CisgIEF0b21EYXRhICphdG9tX2RhdGEgPSBhdG9tX2RhdGFfbmV3IChGT1VSQ0NfZmllbCk7CisgIGd1aW50OCAqZGF0YTsKKyAgZ2ludCBmaWVsZF9vcmRlcjsKKyAgZ2ludCBpbnRlcmxhY2U7CisKKyAgYXRvbV9kYXRhX2FsbG9jX21lbSAoYXRvbV9kYXRhLCAyKTsKKyAgZGF0YSA9IGF0b21fZGF0YS0+ZGF0YTsKKworICBpZiAobW9kZSA9PSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfUFJPR1JFU1NJVkUpIHsKKyAgICBpbnRlcmxhY2UgPSAxOworICAgIGZpZWxkX29yZGVyID0gMDsKKyAgfSBlbHNlIGlmIChtb2RlID09IEdTVF9WSURFT19JTlRFUkxBQ0VfTU9ERV9JTlRFUkxFQVZFRCkgeworICAgIGludGVybGFjZSA9IDI7CisgICAgZmllbGRfb3JkZXIgPSBvcmRlciA9PSBHU1RfVklERU9fRklFTERfT1JERVJfVE9QX0ZJRUxEX0ZJUlNUID8gOSA6IDE0OworICB9IGVsc2UgeworICAgIGludGVybGFjZSA9IDA7CisgICAgZmllbGRfb3JkZXIgPSAwOworICB9CisKKyAgR1NUX1dSSVRFX1VJTlQ4IChkYXRhLCBpbnRlcmxhY2UpOworICBHU1RfV1JJVEVfVUlOVDggKGRhdGEgKyAxLCBmaWVsZF9vcmRlcik7CisKKyAgcmV0dXJuIGJ1aWxkX2F0b21faW5mb193cmFwcGVyICgoQXRvbSAqKSBhdG9tX2RhdGEsIGF0b21fZGF0YV9jb3B5X2RhdGEsCisgICAgICBhdG9tX2RhdGFfZnJlZSk7Cit9CisKK0F0b21JbmZvICoKK2J1aWxkX2NvbHJfZXh0ZW5zaW9uIChjb25zdCBHc3RWaWRlb0NvbG9yaW1ldHJ5ICogY29sb3JpbWV0cnksIGdib29sZWFuIGlzX21wNCkKK3sKKyAgQXRvbURhdGEgKmF0b21fZGF0YSA9IGF0b21fZGF0YV9uZXcgKEZPVVJDQ19jb2xyKTsKKyAgZ3VpbnQ4ICpkYXRhOworICBndWludDE2IHByaW1hcmllczsKKyAgZ3VpbnQxNiB0cmFuc2Zlcl9mdW5jdGlvbjsKKyAgZ3VpbnQxNiBtYXRyaXg7CisKKyAgc3dpdGNoIChjb2xvcmltZXRyeS0+cHJpbWFyaWVzKSB7CisgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX0JUNzA5OgorICAgICAgcHJpbWFyaWVzID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19CVDQ3MEJHOgorICAgICAgcHJpbWFyaWVzID0gNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19TTVBURTE3ME06CisgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX1NNUFRFMjQwTToKKyAgICAgIHByaW1hcmllcyA9IDY7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfQlQyMDIwOgorICAgICAgcHJpbWFyaWVzID0gOTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICBwcmltYXJpZXMgPSAyOworICAgICAgYnJlYWs7CisgIH0KKworICBzd2l0Y2ggKGNvbG9yaW1ldHJ5LT50cmFuc2ZlcikgeworICAgIGNhc2UgR1NUX1ZJREVPX1RSQU5TRkVSX0JUNzA5OgorICAgICAgdHJhbnNmZXJfZnVuY3Rpb24gPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fVFJBTlNGRVJfU01QVEUyNDBNOgorICAgICAgdHJhbnNmZXJfZnVuY3Rpb24gPSA3OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fVFJBTlNGRVJfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgdHJhbnNmZXJfZnVuY3Rpb24gPSAyOworICAgICAgYnJlYWs7CisgIH0KKworICBzd2l0Y2ggKGNvbG9yaW1ldHJ5LT5tYXRyaXgpIHsKKyAgICBjYXNlIEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQ3MDk6CisgICAgICBtYXRyaXggPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUNjAxOgorICAgICAgbWF0cml4ID0gNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9TTVBURTI0ME06CisgICAgICBtYXRyaXggPSA3OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUMjAyMDoKKyAgICAgIG1hdHJpeCA9IDk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19DT0xPUl9NQVRSSVhfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgbWF0cml4ID0gMjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgYXRvbV9kYXRhX2FsbG9jX21lbSAoYXRvbV9kYXRhLCAxMCArIChpc19tcDQgPyAxIDogMCkpOworICBkYXRhID0gYXRvbV9kYXRhLT5kYXRhOworCisgIC8qIGNvbG91ciBzcGVjaWZpY2F0aW9uIGJveCAqLworICBpZiAoaXNfbXA0KQorICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGRhdGEsIEZPVVJDQ19uY2x4KTsKKyAgZWxzZQorICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGRhdGEsIEZPVVJDQ19uY2xjKTsKKworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhICsgNCwgcHJpbWFyaWVzKTsKKyAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSArIDYsIHRyYW5zZmVyX2Z1bmN0aW9uKTsKKyAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSArIDgsIG1hdHJpeCk7CisKKyAgaWYgKGlzX21wNCkgeworICAgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDEwLAorICAgICAgICBjb2xvcmltZXRyeS0+cmFuZ2UgPT0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFXzBfMjU1ID8gMHg4MCA6IDB4MDApOworICB9CisKKyAgcmV0dXJuIGJ1aWxkX2F0b21faW5mb193cmFwcGVyICgoQXRvbSAqKSBhdG9tX2RhdGEsIGF0b21fZGF0YV9jb3B5X2RhdGEsCisgICAgICBhdG9tX2RhdGFfZnJlZSk7Cit9CisKK0F0b21JbmZvICoKK2J1aWxkX2NsYXBfZXh0ZW5zaW9uIChnaW50IHdpZHRoX24sIGdpbnQgd2lkdGhfZCwgZ2ludCBoZWlnaHRfbiwgZ2ludCBoZWlnaHRfZCwKKyAgICBnaW50IGhfb2ZmX24sIGdpbnQgaF9vZmZfZCwgZ2ludCB2X29mZl9uLCBnaW50IHZfb2ZmX2QpCit7CisgIEF0b21EYXRhICphdG9tX2RhdGEgPSBhdG9tX2RhdGFfbmV3IChGT1VSQ0NfY2xhcCk7CisgIGd1aW50OCAqZGF0YTsKKworICBhdG9tX2RhdGFfYWxsb2NfbWVtIChhdG9tX2RhdGEsIDMyKTsKKyAgZGF0YSA9IGF0b21fZGF0YS0+ZGF0YTsKKworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhLCB3aWR0aF9uKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDQsIHdpZHRoX2QpOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgOCwgaGVpZ2h0X24pOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgMTIsIGhlaWdodF9kKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDE2LCBoX29mZl9uKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDIwLCBoX29mZl9kKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDI0LCB2X29mZl9uKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDI4LCB2X29mZl9kKTsKKworICByZXR1cm4gYnVpbGRfYXRvbV9pbmZvX3dyYXBwZXIgKChBdG9tICopIGF0b21fZGF0YSwgYXRvbV9kYXRhX2NvcHlfZGF0YSwKKyAgICAgIGF0b21fZGF0YV9mcmVlKTsKK30KKworQXRvbUluZm8gKgorYnVpbGRfdGFwdF9leHRlbnNpb24gKGdpbnQgY2xlZl93aWR0aCwgZ2ludCBjbGVmX2hlaWdodCwgZ2ludCBwcm9mX3dpZHRoLAorICAgIGdpbnQgcHJvZl9oZWlnaHQsIGdpbnQgZW5vZl93aWR0aCwgZ2ludCBlbm9mX2hlaWdodCkKK3sKKyAgQXRvbURhdGEgKmF0b21fZGF0YSA9IGF0b21fZGF0YV9uZXcgKEZPVVJDQ190YXB0KTsKKyAgZ3VpbnQ4ICpkYXRhOworCisgIGF0b21fZGF0YV9hbGxvY19tZW0gKGF0b21fZGF0YSwgNjApOworICBkYXRhID0gYXRvbV9kYXRhLT5kYXRhOworCisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEsIDIwKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSArIDQsIEZPVVJDQ19jbGVmKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDgsIDApOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgMTIsIGNsZWZfd2lkdGgpOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgMTYsIGNsZWZfaGVpZ2h0KTsKKworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgMjAsIDIwKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSArIDI0LCBGT1VSQ0NfcHJvZik7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyAyOCwgMCk7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyAzMiwgcHJvZl93aWR0aCk7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyAzNiwgcHJvZl9oZWlnaHQpOworCisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyA0MCwgMjApOworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhICsgNDQsIEZPVVJDQ19lbm9mKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDQ4LCAwKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDUyLCBlbm9mX3dpZHRoKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDU2LCBlbm9mX2hlaWdodCk7CisKKworICByZXR1cm4gYnVpbGRfYXRvbV9pbmZvX3dyYXBwZXIgKChBdG9tICopIGF0b21fZGF0YSwgYXRvbV9kYXRhX2NvcHlfZGF0YSwKKyAgICAgIGF0b21fZGF0YV9mcmVlKTsKK30KKworc3RhdGljIEF0b21JbmZvICoKK2J1aWxkX21vdl92aWRlb19zYW1wbGVfZGVzY3JpcHRpb25fcGFkZGluZ19leHRlbnNpb24gKHZvaWQpCit7CisgIEF0b21EYXRhICphdG9tX2RhdGEgPSBhdG9tX2RhdGFfbmV3IChGT1VSQ0NfY2xhcCk7CisKKyAgcmV0dXJuIGJ1aWxkX2F0b21faW5mb193cmFwcGVyICgoQXRvbSAqKSBhdG9tX2RhdGEsIGF0b21fY29weV9lbXB0eSwKKyAgICAgIGF0b21fZGF0YV9mcmVlKTsKK30KKworU2FtcGxlVGFibGVFbnRyeU1QNFYgKgorYXRvbV90cmFrX3NldF92aWRlb190eXBlIChBdG9tVFJBSyAqIHRyYWssIEF0b21zQ29udGV4dCAqIGNvbnRleHQsCisgICAgVmlzdWFsU2FtcGxlRW50cnkgKiBlbnRyeSwgZ3VpbnQzMiBzY2FsZSwgR0xpc3QgKiBleHRfYXRvbXNfbGlzdCkKK3sKKyAgU2FtcGxlVGFibGVFbnRyeU1QNFYgKnN0ZTsKKyAgZ3VpbnQgZHdpZHRoLCBkaGVpZ2h0OworICBnaW50IHBhcl9uID0gMCwgcGFyX2QgPSAwOworCisgIHBhcl9uID0gZW50cnktPnBhcl9uOworICBwYXJfZCA9IGVudHJ5LT5wYXJfZDsKKworICBkd2lkdGggPSBlbnRyeS0+d2lkdGg7CisgIGRoZWlnaHQgPSBlbnRyeS0+aGVpZ2h0OworICAvKiBJU08gZmlsZSBzcGVjIHNheXMgdHJhY2sgaGVhZGVyIHcvaCBpbmRpY2F0ZXMgdHJhY2sncyB2aXN1YWwgcHJlc2VudGF0aW9uCisgICAqIChzbyB0aGlzIHRvZ2V0aGVyIHdpdGggcGl4ZWxzIHcvaCBpbXBsaWNpdGx5IGRlZmluZXMgUEFSKSAqLworICBpZiAocGFyX24gJiYgKGNvbnRleHQtPmZsYXZvciAhPSBBVE9NU19UUkVFX0ZMQVZPUl9NT1YpKSB7CisgICAgLyogQXNzdW1lcyBzcXVhcmUgcGl4ZWxzIGRpc3BsYXkgKi8KKyAgICBpZiAoIWdzdF92aWRlb19jYWxjdWxhdGVfZGlzcGxheV9yYXRpbyAoJmR3aWR0aCwgJmRoZWlnaHQsIGVudHJ5LT53aWR0aCwKKyAgICAgICAgICAgIGVudHJ5LT5oZWlnaHQsIHBhcl9uLCBwYXJfZCwgMSwgMSkpIHsKKyAgICAgIEdTVF9XQVJOSU5HICgiQ291bGQgbm90IGNhbGN1bGF0ZSBkaXNwbGF5IHJhdGlvIik7CisgICAgfQorICB9CisKKyAgYXRvbV90cmFrX3NldF92aWRlb19jb21tb25zICh0cmFrLCBjb250ZXh0LCBzY2FsZSwgZHdpZHRoLCBkaGVpZ2h0KTsKKyAgYXRvbV9zdHNkX3JlbW92ZV9lbnRyaWVzICgmdHJhay0+bWRpYS5taW5mLnN0Ymwuc3RzZCk7CisgIHN0ZSA9IGF0b21fdHJha19hZGRfdmlkZW9fZW50cnkgKHRyYWssIGNvbnRleHQsIGVudHJ5LT5mb3VyY2MpOworCisgIHRyYWstPmlzX3ZpZGVvID0gVFJVRTsKKyAgdHJhay0+aXNfaDI2NCA9IChlbnRyeS0+Zm91cmNjID09IEZPVVJDQ19hdmMxCisgICAgICB8fCBlbnRyeS0+Zm91cmNjID09IEZPVVJDQ19hdmMzKTsKKworICBzdGUtPnZlcnNpb24gPSBlbnRyeS0+dmVyc2lvbjsKKyAgc3RlLT53aWR0aCA9IGVudHJ5LT53aWR0aDsKKyAgc3RlLT5oZWlnaHQgPSBlbnRyeS0+aGVpZ2h0OworICBzdGUtPmRlcHRoID0gZW50cnktPmRlcHRoOworICBzdGUtPmNvbG9yX3RhYmxlX2lkID0gZW50cnktPmNvbG9yX3RhYmxlX2lkOworICBzdGUtPmZyYW1lX2NvdW50ID0gZW50cnktPmZyYW1lX2NvdW50OworCisgIGlmIChleHRfYXRvbXNfbGlzdCkKKyAgICBzdGUtPmV4dGVuc2lvbl9hdG9tcyA9IGdfbGlzdF9jb25jYXQgKHN0ZS0+ZXh0ZW5zaW9uX2F0b21zLCBleHRfYXRvbXNfbGlzdCk7CisKKyAgc3RlLT5leHRlbnNpb25fYXRvbXMgPSBnX2xpc3RfYXBwZW5kIChzdGUtPmV4dGVuc2lvbl9hdG9tcywKKyAgICAgIGJ1aWxkX3Bhc3BfZXh0ZW5zaW9uIChwYXJfbiwgcGFyX2QpKTsKKworICBpZiAoY29udGV4dC0+Zmxhdm9yID09IEFUT01TX1RSRUVfRkxBVk9SX01PVikgeworICAgIC8qIGFwcGVuZCAwIGFzIGEgdGVybWluYXRvciAibGVuZ3RoIiB0byB3b3JrIGFyb3VuZCBzb21lIGJyb2tlbiBzb2Z0d2FyZSAqLworICAgIHN0ZS0+ZXh0ZW5zaW9uX2F0b21zID0KKyAgICAgICAgZ19saXN0X2FwcGVuZCAoc3RlLT5leHRlbnNpb25fYXRvbXMsCisgICAgICAgIGJ1aWxkX21vdl92aWRlb19zYW1wbGVfZGVzY3JpcHRpb25fcGFkZGluZ19leHRlbnNpb24gKCkpOworICB9CisKKyAgcmV0dXJuIHN0ZTsKK30KKwordm9pZAorc3VidGl0bGVfc2FtcGxlX2VudHJ5X2luaXQgKFN1YnRpdGxlU2FtcGxlRW50cnkgKiBlbnRyeSkKK3sKKyAgZW50cnktPmZvbnRfc2l6ZSA9IDA7CisgIGVudHJ5LT5mb250X2ZhY2UgPSAwOworICBlbnRyeS0+Zm9yZWdyb3VuZF9jb2xvcl9yZ2JhID0gMHhGRkZGRkZGRjsgICAgLyogYWxsIHdoaXRlLCBvcGFxdWUgKi8KK30KKworU2FtcGxlVGFibGVFbnRyeVRYM0cgKgorYXRvbV90cmFrX3NldF9zdWJ0aXRsZV90eXBlIChBdG9tVFJBSyAqIHRyYWssIEF0b21zQ29udGV4dCAqIGNvbnRleHQsCisgICAgU3VidGl0bGVTYW1wbGVFbnRyeSAqIGVudHJ5KQoreworICBTYW1wbGVUYWJsZUVudHJ5VFgzRyAqdHgzZzsKKworICBhdG9tX3RyYWtfc2V0X3N1YnRpdGxlX2NvbW1vbnMgKHRyYWssIGNvbnRleHQpOworICBhdG9tX3N0c2RfcmVtb3ZlX2VudHJpZXMgKCZ0cmFrLT5tZGlhLm1pbmYuc3RibC5zdHNkKTsKKyAgdHgzZyA9IGF0b21fdHJha19hZGRfc3VidGl0bGVfZW50cnkgKHRyYWssIGNvbnRleHQsIGVudHJ5LT5mb3VyY2MpOworCisgIHR4M2ctPmZvbnRfZmFjZSA9IGVudHJ5LT5mb250X2ZhY2U7CisgIHR4M2ctPmZvbnRfc2l6ZSA9IGVudHJ5LT5mb250X3NpemU7CisgIHR4M2ctPmZvcmVncm91bmRfY29sb3JfcmdiYSA9IGVudHJ5LT5mb3JlZ3JvdW5kX2NvbG9yX3JnYmE7CisKKyAgdHJhay0+aXNfdmlkZW8gPSBGQUxTRTsKKyAgdHJhay0+aXNfaDI2NCA9IEZBTFNFOworCisgIHJldHVybiB0eDNnOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9tZmhkX2luaXQgKEF0b21NRkhEICogbWZoZCwgZ3VpbnQzMiBzZXF1ZW5jZV9udW1iZXIpCit7CisgIGd1aW50OCBmbGFnc1szXSA9IHsgMCwgMCwgMCB9OworCisgIGF0b21fZnVsbF9pbml0ICgmKG1maGQtPmhlYWRlciksIEZPVVJDQ19tZmhkLCAwLCAwLCAwLCBmbGFncyk7CisgIG1maGQtPnNlcXVlbmNlX251bWJlciA9IHNlcXVlbmNlX251bWJlcjsKK30KKworc3RhdGljIHZvaWQKK2F0b21fbW9vZl9pbml0IChBdG9tTU9PRiAqIG1vb2YsIEF0b21zQ29udGV4dCAqIGNvbnRleHQsCisgICAgZ3VpbnQzMiBzZXF1ZW5jZV9udW1iZXIpCit7CisgIGF0b21faGVhZGVyX3NldCAoJm1vb2YtPmhlYWRlciwgRk9VUkNDX21vb2YsIDAsIDApOworICBhdG9tX21maGRfaW5pdCAoJm1vb2YtPm1maGQsIHNlcXVlbmNlX251bWJlcik7CisgIG1vb2YtPnRyYWZzID0gTlVMTDsKK30KKworQXRvbU1PT0YgKgorYXRvbV9tb29mX25ldyAoQXRvbXNDb250ZXh0ICogY29udGV4dCwgZ3VpbnQzMiBzZXF1ZW5jZV9udW1iZXIpCit7CisgIEF0b21NT09GICptb29mID0gZ19uZXcwIChBdG9tTU9PRiwgMSk7CisKKyAgYXRvbV9tb29mX2luaXQgKG1vb2YsIGNvbnRleHQsIHNlcXVlbmNlX251bWJlcik7CisgIHJldHVybiBtb29mOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cnVuX2ZyZWUgKEF0b21UUlVOICogdHJ1bikKK3sKKyAgYXRvbV9mdWxsX2NsZWFyICgmdHJ1bi0+aGVhZGVyKTsKKyAgYXRvbV9hcnJheV9jbGVhciAoJnRydW4tPmVudHJpZXMpOworICBnX2ZyZWUgKHRydW4pOworfQorCitzdGF0aWMgdm9pZAorYXRvbV9zZHRwX2ZyZWUgKEF0b21TRFRQICogc2R0cCkKK3sKKyAgYXRvbV9mdWxsX2NsZWFyICgmc2R0cC0+aGVhZGVyKTsKKyAgYXRvbV9hcnJheV9jbGVhciAoJnNkdHAtPmVudHJpZXMpOworICBnX2ZyZWUgKHNkdHApOworfQorCit2b2lkCithdG9tX3RyYWZfZnJlZSAoQXRvbVRSQUYgKiB0cmFmKQoreworICBHTGlzdCAqd2Fsa2VyOworCisgIHdhbGtlciA9IHRyYWYtPnRydW5zOworICB3aGlsZSAod2Fsa2VyKSB7CisgICAgYXRvbV90cnVuX2ZyZWUgKChBdG9tVFJVTiAqKSB3YWxrZXItPmRhdGEpOworICAgIHdhbGtlciA9IGdfbGlzdF9uZXh0ICh3YWxrZXIpOworICB9CisgIGdfbGlzdF9mcmVlICh0cmFmLT50cnVucyk7CisgIHRyYWYtPnRydW5zID0gTlVMTDsKKworICB3YWxrZXIgPSB0cmFmLT5zZHRwczsKKyAgd2hpbGUgKHdhbGtlcikgeworICAgIGF0b21fc2R0cF9mcmVlICgoQXRvbVNEVFAgKikgd2Fsa2VyLT5kYXRhKTsKKyAgICB3YWxrZXIgPSBnX2xpc3RfbmV4dCAod2Fsa2VyKTsKKyAgfQorICBnX2xpc3RfZnJlZSAodHJhZi0+c2R0cHMpOworICB0cmFmLT5zZHRwcyA9IE5VTEw7CisKKyAgZ19mcmVlICh0cmFmKTsKK30KKwordm9pZAorYXRvbV9tb29mX2ZyZWUgKEF0b21NT09GICogbW9vZikKK3sKKyAgR0xpc3QgKndhbGtlcjsKKworICB3YWxrZXIgPSBtb29mLT50cmFmczsKKyAgd2hpbGUgKHdhbGtlcikgeworICAgIGF0b21fdHJhZl9mcmVlICgoQXRvbVRSQUYgKikgd2Fsa2VyLT5kYXRhKTsKKyAgICB3YWxrZXIgPSBnX2xpc3RfbmV4dCAod2Fsa2VyKTsKKyAgfQorICBnX2xpc3RfZnJlZSAobW9vZi0+dHJhZnMpOworICBtb29mLT50cmFmcyA9IE5VTEw7CisKKyAgZ19mcmVlIChtb29mKTsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fbWZoZF9jb3B5X2RhdGEgKEF0b21NRkhEICogbWZoZCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJm1maGQtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyIChtZmhkLT5zZXF1ZW5jZV9udW1iZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fdGZoZF9jb3B5X2RhdGEgKEF0b21URkhEICogdGZoZCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworICBndWludDMyIGZsYWdzOworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnRmaGQtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyICh0ZmhkLT50cmFja19JRCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGZsYWdzID0gYXRvbV9mdWxsX2dldF9mbGFnc19hc191aW50ICgmdGZoZC0+aGVhZGVyKTsKKworICBpZiAoZmxhZ3MgJiBURl9CQVNFX0RBVEFfT0ZGU0VUKQorICAgIHByb3BfY29weV91aW50NjQgKHRmaGQtPmJhc2VfZGF0YV9vZmZzZXQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgaWYgKGZsYWdzICYgVEZfU0FNUExFX0RFU0NSSVBUSU9OX0lOREVYKQorICAgIHByb3BfY29weV91aW50MzIgKHRmaGQtPnNhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBpZiAoZmxhZ3MgJiBURl9ERUZBVUxUX1NBTVBMRV9EVVJBVElPTikKKyAgICBwcm9wX2NvcHlfdWludDMyICh0ZmhkLT5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbiwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBpZiAoZmxhZ3MgJiBURl9ERUZBVUxUX1NBTVBMRV9TSVpFKQorICAgIHByb3BfY29weV91aW50MzIgKHRmaGQtPmRlZmF1bHRfc2FtcGxlX3NpemUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgaWYgKGZsYWdzICYgVEZfREVGQVVMVF9TQU1QTEVfRkxBR1MpCisgICAgcHJvcF9jb3B5X3VpbnQzMiAodGZoZC0+ZGVmYXVsdF9zYW1wbGVfZmxhZ3MsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fdGZkdF9jb3B5X2RhdGEgKEF0b21URkRUICogdGZkdCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnRmZHQtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiAzMi1iaXQgdGltZSBpZiB2ZXJzaW9uID09IDAgZWxzZSA2NC1iaXQ6ICovCisgIGlmICh0ZmR0LT5oZWFkZXIudmVyc2lvbiA9PSAwKQorICAgIHByb3BfY29weV91aW50MzIgKHRmZHQtPmJhc2VfbWVkaWFfZGVjb2RlX3RpbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgZWxzZQorICAgIHByb3BfY29weV91aW50NjQgKHRmZHQtPmJhc2VfbWVkaWFfZGVjb2RlX3RpbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fdHJ1bl9jb3B5X2RhdGEgKEF0b21UUlVOICogdHJ1biwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCwgZ3VpbnQzMiAqIGRhdGFfb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisgIGd1aW50MzIgZmxhZ3MsIGk7CisKKyAgZmxhZ3MgPSBhdG9tX2Z1bGxfZ2V0X2ZsYWdzX2FzX3VpbnQgKCZ0cnVuLT5oZWFkZXIpOworCisgIC8qIGlmIGZpcnN0IHRydW4gaW4gbW9vZiwgZm9yY2libHkgYWRkIGRhdGFfb2Zmc2V0IGFuZCByZWNvcmQKKyAgICogd2hlcmUgaXQgbXVzdCBiZSB3cml0dGVuIGxhdGVyIG9uICovCisgIGlmIChkYXRhX29mZnNldCAmJiAhKmRhdGFfb2Zmc2V0KSB7CisgICAgZmxhZ3MgfD0gVFJfREFUQV9PRkZTRVQ7CisgIH0gZWxzZSB7CisgICAgZmxhZ3MgJj0gflRSX0RBVEFfT0ZGU0VUOworICB9CisKKyAgYXRvbV9mdWxsX3NldF9mbGFnc19hc191aW50ICgmdHJ1bi0+aGVhZGVyLCBmbGFncyk7CisKKyAgaWYgKCFhdG9tX2Z1bGxfY29weV9kYXRhICgmdHJ1bi0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByb3BfY29weV91aW50MzIgKHRydW4tPnNhbXBsZV9jb3VudCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGlmIChmbGFncyAmIFRSX0RBVEFfT0ZGU0VUKSB7CisgICAgKmRhdGFfb2Zmc2V0ID0gKm9mZnNldDsKKyAgICBwcm9wX2NvcHlfaW50MzIgKHRydW4tPmRhdGFfb2Zmc2V0LCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIH0KKyAgaWYgKGZsYWdzICYgVFJfRklSU1RfU0FNUExFX0ZMQUdTKQorICAgIHByb3BfY29weV91aW50MzIgKHRydW4tPmZpcnN0X3NhbXBsZV9mbGFncywgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGZvciAoaSA9IDA7IGkgPCBhdG9tX2FycmF5X2dldF9sZW4gKCZ0cnVuLT5lbnRyaWVzKTsgaSsrKSB7CisgICAgVFJVTlNhbXBsZUVudHJ5ICplbnRyeSA9ICZhdG9tX2FycmF5X2luZGV4ICgmdHJ1bi0+ZW50cmllcywgaSk7CisKKyAgICBpZiAoZmxhZ3MgJiBUUl9TQU1QTEVfRFVSQVRJT04pCisgICAgICBwcm9wX2NvcHlfdWludDMyIChlbnRyeS0+c2FtcGxlX2R1cmF0aW9uLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgaWYgKGZsYWdzICYgVFJfU0FNUExFX1NJWkUpCisgICAgICBwcm9wX2NvcHlfdWludDMyIChlbnRyeS0+c2FtcGxlX3NpemUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICBpZiAoZmxhZ3MgJiBUUl9TQU1QTEVfRkxBR1MpCisgICAgICBwcm9wX2NvcHlfdWludDMyIChlbnRyeS0+c2FtcGxlX2ZsYWdzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgaWYgKGZsYWdzICYgVFJfQ09NUE9TSVRJT05fVElNRV9PRkZTRVRTKQorICAgICAgcHJvcF9jb3B5X3VpbnQzMiAoZW50cnktPnNhbXBsZV9jb21wb3NpdGlvbl90aW1lX29mZnNldCwKKyAgICAgICAgICBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fc2R0cF9jb3B5X2RhdGEgKEF0b21TRFRQICogc2R0cCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnNkdHAtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBhbGwgZW50cmllcyBhdCBvbmNlICovCisgIHByb3BfY29weV9maXhlZF9zaXplX3N0cmluZyAoJmF0b21fYXJyYXlfaW5kZXggKCZzZHRwLT5lbnRyaWVzLCAwKSwKKyAgICAgIGF0b21fYXJyYXlfZ2V0X2xlbiAoJnNkdHAtPmVudHJpZXMpLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX3RyYWZfY29weV9kYXRhIChBdG9tVFJBRiAqIHRyYWYsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQsIGd1aW50MzIgKiBkYXRhX29mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworICBHTGlzdCAqd2Fsa2VyOworCisgIGlmICghYXRvbV9jb3B5X2RhdGEgKCZ0cmFmLT5oZWFkZXIsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghYXRvbV90ZmhkX2NvcHlfZGF0YSAoJnRyYWYtPnRmaGQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghYXRvbV90ZmR0X2NvcHlfZGF0YSAoJnRyYWYtPnRmZHQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgd2Fsa2VyID0gZ19saXN0X2ZpcnN0ICh0cmFmLT50cnVucyk7CisgIHdoaWxlICh3YWxrZXIgIT0gTlVMTCkgeworICAgIGlmICghYXRvbV90cnVuX2NvcHlfZGF0YSAoKEF0b21UUlVOICopIHdhbGtlci0+ZGF0YSwgYnVmZmVyLCBzaXplLCBvZmZzZXQsCisgICAgICAgICAgICBkYXRhX29mZnNldCkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB3YWxrZXIgPSBnX2xpc3RfbmV4dCAod2Fsa2VyKTsKKyAgfQorCisgIHdhbGtlciA9IGdfbGlzdF9maXJzdCAodHJhZi0+c2R0cHMpOworICB3aGlsZSAod2Fsa2VyICE9IE5VTEwpIHsKKyAgICBpZiAoIWF0b21fc2R0cF9jb3B5X2RhdGEgKChBdG9tU0RUUCAqKSB3YWxrZXItPmRhdGEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHdhbGtlciA9IGdfbGlzdF9uZXh0ICh3YWxrZXIpOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKyAgcmV0dXJuICpvZmZzZXQgLSBvcmlnaW5hbF9vZmZzZXQ7Cit9CisKKy8qIGNyZWF0ZXMgbW9vZiBhdG9tOyBtZXRhZGF0YSBpcyB3cml0dGVuIGV4cGVjdGluZyBhY3R1YWwgYnVmZmVyIGRhdGEKKyAqIGlzIGluIG1kYXRhIGRpcmVjdGx5IGFmdGVyIG1vb2YsIGFuZCBpcyBjb25zZWN1dGl2ZWx5IHdyaXR0ZW4gcGVyIHRyYWsgKi8KK2d1aW50NjQKK2F0b21fbW9vZl9jb3B5X2RhdGEgKEF0b21NT09GICogbW9vZiwgZ3VpbnQ4ICoqIGJ1ZmZlciwKKyAgICBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworICBHTGlzdCAqd2Fsa2VyOworICBndWludDMyIGRhdGFfb2Zmc2V0ID0gMDsKKworICBpZiAoIWF0b21fY29weV9kYXRhICgmbW9vZi0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCFhdG9tX21maGRfY29weV9kYXRhICgmbW9vZi0+bWZoZCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKQorICAgIHJldHVybiAwOworCisgIHdhbGtlciA9IGdfbGlzdF9maXJzdCAobW9vZi0+dHJhZnMpOworICB3aGlsZSAod2Fsa2VyICE9IE5VTEwpIHsKKyAgICBpZiAoIWF0b21fdHJhZl9jb3B5X2RhdGEgKChBdG9tVFJBRiAqKSB3YWxrZXItPmRhdGEsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LAorICAgICAgICAgICAgJmRhdGFfb2Zmc2V0KSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHdhbGtlciA9IGdfbGlzdF9uZXh0ICh3YWxrZXIpOworICB9CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKworICBpZiAoKmJ1ZmZlciAmJiBkYXRhX29mZnNldCkgeworICAgIC8qIGZpcnN0IHRydW4gbmVlZHMgYSBkYXRhLW9mZnNldCByZWxhdGl2ZSB0byBtb29mIHN0YXJ0CisgICAgICogICA9IG1vb2Ygc2l6ZSArIG1kYXQgcHJlZml4ICovCisgICAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoKmJ1ZmZlciArIGRhdGFfb2Zmc2V0LCAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0ICsgOCk7CisgIH0KKworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdGZoZF9pbml0IChBdG9tVEZIRCAqIHRmaGQsIGd1aW50MzIgdHJhY2tfSUQpCit7CisgIGd1aW50OCBmbGFnc1szXSA9IHsgMCwgMCwgMCB9OworCisgIGF0b21fZnVsbF9pbml0ICgmdGZoZC0+aGVhZGVyLCBGT1VSQ0NfdGZoZCwgMCwgMCwgMCwgZmxhZ3MpOworICB0ZmhkLT50cmFja19JRCA9IHRyYWNrX0lEOworICB0ZmhkLT5iYXNlX2RhdGFfb2Zmc2V0ID0gMDsKKyAgdGZoZC0+c2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4ID0gMTsKKyAgdGZoZC0+ZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24gPSAwOworICB0ZmhkLT5kZWZhdWx0X3NhbXBsZV9zaXplID0gMDsKKyAgdGZoZC0+ZGVmYXVsdF9zYW1wbGVfZmxhZ3MgPSAwOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90ZmR0X2luaXQgKEF0b21URkRUICogdGZkdCkKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisgIGF0b21fZnVsbF9pbml0ICgmdGZkdC0+aGVhZGVyLCBGT1VSQ0NfdGZkdCwgMCwgMCwgMCwgZmxhZ3MpOworCisgIHRmZHQtPmJhc2VfbWVkaWFfZGVjb2RlX3RpbWUgPSAwOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cnVuX2luaXQgKEF0b21UUlVOICogdHJ1bikKK3sKKyAgZ3VpbnQ4IGZsYWdzWzNdID0geyAwLCAwLCAwIH07CisKKyAgYXRvbV9mdWxsX2luaXQgKCZ0cnVuLT5oZWFkZXIsIEZPVVJDQ190cnVuLCAwLCAwLCAwLCBmbGFncyk7CisgIHRydW4tPnNhbXBsZV9jb3VudCA9IDA7CisgIHRydW4tPmRhdGFfb2Zmc2V0ID0gMDsKKyAgdHJ1bi0+Zmlyc3Rfc2FtcGxlX2ZsYWdzID0gMDsKKyAgYXRvbV9hcnJheV9pbml0ICgmdHJ1bi0+ZW50cmllcywgNTEyKTsKK30KKworc3RhdGljIEF0b21UUlVOICoKK2F0b21fdHJ1bl9uZXcgKHZvaWQpCit7CisgIEF0b21UUlVOICp0cnVuID0gZ19uZXcwIChBdG9tVFJVTiwgMSk7CisKKyAgYXRvbV90cnVuX2luaXQgKHRydW4pOworICByZXR1cm4gdHJ1bjsKK30KKworc3RhdGljIHZvaWQKK2F0b21fc2R0cF9pbml0IChBdG9tU0RUUCAqIHNkdHApCit7CisgIGd1aW50OCBmbGFnc1szXSA9IHsgMCwgMCwgMCB9OworCisgIGF0b21fZnVsbF9pbml0ICgmc2R0cC0+aGVhZGVyLCBGT1VSQ0Nfc2R0cCwgMCwgMCwgMCwgZmxhZ3MpOworICBhdG9tX2FycmF5X2luaXQgKCZzZHRwLT5lbnRyaWVzLCA1MTIpOworfQorCitzdGF0aWMgQXRvbVNEVFAgKgorYXRvbV9zZHRwX25ldyAoQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgQXRvbVNEVFAgKnNkdHAgPSBnX25ldzAgKEF0b21TRFRQLCAxKTsKKworICBhdG9tX3NkdHBfaW5pdCAoc2R0cCk7CisgIHJldHVybiBzZHRwOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cmFmX2FkZF9zZHRwIChBdG9tVFJBRiAqIHRyYWYsIEF0b21TRFRQICogc2R0cCkKK3sKKyAgdHJhZi0+c2R0cHMgPSBnX2xpc3RfYXBwZW5kICh0cmFmLT5zZHRwcywgc2R0cCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3NkdHBfYWRkX3NhbXBsZXMgKEF0b21TRFRQICogc2R0cCwgZ3VpbnQ4IHZhbCkKK3sKKyAgLyogaXQgZG9lcyBub3QgbWFrZSBtdWNoL2FueSBzZW5zZSBhY2NvcmRpbmcgdG8gc3BlY3MsCisgICAqIGJ1dCB0aGF0J3MgaG93IE1TIGlzbWwgc2FtcGxlcyBzZWVtIHRvIGRvIGl0ICovCisgIGF0b21fYXJyYXlfYXBwZW5kICgmc2R0cC0+ZW50cmllcywgdmFsLCAyNTYpOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cnVuX2FkZF9zYW1wbGVzIChBdG9tVFJVTiAqIHRydW4sIGd1aW50MzIgZGVsdGEsIGd1aW50MzIgc2l6ZSwKKyAgICBndWludDMyIGZsYWdzLCBnaW50NjQgcHRzX29mZnNldCkKK3sKKyAgVFJVTlNhbXBsZUVudHJ5IG5lbnRyeTsKKworICBpZiAocHRzX29mZnNldCAhPSAwKQorICAgIHRydW4tPmhlYWRlci5mbGFnc1sxXSB8PSAoVFJfQ09NUE9TSVRJT05fVElNRV9PRkZTRVRTID4+IDgpOworCisgIG5lbnRyeS5zYW1wbGVfZHVyYXRpb24gPSBkZWx0YTsKKyAgbmVudHJ5LnNhbXBsZV9zaXplID0gc2l6ZTsKKyAgbmVudHJ5LnNhbXBsZV9mbGFncyA9IGZsYWdzOworICBuZW50cnkuc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVfb2Zmc2V0ID0gcHRzX29mZnNldDsKKyAgYXRvbV9hcnJheV9hcHBlbmQgKCZ0cnVuLT5lbnRyaWVzLCBuZW50cnksIDI1Nik7CisgIHRydW4tPnNhbXBsZV9jb3VudCsrOworfQorCitzdGF0aWMgdm9pZAorYXRvbV90cmFmX2luaXQgKEF0b21UUkFGICogdHJhZiwgQXRvbXNDb250ZXh0ICogY29udGV4dCwgZ3VpbnQzMiB0cmFja19JRCkKK3sKKyAgYXRvbV9oZWFkZXJfc2V0ICgmdHJhZi0+aGVhZGVyLCBGT1VSQ0NfdHJhZiwgMCwgMCk7CisgIGF0b21fdGZkdF9pbml0ICgmdHJhZi0+dGZkdCk7CisgIGF0b21fdGZoZF9pbml0ICgmdHJhZi0+dGZoZCwgdHJhY2tfSUQpOworICB0cmFmLT50cnVucyA9IE5VTEw7CisKKyAgaWYgKGNvbnRleHQtPmZsYXZvciA9PSBBVE9NU19UUkVFX0ZMQVZPUl9JU01MKQorICAgIGF0b21fdHJhZl9hZGRfc2R0cCAodHJhZiwgYXRvbV9zZHRwX25ldyAoY29udGV4dCkpOworfQorCitBdG9tVFJBRiAqCithdG9tX3RyYWZfbmV3IChBdG9tc0NvbnRleHQgKiBjb250ZXh0LCBndWludDMyIHRyYWNrX0lEKQoreworICBBdG9tVFJBRiAqdHJhZiA9IGdfbmV3MCAoQXRvbVRSQUYsIDEpOworCisgIGF0b21fdHJhZl9pbml0ICh0cmFmLCBjb250ZXh0LCB0cmFja19JRCk7CisgIHJldHVybiB0cmFmOworfQorCit2b2lkCithdG9tX3RyYWZfc2V0X2Jhc2VfZGVjb2RlX3RpbWUgKEF0b21UUkFGICogdHJhZiwgZ3VpbnQ2NCBiYXNlX2RlY29kZV90aW1lKQoreworICB0cmFmLT50ZmR0LmJhc2VfbWVkaWFfZGVjb2RlX3RpbWUgPSBiYXNlX2RlY29kZV90aW1lOworICAvKiBJZiB3ZSBuZWVkIHRvIHdyaXRlIGEgNjQtYml0IHRmZHQsIHNldCB0aGUgYXRvbSB2ZXJzaW9uICovCisgIGlmIChiYXNlX2RlY29kZV90aW1lID4gR19NQVhVSU5UMzIpCisgICAgdHJhZi0+dGZkdC5oZWFkZXIudmVyc2lvbiA9IDE7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tX3RyYWZfYWRkX3RydW4gKEF0b21UUkFGICogdHJhZiwgQXRvbVRSVU4gKiB0cnVuKQoreworICB0cmFmLT50cnVucyA9IGdfbGlzdF9hcHBlbmQgKHRyYWYtPnRydW5zLCB0cnVuKTsKK30KKwordm9pZAorYXRvbV90cmFmX2FkZF9zYW1wbGVzIChBdG9tVFJBRiAqIHRyYWYsIGd1aW50MzIgZGVsdGEsIGd1aW50MzIgc2l6ZSwKKyAgICBnYm9vbGVhbiBzeW5jLCBnaW50NjQgcHRzX29mZnNldCwgZ2Jvb2xlYW4gc2R0cF9zeW5jKQoreworICBBdG9tVFJVTiAqdHJ1bjsKKyAgZ3VpbnQzMiBmbGFnczsKKworICAvKiAweDEwMDAwIGlzIHNhbXBsZS1pcy1kaWZmZXJlbmNlLXNhbXBsZSBmbGFnCisgICAqIGxvdyBieXRlIHN0dWZmIGlzIHdoYXQgaXNtdiB1c2VzICovCisgIGZsYWdzID0gKHN5bmMgPyAweDAgOiAweDEwMDAwKSB8IChzZHRwX3N5bmMgPyAweDQwIDogMHhjMCk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCF0cmFmLT50cnVucykpIHsKKyAgICB0cnVuID0gYXRvbV90cnVuX25ldyAoKTsKKyAgICBhdG9tX3RyYWZfYWRkX3RydW4gKHRyYWYsIHRydW4pOworICAgIC8qIG9wdGltaXN0aWM7IGluZGljYXRlIGFsbCBkZWZhdWx0cyBwcmVzZW50IGluIHRmaGQgKi8KKyAgICB0cmFmLT50ZmhkLmhlYWRlci5mbGFnc1syXSA9IFRGX0RFRkFVTFRfU0FNUExFX0RVUkFUSU9OIHwKKyAgICAgICAgVEZfREVGQVVMVF9TQU1QTEVfU0laRSB8IFRGX0RFRkFVTFRfU0FNUExFX0ZMQUdTOworICAgIHRyYWYtPnRmaGQuZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24gPSBkZWx0YTsKKyAgICB0cmFmLT50ZmhkLmRlZmF1bHRfc2FtcGxlX3NpemUgPSBzaXplOworICAgIHRyYWYtPnRmaGQuZGVmYXVsdF9zYW1wbGVfZmxhZ3MgPSBmbGFnczsKKyAgICB0cnVuLT5maXJzdF9zYW1wbGVfZmxhZ3MgPSBmbGFnczsKKyAgfQorCisgIHRydW4gPSB0cmFmLT50cnVucy0+ZGF0YTsKKworICAvKiBjaGVjayBpZiBzdGlsbCBtYXRjaGluZyBkZWZhdWx0cywKKyAgICogaWYgbm90LCBhYmFuZG9uIGRlZmF1bHQgYW5kIG5lZWQgZW50cnkgZm9yIGVhY2ggc2FtcGxlICovCisgIGlmICh0cmFmLT50ZmhkLmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uICE9IGRlbHRhKSB7CisgICAgdHJhZi0+dGZoZC5oZWFkZXIuZmxhZ3NbMl0gJj0gflRGX0RFRkFVTFRfU0FNUExFX0RVUkFUSU9OOworICAgIHRydW4tPmhlYWRlci5mbGFnc1sxXSB8PSAoVFJfU0FNUExFX0RVUkFUSU9OID4+IDgpOworICB9CisgIGlmICh0cmFmLT50ZmhkLmRlZmF1bHRfc2FtcGxlX3NpemUgIT0gc2l6ZSkgeworICAgIHRyYWYtPnRmaGQuaGVhZGVyLmZsYWdzWzJdICY9IH5URl9ERUZBVUxUX1NBTVBMRV9TSVpFOworICAgIHRydW4tPmhlYWRlci5mbGFnc1sxXSB8PSAoVFJfU0FNUExFX1NJWkUgPj4gOCk7CisgIH0KKyAgaWYgKHRyYWYtPnRmaGQuZGVmYXVsdF9zYW1wbGVfZmxhZ3MgIT0gZmxhZ3MpIHsKKyAgICBpZiAodHJ1bi0+c2FtcGxlX2NvdW50ID09IDEpIHsKKyAgICAgIC8qIGF0IGxlYXN0IHdpbGwgbmVlZCBmaXJzdCBzYW1wbGUgZmxhZyAqLworICAgICAgdHJhZi0+dGZoZC5kZWZhdWx0X3NhbXBsZV9mbGFncyA9IGZsYWdzOworICAgICAgdHJ1bi0+aGVhZGVyLmZsYWdzWzJdIHw9IFRSX0ZJUlNUX1NBTVBMRV9GTEFHUzsKKyAgICB9IGVsc2UgeworICAgICAgLyogbm93IHdlIG5lZWQgc2FtcGxlIGZsYWdzIGZvciBlYWNoIHNhbXBsZSAqLworICAgICAgdHJhZi0+dGZoZC5oZWFkZXIuZmxhZ3NbMl0gJj0gflRGX0RFRkFVTFRfU0FNUExFX0ZMQUdTOworICAgICAgdHJ1bi0+aGVhZGVyLmZsYWdzWzFdIHw9IChUUl9TQU1QTEVfRkxBR1MgPj4gOCk7CisgICAgICB0cnVuLT5oZWFkZXIuZmxhZ3NbMl0gJj0gflRSX0ZJUlNUX1NBTVBMRV9GTEFHUzsKKyAgICB9CisgIH0KKworICBhdG9tX3RydW5fYWRkX3NhbXBsZXMgKHRyYWYtPnRydW5zLT5kYXRhLCBkZWx0YSwgc2l6ZSwgZmxhZ3MsIHB0c19vZmZzZXQpOworCisgIGlmICh0cmFmLT5zZHRwcykKKyAgICBhdG9tX3NkdHBfYWRkX3NhbXBsZXMgKHRyYWYtPnNkdHBzLT5kYXRhLCAweDEwIHwgKChmbGFncyAmIDB4ZmYpID4+IDQpKTsKK30KKworZ3VpbnQzMgorYXRvbV90cmFmX2dldF9zYW1wbGVfbnVtIChBdG9tVFJBRiAqIHRyYWYpCit7CisgIEF0b21UUlVOICp0cnVuOworCisgIGlmIChHX1VOTElLRUxZICghdHJhZi0+dHJ1bnMpKQorICAgIHJldHVybiAwOworCisgIHRydW4gPSB0cmFmLT50cnVucy0+ZGF0YTsKKyAgcmV0dXJuIGF0b21fYXJyYXlfZ2V0X2xlbiAoJnRydW4tPmVudHJpZXMpOworfQorCit2b2lkCithdG9tX21vb2ZfYWRkX3RyYWYgKEF0b21NT09GICogbW9vZiwgQXRvbVRSQUYgKiB0cmFmKQoreworICBtb29mLT50cmFmcyA9IGdfbGlzdF9hcHBlbmQgKG1vb2YtPnRyYWZzLCB0cmFmKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdGZyYV9mcmVlIChBdG9tVEZSQSAqIHRmcmEpCit7CisgIGF0b21fZnVsbF9jbGVhciAoJnRmcmEtPmhlYWRlcik7CisgIGF0b21fYXJyYXlfY2xlYXIgKCZ0ZnJhLT5lbnRyaWVzKTsKKyAgZ19mcmVlICh0ZnJhKTsKK30KKworQXRvbU1GUkEgKgorYXRvbV9tZnJhX25ldyAoQXRvbXNDb250ZXh0ICogY29udGV4dCkKK3sKKyAgQXRvbU1GUkEgKm1mcmEgPSBnX25ldzAgKEF0b21NRlJBLCAxKTsKKworICBhdG9tX2hlYWRlcl9zZXQgKCZtZnJhLT5oZWFkZXIsIEZPVVJDQ19tZnJhLCAwLCAwKTsKKyAgcmV0dXJuIG1mcmE7Cit9CisKK3ZvaWQKK2F0b21fbWZyYV9hZGRfdGZyYSAoQXRvbU1GUkEgKiBtZnJhLCBBdG9tVEZSQSAqIHRmcmEpCit7CisgIG1mcmEtPnRmcmFzID0gZ19saXN0X2FwcGVuZCAobWZyYS0+dGZyYXMsIHRmcmEpOworfQorCit2b2lkCithdG9tX21mcmFfZnJlZSAoQXRvbU1GUkEgKiBtZnJhKQoreworICBHTGlzdCAqd2Fsa2VyOworCisgIHdhbGtlciA9IG1mcmEtPnRmcmFzOworICB3aGlsZSAod2Fsa2VyKSB7CisgICAgYXRvbV90ZnJhX2ZyZWUgKChBdG9tVEZSQSAqKSB3YWxrZXItPmRhdGEpOworICAgIHdhbGtlciA9IGdfbGlzdF9uZXh0ICh3YWxrZXIpOworICB9CisgIGdfbGlzdF9mcmVlIChtZnJhLT50ZnJhcyk7CisgIG1mcmEtPnRmcmFzID0gTlVMTDsKKworICBhdG9tX2NsZWFyICgmbWZyYS0+aGVhZGVyKTsKKyAgZ19mcmVlIChtZnJhKTsKK30KKworc3RhdGljIHZvaWQKK2F0b21fdGZyYV9pbml0IChBdG9tVEZSQSAqIHRmcmEsIGd1aW50MzIgdHJhY2tfSUQpCit7CisgIGd1aW50OCBmbGFnc1szXSA9IHsgMCwgMCwgMCB9OworCisgIGF0b21fZnVsbF9pbml0ICgmdGZyYS0+aGVhZGVyLCBGT1VSQ0NfdGZyYSwgMCwgMCwgMCwgZmxhZ3MpOworICB0ZnJhLT50cmFja19JRCA9IHRyYWNrX0lEOworICBhdG9tX2FycmF5X2luaXQgKCZ0ZnJhLT5lbnRyaWVzLCA1MTIpOworfQorCitBdG9tVEZSQSAqCithdG9tX3RmcmFfbmV3IChBdG9tc0NvbnRleHQgKiBjb250ZXh0LCBndWludDMyIHRyYWNrX0lEKQoreworICBBdG9tVEZSQSAqdGZyYSA9IGdfbmV3MCAoQXRvbVRGUkEsIDEpOworCisgIGF0b21fdGZyYV9pbml0ICh0ZnJhLCB0cmFja19JRCk7CisgIHJldHVybiB0ZnJhOworCit9CisKK3N0YXRpYyBpbmxpbmUgZ2ludAorbmVlZF9ieXRlcyAoZ3VpbnQzMiBudW0pCit7CisgIGdpbnQgbiA9IDA7CisKKyAgd2hpbGUgKG51bSA+Pj0gOCkKKyAgICBuKys7CisKKyAgcmV0dXJuIG47Cit9CisKK3ZvaWQKK2F0b21fdGZyYV9hZGRfZW50cnkgKEF0b21URlJBICogdGZyYSwgZ3VpbnQ2NCBkdHMsIGd1aW50MzIgc2FtcGxlX251bSkKK3sKKyAgVEZSQUVudHJ5IGVudHJ5OworCisgIGVudHJ5LnRpbWUgPSBkdHM7CisgIC8qIGZpbGwgaW4gbGF0ZXIgKi8KKyAgZW50cnkubW9vZl9vZmZzZXQgPSAwOworICAvKiBhbHdheXMgd3JpdGUgYSBzaW5nbGUgdHJ1biBpbiBhIHNpbmdsZSB0cmFmICovCisgIGVudHJ5LnRyYWZfbnVtYmVyID0gMTsKKyAgZW50cnkudHJ1bl9udW1iZXIgPSAxOworICBlbnRyeS5zYW1wbGVfbnVtYmVyID0gc2FtcGxlX251bTsKKworICAvKiBhdXRvLXVzZSA2NCBiaXRzIGlmIG5lZWRlZCAqLworICBpZiAoZHRzID4gR19NQVhVSU5UMzIpCisgICAgdGZyYS0+aGVhZGVyLnZlcnNpb24gPSAxOworCisgIC8qIDEgYnl0ZSB3aWxsIGFsd2F5cyBkbyBmb3IgdHJhZiBhbmQgdHJ1biBudW1iZXIsCisgICAqIGNoZWNrIGhvdyBtdWNoIHNhbXBsZV9udW0gbmVlZHMgKi8KKyAgdGZyYS0+bGVuZ3RocyA9ICh0ZnJhLT5sZW5ndGhzICYgMHhmYykgfHwKKyAgICAgIE1BWCAodGZyYS0+bGVuZ3RocywgbmVlZF9ieXRlcyAoc2FtcGxlX251bSkpOworCisgIGF0b21fYXJyYXlfYXBwZW5kICgmdGZyYS0+ZW50cmllcywgZW50cnksIDI1Nik7Cit9CisKK3ZvaWQKK2F0b21fdGZyYV91cGRhdGVfb2Zmc2V0IChBdG9tVEZSQSAqIHRmcmEsIGd1aW50NjQgb2Zmc2V0KQoreworICBnaW50IGk7CisKKyAgLyogYXV0by11c2UgNjQgYml0cyBpZiBuZWVkZWQgKi8KKyAgaWYgKG9mZnNldCA+IEdfTUFYVUlOVDMyKQorICAgIHRmcmEtPmhlYWRlci52ZXJzaW9uID0gMTsKKworICBmb3IgKGkgPSBhdG9tX2FycmF5X2dldF9sZW4gKCZ0ZnJhLT5lbnRyaWVzKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgVEZSQUVudHJ5ICplbnRyeSA9ICZhdG9tX2FycmF5X2luZGV4ICgmdGZyYS0+ZW50cmllcywgaSk7CisKKyAgICBpZiAoZW50cnktPm1vb2Zfb2Zmc2V0KQorICAgICAgYnJlYWs7CisgICAgZW50cnktPm1vb2Zfb2Zmc2V0ID0gb2Zmc2V0OworICB9Cit9CisKK3N0YXRpYyBndWludDY0CithdG9tX3RmcmFfY29weV9kYXRhIChBdG9tVEZSQSAqIHRmcmEsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKyAgZ3VpbnQzMiBpOworICBURlJBRW50cnkgKmVudHJ5OworICBndWludDMyIGRhdGE7CisgIGd1aW50IGJ5dGVzOworICBndWludCB2ZXJzaW9uOworCisgIGlmICghYXRvbV9mdWxsX2NvcHlfZGF0YSAoJnRmcmEtPmhlYWRlciwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyICh0ZnJhLT50cmFja19JRCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyICh0ZnJhLT5sZW5ndGhzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50MzIgKGF0b21fYXJyYXlfZ2V0X2xlbiAoJnRmcmEtPmVudHJpZXMpLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgdmVyc2lvbiA9IHRmcmEtPmhlYWRlci52ZXJzaW9uOworICBmb3IgKGkgPSAwOyBpIDwgYXRvbV9hcnJheV9nZXRfbGVuICgmdGZyYS0+ZW50cmllcyk7ICsraSkgeworICAgIGVudHJ5ID0gJmF0b21fYXJyYXlfaW5kZXggKCZ0ZnJhLT5lbnRyaWVzLCBpKTsKKyAgICBpZiAodmVyc2lvbikgeworICAgICAgcHJvcF9jb3B5X3VpbnQ2NCAoZW50cnktPnRpbWUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgICAgIHByb3BfY29weV91aW50NjQgKGVudHJ5LT5tb29mX29mZnNldCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICBwcm9wX2NvcHlfdWludDMyIChlbnRyeS0+dGltZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICAgICAgcHJvcF9jb3B5X3VpbnQzMiAoZW50cnktPm1vb2Zfb2Zmc2V0LCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgICAgfQorCisgICAgYnl0ZXMgPSAodGZyYS0+bGVuZ3RocyAmICgweDMgPDwgNCkpICsgMTsKKyAgICBkYXRhID0gR1VJTlQzMl9UT19CRSAoZW50cnktPnRyYWZfbnVtYmVyKTsKKyAgICBwcm9wX2NvcHlfZml4ZWRfc2l6ZV9zdHJpbmcgKCgoZ3VpbnQ4ICopICYgZGF0YSkgKyA0IC0gYnl0ZXMsIGJ5dGVzLAorICAgICAgICBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgICBieXRlcyA9ICh0ZnJhLT5sZW5ndGhzICYgKDB4MyA8PCAyKSkgKyAxOworICAgIGRhdGEgPSBHVUlOVDMyX1RPX0JFIChlbnRyeS0+dHJ1bl9udW1iZXIpOworICAgIHByb3BfY29weV9maXhlZF9zaXplX3N0cmluZyAoKChndWludDggKikgJiBkYXRhKSArIDQgLSBieXRlcywgYnl0ZXMsCisgICAgICAgIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICAgIGJ5dGVzID0gKHRmcmEtPmxlbmd0aHMgJiAoMHgzKSkgKyAxOworICAgIGRhdGEgPSBHVUlOVDMyX1RPX0JFIChlbnRyeS0+c2FtcGxlX251bWJlcik7CisgICAgcHJvcF9jb3B5X2ZpeGVkX3NpemVfc3RyaW5nICgoKGd1aW50OCAqKSAmIGRhdGEpICsgNCAtIGJ5dGVzLCBieXRlcywKKyAgICAgICAgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIH0KKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2F0b21fbWZyb19jb3B5X2RhdGEgKGd1aW50MzIgcywgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworICBndWludDggZmxhZ3NbM10gPSB7IDAsIDAsIDAgfTsKKyAgQXRvbUZ1bGwgbWZybzsKKworICBhdG9tX2Z1bGxfaW5pdCAoJm1mcm8sIEZPVVJDQ19tZnJvLCAwLCAwLCAwLCBmbGFncyk7CisKKyAgaWYgKCFhdG9tX2Z1bGxfY29weV9kYXRhICgmbWZybywgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcm9wX2NvcHlfdWludDMyIChzLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisKKyAgYXRvbV93cml0ZV9zaXplIChidWZmZXIsIHNpemUsIG9mZnNldCwgb3JpZ2luYWxfb2Zmc2V0KTsKKworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworCitndWludDY0CithdG9tX21mcmFfY29weV9kYXRhIChBdG9tTUZSQSAqIG1mcmEsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKyAgR0xpc3QgKndhbGtlcjsKKworICBpZiAoIWF0b21fY29weV9kYXRhICgmbWZyYS0+aGVhZGVyLCBidWZmZXIsIHNpemUsIG9mZnNldCkpCisgICAgcmV0dXJuIDA7CisKKyAgd2Fsa2VyID0gZ19saXN0X2ZpcnN0IChtZnJhLT50ZnJhcyk7CisgIHdoaWxlICh3YWxrZXIgIT0gTlVMTCkgeworICAgIGlmICghYXRvbV90ZnJhX2NvcHlfZGF0YSAoKEF0b21URlJBICopIHdhbGtlci0+ZGF0YSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgd2Fsa2VyID0gZ19saXN0X25leHQgKHdhbGtlcik7CisgIH0KKworICAvKiAxNiBpcyB0aGUgc2l6ZSBvZiB0aGUgbWZybyBhdG9tICovCisgIGlmICghYXRvbV9tZnJvX2NvcHlfZGF0YSAoKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldCArIDE2LCBidWZmZXIsCisgICAgICAgICAgc2l6ZSwgb2Zmc2V0KSkKKyAgICByZXR1cm4gMDsKKworICBhdG9tX3dyaXRlX3NpemUgKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0LCBvcmlnaW5hbF9vZmZzZXQpOworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworLyogc29tZSBzYW1wbGUgZGVzY3JpcHRpb24gY29uc3RydWN0aW9uIGhlbHBlcnMgKi8KKworQXRvbUluZm8gKgorYnVpbGRfZXNkc19leHRlbnNpb24gKEF0b21UUkFLICogdHJhaywgZ3VpbnQ4IG9iamVjdF90eXBlLCBndWludDggc3RyZWFtX3R5cGUsCisgICAgY29uc3QgR3N0QnVmZmVyICogY29kZWNfZGF0YSwgZ3VpbnQzMiBhdmdfYml0cmF0ZSwgZ3VpbnQzMiBtYXhfYml0cmF0ZSkKK3sKKyAgZ3VpbnQzMiB0cmFja19pZDsKKyAgQXRvbUVTRFMgKmVzZHM7CisKKyAgdHJhY2tfaWQgPSB0cmFrLT50a2hkLnRyYWNrX0lEOworCisgIGVzZHMgPSBhdG9tX2VzZHNfbmV3ICgpOworICBlc2RzLT5lcy5pZCA9IHRyYWNrX2lkICYgMHhGRkZGOworICBlc2RzLT5lcy5kZWNfY29uZl9kZXNjLm9iamVjdF90eXBlID0gb2JqZWN0X3R5cGU7CisgIGVzZHMtPmVzLmRlY19jb25mX2Rlc2Muc3RyZWFtX3R5cGUgPSBzdHJlYW1fdHlwZSA8PCAyIHwgMHgwMTsKKworICBpZiAoYXZnX2JpdHJhdGUgPiAwKQorICAgIGVzZHMtPmVzLmRlY19jb25mX2Rlc2MuYXZnX2JpdHJhdGUgPSBhdmdfYml0cmF0ZTsKKyAgaWYgKG1heF9iaXRyYXRlID4gMCkKKyAgICBlc2RzLT5lcy5kZWNfY29uZl9kZXNjLm1heF9iaXRyYXRlID0gbWF4X2JpdHJhdGU7CisKKyAgLyogb3B0aW9uYWwgRGVjb2RlclNwZWNpZmljSW5mbyAqLworICBpZiAoY29kZWNfZGF0YSkgeworICAgIERlY29kZXJTcGVjaWZpY0luZm9EZXNjcmlwdG9yICpkZXNjOworICAgIGdzaXplIHNpemU7CisKKyAgICBlc2RzLT5lcy5kZWNfY29uZl9kZXNjLmRlY19zcGVjaWZpY19pbmZvID0gZGVzYyA9CisgICAgICAgIGRlc2NfZGVjX3NwZWNpZmljX2luZm9fbmV3ICgpOworICAgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplICgoR3N0QnVmZmVyICopIGNvZGVjX2RhdGEpOworICAgIGRlc2NfZGVjX3NwZWNpZmljX2luZm9fYWxsb2NfZGF0YSAoZGVzYywgc2l6ZSk7CisgICAgZ3N0X2J1ZmZlcl9leHRyYWN0ICgoR3N0QnVmZmVyICopIGNvZGVjX2RhdGEsIDAsIGRlc2MtPmRhdGEsIHNpemUpOworICB9CisKKyAgcmV0dXJuIGJ1aWxkX2F0b21faW5mb193cmFwcGVyICgoQXRvbSAqKSBlc2RzLCBhdG9tX2VzZHNfY29weV9kYXRhLAorICAgICAgYXRvbV9lc2RzX2ZyZWUpOworfQorCitBdG9tSW5mbyAqCitidWlsZF9idHJ0X2V4dGVuc2lvbiAoZ3VpbnQzMiBidWZmZXJfc2l6ZV9kYiwgZ3VpbnQzMiBhdmdfYml0cmF0ZSwKKyAgICBndWludDMyIG1heF9iaXRyYXRlKQoreworICBBdG9tRGF0YSAqYXRvbV9kYXRhID0gYXRvbV9kYXRhX25ldyAoRk9VUkNDX2J0cnQpOworICBndWludDggKmRhdGE7CisKKyAgYXRvbV9kYXRhX2FsbG9jX21lbSAoYXRvbV9kYXRhLCAxMik7CisgIGRhdGEgPSBhdG9tX2RhdGEtPmRhdGE7CisKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSwgYnVmZmVyX3NpemVfZGIpOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgNCwgbWF4X2JpdHJhdGUpOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgOCwgYXZnX2JpdHJhdGUpOworCisgIHJldHVybiBidWlsZF9hdG9tX2luZm9fd3JhcHBlciAoKEF0b20gKikgYXRvbV9kYXRhLCBhdG9tX2RhdGFfY29weV9kYXRhLAorICAgICAgYXRvbV9kYXRhX2ZyZWUpOworfQorCitzdGF0aWMgQXRvbUluZm8gKgorYnVpbGRfbW92X3dhdmVfZXh0ZW5zaW9uIChndWludDMyIGZvdXJjYywgQXRvbUluZm8gKiBhdG9tMSwgQXRvbUluZm8gKiBhdG9tMiwKKyAgICBnYm9vbGVhbiB0ZXJtaW5hdG9yKQoreworICBBdG9tV0FWRSAqd2F2ZTsKKyAgQXRvbUZSTUEgKmZybWE7CisgIEF0b20gKmV4dF9hdG9tOworCisgIC8qIEJ1aWxkIFdBVkUgYXRvbSBmb3Igc2FtcGxlIHRhYmxlIGVudHJ5ICovCisgIHdhdmUgPSBhdG9tX3dhdmVfbmV3ICgpOworCisgIC8qIFByZXBlbmQgVGVybWluYXRvciBhdG9tIHRvIHRoZSBXQVZFIGxpc3QgZmlyc3QsIHNvIGl0IGVuZHMgdXAgbGFzdCAqLworICBpZiAodGVybWluYXRvcikgeworICAgIGV4dF9hdG9tID0gKEF0b20gKikgYXRvbV9kYXRhX25ldyAoRk9VUkNDX251bGwpOworICAgIHdhdmUtPmV4dGVuc2lvbl9hdG9tcyA9CisgICAgICAgIGF0b21faW5mb19saXN0X3ByZXBlbmRfYXRvbSAod2F2ZS0+ZXh0ZW5zaW9uX2F0b21zLCAoQXRvbSAqKSBleHRfYXRvbSwKKyAgICAgICAgKEF0b21Db3B5RGF0YUZ1bmMpIGF0b21fZGF0YV9jb3B5X2RhdGEsIChBdG9tRnJlZUZ1bmMpIGF0b21fZGF0YV9mcmVlKTsKKyAgfQorCisgIC8qIEFkZCBzdXBwbGllZCBhdG9tcyB0byBXQVZFICovCisgIGlmIChhdG9tMikKKyAgICB3YXZlLT5leHRlbnNpb25fYXRvbXMgPSBnX2xpc3RfcHJlcGVuZCAod2F2ZS0+ZXh0ZW5zaW9uX2F0b21zLCBhdG9tMik7CisgIGlmIChhdG9tMSkKKyAgICB3YXZlLT5leHRlbnNpb25fYXRvbXMgPSBnX2xpc3RfcHJlcGVuZCAod2F2ZS0+ZXh0ZW5zaW9uX2F0b21zLCBhdG9tMSk7CisKKyAgLyogQWRkIEZSTUEgdG8gdGhlIFdBVkUgKi8KKyAgZnJtYSA9IGF0b21fZnJtYV9uZXcgKCk7CisgIGZybWEtPm1lZGlhX3R5cGUgPSBmb3VyY2M7CisKKyAgd2F2ZS0+ZXh0ZW5zaW9uX2F0b21zID0KKyAgICAgIGF0b21faW5mb19saXN0X3ByZXBlbmRfYXRvbSAod2F2ZS0+ZXh0ZW5zaW9uX2F0b21zLCAoQXRvbSAqKSBmcm1hLAorICAgICAgKEF0b21Db3B5RGF0YUZ1bmMpIGF0b21fZnJtYV9jb3B5X2RhdGEsIChBdG9tRnJlZUZ1bmMpIGF0b21fZnJtYV9mcmVlKTsKKworICByZXR1cm4gYnVpbGRfYXRvbV9pbmZvX3dyYXBwZXIgKChBdG9tICopIHdhdmUsIGF0b21fd2F2ZV9jb3B5X2RhdGEsCisgICAgICBhdG9tX3dhdmVfZnJlZSk7Cit9CisKK0F0b21JbmZvICoKK2J1aWxkX21vdl9hYWNfZXh0ZW5zaW9uIChBdG9tVFJBSyAqIHRyYWssIGNvbnN0IEdzdEJ1ZmZlciAqIGNvZGVjX2RhdGEsCisgICAgZ3VpbnQzMiBhdmdfYml0cmF0ZSwgZ3VpbnQzMiBtYXhfYml0cmF0ZSkKK3sKKyAgQXRvbUluZm8gKmVzZHMsICptcDRhOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgZ3VpbnQzMiB0bXAgPSAwOworCisgIC8qIEFkZCBFU0RTIGF0b20gdG8gV0FWRSAqLworICBlc2RzID0gYnVpbGRfZXNkc19leHRlbnNpb24gKHRyYWssIEVTRFNfT0JKRUNUX1RZUEVfTVBFRzRfUDMsCisgICAgICBFU0RTX1NUUkVBTV9UWVBFX0FVRElPLCBjb2RlY19kYXRhLCBhdmdfYml0cmF0ZSwgbWF4X2JpdHJhdGUpOworCisgIC8qIEFkZCBNUDRBIGF0b20gdG8gdGhlIFdBVkU6CisgICAqIG5vdCByZWFsbHkgaW4gc3BlYywgYnV0IG1ha2VzIG9mZnNldCBiYXNlZCBwbGF5ZXJzIGhhcHB5ICovCisgIGJ1ZiA9IEdTVF9CVUZGRVJfTkVXX1JFQURPTkxZICgmdG1wLCA0KTsKKyAgbXA0YSA9IGJ1aWxkX2NvZGVjX2RhdGFfZXh0ZW5zaW9uIChGT1VSQ0NfbXA0YSwgYnVmKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICByZXR1cm4gYnVpbGRfbW92X3dhdmVfZXh0ZW5zaW9uIChGT1VSQ0NfbXA0YSwgbXA0YSwgZXNkcywgVFJVRSk7Cit9CisKK0F0b21JbmZvICoKK2J1aWxkX21vdl9hbGFjX2V4dGVuc2lvbiAoY29uc3QgR3N0QnVmZmVyICogY29kZWNfZGF0YSkKK3sKKyAgQXRvbUluZm8gKmFsYWM7CisKKyAgYWxhYyA9IGJ1aWxkX2NvZGVjX2RhdGFfZXh0ZW5zaW9uIChGT1VSQ0NfYWxhYywgY29kZWNfZGF0YSk7CisKKyAgcmV0dXJuIGJ1aWxkX21vdl93YXZlX2V4dGVuc2lvbiAoRk9VUkNDX2FsYWMsIE5VTEwsIGFsYWMsIFRSVUUpOworfQorCitBdG9tSW5mbyAqCitidWlsZF9qcDJ4X2V4dGVuc2lvbiAoY29uc3QgR3N0QnVmZmVyICogcHJlZml4KQoreworICBBdG9tRGF0YSAqYXRvbV9kYXRhOworCisgIGlmICghcHJlZml4KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBhdG9tX2RhdGEgPSBhdG9tX2RhdGFfbmV3X2Zyb21fZ3N0X2J1ZmZlciAoRk9VUkNDX2pwMngsIHByZWZpeCk7CisKKyAgcmV0dXJuIGJ1aWxkX2F0b21faW5mb193cmFwcGVyICgoQXRvbSAqKSBhdG9tX2RhdGEsIGF0b21fZGF0YV9jb3B5X2RhdGEsCisgICAgICBhdG9tX2RhdGFfZnJlZSk7Cit9CisKK0F0b21JbmZvICoKK2J1aWxkX2pwMmhfZXh0ZW5zaW9uIChnaW50IHdpZHRoLCBnaW50IGhlaWdodCwgY29uc3QgZ2NoYXIgKiBjb2xvcnNwYWNlLAorICAgIGdpbnQgbmNvbXAsIGNvbnN0IEdWYWx1ZSAqIGNtYXBfYXJyYXksIGNvbnN0IEdWYWx1ZSAqIGNkZWZfYXJyYXkpCit7CisgIEF0b21EYXRhICphdG9tX2RhdGE7CisgIEdzdEJ1ZmZlciAqYnVmOworICBndWludDggY2VudW07CisgIGdpbnQgaTsKKyAgZ2ludCBpZGhyX3NpemUgPSAyMjsKKyAgZ2ludCBjb2xyX3NpemUgPSAxNTsKKyAgZ2ludCBjbWFwX3NpemUgPSAwLCBjZGVmX3NpemUgPSAwOworICBnaW50IGNtYXBfYXJyYXlfc2l6ZSA9IDA7CisgIGdpbnQgY2RlZl9hcnJheV9zaXplID0gMDsKKyAgR3N0Qnl0ZVdyaXRlciB3cml0ZXI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNtYXBfYXJyYXkgPT0gTlVMTCB8fAorICAgICAgR1NUX1ZBTFVFX0hPTERTX0FSUkFZIChjbWFwX2FycmF5KSwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChjZGVmX2FycmF5ID09IE5VTEwgfHwKKyAgICAgIEdTVF9WQUxVRV9IT0xEU19BUlJBWSAoY2RlZl9hcnJheSksIE5VTEwpOworCisgIGlmIChnX3N0cl9lcXVhbCAoY29sb3JzcGFjZSwgInNSR0IiKSkgeworICAgIGNlbnVtID0gMHgxMDsKKyAgICBpZiAobmNvbXAgPT0gMCkKKyAgICAgIG5jb21wID0gMzsKKyAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAoY29sb3JzcGFjZSwgIkdSQVkiKSkgeworICAgIGNlbnVtID0gMHgxMTsKKyAgICBpZiAobmNvbXAgPT0gMCkKKyAgICAgIG5jb21wID0gMTsKKyAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAoY29sb3JzcGFjZSwgInNZVVYiKSkgeworICAgIGNlbnVtID0gMHgxMjsKKyAgICBpZiAobmNvbXAgPT0gMCkKKyAgICAgIG5jb21wID0gMzsKKyAgfSBlbHNlCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKGNtYXBfYXJyYXkpIHsKKyAgICBjbWFwX2FycmF5X3NpemUgPSBnc3RfdmFsdWVfYXJyYXlfZ2V0X3NpemUgKGNtYXBfYXJyYXkpOworICAgIGNtYXBfc2l6ZSA9IDggKyBjbWFwX2FycmF5X3NpemUgKiA0OworICB9CisgIGlmIChjZGVmX2FycmF5KSB7CisgICAgY2RlZl9hcnJheV9zaXplID0gZ3N0X3ZhbHVlX2FycmF5X2dldF9zaXplIChjZGVmX2FycmF5KTsKKyAgICBjZGVmX3NpemUgPSA4ICsgMiArIGNkZWZfYXJyYXlfc2l6ZSAqIDY7CisgIH0KKworICBnc3RfYnl0ZV93cml0ZXJfaW5pdF93aXRoX3NpemUgKCZ3cml0ZXIsCisgICAgICBpZGhyX3NpemUgKyBjb2xyX3NpemUgKyBjbWFwX3NpemUgKyBjZGVmX3NpemUsIFRSVUUpOworCisgIC8qIGloZHIgPSBpbWFnZSBoZWFkZXIgYm94ICovCisgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2JlX3VuY2hlY2tlZCAoJndyaXRlciwgMjIpOworICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZV91bmNoZWNrZWQgKCZ3cml0ZXIsIEZPVVJDQ19paGRyKTsKKyAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfYmVfdW5jaGVja2VkICgmd3JpdGVyLCBoZWlnaHQpOworICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9iZV91bmNoZWNrZWQgKCZ3cml0ZXIsIHdpZHRoKTsKKyAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfYmVfdW5jaGVja2VkICgmd3JpdGVyLCBuY29tcCk7CisgIC8qIDggYml0cyBwZXIgY29tcG9uZW50LCB1bnNpZ25lZCAqLworICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQ4X3VuY2hlY2tlZCAoJndyaXRlciwgMHg3KTsKKyAgLyogY29tcHJlc3Npb24gdHlwZTsgcmVzZXJ2ZWQgKi8KKyAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50OF91bmNoZWNrZWQgKCZ3cml0ZXIsIDB4Nyk7CisgIC8qIGNvbG91ciBzcGFjZSAodW4pa25vd24gKi8KKyAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50OF91bmNoZWNrZWQgKCZ3cml0ZXIsIDB4MCk7CisgIC8qIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodCAoYm94IHByZXNlbnQpICovCisgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDhfdW5jaGVja2VkICgmd3JpdGVyLCAweDApOworCisgIC8qIGNvbG91ciBzcGVjaWZpY2F0aW9uIGJveCAqLworICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9iZV91bmNoZWNrZWQgKCZ3cml0ZXIsIDE1KTsKKyAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGVfdW5jaGVja2VkICgmd3JpdGVyLCBGT1VSQ0NfY29scik7CisKKyAgLyogc3BlY2lmaWNhdGlvbiBtZXRob2Q6IGVudW1lcmF0ZWQgKi8KKyAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50OF91bmNoZWNrZWQgKCZ3cml0ZXIsIDB4MSk7CisgIC8qIHByZWNlZGVuY2U7IHJlc2VydmVkICovCisgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDhfdW5jaGVja2VkICgmd3JpdGVyLCAweDApOworICAvKiBhcHByb3hpbWF0aW9uOyByZXNlcnZlZCAqLworICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQ4X3VuY2hlY2tlZCAoJndyaXRlciwgMHgwKTsKKyAgLyogZW51bWVyYXRlZCBjb2xvdXJzcGFjZSAqLworICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9iZV91bmNoZWNrZWQgKCZ3cml0ZXIsIGNlbnVtKTsKKworICBpZiAoY21hcF9hcnJheSkgeworICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2JlX3VuY2hlY2tlZCAoJndyaXRlciwgY21hcF9zaXplKTsKKyAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZV91bmNoZWNrZWQgKCZ3cml0ZXIsIEZPVVJDQ19jbWFwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY21hcF9hcnJheV9zaXplOyBpKyspIHsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqaXRlbTsKKyAgICAgIGdpbnQgdmFsdWU7CisgICAgICBndWludDE2IGNtcDsKKyAgICAgIGd1aW50OCBtdHlwOworICAgICAgZ3VpbnQ4IHBjb2w7CisgICAgICBpdGVtID0gZ3N0X3ZhbHVlX2FycmF5X2dldF92YWx1ZSAoY21hcF9hcnJheSwgaSk7CisgICAgICB2YWx1ZSA9IGdfdmFsdWVfZ2V0X2ludCAoaXRlbSk7CisKKyAgICAgIC8qIHZhbHVlIGlzICcobXR5cCA8PCAyNCkgfCAocGNvbCA8PCAxNikgfCBjbXAnICovCisgICAgICBjbXAgPSB2YWx1ZSAmIDB4RkZGRjsKKyAgICAgIG10eXAgPSB2YWx1ZSA+PiAyNDsKKyAgICAgIHBjb2wgPSAodmFsdWUgPj4gMTYpICYgMHhGRjsKKworICAgICAgaWYgKG10eXAgPT0gMSkKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJNVFlQIG9mIGNtYXAgYXRvbSBzaWduYWxzIFBhbGxldGUgTWFwcGluZywgYnV0IHdlIGRvbid0ICIKKyAgICAgICAgICAgICJoYW5kbGUgUGFsbGV0ZSBtYXBwaW5nIGF0b21zIHlldCIpOworCisgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQxNl9iZV91bmNoZWNrZWQgKCZ3cml0ZXIsIGNtcCk7CisgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQ4X3VuY2hlY2tlZCAoJndyaXRlciwgbXR5cCk7CisgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQ4X3VuY2hlY2tlZCAoJndyaXRlciwgcGNvbCk7CisgICAgfQorICB9CisKKyAgaWYgKGNkZWZfYXJyYXkpIHsKKyAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9iZV91bmNoZWNrZWQgKCZ3cml0ZXIsIGNkZWZfc2l6ZSk7CisgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGVfdW5jaGVja2VkICgmd3JpdGVyLCBGT1VSQ0NfY2RlZik7CisgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfYmVfdW5jaGVja2VkICgmd3JpdGVyLCBjZGVmX2FycmF5X3NpemUpOworICAgIGZvciAoaSA9IDA7IGkgPCBjZGVmX2FycmF5X3NpemU7IGkrKykgeworICAgICAgY29uc3QgR1ZhbHVlICppdGVtOworICAgICAgZ2ludCB2YWx1ZTsKKyAgICAgIGl0ZW0gPSBnc3RfdmFsdWVfYXJyYXlfZ2V0X3ZhbHVlIChjZGVmX2FycmF5LCBpKTsKKyAgICAgIHZhbHVlID0gZ192YWx1ZV9nZXRfaW50IChpdGVtKTsKKworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfYmVfdW5jaGVja2VkICgmd3JpdGVyLCBpKTsKKyAgICAgIGlmICh2YWx1ZSA+IDApIHsKKyAgICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfYmVfdW5jaGVja2VkICgmd3JpdGVyLCAwKTsKKyAgICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MTZfYmVfdW5jaGVja2VkICgmd3JpdGVyLCB2YWx1ZSk7CisgICAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMCkgeworICAgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQxNl9iZV91bmNoZWNrZWQgKCZ3cml0ZXIsIC12YWx1ZSk7CisgICAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDE2X2JlX3VuY2hlY2tlZCAoJndyaXRlciwgMCk7ICAgLyogVE9ETyB3aGF0IGhlcmU/ICovCisgICAgICB9IGVsc2UgeworICAgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQxNl9iZV91bmNoZWNrZWQgKCZ3cml0ZXIsIDEpOworICAgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQxNl9iZV91bmNoZWNrZWQgKCZ3cml0ZXIsIDApOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGdfYXNzZXJ0IChnc3RfYnl0ZV93cml0ZXJfZ2V0X3JlbWFpbmluZyAoJndyaXRlcikgPT0gMCk7CisgIGJ1ZiA9IGdzdF9ieXRlX3dyaXRlcl9yZXNldF9hbmRfZ2V0X2J1ZmZlciAoJndyaXRlcik7CisKKyAgYXRvbV9kYXRhID0gYXRvbV9kYXRhX25ld19mcm9tX2dzdF9idWZmZXIgKEZPVVJDQ19qcDJoLCBidWYpOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIHJldHVybiBidWlsZF9hdG9tX2luZm9fd3JhcHBlciAoKEF0b20gKikgYXRvbV9kYXRhLCBhdG9tX2RhdGFfY29weV9kYXRhLAorICAgICAgYXRvbV9kYXRhX2ZyZWUpOworfQorCitBdG9tSW5mbyAqCitidWlsZF9jb2RlY19kYXRhX2V4dGVuc2lvbiAoZ3VpbnQzMiBmb3VyY2MsIGNvbnN0IEdzdEJ1ZmZlciAqIGNvZGVjX2RhdGEpCit7CisgIEF0b21EYXRhICpkYXRhOworICBBdG9tSW5mbyAqcmVzdWx0ID0gTlVMTDsKKworICBpZiAoY29kZWNfZGF0YSkgeworICAgIGRhdGEgPSBhdG9tX2RhdGFfbmV3X2Zyb21fZ3N0X2J1ZmZlciAoZm91cmNjLCBjb2RlY19kYXRhKTsKKyAgICByZXN1bHQgPSBidWlsZF9hdG9tX2luZm9fd3JhcHBlciAoKEF0b20gKikgZGF0YSwgYXRvbV9kYXRhX2NvcHlfZGF0YSwKKyAgICAgICAgYXRvbV9kYXRhX2ZyZWUpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworQXRvbUluZm8gKgorYnVpbGRfYW1yX2V4dGVuc2lvbiAodm9pZCkKK3sKKyAgZ3VpbnQ4IGV4dFs5XTsKKyAgR3N0QnVmZmVyICpidWY7CisgIEF0b21JbmZvICpyZXM7CisKKyAgLyogdmVuZG9yICovCisgIEdTVF9XUklURV9VSU5UMzJfTEUgKGV4dCwgMCk7CisgIC8qIGRlY29kZXIgdmVyc2lvbiAqLworICBHU1RfV1JJVEVfVUlOVDggKGV4dCArIDQsIDApOworICAvKiBtb2RlIHNldCAoYWxsIG1vZGVzKSAqLworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChleHQgKyA1LCAweDgxRkYpOworICAvKiBtb2RlIGNoYW5nZSBwZXJpb2QgKG5vIHJlc3RyaWN0aW9uKSAqLworICBHU1RfV1JJVEVfVUlOVDggKGV4dCArIDcsIDApOworICAvKiBmcmFtZXMgcGVyIHNhbXBsZSAqLworICBHU1RfV1JJVEVfVUlOVDggKGV4dCArIDgsIDEpOworCisgIGJ1ZiA9IEdTVF9CVUZGRVJfTkVXX1JFQURPTkxZIChleHQsIHNpemVvZiAoZXh0KSk7CisgIHJlcyA9IGJ1aWxkX2NvZGVjX2RhdGFfZXh0ZW5zaW9uIChGT1VSQ0NfZGFtciwgYnVmKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgcmV0dXJuIHJlczsKK30KKworQXRvbUluZm8gKgorYnVpbGRfaDI2M19leHRlbnNpb24gKHZvaWQpCit7CisgIGd1aW50OCBleHRbN107CisgIEdzdEJ1ZmZlciAqYnVmOworICBBdG9tSW5mbyAqcmVzOworCisgIC8qIHZlbmRvciAqLworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChleHQsIDApOworICAvKiBkZWNvZGVyIHZlcnNpb24gKi8KKyAgR1NUX1dSSVRFX1VJTlQ4IChleHQgKyA0LCAwKTsKKyAgLyogbGV2ZWwgLyBwcm9maWxlICovCisgIC8qIEZJWE1FID8gbWF5YmUgPyBvYnRhaW4gc29tZXdoZXJlOyBiYXNlbGluZSBmb3Igbm93ICovCisgIEdTVF9XUklURV9VSU5UOCAoZXh0ICsgNSwgMTApOworICBHU1RfV1JJVEVfVUlOVDggKGV4dCArIDYsIDApOworCisgIGJ1ZiA9IEdTVF9CVUZGRVJfTkVXX1JFQURPTkxZIChleHQsIHNpemVvZiAoZXh0KSk7CisgIHJlcyA9IGJ1aWxkX2NvZGVjX2RhdGFfZXh0ZW5zaW9uIChGT1VSQ0NfZDI2MywgYnVmKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgcmV0dXJuIHJlczsKK30KKworQXRvbUluZm8gKgorYnVpbGRfZ2FtYV9hdG9tIChnZG91YmxlIGdhbW1hKQoreworICBBdG9tSW5mbyAqcmVzOworICBndWludDMyIGdhbW1hX2ZwOworICBHc3RCdWZmZXIgKmJ1ZjsKKworICAvKiBjb252ZXJ0IHRvIHVpbnQzMiBmcm9tIGZpeGVkIHBvaW50ICovCisgIGdhbW1hX2ZwID0gKGd1aW50MzIpIDY1NTM2ICpnYW1tYTsKKworICBnYW1tYV9mcCA9IEdVSU5UMzJfVE9fQkUgKGdhbW1hX2ZwKTsKKyAgYnVmID0gR1NUX0JVRkZFUl9ORVdfUkVBRE9OTFkgKCZnYW1tYV9mcCwgNCk7CisgIHJlcyA9IGJ1aWxkX2NvZGVjX2RhdGFfZXh0ZW5zaW9uIChGT1VSQ0NfZ2FtYSwgYnVmKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgcmV0dXJuIHJlczsKK30KKworQXRvbUluZm8gKgorYnVpbGRfU01JX2F0b20gKGNvbnN0IEdzdEJ1ZmZlciAqIHNlcWgpCit7CisgIEF0b21JbmZvICpyZXM7CisgIEdzdEJ1ZmZlciAqYnVmOworICBnc2l6ZSBzaXplOworICBndWludDggKmRhdGE7CisKKyAgLyogdGhlIHNlcWggcGx1cyBpdHMgc2l6ZSBhbmQgZm91cmNjICovCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplICgoR3N0QnVmZmVyICopIHNlcWgpOworICBkYXRhID0gZ19tYWxsb2MgKHNpemUgKyA4KTsKKworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhLCBGT1VSQ0NfU0VRSCk7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEgKyA0LCBzaXplICsgOCk7CisgIGdzdF9idWZmZXJfZXh0cmFjdCAoKEdzdEJ1ZmZlciAqKSBzZXFoLCAwLCBkYXRhICsgOCwgc2l6ZSk7CisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGRhdGEsIHNpemUgKyA4KTsKKyAgcmVzID0gYnVpbGRfY29kZWNfZGF0YV9leHRlbnNpb24gKEZPVVJDQ19TTUlfLCBidWYpOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgQXRvbUluZm8gKgorYnVpbGRfaW1hX2FkcGNtX2F0b20gKGdpbnQgY2hhbm5lbHMsIGdpbnQgcmF0ZSwgZ2ludCBibG9ja3NpemUpCit7CisjZGVmaW5lIElNQV9BRFBDTV9BVE9NX1NJWkUgMjAKKyAgQXRvbURhdGEgKmF0b21fZGF0YTsKKyAgZ3VpbnQ4ICpkYXRhOworICBndWludDMyIGZvdXJjYzsKKyAgZ2ludCBzYW1wbGVzcGVyYmxvY2s7CisgIGdpbnQgYnl0ZXNwZXJzZWM7CisKKyAgLyogVGhlIEZPVVJDQyBmb3IgV0FWIGNvZGVjcyBpbiBRVCBpcyAnbXMnIGZvbGxvd2VkIGJ5IHRoZSAxNiBiaXQgd2F2ZSBjb2RlYworICAgICBpZGVudGlmaWVyLiBOb3RlIHRoYXQgdGhlIGlkZW50aWZpZXIgaGVyZSBpcyBiaWctZW5kaWFuLCBidXQgd2hlbiB1c2VkCisgICAgIHdpdGhpbiB0aGUgV0FWRSBoZWFkZXIgKGJlbG93KSwgaXQncyBsaXR0bGUgZW5kaWFuLiAqLworICBmb3VyY2MgPSBNU19XQVZFX0ZPVVJDQyAoMHgxMSk7CisKKyAgYXRvbV9kYXRhID0gYXRvbV9kYXRhX25ldyAoZm91cmNjKTsKKyAgYXRvbV9kYXRhX2FsbG9jX21lbSAoYXRvbV9kYXRhLCBJTUFfQURQQ01fQVRPTV9TSVpFKTsKKyAgZGF0YSA9IGF0b21fZGF0YS0+ZGF0YTsKKworICAvKiBUaGlzIGF0b20ncyBjb250ZW50IGlzIGEgV0FWRSBoZWFkZXIsIGluY2x1ZGluZyAyIGJ5dGVzIG9mIGV4dHJhIGRhdGEuCisgICAgIE5vdGUgdGhhdCBhbGwgb2YgdGhpcyBpcyBsaXR0bGUtZW5kaWFuLCB1bmxpa2UgbW9zdCBzdHVmZiBpbiBxdC4gKi8KKyAgLyogNCBieXRlcyBoZWFkZXIgcGVyIGNoYW5uZWwgKGluY2x1ZGluZyAxIHNhbXBsZSkuIFRoZW4gMiBzYW1wbGVzIHBlciBieXRlCisgICAgIGZvciB0aGUgcmVzdC4gU2ltcGxpZmllcyB0byB0aGlzLiAqLworICBzYW1wbGVzcGVyYmxvY2sgPSAyICogYmxvY2tzaXplIC8gY2hhbm5lbHMgLSA3OworICBieXRlc3BlcnNlYyA9IHJhdGUgKiBibG9ja3NpemUgLyBzYW1wbGVzcGVyYmxvY2s7CisgIEdTVF9XUklURV9VSU5UMTZfTEUgKGRhdGEsIDB4MTEpOworICBHU1RfV1JJVEVfVUlOVDE2X0xFIChkYXRhICsgMiwgY2hhbm5lbHMpOworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhICsgNCwgcmF0ZSk7CisgIEdTVF9XUklURV9VSU5UMzJfTEUgKGRhdGEgKyA4LCBieXRlc3BlcnNlYyk7CisgIEdTVF9XUklURV9VSU5UMTZfTEUgKGRhdGEgKyAxMiwgYmxvY2tzaXplKTsKKyAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoZGF0YSArIDE0LCA0KTsKKyAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoZGF0YSArIDE2LCAyKTsgICAvKiBUd28gZXh0cmEgYnl0ZXMgKi8KKyAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoZGF0YSArIDE4LCBzYW1wbGVzcGVyYmxvY2spOworCisgIHJldHVybiBidWlsZF9hdG9tX2luZm9fd3JhcHBlciAoKEF0b20gKikgYXRvbV9kYXRhLCBhdG9tX2RhdGFfY29weV9kYXRhLAorICAgICAgYXRvbV9kYXRhX2ZyZWUpOworfQorCitBdG9tSW5mbyAqCitidWlsZF9pbWFfYWRwY21fZXh0ZW5zaW9uIChnaW50IGNoYW5uZWxzLCBnaW50IHJhdGUsIGdpbnQgYmxvY2tzaXplKQoreworICBBdG9tV0FWRSAqd2F2ZTsKKyAgQXRvbUZSTUEgKmZybWE7CisgIEF0b20gKmV4dF9hdG9tOworCisgIC8qIEFkZCBXQVZFIGF0b20gKi8KKyAgd2F2ZSA9IGF0b21fd2F2ZV9uZXcgKCk7CisKKyAgLyogUHJlcGVuZCBUZXJtaW5hdG9yIGF0b20gdG8gdGhlIFdBVkUgbGlzdCBmaXJzdCwgc28gaXQgZW5kcyB1cCBsYXN0ICovCisgIGV4dF9hdG9tID0gKEF0b20gKikgYXRvbV9kYXRhX25ldyAoRk9VUkNDX251bGwpOworICB3YXZlLT5leHRlbnNpb25fYXRvbXMgPQorICAgICAgYXRvbV9pbmZvX2xpc3RfcHJlcGVuZF9hdG9tICh3YXZlLT5leHRlbnNpb25fYXRvbXMsIChBdG9tICopIGV4dF9hdG9tLAorICAgICAgKEF0b21Db3B5RGF0YUZ1bmMpIGF0b21fZGF0YV9jb3B5X2RhdGEsIChBdG9tRnJlZUZ1bmMpIGF0b21fZGF0YV9mcmVlKTsKKworICAvKiBBZGQgd2F2ZSBpbWEgYWRwY20gYXRvbSB0byBXQVZFICovCisgIHdhdmUtPmV4dGVuc2lvbl9hdG9tcyA9IGdfbGlzdF9wcmVwZW5kICh3YXZlLT5leHRlbnNpb25fYXRvbXMsCisgICAgICBidWlsZF9pbWFfYWRwY21fYXRvbSAoY2hhbm5lbHMsIHJhdGUsIGJsb2Nrc2l6ZSkpOworCisgIC8qIEFkZCBGUk1BIHRvIHRoZSBXQVZFICovCisgIGZybWEgPSBhdG9tX2ZybWFfbmV3ICgpOworICBmcm1hLT5tZWRpYV90eXBlID0gTVNfV0FWRV9GT1VSQ0MgKDB4MTEpOworCisgIHdhdmUtPmV4dGVuc2lvbl9hdG9tcyA9CisgICAgICBhdG9tX2luZm9fbGlzdF9wcmVwZW5kX2F0b20gKHdhdmUtPmV4dGVuc2lvbl9hdG9tcywgKEF0b20gKikgZnJtYSwKKyAgICAgIChBdG9tQ29weURhdGFGdW5jKSBhdG9tX2ZybWFfY29weV9kYXRhLCAoQXRvbUZyZWVGdW5jKSBhdG9tX2ZybWFfZnJlZSk7CisKKyAgcmV0dXJuIGJ1aWxkX2F0b21faW5mb193cmFwcGVyICgoQXRvbSAqKSB3YXZlLCBhdG9tX3dhdmVfY29weV9kYXRhLAorICAgICAgYXRvbV93YXZlX2ZyZWUpOworfQorCitBdG9tSW5mbyAqCitidWlsZF9hYzNfZXh0ZW5zaW9uIChndWludDggZnNjb2QsIGd1aW50OCBic2lkLCBndWludDggYnNtb2QsIGd1aW50OCBhY21vZCwKKyAgICBndWludDggbGZlX29uLCBndWludDggYml0cmF0ZV9jb2RlKQoreworICBBdG9tRGF0YSAqYXRvbV9kYXRhID0gYXRvbV9kYXRhX25ldyAoRk9VUkNDX2RhYzMpOworICBndWludDggKmRhdGE7CisKKyAgYXRvbV9kYXRhX2FsbG9jX21lbSAoYXRvbV9kYXRhLCAzKTsKKyAgZGF0YSA9IGF0b21fZGF0YS0+ZGF0YTsKKworICAvKiBCaXRzIGZyb20gdGhlIHNwZWMKKyAgICogZnNjb2QgMgorICAgKiBic2lkICA1CisgICAqIGJzbW9kIDMKKyAgICogYWNtb2QgMworICAgKiBsZmVvbiAxCisgICAqIGJpdF9yYXRlX2NvZGUgNQorICAgKiByZXNlcnZlZCA1CisgICAqLworCisgIC8qIFNvbWUgYml0IG1hbmlwdWxhdGlvbiBtYWdpYy4gTmVlZCBiaXR3cml0ZXIgKi8KKyAgZGF0YVswXSA9IChmc2NvZCA8PCA2KSB8IChic2lkIDw8IDEpIHwgKChic21vZCA+PiAyKSAmIDEpOworICBkYXRhWzFdID0KKyAgICAgICgoYnNtb2QgJiAweDMpIDw8IDYpIHwgKGFjbW9kIDw8IDMpIHwgKChsZmVfb24gJiAxKSA8PCAyKSB8ICgoYml0cmF0ZV9jb2RlCisgICAgICAgICAgPj4gMykgJiAweDMpOworICBkYXRhWzJdID0gKChiaXRyYXRlX2NvZGUgJiAweDcpIDw8IDUpOworCisgIHJldHVybiBidWlsZF9hdG9tX2luZm9fd3JhcHBlciAoKEF0b20gKikgYXRvbV9kYXRhLCBhdG9tX2RhdGFfY29weV9kYXRhLAorICAgICAgYXRvbV9kYXRhX2ZyZWUpOworfQorCitBdG9tSW5mbyAqCitidWlsZF9vcHVzX2V4dGVuc2lvbiAoZ3VpbnQzMiByYXRlLCBndWludDggY2hhbm5lbHMsIGd1aW50OCBtYXBwaW5nX2ZhbWlseSwKKyAgICBndWludDggc3RyZWFtX2NvdW50LCBndWludDggY291cGxlZF9jb3VudCwgZ3VpbnQ4IGNoYW5uZWxfbWFwcGluZ1syNTZdLAorICAgIGd1aW50MTYgcHJlX3NraXAsIGd1aW50MTYgb3V0cHV0X2dhaW4pCit7CisgIEF0b21EYXRhICphdG9tX2RhdGE7CisgIGd1aW50OCAqZGF0YV9ibG9jazsKKyAgR3N0Qnl0ZVdyaXRlciBidzsKKyAgZ2Jvb2xlYW4gaGRsID0gVFJVRTsKKyAgZ3VpbnQgZGF0YV9ibG9ja19sZW47CisKKyAgZ3N0X2J5dGVfd3JpdGVyX2luaXQgKCZidyk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQ4ICgmYncsIDB4MDApOyAvKiB2ZXJzaW9uIG51bWJlciAqLworICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50OCAoJmJ3LCBjaGFubmVscyk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQxNl9sZSAoJmJ3LCBwcmVfc2tpcCk7CisgIGhkbCAmPSBnc3RfYnl0ZV93cml0ZXJfcHV0X3VpbnQzMl9sZSAoJmJ3LCByYXRlKTsKKyAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDE2X2xlICgmYncsIG91dHB1dF9nYWluKTsKKyAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDggKCZidywgbWFwcGluZ19mYW1pbHkpOworICBpZiAobWFwcGluZ19mYW1pbHkgPiAwKSB7CisgICAgaGRsICY9IGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDggKCZidywgc3RyZWFtX2NvdW50KTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50OCAoJmJ3LCBjb3VwbGVkX2NvdW50KTsKKyAgICBoZGwgJj0gZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmYncsIGNoYW5uZWxfbWFwcGluZywgY2hhbm5lbHMpOworICB9CisKKyAgaWYgKCFoZGwpIHsKKyAgICBHU1RfV0FSTklORyAoIkVycm9yIGNyZWF0aW5nIGhlYWRlciIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgZGF0YV9ibG9ja19sZW4gPSBnc3RfYnl0ZV93cml0ZXJfZ2V0X3NpemUgKCZidyk7CisgIGRhdGFfYmxvY2sgPSBnc3RfYnl0ZV93cml0ZXJfcmVzZXRfYW5kX2dldF9kYXRhICgmYncpOworICBhdG9tX2RhdGEgPSBhdG9tX2RhdGFfbmV3X2Zyb21fZGF0YSAoRk9VUkNDX2RvcHMsIGRhdGFfYmxvY2ssIGRhdGFfYmxvY2tfbGVuKTsKKyAgZ19mcmVlIChkYXRhX2Jsb2NrKTsKKworICByZXR1cm4gYnVpbGRfYXRvbV9pbmZvX3dyYXBwZXIgKChBdG9tICopIGF0b21fZGF0YSwgYXRvbV9kYXRhX2NvcHlfZGF0YSwKKyAgICAgIGF0b21fZGF0YV9mcmVlKTsKK30KKworQXRvbUluZm8gKgorYnVpbGRfdXVpZF94bXBfYXRvbSAoR3N0QnVmZmVyICogeG1wX2RhdGEpCit7CisgIEF0b21VVUlEICp1dWlkOworICBnc2l6ZSBzaXplOworICBzdGF0aWMgY29uc3QgZ3VpbnQ4IHhtcF91dWlkW10gPSB7IDB4QkUsIDB4N0EsIDB4Q0YsIDB4Q0IsCisgICAgMHg5NywgMHhBOSwgMHg0MiwgMHhFOCwKKyAgICAweDlDLCAweDcxLCAweDk5LCAweDk0LAorICAgIDB4OTEsIDB4RTMsIDB4QUYsIDB4QUMKKyAgfTsKKworICBpZiAoeG1wX2RhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICB1dWlkID0gYXRvbV91dWlkX25ldyAoKTsKKyAgbWVtY3B5ICh1dWlkLT51dWlkLCB4bXBfdXVpZCwgMTYpOworCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplICh4bXBfZGF0YSk7CisgIHV1aWQtPmRhdGEgPSBnX21hbGxvYyAoc2l6ZSk7CisgIHV1aWQtPmRhdGFsZW4gPSBzaXplOworICBnc3RfYnVmZmVyX2V4dHJhY3QgKHhtcF9kYXRhLCAwLCB1dWlkLT5kYXRhLCBzaXplKTsKKworICByZXR1cm4gYnVpbGRfYXRvbV9pbmZvX3dyYXBwZXIgKChBdG9tICopIHV1aWQsIGF0b21fdXVpZF9jb3B5X2RhdGEsCisgICAgICBhdG9tX3V1aWRfZnJlZSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L2F0b21zLmggYi9nc3QvaXNvbXA0L2F0b21zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdkMjQ5NAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvYXRvbXMuaApAQCAtMCwwICsxLDExMjggQEAKKy8qIFF1aWNrdGltZSBtdXhlciBwbHVnaW4gZm9yIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qCisgKiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgU291cmNlIENvZGUgaXMgbGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2UuCisgKiBTZWUgZnVydGhlciBleHBsYW5hdGlvbiBhdHRhY2hlZCBpbiBMaWNlbnNlIFN0YXRlbWVudCAoZGlzdHJpYnV0ZWQgaW4gdGhlIGZpbGUKKyAqIExJQ0VOU0UpLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fQVRPTVNfSF9fCisjZGVmaW5lIF9fQVRPTVNfSF9fCisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlICJkZXNjcmlwdG9ycy5oIgorI2luY2x1ZGUgInByb3BlcnRpZXMuaCIKKyNpbmNsdWRlICJmb3VyY2MuaCIKKworLyogaGVscGVyIHN0b3JhZ2Ugc3RydWN0ICovCisjZGVmaW5lIEFUT01fQVJSQVkoc3RydWN0X3R5cGUpIFwKK3N0cnVjdCB7IFwKKyAgZ3VpbnQgc2l6ZTsgXAorICBndWludCBsZW47IFwKKyAgc3RydWN0X3R5cGUgKmRhdGE7IFwKK30KKworLyogc3RvcmFnZSBoZWxwZXJzICovCisKKyNkZWZpbmUgYXRvbV9hcnJheV9pbml0KGFycmF5LCByZXNlcnZlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0dfU1RNVF9TVEFSVCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGFycmF5KS0+bGVuID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGFycmF5KS0+c2l6ZSA9IHJlc2VydmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGFycmF5KS0+ZGF0YSA9IGdfbWFsbG9jIChzaXplb2YgKCooYXJyYXkpLT5kYXRhKSAqIHJlc2VydmUpOyAgICAgICAgICAgICAgIFwKK30gR19TVE1UX0VORAorCisjZGVmaW5lIGF0b21fYXJyYXlfYXBwZW5kKGFycmF5LCBlbG10LCBpbmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdfYXNzZXJ0ICgoYXJyYXkpLT5kYXRhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdfYXNzZXJ0IChpbmMgPiAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChHX1VOTElLRUxZICgoYXJyYXkpLT5sZW4gPT0gKGFycmF5KS0+c2l6ZSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGFycmF5KS0+c2l6ZSArPSBpbmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGFycmF5KS0+ZGF0YSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdfcmVhbGxvYyAoKGFycmF5KS0+ZGF0YSwgc2l6ZW9mICgqKChhcnJheSktPmRhdGEpKSAqIChhcnJheSktPnNpemUpOyBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChhcnJheSktPmRhdGFbKGFycmF5KS0+bGVuXSA9IGVsbXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChhcnJheSktPmxlbisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IEdfU1RNVF9FTkQKKworI2RlZmluZSBhdG9tX2FycmF5X2dldF9sZW4oYXJyYXkpICAgICAgICAgICAgICAgICAgKChhcnJheSktPmxlbikKKyNkZWZpbmUgYXRvbV9hcnJheV9pbmRleChhcnJheSwgaW5kZXgpICAgICAgICAgICAgICgoYXJyYXkpLT5kYXRhW2luZGV4XSkKKworI2RlZmluZSBhdG9tX2FycmF5X2NsZWFyKGFycmF5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorR19TVE1UX1NUQVJUIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoYXJyYXkpLT5zaXplID0gKGFycmF5KS0+bGVuID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnX2ZyZWUgKChhcnJheSktPmRhdGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoYXJyYXkpLT5kYXRhID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSBHX1NUTVRfRU5ECisKKy8qIGxpZ2h0LXdlaWdodCBjb250ZXh0IHRoYXQgbWF5IGluZmx1ZW5jZSBoZWFkZXIgYXRvbSB0cmVlIGNvbnN0cnVjdGlvbiAqLwordHlwZWRlZiBlbnVtIF9BdG9tc1RyZWVGbGF2b3IKK3sKKyAgQVRPTVNfVFJFRV9GTEFWT1JfTU9WLAorICBBVE9NU19UUkVFX0ZMQVZPUl9JU09NLAorICBBVE9NU19UUkVFX0ZMQVZPUl8zR1AsCisgIEFUT01TX1RSRUVfRkxBVk9SX0lTTUwKK30gQXRvbXNUcmVlRmxhdm9yOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbXNDb250ZXh0Cit7CisgIEF0b21zVHJlZUZsYXZvciBmbGF2b3I7Cit9IEF0b21zQ29udGV4dDsKKworQXRvbXNDb250ZXh0KiBhdG9tc19jb250ZXh0X25ldyAgKEF0b21zVHJlZUZsYXZvciBmbGF2b3IpOwordm9pZCAgICAgICAgICBhdG9tc19jb250ZXh0X2ZyZWUgKEF0b21zQ29udGV4dCAqY29udGV4dCk7CisKKyNkZWZpbmUgTUVUQURBVEFfREFUQV9GTEFHIDB4MAorI2RlZmluZSBNRVRBREFUQV9URVhUX0ZMQUcgMHgxCisKKy8qIGF0b20gZGVmcyBhbmQgZnVuY3Rpb25zICovCisKK3R5cGVkZWYgc3RydWN0IF9BdG9tSW5mbyBBdG9tSW5mbzsKKworLyoKKyAqIFVzZWQgZm9yIHN0b3JpbmcgdGltZSByZWxhdGVkIHZhbHVlcyBmb3Igc29tZSBhdG9tcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX1RpbWVJbmZvCit7CisgIGd1aW50NjQgY3JlYXRpb25fdGltZTsKKyAgZ3VpbnQ2NCBtb2RpZmljYXRpb25fdGltZTsKKyAgZ3VpbnQzMiB0aW1lc2NhbGU7CisgIGd1aW50NjQgZHVyYXRpb247Cit9IFRpbWVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbQoreworICBndWludDMyIHNpemU7CisgIGd1aW50MzIgdHlwZTsKKyAgZ3VpbnQ2NCBleHRlbmRlZF9zaXplOworfSBBdG9tOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbUZ1bGwKK3sKKyAgQXRvbSBoZWFkZXI7CisKKyAgZ3VpbnQ4IHZlcnNpb247CisgIGd1aW50OCBmbGFnc1szXTsKK30gQXRvbUZ1bGw7CisKKy8qCisgKiBHZW5lcmljIGV4dGVuc2lvbiBhdG9tCisgKi8KK3R5cGVkZWYgc3RydWN0IF9BdG9tRGF0YQoreworICBBdG9tIGhlYWRlcjsKKworICAvKiBub3Qgd3JpdHRlbiAqLworICBndWludDMyIGRhdGFsZW47CisKKyAgZ3VpbnQ4ICpkYXRhOworfSBBdG9tRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21VVUlECit7CisgIEF0b20gaGVhZGVyOworCisgIGd1aW50OCB1dWlkWzE2XTsKKworICAvKiBub3Qgd3JpdHRlbiAqLworICBndWludDMyIGRhdGFsZW47CisKKyAgZ3VpbnQ4ICpkYXRhOworfSBBdG9tVVVJRDsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21GVFlQCit7CisgIEF0b20gaGVhZGVyOworICBndWludDMyIG1ham9yX2JyYW5kOworICBndWludDMyIHZlcnNpb247CisgIGd1aW50MzIgKmNvbXBhdGlibGVfYnJhbmRzOworCisgIC8qIG5vdCB3cml0dGVuICovCisgIGd1aW50MzIgY29tcGF0aWJsZV9icmFuZHNfc2l6ZTsKK30gQXRvbUZUWVA7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tTVZIRAoreworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgLyogdmVyc2lvbiAwOiAzMiBiaXRzICovCisgIFRpbWVJbmZvIHRpbWVfaW5mbzsKKworICBndWludDMyIHByZWZlcmVkX3JhdGU7ICAgICAgLyogSVNPOiAweDAwMDEwMDAwICovCisgIGd1aW50MTYgdm9sdW1lOyAgICAgICAgICAgICAvKiBJU086IDB4MDEwMCAqLworICBndWludDE2IHJlc2VydmVkMzsgICAgICAgICAgLyogSVNPOiAweDAgKi8KKyAgZ3VpbnQzMiByZXNlcnZlZDRbMl07ICAgICAgIC8qIElTTzogMCwgMCAqLworICAvKiBJU086IGlkZW50aXR5IG1hdHJpeCA9CisgICAqIHsgMHgwMDAxMDAwMCwgMCwgMCwgMCwgMHgwMDAxMDAwMCwgMCwgMCwgMCwgMHg0MDAwMDAwMCB9ICovCisgIGd1aW50MzIgbWF0cml4WzldOworCisgIC8qIElTTzogYWxsIDAgKi8KKyAgZ3VpbnQzMiBwcmV2aWV3X3RpbWU7CisgIGd1aW50MzIgcHJldmlld19kdXJhdGlvbjsKKyAgZ3VpbnQzMiBwb3N0ZXJfdGltZTsKKyAgZ3VpbnQzMiBzZWxlY3Rpb25fdGltZTsKKyAgZ3VpbnQzMiBzZWxlY3Rpb25fZHVyYXRpb247CisgIGd1aW50MzIgY3VycmVudF90aW1lOworCisgIGd1aW50MzIgbmV4dF90cmFja19pZDsKK30gQXRvbU1WSEQ7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tVEtIRAoreworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgLyogdmVyc2lvbiAwOiAzMiBiaXRzICovCisgIC8qIGxpa2UgdGhlIFRpbWVJbmZvIHN0cnVjdCwgYnV0IGl0IGhhcyB0aGlzIHRyYWNrX0lEIGluc2lkZSAqLworICBndWludDY0IGNyZWF0aW9uX3RpbWU7CisgIGd1aW50NjQgbW9kaWZpY2F0aW9uX3RpbWU7CisgIGd1aW50MzIgdHJhY2tfSUQ7CisgIGd1aW50MzIgcmVzZXJ2ZWQ7CisgIGd1aW50NjQgZHVyYXRpb247CisKKyAgZ3VpbnQzMiByZXNlcnZlZDJbMl07CisgIGd1aW50MTYgbGF5ZXI7CisgIGd1aW50MTYgYWx0ZXJuYXRlX2dyb3VwOworICBndWludDE2IHZvbHVtZTsKKyAgZ3VpbnQxNiByZXNlcnZlZDM7CisKKyAgLyogSVNPOiBpZGVudGl0eSBtYXRyaXggPQorICAgKiB7IDB4MDAwMTAwMDAsIDAsIDAsIDAsIDB4MDAwMTAwMDAsIDAsIDAsIDAsIDB4NDAwMDAwMDAgfSAqLworICBndWludDMyIG1hdHJpeFs5XTsKKyAgZ3VpbnQzMiB3aWR0aDsKKyAgZ3VpbnQzMiBoZWlnaHQ7Cit9IEF0b21US0hEOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbU1ESEQKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIC8qIHZlcnNpb24gMDogMzIgYml0cyAqLworICBUaW1lSW5mbyB0aW1lX2luZm87CisKKyAgLyogSVNPOiBwYWNrZWQgSVNPLTYzOS0yL1QgbGFuZ3VhZ2UgY29kZSAoZmlyc3QgYml0IG11c3QgYmUgMCkgKi8KKyAgZ3VpbnQxNiBsYW5ndWFnZV9jb2RlOworICAvKiBJU086IDAgKi8KKyAgZ3VpbnQxNiBxdWFsaXR5OworfSBBdG9tTURIRDsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21IRExSCit7CisgIEF0b21GdWxsIGhlYWRlcjsKKworICAvKiBJU086IDAgKi8KKyAgZ3VpbnQzMiBjb21wb25lbnRfdHlwZTsKKyAgZ3VpbnQzMiBoYW5kbGVyX3R5cGU7CisgIGd1aW50MzIgbWFudWZhY3R1cmVyOworICBndWludDMyIGZsYWdzOworICBndWludDMyIGZsYWdzX21hc2s7CisgIGdjaGFyICpuYW1lOworCisgIEF0b21zVHJlZUZsYXZvciBmbGF2b3I7Cit9IEF0b21IRExSOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVZNSEQKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOyAgICAgICAgICAvKiBJU086IGZsYWdzID0gMSAqLworCisgIGd1aW50MTYgZ3JhcGhpY3NfbW9kZTsKKyAgLyogUkdCICovCisgIGd1aW50MTYgb3Bjb2xvclszXTsKK30gQXRvbVZNSEQ7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tU01IRAoreworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgZ3VpbnQxNiBiYWxhbmNlOworICBndWludDE2IHJlc2VydmVkOworfSBBdG9tU01IRDsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21ITUhECit7CisgIEF0b21GdWxsIGhlYWRlcjsKKworICBndWludDE2IG1heF9wZHVfc2l6ZTsKKyAgZ3VpbnQxNiBhdmdfcGR1X3NpemU7CisgIGd1aW50MzIgbWF4X2JpdHJhdGU7CisgIGd1aW50MzIgYXZnX2JpdHJhdGU7CisgIGd1aW50MzIgc2xpZGluZ19hdmdfYml0cmF0ZTsKK30gQXRvbUhNSEQ7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tVENNSQoreworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgZ3VpbnQxNiB0ZXh0X2ZvbnQ7CisgIGd1aW50MTYgdGV4dF9mYWNlOworICBndWludDE2IHRleHRfc2l6ZTsKKyAgZ3VpbnQxNiB0ZXh0X2NvbG9yWzNdOworICBndWludDE2IGJnX2NvbG9yWzNdOworICBnY2hhciAqZm9udF9uYW1lOworfSBBdG9tVENNSTsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21UTUNECit7CisgIEF0b20gaGVhZGVyOworCisgIEF0b21UQ01JIHRjbWk7Cit9IEF0b21UTUNEOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbUdNSU4KK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIGd1aW50MTYgZ3JhcGhpY3NfbW9kZTsKKyAgZ3VpbnQxNiBvcGNvbG9yWzNdOworICBndWludDggYmFsYW5jZTsKKyAgZ3VpbnQ4IHJlc2VydmVkOworCit9IEF0b21HTUlOOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbUdNSEQKK3sKKyAgQXRvbSBoZWFkZXI7CisKKyAgQXRvbUdNSU4gZ21pbjsKKyAgQXRvbVRNQ0QgdG1jZDsKKworfSBBdG9tR01IRDsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21VUkwKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIGdjaGFyICpsb2NhdGlvbjsKK30gQXRvbVVSTDsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21EUkVGCit7CisgIEF0b21GdWxsIGhlYWRlcjsKKworICBHTGlzdCAqZW50cmllczsKK30gQXRvbURSRUY7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tRElORgoreworICBBdG9tIGhlYWRlcjsKKworICBBdG9tRFJFRiBkcmVmOworfSBBdG9tRElORjsKKwordHlwZWRlZiBzdHJ1Y3QgX1NUVFNFbnRyeQoreworICBndWludDMyIHNhbXBsZV9jb3VudDsKKyAgZ2ludDMyIHNhbXBsZV9kZWx0YTsKK30gU1RUU0VudHJ5OworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVNUVFMKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIEFUT01fQVJSQVkgKFNUVFNFbnRyeSkgZW50cmllczsKK30gQXRvbVNUVFM7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tU1RTUworeworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgQVRPTV9BUlJBWSAoZ3VpbnQzMikgZW50cmllczsKK30gQXRvbVNUU1M7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tRVNEUworeworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgRVNEZXNjcmlwdG9yIGVzOworfSBBdG9tRVNEUzsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21GUk1BCit7CisgIEF0b20gaGVhZGVyOworCisgIGd1aW50MzIgbWVkaWFfdHlwZTsKK30gQXRvbUZSTUE7CisKK3R5cGVkZWYgZW51bSBfU2FtcGxlRW50cnlLaW5kCit7CisgIFVOS05PV04sCisgIEFVRElPLAorICBWSURFTywKKyAgU1VCVElUTEUsCisgIFRJTUVDT0RFCit9IFNhbXBsZUVudHJ5S2luZDsKKwordHlwZWRlZiBzdHJ1Y3QgX1NhbXBsZVRhYmxlRW50cnkKK3sKKyAgQXRvbSBoZWFkZXI7CisKKyAgZ3VpbnQ4IHJlc2VydmVkWzZdOworICBndWludDE2IGRhdGFfcmVmZXJlbmNlX2luZGV4OworCisgIC8qIHR5cGUgb2YgZW50cnkgKi8KKyAgU2FtcGxlRW50cnlLaW5kIGtpbmQ7Cit9IFNhbXBsZVRhYmxlRW50cnk7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tSGludFNhbXBsZUVudHJ5Cit7CisgIFNhbXBsZVRhYmxlRW50cnkgc2U7CisgIGd1aW50MzIgc2l6ZTsKKyAgZ3VpbnQ4ICpkYXRhOworfSBBdG9tSGludFNhbXBsZUVudHJ5OworCit0eXBlZGVmIHN0cnVjdCBfU2FtcGxlVGFibGVFbnRyeU1QNFYKK3sKKyAgU2FtcGxlVGFibGVFbnRyeSBzZTsKKworICBndWludDE2IHZlcnNpb247CisgIGd1aW50MTYgcmV2aXNpb25fbGV2ZWw7CisKKyAgZ3VpbnQzMiB2ZW5kb3I7ICAgICAgICAgICAgICAgICAvKiBmb3VyY2MgY29kZSAqLworICBndWludDMyIHRlbXBvcmFsX3F1YWxpdHk7CisgIGd1aW50MzIgc3BhdGlhbF9xdWFsaXR5OworCisgIGd1aW50MTYgd2lkdGg7CisgIGd1aW50MTYgaGVpZ2h0OworCisgIGd1aW50MzIgaG9yaXpvbnRhbF9yZXNvbHV0aW9uOworICBndWludDMyIHZlcnRpY2FsX3Jlc29sdXRpb247CisgIGd1aW50MzIgZGF0YXNpemU7CisKKyAgZ3VpbnQxNiBmcmFtZV9jb3VudDsgICAgICAgICAgICAvKiB1c3VhbGx5IDEgKi8KKworICBndWludDggY29tcHJlc3NvclszMl07ICAgICAgICAgLyogcGFzY2FsIHN0cmluZywgaS5lLiBmaXJzdCBieXRlID0gbGVuZ3RoICovCisKKyAgZ3VpbnQxNiBkZXB0aDsKKyAgZ3VpbnQxNiBjb2xvcl90YWJsZV9pZDsKKworICAvKiAob3B0aW9uYWwpIGxpc3Qgb2YgQXRvbUluZm8gKi8KKyAgR0xpc3QgKmV4dGVuc2lvbl9hdG9tczsKK30gU2FtcGxlVGFibGVFbnRyeU1QNFY7CisKK3R5cGVkZWYgc3RydWN0IF9TYW1wbGVUYWJsZUVudHJ5TVA0QQoreworICBTYW1wbGVUYWJsZUVudHJ5IHNlOworCisgIGd1aW50MTYgdmVyc2lvbjsKKyAgZ3VpbnQxNiByZXZpc2lvbl9sZXZlbDsKKyAgZ3VpbnQzMiB2ZW5kb3I7CisKKyAgZ3VpbnQxNiBjaGFubmVsczsKKyAgZ3VpbnQxNiBzYW1wbGVfc2l6ZTsKKyAgZ3VpbnQxNiBjb21wcmVzc2lvbl9pZDsKKyAgZ3VpbnQxNiBwYWNrZXRfc2l6ZTsKKworICBndWludDMyIHNhbXBsZV9yYXRlOyAgICAgICAgICAgIC8qIGZpeGVkIHBvaW50IDE2LjE2ICovCisKKyAgZ3VpbnQzMiBzYW1wbGVzX3Blcl9wYWNrZXQ7CisgIGd1aW50MzIgYnl0ZXNfcGVyX3BhY2tldDsKKyAgZ3VpbnQzMiBieXRlc19wZXJfZnJhbWU7CisgIGd1aW50MzIgYnl0ZXNfcGVyX3NhbXBsZTsKKworICAvKiAob3B0aW9uYWwpIGxpc3Qgb2YgQXRvbUluZm8gKi8KKyAgR0xpc3QgKmV4dGVuc2lvbl9hdG9tczsKK30gU2FtcGxlVGFibGVFbnRyeU1QNEE7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tTkFNRQoreworICBBdG9tIGhlYWRlcjsKKworICBndWludDggbGFuZ3VhZ2VfY29kZTsKKyAgZ2NoYXIgKm5hbWU7Cit9IEF0b21OQU1FOworCit0eXBlZGVmIHN0cnVjdCBfU2FtcGxlVGFibGVFbnRyeVRNQ0QKK3sKKyAgU2FtcGxlVGFibGVFbnRyeSBzZTsKKworICBndWludDMyIHRjX2ZsYWdzOworICBndWludDMyIHRpbWVzY2FsZTsKKyAgZ3VpbnQzMiBmcmFtZV9kdXJhdGlvbjsKKyAgZ3VpbnQ4IG5fZnJhbWVzOworCisgIEF0b21OQU1FIG5hbWU7CisKK30gU2FtcGxlVGFibGVFbnRyeVRNQ0Q7CisKK3R5cGVkZWYgc3RydWN0IF9TYW1wbGVUYWJsZUVudHJ5VFgzRworeworICBTYW1wbGVUYWJsZUVudHJ5IHNlOworCisgIGd1aW50MzIgZGlzcGxheV9mbGFnczsKKyAgZ3VpbnQ2NCBkZWZhdWx0X3RleHRfYm94OworICBndWludDE2IGZvbnRfaWQ7CisgIGd1aW50OCAgZm9udF9mYWNlOyAvKiBib2xkPTB4MSwgaXRhbGljPTB4MiwgdW5kZXJsaW5lPTB4NCAqLworICBndWludDggIGZvbnRfc2l6ZTsgLyogc2hvdWxkIGFsd2F5cyBiZSAwLjA1IG11bHRpcGxpZWQgYnkgdGhlIHZpZGVvIHRyYWNrIGhlYWRlciBoZWlnaHQgKi8KKyAgZ3VpbnQzMiBmb3JlZ3JvdW5kX2NvbG9yX3JnYmE7CisKK30gU2FtcGxlVGFibGVFbnRyeVRYM0c7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tU1RTRAoreworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgZ3VpbnQgbl9lbnRyaWVzOworICAvKiBsaXN0IG9mIHN1YmNsYXNzZXMgb2YgU2FtcGxlVGFibGVFbnRyeSAqLworICBHTGlzdCAqZW50cmllczsKK30gQXRvbVNUU0Q7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tU1RTWgoreworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgZ3VpbnQzMiBzYW1wbGVfc2l6ZTsKKworICAvKiBuZWVkIHRoZSBzaXplIGhlcmUgYmVjYXVzZSB3aGVuIHNhbXBsZV9zaXplIGlzIGNvbnN0YW50LAorICAgKiB0aGUgbGlzdCBpcyBlbXB0eSAqLworICBndWludDMyIHRhYmxlX3NpemU7CisgIEFUT01fQVJSQVkgKGd1aW50MzIpIGVudHJpZXM7Cit9IEF0b21TVFNaOworCit0eXBlZGVmIHN0cnVjdCBfU1RTQ0VudHJ5Cit7CisgIGd1aW50MzIgZmlyc3RfY2h1bms7CisgIGd1aW50MzIgc2FtcGxlc19wZXJfY2h1bms7CisgIGd1aW50MzIgc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4OworfSBTVFNDRW50cnk7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tU1RTQworeworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgQVRPTV9BUlJBWSAoU1RTQ0VudHJ5KSBlbnRyaWVzOworfSBBdG9tU1RTQzsKKworLyogRklYTUU6IHRoaXMgY2FuIHN1cHBvcnQgbXVsdGlwbGUgdHJhY2tzICovCit0eXBlZGVmIHN0cnVjdCBfQXRvbVRSRUYKK3sKKyAgQXRvbSBoZWFkZXI7CisKKyAgZ3VpbnQzMiByZWZ0eXBlOworICBBVE9NX0FSUkFZIChndWludDMyKSBlbnRyaWVzOworfSBBdG9tVFJFRjsKKworLyoKKyAqIHVzZWQgZm9yIGJvdGggU1RDTyBhbmQgQ082NAorICogaWYgdXNlZCBhcyBTVENPLCBlbnRyaWVzIHNob3VsZCBiZSB0cnVuY2F0ZWQgdG8gdXNlIG9ubHkgMzJiaXRzCisgKi8KK3R5cGVkZWYgc3RydWN0IF9BdG9tU1RDTzY0Cit7CisgIEF0b21GdWxsIGhlYWRlcjsKKyAgLyogR2xvYmFsIG9mZnNldCB0byBhZGQgdG8gZW50cmllcyB3aGVuIHNlcmlhbGlzaW5nICovCisgIGd1aW50MzIgY2h1bmtfb2Zmc2V0OworICBBVE9NX0FSUkFZIChndWludDY0KSBlbnRyaWVzOworfSBBdG9tU1RDTzY0OworCit0eXBlZGVmIHN0cnVjdCBfQ1RUU0VudHJ5Cit7CisgIGd1aW50MzIgc2FtcGxlY291bnQ7CisgIGd1aW50MzIgc2FtcGxlb2Zmc2V0OworfSBDVFRTRW50cnk7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tQ1RUUworeworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgLyogYWxzbyBlbnRyeSBjb3VudCBoZXJlICovCisgIEFUT01fQVJSQVkgKENUVFNFbnRyeSkgZW50cmllczsKKyAgZ2Jvb2xlYW4gZG9fcHRzOworfSBBdG9tQ1RUUzsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21TVk1JCit7CisgIEF0b21GdWxsIGhlYWRlcjsKKworICBndWludDggc3RlcmVvc2NvcGljX2NvbXBvc2l0aW9uX3R5cGU7CisgIGdib29sZWFuIGlzX2xlZnRfZmlyc3Q7Cit9IEF0b21TVk1JOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVNUQkwKK3sKKyAgQXRvbSBoZWFkZXI7CisKKyAgQXRvbVNUU0Qgc3RzZDsKKyAgQXRvbVNUVFMgc3R0czsKKyAgQXRvbVNUU1Mgc3RzczsKKyAgQXRvbVNUU0Mgc3RzYzsKKyAgQXRvbVNUU1ogc3RzejsKKyAgLyogTlVMTCBpZiBub3QgcHJlc2VudCAqLworICBBdG9tQ1RUUyAqY3R0czsKKyAgLyogTlVMTCBpZiBub3QgcHJlc2VudCAqLworICBBdG9tU1ZNSSAqc3ZtaTsKKworICBBdG9tU1RDTzY0IHN0Y282NDsKK30gQXRvbVNUQkw7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tTUlORgoreworICBBdG9tIGhlYWRlcjsKKworICAvKiBvbmx5IChleGFjdGx5KSBvbmUgb2YgdGhvc2UgbXVzdCBiZSBwcmVzZW50ICovCisgIEF0b21WTUhEICp2bWhkOworICBBdG9tU01IRCAqc21oZDsKKyAgQXRvbUhNSEQgKmhtaGQ7CisgIEF0b21HTUhEICpnbWhkOworCisgIEF0b21IRExSICpoZGxyOworICBBdG9tRElORiBkaW5mOworICBBdG9tU1RCTCBzdGJsOworfSBBdG9tTUlORjsKKwordHlwZWRlZiBzdHJ1Y3QgX0VkaXRMaXN0RW50cnkKK3sKKyAgLyogZHVyYXRpb24gaW4gbW92aWUncyB0aW1lc2NhbGUgKi8KKyAgZ3VpbnQzMiBkdXJhdGlvbjsKKyAgLyogc3RhcnQgdGltZSBpbiBtZWRpYSdzIHRpbWVzY2FsZSwgLTEgZm9yIGVtcHR5ICovCisgIGd1aW50MzIgbWVkaWFfdGltZTsKKyAgZ3VpbnQzMiBtZWRpYV9yYXRlOyAgLyogZml4ZWQgcG9pbnQgMzIgYml0ICovCit9IEVkaXRMaXN0RW50cnk7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tRUxTVAoreworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgLyogbnVtYmVyIG9mIGVudHJpZXMgaXMgaW1wbGljaXQgKi8KKyAgR1NMaXN0ICplbnRyaWVzOworfSBBdG9tRUxTVDsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21FRFRTCit7CisgIEF0b20gaGVhZGVyOworICBBdG9tRUxTVCBlbHN0OworfSBBdG9tRURUUzsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21NRElBCit7CisgIEF0b20gaGVhZGVyOworCisgIEF0b21NREhEIG1kaGQ7CisgIEF0b21IRExSIGhkbHI7CisgIEF0b21NSU5GIG1pbmY7Cit9IEF0b21NRElBOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbUlMU1QKK3sKKyAgQXRvbSBoZWFkZXI7CisKKyAgLyogbGlzdCBvZiBBdG9tSW5mbyAqLworICBHTGlzdCogZW50cmllczsKK30gQXRvbUlMU1Q7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tVGFnRGF0YQoreworICBBdG9tRnVsbCBoZWFkZXI7CisgIGd1aW50MzIgcmVzZXJ2ZWQ7CisKKyAgZ3VpbnQzMiBkYXRhbGVuOworICBndWludDgqIGRhdGE7Cit9IEF0b21UYWdEYXRhOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVRhZworeworICBBdG9tIGhlYWRlcjsKKworICBBdG9tVGFnRGF0YSBkYXRhOworfSBBdG9tVGFnOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbU1FVEEKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworICBBdG9tSERMUiBoZGxyOworICBBdG9tSUxTVCAqaWxzdDsKK30gQXRvbU1FVEE7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tVURUQQoreworICBBdG9tIGhlYWRlcjsKKworICAvKiBsaXN0IG9mIEF0b21JbmZvICovCisgIEdMaXN0KiBlbnRyaWVzOworICAvKiBvciBsaXN0IGlzIGZ1cnRoZXIgZG93biAqLworICBBdG9tTUVUQSAqbWV0YTsKKworICBBdG9tc0NvbnRleHQgKmNvbnRleHQ7Cit9IEF0b21VRFRBOworCitlbnVtIFRyRmxhZ3MKK3sKKyAgVFJfREFUQV9PRkZTRVQgICAgICAgICAgICAgID0gMHgwMSwgICAgIC8qIGRhdGEtb2Zmc2V0LXByZXNlbnQgKi8KKyAgVFJfRklSU1RfU0FNUExFX0ZMQUdTICAgICAgID0gMHgwNCwgICAgIC8qIGZpcnN0LXNhbXBsZS1mbGFncy1wcmVzZW50ICovCisgIFRSX1NBTVBMRV9EVVJBVElPTiAgICAgICAgICA9IDB4MDEwMCwgICAvKiBzYW1wbGUtZHVyYXRpb24tcHJlc2VudCAqLworICBUUl9TQU1QTEVfU0laRSAgICAgICAgICAgICAgPSAweDAyMDAsICAgLyogc2FtcGxlLXNpemUtcHJlc2VudCAqLworICBUUl9TQU1QTEVfRkxBR1MgICAgICAgICAgICAgPSAweDA0MDAsICAgLyogc2FtcGxlLWZsYWdzLXByZXNlbnQgKi8KKyAgVFJfQ09NUE9TSVRJT05fVElNRV9PRkZTRVRTID0gMHgwODAwICAgIC8qIHNhbXBsZS1jb21wb3NpdGlvbi10aW1lLW9mZnNldHMtcHJlc2VudHMgKi8KK307CisKK2VudW0gVGZGbGFncworeworICBURl9CQVNFX0RBVEFfT0ZGU0VUICAgICAgICAgPSAweDAxLCAgICAgLyogYmFzZS1kYXRhLW9mZnNldC1wcmVzZW50ICovCisgIFRGX1NBTVBMRV9ERVNDUklQVElPTl9JTkRFWCA9IDB4MDIsICAgICAvKiBzYW1wbGUtZGVzY3JpcHRpb24taW5kZXgtcHJlc2VudCAqLworICBURl9ERUZBVUxUX1NBTVBMRV9EVVJBVElPTiAgPSAweDA4LCAgICAgLyogZGVmYXVsdC1zYW1wbGUtZHVyYXRpb24tcHJlc2VudCAqLworICBURl9ERUZBVUxUX1NBTVBMRV9TSVpFICAgICAgPSAweDAxMCwgICAgLyogZGVmYXVsdC1zYW1wbGUtc2l6ZS1wcmVzZW50ICovCisgIFRGX0RFRkFVTFRfU0FNUExFX0ZMQUdTICAgICA9IDB4MDIwLCAgICAvKiBkZWZhdWx0LXNhbXBsZS1mbGFncy1wcmVzZW50ICovCisgIFRGX0RVUkFUSU9OX0lTX0VNUFRZICAgICAgICA9IDB4MDEwMDAwLCAvKiBzYW1wbGUtY29tcG9zaXRpb24tdGltZS1vZmZzZXRzLXByZXNlbnRzICovCisgIFRGX0RFRkFVTFRfQkFTRV9JU19NT09GICAgICA9IDB4MDIwMDAwICAvKiBkZWZhdWx0LWJhc2UtaXMtbW9vZiAqLworfTsKKworLyogVGltZWNvZGUgZmxhZ3MgKi8KK2VudW0gVGNGbGFncworeworICBUQ19EUk9QX0ZSQU1FID0gMHgwMDAxLCAgIC8qIERyb3AtZnJhbWUgdGltZWNvZGUgKi8KKyAgVENfMjRIX01BWCA9IDB4MDAwMiwgICAgICAvKiBXaGV0aGVyIHRoZSB0aW1lY29kZSB3cmFwcyBhZnRlciAyNCBob3VycyAqLworICBUQ19ORUdBVElWRV9PSyA9IDB4MDAwNCwgIC8qIFdoZXRoZXIgbmVnYXRpdmUgdGltZSB2YWx1ZXMgYXJlIE9LICovCisgIFRDX0NPVU5URVIgPSAweDAwMDggICAgICAgLyogV2hldGhlciB0aGUgdGltZSB2YWx1ZSBjb3JyZXNwb25kcyB0byBhIHRhcGUgY291bnRlciB2YWx1ZSAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21UUkFLCit7CisgIEF0b20gaGVhZGVyOworCisgIEF0b21US0hEIHRraGQ7CisgIEF0b21JbmZvICp0YXB0OworICBBdG9tRURUUyAqZWR0czsKKyAgQXRvbU1ESUEgbWRpYTsKKyAgQXRvbVVEVEEgdWR0YTsKKyAgQXRvbVRSRUYgKnRyZWY7CisKKyAgLyogc29tZSBoZWxwZXIgaW5mbyBmb3Igc3RydWN0dXJhbCBjb25mb3JtaXR5IGNoZWNrcyAqLworICBnYm9vbGVhbiBpc192aWRlbzsKKyAgZ2Jvb2xlYW4gaXNfaDI2NDsKKworICBBdG9tc0NvbnRleHQgKmNvbnRleHQ7Cit9IEF0b21UUkFLOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVRSRVgKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIGd1aW50MzIgdHJhY2tfSUQ7CisgIGd1aW50MzIgZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXg7CisgIGd1aW50MzIgZGVmYXVsdF9zYW1wbGVfZHVyYXRpb247CisgIGd1aW50MzIgZGVmYXVsdF9zYW1wbGVfc2l6ZTsKKyAgZ3VpbnQzMiBkZWZhdWx0X3NhbXBsZV9mbGFnczsKK30gQXRvbVRSRVg7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tTUVIRAoreworICBBdG9tRnVsbCBoZWFkZXI7CisKKyAgZ3VpbnQ2NCBmcmFnbWVudF9kdXJhdGlvbjsKK30gQXRvbU1FSEQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21NVkVYCit7CisgIEF0b20gaGVhZGVyOworCisgIEF0b21NRUhEIG1laGQ7CisKKyAgLyogbGlzdCBvZiBBdG9tVFJFWCAqLworICBHTGlzdCAqdHJleHM7Cit9IEF0b21NVkVYOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbU1GSEQKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIGd1aW50MzIgc2VxdWVuY2VfbnVtYmVyOworfSBBdG9tTUZIRDsKKwordHlwZWRlZiBzdHJ1Y3QgX0F0b21URkhECit7CisgIEF0b21GdWxsIGhlYWRlcjsKKworICBndWludDMyIHRyYWNrX0lEOworICBndWludDY0IGJhc2VfZGF0YV9vZmZzZXQ7CisgIGd1aW50MzIgc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4OworICBndWludDMyIGRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uOworICBndWludDMyIGRlZmF1bHRfc2FtcGxlX3NpemU7CisgIGd1aW50MzIgZGVmYXVsdF9zYW1wbGVfZmxhZ3M7Cit9IEF0b21URkhEOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVRGRFQKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIGd1aW50NjQgYmFzZV9tZWRpYV9kZWNvZGVfdGltZTsKK30gQXRvbVRGRFQ7CisKK3R5cGVkZWYgc3RydWN0IF9UUlVOU2FtcGxlRW50cnkKK3sKKyAgZ3VpbnQzMiBzYW1wbGVfZHVyYXRpb247CisgIGd1aW50MzIgc2FtcGxlX3NpemU7CisgIGd1aW50MzIgc2FtcGxlX2ZsYWdzOworICBndWludDMyIHNhbXBsZV9jb21wb3NpdGlvbl90aW1lX29mZnNldDsKK30gVFJVTlNhbXBsZUVudHJ5OworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVRSVU4KK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIGd1aW50MzIgc2FtcGxlX2NvdW50OworICBnaW50MzIgZGF0YV9vZmZzZXQ7CisgIGd1aW50MzIgZmlyc3Rfc2FtcGxlX2ZsYWdzOworCisgIC8qIGFycmF5IG9mIGZpZWxkcyAqLworICBBVE9NX0FSUkFZIChUUlVOU2FtcGxlRW50cnkpIGVudHJpZXM7Cit9IEF0b21UUlVOOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVNEVFAKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIC8qIG5vdCBzZXJpYWxpemVkICovCisgIGd1aW50MzIgc2FtcGxlX2NvdW50OworCisgIC8qIGFycmF5IG9mIGZpZWxkcyAqLworICBBVE9NX0FSUkFZIChndWludDgpIGVudHJpZXM7Cit9IEF0b21TRFRQOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVRSQUYKK3sKKyAgQXRvbSBoZWFkZXI7CisKKyAgQXRvbVRGSEQgdGZoZDsKKworICBBdG9tVEZEVCB0ZmR0OworCisgIC8qIGxpc3Qgb2YgQXRvbVRSVU4gKi8KKyAgR0xpc3QgKnRydW5zOworICAvKiBsaXN0IG9mIEF0b21TRFRQICovCisgIEdMaXN0ICpzZHRwczsKK30gQXRvbVRSQUY7CisKK3R5cGVkZWYgc3RydWN0IF9BdG9tTU9PRgoreworICBBdG9tIGhlYWRlcjsKKworICBBdG9tTUZIRCBtZmhkOworCisgIC8qIGxpc3Qgb2YgQXRvbVRSQUYgKi8KKyAgR0xpc3QgKnRyYWZzOworfSBBdG9tTU9PRjsKKworCit0eXBlZGVmIHN0cnVjdCBfQXRvbU1PT1YKK3sKKyAgLyogc3R5bGUgKi8KKyAgQXRvbXNDb250ZXh0IGNvbnRleHQ7CisKKyAgQXRvbSBoZWFkZXI7CisKKyAgQXRvbU1WSEQgbXZoZDsKKyAgQXRvbU1WRVggbXZleDsKKworICAvKiBsaXN0IG9mIEF0b21UUkFLICovCisgIEdMaXN0ICp0cmFrczsKKyAgQXRvbVVEVEEgdWR0YTsKKworICBnYm9vbGVhbiBmcmFnbWVudGVkOworICBndWludDMyIGNodW5rc19vZmZzZXQ7Cit9IEF0b21NT09WOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVdBVkUKK3sKKyAgQXRvbSBoZWFkZXI7CisKKyAgLyogbGlzdCBvZiBBdG9tSW5mbyAqLworICBHTGlzdCAqZXh0ZW5zaW9uX2F0b21zOworfSBBdG9tV0FWRTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RGUkFFbnRyeQoreworICBndWludDY0IHRpbWU7CisgIGd1aW50NjQgbW9vZl9vZmZzZXQ7CisgIGd1aW50MzIgdHJhZl9udW1iZXI7CisgIGd1aW50MzIgdHJ1bl9udW1iZXI7CisgIGd1aW50MzIgc2FtcGxlX251bWJlcjsKK30gVEZSQUVudHJ5OworCit0eXBlZGVmIHN0cnVjdCBfQXRvbVRGUkEKK3sKKyAgQXRvbUZ1bGwgaGVhZGVyOworCisgIGd1aW50MzIgdHJhY2tfSUQ7CisgIGd1aW50MzIgbGVuZ3RoczsKKyAgLyogYXJyYXkgb2YgZW50cmllcyAqLworICBBVE9NX0FSUkFZIChURlJBRW50cnkpIGVudHJpZXM7Cit9IEF0b21URlJBOworCit0eXBlZGVmIHN0cnVjdCBfQXRvbU1GUkEKK3sKKyAgQXRvbSBoZWFkZXI7CisKKyAgLyogbGlzdCBvZiB0ZnJhICovCisgIEdMaXN0ICp0ZnJhczsKK30gQXRvbU1GUkE7CisKKy8qCisgKiBGdW5jdGlvbiB0byBzZXJpYWxpemUgYW4gYXRvbQorICovCit0eXBlZGVmIGd1aW50NjQgKCpBdG9tQ29weURhdGFGdW5jKSAoQXRvbSAqYXRvbSwgZ3VpbnQ4ICoqYnVmZmVyLCBndWludDY0ICpzaXplLCBndWludDY0ICpvZmZzZXQpOworCisvKgorICogUmVsZWFzZXMgbWVtb3J5IGFsbG9jYXRlZCBieSBhbiBhdG9tCisgKi8KK3R5cGVkZWYgZ3VpbnQ2NCAoKkF0b21GcmVlRnVuYykgKEF0b20gKmF0b20pOworCisvKgorICogU29tZSBhdG9tcyBtaWdodCBoYXZlIG1hbnkgb3B0aW9uYWwgZGlmZmVyZW50IGtpbmRzIG9mIGNoaWxkIGF0b21zLCBzbyB0aGlzCisgKiBpcyB1c2VmdWwgZm9yIGVuYWJsaW5nIGdlbmVyaWMgaGFuZGxpbmcgb2YgYW55IGF0b20uCisgKiBBbGwgd2UgbmVlZCBhcmUgdGhlIHR3byBmdW5jdGlvbnMgKGNvcHlpbmcgaXQgdG8gYW4gYXJyYXkKKyAqIGZvciBzZXJpYWxpemF0aW9uIGFuZCB0aGUgbWVtb3J5IHJlbGVhc2luZyBmdW5jdGlvbikuCisgKi8KK3N0cnVjdCBfQXRvbUluZm8KK3sKKyAgQXRvbSAqYXRvbTsKKyAgQXRvbUNvcHlEYXRhRnVuYyBjb3B5X2RhdGFfZnVuYzsKKyAgQXRvbUZyZWVGdW5jIGZyZWVfZnVuYzsKK307CisKK2d1aW50NjQgICAgYXRvbXNfZ2V0X2N1cnJlbnRfcXRfdGltZSAgICh2b2lkKTsKKworZ3VpbnQ2NCAgICBhdG9tX2NvcHlfZGF0YSAgICAgICAgICAgICAgKEF0b20gKmF0b20sIGd1aW50OCAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0ICpzaXplLCBndWludDY0KiBvZmZzZXQpOworCitBdG9tRlRZUCogIGF0b21fZnR5cF9uZXcgICAgICAgICAgICAgICAoQXRvbXNDb250ZXh0ICpjb250ZXh0LCBndWludDMyIG1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgdmVyc2lvbiwgR0xpc3QgKmJyYW5kcyk7CitndWludDY0ICAgIGF0b21fZnR5cF9jb3B5X2RhdGEgICAgICAgICAoQXRvbUZUWVAgKmZ0eXAsIGd1aW50OCAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0ICpzaXplLCBndWludDY0ICpvZmZzZXQpOwordm9pZCAgICAgICBhdG9tX2Z0eXBfZnJlZSAgICAgICAgICAgICAgKEF0b21GVFlQICpmdHlwKTsKKworQXRvbVRSQUsqICBhdG9tX3RyYWtfbmV3ICAgICAgICAgICAgICAgKEF0b21zQ29udGV4dCAqY29udGV4dCk7Cit2b2lkICAgICAgIGF0b21fdHJha19hZGRfc2FtcGxlcyAgICAgICAoQXRvbVRSQUsgKiB0cmFrLCBndWludDMyIG5zYW1wbGVzLCBndWludDMyIGRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgc2l6ZSwgZ3VpbnQ2NCBjaHVua19vZmZzZXQsIGdib29sZWFuIHN5bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDY0IHB0c19vZmZzZXQpOwordm9pZCAgICAgICBhdG9tX3RyYWtfc2V0X2Vsc3RfZW50cnkgICAgKEF0b21UUkFLICogdHJhaywgZ2ludCBpbmRleCwgZ3VpbnQzMiBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIG1lZGlhX3RpbWUsIGd1aW50MzIgcmF0ZSk7Cit2b2lkICAgICAgIGF0b21fdHJha19lZHRzX2NsZWFyICAgICAgICAoQXRvbVRSQUsgKiB0cmFrKTsKK2d1aW50MzIgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgICAgIChBdG9tVFJBSyAqdHJhayk7CitndWludDMyICAgIGF0b21fdHJha19nZXRfaWQgICAgICAgICAgICAoQXRvbVRSQUsgKiB0cmFrKTsKK3ZvaWQgICAgICAgYXRvbV90cmFrX3NldF9jb25zdGFudF9zaXplX3NhbXBsZXMgKEF0b21UUkFLICogdHJhaywgZ3VpbnQzMiBzYW1wbGVfc2l6ZSk7Cit2b2lkICAgICAgIGF0b21fc3RibF9hZGRfc2FtcGxlcyAgICAgICAoQXRvbVNUQkwgKiBzdGJsLCBndWludDMyIG5zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgZGVsdGEsIGd1aW50MzIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0IGNodW5rX29mZnNldCwgZ2Jvb2xlYW4gc3luYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50NjQgcHRzX29mZnNldCk7Cit2b2lkICAgICAgIGF0b21fc3RzY19hZGRfbmV3X2VudHJ5ICAgICAoQXRvbVNUU0MgKiBzdHNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgZmlyc3RfY2h1bmssIGd1aW50MzIgbnNhbXBsZXMpOworCitBdG9tTU9PViogIGF0b21fbW9vdl9uZXcgICAgICAgICAgICAgICAoQXRvbXNDb250ZXh0ICpjb250ZXh0KTsKK3ZvaWQgICAgICAgYXRvbV9tb292X2ZyZWUgICAgICAgICAgICAgIChBdG9tTU9PViAqbW9vdik7CitndWludDY0ICAgIGF0b21fbW9vdl9jb3B5X2RhdGEgICAgICAgICAoQXRvbU1PT1YgKmF0b20sIGd1aW50OCAqKmJ1ZmZlciwgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCogb2Zmc2V0KTsKK3ZvaWQgICAgICAgYXRvbV9tb292X3VwZGF0ZV90aW1lc2NhbGUgIChBdG9tTU9PViAqbW9vdiwgZ3VpbnQzMiB0aW1lc2NhbGUpOwordm9pZCAgICAgICBhdG9tX21vb3ZfdXBkYXRlX2R1cmF0aW9uICAgKEF0b21NT09WICptb292KTsKK3ZvaWQgICAgICAgYXRvbV9tb292X3NldF9mcmFnbWVudGVkICAgIChBdG9tTU9PViAqbW9vdiwgZ2Jvb2xlYW4gZnJhZ21lbnRlZCk7Cit2b2lkICAgICAgIGF0b21fbW9vdl9jaHVua3Nfc2V0X29mZnNldCAoQXRvbU1PT1YgKm1vb3YsIGd1aW50MzIgb2Zmc2V0KTsKK3ZvaWQgICAgICAgYXRvbV9tb292X2FkZF90cmFrICAgICAgICAgIChBdG9tTU9PViAqbW9vdiwgQXRvbVRSQUsgKnRyYWspOworZ3VpbnQgICAgICBhdG9tX21vb3ZfZ2V0X3RyYWtfY291bnQgICAgKEF0b21NT09WICptb292KTsKKworZ3VpbnQgICAgICBhdG9tX2ZyYW1lcmF0ZV90b190aW1lc2NhbGUgKGdpbnQgZnBzX24sIGdpbnQgZnBzX2QpOworCitndWludDY0ICAgIGF0b21fbXZoZF9jb3B5X2RhdGEgICAgICAgICAoQXRvbU1WSEQgKiBhdG9tLCBndWludDggKiogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50NjQgKiBzaXplLCBndWludDY0ICogb2Zmc2V0KTsKK3ZvaWQgICAgICAgYXRvbV9zdGNvNjRfY2h1bmtzX3NldF9vZmZzZXQgKEF0b21TVENPNjQgKiBzdGNvNjQsIGd1aW50MzIgb2Zmc2V0KTsKK2d1aW50NjQgICAgYXRvbV90cmFrX2NvcHlfZGF0YSAgICAgICAgIChBdG9tVFJBSyAqIGF0b20sIGd1aW50OCAqKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCAqIHNpemUsIGd1aW50NjQgKiBvZmZzZXQpOwordm9pZCAgICAgICBhdG9tX3N0YmxfY2xlYXIgICAgICAgICAgICAgKEF0b21TVEJMICogc3RibCk7Cit2b2lkICAgICAgIGF0b21fc3RibF9pbml0ICAgICAgICAgICAgICAoQXRvbVNUQkwgKiBzdGJsKTsKK2d1aW50NjQgICAgYXRvbV9zdHNzX2NvcHlfZGF0YSAgICAgICAgIChBdG9tU1RTUyAqYXRvbSwgZ3VpbnQ4ICoqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50NjQgKnNpemUsIGd1aW50NjQqIG9mZnNldCk7CitndWludDY0ICAgIGF0b21fc3R0c19jb3B5X2RhdGEgICAgICAgICAoQXRvbVNUVFMgKmF0b20sIGd1aW50OCAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0ICpzaXplLCBndWludDY0KiBvZmZzZXQpOworZ3VpbnQ2NCAgICBhdG9tX3N0c2NfY29weV9kYXRhICAgICAgICAgKEF0b21TVFNDICphdG9tLCBndWludDggKipidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCogb2Zmc2V0KTsKK2d1aW50NjQgICAgYXRvbV9zdHN6X2NvcHlfZGF0YSAgICAgICAgIChBdG9tU1RTWiAqYXRvbSwgZ3VpbnQ4ICoqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50NjQgKnNpemUsIGd1aW50NjQqIG9mZnNldCk7CitndWludDY0ICAgIGF0b21fY3R0c19jb3B5X2RhdGEgICAgICAgICAoQXRvbUNUVFMgKmF0b20sIGd1aW50OCAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0ICpzaXplLCBndWludDY0KiBvZmZzZXQpOworZ3VpbnQ2NCAgICBhdG9tX3N2bWlfY29weV9kYXRhICAgICAgICAgKEF0b21TVk1JICphdG9tLCBndWludDggKipidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCogb2Zmc2V0KTsKK0F0b21TVk1JICogYXRvbV9zdm1pX25ldyAoZ3VpbnQ4IHN0ZXJlb3Njb3BpY19jb21wb3NpdGlvbl90eXBlLCBnYm9vbGVhbiBpc19sZWZ0X2ZpcnN0KTsKK2d1aW50NjQgICAgYXRvbV9zdGNvNjRfY29weV9kYXRhICAgICAgIChBdG9tU1RDTzY0ICphdG9tLCBndWludDggKipidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCogb2Zmc2V0KTsKK0F0b21NT09GKiAgYXRvbV9tb29mX25ldyAgICAgICAgICAgICAgIChBdG9tc0NvbnRleHQgKmNvbnRleHQsIGd1aW50MzIgc2VxdWVuY2VfbnVtYmVyKTsKK3ZvaWQgICAgICAgYXRvbV9tb29mX2ZyZWUgICAgICAgICAgICAgIChBdG9tTU9PRiAqbW9vZik7CitndWludDY0ICAgIGF0b21fbW9vZl9jb3B5X2RhdGEgICAgICAgICAoQXRvbU1PT0YgKm1vb2YsIGd1aW50OCAqKmJ1ZmZlciwgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCogb2Zmc2V0KTsKK0F0b21UUkFGICogYXRvbV90cmFmX25ldyAgICAgICAgICAgICAgIChBdG9tc0NvbnRleHQgKiBjb250ZXh0LCBndWludDMyIHRyYWNrX0lEKTsKK3ZvaWQgICAgICAgYXRvbV90cmFmX2ZyZWUgICAgICAgICAgICAgIChBdG9tVFJBRiAqIHRyYWYpOwordm9pZCAgICAgICBhdG9tX3RyYWZfc2V0X2Jhc2VfZGVjb2RlX3RpbWUgKEF0b21UUkFGICogdHJhZiwgZ3VpbnQ2NCBiYXNlX2RlY29kZV90aW1lKTsKK3ZvaWQgICAgICAgYXRvbV90cmFmX2FkZF9zYW1wbGVzICAgICAgIChBdG9tVFJBRiAqIHRyYWYsIGd1aW50MzIgZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBzaXplLCBnYm9vbGVhbiBzeW5jLCBnaW50NjQgcHRzX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYm9vbGVhbiBzZHRwX3N5bmMpOworZ3VpbnQzMiAgICBhdG9tX3RyYWZfZ2V0X3NhbXBsZV9udW0gICAgKEF0b21UUkFGICogdHJhZik7Cit2b2lkICAgICAgIGF0b21fbW9vZl9hZGRfdHJhZiAgICAgICAgICAoQXRvbU1PT0YgKm1vb2YsIEF0b21UUkFGICp0cmFmKTsKKworQXRvbU1GUkEqICBhdG9tX21mcmFfbmV3ICAgICAgICAgICAgICAgKEF0b21zQ29udGV4dCAqY29udGV4dCk7Cit2b2lkICAgICAgIGF0b21fbWZyYV9mcmVlICAgICAgICAgICAgICAoQXRvbU1GUkEgKm1mcmEpOworQXRvbVRGUkEqICBhdG9tX3RmcmFfbmV3ICAgICAgICAgICAgICAgKEF0b21zQ29udGV4dCAqY29udGV4dCwgZ3VpbnQzMiB0cmFja19JRCk7Cit2b2lkICAgICAgIGF0b21fdGZyYV9hZGRfZW50cnkgICAgICAgICAoQXRvbVRGUkEgKnRmcmEsIGd1aW50NjQgZHRzLCBndWludDMyIHNhbXBsZV9udW0pOwordm9pZCAgICAgICBhdG9tX3RmcmFfdXBkYXRlX29mZnNldCAgICAgKEF0b21URlJBICogdGZyYSwgZ3VpbnQ2NCBvZmZzZXQpOwordm9pZCAgICAgICBhdG9tX21mcmFfYWRkX3RmcmEgICAgICAgICAgKEF0b21NRlJBICptZnJhLCBBdG9tVEZSQSAqdGZyYSk7CitndWludDY0ICAgIGF0b21fbWZyYV9jb3B5X2RhdGEgICAgICAgICAoQXRvbU1GUkEgKm1mcmEsIGd1aW50OCAqKmJ1ZmZlciwgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCogb2Zmc2V0KTsKKworCisvKiBtZWRpYSBzYW1wbGUgZGVzY3JpcHRpb24gcmVsYXRlZCBoZWxwZXJzICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGd1aW50MTYgdmVyc2lvbjsKKyAgZ3VpbnQzMiBmb3VyY2M7CisgIGd1aW50IHdpZHRoOworICBndWludCBoZWlnaHQ7CisgIGd1aW50IGRlcHRoOworICBndWludCBmcmFtZV9jb3VudDsKKyAgZ2ludCBjb2xvcl90YWJsZV9pZDsKKyAgZ3VpbnQgcGFyX247CisgIGd1aW50IHBhcl9kOworCisgIEdzdEJ1ZmZlciAqY29kZWNfZGF0YTsKK30gVmlzdWFsU2FtcGxlRW50cnk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGd1aW50MzIgZm91cmNjOworICBndWludCB2ZXJzaW9uOworICBnaW50IGNvbXByZXNzaW9uX2lkOworICBndWludCBzYW1wbGVfcmF0ZTsKKyAgZ3VpbnQgY2hhbm5lbHM7CisgIGd1aW50IHNhbXBsZV9zaXplOworICBndWludCBieXRlc19wZXJfcGFja2V0OworICBndWludCBzYW1wbGVzX3Blcl9wYWNrZXQ7CisgIGd1aW50IGJ5dGVzX3Blcl9zYW1wbGU7CisgIGd1aW50IGJ5dGVzX3Blcl9mcmFtZTsKKworICBHc3RCdWZmZXIgKmNvZGVjX2RhdGE7Cit9IEF1ZGlvU2FtcGxlRW50cnk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGd1aW50MzIgZm91cmNjOworCisgIGd1aW50OCAgZm9udF9mYWNlOyAvKiBib2xkPTB4MSwgaXRhbGljPTB4MiwgdW5kZXJsaW5lPTB4NCAqLworICBndWludDggIGZvbnRfc2l6ZTsKKyAgZ3VpbnQzMiBmb3JlZ3JvdW5kX2NvbG9yX3JnYmE7Cit9IFN1YnRpdGxlU2FtcGxlRW50cnk7CisKK3ZvaWQgc3VidGl0bGVfc2FtcGxlX2VudHJ5X2luaXQgKFN1YnRpdGxlU2FtcGxlRW50cnkgKiBlbnRyeSk7CisKK1NhbXBsZVRhYmxlRW50cnlNUDRBICogYXRvbV90cmFrX3NldF9hdWRpb190eXBlIChBdG9tVFJBSyAqIHRyYWssIEF0b21zQ29udGV4dCAqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TYW1wbGVFbnRyeSAqIGVudHJ5LCBndWludDMyIHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21JbmZvICogZXh0LCBnaW50IHNhbXBsZV9zaXplKTsKKworU2FtcGxlVGFibGVFbnRyeU1QNFYgKiBhdG9tX3RyYWtfc2V0X3ZpZGVvX3R5cGUgKEF0b21UUkFLICogdHJhaywgQXRvbXNDb250ZXh0ICogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXN1YWxTYW1wbGVFbnRyeSAqIGVudHJ5LCBndWludDMyIHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpc3QgKiBleHRfYXRvbXNfbGlzdCk7CisKK1NhbXBsZVRhYmxlRW50cnlUWDNHICogYXRvbV90cmFrX3NldF9zdWJ0aXRsZV90eXBlIChBdG9tVFJBSyAqIHRyYWssIEF0b21zQ29udGV4dCAqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VidGl0bGVTYW1wbGVFbnRyeSAqIGVudHJ5KTsKKworU2FtcGxlVGFibGVFbnRyeVRNQ0QgKgorYXRvbV90cmFrX3NldF90aW1lY29kZV90eXBlIChBdG9tVFJBSyAqIHRyYWssIEF0b21zQ29udGV4dCAqIGNvbnRleHQsIGd1aW50IHRyYWtfdGltZXNjYWxlLCBHc3RWaWRlb1RpbWVDb2RlICogdGMpOworCit2b2lkIGF0b21fdHJha191cGRhdGVfYml0cmF0ZXMgKEF0b21UUkFLICogdHJhaywgZ3VpbnQzMiBhdmdfYml0cmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBtYXhfYml0cmF0ZSk7CisKK3ZvaWQgYXRvbV90cmFrX3R4M2dfdXBkYXRlX2RpbWVuc2lvbiAoQXRvbVRSQUsgKiB0cmFrLCBndWludDMyIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGhlaWdodCk7CisKK3ZvaWQgc2FtcGxlX3RhYmxlX2VudHJ5X2FkZF9leHRfYXRvbSAoU2FtcGxlVGFibGVFbnRyeSAqIHN0ZSwgQXRvbUluZm8gKiBleHQpOworCitBdG9tSW5mbyAqICAgYnVpbGRfY29kZWNfZGF0YV9leHRlbnNpb24gIChndWludDMyIGZvdXJjYywgY29uc3QgR3N0QnVmZmVyICogY29kZWNfZGF0YSk7CitBdG9tSW5mbyAqICAgYnVpbGRfbW92X2FhY19leHRlbnNpb24gICAgIChBdG9tVFJBSyAqIHRyYWssIGNvbnN0IEdzdEJ1ZmZlciAqIGNvZGVjX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGF2Z19iaXRyYXRlLCBndWludDMyIG1heF9iaXRyYXRlKTsKK0F0b21JbmZvICogICBidWlsZF9tb3ZfYWxhY19leHRlbnNpb24gICAgKGNvbnN0IEdzdEJ1ZmZlciAqIGNvZGVjX2RhdGEpOworQXRvbUluZm8gKiAgIGJ1aWxkX2VzZHNfZXh0ZW5zaW9uICAgICAgICAoQXRvbVRSQUsgKiB0cmFrLCBndWludDggb2JqZWN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDggc3RyZWFtX3R5cGUsIGNvbnN0IEdzdEJ1ZmZlciAqIGNvZGVjX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGF2Z19iaXRyYXRlLCBndWludDMyIG1heF9iaXRyYXRlKTsKK0F0b21JbmZvICogICBidWlsZF9idHJ0X2V4dGVuc2lvbiAgICAgICAgKGd1aW50MzIgYnVmZmVyX3NpemVfZGIsIGd1aW50MzIgYXZnX2JpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIG1heF9iaXRyYXRlKTsKK0F0b21JbmZvICogICBidWlsZF9qcDJoX2V4dGVuc2lvbiAgICAgICAgKGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0LCBjb25zdCBnY2hhciAqY29sb3JzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgbmNvbXAsIGNvbnN0IEdWYWx1ZSAqIGNtYXBfYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKiBjZGVmX2FycmF5KTsKKworQXRvbUluZm8gKiAgIGJ1aWxkX2pwMnhfZXh0ZW5zaW9uICAgICAgICAoY29uc3QgR3N0QnVmZmVyICogcHJlZml4KTsKK0F0b21JbmZvICogICBidWlsZF9maWVsX2V4dGVuc2lvbiAgICAgICAgKEdzdFZpZGVvSW50ZXJsYWNlTW9kZSBtb2RlLCBHc3RWaWRlb0ZpZWxkT3JkZXIgb3JkZXIpOworQXRvbUluZm8gKiAgIGJ1aWxkX2NvbHJfZXh0ZW5zaW9uICAgICAgICAoY29uc3QgR3N0VmlkZW9Db2xvcmltZXRyeSAqY29sb3JpbWV0cnksIGdib29sZWFuIGlzX21wNCk7CitBdG9tSW5mbyAqICAgYnVpbGRfY2xhcF9leHRlbnNpb24gICAgICAgIChnaW50IHdpZHRoX24sIGdpbnQgd2lkdGhfZCwgZ2ludCBoZWlnaHRfbiwgZ2ludCBoZWlnaHRfZCwgZ2ludCBoX29mZl9uLCBnaW50IGhfb2ZmX2QsIGdpbnQgdl9vZmZfbiwgZ2ludCB2X29mZl9kKTsKK0F0b21JbmZvICogICBidWlsZF90YXB0X2V4dGVuc2lvbiAgICAgICAgKGdpbnQgY2xlZl93aWR0aCwgZ2ludCBjbGVmX2hlaWdodCwgZ2ludCBwcm9mX3dpZHRoLCBnaW50IHByb2ZfaGVpZ2h0LCBnaW50IGVub2Zfd2lkdGgsIGdpbnQgZW5vZl9oZWlnaHQpOworCisKK0F0b21JbmZvICogICBidWlsZF9hYzNfZXh0ZW5zaW9uICAgICAgICAgKGd1aW50OCBmc2NvZCwgZ3VpbnQ4IGJzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDggYnNtb2QsIGd1aW50OCBhY21vZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50OCBsZmVfb24sIGd1aW50OCBiaXRyYXRlX2NvZGUpOworQXRvbUluZm8gKiAgIGJ1aWxkX29wdXNfZXh0ZW5zaW9uICAgICAgICAoZ3VpbnQzMiByYXRlLCBndWludDggY2hhbm5lbHMsIGd1aW50OCBtYXBwaW5nX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50OCBzdHJlYW1fY291bnQsIGd1aW50OCBjb3VwbGVkX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ4IGNoYW5uZWxfbWFwcGluZ1syNTZdLCBndWludDE2IHByZV9za2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQxNiBvdXRwdXRfZ2Fpbik7CisKK0F0b21JbmZvICogICBidWlsZF9hbXJfZXh0ZW5zaW9uICAgICAgICAgKHZvaWQpOworQXRvbUluZm8gKiAgIGJ1aWxkX2gyNjNfZXh0ZW5zaW9uICAgICAgICAodm9pZCk7CitBdG9tSW5mbyAqICAgYnVpbGRfZ2FtYV9hdG9tICAgICAgICAgICAgIChnZG91YmxlIGdhbW1hKTsKK0F0b21JbmZvICogICBidWlsZF9TTUlfYXRvbSAgICAgICAgICAgICAgKGNvbnN0IEdzdEJ1ZmZlciAqc2VxaCk7CitBdG9tSW5mbyAqICAgYnVpbGRfaW1hX2FkcGNtX2V4dGVuc2lvbiAgIChnaW50IGNoYW5uZWxzLCBnaW50IHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50IGJsb2Nrc2l6ZSk7CitBdG9tSW5mbyAqICAgYnVpbGRfdXVpZF94bXBfYXRvbSAgICAgICAgIChHc3RCdWZmZXIgKiB4bXApOworCisKKy8qCisgKiBNZXRhIHRhZ3MgZnVuY3Rpb25zCisgKi8KK3ZvaWQgYXRvbV91ZHRhX2NsZWFyX3RhZ3MgKEF0b21VRFRBICp1ZHRhKTsKK3ZvaWQgYXRvbV91ZHRhX2FkZF9zdHJfdGFnICAgIChBdG9tVURUQSAqdWR0YSwgZ3VpbnQzMiBmb3VyY2MsIGNvbnN0IGdjaGFyICp2YWx1ZSk7Cit2b2lkIGF0b21fdWR0YV9hZGRfdWludF90YWcgICAoQXRvbVVEVEEgKnVkdGEsIGd1aW50MzIgZm91cmNjLCBndWludDMyIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgdmFsdWUpOwordm9pZCBhdG9tX3VkdGFfYWRkX3RhZyAgICAgICAgKEF0b21VRFRBICp1ZHRhLCBndWludDMyIGZvdXJjYywgZ3VpbnQzMiBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDggKiBkYXRhLCBndWludCBzaXplKTsKK3ZvaWQgYXRvbV91ZHRhX2FkZF9ibG9iX3RhZyAgIChBdG9tVURUQSAqdWR0YSwgZ3VpbnQ4ICpkYXRhLCBndWludCBzaXplKTsKKwordm9pZCBhdG9tX3VkdGFfYWRkXzNncF9zdHJfdGFnICAgICAgIChBdG9tVURUQSAqdWR0YSwgZ3VpbnQzMiBmb3VyY2MsIGNvbnN0IGdjaGFyICogdmFsdWUpOwordm9pZCBhdG9tX3VkdGFfYWRkXzNncF91aW50X3RhZyAgICAgIChBdG9tVURUQSAqdWR0YSwgZ3VpbnQzMiBmb3VyY2MsIGd1aW50MTYgdmFsdWUpOwordm9pZCBhdG9tX3VkdGFfYWRkXzNncF9zdHJfaW50X3RhZyAgIChBdG9tVURUQSAqdWR0YSwgZ3VpbnQzMiBmb3VyY2MsIGNvbnN0IGdjaGFyICogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQxNiBpdmFsdWUpOwordm9pZCBhdG9tX3VkdGFfYWRkXzNncF90YWcgICAgICAgICAgIChBdG9tVURUQSAqdWR0YSwgZ3VpbnQzMiBmb3VyY2MsIGd1aW50OCAqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50IHNpemUpOworCit2b2lkIGF0b21fdWR0YV9hZGRfeG1wX3RhZ3MgICAgICAgICAgKEF0b21VRFRBICp1ZHRhLCBHc3RCdWZmZXIgKiB4bXApOworCitBdG9tVFJFRiAqIGF0b21fdHJlZl9uZXcgKGd1aW50MzIgcmVmdHlwZSk7Cit2b2lkIGF0b21fdHJlZl9hZGRfZW50cnkgKEF0b21UUkVGICogdHJlZiwgZ3VpbnQzMiBzYW1wbGUpOworCisjZGVmaW5lIEdTVF9RVF9NVVhfREVGQVVMVF9UQUdfTEFOR1VBR0UgICAidW5kIiAvKiB1bmRlZmluZWQvdW5rbm93biAqLworZ3VpbnQxNiAgbGFuZ3VhZ2VfY29kZSAgICAgICAgICAgICAgIChjb25zdCBjaGFyICogbGFuZyk7CisKKyNlbmRpZiAvKiBfX0FUT01TX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9hdG9tc3JlY292ZXJ5LmMgYi9nc3QvaXNvbXA0L2F0b21zcmVjb3ZlcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGM0NDM0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9hdG9tc3JlY292ZXJ5LmMKQEAgLTAsMCArMSwxMjA2IEBACisvKiBRdWlja3RpbWUgbXV4ZXIgcGx1Z2luIGZvciBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUaGlzIG1vZHVsZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIHNlcmlhbGl6aW5nIHBhcnRpYWwgaW5mb3JtYXRpb24gZnJvbQorICogYSBtdXggaW4gcHJvZ3Jlc3MgKGJ5IHF0bXV4IGVsZW1lbnRzKS4gVGhpcyBlbmFibGVzIHJlY29uc3RydWN0aW9uIG9mIHRoZQorICogbW9vdiBib3ggaWYgYSBjcmFzaCBoYXBwZW5zIGFuZCB0aHVzIHJlY292ZXJpbmcgdGhlIG1vdmllIGZpbGUuCisgKgorICogVXNhZ2U6CisgKiAxKSBwaXBlbGluZTogLi4ueW91cmVsZW1lbnRzICEgcXRtdXggbW9vdi1yZWNvdmVyeS1maWxlPXBhdGgubXJmICEgXAorICogZmlsZXNpbmsgbG9jYXRpb249bW9vdmllLm1vdgorICoKKyAqIDIpIENSQVNIIQorICoKKyAqIDMpIGdzdC1sYXVuY2gtMS4wIHF0bW9vdnJlY292ZXIgcmVjb3ZlcnktaW5wdXQ9cGF0aC5tcmYgYnJva2VuLWlucHV0PW1vb3ZpZS5tb3YgXAorICAgICAgICBmaXhlZC1vdXRwdXQ9cmVjb3ZlcmVkLm1vdgorICoKKyAqIDQpIChIb3BlZnVsbHkpIGVuam95IHJlY292ZXJlZC5tb3YuCisgKgorICogLS0tIFJlY292ZXJ5IGZpbGUgbGF5b3V0IC0tLQorICogMSkgVmVyc2lvbiAoYSBndWludDE2KQorICogMikgUHJlZml4IGF0b20gKGlmIHByZXNlbnQpCisgKiAzKSBmdHlwIGF0b20KKyAqIDQpIE1WSEQgYXRvbSAod2l0aG91dCB0aW1lc2NhbGUvZHVyYXRpb24gc2V0KQorICogNSkgbW9vdmllIHRpbWVzY2FsZQorICogNikgbnVtYmVyIG9mIHRyYWtzCisgKiA3KSBsaXN0IG9mIHRyYWsgYXRvbXMgKHN0YmwgZGF0YSBpcyBpZ25vcmVkLCBleGNlcHQgZm9yIHRoZSBzdHNkIGF0b20pCisgKiA4KSBCdWZmZXJzIG1ldGFkYXRhIChtZXRhZGF0YSB0aGF0IGlzIHJlbGV2YW50IHRvIHRoZSBjb250YWluZXIpCisgKiAgICBCdWZmZXJzIG1ldGFkYXRhIGFyZSBzdG9yZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGFkZGVkIHRvIHRoZSBtZGF0LAorICogICAgZWFjaCBlbnRyZSBoYXMgYSBmaXhlZCBzaXplIGFuZCBpcyBzdG9yZWQgaW4gQkUuIGJvb2xlYW5zIGFyZSBzdG9yZWQKKyAqICAgIGFzIGEgc2luZ2xlIGJ5dGUgd2hlcmUgMCBtZWFucyBmYWxzZSwgb3RoZXJ3aXNlIGlzIHRydWUuCisgKiAgIE1ldGFkYXRhOgorICogICAtIGd1aW50MzIgICB0cmFja19pZDsKKyAqICAgLSBndWludDMyICAgbnNhbXBsZXM7CisgKiAgIC0gZ3VpbnQzMiAgIGRlbHRhOworICogICAtIGd1aW50MzIgICBzaXplOworICogICAtIGd1aW50NjQgICBjaHVua19vZmZzZXQ7CisgKiAgIC0gZ2Jvb2xlYW4gIHN5bmM7CisgKiAgIC0gZ2Jvb2xlYW4gIGRvX3B0czsKKyAqICAgLSBndWludDY0ICAgcHRzX29mZnNldDsgKGFsd2F5cyBwcmVzZW50LCBpZ25vcmVkIGlmIGRvX3B0cyBpcyBmYWxzZSkKKyAqCisgKiBUaGUgbWRhdCBmaWxlIG1pZ2h0IGNvbnRhaW4gZnR5cCBhbmQgdGhlbiBtZGF0LCBpbiBjYXNlIHRoaXMgaXMgdGhlIGZhc3RzdGFydAorICogdGVtcG9yYXJ5IGZpbGUgdGhlcmUgaXMgbm8gZnR5cCBhbmQgbm8gbWRhdCBoZWFkZXIsIG9ubHkgdGhlIGJ1ZmZlcnMgZGF0YS4KKyAqCisgKiBOb3RlcyBhYm91dCByZWNvdmVyeSBmaWxlIGxheW91dDogV2Ugc3RpbGwgZG9uJ3Qgc3RvcmUgdGFncyBub3IgRURUUyBkYXRhLgorICoKKyAqIElNUE9SVEFOVDogdGhpcyBpcyBzdGlsbCBhdCBhIGV4cGVyaW1lbnRhbCBzdGF0ZS4KKyAqLworCisjaW5jbHVkZSAiYXRvbXNyZWNvdmVyeS5oIgorCisjZGVmaW5lIE1BWF9DSFVOS19TSVpFICgxMDI0ICogMTAyNCkgICAgLyogMU1CICovCisKKyNkZWZpbmUgQVRPTVNfUkVDT1ZfT1VUUFVUX1dSSVRFX0VSUk9SKGVycikgXAorICAgIGdfc2V0X2Vycm9yIChlcnIsIEFUT01TX1JFQ09WX1FVQVJLLCBBVE9NU19SRUNPVl9FUlJfRklMRSwgXAorICAgICAgICAiRmFpbGVkIHRvIHdyaXRlIHRvIG91dHB1dCBmaWxlOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSkKKworc3RhdGljIGdib29sZWFuCithdG9tc19yZWNvdl93cml0ZV92ZXJzaW9uIChGSUxFICogZikKK3sKKyAgZ3VpbnQ4IGRhdGFbMl07CisgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEsIEFUT01TX1JFQ09WX0ZJTEVfVkVSU0lPTik7CisgIHJldHVybiBmd3JpdGUgKGRhdGEsIDIsIDEsIGYpID09IDE7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorYXRvbXNfcmVjb3Zfd3JpdGVfZnR5cF9pbmZvIChGSUxFICogZiwgQXRvbUZUWVAgKiBmdHlwLCBHc3RCdWZmZXIgKiBwcmVmaXgpCit7CisgIGd1aW50OCAqZGF0YSA9IE5VTEw7CisgIGd1aW50NjQgb2Zmc2V0ID0gMDsKKyAgZ3VpbnQ2NCBzaXplID0gMDsKKworICBpZiAocHJlZml4KSB7CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICBpZiAoIWdzdF9idWZmZXJfbWFwIChwcmVmaXgsICZtYXAsIEdTVF9NQVBfUkVBRCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKGZ3cml0ZSAobWFwLmRhdGEsIDEsIG1hcC5zaXplLCBmKSAhPSBtYXAuc2l6ZSkgeworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAocHJlZml4LCAmbWFwKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAocHJlZml4LCAmbWFwKTsKKyAgfQorICBpZiAoIWF0b21fZnR5cF9jb3B5X2RhdGEgKGZ0eXAsICZkYXRhLCAmc2l6ZSwgJm9mZnNldCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKGZ3cml0ZSAoZGF0YSwgMSwgb2Zmc2V0LCBmKSAhPSBvZmZzZXQpIHsKKyAgICBnX2ZyZWUgKGRhdGEpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBnX2ZyZWUgKGRhdGEpOworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIFdyaXRlcyBpbXBvcnRhbnQgaW5mbyBvbiB0aGUgJ21vb3YnIGF0b20gKG5vbi10cmFrIHJlbGF0ZWQpCisgKiB0byBiZSBhYmxlIHRvIHJlY292ZXIgdGhlIG1vb3Ygc3RydWN0dXJlIGFmdGVyIGEgY3Jhc2guCisgKgorICogQ3VycmVudGx5LCBpdCB3cml0ZXMgdGhlIE1WSEQgYXRvbS4KKyAqLworc3RhdGljIGdib29sZWFuCithdG9tc19yZWNvdl93cml0ZV9tb292X2luZm8gKEZJTEUgKiBmLCBBdG9tTU9PViAqIG1vb3YpCit7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQ2NCBzaXplOworICBndWludDY0IG9mZnNldCA9IDA7CisgIGd1aW50NjQgYXRvbV9zaXplID0gMDsKKyAgZ2ludCB3cml0ZW4gPSAwOworCisgIC8qIGxpa2VseSBlbm91Z2ggKi8KKyAgc2l6ZSA9IDI1NjsKKyAgZGF0YSA9IGdfbWFsbG9jIChzaXplKTsKKyAgYXRvbV9zaXplID0gYXRvbV9tdmhkX2NvcHlfZGF0YSAoJm1vb3YtPm12aGQsICZkYXRhLCAmc2l6ZSwgJm9mZnNldCk7CisgIGlmIChhdG9tX3NpemUgPiAwKQorICAgIHdyaXRlbiA9IGZ3cml0ZSAoZGF0YSwgMSwgYXRvbV9zaXplLCBmKTsKKyAgZ19mcmVlIChkYXRhKTsKKyAgcmV0dXJuIGF0b21fc2l6ZSA+IDAgJiYgd3JpdGVuID09IGF0b21fc2l6ZTsKK30KKworLyoKKyAqIFdyaXRlcyB0aGUgbnVtYmVyIG9mIHRyYWtzIHRvIHRoZSBmaWxlLgorICogVGhpcyBzaW1wbHkgd3JpdGVzIGEgZ3VpbnQzMiBpbiBCRS4KKyAqLworc3RhdGljIGdib29sZWFuCithdG9tc19yZWNvdl93cml0ZV90cmFrc19udW1iZXIgKEZJTEUgKiBmLCBndWludDMyIHRyYWtzKQoreworICBndWludDggZGF0YVs0XTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSwgdHJha3MpOworICByZXR1cm4gZndyaXRlIChkYXRhLCA0LCAxLCBmKSA9PSAxOworfQorCisvKgorICogV3JpdGVzIHRoZSBtb292J3MgdGltZXNjYWxlIHRvIHRoZSBmaWxlCisgKiBUaGlzIHNpbXBseSB3cml0ZXMgYSBndWludDMyIGluIEJFLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2F0b21zX3JlY292X3dyaXRlX21vb3ZfdGltZXNjYWxlIChGSUxFICogZiwgZ3VpbnQzMiB0aW1lc2NhbGUpCit7CisgIGd1aW50OCBkYXRhWzRdOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhLCB0aW1lc2NhbGUpOworICByZXR1cm4gZndyaXRlIChkYXRhLCA0LCAxLCBmKSA9PSAxOworfQorCisvKgorICogV3JpdGVzIHRoZSB0cmFrIGF0b20gdG8gdGhlIGZpbGUuCisgKi8KK2dib29sZWFuCithdG9tc19yZWNvdl93cml0ZV90cmFrX2luZm8gKEZJTEUgKiBmLCBBdG9tVFJBSyAqIHRyYWspCit7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQ2NCBzaXplOworICBndWludDY0IG9mZnNldCA9IDA7CisgIGd1aW50NjQgYXRvbV9zaXplID0gMDsKKyAgZ2ludCB3cml0ZW4gPSAwOworCisgIC8qIGJ1ZmZlciBpcyByZWFsbG9jZWQgdG8gYSBsYXJnZXIgc2l6ZSBpZiBuZWVkZWQgKi8KKyAgc2l6ZSA9IDQgKiAxMDI0OworICBkYXRhID0gZ19tYWxsb2MgKHNpemUpOworICBhdG9tX3NpemUgPSBhdG9tX3RyYWtfY29weV9kYXRhICh0cmFrLCAmZGF0YSwgJnNpemUsICZvZmZzZXQpOworICBpZiAoYXRvbV9zaXplID4gMCkKKyAgICB3cml0ZW4gPSBmd3JpdGUgKGRhdGEsIGF0b21fc2l6ZSwgMSwgZik7CisgIGdfZnJlZSAoZGF0YSk7CisgIHJldHVybiBhdG9tX3NpemUgPiAwICYmIHdyaXRlbiA9PSBhdG9tX3NpemU7Cit9CisKK2dib29sZWFuCithdG9tc19yZWNvdl93cml0ZV90cmFrX3NhbXBsZXMgKEZJTEUgKiBmLCBBdG9tVFJBSyAqIHRyYWssIGd1aW50MzIgbnNhbXBsZXMsCisgICAgZ3VpbnQzMiBkZWx0YSwgZ3VpbnQzMiBzaXplLCBndWludDY0IGNodW5rX29mZnNldCwgZ2Jvb2xlYW4gc3luYywKKyAgICBnYm9vbGVhbiBkb19wdHMsIGdpbnQ2NCBwdHNfb2Zmc2V0KQoreworICBndWludDggZGF0YVtUUkFLX0JVRkZFUl9FTlRSWV9JTkZPX1NJWkVdOworICAvKgorICAgKiBXZSBoYXZlIHRvIHdyaXRlIGEgVHJha0J1ZmZlckVudHJ5SW5mbworICAgKi8KKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSArIDAsIHRyYWstPnRraGQudHJhY2tfSUQpOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgNCwgbnNhbXBsZXMpOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgOCwgZGVsdGEpOworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhICsgMTIsIHNpemUpOworICBHU1RfV1JJVEVfVUlOVDY0X0JFIChkYXRhICsgMTYsIGNodW5rX29mZnNldCk7CisgIGlmIChzeW5jKQorICAgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDI0LCAxKTsKKyAgZWxzZQorICAgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDI0LCAwKTsKKyAgaWYgKGRvX3B0cykgeworICAgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDI1LCAxKTsKKyAgICBHU1RfV1JJVEVfVUlOVDY0X0JFIChkYXRhICsgMjYsIHB0c19vZmZzZXQpOworICB9IGVsc2UgeworICAgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDI1LCAwKTsKKyAgICBHU1RfV1JJVEVfVUlOVDY0X0JFIChkYXRhICsgMjYsIDApOworICB9CisKKyAgcmV0dXJuIGZ3cml0ZSAoZGF0YSwgMSwgVFJBS19CVUZGRVJfRU5UUllfSU5GT19TSVpFLCBmKSA9PQorICAgICAgVFJBS19CVUZGRVJfRU5UUllfSU5GT19TSVpFOworfQorCitnYm9vbGVhbgorYXRvbXNfcmVjb3Zfd3JpdGVfaGVhZGVycyAoRklMRSAqIGYsIEF0b21GVFlQICogZnR5cCwgR3N0QnVmZmVyICogcHJlZml4LAorICAgIEF0b21NT09WICogbW9vdiwgZ3VpbnQzMiB0aW1lc2NhbGUsIGd1aW50MzIgdHJha3NfbnVtYmVyKQoreworICBpZiAoIWF0b21zX3JlY292X3dyaXRlX3ZlcnNpb24gKGYpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKCFhdG9tc19yZWNvdl93cml0ZV9mdHlwX2luZm8gKGYsIGZ0eXAsIHByZWZpeCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoIWF0b21zX3JlY292X3dyaXRlX21vb3ZfaW5mbyAoZiwgbW9vdikpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoIWF0b21zX3JlY292X3dyaXRlX21vb3ZfdGltZXNjYWxlIChmLCB0aW1lc2NhbGUpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKCFhdG9tc19yZWNvdl93cml0ZV90cmFrc19udW1iZXIgKGYsIHRyYWtzX251bWJlcikpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCityZWFkX2F0b21faGVhZGVyIChGSUxFICogZiwgZ3VpbnQzMiAqIGZvdXJjYywgZ3VpbnQzMiAqIHNpemUpCit7CisgIGd1aW50OCBhdXhbOF07CisKKyAgaWYgKGZyZWFkIChhdXgsIDEsIDgsIGYpICE9IDgpCisgICAgcmV0dXJuIEZBTFNFOworICAqc2l6ZSA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoYXV4KTsKKyAgKmZvdXJjYyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoYXV4ICsgNCk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK21vb3ZfcmVjb3ZfZmlsZV9wYXJzZV9wcmVmaXggKE1vb3ZSZWNvdkZpbGUgKiBtb292cmYpCit7CisgIGd1aW50MzIgZm91cmNjOworICBndWludDMyIHNpemU7CisgIGd1aW50MzIgdG90YWxfc2l6ZSA9IDA7CisgIGlmIChmc2VlayAobW9vdnJmLT5maWxlLCAyLCBTRUVLX1NFVCkgIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghcmVhZF9hdG9tX2hlYWRlciAobW9vdnJmLT5maWxlLCAmZm91cmNjLCAmc2l6ZSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoZm91cmNjICE9IEZPVVJDQ19mdHlwKSB7CisgICAgLyogd2UgbWlnaHQgaGF2ZSBhIHByZWZpeCBoZXJlICovCisgICAgaWYgKGZzZWVrIChtb292cmYtPmZpbGUsIHNpemUgLSA4LCBTRUVLX0NVUikgIT0gMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHRvdGFsX3NpemUgKz0gc2l6ZTsKKworICAgIC8qIG5vdyByZWFkIHRoZSBmdHlwICovCisgICAgaWYgKCFyZWFkX2F0b21faGVhZGVyIChtb292cmYtPmZpbGUsICZmb3VyY2MsICZzaXplKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIHRoaXMgaGFzIHRvIGJlIHRoZSBmdHlwICovCisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX2Z0eXApCisgICAgcmV0dXJuIEZBTFNFOworICB0b3RhbF9zaXplICs9IHNpemU7CisgIG1vb3ZyZi0+cHJlZml4X3NpemUgPSB0b3RhbF9zaXplOworICByZXR1cm4gZnNlZWsgKG1vb3ZyZi0+ZmlsZSwgc2l6ZSAtIDgsIFNFRUtfQ1VSKSA9PSAwOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK21vb3ZfcmVjb3ZfZmlsZV9wYXJzZV9tdmhkIChNb292UmVjb3ZGaWxlICogbW9vdnJmKQoreworICBndWludDMyIGZvdXJjYzsKKyAgZ3VpbnQzMiBzaXplOworICBpZiAoIXJlYWRfYXRvbV9oZWFkZXIgKG1vb3ZyZi0+ZmlsZSwgJmZvdXJjYywgJnNpemUpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIC8qIGNoZWNrIGZvciBzYW5pdHkgKi8KKyAgaWYgKGZvdXJjYyAhPSBGT1VSQ0NfbXZoZCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbW9vdnJmLT5tdmhkX3NpemUgPSBzaXplOworICBtb292cmYtPm12aGRfcG9zID0gZnRlbGwgKG1vb3ZyZi0+ZmlsZSkgLSA4OworCisgIC8qIHNraXAgdGhlIHJlbWFpbmluZyBvZiB0aGUgbXZoZCBpbiB0aGUgZmlsZSAqLworICByZXR1cm4gZnNlZWsgKG1vb3ZyZi0+ZmlsZSwgc2l6ZSAtIDgsIFNFRUtfQ1VSKSA9PSAwOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK21kYXRfcmVjb3ZfZmlsZV9wYXJzZV9tZGF0X3N0YXJ0IChNZGF0UmVjb3ZGaWxlICogbWRhdHJmKQoreworICBndWludDMyIGZvdXJjYywgc2l6ZTsKKworICBpZiAoIXJlYWRfYXRvbV9oZWFkZXIgKG1kYXRyZi0+ZmlsZSwgJmZvdXJjYywgJnNpemUpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChzaXplID09IDEpIHsKKyAgICBtZGF0cmYtPm1kYXRfaGVhZGVyX3NpemUgPSAxNjsKKyAgICBtZGF0cmYtPm1kYXRfc2l6ZSA9IDE2OworICB9IGVsc2UgeworICAgIG1kYXRyZi0+bWRhdF9oZWFkZXJfc2l6ZSA9IDg7CisgICAgbWRhdHJmLT5tZGF0X3NpemUgPSA4OworICB9CisgIG1kYXRyZi0+bWRhdF9zdGFydCA9IGZ0ZWxsIChtZGF0cmYtPmZpbGUpIC0gODsKKworICByZXR1cm4gZm91cmNjID09IEZPVVJDQ19tZGF0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK21kYXRfcmVjb3ZfZmlsZV9maW5kX21kYXQgKEZJTEUgKiBmaWxlLCBHRXJyb3IgKiogZXJyKQoreworICBndWludDMyIGZvdXJjYyA9IDAsIHNpemUgPSAwOworICBnYm9vbGVhbiBmYWlsdXJlID0gRkFMU0U7CisgIHdoaWxlIChmb3VyY2MgIT0gRk9VUkNDX21kYXQgJiYgIWZhaWx1cmUpIHsKKyAgICBpZiAoIXJlYWRfYXRvbV9oZWFkZXIgKGZpbGUsICZmb3VyY2MsICZzaXplKSkgeworICAgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgICB9CisgICAgc3dpdGNoIChmb3VyY2MpIHsKKyAgICAgICAgLyogc2tpcCB0aGVzZSBhdG9tcyAqLworICAgICAgY2FzZSBGT1VSQ0NfZnR5cDoKKyAgICAgIGNhc2UgRk9VUkNDX2ZyZWU6CisgICAgICBjYXNlIEZPVVJDQ191ZHRhOgorICAgICAgICBpZiAoZnNlZWsgKGZpbGUsIHNpemUgLSA4LCBTRUVLX0NVUikgIT0gMCkgeworICAgICAgICAgIGdvdG8gZmlsZV9zZWVrX2Vycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGT1VSQ0NfbWRhdDoKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfRVJST1IgKCJVbmV4cGVjdGVkIGF0b20gaW4gaGVhZGVycyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSk7CisgICAgICAgIGZhaWx1cmUgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoIWZhaWx1cmUpIHsKKyAgICAvKiBSZXZlcnNlIHRvIG1kYXQgc3RhcnQgKi8KKyAgICBpZiAoZnNlZWsgKGZpbGUsIC04LCBTRUVLX0NVUikgIT0gMCkKKyAgICAgIGdvdG8gZmlsZV9zZWVrX2Vycm9yOworICB9CisKKyAgcmV0dXJuICFmYWlsdXJlOworCitwYXJzZV9lcnJvcjoKKyAgZ19zZXRfZXJyb3IgKGVyciwgQVRPTVNfUkVDT1ZfUVVBUkssIEFUT01TX1JFQ09WX0VSUl9GSUxFLAorICAgICAgIkZhaWxlZCB0byBwYXJzZSBhdG9tIik7CisgIHJldHVybiBGQUxTRTsKKworZmlsZV9zZWVrX2Vycm9yOgorICBnX3NldF9lcnJvciAoZXJyLCBBVE9NU19SRUNPVl9RVUFSSywgQVRPTVNfUkVDT1ZfRVJSX0ZJTEUsCisgICAgICAiRmFpbGVkIHRvIHNlZWsgdG8gc3RhcnQgb2YgdGhlIGZpbGUiKTsKKyAgcmV0dXJuIEZBTFNFOworCit9CisKK01kYXRSZWNvdkZpbGUgKgorbWRhdF9yZWNvdl9maWxlX2NyZWF0ZSAoRklMRSAqIGZpbGUsIGdib29sZWFuIGRhdGFmaWxlLCBHRXJyb3IgKiogZXJyKQoreworICBNZGF0UmVjb3ZGaWxlICptcmYgPSBnX25ldzAgKE1kYXRSZWNvdkZpbGUsIDEpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChmaWxlICE9IE5VTEwsIE5VTEwpOworCisgIG1yZi0+ZmlsZSA9IGZpbGU7CisgIG1yZi0+cmF3ZmlsZSA9IGRhdGFmaWxlOworCisgIC8qIGdldCB0aGUgZmlsZS9kYXRhIGxlbmd0aCAqLworICBpZiAoZnNlZWsgKGZpbGUsIDAsIFNFRUtfRU5EKSAhPSAwKQorICAgIGdvdG8gZmlsZV9sZW5ndGhfZXJyb3I7CisgIC8qIHN0aWxsIG5lZWRzIHRvIGRlZHVjZSB0aGUgbWRhdCBoZWFkZXIgYW5kIGZ0eXAgc2l6ZSAqLworICBtcmYtPmRhdGFfc2l6ZSA9IGZ0ZWxsIChmaWxlKTsKKyAgaWYgKG1yZi0+ZGF0YV9zaXplID09IC0xTCkKKyAgICBnb3RvIGZpbGVfbGVuZ3RoX2Vycm9yOworCisgIGlmIChmc2VlayAoZmlsZSwgMCwgU0VFS19TRVQpICE9IDApCisgICAgZ290byBmaWxlX3NlZWtfZXJyb3I7CisKKyAgaWYgKGRhdGFmaWxlKSB7CisgICAgLyogdGhpcyBmaWxlIGNvbnRhaW5zIG5vIGF0b21zLCBvbmx5IHJhdyBkYXRhIHRvIGJlIHBsYWNlZCBvbiB0aGUgbWRhdAorICAgICAqIHRoaXMgaGFwcGVucyB3aGVuIGZhc3RzdGFydCBtb2RlIGlzIHVzZWQgKi8KKyAgICBtcmYtPm1kYXRfc3RhcnQgPSAwOworICAgIG1yZi0+bWRhdF9oZWFkZXJfc2l6ZSA9IDE2OworICAgIG1yZi0+bWRhdF9zaXplID0gMTY7CisgICAgcmV0dXJuIG1yZjsKKyAgfQorCisgIGlmICghbWRhdF9yZWNvdl9maWxlX2ZpbmRfbWRhdCAoZmlsZSwgZXJyKSkgeworICAgIGdvdG8gZmFpbDsKKyAgfQorCisgIC8qIHdlIGRvbid0IHBhcnNlIHRoaXMgaWYgd2UgaGF2ZSBhIHRtcGRhdGFmaWxlICovCisgIGlmICghbWRhdF9yZWNvdl9maWxlX3BhcnNlX21kYXRfc3RhcnQgKG1yZikpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyLCBBVE9NU19SRUNPVl9RVUFSSywgQVRPTVNfUkVDT1ZfRVJSX1BBUlNJTkcsCisgICAgICAgICJFcnJvciB3aGlsZSBwYXJzaW5nIG1kYXQgYXRvbSIpOworICAgIGdvdG8gZmFpbDsKKyAgfQorCisgIHJldHVybiBtcmY7CisKK2ZpbGVfc2Vla19lcnJvcjoKKyAgZ19zZXRfZXJyb3IgKGVyciwgQVRPTVNfUkVDT1ZfUVVBUkssIEFUT01TX1JFQ09WX0VSUl9GSUxFLAorICAgICAgIkZhaWxlZCB0byBzZWVrIHRvIHN0YXJ0IG9mIHRoZSBmaWxlIik7CisgIGdvdG8gZmFpbDsKKworZmlsZV9sZW5ndGhfZXJyb3I6CisgIGdfc2V0X2Vycm9yIChlcnIsIEFUT01TX1JFQ09WX1FVQVJLLCBBVE9NU19SRUNPVl9FUlJfRklMRSwKKyAgICAgICJGYWlsZWQgdG8gZGV0ZXJtaW5lIGZpbGUgc2l6ZSIpOworICBnb3RvIGZhaWw7CisKK2ZhaWw6CisgIG1kYXRfcmVjb3ZfZmlsZV9mcmVlIChtcmYpOworICByZXR1cm4gTlVMTDsKK30KKwordm9pZAorbWRhdF9yZWNvdl9maWxlX2ZyZWUgKE1kYXRSZWNvdkZpbGUgKiBtcmYpCit7CisgIGZjbG9zZSAobXJmLT5maWxlKTsKKyAgZ19mcmVlIChtcmYpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK21vb3ZfcmVjb3ZfcGFyc2VfbnVtX3RyYWtzIChNb292UmVjb3ZGaWxlICogbW9vdnJmKQoreworICBndWludDggdHJha3NbNF07CisgIGlmIChmcmVhZCAodHJha3MsIDEsIDQsIG1vb3ZyZi0+ZmlsZSkgIT0gNCkKKyAgICByZXR1cm4gRkFMU0U7CisgIG1vb3ZyZi0+bnVtX3RyYWtzID0gR1NUX1JFQURfVUlOVDMyX0JFICh0cmFrcyk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK21vb3ZfcmVjb3ZfcGFyc2VfbW9vdl90aW1lc2NhbGUgKE1vb3ZSZWNvdkZpbGUgKiBtb292cmYpCit7CisgIGd1aW50OCB0c1s0XTsKKyAgaWYgKGZyZWFkICh0cywgMSwgNCwgbW9vdnJmLT5maWxlKSAhPSA0KQorICAgIHJldHVybiBGQUxTRTsKKyAgbW9vdnJmLT50aW1lc2NhbGUgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKHRzKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorc2tpcF9hdG9tIChNb292UmVjb3ZGaWxlICogbW9vdnJmLCBndWludDMyIGV4cGVjdGVkX2ZvdXJjYykKK3sKKyAgZ3VpbnQzMiBzaXplOworICBndWludDMyIGZvdXJjYzsKKworICBpZiAoIXJlYWRfYXRvbV9oZWFkZXIgKG1vb3ZyZi0+ZmlsZSwgJmZvdXJjYywgJnNpemUpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKGZvdXJjYyAhPSBleHBlY3RlZF9mb3VyY2MpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiAoZnNlZWsgKG1vb3ZyZi0+ZmlsZSwgc2l6ZSAtIDgsIFNFRUtfQ1VSKSA9PSAwKTsKK30KKworc3RhdGljIGdib29sZWFuCittb292X3JlY292X3BhcnNlX3RraGQgKE1vb3ZSZWNvdkZpbGUgKiBtb292cmYsIFRyYWtSZWNvdkRhdGEgKiB0cmFrcmQpCit7CisgIGd1aW50MzIgc2l6ZTsKKyAgZ3VpbnQzMiBmb3VyY2M7CisgIGd1aW50OCBkYXRhWzRdOworCisgIC8qIG1ha2Ugc3VyZSB3ZSBhcmUgb24gYSB0a2hkIGF0b20gKi8KKyAgaWYgKCFyZWFkX2F0b21faGVhZGVyIChtb292cmYtPmZpbGUsICZmb3VyY2MsICZzaXplKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX3RraGQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHRyYWtyZC0+dGtoZF9maWxlX29mZnNldCA9IGZ0ZWxsIChtb292cmYtPmZpbGUpIC0gODsKKworICAvKiBtb3ZlIDggYnl0ZXMgZm9yd2FyZCB0byB0aGUgdHJha19pZCBwb3MgKi8KKyAgaWYgKGZzZWVrIChtb292cmYtPmZpbGUsIDEyLCBTRUVLX0NVUikgIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChmcmVhZCAoZGF0YSwgMSwgNCwgbW9vdnJmLT5maWxlKSAhPSA0KQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBhZHZhbmNlIHRoZSByZXN0IG9mIHRraGQgKi8KKyAgaWYgKGZzZWVrIChtb292cmYtPmZpbGUsIDY4LCBTRUVLX0NVUikgIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgdHJha3JkLT50cmFrX2lkID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorbW9vdl9yZWNvdl9wYXJzZV9zdGJsIChNb292UmVjb3ZGaWxlICogbW9vdnJmLCBUcmFrUmVjb3ZEYXRhICogdHJha3JkKQoreworICBndWludDMyIHNpemU7CisgIGd1aW50MzIgZm91cmNjOworICBndWludDMyIGF1eHNpemU7CisKKyAgaWYgKCFyZWFkX2F0b21faGVhZGVyIChtb292cmYtPmZpbGUsICZmb3VyY2MsICZzaXplKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX3N0YmwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHRyYWtyZC0+c3RibF9maWxlX29mZnNldCA9IGZ0ZWxsIChtb292cmYtPmZpbGUpIC0gODsKKyAgdHJha3JkLT5zdGJsX3NpemUgPSBzaXplOworCisgIC8qIHNraXAgdGhlIHN0c2QgKi8KKyAgaWYgKCFyZWFkX2F0b21faGVhZGVyIChtb292cmYtPmZpbGUsICZmb3VyY2MsICZhdXhzaXplKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX3N0c2QpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoZnNlZWsgKG1vb3ZyZi0+ZmlsZSwgYXV4c2l6ZSAtIDgsIFNFRUtfQ1VSKSAhPSAwKQorICAgIHJldHVybiBGQUxTRTsKKworICB0cmFrcmQtPnN0c2Rfc2l6ZSA9IGF1eHNpemU7CisgIHRyYWtyZC0+cG9zdF9zdHNkX29mZnNldCA9IGZ0ZWxsIChtb292cmYtPmZpbGUpOworCisgIC8qIGFzIHRoaXMgaXMgdGhlIGxhc3QgYXRvbSB3ZSBwYXJzZSwgd2UgZG9uJ3Qgc2tpcCBmb3J3YXJkICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorbW9vdl9yZWNvdl9wYXJzZV9taW5mIChNb292UmVjb3ZGaWxlICogbW9vdnJmLCBUcmFrUmVjb3ZEYXRhICogdHJha3JkKQoreworICBndWludDMyIHNpemU7CisgIGd1aW50MzIgZm91cmNjOworICBndWludDMyIGF1eHNpemU7CisKKyAgaWYgKCFyZWFkX2F0b21faGVhZGVyIChtb292cmYtPmZpbGUsICZmb3VyY2MsICZzaXplKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX21pbmYpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHRyYWtyZC0+bWluZl9maWxlX29mZnNldCA9IGZ0ZWxsIChtb292cmYtPmZpbGUpIC0gODsKKyAgdHJha3JkLT5taW5mX3NpemUgPSBzaXplOworCisgIC8qIHNraXAgZWl0aGVyIG9mIHZtaGQsIHNtaGQsIGhtaGQgdGhhdCBtaWdodCBmb2xsb3cgKi8KKyAgaWYgKCFyZWFkX2F0b21faGVhZGVyIChtb292cmYtPmZpbGUsICZmb3VyY2MsICZhdXhzaXplKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX3ZtaGQgJiYgZm91cmNjICE9IEZPVVJDQ19zbWhkICYmIGZvdXJjYyAhPSBGT1VSQ0NfaG1oZCAmJgorICAgICAgZm91cmNjICE9IEZPVVJDQ19nbWhkKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKGZzZWVrIChtb292cmYtPmZpbGUsIGF1eHNpemUgLSA4LCBTRUVLX0NVUikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIHNraXAgYSBwb3NzaWJsZSBoZGxyIGFuZCB0aGUgZm9sbG93aW5nIGRpbmYgKi8KKyAgaWYgKCFyZWFkX2F0b21faGVhZGVyIChtb292cmYtPmZpbGUsICZmb3VyY2MsICZhdXhzaXplKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChmb3VyY2MgPT0gRk9VUkNDX2hkbHIpIHsKKyAgICBpZiAoZnNlZWsgKG1vb3ZyZi0+ZmlsZSwgYXV4c2l6ZSAtIDgsIFNFRUtfQ1VSKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIXJlYWRfYXRvbV9oZWFkZXIgKG1vb3ZyZi0+ZmlsZSwgJmZvdXJjYywgJmF1eHNpemUpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX2RpbmYpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoZnNlZWsgKG1vb3ZyZi0+ZmlsZSwgYXV4c2l6ZSAtIDgsIFNFRUtfQ1VSKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogbm93IHdlIGFyZSByZWFkeSB0byByZWFkIHRoZSBzdGJsICovCisgIGlmICghbW9vdl9yZWNvdl9wYXJzZV9zdGJsIChtb292cmYsIHRyYWtyZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK21vb3ZfcmVjb3ZfcGFyc2VfbWRoZCAoTW9vdlJlY292RmlsZSAqIG1vb3ZyZiwgVHJha1JlY292RGF0YSAqIHRyYWtyZCkKK3sKKyAgZ3VpbnQzMiBzaXplOworICBndWludDMyIGZvdXJjYzsKKyAgZ3VpbnQ4IGRhdGFbNF07CisKKyAgLyogbWFrZSBzdXJlIHdlIGFyZSBvbiBhIHRraGQgYXRvbSAqLworICBpZiAoIXJlYWRfYXRvbV9oZWFkZXIgKG1vb3ZyZi0+ZmlsZSwgJmZvdXJjYywgJnNpemUpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKGZvdXJjYyAhPSBGT1VSQ0NfbWRoZCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgdHJha3JkLT5tZGhkX2ZpbGVfb2Zmc2V0ID0gZnRlbGwgKG1vb3ZyZi0+ZmlsZSkgLSA4OworCisgIC8qIGdldCB0aGUgdGltZXNjYWxlICovCisgIGlmIChmc2VlayAobW9vdnJmLT5maWxlLCAxMiwgU0VFS19DVVIpICE9IDApCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoZnJlYWQgKGRhdGEsIDEsIDQsIG1vb3ZyZi0+ZmlsZSkgIT0gNCkKKyAgICByZXR1cm4gRkFMU0U7CisgIHRyYWtyZC0+dGltZXNjYWxlID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhKTsKKyAgaWYgKGZzZWVrIChtb292cmYtPmZpbGUsIDgsIFNFRUtfQ1VSKSAhPSAwKQorICAgIHJldHVybiBGQUxTRTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorbW9vdl9yZWNvdl9wYXJzZV9tZGlhIChNb292UmVjb3ZGaWxlICogbW9vdnJmLCBUcmFrUmVjb3ZEYXRhICogdHJha3JkKQoreworICBndWludDMyIHNpemU7CisgIGd1aW50MzIgZm91cmNjOworCisgIC8qIG1ha2Ugc3VyZSB3ZSBhcmUgb24gYSB0a2hkIGF0b20gKi8KKyAgaWYgKCFyZWFkX2F0b21faGVhZGVyIChtb292cmYtPmZpbGUsICZmb3VyY2MsICZzaXplKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX21kaWEpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHRyYWtyZC0+bWRpYV9maWxlX29mZnNldCA9IGZ0ZWxsIChtb292cmYtPmZpbGUpIC0gODsKKyAgdHJha3JkLT5tZGlhX3NpemUgPSBzaXplOworCisgIGlmICghbW9vdl9yZWNvdl9wYXJzZV9tZGhkIChtb292cmYsIHRyYWtyZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghc2tpcF9hdG9tIChtb292cmYsIEZPVVJDQ19oZGxyKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghbW9vdl9yZWNvdl9wYXJzZV9taW5mIChtb292cmYsIHRyYWtyZCkpCisgICAgcmV0dXJuIEZBTFNFOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCittb292X3JlY292X3BhcnNlX3RyYWsgKE1vb3ZSZWNvdkZpbGUgKiBtb292cmYsIFRyYWtSZWNvdkRhdGEgKiB0cmFrcmQpCit7CisgIGd1aW50NjQgb2Zmc2V0OworICBndWludDMyIHNpemU7CisgIGd1aW50MzIgZm91cmNjOworCisgIG9mZnNldCA9IGZ0ZWxsIChtb292cmYtPmZpbGUpOworICBpZiAob2Zmc2V0ID09IC0xKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogbWFrZSBzdXJlIHdlIGFyZSBvbiBhIHRyYWsgYXRvbSAqLworICBpZiAoIXJlYWRfYXRvbV9oZWFkZXIgKG1vb3ZyZi0+ZmlsZSwgJmZvdXJjYywgJnNpemUpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX3RyYWspIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgdHJha3JkLT50cmFrX3NpemUgPSBzaXplOworCisgIC8qIG5vdyB3ZSBzaG91bGQgaGF2ZSBhIHRyYWsgaGVhZGVyICd0a2hkJyAqLworICBpZiAoIW1vb3ZfcmVjb3ZfcGFyc2VfdGtoZCAobW9vdnJmLCB0cmFrcmQpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBGSVhNRSBhZGQgZWR0cyBoYW5kbGluZyBoZXJlIGFuZCBpbiBxdG11eCwgYXMgdGhpcyBpcyBvbmx5IGRldGVjdGVkCisgICAqIGFmdGVyIGJ1ZmZlcnMgc3RhcnQgZmxvd2luZyAqLworCisgIGlmICghbW9vdl9yZWNvdl9wYXJzZV9tZGlhIChtb292cmYsIHRyYWtyZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChmc2VlayAobW9vdnJmLT5maWxlLAorICAgICAgICAgIChsb25nIGludCkgdHJha3JkLT5tZGlhX2ZpbGVfb2Zmc2V0ICsgdHJha3JkLT5tZGlhX3NpemUsCisgICAgICAgICAgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIHRyYWtyZC0+ZXh0cmFfYXRvbXNfb2Zmc2V0ID0gZnRlbGwgKG1vb3ZyZi0+ZmlsZSk7CisgIHRyYWtyZC0+ZXh0cmFfYXRvbXNfc2l6ZSA9IHNpemUgLSAodHJha3JkLT5leHRyYV9hdG9tc19vZmZzZXQgLSBvZmZzZXQpOworCisgIHRyYWtyZC0+ZmlsZV9vZmZzZXQgPSBvZmZzZXQ7CisgIC8qIHBvc2l0aW9uIGFmdGVyIHRoZSB0cmFrICovCisgIHJldHVybiBmc2VlayAobW9vdnJmLT5maWxlLCAobG9uZyBpbnQpIG9mZnNldCArIHNpemUsIFNFRUtfU0VUKSA9PSAwOworfQorCitNb292UmVjb3ZGaWxlICoKK21vb3ZfcmVjb3ZfZmlsZV9jcmVhdGUgKEZJTEUgKiBmaWxlLCBHRXJyb3IgKiogZXJyKQoreworICBnaW50IGk7CisgIE1vb3ZSZWNvdkZpbGUgKm1vb3ZyZiA9IGdfbmV3MCAoTW9vdlJlY292RmlsZSwgMSk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGZpbGUgIT0gTlVMTCwgTlVMTCk7CisKKyAgbW9vdnJmLT5maWxlID0gZmlsZTsKKworICAvKiBsb29rIGZvciBmdHlwIGFuZCBwcmVmaXggYXQgdGhlIHN0YXJ0ICovCisgIGlmICghbW9vdl9yZWNvdl9maWxlX3BhcnNlX3ByZWZpeCAobW9vdnJmKSkgeworICAgIGdfc2V0X2Vycm9yIChlcnIsIEFUT01TX1JFQ09WX1FVQVJLLCBBVE9NU19SRUNPVl9FUlJfUEFSU0lORywKKyAgICAgICAgIkVycm9yIHdoaWxlIHBhcnNpbmcgcHJlZml4IGF0b21zIik7CisgICAgZ290byBmYWlsOworICB9CisKKyAgLyogcGFyc2UgdGhlIG12aGQgKi8KKyAgaWYgKCFtb292X3JlY292X2ZpbGVfcGFyc2VfbXZoZCAobW9vdnJmKSkgeworICAgIGdfc2V0X2Vycm9yIChlcnIsIEFUT01TX1JFQ09WX1FVQVJLLCBBVE9NU19SRUNPVl9FUlJfUEFSU0lORywKKyAgICAgICAgIkVycm9yIHdoaWxlIHBhcnNpbmcgbXZoZCBhdG9tIik7CisgICAgZ290byBmYWlsOworICB9CisKKyAgaWYgKCFtb292X3JlY292X3BhcnNlX21vb3ZfdGltZXNjYWxlIChtb292cmYpKSB7CisgICAgZ19zZXRfZXJyb3IgKGVyciwgQVRPTVNfUkVDT1ZfUVVBUkssIEFUT01TX1JFQ09WX0VSUl9QQVJTSU5HLAorICAgICAgICAiRXJyb3Igd2hpbGUgcGFyc2luZyB0aW1lc2NhbGUiKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KKyAgaWYgKCFtb292X3JlY292X3BhcnNlX251bV90cmFrcyAobW9vdnJmKSkgeworICAgIGdfc2V0X2Vycm9yIChlcnIsIEFUT01TX1JFQ09WX1FVQVJLLCBBVE9NU19SRUNPVl9FUlJfUEFSU0lORywKKyAgICAgICAgIkVycm9yIHdoaWxlIHBhcnNpbmcgcGFyc2luZyBudW1iZXIgb2YgdHJha3MiKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KKworICAvKiBzYW5pdHkgY2hlY2sgKi8KKyAgaWYgKG1vb3ZyZi0+bnVtX3RyYWtzID4gMTAyNCkgeworICAgIGdfc2V0X2Vycm9yIChlcnIsIEFUT01TX1JFQ09WX1FVQVJLLCBBVE9NU19SRUNPVl9FUlJfUEFSU0lORywKKyAgICAgICAgIlVuc3VwcG9ydGVkIG51bWJlciBvZiB0cmFrcyIpOworICAgIGdvdG8gZmFpbDsKKyAgfQorCisgIC8qIGluaXQgdGhlIHRyYWtzICovCisgIG1vb3ZyZi0+dHJha3NfcmQgPSBnX25ldzAgKFRyYWtSZWNvdkRhdGEsIG1vb3ZyZi0+bnVtX3RyYWtzKTsKKyAgZm9yIChpID0gMDsgaSA8IG1vb3ZyZi0+bnVtX3RyYWtzOyBpKyspIHsKKyAgICBhdG9tX3N0YmxfaW5pdCAoJihtb292cmYtPnRyYWtzX3JkW2ldLnN0YmwpKTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgbW9vdnJmLT5udW1fdHJha3M7IGkrKykgeworICAgIGlmICghbW9vdl9yZWNvdl9wYXJzZV90cmFrIChtb292cmYsICYobW9vdnJmLT50cmFrc19yZFtpXSkpKSB7CisgICAgICBnX3NldF9lcnJvciAoZXJyLCBBVE9NU19SRUNPVl9RVUFSSywgQVRPTVNfUkVDT1ZfRVJSX1BBUlNJTkcsCisgICAgICAgICAgIkVycm9yIHdoaWxlIHBhcnNpbmcgdHJhayBhdG9tIik7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG1vb3ZyZjsKKworZmFpbDoKKyAgbW9vdl9yZWNvdl9maWxlX2ZyZWUgKG1vb3ZyZik7CisgIHJldHVybiBOVUxMOworfQorCit2b2lkCittb292X3JlY292X2ZpbGVfZnJlZSAoTW9vdlJlY292RmlsZSAqIG1vb3ZyZikKK3sKKyAgZ2ludCBpOworICBmY2xvc2UgKG1vb3ZyZi0+ZmlsZSk7CisgIGlmIChtb292cmYtPnRyYWtzX3JkKSB7CisgICAgZm9yIChpID0gMDsgaSA8IG1vb3ZyZi0+bnVtX3RyYWtzOyBpKyspIHsKKyAgICAgIGF0b21fc3RibF9jbGVhciAoJihtb292cmYtPnRyYWtzX3JkW2ldLnN0YmwpKTsKKyAgICB9CisgICAgZ19mcmVlIChtb292cmYtPnRyYWtzX3JkKTsKKyAgfQorICBnX2ZyZWUgKG1vb3ZyZik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorbW9vdl9yZWNvdl9wYXJzZV9idWZmZXJfZW50cnkgKE1vb3ZSZWNvdkZpbGUgKiBtb292cmYsIFRyYWtCdWZmZXJFbnRyeUluZm8gKiBiKQoreworICBndWludDggZGF0YVtUUkFLX0JVRkZFUl9FTlRSWV9JTkZPX1NJWkVdOworICBnaW50IHJlYWQ7CisKKyAgcmVhZCA9IGZyZWFkIChkYXRhLCAxLCBUUkFLX0JVRkZFUl9FTlRSWV9JTkZPX1NJWkUsIG1vb3ZyZi0+ZmlsZSk7CisgIGlmIChyZWFkICE9IFRSQUtfQlVGRkVSX0VOVFJZX0lORk9fU0laRSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgYi0+dHJhY2tfaWQgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEpOworICBiLT5uc2FtcGxlcyA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoZGF0YSArIDQpOworICBiLT5kZWx0YSA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoZGF0YSArIDgpOworICBiLT5zaXplID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhICsgMTIpOworICBiLT5jaHVua19vZmZzZXQgPSBHU1RfUkVBRF9VSU5UNjRfQkUgKGRhdGEgKyAxNik7CisgIGItPnN5bmMgPSBkYXRhWzI0XSAhPSAwOworICBiLT5kb19wdHMgPSBkYXRhWzI1XSAhPSAwOworICBiLT5wdHNfb2Zmc2V0ID0gR1NUX1JFQURfVUlOVDY0X0JFIChkYXRhICsgMjYpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCittZGF0X3JlY292X2FkZF9zYW1wbGUgKE1kYXRSZWNvdkZpbGUgKiBtZGF0cmYsIGd1aW50MzIgc2l6ZSkKK3sKKyAgLyogdGVzdCBpZiB0aGlzIGRhdGEgZXhpc3RzICovCisgIGlmIChtZGF0cmYtPm1kYXRfc2l6ZSAtIG1kYXRyZi0+bWRhdF9oZWFkZXJfc2l6ZSArIHNpemUgPiBtZGF0cmYtPmRhdGFfc2l6ZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbWRhdHJmLT5tZGF0X3NpemUgKz0gc2l6ZTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBUcmFrUmVjb3ZEYXRhICoKK21vb3ZfcmVjb3ZfZ2V0X3RyYWsgKE1vb3ZSZWNvdkZpbGUgKiBtb292cmYsIGd1aW50MzIgaWQpCit7CisgIGdpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1vb3ZyZi0+bnVtX3RyYWtzOyBpKyspIHsKKyAgICBpZiAobW9vdnJmLT50cmFrc19yZFtpXS50cmFrX2lkID09IGlkKQorICAgICAgcmV0dXJuICYobW9vdnJmLT50cmFrc19yZFtpXSk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCit0cmFrX3JlY292X2RhdGFfYWRkX3NhbXBsZSAoVHJha1JlY292RGF0YSAqIHRyYWssIFRyYWtCdWZmZXJFbnRyeUluZm8gKiBiKQoreworICB0cmFrLT5kdXJhdGlvbiArPSBiLT5uc2FtcGxlcyAqIGItPmRlbHRhOworICBhdG9tX3N0YmxfYWRkX3NhbXBsZXMgKCZ0cmFrLT5zdGJsLCBiLT5uc2FtcGxlcywgYi0+ZGVsdGEsIGItPnNpemUsCisgICAgICBiLT5jaHVua19vZmZzZXQsIGItPnN5bmMsIGItPnB0c19vZmZzZXQpOworfQorCisvKgorICogUGFyc2VzIHRoZSBidWZmZXIgZW50cmllcyBpbiB0aGUgTW9vdlJlY292RmlsZSBhbmQgbWF0Y2hlcyB0aGUgaW5wdXRzCisgKiB3aXRoIHRoZSBkYXRhIGluIHRoZSBNZGF0UmVjb3ZGaWxlLiBXaGVuZXZlciBhIGJ1ZmZlciBlbnRyeSBvZiB0aGF0CisgKiByZXByZXNlbnRzICd4JyBieXRlcyBvZiBkYXRhLCB0aGUgc2FtZSBhbW91bnQgb2YgZGF0YSBpcyAndmFsaWRhdGVkJyBpbgorICogdGhlIE1kYXRSZWNvdkZpbGUgYW5kIHdpbGwgYmUgaW5sdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIG1vb3ZpZSBmaWxlLgorICovCitnYm9vbGVhbgorbW9vdl9yZWNvdl9wYXJzZV9idWZmZXJzIChNb292UmVjb3ZGaWxlICogbW9vdnJmLCBNZGF0UmVjb3ZGaWxlICogbWRhdHJmLAorICAgIEdFcnJvciAqKiBlcnIpCit7CisgIFRyYWtCdWZmZXJFbnRyeUluZm8gZW50cnk7CisgIFRyYWtSZWNvdkRhdGEgKnRyYWs7CisKKyAgLyogd2UgYXNzdW1lIGJvdGggbW9vdnJmIGFuZCBtZGF0cmYgYXJlIGF0IHRoZSBzdGFydGluZyBwb2ludHMgb2YgdGhlaXIKKyAgICogZGF0YSByZWFkaW5nICovCisgIHdoaWxlIChtb292X3JlY292X3BhcnNlX2J1ZmZlcl9lbnRyeSAobW9vdnJmLCAmZW50cnkpKSB7CisgICAgLyogYmUgc3VyZSB3ZSBzdGlsbCBoYXZlIHRoaXMgZGF0YSBpbiBtZGF0ICovCisgICAgdHJhayA9IG1vb3ZfcmVjb3ZfZ2V0X3RyYWsgKG1vb3ZyZiwgZW50cnkudHJhY2tfaWQpOworICAgIGlmICh0cmFrID09IE5VTEwpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnIsIEFUT01TX1JFQ09WX1FVQVJLLCBBVE9NU19SRUNPVl9FUlJfUEFSU0lORywKKyAgICAgICAgICAiSW52YWxpZCB0cmFrIGlkIGZvdW5kIGluIGJ1ZmZlciBlbnRyeSIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAoIW1kYXRfcmVjb3ZfYWRkX3NhbXBsZSAobWRhdHJmLCBlbnRyeS5zaXplKSkKKyAgICAgIGJyZWFrOworICAgIHRyYWtfcmVjb3ZfZGF0YV9hZGRfc2FtcGxlICh0cmFrLCAmZW50cnkpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ3VpbnQzMgordHJha19yZWNvdl9kYXRhX2dldF90cmFrX2F0b21fc2l6ZSAoVHJha1JlY292RGF0YSAqIHRyYWspCit7CisgIEF0b21TVEJMICpzdGJsID0gJnRyYWstPnN0Ymw7CisgIGd1aW50NjQgb2Zmc2V0OworCisgIC8qIHdyaXRlIG91dCBvdXIgc3RibCBjaGlsZCBhdG9tcyAqLworICBvZmZzZXQgPSAwOworCisgIGlmICghYXRvbV9zdHRzX2NvcHlfZGF0YSAoJnN0YmwtPnN0dHMsIE5VTEwsIE5VTEwsICZvZmZzZXQpKSB7CisgICAgZ290byBmYWlsOworICB9CisgIGlmIChhdG9tX2FycmF5X2dldF9sZW4gKCZzdGJsLT5zdHNzLmVudHJpZXMpID4gMCkgeworICAgIGlmICghYXRvbV9zdHNzX2NvcHlfZGF0YSAoJnN0YmwtPnN0c3MsIE5VTEwsIE5VTEwsICZvZmZzZXQpKSB7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorICB9CisgIGlmICghYXRvbV9zdHNjX2NvcHlfZGF0YSAoJnN0YmwtPnN0c2MsIE5VTEwsIE5VTEwsICZvZmZzZXQpKSB7CisgICAgZ290byBmYWlsOworICB9CisgIGlmICghYXRvbV9zdHN6X2NvcHlfZGF0YSAoJnN0YmwtPnN0c3osIE5VTEwsIE5VTEwsICZvZmZzZXQpKSB7CisgICAgZ290byBmYWlsOworICB9CisgIGlmIChzdGJsLT5jdHRzKSB7CisgICAgaWYgKCFhdG9tX2N0dHNfY29weV9kYXRhIChzdGJsLT5jdHRzLCBOVUxMLCBOVUxMLCAmb2Zmc2V0KSkgeworICAgICAgZ290byBmYWlsOworICAgIH0KKyAgfQorICBpZiAoIWF0b21fc3RjbzY0X2NvcHlfZGF0YSAoJnN0YmwtPnN0Y282NCwgTlVMTCwgTlVMTCwgJm9mZnNldCkpIHsKKyAgICBnb3RvIGZhaWw7CisgIH0KKworICByZXR1cm4gdHJhay0+dHJha19zaXplICsgKCh0cmFrLT5zdHNkX3NpemUgKyBvZmZzZXQgKyA4KSAtIHRyYWstPnN0Ymxfc2l6ZSk7CisKK2ZhaWw6CisgIHJldHVybiAwOworfQorCitzdGF0aWMgZ3VpbnQ4ICoKK21vb3ZfcmVjb3ZfZ2V0X3N0YmxfY2hpbGRyZW5fZGF0YSAoTW9vdlJlY292RmlsZSAqIG1vb3ZyZiwgVHJha1JlY292RGF0YSAqIHRyYWssCisgICAgZ3VpbnQ2NCAqIHBfc2l6ZSkKK3sKKyAgQXRvbVNUQkwgKnN0YmwgPSAmdHJhay0+c3RibDsKKyAgZ3VpbnQ4ICpidWZmZXI7CisgIGd1aW50NjQgc2l6ZTsKKyAgZ3VpbnQ2NCBvZmZzZXQ7CisKKyAgLyogd3JpdGUgb3V0IG91ciBzdGJsIGNoaWxkIGF0b21zCisgICAqCisgICAqIFVzZSAxTUIgYXMgYSBzdGFydGluZyBzaXplLCAqX2NvcHlfZGF0YSBmdW5jdGlvbnMKKyAgICogd2lsbCBncm93IHRoZSBidWZmZXIgaWYgbmVlZGVkLgorICAgKi8KKyAgc2l6ZSA9IDEwMjQgKiAxMDI0OworICBidWZmZXIgPSBnX21hbGxvYzAgKHNpemUpOworICBvZmZzZXQgPSAwOworCisgIGlmICghYXRvbV9zdHRzX2NvcHlfZGF0YSAoJnN0YmwtPnN0dHMsICZidWZmZXIsICZzaXplLCAmb2Zmc2V0KSkgeworICAgIGdvdG8gZmFpbDsKKyAgfQorICBpZiAoYXRvbV9hcnJheV9nZXRfbGVuICgmc3RibC0+c3Rzcy5lbnRyaWVzKSA+IDApIHsKKyAgICBpZiAoIWF0b21fc3Rzc19jb3B5X2RhdGEgKCZzdGJsLT5zdHNzLCAmYnVmZmVyLCAmc2l6ZSwgJm9mZnNldCkpIHsKKyAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgIH0KKyAgaWYgKCFhdG9tX3N0c2NfY29weV9kYXRhICgmc3RibC0+c3RzYywgJmJ1ZmZlciwgJnNpemUsICZvZmZzZXQpKSB7CisgICAgZ290byBmYWlsOworICB9CisgIGlmICghYXRvbV9zdHN6X2NvcHlfZGF0YSAoJnN0YmwtPnN0c3osICZidWZmZXIsICZzaXplLCAmb2Zmc2V0KSkgeworICAgIGdvdG8gZmFpbDsKKyAgfQorICBpZiAoc3RibC0+Y3R0cykgeworICAgIGlmICghYXRvbV9jdHRzX2NvcHlfZGF0YSAoc3RibC0+Y3R0cywgJmJ1ZmZlciwgJnNpemUsICZvZmZzZXQpKSB7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorICB9CisgIGlmICghYXRvbV9zdGNvNjRfY29weV9kYXRhICgmc3RibC0+c3RjbzY0LCAmYnVmZmVyLCAmc2l6ZSwgJm9mZnNldCkpIHsKKyAgICBnb3RvIGZhaWw7CisgIH0KKyAgKnBfc2l6ZSA9IG9mZnNldDsKKyAgcmV0dXJuIGJ1ZmZlcjsKKworZmFpbDoKKyAgZ19mcmVlIChidWZmZXIpOworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGdib29sZWFuCitjb3B5X2RhdGFfZnJvbV9maWxlX3RvX2ZpbGUgKEZJTEUgKiBmcm9tLCBndWludCBwb3NpdGlvbiwgZ3VpbnQgc2l6ZSwgRklMRSAqIHRvLAorICAgIEdFcnJvciAqKiBlcnIpCit7CisgIGd1aW50OCAqZGF0YSA9IE5VTEw7CisKKyAgaWYgKGZzZWVrIChmcm9tLCBwb3NpdGlvbiwgU0VFS19TRVQpICE9IDApCisgICAgZ290byBmYWlsOworICBkYXRhID0gZ19tYWxsb2MgKHNpemUpOworICBpZiAoZnJlYWQgKGRhdGEsIDEsIHNpemUsIGZyb20pICE9IHNpemUpIHsKKyAgICBnb3RvIGZhaWw7CisgIH0KKyAgaWYgKGZ3cml0ZSAoZGF0YSwgMSwgc2l6ZSwgdG8pICE9IHNpemUpIHsKKyAgICBBVE9NU19SRUNPVl9PVVRQVVRfV1JJVEVfRVJST1IgKGVycik7CisgICAgZ290byBmYWlsOworICB9CisKKyAgZ19mcmVlIChkYXRhKTsKKyAgcmV0dXJuIFRSVUU7CisKK2ZhaWw6CisgIGdfZnJlZSAoZGF0YSk7CisgIHJldHVybiBGQUxTRTsKK30KKworZ2Jvb2xlYW4KK21vb3ZfcmVjb3Zfd3JpdGVfZmlsZSAoTW9vdlJlY292RmlsZSAqIG1vb3ZyZiwgTWRhdFJlY292RmlsZSAqIG1kYXRyZiwKKyAgICBGSUxFICogb3V0ZiwgR0Vycm9yICoqIGVyciwgR0Vycm9yICoqIHdhcm4pCit7CisgIGd1aW50OCBhdXhkYXRhWzE2XTsKKyAgZ3VpbnQ4ICpkYXRhID0gTlVMTDsKKyAgZ3VpbnQ4ICpwcmVmaXhfZGF0YSA9IE5VTEw7CisgIGd1aW50OCAqbXZoZF9kYXRhID0gTlVMTDsKKyAgZ3VpbnQ4ICp0cmFrX2RhdGEgPSBOVUxMOworICBndWludDMyIG1vb3Zfc2l6ZSA9IDA7CisgIGdpbnQgaTsKKyAgZ3VpbnQ2NCBzdGJsX2NoaWxkcmVuX3NpemUgPSAwOworICBndWludDggKnN0YmxfY2hpbGRyZW4gPSBOVUxMOworICBndWludDMyIGxvbmdlc3RfZHVyYXRpb24gPSAwOworICBndWludDE2IHZlcnNpb247CisgIGd1aW50IHJlbWFpbmluZzsKKworICAvKiBjaGVjayB0aGUgdmVyc2lvbiAqLworICBpZiAoZnNlZWsgKG1vb3ZyZi0+ZmlsZSwgMCwgU0VFS19TRVQpICE9IDApIHsKKyAgICBnX3NldF9lcnJvciAoZXJyLCBBVE9NU19SRUNPVl9RVUFSSywgQVRPTVNfUkVDT1ZfRVJSX0ZJTEUsCisgICAgICAgICJGYWlsZWQgdG8gc2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIG1vb3YgcmVjb3ZlcnkgZmlsZSIpOworICAgIGdvdG8gZmFpbDsKKyAgfQorICBpZiAoZnJlYWQgKGF1eGRhdGEsIDEsIDIsIG1vb3ZyZi0+ZmlsZSkgIT0gMikgeworICAgIGdfc2V0X2Vycm9yIChlcnIsIEFUT01TX1JFQ09WX1FVQVJLLCBBVE9NU19SRUNPVl9FUlJfRklMRSwKKyAgICAgICAgIkZhaWxlZCB0byByZWFkIHZlcnNpb24gZnJvbSBmaWxlIik7CisgIH0KKworICB2ZXJzaW9uID0gR1NUX1JFQURfVUlOVDE2X0JFIChhdXhkYXRhKTsKKyAgaWYgKHZlcnNpb24gIT0gQVRPTVNfUkVDT1ZfRklMRV9WRVJTSU9OKSB7CisgICAgZ19zZXRfZXJyb3IgKGVyciwgQVRPTVNfUkVDT1ZfUVVBUkssIEFUT01TX1JFQ09WX0VSUl9WRVJTSU9OLAorICAgICAgICAiSW5wdXQgZmlsZSB2ZXJzaW9uICgldSkgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24gKCV1KSIsCisgICAgICAgIHZlcnNpb24sIEFUT01TX1JFQ09WX0ZJTEVfVkVSU0lPTik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogd3JpdGUgdGhlIGZ0eXAgKi8KKyAgcHJlZml4X2RhdGEgPSBnX21hbGxvYyAobW9vdnJmLT5wcmVmaXhfc2l6ZSk7CisgIGlmIChmcmVhZCAocHJlZml4X2RhdGEsIDEsIG1vb3ZyZi0+cHJlZml4X3NpemUsCisgICAgICAgICAgbW9vdnJmLT5maWxlKSAhPSBtb292cmYtPnByZWZpeF9zaXplKSB7CisgICAgZ19zZXRfZXJyb3IgKGVyciwgQVRPTVNfUkVDT1ZfUVVBUkssIEFUT01TX1JFQ09WX0VSUl9GSUxFLAorICAgICAgICAiRmFpbGVkIHRvIHJlYWQgdGhlIGZ0eXAgYXRvbSBmcm9tIGZpbGUiKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KKyAgaWYgKGZ3cml0ZSAocHJlZml4X2RhdGEsIDEsIG1vb3ZyZi0+cHJlZml4X3NpemUsIG91dGYpICE9IG1vb3ZyZi0+cHJlZml4X3NpemUpIHsKKyAgICBBVE9NU19SRUNPVl9PVVRQVVRfV1JJVEVfRVJST1IgKGVycik7CisgICAgZ290byBmYWlsOworICB9CisgIGdfZnJlZSAocHJlZml4X2RhdGEpOworICBwcmVmaXhfZGF0YSA9IE5VTEw7CisKKyAgLyogbmVlZCB0byBjYWxjdWxhdGUgdGhlIG1vb3Ygc2l6ZSBiZWZvcmVoYW5kIHRvIGFkZCB0aGUgb2Zmc2V0IHRvCisgICAqIGNodW5rIG9mZnNldCBlbnRyaWVzICovCisgIG1vb3Zfc2l6ZSArPSBtb292cmYtPm12aGRfc2l6ZSArIDg7ICAgLyogbXZoZCArIG1vb3Ygc2l6ZSArIGZvdXJjYyAqLworICBmb3IgKGkgPSAwOyBpIDwgbW9vdnJmLT5udW1fdHJha3M7IGkrKykgeworICAgIFRyYWtSZWNvdkRhdGEgKnRyYWsgPSAmKG1vb3ZyZi0+dHJha3NfcmRbaV0pOworICAgIGd1aW50MzIgZHVyYXRpb247ICAgICAgICAgICAvKiBpbiBtb292J3MgdGltZXNjYWxlICovCisgICAgZ3VpbnQzMiB0cmFrX3NpemU7CisKKyAgICAvKiBjb252ZXJ0IHRyYWsgZHVyYXRpb24gdG8gbW9vdidzIGR1cmF0aW9uICovCisgICAgZHVyYXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKHRyYWstPmR1cmF0aW9uLCBtb292cmYtPnRpbWVzY2FsZSwKKyAgICAgICAgdHJhay0+dGltZXNjYWxlKTsKKworICAgIGlmIChkdXJhdGlvbiA+IGxvbmdlc3RfZHVyYXRpb24pCisgICAgICBsb25nZXN0X2R1cmF0aW9uID0gZHVyYXRpb247CisgICAgdHJha19zaXplID0gdHJha19yZWNvdl9kYXRhX2dldF90cmFrX2F0b21fc2l6ZSAodHJhayk7CisgICAgaWYgKHRyYWtfc2l6ZSA9PSAwKSB7CisgICAgICBnX3NldF9lcnJvciAoZXJyLCBBVE9NU19SRUNPVl9RVUFSSywgQVRPTVNfUkVDT1ZfRVJSX0dFTkVSSUMsCisgICAgICAgICAgIkZhaWxlZCB0byBlc3RpbWF0ZSB0cmFrIGF0b20gc2l6ZSIpOworICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBtb292X3NpemUgKz0gdHJha19zaXplOworICB9CisKKyAgLyogYWRkIGNodW5rcyBvZmZzZXRzICovCisgIGZvciAoaSA9IDA7IGkgPCBtb292cmYtPm51bV90cmFrczsgaSsrKSB7CisgICAgVHJha1JlY292RGF0YSAqdHJhayA9ICYobW9vdnJmLT50cmFrc19yZFtpXSk7CisgICAgLyogOCBvciAxNiBmb3IgdGhlIG1kYXQgaGVhZGVyICovCisgICAgZ2ludDY0IG9mZnNldCA9IG1vb3Zfc2l6ZSArIGZ0ZWxsIChvdXRmKSArIG1kYXRyZi0+bWRhdF9oZWFkZXJfc2l6ZTsKKyAgICBhdG9tX3N0Y282NF9jaHVua3Nfc2V0X29mZnNldCAoJnRyYWstPnN0Ymwuc3RjbzY0LCBvZmZzZXQpOworICB9CisKKyAgLyogd3JpdGUgdGhlIG1vb3YgKi8KKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoYXV4ZGF0YSwgbW9vdl9zaXplKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoYXV4ZGF0YSArIDQsIEZPVVJDQ19tb292KTsKKyAgaWYgKGZ3cml0ZSAoYXV4ZGF0YSwgMSwgOCwgb3V0ZikgIT0gOCkgeworICAgIEFUT01TX1JFQ09WX09VVFBVVF9XUklURV9FUlJPUiAoZXJyKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KKworICAvKiB3cml0ZSB0aGUgbXZoZCAqLworICBtdmhkX2RhdGEgPSBnX21hbGxvYyAobW9vdnJmLT5tdmhkX3NpemUpOworICBpZiAoZnNlZWsgKG1vb3ZyZi0+ZmlsZSwgbW9vdnJmLT5tdmhkX3BvcywgU0VFS19TRVQpICE9IDApCisgICAgZ290byBmYWlsOworICBpZiAoZnJlYWQgKG12aGRfZGF0YSwgMSwgbW9vdnJmLT5tdmhkX3NpemUsCisgICAgICAgICAgbW9vdnJmLT5maWxlKSAhPSBtb292cmYtPm12aGRfc2l6ZSkKKyAgICBnb3RvIGZhaWw7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKG12aGRfZGF0YSArIDIwLCBtb292cmYtPnRpbWVzY2FsZSk7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKG12aGRfZGF0YSArIDI0LCBsb25nZXN0X2R1cmF0aW9uKTsKKyAgaWYgKGZ3cml0ZSAobXZoZF9kYXRhLCAxLCBtb292cmYtPm12aGRfc2l6ZSwgb3V0ZikgIT0gbW9vdnJmLT5tdmhkX3NpemUpIHsKKyAgICBBVE9NU19SRUNPVl9PVVRQVVRfV1JJVEVfRVJST1IgKGVycik7CisgICAgZ290byBmYWlsOworICB9CisgIGdfZnJlZSAobXZoZF9kYXRhKTsKKyAgbXZoZF9kYXRhID0gTlVMTDsKKworICAvKiB3cml0ZSB0aGUgdHJha3MsIHRoaXMgaXMgdGhlIHRvdWdoIHBhcnQgYmVjYXVzZSB3ZSBuZWVkIHRvIHVwZGF0ZToKKyAgICogLSBzdGJsIGF0b20KKyAgICogLSBzaXplcyBvZiBhdG9tcyBmcm9tIHN0YmwgdG8gdHJhaworICAgKiAtIHRyYWsgZHVyYXRpb24KKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCBtb292cmYtPm51bV90cmFrczsgaSsrKSB7CisgICAgVHJha1JlY292RGF0YSAqdHJhayA9ICYobW9vdnJmLT50cmFrc19yZFtpXSk7CisgICAgZ3VpbnQgdHJha19kYXRhX3NpemU7CisgICAgZ3VpbnQzMiBzdGJsX25ld19zaXplOworICAgIGd1aW50MzIgbWluZl9uZXdfc2l6ZTsKKyAgICBndWludDMyIG1kaWFfbmV3X3NpemU7CisgICAgZ3VpbnQzMiB0cmFrX25ld19zaXplOworICAgIGd1aW50MzIgc2l6ZV9kaWZmOworICAgIGd1aW50MzIgZHVyYXRpb247ICAgICAgICAgICAvKiBpbiBtb292J3MgdGltZXNjYWxlICovCisKKyAgICAvKiBjb252ZXJ0IHRyYWsgZHVyYXRpb24gdG8gbW9vdidzIGR1cmF0aW9uICovCisgICAgZHVyYXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKHRyYWstPmR1cmF0aW9uLCBtb292cmYtPnRpbWVzY2FsZSwKKyAgICAgICAgdHJhay0+dGltZXNjYWxlKTsKKworICAgIHN0YmxfY2hpbGRyZW4gPSBtb292X3JlY292X2dldF9zdGJsX2NoaWxkcmVuX2RhdGEgKG1vb3ZyZiwgdHJhaywKKyAgICAgICAgJnN0YmxfY2hpbGRyZW5fc2l6ZSk7CisgICAgaWYgKHN0YmxfY2hpbGRyZW4gPT0gTlVMTCkKKyAgICAgIGdvdG8gZmFpbDsKKworICAgIC8qIGNhbGMgdGhlIG5ldyBzaXplIG9mIHRoZSBhdG9tcyBmcm9tIHN0YmwgdG8gdHJhayBpbiB0aGUgYXRvbXMgdHJlZSAqLworICAgIHN0YmxfbmV3X3NpemUgPSB0cmFrLT5zdHNkX3NpemUgKyBzdGJsX2NoaWxkcmVuX3NpemUgKyA4OworICAgIHNpemVfZGlmZiA9IHN0YmxfbmV3X3NpemUgLSB0cmFrLT5zdGJsX3NpemU7CisgICAgbWluZl9uZXdfc2l6ZSA9IHRyYWstPm1pbmZfc2l6ZSArIHNpemVfZGlmZjsKKyAgICBtZGlhX25ld19zaXplID0gdHJhay0+bWRpYV9zaXplICsgc2l6ZV9kaWZmOworICAgIHRyYWtfbmV3X3NpemUgPSB0cmFrLT50cmFrX3NpemUgKyBzaXplX2RpZmY7CisKKyAgICBpZiAoZnNlZWsgKG1vb3ZyZi0+ZmlsZSwgdHJhay0+ZmlsZV9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQorICAgICAgZ290byBmYWlsOworICAgIHRyYWtfZGF0YV9zaXplID0gdHJhay0+cG9zdF9zdHNkX29mZnNldCAtIHRyYWstPmZpbGVfb2Zmc2V0OworICAgIHRyYWtfZGF0YSA9IGdfbWFsbG9jICh0cmFrX2RhdGFfc2l6ZSk7CisgICAgaWYgKGZyZWFkICh0cmFrX2RhdGEsIDEsIHRyYWtfZGF0YV9zaXplLCBtb292cmYtPmZpbGUpICE9IHRyYWtfZGF0YV9zaXplKSB7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIC8qIHVwZGF0ZSB0aGUgc2l6ZSB2YWx1ZXMgaW4gdGhvc2UgcmVhZCBhdG9tcyBiZWZvcmUgd3JpdGluZyAqLworICAgIEdTVF9XUklURV9VSU5UMzJfQkUgKHRyYWtfZGF0YSwgdHJha19uZXdfc2l6ZSk7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9CRSAodHJha19kYXRhICsgKHRyYWstPm1kaWFfZmlsZV9vZmZzZXQgLQorICAgICAgICAgICAgdHJhay0+ZmlsZV9vZmZzZXQpLCBtZGlhX25ld19zaXplKTsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0JFICh0cmFrX2RhdGEgKyAodHJhay0+bWluZl9maWxlX29mZnNldCAtCisgICAgICAgICAgICB0cmFrLT5maWxlX29mZnNldCksIG1pbmZfbmV3X3NpemUpOworICAgIEdTVF9XUklURV9VSU5UMzJfQkUgKHRyYWtfZGF0YSArICh0cmFrLT5zdGJsX2ZpbGVfb2Zmc2V0IC0KKyAgICAgICAgICAgIHRyYWstPmZpbGVfb2Zmc2V0KSwgc3RibF9uZXdfc2l6ZSk7CisKKyAgICAvKiB1cGRhdGUgZHVyYXRpb24gdmFsdWVzIGluIHRraGQgYW5kIG1kaGQgKi8KKyAgICBHU1RfV1JJVEVfVUlOVDMyX0JFICh0cmFrX2RhdGEgKyAodHJhay0+dGtoZF9maWxlX29mZnNldCAtCisgICAgICAgICAgICB0cmFrLT5maWxlX29mZnNldCkgKyAyOCwgZHVyYXRpb24pOworICAgIEdTVF9XUklURV9VSU5UMzJfQkUgKHRyYWtfZGF0YSArICh0cmFrLT5tZGhkX2ZpbGVfb2Zmc2V0IC0KKyAgICAgICAgICAgIHRyYWstPmZpbGVfb2Zmc2V0KSArIDI0LCB0cmFrLT5kdXJhdGlvbik7CisKKyAgICBpZiAoZndyaXRlICh0cmFrX2RhdGEsIDEsIHRyYWtfZGF0YV9zaXplLCBvdXRmKSAhPSB0cmFrX2RhdGFfc2l6ZSkgeworICAgICAgQVRPTVNfUkVDT1ZfT1VUUFVUX1dSSVRFX0VSUk9SIChlcnIpOworICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoZndyaXRlIChzdGJsX2NoaWxkcmVuLCAxLCBzdGJsX2NoaWxkcmVuX3NpemUsIG91dGYpICE9CisgICAgICAgIHN0YmxfY2hpbGRyZW5fc2l6ZSkgeworICAgICAgQVRPTVNfUkVDT1ZfT1VUUFVUX1dSSVRFX0VSUk9SIChlcnIpOworICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGdfZnJlZSAodHJha19kYXRhKTsKKyAgICB0cmFrX2RhdGEgPSBOVUxMOworICAgIGdfZnJlZSAoc3RibF9jaGlsZHJlbik7CisgICAgc3RibF9jaGlsZHJlbiA9IE5VTEw7CisKKyAgICAvKiBDb3B5IHRoZSBleHRyYSBhdG9tcyBhZnRlciAnbWluZicgKi8KKyAgICBpZiAoIWNvcHlfZGF0YV9mcm9tX2ZpbGVfdG9fZmlsZSAobW9vdnJmLT5maWxlLCB0cmFrLT5leHRyYV9hdG9tc19vZmZzZXQsCisgICAgICAgICAgICB0cmFrLT5leHRyYV9hdG9tc19zaXplLCBvdXRmLCBlcnIpKQorICAgICAgZ290byBmYWlsOworICB9CisKKyAgLyogd3JpdGUgdGhlIG1kYXQgKi8KKyAgLyogd3JpdGUgdGhlIGhlYWRlciBmaXJzdCAqLworICBpZiAobWRhdHJmLT5tZGF0X2hlYWRlcl9zaXplID09IDE2KSB7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoYXV4ZGF0YSwgMSk7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoYXV4ZGF0YSArIDQsIEZPVVJDQ19tZGF0KTsKKyAgICBHU1RfV1JJVEVfVUlOVDY0X0JFIChhdXhkYXRhICsgOCwgbWRhdHJmLT5tZGF0X3NpemUpOworICB9IGVsc2UgaWYgKG1kYXRyZi0+bWRhdF9oZWFkZXJfc2l6ZSA9PSA4KSB7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoYXV4ZGF0YSwgbWRhdHJmLT5tZGF0X3NpemUpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGF1eGRhdGEgKyA0LCBGT1VSQ0NfbWRhdCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0VSUk9SICgiVW5leHBlY3RlZCBhdG9tIHNpemU6ICV1IiwgbWRhdHJmLT5tZGF0X2hlYWRlcl9zaXplKTsKKyAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KKworICBpZiAoZndyaXRlIChhdXhkYXRhLCAxLCBtZGF0cmYtPm1kYXRfaGVhZGVyX3NpemUsCisgICAgICAgICAgb3V0ZikgIT0gbWRhdHJmLT5tZGF0X2hlYWRlcl9zaXplKSB7CisgICAgQVRPTVNfUkVDT1ZfT1VUUFVUX1dSSVRFX0VSUk9SIChlcnIpOworICAgIGdvdG8gZmFpbDsKKyAgfQorCisgIC8qIG5vdyByZWFkIHRoZSBtZGF0IGRhdGEgYW5kIG91dHB1dCB0byB0aGUgZmlsZSAqLworICBpZiAoZnNlZWsgKG1kYXRyZi0+ZmlsZSwgbWRhdHJmLT5tZGF0X3N0YXJ0ICsKKyAgICAgICAgICAobWRhdHJmLT5yYXdmaWxlID8gMCA6IG1kYXRyZi0+bWRhdF9oZWFkZXJfc2l6ZSksIFNFRUtfU0VUKSAhPSAwKQorICAgIGdvdG8gZmFpbDsKKworICByZW1haW5pbmcgPSBtZGF0cmYtPm1kYXRfc2l6ZSAtIG1kYXRyZi0+bWRhdF9oZWFkZXJfc2l6ZTsKKyAgZGF0YSA9IGdfbWFsbG9jIChNQVhfQ0hVTktfU0laRSk7CisgIHdoaWxlICghZmVvZiAobWRhdHJmLT5maWxlKSAmJiByZW1haW5pbmcgPiAwKSB7CisgICAgZ2ludCByZWFkLCB3cml0ZSwgcmVhZHNpemU7CisKKyAgICByZWFkc2l6ZSA9IE1JTiAoTUFYX0NIVU5LX1NJWkUsIHJlbWFpbmluZyk7CisKKyAgICByZWFkID0gZnJlYWQgKGRhdGEsIDEsIHJlYWRzaXplLCBtZGF0cmYtPmZpbGUpOworICAgIHdyaXRlID0gZndyaXRlIChkYXRhLCAxLCByZWFkLCBvdXRmKTsKKyAgICByZW1haW5pbmcgLT0gcmVhZDsKKworICAgIGlmICh3cml0ZSAhPSByZWFkKSB7CisgICAgICBnX3NldF9lcnJvciAoZXJyLCBBVE9NU19SRUNPVl9RVUFSSywgQVRPTVNfUkVDT1ZfRVJSX0ZJTEUsCisgICAgICAgICAgIkZhaWxlZCB0byBjb3B5IGRhdGEgdG8gb3V0cHV0IGZpbGU6ICVzIiwgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgIH0KKyAgZ19mcmVlIChkYXRhKTsKKworICBpZiAocmVtYWluaW5nKSB7CisgICAgZ19zZXRfZXJyb3IgKHdhcm4sIEFUT01TX1JFQ09WX1FVQVJLLCBBVE9NU19SRUNPVl9FUlJfRklMRSwKKyAgICAgICAgIlNhbXBsZXMgaW4gcmVjb3ZlcnkgZmlsZSB3ZXJlIG5vdCBwcmVzZW50IG9uIGhlYWRlcnMuIgorICAgICAgICAiIEJ5dGVzIGxvc3Q6ICV1IiwgcmVtYWluaW5nKTsKKyAgfSBlbHNlIGlmICghZmVvZiAobWRhdHJmLT5maWxlKSkgeworICAgIGdfc2V0X2Vycm9yICh3YXJuLCBBVE9NU19SRUNPVl9RVUFSSywgQVRPTVNfUkVDT1ZfRVJSX0ZJTEUsCisgICAgICAgICJTYW1wbGVzIGluIGhlYWRlcnMgd2VyZSBub3QgZm91bmQgaW4gZGF0YSBmaWxlLiIpOworICAgIEdTVF9GSVhNRSAoIlJld3JpdGUgbWRhdCBzaXplIGlmIHdlIHJlYWNoIHRoaXMgdG8gbWFrZSB0aGUgZmlsZSIKKyAgICAgICAgIiBmdWxseSBjb3JyZWN0Iik7CisgIH0KKworICByZXR1cm4gVFJVRTsKKworZmFpbDoKKyAgZ19mcmVlIChzdGJsX2NoaWxkcmVuKTsKKyAgZ19mcmVlIChtdmhkX2RhdGEpOworICBnX2ZyZWUgKHByZWZpeF9kYXRhKTsKKyAgZ19mcmVlICh0cmFrX2RhdGEpOworICBnX2ZyZWUgKGRhdGEpOworICByZXR1cm4gRkFMU0U7Cit9CmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L2F0b21zcmVjb3ZlcnkuaCBiL2dzdC9pc29tcDQvYXRvbXNyZWNvdmVyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNDRjOWIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L2F0b21zcmVjb3ZlcnkuaApAQCAtMCwwICsxLDE2MiBAQAorLyogUXVpY2t0aW1lIG11eGVyIHBsdWdpbiBmb3IgR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qCisgKiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgU291cmNlIENvZGUgaXMgbGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2UuCisgKiBTZWUgZnVydGhlciBleHBsYW5hdGlvbiBhdHRhY2hlZCBpbiBMaWNlbnNlIFN0YXRlbWVudCAoZGlzdHJpYnV0ZWQgaW4gdGhlIGZpbGUKKyAqIExJQ0VOU0UpLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fQVRPTVNfUkVDT1ZFUllfSF9fCisjZGVmaW5lIF9fQVRPTVNfUkVDT1ZFUllfSF9fCisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJhdG9tcy5oIgorCisvKiBWZXJzaW9uIHRvIGJlIGluY3JlbWVudGVkIGVhY2ggdGltZSB3ZSBkZWNpZGUKKyAqIHRvIGNoYW5nZSB0aGUgZmlsZSBsYXlvdXQgKi8KKyNkZWZpbmUgQVRPTVNfUkVDT1ZfRklMRV9WRVJTSU9OICAgICAgICAgIDEKKworI2RlZmluZSBBVE9NU19SRUNPVl9RVUFSSyAoZ19xdWFya19mcm9tX3N0cmluZyAoInF0bXV4LWF0b21zLXJlY292ZXJ5IikpCisKKy8qIGdlcnJvciBlcnJvciBjb2RlcyAqLworI2RlZmluZSBBVE9NU19SRUNPVl9FUlJfR0VORVJJQyAgICAgICAgICAgMQorI2RlZmluZSBBVE9NU19SRUNPVl9FUlJfRklMRSAgICAgICAgICAgICAgMgorI2RlZmluZSBBVE9NU19SRUNPVl9FUlJfUEFSU0lORyAgICAgICAgICAgMworI2RlZmluZSBBVE9NU19SRUNPVl9FUlJfVkVSU0lPTiAgICAgICAgICAgNAorCisvKiB0aGlzIHN0cnVjdCByZXByZXNlbnRzIGVhY2ggYnVmZmVyIGluIGEgbW9vdiBmaWxlLCBjb250YWluaW5nIHRoZSBpbmZvCisgKiB0aGF0IGlzIHBsYWNlZCBpbiB0aGUgc3RzZCBjaGlsZHJlbiBhdG9tcworICogRmllbGRzIHNob3VsZCBiZSB3cml0ZW4gaW4gQkUgb3JkZXIsIGFuZCBib29sZWFucyBzaG91bGQgYmUgd3JpdGVuIGFzCisgKiAxYnl0ZSB3aXRoIDAgZm9yIGZhbHNlLCBhbnl0aGluZyBvdGhlcndpc2UgKi8KKyNkZWZpbmUgVFJBS19CVUZGRVJfRU5UUllfSU5GT19TSVpFIDM0Cit0eXBlZGVmIHN0cnVjdAoreworICBndWludDMyICAgdHJhY2tfaWQ7CisgIGd1aW50MzIgICBuc2FtcGxlczsKKyAgZ3VpbnQzMiAgIGRlbHRhOworICBndWludDMyICAgc2l6ZTsKKyAgZ3VpbnQ2NCAgIGNodW5rX29mZnNldDsKKyAgZ3VpbnQ2NCAgIHB0c19vZmZzZXQ7CisgIGdib29sZWFuICBzeW5jOworICBnYm9vbGVhbiAgZG9fcHRzOworfSBUcmFrQnVmZmVyRW50cnlJbmZvOworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludDMyIHRyYWtfaWQ7CisgIGd1aW50MzIgZHVyYXRpb247ICAvKiBkdXJhdGlvbiBpbiB0cmFrIHRpbWVzY2FsZSAqLworICBndWludDMyIHRpbWVzY2FsZTsgLyogdHJhaydzIHRpbWVzY2FsZSAqLworCisgIGd1aW50NjQgZmlsZV9vZmZzZXQ7CisKKyAgLyogbmVlZCBmb3IgbGF0ZXIgdXBkYXRpbmcgZHVyYXRpb24gKi8KKyAgZ3VpbnQ2NCB0a2hkX2ZpbGVfb2Zmc2V0OworICBndWludDY0IG1kaGRfZmlsZV9vZmZzZXQ7CisKKyAgLyogbmVlZCB0aGVzZSBvZmZzZXRzIHRvIHVwZGF0ZSBzaXplICovCisgIGd1aW50MzIgdHJha19zaXplOworICBndWludDY0IG1kaWFfZmlsZV9vZmZzZXQ7CisgIGd1aW50MzIgbWRpYV9zaXplOworICBndWludDY0IG1pbmZfZmlsZV9vZmZzZXQ7CisgIGd1aW50MzIgbWluZl9zaXplOworICBndWludDY0IHN0YmxfZmlsZV9vZmZzZXQ7CisgIGd1aW50MzIgc3RibF9zaXplOworCisgIGd1aW50NjQgcG9zdF9zdHNkX29mZnNldDsKKyAgZ3VpbnQzMiBzdHNkX3NpemU7CisKKyAgZ3VpbnQzMiBleHRyYV9hdG9tc19zaXplOworICBndWludDMyIGV4dHJhX2F0b21zX29mZnNldDsKKworICAvKiBmb3Igc3RvcmluZyB0aGUgc2FtcGxlcyBpbmZvICovCisgIEF0b21TVEJMIHN0Ymw7Cit9IFRyYWtSZWNvdkRhdGE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEZJTEUgKiBmaWxlOworICBnYm9vbGVhbiByYXdmaWxlOworCisgIC8qIHJlc3VsdHMgZnJvbSBwYXJzaW5nIHRoZSBpbnB1dCBmaWxlICovCisgIGd1aW50NjQgICBkYXRhX3NpemU7CisgIGd1aW50MzIgICBtZGF0X2hlYWRlcl9zaXplOworICBndWludCAgICAgbWRhdF9zdGFydDsKKworICBndWludDY0ICAgbWRhdF9zaXplOworfSBNZGF0UmVjb3ZGaWxlOworCit0eXBlZGVmIHN0cnVjdAoreworICBGSUxFICogZmlsZTsKKyAgZ3VpbnQzMiB0aW1lc2NhbGU7CisKKyAgZ3VpbnQzMiBtdmhkX3BvczsKKyAgZ3VpbnQzMiBtdmhkX3NpemU7CisgIGd1aW50MzIgcHJlZml4X3NpemU7IC8qIHByZWZpeCArIGZ0eXAgdG90YWwgc2l6ZSAqLworCisgIGdpbnQgbnVtX3RyYWtzOworICBUcmFrUmVjb3ZEYXRhICp0cmFrc19yZDsKK30gTW9vdlJlY292RmlsZTsKKworZ2Jvb2xlYW4gYXRvbXNfcmVjb3Zfd3JpdGVfdHJha19pbmZvICAgICAgKEZJTEUgKiBmLCBBdG9tVFJBSyAqIHRyYWspOworZ2Jvb2xlYW4gYXRvbXNfcmVjb3Zfd3JpdGVfaGVhZGVycyAgICAgICAgKEZJTEUgKiBmLCBBdG9tRlRZUCAqIGZ0eXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0QnVmZmVyICogcHJlZml4LCBBdG9tTU9PViAqIG1vb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiB0aW1lc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiB0cmFrc19udW1iZXIpOworZ2Jvb2xlYW4gYXRvbXNfcmVjb3Zfd3JpdGVfdHJha19zYW1wbGVzICAgKEZJTEUgKiBmLCBBdG9tVFJBSyAqIHRyYWssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBuc2FtcGxlcywgZ3VpbnQzMiBkZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIHNpemUsIGd1aW50NjQgY2h1bmtfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdib29sZWFuIHN5bmMsIGdib29sZWFuIGRvX3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50NjQgcHRzX29mZnNldCk7CisKK01kYXRSZWNvdkZpbGUgKiBtZGF0X3JlY292X2ZpbGVfY3JlYXRlICAgKEZJTEUgKiBmaWxlLCBnYm9vbGVhbiBkYXRhZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKiBlcnIpOwordm9pZCAgICAgICAgICAgIG1kYXRfcmVjb3ZfZmlsZV9mcmVlICAgICAoTWRhdFJlY292RmlsZSAqIG1yZik7CitNb292UmVjb3ZGaWxlICogbW9vdl9yZWNvdl9maWxlX2NyZWF0ZSAgIChGSUxFICogZmlsZSwgR0Vycm9yICoqIGVycik7Cit2b2lkICAgICAgICAgICAgbW9vdl9yZWNvdl9maWxlX2ZyZWUgICAgIChNb292UmVjb3ZGaWxlICogbW9vdnJmKTsKK2dib29sZWFuICAgICAgICBtb292X3JlY292X3BhcnNlX2J1ZmZlcnMgKE1vb3ZSZWNvdkZpbGUgKiBtb292cmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZGF0UmVjb3ZGaWxlICogbWRhdHJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqIGVycik7CitnYm9vbGVhbiAgICAgICAgbW9vdl9yZWNvdl93cml0ZV9maWxlICAgIChNb292UmVjb3ZGaWxlICogbW9vdnJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWRhdFJlY292RmlsZSAqIG1kYXRyZiwgRklMRSAqIG91dGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiogZXJyLCBHRXJyb3IgKiogd2Fybik7CisKKyNlbmRpZiAvKiBfX0FUT01TX1JFQ09WRVJZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9kZXNjcmlwdG9ycy5jIGIvZ3N0L2lzb21wNC9kZXNjcmlwdG9ycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxM2ZmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L2Rlc2NyaXB0b3JzLmMKQEAgLTAsMCArMSw0NTcgQEAKKy8qIFF1aWNrdGltZSBtdXhlciBwbHVnaW4gZm9yIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoaWFnbyBTb3VzYSBTYW50b3MgPHRoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKgorICogVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIFNvdXJjZSBDb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlLgorICogU2VlIGZ1cnRoZXIgZXhwbGFuYXRpb24gYXR0YWNoZWQgaW4gTGljZW5zZSBTdGF0ZW1lbnQgKGRpc3RyaWJ1dGVkIGluIHRoZSBmaWxlCisgKiBMSUNFTlNFKS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRlc2NyaXB0b3JzLmgiCisKKy8qCisgKiBTb21lIG1wNCBzdHJ1Y3R1cmVzIChkZXNjcmlwdG9ycykgdXNlIGEgY29kaW5nIHNjaGVtZSBmb3IKKyAqIHJlcHJlc2VudGluZyBpdHMgc2l6ZS4KKyAqIEl0IGlzIGdyb3VwZWQgaW4gYnl0ZXMuIFRoZSAxc3QgYml0IHNldCB0byAxIG1lYW5zIHdlIG5lZWQgYW5vdGhlciBieXRlLAorICogMCBvdGhlcndpc2UuIFRoZSByZW1haW5pbmcgNyBiaXRzIGFyZSB0aGUgdXNlZnVsIHZhbHVlcy4KKyAqCisgKiBUaGUgbmV4dCBzZXQgb2YgZnVuY3Rpb25zIGhhbmRsZSB0aG9zZSB2YWx1ZXMKKyAqLworCisvKgorICogR2V0cyBhbiB1bnNpZ25lZCBpbnRlZ2VyIGFuZCBwYWNrcyBpdCBpbnRvIGEgJ2V4cGFuZGFibGUgc2l6ZScgZm9ybWF0CisgKiAoYXMgdXNlZCBieSBtcDQgZGVzY3JpcHRvcnMpCisgKiBAc2l6ZTogdGhlIGludGVnZXIgdG8gYmUgcGFyc2VkCisgKiBAcHRyOiB0aGUgYXJyYXkgdG8gcGxhY2UgdGhlIHJlc3VsdAorICogQGFycmF5X3NpemU6IHRoZSBzaXplIG9mIHB0ciBhcnJheQorICovCitzdGF0aWMgdm9pZAorZXhwYW5kYWJsZV9zaXplX3BhcnNlIChndWludDY0IHNpemUsIGd1aW50OCAqIHB0ciwgZ3VpbnQzMiBhcnJheV9zaXplKQoreworICBpbnQgaW5kZXggPSAwOworCisgIG1lbXNldCAocHRyLCAwLCBzaXplb2YgKGFycmF5X3NpemUpKTsKKyAgd2hpbGUgKHNpemUgPiAwICYmIGluZGV4IDwgYXJyYXlfc2l6ZSkgeworICAgIHB0cltpbmRleCsrXSA9IChzaXplID4gMHg3RiA/IDB4ODAgOiAweDApIHwgKHNpemUgJiAweDdGKTsKKyAgICBzaXplID0gc2l6ZSA+PiA3OworICB9Cit9CisKKy8qCisgKiBHZXRzIGhvdyBtYW55IHBvc2l0aW9ucyBpbiBhbiBhcnJheSBob2xkaW5nIGFuICdleHBhbmRhYmxlIHNpemUnCisgKiBhcmUgcmVhbGx5IHVzZWQKKyAqCisgKiBAcHRyOiB0aGUgYXJyYXkgd2l0aCB0aGUgJ2V4cGFuZGFibGUgc2l6ZScKKyAqIEBhcnJheV9zaXplOiB0aGUgc2l6ZSBvZiBwdHIgYXJyYXkKKyAqCisgKiBSZXR1cm5zOiB0aGUgbnVtYmVyIG9mIHJlYWxseSB1c2VkIHBvc2l0aW9ucworICovCitzdGF0aWMgZ3VpbnQ2NAorZXhwYW5kYWJsZV9zaXplX2dldF9sZW5ndGggKGd1aW50OCAqIHB0ciwgZ3VpbnQzMiBhcnJheV9zaXplKQoreworICBnYm9vbGVhbiBuZXh0ID0gVFJVRTsKKyAgZ3VpbnQzMiBpbmRleCA9IDA7CisKKyAgd2hpbGUgKG5leHQgJiYgaW5kZXggPCBhcnJheV9zaXplKSB7CisgICAgbmV4dCA9IChwdHJbaW5kZXhdICYgMHg4MCk7CisgICAgaW5kZXgrKzsKKyAgfQorICByZXR1cm4gaW5kZXg7Cit9CisKKy8qCisgKiBJbml0aWFsaXplcnMgYmVsb3cKKyAqLworCitzdGF0aWMgdm9pZAorZGVzY19iYXNlX2Rlc2NyaXB0b3JfaW5pdCAoQmFzZURlc2NyaXB0b3IgKiBiZCwgZ3VpbnQ4IHRhZywgZ3VpbnQzMiBzaXplKQoreworICBiZC0+dGFnID0gdGFnOworICBleHBhbmRhYmxlX3NpemVfcGFyc2UgKHNpemUsIGJkLT5zaXplLCA0KTsKK30KKworc3RhdGljIHZvaWQKK2Rlc2NfZGVjX3NwZWNpZmljX2luZm9faW5pdCAoRGVjb2RlclNwZWNpZmljSW5mb0Rlc2NyaXB0b3IgKiBkc2lkKQoreworICBkZXNjX2Jhc2VfZGVzY3JpcHRvcl9pbml0ICgmZHNpZC0+YmFzZSwgREVDT0RFUl9TUEVDSUZJQ19JTkZPX1RBRywgMCk7CisgIGRzaWQtPmxlbmd0aCA9IDA7CisgIGRzaWQtPmRhdGEgPSBOVUxMOworfQorCitEZWNvZGVyU3BlY2lmaWNJbmZvRGVzY3JpcHRvciAqCitkZXNjX2RlY19zcGVjaWZpY19pbmZvX25ldyAodm9pZCkKK3sKKyAgRGVjb2RlclNwZWNpZmljSW5mb0Rlc2NyaXB0b3IgKmRlc2MgPQorICAgICAgZ19uZXcwIChEZWNvZGVyU3BlY2lmaWNJbmZvRGVzY3JpcHRvciwgMSk7CisgIGRlc2NfZGVjX3NwZWNpZmljX2luZm9faW5pdCAoZGVzYyk7CisgIHJldHVybiBkZXNjOworfQorCitzdGF0aWMgdm9pZAorZGVzY19kZWNfY29uZl9kZXNjX2luaXQgKERlY29kZXJDb25maWdEZXNjcmlwdG9yICogZGNkKQoreworICBkZXNjX2Jhc2VfZGVzY3JpcHRvcl9pbml0ICgmZGNkLT5iYXNlLCBERUNPREVSX0NPTkZJR19ERVNDX1RBRywgMCk7CisgIGRjZC0+ZGVjX3NwZWNpZmljX2luZm8gPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZGVzY19zbF9jb25mX2Rlc2NfaW5pdCAoU0xDb25maWdEZXNjcmlwdG9yICogc2wpCit7CisgIGRlc2NfYmFzZV9kZXNjcmlwdG9yX2luaXQgKCZzbC0+YmFzZSwgU0xfQ09ORklHX0RFU0NfVEFHLCAwKTsKKyAgc2wtPnByZWRlZmluZWQgPSAweDI7Cit9CisKK3ZvaWQKK2Rlc2NfZXNfaW5pdCAoRVNEZXNjcmlwdG9yICogZXMpCit7CisgIGRlc2NfYmFzZV9kZXNjcmlwdG9yX2luaXQgKCZlcy0+YmFzZSwgRVNfREVTQ1JJUFRPUl9UQUcsIDApOworCisgIGVzLT5pZCA9IDA7CisgIGVzLT5mbGFncyA9IDA7CisgIGVzLT5kZXBlbmRzX29uX2VzX2lkID0gMDsKKyAgZXMtPm9jcl9lc19pZCA9IDA7CisgIGVzLT51cmxfbGVuZ3RoID0gMDsKKyAgZXMtPnVybF9zdHJpbmcgPSBOVUxMOworCisgIGRlc2NfZGVjX2NvbmZfZGVzY19pbml0ICgmZXMtPmRlY19jb25mX2Rlc2MpOworICBkZXNjX3NsX2NvbmZfZGVzY19pbml0ICgmZXMtPnNsX2NvbmZfZGVzYyk7Cit9CisKK0VTRGVzY3JpcHRvciAqCitkZXNjX2VzX2Rlc2NyaXB0b3JfbmV3ICh2b2lkKQoreworICBFU0Rlc2NyaXB0b3IgKmVzID0gZ19uZXcwIChFU0Rlc2NyaXB0b3IsIDEpOworCisgIGRlc2NfZXNfaW5pdCAoZXMpOworICByZXR1cm4gZXM7Cit9CisKKy8qCisgKiBEZWluaXRpYWxpemVycy9EZXN0cnVjdG9ycyBiZWxvdworICovCisKK3N0YXRpYyB2b2lkCitkZXNjX2Jhc2VfZGVzY3JpcHRvcl9jbGVhciAoQmFzZURlc2NyaXB0b3IgKiBiYXNlKQoreworfQorCit2b2lkCitkZXNjX2RlY19zcGVjaWZpY19pbmZvX2ZyZWUgKERlY29kZXJTcGVjaWZpY0luZm9EZXNjcmlwdG9yICogZHNpZCkKK3sKKyAgZGVzY19iYXNlX2Rlc2NyaXB0b3JfY2xlYXIgKCZkc2lkLT5iYXNlKTsKKyAgaWYgKGRzaWQtPmRhdGEpIHsKKyAgICBnX2ZyZWUgKGRzaWQtPmRhdGEpOworICAgIGRzaWQtPmRhdGEgPSBOVUxMOworICB9CisgIGdfZnJlZSAoZHNpZCk7Cit9CisKK3N0YXRpYyB2b2lkCitkZXNjX2RlY19jb25mX2Rlc2NfY2xlYXIgKERlY29kZXJDb25maWdEZXNjcmlwdG9yICogZGVjKQoreworICBkZXNjX2Jhc2VfZGVzY3JpcHRvcl9jbGVhciAoJmRlYy0+YmFzZSk7CisgIGlmIChkZWMtPmRlY19zcGVjaWZpY19pbmZvKSB7CisgICAgZGVzY19kZWNfc3BlY2lmaWNfaW5mb19mcmVlIChkZWMtPmRlY19zcGVjaWZpY19pbmZvKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZGVzY19zbF9jb25maWdfZGVzY3JpcHRvcl9jbGVhciAoU0xDb25maWdEZXNjcmlwdG9yICogc2wpCit7CisgIGRlc2NfYmFzZV9kZXNjcmlwdG9yX2NsZWFyICgmc2wtPmJhc2UpOworfQorCit2b2lkCitkZXNjX2VzX2Rlc2NyaXB0b3JfY2xlYXIgKEVTRGVzY3JpcHRvciAqIGVzKQoreworICBkZXNjX2Jhc2VfZGVzY3JpcHRvcl9jbGVhciAoJmVzLT5iYXNlKTsKKyAgaWYgKGVzLT51cmxfc3RyaW5nKSB7CisgICAgZ19mcmVlIChlcy0+dXJsX3N0cmluZyk7CisgICAgZXMtPnVybF9zdHJpbmcgPSBOVUxMOworICB9CisgIGRlc2NfZGVjX2NvbmZfZGVzY19jbGVhciAoJmVzLT5kZWNfY29uZl9kZXNjKTsKKyAgZGVzY19zbF9jb25maWdfZGVzY3JpcHRvcl9jbGVhciAoJmVzLT5zbF9jb25mX2Rlc2MpOworfQorCisvKgorICogU2l6ZSBoYW5kbGluZyBmdW5jdGlvbnMgYmVsb3cKKyAqLworCit2b2lkCitkZXNjX2RlY19zcGVjaWZpY19pbmZvX2FsbG9jX2RhdGEgKERlY29kZXJTcGVjaWZpY0luZm9EZXNjcmlwdG9yICogZHNpZCwKKyAgICBndWludDMyIHNpemUpCit7CisgIGlmIChkc2lkLT5kYXRhKSB7CisgICAgZ19mcmVlIChkc2lkLT5kYXRhKTsKKyAgfQorICBkc2lkLT5kYXRhID0gZ19uZXcwIChndWludDgsIHNpemUpOworICBkc2lkLT5sZW5ndGggPSBzaXplOworfQorCitzdGF0aWMgdm9pZAorZGVzY19iYXNlX2Rlc2NyaXB0b3Jfc2V0X3NpemUgKEJhc2VEZXNjcmlwdG9yICogYmQsIGd1aW50MzIgc2l6ZSkKK3sKKyAgZXhwYW5kYWJsZV9zaXplX3BhcnNlIChzaXplLCBiZC0+c2l6ZSwgNCk7Cit9CisKK3N0YXRpYyBndWludDY0CitkZXNjX2Jhc2VfZGVzY3JpcHRvcl9nZXRfc2l6ZSAoQmFzZURlc2NyaXB0b3IgKiBiZCkKK3sKKyAgZ3VpbnQ2NCBzaXplID0gMDsKKworICBzaXplICs9IHNpemVvZiAoZ3VpbnQ4KTsKKyAgc2l6ZSArPSBleHBhbmRhYmxlX3NpemVfZ2V0X2xlbmd0aCAoYmQtPnNpemUsIDQpICogc2l6ZW9mIChndWludDgpOworICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGd1aW50NjQKK2Rlc2Nfc2xfY29uZmlnX2Rlc2NyaXB0b3JfZ2V0X3NpemUgKFNMQ29uZmlnRGVzY3JpcHRvciAqIHNsX2Rlc2MpCit7CisgIGd1aW50NjQgc2l6ZSA9IDA7CisgIGd1aW50NjQgZXh0cmFfc2l6ZSA9IDA7CisKKyAgc2l6ZSArPSBkZXNjX2Jhc2VfZGVzY3JpcHRvcl9nZXRfc2l6ZSAoJnNsX2Rlc2MtPmJhc2UpOworICAvKiBwcmVkZWZpbmVkICovCisgIGV4dHJhX3NpemUgKz0gc2l6ZW9mIChndWludDgpOworCisgIGRlc2NfYmFzZV9kZXNjcmlwdG9yX3NldF9zaXplICgmc2xfZGVzYy0+YmFzZSwgZXh0cmFfc2l6ZSk7CisKKyAgcmV0dXJuIHNpemUgKyBleHRyYV9zaXplOworfQorCitzdGF0aWMgZ3VpbnQ2NAorZGVzY19kZWNfc3BlY2lmaWNfaW5mb19nZXRfc2l6ZSAoRGVjb2RlclNwZWNpZmljSW5mb0Rlc2NyaXB0b3IgKiBkc2lkKQoreworICBndWludDY0IHNpemUgPSAwOworICBndWludDY0IGV4dHJhX3NpemUgPSAwOworCisgIHNpemUgKz0gZGVzY19iYXNlX2Rlc2NyaXB0b3JfZ2V0X3NpemUgKCZkc2lkLT5iYXNlKTsKKyAgZXh0cmFfc2l6ZSArPSBzaXplb2YgKGd1aW50OCkgKiBkc2lkLT5sZW5ndGg7CisgIGRlc2NfYmFzZV9kZXNjcmlwdG9yX3NldF9zaXplICgmZHNpZC0+YmFzZSwgZXh0cmFfc2l6ZSk7CisgIHJldHVybiBzaXplICsgZXh0cmFfc2l6ZTsKK30KKworc3RhdGljIGd1aW50NjQKK2Rlc2NfZGVjX2NvbmZpZ19kZXNjcmlwdG9yX2dldF9zaXplIChEZWNvZGVyQ29uZmlnRGVzY3JpcHRvciAqIGRlY19kZXNjKQoreworICBndWludDY0IHNpemUgPSAwOworICBndWludDY0IGV4dHJhX3NpemUgPSAwOworCisgIHNpemUgKz0gZGVzY19iYXNlX2Rlc2NyaXB0b3JfZ2V0X3NpemUgKCZkZWNfZGVzYy0+YmFzZSk7CisgIC8qIG9iamVjdCB0eXBlICovCisgIGV4dHJhX3NpemUgKz0gc2l6ZW9mIChndWludDgpOworICAvKiBzdHJlYW0gdHlwZSAqLworICBleHRyYV9zaXplICs9IHNpemVvZiAoZ3VpbnQ4KTsKKyAgLyogYnVmZmVyIHNpemUgKi8KKyAgZXh0cmFfc2l6ZSArPSBzaXplb2YgKGd1aW50OCkgKiAzOworICAvKiBtYXggYml0cmF0ZSAqLworICBleHRyYV9zaXplICs9IHNpemVvZiAoZ3VpbnQzMik7CisgIC8qIGF2ZyBiaXRyYXRlICovCisgIGV4dHJhX3NpemUgKz0gc2l6ZW9mIChndWludDMyKTsKKyAgaWYgKGRlY19kZXNjLT5kZWNfc3BlY2lmaWNfaW5mbykgeworICAgIGV4dHJhX3NpemUgKz0gZGVzY19kZWNfc3BlY2lmaWNfaW5mb19nZXRfc2l6ZSAoZGVjX2Rlc2MtPmRlY19zcGVjaWZpY19pbmZvKTsKKyAgfQorCisgIGRlc2NfYmFzZV9kZXNjcmlwdG9yX3NldF9zaXplICgmZGVjX2Rlc2MtPmJhc2UsIGV4dHJhX3NpemUpOworICByZXR1cm4gc2l6ZSArIGV4dHJhX3NpemU7Cit9CisKK3N0YXRpYyBndWludDY0CitkZXNjX2VzX2Rlc2NyaXB0b3JfZ2V0X3NpemUgKEVTRGVzY3JpcHRvciAqIGVzKQoreworICBndWludDY0IHNpemUgPSAwOworICBndWludDY0IGV4dHJhX3NpemUgPSAwOworCisgIHNpemUgKz0gZGVzY19iYXNlX2Rlc2NyaXB0b3JfZ2V0X3NpemUgKCZlcy0+YmFzZSk7CisgIC8qIGlkICovCisgIGV4dHJhX3NpemUgKz0gc2l6ZW9mIChndWludDE2KTsKKyAgLyogZmxhZ3MgKi8KKyAgZXh0cmFfc2l6ZSArPSBzaXplb2YgKGd1aW50OCk7CisgIC8qIGRlcGVuZHNfb25fZXNfaWQgKi8KKyAgaWYgKGVzLT5mbGFncyAmIDB4ODApIHsKKyAgICBleHRyYV9zaXplICs9IHNpemVvZiAoZ3VpbnQxNik7CisgIH0KKyAgaWYgKGVzLT5mbGFncyAmIDB4NDApIHsKKyAgICAvKiB1cmxfbGVuZ3RoICovCisgICAgZXh0cmFfc2l6ZSArPSBzaXplb2YgKGd1aW50OCk7CisgICAgLyogdXJsICovCisgICAgZXh0cmFfc2l6ZSArPSBzaXplb2YgKGdjaGFyKSAqIGVzLT51cmxfbGVuZ3RoOworICB9CisgIGlmIChlcy0+ZmxhZ3MgJiAweDIwKSB7CisgICAgLyogb2NyX2VzX2lkICovCisgICAgZXh0cmFfc2l6ZSArPSBzaXplb2YgKGd1aW50MTYpOworICB9CisKKyAgZXh0cmFfc2l6ZSArPSBkZXNjX2RlY19jb25maWdfZGVzY3JpcHRvcl9nZXRfc2l6ZSAoJmVzLT5kZWNfY29uZl9kZXNjKTsKKyAgZXh0cmFfc2l6ZSArPSBkZXNjX3NsX2NvbmZpZ19kZXNjcmlwdG9yX2dldF9zaXplICgmZXMtPnNsX2NvbmZfZGVzYyk7CisKKyAgZGVzY19iYXNlX2Rlc2NyaXB0b3Jfc2V0X3NpemUgKCZlcy0+YmFzZSwgZXh0cmFfc2l6ZSk7CisKKyAgcmV0dXJuIHNpemUgKyBleHRyYV9zaXplOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2Rlc2NfZXNfZGVzY3JpcHRvcl9jaGVja19zdHJlYW1fZGVwZW5kZW5jeSAoRVNEZXNjcmlwdG9yICogZXMpCit7CisgIHJldHVybiBlcy0+ZmxhZ3MgJiAweDgwOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2Rlc2NfZXNfZGVzY3JpcHRvcl9jaGVja191cmxfZmxhZyAoRVNEZXNjcmlwdG9yICogZXMpCit7CisgIHJldHVybiBlcy0+ZmxhZ3MgJiAweDQwOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2Rlc2NfZXNfZGVzY3JpcHRvcl9jaGVja19vY3IgKEVTRGVzY3JpcHRvciAqIGVzKQoreworICByZXR1cm4gZXMtPmZsYWdzICYgMHgyMDsKK30KKworLyogQ29weS9TZXJpYWxpemF0aW9ucyBGdW5jdGlvbnMgYmVsb3cgKi8KKworc3RhdGljIGd1aW50NjQKK2Rlc2NfYmFzZV9kZXNjcmlwdG9yX2NvcHlfZGF0YSAoQmFzZURlc2NyaXB0b3IgKiBkZXNjLCBndWludDggKiogYnVmZmVyLAorICAgIGd1aW50NjQgKiBzaXplLCBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgcHJvcF9jb3B5X3VpbnQ4IChkZXNjLT50YWcsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQ4X2FycmF5IChkZXNjLT5zaXplLCBleHBhbmRhYmxlX3NpemVfZ2V0X2xlbmd0aCAoZGVzYy0+c2l6ZSwgNCksCisgICAgICBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHJldHVybiBvcmlnaW5hbF9vZmZzZXQgLSAqb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorZGVzY19zbF9jb25maWdfZGVzY3JpcHRvcl9jb3B5X2RhdGEgKFNMQ29uZmlnRGVzY3JpcHRvciAqIGRlc2MsCisgICAgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIGd1aW50NjQgb3JpZ2luYWxfb2Zmc2V0ID0gKm9mZnNldDsKKworICBpZiAoIWRlc2NfYmFzZV9kZXNjcmlwdG9yX2NvcHlfZGF0YSAoJmRlc2MtPmJhc2UsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisgIC8qIHByZWRlZmluZWQgYXR0cmlidXRlICovCisgIHByb3BfY29weV91aW50OCAoZGVzYy0+cHJlZGVmaW5lZCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCitzdGF0aWMgZ3VpbnQ2NAorZGVzY19kZWNfc3BlY2lmaWNfaW5mb19jb3B5X2RhdGEgKERlY29kZXJTcGVjaWZpY0luZm9EZXNjcmlwdG9yICogZGVzYywKKyAgICBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIGlmICghZGVzY19iYXNlX2Rlc2NyaXB0b3JfY29weV9kYXRhICgmZGVzYy0+YmFzZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcHJvcF9jb3B5X3VpbnQ4X2FycmF5IChkZXNjLT5kYXRhLCBkZXNjLT5sZW5ndGgsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworc3RhdGljIGd1aW50NjQKK2Rlc2NfZGVjX2NvbmZpZ19kZXNjcmlwdG9yX2NvcHlfZGF0YSAoRGVjb2RlckNvbmZpZ0Rlc2NyaXB0b3IgKiBkZXNjLAorICAgIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLCBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgaWYgKCFkZXNjX2Jhc2VfZGVzY3JpcHRvcl9jb3B5X2RhdGEgKCZkZXNjLT5iYXNlLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHByb3BfY29weV91aW50OCAoZGVzYy0+b2JqZWN0X3R5cGUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBwcm9wX2NvcHlfdWludDggKGRlc2MtPnN0cmVhbV90eXBlLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHByb3BfY29weV91aW50OF9hcnJheSAoZGVzYy0+YnVmZmVyX3NpemVfREIsIDMsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKworICBwcm9wX2NvcHlfdWludDMyIChkZXNjLT5tYXhfYml0cmF0ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICBwcm9wX2NvcHlfdWludDMyIChkZXNjLT5hdmdfYml0cmF0ZSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGlmIChkZXNjLT5kZWNfc3BlY2lmaWNfaW5mbykgeworICAgIGlmICghZGVzY19kZWNfc3BlY2lmaWNfaW5mb19jb3B5X2RhdGEgKGRlc2MtPmRlY19zcGVjaWZpY19pbmZvLCBidWZmZXIsCisgICAgICAgICAgICBzaXplLCBvZmZzZXQpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICByZXR1cm4gKm9mZnNldCAtIG9yaWdpbmFsX29mZnNldDsKK30KKworZ3VpbnQ2NAorZGVzY19lc19kZXNjcmlwdG9yX2NvcHlfZGF0YSAoRVNEZXNjcmlwdG9yICogZGVzYywgZ3VpbnQ4ICoqIGJ1ZmZlciwKKyAgICBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIC8qIG11c3QgY2FsbCB0aGlzIHR3aWNlIHRvIGhhdmUgc2l6ZSBmaWVsZHMgb2YgYWxsIGNvbnRhaW5lZCBkZXNjcmlwdG9ycyBzZXQKKyAgICogY29ycmVjdGx5LCBhbmQgdG8gaGF2ZSB0aGUgc2l6ZSBvZiB0aGUgc2l6ZSBmaWVsZHMgdGFrZW4gaW50byBhY2NvdW50ICovCisgIGRlc2NfZXNfZGVzY3JpcHRvcl9nZXRfc2l6ZSAoZGVzYyk7CisgIGRlc2NfZXNfZGVzY3JpcHRvcl9nZXRfc2l6ZSAoZGVzYyk7CisKKyAgaWYgKCFkZXNjX2Jhc2VfZGVzY3JpcHRvcl9jb3B5X2RhdGEgKCZkZXNjLT5iYXNlLCBidWZmZXIsIHNpemUsIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvKiBpZCBhbmQgZmxhZ3MgKi8KKyAgcHJvcF9jb3B5X3VpbnQxNiAoZGVzYy0+aWQsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQ4IChkZXNjLT5mbGFncywgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworCisgIGlmIChkZXNjX2VzX2Rlc2NyaXB0b3JfY2hlY2tfc3RyZWFtX2RlcGVuZGVuY3kgKGRlc2MpKSB7CisgICAgcHJvcF9jb3B5X3VpbnQxNiAoZGVzYy0+ZGVwZW5kc19vbl9lc19pZCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICB9CisKKyAgaWYgKGRlc2NfZXNfZGVzY3JpcHRvcl9jaGVja191cmxfZmxhZyAoZGVzYykpIHsKKyAgICBwcm9wX2NvcHlfc2l6ZV9zdHJpbmcgKGRlc2MtPnVybF9zdHJpbmcsIGRlc2MtPnVybF9sZW5ndGgsIGJ1ZmZlciwgc2l6ZSwKKyAgICAgICAgb2Zmc2V0KTsKKyAgfQorCisgIGlmIChkZXNjX2VzX2Rlc2NyaXB0b3JfY2hlY2tfb2NyIChkZXNjKSkgeworICAgIHByb3BfY29weV91aW50MTYgKGRlc2MtPm9jcl9lc19pZCwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworICB9CisKKyAgaWYgKCFkZXNjX2RlY19jb25maWdfZGVzY3JpcHRvcl9jb3B5X2RhdGEgKCZkZXNjLT5kZWNfY29uZl9kZXNjLCBidWZmZXIsIHNpemUsCisgICAgICAgICAgb2Zmc2V0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFkZXNjX3NsX2NvbmZpZ19kZXNjcmlwdG9yX2NvcHlfZGF0YSAoJmRlc2MtPnNsX2NvbmZfZGVzYywgYnVmZmVyLCBzaXplLAorICAgICAgICAgIG9mZnNldCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9kZXNjcmlwdG9ycy5oIGIvZ3N0L2lzb21wNC9kZXNjcmlwdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NzI1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L2Rlc2NyaXB0b3JzLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qIFF1aWNrdGltZSBtdXhlciBwbHVnaW4gZm9yIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoaWFnbyBTb3VzYSBTYW50b3MgPHRoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKgorICogVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIFNvdXJjZSBDb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlLgorICogU2VlIGZ1cnRoZXIgZXhwbGFuYXRpb24gYXR0YWNoZWQgaW4gTGljZW5zZSBTdGF0ZW1lbnQgKGRpc3RyaWJ1dGVkIGluIHRoZSBmaWxlCisgKiBMSUNFTlNFKS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX0RFU0NSSVBUT1JTX0hfXworI2RlZmluZSBfX0RFU0NSSVBUT1JTX0hfXworCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInByb3BlcnRpZXMuaCIKKworLyoKKyAqIFRhZ3MgZm9yIGRlc2NyaXB0b3IgKGVhY2gga2luZCBpcyByZXByZXNlbnRlZCBieSBhIG51bWJlciwgaW5zdGVhZCBvZiBmb3VyY2MgYXMgaW4gYXRvbXMpCisgKi8KKyNkZWZpbmUgT0JKRUNUX0RFU0NfVEFHICAgICAgICAgICAgMHgwMQorI2RlZmluZSBJTklUX09CSkVDVF9ERVNDX1RBRyAgICAgICAweDAyCisjZGVmaW5lIEVTX0RFU0NSSVBUT1JfVEFHICAgICAgICAgIDB4MDMKKyNkZWZpbmUgREVDT0RFUl9DT05GSUdfREVTQ19UQUcgICAgMHgwNAorI2RlZmluZSBERUNPREVSX1NQRUNJRklDX0lORk9fVEFHICAweDA1CisjZGVmaW5lIFNMX0NPTkZJR19ERVNDX1RBRyAgICAgICAgIDB4MDYKKyNkZWZpbmUgRVNfSURfSU5DX1RBRyAgICAgICAgICAgICAgMHgwRQorI2RlZmluZSBNUDRfSU5JVF9PQkpFQ1RfREVTQ19UQUcgICAweDEwCisKKyNkZWZpbmUgRVNEU19PQkpFQ1RfVFlQRV9NUEVHMV9QMyAgICAgICAweDZCCisjZGVmaW5lIEVTRFNfT0JKRUNUX1RZUEVfTVBFRzJfUDdfTUFJTiAgMHg2NgorI2RlZmluZSBFU0RTX09CSkVDVF9UWVBFX01QRUc0X1A3X0xDICAgIDB4NjcKKyNkZWZpbmUgRVNEU19PQkpFQ1RfVFlQRV9NUEVHNF9QN19TU1IgICAweDY4CisjZGVmaW5lIEVTRFNfT0JKRUNUX1RZUEVfTVBFRzRfUDIgICAgICAgMHgyMAorI2RlZmluZSBFU0RTX09CSkVDVF9UWVBFX01QRUc0X1AzICAgICAgIDB4NDAKKworI2RlZmluZSBFU0RTX1NUUkVBTV9UWVBFX1ZJU1VBTCAgICAgICAgIDB4MDQKKyNkZWZpbmUgRVNEU19TVFJFQU1fVFlQRV9BVURJTyAgICAgICAgICAweDA1CisKKwordHlwZWRlZiBzdHJ1Y3QgX0Jhc2VEZXNjcmlwdG9yCit7CisgIGd1aW50OCB0YWc7CisgIC8qIHRoZSBmaXJzdCBiaXQgb2YgZWFjaCBieXRlIGluZGljYXRlcyBpZiB0aGUgbmV4dCBieXRlIHNob3VsZCBiZSB1c2VkICovCisgIGd1aW50OCBzaXplWzRdOworfSBCYXNlRGVzY3JpcHRvcjsKKwordHlwZWRlZiBzdHJ1Y3QgX1NMQ29uZmlnRGVzY3JpcHRvcgoreworICBCYXNlRGVzY3JpcHRvciBiYXNlOworCisgIGd1aW50OCBwcmVkZWZpbmVkOyAgICAgICAgICAgICAgLyogZXZlcnl0aGluZyBpcyBzdXBwb3NlZCBwcmVkZWZpbmVkICovCit9IFNMQ29uZmlnRGVzY3JpcHRvcjsKKwordHlwZWRlZiBzdHJ1Y3QgX0RlY29kZXJTcGVjaWZpY0luZm9EZXNjcmlwdG9yCit7CisgIEJhc2VEZXNjcmlwdG9yIGJhc2U7CisgIGd1aW50MzIgbGVuZ3RoOworICBndWludDggKmRhdGE7Cit9IERlY29kZXJTcGVjaWZpY0luZm9EZXNjcmlwdG9yOworCit0eXBlZGVmIHN0cnVjdCBfRGVjb2RlckNvbmZpZ0Rlc2NyaXB0b3IgeworICBCYXNlRGVzY3JpcHRvciBiYXNlOworCisgIGd1aW50OCBvYmplY3RfdHlwZTsKKworICAvKiBmb2xsb3dpbmcgYXJlIGNvbmRlbnNlZCBpbnRvIHN0cmVhbVR5cGU6CisgICAqIGJpdCg2KSBzdHJlYW1UeXBlOworICAgKiBiaXQoMSkgdXBTdHJlYW07CisgICAqIGNvbnN0IGJpdCgxKSByZXNlcnZlZD0xOworICAqLworICBndWludDggc3RyZWFtX3R5cGU7CisKKyAgZ3VpbnQ4IGJ1ZmZlcl9zaXplX0RCWzNdOworICBndWludDMyIG1heF9iaXRyYXRlOworICBndWludDMyIGF2Z19iaXRyYXRlOworCisgIERlY29kZXJTcGVjaWZpY0luZm9EZXNjcmlwdG9yICpkZWNfc3BlY2lmaWNfaW5mbzsKK30gRGVjb2RlckNvbmZpZ0Rlc2NyaXB0b3I7CisKK3R5cGVkZWYgc3RydWN0IF9FU0Rlc2NyaXB0b3IKK3sKKyAgQmFzZURlc2NyaXB0b3IgYmFzZTsKKworICBndWludDE2IGlkOworCisgIC8qIGZsYWdzIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmc6CisgICAqIGJpdCgxKSBzdHJlYW1EZXBlbmRlbmNlRmxhZzsKKyAgICogYml0KDEpIFVSTF9GbGFnOworICAgKiBiaXQoMSkgT0NSc3RyZWFtRmxhZzsKKyAgICogYml0KDUpIHN0cmVhbVByaW9yaXR5OworICAgKi8KKyAgZ3VpbnQ4IGZsYWdzOworCisgIGd1aW50MTYgZGVwZW5kc19vbl9lc19pZDsKKyAgZ3VpbnQ4IHVybF9sZW5ndGg7ICAgICAgICAgICAgICAvKiBvbmx5IGlmIFVSTF9mbGFnIGlzIHNldCAqLworICBndWludDggKnVybF9zdHJpbmc7ICAgICAgICAgICAgIC8qIHNpemUgaXMgdXJsX2xlbmd0aCAqLworCisgIGd1aW50MTYgb2NyX2VzX2lkOyAgICAgICAgICAgICAgLyogb25seSBpZiBPQ1JzdHJlYW1GbGFnIGlzIHNldCAqLworCisgIERlY29kZXJDb25maWdEZXNjcmlwdG9yIGRlY19jb25mX2Rlc2M7CisgIFNMQ29uZmlnRGVzY3JpcHRvciBzbF9jb25mX2Rlc2M7CisKKyAgLyogb3B0aW9uYWwgcmVtYWluZGVyIG9mIEVTRGVzY3JpcHRvciBpcyBub3QgdXNlZCAqLworfSBFU0Rlc2NyaXB0b3I7CisKKy8qIC0tLSBGVU5DVElPTlMgLS0tICovCit2b2lkICAgIGRlc2NfZXNfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRVNEZXNjcmlwdG9yICplcyk7CitFU0Rlc2NyaXB0b3IgKmRlc2NfZXNfZGVzY3JpcHRvcl9uZXcgICAgICAgICAgICAgICAodm9pZCk7CitndWludDY0IGRlc2NfZXNfZGVzY3JpcHRvcl9jb3B5X2RhdGEgICAgICAgICAgICAgICAoRVNEZXNjcmlwdG9yICplcywgZ3VpbnQ4ICoqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50NjQgKnNpemUsIGd1aW50NjQgKm9mZnNldCk7Cit2b2lkICAgIGRlc2NfZXNfZGVzY3JpcHRvcl9jbGVhciAgICAgICAgICAgICAgICAgICAoRVNEZXNjcmlwdG9yICplcyk7CisKK0RlY29kZXJTcGVjaWZpY0luZm9EZXNjcmlwdG9yICpkZXNjX2RlY19zcGVjaWZpY19pbmZvX25ldyh2b2lkKTsKK3ZvaWQgICAgZGVzY19kZWNfc3BlY2lmaWNfaW5mb19mcmVlICAgICAgICAgICAgICAgIChEZWNvZGVyU3BlY2lmaWNJbmZvRGVzY3JpcHRvciAqZHNpZCk7Cit2b2lkICAgIGRlc2NfZGVjX3NwZWNpZmljX2luZm9fYWxsb2NfZGF0YSAgICAgICAgICAoRGVjb2RlclNwZWNpZmljSW5mb0Rlc2NyaXB0b3IgKmRzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBzaXplKTsKKworI2VuZGlmIC8qIF9fREVTQ1JJUFRPUlNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L2ZvdXJjYy5oIGIvZ3N0L2lzb21wNC9mb3VyY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTVjN2MwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9mb3VyY2MuaApAQCAtMCwwICsxLDM4NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisgLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKworI2lmbmRlZiBfX0ZPVVJDQ19IX18KKyNkZWZpbmUgX19GT1VSQ0NfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBGT1VSQ0NfbnVsbCAgICAgMHgwCisKKyNkZWZpbmUgRk9VUkNDXzJ2dXkgICAgIEdTVF9NQUtFX0ZPVVJDQygnMicsJ3YnLCd1JywneScpCisjZGVmaW5lIEZPVVJDQ19GTVA0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ0YnLCdNJywnUCcsJzQnKQorI2RlZmluZSBGT1VSQ0NfSDI2NCAgICAgR1NUX01BS0VfRk9VUkNDKCdIJywnMicsJzYnLCc0JykKKyNkZWZpbmUgRk9VUkNDX0gyNjUgICAgIEdTVF9NQUtFX0ZPVVJDQygnSCcsJzInLCc2JywnNScpCisjZGVmaW5lIEZPVVJDQ19NQUMzICAgICBHU1RfTUFLRV9GT1VSQ0MoJ00nLCdBJywnQycsJzMnKQorI2RlZmluZSBGT1VSQ0NfTUFDNiAgICAgR1NUX01BS0VfRk9VUkNDKCdNJywnQScsJ0MnLCc2JykKKyNkZWZpbmUgRk9VUkNDX01QNFYgICAgIEdTVF9NQUtFX0ZPVVJDQygnTScsJ1AnLCc0JywnVicpCisjZGVmaW5lIEZPVVJDQ19QSUNUICAgICBHU1RfTUFLRV9GT1VSQ0MoJ1AnLCdJJywnQycsJ1QnKQorI2RlZmluZSBGT1VSQ0NfUURNMiAgICAgR1NUX01BS0VfRk9VUkNDKCdRJywnRCcsJ00nLCcyJykKKyNkZWZpbmUgRk9VUkNDX1NWUTMgICAgIEdTVF9NQUtFX0ZPVVJDQygnUycsJ1YnLCdRJywnMycpCisjZGVmaW5lIEZPVVJDQ19WUDMxICAgICBHU1RfTUFLRV9GT1VSQ0MoJ1YnLCdQJywnMycsJzEnKQorI2RlZmluZSBGT1VSQ0NfVlA4MCAgICAgR1NUX01BS0VfRk9VUkNDKCdWJywnUCcsJzgnLCcwJykKKyNkZWZpbmUgRk9VUkNDX1dSTEUgICAgIEdTVF9NQUtFX0ZPVVJDQygnVycsJ1InLCdMJywnRScpCisjZGVmaW5lIEZPVVJDQ19YTVBfICAgICBHU1RfTUFLRV9GT1VSQ0MoJ1gnLCdNJywnUCcsJ18nKQorI2RlZmluZSBGT1VSQ0NfWFZJRCAgICAgR1NUX01BS0VfRk9VUkNDKCdYJywnVicsJ0knLCdEJykKKyNkZWZpbmUgRk9VUkNDX19BUlQgICAgIEdTVF9NQUtFX0ZPVVJDQygweGE5LCdBJywnUicsJ1QnKQorI2RlZmluZSBGT1VSQ0NfX19fXyAgICAgR1NUX01BS0VfRk9VUkNDKCctJywnLScsJy0nLCctJykKKyNkZWZpbmUgRk9VUkNDX19faW4gICAgIEdTVF9NQUtFX0ZPVVJDQygnICcsJyAnLCdpJywnbicpCisjZGVmaW5lIEZPVVJDQ19fX3R5ICAgICBHU1RfTUFLRV9GT1VSQ0MoJyAnLCcgJywndCcsJ3knKQorI2RlZmluZSBGT1VSQ0NfX2FsYiAgICAgR1NUX01BS0VfRk9VUkNDKDB4YTksJ2EnLCdsJywnYicpCisjZGVmaW5lIEZPVVJDQ19fY3B5ICAgICBHU1RfTUFLRV9GT1VSQ0MoMHhhOSwnYycsJ3AnLCd5JykKKyNkZWZpbmUgRk9VUkNDX19kYXkgICAgIEdTVF9NQUtFX0ZPVVJDQygweGE5LCdkJywnYScsJ3knKQorI2RlZmluZSBGT1VSQ0NfX2RlcyAgICAgR1NUX01BS0VfRk9VUkNDKDB4YTksJ2QnLCdlJywncycpCisjZGVmaW5lIEZPVVJDQ19fZW5jICAgICBHU1RfTUFLRV9GT1VSQ0MoMHhhOSwnZScsJ24nLCdjJykKKyNkZWZpbmUgRk9VUkNDX19nZW4gICAgIEdTVF9NQUtFX0ZPVVJDQygweGE5LCAnZycsICdlJywgJ24nKQorI2RlZmluZSBGT1VSQ0NfX2dycCAgICAgR1NUX01BS0VfRk9VUkNDKDB4YTksJ2cnLCdyJywncCcpCisjZGVmaW5lIEZPVVJDQ19faW5mICAgICBHU1RfTUFLRV9GT1VSQ0MoMHhhOSwnaScsJ24nLCdmJykKKyNkZWZpbmUgRk9VUkNDX19seXIgICAgIEdTVF9NQUtFX0ZPVVJDQygweGE5LCdsJywneScsJ3InKQorI2RlZmluZSBGT1VSQ0NfX21wMyAgICAgR1NUX01BS0VfRk9VUkNDKCcuJywnbScsJ3AnLCczJykKKyNkZWZpbmUgRk9VUkNDX19uYW0gICAgIEdTVF9NQUtFX0ZPVVJDQygweGE5LCduJywnYScsJ20nKQorI2RlZmluZSBGT1VSQ0NfX3JlcSAgICAgR1NUX01BS0VfRk9VUkNDKDB4YTksJ3InLCdlJywncScpCisjZGVmaW5lIEZPVVJDQ19fdG9vICAgICBHU1RfTUFLRV9GT1VSQ0MoMHhhOSwndCcsJ28nLCdvJykKKyNkZWZpbmUgRk9VUkNDX193cnQgICAgIEdTVF9NQUtFX0ZPVVJDQygweGE5LCd3JywncicsJ3QnKQorI2RlZmluZSBGT1VSQ0NfYUFSVCAgICAgR1NUX01BS0VfRk9VUkNDKCdhJywnQScsJ1InLCdUJykKKyNkZWZpbmUgRk9VUkNDX2FjXzMgICAgIEdTVF9NQUtFX0ZPVVJDQygnYScsJ2MnLCctJywnMycpCisjZGVmaW5lIEZPVVJDQ19hZ3NtICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2EnLCdnJywncycsJ20nKQorI2RlZmluZSBGT1VSQ0NfYWxhYyAgICAgR1NUX01BS0VfRk9VUkNDKCdhJywnbCcsJ2EnLCdjJykKKyNkZWZpbmUgRk9VUkNDX2ZMYUMgICAgIEdTVF9NQUtFX0ZPVVJDQygnZicsJ0wnLCdhJywnQycpCisjZGVmaW5lIEZPVVJDQ19kZkxhICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2QnLCdmJywnTCcsJ2EnKQorI2RlZmluZSBGT1VSQ0NfYWxhdyAgICAgR1NUX01BS0VfRk9VUkNDKCdhJywnbCcsJ2EnLCd3JykKKyNkZWZpbmUgRk9VUkNDX2FsaXMgICAgIEdTVF9NQUtFX0ZPVVJDQygnYScsJ2wnLCdpJywncycpCisjZGVmaW5lIEZPVVJDQ19hcHBsICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2EnLCdwJywncCcsJ2wnKQorI2RlZmluZSBGT1VSQ0NfYXZjMSAgICAgR1NUX01BS0VfRk9VUkNDKCdhJywndicsJ2MnLCcxJykKKyNkZWZpbmUgRk9VUkNDX2F2YzMgICAgIEdTVF9NQUtFX0ZPVVJDQygnYScsJ3YnLCdjJywnMycpCisjZGVmaW5lIEZPVVJDQ19hdmNDICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2EnLCd2JywnYycsJ0MnKQorI2RlZmluZSBGT1VSQ0NfY2xpcCAgICAgR1NUX01BS0VfRk9VUkNDKCdjJywnbCcsJ2knLCdwJykKKyNkZWZpbmUgRk9VUkNDX2Ntb3YgICAgIEdTVF9NQUtFX0ZPVVJDQygnYycsJ20nLCdvJywndicpCisjZGVmaW5lIEZPVVJDQ19jbXZkICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2MnLCdtJywndicsJ2QnKQorI2RlZmluZSBGT1VSQ0NfY282NCAgICAgR1NUX01BS0VfRk9VUkNDKCdjJywnbycsJzYnLCc0JykKKyNkZWZpbmUgRk9VUkNDX2NvdnIgICAgIEdTVF9NQUtFX0ZPVVJDQygnYycsJ28nLCd2JywncicpCisjZGVmaW5lIEZPVVJDQ19jcGlsICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2MnLCdwJywnaScsJ2wnKQorI2RlZmluZSBGT1VSQ0NfY3BydCAgICAgR1NUX01BS0VfRk9VUkNDKCdjJywncCcsJ3InLCd0JykKKyNkZWZpbmUgRk9VUkNDX2NyZ24gICAgIEdTVF9NQUtFX0ZPVVJDQygnYycsJ3InLCdnJywnbicpCisjZGVmaW5lIEZPVVJDQ19jdGFiICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2MnLCd0JywnYScsJ2InKQorI2RlZmluZSBGT1VSQ0NfY3R0cyAgICAgR1NUX01BS0VfRk9VUkNDKCdjJywndCcsJ3QnLCdzJykKKyNkZWZpbmUgRk9VUkNDX2NzbGcgICAgIEdTVF9NQUtFX0ZPVVJDQygnYycsJ3MnLCdsJywnZycpCisjZGVmaW5lIEZPVVJDQ19kMjYzICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2QnLCcyJywnNicsJzMnKQorI2RlZmluZSBGT1VSQ0NfZGFjMyAgICAgR1NUX01BS0VfRk9VUkNDKCdkJywnYScsJ2MnLCczJykKKyNkZWZpbmUgRk9VUkNDX2RhbXIgICAgIEdTVF9NQUtFX0ZPVVJDQygnZCcsJ2EnLCdtJywncicpCisjZGVmaW5lIEZPVVJDQ19kYXRhICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2QnLCdhJywndCcsJ2EnKQorI2RlZmluZSBGT1VSQ0NfZGNvbSAgICAgR1NUX01BS0VfRk9VUkNDKCdkJywnYycsJ28nLCdtJykKKyNkZWZpbmUgRk9VUkNDX2Rlc2MgICAgIEdTVF9NQUtFX0ZPVVJDQygnZCcsJ2UnLCdzJywnYycpCisjZGVmaW5lIEZPVVJDQ19kaGxyICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2QnLCdoJywnbCcsJ3InKQorI2RlZmluZSBGT1VSQ0NfZGluZiAgICAgR1NUX01BS0VfRk9VUkNDKCdkJywnaScsJ24nLCdmJykKKyNkZWZpbmUgRk9VUkNDX2Rpc2MgICAgIEdTVF9NQUtFX0ZPVVJDQygnZCcsJ2knLCdzJywnYycpCisjZGVmaW5lIEZPVVJDQ19kaXNrICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2QnLCdpJywncycsJ2snKQorI2RlZmluZSBGT1VSQ0NfZHJhYyAgICAgR1NUX01BS0VfRk9VUkNDKCdkJywncicsJ2EnLCdjJykKKyNkZWZpbmUgRk9VUkNDX2RyZWYgICAgIEdTVF9NQUtFX0ZPVVJDQygnZCcsJ3InLCdlJywnZicpCisjZGVmaW5lIEZPVVJDQ19kcm1pICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2QnLCdyJywnbScsJ2knKQorI2RlZmluZSBGT1VSQ0NfZHJtcyAgICAgR1NUX01BS0VfRk9VUkNDKCdkJywncicsJ20nLCdzJykKKyNkZWZpbmUgRk9VUkNDX2R2Y3AgICAgIEdTVF9NQUtFX0ZPVVJDQygnZCcsJ3YnLCdjJywncCcpCisjZGVmaW5lIEZPVVJDQ19kdmNfICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2QnLCd2JywnYycsJyAnKQorI2RlZmluZSBGT1VSQ0NfZHY1cCAgICAgR1NUX01BS0VfRk9VUkNDKCdkJywndicsJzUnLCdwJykKKyNkZWZpbmUgRk9VUkNDX2R2NW4gICAgIEdTVF9NQUtFX0ZPVVJDQygnZCcsJ3YnLCc1JywnbicpCisjZGVmaW5lIEZPVVJDQ19lZHRzICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2UnLCdkJywndCcsJ3MnKQorI2RlZmluZSBGT1VSQ0NfZWxzdCAgICAgR1NUX01BS0VfRk9VUkNDKCdlJywnbCcsJ3MnLCd0JykKKyNkZWZpbmUgRk9VUkNDX2VuZGEgICAgIEdTVF9NQUtFX0ZPVVJDQygnZScsJ24nLCdkJywnYScpCisjZGVmaW5lIEZPVVJDQ19lc2RzICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2UnLCdzJywnZCcsJ3MnKQorI2RlZmluZSBGT1VSQ0NfZm1wNCAgICAgR1NUX01BS0VfRk9VUkNDKCdmJywnbScsJ3AnLCc0JykKKyNkZWZpbmUgRk9VUkNDX2ZyZWUgICAgIEdTVF9NQUtFX0ZPVVJDQygnZicsJ3InLCdlJywnZScpCisjZGVmaW5lIEZPVVJDQ19mcm1hICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2YnLCdyJywnbScsJ2EnKQorI2RlZmluZSBGT1VSQ0NfZnR5cCAgICAgR1NUX01BS0VfRk9VUkNDKCdmJywndCcsJ3knLCdwJykKKyNkZWZpbmUgRk9VUkNDX2Z0YWIgICAgIEdTVF9NQUtFX0ZPVVJDQygnZicsJ3QnLCdhJywnYicpCisjZGVmaW5lIEZPVVJDQ19nYW1hICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2cnLCdhJywnbScsJ2EnKQorI2RlZmluZSBGT1VSQ0NfZ2xibCAgICAgR1NUX01BS0VfRk9VUkNDKCdnJywnbCcsJ2InLCdsJykKKyNkZWZpbmUgRk9VUkNDX2dtaGQgICAgIEdTVF9NQUtFX0ZPVVJDQygnZycsJ20nLCdoJywnZCcpCisjZGVmaW5lIEZPVVJDQ19nbWluICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2cnLCdtJywnaScsJ24nKQorI2RlZmluZSBGT1VSQ0NfZ25yZSAgICAgR1NUX01BS0VfRk9VUkNDKCdnJywnbicsJ3InLCdlJykKKyNkZWZpbmUgRk9VUkNDX2gyNjMgICAgIEdTVF9NQUtFX0ZPVVJDQygnaCcsJzInLCc2JywnMycpCisjZGVmaW5lIEZPVVJDQ19oZGxyICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2gnLCdkJywnbCcsJ3InKQorI2RlZmluZSBGT1VSQ0NfaGV2MSAgICAgR1NUX01BS0VfRk9VUkNDKCdoJywnZScsJ3YnLCcxJykKKyNkZWZpbmUgRk9VUkNDX2hpbnQgICAgIEdTVF9NQUtFX0ZPVVJDQygnaCcsJ2knLCduJywndCcpCisjZGVmaW5lIEZPVVJDQ19obWhkICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2gnLCdtJywnaCcsJ2QnKQorI2RlZmluZSBGT1VSQ0NfaG5kbCAgICAgR1NUX01BS0VfRk9VUkNDKCdoJywnbicsJ2QnLCdsJykKKyNkZWZpbmUgRk9VUkNDX2hudGkgICAgIEdTVF9NQUtFX0ZPVVJDQygnaCcsJ24nLCd0JywnaScpCisjZGVmaW5lIEZPVVJDQ19odmMxICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2gnLCd2JywnYycsJzEnKQorI2RlZmluZSBGT1VSQ0NfaHZjQyAgICAgR1NUX01BS0VfRk9VUkNDKCdoJywndicsJ2MnLCdDJykKKyNkZWZpbmUgRk9VUkNDX2lsc3QgICAgIEdTVF9NQUtFX0ZPVVJDQygnaScsJ2wnLCdzJywndCcpCisjZGVmaW5lIEZPVVJDQ19pbWE0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2knLCdtJywnYScsJzQnKQorI2RlZmluZSBGT1VSQ0NfaW1hcCAgICAgR1NUX01BS0VfRk9VUkNDKCdpJywnbScsJ2EnLCdwJykKKyNkZWZpbmUgRk9VUkNDX2luMjQgICAgIEdTVF9NQUtFX0ZPVVJDQygnaScsJ24nLCcyJywnNCcpCisjZGVmaW5lIEZPVVJDQ19qcDJjICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2onLCdwJywnMicsJ2MnKQorI2RlZmluZSBGT1VSQ0NfanBlZyAgICAgR1NUX01BS0VfRk9VUkNDKCdqJywncCcsJ2UnLCdnJykKKyNkZWZpbmUgRk9VUkNDX2tleXcgICAgIEdTVF9NQUtFX0ZPVVJDQygnaycsJ2UnLCd5JywndycpCisjZGVmaW5lIEZPVVJDQ19rbWF0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2snLCdtJywnYScsJ3QnKQorI2RlZmluZSBGT1VSQ0Nfa3l3ZCAgICAgR1NUX01BS0VfRk9VUkNDKCdrJywneScsJ3cnLCdkJykKKyNkZWZpbmUgRk9VUkNDX2xvYWQgICAgIEdTVF9NQUtFX0ZPVVJDQygnbCcsJ28nLCdhJywnZCcpCisjZGVmaW5lIEZPVVJDQ19tYXR0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ20nLCdhJywndCcsJ3QnKQorI2RlZmluZSBGT1VSQ0NfbWRhdCAgICAgR1NUX01BS0VfRk9VUkNDKCdtJywnZCcsJ2EnLCd0JykKKyNkZWZpbmUgRk9VUkNDX21kaGQgICAgIEdTVF9NQUtFX0ZPVVJDQygnbScsJ2QnLCdoJywnZCcpCisjZGVmaW5lIEZPVVJDQ19tZGlhICAgICBHU1RfTUFLRV9GT1VSQ0MoJ20nLCdkJywnaScsJ2EnKQorI2RlZmluZSBGT1VSQ0NfbWRpciAgICAgR1NUX01BS0VfRk9VUkNDKCdtJywnZCcsJ2knLCdyJykKKyNkZWZpbmUgRk9VUkNDX21lYW4gICAgIEdTVF9NQUtFX0ZPVVJDQygnbScsJ2UnLCdhJywnbicpCisjZGVmaW5lIEZPVVJDQ19tZXRhICAgICBHU1RfTUFLRV9GT1VSQ0MoJ20nLCdlJywndCcsJ2EnKQorI2RlZmluZSBGT1VSQ0NfbWhsciAgICAgR1NUX01BS0VfRk9VUkNDKCdtJywnaCcsJ2wnLCdyJykKKyNkZWZpbmUgRk9VUkNDX21pbmYgICAgIEdTVF9NQUtFX0ZPVVJDQygnbScsJ2knLCduJywnZicpCisjZGVmaW5lIEZPVVJDQ19tb292ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ20nLCdvJywnbycsJ3YnKQorI2RlZmluZSBGT1VSQ0NfbXA0YSAgICAgR1NUX01BS0VfRk9VUkNDKCdtJywncCcsJzQnLCdhJykKKyNkZWZpbmUgRk9VUkNDX21wNHMgICAgIEdTVF9NQUtFX0ZPVVJDQygnbScsJ3AnLCc0JywncycpCisjZGVmaW5lIEZPVVJDQ19tcDRzICAgICBHU1RfTUFLRV9GT1VSQ0MoJ20nLCdwJywnNCcsJ3MnKQorI2RlZmluZSBGT1VSQ0NfbXA0diAgICAgR1NUX01BS0VfRk9VUkNDKCdtJywncCcsJzQnLCd2JykKKyNkZWZpbmUgRk9VUkNDX25hbWUgICAgIEdTVF9NQUtFX0ZPVVJDQygnbicsJ2EnLCdtJywnZScpCisjZGVmaW5lIEZPVVJDQ19uY2xjICAgICBHU1RfTUFLRV9GT1VSQ0MoJ24nLCdjJywnbCcsJ2MnKQorI2RlZmluZSBGT1VSQ0NfbmNseCAgICAgR1NUX01BS0VfRk9VUkNDKCduJywnYycsJ2wnLCd4JykKKyNkZWZpbmUgRk9VUkNDX29wdXMgICAgIEdTVF9NQUtFX0ZPVVJDQygnTycsJ3AnLCd1JywncycpCisjZGVmaW5lIEZPVVJDQ19kb3BzICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2QnLCdPJywncCcsJ3MnKQorI2RlZmluZSBGT1VSQ0NfcGFzcCAgICAgR1NUX01BS0VfRk9VUkNDKCdwJywnYScsJ3MnLCdwJykKKyNkZWZpbmUgRk9VUkNDX2NvbHIgICAgIEdTVF9NQUtFX0ZPVVJDQygnYycsJ28nLCdsJywncicpCisjZGVmaW5lIEZPVVJDQ19jbGFwICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2MnLCdsJywnYScsJ3AnKQorI2RlZmluZSBGT1VSQ0NfdGFwdCAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywnYScsJ3AnLCd0JykKKyNkZWZpbmUgRk9VUkNDX2NsZWYgICAgIEdTVF9NQUtFX0ZPVVJDQygnYycsJ2wnLCdlJywnZicpCisjZGVmaW5lIEZPVVJDQ19wcm9mICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3AnLCdyJywnbycsJ2YnKQorI2RlZmluZSBGT1VSQ0NfZW5vZiAgICAgR1NUX01BS0VfRk9VUkNDKCdlJywnbicsJ28nLCdmJykKKyNkZWZpbmUgRk9VUkNDX2ZpZWwgICAgIEdTVF9NQUtFX0ZPVVJDQygnZicsJ2knLCdlJywnbCcpCisjZGVmaW5lIEZPVVJDQ19wY3N0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3AnLCdjJywncycsJ3QnKQorI2RlZmluZSBGT1VSQ0NfcGdhcCAgICAgR1NUX01BS0VfRk9VUkNDKCdwJywnZycsJ2EnLCdwJykKKyNkZWZpbmUgRk9VUkNDX3BuZyAgICAgIEdTVF9NQUtFX0ZPVVJDQygncCcsJ24nLCdnJywnICcpCisjZGVmaW5lIEZPVVJDQ19wbm90ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3AnLCduJywnbycsJ3QnKQorI2RlZmluZSBGT1VSQ0NfcXRfXyAgICAgR1NUX01BS0VfRk9VUkNDKCdxJywndCcsJyAnLCcgJykKKyNkZWZpbmUgRk9VUkNDX3F0aW0gICAgIEdTVF9NQUtFX0ZPVVJDQygncScsJ3QnLCdpJywnbScpCisjZGVmaW5lIEZPVVJDQ19yYXdfICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3InLCdhJywndycsJyAnKQorI2RlZmluZSBGT1VSQ0NfcmRyZiAgICAgR1NUX01BS0VfRk9VUkNDKCdyJywnZCcsJ3InLCdmJykKKyNkZWZpbmUgRk9VUkNDX3JsZV8gICAgIEdTVF9NQUtFX0ZPVVJDQygncicsJ2wnLCdlJywnICcpCisjZGVmaW5lIEZPVVJDQ19ybWRhICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3InLCdtJywnZCcsJ2EnKQorI2RlZmluZSBGT1VSQ0Nfcm1kciAgICAgR1NUX01BS0VfRk9VUkNDKCdyJywnbScsJ2QnLCdyJykKKyNkZWZpbmUgRk9VUkNDX3JtcmEgICAgIEdTVF9NQUtFX0ZPVVJDQygncicsJ20nLCdyJywnYScpCisjZGVmaW5lIEZPVVJDQ19ybXZjICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3InLCdtJywndicsJ2MnKQorI2RlZmluZSBGT1VSQ0NfcnRwXyAgICAgR1NUX01BS0VfRk9VUkNDKCdyJywndCcsJ3AnLCcgJykKKyNkZWZpbmUgRk9VUkNDX3J0c3AgICAgIEdTVF9NQUtFX0ZPVVJDQygncicsJ3QnLCdzJywncCcpCisjZGVmaW5lIEZPVVJDQ19zMjYzICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCcyJywnNicsJzMnKQorI2RlZmluZSBGT1VSQ0Nfc2FtciAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywnYScsJ20nLCdyJykKKyNkZWZpbmUgRk9VUkNDX3Nhd2IgICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ2EnLCd3JywnYicpCisjZGVmaW5lIEZPVVJDQ19zYnRsICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCdiJywndCcsJ2wnKQorI2RlZmluZSBGT1VSQ0Nfc2RwXyAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywnZCcsJ3AnLCcgJykKKyNkZWZpbmUgRk9VUkNDX3NpZHggICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ2knLCdkJywneCcpCisjZGVmaW5lIEZPVVJDQ19za2lwICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCdrJywnaScsJ3AnKQorI2RlZmluZSBGT1VSQ0Nfc21oZCAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywnbScsJ2gnLCdkJykKKyNkZWZpbmUgRk9VUkNDX3NvYWEgICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ28nLCdhJywnYScpCisjZGVmaW5lIEZPVVJDQ19zb2FsICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCdvJywnYScsJ2wnKQorI2RlZmluZSBGT1VSQ0Nfc29hciAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywnbycsJ2EnLCdyJykKKyNkZWZpbmUgRk9VUkNDX3NvY28gICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ28nLCdjJywnbycpCisjZGVmaW5lIEZPVVJDQ19zb25tICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCdvJywnbicsJ20nKQorI2RlZmluZSBGT1VSQ0Nfc29zbiAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywnbycsJ3MnLCduJykKKyNkZWZpbmUgRk9VUkNDX3NvdW4gICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ28nLCd1JywnbicpCisjZGVmaW5lIEZPVVJDQ19zb3d0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCdvJywndycsJ3QnKQorI2RlZmluZSBGT1VSQ0Nfc3RibCAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywndCcsJ2InLCdsJykKKyNkZWZpbmUgRk9VUkNDX3N0Y28gICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ3QnLCdjJywnbycpCisjZGVmaW5lIEZPVVJDQ19zdHBwICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCd0JywncCcsJ3AnKQorI2RlZmluZSBGT1VSQ0Nfc3RwcyAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywndCcsJ3AnLCdzJykKKyNkZWZpbmUgRk9VUkNDX3N0cmYgICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ3QnLCdyJywnZicpCisjZGVmaW5lIEZPVVJDQ19zdHJtICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCd0JywncicsJ20nKQorI2RlZmluZSBGT1VSQ0Nfc3RzYyAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywndCcsJ3MnLCdjJykKKyNkZWZpbmUgRk9VUkNDX3N0c2QgICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ3QnLCdzJywnZCcpCisjZGVmaW5lIEZPVVJDQ19zdHNzICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCd0JywncycsJ3MnKQorI2RlZmluZSBGT1VSQ0Nfc3RzeiAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywndCcsJ3MnLCd6JykKKyNkZWZpbmUgRk9VUkNDX3N0dHMgICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ3QnLCd0JywncycpCisjZGVmaW5lIEZPVVJDQ19zdHlwICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCd0JywneScsJ3AnKQorI2RlZmluZSBGT1VSQ0Nfc3VicCAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywndScsJ2InLCdwJykKKyNkZWZpbmUgRk9VUkNDX3N1YnQgICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ3UnLCdiJywndCcpCisjZGVmaW5lIEZPVVJDQ190ZXh0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3QnLCdlJywneCcsJ3QnKQorI2RlZmluZSBGT1VSQ0NfdGNtaSAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywnYycsJ20nLCdpJykKKyNkZWZpbmUgRk9VUkNDX3RraGQgICAgIEdTVF9NQUtFX0ZPVVJDQygndCcsJ2snLCdoJywnZCcpCisjZGVmaW5lIEZPVVJDQ190bWNkICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3QnLCdtJywnYycsJ2QnKQorI2RlZmluZSBGT1VSQ0NfdG1wbyAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywnbScsJ3AnLCdvJykKKyNkZWZpbmUgRk9VUkNDX3RyYWsgICAgIEdTVF9NQUtFX0ZPVVJDQygndCcsJ3InLCdhJywnaycpCisjZGVmaW5lIEZPVVJDQ190cmVmICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3QnLCdyJywnZScsJ2YnKQorI2RlZmluZSBGT1VSQ0NfdHJrbiAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywncicsJ2snLCduJykKKyNkZWZpbmUgRk9VUkNDX3R2ZW4gICAgIEdTVF9NQUtFX0ZPVVJDQygndCcsJ3YnLCdlJywnbicpCisjZGVmaW5lIEZPVVJDQ190dmVzICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3QnLCd2JywnZScsJ3MnKQorI2RlZmluZSBGT1VSQ0NfdHZzaCAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywndicsJ3MnLCdoJykKKyNkZWZpbmUgRk9VUkNDX3R2c24gICAgIEdTVF9NQUtFX0ZPVVJDQygndCcsJ3YnLCdzJywnbicpCisjZGVmaW5lIEZPVVJDQ190d29zICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3QnLCd3JywnbycsJ3MnKQorI2RlZmluZSBGT1VSQ0NfdHgzZyAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywneCcsJzMnLCdnJykKKyNkZWZpbmUgRk9VUkNDX3VkdGEgICAgIEdTVF9NQUtFX0ZPVVJDQygndScsJ2QnLCd0JywnYScpCisjZGVmaW5lIEZPVVJDQ191bGF3ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3UnLCdsJywnYScsJ3cnKQorI2RlZmluZSBGT1VSQ0NfdXJsXyAgICAgR1NUX01BS0VfRk9VUkNDKCd1JywncicsJ2wnLCcgJykKKyNkZWZpbmUgRk9VUkNDX3V1aWQgICAgIEdTVF9NQUtFX0ZPVVJDQygndScsJ3UnLCdpJywnZCcpCisjZGVmaW5lIEZPVVJDQ192MjEwICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3YnLCcyJywnMScsJzAnKQorI2RlZmluZSBGT1VSQ0NfdmNfMSAgICAgR1NUX01BS0VfRk9VUkNDKCd2JywnYycsJy0nLCcxJykKKyNkZWZpbmUgRk9VUkNDX3ZpZGUgICAgIEdTVF9NQUtFX0ZPVVJDQygndicsJ2knLCdkJywnZScpCisjZGVmaW5lIEZPVVJDQ192bWhkICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3YnLCdtJywnaCcsJ2QnKQorI2RlZmluZSBGT1VSQ0NfdnAwOCAgICAgR1NUX01BS0VfRk9VUkNDKCd2JywncCcsJzAnLCc4JykKKyNkZWZpbmUgRk9VUkNDX3ZwMDkgICAgIEdTVF9NQUtFX0ZPVVJDQygndicsJ3AnLCcwJywnOScpCisjZGVmaW5lIEZPVVJDQ194dmlkICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3gnLCd2JywnaScsJ2QnKQorI2RlZmluZSBGT1VSQ0Nfd2F2ZSAgICAgR1NUX01BS0VfRk9VUkNDKCd3JywnYScsJ3YnLCdlJykKKyNkZWZpbmUgRk9VUkNDX3dpZGUgICAgIEdTVF9NQUtFX0ZPVVJDQygndycsJ2knLCdkJywnZScpCisjZGVmaW5lIEZPVVJDQ196bGliICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3onLCdsJywnaScsJ2InKQorI2RlZmluZSBGT1VSQ0NfbHBjbSAgICAgR1NUX01BS0VfRk9VUkNDKCdsJywncCcsJ2MnLCdtJykKKworI2RlZmluZSBGT1VSQ0NfY2ZoZCAgICAgR1NUX01BS0VfRk9VUkNDKCdDJywnRicsJ0gnLCdEJykKKyNkZWZpbmUgRk9VUkNDX2FwNHggICAgIEdTVF9NQUtFX0ZPVVJDQygnYScsJ3AnLCc0JywneCcpCisjZGVmaW5lIEZPVVJDQ19hcDRoICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2EnLCdwJywnNCcsJ2gnKQorI2RlZmluZSBGT1VSQ0NfYXBjaCAgICAgR1NUX01BS0VfRk9VUkNDKCdhJywncCcsJ2MnLCdoJykKKyNkZWZpbmUgRk9VUkNDX2FwY24gICAgIEdTVF9NQUtFX0ZPVVJDQygnYScsJ3AnLCdjJywnbicpCisjZGVmaW5lIEZPVVJDQ19hcGNvICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2EnLCdwJywnYycsJ28nKQorI2RlZmluZSBGT1VSQ0NfYXBjcyAgICAgR1NUX01BS0VfRk9VUkNDKCdhJywncCcsJ2MnLCdzJykKKyNkZWZpbmUgRk9VUkNDX20xdiAgICAgIEdTVF9NQUtFX0ZPVVJDQygnbScsJzEnLCd2JywnICcpCisjZGVmaW5lIEZPVVJDQ192aXZvICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3YnLCdpJywndicsJ28nKQorI2RlZmluZSBGT1VSQ0Nfc2FpeiAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywnYScsJ2knLCd6JykKKyNkZWZpbmUgRk9VUkNDX3NhaW8gICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ2EnLCdpJywnbycpCisKKyNkZWZpbmUgRk9VUkNDXzNnZzYgICAgIEdTVF9NQUtFX0ZPVVJDQygnMycsJ2cnLCdnJywnNicpCisjZGVmaW5lIEZPVVJDQ18zZ2c3ICAgICBHU1RfTUFLRV9GT1VSQ0MoJzMnLCdnJywnZycsJzcnKQorI2RlZmluZSBGT1VSQ0NfM2dwNCAgICAgR1NUX01BS0VfRk9VUkNDKCczJywnZycsJ3AnLCc0JykKKyNkZWZpbmUgRk9VUkNDXzNncDYgICAgIEdTVF9NQUtFX0ZPVVJDQygnMycsJ2cnLCdwJywnNicpCisjZGVmaW5lIEZPVVJDQ18zZ3I2ICAgICBHU1RfTUFLRV9GT1VSQ0MoJzMnLCdnJywncicsJzYnKQorI2RlZmluZSBGT1VSQ0NfM2dfXyAgICAgR1NUX01BS0VfRk9VUkNDKCczJywnZycsMCwwKQorI2RlZmluZSBGT1VSQ0NfaXNtbCAgICAgR1NUX01BS0VfRk9VUkNDKCdpJywncycsJ20nLCdsJykKKyNkZWZpbmUgRk9VUkNDX2lzbzIgICAgIEdTVF9NQUtFX0ZPVVJDQygnaScsJ3MnLCdvJywnMicpCisjZGVmaW5lIEZPVVJDQ19pc29tICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2knLCdzJywnbycsJ20nKQorI2RlZmluZSBGT1VSQ0NfbXA0MSAgICAgR1NUX01BS0VfRk9VUkNDKCdtJywncCcsJzQnLCcxJykKKyNkZWZpbmUgRk9VUkNDX21wNDIgICAgIEdTVF9NQUtFX0ZPVVJDQygnbScsJ3AnLCc0JywnMicpCisjZGVmaW5lIEZPVVJDQ19waWZmICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3AnLCdpJywnZicsJ2YnKQorI2RlZmluZSBGT1VSQ0NfdGl0bCAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywnaScsJ3QnLCdsJykKKworLyogU1ZRMyBmb3VyY2MgKi8KKyNkZWZpbmUgRk9VUkNDX1NFUUggICAgIEdTVF9NQUtFX0ZPVVJDQygnUycsJ0UnLCdRJywnSCcpCisjZGVmaW5lIEZPVVJDQ19TTUlfICAgICBHU1RfTUFLRV9GT1VSQ0MoJ1MnLCdNJywnSScsJyAnKQorCisvKiAzZ3BwIGFzc2V0IG1ldGEgZGF0YSBmb3VyY2MgKi8KKyNkZWZpbmUgRk9VUkNDX2FsYm0gICAgIEdTVF9NQUtFX0ZPVVJDQygnYScsJ2wnLCdiJywnbScpCisjZGVmaW5lIEZPVVJDQ19hdXRoICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2EnLCd1JywndCcsJ2gnKQorI2RlZmluZSBGT1VSQ0NfY2xzZiAgICAgR1NUX01BS0VfRk9VUkNDKCdjJywnbCcsJ3MnLCdmJykKKyNkZWZpbmUgRk9VUkNDX2RzY3AgICAgIEdTVF9NQUtFX0ZPVVJDQygnZCcsJ3MnLCdjJywncCcpCisjZGVmaW5lIEZPVVJDQ19sb2NpICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2wnLCdvJywnYycsJ2knKQorI2RlZmluZSBGT1VSQ0NfcGVyZiAgICAgR1NUX01BS0VfRk9VUkNDKCdwJywnZScsJ3InLCdmJykKKyNkZWZpbmUgRk9VUkNDX3J0bmcgICAgIEdTVF9NQUtFX0ZPVVJDQygncicsJ3QnLCduJywnZycpCisjZGVmaW5lIEZPVVJDQ195cnJjICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3knLCdyJywncicsJ2MnKQorCisvKiBtaXNjIHRhZyBzdHVmZiAqLworI2RlZmluZSBGT1VSQ0NfSUQzMiAgICAgR1NUX01BS0VfRk9VUkNDKCdJJywgJ0QnLCczJywnMicpCisKKy8qIElTTyBNb3Rpb24gSlBFRyAyMDAwIGZvdXJjYyAqLworI2RlZmluZSBGT1VSQ0NfY2RlZiAgICAgR1NUX01BS0VfRk9VUkNDKCdjJywnZCcsJ2UnLCdmJykKKyNkZWZpbmUgRk9VUkNDX2NtYXAgICAgIEdTVF9NQUtFX0ZPVVJDQygnYycsJ20nLCdhJywncCcpCisjZGVmaW5lIEZPVVJDQ19paGRyICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2knLCdoJywnZCcsJ3InKQorI2RlZmluZSBGT1VSQ0NfanAyaCAgICAgR1NUX01BS0VfRk9VUkNDKCdqJywncCcsJzInLCdoJykKKyNkZWZpbmUgRk9VUkNDX2pwMnggICAgIEdTVF9NQUtFX0ZPVVJDQygnaicsJ3AnLCcyJywneCcpCisjZGVmaW5lIEZPVVJDQ19tanAyICAgICBHU1RfTUFLRV9GT1VSQ0MoJ20nLCdqJywncCcsJzInKQorCisvKiBzb21lIGJ1Z2d5IGhhcmR3YXJlJ3Mgbm90aW9uIG9mIG1kaGQgKi8KKyNkZWZpbmUgRk9VUkNDX21oZHIgICAgIEdTVF9NQUtFX0ZPVVJDQygnbScsJ2gnLCdkJywncicpCisKKy8qIEZyYWdtZW50ZWQgTVA0ICovCisjZGVmaW5lIEZPVVJDQ19idHJ0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2InLCd0JywncicsJ3QnKQorI2RlZmluZSBGT1VSQ0NfbWVoZCAgICAgR1NUX01BS0VfRk9VUkNDKCdtJywnZScsJ2gnLCdkJykKKyNkZWZpbmUgRk9VUkNDX21maGQgICAgIEdTVF9NQUtFX0ZPVVJDQygnbScsJ2YnLCdoJywnZCcpCisjZGVmaW5lIEZPVVJDQ19tZnJhICAgICBHU1RfTUFLRV9GT1VSQ0MoJ20nLCdmJywncicsJ2EnKQorI2RlZmluZSBGT1VSQ0NfbWZybyAgICAgR1NUX01BS0VfRk9VUkNDKCdtJywnZicsJ3InLCdvJykKKyNkZWZpbmUgRk9VUkNDX21vb2YgICAgIEdTVF9NQUtFX0ZPVVJDQygnbScsJ28nLCdvJywnZicpCisjZGVmaW5lIEZPVVJDQ19tdmV4ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ20nLCd2JywnZScsJ3gnKQorI2RlZmluZSBGT1VSQ0NfbXZoZCAgICAgR1NUX01BS0VfRk9VUkNDKCdtJywndicsJ2gnLCdkJykKKyNkZWZpbmUgRk9VUkNDX292YzEgICAgIEdTVF9NQUtFX0ZPVVJDQygnbycsJ3YnLCdjJywnMScpCisjZGVmaW5lIEZPVVJDQ19vd21hICAgICBHU1RfTUFLRV9GT1VSQ0MoJ28nLCd3JywnbScsJ2EnKQorI2RlZmluZSBGT1VSQ0Nfc2R0cCAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywnZCcsJ3QnLCdwJykKKyNkZWZpbmUgRk9VUkNDX3RmaGQgICAgIEdTVF9NQUtFX0ZPVVJDQygndCcsJ2YnLCdoJywnZCcpCisjZGVmaW5lIEZPVVJDQ190ZnJhICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3QnLCdmJywncicsJ2EnKQorI2RlZmluZSBGT1VSQ0NfdHJhZiAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywncicsJ2EnLCdmJykKKyNkZWZpbmUgRk9VUkNDX3RyZXggICAgIEdTVF9NQUtFX0ZPVVJDQygndCcsJ3InLCdlJywneCcpCisjZGVmaW5lIEZPVVJDQ190cnVuICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3QnLCdyJywndScsJ24nKQorI2RlZmluZSBGT1VSQ0Nfd21hXyAgICAgR1NUX01BS0VfRk9VUkNDKCd3JywnbScsJ2EnLCcgJykKKworLyogTVBFRyBEQVNIICovCisjZGVmaW5lIEZPVVJDQ190ZmR0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3QnLCdmJywnZCcsJ3QnKQorCisvKiBYaXBoIGZvdXJjYyAqLworI2RlZmluZSBGT1VSQ0NfWGR4VCAgICAgR1NUX01BS0VfRk9VUkNDKCdYJywnZCcsJ3gnLCdUJykKKyNkZWZpbmUgRk9VUkNDX1hpVGggICAgIEdTVF9NQUtFX0ZPVVJDQygnWCcsJ2knLCdUJywnaCcpCisjZGVmaW5lIEZPVVJDQ190Q3RDICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3QnLCdDJywndCcsJ0MnKQorI2RlZmluZSBGT1VSQ0NfdEN0SCAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywnQycsJ3QnLCdIJykKKyNkZWZpbmUgRk9VUkNDX3RDdF8gICAgIEdTVF9NQUtFX0ZPVVJDQygndCcsJ0MnLCd0JywnIycpCisKKy8qIGlsc3QgbWV0YXRhZ3MgKi8KKyNkZWZpbmUgRk9VUkNDX19jbXQgICAgIEdTVF9NQUtFX0ZPVVJDQygweGE5LCAnYycsJ20nLCd0JykKKworLyogYXBwbGUgdGFncyAqLworI2RlZmluZSBGT1VSQ0NfX21hayAgICAgR1NUX01BS0VfRk9VUkNDKDB4YTksICdtJywnYScsJ2snKQorI2RlZmluZSBGT1VSQ0NfX21vZCAgICAgR1NUX01BS0VfRk9VUkNDKDB4YTksICdtJywnbycsJ2QnKQorI2RlZmluZSBGT1VSQ0NfX3N3ciAgICAgR1NUX01BS0VfRk9VUkNDKDB4YTksICdzJywndycsJ3InKQorCisvKiBDaGFwdGVycyByZWZlcmVuY2UgKi8KKyNkZWZpbmUgRk9VUkNDX2NoYXAgICAgIEdTVF9NQUtFX0ZPVVJDQygnYycsJ2gnLCdhJywncCcpCisKKy8qIEZvciBNaWNyb3NvZnQgV2F2ZSBmb3JtYXRzIGVtYmVkZGVkIGluIHF1aWNrdGltZSwgdGhlIEZPVVJDQyBpcworICAgJ20nLCAncycsIHRoZW4gdGhlIDE2IGJpdCB3YXZlIGNvZGVjIGlkICovCisjZGVmaW5lIE1TX1dBVkVfRk9VUkNDKGNvZGVjaWQpICBHU1RfTUFLRV9GT1VSQ0MoIFwKKyAgICAgICAgJ20nLCAncycsICgoY29kZWNpZCk+PjgpJjB4ZmYsICgoY29kZWNpZCkmMHhmZikpCisKKy8qIE1QRUcgQXBwbGljYXRpb24gRm9ybWF0ICwgU3RlcmVvIFZpZGVvICovCisjZGVmaW5lIEZPVVJDQ19zczAxICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCdzJywnMCcsJzEnKQorI2RlZmluZSBGT1VSQ0Nfc3MwMiAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywncycsJzAnLCcyJykKKyNkZWZpbmUgRk9VUkNDX3N2bWkgICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ3YnLCdtJywnaScpCisjZGVmaW5lIEZPVVJDQ19zY2RpICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3MnLCdjJywnZCcsJ2knKQorCisvKiBQcm90ZWN0ZWQgc3RyZWFtcyAqLworI2RlZmluZSBGT1VSQ0NfZW5jdiAgICAgR1NUX01BS0VfRk9VUkNDKCdlJywnbicsJ2MnLCd2JykKKyNkZWZpbmUgRk9VUkNDX2VuY2EgICAgIEdTVF9NQUtFX0ZPVVJDQygnZScsJ24nLCdjJywnYScpCisjZGVmaW5lIEZPVVJDQ19lbmN0ICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2UnLCduJywnYycsJ3QnKQorI2RlZmluZSBGT1VSQ0NfZW5jcyAgICAgR1NUX01BS0VfRk9VUkNDKCdlJywnbicsJ2MnLCdzJykKKyNkZWZpbmUgRk9VUkNDX3NpbmYgICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ2knLCduJywnZicpCisjZGVmaW5lIEZPVVJDQ19mcm1hICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2YnLCdyJywnbScsJ2EnKQorI2RlZmluZSBGT1VSQ0Nfc2NobSAgICAgR1NUX01BS0VfRk9VUkNDKCdzJywnYycsJ2gnLCdtJykKKyNkZWZpbmUgRk9VUkNDX3NjaGkgICAgIEdTVF9NQUtFX0ZPVVJDQygncycsJ2MnLCdoJywnaScpCisKKy8qIENvbW1vbiBFbmNyeXB0aW9uICovCisjZGVmaW5lIEZPVVJDQ19wc3NoICAgICBHU1RfTUFLRV9GT1VSQ0MoJ3AnLCdzJywncycsJ2gnKQorI2RlZmluZSBGT1VSQ0NfdGVuYyAgICAgR1NUX01BS0VfRk9VUkNDKCd0JywnZScsJ24nLCdjJykKKyNkZWZpbmUgRk9VUkNDX2NlbmMgICAgIEdTVF9NQUtFX0ZPVVJDQygnYycsJ2UnLCduJywnYycpCisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0ZPVVJDQ19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvZ3N0aXNvZmYuYyBiL2dzdC9pc29tcDQvZ3N0aXNvZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjlhNzNhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9nc3Rpc29mZi5jCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogSVNPIEZpbGUgRm9ybWF0IHBhcnNpbmcgbGlicmFyeQorICoKKyAqIGdzdGlzb2ZmLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgU2Ftc3VuZyBFbGVjdHJvbmljcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgQXV0aG9yOiBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5IChDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgInF0ZGVtdXhfZGVidWcuaCIKKyNpbmNsdWRlICJnc3Rpc29mZi5oIgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJ5dGVyZWFkZXIuaD4KKworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgcXRkZW11eF9kZWJ1ZworCit2b2lkCitnc3RfaXNvZmZfcXRfc2lkeF9wYXJzZXJfaW5pdCAoR3N0U2lkeFBhcnNlciAqIHBhcnNlcikKK3sKKyAgcGFyc2VyLT5zdGF0dXMgPSBHU1RfSVNPRkZfUVRfU0lEWF9QQVJTRVJfSU5JVDsKKyAgcGFyc2VyLT5jdW11bGF0aXZlX2VudHJ5X3NpemUgPSAwOworICBwYXJzZXItPnNpZHguZW50cmllcyA9IE5VTEw7CisgIHBhcnNlci0+c2lkeC5lbnRyaWVzX2NvdW50ID0gMDsKK30KKwordm9pZAorZ3N0X2lzb2ZmX3F0X3NpZHhfcGFyc2VyX2NsZWFyIChHc3RTaWR4UGFyc2VyICogcGFyc2VyKQoreworICBnX2ZyZWUgKHBhcnNlci0+c2lkeC5lbnRyaWVzKTsKKyAgcGFyc2VyLT5zaWR4LmVudHJpZXMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2lzb2ZmX3F0X3BhcnNlX3NpZHhfZW50cnkgKEdzdFNpZHhCb3hFbnRyeSAqIGVudHJ5LCBHc3RCeXRlUmVhZGVyICogcmVhZGVyKQoreworICBndWludDMyIGF1eDsKKworICBhdXggPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKHJlYWRlcik7CisgIGVudHJ5LT5yZWZfdHlwZSA9IGF1eCA+PiAzMTsKKyAgZW50cnktPnNpemUgPSBhdXggJiAweDdGRkZGRkZGOworICBlbnRyeS0+ZHVyYXRpb24gPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKHJlYWRlcik7CisgIGF1eCA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAocmVhZGVyKTsKKyAgZW50cnktPnN0YXJ0c193aXRoX3NhcCA9IGF1eCA+PiAzMTsKKyAgZW50cnktPnNhcF90eXBlID0gKChhdXggPj4gMjgpICYgMHg3KTsKKyAgZW50cnktPnNhcF9kZWx0YV90aW1lID0gYXV4ICYgMHhGRkZGRkZGOworfQorCitHc3RJc29mZlBhcnNlclJlc3VsdAorZ3N0X2lzb2ZmX3F0X3NpZHhfcGFyc2VyX2FkZF9kYXRhIChHc3RTaWR4UGFyc2VyICogcGFyc2VyLAorICAgIGNvbnN0IGd1aW50OCAqIGJ1ZmZlciwgZ2ludCBsZW5ndGgsIGd1aW50ICogY29uc3VtZWQpCit7CisgIEdzdElzb2ZmUGFyc2VyUmVzdWx0IHJlcyA9IEdTVF9JU09GRl9RVF9QQVJTRVJfT0s7CisgIEdzdEJ5dGVSZWFkZXIgcmVhZGVyOworICBnc2l6ZSByZW1haW5pbmc7CisgIGd1aW50MzIgZm91cmNjOworCisgIGdzdF9ieXRlX3JlYWRlcl9pbml0ICgmcmVhZGVyLCBidWZmZXIsIGxlbmd0aCk7CisKKyAgc3dpdGNoIChwYXJzZXItPnN0YXR1cykgeworICAgIGNhc2UgR1NUX0lTT0ZGX1FUX1NJRFhfUEFSU0VSX0lOSVQ6CisgICAgICBpZiAoZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKCZyZWFkZXIpIDwgR1NUX0lTT0ZGX1FUX0ZVTExfQk9YX1NJWkUpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHBhcnNlci0+c2l6ZSA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAoJnJlYWRlcik7CisgICAgICBmb3VyY2MgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9sZV91bmNoZWNrZWQgKCZyZWFkZXIpOworICAgICAgaWYgKGZvdXJjYyAhPSBHU1RfSVNPRkZfUVRfRk9VUkNDX1NJRFgpIHsKKyAgICAgICAgcmVzID0gR1NUX0lTT0ZGX1FUX1BBUlNFUl9VTkVYUEVDVEVEOworICAgICAgICBnc3RfYnl0ZV9yZWFkZXJfc2V0X3BvcyAoJnJlYWRlciwgMCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHBhcnNlci0+c2l6ZSA9PSAxKSB7CisgICAgICAgIGlmIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoJnJlYWRlcikgPCAxMikgeworICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9zZXRfcG9zICgmcmVhZGVyLCAwKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHBhcnNlci0+c2l6ZSA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDY0X2JlX3VuY2hlY2tlZCAoJnJlYWRlcik7CisgICAgICB9CisgICAgICBpZiAocGFyc2VyLT5zaXplID09IDApIHsKKyAgICAgICAgcmVzID0gR1NUX0lTT0ZGX1FUX1BBUlNFUl9FUlJPUjsKKyAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX3NldF9wb3MgKCZyZWFkZXIsIDApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHBhcnNlci0+c2lkeC52ZXJzaW9uID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OF91bmNoZWNrZWQgKCZyZWFkZXIpOworICAgICAgcGFyc2VyLT5zaWR4LmZsYWdzID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MjRfbGVfdW5jaGVja2VkICgmcmVhZGVyKTsKKworICAgICAgcGFyc2VyLT5zdGF0dXMgPSBHU1RfSVNPRkZfUVRfU0lEWF9QQVJTRVJfSEVBREVSOworCisgICAgY2FzZSBHU1RfSVNPRkZfUVRfU0lEWF9QQVJTRVJfSEVBREVSOgorICAgICAgcmVtYWluaW5nID0gZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKCZyZWFkZXIpOworICAgICAgaWYgKHJlbWFpbmluZyA8IDEyICsgKHBhcnNlci0+c2lkeC52ZXJzaW9uID09IDAgPyA4IDogMTYpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBwYXJzZXItPnNpZHgucmVmX2lkID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkICgmcmVhZGVyKTsKKyAgICAgIHBhcnNlci0+c2lkeC50aW1lc2NhbGUgPQorICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAoJnJlYWRlcik7CisgICAgICBpZiAocGFyc2VyLT5zaWR4LnZlcnNpb24gPT0gMCkgeworICAgICAgICBwYXJzZXItPnNpZHguZWFybGllc3RfcHRzID0KKyAgICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAoJnJlYWRlcik7CisgICAgICAgIHBhcnNlci0+c2lkeC5maXJzdF9vZmZzZXQgPSBwYXJzZXItPnNpZHguZWFybGllc3RfcHRzID0KKyAgICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAoJnJlYWRlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXJzZXItPnNpZHguZWFybGllc3RfcHRzID0KKyAgICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDY0X2JlX3VuY2hlY2tlZCAoJnJlYWRlcik7CisgICAgICAgIHBhcnNlci0+c2lkeC5maXJzdF9vZmZzZXQgPQorICAgICAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50NjRfYmVfdW5jaGVja2VkICgmcmVhZGVyKTsKKyAgICAgIH0KKyAgICAgIC8qIHNraXAgMiByZXNlcnZlZCBieXRlcyAqLworICAgICAgZ3N0X2J5dGVfcmVhZGVyX3NraXBfdW5jaGVja2VkICgmcmVhZGVyLCAyKTsKKyAgICAgIHBhcnNlci0+c2lkeC5lbnRyaWVzX2NvdW50ID0KKyAgICAgICAgICBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9iZV91bmNoZWNrZWQgKCZyZWFkZXIpOworCisgICAgICBHU1RfTE9HICgiVGltZXNjYWxlOiAlIiBHX0dVSU5UMzJfRk9STUFULCBwYXJzZXItPnNpZHgudGltZXNjYWxlKTsKKyAgICAgIEdTVF9MT0cgKCJFYXJsaWVzdCBwdHM6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHBhcnNlci0+c2lkeC5lYXJsaWVzdF9wdHMpOworICAgICAgR1NUX0xPRyAoIkZpcnN0IG9mZnNldDogJSIgR19HVUlOVDY0X0ZPUk1BVCwgcGFyc2VyLT5zaWR4LmZpcnN0X29mZnNldCk7CisKKyAgICAgIHBhcnNlci0+Y3VtdWxhdGl2ZV9wdHMgPQorICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnRfcm91bmQgKHBhcnNlci0+c2lkeC5lYXJsaWVzdF9wdHMsCisgICAgICAgICAgR1NUX1NFQ09ORCwgcGFyc2VyLT5zaWR4LnRpbWVzY2FsZSk7CisKKyAgICAgIGlmIChwYXJzZXItPnNpZHguZW50cmllc19jb3VudCkgeworICAgICAgICBwYXJzZXItPnNpZHguZW50cmllcyA9CisgICAgICAgICAgICBnX21hbGxvYyAoc2l6ZW9mIChHc3RTaWR4Qm94RW50cnkpICogcGFyc2VyLT5zaWR4LmVudHJpZXNfY291bnQpOworICAgICAgfQorICAgICAgcGFyc2VyLT5zaWR4LmVudHJ5X2luZGV4ID0gMDsKKworICAgICAgcGFyc2VyLT5zdGF0dXMgPSBHU1RfSVNPRkZfUVRfU0lEWF9QQVJTRVJfREFUQTsKKworICAgIGNhc2UgR1NUX0lTT0ZGX1FUX1NJRFhfUEFSU0VSX0RBVEE6CisgICAgICB3aGlsZSAocGFyc2VyLT5zaWR4LmVudHJ5X2luZGV4IDwgcGFyc2VyLT5zaWR4LmVudHJpZXNfY291bnQpIHsKKyAgICAgICAgR3N0U2lkeEJveEVudHJ5ICplbnRyeSA9CisgICAgICAgICAgICAmcGFyc2VyLT5zaWR4LmVudHJpZXNbcGFyc2VyLT5zaWR4LmVudHJ5X2luZGV4XTsKKworICAgICAgICByZW1haW5pbmcgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoJnJlYWRlcik7CisgICAgICAgIGlmIChyZW1haW5pbmcgPCAxMikKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBlbnRyeS0+b2Zmc2V0ID0gcGFyc2VyLT5jdW11bGF0aXZlX2VudHJ5X3NpemU7CisgICAgICAgIGVudHJ5LT5wdHMgPSBwYXJzZXItPmN1bXVsYXRpdmVfcHRzOworICAgICAgICBnc3RfaXNvZmZfcXRfcGFyc2Vfc2lkeF9lbnRyeSAoZW50cnksICZyZWFkZXIpOworICAgICAgICBlbnRyeS0+ZHVyYXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50X3JvdW5kIChlbnRyeS0+ZHVyYXRpb24sCisgICAgICAgICAgICBHU1RfU0VDT05ELCBwYXJzZXItPnNpZHgudGltZXNjYWxlKTsKKyAgICAgICAgcGFyc2VyLT5jdW11bGF0aXZlX2VudHJ5X3NpemUgKz0gZW50cnktPnNpemU7CisgICAgICAgIHBhcnNlci0+Y3VtdWxhdGl2ZV9wdHMgKz0gZW50cnktPmR1cmF0aW9uOworCisgICAgICAgIEdTVF9MT0cgKCJTaWR4IGVudHJ5ICVkKSBvZmZzZXQ6ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgcHRzOiAlIgorICAgICAgICAgICAgR1NUX1RJTUVfRk9STUFUICIsIGR1cmF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVCAiIC0gc2l6ZSAlIgorICAgICAgICAgICAgR19HVUlOVDMyX0ZPUk1BVCwgcGFyc2VyLT5zaWR4LmVudHJ5X2luZGV4LCBlbnRyeS0+b2Zmc2V0LAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZW50cnktPnB0cyksIEdTVF9USU1FX0FSR1MgKGVudHJ5LT5kdXJhdGlvbiksCisgICAgICAgICAgICBlbnRyeS0+c2l6ZSk7CisKKyAgICAgICAgcGFyc2VyLT5zaWR4LmVudHJ5X2luZGV4Kys7CisgICAgICB9CisKKyAgICAgIGlmIChwYXJzZXItPnNpZHguZW50cnlfaW5kZXggPT0gcGFyc2VyLT5zaWR4LmVudHJpZXNfY291bnQpCisgICAgICAgIHBhcnNlci0+c3RhdHVzID0gR1NUX0lTT0ZGX1FUX1NJRFhfUEFSU0VSX0ZJTklTSEVEOworICAgICAgZWxzZQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9JU09GRl9RVF9TSURYX1BBUlNFUl9GSU5JU0hFRDoKKyAgICAgIHBhcnNlci0+c2lkeC5lbnRyeV9pbmRleCA9IDA7CisgICAgICByZXMgPSBHU1RfSVNPRkZfUVRfUEFSU0VSX0RPTkU7CisgICAgICBicmVhazsKKyAgfQorCisgICpjb25zdW1lZCA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfcG9zICgmcmVhZGVyKTsKKyAgcmV0dXJuIHJlczsKK30KKworR3N0SXNvZmZQYXJzZXJSZXN1bHQKK2dzdF9pc29mZl9xdF9zaWR4X3BhcnNlcl9hZGRfYnVmZmVyIChHc3RTaWR4UGFyc2VyICogcGFyc2VyLCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgZ3VpbnQgKiBjb25zdW1lZCkKK3sKKyAgR3N0SXNvZmZQYXJzZXJSZXN1bHQgcmVzID0gR1NUX0lTT0ZGX1FUX1BBUlNFUl9PSzsKKyAgR3N0TWFwSW5mbyBpbmZvOworCisgIGlmICghZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJmluZm8sIEdTVF9NQVBfUkVBRCkpIHsKKyAgICAqY29uc3VtZWQgPSAwOworICAgIHJldHVybiBHU1RfSVNPRkZfUVRfUEFSU0VSX0VSUk9SOworICB9CisKKyAgcmVzID0KKyAgICAgIGdzdF9pc29mZl9xdF9zaWR4X3BhcnNlcl9hZGRfZGF0YSAocGFyc2VyLCBpbmZvLmRhdGEsIGluZm8uc2l6ZSwKKyAgICAgIGNvbnN1bWVkKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZpbmZvKTsKKyAgcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvZ3N0aXNvZmYuaCBiL2dzdC9pc29tcDQvZ3N0aXNvZmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmZiZjMzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9nc3Rpc29mZi5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogSVNPIEZpbGUgRm9ybWF0IHBhcnNpbmcgbGlicmFyeQorICoKKyAqIGdzdGlzb2ZmLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgU2Ftc3VuZyBFbGVjdHJvbmljcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgQXV0aG9yOiBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0Bvc2cuc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5IChDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9JU09GRl9RVF9IX18KKyNkZWZpbmUgX19HU1RfSVNPRkZfUVRfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK0dfQkVHSU5fREVDTFMKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX0lTT0ZGX1FUX1BBUlNFUl9PSywKKyAgR1NUX0lTT0ZGX1FUX1BBUlNFUl9ET05FLAorICBHU1RfSVNPRkZfUVRfUEFSU0VSX1VORVhQRUNURUQsCisgIEdTVF9JU09GRl9RVF9QQVJTRVJfRVJST1IKK30gR3N0SXNvZmZQYXJzZXJSZXN1bHQ7CisKKy8qIHRoaXMgaXMgdGhlIG1pbmltdW0gc2l6ZSwgaXQgY2FuIGJlIGxhcmdlciBpZiBpdAorICogdXNlcyBleHRlbmRlZCBzaXplIG9yIHR5cGUgKi8KKyNkZWZpbmUgR1NUX0lTT0ZGX1FUX0ZVTExfQk9YX1NJWkUgMTIKKworI2RlZmluZSBHU1RfSVNPRkZfUVRfRk9VUkNDX1NJRFggR1NUX01BS0VfRk9VUkNDKCdzJywnaScsJ2QnLCd4JykKK3R5cGVkZWYgc3RydWN0IF9Hc3RTaWR4Qm94RW50cnkKK3sKKyAgZ2Jvb2xlYW4gcmVmX3R5cGU7CisgIGd1aW50MzIgc2l6ZTsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uOworICBnYm9vbGVhbiBzdGFydHNfd2l0aF9zYXA7CisgIGd1aW50OCBzYXBfdHlwZTsKKyAgZ3VpbnQzMiBzYXBfZGVsdGFfdGltZTsKKworICBndWludDY0IG9mZnNldDsKKyAgR3N0Q2xvY2tUaW1lIHB0czsKK30gR3N0U2lkeEJveEVudHJ5OworCit0eXBlZGVmIHN0cnVjdCBfR3N0U2lkeEJveAoreworICBndWludDggdmVyc2lvbjsKKyAgZ3VpbnQzMiBmbGFnczsKKworICBndWludDMyIHJlZl9pZDsKKyAgZ3VpbnQzMiB0aW1lc2NhbGU7CisgIGd1aW50NjQgZWFybGllc3RfcHRzOworICBndWludDY0IGZpcnN0X29mZnNldDsKKworICBnaW50IGVudHJ5X2luZGV4OworICBnaW50IGVudHJpZXNfY291bnQ7CisKKyAgR3N0U2lkeEJveEVudHJ5ICplbnRyaWVzOworfSBHc3RTaWR4Qm94OworCit0eXBlZGVmIGVudW0gX0dzdFNpZHhQYXJzZXJTdGF0dXMKK3sKKyAgR1NUX0lTT0ZGX1FUX1NJRFhfUEFSU0VSX0lOSVQsCisgIEdTVF9JU09GRl9RVF9TSURYX1BBUlNFUl9IRUFERVIsCisgIEdTVF9JU09GRl9RVF9TSURYX1BBUlNFUl9EQVRBLAorICBHU1RfSVNPRkZfUVRfU0lEWF9QQVJTRVJfRklOSVNIRUQKK30gR3N0U2lkeFBhcnNlclN0YXR1czsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNpZHhQYXJzZXIKK3sKKyAgR3N0U2lkeFBhcnNlclN0YXR1cyBzdGF0dXM7CisKKyAgZ3VpbnQ2NCBzaXplOworICBndWludDY0IGN1bXVsYXRpdmVfZW50cnlfc2l6ZTsKKyAgZ3VpbnQ2NCBjdW11bGF0aXZlX3B0czsKKworICBHc3RTaWR4Qm94IHNpZHg7Cit9IEdzdFNpZHhQYXJzZXI7CisKK3ZvaWQgZ3N0X2lzb2ZmX3F0X3NpZHhfcGFyc2VyX2luaXQgKEdzdFNpZHhQYXJzZXIgKiBwYXJzZXIpOwordm9pZCBnc3RfaXNvZmZfcXRfc2lkeF9wYXJzZXJfY2xlYXIgKEdzdFNpZHhQYXJzZXIgKiBwYXJzZXIpOworR3N0SXNvZmZQYXJzZXJSZXN1bHQgZ3N0X2lzb2ZmX3F0X3NpZHhfcGFyc2VyX2FkZF9kYXRhIChHc3RTaWR4UGFyc2VyICogcGFyc2VyLCBjb25zdCBndWludDggKiBidWZmZXIsIGdpbnQgbGVuZ3RoLCBndWludCAqIGNvbnN1bWVkKTsKK0dzdElzb2ZmUGFyc2VyUmVzdWx0IGdzdF9pc29mZl9xdF9zaWR4X3BhcnNlcl9hZGRfYnVmZmVyIChHc3RTaWR4UGFyc2VyICogcGFyc2VyLCBHc3RCdWZmZXIgKiBidWYsIGd1aW50ICogY29uc3VtZWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfSVNPRkZfUVRfSF9fICovCisKZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvZ3N0cXRtb292cmVjb3Zlci5jIGIvZ3N0L2lzb21wNC9nc3RxdG1vb3ZyZWNvdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkMmI5MQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvZ3N0cXRtb292cmVjb3Zlci5jCkBAIC0wLDAgKzEsMzg3IEBACisvKiBRdWlja3RpbWUgbXV4ZXIgcGx1Z2luIGZvciBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcXRtb292cmVjb3ZlcgorICogQHNob3J0X2Rlc2NyaXB0aW9uOiBVdGlsaXR5IGVsZW1lbnQgZm9yIHJlY292ZXJpbmcgdW5maW5pc2hlZCBxdWlja3RpbWUgZmlsZXMKKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8cGFyYT4KKyAqIFRoaXMgZWxlbWVudCByZWNvdmVycyBxdWlja3RpbWUgZmlsZXMgY3JlYXRlZCB3aXRoIHF0bXV4IHVzaW5nIHRoZSBtb292CisgKiByZWNvdmVyeSBmZWF0dXJlLgorICogPC9wYXJhPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIDxwYXJhPgorICogPHByb2dyYW1saXN0aW5nPgorICogVE9ETworICogPC9wcm9ncmFtbGlzdGluZz4KKyAqIDwvcGFyYT4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z2xpYi9nc3RkaW8uaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnc3RxdG1vb3ZyZWNvdmVyLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9xdF9tb292X3JlY292ZXJfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3F0X21vb3ZfcmVjb3Zlcl9kZWJ1ZworCisvKiBRVE1vb3ZSZWNvdmVyIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUkVDT1ZFUllfSU5QVVQsCisgIFBST1BfQlJPS0VOX0lOUFVULAorICBQUk9QX0ZJWEVEX09VVFBVVCwKKyAgUFJPUF9GQVNUX1NUQVJUX01PREUKK307CisKKyNkZWZpbmUgZ3N0X3F0X21vb3ZfcmVjb3Zlcl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RRVE1vb3ZSZWNvdmVyLCBnc3RfcXRfbW9vdl9yZWNvdmVyLCBHU1RfVFlQRV9QSVBFTElORSk7CisKKy8qIHByb3BlcnR5IGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgZ3N0X3F0X21vb3ZfcmVjb3Zlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcXRfbW9vdl9yZWNvdmVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9xdF9tb292X3JlY292ZXJfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIHZvaWQgZ3N0X3F0X21vb3ZfcmVjb3Zlcl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbW9vdl9yZWNvdmVyX2NsYXNzX2luaXQgKEdzdFFUTW9vdlJlY292ZXJDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcXRfbW9vdl9yZWNvdmVyX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcXRfbW9vdl9yZWNvdmVyX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3F0X21vb3ZfcmVjb3Zlcl9zZXRfcHJvcGVydHk7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3F0X21vb3ZfcmVjb3Zlcl9jaGFuZ2Vfc3RhdGU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9GSVhFRF9PVVRQVVQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZml4ZWQtb3V0cHV0IiwKKyAgICAgICAgICAiUGF0aCB0byB3cml0ZSB0aGUgZml4ZWQgZmlsZSIsCisgICAgICAgICAgIlBhdGggdG8gd3JpdGUgdGhlIGZpeGVkIGZpbGUgdG8gKHVzZWQgYXMgb3V0cHV0KSIsCisgICAgICAgICAgTlVMTCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQlJPS0VOX0lOUFVULAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImJyb2tlbi1pbnB1dCIsCisgICAgICAgICAgIlBhdGggdG8gYnJva2VuIGlucHV0IGZpbGUiLAorICAgICAgICAgICJQYXRoIHRvIGJyb2tlbiBpbnB1dCBmaWxlLiAoSWYgcXRtdXggd2FzIG9uIGZhc3RzdGFydCBtb2RlLCB0aGlzICIKKyAgICAgICAgICAiZmlsZSBpcyB0aGUgZmFzdHN0YXJ0IGZpbGUpIiwgTlVMTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SRUNPVkVSWV9JTlBVVCwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJyZWNvdmVyeS1pbnB1dCIsCisgICAgICAgICAgIlBhdGggdG8gcmVjb3ZlcnkgZmlsZSIsCisgICAgICAgICAgIlBhdGggdG8gcmVjb3ZlcnkgZmlsZSAodXNlZCBhcyBpbnB1dCkiLCBOVUxMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0ZBU1RfU1RBUlRfTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZmFzdHN0YXJ0LW1vZGUiLAorICAgICAgICAgICJJZiB0aGUgYnJva2VuIGlucHV0IGlzIGZyb20gZmFzdHN0YXJ0IG1vZGUiLAorICAgICAgICAgICJJZiB0aGUgYnJva2VuIGlucHV0IGlzIGZyb20gZmFzdHN0YXJ0IG1vZGUiLAorICAgICAgICAgIEZBTFNFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3F0X21vb3ZfcmVjb3Zlcl9kZWJ1ZywgInF0bW9vdnJlY292ZXIiLCAwLAorICAgICAgIlFUIE1vb3ZpZSBSZWNvdmVyIik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlFUIE1vb3YgUmVjb3ZlciIsCisgICAgICAiVXRpbCIsICJSZWNvdmVycyB1bmZpbmlzaGVkIHF0bXV4IGZpbGVzIiwKKyAgICAgICJUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdF9tb292X3JlY292ZXJfaW5pdCAoR3N0UVRNb292UmVjb3ZlciAqIHF0bXIpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbW9vdl9yZWNvdmVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbW9vdl9yZWNvdmVyX3J1biAodm9pZCAqZGF0YSkKK3sKKyAgRklMRSAqbW9vdnJlYyA9IE5VTEw7CisgIEZJTEUgKm1kYXRpbnB1dCA9IE5VTEw7CisgIEZJTEUgKm91dHB1dCA9IE5VTEw7CisgIE1kYXRSZWNvdkZpbGUgKm1kYXRfcmVjb3YgPSBOVUxMOworICBNb292UmVjb3ZGaWxlICptb292X3JlY292ID0gTlVMTDsKKyAgR3N0UVRNb292UmVjb3ZlciAqcXRtciA9IEdTVF9RVF9NT09WX1JFQ09WRVJfQ0FTVCAoZGF0YSk7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgR0Vycm9yICp3YXJuID0gTlVMTDsKKworICBHU1RfTE9HX09CSkVDVCAocXRtciwgIlN0YXJ0aW5nIHRhc2siKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdG1yLCAiVmFsaWRhdGluZyBwcm9wZXJ0aWVzIik7CisgIEdTVF9PQkpFQ1RfTE9DSyAocXRtcik7CisgIC8qIHZhbGlkYXRlIHByb3BlcnRpZXMgKi8KKyAgaWYgKHF0bXItPmJyb2tlbl9pbnB1dCA9PSBOVUxMKSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXIpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG1yLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgICgiUGxlYXNlIHNldCBicm9rZW4taW5wdXQgcHJvcGVydHkiKSwgKE5VTEwpKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorICBpZiAocXRtci0+cmVjb3ZlcnlfaW5wdXQgPT0gTlVMTCkgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChxdG1yKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtciwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoIlBsZWFzZSBzZXQgcmVjb3ZlcnktaW5wdXQgcHJvcGVydHkiKSwgKE5VTEwpKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorICBpZiAocXRtci0+Zml4ZWRfb3V0cHV0ID09IE5VTEwpIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocXRtcik7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXIsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKCJQbGVhc2Ugc2V0IGZpeGVkLW91dHB1dCBwcm9wZXJ0eSIpLCAoTlVMTCkpOworICAgIGdvdG8gZW5kOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtciwgIk9wZW5pbmcgaW5wdXQvb3V0cHV0IGZpbGVzIik7CisgIC8qIG9wZW4gZmlsZXMgKi8KKyAgbW9vdnJlYyA9IGdfZm9wZW4gKHF0bXItPnJlY292ZXJ5X2lucHV0LCAicmIiKTsKKyAgaWYgKG1vb3ZyZWMgPT0gTlVMTCkgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChxdG1yKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtciwgUkVTT1VSQ0UsIE9QRU5fUkVBRCwKKyAgICAgICAgKCJGYWlsZWQgdG8gb3BlbiByZWNvdmVyeS1pbnB1dCBmaWxlIiksIChOVUxMKSk7CisgICAgZ290byBlbmQ7CisgIH0KKworICBtZGF0aW5wdXQgPSBnX2ZvcGVuIChxdG1yLT5icm9rZW5faW5wdXQsICJyYiIpOworICBpZiAobWRhdGlucHV0ID09IE5VTEwpIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocXRtcik7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXIsIFJFU09VUkNFLCBPUEVOX1JFQUQsCisgICAgICAgICgiRmFpbGVkIHRvIG9wZW4gYnJva2VuLWlucHV0IGZpbGUiKSwgKE5VTEwpKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorICBvdXRwdXQgPSBnX2ZvcGVuIChxdG1yLT5maXhlZF9vdXRwdXQsICJ3YisiKTsKKyAgaWYgKG91dHB1dCA9PSBOVUxMKSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXIpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG1yLCBSRVNPVVJDRSwgT1BFTl9SRUFEX1dSSVRFLAorICAgICAgICAoIkZhaWxlZCB0byBvcGVuIGZpeGVkLW91dHB1dCBmaWxlIiksIChOVUxMKSk7CisgICAgZ290byBlbmQ7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXIsICJQYXJzaW5nIGlucHV0IGZpbGVzIik7CisgIC8qIG5vdyBjcmVhdGUgb3VyIHN0cnVjdHVyZXMgKi8KKyAgbWRhdF9yZWNvdiA9IG1kYXRfcmVjb3ZfZmlsZV9jcmVhdGUgKG1kYXRpbnB1dCwgcXRtci0+ZmFzdHN0YXJ0X21vZGUsICZlcnIpOworICBtZGF0aW5wdXQgPSBOVUxMOworICBpZiAobWRhdF9yZWNvdiA9PSBOVUxMKSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXIsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgiQnJva2VuIGZpbGUgY291bGQgbm90IGJlIHBhcnNlZCBjb3JyZWN0bHkiKSwgKE5VTEwpKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorICBtb292X3JlY292ID0gbW9vdl9yZWNvdl9maWxlX2NyZWF0ZSAobW9vdnJlYywgJmVycik7CisgIG1vb3ZyZWMgPSBOVUxMOworICBpZiAobW9vdl9yZWNvdiA9PSBOVUxMKSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXIsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgICgiUmVjb3ZlcnkgZmlsZSBjb3VsZCBub3QgYmUgcGFyc2VkIGNvcnJlY3RseSIpLCAoTlVMTCkpOworICAgIGdvdG8gZW5kOworICB9CisKKyAgLyogbm93IHBhcnNlIHRoZSBidWZmZXJzIGRhdGEgZnJvbSBtb292cmVjICovCisgIGlmICghbW9vdl9yZWNvdl9wYXJzZV9idWZmZXJzIChtb292X3JlY292LCBtZGF0X3JlY292LCAmZXJyKSkgeworICAgIGdvdG8gZW5kOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtciwgIldyaXRpbmcgZml4ZWQgZmlsZSB0byBvdXRwdXQiKTsKKyAgaWYgKCFtb292X3JlY292X3dyaXRlX2ZpbGUgKG1vb3ZfcmVjb3YsIG1kYXRfcmVjb3YsIG91dHB1dCwgJmVyciwgJndhcm4pKSB7CisgICAgZ290byBlbmQ7CisgIH0KKworICBpZiAod2FybikgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHF0bXIsIFJFU09VUkNFLCBGQUlMRUQsICgiJXMiLCB3YXJuLT5tZXNzYWdlKSwgKE5VTEwpKTsKKyAgICBnX2Vycm9yX2ZyZWUgKHdhcm4pOworICB9CisKKyAgLyogaGVyZSBtZWFucyBzdWNjZXNzICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXIsICJGaW5pc2hlZCBzdWNjZXNzZnVsbHksIHBvc3RpbmcgRU9TIik7CisgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAocXRtciksCisgICAgICBnc3RfbWVzc2FnZV9uZXdfZW9zIChHU1RfT0JKRUNUX0NBU1QgKHF0bXIpKSk7CisKK2VuZDoKKyAgR1NUX0xPR19PQkpFQ1QgKHF0bXIsICJGaW5hbGl6aW5nIHRhc2siKTsKKyAgaWYgKGVycikgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG1yLCBSRVNPVVJDRSwgRkFJTEVELCAoIiVzIiwgZXJyLT5tZXNzYWdlKSwgKE5VTEwpKTsKKyAgICBnX2Vycm9yX2ZyZWUgKGVycik7CisgIH0KKworICBpZiAobW9vdl9yZWNvdikKKyAgICBtb292X3JlY292X2ZpbGVfZnJlZSAobW9vdl9yZWNvdik7CisgIGlmIChtb292cmVjKQorICAgIGZjbG9zZSAobW9vdnJlYyk7CisKKyAgaWYgKG1kYXRfcmVjb3YpCisgICAgbWRhdF9yZWNvdl9maWxlX2ZyZWUgKG1kYXRfcmVjb3YpOworICBpZiAobWRhdGlucHV0KQorICAgIGZjbG9zZSAobWRhdGlucHV0KTsKKworICBpZiAob3V0cHV0KQorICAgIGZjbG9zZSAob3V0cHV0KTsKKyAgR1NUX0xPR19PQkpFQ1QgKHF0bXIsICJMZWF2aW5nIHRhc2siKTsKKyAgZ3N0X3Rhc2tfc3RvcCAocXRtci0+dGFzayk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbW9vdl9yZWNvdmVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RRVE1vb3ZSZWNvdmVyICpxdG1yID0gR1NUX1FUX01PT1ZfUkVDT1ZFUl9DQVNUIChvYmplY3QpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAocXRtcik7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9GQVNUX1NUQVJUX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcXRtci0+ZmFzdHN0YXJ0X21vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JST0tFTl9JTlBVVDoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHF0bXItPmJyb2tlbl9pbnB1dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVDT1ZFUllfSU5QVVQ6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBxdG1yLT5yZWNvdmVyeV9pbnB1dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRklYRURfT1VUUFVUOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgcXRtci0+Zml4ZWRfb3V0cHV0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X21vb3ZfcmVjb3Zlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UVRNb292UmVjb3ZlciAqcXRtciA9IEdTVF9RVF9NT09WX1JFQ09WRVJfQ0FTVCAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHF0bXIpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfRkFTVF9TVEFSVF9NT0RFOgorICAgICAgcXRtci0+ZmFzdHN0YXJ0X21vZGUgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQlJPS0VOX0lOUFVUOgorICAgICAgZ19mcmVlIChxdG1yLT5icm9rZW5faW5wdXQpOworICAgICAgcXRtci0+YnJva2VuX2lucHV0ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVDT1ZFUllfSU5QVVQ6CisgICAgICBnX2ZyZWUgKHF0bXItPnJlY292ZXJ5X2lucHV0KTsKKyAgICAgIHF0bXItPnJlY292ZXJ5X2lucHV0ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRklYRURfT1VUUFVUOgorICAgICAgZ19mcmVlIChxdG1yLT5maXhlZF9vdXRwdXQpOworICAgICAgcXRtci0+Zml4ZWRfb3V0cHV0ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChxdG1yKTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcXRfbW9vdl9yZWNvdmVyX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RRVE1vb3ZSZWNvdmVyICpxdG1yID0gR1NUX1FUX01PT1ZfUkVDT1ZFUl9DQVNUIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIHF0bXItPnRhc2sgPSBnc3RfdGFza19uZXcgKGdzdF9xdF9tb292X3JlY292ZXJfcnVuLCBxdG1yLCBOVUxMKTsKKyAgICAgIGdfcmVjX211dGV4X2luaXQgKCZxdG1yLT50YXNrX211dGV4KTsKKyAgICAgIGdzdF90YXNrX3NldF9sb2NrIChxdG1yLT50YXNrLCAmcXRtci0+dGFza19tdXRleCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgICBnc3RfdGFza19zdGFydCAocXRtci0+dGFzayk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUExBWUlOR19UT19QQVVTRUQ6CisgICAgICBnc3RfdGFza19zdG9wIChxdG1yLT50YXNrKTsKKyAgICAgIGdzdF90YXNrX2pvaW4gKHF0bXItPnRhc2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBpZiAoZ3N0X3Rhc2tfZ2V0X3N0YXRlIChxdG1yLT50YXNrKSAhPSBHU1RfVEFTS19TVE9QUEVEKQorICAgICAgICBHU1RfRVJST1IgKCJ0YXNrICVwIHNob3VsZCBiZSBzdG9wcGVkIGJ5IG5vdyIsIHF0bXItPnRhc2spOworICAgICAgZ3N0X29iamVjdF91bnJlZiAocXRtci0+dGFzayk7CisgICAgICBxdG1yLT50YXNrID0gTlVMTDsKKyAgICAgIGdfcmVjX211dGV4X2NsZWFyICgmcXRtci0+dGFza19tdXRleCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworCitnYm9vbGVhbgorZ3N0X3F0X21vb3ZfcmVjb3Zlcl9yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInF0bW9vdnJlY292ZXIiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfUVRfTU9PVl9SRUNPVkVSKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvZ3N0cXRtb292cmVjb3Zlci5oIGIvZ3N0L2lzb21wNC9nc3RxdG1vb3ZyZWNvdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2YzIyMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvZ3N0cXRtb292cmVjb3Zlci5oCkBAIC0wLDAgKzEsODggQEAKKy8qIFF1aWNrdGltZSBtdXhlciBwbHVnaW4gZm9yIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoaWFnbyBTYW50b3MgPHRoaWFnby5zb3VzYS5zYW50b3NAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKgorICogVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIFNvdXJjZSBDb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlLgorICogU2VlIGZ1cnRoZXIgZXhwbGFuYXRpb24gYXR0YWNoZWQgaW4gTGljZW5zZSBTdGF0ZW1lbnQgKGRpc3RyaWJ1dGVkIGluIHRoZSBmaWxlCisgKiBMSUNFTlNFKS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX0dTVF9RVF9NT09WX1JFQ09WRVJfSF9fCisjZGVmaW5lIF9fR1NUX1FUX01PT1ZfUkVDT1ZFUl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImF0b21zLmgiCisjaW5jbHVkZSAiYXRvbXNyZWNvdmVyeS5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUVRfTU9PVl9SRUNPVkVSIChnc3RfcXRfbW9vdl9yZWNvdmVyX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9RVF9NT09WX1JFQ09WRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUVRfTU9PVl9SRUNPVkVSLCBHc3RRVE1vb3ZSZWNvdmVyKSkKKyNkZWZpbmUgR1NUX1FUX01PT1ZfUkVDT1ZFUl9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUVRfTU9PVl9SRUNPVkVSLCBHc3RRVE1vb3ZSZWNvdmVyKSkKKyNkZWZpbmUgR1NUX0lTX1FUX01PT1ZfUkVDT1ZFUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9RVF9NT09WX1JFQ09WRVIpKQorI2RlZmluZSBHU1RfSVNfUVRfTU9PVl9SRUNPVkVSX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9RVF9NT09WX1JFQ09WRVIpKQorI2RlZmluZSBHU1RfUVRfTU9PVl9SRUNPVkVSX0NBU1Qob2JqKSAoKEdzdFFUTW9vdlJlY292ZXIqKShvYmopKQorCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RRVE1vb3ZSZWNvdmVyIEdzdFFUTW9vdlJlY292ZXI7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UVRNb292UmVjb3ZlckNsYXNzIEdzdFFUTW9vdlJlY292ZXJDbGFzczsKKworc3RydWN0IF9Hc3RRVE1vb3ZSZWNvdmVyCit7CisgIEdzdFBpcGVsaW5lIHBpcGVsaW5lOworCisgIEdzdFRhc2sgKnRhc2s7CisgIEdSZWNNdXRleCB0YXNrX211dGV4OworCisgIC8qIHByb3BlcnRpZXMgKi8KKyAgZ2Jvb2xlYW4gIGZhc3RzdGFydF9tb2RlOworICBnY2hhciAgICAqcmVjb3ZlcnlfaW5wdXQ7CisgIGdjaGFyICAgICpmaXhlZF9vdXRwdXQ7CisgIGdjaGFyICAgICpicm9rZW5faW5wdXQ7Cit9OworCitzdHJ1Y3QgX0dzdFFUTW9vdlJlY292ZXJDbGFzcworeworICBHc3RQaXBlbGluZUNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9xdF9tb292X3JlY292ZXJfZ2V0X3R5cGUgKHZvaWQpOworZ2Jvb2xlYW4gZ3N0X3F0X21vb3ZfcmVjb3Zlcl9yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1FUX01PT1ZfUkVDT1ZFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvZ3N0cXRtdXgtZG9jLmMgYi9nc3QvaXNvbXA0L2dzdHF0bXV4LWRvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiODU3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L2dzdHF0bXV4LWRvYy5jCkBAIC0wLDAgKzEsMjQyIEBACisvKiBRdWlja3RpbWUgbXV4ZXIgZG9jdW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc2YubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29udGFjdDogU3RlZmFuIEtvc3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IG1wNG11eCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtbXA0bXV4CisgKiBAc2hvcnRfZGVzY3JpcHRpb246IE11eGVyIGZvciBJU08gTVBFRy00ICgubXA0KSBmaWxlcworICoKKyAqIFRoaXMgZWxlbWVudCBtZXJnZXMgc3RyZWFtcyAoYXVkaW8gYW5kIHZpZGVvKSBpbnRvIElTTyBNUEVHLTQgKC5tcDQpIGZpbGVzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgYmFja2dyb3VuZCBpbnRlbmRzIHRvIGV4cGxhaW4gd2h5IHZhcmlvdXMgc2ltaWxhciBtdXhlcnMKKyAqIGFyZSBwcmVzZW50IGluIHRoaXMgcGx1Z2luLgorICoKKyAqIFRoZSA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LmFwcGxlLmNvbS9xdWlja3RpbWUvcmVzb3VyY2VzL3F0ZmlsZWZvcm1hdC5wZGYiPgorICogUXVpY2tUaW1lIGZpbGUgZm9ybWF0IHNwZWNpZmljYXRpb248L3VsaW5rPiBzZXJ2ZWQgYXMgYmFzaXMgZm9yIHRoZSBNUDQgZmlsZQorICogZm9ybWF0IHNwZWNpZmljYXRpb24gKG1wNG11eCksIGFuZCBhcyBzdWNoIHRoZSBRdWlja1RpbWUgZmlsZSBzdHJ1Y3R1cmUgaXMKKyAqIG5lYXJseSBpZGVudGljYWwgdG8gdGhlIHNvLWNhbGxlZCBJU08gQmFzZSBNZWRpYSBmaWxlIGZvcm1hdCBkZWZpbmVkIGluCisgKiBJU08gMTQ0OTYtMTIgKGV4Y2VwdCBmb3Igc29tZSBtZWRpYSBzcGVjaWZpYyBwYXJ0cykuCisgKiBJbiB0dXJuLCB0aGUgbGF0dGVyIElTTyBCYXNlIE1lZGlhIGZvcm1hdCB3YXMgZnVydGhlciBzcGVjaWFsaXplZCBhcyBhCisgKiBNb3Rpb24gSlBFRy0yMDAwIGZpbGUgZm9ybWF0IGluIElTTyAxNTQ0NC0zIChtajJtdXgpCisgKiBhbmQgaW4gdmFyaW91cyAzR1BQKDIpIHNwZWNzICgzZ3BwbXV4KS4KKyAqIFRoZSBmcmFnbWVudGVkIGZpbGUgZmVhdHVyZXMgZGVmaW5lZCAob25seSkgaW4gSVNPIEJhc2UgTWVkaWEgYXJlIHVzZWQgYnkKKyAqIElTTVYgZmlsZXMgbWFraW5nIHVwIChhLm8uKSBTbW9vdGggU3RyZWFtaW5nIChpc21sbXV4KS4KKyAqCisgKiBBIGZldyBwcm9wZXJ0aWVzICgjR3N0TXA0TXV4Om1vdmllLXRpbWVzY2FsZSwgI0dzdE1wNE11eDp0cmFrLXRpbWVzY2FsZSkKKyAqIGFsbG93IGFkanVzdGluZyBzb21lIHRlY2huaWNhbCBwYXJhbWV0ZXJzLCB3aGljaCBtaWdodCBiZSB1c2VmdWwgaW4gKHJhcmUpCisgKiBjYXNlcyB0byByZXNvbHZlIGNvbXBhdGliaWxpdHkgaXNzdWVzIGluIHNvbWUgc2l0dWF0aW9ucy4KKyAqCisgKiBTb21lIG90aGVyIHByb3BlcnRpZXMgaW5mbHVlbmNlIHRoZSByZXN1bHQgbW9yZSBmdW5kYW1lbnRhbGx5LgorICogQSB0eXBpY2FsIG1vdi9tcDQgZmlsZSdzIG1ldGFkYXRhIChha2EgbW9vdikgaXMgbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZQorICogZmlsZSwgc29tZXdoYXQgY29udHJhcnkgdG8gdGhpcyB1c3VhbGx5IGJlaW5nIGNhbGxlZCAidGhlIGhlYWRlciIuCisgKiBIb3dldmVyLCBhICNHc3RNcDRNdXg6ZmFzdHN0YXJ0IGZpbGUgd2lsbCAod2l0aCBzb21lIGVmZm9ydCkgYXJyYW5nZSB0aGlzIHRvCisgKiBiZSBsb2NhdGVkIG5lYXIgc3RhcnQgb2YgdGhlIGZpbGUsIHdoaWNoIHRoZW4gYWxsb3dzIGl0IGUuZy4gdG8gYmUgcGxheWVkCisgKiB3aGlsZSBkb3dubG9hZGluZy4gQWx0ZXJuYXRpdmVseSwgcmF0aGVyIHRoYW4gaGF2aW5nIG9uZSBjaHVuayBvZiBtZXRhZGF0YSBhdAorICogc3RhcnQgKG9yIGVuZCksIHRoZXJlIGNhbiBiZSBzb21lIG1ldGFkYXRhIGF0IHN0YXJ0IGFuZCBtb3N0IG9mIHRoZSBvdGhlcgorICogZGF0YSBjYW4gYmUgc3ByZWFkIG91dCBpbnRvIGZyYWdtZW50cyBvZiAjR3N0TXA0TXV4OmZyYWdtZW50LWR1cmF0aW9uLgorICogSWYgc3VjaCBmcmFnbWVudGVkIGxheW91dCBpcyBpbnRlbmRlZCBmb3Igc3RyZWFtaW5nIHB1cnBvc2VzLCB0aGVuCisgKiAjR3N0TXA0TXV4OnN0cmVhbWFibGUgYWxsb3dzIGZvcmVnb2luZyB0byBhZGQgaW5kZXggbWV0YWRhdGEgKGF0IHRoZSBlbmQgb2YKKyAqIGZpbGUpLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgZ3N0LWxhdW5jaC0xLjAgdjRsMnNyYyBudW0tYnVmZmVycz01MCAhIHF1ZXVlICEgeDI2NGVuYyAhIG1wNG11eCAhIGZpbGVzaW5rIGxvY2F0aW9uPXZpZGVvLm1wNAorICogXXwKKyAqIFJlY29yZHMgYSB2aWRlbyBzdHJlYW0gY2FwdHVyZWQgZnJvbSBhIHY0bDIgZGV2aWNlLCBlbmNvZGVzIGl0IGludG8gSC4yNjQKKyAqIGFuZCBtdXhlcyBpdCBpbnRvIGFuIG1wNCBmaWxlLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAzZ3BwbXV4ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC0zZ3BwbXV4CisgKiBAc2hvcnRfZGVzY3JpcHRpb246IE11eGVyIGZvciAzR1BQICguM2dwKSBmaWxlcworICoKKyAqIFRoaXMgZWxlbWVudCBtZXJnZXMgc3RyZWFtcyAoYXVkaW8gYW5kIHZpZGVvKSBpbnRvIDNHUFAgKC4zZ3ApIGZpbGVzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgYmFja2dyb3VuZCBpbnRlbmRzIHRvIGV4cGxhaW4gd2h5IHZhcmlvdXMgc2ltaWxhciBtdXhlcnMKKyAqIGFyZSBwcmVzZW50IGluIHRoaXMgcGx1Z2luLgorICoKKyAqIFRoZSA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LmFwcGxlLmNvbS9xdWlja3RpbWUvcmVzb3VyY2VzL3F0ZmlsZWZvcm1hdC5wZGYiPgorICogUXVpY2tUaW1lIGZpbGUgZm9ybWF0IHNwZWNpZmljYXRpb248L3VsaW5rPiBzZXJ2ZWQgYXMgYmFzaXMgZm9yIHRoZSBNUDQgZmlsZQorICogZm9ybWF0IHNwZWNpZmljYXRpb24gKG1wNG11eCksIGFuZCBhcyBzdWNoIHRoZSBRdWlja1RpbWUgZmlsZSBzdHJ1Y3R1cmUgaXMKKyAqIG5lYXJseSBpZGVudGljYWwgdG8gdGhlIHNvLWNhbGxlZCBJU08gQmFzZSBNZWRpYSBmaWxlIGZvcm1hdCBkZWZpbmVkIGluCisgKiBJU08gMTQ0OTYtMTIgKGV4Y2VwdCBmb3Igc29tZSBtZWRpYSBzcGVjaWZpYyBwYXJ0cykuCisgKiBJbiB0dXJuLCB0aGUgbGF0dGVyIElTTyBCYXNlIE1lZGlhIGZvcm1hdCB3YXMgZnVydGhlciBzcGVjaWFsaXplZCBhcyBhCisgKiBNb3Rpb24gSlBFRy0yMDAwIGZpbGUgZm9ybWF0IGluIElTTyAxNTQ0NC0zIChtajJtdXgpCisgKiBhbmQgaW4gdmFyaW91cyAzR1BQKDIpIHNwZWNzICgzZ3BwbXV4KS4KKyAqIFRoZSBmcmFnbWVudGVkIGZpbGUgZmVhdHVyZXMgZGVmaW5lZCAob25seSkgaW4gSVNPIEJhc2UgTWVkaWEgYXJlIHVzZWQgYnkKKyAqIElTTVYgZmlsZXMgbWFraW5nIHVwIChhLm8uKSBTbW9vdGggU3RyZWFtaW5nIChpc21sbXV4KS4KKyAqCisgKiBBIGZldyBwcm9wZXJ0aWVzICgjR3N0M0dQUE11eDptb3ZpZS10aW1lc2NhbGUsICNHc3QzR1BQTXV4OnRyYWstdGltZXNjYWxlKQorICogYWxsb3cgYWRqdXN0aW5nIHNvbWUgdGVjaG5pY2FsIHBhcmFtZXRlcnMsIHdoaWNoIG1pZ2h0IGJlIHVzZWZ1bCBpbiAocmFyZSkKKyAqIGNhc2VzIHRvIHJlc29sdmUgY29tcGF0aWJpbGl0eSBpc3N1ZXMgaW4gc29tZSBzaXR1YXRpb25zLgorICoKKyAqIFNvbWUgb3RoZXIgcHJvcGVydGllcyBpbmZsdWVuY2UgdGhlIHJlc3VsdCBtb3JlIGZ1bmRhbWVudGFsbHkuCisgKiBBIHR5cGljYWwgbW92L21wNCBmaWxlJ3MgbWV0YWRhdGEgKGFrYSBtb292KSBpcyBsb2NhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsCisgKiBzb21ld2hhdCBjb250cmFyeSB0byB0aGlzIHVzdWFsbHkgYmVpbmcgY2FsbGVkICJ0aGUgaGVhZGVyIi4gSG93ZXZlciwgYQorICogI0dzdDNHUFBNdXg6ZmFzdHN0YXJ0IGZpbGUgd2lsbCAod2l0aCBzb21lIGVmZm9ydCkgYXJyYW5nZSB0aGlzIHRvIGJlIGxvY2F0ZWQKKyAqIG5lYXIgc3RhcnQgb2YgdGhlIGZpbGUsIHdoaWNoIHRoZW4gYWxsb3dzIGl0IGUuZy4gdG8gYmUgcGxheWVkIHdoaWxlCisgKiBkb3dubG9hZGluZy4gQWx0ZXJuYXRpdmVseSwgcmF0aGVyIHRoYW4gaGF2aW5nIG9uZSBjaHVuayBvZiBtZXRhZGF0YSBhdCBzdGFydAorICogKG9yIGVuZCksIHRoZXJlIGNhbiBiZSBzb21lIG1ldGFkYXRhIGF0IHN0YXJ0IGFuZCBtb3N0IG9mIHRoZSBvdGhlciBkYXRhIGNhbgorICogYmUgc3ByZWFkIG91dCBpbnRvIGZyYWdtZW50cyBvZiAjR3N0M0dQUE11eDpmcmFnbWVudC1kdXJhdGlvbi4gSWYgc3VjaAorICogZnJhZ21lbnRlZCBsYXlvdXQgaXMgaW50ZW5kZWQgZm9yIHN0cmVhbWluZyBwdXJwb3NlcywgdGhlbgorICogI0dzdDNHUFBNdXg6c3RyZWFtYWJsZSBhbGxvd3MgZm9yZWdvaW5nIHRvIGFkZCBpbmRleCBtZXRhZGF0YSAoYXQgdGhlIGVuZCBvZgorICogZmlsZSkuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB2NGwyc3JjIG51bS1idWZmZXJzPTUwICEgcXVldWUgISBmZmVuY19oMjYzICEgM2dwcG11eCAhIGZpbGVzaW5rIGxvY2F0aW9uPXZpZGVvLjNncAorICogXXwKKyAqIFJlY29yZHMgYSB2aWRlbyBzdHJlYW0gY2FwdHVyZWQgZnJvbSBhIHY0bDIgZGV2aWNlLCBlbmNvZGVzIGl0IGludG8gSC4yNjMKKyAqIGFuZCBtdXhlcyBpdCBpbnRvIGFuIDNncCBmaWxlLgorICogPC9yZWZzZWN0Mj4KKyAqCisgKiBEb2N1bWVudGF0aW9uIGxhc3QgcmV2aWV3ZWQgb24gMjAxMS0wNC0yMQorICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IG1qMnBtdXggPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LW1qMm11eAorICogQHNob3J0X2Rlc2NyaXB0aW9uOiBNdXhlciBmb3IgTW90aW9uIEpQRUctMjAwMCAoLm1qMikgZmlsZXMKKyAqCisgKiBUaGlzIGVsZW1lbnQgbWVyZ2VzIHN0cmVhbXMgKGF1ZGlvIGFuZCB2aWRlbykgaW50byBNSjIgKC5tajIpIGZpbGVzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgYmFja2dyb3VuZCBpbnRlbmRzIHRvIGV4cGxhaW4gd2h5IHZhcmlvdXMgc2ltaWxhciBtdXhlcnMKKyAqIGFyZSBwcmVzZW50IGluIHRoaXMgcGx1Z2luLgorICoKKyAqIFRoZSA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LmFwcGxlLmNvbS9xdWlja3RpbWUvcmVzb3VyY2VzL3F0ZmlsZWZvcm1hdC5wZGYiPgorICogUXVpY2tUaW1lIGZpbGUgZm9ybWF0IHNwZWNpZmljYXRpb248L3VsaW5rPiBzZXJ2ZWQgYXMgYmFzaXMgZm9yIHRoZSBNUDQgZmlsZQorICogZm9ybWF0IHNwZWNpZmljYXRpb24gKG1wNG11eCksIGFuZCBhcyBzdWNoIHRoZSBRdWlja1RpbWUgZmlsZSBzdHJ1Y3R1cmUgaXMKKyAqIG5lYXJseSBpZGVudGljYWwgdG8gdGhlIHNvLWNhbGxlZCBJU08gQmFzZSBNZWRpYSBmaWxlIGZvcm1hdCBkZWZpbmVkIGluCisgKiBJU08gMTQ0OTYtMTIgKGV4Y2VwdCBmb3Igc29tZSBtZWRpYSBzcGVjaWZpYyBwYXJ0cykuCisgKiBJbiB0dXJuLCB0aGUgbGF0dGVyIElTTyBCYXNlIE1lZGlhIGZvcm1hdCB3YXMgZnVydGhlciBzcGVjaWFsaXplZCBhcyBhCisgKiBNb3Rpb24gSlBFRy0yMDAwIGZpbGUgZm9ybWF0IGluIElTTyAxNTQ0NC0zIChtajJtdXgpCisgKiBhbmQgaW4gdmFyaW91cyAzR1BQKDIpIHNwZWNzICgzZ3BwbXV4KS4KKyAqIFRoZSBmcmFnbWVudGVkIGZpbGUgZmVhdHVyZXMgZGVmaW5lZCAob25seSkgaW4gSVNPIEJhc2UgTWVkaWEgYXJlIHVzZWQgYnkKKyAqIElTTVYgZmlsZXMgbWFraW5nIHVwIChhLm8uKSBTbW9vdGggU3RyZWFtaW5nIChpc21sbXV4KS4KKyAqCisgKiBBIGZldyBwcm9wZXJ0aWVzICgjR3N0TUoyTXV4Om1vdmllLXRpbWVzY2FsZSwgI0dzdE1KMk11eDp0cmFrLXRpbWVzY2FsZSkKKyAqIGFsbG93IGFkanVzdGluZyBzb21lIHRlY2huaWNhbCBwYXJhbWV0ZXJzLCB3aGljaCBtaWdodCBiZSB1c2VmdWwgaW4gKHJhcmUpCisgKiBjYXNlcyB0byByZXNvbHZlIGNvbXBhdGliaWxpdHkgaXNzdWVzIGluIHNvbWUgc2l0dWF0aW9ucy4KKyAqCisgKiBTb21lIG90aGVyIHByb3BlcnRpZXMgaW5mbHVlbmNlIHRoZSByZXN1bHQgbW9yZSBmdW5kYW1lbnRhbGx5LgorICogQSB0eXBpY2FsIG1vdi9tcDQgZmlsZSdzIG1ldGFkYXRhIChha2EgbW9vdikgaXMgbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLAorICogc29tZXdoYXQgY29udHJhcnkgdG8gdGhpcyB1c3VhbGx5IGJlaW5nIGNhbGxlZCAidGhlIGhlYWRlciIuIEhvd2V2ZXIsIGEKKyAqICNHc3RNSjJNdXg6ZmFzdHN0YXJ0IGZpbGUgd2lsbCAod2l0aCBzb21lIGVmZm9ydCkgYXJyYW5nZSB0aGlzIHRvIGJlIGxvY2F0ZWQKKyAqIG5lYXIgc3RhcnQgb2YgdGhlIGZpbGUsIHdoaWNoIHRoZW4gYWxsb3dzIGl0IGUuZy4gdG8gYmUgcGxheWVkIHdoaWxlCisgKiBkb3dubG9hZGluZy4gQWx0ZXJuYXRpdmVseSwgcmF0aGVyIHRoYW4gaGF2aW5nIG9uZSBjaHVuayBvZiBtZXRhZGF0YSBhdCBzdGFydAorICogKG9yIGVuZCksIHRoZXJlIGNhbiBiZSBzb21lIG1ldGFkYXRhIGF0IHN0YXJ0IGFuZCBtb3N0IG9mIHRoZSBvdGhlciBkYXRhIGNhbgorICogYmUgc3ByZWFkIG91dCBpbnRvIGZyYWdtZW50cyBvZiAjR3N0TUoyTXV4OmZyYWdtZW50LWR1cmF0aW9uLiBJZiBzdWNoCisgKiBmcmFnbWVudGVkIGxheW91dCBpcyBpbnRlbmRlZCBmb3Igc3RyZWFtaW5nIHB1cnBvc2VzLCB0aGVuCisgKiAjR3N0TUoyTXV4OnN0cmVhbWFibGUgYWxsb3dzIGZvcmVnb2luZyB0byBhZGQgaW5kZXggbWV0YWRhdGEgKGF0IHRoZSBlbmQgb2YKKyAqIGZpbGUpLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdjRsMnNyYyBudW0tYnVmZmVycz01MCAhIHF1ZXVlICEganAya2VuYyAhIG1qMm11eCAhIGZpbGVzaW5rIGxvY2F0aW9uPXZpZGVvLm1qMgorICogXXwKKyAqIFJlY29yZHMgYSB2aWRlbyBzdHJlYW0gY2FwdHVyZWQgZnJvbSBhIHY0bDIgZGV2aWNlLCBlbmNvZGVzIGl0IGludG8gSlBFRy0yMDAwCisgKiBhbmQgbXV4ZXMgaXQgaW50byBhbiBtajIgZmlsZS4KKyAqIDwvcmVmc2VjdDI+CisgKgorICogRG9jdW1lbnRhdGlvbiBsYXN0IHJldmlld2VkIG9uIDIwMTEtMDQtMjEKKyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBpc21sbXV4ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1pc21sbXV4CisgKiBAc2hvcnRfZGVzY3JpcHRpb246IE11eGVyIGZvciBJU01MIHNtb290aCBzdHJlYW1pbmcgKC5pc21sKSBmaWxlcworICoKKyAqIFRoaXMgZWxlbWVudCBtZXJnZXMgc3RyZWFtcyAoYXVkaW8gYW5kIHZpZGVvKSBpbnRvIE1KMiAoLm1qMikgZmlsZXMuCisgKgorICogVGhlIGZvbGxvd2luZyBiYWNrZ3JvdW5kIGludGVuZHMgdG8gZXhwbGFpbiB3aHkgdmFyaW91cyBzaW1pbGFyIG11eGVycworICogYXJlIHByZXNlbnQgaW4gdGhpcyBwbHVnaW4uCisgKgorICogVGhlIDx1bGluayB1cmw9Imh0dHA6Ly93d3cuYXBwbGUuY29tL3F1aWNrdGltZS9yZXNvdXJjZXMvcXRmaWxlZm9ybWF0LnBkZiI+CisgKiBRdWlja1RpbWUgZmlsZSBmb3JtYXQgc3BlY2lmaWNhdGlvbjwvdWxpbms+IHNlcnZlZCBhcyBiYXNpcyBmb3IgdGhlIE1QNCBmaWxlCisgKiBmb3JtYXQgc3BlY2lmaWNhdGlvbiAobXA0bXV4KSwgYW5kIGFzIHN1Y2ggdGhlIFF1aWNrVGltZSBmaWxlIHN0cnVjdHVyZSBpcworICogbmVhcmx5IGlkZW50aWNhbCB0byB0aGUgc28tY2FsbGVkIElTTyBCYXNlIE1lZGlhIGZpbGUgZm9ybWF0IGRlZmluZWQgaW4KKyAqIElTTyAxNDQ5Ni0xMiAoZXhjZXB0IGZvciBzb21lIG1lZGlhIHNwZWNpZmljIHBhcnRzKS4KKyAqIEluIHR1cm4sIHRoZSBsYXR0ZXIgSVNPIEJhc2UgTWVkaWEgZm9ybWF0IHdhcyBmdXJ0aGVyIHNwZWNpYWxpemVkIGFzIGEKKyAqIE1vdGlvbiBKUEVHLTIwMDAgZmlsZSBmb3JtYXQgaW4gSVNPIDE1NDQ0LTMgKG1qMm11eCkKKyAqIGFuZCBpbiB2YXJpb3VzIDNHUFAoMikgc3BlY3MgKDNncHBtdXgpLgorICogVGhlIGZyYWdtZW50ZWQgZmlsZSBmZWF0dXJlcyBkZWZpbmVkIChvbmx5KSBpbiBJU08gQmFzZSBNZWRpYSBhcmUgdXNlZCBieQorICogSVNNViBmaWxlcyBtYWtpbmcgdXAgKGEuby4pIFNtb290aCBTdHJlYW1pbmcgKGlzbWxtdXgpLgorICoKKyAqIEEgZmV3IHByb3BlcnRpZXMgKCNHc3RJU01MTXV4Om1vdmllLXRpbWVzY2FsZSwgI0dzdElTTUxNdXg6dHJhay10aW1lc2NhbGUpCisgKiBhbGxvdyBhZGp1c3Rpbmcgc29tZSB0ZWNobmljYWwgcGFyYW1ldGVycywgd2hpY2ggbWlnaHQgYmUgdXNlZnVsIGluIChyYXJlKQorICogY2FzZXMgdG8gcmVzb2x2ZSBjb21wYXRpYmlsaXR5IGlzc3VlcyBpbiBzb21lIHNpdHVhdGlvbnMuCisgKgorICogU29tZSBvdGhlciBwcm9wZXJ0aWVzIGluZmx1ZW5jZSB0aGUgcmVzdWx0IG1vcmUgZnVuZGFtZW50YWxseS4KKyAqIEEgdHlwaWNhbCBtb3YvbXA0IGZpbGUncyBtZXRhZGF0YSAoYWthIG1vb3YpIGlzIGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwKKyAqIHNvbWV3aGF0IGNvbnRyYXJ5IHRvIHRoaXMgdXN1YWxseSBiZWluZyBjYWxsZWQgInRoZSBoZWFkZXIiLiBIb3dldmVyLCBhCisgKiAjR3N0SVNNTE11eDpmYXN0c3RhcnQgZmlsZSB3aWxsICh3aXRoIHNvbWUgZWZmb3J0KSBhcnJhbmdlIHRoaXMgdG8gYmUgbG9jYXRlZAorICogbmVhciBzdGFydCBvZiB0aGUgZmlsZSwgd2hpY2ggdGhlbiBhbGxvd3MgaXQgZS5nLiB0byBiZSBwbGF5ZWQgd2hpbGUKKyAqIGRvd25sb2FkaW5nLiBBbHRlcm5hdGl2ZWx5LCByYXRoZXIgdGhhbiBoYXZpbmcgb25lIGNodW5rIG9mIG1ldGFkYXRhIGF0IHN0YXJ0CisgKiAob3IgZW5kKSwgdGhlcmUgY2FuIGJlIHNvbWUgbWV0YWRhdGEgYXQgc3RhcnQgYW5kIG1vc3Qgb2YgdGhlIG90aGVyIGRhdGEgY2FuCisgKiBiZSBzcHJlYWQgb3V0IGludG8gZnJhZ21lbnRzIG9mICNHc3RJU01MTXV4OmZyYWdtZW50LWR1cmF0aW9uLiBJZiBzdWNoCisgKiBmcmFnbWVudGVkIGxheW91dCBpcyBpbnRlbmRlZCBmb3Igc3RyZWFtaW5nIHB1cnBvc2VzLCB0aGVuCisgKiAjR3N0SVNNTE11eDpzdHJlYW1hYmxlIGFsbG93cyBmb3JlZ29pbmcgdG8gYWRkIGluZGV4IG1ldGFkYXRhIChhdCB0aGUgZW5kIG9mCisgKiBmaWxlKS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHY0bDJzcmMgbnVtLWJ1ZmZlcnM9NTAgISBxdWV1ZSAhIGpwMmtlbmMgISBtajJtdXggISBmaWxlc2luayBsb2NhdGlvbj12aWRlby5tajIKKyAqIF18CisgKiBSZWNvcmRzIGEgdmlkZW8gc3RyZWFtIGNhcHR1cmVkIGZyb20gYSB2NGwyIGRldmljZSwgZW5jb2RlcyBpdCBpbnRvIEpQRUctMjAwMAorICogYW5kIG11eGVzIGl0IGludG8gYW4gbWoyIGZpbGUuCisgKiA8L3JlZnNlY3QyPgorICoKKyAqIERvY3VtZW50YXRpb24gbGFzdCByZXZpZXdlZCBvbiAyMDExLTA0LTIxCisgKi8KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvZ3N0cXRtdXgtZG9jLmggYi9nc3QvaXNvbXA0L2dzdHF0bXV4LWRvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMTIxNjQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L2dzdHF0bXV4LWRvYy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIFF1aWNrdGltZSBtdXhlciBkb2N1bWVudGF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5icj4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zZi5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb250YWN0OiBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKgorICogVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIFNvdXJjZSBDb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlLgorICogU2VlIGZ1cnRoZXIgZXhwbGFuYXRpb24gYXR0YWNoZWQgaW4gTGljZW5zZSBTdGF0ZW1lbnQgKGRpc3RyaWJ1dGVkIGluIHRoZSBmaWxlCisgKiBMSUNFTlNFKS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2Vycm9yICJUaGlzIGhlYWRlciBpcyBmb3IgZ3RrLWRvYyBvbmx5IGFuZCBub3Qgc3VwcG9zZWQgdG8gYmUgaW5jbHVkZWQiCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RNUDRNdXggR3N0TVA0TXV4OwordHlwZWRlZiBzdHJ1Y3QgX0dzdDNHUFBNdXggR3N0M0dQUE11eDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RJU01MTXV4IEdzdElTTUxNdXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0TUoyTXV4IEdzdE1KMk11eDsKKwpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9nc3RxdG11eC5jIGIvZ3N0L2lzb21wNC9nc3RxdG11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZTE3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L2dzdHF0bXV4LmMKQEAgLTAsMCArMSw2MzIyIEBACisvKiBRdWlja3RpbWUgbXV4ZXIgcGx1Z2luIGZvciBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQGVtYmVkZGVkLnVmY2cuZWR1LmJyPgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNmLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNCBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKyAqIENvbnRhY3Q6IFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+CisKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKgorICogVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIFNvdXJjZSBDb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlLgorICogU2VlIGZ1cnRoZXIgZXhwbGFuYXRpb24gYXR0YWNoZWQgaW4gTGljZW5zZSBTdGF0ZW1lbnQgKGRpc3RyaWJ1dGVkIGluIHRoZSBmaWxlCisgKiBMSUNFTlNFKS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1xdG11eAorICogQHNob3J0X2Rlc2NyaXB0aW9uOiBNdXhlciBmb3IgcXVpY2t0aW1lKC5tb3YpIGZpbGVzCisgKgorICogVGhpcyBlbGVtZW50IG1lcmdlcyBzdHJlYW1zIChhdWRpbyBhbmQgdmlkZW8pIGludG8gUXVpY2tUaW1lKC5tb3YpIGZpbGVzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgYmFja2dyb3VuZCBpbnRlbmRzIHRvIGV4cGxhaW4gd2h5IHZhcmlvdXMgc2ltaWxhciBtdXhlcnMKKyAqIGFyZSBwcmVzZW50IGluIHRoaXMgcGx1Z2luLgorICoKKyAqIFRoZSA8dWxpbmsgdXJsPSJodHRwOi8vd3d3LmFwcGxlLmNvbS9xdWlja3RpbWUvcmVzb3VyY2VzL3F0ZmlsZWZvcm1hdC5wZGYiPgorICogUXVpY2tUaW1lIGZpbGUgZm9ybWF0IHNwZWNpZmljYXRpb248L3VsaW5rPiBzZXJ2ZWQgYXMgYmFzaXMgZm9yIHRoZSBNUDQgZmlsZQorICogZm9ybWF0IHNwZWNpZmljYXRpb24gKG1wNG11eCksIGFuZCBhcyBzdWNoIHRoZSBRdWlja1RpbWUgZmlsZSBzdHJ1Y3R1cmUgaXMKKyAqIG5lYXJseSBpZGVudGljYWwgdG8gdGhlIHNvLWNhbGxlZCBJU08gQmFzZSBNZWRpYSBmaWxlIGZvcm1hdCBkZWZpbmVkIGluCisgKiBJU08gMTQ0OTYtMTIgKGV4Y2VwdCBmb3Igc29tZSBtZWRpYSBzcGVjaWZpYyBwYXJ0cykuCisgKiBJbiB0dXJuLCB0aGUgbGF0dGVyIElTTyBCYXNlIE1lZGlhIGZvcm1hdCB3YXMgZnVydGhlciBzcGVjaWFsaXplZCBhcyBhCisgKiBNb3Rpb24gSlBFRy0yMDAwIGZpbGUgZm9ybWF0IGluIElTTyAxNTQ0NC0zIChtajJtdXgpCisgKiBhbmQgaW4gdmFyaW91cyAzR1BQKDIpIHNwZWNzIChncHBtdXgpLgorICogVGhlIGZyYWdtZW50ZWQgZmlsZSBmZWF0dXJlcyBkZWZpbmVkIChvbmx5KSBpbiBJU08gQmFzZSBNZWRpYSBhcmUgdXNlZCBieQorICogSVNNViBmaWxlcyBtYWtpbmcgdXAgKGEuby4pIFNtb290aCBTdHJlYW1pbmcgKGlzbWxtdXgpLgorICoKKyAqIEEgZmV3IHByb3BlcnRpZXMgKCNHc3RRVE11eDptb3ZpZS10aW1lc2NhbGUsICNHc3RRVE11eDp0cmFrLXRpbWVzY2FsZSwKKyAqICNHc3RRVE11eFBhZDp0cmFrLXRpbWVzY2FsZSkgYWxsb3cgYWRqdXN0aW5nIHNvbWUgdGVjaG5pY2FsIHBhcmFtZXRlcnMsCisgKiB3aGljaCBtaWdodCBiZSB1c2VmdWwgaW4gKHJhcmUpIGNhc2VzIHRvIHJlc29sdmUgY29tcGF0aWJpbGl0eSBpc3N1ZXMgaW4KKyAqIHNvbWUgc2l0dWF0aW9ucy4KKyAqCisgKiBTb21lIG90aGVyIHByb3BlcnRpZXMgaW5mbHVlbmNlIHRoZSByZXN1bHQgbW9yZSBmdW5kYW1lbnRhbGx5LgorICogQSB0eXBpY2FsIG1vdi9tcDQgZmlsZSdzIG1ldGFkYXRhIChha2EgbW9vdikgaXMgbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZQorICogZmlsZSwgc29tZXdoYXQgY29udHJhcnkgdG8gdGhpcyB1c3VhbGx5IGJlaW5nIGNhbGxlZCAidGhlIGhlYWRlciIuCisgKiBIb3dldmVyLCBhICNHc3RRVE11eDpmYXN0c3RhcnQgZmlsZSB3aWxsICh3aXRoIHNvbWUgZWZmb3J0KSBhcnJhbmdlIHRoaXMgdG8KKyAqIGJlIGxvY2F0ZWQgbmVhciBzdGFydCBvZiB0aGUgZmlsZSwgd2hpY2ggdGhlbiBhbGxvd3MgaXQgZS5nLiB0byBiZSBwbGF5ZWQKKyAqIHdoaWxlIGRvd25sb2FkaW5nLiBBbHRlcm5hdGl2ZWx5LCByYXRoZXIgdGhhbiBoYXZpbmcgb25lIGNodW5rIG9mIG1ldGFkYXRhIGF0CisgKiBzdGFydCAob3IgZW5kKSwgdGhlcmUgY2FuIGJlIHNvbWUgbWV0YWRhdGEgYXQgc3RhcnQgYW5kIG1vc3Qgb2YgdGhlIG90aGVyCisgKiBkYXRhIGNhbiBiZSBzcHJlYWQgb3V0IGludG8gZnJhZ21lbnRzIG9mICNHc3RRVE11eDpmcmFnbWVudC1kdXJhdGlvbi4KKyAqIElmIHN1Y2ggZnJhZ21lbnRlZCBsYXlvdXQgaXMgaW50ZW5kZWQgZm9yIHN0cmVhbWluZyBwdXJwb3NlcywgdGhlbgorICogI0dzdFFUTXV4OnN0cmVhbWFibGUgYWxsb3dzIGZvcmVnb2luZyB0byBhZGQgaW5kZXggbWV0YWRhdGEgKGF0IHRoZSBlbmQgb2YKKyAqIGZpbGUpLgorICoKKyAqIFdoZW4gdGhlIG1heGltdW0gZHVyYXRpb24gdG8gYmUgcmVjb3JkZWQgY2FuIGJlIGtub3duIGluIGFkdmFuY2UsICNHc3RRVE11eAorICogYWxzbyBzdXBwb3J0cyBhICdSb2J1c3QgTXV4aW5nJyBtb2RlLiBJbiByb2J1c3QgbXV4aW5nIG1vZGUsICBzcGFjZSBmb3IgdGhlCisgKiBoZWFkZXJzIGFyZSByZXNlcnZlZCBhdCB0aGUgc3RhcnQgb2YgbXV4aW5nLCBhbmQgcmV3cml0dGVuIGF0IGEgY29uZmlndXJhYmxlCisgKiBpbnRlcnZhbCwgc28gdGhhdCB0aGUgb3V0cHV0IGZpbGUgaXMgYWx3YXlzIHBsYXlhYmxlLCBldmVuIGlmIHRoZSByZWNvcmRpbmcKKyAqIGlzIGludGVycnVwdGVkIHVuY2xlYW5seSBieSBhIGNyYXNoLiBSb2J1c3QgbXV4aW5nIG1vZGUgcmVxdWlyZXMgYSBzZWVrYWJsZQorICogb3V0cHV0LCBzdWNoIGFzIGZpbGVzaW5rLCBiZWNhdXNlIGl0IG5lZWRzIHRvIHJld3JpdGUgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgorICoKKyAqIFRvIGVuYWJsZSByb2J1c3QgbXV4aW5nIG1vZGUsIHNldCB0aGUgI0dzdFFUTXV4OjpyZXNlcnZlZC1tb292LXVwZGF0ZS1wZXJpb2QKKyAqIGFuZCAjR3N0UVRNdXg6OnJlc2VydmVkLW1heC1kdXJhdGlvbiBwcm9wZXJ0eS4gQWxzbyBwcmVzZW50IGlzIHRoZQorICogI0dzdFFUTXV4OjpyZXNlcnZlZC1ieXRlcy1wZXItc2VjIHByb3BlcnR5LCB3aGljaCBjYW4gYmUgaW5jcmVhc2VkIGlmCisgKiBmb3Igc29tZSByZWFzb24gdGhlIGRlZmF1bHQgaXMgbm90IGxhcmdlIGVub3VnaCBhbmQgdGhlIGluaXRpYWwgcmVzZXJ2ZWQKKyAqIHNwYWNlIGZvciBoZWFkZXJzIGlzIHRvbyBzbWFsbC4gQXBwbGljYXRpb25zIGNhbiBtb25pdG9yIHRoZQorICogI0dzdFFUTXV4OjpyZXNlcnZlZC1kdXJhdGlvbi1yZW1haW5pbmcgcHJvcGVydHkgdG8gc2VlIGhvdyBjbG9zZSB0byBmdWxsCisgKiB0aGUgcmVzZXJ2ZWQgc3BhY2UgaXMgYmVjb21pbmcuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB2NGwyc3JjIG51bS1idWZmZXJzPTUwMCAhIHZpZGVvL3gtcmF3LHdpZHRoPTMyMCxoZWlnaHQ9MjQwICEgdmlkZW9jb252ZXJ0ICEgcXRtdXggISBmaWxlc2luayBsb2NhdGlvbj12aWRlby5tb3YKKyAqIF18CisgKiBSZWNvcmRzIGEgdmlkZW8gc3RyZWFtIGNhcHR1cmVkIGZyb20gYSB2NGwyIGRldmljZSBhbmQgbXV4ZXMgaXQgaW50byBhIHF0IGZpbGUuCisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qCisgKiBCYXNlZCBvbiBhdmltdXgKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnbGliL2dzdGRpby5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGNvbGxlY3RwYWRzLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXJlYWRlci5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJpdHJlYWRlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvcGJ1dGlscy5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgR19PU19XSU4zMgorI2luY2x1ZGUgPGlvLmg+ICAgICAgICAgICAgICAgICAvKiBsc2Vlaywgb3BlbiwgY2xvc2UsIHJlYWQgKi8KKyN1bmRlZiBsc2VlaworI2RlZmluZSBsc2VlayBfbHNlZWtpNjQKKyN1bmRlZiBvZmZfdAorI2RlZmluZSBvZmZfdCBndWludDY0CisjZW5kaWYKKworI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIGZ0cnVuY2F0ZSBnX3dpbjMyX2Z0cnVuY2F0ZQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0cXRtdXguaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3F0X211eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfcXRfbXV4X2RlYnVnCisKKyNpZm5kZWYgQUJTRElGRgorI2RlZmluZSBBQlNESUZGKGEsIGIpICgoYSkgPiAoYikgPyAoYSkgLSAoYikgOiAoYikgLSAoYSkpCisjZW5kaWYKKworLyogSGFja2VyIG5vdGVzLgorICoKKyAqIFRoZSBiYXNpYyBidWlsZGluZyBibG9ja3Mgb2YgTVA0IGZpbGVzIGFyZToKKyAqICAtIGFuICdmdHlwJyBib3ggYXQgdGhlIHZlcnkgc3RhcnQKKyAqICAtIGFuICdtZGF0JyBib3ggd2hpY2ggY29udGFpbnMgdGhlIHJhdyBhdWRpby92aWRlby9zdWJ0aXRsZSBkYXRhOworICogICAgdGhpcyBpcyBqdXN0IGEgYnVuY2ggb2YgYnl0ZXMsIGNvbXBsZXRlbHkgdW5mcmFtZWQgYW5kIHBvc3NpYmx5CisgKiAgICB1bm9yZGVyZWQgd2l0aCBubyBhZGRpdGlvbmFsIG1ldGEtaW5mb3JtYXRpb24KKyAqICAtIGEgJ21vb3YnIGJveCB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkaWZmZXJlbnQgc3RyZWFtcworICogICAgYW5kIHdoYXQgdGhleSBjb250YWluLCBhcyB3ZWxsIGFzIHNhbXBsZSB0YWJsZXMgZm9yIGVhY2ggc3RyZWFtCisgKiAgICB0aGF0IHRlbGwgdGhlIGRlbXV4ZXIgd2hlcmUgaW4gdGhlIG1kYXQgYm94IGVhY2ggYnVmZmVyL3NhbXBsZSBpcworICogICAgYW5kIHdoYXQgaXRzIGR1cmF0aW9uL3RpbWVzdGFtcCBldGMuIGlzLCBhbmQgd2hldGhlciBpdCdzIGEKKyAqICAgIGtleWZyYW1lIGV0Yy4KKyAqIEFkZGl0aW9uYWxseSwgZnJhZ21lbnRlZCBNUDQgd29ya3MgYnkgd3JpdGluZyBjaHVua3Mgb2YgZGF0YSBpbgorICogcGFpcnMgb2YgJ21vb2YnIGFuZCAnbWRhdCcgYm94ZXM6CisgKiAgLSAnbW9vZicgYm94ZXMsIGhlYWRlciBwcmVjZWRpbmcgZWFjaCBtZGF0IGZyYWdtZW50IGRlc2NyaWJpbmcgdGhlCisgKiAgICBjb250ZW50cywgbGlrZSBhIG1vb3YgYnV0IG9ubHkgZm9yIHRoYXQgZnJhZ21lbnQuCisgKiAgLSBhICdtZnJhJyBib3ggZm9yIEZyYWdtZW50ZWQgTVA0LCB3aGljaCBpcyB3cml0dGVuIGF0IHRoZSBlbmQgYW5kCisgKiAgICBjb250YWlucyBhIHN1bW1hcnkgb2YgYWxsIGZyYWdtZW50cyBhbmQgc2VlayB0YWJsZXMuCisgKgorICogQ3VycmVudGx5IG1wNG11eCBjYW4gd29yayBpbiA0IGRpZmZlcmVudCBtb2RlcyAvIGdlbmVyYXRlIDQgdHlwZXMKKyAqIG9mIG91dHB1dCBmaWxlcy9zdHJlYW1zOgorICoKKyAqIC0gTm9ybWFsIG1wNDogbXA0bXV4IHdpbGwgd3JpdGUgYSBsaXR0bGUgZnR5cCBpZGVudGlmaWVyIGF0IHRoZQorICogICBiZWdpbm5pbmcsIHRoZW4gc3RhcnQgYW4gbWRhdCBib3ggaW50byB3aGljaCBpdCB3aWxsIHdyaXRlIGFsbCB0aGUKKyAqICAgc2FtcGxlIGRhdGEuIEF0IEVPUyBpdCB3aWxsIHRoZW4gd3JpdGUgdGhlIG1vb3YgaGVhZGVyIHdpdGggdHJhY2sKKyAqICAgaGVhZGVycyBhbmQgc2FtcGxlIHRhYmxlcyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgcmV3cml0ZSB0aGUKKyAqICAgc3RhcnQgb2YgdGhlIGZpbGUgdG8gZml4IHVwIHRoZSBtZGF0IGJveCBzaXplIGF0IHRoZSBiZWdpbm5pbmcuCisgKiAgIEl0IGhhcyB0byB3YWl0IGZvciBFT1MgdG8gd3JpdGUgdGhlIG1vb3YgKHdoaWNoIGluY2x1ZGVzIHRoZQorICogICBzYW1wbGUgdGFibGVzKSBiZWNhdXNlIGl0IGRvZXNuJ3Qga25vdyBob3cgbXVjaCBzcGFjZSB0aG9zZQorICogICB0YWJsZXMgd2lsbCBiZS4gVGhlIG91dHB1dCBkb3duc3RyZWFtIG11c3QgYmUgc2Vla2FibGUgdG8gcmV3cml0ZQorICogICB0aGUgbWRhdCBib3ggYXQgRU9TLgorICoKKyAqIC0gRnJhZ21lbnRlZCBtcDQ6IG1vb3YgaGVhZGVyIHdpdGggdHJhY2sgaGVhZGVycyBhdCBzdGFydAorICogICBidXQgbm8gc2FtcGxlIHRhYmxlLCBmb2xsb3dlZCBieSBOIGZyYWdtZW50cywgZWFjaCBjb250YWluaW5nCisgKiAgIHRyYWNrIGhlYWRlcnMgd2l0aCBzYW1wbGUgdGFibGVzIGZvbGxvd2VkIGJ5IHNvbWUgZGF0YS4gRG93bnN0cmVhbQorICogICBkb2VzIG5vdCBuZWVkIHRvIGJlIHNlZWthYmxlIGlmIHRoZSAnc3RyZWFtYWJsZScgZmxhZyBpcyBUUlVFLAorICogICBhcyB0aGUgZmluYWwgbWZyYSBhbmQgdG90YWwgZHVyYXRpb24gd2lsbCBiZSBvbWl0dGVkLgorICoKKyAqIC0gRmFzdC1zdGFydCBtcDQ6IHRoZSBnb2FsIGhlcmUgaXMgdG8gY3JlYXRlIGEgZmlsZSB3aGVyZSB0aGUgbW9vdgorICogICBoZWFkZXJzIGFyZSBhdCB0aGUgYmVnaW5uaW5nOyB3aGF0IG1wNG11eCB3aWxsIGRvIGlzIHdyaXRlIGFsbAorICogICBzYW1wbGUgZGF0YSBpbnRvIGEgdGVtcCBmaWxlIGFuZCBidWlsZCBtb292IGhlYWRlciBwbHVzIHNhbXBsZQorICogICB0YWJsZXMgaW4gbWVtb3J5IGFuZCB0aGVuIHdoZW4gRU9TIGNvbWVzLCBpdCB3aWxsIHB1c2ggb3V0IHRoZQorICogICBtb292IGhlYWRlciBwbHVzIHNhbXBsZSB0YWJsZXMgYXQgdGhlIGJlZ2lubmluZywgZm9sbG93ZWQgYnkgdGhlCisgKiAgIG1kYXQgc2FtcGxlIGRhdGEgYXQgdGhlIGVuZCB3aGljaCBpcyByZWFkIGluIGZyb20gdGhlIHRlbXAgZmlsZQorICogICBGaWxlcyBjcmVhdGVkIGluIHRoaXMgbW9kZSBhcmUgYmV0dGVyIGZvciBzdHJlYW1pbmcgb3ZlciB0aGUKKyAqICAgbmV0d29yaywgc2luY2UgdGhlIGNsaWVudCBkb2Vzbid0IGhhdmUgdG8gc2VlayB0byB0aGUgZW5kIG9mIHRoZQorICogICBmaWxlIHRvIGdldCB0aGUgaGVhZGVycywgYnV0IGl0IHJlcXVpcmVzIGNvcHlpbmcgYWxsIHNhbXBsZSBkYXRhCisgKiAgIG91dCBvZiB0aGUgdGVtcCBmaWxlIGF0IEVPUywgd2hpY2ggY2FuIGJlIGV4cGVuc2l2ZS4gRG93bnN0cmVhbSBkb2VzCisgKiAgIG5vdCBuZWVkIHRvIGJlIHNlZWthYmxlLCBiZWNhdXNlIG9mIHRoZSB1c2Ugb2YgdGhlIHRlbXAgZmlsZS4KKyAqCisgKiAtIFJvYnVzdCBNdXhpbmcgbW9kZTogSW4gdGhpcyBtb2RlLCBxdG11eCB1c2VzIHRoZSByZXNlcnZlZC1tYXgtZHVyYXRpb24KKyAqICAgYW5kIHJlc2VydmVkLW1vb3YtdXBkYXRlLXBlcmlvZCBwcm9wZXJ0aWVzIHRvIHJlc2VydmUgZnJlZSBzcGFjZQorICogICBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGUgYW5kIHBlcmlvZGljYWxseSB3cml0ZSB0aGUgTU9PViBhdG9tIG91dAorICogICB0byBpdC4gVGhhdCBtZWFucyB0aGF0IGtpbGxpbmcgdGhlIG11eGluZyBhdCBhbnkgcG9pbnQgc3RpbGwKKyAqICAgcmVzdWx0cyBpbiBhIHBsYXlhYmxlIGZpbGUsIGF0IHRoZSBjb3N0IG9mIHdhc3Rpbmcgc29tZSBhbW91bnQgb2YKKyAqICAgZnJlZSBzcGFjZSBhdCB0aGUgc3RhcnQgb2YgZmlsZS4gVGhlIGFwcHJveGltYXRlIHJlY29yZGluZyBkdXJhdGlvbgorICogICBoYXMgdG8gYmUga25vd24gaW4gYWR2YW5jZSB0byBlc3RpbWF0ZSBob3cgbXVjaCBmcmVlIHNwYWNlIHRvIHJlc2VydmUKKyAqICAgZm9yIHRoZSBtb292LCBhbmQgdGhlIGRvd25zdHJlYW0gbXVzdCBiZSBzZWVrYWJsZS4KKyAqICAgSWYgdGhlIG1vb3YgaGVhZGVyIGdyb3dzIGxhcmdlciB0aGFuIHRoZSByZXNlcnZlZCBzcGFjZSwgYW4gZXJyb3IKKyAqICAgaXMgZ2VuZXJhdGVkIC0gc28gaXQncyBiZXR0ZXIgdG8gb3Zlci1lc3RpbWF0ZSB0aGUgYW1vdW50IG9mIHNwYWNlCisgKiAgIHRvIHJlc2VydmUuIFRvIGVuc3VyZSB0aGUgZmlsZSBpcyBwbGF5YWJsZSBhdCBhbnkgcG9pbnQsIHRoZSBtb292CisgKiAgIGlzIHVwZGF0ZWQgdXNpbmcgYSAncGluZy1wb25nJyBzdHJhdGVneSwgc28gdGhlIG91dHB1dCBpcyBuZXZlciBpbgorICogICBhbiBpbnZhbGlkIHN0YXRlLgorICovCisKKyNpZm5kZWYgR1NUX1JFTU9WRV9ERVBSRUNBVEVECitlbnVtCit7CisgIERUU19NRVRIT0RfREQsCisgIERUU19NRVRIT0RfUkVPUkRFUiwKKyAgRFRTX01FVEhPRF9BU0MKK307CisKK3N0YXRpYyBHVHlwZQorZ3N0X3F0X211eF9kdHNfbWV0aG9kX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZ3N0X3F0X211eF9kdHNfbWV0aG9kID0gMDsKKworICBpZiAoIWdzdF9xdF9tdXhfZHRzX21ldGhvZCkgeworICAgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGR0c19tZXRob2RzW10gPSB7CisgICAgICB7RFRTX01FVEhPRF9ERCwgImRlbHRhL2R1cmF0aW9uIiwgImRkIn0sCisgICAgICB7RFRTX01FVEhPRF9SRU9SREVSLCAicmVvcmRlciIsICJyZW9yZGVyIn0sCisgICAgICB7RFRTX01FVEhPRF9BU0MsICJhc2NlbmRpbmciLCAiYXNjIn0sCisgICAgICB7MCwgTlVMTCwgTlVMTH0sCisgICAgfTsKKworICAgIGdzdF9xdF9tdXhfZHRzX21ldGhvZCA9CisgICAgICAgIGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RRVE11eER0c01ldGhvZHMiLCBkdHNfbWV0aG9kcyk7CisgIH0KKworICByZXR1cm4gZ3N0X3F0X211eF9kdHNfbWV0aG9kOworfQorCisjZGVmaW5lIEdTVF9UWVBFX1FUX01VWF9EVFNfTUVUSE9EIFwKKyAgKGdzdF9xdF9tdXhfZHRzX21ldGhvZF9nZXRfdHlwZSAoKSkKKyNlbmRpZgorCitlbnVtCit7CisgIFBST1BfUEFEXzAsCisgIFBST1BfUEFEX1RSQUtfVElNRVNDQUxFLAorfTsKKworI2RlZmluZSBERUZBVUxUX1BBRF9UUkFLX1RJTUVTQ0FMRSAgICAgICAgICAwCisKK0dUeXBlIGdzdF9xdF9tdXhfcGFkX2dldF90eXBlICh2b2lkKTsKKworI2RlZmluZSBHU1RfVFlQRV9RVF9NVVhfUEFEIFwKKyAgKGdzdF9xdF9tdXhfcGFkX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9RVF9NVVhfUEFEKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9RVF9NVVhfUEFELCBHc3RRVE11eFBhZCkpCisjZGVmaW5lIEdTVF9RVF9NVVhfUEFEX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfUVRfTVVYX1BBRCwgR3N0UVRNdXhQYWRDbGFzcykpCisjZGVmaW5lIEdTVF9JU19RVF9NVVhfUEFEKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9RVF9NVVhfUEFEKSkKKyNkZWZpbmUgR1NUX0lTX1FUX01VWF9QQURfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9RVF9NVVhfUEFEKSkKKyNkZWZpbmUgR1NUX1FUX01VWF9QQURfQ0FTVChvYmopIFwKKyAgKChHc3RRVE11eFBhZCAqKShvYmopKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UVRNdXhQYWQgR3N0UVRNdXhQYWQ7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UVRNdXhQYWRDbGFzcyBHc3RRVE11eFBhZENsYXNzOworCitzdHJ1Y3QgX0dzdFFUTXV4UGFkCit7CisgIEdzdFBhZCBwYXJlbnQ7CisKKyAgZ3VpbnQzMiB0cmFrX3RpbWVzY2FsZTsKK307CisKK3N0cnVjdCBfR3N0UVRNdXhQYWRDbGFzcworeworICBHc3RQYWRDbGFzcyBwYXJlbnQ7Cit9OworCitHX0RFRklORV9UWVBFIChHc3RRVE11eFBhZCwgZ3N0X3F0X211eF9wYWQsIEdTVF9UWVBFX1BBRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X3BhZF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UVRNdXhQYWQgKnBhZCA9IEdTVF9RVF9NVVhfUEFEX0NBU1QgKG9iamVjdCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChwYWQpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUEFEX1RSQUtfVElNRVNDQUxFOgorICAgICAgcGFkLT50cmFrX3RpbWVzY2FsZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHBhZCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X3BhZF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UVRNdXhQYWQgKnBhZCA9IEdTVF9RVF9NVVhfUEFEX0NBU1QgKG9iamVjdCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChwYWQpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUEFEX1RSQUtfVElNRVNDQUxFOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHBhZC0+dHJha190aW1lc2NhbGUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAocGFkKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfcGFkX2NsYXNzX2luaXQgKEdzdFFUTXV4UGFkQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcXRfbXV4X3BhZF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9xdF9tdXhfcGFkX3NldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BBRF9UUkFLX1RJTUVTQ0FMRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgidHJhay10aW1lc2NhbGUiLCAiVHJhY2sgdGltZXNjYWxlIiwKKyAgICAgICAgICAiVGltZXNjYWxlIHRvIHVzZSBmb3IgdGhpcyBwYWQncyB0cmFrICh1bml0cyBwZXIgc2Vjb25kLCAwIGlzIGF1dG9tYXRpYykiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDMyLCBERUZBVUxUX1BBRF9UUkFLX1RJTUVTQ0FMRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9wYWRfaW5pdCAoR3N0UVRNdXhQYWQgKiBwYWQpCit7CisgIHBhZC0+dHJha190aW1lc2NhbGUgPSBERUZBVUxUX1BBRF9UUkFLX1RJTUVTQ0FMRTsKK30KKworc3RhdGljIGd1aW50MzIKK2dzdF9xdF9tdXhfcGFkX2dldF90aW1lc2NhbGUgKEdzdFFUTXV4UGFkICogcGFkKQoreworICBndWludDMyIHRpbWVzY2FsZTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHBhZCk7CisgIHRpbWVzY2FsZSA9IHBhZC0+dHJha190aW1lc2NhbGU7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChwYWQpOworCisgIHJldHVybiB0aW1lc2NhbGU7Cit9CisKKy8qIFFUTXV4IHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTU9WSUVfVElNRVNDQUxFLAorICBQUk9QX1RSQUtfVElNRVNDQUxFLAorICBQUk9QX0ZBU1RfU1RBUlQsCisgIFBST1BfRkFTVF9TVEFSVF9URU1QX0ZJTEUsCisgIFBST1BfTU9PVl9SRUNPVl9GSUxFLAorICBQUk9QX0ZSQUdNRU5UX0RVUkFUSU9OLAorICBQUk9QX1NUUkVBTUFCTEUsCisgIFBST1BfUkVTRVJWRURfTUFYX0RVUkFUSU9OLAorICBQUk9QX1JFU0VSVkVEX0RVUkFUSU9OX1JFTUFJTklORywKKyAgUFJPUF9SRVNFUlZFRF9NT09WX1VQREFURV9QRVJJT0QsCisgIFBST1BfUkVTRVJWRURfQllURVNfUEVSX1NFQywKKyAgUFJPUF9SRVNFUlZFRF9QUkVGSUxMLAorI2lmbmRlZiBHU1RfUkVNT1ZFX0RFUFJFQ0FURUQKKyAgUFJPUF9EVFNfTUVUSE9ELAorI2VuZGlmCisgIFBST1BfRE9fQ1RUUywKKyAgUFJPUF9JTlRFUkxFQVZFX0JZVEVTLAorICBQUk9QX0lOVEVSTEVBVkVfVElNRSwKKyAgUFJPUF9NQVhfUkFXX0FVRElPX0RSSUZULAorfTsKKworLyogc29tZSBzcGFyZSBmb3IgaGVhZGVyIHNpemUgYXMgd2VsbCAqLworI2RlZmluZSBNREFUX0xBUkdFX0ZJTEVfTElNSVQgICAgICAgICAgICgoZ3VpbnQ2NCkgMTAyNCAqIDEwMjQgKiAxMDI0ICogMikKKworI2RlZmluZSBERUZBVUxUX01PVklFX1RJTUVTQ0FMRSAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9UUkFLX1RJTUVTQ0FMRSAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfRE9fQ1RUUyAgICAgICAgICAgICAgICAgVFJVRQorI2RlZmluZSBERUZBVUxUX0ZBU1RfU1RBUlQgICAgICAgICAgICAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfRkFTVF9TVEFSVF9URU1QX0ZJTEUgICAgTlVMTAorI2RlZmluZSBERUZBVUxUX01PT1ZfUkVDT1ZfRklMRSAgICAgICAgIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9GUkFHTUVOVF9EVVJBVElPTiAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfU1RSRUFNQUJMRSAgICAgICAgICAgICAgVFJVRQorI2lmbmRlZiBHU1RfUkVNT1ZFX0RFUFJFQ0FURUQKKyNkZWZpbmUgREVGQVVMVF9EVFNfTUVUSE9EICAgICAgICAgICAgICBEVFNfTUVUSE9EX1JFT1JERVIKKyNlbmRpZgorI2RlZmluZSBERUZBVUxUX1JFU0VSVkVEX01BWF9EVVJBVElPTiAgIEdTVF9DTE9DS19USU1FX05PTkUKKyNkZWZpbmUgREVGQVVMVF9SRVNFUlZFRF9NT09WX1VQREFURV9QRVJJT0QgICBHU1RfQ0xPQ0tfVElNRV9OT05FCisjZGVmaW5lIERFRkFVTFRfUkVTRVJWRURfQllURVNfUEVSX1NFQ19QRVJfVFJBSyA1NTAKKyNkZWZpbmUgREVGQVVMVF9SRVNFUlZFRF9QUkVGSUxMIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfSU5URVJMRUFWRV9CWVRFUyAwCisjZGVmaW5lIERFRkFVTFRfSU5URVJMRUFWRV9USU1FIDI1MCpHU1RfTVNFQ09ORAorI2RlZmluZSBERUZBVUxUX01BWF9SQVdfQVVESU9fRFJJRlQgNDAgKiBHU1RfTVNFQ09ORAorCitzdGF0aWMgdm9pZCBnc3RfcXRfbXV4X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9xdF9tdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworLyogcHJvcGVydHkgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBnc3RfcXRfbXV4X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9xdF9tdXhfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCisvKiBwYWQgZnVuY3Rpb25zICovCitzdGF0aWMgR3N0UGFkICpnc3RfcXRfbXV4X3JlcXVlc3RfbmV3X3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgY29uc3QgZ2NoYXIgKiBuYW1lLCBjb25zdCBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgdm9pZCBnc3RfcXRfbXV4X3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKTsKKworLyogZXZlbnQgKi8KK3N0YXRpYyBnYm9vbGVhbiBnc3RfcXRfbXV4X3NpbmtfZXZlbnQgKEdzdENvbGxlY3RQYWRzICogcGFkcywKKyAgICBHc3RDb2xsZWN0RGF0YSAqIGRhdGEsIEdzdEV2ZW50ICogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9xdF9tdXhfY29sbGVjdGVkIChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9xdF9tdXhfYWRkX2J1ZmZlciAoR3N0UVRNdXggKiBxdG11eCwgR3N0UVRQYWQgKiBwYWQsCisgICAgR3N0QnVmZmVyICogYnVmKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfcm9idXN0X3JlY29yZGluZ19yZXdyaXRlX21vb3YgKEdzdFFUTXV4ICogcXRtdXgpOworCitzdGF0aWMgdm9pZCBnc3RfcXRfbXV4X3VwZGF0ZV9nbG9iYWxfc3RhdGlzdGljcyAoR3N0UVRNdXggKiBxdG11eCk7CitzdGF0aWMgdm9pZCBnc3RfcXRfbXV4X3VwZGF0ZV9lZGl0X2xpc3RzIChHc3RRVE11eCAqIHF0bXV4KTsKKworc3RhdGljIEdzdEVsZW1lbnRDbGFzcyAqcGFyZW50X2NsYXNzID0gTlVMTDsKKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfYmFzZV9pbml0IChncG9pbnRlciBnX2NsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoZ19jbGFzcyk7CisgIEdzdFFUTXV4Q2xhc3MgKmtsYXNzID0gKEdzdFFUTXV4Q2xhc3MgKikgZ19jbGFzczsKKyAgR3N0UVRNdXhDbGFzc1BhcmFtcyAqcGFyYW1zOworICBHc3RQYWRUZW1wbGF0ZSAqdmlkZW9zaW5rdGVtcGwsICphdWRpb3Npbmt0ZW1wbCwgKnN1YnRpdGxlc2lua3RlbXBsOworICBHc3RQYWRUZW1wbGF0ZSAqc3JjdGVtcGw7CisgIGdjaGFyICpsb25nbmFtZSwgKmRlc2NyaXB0aW9uOworCisgIHBhcmFtcyA9CisgICAgICAoR3N0UVRNdXhDbGFzc1BhcmFtcyAqKSBnX3R5cGVfZ2V0X3FkYXRhIChHX09CSkVDVF9DTEFTU19UWVBFIChnX2NsYXNzKSwKKyAgICAgIEdTVF9RVF9NVVhfUEFSQU1TX1FEQVRBKTsKKyAgZ19hc3NlcnQgKHBhcmFtcyAhPSBOVUxMKTsKKworICAvKiBjb25zdHJ1Y3QgdGhlIGVsZW1lbnQgZGV0YWlscyBzdHJ1Y3QgKi8KKyAgbG9uZ25hbWUgPSBnX3N0cmR1cF9wcmludGYgKCIlcyBNdXhlciIsIHBhcmFtcy0+cHJvcC0+bG9uZ19uYW1lKTsKKyAgZGVzY3JpcHRpb24gPSBnX3N0cmR1cF9wcmludGYgKCJNdWx0aXBsZXggYXVkaW8gYW5kIHZpZGVvIGludG8gYSAlcyBmaWxlIiwKKyAgICAgIHBhcmFtcy0+cHJvcC0+bG9uZ19uYW1lKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgbG9uZ25hbWUsCisgICAgICAiQ29kZWMvTXV4ZXIiLCBkZXNjcmlwdGlvbiwKKyAgICAgICJUaGlhZ28gU291c2EgU2FudG9zIDx0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5icj4iKTsKKyAgZ19mcmVlIChsb25nbmFtZSk7CisgIGdfZnJlZSAoZGVzY3JpcHRpb24pOworCisgIC8qIHBhZCB0ZW1wbGF0ZXMgKi8KKyAgc3JjdGVtcGwgPSBnc3RfcGFkX3RlbXBsYXRlX25ldyAoInNyYyIsIEdTVF9QQURfU1JDLAorICAgICAgR1NUX1BBRF9BTFdBWVMsIHBhcmFtcy0+c3JjX2NhcHMpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCBzcmN0ZW1wbCk7CisKKyAgaWYgKHBhcmFtcy0+YXVkaW9fc2lua19jYXBzKSB7CisgICAgYXVkaW9zaW5rdGVtcGwgPSBnc3RfcGFkX3RlbXBsYXRlX25ld193aXRoX2d0eXBlICgiYXVkaW9fJXUiLAorICAgICAgICBHU1RfUEFEX1NJTkssIEdTVF9QQURfUkVRVUVTVCwgcGFyYW1zLT5hdWRpb19zaW5rX2NhcHMsCisgICAgICAgIEdTVF9UWVBFX1FUX01VWF9QQUQpOworICAgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsIGF1ZGlvc2lua3RlbXBsKTsKKyAgfQorCisgIGlmIChwYXJhbXMtPnZpZGVvX3NpbmtfY2FwcykgeworICAgIHZpZGVvc2lua3RlbXBsID0gZ3N0X3BhZF90ZW1wbGF0ZV9uZXdfd2l0aF9ndHlwZSAoInZpZGVvXyV1IiwKKyAgICAgICAgR1NUX1BBRF9TSU5LLCBHU1RfUEFEX1JFUVVFU1QsIHBhcmFtcy0+dmlkZW9fc2lua19jYXBzLAorICAgICAgICBHU1RfVFlQRV9RVF9NVVhfUEFEKTsKKyAgICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCB2aWRlb3Npbmt0ZW1wbCk7CisgIH0KKworICBpZiAocGFyYW1zLT5zdWJ0aXRsZV9zaW5rX2NhcHMpIHsKKyAgICBzdWJ0aXRsZXNpbmt0ZW1wbCA9IGdzdF9wYWRfdGVtcGxhdGVfbmV3X3dpdGhfZ3R5cGUgKCJzdWJ0aXRsZV8ldSIsCisgICAgICAgIEdTVF9QQURfU0lOSywgR1NUX1BBRF9SRVFVRVNULCBwYXJhbXMtPnN1YnRpdGxlX3NpbmtfY2FwcywKKyAgICAgICAgR1NUX1RZUEVfUVRfTVVYX1BBRCk7CisgICAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgc3VidGl0bGVzaW5rdGVtcGwpOworICB9CisKKyAga2xhc3MtPmZvcm1hdCA9IHBhcmFtcy0+cHJvcC0+Zm9ybWF0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9jbGFzc19pbml0IChHc3RRVE11eENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHUGFyYW1GbGFncyBzdHJlYW1hYmxlX2ZsYWdzOworICBjb25zdCBnY2hhciAqc3RyZWFtYWJsZV9kZXNjOworICBnYm9vbGVhbiBzdHJlYW1hYmxlOworI2RlZmluZSBTVFJFQU1BQkxFX0RFU0MgIklmIHNldCB0byB0cnVlLCB0aGUgb3V0cHV0IHNob3VsZCBiZSBhcyBpZiBpdCBpcyB0byAiXAorICAiYmUgc3RyZWFtZWQgYW5kIGhlbmNlIG5vIGluZGV4ZXMgd3JpdHRlbiBvciBkdXJhdGlvbiB3cml0dGVuLiIKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcXRfbXV4X2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcXRfbXV4X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3F0X211eF9zZXRfcHJvcGVydHk7CisKKyAgc3RyZWFtYWJsZV9mbGFncyA9IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1Q7CisgIGlmIChrbGFzcy0+Zm9ybWF0ID09IEdTVF9RVF9NVVhfRk9STUFUX0lTTUwpIHsKKyAgICBzdHJlYW1hYmxlX2Rlc2MgPSBTVFJFQU1BQkxFX0RFU0M7CisgICAgc3RyZWFtYWJsZSA9IERFRkFVTFRfU1RSRUFNQUJMRTsKKyAgfSBlbHNlIHsKKyAgICBzdHJlYW1hYmxlX2Rlc2MgPQorICAgICAgICBTVFJFQU1BQkxFX0RFU0MgIiAoREVQUkVDQVRFRCwgb25seSB2YWxpZCBmb3IgZnJhZ21lbnRlZCBNUDQpIjsKKyAgICBzdHJlYW1hYmxlX2ZsYWdzIHw9IEdfUEFSQU1fREVQUkVDQVRFRDsKKyAgICBzdHJlYW1hYmxlID0gRkFMU0U7CisgIH0KKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01PVklFX1RJTUVTQ0FMRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibW92aWUtdGltZXNjYWxlIiwgIk1vdmllIHRpbWVzY2FsZSIsCisgICAgICAgICAgIlRpbWVzY2FsZSB0byB1c2UgaW4gdGhlIG1vdmllICh1bml0cyBwZXIgc2Vjb25kLCAwID09IGRlZmF1bHQpIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQzMiwgREVGQVVMVF9NT1ZJRV9USU1FU0NBTEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UUkFLX1RJTUVTQ0FMRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgidHJhay10aW1lc2NhbGUiLCAiVHJhY2sgdGltZXNjYWxlIiwKKyAgICAgICAgICAiVGltZXNjYWxlIHRvIHVzZSBmb3IgdGhlIHRyYWNrcyAodW5pdHMgcGVyIHNlY29uZCwgMCBpcyBhdXRvbWF0aWMpIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQzMiwgREVGQVVMVF9UUkFLX1RJTUVTQ0FMRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RPX0NUVFMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInByZXNlbnRhdGlvbi10aW1lIiwKKyAgICAgICAgICAiSW5jbHVkZSBwcmVzZW50YXRpb24tdGltZSBpbmZvIiwKKyAgICAgICAgICAiQ2FsY3VsYXRlIGFuZCBpbmNsdWRlIHByZXNlbnRhdGlvbi9jb21wb3NpdGlvbiB0aW1lICIKKyAgICAgICAgICAiKGluIGFkZGl0aW9uIHRvIGRlY29kaW5nIHRpbWUpIiwgREVGQVVMVF9ET19DVFRTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisjaWZuZGVmIEdTVF9SRU1PVkVfREVQUkVDQVRFRAorICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RUU19NRVRIT0QsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoImR0cy1tZXRob2QiLCAiZHRzLW1ldGhvZCIsCisgICAgICAgICAgIk1ldGhvZCB0byBkZXRlcm1pbmUgRFRTIHRpbWUgKERFUFJFQ0FURUQpIiwKKyAgICAgICAgICBHU1RfVFlQRV9RVF9NVVhfRFRTX01FVEhPRCwgREVGQVVMVF9EVFNfTUVUSE9ELAorICAgICAgICAgIEdfUEFSQU1fREVQUkVDQVRFRCB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfAorICAgICAgICAgIEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyNlbmRpZgorICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0ZBU1RfU1RBUlQsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImZhc3RzdGFydCIsICJGb3JtYXQgZmlsZSB0byBmYXN0c3RhcnQiLAorICAgICAgICAgICJJZiB0aGUgZmlsZSBzaG91bGQgYmUgZm9ybWF0dGVkIGZvciBmYXN0c3RhcnQgKGhlYWRlcnMgZmlyc3QpIiwKKyAgICAgICAgICBERUZBVUxUX0ZBU1RfU1RBUlQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0ZBU1RfU1RBUlRfVEVNUF9GSUxFLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImZhc3RzdGFydC1maWxlIiwgIkZpbGUgdG8gdXNlIGZvciBzdG9yaW5nIGJ1ZmZlcnMiLAorICAgICAgICAgICJGaWxlIHRoYXQgd2lsbCBiZSB1c2VkIHRlbXBvcmFyaWx5IHRvIHN0b3JlIGRhdGEgZnJvbSB0aGUgc3RyZWFtICIKKyAgICAgICAgICAid2hlbiBjcmVhdGluZyBhIGZhc3RzdGFydCBmaWxlLiBJZiBudWxsIGEgZmlsZXBhdGggd2lsbCBiZSAiCisgICAgICAgICAgImNyZWF0ZWQgYXV0b21hdGljYWxseSIsIERFRkFVTFRfRkFTVF9TVEFSVF9URU1QX0ZJTEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NT09WX1JFQ09WX0ZJTEUsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibW9vdi1yZWNvdmVyeS1maWxlIiwKKyAgICAgICAgICAiRmlsZSB0byBzdG9yZSBkYXRhIGZvciBwb3N0ZXJpb3IgbW9vdiBhdG9tIHJlY292ZXJ5IiwKKyAgICAgICAgICAiRmlsZSB0byBiZSB1c2VkIHRvIHN0b3JlICIKKyAgICAgICAgICAiZGF0YSBmb3IgbW9vdiBhdG9tIG1ha2luZyBtb3ZpZSBmaWxlIHJlY292ZXJ5IHBvc3NpYmxlIGluIGNhc2UgIgorICAgICAgICAgICJvZiBhIGNyYXNoIGR1cmluZyBtdXhpbmcuIE51bGwgZm9yIGRpc2FibGVkLiAoRXhwZXJpbWVudGFsKSIsCisgICAgICAgICAgREVGQVVMVF9NT09WX1JFQ09WX0ZJTEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9GUkFHTUVOVF9EVVJBVElPTiwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiZnJhZ21lbnQtZHVyYXRpb24iLCAiRnJhZ21lbnQgZHVyYXRpb24iLAorICAgICAgICAgICJGcmFnbWVudCBkdXJhdGlvbnMgaW4gbXMgKHByb2R1Y2UgYSBmcmFnbWVudGVkIGZpbGUgaWYgPiAwKSIsCisgICAgICAgICAgMCwgR19NQVhVSU5UMzIsIGtsYXNzLT5mb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfSVNNTCA/CisgICAgICAgICAgMjAwMCA6IERFRkFVTFRfRlJBR01FTlRfRFVSQVRJT04sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TVFJFQU1BQkxFLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzdHJlYW1hYmxlIiwgIlN0cmVhbWFibGUiLCBzdHJlYW1hYmxlX2Rlc2MsCisgICAgICAgICAgc3RyZWFtYWJsZSwgc3RyZWFtYWJsZV9mbGFncyB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SRVNFUlZFRF9NQVhfRFVSQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgicmVzZXJ2ZWQtbWF4LWR1cmF0aW9uIiwKKyAgICAgICAgICAiUmVzZXJ2ZWQgbWF4aW11bSBmaWxlIGR1cmF0aW9uIChucykiLAorICAgICAgICAgICJXaGVuIHNldCB0byBhIHZhbHVlID4gMCwgcmVzZXJ2ZXMgc3BhY2UgZm9yIGluZGV4IHRhYmxlcyBhdCB0aGUgIgorICAgICAgICAgICJiZWdpbm5pbmcgb2YgdGhlIGZpbGUuIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQ2NCwgREVGQVVMVF9SRVNFUlZFRF9NQVhfRFVSQVRJT04sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1JFU0VSVkVEX0RVUkFUSU9OX1JFTUFJTklORywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJyZXNlcnZlZC1kdXJhdGlvbi1yZW1haW5pbmciLAorICAgICAgICAgICJSZXBvcnQgdGhlIGFwcHJveGltYXRlIGFtb3VudCBvZiByZW1haW5pbmcgcmVjb3JkaW5nIHNwYWNlIChucykiLAorICAgICAgICAgICJSZXBvcnRzIHRoZSBhcHByb3hpbWF0ZSBhbW91bnQgb2YgcmVtYWluaW5nIG1vb3YgaGVhZGVyIHNwYWNlICIKKyAgICAgICAgICAicmVzZXJ2ZWQgdXNpbmcgcmVzZXJ2ZWQtbWF4LWR1cmF0aW9uIiwgMCwgR19NQVhVSU5UNjQsIDAsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfUkVTRVJWRURfTU9PVl9VUERBVEVfUEVSSU9ELAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoInJlc2VydmVkLW1vb3YtdXBkYXRlLXBlcmlvZCIsCisgICAgICAgICAgIkludGVydmFsIGF0IHdoaWNoIHRvIHVwZGF0ZSBpbmRleCB0YWJsZXMgKG5zKSIsCisgICAgICAgICAgIldoZW4gdXNlZCB3aXRoIHJlc2VydmVkLW1heC1kdXJhdGlvbiwgcGVyaW9kaWNhbGx5IHVwZGF0ZXMgdGhlICIKKyAgICAgICAgICAiaW5kZXggdGFibGVzIHdpdGggaW5mb3JtYXRpb24gbXV4ZWQgc28gZmFyLiIsIDAsIEdfTUFYVUlOVDY0LAorICAgICAgICAgIERFRkFVTFRfUkVTRVJWRURfTU9PVl9VUERBVEVfUEVSSU9ELAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JFU0VSVkVEX0JZVEVTX1BFUl9TRUMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInJlc2VydmVkLWJ5dGVzLXBlci1zZWMiLAorICAgICAgICAgICJSZXNlcnZlZCBNT09WIGJ5dGVzIHBlciBzZWNvbmQsIHBlciB0cmFjayIsCisgICAgICAgICAgIk11bHRpcGxpZXIgZm9yIGNvbnZlcnRpbmcgcmVzZXJ2ZWQtbWF4LWR1cmF0aW9uIGludG8gYnl0ZXMgb2YgaGVhZGVyIHRvIHJlc2VydmUsIHBlciBzZWNvbmQsIHBlciB0cmFjayIsCisgICAgICAgICAgMCwgMTAwMDAsIERFRkFVTFRfUkVTRVJWRURfQllURVNfUEVSX1NFQ19QRVJfVFJBSywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JFU0VSVkVEX1BSRUZJTEwsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInJlc2VydmVkLXByZWZpbGwiLAorICAgICAgICAgICJSZXNlcnZlZCBQcmVmaWxsIFNhbXBsZXMgVGFibGUiLAorICAgICAgICAgICJQcmVmaWxsIHNhbXBsZXMgdGFibGUgb2YgcmVzZXJ2ZWQgZHVyYXRpb24iLAorICAgICAgICAgIERFRkFVTFRfUkVTRVJWRURfUFJFRklMTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lOVEVSTEVBVkVfQllURVMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgiaW50ZXJsZWF2ZS1ieXRlcyIsICJJbnRlcmxlYXZlIChieXRlcykiLAorICAgICAgICAgICJJbnRlcmxlYXZlIGJldHdlZW4gc3RyZWFtcyBpbiBieXRlcyIsCisgICAgICAgICAgMCwgR19NQVhVSU5UNjQsIERFRkFVTFRfSU5URVJMRUFWRV9CWVRFUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9JTlRFUkxFQVZFX1RJTUUsCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgiaW50ZXJsZWF2ZS10aW1lIiwgIkludGVybGVhdmUgKHRpbWUpIiwKKyAgICAgICAgICAiSW50ZXJsZWF2ZSBiZXR3ZWVuIHN0cmVhbXMgaW4gbmFub3NlY29uZHMiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDY0LCBERUZBVUxUX0lOVEVSTEVBVkVfVElNRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfUkFXX0FVRElPX0RSSUZULAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoIm1heC1yYXctYXVkaW8tZHJpZnQiLCAiTWF4IFJhdyBBdWRpbyBEcmlmdCIsCisgICAgICAgICAgIk1heGltdW0gYWxsb3dlZCBkcmlmdCBvZiByYXcgYXVkaW8gc2FtcGxlcyB2cy4gdGltZXN0YW1wcyBpbiBuYW5vc2Vjb25kcyIsCisgICAgICAgICAgMCwgR19NQVhVSU5UNjQsIERFRkFVTFRfTUFYX1JBV19BVURJT19EUklGVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5yZXF1ZXN0X25ld19wYWQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9xdF9tdXhfcmVxdWVzdF9uZXdfcGFkKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9xdF9tdXhfY2hhbmdlX3N0YXRlKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVsZWFzZV9wYWQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3F0X211eF9yZWxlYXNlX3BhZCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X3BhZF9yZXNldCAoR3N0UVRQYWQgKiBxdHBhZCkKK3sKKyAgcXRwYWQtPmZvdXJjYyA9IDA7CisgIHF0cGFkLT5pc19vdXRfb2Zfb3JkZXIgPSBGQUxTRTsKKyAgcXRwYWQtPnNhbXBsZV9zaXplID0gMDsKKyAgcXRwYWQtPnN5bmMgPSBGQUxTRTsKKyAgcXRwYWQtPmxhc3RfZHRzID0gMDsKKyAgcXRwYWQtPnNhbXBsZV9vZmZzZXQgPSAwOworICBxdHBhZC0+ZHRzX2FkanVzdG1lbnQgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBxdHBhZC0+Zmlyc3RfdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBxdHBhZC0+Zmlyc3RfZHRzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgcXRwYWQtPnByZXBhcmVfYnVmX2Z1bmMgPSBOVUxMOworICBxdHBhZC0+Y3JlYXRlX2VtcHR5X2J1ZmZlciA9IE5VTEw7CisgIHF0cGFkLT5hdmdfYml0cmF0ZSA9IDA7CisgIHF0cGFkLT5tYXhfYml0cmF0ZSA9IDA7CisgIHF0cGFkLT50b3RhbF9kdXJhdGlvbiA9IDA7CisgIHF0cGFkLT50b3RhbF9ieXRlcyA9IDA7CisgIHF0cGFkLT5zcGFyc2UgPSBGQUxTRTsKKworICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZxdHBhZC0+bGFzdF9idWYsIE5VTEwpOworCisgIGlmIChxdHBhZC0+dGFncykgeworICAgIGdzdF90YWdfbGlzdF91bnJlZiAocXRwYWQtPnRhZ3MpOworICAgIHF0cGFkLT50YWdzID0gTlVMTDsKKyAgfQorCisgIC8qIHJlZmVyZW5jZSBvd25lZCBlbHNld2hlcmUgKi8KKyAgcXRwYWQtPnRyYWsgPSBOVUxMOworICBxdHBhZC0+dGNfdHJhayA9IE5VTEw7CisKKyAgaWYgKHF0cGFkLT50cmFmKSB7CisgICAgYXRvbV90cmFmX2ZyZWUgKHF0cGFkLT50cmFmKTsKKyAgICBxdHBhZC0+dHJhZiA9IE5VTEw7CisgIH0KKyAgYXRvbV9hcnJheV9jbGVhciAoJnF0cGFkLT5mcmFnbWVudF9idWZmZXJzKTsKKyAgaWYgKHF0cGFkLT5zYW1wbGVzKQorICAgIGdfYXJyYXlfdW5yZWYgKHF0cGFkLT5zYW1wbGVzKTsKKyAgcXRwYWQtPnNhbXBsZXMgPSBOVUxMOworCisgIC8qIHJlZmVyZW5jZSBvd25lZCBlbHNld2hlcmUgKi8KKyAgcXRwYWQtPnRmcmEgPSBOVUxMOworCisgIHF0cGFkLT5maXJzdF9wdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBxdHBhZC0+dGNfcG9zID0gLTE7CisgIGlmIChxdHBhZC0+Zmlyc3RfdGMpCisgICAgZ3N0X3ZpZGVvX3RpbWVfY29kZV9mcmVlIChxdHBhZC0+Zmlyc3RfdGMpOworICBxdHBhZC0+Zmlyc3RfdGMgPSBOVUxMOworCisgIGlmIChxdHBhZC0+cmF3X2F1ZGlvX2FkYXB0ZXIpCisgICAgZ3N0X29iamVjdF91bnJlZiAocXRwYWQtPnJhd19hdWRpb19hZGFwdGVyKTsKKyAgcXRwYWQtPnJhd19hdWRpb19hZGFwdGVyID0gTlVMTDsKK30KKworLyoKKyAqIFRha2VzIEdzdFFUTXV4IGJhY2sgdG8gaXRzIGluaXRpYWwgc3RhdGUKKyAqLworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfcmVzZXQgKEdzdFFUTXV4ICogcXRtdXgsIGdib29sZWFuIGFsbG9jKQoreworICBHU0xpc3QgKndhbGs7CisKKyAgcXRtdXgtPnN0YXRlID0gR1NUX1FUX01VWF9TVEFURV9OT05FOworICBxdG11eC0+aGVhZGVyX3NpemUgPSAwOworICBxdG11eC0+bWRhdF9zaXplID0gMDsKKyAgcXRtdXgtPm1vb3ZfcG9zID0gMDsKKyAgcXRtdXgtPm1kYXRfcG9zID0gMDsKKyAgcXRtdXgtPmxvbmdlc3RfY2h1bmsgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBxdG11eC0+ZnJhZ21lbnRfc2VxdWVuY2UgPSAwOworCisgIGlmIChxdG11eC0+ZnR5cCkgeworICAgIGF0b21fZnR5cF9mcmVlIChxdG11eC0+ZnR5cCk7CisgICAgcXRtdXgtPmZ0eXAgPSBOVUxMOworICB9CisgIGlmIChxdG11eC0+bW9vdikgeworICAgIGF0b21fbW9vdl9mcmVlIChxdG11eC0+bW9vdik7CisgICAgcXRtdXgtPm1vb3YgPSBOVUxMOworICB9CisgIGlmIChxdG11eC0+bWZyYSkgeworICAgIGF0b21fbWZyYV9mcmVlIChxdG11eC0+bWZyYSk7CisgICAgcXRtdXgtPm1mcmEgPSBOVUxMOworICB9CisgIGlmIChxdG11eC0+ZmFzdF9zdGFydF9maWxlKSB7CisgICAgZmNsb3NlIChxdG11eC0+ZmFzdF9zdGFydF9maWxlKTsKKyAgICBnX3JlbW92ZSAocXRtdXgtPmZhc3Rfc3RhcnRfZmlsZV9wYXRoKTsKKyAgICBxdG11eC0+ZmFzdF9zdGFydF9maWxlID0gTlVMTDsKKyAgfQorICBpZiAocXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZSkgeworICAgIGZjbG9zZSAocXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZSk7CisgICAgcXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZSA9IE5VTEw7CisgIH0KKyAgZm9yICh3YWxrID0gcXRtdXgtPmV4dHJhX2F0b21zOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEF0b21JbmZvICphaW5mbyA9IChBdG9tSW5mbyAqKSB3YWxrLT5kYXRhOworICAgIGFpbmZvLT5mcmVlX2Z1bmMgKGFpbmZvLT5hdG9tKTsKKyAgICBnX2ZyZWUgKGFpbmZvKTsKKyAgfQorICBnX3NsaXN0X2ZyZWUgKHF0bXV4LT5leHRyYV9hdG9tcyk7CisgIHF0bXV4LT5leHRyYV9hdG9tcyA9IE5VTEw7CisKKyAgR1NUX09CSkVDVF9MT0NLIChxdG11eCk7CisgIGdzdF90YWdfc2V0dGVyX3Jlc2V0X3RhZ3MgKEdTVF9UQUdfU0VUVEVSIChxdG11eCkpOworICBHU1RfT0JKRUNUX1VOTE9DSyAocXRtdXgpOworCisgIC8qIHJlc2V0IHBhZCBkYXRhICovCisgIGZvciAod2FsayA9IHF0bXV4LT5zaW5rcGFkczsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RRVFBhZCAqcXRwYWQgPSAoR3N0UVRQYWQgKikgd2Fsay0+ZGF0YTsKKyAgICBnc3RfcXRfbXV4X3BhZF9yZXNldCAocXRwYWQpOworCisgICAgLyogaG0sIG1vb3ZfZnJlZSBhYm92ZSB5YW5rZWQgdGhlIHRyYWtzIGF3YXkgZnJvbSB1cywKKyAgICAgKiBzbyBkbyBub3QgZnJlZSwgYnV0IGRvIGNsZWFyICovCisgICAgcXRwYWQtPnRyYWsgPSBOVUxMOworICB9CisKKyAgaWYgKGFsbG9jKSB7CisgICAgcXRtdXgtPm1vb3YgPSBhdG9tX21vb3ZfbmV3IChxdG11eC0+Y29udGV4dCk7CisgICAgLyogZW5zdXJlIGFsbCBpcyBhcyBuaWNlIGFuZCBmcmVzaCBhcyByZXF1ZXN0X25ld19wYWQgd291bGQgcHJvdmlkZSBpdCAqLworICAgIGZvciAod2FsayA9IHF0bXV4LT5zaW5rcGFkczsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICAgIEdzdFFUUGFkICpxdHBhZCA9IChHc3RRVFBhZCAqKSB3YWxrLT5kYXRhOworCisgICAgICBxdHBhZC0+dHJhayA9IGF0b21fdHJha19uZXcgKHF0bXV4LT5jb250ZXh0KTsKKyAgICAgIGF0b21fbW9vdl9hZGRfdHJhayAocXRtdXgtPm1vb3YsIHF0cGFkLT50cmFrKTsKKyAgICB9CisgIH0KKworICBxdG11eC0+Y3VycmVudF9wYWQgPSBOVUxMOworICBxdG11eC0+Y3VycmVudF9jaHVua19zaXplID0gMDsKKyAgcXRtdXgtPmN1cnJlbnRfY2h1bmtfZHVyYXRpb24gPSAwOworICBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQgPSAtMTsKKworICBxdG11eC0+cmVzZXJ2ZWRfbW9vdl9zaXplID0gMDsKKyAgcXRtdXgtPmxhc3RfbW9vdl91cGRhdGUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBxdG11eC0+bXV4ZWRfc2luY2VfbGFzdF91cGRhdGUgPSAwOworICBxdG11eC0+cmVzZXJ2ZWRfZHVyYXRpb25fcmVtYWluaW5nID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfaW5pdCAoR3N0UVRNdXggKiBxdG11eCwgR3N0UVRNdXhDbGFzcyAqIHF0bXV4X2tsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHF0bXV4X2tsYXNzKTsKKyAgR3N0UGFkVGVtcGxhdGUgKnRlbXBsOworCisgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJzcmMiKTsKKyAgcXRtdXgtPnNyY3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKHRlbXBsLCAic3JjIik7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKHF0bXV4LT5zcmNwYWQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAocXRtdXgpLCBxdG11eC0+c3JjcGFkKTsKKworICBxdG11eC0+c2lua3BhZHMgPSBOVUxMOworICBxdG11eC0+Y29sbGVjdCA9IGdzdF9jb2xsZWN0X3BhZHNfbmV3ICgpOworICBnc3RfY29sbGVjdF9wYWRzX3NldF9ldmVudF9mdW5jdGlvbiAocXRtdXgtPmNvbGxlY3QsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3F0X211eF9zaW5rX2V2ZW50KSwgcXRtdXgpOworICBnc3RfY29sbGVjdF9wYWRzX3NldF9jbGlwX2Z1bmN0aW9uIChxdG11eC0+Y29sbGVjdCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfY29sbGVjdF9wYWRzX2NsaXBfcnVubmluZ190aW1lKSwgcXRtdXgpOworICBnc3RfY29sbGVjdF9wYWRzX3NldF9mdW5jdGlvbiAocXRtdXgtPmNvbGxlY3QsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3F0X211eF9jb2xsZWN0ZWQpLCBxdG11eCk7CisKKyAgLyogcHJvcGVydGllcyBzZXQgdG8gZGVmYXVsdCB1cG9uIGNvbnN0cnVjdGlvbiAqLworCisgIHF0bXV4LT5yZXNlcnZlZF9tYXhfZHVyYXRpb24gPSBERUZBVUxUX1JFU0VSVkVEX01BWF9EVVJBVElPTjsKKyAgcXRtdXgtPnJlc2VydmVkX21vb3ZfdXBkYXRlX3BlcmlvZCA9IERFRkFVTFRfUkVTRVJWRURfTU9PVl9VUERBVEVfUEVSSU9EOworICBxdG11eC0+cmVzZXJ2ZWRfYnl0ZXNfcGVyX3NlY19wZXJfdHJhayA9CisgICAgICBERUZBVUxUX1JFU0VSVkVEX0JZVEVTX1BFUl9TRUNfUEVSX1RSQUs7CisgIHF0bXV4LT5pbnRlcmxlYXZlX2J5dGVzID0gREVGQVVMVF9JTlRFUkxFQVZFX0JZVEVTOworICBxdG11eC0+aW50ZXJsZWF2ZV90aW1lID0gREVGQVVMVF9JTlRFUkxFQVZFX1RJTUU7CisgIHF0bXV4LT5tYXhfcmF3X2F1ZGlvX2RyaWZ0ID0gREVGQVVMVF9NQVhfUkFXX0FVRElPX0RSSUZUOworCisgIC8qIGFsd2F5cyBuZWVkIHRoaXMgKi8KKyAgcXRtdXgtPmNvbnRleHQgPQorICAgICAgYXRvbXNfY29udGV4dF9uZXcgKGdzdF9xdF9tdXhfbWFwX2Zvcm1hdF90b19mbGF2b3IgKHF0bXV4X2tsYXNzLT5mb3JtYXQpKTsKKworICAvKiBpbnRlcm5hbHMgdG8gaW5pdGlhbCBzdGF0ZSAqLworICBnc3RfcXRfbXV4X3Jlc2V0IChxdG11eCwgVFJVRSk7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFFUTXV4ICpxdG11eCA9IEdTVF9RVF9NVVhfQ0FTVCAob2JqZWN0KTsKKworICBnc3RfcXRfbXV4X3Jlc2V0IChxdG11eCwgRkFMU0UpOworCisgIGdfZnJlZSAocXRtdXgtPmZhc3Rfc3RhcnRfZmlsZV9wYXRoKTsKKyAgZ19mcmVlIChxdG11eC0+bW9vdl9yZWNvdl9maWxlX3BhdGgpOworCisgIGF0b21zX2NvbnRleHRfZnJlZSAocXRtdXgtPmNvbnRleHQpOworICBnc3Rfb2JqZWN0X3VucmVmIChxdG11eC0+Y29sbGVjdCk7CisKKyAgZ19zbGlzdF9mcmVlIChxdG11eC0+c2lua3BhZHMpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcXRfbXV4X3ByZXBhcmVfanBjX2J1ZmZlciAoR3N0UVRQYWQgKiBxdHBhZCwgR3N0QnVmZmVyICogYnVmLAorICAgIEdzdFFUTXV4ICogcXRtdXgpCit7CisgIEdzdEJ1ZmZlciAqbmV3YnVmOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3NpemUgc2l6ZTsKKworICBHU1RfTE9HX09CSkVDVCAocXRtdXgsICJQcmVwYXJpbmcganBjIGJ1ZmZlciIpOworCisgIGlmIChidWYgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKyAgbmV3YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplICsgOCk7CisgIGdzdF9idWZmZXJfY29weV9pbnRvIChuZXdidWYsIGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX0FMTCwgOCwgc2l6ZSk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG5ld2J1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIEdTVF9XUklURV9VSU5UMzJfTEUgKG1hcC5kYXRhICsgNCwgRk9VUkNDX2pwMmMpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgcmV0dXJuIG5ld2J1ZjsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcXRfbXV4X3ByZXBhcmVfdHgzZ19idWZmZXIgKEdzdFFUUGFkICogcXRwYWQsIEdzdEJ1ZmZlciAqIGJ1ZiwKKyAgICBHc3RRVE11eCAqIHF0bXV4KQoreworICBHc3RCdWZmZXIgKm5ld2J1ZjsKKyAgR3N0TWFwSW5mbyBmcm9tbWFwOworICBHc3RNYXBJbmZvIHRvbWFwOworICBnc2l6ZSBzaXplOworICBjb25zdCBndWludDggKmRhdGFlbmQ7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHF0bXV4LCAiUHJlcGFyaW5nIHR4M2cgYnVmZmVyICUiIEdTVF9QVFJfRk9STUFULCBidWYpOworCisgIGlmIChidWYgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmZnJvbW1hcCwgR1NUX01BUF9SRUFEKTsKKworICBkYXRhZW5kID0gbWVtY2hyIChmcm9tbWFwLmRhdGEsIDAsIGZyb21tYXAuc2l6ZSk7CisgIHNpemUgPSBkYXRhZW5kID8gZGF0YWVuZCAtIGZyb21tYXAuZGF0YSA6IGZyb21tYXAuc2l6ZTsKKyAgbmV3YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplICsgMik7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG5ld2J1ZiwgJnRvbWFwLCBHU1RfTUFQX1dSSVRFKTsKKworICBHU1RfV1JJVEVfVUlOVDE2X0JFICh0b21hcC5kYXRhLCBzaXplKTsKKyAgbWVtY3B5ICh0b21hcC5kYXRhICsgMiwgZnJvbW1hcC5kYXRhLCBzaXplKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChuZXdidWYsICZ0b21hcCk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJmZyb21tYXApOworCisgIGdzdF9idWZmZXJfY29weV9pbnRvIChuZXdidWYsIGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX01FVEFEQVRBLCAwLCBzaXplKTsKKworICAvKiBnc3RfYnVmZmVyX2NvcHlfaW50byBpcyB0cnlpbmcgdG8gYmUgdG9vIGNsZXZlciBhbmQKKyAgICogd29uJ3QgY29weSBkdXJhdGlvbiB3aGVuIHNpemUgaXMgZGlmZmVyZW50ICovCisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG5ld2J1ZikgPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgcmV0dXJuIG5ld2J1ZjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfcGFkX2FkZF9hYzNfZXh0ZW5zaW9uIChHc3RRVE11eCAqIHF0bXV4LCBHc3RRVFBhZCAqIHF0cGFkLAorICAgIGd1aW50OCBmc2NvZCwgZ3VpbnQ4IGZybXNpemNvZCwgZ3VpbnQ4IGJzaWQsIGd1aW50OCBic21vZCwgZ3VpbnQ4IGFjbW9kLAorICAgIGd1aW50OCBsZmVfb24pCit7CisgIEF0b21JbmZvICpleHQ7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAocXRwYWQtPnRyYWtfc3RlKTsKKworICBleHQgPSBidWlsZF9hYzNfZXh0ZW5zaW9uIChmc2NvZCwgYnNpZCwgYnNtb2QsIGFjbW9kLCBsZmVfb24sIGZybXNpemNvZCA+PiAxKTsgICAgICAgIC8qIGJpdHJhdGVfY29kZSBpcyBpbnNpZGUgZnJtc2l6Y29kICovCisKKyAgc2FtcGxlX3RhYmxlX2VudHJ5X2FkZF9leHRfYXRvbSAocXRwYWQtPnRyYWtfc3RlLCBleHQpOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9xdF9tdXhfcHJlcGFyZV9wYXJzZV9hYzNfZnJhbWUgKEdzdFFUUGFkICogcXRwYWQsIEdzdEJ1ZmZlciAqIGJ1ZiwKKyAgICBHc3RRVE11eCAqIHF0bXV4KQoreworICBHc3RNYXBJbmZvIG1hcDsKKyAgR3N0Qnl0ZVJlYWRlciByZWFkZXI7CisgIGd1aW50IG9mZjsKKworICBpZiAoIWdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCkpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0cGFkLT5jb2xsZWN0LnBhZCwgIkZhaWxlZCB0byBtYXAgYnVmZmVyIik7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorCisgIGlmIChHX1VOTElLRUxZIChtYXAuc2l6ZSA8IDgpKQorICAgIGdvdG8gZG9uZTsKKworICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJnJlYWRlciwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgb2ZmID0gZ3N0X2J5dGVfcmVhZGVyX21hc2tlZF9zY2FuX3VpbnQzMiAoJnJlYWRlciwgMHhmZmZmMDAwMCwgMHgwYjc3MDAwMCwKKyAgICAgIDAsIG1hcC5zaXplKTsKKworICBpZiAob2ZmICE9IC0xKSB7CisgICAgR3N0Qml0UmVhZGVyIGJpdHM7CisgICAgZ3VpbnQ4IGZzY29kLCBmcm1zaXpjb2QsIGJzaWQsIGJzbW9kLCBhY21vZCwgbGZlX29uOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRwYWQtPmNvbGxlY3QucGFkLCAiRm91bmQgYWMzIHN5bmMgcG9pbnQgYXQgb2Zmc2V0OiAldSIsCisgICAgICAgIG9mZik7CisKKyAgICBnc3RfYml0X3JlYWRlcl9pbml0ICgmYml0cywgbWFwLmRhdGEsIG1hcC5zaXplKTsKKworICAgIC8qIG9mZiArIHN5bmMgKyBjcmMgKi8KKyAgICBnc3RfYml0X3JlYWRlcl9za2lwX3VuY2hlY2tlZCAoJmJpdHMsIG9mZiAqIDggKyAxNiArIDE2KTsKKworICAgIGZzY29kID0gZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmYml0cywgMik7CisgICAgZnJtc2l6Y29kID0gZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmYml0cywgNik7CisgICAgYnNpZCA9IGdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4X3VuY2hlY2tlZCAoJmJpdHMsIDUpOworICAgIGJzbW9kID0gZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDhfdW5jaGVja2VkICgmYml0cywgMyk7CisgICAgYWNtb2QgPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OF91bmNoZWNrZWQgKCZiaXRzLCAzKTsKKworICAgIGlmICgoYWNtb2QgJiAweDEpICYmIChhY21vZCAhPSAweDEpKSAgICAgICAgLyogMyBmcm9udCBjaGFubmVscyAqLworICAgICAgZ3N0X2JpdF9yZWFkZXJfc2tpcF91bmNoZWNrZWQgKCZiaXRzLCAyKTsKKyAgICBpZiAoKGFjbW9kICYgMHg0KSkgICAgICAgICAgLyogaWYgYSBzdXJyb3VuZCBjaGFubmVsIGV4aXN0cyAqLworICAgICAgZ3N0X2JpdF9yZWFkZXJfc2tpcF91bmNoZWNrZWQgKCZiaXRzLCAyKTsKKyAgICBpZiAoYWNtb2QgPT0gMHgyKSAgICAgICAgICAgLyogaWYgaW4gMi8wIG1vZGUgKi8KKyAgICAgIGdzdF9iaXRfcmVhZGVyX3NraXBfdW5jaGVja2VkICgmYml0cywgMik7CisKKyAgICBsZmVfb24gPSBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OF91bmNoZWNrZWQgKCZiaXRzLCAxKTsKKworICAgIGdzdF9xdF9tdXhfcGFkX2FkZF9hYzNfZXh0ZW5zaW9uIChxdG11eCwgcXRwYWQsIGZzY29kLCBmcm1zaXpjb2QsIGJzaWQsCisgICAgICAgIGJzbW9kLCBhY21vZCwgbGZlX29uKTsKKworICAgIC8qIEFDLTMgc3BlYyBzYXlzIHRoYXQgdGhvc2UgdmFsdWVzIHNob3VsZCBiZSBjb25zdGFudCBmb3IgdGhlCisgICAgICogd2hvbGUgc3RyZWFtIHdoZW4gbXV4ZWQgaW4gbXA0LiBXZSB0cnVzdCB0aGUgaW5wdXQgZm9sbG93cyBpdCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0cGFkLT5jb2xsZWN0LnBhZCwgIkRhdGEgcGFyc2VkLCByZW1vdmluZyAiCisgICAgICAgICJwcmVwYXJlIGJ1ZmZlciBmdW5jdGlvbiIpOworICAgIHF0cGFkLT5wcmVwYXJlX2J1Zl9mdW5jID0gTlVMTDsKKyAgfQorCitkb25lOgorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9xdF9tdXhfY3JlYXRlX2VtcHR5X3R4M2dfYnVmZmVyIChHc3RRVFBhZCAqIHF0cGFkLCBnaW50NjQgZHVyYXRpb24pCit7CisgIGd1aW50OCAqZGF0YTsKKworICBkYXRhID0gZ19tYWxsb2MgKDIpOworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhLCAwKTsKKworICByZXR1cm4gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZGF0YSwgMik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X2FkZF9tcDRfdGFnIChHc3RRVE11eCAqIHF0bXV4LCBjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwKKyAgICBBdG9tVURUQSAqIHVkdGEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdGFnMiwgZ3VpbnQzMiBmb3VyY2MpCit7CisgIHN3aXRjaCAoZ3N0X3RhZ19nZXRfdHlwZSAodGFnKSkgeworICAgICAgLyogc3RyaW5ncyAqLworICAgIGNhc2UgR19UWVBFX1NUUklORzoKKyAgICB7CisgICAgICBnY2hhciAqc3RyID0gTlVMTDsKKworICAgICAgaWYgKCFnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAobGlzdCwgdGFnLCAmc3RyKSB8fCAhc3RyKQorICAgICAgICBicmVhazsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiQWRkaW5nIHRhZyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIC0+ICVzIiwKKyAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYyksIHN0cik7CisgICAgICBhdG9tX3VkdGFfYWRkX3N0cl90YWcgKHVkdGEsIGZvdXJjYywgc3RyKTsKKyAgICAgIGdfZnJlZSAoc3RyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAgIC8qIGRvdWJsZSAqLworICAgIGNhc2UgR19UWVBFX0RPVUJMRToKKyAgICB7CisgICAgICBnZG91YmxlIHZhbHVlOworCisgICAgICBpZiAoIWdzdF90YWdfbGlzdF9nZXRfZG91YmxlIChsaXN0LCB0YWcsICZ2YWx1ZSkpCisgICAgICAgIGJyZWFrOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJBZGRpbmcgdGFnICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgLT4gJXUiLAorICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgKGdpbnQpIHZhbHVlKTsKKyAgICAgIGF0b21fdWR0YV9hZGRfdWludF90YWcgKHVkdGEsIGZvdXJjYywgMjEsIChnaW50KSB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHX1RZUEVfVUlOVDoKKyAgICB7CisgICAgICBndWludCB2YWx1ZSA9IDA7CisgICAgICBpZiAodGFnMikgeworICAgICAgICAvKiBwYWlyZWQgdW5zaWduZWQgaW50ZWdlcnMgKi8KKyAgICAgICAgZ3VpbnQgY291bnQgPSAwOworICAgICAgICBnYm9vbGVhbiBnb3RfdGFnOworCisgICAgICAgIGdvdF90YWcgPSBnc3RfdGFnX2xpc3RfZ2V0X3VpbnQgKGxpc3QsIHRhZywgJnZhbHVlKTsKKyAgICAgICAgZ290X3RhZyA9IGdzdF90YWdfbGlzdF9nZXRfdWludCAobGlzdCwgdGFnMiwgJmNvdW50KSB8fCBnb3RfdGFnOworICAgICAgICBpZiAoIWdvdF90YWcpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiQWRkaW5nIHRhZyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIC0+ICV1LyV1IiwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgdmFsdWUsIGNvdW50KTsKKyAgICAgICAgYXRvbV91ZHRhX2FkZF91aW50X3RhZyAodWR0YSwgZm91cmNjLCAwLAorICAgICAgICAgICAgdmFsdWUgPDwgMTYgfCAoY291bnQgJiAweEZGRkYpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHVucGFpcmVkIHVuc2lnbmVkIGludGVnZXJzICovCisgICAgICAgIGlmICghZ3N0X3RhZ19saXN0X2dldF91aW50IChsaXN0LCB0YWcsICZ2YWx1ZSkpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiQWRkaW5nIHRhZyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIC0+ICV1IiwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgdmFsdWUpOworICAgICAgICBhdG9tX3VkdGFfYWRkX3VpbnRfdGFnICh1ZHRhLCBmb3VyY2MsIDEsIHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9hZGRfbXA0X2RhdGUgKEdzdFFUTXV4ICogcXRtdXgsIGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LAorICAgIEF0b21VRFRBICogdWR0YSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0YWcyLCBndWludDMyIGZvdXJjYykKK3sKKyAgR0RhdGUgKmRhdGUgPSBOVUxMOworICBHRGF0ZVllYXIgeWVhcjsKKyAgR0RhdGVNb250aCBtb250aDsKKyAgR0RhdGVEYXkgZGF5OworICBnY2hhciAqc3RyOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKGdzdF90YWdfZ2V0X3R5cGUgKHRhZykgPT0gR19UWVBFX0RBVEUpOworCisgIGlmICghZ3N0X3RhZ19saXN0X2dldF9kYXRlIChsaXN0LCB0YWcsICZkYXRlKSB8fCAhZGF0ZSkKKyAgICByZXR1cm47CisKKyAgeWVhciA9IGdfZGF0ZV9nZXRfeWVhciAoZGF0ZSk7CisgIG1vbnRoID0gZ19kYXRlX2dldF9tb250aCAoZGF0ZSk7CisgIGRheSA9IGdfZGF0ZV9nZXRfZGF5IChkYXRlKTsKKworICBnX2RhdGVfZnJlZSAoZGF0ZSk7CisKKyAgaWYgKHllYXIgPT0gR19EQVRFX0JBRF9ZRUFSICYmIG1vbnRoID09IEdfREFURV9CQURfTU9OVEggJiYKKyAgICAgIGRheSA9PSBHX0RBVEVfQkFEX0RBWSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsICJpbnZhbGlkIGRhdGUgaW4gdGFnIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiJXUtJXUtJXUiLCB5ZWFyLCBtb250aCwgZGF5KTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJBZGRpbmcgdGFnICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgLT4gJXMiLAorICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpLCBzdHIpOworICBhdG9tX3VkdGFfYWRkX3N0cl90YWcgKHVkdGEsIGZvdXJjYywgc3RyKTsKKyAgZ19mcmVlIChzdHIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9hZGRfbXA0X2NvdmVyIChHc3RRVE11eCAqIHF0bXV4LCBjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwKKyAgICBBdG9tVURUQSAqIHVkdGEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdGFnMiwgZ3VpbnQzMiBmb3VyY2MpCit7CisgIEdWYWx1ZSB2YWx1ZSA9IHsgMCwgfTsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdFNhbXBsZSAqc2FtcGxlOworICBHc3RDYXBzICpjYXBzOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2ludCBmbGFncyA9IDA7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKGdzdF90YWdfZ2V0X3R5cGUgKHRhZykgPT0gR1NUX1RZUEVfU0FNUExFKTsKKworICBpZiAoIWdzdF90YWdfbGlzdF9jb3B5X3ZhbHVlICgmdmFsdWUsIGxpc3QsIHRhZykpCisgICAgcmV0dXJuOworCisgIHNhbXBsZSA9IGdzdF92YWx1ZV9nZXRfc2FtcGxlICgmdmFsdWUpOworCisgIGlmICghc2FtcGxlKQorICAgIGdvdG8gZG9uZTsKKworICBidWYgPSBnc3Rfc2FtcGxlX2dldF9idWZmZXIgKHNhbXBsZSk7CisgIGlmICghYnVmKQorICAgIGdvdG8gZG9uZTsKKworICBjYXBzID0gZ3N0X3NhbXBsZV9nZXRfY2FwcyAoc2FtcGxlKTsKKyAgaWYgKCFjYXBzKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgInByZXZpZXcgaW1hZ2Ugd2l0aG91dCBjYXBzIik7CisgICAgZ290byBkb25lOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJwcmV2aWV3IGltYWdlIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAoc3RydWN0dXJlLCAiaW1hZ2UvanBlZyIpKQorICAgIGZsYWdzID0gMTM7CisgIGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImltYWdlL3BuZyIpKQorICAgIGZsYWdzID0gMTQ7CisKKyAgaWYgKCFmbGFncykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsICJwcmV2aWV3IGltYWdlIGZvcm1hdCBub3Qgc3VwcG9ydGVkIik7CisgICAgZ290byBkb25lOworICB9CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJBZGRpbmcgdGFnICUiIEdTVF9GT1VSQ0NfRk9STUFUCisgICAgICAiIC0+IGltYWdlIHNpemUgJSIgR19HU0laRV9GT1JNQVQgIiIsIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgbWFwLnNpemUpOworICBhdG9tX3VkdGFfYWRkX3RhZyAodWR0YSwgZm91cmNjLCBmbGFncywgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKK2RvbmU6CisgIGdfdmFsdWVfdW5zZXQgKCZ2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X2FkZF8zZ3Bfc3RyIChHc3RRVE11eCAqIHF0bXV4LCBjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwKKyAgICBBdG9tVURUQSAqIHVkdGEsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdGFnMiwgZ3VpbnQzMiBmb3VyY2MpCit7CisgIGdjaGFyICpzdHIgPSBOVUxMOworICBndWludCBudW1iZXI7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoZ3N0X3RhZ19nZXRfdHlwZSAodGFnKSA9PSBHX1RZUEVfU1RSSU5HKTsKKyAgZ19yZXR1cm5faWZfZmFpbCAoIXRhZzIgfHwgZ3N0X3RhZ19nZXRfdHlwZSAodGFnMikgPT0gR19UWVBFX1VJTlQpOworCisgIGlmICghZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKGxpc3QsIHRhZywgJnN0cikgfHwgIXN0cikKKyAgICByZXR1cm47CisKKyAgaWYgKHRhZzIpCisgICAgaWYgKCFnc3RfdGFnX2xpc3RfZ2V0X3VpbnQgKGxpc3QsIHRhZzIsICZudW1iZXIpKQorICAgICAgdGFnMiA9IE5VTEw7CisKKyAgaWYgKCF0YWcyKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJBZGRpbmcgdGFnICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgLT4gJXMiLAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYyksIHN0cik7CisgICAgYXRvbV91ZHRhX2FkZF8zZ3Bfc3RyX3RhZyAodWR0YSwgZm91cmNjLCBzdHIpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiQWRkaW5nIHRhZyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIC0+ICVzLyVkIiwKKyAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpLCBzdHIsIG51bWJlcik7CisgICAgYXRvbV91ZHRhX2FkZF8zZ3Bfc3RyX2ludF90YWcgKHVkdGEsIGZvdXJjYywgc3RyLCBudW1iZXIpOworICB9CisKKyAgZ19mcmVlIChzdHIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9hZGRfM2dwX2RhdGUgKEdzdFFUTXV4ICogcXRtdXgsIGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LAorICAgIEF0b21VRFRBICogdWR0YSwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICp0YWcyLCBndWludDMyIGZvdXJjYykKK3sKKyAgR0RhdGUgKmRhdGUgPSBOVUxMOworICBHRGF0ZVllYXIgeWVhcjsKKworICBnX3JldHVybl9pZl9mYWlsIChnc3RfdGFnX2dldF90eXBlICh0YWcpID09IEdfVFlQRV9EQVRFKTsKKworICBpZiAoIWdzdF90YWdfbGlzdF9nZXRfZGF0ZSAobGlzdCwgdGFnLCAmZGF0ZSkgfHwgIWRhdGUpCisgICAgcmV0dXJuOworCisgIHllYXIgPSBnX2RhdGVfZ2V0X3llYXIgKGRhdGUpOworICBnX2RhdGVfZnJlZSAoZGF0ZSk7CisKKyAgaWYgKHllYXIgPT0gR19EQVRFX0JBRF9ZRUFSKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgImludmFsaWQgZGF0ZSBpbiB0YWciKTsKKyAgICByZXR1cm47CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIkFkZGluZyB0YWcgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiAtPiAlZCIsCisgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYyksIHllYXIpOworICBhdG9tX3VkdGFfYWRkXzNncF91aW50X3RhZyAodWR0YSwgZm91cmNjLCB5ZWFyKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfYWRkXzNncF9sb2NhdGlvbiAoR3N0UVRNdXggKiBxdG11eCwgY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgQXRvbVVEVEEgKiB1ZHRhLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnRhZzIsIGd1aW50MzIgZm91cmNjKQoreworICBnZG91YmxlIGxhdGl0dWRlID0gLTM2MCwgbG9uZ2l0dWRlID0gLTM2MCwgYWx0aXR1ZGUgPSAwOworICBnY2hhciAqbG9jYXRpb24gPSBOVUxMOworICBndWludDggKmRhdGEsICpkZGF0YTsKKyAgZ2ludCBzaXplID0gMCwgbGVuID0gMDsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoc3RyY21wICh0YWcsIEdTVF9UQUdfR0VPX0xPQ0FUSU9OX05BTUUpID09IDApOworCisgIHJldCA9IGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChsaXN0LCB0YWcsICZsb2NhdGlvbik7CisgIHJldCB8PSBnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAobGlzdCwgR1NUX1RBR19HRU9fTE9DQVRJT05fTE9OR0lUVURFLAorICAgICAgJmxvbmdpdHVkZSk7CisgIHJldCB8PSBnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAobGlzdCwgR1NUX1RBR19HRU9fTE9DQVRJT05fTEFUSVRVREUsCisgICAgICAmbGF0aXR1ZGUpOworICByZXQgfD0gZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKGxpc3QsIEdTVF9UQUdfR0VPX0xPQ0FUSU9OX0VMRVZBVElPTiwKKyAgICAgICZhbHRpdHVkZSk7CisKKyAgaWYgKCFyZXQpCisgICAgcmV0dXJuOworCisgIGlmIChsb2NhdGlvbikKKyAgICBsZW4gPSBzdHJsZW4gKGxvY2F0aW9uKTsKKyAgc2l6ZSArPSBsZW4gKyAxICsgMjsKKworICAvKiByb2xlICsgKGxvbmcsIGxhdCwgYWx0KSArIGJvZHkgKyBub3RlcyAqLworICBzaXplICs9IDEgKyAzICogNCArIDEgKyAxOworCisgIGRhdGEgPSBkZGF0YSA9IGdfbWFsbG9jIChzaXplKTsKKworICAvKiBsYW5ndWFnZSB0YWcgKi8KKyAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSwgbGFuZ3VhZ2VfY29kZSAoR1NUX1FUX01VWF9ERUZBVUxUX1RBR19MQU5HVUFHRSkpOworICAvKiBsb2NhdGlvbiAqLworICBpZiAobG9jYXRpb24pCisgICAgbWVtY3B5IChkYXRhICsgMiwgbG9jYXRpb24sIGxlbik7CisgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDIgKyBsZW4sIDApOworICBkYXRhICs9IGxlbiArIDEgKyAyOworICAvKiByb2xlICovCisgIEdTVF9XUklURV9VSU5UOCAoZGF0YSwgMCk7CisgIC8qIGxvbmcsIGxhdCwgYWx0ICovCisjZGVmaW5lIFFUX1dSSVRFX1NGUDMyKGRhdGEsIGZwKSBHU1RfV1JJVEVfVUlOVDMyX0JFKGRhdGEsIChndWludDMyKSAoKGdpbnQpIChmcCAqIDY1NTM2LjApKSkKKyAgUVRfV1JJVEVfU0ZQMzIgKGRhdGEgKyAxLCBsb25naXR1ZGUpOworICBRVF9XUklURV9TRlAzMiAoZGF0YSArIDUsIGxhdGl0dWRlKTsKKyAgUVRfV1JJVEVfU0ZQMzIgKGRhdGEgKyA5LCBhbHRpdHVkZSk7CisgIC8qIG5laXRoZXIgYXN0cm9ub21pY2FsIGJvZHkgbm9yIG5vdGVzICovCisgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEgKyAxMywgMCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJBZGRpbmcgdGFnICdsb2NpJyIpOworICBhdG9tX3VkdGFfYWRkXzNncF90YWcgKHVkdGEsIGZvdXJjYywgZGRhdGEsIHNpemUpOworICBnX2ZyZWUgKGRkYXRhKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfYWRkXzNncF9rZXl3b3JkcyAoR3N0UVRNdXggKiBxdG11eCwgY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgQXRvbVVEVEEgKiB1ZHRhLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnRhZzIsIGd1aW50MzIgZm91cmNjKQoreworICBnY2hhciAqa2V5d29yZHMgPSBOVUxMOworICBndWludDggKmRhdGEsICpkZGF0YTsKKyAgZ2ludCBzaXplID0gMCwgaTsKKyAgZ2NoYXIgKiprd2RzOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKHN0cmNtcCAodGFnLCBHU1RfVEFHX0tFWVdPUkRTKSA9PSAwKTsKKworICBpZiAoIWdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChsaXN0LCB0YWcsICZrZXl3b3JkcykgfHwgIWtleXdvcmRzKQorICAgIHJldHVybjsKKworICBrd2RzID0gZ19zdHJzcGxpdCAoa2V5d29yZHMsICIsIiwgMCk7CisgIGdfZnJlZSAoa2V5d29yZHMpOworCisgIHNpemUgPSAwOworICBmb3IgKGkgPSAwOyBrd2RzW2ldOyBpKyspIHsKKyAgICAvKiBzaXplIGJ5dGUgKyBudWxsLXRlcm1pbmF0b3IgKi8KKyAgICBzaXplICs9IHN0cmxlbiAoa3dkc1tpXSkgKyAxICsgMTsKKyAgfQorCisgIC8qIGxhbmd1YWdlIHRhZyArIGNvdW50ICsga2V5d29yZHMgKi8KKyAgc2l6ZSArPSAyICsgMTsKKworICBkYXRhID0gZGRhdGEgPSBnX21hbGxvYyAoc2l6ZSk7CisKKyAgLyogbGFuZ3VhZ2UgdGFnICovCisgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEsIGxhbmd1YWdlX2NvZGUgKEdTVF9RVF9NVVhfREVGQVVMVF9UQUdfTEFOR1VBR0UpKTsKKyAgLyogY291bnQgKi8KKyAgR1NUX1dSSVRFX1VJTlQ4IChkYXRhICsgMiwgaSk7CisgIGRhdGEgKz0gMzsKKyAgLyoga2V5d29yZHMgKi8KKyAgZm9yIChpID0gMDsga3dkc1tpXTsgKytpKSB7CisgICAgZ2ludCBsZW4gPSBzdHJsZW4gKGt3ZHNbaV0pOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJBZGRpbmcgdGFnICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgLT4gJXMiLAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYyksIGt3ZHNbaV0pOworICAgIC8qIHNpemUgKi8KKyAgICBHU1RfV1JJVEVfVUlOVDggKGRhdGEsIGxlbiArIDEpOworICAgIG1lbWNweSAoZGF0YSArIDEsIGt3ZHNbaV0sIGxlbiArIDEpOworICAgIGRhdGEgKz0gbGVuICsgMjsKKyAgfQorCisgIGdfc3RyZnJlZXYgKGt3ZHMpOworCisgIGF0b21fdWR0YV9hZGRfM2dwX3RhZyAodWR0YSwgZm91cmNjLCBkZGF0YSwgc2l6ZSk7CisgIGdfZnJlZSAoZGRhdGEpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdF9tdXhfcGFyc2VfY2xhc3NpZmljYXRpb25fc3RyaW5nIChHc3RRVE11eCAqIHF0bXV4LCBjb25zdCBnY2hhciAqIGlucHV0LAorICAgIGd1aW50MzIgKiBwX2ZvdXJjYywgZ3VpbnQxNiAqIHBfdGFibGUsIGdjaGFyICoqIHBfY29udGVudCkKK3sKKyAgZ3VpbnQzMiBmb3VyY2M7CisgIGdpbnQgdGFibGU7CisgIGdpbnQgc2l6ZTsKKyAgY29uc3QgZ2NoYXIgKmRhdGE7CisKKyAgZGF0YSA9IGlucHV0OworICBzaXplID0gc3RybGVuIChpbnB1dCk7CisKKyAgaWYgKHNpemUgPCA0ICsgMyArIDEgKyAxICsgMSkgeworICAgIC8qIGF0IGxlYXN0IHRoZSBtaW5pbXVtIHh4eHg6Ly95L3ogKi8KKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LCAiQ2xhc3NpZmljYXRpb24gdGFnIGlucHV0ICglcykgdG9vIHNob3J0LCAiCisgICAgICAgICJpZ25vcmluZyIsIGlucHV0KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiByZWFkIHRoZSBmb3VyY2MgKi8KKyAgbWVtY3B5ICgmZm91cmNjLCBkYXRhLCA0KTsKKyAgc2l6ZSAtPSA0OworICBkYXRhICs9IDQ7CisKKyAgaWYgKHN0cm5jbXAgKGRhdGEsICI6Ly8iLCAzKSAhPSAwKSB7CisgICAgZ290byBtaXNtYXRjaDsKKyAgfQorICBkYXRhICs9IDM7CisgIHNpemUgLT0gMzsKKworICAvKiByZWFkIHRoZSB0YWJsZSBudW1iZXIgKi8KKyAgaWYgKHNzY2FuZiAoZGF0YSwgIiVkIiwgJnRhYmxlKSAhPSAxKSB7CisgICAgZ290byBtaXNtYXRjaDsKKyAgfQorICBpZiAodGFibGUgPCAwKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgIkludmFsaWQgdGFibGUgbnVtYmVyIGluIGNsYXNzaWZpY2F0aW9uIHRhZyAoJWQpIgorICAgICAgICAiLCB0YWJsZSBudW1iZXJzIHNob3VsZCBiZSBwb3NpdGl2ZSwgaWdub3JpbmcgdGFnIiwgdGFibGUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIGZpbmQgdGhlIG5leHQgLyAqLworICB3aGlsZSAoc2l6ZSA+IDAgJiYgZGF0YVswXSAhPSAnLycpIHsKKyAgICBkYXRhICs9IDE7CisgICAgc2l6ZSAtPSAxOworICB9CisgIGlmIChzaXplID09IDApIHsKKyAgICBnb3RvIG1pc21hdGNoOworICB9CisgIGdfYXNzZXJ0IChkYXRhWzBdID09ICcvJyk7CisKKyAgLyogc2tpcCB0aGUgJy8nICovCisgIGRhdGEgKz0gMTsKKyAgc2l6ZSAtPSAxOworICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgZ290byBtaXNtYXRjaDsKKyAgfQorCisgIC8qIHJlYWQgdXAgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyAqLworICAqcF9jb250ZW50ID0gZ19zdHJkdXAgKGRhdGEpOworICAqcF90YWJsZSA9IChndWludDE2KSB0YWJsZTsKKyAgKnBfZm91cmNjID0gZm91cmNjOworICByZXR1cm4gVFJVRTsKKworbWlzbWF0Y2g6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LCAiSWdub3JpbmcgY2xhc3NpZmljYXRpb24gdGFnIGFzICIKKyAgICAgICAgImlucHV0ICglcykgZGlkbid0IG1hdGNoIHRoZSBleHBlY3RlZCBlbnRpdHljb2RlOi8vdGFibGUvY29udGVudCIsCisgICAgICAgIGlucHV0KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfYWRkXzNncF9jbGFzc2lmaWNhdGlvbiAoR3N0UVRNdXggKiBxdG11eCwgY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgQXRvbVVEVEEgKiB1ZHRhLCBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnRhZzIsIGd1aW50MzIgZm91cmNjKQoreworICBnY2hhciAqY2xzZl9kYXRhID0gTlVMTDsKKyAgZ2ludCBzaXplID0gMDsKKyAgZ3VpbnQzMiBlbnRpdHkgPSAwOworICBndWludDE2IHRhYmxlID0gMDsKKyAgZ2NoYXIgKmNvbnRlbnQgPSBOVUxMOworICBndWludDggKmRhdGE7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoc3RyY21wICh0YWcsIEdTVF9UQUdfM0dQX0NMQVNTSUZJQ0FUSU9OKSA9PSAwKTsKKworICBpZiAoIWdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChsaXN0LCB0YWcsICZjbHNmX2RhdGEpIHx8ICFjbHNmX2RhdGEpCisgICAgcmV0dXJuOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiQWRkaW5nIHRhZyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIC0+ICVzIiwKKyAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgY2xzZl9kYXRhKTsKKworICAvKiBwYXJzZSB0aGUgc3RyaW5nLCBmb3JtYXQgaXM6CisgICAqIGVudGl0eWZvdXJjYzovL3RhYmxlL2NvbnRlbnQKKyAgICovCisgIGdzdF9xdF9tdXhfcGFyc2VfY2xhc3NpZmljYXRpb25fc3RyaW5nIChxdG11eCwgY2xzZl9kYXRhLCAmZW50aXR5LCAmdGFibGUsCisgICAgICAmY29udGVudCk7CisgIGdfZnJlZSAoY2xzZl9kYXRhKTsKKyAgLyogKzEgZm9yIHRoZSBcMCAqLworICBzaXplID0gc3RybGVuIChjb250ZW50KSArIDE7CisKKyAgLyogbm93IHdlIGhhdmUgZXZlcnl0aGluZywgYnVpbGQgdGhlIGF0b20KKyAgICogYXRvbSBkZXNjcmlwdGlvbiBpcyBhdCAzR1BQIFRTIDI2LjI0NCBWOC4yLjAgKDIwMDktMDkpICovCisgIGRhdGEgPSBnX21hbGxvYyAoNCArIDIgKyAyICsgc2l6ZSk7CisgIEdTVF9XUklURV9VSU5UMzJfTEUgKGRhdGEsIGVudGl0eSk7CisgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEgKyA0LCAoZ3VpbnQxNikgdGFibGUpOworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhICsgNiwgMCk7CisgIG1lbWNweSAoZGF0YSArIDgsIGNvbnRlbnQsIHNpemUpOworICBnX2ZyZWUgKGNvbnRlbnQpOworCisgIGF0b21fdWR0YV9hZGRfM2dwX3RhZyAodWR0YSwgZm91cmNjLCBkYXRhLCA0ICsgMiArIDIgKyBzaXplKTsKKyAgZ19mcmVlIChkYXRhKTsKK30KKwordHlwZWRlZiB2b2lkICgqR3N0UVRNdXhBZGRVZHRhVGFnRnVuYykgKEdzdFFUTXV4ICogbXV4LAorICAgIGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LCBBdG9tVURUQSAqIHVkdGEsIGNvbnN0IGNoYXIgKnRhZywKKyAgICBjb25zdCBjaGFyICp0YWcyLCBndWludDMyIGZvdXJjYyk7CisKKy8qCisgKiBTdHJ1Y3QgdG8gcmVjb3JkIG1hcHBpbmdzIGZyb20gZ3N0cmVhbWVyIHRhZ3MgdG8gZm91cmNjIGNvZGVzCisgKi8KK3R5cGVkZWYgc3RydWN0IF9Hc3RUYWdUb0ZvdXJjYworeworICBndWludDMyIGZvdXJjYzsKKyAgY29uc3QgZ2NoYXIgKmdzdHRhZzsKKyAgY29uc3QgZ2NoYXIgKmdzdHRhZzI7CisgIGNvbnN0IEdzdFFUTXV4QWRkVWR0YVRhZ0Z1bmMgZnVuYzsKK30gR3N0VGFnVG9Gb3VyY2M7CisKKy8qIHRhZyBsaXN0IHRhZ3MgdG8gZm91cmNjIG1hdGNoaW5nICovCitzdGF0aWMgY29uc3QgR3N0VGFnVG9Gb3VyY2MgdGFnX21hdGNoZXNfbXA0W10gPSB7CisgIHtGT1VSQ0NfX2FsYiwgR1NUX1RBR19BTEJVTSwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0Nfc29hbCwgR1NUX1RBR19BTEJVTV9TT1JUTkFNRSwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0NfX0FSVCwgR1NUX1RBR19BUlRJU1QsIE5VTEwsIGdzdF9xdF9tdXhfYWRkX21wNF90YWd9LAorICB7Rk9VUkNDX3NvYXIsIEdTVF9UQUdfQVJUSVNUX1NPUlROQU1FLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ19hQVJULCBHU1RfVEFHX0FMQlVNX0FSVElTVCwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0Nfc29hYSwgR1NUX1RBR19BTEJVTV9BUlRJU1RfU09SVE5BTUUsIE5VTEwsIGdzdF9xdF9tdXhfYWRkX21wNF90YWd9LAorICB7Rk9VUkNDX19zd3IsIEdTVF9UQUdfQVBQTElDQVRJT05fTkFNRSwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0NfX2NtdCwgR1NUX1RBR19DT01NRU5ULCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ19fd3J0LCBHU1RfVEFHX0NPTVBPU0VSLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ19zb2NvLCBHU1RfVEFHX0NPTVBPU0VSX1NPUlROQU1FLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ190dnNoLCBHU1RfVEFHX1NIT1dfTkFNRSwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0Nfc29zbiwgR1NUX1RBR19TSE9XX1NPUlROQU1FLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ190dnNuLCBHU1RfVEFHX1NIT1dfU0VBU09OX05VTUJFUiwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0NfdHZlcywgR1NUX1RBR19TSE9XX0VQSVNPREVfTlVNQkVSLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ19fZ2VuLCBHU1RfVEFHX0dFTlJFLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ19fbmFtLCBHU1RfVEFHX1RJVExFLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ19zb25tLCBHU1RfVEFHX1RJVExFX1NPUlROQU1FLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ19wZXJmLCBHU1RfVEFHX1BFUkZPUk1FUiwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0NfX2dycCwgR1NUX1RBR19HUk9VUElORywgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0NfX2RlcywgR1NUX1RBR19ERVNDUklQVElPTiwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0NfX2x5ciwgR1NUX1RBR19MWVJJQ1MsIE5VTEwsIGdzdF9xdF9tdXhfYWRkX21wNF90YWd9LAorICB7Rk9VUkNDX190b28sIEdTVF9UQUdfRU5DT0RFUiwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0NfY3BydCwgR1NUX1RBR19DT1BZUklHSFQsIE5VTEwsIGdzdF9xdF9tdXhfYWRkX21wNF90YWd9LAorICB7Rk9VUkNDX2tleXcsIEdTVF9UQUdfS0VZV09SRFMsIE5VTEwsIGdzdF9xdF9tdXhfYWRkX21wNF90YWd9LAorICB7Rk9VUkNDX19kYXksIEdTVF9UQUdfREFURSwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X2RhdGV9LAorICB7Rk9VUkNDX3RtcG8sIEdTVF9UQUdfQkVBVFNfUEVSX01JTlVURSwgTlVMTCwgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0NfdHJrbiwgR1NUX1RBR19UUkFDS19OVU1CRVIsIEdTVF9UQUdfVFJBQ0tfQ09VTlQsCisgICAgICBnc3RfcXRfbXV4X2FkZF9tcDRfdGFnfSwKKyAge0ZPVVJDQ19kaXNrLCBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9OVU1CRVIsIEdTVF9UQUdfQUxCVU1fVk9MVU1FX0NPVU5ULAorICAgICAgZ3N0X3F0X211eF9hZGRfbXA0X3RhZ30sCisgIHtGT1VSQ0NfY292ciwgR1NUX1RBR19QUkVWSUVXX0lNQUdFLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF9tcDRfY292ZXJ9LAorICB7Rk9VUkNDX2NvdnIsIEdTVF9UQUdfSU1BR0UsIE5VTEwsIGdzdF9xdF9tdXhfYWRkX21wNF9jb3Zlcn0sCisgIHswLCBOVUxMLH0KK307CisKK3N0YXRpYyBjb25zdCBHc3RUYWdUb0ZvdXJjYyB0YWdfbWF0Y2hlc18zZ3BbXSA9IHsKKyAge0ZPVVJDQ190aXRsLCBHU1RfVEFHX1RJVExFLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF8zZ3Bfc3RyfSwKKyAge0ZPVVJDQ19kc2NwLCBHU1RfVEFHX0RFU0NSSVBUSU9OLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF8zZ3Bfc3RyfSwKKyAge0ZPVVJDQ19jcHJ0LCBHU1RfVEFHX0NPUFlSSUdIVCwgTlVMTCwgZ3N0X3F0X211eF9hZGRfM2dwX3N0cn0sCisgIHtGT1VSQ0NfcGVyZiwgR1NUX1RBR19BUlRJU1QsIE5VTEwsIGdzdF9xdF9tdXhfYWRkXzNncF9zdHJ9LAorICB7Rk9VUkNDX2F1dGgsIEdTVF9UQUdfQ09NUE9TRVIsIE5VTEwsIGdzdF9xdF9tdXhfYWRkXzNncF9zdHJ9LAorICB7Rk9VUkNDX2ducmUsIEdTVF9UQUdfR0VOUkUsIE5VTEwsIGdzdF9xdF9tdXhfYWRkXzNncF9zdHJ9LAorICB7Rk9VUkNDX2t5d2QsIEdTVF9UQUdfS0VZV09SRFMsIE5VTEwsIGdzdF9xdF9tdXhfYWRkXzNncF9rZXl3b3Jkc30sCisgIHtGT1VSQ0NfeXJyYywgR1NUX1RBR19EQVRFLCBOVUxMLCBnc3RfcXRfbXV4X2FkZF8zZ3BfZGF0ZX0sCisgIHtGT1VSQ0NfYWxibSwgR1NUX1RBR19BTEJVTSwgR1NUX1RBR19UUkFDS19OVU1CRVIsIGdzdF9xdF9tdXhfYWRkXzNncF9zdHJ9LAorICB7Rk9VUkNDX2xvY2ksIEdTVF9UQUdfR0VPX0xPQ0FUSU9OX05BTUUsIE5VTEwsIGdzdF9xdF9tdXhfYWRkXzNncF9sb2NhdGlvbn0sCisgIHtGT1VSQ0NfY2xzZiwgR1NUX1RBR18zR1BfQ0xBU1NJRklDQVRJT04sIE5VTEwsCisgICAgICBnc3RfcXRfbXV4X2FkZF8zZ3BfY2xhc3NpZmljYXRpb259LAorICB7MCwgTlVMTCx9Cit9OworCisvKiBxdGRlbXV4IHByb2R1Y2VzIHRoZXNlIGZvciBhdG9tcyBpdCBjYW5ub3QgcGFyc2UgKi8KKyNkZWZpbmUgR1NUX1FUX0RFTVVYX1BSSVZBVEVfVEFHICJwcml2YXRlLXF0LXRhZyIKKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfYWRkX3htcF90YWdzIChHc3RRVE11eCAqIHF0bXV4LCBjb25zdCBHc3RUYWdMaXN0ICogbGlzdCkKK3sKKyAgR3N0UVRNdXhDbGFzcyAqcXRtdXhfa2xhc3MgPSAoR3N0UVRNdXhDbGFzcyAqKSAoR19PQkpFQ1RfR0VUX0NMQVNTIChxdG11eCkpOworICBHc3RCdWZmZXIgKnhtcCA9IE5VTEw7CisKKyAgLyogYWRvYmUgc3BlY3Mgb25seSBoYXZlICdxdWlja3RpbWUnIGFuZCAnbXA0JywKKyAgICogYnV0IEkgZ3Vlc3Mgd2UgY2FuIGV4dHJhcG9sYXRlIHRvIGdwcC4KKyAgICogS2VlcCBtajIgb3V0IGZvciBub3cgYXMgd2UgZG9uJ3QgYWRkIGFueSB0YWdzIGZvciBpdCB5ZXQuCisgICAqIElmIHlvdSBoYXZlIGZ1cnRoZXIgaW5mbyBhYm91dCB4bXAgb24gdGhlc2UgZm9ybWF0cywgcGxlYXNlIHNoYXJlICovCisgIGlmIChxdG11eF9rbGFzcy0+Zm9ybWF0ID09IEdTVF9RVF9NVVhfRk9STUFUX01KMikKKyAgICByZXR1cm47CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJBZGRpbmcgeG1wIHRhZ3MiKTsKKworICBpZiAocXRtdXhfa2xhc3MtPmZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9RVCkgeworICAgIHhtcCA9IGdzdF90YWdfeG1wX3dyaXRlcl90YWdfbGlzdF90b194bXBfYnVmZmVyIChHU1RfVEFHX1hNUF9XUklURVIgKHF0bXV4KSwKKyAgICAgICAgbGlzdCwgVFJVRSk7CisgICAgaWYgKHhtcCkKKyAgICAgIGF0b21fdWR0YV9hZGRfeG1wX3RhZ3MgKCZxdG11eC0+bW9vdi0+dWR0YSwgeG1wKTsKKyAgfSBlbHNlIHsKKyAgICBBdG9tSW5mbyAqYWluZm87CisgICAgLyogZm9yIGlzb20vbXA0LCBpdCBpcyBhIHRvcCBsZXZlbCB1dWlkIGF0b20gKi8KKyAgICB4bXAgPSBnc3RfdGFnX3htcF93cml0ZXJfdGFnX2xpc3RfdG9feG1wX2J1ZmZlciAoR1NUX1RBR19YTVBfV1JJVEVSIChxdG11eCksCisgICAgICAgIGxpc3QsIFRSVUUpOworICAgIGlmICh4bXApIHsKKyAgICAgIGFpbmZvID0gYnVpbGRfdXVpZF94bXBfYXRvbSAoeG1wKTsKKyAgICAgIGlmIChhaW5mbykgeworICAgICAgICBxdG11eC0+ZXh0cmFfYXRvbXMgPSBnX3NsaXN0X3ByZXBlbmQgKHF0bXV4LT5leHRyYV9hdG9tcywgYWluZm8pOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoeG1wKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKHhtcCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X2FkZF9tZXRhZGF0YV90YWdzIChHc3RRVE11eCAqIHF0bXV4LCBjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwKKyAgICBBdG9tVURUQSAqIHVkdGEpCit7CisgIEdzdFFUTXV4Q2xhc3MgKnF0bXV4X2tsYXNzID0gKEdzdFFUTXV4Q2xhc3MgKikgKEdfT0JKRUNUX0dFVF9DTEFTUyAocXRtdXgpKTsKKyAgZ3VpbnQzMiBmb3VyY2M7CisgIGdpbnQgaTsKKyAgY29uc3QgZ2NoYXIgKnRhZywgKnRhZzI7CisgIGNvbnN0IEdzdFRhZ1RvRm91cmNjICp0YWdfbWF0Y2hlczsKKworICBzd2l0Y2ggKHF0bXV4X2tsYXNzLT5mb3JtYXQpIHsKKyAgICBjYXNlIEdTVF9RVF9NVVhfRk9STUFUXzNHUDoKKyAgICAgIHRhZ19tYXRjaGVzID0gdGFnX21hdGNoZXNfM2dwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUVRfTVVYX0ZPUk1BVF9NSjI6CisgICAgICB0YWdfbWF0Y2hlcyA9IE5VTEw7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogc29ydCBvZiBpVHVuZXMgc3R5bGUgZm9yIG1wNCBhbmQgUVQgKD8pICovCisgICAgICB0YWdfbWF0Y2hlcyA9IHRhZ19tYXRjaGVzX21wNDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKCF0YWdfbWF0Y2hlcykKKyAgICByZXR1cm47CisKKyAgLyogQ2xlYXIgZXhpc3RpbmcgdGFncyBzbyB3ZSBkb24ndCBhZGQgdGhlbSBvdmVyIGFuZCBvdmVyICovCisgIGF0b21fdWR0YV9jbGVhcl90YWdzICh1ZHRhKTsKKworICBmb3IgKGkgPSAwOyB0YWdfbWF0Y2hlc1tpXS5mb3VyY2M7IGkrKykgeworICAgIGZvdXJjYyA9IHRhZ19tYXRjaGVzW2ldLmZvdXJjYzsKKyAgICB0YWcgPSB0YWdfbWF0Y2hlc1tpXS5nc3R0YWc7CisgICAgdGFnMiA9IHRhZ19tYXRjaGVzW2ldLmdzdHRhZzI7CisKKyAgICBnX2Fzc2VydCAodGFnX21hdGNoZXNbaV0uZnVuYyk7CisgICAgdGFnX21hdGNoZXNbaV0uZnVuYyAocXRtdXgsIGxpc3QsIHVkdGEsIHRhZywgdGFnMiwgZm91cmNjKTsKKyAgfQorCisgIC8qIGFkZCB1bnBhcnNlZCBibG9icyBpZiBwcmVzZW50ICovCisgIGlmIChnc3RfdGFnX2V4aXN0cyAoR1NUX1FUX0RFTVVYX1BSSVZBVEVfVEFHKSkgeworICAgIGd1aW50IG51bV90YWdzOworCisgICAgbnVtX3RhZ3MgPSBnc3RfdGFnX2xpc3RfZ2V0X3RhZ19zaXplIChsaXN0LCBHU1RfUVRfREVNVVhfUFJJVkFURV9UQUcpOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdGFnczsgKytpKSB7CisgICAgICBHc3RTYW1wbGUgKnNhbXBsZSA9IE5VTEw7CisgICAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqczsKKworICAgICAgaWYgKCFnc3RfdGFnX2xpc3RfZ2V0X3NhbXBsZV9pbmRleCAobGlzdCwgR1NUX1FUX0RFTVVYX1BSSVZBVEVfVEFHLCBpLAorICAgICAgICAgICAgICAmc2FtcGxlKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBidWYgPSBnc3Rfc2FtcGxlX2dldF9idWZmZXIgKHNhbXBsZSk7CisKKyAgICAgIGlmIChidWYgJiYgKHMgPSBnc3Rfc2FtcGxlX2dldF9pbmZvIChzYW1wbGUpKSkgeworICAgICAgICBjb25zdCBnY2hhciAqc3R5bGUgPSBOVUxMOworICAgICAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwKKyAgICAgICAgICAgICJGb3VuZCBwcml2YXRlIHRhZyAlZC8lZDsgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCAiLCBpbmZvICUiCisgICAgICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgaSwgbnVtX3RhZ3MsIG1hcC5zaXplLCBzKTsKKyAgICAgICAgaWYgKHMgJiYgKHN0eWxlID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAic3R5bGUiKSkpIHsKKyAgICAgICAgICAvKiB0cnkgdG8gcHJldmVudCBzb21lIHN0eWxlIHRhZyBlbmRpbmcgdXAgaW50byBhbm90aGVyIHZhcmlhbnQKKyAgICAgICAgICAgKiAodG9kbzogbWFrZSBpbnRvIGEgbGlzdCBpZiBtb3JlIGNhc2VzKSAqLworICAgICAgICAgIGlmICgoc3RyY21wIChzdHlsZSwgIml0dW5lcyIpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgIHF0bXV4X2tsYXNzLT5mb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfTVA0KSB8fAorICAgICAgICAgICAgICAoc3RyY21wIChzdHlsZSwgImlzbyIpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgIHF0bXV4X2tsYXNzLT5mb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfM0dQKSkgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJBZGRpbmcgcHJpdmF0ZSB0YWciKTsKKyAgICAgICAgICAgIGF0b21fdWR0YV9hZGRfYmxvYl90YWcgKHVkdGEsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgICB9CisgICAgICBnc3Rfc2FtcGxlX3VucmVmIChzYW1wbGUpOworICAgIH0KKyAgfQorCisgIHJldHVybjsKK30KKworLyoKKyAqIEdldHMgdGhlIHRhZ3NldHRlciBpZmFjZSB0YWdsaXN0IGFuZCBwdXRzIHRoZSBrbm93biB0YWdzCisgKiBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X3NldHVwX21ldGFkYXRhIChHc3RRVE11eCAqIHF0bXV4KQoreworICBjb25zdCBHc3RUYWdMaXN0ICp0YWdzID0gTlVMTDsKKyAgR1NMaXN0ICp3YWxrOworCisgIEdTVF9PQkpFQ1RfTE9DSyAocXRtdXgpOworICBpZiAocXRtdXgtPnRhZ3NfY2hhbmdlZCkgeworICAgIHRhZ3MgPSBnc3RfdGFnX3NldHRlcl9nZXRfdGFnX2xpc3QgKEdTVF9UQUdfU0VUVEVSIChxdG11eCkpOworICAgIHF0bXV4LT50YWdzX2NoYW5nZWQgPSBGQUxTRTsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAocXRtdXgpOworCisgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgInRhZ3M6ICUiIEdTVF9QVFJfRk9STUFULCB0YWdzKTsKKworICBpZiAodGFncyAmJiAhZ3N0X3RhZ19saXN0X2lzX2VtcHR5ICh0YWdzKSkgeworICAgIEdzdFRhZ0xpc3QgKmNvcHkgPSBnc3RfdGFnX2xpc3RfY29weSAodGFncyk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIlJlbW92aW5nIGJvZ3VzIHRhZ3MiKTsKKyAgICBnc3RfdGFnX2xpc3RfcmVtb3ZlX3RhZyAoY29weSwgR1NUX1RBR19WSURFT19DT0RFQyk7CisgICAgZ3N0X3RhZ19saXN0X3JlbW92ZV90YWcgKGNvcHksIEdTVF9UQUdfQVVESU9fQ09ERUMpOworICAgIGdzdF90YWdfbGlzdF9yZW1vdmVfdGFnIChjb3B5LCBHU1RfVEFHX0NPTlRBSU5FUl9GT1JNQVQpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJGb3JtYXR0aW5nIHRhZ3MiKTsKKyAgICBnc3RfcXRfbXV4X2FkZF9tZXRhZGF0YV90YWdzIChxdG11eCwgY29weSwgJnF0bXV4LT5tb292LT51ZHRhKTsKKyAgICBnc3RfcXRfbXV4X2FkZF94bXBfdGFncyAocXRtdXgsIGNvcHkpOworICAgIGdzdF90YWdfbGlzdF91bnJlZiAoY29weSk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJObyBuZXcgdGFncyByZWNlaXZlZCIpOworICB9CisKKyAgZm9yICh3YWxrID0gcXRtdXgtPnNpbmtwYWRzOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdENvbGxlY3REYXRhICpjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSB3YWxrLT5kYXRhOworICAgIEdzdFFUUGFkICpxcGFkID0gKEdzdFFUUGFkICopIGNkYXRhOworICAgIEdzdFBhZCAqcGFkID0gcXBhZC0+Y29sbGVjdC5wYWQ7CisKKyAgICBpZiAocXBhZC0+dGFnc19jaGFuZ2VkICYmIHFwYWQtPnRhZ3MpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIkFkZGluZyB0YWdzIik7CisgICAgICBnc3RfdGFnX2xpc3RfcmVtb3ZlX3RhZyAocXBhZC0+dGFncywgR1NUX1RBR19DT05UQUlORVJfRk9STUFUKTsKKyAgICAgIGdzdF9xdF9tdXhfYWRkX21ldGFkYXRhX3RhZ3MgKHF0bXV4LCBxcGFkLT50YWdzLCAmcXBhZC0+dHJhay0+dWR0YSk7CisgICAgICBxcGFkLT50YWdzX2NoYW5nZWQgPSBGQUxTRTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIlRhZ3MgYWRkZWQiKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiTm8gbmV3IHRhZ3MgcmVjZWl2ZWQiKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGlubGluZSBHc3RCdWZmZXIgKgorX2dzdF9idWZmZXJfbmV3X3Rha2VfZGF0YSAoZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSkKK3sKKyAgR3N0QnVmZmVyICpidWY7CisKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAoYnVmLAorICAgICAgZ3N0X21lbW9yeV9uZXdfd3JhcHBlZCAoMCwgZGF0YSwgc2l6ZSwgMCwgc2l6ZSwgZGF0YSwgZ19mcmVlKSk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfc2VuZF9idWZmZXIgKEdzdFFUTXV4ICogcXRtdXgsIEdzdEJ1ZmZlciAqIGJ1ZiwgZ3VpbnQ2NCAqIG9mZnNldCwKKyAgICBnYm9vbGVhbiBtaW5kX2Zhc3QpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzOworICBnc2l6ZSBzaXplOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChidWYgIT0gTlVMTCwgR1NUX0ZMT1dfRVJST1IpOworCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworICBHU1RfTE9HX09CSkVDVCAocXRtdXgsICJzZW5kaW5nIGJ1ZmZlciBzaXplICUiIEdfR1NJWkVfRk9STUFULCBzaXplKTsKKworICBpZiAobWluZF9mYXN0ICYmIHF0bXV4LT5mYXN0X3N0YXJ0X2ZpbGUpIHsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBnaW50IHJldDsKKworICAgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgInRvIHRlbXBvcmFyeSBmaWxlIik7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICByZXQgPSBmd3JpdGUgKG1hcC5kYXRhLCBzaXplb2YgKGd1aW50OCksIG1hcC5zaXplLCBxdG11eC0+ZmFzdF9zdGFydF9maWxlKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgaWYgKHJldCAhPSBzaXplKQorICAgICAgZ290byB3cml0ZV9lcnJvcjsKKyAgICBlbHNlCisgICAgICByZXMgPSBHU1RfRkxPV19PSzsKKyAgfSBlbHNlIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRtdXgsICJkb3duc3RyZWFtIik7CisgICAgcmVzID0gZ3N0X3BhZF9wdXNoIChxdG11eC0+c3JjcGFkLCBidWYpOworICB9CisKKyAgaWYgKEdfTElLRUxZIChvZmZzZXQpKQorICAgICpvZmZzZXQgKz0gc2l6ZTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLword3JpdGVfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtdXgsIFJFU09VUkNFLCBXUklURSwKKyAgICAgICAgKCJGYWlsZWQgdG8gd3JpdGUgdG8gdGVtcG9yYXJ5IGZpbGUiKSwgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3F0X211eF9zZWVrX3RvX2JlZ2lubmluZyAoRklMRSAqIGYpCit7CisjaWZkZWYgSEFWRV9GU0VFS08KKyAgaWYgKGZzZWVrbyAoZiwgKG9mZl90KSAwLCBTRUVLX1NFVCkgIT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisjZWxpZiBkZWZpbmVkIChHX09TX1VOSVgpIHx8IGRlZmluZWQgKEdfT1NfV0lOMzIpCisgIGlmIChsc2VlayAoZmlsZW5vIChmKSwgKG9mZl90KSAwLCBTRUVLX1NFVCkgPT0gKG9mZl90KSAtIDEpCisgICAgcmV0dXJuIEZBTFNFOworI2Vsc2UKKyAgaWYgKGZzZWVrIChmLCAobG9uZykgMCwgU0VFS19TRVQpICE9IDApCisgICAgcmV0dXJuIEZBTFNFOworI2VuZGlmCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0X211eF9zZW5kX2J1ZmZlcmVkX2RhdGEgKEdzdFFUTXV4ICogcXRtdXgsIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKworICBpZiAoZmZsdXNoIChxdG11eC0+ZmFzdF9zdGFydF9maWxlKSkKKyAgICBnb3RvIGZsdXNoX2ZhaWxlZDsKKworICBpZiAoIWdzdF9xdF9tdXhfc2Vla190b19iZWdpbm5pbmcgKHF0bXV4LT5mYXN0X3N0YXJ0X2ZpbGUpKQorICAgIGdvdG8gc2Vla19mYWlsZWQ7CisKKyAgLyogaG0sIHRoaXMgY291bGQgYWxsIHRha2UgYSByZWFsbHkgcmVhbGx5IGxvbmcgdGltZSwKKyAgICogYnV0IHRoZXJlIG1heSBub3QgYmUgYW5vdGhlciB3YXkgdG8gZ2V0IG1vb3YgYXRvbSBmaXJzdAorICAgKiAoc29tZWhvdyBvcHRpbWl6ZSBjb3B5PykgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJTZW5kaW5nIGJ1ZmZlcmVkIGRhdGEiKTsKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSykgeworICAgIGNvbnN0IGludCBidWZzaXplID0gNDA5NjsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBnc2l6ZSBzaXplOworCisgICAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChidWZzaXplKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBzaXplID0gZnJlYWQgKG1hcC5kYXRhLCBzaXplb2YgKGd1aW50OCksIGJ1ZnNpemUsIHF0bXV4LT5mYXN0X3N0YXJ0X2ZpbGUpOworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgR1NUX0xPR19PQkpFQ1QgKHF0bXV4LCAiUHVzaGluZyBidWZmZXJlZCBidWZmZXIgb2Ygc2l6ZSAlZCIsIChnaW50KSBzaXplKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGlmIChzaXplICE9IGJ1ZnNpemUpCisgICAgICBnc3RfYnVmZmVyX3NldF9zaXplIChidWYsIHNpemUpOworICAgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9idWZmZXIgKHF0bXV4LCBidWYsIG9mZnNldCwgRkFMU0UpOworICAgIGJ1ZiA9IE5VTEw7CisgIH0KKyAgaWYgKGJ1ZikKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIGlmIChmdHJ1bmNhdGUgKGZpbGVubyAocXRtdXgtPmZhc3Rfc3RhcnRfZmlsZSksIDApKQorICAgIGdvdG8gc2Vla19mYWlsZWQ7CisgIGlmICghZ3N0X3F0X211eF9zZWVrX3RvX2JlZ2lubmluZyAocXRtdXgtPmZhc3Rfc3RhcnRfZmlsZSkpCisgICAgZ290byBzZWVrX2ZhaWxlZDsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworZmx1c2hfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXV4LCBSRVNPVVJDRSwgV1JJVEUsCisgICAgICAgICgiRmFpbGVkIHRvIGZsdXNoIHRlbXBvcmFyeSBmaWxlIiksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZmFpbDsKKyAgfQorc2Vla19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtdXgsIFJFU09VUkNFLCBTRUVLLAorICAgICAgICAoIkZhaWxlZCB0byBzZWVrIHRlbXBvcmFyeSBmaWxlIiksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZmFpbDsKKyAgfQorZmFpbDoKKyAgeworICAgIC8qIGNsZWFyIGRlc2NyaXB0b3Igc28gd2UgZG9uJ3QgcmVtb3ZlIHRlbXAgZmlsZSBsYXRlciBvbiwKKyAgICAgKiBtaWdodCBiZSBwb3NzaWJsZSB0byByZWNvdmVyICovCisgICAgZmNsb3NlIChxdG11eC0+ZmFzdF9zdGFydF9maWxlKTsKKyAgICBxdG11eC0+ZmFzdF9zdGFydF9maWxlID0gTlVMTDsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKKy8qCisgKiBTZW5kcyB0aGUgaW5pdGlhbCBtZGF0IGF0b20gZmllbGRzIChzaXplIGZpZWxkcyBhbmQgZm91cmNjIHR5cGUpLAorICogdGhlIHN1YnNlcXVlbnQgYnVmZmVycyBhcmUgY29uc2lkZXJlZCBwYXJ0IG9mIGl0J3MgZGF0YS4KKyAqIEFzIHdlIGNhbid0IHByZWRpY3QgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHBsYWNlIGluIG1kYXQKKyAqIHdlIG5lZWQgdG8gcmVjb3JkIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2l6ZSBmaWVsZCBpbiB0aGUgc3RyZWFtIHNvIHdlIGNhbgorICogc2VlayBiYWNrIHRvIGl0IGxhdGVyIGFuZCB1cGRhdGUgd2hlbiB0aGUgc3RyZWFtcyBoYXZlIGZpbmlzaGVkLgorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0X211eF9zZW5kX21kYXRfaGVhZGVyIChHc3RRVE11eCAqIHF0bXV4LCBndWludDY0ICogb2ZmLCBndWludDY0IHNpemUsCisgICAgZ2Jvb2xlYW4gZXh0ZW5kZWQsIGdib29sZWFuIGZzeW5jX2FmdGVyKQoreworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJTZW5kaW5nIG1kYXQncyBhdG9tIGhlYWRlciwgIgorICAgICAgInNpemUgJSIgR19HVUlOVDY0X0ZPUk1BVCwgc2l6ZSk7CisKKyAgLyogaWYgdGhlIHF0bXV4IHN0YXRlIGlzIEVPUywgcmVhbGx5IHdyaXRlIHRoZSBtZGF0LCBvdGhlcndpc2UKKyAgICogYWxsb3cgc2l6ZSA9PSAwIGZvciBhIHBsYWNlaG9sZGVyIGF0b20gKi8KKyAgaWYgKHF0bXV4LT5zdGF0ZSA9PSBHU1RfUVRfTVVYX1NUQVRFX0VPUyB8fCBzaXplID4gMCkKKyAgICBzaXplICs9IDg7CisKKyAgaWYgKGV4dGVuZGVkKSB7CisgICAgZ2Jvb2xlYW4gbGFyZ2VfZmlsZSA9IChzaXplID4gTURBVF9MQVJHRV9GSUxFX0xJTUlUKTsKKyAgICAvKiBBbHdheXMgd3JpdGUgMTYtYnl0ZXMsIGJ1dCBwdXQgYSBmcmVlIGF0b20gZmlyc3QKKyAgICAgKiBpZiB0aGUgc2l6ZSBpcyA8IDRHQi4gKi8KKyAgICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDE2KTsKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKworICAgIGlmIChsYXJnZV9maWxlKSB7CisgICAgICAvKiBXcml0ZSBleHRlbmRlZCBtZGF0IGhlYWRlciBhbmQgbGFyZ2Vfc2l6ZSBmaWVsZCAqLworICAgICAgR1NUX1dSSVRFX1VJTlQzMl9CRSAobWFwLmRhdGEsIDEpOworICAgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAobWFwLmRhdGEgKyA0LCBGT1VSQ0NfbWRhdCk7CisgICAgICBHU1RfV1JJVEVfVUlOVDY0X0JFIChtYXAuZGF0YSArIDgsIHNpemUgKyA4KTsKKyAgICB9IGVsc2UgeworICAgICAgLyogV3JpdGUgYW4gZW1wdHkgZnJlZSBhdG9tLCB0aGVuIHN0YW5kYXJkIDMyLWJpdCBtZGF0ICovCisgICAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChtYXAuZGF0YSwgOCk7CisgICAgICBHU1RfV1JJVEVfVUlOVDMyX0xFIChtYXAuZGF0YSArIDQsIEZPVVJDQ19mcmVlKTsKKyAgICAgIEdTVF9XUklURV9VSU5UMzJfQkUgKG1hcC5kYXRhICsgOCwgc2l6ZSk7CisgICAgICBHU1RfV1JJVEVfVUlOVDMyX0xFIChtYXAuZGF0YSArIDEyLCBGT1VSQ0NfbWRhdCk7CisgICAgfQorICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIH0gZWxzZSB7CisgICAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg4KTsKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKworICAgIC8qIFZhbmlsbGEgMzItYml0IG1kYXQgKi8KKyAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChtYXAuZGF0YSwgc2l6ZSk7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAobWFwLmRhdGEgKyA0LCBGT1VSQ0NfbWRhdCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgIlB1c2hpbmcgbWRhdCBoZWFkZXIiKTsKKyAgaWYgKGZzeW5jX2FmdGVyKQorICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1NZTkNfQUZURVIpOworCisgIHJldHVybiBnc3RfcXRfbXV4X3NlbmRfYnVmZmVyIChxdG11eCwgYnVmLCBvZmYsIEZBTFNFKTsKKworfQorCisvKgorICogV2UgZ2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbWRhdCBzaXplIGZpZWxkLCBzZWVrIGJhY2sgdG8gaXQKKyAqIGFuZCBvdmVyd3JpdGUgd2l0aCB0aGUgcmVhbCB2YWx1ZQorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0X211eF91cGRhdGVfbWRhdF9zaXplIChHc3RRVE11eCAqIHF0bXV4LCBndWludDY0IG1kYXRfcG9zLAorICAgIGd1aW50NjQgbWRhdF9zaXplLCBndWludDY0ICogb2Zmc2V0LCBnYm9vbGVhbiBmc3luY19hZnRlcikKK3sKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIC8qIFdlIG11c3QgaGF2ZSByZWNvcmRlZCB0aGUgbWRhdCBwb3NpdGlvbiBmb3IgdGhpcyB0byB3b3JrICovCisgIGdfYXNzZXJ0IChtZGF0X3BvcyAhPSAwKTsKKworICAvKiBzZWVrIGFuZCByZXdyaXRlIHRoZSBoZWFkZXIgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfQllURVMpOworICBzZWdtZW50LnN0YXJ0ID0gbWRhdF9wb3M7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAocXRtdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIHJldHVybiBnc3RfcXRfbXV4X3NlbmRfbWRhdF9oZWFkZXIgKHF0bXV4LCBvZmZzZXQsIG1kYXRfc2l6ZSwgVFJVRSwKKyAgICAgIGZzeW5jX2FmdGVyKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfc2VuZF9mdHlwIChHc3RRVE11eCAqIHF0bXV4LCBndWludDY0ICogb2ZmKQoreworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgZ3VpbnQ2NCBzaXplID0gMCwgb2Zmc2V0ID0gMDsKKyAgZ3VpbnQ4ICpkYXRhID0gTlVMTDsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIlNlbmRpbmcgZnR5cCBhdG9tIik7CisKKyAgaWYgKCFhdG9tX2Z0eXBfY29weV9kYXRhIChxdG11eC0+ZnR5cCwgJmRhdGEsICZzaXplLCAmb2Zmc2V0KSkKKyAgICBnb3RvIHNlcmlhbGl6ZV9lcnJvcjsKKworICBidWYgPSBfZ3N0X2J1ZmZlcl9uZXdfdGFrZV9kYXRhIChkYXRhLCBvZmZzZXQpOworCisgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgIlB1c2hpbmcgZnR5cCIpOworICByZXR1cm4gZ3N0X3F0X211eF9zZW5kX2J1ZmZlciAocXRtdXgsIGJ1Ziwgb2ZmLCBGQUxTRSk7CisKKyAgLyogRVJST1JTICovCitzZXJpYWxpemVfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksCisgICAgICAgICgiRmFpbGVkIHRvIHNlcmlhbGl6ZSBmdHlwIikpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9wcmVwYXJlX2Z0eXAgKEdzdFFUTXV4ICogcXRtdXgsIEF0b21GVFlQICoqIHBfZnR5cCwKKyAgICBHc3RCdWZmZXIgKiogcF9wcmVmaXgpCit7CisgIEdzdFFUTXV4Q2xhc3MgKnF0bXV4X2tsYXNzID0gKEdzdFFUTXV4Q2xhc3MgKikgKEdfT0JKRUNUX0dFVF9DTEFTUyAocXRtdXgpKTsKKyAgZ3VpbnQzMiBtYWpvciwgdmVyc2lvbjsKKyAgR0xpc3QgKmNvbXA7CisgIEdzdEJ1ZmZlciAqcHJlZml4ID0gTlVMTDsKKyAgQXRvbUZUWVAgKmZ0eXAgPSBOVUxMOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiUHJlcGFyaW5nIGZ0eXAgYW5kIHBvc3NpYmxlIHByZWZpeCBhdG9tIik7CisKKyAgLyogaW5pdCBhbmQgc2VuZCBjb250ZXh0IGFuZCBmdHlwIGJhc2VkIG9uIGN1cnJlbnQgcHJvcGVydHkgc3RhdGUgKi8KKyAgZ3N0X3F0X211eF9tYXBfZm9ybWF0X3RvX2hlYWRlciAocXRtdXhfa2xhc3MtPmZvcm1hdCwgJnByZWZpeCwgJm1ham9yLAorICAgICAgJnZlcnNpb24sICZjb21wLCBxdG11eC0+bW9vdiwgcXRtdXgtPmxvbmdlc3RfY2h1bmssCisgICAgICBxdG11eC0+ZmFzdF9zdGFydF9maWxlICE9IE5VTEwpOworICBmdHlwID0gYXRvbV9mdHlwX25ldyAocXRtdXgtPmNvbnRleHQsIG1ham9yLCB2ZXJzaW9uLCBjb21wKTsKKyAgaWYgKGNvbXApCisgICAgZ19saXN0X2ZyZWUgKGNvbXApOworICBpZiAocHJlZml4KSB7CisgICAgaWYgKHBfcHJlZml4KQorICAgICAgKnBfcHJlZml4ID0gcHJlZml4OworICAgIGVsc2UKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHByZWZpeCk7CisgIH0KKyAgKnBfZnR5cCA9IGZ0eXA7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcXRfbXV4X3ByZXBhcmVfYW5kX3NlbmRfZnR5cCAoR3N0UVRNdXggKiBxdG11eCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0QnVmZmVyICpwcmVmaXggPSBOVUxMOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiUHJlcGFyaW5nIHRvIHNlbmQgZnR5cCBhdG9tIik7CisKKyAgLyogaW5pdCBhbmQgc2VuZCBjb250ZXh0IGFuZCBmdHlwIGJhc2VkIG9uIGN1cnJlbnQgcHJvcGVydHkgc3RhdGUgKi8KKyAgaWYgKHF0bXV4LT5mdHlwKSB7CisgICAgYXRvbV9mdHlwX2ZyZWUgKHF0bXV4LT5mdHlwKTsKKyAgICBxdG11eC0+ZnR5cCA9IE5VTEw7CisgIH0KKyAgZ3N0X3F0X211eF9wcmVwYXJlX2Z0eXAgKHF0bXV4LCAmcXRtdXgtPmZ0eXAsICZwcmVmaXgpOworICBpZiAocHJlZml4KSB7CisgICAgcmV0ID0gZ3N0X3F0X211eF9zZW5kX2J1ZmZlciAocXRtdXgsIHByZWZpeCwgJnF0bXV4LT5oZWFkZXJfc2l6ZSwgRkFMU0UpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICByZXR1cm4gcmV0OworICB9CisgIHJldHVybiBnc3RfcXRfbXV4X3NlbmRfZnR5cCAocXRtdXgsICZxdG11eC0+aGVhZGVyX3NpemUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9zZXRfaGVhZGVyX29uX2NhcHMgKEdzdFFUTXV4ICogbXV4LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBHVmFsdWUgYXJyYXkgPSB7IDAgfTsKKyAgR1ZhbHVlIHZhbHVlID0geyAwIH07CisgIEdzdENhcHMgKmNhcHMsICp0Y2FwczsKKworICB0Y2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAobXV4LT5zcmNwYWQpOworICBjYXBzID0gZ3N0X2NhcHNfY29weSAodGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAodGNhcHMpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGdfdmFsdWVfaW5pdCAoJmFycmF5LCBHU1RfVFlQRV9BUlJBWSk7CisKKyAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKyAgZ192YWx1ZV9pbml0ICgmdmFsdWUsIEdTVF9UWVBFX0JVRkZFUik7CisgIGdzdF92YWx1ZV90YWtlX2J1ZmZlciAoJnZhbHVlLCBnc3RfYnVmZmVyX3JlZiAoYnVmKSk7CisgIGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfdmFsdWUgKCZhcnJheSwgJnZhbHVlKTsKKyAgZ192YWx1ZV91bnNldCAoJnZhbHVlKTsKKworICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAoc3RydWN0dXJlLCAic3RyZWFtaGVhZGVyIiwgJmFycmF5KTsKKyAgZ192YWx1ZV91bnNldCAoJmFycmF5KTsKKyAgZ3N0X3BhZF9zZXRfY2FwcyAobXV4LT5zcmNwYWQsIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7Cit9CisKKy8qCisgKiBXcml0ZSBvdXQgYSBmcmVlIHNwYWNlIGF0b20uIFRoZSBvZmZzZXQgaXMgYWRqdXN0ZWQgYnkgdGhlIGZ1bGwKKyAqIHNpemUsIGJ1dCBhIHNtYWxsZXIgYnVmZmVyIGlzIHNlbnQKKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfc2VuZF9mcmVlX2F0b20gKEdzdFFUTXV4ICogcXRtdXgsIGd1aW50NjQgKiBvZmYsIGd1aW50MzIgc2l6ZSwKKyAgICBnYm9vbGVhbiBmc3luY19hZnRlcikKK3sKKyAgQXRvbSAqbm9kZV9oZWFkZXI7CisgIEdzdEJ1ZmZlciAqYnVmOworICBndWludDggKmRhdGEgPSBOVUxMOworICBndWludDY0IG9mZnNldCA9IDAsIGJzaXplID0gMDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJTZW5kaW5nIGZyZWUgYXRvbSBoZWFkZXIgb2Ygc2l6ZSAldSIsIHNpemUpOworCisgIC8qIFdlIGNhbid0IG1ha2UgYSBmcmVlIHNwYWNlIGF0b20gc21hbGxlciB0aGFuIHRoZSBoZWFkZXIgKi8KKyAgaWYgKHNpemUgPCA4KQorICAgIGdvdG8gdG9vX3NtYWxsOworCisgIG5vZGVfaGVhZGVyID0gZ19tYWxsb2MwIChzaXplb2YgKEF0b20pKTsKKyAgbm9kZV9oZWFkZXItPnR5cGUgPSBGT1VSQ0NfZnJlZTsKKyAgbm9kZV9oZWFkZXItPnNpemUgPSBzaXplOworCisgIGJzaXplID0gb2Zmc2V0ID0gMDsKKyAgaWYgKGF0b21fY29weV9kYXRhIChub2RlX2hlYWRlciwgJmRhdGEsICZic2l6ZSwgJm9mZnNldCkgPT0gMCkKKyAgICBnb3RvIHNlcmlhbGl6ZV9lcnJvcjsKKworICBidWYgPSBfZ3N0X2J1ZmZlcl9uZXdfdGFrZV9kYXRhIChkYXRhLCBvZmZzZXQpOworICBnX2ZyZWUgKG5vZGVfaGVhZGVyKTsKKworICBpZiAoZnN5bmNfYWZ0ZXIpCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfU1lOQ19BRlRFUik7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHF0bXV4LCAiUHVzaGluZyBmcmVlIGF0b20iKTsKKyAgcmV0ID0gZ3N0X3F0X211eF9zZW5kX2J1ZmZlciAocXRtdXgsIGJ1Ziwgb2ZmLCBGQUxTRSk7CisKKyAgaWYgKG9mZikgeworICAgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICAgICpvZmYgKz0gc2l6ZSAtIDg7CisKKyAgICAvKiBNYWtlIHN1cmUgZG93bnN0cmVhbSBwb3NpdGlvbiBlbmRzIHVwIGF0IHRoZSBlbmQgb2YgdGhpcyBmcmVlIGJveCAqLworICAgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX0JZVEVTKTsKKyAgICBzZWdtZW50LnN0YXJ0ID0gKm9mZjsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHF0bXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKyAgfQorCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCit0b29fc21hbGw6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksCisgICAgICAgICgiTm90IGVub3VnaCBmcmVlIHJlc2VydmVkIHNwYWNlIikpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorc2VyaWFsaXplX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXV4LCBTVFJFQU0sIE1VWCwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBzZXJpYWxpemUgbWRhdCIpKTsKKyAgICBnX2ZyZWUgKG5vZGVfaGVhZGVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9xdF9tdXhfY29uZmlndXJlX21vb3YgKEdzdFFUTXV4ICogcXRtdXgpCit7CisgIGdib29sZWFuIGZyYWdtZW50ZWQgPSBGQUxTRTsKKyAgZ3VpbnQzMiB0aW1lc2NhbGU7CisKKyAgR1NUX09CSkVDVF9MT0NLIChxdG11eCk7CisgIHRpbWVzY2FsZSA9IHF0bXV4LT50aW1lc2NhbGU7CisgIGlmIChxdG11eC0+bXV4X21vZGUgPT0gR1NUX1FUX01VWF9NT0RFX0ZSQUdNRU5URUQgfHwKKyAgICAgIHF0bXV4LT5tdXhfbW9kZSA9PSBHU1RfUVRfTVVYX01PREVfRlJBR01FTlRFRF9TVFJFQU1BQkxFKQorICAgIGZyYWdtZW50ZWQgPSBUUlVFOworICBHU1RfT0JKRUNUX1VOTE9DSyAocXRtdXgpOworCisgIC8qIGluZm9ybSBsb3dlciBsYXllcnMgb2Ygb3VyIHByb3BlcnR5IHdpc2hlcywgYW5kIGRldGVybWluZSBkdXJhdGlvbi4KKyAgICogTGV0IG1vb3YgdGFrZSBjYXJlIG9mIHRoaXMgdXNpbmcgaXRzIGxpc3Qgb2YgdHJha3M7CisgICAqIHNvIHRoYXQgcmVsZWFzZWQgcGFkcyBhcmUgYWxzbyBpbmNsdWRlZCAqLworICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIlVwZGF0aW5nIHRpbWVzY2FsZSB0byAlIiBHX0dVSU5UMzJfRk9STUFULAorICAgICAgdGltZXNjYWxlKTsKKyAgYXRvbV9tb292X3VwZGF0ZV90aW1lc2NhbGUgKHF0bXV4LT5tb292LCB0aW1lc2NhbGUpOworICBhdG9tX21vb3Zfc2V0X2ZyYWdtZW50ZWQgKHF0bXV4LT5tb292LCBmcmFnbWVudGVkKTsKKworICBhdG9tX21vb3ZfdXBkYXRlX2R1cmF0aW9uIChxdG11eC0+bW9vdik7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcXRfbXV4X3NlbmRfbW9vdiAoR3N0UVRNdXggKiBxdG11eCwgZ3VpbnQ2NCAqIF9vZmZzZXQsCisgICAgZ3VpbnQ2NCBwYWRkZWRfbW9vdl9zaXplLCBnYm9vbGVhbiBtaW5kX2Zhc3QsIGdib29sZWFuIGZzeW5jX2FmdGVyKQoreworICBndWludDY0IG9mZnNldCA9IDAsIHNpemUgPSAwOworICBndWludDggKmRhdGE7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHU0xpc3QgKndhbGs7CisgIGd1aW50NjQgY3VycmVudF90aW1lID0gYXRvbXNfZ2V0X2N1cnJlbnRfcXRfdGltZSAoKTsKKworICAvKiB1cGRhdGUgbW9kaWZpY2F0aW9uIHRpbWVzICovCisgIHF0bXV4LT5tb292LT5tdmhkLnRpbWVfaW5mby5tb2RpZmljYXRpb25fdGltZSA9IGN1cnJlbnRfdGltZTsKKyAgZm9yICh3YWxrID0gcXRtdXgtPmNvbGxlY3QtPmRhdGE7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0Q29sbGVjdERhdGEgKmNkYXRhID0gKEdzdENvbGxlY3REYXRhICopIHdhbGstPmRhdGE7CisgICAgR3N0UVRQYWQgKnF0cGFkID0gKEdzdFFUUGFkICopIGNkYXRhOworCisgICAgcXRwYWQtPnRyYWstPm1kaWEubWRoZC50aW1lX2luZm8ubW9kaWZpY2F0aW9uX3RpbWUgPSBjdXJyZW50X3RpbWU7CisgICAgcXRwYWQtPnRyYWstPnRraGQubW9kaWZpY2F0aW9uX3RpbWUgPSBjdXJyZW50X3RpbWU7CisgIH0KKworICAvKiBzZXJpYWxpemUgbW9vdiAqLworICBvZmZzZXQgPSBzaXplID0gMDsKKyAgZGF0YSA9IE5VTEw7CisgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgIkNvcHlpbmcgbW92aWUgaGVhZGVyIGludG8gYnVmZmVyIik7CisgIGlmICghYXRvbV9tb292X2NvcHlfZGF0YSAocXRtdXgtPm1vb3YsICZkYXRhLCAmc2l6ZSwgJm9mZnNldCkpCisgICAgZ290byBzZXJpYWxpemVfZXJyb3I7CisgIHF0bXV4LT5sYXN0X21vb3Zfc2l6ZSA9IG9mZnNldDsKKworICAvKiBDaGVjayB3ZSBoYXZlIGVub3VnaCByZXNlcnZlZCBzcGFjZSBmb3IgdGhpcyBhbmQgYSBGcmVlIGF0b20gKi8KKyAgaWYgKHBhZGRlZF9tb292X3NpemUgPiAwICYmIG9mZnNldCArIDggPiBwYWRkZWRfbW9vdl9zaXplKQorICAgIGdvdG8gdG9vX3NtYWxsX3Jlc2VydmVkOworICBidWYgPSBfZ3N0X2J1ZmZlcl9uZXdfdGFrZV9kYXRhIChkYXRhLCBvZmZzZXQpOworICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIlB1c2hpbmcgbW9vdiBhdG9tcyIpOworCisgIC8qIElmIGF0IEVPUywgdGhpcyBpcyB0aGUgZmluYWwgbW9vdiwgcHV0IGluIHRoZSBzdHJlYW1oZWFkZXIKKyAgICogKGFwcGFyZW50bHkgdXNlZCBieSBhIGZsdW1vdGlvbiB1dGlsKSAqLworICBpZiAocXRtdXgtPnN0YXRlID09IEdTVF9RVF9NVVhfU1RBVEVfRU9TKQorICAgIGdzdF9xdF9tdXhfc2V0X2hlYWRlcl9vbl9jYXBzIChxdG11eCwgYnVmKTsKKworICBpZiAoZnN5bmNfYWZ0ZXIpCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfU1lOQ19BRlRFUik7CisgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9idWZmZXIgKHF0bXV4LCBidWYsIF9vZmZzZXQsIG1pbmRfZmFzdCk7CisKKyAgLyogV3JpdGUgb3V0IGEgZnJlZSBhdG9tIGlmIG5lZWRlZCAqLworICBpZiAocmV0ID09IEdTVF9GTE9XX09LICYmIG9mZnNldCA8IHBhZGRlZF9tb292X3NpemUpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRtdXgsICJXcml0aW5nIG91dCBmcmVlIGF0b20gb2Ygc2l6ZSAldSIsCisgICAgICAgIChndWludDMyKSAocGFkZGVkX21vb3Zfc2l6ZSAtIG9mZnNldCkpOworICAgIHJldCA9CisgICAgICAgIGdzdF9xdF9tdXhfc2VuZF9mcmVlX2F0b20gKHF0bXV4LCBfb2Zmc2V0LCBwYWRkZWRfbW9vdl9zaXplIC0gb2Zmc2V0LAorICAgICAgICBmc3luY19hZnRlcik7CisgIH0KKworICByZXR1cm4gcmV0OwordG9vX3NtYWxsX3Jlc2VydmVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXV4LCBTVFJFQU0sIE1VWCwKKyAgICAgICAgKCJOb3QgZW5vdWdoIGZyZWUgcmVzZXJ2ZWQgaGVhZGVyIHNwYWNlIiksCisgICAgICAgICgiTmVlZGVkICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBieXRlcywgcmVzZXJ2ZWQgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIG9mZnNldCwgcGFkZGVkX21vb3Zfc2l6ZSkpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorc2VyaWFsaXplX2Vycm9yOgorICB7CisgICAgZ19mcmVlIChkYXRhKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworLyogZWl0aGVyIGNhbGN1bGF0ZXMgc2l6ZSBvZiBleHRyYSBhdG9tcyBvciBwdXNoZXMgdGhlbSAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfc2VuZF9leHRyYV9hdG9tcyAoR3N0UVRNdXggKiBxdG11eCwgZ2Jvb2xlYW4gc2VuZCwgZ3VpbnQ2NCAqIG9mZnNldCwKKyAgICBnYm9vbGVhbiBtaW5kX2Zhc3QpCit7CisgIEdTTGlzdCAqd2FsazsKKyAgZ3VpbnQ2NCBsb2Zmc2V0ID0gMCwgc2l6ZSA9IDA7CisgIGd1aW50OCAqZGF0YTsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICBmb3IgKHdhbGsgPSBxdG11eC0+ZXh0cmFfYXRvbXM7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgQXRvbUluZm8gKmFpbmZvID0gKEF0b21JbmZvICopIHdhbGstPmRhdGE7CisKKyAgICBsb2Zmc2V0ID0gc2l6ZSA9IDA7CisgICAgZGF0YSA9IE5VTEw7CisgICAgaWYgKCFhaW5mby0+Y29weV9kYXRhX2Z1bmMgKGFpbmZvLT5hdG9tLAorICAgICAgICAgICAgc2VuZCA/ICZkYXRhIDogTlVMTCwgJnNpemUsICZsb2Zmc2V0KSkKKyAgICAgIGdvdG8gc2VyaWFsaXplX2Vycm9yOworCisgICAgaWYgKHNlbmQpIHsKKyAgICAgIEdzdEJ1ZmZlciAqYnVmOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwKKyAgICAgICAgICAiUHVzaGluZyBleHRyYSB0b3AtbGV2ZWwgYXRvbSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGFpbmZvLT5hdG9tLT50eXBlKSk7CisgICAgICBidWYgPSBfZ3N0X2J1ZmZlcl9uZXdfdGFrZV9kYXRhIChkYXRhLCBsb2Zmc2V0KTsKKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9idWZmZXIgKHF0bXV4LCBidWYsIG9mZnNldCwgRkFMU0UpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChvZmZzZXQpCisgICAgICAgICpvZmZzZXQgKz0gbG9mZnNldDsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworCitzZXJpYWxpemVfZXJyb3I6CisgIHsKKyAgICBnX2ZyZWUgKGRhdGEpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdF9tdXhfZG93bnN0cmVhbV9pc19zZWVrYWJsZSAoR3N0UVRNdXggKiBxdG11eCkKK3sKKyAgZ2Jvb2xlYW4gc2Vla2FibGUgPSBGQUxTRTsKKyAgR3N0UXVlcnkgKnF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19zZWVraW5nIChHU1RfRk9STUFUX0JZVEVTKTsKKworICBpZiAoZ3N0X3BhZF9wZWVyX3F1ZXJ5IChxdG11eC0+c3JjcGFkLCBxdWVyeSkpIHsKKyAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksIE5VTEwsICZzZWVrYWJsZSwgTlVMTCwgTlVMTCk7CisgICAgR1NUX0lORk9fT0JKRUNUIChxdG11eCwgImRvd25zdHJlYW0gaXMgJXNzZWVrYWJsZSIsIHNlZWthYmxlID8gIiIgOiAibm90ICIpOworICB9IGVsc2UgeworICAgIC8qIGhhdmUgdG8gYXNzdW1lIHNlZWtpbmcgaXMgbm90IHN1cHBvcnRlZCBpZiBxdWVyeSBub3QgaGFuZGxlZCBkb3duc3RyZWFtICovCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgImRvd25zdHJlYW0gZGlkIG5vdCBoYW5kbGUgc2Vla2luZyBxdWVyeSIpOworICAgIHNlZWthYmxlID0gRkFMU0U7CisgIH0KKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisKKyAgcmV0dXJuIHNlZWthYmxlOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9wcmVwYXJlX21vb3ZfcmVjb3ZlcnkgKEdzdFFUTXV4ICogcXRtdXgpCit7CisgIEdTTGlzdCAqd2FsazsKKyAgZ2Jvb2xlYW4gZmFpbCA9IEZBTFNFOworICBBdG9tRlRZUCAqZnR5cCA9IE5VTEw7CisgIEdzdEJ1ZmZlciAqcHJlZml4ID0gTlVMTDsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIk9wZW5pbmcgbW9vdiByZWNvdmVyeSBmaWxlOiAlcyIsCisgICAgICBxdG11eC0+bW9vdl9yZWNvdl9maWxlX3BhdGgpOworCisgIHF0bXV4LT5tb292X3JlY292X2ZpbGUgPSBnX2ZvcGVuIChxdG11eC0+bW9vdl9yZWNvdl9maWxlX3BhdGgsICJ3YisiKTsKKyAgaWYgKHF0bXV4LT5tb292X3JlY292X2ZpbGUgPT0gTlVMTCkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsICJGYWlsZWQgdG8gb3BlbiBtb292IHJlY292ZXJ5IGZpbGUgaW4gJXMiLAorICAgICAgICBxdG11eC0+bW9vdl9yZWNvdl9maWxlX3BhdGgpOworICAgIHJldHVybjsKKyAgfQorCisgIGdzdF9xdF9tdXhfcHJlcGFyZV9mdHlwIChxdG11eCwgJmZ0eXAsICZwcmVmaXgpOworCisgIGlmICghYXRvbXNfcmVjb3Zfd3JpdGVfaGVhZGVycyAocXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZSwgZnR5cCwgcHJlZml4LAorICAgICAgICAgIHF0bXV4LT5tb292LCBxdG11eC0+dGltZXNjYWxlLCBnX3NsaXN0X2xlbmd0aCAocXRtdXgtPnNpbmtwYWRzKSkpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LCAiRmFpbGVkIHRvIHdyaXRlIG1vb3YgcmVjb3ZlcnkgZmlsZSAiICJoZWFkZXJzIik7CisgICAgZ290byBmYWlsOworICB9CisKKyAgYXRvbV9mdHlwX2ZyZWUgKGZ0eXApOworICBpZiAocHJlZml4KQorICAgIGdzdF9idWZmZXJfdW5yZWYgKHByZWZpeCk7CisKKyAgZm9yICh3YWxrID0gcXRtdXgtPnNpbmtwYWRzOyB3YWxrICYmICFmYWlsOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdENvbGxlY3REYXRhICpjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSB3YWxrLT5kYXRhOworICAgIEdzdFFUUGFkICpxcGFkID0gKEdzdFFUUGFkICopIGNkYXRhOworICAgIC8qIHdyaXRlIGluZm8gZm9yIGVhY2ggc3RyZWFtICovCisgICAgZmFpbCA9IGF0b21zX3JlY292X3dyaXRlX3RyYWtfaW5mbyAocXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZSwgcXBhZC0+dHJhayk7CisgICAgaWYgKGZhaWwpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsICJGYWlsZWQgdG8gd3JpdGUgdHJhayBpbmZvIHRvIHJlY292ZXJ5ICIKKyAgICAgICAgICAiZmlsZSIpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuOworCitmYWlsOgorICAvKiBjbGVhbnVwICovCisgIGZjbG9zZSAocXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZSk7CisgIHF0bXV4LT5tb292X3JlY292X2ZpbGUgPSBOVUxMOworfQorCitzdGF0aWMgZ3VpbnQ2NAorcHJlZmlsbF9nZXRfYmxvY2tfaW5kZXggKEdzdFFUTXV4ICogcXRtdXgsIEdzdFFUUGFkICogcXBhZCkKK3sKKyAgc3dpdGNoIChxcGFkLT5mb3VyY2MpIHsKKyAgICBjYXNlIEZPVVJDQ19hcGNoOgorICAgIGNhc2UgRk9VUkNDX2FwY246CisgICAgY2FzZSBGT1VSQ0NfYXBjczoKKyAgICBjYXNlIEZPVVJDQ19hcGNvOgorICAgIGNhc2UgRk9VUkNDX2FwNGg6CisgICAgY2FzZSBGT1VSQ0NfYXA0eDoKKyAgICAgIHJldHVybiBxcGFkLT5zYW1wbGVfb2Zmc2V0OworICAgIGNhc2UgRk9VUkNDX3Nvd3Q6CisgICAgY2FzZSBGT1VSQ0NfdHdvczoKKyAgICAgIHJldHVybiBnc3RfdXRpbF91aW50NjRfc2NhbGVfY2VpbCAocXBhZC0+c2FtcGxlX29mZnNldCwKKyAgICAgICAgICBxcGFkLT5leHBlY3RlZF9zYW1wbGVfZHVyYXRpb25fbiwKKyAgICAgICAgICBxcGFkLT5leHBlY3RlZF9zYW1wbGVfZHVyYXRpb25fZCAqCisgICAgICAgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHFwYWQtPnRyYWspKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIC0xOworICB9Cit9CisKK3N0YXRpYyBndWludAorcHJlZmlsbF9nZXRfc2FtcGxlX3NpemUgKEdzdFFUTXV4ICogcXRtdXgsIEdzdFFUUGFkICogcXBhZCkKK3sKKyAgc3dpdGNoIChxcGFkLT5mb3VyY2MpIHsKKyAgICBjYXNlIEZPVVJDQ19hcGNoOgorICAgICAgaWYgKCgoU2FtcGxlVGFibGVFbnRyeU1QNFYgKikgcXBhZC0+dHJha19zdGUpLT5oZWlnaHQgPD0gNDgwKSB7CisgICAgICAgIHJldHVybiAzMDAwMDA7CisgICAgICB9IGVsc2UgaWYgKCgoU2FtcGxlVGFibGVFbnRyeU1QNFYgKikgcXBhZC0+dHJha19zdGUpLT5oZWlnaHQgPD0gNTc2KSB7CisgICAgICAgIHJldHVybiAzNTAwMDA7CisgICAgICB9IGVsc2UgaWYgKCgoU2FtcGxlVGFibGVFbnRyeU1QNFYgKikgcXBhZC0+dHJha19zdGUpLT5oZWlnaHQgPD0gNzIwKSB7CisgICAgICAgIHJldHVybiA1MjUwMDA7CisgICAgICB9IGVsc2UgaWYgKCgoU2FtcGxlVGFibGVFbnRyeU1QNFYgKikgcXBhZC0+dHJha19zdGUpLT5oZWlnaHQgPD0gMTA4MCkgeworICAgICAgICByZXR1cm4gMTA1MDAwMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiA0MTUwMDAwOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfYXBjbjoKKyAgICAgIGlmICgoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHFwYWQtPnRyYWtfc3RlKS0+aGVpZ2h0IDw9IDQ4MCkgeworICAgICAgICByZXR1cm4gMjAwMDAwOworICAgICAgfSBlbHNlIGlmICgoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHFwYWQtPnRyYWtfc3RlKS0+aGVpZ2h0IDw9IDU3NikgeworICAgICAgICByZXR1cm4gMjUwMDAwOworICAgICAgfSBlbHNlIGlmICgoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHFwYWQtPnRyYWtfc3RlKS0+aGVpZ2h0IDw9IDcyMCkgeworICAgICAgICByZXR1cm4gMzUwMDAwOworICAgICAgfSBlbHNlIGlmICgoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHFwYWQtPnRyYWtfc3RlKS0+aGVpZ2h0IDw9IDEwODApIHsKKyAgICAgICAgcmV0dXJuIDcwMDAwMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAyODAwMDAwOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfYXBjczoKKyAgICAgIGlmICgoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHFwYWQtPnRyYWtfc3RlKS0+aGVpZ2h0IDw9IDQ4MCkgeworICAgICAgICByZXR1cm4gMTUwMDAwOworICAgICAgfSBlbHNlIGlmICgoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHFwYWQtPnRyYWtfc3RlKS0+aGVpZ2h0IDw9IDU3NikgeworICAgICAgICByZXR1cm4gMjAwMDAwOworICAgICAgfSBlbHNlIGlmICgoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHFwYWQtPnRyYWtfc3RlKS0+aGVpZ2h0IDw9IDcyMCkgeworICAgICAgICByZXR1cm4gMjUwMDAwOworICAgICAgfSBlbHNlIGlmICgoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHFwYWQtPnRyYWtfc3RlKS0+aGVpZ2h0IDw9IDEwODApIHsKKyAgICAgICAgcmV0dXJuIDUwMDAwMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAyODAwMDAwOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfYXBjbzoKKyAgICAgIGlmICgoKFNhbXBsZVRhYmxlRW50cnlNUDRWICopIHFwYWQtPnRyYWtfc3RlKS0+aGVpZ2h0IDw9IDQ4MCkgeworICAgICAgICByZXR1cm4gODAwMDA7CisgICAgICB9IGVsc2UgaWYgKCgoU2FtcGxlVGFibGVFbnRyeU1QNFYgKikgcXBhZC0+dHJha19zdGUpLT5oZWlnaHQgPD0gNTc2KSB7CisgICAgICAgIHJldHVybiAxMDAwMDA7CisgICAgICB9IGVsc2UgaWYgKCgoU2FtcGxlVGFibGVFbnRyeU1QNFYgKikgcXBhZC0+dHJha19zdGUpLT5oZWlnaHQgPD0gNzIwKSB7CisgICAgICAgIHJldHVybiAxNTAwMDA7CisgICAgICB9IGVsc2UgaWYgKCgoU2FtcGxlVGFibGVFbnRyeU1QNFYgKikgcXBhZC0+dHJha19zdGUpLT5oZWlnaHQgPD0gMTA4MCkgeworICAgICAgICByZXR1cm4gMjUwMDAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDkwMDAwMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX3Nvd3Q6CisgICAgY2FzZSBGT1VSQ0NfdHdvczp7CisgICAgICBndWludDY0IGJsb2NrX2lkeDsKKyAgICAgIGd1aW50NjQgbmV4dF9zYW1wbGVfb2Zmc2V0OworCisgICAgICBibG9ja19pZHggPSBwcmVmaWxsX2dldF9ibG9ja19pbmRleCAocXRtdXgsIHFwYWQpOworICAgICAgbmV4dF9zYW1wbGVfb2Zmc2V0ID0KKyAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGJsb2NrX2lkeCArIDEsCisgICAgICAgICAgcXBhZC0+ZXhwZWN0ZWRfc2FtcGxlX2R1cmF0aW9uX2QgKgorICAgICAgICAgIGF0b21fdHJha19nZXRfdGltZXNjYWxlIChxcGFkLT50cmFrKSwKKyAgICAgICAgICBxcGFkLT5leHBlY3RlZF9zYW1wbGVfZHVyYXRpb25fbik7CisKKyAgICAgIHJldHVybiAobmV4dF9zYW1wbGVfb2Zmc2V0IC0gcXBhZC0+c2FtcGxlX29mZnNldCkgKiBxcGFkLT5zYW1wbGVfc2l6ZTsKKyAgICB9CisgICAgY2FzZSBGT1VSQ0NfYXA0aDoKKyAgICBjYXNlIEZPVVJDQ19hcDR4OgorICAgIGRlZmF1bHQ6CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChxdG11eCwgInVuc3VwcG9ydGVkIGNvZGVjIGZvciBwcmUtZmlsbGluZyIpOworICAgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgR3N0Q2xvY2tUaW1lCitwcmVmaWxsX2dldF9uZXh0X3RpbWVzdGFtcCAoR3N0UVRNdXggKiBxdG11eCwgR3N0UVRQYWQgKiBxcGFkKQoreworICBzd2l0Y2ggKHFwYWQtPmZvdXJjYykgeworICAgIGNhc2UgRk9VUkNDX2FwY2g6CisgICAgY2FzZSBGT1VSQ0NfYXBjbjoKKyAgICBjYXNlIEZPVVJDQ19hcGNzOgorICAgIGNhc2UgRk9VUkNDX2FwY286CisgICAgY2FzZSBGT1VSQ0NfYXA0aDoKKyAgICBjYXNlIEZPVVJDQ19hcDR4OgorICAgICAgcmV0dXJuIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAocXBhZC0+c2FtcGxlX29mZnNldCArIDEsCisgICAgICAgICAgcXBhZC0+ZXhwZWN0ZWRfc2FtcGxlX2R1cmF0aW9uX2QgKiBHU1RfU0VDT05ELAorICAgICAgICAgIHFwYWQtPmV4cGVjdGVkX3NhbXBsZV9kdXJhdGlvbl9uKTsKKyAgICBjYXNlIEZPVVJDQ19zb3d0OgorICAgIGNhc2UgRk9VUkNDX3R3b3M6eworICAgICAgZ3VpbnQ2NCBibG9ja19pZHg7CisgICAgICBndWludDY0IG5leHRfc2FtcGxlX29mZnNldDsKKworICAgICAgYmxvY2tfaWR4ID0gcHJlZmlsbF9nZXRfYmxvY2tfaW5kZXggKHF0bXV4LCBxcGFkKTsKKyAgICAgIG5leHRfc2FtcGxlX29mZnNldCA9CisgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChibG9ja19pZHggKyAxLAorICAgICAgICAgIHFwYWQtPmV4cGVjdGVkX3NhbXBsZV9kdXJhdGlvbl9kICoKKyAgICAgICAgICBhdG9tX3RyYWtfZ2V0X3RpbWVzY2FsZSAocXBhZC0+dHJhayksCisgICAgICAgICAgcXBhZC0+ZXhwZWN0ZWRfc2FtcGxlX2R1cmF0aW9uX24pOworCisgICAgICByZXR1cm4gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChuZXh0X3NhbXBsZV9vZmZzZXQsIEdTVF9TRUNPTkQsCisgICAgICAgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHFwYWQtPnRyYWspKTsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0bXV4LCAidW5zdXBwb3J0ZWQgY29kZWMgZm9yIHByZS1maWxsaW5nIik7CisgICAgICByZXR1cm4gLTE7CisgIH0KKworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorcHJlZmlsbF9yYXdfYXVkaW9fcHJlcGFyZV9idWZfZnVuYyAoR3N0UVRQYWQgKiBxdHBhZCwgR3N0QnVmZmVyICogYnVmLAorICAgIEdzdFFUTXV4ICogcXRtdXgpCit7CisgIGd1aW50NjQgYmxvY2tfaWR4OworICBndWludDY0IG5zYW1wbGVzOworICBHc3RDbG9ja1RpbWUgaW5wdXRfdGltZXN0YW1wOworICBndWludDY0IGlucHV0X3RpbWVzdGFtcF9kaXN0YW5jZTsKKworICBpZiAoYnVmKQorICAgIGdzdF9hZGFwdGVyX3B1c2ggKHF0cGFkLT5yYXdfYXVkaW9fYWRhcHRlciwgYnVmKTsKKworICBibG9ja19pZHggPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfY2VpbCAocXRwYWQtPnJhd19hdWRpb19hZGFwdGVyX29mZnNldCwKKyAgICAgIHF0cGFkLT5leHBlY3RlZF9zYW1wbGVfZHVyYXRpb25fbiwKKyAgICAgIHF0cGFkLT5leHBlY3RlZF9zYW1wbGVfZHVyYXRpb25fZCAqCisgICAgICBhdG9tX3RyYWtfZ2V0X3RpbWVzY2FsZSAocXRwYWQtPnRyYWspKTsKKyAgbnNhbXBsZXMgPQorICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChibG9ja19pZHggKyAxLAorICAgICAgcXRwYWQtPmV4cGVjdGVkX3NhbXBsZV9kdXJhdGlvbl9kICogYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHF0cGFkLT50cmFrKSwKKyAgICAgIHF0cGFkLT5leHBlY3RlZF9zYW1wbGVfZHVyYXRpb25fbikgLSBxdHBhZC0+cmF3X2F1ZGlvX2FkYXB0ZXJfb2Zmc2V0OworCisgIGlmICgoIUdTVF9DT0xMRUNUX1BBRFNfU1RBVEVfSVNfU0VUICgmcXRwYWQtPmNvbGxlY3QsCisgICAgICAgICAgICAgIEdTVF9DT0xMRUNUX1BBRFNfU1RBVEVfRU9TKQorICAgICAgICAgICYmIGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocXRwYWQtPnJhd19hdWRpb19hZGFwdGVyKSA8CisgICAgICAgICAgbnNhbXBsZXMgKiBxdHBhZC0+c2FtcGxlX3NpemUpCisgICAgICB8fCBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHF0cGFkLT5yYXdfYXVkaW9fYWRhcHRlcikgPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaW5wdXRfdGltZXN0YW1wID0KKyAgICAgIGdzdF9hZGFwdGVyX3ByZXZfcHRzIChxdHBhZC0+cmF3X2F1ZGlvX2FkYXB0ZXIsCisgICAgICAmaW5wdXRfdGltZXN0YW1wX2Rpc3RhbmNlKTsKKyAgaWYgKGlucHV0X3RpbWVzdGFtcCAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgIGlucHV0X3RpbWVzdGFtcCArPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGlucHV0X3RpbWVzdGFtcF9kaXN0YW5jZSwgR1NUX1NFQ09ORCwKKyAgICAgICAgcXRwYWQtPnNhbXBsZV9zaXplICogYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHF0cGFkLT50cmFrKSk7CisKKyAgYnVmID0KKyAgICAgIGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChxdHBhZC0+cmF3X2F1ZGlvX2FkYXB0ZXIsCisgICAgICAhR1NUX0NPTExFQ1RfUEFEU19TVEFURV9JU19TRVQgKCZxdHBhZC0+Y29sbGVjdCwKKyAgICAgICAgICBHU1RfQ09MTEVDVF9QQURTX1NUQVRFX0VPUykgPyBuc2FtcGxlcyAqCisgICAgICBxdHBhZC0+c2FtcGxlX3NpemUgOiBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHF0cGFkLT5yYXdfYXVkaW9fYWRhcHRlcikpOworICBHU1RfQlVGRkVSX1BUUyAoYnVmKSA9IGlucHV0X3RpbWVzdGFtcDsKKyAgR1NUX0JVRkZFUl9EVFMgKGJ1ZikgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBxdHBhZC0+cmF3X2F1ZGlvX2FkYXB0ZXJfb2Zmc2V0ICs9IG5zYW1wbGVzOworCisgIC8qIENoZWNrIGlmIHdlIGhhdmUgeWV0IGFub3RoZXIgYmxvY2sgb2YgcmF3IGF1ZGlvIGluIHRoZSBhZGFwdGVyICovCisgIG5zYW1wbGVzID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoYmxvY2tfaWR4ICsgMiwKKyAgICAgIHF0cGFkLT5leHBlY3RlZF9zYW1wbGVfZHVyYXRpb25fZCAqIGF0b21fdHJha19nZXRfdGltZXNjYWxlIChxdHBhZC0+dHJhayksCisgICAgICBxdHBhZC0+ZXhwZWN0ZWRfc2FtcGxlX2R1cmF0aW9uX24pIC0gcXRwYWQtPnJhd19hdWRpb19hZGFwdGVyX29mZnNldDsKKyAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocXRwYWQtPnJhd19hdWRpb19hZGFwdGVyKSA+PQorICAgICAgbnNhbXBsZXMgKiBxdHBhZC0+c2FtcGxlX3NpemUpIHsKKyAgICBpbnB1dF90aW1lc3RhbXAgPQorICAgICAgICBnc3RfYWRhcHRlcl9wcmV2X3B0cyAocXRwYWQtPnJhd19hdWRpb19hZGFwdGVyLAorICAgICAgICAmaW5wdXRfdGltZXN0YW1wX2Rpc3RhbmNlKTsKKyAgICBpZiAoaW5wdXRfdGltZXN0YW1wICE9IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgICBpbnB1dF90aW1lc3RhbXAgKz0KKyAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGlucHV0X3RpbWVzdGFtcF9kaXN0YW5jZSwgR1NUX1NFQ09ORCwKKyAgICAgICAgICBxdHBhZC0+c2FtcGxlX3NpemUgKiBhdG9tX3RyYWtfZ2V0X3RpbWVzY2FsZSAocXRwYWQtPnRyYWspKTsKKyAgICBxdHBhZC0+cmF3X2F1ZGlvX2FkYXB0ZXJfcHRzID0gaW5wdXRfdGltZXN0YW1wOworICB9IGVsc2UgeworICAgIHF0cGFkLT5yYXdfYXVkaW9fYWRhcHRlcl9wdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGdib29sZWFuCitwcmVmaWxsX3VwZGF0ZV9zYW1wbGVfc2l6ZSAoR3N0UVRNdXggKiBxdG11eCwgR3N0UVRQYWQgKiBxcGFkKQoreworICBzd2l0Y2ggKHFwYWQtPmZvdXJjYykgeworICAgIGNhc2UgRk9VUkNDX2FwY2g6CisgICAgY2FzZSBGT1VSQ0NfYXBjbjoKKyAgICBjYXNlIEZPVVJDQ19hcGNzOgorICAgIGNhc2UgRk9VUkNDX2FwY286CisgICAgY2FzZSBGT1VSQ0NfYXA0aDoKKyAgICBjYXNlIEZPVVJDQ19hcDR4OnsKKyAgICAgIGd1aW50IHNhbXBsZV9zaXplID0gcHJlZmlsbF9nZXRfc2FtcGxlX3NpemUgKHF0bXV4LCBxcGFkKTsKKyAgICAgIGF0b21fdHJha19zZXRfY29uc3RhbnRfc2l6ZV9zYW1wbGVzIChxcGFkLT50cmFrLCBzYW1wbGVfc2l6ZSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgY2FzZSBGT1VSQ0Nfc293dDoKKyAgICBjYXNlIEZPVVJDQ190d29zOnsKKyAgICAgIEdTTGlzdCAqd2FsazsKKworICAgICAgLyogRmluZCB0aGUgKGZpcnN0KSB2aWRlbyB0cmFjayBhbmQgYXNzdW1lIHRoYXQgd2UgaGF2ZSB0byBvdXRwdXQKKyAgICAgICAqIGluIHRoYXQgc2l6ZSAqLworICAgICAgZm9yICh3YWxrID0gcXRtdXgtPmNvbGxlY3QtPmRhdGE7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgICAgIEdzdENvbGxlY3REYXRhICpjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSB3YWxrLT5kYXRhOworICAgICAgICBHc3RRVFBhZCAqdG1wX3FwYWQgPSAoR3N0UVRQYWQgKikgY2RhdGE7CisKKyAgICAgICAgaWYgKHRtcF9xcGFkLT50cmFrLT5pc192aWRlbykgeworICAgICAgICAgIHFwYWQtPmV4cGVjdGVkX3NhbXBsZV9kdXJhdGlvbl9uID0KKyAgICAgICAgICAgICAgdG1wX3FwYWQtPmV4cGVjdGVkX3NhbXBsZV9kdXJhdGlvbl9uOworICAgICAgICAgIHFwYWQtPmV4cGVjdGVkX3NhbXBsZV9kdXJhdGlvbl9kID0KKyAgICAgICAgICAgICAgdG1wX3FwYWQtPmV4cGVjdGVkX3NhbXBsZV9kdXJhdGlvbl9kOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh3YWxrID09IE5VTEwpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChxcGFkLT5jb2xsZWN0LnBhZCwKKyAgICAgICAgICAgICJGb3VuZCBubyB2aWRlbyBmcmFtZXJhdGUsIHVzaW5nIDQwbXMgYXVkaW8gYnVmZmVycyIpOworICAgICAgICBxcGFkLT5leHBlY3RlZF9zYW1wbGVfZHVyYXRpb25fbiA9IDI1OworICAgICAgICBxcGFkLT5leHBlY3RlZF9zYW1wbGVfZHVyYXRpb25fZCA9IDE7CisgICAgICB9CisKKyAgICAgIC8qIFNldCBhIHByZXBhcmVfYnVmX2Z1bmMgdGhhdCBlbnN1cmVzIHRoaXMgKi8KKyAgICAgIHFwYWQtPnByZXBhcmVfYnVmX2Z1bmMgPSBwcmVmaWxsX3Jhd19hdWRpb19wcmVwYXJlX2J1Zl9mdW5jOworICAgICAgcXBhZC0+cmF3X2F1ZGlvX2FkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgICAgICBxcGFkLT5yYXdfYXVkaW9fYWRhcHRlcl9vZmZzZXQgPSAwOworICAgICAgcXBhZC0+cmF3X2F1ZGlvX2FkYXB0ZXJfcHRzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gVFJVRTsKKyAgfQorfQorCitzdGF0aWMgR3N0UVRQYWQgKgorZmluZF9iZXN0X3BhZF9wcmVmaWxsIChHc3RRVE11eCAqIHF0bXV4KQoreworICBHU0xpc3QgKndhbGs7CisgIEdzdFFUUGFkICpiZXN0X3BhZCA9IE5VTEw7CisKKyAgaWYgKHF0bXV4LT5jdXJyZW50X3BhZCAmJgorICAgICAgKHF0bXV4LT5pbnRlcmxlYXZlX2J5dGVzICE9IDAgfHwgcXRtdXgtPmludGVybGVhdmVfdGltZSAhPSAwKSAmJgorICAgICAgKHF0bXV4LT5pbnRlcmxlYXZlX2J5dGVzID09IDAKKyAgICAgICAgICB8fCBxdG11eC0+Y3VycmVudF9jaHVua19zaXplIDw9IHF0bXV4LT5pbnRlcmxlYXZlX2J5dGVzKQorICAgICAgJiYgKHF0bXV4LT5pbnRlcmxlYXZlX3RpbWUgPT0gMAorICAgICAgICAgIHx8IHF0bXV4LT5jdXJyZW50X2NodW5rX2R1cmF0aW9uIDw9IHF0bXV4LT5pbnRlcmxlYXZlX3RpbWUpCisgICAgICAmJiBxdG11eC0+bXV4X21vZGUgIT0gR1NUX1FUX01VWF9NT0RFX0ZSQUdNRU5URUQKKyAgICAgICYmIHF0bXV4LT5tdXhfbW9kZSAhPSBHU1RfUVRfTVVYX01PREVfRlJBR01FTlRFRF9TVFJFQU1BQkxFKSB7CisKKyAgICBpZiAocXRtdXgtPmN1cnJlbnRfcGFkLT50b3RhbF9kdXJhdGlvbiA8IHF0bXV4LT5yZXNlcnZlZF9tYXhfZHVyYXRpb24pIHsKKyAgICAgIGJlc3RfcGFkID0gcXRtdXgtPmN1cnJlbnRfcGFkOworICAgIH0KKyAgfSBlbHNlIGlmIChxdG11eC0+Y29sbGVjdC0+ZGF0YS0+bmV4dCkgeworICAgIGJlc3RfcGFkID0gcXRtdXgtPmN1cnJlbnRfcGFkID0gTlVMTDsKKyAgfQorCisgIGlmICghYmVzdF9wYWQpIHsKKyAgICBHc3RDbG9ja1RpbWUgYmVzdF90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICAgIGZvciAod2FsayA9IHF0bXV4LT5jb2xsZWN0LT5kYXRhOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgICAgR3N0Q29sbGVjdERhdGEgKmNkYXRhID0gKEdzdENvbGxlY3REYXRhICopIHdhbGstPmRhdGE7CisgICAgICBHc3RRVFBhZCAqcXRwYWQgPSAoR3N0UVRQYWQgKikgY2RhdGE7CisgICAgICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworCisgICAgICBpZiAocXRwYWQtPnRvdGFsX2R1cmF0aW9uID49IHF0bXV4LT5yZXNlcnZlZF9tYXhfZHVyYXRpb24pCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICB0aW1lc3RhbXAgPSBxdHBhZC0+dG90YWxfZHVyYXRpb247CisKKyAgICAgIGlmIChiZXN0X3BhZCA9PSBOVUxMIHx8CisgICAgICAgICAgIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChiZXN0X3RpbWUpIHx8IHRpbWVzdGFtcCA8IGJlc3RfdGltZSkgeworICAgICAgICBiZXN0X3BhZCA9IHF0cGFkOworICAgICAgICBiZXN0X3RpbWUgPSB0aW1lc3RhbXA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGJlc3RfcGFkOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdF9tdXhfcHJlZmlsbF9zYW1wbGVzIChHc3RRVE11eCAqIHF0bXV4KQoreworICBHc3RRVFBhZCAqcXBhZDsKKyAgR1NMaXN0ICp3YWxrOworICBHc3RRVE11eENsYXNzICpxdG11eF9rbGFzcyA9IChHc3RRVE11eENsYXNzICopIChHX09CSkVDVF9HRVRfQ0xBU1MgKHF0bXV4KSk7CisKKyAgLyogVXBkYXRlIGV4cGVjdGVkIHNhbXBsZSBzaXplcy9kdXJhdGlvbnMgYXMgbmVlZGVkLCB0aGlzIGlzIGZvciByYXcKKyAgICogYXVkaW8gd2hlcmUgc2FtcGxlcyBhcmUgYWN0dWFsIGF1ZGlvIHNhbXBsZXMuICovCisgIGZvciAod2FsayA9IHF0bXV4LT5jb2xsZWN0LT5kYXRhOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdENvbGxlY3REYXRhICpjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSB3YWxrLT5kYXRhOworICAgIEdzdFFUUGFkICpxcGFkID0gKEdzdFFUUGFkICopIGNkYXRhOworCisgICAgaWYgKCFwcmVmaWxsX3VwZGF0ZV9zYW1wbGVfc2l6ZSAocXRtdXgsIHFwYWQpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKHF0bXV4X2tsYXNzLT5mb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfUVQpIHsKKyAgICAvKiBGb3IgdGhlIGZpcnN0IHNhbXBsZSBjaGVjay91cGRhdGUgdGltZWNvZGUgYXMgbmVlZGVkLiBXZSBkbyB0aGF0IGJlZm9yZQorICAgICAqIGFsbCBhY3R1YWwgc2FtcGxlcyBhcyB0aGUgY29kZSBpbiBnc3RfcXRfbXV4X2FkZF9idWZmZXIoKSBkb2VzIGl0IHdpdGgKKyAgICAgKiBpbml0aWFsIGJ1ZmZlciBkaXJlY3RseSwgbm90IHdpdGggbGFzdF9idWYgKi8KKyAgICBmb3IgKHdhbGsgPSBxdG11eC0+Y29sbGVjdC0+ZGF0YTsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICAgIEdzdENvbGxlY3REYXRhICpjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSB3YWxrLT5kYXRhOworICAgICAgR3N0UVRQYWQgKnFwYWQgPSAoR3N0UVRQYWQgKikgY2RhdGE7CisgICAgICBHc3RCdWZmZXIgKmJ1ZmZlciA9CisgICAgICAgICAgZ3N0X2NvbGxlY3RfcGFkc19wZWVrIChxdG11eC0+Y29sbGVjdCwgKEdzdENvbGxlY3REYXRhICopIHFwYWQpOworICAgICAgR3N0VmlkZW9UaW1lQ29kZU1ldGEgKnRjX21ldGE7CisKKyAgICAgIGlmIChidWZmZXIgJiYgKHRjX21ldGEgPSBnc3RfYnVmZmVyX2dldF92aWRlb190aW1lX2NvZGVfbWV0YSAoYnVmZmVyKSkpIHsKKyAgICAgICAgR3N0VmlkZW9UaW1lQ29kZSAqdGMgPSAmdGNfbWV0YS0+dGM7CisKKyAgICAgICAgcXBhZC0+dGNfdHJhayA9IGF0b21fdHJha19uZXcgKHF0bXV4LT5jb250ZXh0KTsKKyAgICAgICAgYXRvbV9tb292X2FkZF90cmFrIChxdG11eC0+bW9vdiwgcXBhZC0+dGNfdHJhayk7CisKKyAgICAgICAgcXBhZC0+dHJhay0+dHJlZiA9IGF0b21fdHJlZl9uZXcgKEZPVVJDQ190bWNkKTsKKyAgICAgICAgYXRvbV90cmVmX2FkZF9lbnRyeSAocXBhZC0+dHJhay0+dHJlZiwgcXBhZC0+dGNfdHJhay0+dGtoZC50cmFja19JRCk7CisKKyAgICAgICAgYXRvbV90cmFrX3NldF90aW1lY29kZV90eXBlIChxcGFkLT50Y190cmFrLCBxdG11eC0+Y29udGV4dCwKKyAgICAgICAgICAgIHFwYWQtPnRyYWstPm1kaWEubWRoZC50aW1lX2luZm8udGltZXNjYWxlLCB0Yyk7CisKKyAgICAgICAgYXRvbV90cmFrX2FkZF9zYW1wbGVzIChxcGFkLT50Y190cmFrLCAxLCAxLCA0LAorICAgICAgICAgICAgcXRtdXgtPm1kYXRfc2l6ZSwgRkFMU0UsIDApOworCisgICAgICAgIHFwYWQtPnRjX3BvcyA9IHF0bXV4LT5tZGF0X3NpemU7CisgICAgICAgIHFwYWQtPmZpcnN0X3RjID0gZ3N0X3ZpZGVvX3RpbWVfY29kZV9jb3B5ICh0Yyk7CisgICAgICAgIHFwYWQtPmZpcnN0X3B0cyA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworCisgICAgICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX29mZnNldCA9IC0xOworICAgICAgICBxdG11eC0+Y3VycmVudF9jaHVua19zaXplID0gMDsKKyAgICAgICAgcXRtdXgtPmN1cnJlbnRfY2h1bmtfZHVyYXRpb24gPSAwOworICAgICAgICBxdG11eC0+bWRhdF9zaXplICs9IDQ7CisgICAgICB9CisgICAgICBpZiAoYnVmZmVyKQorICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIH0KKyAgfQorCisgIHdoaWxlICgocXBhZCA9IGZpbmRfYmVzdF9wYWRfcHJlZmlsbCAocXRtdXgpKSkgeworICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIG5leHRfdGltZXN0YW1wLCBkdXJhdGlvbjsKKyAgICBndWludCBuc2FtcGxlcywgc2FtcGxlX3NpemU7CisgICAgZ3VpbnQ2NCBjaHVua19vZmZzZXQ7CisgICAgZ2ludDY0IHNjYWxlZF9kdXJhdGlvbjsKKyAgICBnaW50NjQgcHRzX29mZnNldCA9IDA7CisgICAgZ2Jvb2xlYW4gc3luYyA9IEZBTFNFOworICAgIFRyYWtCdWZmZXJFbnRyeUluZm8gc2FtcGxlX2VudHJ5OworCisgICAgc2FtcGxlX3NpemUgPSBwcmVmaWxsX2dldF9zYW1wbGVfc2l6ZSAocXRtdXgsIHFwYWQpOworCisgICAgaWYgKHNhbXBsZV9zaXplID09IC0xKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFxcGFkLT5zYW1wbGVzKQorICAgICAgcXBhZC0+c2FtcGxlcyA9IGdfYXJyYXlfbmV3IChGQUxTRSwgRkFMU0UsIHNpemVvZiAoVHJha0J1ZmZlckVudHJ5SW5mbykpOworCisgICAgdGltZXN0YW1wID0gcXBhZC0+dG90YWxfZHVyYXRpb247CisgICAgbmV4dF90aW1lc3RhbXAgPSBwcmVmaWxsX2dldF9uZXh0X3RpbWVzdGFtcCAocXRtdXgsIHFwYWQpOworICAgIGR1cmF0aW9uID0gbmV4dF90aW1lc3RhbXAgLSB0aW1lc3RhbXA7CisKKyAgICBpZiAocXBhZC0+Zmlyc3RfdHMgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICAgIHFwYWQtPmZpcnN0X3RzID0gdGltZXN0YW1wOworICAgIGlmIChxcGFkLT5maXJzdF9kdHMgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICAgIHFwYWQtPmZpcnN0X2R0cyA9IHRpbWVzdGFtcDsKKworICAgIGlmIChxdG11eC0+Y3VycmVudF9wYWQgIT0gcXBhZCB8fCBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQgPT0gLTEpIHsKKyAgICAgIHF0bXV4LT5jdXJyZW50X3BhZCA9IHFwYWQ7CisgICAgICBpZiAocXRtdXgtPmN1cnJlbnRfY2h1bmtfb2Zmc2V0ID09IC0xKQorICAgICAgICBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQgPSBxdG11eC0+bWRhdF9zaXplOworICAgICAgZWxzZQorICAgICAgICBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQgKz0gcXRtdXgtPmN1cnJlbnRfY2h1bmtfc2l6ZTsKKyAgICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX3NpemUgPSAwOworICAgICAgcXRtdXgtPmN1cnJlbnRfY2h1bmtfZHVyYXRpb24gPSAwOworICAgIH0KKyAgICBpZiAocXBhZC0+c2FtcGxlX3NpemUpCisgICAgICBuc2FtcGxlcyA9IHNhbXBsZV9zaXplIC8gcXBhZC0+c2FtcGxlX3NpemU7CisgICAgZWxzZQorICAgICAgbnNhbXBsZXMgPSAxOworICAgIHFwYWQtPmxhc3RfZHRzID0gdGltZXN0YW1wOworICAgIHNjYWxlZF9kdXJhdGlvbiA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAodGltZXN0YW1wICsgZHVyYXRpb24sCisgICAgICAgIGF0b21fdHJha19nZXRfdGltZXNjYWxlIChxcGFkLT50cmFrKSwKKyAgICAgICAgR1NUX1NFQ09ORCkgLSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKHRpbWVzdGFtcCwKKyAgICAgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHFwYWQtPnRyYWspLCBHU1RfU0VDT05EKTsKKworICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX3NpemUgKz0gc2FtcGxlX3NpemU7CisgICAgcXRtdXgtPmN1cnJlbnRfY2h1bmtfZHVyYXRpb24gKz0gZHVyYXRpb247CisgICAgcXBhZC0+dG90YWxfYnl0ZXMgKz0gc2FtcGxlX3NpemU7CisKKyAgICBjaHVua19vZmZzZXQgPSBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQ7CisKKyAgICAvKiBJLWZyYW1lIG9ubHksIG5vIGZyYW1lIHJlb3JkZXJpbmcgKi8KKyAgICBzeW5jID0gRkFMU0U7CisgICAgcHRzX29mZnNldCA9IDA7CisKKyAgICBpZiAocXRtdXgtPmN1cnJlbnRfY2h1bmtfZHVyYXRpb24gPiBxdG11eC0+bG9uZ2VzdF9jaHVuaworICAgICAgICB8fCAhR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHF0bXV4LT5sb25nZXN0X2NodW5rKSkgeworICAgICAgcXRtdXgtPmxvbmdlc3RfY2h1bmsgPSBxdG11eC0+Y3VycmVudF9jaHVua19kdXJhdGlvbjsKKyAgICB9CisKKyAgICBzYW1wbGVfZW50cnkudHJhY2tfaWQgPSBxcGFkLT50cmFrLT50a2hkLnRyYWNrX0lEOworICAgIHNhbXBsZV9lbnRyeS5uc2FtcGxlcyA9IG5zYW1wbGVzOworICAgIHNhbXBsZV9lbnRyeS5kZWx0YSA9IHNjYWxlZF9kdXJhdGlvbiAvIG5zYW1wbGVzOworICAgIHNhbXBsZV9lbnRyeS5zaXplID0gc2FtcGxlX3NpemUgLyBuc2FtcGxlczsKKyAgICBzYW1wbGVfZW50cnkuY2h1bmtfb2Zmc2V0ID0gY2h1bmtfb2Zmc2V0OworICAgIHNhbXBsZV9lbnRyeS5wdHNfb2Zmc2V0ID0gcHRzX29mZnNldDsKKyAgICBzYW1wbGVfZW50cnkuc3luYyA9IHN5bmM7CisgICAgc2FtcGxlX2VudHJ5LmRvX3B0cyA9IFRSVUU7CisgICAgZ19hcnJheV9hcHBlbmRfdmFsIChxcGFkLT5zYW1wbGVzLCBzYW1wbGVfZW50cnkpOworICAgIGF0b21fdHJha19hZGRfc2FtcGxlcyAocXBhZC0+dHJhaywgbnNhbXBsZXMsIHNjYWxlZF9kdXJhdGlvbiAvIG5zYW1wbGVzLAorICAgICAgICBzYW1wbGVfc2l6ZSAvIG5zYW1wbGVzLCBjaHVua19vZmZzZXQsIHN5bmMsIHB0c19vZmZzZXQpOworCisgICAgcXBhZC0+dG90YWxfZHVyYXRpb24gPSBuZXh0X3RpbWVzdGFtcDsKKyAgICBxdG11eC0+bWRhdF9zaXplICs9IHNhbXBsZV9zaXplOworICAgIHFwYWQtPnNhbXBsZV9vZmZzZXQgKz0gbnNhbXBsZXM7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfc3RhcnRfZmlsZSAoR3N0UVRNdXggKiBxdG11eCkKK3sKKyAgR3N0UVRNdXhDbGFzcyAqcXRtdXhfa2xhc3MgPSAoR3N0UVRNdXhDbGFzcyAqKSAoR19PQkpFQ1RfR0VUX0NMQVNTIChxdG11eCkpOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RDYXBzICpjYXBzOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIGdjaGFyIHNfaWRbMzJdOworICBHc3RDbG9ja1RpbWUgcmVzZXJ2ZWRfbWF4X2R1cmF0aW9uOworICBndWludCByZXNlcnZlZF9ieXRlc19wZXJfc2VjX3Blcl90cmFrOworICBHU0xpc3QgKndhbGs7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJzdGFydGluZyBmaWxlIik7CisKKyAgR1NUX09CSkVDVF9MT0NLIChxdG11eCk7CisgIHJlc2VydmVkX21heF9kdXJhdGlvbiA9IHF0bXV4LT5yZXNlcnZlZF9tYXhfZHVyYXRpb247CisgIHJlc2VydmVkX2J5dGVzX3Blcl9zZWNfcGVyX3RyYWsgPSBxdG11eC0+cmVzZXJ2ZWRfYnl0ZXNfcGVyX3NlY19wZXJfdHJhazsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXV4KTsKKworICAvKiBzdHJlYW0tc3RhcnQgKEZJWE1FOiBjcmVhdGUgaWQgYmFzZWQgb24gaW5wdXQgaWRzKSAqLworICBnX3NucHJpbnRmIChzX2lkLCBzaXplb2YgKHNfaWQpLCAicXRtdXgtJTA4eCIsIGdfcmFuZG9tX2ludCAoKSk7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAocXRtdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKHNfaWQpKTsKKworICBjYXBzID0gZ3N0X2NhcHNfY29weSAoZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHF0bXV4LT5zcmNwYWQpKTsKKyAgLyogcXRtdXggaGFzIHN0cnVjdHVyZSB3aXRoIGFuZCB3aXRob3V0IHZhcmlhbnQsIHJlbW92ZSBhbGwgYnV0IHRoZSBmaXJzdCAqLworICB3aGlsZSAoZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpID4gMSkKKyAgICBnc3RfY2Fwc19yZW1vdmVfc3RydWN0dXJlIChjYXBzLCAxKTsKKyAgZ3N0X3BhZF9zZXRfY2FwcyAocXRtdXgtPnNyY3BhZCwgY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAvKiBEZWZhdWx0IGlzICdub3JtYWwnIG1vZGUgKi8KKyAgcXRtdXgtPm11eF9tb2RlID0gR1NUX1FUX01VWF9NT0RFX01PT1ZfQVRfRU5EOworCisgIC8qIFJlcXVpcmUgYSBzZW5zaWJsZSBmcmFnbWVudCBkdXJhdGlvbiB3aGVuIG11eGluZworICAgKiB1c2luZyB0aGUgSVNNTCBtdXhlciAqLworICBpZiAocXRtdXhfa2xhc3MtPmZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9JU01MICYmCisgICAgICBxdG11eC0+ZnJhZ21lbnRfZHVyYXRpb24gPT0gMCkKKyAgICBnb3RvIGludmFsaWRfaXNtbDsKKworICBpZiAocXRtdXgtPmZyYWdtZW50X2R1cmF0aW9uID4gMCkgeworICAgIGlmIChxdG11eC0+c3RyZWFtYWJsZSkKKyAgICAgIHF0bXV4LT5tdXhfbW9kZSA9IEdTVF9RVF9NVVhfTU9ERV9GUkFHTUVOVEVEX1NUUkVBTUFCTEU7CisgICAgZWxzZQorICAgICAgcXRtdXgtPm11eF9tb2RlID0gR1NUX1FUX01VWF9NT0RFX0ZSQUdNRU5URUQ7CisgIH0gZWxzZSBpZiAocXRtdXgtPmZhc3Rfc3RhcnQpIHsKKyAgICBxdG11eC0+bXV4X21vZGUgPSBHU1RfUVRfTVVYX01PREVfRkFTVF9TVEFSVDsKKyAgfSBlbHNlIGlmIChyZXNlcnZlZF9tYXhfZHVyYXRpb24gIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgIGlmIChxdG11eC0+cmVzZXJ2ZWRfcHJlZmlsbCkKKyAgICAgIHF0bXV4LT5tdXhfbW9kZSA9IEdTVF9RVF9NVVhfTU9ERV9ST0JVU1RfUkVDT1JESU5HX1BSRUZJTEw7CisgICAgZWxzZQorICAgICAgcXRtdXgtPm11eF9tb2RlID0gR1NUX1FUX01VWF9NT0RFX1JPQlVTVF9SRUNPUkRJTkc7CisgIH0KKworICBzd2l0Y2ggKHF0bXV4LT5tdXhfbW9kZSkgeworICAgIGNhc2UgR1NUX1FUX01VWF9NT0RFX01PT1ZfQVRfRU5EOgorICAgIGNhc2UgR1NUX1FUX01VWF9NT0RFX1JPQlVTVF9SRUNPUkRJTkc6CisgICAgICAvKiBXZSBoYXZlIHRvIGJlIGFibGUgdG8gc2VlayB0byByZXdyaXRlIHRoZSBtZGF0IGhlYWRlciwgb3IgYW55CisgICAgICAgKiBtb292IGF0b20gd2Ugd3JpdGUgd2lsbCBub3QgYmUgdmlzaWJsZSBpbiB0aGUgZmlsZSwgYmVjYXVzZSBhbgorICAgICAgICogTURBVCB3aXRoIDAgYXMgdGhlIHNpemUgY292ZXJzIHRoZSByZXN0IG9mIHRoZSBmaWxlLiBBIGZpbGUKKyAgICAgICAqIHdpdGggbm8gbW9vdiBpcyBub3QgcGxheWFibGUsIHNvIGVycm9yIG91dCBub3cuICovCisgICAgICBpZiAoIWdzdF9xdF9tdXhfZG93bnN0cmVhbV9pc19zZWVrYWJsZSAocXRtdXgpKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG11eCwgU1RSRUFNLCBNVVgsCisgICAgICAgICAgICAoIkRvd25zdHJlYW0gaXMgbm90IHNlZWthYmxlIC0gd2lsbCBub3QgYmUgYWJsZSB0byBjcmVhdGUgYSBwbGF5YWJsZSBmaWxlIiksCisgICAgICAgICAgICAoTlVMTCkpOworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9RVF9NVVhfTU9ERV9GQVNUX1NUQVJUOgorICAgIGNhc2UgR1NUX1FUX01VWF9NT0RFX0ZSQUdNRU5URURfU1RSRUFNQUJMRToKKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgbmVlZCBzZWVrYWJpbGl0eSwgaWdub3JlICovCisgICAgY2FzZSBHU1RfUVRfTVVYX01PREVfRlJBR01FTlRFRDoKKyAgICAgIGlmICghZ3N0X3F0X211eF9kb3duc3RyZWFtX2lzX3NlZWthYmxlIChxdG11eCkpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgImRvd25zdHJlYW0gaXMgbm90IHNlZWthYmxlLCBidXQgIgorICAgICAgICAgICAgInN0cmVhbWFibGU9ZmFsc2UuIFdpbGwgaWdub3JlIHRoYXQgYW5kIGNyZWF0ZSBzdHJlYW1hYmxlIG91dHB1dCAiCisgICAgICAgICAgICAiaW5zdGVhZCIpOworICAgICAgICBxdG11eC0+c3RyZWFtYWJsZSA9IFRSVUU7CisgICAgICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKHF0bXV4KSwgInN0cmVhbWFibGUiKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1FUX01VWF9NT0RFX1JPQlVTVF9SRUNPUkRJTkdfUFJFRklMTDoKKyAgICAgIGlmICghZ3N0X3F0X211eF9kb3duc3RyZWFtX2lzX3NlZWthYmxlIChxdG11eCkpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwKKyAgICAgICAgICAgICJkb3duc3RyZWFtIGlzIG5vdCBzZWVrYWJsZSwgd2lsbCBub3QgYmUgYWJsZSAiCisgICAgICAgICAgICAidG8gdHJpbSBzYW1wbGVzIHRhYmxlIGF0IHRoZSBlbmQgaWYgbGVzcyB0aGFuIHJlc2VydmVkLWR1cmF0aW9uIGlzICIKKyAgICAgICAgICAgICJyZWNvcmRlZCIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBsZXQgZG93bnN0cmVhbSBrbm93IHdlIHRoaW5rIGluIEJZVEVTIGFuZCBleHBlY3QgdG8gZG8gc2Vla2luZyBsYXRlciBvbiAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAocXRtdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAocXRtdXgpOworCisgIGlmIChxdG11eC0+dGltZXNjYWxlID09IDApIHsKKyAgICBndWludDMyIHN1Z2dlc3RlZF90aW1lc2NhbGUgPSAwOworICAgIEdTTGlzdCAqd2FsazsKKworICAgIC8qIENhbGN1bGF0ZSBhIHJlYXNvbmFibGUgdGltZXNjYWxlIGZvciB0aGUgbW9vdjoKKyAgICAgKiBJZiB0aGVyZSBpcyB2aWRlbywgaXQgaXMgdGhlIGJpZ2dlc3QgdmlkZW8gdHJhY2sgdGltZXNjYWxlIG9yIGFuIGV2ZW4KKyAgICAgKiBtdWx0aXBsZSBvZiBpdCBpZiBpdCdzIHNtYWxsZXIgdGhhbiAxODAwLgorICAgICAqIE90aGVyd2lzZSBpdCBpcyAxODAwICovCisgICAgZm9yICh3YWxrID0gcXRtdXgtPnNpbmtwYWRzOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgICAgR3N0Q29sbGVjdERhdGEgKmNkYXRhID0gKEdzdENvbGxlY3REYXRhICopIHdhbGstPmRhdGE7CisgICAgICBHc3RRVFBhZCAqcXBhZCA9IChHc3RRVFBhZCAqKSBjZGF0YTsKKworICAgICAgaWYgKCFxcGFkLT50cmFrKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLyogbm90IHZpZGVvICovCisgICAgICBpZiAoIXFwYWQtPnRyYWstPm1kaWEubWluZi52bWhkKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgc3VnZ2VzdGVkX3RpbWVzY2FsZSA9CisgICAgICAgICAgTUFYIChxcGFkLT50cmFrLT5tZGlhLm1kaGQudGltZV9pbmZvLnRpbWVzY2FsZSwgc3VnZ2VzdGVkX3RpbWVzY2FsZSk7CisgICAgfQorCisgICAgaWYgKHN1Z2dlc3RlZF90aW1lc2NhbGUgPT0gMCkKKyAgICAgIHN1Z2dlc3RlZF90aW1lc2NhbGUgPSAxODAwOworCisgICAgd2hpbGUgKHN1Z2dlc3RlZF90aW1lc2NhbGUgPCAxODAwKQorICAgICAgc3VnZ2VzdGVkX3RpbWVzY2FsZSAqPSAyOworCisgICAgcXRtdXgtPnRpbWVzY2FsZSA9IHN1Z2dlc3RlZF90aW1lc2NhbGU7CisgIH0KKworICAvKiBpbml0aWFsaXplIG91ciBtb292IHJlY292ZXJ5IGZpbGUgKi8KKyAgaWYgKHF0bXV4LT5tb292X3JlY292X2ZpbGVfcGF0aCkgeworICAgIGdzdF9xdF9tdXhfcHJlcGFyZV9tb292X3JlY292ZXJ5IChxdG11eCk7CisgIH0KKworICAvKiBNYWtlIHN1cmUgdGhlIGZpcnN0IHRpbWUgd2UgdXBkYXRlIHRoZSBtb292LCB3ZSdsbAorICAgKiBpbmNsdWRlIGFueSB0YWdzZXR0ZXIgdGFncyAqLworICBxdG11eC0+dGFnc19jaGFuZ2VkID0gVFJVRTsKKworICBHU1RfT0JKRUNUX1VOTE9DSyAocXRtdXgpOworCisgIC8qCisgICAqIHNlbmQgbWRhdCBoZWFkZXIgaWYgYWxyZWFkeSBuZWVkZWQsIGFuZCBtYXJrIHBvc2l0aW9uIGZvciBsYXRlciB1cGRhdGUuCisgICAqIFdlIGRvbid0IHNlbmQgZnR5cCBub3cgaWYgd2UgYXJlIG9uIGZhc3Qgc3RhcnQgbW9kZSwgYmVjYXVzZSB3ZSBjYW4KKyAgICogYmV0dGVyIGZpbmUgdHVuZSB1c2luZyB0aGUgaW5mb3JtYXRpb24gd2UgZ2F0aGVyIHRvIGNyZWF0ZSB0aGUgd2hvbGUgbW9vdgorICAgKiBhdG9tLgorICAgKi8KKyAgc3dpdGNoIChxdG11eC0+bXV4X21vZGUpIHsKKyAgICBjYXNlIEdTVF9RVF9NVVhfTU9ERV9NT09WX0FUX0VORDoKKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfcHJlcGFyZV9hbmRfc2VuZF9mdHlwIChxdG11eCk7CisgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICBicmVhazsKKworICAgICAgLyogU3RvcmUgdGhpcyBhcyB0aGUgbWRhdCBvZmZzZXQgZm9yIGxhdGVyIHVwZGF0aW5nCisgICAgICAgKiB3aGVuIHdlIHdyaXRlIHRoZSBtb292ICovCisgICAgICBxdG11eC0+bWRhdF9wb3MgPSBxdG11eC0+aGVhZGVyX3NpemU7CisgICAgICAvKiBleHRlbmRlZCBhdG9tIGluIGNhc2Ugd2UgZ28gb3ZlciA0R0Igd2hpbGUgd3JpdGluZyBhbmQgbmVlZAorICAgICAgICogdGhlIGZ1bGwgNjQtYml0IGF0b20gKi8KKyAgICAgIHJldCA9CisgICAgICAgICAgZ3N0X3F0X211eF9zZW5kX21kYXRfaGVhZGVyIChxdG11eCwgJnF0bXV4LT5oZWFkZXJfc2l6ZSwgMCwgVFJVRSwKKyAgICAgICAgICBGQUxTRSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9RVF9NVVhfTU9ERV9ST0JVU1RfUkVDT1JESU5HOgorICAgICAgcmV0ID0gZ3N0X3F0X211eF9wcmVwYXJlX2FuZF9zZW5kX2Z0eXAgKHF0bXV4KTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBQYWQgZnR5cCBvdXQgdG8gYW4gOC1ieXRlIGJvdW5kYXJ5IGJlZm9yZSBzdGFydGluZyB0aGUgbW9vdgorICAgICAgICogcGluZyBwb25nIHJlZ2lvbi4gSXQgc2hvdWxkIGJlIHdlbGwgbGVzcyB0aGFuIDEgZGlzayBzZWN0b3IsCisgICAgICAgKiB1bmxlc3MgdGhlcmUncyBhIGJhamlsbGlvbiBjb21wYXRpYmxlIHR5cGVzIGxpc3RlZCwKKyAgICAgICAqIGJ1dCBsZXQncyBiZSBzdXJlIHRoZSBmcmVlIGF0b20gZG9lc24ndCBjcm9zcyBhIHNlY3RvcgorICAgICAgICogYm91bmRhcnkgYW55d2F5ICovCisgICAgICBpZiAocXRtdXgtPmhlYWRlcl9zaXplICUgOCkgeworICAgICAgICAvKiBFeHRyYSA4IGJ5dGVzIGZvciB0aGUgcGFkZGluZyBmcmVlIGF0b20gaGVhZGVyICovCisgICAgICAgIGd1aW50IHBhZGRpbmcgPSAoZ3VpbnQpICgxNiAtIChxdG11eC0+aGVhZGVyX3NpemUgJSA4KSk7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgIlJvdW5kaW5nIGZ0eXAgYnkgJXUgYnl0ZXMiLCBwYWRkaW5nKTsKKyAgICAgICAgcmV0ID0KKyAgICAgICAgICAgIGdzdF9xdF9tdXhfc2VuZF9mcmVlX2F0b20gKHF0bXV4LCAmcXRtdXgtPmhlYWRlcl9zaXplLCBwYWRkaW5nLAorICAgICAgICAgICAgRkFMU0UpOworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICB9CisKKyAgICAgIC8qIFN0b3JlIHRoaXMgYXMgdGhlIG1vb3Ygb2Zmc2V0IGZvciBsYXRlciB1cGRhdGluZy4KKyAgICAgICAqIFdlIHJlY29yZCBtZGF0IHBvc2l0aW9uIGJlbG93ICovCisgICAgICBxdG11eC0+bW9vdl9wb3MgPSBxdG11eC0+aGVhZGVyX3NpemU7CisKKyAgICAgIC8qIFNldCB1cCB0aGUgaW5pdGlhbCAncGluZycgc3RhdGUgb2YgdGhlIHBpbmctcG9uZyBidWZmZXJzICovCisgICAgICBxdG11eC0+cmVzZXJ2ZWRfbW9vdl9maXJzdF9hY3RpdmUgPSBUUlVFOworCisgICAgICBnc3RfcXRfbXV4X2NvbmZpZ3VyZV9tb292IChxdG11eCk7CisgICAgICBnc3RfcXRfbXV4X3NldHVwX21ldGFkYXRhIChxdG11eCk7CisgICAgICAvKiBFbXB0eSBmcmVlIGF0b20gdG8gYmVnaW4sIHN0YXJ0aW5nIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAqLworICAgICAgcmV0ID0gZ3N0X3F0X211eF9zZW5kX2ZyZWVfYXRvbSAocXRtdXgsICZxdG11eC0+aGVhZGVyX3NpemUsIDgsIEZBTFNFKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIHJldHVybiByZXQ7CisgICAgICAvKiBNb292IGhlYWRlciwgbm90IHBhZGRlZCB5ZXQgKi8KKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9tb292IChxdG11eCwgJnF0bXV4LT5oZWFkZXJfc2l6ZSwgMCwgRkFMU0UsIEZBTFNFKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIHJldHVybiByZXQ7CisgICAgICAvKiBUaGUgbW9vdiB3ZSBqdXN0IHNlbnQgY29udGFpbnMgdGhlICdiYXNlJyBzaXplIG9mIHRoZSBtb292LCBiZWZvcmUKKyAgICAgICAqIHdlIHB1dCBpbiBhbnkgdGltZS1kZXBlbmRlbnQgcGVyLXRyYWsgZGF0YS4gVXNlIHRoYXQgdG8gbWFrZQorICAgICAgICogYSBnb29kIGVzdGltYXRlIG9mIGhvdyBtdWNoIGV4dHJhIHRvIHJlc2VydmUgKi8KKyAgICAgIC8qIENhbGN1bGF0ZSBob3cgbXVjaCBzcGFjZSB0byByZXNlcnZlIGZvciBvdXIgTU9PViBhdG9tLgorICAgICAgICogV2UgYWN0dWFsbHkgcmVzZXJ2ZSB0d2ljZSB0aGF0LCBmb3IgcGluZy1wb25nIGJ1ZmZlcnMgKi8KKyAgICAgIHF0bXV4LT5iYXNlX21vb3Zfc2l6ZSA9IHF0bXV4LT5sYXN0X21vb3Zfc2l6ZTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgIkJhc2UgbW9vdiBzaXplIGlzICV1IGJlZm9yZSBhbnkgaW5kZXhlcyIsCisgICAgICAgICAgcXRtdXgtPmJhc2VfbW9vdl9zaXplKTsKKyAgICAgIHF0bXV4LT5yZXNlcnZlZF9tb292X3NpemUgPSBxdG11eC0+YmFzZV9tb292X3NpemUgKworICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAocmVzZXJ2ZWRfbWF4X2R1cmF0aW9uLAorICAgICAgICAgIHJlc2VydmVkX2J5dGVzX3Blcl9zZWNfcGVyX3RyYWsgKgorICAgICAgICAgIGF0b21fbW9vdl9nZXRfdHJha19jb3VudCAocXRtdXgtPm1vb3YpLCBHU1RfU0VDT05EKTsKKworICAgICAgLyogTmVlZCBzcGFjZSBmb3IgYXQgbGVhc3QgNCBhdG9tIGhlYWRlcnMuIE1vcmUgcmVhbGx5LCBidXQKKyAgICAgICAqIHRoaXMgYXMgYW4gYWJzb2x1dGUgbWluaW11bSAqLworICAgICAgaWYgKHF0bXV4LT5yZXNlcnZlZF9tb292X3NpemUgPCA0ICogOCkKKyAgICAgICAgZ290byByZXNlcnZlZF9tb292X3Rvb19zbWFsbDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJyZXNlcnZpbmcgaGVhZGVyIGFyZWEgb2Ygc2l6ZSAldSIsCisgICAgICAgICAgMiAqIHF0bXV4LT5yZXNlcnZlZF9tb292X3NpemUgKyAxNik7CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocXRtdXgpOworICAgICAgcXRtdXgtPnJlc2VydmVkX2R1cmF0aW9uX3JlbWFpbmluZyA9CisgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChxdG11eC0+cmVzZXJ2ZWRfbW9vdl9zaXplIC0KKyAgICAgICAgICBxdG11eC0+YmFzZV9tb292X3NpemUsIEdTVF9TRUNPTkQsCisgICAgICAgICAgcmVzZXJ2ZWRfYnl0ZXNfcGVyX3NlY19wZXJfdHJhayAqCisgICAgICAgICAgYXRvbV9tb292X2dldF90cmFrX2NvdW50IChxdG11eC0+bW9vdikpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXV4KTsKKworICAgICAgLyogTm93IHRoYXQgd2Uga25vdyBob3cgbXVjaCByZXNlcnZlZCBzcGFjZSBpcyB0YXJnZXR0ZWQsCisgICAgICAgKiBvdXRwdXQgYSBmcmVlIGF0b20gdG8gZmlsbCB0aGUgZXh0cmEgcmVzZXJ2ZWQgKi8KKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9mcmVlX2F0b20gKHF0bXV4LCAmcXRtdXgtPmhlYWRlcl9zaXplLAorICAgICAgICAgIHF0bXV4LT5yZXNlcnZlZF9tb292X3NpemUgLSBxdG11eC0+YmFzZV9tb292X3NpemUsIEZBTFNFKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgIC8qIFRoZW4gYSBmcmVlIGF0b20gY29udGFpbmluZyAncG9uZycgYnVmZmVyLCB3aXRoIGFuCisgICAgICAgKiBleHRyYSA4IGJ5dGVzIHRvIGFjY291bnQgZm9yIHRoZSBmcmVlIGF0b20gaGVhZGVyIGl0c2VsZiAqLworICAgICAgcmV0ID0gZ3N0X3F0X211eF9zZW5kX2ZyZWVfYXRvbSAocXRtdXgsICZxdG11eC0+aGVhZGVyX3NpemUsCisgICAgICAgICAgcXRtdXgtPnJlc2VydmVkX21vb3Zfc2l6ZSArIDgsIEZBTFNFKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgIC8qIGV4dHJhIGF0b21zIGdvIGFmdGVyIHRoZSBmcmVlL21vb3YocyksIGJlZm9yZSB0aGUgbWRhdCAqLworICAgICAgcmV0ID0KKyAgICAgICAgICBnc3RfcXRfbXV4X3NlbmRfZXh0cmFfYXRvbXMgKHF0bXV4LCBUUlVFLCAmcXRtdXgtPmhlYWRlcl9zaXplLCBGQUxTRSk7CisgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgICBxdG11eC0+bWRhdF9wb3MgPSBxdG11eC0+aGVhZGVyX3NpemU7CisgICAgICAvKiBleHRlbmRlZCBhdG9tIGluIGNhc2Ugd2UgZ28gb3ZlciA0R0Igd2hpbGUgd3JpdGluZyBhbmQgbmVlZAorICAgICAgICogdGhlIGZ1bGwgNjQtYml0IGF0b20gKi8KKyAgICAgIHJldCA9CisgICAgICAgICAgZ3N0X3F0X211eF9zZW5kX21kYXRfaGVhZGVyIChxdG11eCwgJnF0bXV4LT5oZWFkZXJfc2l6ZSwgMCwgVFJVRSwKKyAgICAgICAgICBGQUxTRSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9RVF9NVVhfTU9ERV9ST0JVU1RfUkVDT1JESU5HX1BSRUZJTEw6CisgICAgICByZXQgPSBnc3RfcXRfbXV4X3ByZXBhcmVfYW5kX3NlbmRfZnR5cCAocXRtdXgpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFN0b3JlIHRoaXMgYXMgdGhlIG1vb3Ygb2Zmc2V0IGZvciBsYXRlciB1cGRhdGluZy4KKyAgICAgICAqIFdlIHJlY29yZCBtZGF0IHBvc2l0aW9uIGJlbG93ICovCisgICAgICBxdG11eC0+bW9vdl9wb3MgPSBxdG11eC0+aGVhZGVyX3NpemU7CisKKyAgICAgIGlmICghZ3N0X3F0X211eF9wcmVmaWxsX3NhbXBsZXMgKHF0bXV4KSkgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtdXgsIFNUUkVBTSwgTVVYLAorICAgICAgICAgICAgKCJVbnN1cHBvcnRlZCBjb2RlY3Mgb3IgY29uZmlndXJhdGlvbiBmb3IgcHJlZmlsbCBtb2RlIiksIChOVUxMKSk7CisKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICAgICAgfQorCisgICAgICBnc3RfcXRfbXV4X3VwZGF0ZV9nbG9iYWxfc3RhdGlzdGljcyAocXRtdXgpOworICAgICAgZ3N0X3F0X211eF9jb25maWd1cmVfbW9vdiAocXRtdXgpOworICAgICAgZ3N0X3F0X211eF91cGRhdGVfZWRpdF9saXN0cyAocXRtdXgpOworICAgICAgZ3N0X3F0X211eF9zZXR1cF9tZXRhZGF0YSAocXRtdXgpOworCisgICAgICAvKiBNb292IGhlYWRlciB3aXRoIHByZS1maWxsZWQgc2FtcGxlcyAqLworICAgICAgcmV0ID0gZ3N0X3F0X211eF9zZW5kX21vb3YgKHF0bXV4LCAmcXRtdXgtPmhlYWRlcl9zaXplLCAwLCBGQUxTRSwgRkFMU0UpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgLyogbGFzdF9tb292X3NpemUgbm93IGNvbnRhaW5zIHRoZSBmdWxsIHNpemUgb2YgdGhlIG1vb3YsIG1vb3ZfcG9zIHRoZQorICAgICAgICogcG9zaXRpb24uIFRoaXMgYWxsb3dzIHVzIHRvIHJld3JpdGUgaXQgaW4gdGhlIHZlcnkgZW5kIGFzIG5lZWRlZCAqLworICAgICAgcXRtdXgtPnJlc2VydmVkX21vb3Zfc2l6ZSA9CisgICAgICAgICAgcXRtdXgtPmxhc3RfbW9vdl9zaXplICsgMTIgKiBnX3NsaXN0X2xlbmd0aCAocXRtdXgtPnNpbmtwYWRzKSArIDg7CisKKyAgICAgIC8qIFNlbmQgYW4gYWRkaXRpb25hbCBmcmVlIGF0b20gYXQgdGhlIGVuZCBzbyB3ZSBkZWZpbml0ZWx5IGhhdmUgc3BhY2UKKyAgICAgICAqIHRvIHJld3JpdGUgdGhlIG1vb3YgaGVhZGVyIGF0IHRoZSBlbmQgYW5kIHJlbW92ZSB0aGUgc2FtcGxlcyB0aGF0CisgICAgICAgKiB3ZXJlIG5vdCBhY3R1YWxseSB3cml0dGVuICovCisgICAgICByZXQgPQorICAgICAgICAgIGdzdF9xdF9tdXhfc2VuZF9mcmVlX2F0b20gKHF0bXV4LCAmcXRtdXgtPmhlYWRlcl9zaXplLAorICAgICAgICAgIDEyICogZ19zbGlzdF9sZW5ndGggKHF0bXV4LT5zaW5rcGFkcykgKyA4LCBGQUxTRSk7CisgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAvKiBleHRyYSBhdG9tcyBnbyBhZnRlciB0aGUgZnJlZS9tb292KHMpLCBiZWZvcmUgdGhlIG1kYXQgKi8KKyAgICAgIHJldCA9CisgICAgICAgICAgZ3N0X3F0X211eF9zZW5kX2V4dHJhX2F0b21zIChxdG11eCwgVFJVRSwgJnF0bXV4LT5oZWFkZXJfc2l6ZSwgRkFMU0UpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgcXRtdXgtPm1kYXRfcG9zID0gcXRtdXgtPmhlYWRlcl9zaXplOworCisgICAgICAvKiBBbmQgbm93IHNlbmQgdGhlIG1kYXQgaGVhZGVyICovCisgICAgICByZXQgPQorICAgICAgICAgIGdzdF9xdF9tdXhfc2VuZF9tZGF0X2hlYWRlciAocXRtdXgsICZxdG11eC0+aGVhZGVyX3NpemUsCisgICAgICAgICAgcXRtdXgtPm1kYXRfc2l6ZSwgVFJVRSwgRkFMU0UpOworCisgICAgICAvKiBjaHVua3MgcG9zaXRpb24gaXMgc2V0IHJlbGF0aXZlIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZQorICAgICAgICogTURBVCBhdG9tIHBheWxvYWQuIFNldCB0aGUgb3ZlcmFsbCBvZmZzZXQgaW50byB0aGUgZmlsZSAqLworICAgICAgYXRvbV9tb292X2NodW5rc19zZXRfb2Zmc2V0IChxdG11eC0+bW9vdiwgcXRtdXgtPmhlYWRlcl9zaXplKTsKKworICAgICAgeworICAgICAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfQllURVMpOworICAgICAgICBzZWdtZW50LnN0YXJ0ID0gcXRtdXgtPm1vb3ZfcG9zOworICAgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHF0bXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKworICAgICAgICByZXQgPSBnc3RfcXRfbXV4X3NlbmRfbW9vdiAocXRtdXgsIE5VTEwsIDAsIEZBTFNFLCBGQUxTRSk7CisgICAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBzZWdtZW50LnN0YXJ0ID0gcXRtdXgtPmhlYWRlcl9zaXplOworICAgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHF0bXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKyAgICAgIH0KKworICAgICAgcXRtdXgtPmN1cnJlbnRfY2h1bmtfc2l6ZSA9IDA7CisgICAgICBxdG11eC0+Y3VycmVudF9jaHVua19kdXJhdGlvbiA9IDA7CisgICAgICBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQgPSAtMTsKKyAgICAgIHF0bXV4LT5tZGF0X3NpemUgPSAwOworICAgICAgcXRtdXgtPmN1cnJlbnRfcGFkID0gTlVMTDsKKyAgICAgIHF0bXV4LT5sb25nZXN0X2NodW5rID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICAgICAgZm9yICh3YWxrID0gcXRtdXgtPmNvbGxlY3QtPmRhdGE7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgICAgIEdzdENvbGxlY3REYXRhICpjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSB3YWxrLT5kYXRhOworICAgICAgICBHc3RRVFBhZCAqcXRwYWQgPSAoR3N0UVRQYWQgKikgY2RhdGE7CisKKyAgICAgICAgcXRwYWQtPnRvdGFsX2J5dGVzID0gMDsKKyAgICAgICAgcXRwYWQtPnRvdGFsX2R1cmF0aW9uID0gMDsKKyAgICAgICAgcXRwYWQtPmZpcnN0X2R0cyA9IHF0cGFkLT5maXJzdF90cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICAgIHF0cGFkLT5sYXN0X2R0cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICAgIHF0cGFkLT5zYW1wbGVfb2Zmc2V0ID0gMDsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUVRfTVVYX01PREVfRkFTVF9TVEFSVDoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocXRtdXgpOworICAgICAgcXRtdXgtPmZhc3Rfc3RhcnRfZmlsZSA9IGdfZm9wZW4gKHF0bXV4LT5mYXN0X3N0YXJ0X2ZpbGVfcGF0aCwgIndiKyIpOworICAgICAgaWYgKCFxdG11eC0+ZmFzdF9zdGFydF9maWxlKQorICAgICAgICBnb3RvIG9wZW5fZmFpbGVkOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXV4KTsKKyAgICAgIC8qIHNlbmQgYSBkdW1teSBidWZmZXIgZm9yIHByZXJvbGwgKi8KKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9idWZmZXIgKHF0bXV4LCBnc3RfYnVmZmVyX25ldyAoKSwgTlVMTCwgRkFMU0UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUVRfTVVYX01PREVfRlJBR01FTlRFRDoKKyAgICBjYXNlIEdTVF9RVF9NVVhfTU9ERV9GUkFHTUVOVEVEX1NUUkVBTUFCTEU6CisgICAgICByZXQgPSBnc3RfcXRfbXV4X3ByZXBhcmVfYW5kX3NlbmRfZnR5cCAocXRtdXgpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgYnJlYWs7CisgICAgICAvKiBzdG9yZSB0aGUgbW9vdiBwb3Mgc28gd2UgY2FuIHVwZGF0ZSB0aGUgZHVyYXRpb24gbGF0ZXIKKyAgICAgICAqIGluIG5vbi1zdHJlYW1hYmxlIG1vZGUgKi8KKyAgICAgIHF0bXV4LT5tb292X3BvcyA9IHF0bXV4LT5oZWFkZXJfc2l6ZTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJmcmFnbWVudCBkdXJhdGlvbiAlZCBtcywgd3JpdGluZyBoZWFkZXJzIiwKKyAgICAgICAgICBxdG11eC0+ZnJhZ21lbnRfZHVyYXRpb24pOworICAgICAgLyogYWxzbyB1c2VkIGFzIHNuYXBzaG90IG1hcmtlciB0byBpbmRpY2F0ZSBmcmFnbWVudGVkIGZpbGUgKi8KKyAgICAgIHF0bXV4LT5mcmFnbWVudF9zZXF1ZW5jZSA9IDE7CisgICAgICAvKiBwcmVwYXJlIG1vb3YgYW5kL29yIHRhZ3MgKi8KKyAgICAgIGdzdF9xdF9tdXhfY29uZmlndXJlX21vb3YgKHF0bXV4KTsKKyAgICAgIGdzdF9xdF9tdXhfc2V0dXBfbWV0YWRhdGEgKHF0bXV4KTsKKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9tb292IChxdG11eCwgJnF0bXV4LT5oZWFkZXJfc2l6ZSwgMCwgRkFMU0UsIEZBTFNFKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIHJldHVybiByZXQ7CisgICAgICAvKiBleHRyYSBhdG9tcyAqLworICAgICAgcmV0ID0KKyAgICAgICAgICBnc3RfcXRfbXV4X3NlbmRfZXh0cmFfYXRvbXMgKHF0bXV4LCBUUlVFLCAmcXRtdXgtPmhlYWRlcl9zaXplLCBGQUxTRSk7CisgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICBicmVhazsKKyAgICAgIC8qIHByZXBhcmUgaW5kZXggaWYgbm90IHN0cmVhbWFibGUgKi8KKyAgICAgIGlmIChxdG11eC0+bXV4X21vZGUgPT0gR1NUX1FUX01VWF9NT0RFX0ZSQUdNRU5URUQpCisgICAgICAgIHF0bXV4LT5tZnJhID0gYXRvbV9tZnJhX25ldyAocXRtdXgtPmNvbnRleHQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfaXNtbDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG11eCwgU1RSRUFNLCBNVVgsCisgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBhbiBJU01MIGZpbGUgd2l0aCAwIGZyYWdtZW50IGR1cmF0aW9uIiksIChOVUxMKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CityZXNlcnZlZF9tb292X3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG11eCwgU1RSRUFNLCBNVVgsCisgICAgICAgICgiTm90IGVub3VnaCByZXNlcnZlZCBzcGFjZSBmb3IgY3JlYXRpbmcgaGVhZGVycyIpLCAoTlVMTCkpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorb3Blbl9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtdXgsIFJFU09VUkNFLCBPUEVOX1JFQURfV1JJVEUsCisgICAgICAgICgoIkNvdWxkIG5vdCBvcGVuIHRlbXBvcmFyeSBmaWxlIFwiJXNcIiIpLAorICAgICAgICAgICAgcXRtdXgtPmZhc3Rfc3RhcnRfZmlsZV9wYXRoKSwgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXV4KTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfc2VuZF9sYXN0X2J1ZmZlcnMgKEdzdFFUTXV4ICogcXRtdXgpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdTTGlzdCAqd2FsazsKKworICBmb3IgKHdhbGsgPSBxdG11eC0+Y29sbGVjdC0+ZGF0YTsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RDb2xsZWN0RGF0YSAqY2RhdGEgPSAoR3N0Q29sbGVjdERhdGEgKikgd2Fsay0+ZGF0YTsKKyAgICBHc3RRVFBhZCAqcXRwYWQgPSAoR3N0UVRQYWQgKikgY2RhdGE7CisKKyAgICAvKiBhdm9pZCBhZGRfYnVmZmVyIGNvbXBsYWluaW5nIGlmIG5vdCBuZWdvdGlhdGVkCisgICAgICogaW4gd2hpY2ggY2FzZSBubyBidWZmZXJzIGVpdGhlciwgc28gc2tpcHBpbmcgKi8KKyAgICBpZiAoIXF0cGFkLT5mb3VyY2MpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiUGFkICVzIGhhcyBuZXZlciBoYWQgYnVmZmVycyIsCisgICAgICAgICAgR1NUX1BBRF9OQU1FIChxdHBhZC0+Y29sbGVjdC5wYWQpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIHNlbmQgbGFzdCBidWZmZXI7IGFsc28gZmx1c2hlcyBwb3NzaWJseSBxdWV1ZWQgYnVmZmVycy90cyAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiU2VuZGluZyB0aGUgbGFzdCBidWZmZXIgZm9yIHBhZCAlcyIsCisgICAgICAgIEdTVF9QQURfTkFNRSAocXRwYWQtPmNvbGxlY3QucGFkKSk7CisgICAgcmV0ID0gZ3N0X3F0X211eF9hZGRfYnVmZmVyIChxdG11eCwgcXRwYWQsIE5VTEwpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsICJGYWlsZWQgdG8gc2VuZCBsYXN0IGJ1ZmZlciBmb3IgJXMsICIKKyAgICAgICAgICAiZmxvdyByZXR1cm46ICVzIiwgR1NUX1BBRF9OQU1FIChxdHBhZC0+Y29sbGVjdC5wYWQpLAorICAgICAgICAgIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF91cGRhdGVfZ2xvYmFsX3N0YXRpc3RpY3MgKEdzdFFUTXV4ICogcXRtdXgpCit7CisgIEdTTGlzdCAqd2FsazsKKworICAvKiBmb3Igc2V0dGluZyBzb21lIHN1YnRpdGxlcyBmaWVsZHMgKi8KKyAgZ3VpbnQgbWF4X3dpZHRoID0gMDsKKyAgZ3VpbnQgbWF4X2hlaWdodCA9IDA7CisKKyAgcXRtdXgtPmZpcnN0X3RzID0gcXRtdXgtPmxhc3RfZHRzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBmb3IgKHdhbGsgPSBxdG11eC0+Y29sbGVjdC0+ZGF0YTsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RDb2xsZWN0RGF0YSAqY2RhdGEgPSAoR3N0Q29sbGVjdERhdGEgKikgd2Fsay0+ZGF0YTsKKyAgICBHc3RRVFBhZCAqcXRwYWQgPSAoR3N0UVRQYWQgKikgY2RhdGE7CisKKyAgICBpZiAoIXF0cGFkLT5mb3VyY2MpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiUGFkICVzIGhhcyBuZXZlciBoYWQgYnVmZmVycyIsCisgICAgICAgICAgR1NUX1BBRF9OQU1FIChxdHBhZC0+Y29sbGVjdC5wYWQpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIGhhdmluZyBmbHVzaGVkIGFib3ZlLCBjYW4gY2hlY2sgZm9yIGJ1ZmZlcnMgbm93ICovCisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChxdHBhZC0+Zmlyc3RfdHMpKSB7CisgICAgICBHc3RDbG9ja1RpbWUgZmlyc3RfcHRzX2luID0gcXRwYWQtPmZpcnN0X3RzOworICAgICAgLyogaXQgc2hvdWxkIGJlLCBzaW5jZSB3ZSBnb3QgZmlyc3RfdHMgYnkgYWRkaW5nIGFkanVzdG1lbnQKKyAgICAgICAqIHRvIGEgcG9zaXRpdmUgaW5jb21pbmcgUFRTICovCisgICAgICBpZiAocXRwYWQtPmR0c19hZGp1c3RtZW50IDw9IGZpcnN0X3B0c19pbikKKyAgICAgICAgZmlyc3RfcHRzX2luIC09IHF0cGFkLT5kdHNfYWRqdXN0bWVudDsKKyAgICAgIC8qIGRldGVybWluZSBtYXggc3RyZWFtIGR1cmF0aW9uICovCisgICAgICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChxdG11eC0+bGFzdF9kdHMpCisgICAgICAgICAgfHwgcXRwYWQtPmxhc3RfZHRzID4gcXRtdXgtPmxhc3RfZHRzKSB7CisgICAgICAgIHF0bXV4LT5sYXN0X2R0cyA9IHF0cGFkLT5sYXN0X2R0czsKKyAgICAgIH0KKyAgICAgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHF0bXV4LT5maXJzdF90cykKKyAgICAgICAgICB8fCBmaXJzdF9wdHNfaW4gPCBxdG11eC0+Zmlyc3RfdHMpIHsKKyAgICAgICAgLyogd2UgbmVlZCB0aGUgb3JpZ2luYWwgaW5jb21pbmcgUFRTIGhlcmUsIGFzIHRoaXMgZmlyc3RfdHMKKyAgICAgICAgICogaXMgdXNlZCBpbiB1cGRhdGVfZWRpdF9saXN0cyB0byBjb25zdHJ1Y3QgdGhlIGVkaXQgbGlzdCB0aGF0IGFycmFuZ2UKKyAgICAgICAgICogZm9yIHN5bmMnZWQgc3RyZWFtcy4gIFRoZSBmaXJzdF90cyBpcyBtb3N0IGxpa2VseSBvYnRhaW5lZCBmcm9tCisgICAgICAgICAqIHNvbWUgKGF1ZGlvKSBzdHJlYW0gd2l0aCAwIGR0c19hZGp1c3RtZW50IGFuZCBpbml0aWFsIDAgUFRTLAorICAgICAgICAgKiBzbyBpdCBtYWtlcyBubyBkaWZmZXJlbmNlLCB0aG91Z2ggaXQgbWF0dGVycyBpbiBvdGhlciBjYXNlcyAqLworICAgICAgICBxdG11eC0+Zmlyc3RfdHMgPSBmaXJzdF9wdHNfaW47CisgICAgICB9CisgICAgfQorCisgICAgLyogc3VidGl0bGVzIG5lZWQgdG8ga25vdyB0aGUgdmlkZW8gd2lkdGgvaGVpZ2h0LAorICAgICAqIGl0IGlzIHN0b3JlZCBzaGlmdGVkIDE2IGJpdHMgdG8gdGhlIGxlZnQgYWNjb3JkaW5nIHRvIHRoZQorICAgICAqIHNwZWMgKi8KKyAgICBtYXhfd2lkdGggPSBNQVggKG1heF93aWR0aCwgKHF0cGFkLT50cmFrLT50a2hkLndpZHRoID4+IDE2KSk7CisgICAgbWF4X2hlaWdodCA9IE1BWCAobWF4X2hlaWdodCwgKHF0cGFkLT50cmFrLT50a2hkLmhlaWdodCA+PiAxNikpOworCisgICAgLyogdXBkYXRlIGF2ZXJhZ2UgYml0cmF0ZSBvZiBzdHJlYW1zIGlmIG5lZWRlZCAqLworICAgIHsKKyAgICAgIGd1aW50MzIgYXZnYml0cmF0ZSA9IDA7CisgICAgICBndWludDMyIG1heGJpdHJhdGUgPSBxdHBhZC0+bWF4X2JpdHJhdGU7CisKKyAgICAgIGlmIChxdHBhZC0+YXZnX2JpdHJhdGUpCisgICAgICAgIGF2Z2JpdHJhdGUgPSBxdHBhZC0+YXZnX2JpdHJhdGU7CisgICAgICBlbHNlIGlmIChxdHBhZC0+dG90YWxfZHVyYXRpb24gPiAwKQorICAgICAgICBhdmdiaXRyYXRlID0gKGd1aW50MzIpIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAocXRwYWQtPnRvdGFsX2J5dGVzLAorICAgICAgICAgICAgOCAqIEdTVF9TRUNPTkQsIHF0cGFkLT50b3RhbF9kdXJhdGlvbik7CisKKyAgICAgIGF0b21fdHJha191cGRhdGVfYml0cmF0ZXMgKHF0cGFkLT50cmFrLCBhdmdiaXRyYXRlLCBtYXhiaXRyYXRlKTsKKyAgICB9CisgIH0KKworICAvKiBuZWVkIHRvIHVwZGF0ZSB2YWx1ZXMgb24gc3VidGl0bGUgdHJha3Mgbm93IHRoYXQgd2Uga25vdyB0aGUKKyAgICogbWF4IHdpZHRoIGFuZCBoZWlnaHQgKi8KKyAgZm9yICh3YWxrID0gcXRtdXgtPmNvbGxlY3QtPmRhdGE7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0Q29sbGVjdERhdGEgKmNkYXRhID0gKEdzdENvbGxlY3REYXRhICopIHdhbGstPmRhdGE7CisgICAgR3N0UVRQYWQgKnF0cGFkID0gKEdzdFFUUGFkICopIGNkYXRhOworCisgICAgaWYgKCFxdHBhZC0+Zm91cmNjKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIlBhZCAlcyBoYXMgbmV2ZXIgaGFkIGJ1ZmZlcnMiLAorICAgICAgICAgIEdTVF9QQURfTkFNRSAocXRwYWQtPmNvbGxlY3QucGFkKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAocXRwYWQtPmZvdXJjYyA9PSBGT1VSQ0NfdHgzZykgeworICAgICAgYXRvbV90cmFrX3R4M2dfdXBkYXRlX2RpbWVuc2lvbiAocXRwYWQtPnRyYWssIG1heF93aWR0aCwgbWF4X2hlaWdodCk7CisgICAgfQorICB9Cit9CisKKy8qIENhbGxlZCBhZnRlciBnc3RfcXRfbXV4X3VwZGF0ZV9nbG9iYWxfc3RhdGlzdGljcygpIHVwZGF0ZXMgdGhlCisgKiBmaXJzdF90cyB0cmFja2luZywgdG8gY3JlYXRlL3NldCBlZGl0IGxpc3RzIGZvciBkZWxheWVkIHN0cmVhbXMgKi8KK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X3VwZGF0ZV9lZGl0X2xpc3RzIChHc3RRVE11eCAqIHF0bXV4KQoreworICBHU0xpc3QgKndhbGs7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJNZWRpYSBmaXJzdCB0cyBzZWxlY3RlZDogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAocXRtdXgtPmZpcnN0X3RzKSk7CisgIC8qIGFkZC91cGRhdGUgRURUU3MgZm9yIGxhdGUgc3RyZWFtcy4gY29uZmlndXJlX21vb3Ygd2lsbCBoYXZlCisgICAqIHNldCB0aGUgdHJhayBkdXJhdGlvbnMgYWJvdmUgYnkgc3VtbWluZyB0aGUgc2FtcGxlIHRhYmxlcywKKyAgICogaGVyZSB3ZSBleHRlbmQgdGhhdCBpZiBuZWVkaW5nIHRvIGluc2VydCBhbiBlbXB0eSBzZWdtZW50ICovCisgIGZvciAod2FsayA9IHF0bXV4LT5jb2xsZWN0LT5kYXRhOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdENvbGxlY3REYXRhICpjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSB3YWxrLT5kYXRhOworICAgIEdzdFFUUGFkICpxdHBhZCA9IChHc3RRVFBhZCAqKSBjZGF0YTsKKworICAgIGF0b21fdHJha19lZHRzX2NsZWFyIChxdHBhZC0+dHJhayk7CisKKyAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHF0cGFkLT5maXJzdF90cykpIHsKKyAgICAgIGd1aW50MzIgbGF0ZW5lc3MgPSAwOworICAgICAgZ3VpbnQzMiBkdXJhdGlvbiA9IHF0cGFkLT50cmFrLT50a2hkLmR1cmF0aW9uOworICAgICAgZ2Jvb2xlYW4gaGFzX2dhcDsKKworICAgICAgaGFzX2dhcCA9IChxdHBhZC0+Zmlyc3RfdHMgPiAocXRtdXgtPmZpcnN0X3RzICsgcXRwYWQtPmR0c19hZGp1c3RtZW50KSk7CisKKyAgICAgIGlmIChoYXNfZ2FwKSB7CisgICAgICAgIEdzdENsb2NrVGltZSBkaWZmOworCisgICAgICAgIGRpZmYgPSBxdHBhZC0+Zmlyc3RfdHMgLSAocXRtdXgtPmZpcnN0X3RzICsgcXRwYWQtPmR0c19hZGp1c3RtZW50KTsKKyAgICAgICAgbGF0ZW5lc3MgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKGRpZmYsCisgICAgICAgICAgICBxdG11eC0+dGltZXNjYWxlLCBHU1RfU0VDT05EKTsKKworICAgICAgICBpZiAobGF0ZW5lc3MgPiAwKSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsCisgICAgICAgICAgICAgICJQYWQgJXMgaXMgYSBsYXRlIHN0cmVhbSBieSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgIEdTVF9QQURfTkFNRSAocXRwYWQtPmNvbGxlY3QucGFkKSwgR1NUX1RJTUVfQVJHUyAoZGlmZikpOworCisgICAgICAgICAgYXRvbV90cmFrX3NldF9lbHN0X2VudHJ5IChxdHBhZC0+dHJhaywgMCwgbGF0ZW5lc3MsIChndWludDMyKSAtIDEsCisgICAgICAgICAgICAgIChndWludDMyKSAoMSAqIDY1NTM2LjApKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBBbHdheXMgd3JpdGUgYW4gZWRpdCBsaXN0IGZvciB0aGUgd2hvbGUgdHJhY2suIEluIGdlbmVyYWwgdGhpcyBpcyBub3QKKyAgICAgICAqIG5lY2Vzc2FyeSBleGNlcHQgZm9yIHRoZSBjYXNlIG9mIGhhdmluZyBhIGdhcCBvciBEVFMgYWRqdXN0bWVudCBidXQKKyAgICAgICAqIGl0IGFsbG93cyB0byBnaXZlIHRoZSB3aG9sZSB0cmFjaydzIGR1cmF0aW9uIGluIHRoZSB1c3VhbGx5IG1vcmUKKyAgICAgICAqIGFjY3VyYXRlIG1lZGlhIHRpbWVzY2FsZQorICAgICAgICovCisgICAgICB7CisgICAgICAgIEdzdENsb2NrVGltZSBjdHRzID0gMDsKKyAgICAgICAgZ3VpbnQzMiBtZWRpYV9zdGFydDsKKworICAgICAgICBpZiAocXRwYWQtPmZpcnN0X3RzID4gcXRwYWQtPmZpcnN0X2R0cykKKyAgICAgICAgICBjdHRzID0gcXRwYWQtPmZpcnN0X3RzIC0gcXRwYWQtPmZpcnN0X2R0czsKKworICAgICAgICBtZWRpYV9zdGFydCA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAoY3R0cywKKyAgICAgICAgICAgIGF0b21fdHJha19nZXRfdGltZXNjYWxlIChxdHBhZC0+dHJhayksIEdTVF9TRUNPTkQpOworCisgICAgICAgIC8qIGF0b21fdHJha19zZXRfZWxzdF9lbnRyeSgpIGhhcyBhIHF1aXJrIC0gaWYgdGhlIGVkaXQgbGlzdAorICAgICAgICAgKiBpcyBlbXB0eSBiZWNhdXNlIHRoZXJlJ3Mgbm8gZ2FwIGFkZGVkIGFib3ZlLCB0aGlzIGNhbGwKKyAgICAgICAgICogd2lsbCBub3QgcmVwbGFjZSBpbmRleCAxLCBpdCB3aWxsIGNyZWF0ZSB0aGUgZW50cnkgYXQgaW5kZXggMC4KKyAgICAgICAgICogTHVja2lseSwgdGhhdCdzIGV4YWN0bHkgd2hhdCB3ZSB3YW50IGhlcmUgKi8KKyAgICAgICAgYXRvbV90cmFrX3NldF9lbHN0X2VudHJ5IChxdHBhZC0+dHJhaywgMSwgZHVyYXRpb24sIG1lZGlhX3N0YXJ0LAorICAgICAgICAgICAgKGd1aW50MzIpICgxICogNjU1MzYuMCkpOworICAgICAgfQorCisgICAgICAvKiBuZWVkIHRvIGFkZCB0aGUgZW1wdHkgdGltZSB0byB0aGUgdHJhayBkdXJhdGlvbiAqLworICAgICAgZHVyYXRpb24gKz0gbGF0ZW5lc3M7CisgICAgICBxdHBhZC0+dHJhay0+dGtoZC5kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgaWYgKHF0cGFkLT50Y190cmFrKSB7CisgICAgICAgIHF0cGFkLT50Y190cmFrLT50a2hkLmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgIHF0cGFkLT50Y190cmFrLT5tZGlhLm1kaGQudGltZV9pbmZvLmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICB9CisKKyAgICAgIC8qIEFuZCBwb3NzaWJseSBncm93IHRoZSBtb292IGR1cmF0aW9uICovCisgICAgICBpZiAoZHVyYXRpb24gPiBxdG11eC0+bW9vdi0+bXZoZC50aW1lX2luZm8uZHVyYXRpb24pIHsKKyAgICAgICAgcXRtdXgtPm1vb3YtPm12aGQudGltZV9pbmZvLmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgIHF0bXV4LT5tb292LT5tdmV4Lm1laGQuZnJhZ21lbnRfZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfdXBkYXRlX3RpbWVjb2RlIChHc3RRVE11eCAqIHF0bXV4LCBHc3RRVFBhZCAqIHF0cGFkKQoreworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ2NCBvZmZzZXQgPSBxdHBhZC0+dGNfcG9zOworICBHc3RRVE11eENsYXNzICpxdG11eF9rbGFzcyA9IChHc3RRVE11eENsYXNzICopIChHX09CSkVDVF9HRVRfQ0xBU1MgKHF0bXV4KSk7CisKKyAgaWYgKHF0bXV4X2tsYXNzLT5mb3JtYXQgIT0gR1NUX1FUX01VWF9GT1JNQVRfUVQpCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIGdfYXNzZXJ0IChxdHBhZC0+dGNfcG9zICE9IC0xKTsKKworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgIHNlZ21lbnQuc3RhcnQgPSBvZmZzZXQ7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAocXRtdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoNCk7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworCisgIEdTVF9XUklURV9VSU5UMzJfQkUgKG1hcC5kYXRhLAorICAgICAgZ3N0X3ZpZGVvX3RpbWVfY29kZV9mcmFtZXNfc2luY2VfZGFpbHlfamFtIChxdHBhZC0+Zmlyc3RfdGMpKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICAvKiBSZXNldCB0aGlzIHZhbHVlLCBzbyB0aGUgdGltZWNvZGUgd29uJ3QgYmUgcmUtcmV3cml0dGVuICovCisgIHF0cGFkLT50Y19wb3MgPSAtMTsKKworICByZXR1cm4gZ3N0X3F0X211eF9zZW5kX2J1ZmZlciAocXRtdXgsIGJ1ZiwgJm9mZnNldCwgRkFMU0UpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0X211eF9zdG9wX2ZpbGUgKEdzdFFUTXV4ICogcXRtdXgpCit7CisgIGdib29sZWFuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludDY0IG9mZnNldCA9IDAsIHNpemUgPSAwOworICBnYm9vbGVhbiBsYXJnZV9maWxlOworICBHU0xpc3QgKndhbGs7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJVcGRhdGluZyByZW1haW5pbmcgdmFsdWVzIGFuZCBzZW5kaW5nIGxhc3QgZGF0YSIpOworCisgIC8qIHB1c2hpbmcgbGFzdCBidWZmZXJzIGZvciBlYWNoIHBhZCAqLworICBpZiAoKHJldCA9IGdzdF9xdF9tdXhfc2VuZF9sYXN0X2J1ZmZlcnMgKHF0bXV4KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICBpZiAocXRtdXgtPm11eF9tb2RlID09IEdTVF9RVF9NVVhfTU9ERV9GUkFHTUVOVEVEX1NUUkVBTUFCTEUpIHsKKyAgICAvKiBTdHJlYW1hYmxlIG1vZGU7IG5vIG5lZWQgdG8gd3JpdGUgZHVyYXRpb24gb3IgTUZSQSAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAic3RyZWFtYWJsZSBmaWxlOyBub3RoaW5nIHRvIHN0b3AiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICBnc3RfcXRfbXV4X3VwZGF0ZV9nbG9iYWxfc3RhdGlzdGljcyAocXRtdXgpOworICBmb3IgKHdhbGsgPSBxdG11eC0+Y29sbGVjdC0+ZGF0YTsgd2Fsazsgd2FsayA9IHdhbGstPm5leHQpIHsKKyAgICBHc3RRVFBhZCAqcXRwYWQgPSAoR3N0UVRQYWQgKikgd2Fsay0+ZGF0YTsKKworICAgIGlmIChxdHBhZC0+dGNfcG9zICE9IC0xKSB7CisgICAgICAvKiBGaWxlIGlzIGJlaW5nIHN0b3BwZWQgYW5kIHRpbWVjb2RlIGhhc24ndCBiZWVuIHVwZGF0ZWQuIFVwZGF0ZSBpdCBub3cKKyAgICAgICAqIHdpdGggd2hhdGV2ZXIgd2UgaGF2ZSAqLworICAgICAgcmV0ID0gZ3N0X3F0X211eF91cGRhdGVfdGltZWNvZGUgKHF0bXV4LCBxdHBhZCk7CisgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgfQorCisgIHN3aXRjaCAocXRtdXgtPm11eF9tb2RlKSB7CisgICAgY2FzZSBHU1RfUVRfTVVYX01PREVfRlJBR01FTlRFRDp7CisgICAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgICAgICBndWludDggKmRhdGEgPSBOVUxMOworICAgICAgR3N0QnVmZmVyICpidWY7CisKKyAgICAgIHNpemUgPSBvZmZzZXQgPSAwOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJhZGRpbmcgbWZyYSIpOworICAgICAgaWYgKCFhdG9tX21mcmFfY29weV9kYXRhIChxdG11eC0+bWZyYSwgJmRhdGEsICZzaXplLCAmb2Zmc2V0KSkKKyAgICAgICAgZ290byBzZXJpYWxpemVfZXJyb3I7CisgICAgICBidWYgPSBfZ3N0X2J1ZmZlcl9uZXdfdGFrZV9kYXRhIChkYXRhLCBvZmZzZXQpOworICAgICAgcmV0ID0gZ3N0X3F0X211eF9zZW5kX2J1ZmZlciAocXRtdXgsIGJ1ZiwgTlVMTCwgRkFMU0UpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgLyogb25seSBtdmV4IGR1cmF0aW9uIGlzIHVwZGF0ZWQsCisgICAgICAgKiBtdmhkIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggZW1wdHkgbW9vdgorICAgICAgICogKGJ1dCBUT0RPIG1heWJlIHNvbWUgY2xpZW50cyBkbyBub3QgaGFuZGxlIHRoYXQgd2VsbCA/KSAqLworICAgICAgcXRtdXgtPm1vb3YtPm12ZXgubWVoZC5mcmFnbWVudF9kdXJhdGlvbiA9CisgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChxdG11eC0+bGFzdF9kdHMsIHF0bXV4LT50aW1lc2NhbGUsIEdTVF9TRUNPTkQpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJyZXdyaXRpbmcgbW9vdiB3aXRoIG12ZXggZHVyYXRpb24gJSIKKyAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHF0bXV4LT5sYXN0X2R0cykpOworICAgICAgLyogc2VlayBhbmQgcmV3cml0ZSB0aGUgaGVhZGVyICovCisgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgICAgICBzZWdtZW50LnN0YXJ0ID0gcXRtdXgtPm1vb3ZfcG9zOworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChxdG11eC0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSk7CisgICAgICAvKiBubyBuZWVkIHRvIHNlZWsgYmFjayAqLworICAgICAgcmV0dXJuIGdzdF9xdF9tdXhfc2VuZF9tb292IChxdG11eCwgTlVMTCwgMCwgRkFMU0UsIEZBTFNFKTsKKyAgICB9CisgICAgY2FzZSBHU1RfUVRfTVVYX01PREVfUk9CVVNUX1JFQ09SRElORzp7CisgICAgICByZXQgPSBnc3RfcXRfbXV4X3JvYnVzdF9yZWNvcmRpbmdfcmV3cml0ZV9tb292IChxdG11eCk7CisgICAgICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIC8qIEZpbmFsaXNlIGJ5IHdyaXRpbmcgdGhlIGZpbmFsIHNpemUgaW50byB0aGUgbWRhdC4gVXAgdW50aWwgbm93CisgICAgICAgKiBpdCdzIGJlZW4gMCwgd2hpY2ggbWVhbnMgJ3Jlc3Qgb2YgdGhlIGZpbGUnCisgICAgICAgKiBObyBuZWVkIHRvIHNlZWsgYmFjayBhZnRlciB0aGlzLCB3ZSB3b24ndCB3cml0ZSBhbnkgbW9yZSAqLworICAgICAgcmV0dXJuIGdzdF9xdF9tdXhfdXBkYXRlX21kYXRfc2l6ZSAocXRtdXgsIHF0bXV4LT5tZGF0X3BvcywKKyAgICAgICAgICBxdG11eC0+bWRhdF9zaXplLCBOVUxMLCBUUlVFKTsKKyAgICB9CisgICAgY2FzZSBHU1RfUVRfTVVYX01PREVfUk9CVVNUX1JFQ09SRElOR19QUkVGSUxMOnsKKyAgICAgIEdTTGlzdCAqd2FsazsKKyAgICAgIGd1aW50MzIgbmV4dF90cmFja19pZCA9IHF0bXV4LT5tb292LT5tdmhkLm5leHRfdHJhY2tfaWQ7CisKKyAgICAgIGZvciAod2FsayA9IHF0bXV4LT5jb2xsZWN0LT5kYXRhOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgICAgICBHc3RDb2xsZWN0RGF0YSAqY2RhdGEgPSAoR3N0Q29sbGVjdERhdGEgKikgd2Fsay0+ZGF0YTsKKyAgICAgICAgR3N0UVRQYWQgKnFwYWQgPSAoR3N0UVRQYWQgKikgY2RhdGE7CisgICAgICAgIGNvbnN0IFRyYWtCdWZmZXJFbnRyeUluZm8gKnNhbXBsZV9lbnRyeTsKKyAgICAgICAgZ3VpbnQ2NCBibG9ja19pZHg7CisgICAgICAgIEF0b21TVEJMICpzdGJsID0gJnFwYWQtPnRyYWstPm1kaWEubWluZi5zdGJsOworCisgICAgICAgIC8qIEdldCB0aGUgYmxvY2sgaW5kZXggb2YgdGhlIGxhc3Qgc2FtcGxlIHdlIHdyb3RlLCBub3Qgb2YgdGhlIG5leHQKKyAgICAgICAgICogc2FtcGxlIHdlIHdvdWxkIHdyaXRlICovCisgICAgICAgIGJsb2NrX2lkeCA9IHByZWZpbGxfZ2V0X2Jsb2NrX2luZGV4IChxdG11eCwgcXBhZCk7CisgICAgICAgIGdfYXNzZXJ0IChibG9ja19pZHggPiAwKTsKKyAgICAgICAgYmxvY2tfaWR4LS07CisKKyAgICAgICAgc2FtcGxlX2VudHJ5ID0KKyAgICAgICAgICAgICZnX2FycmF5X2luZGV4IChxcGFkLT5zYW1wbGVzLCBUcmFrQnVmZmVyRW50cnlJbmZvLCBibG9ja19pZHgpOworCisgICAgICAgIC8qIHN0dHMgKi8KKyAgICAgICAgeworICAgICAgICAgIFNUVFNFbnRyeSAqZW50cnk7CisgICAgICAgICAgZ3VpbnQ2NCBuc2FtcGxlcyA9IDA7CisgICAgICAgICAgZ2ludCBpLCBuOworCisgICAgICAgICAgbiA9IGF0b21fYXJyYXlfZ2V0X2xlbiAoJnN0YmwtPnN0dHMuZW50cmllcyk7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgZW50cnkgPSAmYXRvbV9hcnJheV9pbmRleCAoJnN0YmwtPnN0dHMuZW50cmllcywgaSk7CisgICAgICAgICAgICBpZiAobnNhbXBsZXMgKyBlbnRyeS0+c2FtcGxlX2NvdW50ID49IHFwYWQtPnNhbXBsZV9vZmZzZXQpIHsKKyAgICAgICAgICAgICAgZW50cnktPnNhbXBsZV9jb3VudCA9IHFwYWQtPnNhbXBsZV9vZmZzZXQgLSBuc2FtcGxlczsKKyAgICAgICAgICAgICAgc3RibC0+c3R0cy5lbnRyaWVzLmxlbiA9IGkgKyAxOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5zYW1wbGVzICs9IGVudHJ5LT5zYW1wbGVfY291bnQ7CisgICAgICAgICAgfQorICAgICAgICAgIGdfYXNzZXJ0IChpIDwgbik7CisgICAgICAgIH0KKworICAgICAgICAvKiBzdHN6ICovCisgICAgICAgIHsKKyAgICAgICAgICBnX2Fzc2VydCAoc3RibC0+c3Rzei5lbnRyaWVzLmxlbiA9PSAwKTsKKyAgICAgICAgICBzdGJsLT5zdHN6LnRhYmxlX3NpemUgPSBxcGFkLT5zYW1wbGVfb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgLyogc3Rjby9zdHNjICovCisgICAgICAgIHsKKyAgICAgICAgICBnaW50IGksIG47CisgICAgICAgICAgZ3VpbnQ2NCBuc2FtcGxlcyA9IDA7CisgICAgICAgICAgZ2ludCBjaHVua19pbmRleCA9IDA7CisKKyAgICAgICAgICBuID0gc3RibC0+c3RjbzY0LmVudHJpZXMubGVuOworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGd1aW50NjQgKmVudHJ5ID0gJmF0b21fYXJyYXlfaW5kZXggKCZzdGJsLT5zdGNvNjQuZW50cmllcywgaSk7CisKKyAgICAgICAgICAgIGlmICgqZW50cnkgPT0gc2FtcGxlX2VudHJ5LT5jaHVua19vZmZzZXQpIHsKKyAgICAgICAgICAgICAgc3RibC0+c3RjbzY0LmVudHJpZXMubGVuID0gaSArIDE7CisgICAgICAgICAgICAgIGNodW5rX2luZGV4ID0gaSArIDE7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBnX2Fzc2VydCAoaSA8IG4pOworICAgICAgICAgIGdfYXNzZXJ0IChjaHVua19pbmRleCA+IDApOworCisgICAgICAgICAgbiA9IHN0YmwtPnN0c2MuZW50cmllcy5sZW47CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgU1RTQ0VudHJ5ICplbnRyeSA9ICZhdG9tX2FycmF5X2luZGV4ICgmc3RibC0+c3RzYy5lbnRyaWVzLCBpKTsKKworICAgICAgICAgICAgaWYgKGVudHJ5LT5maXJzdF9jaHVuayA+PSBjaHVua19pbmRleCkKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICBuc2FtcGxlcyArPQorICAgICAgICAgICAgICAgICAgKGVudHJ5LT5maXJzdF9jaHVuayAtIGF0b21fYXJyYXlfaW5kZXggKCZzdGJsLT5zdHNjLmVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgaSAtCisgICAgICAgICAgICAgICAgICAgICAgMSkuZmlyc3RfY2h1bmspICogYXRvbV9hcnJheV9pbmRleCAoJnN0YmwtPnN0c2MuZW50cmllcywKKyAgICAgICAgICAgICAgICAgIGkgLSAxKS5zYW1wbGVzX3Blcl9jaHVuazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZ19hc3NlcnQgKGkgPD0gbik7CisKKyAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIFNUU0NFbnRyeSAqcHJldl9lbnRyeSA9CisgICAgICAgICAgICAgICAgJmF0b21fYXJyYXlfaW5kZXggKCZzdGJsLT5zdHNjLmVudHJpZXMsIGkgLSAxKTsKKyAgICAgICAgICAgIG5zYW1wbGVzICs9CisgICAgICAgICAgICAgICAgKGNodW5rX2luZGV4IC0KKyAgICAgICAgICAgICAgICBwcmV2X2VudHJ5LT5maXJzdF9jaHVuaykgKiBwcmV2X2VudHJ5LT5zYW1wbGVzX3Blcl9jaHVuazsKKyAgICAgICAgICAgIGlmIChxcGFkLT5zYW1wbGVfb2Zmc2V0IC0gbnNhbXBsZXMgPiAwKSB7CisgICAgICAgICAgICAgIHN0YmwtPnN0c2MuZW50cmllcy5sZW4gPSBpOworICAgICAgICAgICAgICBhdG9tX3N0c2NfYWRkX25ld19lbnRyeSAoJnN0YmwtPnN0c2MsIGNodW5rX2luZGV4LAorICAgICAgICAgICAgICAgICAgcXBhZC0+c2FtcGxlX29mZnNldCAtIG5zYW1wbGVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHN0YmwtPnN0c2MuZW50cmllcy5sZW4gPSBpOworICAgICAgICAgICAgICBzdGJsLT5zdGNvNjQuZW50cmllcy5sZW4tLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogRXZlcnl0aGluZyBpbiBhIHNpbmdsZSBjaHVuayAqLworICAgICAgICAgICAgc3RibC0+c3RzYy5lbnRyaWVzLmxlbiA9IDA7CisgICAgICAgICAgICBhdG9tX3N0c2NfYWRkX25ld19lbnRyeSAoJnN0YmwtPnN0c2MsIGNodW5rX2luZGV4LAorICAgICAgICAgICAgICAgIHFwYWQtPnNhbXBsZV9vZmZzZXQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICBHTGlzdCAqd2FsazI7CisKKyAgICAgICAgICBmb3IgKHdhbGsyID0gcXRtdXgtPm1vb3YtPm12ZXgudHJleHM7IHdhbGsyOyB3YWxrMiA9IHdhbGsyLT5uZXh0KSB7CisgICAgICAgICAgICBBdG9tVFJFWCAqdHJleCA9IHdhbGsyLT5kYXRhOworCisgICAgICAgICAgICBpZiAodHJleC0+dHJhY2tfSUQgPT0gcXBhZC0+dHJhay0+dGtoZC50cmFja19JRCkgeworICAgICAgICAgICAgICB0cmV4LT50cmFja19JRCA9IG5leHRfdHJhY2tfaWQ7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHFwYWQtPnRyYWstPnRraGQudHJhY2tfSUQgPSBuZXh0X3RyYWNrX2lkKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHF0bXV4LT5tb292LT5tdmhkLm5leHRfdHJhY2tfaWQgPSBuZXh0X3RyYWNrX2lkOworCisgICAgICBnc3RfcXRfbXV4X3VwZGF0ZV9nbG9iYWxfc3RhdGlzdGljcyAocXRtdXgpOworICAgICAgZ3N0X3F0X211eF9jb25maWd1cmVfbW9vdiAocXRtdXgpOworCisgICAgICBnc3RfcXRfbXV4X3VwZGF0ZV9lZGl0X2xpc3RzIChxdG11eCk7CisKKyAgICAgIC8qIENoZWNrIGlmIGFueSBnYXAgZWRpdCBsaXN0cyB3ZXJlIGFkZGVkLiBXZSBkb24ndCBoYXZlIGFueSBzcGFjZQorICAgICAgICogcmVzZXJ2ZWQgZm9yIHRoaXMgaW4gdGhlIG1vb3YgYW5kIHRoZSBwcmUtZmluYWxpemVkIG1vb3Ygd291bGQgaGF2ZQorICAgICAgICogYnJva2VuIEEvViBzeW5jaHJvbml6YXRpb24uIEVycm9yIG91dCBoZXJlIG5vdworICAgICAgICovCisgICAgICBmb3IgKHdhbGsgPSBxdG11eC0+Y29sbGVjdC0+ZGF0YTsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICAgICAgR3N0Q29sbGVjdERhdGEgKmNkYXRhID0gKEdzdENvbGxlY3REYXRhICopIHdhbGstPmRhdGE7CisgICAgICAgIEdzdFFUUGFkICpxcGFkID0gKEdzdFFUUGFkICopIGNkYXRhOworCisgICAgICAgIGlmIChxcGFkLT50cmFrLT5lZHRzCisgICAgICAgICAgICAmJiBnX3NsaXN0X2xlbmd0aCAocXBhZC0+dHJhay0+ZWR0cy0+ZWxzdC5lbnRyaWVzKSA+IDEpIHsKKyAgICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksCisgICAgICAgICAgICAgICgiQ2FuJ3Qgc3VwcG9ydCBnYXBzIGluIHByZWZpbGwgbW9kZSIpKTsKKworICAgICAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBnc3RfcXRfbXV4X3NldHVwX21ldGFkYXRhIChxdG11eCk7CisgICAgICBhdG9tX21vb3ZfY2h1bmtzX3NldF9vZmZzZXQgKHF0bXV4LT5tb292LCBxdG11eC0+aGVhZGVyX3NpemUpOworCisgICAgICB7CisgICAgICAgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICAgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgICAgICAgIHNlZ21lbnQuc3RhcnQgPSBxdG11eC0+bW9vdl9wb3M7CisgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocXRtdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgICAgICAgIHJldCA9CisgICAgICAgICAgICBnc3RfcXRfbXV4X3NlbmRfbW9vdiAocXRtdXgsIE5VTEwsIHF0bXV4LT5yZXNlcnZlZF9tb292X3NpemUsIEZBTFNFLAorICAgICAgICAgICAgRkFMU0UpOworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKHF0bXV4LT5yZXNlcnZlZF9tb292X3NpemUgPiBxdG11eC0+bGFzdF9tb292X3NpemUpIHsKKyAgICAgICAgICByZXQgPQorICAgICAgICAgICAgICBnc3RfcXRfbXV4X3NlbmRfZnJlZV9hdG9tIChxdG11eCwgTlVMTCwKKyAgICAgICAgICAgICAgcXRtdXgtPnJlc2VydmVkX21vb3Zfc2l6ZSAtIHF0bXV4LT5sYXN0X21vb3Zfc2l6ZSwgVFJVRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICB9CisKKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfdXBkYXRlX21kYXRfc2l6ZSAocXRtdXgsIHF0bXV4LT5tZGF0X3BvcywKKyAgICAgICAgICBxdG11eC0+bWRhdF9zaXplLCBOVUxMLCBGQUxTRSk7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBNb292LWF0LWVuZCBvciBmYXN0LXN0YXJ0IG1vZGUgZnJvbSBoZXJlIGRvd24gKi8KKyAgZ3N0X3F0X211eF9jb25maWd1cmVfbW9vdiAocXRtdXgpOworCisgIGdzdF9xdF9tdXhfdXBkYXRlX2VkaXRfbGlzdHMgKHF0bXV4KTsKKworICAvKiB0YWdzIGludG8gZmlsZSBtZXRhZGF0YSAqLworICBnc3RfcXRfbXV4X3NldHVwX21ldGFkYXRhIChxdG11eCk7CisKKyAgbGFyZ2VfZmlsZSA9IChxdG11eC0+bWRhdF9zaXplID4gTURBVF9MQVJHRV9GSUxFX0xJTUlUKTsKKworICBzd2l0Y2ggKHF0bXV4LT5tdXhfbW9kZSkgeworICAgIGNhc2UgR1NUX1FUX01VWF9NT0RFX0ZBU1RfU1RBUlQ6eworICAgICAgLyogaWYgZmFzdHN0YXJ0LCB1cGRhdGUgdGhlIG9mZnNldCBvZiB0aGUgYXRvbXMgaW4gdGhlIG1vdmllIHdpdGggdGhlIG9mZnNldAorICAgICAgICogdGhhdCB0aGUgbW92aWUgaGVhZGVycyBiZWZvcmUgbWRhdCB3aWxsIGNhdXNlLgorICAgICAgICogQWxzbywgc2VuZCB0aGUgZnR5cCAqLworICAgICAgb2Zmc2V0ID0gc2l6ZSA9IDA7CisKKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfcHJlcGFyZV9hbmRfc2VuZF9mdHlwIChxdG11eCk7CisgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgICAgIGdvdG8gZnR5cF9lcnJvcjsKKyAgICAgIH0KKyAgICAgIC8qIGNvcHkgaW50byBOVUxMIHRvIG9idGFpbiBzaXplICovCisgICAgICBpZiAoIWF0b21fbW9vdl9jb3B5X2RhdGEgKHF0bXV4LT5tb292LCBOVUxMLCAmc2l6ZSwgJm9mZnNldCkpCisgICAgICAgIGdvdG8gc2VyaWFsaXplX2Vycm9yOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJjYWxjdWxhdGVkIG1vb3YgYXRvbSBzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCArPSBxdG11eC0+aGVhZGVyX3NpemUgKyAobGFyZ2VfZmlsZSA/IDE2IDogOCk7CisKKyAgICAgIC8qIHN1bSB1cCB3aXRoIHRoZSBleHRyYSBhdG9tcyBzaXplICovCisgICAgICByZXQgPSBnc3RfcXRfbXV4X3NlbmRfZXh0cmFfYXRvbXMgKHF0bXV4LCBGQUxTRSwgJm9mZnNldCwgRkFMU0UpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgb2Zmc2V0ID0gcXRtdXgtPmhlYWRlcl9zaXplOworICAgICAgYnJlYWs7CisgIH0KKworICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBzaXplIG9mIG1vb3YgKyBleHRyYSBhdG9tcywgd2UgY2FuIGFkanVzdAorICAgKiB0aGUgY2h1bmsgb2Zmc2V0cyBzdG9yZWQgaW50byB0aGUgbW9vdiAqLworICBhdG9tX21vb3ZfY2h1bmtzX3NldF9vZmZzZXQgKHF0bXV4LT5tb292LCBvZmZzZXQpOworCisgIC8qIHdyaXRlIG91dCBtb292IGFuZCBleHRyYSBhdG9tcyAqLworICAvKiBub3RlOiBhcyBvZiB0aGlzIHBvaW50LCB3ZSBubyBsb25nZXIgY2FyZSBhYm91dCB0cmFja2luZyB3cml0dGVuIGRhdGEgc2l6ZSwKKyAgICogc2luY2UgdGhlcmUgaXMgbm8gbW9yZSB1c2UgZm9yIGl0IGFueXdheSAqLworICByZXQgPSBnc3RfcXRfbXV4X3NlbmRfbW9vdiAocXRtdXgsIE5VTEwsIDAsIEZBTFNFLCBGQUxTRSk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICAvKiBleHRyYSBhdG9tcyAqLworICByZXQgPSBnc3RfcXRfbXV4X3NlbmRfZXh0cmFfYXRvbXMgKHF0bXV4LCBUUlVFLCBOVUxMLCBGQUxTRSk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICBzd2l0Y2ggKHF0bXV4LT5tdXhfbW9kZSkgeworICAgIGNhc2UgR1NUX1FUX01VWF9NT0RFX01PT1ZfQVRfRU5EOgorICAgIHsKKyAgICAgIC8qIG1kYXQgbmVlZHMgdXBkYXRlIGlmZiBub3QgdXNpbmcgZmFzdHN0YXJ0ICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgInVwZGF0aW5nIG1kYXQgc2l6ZSIpOworICAgICAgcmV0ID0gZ3N0X3F0X211eF91cGRhdGVfbWRhdF9zaXplIChxdG11eCwgcXRtdXgtPm1kYXRfcG9zLAorICAgICAgICAgIHF0bXV4LT5tZGF0X3NpemUsIE5VTEwsIEZBTFNFKTsKKyAgICAgIC8qIG5vdGU7IG5vIHNlZWtpbmcgYmFjayB0byB0aGUgZW5kIG9mIGZpbGUgaXMgZG9uZSwKKyAgICAgICAqIHNpbmNlIHdlIG5vIGxvbmdlciB3cml0ZSBhbnl0aGluZyBhbnl3YXkgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVF9NVVhfTU9ERV9GQVNUX1NUQVJUOgorICAgIHsKKyAgICAgIC8qIHNlbmQgbWRhdCBhdG9tIGFuZCBtb3ZlIGJ1ZmZlcmVkIGRhdGEgaW50byBpdCAqLworICAgICAgLyogbWRhdF9zaXplID0gYWNjdW11bGF0ZWQgKGJ1ZmZlcmVkIGRhdGEpICovCisgICAgICByZXQgPSBnc3RfcXRfbXV4X3NlbmRfbWRhdF9oZWFkZXIgKHF0bXV4LCBOVUxMLCBxdG11eC0+bWRhdF9zaXplLAorICAgICAgICAgIGxhcmdlX2ZpbGUsIEZBTFNFKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIHJldHVybiByZXQ7CisgICAgICByZXQgPSBnc3RfcXRfbXV4X3NlbmRfYnVmZmVyZWRfZGF0YSAocXRtdXgsIE5VTEwpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgIH0KKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworc2VyaWFsaXplX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXV4LCBTVFJFQU0sIE1VWCwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBzZXJpYWxpemUgbW9vdiIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2Z0eXBfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksICgiRmFpbGVkIHRvIHNlbmQgZnR5cCIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfcGFkX2ZyYWdtZW50X2FkZF9idWZmZXIgKEdzdFFUTXV4ICogcXRtdXgsIEdzdFFUUGFkICogcGFkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZiwgZ2Jvb2xlYW4gZm9yY2UsIGd1aW50MzIgbnNhbXBsZXMsIGdpbnQ2NCBkdHMsCisgICAgZ3VpbnQzMiBkZWx0YSwgZ3VpbnQzMiBzaXplLCBnYm9vbGVhbiBzeW5jLCBnaW50NjQgcHRzX29mZnNldCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICAvKiBzZXR1cCBpZiBuZWVkZWQgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKCFwYWQtPnRyYWYgfHwgZm9yY2UpKQorICAgIGdvdG8gaW5pdDsKKworZmx1c2g6CisgIC8qIGZsdXNoIHBhZCBmcmFnbWVudCBpZiB0aHJlc2hvbGQgcmVhY2hlZCwKKyAgICogb3IgYXQgbmV3IGtleWZyYW1lIGlmIHdlIHNob3VsZCBiZSBtaW5kaW5nIHRob3NlIGluIHRoZSBmaXJzdCBwbGFjZSAqLworICBpZiAoR19VTkxJS0VMWSAoZm9yY2UgfHwgKHN5bmMgJiYgcGFkLT5zeW5jKSB8fAorICAgICAgICAgIHBhZC0+ZnJhZ21lbnRfZHVyYXRpb24gPCAoZ2ludDY0KSBkZWx0YSkpIHsKKyAgICBBdG9tTU9PRiAqbW9vZjsKKyAgICBndWludDY0IHNpemUgPSAwLCBvZmZzZXQgPSAwOworICAgIGd1aW50OCAqZGF0YSA9IE5VTEw7CisgICAgR3N0QnVmZmVyICpidWZmZXI7CisgICAgZ3VpbnQgaSwgdG90YWxfc2l6ZTsKKworICAgIC8qIG5vdyB3ZSBrbm93IHdoZXJlIG1vb2YgZW5kcyB1cCwgdXBkYXRlIG9mZnNldCBpbiB0ZnJhICovCisgICAgaWYgKHBhZC0+dGZyYSkKKyAgICAgIGF0b21fdGZyYV91cGRhdGVfb2Zmc2V0IChwYWQtPnRmcmEsIHF0bXV4LT5oZWFkZXJfc2l6ZSk7CisKKyAgICBtb29mID0gYXRvbV9tb29mX25ldyAocXRtdXgtPmNvbnRleHQsIHF0bXV4LT5mcmFnbWVudF9zZXF1ZW5jZSk7CisgICAgLyogdGFrZXMgb3duZXJzaGlwICovCisgICAgYXRvbV9tb29mX2FkZF90cmFmIChtb29mLCBwYWQtPnRyYWYpOworICAgIHBhZC0+dHJhZiA9IE5VTEw7CisgICAgYXRvbV9tb29mX2NvcHlfZGF0YSAobW9vZiwgJmRhdGEsICZzaXplLCAmb2Zmc2V0KTsKKyAgICBidWZmZXIgPSBfZ3N0X2J1ZmZlcl9uZXdfdGFrZV9kYXRhIChkYXRhLCBvZmZzZXQpOworICAgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgIndyaXRpbmcgbW9vZiBzaXplICUiIEdfR1NJWkVfRk9STUFULAorICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpKTsKKyAgICByZXQgPSBnc3RfcXRfbXV4X3NlbmRfYnVmZmVyIChxdG11eCwgYnVmZmVyLCAmcXRtdXgtPmhlYWRlcl9zaXplLCBGQUxTRSk7CisKKyAgICAvKiBhbmQgYWN0dWFsIGRhdGEgKi8KKyAgICB0b3RhbF9zaXplID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXRvbV9hcnJheV9nZXRfbGVuICgmcGFkLT5mcmFnbWVudF9idWZmZXJzKTsgaSsrKSB7CisgICAgICB0b3RhbF9zaXplICs9CisgICAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYXRvbV9hcnJheV9pbmRleCAoJnBhZC0+ZnJhZ21lbnRfYnVmZmVycywgaSkpOworICAgIH0KKworICAgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgIndyaXRpbmcgJWQgYnVmZmVycywgdG90YWxfc2l6ZSAlZCIsCisgICAgICAgIGF0b21fYXJyYXlfZ2V0X2xlbiAoJnBhZC0+ZnJhZ21lbnRfYnVmZmVycyksIHRvdGFsX3NpemUpOworICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT0spCisgICAgICByZXQgPSBnc3RfcXRfbXV4X3NlbmRfbWRhdF9oZWFkZXIgKHF0bXV4LCAmcXRtdXgtPmhlYWRlcl9zaXplLCB0b3RhbF9zaXplLAorICAgICAgICAgIEZBTFNFLCBGQUxTRSk7CisgICAgZm9yIChpID0gMDsgaSA8IGF0b21fYXJyYXlfZ2V0X2xlbiAoJnBhZC0+ZnJhZ21lbnRfYnVmZmVycyk7IGkrKykgeworICAgICAgaWYgKEdfTElLRUxZIChyZXQgPT0gR1NUX0ZMT1dfT0spKQorICAgICAgICByZXQgPSBnc3RfcXRfbXV4X3NlbmRfYnVmZmVyIChxdG11eCwKKyAgICAgICAgICAgIGF0b21fYXJyYXlfaW5kZXggKCZwYWQtPmZyYWdtZW50X2J1ZmZlcnMsIGkpLCAmcXRtdXgtPmhlYWRlcl9zaXplLAorICAgICAgICAgICAgRkFMU0UpOworICAgICAgZWxzZQorICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChhdG9tX2FycmF5X2luZGV4ICgmcGFkLT5mcmFnbWVudF9idWZmZXJzLCBpKSk7CisgICAgfQorCisgICAgYXRvbV9hcnJheV9jbGVhciAoJnBhZC0+ZnJhZ21lbnRfYnVmZmVycyk7CisgICAgYXRvbV9tb29mX2ZyZWUgKG1vb2YpOworICAgIHF0bXV4LT5mcmFnbWVudF9zZXF1ZW5jZSsrOworICAgIGZvcmNlID0gRkFMU0U7CisgIH0KKworaW5pdDoKKyAgaWYgKEdfVU5MSUtFTFkgKCFwYWQtPnRyYWYpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHF0bXV4LCAic2V0dGluZyB1cCBuZXcgZnJhZ21lbnQiKTsKKyAgICBwYWQtPnRyYWYgPSBhdG9tX3RyYWZfbmV3IChxdG11eC0+Y29udGV4dCwgYXRvbV90cmFrX2dldF9pZCAocGFkLT50cmFrKSk7CisgICAgYXRvbV9hcnJheV9pbml0ICgmcGFkLT5mcmFnbWVudF9idWZmZXJzLCA1MTIpOworICAgIHBhZC0+ZnJhZ21lbnRfZHVyYXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHF0bXV4LT5mcmFnbWVudF9kdXJhdGlvbiwKKyAgICAgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHBhZC0+dHJhayksIDEwMDApOworCisgICAgaWYgKEdfVU5MSUtFTFkgKHF0bXV4LT5tZnJhICYmICFwYWQtPnRmcmEpKSB7CisgICAgICBwYWQtPnRmcmEgPSBhdG9tX3RmcmFfbmV3IChxdG11eC0+Y29udGV4dCwgYXRvbV90cmFrX2dldF9pZCAocGFkLT50cmFrKSk7CisgICAgICBhdG9tX21mcmFfYWRkX3RmcmEgKHF0bXV4LT5tZnJhLCBwYWQtPnRmcmEpOworICAgIH0KKyAgICBhdG9tX3RyYWZfc2V0X2Jhc2VfZGVjb2RlX3RpbWUgKHBhZC0+dHJhZiwgZHRzKTsKKyAgfQorCisgIC8qIGFkZCBidWZmZXIgYW5kIG1ldGFkYXRhICovCisgIGF0b21fdHJhZl9hZGRfc2FtcGxlcyAocGFkLT50cmFmLCBkZWx0YSwgc2l6ZSwgc3luYywgcHRzX29mZnNldCwKKyAgICAgIHBhZC0+c3luYyAmJiBzeW5jKTsKKyAgYXRvbV9hcnJheV9hcHBlbmQgKCZwYWQtPmZyYWdtZW50X2J1ZmZlcnMsIGJ1ZiwgMjU2KTsKKyAgcGFkLT5mcmFnbWVudF9kdXJhdGlvbiAtPSBkZWx0YTsKKworICBpZiAocGFkLT50ZnJhKSB7CisgICAgZ3VpbnQzMiBzbiA9IGF0b21fdHJhZl9nZXRfc2FtcGxlX251bSAocGFkLT50cmFmKTsKKworICAgIGlmICgoc3luYyAmJiBwYWQtPnN5bmMpIHx8IChzbiA9PSAxICYmICFwYWQtPnN5bmMpKQorICAgICAgYXRvbV90ZnJhX2FkZF9lbnRyeSAocGFkLT50ZnJhLCBkdHMsIHNuKTsKKyAgfQorCisgIGlmIChHX1VOTElLRUxZIChmb3JjZSkpCisgICAgZ290byBmbHVzaDsKKworICByZXR1cm4gcmV0OworfQorCisvKiBIZXJlJ3MgdGhlIGNsZXZlciBiaXQgb2Ygcm9idXN0IHJlY29yZGluZzogVXBkYXRpbmcgdGhlIG1vb3YKKyAqIGhlYWRlciBpcyBkb25lIHVzaW5nIGEgcGluZy1wb25nIHNjaGVtZSBpbnNpZGUgMiBibG9ja3Mgb2Ygc2l6ZQorICogJ3Jlc2VydmVkX21vb3Zfc2l6ZScgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLCBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlCisgKiBmaWxlIG9uLWRpc2sgaXMgYWx3YXlzIHZhbGlkIGlmIGludGVycnVwdGVkLgorICogSW5zaWRlIHRoZSByZXNlcnZlZCBzcGFjZSwgd2UgaGF2ZSAyIHBhaXJzIG9mIGZyZWUgKyBtb292IGF0b21zCisgKiAoaW4gdGhhdCBvcmRlciksIGZyZWUtQSArIG1vb3YtQSBAIG9mZnNldCAwIGFuZCBmcmVlLUIgKyBtb292LUIgYXQKKyAqIGF0IG9mZnNldCAicmVzZXJ2ZWRfbW9vdl9zaXplIi4KKyAqCisgKiAxLiBGcmVlLUEgaGFzIDAgc2l6ZSBwYXlsb2FkLCBtb292LUEgaW1tZWRpYXRlbHkgYWZ0ZXIgaXMKKyAqICAgIGFjdGl2ZS9jdXJyZW50LCBhbmQgaXMgcGFkZGVkIHdpdGggYW4gaW50ZXJuYWwgRnJlZSBhdG9tIHRvCisgKiAgICBlbmQgYXQgcmVzZXJ2ZWRfc3BhY2UvMi4gRnJlZS1CIGlzIGF0IHJlc2VydmVkX3NwYWNlLzIsIHNpemVkCisgKiAgICB0byBjb3ZlciB0aGUgcmVtYWluaW5nIGZyZWUgc3BhY2UgKGluY2x1ZGluZyBtb292LUIpLgorICogMi4gV2Ugd3JpdGUgbW9vdi1CICh3aGljaCBpcyBpbnZpc2libGUgaW5zaWRlIGZyZWUtQiksIGFuZCBwYWQgaXQgdG8KKyAqICAgIGVuZCBhdCB0aGUgZW5kIG9mIGZyZWUgc3BhY2UuIFRoZW4sIHdlIHVwZGF0ZSBmcmVlLUEgdG8gc2l6ZQorICogICAgcmVzZXJ2ZWRfc3BhY2UvMiArIHNpemVvZihmcmVlLUIpLCB3aGljaCBoaWRlcyBtb292LUEgYW5kIHRoZQorICogICAgZnJlZS1CIGhlYWRlciwgYW5kIG1ha2VzIG1vb3YtQiBhY3RpdmUuCisgKiAzLiBSZXdyaXRlIG1vb3YtQSBpbnNpZGUgZnJlZS1BLCB3aXRoIHBhZGRpbmcgb3V0IHRvIGZyZWUtQi4KKyAqICAgIENoYW5nZSB0aGUgc2l6ZSBvZiBmcmVlLUEgdG8gbWFrZSBtb292LUEgYWN0aXZlIGFnYWluLgorICogNC4gUmluc2UgYW5kIHJlcGVhdC4KKyAqCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcXRfbXV4X3JvYnVzdF9yZWNvcmRpbmdfcmV3cml0ZV9tb292IChHc3RRVE11eCAqIHF0bXV4KQoreworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludDY0IGZyZWVBX29mZnNldDsKKyAgZ3VpbnQzMiBuZXdfZnJlZUFfc2l6ZTsKKyAgZ3VpbnQ2NCBuZXdfbW9vdl9vZmZzZXQ7CisKKyAgLyogVXBkYXRlIG1vb3YgaW5mbywgdGhlbiBzZWVrIGFuZCByZXdyaXRlIHRoZSBNT09WIGF0b20gKi8KKyAgZ3N0X3F0X211eF91cGRhdGVfZ2xvYmFsX3N0YXRpc3RpY3MgKHF0bXV4KTsKKyAgZ3N0X3F0X211eF9jb25maWd1cmVfbW9vdiAocXRtdXgpOworCisgIGdzdF9xdF9tdXhfdXBkYXRlX2VkaXRfbGlzdHMgKHF0bXV4KTsKKworICAvKiB0YWdzIGludG8gZmlsZSBtZXRhZGF0YSAqLworICBnc3RfcXRfbXV4X3NldHVwX21ldGFkYXRhIChxdG11eCk7CisKKyAgLyogY2h1bmtzIHBvc2l0aW9uIGlzIHNldCByZWxhdGl2ZSB0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUKKyAgICogTURBVCBhdG9tIHBheWxvYWQuIFNldCB0aGUgb3ZlcmFsbCBvZmZzZXQgaW50byB0aGUgZmlsZSAqLworICBhdG9tX21vb3ZfY2h1bmtzX3NldF9vZmZzZXQgKHF0bXV4LT5tb292LCBxdG11eC0+aGVhZGVyX3NpemUpOworCisgIC8qIENhbGN1bGF0ZSB3aGljaCBtb292IHRvIHJld3JpdGUuIHF0bXV4LT5tb292X3BvcyBwb2ludHMgdG8KKyAgICogdGhlIHN0YXJ0IG9mIHRoZSBmcmVlLUEgaGVhZGVyICovCisgIGZyZWVBX29mZnNldCA9IHF0bXV4LT5tb292X3BvczsKKyAgaWYgKHF0bXV4LT5yZXNlcnZlZF9tb292X2ZpcnN0X2FjdGl2ZSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiVXBkYXRpbmcgcG9uZyBtb292IGhlYWRlciIpOworICAgIC8qIEFmdGVyIHRoaXMsIGZyZWVBIHdpbGwgaW5jbHVkZSBpdHNlbGYsIG1vb3ZBLCBwbHVzIHRoZSBmcmVlQgorICAgICAqIGhlYWRlciAqLworICAgIG5ld19mcmVlQV9zaXplID0gcXRtdXgtPnJlc2VydmVkX21vb3Zfc2l6ZSArIDE2OworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiVXBkYXRpbmcgcGluZyBtb292IGhlYWRlciIpOworICAgIG5ld19mcmVlQV9zaXplID0gODsKKyAgfQorICAvKiB0aGUgbW9vdiB3ZSB1cGRhdGUgaXMgYWZ0ZXIgZnJlZS1BLCBjYWxjdWxhdGUgaXRzIG9mZnNldCAqLworICBuZXdfbW9vdl9vZmZzZXQgPSBmcmVlQV9vZmZzZXQgKyBuZXdfZnJlZUFfc2l6ZTsKKworICAvKiBTd2FwIHBpbmctcG9uZyBjYWRlbmNlIG1hcmtlciAqLworICBxdG11eC0+cmVzZXJ2ZWRfbW9vdl9maXJzdF9hY3RpdmUgPSAhcXRtdXgtPnJlc2VydmVkX21vb3ZfZmlyc3RfYWN0aXZlOworCisgIC8qIHNlZWsgYW5kIHJld3JpdGUgdGhlIE1PT1YgYXRvbSAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgIHNlZ21lbnQuc3RhcnQgPSBuZXdfbW9vdl9vZmZzZXQ7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAocXRtdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIHJldCA9CisgICAgICBnc3RfcXRfbXV4X3NlbmRfbW9vdiAocXRtdXgsIE5VTEwsIHF0bXV4LT5yZXNlcnZlZF9tb292X3NpemUsIEZBTFNFLAorICAgICAgVFJVRSk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICAvKiBVcGRhdGUgdGhlIGVzdGltYXRlZCByZWNvcmRpbmcgc3BhY2UgcmVtYWluaW5nLCBiYXNlZCBvbiBhbW91bnQgdXNlZCBzbworICAgKiBmYXIgYW5kIGR1cmF0aW9uIG11eGVkIHNvIGZhciAqLworICBpZiAocXRtdXgtPmxhc3RfbW9vdl9zaXplID4gcXRtdXgtPmJhc2VfbW9vdl9zaXplICYmIHF0bXV4LT5sYXN0X2R0cyA+IDApIHsKKyAgICBHc3RDbG9ja1RpbWUgcmVtYWluOworICAgIEdzdENsb2NrVGltZSB0aW1lX211eGVkID0gcXRtdXgtPmxhc3RfZHRzOworCisgICAgcmVtYWluID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChxdG11eC0+cmVzZXJ2ZWRfbW9vdl9zaXplIC0KKyAgICAgICAgcXRtdXgtPmxhc3RfbW9vdl9zaXplLCB0aW1lX211eGVkLAorICAgICAgICBxdG11eC0+bGFzdF9tb292X3NpemUgLSBxdG11eC0+YmFzZV9tb292X3NpemUpOworICAgIC8qIEFsd2F5cyB1bmRlci1lc3RpbWF0ZSBzbGlnaHRseSwgc28gdXNlcnMKKyAgICAgKiBoYXZlIHRpbWUgdG8gc3RvcCBtdXhpbmcgYmVmb3JlIHdlIHJ1biBvdXQgKi8KKyAgICBpZiAocmVtYWluIDwgR1NUX1NFQ09ORCAvIDIpCisgICAgICByZW1haW4gPSAwOworICAgIGVsc2UKKyAgICAgIHJlbWFpbiAtPSBHU1RfU0VDT05EIC8gMjsKKworICAgIEdTVF9JTkZPX09CSkVDVCAocXRtdXgsCisgICAgICAgICJSZXNlcnZlZCAldSBoZWFkZXIgYnl0ZXMuIFVzZWQgJXUgaW4gJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICIuIFJlbWFpbmluZyBub3cgJXUgb3IgYXBwcm94ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBuc1xuIiwKKyAgICAgICAgcXRtdXgtPnJlc2VydmVkX21vb3Zfc2l6ZSwgcXRtdXgtPmxhc3RfbW9vdl9zaXplLAorICAgICAgICBHU1RfVElNRV9BUkdTIChxdG11eC0+bGFzdF9kdHMpLAorICAgICAgICBxdG11eC0+cmVzZXJ2ZWRfbW9vdl9zaXplIC0gcXRtdXgtPmxhc3RfbW9vdl9zaXplLCByZW1haW4pOworCisgICAgR1NUX09CSkVDVF9MT0NLIChxdG11eCk7CisgICAgcXRtdXgtPnJlc2VydmVkX2R1cmF0aW9uX3JlbWFpbmluZyA9IHJlbWFpbjsKKyAgICBxdG11eC0+bXV4ZWRfc2luY2VfbGFzdF91cGRhdGUgPSAwOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAicmVzZXJ2ZWQgcmVtYWluaW5nIGR1cmF0aW9uIG5vdyAlIgorICAgICAgICBHX0dVSU5UNjRfRk9STUFULCBxdG11eC0+cmVzZXJ2ZWRfZHVyYXRpb25fcmVtYWluaW5nKTsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocXRtdXgpOworICB9CisKKworICAvKiBOb3cgdXBkYXRlIHRoZSBtb292LUEgc2l6ZS4gRG9uJ3QgcGFzcyBvZmZzZXQsIHNpbmNlIHdlIGRvbid0IG5lZWQKKyAgICogc2VuZF9mcmVlX2F0b20oKSB0byBzZWVrIGZvciB1cyAtIGFsbCBvdXIgY2FsbGVycyBzZWVrIGJhY2sgdG8KKyAgICogd2hlcmUgdGhleSBuZWVkIGFmdGVyIHRoaXMsIG9yIHRoZXkgZG9uJ3QgbmVlZCBpdCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgIHNlZ21lbnQuc3RhcnQgPSBmcmVlQV9vZmZzZXQ7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAocXRtdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9mcmVlX2F0b20gKHF0bXV4LCBOVUxMLCBuZXdfZnJlZUFfc2l6ZSwgVFJVRSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfcm9idXN0X3JlY29yZGluZ191cGRhdGUgKEdzdFFUTXV4ICogcXRtdXgsIEdzdENsb2NrVGltZSBwb3NpdGlvbikKK3sKKyAgR3N0U2VnbWVudCBzZWdtZW50OworICBHc3RGbG93UmV0dXJuIGZsb3dfcmV0OworCisgIGd1aW50NjQgbWRhdF9vZmZzZXQgPSBxdG11eC0+bWRhdF9wb3MgKyAxNiArIHF0bXV4LT5tZGF0X3NpemU7CisKKyAgR1NUX09CSkVDVF9MT0NLIChxdG11eCk7CisKKyAgLyogVXBkYXRlIHRoZSBvZmZzZXQgb2YgaG93IG11Y2ggd2UndmUgbXV4ZWQsIHNvIHRoZQorICAgKiByZXBvcnQgb2YgcmVtYWluaW5nIHNwYWNlIGtlZXBzIGNvdW50aW5nIGRvd24gKi8KKyAgaWYgKHBvc2l0aW9uID4gcXRtdXgtPmxhc3RfbW9vdl91cGRhdGUgJiYKKyAgICAgIHBvc2l0aW9uIC0gcXRtdXgtPmxhc3RfbW9vdl91cGRhdGUgPiBxdG11eC0+bXV4ZWRfc2luY2VfbGFzdF91cGRhdGUpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRtdXgsCisgICAgICAgICJNdXhlZCB0aW1lICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBzaW5jZSBsYXN0IG1vb3YgdXBkYXRlIiwKKyAgICAgICAgcXRtdXgtPm11eGVkX3NpbmNlX2xhc3RfdXBkYXRlKTsKKyAgICBxdG11eC0+bXV4ZWRfc2luY2VfbGFzdF91cGRhdGUgPSBwb3NpdGlvbiAtIHF0bXV4LT5sYXN0X21vb3ZfdXBkYXRlOworICB9CisKKyAgLyogTmV4dCwgY2hlY2sgaWYgd2UncmUgc3VwcG9zZWQgdG8gc2VuZCBwZXJpb2RpYyBtb292IHVwZGF0ZXMgZG93bnN0cmVhbSAqLworICBpZiAocXRtdXgtPnJlc2VydmVkX21vb3ZfdXBkYXRlX3BlcmlvZCA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXV4KTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICAvKiBVcGRhdGUgaWYgcG9zaXRpb24gaXMgPiB0aGUgdGhyZXNob2xkIG9yIHRoZXJlJ3MgYmVlbiBubyB1cGRhdGUgeWV0ICovCisgIGlmIChxdG11eC0+bGFzdF9tb292X3VwZGF0ZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmCisgICAgICAocG9zaXRpb24gPD0gcXRtdXgtPmxhc3RfbW9vdl91cGRhdGUgfHwKKyAgICAgICAgICAocG9zaXRpb24gLSBxdG11eC0+bGFzdF9tb292X3VwZGF0ZSkgPAorICAgICAgICAgIHF0bXV4LT5yZXNlcnZlZF9tb292X3VwZGF0ZV9wZXJpb2QpKSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXV4KTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7ICAgICAgICAgLyogTm8gdXBkYXRlIG5lZWRlZCB5ZXQgKi8KKyAgfQorCisgIHF0bXV4LT5sYXN0X21vb3ZfdXBkYXRlID0gcG9zaXRpb247CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChxdG11eCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJVcGRhdGUgbW9vdiBhdG9tLCBwb3NpdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIgbWRhdCBzdGFydHMgQCAlIiBHX0dVSU5UNjRfRk9STUFUICIgd2Ugd2VyZSBhICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChwb3NpdGlvbiksIHF0bXV4LT5tZGF0X3BvcywgbWRhdF9vZmZzZXQpOworCisgIGZsb3dfcmV0ID0gZ3N0X3F0X211eF9yb2J1c3RfcmVjb3JkaW5nX3Jld3JpdGVfbW9vdiAocXRtdXgpOworICBpZiAoR19VTkxJS0VMWSAoZmxvd19yZXQgIT0gR1NUX0ZMT1dfT0spKQorICAgIHJldHVybiBmbG93X3JldDsKKworICAvKiBTZWVrIGJhY2sgdG8gcHJldmlvdXMgcG9zaXRpb24gKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfQllURVMpOworICBzZWdtZW50LnN0YXJ0ID0gbWRhdF9vZmZzZXQ7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAocXRtdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIHJldHVybiBmbG93X3JldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfcmVnaXN0ZXJfYW5kX3B1c2hfc2FtcGxlIChHc3RRVE11eCAqIHF0bXV4LCBHc3RRVFBhZCAqIHBhZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIsIGdib29sZWFuIGlzX2xhc3RfYnVmZmVyLCBndWludCBuc2FtcGxlcywKKyAgICBnaW50NjQgbGFzdF9kdHMsIGdpbnQ2NCBzY2FsZWRfZHVyYXRpb24sIGd1aW50IHNhbXBsZV9zaXplLAorICAgIGd1aW50NjQgY2h1bmtfb2Zmc2V0LCBnYm9vbGVhbiBzeW5jLCBnYm9vbGVhbiBkb19wdHMsIGdpbnQ2NCBwdHNfb2Zmc2V0KQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIC8qIG5vdGUgdGhhdCBhIG5ldyBjaHVuayBpcyBzdGFydGVkIGVhY2ggdGltZSAobm90IGZhbmN5IGJ1dCB3b3JrcykgKi8KKyAgaWYgKHF0bXV4LT5tb292X3JlY292X2ZpbGUpIHsKKyAgICBpZiAoIWF0b21zX3JlY292X3dyaXRlX3RyYWtfc2FtcGxlcyAocXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZSwgcGFkLT50cmFrLAorICAgICAgICAgICAgbnNhbXBsZXMsIChnaW50MzIpIHNjYWxlZF9kdXJhdGlvbiwgc2FtcGxlX3NpemUsIGNodW5rX29mZnNldCwgc3luYywKKyAgICAgICAgICAgIGRvX3B0cywgcHRzX29mZnNldCkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsICJGYWlsZWQgdG8gd3JpdGUgc2FtcGxlIGluZm9ybWF0aW9uIHRvICIKKyAgICAgICAgICAicmVjb3ZlcnkgZmlsZSwgZGlzYWJsaW5nIHJlY292ZXJ5Iik7CisgICAgICBmY2xvc2UgKHF0bXV4LT5tb292X3JlY292X2ZpbGUpOworICAgICAgcXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZSA9IE5VTEw7CisgICAgfQorICB9CisKKyAgc3dpdGNoIChxdG11eC0+bXV4X21vZGUpIHsKKyAgICBjYXNlIEdTVF9RVF9NVVhfTU9ERV9ST0JVU1RfUkVDT1JESU5HX1BSRUZJTEw6eworICAgICAgY29uc3QgVHJha0J1ZmZlckVudHJ5SW5mbyAqc2FtcGxlX2VudHJ5OworICAgICAgZ3VpbnQ2NCBibG9ja19pZHggPSBwcmVmaWxsX2dldF9ibG9ja19pbmRleCAocXRtdXgsIHBhZCk7CisKKyAgICAgIGlmIChibG9ja19pZHggPj0gcGFkLT5zYW1wbGVzLT5sZW4pIHsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXV4LCBTVFJFQU0sIE1VWCwgKE5VTEwpLAorICAgICAgICAgICAgKCJVbmV4cGVjdGVkIHNhbXBsZSAlIiBHX0dVSU5UNjRfRk9STUFUICIsIGV4cGVjdGVkIHVwIHRvICV1IiwKKyAgICAgICAgICAgICAgICBibG9ja19pZHgsIHBhZC0+c2FtcGxlcy0+bGVuKSk7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgICAgIH0KKworICAgICAgLyogQ2hlY2sgaWYgYWxsIHZhbHVlcyBhcmUgYXMgZXhwZWN0ZWQgKi8KKyAgICAgIHNhbXBsZV9lbnRyeSA9CisgICAgICAgICAgJmdfYXJyYXlfaW5kZXggKHBhZC0+c2FtcGxlcywgVHJha0J1ZmZlckVudHJ5SW5mbywgYmxvY2tfaWR4KTsKKworICAgICAgLyogQWxsb3cgKy8tIDEgZGlmZmVyZW5jZSBmb3IgdGhlIHNjYWxlZF9kdXJhdGlvbiB0byBhbGxvdworICAgICAgICogZm9yIHNvbWUgcm91bmRpbmcgZXJyb3JzCisgICAgICAgKi8KKyAgICAgIGlmIChzYW1wbGVfZW50cnktPm5zYW1wbGVzICE9IG5zYW1wbGVzCisgICAgICAgICAgfHwgQUJTRElGRiAoc2FtcGxlX2VudHJ5LT5kZWx0YSwgc2NhbGVkX2R1cmF0aW9uKSA+IDEKKyAgICAgICAgICB8fCBzYW1wbGVfZW50cnktPnNpemUgIT0gc2FtcGxlX3NpemUKKyAgICAgICAgICB8fCBzYW1wbGVfZW50cnktPmNodW5rX29mZnNldCAhPSBjaHVua19vZmZzZXQKKyAgICAgICAgICB8fCBzYW1wbGVfZW50cnktPnB0c19vZmZzZXQgIT0gcHRzX29mZnNldAorICAgICAgICAgIHx8IHNhbXBsZV9lbnRyeS0+c3luYyAhPSBzeW5jKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG11eCwgU1RSRUFNLCBNVVgsIChOVUxMKSwKKyAgICAgICAgICAgICgiVW5leHBlY3RlZCB2YWx1ZXMgaW4gc2FtcGxlICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICAgICAgcGFkLT5zYW1wbGVfb2Zmc2V0ICsgMSkpOworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgICB9CisKKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9idWZmZXIgKHF0bXV4LCBidWZmZXIsICZxdG11eC0+bWRhdF9zaXplLCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVF9NVVhfTU9ERV9NT09WX0FUX0VORDoKKyAgICBjYXNlIEdTVF9RVF9NVVhfTU9ERV9GQVNUX1NUQVJUOgorICAgIGNhc2UgR1NUX1FUX01VWF9NT0RFX1JPQlVTVF9SRUNPUkRJTkc6CisgICAgICBhdG9tX3RyYWtfYWRkX3NhbXBsZXMgKHBhZC0+dHJhaywgbnNhbXBsZXMsIChnaW50MzIpIHNjYWxlZF9kdXJhdGlvbiwKKyAgICAgICAgICBzYW1wbGVfc2l6ZSwgY2h1bmtfb2Zmc2V0LCBzeW5jLCBwdHNfb2Zmc2V0KTsKKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9idWZmZXIgKHF0bXV4LCBidWZmZXIsICZxdG11eC0+bWRhdF9zaXplLCBUUlVFKTsKKyAgICAgIC8qIENoZWNrIGlmIGl0J3MgdGltZSB0byByZS13cml0ZSB0aGUgaGVhZGVycyBpbiByb2J1c3QtcmVjb3JkaW5nIG1vZGUgKi8KKyAgICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT0sKKyAgICAgICAgICAmJiBxdG11eC0+bXV4X21vZGUgPT0gR1NUX1FUX01VWF9NT0RFX1JPQlVTVF9SRUNPUkRJTkcpCisgICAgICAgIHJldCA9IGdzdF9xdF9tdXhfcm9idXN0X3JlY29yZGluZ191cGRhdGUgKHF0bXV4LCBwYWQtPnRvdGFsX2R1cmF0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1FUX01VWF9NT0RFX0ZSQUdNRU5URUQ6CisgICAgY2FzZSBHU1RfUVRfTVVYX01PREVfRlJBR01FTlRFRF9TVFJFQU1BQkxFOgorICAgICAgLyogZW5zdXJlIHRoYXQgYWx3YXlzIHN5bmMgc2FtcGxlcyBhcmUgbWFya2VkIGFzIHN1Y2ggKi8KKyAgICAgIHJldCA9IGdzdF9xdF9tdXhfcGFkX2ZyYWdtZW50X2FkZF9idWZmZXIgKHF0bXV4LCBwYWQsIGJ1ZmZlciwKKyAgICAgICAgICBpc19sYXN0X2J1ZmZlciwgbnNhbXBsZXMsIGxhc3RfZHRzLCAoZ2ludDMyKSBzY2FsZWRfZHVyYXRpb24sCisgICAgICAgICAgc2FtcGxlX3NpemUsICFwYWQtPnN5bmMgfHwgc3luYywgcHRzX29mZnNldCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X3JlZ2lzdGVyX2J1ZmZlcl9pbl9jaHVuayAoR3N0UVRNdXggKiBxdG11eCwgR3N0UVRQYWQgKiBwYWQsCisgICAgZ3VpbnQgYnVmZmVyX3NpemUsIEdzdENsb2NrVGltZSBkdXJhdGlvbikKK3sKKyAgLyogbm90IHRoYXQgbXVjaCBoYXBwZW5zIGhlcmUsCisgICAqIGJ1dCB1cGRhdGluZyBhbnkgb2YgdGhpcyB2ZXJ5IGxpa2VseSBuZWVkcyB0byBoYXBwZW4gYWxsIGluIHN5bmMsCisgICAqIHVubGVzcyB0aGVyZSBpcyBhIHZlcnkgZ29vZCByZWFzb24gbm90IHRvICovCisKKyAgLyogZm9yIGNvbXB1dGluZyB0aGUgYXZnIGJpdHJhdGUgKi8KKyAgcGFkLT50b3RhbF9ieXRlcyArPSBidWZmZXJfc2l6ZTsKKyAgcGFkLT50b3RhbF9kdXJhdGlvbiArPSBkdXJhdGlvbjsKKyAgLyogZm9yIGtlZXBpbmcgdHJhY2sgb2Ygd2hlcmUgd2UgYXJlIGluIGNodW5rOworICAgKiBlbnN1cmVzIHRoYXQgZGF0YSByZWFsbHkgaXMgbG9jYXRlZCBhcyByZWNvcmRlZCBpbiBhdG9tcyAqLworICBxdG11eC0+Y3VycmVudF9jaHVua19zaXplICs9IGJ1ZmZlcl9zaXplOworICBxdG11eC0+Y3VycmVudF9jaHVua19kdXJhdGlvbiArPSBkdXJhdGlvbjsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdF9tdXhfY2hlY2tfYW5kX3VwZGF0ZV90aW1lY29kZSAoR3N0UVRNdXggKiBxdG11eCwgR3N0UVRQYWQgKiBwYWQsCisgICAgR3N0QnVmZmVyICogYnVmLCBHc3RGbG93UmV0dXJuIHJldCkKK3sKKyAgR3N0VmlkZW9UaW1lQ29kZU1ldGEgKnRjX21ldGE7CisgIEdzdFZpZGVvVGltZUNvZGUgKnRjOworICBHc3RCdWZmZXIgKnRjX2J1ZjsKKyAgZ3NpemUgc3pyZXQ7CisgIGd1aW50MzIgZnJhbWVzX3NpbmNlX2RhaWx5X2phbTsKKyAgR3N0UVRNdXhDbGFzcyAqcXRtdXhfa2xhc3MgPSAoR3N0UVRNdXhDbGFzcyAqKSAoR19PQkpFQ1RfR0VUX0NMQVNTIChxdG11eCkpOworCisgIGlmIChxdG11eF9rbGFzcy0+Zm9ybWF0ICE9IEdTVF9RVF9NVVhfRk9STUFUX1FUKQorICAgIHJldHVybiByZXQ7CisKKyAgaWYgKGJ1ZiA9PSBOVUxMIHx8IChwYWQtPnRjX3RyYWsgIT0gTlVMTCAmJiBwYWQtPnRjX3BvcyA9PSAtMSkpCisgICAgcmV0dXJuIHJldDsKKworICB0Y19tZXRhID0gZ3N0X2J1ZmZlcl9nZXRfdmlkZW9fdGltZV9jb2RlX21ldGEgKGJ1Zik7CisgIGlmICghdGNfbWV0YSkKKyAgICByZXR1cm4gcmV0OworCisgIHRjID0gJnRjX21ldGEtPnRjOworCisgIC8qIFRoaXMgbWVhbnMgd2UgbmV2ZXIgZ290IGEgdGltZWNvZGUgYmVmb3JlICovCisgIGlmIChwYWQtPmZpcnN0X3RjID09IE5VTEwpIHsKKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgICAgZ2NoYXIgKnRjX3N0ciA9IGdzdF92aWRlb190aW1lX2NvZGVfdG9fc3RyaW5nICh0Yyk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJGb3VuZCBmaXJzdCB0aW1lY29kZSAlcyIsIHRjX3N0cik7CisgICAgZ19mcmVlICh0Y19zdHIpOworI2VuZGlmCisgICAgZ19hc3NlcnQgKHBhZC0+dGNfdHJhayA9PSBOVUxMKTsKKyAgICBwYWQtPmZpcnN0X3RjID0gZ3N0X3ZpZGVvX3RpbWVfY29kZV9jb3B5ICh0Yyk7CisgICAgLyogSWYgZnJhbWVzIGFyZSBvdXQgb2Ygb3JkZXIsIHRoZSBmcmFtZSB3ZSdyZSBjdXJyZW50bHkgZ2V0dGluZyBtaWdodAorICAgICAqIG5vdCBiZSB0aGUgZmlyc3Qgb25lLiBKdXN0IHdyaXRlIGEgMCB0aW1lY29kZSBmb3Igbm93IGFuZCB3YWl0CisgICAgICogdW50aWwgd2UgcmVjZWl2ZSBhIHRpbWVjb2RlIHRoYXQncyBsb3dlciB0aGFuIHRoZSBjdXJyZW50IG9uZSAqLworICAgIGlmIChwYWQtPmlzX291dF9vZl9vcmRlcikgeworICAgICAgcGFkLT5maXJzdF9wdHMgPSBHU1RfQlVGRkVSX1BUUyAoYnVmKTsKKyAgICAgIGZyYW1lc19zaW5jZV9kYWlseV9qYW0gPSAwOworICAgICAgLyogUG9zaXRpb24gdG8gcmV3cml0ZSAqLworICAgICAgcGFkLT50Y19wb3MgPSBxdG11eC0+bWRhdF9zaXplOworICAgIH0gZWxzZSB7CisgICAgICBmcmFtZXNfc2luY2VfZGFpbHlfamFtID0KKyAgICAgICAgICBnc3RfdmlkZW9fdGltZV9jb2RlX2ZyYW1lc19zaW5jZV9kYWlseV9qYW0gKHBhZC0+Zmlyc3RfdGMpOworICAgICAgZnJhbWVzX3NpbmNlX2RhaWx5X2phbSA9IEdVSU5UMzJfVE9fQkUgKGZyYW1lc19zaW5jZV9kYWlseV9qYW0pOworICAgIH0KKyAgICAvKiBXcml0ZSB0aGUgdGltZWNvZGUgdHJhayBub3cgKi8KKyAgICBwYWQtPnRjX3RyYWsgPSBhdG9tX3RyYWtfbmV3IChxdG11eC0+Y29udGV4dCk7CisgICAgYXRvbV9tb292X2FkZF90cmFrIChxdG11eC0+bW9vdiwgcGFkLT50Y190cmFrKTsKKworICAgIHBhZC0+dHJhay0+dHJlZiA9IGF0b21fdHJlZl9uZXcgKEZPVVJDQ190bWNkKTsKKyAgICBhdG9tX3RyZWZfYWRkX2VudHJ5IChwYWQtPnRyYWstPnRyZWYsIHBhZC0+dGNfdHJhay0+dGtoZC50cmFja19JRCk7CisKKyAgICBhdG9tX3RyYWtfc2V0X3RpbWVjb2RlX3R5cGUgKHBhZC0+dGNfdHJhaywgcXRtdXgtPmNvbnRleHQsCisgICAgICAgIHBhZC0+dHJhay0+bWRpYS5tZGhkLnRpbWVfaW5mby50aW1lc2NhbGUsIHBhZC0+Zmlyc3RfdGMpOworCisgICAgdGNfYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDQsIE5VTEwpOworICAgIHN6cmV0ID0gZ3N0X2J1ZmZlcl9maWxsICh0Y19idWYsIDAsICZmcmFtZXNfc2luY2VfZGFpbHlfamFtLCA0KTsKKyAgICBnX2Fzc2VydCAoc3pyZXQgPT0gNCk7CisKKyAgICBhdG9tX3RyYWtfYWRkX3NhbXBsZXMgKHBhZC0+dGNfdHJhaywgMSwgMSwgNCwgcXRtdXgtPm1kYXRfc2l6ZSwgRkFMU0UsIDApOworICAgIHJldCA9IGdzdF9xdF9tdXhfc2VuZF9idWZmZXIgKHF0bXV4LCB0Y19idWYsICZxdG11eC0+bWRhdF9zaXplLCBUUlVFKTsKKworICAgIC8qIE5lZWQgdG8gcmVzZXQgdGhlIGN1cnJlbnQgY2h1bmsgKG9mIHRoZSBwcmV2aW91cyBwYWQpIGhlcmUgYmVjYXVzZQorICAgICAqIHNvbWUgb3RoZXIgZGF0YSB3YXMgd3JpdHRlbiBub3cgYWJvdmUsIGFuZCB0aGUgcGFkIGhhcyB0byBzdGFydCBhCisgICAgICogbmV3IGNodW5rIG5vdyAqLworICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX29mZnNldCA9IC0xOworICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX3NpemUgPSAwOworICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX2R1cmF0aW9uID0gMDsKKyAgfSBlbHNlIGlmIChxdG11eC0+bXV4X21vZGUgPT0gR1NUX1FUX01VWF9NT0RFX1JPQlVTVF9SRUNPUkRJTkdfUFJFRklMTCkgeworICAgIGZyYW1lc19zaW5jZV9kYWlseV9qYW0gPQorICAgICAgICBnc3RfdmlkZW9fdGltZV9jb2RlX2ZyYW1lc19zaW5jZV9kYWlseV9qYW0gKHBhZC0+Zmlyc3RfdGMpOworICAgIGZyYW1lc19zaW5jZV9kYWlseV9qYW0gPSBHVUlOVDMyX1RPX0JFIChmcmFtZXNfc2luY2VfZGFpbHlfamFtKTsKKworICAgIHRjX2J1ZiA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCA0LCBOVUxMKTsKKyAgICBzenJldCA9IGdzdF9idWZmZXJfZmlsbCAodGNfYnVmLCAwLCAmZnJhbWVzX3NpbmNlX2RhaWx5X2phbSwgNCk7CisgICAgZ19hc3NlcnQgKHN6cmV0ID09IDQpOworCisgICAgcmV0ID0gZ3N0X3F0X211eF9zZW5kX2J1ZmZlciAocXRtdXgsIHRjX2J1ZiwgJnF0bXV4LT5tZGF0X3NpemUsIFRSVUUpOworICAgIHBhZC0+dGNfcG9zID0gLTE7CisKKyAgICBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQgPSAtMTsKKyAgICBxdG11eC0+Y3VycmVudF9jaHVua19zaXplID0gMDsKKyAgICBxdG11eC0+Y3VycmVudF9jaHVua19kdXJhdGlvbiA9IDA7CisgIH0gZWxzZSBpZiAocGFkLT5pc19vdXRfb2Zfb3JkZXIpIHsKKyAgICAvKiBDaGVjayBmb3IgYSBsb3dlciB0aW1lY29kZSB0aGFuIHRoZSBvbmUgc3RvcmVkICovCisgICAgZ19hc3NlcnQgKHBhZC0+dGNfdHJhayAhPSBOVUxMKTsKKyAgICBpZiAoR1NUX0JVRkZFUl9EVFMgKGJ1ZikgPD0gcGFkLT5maXJzdF9wdHMpIHsKKyAgICAgIGlmIChnc3RfdmlkZW9fdGltZV9jb2RlX2NvbXBhcmUgKHRjLCBwYWQtPmZpcnN0X3RjKSA9PSAtMSkgeworICAgICAgICBnc3RfdmlkZW9fdGltZV9jb2RlX2ZyZWUgKHBhZC0+Zmlyc3RfdGMpOworICAgICAgICBwYWQtPmZpcnN0X3RjID0gZ3N0X3ZpZGVvX3RpbWVfY29kZV9jb3B5ICh0Yyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGd1aW50NjQgYmtfc2l6ZSA9IHF0bXV4LT5tZGF0X3NpemU7CisgICAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgICAgICAvKiBJZiB0aGlzIGZyYW1lJ3MgRFRTIGlzIGFmdGVyIHRoZSBmaXJzdCBQVFMgcmVjZWl2ZWQsIGl0IG1lYW5zCisgICAgICAgKiB3ZSd2ZSBhbHJlYWR5IHJlY2VpdmVkIHRoZSBmaXJzdCBmcmFtZSB0byBiZSBwcmVzZW50ZWQuIE90aGVyd2lzZQorICAgICAgICogdGhlIGRlY29kZXIgd291bGQgbmVlZCB0byBnbyBiYWNrIGluIHRpbWUgKi8KKyAgICAgIGdzdF9xdF9tdXhfdXBkYXRlX3RpbWVjb2RlIChxdG11eCwgcGFkKTsKKworICAgICAgLyogUmVzZXQgd3JpdGluZyBwb3NpdGlvbiAqLworICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfQllURVMpOworICAgICAgc2VnbWVudC5zdGFydCA9IGJrX3NpemU7CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHF0bXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKgorICogSGVyZSB3ZSBwdXNoIHRoZSBidWZmZXIgYW5kIHVwZGF0ZSB0aGUgdGFibGVzIGluIHRoZSB0cmFjayBhdG9tcworICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0X211eF9hZGRfYnVmZmVyIChHc3RRVE11eCAqIHF0bXV4LCBHc3RRVFBhZCAqIHBhZCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RCdWZmZXIgKmxhc3RfYnVmID0gTlVMTDsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uOworICBndWludCBuc2FtcGxlcywgc2FtcGxlX3NpemU7CisgIGd1aW50NjQgY2h1bmtfb2Zmc2V0OworICBnaW50NjQgbGFzdF9kdHMsIHNjYWxlZF9kdXJhdGlvbjsKKyAgZ2ludDY0IHB0c19vZmZzZXQgPSAwOworICBnYm9vbGVhbiBzeW5jID0gRkFMU0U7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGd1aW50IGJ1ZmZlcl9zaXplOworCisgIGlmICghcGFkLT5mb3VyY2MpCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICAvKiBpZiB0aGlzIHBhZCBoYXMgYSBwcmVwYXJlIGZ1bmN0aW9uLCBjYWxsIGl0ICovCisgIGlmIChwYWQtPnByZXBhcmVfYnVmX2Z1bmMgIT0gTlVMTCkgeworICAgIEdzdEJ1ZmZlciAqbmV3X2J1ZjsKKworICAgIG5ld19idWYgPSBwYWQtPnByZXBhcmVfYnVmX2Z1bmMgKHBhZCwgYnVmLCBxdG11eCk7CisgICAgaWYgKGJ1ZiAmJiAhbmV3X2J1ZikKKyAgICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgICBidWYgPSBuZXdfYnVmOworICB9CisKKyAgcmV0ID0gZ3N0X3F0X211eF9jaGVja19hbmRfdXBkYXRlX3RpbWVjb2RlIChxdG11eCwgcGFkLCBidWYsIHJldCk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBpZiAoYnVmKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgbGFzdF9idWYgPSBwYWQtPmxhc3RfYnVmOworICBwYWQtPmxhc3RfYnVmID0gYnVmOworCisgIGlmIChsYXN0X2J1ZiA9PSBOVUxMKSB7CisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJQYWQgJXMgaGFzIG5vIHByZXZpb3VzIGJ1ZmZlciBzdG9yZWQgYW5kICIKKyAgICAgICAgICAicmVjZWl2ZWQgTlVMTCBidWZmZXIsIGRvaW5nIG5vdGhpbmciLAorICAgICAgICAgIEdTVF9QQURfTkFNRSAocGFkLT5jb2xsZWN0LnBhZCkpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRtdXgsCisgICAgICAgICAgIlBhZCAlcyBoYXMgbm8gcHJldmlvdXMgYnVmZmVyIHN0b3JlZCwgc3RvcmluZyBub3ciLAorICAgICAgICAgIEdTVF9QQURfTkFNRSAocGFkLT5jb2xsZWN0LnBhZCkpOworICAgIH0KKyNlbmRpZgorICAgIGdvdG8gZXhpdDsKKyAgfQorCisgIGlmICghR1NUX0JVRkZFUl9QVFNfSVNfVkFMSUQgKGxhc3RfYnVmKSkKKyAgICBnb3RvIG5vX3B0czsKKworICAvKiBpZiB0aGlzIGlzIHRoZSBmaXJzdCBidWZmZXIsIHN0b3JlIHRoZSB0aW1lc3RhbXAgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHBhZC0+Zmlyc3RfdHMgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkpIHsKKyAgICBpZiAoR1NUX0JVRkZFUl9QVFNfSVNfVkFMSUQgKGxhc3RfYnVmKSkgeworICAgICAgcGFkLT5maXJzdF90cyA9IEdTVF9CVUZGRVJfUFRTIChsYXN0X2J1Zik7CisgICAgfSBlbHNlIGlmIChHU1RfQlVGRkVSX0RUU19JU19WQUxJRCAobGFzdF9idWYpKSB7CisgICAgICBwYWQtPmZpcnN0X3RzID0gR1NUX0JVRkZFUl9EVFMgKGxhc3RfYnVmKTsKKyAgICB9CisKKyAgICBpZiAoR1NUX0JVRkZFUl9EVFNfSVNfVkFMSUQgKGxhc3RfYnVmKSkgeworICAgICAgcGFkLT5maXJzdF9kdHMgPSBwYWQtPmxhc3RfZHRzID0gR1NUX0JVRkZFUl9EVFMgKGxhc3RfYnVmKTsKKyAgICB9IGVsc2UgaWYgKEdTVF9CVUZGRVJfUFRTX0lTX1ZBTElEIChsYXN0X2J1ZikpIHsKKyAgICAgIHBhZC0+Zmlyc3RfZHRzID0gcGFkLT5sYXN0X2R0cyA9IEdTVF9CVUZGRVJfUFRTIChsYXN0X2J1Zik7CisgICAgfQorCisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChwYWQtPmZpcnN0X3RzKSkgeworICAgICAgR1NUX0RFQlVHICgic2V0dGluZyBmaXJzdF90cyB0byAlIiBHX0dVSU5UNjRfRk9STUFULCBwYWQtPmZpcnN0X3RzKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgIkZpcnN0IGJ1ZmZlciBmb3IgcGFkICVzIGhhcyBubyB0aW1lc3RhbXAsICIKKyAgICAgICAgICAidXNpbmcgMCBhcyBmaXJzdCB0aW1lc3RhbXAiLCBHU1RfUEFEX05BTUUgKHBhZC0+Y29sbGVjdC5wYWQpKTsKKyAgICAgIHBhZC0+Zmlyc3RfdHMgPSBwYWQtPmZpcnN0X2R0cyA9IDA7CisgICAgfQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiU3RvcmVkIGZpcnN0IHRpbWVzdGFtcCBmb3IgcGFkICVzICUiCisgICAgICAgIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1BBRF9OQU1FIChwYWQtPmNvbGxlY3QucGFkKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAocGFkLT5maXJzdF90cykpOworICB9CisKKyAgaWYgKGJ1ZiAmJiBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoR1NUX0JVRkZFUl9EVFMgKGJ1ZikpICYmCisgICAgICBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoR1NUX0JVRkZFUl9EVFMgKGxhc3RfYnVmKSkgJiYKKyAgICAgIEdTVF9CVUZGRVJfRFRTIChidWYpIDwgR1NUX0JVRkZFUl9EVFMgKGxhc3RfYnVmKSkgeworICAgIEdTVF9FUlJPUiAoImRlY3JlYXNpbmcgRFRTIHZhbHVlICUiIEdTVF9USU1FX0ZPUk1BVCAiIDwgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RUUyAoYnVmKSksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFRTIChsYXN0X2J1ZikpKTsKKyAgICBwYWQtPmxhc3RfYnVmID0gYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChidWYpOworICAgIEdTVF9CVUZGRVJfRFRTIChidWYpID0gR1NUX0JVRkZFUl9EVFMgKGxhc3RfYnVmKTsKKyAgfQorCisgIGJ1ZmZlcl9zaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAobGFzdF9idWYpOworCisgIGlmIChxdG11eC0+bXV4X21vZGUgPT0gR1NUX1FUX01VWF9NT0RFX1JPQlVTVF9SRUNPUkRJTkdfUFJFRklMTCkgeworICAgIGd1aW50IHJlcXVpcmVkX2J1ZmZlcl9zaXplID0gcHJlZmlsbF9nZXRfc2FtcGxlX3NpemUgKHF0bXV4LCBwYWQpOworICAgIGd1aW50IGZpbGxfc2l6ZSA9IHJlcXVpcmVkX2J1ZmZlcl9zaXplIC0gYnVmZmVyX3NpemU7CisgICAgR3N0TWVtb3J5ICptZW07CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICBpZiAocmVxdWlyZWRfYnVmZmVyX3NpemUgPCBidWZmZXJfc2l6ZSkgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXV4LCBTVFJFQU0sIE1VWCwgKE5VTEwpLAorICAgICAgICAgICgiU2FtcGxlIHNpemUgJXUgYmlnZ2VyIHRoYW4gZXhwZWN0ZWQgbWF4aW11bSAldSIsIGJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICByZXF1aXJlZF9idWZmZXJfc2l6ZSkpOworICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChmaWxsX3NpemUgPiAwKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwKKyAgICAgICAgICAiUGFkZGluZyBidWZmZXIgYnkgJXUgYnl0ZXMgdG8gcmVhY2ggcmVxdWlyZWQgJXUgYnl0ZXMiLCBmaWxsX3NpemUsCisgICAgICAgICAgcmVxdWlyZWRfYnVmZmVyX3NpemUpOworICAgICAgbWVtID0gZ3N0X2FsbG9jYXRvcl9hbGxvYyAoTlVMTCwgZmlsbF9zaXplLCBOVUxMKTsKKyAgICAgIGdzdF9tZW1vcnlfbWFwIChtZW0sICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgICAgbWVtc2V0IChtYXAuZGF0YSwgMCwgbWFwLnNpemUpOworICAgICAgZ3N0X21lbW9yeV91bm1hcCAobWVtLCAmbWFwKTsKKyAgICAgIGxhc3RfYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChsYXN0X2J1Zik7CisgICAgICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKGxhc3RfYnVmLCBtZW0pOworICAgICAgYnVmZmVyX3NpemUgPSByZXF1aXJlZF9idWZmZXJfc2l6ZTsKKyAgICB9CisgIH0KKworICAvKiBkdXJhdGlvbiBhY3R1YWxseSBtZWFucyB0aW1lIGRlbHRhIGJldHdlZW4gc2FtcGxlcywgc28gd2UgY2FsY3VsYXRlCisgICAqIHRoZSBkdXJhdGlvbiBiYXNlZCBvbiB0aGUgZGlmZmVyZW5jZSBpbiBEVFMgb3IgUFRTLCBmYWxsaW5nIGJhY2sKKyAgICogdG8gRFVSQVRJT04gaWYgdGhlIG90aGVyIHR3byBkb24ndCBleGlzdCwgc3VjaCBhcyB3aXRoIHRoZSBsYXN0CisgICAqIHNhbXBsZSBiZWZvcmUgRU9TLiBPciB1c2UgMCBpZiBub3RoaW5nIGVsc2UgaXMgYXZhaWxhYmxlICovCisgIGlmIChHU1RfQlVGRkVSX0RVUkFUSU9OX0lTX1ZBTElEIChsYXN0X2J1ZikpCisgICAgZHVyYXRpb24gPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChsYXN0X2J1Zik7CisgIGVsc2UKKyAgICBkdXJhdGlvbiA9IDA7CisgIGlmICghcGFkLT5zcGFyc2UpIHsKKyAgICBpZiAoYnVmICYmIEdTVF9CVUZGRVJfRFRTX0lTX1ZBTElEIChidWYpCisgICAgICAgICYmIEdTVF9CVUZGRVJfRFRTX0lTX1ZBTElEIChsYXN0X2J1ZikpCisgICAgICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFRTIChidWYpIC0gR1NUX0JVRkZFUl9EVFMgKGxhc3RfYnVmKTsKKyAgICBlbHNlIGlmIChidWYgJiYgR1NUX0JVRkZFUl9QVFNfSVNfVkFMSUQgKGJ1ZikKKyAgICAgICAgJiYgR1NUX0JVRkZFUl9QVFNfSVNfVkFMSUQgKGxhc3RfYnVmKSkKKyAgICAgIGR1cmF0aW9uID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZikgLSBHU1RfQlVGRkVSX1BUUyAobGFzdF9idWYpOworICB9CisKKyAgaWYgKHF0bXV4LT5jdXJyZW50X3BhZCAhPSBwYWQgfHwgcXRtdXgtPmN1cnJlbnRfY2h1bmtfb2Zmc2V0ID09IC0xKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsCisgICAgICAgICJTd2l0Y2hpbmcgdG8gbmV4dCBjaHVuayBmb3IgcGFkICVzOiVzOiBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAiLCBzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgZHVyYXRpb24gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKHBhZC0+Y29sbGVjdC5wYWQpLCBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQsCisgICAgICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX3NpemUsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHF0bXV4LT5jdXJyZW50X2NodW5rX2R1cmF0aW9uKSk7CisgICAgcXRtdXgtPmN1cnJlbnRfcGFkID0gcGFkOworICAgIGlmIChxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQgPT0gLTEpCisgICAgICBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQgPSBxdG11eC0+bWRhdF9zaXplOworICAgIGVsc2UKKyAgICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX29mZnNldCArPSBxdG11eC0+Y3VycmVudF9jaHVua19zaXplOworICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX3NpemUgPSAwOworICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX2R1cmF0aW9uID0gMDsKKyAgfQorCisgIGxhc3RfZHRzID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX3JvdW5kIChwYWQtPmxhc3RfZHRzLAorICAgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHBhZC0+dHJhayksIEdTVF9TRUNPTkQpOworCisgIC8qIGZyYWdtZW50cyBvbmx5IGRlYWwgd2l0aCAxIGJ1ZmZlciA9PSAxIGNodW5rICg9PSAxIHNhbXBsZSkgKi8KKyAgaWYgKHBhZC0+c2FtcGxlX3NpemUgJiYgIXF0bXV4LT5mcmFnbWVudF9zZXF1ZW5jZSkgeworICAgIEdzdENsb2NrVGltZSBleHBlY3RlZF90aW1lc3RhbXA7CisKKyAgICAvKiBDb25zdGFudCBzaXplIHBhY2tldHM6IHVzdWFsbHkgcmF3IGF1ZGlvICh3aXRoIG1hbnkgc2FtcGxlcyBwZXIKKyAgICAgICBidWZmZXIgKD0gY2h1bmspKSwgYnV0IGNhbiBhbHNvIGJlIGZpeGVkLXBhY2tldC1zaXplIGNvZGVjcyBsaWtlIEFEUENNCisgICAgICovCisgICAgc2FtcGxlX3NpemUgPSBwYWQtPnNhbXBsZV9zaXplOworICAgIGlmIChidWZmZXJfc2l6ZSAlIHNhbXBsZV9zaXplICE9IDApCisgICAgICBnb3RvIGZyYWdtZW50ZWRfc2FtcGxlOworCisgICAgLyogbm90ZTogcXQgcmF3IGF1ZGlvIHN0b3JhZ2Ugd2FycHMgaXQgaW1wbGljaXRseSBpbnRvIGEgdGltZXdpc2UKKyAgICAgKiBwZXJmZWN0IHN0cmVhbSwgZGlzY2FyZGluZyBidWZmZXIgdGltZXMuCisgICAgICogSWYgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBQVFMgYW5kIHRoZSBleHBlY3RlZCBvbmUKKyAgICAgKiBiZWNvbWVzIHRvbyBiaWcsIHdlIGVycm9yIG91dDogdGhlcmUgd2FzIGEgZ2FwIGFuZCB3ZSBoYXZlIG5vIHdheSB0bworICAgICAqIHJlcHJlc2VudCB0aGF0LCBjYXVzaW5nIEEvViBzeW5jIHRvIGJlIG9mZiAqLworICAgIGV4cGVjdGVkX3RpbWVzdGFtcCA9CisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAocGFkLT5zYW1wbGVfb2Zmc2V0LCBHU1RfU0VDT05ELAorICAgICAgICBhdG9tX3RyYWtfZ2V0X3RpbWVzY2FsZSAocGFkLT50cmFrKSkgKyBwYWQtPmZpcnN0X3RzOworICAgIGlmIChBQlNESUZGIChHU1RfQlVGRkVSX0RUU19PUl9QVFMgKGxhc3RfYnVmKSwKKyAgICAgICAgICAgIGV4cGVjdGVkX3RpbWVzdGFtcCkgPiBxdG11eC0+bWF4X3Jhd19hdWRpb19kcmlmdCkKKyAgICAgIGdvdG8gcmF3X2F1ZGlvX3RpbWVzdGFtcF9kcmlmdDsKKworICAgIGlmIChHU1RfQlVGRkVSX0RVUkFUSU9OIChsYXN0X2J1ZikgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgICAgbnNhbXBsZXMgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGxhc3RfYnVmKSwKKyAgICAgICAgICBhdG9tX3RyYWtfZ2V0X3RpbWVzY2FsZSAocGFkLT50cmFrKSwgR1NUX1NFQ09ORCk7CisgICAgICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGxhc3RfYnVmKTsKKyAgICB9IGVsc2UgeworICAgICAgbnNhbXBsZXMgPSBidWZmZXJfc2l6ZSAvIHNhbXBsZV9zaXplOworICAgICAgZHVyYXRpb24gPQorICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAobnNhbXBsZXMsIEdTVF9TRUNPTkQsCisgICAgICAgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHBhZC0+dHJhaykpOworICAgIH0KKworICAgIC8qIHRpbWVzY2FsZSA9IHNhbXBsZXJhdGUgKi8KKyAgICBzY2FsZWRfZHVyYXRpb24gPSAxOworICAgIHBhZC0+bGFzdF9kdHMgPQorICAgICAgICBwYWQtPmZpcnN0X2R0cyArIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAocGFkLT5zYW1wbGVfb2Zmc2V0ICsKKyAgICAgICAgbnNhbXBsZXMsIEdTVF9TRUNPTkQsIGF0b21fdHJha19nZXRfdGltZXNjYWxlIChwYWQtPnRyYWspKTsKKyAgfSBlbHNlIHsKKyAgICBuc2FtcGxlcyA9IDE7CisgICAgc2FtcGxlX3NpemUgPSBidWZmZXJfc2l6ZTsKKyAgICBpZiAoIXBhZC0+c3BhcnNlICYmICgoYnVmICYmIEdTVF9CVUZGRVJfRFRTX0lTX1ZBTElEIChidWYpKQorICAgICAgICAgICAgfHwgR1NUX0JVRkZFUl9EVFNfSVNfVkFMSUQgKGxhc3RfYnVmKSkpIHsKKyAgICAgIGdpbnQ2NCBzY2FsZWRfZHRzOworICAgICAgaWYgKGJ1ZiAmJiBHU1RfQlVGRkVSX0RUU19JU19WQUxJRCAoYnVmKSkgeworICAgICAgICBwYWQtPmxhc3RfZHRzID0gR1NUX0JVRkZFUl9EVFMgKGJ1Zik7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYWQtPmxhc3RfZHRzID0gR1NUX0JVRkZFUl9EVFMgKGxhc3RfYnVmKSArIGR1cmF0aW9uOworICAgICAgfQorICAgICAgaWYgKChnaW50NjQpIChwYWQtPmxhc3RfZHRzKSA8IDApIHsKKyAgICAgICAgc2NhbGVkX2R0cyA9IC1nc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKC1wYWQtPmxhc3RfZHRzLAorICAgICAgICAgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHBhZC0+dHJhayksIEdTVF9TRUNPTkQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2NhbGVkX2R0cyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAocGFkLT5sYXN0X2R0cywKKyAgICAgICAgICAgIGF0b21fdHJha19nZXRfdGltZXNjYWxlIChwYWQtPnRyYWspLCBHU1RfU0VDT05EKTsKKyAgICAgIH0KKyAgICAgIHNjYWxlZF9kdXJhdGlvbiA9IHNjYWxlZF9kdHMgLSBsYXN0X2R0czsKKyAgICAgIGxhc3RfZHRzID0gc2NhbGVkX2R0czsKKyAgICB9IGVsc2UgeworICAgICAgLyogZmlyc3QgY29udmVydCBpbnRlbmRlZCB0aW1lc3RhbXAgKGluIEdzdENsb2NrVGltZSByZXNvbHV0aW9uKSB0bworICAgICAgICogdHJhayB0aW1lc2NhbGUsIHRoZW4gZGVyaXZlIGRlbHRhOworICAgICAgICogdGhpcyBlbnN1cmVzIHN1bXMgb2YgKHNjYWxlKWRlbHRhIGFkZCB1cCB0byBjb252ZXJ0ZWQgdGltZXN0YW1wLAorICAgICAgICogd2hpY2ggb25seSBkZXZpYXRlcyBhdCBtb3N0IDEvc2NhbGUgZnJvbSB0aW1lc3RhbXAgaXRzZWxmICovCisgICAgICBzY2FsZWRfZHVyYXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKHBhZC0+bGFzdF9kdHMgKyBkdXJhdGlvbiwKKyAgICAgICAgICBhdG9tX3RyYWtfZ2V0X3RpbWVzY2FsZSAocGFkLT50cmFrKSwgR1NUX1NFQ09ORCkgLSBsYXN0X2R0czsKKyAgICAgIHBhZC0+bGFzdF9kdHMgKz0gZHVyYXRpb247CisgICAgfQorICB9CisKKyAgZ3N0X3F0X211eF9yZWdpc3Rlcl9idWZmZXJfaW5fY2h1bmsgKHF0bXV4LCBwYWQsIGJ1ZmZlcl9zaXplLCBkdXJhdGlvbik7CisKKyAgY2h1bmtfb2Zmc2V0ID0gcXRtdXgtPmN1cnJlbnRfY2h1bmtfb2Zmc2V0OworCisgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwKKyAgICAgICJQYWQgKCVzKSBkdHMgdXBkYXRlZCB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfUEFEX05BTUUgKHBhZC0+Y29sbGVjdC5wYWQpLCBHU1RfVElNRV9BUkdTIChwYWQtPmxhc3RfZHRzKSk7CisgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwKKyAgICAgICJBZGRpbmcgJWQgc2FtcGxlcyB0byB0cmFjaywgZHVyYXRpb246ICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICIgc2l6ZTogJSIgR19HVUlOVDMyX0ZPUk1BVCAiIGNodW5rIG9mZnNldDogJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgIG5zYW1wbGVzLCBzY2FsZWRfZHVyYXRpb24sIHNhbXBsZV9zaXplLCBjaHVua19vZmZzZXQpOworCisgIC8qIG1pZ2h0IGJlIGEgc3luYyBzYW1wbGUgKi8KKyAgaWYgKHBhZC0+c3luYyAmJgorICAgICAgIUdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGxhc3RfYnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCkpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRtdXgsICJBZGRpbmcgbmV3IHN5bmMgc2FtcGxlIGVudHJ5IGZvciB0cmFjayBvZiBwYWQgJXMiLAorICAgICAgICBHU1RfUEFEX05BTUUgKHBhZC0+Y29sbGVjdC5wYWQpKTsKKyAgICBzeW5jID0gVFJVRTsKKyAgfQorCisgIGlmIChHU1RfQlVGRkVSX0RUU19JU19WQUxJRCAobGFzdF9idWYpKSB7CisgICAgbGFzdF9kdHMgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKEdTVF9CVUZGRVJfRFRTIChsYXN0X2J1ZiksCisgICAgICAgIGF0b21fdHJha19nZXRfdGltZXNjYWxlIChwYWQtPnRyYWspLCBHU1RfU0VDT05EKTsKKyAgICBwdHNfb2Zmc2V0ID0KKyAgICAgICAgKGdpbnQ2NCkgKGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAoR1NUX0JVRkZFUl9QVFMgKGxhc3RfYnVmKSwKKyAgICAgICAgICAgIGF0b21fdHJha19nZXRfdGltZXNjYWxlIChwYWQtPnRyYWspLCBHU1RfU0VDT05EKSAtIGxhc3RfZHRzKTsKKyAgfSBlbHNlIHsKKyAgICBwdHNfb2Zmc2V0ID0gMDsKKyAgICBsYXN0X2R0cyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAoR1NUX0JVRkZFUl9QVFMgKGxhc3RfYnVmKSwKKyAgICAgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHBhZC0+dHJhayksIEdTVF9TRUNPTkQpOworICB9CisgIEdTVF9ERUJVRyAoImR0czogJSIgR1NUX1RJTUVfRk9STUFUICIgcHRzOiAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIgdGltZWJhc2VfZHRzOiAlZCBwdHNfb2Zmc2V0OiAlZCIsCisgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RUUyAobGFzdF9idWYpKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfUFRTIChsYXN0X2J1ZikpLAorICAgICAgKGludCkgKGxhc3RfZHRzKSwgKGludCkgKHB0c19vZmZzZXQpKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGR1cmF0aW9uKQorICAgICAgJiYgKHF0bXV4LT5jdXJyZW50X2NodW5rX2R1cmF0aW9uID4gcXRtdXgtPmxvbmdlc3RfY2h1bmsKKyAgICAgICAgICB8fCAhR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHF0bXV4LT5sb25nZXN0X2NodW5rKSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwKKyAgICAgICAgIk5ldyBsb25nZXN0IGNodW5rIGZvdW5kOiAlIiBHU1RfVElNRV9GT1JNQVQgIiwgcGFkICVzIiwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAocXRtdXgtPmN1cnJlbnRfY2h1bmtfZHVyYXRpb24pLAorICAgICAgICBHU1RfUEFEX05BTUUgKHBhZC0+Y29sbGVjdC5wYWQpKTsKKyAgICBxdG11eC0+bG9uZ2VzdF9jaHVuayA9IHF0bXV4LT5jdXJyZW50X2NodW5rX2R1cmF0aW9uOworICB9CisKKyAgaWYgKHF0bXV4LT5tdXhfbW9kZSA9PSBHU1RfUVRfTVVYX01PREVfUk9CVVNUX1JFQ09SRElOR19QUkVGSUxMKSB7CisgICAgY29uc3QgVHJha0J1ZmZlckVudHJ5SW5mbyAqc2FtcGxlX2VudHJ5OworICAgIGd1aW50NjQgYmxvY2tfaWR4ID0gcHJlZmlsbF9nZXRfYmxvY2tfaW5kZXggKHF0bXV4LCBwYWQpOworCisgICAgaWYgKGJsb2NrX2lkeCA+PSBwYWQtPnNhbXBsZXMtPmxlbikgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXV4LCBTVFJFQU0sIE1VWCwgKE5VTEwpLAorICAgICAgICAgICgiVW5leHBlY3RlZCBzYW1wbGUgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBleHBlY3RlZCB1cCB0byAldSIsCisgICAgICAgICAgICAgIGJsb2NrX2lkeCwgcGFkLT5zYW1wbGVzLT5sZW4pKTsKKyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiBhbGwgdmFsdWVzIGFyZSBhcyBleHBlY3RlZCAqLworICAgIHNhbXBsZV9lbnRyeSA9CisgICAgICAgICZnX2FycmF5X2luZGV4IChwYWQtPnNhbXBsZXMsIFRyYWtCdWZmZXJFbnRyeUluZm8sIGJsb2NrX2lkeCk7CisKKyAgICBpZiAoY2h1bmtfb2Zmc2V0IDwgc2FtcGxlX2VudHJ5LT5jaHVua19vZmZzZXQpIHsKKyAgICAgIGd1aW50IGZpbGxfc2l6ZSA9IHNhbXBsZV9lbnRyeS0+Y2h1bmtfb2Zmc2V0IC0gY2h1bmtfb2Zmc2V0OworICAgICAgR3N0QnVmZmVyICpmaWxsX2J1ZjsKKworICAgICAgZmlsbF9idWYgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgZmlsbF9zaXplLCBOVUxMKTsKKyAgICAgIGdzdF9idWZmZXJfbWVtc2V0IChmaWxsX2J1ZiwgMCwgMCwgZmlsbF9zaXplKTsKKworICAgICAgcmV0ID0gZ3N0X3F0X211eF9zZW5kX2J1ZmZlciAocXRtdXgsIGZpbGxfYnVmLCAmcXRtdXgtPm1kYXRfc2l6ZSwgVFJVRSk7CisgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICBnb3RvIGJhaWw7CisgICAgICBxdG11eC0+Y3VycmVudF9jaHVua19vZmZzZXQgPSBjaHVua19vZmZzZXQgPSBzYW1wbGVfZW50cnktPmNodW5rX29mZnNldDsKKyAgICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX3NpemUgPSBidWZmZXJfc2l6ZTsKKyAgICAgIHF0bXV4LT5jdXJyZW50X2NodW5rX2R1cmF0aW9uID0gZHVyYXRpb247CisgICAgfSBlbHNlIGlmIChjaHVua19vZmZzZXQgIT0gc2FtcGxlX2VudHJ5LT5jaHVua19vZmZzZXQpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG11eCwgU1RSRUFNLCBNVVgsIChOVUxMKSwKKyAgICAgICAgICAoIlVuZXhwZWN0ZWQgY2h1bmsgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgZXhwZWN0ZWQgdXAgdG8gJSIKKyAgICAgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgY2h1bmtfb2Zmc2V0LCBzYW1wbGVfZW50cnktPmNodW5rX29mZnNldCkpOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfQorCisgIC8qIG5vdyB3ZSBnbyBhbmQgcmVnaXN0ZXIgdGhpcyBidWZmZXIvc2FtcGxlIGFsbCBvdmVyICovCisgIHJldCA9IGdzdF9xdF9tdXhfcmVnaXN0ZXJfYW5kX3B1c2hfc2FtcGxlIChxdG11eCwgcGFkLCBsYXN0X2J1ZiwKKyAgICAgIGJ1ZiA9PSBOVUxMLCBuc2FtcGxlcywgbGFzdF9kdHMsIHNjYWxlZF9kdXJhdGlvbiwgc2FtcGxlX3NpemUsCisgICAgICBjaHVua19vZmZzZXQsIHN5bmMsIFRSVUUsIHB0c19vZmZzZXQpOworICBwYWQtPnNhbXBsZV9vZmZzZXQgKz0gbnNhbXBsZXM7CisKKyAgLyogaWYgdGhpcyBpcyBzcGFyc2UgYW5kIHdlIGhhdmUgYSBuZXh0IGJ1ZmZlciwgY2hlY2sgaWYgdGhlcmUgaXMgYW55IGdhcAorICAgKiBiZXR3ZWVuIHRoZW0gdG8gaW5zZXJ0IGFuIGVtcHR5IHNhbXBsZSAqLworICBpZiAocGFkLT5zcGFyc2UgJiYgYnVmKSB7CisgICAgaWYgKHBhZC0+Y3JlYXRlX2VtcHR5X2J1ZmZlcikgeworICAgICAgR3N0QnVmZmVyICplbXB0eV9idWY7CisgICAgICBnaW50NjQgZW1wdHlfZHVyYXRpb24gPQorICAgICAgICAgIEdTVF9CVUZGRVJfUFRTIChidWYpIC0gKEdTVF9CVUZGRVJfUFRTIChsYXN0X2J1ZikgKyBkdXJhdGlvbik7CisgICAgICBnaW50NjQgZW1wdHlfZHVyYXRpb25fc2NhbGVkOworICAgICAgZ3VpbnQgZW1wdHlfc2l6ZTsKKworICAgICAgZW1wdHlfYnVmID0gcGFkLT5jcmVhdGVfZW1wdHlfYnVmZmVyIChwYWQsIGVtcHR5X2R1cmF0aW9uKTsKKworICAgICAgcGFkLT5sYXN0X2R0cyA9IEdTVF9CVUZGRVJfUFRTIChidWYpOworICAgICAgZW1wdHlfZHVyYXRpb25fc2NhbGVkID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX3JvdW5kIChwYWQtPmxhc3RfZHRzLAorICAgICAgICAgIGF0b21fdHJha19nZXRfdGltZXNjYWxlIChwYWQtPnRyYWspLCBHU1RfU0VDT05EKQorICAgICAgICAgIC0gKGxhc3RfZHRzICsgc2NhbGVkX2R1cmF0aW9uKTsKKyAgICAgIGVtcHR5X3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChlbXB0eV9idWYpOworCisgICAgICBnc3RfcXRfbXV4X3JlZ2lzdGVyX2J1ZmZlcl9pbl9jaHVuayAocXRtdXgsIHBhZCwgZW1wdHlfc2l6ZSwKKyAgICAgICAgICBlbXB0eV9kdXJhdGlvbik7CisKKyAgICAgIHJldCA9CisgICAgICAgICAgZ3N0X3F0X211eF9yZWdpc3Rlcl9hbmRfcHVzaF9zYW1wbGUgKHF0bXV4LCBwYWQsIGVtcHR5X2J1ZiwgRkFMU0UsIDEsCisgICAgICAgICAgbGFzdF9kdHMgKyBzY2FsZWRfZHVyYXRpb24sIGVtcHR5X2R1cmF0aW9uX3NjYWxlZCwKKyAgICAgICAgICBlbXB0eV9zaXplLCBjaHVua19vZmZzZXQsIHN5bmMsIFRSVUUsIDApOworICAgIH0gZWxzZSB7CisgICAgICAvKiBvdXIgb25seSBjYXNlIGN1cnJlbnRseSBpcyB0eDNnIHN1YnRpdGxlcywgc28gdGhlcmUgaXMgbm8gcmVhc29uIHRvIGZpbGwgdGhpcyB5ZXQgKi8KKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwKKyAgICAgICAgICAibm8gZW1wdHkgYnVmZmVyIGNyZWF0aW9uIGZ1bmN0aW9uIGZvdW5kIGZvciBwYWQgJXMiLAorICAgICAgICAgIEdTVF9QQURfTkFNRSAocGFkLT5jb2xsZWN0LnBhZCkpOworICAgIH0KKyAgfQorCitleGl0OgorCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCitiYWlsOgorICB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAobGFzdF9idWYpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorZnJhZ21lbnRlZF9zYW1wbGU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksCisgICAgICAgICgiQXVkaW8gYnVmZmVyIGNvbnRhaW5zIGZyYWdtZW50ZWQgc2FtcGxlLiIpKTsKKyAgICBnb3RvIGJhaWw7CisgIH0KK3Jhd19hdWRpb190aW1lc3RhbXBfZHJpZnQ6CisgIHsKKyAgICAvKiBUT0RPOiBDb3VsZCBpbiB0aGVvcnkgYmUgaW1wbGVtZW50ZWQgd2l0aCBlZGl0IGxpc3RzICovCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0bXV4LCBTVFJFQU0sIE1VWCwgKE5VTEwpLAorICAgICAgICAoIkF1ZGlvIHN0cmVhbSB0aW1lc3RhbXBzIGFyZSBkcmlmdGluZyAoZ290ICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAgICAgIiwgZXhwZWN0ZWQgJSIgR1NUX1RJTUVfRk9STUFUICIpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgeWV0ISIsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RUU19PUl9QVFMgKGxhc3RfYnVmKSksCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChnc3RfdXRpbF91aW50NjRfc2NhbGUgKHBhZC0+c2FtcGxlX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgR1NUX1NFQ09ORCwKKyAgICAgICAgICAgICAgICAgICAgYXRvbV90cmFrX2dldF90aW1lc2NhbGUgKHBhZC0+dHJhaykpICsgcGFkLT5maXJzdF90cykpKTsKKyAgICBnb3RvIGJhaWw7CisgIH0KK25vX3B0czoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG11eCwgU1RSRUFNLCBNVVgsIChOVUxMKSwgKCJCdWZmZXIgaGFzIG5vIFBUUy4iKSk7CisgICAgZ290byBiYWlsOworICB9Citub3RfbmVnb3RpYXRlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdG11eCwgQ09SRSwgTkVHT1RJQVRJT04sIChOVUxMKSwKKyAgICAgICAgKCJmb3JtYXQgd2Fzbid0IG5lZ290aWF0ZWQgYmVmb3JlIGJ1ZmZlciBmbG93IG9uIHBhZCAlcyIsCisgICAgICAgICAgICBHU1RfUEFEX05BTUUgKHBhZC0+Y29sbGVjdC5wYWQpKSk7CisgICAgaWYgKGJ1ZikKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICB9Cit9CisKKy8qCisgKiBEVFMgcnVubmluZyB0aW1lIGNhbiBiZSBuZWdhdGl2ZS4gVGhlcmUgaXMgbm8gd2F5IHRvIHJlcHJlc2VudCB0aGF0IGluCisgKiBNUDQgaG93ZXZlciwgdGh1cyB3ZSBuZWVkIHRvIG9mZnNldCBEVFMgc28gdGhhdCBpdCBzdGFydHMgZnJvbSAwLgorICovCitzdGF0aWMgdm9pZAorZ3N0X3F0X3BhZF9hZGp1c3RfYnVmZmVyX2R0cyAoR3N0UVRNdXggKiBxdG11eCwgR3N0UVRQYWQgKiBwYWQsCisgICAgR3N0Q29sbGVjdERhdGEgKiBjZGF0YSwgR3N0QnVmZmVyICoqIGJ1ZikKK3sKKyAgR3N0Q2xvY2tUaW1lIHB0czsKKyAgZ2ludDY0IGR0czsKKworICBwdHMgPSBHU1RfQlVGRkVSX1BUUyAoKmJ1Zik7CisgIGR0cyA9IEdTVF9DT0xMRUNUX1BBRFNfRFRTIChjZGF0YSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHF0bXV4LCAic2VsZWN0ZWQgcGFkICVzIHdpdGggUFRTICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiBhbmQgRFRTICUiIEdTVF9TVElNRV9GT1JNQVQsIEdTVF9QQURfTkFNRSAoY2RhdGEtPnBhZCksCisgICAgICBHU1RfVElNRV9BUkdTIChwdHMpLCBHU1RfU1RJTUVfQVJHUyAoZHRzKSk7CisKKyAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAocGFkLT5kdHNfYWRqdXN0bWVudCkpIHsKKyAgICBpZiAoR1NUX0NMT0NLX1NUSU1FX0lTX1ZBTElEIChkdHMpICYmIGR0cyA8IDApCisgICAgICBwYWQtPmR0c19hZGp1c3RtZW50ID0gLWR0czsKKyAgICBlbHNlCisgICAgICBwYWQtPmR0c19hZGp1c3RtZW50ID0gMDsKKyAgfQorCisgIGlmIChwYWQtPmR0c19hZGp1c3RtZW50ID4gMCkgeworICAgICpidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKCpidWYpOworCisgICAgZHRzICs9IHBhZC0+ZHRzX2FkanVzdG1lbnQ7CisKKyAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHB0cykpCisgICAgICBwdHMgKz0gcGFkLT5kdHNfYWRqdXN0bWVudDsKKworICAgIGlmIChHU1RfQ0xPQ0tfU1RJTUVfSVNfVkFMSUQgKGR0cykgJiYgZHRzIDwgMCkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYWQsICJEZWNyZWFzaW5nIERUUy4iKTsKKyAgICAgIGR0cyA9IDA7CisgICAgfQorCisgICAgaWYgKHB0cyA8IGR0cykgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYWQsICJEVFMgaXMgYmlnZ2VyIHRoZW4gUFRTIik7CisgICAgICBwdHMgPSBkdHM7CisgICAgfQorCisgICAgR1NUX0JVRkZFUl9QVFMgKCpidWYpID0gcHRzOworICAgIEdTVF9CVUZGRVJfRFRTICgqYnVmKSA9IGR0czsKKworICAgIEdTVF9MT0dfT0JKRUNUIChxdG11eCwgInRpbWUgYWRqdXN0ZWQgdG8gUFRTICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAiIGFuZCBEVFMgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChwdHMpLCBHU1RfVElNRV9BUkdTIChkdHMpKTsKKyAgfQorfQorCitzdGF0aWMgR3N0UVRQYWQgKgorZmluZF9iZXN0X3BhZCAoR3N0UVRNdXggKiBxdG11eCwgR3N0Q29sbGVjdFBhZHMgKiBwYWRzKQoreworICBHU0xpc3QgKndhbGs7CisgIEdzdFFUUGFkICpiZXN0X3BhZCA9IE5VTEw7CisKKyAgaWYgKHF0bXV4LT5tdXhfbW9kZSA9PSBHU1RfUVRfTVVYX01PREVfUk9CVVNUX1JFQ09SRElOR19QUkVGSUxMKSB7CisgICAgZ3VpbnQ2NCBzbWFsbGVzdF9vZmZzZXQgPSBHX01BWFVJTlQ2NDsKKyAgICBndWludDY0IGNodW5rX29mZnNldCA9IDA7CisKKyAgICBmb3IgKHdhbGsgPSBxdG11eC0+Y29sbGVjdC0+ZGF0YTsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICAgIEdzdENvbGxlY3REYXRhICpjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSB3YWxrLT5kYXRhOworICAgICAgR3N0UVRQYWQgKnF0cGFkID0gKEdzdFFUUGFkICopIGNkYXRhOworICAgICAgY29uc3QgVHJha0J1ZmZlckVudHJ5SW5mbyAqc2FtcGxlX2VudHJ5OworICAgICAgZ3VpbnQ2NCBibG9ja19pZHgsIGN1cnJlbnRfYmxvY2tfaWR4OworICAgICAgZ3VpbnQ2NCBjaHVua19vZmZzZXRfb2Zmc2V0ID0gMDsKKyAgICAgIEdzdEJ1ZmZlciAqdG1wX2J1ZiA9CisgICAgICAgICAgZ3N0X2NvbGxlY3RfcGFkc19wZWVrIChwYWRzLCAoR3N0Q29sbGVjdERhdGEgKikgcXRwYWQpOworCisgICAgICAvKiBDaGVjayBmb3IgRU9TIHBhZHMgYW5kIGp1c3Qgc2tpcCB0aGVtICovCisgICAgICBpZiAoIXRtcF9idWYgJiYgIXF0cGFkLT5sYXN0X2J1ZiAmJiAoIXF0cGFkLT5yYXdfYXVkaW9fYWRhcHRlcgorICAgICAgICAgICAgICB8fCBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHF0cGFkLT5yYXdfYXVkaW9fYWRhcHRlcikgPT0gMCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKHRtcF9idWYpCisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHRtcF9idWYpOworCisgICAgICAvKiBGaW5kIHRoZSBleGFjdCBvZmZzZXQgd2hlcmUgdGhlIG5leHQgc2FtcGxlIG9mIHRoaXMgdHJhY2sgaXMgc3VwcG9zZWQKKyAgICAgICAqIHRvIGJlIHdyaXR0ZW4gYXQgKi8KKyAgICAgIGJsb2NrX2lkeCA9IGN1cnJlbnRfYmxvY2tfaWR4ID0gcHJlZmlsbF9nZXRfYmxvY2tfaW5kZXggKHF0bXV4LCBxdHBhZCk7CisgICAgICBzYW1wbGVfZW50cnkgPQorICAgICAgICAgICZnX2FycmF5X2luZGV4IChxdHBhZC0+c2FtcGxlcywgVHJha0J1ZmZlckVudHJ5SW5mbywgYmxvY2tfaWR4KTsKKyAgICAgIHdoaWxlIChibG9ja19pZHggPiAwKSB7CisgICAgICAgIGNvbnN0IFRyYWtCdWZmZXJFbnRyeUluZm8gKnRtcCA9CisgICAgICAgICAgICAmZ19hcnJheV9pbmRleCAocXRwYWQtPnNhbXBsZXMsIFRyYWtCdWZmZXJFbnRyeUluZm8sIGJsb2NrX2lkeCAtIDEpOworCisgICAgICAgIGlmICh0bXAtPmNodW5rX29mZnNldCAhPSBzYW1wbGVfZW50cnktPmNodW5rX29mZnNldCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2h1bmtfb2Zmc2V0X29mZnNldCArPSB0bXAtPnNpemUgKiB0bXAtPm5zYW1wbGVzOworICAgICAgICBibG9ja19pZHgtLTsKKyAgICAgIH0KKworICAgICAgLyogRXhjZXB0IGZvciB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCBwYWQgYmVpbmcgRU9TIHdlIGFsd2F5cyBoYXZlCisgICAgICAgKiAgcXRtdXgtPmN1cnJlbnRfY2h1bmtfb2Zmc2V0ICsgcXRtdXgtPmN1cnJlbnRfY2h1bmtfc2l6ZQorICAgICAgICogICAgPT0KKyAgICAgICAqICBzYW1wbGVfZW50cnktPmNodW5rX29mZnNldCArIGNodW5rX29mZnNldF9vZmZzZXQKKyAgICAgICAqIGZvciB0aGUgYmVzdCBwYWQuIEluc3RlYWQgb2YgY2hlY2tpbmcgdGhhdCwgd2UganVzdCByZXR1cm4gdGhlCisgICAgICAgKiBwYWQgdGhhdCBoYXMgdGhlIHNtYWxsZXN0IG9mZnNldCBmb3IgdGhlIG5leHQgdG8tYmUtd3JpdHRlbiBzYW1wbGUuCisgICAgICAgKi8KKyAgICAgIGlmIChzYW1wbGVfZW50cnktPmNodW5rX29mZnNldCArIGNodW5rX29mZnNldF9vZmZzZXQgPCBzbWFsbGVzdF9vZmZzZXQpIHsKKyAgICAgICAgc21hbGxlc3Rfb2Zmc2V0ID0gc2FtcGxlX2VudHJ5LT5jaHVua19vZmZzZXQgKyBjaHVua19vZmZzZXRfb2Zmc2V0OworICAgICAgICBiZXN0X3BhZCA9IHF0cGFkOworICAgICAgICBjaHVua19vZmZzZXQgPSBzYW1wbGVfZW50cnktPmNodW5rX29mZnNldDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2h1bmtfb2Zmc2V0ICE9IHF0bXV4LT5jdXJyZW50X2NodW5rX29mZnNldCkgeworICAgICAgcXRtdXgtPmN1cnJlbnRfcGFkID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gYmVzdF9wYWQ7CisgIH0KKworICBpZiAocXRtdXgtPmN1cnJlbnRfcGFkICYmIChxdG11eC0+aW50ZXJsZWF2ZV9ieXRlcyAhPSAwCisgICAgICAgICAgfHwgcXRtdXgtPmludGVybGVhdmVfdGltZSAhPSAwKSAmJiAocXRtdXgtPmludGVybGVhdmVfYnl0ZXMgPT0gMAorICAgICAgICAgIHx8IHF0bXV4LT5jdXJyZW50X2NodW5rX3NpemUgPD0gcXRtdXgtPmludGVybGVhdmVfYnl0ZXMpCisgICAgICAmJiAocXRtdXgtPmludGVybGVhdmVfdGltZSA9PSAwCisgICAgICAgICAgfHwgcXRtdXgtPmN1cnJlbnRfY2h1bmtfZHVyYXRpb24gPD0gcXRtdXgtPmludGVybGVhdmVfdGltZSkKKyAgICAgICYmIHF0bXV4LT5tdXhfbW9kZSAhPSBHU1RfUVRfTVVYX01PREVfRlJBR01FTlRFRAorICAgICAgJiYgcXRtdXgtPm11eF9tb2RlICE9IEdTVF9RVF9NVVhfTU9ERV9GUkFHTUVOVEVEX1NUUkVBTUFCTEUpIHsKKyAgICBHc3RCdWZmZXIgKnRtcF9idWYgPQorICAgICAgICBnc3RfY29sbGVjdF9wYWRzX3BlZWsgKHBhZHMsIChHc3RDb2xsZWN0RGF0YSAqKSBxdG11eC0+Y3VycmVudF9wYWQpOworCisgICAgaWYgKHRtcF9idWYgfHwgcXRtdXgtPmN1cnJlbnRfcGFkLT5sYXN0X2J1ZikgeworICAgICAgYmVzdF9wYWQgPSBxdG11eC0+Y3VycmVudF9wYWQ7CisgICAgICBpZiAodG1wX2J1ZikKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAodG1wX2J1Zik7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIlJldXNpbmcgcGFkICVzOiVzIiwKKyAgICAgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKGJlc3RfcGFkLT5jb2xsZWN0LnBhZCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChxdG11eC0+Y29sbGVjdC0+ZGF0YS0+bmV4dCkgeworICAgIC8qIE9ubHkgc3dpdGNoIHBhZHMgaWYgd2UgaGF2ZSBtb3JlIHRoYW4gb25lLCBvdGhlcndpc2UKKyAgICAgKiB3ZSBjYW4ganVzdCBwdXQgZXZlcnl0aGluZyBpbnRvIGEgc2luZ2xlIGNodW5rIGFuZCBzYXZlCisgICAgICogYSBmZXcgYnl0ZXMgb2Ygb2Zmc2V0cworICAgICAqLworICAgIGlmIChxdG11eC0+Y3VycmVudF9wYWQpCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIlN3aXRjaGluZyBmcm9tIHBhZCAlczolcyIsCisgICAgICAgICAgR1NUX0RFQlVHX1BBRF9OQU1FIChxdG11eC0+Y3VycmVudF9wYWQtPmNvbGxlY3QucGFkKSk7CisgICAgYmVzdF9wYWQgPSBxdG11eC0+Y3VycmVudF9wYWQgPSBOVUxMOworICB9CisKKyAgaWYgKCFiZXN0X3BhZCkgeworICAgIEdzdENsb2NrVGltZSBiZXN0X3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgICAgZm9yICh3YWxrID0gcXRtdXgtPmNvbGxlY3QtPmRhdGE7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgICBHc3RDb2xsZWN0RGF0YSAqY2RhdGEgPSAoR3N0Q29sbGVjdERhdGEgKikgd2Fsay0+ZGF0YTsKKyAgICAgIEdzdFFUUGFkICpxdHBhZCA9IChHc3RRVFBhZCAqKSBjZGF0YTsKKyAgICAgIEdzdEJ1ZmZlciAqdG1wX2J1ZjsKKyAgICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisKKyAgICAgIHRtcF9idWYgPSBnc3RfY29sbGVjdF9wYWRzX3BlZWsgKHBhZHMsIGNkYXRhKTsKKyAgICAgIGlmICghdG1wX2J1ZikgeworICAgICAgICAvKiBUaGlzIG9uZSBpcyBuZXdseSBFT1Mgbm93LCBmaW5pc2ggaXQgZm9yIHJlYWwgKi8KKyAgICAgICAgaWYgKHF0cGFkLT5sYXN0X2J1ZikgeworICAgICAgICAgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfRFRTX09SX1BUUyAocXRwYWQtPmxhc3RfYnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHF0cGFkLT5sYXN0X2J1ZikKKyAgICAgICAgICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX0RUU19PUl9QVFMgKHF0cGFkLT5sYXN0X2J1Zik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX0RUU19PUl9QVFMgKHRtcF9idWYpOworICAgICAgfQorCisgICAgICBpZiAoYmVzdF9wYWQgPT0gTlVMTCB8fAorICAgICAgICAgICFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoYmVzdF90aW1lKSB8fCB0aW1lc3RhbXAgPCBiZXN0X3RpbWUpIHsKKyAgICAgICAgYmVzdF9wYWQgPSBxdHBhZDsKKyAgICAgICAgYmVzdF90aW1lID0gdGltZXN0YW1wOworICAgICAgfQorCisgICAgICBpZiAodG1wX2J1ZikKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAodG1wX2J1Zik7CisgICAgfQorCisgICAgaWYgKGJlc3RfcGFkKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIkNob29zaW5nIHBhZCAlczolcyIsCisgICAgICAgICAgR1NUX0RFQlVHX1BBRF9OQU1FIChiZXN0X3BhZC0+Y29sbGVjdC5wYWQpKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJObyBiZXN0IHBhZDogRU9TIik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGJlc3RfcGFkOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0X211eF9jb2xsZWN0ZWQgKEdzdENvbGxlY3RQYWRzICogcGFkcywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RRVE11eCAqcXRtdXggPSBHU1RfUVRfTVVYX0NBU1QgKHVzZXJfZGF0YSk7CisgIEdzdFFUUGFkICpiZXN0X3BhZCA9IE5VTEw7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHF0bXV4LT5zdGF0ZSA9PSBHU1RfUVRfTVVYX1NUQVRFX1NUQVJURUQpKSB7CisgICAgaWYgKChyZXQgPSBnc3RfcXRfbXV4X3N0YXJ0X2ZpbGUgKHF0bXV4KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICByZXR1cm4gcmV0OworCisgICAgcXRtdXgtPnN0YXRlID0gR1NUX1FUX01VWF9TVEFURV9EQVRBOworICB9CisKKyAgaWYgKEdfVU5MSUtFTFkgKHF0bXV4LT5zdGF0ZSA9PSBHU1RfUVRfTVVYX1NUQVRFX0VPUykpCisgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKworICBiZXN0X3BhZCA9IGZpbmRfYmVzdF9wYWQgKHF0bXV4LCBwYWRzKTsKKworICAvKiBjbGlwcGluZyBhbHJlYWR5IGNvbnZlcnRlZCB0byBydW5uaW5nIHRpbWUgKi8KKyAgaWYgKGJlc3RfcGFkICE9IE5VTEwpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisKKyAgICBpZiAocXRtdXgtPm11eF9tb2RlICE9IEdTVF9RVF9NVVhfTU9ERV9ST0JVU1RfUkVDT1JESU5HX1BSRUZJTEwgfHwKKyAgICAgICAgYmVzdF9wYWQtPnJhd19hdWRpb19hZGFwdGVyID09IE5VTEwgfHwKKyAgICAgICAgYmVzdF9wYWQtPnJhd19hdWRpb19hZGFwdGVyX3B0cyA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgICAgYnVmID0gZ3N0X2NvbGxlY3RfcGFkc19wb3AgKHBhZHMsIChHc3RDb2xsZWN0RGF0YSAqKSBiZXN0X3BhZCk7CisKKyAgICBnX2Fzc2VydCAoYnVmIHx8IGJlc3RfcGFkLT5sYXN0X2J1ZiB8fCAoYmVzdF9wYWQtPnJhd19hdWRpb19hZGFwdGVyCisgICAgICAgICAgICAmJiBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGJlc3RfcGFkLT5yYXdfYXVkaW9fYWRhcHRlcikgPiAwKSk7CisKKyAgICBpZiAoYnVmKQorICAgICAgZ3N0X3F0X3BhZF9hZGp1c3RfYnVmZmVyX2R0cyAocXRtdXgsIGJlc3RfcGFkLAorICAgICAgICAgIChHc3RDb2xsZWN0RGF0YSAqKSBiZXN0X3BhZCwgJmJ1Zik7CisKKyAgICByZXQgPSBnc3RfcXRfbXV4X2FkZF9idWZmZXIgKHF0bXV4LCBiZXN0X3BhZCwgYnVmKTsKKyAgfSBlbHNlIHsKKyAgICBxdG11eC0+c3RhdGUgPSBHU1RfUVRfTVVYX1NUQVRFX0VPUzsKKyAgICByZXQgPSBnc3RfcXRfbXV4X3N0b3BfZmlsZSAocXRtdXgpOworICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiUHVzaGluZyBlb3MiKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocXRtdXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LCAiRmFpbGVkIHRvIHN0b3AgZmlsZTogJXMiLAorICAgICAgICAgIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2NoZWNrX2ZpZWxkIChHUXVhcmsgZmllbGRfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlID0gKEdzdFN0cnVjdHVyZSAqKSB1c2VyX2RhdGE7CisgIGNvbnN0IEdWYWx1ZSAqb3RoZXIgPSBnc3Rfc3RydWN0dXJlX2lkX2dldF92YWx1ZSAoc3RydWN0dXJlLCBmaWVsZF9pZCk7CisgIGlmIChvdGhlciA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgcmV0dXJuIGdzdF92YWx1ZV9jb21wYXJlICh2YWx1ZSwgb3RoZXIpID09IEdTVF9WQUxVRV9FUVVBTDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcXRtdXhfY2Fwc19pc19zdWJzZXRfZnVsbCAoR3N0UVRNdXggKiBxdG11eCwgR3N0Q2FwcyAqIHN1YnNldCwKKyAgICBHc3RDYXBzICogc3VwZXJzZXQpCit7CisgIEdzdFN0cnVjdHVyZSAqc3ViX3MgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChzdWJzZXQsIDApOworICBHc3RTdHJ1Y3R1cmUgKnN1cF9zID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoc3VwZXJzZXQsIDApOworCisgIHJldHVybiBnc3Rfc3RydWN0dXJlX2ZvcmVhY2ggKHN1Yl9zLCBjaGVja19maWVsZCwgc3VwX3MpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdF9tdXhfYXVkaW9fc2lua19zZXRfY2FwcyAoR3N0UVRQYWQgKiBxdHBhZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFBhZCAqcGFkID0gcXRwYWQtPmNvbGxlY3QucGFkOworICBHc3RRVE11eCAqcXRtdXggPSBHU1RfUVRfTVVYX0NBU1QgKGdzdF9wYWRfZ2V0X3BhcmVudCAocGFkKSk7CisgIEdzdFFUTXV4Q2xhc3MgKnF0bXV4X2tsYXNzID0gKEdzdFFUTXV4Q2xhc3MgKikgKEdfT0JKRUNUX0dFVF9DTEFTUyAocXRtdXgpKTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IGdjaGFyICptaW1ldHlwZTsKKyAgZ2ludCByYXRlLCBjaGFubmVsczsKKyAgY29uc3QgR1ZhbHVlICp2YWx1ZSA9IE5VTEw7CisgIGNvbnN0IEdzdEJ1ZmZlciAqY29kZWNfZGF0YSA9IE5VTEw7CisgIEdzdFFUTXV4Rm9ybWF0IGZvcm1hdDsKKyAgQXVkaW9TYW1wbGVFbnRyeSBlbnRyeSA9IHsgMCwgfTsKKyAgQXRvbUluZm8gKmV4dF9hdG9tID0gTlVMTDsKKyAgZ2ludCBjb25zdGFudF9zaXplID0gMDsKKyAgY29uc3QgZ2NoYXIgKnN0cmVhbV9mb3JtYXQ7CisgIGd1aW50MzIgdGltZXNjYWxlOworCisgIC8qIGRvZXMgbm90IGdvIHdlbGwgdG8gcmVuZWdvdGlhdGUgc3RyZWFtIG1pZC13YXksIHVubGVzcworICAgKiB0aGUgb2xkIGNhcHMgYXJlIGEgc3Vic2V0IG9mIHRoZSBuZXcgb25lICh0aGlzIG1lYW5zIHVwc3RyZWFtCisgICAqIGFkZGVkIG1vcmUgaW5mbyB0byB0aGUgY2FwcywgYXMgYm90aCBzaG91bGQgYmUgJ2ZpeGVkJyBjYXBzKSAqLworICBpZiAocXRwYWQtPmZvdXJjYykgeworICAgIEdzdENhcHMgKmN1cnJlbnRfY2FwczsKKworICAgIGN1cnJlbnRfY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFkKTsKKyAgICBnX2Fzc2VydCAoY2FwcyAhPSBOVUxMKTsKKworICAgIGlmICghZ3N0X3F0bXV4X2NhcHNfaXNfc3Vic2V0X2Z1bGwgKHF0bXV4LCBjdXJyZW50X2NhcHMsIGNhcHMpKSB7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY3VycmVudF9jYXBzKTsKKyAgICAgIGdvdG8gcmVmdXNlX3JlbmVnb3RpYXRpb247CisgICAgfQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LAorICAgICAgICAicGFkICVzIGFjY2VwdGVkIHJlbmVnb3RpYXRpb24gdG8gJSIgR1NUX1BUUl9GT1JNQVQgIiBmcm9tICUiCisgICAgICAgIEdTVF9QVFJfRk9STUFULCBHU1RfUEFEX05BTUUgKHBhZCksIGNhcHMsIGN1cnJlbnRfY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGN1cnJlbnRfY2Fwcyk7CisKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiJXM6JXMsIGNhcHM9JSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKHBhZCksIGNhcHMpOworCisgIHF0cGFkLT5wcmVwYXJlX2J1Zl9mdW5jID0gTlVMTDsKKworICBmb3JtYXQgPSBxdG11eF9rbGFzcy0+Zm9ybWF0OworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgbWltZXR5cGUgPSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzdHJ1Y3R1cmUpOworCisgIC8qIGNvbW1vbiBpbmZvICovCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsICZjaGFubmVscykgfHwKKyAgICAgICFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgInJhdGUiLCAmcmF0ZSkpIHsKKyAgICBnb3RvIHJlZnVzZV9jYXBzOworICB9CisKKyAgLyogb3B0aW9uYWwgKi8KKyAgdmFsdWUgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAiY29kZWNfZGF0YSIpOworICBpZiAodmFsdWUgIT0gTlVMTCkKKyAgICBjb2RlY19kYXRhID0gZ3N0X3ZhbHVlX2dldF9idWZmZXIgKHZhbHVlKTsKKworICBxdHBhZC0+aXNfb3V0X29mX29yZGVyID0gRkFMU0U7CisKKyAgLyogc2V0IGNvbW1vbiBwcm9wZXJ0aWVzICovCisgIGVudHJ5LnNhbXBsZV9yYXRlID0gcmF0ZTsKKyAgZW50cnkuY2hhbm5lbHMgPSBjaGFubmVsczsKKyAgLyogZGVmYXVsdCAqLworICBlbnRyeS5zYW1wbGVfc2l6ZSA9IDE2OworICAvKiB0aGlzIGlzIHRoZSB0eXBpY2FsIGNvbXByZXNzZWQgY2FzZSAqLworICBpZiAoZm9ybWF0ID09IEdTVF9RVF9NVVhfRk9STUFUX1FUKSB7CisgICAgZW50cnkudmVyc2lvbiA9IDE7CisgICAgZW50cnkuY29tcHJlc3Npb25faWQgPSAtMjsKKyAgfQorCisgIC8qIG5vdyBtYXAgb250byBhIGZvdXJjYywgYW5kIHNvbWUgZXh0cmEgcHJvcGVydGllcyAqLworICBpZiAoc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL21wZWciKSA9PSAwKSB7CisgICAgZ2ludCBtcGVndmVyc2lvbiA9IDAsIG1wZWdhdWRpb3ZlcnNpb24gPSAwOworICAgIGdpbnQgbGF5ZXIgPSAtMTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAibXBlZ3ZlcnNpb24iLCAmbXBlZ3ZlcnNpb24pOworICAgIHN3aXRjaCAobXBlZ3ZlcnNpb24pIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJsYXllciIsICZsYXllcik7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAibXBlZ2F1ZGlvdmVyc2lvbiIsCisgICAgICAgICAgICAmbXBlZ2F1ZGlvdmVyc2lvbik7CisKKyAgICAgICAgLyogbXAxLzIvMyAqLworICAgICAgICAvKiBub3RlOiBRdWlja1RpbWUgcGxheWVyIGRvZXMgbm90IGxpa2UgbXAzIGVpdGhlciB3YXkgaW4gaXNvL21wNCAqLworICAgICAgICBpZiAoZm9ybWF0ID09IEdTVF9RVF9NVVhfRk9STUFUX1FUKQorICAgICAgICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ19fbXAzOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfbXA0YTsKKyAgICAgICAgICBleHRfYXRvbSA9CisgICAgICAgICAgICAgIGJ1aWxkX2VzZHNfZXh0ZW5zaW9uIChxdHBhZC0+dHJhaywgRVNEU19PQkpFQ1RfVFlQRV9NUEVHMV9QMywKKyAgICAgICAgICAgICAgRVNEU19TVFJFQU1fVFlQRV9BVURJTywgY29kZWNfZGF0YSwgcXRwYWQtPmF2Z19iaXRyYXRlLAorICAgICAgICAgICAgICBxdHBhZC0+bWF4X2JpdHJhdGUpOworICAgICAgICB9CisgICAgICAgIGlmIChsYXllciA9PSAxKSB7CisgICAgICAgICAgZ193YXJuX2lmX2ZhaWwgKGZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9NUDQKKyAgICAgICAgICAgICAgfHwgZm9ybWF0ID09IEdTVF9RVF9NVVhfRk9STUFUX1FUKTsKKyAgICAgICAgICBlbnRyeS5zYW1wbGVzX3Blcl9wYWNrZXQgPSAzODQ7CisgICAgICAgIH0gZWxzZSBpZiAobGF5ZXIgPT0gMikgeworICAgICAgICAgIGdfd2Fybl9pZl9mYWlsIChmb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfTVA0CisgICAgICAgICAgICAgIHx8IGZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9RVCk7CisgICAgICAgICAgZW50cnkuc2FtcGxlc19wZXJfcGFja2V0ID0gMTE1MjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnX3dhcm5faWZfZmFpbCAobGF5ZXIgPT0gMyk7CisgICAgICAgICAgZW50cnkuc2FtcGxlc19wZXJfcGFja2V0ID0gKG1wZWdhdWRpb3ZlcnNpb24gPD0gMSkgPyAxMTUyIDogNTc2OworICAgICAgICB9CisgICAgICAgIGVudHJ5LmJ5dGVzX3Blcl9zYW1wbGUgPSAyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKworICAgICAgICAvKiBjaGVjayBzdHJlYW0tZm9ybWF0ICovCisgICAgICAgIHN0cmVhbV9mb3JtYXQgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgInN0cmVhbS1mb3JtYXQiKTsKKyAgICAgICAgaWYgKHN0cmVhbV9mb3JtYXQpIHsKKyAgICAgICAgICBpZiAoc3RyY21wIChzdHJlYW1fZm9ybWF0LCAicmF3IikgIT0gMCkgeworICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgIlVuc3VwcG9ydGVkIEFBQyBzdHJlYW0tZm9ybWF0ICVzLCAiCisgICAgICAgICAgICAgICAgInBsZWFzZSB1c2UgJ3JhdyciLCBzdHJlYW1fZm9ybWF0KTsKKyAgICAgICAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsICJObyBzdHJlYW0tZm9ybWF0IHByZXNlbnQgaW4gY2FwcywgIgorICAgICAgICAgICAgICAiYXNzdW1pbmcgJ3JhdyciKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY29kZWNfZGF0YSB8fCBnc3RfYnVmZmVyX2dldF9zaXplICgoR3N0QnVmZmVyICopIGNvZGVjX2RhdGEpIDwgMikgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsICJubyAodmFsaWQpIGNvZGVjX2RhdGEgZm9yIEFBQyBhdWRpbyIpOworICAgICAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3VpbnQ4IHByb2ZpbGU7CisKKyAgICAgICAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKChHc3RCdWZmZXIgKikgY29kZWNfZGF0YSwgMCwgJnByb2ZpbGUsIDEpOworICAgICAgICAgIC8qIHdhcm4gaWYgbm90IExvdyBDb21wbGV4aXR5IHByb2ZpbGUgKi8KKyAgICAgICAgICBwcm9maWxlID4+PSAzOworICAgICAgICAgIGlmIChwcm9maWxlICE9IDIpCisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LAorICAgICAgICAgICAgICAgICJub24tTEMgQUFDIG1heSBub3QgcnVuIHdlbGwgb24gKEFwcGxlKSBRdWlja1RpbWUvaVR1bmVzIik7CisgICAgICAgIH0KKworICAgICAgICAvKiBBQUMgKi8KKyAgICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX21wNGE7CisKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9RVCkKKyAgICAgICAgICBleHRfYXRvbSA9IGJ1aWxkX21vdl9hYWNfZXh0ZW5zaW9uIChxdHBhZC0+dHJhaywgY29kZWNfZGF0YSwKKyAgICAgICAgICAgICAgcXRwYWQtPmF2Z19iaXRyYXRlLCBxdHBhZC0+bWF4X2JpdHJhdGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgZXh0X2F0b20gPQorICAgICAgICAgICAgICBidWlsZF9lc2RzX2V4dGVuc2lvbiAocXRwYWQtPnRyYWssIEVTRFNfT0JKRUNUX1RZUEVfTVBFRzRfUDMsCisgICAgICAgICAgICAgIEVTRFNfU1RSRUFNX1RZUEVfQVVESU8sIGNvZGVjX2RhdGEsIHF0cGFkLT5hdmdfYml0cmF0ZSwKKyAgICAgICAgICAgICAgcXRwYWQtPm1heF9iaXRyYXRlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL0FNUiIpID09IDApIHsKKyAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0Nfc2FtcjsKKyAgICBlbnRyeS5zYW1wbGVfc2l6ZSA9IDE2OworICAgIGVudHJ5LnNhbXBsZXNfcGVyX3BhY2tldCA9IDE2MDsKKyAgICBlbnRyeS5ieXRlc19wZXJfc2FtcGxlID0gMjsKKyAgICBleHRfYXRvbSA9IGJ1aWxkX2Ftcl9leHRlbnNpb24gKCk7CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL0FNUi1XQiIpID09IDApIHsKKyAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0Nfc2F3YjsKKyAgICBlbnRyeS5zYW1wbGVfc2l6ZSA9IDE2OworICAgIGVudHJ5LnNhbXBsZXNfcGVyX3BhY2tldCA9IDMyMDsKKyAgICBlbnRyeS5ieXRlc19wZXJfc2FtcGxlID0gMjsKKyAgICBleHRfYXRvbSA9IGJ1aWxkX2Ftcl9leHRlbnNpb24gKCk7CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtcmF3IikgPT0gMCkgeworICAgIEdzdEF1ZGlvSW5mbyBpbmZvOworCisgICAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJmluZm8pOworICAgIGlmICghZ3N0X2F1ZGlvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgY2FwcykpCisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworCisgICAgLyogc3BlYyBoYXMgbm8gcGxhY2UgZm9yIGEgZGlzdGluY3Rpb24gaW4gdGhlc2UgKi8KKyAgICBpZiAoaW5mby5maW5mby0+d2lkdGggIT0gaW5mby5maW5mby0+ZGVwdGgpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAid2lkdGggbXVzdCBiZSBzYW1lIGFzIGRlcHRoISIpOworICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgICB9CisKKyAgICBpZiAoKGluZm8uZmluZm8tPmZsYWdzICYgR1NUX0FVRElPX0ZPUk1BVF9GTEFHX1NJR05FRCkpIHsKKyAgICAgIGlmIChpbmZvLmZpbmZvLT5lbmRpYW5uZXNzID09IEdfTElUVExFX0VORElBTikKKyAgICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX3Nvd3Q7CisgICAgICBlbHNlIGlmIChpbmZvLmZpbmZvLT5lbmRpYW5uZXNzID09IEdfQklHX0VORElBTikKKyAgICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX3R3b3M7CisgICAgICBlbHNlCisgICAgICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ19zb3d0OworICAgICAgLyogbWF4aW11bSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OyBvbmx5IG5ldyB2ZXJzaW9uIGZvciA+IDE2IGJpdCAqLworICAgICAgaWYgKGluZm8uZmluZm8tPmRlcHRoIDw9IDE2KQorICAgICAgICBlbnRyeS52ZXJzaW9uID0gMDsKKyAgICAgIC8qIG5vdCBjb21wcmVzc2VkIGluIGFueSBjYXNlICovCisgICAgICBlbnRyeS5jb21wcmVzc2lvbl9pZCA9IDA7CisgICAgICAvKiBRVCBzcGVjIHNheXM6IG1heCBhdCAxNiBiaXQgZXZlbiBpZiBzYW1wbGUgc2l6ZSB3ZXJlIGFjdHVhbGx5IGxhcmdlciwKKyAgICAgICAqIGhvd2V2ZXIsIG1vc3QgcGxheWVycyAoZS5nLiBRdWlja1RpbWUhKSBzZWVtIHRvIGRpc2FncmVlLCBzbyAuLi4gKi8KKyAgICAgIGVudHJ5LnNhbXBsZV9zaXplID0gaW5mby5maW5mby0+ZGVwdGg7CisgICAgICBlbnRyeS5ieXRlc19wZXJfc2FtcGxlID0gaW5mby5maW5mby0+ZGVwdGggLyA4OworICAgICAgZW50cnkuc2FtcGxlc19wZXJfcGFja2V0ID0gMTsKKyAgICAgIGVudHJ5LmJ5dGVzX3Blcl9wYWNrZXQgPSBpbmZvLmZpbmZvLT5kZXB0aCAvIDg7CisgICAgICBlbnRyeS5ieXRlc19wZXJfZnJhbWUgPSBlbnRyeS5ieXRlc19wZXJfcGFja2V0ICogaW5mby5jaGFubmVsczsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGluZm8uZmluZm8tPndpZHRoID09IDggJiYgaW5mby5maW5mby0+ZGVwdGggPT0gOCkgeworICAgICAgICAvKiBmYWxsIGJhY2sgdG8gb2xkIDgtYml0IHZlcnNpb24gKi8KKyAgICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX3Jhd187CisgICAgICAgIGVudHJ5LnZlcnNpb24gPSAwOworICAgICAgICBlbnRyeS5jb21wcmVzc2lvbl9pZCA9IDA7CisgICAgICAgIGVudHJ5LnNhbXBsZV9zaXplID0gODsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAibm9uIDgtYml0IFBDTSBtdXN0IGJlIHNpZ25lZCIpOworICAgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgICAgfQorICAgIH0KKyAgICBjb25zdGFudF9zaXplID0gKGluZm8uZmluZm8tPmRlcHRoIC8gOCkgKiBpbmZvLmNoYW5uZWxzOworICB9IGVsc2UgaWYgKHN0cmNtcCAobWltZXR5cGUsICJhdWRpby94LWFsYXciKSA9PSAwKSB7CisgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX2FsYXc7CisgICAgZW50cnkuc2FtcGxlc19wZXJfcGFja2V0ID0gMTAyMzsKKyAgICBlbnRyeS5ieXRlc19wZXJfc2FtcGxlID0gMjsKKyAgfSBlbHNlIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1tdWxhdyIpID09IDApIHsKKyAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfdWxhdzsKKyAgICBlbnRyeS5zYW1wbGVzX3Blcl9wYWNrZXQgPSAxMDIzOworICAgIGVudHJ5LmJ5dGVzX3Blcl9zYW1wbGUgPSAyOworICB9IGVsc2UgaWYgKHN0cmNtcCAobWltZXR5cGUsICJhdWRpby94LWFkcGNtIikgPT0gMCkgeworICAgIGdpbnQgYmxvY2tzaXplOworICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJibG9ja19hbGlnbiIsICZibG9ja3NpemUpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgImJyb2tlbiBjYXBzLCBibG9ja19hbGlnbiBtaXNzaW5nIik7CisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKyAgICAvKiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyBXQVYtc3R5bGUgSU1BIEFEUENNLCBmb3Igd2hpY2ggdGhlIGNvZGVjIGlkIGlzCisgICAgICAgMHgxMSAqLworICAgIGVudHJ5LmZvdXJjYyA9IE1TX1dBVkVfRk9VUkNDICgweDExKTsKKyAgICAvKiA0IGJ5dGUgaGVhZGVyIHBlciBjaGFubmVsIChpbmNsdWRpbmcgb25lIHNhbXBsZSkuIDIgc2FtcGxlcyBwZXIgYnl0ZQorICAgICAgIHJlbWFpbmluZy4gU2ltcGxpZnlpbmcgZ2l2ZXMgdGhlIGZvbGxvd2luZyAoc2FtcGxlcyBwZXIgYmxvY2sgcGVyCisgICAgICAgY2hhbm5lbCkgKi8KKyAgICBlbnRyeS5zYW1wbGVzX3Blcl9wYWNrZXQgPSAyICogYmxvY2tzaXplIC8gY2hhbm5lbHMgLSA3OworICAgIGVudHJ5LmJ5dGVzX3Blcl9zYW1wbGUgPSAyOworCisgICAgZW50cnkuYnl0ZXNfcGVyX2ZyYW1lID0gYmxvY2tzaXplOworICAgIGVudHJ5LmJ5dGVzX3Blcl9wYWNrZXQgPSBibG9ja3NpemUgLyBjaGFubmVsczsKKyAgICAvKiBBRFBDTSBoYXMgY29uc3RhbnQgc2l6ZSBwYWNrZXRzICovCisgICAgY29uc3RhbnRfc2l6ZSA9IDE7CisgICAgLyogVE9ETzogSSBkb24ndCByZWFsbHkgdW5kZXJzdGFuZCB3aHkgdGhpcyBoZWxwcywgYnV0IGl0IGRvZXMhIENvbnN0YW50CisgICAgICogc2l6ZSBhbmQgY29tcHJlc3Npb25faWQgb2YgLTIgc2VlbSB0byBiZSBpbmNvbXBhdGlibGUsIGFuZCBvdGhlciBmaWxlcworICAgICAqIGluIHRoZSB3aWxkIHVzZSB0aGlzIHRvby4gKi8KKyAgICBlbnRyeS5jb21wcmVzc2lvbl9pZCA9IC0xOworCisgICAgZXh0X2F0b20gPSBidWlsZF9pbWFfYWRwY21fZXh0ZW5zaW9uIChjaGFubmVscywgcmF0ZSwgYmxvY2tzaXplKTsKKyAgfSBlbHNlIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1hbGFjIikgPT0gMCkgeworICAgIEdzdEJ1ZmZlciAqY29kZWNfY29uZmlnOworICAgIGdpbnQgbGVuOworICAgIEdzdE1hcEluZm8gbWFwOworCisgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX2FsYWM7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKChHc3RCdWZmZXIgKikgY29kZWNfZGF0YSwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAvKiBsZXQncyBjaGVjayBpZiBjb2RlYyBkYXRhIGFscmVhZHkgY29tZXMgd2l0aCAnYWxhYycgYXRvbSBwcmVmaXggKi8KKyAgICBpZiAoIWNvZGVjX2RhdGEgfHwgKGxlbiA9IG1hcC5zaXplKSA8IDI4KSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgImJyb2tlbiBjYXBzLCBjb2RlYyBkYXRhIG1pc3NpbmciKTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKChHc3RCdWZmZXIgKikgY29kZWNfZGF0YSwgJm1hcCk7CisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKyAgICBpZiAoR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSArIDQpID09IEZPVVJDQ19hbGFjKSB7CisgICAgICBsZW4gLT0gODsKKyAgICAgIGNvZGVjX2NvbmZpZyA9CisgICAgICAgICAgZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAoKEdzdEJ1ZmZlciAqKSBjb2RlY19kYXRhLAorICAgICAgICAgIEdTVF9CVUZGRVJfQ09QWV9NRU1PUlksIDgsIGxlbik7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvZGVjX2NvbmZpZyA9IGdzdF9idWZmZXJfcmVmICgoR3N0QnVmZmVyICopIGNvZGVjX2RhdGEpOworICAgIH0KKyAgICBnc3RfYnVmZmVyX3VubWFwICgoR3N0QnVmZmVyICopIGNvZGVjX2RhdGEsICZtYXApOworICAgIGlmIChsZW4gIT0gMjgpIHsKKyAgICAgIC8qIGRvZXMgbm90IGxvb2sgZ29vZCwgYnV0IHBlcmhhcHMgc29tZSB0cmFpbGluZyB1bm5lZWRlZCBzdHVmZiAqLworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgInVuZXhwZWN0ZWQgY29kZWMtZGF0YSBzaXplLCBwb3NzaWJseSBicm9rZW4iKTsKKyAgICB9CisgICAgaWYgKGZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9RVCkKKyAgICAgIGV4dF9hdG9tID0gYnVpbGRfbW92X2FsYWNfZXh0ZW5zaW9uIChjb2RlY19jb25maWcpOworICAgIGVsc2UKKyAgICAgIGV4dF9hdG9tID0gYnVpbGRfY29kZWNfZGF0YV9leHRlbnNpb24gKEZPVVJDQ19hbGFjLCBjb2RlY19jb25maWcpOworICAgIC8qIHNldCBzb21lIG1vcmUgaW5mbyAqLworICAgIGdzdF9idWZmZXJfbWFwIChjb2RlY19jb25maWcsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgZW50cnkuYnl0ZXNfcGVyX3NhbXBsZSA9IDI7CisgICAgZW50cnkuc2FtcGxlc19wZXJfcGFja2V0ID0gR1NUX1JFQURfVUlOVDMyX0JFIChtYXAuZGF0YSArIDQpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGNvZGVjX2NvbmZpZywgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoY29kZWNfY29uZmlnKTsKKyAgfSBlbHNlIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1hYzMiKSA9PSAwKSB7CisgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX2FjXzM7CisKKyAgICAvKiBGaXhlZCB2YWx1ZXMgYWNjb3JkaW5nIHRvIFRTIDEwMiAzNjYgYnV0IGl0IGFsc28gbWVudGlvbnMgdGhhdAorICAgICAqIHRoZXkgc2hvdWxkIGJlIGlnbm9yZWQgKi8KKyAgICBlbnRyeS5jaGFubmVscyA9IDI7CisgICAgZW50cnkuc2FtcGxlX3NpemUgPSAxNjsKKworICAgIC8qIEFDLTMgbmVlZHMgYW4gZXh0ZW5zaW9uIGF0b20gYnV0IGl0cyBkYXRhIGNhbiBvbmx5IGJlIG9idGFpbmVkIGZyb20KKyAgICAgKiB0aGUgc3RyZWFtIGl0c2VsZi4gQWJ1c2UgdGhlIHByZXBhcmVfYnVmX2Z1bmMgc28gd2UgcGFyc2UgYSBmcmFtZQorICAgICAqIGFuZCBnZXQgdGhlIG5lZWRlZCBkYXRhICovCisgICAgcXRwYWQtPnByZXBhcmVfYnVmX2Z1bmMgPSBnc3RfcXRfbXV4X3ByZXBhcmVfcGFyc2VfYWMzX2ZyYW1lOworICB9IGVsc2UgaWYgKHN0cmNtcCAobWltZXR5cGUsICJhdWRpby94LW9wdXMiKSA9PSAwKSB7CisgICAgLyogQmFzZWQgb24gdGhlIHNwZWNpZmljYXRpb24gZGVmaW5lZCBpbjoKKyAgICAgKiBodHRwczovL3d3dy5vcHVzLWNvZGVjLm9yZy9kb2NzL29wdXNfaW5faXNvYm1mZi5odG1sICovCisgICAgZ3VpbnQ4IGNoYW5uZWxzLCBtYXBwaW5nX2ZhbWlseSwgc3RyZWFtX2NvdW50LCBjb3VwbGVkX2NvdW50OworICAgIGd1aW50MTYgcHJlX3NraXA7CisgICAgZ2ludDE2IG91dHB1dF9nYWluOworICAgIGd1aW50MzIgcmF0ZTsKKyAgICBndWludDggY2hhbm5lbF9tYXBwaW5nWzI1Nl07CisgICAgY29uc3QgR1ZhbHVlICpzdHJlYW1oZWFkZXI7CisgICAgY29uc3QgR1ZhbHVlICpmaXJzdF9lbGVtZW50OworICAgIEdzdEJ1ZmZlciAqaGVhZGVyOworCisgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX29wdXM7CisgICAgZW50cnkuc2FtcGxlX3NpemUgPSAxNjsKKworICAgIHN0cmVhbWhlYWRlciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJzdHJlYW1oZWFkZXIiKTsKKyAgICBpZiAoc3RyZWFtaGVhZGVyICYmIEdTVF9WQUxVRV9IT0xEU19BUlJBWSAoc3RyZWFtaGVhZGVyKSAmJgorICAgICAgICBnc3RfdmFsdWVfYXJyYXlfZ2V0X3NpemUgKHN0cmVhbWhlYWRlcikgIT0gMCkgeworICAgICAgZmlyc3RfZWxlbWVudCA9IGdzdF92YWx1ZV9hcnJheV9nZXRfdmFsdWUgKHN0cmVhbWhlYWRlciwgMCk7CisgICAgICBoZWFkZXIgPSBnc3RfdmFsdWVfZ2V0X2J1ZmZlciAoZmlyc3RfZWxlbWVudCk7CisgICAgICBpZiAoIWdzdF9jb2RlY191dGlsc19vcHVzX3BhcnNlX2hlYWRlciAoaGVhZGVyLCAmcmF0ZSwgJmNoYW5uZWxzLAorICAgICAgICAgICAgICAmbWFwcGluZ19mYW1pbHksICZzdHJlYW1fY291bnQsICZjb3VwbGVkX2NvdW50LCBjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICZwcmVfc2tpcCwgJm91dHB1dF9nYWluKSkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChxdG11eCwgIkluY29tcGxldGUgT3B1c0hlYWQiKTsKKyAgICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwKKyAgICAgICAgICAibm8gc3RyZWFtaGVhZGVyIGZpZWxkIGluIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgICAgICBpZiAoIWdzdF9jb2RlY191dGlsc19vcHVzX3BhcnNlX2NhcHMgKGNhcHMsICZyYXRlLCAmY2hhbm5lbHMsCisgICAgICAgICAgICAgICZtYXBwaW5nX2ZhbWlseSwgJnN0cmVhbV9jb3VudCwgJmNvdXBsZWRfY291bnQsCisgICAgICAgICAgICAgIGNoYW5uZWxfbWFwcGluZykpIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocXRtdXgsICJJbmNvbXBsZXRlIE9wdXMgY2FwcyIpOworICAgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgICAgfQorICAgICAgcHJlX3NraXAgPSAwOworICAgICAgb3V0cHV0X2dhaW4gPSAwOworICAgIH0KKworICAgIGVudHJ5LmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgZXh0X2F0b20gPSBidWlsZF9vcHVzX2V4dGVuc2lvbiAocmF0ZSwgY2hhbm5lbHMsIG1hcHBpbmdfZmFtaWx5LAorICAgICAgICBzdHJlYW1fY291bnQsIGNvdXBsZWRfY291bnQsIGNoYW5uZWxfbWFwcGluZywgcHJlX3NraXAsIG91dHB1dF9nYWluKTsKKyAgfQorCisgIGlmICghZW50cnkuZm91cmNjKQorICAgIGdvdG8gcmVmdXNlX2NhcHM7CisKKyAgdGltZXNjYWxlID0gZ3N0X3F0X211eF9wYWRfZ2V0X3RpbWVzY2FsZSAoR1NUX1FUX01VWF9QQURfQ0FTVCAocGFkKSk7CisgIGlmICghdGltZXNjYWxlICYmIHF0bXV4LT50cmFrX3RpbWVzY2FsZSkKKyAgICB0aW1lc2NhbGUgPSBxdG11eC0+dHJha190aW1lc2NhbGU7CisgIGVsc2UgaWYgKCF0aW1lc2NhbGUpCisgICAgdGltZXNjYWxlID0gZW50cnkuc2FtcGxlX3JhdGU7CisKKyAgLyogb2ssIHNldCB0aGUgcGFkIGluZm8gYWNjb3JkaW5nbHkgKi8KKyAgcXRwYWQtPmZvdXJjYyA9IGVudHJ5LmZvdXJjYzsKKyAgcXRwYWQtPnNhbXBsZV9zaXplID0gY29uc3RhbnRfc2l6ZTsKKyAgcXRwYWQtPnRyYWtfc3RlID0KKyAgICAgIChTYW1wbGVUYWJsZUVudHJ5ICopIGF0b21fdHJha19zZXRfYXVkaW9fdHlwZSAocXRwYWQtPnRyYWssCisgICAgICBxdG11eC0+Y29udGV4dCwgJmVudHJ5LCB0aW1lc2NhbGUsIGV4dF9hdG9tLCBjb25zdGFudF9zaXplKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChxdG11eCk7CisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworcmVmdXNlX2NhcHM6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LCAicGFkICVzIHJlZnVzZWQgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgR1NUX1BBRF9OQU1FIChwYWQpLCBjYXBzKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChxdG11eCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CityZWZ1c2VfcmVuZWdvdGlhdGlvbjoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsCisgICAgICAgICJwYWQgJXMgcmVmdXNlZCByZW5lZ290aWF0aW9uIHRvICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICBHU1RfUEFEX05BTUUgKHBhZCksIGNhcHMpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHF0bXV4KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcXRfbXV4X3ZpZGVvX3Npbmtfc2V0X2NhcHMgKEdzdFFUUGFkICogcXRwYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RQYWQgKnBhZCA9IHF0cGFkLT5jb2xsZWN0LnBhZDsKKyAgR3N0UVRNdXggKnF0bXV4ID0gR1NUX1FUX01VWF9DQVNUIChnc3RfcGFkX2dldF9wYXJlbnQgKHBhZCkpOworICBHc3RRVE11eENsYXNzICpxdG11eF9rbGFzcyA9IChHc3RRVE11eENsYXNzICopIChHX09CSkVDVF9HRVRfQ0xBU1MgKHF0bXV4KSk7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBnY2hhciAqbWltZXR5cGU7CisgIGdpbnQgd2lkdGgsIGhlaWdodCwgZGVwdGggPSAtMTsKKyAgZ2ludCBmcmFtZXJhdGVfbnVtLCBmcmFtZXJhdGVfZGVuOworICBndWludDMyIHJhdGU7CisgIGNvbnN0IEdWYWx1ZSAqdmFsdWUgPSBOVUxMOworICBjb25zdCBHc3RCdWZmZXIgKmNvZGVjX2RhdGEgPSBOVUxMOworICBWaXN1YWxTYW1wbGVFbnRyeSBlbnRyeSA9IHsgMCwgfTsKKyAgR3N0UVRNdXhGb3JtYXQgZm9ybWF0OworICBBdG9tSW5mbyAqZXh0X2F0b20gPSBOVUxMOworICBHTGlzdCAqZXh0X2F0b21fbGlzdCA9IE5VTEw7CisgIGdib29sZWFuIHN5bmMgPSBGQUxTRTsKKyAgaW50IHBhcl9udW0sIHBhcl9kZW47CisgIGNvbnN0IGdjaGFyICptdWx0aXZpZXdfbW9kZTsKKworICAvKiBkb2VzIG5vdCBnbyB3ZWxsIHRvIHJlbmVnb3RpYXRlIHN0cmVhbSBtaWQtd2F5LCB1bmxlc3MKKyAgICogdGhlIG9sZCBjYXBzIGFyZSBhIHN1YnNldCBvZiB0aGUgbmV3IG9uZSAodGhpcyBtZWFucyB1cHN0cmVhbQorICAgKiBhZGRlZCBtb3JlIGluZm8gdG8gdGhlIGNhcHMsIGFzIGJvdGggc2hvdWxkIGJlICdmaXhlZCcgY2FwcykgKi8KKyAgaWYgKHF0cGFkLT5mb3VyY2MpIHsKKyAgICBHc3RDYXBzICpjdXJyZW50X2NhcHM7CisKKyAgICBjdXJyZW50X2NhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHBhZCk7CisgICAgZ19hc3NlcnQgKGNhcHMgIT0gTlVMTCk7CisKKyAgICBpZiAoIWdzdF9xdG11eF9jYXBzX2lzX3N1YnNldF9mdWxsIChxdG11eCwgY3VycmVudF9jYXBzLCBjYXBzKSkgeworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGN1cnJlbnRfY2Fwcyk7CisgICAgICBnb3RvIHJlZnVzZV9yZW5lZ290aWF0aW9uOworICAgIH0KKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwKKyAgICAgICAgInBhZCAlcyBhY2NlcHRlZCByZW5lZ290aWF0aW9uIHRvICUiIEdTVF9QVFJfRk9STUFUICIgZnJvbSAlIgorICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgR1NUX1BBRF9OQU1FIChwYWQpLCBjYXBzLCBjdXJyZW50X2NhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjdXJyZW50X2NhcHMpOworCisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIiVzOiVzLCBjYXBzPSUiIEdTVF9QVFJfRk9STUFULAorICAgICAgR1NUX0RFQlVHX1BBRF9OQU1FIChwYWQpLCBjYXBzKTsKKworICBxdHBhZC0+cHJlcGFyZV9idWZfZnVuYyA9IE5VTEw7CisKKyAgZm9ybWF0ID0gcXRtdXhfa2xhc3MtPmZvcm1hdDsKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIG1pbWV0eXBlID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3RydWN0dXJlKTsKKworICAvKiByZXF1aXJlZCBwYXJ0cyAqLworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAid2lkdGgiLCAmd2lkdGgpIHx8CisgICAgICAhZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJoZWlnaHQiLCAmaGVpZ2h0KSkKKyAgICBnb3RvIHJlZnVzZV9jYXBzOworCisgIC8qIG9wdGlvbmFsICovCisgIGRlcHRoID0gLTE7CisgIC8qIHdvcmtzIGFzIGEgZGVmYXVsdCB0aW1lYmFzZSAqLworICBmcmFtZXJhdGVfbnVtID0gMTAwMDA7CisgIGZyYW1lcmF0ZV9kZW4gPSAxOworICBnc3Rfc3RydWN0dXJlX2dldF9mcmFjdGlvbiAoc3RydWN0dXJlLCAiZnJhbWVyYXRlIiwgJmZyYW1lcmF0ZV9udW0sCisgICAgICAmZnJhbWVyYXRlX2Rlbik7CisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiZGVwdGgiLCAmZGVwdGgpOworICB2YWx1ZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJjb2RlY19kYXRhIik7CisgIGlmICh2YWx1ZSAhPSBOVUxMKQorICAgIGNvZGVjX2RhdGEgPSBnc3RfdmFsdWVfZ2V0X2J1ZmZlciAodmFsdWUpOworCisgIHBhcl9udW0gPSAxOworICBwYXJfZGVuID0gMTsKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfZnJhY3Rpb24gKHN0cnVjdHVyZSwgInBpeGVsLWFzcGVjdC1yYXRpbyIsICZwYXJfbnVtLAorICAgICAgJnBhcl9kZW4pOworCisgIHF0cGFkLT5pc19vdXRfb2Zfb3JkZXIgPSBGQUxTRTsKKworICAvKiBicmluZyBmcmFtZSBudW1lcmF0b3IgaW50byBhIHJhbmdlIHRoYXQgZW5zdXJlcyBib3RoIHJlYXNvbmFibGUgcmVzb2x1dGlvbgorICAgKiBhcyB3ZWxsIGFzIGEgZmFpciBkdXJhdGlvbiAqLworICBxdHBhZC0+ZXhwZWN0ZWRfc2FtcGxlX2R1cmF0aW9uX24gPSBmcmFtZXJhdGVfbnVtOworICBxdHBhZC0+ZXhwZWN0ZWRfc2FtcGxlX2R1cmF0aW9uX2QgPSBmcmFtZXJhdGVfZGVuOworCisgIHJhdGUgPSBnc3RfcXRfbXV4X3BhZF9nZXRfdGltZXNjYWxlIChHU1RfUVRfTVVYX1BBRF9DQVNUIChwYWQpKTsKKyAgaWYgKCFyYXRlICYmIHF0bXV4LT50cmFrX3RpbWVzY2FsZSkKKyAgICByYXRlID0gcXRtdXgtPnRyYWtfdGltZXNjYWxlOworICBlbHNlIGlmICghcmF0ZSkKKyAgICByYXRlID0gYXRvbV9mcmFtZXJhdGVfdG9fdGltZXNjYWxlIChmcmFtZXJhdGVfbnVtLCBmcmFtZXJhdGVfZGVuKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdG11eCwgIlJhdGUgb2YgdmlkZW8gdHJhY2sgc2VsZWN0ZWQ6ICUiIEdfR1VJTlQzMl9GT1JNQVQsCisgICAgICByYXRlKTsKKworICBtdWx0aXZpZXdfbW9kZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAibXVsdGl2aWV3LW1vZGUiKTsKKyAgaWYgKG11bHRpdmlld19tb2RlICYmICFxdHBhZC0+dHJhay0+bWRpYS5taW5mLnN0Ymwuc3ZtaSkgeworICAgIEdzdFZpZGVvTXVsdGl2aWV3TW9kZSBtb2RlOworICAgIEdzdFZpZGVvTXVsdGl2aWV3RmxhZ3MgZmxhZ3MgPSAwOworCisgICAgbW9kZSA9IGdzdF92aWRlb19tdWx0aXZpZXdfbW9kZV9mcm9tX2NhcHNfc3RyaW5nIChtdWx0aXZpZXdfbW9kZSk7CisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfZmxhZ3NldCAoc3RydWN0dXJlLCAibXVsdGl2aWV3LWZsYWdzIiwgJmZsYWdzLCBOVUxMKTsKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX1NJREVfQllfU0lERToKKyAgICAgICAgcXRwYWQtPnRyYWstPm1kaWEubWluZi5zdGJsLnN2bWkgPQorICAgICAgICAgICAgYXRvbV9zdm1pX25ldyAoMCwKKyAgICAgICAgICAgIGZsYWdzICYgR1NUX1ZJREVPX01VTFRJVklFV19GTEFHU19SSUdIVF9WSUVXX0ZJUlNUKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19NVUxUSVZJRVdfTU9ERV9ST1dfSU5URVJMRUFWRUQ6CisgICAgICAgIHF0cGFkLT50cmFrLT5tZGlhLm1pbmYuc3RibC5zdm1pID0KKyAgICAgICAgICAgIGF0b21fc3ZtaV9uZXcgKDEsCisgICAgICAgICAgICBmbGFncyAmIEdTVF9WSURFT19NVUxUSVZJRVdfRkxBR1NfUklHSFRfVklFV19GSVJTVCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fTVVMVElWSUVXX01PREVfRlJBTUVfQllfRlJBTUU6CisgICAgICAgIHF0cGFkLT50cmFrLT5tZGlhLm1pbmYuc3RibC5zdm1pID0KKyAgICAgICAgICAgIGF0b21fc3ZtaV9uZXcgKDIsCisgICAgICAgICAgICBmbGFncyAmIEdTVF9WSURFT19NVUxUSVZJRVdfRkxBR1NfUklHSFRfVklFV19GSVJTVCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJVbnN1cHBvcnRlZCBtdWx0aXZpZXctbW9kZSAlcyIsCisgICAgICAgICAgICBtdWx0aXZpZXdfbW9kZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qIHNldCBjb21tb24gcHJvcGVydGllcyAqLworICBlbnRyeS53aWR0aCA9IHdpZHRoOworICBlbnRyeS5oZWlnaHQgPSBoZWlnaHQ7CisgIGVudHJ5LnBhcl9uID0gcGFyX251bTsKKyAgZW50cnkucGFyX2QgPSBwYXJfZGVuOworICAvKiBzaG91bGQgYmUgT0sgYWNjb3JkaW5nIHRvIHF0IGFuZCBpc28gc3BlYywgb3ZlcnJpZGUgaWYgcmVhbGx5IG5lZWRlZCAqLworICBlbnRyeS5jb2xvcl90YWJsZV9pZCA9IC0xOworICBlbnRyeS5mcmFtZV9jb3VudCA9IDE7CisgIGVudHJ5LmRlcHRoID0gMjQ7CisKKyAgLyogc3luYyBlbnRyaWVzIGJ5IGRlZmF1bHQgKi8KKyAgc3luYyA9IFRSVUU7CisKKyAgLyogbm93IG1hcCBvbnRvIGEgZm91cmNjLCBhbmQgc29tZSBleHRyYSBwcm9wZXJ0aWVzICovCisgIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1yYXciKSA9PSAwKSB7CisgICAgY29uc3QgZ2NoYXIgKmZvcm1hdDsKKyAgICBHc3RWaWRlb0Zvcm1hdCBmbXQ7CisgICAgY29uc3QgR3N0VmlkZW9Gb3JtYXRJbmZvICp2aW5mbzsKKworICAgIGZvcm1hdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZm9ybWF0Iik7CisgICAgZm10ID0gZ3N0X3ZpZGVvX2Zvcm1hdF9mcm9tX3N0cmluZyAoZm9ybWF0KTsKKyAgICB2aW5mbyA9IGdzdF92aWRlb19mb3JtYXRfZ2V0X2luZm8gKGZtdCk7CisKKyAgICBzd2l0Y2ggKGZtdCkgeworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICAgIGlmIChkZXB0aCA9PSAtMSkKKyAgICAgICAgICBkZXB0aCA9IDI0OworICAgICAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfMnZ1eTsKKyAgICAgICAgZW50cnkuZGVwdGggPSBkZXB0aDsKKyAgICAgICAgc3luYyA9IEZBTFNFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF92MjEwOgorICAgICAgICBpZiAoZGVwdGggPT0gLTEpCisgICAgICAgICAgZGVwdGggPSAyNDsKKyAgICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX3YyMTA7CisgICAgICAgIGVudHJ5LmRlcHRoID0gZGVwdGg7CisgICAgICAgIHN5bmMgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX0ZMQUdTICh2aW5mbykgJiBHU1RfVklERU9fRk9STUFUX0ZMQUdfUkdCKSB7CisgICAgICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX3Jhd187CisgICAgICAgICAgZW50cnkuZGVwdGggPSBHU1RfVklERU9fRk9STUFUX0lORk9fUFNUUklERSAodmluZm8sIDApICogODsKKyAgICAgICAgICBzeW5jID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgaWYgKHN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LWgyNjMiKSA9PSAwKSB7CisgICAgZXh0X2F0b20gPSBOVUxMOworICAgIGlmIChmb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfUVQpCisgICAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfaDI2MzsKKyAgICBlbHNlCisgICAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfczI2MzsKKyAgICBleHRfYXRvbSA9IGJ1aWxkX2gyNjNfZXh0ZW5zaW9uICgpOworICAgIGlmIChleHRfYXRvbSAhPSBOVUxMKQorICAgICAgZXh0X2F0b21fbGlzdCA9IGdfbGlzdF9wcmVwZW5kIChleHRfYXRvbV9saXN0LCBleHRfYXRvbSk7CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtZGl2eCIpID09IDAgfHwKKyAgICAgIHN0cmNtcCAobWltZXR5cGUsICJ2aWRlby9tcGVnIikgPT0gMCkgeworICAgIGdpbnQgdmVyc2lvbiA9IDA7CisKKyAgICBpZiAoc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtZGl2eCIpID09IDApIHsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiZGl2eHZlcnNpb24iLCAmdmVyc2lvbik7CisgICAgICB2ZXJzaW9uID0gdmVyc2lvbiA9PSA1ID8gMSA6IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAibXBlZ3ZlcnNpb24iLCAmdmVyc2lvbik7CisgICAgICB2ZXJzaW9uID0gdmVyc2lvbiA9PSA0ID8gMSA6IDA7CisgICAgfQorICAgIGlmICh2ZXJzaW9uKSB7CisgICAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfbXA0djsKKyAgICAgIGV4dF9hdG9tID0KKyAgICAgICAgICBidWlsZF9lc2RzX2V4dGVuc2lvbiAocXRwYWQtPnRyYWssIEVTRFNfT0JKRUNUX1RZUEVfTVBFRzRfUDIsCisgICAgICAgICAgRVNEU19TVFJFQU1fVFlQRV9WSVNVQUwsIGNvZGVjX2RhdGEsIHF0cGFkLT5hdmdfYml0cmF0ZSwKKyAgICAgICAgICBxdHBhZC0+bWF4X2JpdHJhdGUpOworICAgICAgaWYgKGV4dF9hdG9tICE9IE5VTEwpCisgICAgICAgIGV4dF9hdG9tX2xpc3QgPSBnX2xpc3RfcHJlcGVuZCAoZXh0X2F0b21fbGlzdCwgZXh0X2F0b20pOworICAgICAgaWYgKCFjb2RlY19kYXRhKQorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LCAibm8gY29kZWNfZGF0YSBmb3IgTVBFRzQgdmlkZW87ICIKKyAgICAgICAgICAgICJvdXRwdXQgbWlnaHQgbm90IHBsYXkgaW4gQXBwbGUgUXVpY2tUaW1lICh0cnkgZ2xvYmFsLWhlYWRlcnM/KSIpOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1oMjY0IikgPT0gMCkgeworICAgIGlmICghY29kZWNfZGF0YSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgIm5vIGNvZGVjX2RhdGEgaW4gaDI2NCBjYXBzIik7CisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKworICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ19hdmMxOworCisgICAgZXh0X2F0b20gPSBidWlsZF9idHJ0X2V4dGVuc2lvbiAoMCwgcXRwYWQtPmF2Z19iaXRyYXRlLCBxdHBhZC0+bWF4X2JpdHJhdGUpOworICAgIGlmIChleHRfYXRvbSAhPSBOVUxMKQorICAgICAgZXh0X2F0b21fbGlzdCA9IGdfbGlzdF9wcmVwZW5kIChleHRfYXRvbV9saXN0LCBleHRfYXRvbSk7CisgICAgZXh0X2F0b20gPSBidWlsZF9jb2RlY19kYXRhX2V4dGVuc2lvbiAoRk9VUkNDX2F2Y0MsIGNvZGVjX2RhdGEpOworICAgIGlmIChleHRfYXRvbSAhPSBOVUxMKQorICAgICAgZXh0X2F0b21fbGlzdCA9IGdfbGlzdF9wcmVwZW5kIChleHRfYXRvbV9saXN0LCBleHRfYXRvbSk7CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtaDI2NSIpID09IDApIHsKKyAgICBjb25zdCBnY2hhciAqZm9ybWF0OworCisgICAgaWYgKCFjb2RlY19kYXRhKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LCAibm8gY29kZWNfZGF0YSBpbiBoMjY1IGNhcHMiKTsKKyAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgfQorCisgICAgZm9ybWF0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJzdHJlYW0tZm9ybWF0Iik7CisgICAgaWYgKHN0cmNtcCAoZm9ybWF0LCAiaHZjMSIpID09IDApCisgICAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfaHZjMTsKKyAgICBlbHNlIGlmIChzdHJjbXAgKGZvcm1hdCwgImhldjEiKSA9PSAwKQorICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX2hldjE7CisKKyAgICBleHRfYXRvbSA9IGJ1aWxkX2J0cnRfZXh0ZW5zaW9uICgwLCBxdHBhZC0+YXZnX2JpdHJhdGUsIHF0cGFkLT5tYXhfYml0cmF0ZSk7CisgICAgaWYgKGV4dF9hdG9tICE9IE5VTEwpCisgICAgICBleHRfYXRvbV9saXN0ID0gZ19saXN0X3ByZXBlbmQgKGV4dF9hdG9tX2xpc3QsIGV4dF9hdG9tKTsKKworICAgIGV4dF9hdG9tID0gYnVpbGRfY29kZWNfZGF0YV9leHRlbnNpb24gKEZPVVJDQ19odmNDLCBjb2RlY19kYXRhKTsKKyAgICBpZiAoZXh0X2F0b20gIT0gTlVMTCkKKyAgICAgIGV4dF9hdG9tX2xpc3QgPSBnX2xpc3RfcHJlcGVuZCAoZXh0X2F0b21fbGlzdCwgZXh0X2F0b20pOworCisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtc3ZxIikgPT0gMCkgeworICAgIGdpbnQgdmVyc2lvbiA9IDA7CisgICAgY29uc3QgR3N0QnVmZmVyICpzZXFoID0gTlVMTDsKKyAgICBjb25zdCBHVmFsdWUgKnNlcWhfdmFsdWU7CisgICAgZ2RvdWJsZSBnYW1tYSA9IDA7CisKKyAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgInN2cXZlcnNpb24iLCAmdmVyc2lvbik7CisgICAgaWYgKHZlcnNpb24gPT0gMykgeworICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX1NWUTM7CisgICAgICBlbnRyeS52ZXJzaW9uID0gMzsKKyAgICAgIGVudHJ5LmRlcHRoID0gMzI7CisKKyAgICAgIHNlcWhfdmFsdWUgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAic2VxaCIpOworICAgICAgaWYgKHNlcWhfdmFsdWUpIHsKKyAgICAgICAgc2VxaCA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyIChzZXFoX3ZhbHVlKTsKKyAgICAgICAgZXh0X2F0b20gPSBidWlsZF9TTUlfYXRvbSAoc2VxaCk7CisgICAgICAgIGlmIChleHRfYXRvbSkKKyAgICAgICAgICBleHRfYXRvbV9saXN0ID0gZ19saXN0X3ByZXBlbmQgKGV4dF9hdG9tX2xpc3QsIGV4dF9hdG9tKTsKKyAgICAgIH0KKworICAgICAgLyogd2UgbmVlZCB0byBhZGQgdGhlIGdhbW1hIGFueXdheSBiZWNhdXNlIHF1aWNrdGltZSBtaWdodCBjcmFzaAorICAgICAgICogd2hlbiBpdCBkb2Vzbid0IGZpbmQgaXQgKi8KKyAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfZG91YmxlIChzdHJ1Y3R1cmUsICJhcHBsaWVkLWdhbW1hIiwgJmdhbW1hKSkgeworICAgICAgICAvKiBpdCBzZWVtcyB0aGF0IHVzaW5nIDAgaGVyZSBtYWtlcyBpdCBpZ25vcmVkICovCisgICAgICAgIGdhbW1hID0gMC4wOworICAgICAgfQorICAgICAgZXh0X2F0b20gPSBidWlsZF9nYW1hX2F0b20gKGdhbW1hKTsKKyAgICAgIGlmIChleHRfYXRvbSkKKyAgICAgICAgZXh0X2F0b21fbGlzdCA9IGdfbGlzdF9wcmVwZW5kIChleHRfYXRvbV9saXN0LCBleHRfYXRvbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRtdXgsICJTVlEgdmVyc2lvbiAlZCBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgZmlsZSAiCisgICAgICAgICAgImEgYnVnIGF0IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmciLCB2ZXJzaW9uKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtZHYiKSA9PSAwKSB7CisgICAgZ2ludCB2ZXJzaW9uID0gMDsKKyAgICBnYm9vbGVhbiBwYWwgPSBUUlVFOworCisgICAgc3luYyA9IEZBTFNFOworICAgIGlmIChmcmFtZXJhdGVfbnVtICE9IDI1IHx8IGZyYW1lcmF0ZV9kZW4gIT0gMSkKKyAgICAgIHBhbCA9IEZBTFNFOworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiZHZ2ZXJzaW9uIiwgJnZlcnNpb24pOworICAgIC8qIGZhbGwgYmFjayB0byB0eXBpY2FsIG9uZSAqLworICAgIGlmICghdmVyc2lvbikKKyAgICAgIHZlcnNpb24gPSAyNTsKKyAgICBzd2l0Y2ggKHZlcnNpb24pIHsKKyAgICAgIGNhc2UgMjU6CisgICAgICAgIGlmIChwYWwpCisgICAgICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX2R2Y3A7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfZHZjXzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDUwOgorICAgICAgICBpZiAocGFsKQorICAgICAgICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ19kdjVwOworICAgICAgICBlbHNlCisgICAgICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX2R2NW47CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgInVucmVjb2duaXplZCBkdiB2ZXJzaW9uIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAiaW1hZ2UvanBlZyIpID09IDApIHsKKyAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfanBlZzsKKyAgICBzeW5jID0gRkFMU0U7CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgImltYWdlL3BuZyIpID09IDApIHsKKyAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfcG5nOworICAgIHN5bmMgPSBGQUxTRTsKKyAgfSBlbHNlIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAiaW1hZ2UveC1qMmMiKSA9PSAwIHx8CisgICAgICBzdHJjbXAgKG1pbWV0eXBlLCAiaW1hZ2UveC1qcGMiKSA9PSAwKSB7CisgICAgY29uc3QgZ2NoYXIgKmNvbG9yc3BhY2U7CisgICAgY29uc3QgR1ZhbHVlICpjbWFwX2FycmF5OworICAgIGNvbnN0IEdWYWx1ZSAqY2RlZl9hcnJheTsKKyAgICBnaW50IG5jb21wID0gMDsKKworICAgIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAiaW1hZ2UveC1qcGMiKSA9PSAwKSB7CisgICAgICBxdHBhZC0+cHJlcGFyZV9idWZfZnVuYyA9IGdzdF9xdF9tdXhfcHJlcGFyZV9qcGNfYnVmZmVyOworICAgIH0KKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAibnVtLWNvbXBvbmVudHMiLCAmbmNvbXApOworICAgIGNtYXBfYXJyYXkgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAiY29tcG9uZW50LW1hcCIpOworICAgIGNkZWZfYXJyYXkgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAiY2hhbm5lbC1kZWZpbml0aW9ucyIpOworCisgICAgZXh0X2F0b20gPSBOVUxMOworICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ19tanAyOworICAgIHN5bmMgPSBGQUxTRTsKKworICAgIGNvbG9yc3BhY2UgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImNvbG9yc3BhY2UiKTsKKyAgICBpZiAoY29sb3JzcGFjZSAmJgorICAgICAgICAoZXh0X2F0b20gPQorICAgICAgICAgICAgYnVpbGRfanAyaF9leHRlbnNpb24gKHdpZHRoLCBoZWlnaHQsIGNvbG9yc3BhY2UsIG5jb21wLCBjbWFwX2FycmF5LAorICAgICAgICAgICAgICAgIGNkZWZfYXJyYXkpKSAhPSBOVUxMKSB7CisgICAgICBleHRfYXRvbV9saXN0ID0gZ19saXN0X2FwcGVuZCAoZXh0X2F0b21fbGlzdCwgZXh0X2F0b20pOworCisgICAgICBleHRfYXRvbSA9IGJ1aWxkX2pwMnhfZXh0ZW5zaW9uIChjb2RlY19kYXRhKTsKKyAgICAgIGlmIChleHRfYXRvbSkKKyAgICAgICAgZXh0X2F0b21fbGlzdCA9IGdfbGlzdF9hcHBlbmQgKGV4dF9hdG9tX2xpc3QsIGV4dF9hdG9tKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICJtaXNzaW5nIG9yIGludmFsaWQgZm91cmNjIGluIGpwMiBjYXBzIik7CisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKyAgfSBlbHNlIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC12cDgiKSA9PSAwKSB7CisgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX3ZwMDg7CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtdnA5IikgPT0gMCkgeworICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ192cDA5OworICB9IGVsc2UgaWYgKHN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LWRpcmFjIikgPT0gMCkgeworICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ19kcmFjOworICB9IGVsc2UgaWYgKHN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LXF0LXBhcnQiKSA9PSAwKSB7CisgICAgZ3VpbnQzMiBmb3VyY2MgPSAwOworCisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAoc3RydWN0dXJlLCAiZm9ybWF0IiwgJmZvdXJjYyk7CisgICAgZW50cnkuZm91cmNjID0gZm91cmNjOworICB9IGVsc2UgaWYgKHN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LW1wNC1wYXJ0IikgPT0gMCkgeworICAgIGd1aW50MzIgZm91cmNjID0gMDsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKHN0cnVjdHVyZSwgImZvcm1hdCIsICZmb3VyY2MpOworICAgIGVudHJ5LmZvdXJjYyA9IGZvdXJjYzsKKyAgfSBlbHNlIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1wcm9yZXMiKSA9PSAwKSB7CisgICAgY29uc3QgZ2NoYXIgKnZhcmlhbnQ7CisKKyAgICB2YXJpYW50ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJ2YXJpYW50Iik7CisgICAgaWYgKCF2YXJpYW50IHx8ICFnX3N0cmNtcDAgKHZhcmlhbnQsICJzdGFuZGFyZCIpKQorICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX2FwY247CisgICAgZWxzZSBpZiAoIWdfc3RyY21wMCAodmFyaWFudCwgImx0IikpCisgICAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfYXBjczsKKyAgICBlbHNlIGlmICghZ19zdHJjbXAwICh2YXJpYW50LCAiaHEiKSkKKyAgICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ19hcGNoOworICAgIGVsc2UgaWYgKCFnX3N0cmNtcDAgKHZhcmlhbnQsICJwcm94eSIpKQorICAgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX2FwY287CisgICAgZWxzZSBpZiAoIWdfc3RyY21wMCAodmFyaWFudCwgIjQ0NDQiKSkKKyAgICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ19hcDRoOworICAgIGVsc2UgaWYgKCFnX3N0cmNtcDAgKHZhcmlhbnQsICI0NDQ0eHEiKSkKKyAgICAgIGVudHJ5LmZvdXJjYyA9IEZPVVJDQ19hcDR4OworCisgICAgc3luYyA9IEZBTFNFOworCisgICAgaWYgKCFxdG11eC0+aW50ZXJsZWF2ZV90aW1lX3NldCkKKyAgICAgIHF0bXV4LT5pbnRlcmxlYXZlX3RpbWUgPSA1MDAgKiBHU1RfTVNFQ09ORDsKKyAgICBpZiAoIXF0bXV4LT5pbnRlcmxlYXZlX2J5dGVzX3NldCkKKyAgICAgIHF0bXV4LT5pbnRlcmxlYXZlX2J5dGVzID0gd2lkdGggPiA3MjAgPyA0ICogMTAyNCAqIDEwMjQgOiAyICogMTAyNCAqIDEwMjQ7CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtY2luZWZvcm0iKSA9PSAwKSB7CisgICAgZW50cnkuZm91cmNjID0gRk9VUkNDX2NmaGQ7CisgICAgc3luYyA9IEZBTFNFOworICB9CisKKyAgaWYgKCFlbnRyeS5mb3VyY2MpCisgICAgZ290byByZWZ1c2VfY2FwczsKKworICBpZiAocXRtdXhfa2xhc3MtPmZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9RVCB8fAorICAgICAgcXRtdXhfa2xhc3MtPmZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9NUDQpIHsKKyAgICBjb25zdCBnY2hhciAqczsKKyAgICBHc3RWaWRlb0NvbG9yaW1ldHJ5IGNvbG9yaW1ldHJ5OworCisgICAgcyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiY29sb3JpbWV0cnkiKTsKKyAgICBpZiAocyAmJiBnc3RfdmlkZW9fY29sb3JpbWV0cnlfZnJvbV9zdHJpbmcgKCZjb2xvcmltZXRyeSwgcykpIHsKKyAgICAgIGV4dF9hdG9tID0KKyAgICAgICAgICBidWlsZF9jb2xyX2V4dGVuc2lvbiAoJmNvbG9yaW1ldHJ5LAorICAgICAgICAgIHF0bXV4X2tsYXNzLT5mb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfTVA0KTsKKyAgICAgIGlmIChleHRfYXRvbSkKKyAgICAgICAgZXh0X2F0b21fbGlzdCA9IGdfbGlzdF9hcHBlbmQgKGV4dF9hdG9tX2xpc3QsIGV4dF9hdG9tKTsKKyAgICB9CisgIH0KKworICBpZiAocXRtdXhfa2xhc3MtPmZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9RVAorICAgICAgfHwgc3RyY21wIChtaW1ldHlwZSwgImltYWdlL3gtajJjIikgPT0gMAorICAgICAgfHwgc3RyY21wIChtaW1ldHlwZSwgImltYWdlL3gtanBjIikgPT0gMCkgeworICAgIGNvbnN0IGdjaGFyICpzOworICAgIEdzdFZpZGVvSW50ZXJsYWNlTW9kZSBpbnRlcmxhY2VfbW9kZTsKKyAgICBHc3RWaWRlb0ZpZWxkT3JkZXIgZmllbGRfb3JkZXI7CisgICAgZ2ludCBmaWVsZHMgPSAtMTsKKworICAgIGlmIChzdHJjbXAgKG1pbWV0eXBlLCAiaW1hZ2UveC1qMmMiKSA9PSAwIHx8CisgICAgICAgIHN0cmNtcCAobWltZXR5cGUsICJpbWFnZS94LWpwYyIpID09IDApIHsKKworICAgICAgZmllbGRzID0gMTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiZmllbGRzIiwgJmZpZWxkcyk7CisgICAgfQorCisgICAgcyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiaW50ZXJsYWNlLW1vZGUiKTsKKyAgICBpZiAocykKKyAgICAgIGludGVybGFjZV9tb2RlID0gZ3N0X3ZpZGVvX2ludGVybGFjZV9tb2RlX2Zyb21fc3RyaW5nIChzKTsKKyAgICBlbHNlCisgICAgICBpbnRlcmxhY2VfbW9kZSA9CisgICAgICAgICAgKGZpZWxkcyA8PQorICAgICAgICAgIDEpID8gR1NUX1ZJREVPX0lOVEVSTEFDRV9NT0RFX1BST0dSRVNTSVZFIDoKKyAgICAgICAgICBHU1RfVklERU9fSU5URVJMQUNFX01PREVfTUlYRUQ7CisKKyAgICBmaWVsZF9vcmRlciA9IEdTVF9WSURFT19GSUVMRF9PUkRFUl9VTktOT1dOOworICAgIGlmIChpbnRlcmxhY2VfbW9kZSA9PSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfSU5URVJMRUFWRUQpIHsKKyAgICAgIHMgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImZpZWxkLW9yZGVyIik7CisgICAgICBpZiAocykKKyAgICAgICAgZmllbGRfb3JkZXIgPSBnc3RfdmlkZW9fZmllbGRfb3JkZXJfZnJvbV9zdHJpbmcgKHMpOworICAgIH0KKworICAgIGV4dF9hdG9tID0gYnVpbGRfZmllbF9leHRlbnNpb24gKGludGVybGFjZV9tb2RlLCBmaWVsZF9vcmRlcik7CisgICAgaWYgKGV4dF9hdG9tKQorICAgICAgZXh0X2F0b21fbGlzdCA9IGdfbGlzdF9hcHBlbmQgKGV4dF9hdG9tX2xpc3QsIGV4dF9hdG9tKTsKKyAgfQorCisKKyAgaWYgKHF0bXV4X2tsYXNzLT5mb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfUVQgJiYKKyAgICAgIHdpZHRoID4gNjQwICYmIHdpZHRoIDw9IDEwNTIgJiYgaGVpZ2h0ID49IDQ4MCAmJiBoZWlnaHQgPD0gNTc2KSB7CisgICAgLyogVGhlICdjbGFwJyBleHRlbnNpb24gaXMgYWxzbyBkZWZpbmVkIGZvciBNUDQgYnV0IGludmVudGluZyB2YWx1ZXMgaW4KKyAgICAgKiBnZW5lcmFsIHNlZW1zIGEgYml0IHRyaWNreSBmb3IgdGhpcyBvbmUuIFdlIG9ubHkgd3JpdGUgaXQgZm9yCisgICAgICogU0QgcmVzb2x1dGlvbiBpbiBNT1YsIHdoZXJlIGl0IGlzIGEgcmVxdWlyZW1lbnQuCisgICAgICogVGhlIHNhbWUgZ29lcyBmb3IgdGhlICd0YXB0JyBleHRlbnNpb24sIGp1c3QgdGhhdCBpdCBpcyBub3QgZGVmaW5lZCBmb3IKKyAgICAgKiBNUDQgYW5kIG9ubHkgZm9yIE1PVgorICAgICAqLworICAgIGdpbnQgZGFyX251bSwgZGFyX2RlbjsKKyAgICBnaW50IGNsZWZfd2lkdGgsIGNsZWZfaGVpZ2h0LCBwcm9mX3dpZHRoOworICAgIGdpbnQgY2xhcF93aWR0aF9uLCBjbGFwX3dpZHRoX2QsIGNsYXBfaGVpZ2h0OworICAgIGdpbnQgY2RpdjsKKyAgICBkb3VibGUgYXBwcm94X2RhcjsKKworICAgIC8qIEZpcnN0LCBndWVzcyBkaXNwbGF5IGFzcGVjdCByYXRpbyBiYXNlZCBvbiBwaXhlbCBhc3BlY3QgcmF0aW8sCisgICAgICogd2lkdGggYW5kIGhlaWdodC4gV2UgYXNzdW1lIHRoYXQgZGlzcGxheSBhc3BlY3QgcmF0aW8gaXMgZWl0aGVyCisgICAgICogNDozIG9yIDE2OjkKKyAgICAgKi8KKyAgICBhcHByb3hfZGFyID0gKGdkb3VibGUpICh3aWR0aCAqIHBhcl9udW0pIC8gKGhlaWdodCAqIHBhcl9kZW4pOworICAgIGlmIChhcHByb3hfZGFyID4gMTEuMCAvIDkgJiYgYXBwcm94X2RhciA8IDE0LjAgLyA5KSB7CisgICAgICBkYXJfbnVtID0gNDsKKyAgICAgIGRhcl9kZW4gPSAzOworICAgIH0gZWxzZSBpZiAoYXBwcm94X2RhciA+IDE1LjAgLyA5ICYmIGFwcHJveF9kYXIgPCAxOC4wIC8gOSkgeworICAgICAgZGFyX251bSA9IDE2OworICAgICAgZGFyX2RlbiA9IDk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRhcl9udW0gPSB3aWR0aCAqIHBhcl9udW07CisgICAgICBkYXJfZGVuID0gaGVpZ2h0ICogcGFyX2RlbjsKKyAgICAgIGNkaXYgPSBnc3RfdXRpbF9ncmVhdGVzdF9jb21tb25fZGl2aXNvciAoZGFyX251bSwgZGFyX2Rlbik7CisgICAgICBkYXJfbnVtIC89IGNkaXY7CisgICAgICBkYXJfZGVuIC89IGNkaXY7CisgICAgfQorCisgICAgLyogVGhlbiwgY2FsY3VsYXRlIGNsZWFuLWFwZXJ0dXJlIHZhbHVlcyAoY2xhcCBhbmQgY2xlZikKKyAgICAgKiB1c2luZyB0aGUgZ3Vlc3NlZCBEQVIuCisgICAgICovCisgICAgY2xlZl9oZWlnaHQgPSBjbGFwX2hlaWdodCA9IChoZWlnaHQgPT0gNDg2ID8gNDgwIDogaGVpZ2h0KTsKKyAgICBjbGVmX3dpZHRoID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChjbGVmX2hlaWdodCwKKyAgICAgICAgZGFyX251bSAqIEdfR1VJTlQ2NF9DT05TVEFOVCAoNjU1MzYpLCBkYXJfZGVuKTsKKyAgICBwcm9mX3dpZHRoID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlICh3aWR0aCwKKyAgICAgICAgcGFyX251bSAqIEdfR1VJTlQ2NF9DT05TVEFOVCAoNjU1MzYpLCBwYXJfZGVuKTsKKyAgICBjbGFwX3dpZHRoX24gPSBjbGFwX2hlaWdodCAqIGRhcl9udW0gKiBwYXJfZGVuOworICAgIGNsYXBfd2lkdGhfZCA9IGRhcl9kZW4gKiBwYXJfbnVtOworICAgIGNkaXYgPSBnc3RfdXRpbF9ncmVhdGVzdF9jb21tb25fZGl2aXNvciAoY2xhcF93aWR0aF9uLCBjbGFwX3dpZHRoX2QpOworICAgIGNsYXBfd2lkdGhfbiAvPSBjZGl2OworICAgIGNsYXBfd2lkdGhfZCAvPSBjZGl2OworCisgICAgZXh0X2F0b20gPSBidWlsZF90YXB0X2V4dGVuc2lvbiAoY2xlZl93aWR0aCwgY2xlZl9oZWlnaHQgPDwgMTYsIHByb2Zfd2lkdGgsCisgICAgICAgIGhlaWdodCA8PCAxNiwgd2lkdGggPDwgMTYsIGhlaWdodCA8PCAxNik7CisgICAgcXRwYWQtPnRyYWstPnRhcHQgPSBleHRfYXRvbTsKKworICAgIGV4dF9hdG9tID0gYnVpbGRfY2xhcF9leHRlbnNpb24gKGNsYXBfd2lkdGhfbiwgY2xhcF93aWR0aF9kLAorICAgICAgICBjbGFwX2hlaWdodCwgMSwgMCwgMSwgMCwgMSk7CisgICAgaWYgKGV4dF9hdG9tKQorICAgICAgZXh0X2F0b21fbGlzdCA9IGdfbGlzdF9hcHBlbmQgKGV4dF9hdG9tX2xpc3QsIGV4dF9hdG9tKTsKKyAgfQorCisgIC8qIG9rLCBzZXQgdGhlIHBhZCBpbmZvIGFjY29yZGluZ2x5ICovCisgIHF0cGFkLT5mb3VyY2MgPSBlbnRyeS5mb3VyY2M7CisgIHF0cGFkLT5zeW5jID0gc3luYzsKKyAgcXRwYWQtPnRyYWtfc3RlID0KKyAgICAgIChTYW1wbGVUYWJsZUVudHJ5ICopIGF0b21fdHJha19zZXRfdmlkZW9fdHlwZSAocXRwYWQtPnRyYWssCisgICAgICBxdG11eC0+Y29udGV4dCwgJmVudHJ5LCByYXRlLCBleHRfYXRvbV9saXN0KTsKKyAgaWYgKHN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LXByb3JlcyIpID09IDApIHsKKyAgICBTYW1wbGVUYWJsZUVudHJ5TVA0ViAqbXA0diA9IChTYW1wbGVUYWJsZUVudHJ5TVA0ViAqKSBxdHBhZC0+dHJha19zdGU7CisgICAgY29uc3QgZ2NoYXIgKmNvbXByZXNzb3IgPSBOVUxMOworICAgIG1wNHYtPnNwYXRpYWxfcXVhbGl0eSA9IDB4M0ZGOworICAgIG1wNHYtPnRlbXBvcmFsX3F1YWxpdHkgPSAwOworICAgIG1wNHYtPnZlbmRvciA9IEZPVVJDQ19hcHBsOworICAgIG1wNHYtPmhvcml6b250YWxfcmVzb2x1dGlvbiA9IDcyIDw8IDE2OworICAgIG1wNHYtPnZlcnRpY2FsX3Jlc29sdXRpb24gPSA3MiA8PCAxNjsKKyAgICBtcDR2LT5kZXB0aCA9IChlbnRyeS5mb3VyY2MgPT0gRk9VUkNDX2FwNGgKKyAgICAgICAgfHwgZW50cnkuZm91cmNjID09IEZPVVJDQ19hcDR4KSA/IDMyIDogMjQ7CisKKyAgICAvKiBTZXQgY29tcHJlc3NvciBuYW1lLCByZXF1aXJlZCBieSBzb21lIHNvZnR3YXJlICovCisgICAgc3dpdGNoIChlbnRyeS5mb3VyY2MpIHsKKyAgICAgIGNhc2UgRk9VUkNDX2FwY246CisgICAgICAgIGNvbXByZXNzb3IgPSAiQXBwbGUgUHJvUmVzIDQyMiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGT1VSQ0NfYXBjczoKKyAgICAgICAgY29tcHJlc3NvciA9ICJBcHBsZSBQcm9SZXMgNDIyIExUIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZPVVJDQ19hcGNoOgorICAgICAgICBjb21wcmVzc29yID0gIkFwcGxlIFByb1JlcyA0MjIgSFEiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk9VUkNDX2FwY286CisgICAgICAgIGNvbXByZXNzb3IgPSAiQXBwbGUgUHJvUmVzIDQyMiBQcm94eSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGT1VSQ0NfYXA0aDoKKyAgICAgICAgY29tcHJlc3NvciA9ICJBcHBsZSBQcm9SZXMgNDQ0NCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGT1VSQ0NfYXA0eDoKKyAgICAgICAgY29tcHJlc3NvciA9ICJBcHBsZSBQcm9SZXMgNDQ0NCBYUSI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoY29tcHJlc3NvcikgeworICAgICAgc3RyY3B5ICgoZ2NoYXIgKikgbXA0di0+Y29tcHJlc3NvciArIDEsIGNvbXByZXNzb3IpOworICAgICAgbXA0di0+Y29tcHJlc3NvclswXSA9IHN0cmxlbiAoY29tcHJlc3Nvcik7CisgICAgfQorICB9CisKKyAgZ3N0X29iamVjdF91bnJlZiAocXRtdXgpOworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3JlZnVzZV9jYXBzOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgInBhZCAlcyByZWZ1c2VkIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgIEdTVF9QQURfTkFNRSAocGFkKSwgY2Fwcyk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocXRtdXgpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorcmVmdXNlX3JlbmVnb3RpYXRpb246CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChxdG11eCwgU1RSRUFNLCBGT1JNQVQsCisgICAgICAgICgiQ2FuJ3QgY2hhbmdlIGlucHV0IGZvcm1hdCBhdCBydW50aW1lLiIpLAorICAgICAgICAoInBhZCAlcyByZWZ1c2VkIHJlbmVnb3RpYXRpb24gdG8gJSIgR1NUX1BUUl9GT1JNQVQsIEdTVF9QQURfTkFNRSAocGFkKSwKKyAgICAgICAgICAgIGNhcHMpKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChxdG11eCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3F0X211eF9zdWJ0aXRsZV9zaW5rX3NldF9jYXBzIChHc3RRVFBhZCAqIHF0cGFkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UGFkICpwYWQgPSBxdHBhZC0+Y29sbGVjdC5wYWQ7CisgIEdzdFFUTXV4ICpxdG11eCA9IEdTVF9RVF9NVVhfQ0FTVCAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIFN1YnRpdGxlU2FtcGxlRW50cnkgZW50cnkgPSB7IDAsIH07CisKKyAgLyogZG9lcyBub3QgZ28gd2VsbCB0byByZW5lZ290aWF0ZSBzdHJlYW0gbWlkLXdheSwgdW5sZXNzCisgICAqIHRoZSBvbGQgY2FwcyBhcmUgYSBzdWJzZXQgb2YgdGhlIG5ldyBvbmUgKHRoaXMgbWVhbnMgdXBzdHJlYW0KKyAgICogYWRkZWQgbW9yZSBpbmZvIHRvIHRoZSBjYXBzLCBhcyBib3RoIHNob3VsZCBiZSAnZml4ZWQnIGNhcHMpICovCisgIGlmIChxdHBhZC0+Zm91cmNjKSB7CisgICAgR3N0Q2FwcyAqY3VycmVudF9jYXBzOworCisgICAgY3VycmVudF9jYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChwYWQpOworICAgIGdfYXNzZXJ0IChjYXBzICE9IE5VTEwpOworCisgICAgaWYgKCFnc3RfcXRtdXhfY2Fwc19pc19zdWJzZXRfZnVsbCAocXRtdXgsIGN1cnJlbnRfY2FwcywgY2FwcykpIHsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChjdXJyZW50X2NhcHMpOworICAgICAgZ290byByZWZ1c2VfcmVuZWdvdGlhdGlvbjsKKyAgICB9CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsCisgICAgICAgICJwYWQgJXMgYWNjZXB0ZWQgcmVuZWdvdGlhdGlvbiB0byAlIiBHU1RfUFRSX0ZPUk1BVCAiIGZyb20gJSIKKyAgICAgICAgR1NUX1BUUl9GT1JNQVQsIEdTVF9QQURfTkFNRSAocGFkKSwgY2FwcywgY3VycmVudF9jYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY3VycmVudF9jYXBzKTsKKworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRtdXgsICIlczolcywgY2Fwcz0lIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAocGFkKSwgY2Fwcyk7CisKKyAgLyogc3VidGl0bGVzIGRlZmF1bHQgKi8KKyAgc3VidGl0bGVfc2FtcGxlX2VudHJ5X2luaXQgKCZlbnRyeSk7CisgIHF0cGFkLT5pc19vdXRfb2Zfb3JkZXIgPSBGQUxTRTsKKyAgcXRwYWQtPnN5bmMgPSBGQUxTRTsKKyAgcXRwYWQtPnNwYXJzZSA9IFRSVUU7CisgIHF0cGFkLT5wcmVwYXJlX2J1Zl9mdW5jID0gTlVMTDsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAoc3RydWN0dXJlLCAidGV4dC94LXJhdyIpKSB7CisgICAgY29uc3QgZ2NoYXIgKmZvcm1hdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZm9ybWF0Iik7CisgICAgaWYgKGZvcm1hdCAmJiBzdHJjbXAgKGZvcm1hdCwgInV0ZjgiKSA9PSAwKSB7CisgICAgICBlbnRyeS5mb3VyY2MgPSBGT1VSQ0NfdHgzZzsKKyAgICAgIHF0cGFkLT5wcmVwYXJlX2J1Zl9mdW5jID0gZ3N0X3F0X211eF9wcmVwYXJlX3R4M2dfYnVmZmVyOworICAgICAgcXRwYWQtPmNyZWF0ZV9lbXB0eV9idWZmZXIgPSBnc3RfcXRfbXV4X2NyZWF0ZV9lbXB0eV90eDNnX2J1ZmZlcjsKKyAgICB9CisgIH0KKworICBpZiAoIWVudHJ5LmZvdXJjYykKKyAgICBnb3RvIHJlZnVzZV9jYXBzOworCisgIHF0cGFkLT5mb3VyY2MgPSBlbnRyeS5mb3VyY2M7CisgIHF0cGFkLT50cmFrX3N0ZSA9CisgICAgICAoU2FtcGxlVGFibGVFbnRyeSAqKSBhdG9tX3RyYWtfc2V0X3N1YnRpdGxlX3R5cGUgKHF0cGFkLT50cmFrLAorICAgICAgcXRtdXgtPmNvbnRleHQsICZlbnRyeSk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocXRtdXgpOworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3JlZnVzZV9jYXBzOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgInBhZCAlcyByZWZ1c2VkIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgIEdTVF9QQURfTkFNRSAocGFkKSwgY2Fwcyk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocXRtdXgpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorcmVmdXNlX3JlbmVnb3RpYXRpb246CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LAorICAgICAgICAicGFkICVzIHJlZnVzZWQgcmVuZWdvdGlhdGlvbiB0byAlIiBHU1RfUFRSX0ZPUk1BVCwgR1NUX1BBRF9OQU1FIChwYWQpLAorICAgICAgICBjYXBzKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChxdG11eCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3F0X211eF9zaW5rX2V2ZW50IChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsIEdzdENvbGxlY3REYXRhICogZGF0YSwKKyAgICBHc3RFdmVudCAqIGV2ZW50LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFFUTXV4ICpxdG11eDsKKyAgZ3VpbnQzMiBhdmdfYml0cmF0ZSA9IDAsIG1heF9iaXRyYXRlID0gMDsKKyAgR3N0UGFkICpwYWQgPSBkYXRhLT5wYWQ7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgcXRtdXggPSBHU1RfUVRfTVVYX0NBU1QgKHVzZXJfZGF0YSk7CisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKyAgICAgIEdzdFFUUGFkICpjb2xsZWN0X3BhZDsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisKKyAgICAgIC8qIGZpbmQgc3RyZWFtIGRhdGEgKi8KKyAgICAgIGNvbGxlY3RfcGFkID0gKEdzdFFUUGFkICopIGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgICAgIGdfYXNzZXJ0IChjb2xsZWN0X3BhZCk7CisgICAgICBnX2Fzc2VydCAoY29sbGVjdF9wYWQtPnNldF9jYXBzKTsKKworICAgICAgcmV0ID0gY29sbGVjdF9wYWQtPnNldF9jYXBzIChjb2xsZWN0X3BhZCwgY2Fwcyk7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGV2ZW50ID0gTlVMTDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9UQUc6eworICAgICAgR3N0VGFnTGlzdCAqbGlzdDsKKyAgICAgIEdzdFRhZ1NldHRlciAqc2V0dGVyID0gR1NUX1RBR19TRVRURVIgKHF0bXV4KTsKKyAgICAgIEdzdFRhZ01lcmdlTW9kZSBtb2RlOworICAgICAgZ2NoYXIgKmNvZGU7CisgICAgICBHc3RRVFBhZCAqY29sbGVjdF9wYWQ7CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocXRtdXgpOworICAgICAgbW9kZSA9IGdzdF90YWdfc2V0dGVyX2dldF90YWdfbWVyZ2VfbW9kZSAoc2V0dGVyKTsKKyAgICAgIGNvbGxlY3RfcGFkID0gKEdzdFFUUGFkICopIGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAoZXZlbnQsICZsaXN0KTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAicmVjZWl2ZWQgdGFnIGV2ZW50IG9uIHBhZCAlczolcyA6ICUiCisgICAgICAgICAgR1NUX1BUUl9GT1JNQVQsIEdTVF9ERUJVR19QQURfTkFNRSAocGFkKSwgbGlzdCk7CisKKyAgICAgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X3Njb3BlIChsaXN0KSA9PSBHU1RfVEFHX1NDT1BFX0dMT0JBTCkgeworICAgICAgICBnc3RfdGFnX3NldHRlcl9tZXJnZV90YWdzIChzZXR0ZXIsIGxpc3QsIG1vZGUpOworICAgICAgICBxdG11eC0+dGFnc19jaGFuZ2VkID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghY29sbGVjdF9wYWQtPnRhZ3MpCisgICAgICAgICAgY29sbGVjdF9wYWQtPnRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgICAgICBnc3RfdGFnX2xpc3RfaW5zZXJ0IChjb2xsZWN0X3BhZC0+dGFncywgbGlzdCwgbW9kZSk7CisgICAgICAgIGNvbGxlY3RfcGFkLT50YWdzX2NoYW5nZWQgPSBUUlVFOworICAgICAgfQorICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXV4KTsKKworICAgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfdWludCAobGlzdCwgR1NUX1RBR19CSVRSQVRFLCAmYXZnX2JpdHJhdGUpIHwKKyAgICAgICAgICBnc3RfdGFnX2xpc3RfZ2V0X3VpbnQgKGxpc3QsIEdTVF9UQUdfTUFYSU1VTV9CSVRSQVRFLCAmbWF4X2JpdHJhdGUpKSB7CisgICAgICAgIEdzdFFUUGFkICpxdHBhZCA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgICAgICAgZ19hc3NlcnQgKHF0cGFkKTsKKworICAgICAgICBpZiAoYXZnX2JpdHJhdGUgPiAwICYmIGF2Z19iaXRyYXRlIDwgR19NQVhVSU5UMzIpCisgICAgICAgICAgcXRwYWQtPmF2Z19iaXRyYXRlID0gYXZnX2JpdHJhdGU7CisgICAgICAgIGlmIChtYXhfYml0cmF0ZSA+IDAgJiYgbWF4X2JpdHJhdGUgPCBHX01BWFVJTlQzMikKKyAgICAgICAgICBxdHBhZC0+bWF4X2JpdHJhdGUgPSBtYXhfYml0cmF0ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChsaXN0LCBHU1RfVEFHX0xBTkdVQUdFX0NPREUsICZjb2RlKSkgeworICAgICAgICBjb25zdCBjaGFyICppc29fY29kZSA9IGdzdF90YWdfZ2V0X2xhbmd1YWdlX2NvZGVfaXNvXzYzOV8yVCAoY29kZSk7CisgICAgICAgIGlmIChpc29fY29kZSkgeworICAgICAgICAgIEdzdFFUUGFkICpxdHBhZCA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgICAgICAgICBnX2Fzc2VydCAocXRwYWQpOworICAgICAgICAgIGlmIChxdHBhZC0+dHJhaykgeworICAgICAgICAgICAgLyogaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvbWFjLyNkb2N1bWVudGF0aW9uL1F1aWNrVGltZS9RVEZGL1FURkZDaGFwNC9xdGZmNC5odG1sICovCisgICAgICAgICAgICBxdHBhZC0+dHJhay0+bWRpYS5tZGhkLmxhbmd1YWdlX2NvZGUgPQorICAgICAgICAgICAgICAgIChpc29fY29kZVswXSAtIDB4NjApICogMHg0MDAgKyAoaXNvX2NvZGVbMV0gLSAweDYwKSAqIDB4MjAgKworICAgICAgICAgICAgICAgIChpc29fY29kZVsyXSAtIDB4NjApOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBnX2ZyZWUgKGNvZGUpOworICAgICAgfQorCisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGV2ZW50ID0gTlVMTDsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKGV2ZW50ICE9IE5VTEwpCisgICAgcmV0dXJuIGdzdF9jb2xsZWN0X3BhZHNfZXZlbnRfZGVmYXVsdCAocGFkcywgZGF0YSwgZXZlbnQsIEZBTFNFKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9yZWxlYXNlX3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIHBhZCkKK3sKKyAgR3N0UVRNdXggKm11eCA9IEdTVF9RVF9NVVhfQ0FTVCAoZWxlbWVudCk7CisgIEdTTGlzdCAqd2FsazsKKworICBHU1RfREVCVUdfT0JKRUNUIChlbGVtZW50LCAiUmVsZWFzaW5nICVzOiVzIiwgR1NUX0RFQlVHX1BBRF9OQU1FIChwYWQpKTsKKworICBmb3IgKHdhbGsgPSBtdXgtPnNpbmtwYWRzOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFFUUGFkICpxdHBhZCA9IChHc3RRVFBhZCAqKSB3YWxrLT5kYXRhOworICAgIEdTVF9ERUJVRyAoIkNoZWNraW5nICVzOiVzIiwgR1NUX0RFQlVHX1BBRF9OQU1FIChxdHBhZC0+Y29sbGVjdC5wYWQpKTsKKyAgICBpZiAocXRwYWQtPmNvbGxlY3QucGFkID09IHBhZCkgeworICAgICAgLyogdGhpcyBpcyBpdCwgcmVtb3ZlICovCisgICAgICBtdXgtPnNpbmtwYWRzID0gZ19zbGlzdF9kZWxldGVfbGluayAobXV4LT5zaW5rcGFkcywgd2Fsayk7CisgICAgICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChlbGVtZW50LCBwYWQpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKG11eC0+Y3VycmVudF9wYWQgJiYgbXV4LT5jdXJyZW50X3BhZC0+Y29sbGVjdC5wYWQgPT0gcGFkKSB7CisgICAgbXV4LT5jdXJyZW50X3BhZCA9IE5VTEw7CisgICAgbXV4LT5jdXJyZW50X2NodW5rX3NpemUgPSAwOworICAgIG11eC0+Y3VycmVudF9jaHVua19kdXJhdGlvbiA9IDA7CisgIH0KKworICBnc3RfY29sbGVjdF9wYWRzX3JlbW92ZV9wYWQgKG11eC0+Y29sbGVjdCwgcGFkKTsKKworICBpZiAobXV4LT5zaW5rcGFkcyA9PSBOVUxMKSB7CisgICAgLyogTm8gbW9yZSBvdXRzdGFuZGluZyByZXF1ZXN0IHBhZHMsIHJlc2V0IG91ciBjb3VudGVycyAqLworICAgIG11eC0+dmlkZW9fcGFkcyA9IDA7CisgICAgbXV4LT5hdWRpb19wYWRzID0gMDsKKyAgICBtdXgtPnN1YnRpdGxlX3BhZHMgPSAwOworICB9Cit9CisKK3N0YXRpYyBHc3RQYWQgKgorZ3N0X3F0X211eF9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogcmVxX25hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChlbGVtZW50KTsKKyAgR3N0UVRNdXggKnF0bXV4ID0gR1NUX1FUX01VWF9DQVNUIChlbGVtZW50KTsKKyAgR3N0UVRQYWQgKmNvbGxlY3RfcGFkOworICBHc3RQYWQgKm5ld3BhZDsKKyAgR3N0UVRQYWRTZXRDYXBzRnVuYyBzZXRjYXBzX2Z1bmM7CisgIGdjaGFyICpuYW1lOworICBnaW50IHBhZF9pZDsKKyAgZ2Jvb2xlYW4gbG9jayA9IFRSVUU7CisKKyAgaWYgKHRlbXBsLT5kaXJlY3Rpb24gIT0gR1NUX1BBRF9TSU5LKQorICAgIGdvdG8gd3JvbmdfZGlyZWN0aW9uOworCisgIGlmIChxdG11eC0+c3RhdGUgPiBHU1RfUVRfTVVYX1NUQVRFX1NUQVJURUQpCisgICAgZ290byB0b29fbGF0ZTsKKworICBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJhdWRpb18ldSIpKSB7CisgICAgc2V0Y2Fwc19mdW5jID0gZ3N0X3F0X211eF9hdWRpb19zaW5rX3NldF9jYXBzOworICAgIGlmIChyZXFfbmFtZSAhPSBOVUxMICYmIHNzY2FuZiAocmVxX25hbWUsICJhdWRpb18ldSIsICZwYWRfaWQpID09IDEpIHsKKyAgICAgIG5hbWUgPSBnX3N0cmR1cCAocmVxX25hbWUpOworICAgIH0gZWxzZSB7CisgICAgICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiYXVkaW9fJXUiLCBxdG11eC0+YXVkaW9fcGFkcysrKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJ2aWRlb18ldSIpKSB7CisgICAgc2V0Y2Fwc19mdW5jID0gZ3N0X3F0X211eF92aWRlb19zaW5rX3NldF9jYXBzOworICAgIGlmIChyZXFfbmFtZSAhPSBOVUxMICYmIHNzY2FuZiAocmVxX25hbWUsICJ2aWRlb18ldSIsICZwYWRfaWQpID09IDEpIHsKKyAgICAgIG5hbWUgPSBnX3N0cmR1cCAocmVxX25hbWUpOworICAgIH0gZWxzZSB7CisgICAgICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgidmlkZW9fJXUiLCBxdG11eC0+dmlkZW9fcGFkcysrKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJzdWJ0aXRsZV8ldSIpKSB7CisgICAgc2V0Y2Fwc19mdW5jID0gZ3N0X3F0X211eF9zdWJ0aXRsZV9zaW5rX3NldF9jYXBzOworICAgIGlmIChyZXFfbmFtZSAhPSBOVUxMICYmIHNzY2FuZiAocmVxX25hbWUsICJzdWJ0aXRsZV8ldSIsICZwYWRfaWQpID09IDEpIHsKKyAgICAgIG5hbWUgPSBnX3N0cmR1cCAocmVxX25hbWUpOworICAgIH0gZWxzZSB7CisgICAgICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic3VidGl0bGVfJXUiLCBxdG11eC0+c3VidGl0bGVfcGFkcysrKTsKKyAgICB9CisgICAgbG9jayA9IEZBTFNFOworICB9IGVsc2UKKyAgICBnb3RvIHdyb25nX3RlbXBsYXRlOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0bXV4LCAiUmVxdWVzdGVkIHBhZDogJXMiLCBuYW1lKTsKKworICAvKiBjcmVhdGUgcGFkIGFuZCBhZGQgdG8gY29sbGVjdGlvbnMgKi8KKyAgbmV3cGFkID0KKyAgICAgIGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfUVRfTVVYX1BBRCwgIm5hbWUiLCBuYW1lLCAiZGlyZWN0aW9uIiwKKyAgICAgIHRlbXBsLT5kaXJlY3Rpb24sICJ0ZW1wbGF0ZSIsIHRlbXBsLCBOVUxMKTsKKyAgZ19mcmVlIChuYW1lKTsKKyAgY29sbGVjdF9wYWQgPSAoR3N0UVRQYWQgKikKKyAgICAgIGdzdF9jb2xsZWN0X3BhZHNfYWRkX3BhZCAocXRtdXgtPmNvbGxlY3QsIG5ld3BhZCwgc2l6ZW9mIChHc3RRVFBhZCksCisgICAgICAoR3N0Q29sbGVjdERhdGFEZXN0cm95Tm90aWZ5KSAoZ3N0X3F0X211eF9wYWRfcmVzZXQpLCBsb2NrKTsKKyAgLyogc2V0IHVwIHBhZCAqLworICBnc3RfcXRfbXV4X3BhZF9yZXNldCAoY29sbGVjdF9wYWQpOworICBjb2xsZWN0X3BhZC0+dHJhayA9IGF0b21fdHJha19uZXcgKHF0bXV4LT5jb250ZXh0KTsKKyAgYXRvbV9tb292X2FkZF90cmFrIChxdG11eC0+bW9vdiwgY29sbGVjdF9wYWQtPnRyYWspOworCisgIHF0bXV4LT5zaW5rcGFkcyA9IGdfc2xpc3RfYXBwZW5kIChxdG11eC0+c2lua3BhZHMsIGNvbGxlY3RfcGFkKTsKKworICAvKiBzZXQgdXAgcGFkIGZ1bmN0aW9ucyAqLworICBjb2xsZWN0X3BhZC0+c2V0X2NhcHMgPSBzZXRjYXBzX2Z1bmM7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChuZXdwYWQsIFRSVUUpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChlbGVtZW50LCBuZXdwYWQpOworCisgIHJldHVybiBuZXdwYWQ7CisKKyAgLyogRVJST1JTICovCit3cm9uZ19kaXJlY3Rpb246CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LCAiUmVxdWVzdCBwYWQgdGhhdCBpcyBub3QgYSBTSU5LIHBhZC4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQordG9vX2xhdGU6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0bXV4LCAiTm90IHByb3ZpZGluZyByZXF1ZXN0IHBhZCBhZnRlciBzdHJlYW0gc3RhcnQuIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK3dyb25nX3RlbXBsYXRlOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdG11eCwgIlRoaXMgaXMgbm90IG91ciB0ZW1wbGF0ZSEiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UVRNdXggKnF0bXV4ID0gR1NUX1FUX01VWF9DQVNUIChvYmplY3QpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAocXRtdXgpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTU9WSUVfVElNRVNDQUxFOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHF0bXV4LT50aW1lc2NhbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RSQUtfVElNRVNDQUxFOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHF0bXV4LT50cmFrX3RpbWVzY2FsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRE9fQ1RUUzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBxdG11eC0+Z3Vlc3NfcHRzKTsKKyAgICAgIGJyZWFrOworI2lmbmRlZiBHU1RfUkVNT1ZFX0RFUFJFQ0FURUQKKyAgICBjYXNlIFBST1BfRFRTX01FVEhPRDoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBxdG11eC0+ZHRzX21ldGhvZCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgUFJPUF9GQVNUX1NUQVJUOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHF0bXV4LT5mYXN0X3N0YXJ0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GQVNUX1NUQVJUX1RFTVBfRklMRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHF0bXV4LT5mYXN0X3N0YXJ0X2ZpbGVfcGF0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTU9PVl9SRUNPVl9GSUxFOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgcXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZV9wYXRoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GUkFHTUVOVF9EVVJBVElPTjoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBxdG11eC0+ZnJhZ21lbnRfZHVyYXRpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUUkVBTUFCTEU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcXRtdXgtPnN0cmVhbWFibGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFU0VSVkVEX01BWF9EVVJBVElPTjoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHF0bXV4LT5yZXNlcnZlZF9tYXhfZHVyYXRpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFU0VSVkVEX0RVUkFUSU9OX1JFTUFJTklORzoKKyAgICAgIGlmIChxdG11eC0+cmVzZXJ2ZWRfZHVyYXRpb25fcmVtYWluaW5nID09IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHF0bXV4LT5yZXNlcnZlZF9tYXhfZHVyYXRpb24pOworICAgICAgZWxzZSB7CisgICAgICAgIEdzdENsb2NrVGltZSByZW1haW5pbmcgPSBxdG11eC0+cmVzZXJ2ZWRfZHVyYXRpb25fcmVtYWluaW5nOworCisgICAgICAgIC8qIFJlcG9ydCB0aGUgcmVtYWluaW5nIHNwYWNlIGFzIHRoZSBjYWxjdWxhdGVkIHJlbWFpbmluZywgbWludXMKKyAgICAgICAgICogaG93ZXZlciBtdWNoIHdlJ3ZlIG11eGVkIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZSAqLworICAgICAgICBpZiAocmVtYWluaW5nID4gcXRtdXgtPm11eGVkX3NpbmNlX2xhc3RfdXBkYXRlKQorICAgICAgICAgIHJlbWFpbmluZyAtPSBxdG11eC0+bXV4ZWRfc2luY2VfbGFzdF91cGRhdGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZW1haW5pbmcgPSAwOworICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRtdXgsICJyZXNlcnZlZCBkdXJhdGlvbiByZW1haW5pbmcgLSByZXBvcnRpbmcgJSIKKyAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIiglIiBHX0dVSU5UNjRfRk9STUFUICIgLSAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgcmVtYWluaW5nLCBxdG11eC0+cmVzZXJ2ZWRfZHVyYXRpb25fcmVtYWluaW5nLAorICAgICAgICAgICAgcXRtdXgtPm11eGVkX3NpbmNlX2xhc3RfdXBkYXRlKTsKKyAgICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgcmVtYWluaW5nKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVNFUlZFRF9NT09WX1VQREFURV9QRVJJT0Q6CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBxdG11eC0+cmVzZXJ2ZWRfbW9vdl91cGRhdGVfcGVyaW9kKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVNFUlZFRF9CWVRFU19QRVJfU0VDOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHF0bXV4LT5yZXNlcnZlZF9ieXRlc19wZXJfc2VjX3Blcl90cmFrKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVNFUlZFRF9QUkVGSUxMOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHF0bXV4LT5yZXNlcnZlZF9wcmVmaWxsKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTlRFUkxFQVZFX0JZVEVTOgorICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgcXRtdXgtPmludGVybGVhdmVfYnl0ZXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lOVEVSTEVBVkVfVElNRToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHF0bXV4LT5pbnRlcmxlYXZlX3RpbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9SQVdfQVVESU9fRFJJRlQ6CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBxdG11eC0+bWF4X3Jhd19hdWRpb19kcmlmdCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChxdG11eCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRfbXV4X2dlbmVyYXRlX2Zhc3Rfc3RhcnRfZmlsZV9wYXRoIChHc3RRVE11eCAqIHF0bXV4KQoreworICBnY2hhciAqdG1wOworCisgIGdfZnJlZSAocXRtdXgtPmZhc3Rfc3RhcnRfZmlsZV9wYXRoKTsKKyAgcXRtdXgtPmZhc3Rfc3RhcnRfZmlsZV9wYXRoID0gTlVMTDsKKworICB0bXAgPSBnX3N0cmR1cF9wcmludGYgKCIlcyVkIiwgInF0bXV4IiwgZ19yYW5kb21faW50ICgpKTsKKyAgcXRtdXgtPmZhc3Rfc3RhcnRfZmlsZV9wYXRoID0gZ19idWlsZF9maWxlbmFtZSAoZ19nZXRfdG1wX2RpciAoKSwgdG1wLCBOVUxMKTsKKyAgZ19mcmVlICh0bXApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UVRNdXggKnF0bXV4ID0gR1NUX1FUX01VWF9DQVNUIChvYmplY3QpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAocXRtdXgpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTU9WSUVfVElNRVNDQUxFOgorICAgICAgcXRtdXgtPnRpbWVzY2FsZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UUkFLX1RJTUVTQ0FMRToKKyAgICAgIHF0bXV4LT50cmFrX3RpbWVzY2FsZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ET19DVFRTOgorICAgICAgcXRtdXgtPmd1ZXNzX3B0cyA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworI2lmbmRlZiBHU1RfUkVNT1ZFX0RFUFJFQ0FURUQKKyAgICBjYXNlIFBST1BfRFRTX01FVEhPRDoKKyAgICAgIHF0bXV4LT5kdHNfbWV0aG9kID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIFBST1BfRkFTVF9TVEFSVDoKKyAgICAgIHF0bXV4LT5mYXN0X3N0YXJ0ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZBU1RfU1RBUlRfVEVNUF9GSUxFOgorICAgICAgZ19mcmVlIChxdG11eC0+ZmFzdF9zdGFydF9maWxlX3BhdGgpOworICAgICAgcXRtdXgtPmZhc3Rfc3RhcnRfZmlsZV9wYXRoID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICAvKiBOVUxMIG1lYW5zIHRvIGdlbmVyYXRlIGEgcmFuZG9tIG9uZSAqLworICAgICAgaWYgKCFxdG11eC0+ZmFzdF9zdGFydF9maWxlX3BhdGgpIHsKKyAgICAgICAgZ3N0X3F0X211eF9nZW5lcmF0ZV9mYXN0X3N0YXJ0X2ZpbGVfcGF0aCAocXRtdXgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01PT1ZfUkVDT1ZfRklMRToKKyAgICAgIGdfZnJlZSAocXRtdXgtPm1vb3ZfcmVjb3ZfZmlsZV9wYXRoKTsKKyAgICAgIHF0bXV4LT5tb292X3JlY292X2ZpbGVfcGF0aCA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZSQUdNRU5UX0RVUkFUSU9OOgorICAgICAgcXRtdXgtPmZyYWdtZW50X2R1cmF0aW9uID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUUkVBTUFCTEU6eworICAgICAgR3N0UVRNdXhDbGFzcyAqcXRtdXhfa2xhc3MgPQorICAgICAgICAgIChHc3RRVE11eENsYXNzICopIChHX09CSkVDVF9HRVRfQ0xBU1MgKHF0bXV4KSk7CisgICAgICBpZiAocXRtdXhfa2xhc3MtPmZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9JU01MKSB7CisgICAgICAgIHF0bXV4LT5zdHJlYW1hYmxlID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9SRVNFUlZFRF9NQVhfRFVSQVRJT046CisgICAgICBxdG11eC0+cmVzZXJ2ZWRfbWF4X2R1cmF0aW9uID0gZ192YWx1ZV9nZXRfdWludDY0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVTRVJWRURfTU9PVl9VUERBVEVfUEVSSU9EOgorICAgICAgcXRtdXgtPnJlc2VydmVkX21vb3ZfdXBkYXRlX3BlcmlvZCA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFU0VSVkVEX0JZVEVTX1BFUl9TRUM6CisgICAgICBxdG11eC0+cmVzZXJ2ZWRfYnl0ZXNfcGVyX3NlY19wZXJfdHJhayA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVNFUlZFRF9QUkVGSUxMOgorICAgICAgcXRtdXgtPnJlc2VydmVkX3ByZWZpbGwgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSU5URVJMRUFWRV9CWVRFUzoKKyAgICAgIHF0bXV4LT5pbnRlcmxlYXZlX2J5dGVzID0gZ192YWx1ZV9nZXRfdWludDY0ICh2YWx1ZSk7CisgICAgICBxdG11eC0+aW50ZXJsZWF2ZV9ieXRlc19zZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lOVEVSTEVBVkVfVElNRToKKyAgICAgIHF0bXV4LT5pbnRlcmxlYXZlX3RpbWUgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIHF0bXV4LT5pbnRlcmxlYXZlX3RpbWVfc2V0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfUkFXX0FVRElPX0RSSUZUOgorICAgICAgcXRtdXgtPm1heF9yYXdfYXVkaW9fZHJpZnQgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0bXV4KTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcXRfbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0UVRNdXggKnF0bXV4ID0gR1NUX1FUX01VWF9DQVNUIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfY29sbGVjdF9wYWRzX3N0YXJ0IChxdG11eC0+Y29sbGVjdCk7CisgICAgICBxdG11eC0+c3RhdGUgPSBHU1RfUVRfTVVYX1NUQVRFX1NUQVJURUQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X2NvbGxlY3RfcGFkc19zdG9wIChxdG11eC0+Y29sbGVjdCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUExBWUlOR19UT19QQVVTRUQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3F0X211eF9yZXNldCAocXRtdXgsIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3F0X211eF9yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBHVHlwZUluZm8gdHlwZWluZm8gPSB7CisgICAgc2l6ZW9mIChHc3RRVE11eENsYXNzKSwKKyAgICAoR0Jhc2VJbml0RnVuYykgZ3N0X3F0X211eF9iYXNlX2luaXQsCisgICAgTlVMTCwKKyAgICAoR0NsYXNzSW5pdEZ1bmMpIGdzdF9xdF9tdXhfY2xhc3NfaW5pdCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgc2l6ZW9mIChHc3RRVE11eCksCisgICAgMCwKKyAgICAoR0luc3RhbmNlSW5pdEZ1bmMpIGdzdF9xdF9tdXhfaW5pdCwKKyAgfTsKKyAgc3RhdGljIGNvbnN0IEdJbnRlcmZhY2VJbmZvIHRhZ19zZXR0ZXJfaW5mbyA9IHsKKyAgICBOVUxMLCBOVUxMLCBOVUxMCisgIH07CisgIHN0YXRpYyBjb25zdCBHSW50ZXJmYWNlSW5mbyB0YWdfeG1wX3dyaXRlcl9pbmZvID0geworICAgIE5VTEwsIE5VTEwsIE5VTEwKKyAgfTsKKyAgc3RhdGljIGNvbnN0IEdJbnRlcmZhY2VJbmZvIHByZXNldF9pbmZvID0geworICAgIE5VTEwsIE5VTEwsIE5VTEwKKyAgfTsKKyAgR1R5cGUgdHlwZTsKKyAgR3N0UVRNdXhGb3JtYXQgZm9ybWF0OworICBHc3RRVE11eENsYXNzUGFyYW1zICpwYXJhbXM7CisgIGd1aW50IGkgPSAwOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfcXRfbXV4X2RlYnVnLCAicXRtdXgiLCAwLCAiUVQgTXV4ZXIiKTsKKworICBHU1RfTE9HICgiUmVnaXN0ZXJpbmcgbXV4ZXJzIik7CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBHc3RRVE11eEZvcm1hdFByb3AgKnByb3A7CisgICAgR3N0Q2FwcyAqc3VidGl0bGVfY2FwczsKKworICAgIHByb3AgPSAmZ3N0X3F0X211eF9mb3JtYXRfbGlzdFtpXTsKKyAgICBmb3JtYXQgPSBwcm9wLT5mb3JtYXQ7CisgICAgaWYgKGZvcm1hdCA9PSBHU1RfUVRfTVVYX0ZPUk1BVF9OT05FKQorICAgICAgYnJlYWs7CisKKyAgICAvKiBjcmVhdGUgYSBjYWNoZSBmb3IgdGhlc2UgcHJvcGVydGllcyAqLworICAgIHBhcmFtcyA9IGdfbmV3MCAoR3N0UVRNdXhDbGFzc1BhcmFtcywgMSk7CisgICAgcGFyYW1zLT5wcm9wID0gcHJvcDsKKyAgICBwYXJhbXMtPnNyY19jYXBzID0gZ3N0X3N0YXRpY19jYXBzX2dldCAoJnByb3AtPnNyY19jYXBzKTsKKyAgICBwYXJhbXMtPnZpZGVvX3NpbmtfY2FwcyA9IGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZwcm9wLT52aWRlb19zaW5rX2NhcHMpOworICAgIHBhcmFtcy0+YXVkaW9fc2lua19jYXBzID0gZ3N0X3N0YXRpY19jYXBzX2dldCAoJnByb3AtPmF1ZGlvX3NpbmtfY2Fwcyk7CisgICAgc3VidGl0bGVfY2FwcyA9IGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZwcm9wLT5zdWJ0aXRsZV9zaW5rX2NhcHMpOworICAgIGlmICghZ3N0X2NhcHNfaXNfZXF1YWwgKHN1YnRpdGxlX2NhcHMsIEdTVF9DQVBTX05PTkUpKSB7CisgICAgICBwYXJhbXMtPnN1YnRpdGxlX3NpbmtfY2FwcyA9IHN1YnRpdGxlX2NhcHM7CisgICAgfSBlbHNlIHsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChzdWJ0aXRsZV9jYXBzKTsKKyAgICB9CisKKyAgICAvKiBjcmVhdGUgdGhlIHR5cGUgbm93ICovCisgICAgdHlwZSA9IGdfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKEdTVF9UWVBFX0VMRU1FTlQsIHByb3AtPnR5cGVfbmFtZSwgJnR5cGVpbmZvLAorICAgICAgICAwKTsKKyAgICBnX3R5cGVfc2V0X3FkYXRhICh0eXBlLCBHU1RfUVRfTVVYX1BBUkFNU19RREFUQSwgKGdwb2ludGVyKSBwYXJhbXMpOworICAgIGdfdHlwZV9hZGRfaW50ZXJmYWNlX3N0YXRpYyAodHlwZSwgR1NUX1RZUEVfVEFHX1NFVFRFUiwgJnRhZ19zZXR0ZXJfaW5mbyk7CisgICAgZ190eXBlX2FkZF9pbnRlcmZhY2Vfc3RhdGljICh0eXBlLCBHU1RfVFlQRV9UQUdfWE1QX1dSSVRFUiwKKyAgICAgICAgJnRhZ194bXBfd3JpdGVyX2luZm8pOworICAgIGdfdHlwZV9hZGRfaW50ZXJmYWNlX3N0YXRpYyAodHlwZSwgR1NUX1RZUEVfUFJFU0VULCAmcHJlc2V0X2luZm8pOworCisgICAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCBwcm9wLT5uYW1lLCBwcm9wLT5yYW5rLCB0eXBlKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGkrKzsKKyAgfQorCisgIEdTVF9MT0cgKCJGaW5pc2hlZCByZWdpc3RlcmluZyBtdXhlcnMiKTsKKworICAvKiBGSVhNRTogaWRlYWxseSBjbGFzc2lmaWNhdGlvbiB0YWcgc2hvdWxkIGJlIGFkZGVkIGFuZAorICAgICByZWdpc3RlcmVkIGluIGdzdHJlYW1lciBjb3JlIGdzdHRhZ2xpc3QKKyAgICovCisKKyAgR1NUX0xPRyAoIlJlZ2lzdGVyaW5nIHRhZ3MiKTsKKworICBnc3RfdGFnX3JlZ2lzdGVyIChHU1RfVEFHXzNHUF9DTEFTU0lGSUNBVElPTiwgR1NUX1RBR19GTEFHX01FVEEsCisgICAgICBHX1RZUEVfU1RSSU5HLCBHU1RfVEFHXzNHUF9DTEFTU0lGSUNBVElPTiwgImNvbnRlbnQgY2xhc3NpZmljYXRpb24iLAorICAgICAgZ3N0X3RhZ19tZXJnZV91c2VfZmlyc3QpOworCisgIEdTVF9MT0cgKCJGaW5pc2hlZCByZWdpc3RlcmluZyB0YWdzIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L2dzdHF0bXV4LmggYi9nc3QvaXNvbXA0L2dzdHF0bXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllZjIxZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvZ3N0cXRtdXguaApAQCAtMCwwICsxLDMyOCBAQAorLyogUXVpY2t0aW1lIG11eGVyIHBsdWdpbiBmb3IgR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBUaGlhZ28gU2FudG9zIDx0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5icj4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19HU1RfUVRfTVVYX0hfXworI2RlZmluZSBfX0dTVF9RVF9NVVhfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Y29sbGVjdHBhZHMuaD4KKworI2luY2x1ZGUgImZvdXJjYy5oIgorI2luY2x1ZGUgImF0b21zLmgiCisjaW5jbHVkZSAiYXRvbXNyZWNvdmVyeS5oIgorI2luY2x1ZGUgImdzdHF0bXV4bWFwLmgiCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9RVF9NVVggKGdzdF9xdF9tdXhfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1FUX01VWChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9RVF9NVVgsIEdzdFFUTXV4KSkKKyNkZWZpbmUgR1NUX1FUX01VWF9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUVRfTVVYLCBHc3RRVE11eCkpCisjZGVmaW5lIEdTVF9JU19RVF9NVVgob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUVRfTVVYKSkKKyNkZWZpbmUgR1NUX0lTX1FUX01VWF9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUVRfTVVYKSkKKyNkZWZpbmUgR1NUX1FUX01VWF9DQVNUKG9iaikgKChHc3RRVE11eCopKG9iaikpCisKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFFUTXV4IEdzdFFUTXV4OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFFUTXV4Q2xhc3MgR3N0UVRNdXhDbGFzczsKK3R5cGVkZWYgc3RydWN0IF9Hc3RRVFBhZCBHc3RRVFBhZDsKKworLyoKKyAqIEdzdFFUUGFkUHJlcGFyZUJ1ZmZlckZ1bmMKKyAqCisgKiBSZWNlaXZlcyBhIGJ1ZmZlciAodGFrZXMgcmVmKSBhbmQgcmV0dXJucyBhIG5ldyBidWZmZXIgdGhhdCBzaG91bGQKKyAqIHJlcGxhY2UgdGhlIHBhc3NlZCBvbmUuCisgKgorICogVXNlZnVsIGZvciB3aGVuIHRoZSBwYWQvZGF0YXR5cGUgbmVlZHMgc29tZSBtYW5pcHVsYXRpb24gYmVmb3JlCisgKiBiZWluZyBtdXhlZC4gKE9yaWdpbmFsbHkgYWRkZWQgZm9yIGltYWdlL3gtanBjIHN1cHBvcnQsIGZvciB3aGljaCBidWZmZXJzCisgKiBuZWVkIHRvIGJlIHdyYXBwZWQgaW50byBhIGlzb20gYm94KQorICovCit0eXBlZGVmIEdzdEJ1ZmZlciAqICgqR3N0UVRQYWRQcmVwYXJlQnVmZmVyRnVuYykgKEdzdFFUUGFkICogcGFkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZiwgR3N0UVRNdXggKiBxdG11eCk7CisKK3R5cGVkZWYgZ2Jvb2xlYW4gKCpHc3RRVFBhZFNldENhcHNGdW5jKSAoR3N0UVRQYWQgKiBwYWQsIEdzdENhcHMgKiBjYXBzKTsKK3R5cGVkZWYgR3N0QnVmZmVyICogKCpHc3RRVFBhZENyZWF0ZUVtcHR5QnVmZmVyRnVuYykgKEdzdFFUUGFkICogcGFkLCBnaW50NjQgZHVyYXRpb24pOworCisjZGVmaW5lIFFUTVVYX05PX09GX1RTICAgMTAKKworc3RydWN0IF9Hc3RRVFBhZAoreworICBHc3RDb2xsZWN0RGF0YSBjb2xsZWN0OyAgICAgICAvKiB3ZSBleHRlbmQgdGhlIENvbGxlY3REYXRhICovCisKKyAgLyogZm91cmNjIGlkIG9mIHN0cmVhbSAqLworICBndWludDMyIGZvdXJjYzsKKyAgLyogd2hldGhlciB1c2luZyBmb3JtYXQgdGhhdCBoYXZlIG91dCBvZiBvcmRlciBidWZmZXJzICovCisgIGdib29sZWFuIGlzX291dF9vZl9vcmRlcjsKKyAgLyogaWYgbm90IDAsIHRyYWNrIHdpdGggY29uc3RhbnQgc2l6ZWQgc2FtcGxlcywgZS5nLiByYXcgYXVkaW8gKi8KKyAgZ3VpbnQgc2FtcGxlX3NpemU7CisgIC8qIG1ha2Ugc3luYyB0YWJsZSBlbnRyeSAqLworICBnYm9vbGVhbiBzeW5jOworICAvKiBpZiBpdCBpcyBhIHNwYXJzZSBzdHJlYW0KKyAgICogKG1lYW5pbmcgd2UgY2FuJ3QgdXNlIFBUUyBkaWZmZXJlbmNlcyB0byBjb21wdXRlIGR1cmF0aW9uKSAqLworICBnYm9vbGVhbiBzcGFyc2U7CisgIC8qIGJpdHJhdGVzICovCisgIGd1aW50MzIgYXZnX2JpdHJhdGUsIG1heF9iaXRyYXRlOworICAvKiBleHBlY3RlZCBzYW1wbGUgZHVyYXRpb24gKi8KKyAgZ3VpbnQgZXhwZWN0ZWRfc2FtcGxlX2R1cmF0aW9uX247CisgIGd1aW50IGV4cGVjdGVkX3NhbXBsZV9kdXJhdGlvbl9kOworCisgIC8qIGZvciBhdmcgYml0cmF0ZSBjYWxjdWxhdGlvbiAqLworICBndWludDY0IHRvdGFsX2J5dGVzOworICBndWludDY0IHRvdGFsX2R1cmF0aW9uOworCisgIEdzdEJ1ZmZlciAqbGFzdF9idWY7CisgIC8qIGR0cyBvZiBsYXN0X2J1ZiAqLworICBHc3RDbG9ja1RpbWUgbGFzdF9kdHM7CisgIGd1aW50NjQgc2FtcGxlX29mZnNldDsKKworICAvKiBUaGlzIGlzIGNvbXBlbnNhdGUgZm9yIENUVFMgKi8KKyAgR3N0Q2xvY2tUaW1lIGR0c19hZGp1c3RtZW50OworCisgIC8qIHN0b3JlIHRoZSBmaXJzdCB0aW1lc3RhbXAgZm9yIGNvbXBhcmluZyB3aXRoIG90aGVyIHN0cmVhbXMgYW5kCisgICAqIGtub3cgaWYgdGhlcmUgYXJlIGxhdGUgc3RyZWFtcyAqLworICAvKiBzdWJqZWN0ZWQgdG8gZHRzIGFkanVzdG1lbnQgKi8KKyAgR3N0Q2xvY2tUaW1lIGZpcnN0X3RzOworICBHc3RDbG9ja1RpbWUgZmlyc3RfZHRzOworCisgIC8qIGFsbCB0aGUgYXRvbSBhbmQgY2h1bmsgYm9vay1rZWVwaW5nIGlzIGRlbGVnYXRlZCBoZXJlCisgICAqIHVub3duZWQvdW5jb3VudGVkIHJlZmVyZW5jZSwgcGFyZW50IE1PT1Ygb3ducyAqLworICBBdG9tVFJBSyAqdHJhazsKKyAgQXRvbVRSQUsgKnRjX3RyYWs7CisgIFNhbXBsZVRhYmxlRW50cnkgKnRyYWtfc3RlOworICAvKiBmcmFnbWVudGVkIHN1cHBvcnQgKi8KKyAgLyogbWV0YSBkYXRhIGJvb2sta2VlcGluZyBkZWxlZ2F0ZWQgaGVyZSAqLworICBBdG9tVFJBRiAqdHJhZjsKKyAgLyogZnJhZ21lbnQgYnVmZmVycyAqLworICBBVE9NX0FSUkFZIChHc3RCdWZmZXIgKikgZnJhZ21lbnRfYnVmZmVyczsKKyAgLyogcnVubmluZyBmcmFnbWVudCBkdXJhdGlvbiAqLworICBnaW50NjQgZnJhZ21lbnRfZHVyYXRpb247CisgIC8qIG9wdGlvbmFsIGZyYWdtZW50IGluZGV4IGJvb2sta2VlcGluZyAqLworICBBdG9tVEZSQSAqdGZyYTsKKworICAvKiBTZXQgd2hlbiB0YWdzIGFyZSByZWNlaXZlZCwgY2xlYXJlZCB3aGVuIHdyaXR0ZW4gdG8gbW9vdiAqLworICBnYm9vbGVhbiB0YWdzX2NoYW5nZWQ7CisKKyAgR3N0VGFnTGlzdCAqdGFnczsKKworICAvKiBpZiBub3RoaW5nIGlzIHNldCwgaXQgd29uJ3QgYmUgY2FsbGVkICovCisgIEdzdFFUUGFkUHJlcGFyZUJ1ZmZlckZ1bmMgcHJlcGFyZV9idWZfZnVuYzsKKyAgR3N0UVRQYWRTZXRDYXBzRnVuYyBzZXRfY2FwczsKKyAgR3N0UVRQYWRDcmVhdGVFbXB0eUJ1ZmZlckZ1bmMgY3JlYXRlX2VtcHR5X2J1ZmZlcjsKKworICAvKiBTTVBURSB0aW1lY29kZSAqLworICBHc3RWaWRlb1RpbWVDb2RlICpmaXJzdF90YzsKKyAgR3N0Q2xvY2tUaW1lIGZpcnN0X3B0czsKKyAgZ3VpbnQ2NCB0Y19wb3M7CisKKyAgLyogZm9yIGtlZXBpbmcgdHJhY2sgaW4gcHJlLWZpbGwgbW9kZSAqLworICBHQXJyYXkgKnNhbXBsZXM7CisgIC8qIGN1cnJlbnQgc2FtcGxlICovCisgIEdzdEFkYXB0ZXIgKnJhd19hdWRpb19hZGFwdGVyOworICBndWludDY0IHJhd19hdWRpb19hZGFwdGVyX29mZnNldDsKKyAgR3N0Q2xvY2tUaW1lIHJhd19hdWRpb19hZGFwdGVyX3B0czsKK307CisKK3R5cGVkZWYgZW51bSBfR3N0UVRNdXhTdGF0ZQoreworICBHU1RfUVRfTVVYX1NUQVRFX05PTkUsCisgIEdTVF9RVF9NVVhfU1RBVEVfU1RBUlRFRCwKKyAgR1NUX1FUX01VWF9TVEFURV9EQVRBLAorICBHU1RfUVRfTVVYX1NUQVRFX0VPUworfSBHc3RRVE11eFN0YXRlOworCit0eXBlZGVmIGVudW0gX0dzdFF0TXV4TW9kZSB7CisgICAgR1NUX1FUX01VWF9NT0RFX01PT1ZfQVRfRU5ELAorICAgIEdTVF9RVF9NVVhfTU9ERV9GUkFHTUVOVEVELAorICAgIEdTVF9RVF9NVVhfTU9ERV9GUkFHTUVOVEVEX1NUUkVBTUFCTEUsCisgICAgR1NUX1FUX01VWF9NT0RFX0ZBU1RfU1RBUlQsCisgICAgR1NUX1FUX01VWF9NT0RFX1JPQlVTVF9SRUNPUkRJTkcsCisgICAgR1NUX1FUX01VWF9NT0RFX1JPQlVTVF9SRUNPUkRJTkdfUFJFRklMTCwKK30gR3N0UXRNdXhNb2RlOworCitzdHJ1Y3QgX0dzdFFUTXV4Cit7CisgIEdzdEVsZW1lbnQgZWxlbWVudDsKKworICBHc3RQYWQgKnNyY3BhZDsKKyAgR3N0Q29sbGVjdFBhZHMgKmNvbGxlY3Q7CisgIEdTTGlzdCAqc2lua3BhZHM7CisKKyAgLyogc3RhdGUgKi8KKyAgR3N0UVRNdXhTdGF0ZSBzdGF0ZTsKKworICAvKiBNdXggbW9kZSwgaW5mZXJyZWQgZnJvbSBwcm9wZXJ0eQorICAgKiBzZXQgaW4gZ3N0X3F0X211eF9zdGFydF9maWxlKCkgKi8KKyAgR3N0UXRNdXhNb2RlIG11eF9tb2RlOworCisgIC8qIHNpemUgb2YgaGVhZGVyIChwcmVmaXgsIGF0b21zIChmdHlwLCBwb3NzaWJseSBtb292LCBtZGF0IGhlYWRlcikpICovCisgIGd1aW50NjQgaGVhZGVyX3NpemU7CisgIC8qIGFjY3VtdWxhdGVkIHNpemUgb2YgcmF3IG1lZGlhIGRhdGEgKG5vdCBpbmNsdWRpbmcgbWRhdCBoZWFkZXIpICovCisgIGd1aW50NjQgbWRhdF9zaXplOworICAvKiBwb3NpdGlvbiBvZiB0aGUgbW9vdiAoZm9yIGZyYWdtZW50ZWQgbW9kZSkgb3IgcmVzZXJ2ZWQgbW9vdiBhdG9tCisgICAqIGFyZWEgKGZvciByb2J1c3QtbXV4aW5nIG1vZGUpICovCisgIGd1aW50NjQgbW9vdl9wb3M7CisgIC8qIHBvc2l0aW9uIG9mIG1kYXQgYXRvbSBoZWFkZXIgKGZvciBsYXRlciB1cGRhdGluZyBvZiBzaXplKSBpbgorICAgKiBtb292LWF0LWVuZCwgZnJhZ21lbnRlZCBhbmQgcm9idXN0LW11eGluZyBtb2RlcyAqLworICBndWludDY0IG1kYXRfcG9zOworCisgIC8qIGtlZXAgdHJhY2sgb2YgdGhlIGxhcmdlc3QgY2h1bmsgdG8gZmluZS10dW5lIGJyYW5kcyAqLworICBHc3RDbG9ja1RpbWUgbG9uZ2VzdF9jaHVuazsKKworICAvKiBFYXJsaWVzdCB0aW1lc3RhbXAgYWNyb3NzIGFsbCBwYWRzL3RyYWtzCisgICAqICh1bmFkanVzdGVkIGluY29taW5nIFBUUykgKi8KKyAgR3N0Q2xvY2tUaW1lIGZpcnN0X3RzOworICAvKiBMYXN0IERUUyBhY3Jvc3MgYWxsIHBhZHMgKD0gZHVyYXRpb24pICovCisgIEdzdENsb2NrVGltZSBsYXN0X2R0czsKKworICAvKiBMYXN0IHBhZCB3ZSB1c2VkIGZvciB3cml0aW5nIHRoZSBjdXJyZW50IGNodW5rICovCisgIEdzdFFUUGFkICpjdXJyZW50X3BhZDsKKyAgZ3VpbnQ2NCBjdXJyZW50X2NodW5rX3NpemU7CisgIEdzdENsb2NrVGltZSBjdXJyZW50X2NodW5rX2R1cmF0aW9uOworICBndWludDY0IGN1cnJlbnRfY2h1bmtfb2Zmc2V0OworCisgIC8qIGF0b20gaGVscGVyIG9iamVjdHMgKi8KKyAgQXRvbXNDb250ZXh0ICpjb250ZXh0OworICBBdG9tRlRZUCAqZnR5cDsKKyAgQXRvbU1PT1YgKm1vb3Y7CisgIEdTTGlzdCAqZXh0cmFfYXRvbXM7IC8qIGxpc3Qgb2YgZXh0cmEgdG9wLWxldmVsIGF0b21zIChlLmcuIFVVSUQgZm9yIHhtcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICogU3RvcmVkIGFzIEF0b21JbmZvIHN0cnVjdHMgKi8KKworICAvKiBTZXQgd2hlbiB0YWdzIGFyZSByZWNlaXZlZCwgY2xlYXJlZCB3aGVuIHdyaXR0ZW4gdG8gbW9vdiAqLworICBnYm9vbGVhbiB0YWdzX2NoYW5nZWQ7CisKKyAgLyogZnJhZ21lbnRlZCBmaWxlIGluZGV4ICovCisgIEF0b21NRlJBICptZnJhOworCisgIC8qIGZhc3Qgc3RhcnQgKi8KKyAgRklMRSAqZmFzdF9zdGFydF9maWxlOworCisgIC8qIG1vb3YgcmVjb3ZlcnkgKi8KKyAgRklMRSAqbW9vdl9yZWNvdl9maWxlOworCisgIC8qIGZyYWdtZW50IHNlcXVlbmNlICovCisgIGd1aW50MzIgZnJhZ21lbnRfc2VxdWVuY2U7CisKKyAgLyogcHJvcGVydGllcyAqLworICBndWludDMyIHRpbWVzY2FsZTsKKyAgZ3VpbnQzMiB0cmFrX3RpbWVzY2FsZTsKKyAgQXRvbXNUcmVlRmxhdm9yIGZsYXZvcjsKKyAgZ2Jvb2xlYW4gZmFzdF9zdGFydDsKKyAgZ2Jvb2xlYW4gZ3Vlc3NfcHRzOworI2lmbmRlZiBHU1RfUkVNT1ZFX0RFUFJFQ0FURUQKKyAgZ2ludCBkdHNfbWV0aG9kOworI2VuZGlmCisgIGdjaGFyICpmYXN0X3N0YXJ0X2ZpbGVfcGF0aDsKKyAgZ2NoYXIgKm1vb3ZfcmVjb3ZfZmlsZV9wYXRoOworICBndWludDMyIGZyYWdtZW50X2R1cmF0aW9uOworICAvKiBXaGV0aGVyIG9yIG5vdCB0byB3b3JrIGluICdzdHJlYW1hYmxlJyBtb2RlIGFuZCBub3QKKyAgICogc2VlayB0byByZXdyaXRlIGhlYWRlcnMgLSBvbmx5IHZhbGlkIGZvciBmcmFnbWVudGVkCisgICAqIG1vZGUuICovCisgIGdib29sZWFuIHN0cmVhbWFibGU7CisKKyAgLyogUmVxdWVzdGVkIHRhcmdldCBtYXhpbXVtIGR1cmF0aW9uICovCisgIEdzdENsb2NrVGltZSByZXNlcnZlZF9tYXhfZHVyYXRpb247CisgIC8qIEVzdGltYXRlIG9mIHJlbWFpbmluZyByZXNlcnZlZCBoZWFkZXIgc3BhY2UgKGluIG5zIG9mIHJlY29yZGluZykgKi8KKyAgR3N0Q2xvY2tUaW1lIHJlc2VydmVkX2R1cmF0aW9uX3JlbWFpbmluZzsKKyAgLyogTXVsdGlwbGllciBmb3IgY29udmVyc2lvbiBmcm9tIHJlc2VydmVkX21heF9kdXJhdGlvbiB0byBieXRlcyAqLworICBndWludCByZXNlcnZlZF9ieXRlc19wZXJfc2VjX3Blcl90cmFrOworCisgIGd1aW50NjQgaW50ZXJsZWF2ZV9ieXRlczsKKyAgR3N0Q2xvY2tUaW1lIGludGVybGVhdmVfdGltZTsKKyAgZ2Jvb2xlYW4gaW50ZXJsZWF2ZV9ieXRlc19zZXQsIGludGVybGVhdmVfdGltZV9zZXQ7CisKKyAgR3N0Q2xvY2tUaW1lIG1heF9yYXdfYXVkaW9fZHJpZnQ7CisKKyAgLyogUmVzZXJ2ZWQgbWluaW11bSBNT09WIHNpemUgaW4gYnl0ZXMKKyAgICogVGhpcyBpcyBjb252ZXJ0ZWQgZnJvbSByZXNlcnZlZF9tYXhfZHVyYXRpb24KKyAgICogdXNpbmcgdGhlIGJ5dGVzL3RyYWsvc2VjIGVzdGltYXRlICovCisgIGd1aW50MzIgcmVzZXJ2ZWRfbW9vdl9zaXplOworICAvKiBCYXNpYyBzaXplIG9mIHRoZSBtb292IChzdGF0aWMgaGVhZGVycyArIHRhZ3MpICovCisgIGd1aW50MzIgYmFzZV9tb292X3NpemU7CisgIC8qIFNpemUgb2YgdGhlIG1vc3QgcmVjZW50bHkgZ2VuZXJhdGVkIG1vb3YgaGVhZGVyICovCisgIGd1aW50MzIgbGFzdF9tb292X3NpemU7CisgIC8qIFRydWUgaWYgdGhlIGZpcnN0IG1vb3YgaW4gdGhlIHBpbmctcG9uZyBidWZmZXJzCisgICAqIGlzIHRoZSBhY3RpdmUgb25lLiBTZWUgZ3N0X3F0X211eF9yb2J1c3RfcmVjb3JkaW5nX3Jld3JpdGVfbW9vdigpICovCisgIGdib29sZWFuIHJlc2VydmVkX21vb3ZfZmlyc3RfYWN0aXZlOworCisgIC8qIFRyYWNraW5nIG9mIHBlcmlvZGljIE1PT1YgdXBkYXRlcyAqLworICBHc3RDbG9ja1RpbWUgbGFzdF9tb292X3VwZGF0ZTsKKyAgR3N0Q2xvY2tUaW1lIHJlc2VydmVkX21vb3ZfdXBkYXRlX3BlcmlvZDsKKyAgR3N0Q2xvY2tUaW1lIG11eGVkX3NpbmNlX2xhc3RfdXBkYXRlOworCisgIGdib29sZWFuIHJlc2VydmVkX3ByZWZpbGw7CisKKyAgLyogZm9yIHJlcXVlc3QgcGFkIG5hbWluZyAqLworICBndWludCB2aWRlb19wYWRzLCBhdWRpb19wYWRzLCBzdWJ0aXRsZV9wYWRzOworfTsKKworc3RydWN0IF9Hc3RRVE11eENsYXNzCit7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7CisKKyAgR3N0UVRNdXhGb3JtYXQgZm9ybWF0OworfTsKKworLyogdHlwZSByZWdpc3RlciBoZWxwZXIgc3RydWN0ICovCit0eXBlZGVmIHN0cnVjdCBfR3N0UVRNdXhDbGFzc1BhcmFtcworeworICBHc3RRVE11eEZvcm1hdFByb3AgKnByb3A7CisgIEdzdENhcHMgKnNyY19jYXBzOworICBHc3RDYXBzICp2aWRlb19zaW5rX2NhcHM7CisgIEdzdENhcHMgKmF1ZGlvX3NpbmtfY2FwczsKKyAgR3N0Q2FwcyAqc3VidGl0bGVfc2lua19jYXBzOworfSBHc3RRVE11eENsYXNzUGFyYW1zOworCisjZGVmaW5lIEdTVF9RVF9NVVhfUEFSQU1TX1FEQVRBIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nKCJxdC1tdXgtcGFyYW1zIikKKworR1R5cGUgZ3N0X3F0X211eF9nZXRfdHlwZSAodm9pZCk7CitnYm9vbGVhbiBnc3RfcXRfbXV4X3JlZ2lzdGVyIChHc3RQbHVnaW4gKiBwbHVnaW4pOworCisvKiBGSVhNRTogaWRlYWxseSBjbGFzc2lmaWNhdGlvbiB0YWcgc2hvdWxkIGJlIGFkZGVkIGFuZAorICogcmVnaXN0ZXJlZCBpbiBnc3RyZWFtZXIgY29yZSBnc3R0YWdsaXN0CisgKgorICogdGhpcyB0YWcgaXMgYSBzdHJpbmcgaW4gdGhlIGZvcm1hdDogZW50aXR5Zm91cmNjOi8vdGFibGVfbnVtL2NvbnRlbnQKKyAqIEZJWE1FIFNob3VsZG4ndCB3ZSBhZGQgYSBmaWVsZCBmb3IgJ2xhbmd1YWdlJz8KKyAqLworI2RlZmluZSBHU1RfVEFHXzNHUF9DTEFTU0lGSUNBVElPTiAiY2xhc3NpZmljYXRpb24iCisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9RVF9NVVhfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmMgYi9nc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUzNGUxMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvZ3N0cXRtdXhtYXAuYwpAQCAtMCwwICsxLDQxMiBAQAorLyogUXVpY2t0aW1lIG11eGVyIHBsdWdpbiBmb3IgR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhpYWdvIFNvdXNhIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFyayBOYXV3ZWxhZXJ0cyA8bW5hdXdAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKgorICogVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIFNvdXJjZSBDb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlLgorICogU2VlIGZ1cnRoZXIgZXhwbGFuYXRpb24gYXR0YWNoZWQgaW4gTGljZW5zZSBTdGF0ZW1lbnQgKGRpc3RyaWJ1dGVkIGluIHRoZSBmaWxlCisgKiBMSUNFTlNFKS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImdzdHF0bXV4bWFwLmgiCisjaW5jbHVkZSAiZm91cmNjLmgiCisKKy8qIHN0YXRpYyBpbmZvIHJlbGF0ZWQgdG8gdmFyaW91cyBmb3JtYXQgKi8KKworI2RlZmluZSBDT01NT05fVklERU9fQ0FQUyBcCisgICJ3aWR0aCA9IChpbnQpIFsgMTYsIE1BWCBdLCAiIFwKKyAgImhlaWdodCA9IChpbnQpIFsgMTYsIE1BWCBdIgorCisjZGVmaW5lIENPTU1PTl9WSURFT19DQVBTX05PX0ZSQU1FUkFURSBcCisgICJ3aWR0aCA9IChpbnQpIFsgMTYsIE1BWCBdLCAiIFwKKyAgImhlaWdodCA9IChpbnQpIFsgMTYsIE1BWCBdICIKKworI2RlZmluZSBIMjYzX0NBUFMgXAorICAidmlkZW8veC1oMjYzLCAiIFwKKyAgQ09NTU9OX1ZJREVPX0NBUFMKKworI2RlZmluZSBIMjY0X0NBUFMgXAorICAidmlkZW8veC1oMjY0LCAiIFwKKyAgInN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSBhdmMsICIgXAorICAiYWxpZ25tZW50ID0gKHN0cmluZykgYXUsICIgXAorICBDT01NT05fVklERU9fQ0FQUworCisjZGVmaW5lIEgyNjVfQ0FQUyBcCisgICJ2aWRlby94LWgyNjUsICIgXAorICAic3RyZWFtLWZvcm1hdCA9IChzdHJpbmcpIHsgaHZjMSwgaGV2MSB9LCAiIFwKKyAgImFsaWdubWVudCA9IChzdHJpbmcpIGF1LCAiIFwKKyAgQ09NTU9OX1ZJREVPX0NBUFMKKworI2RlZmluZSBNUEVHNFZfQ0FQUyBcCisgICJ2aWRlby9tcGVnLCAiIFwKKyAgIm1wZWd2ZXJzaW9uID0gKGludCkgNCwgIlwKKyAgInN5c3RlbXN0cmVhbSA9IChib29sZWFuKSBmYWxzZSwgIiBcCisgIENPTU1PTl9WSURFT19DQVBTICI7ICIgXAorICAidmlkZW8veC1kaXZ4LCAiIFwKKyAgImRpdnh2ZXJzaW9uID0gKGludCkgNSwgIlwKKyAgQ09NTU9OX1ZJREVPX0NBUFMKKworI2RlZmluZSBQUk9SRVNfQ0FQUyBcCisgICJ2aWRlby94LXByb3JlcywgIiBcCisgICJ2YXJpYW50ID0gKHN0cmluZykge3N0YW5kYXJkLCBsdCwgaHEsIHByb3h5LCA0NDQ0LCA0NDQ0eHF9LCAiIFwKKyAgQ09NTU9OX1ZJREVPX0NBUFMKKworI2RlZmluZSBDSU5FRk9STV9DQVBTIFwKKyAgInZpZGVvL3gtY2luZWZvcm0sICIgXAorICBDT01NT05fVklERU9fQ0FQUworCisjZGVmaW5lIFNWUV9DQVBTIFwKKyAgInZpZGVvL3gtc3ZxLCAiIFwKKyAgInN2cXZlcnNpb24gPSAoaW50KSAzLCAiIFwKKyAgQ09NTU9OX1ZJREVPX0NBUFMKKworI2RlZmluZSBDT01NT05fQVVESU9fQ0FQUyhjLCByKSBcCisgICJjaGFubmVscyA9IChpbnQpIFsgMSwgIiBHX1NUUklOR0lGWSAoYykgIiBdLCAiIFwKKyAgInJhdGUgPSAoaW50KSBbIDEsICIgR19TVFJJTkdJRlkgKHIpICIgXSIKKworI2RlZmluZSBQQ01fQ0FQUyBcCisgICJhdWRpby94LXJhdywgIiBcCisgICJmb3JtYXQgPSAoc3RyaW5nKSB7IFMxNkxFLCBTMTZCRSwgUzgsIFU4IH0sICIgXAorICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICBDT01NT05fQVVESU9fQ0FQUyAoMiwgTUFYKQorCisjZGVmaW5lIFBDTV9DQVBTX0ZVTEwgXAorICAiYXVkaW8veC1yYXcsICIgXAorICAiZm9ybWF0ID0gKHN0cmluZykgeyBTMzJMRSwgUzMyQkUsIFMyNExFLCBTMjRCRSwgUzE2TEUsIFMxNkJFLCBTOCwgVTggfSwgIiBcCisgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiBcCisgIENPTU1PTl9BVURJT19DQVBTICgyLCBNQVgpCisKKyNkZWZpbmUgUENNX0NBUFNfVU5QT1NJVElPTkVEIFwKKyAgImF1ZGlvL3gtcmF3LCAiIFwKKyAgImZvcm1hdCA9IChzdHJpbmcpIHsgUzMyTEUsIFMzMkJFLCBTMjRMRSwgUzI0QkUsIFMxNkxFLCBTMTZCRSwgUzgsIFU4IH0sICIgXAorICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICAiY2hhbm5lbC1tYXNrID0gKGJpdG1hc2spIDAsICIgXAorICBDT01NT05fQVVESU9fQ0FQUyAoMTYsIE1BWCkKKworI2RlZmluZSBNUDNfQ0FQUyBcCisgICJhdWRpby9tcGVnLCAiIFwKKyAgIm1wZWd2ZXJzaW9uID0gKGludCkgMSwgIiBcCisgICJsYXllciA9IChpbnQpIDMsICIgXAorICBDT01NT05fQVVESU9fQ0FQUyAoMiwgTUFYKQorCisjZGVmaW5lIE1QMTIzX0NBUFMgXAorICAiYXVkaW8vbXBlZywgIiBcCisgICJtcGVndmVyc2lvbiA9IChpbnQpIDEsICIgXAorICAibGF5ZXIgPSAoaW50KSBbMSwgM10sICIgXAorICBDT01NT05fQVVESU9fQ0FQUyAoMiwgTUFYKQorCisjZGVmaW5lIEFBQ19DQVBTIFwKKyAgImF1ZGlvL21wZWcsICIgXAorICAibXBlZ3ZlcnNpb24gPSAoaW50KSA0LCAiIFwKKyAgInN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSByYXcsICIgXAorICBDT01NT05fQVVESU9fQ0FQUyAoOCwgTUFYKQorCisjZGVmaW5lIEFDM19DQVBTIFwKKyAgImF1ZGlvL3gtYWMzLCAiIFwKKyAgQ09NTU9OX0FVRElPX0NBUFMgKDYsIE1BWCkKKworI2RlZmluZSBBTVJfQ0FQUyBcCisgICJhdWRpby9BTVIsICIgXAorICAicmF0ZSA9IChpbnQpIDgwMDAsICIgXAorICAiY2hhbm5lbHMgPSBbIDEsIDIgXTsgIiBcCisgICJhdWRpby9BTVItV0IsICIgXAorICAicmF0ZSA9IChpbnQpIDE2MDAwLCAiIFwKKyAgImNoYW5uZWxzID0gWyAxLCAyIF0gIgorCisjZGVmaW5lIEFEUENNX0NBUFMgIFwKKyAgImF1ZGlvL3gtYWRwY20sICIgXAorICAibGF5b3V0ID0gKHN0cmluZylkdmksICIgXAorICAiYmxvY2tfYWxpZ24gPSAoaW50KVs2NCwgODA5Nl0sICIgXAorICBDT01NT05fQVVESU9fQ0FQUygyLCBNQVgpCisKKyNkZWZpbmUgQUxBQ19DQVBTIFwKKyAgImF1ZGlvL3gtYWxhYywgIiBcCisgIENPTU1PTl9BVURJT19DQVBTKDIsIE1BWCkKKworI2RlZmluZSBPUFVTX0NBUFMgXAorICAiYXVkaW8veC1vcHVzLCAiIFwKKyAgImNoYW5uZWwtbWFwcGluZy1mYW1pbHkgPSAoaW50KSBbMCwgMjU1XSwgIiBcCisgIENPTU1PTl9BVURJT19DQVBTKDgsIE1BWCkKKworCisjZGVmaW5lIFRFWFRfVVRGOCBcCisgICJ0ZXh0L3gtcmF3LCAiIFwKKyAgImZvcm1hdD0oc3RyaW5nKXV0ZjgiCisKKy8qIEZJWE1FIDAuMTEgLSB0YWtlIGEgbG9vayBhdCBidWdzICM1ODAwMDUgYW5kICMzNDAzNzUgKi8KK0dzdFFUTXV4Rm9ybWF0UHJvcCBnc3RfcXRfbXV4X2Zvcm1hdF9saXN0W10gPSB7CisgIC8qIG9yaWdpbmFsIFF1aWNrVGltZSBmb3JtYXQ7IHNlZSBBcHBsZSBzaXRlIChlLmcuIHF0ZmYucGRmKSAqLworICB7CisgICAgICAgIEdTVF9RVF9NVVhfRk9STUFUX1FULAorICAgICAgICBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAicXRtdXgiLAorICAgICAgICAiUXVpY2tUaW1lIiwKKyAgICAgICAgIkdzdFFUTXV4IiwKKyAgICAgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8vcXVpY2t0aW1lLCB2YXJpYW50ID0gKHN0cmluZykgYXBwbGU7ICIKKyAgICAgICAgICAgICJ2aWRlby9xdWlja3RpbWUiKSwKKyAgICAgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1yYXcsICIKKyAgICAgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSB7IFJHQiwgVVlWWSwgdjIxMCB9LCAiCisgICAgICAgICAgICBDT01NT05fVklERU9fQ0FQUyAiOyAiCisgICAgICAgICAgICBNUEVHNFZfQ0FQUyAiOyAiCisgICAgICAgICAgICBQUk9SRVNfQ0FQUyAiOyAiCisgICAgICAgICAgICBDSU5FRk9STV9DQVBTICI7ICIKKyAgICAgICAgICAgIEgyNjNfQ0FQUyAiOyAiCisgICAgICAgICAgICBIMjY0X0NBUFMgIjsgIgorICAgICAgICAgICAgSDI2NV9DQVBTICI7ICIKKyAgICAgICAgICAgIFNWUV9DQVBTICI7ICIKKyAgICAgICAgICAgICJ2aWRlby94LWR2LCAiCisgICAgICAgICAgICAic3lzdGVtc3RyZWFtID0gKGJvb2xlYW4pIGZhbHNlLCAiCisgICAgICAgICAgICBDT01NT05fVklERU9fQ0FQUyAiOyAiCisgICAgICAgICAgICAiaW1hZ2UvanBlZywgIgorICAgICAgICAgICAgQ09NTU9OX1ZJREVPX0NBUFNfTk9fRlJBTUVSQVRFICI7ICIKKyAgICAgICAgICAgICJpbWFnZS9wbmcsICIKKyAgICAgICAgICAgIENPTU1PTl9WSURFT19DQVBTX05PX0ZSQU1FUkFURSAiOyAiCisgICAgICAgICAgICAidmlkZW8veC12cDgsICIKKyAgICAgICAgICAgIENPTU1PTl9WSURFT19DQVBTICI7ICIKKyAgICAgICAgICAgICJ2aWRlby94LXZwOSwgIgorICAgICAgICAgICAgQ09NTU9OX1ZJREVPX0NBUFMgIjsgIgorICAgICAgICAgICAgInZpZGVvL3gtZGlyYWMsICIKKyAgICAgICAgICAgIENPTU1PTl9WSURFT19DQVBTICI7ICIgInZpZGVvL3gtcXQtcGFydCwgIiBDT01NT05fVklERU9fQ0FQUyksCisgICAgICAgIEdTVF9TVEFUSUNfQ0FQUyAoUENNX0NBUFNfRlVMTCAiOyAiCisgICAgICAgICAgICBQQ01fQ0FQU19VTlBPU0lUSU9ORUQgIiA7ICIKKyAgICAgICAgICAgIE1QMTIzX0NBUFMgIiA7ICIKKyAgICAgICAgICAgIEFBQ19DQVBTICIgOyAiCisgICAgICAgICAgICBBQzNfQ0FQUyAiIDsgIgorICAgICAgICAgICAgQURQQ01fQ0FQUyAiIDsgIgorICAgICAgICAgICAgImF1ZGlvL3gtYWxhdywgIiBDT01NT05fQVVESU9fQ0FQUyAoMiwgTUFYKSAiOyAiCisgICAgICAgICAgICAiYXVkaW8veC1tdWxhdywgIiBDT01NT05fQVVESU9fQ0FQUyAoMiwgTUFYKSAiOyAiCisgICAgICAgICAgICBBTVJfQ0FQUyAiIDsgIiBBTEFDX0NBUFMgIiA7ICIgT1BVU19DQVBTKSwKKyAgICAgIEdTVF9TVEFUSUNfQ0FQUyAoVEVYVF9VVEY4KX0KKyAgLAorICAvKiBJU08gMTQ0OTYtMTQ6IG1wNDIgYXMgSVNPIGJhc2UgbWVkaWEgZXh0ZW5zaW9uCisgICAqIChzdXBlcnNlZGVzIG9yaWdpbmFsIElTTyAxNDQ5OTYtMSBtcDQxKSAqLworICB7CisgICAgICAgIEdTVF9RVF9NVVhfRk9STUFUX01QNCwKKyAgICAgICAgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgICAgIm1wNG11eCIsCisgICAgICAgICJNUDQiLAorICAgICAgICAiR3N0TVA0TXV4IiwKKyAgICAgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8vcXVpY2t0aW1lLCB2YXJpYW50ID0gKHN0cmluZykgaXNvIiksCisgICAgICAgIEdTVF9TVEFUSUNfQ0FQUyAoTVBFRzRWX0NBUFMgIjsgIiBIMjY0X0NBUFMgIjsiIEgyNjVfQ0FQUyAiOyIKKyAgICAgICAgICAgICJ2aWRlby94LW1wNC1wYXJ0LCIgQ09NTU9OX1ZJREVPX0NBUFMpLAorICAgICAgICBHU1RfU1RBVElDX0NBUFMgKE1QMTIzX0NBUFMgIjsgIgorICAgICAgICAgICAgQUFDX0NBUFMgIiA7ICIgQUMzX0NBUFMgIiA7ICIgQUxBQ19DQVBTICIgOyAiIE9QVVNfQ0FQUyksCisgICAgICBHU1RfU1RBVElDX0NBUFMgKFRFWFRfVVRGOCl9CisgICwKKyAgLyogTWljcm9zb2Z0IFNtb290aCBTdHJlYW1pbmcgZm1wNC9pc21sICovCisgIC8qIFRPRE8gYWRkIFdNVi9XTUEgc3VwcG9ydCAqLworICB7CisgICAgICAgIEdTVF9RVF9NVVhfRk9STUFUX0lTTUwsCisgICAgICAgIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICJpc21sbXV4IiwKKyAgICAgICAgIklTTUwiLAorICAgICAgICAiR3N0SVNNTE11eCIsCisgICAgICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3F1aWNrdGltZSwgdmFyaWFudCA9IChzdHJpbmcpIGlzby1mcmFnbWVudGVkIiksCisgICAgICAgIEdTVF9TVEFUSUNfQ0FQUyAoTVBFRzRWX0NBUFMgIjsgIiBIMjY0X0NBUFMpLAorICAgICAgICBHU1RfU1RBVElDX0NBUFMgKE1QM19DQVBTICI7ICIgQUFDX0NBUFMpLAorICAgICAgR1NUX1NUQVRJQ19DQVBTX05PTkV9CisgICwKKyAgLyogM0dQUCBUZWNobmljYWwgU3BlY2lmaWNhdGlvbiAyNi4yNDQgVjcuMy4wCisgICAqIChleHRlbmRlZCBpbiAzR1BQMiBGaWxlIEZvcm1hdHMgZm9yIE11bHRpbWVkaWEgU2VydmljZXMpICovCisgIHsKKyAgICAgICAgR1NUX1FUX01VWF9GT1JNQVRfM0dQLAorICAgICAgICBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAiM2dwcG11eCIsCisgICAgICAgICIzR1BQIiwKKyAgICAgICAgIkdzdDNHUFBNdXgiLAorICAgICAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby9xdWlja3RpbWUsIHZhcmlhbnQgPSAoc3RyaW5nKSAzZ3BwIiksCisgICAgICAgIEdTVF9TVEFUSUNfQ0FQUyAoSDI2M19DQVBTICI7ICIgTVBFRzRWX0NBUFMgIjsgIiBIMjY0X0NBUFMpLAorICAgICAgICBHU1RfU1RBVElDX0NBUFMgKEFNUl9DQVBTICI7ICIgTVAzX0NBUFMgIjsgIiBBQUNfQ0FQUyAiOyAiIEFDM19DQVBTKSwKKyAgICAgIEdTVF9TVEFUSUNfQ0FQUyAoVEVYVF9VVEY4KX0KKyAgLAorICAvKiBJU08gMTU0NDQtMzogTW90aW9uLUpQRUctMjAwMCAoYWxzbyBJU08gYmFzZSBtZWRpYSBleHRlbnNpb24pICovCisgIHsKKyAgICAgICAgR1NUX1FUX01VWF9GT1JNQVRfTUoyLAorICAgICAgICBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAibWoybXV4IiwKKyAgICAgICAgIk1KMiIsCisgICAgICAgICJHc3RNSjJNdXgiLAorICAgICAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby9tajIiKSwKKyAgICAgICAgR1NUX1NUQVRJQ19DQVBTICgiaW1hZ2UveC1qMmMsICIgQ09NTU9OX1ZJREVPX0NBUFMgIjsgIgorICAgICAgICAgICAgImltYWdlL3gtanBjLCAiIENPTU1PTl9WSURFT19DQVBTKSwKKyAgICAgICAgR1NUX1NUQVRJQ19DQVBTIChQQ01fQ0FQUyksCisgICAgICBHU1RfU1RBVElDX0NBUFNfTk9ORX0KKyAgLAorICB7CisgICAgICAgIEdTVF9RVF9NVVhfRk9STUFUX05PTkUsCisgICAgICB9Cit9OworCisvKiBwcmV0dHkgc3RhdGljLCBidXQgbWF5IHR1cm4gb3V0IG5lZWRlZCBhIGZldyB0aW1lcyAqLworQXRvbXNUcmVlRmxhdm9yCitnc3RfcXRfbXV4X21hcF9mb3JtYXRfdG9fZmxhdm9yIChHc3RRVE11eEZvcm1hdCBmb3JtYXQpCit7CisgIGlmIChmb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfUVQpCisgICAgcmV0dXJuIEFUT01TX1RSRUVfRkxBVk9SX01PVjsKKyAgZWxzZSBpZiAoZm9ybWF0ID09IEdTVF9RVF9NVVhfRk9STUFUXzNHUCkKKyAgICByZXR1cm4gQVRPTVNfVFJFRV9GTEFWT1JfM0dQOworICBlbHNlIGlmIChmb3JtYXQgPT0gR1NUX1FUX01VWF9GT1JNQVRfSVNNTCkKKyAgICByZXR1cm4gQVRPTVNfVFJFRV9GTEFWT1JfSVNNTDsKKyAgZWxzZQorICAgIHJldHVybiBBVE9NU19UUkVFX0ZMQVZPUl9JU09NOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0X211eF9tYXBfY2hlY2tfdHJhY2tzIChBdG9tTU9PViAqIG1vb3YsIGdpbnQgKiBfdmlkZW8sIGdpbnQgKiBfYXVkaW8sCisgICAgZ2Jvb2xlYW4gKiBfaGFzX2gyNjQpCit7CisgIEdMaXN0ICppdDsKKyAgZ2ludCB2aWRlbyA9IDAsIGF1ZGlvID0gMDsKKyAgZ2Jvb2xlYW4gaGFzX2gyNjQgPSBGQUxTRTsKKworICBmb3IgKGl0ID0gbW9vdi0+dHJha3M7IGl0ICE9IE5VTEw7IGl0ID0gZ19saXN0X25leHQgKGl0KSkgeworICAgIEF0b21UUkFLICp0cmFjayA9IGl0LT5kYXRhOworCisgICAgaWYgKHRyYWNrLT5pc192aWRlbykgeworICAgICAgdmlkZW8rKzsKKyAgICAgIGlmICh0cmFjay0+aXNfaDI2NCkKKyAgICAgICAgaGFzX2gyNjQgPSBUUlVFOworICAgIH0gZWxzZQorICAgICAgYXVkaW8rKzsKKyAgfQorCisgIGlmIChfdmlkZW8pCisgICAgKl92aWRlbyA9IHZpZGVvOworICBpZiAoX2F1ZGlvKQorICAgICpfYXVkaW8gPSBhdWRpbzsKKyAgaWYgKF9oYXNfaDI2NCkKKyAgICAqX2hhc19oMjY0ID0gaGFzX2gyNjQ7Cit9CisKKy8qIHByZXR0eSBzdGF0aWMsIGJ1dCBwb3NzaWJseSBkeW5hbWljIGZvcm1hdCBpbmZvICovCisKKy8qIG5vdGVzOgorICogLSBhdmMxIGJyYW5kIGlzIG5vdCB1c2VkLCBzaW5jZSB0aGUgc3BlY2lmaWMgZXh0ZW5zaW9ucyBpbmRpY2F0ZWQgYnkgaXQKKyAqICAgYXJlIG5vdCB1c2VkIChlLmcuIHNhbXBsZSBncm91cGluZ3MsIGV0YykKKyAqIC0gVE9ETzogbWF5YmUgZXZlbiBtb3JlIDNHUFAgYnJhbmQgZmluZS10dW5pbmcgPz8KKyAqICAgKGJ1dCB0aGF0IG1pZ2h0IG5lZWQgZnR5cCByZXdyaXRpbmcgYXQgdGhlIGVuZCkgKi8KK3ZvaWQKK2dzdF9xdF9tdXhfbWFwX2Zvcm1hdF90b19oZWFkZXIgKEdzdFFUTXV4Rm9ybWF0IGZvcm1hdCwgR3N0QnVmZmVyICoqIF9wcmVmaXgsCisgICAgZ3VpbnQzMiAqIF9tYWpvciwgZ3VpbnQzMiAqIF92ZXJzaW9uLCBHTGlzdCAqKiBfY29tcGF0aWJsZSwgQXRvbU1PT1YgKiBtb292LAorICAgIEdzdENsb2NrVGltZSBsb25nZXN0X2NodW5rLCBnYm9vbGVhbiBmYXN0c3RhcnQpCit7CisgIHN0YXRpYyBjb25zdCBndWludDMyIHF0X2JyYW5kc1tdID0geyAwIH07CisgIHN0YXRpYyBjb25zdCBndWludDMyIG1wNF9icmFuZHNbXSA9CisgICAgICB7IEZPVVJDQ19tcDQxLCBGT1VSQ0NfaXNvbSwgRk9VUkNDX2lzbzIsIDAgfTsKKyAgc3RhdGljIGNvbnN0IGd1aW50MzIgaXNtbF9icmFuZHNbXSA9IHsgRk9VUkNDX2lzbzIsIDAgfTsKKyAgc3RhdGljIGNvbnN0IGd1aW50MzIgZ3BwX2JyYW5kc1tdID0geyBGT1VSQ0NfaXNvbSwgRk9VUkNDX2lzbzIsIDAgfTsKKyAgc3RhdGljIGNvbnN0IGd1aW50MzIgbWpwMl9icmFuZHNbXSA9IHsgRk9VUkNDX2lzb20sIEZPVVJDQ19pc28yLCAwIH07CisgIHN0YXRpYyBjb25zdCBndWludDggbWpwMl9wcmVmaXhbXSA9CisgICAgICB7IDAsIDAsIDAsIDEyLCAnaicsICdQJywgJyAnLCAnICcsIDB4MEQsIDB4MEEsIDB4ODcsIDB4MEEgfTsKKyAgY29uc3QgZ3VpbnQzMiAqY29tcCA9IE5VTEw7CisgIGd1aW50MzIgbWFqb3IgPSAwLCB2ZXJzaW9uID0gMDsKKyAgR3N0QnVmZmVyICpwcmVmaXggPSBOVUxMOworICBHTGlzdCAqcmVzdWx0ID0gTlVMTDsKKworICBnX3JldHVybl9pZl9mYWlsIChfcHJlZml4ICE9IE5VTEwpOworICBnX3JldHVybl9pZl9mYWlsIChfbWFqb3IgIT0gTlVMTCk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKF92ZXJzaW9uICE9IE5VTEwpOworICBnX3JldHVybl9pZl9mYWlsIChfY29tcGF0aWJsZSAhPSBOVUxMKTsKKworICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgR1NUX1FUX01VWF9GT1JNQVRfUVQ6CisgICAgICBtYWpvciA9IEZPVVJDQ19xdF9fOworICAgICAgY29tcCA9IHF0X2JyYW5kczsKKyAgICAgIHZlcnNpb24gPSAweDIwMDUwMzAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUVRfTVVYX0ZPUk1BVF9NUDQ6CisgICAgICBtYWpvciA9IEZPVVJDQ19tcDQyOworICAgICAgY29tcCA9IG1wNF9icmFuZHM7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9RVF9NVVhfRk9STUFUX0lTTUw6CisgICAgICBtYWpvciA9IEZPVVJDQ19pc21sOworICAgICAgY29tcCA9IGlzbWxfYnJhbmRzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUVRfTVVYX0ZPUk1BVF8zR1A6CisgICAgeworICAgICAgZ2ludCB2aWRlbywgYXVkaW87CisgICAgICBnYm9vbGVhbiBoYXNfaDI2NDsKKworICAgICAgZ3N0X3F0X211eF9tYXBfY2hlY2tfdHJhY2tzIChtb292LCAmdmlkZW8sICZhdWRpbywgJmhhc19oMjY0KTsKKyAgICAgIC8qIG9ubHkgdHJhY2sgcmVzdHJpY3Rpb24gcmVhbGx5IG1hdHRlcnMgZm9yIEJhc2ljIFByb2ZpbGUgKi8KKyAgICAgIGlmICh2aWRlbyA8PSAxICYmIGF1ZGlvIDw9IDEpIHsKKyAgICAgICAgLyogaXQgc2VlbXMgb25seSBuZXdlciBzcGVjIGtub3dzIGFib3V0IEgyNjQgKi8KKyAgICAgICAgbWFqb3IgPSBoYXNfaDI2NCA/IEZPVVJDQ18zZ3A2IDogRk9VUkNDXzNncDQ7CisgICAgICAgIHZlcnNpb24gPSBoYXNfaDI2NCA/IDB4MTAwIDogMHgyMDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBtYWpvciA9IEZPVVJDQ18zZ2c2OworICAgICAgICB2ZXJzaW9uID0gMHgxMDA7CisgICAgICB9CisgICAgICBjb21wID0gZ3BwX2JyYW5kczsKKworICAgICAgLyoKKyAgICAgICAqIFdlIGFzc3VtZSB0aGF0IHdlIGhhdmUgY2h1bmtzIGluIGR0cyBvcmRlcgorICAgICAgICovCisgICAgICBpZiAoZmFzdHN0YXJ0ICYmIGxvbmdlc3RfY2h1bmsgPD0gR1NUX1NFQ09ORCkgeworICAgICAgICAvKiBhZGQgcHJvZ3Jlc3NpdmUgZG93bmxvYWQgcHJvZmlsZSAqLworICAgICAgICByZXN1bHQgPSBnX2xpc3RfYXBwZW5kIChyZXN1bHQsIEdVSU5UX1RPX1BPSU5URVIgKEZPVVJDQ18zZ3I2KSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVRfTVVYX0ZPUk1BVF9NSjI6CisgICAgeworICAgICAgbWFqb3IgPSBGT1VSQ0NfbWpwMjsKKyAgICAgIGNvbXAgPSBtanAyX2JyYW5kczsKKyAgICAgIHZlcnNpb24gPSAwOworICAgICAgcHJlZml4ID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplb2YgKG1qcDJfcHJlZml4KSk7CisgICAgICBnc3RfYnVmZmVyX2ZpbGwgKHByZWZpeCwgMCwgbWpwMl9wcmVmaXgsIHNpemVvZiAobWpwMl9wcmVmaXgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIGNvbnZlcnQgbGlzdCB0byBsaXN0LCBobSAqLworICB3aGlsZSAoY29tcCAmJiAqY29tcCAhPSAwKSB7CisgICAgLyogb3JkZXIgbWF0dGVycyBvdmVyIGVmZmljaWVuY3kgKi8KKyAgICByZXN1bHQgPSBnX2xpc3RfYXBwZW5kIChyZXN1bHQsIEdVSU5UX1RPX1BPSU5URVIgKCpjb21wKSk7CisgICAgY29tcCsrOworICB9CisKKyAgKl9tYWpvciA9IG1ham9yOworICAqX3ZlcnNpb24gPSB2ZXJzaW9uOworICAqX3ByZWZpeCA9IHByZWZpeDsKKyAgKl9jb21wYXRpYmxlID0gcmVzdWx0OworCisgIC8qIFRPRE8gM0dQUCBtYXkgaW5jbHVkZSBtcDQyIGFzIGNvbXBhdGlibGUgaWYgYXBwbGljYWJsZSAqLworICAvKiBUT0RPIDNHUFAgbWFqb3IgYnJhbmQgM2dwNyBpZiBhdCBtb3N0IDEgdmlkZW8gYW5kIGF1ZGlvIHRyYWNrICovCit9CmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmggYi9nc3QvaXNvbXA0L2dzdHF0bXV4bWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3OGEzNgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvZ3N0cXRtdXhtYXAuaApAQCAtMCwwICsxLDg1IEBACisvKiBRdWlja3RpbWUgbXV4ZXIgcGx1Z2luIGZvciBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGlhZ28gU291c2EgU2FudG9zIDx0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5icj4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qCisgKiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgU291cmNlIENvZGUgaXMgbGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2UuCisgKiBTZWUgZnVydGhlciBleHBsYW5hdGlvbiBhdHRhY2hlZCBpbiBMaWNlbnNlIFN0YXRlbWVudCAoZGlzdHJpYnV0ZWQgaW4gdGhlIGZpbGUKKyAqIExJQ0VOU0UpLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1FUX01VWF9NQVBfSF9fCisjZGVmaW5lIF9fR1NUX1FUX01VWF9NQVBfSF9fCisKKyNpbmNsdWRlICJhdG9tcy5oIgorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKwordHlwZWRlZiBlbnVtIF9Hc3RRVE11eEZvcm1hdAoreworICBHU1RfUVRfTVVYX0ZPUk1BVF9OT05FID0gMCwKKyAgR1NUX1FUX01VWF9GT1JNQVRfUVQsCisgIEdTVF9RVF9NVVhfRk9STUFUX01QNCwKKyAgR1NUX1FUX01VWF9GT1JNQVRfM0dQLAorICBHU1RfUVRfTVVYX0ZPUk1BVF9NSjIsCisgIEdTVF9RVF9NVVhfRk9STUFUX0lTTUwKK30gR3N0UVRNdXhGb3JtYXQ7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RRVE11eEZvcm1hdFByb3AKK3sKKyAgR3N0UVRNdXhGb3JtYXQgZm9ybWF0OworICBHc3RSYW5rIHJhbms7CisgIGNvbnN0IGdjaGFyICpuYW1lOworICBjb25zdCBnY2hhciAqbG9uZ19uYW1lOworICBjb25zdCBnY2hhciAqdHlwZV9uYW1lOworICBHc3RTdGF0aWNDYXBzIHNyY19jYXBzOworICBHc3RTdGF0aWNDYXBzIHZpZGVvX3NpbmtfY2FwczsKKyAgR3N0U3RhdGljQ2FwcyBhdWRpb19zaW5rX2NhcHM7CisgIEdzdFN0YXRpY0NhcHMgc3VidGl0bGVfc2lua19jYXBzOworfSBHc3RRVE11eEZvcm1hdFByb3A7CisKK2V4dGVybiBHc3RRVE11eEZvcm1hdFByb3AgZ3N0X3F0X211eF9mb3JtYXRfbGlzdFtdOworCit2b2lkICAgICAgICAgICAgZ3N0X3F0X211eF9tYXBfZm9ybWF0X3RvX2hlYWRlciAgICAgIChHc3RRVE11eEZvcm1hdCBmb3JtYXQsIEdzdEJ1ZmZlciAqKiBfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqIF9tYWpvciwgZ3VpbnQzMiAqIHZlcnNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaXN0ICoqIF9jb21wYXRpYmxlLCBBdG9tTU9PViAqIG1vb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RDbG9ja1RpbWUgbG9uZ2VzdF9jaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdib29sZWFuIGZhc3RzdGFydCk7CisKK0F0b21zVHJlZUZsYXZvciBnc3RfcXRfbXV4X21hcF9mb3JtYXRfdG9fZmxhdm9yICAgICAgKEdzdFFUTXV4Rm9ybWF0IGZvcm1hdCk7CisKKyNlbmRpZiAvKiBfX0dTVF9RVF9NVVhfTUFQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5jIGIvZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhM2M2MGUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L2dzdHJ0cHhxdGRlcGF5LmMKQEAgLTAsMCArMSw2ODcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogYmFzZWQgb24gaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vcXVpY2t0aW1lL2ljZWZsb2UvZGlzcGF0Y2gwMjYuaHRtbAorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnc3RydHB4cXRkZXBheS5oIgorCisjZGVmaW5lIE1BS0VfVExWKGEsYikgICgoKGEpPDw4KXwoYikpCisKKyNkZWZpbmUgVExWX3NkCU1BS0VfVExWICgncycsJ2QnKQorI2RlZmluZSBUTFZfcXQJTUFLRV9UTFYgKCdxJywndCcpCisjZGVmaW5lIFRMVl90aQlNQUtFX1RMViAoJ3QnLCdpJykKKyNkZWZpbmUgVExWX2x5CU1BS0VfVExWICgnbCcsJ3knKQorI2RlZmluZSBUTFZfdm8JTUFLRV9UTFYgKCd2JywnbycpCisjZGVmaW5lIFRMVl9teAlNQUtFX1RMViAoJ20nLCd4JykKKyNkZWZpbmUgVExWX3RyCU1BS0VfVExWICgndCcsJ3InKQorI2RlZmluZSBUTFZfdHcJTUFLRV9UTFYgKCd0JywndycpCisjZGVmaW5lIFRMVl90aAlNQUtFX1RMViAoJ3QnLCdoJykKKyNkZWZpbmUgVExWX2xhCU1BS0VfVExWICgnbCcsJ2EnKQorI2RlZmluZSBUTFZfcnQJTUFLRV9UTFYgKCdyJywndCcpCisjZGVmaW5lIFRMVl9nbQlNQUtFX1RMViAoJ2cnLCdtJykKKyNkZWZpbmUgVExWX29jCU1BS0VfVExWICgnbycsJ2MnKQorI2RlZmluZSBUTFZfY3IJTUFLRV9UTFYgKCdjJywncicpCisjZGVmaW5lIFRMVl9kdQlNQUtFX1RMViAoJ2QnLCd1JykKKyNkZWZpbmUgVExWX3BvCU1BS0VfVExWICgncCcsJ28nKQorCisjZGVmaW5lIFFUX1VJTlQzMihhKSAgKEdTVF9SRUFEX1VJTlQzMl9CRShhKSkKKyNkZWZpbmUgUVRfVUlOVDI0KGEpICAoR1NUX1JFQURfVUlOVDMyX0JFKGEpID4+IDgpCisjZGVmaW5lIFFUX1VJTlQxNihhKSAgKEdTVF9SRUFEX1VJTlQxNl9CRShhKSkKKyNkZWZpbmUgUVRfVUlOVDgoYSkgICAoR1NUX1JFQURfVUlOVDgoYSkpCisjZGVmaW5lIFFUX0ZQMzIoYSkgICAgKChHU1RfUkVBRF9VSU5UMzJfQkUoYSkpLzY1NTM2LjApCisjZGVmaW5lIFFUX0ZQMTYoYSkgICAgKChHU1RfUkVBRF9VSU5UMTZfQkUoYSkpLzI1Ni4wKQorI2RlZmluZSBRVF9GT1VSQ0MoYSkgIChHU1RfUkVBRF9VSU5UMzJfTEUoYSkpCisjZGVmaW5lIFFUX1VJTlQ2NChhKSAgKCgoKGd1aW50NjQpUVRfVUlOVDMyKGEpKTw8MzIpfFFUX1VJTlQzMigoKGd1aW50OCAqKWEpKzQpKQorCisjZGVmaW5lIEZPVVJDQ19hdmMxICAgICBHU1RfTUFLRV9GT1VSQ0MoJ2EnLCd2JywnYycsJzEnKQorI2RlZmluZSBGT1VSQ0NfYXZjMyAgICAgR1NUX01BS0VfRk9VUkNDKCdhJywndicsJ2MnLCczJykKKyNkZWZpbmUgRk9VUkNDX2F2Y0MgICAgIEdTVF9NQUtFX0ZPVVJDQygnYScsJ3YnLCdjJywnQycpCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cHhxdGRlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHB4cXRkZXBheV9kZWJ1ZykKKworLyogUnRwWFFURGVwYXkgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCitlbnVtCit7CisgIFBST1BfMCwKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3hxdF9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF94cXRfZGVwYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgeyBcImF1ZGlvXCIsIFwidmlkZW9cIiB9LCBjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWF0sICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSB7IFwiWC1RVFwiLCBcIlgtUVVJQ0tUSU1FXCIgfSIpCisgICAgKTsKKworI2RlZmluZSBnc3RfcnRwX3hxdF9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBYUVREZXBheSwgZ3N0X3J0cF94cXRfZGVwYXksIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfeHF0X2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfeHF0X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF94cXRfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWYpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF94cXRfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF94cXRfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UnRwWFFURGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX3hxdF9kZXBheV9maW5hbGl6ZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX3hxdF9kZXBheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX3hxdF9kZXBheV9zZXRjYXBzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzID0gZ3N0X3J0cF94cXRfZGVwYXlfcHJvY2VzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRweHF0ZGVwYXlfZGVidWcsICJydHB4cXRkZXBheSIsIDAsCisgICAgICAiUVQgTWVkaWEgUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF94cXRfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF94cXRfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgcGFja2V0IGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsiLAorICAgICAgIkV4dHJhY3RzIFF1aWNrdGltZSBhdWRpby92aWRlbyBmcm9tIFJUUCBwYWNrZXRzIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF94cXRfZGVwYXlfaW5pdCAoR3N0UnRwWFFURGVwYXkgKiBydHB4cXRkZXBheSkKK3sKKyAgcnRweHF0ZGVwYXktPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3hxdF9kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwWFFURGVwYXkgKnJ0cHhxdGRlcGF5OworCisgIHJ0cHhxdGRlcGF5ID0gR1NUX1JUUF9YUVRfREVQQVkgKG9iamVjdCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cHhxdGRlcGF5LT5hZGFwdGVyKTsKKyAgcnRweHF0ZGVwYXktPmFkYXB0ZXIgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3F1aWNrdGltZV9wYXJzZV9zZCAoR3N0UnRwWFFURGVwYXkgKiBydHB4cXRkZXBheSwgZ3VpbnQ4ICogZGF0YSwKKyAgICBndWludCBkYXRhX2xlbikKK3sKKyAgZ2ludCBsZW47CisgIGd1aW50MzIgZm91cmNjOworCisgIGlmIChkYXRhX2xlbiA8IDgpCisgICAgZ290byB0b29fc2hvcnQ7CisKKyAgbGVuID0gKGRhdGFbMF0gPDwgMjQpIHwgKGRhdGFbMV0gPDwgMTYpIHwgKGRhdGFbMl0gPDwgOCkgfCBkYXRhWzNdOworICBpZiAobGVuID4gZGF0YV9sZW4pCisgICAgZ290byB0b29fc2hvcnQ7CisKKyAgZm91cmNjID0gUVRfRk9VUkNDIChkYXRhICsgNCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRweHF0ZGVwYXksICJwYXJzaW5nICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKworICBzd2l0Y2ggKGZvdXJjYykgeworICAgIGNhc2UgRk9VUkNDX2F2YzE6CisgICAgY2FzZSBGT1VSQ0NfYXZjMzoKKyAgICB7CisgICAgICBndWludDMyIGNobGVuOworCisgICAgICBpZiAobGVuIDwgMHg1NikKKyAgICAgICAgZ290byB0b29fc2hvcnQ7CisgICAgICBsZW4gLT0gMHg1NjsKKyAgICAgIGRhdGEgKz0gMHg1NjsKKworICAgICAgLyogZmluZCBhdmNDICovCisgICAgICB3aGlsZSAobGVuID49IDgpIHsKKyAgICAgICAgY2hsZW4gPSBRVF9VSU5UMzIgKGRhdGEpOworICAgICAgICBmb3VyY2MgPSBRVF9GT1VSQ0MgKGRhdGEgKyA0KTsKKyAgICAgICAgaWYgKGZvdXJjYyA9PSBGT1VSQ0NfYXZjQykgeworICAgICAgICAgIEdzdEJ1ZmZlciAqYnVmOworICAgICAgICAgIGdpbnQgc2l6ZTsKKyAgICAgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRweHF0ZGVwYXksICJmb3VuZCBhdmNDIGNvZGVjX2RhdGEgaW4gc2QsICV1IiwKKyAgICAgICAgICAgICAgY2hsZW4pOworCisgICAgICAgICAgLyogcGFyc2UsIGlmIGZvdW5kICovCisgICAgICAgICAgaWYgKGNobGVuIDwgbGVuKQorICAgICAgICAgICAgc2l6ZSA9IGNobGVuIC0gODsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzaXplID0gbGVuIC0gODsKKworICAgICAgICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZSk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIGRhdGEgKyA4LCBzaXplKTsKKyAgICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtaDI2NCIsCisgICAgICAgICAgICAgICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBidWYsIE5VTEwpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRCAocnRweHF0ZGVwYXkpLT5zcmNwYWQsIGNhcHMpOworICAgICAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBsZW4gLT0gY2hsZW47CisgICAgICAgIGRhdGEgKz0gY2hsZW47CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLwordG9vX3Nob3J0OgorICB7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF94cXRfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnaW50IGNsb2NrX3JhdGUgPSA5MDAwMDsgICAgICAvKiBkZWZhdWx0ICovCisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpOworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfeHF0X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0UnRwWFFURGVwYXkgKnJ0cHhxdGRlcGF5OworICBHc3RCdWZmZXIgKm91dGJ1ZiA9IE5VTEw7CisgIGdib29sZWFuIG07CisgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwgfTsKKworICBydHB4cXRkZXBheSA9IEdTVF9SVFBfWFFUX0RFUEFZIChkZXBheWxvYWQpOworCisgIGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQUQsICZydHApOworCisgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKGJ1ZikpIHsKKyAgICAvKiBkaXNjb250LCBjbGVhciBhZGFwdGVyIGFuZCB0cnkgdG8gZmluZCBhIG5ldyBwYWNrZXQgc3RhcnQgKi8KKyAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRweHF0ZGVwYXktPmFkYXB0ZXIpOworICAgIHJ0cHhxdGRlcGF5LT5uZWVkX3Jlc3luYyA9IFRSVUU7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRweHF0ZGVwYXksICJ3ZSBuZWVkIHJlc3luYyIpOworICB9CisKKyAgbSA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKCZydHApOworICBHU1RfTE9HX09CSkVDVCAocnRweHF0ZGVwYXksICJtYXJrZXI6ICVkIiwgbSk7CisKKyAgeworICAgIGdpbnQgcGF5bG9hZF9sZW47CisgICAgZ3VpbnQgYXZhaWw7CisgICAgZ3VpbnQ4ICpwYXlsb2FkOworICAgIGd1aW50OCB2ZXIsIHBjazsKKyAgICBnYm9vbGVhbiBzLCBxLCBsLCBkOworCisgICAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKCZydHApOworICAgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisKKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMyAKKyAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKiB8IFZFUiAgIHxQQ0t8U3xRfEx8IFJFUyAgICAgICAgIHxEfCBRdWlja1RpbWUgUGF5bG9hZCBJRCAgICAgICAgfAorICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICovCisgICAgaWYgKHBheWxvYWRfbGVuIDw9IDQpCisgICAgICBnb3RvIHdyb25nX2xlbmd0aDsKKworICAgIHZlciA9IChwYXlsb2FkWzBdICYgMHhmMCkgPj4gNDsKKyAgICBpZiAodmVyID4gMSkKKyAgICAgIGdvdG8gd3JvbmdfdmVyc2lvbjsKKworICAgIHBjayA9IChwYXlsb2FkWzBdICYgMHgwYykgPj4gMjsKKyAgICBpZiAocGNrID09IDApCisgICAgICBnb3RvIHBja19yZXNlcnZlZDsKKworICAgIHMgPSAocGF5bG9hZFswXSAmIDB4MDIpICE9IDA7ICAgICAgIC8qIGNvbnRhaW5zIHN5bmMgc2FtcGxlICovCisgICAgcSA9IChwYXlsb2FkWzBdICYgMHgwMSkgIT0gMDsgICAgICAgLyogaGFzIHBheWxvYWQgZGVzY3JpcHRpb24gKi8KKyAgICBsID0gKHBheWxvYWRbMV0gJiAweDgwKSAhPSAwOyAgICAgICAvKiBoYXMgcGFja2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIGRlc2NyaXB0aW9uICovCisgICAgZCA9IChwYXlsb2FkWzJdICYgMHg4MCkgIT0gMDsgICAgICAgLyogZG9uJ3QgY2FjaGUgaW5mbyBmb3IgcGF5bG9hZCBpZCAqLworICAgIC8qIGlkIHVzZWQgZm9yIGNhY2hpbmcgaW5mbyAqLworICAgIHJ0cHhxdGRlcGF5LT5jdXJyZW50X2lkID0gKChwYXlsb2FkWzJdICYgMHg3ZikgPDwgOCkgfCBwYXlsb2FkWzNdOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cHhxdGRlcGF5LAorICAgICAgICAiVkVSOiAlZCwgUENLOiAlZCwgUzogJWQsIFE6ICVkLCBMOiAlZCwgRDogJWQsIElEOiAlZCIsIHZlciwgcGNrLCBzLCBxLAorICAgICAgICBsLCBkLCBydHB4cXRkZXBheS0+Y3VycmVudF9pZCk7CisKKyAgICBpZiAocnRweHF0ZGVwYXktPm5lZWRfcmVzeW5jKSB7CisgICAgICAvKiB3ZSBuZWVkIHRvIGZpbmQgdGhlIGJvdW5kYXJ5IG9mIGEgbmV3IHBhY2tldCBhZnRlciBhIERJU0NPTlQgKi8KKyAgICAgIGlmIChwY2sgIT0gMyB8fCBxKSB7CisgICAgICAgIC8qIG5vbi1mcmFnbWVudGVkIHBhY2tldCBvciBwYXlsb2FkIGRlc2NyaXB0aW9uIHByZXNlbnQsIHBhY2tldCBzdGFydHMKKyAgICAgICAgICogaGVyZS4gKi8KKyAgICAgICAgcnRweHF0ZGVwYXktPm5lZWRfcmVzeW5jID0gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBmcmFnbWVudGVkIHBhY2tldCB3aXRob3V0IGRlc2NyaXB0aW9uICovCisgICAgICAgIGlmIChtKSB7CisgICAgICAgICAgLyogbWFya2VyIGJpdCBzZXQsIG5leHQgcGFja2V0IGlzIHN0YXJ0IG9mIG5ldyBvbmUgKi8KKyAgICAgICAgICBydHB4cXRkZXBheS0+bmVlZF9yZXN5bmMgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIG5lZWRfcmVzeW5jOworICAgICAgfQorICAgIH0KKworICAgIHBheWxvYWQgKz0gNDsKKyAgICBwYXlsb2FkX2xlbiAtPSA0OworCisgICAgaWYgKHEpIHsKKyAgICAgIGdib29sZWFuIGssIGYsIGEsIHo7CisgICAgICBndWludCBwZGxlbiwgcGRwYWRkZWQ7CisgICAgICBnaW50IHBhZGRpbmc7CisgICAgICAvKiBtZWRpYV90eXBlIG9ubHkgdXNlZCBmb3IgcHJpbnRpbmcgKi8KKyAgICAgIGd1aW50MzIgR19HTlVDX1VOVVNFRCBtZWRpYV90eXBlOworICAgICAgZ3VpbnQzMiB0aW1lc2NhbGU7CisKKyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICogfEt8RnxBfFp8IFJFUyAgICAgICAgICAgICAgICAgICB8IFF1aWNrVGltZSBQYXlsb2FkIERlc2MgTGVuZ3RoIHwKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKiAuIFF1aWNrVGltZSBQYXlsb2FkIERlc2MgRGF0YSAuLi4gLiAKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKi8KKyAgICAgIGlmIChwYXlsb2FkX2xlbiA8PSA0KQorICAgICAgICBnb3RvIHdyb25nX2xlbmd0aDsKKworICAgICAgayA9IChwYXlsb2FkWzBdICYgMHg4MCkgIT0gMDsgICAgIC8qIGtleWZyYW1lICovCisgICAgICBmID0gKHBheWxvYWRbMF0gJiAweDQwKSAhPSAwOyAgICAgLyogc3BhcnNlICovCisgICAgICBhID0gKHBheWxvYWRbMF0gJiAweDIwKSAhPSAwOyAgICAgLyogc3RhcnQgb2YgcGF5bG9hZCAqLworICAgICAgeiA9IChwYXlsb2FkWzBdICYgMHgxMCkgIT0gMDsgICAgIC8qIGVuZCBvZiBwYXlsb2FkICovCisgICAgICBwZGxlbiA9IChwYXlsb2FkWzJdIDw8IDgpIHwgcGF5bG9hZFszXTsKKworICAgICAgaWYgKHBkbGVuIDwgMTIpCisgICAgICAgIGdvdG8gd3JvbmdfbGVuZ3RoOworCisgICAgICAvKiBjYWxjIHBhZGRpbmcgKi8KKyAgICAgIHBkcGFkZGVkID0gcGRsZW4gKyAzOworICAgICAgcGRwYWRkZWQgLT0gcGRwYWRkZWQgJSA0OworICAgICAgaWYgKHBheWxvYWRfbGVuIDwgcGRwYWRkZWQpCisgICAgICAgIGdvdG8gd3JvbmdfbGVuZ3RoOworCisgICAgICBwYWRkaW5nID0gcGRwYWRkZWQgLSBwZGxlbjsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHB4cXRkZXBheSwKKyAgICAgICAgICAiSzogJWQsIEY6ICVkLCBBOiAlZCwgWjogJWQsIGxlbjogJWQsIHBhZGRpbmcgJWQiLCBrLCBmLCBhLCB6LCBwZGxlbiwKKyAgICAgICAgICBwYWRkaW5nKTsKKworICAgICAgcGF5bG9hZCArPSA0OworICAgICAgcGF5bG9hZF9sZW4gLT0gNDsKKyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICogfCBRdWlja1RpbWUgTWVkaWEgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKiB8IFRpbWVzY2FsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAqIC4gUXVpY2tUaW1lIFRMVnMgLi4uIC4KKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKi8KKyAgICAgIG1lZGlhX3R5cGUgPQorICAgICAgICAgIChwYXlsb2FkWzBdIDw8IDI0KSB8IChwYXlsb2FkWzFdIDw8IDE2KSB8IChwYXlsb2FkWzJdIDw8IDgpIHwKKyAgICAgICAgICBwYXlsb2FkWzNdOworICAgICAgdGltZXNjYWxlID0KKyAgICAgICAgICAocGF5bG9hZFs0XSA8PCAyNCkgfCAocGF5bG9hZFs1XSA8PCAxNikgfCAocGF5bG9hZFs2XSA8PCA4KSB8CisgICAgICAgICAgcGF5bG9hZFs3XTsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cHhxdGRlcGF5LCAibWVkaWFfdHlwZTogJWMlYyVjJWMsIHRpbWVzY2FsZSAldSIsCisgICAgICAgICAgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSwgcGF5bG9hZFsyXSwgcGF5bG9hZFszXSwgdGltZXNjYWxlKTsKKworICAgICAgcGF5bG9hZCArPSA4OworICAgICAgcGF5bG9hZF9sZW4gLT0gODsKKyAgICAgIHBkbGVuIC09IDEyOworCisgICAgICAvKiBwYXJzZSBUTFYgKHR5cGUtbGVuZ3RoLXZhbHVlIHRyaXBsZXRzICovCisgICAgICB3aGlsZSAocGRsZW4gPiAzKSB7CisgICAgICAgIGd1aW50MTYgdGx2X2xlbiwgdGx2X3R5cGU7CisKKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiB8IFF1aWNrVGltZSBUTFYgTGVuZ3RoICAgICAgICAgIHwgUXVpY2tUaW1lIFRMViBUeXBlICAgICAgICAgICAgfAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiAuIFF1aWNrVGltZSBUTFYgVmFsdWUgLi4uIC4KKyAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICovCisgICAgICAgIHRsdl9sZW4gPSAocGF5bG9hZFswXSA8PCA4KSB8IHBheWxvYWRbMV07CisgICAgICAgIHRsdl90eXBlID0gKHBheWxvYWRbMl0gPDwgOCkgfCBwYXlsb2FkWzNdOworICAgICAgICBwZGxlbiAtPSA0OworICAgICAgICBpZiAodGx2X2xlbiA+IHBkbGVuKQorICAgICAgICAgIGdvdG8gd3JvbmdfbGVuZ3RoOworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChydHB4cXRkZXBheSwgIlRMViAnJWMlYycsIGxlbiAlZCIsIHBheWxvYWRbMl0sCisgICAgICAgICAgICBwYXlsb2FkWzNdLCB0bHZfbGVuKTsKKworICAgICAgICBwYXlsb2FkICs9IDQ7CisgICAgICAgIHBheWxvYWRfbGVuIC09IDQ7CisKKyAgICAgICAgc3dpdGNoICh0bHZfdHlwZSkgeworICAgICAgICAgIGNhc2UgVExWX3NkOgorICAgICAgICAgICAgLyogU2Vzc2lvbiBkZXNjcmlwdGlvbiAqLworICAgICAgICAgICAgaWYgKCFnc3RfcnRwX3F1aWNrdGltZV9wYXJzZV9zZCAocnRweHF0ZGVwYXksIHBheWxvYWQsIHRsdl9sZW4pKQorICAgICAgICAgICAgICBnb3RvIHVua25vd25fZm9ybWF0OworICAgICAgICAgICAgcnRweHF0ZGVwYXktPmhhdmVfc2QgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBUTFZfcXQ6CisgICAgICAgICAgY2FzZSBUTFZfdGk6CisgICAgICAgICAgY2FzZSBUTFZfbHk6CisgICAgICAgICAgY2FzZSBUTFZfdm86CisgICAgICAgICAgY2FzZSBUTFZfbXg6CisgICAgICAgICAgY2FzZSBUTFZfdHI6CisgICAgICAgICAgY2FzZSBUTFZfdHc6CisgICAgICAgICAgY2FzZSBUTFZfdGg6CisgICAgICAgICAgY2FzZSBUTFZfbGE6CisgICAgICAgICAgY2FzZSBUTFZfcnQ6CisgICAgICAgICAgY2FzZSBUTFZfZ206CisgICAgICAgICAgY2FzZSBUTFZfb2M6CisgICAgICAgICAgY2FzZSBUTFZfY3I6CisgICAgICAgICAgY2FzZSBUTFZfZHU6CisgICAgICAgICAgY2FzZSBUTFZfcG86CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcGRsZW4gLT0gdGx2X2xlbjsKKyAgICAgICAgcGF5bG9hZCArPSB0bHZfbGVuOworICAgICAgICBwYXlsb2FkX2xlbiAtPSB0bHZfbGVuOworICAgICAgfQorICAgICAgcGF5bG9hZCArPSBwYWRkaW5nOworICAgICAgcGF5bG9hZF9sZW4gLT0gcGFkZGluZzsKKyAgICB9CisKKyAgICBpZiAobCkgeworICAgICAgZ3VpbnQgc3NpbGVuLCBzc2lwYWRkZWQ7CisgICAgICBnaW50IHBhZGRpbmc7CisKKyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICogfCBSRVMgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNhbXBsZS1TcGVjaWZpYyBJbmZvIExlbmd0aCAgIHwKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKiAuIFF1aWNrVGltZSBUTFZzIC4uLiAKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKi8KKyAgICAgIGlmIChwYXlsb2FkX2xlbiA8PSA0KQorICAgICAgICBnb3RvIHdyb25nX2xlbmd0aDsKKworICAgICAgc3NpbGVuID0gKHBheWxvYWRbMl0gPDwgOCkgfCBwYXlsb2FkWzNdOworICAgICAgaWYgKHNzaWxlbiA8IDQpCisgICAgICAgIGdvdG8gd3JvbmdfbGVuZ3RoOworCisgICAgICAvKiBjYWxjIHBhZGRpbmcgKi8KKyAgICAgIHNzaXBhZGRlZCA9IHNzaWxlbiArIDM7CisgICAgICBzc2lwYWRkZWQgLT0gc3NpcGFkZGVkICUgNDsKKyAgICAgIGlmIChwYXlsb2FkX2xlbiA8IHNzaXBhZGRlZCkKKyAgICAgICAgZ290byB3cm9uZ19sZW5ndGg7CisKKyAgICAgIHBhZGRpbmcgPSBzc2lwYWRkZWQgLSBzc2lsZW47CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRweHF0ZGVwYXksICJsZW46ICVkLCBwYWRkaW5nICVkIiwgc3NpbGVuLCBwYWRkaW5nKTsKKworICAgICAgcGF5bG9hZCArPSA0OworICAgICAgcGF5bG9hZF9sZW4gLT0gNDsKKyAgICAgIHNzaWxlbiAtPSA0OworCisgICAgICAvKiBwYXJzZSBUTFYgKHR5cGUtbGVuZ3RoLXZhbHVlIHRyaXBsZXRzICovCisgICAgICB3aGlsZSAoc3NpbGVuID4gMykgeworICAgICAgICBndWludDE2IHRsdl9sZW4sIHRsdl90eXBlOworCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICAgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICogfCBRdWlja1RpbWUgVExWIExlbmd0aCAgICAgICAgICB8IFF1aWNrVGltZSBUTFYgVHlwZSAgICAgICAgICAgIHwKKyAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICogLiBRdWlja1RpbWUgVExWIFZhbHVlIC4uLiAuCisgICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAqLworICAgICAgICB0bHZfbGVuID0gKHBheWxvYWRbMF0gPDwgOCkgfCBwYXlsb2FkWzFdOworICAgICAgICB0bHZfdHlwZSA9IChwYXlsb2FkWzJdIDw8IDgpIHwgcGF5bG9hZFszXTsKKyAgICAgICAgc3NpbGVuIC09IDQ7CisgICAgICAgIGlmICh0bHZfbGVuID4gc3NpbGVuKQorICAgICAgICAgIGdvdG8gd3JvbmdfbGVuZ3RoOworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChydHB4cXRkZXBheSwgIlRMViAnJWMlYycsIGxlbiAlZCIsIHBheWxvYWRbMl0sCisgICAgICAgICAgICBwYXlsb2FkWzNdLCB0bHZfbGVuKTsKKworICAgICAgICBwYXlsb2FkICs9IDQ7CisgICAgICAgIHBheWxvYWRfbGVuIC09IDQ7CisKKyAgICAgICAgc3dpdGNoICh0bHZfdHlwZSkgeworICAgICAgICAgIGNhc2UgVExWX3NkOgorICAgICAgICAgIGNhc2UgVExWX3F0OgorICAgICAgICAgIGNhc2UgVExWX3RpOgorICAgICAgICAgIGNhc2UgVExWX2x5OgorICAgICAgICAgIGNhc2UgVExWX3ZvOgorICAgICAgICAgIGNhc2UgVExWX214OgorICAgICAgICAgIGNhc2UgVExWX3RyOgorICAgICAgICAgIGNhc2UgVExWX3R3OgorICAgICAgICAgIGNhc2UgVExWX3RoOgorICAgICAgICAgIGNhc2UgVExWX2xhOgorICAgICAgICAgIGNhc2UgVExWX3J0OgorICAgICAgICAgIGNhc2UgVExWX2dtOgorICAgICAgICAgIGNhc2UgVExWX29jOgorICAgICAgICAgIGNhc2UgVExWX2NyOgorICAgICAgICAgIGNhc2UgVExWX2R1OgorICAgICAgICAgIGNhc2UgVExWX3BvOgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHNzaWxlbiAtPSB0bHZfbGVuOworICAgICAgICBwYXlsb2FkICs9IHRsdl9sZW47CisgICAgICAgIHBheWxvYWRfbGVuIC09IHRsdl9sZW47CisgICAgICB9CisgICAgICBwYXlsb2FkICs9IHBhZGRpbmc7CisgICAgICBwYXlsb2FkX2xlbiAtPSBwYWRkaW5nOworICAgIH0KKworICAgIHJ0cHhxdGRlcGF5LT5wcmV2aW91c19pZCA9IHJ0cHhxdGRlcGF5LT5jdXJyZW50X2lkOworCisgICAgc3dpdGNoIChwY2spIHsKKyAgICAgIGNhc2UgMToKKyAgICAgIHsKKyAgICAgICAgLyogbXVsdGlwbGUgc2FtcGxlcyBwZXIgcGFja2V0LiAqLworICAgICAgICBvdXRidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHBheWxvYWRfbGVuKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChvdXRidWYsIDAsIHBheWxvYWQsIHBheWxvYWRfbGVuKTsKKworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgICBjYXNlIDI6CisgICAgICB7CisgICAgICAgIGd1aW50IHNsZW47CisKKyAgICAgICAgLyogbXVsdGlwbGUgc2FtcGxlcyBwZXIgcGFja2V0LiAKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiB8U3wgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgIHwgU2FtcGxlIExlbmd0aCAgICAgICAgICAgICAgICAgfAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiB8IFNhbXBsZSBUaW1lc3RhbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiAuIFNhbXBsZSBEYXRhIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiB8U3wgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgIHwgU2FtcGxlIExlbmd0aCAgICAgICAgICAgICAgICAgfAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiB8IFNhbXBsZSBUaW1lc3RhbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiAuIFNhbXBsZSBEYXRhIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiAuIC4uLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKi8KKyAgICAgICAgd2hpbGUgKHBheWxvYWRfbGVuID4gOCkgeworICAgICAgICAgIHMgPSAocGF5bG9hZFswXSAmIDB4ODApICE9IDA7IC8qIGNvbnRhaW5zIHN5bmMgc2FtcGxlICovCisgICAgICAgICAgc2xlbiA9IChwYXlsb2FkWzJdIDw8IDgpIHwgcGF5bG9hZFszXTsKKyAgICAgICAgICAvKiB0aW1lc3RhbXAgPQorICAgICAgICAgICAqICAgIChwYXlsb2FkWzRdIDw8IDI0KSB8IChwYXlsb2FkWzVdIDw8IDE2KSB8IChwYXlsb2FkWzZdIDw8IDgpIHwKKyAgICAgICAgICAgKiAgICBwYXlsb2FkWzddOworICAgICAgICAgICAqLworCisgICAgICAgICAgcGF5bG9hZCArPSA4OworICAgICAgICAgIHBheWxvYWRfbGVuIC09IDg7CisKKyAgICAgICAgICBpZiAoc2xlbiA+IHBheWxvYWRfbGVuKQorICAgICAgICAgICAgc2xlbiA9IHBheWxvYWRfbGVuOworCisgICAgICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzbGVuKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKG91dGJ1ZiwgMCwgcGF5bG9hZCwgc2xlbik7CisgICAgICAgICAgaWYgKCFzKQorICAgICAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisKKyAgICAgICAgICBnc3RfcnRwX2Jhc2VfZGVwYXlsb2FkX3B1c2ggKGRlcGF5bG9hZCwgb3V0YnVmKTsKKworICAgICAgICAgIC8qIGFsaWduZWQgb24gMzIgYml0IGJvdW5kYXJ5ICovCisgICAgICAgICAgc2xlbiA9IEdTVF9ST1VORF9VUF80IChzbGVuKTsKKworICAgICAgICAgIHBheWxvYWQgKz0gc2xlbjsKKyAgICAgICAgICBwYXlsb2FkX2xlbiAtPSBzbGVuOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAzOgorICAgICAgeworICAgICAgICAvKiBvbmUgc2FtcGxlIHBlciBwYWNrZXQsIHVzZSBhZGFwdGVyIHRvIGNvbWJpbmUgYmFzZWQgb24gbWFya2VyIGJpdC4gKi8KKyAgICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChwYXlsb2FkX2xlbik7CisgICAgICAgIGdzdF9idWZmZXJfZmlsbCAob3V0YnVmLCAwLCBwYXlsb2FkLCBwYXlsb2FkX2xlbik7CisKKyAgICAgICAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRweHF0ZGVwYXktPmFkYXB0ZXIsIG91dGJ1Zik7CisgICAgICAgIG91dGJ1ZiA9IE5VTEw7CisKKyAgICAgICAgaWYgKCFtKQorICAgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRweHF0ZGVwYXktPmFkYXB0ZXIpOworICAgICAgICBvdXRidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRweHF0ZGVwYXktPmFkYXB0ZXIsIGF2YWlsKTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHB4cXRkZXBheSwKKyAgICAgICAgICAgICJnc3RfcnRwX3hxdF9kZXBheV9jaGFpbjogcHVzaGluZyBidWZmZXIgb2Ygc2l6ZSAldSIsIGF2YWlsKTsKKworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgfQorICB9CisKK2RvbmU6CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgcmV0dXJuIG91dGJ1ZjsKKworbmVlZF9yZXN5bmM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHB4cXRkZXBheSwgIndhaXRpbmcgZm9yIG1hcmtlciIpOworICAgIGdvdG8gZG9uZTsKKyAgfQord3JvbmdfdmVyc2lvbjoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cHhxdGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJVbmtub3duIHBheWxvYWQgdmVyc2lvbi4iKSwgKE5VTEwpKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3Bja19yZXNlcnZlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cHhxdGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJQQ0sgcmVzZXJ2ZWQgMC4iKSwgKE5VTEwpKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3dyb25nX2xlbmd0aDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cHhxdGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJXcm9uZyBwYXlsb2FkIGxlbmd0aC4iKSwgKE5VTEwpKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3Vua25vd25fZm9ybWF0OgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRweHF0ZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIlVua25vd24gcGF5bG9hZCBmb3JtYXQuIiksIChOVUxMKSk7CisgICAgZ290byBkb25lOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF94cXRfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UnRwWFFURGVwYXkgKnJ0cHhxdGRlcGF5OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRweHF0ZGVwYXkgPSBHU1RfUlRQX1hRVF9ERVBBWSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChydHB4cXRkZXBheS0+YWRhcHRlcik7CisgICAgICBydHB4cXRkZXBheS0+cHJldmlvdXNfaWQgPSAtMTsKKyAgICAgIHJ0cHhxdGRlcGF5LT5jdXJyZW50X2lkID0gLTE7CisgICAgICBydHB4cXRkZXBheS0+bmVlZF9yZXN5bmMgPSBUUlVFOworICAgICAgcnRweHF0ZGVwYXktPmhhdmVfc2QgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRweHF0ZGVwYXktPmFkYXB0ZXIpOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5oIGIvZ3N0L2lzb21wNC9nc3RydHB4cXRkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNGU0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L2dzdHJ0cHhxdGRlcGF5LmgKQEAgLTAsMCArMSw2NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1hRVF9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1hRVF9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfWFFUX0RFUEFZIFwKKyAgKGdzdF9ydHBfeHF0X2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfWFFUX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1hRVF9ERVBBWSxHc3RSdHBYUVREZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfWFFUX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9YUVRfREVQQVksR3N0UnRwWFFURGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfWFFUX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1hRVF9ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfWFFUX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9YUVRfREVQQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwWFFURGVwYXkgR3N0UnRwWFFURGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwWFFURGVwYXlDbGFzcyBHc3RSdHBYUVREZXBheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cFhRVERlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisKKyAgZ2Jvb2xlYW4gbmVlZF9yZXN5bmM7CisgIGd1aW50MTYgcHJldmlvdXNfaWQ7CisgIGd1aW50MTYgY3VycmVudF9pZDsKKyAgZ2Jvb2xlYW4gaGF2ZV9zZDsKK307CisKK3N0cnVjdCBfR3N0UnRwWFFURGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF94cXRfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX1hRVF9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvaXNvbXA0LXBsdWdpbi5jIGIvZ3N0L2lzb21wNC9pc29tcDQtcGx1Z2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmNzhjZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvaXNvbXA0LXBsdWdpbi5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSAiZ3N0L2dzdC1pMThuLXBsdWdpbi5oIgorCisjaW5jbHVkZSAicXRkZW11eC5oIgorI2luY2x1ZGUgImdzdHJ0cHhxdGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cXRtdXguaCIKKyNpbmNsdWRlICJnc3RxdG1vb3ZyZWNvdmVyLmgiCisKKyNpbmNsdWRlIDxnc3QvcGJ1dGlscy9wYnV0aWxzLmg+CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyNpZmRlZiBFTkFCTEVfTkxTCisgIGJpbmR0ZXh0ZG9tYWluIChHRVRURVhUX1BBQ0tBR0UsIExPQ0FMRURJUik7CisgIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChHRVRURVhUX1BBQ0tBR0UsICJVVEYtOCIpOworI2VuZGlmIC8qIEVOQUJMRV9OTFMgKi8KKworICBnc3RfcGJfdXRpbHNfaW5pdCAoKTsKKworICAvKiBlbnN1cmUgcHJpdmF0ZSB0YWcgaXMgcmVnaXN0ZXJlZCAqLworICBnc3RfdGFnX3JlZ2lzdGVyIChHU1RfUVRfREVNVVhfUFJJVkFURV9UQUcsIEdTVF9UQUdfRkxBR19NRVRBLAorICAgICAgR1NUX1RZUEVfU0FNUExFLCAiUVQgYXRvbSIsICJ1bnBhcnNlZCBRVCB0YWcgYXRvbSIsCisgICAgICBnc3RfdGFnX21lcmdlX3VzZV9maXJzdCk7CisKKyAgZ3N0X3RhZ19yZWdpc3RlciAoR1NUX1FUX0RFTVVYX0NMQVNTSUZJQ0FUSU9OX1RBRywgR1NUX1RBR19GTEFHX01FVEEsCisgICAgICBHX1RZUEVfU1RSSU5HLCBHU1RfUVRfREVNVVhfQ0xBU1NJRklDQVRJT05fVEFHLCAiY29udGVudCBjbGFzc2lmaWNhdGlvbiIsCisgICAgICBnc3RfdGFnX21lcmdlX3VzZV9maXJzdCk7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicXRkZW11eCIsCisgICAgICAgICAgR1NUX1JBTktfUFJJTUFSWSwgR1NUX1RZUEVfUVRERU1VWCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHhxdGRlcGF5IiwKKyAgICAgICAgICBHU1RfUkFOS19NQVJHSU5BTCwgR1NUX1RZUEVfUlRQX1hRVF9ERVBBWSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3F0X211eF9yZWdpc3RlciAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghZ3N0X3F0X21vb3ZfcmVjb3Zlcl9yZWdpc3RlciAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBpc29tcDQsCisgICAgIklTTyBiYXNlIG1lZGlhIGZpbGUgZm9ybWF0IHN1cHBvcnQgKG1wNCwgM2dwcCwgcXQsIG1qMikiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L21lc29uLmJ1aWxkIGIvZ3N0L2lzb21wNC9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGEyZDY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDI5IEBACittcDRfc291cmNlcyA9IFsKKyAgJ2lzb21wNC1wbHVnaW4uYycsCisgICdnc3RydHB4cXRkZXBheS5jJywKKyAgJ3F0ZGVtdXguYycsCisgICdxdGRlbXV4X3R5cGVzLmMnLAorICAncXRkZW11eF9kdW1wLmMnLAorICAncXRkZW11eF9sYW5nLmMnLAorICAnZ3N0aXNvZmYuYycsCisgICdnc3RxdG11eC5jJywKKyAgJ2dzdHF0bW9vdnJlY292ZXIuYycsCisgICdhdG9tcy5jJywKKyAgJ2F0b21zcmVjb3ZlcnkuYycsCisgICdkZXNjcmlwdG9ycy5jJywKKyAgJ3Byb3BlcnRpZXMuYycsCisgICdnc3RxdG11eG1hcC5jJworXQorCitnc3Rpc29tcDQgPSBsaWJyYXJ5KCdnc3Rpc29tcDQnLAorICBtcDRfc291cmNlcywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBsaW5rX2FyZ3MgOiBub3NlaF9saW5rX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdF9kZXAsIGdzdHJpZmZfZGVwLCBnc3RhdWRpb19kZXAsIGdzdHZpZGVvX2RlcCwKKyAgICAgICAgICAgICAgICAgIGdzdHJ0cF9kZXAsIGdzdHRhZ19kZXAsIGdzdHBidXRpbHNfZGVwLCB6bGliX2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCisKK2luc3RhbGxfZGF0YShzb3VyY2VzOiAnR3N0UVRNdXgucHJzJywgaW5zdGFsbF9kaXI6IHByZXNldGRpcikKZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvcHJvcGVydGllcy5jIGIvZ3N0L2lzb21wNC9wcm9wZXJ0aWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0M2UyOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvcHJvcGVydGllcy5jCkBAIC0wLDAgKzEsMjEwIEBACisvKiBRdWlja3RpbWUgbXV4ZXIgcGx1Z2luIGZvciBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGlhZ28gU291c2EgU2FudG9zIDx0aGlhZ29zc0BlbWJlZGRlZC51ZmNnLmVkdS5icj4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJwcm9wZXJ0aWVzLmgiCisKKy8qIGlmIG5lZWRlZCwgcmUtYWxsb2NhdGUgYnVmZmVyIHRvIGVuc3VyZSBzaXplIGJ5dGVzIGNhbiBiZSB3cml0dGVuIGludG8gaXQKKyAqIGF0IG9mZnNldCAqLwordm9pZAorcHJvcF9jb3B5X2Vuc3VyZV9idWZmZXIgKGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBic2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCwKKyAgICBndWludDY0IHNpemUpCit7CisgIGlmIChidWZmZXIgJiYgKmJzaXplIC0gKm9mZnNldCA8IHNpemUpIHsKKyAgICAqYnNpemUgKz0gc2l6ZSArIDEwICogMTAyNDsKKyAgICAqYnVmZmVyID0gZ19yZWFsbG9jICgqYnVmZmVyLCAqYnNpemUpOworICB9Cit9CisKK3N0YXRpYyBndWludDY0Citjb3B5X2Z1bmMgKHZvaWQgKnByb3AsIGd1aW50IHNpemUsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBic2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBpZiAoYnVmZmVyKSB7CisgICAgcHJvcF9jb3B5X2Vuc3VyZV9idWZmZXIgKGJ1ZmZlciwgYnNpemUsIG9mZnNldCwgc2l6ZSk7CisgICAgbWVtY3B5ICgqYnVmZmVyICsgKm9mZnNldCwgcHJvcCwgc2l6ZSk7CisgIH0KKyAgKm9mZnNldCArPSBzaXplOworICByZXR1cm4gc2l6ZTsKK30KKworI2RlZmluZSBJTlRfQVJSQVlfQ09QWV9GVU5DX0ZBU1QobmFtZSwgZGF0YXR5cGUpIAkJCVwKK2d1aW50NjQgcHJvcF9jb3B5XyAjIyBuYW1lICMjIF9hcnJheSAoZGF0YXR5cGUgKnByb3AsIGd1aW50IHNpemUsCVwKKyAgICBndWludDggKiogYnVmZmVyLCBndWludDY0ICogYnNpemUsIGd1aW50NjQgKiBvZmZzZXQpIHsgCQlcCisgIHJldHVybiBjb3B5X2Z1bmMgKHByb3AsIHNpemVvZiAoZGF0YXR5cGUpICogc2l6ZSwgYnVmZmVyLCBic2l6ZSwgb2Zmc2V0KTtcCit9CisKKyNkZWZpbmUgSU5UX0FSUkFZX0NPUFlfRlVOQyhuYW1lLCBkYXRhdHlwZSkgCQkJCVwKK2d1aW50NjQgcHJvcF9jb3B5XyAjIyBuYW1lICMjIF9hcnJheSAoZGF0YXR5cGUgKnByb3AsIGd1aW50IHNpemUsCVwKKyAgICBndWludDggKiogYnVmZmVyLCBndWludDY0ICogYnNpemUsIGd1aW50NjQgKiBvZmZzZXQpIHsgCQlcCisgIGd1aW50IGk7CQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsJCQkJCQlcCisgICAgcHJvcF9jb3B5XyAjIyBuYW1lIChwcm9wW2ldLCBidWZmZXIsIGJzaXplLCBvZmZzZXQpOwkJXAorICB9CQkJCQkJCQkJXAorICByZXR1cm4gc2l6ZW9mIChkYXRhdHlwZSkgKiBzaXplOwkJCQkJXAorfQorCisvKiBJTlRFR0VSUyAqLworZ3VpbnQ2NAorcHJvcF9jb3B5X3VpbnQ4IChndWludDggcHJvcCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgcmV0dXJuIGNvcHlfZnVuYyAoJnByb3AsIHNpemVvZiAoZ3VpbnQ4KSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworfQorCitndWludDY0Citwcm9wX2NvcHlfdWludDE2IChndWludDE2IHByb3AsIGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBzaXplLAorICAgIGd1aW50NjQgKiBvZmZzZXQpCit7CisgIHByb3AgPSBHVUlOVDE2X1RPX0JFIChwcm9wKTsKKyAgcmV0dXJuIGNvcHlfZnVuYyAoJnByb3AsIHNpemVvZiAoZ3VpbnQxNiksIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKK30KKworZ3VpbnQ2NAorcHJvcF9jb3B5X3VpbnQzMiAoZ3VpbnQzMiBwcm9wLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBwcm9wID0gR1VJTlQzMl9UT19CRSAocHJvcCk7CisgIHJldHVybiBjb3B5X2Z1bmMgKCZwcm9wLCBzaXplb2YgKGd1aW50MzIpLCBidWZmZXIsIHNpemUsIG9mZnNldCk7Cit9CisKK2d1aW50NjQKK3Byb3BfY29weV91aW50NjQgKGd1aW50NjQgcHJvcCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgcHJvcCA9IEdVSU5UNjRfVE9fQkUgKHByb3ApOworICByZXR1cm4gY29weV9mdW5jICgmcHJvcCwgc2l6ZW9mIChndWludDY0KSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworfQorCitndWludDY0Citwcm9wX2NvcHlfaW50MzIgKGdpbnQzMiBwcm9wLCBndWludDggKiogYnVmZmVyLCBndWludDY0ICogc2l6ZSwKKyAgICBndWludDY0ICogb2Zmc2V0KQoreworICBwcm9wID0gR0lOVDMyX1RPX0JFIChwcm9wKTsKKyAgcmV0dXJuIGNvcHlfZnVuYyAoJnByb3AsIHNpemVvZiAoZ3VpbnQzMiksIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKK30KKworLyogdWludDggY2FuIHVzZSBkaXJlY3QgY29weSBpbiBhbnkgY2FzZSwgYW5kIG1heSBiZSB1c2VkIGZvciBsYXJnZSBxdWFudGl0eSAqLworSU5UX0FSUkFZX0NPUFlfRlVOQ19GQVNUICh1aW50OCwgZ3VpbnQ4KTsKKy8qIG5vdCB1c2VkIGluIGxhcmdlIHF1YW50aXR5IGFueXdheSAqLworSU5UX0FSUkFZX0NPUFlfRlVOQyAodWludDE2LCBndWludDE2KTsKK0lOVF9BUlJBWV9DT1BZX0ZVTkMgKHVpbnQzMiwgZ3VpbnQzMik7CitJTlRfQVJSQVlfQ09QWV9GVU5DICh1aW50NjQsIGd1aW50NjQpOworCisvKiBGT1VSQ0MgKi8KK2d1aW50NjQKK3Byb3BfY29weV9mb3VyY2MgKGd1aW50MzIgcHJvcCwgZ3VpbnQ4ICoqIGJ1ZmZlciwgZ3VpbnQ2NCAqIHNpemUsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgcHJvcCA9IEdJTlQzMl9UT19MRSAocHJvcCk7CisgIHJldHVybiBjb3B5X2Z1bmMgKCZwcm9wLCBzaXplb2YgKGd1aW50MzIpLCBidWZmZXIsIHNpemUsIG9mZnNldCk7Cit9CisKK0lOVF9BUlJBWV9DT1BZX0ZVTkMgKGZvdXJjYywgZ3VpbnQzMik7CisKKy8qKgorICogcHJvcF9jb3B5X2ZpeGVkX3NpemVfc3RyaW5nOgorICogQHN0cmluZzogdGhlIHN0cmluZyB0byBiZSBjb3BpZWQKKyAqIEBzdHJfc2l6ZTogc2l6ZSBvZiB0aGUgc3RyaW5nCisgKiBAYnVmZmVyOiB0aGUgYXJyYXkgdG8gY29weSB0aGUgc3RyaW5nIHRvCisgKiBAb2Zmc2V0OiB0aGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciBhcnJheS4KKyAqIFRoaXMgdmFsdWUgaXMgdXBkYXRlZCB0byB0aGUgcG9pbnQgcmlnaHQgYWZ0ZXIgdGhlIGNvcGllZCBzdHJpbmcuCisgKgorICogQ29waWVzIGEgc3RyaW5nIG9mIGJ5dGVzIHdpdGhvdXQgcGxhY2luZyBpdHMgc2l6ZSBhdCB0aGUgYmVnaW5uaW5nLgorICoKKyAqIFJldHVybnM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkCisgKi8KK2d1aW50NjQKK3Byb3BfY29weV9maXhlZF9zaXplX3N0cmluZyAoZ3VpbnQ4ICogc3RyaW5nLCBndWludCBzdHJfc2l6ZSwgZ3VpbnQ4ICoqIGJ1ZmZlciwKKyAgICBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgcmV0dXJuIGNvcHlfZnVuYyAoc3RyaW5nLCBzdHJfc2l6ZSAqIHNpemVvZiAoZ3VpbnQ4KSwgYnVmZmVyLCBzaXplLCBvZmZzZXQpOworfQorCisvKioKKyAqIHByb3BfY29weV9zaXplX3N0cmluZzoKKyAqCisgKiBAc3RyaW5nOiB0aGUgc3RyaW5nIHRvIGJlIGNvcGllZAorICogQHN0cl9zaXplOiBzaXplIG9mIHRoZSBzdHJpbmcKKyAqIEBidWZmZXI6IHRoZSBhcnJheSB0byBjb3B5IHRoZSBzdHJpbmcgdG8KKyAqIEBvZmZzZXQ6IHRoZSBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyIGFycmF5LgorICogVGhpcyB2YWx1ZSBpcyB1cGRhdGVkIHRvIHRoZSBwb2ludCByaWdodCBhZnRlciB0aGUgY29waWVkIHN0cmluZy4KKyAqCisgKiBDb3BpZXMgYSBzdHJpbmcgYW5kIGl0cyBzaXplIHRvIGFuIGFycmF5LiBFeGFtcGxlOgorICogc3RyaW5nID0gJ2FiY1wwJworICogcmVzdWx0IGluIHRoZSBhcnJheTogWzNdW2FdW2JdW2NdICAoZWFjaCBbeF0gcmVwcmVzZW50cyBhIHBvc2l0aW9uKQorICoKKyAqIFJldHVybnM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkCisgKi8KK2d1aW50NjQKK3Byb3BfY29weV9zaXplX3N0cmluZyAoZ3VpbnQ4ICogc3RyaW5nLCBndWludCBzdHJfc2l6ZSwgZ3VpbnQ4ICoqIGJ1ZmZlciwKKyAgICBndWludDY0ICogc2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ2NCBvcmlnaW5hbF9vZmZzZXQgPSAqb2Zmc2V0OworCisgIHByb3BfY29weV91aW50OCAoc3RyX3NpemUsIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X2ZpeGVkX3NpemVfc3RyaW5nIChzdHJpbmcsIHN0cl9zaXplLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQorCisvKioKKyAqIHByb3BfY29weV9udWxsX3Rlcm1pbmF0ZWRfc3RyaW5nOgorICogQHN0cmluZzogdGhlIHN0cmluZyB0byBiZSBjb3BpZWQKKyAqIEBidWZmZXI6IHRoZSBhcnJheSB0byBjb3B5IHRoZSBzdHJpbmcgdG8KKyAqIEBvZmZzZXQ6IHRoZSBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyIGFycmF5LgorICogVGhpcyB2YWx1ZSBpcyB1cGRhdGVkIHRvIHRoZSBwb2ludCByaWdodCBhZnRlciB0aGUgY29waWVkIHN0cmluZy4KKyAqCisgKiBDb3BpZXMgYSBzdHJpbmcgaW5jbHVkaW5nIGl0cyBudWxsIHRlcm1pbmF0aW5nIGNoYXIgdG8gYW4gYXJyYXkuCisgKgorICogUmV0dXJuczogdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQKKyAqLworZ3VpbnQ2NAorcHJvcF9jb3B5X251bGxfdGVybWluYXRlZF9zdHJpbmcgKGdjaGFyICogc3RyaW5nLCBndWludDggKiogYnVmZmVyLAorICAgIGd1aW50NjQgKiBzaXplLCBndWludDY0ICogb2Zmc2V0KQoreworICBndWludDY0IG9yaWdpbmFsX29mZnNldCA9ICpvZmZzZXQ7CisgIGd1aW50IGxlbiA9IHN0cmxlbiAoc3RyaW5nKTsKKworICBwcm9wX2NvcHlfZml4ZWRfc2l6ZV9zdHJpbmcgKChndWludDggKikgc3RyaW5nLCBsZW4sIGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKKyAgcHJvcF9jb3B5X3VpbnQ4ICgnXDAnLCBidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIHJldHVybiAqb2Zmc2V0IC0gb3JpZ2luYWxfb2Zmc2V0OworfQpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9wcm9wZXJ0aWVzLmggYi9nc3QvaXNvbXA0L3Byb3BlcnRpZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzZmZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9wcm9wZXJ0aWVzLmgKQEAgLTAsMCArMSw4NyBAQAorLyogUXVpY2t0aW1lIG11eGVyIHBsdWdpbiBmb3IgR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhpYWdvIFNvdXNhIFNhbnRvcyA8dGhpYWdvc3NAZW1iZWRkZWQudWZjZy5lZHUuYnI+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qCisgKiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgU291cmNlIENvZGUgaXMgbGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2UuCisgKiBTZWUgZnVydGhlciBleHBsYW5hdGlvbiBhdHRhY2hlZCBpbiBMaWNlbnNlIFN0YXRlbWVudCAoZGlzdHJpYnV0ZWQgaW4gdGhlIGZpbGUKKyAqIExJQ0VOU0UpLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fUFJPUEVSVElFU19IX18KKyNkZWZpbmUgX19QUk9QRVJUSUVTX0hfXworCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKgorICogRnVuY3Rpb25zIGZvciBjb3B5aW5nIGF0b21zIHByb3BlcnRpZXMuCisgKgorICogQWxsIG9mIHRoZW0gcmVjZWl2ZSwgYXMgdGhlIGlucHV0LCB0aGUgcHJvcGVydHkgdG8gYmUgY29waWVkLCB0aGUgZGVzdGluYXRpb24KKyAqIGJ1ZmZlciwgYW5kIGEgcG9pbnRlciB0byBhbiBvZmZzZXQgaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciB0byBjb3B5IHRvIHRoZSByaWdodCBwbGFjZS4KKyAqIFRoaXMgb2Zmc2V0IHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgbmV3IHZhbHVlIChvZmZzZXQgKyBjb3BpZWRfc2l6ZSkKKyAqIFRoZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGhhcyBiZWVuIGNvcGllZCBvciAwCisgKiBpZiBpdCBjb3VsZG4ndCBjb3B5LgorICovCisKK3ZvaWQgICAgcHJvcF9jb3B5X2Vuc3VyZV9idWZmZXIgICAgICAgICAgKGd1aW50OCAqKiBidWZmZXIsIGd1aW50NjQgKiBic2l6ZSwgZ3VpbnQ2NCAqIG9mZnNldCwgZ3VpbnQ2NCBzaXplKTsKKworZ3VpbnQ2NCBwcm9wX2NvcHlfdWludDggICAgICAgICAgICAgICAgICAoZ3VpbnQ4IHByb3AsIGd1aW50OCAqKmJ1ZmZlciwgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCAqb2Zmc2V0KTsKK2d1aW50NjQgcHJvcF9jb3B5X3VpbnQxNiAgICAgICAgICAgICAgICAgKGd1aW50MTYgcHJvcCwgZ3VpbnQ4ICoqYnVmZmVyLCBndWludDY0ICpzaXplLCBndWludDY0ICpvZmZzZXQpOworZ3VpbnQ2NCBwcm9wX2NvcHlfdWludDMyICAgICAgICAgICAgICAgICAoZ3VpbnQzMiBwcm9wLCBndWludDggKipidWZmZXIsIGd1aW50NjQgKnNpemUsIGd1aW50NjQgKm9mZnNldCk7CitndWludDY0IHByb3BfY29weV91aW50NjQgICAgICAgICAgICAgICAgIChndWludDY0IHByb3AsIGd1aW50OCAqKmJ1ZmZlciwgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCAqb2Zmc2V0KTsKKworZ3VpbnQ2NCBwcm9wX2NvcHlfaW50MzIgICAgICAgICAgICAgICAgICAoZ2ludDMyIHByb3AsIGd1aW50OCAqKmJ1ZmZlciwgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCAqb2Zmc2V0KTsKKworZ3VpbnQ2NCBwcm9wX2NvcHlfdWludDhfYXJyYXkgICAgICAgICAgICAoZ3VpbnQ4ICpwcm9wLCBndWludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ4ICoqYnVmZmVyLCBndWludDY0ICpic2l6ZSwgZ3VpbnQ2NCAqb2Zmc2V0KTsKK2d1aW50NjQgcHJvcF9jb3B5X3VpbnQxNl9hcnJheSAgICAgICAgICAgKGd1aW50MTYgKnByb3AsIGd1aW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDggKipidWZmZXIsIGd1aW50NjQgKmJzaXplLCBndWludDY0ICpvZmZzZXQpOworZ3VpbnQ2NCBwcm9wX2NvcHlfdWludDMyX2FycmF5ICAgICAgICAgICAoZ3VpbnQzMiAqcHJvcCwgZ3VpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50OCAqKmJ1ZmZlciwgZ3VpbnQ2NCAqYnNpemUsIGd1aW50NjQgKm9mZnNldCk7CitndWludDY0IHByb3BfY29weV91aW50NjRfYXJyYXkgICAgICAgICAgIChndWludDY0ICpwcm9wLCBndWludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ4ICoqYnVmZmVyLCBndWludDY0ICpic2l6ZSwgZ3VpbnQ2NCAqb2Zmc2V0KTsKKworZ3VpbnQ2NCBwcm9wX2NvcHlfZm91cmNjICAgICAgICAgICAgICAgICAoZ3VpbnQzMiBwcm9wLCBndWludDggKipidWZmZXIsIGd1aW50NjQgKnNpemUsIGd1aW50NjQgKm9mZnNldCk7CitndWludDY0IHByb3BfY29weV9mb3VyY2NfYXJyYXkgICAgICAgICAgIChndWludDMyICpwcm9wLCBndWludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ4ICoqYnVmZmVyLCBndWludDY0ICpic2l6ZSwgZ3VpbnQ2NCAqb2Zmc2V0KTsKK2d1aW50NjQgcHJvcF9jb3B5X2ZpeGVkX3NpemVfc3RyaW5nICAgICAgKGd1aW50OCAqc3RyaW5nLCBndWludCBzdHJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50OCAqKmJ1ZmZlciwgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCAqb2Zmc2V0KTsKK2d1aW50NjQgcHJvcF9jb3B5X3NpemVfc3RyaW5nICAgICAgICAgICAgKGd1aW50OCAqc3RyaW5nLCBndWludCBzdHJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50OCAqKmJ1ZmZlciwgZ3VpbnQ2NCAqc2l6ZSwgZ3VpbnQ2NCAqb2Zmc2V0KTsKK2d1aW50NjQgcHJvcF9jb3B5X251bGxfdGVybWluYXRlZF9zdHJpbmcgKGdjaGFyICpzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDggKipidWZmZXIsIGd1aW50NjQgKnNpemUsIGd1aW50NjQgKm9mZnNldCk7CisKKyNlbmRpZiAvKiBfX1BST1BFUlRJRVNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L3F0YXRvbXBhcnNlci5oIGIvZ3N0L2lzb21wNC9xdGF0b21wYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWJhYjUwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9xdGF0b21wYXJzZXIuaApAQCAtMCwwICsxLDEzOSBAQAorLyogR1N0cmVhbWVyIFF1aWNrVGltZSBhdG9tIHBhcnNlcgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTVEVyaWNzc29uIDxiZW5qYW1pbi5nYWlnbmFyZEBzdGVyaWNzc29uLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIFFUX0FUT01fUEFSU0VSX0gKKyNkZWZpbmUgUVRfQVRPTV9QQVJTRVJfSAorCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXJlYWRlci5oPgorCisvKiBvdXIgaW5saW5lZCB2ZXJzaW9uIG9mIEdzdEJ5dGVSZWFkZXIgKi8KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorcXRfYXRvbV9wYXJzZXJfaGFzX3JlbWFpbmluZyAoR3N0Qnl0ZVJlYWRlciAqIHBhcnNlciwgZ3VpbnQ2NCBieXRlc19uZWVkZWQpCit7CisgIHJldHVybiBHX0xJS0VMWSAocGFyc2VyLT5zaXplID49IGJ5dGVzX25lZWRlZCkgJiYKKyAgICAgIEdfTElLRUxZICgocGFyc2VyLT5zaXplIC0gYnl0ZXNfbmVlZGVkKSA+PSBwYXJzZXItPmJ5dGUpOworfQorCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitxdF9hdG9tX3BhcnNlcl9oYXNfY2h1bmtzIChHc3RCeXRlUmVhZGVyICogcGFyc2VyLCBndWludDMyIG5fY2h1bmtzLAorICAgIGd1aW50MzIgY2h1bmtfc2l6ZSkKK3sKKyAgLyogYXNzdW1wdGlvbjogbl9jaHVua3MgYW5kIGNodW5rX3NpemUgYXJlIDMyLWJpdCwgd2UgY2FzdCB0byA2NC1iaXQgaGVyZQorICAgKiB0byBhdm9pZCBvdmVyZmxvd3MsIHRvIGhhbmRsZSBlLmcuIChndWludDMyKS0xICogc2l6ZSBjb3JyZWN0bHkgKi8KKyAgcmV0dXJuIHF0X2F0b21fcGFyc2VyX2hhc19yZW1haW5pbmcgKHBhcnNlciwgKGd1aW50NjQpIG5fY2h1bmtzICogY2h1bmtfc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2Jvb2xlYW4KK3F0X2F0b21fcGFyc2VyX3BlZWtfc3ViIChHc3RCeXRlUmVhZGVyICogcGFyc2VyLCBndWludCBvZmZzZXQsIGd1aW50IHNpemUsCisgICAgR3N0Qnl0ZVJlYWRlciAqIHN1YikKK3sKKyAgKnN1YiA9ICpwYXJzZXI7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoc3ViLCBvZmZzZXQpKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoc3ViKSA+PSBzaXplKTsKK30KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorcXRfYXRvbV9wYXJzZXJfc2tpcG5fYW5kX2dldF91aW50MzIgKEdzdEJ5dGVSZWFkZXIgKiBwYXJzZXIsCisgICAgZ3VpbnQgYnl0ZXNfdG9fc2tpcCwgZ3VpbnQzMiAqIHZhbCkKK3sKKyAgaWYgKEdfVU5MSUtFTFkgKGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nIChwYXJzZXIpIDwgKGJ5dGVzX3RvX3NraXAgKyA0KSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGdzdF9ieXRlX3JlYWRlcl9za2lwX3VuY2hlY2tlZCAocGFyc2VyLCBieXRlc190b19za2lwKTsKKyAgKnZhbCA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAocGFyc2VyKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIG9mZl9zaXplIG11c3QgYmUgZWl0aGVyIDQgb3IgOCAqLworc3RhdGljIGlubGluZSBnYm9vbGVhbgorcXRfYXRvbV9wYXJzZXJfZ2V0X29mZnNldCAoR3N0Qnl0ZVJlYWRlciAqIHBhcnNlciwgZ3VpbnQgb2ZmX3NpemUsCisgICAgZ3VpbnQ2NCAqIHZhbCkKK3sKKyAgaWYgKEdfVU5MSUtFTFkgKGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nIChwYXJzZXIpIDwgb2ZmX3NpemUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAob2ZmX3NpemUgPT0gc2l6ZW9mIChndWludDY0KSkgeworICAgICp2YWwgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ2NF9iZV91bmNoZWNrZWQgKHBhcnNlcik7CisgIH0gZWxzZSB7CisgICAgKnZhbCA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAocGFyc2VyKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworLyogb2ZmX3NpemUgbXVzdCBiZSBlaXRoZXIgNCBvciA4ICovCitzdGF0aWMgaW5saW5lIGd1aW50NjQKK3F0X2F0b21fcGFyc2VyX2dldF9vZmZzZXRfdW5jaGVja2VkIChHc3RCeXRlUmVhZGVyICogcGFyc2VyLCBndWludCBvZmZfc2l6ZSkKK3sKKyAgaWYgKG9mZl9zaXplID09IHNpemVvZiAoZ3VpbnQ2NCkpIHsKKyAgICByZXR1cm4gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50NjRfYmVfdW5jaGVja2VkIChwYXJzZXIpOworICB9IGVsc2UgeworICAgIHJldHVybiBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKHBhcnNlcik7CisgIH0KK30KKworLyogc2l6ZSBtdXN0IGJlIGZyb20gMSB0byA0ICovCitzdGF0aWMgaW5saW5lIGd1aW50MzIKK3F0X2F0b21fcGFyc2VyX2dldF91aW50X3dpdGhfc2l6ZV91bmNoZWNrZWQgKEdzdEJ5dGVSZWFkZXIgKiBwYXJzZXIsCisgICAgZ3VpbnQgc2l6ZSkKK3sKKyAgc3dpdGNoIChzaXplKSB7CisgIGNhc2UgMToKKyAgICByZXR1cm4gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OF91bmNoZWNrZWQgKHBhcnNlcik7CisgIGNhc2UgMjoKKyAgICByZXR1cm4gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmVfdW5jaGVja2VkIChwYXJzZXIpOworICBjYXNlIDM6CisgICAgcmV0dXJuIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDI0X2JlX3VuY2hlY2tlZCAocGFyc2VyKTsKKyAgY2FzZSA0OgorICAgIHJldHVybiBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKHBhcnNlcik7CisgIGRlZmF1bHQ6CisgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgZ3N0X2J5dGVfcmVhZGVyX3NraXBfdW5jaGVja2VkIChwYXJzZXIsIHNpemUpOworICAgIGJyZWFrOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitxdF9hdG9tX3BhcnNlcl9nZXRfZm91cmNjIChHc3RCeXRlUmVhZGVyICogcGFyc2VyLCBndWludDMyICogZm91cmNjKQoreworICBndWludDMyIGZfYmU7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nIChwYXJzZXIpIDwgNCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGZfYmUgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKHBhcnNlcik7CisgICpmb3VyY2MgPSBHVUlOVDMyX1NXQVBfTEVfQkUgKGZfYmUpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGlubGluZSBndWludDMyCitxdF9hdG9tX3BhcnNlcl9nZXRfZm91cmNjX3VuY2hlY2tlZCAoR3N0Qnl0ZVJlYWRlciAqIHBhcnNlcikKK3sKKyAgZ3VpbnQzMiBmb3VyY2M7CisKKyAgZm91cmNjID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkIChwYXJzZXIpOworICByZXR1cm4gR1VJTlQzMl9TV0FQX0xFX0JFIChmb3VyY2MpOworfQorCisjZW5kaWYgLyogUVRfQVRPTV9QQVJTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9xdGRlbXV4LmMgYi9nc3QvaXNvbXA0L3F0ZGVtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmY4NzBmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9xdGRlbXV4LmMKQEAgLTAsMCArMSwxNDQ3NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gSnVsaWVuIE1vdXR0ZSA8anVsaWVuQGZsdWVuZG8uY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFNURXJpY3Nzb24gPGJlbmphbWluLmdhaWduYXJkQHN0ZXJpY3Nzb24uY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAxMz4gU3JlZXJlbmogQmFsYWNoYW5kcmFuIDxzcmVlcmVuai5iYWxhY2hhbmRyYW5AaW50ZWwuY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAxMz4gSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgPDIwMTQ+IENlbnRyaWN1bGFyIEx0ZAorICogQ29weXJpZ2h0IChDKSA8MjAxNT4gWW91VmlldyBUViBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDwyMDE2PiBCcml0aXNoIEJyb2FkY2FzdGluZyBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXF0ZGVtdXgKKyAqCisgKiBEZW11eGVzIGEgLm1vdiBmaWxlIGludG8gcmF3IG9yIGNvbXByZXNzZWQgYXVkaW8gYW5kL29yIHZpZGVvIHN0cmVhbXMuCisgKgorICogVGhpcyBlbGVtZW50IHN1cHBvcnRzIGJvdGggcHVzaCBhbmQgcHVsbC1iYXNlZCBzY2hlZHVsaW5nLCBkZXBlbmRpbmcgb24gdGhlCisgKiBjYXBhYmlsaXRpZXMgb2YgdGhlIHVwc3RyZWFtIGVsZW1lbnRzLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXRlc3QubW92ICEgcXRkZW11eCBuYW1lPWRlbXV4ICBkZW11eC5hdWRpb18wICEgcXVldWUgISBkZWNvZGViaW4gISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgYXV0b2F1ZGlvc2luayAgIGRlbXV4LnZpZGVvXzAgISBxdWV1ZSAhIGRlY29kZWJpbiAhIHZpZGVvY29udmVydCAhIHZpZGVvc2NhbGUgISBhdXRvdmlkZW9zaW5rCisgKiBdfCBQbGF5IChwYXJzZSBhbmQgZGVjb2RlKSBhIC5tb3YgZmlsZSBhbmQgdHJ5IHRvIG91dHB1dCBpdCB0bworICogYW4gYXV0b21hdGljYWxseSBkZXRlY3RlZCBzb3VuZGNhcmQgYW5kIHZpZGVvc2luay4gSWYgdGhlIE1PViBmaWxlIGNvbnRhaW5zCisgKiBjb21wcmVzc2VkIGF1ZGlvIG9yIHZpZGVvIGRhdGEsIHRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgeW91IGhhdmUgdGhlCisgKiByaWdodCBkZWNvZGVyIGVsZW1lbnRzL3BsdWdpbnMgaW5zdGFsbGVkLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3QvZ3N0LWkxOG4tcGx1Z2luLmgiCisKKyNpbmNsdWRlIDxnbGliL2dwcmludGYuaD4KKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSAicXRhdG9tcGFyc2VyLmgiCisjaW5jbHVkZSAicXRkZW11eF90eXBlcy5oIgorI2luY2x1ZGUgInF0ZGVtdXhfZHVtcC5oIgorI2luY2x1ZGUgImZvdXJjYy5oIgorI2luY2x1ZGUgImRlc2NyaXB0b3JzLmgiCisjaW5jbHVkZSAicXRkZW11eF9sYW5nLmgiCisjaW5jbHVkZSAicXRkZW11eC5oIgorI2luY2x1ZGUgInF0cGFsZXR0ZS5oIgorCisjaW5jbHVkZSAiZ3N0L3JpZmYvcmlmZi1tZWRpYS5oIgorI2luY2x1ZGUgImdzdC9yaWZmL3JpZmYtcmVhZC5oIgorCisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvcGJ1dGlscy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxnc3QvbWF0aC1jb21wYXQuaD4KKworI2lmZGVmIEhBVkVfWkxJQgorIyBpbmNsdWRlIDx6bGliLmg+CisjZW5kaWYKKworLyogbWF4LiBzaXplIGNvbnNpZGVyZWQgJ3NhbmUnIGZvciBub24tbWRhdCBhdG9tcyAqLworI2RlZmluZSBRVERFTVVYX01BWF9BVE9NX1NJWkUgKDI1KjEwMjQqMTAyNCkKKworLyogaWYgdGhlIHNhbXBsZSBpbmRleCBpcyBsYXJnZXIgdGhhbiB0aGlzLCBzb21ldGhpbmcgaXMgbGlrZWx5IHdyb25nICovCisjZGVmaW5lIFFUREVNVVhfTUFYX1NBTVBMRV9JTkRFWF9TSVpFICgyMDAqMTAyNCoxMDI0KQorCisvKiBGb3IgY29udmVydGluZyBxdCBjcmVhdGlvbiB0aW1lcyB0byB1bml4IGVwb2NoIHRpbWVzICovCisjZGVmaW5lIFFUREVNVVhfU0VDT05EU19QRVJfREFZICg2MCAqIDYwICogMjQpCisjZGVmaW5lIFFUREVNVVhfTEVBUF9ZRUFSU19GUk9NXzE5MDRfVE9fMTk3MCAxNworI2RlZmluZSBRVERFTVVYX1NFQ09ORFNfRlJPTV8xOTA0X1RPXzE5NzAgKCgoMTk3MCAtIDE5MDQpICogKGd1aW50NjQpIDM2NSArIFwKKyAgICBRVERFTVVYX0xFQVBfWUVBUlNfRlJPTV8xOTA0X1RPXzE5NzApICogUVRERU1VWF9TRUNPTkRTX1BFUl9EQVkpCisKKyNkZWZpbmUgUVRERU1VWF9UUkVFX05PREVfRk9VUkNDKG4pIChRVF9GT1VSQ0MoKChndWludDggKikgKG4pLT5kYXRhKSArIDQpKQorCisjZGVmaW5lIFNUUkVBTV9JU19FT1MocykgKHMtPnRpbWVfcG9zaXRpb24gPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKworI2RlZmluZSBBQlNESUZGKHgsIHkpICggKHgpID4gKHkpID8gKCh4KSAtICh5KSkgOiAoKHkpIC0gKHgpKSApCisKK0dTVF9ERUJVR19DQVRFR09SWSAocXRkZW11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBxdGRlbXV4X2RlYnVnCisKK3R5cGVkZWYgc3RydWN0IF9RdERlbXV4U2VnbWVudCBRdERlbXV4U2VnbWVudDsKK3R5cGVkZWYgc3RydWN0IF9RdERlbXV4U2FtcGxlIFF0RGVtdXhTYW1wbGU7CisKK3R5cGVkZWYgc3RydWN0IF9RdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gUXREZW11eENlbmNTYW1wbGVTZXRJbmZvOworCitzdHJ1Y3QgX1F0RGVtdXhTYW1wbGUKK3sKKyAgZ3VpbnQzMiBzaXplOworICBnaW50MzIgcHRzX29mZnNldDsgICAgICAgICAgICAvKiBBZGQgdGhpcyB2YWx1ZSB0byB0aW1lc3RhbXAgdG8gZ2V0IHRoZSBwdHMgKi8KKyAgZ3VpbnQ2NCBvZmZzZXQ7CisgIGd1aW50NjQgdGltZXN0YW1wOyAgICAgICAgICAgIC8qIERUUyBJbiBtb3YgdGltZSAqLworICBndWludDMyIGR1cmF0aW9uOyAgICAgICAgICAgICAvKiBJbiBtb3YgdGltZSAqLworICBnYm9vbGVhbiBrZXlmcmFtZTsgICAgICAgICAgICAvKiBUUlVFIHdoZW4gdGhpcyBwYWNrZXQgaXMgYSBrZXlmcmFtZSAqLworfTsKKworLyogTWFjcm9zIGZvciBjb252ZXJ0aW5nIHRvL2Zyb20gdGltZXNjYWxlICovCisjZGVmaW5lIFFUU1RSRUFNVElNRV9UT19HU1RUSU1FKHN0cmVhbSwgdmFsdWUpIChnc3RfdXRpbF91aW50NjRfc2NhbGUoKHZhbHVlKSwgR1NUX1NFQ09ORCwgKHN0cmVhbSktPnRpbWVzY2FsZSkpCisjZGVmaW5lIEdTVFRJTUVfVE9fUVRTVFJFQU1USU1FKHN0cmVhbSwgdmFsdWUpIChnc3RfdXRpbF91aW50NjRfc2NhbGUoKHZhbHVlKSwgKHN0cmVhbSktPnRpbWVzY2FsZSwgR1NUX1NFQ09ORCkpCisKKyNkZWZpbmUgUVRUSU1FX1RPX0dTVFRJTUUocXRkZW11eCwgdmFsdWUpIChnc3RfdXRpbF91aW50NjRfc2NhbGUoKHZhbHVlKSwgR1NUX1NFQ09ORCwgKHF0ZGVtdXgpLT50aW1lc2NhbGUpKQorI2RlZmluZSBHU1RUSU1FX1RPX1FUVElNRShxdGRlbXV4LCB2YWx1ZSkgKGdzdF91dGlsX3VpbnQ2NF9zY2FsZSgodmFsdWUpLCAocXRkZW11eCktPnRpbWVzY2FsZSwgR1NUX1NFQ09ORCkpCisKKy8qIHRpbWVzdGFtcCBpcyB0aGUgRFRTICovCisjZGVmaW5lIFFUU0FNUExFX0RUUyhzdHJlYW0sc2FtcGxlKSAoUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUoKHN0cmVhbSksIChzYW1wbGUpLT50aW1lc3RhbXApKQorLyogdGltZXN0YW1wICsgb2Zmc2V0ICsgY3NsZ19zaGlmdCBpcyB0aGUgb3V0Z29pbmcgUFRTICovCisjZGVmaW5lIFFUU0FNUExFX1BUUyhzdHJlYW0sc2FtcGxlKSAoUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUoKHN0cmVhbSksIChzYW1wbGUpLT50aW1lc3RhbXAgKyAoc3RyZWFtKS0+Y3NsZ19zaGlmdCArIChzYW1wbGUpLT5wdHNfb2Zmc2V0KSkKKy8qIHRpbWVzdGFtcCArIG9mZnNldCBpcyB0aGUgUFRTIHVzZWQgZm9yIGludGVybmFsIHNlZWsgY2FsY3VhdGlvbnMgKi8KKyNkZWZpbmUgUVRTQU1QTEVfUFRTX05PX0NTTEcoc3RyZWFtLHNhbXBsZSkgKFFUU1RSRUFNVElNRV9UT19HU1RUSU1FKChzdHJlYW0pLCAoc2FtcGxlKS0+dGltZXN0YW1wICsgKHNhbXBsZSktPnB0c19vZmZzZXQpKQorLyogdGltZXN0YW1wICsgZHVyYXRpb24gLSBkdHMgaXMgdGhlIGR1cmF0aW9uICovCisjZGVmaW5lIFFUU0FNUExFX0RVUl9EVFMoc3RyZWFtLCBzYW1wbGUsIGR0cykgKFFUU1RSRUFNVElNRV9UT19HU1RUSU1FICgoc3RyZWFtKSwgKHNhbXBsZSktPnRpbWVzdGFtcCArIChzYW1wbGUpLT5kdXJhdGlvbikgLSAoZHRzKSkKKworI2RlZmluZSBRVFNBTVBMRV9LRVlGUkFNRShzdHJlYW0sc2FtcGxlKSAoKHN0cmVhbSktPmFsbF9rZXlmcmFtZSB8fCAoc2FtcGxlKS0+a2V5ZnJhbWUpCisKKy8qCisgKiBRdWlja3RpbWUgaGFzIHRyYWNrcyBhbmQgc2VnbWVudHMuIEEgdHJhY2sgaXMgYSBjb250aW51b3VzIHBpZWNlIG9mCisgKiBtdWx0aW1lZGlhIGNvbnRlbnQuIFRoZSB0cmFjayBpcyBub3QgYWx3YXlzIHBsYXllZCBmcm9tIHN0YXJ0IHRvIGZpbmlzaCBidXQKKyAqIGluc3RlYWQsIHBpZWNlcyBvZiB0aGUgdHJhY2sgYXJlICdjdXQgb3V0JyBhbmQgcGxheWVkIGluIHNlcXVlbmNlLiBUaGlzIGlzCisgKiB3aGF0IHRoZSBzZWdtZW50cyBkby4KKyAqCisgKiBJbnNpZGUgdGhlIHRyYWNrIHdlIGhhdmUga2V5ZnJhbWVzIChLKSBhbmQgZGVsdGEgZnJhbWVzLiBUaGUgdHJhY2sgaGFzIGl0cworICogb3duIHRpbWluZywgd2hpY2ggc3RhcnRzIGZyb20gMCBhbmQgZXh0ZW5kcyB0byBlbmQuIFRoZSBwb3NpdGlvbiBpbiB0aGUgdHJhY2sKKyAqIGlzIGNhbGxlZCB0aGUgbWVkaWFfdGltZS4KKyAqCisgKiBUaGUgc2VnbWVudHMgbm93IGRlc2NyaWJlIHRoZSBwaWVjZXMgdGhhdCBzaG91bGQgYmUgcGxheWVkIGZyb20gdGhpcyB0cmFjaworICogYW5kIGFyZSBiYXNpY2FsbHkgdHVwbGVzIG9mIG1lZGlhX3RpbWUvZHVyYXRpb24vcmF0ZSBlbnRyaWVzLiBXZSBjYW4gaGF2ZQorICogbXVsdGlwbGUgc2VnbWVudHMgYW5kIHRoZXkgYXJlIGFsbCBwbGF5ZWQgYWZ0ZXIgb25lIGFub3RoZXIuIEFuIGV4YW1wbGU6CisgKgorICogc2VnbWVudCAxOiBtZWRpYV90aW1lOiAxIHNlY29uZCwgZHVyYXRpb246IDEgc2Vjb25kLCByYXRlIDEKKyAqIHNlZ21lbnQgMjogbWVkaWFfdGltZTogMyBzZWNvbmQsIGR1cmF0aW9uOiAyIHNlY29uZCwgcmF0ZSAyCisgKgorICogVG8gY29ycmVjdGx5IHBsYXkgYmFjayB0aGlzIHRyYWNrLCBvbmUgbXVzdCBwbGF5OiAxIHNlY29uZCBvZiBtZWRpYSBzdGFydGluZworICogZnJvbSBtZWRpYV90aW1lIDEgZm9sbG93ZWQgYnkgMiBzZWNvbmRzIG9mIG1lZGlhIHN0YXJ0aW5nIGZyb20gbWVkaWFfdGltZSAzCisgKiBhdCBhIHJhdGUgb2YgMi4KKyAqCisgKiBFYWNoIG9mIHRoZSBzZWdtZW50cyB3aWxsIGJlIHBsYXllZCBhdCBhIHNwZWNpZmljIHRpbWUsIHRoZSBmaXJzdCBzZWdtZW50IGF0CisgKiB0aW1lIDAsIHRoZSBzZWNvbmQgb25lIGFmdGVyIHRoZSBkdXJhdGlvbiBvZiB0aGUgZmlyc3Qgb25lLCBldGMuLiBOb3RlIHRoYXQKKyAqIHRoZSB0aW1lIGluIHJlc3VsdGluZyBwbGF5YmFjayBpcyBub3QgaWRlbnRpY2FsIHRvIHRoZSBtZWRpYV90aW1lIG9mIHRoZQorICogdHJhY2sgYW55bW9yZS4KKyAqCisgKiBWaXN1YWxseSwgYXNzdW1pbmcgdGhlIHRyYWNrIGhhcyA0IHNlY29uZCBvZiBtZWRpYV90aW1lOgorICoKKyAqICAgICAgICAgICAgICAgIChhKSAgICAgICAgICAgICAgICAgICAoYikgICAgICAgICAgKGMpICAgICAgICAgICAgICAoZCkKKyAqICAgICAgICAgLi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorICogdHJhY2s6ICB8IEsuLi4uLksuLi4uLi4uLi5LLi4uLi4uLi5LLi4uLi4uLksuLi4uLi4uSy4uLi4uLi4uLi4uSy4uLiB8CisgKiAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKyAqICAgICAgICAgMCAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgMyAgICAgICAgICAgICAgNAorICogICAgICAgICAgIC4tLS0tLS0tLS0tLS1eICAgICAgICAgICAgICBeICAgLi0tLS0tLS0tLS1eICAgICAgICAgICAgICBeCisgKiAgICAgICAgICAvICAgICAgICAgICAgICAuLS0tLS0tLS0tLS0tLScgIC8gICAgICAgLi0tLS0tLS0tLS0tLS0tLS0tLScKKyAqICAgICAgICAgLyAgICAgICAgICAgICAgLyAgICAgICAgICAuLS0tLS0nICAgICAgIC8KKyAqICAgICAgICAgLi0tLS0tLS0tLS0tLS0tLiAgICAgICAgIC4tLS0tLS0tLS0tLS0tLS4KKyAqICAgICAgICAgfCBzZWdtZW50IDEgICAgfCAgICAgICAgIHwgc2VnbWVudCAyICAgIHwKKyAqICAgICAgICAgJy0tLS0tLS0tLS0tLS0tJyAgICAgICAgICctLS0tLS0tLS0tLS0tLScKKyAqCisgKiBUaGUgY2hhbGxlbmdlIGhlcmUgaXMgdG8gY3V0IG91dCB0aGUgcmlnaHQgcGllY2VzIG9mIHRoZSB0cmFjayBmb3IgZWFjaCBvZgorICogdGhlIHBsYXliYWNrIHNlZ21lbnRzLiBUaGlzIGZvcnR1bmF0ZWx5IGNhbiBlYXNpbHkgYmUgZG9uZSB3aXRoIHRoZSBTRUdNRU5UCisgKiBldmVudHMgb2YgR1N0cmVhbWVyLgorICoKKyAqIEZvciBwbGF5YmFjayBvZiBzZWdtZW50IDEsIHdlIG5lZWQgdG8gcHJvdmlkZSB0aGUgZGVjb2RlciB3aXRoIHRoZSBrZXlmcmFtZQorICogKGEpLCBpbiB0aGUgYWJvdmUgZmlndXJlLCBidXQgd2UgbXVzdCBpbnN0cnVjdCBpdCBvbmx5IHRvIG91dHB1dCB0aGUgZGVjb2RlZAorICogZGF0YSBiZXR3ZWVuIHNlY29uZCAxIGFuZCAyLiBXZSBkbyB0aGlzIHdpdGggYSBTRUdNRU5UIGV2ZW50IGZvciAxIHRvIDIsIHRpbWUKKyAqIHBvc2l0aW9uIHNldCB0byB0aGUgdGltZSBvZiB0aGUgc2VnbWVudDogMC4KKyAqCisgKiBXZSB0aGVuIHByb2NlZWQgdG8gcHVzaCBkYXRhIGZyb20ga2V5ZnJhbWUgKGEpIHRvIGZyYW1lIChiKS4gVGhlIGRlY29kZXIKKyAqIGRlY29kZXMgYnV0IGNsaXBzIGFsbCBiZWZvcmUgbWVkaWFfdGltZSAxLgorICoKKyAqIEFmdGVyIGZpbmlzaGluZyBhIHNlZ21lbnQsIHdlIHB1c2ggb3V0IGEgbmV3IFNFR01FTlQgZXZlbnQgd2l0aCB0aGUgY2xpcHBpbmcKKyAqIGJvdW5kYXJpZXMgb2YgdGhlIG5ldyBkYXRhLgorICoKKyAqIFRoaXMgaXMgYSBnb29kIHVzZWNhc2UgZm9yIHRoZSBHU3RyZWFtZXIgYWNjdW11bGF0ZWQgU0VHTUVOVCBldmVudHMuCisgKi8KKworc3RydWN0IF9RdERlbXV4U2VnbWVudAoreworICAvKiBnbG9iYWwgdGltZSBhbmQgZHVyYXRpb24sIGFsbCBnc3QgdGltZSAqLworICBHc3RDbG9ja1RpbWUgdGltZTsKKyAgR3N0Q2xvY2tUaW1lIHN0b3BfdGltZTsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uOworICAvKiBtZWRpYSB0aW1lIG9mIHRyYWssIGFsbCBnc3QgdGltZSAqLworICBHc3RDbG9ja1RpbWUgbWVkaWFfc3RhcnQ7CisgIEdzdENsb2NrVGltZSBtZWRpYV9zdG9wOworICBnZG91YmxlIHJhdGU7CisgIC8qIE1lZGlhIHN0YXJ0IHRpbWUgaW4gdHJhayB0aW1lc2NhbGUgdW5pdHMgKi8KKyAgZ3VpbnQzMiB0cmFrX21lZGlhX3N0YXJ0OworfTsKKworI2RlZmluZSBRVFNFR01FTlRfSVNfRU1QVFkocykgKChzKS0+bWVkaWFfc3RhcnQgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKworLyogVXNlZCB3aXRoIGZyYWdtZW50ZWQgTVA0IGZpbGVzIChtZnJhIGF0b20pICovCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RDbG9ja1RpbWUgdHM7CisgIGd1aW50NjQgbW9vZl9vZmZzZXQ7Cit9IFF0RGVtdXhSYW5kb21BY2Nlc3NFbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgX1F0RGVtdXhTdHJlYW1TdHNkRW50cnkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ3VpbnQzMiBmb3VyY2M7CisgIGdib29sZWFuIHNwYXJzZTsKKworICAvKiB2aWRlbyBpbmZvICovCisgIGdpbnQgd2lkdGg7CisgIGdpbnQgaGVpZ2h0OworICBnaW50IHBhcl93OworICBnaW50IHBhcl9oOworICAvKiBOdW1lcmF0b3IvZGVub21pbmF0b3IgZnJhbWVyYXRlICovCisgIGdpbnQgZnBzX247CisgIGdpbnQgZnBzX2Q7CisgIEdzdFZpZGVvQ29sb3JpbWV0cnkgY29sb3JpbWV0cnk7CisgIGd1aW50MTYgYml0c19wZXJfc2FtcGxlOworICBndWludDE2IGNvbG9yX3RhYmxlX2lkOworICBHc3RNZW1vcnkgKnJnYjhfcGFsZXR0ZTsKKyAgZ3VpbnQgaW50ZXJsYWNlX21vZGU7CisgIGd1aW50IGZpZWxkX29yZGVyOworCisgIC8qIGF1ZGlvIGluZm8gKi8KKyAgZ2RvdWJsZSByYXRlOworICBnaW50IG5fY2hhbm5lbHM7CisgIGd1aW50IHNhbXBsZXNfcGVyX3BhY2tldDsKKyAgZ3VpbnQgc2FtcGxlc19wZXJfZnJhbWU7CisgIGd1aW50IGJ5dGVzX3Blcl9wYWNrZXQ7CisgIGd1aW50IGJ5dGVzX3Blcl9zYW1wbGU7CisgIGd1aW50IGJ5dGVzX3Blcl9mcmFtZTsKKyAgZ3VpbnQgY29tcHJlc3Npb247CisKKyAgLyogaWYgd2UgdXNlIGNodW5rcyBvciBzYW1wbGVzICovCisgIGdib29sZWFuIHNhbXBsZWQ7CisgIGd1aW50IHBhZGRpbmc7CisKK30gUXREZW11eFN0cmVhbVN0c2RFbnRyeTsKKworI2RlZmluZSBDVVJfU1RSRUFNKHMpICgmKChzKS0+c3RzZF9lbnRyaWVzWyhzKS0+Y3VyX3N0c2RfZW50cnlfaW5kZXhdKSkKKworc3RydWN0IF9RdERlbXV4U3RyZWFtCit7CisgIEdzdFBhZCAqcGFkOworCisgIFF0RGVtdXhTdHJlYW1TdHNkRW50cnkgKnN0c2RfZW50cmllczsKKyAgZ3VpbnQgc3RzZF9lbnRyaWVzX2xlbmd0aDsKKyAgZ3VpbnQgY3VyX3N0c2RfZW50cnlfaW5kZXg7CisKKyAgLyogc3RyZWFtIHR5cGUgKi8KKyAgZ3VpbnQzMiBzdWJ0eXBlOworCisgIGdib29sZWFuIG5ld19jYXBzOyAgICAgICAgICAgIC8qIElmIFRSVUUsIGNhcHMgbmVlZCB0byBiZSBnZW5lcmF0ZWQgKGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNhbGxpbmcgX2NvbmZpZ3VyZV9zdHJlYW0oKSkgVGhpcyBoYXBwZW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvciBNU1MgYW5kIGZyYWdtZW50ZWQgc3RyZWFtcyAqLworCisgIGdib29sZWFuIG5ld19zdHJlYW07ICAgICAgICAgIC8qIHNpZ25hbHMgdGhhdCBhIHN0cmVhbV9zdGFydCBpcyByZXF1aXJlZCAqLworICBnYm9vbGVhbiBvbl9rZXlmcmFtZTsgICAgICAgICAvKiBpZiB0aGlzIHN0cmVhbSBsYXN0IHB1c2hlZCBidWZmZXIgd2FzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoga2V5ZnJhbWUuIFRoaXMgaXMgaW1wb3J0YW50IHRvIGlkZW50aWZ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoZXJlIHRvIHN0b3AgcHVzaGluZyBidWZmZXJzIGFmdGVyIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2VnbWVudCBzdG9wIHRpbWUgKi8KKworICAvKiBpZiB0aGUgc3RyZWFtIGhhcyBhIHJlZGlyZWN0IFVSSSBpbiBpdHMgaGVhZGVycywgd2Ugc3RvcmUgaXQgaGVyZSAqLworICBnY2hhciAqcmVkaXJlY3RfdXJpOworCisgIC8qIHRyYWNrIGlkICovCisgIGd1aW50IHRyYWNrX2lkOworCisgIC8qIGR1cmF0aW9uL3NjYWxlICovCisgIGd1aW50NjQgZHVyYXRpb247ICAgICAgICAgICAgIC8qIGluIHRpbWVzY2FsZSB1bml0cyAqLworICBndWludDMyIHRpbWVzY2FsZTsKKworICAvKiBsYW5ndWFnZSAqLworICBnY2hhciBsYW5nX2lkWzRdOyAgICAgICAgICAgICAvKiBJU08gNjM5LTJUIGxhbmd1YWdlIGNvZGUgKi8KKworICAvKiBvdXIgc2FtcGxlcyAqLworICBndWludDMyIG5fc2FtcGxlczsKKyAgUXREZW11eFNhbXBsZSAqc2FtcGxlczsKKyAgZ2Jvb2xlYW4gYWxsX2tleWZyYW1lOyAgICAgICAgLyogVFJVRSB3aGVuIGFsbCBzYW1wbGVzIGFyZSBrZXlmcmFtZXMgKG5vIHN0c3MpICovCisgIGd1aW50MzIgZmlyc3RfZHVyYXRpb247ICAgICAgIC8qIGR1cmF0aW9uIGluIHRpbWVzY2FsZSBvZiBmaXJzdCBzYW1wbGUsIHVzZWQgZm9yIGZpZ3VyaW5nIG91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnJhbWVyYXRlICovCisgIGd1aW50MzIgbl9zYW1wbGVzX21vb2Y7ICAgICAgIC8qIHNhbXBsZSBjb3VudCBpbiBhIG1vb2YgKi8KKyAgZ3VpbnQ2NCBkdXJhdGlvbl9tb29mOyAgICAgICAgLyogZHVyYXRpb24gaW4gdGltZXNjYWxlIG9mIGEgbW9vZiwgdXNlZCBmb3IgZmlndXJlIG91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZnJhbWVyYXRlIG9mIGZyYWdtZW50ZWQgZm9ybWF0IHN0cmVhbSAqLworICBndWludDY0IGR1cmF0aW9uX2xhc3RfbW9vZjsKKworICBndWludDMyIG9mZnNldF9pbl9zYW1wbGU7ICAgICAvKiBPZmZzZXQgaW4gdGhlIGN1cnJlbnQgc2FtcGxlLCB1c2VkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdHJlYW1zIHdoaWNoIGhhdmUgZ290IGV4Y2VlZGluZ2x5IGJpZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzYW1wbGUgc2l6ZSAoc3VjaCBhcyAyNHMgb2YgcmF3IGF1ZGlvKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogT25seSB1c2VkIHdoZW4gbWF4X2J1ZmZlcl9zaXplIGlzIG5vbi1OVUxMICovCisgIGd1aW50MzIgbWF4X2J1ZmZlcl9zaXplOyAgICAgIC8qIE1heGltdW0gYWxsb3dlZCBzaXplIGZvciBvdXRwdXQgYnVmZmVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQ3VycmVudGx5IG9ubHkgc2V0IGZvciByYXcgYXVkaW8gc3RyZWFtcyovCisKKyAgLyogdmlkZW8gaW5mbyAqLworICAvKiBhc3BlY3QgcmF0aW8gKi8KKyAgZ2ludCBkaXNwbGF5X3dpZHRoOworICBnaW50IGRpc3BsYXlfaGVpZ2h0OworCisgIC8qIGFsbG9jYXRpb24gKi8KKyAgZ2Jvb2xlYW4gdXNlX2FsbG9jYXRvcjsKKyAgR3N0QWxsb2NhdG9yICphbGxvY2F0b3I7CisgIEdzdEFsbG9jYXRpb25QYXJhbXMgcGFyYW1zOworCisgIGdzaXplIGFsaWdubWVudDsKKworICAvKiB3aGVuIGEgZGlzY29udGludWl0eSBpcyBwZW5kaW5nICovCisgIGdib29sZWFuIGRpc2NvbnQ7CisKKyAgLyogbGlzdCBvZiBidWZmZXJzIHRvIHB1c2ggZmlyc3QgKi8KKyAgR1NMaXN0ICpidWZmZXJzOworCisgIC8qIGlmIHdlIG5lZWQgdG8gY2xpcCB0aGlzIGJ1ZmZlci4gVGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgdW5jb21wcmVzc2VkCisgICAqIGRhdGEgKi8KKyAgZ2Jvb2xlYW4gbmVlZF9jbGlwOworCisgIC8qIGJ1ZmZlciBuZWVkcyBzb21lIGN1c3RvbSBwcm9jZXNzaW5nLCBlLmcuIHN1YnRpdGxlcyAqLworICBnYm9vbGVhbiBuZWVkX3Byb2Nlc3M7CisKKyAgLyogY3VycmVudCBwb3NpdGlvbiAqLworICBndWludDMyIHNlZ21lbnRfaW5kZXg7CisgIGd1aW50MzIgc2FtcGxlX2luZGV4OworICBHc3RDbG9ja1RpbWUgdGltZV9wb3NpdGlvbjsgICAvKiBpbiBnc3QgdGltZSAqLworICBndWludDY0IGFjY3VtdWxhdGVkX2Jhc2U7CisKKyAgLyogdGhlIEdzdCBzZWdtZW50IHdlIGFyZSBwcm9jZXNzaW5nIG91dCwgdXNlZCBmb3IgY2xpcHBpbmcgKi8KKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIC8qIHF1aWNrdGltZSBzZWdtZW50cyAqLworICBndWludDMyIG5fc2VnbWVudHM7CisgIFF0RGVtdXhTZWdtZW50ICpzZWdtZW50czsKKyAgZ2Jvb2xlYW4gZHVtbXlfc2VnbWVudDsKKyAgZ3VpbnQzMiBmcm9tX3NhbXBsZTsKKyAgZ3VpbnQzMiB0b19zYW1wbGU7CisKKyAgZ2Jvb2xlYW4gc2VudF9lb3M7CisgIEdzdFRhZ0xpc3QgKnN0cmVhbV90YWdzOworICBnYm9vbGVhbiBzZW5kX2dsb2JhbF90YWdzOworCisgIEdzdEV2ZW50ICpwZW5kaW5nX2V2ZW50OworCisgIEdzdEJ5dGVSZWFkZXIgc3RjbzsKKyAgR3N0Qnl0ZVJlYWRlciBzdHN6OworICBHc3RCeXRlUmVhZGVyIHN0c2M7CisgIEdzdEJ5dGVSZWFkZXIgc3R0czsKKyAgR3N0Qnl0ZVJlYWRlciBzdHNzOworICBHc3RCeXRlUmVhZGVyIHN0cHM7CisgIEdzdEJ5dGVSZWFkZXIgY3R0czsKKworICBnYm9vbGVhbiBjaHVua3NfYXJlX3NhbXBsZXM7ICAvKiBUUlVFIG1lYW5zIHRyZWF0IGNodW5rcyBhcyBzYW1wbGVzICovCisgIGdpbnQ2NCBzdGJsX2luZGV4OworICAvKiBzdGNvICovCisgIGd1aW50IGNvX3NpemU7CisgIEdzdEJ5dGVSZWFkZXIgY29fY2h1bms7CisgIGd1aW50MzIgZmlyc3RfY2h1bms7CisgIGd1aW50MzIgY3VycmVudF9jaHVuazsKKyAgZ3VpbnQzMiBsYXN0X2NodW5rOworICBndWludDMyIHNhbXBsZXNfcGVyX2NodW5rOworICBndWludDMyIHN0c2Rfc2FtcGxlX2Rlc2NyaXB0aW9uX2lkOworICBndWludDMyIHN0Y29fc2FtcGxlX2luZGV4OworICAvKiBzdHN6ICovCisgIGd1aW50MzIgc2FtcGxlX3NpemU7ICAgICAgICAgIC8qIDAgbWVhbnMgdmFyaWFibGUgc2l6ZXMgYXJlIHN0b3JlZCBpbiBzdHN6ICovCisgIC8qIHN0c2MgKi8KKyAgZ3VpbnQzMiBzdHNjX2luZGV4OworICBndWludDMyIG5fc2FtcGxlc19wZXJfY2h1bms7CisgIGd1aW50MzIgc3RzY19jaHVua19pbmRleDsKKyAgZ3VpbnQzMiBzdHNjX3NhbXBsZV9pbmRleDsKKyAgZ3VpbnQ2NCBjaHVua19vZmZzZXQ7CisgIC8qIHN0dHMgKi8KKyAgZ3VpbnQzMiBzdHRzX2luZGV4OworICBndWludDMyIHN0dHNfc2FtcGxlczsKKyAgZ3VpbnQzMiBuX3NhbXBsZV90aW1lczsKKyAgZ3VpbnQzMiBzdHRzX3NhbXBsZV9pbmRleDsKKyAgZ3VpbnQ2NCBzdHRzX3RpbWU7CisgIGd1aW50MzIgc3R0c19kdXJhdGlvbjsKKyAgLyogc3RzcyAqLworICBnYm9vbGVhbiBzdHNzX3ByZXNlbnQ7CisgIGd1aW50MzIgbl9zYW1wbGVfc3luY3M7CisgIGd1aW50MzIgc3Rzc19pbmRleDsKKyAgLyogc3RwcyAqLworICBnYm9vbGVhbiBzdHBzX3ByZXNlbnQ7CisgIGd1aW50MzIgbl9zYW1wbGVfcGFydGlhbF9zeW5jczsKKyAgZ3VpbnQzMiBzdHBzX2luZGV4OworICBRdERlbXV4UmFuZG9tQWNjZXNzRW50cnkgKnJhX2VudHJpZXM7CisgIGd1aW50IG5fcmFfZW50cmllczsKKworICBjb25zdCBRdERlbXV4UmFuZG9tQWNjZXNzRW50cnkgKnBlbmRpbmdfc2VlazsKKworICAvKiBjdHRzICovCisgIGdib29sZWFuIGN0dHNfcHJlc2VudDsKKyAgZ3VpbnQzMiBuX2NvbXBvc2l0aW9uX3RpbWVzOworICBndWludDMyIGN0dHNfaW5kZXg7CisgIGd1aW50MzIgY3R0c19zYW1wbGVfaW5kZXg7CisgIGd1aW50MzIgY3R0c19jb3VudDsKKyAgZ2ludDMyIGN0dHNfc29mZnNldDsKKworICAvKiBjc2xnICovCisgIGd1aW50MzIgY3NsZ19zaGlmdDsKKworICAvKiBmcmFnbWVudGVkICovCisgIGdib29sZWFuIHBhcnNlZF90cmV4OworICBndWludDMyIGRlZl9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXg7IC8qIGluZGV4IGlzIDEtYmFzZWQgKi8KKyAgZ3VpbnQzMiBkZWZfc2FtcGxlX2R1cmF0aW9uOworICBndWludDMyIGRlZl9zYW1wbGVfc2l6ZTsKKyAgZ3VpbnQzMiBkZWZfc2FtcGxlX2ZsYWdzOworCisgIGdib29sZWFuIGRpc2FibGVkOworCisgIC8qIHN0ZXJlb3Njb3BpYyB2aWRlbyBzdHJlYW1zICovCisgIEdzdFZpZGVvTXVsdGl2aWV3TW9kZSBtdWx0aXZpZXdfbW9kZTsKKyAgR3N0VmlkZW9NdWx0aXZpZXdGbGFncyBtdWx0aXZpZXdfZmxhZ3M7CisKKyAgLyogcHJvdGVjdGVkIHN0cmVhbXMgKi8KKyAgZ2Jvb2xlYW4gcHJvdGVjdGVkOworICBndWludDMyIHByb3RlY3Rpb25fc2NoZW1lX3R5cGU7CisgIGd1aW50MzIgcHJvdGVjdGlvbl9zY2hlbWVfdmVyc2lvbjsKKyAgZ3BvaW50ZXIgcHJvdGVjdGlvbl9zY2hlbWVfaW5mbzsgICAgICAvKiBzcGVjaWZpYyB0byB0aGUgcHJvdGVjdGlvbiBzY2hlbWUgKi8KKyAgR1F1ZXVlIHByb3RlY3Rpb25fc2NoZW1lX2V2ZW50X3F1ZXVlOworfTsKKworLyogQ29udGFpbnMgcHJvcGVydGllcyBhbmQgY3J5cHRvZ3JhcGhpYyBpbmZvIGZvciBhIHNldCBvZiBzYW1wbGVzIGZyb20gYQorICogdHJhY2sgcHJvdGVjdGVkIHVzaW5nIENvbW1vbiBFbmNyeXB0aW9uIChjZW5jKSAqLworc3RydWN0IF9RdERlbXV4Q2VuY1NhbXBsZVNldEluZm8KK3sKKyAgR3N0U3RydWN0dXJlICpkZWZhdWx0X3Byb3BlcnRpZXM7CisKKyAgLyogQGNyeXB0b19pbmZvIGhvbGRzIG9uZSBHc3RTdHJ1Y3R1cmUgcGVyIHNhbXBsZSAqLworICBHUHRyQXJyYXkgKmNyeXB0b19pbmZvOworfTsKKworc3RhdGljIGNvbnN0IGdjaGFyICoKK3F0X2RlbXV4X3N0YXRlX3N0cmluZyAoZW51bSBRdERlbXV4U3RhdGUgc3RhdGUpCit7CisgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICBjYXNlIFFUREVNVVhfU1RBVEVfSU5JVElBTDoKKyAgICAgIHJldHVybiAiPElOSVRJQUw+IjsKKyAgICBjYXNlIFFUREVNVVhfU1RBVEVfSEVBREVSOgorICAgICAgcmV0dXJuICI8SEVBREVSPiI7CisgICAgY2FzZSBRVERFTVVYX1NUQVRFX01PVklFOgorICAgICAgcmV0dXJuICI8TU9WSUU+IjsKKyAgICBjYXNlIFFUREVNVVhfU1RBVEVfQlVGRkVSX01EQVQ6CisgICAgICByZXR1cm4gIjxCVUZGRVJfTURBVD4iOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gIjxVTktOT1dOPiI7CisgIH0KK30KKworc3RhdGljIEdOb2RlICpxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKEdOb2RlICogbm9kZSwgZ3VpbnQzMiBmb3VyY2MpOworc3RhdGljIEdOb2RlICpxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGVfZnVsbCAoR05vZGUgKiBub2RlLAorICAgIGd1aW50MzIgZm91cmNjLCBHc3RCeXRlUmVhZGVyICogcGFyc2VyKTsKK3N0YXRpYyBHTm9kZSAqcXRkZW11eF90cmVlX2dldF9zaWJsaW5nX2J5X3R5cGUgKEdOb2RlICogbm9kZSwgZ3VpbnQzMiBmb3VyY2MpOworc3RhdGljIEdOb2RlICpxdGRlbXV4X3RyZWVfZ2V0X3NpYmxpbmdfYnlfdHlwZV9mdWxsIChHTm9kZSAqIG5vZGUsCisgICAgZ3VpbnQzMiBmb3VyY2MsIEdzdEJ5dGVSZWFkZXIgKiBwYXJzZXIpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBxdGRlbXV4X2FkZF9mcmFnbWVudGVkX3NhbXBsZXMgKEdzdFFURGVtdXggKiBxdGRlbXV4KTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9xdGRlbXV4X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3F1aWNrdGltZTsgdmlkZW8vbWoyOyBhdWRpby94LW00YTsgIgorICAgICAgICAiYXBwbGljYXRpb24veC0zZ3AiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcXRkZW11eF92aWRlb3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInZpZGVvXyV1IiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9xdGRlbXV4X2F1ZGlvc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgiYXVkaW9fJXUiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfU09NRVRJTUVTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3F0ZGVtdXhfc3Vic3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3VidGl0bGVfJXUiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfU09NRVRJTUVTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCisjZGVmaW5lIGdzdF9xdGRlbXV4X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFFURGVtdXgsIGdzdF9xdGRlbXV4LCBHU1RfVFlQRV9FTEVNRU5UKTsKKworc3RhdGljIHZvaWQgZ3N0X3F0ZGVtdXhfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBndWludDMyCitnc3RfcXRkZW11eF9maW5kX2luZGV4X2xpbmVhciAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHIsCisgICAgR3N0Q2xvY2tUaW1lIG1lZGlhX3RpbWUpOworc3RhdGljIGd1aW50MzIKK2dzdF9xdGRlbXV4X2ZpbmRfaW5kZXhfZm9yX2dpdmVuX21lZGlhX29mZnNldF9saW5lYXIgKEdzdFFURGVtdXggKiBxdGRlbXV4LAorICAgIFF0RGVtdXhTdHJlYW0gKiBzdHIsIGdpbnQ2NCBtZWRpYV9vZmZzZXQpOworCisjaWYgMAorc3RhdGljIHZvaWQgZ3N0X3F0ZGVtdXhfc2V0X2luZGV4IChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0SW5kZXggKiBpbmRleCk7CitzdGF0aWMgR3N0SW5kZXggKmdzdF9xdGRlbXV4X2dldF9pbmRleCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpOworI2VuZGlmCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyBnYm9vbGVhbiBxdGRlbXV4X3NpbmtfYWN0aXZhdGUgKEdzdFBhZCAqIHNpbmtwYWQsIEdzdE9iamVjdCAqIHBhcmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gcXRkZW11eF9zaW5rX2FjdGl2YXRlX21vZGUgKEdzdFBhZCAqIHNpbmtwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSk7CisKK3N0YXRpYyB2b2lkIGdzdF9xdGRlbXV4X2xvb3AgKEdzdFBhZCAqIHBhZCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcXRkZW11eF9jaGFpbiAoR3N0UGFkICogc2lua3BhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGluYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcXRkZW11eF9oYW5kbGVfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3F0ZGVtdXhfc2V0Y2FwcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcXRkZW11eF9jb25maWd1cmVfc3RyZWFtIChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtKTsKK3N0YXRpYyB2b2lkIGdzdF9xdGRlbXV4X3N0cmVhbV9jaGVja19hbmRfY2hhbmdlX3N0c2RfaW5kZXggKEdzdFFURGVtdXggKiBkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9xdGRlbXV4X3Byb2Nlc3NfYWRhcHRlciAoR3N0UVREZW11eCAqIGRlbXV4LAorICAgIGdib29sZWFuIGZvcmNlKTsKKworc3RhdGljIGdib29sZWFuIHF0ZGVtdXhfcGFyc2VfbW9vdiAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgY29uc3QgZ3VpbnQ4ICogYnVmZmVyLCBndWludCBsZW5ndGgpOworc3RhdGljIGdib29sZWFuIHF0ZGVtdXhfcGFyc2Vfbm9kZSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdOb2RlICogbm9kZSwKKyAgICBjb25zdCBndWludDggKiBidWZmZXIsIGd1aW50IGxlbmd0aCk7CitzdGF0aWMgZ2Jvb2xlYW4gcXRkZW11eF9wYXJzZV90cmVlIChHc3RRVERlbXV4ICogcXRkZW11eCk7CitzdGF0aWMgdm9pZCBxdGRlbXV4X3BhcnNlX3VkdGEgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwKKyAgICBHTm9kZSAqIHVkdGEpOworCitzdGF0aWMgdm9pZCBnc3RfcXRkZW11eF9oYW5kbGVfZXNkcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwgUXREZW11eFN0cmVhbVN0c2RFbnRyeSAqIGVudHJ5LCBHTm9kZSAqIGVzZHMsCisgICAgR3N0VGFnTGlzdCAqIGxpc3QpOworc3RhdGljIEdzdENhcHMgKnF0ZGVtdXhfdmlkZW9fY2FwcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwgUXREZW11eFN0cmVhbVN0c2RFbnRyeSAqIGVudHJ5LCBndWludDMyIGZvdXJjYywKKyAgICBjb25zdCBndWludDggKiBzdHNkX2VudHJ5X2RhdGEsIGdjaGFyICoqIGNvZGVjX25hbWUpOworc3RhdGljIEdzdENhcHMgKnF0ZGVtdXhfYXVkaW9fY2FwcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwgUXREZW11eFN0cmVhbVN0c2RFbnRyeSAqIGVudHJ5LCBndWludDMyIGZvdXJjYywKKyAgICBjb25zdCBndWludDggKiBkYXRhLCBpbnQgbGVuLCBnY2hhciAqKiBjb2RlY19uYW1lKTsKK3N0YXRpYyBHc3RDYXBzICpxdGRlbXV4X3N1Yl9jYXBzIChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwKKyAgICBRdERlbXV4U3RyZWFtU3RzZEVudHJ5ICogZW50cnksIGd1aW50MzIgZm91cmNjLCBjb25zdCBndWludDggKiBkYXRhLAorICAgIGdjaGFyICoqIGNvZGVjX25hbWUpOworc3RhdGljIEdzdENhcHMgKnF0ZGVtdXhfZ2VuZXJpY19jYXBzIChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtLCBRdERlbXV4U3RyZWFtU3RzZEVudHJ5ICogZW50cnksIGd1aW50MzIgZm91cmNjLAorICAgIGNvbnN0IGd1aW50OCAqIHN0c2RfZW50cnlfZGF0YSwgZ2NoYXIgKiogY29kZWNfbmFtZSk7CisKK3N0YXRpYyBnYm9vbGVhbiBxdGRlbXV4X3BhcnNlX3NhbXBsZXMgKEdzdFFURGVtdXggKiBxdGRlbXV4LAorICAgIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sIGd1aW50MzIgbik7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBxdGRlbXV4X2V4cG9zZV9zdHJlYW1zIChHc3RRVERlbXV4ICogcXRkZW11eCk7CitzdGF0aWMgdm9pZCBnc3RfcXRkZW11eF9zdHJlYW1fZnJlZSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSk7CitzdGF0aWMgdm9pZCBnc3RfcXRkZW11eF9zdHJlYW1fY2xlYXIgKEdzdFFURGVtdXggKiBxdGRlbXV4LAorICAgIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0pOworc3RhdGljIHZvaWQgZ3N0X3F0ZGVtdXhfcmVtb3ZlX3N0cmVhbSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIGludCBpbmRleCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBxdGRlbXV4X3ByZXBhcmVfc3RyZWFtcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgpOworc3RhdGljIHZvaWQgcXRkZW11eF9kb19hbGxvY2F0aW9uIChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcXRkZW11eF9hY3RpdmF0ZV9zZWdtZW50IChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtLCBndWludDMyIHNlZ19pZHgsIEdzdENsb2NrVGltZSBvZmZzZXQpOworc3RhdGljIGdib29sZWFuIGdzdF9xdGRlbXV4X3N0cmVhbV91cGRhdGVfc2VnbWVudCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwgZ2ludCBzZWdfaWR4LCBHc3RDbG9ja1RpbWUgb2Zmc2V0LAorICAgIEdzdENsb2NrVGltZSAqIF9zdGFydCwgR3N0Q2xvY2tUaW1lICogX3N0b3ApOworc3RhdGljIHZvaWQgZ3N0X3F0ZGVtdXhfc2VuZF9nYXBfZm9yX3NlZ21lbnQgKEdzdFFURGVtdXggKiBkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtLCBnaW50IHNlZ21lbnRfaW5kZXgsIEdzdENsb2NrVGltZSBwb3MpOworCitzdGF0aWMgZ2Jvb2xlYW4gcXRkZW11eF9wdWxsX21mcm9fbWZyYSAoR3N0UVREZW11eCAqIHF0ZGVtdXgpOworc3RhdGljIHZvaWQgY2hlY2tfdXBkYXRlX2R1cmF0aW9uIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uKTsKKworc3RhdGljIGdjaGFyICpxdGRlbXV4X3V1aWRfYnl0ZXNfdG9fc3RyaW5nIChnY29uc3Rwb2ludGVyIHV1aWRfYnl0ZXMpOworCitzdGF0aWMgR3N0U3RydWN0dXJlICpxdGRlbXV4X2dldF9jZW5jX3NhbXBsZV9wcm9wZXJ0aWVzIChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtLCBndWludCBzYW1wbGVfaW5kZXgpOworc3RhdGljIHZvaWQgZ3N0X3F0ZGVtdXhfYXBwZW5kX3Byb3RlY3Rpb25fc3lzdGVtX2lkIChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBjb25zdCBnY2hhciAqIGlkKTsKK3N0YXRpYyB2b2lkIHF0ZGVtdXhfZ3N0X3N0cnVjdHVyZV9mcmVlIChHc3RTdHJ1Y3R1cmUgKiBnc3RzdHJ1Y3R1cmUpOworCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfY2xhc3NfaW5pdCAoR3N0UVREZW11eENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBwYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X3F0ZGVtdXhfZGlzcG9zZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3F0ZGVtdXhfY2hhbmdlX3N0YXRlKTsKKyNpZiAwCisgIGdzdGVsZW1lbnRfY2xhc3MtPnNldF9pbmRleCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcXRkZW11eF9zZXRfaW5kZXgpOworICBnc3RlbGVtZW50X2NsYXNzLT5nZXRfaW5kZXggPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3F0ZGVtdXhfZ2V0X2luZGV4KTsKKyNlbmRpZgorCisgIGdzdF90YWdfcmVnaXN0ZXJfbXVzaWNicmFpbnpfdGFncyAoKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcXRkZW11eF9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3F0ZGVtdXhfdmlkZW9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcXRkZW11eF9hdWRpb3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9xdGRlbXV4X3N1YnNyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJRdWlja1RpbWUgZGVtdXhlciIsCisgICAgICAiQ29kZWMvRGVtdXhlciIsCisgICAgICAiRGVtdWx0aXBsZXggYSBRdWlja1RpbWUgZmlsZSBpbnRvIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zIiwKKyAgICAgICJEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4sIFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHF0ZGVtdXhfZGVidWcsICJxdGRlbXV4IiwgMCwgInF0ZGVtdXggcGx1Z2luIik7CisKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X2luaXQgKEdzdFFURGVtdXggKiBxdGRlbXV4KQoreworICBxdGRlbXV4LT5zaW5rcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZ3N0X3F0ZGVtdXhfc2lua190ZW1wbGF0ZSwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZhdGVfZnVuY3Rpb24gKHF0ZGVtdXgtPnNpbmtwYWQsIHF0ZGVtdXhfc2lua19hY3RpdmF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2YXRlbW9kZV9mdW5jdGlvbiAocXRkZW11eC0+c2lua3BhZCwKKyAgICAgIHF0ZGVtdXhfc2lua19hY3RpdmF0ZV9tb2RlKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHF0ZGVtdXgtPnNpbmtwYWQsIGdzdF9xdGRlbXV4X2NoYWluKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHF0ZGVtdXgtPnNpbmtwYWQsIGdzdF9xdGRlbXV4X2hhbmRsZV9zaW5rX2V2ZW50KTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocXRkZW11eCksIHF0ZGVtdXgtPnNpbmtwYWQpOworCisgIHF0ZGVtdXgtPnN0YXRlID0gUVRERU1VWF9TVEFURV9JTklUSUFMOworICBxdGRlbXV4LT5wdWxsYmFzZWQgPSBGQUxTRTsKKyAgcXRkZW11eC0+cG9zdGVkX3JlZGlyZWN0ID0gRkFMU0U7CisgIHF0ZGVtdXgtPm5lZWRlZGJ5dGVzID0gMTY7CisgIHF0ZGVtdXgtPnRvZHJvcCA9IDA7CisgIHF0ZGVtdXgtPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIHF0ZGVtdXgtPm9mZnNldCA9IDA7CisgIHF0ZGVtdXgtPmZpcnN0X21kYXQgPSAtMTsKKyAgcXRkZW11eC0+Z290X21vb3YgPSBGQUxTRTsKKyAgcXRkZW11eC0+bWRhdG9mZnNldCA9IC0xOworICBxdGRlbXV4LT5tZGF0YnVmZmVyID0gTlVMTDsKKyAgcXRkZW11eC0+cmVzdG9yZWRhdGFfYnVmZmVyID0gTlVMTDsKKyAgcXRkZW11eC0+cmVzdG9yZWRhdGFfb2Zmc2V0ID0gLTE7CisgIHF0ZGVtdXgtPmZyYWdtZW50X3N0YXJ0ID0gLTE7CisgIHF0ZGVtdXgtPmZyYWdtZW50X3N0YXJ0X29mZnNldCA9IC0xOworICBxdGRlbXV4LT5tZWRpYV9jYXBzID0gTlVMTDsKKyAgcXRkZW11eC0+ZXhwb3NlZCA9IEZBTFNFOworICBxdGRlbXV4LT5tc3NfbW9kZSA9IEZBTFNFOworICBxdGRlbXV4LT5wZW5kaW5nX25ld3NlZ21lbnQgPSBOVUxMOworICBxdGRlbXV4LT51cHN0cmVhbV9mb3JtYXRfaXNfdGltZSA9IEZBTFNFOworICBxdGRlbXV4LT5oYXZlX2dyb3VwX2lkID0gRkFMU0U7CisgIHF0ZGVtdXgtPmdyb3VwX2lkID0gR19NQVhVSU5UOworICBxdGRlbXV4LT5jZW5jX2F1eF9pbmZvX29mZnNldCA9IDA7CisgIHF0ZGVtdXgtPmNlbmNfYXV4X2luZm9fc2l6ZXMgPSBOVUxMOworICBxdGRlbXV4LT5jZW5jX2F1eF9zYW1wbGVfY291bnQgPSAwOworICBxdGRlbXV4LT5wcm90ZWN0aW9uX3N5c3RlbV9pZHMgPSBOVUxMOworICBnX3F1ZXVlX2luaXQgKCZxdGRlbXV4LT5wcm90ZWN0aW9uX2V2ZW50X3F1ZXVlKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnF0ZGVtdXgtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIHF0ZGVtdXgtPnRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZ3N0X3RhZ19saXN0X3NldF9zY29wZSAocXRkZW11eC0+dGFnX2xpc3QsIEdTVF9UQUdfU0NPUEVfR0xPQkFMKTsKKyAgcXRkZW11eC0+Zmxvd2NvbWJpbmVyID0gZ3N0X2Zsb3dfY29tYmluZXJfbmV3ICgpOworCisgIEdTVF9PQkpFQ1RfRkxBR19TRVQgKHF0ZGVtdXgsIEdTVF9FTEVNRU5UX0ZMQUdfSU5ERVhBQkxFKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFFURGVtdXggKnF0ZGVtdXggPSBHU1RfUVRERU1VWCAob2JqZWN0KTsKKworICBpZiAocXRkZW11eC0+YWRhcHRlcikgeworICAgIGdfb2JqZWN0X3VucmVmIChHX09CSkVDVCAocXRkZW11eC0+YWRhcHRlcikpOworICAgIHF0ZGVtdXgtPmFkYXB0ZXIgPSBOVUxMOworICB9CisgIGdzdF90YWdfbGlzdF91bnJlZiAocXRkZW11eC0+dGFnX2xpc3QpOworICBnc3RfZmxvd19jb21iaW5lcl9mcmVlIChxdGRlbXV4LT5mbG93Y29tYmluZXIpOworICBnX3F1ZXVlX2ZvcmVhY2ggKCZxdGRlbXV4LT5wcm90ZWN0aW9uX2V2ZW50X3F1ZXVlLCAoR0Z1bmMpIGdzdF9ldmVudF91bnJlZiwKKyAgICAgIE5VTEwpOworICBnX3F1ZXVlX2NsZWFyICgmcXRkZW11eC0+cHJvdGVjdGlvbl9ldmVudF9xdWV1ZSk7CisKKyAgZ19mcmVlIChxdGRlbXV4LT5jZW5jX2F1eF9pbmZvX3NpemVzKTsKKyAgcXRkZW11eC0+Y2VuY19hdXhfaW5mb19zaXplcyA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9wb3N0X25vX3BsYXlhYmxlX3N0cmVhbV9lcnJvciAoR3N0UVREZW11eCAqIHF0ZGVtdXgpCit7CisgIGlmIChxdGRlbXV4LT5wb3N0ZWRfcmVkaXJlY3QpIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRkZW11eCwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgKF8oIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIpKSwKKyAgICAgICAgKCJubyBrbm93biBzdHJlYW1zIGZvdW5kLCBhIHJlZGlyZWN0IG1lc3NhZ2UgaGFzIGJlZW4gcG9zdGVkIikpOworICB9IGVsc2UgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdGRlbXV4LCBTVFJFQU0sIERFTVVYLAorICAgICAgICAoXygiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIikpLAorICAgICAgICAoIm5vIGtub3duIHN0cmVhbXMgZm91bmQiKSk7CisgIH0KK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitfZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ3BvaW50ZXIgbWVtLCBnc2l6ZSBzaXplLCBHRnJlZUZ1bmMgZnJlZV9mdW5jKQoreworICByZXR1cm4gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChmcmVlX2Z1bmMgPyAwIDogR1NUX01FTU9SWV9GTEFHX1JFQURPTkxZLAorICAgICAgbWVtLCBzaXplLCAwLCBzaXplLCBtZW0sIGZyZWVfZnVuYyk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcXRkZW11eF9wdWxsX2F0b20gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBndWludDY0IG9mZnNldCwgZ3VpbnQ2NCBzaXplLAorICAgIEdzdEJ1ZmZlciAqKiBidWYpCit7CisgIEdzdEZsb3dSZXR1cm4gZmxvdzsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdzaXplIGJzaXplOworCisgIGlmIChHX1VOTElLRUxZIChzaXplID09IDApKSB7CisgICAgR3N0Rmxvd1JldHVybiByZXQ7CisgICAgR3N0QnVmZmVyICp0bXAgPSBOVUxMOworCisgICAgcmV0ID0gZ3N0X3F0ZGVtdXhfcHVsbF9hdG9tIChxdGRlbXV4LCBvZmZzZXQsIHNpemVvZiAoZ3VpbnQzMiksICZ0bXApOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICByZXR1cm4gcmV0OworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKHRtcCwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBzaXplID0gUVRfVUlOVDMyIChtYXAuZGF0YSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInNpemUgMHglMDgiIEdfR0lOVDY0X01PRElGSUVSICJ4Iiwgc2l6ZSk7CisKKyAgICBnc3RfYnVmZmVyX3VubWFwICh0bXAsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKHRtcCk7CisgIH0KKworICAvKiBTYW5pdHkgY2hlY2s6IGNhdGNoIGJvZ3VzIHNpemVzIChmdXp6ZWQvYnJva2VuIGZpbGVzKSAqLworICBpZiAoR19VTkxJS0VMWSAoc2l6ZSA+IFFUREVNVVhfTUFYX0FUT01fU0laRSkpIHsKKyAgICBpZiAocXRkZW11eC0+c3RhdGUgIT0gUVRERU1VWF9TVEFURV9NT1ZJRSAmJiBxdGRlbXV4LT5nb3RfbW9vdikgeworICAgICAgLyogd2UncmUgcHVsbGluZyBoZWFkZXIgYnV0IGFscmVhZHkgZ290IG1vc3QgaW50ZXJlc3RpbmcgYml0cywKKyAgICAgICAqIHNvIG5ldmVyIG1pbmQgdGhlIHJlc3QgKGUuZy4gdGFncykgKHRoYXQgbXVjaCkgKi8KKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgImF0b20gaGFzIGJvZ3VzIHNpemUgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICBzaXplKTsKKyAgICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdGRlbXV4LCBTVFJFQU0sIERFTVVYLAorICAgICAgICAgIChfKCJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iKSksCisgICAgICAgICAgKCJhdG9tIGhhcyBib2d1cyBzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHNpemUpKTsKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgICB9CisgIH0KKworICBmbG93ID0gZ3N0X3BhZF9wdWxsX3JhbmdlIChxdGRlbXV4LT5zaW5rcGFkLCBvZmZzZXQsIHNpemUsIGJ1Zik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGZsb3cgIT0gR1NUX0ZMT1dfT0spKQorICAgIHJldHVybiBmbG93OworCisgIGJzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoKmJ1Zik7CisgIC8qIENhdGNoIHNob3J0IHJlYWRzIC0gd2UgZG9uJ3Qgd2FudCBhbnkgcGFydGlhbCBhdG9tcyAqLworICBpZiAoR19VTkxJS0VMWSAoYnNpemUgPCBzaXplKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgInNob3J0IHJlYWQ6ICUiIEdfR1NJWkVfRk9STUFUICIgPCAlIiBHX0dVSU5UNjRfRk9STUFULCBic2l6ZSwgc2l6ZSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoKmJ1Zik7CisgICAgKmJ1ZiA9IE5VTEw7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKyAgfQorCisgIHJldHVybiBmbG93OworfQorCisjaWYgMQorc3RhdGljIGdib29sZWFuCitnc3RfcXRkZW11eF9zcmNfY29udmVydCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RGb3JtYXQgc3JjX2Zvcm1hdCwgZ2ludDY0IHNyY192YWx1ZSwgR3N0Rm9ybWF0IGRlc3RfZm9ybWF0LAorICAgIGdpbnQ2NCAqIGRlc3RfdmFsdWUpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbSA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgZ2ludDMyIGluZGV4OworCisgIGlmIChzdHJlYW0tPnN1YnR5cGUgIT0gRk9VUkNDX3ZpZGUpIHsKKyAgICByZXMgPSBGQUxTRTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBzd2l0Y2ggKHNyY19mb3JtYXQpIHsKKyAgICBjYXNlIEdTVF9GT1JNQVRfVElNRToKKyAgICAgIHN3aXRjaCAoZGVzdF9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOnsKKyAgICAgICAgICBpbmRleCA9IGdzdF9xdGRlbXV4X2ZpbmRfaW5kZXhfbGluZWFyIChxdGRlbXV4LCBzdHJlYW0sIHNyY192YWx1ZSk7CisgICAgICAgICAgaWYgKC0xID09IGluZGV4KSB7CisgICAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAqZGVzdF92YWx1ZSA9IHN0cmVhbS0+c2FtcGxlc1tpbmRleF0ub2Zmc2V0OworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIkZvcm1hdCBDb252ZXJzaW9uIFRpbWUtPk9mZnNldCA6JSIKKyAgICAgICAgICAgICAgR1NUX1RJTUVfRk9STUFUICItPiUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHNyY192YWx1ZSksICpkZXN0X3ZhbHVlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgc3dpdGNoIChkZXN0X2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfVElNRTp7CisgICAgICAgICAgaW5kZXggPQorICAgICAgICAgICAgICBnc3RfcXRkZW11eF9maW5kX2luZGV4X2Zvcl9naXZlbl9tZWRpYV9vZmZzZXRfbGluZWFyIChxdGRlbXV4LAorICAgICAgICAgICAgICBzdHJlYW0sIHNyY192YWx1ZSk7CisKKyAgICAgICAgICBpZiAoLTEgPT0gaW5kZXgpIHsKKyAgICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgIH0KKworICAgICAgICAgICpkZXN0X3ZhbHVlID0KKyAgICAgICAgICAgICAgUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUgKHN0cmVhbSwKKyAgICAgICAgICAgICAgc3RyZWFtLT5zYW1wbGVzW2luZGV4XS50aW1lc3RhbXApOworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAgICJGb3JtYXQgQ29udmVyc2lvbiBPZmZzZXQtPlRpbWUgOiUiIEdfR1VJTlQ2NF9GT1JNQVQgIi0+JSIKKyAgICAgICAgICAgICAgR1NUX1RJTUVfRk9STUFULCBzcmNfdmFsdWUsIEdTVF9USU1FX0FSR1MgKCpkZXN0X3ZhbHVlKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisKK2RvbmU6CisgIHJldHVybiByZXM7Cit9CisjZW5kaWYKKworc3RhdGljIGdib29sZWFuCitnc3RfcXRkZW11eF9nZXRfZHVyYXRpb24gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RDbG9ja1RpbWUgKiBkdXJhdGlvbikKK3sKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgKmR1cmF0aW9uID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBpZiAocXRkZW11eC0+ZHVyYXRpb24gIT0gMCAmJgorICAgICAgcXRkZW11eC0+ZHVyYXRpb24gIT0gR19NQVhJTlQ2NCAmJiBxdGRlbXV4LT50aW1lc2NhbGUgIT0gMCkgeworICAgICpkdXJhdGlvbiA9IFFUVElNRV9UT19HU1RUSU1FIChxdGRlbXV4LCBxdGRlbXV4LT5kdXJhdGlvbik7CisgICAgcmVzID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICAqZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcXRkZW11eF9oYW5kbGVfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKyAgR3N0UVREZW11eCAqcXRkZW11eCA9IEdTVF9RVERFTVVYIChwYXJlbnQpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICIlcyBxdWVyeSIsIEdTVF9RVUVSWV9UWVBFX05BTUUgKHF1ZXJ5KSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfUE9TSVRJT046eworICAgICAgR3N0Rm9ybWF0IGZtdDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3Bvc2l0aW9uIChxdWVyeSwgJmZtdCwgTlVMTCk7CisgICAgICBpZiAoZm10ID09IEdTVF9GT1JNQVRfVElNRQorICAgICAgICAgICYmIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChxdGRlbXV4LT5zZWdtZW50LnBvc2l0aW9uKSkgeworICAgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgICAgcXRkZW11eC0+c2VnbWVudC5wb3NpdGlvbik7CisgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICB9CisgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUVVFUllfRFVSQVRJT046eworICAgICAgR3N0Rm9ybWF0IGZtdDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2R1cmF0aW9uIChxdWVyeSwgJmZtdCwgTlVMTCk7CisgICAgICBpZiAoZm10ID09IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgICAvKiBGaXJzdCB0cnkgdG8gcXVlcnkgdXBzdHJlYW0gKi8KKyAgICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgICBpZiAoIXJlcykgeworICAgICAgICAgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKKyAgICAgICAgICBpZiAoZ3N0X3F0ZGVtdXhfZ2V0X2R1cmF0aW9uIChxdGRlbXV4LCAmZHVyYXRpb24pICYmIGR1cmF0aW9uID4gMCkgeworICAgICAgICAgICAgZ3N0X3F1ZXJ5X3NldF9kdXJhdGlvbiAocXVlcnksIEdTVF9GT1JNQVRfVElNRSwgZHVyYXRpb24pOworICAgICAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9DT05WRVJUOnsKKyAgICAgIEdzdEZvcm1hdCBzcmNfZm10LCBkZXN0X2ZtdDsKKyAgICAgIGdpbnQ2NCBzcmNfdmFsdWUsIGRlc3RfdmFsdWUgPSAwOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY29udmVydCAocXVlcnksICZzcmNfZm10LCAmc3JjX3ZhbHVlLCAmZGVzdF9mbXQsIE5VTEwpOworCisgICAgICByZXMgPSBnc3RfcXRkZW11eF9zcmNfY29udmVydCAocXRkZW11eCwgcGFkLAorICAgICAgICAgIHNyY19mbXQsIHNyY192YWx1ZSwgZGVzdF9mbXQsICZkZXN0X3ZhbHVlKTsKKyAgICAgIGlmIChyZXMpCisgICAgICAgIGdzdF9xdWVyeV9zZXRfY29udmVydCAocXVlcnksIHNyY19mbXQsIHNyY192YWx1ZSwgZGVzdF9mbXQsIGRlc3RfdmFsdWUpOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfRk9STUFUUzoKKyAgICAgIGdzdF9xdWVyeV9zZXRfZm9ybWF0cyAocXVlcnksIDIsIEdTVF9GT1JNQVRfVElNRSwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUVVFUllfU0VFS0lORzp7CisgICAgICBHc3RGb3JtYXQgZm10OworICAgICAgZ2Jvb2xlYW4gc2Vla2FibGU7CisKKyAgICAgIC8qIHRyeSB1cHN0cmVhbSBmaXJzdCAqLworICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworCisgICAgICBpZiAoIXJlcykgeworICAgICAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksICZmbXQsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoZm10ID09IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgICAgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKKworICAgICAgICAgIGdzdF9xdGRlbXV4X2dldF9kdXJhdGlvbiAocXRkZW11eCwgJmR1cmF0aW9uKTsKKyAgICAgICAgICBzZWVrYWJsZSA9IFRSVUU7CisgICAgICAgICAgaWYgKCFxdGRlbXV4LT5wdWxsYmFzZWQpIHsKKyAgICAgICAgICAgIEdzdFF1ZXJ5ICpxOworCisgICAgICAgICAgICAvKiB3ZSBtaWdodCBiZSBhYmxlIHdpdGggaGVscCBmcm9tIHVwc3RyZWFtICovCisgICAgICAgICAgICBzZWVrYWJsZSA9IEZBTFNFOworICAgICAgICAgICAgcSA9IGdzdF9xdWVyeV9uZXdfc2Vla2luZyAoR1NUX0ZPUk1BVF9CWVRFUyk7CisgICAgICAgICAgICBpZiAoZ3N0X3BhZF9wZWVyX3F1ZXJ5IChxdGRlbXV4LT5zaW5rcGFkLCBxKSkgeworICAgICAgICAgICAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocSwgJmZtdCwgJnNlZWthYmxlLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJ1cHN0cmVhbSBCWVRFIHNlZWthYmxlICVkIiwgc2Vla2FibGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ3N0X3F1ZXJ5X3VucmVmIChxKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ3N0X3F1ZXJ5X3NldF9zZWVraW5nIChxdWVyeSwgR1NUX0ZPUk1BVF9USU1FLCBzZWVrYWJsZSwgMCwgZHVyYXRpb24pOworICAgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9TRUdNRU5UOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisgICAgICBnaW50NjQgc3RhcnQsIHN0b3A7CisKKyAgICAgIGZvcm1hdCA9IHF0ZGVtdXgtPnNlZ21lbnQuZm9ybWF0OworCisgICAgICBzdGFydCA9CisgICAgICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZxdGRlbXV4LT5zZWdtZW50LCBmb3JtYXQsCisgICAgICAgICAgcXRkZW11eC0+c2VnbWVudC5zdGFydCk7CisgICAgICBpZiAoKHN0b3AgPSBxdGRlbXV4LT5zZWdtZW50LnN0b3ApID09IC0xKQorICAgICAgICBzdG9wID0gcXRkZW11eC0+c2VnbWVudC5kdXJhdGlvbjsKKyAgICAgIGVsc2UKKyAgICAgICAgc3RvcCA9IGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmcXRkZW11eC0+c2VnbWVudCwgZm9ybWF0LCBzdG9wKTsKKworICAgICAgZ3N0X3F1ZXJ5X3NldF9zZWdtZW50IChxdWVyeSwgcXRkZW11eC0+c2VnbWVudC5yYXRlLCBmb3JtYXQsIHN0YXJ0LCBzdG9wKTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X3B1c2hfdGFncyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0pCit7CisgIGlmIChHX0xJS0VMWSAoc3RyZWFtLT5wYWQpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIkNoZWNraW5nIHBhZCAlczolcyBmb3IgdGFncyIsCisgICAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAoc3RyZWFtLT5wYWQpKTsKKworICAgIGlmICghZ3N0X3RhZ19saXN0X2lzX2VtcHR5IChzdHJlYW0tPnN0cmVhbV90YWdzKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIlNlbmRpbmcgdGFncyAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgICBzdHJlYW0tPnN0cmVhbV90YWdzKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5wYWQsCisgICAgICAgICAgZ3N0X2V2ZW50X25ld190YWcgKGdzdF90YWdfbGlzdF9yZWYgKHN0cmVhbS0+c3RyZWFtX3RhZ3MpKSk7CisgICAgfQorCisgICAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbS0+c2VuZF9nbG9iYWxfdGFncykpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJTZW5kaW5nIGdsb2JhbCB0YWdzICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICAgIHF0ZGVtdXgtPnRhZ19saXN0KTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5wYWQsCisgICAgICAgICAgZ3N0X2V2ZW50X25ld190YWcgKGdzdF90YWdfbGlzdF9yZWYgKHF0ZGVtdXgtPnRhZ19saXN0KSkpOworICAgICAgc3RyZWFtLT5zZW5kX2dsb2JhbF90YWdzID0gRkFMU0U7CisgICAgfQorICB9Cit9CisKKy8qIHB1c2ggZXZlbnQgb24gYWxsIHNvdXJjZSBwYWRzOyB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGV2ZW50ICovCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfcHVzaF9ldmVudCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGd1aW50IG47CisgIGdib29sZWFuIGhhc192YWxpZF9zdHJlYW0gPSBGQUxTRTsKKyAgR3N0RXZlbnRUeXBlIGV0eXBlID0gR1NUX0VWRU5UX1RZUEUgKGV2ZW50KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicHVzaGluZyAlcyBldmVudCBvbiBhbGwgc291cmNlIHBhZHMiLAorICAgICAgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBmb3IgKG4gPSAwOyBuIDwgcXRkZW11eC0+bl9zdHJlYW1zOyBuKyspIHsKKyAgICBHc3RQYWQgKnBhZDsKKyAgICBRdERlbXV4U3RyZWFtICpzdHJlYW0gPSBxdGRlbXV4LT5zdHJlYW1zW25dOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJwdXNoaW5nIG9uIHBhZCAlaSIsIG4pOworCisgICAgaWYgKChwYWQgPSBzdHJlYW0tPnBhZCkpIHsKKyAgICAgIGhhc192YWxpZF9zdHJlYW0gPSBUUlVFOworCisgICAgICBpZiAoZXR5cGUgPT0gR1NUX0VWRU5UX0VPUykgeworICAgICAgICAvKiBsZXQncyBub3Qgc2VuZCB0d2ljZSAqLworICAgICAgICBpZiAoc3RyZWFtLT5zZW50X2VvcykKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgc3RyZWFtLT5zZW50X2VvcyA9IFRSVUU7CisgICAgICB9CisKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocGFkLCBnc3RfZXZlbnRfcmVmIChldmVudCkpOworICAgIH0KKyAgfQorCisgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworCisgIC8qIGlmIGl0IGlzIEVPUyBhbmQgdGhlcmUgYXJlIG5vIHBhZHMsIHBvc3QgYW4gZXJyb3IgKi8KKyAgaWYgKCFoYXNfdmFsaWRfc3RyZWFtICYmIGV0eXBlID09IEdTVF9FVkVOVF9FT1MpIHsKKyAgICBnc3RfcXRkZW11eF9wb3N0X25vX3BsYXlhYmxlX3N0cmVhbV9lcnJvciAocXRkZW11eCk7CisgIH0KK30KKworLyogcHVzaCBhIHBlbmRpbmcgbmV3c2VnbWVudCBldmVudCwgaWYgYW55IGZyb20gdGhlIHN0cmVhbWluZyB0aHJlYWQgKi8KK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9wdXNoX3BlbmRpbmdfbmV3c2VnbWVudCAoR3N0UVREZW11eCAqIHF0ZGVtdXgpCit7CisgIGlmIChxdGRlbXV4LT5wZW5kaW5nX25ld3NlZ21lbnQpIHsKKyAgICBnc3RfcXRkZW11eF9wdXNoX2V2ZW50IChxdGRlbXV4LCBxdGRlbXV4LT5wZW5kaW5nX25ld3NlZ21lbnQpOworICAgIHF0ZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCA9IE5VTEw7CisgIH0KK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ3VpbnQ2NCBtZWRpYV90aW1lOworfSBGaW5kRGF0YTsKKworc3RhdGljIGdpbnQKK2ZpbmRfZnVuYyAoUXREZW11eFNhbXBsZSAqIHMxLCBnaW50NjQgKiBtZWRpYV90aW1lLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGlmICgoZ2ludDY0KSBzMS0+dGltZXN0YW1wICsgczEtPnB0c19vZmZzZXQgPiAqbWVkaWFfdGltZSkKKyAgICByZXR1cm4gMTsKKyAgaWYgKChnaW50NjQpIHMxLT50aW1lc3RhbXAgKyBzMS0+cHRzX29mZnNldCA9PSAqbWVkaWFfdGltZSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gLTE7Cit9CisKKy8qIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBzYW1wbGUgdGhhdCBpbmNsdWRlcyB0aGUgZGF0YSBmb3IgQG1lZGlhX3RpbWUgdXNpbmcgYQorICogYmluYXJ5IHNlYXJjaC4gIE9ubHkgdG8gYmUgY2FsbGVkIGluIG9wdGltaXplZCBjYXNlcyBvZiBsaW5lYXIgc2VhcmNoIGJlbG93LgorICoKKyAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBzYW1wbGUuCisgKi8KK3N0YXRpYyBndWludDMyCitnc3RfcXRkZW11eF9maW5kX2luZGV4IChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0ciwKKyAgICBndWludDY0IG1lZGlhX3RpbWUpCit7CisgIFF0RGVtdXhTYW1wbGUgKnJlc3VsdDsKKyAgZ3VpbnQzMiBpbmRleDsKKworICAvKiBjb252ZXJ0IG1lZGlhX3RpbWUgdG8gbW92IGZvcm1hdCAqLworICBtZWRpYV90aW1lID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9jZWlsIChtZWRpYV90aW1lLCBzdHItPnRpbWVzY2FsZSwgR1NUX1NFQ09ORCk7CisKKyAgcmVzdWx0ID0gZ3N0X3V0aWxfYXJyYXlfYmluYXJ5X3NlYXJjaCAoc3RyLT5zYW1wbGVzLCBzdHItPnN0YmxfaW5kZXggKyAxLAorICAgICAgc2l6ZW9mIChRdERlbXV4U2FtcGxlKSwgKEdDb21wYXJlRGF0YUZ1bmMpIGZpbmRfZnVuYywKKyAgICAgIEdTVF9TRUFSQ0hfTU9ERV9CRUZPUkUsICZtZWRpYV90aW1lLCBOVUxMKTsKKworICBpZiAoR19MSUtFTFkgKHJlc3VsdCkpCisgICAgaW5kZXggPSByZXN1bHQgLSBzdHItPnNhbXBsZXM7CisgIGVsc2UKKyAgICBpbmRleCA9IDA7CisKKyAgcmV0dXJuIGluZGV4OworfQorCisKKworLyogZmluZCB0aGUgaW5kZXggb2YgdGhlIHNhbXBsZSB0aGF0IGluY2x1ZGVzIHRoZSBkYXRhIGZvciBAbWVkaWFfb2Zmc2V0IHVzaW5nIGEKKyAqIGxpbmVhciBzZWFyY2gKKyAqCisgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgc2FtcGxlLgorICovCitzdGF0aWMgZ3VpbnQzMgorZ3N0X3F0ZGVtdXhfZmluZF9pbmRleF9mb3JfZ2l2ZW5fbWVkaWFfb2Zmc2V0X2xpbmVhciAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0ciwgZ2ludDY0IG1lZGlhX29mZnNldCkKK3sKKyAgUXREZW11eFNhbXBsZSAqcmVzdWx0ID0gc3RyLT5zYW1wbGVzOworICBndWludDMyIGluZGV4ID0gMDsKKworICBpZiAocmVzdWx0ID09IE5VTEwgfHwgc3RyLT5uX3NhbXBsZXMgPT0gMCkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKG1lZGlhX29mZnNldCA9PSByZXN1bHQtPm9mZnNldCkKKyAgICByZXR1cm4gaW5kZXg7CisKKyAgcmVzdWx0Kys7CisgIHdoaWxlIChpbmRleCA8IHN0ci0+bl9zYW1wbGVzIC0gMSkgeworICAgIGlmICghcXRkZW11eF9wYXJzZV9zYW1wbGVzIChxdGRlbXV4LCBzdHIsIGluZGV4ICsgMSkpCisgICAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKworICAgIGlmIChtZWRpYV9vZmZzZXQgPCByZXN1bHQtPm9mZnNldCkKKyAgICAgIGJyZWFrOworCisgICAgaW5kZXgrKzsKKyAgICByZXN1bHQrKzsKKyAgfQorICByZXR1cm4gaW5kZXg7CisKKyAgLyogRVJST1JTICovCitwYXJzZV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIlBhcnNpbmcgb2YgaW5kZXggJXUgZmFpbGVkISIsIGluZGV4ICsgMSk7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKKy8qIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBzYW1wbGUgdGhhdCBpbmNsdWRlcyB0aGUgZGF0YSBmb3IgQG1lZGlhX3RpbWUgdXNpbmcgYQorICogbGluZWFyIHNlYXJjaCwgYW5kIGtlZXBpbmcgaW4gbWluZCB0aGF0IG5vdCBhbGwgc2FtcGxlcyBtYXkgaGF2ZSBiZWVuIHBhcnNlZAorICogeWV0LiAgSWYgcG9zc2libGUsIGl0IHdpbGwgZGVsZWdhdGUgdG8gYmluYXJ5IHNlYXJjaC4KKyAqCisgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgc2FtcGxlLgorICovCitzdGF0aWMgZ3VpbnQzMgorZ3N0X3F0ZGVtdXhfZmluZF9pbmRleF9saW5lYXIgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBRdERlbXV4U3RyZWFtICogc3RyLAorICAgIEdzdENsb2NrVGltZSBtZWRpYV90aW1lKQoreworICBndWludDMyIGluZGV4ID0gMDsKKyAgZ3VpbnQ2NCBtb3ZfdGltZTsKKyAgUXREZW11eFNhbXBsZSAqc2FtcGxlOworCisgIC8qIGNvbnZlcnQgbWVkaWFfdGltZSB0byBtb3YgZm9ybWF0ICovCisgIG1vdl90aW1lID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9jZWlsIChtZWRpYV90aW1lLCBzdHItPnRpbWVzY2FsZSwgR1NUX1NFQ09ORCk7CisKKyAgc2FtcGxlID0gc3RyLT5zYW1wbGVzOworICBpZiAobW92X3RpbWUgPT0gc2FtcGxlLT50aW1lc3RhbXAgKyBzYW1wbGUtPnB0c19vZmZzZXQpCisgICAgcmV0dXJuIGluZGV4OworCisgIC8qIHVzZSBmYXN0ZXIgc2VhcmNoIGlmIHJlcXVlc3RlZCB0aW1lIGluIGFscmVhZHkgcGFyc2VkIHJhbmdlICovCisgIHNhbXBsZSA9IHN0ci0+c2FtcGxlcyArIHN0ci0+c3RibF9pbmRleDsKKyAgaWYgKHN0ci0+c3RibF9pbmRleCA+PSAwICYmCisgICAgICBtb3ZfdGltZSA8PSAoc2FtcGxlLT50aW1lc3RhbXAgKyBzYW1wbGUtPnB0c19vZmZzZXQpKQorICAgIHJldHVybiBnc3RfcXRkZW11eF9maW5kX2luZGV4IChxdGRlbXV4LCBzdHIsIG1lZGlhX3RpbWUpOworCisgIHdoaWxlIChpbmRleCA8IHN0ci0+bl9zYW1wbGVzIC0gMSkgeworICAgIGlmICghcXRkZW11eF9wYXJzZV9zYW1wbGVzIChxdGRlbXV4LCBzdHIsIGluZGV4ICsgMSkpCisgICAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKworICAgIHNhbXBsZSA9IHN0ci0+c2FtcGxlcyArIGluZGV4ICsgMTsKKyAgICBpZiAobW92X3RpbWUgPCAoc2FtcGxlLT50aW1lc3RhbXAgKyBzYW1wbGUtPnB0c19vZmZzZXQpKQorICAgICAgYnJlYWs7CisKKyAgICBpbmRleCsrOworICB9CisgIHJldHVybiBpbmRleDsKKworICAvKiBFUlJPUlMgKi8KK3BhcnNlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiUGFyc2luZyBvZiBpbmRleCAldSBmYWlsZWQhIiwgaW5kZXggKyAxKTsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworLyogZmluZCB0aGUgaW5kZXggb2YgdGhlIGtleWZyYW1lIG5lZWRlZCB0byBkZWNvZGUgdGhlIHNhbXBsZSBhdCBAaW5kZXgKKyAqIG9mIHN0cmVhbSBAc3RyLCBvciBvZiBhIHN1YnNlcXVlbnQga2V5ZnJhbWUgKGRlcGVuZGluZyBvbiBAbmV4dCkKKyAqCisgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUga2V5ZnJhbWUuCisgKi8KK3N0YXRpYyBndWludDMyCitnc3RfcXRkZW11eF9maW5kX2tleWZyYW1lIChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0ciwKKyAgICBndWludDMyIGluZGV4LCBnYm9vbGVhbiBuZXh0KQoreworICBndWludDMyIG5ld19pbmRleCA9IGluZGV4OworCisgIGlmIChpbmRleCA+PSBzdHItPm5fc2FtcGxlcykgeworICAgIG5ld19pbmRleCA9IHN0ci0+bl9zYW1wbGVzOworICAgIGdvdG8gYmVhY2g7CisgIH0KKworICAvKiBhbGwga2V5ZnJhbWVzLCByZXR1cm4gaW5kZXggKi8KKyAgaWYgKHN0ci0+YWxsX2tleWZyYW1lKSB7CisgICAgbmV3X2luZGV4ID0gaW5kZXg7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIC8qIGVsc2Ugc2VhcmNoIHVudGlsIHdlIGhhdmUgYSBrZXlmcmFtZSAqLworICB3aGlsZSAobmV3X2luZGV4IDwgc3RyLT5uX3NhbXBsZXMpIHsKKyAgICBpZiAobmV4dCAmJiAhcXRkZW11eF9wYXJzZV9zYW1wbGVzIChxdGRlbXV4LCBzdHIsIG5ld19pbmRleCkpCisgICAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKworICAgIGlmIChzdHItPnNhbXBsZXNbbmV3X2luZGV4XS5rZXlmcmFtZSkKKyAgICAgIGJyZWFrOworCisgICAgaWYgKG5ld19pbmRleCA9PSAwKQorICAgICAgYnJlYWs7CisKKyAgICBpZiAobmV4dCkKKyAgICAgIG5ld19pbmRleCsrOworICAgIGVsc2UKKyAgICAgIG5ld19pbmRleC0tOworICB9CisKKyAgaWYgKG5ld19pbmRleCA9PSBzdHItPm5fc2FtcGxlcykgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJubyBuZXh0IGtleWZyYW1lIik7CisgICAgbmV3X2luZGV4ID0gLTE7CisgIH0KKworYmVhY2g6CisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzZWFyY2hpbmcgZm9yIGtleWZyYW1lIGluZGV4ICVzIGluZGV4ICV1ICIKKyAgICAgICJnYXZlICV1IiwgbmV4dCA/ICJhZnRlciIgOiAiYmVmb3JlIiwgaW5kZXgsIG5ld19pbmRleCk7CisKKyAgcmV0dXJuIG5ld19pbmRleDsKKworICAvKiBFUlJPUlMgKi8KK3BhcnNlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiUGFyc2luZyBvZiBpbmRleCAldSBmYWlsZWQhIiwgbmV3X2luZGV4KTsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworLyogZmluZCB0aGUgc2VnbWVudCBmb3IgQHRpbWVfcG9zaXRpb24gZm9yIEBzdHJlYW0KKyAqCisgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgc2VnbWVudCBjb250YWluaW5nIEB0aW1lX3Bvc2l0aW9uLgorICogUmV0dXJucyB0aGUgbGFzdCBzZWdtZW50IGFuZCBzZXRzIHRoZSBAZW9zIHZhcmlhYmxlIHRvIFRSVUUKKyAqIGlmIHRoZSB0aW1lIGlzIGJleW9uZCB0aGUgZW5kLiBAZW9zIG1heSBiZSBOVUxMCisgKi8KK3N0YXRpYyBndWludDMyCitnc3RfcXRkZW11eF9maW5kX3NlZ21lbnQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBRdERlbXV4U3RyZWFtICogc3RyZWFtLAorICAgIEdzdENsb2NrVGltZSB0aW1lX3Bvc2l0aW9uKQoreworICBnaW50IGk7CisgIGd1aW50MzIgc2VnX2lkeDsKKworICBHU1RfTE9HX09CSkVDVCAoc3RyZWFtLT5wYWQsICJmaW5kaW5nIHNlZ21lbnQgZm9yICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVfcG9zaXRpb24pKTsKKworICBzZWdfaWR4ID0gLTE7CisgIGZvciAoaSA9IDA7IGkgPCBzdHJlYW0tPm5fc2VnbWVudHM7IGkrKykgeworICAgIFF0RGVtdXhTZWdtZW50ICpzZWdtZW50ID0gJnN0cmVhbS0+c2VnbWVudHNbaV07CisKKyAgICBHU1RfTE9HX09CSkVDVCAoc3RyZWFtLT5wYWQsCisgICAgICAgICJsb29raW5nIGF0IHNlZ21lbnQgJSIgR1NUX1RJTUVfRk9STUFUICItJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChzZWdtZW50LT50aW1lKSwgR1NUX1RJTUVfQVJHUyAoc2VnbWVudC0+c3RvcF90aW1lKSk7CisKKyAgICAvKiBGb3IgdGhlIGxhc3Qgc2VnbWVudCB3ZSBpbmNsdWRlIHN0b3BfdGltZSBpbiB0aGUgbGFzdCBzZWdtZW50ICovCisgICAgaWYgKGkgPCBzdHJlYW0tPm5fc2VnbWVudHMgLSAxKSB7CisgICAgICBpZiAoc2VnbWVudC0+dGltZSA8PSB0aW1lX3Bvc2l0aW9uICYmIHRpbWVfcG9zaXRpb24gPCBzZWdtZW50LT5zdG9wX3RpbWUpIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHN0cmVhbS0+cGFkLCAic2VnbWVudCAlZCBtYXRjaGVzIiwgaSk7CisgICAgICAgIHNlZ19pZHggPSBpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogTGFzdCBzZWdtZW50IGFsd2F5cyBtYXRjaGVzICovCisgICAgICBzZWdfaWR4ID0gaTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gc2VnX2lkeDsKK30KKworLyogbW92ZSB0aGUgc3RyZWFtIEBzdHIgdG8gdGhlIHNhbXBsZSBwb3NpdGlvbiBAaW5kZXguCisgKgorICogVXBkYXRlcyBAc3RyLT5zYW1wbGVfaW5kZXggYW5kIG1hcmtzIGRpc2NvbnRpbnVpdHkgaWYgbmVlZGVkLgorICovCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfbW92ZV9zdHJlYW0gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBRdERlbXV4U3RyZWFtICogc3RyLAorICAgIGd1aW50MzIgaW5kZXgpCit7CisgIC8qIG5vIGNoYW5nZSBuZWVkZWQgKi8KKyAgaWYgKGluZGV4ID09IHN0ci0+c2FtcGxlX2luZGV4KQorICAgIHJldHVybjsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAibW92aW5nIHRvIHNhbXBsZSAldSBvZiAldSIsIGluZGV4LAorICAgICAgc3RyLT5uX3NhbXBsZXMpOworCisgIC8qIHBvc2l0aW9uIGNoYW5nZWQsIHdlIGhhdmUgYSBkaXNjb250ICovCisgIHN0ci0+c2FtcGxlX2luZGV4ID0gaW5kZXg7CisgIHN0ci0+b2Zmc2V0X2luX3NhbXBsZSA9IDA7CisgIC8qIEVhY2ggdGltZSB3ZSBtb3ZlIGluIHRoZSBzdHJlYW0gd2Ugc3RvcmUgdGhlIHBvc2l0aW9uIHdoZXJlIHdlIGFyZQorICAgKiBzdGFydGluZyBmcm9tICovCisgIHN0ci0+ZnJvbV9zYW1wbGUgPSBpbmRleDsKKyAgc3RyLT5kaXNjb250ID0gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X2FkanVzdF9zZWVrIChHc3RRVERlbXV4ICogcXRkZW11eCwgZ2ludDY0IGRlc2lyZWRfdGltZSwKKyAgICBnYm9vbGVhbiB1c2Vfc3BhcnNlLCBnYm9vbGVhbiBuZXh0LCBnaW50NjQgKiBrZXlfdGltZSwgZ2ludDY0ICoga2V5X29mZnNldCkKK3sKKyAgZ3VpbnQ2NCBtaW5fb2Zmc2V0OworICBnaW50NjQgbWluX2J5dGVfb2Zmc2V0ID0gLTE7CisgIGdpbnQgbjsKKworICBtaW5fb2Zmc2V0ID0gZGVzaXJlZF90aW1lOworCisgIC8qIGZvciBlYWNoIHN0cmVhbSwgZmluZCB0aGUgaW5kZXggb2YgdGhlIHNhbXBsZSBpbiB0aGUgc2VnbWVudAorICAgKiBhbmQgbW92ZSBiYWNrIHRvIHRoZSBwcmV2aW91cyBrZXlmcmFtZS4gKi8KKyAgZm9yIChuID0gMDsgbiA8IHF0ZGVtdXgtPm5fc3RyZWFtczsgbisrKSB7CisgICAgUXREZW11eFN0cmVhbSAqc3RyOworICAgIGd1aW50MzIgaW5kZXgsIGtpbmRleDsKKyAgICBndWludDMyIHNlZ19pZHg7CisgICAgR3N0Q2xvY2tUaW1lIG1lZGlhX3N0YXJ0OworICAgIEdzdENsb2NrVGltZSBtZWRpYV90aW1lOworICAgIEdzdENsb2NrVGltZSBzZWdfdGltZTsKKyAgICBRdERlbXV4U2VnbWVudCAqc2VnOworICAgIGdib29sZWFuIGVtcHR5X3NlZ21lbnQgPSBGQUxTRTsKKworICAgIHN0ciA9IHF0ZGVtdXgtPnN0cmVhbXNbbl07CisKKyAgICBpZiAoQ1VSX1NUUkVBTSAoc3RyKS0+c3BhcnNlICYmICF1c2Vfc3BhcnNlKQorICAgICAgY29udGludWU7CisKKyAgICBzZWdfaWR4ID0gZ3N0X3F0ZGVtdXhfZmluZF9zZWdtZW50IChxdGRlbXV4LCBzdHIsIGRlc2lyZWRfdGltZSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImFsaWduIHNlZ21lbnQgJWQiLCBzZWdfaWR4KTsKKworICAgIC8qIGdldCBzZWdtZW50IGFuZCB0aW1lIGluIHRoZSBzZWdtZW50ICovCisgICAgc2VnID0gJnN0ci0+c2VnbWVudHNbc2VnX2lkeF07CisgICAgc2VnX3RpbWUgPSAoZGVzaXJlZF90aW1lIC0gc2VnLT50aW1lKSAqIHNlZy0+cmF0ZTsKKworICAgIHdoaWxlIChRVFNFR01FTlRfSVNfRU1QVFkgKHNlZykpIHsKKyAgICAgIHNlZ190aW1lID0gMDsKKyAgICAgIGVtcHR5X3NlZ21lbnQgPSBUUlVFOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3RyLT5wYWQsICJTZWdtZW50ICVkIGlzIGVtcHR5LCBtb3ZpbmcgdG8gbmV4dCBvbmUiLAorICAgICAgICAgIHNlZ19pZHgpOworICAgICAgc2VnX2lkeCsrOworICAgICAgaWYgKHNlZ19pZHggPT0gc3RyLT5uX3NlZ21lbnRzKQorICAgICAgICBicmVhazsKKyAgICAgIHNlZyA9ICZzdHItPnNlZ21lbnRzW3NlZ19pZHhdOworICAgIH0KKworICAgIGlmIChzZWdfaWR4ID09IHN0ci0+bl9zZWdtZW50cykgeworICAgICAgLyogRklYTUUgdHJhY2sgc2hvdWxkbid0IGhhdmUgdGhlIGxhc3Qgc2VnbWVudCBhcyBlbXB0eSwgYnV0IGlmIGl0CisgICAgICAgKiBoYXBwZW5zIHdlIGJldHRlciBoYW5kbGUgaXQgKi8KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIGdldCB0aGUgbWVkaWEgdGltZSBpbiB0aGUgc2VnbWVudCAqLworICAgIG1lZGlhX3N0YXJ0ID0gc2VnLT5tZWRpYV9zdGFydCArIHNlZ190aW1lOworCisgICAgLyogZ2V0IHRoZSBpbmRleCBvZiB0aGUgc2FtcGxlIHdpdGggbWVkaWEgdGltZSAqLworICAgIGluZGV4ID0gZ3N0X3F0ZGVtdXhfZmluZF9pbmRleF9saW5lYXIgKHF0ZGVtdXgsIHN0ciwgbWVkaWFfc3RhcnQpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzYW1wbGUgZm9yICUiIEdTVF9USU1FX0ZPUk1BVCAiIGF0ICV1IgorICAgICAgICAiIGF0IG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFUICIgKGVtcHR5IHNlZ21lbnQ6ICVkKSIsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKG1lZGlhX3N0YXJ0KSwgaW5kZXgsIHN0ci0+c2FtcGxlc1tpbmRleF0ub2Zmc2V0LAorICAgICAgICBlbXB0eV9zZWdtZW50KTsKKworICAgIC8qIHNoaWZ0IHRvIG5leHQgZnJhbWUgaWYgd2UgYXJlIGxvb2tpbmcgZm9yIG5leHQga2V5ZnJhbWUgKi8KKyAgICBpZiAobmV4dCAmJiBRVFNBTVBMRV9QVFNfTk9fQ1NMRyAoc3RyLCAmc3RyLT5zYW1wbGVzW2luZGV4XSkgPCBtZWRpYV9zdGFydAorICAgICAgICAmJiBpbmRleCA8IHN0ci0+c3RibF9pbmRleCkKKyAgICAgIGluZGV4Kys7CisKKyAgICBpZiAoIWVtcHR5X3NlZ21lbnQpIHsKKyAgICAgIC8qIGZpbmQgcHJldmlvdXMga2V5ZnJhbWUgKi8KKyAgICAgIGtpbmRleCA9IGdzdF9xdGRlbXV4X2ZpbmRfa2V5ZnJhbWUgKHF0ZGVtdXgsIHN0ciwgaW5kZXgsIG5leHQpOworCisgICAgICAvKiB3ZSB3aWxsIHNldHRsZSBmb3Igb25lIGJlZm9yZSBpZiBub25lIGZvdW5kIGFmdGVyICovCisgICAgICBpZiAobmV4dCAmJiBraW5kZXggPT0gLTEpCisgICAgICAgIGtpbmRleCA9IGdzdF9xdGRlbXV4X2ZpbmRfa2V5ZnJhbWUgKHF0ZGVtdXgsIHN0ciwgaW5kZXgsIEZBTFNFKTsKKworICAgICAgLyogaWYgdGhlIGtleWZyYW1lIGlzIGF0IGEgZGlmZmVyZW50IHBvc2l0aW9uLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUKKyAgICAgICAqIHJlcXVlc3RlZCBzZWVrIHRpbWUgKi8KKyAgICAgIGlmIChpbmRleCAhPSBraW5kZXgpIHsKKyAgICAgICAgaW5kZXggPSBraW5kZXg7CisKKyAgICAgICAgLyogZ2V0IHRpbWVzdGFtcCBvZiBrZXlmcmFtZSAqLworICAgICAgICBtZWRpYV90aW1lID0gUVRTQU1QTEVfUFRTX05PX0NTTEcgKHN0ciwgJnN0ci0+c2FtcGxlc1traW5kZXhdKTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICJrZXlmcmFtZSBhdCAldSB3aXRoIHRpbWUgJSIgR1NUX1RJTUVfRk9STUFUICIgYXQgb2Zmc2V0ICUiCisgICAgICAgICAgICBHX0dVSU5UNjRfRk9STUFULCBraW5kZXgsIEdTVF9USU1FX0FSR1MgKG1lZGlhX3RpbWUpLAorICAgICAgICAgICAgc3RyLT5zYW1wbGVzW2tpbmRleF0ub2Zmc2V0KTsKKworICAgICAgICAvKiBrZXlmcmFtZXMgaW4gdGhlIHNlZ21lbnQgZ2V0IGEgY2hhbmNlIHRvIGNoYW5nZSB0aGUKKyAgICAgICAgICogZGVzaXJlZF9vZmZzZXQuIGtleWZyYW1lcyBvdXQgb2YgdGhlIHNlZ21lbnQgYXJlCisgICAgICAgICAqIGlnbm9yZWQuICovCisgICAgICAgIGlmIChtZWRpYV90aW1lID49IHNlZy0+bWVkaWFfc3RhcnQpIHsKKyAgICAgICAgICBHc3RDbG9ja1RpbWUgc2VnX3RpbWU7CisKKyAgICAgICAgICAvKiB0aGlzIGtleWZyYW1lIGlzIGluc2lkZSB0aGUgc2VnbWVudCwgY29udmVydCBiYWNrIHRvCisgICAgICAgICAgICogc2VnbWVudCB0aW1lICovCisgICAgICAgICAgc2VnX3RpbWUgPSAobWVkaWFfdGltZSAtIHNlZy0+bWVkaWFfc3RhcnQpICsgc2VnLT50aW1lOworICAgICAgICAgIGlmICgoIW5leHQgJiYgKHNlZ190aW1lIDwgbWluX29mZnNldCkpIHx8CisgICAgICAgICAgICAgIChuZXh0ICYmIChzZWdfdGltZSA+IG1pbl9vZmZzZXQpKSkKKyAgICAgICAgICAgIG1pbl9vZmZzZXQgPSBzZWdfdGltZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChtaW5fYnl0ZV9vZmZzZXQgPCAwIHx8IHN0ci0+c2FtcGxlc1tpbmRleF0ub2Zmc2V0IDwgbWluX2J5dGVfb2Zmc2V0KQorICAgICAgbWluX2J5dGVfb2Zmc2V0ID0gc3RyLT5zYW1wbGVzW2luZGV4XS5vZmZzZXQ7CisgIH0KKworICBpZiAoa2V5X3RpbWUpCisgICAgKmtleV90aW1lID0gbWluX29mZnNldDsKKyAgaWYgKGtleV9vZmZzZXQpCisgICAgKmtleV9vZmZzZXQgPSBtaW5fYnl0ZV9vZmZzZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3F0ZGVtdXhfY29udmVydF9zZWVrIChHc3RQYWQgKiBwYWQsIEdzdEZvcm1hdCAqIGZvcm1hdCwKKyAgICBHc3RTZWVrVHlwZSBjdXJfdHlwZSwgZ2ludDY0ICogY3VyLCBHc3RTZWVrVHlwZSBzdG9wX3R5cGUsIGdpbnQ2NCAqIHN0b3ApCit7CisgIGdib29sZWFuIHJlczsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZm9ybWF0ICE9IE5VTEwsIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGN1ciAhPSBOVUxMLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzdG9wICE9IE5VTEwsIEZBTFNFKTsKKworICBpZiAoKmZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgcmVzID0gVFJVRTsKKyAgaWYgKGN1cl90eXBlICE9IEdTVF9TRUVLX1RZUEVfTk9ORSkKKyAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2NvbnZlcnQgKHBhZCwgKmZvcm1hdCwgKmN1ciwgR1NUX0ZPUk1BVF9USU1FLCBjdXIpOworICBpZiAocmVzICYmIHN0b3BfdHlwZSAhPSBHU1RfU0VFS19UWVBFX05PTkUpCisgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9jb252ZXJ0IChwYWQsICpmb3JtYXQsICpzdG9wLCBHU1RfRk9STUFUX1RJTUUsIHN0b3ApOworCisgIGlmIChyZXMpCisgICAgKmZvcm1hdCA9IEdTVF9GT1JNQVRfVElNRTsKKworICByZXR1cm4gcmVzOworfQorCisvKiBwZXJmb3JtIHNlZWsgaW4gcHVzaCBiYXNlZCBtb2RlOgorICAgZmluZCBCWVRFIHBvc2l0aW9uIHRvIG1vdmUgdG8gYmFzZWQgb24gdGltZSBhbmQgZGVsZWdhdGUgdG8gdXBzdHJlYW0KKyovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdGRlbXV4X2RvX3B1c2hfc2VlayAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2RvdWJsZSByYXRlOworICBHc3RGb3JtYXQgZm9ybWF0OworICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgIEdzdFNlZWtUeXBlIGN1cl90eXBlLCBzdG9wX3R5cGU7CisgIGdpbnQ2NCBjdXIsIHN0b3AsIGtleV9jdXI7CisgIGdib29sZWFuIHJlczsKKyAgZ2ludDY0IGJ5dGVfY3VyOworICBnaW50NjQgb3JpZ2luYWxfc3RvcDsKKyAgZ3VpbnQzMiBzZXFudW07CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImRvaW5nIHB1c2gtYmFzZWQgc2VlayIpOworCisgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgJnJhdGUsICZmb3JtYXQsICZmbGFncywKKyAgICAgICZjdXJfdHlwZSwgJmN1ciwgJnN0b3BfdHlwZSwgJnN0b3ApOworICBzZXFudW0gPSBnc3RfZXZlbnRfZ2V0X3NlcW51bSAoZXZlbnQpOworCisgIC8qIG9ubHkgZm9yd2FyZCBzdHJlYW1pbmcgYW5kIHNlZWtpbmcgaXMgcG9zc2libGUgKi8KKyAgaWYgKHJhdGUgPD0gMCkKKyAgICBnb3RvIHVuc3VwcG9ydGVkX3NlZWs7CisKKyAgLyogY29udmVydCB0byBUSU1FIGlmIG5lZWRlZCBhbmQgcG9zc2libGUgKi8KKyAgaWYgKCFnc3RfcXRkZW11eF9jb252ZXJ0X3NlZWsgKHBhZCwgJmZvcm1hdCwgY3VyX3R5cGUsICZjdXIsCisgICAgICAgICAgc3RvcF90eXBlLCAmc3RvcCkpCisgICAgZ290byBub19mb3JtYXQ7CisKKyAgLyogVXBzdHJlYW0gc2VlayBpbiBieXRlcyB3aWxsIGhhdmUgdW5kZWZpbmVkIHN0b3AsIGJ1dCBxdGRlbXV4IHN0b3JlcworICAgKiB0aGUgb3JpZ2luYWwgc3RvcCBwb3NpdGlvbiB0byB1c2Ugd2hlbiB1cHN0cmVhbSBwdXNoZXMgdGhlIG5ldyBzZWdtZW50CisgICAqIGZvciB0aGlzIHNlZWsgKi8KKyAgb3JpZ2luYWxfc3RvcCA9IHN0b3A7CisgIHN0b3AgPSAtMTsKKworICAvKiBmaW5kIHJlYXNvbmFibGUgY29ycmVzcG9uZGluZyBCWVRFIHBvc2l0aW9uLAorICAgKiBhbHNvIHRyeSB0byBtaW5kIGFib3V0IGtleWZyYW1lcywgc2luY2Ugd2UgY2FuIG5vdCBnbyBiYWNrIGEgYml0IGZvciB0aGVtCisgICAqIGxhdGVyIG9uICovCisgIC8qIGRldGVybWluaW5nIEBuZXh0IGhlcmUgYmFzZWQgb24gU05BUF9CRUZPUkUvU05BUF9BRlRFUiBzaG91bGQKKyAgICogbW9zdGx5IGp1c3Qgd29yaywgYnV0IGxldCdzIG5vdCB5ZXQgYm9sZGx5IGdvIHRoZXJlICAuLi4gKi8KKyAgZ3N0X3F0ZGVtdXhfYWRqdXN0X3NlZWsgKHF0ZGVtdXgsIGN1ciwgRkFMU0UsIEZBTFNFLCAma2V5X2N1ciwgJmJ5dGVfY3VyKTsKKworICBpZiAoYnl0ZV9jdXIgPT0gLTEpCisgICAgZ290byBhYm9ydF9zZWVrOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJQdXNoaW5nIEJZVEUgc2VlayByYXRlICVnLCAiCisgICAgICAic3RhcnQgJSIgR19HSU5UNjRfRk9STUFUICIsIHN0b3AgJSIgR19HSU5UNjRfRk9STUFULCByYXRlLCBieXRlX2N1ciwKKyAgICAgIHN0b3ApOworCisgIEdTVF9PQkpFQ1RfTE9DSyAocXRkZW11eCk7CisgIHF0ZGVtdXgtPnNlZWtfb2Zmc2V0ID0gYnl0ZV9jdXI7CisgIGlmICghKGZsYWdzICYgR1NUX1NFRUtfRkxBR19LRVlfVU5JVCkpIHsKKyAgICBxdGRlbXV4LT5wdXNoX3NlZWtfc3RhcnQgPSBjdXI7CisgIH0gZWxzZSB7CisgICAgcXRkZW11eC0+cHVzaF9zZWVrX3N0YXJ0ID0ga2V5X2N1cjsKKyAgfQorCisgIGlmIChzdG9wX3R5cGUgPT0gR1NUX1NFRUtfVFlQRV9OT05FKSB7CisgICAgcXRkZW11eC0+cHVzaF9zZWVrX3N0b3AgPSBxdGRlbXV4LT5zZWdtZW50LnN0b3A7CisgIH0gZWxzZSB7CisgICAgcXRkZW11eC0+cHVzaF9zZWVrX3N0b3AgPSBvcmlnaW5hbF9zdG9wOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChxdGRlbXV4KTsKKworICAvKiBCWVRFIHNlZWsgZXZlbnQgKi8KKyAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZWsgKHJhdGUsIEdTVF9GT1JNQVRfQllURVMsIGZsYWdzLCBjdXJfdHlwZSwgYnl0ZV9jdXIsCisgICAgICBzdG9wX3R5cGUsIHN0b3ApOworICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZXZlbnQsIHNlcW51bSk7CisgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAocXRkZW11eC0+c2lua3BhZCwgZXZlbnQpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCithYm9ydF9zZWVrOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImNvdWxkIG5vdCBkZXRlcm1pbmUgYnl0ZSBwb3NpdGlvbiB0byBzZWVrIHRvLCAiCisgICAgICAgICJzZWVrIGFib3J0ZWQuIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit1bnN1cHBvcnRlZF9zZWVrOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInVuc3VwcG9ydGVkIHNlZWssIHNlZWsgYWJvcnRlZC4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX2Zvcm1hdDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJ1bnN1cHBvcnRlZCBmb3JtYXQgZ2l2ZW4sIHNlZWsgYWJvcnRlZC4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogcGVyZm9ybSB0aGUgc2Vlay4KKyAqCisgKiBXZSBzZXQgYWxsIHNlZ21lbnRfaW5kZXhlcyBpbiB0aGUgc3RyZWFtcyB0byB1bmtub3duIGFuZAorICogYWRqdXN0IHRoZSB0aW1lX3Bvc2l0aW9uIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uLiB0aGlzIGlzIGVub3VnaAorICogdG8gdHJpZ2dlciBhIHNlZ21lbnQgc3dpdGNoIGluIHRoZSBzdHJlYW1pbmcgdGhyZWFkIHRvIHN0YXJ0CisgKiBzdHJlYW1pbmcgZnJvbSB0aGUgZGVzaXJlZCBwb3NpdGlvbi4KKyAqCisgKiBLZXlmcmFtZSBzZWVraW5nIGlzIGEgbGl0dGxlIG1vcmUgY29tcGxpY2F0ZWQgd2hlbiBkZWFsaW5nIHdpdGgKKyAqIHNlZ21lbnRzLiBJZGVhbGx5IHdlIHdhbnQgdG8gbW92ZSB0byB0aGUgcHJldmlvdXMga2V5ZnJhbWUgaW4KKyAqIHRoZSBzZWdtZW50IGJ1dCB0aGVyZSBtaWdodCBub3QgYmUgYSBrZXlmcmFtZSBpbiB0aGUgc2VnbWVudC4gSW4KKyAqIGZhY3QsIG5vbmUgb2YgdGhlIHNlZ21lbnRzIGNvdWxkIGNvbnRhaW4gYSBrZXlmcmFtZS4gV2UgdGFrZSBhCisgKiBwcmFjdGljYWwgYXBwcm9hY2g6IHNlZWsgdG8gdGhlIHByZXZpb3VzIGtleWZyYW1lIGluIHRoZSBzZWdtZW50LAorICogaWYgdGhlcmUgaXMgbm9uZSwgc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWdtZW50LgorICoKKyAqIENhbGxlZCB3aXRoIFNUUkVBTV9MT0NLCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3F0ZGVtdXhfcGVyZm9ybV9zZWVrIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0U2VnbWVudCAqIHNlZ21lbnQsCisgICAgZ3VpbnQzMiBzZXFudW0sIEdzdFNlZWtGbGFncyBmbGFncykKK3sKKyAgZ2ludDY0IGRlc2lyZWRfb2Zmc2V0OworICBnaW50IG47CisKKyAgZGVzaXJlZF9vZmZzZXQgPSBzZWdtZW50LT5wb3NpdGlvbjsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic2Vla2luZyB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChkZXNpcmVkX29mZnNldCkpOworCisgIC8qIG1heSBub3QgaGF2ZSBlbm91Z2ggZnJhZ21lbnRlZCBpbmZvIHRvIGRvIHRoaXMgYWRqdXN0bWVudCwKKyAgICogYW5kIHdlIGNhbid0IHNjYW4gKGFuZCBwcm9iYWJseSBzaG91bGQgbm90KSBhdCB0aGlzIHRpbWUgd2l0aAorICAgKiBwb3NzaWJseSBmbHVzaGluZyB1cHN0cmVhbSAqLworICBpZiAoKGZsYWdzICYgR1NUX1NFRUtfRkxBR19LRVlfVU5JVCkgJiYgIXF0ZGVtdXgtPmZyYWdtZW50ZWQpIHsKKyAgICBnaW50NjQgbWluX29mZnNldDsKKyAgICBnYm9vbGVhbiBuZXh0LCBiZWZvcmUsIGFmdGVyOworCisgICAgYmVmb3JlID0gISAhKGZsYWdzICYgR1NUX1NFRUtfRkxBR19TTkFQX0JFRk9SRSk7CisgICAgYWZ0ZXIgPSAhICEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NOQVBfQUZURVIpOworICAgIG5leHQgPSBhZnRlciAmJiAhYmVmb3JlOworICAgIGlmIChzZWdtZW50LT5yYXRlIDwgMCkKKyAgICAgIG5leHQgPSAhbmV4dDsKKworICAgIGdzdF9xdGRlbXV4X2FkanVzdF9zZWVrIChxdGRlbXV4LCBkZXNpcmVkX29mZnNldCwgVFJVRSwgbmV4dCwgJm1pbl9vZmZzZXQsCisgICAgICAgIE5VTEwpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJrZXlmcmFtZSBzZWVrLCBhbGlnbiB0byAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKG1pbl9vZmZzZXQpKTsKKyAgICBkZXNpcmVkX29mZnNldCA9IG1pbl9vZmZzZXQ7CisgIH0KKworICAvKiBhbmQgc2V0IGFsbCBzdHJlYW1zIHRvIHRoZSBmaW5hbCBwb3NpdGlvbiAqLworICBnc3RfZmxvd19jb21iaW5lcl9yZXNldCAocXRkZW11eC0+Zmxvd2NvbWJpbmVyKTsKKyAgcXRkZW11eC0+c2VnbWVudF9zZXFudW0gPSBzZXFudW07CisgIGZvciAobiA9IDA7IG4gPCBxdGRlbXV4LT5uX3N0cmVhbXM7IG4rKykgeworICAgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbSA9IHF0ZGVtdXgtPnN0cmVhbXNbbl07CisKKyAgICBzdHJlYW0tPnRpbWVfcG9zaXRpb24gPSBkZXNpcmVkX29mZnNldDsKKyAgICBzdHJlYW0tPmFjY3VtdWxhdGVkX2Jhc2UgPSAwOworICAgIHN0cmVhbS0+c2FtcGxlX2luZGV4ID0gLTE7CisgICAgc3RyZWFtLT5vZmZzZXRfaW5fc2FtcGxlID0gMDsKKyAgICBzdHJlYW0tPnNlZ21lbnRfaW5kZXggPSAtMTsKKyAgICBzdHJlYW0tPnNlbnRfZW9zID0gRkFMU0U7CisKKyAgICBpZiAoc2VnbWVudC0+ZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0ZMVVNIKQorICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnN0cmVhbS0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgfQorICBzZWdtZW50LT5wb3NpdGlvbiA9IGRlc2lyZWRfb2Zmc2V0OworICBzZWdtZW50LT50aW1lID0gZGVzaXJlZF9vZmZzZXQ7CisgIGlmIChzZWdtZW50LT5yYXRlID49IDApIHsKKyAgICBzZWdtZW50LT5zdGFydCA9IGRlc2lyZWRfb2Zmc2V0OworCisgICAgLyogd2Ugc3RvcCBhdCB0aGUgZW5kICovCisgICAgaWYgKHNlZ21lbnQtPnN0b3AgPT0gLTEpCisgICAgICBzZWdtZW50LT5zdG9wID0gc2VnbWVudC0+ZHVyYXRpb247CisgIH0gZWxzZSB7CisgICAgc2VnbWVudC0+c3RvcCA9IGRlc2lyZWRfb2Zmc2V0OworICB9CisKKyAgaWYgKHF0ZGVtdXgtPmZyYWdtZW50ZWQpCisgICAgcXRkZW11eC0+ZnJhZ21lbnRlZF9zZWVrX3BlbmRpbmcgPSBUUlVFOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBkbyBhIHNlZWsgaW4gcHVsbCBiYXNlZCBtb2RlICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdGRlbXV4X2RvX3NlZWsgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RQYWQgKiBwYWQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdkb3VibGUgcmF0ZTsKKyAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgR3N0U2Vla0ZsYWdzIGZsYWdzOworICBHc3RTZWVrVHlwZSBjdXJfdHlwZSwgc3RvcF90eXBlOworICBnaW50NjQgY3VyLCBzdG9wOworICBnYm9vbGVhbiBmbHVzaDsKKyAgZ2Jvb2xlYW4gdXBkYXRlOworICBHc3RTZWdtZW50IHNlZWtzZWdtZW50OworICBndWludDMyIHNlcW51bSA9IEdTVF9TRVFOVU1fSU5WQUxJRDsKKyAgR3N0RXZlbnQgKmZsdXNoX2V2ZW50OworICBnYm9vbGVhbiByZXQ7CisKKyAgaWYgKGV2ZW50KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImRvaW5nIHNlZWsgd2l0aCBldmVudCIpOworCisgICAgZ3N0X2V2ZW50X3BhcnNlX3NlZWsgKGV2ZW50LCAmcmF0ZSwgJmZvcm1hdCwgJmZsYWdzLAorICAgICAgICAmY3VyX3R5cGUsICZjdXIsICZzdG9wX3R5cGUsICZzdG9wKTsKKyAgICBzZXFudW0gPSBnc3RfZXZlbnRfZ2V0X3NlcW51bSAoZXZlbnQpOworCisgICAgLyogd2UgaGF2ZSB0byBoYXZlIGEgZm9ybWF0IGFzIHRoZSBzZWdtZW50IGZvcm1hdC4gVHJ5IHRvIGNvbnZlcnQKKyAgICAgKiBpZiBub3QuICovCisgICAgaWYgKCFnc3RfcXRkZW11eF9jb252ZXJ0X3NlZWsgKHBhZCwgJmZvcm1hdCwgY3VyX3R5cGUsICZjdXIsCisgICAgICAgICAgICBzdG9wX3R5cGUsICZzdG9wKSkKKyAgICAgIGdvdG8gbm9fZm9ybWF0OworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInNlZWsgZm9ybWF0ICVzIiwgZ3N0X2Zvcm1hdF9nZXRfbmFtZSAoZm9ybWF0KSk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImRvaW5nIHNlZWsgd2l0aG91dCBldmVudCIpOworICAgIGZsYWdzID0gMDsKKyAgfQorCisgIGZsdXNoID0gZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0ZMVVNIOworCisgIC8qIHN0b3Agc3RyZWFtaW5nLCBlaXRoZXIgYnkgZmx1c2hpbmcgb3IgYnkgcGF1c2luZyB0aGUgdGFzayAqLworICBpZiAoZmx1c2gpIHsKKyAgICBmbHVzaF9ldmVudCA9IGdzdF9ldmVudF9uZXdfZmx1c2hfc3RhcnQgKCk7CisgICAgaWYgKHNlcW51bSAhPSBHU1RfU0VRTlVNX0lOVkFMSUQpCisgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZmx1c2hfZXZlbnQsIHNlcW51bSk7CisgICAgLyogdW5sb2NrIHVwc3RyZWFtIHB1bGxfcmFuZ2UgKi8KKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHF0ZGVtdXgtPnNpbmtwYWQsIGdzdF9ldmVudF9yZWYgKGZsdXNoX2V2ZW50KSk7CisgICAgLyogbWFrZSBzdXJlIG91dCBsb29wIGZ1bmN0aW9uIGV4aXRzICovCisgICAgZ3N0X3F0ZGVtdXhfcHVzaF9ldmVudCAocXRkZW11eCwgZmx1c2hfZXZlbnQpOworICB9IGVsc2UgeworICAgIC8qIG5vbiBmbHVzaGluZyBzZWVrLCBwYXVzZSB0aGUgdGFzayAqLworICAgIGdzdF9wYWRfcGF1c2VfdGFzayAocXRkZW11eC0+c2lua3BhZCk7CisgIH0KKworICAvKiB3YWl0IGZvciBzdHJlYW1pbmcgdG8gZmluaXNoICovCisgIEdTVF9QQURfU1RSRUFNX0xPQ0sgKHF0ZGVtdXgtPnNpbmtwYWQpOworCisgIC8qIGNvcHkgc2VnbWVudCwgd2UgbmVlZCB0aGlzIGJlY2F1c2Ugd2Ugc3RpbGwgbmVlZCB0aGUgb2xkCisgICAqIHNlZ21lbnQgd2hlbiB3ZSBjbG9zZSB0aGUgY3VycmVudCBzZWdtZW50LiAqLworICBtZW1jcHkgKCZzZWVrc2VnbWVudCwgJnF0ZGVtdXgtPnNlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworCisgIGlmIChldmVudCkgeworICAgIC8qIGNvbmZpZ3VyZSB0aGUgc2VnbWVudCB3aXRoIHRoZSBzZWVrIHZhcmlhYmxlcyAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJjb25maWd1cmluZyBzZWVrIik7CisgICAgaWYgKCFnc3Rfc2VnbWVudF9kb19zZWVrICgmc2Vla3NlZ21lbnQsIHJhdGUsIGZvcm1hdCwgZmxhZ3MsCisgICAgICAgICAgICBjdXJfdHlwZSwgY3VyLCBzdG9wX3R5cGUsIHN0b3AsICZ1cGRhdGUpKSB7CisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJpbmNvbnNpc3RlbnQgc2VlayB2YWx1ZXMsIGRvaW5nIG5vdGhpbmciKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogbm93IGRvIHRoZSBzZWVrICovCisgICAgICByZXQgPSBnc3RfcXRkZW11eF9wZXJmb3JtX3NlZWsgKHF0ZGVtdXgsICZzZWVrc2VnbWVudCwgc2VxbnVtLCBmbGFncyk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIG5vdyBkbyB0aGUgc2VlayAqLworICAgIHJldCA9IGdzdF9xdGRlbXV4X3BlcmZvcm1fc2VlayAocXRkZW11eCwgJnNlZWtzZWdtZW50LCBzZXFudW0sIGZsYWdzKTsKKyAgfQorCisgIC8qIHByZXBhcmUgZm9yIHN0cmVhbWluZyBhZ2FpbiAqLworICBpZiAoZmx1c2gpIHsKKyAgICBmbHVzaF9ldmVudCA9IGdzdF9ldmVudF9uZXdfZmx1c2hfc3RvcCAoVFJVRSk7CisgICAgaWYgKHNlcW51bSAhPSBHU1RfU0VRTlVNX0lOVkFMSUQpCisgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZmx1c2hfZXZlbnQsIHNlcW51bSk7CisKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHF0ZGVtdXgtPnNpbmtwYWQsIGdzdF9ldmVudF9yZWYgKGZsdXNoX2V2ZW50KSk7CisgICAgZ3N0X3F0ZGVtdXhfcHVzaF9ldmVudCAocXRkZW11eCwgZmx1c2hfZXZlbnQpOworICB9CisKKyAgLyogY29tbWl0IHRoZSBuZXcgc2VnbWVudCAqLworICBtZW1jcHkgKCZxdGRlbXV4LT5zZWdtZW50LCAmc2Vla3NlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworCisgIGlmIChxdGRlbXV4LT5zZWdtZW50LmZsYWdzICYgR1NUX1NFRUtfRkxBR19TRUdNRU5UKSB7CisgICAgR3N0TWVzc2FnZSAqbXNnID0gZ3N0X21lc3NhZ2VfbmV3X3NlZ21lbnRfc3RhcnQgKEdTVF9PQkpFQ1RfQ0FTVCAocXRkZW11eCksCisgICAgICAgIHF0ZGVtdXgtPnNlZ21lbnQuZm9ybWF0LCBxdGRlbXV4LT5zZWdtZW50LnBvc2l0aW9uKTsKKyAgICBpZiAoc2VxbnVtICE9IEdTVF9TRVFOVU1fSU5WQUxJRCkKKyAgICAgIGdzdF9tZXNzYWdlX3NldF9zZXFudW0gKG1zZywgc2VxbnVtKTsKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHF0ZGVtdXgpLCBtc2cpOworICB9CisKKyAgLyogcmVzdGFydCBzdHJlYW1pbmcsIE5FV1NFR01FTlQgd2lsbCBiZSBzZW50IGZyb20gdGhlIHN0cmVhbWluZyB0aHJlYWQuICovCisgIGdzdF9wYWRfc3RhcnRfdGFzayAocXRkZW11eC0+c2lua3BhZCwgKEdzdFRhc2tGdW5jdGlvbikgZ3N0X3F0ZGVtdXhfbG9vcCwKKyAgICAgIHF0ZGVtdXgtPnNpbmtwYWQsIE5VTEwpOworCisgIEdTVF9QQURfU1RSRUFNX1VOTE9DSyAocXRkZW11eC0+c2lua3BhZCk7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK25vX2Zvcm1hdDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJ1bnN1cHBvcnRlZCBmb3JtYXQgZ2l2ZW4sIHNlZWsgYWJvcnRlZC4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X2Vuc3VyZV9pbmRleCAoR3N0UVREZW11eCAqIHF0ZGVtdXgpCit7CisgIGd1aW50IGk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImNvbGxlY3RpbmcgYWxsIG1ldGFkYXRhIGZvciBhbGwgc3RyZWFtcyIpOworCisgIC8qIEJ1aWxkIGNvbXBsZXRlIGluZGV4ICovCisgIGZvciAoaSA9IDA7IGkgPCBxdGRlbXV4LT5uX3N0cmVhbXM7IGkrKykgeworICAgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbSA9IHF0ZGVtdXgtPnN0cmVhbXNbaV07CisKKyAgICBpZiAoIXF0ZGVtdXhfcGFyc2Vfc2FtcGxlcyAocXRkZW11eCwgc3RyZWFtLCBzdHJlYW0tPm5fc2FtcGxlcyAtIDEpKQorICAgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgfQorICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3BhcnNlX2Vycm9yOgorICB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICJCdWlsZGluZyBjb21wbGV0ZSBpbmRleCBvZiBzdHJlYW0gJXUgZm9yIHNlZWtpbmcgZmFpbGVkISIsIGkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdGRlbXV4X2hhbmRsZV9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIEdzdFFURGVtdXggKnF0ZGVtdXggPSBHU1RfUVRERU1VWCAocGFyZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUVLOgorICAgIHsKKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgICAgICBHc3RDbG9ja1RpbWUgdHMgPSBnc3RfdXRpbF9nZXRfdGltZXN0YW1wICgpOworI2VuZGlmCisgICAgICBndWludDMyIHNlcW51bSA9IGdzdF9ldmVudF9nZXRfc2VxbnVtIChldmVudCk7CisKKyAgICAgIGlmIChzZXFudW0gPT0gcXRkZW11eC0+c2VnbWVudF9zZXFudW0pIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhZCwKKyAgICAgICAgICAgICJEcm9wIGR1cGxpY2F0ZWQgU0VFSyBldmVudCBzZXFudW0gJSIgR19HVUlOVDMyX0ZPUk1BVCwgc2VxbnVtKTsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorCisgICAgICBpZiAocXRkZW11eC0+dXBzdHJlYW1fZm9ybWF0X2lzX3RpbWUgJiYgcXRkZW11eC0+ZnJhZ21lbnRlZCkgeworICAgICAgICAvKiBzZWVrIHNob3VsZCBiZSBoYW5kbGVkIGJ5IHVwc3RyZWFtLCB3ZSBtaWdodCBuZWVkIHRvIHJlLWRvd25sb2FkIGZyYWdtZW50cyAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICAgImxldCB1cHN0cmVhbSBoYW5kbGUgc2VlayBmb3IgZnJhZ21lbnRlZCBwbGF5YmFjayIpOworICAgICAgICBnb3RvIHVwc3RyZWFtOworICAgICAgfQorCisgICAgICAvKiBCdWlsZCBjb21wbGV0ZSBpbmRleCBmb3Igc2Vla2luZzsKKyAgICAgICAqIGlmIG5vdCBhIGZyYWdtZW50ZWQgZmlsZSBhdCBsZWFzdCAqLworICAgICAgaWYgKCFxdGRlbXV4LT5mcmFnbWVudGVkKQorICAgICAgICBpZiAoIXF0ZGVtdXhfZW5zdXJlX2luZGV4IChxdGRlbXV4KSkKKyAgICAgICAgICBnb3RvIGluZGV4X2ZhaWxlZDsKKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgICAgICB0cyA9IGdzdF91dGlsX2dldF90aW1lc3RhbXAgKCkgLSB0czsKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAiVGltZSB0YWtlbiB0byBwYXJzZSBpbmRleCAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHRzKSk7CisjZW5kaWYKKyAgICB9CisgICAgICBpZiAocXRkZW11eC0+cHVsbGJhc2VkKSB7CisgICAgICAgIHJlcyA9IGdzdF9xdGRlbXV4X2RvX3NlZWsgKHF0ZGVtdXgsIHBhZCwgZXZlbnQpOworICAgICAgfSBlbHNlIGlmIChnc3RfcGFkX3B1c2hfZXZlbnQgKHF0ZGVtdXgtPnNpbmtwYWQsIGdzdF9ldmVudF9yZWYgKGV2ZW50KSkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIlVwc3RyZWFtIHN1Y2Nlc3NmdWxseSBzZWVrZWQiKTsKKyAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgIH0gZWxzZSBpZiAocXRkZW11eC0+c3RhdGUgPT0gUVRERU1VWF9TVEFURV9NT1ZJRSAmJiBxdGRlbXV4LT5uX3N0cmVhbXMKKyAgICAgICAgICAmJiAhcXRkZW11eC0+ZnJhZ21lbnRlZCkgeworICAgICAgICByZXMgPSBnc3RfcXRkZW11eF9kb19wdXNoX3NlZWsgKHF0ZGVtdXgsIHBhZCwgZXZlbnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICJpZ25vcmluZyBzZWVrIGluIHB1c2ggbW9kZSBpbiBjdXJyZW50IHN0YXRlIik7CisgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgfQorICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgIHVwc3RyZWFtOgorICAgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworZG9uZToKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK2luZGV4X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJJbmRleCBmYWlsZWQiKTsKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICByZXMgPSBGQUxTRTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworLyogRmluZCwgZm9yIGVhY2ggdHJhY2ssIHRoZSBmaXJzdCBzYW1wbGUgaW4gY29kaW5nIG9yZGVyIHRoYXQgaGFzIGEgZmlsZSBvZmZzZXQgPj0gQGJ5dGVfcG9zLgorICoKKyAqIElmIEBmdyBpcyBmYWxzZSwgdGhlIGNvZGluZyBvcmRlciBpcyBleHBsb3JlZCBiYWNrd2FyZHMuCisgKgorICogSWYgQHNldCBpcyB0cnVlLCBlYWNoIHN0cmVhbSB3aWxsIGJlIG1vdmVkIHRvIGl0cyBtYXRjaGVkIHNhbXBsZSwgb3IgRU9TIGlmIG5vIG1hdGNoaW5nCisgKiBzYW1wbGUgaXMgZm91bmQgZm9yIHRoYXQgdHJhY2suCisgKgorICogVGhlIHN0cmVhbSBhbmQgc2FtcGxlIGluZGV4IG9mIHRoZSBzYW1wbGUgd2l0aCB0aGUgbWluaW11bSBvZmZzZXQgaW4gdGhlIGRpcmVjdGlvbiBleHBsb3JlZAorICogKHNlZSBAZncpIGlzIHJldHVybmVkIGluIHRoZSBvdXRwdXQgcGFyYW1ldGVycyBAX3N0cmVhbSBhbmQgQF9pbmRleCByZXNwZWN0aXZlbHkuCisgKgorICogQF90aW1lIGlzIHNldCB0byB0aGUgUVRTQU1QTEVfUFRTIG9mIHRoZSBtYXRjaGVkIHNhbXBsZSB3aXRoIHRoZSBtaW5pbXVtIFFUU0FNUExFX1BUUyBpbiB0aGUKKyAqIGRpcmVjdGlvbiBleHBsb3JlZCwgd2hpY2ggbWF5IG5vdCBhbHdheXMgbWF0Y2ggdGhlIFFUU0FNUExFX1BUUyBvZiB0aGUgc2FtcGxlIHJldHVybmVkIGluCisgKiBAX3N0cmVhbSBhbmQgQF9pbmRleC4gKi8KK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9maW5kX3NhbXBsZSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIGdpbnQ2NCBieXRlX3BvcywgZ2Jvb2xlYW4gZncsCisgICAgZ2Jvb2xlYW4gc2V0LCBRdERlbXV4U3RyZWFtICoqIF9zdHJlYW0sIGdpbnQgKiBfaW5kZXgsIGdpbnQ2NCAqIF90aW1lKQoreworICBnaW50IGksIG4sIGluZGV4OworICBnaW50NjQgdGltZSwgbWluX3RpbWU7CisgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbTsKKworICBtaW5fdGltZSA9IC0xOworICBzdHJlYW0gPSBOVUxMOworICBpbmRleCA9IC0xOworCisgIGZvciAobiA9IDA7IG4gPCBxdGRlbXV4LT5uX3N0cmVhbXM7ICsrbikgeworICAgIFF0RGVtdXhTdHJlYW0gKnN0cjsKKyAgICBnaW50IGluYzsKKyAgICBnYm9vbGVhbiBzZXRfc2FtcGxlOworCisgICAgc3RyID0gcXRkZW11eC0+c3RyZWFtc1tuXTsKKyAgICBzZXRfc2FtcGxlID0gIXNldDsKKworICAgIGlmIChmdykgeworICAgICAgaSA9IDA7CisgICAgICBpbmMgPSAxOworICAgIH0gZWxzZSB7CisgICAgICBpID0gc3RyLT5uX3NhbXBsZXMgLSAxOworICAgICAgaW5jID0gLTE7CisgICAgfQorCisgICAgZm9yICg7IChpID49IDApICYmIChpIDwgc3RyLT5uX3NhbXBsZXMpOyBpICs9IGluYykgeworICAgICAgaWYgKHN0ci0+c2FtcGxlc1tpXS5zaXplID09IDApCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoZncgJiYgKHN0ci0+c2FtcGxlc1tpXS5vZmZzZXQgPCBieXRlX3BvcykpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoIWZ3ICYmIChzdHItPnNhbXBsZXNbaV0ub2Zmc2V0ICsgc3RyLT5zYW1wbGVzW2ldLnNpemUgPiBieXRlX3BvcykpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvKiBtb3ZlIHN0cmVhbSB0byBmaXJzdCBhdmFpbGFibGUgc2FtcGxlICovCisgICAgICBpZiAoc2V0KSB7CisgICAgICAgIGdzdF9xdGRlbXV4X21vdmVfc3RyZWFtIChxdGRlbXV4LCBzdHIsIGkpOworICAgICAgICBzZXRfc2FtcGxlID0gVFJVRTsKKyAgICAgIH0KKworICAgICAgLyogYXZvaWQgaW5kZXggZnJvbSBzcGFyc2Ugc3RyZWFtcyBzaW5jZSB0aGV5IG1pZ2h0IGJlIGZhciBhd2F5ICovCisgICAgICBpZiAoIUNVUl9TVFJFQU0gKHN0ciktPnNwYXJzZSkgeworICAgICAgICAvKiBkZXRlcm1pbmUgbWluL21heCB0aW1lICovCisgICAgICAgIHRpbWUgPSBRVFNBTVBMRV9QVFMgKHN0ciwgJnN0ci0+c2FtcGxlc1tpXSk7CisgICAgICAgIGlmIChtaW5fdGltZSA9PSAtMSB8fCAoIWZ3ICYmIHRpbWUgPiBtaW5fdGltZSkgfHwKKyAgICAgICAgICAgIChmdyAmJiB0aW1lIDwgbWluX3RpbWUpKSB7CisgICAgICAgICAgbWluX3RpbWUgPSB0aW1lOworICAgICAgICB9CisKKyAgICAgICAgLyogZGV0ZXJtaW5lIHN0cmVhbSB3aXRoIGxlYWRpbmcgc2FtcGxlLCB0byBnZXQgaXRzIHBvc2l0aW9uICovCisgICAgICAgIGlmICghc3RyZWFtIHx8CisgICAgICAgICAgICAoZncgJiYgKHN0ci0+c2FtcGxlc1tpXS5vZmZzZXQgPCBzdHJlYW0tPnNhbXBsZXNbaW5kZXhdLm9mZnNldCkpIHx8CisgICAgICAgICAgICAoIWZ3ICYmIChzdHItPnNhbXBsZXNbaV0ub2Zmc2V0ID4gc3RyZWFtLT5zYW1wbGVzW2luZGV4XS5vZmZzZXQpKSkgeworICAgICAgICAgIHN0cmVhbSA9IHN0cjsKKyAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIG5vIHNhbXBsZSBmb3IgdGhpcyBzdHJlYW0sIG1hcmsgZW9zICovCisgICAgaWYgKCFzZXRfc2FtcGxlKQorICAgICAgZ3N0X3F0ZGVtdXhfbW92ZV9zdHJlYW0gKHF0ZGVtdXgsIHN0ciwgc3RyLT5uX3NhbXBsZXMpOworICB9CisKKyAgaWYgKF90aW1lKQorICAgICpfdGltZSA9IG1pbl90aW1lOworICBpZiAoX3N0cmVhbSkKKyAgICAqX3N0cmVhbSA9IHN0cmVhbTsKKyAgaWYgKF9pbmRleCkKKyAgICAqX2luZGV4ID0gaW5kZXg7Cit9CisKK3N0YXRpYyBRdERlbXV4U3RyZWFtICoKK19jcmVhdGVfc3RyZWFtICh2b2lkKQoreworICBRdERlbXV4U3RyZWFtICpzdHJlYW07CisKKyAgc3RyZWFtID0gZ19uZXcwIChRdERlbXV4U3RyZWFtLCAxKTsKKyAgLyogbmV3IHN0cmVhbXMgYWx3YXlzIG5lZWQgYSBkaXNjb250ICovCisgIHN0cmVhbS0+ZGlzY29udCA9IFRSVUU7CisgIC8qIHdlIGVuYWJsZSBjbGlwcGluZyBmb3IgcmF3IGF1ZGlvL3ZpZGVvIHN0cmVhbXMgKi8KKyAgc3RyZWFtLT5uZWVkX2NsaXAgPSBGQUxTRTsKKyAgc3RyZWFtLT5uZWVkX3Byb2Nlc3MgPSBGQUxTRTsKKyAgc3RyZWFtLT5zZWdtZW50X2luZGV4ID0gLTE7CisgIHN0cmVhbS0+dGltZV9wb3NpdGlvbiA9IDA7CisgIHN0cmVhbS0+c2FtcGxlX2luZGV4ID0gLTE7CisgIHN0cmVhbS0+b2Zmc2V0X2luX3NhbXBsZSA9IDA7CisgIHN0cmVhbS0+bmV3X3N0cmVhbSA9IFRSVUU7CisgIHN0cmVhbS0+bXVsdGl2aWV3X21vZGUgPSBHU1RfVklERU9fTVVMVElWSUVXX01PREVfTk9ORTsKKyAgc3RyZWFtLT5tdWx0aXZpZXdfZmxhZ3MgPSBHU1RfVklERU9fTVVMVElWSUVXX0ZMQUdTX05PTkU7CisgIHN0cmVhbS0+cHJvdGVjdGVkID0gRkFMU0U7CisgIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfdHlwZSA9IDA7CisgIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfdmVyc2lvbiA9IDA7CisgIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfaW5mbyA9IE5VTEw7CisgIHN0cmVhbS0+bl9zYW1wbGVzX21vb2YgPSAwOworICBzdHJlYW0tPmR1cmF0aW9uX21vb2YgPSAwOworICBzdHJlYW0tPmR1cmF0aW9uX2xhc3RfbW9vZiA9IDA7CisgIHN0cmVhbS0+YWxpZ25tZW50ID0gMTsKKyAgc3RyZWFtLT5zdHJlYW1fdGFncyA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIGdzdF90YWdfbGlzdF9zZXRfc2NvcGUgKHN0cmVhbS0+c3RyZWFtX3RhZ3MsIEdTVF9UQUdfU0NPUEVfU1RSRUFNKTsKKyAgZ19xdWV1ZV9pbml0ICgmc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV9ldmVudF9xdWV1ZSk7CisgIHJldHVybiBzdHJlYW07Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3F0ZGVtdXhfc2V0Y2FwcyAoR3N0UVREZW11eCAqIGRlbXV4LCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IGdjaGFyICp2YXJpYW50OworICBjb25zdCBHc3RDYXBzICptZWRpYWNhcHMgPSBOVUxMOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiU2luayBzZXQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICB2YXJpYW50ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJ2YXJpYW50Iik7CisKKyAgaWYgKHZhcmlhbnQgJiYgc3RyY21wICh2YXJpYW50LCAibXNzLWZyYWdtZW50ZWQiKSA9PSAwKSB7CisgICAgUXREZW11eFN0cmVhbSAqc3RyZWFtOworICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWU7CisKKyAgICBkZW11eC0+ZnJhZ21lbnRlZCA9IFRSVUU7CisgICAgZGVtdXgtPm1zc19tb2RlID0gVFJVRTsKKworICAgIGlmIChkZW11eC0+bl9zdHJlYW1zID4gMSkgeworICAgICAgLyogY2FuJ3QgZG8gdGhpcywgd2UgY2FuIG9ubHkgcmVuZWdvdGlhdGUgZm9yIGFub3RoZXIgbXNzIGZvcm1hdCAqLworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgIm1lZGlhLWNhcHMiKTsKKyAgICAvKiBjcmVhdGUgc3RyZWFtICovCisgICAgaWYgKHZhbHVlKSB7CisgICAgICBjb25zdCBHVmFsdWUgKnRpbWVzY2FsZV92OworCisgICAgICAvKiBUT0RPIHVwZGF0ZSB3aGVuIHN0cmVhbSBjaGFuZ2VzIGR1cmluZyBwbGF5YmFjayAqLworCisgICAgICBpZiAoZGVtdXgtPm5fc3RyZWFtcyA9PSAwKSB7CisgICAgICAgIHN0cmVhbSA9IF9jcmVhdGVfc3RyZWFtICgpOworICAgICAgICBkZW11eC0+c3RyZWFtc1tkZW11eC0+bl9zdHJlYW1zXSA9IHN0cmVhbTsKKyAgICAgICAgZGVtdXgtPm5fc3RyZWFtcyA9IDE7CisgICAgICAgIC8qIG1zcyBoYXMgbm8gc3RzZC9zdHNkIGVudHJ5LCB1c2UgaWQgMCBhcyBkZWZhdWx0ICovCisgICAgICAgIHN0cmVhbS0+c3RzZF9lbnRyaWVzX2xlbmd0aCA9IDE7CisgICAgICAgIHN0cmVhbS0+c3RzZF9zYW1wbGVfZGVzY3JpcHRpb25faWQgPSBzdHJlYW0tPmN1cl9zdHNkX2VudHJ5X2luZGV4ID0gMDsKKyAgICAgICAgc3RyZWFtLT5zdHNkX2VudHJpZXMgPSBnX25ldzAgKFF0RGVtdXhTdHJlYW1TdHNkRW50cnksIDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyZWFtID0gZGVtdXgtPnN0cmVhbXNbMF07CisgICAgICB9CisKKyAgICAgIHRpbWVzY2FsZV92ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgInRpbWVzY2FsZSIpOworICAgICAgaWYgKHRpbWVzY2FsZV92KSB7CisgICAgICAgIHN0cmVhbS0+dGltZXNjYWxlID0gZ192YWx1ZV9nZXRfdWludDY0ICh0aW1lc2NhbGVfdik7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBkZWZhdWx0IG1zcyB0aW1lc2NhbGUgKi8KKyAgICAgICAgc3RyZWFtLT50aW1lc2NhbGUgPSAxMDAwMDAwMDsKKyAgICAgIH0KKyAgICAgIGRlbXV4LT50aW1lc2NhbGUgPSBzdHJlYW0tPnRpbWVzY2FsZTsKKworICAgICAgbWVkaWFjYXBzID0gZ3N0X3ZhbHVlX2dldF9jYXBzICh2YWx1ZSk7CisgICAgICBpZiAoIUNVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMKKyAgICAgICAgICB8fCAhZ3N0X2NhcHNfaXNfZXF1YWxfZml4ZWQgKG1lZGlhY2FwcywgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y2FwcykpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJXZSBoYXZlIGEgbmV3IGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgICBtZWRpYWNhcHMpOworICAgICAgICBzdHJlYW0tPm5ld19jYXBzID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGdzdF9jYXBzX3JlcGxhY2UgKCZDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLCAoR3N0Q2FwcyAqKSBtZWRpYWNhcHMpOworICAgICAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAobWVkaWFjYXBzLCAwKTsKKyAgICAgIGlmIChnX3N0cl9oYXNfcHJlZml4IChnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzdHJ1Y3R1cmUpLCAidmlkZW8iKSkgeworICAgICAgICBzdHJlYW0tPnN1YnR5cGUgPSBGT1VSQ0NfdmlkZTsKKworICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIndpZHRoIiwgJkNVUl9TVFJFQU0gKHN0cmVhbSktPndpZHRoKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJoZWlnaHQiLAorICAgICAgICAgICAgJkNVUl9TVFJFQU0gKHN0cmVhbSktPmhlaWdodCk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ZyYWN0aW9uIChzdHJ1Y3R1cmUsICJmcmFtZXJhdGUiLAorICAgICAgICAgICAgJkNVUl9TVFJFQU0gKHN0cmVhbSktPmZwc19uLCAmQ1VSX1NUUkVBTSAoc3RyZWFtKS0+ZnBzX2QpOworICAgICAgfSBlbHNlIGlmIChnX3N0cl9oYXNfcHJlZml4IChnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzdHJ1Y3R1cmUpLCAiYXVkaW8iKSkgeworICAgICAgICBnaW50IHJhdGUgPSAwOworICAgICAgICBzdHJlYW0tPnN1YnR5cGUgPSBGT1VSQ0Nfc291bjsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsCisgICAgICAgICAgICAmQ1VSX1NUUkVBTSAoc3RyZWFtKS0+bl9jaGFubmVscyk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAicmF0ZSIsICZyYXRlKTsKKyAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cmF0ZSA9IHJhdGU7CisgICAgICB9CisgICAgfQorICAgIGdzdF9jYXBzX3JlcGxhY2UgKCZkZW11eC0+bWVkaWFfY2FwcywgKEdzdENhcHMgKikgbWVkaWFjYXBzKTsKKyAgfSBlbHNlIHsKKyAgICBkZW11eC0+bXNzX21vZGUgPSBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfcmVzZXQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBnYm9vbGVhbiBoYXJkKQoreworICBnaW50IG47CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIlJlc2V0dGluZyBkZW11eCIpOworICBnc3RfcGFkX3N0b3BfdGFzayAocXRkZW11eC0+c2lua3BhZCk7CisKKyAgaWYgKGhhcmQgfHwgcXRkZW11eC0+dXBzdHJlYW1fZm9ybWF0X2lzX3RpbWUpIHsKKyAgICBxdGRlbXV4LT5zdGF0ZSA9IFFUREVNVVhfU1RBVEVfSU5JVElBTDsKKyAgICBxdGRlbXV4LT5uZWVkZWRieXRlcyA9IDE2OworICAgIHF0ZGVtdXgtPnRvZHJvcCA9IDA7CisgICAgcXRkZW11eC0+cHVsbGJhc2VkID0gRkFMU0U7CisgICAgcXRkZW11eC0+cG9zdGVkX3JlZGlyZWN0ID0gRkFMU0U7CisgICAgcXRkZW11eC0+Zmlyc3RfbWRhdCA9IC0xOworICAgIHF0ZGVtdXgtPmhlYWRlcl9zaXplID0gMDsKKyAgICBxdGRlbXV4LT5tZGF0b2Zmc2V0ID0gLTE7CisgICAgcXRkZW11eC0+cmVzdG9yZWRhdGFfb2Zmc2V0ID0gLTE7CisgICAgaWYgKHF0ZGVtdXgtPm1kYXRidWZmZXIpCisgICAgICBnc3RfYnVmZmVyX3VucmVmIChxdGRlbXV4LT5tZGF0YnVmZmVyKTsKKyAgICBpZiAocXRkZW11eC0+cmVzdG9yZWRhdGFfYnVmZmVyKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocXRkZW11eC0+cmVzdG9yZWRhdGFfYnVmZmVyKTsKKyAgICBxdGRlbXV4LT5tZGF0YnVmZmVyID0gTlVMTDsKKyAgICBxdGRlbXV4LT5yZXN0b3JlZGF0YV9idWZmZXIgPSBOVUxMOworICAgIHF0ZGVtdXgtPm1kYXRsZWZ0ID0gMDsKKyAgICBxdGRlbXV4LT5tZGF0c2l6ZSA9IDA7CisgICAgaWYgKHF0ZGVtdXgtPmNvbXBfYnJhbmRzKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocXRkZW11eC0+Y29tcF9icmFuZHMpOworICAgIHF0ZGVtdXgtPmNvbXBfYnJhbmRzID0gTlVMTDsKKyAgICBxdGRlbXV4LT5sYXN0X21vb3Zfb2Zmc2V0ID0gLTE7CisgICAgaWYgKHF0ZGVtdXgtPm1vb3Zfbm9kZV9jb21wcmVzc2VkKSB7CisgICAgICBnX25vZGVfZGVzdHJveSAocXRkZW11eC0+bW9vdl9ub2RlX2NvbXByZXNzZWQpOworICAgICAgaWYgKHF0ZGVtdXgtPm1vb3Zfbm9kZSkKKyAgICAgICAgZ19mcmVlIChxdGRlbXV4LT5tb292X25vZGUtPmRhdGEpOworICAgIH0KKyAgICBxdGRlbXV4LT5tb292X25vZGVfY29tcHJlc3NlZCA9IE5VTEw7CisgICAgaWYgKHF0ZGVtdXgtPm1vb3Zfbm9kZSkKKyAgICAgIGdfbm9kZV9kZXN0cm95IChxdGRlbXV4LT5tb292X25vZGUpOworICAgIHF0ZGVtdXgtPm1vb3Zfbm9kZSA9IE5VTEw7CisgICAgaWYgKHF0ZGVtdXgtPnRhZ19saXN0KQorICAgICAgZ3N0X21pbmlfb2JqZWN0X3VucmVmIChHU1RfTUlOSV9PQkpFQ1RfQ0FTVCAocXRkZW11eC0+dGFnX2xpc3QpKTsKKyAgICBxdGRlbXV4LT50YWdfbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgICAgZ3N0X3RhZ19saXN0X3NldF9zY29wZSAocXRkZW11eC0+dGFnX2xpc3QsIEdTVF9UQUdfU0NPUEVfR0xPQkFMKTsKKyNpZiAwCisgICAgaWYgKHF0ZGVtdXgtPmVsZW1lbnRfaW5kZXgpCisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChxdGRlbXV4LT5lbGVtZW50X2luZGV4KTsKKyAgICBxdGRlbXV4LT5lbGVtZW50X2luZGV4ID0gTlVMTDsKKyNlbmRpZgorICAgIHF0ZGVtdXgtPm1ham9yX2JyYW5kID0gMDsKKyAgICBpZiAocXRkZW11eC0+cGVuZGluZ19uZXdzZWdtZW50KQorICAgICAgZ3N0X2V2ZW50X3VucmVmIChxdGRlbXV4LT5wZW5kaW5nX25ld3NlZ21lbnQpOworICAgIHF0ZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCA9IE5VTEw7CisgICAgcXRkZW11eC0+dXBzdHJlYW1fZm9ybWF0X2lzX3RpbWUgPSBGQUxTRTsKKyAgICBxdGRlbXV4LT51cHN0cmVhbV9zZWVrYWJsZSA9IEZBTFNFOworICAgIHF0ZGVtdXgtPnVwc3RyZWFtX3NpemUgPSAwOworCisgICAgcXRkZW11eC0+ZnJhZ21lbnRfc3RhcnQgPSAtMTsKKyAgICBxdGRlbXV4LT5mcmFnbWVudF9zdGFydF9vZmZzZXQgPSAtMTsKKyAgICBxdGRlbXV4LT5kdXJhdGlvbiA9IDA7CisgICAgcXRkZW11eC0+bW9vZl9vZmZzZXQgPSAwOworICAgIHF0ZGVtdXgtPmNoYXB0ZXJzX3RyYWNrX2lkID0gMDsKKyAgICBxdGRlbXV4LT5oYXZlX2dyb3VwX2lkID0gRkFMU0U7CisgICAgcXRkZW11eC0+Z3JvdXBfaWQgPSBHX01BWFVJTlQ7CisKKyAgICBnX3F1ZXVlX2ZvcmVhY2ggKCZxdGRlbXV4LT5wcm90ZWN0aW9uX2V2ZW50X3F1ZXVlLCAoR0Z1bmMpIGdzdF9ldmVudF91bnJlZiwKKyAgICAgICAgTlVMTCk7CisgICAgZ19xdWV1ZV9jbGVhciAoJnF0ZGVtdXgtPnByb3RlY3Rpb25fZXZlbnRfcXVldWUpOworICB9CisgIHF0ZGVtdXgtPm9mZnNldCA9IDA7CisgIGdzdF9hZGFwdGVyX2NsZWFyIChxdGRlbXV4LT5hZGFwdGVyKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnF0ZGVtdXgtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIHF0ZGVtdXgtPnNlZ21lbnRfc2VxbnVtID0gR1NUX1NFUU5VTV9JTlZBTElEOworCisgIGlmIChoYXJkKSB7CisgICAgZm9yIChuID0gMDsgbiA8IHF0ZGVtdXgtPm5fc3RyZWFtczsgbisrKSB7CisgICAgICBnc3RfcXRkZW11eF9zdHJlYW1fZnJlZSAocXRkZW11eCwgcXRkZW11eC0+c3RyZWFtc1tuXSk7CisgICAgICBxdGRlbXV4LT5zdHJlYW1zW25dID0gTlVMTDsKKyAgICB9CisgICAgcXRkZW11eC0+bl9zdHJlYW1zID0gMDsKKyAgICBxdGRlbXV4LT5uX3ZpZGVvX3N0cmVhbXMgPSAwOworICAgIHF0ZGVtdXgtPm5fYXVkaW9fc3RyZWFtcyA9IDA7CisgICAgcXRkZW11eC0+bl9zdWJfc3RyZWFtcyA9IDA7CisgICAgcXRkZW11eC0+ZXhwb3NlZCA9IEZBTFNFOworICAgIHF0ZGVtdXgtPmZyYWdtZW50ZWQgPSBGQUxTRTsKKyAgICBxdGRlbXV4LT5tc3NfbW9kZSA9IEZBTFNFOworICAgIGdzdF9jYXBzX3JlcGxhY2UgKCZxdGRlbXV4LT5tZWRpYV9jYXBzLCBOVUxMKTsKKyAgICBxdGRlbXV4LT50aW1lc2NhbGUgPSAwOworICAgIHF0ZGVtdXgtPmdvdF9tb292ID0gRkFMU0U7CisgICAgaWYgKHF0ZGVtdXgtPnByb3RlY3Rpb25fc3lzdGVtX2lkcykgeworICAgICAgZ19wdHJfYXJyYXlfZnJlZSAocXRkZW11eC0+cHJvdGVjdGlvbl9zeXN0ZW1faWRzLCBUUlVFKTsKKyAgICAgIHF0ZGVtdXgtPnByb3RlY3Rpb25fc3lzdGVtX2lkcyA9IE5VTEw7CisgICAgfQorICB9IGVsc2UgaWYgKHF0ZGVtdXgtPm1zc19tb2RlKSB7CisgICAgZ3N0X2Zsb3dfY29tYmluZXJfcmVzZXQgKHF0ZGVtdXgtPmZsb3djb21iaW5lcik7CisgICAgZm9yIChuID0gMDsgbiA8IHF0ZGVtdXgtPm5fc3RyZWFtczsgbisrKQorICAgICAgZ3N0X3F0ZGVtdXhfc3RyZWFtX2NsZWFyIChxdGRlbXV4LCBxdGRlbXV4LT5zdHJlYW1zW25dKTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfZmxvd19jb21iaW5lcl9yZXNldCAocXRkZW11eC0+Zmxvd2NvbWJpbmVyKTsKKyAgICBmb3IgKG4gPSAwOyBuIDwgcXRkZW11eC0+bl9zdHJlYW1zOyBuKyspIHsKKyAgICAgIHF0ZGVtdXgtPnN0cmVhbXNbbl0tPnNlbnRfZW9zID0gRkFMU0U7CisgICAgICBxdGRlbXV4LT5zdHJlYW1zW25dLT50aW1lX3Bvc2l0aW9uID0gMDsKKyAgICAgIHF0ZGVtdXgtPnN0cmVhbXNbbl0tPmFjY3VtdWxhdGVkX2Jhc2UgPSAwOworICAgIH0KKyAgICBpZiAoIXF0ZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCkgeworICAgICAgcXRkZW11eC0+cGVuZGluZ19uZXdzZWdtZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmcXRkZW11eC0+c2VnbWVudCk7CisgICAgICBpZiAocXRkZW11eC0+c2VnbWVudF9zZXFudW0gIT0gR1NUX1NFUU5VTV9JTlZBTElEKQorICAgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAocXRkZW11eC0+cGVuZGluZ19uZXdzZWdtZW50LAorICAgICAgICAgICAgcXRkZW11eC0+c2VnbWVudF9zZXFudW0pOworICAgIH0KKyAgfQorfQorCisKKy8qIE1hcHMgdGhlIEBzZWdtZW50IHRvIHRoZSBxdCBlZHRzIGludGVybmFsIHNlZ21lbnRzIGFuZCBwdXNoZXMKKyAqIHRoZSBjb3JyZXNwbmRpbmcgc2VnbWVudCBldmVudC4KKyAqCisgKiBJZiBpdCBlbmRzIHVwIGJlaW5nIGF0IGEgZW1wdHkgc2VnbWVudCwgYSBnYXAgd2lsbCBiZSBwdXNoZWQgYW5kIHRoZSBuZXh0CisgKiBlZHRzIHNlZ21lbnQgd2lsbCBiZSBhY3RpdmF0ZWQgaW4gc2VxdWVuY2UuCisgKgorICogVG8gYmUgdXNlZCBpbiBwdXNoLW1vZGUgb25seSAqLworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X21hcF9hbmRfcHVzaF9zZWdtZW50cyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdFNlZ21lbnQgKiBzZWdtZW50KQoreworICBnaW50IG4sIGk7CisKKyAgZm9yIChuID0gMDsgbiA8IHF0ZGVtdXgtPm5fc3RyZWFtczsgbisrKSB7CisgICAgUXREZW11eFN0cmVhbSAqc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1tuXTsKKworICAgIHN0cmVhbS0+dGltZV9wb3NpdGlvbiA9IHNlZ21lbnQtPnN0YXJ0OworCisgICAgLyogaW4gcHVzaCBtb2RlIHdlIHNob3VsZCBiZSBndWFyYW50ZWVkIHRoYXQgd2Ugd2lsbCBoYXZlIGVtcHR5IHNlZ21lbnRzCisgICAgICogYXQgdGhlIGJlZ2lubmluZyBhbmQgdGhlbiBvbmUgc2VnbWVudCBhZnRlciwgb3RoZXIgc2NlbmFyaW9zIGFyZSBub3QKKyAgICAgKiBzdXBwb3J0ZWQgYW5kIGFyZSBkaXNjYXJkZWQgd2hlbiBwYXJzaW5nIHRoZSBlZHRzICovCisgICAgZm9yIChpID0gMDsgaSA8IHN0cmVhbS0+bl9zZWdtZW50czsgaSsrKSB7CisgICAgICBpZiAoc3RyZWFtLT5zZWdtZW50c1tpXS5zdG9wX3RpbWUgPiBzZWdtZW50LT5zdGFydCkgeworICAgICAgICBnc3RfcXRkZW11eF9hY3RpdmF0ZV9zZWdtZW50IChxdGRlbXV4LCBzdHJlYW0sIGksCisgICAgICAgICAgICBzdHJlYW0tPnRpbWVfcG9zaXRpb24pOworICAgICAgICBpZiAoUVRTRUdNRU5UX0lTX0VNUFRZICgmc3RyZWFtLT5zZWdtZW50c1tpXSkpIHsKKyAgICAgICAgICAvKiBwdXNoIHRoZSBlbXB0eSBzZWdtZW50IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IG9uZSAqLworICAgICAgICAgIGdzdF9xdGRlbXV4X3NlbmRfZ2FwX2Zvcl9zZWdtZW50IChxdGRlbXV4LCBzdHJlYW0sIGksCisgICAgICAgICAgICAgIHN0cmVhbS0+dGltZV9wb3NpdGlvbik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBnX2Fzc2VydCAoaSA9PSBzdHJlYW0tPm5fc2VnbWVudHMgLSAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcXRkZW11eF9oYW5kbGVfc2lua19ldmVudCAoR3N0UGFkICogc2lua3BhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFFURGVtdXggKmRlbXV4ID0gR1NUX1FUREVNVVggKHBhcmVudCk7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiaGFuZGxpbmcgJXMgZXZlbnQiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgeworICAgICAgZ2ludDY0IG9mZnNldCA9IDA7CisgICAgICBRdERlbXV4U3RyZWFtICpzdHJlYW07CisgICAgICBnaW50IGlkeDsKKyAgICAgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICAgICAgLyogc29tZSBkZWJ1ZyBvdXRwdXQgKi8KKyAgICAgIGdzdF9ldmVudF9jb3B5X3NlZ21lbnQgKGV2ZW50LCAmc2VnbWVudCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInJlY2VpdmVkIG5ld3NlZ21lbnQgJSIgR1NUX1NFR01FTlRfRk9STUFULAorICAgICAgICAgICZzZWdtZW50KTsKKworICAgICAgLyogZXJhc2UgYW55IHByZXZpb3VzbHkgc2V0IHNlZ21lbnQgKi8KKyAgICAgIGdzdF9ldmVudF9yZXBsYWNlICgmZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCwgTlVMTCk7CisKKyAgICAgIGlmIChzZWdtZW50LmZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJuZXcgcGVuZGluZ19uZXdzZWdtZW50Iik7CisgICAgICAgIGdzdF9ldmVudF9yZXBsYWNlICgmZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCwgZXZlbnQpOworICAgICAgICBkZW11eC0+dXBzdHJlYW1fZm9ybWF0X2lzX3RpbWUgPSBUUlVFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJOb3Qgc3RvcmluZyB1cHN0cmVhbSBuZXdzZWdtZW50LCAiCisgICAgICAgICAgICAibm90IGluIHRpbWUgZm9ybWF0Iik7CisKKyAgICAgICAgLyogY2hhaW4gd2lsbCBzZW5kIGluaXRpYWwgbmV3c2VnbWVudCBhZnRlciBwYWRzIGhhdmUgYmVlbiBhZGRlZCAqLworICAgICAgICBpZiAoZGVtdXgtPnN0YXRlICE9IFFUREVNVVhfU1RBVEVfTU9WSUUgfHwgIWRlbXV4LT5uX3N0cmVhbXMpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInN0aWxsIHN0YXJ0aW5nLCBlYXRpbmcgZXZlbnQiKTsKKyAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogY2hlY2sgaWYgdGhpcyBtYXRjaGVzIGEgdGltZSBzZWVrIHdlIHJlY2VpdmVkIHByZXZpb3VzbHkKKyAgICAgICAqIEZJWE1FIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIHVzZSB0aGUKKyAgICAgICAqIHNlZWtfb2Zmc2V0IGhlcmUgdG8gY29tcGFyZS4gSW4gdGhlIGZ1dHVyZSB3ZSBtaWdodCB3YW50IHRvCisgICAgICAgKiBjaGFuZ2UgdGhpcyB0byB1c2UgdGhlIHNlcW51bSBhcyBpdCB1bmlxdWVseSBzaG91bGQgaWRlbnRpZnkKKyAgICAgICAqIHRoZSBzZWdtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHNlZWsuICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlN0b3JlZCBzZWVrIG9mZnNldDogJSIgR19HSU5UNjRfRk9STUFUCisgICAgICAgICAgIiwgcmVjZWl2ZWQgc2VnbWVudCBvZmZzZXQgJSIgR19HSU5UNjRfRk9STUFULAorICAgICAgICAgIGRlbXV4LT5zZWVrX29mZnNldCwgc2VnbWVudC5zdGFydCk7CisgICAgICBpZiAoc2VnbWVudC5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9CWVRFUworICAgICAgICAgICYmIGRlbXV4LT5zZWVrX29mZnNldCA9PSBzZWdtZW50LnN0YXJ0KSB7CisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAgICAgICBvZmZzZXQgPSBzZWdtZW50LnN0YXJ0OworCisgICAgICAgIHNlZ21lbnQuZm9ybWF0ID0gR1NUX0ZPUk1BVF9USU1FOworICAgICAgICBzZWdtZW50LnN0YXJ0ID0gZGVtdXgtPnB1c2hfc2Vla19zdGFydDsKKyAgICAgICAgc2VnbWVudC5zdG9wID0gZGVtdXgtPnB1c2hfc2Vla19zdG9wOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlJlcGxhY2VkIHNlZ21lbnQgd2l0aCBzdG9yZWQgc2VlayAiCisgICAgICAgICAgICAic2VnbWVudCAlIiBHU1RfVElNRV9GT1JNQVQgIiAtICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHNlZ21lbnQuc3RhcnQpLCBHU1RfVElNRV9BUkdTIChzZWdtZW50LnN0b3ApKTsKKyAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgICAgIH0KKworICAgICAgLyogd2Ugb25seSBleHBlY3QgYSBCWVRFIHNlZ21lbnQsIGUuZy4gZm9sbG93aW5nIGEgc2VlayAqLworICAgICAgaWYgKHNlZ21lbnQuZm9ybWF0ID09IEdTVF9GT1JNQVRfQllURVMpIHsKKyAgICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzZWdtZW50LnN0YXJ0KSkgeworICAgICAgICAgIG9mZnNldCA9IHNlZ21lbnQuc3RhcnQ7CisKKyAgICAgICAgICBnc3RfcXRkZW11eF9maW5kX3NhbXBsZSAoZGVtdXgsIHNlZ21lbnQuc3RhcnQsIFRSVUUsIEZBTFNFLCBOVUxMLAorICAgICAgICAgICAgICBOVUxMLCAoZ2ludDY0ICopICYgc2VnbWVudC5zdGFydCk7CisgICAgICAgICAgaWYgKChnaW50NjQpIHNlZ21lbnQuc3RhcnQgPCAwKQorICAgICAgICAgICAgc2VnbWVudC5zdGFydCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzZWdtZW50LnN0b3ApKSB7CisgICAgICAgICAgZ3N0X3F0ZGVtdXhfZmluZF9zYW1wbGUgKGRlbXV4LCBzZWdtZW50LnN0b3AsIEZBTFNFLCBGQUxTRSwgTlVMTCwKKyAgICAgICAgICAgICAgTlVMTCwgKGdpbnQ2NCAqKSAmIHNlZ21lbnQuc3RvcCk7CisgICAgICAgICAgLyoga2V5ZnJhbWUgc2Vla2luZyBzaG91bGQgYWxyZWFkeSBhcnJhbmdlIGZvciBzdGFydCA+PSBzdG9wLAorICAgICAgICAgICAqIGJ1dCBtYWtlIHN1cmUgaW4gb3RoZXIgcmFyZSBjYXNlcyAqLworICAgICAgICAgIHNlZ21lbnQuc3RvcCA9IE1BWCAoc2VnbWVudC5zdG9wLCBzZWdtZW50LnN0YXJ0KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChzZWdtZW50LmZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgLyogcHVzaCBhbGwgZGF0YSBvbiB0aGUgYWRhcHRlciBiZWZvcmUgc3RhcnRpbmcgdGhpcworICAgICAgICAgKiBuZXcgc2VnbWVudCAqLworICAgICAgICBnc3RfcXRkZW11eF9wcm9jZXNzX2FkYXB0ZXIgKGRlbXV4LCBUUlVFKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAidW5zdXBwb3J0ZWQgc2VnbWVudCBmb3JtYXQsIGlnbm9yaW5nIik7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgIH0KKworICAgICAgLyogV2Ugc2hvdWxkbid0IG1vZGlmeSB1cHN0cmVhbSBkcml2ZW4gVElNRSBGT1JNQVQgc2VnbWVudCAqLworICAgICAgaWYgKCFkZW11eC0+dXBzdHJlYW1fZm9ybWF0X2lzX3RpbWUpIHsKKyAgICAgICAgLyogYWNjZXB0IHVwc3RyZWFtJ3Mgbm90aW9uIG9mIHNlZ21lbnQgYW5kIGRpc3RyaWJ1dGUgYWxvbmcgKi8KKyAgICAgICAgc2VnbWVudC5mb3JtYXQgPSBHU1RfRk9STUFUX1RJTUU7CisgICAgICAgIHNlZ21lbnQucG9zaXRpb24gPSBzZWdtZW50LnRpbWUgPSBzZWdtZW50LnN0YXJ0OworICAgICAgICBzZWdtZW50LmR1cmF0aW9uID0gZGVtdXgtPnNlZ21lbnQuZHVyYXRpb247CisgICAgICAgIHNlZ21lbnQuYmFzZSA9IGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJmRlbXV4LT5zZWdtZW50LAorICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBkZW11eC0+c2VnbWVudC5wb3NpdGlvbik7CisgICAgICB9CisKKyAgICAgIGdzdF9zZWdtZW50X2NvcHlfaW50byAoJnNlZ21lbnQsICZkZW11eC0+c2VnbWVudCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlB1c2hpbmcgbmV3c2VnICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwgJnNlZ21lbnQpOworCisgICAgICAvKiBtYXAgc2VnbWVudCB0byBpbnRlcm5hbCBxdCBzZWdtZW50cyBhbmQgcHVzaCBvbiBlYWNoIHN0cmVhbSAqLworICAgICAgaWYgKGRlbXV4LT5uX3N0cmVhbXMpIHsKKyAgICAgICAgaWYgKGRlbXV4LT5mcmFnbWVudGVkKSB7CisgICAgICAgICAgR3N0RXZlbnQgKnNlZ21lbnRfZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KTsKKworICAgICAgICAgIGdzdF9ldmVudF9yZXBsYWNlICgmZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCwgTlVMTCk7CisgICAgICAgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKHNlZ21lbnRfZXZlbnQsIGRlbXV4LT5zZWdtZW50X3NlcW51bSk7CisgICAgICAgICAgZ3N0X3F0ZGVtdXhfcHVzaF9ldmVudCAoZGVtdXgsIHNlZ21lbnRfZXZlbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9ldmVudF9yZXBsYWNlICgmZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCwgTlVMTCk7CisgICAgICAgICAgZ3N0X3F0ZGVtdXhfbWFwX2FuZF9wdXNoX3NlZ21lbnRzIChkZW11eCwgJnNlZ21lbnQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIGNsZWFyIGxlZnRvdmVyIGluIGN1cnJlbnQgc2VnbWVudCwgaWYgYW55ICovCisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAoZGVtdXgtPmFkYXB0ZXIpOworCisgICAgICAvKiBzZXQgdXAgc3RyZWFtaW5nIHRocmVhZCAqLworICAgICAgZGVtdXgtPm9mZnNldCA9IG9mZnNldDsKKyAgICAgIGlmIChkZW11eC0+dXBzdHJlYW1fZm9ybWF0X2lzX3RpbWUpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJVcHN0cmVhbSBpcyBkcml2aW5nIGluIHRpbWUgZm9ybWF0LCAiCisgICAgICAgICAgICAic2V0IHZhbHVlcyB0byByZXN0YXJ0IHJlYWRpbmcgZnJvbSBhIG5ldyBhdG9tIik7CisgICAgICAgIGRlbXV4LT5uZWVkZWRieXRlcyA9IDE2OworICAgICAgICBkZW11eC0+dG9kcm9wID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9xdGRlbXV4X2ZpbmRfc2FtcGxlIChkZW11eCwgb2Zmc2V0LCBUUlVFLCBUUlVFLCAmc3RyZWFtLCAmaWR4LAorICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGlmIChzdHJlYW0pIHsKKyAgICAgICAgICBkZW11eC0+dG9kcm9wID0gc3RyZWFtLT5zYW1wbGVzW2lkeF0ub2Zmc2V0IC0gb2Zmc2V0OworICAgICAgICAgIGRlbXV4LT5uZWVkZWRieXRlcyA9IGRlbXV4LT50b2Ryb3AgKyBzdHJlYW0tPnNhbXBsZXNbaWR4XS5zaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIHNldCB1cCBmb3IgRU9TICovCisgICAgICAgICAgZGVtdXgtPm5lZWRlZGJ5dGVzID0gLTE7CisgICAgICAgICAgZGVtdXgtPnRvZHJvcCA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICBleGl0OgorICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICByZXMgPSBUUlVFOworICAgICAgZ290byBkcm9wOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVEFSVDoKKyAgICB7CisgICAgICBpZiAoZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KSA9PSBkZW11eC0+b2Zmc2V0X3NlZWtfc2VxbnVtKSB7CisgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgICBnb3RvIGRyb3A7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICB7CisgICAgICBndWludDY0IGR1cjsKKworICAgICAgZHVyID0gZGVtdXgtPnNlZ21lbnQuZHVyYXRpb247CisgICAgICBnc3RfcXRkZW11eF9yZXNldCAoZGVtdXgsIEZBTFNFKTsKKyAgICAgIGRlbXV4LT5zZWdtZW50LmR1cmF0aW9uID0gZHVyOworCisgICAgICBpZiAoZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KSA9PSBkZW11eC0+b2Zmc2V0X3NlZWtfc2VxbnVtKSB7CisgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgICBnb3RvIGRyb3A7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRU9TOgorICAgICAgLyogSWYgd2UgYXJlIGluIHB1c2ggbW9kZSwgYW5kIGdldCBhbiBFT1MgYmVmb3JlIHdlJ3ZlIHNlZW4gYW55IHN0cmVhbXMsCisgICAgICAgKiB0aGVuIGVycm9yIG91dCAtIHdlIGhhdmUgbm93aGVyZSB0byBzZW5kIHRoZSBFT1MgKi8KKyAgICAgIGlmICghZGVtdXgtPnB1bGxiYXNlZCkgeworICAgICAgICBnaW50IGk7CisgICAgICAgIGdib29sZWFuIGhhc192YWxpZF9zdHJlYW0gPSBGQUxTRTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGRlbXV4LT5uX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgIGlmIChkZW11eC0+c3RyZWFtc1tpXS0+cGFkICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGhhc192YWxpZF9zdHJlYW0gPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghaGFzX3ZhbGlkX3N0cmVhbSkKKyAgICAgICAgICBnc3RfcXRkZW11eF9wb3N0X25vX3BsYXlhYmxlX3N0cmVhbV9lcnJvciAoZGVtdXgpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkRhdGEgc3RpbGwgYXZhaWxhYmxlIGFmdGVyIEVPUzogJXUiLAorICAgICAgICAgICAgICAoZ3VpbnQpIGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoZGVtdXgtPmFkYXB0ZXIpKTsKKyAgICAgICAgICBpZiAoZ3N0X3F0ZGVtdXhfcHJvY2Vzc19hZGFwdGVyIChkZW11eCwgVFJVRSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfQ0FQUzp7CisgICAgICBHc3RDYXBzICpjYXBzID0gTlVMTDsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICBnc3RfcXRkZW11eF9zZXRjYXBzIChkZW11eCwgY2Fwcyk7CisgICAgICByZXMgPSBUUlVFOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBnb3RvIGRyb3A7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX1BST1RFQ1RJT046CisgICAgeworICAgICAgY29uc3QgZ2NoYXIgKnN5c3RlbV9pZCA9IE5VTEw7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9wcm90ZWN0aW9uIChldmVudCwgJnN5c3RlbV9pZCwgTlVMTCwgTlVMTCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlJlY2VpdmVkIHByb3RlY3Rpb24gZXZlbnQgZm9yIHN5c3RlbSBJRCAlcyIsCisgICAgICAgICAgc3lzdGVtX2lkKTsKKyAgICAgIGdzdF9xdGRlbXV4X2FwcGVuZF9wcm90ZWN0aW9uX3N5c3RlbV9pZCAoZGVtdXgsIHN5c3RlbV9pZCk7CisgICAgICAvKiBzYXZlIHRoZSBldmVudCBmb3IgbGF0ZXIsIGZvciBzb3VyY2UgcGFkcyB0aGF0IGhhdmUgbm90IGJlZW4gY3JlYXRlZCAqLworICAgICAgZ19xdWV1ZV9wdXNoX3RhaWwgKCZkZW11eC0+cHJvdGVjdGlvbl9ldmVudF9xdWV1ZSwgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpKTsKKyAgICAgIC8qIHNlbmQgaXQgdG8gYWxsIHBhZHMgdGhhdCBhbHJlYWR5IGV4aXN0ICovCisgICAgICBnc3RfcXRkZW11eF9wdXNoX2V2ZW50IChkZW11eCwgZXZlbnQpOworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGdvdG8gZHJvcDsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChkZW11eC0+c2lua3BhZCwgcGFyZW50LCBldmVudCkgJiByZXM7CisKK2Ryb3A6CisgIHJldHVybiByZXM7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfc2V0X2luZGV4IChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0SW5kZXggKiBpbmRleCkKK3sKKyAgR3N0UVREZW11eCAqZGVtdXggPSBHU1RfUVRERU1VWCAoZWxlbWVudCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgIGlmIChkZW11eC0+ZWxlbWVudF9pbmRleCkKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChkZW11eC0+ZWxlbWVudF9pbmRleCk7CisgIGlmIChpbmRleCkgeworICAgIGRlbXV4LT5lbGVtZW50X2luZGV4ID0gZ3N0X29iamVjdF9yZWYgKGluZGV4KTsKKyAgfSBlbHNlIHsKKyAgICBkZW11eC0+ZWxlbWVudF9pbmRleCA9IE5VTEw7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgLyogb2JqZWN0IGxvY2sgbWlnaHQgYmUgdGFrZW4gYWdhaW4gKi8KKyAgaWYgKGluZGV4KQorICAgIGdzdF9pbmRleF9nZXRfd3JpdGVyX2lkIChpbmRleCwgR1NUX09CSkVDVCAoZWxlbWVudCksICZkZW11eC0+aW5kZXhfaWQpOworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlNldCBpbmRleCAlIiBHU1RfUFRSX0ZPUk1BVCAiZm9yIHdyaXRlciBpZCAlZCIsCisgICAgICBkZW11eC0+ZWxlbWVudF9pbmRleCwgZGVtdXgtPmluZGV4X2lkKTsKK30KKworc3RhdGljIEdzdEluZGV4ICoKK2dzdF9xdGRlbXV4X2dldF9pbmRleCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdEluZGV4ICpyZXN1bHQgPSBOVUxMOworICBHc3RRVERlbXV4ICpkZW11eCA9IEdTVF9RVERFTVVYIChlbGVtZW50KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgaWYgKGRlbXV4LT5lbGVtZW50X2luZGV4KQorICAgIHJlc3VsdCA9IGdzdF9vYmplY3RfcmVmIChkZW11eC0+ZWxlbWVudF9pbmRleCk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJSZXR1cm5pbmcgaW5kZXggJSIgR1NUX1BUUl9GT1JNQVQsIHJlc3VsdCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfc3RibF9mcmVlIChRdERlbXV4U3RyZWFtICogc3RyZWFtKQoreworICBnX2ZyZWUgKChncG9pbnRlcikgc3RyZWFtLT5zdGNvLmRhdGEpOworICBzdHJlYW0tPnN0Y28uZGF0YSA9IE5VTEw7CisgIGdfZnJlZSAoKGdwb2ludGVyKSBzdHJlYW0tPnN0c3ouZGF0YSk7CisgIHN0cmVhbS0+c3Rzei5kYXRhID0gTlVMTDsKKyAgZ19mcmVlICgoZ3BvaW50ZXIpIHN0cmVhbS0+c3RzYy5kYXRhKTsKKyAgc3RyZWFtLT5zdHNjLmRhdGEgPSBOVUxMOworICBnX2ZyZWUgKChncG9pbnRlcikgc3RyZWFtLT5zdHRzLmRhdGEpOworICBzdHJlYW0tPnN0dHMuZGF0YSA9IE5VTEw7CisgIGdfZnJlZSAoKGdwb2ludGVyKSBzdHJlYW0tPnN0c3MuZGF0YSk7CisgIHN0cmVhbS0+c3Rzcy5kYXRhID0gTlVMTDsKKyAgZ19mcmVlICgoZ3BvaW50ZXIpIHN0cmVhbS0+c3Rwcy5kYXRhKTsKKyAgc3RyZWFtLT5zdHBzLmRhdGEgPSBOVUxMOworICBnX2ZyZWUgKChncG9pbnRlcikgc3RyZWFtLT5jdHRzLmRhdGEpOworICBzdHJlYW0tPmN0dHMuZGF0YSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9zdHJlYW1fZmx1c2hfc2VnbWVudHNfZGF0YSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSkKK3sKKyAgZ19mcmVlIChzdHJlYW0tPnNlZ21lbnRzKTsKKyAgc3RyZWFtLT5zZWdtZW50cyA9IE5VTEw7CisgIHN0cmVhbS0+c2VnbWVudF9pbmRleCA9IC0xOworICBzdHJlYW0tPmFjY3VtdWxhdGVkX2Jhc2UgPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfc3RyZWFtX2ZsdXNoX3NhbXBsZXNfZGF0YSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSkKK3sKKyAgZ19mcmVlIChzdHJlYW0tPnNhbXBsZXMpOworICBzdHJlYW0tPnNhbXBsZXMgPSBOVUxMOworICBnc3RfcXRkZW11eF9zdGJsX2ZyZWUgKHN0cmVhbSk7CisKKyAgLyogZnJhZ21lbnRzICovCisgIGdfZnJlZSAoc3RyZWFtLT5yYV9lbnRyaWVzKTsKKyAgc3RyZWFtLT5yYV9lbnRyaWVzID0gTlVMTDsKKyAgc3RyZWFtLT5uX3JhX2VudHJpZXMgPSAwOworCisgIHN0cmVhbS0+c2FtcGxlX2luZGV4ID0gLTE7CisgIHN0cmVhbS0+c3RibF9pbmRleCA9IC0xOworICBzdHJlYW0tPm5fc2FtcGxlcyA9IDA7CisgIHN0cmVhbS0+dGltZV9wb3NpdGlvbiA9IDA7CisKKyAgc3RyZWFtLT5uX3NhbXBsZXNfbW9vZiA9IDA7CisgIHN0cmVhbS0+ZHVyYXRpb25fbW9vZiA9IDA7CisgIHN0cmVhbS0+ZHVyYXRpb25fbGFzdF9tb29mID0gMDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X3N0cmVhbV9jbGVhciAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0pCit7CisgIGdpbnQgaTsKKyAgaWYgKHN0cmVhbS0+YWxsb2NhdG9yKQorICAgIGdzdF9vYmplY3RfdW5yZWYgKHN0cmVhbS0+YWxsb2NhdG9yKTsKKyAgd2hpbGUgKHN0cmVhbS0+YnVmZmVycykgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKEdTVF9CVUZGRVJfQ0FTVCAoc3RyZWFtLT5idWZmZXJzLT5kYXRhKSk7CisgICAgc3RyZWFtLT5idWZmZXJzID0gZ19zbGlzdF9kZWxldGVfbGluayAoc3RyZWFtLT5idWZmZXJzLCBzdHJlYW0tPmJ1ZmZlcnMpOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBzdHJlYW0tPnN0c2RfZW50cmllc19sZW5ndGg7IGkrKykgeworICAgIFF0RGVtdXhTdHJlYW1TdHNkRW50cnkgKmVudHJ5ID0gJnN0cmVhbS0+c3RzZF9lbnRyaWVzW2ldOworICAgIGlmIChlbnRyeS0+cmdiOF9wYWxldHRlKSB7CisgICAgICBnc3RfbWVtb3J5X3VucmVmIChlbnRyeS0+cmdiOF9wYWxldHRlKTsKKyAgICAgIGVudHJ5LT5yZ2I4X3BhbGV0dGUgPSBOVUxMOworICAgIH0KKyAgICBlbnRyeS0+c3BhcnNlID0gRkFMU0U7CisgIH0KKworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHN0cmVhbS0+c3RyZWFtX3RhZ3MpOworICBzdHJlYW0tPnN0cmVhbV90YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZ3N0X3RhZ19saXN0X3NldF9zY29wZSAoc3RyZWFtLT5zdHJlYW1fdGFncywgR1NUX1RBR19TQ09QRV9TVFJFQU0pOworICBnX2ZyZWUgKHN0cmVhbS0+cmVkaXJlY3RfdXJpKTsKKyAgc3RyZWFtLT5yZWRpcmVjdF91cmkgPSBOVUxMOworICBzdHJlYW0tPnNlbnRfZW9zID0gRkFMU0U7CisgIHN0cmVhbS0+cHJvdGVjdGVkID0gRkFMU0U7CisgIGlmIChzdHJlYW0tPnByb3RlY3Rpb25fc2NoZW1lX2luZm8pIHsKKyAgICBpZiAoc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV90eXBlID09IEZPVVJDQ19jZW5jKSB7CisgICAgICBRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gKmluZm8gPQorICAgICAgICAgIChRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gKikgc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV9pbmZvOworICAgICAgaWYgKGluZm8tPmRlZmF1bHRfcHJvcGVydGllcykKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChpbmZvLT5kZWZhdWx0X3Byb3BlcnRpZXMpOworICAgICAgaWYgKGluZm8tPmNyeXB0b19pbmZvKQorICAgICAgICBnX3B0cl9hcnJheV9mcmVlIChpbmZvLT5jcnlwdG9faW5mbywgVFJVRSk7CisgICAgfQorICAgIGdfZnJlZSAoc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV9pbmZvKTsKKyAgICBzdHJlYW0tPnByb3RlY3Rpb25fc2NoZW1lX2luZm8gPSBOVUxMOworICB9CisgIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfdHlwZSA9IDA7CisgIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfdmVyc2lvbiA9IDA7CisgIGdfcXVldWVfZm9yZWFjaCAoJnN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfZXZlbnRfcXVldWUsCisgICAgICAoR0Z1bmMpIGdzdF9ldmVudF91bnJlZiwgTlVMTCk7CisgIGdfcXVldWVfY2xlYXIgKCZzdHJlYW0tPnByb3RlY3Rpb25fc2NoZW1lX2V2ZW50X3F1ZXVlKTsKKyAgZ3N0X3F0ZGVtdXhfc3RyZWFtX2ZsdXNoX3NlZ21lbnRzX2RhdGEgKHF0ZGVtdXgsIHN0cmVhbSk7CisgIGdzdF9xdGRlbXV4X3N0cmVhbV9mbHVzaF9zYW1wbGVzX2RhdGEgKHF0ZGVtdXgsIHN0cmVhbSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9zdHJlYW1fcmVzZXQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBRdERlbXV4U3RyZWFtICogc3RyZWFtKQoreworICBnaW50IGk7CisgIGdzdF9xdGRlbXV4X3N0cmVhbV9jbGVhciAocXRkZW11eCwgc3RyZWFtKTsKKyAgZm9yIChpID0gMDsgaSA8IHN0cmVhbS0+c3RzZF9lbnRyaWVzX2xlbmd0aDsgaSsrKSB7CisgICAgUXREZW11eFN0cmVhbVN0c2RFbnRyeSAqZW50cnkgPSAmc3RyZWFtLT5zdHNkX2VudHJpZXNbaV07CisgICAgaWYgKGVudHJ5LT5jYXBzKSB7CisgICAgICBnc3RfY2Fwc191bnJlZiAoZW50cnktPmNhcHMpOworICAgICAgZW50cnktPmNhcHMgPSBOVUxMOworICAgIH0KKyAgfQorICBnX2ZyZWUgKHN0cmVhbS0+c3RzZF9lbnRyaWVzKTsKKyAgc3RyZWFtLT5zdHNkX2VudHJpZXMgPSBOVUxMOworICBzdHJlYW0tPnN0c2RfZW50cmllc19sZW5ndGggPSAwOworfQorCisKK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9zdHJlYW1fZnJlZSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0pCit7CisgIGdzdF9xdGRlbXV4X3N0cmVhbV9yZXNldCAocXRkZW11eCwgc3RyZWFtKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmIChzdHJlYW0tPnN0cmVhbV90YWdzKTsKKyAgaWYgKHN0cmVhbS0+cGFkKSB7CisgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocXRkZW11eCksIHN0cmVhbS0+cGFkKTsKKyAgICBnc3RfZmxvd19jb21iaW5lcl9yZW1vdmVfcGFkIChxdGRlbXV4LT5mbG93Y29tYmluZXIsIHN0cmVhbS0+cGFkKTsKKyAgfQorICBnX2ZyZWUgKHN0cmVhbSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9yZW1vdmVfc3RyZWFtIChHc3RRVERlbXV4ICogcXRkZW11eCwgaW50IGkpCit7CisgIGdfYXNzZXJ0IChpID49IDAgJiYgaSA8IHF0ZGVtdXgtPm5fc3RyZWFtcyAmJiBxdGRlbXV4LT5zdHJlYW1zW2ldICE9IE5VTEwpOworCisgIGdzdF9xdGRlbXV4X3N0cmVhbV9mcmVlIChxdGRlbXV4LCBxdGRlbXV4LT5zdHJlYW1zW2ldKTsKKyAgcXRkZW11eC0+c3RyZWFtc1tpXSA9IHF0ZGVtdXgtPnN0cmVhbXNbcXRkZW11eC0+bl9zdHJlYW1zIC0gMV07CisgIHF0ZGVtdXgtPnN0cmVhbXNbcXRkZW11eC0+bl9zdHJlYW1zIC0gMV0gPSBOVUxMOworICBxdGRlbXV4LT5uX3N0cmVhbXMtLTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcXRkZW11eF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RRVERlbXV4ICpxdGRlbXV4ID0gR1NUX1FUREVNVVggKGVsZW1lbnQpOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXN1bHQgPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJlc3VsdCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6eworICAgICAgZ3N0X3F0ZGVtdXhfcmVzZXQgKHF0ZGVtdXgsIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X3BhcnNlX2Z0eXAgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBjb25zdCBndWludDggKiBidWZmZXIsIGdpbnQgbGVuZ3RoKQoreworICAvKiBjb3VudHMgYXMgaGVhZGVyIGRhdGEgKi8KKyAgcXRkZW11eC0+aGVhZGVyX3NpemUgKz0gbGVuZ3RoOworCisgIC8qIG9ubHkgY29uc2lkZXIgYXQgbGVhc3QgYSBzdWZmaWNpZW50bHkgY29tcGxldGUgZnR5cCBhdG9tICovCisgIGlmIChsZW5ndGggPj0gMjApIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZjsKKworICAgIHF0ZGVtdXgtPm1ham9yX2JyYW5kID0gUVRfRk9VUkNDIChidWZmZXIgKyA4KTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAibWFqb3IgYnJhbmQ6ICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHF0ZGVtdXgtPm1ham9yX2JyYW5kKSk7CisgICAgaWYgKHF0ZGVtdXgtPmNvbXBfYnJhbmRzKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocXRkZW11eC0+Y29tcF9icmFuZHMpOworICAgIGJ1ZiA9IHF0ZGVtdXgtPmNvbXBfYnJhbmRzID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChsZW5ndGggLSAxNik7CisgICAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIGJ1ZmZlciArIDE2LCBsZW5ndGggLSAxNik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfaGFuZGxlX3htcF90YWdsaXN0IChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0VGFnTGlzdCAqIHRhZ2xpc3QsCisgICAgR3N0VGFnTGlzdCAqIHhtcHRhZ2xpc3QpCit7CisgIC8qIFN0cmlwIG91dCBib2d1cyBmaWVsZHMgKi8KKyAgaWYgKHhtcHRhZ2xpc3QpIHsKKyAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF9zY29wZSAodGFnbGlzdCkgPT0gR1NUX1RBR19TQ09QRV9HTE9CQUwpIHsKKyAgICAgIGdzdF90YWdfbGlzdF9yZW1vdmVfdGFnICh4bXB0YWdsaXN0LCBHU1RfVEFHX1ZJREVPX0NPREVDKTsKKyAgICAgIGdzdF90YWdfbGlzdF9yZW1vdmVfdGFnICh4bXB0YWdsaXN0LCBHU1RfVEFHX0FVRElPX0NPREVDKTsKKyAgICB9IGVsc2UgeworICAgICAgZ3N0X3RhZ19saXN0X3JlbW92ZV90YWcgKHhtcHRhZ2xpc3QsIEdTVF9UQUdfQ09OVEFJTkVSX0ZPUk1BVCk7CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIkZvdW5kIFhNUCB0YWdzICUiIEdTVF9QVFJfRk9STUFULCB4bXB0YWdsaXN0KTsKKworICAgIC8qIHByaW9yaXRpemUgbmF0aXZlIHRhZ3MgdXNpbmcgX0tFRVAgbW9kZSAqLworICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKHRhZ2xpc3QsIHhtcHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfS0VFUCk7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh4bXB0YWdsaXN0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorcXRkZW11eF9wYXJzZV9waWZmIChHc3RRVERlbXV4ICogcXRkZW11eCwgY29uc3QgZ3VpbnQ4ICogYnVmZmVyLCBnaW50IGxlbmd0aCwKKyAgICBndWludCBvZmZzZXQpCit7CisgIEdzdEJ5dGVSZWFkZXIgYnI7CisgIGd1aW50OCB2ZXJzaW9uOworICBndWludDMyIGZsYWdzID0gMDsKKyAgZ3VpbnQgaTsKKyAgZ3VpbnQ4IGl2X3NpemUgPSA4OworICBRdERlbXV4U3RyZWFtICpzdHJlYW07CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gKnNzX2luZm8gPSBOVUxMOworICBjb25zdCBnY2hhciAqc3lzdGVtX2lkOworICBnYm9vbGVhbiB1c2VzX3N1Yl9zYW1wbGVfZW5jcnlwdGlvbiA9IEZBTFNFOworCisgIGlmIChxdGRlbXV4LT5uX3N0cmVhbXMgPT0gMCkKKyAgICByZXR1cm47CisKKyAgc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1swXTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLCAwKTsKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LWNlbmMiKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgIkF0dGVtcHRpbmcgUElGRiBib3ggcGFyc2luZyBvbiBhbiB1bmVuY3J5cHRlZCBzdHJlYW0uIik7CisgICAgcmV0dXJuOworICB9CisKKyAgZ3N0X3N0cnVjdHVyZV9nZXQgKHN0cnVjdHVyZSwgR1NUX1BST1RFQ1RJT05fU1lTVEVNX0lEX0NBUFNfRklFTEQsCisgICAgICBHX1RZUEVfU1RSSU5HLCAmc3lzdGVtX2lkLCBOVUxMKTsKKyAgZ3N0X3F0ZGVtdXhfYXBwZW5kX3Byb3RlY3Rpb25fc3lzdGVtX2lkIChxdGRlbXV4LCBzeXN0ZW1faWQpOworCisgIHN0cmVhbS0+cHJvdGVjdGVkID0gVFJVRTsKKyAgc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV90eXBlID0gRk9VUkNDX2NlbmM7CisKKyAgaWYgKCFzdHJlYW0tPnByb3RlY3Rpb25fc2NoZW1lX2luZm8pCisgICAgc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV9pbmZvID0gZ19uZXcwIChRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8sIDEpOworCisgIHNzX2luZm8gPSAoUXREZW11eENlbmNTYW1wbGVTZXRJbmZvICopIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfaW5mbzsKKworICBpZiAoc3NfaW5mby0+ZGVmYXVsdF9wcm9wZXJ0aWVzKQorICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoc3NfaW5mby0+ZGVmYXVsdF9wcm9wZXJ0aWVzKTsKKworICBzc19pbmZvLT5kZWZhdWx0X3Byb3BlcnRpZXMgPQorICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LWNlbmMiLAorICAgICAgIml2X3NpemUiLCBHX1RZUEVfVUlOVCwgaXZfc2l6ZSwgImVuY3J5cHRlZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKworICBpZiAoc3NfaW5mby0+Y3J5cHRvX2luZm8pIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInVucmVmZmluZyBleGlzdGluZyBjcnlwdG9faW5mbyIpOworICAgIGdfcHRyX2FycmF5X2ZyZWUgKHNzX2luZm8tPmNyeXB0b19pbmZvLCBUUlVFKTsKKyAgICBzc19pbmZvLT5jcnlwdG9faW5mbyA9IE5VTEw7CisgIH0KKworICAvKiBza2lwIFVVSUQgKi8KKyAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZiciwgYnVmZmVyICsgb2Zmc2V0ICsgMTYsIGxlbmd0aCAtIG9mZnNldCAtIDE2KTsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZiciwgJnZlcnNpb24pKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgIkVycm9yIGdldHRpbmcgYm94J3MgdmVyc2lvbiBmaWVsZCIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MjRfYmUgKCZiciwgJmZsYWdzKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJFcnJvciBnZXR0aW5nIGJveCdzIGZsYWdzIGZpZWxkIik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKChmbGFncyAmIDB4MDAwMDAxKSkgeworICAgIGd1aW50MzIgYWxnb3JpdGhtX2lkID0gMDsKKyAgICBjb25zdCBndWludDggKmtpZDsKKyAgICBHc3RCdWZmZXIgKmtpZF9idWY7CisgICAgZ2Jvb2xlYW4gaXNfZW5jcnlwdGVkID0gVFJVRTsKKworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MjRfbGUgKCZiciwgJmFsZ29yaXRobV9pZCkpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJFcnJvciBnZXR0aW5nIGJveCdzIGFsZ29yaXRobSBJRCBmaWVsZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFsZ29yaXRobV9pZCA+Pj0gODsKKyAgICBpZiAoYWxnb3JpdGhtX2lkID09IDApIHsKKyAgICAgIGlzX2VuY3J5cHRlZCA9IEZBTFNFOworICAgIH0gZWxzZSBpZiAoYWxnb3JpdGhtX2lkID09IDEpIHsKKyAgICAgIC8qIEZJWE1FOiBtYXliZSBzdG9yZSB0aGlzIGluIHByb3BlcnRpZXM/ICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiQUVTIDEyOC1iaXRzIENUUiBlbmNyeXB0ZWQgc3RyZWFtIik7CisgICAgfSBlbHNlIGlmIChhbGdvcml0aG1faWQgPT0gMikgeworICAgICAgLyogRklYTUU6IG1heWJlIHN0b3JlIHRoaXMgaW4gcHJvcGVydGllcz8gKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJBRVMgMTI4LWJpdHMgQ0JDIGVuY3J5cHRlZCBzdHJlYW0iKTsKKyAgICB9CisKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZiciwgJml2X3NpemUpKQorICAgICAgcmV0dXJuOworCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2RhdGEgKCZiciwgMTYsICZraWQpKQorICAgICAgcmV0dXJuOworCisgICAga2lkX2J1ZiA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxNiwgTlVMTCk7CisgICAgZ3N0X2J1ZmZlcl9maWxsIChraWRfYnVmLCAwLCBraWQsIDE2KTsKKyAgICBpZiAoc3NfaW5mby0+ZGVmYXVsdF9wcm9wZXJ0aWVzKQorICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChzc19pbmZvLT5kZWZhdWx0X3Byb3BlcnRpZXMpOworICAgIHNzX2luZm8tPmRlZmF1bHRfcHJvcGVydGllcyA9CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1jZW5jIiwKKyAgICAgICAgIml2X3NpemUiLCBHX1RZUEVfVUlOVCwgaXZfc2l6ZSwKKyAgICAgICAgImVuY3J5cHRlZCIsIEdfVFlQRV9CT09MRUFOLCBpc19lbmNyeXB0ZWQsCisgICAgICAgICJraWQiLCBHU1RfVFlQRV9CVUZGRVIsIGtpZF9idWYsIE5VTEwpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJkZWZhdWx0IHNhbXBsZSBwcm9wZXJ0aWVzOiAiCisgICAgICAgICJpc19lbmNyeXB0ZWQ9JXUsIGl2X3NpemU9JXUiLCBpc19lbmNyeXB0ZWQsIGl2X3NpemUpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGtpZF9idWYpOworICB9IGVsc2UgaWYgKChmbGFncyAmIDB4MDAwMDAyKSkgeworICAgIHVzZXNfc3ViX3NhbXBsZV9lbmNyeXB0aW9uID0gVFJVRTsKKyAgfQorCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZiciwgJnF0ZGVtdXgtPmNlbmNfYXV4X3NhbXBsZV9jb3VudCkpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChxdGRlbXV4LCAiRXJyb3IgZ2V0dGluZyBib3gncyBzYW1wbGUgY291bnQgZmllbGQiKTsKKyAgICByZXR1cm47CisgIH0KKworICBzc19pbmZvLT5jcnlwdG9faW5mbyA9CisgICAgICBnX3B0cl9hcnJheV9uZXdfZnVsbCAocXRkZW11eC0+Y2VuY19hdXhfc2FtcGxlX2NvdW50LAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBxdGRlbXV4X2dzdF9zdHJ1Y3R1cmVfZnJlZSk7CisKKyAgZm9yIChpID0gMDsgaSA8IHF0ZGVtdXgtPmNlbmNfYXV4X3NhbXBsZV9jb3VudDsgKytpKSB7CisgICAgR3N0U3RydWN0dXJlICpwcm9wZXJ0aWVzOworICAgIGd1aW50OCAqZGF0YTsKKyAgICBHc3RCdWZmZXIgKmJ1ZjsKKworICAgIHByb3BlcnRpZXMgPSBxdGRlbXV4X2dldF9jZW5jX3NhbXBsZV9wcm9wZXJ0aWVzIChxdGRlbXV4LCBzdHJlYW0sIGkpOworICAgIGlmIChwcm9wZXJ0aWVzID09IE5VTEwpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJmYWlsZWQgdG8gZ2V0IHByb3BlcnRpZXMgZm9yIHNhbXBsZSAldSIsIGkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2R1cF9kYXRhICgmYnIsIGl2X3NpemUsICZkYXRhKSkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgIklWIGRhdGEgbm90IHByZXNlbnQgZm9yIHNhbXBsZSAldSIsIGkpOworICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChwcm9wZXJ0aWVzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZGF0YSwgaXZfc2l6ZSk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHByb3BlcnRpZXMsICJpdiIsIEdTVF9UWVBFX0JVRkZFUiwgYnVmLCBOVUxMKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgICAgaWYgKHVzZXNfc3ViX3NhbXBsZV9lbmNyeXB0aW9uKSB7CisgICAgICBndWludDE2IG5fc3Vic2FtcGxlczsKKworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9iZSAoJmJyLCAmbl9zdWJzYW1wbGVzKQorICAgICAgICAgIHx8IG5fc3Vic2FtcGxlcyA9PSAwKSB7CisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAiZmFpbGVkIHRvIGdldCBzdWJzYW1wbGUgY291bnQgZm9yIHNhbXBsZSAldSIsIGkpOworICAgICAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHByb3BlcnRpZXMpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInN1YnNhbXBsZSBjb3VudDogJXUiLCBuX3N1YnNhbXBsZXMpOworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZHVwX2RhdGEgKCZiciwgbl9zdWJzYW1wbGVzICogNiwgJmRhdGEpKSB7CisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJmYWlsZWQgdG8gZ2V0IHN1YnNhbXBsZSBkYXRhIGZvciBzYW1wbGUgJXUiLAorICAgICAgICAgICAgaSk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocHJvcGVydGllcyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGRhdGEsIG5fc3Vic2FtcGxlcyAqIDYpOworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHByb3BlcnRpZXMsCisgICAgICAgICAgInN1YnNhbXBsZV9jb3VudCIsIEdfVFlQRV9VSU5ULCBuX3N1YnNhbXBsZXMsCisgICAgICAgICAgInN1YnNhbXBsZXMiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZiwgTlVMTCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIH0gZWxzZSB7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocHJvcGVydGllcywgInN1YnNhbXBsZV9jb3VudCIsIEdfVFlQRV9VSU5ULCAwLCBOVUxMKTsKKyAgICB9CisKKyAgICBnX3B0cl9hcnJheV9hZGQgKHNzX2luZm8tPmNyeXB0b19pbmZvLCBwcm9wZXJ0aWVzKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorcXRkZW11eF9wYXJzZV91dWlkIChHc3RRVERlbXV4ICogcXRkZW11eCwgY29uc3QgZ3VpbnQ4ICogYnVmZmVyLCBnaW50IGxlbmd0aCkKK3sKKyAgc3RhdGljIGNvbnN0IGd1aW50OCB4bXBfdXVpZFtdID0geyAweEJFLCAweDdBLCAweENGLCAweENCLAorICAgIDB4OTcsIDB4QTksIDB4NDIsIDB4RTgsCisgICAgMHg5QywgMHg3MSwgMHg5OSwgMHg5NCwKKyAgICAweDkxLCAweEUzLCAweEFGLCAweEFDCisgIH07CisgIHN0YXRpYyBjb25zdCBndWludDggcGxheXJlYWR5X3V1aWRbXSA9IHsKKyAgICAweGQwLCAweDhhLCAweDRmLCAweDE4LCAweDEwLCAweGYzLCAweDRhLCAweDgyLAorICAgIDB4YjYsIDB4YzgsIDB4MzIsIDB4ZDgsIDB4YWIsIDB4YTEsIDB4ODMsIDB4ZDMKKyAgfTsKKworICBzdGF0aWMgY29uc3QgZ3VpbnQ4IHBpZmZfc2FtcGxlX2VuY3J5cHRpb25fdXVpZFtdID0geworICAgIDB4YTIsIDB4MzksIDB4NGYsIDB4NTIsIDB4NWEsIDB4OWIsIDB4NGYsIDB4MTQsCisgICAgMHhhMiwgMHg0NCwgMHg2YywgMHg0MiwgMHg3YywgMHg2NCwgMHg4ZCwgMHhmNAorICB9OworCisgIGd1aW50IG9mZnNldDsKKworICAvKiBjb3VudHMgYXMgaGVhZGVyIGRhdGEgKi8KKyAgcXRkZW11eC0+aGVhZGVyX3NpemUgKz0gbGVuZ3RoOworCisgIG9mZnNldCA9IChRVF9VSU5UMzIgKGJ1ZmZlcikgPT0gMCkgPyAxNiA6IDg7CisKKyAgaWYgKGxlbmd0aCA8PSBvZmZzZXQgKyAxNikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJ1dWlkIGF0b20gaXMgdG9vIHNob3J0LCBza2lwcGluZyIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChtZW1jbXAgKGJ1ZmZlciArIG9mZnNldCwgeG1wX3V1aWQsIDE2KSA9PSAwKSB7CisgICAgR3N0QnVmZmVyICpidWY7CisgICAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKworICAgIGJ1ZiA9IF9nc3RfYnVmZmVyX25ld193cmFwcGVkICgoZ3VpbnQ4ICopIGJ1ZmZlciArIG9mZnNldCArIDE2LAorICAgICAgICBsZW5ndGggLSBvZmZzZXQgLSAxNiwgTlVMTCk7CisgICAgdGFnbGlzdCA9IGdzdF90YWdfbGlzdF9mcm9tX3htcF9idWZmZXIgKGJ1Zik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAgIC8qIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgdXNhYmxlIHRhZ2xpc3QgKi8KKyAgICBxdGRlbXV4LT50YWdfbGlzdCA9IGdzdF90YWdfbGlzdF9tYWtlX3dyaXRhYmxlIChxdGRlbXV4LT50YWdfbGlzdCk7CisKKyAgICBxdGRlbXV4X2hhbmRsZV94bXBfdGFnbGlzdCAocXRkZW11eCwgcXRkZW11eC0+dGFnX2xpc3QsIHRhZ2xpc3QpOworCisgIH0gZWxzZSBpZiAobWVtY21wIChidWZmZXIgKyBvZmZzZXQsIHBsYXlyZWFkeV91dWlkLCAxNikgPT0gMCkgeworICAgIGludCBsZW47CisgICAgY29uc3QgZ3VuaWNoYXIyICpzX3V0ZjE2OworICAgIGNoYXIgKmNvbnRlbnRzOworCisgICAgbGVuID0gR1NUX1JFQURfVUlOVDE2X0xFIChidWZmZXIgKyBvZmZzZXQgKyAweDMwKTsKKyAgICBzX3V0ZjE2ID0gKGNvbnN0IGd1bmljaGFyMiAqKSAoYnVmZmVyICsgb2Zmc2V0ICsgMHgzMik7CisgICAgY29udGVudHMgPSBnX3V0ZjE2X3RvX3V0ZjggKHNfdXRmMTYsIGxlbiAvIDIsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJjb250ZW50czogJXMiLCBjb250ZW50cyk7CisKKyAgICBnX2ZyZWUgKGNvbnRlbnRzKTsKKworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdGRlbXV4LCBTVFJFQU0sIERFQ1JZUFQsCisgICAgICAgIChfKCJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIpKSwKKyAgICAgICAgKE5VTEwpKTsKKyAgfSBlbHNlIGlmIChtZW1jbXAgKGJ1ZmZlciArIG9mZnNldCwgcGlmZl9zYW1wbGVfZW5jcnlwdGlvbl91dWlkLCAxNikgPT0gMCkgeworICAgIHF0ZGVtdXhfcGFyc2VfcGlmZiAocXRkZW11eCwgYnVmZmVyLCBsZW5ndGgsIG9mZnNldCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIklnbm9yaW5nIHVua25vd24gdXVpZDogJTA4eC0lMDh4LSUwOHgtJTA4eCIsCisgICAgICAgIEdTVF9SRUFEX1VJTlQzMl9MRSAoYnVmZmVyICsgb2Zmc2V0KSwKKyAgICAgICAgR1NUX1JFQURfVUlOVDMyX0xFIChidWZmZXIgKyBvZmZzZXQgKyA0KSwKKyAgICAgICAgR1NUX1JFQURfVUlOVDMyX0xFIChidWZmZXIgKyBvZmZzZXQgKyA4KSwKKyAgICAgICAgR1NUX1JFQURfVUlOVDMyX0xFIChidWZmZXIgKyBvZmZzZXQgKyAxMikpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X3BhcnNlX3NpZHggKEdzdFFURGVtdXggKiBxdGRlbXV4LCBjb25zdCBndWludDggKiBidWZmZXIsIGdpbnQgbGVuZ3RoKQoreworICBHc3RTaWR4UGFyc2VyIHNpZHhfcGFyc2VyOworICBHc3RJc29mZlBhcnNlclJlc3VsdCByZXM7CisgIGd1aW50IGNvbnN1bWVkOworCisgIGdzdF9pc29mZl9xdF9zaWR4X3BhcnNlcl9pbml0ICgmc2lkeF9wYXJzZXIpOworCisgIHJlcyA9CisgICAgICBnc3RfaXNvZmZfcXRfc2lkeF9wYXJzZXJfYWRkX2RhdGEgKCZzaWR4X3BhcnNlciwgYnVmZmVyLCBsZW5ndGgsCisgICAgICAmY29uc3VtZWQpOworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic2lkeCBwYXJzZSByZXN1bHQ6ICVkIiwgcmVzKTsKKyAgaWYgKHJlcyA9PSBHU1RfSVNPRkZfUVRfUEFSU0VSX0RPTkUpIHsKKyAgICBjaGVja191cGRhdGVfZHVyYXRpb24gKHF0ZGVtdXgsIHNpZHhfcGFyc2VyLmN1bXVsYXRpdmVfcHRzKTsKKyAgfQorICBnc3RfaXNvZmZfcXRfc2lkeF9wYXJzZXJfY2xlYXIgKCZzaWR4X3BhcnNlcik7Cit9CisKKy8qIGNhbGxlciB2ZXJpZmllcyBhdCBsZWFzdCA4IGJ5dGVzIGluIGJ1ZiAqLworc3RhdGljIHZvaWQKK2V4dHJhY3RfaW5pdGlhbF9sZW5ndGhfYW5kX2ZvdXJjYyAoY29uc3QgZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSwKKyAgICBndWludDY0ICogcGxlbmd0aCwgZ3VpbnQzMiAqIHBmb3VyY2MpCit7CisgIGd1aW50NjQgbGVuZ3RoOworICBndWludDMyIGZvdXJjYzsKKworICBsZW5ndGggPSBRVF9VSU5UMzIgKGRhdGEpOworICBHU1RfREVCVUcgKCJsZW5ndGggMHglMDgiIEdfR0lOVDY0X01PRElGSUVSICJ4IiwgbGVuZ3RoKTsKKyAgZm91cmNjID0gUVRfRk9VUkNDIChkYXRhICsgNCk7CisgIEdTVF9ERUJVRyAoImF0b20gdHlwZSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKworICBpZiAobGVuZ3RoID09IDApIHsKKyAgICBsZW5ndGggPSBHX01BWFVJTlQ2NDsKKyAgfSBlbHNlIGlmIChsZW5ndGggPT0gMSAmJiBzaXplID49IDE2KSB7CisgICAgLyogdGhpcyBtZWFucyB3ZSBoYXZlIGFuIGV4dGVuZGVkIHNpemUsIHdoaWNoIGlzIHRoZSA2NCBiaXQgdmFsdWUgb2YKKyAgICAgKiB0aGUgbmV4dCA4IGJ5dGVzICovCisgICAgbGVuZ3RoID0gUVRfVUlOVDY0IChkYXRhICsgOCk7CisgICAgR1NUX0RFQlVHICgibGVuZ3RoIDB4JTA4IiBHX0dJTlQ2NF9NT0RJRklFUiAieCIsIGxlbmd0aCk7CisgIH0KKworICBpZiAocGxlbmd0aCkKKyAgICAqcGxlbmd0aCA9IGxlbmd0aDsKKyAgaWYgKHBmb3VyY2MpCisgICAgKnBmb3VyY2MgPSBmb3VyY2M7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcXRkZW11eF9wYXJzZV9tZWhkIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGJyKQoreworICBndWludDMyIHZlcnNpb24gPSAwOworICBHc3RDbG9ja1RpbWUgZHVyYXRpb24gPSAwOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGJyLCAmdmVyc2lvbikpCisgICAgZ290byBmYWlsZWQ7CisKKyAgdmVyc2lvbiA+Pj0gMjQ7CisgIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDY0X2JlIChiciwgJmR1cmF0aW9uKSkKKyAgICAgIGdvdG8gZmFpbGVkOworICB9IGVsc2UgeworICAgIGd1aW50MzIgZHVyID0gMDsKKworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGJyLCAmZHVyKSkKKyAgICAgIGdvdG8gZmFpbGVkOworICAgIGR1cmF0aW9uID0gZHVyOworICB9CisKKyAgR1NUX0lORk9fT0JKRUNUIChxdGRlbXV4LCAibWVoZCBkdXJhdGlvbjogJSIgR19HVUlOVDY0X0ZPUk1BVCwgZHVyYXRpb24pOworICBxdGRlbXV4LT5kdXJhdGlvbiA9IGR1cmF0aW9uOworCisgIHJldHVybiBUUlVFOworCitmYWlsZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicGFyc2luZyBtZWhkIGZhaWxlZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3F0ZGVtdXhfcGFyc2VfdHJleCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sCisgICAgZ3VpbnQzMiAqIGRzX2R1cmF0aW9uLCBndWludDMyICogZHNfc2l6ZSwgZ3VpbnQzMiAqIGRzX2ZsYWdzKQoreworICBpZiAoIXN0cmVhbS0+cGFyc2VkX3RyZXggJiYgcXRkZW11eC0+bW9vdl9ub2RlKSB7CisgICAgR05vZGUgKm12ZXgsICp0cmV4OworICAgIEdzdEJ5dGVSZWFkZXIgdHJleF9kYXRhOworCisgICAgbXZleCA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAocXRkZW11eC0+bW9vdl9ub2RlLCBGT1VSQ0NfbXZleCk7CisgICAgaWYgKG12ZXgpIHsKKyAgICAgIHRyZXggPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGVfZnVsbCAobXZleCwgRk9VUkNDX3RyZXgsCisgICAgICAgICAgJnRyZXhfZGF0YSk7CisgICAgICB3aGlsZSAodHJleCkgeworICAgICAgICBndWludDMyIGlkID0gMCwgc2RpID0gMCwgZHVyID0gMCwgc2l6ZSA9IDAsIGZsYWdzID0gMDsKKworICAgICAgICAvKiBza2lwIHZlcnNpb24vZmxhZ3MgKi8KKyAgICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJnRyZXhfZGF0YSwgNCkpCisgICAgICAgICAgZ290byBuZXh0OworICAgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmdHJleF9kYXRhLCAmaWQpKQorICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgaWYgKGlkICE9IHN0cmVhbS0+dHJhY2tfaWQpCisgICAgICAgICAgZ290byBuZXh0OworICAgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmdHJleF9kYXRhLCAmc2RpKSkKKyAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZ0cmV4X2RhdGEsICZkdXIpKQorICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnRyZXhfZGF0YSwgJnNpemUpKQorICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnRyZXhfZGF0YSwgJmZsYWdzKSkKKyAgICAgICAgICBnb3RvIG5leHQ7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZyYWdtZW50IGRlZmF1bHRzIGZvciBzdHJlYW0gJWQ7ICIKKyAgICAgICAgICAgICJkdXJhdGlvbiAlZCwgIHNpemUgJWQsIGZsYWdzIDB4JXgiLCBzdHJlYW0tPnRyYWNrX2lkLAorICAgICAgICAgICAgZHVyLCBzaXplLCBmbGFncyk7CisKKyAgICAgICAgc3RyZWFtLT5wYXJzZWRfdHJleCA9IFRSVUU7CisgICAgICAgIHN0cmVhbS0+ZGVmX3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCA9IHNkaTsKKyAgICAgICAgc3RyZWFtLT5kZWZfc2FtcGxlX2R1cmF0aW9uID0gZHVyOworICAgICAgICBzdHJlYW0tPmRlZl9zYW1wbGVfc2l6ZSA9IHNpemU7CisgICAgICAgIHN0cmVhbS0+ZGVmX3NhbXBsZV9mbGFncyA9IGZsYWdzOworCisgICAgICBuZXh0OgorICAgICAgICAvKiBpdGVyYXRlIGFsbCBzaWJsaW5ncyAqLworICAgICAgICB0cmV4ID0gcXRkZW11eF90cmVlX2dldF9zaWJsaW5nX2J5X3R5cGVfZnVsbCAodHJleCwgRk9VUkNDX3RyZXgsCisgICAgICAgICAgICAmdHJleF9kYXRhKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAqZHNfZHVyYXRpb24gPSBzdHJlYW0tPmRlZl9zYW1wbGVfZHVyYXRpb247CisgICpkc19zaXplID0gc3RyZWFtLT5kZWZfc2FtcGxlX3NpemU7CisgICpkc19mbGFncyA9IHN0cmVhbS0+ZGVmX3NhbXBsZV9mbGFnczsKKworICAvKiBldmVuIHRoZW4sIGFib3ZlIHZhbHVlcyBhcmUgYmV0dGVyIHRoYW4gcmFuZG9tIC4uLiAqLworICBpZiAoR19VTkxJS0VMWSAoIXN0cmVhbS0+cGFyc2VkX3RyZXgpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAiZmFpbGVkIHRvIGZpbmQgZnJhZ21lbnQgZGVmYXVsdHMgZm9yIHN0cmVhbSAlZCIsIHN0cmVhbS0+dHJhY2tfaWQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIGEgbW9yZSBhY2N1cmF0ZSBkdXJhdGlvbiBtaWdodAorICogaGF2ZSBiZWVuIGZvdW5kLiBJdCB3aWxsIHVwZGF0ZSBhbGwgcmVsZXZhbnQgdmFyaWFibGVzIGlmL3doZXJlIG5lZWRlZAorICovCitzdGF0aWMgdm9pZAorY2hlY2tfdXBkYXRlX2R1cmF0aW9uIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uKQoreworICBndWludCBpOworICBndWludDY0IG1vdmR1cjsKKyAgR3N0Q2xvY2tUaW1lIHByZXZkdXI7CisKKyAgbW92ZHVyID0gR1NUVElNRV9UT19RVFRJTUUgKHF0ZGVtdXgsIGR1cmF0aW9uKTsKKworICBpZiAobW92ZHVyID4gcXRkZW11eC0+ZHVyYXRpb24pIHsKKyAgICBwcmV2ZHVyID0gUVRUSU1FX1RPX0dTVFRJTUUgKHF0ZGVtdXgsIHF0ZGVtdXgtPmR1cmF0aW9uKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAiVXBkYXRpbmcgdG90YWwgZHVyYXRpb24gdG8gJSIgR1NUX1RJTUVfRk9STUFUICIgd2FzICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoZHVyYXRpb24pLCBHU1RfVElNRV9BUkdTIChwcmV2ZHVyKSk7CisgICAgcXRkZW11eC0+ZHVyYXRpb24gPSBtb3ZkdXI7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgInF0ZGVtdXgtPnNlZ21lbnQuZHVyYXRpb246ICUiIEdTVF9USU1FX0ZPUk1BVCAiIC5zdG9wOiAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHF0ZGVtdXgtPnNlZ21lbnQuZHVyYXRpb24pLAorICAgICAgICBHU1RfVElNRV9BUkdTIChxdGRlbXV4LT5zZWdtZW50LnN0b3ApKTsKKyAgICBpZiAocXRkZW11eC0+c2VnbWVudC5kdXJhdGlvbiA9PSBwcmV2ZHVyKSB7CisgICAgICAvKiBJZiB0aGUgY3VycmVudCBzZWdtZW50IGhhcyBkdXJhdGlvbi9zdG9wIGlkZW50aWNhbCB0byBwcmV2aW91cyBkdXJhdGlvbgorICAgICAgICogdXBkYXRlIHRoZW0gYWxzbyAoYmVjYXVzZSB0aGV5IHdlcmUgc2V0IGF0IHRoYXQgcG9pbnQgaW4gdGltZSB3aXRoCisgICAgICAgKiB0aGUgd3JvbmcgZHVyYXRpb24gKi8KKyAgICAgIC8qIFdlIGNvbnZlcnQgdGhlIHZhbHVlICpmcm9tKiB0aGUgdGltZXNjYWxlIHZlcnNpb24gdG8gYXZvaWQgcm91bmRpbmcgZXJyb3JzICovCisgICAgICBHc3RDbG9ja1RpbWUgZml4ZWRkdXIgPSBRVFRJTUVfVE9fR1NUVElNRSAocXRkZW11eCwgbW92ZHVyKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJVcGRhdGVkIHNlZ21lbnQuZHVyYXRpb24gYW5kIHNlZ21lbnQuc3RvcCIpOworICAgICAgcXRkZW11eC0+c2VnbWVudC5kdXJhdGlvbiA9IGZpeGVkZHVyOworICAgICAgcXRkZW11eC0+c2VnbWVudC5zdG9wID0gZml4ZWRkdXI7CisgICAgfQorICB9CisgIGZvciAoaSA9IDA7IGkgPCBxdGRlbXV4LT5uX3N0cmVhbXM7IGkrKykgeworICAgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbSA9IHF0ZGVtdXgtPnN0cmVhbXNbaV07CisgICAgaWYgKHN0cmVhbSkgeworICAgICAgbW92ZHVyID0gR1NUVElNRV9UT19RVFNUUkVBTVRJTUUgKHN0cmVhbSwgZHVyYXRpb24pOworICAgICAgaWYgKG1vdmR1ciA+IHN0cmVhbS0+ZHVyYXRpb24pIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICJVcGRhdGluZyBzdHJlYW0gIyVkIGR1cmF0aW9uIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwgaSwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGR1cmF0aW9uKSk7CisgICAgICAgIHN0cmVhbS0+ZHVyYXRpb24gPSBtb3ZkdXI7CisgICAgICAgIC8qIGludGVybmFsIGR1cmF0aW9uIHRyYWNraW5nIHN0YXRlIGhhcyBiZWVuIHVwZGF0ZWQgYWJvdmUsIHNvICovCisgICAgICAgIC8qIHByZXNlcnZlIGFuIG9wZW4tZW5kZWQgZHVtbXkgc2VnbWVudCByYXRoZXIgdGhhbiByZXBlYXRlZGx5IHVwZGF0aW5nCisgICAgICAgICAqIGl0IGFuZCBzcGFtbWluZyBkb3duc3RyZWFtIGFjY29yZGluZ2x5IHdpdGggc2VnbWVudCBldmVudHMgKi8KKyAgICAgICAgaWYgKHN0cmVhbS0+ZHVtbXlfc2VnbWVudCAmJgorICAgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHN0cmVhbS0+c2VnbWVudHNbMF0uZHVyYXRpb24pKSB7CisgICAgICAgICAgLyogVXBkYXRlIGFsbCBkdW1teSB2YWx1ZXMgdG8gbmV3IGR1cmF0aW9uICovCisgICAgICAgICAgc3RyZWFtLT5zZWdtZW50c1swXS5zdG9wX3RpbWUgPSBkdXJhdGlvbjsKKyAgICAgICAgICBzdHJlYW0tPnNlZ21lbnRzWzBdLmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgICAgc3RyZWFtLT5zZWdtZW50c1swXS5tZWRpYV9zdG9wID0gZHVyYXRpb247CisKKyAgICAgICAgICAvKiBsZXQgZG93bnN0cmVhbSBrbm93IHdlIHBvc3NpYmx5IGhhdmUgYSBuZXcgc3RvcCB0aW1lICovCisgICAgICAgICAgaWYgKHN0cmVhbS0+c2VnbWVudF9pbmRleCAhPSAtMSkgeworICAgICAgICAgICAgR3N0Q2xvY2tUaW1lIHBvczsKKworICAgICAgICAgICAgaWYgKHF0ZGVtdXgtPnNlZ21lbnQucmF0ZSA+PSAwKSB7CisgICAgICAgICAgICAgIHBvcyA9IHN0cmVhbS0+c2VnbWVudC5zdGFydDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHBvcyA9IHN0cmVhbS0+c2VnbWVudC5zdG9wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnc3RfcXRkZW11eF9zdHJlYW1fdXBkYXRlX3NlZ21lbnQgKHF0ZGVtdXgsIHN0cmVhbSwKKyAgICAgICAgICAgICAgICBzdHJlYW0tPnNlZ21lbnRfaW5kZXgsIHBvcywgTlVMTCwgTlVMTCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcXRkZW11eF9wYXJzZV90cnVuIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIHRydW4sCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwgZ3VpbnQzMiBkX3NhbXBsZV9kdXJhdGlvbiwgZ3VpbnQzMiBkX3NhbXBsZV9zaXplLAorICAgIGd1aW50MzIgZF9zYW1wbGVfZmxhZ3MsIGdpbnQ2NCBtb29mX29mZnNldCwgZ2ludDY0IG1vb2ZfbGVuZ3RoLAorICAgIGdpbnQ2NCAqIGJhc2Vfb2Zmc2V0LCBnaW50NjQgKiBydW5uaW5nX29mZnNldCwgZ2ludDY0IGRlY29kZV90cywKKyAgICBnYm9vbGVhbiBoYXNfdGZkdCkKK3sKKyAgR3N0Q2xvY2tUaW1lIGdzdF90cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGd1aW50NjQgdGltZXN0YW1wOworICBnaW50MzIgZGF0YV9vZmZzZXQgPSAwOworICBndWludDMyIGZsYWdzID0gMCwgZmlyc3RfZmxhZ3MgPSAwLCBzYW1wbGVzX2NvdW50ID0gMDsKKyAgZ2ludCBpOworICBndWludDggKmRhdGE7CisgIGd1aW50IGVudHJ5X3NpemUsIGR1cl9vZmZzZXQsIHNpemVfb2Zmc2V0LCBmbGFnc19vZmZzZXQgPSAwLCBjdF9vZmZzZXQgPSAwOworICBRdERlbXV4U2FtcGxlICpzYW1wbGU7CisgIGdib29sZWFuIGlzbXYgPSBGQUxTRTsKKyAgZ2ludDY0IGluaXRpYWxfb2Zmc2V0OworCisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAicGFyc2luZyB0cnVuIHN0cmVhbSAlZDsgIgorICAgICAgImRlZmF1bHQgZHVyICVkLCBzaXplICVkLCBmbGFncyAweCV4LCBiYXNlIG9mZnNldCAlIiBHX0dJTlQ2NF9GT1JNQVQgIiwgIgorICAgICAgImRlY29kZSB0cyAlIiBHX0dJTlQ2NF9GT1JNQVQsIHN0cmVhbS0+dHJhY2tfaWQsIGRfc2FtcGxlX2R1cmF0aW9uLAorICAgICAgZF9zYW1wbGVfc2l6ZSwgZF9zYW1wbGVfZmxhZ3MsICpiYXNlX29mZnNldCwgZGVjb2RlX3RzKTsKKworICBpZiAoc3RyZWFtLT5wZW5kaW5nX3NlZWsgJiYgbW9vZl9vZmZzZXQgPCBzdHJlYW0tPnBlbmRpbmdfc2Vlay0+bW9vZl9vZmZzZXQpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHN0cmVhbS0+cGFkLCAic2tpcHBpbmcgdHJ1biBiZWZvcmUgc2VlayB0YXJnZXQgZnJhZ21lbnQiKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIC8qIHByZXNlbmNlIG9mIHN0c3Mgb3Igbm90IGNhbid0IHJlYWxseSB0ZWxsIHVzIG11Y2gsCisgICAqIGFuZCBmbGFncyBhbmQgc28gb24gdGVuZCB0byBiZSBtYXJnaW5hbGx5IHJlbGlhYmxlIGluIHRoZXNlIGZpbGVzICovCisgIGlmIChzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3NvdW4pIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAic291bmQgdHJhY2sgaW4gZnJhZ21lbnRlZCBmaWxlOyBtYXJraW5nIGFsbCBrZXlmcmFtZXMiKTsKKyAgICBzdHJlYW0tPmFsbF9rZXlmcmFtZSA9IFRSVUU7CisgIH0KKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICh0cnVuLCAxKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDI0X2JlICh0cnVuLCAmZmxhZ3MpKQorICAgIGdvdG8gZmFpbDsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICh0cnVuLCAmc2FtcGxlc19jb3VudCkpCisgICAgZ290byBmYWlsOworCisgIGlmIChmbGFncyAmIFRSX0RBVEFfT0ZGU0VUKSB7CisgICAgLyogbm90ZSB0aGlzIGlzIHJlYWxseSBzaWduZWQgKi8KKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfaW50MzJfYmUgKHRydW4sICZkYXRhX29mZnNldCkpCisgICAgICBnb3RvIGZhaWw7CisgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJ0cnVuIGRhdGEgb2Zmc2V0ICVkIiwgZGF0YV9vZmZzZXQpOworICAgIC8qIGRlZmF1bHQgYmFzZSBvZmZzZXQgPSBmaXJzdCBieXRlIG9mIG1vb2YgKi8KKyAgICBpZiAoKmJhc2Vfb2Zmc2V0ID09IC0xKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImJhc2Vfb2Zmc2V0IGF0IG1vb2YiKTsKKyAgICAgICpiYXNlX29mZnNldCA9IG1vb2Zfb2Zmc2V0OworICAgIH0KKyAgICAqcnVubmluZ19vZmZzZXQgPSAqYmFzZV9vZmZzZXQgKyBkYXRhX29mZnNldDsKKyAgfSBlbHNlIHsKKyAgICAvKiBpZiBubyBvZmZzZXQgYXQgYWxsLCB0aGF0IHdvdWxkIG1lYW4gZGF0YSBzdGFydHMgYXQgbW9vZiBzdGFydCwKKyAgICAgKiB3aGljaCBpcyBhIGJpdCB3cm9uZyBhbmQgaXMgaXNtdiBjcmFwcHkgd2F5LCBzbyBjb21wZW5zYXRlCisgICAgICogYXNzdW1pbmcgZGF0YSBpcyBpbiBtZGF0IGZvbGxvd2luZyBtb29mICovCisgICAgaWYgKCpiYXNlX29mZnNldCA9PSAtMSkgeworICAgICAgKmJhc2Vfb2Zmc2V0ID0gbW9vZl9vZmZzZXQgKyBtb29mX2xlbmd0aCArIDg7CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImJhc2Vfb2Zmc2V0IGFzc3VtZWQgaW4gbWRhdCBhZnRlciBtb29mIik7CisgICAgICBpc212ID0gVFJVRTsKKyAgICB9CisgICAgaWYgKCpydW5uaW5nX29mZnNldCA9PSAtMSkKKyAgICAgICpydW5uaW5nX29mZnNldCA9ICpiYXNlX29mZnNldDsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAicnVubmluZyBvZmZzZXQgbm93ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICpydW5uaW5nX29mZnNldCk7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAidHJ1biBvZmZzZXQgJWQsIGZsYWdzIDB4JXgsIGVudHJpZXMgJWQiLAorICAgICAgZGF0YV9vZmZzZXQsIGZsYWdzLCBzYW1wbGVzX2NvdW50KTsKKworICBpZiAoZmxhZ3MgJiBUUl9GSVJTVF9TQU1QTEVfRkxBR1MpIHsKKyAgICBpZiAoR19VTkxJS0VMWSAoZmxhZ3MgJiBUUl9TQU1QTEVfRkxBR1MpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICJpbnZhbGlkIGZsYWdzOyBTQU1QTEUgYW5kIEZJUlNUX1NBTVBMRSBwcmVzZW50LCBkaXNjYXJkaW5nIGxhdHRlciIpOworICAgICAgZmxhZ3MgXj0gVFJfRklSU1RfU0FNUExFX0ZMQUdTOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICh0cnVuLCAmZmlyc3RfZmxhZ3MpKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImZpcnN0IGZsYWdzOiAweCV4IiwgZmlyc3RfZmxhZ3MpOworICAgIH0KKyAgfQorCisgIC8qIEZJWE1FID8gc3BlYyBzYXlzIG90aGVyIGJpdHMgc2hvdWxkIGFsc28gYmUgY2hlY2tlZCB0byBkZXRlcm1pbmUKKyAgICogZW50cnkgc2l6ZSAoYW5kIHByZWZpeCBzaXplIGZvciB0aGF0IG1hdHRlcikgKi8KKyAgZW50cnlfc2l6ZSA9IDA7CisgIGR1cl9vZmZzZXQgPSBzaXplX29mZnNldCA9IDA7CisgIGlmIChmbGFncyAmIFRSX1NBTVBMRV9EVVJBVElPTikgeworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiZW50cnkgZHVyYXRpb24gcHJlc2VudCIpOworICAgIGR1cl9vZmZzZXQgPSBlbnRyeV9zaXplOworICAgIGVudHJ5X3NpemUgKz0gNDsKKyAgfQorICBpZiAoZmxhZ3MgJiBUUl9TQU1QTEVfU0laRSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiZW50cnkgc2l6ZSBwcmVzZW50Iik7CisgICAgc2l6ZV9vZmZzZXQgPSBlbnRyeV9zaXplOworICAgIGVudHJ5X3NpemUgKz0gNDsKKyAgfQorICBpZiAoZmxhZ3MgJiBUUl9TQU1QTEVfRkxBR1MpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImVudHJ5IGZsYWdzIHByZXNlbnQiKTsKKyAgICBmbGFnc19vZmZzZXQgPSBlbnRyeV9zaXplOworICAgIGVudHJ5X3NpemUgKz0gNDsKKyAgfQorICBpZiAoZmxhZ3MgJiBUUl9DT01QT1NJVElPTl9USU1FX09GRlNFVFMpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImVudHJ5IGN0IG9mZnNldCBwcmVzZW50Iik7CisgICAgY3Rfb2Zmc2V0ID0gZW50cnlfc2l6ZTsKKyAgICBlbnRyeV9zaXplICs9IDQ7CisgIH0KKworICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19jaHVua3MgKHRydW4sIHNhbXBsZXNfY291bnQsIGVudHJ5X3NpemUpKQorICAgIGdvdG8gZmFpbDsKKyAgZGF0YSA9IChndWludDggKikgZ3N0X2J5dGVfcmVhZGVyX3BlZWtfZGF0YV91bmNoZWNrZWQgKHRydW4pOworCisgIGlmIChzdHJlYW0tPm5fc2FtcGxlcyArIHNhbXBsZXNfY291bnQgPj0KKyAgICAgIFFUREVNVVhfTUFYX1NBTVBMRV9JTkRFWF9TSVpFIC8gc2l6ZW9mIChRdERlbXV4U2FtcGxlKSkKKyAgICBnb3RvIGluZGV4X3Rvb19iaWc7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImFsbG9jYXRpbmcgbl9zYW1wbGVzICV1ICogJXUgKCUuMmYgTUIpIiwKKyAgICAgIHN0cmVhbS0+bl9zYW1wbGVzICsgc2FtcGxlc19jb3VudCwgKGd1aW50KSBzaXplb2YgKFF0RGVtdXhTYW1wbGUpLAorICAgICAgKHN0cmVhbS0+bl9zYW1wbGVzICsgc2FtcGxlc19jb3VudCkgKgorICAgICAgc2l6ZW9mIChRdERlbXV4U2FtcGxlKSAvICgxMDI0LjAgKiAxMDI0LjApKTsKKworICAvKiBjcmVhdGUgYSBuZXcgYXJyYXkgb2Ygc2FtcGxlcyBpZiBpdCdzIHRoZSBmaXJzdCBzYW1wbGUgcGFyc2VkICovCisgIGlmIChzdHJlYW0tPm5fc2FtcGxlcyA9PSAwKSB7CisgICAgZ19hc3NlcnQgKHN0cmVhbS0+c2FtcGxlcyA9PSBOVUxMKTsKKyAgICBzdHJlYW0tPnNhbXBsZXMgPSBnX3RyeV9uZXcwIChRdERlbXV4U2FtcGxlLCBzYW1wbGVzX2NvdW50KTsKKyAgICAvKiBvciB0cnkgdG8gcmVhbGxvY2F0ZSBpdCB3aXRoIHNwYWNlIGVub3VnaCB0byBpbnNlcnQgdGhlIG5ldyBzYW1wbGVzICovCisgIH0gZWxzZQorICAgIHN0cmVhbS0+c2FtcGxlcyA9IGdfdHJ5X3JlbmV3IChRdERlbXV4U2FtcGxlLCBzdHJlYW0tPnNhbXBsZXMsCisgICAgICAgIHN0cmVhbS0+bl9zYW1wbGVzICsgc2FtcGxlc19jb3VudCk7CisgIGlmIChzdHJlYW0tPnNhbXBsZXMgPT0gTlVMTCkKKyAgICBnb3RvIG91dF9vZl9tZW1vcnk7CisKKyAgaWYgKHF0ZGVtdXgtPmZyYWdtZW50X3N0YXJ0ICE9IC0xKSB7CisgICAgdGltZXN0YW1wID0gR1NUVElNRV9UT19RVFNUUkVBTVRJTUUgKHN0cmVhbSwgcXRkZW11eC0+ZnJhZ21lbnRfc3RhcnQpOworICAgIHF0ZGVtdXgtPmZyYWdtZW50X3N0YXJ0ID0gLTE7CisgIH0gZWxzZSB7CisgICAgaWYgKHN0cmVhbS0+bl9zYW1wbGVzID09IDApIHsKKyAgICAgIGlmIChkZWNvZGVfdHMgPiAwKSB7CisgICAgICAgIHRpbWVzdGFtcCA9IGRlY29kZV90czsKKyAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLT5wZW5kaW5nX3NlZWsgIT0gTlVMTCkgeworICAgICAgICAvKiBpZiB3ZSBkb24ndCBoYXZlIGEgdGltZXN0YW1wIGZyb20gYSB0ZmR0IGJveCwgd2UnbGwgdXNlIHRoZSBvbmUKKyAgICAgICAgICogZnJvbSB0aGUgbWZyYSBzZWVrIHRhYmxlICovCisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoc3RyZWFtLT5wYWQsICJwZW5kaW5nIHNlZWsgdHMgPSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChzdHJlYW0tPnBlbmRpbmdfc2Vlay0+dHMpKTsKKworICAgICAgICAvKiBGSVhNRTogdGhpcyBpcyBub3QgZnVsbHkgY29ycmVjdCwgdGhlIHRpbWVzdGFtcCByZWZlcnMgdG8gdGhlIHJhbmRvbQorICAgICAgICAgKiBhY2Nlc3Mgc2FtcGxlIHJlZmVyZWQgdG8gaW4gdGhlIHRmcmEgZW50cnksIHdoaWNoIG1heSBub3QgbmVjZXNzYXJpbHkKKyAgICAgICAgICogYmUgdGhlIGZpcnN0IHNhbXBsZSBpbiB0aGUgdGZyYWcvdHJ1biAoYnV0IGhvcGVmdWxseS91c3VhbGx5IGlzKSAqLworICAgICAgICB0aW1lc3RhbXAgPSBHU1RUSU1FX1RPX1FUU1RSRUFNVElNRSAoc3RyZWFtLCBzdHJlYW0tPnBlbmRpbmdfc2Vlay0+dHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGltZXN0YW1wID0gMDsKKyAgICAgIH0KKworICAgICAgZ3N0X3RzID0gUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUgKHN0cmVhbSwgdGltZXN0YW1wKTsKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoc3RyZWFtLT5wYWQsICJmaXJzdCBzYW1wbGUgdHMgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGdzdF90cykpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBzdWJzZXF1ZW50IGZyYWdtZW50cyBleHRlbmQgc3RyZWFtICovCisgICAgICB0aW1lc3RhbXAgPQorICAgICAgICAgIHN0cmVhbS0+c2FtcGxlc1tzdHJlYW0tPm5fc2FtcGxlcyAtIDFdLnRpbWVzdGFtcCArCisgICAgICAgICAgc3RyZWFtLT5zYW1wbGVzW3N0cmVhbS0+bl9zYW1wbGVzIC0gMV0uZHVyYXRpb247CisKKyAgICAgIC8qIElmIHRoaXMgaXMgYSBHU1RfRk9STUFUX0JZVEVTIHN0cmVhbSBhbmQgdGhlcmUncyBhIHNpZ25pZmljYW50CisgICAgICAgKiBkaWZmZXJlbmNlICgxIHNlYy4pIGJldHdlZW4gZGVjb2RlX3RzIGFuZCB0aW1lc3RhbXAsIHByZWZlciB0aGUKKyAgICAgICAqIGZvcm1lciAqLworICAgICAgaWYgKGhhc190ZmR0ICYmICFxdGRlbXV4LT51cHN0cmVhbV9mb3JtYXRfaXNfdGltZQorICAgICAgICAgICYmIEFCU0RJRkYgKGRlY29kZV90cywgdGltZXN0YW1wKSA+CisgICAgICAgICAgTUFYIChzdHJlYW0tPmR1cmF0aW9uX2xhc3RfbW9vZiAvIDIsCisgICAgICAgICAgICAgIEdTVFRJTUVfVE9fUVRTVFJFQU1USU1FIChzdHJlYW0sIEdTVF9TRUNPTkQpKSkgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAiZGVjb2RlX3RzICglIiBHU1RfVElNRV9GT1JNQVQgIikgYW5kIHRpbWVzdGFtcCAoJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICAgICAiKSBhcmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgKG1vcmUgdGhhbiAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAgICIpLCB1c2luZyBkZWNvZGVfdHMiLAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUgKHN0cmVhbSwgZGVjb2RlX3RzKSksCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChRVFNUUkVBTVRJTUVfVE9fR1NUVElNRSAoc3RyZWFtLCB0aW1lc3RhbXApKSwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKFFUU1RSRUFNVElNRV9UT19HU1RUSU1FIChzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgIE1BWCAoc3RyZWFtLT5kdXJhdGlvbl9sYXN0X21vb2YgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgR1NUVElNRV9UT19RVFNUUkVBTVRJTUUgKHN0cmVhbSwgR1NUX1NFQ09ORCkpKSkpOworICAgICAgICB0aW1lc3RhbXAgPSBkZWNvZGVfdHM7CisgICAgICB9CisKKyAgICAgIGdzdF90cyA9IFFUU1RSRUFNVElNRV9UT19HU1RUSU1FIChzdHJlYW0sIHRpbWVzdGFtcCk7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsICJmaXJzdCBzYW1wbGUgdHMgJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICAgIiAoZXh0ZW5kcyBwcmV2aW91cyBzYW1wbGVzKSIsIEdTVF9USU1FX0FSR1MgKGdzdF90cykpOworICAgIH0KKyAgfQorCisgIGluaXRpYWxfb2Zmc2V0ID0gKnJ1bm5pbmdfb2Zmc2V0OworCisgIHNhbXBsZSA9IHN0cmVhbS0+c2FtcGxlcyArIHN0cmVhbS0+bl9zYW1wbGVzOworICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlc19jb3VudDsgaSsrKSB7CisgICAgZ3VpbnQzMiBkdXIsIHNpemUsIHNmbGFncywgY3Q7CisKKyAgICAvKiBmaXJzdCByZWFkIHNhbXBsZSBkYXRhICovCisgICAgaWYgKGZsYWdzICYgVFJfU0FNUExFX0RVUkFUSU9OKSB7CisgICAgICBkdXIgPSBRVF9VSU5UMzIgKGRhdGEgKyBkdXJfb2Zmc2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgZHVyID0gZF9zYW1wbGVfZHVyYXRpb247CisgICAgfQorICAgIGlmIChmbGFncyAmIFRSX1NBTVBMRV9TSVpFKSB7CisgICAgICBzaXplID0gUVRfVUlOVDMyIChkYXRhICsgc2l6ZV9vZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICBzaXplID0gZF9zYW1wbGVfc2l6ZTsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgVFJfRklSU1RfU0FNUExFX0ZMQUdTKSB7CisgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgIHNmbGFncyA9IGZpcnN0X2ZsYWdzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2ZsYWdzID0gZF9zYW1wbGVfZmxhZ3M7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChmbGFncyAmIFRSX1NBTVBMRV9GTEFHUykgeworICAgICAgc2ZsYWdzID0gUVRfVUlOVDMyIChkYXRhICsgZmxhZ3Nfb2Zmc2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgc2ZsYWdzID0gZF9zYW1wbGVfZmxhZ3M7CisgICAgfQorICAgIGlmIChmbGFncyAmIFRSX0NPTVBPU0lUSU9OX1RJTUVfT0ZGU0VUUykgeworICAgICAgY3QgPSBRVF9VSU5UMzIgKGRhdGEgKyBjdF9vZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICBjdCA9IDA7CisgICAgfQorICAgIGRhdGEgKz0gZW50cnlfc2l6ZTsKKworICAgIC8qIGZpbGwgdGhlIHNhbXBsZSBpbmZvcm1hdGlvbiAqLworICAgIHNhbXBsZS0+b2Zmc2V0ID0gKnJ1bm5pbmdfb2Zmc2V0OworICAgIHNhbXBsZS0+cHRzX29mZnNldCA9IGN0OworICAgIHNhbXBsZS0+c2l6ZSA9IHNpemU7CisgICAgc2FtcGxlLT50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgc2FtcGxlLT5kdXJhdGlvbiA9IGR1cjsKKyAgICAvKiBzYW1wbGUtaXMtZGlmZmVyZW5jZS1zYW1wbGUgKi8KKyAgICAvKiBpc212IHNlZW1zIHRvIHVzZSAweDQwIGZvciBrZXlmcmFtZSwgMHhjMCBmb3Igbm9uLWtleWZyYW1lLAorICAgICAqIG5vdyBpZGVhIGhvdyBpdCByZWxhdGVzIHRvIGJpdGZpZWxkIG90aGVyIHRoYW4gbWFzc2l2ZSBMRS9CRSBjb25mdXNpb24gKi8KKyAgICBzYW1wbGUtPmtleWZyYW1lID0gaXNtdiA/ICgoc2ZsYWdzICYgMHhmZikgPT0gMHg0MCkgOiAhKHNmbGFncyAmIDB4MTAwMDApOworICAgICpydW5uaW5nX29mZnNldCArPSBzaXplOworICAgIHRpbWVzdGFtcCArPSBkdXI7CisgICAgc3RyZWFtLT5kdXJhdGlvbl9tb29mICs9IGR1cjsKKyAgICBzYW1wbGUrKzsKKyAgfQorCisgIC8qIFVwZGF0ZSB0b3RhbCBkdXJhdGlvbiBpZiBuZWVkZWQgKi8KKyAgY2hlY2tfdXBkYXRlX2R1cmF0aW9uIChxdGRlbXV4LCBRVFNUUkVBTVRJTUVfVE9fR1NUVElNRSAoc3RyZWFtLCB0aW1lc3RhbXApKTsKKworICAvKiBQcmUtZW1wdGl2ZWx5IGZpZ3VyZSBvdXQgc2l6ZSBvZiBtZGF0IGJhc2VkIG9uIHRydW4gaW5mb3JtYXRpb24uCisgICAqIElmIHRoZSBbbWRhdF0gYXRvbSBpcyBlZmZlY3RpdmVsbHkgcmVhZCwgaXQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgYWN0dWFsCisgICAqIHNpemUsIGVsc2Ugd2Ugd2lsbCBzdGlsbCBiZSBhYmxlIHRvIHVzZSB0aGlzIHdoZW4gZGVhbGluZyB3aXRoIGdhcCdlZAorICAgKiBpbnB1dCAqLworICBxdGRlbXV4LT5tZGF0bGVmdCA9ICpydW5uaW5nX29mZnNldCAtIGluaXRpYWxfb2Zmc2V0OworICBxdGRlbXV4LT5tZGF0b2Zmc2V0ID0gaW5pdGlhbF9vZmZzZXQ7CisgIHF0ZGVtdXgtPm1kYXRzaXplID0gcXRkZW11eC0+bWRhdGxlZnQ7CisKKyAgc3RyZWFtLT5uX3NhbXBsZXMgKz0gc2FtcGxlc19jb3VudDsKKyAgc3RyZWFtLT5uX3NhbXBsZXNfbW9vZiArPSBzYW1wbGVzX2NvdW50OworCisgIGlmIChzdHJlYW0tPnBlbmRpbmdfc2VlayAhPSBOVUxMKQorICAgIHN0cmVhbS0+cGVuZGluZ19zZWVrID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKKworZmFpbDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgImZhaWxlZCB0byBwYXJzZSB0cnVuIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitvdXRfb2ZfbWVtb3J5OgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAiZmFpbGVkIHRvIGFsbG9jYXRlICVkIHNhbXBsZXMiLAorICAgICAgICBzdHJlYW0tPm5fc2FtcGxlcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbmRleF90b29fYmlnOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAibm90IGFsbG9jYXRpbmcgaW5kZXggb2YgJWQgc2FtcGxlcywgd291bGQgIgorICAgICAgICAiYmUgbGFyZ2VyIHRoYW4gJXVNQiAoYnJva2VuIGZpbGU/KSIsIHN0cmVhbS0+bl9zYW1wbGVzLAorICAgICAgICBRVERFTVVYX01BWF9TQU1QTEVfSU5ERVhfU0laRSA+PiAyMCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIGZpbmQgc3RyZWFtIHdpdGggQGlkICovCitzdGF0aWMgaW5saW5lIFF0RGVtdXhTdHJlYW0gKgorcXRkZW11eF9maW5kX3N0cmVhbSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIGd1aW50MzIgaWQpCit7CisgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbTsKKyAgZ2ludCBpOworCisgIC8qIGNoZWNrICovCisgIGlmIChHX1VOTElLRUxZICghaWQpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImludmFsaWQgdHJhY2sgaWQgMCIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLyogdHJ5IHRvIGdldCBpdCBmYXN0IGFuZCBzaW1wbGUgKi8KKyAgaWYgKEdfTElLRUxZIChpZCA8PSBxdGRlbXV4LT5uX3N0cmVhbXMpKSB7CisgICAgc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1tpZCAtIDFdOworICAgIGlmIChHX0xJS0VMWSAoc3RyZWFtLT50cmFja19pZCA9PSBpZCkpCisgICAgICByZXR1cm4gc3RyZWFtOworICB9CisKKyAgLyogbGluZWFyIHNlYXJjaCBvdGhlcndpc2UgKi8KKyAgZm9yIChpID0gMDsgaSA8IHF0ZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1tpXTsKKyAgICBpZiAoc3RyZWFtLT50cmFja19pZCA9PSBpZCkKKyAgICAgIHJldHVybiBzdHJlYW07CisgIH0KKyAgaWYgKHF0ZGVtdXgtPm1zc19tb2RlKSB7CisgICAgLyogbXNzIHNob3VsZCBoYXZlIG9ubHkgMSBzdHJlYW0gYW55d2F5ICovCisgICAgcmV0dXJuIHF0ZGVtdXgtPnN0cmVhbXNbMF07CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3BhcnNlX21maGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogbWZoZCwKKyAgICBndWludDMyICogZnJhZ21lbnRfbnVtYmVyKQoreworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwIChtZmhkLCA0KSkKKyAgICBnb3RvIGZhaWw7CisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKG1maGQsIGZyYWdtZW50X251bWJlcikpCisgICAgZ290byBmYWlsOworICByZXR1cm4gVFJVRTsKK2ZhaWw6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJGYWlsZWQgdG8gcGFyc2UgbWZoZCBhdG9tIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcXRkZW11eF9wYXJzZV90ZmhkIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIHRmaGQsCisgICAgUXREZW11eFN0cmVhbSAqKiBzdHJlYW0sIGd1aW50MzIgKiBkZWZhdWx0X3NhbXBsZV9kdXJhdGlvbiwKKyAgICBndWludDMyICogZGVmYXVsdF9zYW1wbGVfc2l6ZSwgZ3VpbnQzMiAqIGRlZmF1bHRfc2FtcGxlX2ZsYWdzLAorICAgIGdpbnQ2NCAqIGJhc2Vfb2Zmc2V0KQoreworICBndWludDMyIGZsYWdzID0gMDsKKyAgZ3VpbnQzMiB0cmFja19pZCA9IDA7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAodGZoZCwgMSkgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQyNF9iZSAodGZoZCwgJmZsYWdzKSkKKyAgICBnb3RvIGludmFsaWRfdHJhY2s7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAodGZoZCwgJnRyYWNrX2lkKSkKKyAgICBnb3RvIGludmFsaWRfdHJhY2s7CisKKyAgKnN0cmVhbSA9IHF0ZGVtdXhfZmluZF9zdHJlYW0gKHF0ZGVtdXgsIHRyYWNrX2lkKTsKKyAgaWYgKEdfVU5MSUtFTFkgKCEqc3RyZWFtKSkKKyAgICBnb3RvIHVua25vd25fc3RyZWFtOworCisgIGlmIChmbGFncyAmIFRGX0RFRkFVTFRfQkFTRV9JU19NT09GKQorICAgICpiYXNlX29mZnNldCA9IHF0ZGVtdXgtPm1vb2Zfb2Zmc2V0OworCisgIGlmIChmbGFncyAmIFRGX0JBU0VfREFUQV9PRkZTRVQpCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ2NF9iZSAodGZoZCwgKGd1aW50NjQgKikgYmFzZV9vZmZzZXQpKQorICAgICAgZ290byBpbnZhbGlkX3RyYWNrOworCisgIC8qIG9idGFpbiBzdHJlYW0gZGVmYXVsdHMgKi8KKyAgcXRkZW11eF9wYXJzZV90cmV4IChxdGRlbXV4LCAqc3RyZWFtLAorICAgICAgZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24sIGRlZmF1bHRfc2FtcGxlX3NpemUsIGRlZmF1bHRfc2FtcGxlX2ZsYWdzKTsKKworICAoKnN0cmVhbSktPnN0c2Rfc2FtcGxlX2Rlc2NyaXB0aW9uX2lkID0KKyAgICAgICgqc3RyZWFtKS0+ZGVmX3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCAtIDE7CisKKyAgaWYgKGZsYWdzICYgVEZfU0FNUExFX0RFU0NSSVBUSU9OX0lOREVYKSB7CisgICAgZ3VpbnQzMiBzYW1wbGVfZGVzY3JpcHRpb25faW5kZXg7CisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAodGZoZCwgJnNhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCkpCisgICAgICBnb3RvIGludmFsaWRfdHJhY2s7CisgICAgKCpzdHJlYW0pLT5zdHNkX3NhbXBsZV9kZXNjcmlwdGlvbl9pZCA9IHNhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCAtIDE7CisgIH0KKworICBpZiAocXRkZW11eC0+bXNzX21vZGUpIHsKKyAgICAvKiBtc3MgaGFzIG5vIHN0c2QgZW50cnkgKi8KKyAgICAoKnN0cmVhbSktPnN0c2Rfc2FtcGxlX2Rlc2NyaXB0aW9uX2lkID0gMDsKKyAgfQorCisgIGlmIChmbGFncyAmIFRGX0RFRkFVTFRfU0FNUExFX0RVUkFUSU9OKQorICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKHRmaGQsIGRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uKSkKKyAgICAgIGdvdG8gaW52YWxpZF90cmFjazsKKworICBpZiAoZmxhZ3MgJiBURl9ERUZBVUxUX1NBTVBMRV9TSVpFKQorICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKHRmaGQsIGRlZmF1bHRfc2FtcGxlX3NpemUpKQorICAgICAgZ290byBpbnZhbGlkX3RyYWNrOworCisgIGlmIChmbGFncyAmIFRGX0RFRkFVTFRfU0FNUExFX0ZMQUdTKQorICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKHRmaGQsIGRlZmF1bHRfc2FtcGxlX2ZsYWdzKSkKKyAgICAgIGdvdG8gaW52YWxpZF90cmFjazsKKworICByZXR1cm4gVFJVRTsKKworaW52YWxpZF90cmFjazoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgImludmFsaWQgdHJhY2sgZnJhZ21lbnQgaGVhZGVyIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit1bmtub3duX3N0cmVhbToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJ1bmtub3duIHN0cmVhbSBpbiB0ZmhkIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3BhcnNlX3RmZHQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogYnIsCisgICAgZ3VpbnQ2NCAqIGRlY29kZV90aW1lKQoreworICBndWludDMyIHZlcnNpb24gPSAwOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGJyLCAmdmVyc2lvbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHZlcnNpb24gPj49IDI0OworICBpZiAodmVyc2lvbiA9PSAxKSB7CisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ2NF9iZSAoYnIsIGRlY29kZV90aW1lKSkKKyAgICAgIGdvdG8gZmFpbGVkOworICB9IGVsc2UgeworICAgIGd1aW50MzIgZGVjX3RpbWUgPSAwOworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGJyLCAmZGVjX3RpbWUpKQorICAgICAgZ290byBmYWlsZWQ7CisgICAgKmRlY29kZV90aW1lID0gZGVjX3RpbWU7CisgIH0KKworICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsICJUcmFjayBmcmFnbWVudCBkZWNvZGUgdGltZTogJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICpkZWNvZGVfdGltZSk7CisKKyAgcmV0dXJuIFRSVUU7CisKK2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJwYXJzaW5nIHRmZHQgZmFpbGVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIFJldHVybnMgYSBwb2ludGVyIHRvIGEgR3N0U3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgb2YKKyAqIHRoZSBzdHJlYW0gc2FtcGxlIGlkZW50aWZpZWQgYnkgQHNhbXBsZV9pbmRleC4gVGhlIGNhbGxlciBtdXN0IHVucmVmCisgKiB0aGUgcmV0dXJuZWQgb2JqZWN0IGFmdGVyIHVzZS4gUmV0dXJucyBOVUxMIGlmIHVuc3VjY2Vzc2Z1bC4gKi8KK3N0YXRpYyBHc3RTdHJ1Y3R1cmUgKgorcXRkZW11eF9nZXRfY2VuY19zYW1wbGVfcHJvcGVydGllcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwgZ3VpbnQgc2FtcGxlX2luZGV4KQoreworICBRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gKmluZm8gPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzdHJlYW0gIT0gTlVMTCwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzdHJlYW0tPnByb3RlY3RlZCwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzdHJlYW0tPnByb3RlY3Rpb25fc2NoZW1lX2luZm8gIT0gTlVMTCwgTlVMTCk7CisKKyAgaW5mbyA9IChRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gKikgc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV9pbmZvOworCisgIC8qIEN1cnJlbnRseSwgY2VuYyBwcm9wZXJ0aWVzIGZvciBncm91cHMgb2Ygc2FtcGxlcyBhcmUgbm90IHN1cHBvcnRlZCwgc28KKyAgICogc2ltcGx5IHJldHVybiBhIGNvcHkgb2YgdGhlIGRlZmF1bHQgc2FtcGxlIHByb3BlcnRpZXMgKi8KKyAgcmV0dXJuIGdzdF9zdHJ1Y3R1cmVfY29weSAoaW5mby0+ZGVmYXVsdF9wcm9wZXJ0aWVzKTsKK30KKworLyogUGFyc2VzIHRoZSBzaXplcyBvZiBzYW1wbGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIGNvbnRhaW5lZCB3aXRoaW4gYSBzdHJlYW0sCisgKiBhcyBnaXZlbiBpbiBhIHNhaXogYm94LiBSZXR1cm5zIGFycmF5IG9mIHNhbXBsZV9jb3VudCBndWludDggc2l6ZSB2YWx1ZXMsCisgKiBvciBOVUxMIG9uIGZhaWx1cmUgKi8KK3N0YXRpYyBndWludDggKgorcXRkZW11eF9wYXJzZV9zYWl6IChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RCeXRlUmVhZGVyICogYnIsIGd1aW50MzIgKiBzYW1wbGVfY291bnQpCit7CisgIGd1aW50MzIgZmxhZ3MgPSAwOworICBndWludDggKmluZm9fc2l6ZXM7CisgIGd1aW50OCBkZWZhdWx0X2luZm9fc2l6ZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAocXRkZW11eCAhPSBOVUxMLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHN0cmVhbSAhPSBOVUxMLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGJyICE9IE5VTEwsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2FtcGxlX2NvdW50ICE9IE5VTEwsIE5VTEwpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGJyLCAmZmxhZ3MpKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChmbGFncyAmIDB4MSkgeworICAgIC8qIGF1eF9pbmZvX3R5cGUgYW5kIGF1eF9pbmZvX3R5cGVfcGFyYW1ldGVyIGFyZSBpZ25vcmVkICovCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoYnIsIDgpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKGJyLCAmZGVmYXVsdF9pbmZvX3NpemUpKQorICAgIHJldHVybiBOVUxMOworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZGVmYXVsdF9pbmZvX3NpemU6ICV1IiwgZGVmYXVsdF9pbmZvX3NpemUpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGJyLCBzYW1wbGVfY291bnQpKQorICAgIHJldHVybiBOVUxMOworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic2FtcGxlX2NvdW50OiAldSIsICpzYW1wbGVfY291bnQpOworCisKKyAgaWYgKGRlZmF1bHRfaW5mb19zaXplID09IDApIHsKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9kdXBfZGF0YSAoYnIsICpzYW1wbGVfY291bnQsICZpbmZvX3NpemVzKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9IGVsc2UgeworICAgIGluZm9fc2l6ZXMgPSBnX25ldyAoZ3VpbnQ4LCAqc2FtcGxlX2NvdW50KTsKKyAgICBtZW1zZXQgKGluZm9fc2l6ZXMsIGRlZmF1bHRfaW5mb19zaXplLCAqc2FtcGxlX2NvdW50KTsKKyAgfQorCisgIHJldHVybiBpbmZvX3NpemVzOworfQorCisvKiBQYXJzZXMgdGhlIG9mZnNldCBvZiBzYW1wbGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIGNvbnRhaW5lZCB3aXRoaW4gYSBzdHJlYW0sCisgKiBhcyBnaXZlbiBpbiBhIHNhaW8gYm94LiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bDsgRkFMU0Ugb3RoZXJ3aXNlLiAqLworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3BhcnNlX3NhaW8gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBRdERlbXV4U3RyZWFtICogc3RyZWFtLAorICAgIEdzdEJ5dGVSZWFkZXIgKiBiciwgZ3VpbnQzMiAqIGluZm9fdHlwZSwgZ3VpbnQzMiAqIGluZm9fdHlwZV9wYXJhbWV0ZXIsCisgICAgZ3VpbnQ2NCAqIG9mZnNldCkKK3sKKyAgZ3VpbnQ4IHZlcnNpb24gPSAwOworICBndWludDMyIGZsYWdzID0gMDsKKyAgZ3VpbnQzMiBhdXhfaW5mb190eXBlID0gMDsKKyAgZ3VpbnQzMiBhdXhfaW5mb190eXBlX3BhcmFtZXRlciA9IDA7CisgIGd1aW50MzIgZW50cnlfY291bnQ7CisgIGd1aW50MzIgb2ZmXzMyOworICBndWludDY0IG9mZl82NDsKKyAgY29uc3QgZ3VpbnQ4ICphdXhfaW5mb190eXBlX2RhdGEgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChxdGRlbXV4ICE9IE5VTEwsIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHN0cmVhbSAhPSBOVUxMLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChiciAhPSBOVUxMLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChvZmZzZXQgIT0gTlVMTCwgRkFMU0UpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAoYnIsICZ2ZXJzaW9uKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQyNF9iZSAoYnIsICZmbGFncykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChmbGFncyAmIDB4MSkgeworCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2RhdGEgKGJyLCA0LCAmYXV4X2luZm9fdHlwZV9kYXRhKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBhdXhfaW5mb190eXBlID0gUVRfRk9VUkNDIChhdXhfaW5mb190eXBlX2RhdGEpOworCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoYnIsICZhdXhfaW5mb190eXBlX3BhcmFtZXRlcikpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0gZWxzZSBpZiAoc3RyZWFtLT5wcm90ZWN0ZWQpIHsKKyAgICBhdXhfaW5mb190eXBlID0gc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV90eXBlOworICB9IGVsc2UgeworICAgIGF1eF9pbmZvX3R5cGUgPSBDVVJfU1RSRUFNIChzdHJlYW0pLT5mb3VyY2M7CisgIH0KKworICBpZiAoaW5mb190eXBlKQorICAgICppbmZvX3R5cGUgPSBhdXhfaW5mb190eXBlOworICBpZiAoaW5mb190eXBlX3BhcmFtZXRlcikKKyAgICAqaW5mb190eXBlX3BhcmFtZXRlciA9IGF1eF9pbmZvX3R5cGVfcGFyYW1ldGVyOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJhdXhfaW5mb190eXBlOiAnJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIicsICIKKyAgICAgICJhdXhfaW5mb190eXBlX3BhcmFtZXRlcjogICUjMDZ4IiwKKyAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoYXV4X2luZm9fdHlwZSksIGF1eF9pbmZvX3R5cGVfcGFyYW1ldGVyKTsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChiciwgJmVudHJ5X2NvdW50KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGVudHJ5X2NvdW50ICE9IDEpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChxdGRlbXV4LCAibXVsdGlwbGUgb2Zmc2V0cyBhcmUgbm90IHN1cHBvcnRlZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICh2ZXJzaW9uID09IDApIHsKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChiciwgJm9mZl8zMikpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgKm9mZnNldCA9IChndWludDY0KSBvZmZfMzI7CisgIH0gZWxzZSB7CisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ2NF9iZSAoYnIsICZvZmZfNjQpKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgICpvZmZzZXQgPSBvZmZfNjQ7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAib2Zmc2V0OiAlIiBHX0dVSU5UNjRfRk9STUFULCAqb2Zmc2V0KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X2dzdF9zdHJ1Y3R1cmVfZnJlZSAoR3N0U3RydWN0dXJlICogZ3N0c3RydWN0dXJlKQoreworICBpZiAoZ3N0c3RydWN0dXJlKSB7CisgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChnc3RzdHJ1Y3R1cmUpOworICB9Cit9CisKKy8qIFBhcnNlcyBhdXhpbGlhcnkgaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gc2FtcGxlcyBwcm90ZWN0ZWQgdXNpbmcgQ29tbW9uCisgKiBFbmNyeXB0aW9uIChjZW5jKTsgdGhlIGZvcm1hdCBvZiB0aGlzIGluZm9ybWF0aW9uIGlzIGRlZmluZWQgaW4KKyAqIElTTy9JRUMgMjMwMDEtNy4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWw7IEZBTFNFIG90aGVyd2lzZS4gKi8KK3N0YXRpYyBnYm9vbGVhbgorcXRkZW11eF9wYXJzZV9jZW5jX2F1eF9pbmZvIChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RCeXRlUmVhZGVyICogYnIsIGd1aW50OCAqIGluZm9fc2l6ZXMsIGd1aW50MzIgc2FtcGxlX2NvdW50KQoreworICBRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gKnNzX2luZm8gPSBOVUxMOworICBndWludDggc2l6ZTsKKyAgZ2ludCBpOworICBHUHRyQXJyYXkgKm9sZF9jcnlwdG9faW5mbyA9IE5VTEw7CisgIGd1aW50IG9sZF9lbnRyaWVzID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAocXRkZW11eCAhPSBOVUxMLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzdHJlYW0gIT0gTlVMTCwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoYnIgIT0gTlVMTCwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc3RyZWFtLT5wcm90ZWN0ZWQsIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfaW5mbyAhPSBOVUxMLCBGQUxTRSk7CisKKyAgc3NfaW5mbyA9IChRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gKikgc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV9pbmZvOworCisgIGlmIChzc19pbmZvLT5jcnlwdG9faW5mbykgeworICAgIG9sZF9jcnlwdG9faW5mbyA9IHNzX2luZm8tPmNyeXB0b19pbmZvOworICAgIC8qIENvdW50IG51bWJlciBvZiBub24tbnVsbCBlbnRyaWVzIHJlbWFpbmluZyBhdCB0aGUgdGFpbCBlbmQgKi8KKyAgICBmb3IgKGkgPSBvbGRfY3J5cHRvX2luZm8tPmxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICBpZiAoZ19wdHJfYXJyYXlfaW5kZXggKG9sZF9jcnlwdG9faW5mbywgaSkgPT0gTlVMTCkKKyAgICAgICAgYnJlYWs7CisgICAgICBvbGRfZW50cmllcysrOworICAgIH0KKyAgfQorCisgIHNzX2luZm8tPmNyeXB0b19pbmZvID0KKyAgICAgIGdfcHRyX2FycmF5X25ld19mdWxsIChzYW1wbGVfY291bnQgKyBvbGRfZW50cmllcywKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgcXRkZW11eF9nc3Rfc3RydWN0dXJlX2ZyZWUpOworCisgIC8qIFdlIHByZXNlcnZlIG9sZCBlbnRyaWVzIGJlY2F1c2Ugd2UgcGFyc2UgdGhlIG5leHQgbW9vZiBpbiBhZHZhbmNlCisgICAqIG9mIGNvbnN1bWluZyBhbGwgc2FtcGxlcyBmcm9tIHRoZSBwcmV2aW91cyBtb29mLCBhbmQgb3RoZXJ3aXNlCisgICAqIHdlJ2QgZGlzY2FyZCB0aGUgY29ycmVzcG9uZGluZyBjcnlwdG8gaW5mbyBmb3IgdGhlIHNhbXBsZXMKKyAgICogZnJvbSB0aGUgcHJldmlvdXMgZnJhZ21lbnQuICovCisgIGlmIChvbGRfZW50cmllcykgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJQcmVzZXJ2aW5nICVkIG9sZCBjcnlwdG8gaW5mbyBlbnRyaWVzIiwKKyAgICAgICAgb2xkX2VudHJpZXMpOworICAgIGZvciAoaSA9IG9sZF9jcnlwdG9faW5mby0+bGVuIC0gb2xkX2VudHJpZXM7IGkgPCBvbGRfY3J5cHRvX2luZm8tPmxlbjsgaSsrKSB7CisgICAgICBnX3B0cl9hcnJheV9hZGQgKHNzX2luZm8tPmNyeXB0b19pbmZvLCBnX3B0cl9hcnJheV9pbmRleCAob2xkX2NyeXB0b19pbmZvLAorICAgICAgICAgICAgICBpKSk7CisgICAgICBnX3B0cl9hcnJheV9pbmRleCAob2xkX2NyeXB0b19pbmZvLCBpKSA9IE5VTEw7CisgICAgfQorICB9CisKKyAgaWYgKG9sZF9jcnlwdG9faW5mbykgeworICAgIC8qIEV2ZXJ5dGhpbmcgbm93IGJlbG9uZ3MgdG8gdGhlIG5ldyBhcnJheSAqLworICAgIGdfcHRyX2FycmF5X2ZyZWUgKG9sZF9jcnlwdG9faW5mbywgVFJVRSk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlX2NvdW50OyArK2kpIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnByb3BlcnRpZXM7CisgICAgZ3VpbnQxNiBuX3N1YnNhbXBsZXMgPSAwOworICAgIGd1aW50OCAqZGF0YTsKKyAgICBndWludCBpdl9zaXplOworICAgIEdzdEJ1ZmZlciAqYnVmOworCisgICAgcHJvcGVydGllcyA9IHF0ZGVtdXhfZ2V0X2NlbmNfc2FtcGxlX3Byb3BlcnRpZXMgKHF0ZGVtdXgsIHN0cmVhbSwgaSk7CisgICAgaWYgKHByb3BlcnRpZXMgPT0gTlVMTCkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgImZhaWxlZCB0byBnZXQgcHJvcGVydGllcyBmb3Igc2FtcGxlICV1IiwgaSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAocHJvcGVydGllcywgIml2X3NpemUiLCAmaXZfc2l6ZSkpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJmYWlsZWQgdG8gZ2V0IGl2X3NpemUgZm9yIHNhbXBsZSAldSIsIGkpOworICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChwcm9wZXJ0aWVzKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZHVwX2RhdGEgKGJyLCBpdl9zaXplLCAmZGF0YSkpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJmYWlsZWQgdG8gZ2V0IElWIGZvciBzYW1wbGUgJXUiLCBpKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocHJvcGVydGllcyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGRhdGEsIGl2X3NpemUpOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChwcm9wZXJ0aWVzLCAiaXYiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZiwgTlVMTCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICBzaXplID0gaW5mb19zaXplc1tpXTsKKyAgICBpZiAoc2l6ZSA+IGl2X3NpemUpIHsKKyAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmUgKGJyLCAmbl9zdWJzYW1wbGVzKQorICAgICAgICAgIHx8ICEobl9zdWJzYW1wbGVzID4gMCkpIHsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChwcm9wZXJ0aWVzKTsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICJmYWlsZWQgdG8gZ2V0IHN1YnNhbXBsZSBjb3VudCBmb3Igc2FtcGxlICV1IiwgaSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAic3Vic2FtcGxlIGNvdW50OiAldSIsIG5fc3Vic2FtcGxlcyk7CisgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9kdXBfZGF0YSAoYnIsIG5fc3Vic2FtcGxlcyAqIDYsICZkYXRhKSkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChxdGRlbXV4LCAiZmFpbGVkIHRvIGdldCBzdWJzYW1wbGUgZGF0YSBmb3Igc2FtcGxlICV1IiwKKyAgICAgICAgICAgIGkpOworICAgICAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHByb3BlcnRpZXMpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBidWYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChkYXRhLCBuX3N1YnNhbXBsZXMgKiA2KTsKKyAgICAgIGlmICghYnVmKSB7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocHJvcGVydGllcyk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChwcm9wZXJ0aWVzLAorICAgICAgICAgICJzdWJzYW1wbGVfY291bnQiLCBHX1RZUEVfVUlOVCwgbl9zdWJzYW1wbGVzLAorICAgICAgICAgICJzdWJzYW1wbGVzIiwgR1NUX1RZUEVfQlVGRkVSLCBidWYsIE5VTEwpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICB9IGVsc2UgeworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHByb3BlcnRpZXMsICJzdWJzYW1wbGVfY291bnQiLCBHX1RZUEVfVUlOVCwgMCwgTlVMTCk7CisgICAgfQorICAgIGdfcHRyX2FycmF5X2FkZCAoc3NfaW5mby0+Y3J5cHRvX2luZm8sIHByb3BlcnRpZXMpOworICB9CisgIHJldHVybiBUUlVFOworfQorCisvKiBDb252ZXJ0cyBhIFVVSUQgaW4gcmF3IGJ5dGUgZm9ybSB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbiwgYXMgZGVmaW5lZCBpbgorICogUkZDIDQxMjIuIFRoZSBjYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSByZXR1cm5lZCBzdHJpbmcgYW5kIGlzCisgKiByZXNwb25zaWJsZSBmb3IgZnJlZWluZyBpdCBhZnRlciB1c2UuICovCitzdGF0aWMgZ2NoYXIgKgorcXRkZW11eF91dWlkX2J5dGVzX3RvX3N0cmluZyAoZ2NvbnN0cG9pbnRlciB1dWlkX2J5dGVzKQoreworICBjb25zdCBndWludDggKnV1aWQgPSAoY29uc3QgZ3VpbnQ4ICopIHV1aWRfYnl0ZXM7CisKKyAgcmV0dXJuIGdfc3RyZHVwX3ByaW50ZiAoIiUwMnglMDJ4JTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtIgorICAgICAgIiUwMnglMDJ4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICB1dWlkWzBdLCB1dWlkWzFdLCB1dWlkWzJdLCB1dWlkWzNdLAorICAgICAgdXVpZFs0XSwgdXVpZFs1XSwgdXVpZFs2XSwgdXVpZFs3XSwKKyAgICAgIHV1aWRbOF0sIHV1aWRbOV0sIHV1aWRbMTBdLCB1dWlkWzExXSwKKyAgICAgIHV1aWRbMTJdLCB1dWlkWzEzXSwgdXVpZFsxNF0sIHV1aWRbMTVdKTsKK30KKworLyogUGFyc2VzIGEgUHJvdGVjdGlvbiBTeXN0ZW0gU3BlY2lmaWMgSGVhZGVyIGJveCAocHNzaCksIGFzIGRlZmluZWQgaW4gdGhlCisgKiBDb21tb24gRW5jcnlwdGlvbiAoY2VuYykgc3RhbmRhcmQgKElTTy9JRUMgMjMwMDEtNyksIHdoaWNoIGNvbnRhaW5zCisgKiBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgYSBzcGVjaWZpYyBjb250ZW50IHByb3RlY3Rpb24gc3lzdGVtIGluIG9yZGVyIHRvCisgKiBkZWNyeXB0IGNlbmMtcHJvdGVjdGVkIHRyYWNrcy4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWw7IEZBTFNFCisgKiBvdGhlcndpc2UuICovCitzdGF0aWMgZ2Jvb2xlYW4KK3F0ZGVtdXhfcGFyc2VfcHNzaCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdOb2RlICogbm9kZSkKK3sKKyAgZ2NoYXIgKnN5c2lkX3N0cmluZzsKKyAgZ3VpbnQzMiBwc3NoX3NpemUgPSBRVF9VSU5UMzIgKG5vZGUtPmRhdGEpOworICBHc3RCdWZmZXIgKnBzc2ggPSBOVUxMOworICBHc3RFdmVudCAqZXZlbnQgPSBOVUxMOworICBndWludDMyIHBhcmVudF9ib3hfdHlwZTsKKyAgZ2ludCBpOworCisgIGlmIChHX1VOTElLRUxZIChwc3NoX3NpemUgPCAzMlUpKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgImludmFsaWQgYm94IHNpemUiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBzeXNpZF9zdHJpbmcgPQorICAgICAgcXRkZW11eF91dWlkX2J5dGVzX3RvX3N0cmluZyAoKGNvbnN0IGd1aW50OCAqKSBub2RlLT5kYXRhICsgMTIpOworCisgIGdzdF9xdGRlbXV4X2FwcGVuZF9wcm90ZWN0aW9uX3N5c3RlbV9pZCAocXRkZW11eCwgc3lzaWRfc3RyaW5nKTsKKworICBwc3NoID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ19tZW1kdXAgKG5vZGUtPmRhdGEsIHBzc2hfc2l6ZSksIHBzc2hfc2l6ZSk7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiY2VuYyBwc3NoIHNpemU6ICUiIEdfR1NJWkVfRk9STUFULAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAocHNzaCkpOworCisgIHBhcmVudF9ib3hfdHlwZSA9IFFUX0ZPVVJDQyAoKGNvbnN0IGd1aW50OCAqKSBub2RlLT5wYXJlbnQtPmRhdGEgKyA0KTsKKworICAvKiBQdXNoIGFuIGV2ZW50IGNvbnRhaW5pbmcgdGhlIHBzc2ggYm94IG9udG8gdGhlIHF1ZXVlcyBvZiBhbGwgc3RyZWFtcy4gKi8KKyAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3Byb3RlY3Rpb24gKHN5c2lkX3N0cmluZywgcHNzaCwKKyAgICAgIChwYXJlbnRfYm94X3R5cGUgPT0gRk9VUkNDX21vb3YpID8gImlzb2JtZmYvbW9vdiIgOiAiaXNvYm1mZi9tb29mIik7CisgIGZvciAoaSA9IDA7IGkgPCBxdGRlbXV4LT5uX3N0cmVhbXM7ICsraSkgeworICAgIGdfcXVldWVfcHVzaF90YWlsICgmcXRkZW11eC0+c3RyZWFtc1tpXS0+cHJvdGVjdGlvbl9zY2hlbWVfZXZlbnRfcXVldWUsCisgICAgICAgIGdzdF9ldmVudF9yZWYgKGV2ZW50KSk7CisgIH0KKyAgZ19mcmVlIChzeXNpZF9zdHJpbmcpOworICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAocHNzaCk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3F0ZGVtdXhfcGFyc2VfbW9vZiAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIGNvbnN0IGd1aW50OCAqIGJ1ZmZlciwgZ3VpbnQgbGVuZ3RoLAorICAgIGd1aW50NjQgbW9vZl9vZmZzZXQsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0pCit7CisgIEdOb2RlICptb29mX25vZGUsICp0cmFmX25vZGUsICp0ZmhkX25vZGUsICp0cnVuX25vZGUsICp0ZmR0X25vZGUsICptZmhkX25vZGU7CisgIEdOb2RlICp1dWlkX25vZGU7CisgIEdzdEJ5dGVSZWFkZXIgbWZoZF9kYXRhLCB0cnVuX2RhdGEsIHRmaGRfZGF0YSwgdGZkdF9kYXRhOworICBHTm9kZSAqc2Fpel9ub2RlLCAqc2Fpb19ub2RlLCAqcHNzaF9ub2RlOworICBHc3RCeXRlUmVhZGVyIHNhaXpfZGF0YSwgc2Fpb19kYXRhOworICBndWludDMyIGRzX3NpemUgPSAwLCBkc19kdXJhdGlvbiA9IDAsIGRzX2ZsYWdzID0gMDsKKyAgZ2ludDY0IGJhc2Vfb2Zmc2V0LCBydW5uaW5nX29mZnNldDsKKyAgZ3VpbnQzMiBmcmFnX251bTsKKworICAvKiBOT1RFIEBzdHJlYW0gaWdub3JlZCAqLworCisgIG1vb2Zfbm9kZSA9IGdfbm9kZV9uZXcgKChndWludDggKikgYnVmZmVyKTsKKyAgcXRkZW11eF9wYXJzZV9ub2RlIChxdGRlbXV4LCBtb29mX25vZGUsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgcXRkZW11eF9ub2RlX2R1bXAgKHF0ZGVtdXgsIG1vb2Zfbm9kZSk7CisKKyAgLyogR2V0IGZyYWdtZW50IG51bWJlciBmcm9tIG1maGQgYW5kIGNoZWNrIGl0J3MgdmFsaWQgKi8KKyAgbWZoZF9ub2RlID0KKyAgICAgIHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZV9mdWxsIChtb29mX25vZGUsIEZPVVJDQ19tZmhkLCAmbWZoZF9kYXRhKTsKKyAgaWYgKG1maGRfbm9kZSA9PSBOVUxMKQorICAgIGdvdG8gbWlzc2luZ19tZmhkOworICBpZiAoIXF0ZGVtdXhfcGFyc2VfbWZoZCAocXRkZW11eCwgJm1maGRfZGF0YSwgJmZyYWdfbnVtKSkKKyAgICBnb3RvIGZhaWw7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJGcmFnbWVudCAjJWQiLCBmcmFnX251bSk7CisKKyAgLyogdW5rbm93biBiYXNlX29mZnNldCB0byBzdGFydCB3aXRoICovCisgIGJhc2Vfb2Zmc2V0ID0gcnVubmluZ19vZmZzZXQgPSAtMTsKKyAgdHJhZl9ub2RlID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChtb29mX25vZGUsIEZPVVJDQ190cmFmKTsKKyAgd2hpbGUgKHRyYWZfbm9kZSkgeworICAgIGd1aW50NjQgZGVjb2RlX3RpbWUgPSAwOworCisgICAgLyogRnJhZ21lbnQgSGVhZGVyIG5vZGUgKi8KKyAgICB0ZmhkX25vZGUgPQorICAgICAgICBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGVfZnVsbCAodHJhZl9ub2RlLCBGT1VSQ0NfdGZoZCwKKyAgICAgICAgJnRmaGRfZGF0YSk7CisgICAgaWYgKCF0ZmhkX25vZGUpCisgICAgICBnb3RvIG1pc3NpbmdfdGZoZDsKKyAgICBpZiAoIXF0ZGVtdXhfcGFyc2VfdGZoZCAocXRkZW11eCwgJnRmaGRfZGF0YSwgJnN0cmVhbSwgJmRzX2R1cmF0aW9uLAorICAgICAgICAgICAgJmRzX3NpemUsICZkc19mbGFncywgJmJhc2Vfb2Zmc2V0KSkKKyAgICAgIGdvdG8gbWlzc2luZ190ZmhkOworCisgICAgLyogVGhlIGZvbGxvd2luZyBjb2RlIGFzc3VtZXMgYXQgbW9zdCBhIHNpbmdsZSBzZXQgb2Ygc2FtcGxlIGF1eGlsaWFyeQorICAgICAqIGRhdGEgaW4gdGhlIGZyYWdtZW50IChjb25zaXN0aW5nIG9mIGEgc2FpeiBib3ggYW5kIGEgY29ycmVzcG9uZGluZyBzYWlvCisgICAgICogYm94KTsgaW4gdGhlb3J5LCBob3dldmVyLCB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBzZXRzIG9mIHNhbXBsZQorICAgICAqIGF1eGlsaWFyeSBkYXRhIGluIGEgZnJhZ21lbnQuICovCisgICAgc2Fpel9ub2RlID0KKyAgICAgICAgcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlX2Z1bGwgKHRyYWZfbm9kZSwgRk9VUkNDX3NhaXosCisgICAgICAgICZzYWl6X2RhdGEpOworICAgIGlmIChzYWl6X25vZGUpIHsKKyAgICAgIGd1aW50MzIgaW5mb190eXBlID0gMDsKKyAgICAgIGd1aW50NjQgb2Zmc2V0ID0gMDsKKyAgICAgIGd1aW50MzIgaW5mb190eXBlX3BhcmFtZXRlciA9IDA7CisKKyAgICAgIGdfZnJlZSAocXRkZW11eC0+Y2VuY19hdXhfaW5mb19zaXplcyk7CisKKyAgICAgIHF0ZGVtdXgtPmNlbmNfYXV4X2luZm9fc2l6ZXMgPQorICAgICAgICAgIHF0ZGVtdXhfcGFyc2Vfc2FpeiAocXRkZW11eCwgc3RyZWFtLCAmc2Fpel9kYXRhLAorICAgICAgICAgICZxdGRlbXV4LT5jZW5jX2F1eF9zYW1wbGVfY291bnQpOworICAgICAgaWYgKHF0ZGVtdXgtPmNlbmNfYXV4X2luZm9fc2l6ZXMgPT0gTlVMTCkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChxdGRlbXV4LCAiZmFpbGVkIHRvIHBhcnNlIHNhaXogYm94Iik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgIH0KKyAgICAgIHNhaW9fbm9kZSA9CisgICAgICAgICAgcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlX2Z1bGwgKHRyYWZfbm9kZSwgRk9VUkNDX3NhaW8sCisgICAgICAgICAgJnNhaW9fZGF0YSk7CisgICAgICBpZiAoIXNhaW9fbm9kZSkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChxdGRlbXV4LCAic2FpeiBib3ggd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcgc2FpbyBib3giKTsKKyAgICAgICAgZ19mcmVlIChxdGRlbXV4LT5jZW5jX2F1eF9pbmZvX3NpemVzKTsKKyAgICAgICAgcXRkZW11eC0+Y2VuY19hdXhfaW5mb19zaXplcyA9IE5VTEw7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgIH0KKworICAgICAgaWYgKEdfVU5MSUtFTFkgKCFxdGRlbXV4X3BhcnNlX3NhaW8gKHF0ZGVtdXgsIHN0cmVhbSwgJnNhaW9fZGF0YSwKKyAgICAgICAgICAgICAgICAgICZpbmZvX3R5cGUsICZpbmZvX3R5cGVfcGFyYW1ldGVyLCAmb2Zmc2V0KSkpIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgImZhaWxlZCB0byBwYXJzZSBzYWlvIGJveCIpOworICAgICAgICBnX2ZyZWUgKHF0ZGVtdXgtPmNlbmNfYXV4X2luZm9fc2l6ZXMpOworICAgICAgICBxdGRlbXV4LT5jZW5jX2F1eF9pbmZvX3NpemVzID0gTlVMTDsKKyAgICAgICAgZ290byBmYWlsOworICAgICAgfQorICAgICAgaWYgKGJhc2Vfb2Zmc2V0ID4gLTEgJiYgYmFzZV9vZmZzZXQgPiBxdGRlbXV4LT5tb29mX29mZnNldCkKKyAgICAgICAgb2Zmc2V0ICs9IChndWludDY0KSAoYmFzZV9vZmZzZXQgLSBxdGRlbXV4LT5tb29mX29mZnNldCk7CisgICAgICBpZiAoaW5mb190eXBlID09IEZPVVJDQ19jZW5jICYmIGluZm9fdHlwZV9wYXJhbWV0ZXIgPT0gMFUpIHsKKyAgICAgICAgR3N0Qnl0ZVJlYWRlciBicjsKKyAgICAgICAgaWYgKG9mZnNldCA+IGxlbmd0aCkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJjZW5jIGF1eGlsaWFyeSBpbmZvIHN0b3JlZCBvdXQgb2YgbW9vZiIpOworICAgICAgICAgIHF0ZGVtdXgtPmNlbmNfYXV4X2luZm9fb2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9pbml0ICgmYnIsIGJ1ZmZlciArIG9mZnNldCwgbGVuZ3RoIC0gb2Zmc2V0KTsKKyAgICAgICAgICBpZiAoIXF0ZGVtdXhfcGFyc2VfY2VuY19hdXhfaW5mbyAocXRkZW11eCwgc3RyZWFtLCAmYnIsCisgICAgICAgICAgICAgICAgICBxdGRlbXV4LT5jZW5jX2F1eF9pbmZvX3NpemVzLAorICAgICAgICAgICAgICAgICAgcXRkZW11eC0+Y2VuY19hdXhfc2FtcGxlX2NvdW50KSkgeworICAgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgImZhaWxlZCB0byBwYXJzZSBjZW5jIGF1eGlsaWFyeSBpbmZvIik7CisgICAgICAgICAgICBnX2ZyZWUgKHF0ZGVtdXgtPmNlbmNfYXV4X2luZm9fc2l6ZXMpOworICAgICAgICAgICAgcXRkZW11eC0+Y2VuY19hdXhfaW5mb19zaXplcyA9IE5VTEw7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdGZkdF9ub2RlID0KKyAgICAgICAgcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlX2Z1bGwgKHRyYWZfbm9kZSwgRk9VUkNDX3RmZHQsCisgICAgICAgICZ0ZmR0X2RhdGEpOworICAgIGlmICh0ZmR0X25vZGUpIHsKKyAgICAgIC8qIFdlJ2xsIHVzZSBkZWNvZGVfdGltZSB0byBpbnRlcnBvbGF0ZSB0aW1lc3RhbXBzCisgICAgICAgKiBpbiBjYXNlIHRoZSBpbnB1dCB0aW1lc3RhbXBzIGFyZSBtaXNzaW5nICovCisgICAgICBxdGRlbXV4X3BhcnNlX3RmZHQgKHF0ZGVtdXgsICZ0ZmR0X2RhdGEsICZkZWNvZGVfdGltZSk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJkZWNvZGUgdGltZSAlIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAiICglIiBHU1RfVElNRV9GT1JNQVQgIikiLCBkZWNvZGVfdGltZSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChzdHJlYW0gPyBRVFNUUkVBTVRJTUVfVE9fR1NUVElNRSAoc3RyZWFtLAorICAgICAgICAgICAgICAgICAgZGVjb2RlX3RpbWUpIDogR1NUX0NMT0NLX1RJTUVfTk9ORSkpOworCisgICAgICAvKiBEaXNjYXJkIHRoZSBmcmFnbWVudCBidWZmZXIgdGltZXN0YW1wIGluZm8gdG8gYXZvaWQgdXNpbmcgaXQuCisgICAgICAgKiBSZWx5IG9uIHRmZHQgaW5zdGVhZCBhcyBpdCBpcyBtb3JlIGFjY3VyYXRlIHRoYW4gdGhlIHRpbWVzdGFtcAorICAgICAgICogdGhhdCBpcyBmZXRjaGVkIGZyb20gYSBtYW5pZmVzdC9wbGF5bGlzdCBhbmQgaXMgdXN1YWxseQorICAgICAgICogbGVzcyBhY2N1cmF0ZS4gKi8KKyAgICAgIHF0ZGVtdXgtPmZyYWdtZW50X3N0YXJ0ID0gLTE7CisgICAgfQorCisgICAgaWYgKEdfVU5MSUtFTFkgKCFzdHJlYW0pKSB7CisgICAgICAvKiB3ZSBsb3N0IHRyYWNrIG9mIG9mZnNldCwgd2UnbGwgbmVlZCB0byByZWdhaW4gaXQsCisgICAgICAgKiBidXQgY2FuIGRlbGF5IGNvbXBsYWluaW5nIHVudGlsIGxhdGVyIG9yIGF2b2lkIGRvaW5nIHNvIGFsdG9nZXRoZXIgKi8KKyAgICAgIGJhc2Vfb2Zmc2V0ID0gLTI7CisgICAgICBnb3RvIG5leHQ7CisgICAgfQorICAgIGlmIChHX1VOTElLRUxZIChiYXNlX29mZnNldCA8IC0xKSkKKyAgICAgIGdvdG8gbG9zdF9vZmZzZXQ7CisKKyAgICBpZiAocXRkZW11eC0+dXBzdHJlYW1fZm9ybWF0X2lzX3RpbWUpCisgICAgICBnc3RfcXRkZW11eF9zdHJlYW1fZmx1c2hfc2FtcGxlc19kYXRhIChxdGRlbXV4LCBzdHJlYW0pOworCisgICAgLyogaW5pdGlhbGlzZSBtb29mIHNhbXBsZSBkYXRhICovCisgICAgc3RyZWFtLT5uX3NhbXBsZXNfbW9vZiA9IDA7CisgICAgc3RyZWFtLT5kdXJhdGlvbl9sYXN0X21vb2YgPSBzdHJlYW0tPmR1cmF0aW9uX21vb2Y7CisgICAgc3RyZWFtLT5kdXJhdGlvbl9tb29mID0gMDsKKworICAgIC8qIFRyYWNrIFJ1biBub2RlICovCisgICAgdHJ1bl9ub2RlID0KKyAgICAgICAgcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlX2Z1bGwgKHRyYWZfbm9kZSwgRk9VUkNDX3RydW4sCisgICAgICAgICZ0cnVuX2RhdGEpOworICAgIHdoaWxlICh0cnVuX25vZGUpIHsKKyAgICAgIHF0ZGVtdXhfcGFyc2VfdHJ1biAocXRkZW11eCwgJnRydW5fZGF0YSwgc3RyZWFtLAorICAgICAgICAgIGRzX2R1cmF0aW9uLCBkc19zaXplLCBkc19mbGFncywgbW9vZl9vZmZzZXQsIGxlbmd0aCwgJmJhc2Vfb2Zmc2V0LAorICAgICAgICAgICZydW5uaW5nX29mZnNldCwgZGVjb2RlX3RpbWUsICh0ZmR0X25vZGUgIT0gTlVMTCkpOworICAgICAgLyogaXRlcmF0ZSBhbGwgc2libGluZ3MgKi8KKyAgICAgIHRydW5fbm9kZSA9IHF0ZGVtdXhfdHJlZV9nZXRfc2libGluZ19ieV90eXBlX2Z1bGwgKHRydW5fbm9kZSwgRk9VUkNDX3RydW4sCisgICAgICAgICAgJnRydW5fZGF0YSk7CisgICAgfQorCisgICAgdXVpZF9ub2RlID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlICh0cmFmX25vZGUsIEZPVVJDQ191dWlkKTsKKyAgICBpZiAodXVpZF9ub2RlKSB7CisgICAgICBndWludDggKnV1aWRfYnVmZmVyID0gKGd1aW50OCAqKSB1dWlkX25vZGUtPmRhdGE7CisgICAgICBndWludDMyIGJveF9sZW5ndGggPSBRVF9VSU5UMzIgKHV1aWRfYnVmZmVyKTsKKworICAgICAgcXRkZW11eF9wYXJzZV91dWlkIChxdGRlbXV4LCB1dWlkX2J1ZmZlciwgYm94X2xlbmd0aCk7CisgICAgfQorCisgICAgLyogaWYgbm8gbmV3IGJhc2Vfb2Zmc2V0IHByb3ZpZGVkIGZvciBuZXh0IHRyYWYsCisgICAgICogYmFzZSBpcyBlbmQgb2YgY3VycmVudCB0cmFmICovCisgICAgYmFzZV9vZmZzZXQgPSBydW5uaW5nX29mZnNldDsKKyAgICBydW5uaW5nX29mZnNldCA9IC0xOworCisgICAgaWYgKHN0cmVhbS0+bl9zYW1wbGVzX21vb2YgJiYgc3RyZWFtLT5kdXJhdGlvbl9tb29mKQorICAgICAgc3RyZWFtLT5uZXdfY2FwcyA9IFRSVUU7CisKKyAgbmV4dDoKKyAgICAvKiBpdGVyYXRlIGFsbCBzaWJsaW5ncyAqLworICAgIHRyYWZfbm9kZSA9IHF0ZGVtdXhfdHJlZV9nZXRfc2libGluZ19ieV90eXBlICh0cmFmX25vZGUsIEZPVVJDQ190cmFmKTsKKyAgfQorCisgIC8qIHBhcnNlIGFueSBwcm90ZWN0aW9uIHN5c3RlbSBpbmZvICovCisgIHBzc2hfbm9kZSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAobW9vZl9ub2RlLCBGT1VSQ0NfcHNzaCk7CisgIHdoaWxlIChwc3NoX25vZGUpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIlBhcnNpbmcgcHNzaCBib3guIik7CisgICAgcXRkZW11eF9wYXJzZV9wc3NoIChxdGRlbXV4LCBwc3NoX25vZGUpOworICAgIHBzc2hfbm9kZSA9IHF0ZGVtdXhfdHJlZV9nZXRfc2libGluZ19ieV90eXBlIChwc3NoX25vZGUsIEZPVVJDQ19wc3NoKTsKKyAgfQorCisgIGdfbm9kZV9kZXN0cm95IChtb29mX25vZGUpOworICByZXR1cm4gVFJVRTsKKworbWlzc2luZ190ZmhkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIm1pc3NpbmcgdGZoZCBib3giKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KK21pc3NpbmdfbWZoZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJNaXNzaW5nIG1maGQgYm94Iik7CisgICAgZ290byBmYWlsOworICB9Citsb3N0X29mZnNldDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJsb3N0IG9mZnNldCIpOworICAgIGdvdG8gZmFpbDsKKyAgfQorZmFpbDoKKyAgeworICAgIGdfbm9kZV9kZXN0cm95IChtb29mX25vZGUpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdGRlbXV4LCBTVFJFQU0sIERFTVVYLAorICAgICAgICAoXygiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIikpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisjaWYgMAorLyogbWlnaHQgYmUgdXNlZCBpZiBzb21lIGRheSB3ZSBhY3R1YWxseSB1c2UgbWZyYSAmIGNvCisgKiBmb3IgcmFuZG9tIGFjY2VzcyB0byBmcmFnbWVudHMsCisgKiBidXQgdGhhdCB3aWxsIHJlcXVpcmUgcXVpdGUgc29tZSBtb2RpZmljYXRpb25zIGFuZCBtdWNoIGxlc3MgcmVseWluZworICogb24gYSBzYW1wbGUgYXJyYXkgKi8KKyNlbmRpZgorCitzdGF0aWMgZ2Jvb2xlYW4KK3F0ZGVtdXhfcGFyc2VfdGZyYSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdOb2RlICogdGZyYV9ub2RlKQoreworICBRdERlbXV4U3RyZWFtICpzdHJlYW07CisgIGd1aW50MzIgdmVyX2ZsYWdzLCB0cmFja19pZCwgbGVuLCBudW1fZW50cmllcywgaTsKKyAgZ3VpbnQgdmFsdWVfc2l6ZSwgdHJhZl9zaXplLCB0cnVuX3NpemUsIHNhbXBsZV9zaXplOworICBndWludDY0IHRpbWUgPSAwLCBtb29mX29mZnNldCA9IDA7CisjaWYgMAorICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworI2VuZGlmCisgIEdzdEJ5dGVSZWFkZXIgdGZyYTsKKworICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJnRmcmEsIHRmcmFfbm9kZS0+ZGF0YSwgUVRfVUlOVDMyICh0ZnJhX25vZGUtPmRhdGEpKTsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmdGZyYSwgOCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZ0ZnJhLCAmdmVyX2ZsYWdzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnRmcmEsICZ0cmFja19pZCkKKyAgICAgIHx8ICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnRmcmEsICZsZW4pCisgICAgICB8fCAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZ0ZnJhLCAmbnVtX2VudHJpZXMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicGFyc2luZyB0ZnJhIGJveCBmb3IgdHJhY2sgaWQgJXUiLCB0cmFja19pZCk7CisKKyAgc3RyZWFtID0gcXRkZW11eF9maW5kX3N0cmVhbSAocXRkZW11eCwgdHJhY2tfaWQpOworICBpZiAoc3RyZWFtID09IE5VTEwpCisgICAgZ290byB1bmtub3duX3RyYWNraWQ7CisKKyAgdmFsdWVfc2l6ZSA9ICgodmVyX2ZsYWdzID4+IDI0KSA9PSAxKSA/IHNpemVvZiAoZ3VpbnQ2NCkgOiBzaXplb2YgKGd1aW50MzIpOworICBzYW1wbGVfc2l6ZSA9IChsZW4gJiAzKSArIDE7CisgIHRydW5fc2l6ZSA9ICgobGVuICYgMTIpID4+IDIpICsgMTsKKyAgdHJhZl9zaXplID0gKChsZW4gJiA0OCkgPj4gNCkgKyAxOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICIldSBlbnRyaWVzLCBzaXplczogdmFsdWUgJXUsIHRyYWYgJXUsIHRydW4gJXUsICIKKyAgICAgICJzYW1wbGUgJXUiLCBudW1fZW50cmllcywgdmFsdWVfc2l6ZSwgdHJhZl9zaXplLCB0cnVuX3NpemUsIHNhbXBsZV9zaXplKTsKKworICBpZiAobnVtX2VudHJpZXMgPT0gMCkKKyAgICBnb3RvIG5vX3NhbXBsZXM7CisKKyAgaWYgKCFxdF9hdG9tX3BhcnNlcl9oYXNfY2h1bmtzICgmdGZyYSwgbnVtX2VudHJpZXMsCisgICAgICAgICAgdmFsdWVfc2l6ZSArIHZhbHVlX3NpemUgKyB0cmFmX3NpemUgKyB0cnVuX3NpemUgKyBzYW1wbGVfc2l6ZSkpCisgICAgZ290byBjb3JydXB0X2ZpbGU7CisKKyAgZ19mcmVlIChzdHJlYW0tPnJhX2VudHJpZXMpOworICBzdHJlYW0tPnJhX2VudHJpZXMgPSBnX25ldyAoUXREZW11eFJhbmRvbUFjY2Vzc0VudHJ5LCBudW1fZW50cmllcyk7CisgIHN0cmVhbS0+bl9yYV9lbnRyaWVzID0gbnVtX2VudHJpZXM7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyBpKyspIHsKKyAgICBxdF9hdG9tX3BhcnNlcl9nZXRfb2Zmc2V0ICgmdGZyYSwgdmFsdWVfc2l6ZSwgJnRpbWUpOworICAgIHF0X2F0b21fcGFyc2VyX2dldF9vZmZzZXQgKCZ0ZnJhLCB2YWx1ZV9zaXplLCAmbW9vZl9vZmZzZXQpOworICAgIHF0X2F0b21fcGFyc2VyX2dldF91aW50X3dpdGhfc2l6ZV91bmNoZWNrZWQgKCZ0ZnJhLCB0cmFmX3NpemUpOworICAgIHF0X2F0b21fcGFyc2VyX2dldF91aW50X3dpdGhfc2l6ZV91bmNoZWNrZWQgKCZ0ZnJhLCB0cnVuX3NpemUpOworICAgIHF0X2F0b21fcGFyc2VyX2dldF91aW50X3dpdGhfc2l6ZV91bmNoZWNrZWQgKCZ0ZnJhLCBzYW1wbGVfc2l6ZSk7CisKKyAgICB0aW1lID0gUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUgKHN0cmVhbSwgdGltZSk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImZyYWdtZW50IHRpbWU6ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCAiCisgICAgICAgICIgbW9vZl9vZmZzZXQ6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHRpbWUpLCBtb29mX29mZnNldCk7CisKKyAgICBzdHJlYW0tPnJhX2VudHJpZXNbaV0udHMgPSB0aW1lOworICAgIHN0cmVhbS0+cmFfZW50cmllc1tpXS5tb29mX29mZnNldCA9IG1vb2Zfb2Zmc2V0OworCisgICAgLyogZG9uJ3Qgd2FudCB0byBnbyB0aHJvdWdoIHRoZSBlbnRpcmUgZmlsZSBhbmQgcmVhZCBhbGwgbW9vZnMgYXQgc3RhcnR1cCAqLworI2lmIDAKKyAgICByZXQgPSBnc3RfcXRkZW11eF9wdWxsX2F0b20gKHF0ZGVtdXgsIG1vb2Zfb2Zmc2V0LCAwLCAmYnVmKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBjb3JydXB0X2ZpbGU7CisgICAgcXRkZW11eF9wYXJzZV9tb29mIChxdGRlbXV4LCBHU1RfQlVGRkVSX0RBVEEgKGJ1ZiksIEdTVF9CVUZGRVJfU0laRSAoYnVmKSwKKyAgICAgICAgbW9vZl9vZmZzZXQsIHN0cmVhbSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyNlbmRpZgorICB9CisKKyAgY2hlY2tfdXBkYXRlX2R1cmF0aW9uIChxdGRlbXV4LCB0aW1lKTsKKworICByZXR1cm4gVFJVRTsKKworLyogRVJST1JTICovCit1bmtub3duX3RyYWNraWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJDb3VsZG4ndCBmaW5kIHN0cmVhbSBmb3IgdHJhY2sgJXUiLCB0cmFja19pZCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citjb3JydXB0X2ZpbGU6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJicm9rZW4gdHJhZiBib3gsIGlnbm9yaW5nIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19zYW1wbGVzOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAic3RyZWFtIGhhcyBubyBzYW1wbGVzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcXRkZW11eF9wdWxsX21mcm9fbWZyYSAoR3N0UVREZW11eCAqIHF0ZGVtdXgpCit7CisgIEdzdE1hcEluZm8gbWZyb19tYXAgPSBHU1RfTUFQX0lORk9fSU5JVDsKKyAgR3N0TWFwSW5mbyBtZnJhX21hcCA9IEdTVF9NQVBfSU5GT19JTklUOworICBHc3RCdWZmZXIgKm1mcm8gPSBOVUxMLCAqbWZyYSA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gZmxvdzsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisgIEdOb2RlICptZnJhX25vZGUsICp0ZnJhX25vZGU7CisgIGd1aW50NjQgbWZyYV9vZmZzZXQgPSAwOworICBndWludDMyIGZvdXJjYywgbWZyYV9zaXplOworICBnaW50NjQgbGVuOworCisgIC8qIHF1ZXJ5IHVwc3RyZWFtIHNpemUgaW4gYnl0ZXMgKi8KKyAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKHF0ZGVtdXgtPnNpbmtwYWQsIEdTVF9GT1JNQVRfQllURVMsICZsZW4pKQorICAgIGdvdG8gc2l6ZV9xdWVyeV9mYWlsZWQ7CisKKyAgLyogbWZybyBib3ggc2hvdWxkIGJlIGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgZmlsZSAqLworICBmbG93ID0gZ3N0X3F0ZGVtdXhfcHVsbF9hdG9tIChxdGRlbXV4LCBsZW4gLSAxNiwgMTYsICZtZnJvKTsKKyAgaWYgKGZsb3cgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBleGl0OworCisgIGdzdF9idWZmZXJfbWFwIChtZnJvLCAmbWZyb19tYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgZm91cmNjID0gUVRfRk9VUkNDIChtZnJvX21hcC5kYXRhICsgNCk7CisgIGlmIChmb3VyY2MgIT0gRk9VUkNDX21mcm8pCisgICAgZ290byBleGl0OworCisgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwgIkZvdW5kIG1mcm8gYm94Iik7CisgIGlmIChtZnJvX21hcC5zaXplIDwgMTYpCisgICAgZ290byBpbnZhbGlkX21mcm9fc2l6ZTsKKworICBtZnJhX3NpemUgPSBRVF9VSU5UMzIgKG1mcm9fbWFwLmRhdGEgKyAxMik7CisgIGlmIChtZnJhX3NpemUgPj0gbGVuKQorICAgIGdvdG8gaW52YWxpZF9tZnJhX3NpemU7CisKKyAgbWZyYV9vZmZzZXQgPSBsZW4gLSBtZnJhX3NpemU7CisKKyAgR1NUX0lORk9fT0JKRUNUIChxdGRlbXV4LCAibWZyYSBvZmZzZXQ6ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgc2l6ZSAldSIsCisgICAgICBtZnJhX29mZnNldCwgbWZyYV9zaXplKTsKKworICAvKiBub3cgZ2V0IGFuZCBwYXJzZSBtZnJhIGJveCAqLworICBmbG93ID0gZ3N0X3F0ZGVtdXhfcHVsbF9hdG9tIChxdGRlbXV4LCBtZnJhX29mZnNldCwgbWZyYV9zaXplLCAmbWZyYSk7CisgIGlmIChmbG93ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gYnJva2VuX2ZpbGU7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG1mcmEsICZtZnJhX21hcCwgR1NUX01BUF9SRUFEKTsKKworICBtZnJhX25vZGUgPSBnX25vZGVfbmV3ICgoZ3VpbnQ4ICopIG1mcmFfbWFwLmRhdGEpOworICBxdGRlbXV4X3BhcnNlX25vZGUgKHF0ZGVtdXgsIG1mcmFfbm9kZSwgbWZyYV9tYXAuZGF0YSwgbWZyYV9tYXAuc2l6ZSk7CisKKyAgdGZyYV9ub2RlID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChtZnJhX25vZGUsIEZPVVJDQ190ZnJhKTsKKworICB3aGlsZSAodGZyYV9ub2RlKSB7CisgICAgcXRkZW11eF9wYXJzZV90ZnJhIChxdGRlbXV4LCB0ZnJhX25vZGUpOworICAgIC8qIGl0ZXJhdGUgYWxsIHNpYmxpbmdzICovCisgICAgdGZyYV9ub2RlID0gcXRkZW11eF90cmVlX2dldF9zaWJsaW5nX2J5X3R5cGUgKHRmcmFfbm9kZSwgRk9VUkNDX3RmcmEpOworICB9CisgIGdfbm9kZV9kZXN0cm95IChtZnJhX25vZGUpOworCisgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwgInBhcnNlZCBtb3ZpZSBmcmFnbWVudCByYW5kb20gYWNjZXNzIGJveCAobWZyYSkiKTsKKyAgcmV0ID0gVFJVRTsKKworZXhpdDoKKworICBpZiAobWZybykgeworICAgIGlmIChtZnJvX21hcC5tZW1vcnkgIT0gTlVMTCkKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG1mcm8sICZtZnJvX21hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAobWZybyk7CisgIH0KKyAgaWYgKG1mcmEpIHsKKyAgICBpZiAobWZyYV9tYXAubWVtb3J5ICE9IE5VTEwpCisgICAgICBnc3RfYnVmZmVyX3VubWFwIChtZnJhLCAmbWZyYV9tYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKG1mcmEpOworICB9CisgIHJldHVybiByZXQ7CisKKy8qIEVSUk9SUyAqLworc2l6ZV9xdWVyeV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJjb3VsZCBub3QgcXVlcnkgdXBzdHJlYW0gc2l6ZSIpOworICAgIGdvdG8gZXhpdDsKKyAgfQoraW52YWxpZF9tZnJvX3NpemU6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJtZnJvIHNpemUgaXMgdG9vIHNtYWxsIik7CisgICAgZ290byBleGl0OworICB9CitpbnZhbGlkX21mcmFfc2l6ZToKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIm1mcmFfc2l6ZSBpbiBtZnJvIGJveCBpcyBpbnZhbGlkIik7CisgICAgZ290byBleGl0OworICB9Citicm9rZW5fZmlsZToKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgImJvZ3VzIG1mcmEgb2Zmc2V0IG9yIHNpemUsIGJyb2tlbiBmaWxlIik7CisgICAgZ290byBleGl0OworICB9Cit9CisKK3N0YXRpYyBndWludDY0CithZGRfb2Zmc2V0IChndWludDY0IG9mZnNldCwgZ3VpbnQ2NCBhZHZhbmNlKQoreworICAvKiBBdm9pZCA2NC1iaXQgb3ZlcmZsb3cgYnkgY2xhbXBpbmcgKi8KKyAgaWYgKG9mZnNldCA+IEdfTUFYVUlOVDY0IC0gYWR2YW5jZSkKKyAgICByZXR1cm4gR19NQVhVSU5UNjQ7CisgIHJldHVybiBvZmZzZXQgKyBhZHZhbmNlOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9oZWFkZXIgKEdzdFFURGVtdXggKiBxdGRlbXV4KQoreworICBndWludDY0IGxlbmd0aCA9IDA7CisgIGd1aW50MzIgZm91cmNjID0gMDsKKyAgR3N0QnVmZmVyICpidWYgPSBOVUxMOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludDY0IGN1cl9vZmZzZXQgPSBxdGRlbXV4LT5vZmZzZXQ7CisgIEdzdE1hcEluZm8gbWFwOworCisgIHJldCA9IGdzdF9wYWRfcHVsbF9yYW5nZSAocXRkZW11eC0+c2lua3BhZCwgY3VyX29mZnNldCwgMTYsICZidWYpOworICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkKKyAgICBnb3RvIGJlYWNoOworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBpZiAoR19MSUtFTFkgKG1hcC5zaXplID49IDgpKQorICAgIGV4dHJhY3RfaW5pdGlhbF9sZW5ndGhfYW5kX2ZvdXJjYyAobWFwLmRhdGEsIG1hcC5zaXplLCAmbGVuZ3RoLCAmZm91cmNjKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAvKiBtYXliZSB3ZSBhbHJlYWR5IGdvdCBtb3N0IHdlIG5lZWRlZCwgc28gb25seSBjb25zaWRlciB0aGlzIGVvZiAqLworICBpZiAoR19VTkxJS0VMWSAobGVuZ3RoID09IDApKSB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocXRkZW11eCwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgKF8oIkludmFsaWQgYXRvbSBzaXplLiIpKSwKKyAgICAgICAgKCJIZWFkZXIgYXRvbSAnJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIicgaGFzIGVtcHR5IGxlbmd0aCIsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYykpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FT1M7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIHN3aXRjaCAoZm91cmNjKSB7CisgICAgY2FzZSBGT1VSQ0NfbW9vZjoKKyAgICAgIC8qIHJlY29yZCBmb3IgbGF0ZXIgcGFyc2luZyB3aGVuIG5lZWRlZCAqLworICAgICAgaWYgKCFxdGRlbXV4LT5tb29mX29mZnNldCkgeworICAgICAgICBxdGRlbXV4LT5tb29mX29mZnNldCA9IHF0ZGVtdXgtPm9mZnNldDsKKyAgICAgIH0KKyAgICAgIGlmIChxdGRlbXV4X3B1bGxfbWZyb19tZnJhIChxdGRlbXV4KSkgeworICAgICAgICAvKiBGSVhNRSAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcXRkZW11eC0+b2Zmc2V0ICs9IGxlbmd0aDsgICAgICAvKiBza2lwIG1vb2YgYW5kIGtlZXAgZ29pbmcgKi8KKyAgICAgIH0KKyAgICAgIGlmIChxdGRlbXV4LT5nb3RfbW9vdikgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsICJtb29mIGhlYWRlciwgZ290IG1vb3YsIGRvbmUgd2l0aCBoZWFkZXJzIik7CisgICAgICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgICAgICAgZ290byBiZWFjaDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX21kYXQ6CisgICAgY2FzZSBGT1VSQ0NfZnJlZToKKyAgICBjYXNlIEZPVVJDQ19za2lwOgorICAgIGNhc2UgRk9VUkNDX3dpZGU6CisgICAgY2FzZSBGT1VSQ0NfUElDVDoKKyAgICBjYXNlIEZPVVJDQ19wbm90OgorICAgIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICJza2lwcGluZyBhdG9tICclIiBHU1RfRk9VUkNDX0ZPUk1BVCAiJyBhdCAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgY3VyX29mZnNldCk7CisgICAgICBxdGRlbXV4LT5vZmZzZXQgPSBhZGRfb2Zmc2V0IChxdGRlbXV4LT5vZmZzZXQsIGxlbmd0aCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGT1VSQ0NfbW9vdjoKKyAgICB7CisgICAgICBHc3RCdWZmZXIgKm1vb3YgPSBOVUxMOworCisgICAgICBpZiAocXRkZW11eC0+Z290X21vb3YpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIlNraXBwaW5nIG1vb3YgYXRvbSBhcyB3ZSBoYXZlIG9uZSBhbHJlYWR5Iik7CisgICAgICAgIHF0ZGVtdXgtPm9mZnNldCA9IGFkZF9vZmZzZXQgKHF0ZGVtdXgtPm9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgZ290byBiZWFjaDsKKyAgICAgIH0KKworICAgICAgcmV0ID0gZ3N0X3BhZF9wdWxsX3JhbmdlIChxdGRlbXV4LT5zaW5rcGFkLCBjdXJfb2Zmc2V0LCBsZW5ndGgsICZtb292KTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICBnc3RfYnVmZmVyX21hcCAobW9vdiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICAgICAgaWYgKGxlbmd0aCAhPSBtYXAuc2l6ZSkgeworICAgICAgICAvKiBTb21lIGZpbGVzIGhhdmUgYSAnbW9vdicgYXRvbSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHdoaWNoIGNvbnRhaW5zCisgICAgICAgICAqIGEgdGVybWluYWwgJ2ZyZWUnIGF0b20gd2hlcmUgdGhlIGJvZHkgb2YgdGhlIGF0b20gaXMgbWlzc2luZy4KKyAgICAgICAgICogQ2hlY2sgZm9yLCBhbmQgcGVybWl0LCB0aGlzIHNwZWNpYWwgY2FzZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChtYXAuc2l6ZSA+PSA4KSB7CisgICAgICAgICAgZ3VpbnQ4ICpmaW5hbF9kYXRhID0gbWFwLmRhdGEgKyAobWFwLnNpemUgLSA4KTsKKyAgICAgICAgICBndWludDMyIGZpbmFsX2xlbmd0aCA9IFFUX1VJTlQzMiAoZmluYWxfZGF0YSk7CisgICAgICAgICAgZ3VpbnQzMiBmaW5hbF9mb3VyY2MgPSBRVF9GT1VSQ0MgKGZpbmFsX2RhdGEgKyA0KTsKKworICAgICAgICAgIGlmIChmaW5hbF9mb3VyY2MgPT0gRk9VUkNDX2ZyZWUKKyAgICAgICAgICAgICAgJiYgbWFwLnNpemUgKyBmaW5hbF9sZW5ndGggLSA4ID09IGxlbmd0aCkgeworICAgICAgICAgICAgLyogT2ssIHdlJ3ZlIGZvdW5kIHRoYXQgc3BlY2lhbCBjYXNlLiBBbGxvY2F0ZSBhIG5ldyBidWZmZXIgd2l0aAorICAgICAgICAgICAgICogdGhhdCBmcmVlIGF0b20gYWN0dWFsbHkgcHJlc2VudC4gKi8KKyAgICAgICAgICAgIEdzdEJ1ZmZlciAqbmV3bW9vdiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobGVuZ3RoKTsKKyAgICAgICAgICAgIGdzdF9idWZmZXJfZmlsbCAobmV3bW9vdiwgMCwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICAgICAgICAgIGdzdF9idWZmZXJfbWVtc2V0IChuZXdtb292LCBtYXAuc2l6ZSwgMCwgZmluYWxfbGVuZ3RoIC0gOCk7CisgICAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChtb292LCAmbWFwKTsKKyAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG1vb3YpOworICAgICAgICAgICAgbW9vdiA9IG5ld21vb3Y7CisgICAgICAgICAgICBnc3RfYnVmZmVyX21hcCAobW9vdiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGxlbmd0aCAhPSBtYXAuc2l6ZSkgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRkZW11eCwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgICAgIChfKCJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iKSksCisgICAgICAgICAgICAoIldlIGdvdCBsZXNzIHRoYW4gZXhwZWN0ZWQgKHJlY2VpdmVkICUiIEdfR1NJWkVfRk9STUFUCisgICAgICAgICAgICAgICAgIiwgd2FudGVkICV1LCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCAiKSIsIG1hcC5zaXplLAorICAgICAgICAgICAgICAgIChndWludCkgbGVuZ3RoLCBjdXJfb2Zmc2V0KSk7CisgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG1vb3YsICZtYXApOworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChtb292KTsKKyAgICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICB9CisgICAgICBxdGRlbXV4LT5vZmZzZXQgKz0gbGVuZ3RoOworCisgICAgICBxdGRlbXV4X3BhcnNlX21vb3YgKHF0ZGVtdXgsIG1hcC5kYXRhLCBsZW5ndGgpOworICAgICAgcXRkZW11eF9ub2RlX2R1bXAgKHF0ZGVtdXgsIHF0ZGVtdXgtPm1vb3Zfbm9kZSk7CisKKyAgICAgIHF0ZGVtdXhfcGFyc2VfdHJlZSAocXRkZW11eCk7CisgICAgICBpZiAocXRkZW11eC0+bW9vdl9ub2RlX2NvbXByZXNzZWQpIHsKKyAgICAgICAgZ19ub2RlX2Rlc3Ryb3kgKHF0ZGVtdXgtPm1vb3Zfbm9kZV9jb21wcmVzc2VkKTsKKyAgICAgICAgZ19mcmVlIChxdGRlbXV4LT5tb292X25vZGUtPmRhdGEpOworICAgICAgfQorICAgICAgcXRkZW11eC0+bW9vdl9ub2RlX2NvbXByZXNzZWQgPSBOVUxMOworICAgICAgZ19ub2RlX2Rlc3Ryb3kgKHF0ZGVtdXgtPm1vb3Zfbm9kZSk7CisgICAgICBxdGRlbXV4LT5tb292X25vZGUgPSBOVUxMOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAobW9vdiwgJm1hcCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChtb292KTsKKyAgICAgIHF0ZGVtdXgtPmdvdF9tb292ID0gVFJVRTsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRk9VUkNDX2Z0eXA6CisgICAgeworICAgICAgR3N0QnVmZmVyICpmdHlwID0gTlVMTDsKKworICAgICAgLyogZXh0cmFjdCBtYWpvciBicmFuZDsgbWlnaHQgY29tZSBpbiBoYW5keSBmb3IgSVNPIHZzIFFUIGlzc3VlcyAqLworICAgICAgcmV0ID0gZ3N0X3F0ZGVtdXhfcHVsbF9hdG9tIChxdGRlbXV4LCBjdXJfb2Zmc2V0LCBsZW5ndGgsICZmdHlwKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICBxdGRlbXV4LT5vZmZzZXQgKz0gbGVuZ3RoOworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGZ0eXAsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICBxdGRlbXV4X3BhcnNlX2Z0eXAgKHF0ZGVtdXgsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChmdHlwLCAmbWFwKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGZ0eXApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRk9VUkNDX3V1aWQ6CisgICAgeworICAgICAgR3N0QnVmZmVyICp1dWlkID0gTlVMTDsKKworICAgICAgLyogdXVpZCBhcmUgZXh0ZW5zaW9uIGF0b21zICovCisgICAgICByZXQgPSBnc3RfcXRkZW11eF9wdWxsX2F0b20gKHF0ZGVtdXgsIGN1cl9vZmZzZXQsIGxlbmd0aCwgJnV1aWQpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBiZWFjaDsKKyAgICAgIHF0ZGVtdXgtPm9mZnNldCArPSBsZW5ndGg7CisgICAgICBnc3RfYnVmZmVyX21hcCAodXVpZCwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIHF0ZGVtdXhfcGFyc2VfdXVpZCAocXRkZW11eCwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHV1aWQsICZtYXApOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAodXVpZCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGT1VSQ0Nfc2lkeDoKKyAgICB7CisgICAgICBHc3RCdWZmZXIgKnNpZHggPSBOVUxMOworICAgICAgcmV0ID0gZ3N0X3F0ZGVtdXhfcHVsbF9hdG9tIChxdGRlbXV4LCBjdXJfb2Zmc2V0LCBsZW5ndGgsICZzaWR4KTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICBxdGRlbXV4LT5vZmZzZXQgKz0gbGVuZ3RoOworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKHNpZHgsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICBxdGRlbXV4X3BhcnNlX3NpZHggKHF0ZGVtdXgsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChzaWR4LCAmbWFwKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHNpZHgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgeworICAgICAgR3N0QnVmZmVyICp1bmtub3duID0gTlVMTDsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgInVua25vd24gJTA4eCAnJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIicgb2Ygc2l6ZSAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgIiBhdCAlIiBHX0dVSU5UNjRfRk9STUFULCBmb3VyY2MsIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgbGVuZ3RoLAorICAgICAgICAgIGN1cl9vZmZzZXQpOworICAgICAgcmV0ID0gZ3N0X3F0ZGVtdXhfcHVsbF9hdG9tIChxdGRlbXV4LCBjdXJfb2Zmc2V0LCBsZW5ndGgsICZ1bmtub3duKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICBnc3RfYnVmZmVyX21hcCAodW5rbm93biwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIEdTVF9NRU1EVU1QICgiVW5rbm93biB0YWciLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAodW5rbm93biwgJm1hcCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmICh1bmtub3duKTsKKyAgICAgIHF0ZGVtdXgtPm9mZnNldCArPSBsZW5ndGg7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworYmVhY2g6CisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRU9TICYmIChxdGRlbXV4LT5nb3RfbW9vdiB8fCBxdGRlbXV4LT5tZWRpYV9jYXBzKSkgeworICAgIC8qIGRpZ2VzdGVkIGFsbCBkYXRhLCBzaG93IHdoYXQgd2UgaGF2ZSAqLworICAgIHF0ZGVtdXhfcHJlcGFyZV9zdHJlYW1zIChxdGRlbXV4KTsKKyAgICByZXQgPSBxdGRlbXV4X2V4cG9zZV9zdHJlYW1zIChxdGRlbXV4KTsKKworICAgIHF0ZGVtdXgtPnN0YXRlID0gUVRERU1VWF9TVEFURV9NT1ZJRTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic3dpdGNoaW5nIHN0YXRlIHRvIFNUQVRFX01PVklFICglZCkiLAorICAgICAgICBxdGRlbXV4LT5zdGF0ZSk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXR1cm4gcmV0OworfQorCisvKiBTZWVrcyB0byB0aGUgcHJldmlvdXMga2V5ZnJhbWUgb2YgdGhlIGluZGV4ZWQgc3RyZWFtIGFuZAorICogYWxpZ25zIG90aGVyIHN0cmVhbXMgd2l0aCByZXNwZWN0IHRvIHRoZSBrZXlmcmFtZSB0aW1lc3RhbXAKKyAqIG9mIGluZGV4ZWQgc3RyZWFtLiBPbmx5IGNhbGxlZCBpbiBjYXNlIG9mIFJldmVyc2UgUGxheWJhY2sKKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdGRlbXV4X3NlZWtfdG9fcHJldmlvdXNfa2V5ZnJhbWUgKEdzdFFURGVtdXggKiBxdGRlbXV4KQoreworICBndWludDggbiA9IDA7CisgIGd1aW50MzIgc2VnX2lkeCA9IDAsIGtfaW5kZXggPSAwOworICBndWludDMyIHJlZl9zZWdfaWR4LCByZWZfa19pbmRleDsKKyAgR3N0Q2xvY2tUaW1lIGtfcG9zID0gMCwgbGFzdF9zdG9wID0gMDsKKyAgUXREZW11eFNlZ21lbnQgKnNlZyA9IE5VTEw7CisgIFF0RGVtdXhTdHJlYW0gKnJlZl9zdHIgPSBOVUxMOworICBndWludDY0IHNlZ19tZWRpYV9zdGFydF9tb3Y7ICAvKiBzZWdtZW50IG1lZGlhIHN0YXJ0IHRpbWUgaW4gbW92IGZvcm1hdCAqLworICBndWludDY0IHRhcmdldF90czsKKworICAvKiBOb3cgd2UgY2hvb3NlIGFuIGFyYml0cmFyeSBzdHJlYW0sIGdldCB0aGUgcHJldmlvdXMga2V5ZnJhbWUgdGltZXN0YW1wCisgICAqIGFuZCBmaW5hbGx5IGFsaWduIGFsbCB0aGUgb3RoZXIgc3RyZWFtcyBvbiB0aGF0IHRpbWVzdGFtcCB3aXRoIHRoZWlyCisgICAqIHJlc3BlY3RpdmUga2V5ZnJhbWVzICovCisgIGZvciAobiA9IDA7IG4gPCBxdGRlbXV4LT5uX3N0cmVhbXM7IG4rKykgeworICAgIFF0RGVtdXhTdHJlYW0gKnN0ciA9IHF0ZGVtdXgtPnN0cmVhbXNbbl07CisKKyAgICAvKiBObyBjYW5kaWRhdGUgeWV0LCB0YWtlIHRoZSBmaXJzdCBzdHJlYW0gKi8KKyAgICBpZiAoIXJlZl9zdHIpIHsKKyAgICAgIHJlZl9zdHIgPSBzdHI7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiBTbyB0aGF0IHN0cmVhbSBoYXMgYSBzZWdtZW50LCB3ZSBwcmVmZXIgdmlkZW8gc3RyZWFtcyAqLworICAgIGlmIChzdHItPnN1YnR5cGUgPT0gRk9VUkNDX3ZpZGUpIHsKKyAgICAgIHJlZl9zdHIgPSBzdHI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoIXJlZl9zdHIpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImNvdWxkbid0IGZpbmQgYW55IHN0cmVhbSIpOworICAgIGdvdG8gZW9zOworICB9CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFyZWZfc3RyLT5mcm9tX3NhbXBsZSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicmVhY2hlZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIik7CisgICAgZ290byBlb3M7CisgIH0KKworICAvKiBTbyB0aGF0IHN0cmVhbSBoYXMgYmVlbiBwbGF5aW5nIGZyb20gZnJvbV9zYW1wbGUgdG8gdG9fc2FtcGxlLiBXZSB3aWxsCisgICAqIGdldCB0aGUgdGltZXN0YW1wIG9mIHRoZSBwcmV2aW91cyBzYW1wbGUgYW5kIHNlYXJjaCBmb3IgYSBrZXlmcmFtZSBiZWZvcmUKKyAgICogdGhhdC4gRm9yIGF1ZGlvIHN0cmVhbXMgd2UgZG8gYW4gYXJiaXRyYXJ5IGp1bXAgaW4gdGhlIHBhc3QgKDEwIHNhbXBsZXMpICovCisgIGlmIChyZWZfc3RyLT5zdWJ0eXBlID09IEZPVVJDQ192aWRlKSB7CisgICAga19pbmRleCA9IGdzdF9xdGRlbXV4X2ZpbmRfa2V5ZnJhbWUgKHF0ZGVtdXgsIHJlZl9zdHIsCisgICAgICAgIHJlZl9zdHItPmZyb21fc2FtcGxlIC0gMSwgRkFMU0UpOworICB9IGVsc2UgeworICAgIGlmIChyZWZfc3RyLT5mcm9tX3NhbXBsZSA+PSAxMCkKKyAgICAgIGtfaW5kZXggPSByZWZfc3RyLT5mcm9tX3NhbXBsZSAtIDEwOworICAgIGVsc2UKKyAgICAgIGtfaW5kZXggPSAwOworICB9CisKKyAgdGFyZ2V0X3RzID0KKyAgICAgIHJlZl9zdHItPnNhbXBsZXNba19pbmRleF0udGltZXN0YW1wICsKKyAgICAgIHJlZl9zdHItPnNhbXBsZXNba19pbmRleF0ucHRzX29mZnNldDsKKworICAvKiBnZXQgY3VycmVudCBzZWdtZW50IGZvciB0aGF0IHN0cmVhbSAqLworICBzZWcgPSAmcmVmX3N0ci0+c2VnbWVudHNbcmVmX3N0ci0+c2VnbWVudF9pbmRleF07CisgIC8qIFVzZSBzZWdtZW50IHN0YXJ0IGluIG9yaWdpbmFsIHRpbWVzY2FsZSBmb3IgY29tcGFyaXNvbnMgKi8KKyAgc2VnX21lZGlhX3N0YXJ0X21vdiA9IHNlZy0+dHJha19tZWRpYV9zdGFydDsKKworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImtleWZyYW1lIGluZGV4ICV1IHRzICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICIgc2VnIHN0YXJ0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiAlIiBHU1RfVElNRV9GT1JNQVQgIlxuIiwKKyAgICAgIGtfaW5kZXgsIHRhcmdldF90cywgc2VnX21lZGlhX3N0YXJ0X21vdiwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHNlZy0+bWVkaWFfc3RhcnQpKTsKKworICAvKiBDcmF3bCBiYWNrIHRocm91Z2ggc2VnbWVudHMgdG8gZmluZCB0aGUgb25lIGNvbnRhaW5pbmcgdGhpcyBJIGZyYW1lICovCisgIHdoaWxlICh0YXJnZXRfdHMgPCBzZWdfbWVkaWFfc3RhcnRfbW92KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgImtleWZyYW1lIHBvc2l0aW9uIChzYW1wbGUgJXUpIGlzIG91dCBvZiBzZWdtZW50ICV1ICIgIiB0YXJnZXQgJSIKKyAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiIHNlZyBzdGFydCAlIiBHX0dVSU5UNjRfRk9STUFULCBrX2luZGV4LAorICAgICAgICByZWZfc3RyLT5zZWdtZW50X2luZGV4LCB0YXJnZXRfdHMsIHNlZ19tZWRpYV9zdGFydF9tb3YpOworCisgICAgaWYgKEdfVU5MSUtFTFkgKCFyZWZfc3RyLT5zZWdtZW50X2luZGV4KSkgeworICAgICAgLyogUmVhY2hlZCBmaXJzdCBzZWdtZW50LCBsZXQncyBjb25zaWRlciBpdCdzIEVPUyAqLworICAgICAgZ290byBlb3M7CisgICAgfQorICAgIHJlZl9zdHItPnNlZ21lbnRfaW5kZXgtLTsKKyAgICBzZWcgPSAmcmVmX3N0ci0+c2VnbWVudHNbcmVmX3N0ci0+c2VnbWVudF9pbmRleF07CisgICAgLyogVXNlIHNlZ21lbnQgc3RhcnQgaW4gb3JpZ2luYWwgdGltZXNjYWxlIGZvciBjb21wYXJpc29ucyAqLworICAgIHNlZ19tZWRpYV9zdGFydF9tb3YgPSBzZWctPnRyYWtfbWVkaWFfc3RhcnQ7CisgIH0KKyAgLyogQ2FsY3VsYXRlIHRpbWUgcG9zaXRpb24gb2YgdGhlIGtleWZyYW1lIGFuZCB3aGVyZSB3ZSBzaG91bGQgc3RvcCAqLworICBrX3BvcyA9CisgICAgICBRVFNUUkVBTVRJTUVfVE9fR1NUVElNRSAocmVmX3N0ciwKKyAgICAgIHRhcmdldF90cyAtIHNlZy0+dHJha19tZWRpYV9zdGFydCkgKyBzZWctPnRpbWU7CisgIGxhc3Rfc3RvcCA9CisgICAgICBRVFNUUkVBTVRJTUVfVE9fR1NUVElNRSAocmVmX3N0ciwKKyAgICAgIHJlZl9zdHItPnNhbXBsZXNbcmVmX3N0ci0+ZnJvbV9zYW1wbGVdLnRpbWVzdGFtcCAtCisgICAgICBzZWctPnRyYWtfbWVkaWFfc3RhcnQpICsgc2VnLT50aW1lOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJwcmVmZXJyZWQgc3RyZWFtIHBsYXllZCBmcm9tIHNhbXBsZSAldSwgIgorICAgICAgIm5vdyBnb2luZyB0byBzYW1wbGUgJXUgKHB0cyAlIiBHU1RfVElNRV9GT1JNQVQgIikiLCByZWZfc3RyLT5mcm9tX3NhbXBsZSwKKyAgICAgIGtfaW5kZXgsIEdTVF9USU1FX0FSR1MgKGtfcG9zKSk7CisKKyAgLyogU2V0IGxhc3Rfc3RvcCB3aXRoIHRoZSBrZXlmcmFtZSB0aW1lc3RhbXAgd2UgcHVzaGVkIG9mIHRoYXQgc3RyZWFtICovCisgIHF0ZGVtdXgtPnNlZ21lbnQucG9zaXRpb24gPSBsYXN0X3N0b3A7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJsYXN0X3N0b3Agbm93IGlzICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKGxhc3Rfc3RvcCkpOworCisgIGlmIChHX1VOTElLRUxZIChsYXN0X3N0b3AgPCBxdGRlbXV4LT5zZWdtZW50LnN0YXJ0KSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJyZWFjaGVkIHRoZSBiZWdpbm5pbmcgb2Ygc2VnbWVudCIpOworICAgIGdvdG8gZW9zOworICB9CisKKyAgcmVmX3NlZ19pZHggPSByZWZfc3RyLT5zZWdtZW50X2luZGV4OworICByZWZfa19pbmRleCA9IGtfaW5kZXg7CisKKyAgLyogQWxpZ24gdGhlbSBhbGwgb24gdGhpcyAqLworICBmb3IgKG4gPSAwOyBuIDwgcXRkZW11eC0+bl9zdHJlYW1zOyBuKyspIHsKKyAgICBndWludDMyIGluZGV4ID0gMDsKKyAgICBHc3RDbG9ja1RpbWUgc2VnX3RpbWUgPSAwOworICAgIFF0RGVtdXhTdHJlYW0gKnN0ciA9IHF0ZGVtdXgtPnN0cmVhbXNbbl07CisKKyAgICAvKiBhbGlnbmluZyByZWZlcmVuY2Ugc3RyZWFtIGFnYWluIG1pZ2h0IGxlYWQgdG8gYmFja2luZyB1cCB0byB5ZXQgYW5vdGhlcgorICAgICAqIGtleWZyYW1lIChkdWUgdG8gdGltZXN0YW1wIHJvdW5kaW5nIGlzc3VlcyksCisgICAgICogcG90ZW50aWFsbHkgcHV0dGluZyBtb3JlIGxvYWQgb24gZG93bnN0cmVhbTsgc28gbGV0J3MgdHJ5IHRvIGF2b2lkICovCisgICAgaWYgKHN0ciA9PSByZWZfc3RyKSB7CisgICAgICBzZWdfaWR4ID0gcmVmX3NlZ19pZHg7CisgICAgICBzZWcgPSAmc3RyLT5zZWdtZW50c1tzZWdfaWR4XTsKKyAgICAgIGtfaW5kZXggPSByZWZfa19pbmRleDsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJyZWZlcmVuY2Ugc3RyZWFtICVkIHNlZ21lbnQgJWQsICIKKyAgICAgICAgICAic2FtcGxlIGF0IGluZGV4ICVkIiwgbiwgcmVmX3N0ci0+c2VnbWVudF9pbmRleCwga19pbmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNlZ19pZHggPSBnc3RfcXRkZW11eF9maW5kX3NlZ21lbnQgKHF0ZGVtdXgsIHN0ciwga19wb3MpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAic3RyZWFtICVkIGFsaWduIHNlZ21lbnQgJWQgZm9yIGtleWZyYW1lIHBvcyAlIiBHU1RfVElNRV9GT1JNQVQsIG4sCisgICAgICAgICAgc2VnX2lkeCwgR1NUX1RJTUVfQVJHUyAoa19wb3MpKTsKKworICAgICAgLyogZ2V0IHNlZ21lbnQgYW5kIHRpbWUgaW4gdGhlIHNlZ21lbnQgKi8KKyAgICAgIHNlZyA9ICZzdHItPnNlZ21lbnRzW3NlZ19pZHhdOworICAgICAgc2VnX3RpbWUgPSBrX3BvcyAtIHNlZy0+dGltZTsKKworICAgICAgLyogZ2V0IHRoZSBtZWRpYSB0aW1lIGluIHRoZSBzZWdtZW50LgorICAgICAgICogTm8gYWRqdXN0bWVudCBmb3IgZW1wdHkgImZpbGxlciIgc2VnbWVudHMgKi8KKyAgICAgIGlmIChzZWctPm1lZGlhX3N0YXJ0ICE9IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgICAgIHNlZ190aW1lICs9IHNlZy0+bWVkaWFfc3RhcnQ7CisKKyAgICAgIC8qIGdldCB0aGUgaW5kZXggb2YgdGhlIHNhbXBsZSB3aXRoIG1lZGlhIHRpbWUgKi8KKyAgICAgIGluZGV4ID0gZ3N0X3F0ZGVtdXhfZmluZF9pbmRleF9saW5lYXIgKHF0ZGVtdXgsIHN0ciwgc2VnX3RpbWUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAic3RyZWFtICVkIHNhbXBsZSBmb3IgJSIgR1NUX1RJTUVfRk9STUFUICIgYXQgJXUiLCBuLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHNlZ190aW1lKSwgaW5kZXgpOworCisgICAgICAvKiBmaW5kIHByZXZpb3VzIGtleWZyYW1lICovCisgICAgICBrX2luZGV4ID0gZ3N0X3F0ZGVtdXhfZmluZF9rZXlmcmFtZSAocXRkZW11eCwgc3RyLCBpbmRleCwgRkFMU0UpOworICAgIH0KKworICAgIC8qIFJlbWVtYmVyIHVudGlsIHdoZXJlIHdlIHdhbnQgdG8gZ28gKi8KKyAgICBzdHItPnRvX3NhbXBsZSA9IHN0ci0+ZnJvbV9zYW1wbGUgLSAxOworICAgIC8qIERlZmluZSBvdXIgdGltZSBwb3NpdGlvbiAqLworICAgIHRhcmdldF90cyA9CisgICAgICAgIHN0ci0+c2FtcGxlc1trX2luZGV4XS50aW1lc3RhbXAgKyBzdHItPnNhbXBsZXNba19pbmRleF0ucHRzX29mZnNldDsKKyAgICBzdHItPnRpbWVfcG9zaXRpb24gPSBRVFNUUkVBTVRJTUVfVE9fR1NUVElNRSAoc3RyLCB0YXJnZXRfdHMpICsgc2VnLT50aW1lOworICAgIGlmIChzZWctPm1lZGlhX3N0YXJ0ICE9IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgICBzdHItPnRpbWVfcG9zaXRpb24gLT0gc2VnLT5tZWRpYV9zdGFydDsKKworICAgIC8qIE5vdyBzZWVrIGJhY2sgaW4gdGltZSAqLworICAgIGdzdF9xdGRlbXV4X21vdmVfc3RyZWFtIChxdGRlbXV4LCBzdHIsIGtfaW5kZXgpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzdHJlYW0gJWQga2V5ZnJhbWUgYXQgJXUsIHRpbWUgcG9zaXRpb24gJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFUICIgcGxheWluZyBmcm9tIHNhbXBsZSAldSB0byAldSIsIG4sIGtfaW5kZXgsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHN0ci0+dGltZV9wb3NpdGlvbiksIHN0ci0+ZnJvbV9zYW1wbGUsIHN0ci0+dG9fc2FtcGxlKTsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworZW9zOgorICByZXR1cm4gR1NUX0ZMT1dfRU9TOworfQorCisvKgorICogR2V0cyB0aGUgY3VycmVudCBxdCBzZWdtZW50IHN0YXJ0LCBzdG9wIGFuZCBwb3NpdGlvbiBmb3IgdGhlCisgKiBnaXZlbiB0aW1lIG9mZnNldC4gVGhpcyBpcyB1c2VkIGluIHVwZGF0ZV9zZWdtZW50KCkKKyAqLworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X3N0cmVhbV9zZWdtZW50X2dldF9ib3VuZGFyaWVzIChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtLCBHc3RDbG9ja1RpbWUgb2Zmc2V0LAorICAgIEdzdENsb2NrVGltZSAqIF9zdGFydCwgR3N0Q2xvY2tUaW1lICogX3N0b3AsIEdzdENsb2NrVGltZSAqIF90aW1lKQoreworICBHc3RDbG9ja1RpbWUgc2VnX3RpbWU7CisgIEdzdENsb2NrVGltZSBzdGFydCwgc3RvcCwgdGltZTsKKyAgUXREZW11eFNlZ21lbnQgKnNlZ21lbnQ7CisKKyAgc2VnbWVudCA9ICZzdHJlYW0tPnNlZ21lbnRzW3N0cmVhbS0+c2VnbWVudF9pbmRleF07CisKKyAgLyogZ2V0IHRpbWUgaW4gdGhpcyBzZWdtZW50ICovCisgIHNlZ190aW1lID0gKG9mZnNldCAtIHNlZ21lbnQtPnRpbWUpICogc2VnbWVudC0+cmF0ZTsKKworICBHU1RfTE9HX09CSkVDVCAoc3RyZWFtLT5wYWQsICJzZWdfdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChzZWdfdGltZSkpOworCisgIGlmIChHX1VOTElLRUxZIChzZWdfdGltZSA+IHNlZ21lbnQtPmR1cmF0aW9uKSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChzdHJlYW0tPnBhZCwKKyAgICAgICAgInNlZ190aW1lID4gc2VnbWVudC0+ZHVyYXRpb24gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChzZWdtZW50LT5kdXJhdGlvbikpOworICAgIHNlZ190aW1lID0gc2VnbWVudC0+ZHVyYXRpb247CisgIH0KKworICAvKiBxdGRlbXV4LT5zZWdtZW50LnN0b3AgaXMgaW4gb3V0c2lkZS10aW1lLXJlYWxtLCB3aGVyZWFzCisgICAqIHNlZ21lbnQtPm1lZGlhX3N0b3AgaXMgaW4gdHJhY2stdGltZS1yZWFsbS4KKyAgICoKKyAgICogSW4gb3JkZXIgdG8gY29tcGFyZSB0aGUgdHdvLCB3ZSBuZWVkIHRvIGJyaW5nIHNlZ21lbnQuc3RvcAorICAgKiBpbnRvIHRoZSB0cmFjay10aW1lLXJlYWxtCisgICAqCisgICAqIEZJWE1FIC0gZG9lcyB0aGlzIGNvbW1lbnQgc3RpbGwgaG9sZD8gRG9uJ3Qgc2VlIGFueSBjb252ZXJzaW9uIGhlcmUgKi8KKworICBzdG9wID0gcXRkZW11eC0+c2VnbWVudC5zdG9wOworICBpZiAoc3RvcCA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgIHN0b3AgPSBxdGRlbXV4LT5zZWdtZW50LmR1cmF0aW9uOworICBpZiAoc3RvcCA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgIHN0b3AgPSBzZWdtZW50LT5tZWRpYV9zdG9wOworICBlbHNlCisgICAgc3RvcCA9CisgICAgICAgIE1JTiAoc2VnbWVudC0+bWVkaWFfc3RvcCwgc3RvcCAtIHNlZ21lbnQtPnRpbWUgKyBzZWdtZW50LT5tZWRpYV9zdGFydCk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKFFUU0VHTUVOVF9JU19FTVBUWSAoc2VnbWVudCkpKSB7CisgICAgc3RhcnQgPSBzZWdtZW50LT50aW1lICsgc2VnX3RpbWU7CisgICAgdGltZSA9IG9mZnNldDsKKyAgICBzdG9wID0gc3RhcnQgLSBzZWdfdGltZSArIHNlZ21lbnQtPmR1cmF0aW9uOworICB9IGVsc2UgaWYgKHF0ZGVtdXgtPnNlZ21lbnQucmF0ZSA+PSAwKSB7CisgICAgc3RhcnQgPSBNSU4gKHNlZ21lbnQtPm1lZGlhX3N0YXJ0ICsgc2VnX3RpbWUsIHN0b3ApOworICAgIHRpbWUgPSBvZmZzZXQ7CisgIH0gZWxzZSB7CisgICAgaWYgKHNlZ21lbnQtPm1lZGlhX3N0YXJ0ID49IHF0ZGVtdXgtPnNlZ21lbnQuc3RhcnQpIHsKKyAgICAgIHRpbWUgPSBzZWdtZW50LT50aW1lOworICAgIH0gZWxzZSB7CisgICAgICB0aW1lID0gc2VnbWVudC0+dGltZSArIChxdGRlbXV4LT5zZWdtZW50LnN0YXJ0IC0gc2VnbWVudC0+bWVkaWFfc3RhcnQpOworICAgIH0KKworICAgIHN0YXJ0ID0gTUFYIChzZWdtZW50LT5tZWRpYV9zdGFydCwgcXRkZW11eC0+c2VnbWVudC5zdGFydCk7CisgICAgc3RvcCA9IE1JTiAoc2VnbWVudC0+bWVkaWFfc3RhcnQgKyBzZWdfdGltZSwgc3RvcCk7CisgIH0KKworICAqX3N0YXJ0ID0gc3RhcnQ7CisgICpfc3RvcCA9IHN0b3A7CisgICpfdGltZSA9IHRpbWU7Cit9CisKKy8qCisgKiBVcGRhdGVzIHRoZSBxdCBzZWdtZW50IHVzZWQgZm9yIHRoZSBzdHJlYW0gYW5kIHB1c2hlcyBhIG5ldyBzZWdtZW50IGV2ZW50CisgKiBkb3duc3RyZWFtIG9uIHRoaXMgc3RyZWFtJ3MgcGFkLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdGRlbXV4X3N0cmVhbV91cGRhdGVfc2VnbWVudCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sCisgICAgZ2ludCBzZWdfaWR4LCBHc3RDbG9ja1RpbWUgb2Zmc2V0LCBHc3RDbG9ja1RpbWUgKiBfc3RhcnQsCisgICAgR3N0Q2xvY2tUaW1lICogX3N0b3ApCit7CisgIFF0RGVtdXhTZWdtZW50ICpzZWdtZW50OworICBHc3RDbG9ja1RpbWUgc3RhcnQgPSAwLCBzdG9wID0gR1NUX0NMT0NLX1RJTUVfTk9ORSwgdGltZSA9IDA7CisgIGdkb3VibGUgcmF0ZTsKKyAgR3N0RXZlbnQgKmV2ZW50OworCisgIC8qIHVwZGF0ZSB0aGUgY3VycmVudCBzZWdtZW50ICovCisgIHN0cmVhbS0+c2VnbWVudF9pbmRleCA9IHNlZ19pZHg7CisKKyAgLyogZ2V0IHRoZSBzZWdtZW50ICovCisgIHNlZ21lbnQgPSAmc3RyZWFtLT5zZWdtZW50c1tzZWdfaWR4XTsKKworICBpZiAoR19VTkxJS0VMWSAob2Zmc2V0IDwgc2VnbWVudC0+dGltZSkpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHN0cmVhbS0+cGFkLCAib2Zmc2V0IDwgc2VnbWVudC0+dGltZSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHNlZ21lbnQtPnRpbWUpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBzZWdtZW50IGxpZXMgYmV5b25kIHRvdGFsIGluZGljYXRlZCBkdXJhdGlvbiAqLworICBpZiAoR19VTkxJS0VMWSAocXRkZW11eC0+c2VnbWVudC5kdXJhdGlvbiAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmCisgICAgICAgICAgc2VnbWVudC0+dGltZSA+IHF0ZGVtdXgtPnNlZ21lbnQuZHVyYXRpb24pKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzdHJlYW0tPnBhZCwgImZpbGUgZHVyYXRpb24gJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICIgPCBzZWdtZW50LT50aW1lICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAocXRkZW11eC0+c2VnbWVudC5kdXJhdGlvbiksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHNlZ21lbnQtPnRpbWUpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBnc3RfcXRkZW11eF9zdHJlYW1fc2VnbWVudF9nZXRfYm91bmRhcmllcyAocXRkZW11eCwgc3RyZWFtLCBvZmZzZXQsCisgICAgICAmc3RhcnQsICZzdG9wLCAmdGltZSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3RyZWFtLT5wYWQsICJuZXcgc2VnbWVudCAlZCBmcm9tICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiB0byAlIiBHU1RfVElNRV9GT1JNQVQgIiwgdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsIHNlZ19pZHgsCisgICAgICBHU1RfVElNRV9BUkdTIChzdGFydCksIEdTVF9USU1FX0FSR1MgKHN0b3ApLCBHU1RfVElNRV9BUkdTICh0aW1lKSk7CisKKyAgLyogY29tYmluZSBnbG9iYWwgcmF0ZSB3aXRoIHRoYXQgb2YgdGhlIHNlZ21lbnQgKi8KKyAgcmF0ZSA9IHNlZ21lbnQtPnJhdGUgKiBxdGRlbXV4LT5zZWdtZW50LnJhdGU7CisKKyAgLyogQ29weSBmbGFncyBmcm9tIG1haW4gc2VnbWVudCAqLworICBzdHJlYW0tPnNlZ21lbnQuZmxhZ3MgPSBxdGRlbXV4LT5zZWdtZW50LmZsYWdzOworCisgIC8qIHVwZGF0ZSB0aGUgc2VnbWVudCB2YWx1ZXMgdXNlZCBmb3IgY2xpcHBpbmcgKi8KKyAgc3RyZWFtLT5zZWdtZW50Lm9mZnNldCA9IHF0ZGVtdXgtPnNlZ21lbnQub2Zmc2V0OworICBzdHJlYW0tPnNlZ21lbnQuYmFzZSA9IHF0ZGVtdXgtPnNlZ21lbnQuYmFzZSArIHN0cmVhbS0+YWNjdW11bGF0ZWRfYmFzZTsKKyAgc3RyZWFtLT5zZWdtZW50LmFwcGxpZWRfcmF0ZSA9IHF0ZGVtdXgtPnNlZ21lbnQuYXBwbGllZF9yYXRlOworICBzdHJlYW0tPnNlZ21lbnQucmF0ZSA9IHJhdGU7CisgIHN0cmVhbS0+c2VnbWVudC5zdGFydCA9IHN0YXJ0ICsgUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUgKHN0cmVhbSwKKyAgICAgIHN0cmVhbS0+Y3NsZ19zaGlmdCk7CisgIHN0cmVhbS0+c2VnbWVudC5zdG9wID0gc3RvcCArIFFUU1RSRUFNVElNRV9UT19HU1RUSU1FIChzdHJlYW0sCisgICAgICBzdHJlYW0tPmNzbGdfc2hpZnQpOworICBzdHJlYW0tPnNlZ21lbnQudGltZSA9IHRpbWU7CisgIHN0cmVhbS0+c2VnbWVudC5wb3NpdGlvbiA9IHN0cmVhbS0+c2VnbWVudC5zdGFydDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzdHJlYW0tPnBhZCwgIk5ldyBzZWdtZW50OiAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsCisgICAgICAmc3RyZWFtLT5zZWdtZW50KTsKKworICAvKiBub3cgcHJlcGFyZSBhbmQgc2VuZCB0aGUgc2VnbWVudCAqLworICBpZiAoc3RyZWFtLT5wYWQpIHsKKyAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnN0cmVhbS0+c2VnbWVudCk7CisgICAgaWYgKHF0ZGVtdXgtPnNlZ21lbnRfc2VxbnVtICE9IEdTVF9TRVFOVU1fSU5WQUxJRCkgeworICAgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGV2ZW50LCBxdGRlbXV4LT5zZWdtZW50X3NlcW51bSk7CisgICAgfQorICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5wYWQsIGV2ZW50KTsKKyAgICAvKiBhc3N1bWUgd2UgY2FuIHNlbmQgbW9yZSBkYXRhIG5vdyAqLworICAgIEdTVF9QQURfTEFTVF9GTE9XX1JFVFVSTiAoc3RyZWFtLT5wYWQpID0gR1NUX0ZMT1dfT0s7CisgICAgLyogY2xlYXIgdG8gc2VuZCB0YWdzIG9uIHRoaXMgcGFkIG5vdyAqLworICAgIGdzdF9xdGRlbXV4X3B1c2hfdGFncyAocXRkZW11eCwgc3RyZWFtKTsKKyAgfQorCisgIGlmIChfc3RhcnQpCisgICAgKl9zdGFydCA9IHN0YXJ0OworICBpZiAoX3N0b3ApCisgICAgKl9zdG9wID0gc3RvcDsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogYWN0aXZhdGUgdGhlIGdpdmVuIHNlZ21lbnQgbnVtYmVyIEBzZWdfaWR4IG9mIEBzdHJlYW0gYXQgdGltZSBAb2Zmc2V0LgorICogQG9mZnNldCBpcyBhbiBhYnNvbHV0ZSBnbG9iYWwgcG9zaXRpb24gb3ZlciBhbGwgdGhlIHNlZ21lbnRzLgorICoKKyAqIFRoaXMgd2lsbCBwdXNoIG91dCBhIE5FV1NFR01FTlQgZXZlbnQgd2l0aCB0aGUgcmlnaHQgdmFsdWVzIGFuZAorICogcG9zaXRpb24gdGhlIHN0cmVhbSBpbmRleCB0byB0aGUgZmlyc3QgZGVjb2RhYmxlIHNhbXBsZSBiZWZvcmUKKyAqIEBvZmZzZXQuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3F0ZGVtdXhfYWN0aXZhdGVfc2VnbWVudCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sCisgICAgZ3VpbnQzMiBzZWdfaWR4LCBHc3RDbG9ja1RpbWUgb2Zmc2V0KQoreworICBRdERlbXV4U2VnbWVudCAqc2VnbWVudDsKKyAgZ3VpbnQzMiBpbmRleCwga2ZfaW5kZXg7CisgIEdzdENsb2NrVGltZSBzdGFydCA9IDAsIHN0b3AgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIEdTVF9MT0dfT0JKRUNUIChzdHJlYW0tPnBhZCwgImFjdGl2YXRlIHNlZ21lbnQgJWQsIG9mZnNldCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBzZWdfaWR4LCBHU1RfVElNRV9BUkdTIChvZmZzZXQpKTsKKworICBpZiAoIWdzdF9xdGRlbXV4X3N0cmVhbV91cGRhdGVfc2VnbWVudCAocXRkZW11eCwgc3RyZWFtLCBzZWdfaWR4LCBvZmZzZXQsCisgICAgICAgICAgJnN0YXJ0LCAmc3RvcCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHNlZ21lbnQgPSAmc3RyZWFtLT5zZWdtZW50c1tzdHJlYW0tPnNlZ21lbnRfaW5kZXhdOworCisgIC8qIGluIHRoZSBmcmFnbWVudGVkIGNhc2UsIHdlIHBpY2sgYSBmcmFnbWVudCB0aGF0IHN0YXJ0cyBiZWZvcmUgb3VyCisgICAqIGRlc2lyZWQgcG9zaXRpb24gYW5kIHJlbHkgb24gZG93bnN0cmVhbSB0byB3YWl0IGZvciBhIGtleWZyYW1lCisgICAqIChGSVhNRTogZG9lc24ndCBzZWVtIHRvIHdvcmsgc28gd2VsbCB3aXRoIGlzbXYgYW5kIHdtdiwgYXMgbm8gcGFyc2VyOyB0aGUKKyAgICogdGZyYSBlbnRyaWVzIHRlbGxzIHVzIHdoaWNoIHRydW4vc2FtcGxlIHRoZSBrZXkgdW5pdCBpcyBpbiwgYnV0IHdlIGRvbid0CisgICAqIG1ha2UgdXNlIG9mIHRoaXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhdCB0aGUgbW9tZW50KSAqLworICBpZiAocXRkZW11eC0+ZnJhZ21lbnRlZCAmJiAhcXRkZW11eC0+ZnJhZ21lbnRlZF9zZWVrX3BlbmRpbmcpIHsKKyAgICBzdHJlYW0tPnRvX3NhbXBsZSA9IEdfTUFYVUlOVDMyOworICAgIHJldHVybiBUUlVFOworICB9IGVsc2UgeworICAgIC8qIHdlbGwsIGl0IHdpbGwgYmUgdGFrZW4gY2FyZSBvZiBiZWxvdyAqLworICAgIHF0ZGVtdXgtPmZyYWdtZW50ZWRfc2Vla19wZW5kaW5nID0gRkFMU0U7CisgICAgLyogRklYTUUgaWRlYWxseSB0aGUgZG9fZnJhZ21lbnRlZF9zZWVrIGNhbiBiZSBkb25lIHJpZ2h0IGhlcmUsCisgICAgICogcmF0aGVyIHRoYW4gYXQgbG9vcCBsZXZlbAorICAgICAqICh3aGljaCBtaWdodCBldmVuIGFsbG93IGhhbmRsaW5nIGVkaXQgbGlzdHMgaW4gYSBmcmFnbWVudGVkIGZpbGUpICovCisgIH0KKworICAvKiBXZSBkb24ndCBuZWVkIHRvIGxvb2sgZm9yIGEgc2FtcGxlIGluIHB1c2gtYmFzZWQgKi8KKyAgaWYgKCFxdGRlbXV4LT5wdWxsYmFzZWQpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgLyogYW5kIG1vdmUgdG8gdGhlIGtleWZyYW1lIGJlZm9yZSB0aGUgaW5kaWNhdGVkIG1lZGlhIHRpbWUgb2YgdGhlCisgICAqIHNlZ21lbnQgKi8KKyAgaWYgKEdfTElLRUxZICghUVRTRUdNRU5UX0lTX0VNUFRZIChzZWdtZW50KSkpIHsKKyAgICBpZiAocXRkZW11eC0+c2VnbWVudC5yYXRlID49IDApIHsKKyAgICAgIGluZGV4ID0gZ3N0X3F0ZGVtdXhfZmluZF9pbmRleF9saW5lYXIgKHF0ZGVtdXgsIHN0cmVhbSwgc3RhcnQpOworICAgICAgc3RyZWFtLT50b19zYW1wbGUgPSBHX01BWFVJTlQzMjsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHN0cmVhbS0+cGFkLAorICAgICAgICAgICJtb3ZpbmcgZGF0YSBwb2ludGVyIHRvICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBpbmRleDogJXUsIHB0cyAlIgorICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAoc3RhcnQpLCBpbmRleCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChRVFNBTVBMRV9QVFMgKHN0cmVhbSwgJnN0cmVhbS0+c2FtcGxlc1tpbmRleF0pKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGV4ID0gZ3N0X3F0ZGVtdXhfZmluZF9pbmRleF9saW5lYXIgKHF0ZGVtdXgsIHN0cmVhbSwgc3RvcCk7CisgICAgICBzdHJlYW0tPnRvX3NhbXBsZSA9IGluZGV4OworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3RyZWFtLT5wYWQsCisgICAgICAgICAgIm1vdmluZyBkYXRhIHBvaW50ZXIgdG8gJSIgR1NUX1RJTUVfRk9STUFUICIsIGluZGV4OiAldSwgcHRzICUiCisgICAgICAgICAgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChzdG9wKSwgaW5kZXgsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoUVRTQU1QTEVfUFRTIChzdHJlYW0sICZzdHJlYW0tPnNhbXBsZXNbaW5kZXhdKSkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzdHJlYW0tPnBhZCwgIk5vIG5lZWQgdG8gbG9vayBmb3Iga2V5ZnJhbWUsICIKKyAgICAgICAgInRoaXMgaXMgYW4gZW1wdHkgc2VnbWVudCIpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgLyogZ3N0X3F0ZGVtdXhfcGFyc2Vfc2FtcGxlICgpIGNhbGxlZCBmcm9tIGdzdF9xdGRlbXV4X2ZpbmRfaW5kZXhfbGluZWFyICgpCisgICAqIGVuY291bnRlcmVkIGFuIGVycm9yIGFuZCBwcmludGVkIGEgbWVzc2FnZSBzbyB3ZSByZXR1cm4gYXBwcm9wcmlhdGVseSAqLworICBpZiAoaW5kZXggPT0gLTEpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIHdlJ3JlIGF0IHRoZSByaWdodCBzcG90ICovCisgIGlmIChpbmRleCA9PSBzdHJlYW0tPnNhbXBsZV9pbmRleCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHN0cmVhbS0+cGFkLCAid2UgYXJlIGF0IHRoZSByaWdodCBpbmRleCIpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgLyogZmluZCBrZXlmcmFtZSBvZiB0aGUgdGFyZ2V0IGluZGV4ICovCisgIGtmX2luZGV4ID0gZ3N0X3F0ZGVtdXhfZmluZF9rZXlmcmFtZSAocXRkZW11eCwgc3RyZWFtLCBpbmRleCwgRkFMU0UpOworCisvKiAqSU5ERU5ULU9GRiogKi8KKy8qIGluZGVudCBkb2VzIHN0dXBpZCBzdHVmZiB3aXRoIHN0cmVhbS0+c2FtcGxlc1tdLnRpbWVzdGFtcCAqLworCisgIC8qIGlmIHdlIG1vdmUgZm9yd2FyZHMsIHdlIGRvbid0IGhhdmUgdG8gZ28gYmFjayB0byB0aGUgcHJldmlvdXMKKyAgICoga2V5ZnJhbWUgc2luY2Ugd2UgYWxyZWFkeSBzZW50IHRoYXQuIFdlIGNhbiBhbHNvIGp1c3QganVtcCB0bworICAgKiB0aGUga2V5ZnJhbWUgcmlnaHQgYmVmb3JlIHRoZSB0YXJnZXQgaW5kZXggaWYgdGhlcmUgaXMgb25lLiAqLworICBpZiAoaW5kZXggPiBzdHJlYW0tPnNhbXBsZV9pbmRleCkgeworICAgIC8qIG1vdmluZyBmb3J3YXJkcyBjaGVjayBpZiB3ZSBtb3ZlIHBhc3QgYSBrZXlmcmFtZSAqLworICAgIGlmIChrZl9pbmRleCA+IHN0cmVhbS0+c2FtcGxlX2luZGV4KSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzdHJlYW0tPnBhZCwKKyAgICAgICAgICAgIm1vdmluZyBmb3J3YXJkcyB0byBrZXlmcmFtZSBhdCAldSAocHRzICUiIEdTVF9USU1FX0ZPUk1BVCAiIGR0cyAlIkdTVF9USU1FX0ZPUk1BVCIgKSIsIGtmX2luZGV4LAorICAgICAgICAgICBHU1RfVElNRV9BUkdTIChRVFNBTVBMRV9QVFMoc3RyZWFtLCAmc3RyZWFtLT5zYW1wbGVzW2tmX2luZGV4XSkpLAorICAgICAgICAgICBHU1RfVElNRV9BUkdTIChRVFNBTVBMRV9EVFMoc3RyZWFtLCAmc3RyZWFtLT5zYW1wbGVzW2tmX2luZGV4XSkpKTsKKyAgICAgIGdzdF9xdGRlbXV4X21vdmVfc3RyZWFtIChxdGRlbXV4LCBzdHJlYW0sIGtmX2luZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3RyZWFtLT5wYWQsCisgICAgICAgICAgIm1vdmluZyBmb3J3YXJkcywga2V5ZnJhbWUgYXQgJXUgKHB0cyAlIiBHU1RfVElNRV9GT1JNQVQgIiBkdHMgJSJHU1RfVElNRV9GT1JNQVQiICkgYWxyZWFkeSBzZW50Iiwga2ZfaW5kZXgsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoUVRTQU1QTEVfUFRTIChzdHJlYW0sICZzdHJlYW0tPnNhbXBsZXNba2ZfaW5kZXhdKSksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoUVRTQU1QTEVfRFRTIChzdHJlYW0sICZzdHJlYW0tPnNhbXBsZXNba2ZfaW5kZXhdKSkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzdHJlYW0tPnBhZCwKKyAgICAgICAgIm1vdmluZyBiYWNrd2FyZHMgdG8ga2V5ZnJhbWUgYXQgJXUgKHB0cyAlIiBHU1RfVElNRV9GT1JNQVQgIiBkdHMgJSJHU1RfVElNRV9GT1JNQVQiICkiLCBrZl9pbmRleCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoUVRTQU1QTEVfUFRTKHN0cmVhbSwgJnN0cmVhbS0+c2FtcGxlc1trZl9pbmRleF0pKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoUVRTQU1QTEVfRFRTKHN0cmVhbSwgJnN0cmVhbS0+c2FtcGxlc1trZl9pbmRleF0pKSk7CisgICAgZ3N0X3F0ZGVtdXhfbW92ZV9zdHJlYW0gKHF0ZGVtdXgsIHN0cmVhbSwga2ZfaW5kZXgpOworICB9CisKKy8qICpJTkRFTlQtT04qICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIHByZXBhcmUgdG8gZ2V0IHRoZSBjdXJyZW50IHNhbXBsZSBvZiBAc3RyZWFtLCBnZXR0aW5nIGVzc2VudGlhbCB2YWx1ZXMuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gcHJlcGFyZSBhbmQgc2VuZCB0aGUgc2VnbWVudCB3aGVuIG5lZWRlZC4KKyAqCisgKiBSZXR1cm4gRkFMU0UgaWYgdGhlIHN0cmVhbSBpcyBFT1MuCisgKgorICogUFVMTC1CQVNFRAorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdGRlbXV4X3ByZXBhcmVfY3VycmVudF9zYW1wbGUgKEdzdFFURGVtdXggKiBxdGRlbXV4LAorICAgIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sIGdib29sZWFuICogZW1wdHksIGd1aW50NjQgKiBvZmZzZXQsIGd1aW50ICogc2l6ZSwKKyAgICBHc3RDbG9ja1RpbWUgKiBkdHMsIEdzdENsb2NrVGltZSAqIHB0cywgR3N0Q2xvY2tUaW1lICogZHVyYXRpb24sCisgICAgZ2Jvb2xlYW4gKiBrZXlmcmFtZSkKK3sKKyAgUXREZW11eFNhbXBsZSAqc2FtcGxlOworICBHc3RDbG9ja1RpbWUgdGltZV9wb3NpdGlvbjsKKyAgZ3VpbnQzMiBzZWdfaWR4OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzdHJlYW0gIT0gTlVMTCwgRkFMU0UpOworCisgIHRpbWVfcG9zaXRpb24gPSBzdHJlYW0tPnRpbWVfcG9zaXRpb247CisgIGlmIChHX1VOTElLRUxZICh0aW1lX3Bvc2l0aW9uID09IEdTVF9DTE9DS19USU1FX05PTkUpKQorICAgIGdvdG8gZW9zOworCisgIHNlZ19pZHggPSBzdHJlYW0tPnNlZ21lbnRfaW5kZXg7CisgIGlmIChHX1VOTElLRUxZIChzZWdfaWR4ID09IC0xKSkgeworICAgIC8qIGZpbmQgc2VnbWVudCBjb3JyZXNwb25kaW5nIHRvIHRpbWVfcG9zaXRpb24gaWYgd2UgYXJlIGxvb2tpbmcKKyAgICAgKiBmb3IgYSBzZWdtZW50LiAqLworICAgIHNlZ19pZHggPSBnc3RfcXRkZW11eF9maW5kX3NlZ21lbnQgKHF0ZGVtdXgsIHN0cmVhbSwgdGltZV9wb3NpdGlvbik7CisgIH0KKworICAvKiBkaWZmZXJlbnQgc2VnbWVudCwgYWN0aXZhdGUgaXQsIHNhbXBsZV9pbmRleCB3aWxsIGJlIHNldC4gKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbS0+c2VnbWVudF9pbmRleCAhPSBzZWdfaWR4KSkKKyAgICBnc3RfcXRkZW11eF9hY3RpdmF0ZV9zZWdtZW50IChxdGRlbXV4LCBzdHJlYW0sIHNlZ19pZHgsIHRpbWVfcG9zaXRpb24pOworCisgIGlmIChHX1VOTElLRUxZIChRVFNFR01FTlRfSVNfRU1QVFkgKCZzdHJlYW0tPnNlZ21lbnRzW3N0cmVhbS0+CisgICAgICAgICAgICAgICAgICBzZWdtZW50X2luZGV4XSkpKSB7CisgICAgUXREZW11eFNlZ21lbnQgKnNlZyA9ICZzdHJlYW0tPnNlZ21lbnRzW3N0cmVhbS0+c2VnbWVudF9pbmRleF07CisKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIkVtcHR5IHNlZ21lbnQgYWN0aXZhdGVkLCIKKyAgICAgICAgIiBwcmVwYXJlIGVtcHR5IHNhbXBsZSIpOworCisgICAgKmVtcHR5ID0gVFJVRTsKKyAgICAqcHRzID0gKmR0cyA9IHRpbWVfcG9zaXRpb247CisgICAgKmR1cmF0aW9uID0gc2VnLT5kdXJhdGlvbiAtICh0aW1lX3Bvc2l0aW9uIC0gc2VnLT50aW1lKTsKKworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgKmVtcHR5ID0gRkFMU0U7CisKKyAgaWYgKHN0cmVhbS0+c2FtcGxlX2luZGV4ID09IC0xKQorICAgIHN0cmVhbS0+c2FtcGxlX2luZGV4ID0gMDsKKworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInNlZ21lbnQgYWN0aXZlLCBpbmRleCA9ICV1IG9mICV1IiwKKyAgICAgIHN0cmVhbS0+c2FtcGxlX2luZGV4LCBzdHJlYW0tPm5fc2FtcGxlcyk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbS0+c2FtcGxlX2luZGV4ID49IHN0cmVhbS0+bl9zYW1wbGVzKSkgeworICAgIGlmICghcXRkZW11eC0+ZnJhZ21lbnRlZCkKKyAgICAgIGdvdG8gZW9zOworCisgICAgR1NUX0lORk9fT0JKRUNUIChxdGRlbXV4LCAib3V0IG9mIHNhbXBsZXMsIHRyeWluZyB0byBhZGQgbW9yZSIpOworICAgIGRvIHsKKyAgICAgIEdzdEZsb3dSZXR1cm4gZmxvdzsKKworICAgICAgR1NUX09CSkVDVF9MT0NLIChxdGRlbXV4KTsKKyAgICAgIGZsb3cgPSBxdGRlbXV4X2FkZF9mcmFnbWVudGVkX3NhbXBsZXMgKHF0ZGVtdXgpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0ZGVtdXgpOworCisgICAgICBpZiAoZmxvdyAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBlb3M7CisgICAgfQorICAgIHdoaWxlIChzdHJlYW0tPnNhbXBsZV9pbmRleCA+PSBzdHJlYW0tPm5fc2FtcGxlcyk7CisgIH0KKworICBpZiAoIXF0ZGVtdXhfcGFyc2Vfc2FtcGxlcyAocXRkZW11eCwgc3RyZWFtLCBzdHJlYW0tPnNhbXBsZV9pbmRleCkpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIlBhcnNpbmcgb2YgaW5kZXggJXUgZmFpbGVkISIsCisgICAgICAgIHN0cmVhbS0+c2FtcGxlX2luZGV4KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBub3cgZ2V0IHRoZSBpbmZvIGZvciB0aGUgc2FtcGxlIHdlJ3JlIGF0ICovCisgIHNhbXBsZSA9ICZzdHJlYW0tPnNhbXBsZXNbc3RyZWFtLT5zYW1wbGVfaW5kZXhdOworCisgICpkdHMgPSBRVFNBTVBMRV9EVFMgKHN0cmVhbSwgc2FtcGxlKTsKKyAgKnB0cyA9IFFUU0FNUExFX1BUUyAoc3RyZWFtLCBzYW1wbGUpOworICAqb2Zmc2V0ID0gc2FtcGxlLT5vZmZzZXQ7CisgICpzaXplID0gc2FtcGxlLT5zaXplOworICAqZHVyYXRpb24gPSBRVFNBTVBMRV9EVVJfRFRTIChzdHJlYW0sIHNhbXBsZSwgKmR0cyk7CisgICprZXlmcmFtZSA9IFFUU0FNUExFX0tFWUZSQU1FIChzdHJlYW0sIHNhbXBsZSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogc3BlY2lhbCBjYXNlcyAqLworZW9zOgorICB7CisgICAgc3RyZWFtLT50aW1lX3Bvc2l0aW9uID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogbW92ZSB0byB0aGUgbmV4dCBzYW1wbGUgaW4gQHN0cmVhbS4KKyAqCisgKiBNb3ZlcyB0byB0aGUgbmV4dCBzZWdtZW50IHdoZW4gbmVlZGVkLgorICovCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfYWR2YW5jZV9zYW1wbGUgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBRdERlbXV4U3RyZWFtICogc3RyZWFtKQoreworICBRdERlbXV4U2FtcGxlICpzYW1wbGU7CisgIFF0RGVtdXhTZWdtZW50ICpzZWdtZW50OworCisgIC8qIGdldCBjdXJyZW50IHNlZ21lbnQgKi8KKyAgc2VnbWVudCA9ICZzdHJlYW0tPnNlZ21lbnRzW3N0cmVhbS0+c2VnbWVudF9pbmRleF07CisKKyAgaWYgKEdfVU5MSUtFTFkgKFFUU0VHTUVOVF9JU19FTVBUWSAoc2VnbWVudCkpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIkVtcHR5IHNlZ21lbnQsIG5vIHNhbXBsZXMgdG8gYWR2YW5jZSIpOworICAgIGdvdG8gbmV4dF9zZWdtZW50OworICB9CisKKyAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbS0+c2FtcGxlX2luZGV4ID49IHN0cmVhbS0+dG9fc2FtcGxlKSkgeworICAgIC8qIE1hcmsgdGhlIHN0cmVhbSBhcyBFT1MgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAicmVhY2hlZCBtYXggYWxsb3dlZCBzYW1wbGUgJXUsIG1hcmsgRU9TIiwgc3RyZWFtLT50b19zYW1wbGUpOworICAgIHN0cmVhbS0+dGltZV9wb3NpdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogbW92ZSB0byBuZXh0IHNhbXBsZSAqLworICBzdHJlYW0tPnNhbXBsZV9pbmRleCsrOworICBzdHJlYW0tPm9mZnNldF9pbl9zYW1wbGUgPSAwOworCisgIC8qIHJlYWNoZWQgdGhlIGxhc3Qgc2FtcGxlLCB3ZSBuZWVkIHRoZSBuZXh0IHNlZ21lbnQgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbS0+c2FtcGxlX2luZGV4ID49IHN0cmVhbS0+bl9zYW1wbGVzKSkKKyAgICBnb3RvIG5leHRfc2VnbWVudDsKKworICBpZiAoIXF0ZGVtdXhfcGFyc2Vfc2FtcGxlcyAocXRkZW11eCwgc3RyZWFtLCBzdHJlYW0tPnNhbXBsZV9pbmRleCkpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIlBhcnNpbmcgb2YgaW5kZXggJXUgZmFpbGVkISIsCisgICAgICAgIHN0cmVhbS0+c2FtcGxlX2luZGV4KTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBnZXQgbmV4dCBzYW1wbGUgKi8KKyAgc2FtcGxlID0gJnN0cmVhbS0+c2FtcGxlc1tzdHJlYW0tPnNhbXBsZV9pbmRleF07CisKKyAgLyogc2VlIGlmIHdlIGFyZSBwYXN0IHRoZSBzZWdtZW50ICovCisgIGlmIChHX1VOTElLRUxZIChRVFNBTVBMRV9EVFMgKHN0cmVhbSwgc2FtcGxlKSA+PSBzZWdtZW50LT5tZWRpYV9zdG9wKSkKKyAgICBnb3RvIG5leHRfc2VnbWVudDsKKworICBpZiAoUVRTQU1QTEVfRFRTIChzdHJlYW0sIHNhbXBsZSkgPj0gc2VnbWVudC0+bWVkaWFfc3RhcnQpIHsKKyAgICAvKiBpbnNpZGUgdGhlIHNlZ21lbnQsIHVwZGF0ZSB0aW1lX3Bvc2l0aW9uLCBsb29rcyB2ZXJ5IGZhbWlsaWFyIHRvCisgICAgICogR1N0cmVhbWVyIHNlZ21lbnRzLCBkb2Vzbid0IGl0PyAqLworICAgIHN0cmVhbS0+dGltZV9wb3NpdGlvbiA9CisgICAgICAgIFFUU0FNUExFX0RUUyAoc3RyZWFtLCBzYW1wbGUpIC0gc2VnbWVudC0+bWVkaWFfc3RhcnQgKyBzZWdtZW50LT50aW1lOworICB9IGVsc2UgeworICAgIC8qIG5vdCB5ZXQgaW4gc2VnbWVudCwgdGltZSBkb2VzIG5vdCB5ZXQgaW5jcmVtZW50LiBUaGlzIG1lYW5zCisgICAgICogdGhhdCB3ZSBhcmUgc3RpbGwgcHJlcm9sbGluZyBrZXlmcmFtZXMgdG8gdGhlIGRlY29kZXIgc28gaXQgY2FuCisgICAgICogZGVjb2RlIHRoZSBmaXJzdCBzYW1wbGUgb2YgdGhlIHNlZ21lbnQuICovCisgICAgc3RyZWFtLT50aW1lX3Bvc2l0aW9uID0gc2VnbWVudC0+dGltZTsKKyAgfQorICByZXR1cm47CisKKyAgLyogbW92ZSB0byB0aGUgbmV4dCBzZWdtZW50ICovCituZXh0X3NlZ21lbnQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic2VnbWVudCAlZCBlbmRlZCAiLCBzdHJlYW0tPnNlZ21lbnRfaW5kZXgpOworCisgICAgaWYgKHN0cmVhbS0+c2VnbWVudF9pbmRleCA9PSBzdHJlYW0tPm5fc2VnbWVudHMgLSAxKSB7CisgICAgICAvKiBhcmUgd2UgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCBzZWdtZW50LCB3ZSdyZSBFT1MgKi8KKyAgICAgIHN0cmVhbS0+dGltZV9wb3NpdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGVsc2Ugd2UncmUgb25seSBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNlZ21lbnQgKi8KKyAgICAgIHN0cmVhbS0+dGltZV9wb3NpdGlvbiA9IHNlZ21lbnQtPnN0b3BfdGltZTsKKyAgICB9CisgICAgLyogbWFrZSBzdXJlIHdlIHNlbGVjdCBhIG5ldyBzZWdtZW50ICovCisKKyAgICAvKiBhY2N1bXVsYXRlIHByZXZpb3VzIHNlZ21lbnRzICovCisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW0tPnNlZ21lbnQuc3RvcCkpCisgICAgICBzdHJlYW0tPmFjY3VtdWxhdGVkX2Jhc2UgKz0KKyAgICAgICAgICAoc3RyZWFtLT5zZWdtZW50LnN0b3AgLQorICAgICAgICAgIHN0cmVhbS0+c2VnbWVudC5zdGFydCkgLyBBQlMgKHN0cmVhbS0+c2VnbWVudC5yYXRlKTsKKworICAgIHN0cmVhbS0+c2VnbWVudF9pbmRleCA9IC0xOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9zeW5jX3N0cmVhbXMgKEdzdFFURGVtdXggKiBkZW11eCkKK3sKKyAgZ2ludCBpOworCisgIGlmIChkZW11eC0+bl9zdHJlYW1zIDw9IDEpCisgICAgcmV0dXJuOworCisgIGZvciAoaSA9IDA7IGkgPCBkZW11eC0+bl9zdHJlYW1zOyBpKyspIHsKKyAgICBRdERlbXV4U3RyZWFtICpzdHJlYW07CisgICAgR3N0Q2xvY2tUaW1lIGVuZF90aW1lOworCisgICAgc3RyZWFtID0gZGVtdXgtPnN0cmVhbXNbaV07CisKKyAgICBpZiAoIXN0cmVhbS0+cGFkKQorICAgICAgY29udGludWU7CisKKyAgICAvKiBUT0RPIGFkdmFuY2UgdGltZSBvbiBzdWJ0aXRsZSBzdHJlYW1zIGhlcmUsIGlmIGFueSBzb21lIGRheSAqLworCisgICAgLyogc29tZSBjbGlwcy90cmFpbGVycyBtYXkgaGF2ZSB1bmJhbGFuY2VkIHN0cmVhbXMgYXQgdGhlIGVuZCwKKyAgICAgKiBzbyBzZW5kIEVPUyBvbiBzaG9ydGVyIHN0cmVhbSB0byBwcmV2ZW50IHN0YWxsaW5nIG90aGVycyAqLworCisgICAgLyogZG8gbm90IG1lc3Mgd2l0aCBFT1MgaWYgU0VHTUVOVCBzZWVraW5nICovCisgICAgaWYgKGRlbXV4LT5zZWdtZW50LmZsYWdzICYgR1NUX1NFRUtfRkxBR19TRUdNRU5UKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoZGVtdXgtPnB1bGxiYXNlZCkgeworICAgICAgLyogbG9vcCBtb2RlIGlzIHNhbXBsZSB0aW1lIGJhc2VkICovCisgICAgICBpZiAoIVNUUkVBTV9JU19FT1MgKHN0cmVhbSkpCisgICAgICAgIGNvbnRpbnVlOworICAgIH0gZWxzZSB7CisgICAgICAvKiBwdXNoIG1vZGUgaXMgYnl0ZSBwb3NpdGlvbiBiYXNlZCAqLworICAgICAgaWYgKHN0cmVhbS0+bl9zYW1wbGVzICYmCisgICAgICAgICAgc3RyZWFtLT5zYW1wbGVzW3N0cmVhbS0+bl9zYW1wbGVzIC0gMV0ub2Zmc2V0ID49IGRlbXV4LT5vZmZzZXQpCisgICAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChzdHJlYW0tPnNlbnRfZW9zKQorICAgICAgY29udGludWU7CisKKyAgICAvKiBvbmx5IGFjdCBpZiBzb21lIGdhcCAqLworICAgIGVuZF90aW1lID0gc3RyZWFtLT5zZWdtZW50c1tzdHJlYW0tPm5fc2VnbWVudHMgLSAxXS5zdG9wX3RpbWU7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiY3VycmVudCBwb3NpdGlvbjogJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICIsIHN0cmVhbSBlbmQ6ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoZGVtdXgtPnNlZ21lbnQucG9zaXRpb24pLCBHU1RfVElNRV9BUkdTIChlbmRfdGltZSkpOworICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZW5kX3RpbWUpCisgICAgICAgICYmIChlbmRfdGltZSArIDIgKiBHU1RfU0VDT05EIDwgZGVtdXgtPnNlZ21lbnQucG9zaXRpb24pKSB7CisgICAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic2VuZGluZyBFT1MgZm9yIHN0cmVhbSAlcyIsCisgICAgICAgICAgR1NUX1BBRF9OQU1FIChzdHJlYW0tPnBhZCkpOworICAgICAgc3RyZWFtLT5zZW50X2VvcyA9IFRSVUU7CisgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfZW9zICgpOworICAgICAgaWYgKGRlbXV4LT5zZWdtZW50X3NlcW51bSAhPSBHU1RfU0VRTlVNX0lOVkFMSUQpCisgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgZGVtdXgtPnNlZ21lbnRfc2VxbnVtKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5wYWQsIGV2ZW50KTsKKyAgICB9CisgIH0KK30KKworLyogRU9TIGFuZCBOT1RfTElOS0VEIG5lZWQgdG8gYmUgY29tYmluZWQuIFRoaXMgbWVhbnMgdGhhdCB3ZSByZXR1cm46CisgKgorICogIEdTVF9GTE9XX05PVF9MSU5LRUQ6IHdoZW4gYWxsIHBhZHMgTk9UX0xJTktFRC4KKyAqICBHU1RfRkxPV19FT1M6IHdoZW4gYWxsIHBhZHMgRU9TIG9yIE5PVF9MSU5LRUQuCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcXRkZW11eF9jb21iaW5lX2Zsb3dzIChHc3RRVERlbXV4ICogZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sCisgICAgR3N0Rmxvd1JldHVybiByZXQpCit7CisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgImZsb3cgcmV0dXJuOiAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKworICBpZiAoc3RyZWFtLT5wYWQpCisgICAgcmV0ID0gZ3N0X2Zsb3dfY29tYmluZXJfdXBkYXRlX3BhZF9mbG93IChkZW11eC0+Zmxvd2NvbWJpbmVyLCBzdHJlYW0tPnBhZCwKKyAgICAgICAgcmV0KTsKKyAgZWxzZQorICAgIHJldCA9IGdzdF9mbG93X2NvbWJpbmVyX3VwZGF0ZV9mbG93IChkZW11eC0+Zmxvd2NvbWJpbmVyLCByZXQpOworCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgImNvbWJpbmVkIGZsb3cgcmV0dXJuOiAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyogdGhlIGlucHV0IGJ1ZmZlciBtZXRhZGF0YSBtdXN0IGJlIHdyaXRhYmxlLiBSZXR1cm5zIE5VTEwgd2hlbiB0aGUgYnVmZmVyIGlzCisgKiBjb21wbGV0ZWx5IGNsaXBwZWQKKyAqCisgKiBTaG91bGQgYmUgdXNlZCBvbmx5IHdpdGggcmF3IGJ1ZmZlcnMgKi8KK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3F0ZGVtdXhfY2xpcF9idWZmZXIgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBRdERlbXV4U3RyZWFtICogc3RyZWFtLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgZ3VpbnQ2NCBzdGFydCwgc3RvcCwgY3N0YXJ0LCBjc3RvcCwgZGlmZjsKKyAgR3N0Q2xvY2tUaW1lIHB0cywgZHVyYXRpb247CisgIGdzaXplIHNpemUsIG9zaXplOworICBnaW50IG51bV9yYXRlLCBkZW5vbV9yYXRlOworICBnaW50IGZyYW1lX3NpemU7CisgIGdib29sZWFuIGNsaXBfZGF0YTsKKyAgZ3VpbnQgb2Zmc2V0OworCisgIG9zaXplID0gc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisgIG9mZnNldCA9IDA7CisKKyAgLyogZGVwZW5kaW5nIG9uIHRoZSB0eXBlLCBzZXR1cCB0aGUgY2xpcCBwYXJhbWV0ZXJzICovCisgIGlmIChzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3NvdW4pIHsKKyAgICBmcmFtZV9zaXplID0gQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Ynl0ZXNfcGVyX2ZyYW1lOworICAgIG51bV9yYXRlID0gR1NUX1NFQ09ORDsKKyAgICBkZW5vbV9yYXRlID0gKGdpbnQpIENVUl9TVFJFQU0gKHN0cmVhbSktPnJhdGU7CisgICAgY2xpcF9kYXRhID0gVFJVRTsKKyAgfSBlbHNlIGlmIChzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3ZpZGUpIHsKKyAgICBmcmFtZV9zaXplID0gc2l6ZTsKKyAgICBudW1fcmF0ZSA9IENVUl9TVFJFQU0gKHN0cmVhbSktPmZwc19uOworICAgIGRlbm9tX3JhdGUgPSBDVVJfU1RSRUFNIChzdHJlYW0pLT5mcHNfZDsKKyAgICBjbGlwX2RhdGEgPSBGQUxTRTsKKyAgfSBlbHNlCisgICAgZ290byB3cm9uZ190eXBlOworCisgIGlmIChmcmFtZV9zaXplIDw9IDApCisgICAgZ290byBiYWRfZnJhbWVfc2l6ZTsKKworICAvKiB3ZSBjYW4gb25seSBjbGlwIGlmIHdlIGhhdmUgYSB2YWxpZCBwdHMgKi8KKyAgcHRzID0gR1NUX0JVRkZFUl9QVFMgKGJ1Zik7CisgIGlmIChHX1VOTElLRUxZICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHB0cykpKQorICAgIGdvdG8gbm9fcHRzOworCisgIGR1cmF0aW9uID0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKTsKKworICBpZiAoR19VTkxJS0VMWSAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkdXJhdGlvbikpKSB7CisgICAgZHVyYXRpb24gPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChzaXplIC8gZnJhbWVfc2l6ZSwgbnVtX3JhdGUsIGRlbm9tX3JhdGUpOworICB9CisKKyAgc3RhcnQgPSBwdHM7CisgIHN0b3AgPSBzdGFydCArIGR1cmF0aW9uOworCisgIGlmIChHX1VOTElLRUxZICghZ3N0X3NlZ21lbnRfY2xpcCAoJnN0cmVhbS0+c2VnbWVudCwKKyAgICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBzdGFydCwgc3RvcCwgJmNzdGFydCwgJmNzdG9wKSkpCisgICAgZ290byBjbGlwcGVkOworCisgIC8qIHNlZSBpZiBzb21lIGNsaXBwaW5nIGhhcHBlbmVkICovCisgIGRpZmYgPSBjc3RhcnQgLSBzdGFydDsKKyAgaWYgKGRpZmYgPiAwKSB7CisgICAgcHRzICs9IGRpZmY7CisgICAgZHVyYXRpb24gLT0gZGlmZjsKKworICAgIGlmIChjbGlwX2RhdGEpIHsKKyAgICAgIC8qIGJyaW5nIGNsaXBwZWQgdGltZSB0byBzYW1wbGVzIGFuZCB0byBieXRlcyAqLworICAgICAgZGlmZiA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKGRpZmYsIGRlbm9tX3JhdGUsIG51bV9yYXRlKTsKKyAgICAgIGRpZmYgKj0gZnJhbWVfc2l6ZTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAiY2xpcHBpbmcgc3RhcnQgdG8gJSIgR1NUX1RJTUVfRk9STUFUICIgJSIKKyAgICAgICAgICBHX0dVSU5UNjRfRk9STUFUICIgYnl0ZXMiLCBHU1RfVElNRV9BUkdTIChjc3RhcnQpLCBkaWZmKTsKKworICAgICAgb2Zmc2V0ID0gZGlmZjsKKyAgICAgIHNpemUgLT0gZGlmZjsKKyAgICB9CisgIH0KKyAgZGlmZiA9IHN0b3AgLSBjc3RvcDsKKyAgaWYgKGRpZmYgPiAwKSB7CisgICAgZHVyYXRpb24gLT0gZGlmZjsKKworICAgIGlmIChjbGlwX2RhdGEpIHsKKyAgICAgIC8qIGJyaW5nIGNsaXBwZWQgdGltZSB0byBzYW1wbGVzIGFuZCB0aGVuIHRvIGJ5dGVzICovCisgICAgICBkaWZmID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoZGlmZiwgZGVub21fcmF0ZSwgbnVtX3JhdGUpOworICAgICAgZGlmZiAqPSBmcmFtZV9zaXplOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAiY2xpcHBpbmcgc3RvcCB0byAlIiBHU1RfVElNRV9GT1JNQVQgIiAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgIiBieXRlcyIsIEdTVF9USU1FX0FSR1MgKGNzdG9wKSwgZGlmZik7CisgICAgICBzaXplIC09IGRpZmY7CisgICAgfQorICB9CisKKyAgaWYgKG9mZnNldCAhPSAwIHx8IHNpemUgIT0gb3NpemUpCisgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKGJ1Ziwgb2Zmc2V0LCBzaXplKTsKKworICBHU1RfQlVGRkVSX0RUUyAoYnVmKSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gcHRzOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpID0gZHVyYXRpb247CisKKyAgcmV0dXJuIGJ1ZjsKKworICAvKiBkcm9wcGVkIGJ1ZmZlciAqLword3JvbmdfdHlwZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJ1bmtub3duIHN0cmVhbSB0eXBlIik7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorYmFkX2ZyYW1lX3NpemU6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiYmFkIGZyYW1lIHNpemUiKTsKKyAgICByZXR1cm4gYnVmOworICB9Citub19wdHM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAibm8gcHRzIG9uIGJ1ZmZlciIpOworICAgIHJldHVybiBidWY7CisgIH0KK2NsaXBwZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiY2xpcHBlZCBidWZmZXIiKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3F0ZGVtdXhfYWxpZ25fYnVmZmVyIChHc3RRVERlbXV4ICogZGVtdXgsCisgICAgR3N0QnVmZmVyICogYnVmZmVyLCBnc2l6ZSBhbGlnbm1lbnQpCit7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgaWYgKG1hcC5zaXplIDwgc2l6ZW9mIChndWludHB0cikpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIHJldHVybiBidWZmZXI7CisgIH0KKworICBpZiAoKChndWludHB0cikgbWFwLmRhdGEpICYgKGFsaWdubWVudCAtIDEpKSB7CisgICAgR3N0QnVmZmVyICpuZXdfYnVmZmVyOworICAgIEdzdEFsbG9jYXRpb25QYXJhbXMgcGFyYW1zID0geyAwLCBhbGlnbm1lbnQgLSAxLCAwLCAwLCB9OworCisgICAgbmV3X2J1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLAorICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpLCAmcGFyYW1zKTsKKworICAgIC8qIENvcHkgZGF0YSAiYnkgaGFuZCIsIHNvIGVuc3VyZSBhbGlnbm1lbnQgaXMga2VwdDogKi8KKyAgICBnc3RfYnVmZmVyX2ZpbGwgKG5ld19idWZmZXIsIDAsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisKKyAgICBnc3RfYnVmZmVyX2NvcHlfaW50byAobmV3X2J1ZmZlciwgYnVmZmVyLCBHU1RfQlVGRkVSX0NPUFlfTUVUQURBVEEsIDAsIC0xKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgIldlIHdhbnQgb3V0cHV0IGFsaWduZWQgb24gJSIgR19HU0laRV9GT1JNQVQgIiwgcmVhbGxvY2F0ZWQiLAorICAgICAgICBhbGlnbm1lbnQpOworCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgICAgcmV0dXJuIG5ld19idWZmZXI7CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICByZXR1cm4gYnVmZmVyOworfQorCisvKiB0aGUgaW5wdXQgYnVmZmVyIG1ldGFkYXRhIG11c3QgYmUgd3JpdGFibGUsCisgKiBidXQgdGltZS9kdXJhdGlvbiBldGMgbm90IHlldCBzZXQgYW5kIG5lZWQgbm90IGJlIHByZXNlcnZlZCAqLworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcXRkZW11eF9wcm9jZXNzX2J1ZmZlciAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sCisgICAgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQgbnNpemUgPSAwOworICBnY2hhciAqc3RyOworCisgIC8qIG5vdCBtYW55IGNhc2VzIGZvciBub3cgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKENVUl9TVFJFQU0gKHN0cmVhbSktPmZvdXJjYyA9PSBGT1VSQ0NfbXA0cykpIHsKKyAgICAvKiBzZW5kIGEgb25lIHRpbWUgZHZkIGNsdXQgZXZlbnQgKi8KKyAgICBpZiAoc3RyZWFtLT5wZW5kaW5nX2V2ZW50ICYmIHN0cmVhbS0+cGFkKQorICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzdHJlYW0tPnBhZCwgc3RyZWFtLT5wZW5kaW5nX2V2ZW50KTsKKyAgICBzdHJlYW0tPnBlbmRpbmdfZXZlbnQgPSBOVUxMOworICB9CisKKyAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbS0+c3VidHlwZSAhPSBGT1VSQ0NfdGV4dAorICAgICAgICAgICYmIHN0cmVhbS0+c3VidHlwZSAhPSBGT1VSQ0Nfc2J0bCAmJgorICAgICAgICAgIHN0cmVhbS0+c3VidHlwZSAhPSBGT1VSQ0Nfc3VicCkpIHsKKyAgICByZXR1cm4gYnVmOworICB9CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICAvKiBlbXB0eSBidWZmZXIgaXMgc2VudCB0byB0ZXJtaW5hdGUgcHJldmlvdXMgc3VidGl0bGUgKi8KKyAgaWYgKG1hcC5zaXplIDw9IDIpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0Nfc3VicCkgeworICAgIC8qIFRoYXQncyBhbGwgdGhlIHByb2Nlc3NpbmcgbmVlZGVkIGZvciBzdWJwaWN0dXJlcyAqLworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorCisgIG5zaXplID0gR1NUX1JFQURfVUlOVDE2X0JFIChtYXAuZGF0YSk7CisgIG5zaXplID0gTUlOIChuc2l6ZSwgbWFwLnNpemUgLSAyKTsKKworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIjNHUFAgdGltZWQgdGV4dCBzdWJ0aXRsZTogJWQvJSIgR19HU0laRV9GT1JNQVQgIiIsCisgICAgICBuc2l6ZSwgbWFwLnNpemUpOworCisgIC8qIHRha2VzIGNhcmUgb2YgVVRGLTggdmFsaWRhdGlvbiBvciBVVEYtMTYgcmVjb2duaXRpb24sCisgICAqIG5vIG90aGVyIGVuY29kaW5nIGV4cGVjdGVkICovCisgIHN0ciA9IGdzdF90YWdfZnJlZWZvcm1fc3RyaW5nX3RvX3V0ZjggKChnY2hhciAqKSBtYXAuZGF0YSArIDIsIG5zaXplLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgaWYgKHN0cikgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgYnVmID0gX2dzdF9idWZmZXJfbmV3X3dyYXBwZWQgKHN0ciwgc3RybGVuIChzdHIpLCBnX2ZyZWUpOworICB9IGVsc2UgeworICAgIC8qIHRoaXMgc2hvdWxkIG5vdCByZWFsbHkgaGFwcGVuIHVubGVzcyB0aGUgc3VidGl0bGUgaXMgY29ycnVwdGVkICovCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICBidWYgPSBOVUxMOworICB9CisKKyAgLyogRklYTUUgPyBjb252ZXJ0IG9wdGlvbmFsIHN1YnNlcXVlbnQgc3R5bGUgaW5mbyB0byBtYXJrdXAgKi8KKworICByZXR1cm4gYnVmOworfQorCisvKiBTZXRzIGEgYnVmZmVyJ3MgYXR0cmlidXRlcyBwcm9wZXJseSBhbmQgcHVzaGVzIGl0IGRvd25zdHJlYW0uCisgKiBBbHNvIGNoZWNrcyBmb3IgYWRkaXRpb25hbCBhY3Rpb25zIGFuZCBjdXN0b20gcHJvY2Vzc2luZyB0aGF0IG1heQorICogbmVlZCB0byBiZSBkb25lIGZpcnN0LgorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0ZGVtdXhfZGVjb3JhdGVfYW5kX3B1c2hfYnVmZmVyIChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtLCBHc3RCdWZmZXIgKiBidWYsCisgICAgR3N0Q2xvY2tUaW1lIGR0cywgR3N0Q2xvY2tUaW1lIHB0cywgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uLAorICAgIGdib29sZWFuIGtleWZyYW1lLCBHc3RDbG9ja1RpbWUgcG9zaXRpb24sIGd1aW50NjQgYnl0ZV9wb3NpdGlvbikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICAvKiBvZmZzZXQgdGhlIHRpbWVzdGFtcHMgYWNjb3JkaW5nIHRvIHRoZSBlZGl0IGxpc3QgKi8KKworICBpZiAoR19VTkxJS0VMWSAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Zm91cmNjID09IEZPVVJDQ19ydHNwKSkgeworICAgIGdjaGFyICp1cmw7CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHVybCA9IGdfc3RybmR1cCAoKGdjaGFyICopIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBpZiAodXJsICE9IE5VTEwgJiYgc3RybGVuICh1cmwpICE9IDApIHsKKyAgICAgIC8qIHdlIGhhdmUgUlRTUCByZWRpcmVjdCBub3cgKi8KKyAgICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAocXRkZW11eCksCisgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2VsZW1lbnQgKEdTVF9PQkpFQ1RfQ0FTVCAocXRkZW11eCksCisgICAgICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgicmVkaXJlY3QiLAorICAgICAgICAgICAgICAgICAgIm5ldy1sb2NhdGlvbiIsIEdfVFlQRV9TVFJJTkcsIHVybCwgTlVMTCkpKTsKKyAgICAgIHF0ZGVtdXgtPnBvc3RlZF9yZWRpcmVjdCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIlJlZGlyZWN0IFVSSSBvZiBzdHJlYW0gaXMgZW1wdHksIG5vdCAiCisgICAgICAgICAgInBvc3RpbmciKTsKKyAgICB9CisgICAgZ19mcmVlICh1cmwpOworICB9CisKKyAgLyogcG9zaXRpb24gcmVwb3J0aW5nICovCisgIGlmIChxdGRlbXV4LT5zZWdtZW50LnJhdGUgPj0gMCkgeworICAgIHF0ZGVtdXgtPnNlZ21lbnQucG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICBnc3RfcXRkZW11eF9zeW5jX3N0cmVhbXMgKHF0ZGVtdXgpOworICB9CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFzdHJlYW0tPnBhZCkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiTm8gb3V0cHV0IHBhZCBmb3Igc3RyZWFtLCBpZ25vcmluZyIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgZ290byBleGl0OworICB9CisKKyAgLyogc2VuZCBvdXQgcGVuZGluZyBidWZmZXJzICovCisgIHdoaWxlIChzdHJlYW0tPmJ1ZmZlcnMpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZmZlciA9IChHc3RCdWZmZXIgKikgc3RyZWFtLT5idWZmZXJzLT5kYXRhOworCisgICAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbS0+ZGlzY29udCkpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAibWFya2luZyBkaXNjb250IGJ1ZmZlciIpOworICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmZmVyLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgICBzdHJlYW0tPmRpc2NvbnQgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICB9CisKKyAgICBpZiAoc3RyZWFtLT5hbGlnbm1lbnQgPiAxKQorICAgICAgYnVmZmVyID0gZ3N0X3F0ZGVtdXhfYWxpZ25fYnVmZmVyIChxdGRlbXV4LCBidWZmZXIsIHN0cmVhbS0+YWxpZ25tZW50KTsKKyAgICBnc3RfcGFkX3B1c2ggKHN0cmVhbS0+cGFkLCBidWZmZXIpOworCisgICAgc3RyZWFtLT5idWZmZXJzID0gZ19zbGlzdF9kZWxldGVfbGluayAoc3RyZWFtLT5idWZmZXJzLCBzdHJlYW0tPmJ1ZmZlcnMpOworICB9CisKKyAgLyogd2UncmUgZ29pbmcgdG8gbW9kaWZ5IHRoZSBtZXRhZGF0YSAqLworICBidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKGJ1Zik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbS0+bmVlZF9wcm9jZXNzKSkKKyAgICBidWYgPSBnc3RfcXRkZW11eF9wcm9jZXNzX2J1ZmZlciAocXRkZW11eCwgc3RyZWFtLCBidWYpOworCisgIGlmICghYnVmKSB7CisgICAgZ290byBleGl0OworICB9CisKKyAgR1NUX0JVRkZFUl9EVFMgKGJ1ZikgPSBkdHM7CisgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gcHRzOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpID0gZHVyYXRpb247CisgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpID0gLTE7CisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmKSA9IC0xOworCisgIGlmIChHX1VOTElLRUxZIChDVVJfU1RSRUFNIChzdHJlYW0pLT5yZ2I4X3BhbGV0dGUpKQorICAgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAoYnVmLAorICAgICAgICBnc3RfbWVtb3J5X3JlZiAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cmdiOF9wYWxldHRlKSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKENVUl9TVFJFQU0gKHN0cmVhbSktPnBhZGRpbmcpKSB7CisgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKGJ1ZiwgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cGFkZGluZywgLTEpOworICB9CisjaWYgMAorICBpZiAoR19VTkxJS0VMWSAocXRkZW11eC0+ZWxlbWVudF9pbmRleCkpIHsKKyAgICBHc3RDbG9ja1RpbWUgc3RyZWFtX3RpbWU7CisKKyAgICBzdHJlYW1fdGltZSA9CisgICAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmc3RyZWFtLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgIHRpbWVzdGFtcCk7CisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW1fdGltZSkpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICJhZGRpbmcgYXNzb2NpYXRpb24gJSIgR1NUX1RJTUVfRk9STUFUICItPiAlIgorICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHN0cmVhbV90aW1lKSwgYnl0ZV9wb3NpdGlvbik7CisgICAgICBnc3RfaW5kZXhfYWRkX2Fzc29jaWF0aW9uIChxdGRlbXV4LT5lbGVtZW50X2luZGV4LAorICAgICAgICAgIHF0ZGVtdXgtPmluZGV4X2lkLAorICAgICAgICAgIGtleWZyYW1lID8gR1NUX0FTU09DSUFUSU9OX0ZMQUdfS0VZX1VOSVQgOgorICAgICAgICAgIEdTVF9BU1NPQ0lBVElPTl9GTEFHX0RFTFRBX1VOSVQsIEdTVF9GT1JNQVRfVElNRSwgc3RyZWFtX3RpbWUsCisgICAgICAgICAgR1NUX0ZPUk1BVF9CWVRFUywgYnl0ZV9wb3NpdGlvbiwgTlVMTCk7CisgICAgfQorICB9CisjZW5kaWYKKworICBpZiAoc3RyZWFtLT5uZWVkX2NsaXApCisgICAgYnVmID0gZ3N0X3F0ZGVtdXhfY2xpcF9idWZmZXIgKHF0ZGVtdXgsIHN0cmVhbSwgYnVmKTsKKworICBpZiAoR19VTkxJS0VMWSAoYnVmID09IE5VTEwpKQorICAgIGdvdG8gZXhpdDsKKworICBpZiAoR19VTkxJS0VMWSAoc3RyZWFtLT5kaXNjb250KSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAibWFya2luZyBkaXNjb250IGJ1ZmZlciIpOworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgIHN0cmVhbS0+ZGlzY29udCA9IEZBTFNFOworICB9IGVsc2UgeworICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgIH0KKworICBpZiAoIWtleWZyYW1lKSB7CisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgc3RyZWFtLT5vbl9rZXlmcmFtZSA9IEZBTFNFOworICB9IGVsc2UgeworICAgIHN0cmVhbS0+b25fa2V5ZnJhbWUgPSBUUlVFOworICB9CisKKworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICJQdXNoaW5nIGJ1ZmZlciB3aXRoIGR0cyAlIiBHU1RfVElNRV9GT1JNQVQgIiwgcHRzICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiwgZHVyYXRpb24gJSIgR1NUX1RJTUVfRk9STUFUICIgb24gcGFkICVzIiwgR1NUX1RJTUVfQVJHUyAoZHRzKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHB0cyksIEdTVF9USU1FX0FSR1MgKGR1cmF0aW9uKSwKKyAgICAgIEdTVF9QQURfTkFNRSAoc3RyZWFtLT5wYWQpKTsKKworICBpZiAoc3RyZWFtLT5wcm90ZWN0ZWQgJiYgc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV90eXBlID09IEZPVVJDQ19jZW5jKSB7CisgICAgR3N0U3RydWN0dXJlICpjcnlwdG9faW5mbzsKKyAgICBRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gKmluZm8gPQorICAgICAgICAoUXREZW11eENlbmNTYW1wbGVTZXRJbmZvICopIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfaW5mbzsKKyAgICBnaW50IGluZGV4OworICAgIEdzdEV2ZW50ICpldmVudDsKKworICAgIHdoaWxlICgoZXZlbnQgPSBnX3F1ZXVlX3BvcF9oZWFkICgmc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV9ldmVudF9xdWV1ZSkpKSB7CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHN0cmVhbS0+cGFkLCBldmVudCk7CisgICAgfQorCisgICAgaWYgKGluZm8tPmNyeXB0b19pbmZvID09IE5VTEwpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJjZW5jIG1ldGFkYXRhIGhhc24ndCBiZWVuIHBhcnNlZCB5ZXQiKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgLyogVGhlIGVuZCBvZiB0aGUgY3J5cHRvX2luZm8gYXJyYXkgbWF0Y2hlcyBvdXIgbl9zYW1wbGVzIHBvc2l0aW9uLAorICAgICAqIHNvIGNvdW50IGJhY2t3YXJkIGZyb20gdGhlcmUgKi8KKyAgICBpbmRleCA9IHN0cmVhbS0+c2FtcGxlX2luZGV4IC0gc3RyZWFtLT5uX3NhbXBsZXMgKyBpbmZvLT5jcnlwdG9faW5mby0+bGVuOworICAgIGlmIChHX0xJS0VMWSAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGluZm8tPmNyeXB0b19pbmZvLT5sZW4pKSB7CisgICAgICAvKiBzdGVhbCBzdHJ1Y3R1cmUgZnJvbSBhcnJheSAqLworICAgICAgY3J5cHRvX2luZm8gPSBnX3B0cl9hcnJheV9pbmRleCAoaW5mby0+Y3J5cHRvX2luZm8sIGluZGV4KTsKKyAgICAgIGdfcHRyX2FycmF5X2luZGV4IChpbmZvLT5jcnlwdG9faW5mbywgaW5kZXgpID0gTlVMTDsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiYXR0YWNoaW5nIGNlbmMgbWV0YWRhdGEgWyV1LyV1XSIsIGluZGV4LAorICAgICAgICAgIGluZm8tPmNyeXB0b19pbmZvLT5sZW4pOworICAgICAgaWYgKCFjcnlwdG9faW5mbyB8fCAhZ3N0X2J1ZmZlcl9hZGRfcHJvdGVjdGlvbl9tZXRhIChidWYsIGNyeXB0b19pbmZvKSkKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgImZhaWxlZCB0byBhdHRhY2ggY2VuYyBtZXRhZGF0YSB0byBidWZmZXIiKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0lORk9fT0JKRUNUIChxdGRlbXV4LCAiTm8gY3J5cHRvIGluZm8gd2l0aCBpbmRleCAlZCBhbmQgc2FtcGxlICVkIiwKKyAgICAgICAgICBpbmRleCwgc3RyZWFtLT5zYW1wbGVfaW5kZXgpOworICAgIH0KKyAgfQorCisgIGlmIChzdHJlYW0tPmFsaWdubWVudCA+IDEpCisgICAgYnVmID0gZ3N0X3F0ZGVtdXhfYWxpZ25fYnVmZmVyIChxdGRlbXV4LCBidWYsIHN0cmVhbS0+YWxpZ25tZW50KTsKKworICByZXQgPSBnc3RfcGFkX3B1c2ggKHN0cmVhbS0+cGFkLCBidWYpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAocHRzKSAmJiBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZHVyYXRpb24pKSB7CisgICAgLyogbWFyayBwb3NpdGlvbiBpbiBzdHJlYW0sIHdlJ2xsIG5lZWQgdGhpcyB0byBrbm93IHdoZW4gdG8gc2VuZCBHQVAgZXZlbnQgKi8KKyAgICBzdHJlYW0tPnNlZ21lbnQucG9zaXRpb24gPSBwdHMgKyBkdXJhdGlvbjsKKyAgfQorCitleGl0OgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgUXREZW11eFJhbmRvbUFjY2Vzc0VudHJ5ICoKK2dzdF9xdGRlbXV4X3N0cmVhbV9zZWVrX2ZyYWdtZW50IChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RDbG9ja1RpbWUgcG9zLCBnYm9vbGVhbiBhZnRlcikKK3sKKyAgUXREZW11eFJhbmRvbUFjY2Vzc0VudHJ5ICplbnRyaWVzID0gc3RyZWFtLT5yYV9lbnRyaWVzOworICBndWludCBuX2VudHJpZXMgPSBzdHJlYW0tPm5fcmFfZW50cmllczsKKyAgZ3VpbnQgaTsKKworICAvKiB3ZSBhc3N1bWUgdGhlIHRhYmxlIGlzIHNvcnRlZCAqLworICBmb3IgKGkgPSAwOyBpIDwgbl9lbnRyaWVzOyArK2kpIHsKKyAgICBpZiAoZW50cmllc1tpXS50cyA+IHBvcykKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRklYTUU6IG1heWJlIHNhdmUgZmlyc3QgbW9vZl9vZmZzZXQgc29tZXdoZXJlIGluc3RlYWQsIGJ1dCBmb3Igbm93IGl0J3MKKyAgICogcHJvYmFibHkgb2theSB0byBhc3N1bWUgdGhhdCB0aGUgaW5kZXggbGlzdHMgdGhlIHZlcnkgZmlyc3QgZnJhZ21lbnQgKi8KKyAgaWYgKGkgPT0gMCkKKyAgICByZXR1cm4gJmVudHJpZXNbMF07CisKKyAgaWYgKGFmdGVyKQorICAgIHJldHVybiAmZW50cmllc1tpXTsKKyAgZWxzZQorICAgIHJldHVybiAmZW50cmllc1tpIC0gMV07Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3F0ZGVtdXhfZG9fZnJhZ21lbnRlZF9zZWVrIChHc3RRVERlbXV4ICogcXRkZW11eCkKK3sKKyAgY29uc3QgUXREZW11eFJhbmRvbUFjY2Vzc0VudHJ5ICpiZXN0X2VudHJ5ID0gTlVMTDsKKyAgZ3VpbnQgaTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHF0ZGVtdXgpOworCisgIGdfYXNzZXJ0IChxdGRlbXV4LT5uX3N0cmVhbXMgPiAwKTsKKworICAvKiBmaXJzdCBzZWUgaWYgd2UgY2FuIGRldGVybWluZSB3aGVyZSB0byBnbyB0byB1c2luZyBtZnJhLAorICAgKiBiZWZvcmUgd2Ugc3RhcnQgY2xlYXJpbmcgdGhpbmdzICovCisgIGZvciAoaSA9IDA7IGkgPCBxdGRlbXV4LT5uX3N0cmVhbXM7IGkrKykgeworICAgIGNvbnN0IFF0RGVtdXhSYW5kb21BY2Nlc3NFbnRyeSAqZW50cnk7CisgICAgUXREZW11eFN0cmVhbSAqc3RyZWFtOworICAgIGdib29sZWFuIGlzX2F1ZGlvX29yX3ZpZGVvOworCisgICAgc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1tpXTsKKworICAgIGlmIChzdHJlYW0tPnJhX2VudHJpZXMgPT0gTlVMTCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0NfdmlkZSB8fCBzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3NvdW4pCisgICAgICBpc19hdWRpb19vcl92aWRlbyA9IFRSVUU7CisgICAgZWxzZQorICAgICAgaXNfYXVkaW9fb3JfdmlkZW8gPSBGQUxTRTsKKworICAgIGVudHJ5ID0KKyAgICAgICAgZ3N0X3F0ZGVtdXhfc3RyZWFtX3NlZWtfZnJhZ21lbnQgKHF0ZGVtdXgsIHN0cmVhbSwKKyAgICAgICAgc3RyZWFtLT50aW1lX3Bvc2l0aW9uLCAhaXNfYXVkaW9fb3JfdmlkZW8pOworCisgICAgR1NUX0lORk9fT0JKRUNUIChzdHJlYW0tPnBhZCwgIiUiIEdTVF9USU1FX0ZPUk1BVCAiIGF0IG9mZnNldCAiCisgICAgICAgICIlIiBHX0dVSU5UNjRfRk9STUFULCBHU1RfVElNRV9BUkdTIChlbnRyeS0+dHMpLCBlbnRyeS0+bW9vZl9vZmZzZXQpOworCisgICAgc3RyZWFtLT5wZW5kaW5nX3NlZWsgPSBlbnRyeTsKKworICAgIC8qIGRlY2lkZSBwb3NpdGlvbiB0byBqdW1wIHRvIGp1c3QgYmFzZWQgb24gYXVkaW8vdmlkZW8gdHJhY2tzLCBub3Qgc3VicyAqLworICAgIGlmICghaXNfYXVkaW9fb3JfdmlkZW8pCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChiZXN0X2VudHJ5ID09IE5VTEwgfHwgZW50cnktPm1vb2Zfb2Zmc2V0IDwgYmVzdF9lbnRyeS0+bW9vZl9vZmZzZXQpCisgICAgICBiZXN0X2VudHJ5ID0gZW50cnk7CisgIH0KKworICAvKiBubyBsdWNrLCB3aWxsIGhhbmRsZSBzZWVrIG90aGVyd2lzZSAqLworICBpZiAoYmVzdF9lbnRyeSA9PSBOVUxMKSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0ZGVtdXgpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIG9rLCBub3cgd2UgY2FuIHByZXBhcmUgZm9yIHByb2Nlc3NpbmcgYXMgb2YgbG9jYXRlZCBtb29mICovCisgIGZvciAoaSA9IDA7IGkgPCBxdGRlbXV4LT5uX3N0cmVhbXM7IGkrKykgeworICAgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbTsKKworICAgIHN0cmVhbSA9IHF0ZGVtdXgtPnN0cmVhbXNbaV07CisKKyAgICBnX2ZyZWUgKHN0cmVhbS0+c2FtcGxlcyk7CisgICAgc3RyZWFtLT5zYW1wbGVzID0gTlVMTDsKKyAgICBzdHJlYW0tPm5fc2FtcGxlcyA9IDA7CisgICAgc3RyZWFtLT5zdGJsX2luZGV4ID0gLTE7ICAgIC8qIG5vIHNhbXBsZXMgaGF2ZSB5ZXQgYmVlbiBwYXJzZWQgKi8KKyAgICBzdHJlYW0tPnNhbXBsZV9pbmRleCA9IC0xOworCisgICAgaWYgKHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfaW5mbykgeworICAgICAgLyogQ2xlYXIgb3V0IGFueSBvbGQgY2VuYyBjcnlwdG8gaW5mbyBlbnRyaWVzIGFzIHdlJ2xsIG1vdmUgdG8gYSBuZXcgbW9vZiAqLworICAgICAgaWYgKHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfdHlwZSA9PSBGT1VSQ0NfY2VuYykgeworICAgICAgICBRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8gKmluZm8gPQorICAgICAgICAgICAgKFF0RGVtdXhDZW5jU2FtcGxlU2V0SW5mbyAqKSBzdHJlYW0tPnByb3RlY3Rpb25fc2NoZW1lX2luZm87CisgICAgICAgIGlmIChpbmZvLT5jcnlwdG9faW5mbykgeworICAgICAgICAgIGdfcHRyX2FycmF5X2ZyZWUgKGluZm8tPmNyeXB0b19pbmZvLCBUUlVFKTsKKyAgICAgICAgICBpbmZvLT5jcnlwdG9faW5mbyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsICJzZWVrIHRvICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBiZXN0IGZyYWdtZW50ICIKKyAgICAgICJtb29mIG9mZnNldDogJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCB0cyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChxdGRlbXV4LT5zdHJlYW1zWzBdLT50aW1lX3Bvc2l0aW9uKSwKKyAgICAgIGJlc3RfZW50cnktPm1vb2Zfb2Zmc2V0LCBHU1RfVElNRV9BUkdTIChiZXN0X2VudHJ5LT50cykpOworCisgIHF0ZGVtdXgtPm1vb2Zfb2Zmc2V0ID0gYmVzdF9lbnRyeS0+bW9vZl9vZmZzZXQ7CisKKyAgcXRkZW11eF9hZGRfZnJhZ21lbnRlZF9zYW1wbGVzIChxdGRlbXV4KTsKKworICBHU1RfT0JKRUNUX1VOTE9DSyAocXRkZW11eCk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9tb3ZpZSAoR3N0UVREZW11eCAqIHF0ZGVtdXgpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKyAgUXREZW11eFN0cmVhbSAqc3RyZWFtOworICBHc3RDbG9ja1RpbWUgbWluX3RpbWU7CisgIGd1aW50NjQgb2Zmc2V0ID0gMDsKKyAgR3N0Q2xvY2tUaW1lIGR0cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIEdzdENsb2NrVGltZSBwdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBHc3RDbG9ja1RpbWUgZHVyYXRpb24gPSAwOworICBnYm9vbGVhbiBrZXlmcmFtZSA9IEZBTFNFOworICBndWludCBzYW1wbGVfc2l6ZSA9IDA7CisgIGdib29sZWFuIGVtcHR5ID0gMDsKKyAgZ3VpbnQgc2l6ZTsKKyAgZ2ludCBpbmRleDsKKyAgZ2ludCBpOworCisgIGdzdF9xdGRlbXV4X3B1c2hfcGVuZGluZ19uZXdzZWdtZW50IChxdGRlbXV4KTsKKworICBpZiAocXRkZW11eC0+ZnJhZ21lbnRlZF9zZWVrX3BlbmRpbmcpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsICJwZW5kaW5nIGZyYWdtZW50ZWQgc2VlayIpOworICAgIGlmIChnc3RfcXRkZW11eF9kb19mcmFnbWVudGVkX3NlZWsgKHF0ZGVtdXgpKSB7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsICJmcmFnbWVudGVkIHNlZWsgZG9uZSEiKTsKKyAgICAgIHF0ZGVtdXgtPmZyYWdtZW50ZWRfc2Vla19wZW5kaW5nID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwgImZyYWdtZW50ZWQgc2VlayBzdGlsbCBwZW5kaW5nIik7CisgICAgfQorICB9CisKKyAgLyogRmlndXJlIG91dCB0aGUgbmV4dCBzdHJlYW0gc2FtcGxlIHRvIG91dHB1dCwgbWluX3RpbWUgaXMgZXhwcmVzc2VkIGluCisgICAqIGdsb2JhbCB0aW1lIGFuZCBydW5zIG92ZXIgdGhlIGVkaXQgbGlzdCBzZWdtZW50cy4gKi8KKyAgbWluX3RpbWUgPSBHX01BWFVJTlQ2NDsKKyAgaW5kZXggPSAtMTsKKyAgZm9yIChpID0gMDsgaSA8IHF0ZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgR3N0Q2xvY2tUaW1lIHBvc2l0aW9uOworCisgICAgc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1tpXTsKKyAgICBwb3NpdGlvbiA9IHN0cmVhbS0+dGltZV9wb3NpdGlvbjsKKworICAgIC8qIHBvc2l0aW9uIG9mIC0xIGlzIEVPUyAqLworICAgIGlmIChwb3NpdGlvbiAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmIHBvc2l0aW9uIDwgbWluX3RpbWUpIHsKKyAgICAgIG1pbl90aW1lID0gcG9zaXRpb247CisgICAgICBpbmRleCA9IGk7CisgICAgfQorICB9CisgIC8qIGFsbCBhcmUgRU9TICovCisgIGlmIChHX1VOTElLRUxZIChpbmRleCA9PSAtMSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiYWxsIHN0cmVhbXMgYXJlIEVPUyIpOworICAgIGdvdG8gZW9zOworICB9CisKKyAgLyogY2hlY2sgZm9yIHNlZ21lbnQgZW5kICovCisgIGlmIChHX1VOTElLRUxZIChxdGRlbXV4LT5zZWdtZW50LnN0b3AgIT0gLTEKKyAgICAgICAgICAmJiAoKHF0ZGVtdXgtPnNlZ21lbnQucmF0ZSA+PSAwICYmIHF0ZGVtdXgtPnNlZ21lbnQuc3RvcCA8PSBtaW5fdGltZSkKKyAgICAgICAgICAgICAgfHwgKHF0ZGVtdXgtPnNlZ21lbnQucmF0ZSA8IDAKKyAgICAgICAgICAgICAgICAgICYmIHF0ZGVtdXgtPnNlZ21lbnQuc3RhcnQgPiBtaW5fdGltZSkpCisgICAgICAgICAgJiYgcXRkZW11eC0+c3RyZWFtc1tpbmRleF0tPm9uX2tleWZyYW1lKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJ3ZSByZWFjaGVkIHRoZSBlbmQgb2Ygb3VyIHNlZ21lbnQuIik7CisgICAgcXRkZW11eC0+c3RyZWFtc1tpbmRleF0tPnRpbWVfcG9zaXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgIGdvdG8gZW9zX3N0cmVhbTsKKyAgfQorCisgIC8qIGdhcCBldmVudHMgZm9yIHN1YnRpdGxlIHN0cmVhbXMgKi8KKyAgZm9yIChpID0gMDsgaSA8IHF0ZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1tpXTsKKyAgICBpZiAoc3RyZWFtLT5wYWQgJiYgKHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0Nfc3VicAorICAgICAgICAgICAgfHwgc3RyZWFtLT5zdWJ0eXBlID09IEZPVVJDQ190ZXh0CisgICAgICAgICAgICB8fCBzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3NidGwpKSB7CisgICAgICAvKiBzZW5kIG9uZSBzZWNvbmQgZ2FwIGV2ZW50cyB1bnRpbCB0aGUgc3RyZWFtIGNhdGNoZXMgdXAgKi8KKyAgICAgIC8qIGdhcHMgY2FuIG9ubHkgYmUgc2VudCBhZnRlciBzZWdtZW50IGlzIGFjdGl2YXRlZCAoc2VnbWVudC5zdG9wIGlzIG5vIGxvbmdlciAtMSkgKi8KKyAgICAgIHdoaWxlIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtLT5zZWdtZW50LnN0b3ApICYmCisgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHN0cmVhbS0+c2VnbWVudC5wb3NpdGlvbikgJiYKKyAgICAgICAgICBzdHJlYW0tPnNlZ21lbnQucG9zaXRpb24gKyBHU1RfU0VDT05EIDwgbWluX3RpbWUpIHsKKyAgICAgICAgR3N0RXZlbnQgKmdhcCA9CisgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X2dhcCAoc3RyZWFtLT5zZWdtZW50LnBvc2l0aW9uLCBHU1RfU0VDT05EKTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzdHJlYW0tPnBhZCwgZ2FwKTsKKyAgICAgICAgc3RyZWFtLT5zZWdtZW50LnBvc2l0aW9uICs9IEdTVF9TRUNPTkQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1tpbmRleF07CisgIC8qIGZldGNoIGluZm8gZm9yIHRoZSBjdXJyZW50IHNhbXBsZSBvZiB0aGlzIHN0cmVhbSAqLworICBpZiAoR19VTkxJS0VMWSAoIWdzdF9xdGRlbXV4X3ByZXBhcmVfY3VycmVudF9zYW1wbGUgKHF0ZGVtdXgsIHN0cmVhbSwgJmVtcHR5LAorICAgICAgICAgICAgICAmb2Zmc2V0LCAmc2FtcGxlX3NpemUsICZkdHMsICZwdHMsICZkdXJhdGlvbiwgJmtleWZyYW1lKSkpCisgICAgZ290byBlb3Nfc3RyZWFtOworCisgIGdzdF9xdGRlbXV4X3N0cmVhbV9jaGVja19hbmRfY2hhbmdlX3N0c2RfaW5kZXggKHF0ZGVtdXgsIHN0cmVhbSk7CisgIGlmIChzdHJlYW0tPm5ld19jYXBzKSB7CisgICAgZ3N0X3F0ZGVtdXhfY29uZmlndXJlX3N0cmVhbSAocXRkZW11eCwgc3RyZWFtKTsKKyAgICBxdGRlbXV4X2RvX2FsbG9jYXRpb24gKHF0ZGVtdXgsIHN0cmVhbSk7CisgIH0KKworICAvKiBJZiB3ZSdyZSBkb2luZyBhIGtleWZyYW1lLW9ubHkgdHJpY2ttb2RlLCBvbmx5IHB1c2gga2V5ZnJhbWVzIG9uIHZpZGVvIHN0cmVhbXMgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHF0ZGVtdXgtPgorICAgICAgICAgIHNlZ21lbnQuZmxhZ3MgJiBHU1RfU0VHTUVOVF9GTEFHX1RSSUNLTU9ERV9LRVlfVU5JVFMpKSB7CisgICAgaWYgKHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0NfdmlkZSAmJiAha2V5ZnJhbWUpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiU2tpcHBpbmcgbm9uLWtleWZyYW1lIG9uIHN0cmVhbSAlZCIsIGluZGV4KTsKKyAgICAgIGdvdG8gbmV4dDsKKyAgICB9CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgInB1c2hpbmcgZnJvbSBzdHJlYW0gJWQsIGVtcHR5ICVkIG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAiLCBzaXplICVkLCBkdHM9JSIgR1NUX1RJTUVfRk9STUFUICIsIHB0cz0lIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIsIGR1cmF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVCwgaW5kZXgsIGVtcHR5LCBvZmZzZXQsIHNhbXBsZV9zaXplLAorICAgICAgR1NUX1RJTUVfQVJHUyAoZHRzKSwgR1NUX1RJTUVfQVJHUyAocHRzKSwgR1NUX1RJTUVfQVJHUyAoZHVyYXRpb24pKTsKKworICBpZiAoR19VTkxJS0VMWSAoZW1wdHkpKSB7CisgICAgLyogZW1wdHkgc2VnbWVudCwgcHVzaCBhIGdhcCBpZiB0aGVyZSdzIGEgc2Vjb25kIG9yIG1vcmUKKyAgICAgKiBkaWZmZXJlbmNlIGFuZCBtb3ZlIHRvIHRoZSBuZXh0IG9uZSAqLworICAgIGlmICgocHRzICsgZHVyYXRpb24gLSBzdHJlYW0tPnNlZ21lbnQucG9zaXRpb24pID49IEdTVF9TRUNPTkQpCisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHN0cmVhbS0+cGFkLCBnc3RfZXZlbnRfbmV3X2dhcCAocHRzLCBkdXJhdGlvbikpOworICAgIHN0cmVhbS0+c2VnbWVudC5wb3NpdGlvbiA9IHB0cyArIGR1cmF0aW9uOworICAgIGdvdG8gbmV4dDsKKyAgfQorCisgIC8qIGhtbSwgZW1wdHkgc2FtcGxlLCBza2lwIGFuZCBtb3ZlIHRvIG5leHQgc2FtcGxlICovCisgIGlmIChHX1VOTElLRUxZIChzYW1wbGVfc2l6ZSA8PSAwKSkKKyAgICBnb3RvIG5leHQ7CisKKyAgLyogbGFzdCBwdXNoZWQgc2FtcGxlIHdhcyBvdXQgb2YgYm91bmRhcnksIGdvdG8gbmV4dCBzYW1wbGUgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKEdTVF9QQURfTEFTVF9GTE9XX1JFVFVSTiAoc3RyZWFtLT5wYWQpID09IEdTVF9GTE9XX0VPUykpCisgICAgZ290byBuZXh0OworCisgIGlmIChzdHJlYW0tPm1heF9idWZmZXJfc2l6ZSA9PSAwIHx8IHNhbXBsZV9zaXplIDw9IHN0cmVhbS0+bWF4X2J1ZmZlcl9zaXplKSB7CisgICAgc2l6ZSA9IHNhbXBsZV9zaXplOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICJzaXplICVkIGxhcmdlciB0aGFuIHN0cmVhbSBtYXhfYnVmZmVyX3NpemUgJWQsIHRyaW1taW5nIiwKKyAgICAgICAgc2FtcGxlX3NpemUsIHN0cmVhbS0+bWF4X2J1ZmZlcl9zaXplKTsKKyAgICBzaXplID0KKyAgICAgICAgTUlOIChzYW1wbGVfc2l6ZSAtIHN0cmVhbS0+b2Zmc2V0X2luX3NhbXBsZSwgc3RyZWFtLT5tYXhfYnVmZmVyX3NpemUpOworICB9CisKKyAgaWYgKHF0ZGVtdXgtPmNlbmNfYXV4X2luZm9fb2Zmc2V0ID4gMCkgeworICAgIEdzdE1hcEluZm8gbWFwOworICAgIEdzdEJ5dGVSZWFkZXIgYnI7CisgICAgR3N0QnVmZmVyICphdXhfaW5mbyA9IE5VTEw7CisKKyAgICAvKiBwdWxsIHRoZSBkYXRhIHN0b3JlZCBiZWZvcmUgdGhlIHNhbXBsZSAqLworICAgIHJldCA9CisgICAgICAgIGdzdF9xdGRlbXV4X3B1bGxfYXRvbSAocXRkZW11eCwgcXRkZW11eC0+b2Zmc2V0LAorICAgICAgICBvZmZzZXQgKyBzdHJlYW0tPm9mZnNldF9pbl9zYW1wbGUgLSBxdGRlbXV4LT5vZmZzZXQsICZhdXhfaW5mbyk7CisgICAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykpCisgICAgICBnb3RvIGJlYWNoOworICAgIGdzdF9idWZmZXJfbWFwIChhdXhfaW5mbywgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicGFyc2luZyBjZW5jIGF1eGlsaWFyeSBpbmZvIik7CisgICAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZiciwgbWFwLmRhdGEgKyA4LCBtYXAuc2l6ZSk7CisgICAgaWYgKCFxdGRlbXV4X3BhcnNlX2NlbmNfYXV4X2luZm8gKHF0ZGVtdXgsIHN0cmVhbSwgJmJyLAorICAgICAgICAgICAgcXRkZW11eC0+Y2VuY19hdXhfaW5mb19zaXplcywgcXRkZW11eC0+Y2VuY19hdXhfc2FtcGxlX2NvdW50KSkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgImZhaWxlZCB0byBwYXJzZSBjZW5jIGF1eGlsaWFyeSBpbmZvIik7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChhdXhfaW5mbywgJm1hcCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChhdXhfaW5mbyk7CisgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgIGdvdG8gYmVhY2g7CisgICAgfQorICAgIGdzdF9idWZmZXJfdW5tYXAgKGF1eF9pbmZvLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChhdXhfaW5mbyk7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInJlYWRpbmcgJWQgYnl0ZXMgQCAlIiBHX0dVSU5UNjRfRk9STUFULCBzaXplLAorICAgICAgb2Zmc2V0KTsKKworICBpZiAoc3RyZWFtLT51c2VfYWxsb2NhdG9yKSB7CisgICAgLyogaWYgd2UgaGF2ZSBhIHBlci1zdHJlYW0gYWxsb2NhdG9yLCB1c2UgaXQgKi8KKyAgICBidWYgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoc3RyZWFtLT5hbGxvY2F0b3IsIHNpemUsICZzdHJlYW0tPnBhcmFtcyk7CisgIH0KKworICByZXQgPSBnc3RfcXRkZW11eF9wdWxsX2F0b20gKHF0ZGVtdXgsIG9mZnNldCArIHN0cmVhbS0+b2Zmc2V0X2luX3NhbXBsZSwKKyAgICAgIHNpemUsICZidWYpOworICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkKKyAgICBnb3RvIGJlYWNoOworCisgIGlmIChzaXplICE9IHNhbXBsZV9zaXplKSB7CisgICAgcHRzICs9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKEdTVF9TRUNPTkQsCisgICAgICAgIHN0cmVhbS0+b2Zmc2V0X2luX3NhbXBsZSAvIENVUl9TVFJFQU0gKHN0cmVhbSktPmJ5dGVzX3Blcl9mcmFtZSwKKyAgICAgICAgc3RyZWFtLT50aW1lc2NhbGUpOworICAgIGR0cyArPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChHU1RfU0VDT05ELAorICAgICAgICBzdHJlYW0tPm9mZnNldF9pbl9zYW1wbGUgLyBDVVJfU1RSRUFNIChzdHJlYW0pLT5ieXRlc19wZXJfZnJhbWUsCisgICAgICAgIHN0cmVhbS0+dGltZXNjYWxlKTsKKyAgICBkdXJhdGlvbiA9CisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKEdTVF9TRUNPTkQsCisgICAgICAgIHNpemUgLyBDVVJfU1RSRUFNIChzdHJlYW0pLT5ieXRlc19wZXJfZnJhbWUsIHN0cmVhbS0+dGltZXNjYWxlKTsKKyAgfQorCisgIHJldCA9IGdzdF9xdGRlbXV4X2RlY29yYXRlX2FuZF9wdXNoX2J1ZmZlciAocXRkZW11eCwgc3RyZWFtLCBidWYsCisgICAgICBkdHMsIHB0cywgZHVyYXRpb24sIGtleWZyYW1lLCBtaW5fdGltZSwgb2Zmc2V0KTsKKworICBpZiAoc2l6ZSAhPSBzYW1wbGVfc2l6ZSkgeworICAgIFF0RGVtdXhTYW1wbGUgKnNhbXBsZSA9ICZzdHJlYW0tPnNhbXBsZXNbc3RyZWFtLT5zYW1wbGVfaW5kZXhdOworICAgIFF0RGVtdXhTZWdtZW50ICpzZWdtZW50ID0gJnN0cmVhbS0+c2VnbWVudHNbc3RyZWFtLT5zZWdtZW50X2luZGV4XTsKKworICAgIEdzdENsb2NrVGltZSB0aW1lX3Bvc2l0aW9uID0gUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUgKHN0cmVhbSwKKyAgICAgICAgc2FtcGxlLT50aW1lc3RhbXAgKworICAgICAgICBzdHJlYW0tPm9mZnNldF9pbl9zYW1wbGUgLyBDVVJfU1RSRUFNIChzdHJlYW0pLT5ieXRlc19wZXJfZnJhbWUpOworICAgIGlmICh0aW1lX3Bvc2l0aW9uID49IHNlZ21lbnQtPm1lZGlhX3N0YXJ0KSB7CisgICAgICAvKiBpbnNpZGUgdGhlIHNlZ21lbnQsIHVwZGF0ZSB0aW1lX3Bvc2l0aW9uLCBsb29rcyB2ZXJ5IGZhbWlsaWFyIHRvCisgICAgICAgKiBHU3RyZWFtZXIgc2VnbWVudHMsIGRvZXNuJ3QgaXQ/ICovCisgICAgICBzdHJlYW0tPnRpbWVfcG9zaXRpb24gPSAodGltZV9wb3NpdGlvbiAtIHNlZ21lbnQtPm1lZGlhX3N0YXJ0KSArCisgICAgICAgICAgc2VnbWVudC0+dGltZTsKKyAgICB9IGVsc2UgeworICAgICAgLyogbm90IHlldCBpbiBzZWdtZW50LCB0aW1lIGRvZXMgbm90IHlldCBpbmNyZW1lbnQuIFRoaXMgbWVhbnMKKyAgICAgICAqIHRoYXQgd2UgYXJlIHN0aWxsIHByZXJvbGxpbmcga2V5ZnJhbWVzIHRvIHRoZSBkZWNvZGVyIHNvIGl0IGNhbgorICAgICAgICogZGVjb2RlIHRoZSBmaXJzdCBzYW1wbGUgb2YgdGhlIHNlZ21lbnQuICovCisgICAgICBzdHJlYW0tPnRpbWVfcG9zaXRpb24gPSBzZWdtZW50LT50aW1lOworICAgIH0KKyAgfQorCisgIC8qIGNvbWJpbmUgZmxvd3MgKi8KKyAgcmV0ID0gZ3N0X3F0ZGVtdXhfY29tYmluZV9mbG93cyAocXRkZW11eCwgc3RyZWFtLCByZXQpOworICAvKiBpZ25vcmUgdW5saW5rZWQsIHdlIHdpbGwgbm90IHB1c2ggb24gdGhlIHBhZCBhbnltb3JlIGFuZCB3ZSB3aWxsIEVPUyB3aGVuCisgICAqIHdlIGhhdmUgbm8gbW9yZSBkYXRhIGZvciB0aGUgcGFkIHRvIHB1c2ggKi8KKyAgaWYgKHJldCA9PSBHU1RfRkxPV19FT1MpCisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgc3RyZWFtLT5vZmZzZXRfaW5fc2FtcGxlICs9IHNpemU7CisgIGlmIChzdHJlYW0tPm9mZnNldF9pbl9zYW1wbGUgPj0gc2FtcGxlX3NpemUpIHsKKyAgICBnc3RfcXRkZW11eF9hZHZhbmNlX3NhbXBsZSAocXRkZW11eCwgc3RyZWFtKTsKKyAgfQorICBnb3RvIGJlYWNoOworCituZXh0OgorICBnc3RfcXRkZW11eF9hZHZhbmNlX3NhbXBsZSAocXRkZW11eCwgc3RyZWFtKTsKKworYmVhY2g6CisgIHJldHVybiByZXQ7CisKKyAgLyogc3BlY2lhbCBjYXNlcyAqLworZW9zOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIk5vIHNhbXBsZXMgbGVmdCBmb3IgYW55IHN0cmVhbXMgLSBFT1MiKTsKKyAgICByZXQgPSBHU1RfRkxPV19FT1M7CisgICAgZ290byBiZWFjaDsKKyAgfQorZW9zX3N0cmVhbToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJObyBzYW1wbGVzIGxlZnQgZm9yIHN0cmVhbSIpOworICAgIC8qIEVPUyB3aWxsIGJlIHJhaXNlZCBpZiBhbGwgYXJlIEVPUyAqLworICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIGdvdG8gYmVhY2g7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X2xvb3AgKEdzdFBhZCAqIHBhZCkKK3sKKyAgR3N0UVREZW11eCAqcXRkZW11eDsKKyAgZ3VpbnQ2NCBjdXJfb2Zmc2V0OworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBxdGRlbXV4ID0gR1NUX1FUREVNVVggKGdzdF9wYWRfZ2V0X3BhcmVudCAocGFkKSk7CisKKyAgY3VyX29mZnNldCA9IHF0ZGVtdXgtPm9mZnNldDsKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJsb29wIGF0IHBvc2l0aW9uICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgc3RhdGUgJXMiLAorICAgICAgY3VyX29mZnNldCwgcXRfZGVtdXhfc3RhdGVfc3RyaW5nIChxdGRlbXV4LT5zdGF0ZSkpOworCisgIHN3aXRjaCAocXRkZW11eC0+c3RhdGUpIHsKKyAgICBjYXNlIFFUREVNVVhfU1RBVEVfSU5JVElBTDoKKyAgICBjYXNlIFFUREVNVVhfU1RBVEVfSEVBREVSOgorICAgICAgcmV0ID0gZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9oZWFkZXIgKHF0ZGVtdXgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBRVERFTVVYX1NUQVRFX01PVklFOgorICAgICAgcmV0ID0gZ3N0X3F0ZGVtdXhfbG9vcF9zdGF0ZV9tb3ZpZSAocXRkZW11eCk7CisgICAgICBpZiAocXRkZW11eC0+c2VnbWVudC5yYXRlIDwgMCAmJiByZXQgPT0gR1NUX0ZMT1dfRU9TKSB7CisgICAgICAgIHJldCA9IGdzdF9xdGRlbXV4X3NlZWtfdG9fcHJldmlvdXNfa2V5ZnJhbWUgKHF0ZGVtdXgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIG91Y2ggKi8KKyAgICAgIGdvdG8gaW52YWxpZF9zdGF0ZTsKKyAgfQorCisgIC8qIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLCBwYXVzZSAqLworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gcGF1c2U7CisKK2RvbmU6CisgIGdzdF9vYmplY3RfdW5yZWYgKHF0ZGVtdXgpOworICByZXR1cm47CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX3N0YXRlOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0ZGVtdXgsIFNUUkVBTSwgRkFJTEVELAorICAgICAgICAoTlVMTCksICgic3RyZWFtaW5nIHN0b3BwZWQsIGludmFsaWQgc3RhdGUiKSk7CisgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChwYWQpOworICAgIGdzdF9xdGRlbXV4X3B1c2hfZXZlbnQgKHF0ZGVtdXgsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3BhdXNlOgorICB7CisgICAgY29uc3QgZ2NoYXIgKnJlYXNvbiA9IGdzdF9mbG93X2dldF9uYW1lIChyZXQpOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJwYXVzaW5nIHRhc2ssIHJlYXNvbiAlcyIsIHJlYXNvbik7CisKKyAgICBnc3RfcGFkX3BhdXNlX3Rhc2sgKHBhZCk7CisKKyAgICAvKiBmYXRhbCBlcnJvcnMgbmVlZCBzcGVjaWFsIGFjdGlvbnMgKi8KKyAgICAvKiBjaGVjayBFT1MgKi8KKyAgICBpZiAocmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgICAgaWYgKHF0ZGVtdXgtPm5fc3RyZWFtcyA9PSAwKSB7CisgICAgICAgIC8qIHdlIGhhdmUgbm8gc3RyZWFtcywgcG9zdCBhbiBlcnJvciAqLworICAgICAgICBnc3RfcXRkZW11eF9wb3N0X25vX3BsYXlhYmxlX3N0cmVhbV9lcnJvciAocXRkZW11eCk7CisgICAgICB9CisgICAgICBpZiAocXRkZW11eC0+c2VnbWVudC5mbGFncyAmIEdTVF9TRUVLX0ZMQUdfU0VHTUVOVCkgeworICAgICAgICBnaW50NjQgc3RvcDsKKworICAgICAgICBpZiAoKHN0b3AgPSBxdGRlbXV4LT5zZWdtZW50LnN0b3ApID09IC0xKQorICAgICAgICAgIHN0b3AgPSBxdGRlbXV4LT5zZWdtZW50LmR1cmF0aW9uOworCisgICAgICAgIGlmIChxdGRlbXV4LT5zZWdtZW50LnJhdGUgPj0gMCkgeworICAgICAgICAgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisgICAgICAgICAgR3N0RXZlbnQgKmV2ZW50OworCisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJTZW5kaW5nIHNlZ21lbnQgZG9uZSwgYXQgZW5kIG9mIHNlZ21lbnQiKTsKKyAgICAgICAgICBtZXNzYWdlID0gZ3N0X21lc3NhZ2VfbmV3X3NlZ21lbnRfZG9uZSAoR1NUX09CSkVDVF9DQVNUIChxdGRlbXV4KSwKKyAgICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBzdG9wKTsKKyAgICAgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudF9kb25lIChHU1RfRk9STUFUX1RJTUUsIHN0b3ApOworICAgICAgICAgIGlmIChxdGRlbXV4LT5zZWdtZW50X3NlcW51bSAhPSBHU1RfU0VRTlVNX0lOVkFMSUQpIHsKKyAgICAgICAgICAgIGdzdF9tZXNzYWdlX3NldF9zZXFudW0gKG1lc3NhZ2UsIHF0ZGVtdXgtPnNlZ21lbnRfc2VxbnVtKTsKKyAgICAgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgcXRkZW11eC0+c2VnbWVudF9zZXFudW0pOworICAgICAgICAgIH0KKyAgICAgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHF0ZGVtdXgpLCBtZXNzYWdlKTsKKyAgICAgICAgICBnc3RfcXRkZW11eF9wdXNoX2V2ZW50IChxdGRlbXV4LCBldmVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgICAgICAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICAgICAgICAvKiAgRm9yIFJldmVyc2UgUGxheWJhY2sgKi8KKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIlNlbmRpbmcgc2VnbWVudCBkb25lLCBhdCBzdGFydCBvZiBzZWdtZW50Iik7CisgICAgICAgICAgbWVzc2FnZSA9IGdzdF9tZXNzYWdlX25ld19zZWdtZW50X2RvbmUgKEdTVF9PQkpFQ1RfQ0FTVCAocXRkZW11eCksCisgICAgICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwgcXRkZW11eC0+c2VnbWVudC5zdGFydCk7CisgICAgICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnRfZG9uZSAoR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgICAgICBxdGRlbXV4LT5zZWdtZW50LnN0YXJ0KTsKKyAgICAgICAgICBpZiAocXRkZW11eC0+c2VnbWVudF9zZXFudW0gIT0gR1NUX1NFUU5VTV9JTlZBTElEKSB7CisgICAgICAgICAgICBnc3RfbWVzc2FnZV9zZXRfc2VxbnVtIChtZXNzYWdlLCBxdGRlbXV4LT5zZWdtZW50X3NlcW51bSk7CisgICAgICAgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZXZlbnQsIHF0ZGVtdXgtPnNlZ21lbnRfc2VxbnVtKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChxdGRlbXV4KSwgbWVzc2FnZSk7CisgICAgICAgICAgZ3N0X3F0ZGVtdXhfcHVzaF9ldmVudCAocXRkZW11eCwgZXZlbnQpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJTZW5kaW5nIEVPUyBhdCBlbmQgb2Ygc2VnbWVudCIpOworICAgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfZW9zICgpOworICAgICAgICBpZiAocXRkZW11eC0+c2VnbWVudF9zZXFudW0gIT0gR1NUX1NFUU5VTV9JTlZBTElEKQorICAgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgcXRkZW11eC0+c2VnbWVudF9zZXFudW0pOworICAgICAgICBnc3RfcXRkZW11eF9wdXNoX2V2ZW50IChxdGRlbXV4LCBldmVudCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXQgPT0gR1NUX0ZMT1dfTk9UX0xJTktFRCB8fCByZXQgPCBHU1RfRkxPV19FT1MpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0ZMT1dfRVJST1IgKHF0ZGVtdXgsIHJldCk7CisgICAgICBnc3RfcXRkZW11eF9wdXNoX2V2ZW50IChxdGRlbXV4LCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgICAgfQorICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCisvKgorICogaGFzX25leHRfZW50cnkKKyAqCisgKiBSZXR1cm5zIGlmIHRoZXJlIGFyZSBzYW1wbGVzIHRvIGJlIHBsYXllZC4KKyAqLworc3RhdGljIGdib29sZWFuCitoYXNfbmV4dF9lbnRyeSAoR3N0UVREZW11eCAqIGRlbXV4KQoreworICBRdERlbXV4U3RyZWFtICpzdHJlYW07CisgIGludCBpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiQ2hlY2tpbmcgaWYgdGhlcmUgYXJlIHNhbXBsZXMgbm90IHBsYXllZCB5ZXQiKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgc3RyZWFtID0gZGVtdXgtPnN0cmVhbXNbaV07CisKKyAgICBpZiAoc3RyZWFtLT5zYW1wbGVfaW5kZXggPT0gLTEpIHsKKyAgICAgIHN0cmVhbS0+c2FtcGxlX2luZGV4ID0gMDsKKyAgICAgIHN0cmVhbS0+b2Zmc2V0X2luX3NhbXBsZSA9IDA7CisgICAgfQorCisgICAgaWYgKHN0cmVhbS0+c2FtcGxlX2luZGV4ID49IHN0cmVhbS0+bl9zYW1wbGVzKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJzdHJlYW0gJWQgc2FtcGxlcyBleGhhdXN0ZWQiLCBpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkZvdW5kIGEgc2FtcGxlIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlRoZXJlIHdhc24ndCBhbnkgbmV4dCBzYW1wbGUiKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKgorICogbmV4dF9lbnRyeV9zaXplCisgKgorICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgZW50cnkgYXQgdGhlIGN1cnJlbnQgb2Zmc2V0LgorICogSWYgLTEsIHRoZXJlIGFyZSBub25lICh3aGljaCBtZWFucyBFT1Mgb3IgZW1wdHkgZmlsZSkuCisgKi8KK3N0YXRpYyBndWludDY0CituZXh0X2VudHJ5X3NpemUgKEdzdFFURGVtdXggKiBkZW11eCkKK3sKKyAgUXREZW11eFN0cmVhbSAqc3RyZWFtOworICBpbnQgaTsKKyAgaW50IHNtYWxsaWR4ID0gLTE7CisgIGd1aW50NjQgc21hbGxvZmZzID0gKGd1aW50NjQpIC0gMTsKKyAgUXREZW11eFNhbXBsZSAqc2FtcGxlOworCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIkZpbmRpbmcgZW50cnkgYXQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBkZW11eC0+b2Zmc2V0KTsKKworICBmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgc3RyZWFtID0gZGVtdXgtPnN0cmVhbXNbaV07CisKKyAgICBpZiAoc3RyZWFtLT5zYW1wbGVfaW5kZXggPT0gLTEpIHsKKyAgICAgIHN0cmVhbS0+c2FtcGxlX2luZGV4ID0gMDsKKyAgICAgIHN0cmVhbS0+b2Zmc2V0X2luX3NhbXBsZSA9IDA7CisgICAgfQorCisgICAgaWYgKHN0cmVhbS0+c2FtcGxlX2luZGV4ID49IHN0cmVhbS0+bl9zYW1wbGVzKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJzdHJlYW0gJWQgc2FtcGxlcyBleGhhdXN0ZWQiLCBpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmICghcXRkZW11eF9wYXJzZV9zYW1wbGVzIChkZW11eCwgc3RyZWFtLCBzdHJlYW0tPnNhbXBsZV9pbmRleCkpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIlBhcnNpbmcgb2YgaW5kZXggJXUgZnJvbSBzdGJsIGF0b20gZmFpbGVkISIsCisgICAgICAgICAgc3RyZWFtLT5zYW1wbGVfaW5kZXgpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHNhbXBsZSA9ICZzdHJlYW0tPnNhbXBsZXNbc3RyZWFtLT5zYW1wbGVfaW5kZXhdOworCisgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAiQ2hlY2tpbmcgU3RyZWFtICVkIChzYW1wbGVfaW5kZXg6JWQgLyBvZmZzZXQ6JSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAiIC8gc2l6ZTolIiBHX0dVSU5UMzJfRk9STUFUICIpIiwgaSwgc3RyZWFtLT5zYW1wbGVfaW5kZXgsCisgICAgICAgIHNhbXBsZS0+b2Zmc2V0LCBzYW1wbGUtPnNpemUpOworCisgICAgaWYgKCgoc21hbGxvZmZzID09IC0xKQorICAgICAgICAgICAgfHwgKHNhbXBsZS0+b2Zmc2V0IDwgc21hbGxvZmZzKSkgJiYgKHNhbXBsZS0+c2l6ZSkpIHsKKyAgICAgIHNtYWxsaWR4ID0gaTsKKyAgICAgIHNtYWxsb2ZmcyA9IHNhbXBsZS0+b2Zmc2V0OworICAgIH0KKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwKKyAgICAgICJzdHJlYW0gJWQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBkZW11eC0+b2Zmc2V0IDolIgorICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgc21hbGxpZHgsIHNtYWxsb2ZmcywgZGVtdXgtPm9mZnNldCk7CisKKyAgaWYgKHNtYWxsaWR4ID09IC0xKQorICAgIHJldHVybiAtMTsKKworICBzdHJlYW0gPSBkZW11eC0+c3RyZWFtc1tzbWFsbGlkeF07CisgIHNhbXBsZSA9ICZzdHJlYW0tPnNhbXBsZXNbc3RyZWFtLT5zYW1wbGVfaW5kZXhdOworCisgIGlmIChzYW1wbGUtPm9mZnNldCA+PSBkZW11eC0+b2Zmc2V0KSB7CisgICAgZGVtdXgtPnRvZHJvcCA9IHNhbXBsZS0+b2Zmc2V0IC0gZGVtdXgtPm9mZnNldDsKKyAgICByZXR1cm4gc2FtcGxlLT5zaXplICsgZGVtdXgtPnRvZHJvcDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgIlRoZXJlIHdhc24ndCBhbnkgZW50cnkgYXQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIGRlbXV4LT5vZmZzZXQpOworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9wb3N0X3Byb2dyZXNzIChHc3RRVERlbXV4ICogZGVtdXgsIGdpbnQgbnVtLCBnaW50IGRlbm9tKQoreworICBnaW50IHBlcmMgPSAoZ2ludCkgKChnZG91YmxlKSBudW0gKiAxMDAuMCAvIChnZG91YmxlKSBkZW5vbSk7CisKKyAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChkZW11eCksCisgICAgICBnc3RfbWVzc2FnZV9uZXdfZWxlbWVudCAoR1NUX09CSkVDVF9DQVNUIChkZW11eCksCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJwcm9ncmVzcyIsICJwZXJjZW50IiwgR19UWVBFX0lOVCwgcGVyYywgTlVMTCkpKTsKK30KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3NlZWtfb2Zmc2V0IChHc3RRVERlbXV4ICogZGVtdXgsIGd1aW50NjQgb2Zmc2V0KQoreworICBHc3RFdmVudCAqZXZlbnQ7CisgIGdib29sZWFuIHJlcyA9IDA7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJTZWVraW5nIHRvICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG9mZnNldCk7CisKKyAgZXZlbnQgPQorICAgICAgZ3N0X2V2ZW50X25ld19zZWVrICgxLjAsIEdTVF9GT1JNQVRfQllURVMsCisgICAgICBHU1RfU0VFS19GTEFHX0ZMVVNIIHwgR1NUX1NFRUtfRkxBR19BQ0NVUkFURSwgR1NUX1NFRUtfVFlQRV9TRVQsIG9mZnNldCwKKyAgICAgIEdTVF9TRUVLX1RZUEVfTk9ORSwgLTEpOworCisgIC8qIHN0b3JlIHNlcW51bSB0byBkcm9wIGZsdXNoIGV2ZW50cywgdGhleSBkb24ndCBuZWVkIHRvIHJlYWNoIGRvd25zdHJlYW0gKi8KKyAgZGVtdXgtPm9mZnNldF9zZWVrX3NlcW51bSA9IGdzdF9ldmVudF9nZXRfc2VxbnVtIChldmVudCk7CisgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAoZGVtdXgtPnNpbmtwYWQsIGV2ZW50KTsKKyAgZGVtdXgtPm9mZnNldF9zZWVrX3NlcW51bSA9IEdTVF9TRVFOVU1fSU5WQUxJRDsKKworICByZXR1cm4gcmVzOworfQorCisvKiBjaGVjayBmb3Igc2Vla2FibGUgdXBzdHJlYW0sIGFib3ZlIGFuZCBiZXlvbmQgYSBtZXJlIHF1ZXJ5ICovCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfY2hlY2tfc2Vla2FiaWxpdHkgKEdzdFFURGVtdXggKiBkZW11eCkKK3sKKyAgR3N0UXVlcnkgKnF1ZXJ5OworICBnYm9vbGVhbiBzZWVrYWJsZSA9IEZBTFNFOworICBnaW50NjQgc3RhcnQgPSAtMSwgc3RvcCA9IC0xOworCisgIGlmIChkZW11eC0+dXBzdHJlYW1fc2l6ZSkKKyAgICByZXR1cm47CisKKyAgaWYgKGRlbXV4LT51cHN0cmVhbV9mb3JtYXRfaXNfdGltZSkKKyAgICByZXR1cm47CisKKyAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X3NlZWtpbmcgKEdTVF9GT1JNQVRfQllURVMpOworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeSAoZGVtdXgtPnNpbmtwYWQsIHF1ZXJ5KSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic2Vla2luZyBxdWVyeSBmYWlsZWQiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksIE5VTEwsICZzZWVrYWJsZSwgJnN0YXJ0LCAmc3RvcCk7CisKKyAgLyogdHJ5IGhhcmRlciB0byBxdWVyeSB1cHN0cmVhbSBzaXplIGlmIHdlIGRpZG4ndCBnZXQgaXQgdGhlIGZpcnN0IHRpbWUgKi8KKyAgaWYgKHNlZWthYmxlICYmIHN0b3AgPT0gLTEpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImRvaW5nIGR1cmF0aW9uIHF1ZXJ5IHRvIGZpeCB1cCB1bnNldCBzdG9wIik7CisgICAgZ3N0X3BhZF9wZWVyX3F1ZXJ5X2R1cmF0aW9uIChkZW11eC0+c2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywgJnN0b3ApOworICB9CisKKyAgLyogaWYgdXBzdHJlYW0gZG9lc24ndCBrbm93IHRoZSBzaXplLCBpdCdzIGxpa2VseSB0aGF0IGl0J3Mgbm90IHNlZWthYmxlIGluCisgICAqIHByYWN0aWNlIGV2ZW4gaWYgaXQgdGVjaG5pY2FsbHkgbWF5IGJlIHNlZWthYmxlICovCisgIGlmIChzZWVrYWJsZSAmJiAoc3RhcnQgIT0gMCB8fCBzdG9wIDw9IHN0YXJ0KSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic2Vla2FibGUgYnV0IHVua25vd24gc3RhcnQvc3RvcCAtPiBkaXNhYmxlIik7CisgICAgc2Vla2FibGUgPSBGQUxTRTsKKyAgfQorCitkb25lOgorICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInNlZWthYmxlOiAlZCAoJSIgR19HVUlOVDY0X0ZPUk1BVCAiIC0gJSIKKyAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIikiLCBzZWVrYWJsZSwgc3RhcnQsIHN0b3ApOworICBkZW11eC0+dXBzdHJlYW1fc2Vla2FibGUgPSBzZWVrYWJsZTsKKyAgZGVtdXgtPnVwc3RyZWFtX3NpemUgPSBzZWVrYWJsZSA/IHN0b3AgOiAtMTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X2Ryb3BfZGF0YSAoR3N0UVREZW11eCAqIGRlbXV4LCBnaW50IGJ5dGVzKQoreworICBnX3JldHVybl9pZl9mYWlsIChieXRlcyA8PSBkZW11eC0+dG9kcm9wKTsKKworICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJEcm9wcGluZyAlZCBieXRlcyIsIGJ5dGVzKTsKKyAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGRlbXV4LT5hZGFwdGVyLCBieXRlcyk7CisgIGRlbXV4LT5uZWVkZWRieXRlcyAtPSBieXRlczsKKyAgZGVtdXgtPm9mZnNldCArPSBieXRlczsKKyAgZGVtdXgtPnRvZHJvcCAtPSBieXRlczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X2NoZWNrX3NlbmRfcGVuZGluZ19zZWdtZW50IChHc3RRVERlbXV4ICogZGVtdXgpCit7CisgIGlmIChHX1VOTElLRUxZIChkZW11eC0+cGVuZGluZ19uZXdzZWdtZW50KSkgeworICAgIGdpbnQgaTsKKworICAgIGdzdF9xdGRlbXV4X3B1c2hfcGVuZGluZ19uZXdzZWdtZW50IChkZW11eCk7CisgICAgLyogY2xlYXIgdG8gc2VuZCB0YWdzIG9uIGFsbCBzdHJlYW1zICovCisgICAgZm9yIChpID0gMDsgaSA8IGRlbXV4LT5uX3N0cmVhbXM7IGkrKykgeworICAgICAgUXREZW11eFN0cmVhbSAqc3RyZWFtOworICAgICAgc3RyZWFtID0gZGVtdXgtPnN0cmVhbXNbaV07CisgICAgICBnc3RfcXRkZW11eF9wdXNoX3RhZ3MgKGRlbXV4LCBzdHJlYW0pOworICAgICAgaWYgKENVUl9TVFJFQU0gKHN0cmVhbSktPnNwYXJzZSkgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKGRlbXV4LCAiU2VuZGluZyBnYXAgZXZlbnQgb24gc3RyZWFtICVkIiwgaSk7CisgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5wYWQsCisgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X2dhcCAoc3RyZWFtLT5zZWdtZW50LnBvc2l0aW9uLCBHU1RfQ0xPQ0tfVElNRV9OT05FKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9zZW5kX2dhcF9mb3Jfc2VnbWVudCAoR3N0UVREZW11eCAqIGRlbXV4LAorICAgIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sIGdpbnQgc2VnbWVudF9pbmRleCwgR3N0Q2xvY2tUaW1lIHBvcykKK3sKKyAgR3N0Q2xvY2tUaW1lIHRzLCBkdXI7CisgIEdzdEV2ZW50ICpnYXA7CisKKyAgdHMgPSBwb3M7CisgIGR1ciA9CisgICAgICBzdHJlYW0tPnNlZ21lbnRzW3NlZ21lbnRfaW5kZXhdLmR1cmF0aW9uIC0gKHBvcyAtCisgICAgICBzdHJlYW0tPnNlZ21lbnRzW3NlZ21lbnRfaW5kZXhdLnRpbWUpOworICBnYXAgPSBnc3RfZXZlbnRfbmV3X2dhcCAodHMsIGR1cik7CisgIHN0cmVhbS0+dGltZV9wb3NpdGlvbiArPSBkdXI7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3RyZWFtLT5wYWQsICJQdXNoaW5nIGdhcCBmb3IgZW1wdHkgIgorICAgICAgInNlZ21lbnQ6ICUiIEdTVF9QVFJfRk9STUFULCBnYXApOworICBnc3RfcGFkX3B1c2hfZXZlbnQgKHN0cmVhbS0+cGFkLCBnYXApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfc3RyZWFtX3NlbmRfaW5pdGlhbF9nYXBfc2VnbWVudHMgKEdzdFFURGVtdXggKiBkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtKQoreworICBnaW50IGk7CisKKyAgLyogUHVzaCBhbnkgaW5pdGlhbCBnYXAgc2VnbWVudHMgYmVmb3JlIHByb2NlZWRpbmcgdG8gdGhlCisgICAqICdyZWFsJyBkYXRhICovCisgIGZvciAoaSA9IDA7IGkgPCBzdHJlYW0tPm5fc2VnbWVudHM7IGkrKykgeworICAgIGdzdF9xdGRlbXV4X2FjdGl2YXRlX3NlZ21lbnQgKGRlbXV4LCBzdHJlYW0sIGksIHN0cmVhbS0+dGltZV9wb3NpdGlvbik7CisKKyAgICBpZiAoUVRTRUdNRU5UX0lTX0VNUFRZICgmc3RyZWFtLT5zZWdtZW50c1tpXSkpIHsKKyAgICAgIGdzdF9xdGRlbXV4X3NlbmRfZ2FwX2Zvcl9zZWdtZW50IChkZW11eCwgc3RyZWFtLCBpLAorICAgICAgICAgIHN0cmVhbS0+dGltZV9wb3NpdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIE9ubHkgc3VwcG9ydCBlbXB0eSBzZWdtZW50IGF0IHRoZSBiZWdpbm5pbmcgZm9sbG93ZWQgYnkKKyAgICAgICAqIG9uZSBub24tZW1wdHkgc2VnbWVudCwgdGhpcyB3YXMgY2hlY2tlZCB3aGVuIHBhcnNpbmcgdGhlCisgICAgICAgKiBlZHRzIGF0b20sIGFycml2aW5nIGhlcmUgaXMgdW5leHBlY3RlZCAqLworICAgICAgZ19hc3NlcnQgKGkgKyAxID09IHN0cmVhbS0+bl9zZWdtZW50cyk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9xdGRlbXV4X2NoYWluIChHc3RQYWQgKiBzaW5rcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGluYnVmKQoreworICBHc3RRVERlbXV4ICpkZW11eDsKKworICBkZW11eCA9IEdTVF9RVERFTVVYIChwYXJlbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgIlJlY2VpdmVkIGJ1ZmZlciBwdHM6JSIgR1NUX1RJTUVfRk9STUFUICIgZHRzOiUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiBvZmZzZXQ6JSIgR19HVUlOVDY0X0ZPUk1BVCAiIHNpemU6JSIgR19HU0laRV9GT1JNQVQgIiBkZW11eCBvZmZzZXQ6JSIKKyAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfUFRTIChpbmJ1ZikpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVFMgKGluYnVmKSksIEdTVF9CVUZGRVJfT0ZGU0VUIChpbmJ1ZiksCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChpbmJ1ZiksIGRlbXV4LT5vZmZzZXQpOworCisgIGlmIChHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChpbmJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpKSB7CisgICAgZ2Jvb2xlYW4gaXNfZ2FwX2lucHV0ID0gRkFMU0U7CisgICAgZ2ludCBpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJHb3QgRElTQ09OVCwgbWFya2luZyBhbGwgc3RyZWFtcyBhcyBESVNDT05UIik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgICBkZW11eC0+c3RyZWFtc1tpXS0+ZGlzY29udCA9IFRSVUU7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgd2UgY2FuIGxhbmQgYmFjayBvbiBvdXIgZmVldCBpbiB0aGUgY2FzZSB3aGVyZSB1cHN0cmVhbSBpcworICAgICAqIGhhbmRsaW5nIHRoZSBzZWVraW5nL3B1c2hpbmcgb2Ygc2FtcGxlcyB3aXRoIGdhcHMgaW4gYmV0d2VlbiAobGlrZQorICAgICAqIGluIHRoZSBjYXNlIG9mIHRyaWNrLW1vZGUgREFTSCBmb3IgZXhhbXBsZSkgKi8KKyAgICBpZiAoZGVtdXgtPnVwc3RyZWFtX2Zvcm1hdF9pc190aW1lCisgICAgICAgICYmIEdTVF9CVUZGRVJfT0ZGU0VUIChpbmJ1ZikgIT0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORSkgeworICAgICAgZ2ludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IGRlbXV4LT5uX3N0cmVhbXM7IGkrKykgeworICAgICAgICBndWludDMyIHJlczsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgIlN0cmVhbSAjJWQgLCBjaGVja2luZyBpZiBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAgICAgIiBpcyBhIHNhbXBsZSBzdGFydCIsIGksIEdTVF9CVUZGRVJfT0ZGU0VUIChpbmJ1ZikpOworICAgICAgICByZXMgPQorICAgICAgICAgICAgZ3N0X3F0ZGVtdXhfZmluZF9pbmRleF9mb3JfZ2l2ZW5fbWVkaWFfb2Zmc2V0X2xpbmVhciAoZGVtdXgsCisgICAgICAgICAgICBkZW11eC0+c3RyZWFtc1tpXSwgR1NUX0JVRkZFUl9PRkZTRVQgKGluYnVmKSk7CisgICAgICAgIGlmIChyZXMgIT0gLTEpIHsKKyAgICAgICAgICBRdERlbXV4U2FtcGxlICpzYW1wbGUgPSAmZGVtdXgtPnN0cmVhbXNbaV0tPnNhbXBsZXNbcmVzXTsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICJDaGVja2luZyBpZiBzYW1wbGUgJWQgZnJvbSBzdHJlYW0gJWQgaXMgdmFsaWQgKG9mZnNldDolIgorICAgICAgICAgICAgICBHX0dVSU5UNjRfRk9STUFUICIgc2l6ZTolIiBHX0dVSU5UMzJfRk9STUFUICIpIiwgcmVzLCBpLAorICAgICAgICAgICAgICBzYW1wbGUtPm9mZnNldCwgc2FtcGxlLT5zaXplKTsKKyAgICAgICAgICBpZiAoc2FtcGxlLT5vZmZzZXQgPT0gR1NUX0JVRkZFUl9PRkZTRVQgKGluYnVmKSkgeworICAgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAgICJuZXcgYnVmZmVyIGNvcnJlc3BvbmRzIHRvIGEgdmFsaWQgc2FtcGxlIDogJSIgR19HVUlOVDMyX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICByZXMpOworICAgICAgICAgICAgaXNfZ2FwX2lucHV0ID0gVFJVRTsKKyAgICAgICAgICAgIC8qIFdlIGNhbiBnbyBiYWNrIHRvIHN0YW5kYXJkIHBsYXliYWNrIG1vZGUgKi8KKyAgICAgICAgICAgIGRlbXV4LT5zdGF0ZSA9IFFUREVNVVhfU1RBVEVfTU9WSUU7CisgICAgICAgICAgICAvKiBSZW1lbWJlciB3aGljaCBzYW1wbGUgdGhpcyBzdHJlYW0gaXMgYXQgKi8KKyAgICAgICAgICAgIGRlbXV4LT5zdHJlYW1zW2ldLT5zYW1wbGVfaW5kZXggPSByZXM7CisgICAgICAgICAgICAvKiBGaW5hbGx5IHVwZGF0ZSBhbGwgcHVzaC1iYXNlZCB2YWx1ZXMgdG8gdGhlIGV4cGVjdGVkIHZhbHVlcyAqLworICAgICAgICAgICAgZGVtdXgtPm5lZWRlZGJ5dGVzID0gZGVtdXgtPnN0cmVhbXNbaV0tPnNhbXBsZXNbcmVzXS5zaXplOworICAgICAgICAgICAgZGVtdXgtPm9mZnNldCA9IEdTVF9CVUZGRVJfT0ZGU0VUIChpbmJ1Zik7CisgICAgICAgICAgICBkZW11eC0+bWRhdGxlZnQgPQorICAgICAgICAgICAgICAgIGRlbXV4LT5tZGF0c2l6ZSAtIGRlbXV4LT5vZmZzZXQgKyBkZW11eC0+bWRhdG9mZnNldDsKKyAgICAgICAgICAgIGRlbXV4LT50b2Ryb3AgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFpc19nYXBfaW5wdXQpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJSZXNldHRpbmcsIGFjdHVhbCBESVNDT05UIik7CisgICAgICAgIC8qIFJlc2V0IHN0YXRlIGlmIGl0J3MgYSByZWFsIGRpc2NvbnQgKi8KKyAgICAgICAgZGVtdXgtPm5lZWRlZGJ5dGVzID0gMTY7CisgICAgICAgIGRlbXV4LT5zdGF0ZSA9IFFUREVNVVhfU1RBVEVfSU5JVElBTDsKKyAgICAgICAgZGVtdXgtPm9mZnNldCA9IEdTVF9CVUZGRVJfT0ZGU0VUIChpbmJ1Zik7CisgICAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChkZW11eC0+YWRhcHRlcik7CisgICAgICB9CisgICAgfQorICAgIC8qIFJldmVyc2UgZnJhZ21lbnRlZCBwbGF5YmFjaywgbmVlZCB0byBmbHVzaCBhbGwgd2UgaGF2ZSBiZWZvcmUKKyAgICAgKiBjb25zdW1pbmcgYSBuZXcgZnJhZ21lbnQuCisgICAgICogVGhlIHNhbXBsZXMgYXJyYXkgaGF2ZSB0aGUgdGltZXN0YW1wcyBjYWxjdWxhdGVkIGJ5IGFjY3VtdWxhdGluZyB0aGUKKyAgICAgKiBkdXJhdGlvbnMgYnV0IHRoaXMgd29uJ3Qgd29yayBmb3IgcmV2ZXJzZSBwbGF5YmFjayBvZiBmcmFnbWVudHMgYXMKKyAgICAgKiB0aGUgdGltZXN0YW1wcyBvZiBhIHN1YnNlcXVlbnQgZnJhZ21lbnQgc2hvdWxkIGJlIHNtYWxsZXIgdGhhbiB0aGUKKyAgICAgKiBwcmV2aW91c2x5IHJlY2VpdmVkIG9uZS4gKi8KKyAgICBpZiAoIWlzX2dhcF9pbnB1dCAmJiBkZW11eC0+ZnJhZ21lbnRlZCAmJiBkZW11eC0+c2VnbWVudC5yYXRlIDwgMCkgeworICAgICAgZ3N0X3F0ZGVtdXhfcHJvY2Vzc19hZGFwdGVyIChkZW11eCwgVFJVRSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPm5fc3RyZWFtczsgaSsrKQorICAgICAgICBnc3RfcXRkZW11eF9zdHJlYW1fZmx1c2hfc2FtcGxlc19kYXRhIChkZW11eCwgZGVtdXgtPnN0cmVhbXNbaV0pOworICAgIH0KKyAgfQorCisgIGdzdF9hZGFwdGVyX3B1c2ggKGRlbXV4LT5hZGFwdGVyLCBpbmJ1Zik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAicHVzaGluZyBpbiBpbmJ1ZiAlcCwgbmVlZGVkYnl0ZXM6JXUsIGF2YWlsYWJsZTolIiBHX0dTSVpFX0ZPUk1BVCwgaW5idWYsCisgICAgICBkZW11eC0+bmVlZGVkYnl0ZXMsIGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoZGVtdXgtPmFkYXB0ZXIpKTsKKworICByZXR1cm4gZ3N0X3F0ZGVtdXhfcHJvY2Vzc19hZGFwdGVyIChkZW11eCwgRkFMU0UpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3F0ZGVtdXhfcHJvY2Vzc19hZGFwdGVyIChHc3RRVERlbXV4ICogZGVtdXgsIGdib29sZWFuIGZvcmNlKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIC8qIHdlIG5ldmVyIHJlYWxseSBtZWFuIHRvIGJ1ZmZlciB0aGF0IG11Y2ggKi8KKyAgaWYgKGRlbXV4LT5uZWVkZWRieXRlcyA9PSAtMSkgeworICAgIGdvdG8gZW9zOworICB9CisKKyAgd2hpbGUgKCgoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZW11eC0+YWRhcHRlcikpID49IGRlbXV4LT5uZWVkZWRieXRlcykgJiYKKyAgICAgIChyZXQgPT0gR1NUX0ZMT1dfT0sgfHwgKHJldCA9PSBHU1RfRkxPV19OT1RfTElOS0VEICYmIGZvcmNlKSkpIHsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgICB7CisgICAgICBndWludDY0IGRpc2NvbnRfb2Zmc2V0LCBkaXN0YW5jZV9mcm9tX2Rpc2NvbnQ7CisKKyAgICAgIGRpc2NvbnRfb2Zmc2V0ID0gZ3N0X2FkYXB0ZXJfb2Zmc2V0X2F0X2Rpc2NvbnQgKGRlbXV4LT5hZGFwdGVyKTsKKyAgICAgIGRpc3RhbmNlX2Zyb21fZGlzY29udCA9CisgICAgICAgICAgZ3N0X2FkYXB0ZXJfZGlzdGFuY2VfZnJvbV9kaXNjb250IChkZW11eC0+YWRhcHRlcik7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICJzdGF0ZTolcyAsIGRlbXV4LT5uZWVkZWRieXRlczolZCwgZGVtdXgtPm9mZnNldDolIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgIiBhZGFwdGVyIG9mZnNldCA6JSIgR19HVUlOVDY0X0ZPUk1BVCAiICgrICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAiIGJ5dGVzKSIsIHF0X2RlbXV4X3N0YXRlX3N0cmluZyAoZGVtdXgtPnN0YXRlKSwgZGVtdXgtPm5lZWRlZGJ5dGVzLAorICAgICAgICAgIGRlbXV4LT5vZmZzZXQsIGRpc2NvbnRfb2Zmc2V0LCBkaXN0YW5jZV9mcm9tX2Rpc2NvbnQpOworICAgIH0KKyNlbmRpZgorCisgICAgc3dpdGNoIChkZW11eC0+c3RhdGUpIHsKKyAgICAgIGNhc2UgUVRERU1VWF9TVEFURV9JTklUSUFMOnsKKyAgICAgICAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICAgICAgICBndWludDMyIGZvdXJjYzsKKyAgICAgICAgZ3VpbnQ2NCBzaXplOworCisgICAgICAgIGdzdF9xdGRlbXV4X2NoZWNrX3NlZWthYmlsaXR5IChkZW11eCk7CisKKyAgICAgICAgZGF0YSA9IGdzdF9hZGFwdGVyX21hcCAoZGVtdXgtPmFkYXB0ZXIsIGRlbXV4LT5uZWVkZWRieXRlcyk7CisKKyAgICAgICAgLyogZ2V0IGZvdXJjYy9sZW5ndGgsIHNldCBuZWVkZWRieXRlcyAqLworICAgICAgICBleHRyYWN0X2luaXRpYWxfbGVuZ3RoX2FuZF9mb3VyY2MgKChndWludDggKikgZGF0YSwgZGVtdXgtPm5lZWRlZGJ5dGVzLAorICAgICAgICAgICAgJnNpemUsICZmb3VyY2MpOworICAgICAgICBnc3RfYWRhcHRlcl91bm1hcCAoZGVtdXgtPmFkYXB0ZXIpOworICAgICAgICBkYXRhID0gTlVMTDsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJQZWVraW5nIGZvdW5kIFslIiBHU1RfRk9VUkNDX0ZPUk1BVCAiXSAiCisgICAgICAgICAgICAic2l6ZTogJSIgR19HVUlOVDY0X0ZPUk1BVCwgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpLCBzaXplKTsKKyAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZW11eCwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgICAgICAgKF8oIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIpKSwKKyAgICAgICAgICAgICAgKCJpbml0aWFsIGF0b20gJyUiIEdTVF9GT1VSQ0NfRk9STUFUICInIGhhcyBlbXB0eSBsZW5ndGgiLAorICAgICAgICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKSk7CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvdXJjYyA9PSBGT1VSQ0NfbWRhdCkgeworICAgICAgICAgIGdpbnQgbmV4dF9lbnRyeSA9IG5leHRfZW50cnlfc2l6ZSAoZGVtdXgpOworICAgICAgICAgIGlmIChkZW11eC0+bl9zdHJlYW1zID4gMCAmJiAobmV4dF9lbnRyeSAhPSAtMSB8fCAhZGVtdXgtPmZyYWdtZW50ZWQpKSB7CisgICAgICAgICAgICAvKiB3ZSBoYXZlIHRoZSBoZWFkZXJzLCBzdGFydCBwbGF5YmFjayAqLworICAgICAgICAgICAgZGVtdXgtPnN0YXRlID0gUVRERU1VWF9TVEFURV9NT1ZJRTsKKyAgICAgICAgICAgIGRlbXV4LT5uZWVkZWRieXRlcyA9IG5leHRfZW50cnk7CisgICAgICAgICAgICBkZW11eC0+bWRhdGxlZnQgPSBzaXplOworICAgICAgICAgICAgZGVtdXgtPm1kYXRzaXplID0gZGVtdXgtPm1kYXRsZWZ0OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBubyBoZWFkZXJzIHlldCwgdHJ5IHRvIGdldCB0aGVtICovCisgICAgICAgICAgICBndWludCBiczsKKyAgICAgICAgICAgIGdib29sZWFuIHJlczsKKyAgICAgICAgICAgIGd1aW50NjQgb2xkLCB0YXJnZXQ7CisKKyAgICAgICAgICBidWZmZXJfZGF0YToKKyAgICAgICAgICAgIG9sZCA9IGRlbXV4LT5vZmZzZXQ7CisgICAgICAgICAgICB0YXJnZXQgPSBvbGQgKyBzaXplOworCisgICAgICAgICAgICAvKiB0cnkgdG8ganVtcCBvdmVyIHRoZSBhdG9tIHdpdGggYSBzZWVrICovCisgICAgICAgICAgICAvKiBvbmx5IGJvdGhlciBpZiBpdCBzZWVtcyB3b3J0aCBkb2luZyBzbywKKyAgICAgICAgICAgICAqIGFuZCBhdm9pZHMgcG9zc2libGUgdXBzdHJlYW0vc2VydmVyIHByb2JsZW1zICovCisgICAgICAgICAgICBpZiAoZGVtdXgtPnVwc3RyZWFtX3NlZWthYmxlICYmCisgICAgICAgICAgICAgICAgZGVtdXgtPnVwc3RyZWFtX3NpemUgPiA0ICogKDEgPDwgMjApKSB7CisgICAgICAgICAgICAgIHJlcyA9IHF0ZGVtdXhfc2Vla19vZmZzZXQgKGRlbXV4LCB0YXJnZXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJza2lwcGluZyBzZWVrIik7CisgICAgICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic2VlayBzdWNjZXNzIik7CisgICAgICAgICAgICAgIC8qIHJlbWVtYmVyIHRoZSBvZmZzZXQgZm8gdGhlIGZpcnN0IG1kYXQgc28gd2UgY2FuIHNlZWsgYmFjayB0byBpdAorICAgICAgICAgICAgICAgKiBhZnRlciB3ZSBoYXZlIHRoZSBoZWFkZXJzICovCisgICAgICAgICAgICAgIGlmIChmb3VyY2MgPT0gRk9VUkNDX21kYXQgJiYgZGVtdXgtPmZpcnN0X21kYXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBkZW11eC0+Zmlyc3RfbWRhdCA9IG9sZDsKKyAgICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImZpcnN0IG1kYXQgYXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgZGVtdXgtPmZpcnN0X21kYXQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIC8qIHNlZWsgd29ya2VkLCBjb250aW51ZSByZWFkaW5nICovCisgICAgICAgICAgICAgIGRlbXV4LT5vZmZzZXQgPSB0YXJnZXQ7CisgICAgICAgICAgICAgIGRlbXV4LT5uZWVkZWRieXRlcyA9IDE2OworICAgICAgICAgICAgICBkZW11eC0+c3RhdGUgPSBRVERFTVVYX1NUQVRFX0lOSVRJQUw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvKiBzZWVrIGZhaWxlZCwgbmVlZCB0byBidWZmZXIgKi8KKyAgICAgICAgICAgICAgZGVtdXgtPm9mZnNldCA9IG9sZDsKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzZWVrIGZhaWxlZC9za2lwcGVkIik7CisgICAgICAgICAgICAgIC8qIHRoZXJlIG1heSBiZSBtdWx0aXBsZSBtZGF0IChvciBhbGlrZSkgYnVmZmVycyAqLworICAgICAgICAgICAgICAvKiBzYW5pdHkgY2hlY2sgKi8KKyAgICAgICAgICAgICAgaWYgKGRlbXV4LT5tZGF0YnVmZmVyKQorICAgICAgICAgICAgICAgIGJzID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZGVtdXgtPm1kYXRidWZmZXIpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnMgPSAwOworICAgICAgICAgICAgICBpZiAoc2l6ZSArIGJzID4gMTAgKiAoMSA8PCAyMCkpCisgICAgICAgICAgICAgICAgZ290byBub19tb292OworICAgICAgICAgICAgICBkZW11eC0+c3RhdGUgPSBRVERFTVVYX1NUQVRFX0JVRkZFUl9NREFUOworICAgICAgICAgICAgICBkZW11eC0+bmVlZGVkYnl0ZXMgPSBzaXplOworICAgICAgICAgICAgICBpZiAoIWRlbXV4LT5tZGF0YnVmZmVyKQorICAgICAgICAgICAgICAgIGRlbXV4LT5tZGF0b2Zmc2V0ID0gZGVtdXgtPm9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoR19VTkxJS0VMWSAoc2l6ZSA+IFFUREVNVVhfTUFYX0FUT01fU0laRSkpIHsKKyAgICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgREVNVVgsCisgICAgICAgICAgICAgIChfKCJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iKSksCisgICAgICAgICAgICAgICgiYXRvbSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIGhhcyBib2d1cyBzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYyksIHNpemUpKTsKKyAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiB0aGlzIG1lYW5zIHdlIGFscmVhZHkgc3RhcnRlZCBidWZmZXJpbmcgYW5kIHN0aWxsIG5vIG1vb3YgaGVhZGVyLAorICAgICAgICAgICAqIGxldCdzIGNvbnRpbnVlIGJ1ZmZlcmluZyBldmVyeXRoaW5nIHRpbGwgd2UgZ2V0IG1vb3YgKi8KKyAgICAgICAgICBpZiAoZGVtdXgtPm1kYXRidWZmZXIgJiYgIShmb3VyY2MgPT0gRk9VUkNDX21vb3YKKyAgICAgICAgICAgICAgICAgIHx8IGZvdXJjYyA9PSBGT1VSQ0NfbW9vZikpCisgICAgICAgICAgICBnb3RvIGJ1ZmZlcl9kYXRhOworICAgICAgICAgIGRlbXV4LT5uZWVkZWRieXRlcyA9IHNpemU7CisgICAgICAgICAgZGVtdXgtPnN0YXRlID0gUVRERU1VWF9TVEFURV9IRUFERVI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFFUREVNVVhfU1RBVEVfSEVBREVSOnsKKyAgICAgICAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICAgICAgICBndWludDMyIGZvdXJjYzsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkluIGhlYWRlciIpOworCisgICAgICAgIGRhdGEgPSBnc3RfYWRhcHRlcl9tYXAgKGRlbXV4LT5hZGFwdGVyLCBkZW11eC0+bmVlZGVkYnl0ZXMpOworCisgICAgICAgIC8qIHBhcnNlIHRoZSBoZWFkZXIgKi8KKyAgICAgICAgZXh0cmFjdF9pbml0aWFsX2xlbmd0aF9hbmRfZm91cmNjIChkYXRhLCBkZW11eC0+bmVlZGVkYnl0ZXMsIE5VTEwsCisgICAgICAgICAgICAmZm91cmNjKTsKKyAgICAgICAgaWYgKGZvdXJjYyA9PSBGT1VSQ0NfbW9vdikgeworICAgICAgICAgIGdpbnQgbjsKKworICAgICAgICAgIC8qIGluIHVzdWFsIGZyYWdtZW50ZWQgc2V0dXAgd2UgY291bGQgdHJ5IHRvIHNjYW4gZm9yIG1vcmUKKyAgICAgICAgICAgKiBhbmQgZW5kIHVwIGF0IHRoZSB0aGUgbW9vdiAoYWZ0ZXIgbWRhdCkgYWdhaW4gKi8KKyAgICAgICAgICBpZiAoZGVtdXgtPmdvdF9tb292ICYmIGRlbXV4LT5uX3N0cmVhbXMgPiAwICYmCisgICAgICAgICAgICAgICghZGVtdXgtPmZyYWdtZW50ZWQKKyAgICAgICAgICAgICAgICAgIHx8IGRlbXV4LT5sYXN0X21vb3Zfb2Zmc2V0ID09IGRlbXV4LT5vZmZzZXQpKSB7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgICAiU2tpcHBpbmcgbW9vdiBhdG9tIGFzIHdlIGhhdmUgKHRoaXMpIG9uZSBhbHJlYWR5Iik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiUGFyc2luZyBbbW9vdl0iKTsKKworICAgICAgICAgICAgaWYgKGRlbXV4LT5nb3RfbW9vdiAmJiBkZW11eC0+ZnJhZ21lbnRlZCkgeworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgICAgICJHb3QgYSBzZWNvbmQgbW9vdiwgY2xlYW4gdXAgZGF0YSBmcm9tIG9sZCBvbmUiKTsKKyAgICAgICAgICAgICAgaWYgKGRlbXV4LT5tb292X25vZGVfY29tcHJlc3NlZCkgeworICAgICAgICAgICAgICAgIGdfbm9kZV9kZXN0cm95IChkZW11eC0+bW9vdl9ub2RlX2NvbXByZXNzZWQpOworICAgICAgICAgICAgICAgIGlmIChkZW11eC0+bW9vdl9ub2RlKQorICAgICAgICAgICAgICAgICAgZ19mcmVlIChkZW11eC0+bW9vdl9ub2RlLT5kYXRhKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBkZW11eC0+bW9vdl9ub2RlX2NvbXByZXNzZWQgPSBOVUxMOworICAgICAgICAgICAgICBpZiAoZGVtdXgtPm1vb3Zfbm9kZSkKKyAgICAgICAgICAgICAgICBnX25vZGVfZGVzdHJveSAoZGVtdXgtPm1vb3Zfbm9kZSk7CisgICAgICAgICAgICAgIGRlbXV4LT5tb292X25vZGUgPSBOVUxMOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLyogcHJlcGFyZSBuZXdzZWdtZW50IHRvIHNlbmQgd2hlbiBzdHJlYW1pbmcgYWN0dWFsbHkgc3RhcnRzICovCisgICAgICAgICAgICAgIGlmICghZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCkgeworICAgICAgICAgICAgICAgIGRlbXV4LT5wZW5kaW5nX25ld3NlZ21lbnQgPQorICAgICAgICAgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZkZW11eC0+c2VnbWVudCk7CisgICAgICAgICAgICAgICAgaWYgKGRlbXV4LT5zZWdtZW50X3NlcW51bSAhPSBHU1RfU0VRTlVNX0lOVkFMSUQpCisgICAgICAgICAgICAgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBkZW11eC0+c2VnbWVudF9zZXFudW0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlbXV4LT5sYXN0X21vb3Zfb2Zmc2V0ID0gZGVtdXgtPm9mZnNldDsKKworICAgICAgICAgICAgcXRkZW11eF9wYXJzZV9tb292IChkZW11eCwgZGF0YSwgZGVtdXgtPm5lZWRlZGJ5dGVzKTsKKyAgICAgICAgICAgIHF0ZGVtdXhfbm9kZV9kdW1wIChkZW11eCwgZGVtdXgtPm1vb3Zfbm9kZSk7CisgICAgICAgICAgICBxdGRlbXV4X3BhcnNlX3RyZWUgKGRlbXV4KTsKKyAgICAgICAgICAgIHF0ZGVtdXhfcHJlcGFyZV9zdHJlYW1zIChkZW11eCk7CisgICAgICAgICAgICBpZiAoIWRlbXV4LT5nb3RfbW9vdikKKyAgICAgICAgICAgICAgcXRkZW11eF9leHBvc2Vfc3RyZWFtcyAoZGVtdXgpOworICAgICAgICAgICAgZWxzZSB7CisKKyAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGRlbXV4LT5uX3N0cmVhbXM7IG4rKykgeworICAgICAgICAgICAgICAgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbSA9IGRlbXV4LT5zdHJlYW1zW25dOworCisgICAgICAgICAgICAgICAgZ3N0X3F0ZGVtdXhfY29uZmlndXJlX3N0cmVhbSAoZGVtdXgsIHN0cmVhbSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVtdXgtPmdvdF9tb292ID0gVFJVRTsKKyAgICAgICAgICAgIGdzdF9xdGRlbXV4X2NoZWNrX3NlbmRfcGVuZGluZ19zZWdtZW50IChkZW11eCk7CisKKyAgICAgICAgICAgIC8qIGZyYWdtZW50ZWQgc3RyZWFtcyBoZWFkZXJzIHNob3VsZG4ndCBjb250YWluIGVkdHMgYXRvbXMgKi8KKyAgICAgICAgICAgIGlmICghZGVtdXgtPmZyYWdtZW50ZWQpIHsKKyAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGRlbXV4LT5uX3N0cmVhbXM7IG4rKykgeworICAgICAgICAgICAgICAgIGdzdF9xdGRlbXV4X3N0cmVhbV9zZW5kX2luaXRpYWxfZ2FwX3NlZ21lbnRzIChkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgZGVtdXgtPnN0cmVhbXNbbl0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkZW11eC0+bW9vdl9ub2RlX2NvbXByZXNzZWQpIHsKKyAgICAgICAgICAgICAgZ19ub2RlX2Rlc3Ryb3kgKGRlbXV4LT5tb292X25vZGVfY29tcHJlc3NlZCk7CisgICAgICAgICAgICAgIGdfZnJlZSAoZGVtdXgtPm1vb3Zfbm9kZS0+ZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZW11eC0+bW9vdl9ub2RlX2NvbXByZXNzZWQgPSBOVUxMOworICAgICAgICAgICAgZ19ub2RlX2Rlc3Ryb3kgKGRlbXV4LT5tb292X25vZGUpOworICAgICAgICAgICAgZGVtdXgtPm1vb3Zfbm9kZSA9IE5VTEw7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkZpbmlzaGVkIHBhcnNpbmcgdGhlIGhlYWRlciIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmb3VyY2MgPT0gRk9VUkNDX21vb2YpIHsKKyAgICAgICAgICBpZiAoKGRlbXV4LT5nb3RfbW9vdiB8fCBkZW11eC0+bWVkaWFfY2FwcykgJiYgZGVtdXgtPmZyYWdtZW50ZWQpIHsKKyAgICAgICAgICAgIGd1aW50NjQgZGlzdCA9IDA7CisgICAgICAgICAgICBHc3RDbG9ja1RpbWUgcHJldl9wdHM7CisgICAgICAgICAgICBndWludDY0IHByZXZfb2Zmc2V0OworICAgICAgICAgICAgZ3VpbnQ2NCBhZGFwdGVyX2Rpc2NvbnRfb2Zmc2V0LCBhZGFwdGVyX2Rpc2NvbnRfZGlzdDsKKworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJQYXJzaW5nIFttb29mXSIpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9vZiBidWZmZXIgaXMgcmVsZXZhbnQgYXMgc29tZSBzY2VuYXJpb3MKKyAgICAgICAgICAgICAqIHdvbid0IGhhdmUgdGhlIGluaXRpYWwgdGltZXN0YW1wIGluIHRoZSBhdG9tcy4gV2hlbmV2ZXIgYSBuZXcKKyAgICAgICAgICAgICAqIGJ1ZmZlciBoYXMgc3RhcnRlZCwgd2UgZ2V0IHRoYXQgYnVmZmVyJ3MgUFRTIGFuZCB1c2UgaXQgYXMgYSBiYXNlCisgICAgICAgICAgICAgKiB0aW1lc3RhbXAgZm9yIHRoZSB0cnVuIGVudHJpZXMuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVG8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBidWZmZXIgdGltZXN0YW1wIGFuZCBzdGFydGluZyBwb2ludAorICAgICAgICAgICAgICogd2UgdXNlIGdzdF9hZGFwdGVyX3ByZXZfcHRzIHRoYXQgZ2l2ZXMgdXMgdGhlIFBUUyBhbmQgdGhlIGRpc3RhbmNlCisgICAgICAgICAgICAgKiBmcm9tIHRoZSBiZWdnaW5pbmcgb2YgdGhlIGJ1ZmZlciwgd2l0aCB0aGUgZGlzdGFuY2UgYW5kIGRlbXV4LT5vZmZzZXQKKyAgICAgICAgICAgICAqIHdlIGtub3cgaWYgaXQgaXMgc3RpbGwgdGhlIHNhbWUgYnVmZmVyIG9yIG5vdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHJldl9wdHMgPSBnc3RfYWRhcHRlcl9wcmV2X3B0cyAoZGVtdXgtPmFkYXB0ZXIsICZkaXN0KTsKKyAgICAgICAgICAgIHByZXZfb2Zmc2V0ID0gZGVtdXgtPm9mZnNldCAtIGRpc3Q7CisgICAgICAgICAgICBpZiAoZGVtdXgtPmZyYWdtZW50X3N0YXJ0X29mZnNldCA9PSAtMQorICAgICAgICAgICAgICAgIHx8IHByZXZfb2Zmc2V0ID4gZGVtdXgtPmZyYWdtZW50X3N0YXJ0X29mZnNldCkgeworICAgICAgICAgICAgICBkZW11eC0+ZnJhZ21lbnRfc3RhcnRfb2Zmc2V0ID0gcHJldl9vZmZzZXQ7CisgICAgICAgICAgICAgIGRlbXV4LT5mcmFnbWVudF9zdGFydCA9IHByZXZfcHRzOworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgICAgICJOZXcgZnJhZ21lbnQgc3RhcnQgZm91bmQgYXQ6ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiA6ICUiCisgICAgICAgICAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIGRlbXV4LT5mcmFnbWVudF9zdGFydF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+ZnJhZ21lbnRfc3RhcnQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogV2UgY2FuJ3QgdXNlIHByZXZfb2Zmc2V0KCkgaGVyZSBiZWNhdXNlIHRoaXMgd291bGQgcmVxdWlyZQorICAgICAgICAgICAgICogdXBzdHJlYW0gdG8gc2V0IGNvbnNpc3RlbnQgYW5kIGNvcnJlY3Qgb2Zmc2V0cyBvbiBhbGwgYnVmZmVycworICAgICAgICAgICAgICogc2luY2UgdGhlIGRpc2NvbnQuIE5vdGhpbmcgZXZlciBkaWQgdGhhdCBpbiB0aGUgcGFzdCBhbmQgd2UKKyAgICAgICAgICAgICAqIHdvdWxkIGJyZWFrIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGhlcmUgdGhlbi4KKyAgICAgICAgICAgICAqIEluc3RlYWQgdGFrZSB0aGUgb2Zmc2V0IHdlIGhhZCBhdCB0aGUgbGFzdCBkaXNjb250IGFuZCBjb3VudAorICAgICAgICAgICAgICogdGhlIGJ5dGVzIGZyb20gdGhlcmUuIFRoaXMgd29ya3Mgd2l0aCBvbGQgY29kZSBhcyB0aGVyZSB3b3VsZAorICAgICAgICAgICAgICogYmUgbm8gZGlzY29udCBiZXR3ZWVuIG1vb3YgYW5kIG1vb2YsIGFuZCBhbHNvIHdvcmtzIHdpdGgKKyAgICAgICAgICAgICAqIGFkYXB0aXZlZGVtdXggd2hpY2ggY29ycmVjdGx5IHNldHMgb2Zmc2V0IGFuZCB3aWxsIHNldCB0aGUKKyAgICAgICAgICAgICAqIERJU0NPTlQgZmxhZyBhY2NvcmRpbmdseSB3aGVuIG5lZWRlZC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBXZSBhbHNvIG9ubHkgZG8gdGhpcyBmb3IgdXBzdHJlYW0gVElNRSBzZWdtZW50cyBhcyBvdGhlcndpc2UKKyAgICAgICAgICAgICAqIHRoZXJlIGFyZSBwb3RlbnRpYWwgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgd2l0aAorICAgICAgICAgICAgICogc2Vla2luZyBpbiBQVVNIIG1vZGUgYW5kIHVwc3RyZWFtIHByb3ZpZGluZyBpbmNvbnNpc3RlbnQKKyAgICAgICAgICAgICAqIHRpbWVzdGFtcHMuICovCisgICAgICAgICAgICBhZGFwdGVyX2Rpc2NvbnRfb2Zmc2V0ID0KKyAgICAgICAgICAgICAgICBnc3RfYWRhcHRlcl9vZmZzZXRfYXRfZGlzY29udCAoZGVtdXgtPmFkYXB0ZXIpOworICAgICAgICAgICAgYWRhcHRlcl9kaXNjb250X2Rpc3QgPQorICAgICAgICAgICAgICAgIGdzdF9hZGFwdGVyX2Rpc3RhbmNlX2Zyb21fZGlzY29udCAoZGVtdXgtPmFkYXB0ZXIpOworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgICAiZGVtdXggb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBhZGFwdGVyIG9mZnNldCAlIgorICAgICAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIiAoKyAlIiBHX0dVSU5UNjRfRk9STUFUICIgYnl0ZXMpIiwKKyAgICAgICAgICAgICAgICBkZW11eC0+b2Zmc2V0LCBhZGFwdGVyX2Rpc2NvbnRfb2Zmc2V0LCBhZGFwdGVyX2Rpc2NvbnRfZGlzdCk7CisKKyAgICAgICAgICAgIGlmIChkZW11eC0+dXBzdHJlYW1fZm9ybWF0X2lzX3RpbWUpIHsKKyAgICAgICAgICAgICAgZGVtdXgtPm1vb2Zfb2Zmc2V0ID0gYWRhcHRlcl9kaXNjb250X29mZnNldDsKKyAgICAgICAgICAgICAgaWYgKGRlbXV4LT5tb29mX29mZnNldCAhPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FKQorICAgICAgICAgICAgICAgIGRlbXV4LT5tb29mX29mZnNldCArPSBhZGFwdGVyX2Rpc2NvbnRfZGlzdDsKKyAgICAgICAgICAgICAgaWYgKGRlbXV4LT5tb29mX29mZnNldCA9PSBHU1RfQlVGRkVSX09GRlNFVF9OT05FKQorICAgICAgICAgICAgICAgIGRlbXV4LT5tb29mX29mZnNldCA9IGRlbXV4LT5vZmZzZXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBkZW11eC0+bW9vZl9vZmZzZXQgPSBkZW11eC0+b2Zmc2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXF0ZGVtdXhfcGFyc2VfbW9vZiAoZGVtdXgsIGRhdGEsIGRlbXV4LT5uZWVkZWRieXRlcywKKyAgICAgICAgICAgICAgICAgICAgZGVtdXgtPm1vb2Zfb2Zmc2V0LCBOVUxMKSkgeworICAgICAgICAgICAgICBnc3RfYWRhcHRlcl91bm1hcCAoZGVtdXgtPmFkYXB0ZXIpOworICAgICAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaW4gTVNTIHdlIG5lZWQgdG8gZXhwb3NlIHRoZSBwYWRzIGFmdGVyIHRoZSBmaXJzdCBtb29mIGFzIHdlIHdvbid0IGdldCBhIG1vb3YgKi8KKyAgICAgICAgICAgIGlmIChkZW11eC0+bXNzX21vZGUgJiYgIWRlbXV4LT5leHBvc2VkKSB7CisgICAgICAgICAgICAgIGlmICghZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCkgeworICAgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAibmV3IHBlbmRpbmdfbmV3c2VnbWVudCIpOworICAgICAgICAgICAgICAgIGRlbXV4LT5wZW5kaW5nX25ld3NlZ21lbnQgPQorICAgICAgICAgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZkZW11eC0+c2VnbWVudCk7CisgICAgICAgICAgICAgICAgaWYgKGRlbXV4LT5zZWdtZW50X3NlcW51bSAhPSBHU1RfU0VRTlVNX0lOVkFMSUQpCisgICAgICAgICAgICAgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZGVtdXgtPnBlbmRpbmdfbmV3c2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBkZW11eC0+c2VnbWVudF9zZXFudW0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHF0ZGVtdXhfZXhwb3NlX3N0cmVhbXMgKGRlbXV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJEaXNjYXJkaW5nIFttb29mXSIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmb3VyY2MgPT0gRk9VUkNDX2Z0eXApIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlBhcnNpbmcgW2Z0eXBdIik7CisgICAgICAgICAgcXRkZW11eF9wYXJzZV9mdHlwIChkZW11eCwgZGF0YSwgZGVtdXgtPm5lZWRlZGJ5dGVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChmb3VyY2MgPT0gRk9VUkNDX3V1aWQpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlBhcnNpbmcgW3V1aWRdIik7CisgICAgICAgICAgcXRkZW11eF9wYXJzZV91dWlkIChkZW11eCwgZGF0YSwgZGVtdXgtPm5lZWRlZGJ5dGVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChmb3VyY2MgPT0gRk9VUkNDX3NpZHgpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlBhcnNpbmcgW3NpZHhdIik7CisgICAgICAgICAgcXRkZW11eF9wYXJzZV9zaWR4IChkZW11eCwgZGF0YSwgZGVtdXgtPm5lZWRlZGJ5dGVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzd2l0Y2ggKGZvdXJjYykgeworICAgICAgICAgICAgY2FzZSBGT1VSQ0Nfc3R5cDoKKyAgICAgICAgICAgICAgLyogW3N0eXBdIGlzIGxpa2UgYSBbZnR5cF0sIGJ1dCBpbiBmcmFnbWVudCBoZWFkZXIuIFdlIGlnbm9yZSBpdCBmb3Igbm93CisgICAgICAgICAgICAgICAqIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICBjYXNlIEZPVVJDQ19za2lwOgorICAgICAgICAgICAgY2FzZSBGT1VSQ0NfZnJlZToKKyAgICAgICAgICAgICAgLyogW2ZyZWVdIGFuZCBbc2tpcF0gYXJlIHBhZGRpbmcgYXRvbXMgKi8KKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgZm91cmNjIHdoaWxlIHBhcnNpbmcgaGVhZGVyIDogJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYykpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAiVW5rbm93biBmb3VyY2Mgd2hpbGUgcGFyc2luZyBoZWFkZXIgOiAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSk7CisgICAgICAgICAgICAgIC8qIExldCdzIGp1bXAgdGhhdCBvbmUgYW5kIGdvIGJhY2sgdG8gaW5pdGlhbCBzdGF0ZSAqLworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKGRlbXV4LT5hZGFwdGVyKTsKKyAgICAgICAgZGF0YSA9IE5VTEw7CisKKyAgICAgICAgaWYgKGRlbXV4LT5tZGF0YnVmZmVyICYmIGRlbXV4LT5uX3N0cmVhbXMpIHsKKyAgICAgICAgICBnc2l6ZSByZW1haW5pbmdfZGF0YV9zaXplID0gMDsKKworICAgICAgICAgIC8qIHRoZSBtZGF0IHdhcyBiZWZvcmUgdGhlIGhlYWRlciAqLworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiV2UgaGF2ZSBuX3N0cmVhbXM6JWQgYW5kIG1kYXRidWZmZXI6JXAiLAorICAgICAgICAgICAgICBkZW11eC0+bl9zdHJlYW1zLCBkZW11eC0+bWRhdGJ1ZmZlcik7CisgICAgICAgICAgLyogcmVzdG9yZSBvdXIgYWRhcHRlci9vZmZzZXQgdmlldyBvZiB0aGluZ3Mgd2l0aCB1cHN0cmVhbTsKKyAgICAgICAgICAgKiBwdXQgcHJlY2VkaW5nIGJ1ZmZlcmVkIGRhdGEgYWhlYWQgb2YgY3VycmVudCBtb292IGRhdGEuCisgICAgICAgICAgICogVGhpcyBzaG91bGQgYWxzbyBoYW5kbGUgZXZpbCBtZGF0LCBtb292LCBtZGF0IGNhc2VzIGFuZCBhbGlrZSAqLworICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChkZW11eC0+YWRhcHRlciwgZGVtdXgtPm5lZWRlZGJ5dGVzKTsKKworICAgICAgICAgIC8qIFN0b3JlIGFueSByZW1haW5pbmcgZGF0YSBhZnRlciB0aGUgbWRhdCBmb3IgbGF0ZXIgdXNhZ2UgKi8KKyAgICAgICAgICByZW1haW5pbmdfZGF0YV9zaXplID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZW11eC0+YWRhcHRlcik7CisgICAgICAgICAgaWYgKHJlbWFpbmluZ19kYXRhX3NpemUgPiAwKSB7CisgICAgICAgICAgICBnX2Fzc2VydCAoZGVtdXgtPnJlc3RvcmVkYXRhX2J1ZmZlciA9PSBOVUxMKTsKKyAgICAgICAgICAgIGRlbXV4LT5yZXN0b3JlZGF0YV9idWZmZXIgPQorICAgICAgICAgICAgICAgIGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChkZW11eC0+YWRhcHRlciwgcmVtYWluaW5nX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBkZW11eC0+cmVzdG9yZWRhdGFfb2Zmc2V0ID0gZGVtdXgtPm9mZnNldCArIGRlbXV4LT5uZWVkZWRieXRlczsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAgICJTdG9yZWQgJSIgR19HU0laRV9GT1JNQVQgIiBwb3N0IG1kYXQgYnl0ZXMgYXQgb2Zmc2V0ICUiCisgICAgICAgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgcmVtYWluaW5nX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICBkZW11eC0+cmVzdG9yZWRhdGFfb2Zmc2V0KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBnc3RfYWRhcHRlcl9wdXNoIChkZW11eC0+YWRhcHRlciwgZGVtdXgtPm1kYXRidWZmZXIpOworICAgICAgICAgIGRlbXV4LT5tZGF0YnVmZmVyID0gTlVMTDsKKyAgICAgICAgICBkZW11eC0+b2Zmc2V0ID0gZGVtdXgtPm1kYXRvZmZzZXQ7CisgICAgICAgICAgZGVtdXgtPm5lZWRlZGJ5dGVzID0gbmV4dF9lbnRyeV9zaXplIChkZW11eCk7CisgICAgICAgICAgZGVtdXgtPnN0YXRlID0gUVRERU1VWF9TVEFURV9NT1ZJRTsKKyAgICAgICAgICBkZW11eC0+bWRhdGxlZnQgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGRlbXV4LT5hZGFwdGVyKTsKKyAgICAgICAgICBkZW11eC0+bWRhdHNpemUgPSBkZW11eC0+bWRhdGxlZnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJDYXJyeWluZyBvbiBub3JtYWxseSIpOworICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChkZW11eC0+YWRhcHRlciwgZGVtdXgtPm5lZWRlZGJ5dGVzKTsKKworICAgICAgICAgIC8qIG9ubHkgZ28gYmFjayB0byB0aGUgbWRhdCBpZiB0aGVyZSBhcmUgc2FtcGxlcyB0byBwbGF5ICovCisgICAgICAgICAgaWYgKGRlbXV4LT5nb3RfbW9vdiAmJiBkZW11eC0+Zmlyc3RfbWRhdCAhPSAtMQorICAgICAgICAgICAgICAmJiBoYXNfbmV4dF9lbnRyeSAoZGVtdXgpKSB7CisgICAgICAgICAgICBnYm9vbGVhbiByZXM7CisKKyAgICAgICAgICAgIC8qIHdlIG5lZWQgdG8gc2VlayBiYWNrICovCisgICAgICAgICAgICByZXMgPSBxdGRlbXV4X3NlZWtfb2Zmc2V0IChkZW11eCwgZGVtdXgtPmZpcnN0X21kYXQpOworICAgICAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgICBkZW11eC0+b2Zmc2V0ID0gZGVtdXgtPmZpcnN0X21kYXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlNlZWsgYmFjayBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVtdXgtPm9mZnNldCArPSBkZW11eC0+bmVlZGVkYnl0ZXM7CisgICAgICAgICAgfQorICAgICAgICAgIGRlbXV4LT5uZWVkZWRieXRlcyA9IDE2OworICAgICAgICAgIGRlbXV4LT5zdGF0ZSA9IFFUREVNVVhfU1RBVEVfSU5JVElBTDsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBRVERFTVVYX1NUQVRFX0JVRkZFUl9NREFUOnsKKyAgICAgICAgR3N0QnVmZmVyICpidWY7CisgICAgICAgIGd1aW50OCBmb3VyY2NbNF07CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJHb3Qgb3VyIGJ1ZmZlciBhdCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIGRlbXV4LT5vZmZzZXQpOworICAgICAgICBidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoZGVtdXgtPmFkYXB0ZXIsIGRlbXV4LT5uZWVkZWRieXRlcyk7CisgICAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoYnVmLCAwLCBmb3VyY2MsIDQpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIm1kYXRidWZmZXIgc3RhcnRzIHdpdGggJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKFFUX0ZPVVJDQyAoZm91cmNjKSkpOworICAgICAgICBpZiAoZGVtdXgtPm1kYXRidWZmZXIpCisgICAgICAgICAgZGVtdXgtPm1kYXRidWZmZXIgPSBnc3RfYnVmZmVyX2FwcGVuZCAoZGVtdXgtPm1kYXRidWZmZXIsIGJ1Zik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBkZW11eC0+bWRhdGJ1ZmZlciA9IGJ1ZjsKKyAgICAgICAgZGVtdXgtPm9mZnNldCArPSBkZW11eC0+bmVlZGVkYnl0ZXM7CisgICAgICAgIGRlbXV4LT5uZWVkZWRieXRlcyA9IDE2OworICAgICAgICBkZW11eC0+c3RhdGUgPSBRVERFTVVYX1NUQVRFX0lOSVRJQUw7CisgICAgICAgIGdzdF9xdGRlbXV4X3Bvc3RfcHJvZ3Jlc3MgKGRlbXV4LCAxLCAxKTsKKworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgUVRERU1VWF9TVEFURV9NT1ZJRTp7CisgICAgICAgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbSA9IE5VTEw7CisgICAgICAgIFF0RGVtdXhTYW1wbGUgKnNhbXBsZTsKKyAgICAgICAgaW50IGkgPSAtMTsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIGR0cywgcHRzLCBkdXJhdGlvbjsKKyAgICAgICAgZ2Jvb2xlYW4ga2V5ZnJhbWU7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAiQkVHSU4gLy8gaW4gTU9WSUUgZm9yIG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFULCBkZW11eC0+b2Zmc2V0KTsKKworICAgICAgICBpZiAoZGVtdXgtPmZyYWdtZW50ZWQpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIm1kYXQgcmVtYWluaW5nICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICAgIGRlbXV4LT5tZGF0bGVmdCk7CisgICAgICAgICAgaWYgKEdfTElLRUxZIChkZW11eC0+dG9kcm9wIDwgZGVtdXgtPm1kYXRsZWZ0KSkgeworICAgICAgICAgICAgLyogaWYgbmVlZGVkIGRhdGEgc3RhcnRzIHdpdGhpbiB0aGlzIGF0b20sCisgICAgICAgICAgICAgKiB0aGVuIGl0IHNob3VsZCBub3QgZXhjZWVkIHRoaXMgYXRvbSAqLworICAgICAgICAgICAgaWYgKEdfVU5MSUtFTFkgKGRlbXV4LT5uZWVkZWRieXRlcyA+IGRlbXV4LT5tZGF0bGVmdCkpIHsKKyAgICAgICAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlbXV4LCBTVFJFQU0sIERFTVVYLAorICAgICAgICAgICAgICAgICAgKF8oIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIpKSwKKyAgICAgICAgICAgICAgICAgICgic2FtcGxlIGRhdGEgY3Jvc3NlcyBhdG9tIGJvdW5kYXJ5IikpOworICAgICAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZW11eC0+bWRhdGxlZnQgLT0gZGVtdXgtPm5lZWRlZGJ5dGVzOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImRhdGEgYXRvbSBlbXB0aWVkOyByZXN1bWluZyBhdG9tIHNjYW4iKTsKKyAgICAgICAgICAgIC8qIHNvIHdlIGFyZSBkcm9wcGluZyBtb3JlIHRoYW4gbGVmdCBpbiB0aGlzIGF0b20gKi8KKyAgICAgICAgICAgIGdzdF9xdGRlbXV4X2Ryb3BfZGF0YSAoZGVtdXgsIGRlbXV4LT5tZGF0bGVmdCk7CisgICAgICAgICAgICBkZW11eC0+bWRhdGxlZnQgPSAwOworCisgICAgICAgICAgICAvKiBuZWVkIHRvIHJlc3VtZSBhdG9tIHBhcnNpbmcgc28gd2UgZG8gbm90IG1pc3MgYW55IG90aGVyIHBpZWNlcyAqLworICAgICAgICAgICAgZGVtdXgtPnN0YXRlID0gUVRERU1VWF9TVEFURV9JTklUSUFMOworICAgICAgICAgICAgZGVtdXgtPm5lZWRlZGJ5dGVzID0gMTY7CisKKyAgICAgICAgICAgIC8qIGNoZWNrIGlmIHRoZXJlIHdhcyBhbnkgc3RvcmVkIHBvc3QgbWRhdCBkYXRhIGZyb20gcHJldmlvdXMgYnVmZmVycyAqLworICAgICAgICAgICAgaWYgKGRlbXV4LT5yZXN0b3JlZGF0YV9idWZmZXIpIHsKKyAgICAgICAgICAgICAgZ19hc3NlcnQgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoZGVtdXgtPmFkYXB0ZXIpID09IDApOworCisgICAgICAgICAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKGRlbXV4LT5hZGFwdGVyLCBkZW11eC0+cmVzdG9yZWRhdGFfYnVmZmVyKTsKKyAgICAgICAgICAgICAgZGVtdXgtPnJlc3RvcmVkYXRhX2J1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgIGRlbXV4LT5vZmZzZXQgPSBkZW11eC0+cmVzdG9yZWRhdGFfb2Zmc2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVtdXgtPnRvZHJvcCkgeworICAgICAgICAgIGlmIChkZW11eC0+Y2VuY19hdXhfaW5mb19vZmZzZXQgPiAwKSB7CisgICAgICAgICAgICBHc3RCeXRlUmVhZGVyIGJyOworICAgICAgICAgICAgY29uc3QgZ3VpbnQ4ICpkYXRhOworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInBhcnNpbmcgY2VuYyBhdXhpbGlhcnkgaW5mbyIpOworICAgICAgICAgICAgZGF0YSA9IGdzdF9hZGFwdGVyX21hcCAoZGVtdXgtPmFkYXB0ZXIsIGRlbXV4LT50b2Ryb3ApOworICAgICAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZiciwgZGF0YSArIDgsIGRlbXV4LT50b2Ryb3ApOworICAgICAgICAgICAgaWYgKCFxdGRlbXV4X3BhcnNlX2NlbmNfYXV4X2luZm8gKGRlbXV4LCBkZW11eC0+c3RyZWFtc1swXSwgJmJyLAorICAgICAgICAgICAgICAgICAgICBkZW11eC0+Y2VuY19hdXhfaW5mb19zaXplcywgZGVtdXgtPmNlbmNfYXV4X3NhbXBsZV9jb3VudCkpIHsKKyAgICAgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoZGVtdXgsICJmYWlsZWQgdG8gcGFyc2UgY2VuYyBhdXhpbGlhcnkgaW5mbyIpOworICAgICAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKGRlbXV4LT5hZGFwdGVyKTsKKyAgICAgICAgICAgICAgZ19mcmVlIChkZW11eC0+Y2VuY19hdXhfaW5mb19zaXplcyk7CisgICAgICAgICAgICAgIGRlbXV4LT5jZW5jX2F1eF9pbmZvX3NpemVzID0gTlVMTDsKKyAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVtdXgtPmNlbmNfYXV4X2luZm9fb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGdfZnJlZSAoZGVtdXgtPmNlbmNfYXV4X2luZm9fc2l6ZXMpOworICAgICAgICAgICAgZGVtdXgtPmNlbmNfYXV4X2luZm9fc2l6ZXMgPSBOVUxMOworICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKGRlbXV4LT5hZGFwdGVyKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ3N0X3F0ZGVtdXhfZHJvcF9kYXRhIChkZW11eCwgZGVtdXgtPnRvZHJvcCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBmaXJzdCBidWZmZXI/ICovCisgICAgICAgIC8qIGluaXRpYWwgbmV3c2VnbWVudCBzZW50IGhlcmUgYWZ0ZXIgaGF2aW5nIGFkZGVkIHBhZHMsCisgICAgICAgICAqIHBvc3NpYmxlIG90aGVycyBpbiBzaW5rX2V2ZW50ICovCisgICAgICAgIGdzdF9xdGRlbXV4X2NoZWNrX3NlbmRfcGVuZGluZ19zZWdtZW50IChkZW11eCk7CisKKyAgICAgICAgLyogRmlndXJlIG91dCB3aGljaCBzdHJlYW0gdGhpcyBwYWNrZXQgYmVsb25ncyB0byAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgc3RyZWFtID0gZGVtdXgtPnN0cmVhbXNbaV07CisgICAgICAgICAgaWYgKHN0cmVhbS0+c2FtcGxlX2luZGV4ID49IHN0cmVhbS0+bl9zYW1wbGVzKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAiQ2hlY2tpbmcgc3RyZWFtICVkIChzYW1wbGVfaW5kZXg6JWQgLyBvZmZzZXQ6JSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAgICAgICAiIC8gc2l6ZTolZCkiLCBpLCBzdHJlYW0tPnNhbXBsZV9pbmRleCwKKyAgICAgICAgICAgICAgc3RyZWFtLT5zYW1wbGVzW3N0cmVhbS0+c2FtcGxlX2luZGV4XS5vZmZzZXQsCisgICAgICAgICAgICAgIHN0cmVhbS0+c2FtcGxlc1tzdHJlYW0tPnNhbXBsZV9pbmRleF0uc2l6ZSk7CisKKyAgICAgICAgICBpZiAoc3RyZWFtLT5zYW1wbGVzW3N0cmVhbS0+c2FtcGxlX2luZGV4XS5vZmZzZXQgPT0gZGVtdXgtPm9mZnNldCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbSA9PSBOVUxMIHx8IGkgPT0gZGVtdXgtPm5fc3RyZWFtcykpCisgICAgICAgICAgZ290byB1bmtub3duX3N0cmVhbTsKKworICAgICAgICBnc3RfcXRkZW11eF9zdHJlYW1fY2hlY2tfYW5kX2NoYW5nZV9zdHNkX2luZGV4IChkZW11eCwgc3RyZWFtKTsKKworICAgICAgICBpZiAoc3RyZWFtLT5uZXdfY2FwcykgeworICAgICAgICAgIGdzdF9xdGRlbXV4X2NvbmZpZ3VyZV9zdHJlYW0gKGRlbXV4LCBzdHJlYW0pOworICAgICAgICB9CisKKyAgICAgICAgLyogUHV0IGRhdGEgaW4gYSBidWZmZXIsIHNldCB0aW1lc3RhbXBzLCBjYXBzLCAuLi4gKi8KKyAgICAgICAgc2FtcGxlID0gJnN0cmVhbS0+c2FtcGxlc1tzdHJlYW0tPnNhbXBsZV9pbmRleF07CisKKyAgICAgICAgaWYgKEdfTElLRUxZICghKFNUUkVBTV9JU19FT1MgKHN0cmVhbSkpKSkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic3RyZWFtIDogJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Zm91cmNjKSk7CisKKyAgICAgICAgICBkdHMgPSBRVFNBTVBMRV9EVFMgKHN0cmVhbSwgc2FtcGxlKTsKKyAgICAgICAgICBwdHMgPSBRVFNBTVBMRV9QVFMgKHN0cmVhbSwgc2FtcGxlKTsKKyAgICAgICAgICBkdXJhdGlvbiA9IFFUU0FNUExFX0RVUl9EVFMgKHN0cmVhbSwgc2FtcGxlLCBkdHMpOworICAgICAgICAgIGtleWZyYW1lID0gUVRTQU1QTEVfS0VZRlJBTUUgKHN0cmVhbSwgc2FtcGxlKTsKKworICAgICAgICAgIC8qIGNoZWNrIGZvciBzZWdtZW50IGVuZCAqLworICAgICAgICAgIGlmIChHX1VOTElLRUxZIChkZW11eC0+c2VnbWVudC5zdG9wICE9IC0xCisgICAgICAgICAgICAgICAgICAmJiBkZW11eC0+c2VnbWVudC5zdG9wIDw9IHB0cyAmJiBzdHJlYW0tPm9uX2tleWZyYW1lKSkgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJ3ZSByZWFjaGVkIHRoZSBlbmQgb2Ygb3VyIHNlZ21lbnQuIik7CisgICAgICAgICAgICBzdHJlYW0tPnRpbWVfcG9zaXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOyAgICAgICAgLyogdGhpcyBtZWFucyBFT1MgKi8KKworICAgICAgICAgICAgLyogc2tpcCB0aGlzIGRhdGEsIHN0cmVhbSBpcyBFT1MgKi8KKyAgICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChkZW11eC0+YWRhcHRlciwgZGVtdXgtPm5lZWRlZGJ5dGVzKTsKKyAgICAgICAgICAgIGRlbXV4LT5vZmZzZXQgKz0gZGVtdXgtPm5lZWRlZGJ5dGVzOworCisgICAgICAgICAgICAvKiBjaGVjayBpZiBhbGwgc3RyZWFtcyBhcmUgZW9zICovCisgICAgICAgICAgICByZXQgPSBHU1RfRkxPV19FT1M7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgIGlmICghU1RSRUFNX0lTX0VPUyAoZGVtdXgtPnN0cmVhbXNbaV0pKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR3N0QnVmZmVyICpvdXRidWY7CisKKyAgICAgICAgICAgIG91dGJ1ZiA9CisgICAgICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGRlbXV4LT5hZGFwdGVyLCBkZW11eC0+bmVlZGVkYnl0ZXMpOworCisgICAgICAgICAgICAvKiBGSVhNRTogc2hvdWxkIGVpdGhlciBiZSBhbiBhc3NlcnQgb3IgYSBwbGFpbiBjaGVjayAqLworICAgICAgICAgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKG91dGJ1ZiAhPSBOVUxMLCBHU1RfRkxPV19FUlJPUik7CisKKyAgICAgICAgICAgIHJldCA9IGdzdF9xdGRlbXV4X2RlY29yYXRlX2FuZF9wdXNoX2J1ZmZlciAoZGVtdXgsIHN0cmVhbSwgb3V0YnVmLAorICAgICAgICAgICAgICAgIGR0cywgcHRzLCBkdXJhdGlvbiwga2V5ZnJhbWUsIGR0cywgZGVtdXgtPm9mZnNldCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogY29tYmluZSBmbG93cyAqLworICAgICAgICAgIHJldCA9IGdzdF9xdGRlbXV4X2NvbWJpbmVfZmxvd3MgKGRlbXV4LCBzdHJlYW0sIHJldCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogc2tpcCB0aGlzIGRhdGEsIHN0cmVhbSBpcyBFT1MgKi8KKyAgICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAoZGVtdXgtPmFkYXB0ZXIsIGRlbXV4LT5uZWVkZWRieXRlcyk7CisgICAgICAgIH0KKworICAgICAgICBzdHJlYW0tPnNhbXBsZV9pbmRleCsrOworICAgICAgICBzdHJlYW0tPm9mZnNldF9pbl9zYW1wbGUgPSAwOworCisgICAgICAgIC8qIHVwZGF0ZSBjdXJyZW50IG9mZnNldCBhbmQgZmlndXJlIG91dCBzaXplIG9mIG5leHQgYnVmZmVyICovCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgImluY3JlYXNpbmcgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBieSAldSIsCisgICAgICAgICAgICBkZW11eC0+b2Zmc2V0LCBkZW11eC0+bmVlZGVkYnl0ZXMpOworICAgICAgICBkZW11eC0+b2Zmc2V0ICs9IGRlbXV4LT5uZWVkZWRieXRlczsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAib2Zmc2V0IGlzIG5vdyAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgZGVtdXgtPm9mZnNldCk7CisKKworICAgICAgICBpZiAocmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiQWxsIHN0cmVhbXMgYXJlIEVPUywgc2lnbmFsIHVwc3RyZWFtIik7CisgICAgICAgICAgZGVtdXgtPm5lZWRlZGJ5dGVzID0gLTE7CisgICAgICAgICAgZ290byBlb3M7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGRlbXV4LT5uZWVkZWRieXRlcyA9IG5leHRfZW50cnlfc2l6ZSAoZGVtdXgpKSA9PSAtMSkgeworICAgICAgICAgIGlmIChkZW11eC0+ZnJhZ21lbnRlZCkgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICIodGVtcG9yYXJpbHkpIG91dCBvZiBmcmFnbWVudGVkIHNhbXBsZXMiKTsKKyAgICAgICAgICAgIC8qIHRoZXJlIG1heSBiZSBtb3JlIHRvIGZvbGxvdywgb25seSBmaW5pc2ggdGhpcyBhdG9tICovCisgICAgICAgICAgICBkZW11eC0+dG9kcm9wID0gZGVtdXgtPm1kYXRsZWZ0OworICAgICAgICAgICAgZGVtdXgtPm5lZWRlZGJ5dGVzID0gZGVtdXgtPnRvZHJvcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBnb3RvIGVvczsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LICYmIHJldCAhPSBHU1RfRkxPV19OT1RfTElOS0VEKSB7CisgICAgICAgICAgZ290byBub25fb2tfdW5saW5rZWRfZmxvdzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaW52YWxpZF9zdGF0ZTsKKyAgICB9CisgIH0KKworICAvKiB3aGVuIGJ1ZmZlcmluZyBtb3ZpZSBkYXRhLCBhdCBsZWFzdCBzaG93IHVzZXIgc29tZXRoaW5nIGlzIGhhcHBlbmluZyAqLworICBpZiAocmV0ID09IEdTVF9GTE9XX09LICYmIGRlbXV4LT5zdGF0ZSA9PSBRVERFTVVYX1NUQVRFX0JVRkZFUl9NREFUICYmCisgICAgICBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGRlbXV4LT5hZGFwdGVyKSA8PSBkZW11eC0+bmVlZGVkYnl0ZXMpIHsKKyAgICBnc3RfcXRkZW11eF9wb3N0X3Byb2dyZXNzIChkZW11eCwgZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZW11eC0+YWRhcHRlciksCisgICAgICAgIGRlbXV4LT5uZWVkZWRieXRlcyk7CisgIH0KK2RvbmU6CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK25vbl9va191bmxpbmtlZF9mbG93OgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJTdG9wcGluZywgY29tYmluZWQgcmV0dXJuIGZsb3cgJXMiLAorICAgICAgICBnc3RfZmxvd19nZXRfbmFtZSAocmV0KSk7CisgICAgcmV0dXJuIHJldDsKKyAgfQordW5rbm93bl9zdHJlYW06CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgRkFJTEVELCAoTlVMTCksICgidW5rbm93biBzdHJlYW0gZm91bmQiKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBkb25lOworICB9Citlb3M6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIm5vIG5leHQgZW50cnksIEVPUyIpOworICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgICBnb3RvIGRvbmU7CisgIH0KK2ludmFsaWRfc3RhdGU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgRkFJTEVELAorICAgICAgICAoTlVMTCksICgicXRkZW11eGVyIGludmFsaWQgc3RhdGUgJWQiLCBkZW11eC0+c3RhdGUpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGRvbmU7CisgIH0KK25vX21vb3Y6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgRkFJTEVELAorICAgICAgICAoTlVMTCksICgibm8gJ21vb3YnIGF0b20gd2l0aGluIHRoZSBmaXJzdCAxMCBNQiIpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3NpbmtfYWN0aXZhdGUgKEdzdFBhZCAqIHNpbmtwYWQsIEdzdE9iamVjdCAqIHBhcmVudCkKK3sKKyAgR3N0UXVlcnkgKnF1ZXJ5OworICBnYm9vbGVhbiBwdWxsX21vZGU7CisKKyAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X3NjaGVkdWxpbmcgKCk7CisKKyAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnkgKHNpbmtwYWQsIHF1ZXJ5KSkgeworICAgIGdzdF9xdWVyeV91bnJlZiAocXVlcnkpOworICAgIGdvdG8gYWN0aXZhdGVfcHVzaDsKKyAgfQorCisgIHB1bGxfbW9kZSA9IGdzdF9xdWVyeV9oYXNfc2NoZWR1bGluZ19tb2RlX3dpdGhfZmxhZ3MgKHF1ZXJ5LAorICAgICAgR1NUX1BBRF9NT0RFX1BVTEwsIEdTVF9TQ0hFRFVMSU5HX0ZMQUdfU0VFS0FCTEUpOworICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKworICBpZiAoIXB1bGxfbW9kZSkKKyAgICBnb3RvIGFjdGl2YXRlX3B1c2g7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2lua3BhZCwgImFjdGl2YXRpbmcgcHVsbCIpOworICByZXR1cm4gZ3N0X3BhZF9hY3RpdmF0ZV9tb2RlIChzaW5rcGFkLCBHU1RfUEFEX01PREVfUFVMTCwgVFJVRSk7CisKK2FjdGl2YXRlX3B1c2g6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rcGFkLCAiYWN0aXZhdGluZyBwdXNoIik7CisgICAgcmV0dXJuIGdzdF9wYWRfYWN0aXZhdGVfbW9kZSAoc2lua3BhZCwgR1NUX1BBRF9NT0RFX1BVU0gsIFRSVUUpOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcXRkZW11eF9zaW5rX2FjdGl2YXRlX21vZGUgKEdzdFBhZCAqIHNpbmtwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RRVERlbXV4ICpkZW11eCA9IEdTVF9RVERFTVVYIChwYXJlbnQpOworCisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgR1NUX1BBRF9NT0RFX1BVU0g6CisgICAgICBkZW11eC0+cHVsbGJhc2VkID0gRkFMU0U7CisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUEFEX01PREVfUFVMTDoKKyAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgZGVtdXgtPnB1bGxiYXNlZCA9IFRSVUU7CisgICAgICAgIHJlcyA9IGdzdF9wYWRfc3RhcnRfdGFzayAoc2lua3BhZCwgKEdzdFRhc2tGdW5jdGlvbikgZ3N0X3F0ZGVtdXhfbG9vcCwKKyAgICAgICAgICAgIHNpbmtwYWQsIE5VTEwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gZ3N0X3BhZF9zdG9wX3Rhc2sgKHNpbmtwYWQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IEZBTFNFOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworI2lmZGVmIEhBVkVfWkxJQgorc3RhdGljIHZvaWQgKgorcXRkZW11eF9pbmZsYXRlICh2b2lkICp6X2J1ZmZlciwgZ3VpbnQgel9sZW5ndGgsIGd1aW50ICogbGVuZ3RoKQoreworICBndWludDggKmJ1ZmZlcjsKKyAgel9zdHJlYW0gejsKKyAgaW50IHJldDsKKworICBtZW1zZXQgKCZ6LCAwLCBzaXplb2YgKHopKTsKKyAgei56YWxsb2MgPSBOVUxMOworICB6LnpmcmVlID0gTlVMTDsKKyAgei5vcGFxdWUgPSBOVUxMOworCisgIGlmICgocmV0ID0gaW5mbGF0ZUluaXQgKCZ6KSkgIT0gWl9PSykgeworICAgIEdTVF9FUlJPUiAoImluZmxhdGVJbml0KCkgcmV0dXJuZWQgJWQiLCByZXQpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgei5uZXh0X2luID0gel9idWZmZXI7CisgIHouYXZhaWxfaW4gPSB6X2xlbmd0aDsKKworICBidWZmZXIgPSAoZ3VpbnQ4ICopIGdfbWFsbG9jICgqbGVuZ3RoKTsKKyAgei5hdmFpbF9vdXQgPSAqbGVuZ3RoOworICB6Lm5leHRfb3V0ID0gKEJ5dGVmICopIGJ1ZmZlcjsKKyAgZG8geworICAgIHJldCA9IGluZmxhdGUgKCZ6LCBaX05PX0ZMVVNIKTsKKyAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkgeworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmIChyZXQgIT0gWl9PSykgeworICAgICAgR1NUX1dBUk5JTkcgKCJpbmZsYXRlKCkgcmV0dXJuZWQgJWQiLCByZXQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgKmxlbmd0aCArPSA0MDk2OworICAgIGJ1ZmZlciA9IChndWludDggKikgZ19yZWFsbG9jIChidWZmZXIsICpsZW5ndGgpOworICAgIHoubmV4dF9vdXQgPSAoQnl0ZWYgKikgKGJ1ZmZlciArIHoudG90YWxfb3V0KTsKKyAgICB6LmF2YWlsX291dCArPSA0MDk2OworICB9IHdoaWxlICh6LmF2YWlsX2luID4gMCk7CisKKyAgaWYgKHJldCAhPSBaX1NUUkVBTV9FTkQpIHsKKyAgICBnX2ZyZWUgKGJ1ZmZlcik7CisgICAgYnVmZmVyID0gTlVMTDsKKyAgICAqbGVuZ3RoID0gMDsKKyAgfSBlbHNlIHsKKyAgICAqbGVuZ3RoID0gei50b3RhbF9vdXQ7CisgIH0KKworICBpbmZsYXRlRW5kICgmeik7CisKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKyNlbmRpZiAvKiBIQVZFX1pMSUIgKi8KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3BhcnNlX21vb3YgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBjb25zdCBndWludDggKiBidWZmZXIsIGd1aW50IGxlbmd0aCkKK3sKKyAgR05vZGUgKmNtb3Y7CisKKyAgcXRkZW11eC0+bW9vdl9ub2RlID0gZ19ub2RlX25ldyAoKGd1aW50OCAqKSBidWZmZXIpOworCisgIC8qIGNvdW50cyBhcyBoZWFkZXIgZGF0YSAqLworICBxdGRlbXV4LT5oZWFkZXJfc2l6ZSArPSBsZW5ndGg7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInBhcnNpbmcgJ21vb3YnIGF0b20iKTsKKyAgcXRkZW11eF9wYXJzZV9ub2RlIChxdGRlbXV4LCBxdGRlbXV4LT5tb292X25vZGUsIGJ1ZmZlciwgbGVuZ3RoKTsKKworICBjbW92ID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChxdGRlbXV4LT5tb292X25vZGUsIEZPVVJDQ19jbW92KTsKKyAgaWYgKGNtb3YpIHsKKyAgICBndWludDMyIG1ldGhvZDsKKyAgICBHTm9kZSAqZGNvbTsKKyAgICBHTm9kZSAqY212ZDsKKyAgICBndWludDMyIGRjb21fbGVuOworCisgICAgZGNvbSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAoY21vdiwgRk9VUkNDX2Rjb20pOworICAgIGNtdmQgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKGNtb3YsIEZPVVJDQ19jbXZkKTsKKyAgICBpZiAoZGNvbSA9PSBOVUxMIHx8IGNtdmQgPT0gTlVMTCkKKyAgICAgIGdvdG8gaW52YWxpZF9jb21wcmVzc2lvbjsKKworICAgIGRjb21fbGVuID0gUVRfVUlOVDMyIChkY29tLT5kYXRhKTsKKyAgICBpZiAoZGNvbV9sZW4gPCAxMikKKyAgICAgIGdvdG8gaW52YWxpZF9jb21wcmVzc2lvbjsKKworICAgIG1ldGhvZCA9IFFUX0ZPVVJDQyAoKGd1aW50OCAqKSBkY29tLT5kYXRhICsgOCk7CisgICAgc3dpdGNoIChtZXRob2QpIHsKKyNpZmRlZiBIQVZFX1pMSUIKKyAgICAgIGNhc2UgRk9VUkNDX3psaWI6eworICAgICAgICBndWludCB1bmNvbXByZXNzZWRfbGVuZ3RoOworICAgICAgICBndWludCBjb21wcmVzc2VkX2xlbmd0aDsKKyAgICAgICAgZ3VpbnQ4ICpidWY7CisgICAgICAgIGd1aW50MzIgY212ZF9sZW47CisKKyAgICAgICAgY212ZF9sZW4gPSBRVF9VSU5UMzIgKChndWludDggKikgY212ZC0+ZGF0YSk7CisgICAgICAgIGlmIChjbXZkX2xlbiA8IDEyKQorICAgICAgICAgIGdvdG8gaW52YWxpZF9jb21wcmVzc2lvbjsKKworICAgICAgICB1bmNvbXByZXNzZWRfbGVuZ3RoID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIGNtdmQtPmRhdGEgKyA4KTsKKyAgICAgICAgY29tcHJlc3NlZF9sZW5ndGggPSBjbXZkX2xlbiAtIDEyOworICAgICAgICBHU1RfTE9HICgibGVuZ3RoID0gJXUiLCB1bmNvbXByZXNzZWRfbGVuZ3RoKTsKKworICAgICAgICBidWYgPQorICAgICAgICAgICAgKGd1aW50OCAqKSBxdGRlbXV4X2luZmxhdGUgKChndWludDggKikgY212ZC0+ZGF0YSArIDEyLAorICAgICAgICAgICAgY29tcHJlc3NlZF9sZW5ndGgsICZ1bmNvbXByZXNzZWRfbGVuZ3RoKTsKKworICAgICAgICBpZiAoYnVmKSB7CisgICAgICAgICAgcXRkZW11eC0+bW9vdl9ub2RlX2NvbXByZXNzZWQgPSBxdGRlbXV4LT5tb292X25vZGU7CisgICAgICAgICAgcXRkZW11eC0+bW9vdl9ub2RlID0gZ19ub2RlX25ldyAoYnVmKTsKKworICAgICAgICAgIHF0ZGVtdXhfcGFyc2Vfbm9kZSAocXRkZW11eCwgcXRkZW11eC0+bW9vdl9ub2RlLCBidWYsCisgICAgICAgICAgICAgIHVuY29tcHJlc3NlZF9sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorI2VuZGlmIC8qIEhBVkVfWkxJQiAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAidW5rbm93biBvciB1bmhhbmRsZWQgaGVhZGVyIGNvbXByZXNzaW9uICIKKyAgICAgICAgICAgICJ0eXBlICUiIEdTVF9GT1VSQ0NfRk9STUFULCBHU1RfRk9VUkNDX0FSR1MgKG1ldGhvZCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX2NvbXByZXNzaW9uOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgImludmFsaWQgY29tcHJlc3NlZCBoZWFkZXIiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3BhcnNlX2NvbnRhaW5lciAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdOb2RlICogbm9kZSwgY29uc3QgZ3VpbnQ4ICogYnVmLAorICAgIGNvbnN0IGd1aW50OCAqIGVuZCkKK3sKKyAgd2hpbGUgKEdfVU5MSUtFTFkgKGJ1ZiA8IGVuZCkpIHsKKyAgICBHTm9kZSAqY2hpbGQ7CisgICAgZ3VpbnQzMiBsZW47CisKKyAgICBpZiAoR19VTkxJS0VMWSAoYnVmICsgNCA+IGVuZCkpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiYnVmZmVyIG92ZXJydW4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBsZW4gPSBRVF9VSU5UMzIgKGJ1Zik7CisgICAgaWYgKEdfVU5MSUtFTFkgKGxlbiA9PSAwKSkgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJlbXB0eSBjb250YWluZXIiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoR19VTkxJS0VMWSAobGVuIDwgOCkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgImxlbmd0aCB0b28gc2hvcnQgKCVkIDwgOCkiLCBsZW4pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChHX1VOTElLRUxZIChsZW4gPiAoZW5kIC0gYnVmKSkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgImxlbmd0aCB0b28gbG9uZyAoJWQgPiAlZCkiLCBsZW4sCisgICAgICAgICAgKGdpbnQpIChlbmQgLSBidWYpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNoaWxkID0gZ19ub2RlX25ldyAoKGd1aW50OCAqKSBidWYpOworICAgIGdfbm9kZV9hcHBlbmQgKG5vZGUsIGNoaWxkKTsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImFkZGluZyBuZXcgbm9kZSBvZiBsZW4gJWQiLCBsZW4pOworICAgIHF0ZGVtdXhfcGFyc2Vfbm9kZSAocXRkZW11eCwgY2hpbGQsIGJ1ZiwgbGVuKTsKKworICAgIGJ1ZiArPSBsZW47CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcXRkZW11eF9wYXJzZV90aGVvcmFfZXh0ZW5zaW9uIChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwKKyAgICBHTm9kZSAqIHhkeHQpCit7CisgIGludCBsZW4gPSBRVF9VSU5UMzIgKHhkeHQtPmRhdGEpOworICBndWludDggKmJ1ZiA9IHhkeHQtPmRhdGE7CisgIGd1aW50OCAqZW5kID0gYnVmICsgbGVuOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKworICAvKiBza2lwIHNpemUgYW5kIHR5cGUgKi8KKyAgYnVmICs9IDg7CisgIGVuZCAtPSA4OworCisgIHdoaWxlIChidWYgPCBlbmQpIHsKKyAgICBnaW50IHNpemU7CisgICAgZ3VpbnQzMiB0eXBlOworCisgICAgc2l6ZSA9IFFUX1VJTlQzMiAoYnVmKTsKKyAgICB0eXBlID0gUVRfRk9VUkNDIChidWYgKyA0KTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJXAgJXAiLCBidWYsIGVuZCk7CisKKyAgICBpZiAoYnVmICsgc2l6ZSA+IGVuZCB8fCBzaXplIDw9IDApCisgICAgICBicmVhazsKKworICAgIGJ1ZiArPSA4OworICAgIHNpemUgLT0gODsKKworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgImhhdmUgY29va2llICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHR5cGUpKTsKKworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBGT1VSQ0NfdEN0SDoKKyAgICAgICAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChidWZmZXIsIDAsIGJ1Ziwgc2l6ZSk7CisgICAgICAgIHN0cmVhbS0+YnVmZmVycyA9IGdfc2xpc3RfYXBwZW5kIChzdHJlYW0tPmJ1ZmZlcnMsIGJ1ZmZlcik7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAicGFyc2luZyB0aGVvcmEgaGVhZGVyIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGT1VSQ0NfdEN0XzoKKyAgICAgICAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChidWZmZXIsIDAsIGJ1Ziwgc2l6ZSk7CisgICAgICAgIHN0cmVhbS0+YnVmZmVycyA9IGdfc2xpc3RfYXBwZW5kIChzdHJlYW0tPmJ1ZmZlcnMsIGJ1ZmZlcik7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAicGFyc2luZyB0aGVvcmEgY29tbWVudCIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk9VUkNDX3RDdEM6CisgICAgICAgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZSk7CisgICAgICAgIGdzdF9idWZmZXJfZmlsbCAoYnVmZmVyLCAwLCBidWYsIHNpemUpOworICAgICAgICBzdHJlYW0tPmJ1ZmZlcnMgPSBnX3NsaXN0X2FwcGVuZCAoc3RyZWFtLT5idWZmZXJzLCBidWZmZXIpOworICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInBhcnNpbmcgdGhlb3JhIGNvZGVib29rIik7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICAgInVua25vd24gdGhlb3JhIGNvb2tpZSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodHlwZSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgYnVmICs9IHNpemU7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcXRkZW11eF9wYXJzZV9ub2RlIChHc3RRVERlbXV4ICogcXRkZW11eCwgR05vZGUgKiBub2RlLCBjb25zdCBndWludDggKiBidWZmZXIsCisgICAgZ3VpbnQgbGVuZ3RoKQoreworICBndWludDMyIGZvdXJjYyA9IDA7CisgIGd1aW50MzIgbm9kZV9sZW5ndGggPSAwOworICBjb25zdCBRdE5vZGVUeXBlICp0eXBlOworICBjb25zdCBndWludDggKmVuZDsKKworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInF0ZGVtdXhfcGFyc2UgYnVmZmVyICVwIGxlbmd0aCAldSIsIGJ1ZmZlciwgbGVuZ3RoKTsKKworICBpZiAoR19VTkxJS0VMWSAobGVuZ3RoIDwgOCkpCisgICAgZ290byBub3RfZW5vdWdoX2RhdGE7CisKKyAgbm9kZV9sZW5ndGggPSBRVF9VSU5UMzIgKGJ1ZmZlcik7CisgIGZvdXJjYyA9IFFUX0ZPVVJDQyAoYnVmZmVyICsgNCk7CisKKyAgLyogaWdub3JlIGVtcHR5IG5vZGVzICovCisgIGlmIChHX1VOTElLRUxZIChmb3VyY2MgPT0gMCB8fCBub2RlX2xlbmd0aCA9PSA4KSkKKyAgICByZXR1cm4gVFJVRTsKKworICB0eXBlID0gcXRkZW11eF90eXBlX2dldCAoZm91cmNjKTsKKworICBlbmQgPSBidWZmZXIgKyBsZW5ndGg7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAicGFyc2luZyAnJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIicsIGxlbmd0aD0ldSwgbmFtZSAnJXMnIiwKKyAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgbm9kZV9sZW5ndGgsIHR5cGUtPm5hbWUpOworCisgIGlmIChub2RlX2xlbmd0aCA+IGxlbmd0aCkKKyAgICBnb3RvIGJyb2tlbl9hdG9tX3NpemU7CisKKyAgaWYgKHR5cGUtPmZsYWdzICYgUVRfRkxBR19DT05UQUlORVIpIHsKKyAgICBxdGRlbXV4X3BhcnNlX2NvbnRhaW5lciAocXRkZW11eCwgbm9kZSwgYnVmZmVyICsgOCwgZW5kKTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZvdXJjYykgeworICAgICAgY2FzZSBGT1VSQ0Nfc3RzZDoKKyAgICAgIHsKKyAgICAgICAgaWYgKG5vZGVfbGVuZ3RoIDwgMjApIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInNraXBwaW5nIHNtYWxsIHN0c2QgYm94Iik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICJwYXJzaW5nIHN0c2QgKHNhbXBsZSB0YWJsZSwgc2FtcGxlIGRlc2NyaXB0aW9uKSBhdG9tIik7CisgICAgICAgIC8qIFNraXAgb3ZlciA4IGJ5dGUgYXRvbSBoZHIgKyAxIGJ5dGUgdmVyc2lvbiwgMyBieXRlcyBmbGFncywgNCBieXRlIG51bV9lbnRyaWVzICovCisgICAgICAgIHF0ZGVtdXhfcGFyc2VfY29udGFpbmVyIChxdGRlbXV4LCBub2RlLCBidWZmZXIgKyAxNiwgZW5kKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEZPVVJDQ19tcDRhOgorICAgICAgY2FzZSBGT1VSQ0NfYWxhYzoKKyAgICAgIGNhc2UgRk9VUkNDX2ZMYUM6CisgICAgICB7CisgICAgICAgIGd1aW50MzIgdmVyc2lvbjsKKyAgICAgICAgZ3VpbnQzMiBvZmZzZXQ7CisgICAgICAgIGd1aW50IG1pbl9zaXplOworCisgICAgICAgIC8qIGFsc28gcmVhZCBhbGFjIChvciB3aGF0ZXZlcikgaW4gc3RlYWQgb2YgbXA0YSBpbiB0aGUgZm9sbG93aW5nLAorICAgICAgICAgKiBzaW5jZSBhIHNpbWlsYXIgbGF5b3V0IGlzIHVzZWQgaW4gb3RoZXIgY2FzZXMgYXMgd2VsbCAqLworICAgICAgICBpZiAoZm91cmNjID09IEZPVVJDQ19tcDRhKQorICAgICAgICAgIG1pbl9zaXplID0gMjA7CisgICAgICAgIGVsc2UgaWYgKGZvdXJjYyA9PSBGT1VSQ0NfZkxhQykKKyAgICAgICAgICBtaW5fc2l6ZSA9IDg2OworICAgICAgICBlbHNlCisgICAgICAgICAgbWluX3NpemUgPSA0MDsKKworICAgICAgICAvKiBUaGVyZSBhcmUgdHdvIHRoaW5ncyB3ZSBtaWdodCBlbmNvdW50ZXIgaGVyZTogYSB0cnVlIG1wNGEgYXRvbSwgYW5kCisgICAgICAgICAgIGFuIG1wNGEgZW50cnkgaW4gYW4gc3RzZCBhdG9tLiBUaGUgbGF0dGVyIGlzIHdoYXQgd2UncmUgaW50ZXJlc3RlZAorICAgICAgICAgICBpbiwgYW5kIGl0IGxvb2tzIGxpa2UgYW4gYXRvbSwgYnV0IGlzbid0IHJlYWxseSBvbmUuIFRoZSB0cnVlIG1wNGEKKyAgICAgICAgICAgYXRvbSBpcyBzaG9ydCwgc28gd2UgZGV0ZWN0IGl0IGJhc2VkIG9uIGxlbmd0aCBoZXJlLiAqLworICAgICAgICBpZiAobGVuZ3RoIDwgbWluX3NpemUpIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInNraXBwaW5nIHNtYWxsICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgYm94IiwKKyAgICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qICd2ZXJzaW9uJyBoZXJlIGlzIHRoZSBzb3VuZCBzYW1wbGUgZGVzY3JpcHRpb24gdmVyc2lvbi4gVHlwZXMgMCBhbmQKKyAgICAgICAgICAgMSBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgUVRGRiByZWZlcmVuY2UsIGJ1dCB0eXBlIDIgaXMgbm90OiBpdCdzCisgICAgICAgICAgIGRlc2NyaWJlZCBpbiBBcHBsZSBoZWFkZXIgZmlsZXMgaW5zdGVhZCAoc3RydWN0IFNvdW5kRGVzY3JpcHRpb25WMgorICAgICAgICAgICBpbiBNb3ZpZXMuaCkgKi8KKyAgICAgICAgdmVyc2lvbiA9IFFUX1VJTlQxNiAoYnVmZmVyICsgMTYpOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICIlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIHZlcnNpb24gMHglMDh4IiwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgdmVyc2lvbik7CisKKyAgICAgICAgLyogcGFyc2UgYW55IGVzZHMgZGVzY3JpcHRvcnMgKi8KKyAgICAgICAgc3dpdGNoICh2ZXJzaW9uKSB7CisgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgb2Zmc2V0ID0gMHgyNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG9mZnNldCA9IDB4MzQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBvZmZzZXQgPSAweDQ4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICAgICAidW5oYW5kbGVkICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgdmVyc2lvbiAweCUwOHgiLAorICAgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgdmVyc2lvbik7CisgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mZnNldCkKKyAgICAgICAgICBxdGRlbXV4X3BhcnNlX2NvbnRhaW5lciAocXRkZW11eCwgbm9kZSwgYnVmZmVyICsgb2Zmc2V0LCBlbmQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRk9VUkNDX21wNHY6CisgICAgICBjYXNlIEZPVVJDQ19NUDRWOgorICAgICAgY2FzZSBGT1VSQ0NfZm1wNDoKKyAgICAgIGNhc2UgRk9VUkNDX0ZNUDQ6CisgICAgICBjYXNlIEZPVVJDQ19hcGNzOgorICAgICAgY2FzZSBGT1VSQ0NfYXBjaDoKKyAgICAgIGNhc2UgRk9VUkNDX2FwY246CisgICAgICBjYXNlIEZPVVJDQ19hcGNvOgorICAgICAgY2FzZSBGT1VSQ0NfYXA0aDoKKyAgICAgIGNhc2UgRk9VUkNDX3h2aWQ6CisgICAgICBjYXNlIEZPVVJDQ19YVklEOgorICAgICAgY2FzZSBGT1VSQ0NfSDI2NDoKKyAgICAgIGNhc2UgRk9VUkNDX2F2YzE6CisgICAgICBjYXNlIEZPVVJDQ19hdmMzOgorICAgICAgY2FzZSBGT1VSQ0NfSDI2NToKKyAgICAgIGNhc2UgRk9VUkNDX2h2YzE6CisgICAgICBjYXNlIEZPVVJDQ19oZXYxOgorICAgICAgY2FzZSBGT1VSQ0NfbWpwMjoKKyAgICAgIGNhc2UgRk9VUkNDX2VuY3Y6CisgICAgICB7CisgICAgICAgIGd1aW50MzIgdmVyc2lvbjsKKyAgICAgICAgZ3VpbnQzMiBzdHJfbGVuOworCisgICAgICAgIC8qIGNvZGVjX2RhdGEgaXMgY29udGFpbmVkIGluc2lkZSB0aGVzZSBhdG9tcywgd2hpY2ggYWxsIGhhdmUKKyAgICAgICAgICogdGhlIHNhbWUgZm9ybWF0LiAqLworICAgICAgICAvKiB2aWRlbyBzYW1wbGUgZGVzY3JpcHRpb24gc2l6ZSBpcyA4NiBieXRlcyB3aXRob3V0IGV4dGVuc2lvbi4KKyAgICAgICAgICogbm9kZV9sZW5ndGggaGF2ZSB0byBiZSBiaWdnZXIgdGhhbiA4NiBieXRlcyBiZWNhdXNlIHZpZGVvIHNhbXBsZQorICAgICAgICAgKiBkZXNjcmlwdGlvbiBjYW4gaW5jbHVkZSBleHRlbnN0aW9ucyBzdWNoIGFzIGVzZHMsIGZpZWwsIGdsYmwsIGV0Yy4gKi8KKyAgICAgICAgaWYgKG5vZGVfbGVuZ3RoIDwgODYpIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICIlIiBHU1RfRk9VUkNDX0ZPUk1BVAorICAgICAgICAgICAgICAiIHNhbXBsZSBkZXNjcmlwdGlvbiBsZW5ndGggdG9vIHNob3J0ICgldSA8IDg2KSIsCisgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgbm9kZV9sZW5ndGgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInBhcnNpbmcgaW4gJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYykpOworCisgICAgICAgIC8qIHZlcnNpb24gKDIgYnl0ZXMpIDogdGhpcyBpcyBzZXQgdG8gMCwgdW5sZXNzIGEgY29tcHJlc3NvciBoYXMgY2hhbmdlZAorICAgICAgICAgKiAgICAgICAgICAgICAgaXRzIGRhdGEgZm9ybWF0LgorICAgICAgICAgKiByZXZpc2lvbiBsZXZlbCAoMiBieXRlcykgOiBtdXN0IGJlIHNldCB0byAwLiAqLworICAgICAgICB2ZXJzaW9uID0gUVRfVUlOVDMyIChidWZmZXIgKyAxNik7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJ2ZXJzaW9uICUwOHgiLCB2ZXJzaW9uKTsKKworICAgICAgICAvKiBjb21wcmVzc29yIG5hbWUgOiBQQVNDQUwgc3RyaW5nIGFuZCBpbmZvcm1hdGl2ZSBwdXJwb3NlcworICAgICAgICAgKiBmaXJzdCBieXRlIDogdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBkaXNwbGF5ZWQuCisgICAgICAgICAqICAgICAgICAgICAgICBpdCBoYXMgdG8gYmUgbGVzcyB0aGFuIDMyIGJlY2F1c2UgaXQgaXMgcmVzZXJ2ZWQKKyAgICAgICAgICogICAgICAgICAgICAgIHNwYWNlIG9mIDMyIGJ5dGVzIHRvdGFsIGluY2x1ZGluZyBpdHNlbGYuICovCisgICAgICAgIHN0cl9sZW4gPSBRVF9VSU5UOCAoYnVmZmVyICsgNTApOworICAgICAgICBpZiAoc3RyX2xlbiA8IDMyKQorICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJjb21wcmVzc29ybmFtZSA9ICUuKnMiLCBzdHJfbGVuLAorICAgICAgICAgICAgICAoY2hhciAqKSBidWZmZXIgKyA1MSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAgICJjb21wcmVzc29ybmFtZSBsZW5ndGggdG9vIGJpZyAoJXUgPiAzMSkiLCBzdHJfbGVuKTsKKworICAgICAgICBHU1RfTUVNRFVNUF9PQkpFQ1QgKHF0ZGVtdXgsICJ2aWRlbyBzYW1wbGUgZGVzY3JpcHRpb24iLCBidWZmZXIsCisgICAgICAgICAgICBlbmQgLSBidWZmZXIpOworICAgICAgICBxdGRlbXV4X3BhcnNlX2NvbnRhaW5lciAocXRkZW11eCwgbm9kZSwgYnVmZmVyICsgODYsIGVuZCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBGT1VSQ0NfbWV0YToKKyAgICAgIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInBhcnNpbmcgbWV0YSBhdG9tIik7CisKKyAgICAgICAgLyogWW91IGFyZSByZWFkaW5nIHRoaXMgY29ycmVjdGx5LiBRVEZGIHNwZWNpZmllcyB0aGF0IHRoZQorICAgICAgICAgKiBtZXRhZGF0YSBhdG9tIGlzIGEgc2hvcnQgYXRvbSwgd2hlcmVhcyBJU08gQk1GRiBzcGVjaWZpZXMKKyAgICAgICAgICogaXQncyBhIGZ1bGwgYXRvbS4gQnV0IHNpbmNlIHNvIG1hbnkgcGVvcGxlIGFyZSBkb2luZyB0aGluZ3MKKyAgICAgICAgICogZGlmZmVyZW50bHksIHdlIGFjdHVhbGx5IHBlZWsgaW50byB0aGUgYXRvbSB0byBzZWUgd2hpY2gKKyAgICAgICAgICogdmFyaWFudCBpdCBpcyAqLworICAgICAgICBpZiAobGVuZ3RoIDwgMTYpIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInNraXBwaW5nIHNtYWxsICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgYm94IiwKKyAgICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoUVRfRk9VUkNDIChidWZmZXIgKyAxMikgPT0gRk9VUkNDX2hkbHIpIHsKKyAgICAgICAgICAvKiBWYXJpYW50IDE6IFdoYXQgUVRGRiBzcGVjaWZpZXMuICdtZXRhJyBpcyBhIHNob3J0IGhlYWRlciB3aGljaAorICAgICAgICAgICAqIHN0YXJ0cyB3aXRoIGEgJ2hkbHInIGF0b20gKi8KKyAgICAgICAgICBxdGRlbXV4X3BhcnNlX2NvbnRhaW5lciAocXRkZW11eCwgbm9kZSwgYnVmZmVyICsgOCwgZW5kKTsKKyAgICAgICAgfSBlbHNlIGlmIChRVF9VSU5UMzIgKGJ1ZmZlciArIDgpID09IDB4MDAwMDAwMDApIHsKKyAgICAgICAgICAvKiBWYXJpYW50IDI6IFdoYXQgSVNPIEJNRkYgc3BlY2lmaWVzLiAnbWV0YScgaXMgYSBfZnVsbF8gYXRvbQorICAgICAgICAgICAqIHdpdGggdmVyc2lvbi9mbGFncyBib3RoIHNldCB0byB6ZXJvICovCisgICAgICAgICAgcXRkZW11eF9wYXJzZV9jb250YWluZXIgKHF0ZGVtdXgsIG5vZGUsIGJ1ZmZlciArIDEyLCBlbmQpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJVbmtub3duICdtZXRhJyBhdG9tIGZvcm1hdCIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRk9VUkNDX21wNHM6CisgICAgICB7CisgICAgICAgIEdTVF9NRU1EVU1QX09CSkVDVCAocXRkZW11eCwgIm1wNHMiLCBidWZmZXIsIGVuZCAtIGJ1ZmZlcik7CisgICAgICAgIC8qIFNraXAgOCBieXRlIGhlYWRlciwgcGx1cyA4IGJ5dGUgdmVyc2lvbiArIGZsYWdzICsgZW50cnlfY291bnQgKi8KKyAgICAgICAgcXRkZW11eF9wYXJzZV9jb250YWluZXIgKHF0ZGVtdXgsIG5vZGUsIGJ1ZmZlciArIDE2LCBlbmQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRk9VUkNDX1hpVGg6CisgICAgICB7CisgICAgICAgIGd1aW50MzIgdmVyc2lvbjsKKyAgICAgICAgZ3VpbnQzMiBvZmZzZXQ7CisKKyAgICAgICAgaWYgKGxlbmd0aCA8IDE2KSB7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJza2lwcGluZyBzbWFsbCAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIGJveCIsCisgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB2ZXJzaW9uID0gUVRfVUlOVDMyIChidWZmZXIgKyAxMik7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJwYXJzaW5nIFhpVGggYXRvbSB2ZXJzaW9uIDB4JTA4eCIsIHZlcnNpb24pOworCisgICAgICAgIHN3aXRjaCAodmVyc2lvbikgeworICAgICAgICAgIGNhc2UgMHgwMDAwMDAwMToKKyAgICAgICAgICAgIG9mZnNldCA9IDB4NjI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInVua25vd24gdmVyc2lvbiAweCUwOHgiLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgICAgaWYgKGxlbmd0aCA8IG9mZnNldCkgeworICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICAgICAgICJza2lwcGluZyB0b28gc21hbGwgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiBib3giLAorICAgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgcXRkZW11eF9wYXJzZV9jb250YWluZXIgKHF0ZGVtdXgsIG5vZGUsIGJ1ZmZlciArIG9mZnNldCwgZW5kKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRk9VUkNDX2luMjQ6CisgICAgICB7CisgICAgICAgIHF0ZGVtdXhfcGFyc2VfY29udGFpbmVyIChxdGRlbXV4LCBub2RlLCBidWZmZXIgKyAweDM0LCBlbmQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRk9VUkNDX3V1aWQ6CisgICAgICB7CisgICAgICAgIHF0ZGVtdXhfcGFyc2VfdXVpZCAocXRkZW11eCwgYnVmZmVyLCBlbmQgLSBidWZmZXIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRk9VUkNDX2VuY2E6CisgICAgICB7CisgICAgICAgIHF0ZGVtdXhfcGFyc2VfY29udGFpbmVyIChxdGRlbXV4LCBub2RlLCBidWZmZXIgKyAzNiwgZW5kKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoIXN0cmNtcCAodHlwZS0+bmFtZSwgInVua25vd24iKSkKKyAgICAgICAgICBHU1RfTUVNRFVNUCAoIlVua25vd24gdGFnIiwgYnVmZmVyICsgNCwgZW5kIC0gYnVmZmVyIC0gNCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInBhcnNlZCAnJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiciLAorICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKyAgcmV0dXJuIFRSVUU7CisKKy8qIEVSUk9SUyAqLworbm90X2Vub3VnaF9kYXRhOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0ZGVtdXgsIFNUUkVBTSwgREVNVVgsCisgICAgICAgIChfKCJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iKSksCisgICAgICAgICgiTm90IGVub3VnaCBkYXRhIGZvciBhbiBhdG9tIGhlYWRlciwgZ290IG9ubHkgJXUgYnl0ZXMiLCBsZW5ndGgpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2Jyb2tlbl9hdG9tX3NpemU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRkZW11eCwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgKF8oIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIpKSwKKyAgICAgICAgKCJBdG9tICclIiBHU1RfRk9VUkNDX0ZPUk1BVCAiJyBoYXMgc2l6ZSBvZiAldSBieXRlcywgYnV0IHdlIGhhdmUgb25seSAiCisgICAgICAgICAgICAiJXUgYnl0ZXMgYXZhaWxhYmxlLiIsIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgbm9kZV9sZW5ndGgsCisgICAgICAgICAgICBsZW5ndGgpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdOb2RlICoKK3F0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAoR05vZGUgKiBub2RlLCBndWludDMyIGZvdXJjYykKK3sKKyAgR05vZGUgKmNoaWxkOworICBndWludDggKmJ1ZmZlcjsKKyAgZ3VpbnQzMiBjaGlsZF9mb3VyY2M7CisKKyAgZm9yIChjaGlsZCA9IGdfbm9kZV9maXJzdF9jaGlsZCAobm9kZSk7IGNoaWxkOworICAgICAgY2hpbGQgPSBnX25vZGVfbmV4dF9zaWJsaW5nIChjaGlsZCkpIHsKKyAgICBidWZmZXIgPSAoZ3VpbnQ4ICopIGNoaWxkLT5kYXRhOworCisgICAgY2hpbGRfZm91cmNjID0gUVRfRk9VUkNDIChidWZmZXIgKyA0KTsKKworICAgIGlmIChHX1VOTElLRUxZIChjaGlsZF9mb3VyY2MgPT0gZm91cmNjKSkgeworICAgICAgcmV0dXJuIGNoaWxkOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEdOb2RlICoKK3F0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZV9mdWxsIChHTm9kZSAqIG5vZGUsIGd1aW50MzIgZm91cmNjLAorICAgIEdzdEJ5dGVSZWFkZXIgKiBwYXJzZXIpCit7CisgIEdOb2RlICpjaGlsZDsKKyAgZ3VpbnQ4ICpidWZmZXI7CisgIGd1aW50MzIgY2hpbGRfZm91cmNjLCBjaGlsZF9sZW47CisKKyAgZm9yIChjaGlsZCA9IGdfbm9kZV9maXJzdF9jaGlsZCAobm9kZSk7IGNoaWxkOworICAgICAgY2hpbGQgPSBnX25vZGVfbmV4dF9zaWJsaW5nIChjaGlsZCkpIHsKKyAgICBidWZmZXIgPSAoZ3VpbnQ4ICopIGNoaWxkLT5kYXRhOworCisgICAgY2hpbGRfbGVuID0gUVRfVUlOVDMyIChidWZmZXIpOworICAgIGNoaWxkX2ZvdXJjYyA9IFFUX0ZPVVJDQyAoYnVmZmVyICsgNCk7CisKKyAgICBpZiAoR19VTkxJS0VMWSAoY2hpbGRfZm91cmNjID09IGZvdXJjYykpIHsKKyAgICAgIGlmIChHX1VOTElLRUxZIChjaGlsZF9sZW4gPCAoNCArIDQpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAvKiBGSVhNRTogbXVzdCB2ZXJpZnkgaWYgYXRvbSBsZW5ndGggPCBwYXJlbnQgYXRvbSBsZW5ndGggKi8KKyAgICAgIGdzdF9ieXRlX3JlYWRlcl9pbml0IChwYXJzZXIsIGJ1ZmZlciArICg0ICsgNCksIGNoaWxkX2xlbiAtICg0ICsgNCkpOworICAgICAgcmV0dXJuIGNoaWxkOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEdOb2RlICoKK3F0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfaW5kZXggKEdOb2RlICogbm9kZSwgZ3VpbnQgaW5kZXgpCit7CisgIHJldHVybiBnX25vZGVfbnRoX2NoaWxkIChub2RlLCBpbmRleCk7Cit9CisKK3N0YXRpYyBHTm9kZSAqCitxdGRlbXV4X3RyZWVfZ2V0X3NpYmxpbmdfYnlfdHlwZV9mdWxsIChHTm9kZSAqIG5vZGUsIGd1aW50MzIgZm91cmNjLAorICAgIEdzdEJ5dGVSZWFkZXIgKiBwYXJzZXIpCit7CisgIEdOb2RlICpjaGlsZDsKKyAgZ3VpbnQ4ICpidWZmZXI7CisgIGd1aW50MzIgY2hpbGRfZm91cmNjLCBjaGlsZF9sZW47CisKKyAgZm9yIChjaGlsZCA9IGdfbm9kZV9uZXh0X3NpYmxpbmcgKG5vZGUpOyBjaGlsZDsKKyAgICAgIGNoaWxkID0gZ19ub2RlX25leHRfc2libGluZyAoY2hpbGQpKSB7CisgICAgYnVmZmVyID0gKGd1aW50OCAqKSBjaGlsZC0+ZGF0YTsKKworICAgIGNoaWxkX2ZvdXJjYyA9IFFUX0ZPVVJDQyAoYnVmZmVyICsgNCk7CisKKyAgICBpZiAoY2hpbGRfZm91cmNjID09IGZvdXJjYykgeworICAgICAgaWYgKHBhcnNlcikgeworICAgICAgICBjaGlsZF9sZW4gPSBRVF9VSU5UMzIgKGJ1ZmZlcik7CisgICAgICAgIGlmIChHX1VOTElLRUxZIChjaGlsZF9sZW4gPCAoNCArIDQpKSkKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgLyogRklYTUU6IG11c3QgdmVyaWZ5IGlmIGF0b20gbGVuZ3RoIDwgcGFyZW50IGF0b20gbGVuZ3RoICovCisgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9pbml0IChwYXJzZXIsIGJ1ZmZlciArICg0ICsgNCksIGNoaWxkX2xlbiAtICg0ICsgNCkpOworICAgICAgfQorICAgICAgcmV0dXJuIGNoaWxkOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEdOb2RlICoKK3F0ZGVtdXhfdHJlZV9nZXRfc2libGluZ19ieV90eXBlIChHTm9kZSAqIG5vZGUsIGd1aW50MzIgZm91cmNjKQoreworICByZXR1cm4gcXRkZW11eF90cmVlX2dldF9zaWJsaW5nX2J5X3R5cGVfZnVsbCAobm9kZSwgZm91cmNjLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfZG9fYWxsb2NhdGlvbiAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0pCit7CisvKiBGSVhNRTogVGhpcyBjYW4gb25seSByZWxpYWJseSB3b3JrIGlmIGRlbXV4ZXJzIGhhdmUgYQorICogc2VwYXJhdGUgc3RyZWFtaW5nIHRocmVhZCBwZXIgc3JjcGFkLiBUaGlzIHNob3VsZCBiZQorICogZG9uZSBpbiBhIGRlbXV4ZXIgYmFzZSBjbGFzcywgd2hpY2ggaW50ZWdyYXRlcyBwYXJ0cworICogb2YgbXVsdGlxdWV1ZQorICoKKyAqIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDE4NTYKKyAqLworI2lmIDAKKyAgR3N0UXVlcnkgKnF1ZXJ5OworCisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19hbGxvY2F0aW9uIChzdHJlYW0tPmNhcHMsIEZBTFNFKTsKKworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeSAoc3RyZWFtLT5wYWQsIHF1ZXJ5KSkgeworICAgIC8qIG5vdCBhIHByb2JsZW0sIGp1c3QgZGVidWcgYSBsaXR0bGUgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicGVlciBBTExPQ0FUSU9OIHF1ZXJ5IGZhaWxlZCIpOworICB9CisKKyAgaWYgKHN0cmVhbS0+YWxsb2NhdG9yKQorICAgIGdzdF9vYmplY3RfdW5yZWYgKHN0cmVhbS0+YWxsb2NhdG9yKTsKKworICBpZiAoZ3N0X3F1ZXJ5X2dldF9uX2FsbG9jYXRpb25fcGFyYW1zIChxdWVyeSkgPiAwKSB7CisgICAgLyogdHJ5IHRoZSBhbGxvY2F0b3IgKi8KKyAgICBnc3RfcXVlcnlfcGFyc2VfbnRoX2FsbG9jYXRpb25fcGFyYW0gKHF1ZXJ5LCAwLCAmc3RyZWFtLT5hbGxvY2F0b3IsCisgICAgICAgICZzdHJlYW0tPnBhcmFtcyk7CisgICAgc3RyZWFtLT51c2VfYWxsb2NhdG9yID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBzdHJlYW0tPmFsbG9jYXRvciA9IE5VTEw7CisgICAgZ3N0X2FsbG9jYXRpb25fcGFyYW1zX2luaXQgKCZzdHJlYW0tPnBhcmFtcyk7CisgICAgc3RyZWFtLT51c2VfYWxsb2NhdG9yID0gRkFMU0U7CisgIH0KKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisjZW5kaWYKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcXRkZW11eF9jb25maWd1cmVfcHJvdGVjdGVkX2NhcHMgKEdzdFFURGVtdXggKiBxdGRlbXV4LAorICAgIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0pCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgY29uc3QgZ2NoYXIgKnNlbGVjdGVkX3N5c3RlbTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAocXRkZW11eCAhPSBOVUxMLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzdHJlYW0gIT0gTlVMTCwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ3N0X2NhcHNfZ2V0X3NpemUgKENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMpID09IDEsCisgICAgICBGQUxTRSk7CisKKyAgaWYgKHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfdHlwZSAhPSBGT1VSQ0NfY2VuYykgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJ1bnN1cHBvcnRlZCBwcm90ZWN0aW9uIHNjaGVtZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocXRkZW11eC0+cHJvdGVjdGlvbl9zeXN0ZW1faWRzID09IE5VTEwpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChxdGRlbXV4LCAic3RyZWFtIGlzIHByb3RlY3RlZCB1c2luZyBjZW5jLCBidXQgbm8gIgorICAgICAgICAiY2VuYyBwcm90ZWN0aW9uIHN5c3RlbSBpbmZvcm1hdGlvbiBoYXMgYmVlbiBmb3VuZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBnX3B0cl9hcnJheV9hZGQgKHF0ZGVtdXgtPnByb3RlY3Rpb25fc3lzdGVtX2lkcywgTlVMTCk7CisgIHNlbGVjdGVkX3N5c3RlbSA9IGdzdF9wcm90ZWN0aW9uX3NlbGVjdF9zeXN0ZW0gKChjb25zdCBnY2hhciAqKikKKyAgICAgIHF0ZGVtdXgtPnByb3RlY3Rpb25fc3lzdGVtX2lkcy0+cGRhdGEpOworICBnX3B0cl9hcnJheV9yZW1vdmVfaW5kZXggKHF0ZGVtdXgtPnByb3RlY3Rpb25fc3lzdGVtX2lkcywKKyAgICAgIHF0ZGVtdXgtPnByb3RlY3Rpb25fc3lzdGVtX2lkcy0+bGVuIC0gMSk7CisgIGlmICghc2VsZWN0ZWRfc3lzdGVtKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwgInN0cmVhbSBpcyBwcm90ZWN0ZWQsIGJ1dCBubyAiCisgICAgICAgICJzdWl0YWJsZSBkZWNyeXB0b3IgZWxlbWVudCBoYXMgYmVlbiBmb3VuZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLCAwKTsKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiYXBwbGljYXRpb24veC1jZW5jIikpIHsKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocywKKyAgICAgICAgIm9yaWdpbmFsLW1lZGlhLXR5cGUiLCBHX1RZUEVfU1RSSU5HLCBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKSwKKyAgICAgICAgR1NUX1BST1RFQ1RJT05fU1lTVEVNX0lEX0NBUFNfRklFTEQsIEdfVFlQRV9TVFJJTkcsIHNlbGVjdGVkX3N5c3RlbSwKKyAgICAgICAgTlVMTCk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAocywgImFwcGxpY2F0aW9uL3gtY2VuYyIpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9xdGRlbXV4X2NvbmZpZ3VyZV9zdHJlYW0gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBRdERlbXV4U3RyZWFtICogc3RyZWFtKQoreworICBpZiAoc3RyZWFtLT5zdWJ0eXBlID09IEZPVVJDQ192aWRlKSB7CisgICAgLyogZnBzIGlzIGNhbGN1bGF0ZWQgYmFzZSBvbiB0aGUgZHVyYXRpb24gb2YgdGhlIGF2ZXJhZ2UgZnJhbWVyYXRlIHNpbmNlCisgICAgICogcXQgZG9lcyBub3QgaGF2ZSBhIGZpeGVkIGZyYW1lcmF0ZS4gKi8KKyAgICBnYm9vbGVhbiBmcHNfYXZhaWxhYmxlID0gVFJVRTsKKworICAgIGlmICgoc3RyZWFtLT5uX3NhbXBsZXMgPT0gMSAmJiBzdHJlYW0tPmZpcnN0X2R1cmF0aW9uID09IDApCisgICAgICAgIHx8IChxdGRlbXV4LT5mcmFnbWVudGVkICYmIHN0cmVhbS0+bl9zYW1wbGVzX21vb2YgPT0gMSkpIHsKKyAgICAgIC8qIHN0aWxsIGZyYW1lICovCisgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5mcHNfbiA9IDA7CisgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5mcHNfZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChzdHJlYW0tPmR1cmF0aW9uID09IDAgfHwgc3RyZWFtLT5uX3NhbXBsZXMgPCAyKSB7CisgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmZwc19uID0gc3RyZWFtLT50aW1lc2NhbGU7CisgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmZwc19kID0gMTsKKyAgICAgICAgZnBzX2F2YWlsYWJsZSA9IEZBTFNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIGF2Z19kdXJhdGlvbjsKKyAgICAgICAgZ3VpbnQ2NCBkdXJhdGlvbjsKKyAgICAgICAgZ3VpbnQzMiBuX3NhbXBsZXM7CisKKyAgICAgICAgLyogZHVyYXRpb24gYW5kIG5fc2FtcGxlcyBjYW4gYmUgdXBkYXRlZCBmb3IgZnJhZ21lbnRlZCBmb3JtYXQKKyAgICAgICAgICogc28sIGZyYW1lcmF0ZSBvZiBmcmFnbWVudGVkIGZvcm1hdCBpcyBjYWxjdWxhdGVkIHVzaW5nIGRhdGEgaW4gYSBtb29mICovCisgICAgICAgIGlmIChxdGRlbXV4LT5mcmFnbWVudGVkICYmIHN0cmVhbS0+bl9zYW1wbGVzX21vb2YgPiAwCisgICAgICAgICAgICAmJiBzdHJlYW0tPmR1cmF0aW9uX21vb2YgPiAwKSB7CisgICAgICAgICAgbl9zYW1wbGVzID0gc3RyZWFtLT5uX3NhbXBsZXNfbW9vZjsKKyAgICAgICAgICBkdXJhdGlvbiA9IHN0cmVhbS0+ZHVyYXRpb25fbW9vZjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuX3NhbXBsZXMgPSBzdHJlYW0tPm5fc2FtcGxlczsKKyAgICAgICAgICBkdXJhdGlvbiA9IHN0cmVhbS0+ZHVyYXRpb247CisgICAgICAgIH0KKworICAgICAgICAvKiBDYWxjdWxhdGUgYSBmcmFtZXJhdGUsIGlnbm9yaW5nIHRoZSBmaXJzdCBzYW1wbGUgd2hpY2ggaXMgc29tZXRpbWVzIHRydW5jYXRlZCAqLworICAgICAgICAvKiBzdHJlYW0tPmR1cmF0aW9uIGlzIGd1aW50NjQsIHRpbWVzY2FsZSwgbl9zYW1wbGVzIGFyZSBndWludDMyICovCisgICAgICAgIGF2Z19kdXJhdGlvbiA9CisgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKGR1cmF0aW9uIC0KKyAgICAgICAgICAgIHN0cmVhbS0+Zmlyc3RfZHVyYXRpb24sIEdTVF9TRUNPTkQsCisgICAgICAgICAgICAoZ3VpbnQ2NCkgKHN0cmVhbS0+dGltZXNjYWxlKSAqIChuX3NhbXBsZXMgLSAxKSk7CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAiQ2FsY3VsYXRpbmcgYXZnIHNhbXBsZSBkdXJhdGlvbiBiYXNlZCBvbiBzdHJlYW0gKG9yIG1vb2YpIGR1cmF0aW9uICUiCisgICAgICAgICAgICBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgICAiIG1pbnVzIGZpcnN0IHNhbXBsZSAldSwgbGVhdmluZyAlZCBzYW1wbGVzIGdpdmVzICUiCisgICAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIGR1cmF0aW9uLCBzdHJlYW0tPmZpcnN0X2R1cmF0aW9uLAorICAgICAgICAgICAgbl9zYW1wbGVzIC0gMSwgR1NUX1RJTUVfQVJHUyAoYXZnX2R1cmF0aW9uKSk7CisKKyAgICAgICAgZ3N0X3ZpZGVvX2d1ZXNzX2ZyYW1lcmF0ZSAoYXZnX2R1cmF0aW9uLCAmQ1VSX1NUUkVBTSAoc3RyZWFtKS0+ZnBzX24sCisgICAgICAgICAgICAmQ1VSX1NUUkVBTSAoc3RyZWFtKS0+ZnBzX2QpOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAiQ2FsY3VsYXRpbmcgZnJhbWVyYXRlLCB0aW1lc2NhbGUgJXUgZ2F2ZSBmcHNfbiAlZCBmcHNfZCAlZCIsCisgICAgICAgICAgICBzdHJlYW0tPnRpbWVzY2FsZSwgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+ZnBzX24sCisgICAgICAgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5mcHNfZCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMpIHsKKyAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMgPQorICAgICAgICAgIGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMpOworCisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLAorICAgICAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIENVUl9TVFJFQU0gKHN0cmVhbSktPndpZHRoLAorICAgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBDVVJfU1RSRUFNIChzdHJlYW0pLT5oZWlnaHQsIE5VTEwpOworCisgICAgICAvKiBzZXQgZnJhbWVyYXRlIGlmIGNhbGN1bGF0ZWQgZnJhbWVyYXRlIGlzIHJlbGlhYmxlICovCisgICAgICBpZiAoZnBzX2F2YWlsYWJsZSkgeworICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLAorICAgICAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLCBDVVJfU1RSRUFNIChzdHJlYW0pLT5mcHNfbiwKKyAgICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmZwc19kLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgLyogY2FsY3VsYXRlIHBpeGVsLWFzcGVjdC1yYXRpbyB1c2luZyBkaXNwbGF5IHdpZHRoIGFuZCBoZWlnaHQgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgInZpZGVvIHNpemUgJWR4JWQsIHRhcmdldCBkaXNwbGF5IHNpemUgJWR4JWQiLAorICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPndpZHRoLCBDVVJfU1RSRUFNIChzdHJlYW0pLT5oZWlnaHQsCisgICAgICAgICAgc3RyZWFtLT5kaXNwbGF5X3dpZHRoLCBzdHJlYW0tPmRpc3BsYXlfaGVpZ2h0KTsKKyAgICAgIC8qIHF0IGZpbGUgbWlnaHQgaGF2ZSBwYXNwIGF0b20gKi8KKyAgICAgIGlmIChDVVJfU1RSRUFNIChzdHJlYW0pLT5wYXJfdyA+IDAgJiYgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cGFyX2ggPiAwKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJwYXIgJWQ6JWQiLCBDVVJfU1RSRUFNIChzdHJlYW0pLT5wYXJfdywKKyAgICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPnBhcl9oKTsKKyAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y2FwcywgInBpeGVsLWFzcGVjdC1yYXRpbyIsCisgICAgICAgICAgICBHU1RfVFlQRV9GUkFDVElPTiwgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cGFyX3csCisgICAgICAgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5wYXJfaCwgTlVMTCk7CisgICAgICB9IGVsc2UgaWYgKHN0cmVhbS0+ZGlzcGxheV93aWR0aCA+IDAgJiYgc3RyZWFtLT5kaXNwbGF5X2hlaWdodCA+IDAKKyAgICAgICAgICAmJiBDVVJfU1RSRUFNIChzdHJlYW0pLT53aWR0aCA+IDAKKyAgICAgICAgICAmJiBDVVJfU1RSRUFNIChzdHJlYW0pLT5oZWlnaHQgPiAwKSB7CisgICAgICAgIGdpbnQgbiwgZDsKKworICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIHBpeGVsIGFzcGVjdCByYXRpbyB1c2luZyB0aGUgZGlzcGxheSBhbmQgcGl4ZWwgdy9oICovCisgICAgICAgIG4gPSBzdHJlYW0tPmRpc3BsYXlfd2lkdGggKiBDVVJfU1RSRUFNIChzdHJlYW0pLT5oZWlnaHQ7CisgICAgICAgIGQgPSBzdHJlYW0tPmRpc3BsYXlfaGVpZ2h0ICogQ1VSX1NUUkVBTSAoc3RyZWFtKS0+d2lkdGg7CisgICAgICAgIGlmIChuID09IGQpCisgICAgICAgICAgbiA9IGQgPSAxOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic2V0dGluZyBQQVIgdG8gJWQvJWQiLCBuLCBkKTsKKyAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cGFyX3cgPSBuOworICAgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5wYXJfaCA9IGQ7CisgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iLAorICAgICAgICAgICAgR1NUX1RZUEVfRlJBQ1RJT04sIENVUl9TVFJFQU0gKHN0cmVhbSktPnBhcl93LAorICAgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cGFyX2gsIE5VTEwpOworICAgICAgfQorCisgICAgICBpZiAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+aW50ZXJsYWNlX21vZGUgPiAwKSB7CisgICAgICAgIGlmIChDVVJfU1RSRUFNIChzdHJlYW0pLT5pbnRlcmxhY2VfbW9kZSA9PSAxKSB7CisgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y2FwcywgImludGVybGFjZS1tb2RlIiwKKyAgICAgICAgICAgICAgR19UWVBFX1NUUklORywgInByb2dyZXNzaXZlIiwgTlVMTCk7CisgICAgICAgIH0gZWxzZSBpZiAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+aW50ZXJsYWNlX21vZGUgPT0gMikgeworICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMsICJpbnRlcmxhY2UtbW9kZSIsCisgICAgICAgICAgICAgIEdfVFlQRV9TVFJJTkcsICJpbnRlcmxlYXZlZCIsIE5VTEwpOworICAgICAgICAgIGlmIChDVVJfU1RSRUFNIChzdHJlYW0pLT5maWVsZF9vcmRlciA9PSA5KSB7CisgICAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLCAiZmllbGQtb3JkZXIiLAorICAgICAgICAgICAgICAgIEdfVFlQRV9TVFJJTkcsICJ0b3AtZmllbGQtZmlyc3QiLCBOVUxMKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKENVUl9TVFJFQU0gKHN0cmVhbSktPmZpZWxkX29yZGVyID09IDE0KSB7CisgICAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLCAiZmllbGQtb3JkZXIiLAorICAgICAgICAgICAgICAgIEdfVFlQRV9TVFJJTkcsICJib3R0b20tZmllbGQtZmlyc3QiLCBOVUxMKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogQ3JlYXRlIGluY29tcGxldGUgY29sb3JpbWV0cnkgaGVyZSBpZiBuZWVkZWQgKi8KKyAgICAgIGlmIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jb2xvcmltZXRyeS5yYW5nZSB8fAorICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmNvbG9yaW1ldHJ5Lm1hdHJpeCB8fAorICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmNvbG9yaW1ldHJ5LnRyYW5zZmVyCisgICAgICAgICAgfHwgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y29sb3JpbWV0cnkucHJpbWFyaWVzKSB7CisgICAgICAgIGdjaGFyICpjb2xvcmltZXRyeSA9CisgICAgICAgICAgICBnc3RfdmlkZW9fY29sb3JpbWV0cnlfdG9fc3RyaW5nICgmQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y29sb3JpbWV0cnkpOworICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLCAiY29sb3JpbWV0cnkiLAorICAgICAgICAgICAgR19UWVBFX1NUUklORywgY29sb3JpbWV0cnksIE5VTEwpOworICAgICAgICBnX2ZyZWUgKGNvbG9yaW1ldHJ5KTsKKyAgICAgIH0KKworICAgICAgaWYgKHN0cmVhbS0+bXVsdGl2aWV3X21vZGUgIT0gR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX05PTkUpIHsKKyAgICAgICAgZ3VpbnQgcGFyX3cgPSAxLCBwYXJfaCA9IDE7CisKKyAgICAgICAgaWYgKENVUl9TVFJFQU0gKHN0cmVhbSktPnBhcl93ID4gMCAmJiBDVVJfU1RSRUFNIChzdHJlYW0pLT5wYXJfaCA+IDApIHsKKyAgICAgICAgICBwYXJfdyA9IENVUl9TVFJFQU0gKHN0cmVhbSktPnBhcl93OworICAgICAgICAgIHBhcl9oID0gQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cGFyX2g7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ3N0X3ZpZGVvX211bHRpdmlld19ndWVzc19oYWxmX2FzcGVjdCAoc3RyZWFtLT5tdWx0aXZpZXdfbW9kZSwKKyAgICAgICAgICAgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT53aWR0aCwgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+aGVpZ2h0LCBwYXJfdywKKyAgICAgICAgICAgICAgICBwYXJfaCkpIHsKKyAgICAgICAgICBzdHJlYW0tPm11bHRpdmlld19mbGFncyB8PSBHU1RfVklERU9fTVVMVElWSUVXX0ZMQUdTX0hBTEZfQVNQRUNUOworICAgICAgICB9CisKKyAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y2FwcywKKyAgICAgICAgICAgICJtdWx0aXZpZXctbW9kZSIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgICAgICBnc3RfdmlkZW9fbXVsdGl2aWV3X21vZGVfdG9fY2Fwc19zdHJpbmcgKHN0cmVhbS0+bXVsdGl2aWV3X21vZGUpLAorICAgICAgICAgICAgIm11bHRpdmlldy1mbGFncyIsIEdTVF9UWVBFX1ZJREVPX01VTFRJVklFV19GTEFHU0VULAorICAgICAgICAgICAgc3RyZWFtLT5tdWx0aXZpZXdfZmxhZ3MsIEdTVF9GTEFHX1NFVF9NQVNLX0VYQUNULCBOVUxMKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBlbHNlIGlmIChzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3NvdW4pIHsKKyAgICBpZiAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y2FwcykgeworICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y2FwcyA9CisgICAgICAgICAgZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y2Fwcyk7CisgICAgICBpZiAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cmF0ZSA+IDApCisgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMsCisgICAgICAgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIChpbnQpIENVUl9TVFJFQU0gKHN0cmVhbSktPnJhdGUsIE5VTEwpOworICAgICAgaWYgKENVUl9TVFJFQU0gKHN0cmVhbSktPm5fY2hhbm5lbHMgPiAwKQorICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLAorICAgICAgICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+bl9jaGFubmVscywgTlVMTCk7CisgICAgICBpZiAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+bl9jaGFubmVscyA+IDIpIHsKKyAgICAgICAgLyogRklYTUU6IE5lZWQgdG8gcGFyc2UgdGhlICdjaGFuJyBhdG9tIHRvIGdldCBjaGFubmVsIGxheW91dHMKKyAgICAgICAgICogY29ycmVjdGx5OyB0aGlzIGlzIGp1c3QgdGhlIG1pbmltdW0gd2UgY2FuIGRvIC0gYXNzdW1lCisgICAgICAgICAqIHdlIGRvbid0IGFjdHVhbGx5IGhhdmUgYW55IGNoYW5uZWwgcG9zaXRpb25zLiAqLworICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLAorICAgICAgICAgICAgImNoYW5uZWwtbWFzayIsIEdTVF9UWVBFX0JJVE1BU0ssIEdfR1VJTlQ2NF9DT05TVEFOVCAoMCksIE5VTEwpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChzdHJlYW0tPnBhZCkgeworICAgIEdzdENhcHMgKnByZXZfY2FwcyA9IE5VTEw7CisKKyAgICBHU1RfUEFEX0VMRU1FTlRfUFJJVkFURSAoc3RyZWFtLT5wYWQpID0gc3RyZWFtOworICAgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChzdHJlYW0tPnBhZCwgZ3N0X3F0ZGVtdXhfaGFuZGxlX3NyY19ldmVudCk7CisgICAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHN0cmVhbS0+cGFkLCBnc3RfcXRkZW11eF9oYW5kbGVfc3JjX3F1ZXJ5KTsKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKHN0cmVhbS0+cGFkLCBUUlVFKTsKKworICAgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKHN0cmVhbS0+cGFkKTsKKworICAgIGlmIChzdHJlYW0tPnByb3RlY3RlZCkgeworICAgICAgaWYgKCFnc3RfcXRkZW11eF9jb25maWd1cmVfcHJvdGVjdGVkX2NhcHMgKHF0ZGVtdXgsIHN0cmVhbSkpIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICJGYWlsZWQgdG8gY29uZmlndXJlIHByb3RlY3RlZCBzdHJlYW0gY2Fwcy4iKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzZXR0aW5nIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMpOworICAgIGlmIChzdHJlYW0tPm5ld19zdHJlYW0pIHsKKyAgICAgIGdjaGFyICpzdHJlYW1faWQ7CisgICAgICBHc3RFdmVudCAqZXZlbnQ7CisgICAgICBHc3RTdHJlYW1GbGFncyBzdHJlYW1fZmxhZ3MgPSBHU1RfU1RSRUFNX0ZMQUdfTk9ORTsKKworICAgICAgZXZlbnQgPQorICAgICAgICAgIGdzdF9wYWRfZ2V0X3N0aWNreV9ldmVudCAocXRkZW11eC0+c2lua3BhZCwgR1NUX0VWRU5UX1NUUkVBTV9TVEFSVCwKKyAgICAgICAgICAwKTsKKyAgICAgIGlmIChldmVudCkgeworICAgICAgICBnc3RfZXZlbnRfcGFyc2Vfc3RyZWFtX2ZsYWdzIChldmVudCwgJnN0cmVhbV9mbGFncyk7CisgICAgICAgIGlmIChnc3RfZXZlbnRfcGFyc2VfZ3JvdXBfaWQgKGV2ZW50LCAmcXRkZW11eC0+Z3JvdXBfaWQpKQorICAgICAgICAgIHF0ZGVtdXgtPmhhdmVfZ3JvdXBfaWQgPSBUUlVFOworICAgICAgICBlbHNlCisgICAgICAgICAgcXRkZW11eC0+aGF2ZV9ncm91cF9pZCA9IEZBTFNFOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIH0gZWxzZSBpZiAoIXF0ZGVtdXgtPmhhdmVfZ3JvdXBfaWQpIHsKKyAgICAgICAgcXRkZW11eC0+aGF2ZV9ncm91cF9pZCA9IFRSVUU7CisgICAgICAgIHF0ZGVtdXgtPmdyb3VwX2lkID0gZ3N0X3V0aWxfZ3JvdXBfaWRfbmV4dCAoKTsKKyAgICAgIH0KKworICAgICAgc3RyZWFtLT5uZXdfc3RyZWFtID0gRkFMU0U7CisgICAgICBzdHJlYW1faWQgPQorICAgICAgICAgIGdzdF9wYWRfY3JlYXRlX3N0cmVhbV9pZF9wcmludGYgKHN0cmVhbS0+cGFkLAorICAgICAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKHF0ZGVtdXgpLCAiJTAzdSIsIHN0cmVhbS0+dHJhY2tfaWQpOworICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoc3RyZWFtX2lkKTsKKyAgICAgIGlmIChxdGRlbXV4LT5oYXZlX2dyb3VwX2lkKQorICAgICAgICBnc3RfZXZlbnRfc2V0X2dyb3VwX2lkIChldmVudCwgcXRkZW11eC0+Z3JvdXBfaWQpOworICAgICAgaWYgKHN0cmVhbS0+ZGlzYWJsZWQpCisgICAgICAgIHN0cmVhbV9mbGFncyB8PSBHU1RfU1RSRUFNX0ZMQUdfVU5TRUxFQ1Q7CisgICAgICBpZiAoQ1VSX1NUUkVBTSAoc3RyZWFtKS0+c3BhcnNlKSB7CisgICAgICAgIHN0cmVhbV9mbGFncyB8PSBHU1RfU1RSRUFNX0ZMQUdfU1BBUlNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyZWFtX2ZsYWdzICY9IH5HU1RfU1RSRUFNX0ZMQUdfU1BBUlNFOworICAgICAgfQorICAgICAgZ3N0X2V2ZW50X3NldF9zdHJlYW1fZmxhZ3MgKGV2ZW50LCBzdHJlYW1fZmxhZ3MpOworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzdHJlYW0tPnBhZCwgZXZlbnQpOworICAgICAgZ19mcmVlIChzdHJlYW1faWQpOworICAgIH0KKworICAgIHByZXZfY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoc3RyZWFtLT5wYWQpOworCisgICAgaWYgKENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMpIHsKKyAgICAgIGlmICghcHJldl9jYXBzCisgICAgICAgICAgfHwgIWdzdF9jYXBzX2lzX2VxdWFsX2ZpeGVkIChwcmV2X2NhcHMsIENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMpKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzZXR0aW5nIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzKTsKKyAgICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAoc3RyZWFtLT5wYWQsIENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImlnbm9yZSBkdXBsaWNhdGVkIGNhcHMiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAic3RyZWFtIHdpdGhvdXQgY2FwcyIpOworICAgIH0KKworICAgIGlmIChwcmV2X2NhcHMpCisgICAgICBnc3RfY2Fwc191bnJlZiAocHJldl9jYXBzKTsKKyAgICBzdHJlYW0tPm5ld19jYXBzID0gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9zdHJlYW1fY2hlY2tfYW5kX2NoYW5nZV9zdHNkX2luZGV4IChHc3RRVERlbXV4ICogZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSkKK3sKKyAgaWYgKHN0cmVhbS0+Y3VyX3N0c2RfZW50cnlfaW5kZXggPT0gc3RyZWFtLT5zdHNkX3NhbXBsZV9kZXNjcmlwdGlvbl9pZCkKKyAgICByZXR1cm47CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3RyZWFtLT5wYWQsICJDaGFuZ2luZyBzdHNkIGluZGV4IGZyb20gJyV1JyB0byAnJXUnIiwKKyAgICAgIHN0cmVhbS0+Y3VyX3N0c2RfZW50cnlfaW5kZXgsIHN0cmVhbS0+c3RzZF9zYW1wbGVfZGVzY3JpcHRpb25faWQpOworICBpZiAoR19VTkxJS0VMWSAoc3RyZWFtLT5zdHNkX3NhbXBsZV9kZXNjcmlwdGlvbl9pZCA+PQorICAgICAgICAgIHN0cmVhbS0+c3RzZF9lbnRyaWVzX2xlbmd0aCkpIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgREVNVVgsCisgICAgICAgIChfKCJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iKSksCisgICAgICAgICgiTmV3IHNhbXBsZSBkZXNjcmlwdGlvbiBpZCBpcyBvdXQgb2YgYm91bmRzICglZCA+PSAlZCkiLAorICAgICAgICAgICAgc3RyZWFtLT5zdHNkX3NhbXBsZV9kZXNjcmlwdGlvbl9pZCwgc3RyZWFtLT5zdHNkX2VudHJpZXNfbGVuZ3RoKSk7CisgIH0gZWxzZSB7CisgICAgc3RyZWFtLT5jdXJfc3RzZF9lbnRyeV9pbmRleCA9IHN0cmVhbS0+c3RzZF9zYW1wbGVfZGVzY3JpcHRpb25faWQ7CisgICAgc3RyZWFtLT5uZXdfY2FwcyA9IFRSVUU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcXRkZW11eF9hZGRfc3RyZWFtIChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBRdERlbXV4U3RyZWFtICogc3RyZWFtLCBHc3RUYWdMaXN0ICogbGlzdCkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKyAgLyogY29uc2lzdGVudCBkZWZhdWx0IGZvciBwdXNoIGJhc2VkIG1vZGUgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnN0cmVhbS0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKworICBpZiAoc3RyZWFtLT5zdWJ0eXBlID09IEZPVVJDQ192aWRlKSB7CisgICAgZ2NoYXIgKm5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJ2aWRlb18ldSIsIHF0ZGVtdXgtPm5fdmlkZW9fc3RyZWFtcyk7CisKKyAgICBzdHJlYW0tPnBhZCA9CisgICAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZ3N0X3F0ZGVtdXhfdmlkZW9zcmNfdGVtcGxhdGUsIG5hbWUpOworICAgIGdfZnJlZSAobmFtZSk7CisKKyAgICBpZiAoIWdzdF9xdGRlbXV4X2NvbmZpZ3VyZV9zdHJlYW0gKHF0ZGVtdXgsIHN0cmVhbSkpIHsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHN0cmVhbS0+cGFkKTsKKyAgICAgIHN0cmVhbS0+cGFkID0gTlVMTDsKKyAgICAgIHJldCA9IEZBTFNFOworICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIHF0ZGVtdXgtPm5fdmlkZW9fc3RyZWFtcysrOworICB9IGVsc2UgaWYgKHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0Nfc291bikgeworICAgIGdjaGFyICpuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiYXVkaW9fJXUiLCBxdGRlbXV4LT5uX2F1ZGlvX3N0cmVhbXMpOworCisgICAgc3RyZWFtLT5wYWQgPQorICAgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJmdzdF9xdGRlbXV4X2F1ZGlvc3JjX3RlbXBsYXRlLCBuYW1lKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworICAgIGlmICghZ3N0X3F0ZGVtdXhfY29uZmlndXJlX3N0cmVhbSAocXRkZW11eCwgc3RyZWFtKSkgeworICAgICAgZ3N0X29iamVjdF91bnJlZiAoc3RyZWFtLT5wYWQpOworICAgICAgc3RyZWFtLT5wYWQgPSBOVUxMOworICAgICAgcmV0ID0gRkFMU0U7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIHF0ZGVtdXgtPm5fYXVkaW9fc3RyZWFtcysrOworICB9IGVsc2UgaWYgKHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0Nfc3RybSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzdHJlYW0gdHlwZSwgbm90IGNyZWF0aW5nIHBhZCIpOworICB9IGVsc2UgaWYgKHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0Nfc3VicCB8fCBzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3RleHQKKyAgICAgIHx8IHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0Nfc2J0bCB8fCBzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3N1YnQpIHsKKyAgICBnY2hhciAqbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInN1YnRpdGxlXyV1IiwgcXRkZW11eC0+bl9zdWJfc3RyZWFtcyk7CisKKyAgICBzdHJlYW0tPnBhZCA9CisgICAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZ3N0X3F0ZGVtdXhfc3Vic3JjX3RlbXBsYXRlLCBuYW1lKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworICAgIGlmICghZ3N0X3F0ZGVtdXhfY29uZmlndXJlX3N0cmVhbSAocXRkZW11eCwgc3RyZWFtKSkgeworICAgICAgZ3N0X29iamVjdF91bnJlZiAoc3RyZWFtLT5wYWQpOworICAgICAgc3RyZWFtLT5wYWQgPSBOVUxMOworICAgICAgcmV0ID0gRkFMU0U7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIHF0ZGVtdXgtPm5fc3ViX3N0cmVhbXMrKzsKKyAgfSBlbHNlIGlmIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzKSB7CisgICAgZ2NoYXIgKm5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJ2aWRlb18ldSIsIHF0ZGVtdXgtPm5fdmlkZW9fc3RyZWFtcyk7CisKKyAgICBzdHJlYW0tPnBhZCA9CisgICAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZ3N0X3F0ZGVtdXhfdmlkZW9zcmNfdGVtcGxhdGUsIG5hbWUpOworICAgIGdfZnJlZSAobmFtZSk7CisgICAgaWYgKCFnc3RfcXRkZW11eF9jb25maWd1cmVfc3RyZWFtIChxdGRlbXV4LCBzdHJlYW0pKSB7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChzdHJlYW0tPnBhZCk7CisgICAgICBzdHJlYW0tPnBhZCA9IE5VTEw7CisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgcXRkZW11eC0+bl92aWRlb19zdHJlYW1zKys7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInVua25vd24gc3RyZWFtIHR5cGUiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBpZiAoc3RyZWFtLT5wYWQpIHsKKyAgICBHTGlzdCAqbDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJhZGRpbmcgcGFkICVzICVwIHRvIHF0ZGVtdXggJXAiLAorICAgICAgICBHU1RfT0JKRUNUX05BTUUgKHN0cmVhbS0+cGFkKSwgc3RyZWFtLT5wYWQsIHF0ZGVtdXgpOworICAgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHF0ZGVtdXgpLCBzdHJlYW0tPnBhZCk7CisgICAgZ3N0X2Zsb3dfY29tYmluZXJfYWRkX3BhZCAocXRkZW11eC0+Zmxvd2NvbWJpbmVyLCBzdHJlYW0tPnBhZCk7CisKKyAgICBpZiAoc3RyZWFtLT5zdHJlYW1fdGFncykKKyAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAoc3RyZWFtLT5zdHJlYW1fdGFncyk7CisgICAgc3RyZWFtLT5zdHJlYW1fdGFncyA9IGxpc3Q7CisgICAgbGlzdCA9IE5VTEw7CisgICAgLyogZ2xvYmFsIHRhZ3MgZ28gb24gZWFjaCBwYWQgYW55d2F5ICovCisgICAgc3RyZWFtLT5zZW5kX2dsb2JhbF90YWdzID0gVFJVRTsKKyAgICAvKiBzZW5kIHVwc3RyZWFtIEdTVF9FVkVOVF9QUk9URUNUSU9OIGV2ZW50cyB0aGF0IHdlcmUgcmVjZWl2ZWQgYmVmb3JlCisgICAgICAgdGhpcyBzb3VyY2UgcGFkIHdhcyBjcmVhdGVkICovCisgICAgZm9yIChsID0gcXRkZW11eC0+cHJvdGVjdGlvbl9ldmVudF9xdWV1ZS5oZWFkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQorICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzdHJlYW0tPnBhZCwgZ3N0X2V2ZW50X3JlZiAobC0+ZGF0YSkpOworICB9Citkb25lOgorICBpZiAobGlzdCkKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKGxpc3QpOworICByZXR1cm4gcmV0OworfQorCisvKiBmaW5kIG5leHQgYXRvbSB3aXRoIEBmb3VyY2Mgc3RhcnRpbmcgYXQgQG9mZnNldCAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK3F0ZGVtdXhfZmluZF9hdG9tIChHc3RRVERlbXV4ICogcXRkZW11eCwgZ3VpbnQ2NCAqIG9mZnNldCwKKyAgICBndWludDY0ICogbGVuZ3RoLCBndWludDMyIGZvdXJjYykKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIGd1aW50MzIgbGZvdXJjYzsKKyAgR3N0QnVmZmVyICpidWY7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJmaW5kaW5nIGZvdXJjYyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIGF0IG9mZnNldCAlIgorICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpLCAqb2Zmc2V0KTsKKworICB3aGlsZSAoVFJVRSkgeworICAgIEdzdE1hcEluZm8gbWFwOworCisgICAgYnVmID0gTlVMTDsKKyAgICByZXQgPSBnc3RfcGFkX3B1bGxfcmFuZ2UgKHF0ZGVtdXgtPnNpbmtwYWQsICpvZmZzZXQsIDE2LCAmYnVmKTsKKyAgICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkKKyAgICAgIGdvdG8gbG9jYXRlX2ZhaWxlZDsKKyAgICBpZiAoR19VTkxJS0VMWSAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSAhPSAxNikpIHsKKyAgICAgIC8qIGxpa2VseSBFT0YgKi8KKyAgICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICBnb3RvIGxvY2F0ZV9mYWlsZWQ7CisgICAgfQorICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgZXh0cmFjdF9pbml0aWFsX2xlbmd0aF9hbmRfZm91cmNjIChtYXAuZGF0YSwgMTYsIGxlbmd0aCwgJmxmb3VyY2MpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAgIGlmIChHX1VOTElLRUxZICgqbGVuZ3RoID09IDApKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiaW52YWxpZCBsZW5ndGggMCIpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICBnb3RvIGxvY2F0ZV9mYWlsZWQ7CisgICAgfQorCisgICAgaWYgKGxmb3VyY2MgPT0gZm91cmNjKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZm91bmQgZm91cmNjIGF0IG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICpvZmZzZXQpOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICJza2lwcGluZyBhdG9tICclIiBHU1RfRk9VUkNDX0ZPUk1BVCAiJyBhdCAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSwgKm9mZnNldCk7CisgICAgICAqb2Zmc2V0ICs9ICpsZW5ndGg7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCitsb2NhdGVfZmFpbGVkOgorICB7CisgICAgLyogbWlnaHQgc2ltcGx5IGhhdmUgaGFkIGxhc3Qgb25lICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZvdXJjYyBub3QgZm91bmQiKTsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKKy8qIHNob3VsZCBvbmx5IGRvIHNvbWV0aGluZyBpbiBwdWxsIG1vZGUgKi8KKy8qIGNhbGwgd2l0aCBPQkpFQ1QgbG9jayAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK3F0ZGVtdXhfYWRkX2ZyYWdtZW50ZWRfc2FtcGxlcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgpCit7CisgIGd1aW50NjQgbGVuZ3RoLCBvZmZzZXQ7CisgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0Rmxvd1JldHVybiByZXMgPSBHU1RfRkxPV19PSzsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgb2Zmc2V0ID0gcXRkZW11eC0+bW9vZl9vZmZzZXQ7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJuZXh0IG1vb2YgYXQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG9mZnNldCk7CisKKyAgaWYgKCFvZmZzZXQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAibm8gbmV4dCBtb29mIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKyAgfQorCisgIC8qIGJlc3Qgbm90IGRvIHB1bGwgZXRjIHdpdGggbG9jayBoZWxkICovCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChxdGRlbXV4KTsKKworICByZXQgPSBxdGRlbXV4X2ZpbmRfYXRvbSAocXRkZW11eCwgJm9mZnNldCwgJmxlbmd0aCwgRk9VUkNDX21vb2YpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZmxvd19mYWlsZWQ7CisKKyAgcmV0ID0gZ3N0X3F0ZGVtdXhfcHVsbF9hdG9tIChxdGRlbXV4LCBvZmZzZXQsIGxlbmd0aCwgJmJ1Zik7CisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKQorICAgIGdvdG8gZmxvd19mYWlsZWQ7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGlmICghcXRkZW11eF9wYXJzZV9tb29mIChxdGRlbXV4LCBtYXAuZGF0YSwgbWFwLnNpemUsIG9mZnNldCwgTlVMTCkpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgYnVmID0gTlVMTDsKKyAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKyAgfQorCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIGJ1ZiA9IE5VTEw7CisKKyAgb2Zmc2V0ICs9IGxlbmd0aDsKKyAgLyogbG9vayBmb3IgbmV4dCBtb29mICovCisgIHJldCA9IHF0ZGVtdXhfZmluZF9hdG9tIChxdGRlbXV4LCAmb2Zmc2V0LCAmbGVuZ3RoLCBGT1VSQ0NfbW9vZik7CisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKQorICAgIGdvdG8gZmxvd19mYWlsZWQ7CisKK2V4aXQ6CisgIEdTVF9PQkpFQ1RfTE9DSyAocXRkZW11eCk7CisKKyAgcXRkZW11eC0+bW9vZl9vZmZzZXQgPSBvZmZzZXQ7CisKKyAgcmV0dXJuIHJlczsKKworcGFyc2VfZmFpbGVkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZhaWxlZCB0byBwYXJzZSBtb29mIik7CisgICAgb2Zmc2V0ID0gMDsKKyAgICByZXMgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGV4aXQ7CisgIH0KK2Zsb3dfZmFpbGVkOgorICB7CisgICAgLyogbWF5YmUgdXBzdHJlYW0gdGVtcG9yYXJpbHkgZmx1c2hpbmcgKi8KKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX0ZMVVNISU5HKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAibm8gbmV4dCBtb29mIik7CisgICAgICBvZmZzZXQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAidXBzdHJlYW0gV1JPTkdfU1RBVEUiKTsKKyAgICAgIC8qIHJlc3VtZSBhdCBjdXJyZW50IHBvc2l0aW9uIG5leHQgdGltZSAqLworICAgIH0KKyAgICByZXMgPSByZXQ7CisgICAgZ290byBleGl0OworICB9Cit9CisKKy8qIGluaXRpYWxpc2UgYnl0ZXJlYWRlcnMgZm9yIHN0Ymwgc3ViLWF0b21zICovCitzdGF0aWMgZ2Jvb2xlYW4KK3F0ZGVtdXhfc3RibF9pbml0IChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwgR05vZGUgKiBzdGJsKQoreworICBzdHJlYW0tPnN0YmxfaW5kZXggPSAtMTsgICAgICAvKiBubyBzYW1wbGVzIGhhdmUgeWV0IGJlZW4gcGFyc2VkICovCisgIHN0cmVhbS0+c2FtcGxlX2luZGV4ID0gLTE7CisKKyAgLyogdGltZS10by1zYW1wbGUgYXRvbSAqLworICBpZiAoIXF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZV9mdWxsIChzdGJsLCBGT1VSQ0Nfc3R0cywgJnN0cmVhbS0+c3R0cykpCisgICAgZ290byBjb3JydXB0X2ZpbGU7CisKKyAgLyogY29weSBhdG9tIGRhdGEgaW50byBhIG5ldyBidWZmZXIgZm9yIGxhdGVyIHVzZSAqLworICBzdHJlYW0tPnN0dHMuZGF0YSA9IGdfbWVtZHVwIChzdHJlYW0tPnN0dHMuZGF0YSwgc3RyZWFtLT5zdHRzLnNpemUpOworCisgIC8qIHNraXAgdmVyc2lvbiArIGZsYWdzICovCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZzdHJlYW0tPnN0dHMsIDEgKyAzKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmc3RyZWFtLT5zdHRzLCAmc3RyZWFtLT5uX3NhbXBsZV90aW1lcykpCisgICAgZ290byBjb3JydXB0X2ZpbGU7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJXUgdGltZXN0YW1wIGJsb2NrcyIsIHN0cmVhbS0+bl9zYW1wbGVfdGltZXMpOworCisgIC8qIG1ha2Ugc3VyZSB0aGVyZSdzIGVub3VnaCBkYXRhICovCisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX2NodW5rcyAoJnN0cmVhbS0+c3R0cywgc3RyZWFtLT5uX3NhbXBsZV90aW1lcywgOCkpIHsKKyAgICBzdHJlYW0tPm5fc2FtcGxlX3RpbWVzID0gZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKCZzdHJlYW0tPnN0dHMpIC8gODsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIm92ZXJyaWRpbmcgdG8gJXUgdGltZXN0YW1wIGJsb2NrcyIsCisgICAgICAgIHN0cmVhbS0+bl9zYW1wbGVfdGltZXMpOworICAgIGlmICghc3RyZWFtLT5uX3NhbXBsZV90aW1lcykKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworICB9CisKKyAgLyogc3luYyBzYW1wbGUgYXRvbSAqLworICBzdHJlYW0tPnN0cHNfcHJlc2VudCA9IEZBTFNFOworICBpZiAoKHN0cmVhbS0+c3Rzc19wcmVzZW50ID0KKyAgICAgICAgICAhICFxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGVfZnVsbCAoc3RibCwgRk9VUkNDX3N0c3MsCisgICAgICAgICAgICAgICZzdHJlYW0tPnN0c3MpID8gVFJVRSA6IEZBTFNFKSA9PSBUUlVFKSB7CisgICAgLyogY29weSBhdG9tIGRhdGEgaW50byBhIG5ldyBidWZmZXIgZm9yIGxhdGVyIHVzZSAqLworICAgIHN0cmVhbS0+c3Rzcy5kYXRhID0gZ19tZW1kdXAgKHN0cmVhbS0+c3Rzcy5kYXRhLCBzdHJlYW0tPnN0c3Muc2l6ZSk7CisKKyAgICAvKiBza2lwIHZlcnNpb24gKyBmbGFncyAqLworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZzdHJlYW0tPnN0c3MsIDEgKyAzKSB8fAorICAgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZzdHJlYW0tPnN0c3MsICZzdHJlYW0tPm5fc2FtcGxlX3N5bmNzKSkKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgaWYgKHN0cmVhbS0+bl9zYW1wbGVfc3luY3MpIHsKKyAgICAgIC8qIG1ha2Ugc3VyZSB0aGVyZSdzIGVub3VnaCBkYXRhICovCisgICAgICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19jaHVua3MgKCZzdHJlYW0tPnN0c3MsIHN0cmVhbS0+bl9zYW1wbGVfc3luY3MsIDQpKQorICAgICAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKyAgICB9CisKKyAgICAvKiBwYXJ0aWFsIHN5bmMgc2FtcGxlIGF0b20gKi8KKyAgICBpZiAoKHN0cmVhbS0+c3Rwc19wcmVzZW50ID0KKyAgICAgICAgICAgICEgIXF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZV9mdWxsIChzdGJsLCBGT1VSQ0Nfc3RwcywKKyAgICAgICAgICAgICAgICAmc3RyZWFtLT5zdHBzKSA/IFRSVUUgOiBGQUxTRSkgPT0gVFJVRSkgeworICAgICAgLyogY29weSBhdG9tIGRhdGEgaW50byBhIG5ldyBidWZmZXIgZm9yIGxhdGVyIHVzZSAqLworICAgICAgc3RyZWFtLT5zdHBzLmRhdGEgPSBnX21lbWR1cCAoc3RyZWFtLT5zdHBzLmRhdGEsIHN0cmVhbS0+c3Rwcy5zaXplKTsKKworICAgICAgLyogc2tpcCB2ZXJzaW9uICsgZmxhZ3MgKi8KKyAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZzdHJlYW0tPnN0cHMsIDEgKyAzKSB8fAorICAgICAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnN0cmVhbS0+c3RwcywKKyAgICAgICAgICAgICAgJnN0cmVhbS0+bl9zYW1wbGVfcGFydGlhbF9zeW5jcykpCisgICAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgICAvKiBpZiB0aGVyZSBhcmUgbm8gZW50cmllcywgdGhlIHN0c3MgdGFibGUgY29udGFpbnMgdGhlIHJlYWwKKyAgICAgICAqIHN5bmMgc2FtcGxlcyAqLworICAgICAgaWYgKHN0cmVhbS0+bl9zYW1wbGVfcGFydGlhbF9zeW5jcykgeworICAgICAgICAvKiBtYWtlIHN1cmUgdGhlcmUncyBlbm91Z2ggZGF0YSAqLworICAgICAgICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19jaHVua3MgKCZzdHJlYW0tPnN0cHMsCisgICAgICAgICAgICAgICAgc3RyZWFtLT5uX3NhbXBsZV9wYXJ0aWFsX3N5bmNzLCA0KSkKKyAgICAgICAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBzYW1wbGUgc2l6ZSAqLworICBpZiAoIXF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZV9mdWxsIChzdGJsLCBGT1VSQ0Nfc3RzeiwgJnN0cmVhbS0+c3RzeikpCisgICAgZ290byBub19zYW1wbGVzOworCisgIC8qIGNvcHkgYXRvbSBkYXRhIGludG8gYSBuZXcgYnVmZmVyIGZvciBsYXRlciB1c2UgKi8KKyAgc3RyZWFtLT5zdHN6LmRhdGEgPSBnX21lbWR1cCAoc3RyZWFtLT5zdHN6LmRhdGEsIHN0cmVhbS0+c3Rzei5zaXplKTsKKworICAvKiBza2lwIHZlcnNpb24gKyBmbGFncyAqLworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmc3RyZWFtLT5zdHN6LCAxICsgMykgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnN0cmVhbS0+c3RzeiwgJnN0cmVhbS0+c2FtcGxlX3NpemUpKQorICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZzdHJlYW0tPnN0c3osICZzdHJlYW0tPm5fc2FtcGxlcykpCisgICAgZ290byBjb3JydXB0X2ZpbGU7CisKKyAgaWYgKCFzdHJlYW0tPm5fc2FtcGxlcykKKyAgICBnb3RvIG5vX3NhbXBsZXM7CisKKyAgLyogc2FtcGxlLXRvLWNodW5rIGF0b20gKi8KKyAgaWYgKCFxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGVfZnVsbCAoc3RibCwgRk9VUkNDX3N0c2MsICZzdHJlYW0tPnN0c2MpKQorICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgIC8qIGNvcHkgYXRvbSBkYXRhIGludG8gYSBuZXcgYnVmZmVyIGZvciBsYXRlciB1c2UgKi8KKyAgc3RyZWFtLT5zdHNjLmRhdGEgPSBnX21lbWR1cCAoc3RyZWFtLT5zdHNjLmRhdGEsIHN0cmVhbS0+c3RzYy5zaXplKTsKKworICAvKiBza2lwIHZlcnNpb24gKyBmbGFncyAqLworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmc3RyZWFtLT5zdHNjLCAxICsgMykgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnN0cmVhbS0+c3RzYywKKyAgICAgICAgICAmc3RyZWFtLT5uX3NhbXBsZXNfcGVyX2NodW5rKSkKKyAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAibl9zYW1wbGVzX3Blcl9jaHVuayAldSIsCisgICAgICBzdHJlYW0tPm5fc2FtcGxlc19wZXJfY2h1bmspOworCisgIC8qIG1ha2Ugc3VyZSB0aGVyZSdzIGVub3VnaCBkYXRhICovCisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX2NodW5rcyAoJnN0cmVhbS0+c3RzYywgc3RyZWFtLT5uX3NhbXBsZXNfcGVyX2NodW5rLAorICAgICAgICAgIDEyKSkKKyAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworCisgIC8qIGNodW5rIG9mZnNldCAqLworICBpZiAocXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlX2Z1bGwgKHN0YmwsIEZPVVJDQ19zdGNvLCAmc3RyZWFtLT5zdGNvKSkKKyAgICBzdHJlYW0tPmNvX3NpemUgPSBzaXplb2YgKGd1aW50MzIpOworICBlbHNlIGlmIChxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGVfZnVsbCAoc3RibCwgRk9VUkNDX2NvNjQsCisgICAgICAgICAgJnN0cmVhbS0+c3RjbykpCisgICAgc3RyZWFtLT5jb19zaXplID0gc2l6ZW9mIChndWludDY0KTsKKyAgZWxzZQorICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgIC8qIGNvcHkgYXRvbSBkYXRhIGludG8gYSBuZXcgYnVmZmVyIGZvciBsYXRlciB1c2UgKi8KKyAgc3RyZWFtLT5zdGNvLmRhdGEgPSBnX21lbWR1cCAoc3RyZWFtLT5zdGNvLmRhdGEsIHN0cmVhbS0+c3Rjby5zaXplKTsKKworICAvKiBza2lwIHZlcnNpb24gKyBmbGFncyAqLworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmc3RyZWFtLT5zdGNvLCAxICsgMykpCisgICAgZ290byBjb3JydXB0X2ZpbGU7CisKKyAgLyogY2h1bmtzX2FyZV9zYW1wbGVzID09IFRSVUUgbWVhbnMgdHJlYXQgY2h1bmtzIGFzIHNhbXBsZXMgKi8KKyAgc3RyZWFtLT5jaHVua3NfYXJlX3NhbXBsZXMgPSBzdHJlYW0tPnNhbXBsZV9zaXplCisgICAgICAmJiAhQ1VSX1NUUkVBTSAoc3RyZWFtKS0+c2FtcGxlZDsKKyAgaWYgKHN0cmVhbS0+Y2h1bmtzX2FyZV9zYW1wbGVzKSB7CisgICAgLyogdHJlYXQgY2h1bmtzIGFzIHNhbXBsZXMgKi8KKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmc3RyZWFtLT5zdGNvLCAmc3RyZWFtLT5uX3NhbXBsZXMpKQorICAgICAgZ290byBjb3JydXB0X2ZpbGU7CisgIH0gZWxzZSB7CisgICAgLyogc2tpcCBudW1iZXIgb2YgZW50cmllcyAqLworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZzdHJlYW0tPnN0Y28sIDQpKQorICAgICAgZ290byBjb3JydXB0X2ZpbGU7CisKKyAgICAvKiBtYWtlIHN1cmUgdGhlcmUgYXJlIGVub3VnaCBkYXRhIGluIHRoZSBzdHN6IGF0b20gKi8KKyAgICBpZiAoIXN0cmVhbS0+c2FtcGxlX3NpemUpIHsKKyAgICAgIC8qIGRpZmZlcmVudCBzaXplcyBmb3IgZWFjaCBzYW1wbGUgKi8KKyAgICAgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX2NodW5rcyAoJnN0cmVhbS0+c3Rzeiwgc3RyZWFtLT5uX3NhbXBsZXMsIDQpKQorICAgICAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKyAgICB9CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiYWxsb2NhdGluZyBuX3NhbXBsZXMgJXUgKiAldSAoJS4yZiBNQikiLAorICAgICAgc3RyZWFtLT5uX3NhbXBsZXMsIChndWludCkgc2l6ZW9mIChRdERlbXV4U2FtcGxlKSwKKyAgICAgIHN0cmVhbS0+bl9zYW1wbGVzICogc2l6ZW9mIChRdERlbXV4U2FtcGxlKSAvICgxMDI0LjAgKiAxMDI0LjApKTsKKworICBpZiAoc3RyZWFtLT5uX3NhbXBsZXMgPj0KKyAgICAgIFFUREVNVVhfTUFYX1NBTVBMRV9JTkRFWF9TSVpFIC8gc2l6ZW9mIChRdERlbXV4U2FtcGxlKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIm5vdCBhbGxvY2F0aW5nIGluZGV4IG9mICVkIHNhbXBsZXMsIHdvdWxkICIKKyAgICAgICAgImJlIGxhcmdlciB0aGFuICV1TUIgKGJyb2tlbiBmaWxlPykiLCBzdHJlYW0tPm5fc2FtcGxlcywKKyAgICAgICAgUVRERU1VWF9NQVhfU0FNUExFX0lOREVYX1NJWkUgPj4gMjApOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGdfYXNzZXJ0IChzdHJlYW0tPnNhbXBsZXMgPT0gTlVMTCk7CisgIHN0cmVhbS0+c2FtcGxlcyA9IGdfdHJ5X25ldzAgKFF0RGVtdXhTYW1wbGUsIHN0cmVhbS0+bl9zYW1wbGVzKTsKKyAgaWYgKCFzdHJlYW0tPnNhbXBsZXMpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJmYWlsZWQgdG8gYWxsb2NhdGUgJWQgc2FtcGxlcyIsCisgICAgICAgIHN0cmVhbS0+bl9zYW1wbGVzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBjb21wb3NpdGlvbiB0aW1lLXRvLXNhbXBsZSAqLworICBpZiAoKHN0cmVhbS0+Y3R0c19wcmVzZW50ID0KKyAgICAgICAgICAhICFxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGVfZnVsbCAoc3RibCwgRk9VUkNDX2N0dHMsCisgICAgICAgICAgICAgICZzdHJlYW0tPmN0dHMpID8gVFJVRSA6IEZBTFNFKSA9PSBUUlVFKSB7CisgICAgR3N0Qnl0ZVJlYWRlciBjc2xnID0gR1NUX0JZVEVfUkVBREVSX0lOSVQgKE5VTEwsIDApOworCisgICAgLyogY29weSBhdG9tIGRhdGEgaW50byBhIG5ldyBidWZmZXIgZm9yIGxhdGVyIHVzZSAqLworICAgIHN0cmVhbS0+Y3R0cy5kYXRhID0gZ19tZW1kdXAgKHN0cmVhbS0+Y3R0cy5kYXRhLCBzdHJlYW0tPmN0dHMuc2l6ZSk7CisKKyAgICAvKiBza2lwIHZlcnNpb24gKyBmbGFncyAqLworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZzdHJlYW0tPmN0dHMsIDEgKyAzKQorICAgICAgICB8fCAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZzdHJlYW0tPmN0dHMsCisgICAgICAgICAgICAmc3RyZWFtLT5uX2NvbXBvc2l0aW9uX3RpbWVzKSkKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgLyogbWFrZSBzdXJlIHRoZXJlJ3MgZW5vdWdoIGRhdGEgKi8KKyAgICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19jaHVua3MgKCZzdHJlYW0tPmN0dHMsIHN0cmVhbS0+bl9jb21wb3NpdGlvbl90aW1lcywKKyAgICAgICAgICAgIDQgKyA0KSkKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgLyogVGhpcyBpcyBvcHRpb25hbCwgaWYgbWlzc2luZyB3ZSBpdGVyYXRlIHRoZSBjdHRzICovCisgICAgaWYgKHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZV9mdWxsIChzdGJsLCBGT1VSQ0NfY3NsZywgJmNzbGcpKSB7CisgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmY3NsZywgMSArIDMpCisgICAgICAgICAgfHwgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmY3NsZywgJnN0cmVhbS0+Y3NsZ19zaGlmdCkpIHsKKyAgICAgICAgZ19mcmVlICgoZ3BvaW50ZXIpIGNzbGcuZGF0YSk7CisgICAgICAgIGdvdG8gY29ycnVwdF9maWxlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBnaW50MzIgY3NsZ19sZWFzdCA9IDA7CisgICAgICBndWludCBudW1fZW50cmllcywgcG9zOworICAgICAgZ2ludCBpOworCisgICAgICBwb3MgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3BvcyAoJnN0cmVhbS0+Y3R0cyk7CisgICAgICBudW1fZW50cmllcyA9IHN0cmVhbS0+bl9jb21wb3NpdGlvbl90aW1lczsKKworICAgICAgc3RyZWFtLT5jc2xnX3NoaWZ0ID0gMDsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyBpKyspIHsKKyAgICAgICAgZ2ludDMyIG9mZnNldDsKKworICAgICAgICBnc3RfYnl0ZV9yZWFkZXJfc2tpcF91bmNoZWNrZWQgKCZzdHJlYW0tPmN0dHMsIDQpOworICAgICAgICBvZmZzZXQgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X2ludDMyX2JlX3VuY2hlY2tlZCAoJnN0cmVhbS0+Y3R0cyk7CisKKyAgICAgICAgaWYgKG9mZnNldCA8IGNzbGdfbGVhc3QpCisgICAgICAgICAgY3NsZ19sZWFzdCA9IG9mZnNldDsKKyAgICAgIH0KKworICAgICAgaWYgKGNzbGdfbGVhc3QgPCAwKQorICAgICAgICBzdHJlYW0tPmNzbGdfc2hpZnQgPSBBQlMgKGNzbGdfbGVhc3QpOworICAgICAgZWxzZQorICAgICAgICBzdHJlYW0tPmNzbGdfc2hpZnQgPSAwOworCisgICAgICAvKiByZXNldCB0aGUgcmVhZGVyIHNvIHdlIGNhbiBnZW5lcmF0ZSBzYW1wbGUgdGFibGUgKi8KKyAgICAgIGdzdF9ieXRlX3JlYWRlcl9zZXRfcG9zICgmc3RyZWFtLT5jdHRzLCBwb3MpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBFbnN1cmUgdGhlIGNzbGdfc2hpZnQgdmFsdWUgaXMgY29uc2lzdGVudCBzbyB3ZSBjYW4gdXNlIGl0CisgICAgICogdW5jb25kaXRpb25uYWxseSB0byBwcm9kdWNlIFRTIGFuZCBTZWdtZW50ICovCisgICAgc3RyZWFtLT5jc2xnX3NoaWZ0ID0gMDsKKyAgfQorCisgIHJldHVybiBUUlVFOworCitjb3JydXB0X2ZpbGU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRkZW11eCwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgKF8oIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIpKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX3NhbXBsZXM6CisgIHsKKyAgICBnc3RfcXRkZW11eF9zdGJsX2ZyZWUgKHN0cmVhbSk7CisgICAgaWYgKCFxdGRlbXV4LT5mcmFnbWVudGVkKSB7CisgICAgICAvKiBub3QgcXVpdGUgZ29vZCAqLworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAic3RyZWFtIGhhcyBubyBzYW1wbGVzIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIG1heSBwaWNrIHVwIHNhbXBsZXMgZWxzZXdoZXJlICovCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KK30KKworLyogY29sbGVjdCBzYW1wbGVzIGZyb20gdGhlIG5leHQgc2FtcGxlIHRvIGJlIHBhcnNlZCB1cCB0byBzYW1wbGUgQG4gZm9yIEBzdHJlYW0KKyAqIGJ5IHJlYWRpbmcgdGhlIGluZm8gZnJvbSBAc3RibAorICoKKyAqIFRoaXMgY29kZSBjYW4gYmUgZXhlY3V0ZWQgZnJvbSBib3RoIHRoZSBzdHJlYW1pbmcgdGhyZWFkIGFuZCB0aGUgc2Vla2luZworICogdGhyZWFkIHNvIGl0IHRha2VzIHRoZSBvYmplY3QgbG9jayB0byBwcm90ZWN0IGl0c2VsZgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK3F0ZGVtdXhfcGFyc2Vfc2FtcGxlcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sIGd1aW50MzIgbikKK3sKKyAgZ2ludCBpLCBqLCBrOworICBRdERlbXV4U2FtcGxlICpzYW1wbGVzLCAqZmlyc3QsICpjdXIsICpsYXN0OworICBndWludDMyIG5fc2FtcGxlc19wZXJfY2h1bms7CisgIGd1aW50MzIgbl9zYW1wbGVzOworCisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAicGFyc2luZyBzYW1wbGVzIGZvciBzdHJlYW0gZm91cmNjICUiCisgICAgICBHU1RfRk9VUkNDX0ZPUk1BVCAiLCBwYWQgJXMiLAorICAgICAgR1NUX0ZPVVJDQ19BUkdTIChDVVJfU1RSRUFNIChzdHJlYW0pLT5mb3VyY2MpLAorICAgICAgc3RyZWFtLT5wYWQgPyBHU1RfUEFEX05BTUUgKHN0cmVhbS0+cGFkKSA6ICIoTlVMTCkiKTsKKworICBuX3NhbXBsZXMgPSBzdHJlYW0tPm5fc2FtcGxlczsKKworICBpZiAobiA+PSBuX3NhbXBsZXMpCisgICAgZ290byBvdXRfb2Zfc2FtcGxlczsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHF0ZGVtdXgpOworICBpZiAobiA8PSBzdHJlYW0tPnN0YmxfaW5kZXgpCisgICAgZ290byBhbHJlYWR5X3BhcnNlZDsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicGFyc2luZyB1cCB0byBzYW1wbGUgJXUiLCBuKTsKKworICBpZiAoIXN0cmVhbS0+c3Rzei5kYXRhKSB7CisgICAgLyogc28gd2UgYWxyZWFkeSBwYXJzZWQgYW5kIHBhc3NlZCBhbGwgdGhlIG1vb3Ygc2FtcGxlczsKKyAgICAgKiBvbnRvIGZyYWdtZW50ZWQgb25lcyAqLworICAgIGdfYXNzZXJ0IChxdGRlbXV4LT5mcmFnbWVudGVkKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiBwb2ludGVyIHRvIHRoZSBzYW1wbGUgdGFibGUgKi8KKyAgc2FtcGxlcyA9IHN0cmVhbS0+c2FtcGxlczsKKworICAvKiBzdGFydHMgZnJvbSAtMSwgbW92ZXMgdG8gdGhlIG5leHQgc2FtcGxlIGluZGV4IHRvIHBhcnNlICovCisgIHN0cmVhbS0+c3RibF9pbmRleCsrOworCisgIC8qIGtlZXAgdHJhY2sgb2YgdGhlIGZpcnN0IGFuZCBsYXN0IHNhbXBsZSB0byBmaWxsICovCisgIGZpcnN0ID0gJnNhbXBsZXNbc3RyZWFtLT5zdGJsX2luZGV4XTsKKyAgbGFzdCA9ICZzYW1wbGVzW25dOworCisgIGlmICghc3RyZWFtLT5jaHVua3NfYXJlX3NhbXBsZXMpIHsKKyAgICAvKiBzZXQgdGhlIHNhbXBsZSBzaXplcyAqLworICAgIGlmIChzdHJlYW0tPnNhbXBsZV9zaXplID09IDApIHsKKyAgICAgIC8qIGRpZmZlcmVudCBzaXplcyBmb3IgZWFjaCBzYW1wbGUgKi8KKyAgICAgIGZvciAoY3VyID0gZmlyc3Q7IGN1ciA8PSBsYXN0OyBjdXIrKykgeworICAgICAgICBjdXItPnNpemUgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKCZzdHJlYW0tPnN0c3opOworICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInNhbXBsZSAlZCBoYXMgc2l6ZSAldSIsCisgICAgICAgICAgICAoZ3VpbnQpIChjdXIgLSBzYW1wbGVzKSwgY3VyLT5zaXplKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogc2FtcGxlcyBoYXZlIHRoZSBzYW1lIHNpemUgKi8KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiYWxsIHNhbXBsZXMgaGF2ZSBzaXplICV1Iiwgc3RyZWFtLT5zYW1wbGVfc2l6ZSk7CisgICAgICBmb3IgKGN1ciA9IGZpcnN0OyBjdXIgPD0gbGFzdDsgY3VyKyspCisgICAgICAgIGN1ci0+c2l6ZSA9IHN0cmVhbS0+c2FtcGxlX3NpemU7CisgICAgfQorICB9CisKKyAgbl9zYW1wbGVzX3Blcl9jaHVuayA9IHN0cmVhbS0+bl9zYW1wbGVzX3Blcl9jaHVuazsKKyAgY3VyID0gZmlyc3Q7CisKKyAgZm9yIChpID0gc3RyZWFtLT5zdHNjX2luZGV4OyBpIDwgbl9zYW1wbGVzX3Blcl9jaHVuazsgaSsrKSB7CisgICAgZ3VpbnQzMiBsYXN0X2NodW5rOworCisgICAgaWYgKHN0cmVhbS0+c3RzY19jaHVua19pbmRleCA+PSBzdHJlYW0tPmxhc3RfY2h1bmsKKyAgICAgICAgfHwgc3RyZWFtLT5zdHNjX2NodW5rX2luZGV4IDwgc3RyZWFtLT5maXJzdF9jaHVuaykgeworICAgICAgc3RyZWFtLT5maXJzdF9jaHVuayA9CisgICAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkICgmc3RyZWFtLT5zdHNjKTsKKyAgICAgIHN0cmVhbS0+c2FtcGxlc19wZXJfY2h1bmsgPQorICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAoJnN0cmVhbS0+c3RzYyk7CisgICAgICAvKiBzdGFydHMgZnJvbSAxICovCisgICAgICBzdHJlYW0tPnN0c2Rfc2FtcGxlX2Rlc2NyaXB0aW9uX2lkID0KKyAgICAgICAgICBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKCZzdHJlYW0tPnN0c2MpIC0gMTsKKworICAgICAgLyogY2h1bmsgbnVtYmVycyBhcmUgY291bnRlZCBmcm9tIDEgaXQgc2VlbXMgKi8KKyAgICAgIGlmIChHX1VOTElLRUxZIChzdHJlYW0tPmZpcnN0X2NodW5rID09IDApKQorICAgICAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICAgICAgLS1zdHJlYW0tPmZpcnN0X2NodW5rOworCisgICAgICAvKiB0aGUgbGFzdCBjaHVuayBvZiBlYWNoIGVudHJ5IGlzIGNhbGN1bGF0ZWQgYnkgdGFraW5nIHRoZSBmaXJzdCBjaHVuaworICAgICAgICogb2YgdGhlIG5leHQgZW50cnk7IGV4Y2VwdCBpZiB0aGVyZSBpcyBubyBuZXh0LCB3aGVyZSB3ZSBmYWtlIGl0IHdpdGgKKyAgICAgICAqIElOVF9NQVggKi8KKyAgICAgIGlmIChHX1VOTElLRUxZIChpID09IChzdHJlYW0tPm5fc2FtcGxlc19wZXJfY2h1bmsgLSAxKSkpIHsKKyAgICAgICAgc3RyZWFtLT5sYXN0X2NodW5rID0gR19NQVhVSU5UMzI7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdHJlYW0tPmxhc3RfY2h1bmsgPQorICAgICAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX3BlZWtfdWludDMyX2JlX3VuY2hlY2tlZCAoJnN0cmVhbS0+c3RzYyk7CisgICAgICAgIGlmIChHX1VOTElLRUxZIChzdHJlYW0tPmxhc3RfY2h1bmsgPT0gMCkpCisgICAgICAgICAgZ290byBjb3JydXB0X2ZpbGU7CisKKyAgICAgICAgLS1zdHJlYW0tPmxhc3RfY2h1bms7CisgICAgICB9CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICJlbnRyeSAlZCBoYXMgZmlyc3RfY2h1bmsgJWQsIGxhc3RfY2h1bmsgJWQsIHNhbXBsZXNfcGVyX2NodW5rICVkIgorICAgICAgICAgICJzYW1wbGUgZGVzYyBJRDogJWQiLCBpLCBzdHJlYW0tPmZpcnN0X2NodW5rLCBzdHJlYW0tPmxhc3RfY2h1bmssCisgICAgICAgICAgc3RyZWFtLT5zYW1wbGVzX3Blcl9jaHVuaywgc3RyZWFtLT5zdHNkX3NhbXBsZV9kZXNjcmlwdGlvbl9pZCk7CisKKyAgICAgIGlmIChHX1VOTElLRUxZIChzdHJlYW0tPmxhc3RfY2h1bmsgPCBzdHJlYW0tPmZpcnN0X2NodW5rKSkKKyAgICAgICAgZ290byBjb3JydXB0X2ZpbGU7CisKKyAgICAgIGlmIChzdHJlYW0tPmxhc3RfY2h1bmsgIT0gR19NQVhVSU5UMzIpIHsKKyAgICAgICAgaWYgKCFxdF9hdG9tX3BhcnNlcl9wZWVrX3N1YiAoJnN0cmVhbS0+c3RjbywKKyAgICAgICAgICAgICAgICBzdHJlYW0tPmZpcnN0X2NodW5rICogc3RyZWFtLT5jb19zaXplLAorICAgICAgICAgICAgICAgIChzdHJlYW0tPmxhc3RfY2h1bmsgLSBzdHJlYW0tPmZpcnN0X2NodW5rKSAqIHN0cmVhbS0+Y29fc2l6ZSwKKyAgICAgICAgICAgICAgICAmc3RyZWFtLT5jb19jaHVuaykpCisgICAgICAgICAgZ290byBjb3JydXB0X2ZpbGU7CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmVhbS0+Y29fY2h1bmsgPSBzdHJlYW0tPnN0Y287CisgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZzdHJlYW0tPmNvX2NodW5rLAorICAgICAgICAgICAgICAgIHN0cmVhbS0+Zmlyc3RfY2h1bmsgKiBzdHJlYW0tPmNvX3NpemUpKQorICAgICAgICAgIGdvdG8gY29ycnVwdF9maWxlOworICAgICAgfQorCisgICAgICBzdHJlYW0tPnN0c2NfY2h1bmtfaW5kZXggPSBzdHJlYW0tPmZpcnN0X2NodW5rOworICAgIH0KKworICAgIGxhc3RfY2h1bmsgPSBzdHJlYW0tPmxhc3RfY2h1bms7CisKKyAgICBpZiAoc3RyZWFtLT5jaHVua3NfYXJlX3NhbXBsZXMpIHsKKyAgICAgIGN1ciA9ICZzYW1wbGVzW3N0cmVhbS0+c3RzY19jaHVua19pbmRleF07CisKKyAgICAgIGZvciAoaiA9IHN0cmVhbS0+c3RzY19jaHVua19pbmRleDsgaiA8IGxhc3RfY2h1bms7IGorKykgeworICAgICAgICBpZiAoaiA+IG4pIHsKKyAgICAgICAgICAvKiBzYXZlIHN0YXRlICovCisgICAgICAgICAgc3RyZWFtLT5zdHNjX2NodW5rX2luZGV4ID0gajsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgICBjdXItPm9mZnNldCA9CisgICAgICAgICAgICBxdF9hdG9tX3BhcnNlcl9nZXRfb2Zmc2V0X3VuY2hlY2tlZCAoJnN0cmVhbS0+Y29fY2h1bmssCisgICAgICAgICAgICBzdHJlYW0tPmNvX3NpemUpOworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiQ3JlYXRlZCBlbnRyeSAlZCB3aXRoIG9mZnNldCAiCisgICAgICAgICAgICAiJSIgR19HVUlOVDY0X0ZPUk1BVCwgaiwgY3VyLT5vZmZzZXQpOworCisgICAgICAgIGlmIChDVVJfU1RSRUFNIChzdHJlYW0pLT5zYW1wbGVzX3Blcl9mcmFtZSA+IDAgJiYKKyAgICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmJ5dGVzX3Blcl9mcmFtZSA+IDApIHsKKyAgICAgICAgICBjdXItPnNpemUgPQorICAgICAgICAgICAgICAoc3RyZWFtLT5zYW1wbGVzX3Blcl9jaHVuayAqIENVUl9TVFJFQU0gKHN0cmVhbSktPm5fY2hhbm5lbHMpIC8KKyAgICAgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+c2FtcGxlc19wZXJfZnJhbWUgKgorICAgICAgICAgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5ieXRlc19wZXJfZnJhbWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY3VyLT5zaXplID0gc3RyZWFtLT5zYW1wbGVzX3Blcl9jaHVuazsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAia2V5ZnJhbWUgc2FtcGxlICVkOiB0aW1lc3RhbXAgJSIgR1NUX1RJTUVfRk9STUFUICIsIHNpemUgJXUiLAorICAgICAgICAgICAgaiwgR1NUX1RJTUVfQVJHUyAoUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUgKHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5zdGNvX3NhbXBsZV9pbmRleCkpLCBjdXItPnNpemUpOworCisgICAgICAgIGN1ci0+dGltZXN0YW1wID0gc3RyZWFtLT5zdGNvX3NhbXBsZV9pbmRleDsKKyAgICAgICAgY3VyLT5kdXJhdGlvbiA9IHN0cmVhbS0+c2FtcGxlc19wZXJfY2h1bms7CisgICAgICAgIGN1ci0+a2V5ZnJhbWUgPSBUUlVFOworICAgICAgICBjdXIrKzsKKworICAgICAgICBzdHJlYW0tPnN0Y29fc2FtcGxlX2luZGV4ICs9IHN0cmVhbS0+c2FtcGxlc19wZXJfY2h1bms7CisgICAgICB9CisgICAgICBzdHJlYW0tPnN0c2NfY2h1bmtfaW5kZXggPSBqOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGogPSBzdHJlYW0tPnN0c2NfY2h1bmtfaW5kZXg7IGogPCBsYXN0X2NodW5rOyBqKyspIHsKKyAgICAgICAgZ3VpbnQzMiBzYW1wbGVzX3Blcl9jaHVuazsKKyAgICAgICAgZ3VpbnQ2NCBjaHVua19vZmZzZXQ7CisKKyAgICAgICAgaWYgKCFzdHJlYW0tPnN0c2Nfc2FtcGxlX2luZGV4CisgICAgICAgICAgICAmJiAhcXRfYXRvbV9wYXJzZXJfZ2V0X29mZnNldCAoJnN0cmVhbS0+Y29fY2h1bmssIHN0cmVhbS0+Y29fc2l6ZSwKKyAgICAgICAgICAgICAgICAmc3RyZWFtLT5jaHVua19vZmZzZXQpKQorICAgICAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgICAgIHNhbXBsZXNfcGVyX2NodW5rID0gc3RyZWFtLT5zYW1wbGVzX3Blcl9jaHVuazsKKyAgICAgICAgY2h1bmtfb2Zmc2V0ID0gc3RyZWFtLT5jaHVua19vZmZzZXQ7CisKKyAgICAgICAgZm9yIChrID0gc3RyZWFtLT5zdHNjX3NhbXBsZV9pbmRleDsgayA8IHNhbXBsZXNfcGVyX2NodW5rOyBrKyspIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImNyZWF0aW5nIGVudHJ5ICVkIHdpdGggb2Zmc2V0ICUiCisgICAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIiBhbmQgc2l6ZSAlZCIsCisgICAgICAgICAgICAgIChndWludCkgKGN1ciAtIHNhbXBsZXMpLCBjaHVua19vZmZzZXQsIGN1ci0+c2l6ZSk7CisKKyAgICAgICAgICBjdXItPm9mZnNldCA9IGNodW5rX29mZnNldDsKKyAgICAgICAgICBjaHVua19vZmZzZXQgKz0gY3VyLT5zaXplOworICAgICAgICAgIGN1cisrOworCisgICAgICAgICAgaWYgKEdfVU5MSUtFTFkgKGN1ciA+IGxhc3QpKSB7CisgICAgICAgICAgICAvKiBzYXZlIHN0YXRlICovCisgICAgICAgICAgICBzdHJlYW0tPnN0c2Nfc2FtcGxlX2luZGV4ID0gayArIDE7CisgICAgICAgICAgICBzdHJlYW0tPmNodW5rX29mZnNldCA9IGNodW5rX29mZnNldDsKKyAgICAgICAgICAgIHN0cmVhbS0+c3RzY19jaHVua19pbmRleCA9IGo7CisgICAgICAgICAgICBnb3RvIGRvbmUyOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJlYW0tPnN0c2Nfc2FtcGxlX2luZGV4ID0gMDsKKyAgICAgIH0KKyAgICAgIHN0cmVhbS0+c3RzY19jaHVua19pbmRleCA9IGo7CisgICAgfQorICAgIHN0cmVhbS0+c3RzY19pbmRleCsrOworICB9CisKKyAgaWYgKHN0cmVhbS0+Y2h1bmtzX2FyZV9zYW1wbGVzKQorICAgIGdvdG8gY3R0czsKK2RvbmUyOgorICB7CisgICAgZ3VpbnQzMiBuX3NhbXBsZV90aW1lczsKKworICAgIG5fc2FtcGxlX3RpbWVzID0gc3RyZWFtLT5uX3NhbXBsZV90aW1lczsKKyAgICBjdXIgPSBmaXJzdDsKKworICAgIGZvciAoaSA9IHN0cmVhbS0+c3R0c19pbmRleDsgaSA8IG5fc2FtcGxlX3RpbWVzOyBpKyspIHsKKyAgICAgIGd1aW50MzIgc3R0c19zYW1wbGVzOworICAgICAgZ2ludDMyIHN0dHNfZHVyYXRpb247CisgICAgICBnaW50NjQgc3R0c190aW1lOworCisgICAgICBpZiAoc3RyZWFtLT5zdHRzX3NhbXBsZV9pbmRleCA+PSBzdHJlYW0tPnN0dHNfc2FtcGxlcworICAgICAgICAgIHx8ICFzdHJlYW0tPnN0dHNfc2FtcGxlX2luZGV4KSB7CisKKyAgICAgICAgc3RyZWFtLT5zdHRzX3NhbXBsZXMgPQorICAgICAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkICgmc3RyZWFtLT5zdHRzKTsKKyAgICAgICAgc3RyZWFtLT5zdHRzX2R1cmF0aW9uID0KKyAgICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAoJnN0cmVhbS0+c3R0cyk7CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJibG9jayAlZCwgJXUgdGltZXN0YW1wcywgZHVyYXRpb24gJXUiLAorICAgICAgICAgICAgaSwgc3RyZWFtLT5zdHRzX3NhbXBsZXMsIHN0cmVhbS0+c3R0c19kdXJhdGlvbik7CisKKyAgICAgICAgc3RyZWFtLT5zdHRzX3NhbXBsZV9pbmRleCA9IDA7CisgICAgICB9CisKKyAgICAgIHN0dHNfc2FtcGxlcyA9IHN0cmVhbS0+c3R0c19zYW1wbGVzOworICAgICAgc3R0c19kdXJhdGlvbiA9IHN0cmVhbS0+c3R0c19kdXJhdGlvbjsKKyAgICAgIHN0dHNfdGltZSA9IHN0cmVhbS0+c3R0c190aW1lOworCisgICAgICBmb3IgKGogPSBzdHJlYW0tPnN0dHNfc2FtcGxlX2luZGV4OyBqIDwgc3R0c19zYW1wbGVzOyBqKyspIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICJzYW1wbGUgJWQ6IGluZGV4ICVkLCB0aW1lc3RhbXAgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgKGd1aW50KSAoY3VyIC0gc2FtcGxlcyksIGosCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChRVFNUUkVBTVRJTUVfVE9fR1NUVElNRSAoc3RyZWFtLCBzdHRzX3RpbWUpKSk7CisKKyAgICAgICAgY3VyLT50aW1lc3RhbXAgPSBzdHRzX3RpbWU7CisgICAgICAgIGN1ci0+ZHVyYXRpb24gPSBzdHRzX2R1cmF0aW9uOworCisgICAgICAgIC8qIGF2b2lkIDMyLWJpdCB3cmFwLWFyb3VuZCwKKyAgICAgICAgICogYnV0IHN0aWxsIG1pbmQgcG9zc2libGUgJ25lZ2F0aXZlJyBkdXJhdGlvbiAqLworICAgICAgICBzdHRzX3RpbWUgKz0gKGdpbnQ2NCkgc3R0c19kdXJhdGlvbjsKKyAgICAgICAgY3VyKys7CisKKyAgICAgICAgaWYgKEdfVU5MSUtFTFkgKGN1ciA+IGxhc3QpKSB7CisgICAgICAgICAgLyogc2F2ZSB2YWx1ZXMgKi8KKyAgICAgICAgICBzdHJlYW0tPnN0dHNfdGltZSA9IHN0dHNfdGltZTsKKyAgICAgICAgICBzdHJlYW0tPnN0dHNfc2FtcGxlX2luZGV4ID0gaiArIDE7CisgICAgICAgICAgaWYgKHN0cmVhbS0+c3R0c19zYW1wbGVfaW5kZXggPj0gc3RyZWFtLT5zdHRzX3NhbXBsZXMpCisgICAgICAgICAgICBzdHJlYW0tPnN0dHNfaW5kZXgrKzsKKyAgICAgICAgICBnb3RvIGRvbmUzOworICAgICAgICB9CisgICAgICB9CisgICAgICBzdHJlYW0tPnN0dHNfc2FtcGxlX2luZGV4ID0gMDsKKyAgICAgIHN0cmVhbS0+c3R0c190aW1lID0gc3R0c190aW1lOworICAgICAgc3RyZWFtLT5zdHRzX2luZGV4Kys7CisgICAgfQorICAgIC8qIGZpbGwgdXAgZW1wdHkgdGltZXN0YW1wcyB3aXRoIHRoZSBsYXN0IHRpbWVzdGFtcCwgdGhpcyBjYW4gaGFwcGVuIHdoZW4KKyAgICAgKiB0aGUgbGFzdCBzYW1wbGVzIGRvIG5vdCBkZWNvZGUgYW5kIHNvIHdlIGRvbid0IGhhdmUgdGltZXN0YW1wcyBmb3IgdGhlbS4KKyAgICAgKiBXZSBob3dldmVyIGxvb2sgYXQgdGhlIGxhc3QgdGltZXN0YW1wIHRvIGVzdGltYXRlIHRoZSB0cmFjayBsZW5ndGggc28gd2UKKyAgICAgKiBuZWVkIHNvbWV0aGluZyBpbiBoZXJlLiAqLworICAgIGZvciAoOyBjdXIgPCBsYXN0OyBjdXIrKykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAiZmlsbCBzYW1wbGUgJWQ6IHRpbWVzdGFtcCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgKGd1aW50KSAoY3VyIC0gc2FtcGxlcyksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoUVRTVFJFQU1USU1FX1RPX0dTVFRJTUUgKHN0cmVhbSwgc3RyZWFtLT5zdHRzX3RpbWUpKSk7CisgICAgICBjdXItPnRpbWVzdGFtcCA9IHN0cmVhbS0+c3R0c190aW1lOworICAgICAgY3VyLT5kdXJhdGlvbiA9IC0xOworICAgIH0KKyAgfQorZG9uZTM6CisgIHsKKyAgICAvKiBzYW1wbGUgc3luYywgY2FuIGJlIE5VTEwgKi8KKyAgICBpZiAoc3RyZWFtLT5zdHNzX3ByZXNlbnQgPT0gVFJVRSkgeworICAgICAgZ3VpbnQzMiBuX3NhbXBsZV9zeW5jczsKKworICAgICAgbl9zYW1wbGVfc3luY3MgPSBzdHJlYW0tPm5fc2FtcGxlX3N5bmNzOworCisgICAgICBpZiAoIW5fc2FtcGxlX3N5bmNzKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJhbGwgc2FtcGxlcyBhcmUga2V5ZnJhbWVzIik7CisgICAgICAgIHN0cmVhbS0+YWxsX2tleWZyYW1lID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IHN0cmVhbS0+c3Rzc19pbmRleDsgaSA8IG5fc2FtcGxlX3N5bmNzOyBpKyspIHsKKyAgICAgICAgICAvKiBub3RlIHRoYXQgdGhlIGZpcnN0IHNhbXBsZSBpcyBpbmRleCAxLCBub3QgMCAqLworICAgICAgICAgIGd1aW50MzIgaW5kZXg7CisKKyAgICAgICAgICBpbmRleCA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAoJnN0cmVhbS0+c3Rzcyk7CisKKyAgICAgICAgICBpZiAoR19MSUtFTFkgKGluZGV4ID4gMCAmJiBpbmRleCA8PSBuX3NhbXBsZXMpKSB7CisgICAgICAgICAgICBpbmRleCAtPSAxOworICAgICAgICAgICAgc2FtcGxlc1tpbmRleF0ua2V5ZnJhbWUgPSBUUlVFOworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInNhbXBsZXMgYXQgJXUgaXMga2V5ZnJhbWUiLCBpbmRleCk7CisgICAgICAgICAgICAvKiBhbmQgZXhpdCBpZiB3ZSBoYXZlIGVub3VnaCBzYW1wbGVzICovCisgICAgICAgICAgICBpZiAoR19VTkxJS0VMWSAoaW5kZXggPj0gbikpIHsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogc2F2ZSBzdGF0ZSAqLworICAgICAgICBzdHJlYW0tPnN0c3NfaW5kZXggPSBpOworICAgICAgfQorCisgICAgICAvKiBzdHBzIG1hcmtzIHBhcnRpYWwgc3luYyBmcmFtZXMgbGlrZSBvcGVuIEdPUCBJLUZyYW1lcyAqLworICAgICAgaWYgKHN0cmVhbS0+c3Rwc19wcmVzZW50ID09IFRSVUUpIHsKKyAgICAgICAgZ3VpbnQzMiBuX3NhbXBsZV9wYXJ0aWFsX3N5bmNzOworCisgICAgICAgIG5fc2FtcGxlX3BhcnRpYWxfc3luY3MgPSBzdHJlYW0tPm5fc2FtcGxlX3BhcnRpYWxfc3luY3M7CisKKyAgICAgICAgLyogaWYgdGhlcmUgYXJlIG5vIGVudHJpZXMsIHRoZSBzdHNzIHRhYmxlIGNvbnRhaW5zIHRoZSByZWFsCisgICAgICAgICAqIHN5bmMgc2FtcGxlcyAqLworICAgICAgICBpZiAobl9zYW1wbGVfcGFydGlhbF9zeW5jcykgeworICAgICAgICAgIGZvciAoaSA9IHN0cmVhbS0+c3Rwc19pbmRleDsgaSA8IG5fc2FtcGxlX3BhcnRpYWxfc3luY3M7IGkrKykgeworICAgICAgICAgICAgLyogbm90ZSB0aGF0IHRoZSBmaXJzdCBzYW1wbGUgaXMgaW5kZXggMSwgbm90IDAgKi8KKyAgICAgICAgICAgIGd1aW50MzIgaW5kZXg7CisKKyAgICAgICAgICAgIGluZGV4ID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkICgmc3RyZWFtLT5zdHBzKTsKKworICAgICAgICAgICAgaWYgKEdfTElLRUxZIChpbmRleCA+IDAgJiYgaW5kZXggPD0gbl9zYW1wbGVzKSkgeworICAgICAgICAgICAgICBpbmRleCAtPSAxOworICAgICAgICAgICAgICBzYW1wbGVzW2luZGV4XS5rZXlmcmFtZSA9IFRSVUU7CisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzYW1wbGVzIGF0ICV1IGlzIGtleWZyYW1lIiwgaW5kZXgpOworICAgICAgICAgICAgICAvKiBhbmQgZXhpdCBpZiB3ZSBoYXZlIGVub3VnaCBzYW1wbGVzICovCisgICAgICAgICAgICAgIGlmIChHX1VOTElLRUxZIChpbmRleCA+PSBuKSkgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICAvKiBzYXZlIHN0YXRlICovCisgICAgICAgICAgc3RyZWFtLT5zdHBzX2luZGV4ID0gaTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBubyBzdHNzLCBhbGwgc2FtcGxlcyBhcmUga2V5ZnJhbWVzICovCisgICAgICBzdHJlYW0tPmFsbF9rZXlmcmFtZSA9IFRSVUU7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic2V0dGluZyBhbGwga2V5ZnJhbWVzIik7CisgICAgfQorICB9CisKK2N0dHM6CisgIC8qIGNvbXBvc2l0aW9uIHRpbWUgdG8gc2FtcGxlICovCisgIGlmIChzdHJlYW0tPmN0dHNfcHJlc2VudCA9PSBUUlVFKSB7CisgICAgZ3VpbnQzMiBuX2NvbXBvc2l0aW9uX3RpbWVzOworICAgIGd1aW50MzIgY3R0c19jb3VudDsKKyAgICBnaW50MzIgY3R0c19zb2Zmc2V0OworCisgICAgLyogRmlsbCBpbiB0aGUgcHRzX29mZnNldHMgKi8KKyAgICBjdXIgPSBmaXJzdDsKKyAgICBuX2NvbXBvc2l0aW9uX3RpbWVzID0gc3RyZWFtLT5uX2NvbXBvc2l0aW9uX3RpbWVzOworCisgICAgZm9yIChpID0gc3RyZWFtLT5jdHRzX2luZGV4OyBpIDwgbl9jb21wb3NpdGlvbl90aW1lczsgaSsrKSB7CisgICAgICBpZiAoc3RyZWFtLT5jdHRzX3NhbXBsZV9pbmRleCA+PSBzdHJlYW0tPmN0dHNfY291bnQKKyAgICAgICAgICB8fCAhc3RyZWFtLT5jdHRzX3NhbXBsZV9pbmRleCkgeworICAgICAgICBzdHJlYW0tPmN0dHNfY291bnQgPQorICAgICAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkICgmc3RyZWFtLT5jdHRzKTsKKyAgICAgICAgc3RyZWFtLT5jdHRzX3NvZmZzZXQgPQorICAgICAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF9pbnQzMl9iZV91bmNoZWNrZWQgKCZzdHJlYW0tPmN0dHMpOworICAgICAgICBzdHJlYW0tPmN0dHNfc2FtcGxlX2luZGV4ID0gMDsKKyAgICAgIH0KKworICAgICAgY3R0c19jb3VudCA9IHN0cmVhbS0+Y3R0c19jb3VudDsKKyAgICAgIGN0dHNfc29mZnNldCA9IHN0cmVhbS0+Y3R0c19zb2Zmc2V0OworCisgICAgICBmb3IgKGogPSBzdHJlYW0tPmN0dHNfc2FtcGxlX2luZGV4OyBqIDwgY3R0c19jb3VudDsgaisrKSB7CisgICAgICAgIGN1ci0+cHRzX29mZnNldCA9IGN0dHNfc29mZnNldDsKKyAgICAgICAgY3VyKys7CisKKyAgICAgICAgaWYgKEdfVU5MSUtFTFkgKGN1ciA+IGxhc3QpKSB7CisgICAgICAgICAgLyogc2F2ZSBzdGF0ZSAqLworICAgICAgICAgIHN0cmVhbS0+Y3R0c19zYW1wbGVfaW5kZXggPSBqICsgMTsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN0cmVhbS0+Y3R0c19zYW1wbGVfaW5kZXggPSAwOworICAgICAgc3RyZWFtLT5jdHRzX2luZGV4Kys7CisgICAgfQorICB9Citkb25lOgorICBzdHJlYW0tPnN0YmxfaW5kZXggPSBuOworICAvKiBpZiBpbmRleCBoYXMgYmVlbiBjb21wbGV0ZWx5IHBhcnNlZCwgZnJlZSBkYXRhIHRoYXQgaXMgbm8tbG9uZ2VyIG5lZWRlZCAqLworICBpZiAobiArIDEgPT0gc3RyZWFtLT5uX3NhbXBsZXMpIHsKKyAgICBnc3RfcXRkZW11eF9zdGJsX2ZyZWUgKHN0cmVhbSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInBhcnNlZCBhbGwgYXZhaWxhYmxlIHNhbXBsZXM7Iik7CisgICAgaWYgKHF0ZGVtdXgtPnB1bGxiYXNlZCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImNoZWNraW5nIGZvciBtb3JlIHNhbXBsZXMiKTsKKyAgICAgIHdoaWxlIChuICsgMSA9PSBzdHJlYW0tPm5fc2FtcGxlcykKKyAgICAgICAgaWYgKHF0ZGVtdXhfYWRkX2ZyYWdtZW50ZWRfc2FtcGxlcyAocXRkZW11eCkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChxdGRlbXV4KTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBTVUNDRVNTICovCithbHJlYWR5X3BhcnNlZDoKKyAgeworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAiVHJpZWQgdG8gcGFyc2UgdXAgdG8gc2FtcGxlICV1IGJ1dCB0aGlzIHNhbXBsZSBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZCIsCisgICAgICAgIG4pOworICAgIC8qIGlmIGZyYWdtZW50ZWQsIHRoZXJlIG1heSBiZSBtb3JlICovCisgICAgaWYgKHF0ZGVtdXgtPmZyYWdtZW50ZWQgJiYgbiA9PSBzdHJlYW0tPnN0YmxfaW5kZXgpCisgICAgICBnb3RvIGRvbmU7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHF0ZGVtdXgpOworICAgIHJldHVybiBUUlVFOworICB9CisgIC8qIEVSUk9SUyAqLworb3V0X29mX3NhbXBsZXM6CisgIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgIlRyaWVkIHRvIHBhcnNlIHVwIHRvIHNhbXBsZSAldSBidXQgdGhlcmUgYXJlIG9ubHkgJXUgc2FtcGxlcyIsIG4gKyAxLAorICAgICAgICBzdHJlYW0tPm5fc2FtcGxlcyk7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0ZGVtdXgsIFNUUkVBTSwgREVNVVgsCisgICAgICAgIChfKCJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iKSksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citjb3JydXB0X2ZpbGU6CisgIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocXRkZW11eCk7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHF0ZGVtdXgsIFNUUkVBTSwgREVNVVgsCisgICAgICAgIChfKCJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iKSksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIGNvbGxlY3QgYWxsIHNlZ21lbnQgaW5mbyBmb3IgQHN0cmVhbS4KKyAqLworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3BhcnNlX3NlZ21lbnRzIChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwKKyAgICBHTm9kZSAqIHRyYWspCit7CisgIEdOb2RlICplZHRzOworICAvKiBhY2NlcHQgZWR0cyBpZiB0aGV5IGNvbnRhaW4gZ2FwcyBhdCBzdGFydCBhbmQgdGhlcmUgaXMgb25seQorICAgKiBvbmUgbWVkaWEgc2VnbWVudCAqLworICBnYm9vbGVhbiBhbGxvd19wdXNoYmFzZWRfZWR0cyA9IFRSVUU7CisgIGdpbnQgbWVkaWFfc2VnbWVudHNfY291bnQgPSAwOworCisgIC8qIHBhcnNlIGFuZCBwcmVwYXJlIHNlZ21lbnQgaW5mbyBmcm9tIHRoZSBlZGl0IGxpc3QgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImxvb2tpbmcgZm9yIGVkaXQgbGlzdCBjb250YWluZXIiKTsKKyAgc3RyZWFtLT5uX3NlZ21lbnRzID0gMDsKKyAgc3RyZWFtLT5zZWdtZW50cyA9IE5VTEw7CisgIGlmICgoZWR0cyA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAodHJhaywgRk9VUkNDX2VkdHMpKSkgeworICAgIEdOb2RlICplbHN0OworICAgIGdpbnQgbl9zZWdtZW50czsKKyAgICBnaW50IGksIGNvdW50LCBlbnRyeV9zaXplOworICAgIGd1aW50NjQgdGltZTsKKyAgICBHc3RDbG9ja1RpbWUgc3RpbWU7CisgICAgY29uc3QgZ3VpbnQ4ICpidWZmZXI7CisgICAgZ3VpbnQ4IHZlcnNpb247CisgICAgZ3VpbnQzMiBzaXplOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImxvb2tpbmcgZm9yIGVkaXQgbGlzdCIpOworICAgIGlmICghKGVsc3QgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKGVkdHMsIEZPVVJDQ19lbHN0KSkpCisgICAgICBnb3RvIGRvbmU7CisKKyAgICBidWZmZXIgPSBlbHN0LT5kYXRhOworCisgICAgc2l6ZSA9IFFUX1VJTlQzMiAoYnVmZmVyKTsKKyAgICAvKiB2ZXJzaW9uLCBmbGFncywgbl9zZWdtZW50cyAqLworICAgIGlmIChzaXplIDwgMTYpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIkludmFsaWQgZWRpdCBsaXN0Iik7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIHZlcnNpb24gPSBRVF9VSU5UOCAoYnVmZmVyICsgOCk7CisgICAgZW50cnlfc2l6ZSA9ICh2ZXJzaW9uID09IDEpID8gMjAgOiAxMjsKKworICAgIG5fc2VnbWVudHMgPSBRVF9VSU5UMzIgKGJ1ZmZlciArIDEyKTsKKworICAgIGlmIChuX3NlZ21lbnRzID4gMTAwMDAwIHx8IHNpemUgPCAxNiArIG5fc2VnbWVudHMgKiBlbnRyeV9zaXplKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJJbnZhbGlkIGVkaXQgbGlzdCIpOworICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIC8qIHdlIG1pZ2h0IGFsbG9jYXRlIGEgYml0IHRvbyBtdWNoLCBhdCBsZWFzdCBhbGxvY2F0ZSAxIHNlZ21lbnQgKi8KKyAgICBzdHJlYW0tPnNlZ21lbnRzID0gZ19uZXcgKFF0RGVtdXhTZWdtZW50LCBNQVggKG5fc2VnbWVudHMsIDEpKTsKKworICAgIC8qIHNlZ21lbnRzIGFsd2F5cyBzdGFydCBmcm9tIDAgKi8KKyAgICB0aW1lID0gMDsKKyAgICBzdGltZSA9IDA7CisgICAgY291bnQgPSAwOworICAgIGJ1ZmZlciArPSAxNjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbl9zZWdtZW50czsgaSsrKSB7CisgICAgICBndWludDY0IGR1cmF0aW9uOworICAgICAgZ3VpbnQ2NCBtZWRpYV90aW1lOworICAgICAgZ2Jvb2xlYW4gdGltZV92YWxpZCA9IFRSVUU7CisgICAgICBRdERlbXV4U2VnbWVudCAqc2VnbWVudDsKKyAgICAgIGd1aW50MzIgcmF0ZV9pbnQ7CisgICAgICBHc3RDbG9ja1RpbWUgbWVkaWFfc3RhcnQgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgICAgICBpZiAodmVyc2lvbiA9PSAxKSB7CisgICAgICAgIG1lZGlhX3RpbWUgPSBRVF9VSU5UNjQgKGJ1ZmZlciArIDgpOworICAgICAgICBkdXJhdGlvbiA9IFFUX1VJTlQ2NCAoYnVmZmVyKTsKKyAgICAgICAgaWYgKG1lZGlhX3RpbWUgPT0gR19NQVhVSU5UNjQpCisgICAgICAgICAgdGltZV92YWxpZCA9IEZBTFNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWVkaWFfdGltZSA9IFFUX1VJTlQzMiAoYnVmZmVyICsgNCk7CisgICAgICAgIGR1cmF0aW9uID0gUVRfVUlOVDMyIChidWZmZXIpOworICAgICAgICBpZiAobWVkaWFfdGltZSA9PSBHX01BWFVJTlQzMikKKyAgICAgICAgICB0aW1lX3ZhbGlkID0gRkFMU0U7CisgICAgICB9CisKKyAgICAgIGlmICh0aW1lX3ZhbGlkKQorICAgICAgICBtZWRpYV9zdGFydCA9IFFUU1RSRUFNVElNRV9UT19HU1RUSU1FIChzdHJlYW0sIG1lZGlhX3RpbWUpOworCisgICAgICBzZWdtZW50ID0gJnN0cmVhbS0+c2VnbWVudHNbY291bnQrK107CisKKyAgICAgIC8qIHRpbWUgYW5kIGR1cmF0aW9uIGV4cHJlc3NlZCBpbiBnbG9iYWwgdGltZXNjYWxlICovCisgICAgICBzZWdtZW50LT50aW1lID0gc3RpbWU7CisgICAgICAvKiBhZGQgbm9uIHNjYWxlZCB2YWx1ZXMgc28gd2UgZG9uJ3QgY2F1c2Ugcm91bmRvZmYgZXJyb3JzICovCisgICAgICBpZiAoZHVyYXRpb24gfHwgbWVkaWFfc3RhcnQgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgICAgICB0aW1lICs9IGR1cmF0aW9uOworICAgICAgICBzdGltZSA9IFFUVElNRV9UT19HU1RUSU1FIChxdGRlbXV4LCB0aW1lKTsKKyAgICAgICAgc2VnbWVudC0+ZHVyYXRpb24gPSBzdGltZSAtIHNlZ21lbnQtPnRpbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiB6ZXJvIGR1cmF0aW9uIGRvZXMgbm90IGltcGx5IG1lZGlhX3N0YXJ0ID09IG1lZGlhX3N0b3AKKyAgICAgICAgICogYnV0LCBvbmx5IHNwZWNpZnkgbWVkaWFfc3RhcnQuKi8KKyAgICAgICAgc3RpbWUgPSBRVFRJTUVfVE9fR1NUVElNRSAocXRkZW11eCwgcXRkZW11eC0+ZHVyYXRpb24pOworICAgICAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHN0aW1lKSAmJiB0aW1lX3ZhbGlkCisgICAgICAgICAgICAmJiBzdGltZSA+PSBtZWRpYV9zdGFydCkgeworICAgICAgICAgIHNlZ21lbnQtPmR1cmF0aW9uID0gc3RpbWUgLSBtZWRpYV9zdGFydDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZWdtZW50LT5kdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNlZ21lbnQtPnN0b3BfdGltZSA9IHN0aW1lOworCisgICAgICBzZWdtZW50LT50cmFrX21lZGlhX3N0YXJ0ID0gbWVkaWFfdGltZTsKKyAgICAgIC8qIG1lZGlhX3RpbWUgZXhwcmVzc2VkIGluIHN0cmVhbSB0aW1lc2NhbGUgKi8KKyAgICAgIGlmICh0aW1lX3ZhbGlkKSB7CisgICAgICAgIHNlZ21lbnQtPm1lZGlhX3N0YXJ0ID0gbWVkaWFfc3RhcnQ7CisgICAgICAgIHNlZ21lbnQtPm1lZGlhX3N0b3AgPSBzZWdtZW50LT5tZWRpYV9zdGFydCArIHNlZ21lbnQtPmR1cmF0aW9uOworICAgICAgICBtZWRpYV9zZWdtZW50c19jb3VudCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2VnbWVudC0+bWVkaWFfc3RhcnQgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgICBzZWdtZW50LT5tZWRpYV9zdG9wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgIH0KKyAgICAgIHJhdGVfaW50ID0gUVRfVUlOVDMyIChidWZmZXIgKyAoKHZlcnNpb24gPT0gMSkgPyAxNiA6IDgpKTsKKworICAgICAgaWYgKHJhdGVfaW50IDw9IDEpIHsKKyAgICAgICAgLyogMCBpcyBub3QgYWxsb3dlZCwgc29tZSBwcm9ncmFtcyB3cml0ZSAxIGluc3RlYWQgb2YgdGhlIGZsb2F0aW5nIHBvaW50CisgICAgICAgICAqIHZhbHVlICovCisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgImZvdW5kIHN1c3BpY2lvdXMgcmF0ZSAlIiBHX0dVSU5UMzJfRk9STUFULAorICAgICAgICAgICAgcmF0ZV9pbnQpOworICAgICAgICBzZWdtZW50LT5yYXRlID0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNlZ21lbnQtPnJhdGUgPSByYXRlX2ludCAvIDY1NTM2LjA7CisgICAgICB9CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJjcmVhdGVkIHNlZ21lbnQgJWQgdGltZSAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAiLCBkdXJhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQgIiwgbWVkaWFfc3RhcnQgJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICAgIiAoJSIgR19HVUlOVDY0X0ZPUk1BVCAiKSAsIG1lZGlhX3N0b3AgJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICAgIiBzdG9wX3RpbWUgJSIgR1NUX1RJTUVfRk9STUFUICIgcmF0ZSAlZywgKCVkKSB0aW1lc2NhbGUgJXUiLAorICAgICAgICAgIGksIEdTVF9USU1FX0FSR1MgKHNlZ21lbnQtPnRpbWUpLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHNlZ21lbnQtPmR1cmF0aW9uKSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChzZWdtZW50LT5tZWRpYV9zdGFydCksIG1lZGlhX3RpbWUsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc2VnbWVudC0+bWVkaWFfc3RvcCksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc2VnbWVudC0+c3RvcF90aW1lKSwgc2VnbWVudC0+cmF0ZSwgcmF0ZV9pbnQsCisgICAgICAgICAgc3RyZWFtLT50aW1lc2NhbGUpOworICAgICAgaWYgKHNlZ21lbnQtPnN0b3BfdGltZSA+IHF0ZGVtdXgtPnNlZ21lbnQuc3RvcCkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJTZWdtZW50ICVkICIKKyAgICAgICAgICAgICIgZXh0ZW5kcyB0byAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAgICIgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGR1cmF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAgICAgIiBpdCB3aWxsIGJlIHRydW5jYXRlZCIsIGksIEdTVF9USU1FX0FSR1MgKHNlZ21lbnQtPnN0b3BfdGltZSksCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChxdGRlbXV4LT5zZWdtZW50LnN0b3ApKTsKKyAgICAgICAgcXRkZW11eC0+c2VnbWVudC5zdG9wID0gc2VnbWVudC0+c3RvcF90aW1lOworICAgICAgfQorCisgICAgICBidWZmZXIgKz0gZW50cnlfc2l6ZTsKKyAgICB9CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZvdW5kICVkIHNlZ21lbnRzIiwgY291bnQpOworICAgIHN0cmVhbS0+bl9zZWdtZW50cyA9IGNvdW50OworICAgIGlmIChtZWRpYV9zZWdtZW50c19jb3VudCAhPSAxKQorICAgICAgYWxsb3dfcHVzaGJhc2VkX2VkdHMgPSBGQUxTRTsKKyAgfQorZG9uZToKKworICAvKiBwdXNoIGJhc2VkIGRvZXMgbm90IGhhbmRsZSBzZWdtZW50cywgc28gYWN0IGFjY29yZGluZ2x5IGhlcmUsCisgICAqIGFuZCB3YXJuIGlmIGFwcGxpY2FibGUgKi8KKyAgaWYgKCFxdGRlbXV4LT5wdWxsYmFzZWQgJiYgIWFsbG93X3B1c2hiYXNlZF9lZHRzKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAic3RyZWFtaW5nOyBkaXNjYXJkaW5nIGVkaXQgbGlzdCBzZWdtZW50cyIpOworICAgIC8qIHJlbW92ZSBhbmQgdXNlIGRlZmF1bHQgb25lIGJlbG93LCB3ZSBzdHJlYW0gbGlrZSBpdCBhbnl3YXkgKi8KKyAgICBnX2ZyZWUgKHN0cmVhbS0+c2VnbWVudHMpOworICAgIHN0cmVhbS0+c2VnbWVudHMgPSBOVUxMOworICAgIHN0cmVhbS0+bl9zZWdtZW50cyA9IDA7CisgIH0KKworICAvKiBubyBzZWdtZW50cywgY3JlYXRlIG9uZSB0byBwbGF5IHRoZSBjb21wbGV0ZSB0cmFrICovCisgIGlmIChzdHJlYW0tPm5fc2VnbWVudHMgPT0gMCkgeworICAgIEdzdENsb2NrVGltZSBzdHJlYW1fZHVyYXRpb24gPQorICAgICAgICBRVFNUUkVBTVRJTUVfVE9fR1NUVElNRSAoc3RyZWFtLCBzdHJlYW0tPmR1cmF0aW9uKTsKKworICAgIGlmIChzdHJlYW0tPnNlZ21lbnRzID09IE5VTEwpCisgICAgICBzdHJlYW0tPnNlZ21lbnRzID0gZ19uZXcgKFF0RGVtdXhTZWdtZW50LCAxKTsKKworICAgIC8qIHJlcHJlc2VudCB1bmtub3duIG91ciB3YXkgKi8KKyAgICBpZiAoc3RyZWFtX2R1cmF0aW9uID09IDApCisgICAgICBzdHJlYW1fZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgICAgc3RyZWFtLT5zZWdtZW50c1swXS50aW1lID0gMDsKKyAgICBzdHJlYW0tPnNlZ21lbnRzWzBdLnN0b3BfdGltZSA9IHN0cmVhbV9kdXJhdGlvbjsKKyAgICBzdHJlYW0tPnNlZ21lbnRzWzBdLmR1cmF0aW9uID0gc3RyZWFtX2R1cmF0aW9uOworICAgIHN0cmVhbS0+c2VnbWVudHNbMF0ubWVkaWFfc3RhcnQgPSAwOworICAgIHN0cmVhbS0+c2VnbWVudHNbMF0ubWVkaWFfc3RvcCA9IHN0cmVhbV9kdXJhdGlvbjsKKyAgICBzdHJlYW0tPnNlZ21lbnRzWzBdLnJhdGUgPSAxLjA7CisgICAgc3RyZWFtLT5zZWdtZW50c1swXS50cmFrX21lZGlhX3N0YXJ0ID0gMDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJjcmVhdGVkIGR1bW15IHNlZ21lbnQgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChzdHJlYW1fZHVyYXRpb24pKTsKKyAgICBzdHJlYW0tPm5fc2VnbWVudHMgPSAxOworICAgIHN0cmVhbS0+ZHVtbXlfc2VnbWVudCA9IFRSVUU7CisgIH0KKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInVzaW5nICVkIHNlZ21lbnRzIiwgc3RyZWFtLT5uX3NlZ21lbnRzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIFBhcnNlcyB0aGUgc3RzZCBhdG9tIG9mIGEgc3ZxMyB0cmFrIGxvb2tpbmcgZm9yCisgKiB0aGUgU01JIGFuZCBnYW1hIGF0b21zLgorICovCitzdGF0aWMgdm9pZAorcXRkZW11eF9wYXJzZV9zdnEzX3N0c2RfZGF0YSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgY29uc3QgZ3VpbnQ4ICogc3RzZF9lbnRyeV9kYXRhLCBjb25zdCBndWludDggKiogZ2FtbWEsIEdzdEJ1ZmZlciAqKiBzZXFoKQoreworICBjb25zdCBndWludDggKl9nYW1tYSA9IE5VTEw7CisgIEdzdEJ1ZmZlciAqX3NlcWggPSBOVUxMOworICBjb25zdCBndWludDggKnN0c2RfZGF0YSA9IHN0c2RfZW50cnlfZGF0YTsKKyAgZ3VpbnQzMiBsZW5ndGggPSBRVF9VSU5UMzIgKHN0c2RfZGF0YSk7CisgIGd1aW50MTYgdmVyc2lvbjsKKworICBpZiAobGVuZ3RoIDwgMzIpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJzdHNkIHRvbyBzaG9ydCIpOworICAgIGdvdG8gZW5kOworICB9CisKKyAgc3RzZF9kYXRhICs9IDE2OworICBsZW5ndGggLT0gMTY7CisgIHZlcnNpb24gPSBRVF9VSU5UMTYgKHN0c2RfZGF0YSk7CisgIGlmICh2ZXJzaW9uID09IDMpIHsKKyAgICBpZiAobGVuZ3RoID49IDcwKSB7CisgICAgICBsZW5ndGggLT0gNzA7CisgICAgICBzdHNkX2RhdGEgKz0gNzA7CisgICAgICB3aGlsZSAobGVuZ3RoID4gOCkgeworICAgICAgICBndWludDMyIGZvdXJjYywgc2l6ZTsKKyAgICAgICAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICAgICAgICBzaXplID0gUVRfVUlOVDMyIChzdHNkX2RhdGEpOworICAgICAgICBmb3VyY2MgPSBRVF9GT1VSQ0MgKHN0c2RfZGF0YSArIDQpOworICAgICAgICBkYXRhID0gc3RzZF9kYXRhICsgODsKKworICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAiQXRvbSBvZiBzaXplIDAgZm91bmQsIGFib3J0aW5nICIKKyAgICAgICAgICAgICAgInN2cTMgYXRvbSBwYXJzaW5nIik7CisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGZvdXJjYykgeworICAgICAgICAgIGNhc2UgRk9VUkNDX2dhbWE6eworICAgICAgICAgICAgaWYgKHNpemUgPT0gMTIpIHsKKyAgICAgICAgICAgICAgX2dhbW1hID0gZGF0YTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIlVuZXhwZWN0ZWQgc2l6ZSAlIiBHX0dVSU5UMzJfRk9STUFUCisgICAgICAgICAgICAgICAgICAiIGZvciBnYW1hIGF0b20sIGV4cGVjdGVkIDEyIiwgc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBGT1VSQ0NfU01JXzp7CisgICAgICAgICAgICBpZiAoc2l6ZSA+IDE2ICYmIFFUX0ZPVVJDQyAoZGF0YSkgPT0gRk9VUkNDX1NFUUgpIHsKKyAgICAgICAgICAgICAgZ3VpbnQzMiBzZXFoX3NpemU7CisgICAgICAgICAgICAgIGlmIChfc2VxaCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAiVW5leHBlY3RlZCBzZWNvbmQgU0VRSCBTTUkgYXRvbSAiCisgICAgICAgICAgICAgICAgICAgICIgZm91bmQsIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VxaF9zaXplID0gUVRfVUlOVDMyIChkYXRhICsgNCk7CisgICAgICAgICAgICAgICAgaWYgKHNlcWhfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgIF9zZXFoID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzZXFoX3NpemUpOworICAgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChfc2VxaCwgMCwgZGF0YSArIDgsIHNlcWhfc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDp7CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJVbmhhbmRsZWQgYXRvbSAlIiBHU1RfRk9VUkNDX0ZPUk1BVAorICAgICAgICAgICAgICAgICIgaW4gU1ZRMyBlbnRyeSBpbiBzdHNkIGF0b20iLCBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYykpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaXplIDw9IGxlbmd0aCkgeworICAgICAgICAgIGxlbmd0aCAtPSBzaXplOworICAgICAgICAgIHN0c2RfZGF0YSArPSBzaXplOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIlNWUTMgZW50cnkgdG9vIHNob3J0IGluIHN0c2QgYXRvbSIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJVbmV4cGVjdGVkIHZlcnNpb24gZm9yIFNWUTMgZW50cnkgJSIKKyAgICAgICAgR19HVUlOVDE2X0ZPUk1BVCwgdmVyc2lvbik7CisgICAgZ290byBlbmQ7CisgIH0KKworZW5kOgorICBpZiAoZ2FtbWEpIHsKKyAgICAqZ2FtbWEgPSBfZ2FtbWE7CisgIH0KKyAgaWYgKHNlcWgpIHsKKyAgICAqc2VxaCA9IF9zZXFoOworICB9IGVsc2UgaWYgKF9zZXFoKSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoX3NlcWgpOworICB9Cit9CisKK3N0YXRpYyBnY2hhciAqCitxdGRlbXV4X2dldF9ydHNwX3VyaV9mcm9tX2huZGwgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHTm9kZSAqIG1pbmYpCit7CisgIEdOb2RlICpkaW5mOworICBHc3RCeXRlUmVhZGVyIGRyZWY7CisgIGdjaGFyICp1cmkgPSBOVUxMOworCisgIC8qCisgICAqIEdldCAnZGluZicsIHRvIGdldCBpdHMgY2hpbGQgJ2RyZWYnLCB0aGF0IG1pZ2h0IGNvbnRhaW4gYSAnaG5kbCcKKyAgICogYXRvbSB0aGF0IG1pZ2h0IGNvbnRhaW4gYSAnZGF0YScgYXRvbSB3aXRoIHRoZSBydHNwIHVyaS4KKyAgICogVGhpcyBjYXNlIHdhcyByZXBvcnRlZCBpbiBidWcgIzU5NzQ5Nywgc29tZSBpbmZvIGFib3V0CisgICAqIHRoZSBobmRsIGF0b20gY2FuIGJlIGZvdW5kIGluIFROMTE5NQorICAgKi8KKyAgZGluZiA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAobWluZiwgRk9VUkNDX2RpbmYpOworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiVHJ5aW5nIHRvIG9idGFpbiBydHNwIFVSSSBmb3Igc3RyZWFtIHRyYWsiKTsKKworICBpZiAoZGluZikgeworICAgIGd1aW50MzIgZHJlZl9udW1fZW50cmllcyA9IDA7CisgICAgaWYgKHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZV9mdWxsIChkaW5mLCBGT1VSQ0NfZHJlZiwgJmRyZWYpICYmCisgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9za2lwICgmZHJlZiwgNCkgJiYKKyAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZkcmVmLCAmZHJlZl9udW1fZW50cmllcykpIHsKKyAgICAgIGdpbnQgaTsKKworICAgICAgLyogc2VhcmNoIGRyZWYgZW50cmllcyBmb3IgaG5kbCBhdG9tICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgZHJlZl9udW1fZW50cmllczsgaSsrKSB7CisgICAgICAgIGd1aW50MzIgc2l6ZSA9IDAsIHR5cGU7CisgICAgICAgIGd1aW50OCBzdHJpbmdfbGVuID0gMDsKKyAgICAgICAgaWYgKGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmZHJlZiwgJnNpemUpICYmCisgICAgICAgICAgICBxdF9hdG9tX3BhcnNlcl9nZXRfZm91cmNjICgmZHJlZiwgJnR5cGUpKSB7CisgICAgICAgICAgaWYgKHR5cGUgPT0gRk9VUkNDX2huZGwpIHsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJGb3VuZCBobmRsIGF0b20iKTsKKworICAgICAgICAgICAgLyogc2tpcCBkYXRhIHJlZmVyZW5jZSBoYW5kbGUgYnl0ZXMgYW5kIHRoZQorICAgICAgICAgICAgICogZm9sbG93aW5nIHBhc2NhbCBzdHJpbmcgYW5kIHNvbWUgZXh0cmEgNAorICAgICAgICAgICAgICogYnl0ZXMgSSBoYXZlIG5vIGlkZWEgd2hhdCBhcmUgKi8KKyAgICAgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZkcmVmLCA0KSB8fAorICAgICAgICAgICAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ4ICgmZHJlZiwgJnN0cmluZ19sZW4pIHx8CisgICAgICAgICAgICAgICAgIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmZHJlZiwgc3RyaW5nX2xlbiArIDQpKSB7CisgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIkZhaWxlZCB0byBwYXJzZSBobmRsIGF0b20iKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciB0aGUgYXRvbXMgdG8gZmluZCB0aGUgZGF0YSBhdG9tICovCisgICAgICAgICAgICB3aGlsZSAoZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKCZkcmVmKSA+PSA4KSB7CisgICAgICAgICAgICAgIGd1aW50MzIgYXRvbV9zaXplOworICAgICAgICAgICAgICBndWludDMyIGF0b21fdHlwZTsKKworICAgICAgICAgICAgICBpZiAoZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZkcmVmLCAmYXRvbV9zaXplKSAmJgorICAgICAgICAgICAgICAgICAgcXRfYXRvbV9wYXJzZXJfZ2V0X2ZvdXJjYyAoJmRyZWYsICZhdG9tX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGF0b21fdHlwZSA9PSBGT1VSQ0NfZGF0YSkgeworICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQ4ICp1cmlfYXV4ID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgLyogZm91bmQgdGhlIGRhdGEgYXRvbSB0aGF0IG1pZ2h0IGNvbnRhaW4gdGhlIHJ0c3AgdXJpICovCisgICAgICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiRm91bmQgZGF0YSBhdG9tIGluc2lkZSAiCisgICAgICAgICAgICAgICAgICAgICAgImhuZGwgYXRvbSwgaW50ZXJwcmV0aW5nIGl0IGFzIGFuIFVSSSIpOworICAgICAgICAgICAgICAgICAgaWYgKGdzdF9ieXRlX3JlYWRlcl9wZWVrX2RhdGEgKCZkcmVmLCBhdG9tX3NpemUgLSA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXJpX2F1eCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdfc3Ryc3RyX2xlbiAoKGdjaGFyICopIHVyaV9hdXgsIDcsICJydHNwOi8vIikgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICB1cmkgPSBnX3N0cm5kdXAgKChnY2hhciAqKSB1cmlfYXV4LCBhdG9tX3NpemUgLSA4KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIkRhdGEgYXRvbSBpbiBobmRsIGF0b20gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlkbid0IGNvbnRhaW4gYSBydHNwIGFkZHJlc3MiKTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIkZhaWxlZCB0byBnZXQgdGhlIGRhdGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgImF0b20gY29udGVudHMiKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBza2lwcGluZyB0byB0aGUgbmV4dCBlbnRyeSAqLworICAgICAgICAgICAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZkcmVmLCBhdG9tX3NpemUgLSA4KSkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIkZhaWxlZCB0byBwYXJzZSBobmRsIGNoaWxkICIKKyAgICAgICAgICAgICAgICAgICAgImF0b20gaGVhZGVyIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICAvKiBza2lwIHRvIHRoZSBuZXh0IGVudHJ5ICovCisgICAgICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJmRyZWYsIHNpemUgLSA4KSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIkVycm9yIHBhcnNpbmcgZHJlZiBhdG9tIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJGaW5pc2hlZCBwYXJzaW5nIGRyZWYgYXRvbSIpOworICAgIH0KKyAgfQorICByZXR1cm4gdXJpOworfQorCisjZGVmaW5lIEFNUl9OQl9BTExfTU9ERVMgICAgICAgIDB4ODFmZgorI2RlZmluZSBBTVJfV0JfQUxMX01PREVTICAgICAgICAweDgzZmYKK3N0YXRpYyBndWludAorcXRkZW11eF9wYXJzZV9hbXJfYml0cmF0ZSAoR3N0QnVmZmVyICogYnVmLCBnYm9vbGVhbiB3YikKK3sKKyAgLyogVGhlICdkYW1yJyBhdG9tIGlzIG9mIHRoZSBmb3JtOgorICAgKgorICAgKiB8IHZlbmRvciB8IGRlY29kZXJfdmVyIHwgbW9kZV9zZXQgfCBtb2RlX2NoYW5nZV9wZXJpb2QgfCBmcmFtZXMvc2FtcGxlIHwKKyAgICogICAgMzIgYiAgICAgICA4IGIgICAgICAgICAgMTYgYiAgICAgICAgICAgOCBiICAgICAgICAgICAgICAgICA4IGIKKyAgICoKKyAgICogVGhlIGhpZ2hlc3Qgc2V0IGJpdCBvZiB0aGUgZmlyc3QgNyAoQU1SLU5CKSBvciA4IChBTVItV0IpIGJpdHMgb2YgbW9kZV9zZXQKKyAgICogcmVwcmVzZW50cyB0aGUgaGlnaGVzdCBtb2RlIHVzZWQgaW4gdGhlIHN0cmVhbSAoYW5kIHRodXMgdGhlIG1heGltdW0KKyAgICogYml0cmF0ZSksIHdpdGggYSBjb3VwbGUgb2Ygc3BlY2lhbCBjYXNlcyBhcyBzZWVuIGJlbG93LgorICAgKi8KKworICAvKiBNYXAgb2YgZnJhbWUgdHlwZSBJRCAtPiBiaXRyYXRlICovCisgIHN0YXRpYyBjb25zdCBndWludCBuYl9iaXRyYXRlc1tdID0geworICAgIDQ3NTAsIDUxNTAsIDU5MDAsIDY3MDAsIDc0MDAsIDc5NTAsIDEwMjAwLCAxMjIwMAorICB9OworICBzdGF0aWMgY29uc3QgZ3VpbnQgd2JfYml0cmF0ZXNbXSA9IHsKKyAgICA2NjAwLCA4ODUwLCAxMjY1MCwgMTQyNTAsIDE1ODUwLCAxODI1MCwgMTk4NTAsIDIzMDUwLCAyMzg1MAorICB9OworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3NpemUgbWF4X21vZGU7CisgIGd1aW50MTYgbW9kZV9zZXQ7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICBpZiAobWFwLnNpemUgIT0gMHgxMSkgeworICAgIEdTVF9ERUJVRyAoIkF0b20gc2hvdWxkIGhhdmUgc2l6ZSAweDExLCBub3QgJSIgR19HU0laRV9GT1JNQVQsIG1hcC5zaXplKTsKKyAgICBnb3RvIGJhZF9kYXRhOworICB9CisKKyAgaWYgKFFUX0ZPVVJDQyAobWFwLmRhdGEgKyA0KSAhPSBGT1VSQ0NfZGFtcikgeworICAgIEdTVF9ERUJVRyAoIlVua25vd24gYXRvbSBpbiAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChRVF9VSU5UMzIgKG1hcC5kYXRhICsgNCkpKTsKKyAgICBnb3RvIGJhZF9kYXRhOworICB9CisKKyAgbW9kZV9zZXQgPSBRVF9VSU5UMTYgKG1hcC5kYXRhICsgMTMpOworCisgIGlmIChtb2RlX3NldCA9PSAod2IgPyBBTVJfV0JfQUxMX01PREVTIDogQU1SX05CX0FMTF9NT0RFUykpCisgICAgbWF4X21vZGUgPSA3ICsgKHdiID8gMSA6IDApOworICBlbHNlCisgICAgLyogQU1SLU5CIG1vZGVzIGZvIGZyb20gMC03LCBhbmQgQU1SLVdCIG1vZGVzIGdvIGZyb20gMC04ICovCisgICAgbWF4X21vZGUgPSBnX2JpdF9udGhfbXNmICgoZ3Vsb25nKSBtb2RlX3NldCAmICh3YiA/IDB4MWZmIDogMHhmZiksIC0xKTsKKworICBpZiAobWF4X21vZGUgPT0gLTEpIHsKKyAgICBHU1RfREVCVUcgKCJObyBtb2RlIGluZGljYXRpb24gd2FzIGZvdW5kIChtb2RlIHNldCkgPSAleCIsCisgICAgICAgIChndWludCkgbW9kZV9zZXQpOworICAgIGdvdG8gYmFkX2RhdGE7CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICByZXR1cm4gd2IgPyB3Yl9iaXRyYXRlc1ttYXhfbW9kZV0gOiBuYl9iaXRyYXRlc1ttYXhfbW9kZV07CisKK2JhZF9kYXRhOgorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3BhcnNlX3RyYW5zZm9ybWF0aW9uX21hdHJpeCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgR3N0Qnl0ZVJlYWRlciAqIHJlYWRlciwgZ3VpbnQzMiAqIG1hdHJpeCwgY29uc3QgZ2NoYXIgKiBhdG9tKQoreworICAvKgorICAgKiA5IHZhbHVlcyBvZiAzMiBiaXRzIChmaXhlZCBwb2ludCAxNi4xNiwgZXhjZXB0IDIgNSBhbmQgOCB0aGF0IGFyZSAyLjMwKQorICAgKiBbMCAxIDJdCisgICAqIFszIDQgNV0KKyAgICogWzYgNyA4XQorICAgKi8KKworICBpZiAoZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKHJlYWRlcikgPCAzNikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbWF0cml4WzBdID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkIChyZWFkZXIpOworICBtYXRyaXhbMV0gPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKHJlYWRlcik7CisgIG1hdHJpeFsyXSA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAocmVhZGVyKTsKKyAgbWF0cml4WzNdID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkIChyZWFkZXIpOworICBtYXRyaXhbNF0gPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKHJlYWRlcik7CisgIG1hdHJpeFs1XSA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAocmVhZGVyKTsKKyAgbWF0cml4WzZdID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkIChyZWFkZXIpOworICBtYXRyaXhbN10gPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQgKHJlYWRlcik7CisgIG1hdHJpeFs4XSA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlX3VuY2hlY2tlZCAocmVhZGVyKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiVHJhbnNmb3JtYXRpb24gbWF0cml4IGZyb20gYXRvbSAlcyIsIGF0b20pOworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiJXUuJXUgJXUuJXUgJXUuJXUiLCBtYXRyaXhbMF0gPj4gMTYsCisgICAgICBtYXRyaXhbMF0gJiAweEZGRkYsIG1hdHJpeFsxXSA+PiAxNiwgbWF0cml4WzFdICYgMHhGRiwgbWF0cml4WzJdID4+IDE2LAorICAgICAgbWF0cml4WzJdICYgMHhGRik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICIldS4ldSAldS4ldSAldS4ldSIsIG1hdHJpeFszXSA+PiAxNiwKKyAgICAgIG1hdHJpeFszXSAmIDB4RkZGRiwgbWF0cml4WzRdID4+IDE2LCBtYXRyaXhbNF0gJiAweEZGLCBtYXRyaXhbNV0gPj4gMTYsCisgICAgICBtYXRyaXhbNV0gJiAweEZGKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIiV1LiV1ICV1LiV1ICV1LiV1IiwgbWF0cml4WzZdID4+IDE2LAorICAgICAgbWF0cml4WzZdICYgMHhGRkZGLCBtYXRyaXhbN10gPj4gMTYsIG1hdHJpeFs3XSAmIDB4RkYsIG1hdHJpeFs4XSA+PiAxNiwKKyAgICAgIG1hdHJpeFs4XSAmIDB4RkYpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorcXRkZW11eF9pbnNwZWN0X3RyYW5zZm9ybWF0aW9uX21hdHJpeCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwgZ3VpbnQzMiAqIG1hdHJpeCwgR3N0VGFnTGlzdCAqKiB0YWdsaXN0KQoreworCisvKiBbYSBiIGNdCisgKiBbZCBlIGZdCisgKiBbZyBoIGldCisgKgorICogVGhpcyBtYWNybyB3aWxsIG9ubHkgY29tcGFyZSB2YWx1ZSBhYmRlZ2gsIGl0IGV4cGVjdHMgY2ZpIHRvIGhhdmUgYWxyZWFkeQorICogYmVlbiBjaGVja2VkCisgKi8KKyNkZWZpbmUgUVRDSEVDS19NQVRSSVgobSxhLGIsZCxlKSAoKG0pWzBdID09IChhIDw8IDE2KSAmJiAobSlbMV0gPT0gKGIgPDwgMTYpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG0pWzNdID09IChkIDw8IDE2KSAmJiAobSlbNF0gPT0gKGUgPDwgMTYpKQorCisgIC8qIG9ubHkgaGFuZGxlIHRoZSBjYXNlcyB3aGVyZSB0aGUgbGFzdCBjb2x1bW4gaGFzIHN0YW5kYXJkIHZhbHVlcyAqLworICBpZiAobWF0cml4WzJdID09IDAgJiYgbWF0cml4WzVdID09IDAgJiYgbWF0cml4WzhdID09IDEgPDwgMzApIHsKKyAgICBjb25zdCBnY2hhciAqcm90YXRpb25fdGFnID0gTlVMTDsKKworICAgIC8qIG5vIHJvdGF0aW9uIG5lZWRlZCAqLworICAgIGlmIChRVENIRUNLX01BVFJJWCAobWF0cml4LCAxLCAwLCAwLCAxKSkgeworICAgICAgLyogTk9QICovCisgICAgfSBlbHNlIGlmIChRVENIRUNLX01BVFJJWCAobWF0cml4LCAwLCAxLCBHX01BWFVJTlQxNiwgMCkpIHsKKyAgICAgIHJvdGF0aW9uX3RhZyA9ICJyb3RhdGUtOTAiOworICAgIH0gZWxzZSBpZiAoUVRDSEVDS19NQVRSSVggKG1hdHJpeCwgR19NQVhVSU5UMTYsIDAsIDAsIEdfTUFYVUlOVDE2KSkgeworICAgICAgcm90YXRpb25fdGFnID0gInJvdGF0ZS0xODAiOworICAgIH0gZWxzZSBpZiAoUVRDSEVDS19NQVRSSVggKG1hdHJpeCwgMCwgR19NQVhVSU5UMTYsIDEsIDApKSB7CisgICAgICByb3RhdGlvbl90YWcgPSAicm90YXRlLTI3MCI7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKHF0ZGVtdXgsICJVbmhhbmRsZWQgdHJhbnNmb3JtYXRpb24gbWF0cml4IHZhbHVlcyIpOworICAgIH0KKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJUcmFuc2Zvcm1hdGlvbiBtYXRyaXggcm90YXRpb24gJXMiLAorICAgICAgICByb3RhdGlvbl90YWcpOworICAgIGlmIChyb3RhdGlvbl90YWcgIT0gTlVMTCkgeworICAgICAgaWYgKCp0YWdsaXN0ID09IE5VTEwpCisgICAgICAgICp0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgICAgIGdzdF90YWdfbGlzdF9hZGQgKCp0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgR1NUX1RBR19JTUFHRV9PUklFTlRBVElPTiwgcm90YXRpb25fdGFnLCBOVUxMKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1NUX0ZJWE1FX09CSkVDVCAocXRkZW11eCwgIlVuaGFuZGxlZCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdmFsdWVzIik7CisgIH0KK30KKworLyogUGFyc2VzIHRoZSBib3hlcyBkZWZpbmVkIGluIElTTy9JRUMgMTQ0OTYtMTIgdGhhdCBlbmFibGUgc3VwcG9ydCBmb3IKKyAqIHByb3RlY3RlZCBzdHJlYW1zIChzaW5mLCBmcm1hLCBzY2htIGFuZCBzY2hpKTsgaWYgdGhlIHByb3RlY3Rpb24gc2NoZW1lIGlzCisgKiBDb21tb24gRW5jcnlwdGlvbiAoY2VuYyksIHRoZSBmdW5jdGlvbiB3aWxsIGFsc28gcGFyc2UgdGhlIHRlbmMgYm94IChkZWZpbmVkCisgKiBpbiBJU08vSUVDIDIzMDAxLTcpLiBAY29udGFpbmVyIHBvaW50cyB0byB0aGUgbm9kZSB0aGF0IGNvbnRhaW5zIHRoZXNlIGJveGVzCisgKiAodHlwaWNhbGx5IGFuIGVuY1t2fGF8dHxzXSBzYW1wbGUgZW50cnkpOyB0aGUgZnVuY3Rpb24gd2lsbCBzZXQKKyAqIEBvcmlnaW5hbF9mbXQgdG8gdGhlIGZvdXJjYyBvZiB0aGUgb3JpZ2luYWwgdW5lbmNyeXB0ZWQgc3RyZWFtIGZvcm1hdC4KKyAqIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsOyBGQUxTRSBvdGhlcndpc2UuICovCitzdGF0aWMgZ2Jvb2xlYW4KK3F0ZGVtdXhfcGFyc2VfcHJvdGVjdGlvbl9zY2hlbWVfaW5mbyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsCisgICAgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwgR05vZGUgKiBjb250YWluZXIsIGd1aW50MzIgKiBvcmlnaW5hbF9mbXQpCit7CisgIEdOb2RlICpzaW5mOworICBHTm9kZSAqZnJtYTsKKyAgR05vZGUgKnNjaG07CisgIEdOb2RlICpzY2hpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChxdGRlbXV4ICE9IE5VTEwsIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHN0cmVhbSAhPSBOVUxMLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChjb250YWluZXIgIT0gTlVMTCwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAob3JpZ2luYWxfZm10ICE9IE5VTEwsIEZBTFNFKTsKKworICBzaW5mID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChjb250YWluZXIsIEZPVVJDQ19zaW5mKTsKKyAgaWYgKEdfVU5MSUtFTFkgKCFzaW5mKSkgeworICAgIGlmIChzdHJlYW0tPnByb3RlY3Rpb25fc2NoZW1lX3R5cGUgPT0gRk9VUkNDX2NlbmMpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJzaW5mIGJveCBkb2VzIG5vdCBjb250YWluIHNjaGkgYm94LCB3aGljaCBpcyAiCisgICAgICAgICAgIm1hbmRhdG9yeSBmb3IgQ29tbW9uIEVuY3J5cHRpb24iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBmcm1hID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChzaW5mLCBGT1VSQ0NfZnJtYSk7CisgIGlmIChHX1VOTElLRUxZICghZnJtYSkpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChxdGRlbXV4LCAic2luZiBib3ggZG9lcyBub3QgY29udGFpbiBtYW5kYXRvcnkgZnJtYSBib3giKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAqb3JpZ2luYWxfZm10ID0gUVRfRk9VUkNDICgoY29uc3QgZ3VpbnQ4ICopIGZybWEtPmRhdGEgKyA4KTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIm9yaWdpbmFsIHN0cmVhbSBmb3JtYXQ6ICclIiBHU1RfRk9VUkNDX0ZPUk1BVCAiJyIsCisgICAgICBHU1RfRk9VUkNDX0FSR1MgKCpvcmlnaW5hbF9mbXQpKTsKKworICBzY2htID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChzaW5mLCBGT1VSQ0Nfc2NobSk7CisgIGlmICghc2NobSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzaW5mIGJveCBkb2VzIG5vdCBjb250YWluIHNjaG0gYm94Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfdHlwZSA9IFFUX0ZPVVJDQyAoKGNvbnN0IGd1aW50OCAqKSBzY2htLT5kYXRhICsgMTIpOworICBzdHJlYW0tPnByb3RlY3Rpb25fc2NoZW1lX3ZlcnNpb24gPQorICAgICAgUVRfVUlOVDMyICgoY29uc3QgZ3VpbnQ4ICopIHNjaG0tPmRhdGEgKyAxNik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICJwcm90ZWN0aW9uX3NjaGVtZV90eXBlOiAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiLCAiCisgICAgICAicHJvdGVjdGlvbl9zY2hlbWVfdmVyc2lvbjogJSMwMTB4IiwKKyAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV90eXBlKSwKKyAgICAgIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfdmVyc2lvbik7CisKKyAgc2NoaSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAoc2luZiwgRk9VUkNDX3NjaGkpOworICBpZiAoIXNjaGkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic2luZiBib3ggZG9lcyBub3QgY29udGFpbiBzY2hpIGJveCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoc3RyZWFtLT5wcm90ZWN0aW9uX3NjaGVtZV90eXBlID09IEZPVVJDQ19jZW5jKSB7CisgICAgUXREZW11eENlbmNTYW1wbGVTZXRJbmZvICppbmZvOworICAgIEdOb2RlICp0ZW5jOworICAgIGNvbnN0IGd1aW50OCAqdGVuY19kYXRhOworICAgIGd1aW50MzIgaXNFbmNyeXB0ZWQ7CisgICAgZ3VpbnQ4IGl2X3NpemU7CisgICAgY29uc3QgZ3VpbnQ4ICpkZWZhdWx0X2tpZDsKKyAgICBHc3RCdWZmZXIgKmtpZF9idWY7CisKKyAgICBpZiAoR19VTkxJS0VMWSAoIXN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfaW5mbykpCisgICAgICBzdHJlYW0tPnByb3RlY3Rpb25fc2NoZW1lX2luZm8gPQorICAgICAgICAgIGdfbWFsbG9jMCAoc2l6ZW9mIChRdERlbXV4Q2VuY1NhbXBsZVNldEluZm8pKTsKKworICAgIGluZm8gPSAoUXREZW11eENlbmNTYW1wbGVTZXRJbmZvICopIHN0cmVhbS0+cHJvdGVjdGlvbl9zY2hlbWVfaW5mbzsKKworICAgIHRlbmMgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHNjaGksIEZPVVJDQ190ZW5jKTsKKyAgICBpZiAoIXRlbmMpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJzY2hpIGJveCBkb2VzIG5vdCBjb250YWluIHRlbmMgYm94LCAiCisgICAgICAgICAgIndoaWNoIGlzIG1hbmRhdG9yeSBmb3IgQ29tbW9uIEVuY3J5cHRpb24iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgdGVuY19kYXRhID0gKGNvbnN0IGd1aW50OCAqKSB0ZW5jLT5kYXRhICsgMTI7CisgICAgaXNFbmNyeXB0ZWQgPSBRVF9VSU5UMjQgKHRlbmNfZGF0YSk7CisgICAgaXZfc2l6ZSA9IFFUX1VJTlQ4ICh0ZW5jX2RhdGEgKyAzKTsKKyAgICBkZWZhdWx0X2tpZCA9ICh0ZW5jX2RhdGEgKyA0KTsKKyAgICBraWRfYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDE2LCBOVUxMKTsKKyAgICBnc3RfYnVmZmVyX2ZpbGwgKGtpZF9idWYsIDAsIGRlZmF1bHRfa2lkLCAxNik7CisgICAgaWYgKGluZm8tPmRlZmF1bHRfcHJvcGVydGllcykKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoaW5mby0+ZGVmYXVsdF9wcm9wZXJ0aWVzKTsKKyAgICBpbmZvLT5kZWZhdWx0X3Byb3BlcnRpZXMgPQorICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtY2VuYyIsCisgICAgICAgICJpdl9zaXplIiwgR19UWVBFX1VJTlQsIGl2X3NpemUsCisgICAgICAgICJlbmNyeXB0ZWQiLCBHX1RZUEVfQk9PTEVBTiwgKGlzRW5jcnlwdGVkID09IDEpLAorICAgICAgICAia2lkIiwgR1NUX1RZUEVfQlVGRkVSLCBraWRfYnVmLCBOVUxMKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZGVmYXVsdCBzYW1wbGUgcHJvcGVydGllczogIgorICAgICAgICAiaXNfZW5jcnlwdGVkPSV1LCBpdl9zaXplPSV1IiwgaXNFbmNyeXB0ZWQsIGl2X3NpemUpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGtpZF9idWYpOworICB9CisgIHJldHVybiBUUlVFOworfQorCisvKiBwYXJzZSB0aGUgdHJha3MuCisgKiBXaXRoIGVhY2ggdHJhY2sgd2UgYXNzb2NpYXRlIGEgbmV3IFF0RGVtdXhTdHJlYW0gdGhhdCBjb250YWlucyBhbGwgdGhlIGluZm8KKyAqIGFib3V0IHRoZSB0cmFrLgorICogdHJha3MgdGhhdCBkbyBub3QgZGVjb2RlIHRvIHNvbWV0aGluZyAobGlrZSBzdHJtIHRyYWtzKSB3aWxsIG5vdCBoYXZlIGEgcGFkLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK3F0ZGVtdXhfcGFyc2VfdHJhayAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdOb2RlICogdHJhaykKK3sKKyAgR3N0Qnl0ZVJlYWRlciB0a2hkOworICBpbnQgb2Zmc2V0OworICBHTm9kZSAqbWRpYTsKKyAgR05vZGUgKm1kaGQ7CisgIEdOb2RlICpoZGxyOworICBHTm9kZSAqbWluZjsKKyAgR05vZGUgKnN0Ymw7CisgIEdOb2RlICpzdHNkOworICBHTm9kZSAqbXA0YTsKKyAgR05vZGUgKm1wNHY7CisgIEdOb2RlICplc2RzOworICBHTm9kZSAqdHJlZjsKKyAgR05vZGUgKnVkdGE7CisgIEdOb2RlICpzdm1pOworCisgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbSA9IE5VTEw7CisgIGdib29sZWFuIG5ld19zdHJlYW0gPSBGQUxTRTsKKyAgY29uc3QgZ3VpbnQ4ICpzdHNkX2RhdGE7CisgIGNvbnN0IGd1aW50OCAqc3RzZF9lbnRyeV9kYXRhOworICBndWludCByZW1haW5pbmdfc3RzZF9sZW47CisgIGd1aW50IHN0c2RfZW50cnlfY291bnQ7CisgIGd1aW50IHN0c2RfaW5kZXg7CisgIGd1aW50MTYgbGFuZ19jb2RlOyAgICAgICAgICAgIC8qIHF1aWNrdGltZSBsYW5nIGNvZGUgb3IgcGFja2VkIGlzbyBjb2RlICovCisgIGd1aW50MzIgdmVyc2lvbjsKKyAgZ3VpbnQzMiB0a2hkX2ZsYWdzID0gMDsKKyAgZ3VpbnQ4IHRraGRfdmVyc2lvbiA9IDA7CisgIGd1aW50MzIgdyA9IDAsIGggPSAwOworICBndWludCB2YWx1ZV9zaXplLCBzdHNkX2xlbiwgbGVuOworICBndWludDMyIHRyYWNrX2lkOworICBndWludDMyIGR1bW15OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJwYXJzZV90cmFrIik7CisKKyAgaWYgKCFxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGVfZnVsbCAodHJhaywgRk9VUkNDX3RraGQsICZ0a2hkKQorICAgICAgfHwgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZ0a2hkLCAmdGtoZF92ZXJzaW9uKQorICAgICAgfHwgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDI0X2JlICgmdGtoZCwgJnRraGRfZmxhZ3MpKQorICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgIC8qIHBpY2sgYmV0d2VlbiA2NCBvciAzMiBiaXRzICovCisgIHZhbHVlX3NpemUgPSB0a2hkX3ZlcnNpb24gPT0gMSA/IDggOiA0OworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmdGtoZCwgdmFsdWVfc2l6ZSAqIDIpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZ0a2hkLCAmdHJhY2tfaWQpKQorICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgIGlmICghcXRkZW11eC0+Z290X21vb3YpIHsKKyAgICBpZiAocXRkZW11eF9maW5kX3N0cmVhbSAocXRkZW11eCwgdHJhY2tfaWQpKQorICAgICAgZ290byBleGlzdGluZ19zdHJlYW07CisgICAgc3RyZWFtID0gX2NyZWF0ZV9zdHJlYW0gKCk7CisgICAgc3RyZWFtLT50cmFja19pZCA9IHRyYWNrX2lkOworICAgIG5ld19zdHJlYW0gPSBUUlVFOworICB9IGVsc2UgeworICAgIHN0cmVhbSA9IHF0ZGVtdXhfZmluZF9zdHJlYW0gKHF0ZGVtdXgsIHRyYWNrX2lkKTsKKyAgICBpZiAoIXN0cmVhbSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAiU3RyZWFtIG5vdCBmb3VuZCwgZ29pbmcgdG8gaWdub3JlIGl0Iik7CisgICAgICBnb3RvIHNraXBfdHJhY2s7CisgICAgfQorCisgICAgLyogcmVzZXQgcmV1c2VkIHN0cmVhbSAqLworICAgIGdzdF9xdGRlbXV4X3N0cmVhbV9yZXNldCAocXRkZW11eCwgc3RyZWFtKTsKKyAgfQorICAvKiBuZWVkIGRlZmF1bHRzIGZvciBmcmFnbWVudHMgKi8KKyAgcXRkZW11eF9wYXJzZV90cmV4IChxdGRlbXV4LCBzdHJlYW0sICZkdW1teSwgJmR1bW15LCAmZHVtbXkpOworCisgIGlmICgodGtoZF9mbGFncyAmIDEpID09IDApCisgICAgc3RyZWFtLT5kaXNhYmxlZCA9IFRSVUU7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJ0cmFja1t0a2hkXSB2ZXJzaW9uL2ZsYWdzL2lkOiAweCUwMngvJTA2eC8ldSIsCisgICAgICB0a2hkX3ZlcnNpb24sIHRraGRfZmxhZ3MsIHN0cmVhbS0+dHJhY2tfaWQpOworCisgIGlmICghKG1kaWEgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHRyYWssIEZPVVJDQ19tZGlhKSkpCisgICAgZ290byBjb3JydXB0X2ZpbGU7CisKKyAgaWYgKCEobWRoZCA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAobWRpYSwgRk9VUkNDX21kaGQpKSkgeworICAgIC8qIGJlIG5pY2UgZm9yIHNvbWUgY3Jvb2tlZCBtanAyIGZpbGVzIHRoYXQgdXNlIG1oZHIgZm9yIG1kaGQgKi8KKyAgICBpZiAocXRkZW11eC0+bWFqb3JfYnJhbmQgIT0gRk9VUkNDX21qcDIgfHwKKyAgICAgICAgIShtZGhkID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChtZGlhLCBGT1VSQ0NfbWhkcikpKQorICAgICAgZ290byBjb3JydXB0X2ZpbGU7CisgIH0KKworICBsZW4gPSBRVF9VSU5UMzIgKChndWludDggKikgbWRoZC0+ZGF0YSk7CisgIHZlcnNpb24gPSBRVF9VSU5UMzIgKChndWludDggKikgbWRoZC0+ZGF0YSArIDgpOworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInRyYWNrIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCB2ZXJzaW9uKTsKKyAgaWYgKHZlcnNpb24gPT0gMHgwMTAwMDAwMCkgeworICAgIGlmIChsZW4gPCAzOCkKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworICAgIHN0cmVhbS0+dGltZXNjYWxlID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIG1kaGQtPmRhdGEgKyAyOCk7CisgICAgc3RyZWFtLT5kdXJhdGlvbiA9IFFUX1VJTlQ2NCAoKGd1aW50OCAqKSBtZGhkLT5kYXRhICsgMzIpOworICAgIGxhbmdfY29kZSA9IFFUX1VJTlQxNiAoKGd1aW50OCAqKSBtZGhkLT5kYXRhICsgMzYpOworICB9IGVsc2UgeworICAgIGlmIChsZW4gPCAzMCkKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworICAgIHN0cmVhbS0+dGltZXNjYWxlID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIG1kaGQtPmRhdGEgKyAyMCk7CisgICAgc3RyZWFtLT5kdXJhdGlvbiA9IFFUX1VJTlQzMiAoKGd1aW50OCAqKSBtZGhkLT5kYXRhICsgMjQpOworICAgIGxhbmdfY29kZSA9IFFUX1VJTlQxNiAoKGd1aW50OCAqKSBtZGhkLT5kYXRhICsgMjgpOworICB9CisKKyAgaWYgKGxhbmdfY29kZSA8IDB4NDAwKSB7CisgICAgcXRkZW11eF9sYW5nX21hcF9xdF9jb2RlX3RvX2lzbyAoc3RyZWFtLT5sYW5nX2lkLCBsYW5nX2NvZGUpOworICB9IGVsc2UgaWYgKGxhbmdfY29kZSA9PSAweDdmZmYpIHsKKyAgICBzdHJlYW0tPmxhbmdfaWRbMF0gPSAwOyAgICAgLyogdW5zcGVjaWZpZWQgKi8KKyAgfSBlbHNlIHsKKyAgICBzdHJlYW0tPmxhbmdfaWRbMF0gPSAweDYwICsgKChsYW5nX2NvZGUgPj4gMTApICYgMHgxRik7CisgICAgc3RyZWFtLT5sYW5nX2lkWzFdID0gMHg2MCArICgobGFuZ19jb2RlID4+IDUpICYgMHgxRik7CisgICAgc3RyZWFtLT5sYW5nX2lkWzJdID0gMHg2MCArIChsYW5nX2NvZGUgJiAweDFGKTsKKyAgICBzdHJlYW0tPmxhbmdfaWRbM10gPSAwOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJ0cmFjayB0aW1lc2NhbGU6ICUiIEdfR1VJTlQzMl9GT1JNQVQsCisgICAgICBzdHJlYW0tPnRpbWVzY2FsZSk7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAidHJhY2sgZHVyYXRpb246ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBzdHJlYW0tPmR1cmF0aW9uKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJ0cmFjayBsYW5ndWFnZSBjb2RlL2lkOiAweCUwNHgvJXMiLAorICAgICAgbGFuZ19jb2RlLCBzdHJlYW0tPmxhbmdfaWQpOworCisgIGlmIChHX1VOTElLRUxZIChzdHJlYW0tPnRpbWVzY2FsZSA9PSAwIHx8IHF0ZGVtdXgtPnRpbWVzY2FsZSA9PSAwKSkKKyAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICBpZiAoKHRyZWYgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHRyYWssIEZPVVJDQ190cmVmKSkpIHsKKyAgICAvKiBjaGFwdGVycyB0cmFjayByZWZlcmVuY2UgKi8KKyAgICBHTm9kZSAqY2hhcCA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAodHJlZiwgRk9VUkNDX2NoYXApOworICAgIGlmIChjaGFwKSB7CisgICAgICBnc2l6ZSBsZW5ndGggPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGNoYXAtPmRhdGEpOworICAgICAgaWYgKHF0ZGVtdXgtPmNoYXB0ZXJzX3RyYWNrX2lkKQorICAgICAgICBHU1RfRklYTUVfT0JKRUNUIChxdGRlbXV4LCAiTXVsdGlwbGUgQ0hBUCB0cmFja3MiKTsKKworICAgICAgaWYgKGxlbmd0aCA+PSAxMikgeworICAgICAgICBxdGRlbXV4LT5jaGFwdGVyc190cmFja19pZCA9CisgICAgICAgICAgICBHU1RfUkVBRF9VSU5UMzJfQkUgKChnaW50OCAqKSBjaGFwLT5kYXRhICsgOCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogZnJhZ21lbnRlZCBmaWxlcyBtYXkgaGF2ZSBib2d1cyBkdXJhdGlvbiBpbiBtb292ICovCisgIGlmICghcXRkZW11eC0+ZnJhZ21lbnRlZCAmJgorICAgICAgcXRkZW11eC0+ZHVyYXRpb24gIT0gR19NQVhJTlQ2NCAmJiBzdHJlYW0tPmR1cmF0aW9uICE9IEdfTUFYSU5UMzIpIHsKKyAgICBndWludDY0IHRkdXIxLCB0ZHVyMjsKKworICAgIC8qIGRvbid0IG92ZXJmbG93ICovCisgICAgdGR1cjEgPSBzdHJlYW0tPnRpbWVzY2FsZSAqIChndWludDY0KSBxdGRlbXV4LT5kdXJhdGlvbjsKKyAgICB0ZHVyMiA9IHF0ZGVtdXgtPnRpbWVzY2FsZSAqIChndWludDY0KSBzdHJlYW0tPmR1cmF0aW9uOworCisgICAgLyogSEFDSzoKKyAgICAgKiBzb21lIG9mIHRob3NlIHRyYWlsZXJzLCBub3dhZGF5cywgaGF2ZSBwcm9sb2d1ZSBpbWFnZXMgdGhhdCBhcmUKKyAgICAgKiB0aGVtc2VsdmVzIHZpZGVvIHRyYWNrcyBhcyB3ZWxsLiBJIGhhdmVuJ3QgcmVhbGx5IGZvdW5kIGEgd2F5IHRvCisgICAgICogaWRlbnRpZnkgdGhvc2UgeWV0LCBleGNlcHQgZm9yIGp1c3QgbG9va2luZyBhdCB0aGVpciBkdXJhdGlvbi4gKi8KKyAgICBpZiAodGR1cjEgIT0gMCAmJiAodGR1cjIgKiAxMCAvIHRkdXIxKSA8IDIpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAiVHJhY2sgc2hvcnRlciB0aGFuIDIwJSUgKCUiIEdfR1VJTlQ2NF9GT1JNQVQgIi8lIiBHX0dVSU5UMzJfRk9STUFUCisgICAgICAgICAgIiB2cy4gJSIgR19HVUlOVDY0X0ZPUk1BVCAiLyUiIEdfR1VJTlQzMl9GT1JNQVQgIikgb2YgdGhlIHN0cmVhbSAiCisgICAgICAgICAgImZvdW5kLCBhc3N1bWluZyBwcmV2aWV3IGltYWdlIG9yIHNvbWV0aGluZzsgc2tpcHBpbmcgdHJhY2siLAorICAgICAgICAgIHN0cmVhbS0+ZHVyYXRpb24sIHN0cmVhbS0+dGltZXNjYWxlLCBxdGRlbXV4LT5kdXJhdGlvbiwKKyAgICAgICAgICBxdGRlbXV4LT50aW1lc2NhbGUpOworICAgICAgaWYgKG5ld19zdHJlYW0pCisgICAgICAgIGdzdF9xdGRlbXV4X3N0cmVhbV9mcmVlIChxdGRlbXV4LCBzdHJlYW0pOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgaWYgKCEoaGRsciA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAobWRpYSwgRk9VUkNDX2hkbHIpKSkKKyAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInRyYWNrIHR5cGU6ICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgR1NUX0ZPVVJDQ19BUkdTIChRVF9GT1VSQ0MgKChndWludDggKikgaGRsci0+ZGF0YSArIDEyKSkpOworCisgIGxlbiA9IFFUX1VJTlQzMiAoKGd1aW50OCAqKSBoZGxyLT5kYXRhKTsKKyAgaWYgKGxlbiA+PSAyMCkKKyAgICBzdHJlYW0tPnN1YnR5cGUgPSBRVF9GT1VSQ0MgKChndWludDggKikgaGRsci0+ZGF0YSArIDE2KTsKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJ0cmFjayBzdWJ0eXBlOiAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoc3RyZWFtLT5zdWJ0eXBlKSk7CisKKyAgaWYgKCEobWluZiA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAobWRpYSwgRk9VUkNDX21pbmYpKSkKKyAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICBpZiAoIShzdGJsID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChtaW5mLCBGT1VSQ0Nfc3RibCkpKQorICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgIC8qcGFyc2Ugc3ZtaSBoZWFkZXIgaWYgZXhpc3RpbmcgKi8KKyAgc3ZtaSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAoc3RibCwgRk9VUkNDX3N2bWkpOworICBpZiAoc3ZtaSkgeworICAgIGxlbiA9IFFUX1VJTlQzMiAoKGd1aW50OCAqKSBzdm1pLT5kYXRhKTsKKyAgICB2ZXJzaW9uID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIHN2bWktPmRhdGEgKyA4KTsKKyAgICBpZiAoIXZlcnNpb24pIHsKKyAgICAgIEdzdFZpZGVvTXVsdGl2aWV3TW9kZSBtb2RlID0gR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX05PTkU7CisgICAgICBHc3RWaWRlb011bHRpdmlld0ZsYWdzIGZsYWdzID0gR1NUX1ZJREVPX01VTFRJVklFV19GTEFHU19OT05FOworICAgICAgZ3VpbnQ4IGZyYW1lX3R5cGUsIGZyYW1lX2xheW91dDsKKworICAgICAgLyogTVBFRy1BIHN0ZXJlbyB2aWRlbyAqLworICAgICAgaWYgKHF0ZGVtdXgtPm1ham9yX2JyYW5kID09IEZPVVJDQ19zczAyKQorICAgICAgICBmbGFncyB8PSBHU1RfVklERU9fTVVMVElWSUVXX0ZMQUdTX01JWEVEX01PTk87CisKKyAgICAgIGZyYW1lX3R5cGUgPSBRVF9VSU5UOCAoKGd1aW50OCAqKSBzdm1pLT5kYXRhICsgMTIpOworICAgICAgZnJhbWVfbGF5b3V0ID0gUVRfVUlOVDggKChndWludDggKikgc3ZtaS0+ZGF0YSArIDEzKSAmIDB4MDE7CisgICAgICBzd2l0Y2ggKGZyYW1lX3R5cGUpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIG1vZGUgPSBHU1RfVklERU9fTVVMVElWSUVXX01PREVfU0lERV9CWV9TSURFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgbW9kZSA9IEdTVF9WSURFT19NVUxUSVZJRVdfTU9ERV9ST1dfSU5URVJMRUFWRUQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBtb2RlID0gR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX0ZSQU1FX0JZX0ZSQU1FOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgLyogbW9kZSAzIGlzIHByaW1hcnkvc2Vjb25kYXJ5IHZpZXcgc2VxdWVuY2UsIGllCisgICAgICAgICAgICogbGVmdC9yaWdodCB2aWV3cyBpbiBzZXBhcmF0ZSB0cmFja3MuIFNlZSBzZWN0aW9uIDcuMgorICAgICAgICAgICAqIG9mIElTTy9JRUMgMjMwMDAtMTE6MjAwOSAqLworICAgICAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAgICJJbXBsZW1lbnQgc3RlcmVvIHZpZGVvIGluIHNlcGFyYXRlIHN0cmVhbXMiKTsKKyAgICAgIH0KKworICAgICAgaWYgKChmcmFtZV9sYXlvdXQgJiAweDEpID09IDApCisgICAgICAgIGZsYWdzIHw9IEdTVF9WSURFT19NVUxUSVZJRVdfRkxBR1NfUklHSFRfVklFV19GSVJTVDsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgIlN0ZXJlb1ZpZGVvOiBjb21wb3NpdGlvbiB0eXBlOiAldSwgaXNfbGVmdF9maXJzdDogJXUiLAorICAgICAgICAgIGZyYW1lX3R5cGUsIGZyYW1lX2xheW91dCk7CisgICAgICBzdHJlYW0tPm11bHRpdmlld19tb2RlID0gbW9kZTsKKyAgICAgIHN0cmVhbS0+bXVsdGl2aWV3X2ZsYWdzID0gZmxhZ3M7CisgICAgfQorICB9CisKKyAgLyogcGFyc2UgcmVzdCBvZiB0a2hkICovCisgIGlmIChzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3ZpZGUpIHsKKyAgICBndWludDMyIG1hdHJpeFs5XTsKKworICAgIC8qIHZlcnNpb24gMSB1c2VzIHNvbWUgNjQtYml0IGludHMgKi8KKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwICgmdGtoZCwgMjAgKyB2YWx1ZV9zaXplKSkKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgaWYgKCFxdGRlbXV4X3BhcnNlX3RyYW5zZm9ybWF0aW9uX21hdHJpeCAocXRkZW11eCwgJnRraGQsIG1hdHJpeCwgInRraGQiKSkKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnRraGQsICZ3KQorICAgICAgICB8fCAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKCZ0a2hkLCAmaCkpCisgICAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICAgIHF0ZGVtdXhfaW5zcGVjdF90cmFuc2Zvcm1hdGlvbl9tYXRyaXggKHF0ZGVtdXgsIHN0cmVhbSwgbWF0cml4LAorICAgICAgICAmc3RyZWFtLT5zdHJlYW1fdGFncyk7CisgIH0KKworICAvKiBwYXJzZSBzdHNkICovCisgIGlmICghKHN0c2QgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHN0YmwsIEZPVVJDQ19zdHNkKSkpCisgICAgZ290byBjb3JydXB0X2ZpbGU7CisgIHN0c2RfZGF0YSA9IChjb25zdCBndWludDggKikgc3RzZC0+ZGF0YTsKKworICAvKiBzdHNkIHNob3VsZCBhdCBsZWFzdCBoYXZlIG9uZSBlbnRyeSAqLworICBzdHNkX2xlbiA9IFFUX1VJTlQzMiAoc3RzZF9kYXRhKTsKKyAgaWYgKHN0c2RfbGVuIDwgMjQpIHsKKyAgICAvKiAuLiBidXQgc2tpcCBzdHJlYW0gd2l0aCBlbXB0eSBzdHNkIHByb2R1Y2VkIGJ5IHNvbWUgVml2b3RlayBjYW1lcmFzICovCisgICAgaWYgKHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0Nfdml2bykgeworICAgICAgaWYgKG5ld19zdHJlYW0pCisgICAgICAgIGdzdF9xdGRlbXV4X3N0cmVhbV9mcmVlIChxdGRlbXV4LCBzdHJlYW0pOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworICAgIH0KKyAgfQorCisgIHN0cmVhbS0+c3RzZF9lbnRyaWVzX2xlbmd0aCA9IHN0c2RfZW50cnlfY291bnQgPSBRVF9VSU5UMzIgKHN0c2RfZGF0YSArIDEyKTsKKyAgc3RyZWFtLT5zdHNkX2VudHJpZXMgPSBnX25ldzAgKFF0RGVtdXhTdHJlYW1TdHNkRW50cnksIHN0c2RfZW50cnlfY291bnQpOworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInN0c2QgbGVuOiAgICAgICAgICAgJWQiLCBzdHNkX2xlbik7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAic3RzZCBlbnRyeSBjb3VudDogICAldSIsIHN0c2RfZW50cnlfY291bnQpOworCisgIHN0c2RfZW50cnlfZGF0YSA9IHN0c2RfZGF0YSArIDE2OworICByZW1haW5pbmdfc3RzZF9sZW4gPSBzdHNkX2xlbiAtIDE2OworICBmb3IgKHN0c2RfaW5kZXggPSAwOyBzdHNkX2luZGV4IDwgc3RzZF9lbnRyeV9jb3VudDsgc3RzZF9pbmRleCsrKSB7CisgICAgZ3VpbnQzMiBmb3VyY2M7CisgICAgZ2NoYXIgKmNvZGVjID0gTlVMTDsKKyAgICBRdERlbXV4U3RyZWFtU3RzZEVudHJ5ICplbnRyeSA9ICZzdHJlYW0tPnN0c2RfZW50cmllc1tzdHNkX2luZGV4XTsKKworICAgIC8qIGFuZCB0aGF0IGVudHJ5IHNob3VsZCBmaXQgd2l0aGluIHN0c2QgKi8KKyAgICBsZW4gPSBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSk7CisgICAgaWYgKGxlbiA+IHJlbWFpbmluZ19zdHNkX2xlbikKKyAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgZW50cnktPmZvdXJjYyA9IGZvdXJjYyA9IFFUX0ZPVVJDQyAoc3RzZF9lbnRyeV9kYXRhICsgNCk7CisgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJzdHNkIHR5cGU6ICAgICAgICAgICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGVudHJ5LT5mb3VyY2MpKTsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInN0c2QgdHlwZSBsZW46ICAgICAgJWQiLCBsZW4pOworCisgICAgaWYgKChmb3VyY2MgPT0gRk9VUkNDX2RybXMpIHx8IChmb3VyY2MgPT0gRk9VUkNDX2RybWkpKQorICAgICAgZ290byBlcnJvcl9lbmNyeXB0ZWQ7CisKKyAgICBpZiAoZm91cmNjID09IEZPVVJDQ19lbmN2IHx8IGZvdXJjYyA9PSBGT1VSQ0NfZW5jYSkgeworICAgICAgLyogRklYTUUgdGhpcyBsb29rcyB3cm9uZywgdGhlcmUgbWlnaHQgYmUgbXVsdGlwbGUgY2hpbGRyZW4KKyAgICAgICAqIHdpdGggdGhlIHNhbWUgdHlwZSAqLworICAgICAgR05vZGUgKmVuYyA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAoc3RzZCwgZm91cmNjKTsKKyAgICAgIHN0cmVhbS0+cHJvdGVjdGVkID0gVFJVRTsKKyAgICAgIGlmICghcXRkZW11eF9wYXJzZV9wcm90ZWN0aW9uX3NjaGVtZV9pbmZvIChxdGRlbXV4LCBzdHJlYW0sIGVuYywgJmZvdXJjYykpCisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHF0ZGVtdXgsICJGYWlsZWQgdG8gcGFyc2UgcHJvdGVjdGlvbiBzY2hlbWUgaW5mbyIpOworICAgIH0KKworICAgIGlmIChzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3ZpZGUpIHsKKyAgICAgIEdOb2RlICpjb2xyOworICAgICAgR05vZGUgKmZpZWw7CisgICAgICBHTm9kZSAqcGFzcDsKKyAgICAgIGdib29sZWFuIGdyYXk7CisgICAgICBnaW50IGRlcHRoLCBwYWxldHRlX3NpemUsIHBhbGV0dGVfY291bnQ7CisgICAgICBndWludDMyICpwYWxldHRlX2RhdGEgPSBOVUxMOworCisgICAgICBlbnRyeS0+c2FtcGxlZCA9IFRSVUU7CisKKyAgICAgIHN0cmVhbS0+ZGlzcGxheV93aWR0aCA9IHcgPj4gMTY7CisgICAgICBzdHJlYW0tPmRpc3BsYXlfaGVpZ2h0ID0gaCA+PiAxNjsKKworICAgICAgb2Zmc2V0ID0gMTY7CisgICAgICBpZiAobGVuIDwgODYpICAgICAgICAgICAgIC8qIFRPRE8gdmVyaWZ5ICovCisgICAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgICBlbnRyeS0+d2lkdGggPSBRVF9VSU5UMTYgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDE2KTsKKyAgICAgIGVudHJ5LT5oZWlnaHQgPSBRVF9VSU5UMTYgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDE4KTsKKyAgICAgIGVudHJ5LT5mcHNfbiA9IDA7ICAgICAgICAgLyogdGhpcyBpcyBmaWxsZWQgaW4gbGF0ZXIgKi8KKyAgICAgIGVudHJ5LT5mcHNfZCA9IDA7ICAgICAgICAgLyogdGhpcyBpcyBmaWxsZWQgaW4gbGF0ZXIgKi8KKyAgICAgIGVudHJ5LT5iaXRzX3Blcl9zYW1wbGUgPSBRVF9VSU5UMTYgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDY2KTsKKyAgICAgIGVudHJ5LT5jb2xvcl90YWJsZV9pZCA9IFFUX1VJTlQxNiAoc3RzZF9lbnRyeV9kYXRhICsgb2Zmc2V0ICsgNjgpOworCisgICAgICAvKiBpZiBjb2xvcl90YWJsZV9pZCBpcyAwLCBjdGFiIGF0b20gbXVzdCBmb2xsb3c7IGhvd2V2ZXIgc29tZSBmaWxlcworICAgICAgICogcHJvZHVjZWQgYnkgVE1QRUdFbmMgaGF2ZSBjb2xvcl90YWJsZV9pZCA9IDAgYW5kIG5vIGN0YWIgYXRvbSwgc28KKyAgICAgICAqIGlmIGNvbG9yIHRhYmxlIGlzIG5vdCBwcmVzZW50IHdlJ2xsIGNvcnJlY3QgdGhlIHZhbHVlICovCisgICAgICBpZiAoZW50cnktPmNvbG9yX3RhYmxlX2lkID09IDAgJiYKKyAgICAgICAgICAobGVuIDwgOTAKKyAgICAgICAgICAgICAgfHwgUVRfRk9VUkNDIChzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQgKyA3MCkgIT0gRk9VUkNDX2N0YWIpKSB7CisgICAgICAgIGVudHJ5LT5jb2xvcl90YWJsZV9pZCA9IC0xOworICAgICAgfQorCisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIndpZHRoICVkLCBoZWlnaHQgJWQsIGJwcyAlZCwgY29sb3IgdGFibGUgaWQgJWQiLAorICAgICAgICAgIGVudHJ5LT53aWR0aCwgZW50cnktPmhlaWdodCwgZW50cnktPmJpdHNfcGVyX3NhbXBsZSwKKyAgICAgICAgICBlbnRyeS0+Y29sb3JfdGFibGVfaWQpOworCisgICAgICBkZXB0aCA9IGVudHJ5LT5iaXRzX3Blcl9zYW1wbGU7CisKKyAgICAgIC8qIG1vcmUgdGhhbiAzMiBiaXRzIG1lYW5zIGdyYXlzY2FsZSAqLworICAgICAgZ3JheSA9IChkZXB0aCA+IDMyKTsKKyAgICAgIC8qIGxvdyAzMiBiaXRzIHNwZWNpZnkgdGhlIGRlcHRoICAqLworICAgICAgZGVwdGggJj0gMHgxRjsKKworICAgICAgLyogZGlmZmVyZW50IG51bWJlciBvZiBwYWxldHRlIGVudHJpZXMgaXMgZGV0ZXJtaW5lZCBieSBkZXB0aC4gKi8KKyAgICAgIHBhbGV0dGVfY291bnQgPSAwOworICAgICAgaWYgKChkZXB0aCA9PSAxKSB8fCAoZGVwdGggPT0gMikgfHwgKGRlcHRoID09IDQpIHx8IChkZXB0aCA9PSA4KSkKKyAgICAgICAgcGFsZXR0ZV9jb3VudCA9ICgxIDw8IGRlcHRoKTsKKyAgICAgIHBhbGV0dGVfc2l6ZSA9IHBhbGV0dGVfY291bnQgKiA0OworCisgICAgICBpZiAoZW50cnktPmNvbG9yX3RhYmxlX2lkKSB7CisgICAgICAgIHN3aXRjaCAocGFsZXR0ZV9jb3VudCkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHBhbGV0dGVfZGF0YSA9IGdfbWVtZHVwIChmZl9xdF9kZWZhdWx0X3BhbGV0dGVfMiwgcGFsZXR0ZV9zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHBhbGV0dGVfZGF0YSA9IGdfbWVtZHVwIChmZl9xdF9kZWZhdWx0X3BhbGV0dGVfNCwgcGFsZXR0ZV9zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICBpZiAoZ3JheSkKKyAgICAgICAgICAgICAgcGFsZXR0ZV9kYXRhID0KKyAgICAgICAgICAgICAgICAgIGdfbWVtZHVwIChmZl9xdF9ncmF5c2NhbGVfcGFsZXR0ZV8xNiwgcGFsZXR0ZV9zaXplKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcGFsZXR0ZV9kYXRhID0gZ19tZW1kdXAgKGZmX3F0X2RlZmF1bHRfcGFsZXR0ZV8xNiwgcGFsZXR0ZV9zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjU2OgorICAgICAgICAgICAgaWYgKGdyYXkpCisgICAgICAgICAgICAgIHBhbGV0dGVfZGF0YSA9CisgICAgICAgICAgICAgICAgICBnX21lbWR1cCAoZmZfcXRfZ3JheXNjYWxlX3BhbGV0dGVfMjU2LCBwYWxldHRlX3NpemUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBwYWxldHRlX2RhdGEgPSBnX21lbWR1cCAoZmZfcXRfZGVmYXVsdF9wYWxldHRlXzI1NiwgcGFsZXR0ZV9zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChxdGRlbXV4LCBTVFJFQU0sIERFTVVYLAorICAgICAgICAgICAgICAgIChfKCJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iKSksCisgICAgICAgICAgICAgICAgKCJ1bnN1cHBvcnRlZCBwYWxldHRlIGRlcHRoICVkIiwgZGVwdGgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBnaW50IGksIGosIHN0YXJ0LCBlbmQ7CisKKyAgICAgICAgaWYgKGxlbiA8IDk0KQorICAgICAgICAgIGdvdG8gY29ycnVwdF9maWxlOworCisgICAgICAgIC8qIHJlYWQgdGFibGUgKi8KKyAgICAgICAgc3RhcnQgPSBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDcwKTsKKyAgICAgICAgcGFsZXR0ZV9jb3VudCA9IFFUX1VJTlQxNiAoc3RzZF9lbnRyeV9kYXRhICsgb2Zmc2V0ICsgNzQpOworICAgICAgICBlbmQgPSBRVF9VSU5UMTYgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDc2KTsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInN0YXJ0ICVkLCBlbmQgJWQsIHBhbGV0dGVfY291bnQgJWQiLAorICAgICAgICAgICAgc3RhcnQsIGVuZCwgcGFsZXR0ZV9jb3VudCk7CisKKyAgICAgICAgaWYgKGVuZCA+IDI1NSkKKyAgICAgICAgICBlbmQgPSAyNTU7CisgICAgICAgIGlmIChzdGFydCA+IGVuZCkKKyAgICAgICAgICBzdGFydCA9IGVuZDsKKworICAgICAgICBpZiAobGVuIDwgOTQgKyAoZW5kIC0gc3RhcnQpICogOCkKKyAgICAgICAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICAgICAgICAvKiBwYWxldHRlIGlzIGFsd2F5cyB0aGUgc2FtZSBzaXplICovCisgICAgICAgIHBhbGV0dGVfZGF0YSA9IGdfbWFsbG9jMCAoMjU2ICogNCk7CisgICAgICAgIHBhbGV0dGVfc2l6ZSA9IDI1NiAqIDQ7CisKKyAgICAgICAgZm9yIChqID0gMCwgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaisrLCBpKyspIHsKKyAgICAgICAgICBndWludDMyIGEsIHIsIGcsIGI7CisKKyAgICAgICAgICBhID0gUVRfVUlOVDE2IChzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQgKyA3OCArIChqICogOCkpOworICAgICAgICAgIHIgPSBRVF9VSU5UMTYgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDgwICsgKGogKiA4KSk7CisgICAgICAgICAgZyA9IFFUX1VJTlQxNiAoc3RzZF9lbnRyeV9kYXRhICsgb2Zmc2V0ICsgODIgKyAoaiAqIDgpKTsKKyAgICAgICAgICBiID0gUVRfVUlOVDE2IChzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQgKyA4NCArIChqICogOCkpOworCisgICAgICAgICAgcGFsZXR0ZV9kYXRhW2ldID0gKChhICYgMHhmZjAwKSA8PCAxNikgfCAoKHIgJiAweGZmMDApIDw8IDgpIHwKKyAgICAgICAgICAgICAgKGcgJiAweGZmMDApIHwgKGIgPj4gOCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGVudHJ5LT5jYXBzKQorICAgICAgICBnc3RfY2Fwc191bnJlZiAoZW50cnktPmNhcHMpOworCisgICAgICBlbnRyeS0+Y2FwcyA9CisgICAgICAgICAgcXRkZW11eF92aWRlb19jYXBzIChxdGRlbXV4LCBzdHJlYW0sIGVudHJ5LCBmb3VyY2MsIHN0c2RfZW50cnlfZGF0YSwKKyAgICAgICAgICAmY29kZWMpOworICAgICAgaWYgKEdfVU5MSUtFTFkgKCFlbnRyeS0+Y2FwcykpIHsKKyAgICAgICAgZ19mcmVlIChwYWxldHRlX2RhdGEpOworICAgICAgICBnb3RvIHVua25vd25fc3RyZWFtOworICAgICAgfQorCisgICAgICBpZiAoY29kZWMpIHsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAoc3RyZWFtLT5zdHJlYW1fdGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICAgICAgR1NUX1RBR19WSURFT19DT0RFQywgY29kZWMsIE5VTEwpOworICAgICAgICBnX2ZyZWUgKGNvZGVjKTsKKyAgICAgICAgY29kZWMgPSBOVUxMOworICAgICAgfQorCisgICAgICBpZiAocGFsZXR0ZV9kYXRhKSB7CisgICAgICAgIEdzdFN0cnVjdHVyZSAqczsKKworICAgICAgICBpZiAoZW50cnktPnJnYjhfcGFsZXR0ZSkKKyAgICAgICAgICBnc3RfbWVtb3J5X3VucmVmIChlbnRyeS0+cmdiOF9wYWxldHRlKTsKKyAgICAgICAgZW50cnktPnJnYjhfcGFsZXR0ZSA9IGdzdF9tZW1vcnlfbmV3X3dyYXBwZWQgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwKKyAgICAgICAgICAgIHBhbGV0dGVfZGF0YSwgcGFsZXR0ZV9zaXplLCAwLCBwYWxldHRlX3NpemUsIHBhbGV0dGVfZGF0YSwgZ19mcmVlKTsKKworICAgICAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoZW50cnktPmNhcHMsIDApOworCisgICAgICAgIC8qIG5vbi1yYXcgdmlkZW8gaGFzIGEgcGFsZXR0ZV9kYXRhIHByb3BlcnR5LiByYXcgdmlkZW8gaGFzIHRoZSBwYWxldHRlIGFzCisgICAgICAgICAqIGFuIGV4dHJhIHBsYW5lIHRoYXQgd2UgYXBwZW5kIHRvIHRoZSBvdXRwdXQgYnVmZmVycyBiZWZvcmUgd2UgcHVzaAorICAgICAgICAgKiB0aGVtKi8KKyAgICAgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAidmlkZW8veC1yYXciKSkgeworICAgICAgICAgIEdzdEJ1ZmZlciAqcGFsZXR0ZTsKKworICAgICAgICAgIHBhbGV0dGUgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKHBhbGV0dGUsIGVudHJ5LT5yZ2I4X3BhbGV0dGUpOworICAgICAgICAgIGVudHJ5LT5yZ2I4X3BhbGV0dGUgPSBOVUxMOworCisgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsICJwYWxldHRlX2RhdGEiLAorICAgICAgICAgICAgICBHU1RfVFlQRV9CVUZGRVIsIHBhbGV0dGUsIE5VTEwpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHBhbGV0dGUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHBhbGV0dGVfY291bnQgIT0gMCkgeworICAgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChxdGRlbXV4LCBTVFJFQU0sIE5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgIChOVUxMKSwgKCJVbnN1cHBvcnRlZCBwYWxldHRlIGRlcHRoICVkIiwgZGVwdGgpKTsKKyAgICAgIH0KKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJmcmFtZSBjb3VudDogICAldSIsCisgICAgICAgICAgUVRfVUlOVDE2IChzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQgKyAzMikpOworCisgICAgICBlc2RzID0gTlVMTDsKKyAgICAgIHBhc3AgPSBOVUxMOworICAgICAgY29sciA9IE5VTEw7CisgICAgICBmaWVsID0gTlVMTDsKKyAgICAgIC8qIHBpY2sgJ3RoZScgc3RzZCBjaGlsZCAqLworICAgICAgbXA0diA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfaW5kZXggKHN0c2QsIHN0c2RfaW5kZXgpOworICAgICAgaWYgKCFzdHJlYW0tPnByb3RlY3RlZCkgeworICAgICAgICBpZiAoUVRERU1VWF9UUkVFX05PREVfRk9VUkNDIChtcDR2KSAhPSBmb3VyY2MpIHsKKyAgICAgICAgICBtcDR2ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKFFUREVNVVhfVFJFRV9OT0RFX0ZPVVJDQyAobXA0dikgIT0gRk9VUkNDX2VuY3YpIHsKKyAgICAgICAgICBtcDR2ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAobXA0dikgeworICAgICAgICBlc2RzID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChtcDR2LCBGT1VSQ0NfZXNkcyk7CisgICAgICAgIHBhc3AgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG1wNHYsIEZPVVJDQ19wYXNwKTsKKyAgICAgICAgY29sciA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAobXA0diwgRk9VUkNDX2NvbHIpOworICAgICAgICBmaWVsID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChtcDR2LCBGT1VSQ0NfZmllbCk7CisgICAgICB9CisKKyAgICAgIGlmIChwYXNwKSB7CisgICAgICAgIGNvbnN0IGd1aW50OCAqcGFzcF9kYXRhID0gKGNvbnN0IGd1aW50OCAqKSBwYXNwLT5kYXRhOworICAgICAgICBnaW50IGxlbiA9IFFUX1VJTlQzMiAocGFzcF9kYXRhKTsKKworICAgICAgICBpZiAobGVuID09IDE2KSB7CisgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cGFyX3cgPSBRVF9VSU5UMzIgKHBhc3BfZGF0YSArIDgpOworICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPnBhcl9oID0gUVRfVUlOVDMyIChwYXNwX2RhdGEgKyAxMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cGFyX3cgPSAwOworICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPnBhcl9oID0gMDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cGFyX3cgPSAwOworICAgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5wYXJfaCA9IDA7CisgICAgICB9CisKKyAgICAgIGlmIChmaWVsKSB7CisgICAgICAgIGNvbnN0IGd1aW50OCAqZmllbF9kYXRhID0gKGNvbnN0IGd1aW50OCAqKSBmaWVsLT5kYXRhOworICAgICAgICBnaW50IGxlbiA9IFFUX1VJTlQzMiAoZmllbF9kYXRhKTsKKworICAgICAgICBpZiAobGVuID09IDEwKSB7CisgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+aW50ZXJsYWNlX21vZGUgPSBHU1RfUkVBRF9VSU5UOCAoZmllbF9kYXRhICsgOCk7CisgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+ZmllbGRfb3JkZXIgPSBHU1RfUkVBRF9VSU5UOCAoZmllbF9kYXRhICsgOSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGNvbHIpIHsKKyAgICAgICAgY29uc3QgZ3VpbnQ4ICpjb2xyX2RhdGEgPSAoY29uc3QgZ3VpbnQ4ICopIGNvbHItPmRhdGE7CisgICAgICAgIGdpbnQgbGVuID0gUVRfVUlOVDMyIChjb2xyX2RhdGEpOworCisgICAgICAgIGlmIChsZW4gPT0gMTkgfHwgbGVuID09IDE4KSB7CisgICAgICAgICAgZ3VpbnQzMiBjb2xvcl90eXBlID0gR1NUX1JFQURfVUlOVDMyX0xFIChjb2xyX2RhdGEgKyA4KTsKKworICAgICAgICAgIGlmIChjb2xvcl90eXBlID09IEZPVVJDQ19uY2x4IHx8IGNvbG9yX3R5cGUgPT0gRk9VUkNDX25jbGMpIHsKKyAgICAgICAgICAgIGd1aW50MTYgcHJpbWFyaWVzID0gR1NUX1JFQURfVUlOVDE2X0JFIChjb2xyX2RhdGEgKyAxMik7CisgICAgICAgICAgICBndWludDE2IHRyYW5zZmVyX2Z1bmN0aW9uID0gR1NUX1JFQURfVUlOVDE2X0JFIChjb2xyX2RhdGEgKyAxNCk7CisgICAgICAgICAgICBndWludDE2IG1hdHJpeCA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoY29scl9kYXRhICsgMTYpOworICAgICAgICAgICAgZ2Jvb2xlYW4gZnVsbF9yYW5nZSA9IGxlbiA9PSAxOSA/IGNvbHJfZGF0YVsxN10gPj4gNyA6IEZBTFNFOworCisgICAgICAgICAgICBzd2l0Y2ggKHByaW1hcmllcykgeworICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y29sb3JpbWV0cnkucHJpbWFyaWVzID0KKyAgICAgICAgICAgICAgICAgICAgR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19CVDcwOTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmNvbG9yaW1ldHJ5LnByaW1hcmllcyA9CisgICAgICAgICAgICAgICAgICAgIEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfQlQ0NzBCRzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmNvbG9yaW1ldHJ5LnByaW1hcmllcyA9CisgICAgICAgICAgICAgICAgICAgIEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfU01QVEUxNzBNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y29sb3JpbWV0cnkucHJpbWFyaWVzID0KKyAgICAgICAgICAgICAgICAgICAgR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19CVDIwMjA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodHJhbnNmZXJfZnVuY3Rpb24pIHsKKyAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmNvbG9yaW1ldHJ5LnRyYW5zZmVyID0KKyAgICAgICAgICAgICAgICAgICAgR1NUX1ZJREVPX1RSQU5TRkVSX0JUNzA5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y29sb3JpbWV0cnkudHJhbnNmZXIgPQorICAgICAgICAgICAgICAgICAgICBHU1RfVklERU9fVFJBTlNGRVJfU01QVEUyNDBNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKG1hdHJpeCkgeworICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+Y29sb3JpbWV0cnkubWF0cml4ID0KKyAgICAgICAgICAgICAgICAgICAgR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9CVDcwOTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmNvbG9yaW1ldHJ5Lm1hdHJpeCA9CisgICAgICAgICAgICAgICAgICAgIEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQ2MDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5jb2xvcmltZXRyeS5tYXRyaXggPQorICAgICAgICAgICAgICAgICAgICBHU1RfVklERU9fQ09MT1JfTUFUUklYX1NNUFRFMjQwTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgIENVUl9TVFJFQU0gKHN0cmVhbSktPmNvbG9yaW1ldHJ5Lm1hdHJpeCA9CisgICAgICAgICAgICAgICAgICAgIEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQyMDIwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDVVJfU1RSRUFNIChzdHJlYW0pLT5jb2xvcmltZXRyeS5yYW5nZSA9CisgICAgICAgICAgICAgICAgZnVsbF9yYW5nZSA/IEdTVF9WSURFT19DT0xPUl9SQU5HRV8wXzI1NSA6CisgICAgICAgICAgICAgICAgR1NUX1ZJREVPX0NPTE9SX1JBTkdFXzE2XzIzNTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIlVuc3VwcG9ydGVkIGNvbG9yIHR5cGUiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAiSW52YWxpZCBjb2xyIGF0b20gc2l6ZSIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChlc2RzKSB7CisgICAgICAgIGdzdF9xdGRlbXV4X2hhbmRsZV9lc2RzIChxdGRlbXV4LCBzdHJlYW0sIGVudHJ5LCBlc2RzLAorICAgICAgICAgICAgc3RyZWFtLT5zdHJlYW1fdGFncyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKGZvdXJjYykgeworICAgICAgICAgIGNhc2UgRk9VUkNDX0gyNjQ6CisgICAgICAgICAgY2FzZSBGT1VSQ0NfYXZjMToKKyAgICAgICAgICBjYXNlIEZPVVJDQ19hdmMzOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGdpbnQgbGVuID0gUVRfVUlOVDMyIChzdHNkX2VudHJ5X2RhdGEpIC0gMHg1NjsKKyAgICAgICAgICAgIGNvbnN0IGd1aW50OCAqYXZjX2RhdGEgPSBzdHNkX2VudHJ5X2RhdGEgKyAweDU2OworCisgICAgICAgICAgICAvKiBmaW5kIGF2Y0MgKi8KKyAgICAgICAgICAgIHdoaWxlIChsZW4gPj0gMHg4KSB7CisgICAgICAgICAgICAgIGdpbnQgc2l6ZTsKKworICAgICAgICAgICAgICBpZiAoUVRfVUlOVDMyIChhdmNfZGF0YSkgPD0gbGVuKQorICAgICAgICAgICAgICAgIHNpemUgPSBRVF9VSU5UMzIgKGF2Y19kYXRhKSAtIDB4ODsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNpemUgPSBsZW4gLSAweDg7CisKKyAgICAgICAgICAgICAgaWYgKHNpemUgPCAxKQorICAgICAgICAgICAgICAgIC8qIE5vIHJlYWwgZGF0YSwgc28gYnJlYWsgb3V0ICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgc3dpdGNoIChRVF9GT1VSQ0MgKGF2Y19kYXRhICsgMHg0KSkgeworICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDX2F2Y0M6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogcGFyc2UsIGlmIGZvdW5kICovCisgICAgICAgICAgICAgICAgICBHc3RCdWZmZXIgKmJ1ZjsKKworICAgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZvdW5kIGF2Y0MgY29kZWNfZGF0YSBpbiBzdHNkIik7CisKKyAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IDQgYnl0ZXMgYXJlIHRoZSBsZW5ndGggb2YgdGhlIGF0b20sIHRoZSBuZXh0IDQgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAqIGFyZSB0aGUgZm91cmNjLCB0aGUgbmV4dCAxIGJ5dGUgaXMgdGhlIHZlcnNpb24sIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAqIHN1YnNlcXVlbnQgYnl0ZXMgYXJlIHByb2ZpbGVfdGllcl9sZXZlbCBzdHJ1Y3R1cmUgbGlrZSBkYXRhLiAqLworICAgICAgICAgICAgICAgICAgZ3N0X2NvZGVjX3V0aWxzX2gyNjRfY2Fwc19zZXRfbGV2ZWxfYW5kX3Byb2ZpbGUgKGVudHJ5LT5jYXBzLAorICAgICAgICAgICAgICAgICAgICAgIGF2Y19kYXRhICsgOCArIDEsIHNpemUgLSAxKTsKKyAgICAgICAgICAgICAgICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZSk7CisgICAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgYXZjX2RhdGEgKyAweDgsIHNpemUpOworICAgICAgICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgICAgICAgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZiwgTlVMTCk7CisgICAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0Nfc3RyZjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBHc3RCdWZmZXIgKmJ1ZjsKKworICAgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZvdW5kIHN0cmYgY29kZWNfZGF0YSBpbiBzdHNkIik7CisKKyAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IDQgYnl0ZXMgYXJlIHRoZSBsZW5ndGggb2YgdGhlIGF0b20sIHRoZSBuZXh0IDQgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAqIGFyZSB0aGUgZm91cmNjLCBuZXh0IDQwIGJ5dGVzIGFyZSBCSVRNQVBJTkZPSEVBREVSLAorICAgICAgICAgICAgICAgICAgICogbmV4dCAxIGJ5dGUgaXMgdGhlIHZlcnNpb24sIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAqIHN1YnNlcXVlbnQgYnl0ZXMgYXJlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgbGlrZSBkYXRhLiAqLworCisgICAgICAgICAgICAgICAgICBzaXplIC09IDQwOyAgIC8qIHdlJ2xsIGJlIHNraXBwaW5nIEJJVE1BUElORk9IRUFERVIgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChzaXplID4gMSkgeworICAgICAgICAgICAgICAgICAgICBnc3RfY29kZWNfdXRpbHNfaDI2NF9jYXBzX3NldF9sZXZlbF9hbmRfcHJvZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgKGVudHJ5LT5jYXBzLCBhdmNfZGF0YSArIDggKyA0MCArIDEsIHNpemUgLSAxKTsKKworICAgICAgICAgICAgICAgICAgICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHNpemUpOworICAgICAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgYXZjX2RhdGEgKyA4ICsgNDAsIHNpemUpOworICAgICAgICAgICAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChlbnRyeS0+Y2FwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBidWYsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDX2J0cnQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZ3VpbnQgYXZnX2JpdHJhdGUsIG1heF9iaXRyYXRlOworCisgICAgICAgICAgICAgICAgICAvKiBidWZmZXJTaXplREIsIG1heEJpdHJhdGUgYW5kIGF2Z0JpdHJhdGUgLSA0IGJ5dGVzIGVhY2ggKi8KKyAgICAgICAgICAgICAgICAgIGlmIChzaXplIDwgMTIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICBtYXhfYml0cmF0ZSA9IFFUX1VJTlQzMiAoYXZjX2RhdGEgKyAweGMpOworICAgICAgICAgICAgICAgICAgYXZnX2JpdHJhdGUgPSBRVF9VSU5UMzIgKGF2Y19kYXRhICsgMHgxMCk7CisKKyAgICAgICAgICAgICAgICAgIGlmICghbWF4X2JpdHJhdGUgJiYgIWF2Z19iaXRyYXRlKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgLyogU29tZSBtdXhlcnMgc2VlbSB0byBzd2FwIHRoZSBhdmVyYWdlIGFuZCBtYXhpbXVtIGJpdHJhdGVzCisgICAgICAgICAgICAgICAgICAgKiAoSSdtIGxvb2tpbmcgYXQgeW91LCBZb3VUdWJlKSwgc28gd2Ugc3dhcCBmb3Igc2FuaXR5LiAqLworICAgICAgICAgICAgICAgICAgaWYgKG1heF9iaXRyYXRlID4gMCAmJiBtYXhfYml0cmF0ZSA8IGF2Z19iaXRyYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGd1aW50IHRlbXAgPSBhdmdfYml0cmF0ZTsKKworICAgICAgICAgICAgICAgICAgICBhdmdfYml0cmF0ZSA9IG1heF9iaXRyYXRlOworICAgICAgICAgICAgICAgICAgICBtYXhfYml0cmF0ZSA9IHRlbXA7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGlmIChtYXhfYml0cmF0ZSA+IDAgJiYgbWF4X2JpdHJhdGUgPCBHX01BWFVJTlQzMikgeworICAgICAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfYWRkIChzdHJlYW0tPnN0cmVhbV90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgR1NUX1RBR19NRVJHRV9SRVBMQUNFLCBHU1RfVEFHX01BWElNVU1fQklUUkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9iaXRyYXRlLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmIChhdmdfYml0cmF0ZSA+IDAgJiYgYXZnX2JpdHJhdGUgPCBHX01BWFVJTlQzMikgeworICAgICAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfYWRkIChzdHJlYW0tPnN0cmVhbV90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgR1NUX1RBR19NRVJHRV9SRVBMQUNFLCBHU1RfVEFHX0JJVFJBVEUsIGF2Z19iaXRyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGxlbiAtPSBzaXplICsgODsKKyAgICAgICAgICAgICAgYXZjX2RhdGEgKz0gc2l6ZSArIDg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZPVVJDQ19IMjY1OgorICAgICAgICAgIGNhc2UgRk9VUkNDX2h2YzE6CisgICAgICAgICAgY2FzZSBGT1VSQ0NfaGV2MToKKyAgICAgICAgICB7CisgICAgICAgICAgICBnaW50IGxlbiA9IFFUX1VJTlQzMiAoc3RzZF9lbnRyeV9kYXRhKSAtIDB4NTY7CisgICAgICAgICAgICBjb25zdCBndWludDggKmhldmNfZGF0YSA9IHN0c2RfZW50cnlfZGF0YSArIDB4NTY7CisKKyAgICAgICAgICAgIC8qIGZpbmQgaGV2YyAqLworICAgICAgICAgICAgd2hpbGUgKGxlbiA+PSAweDgpIHsKKyAgICAgICAgICAgICAgZ2ludCBzaXplOworCisgICAgICAgICAgICAgIGlmIChRVF9VSU5UMzIgKGhldmNfZGF0YSkgPD0gbGVuKQorICAgICAgICAgICAgICAgIHNpemUgPSBRVF9VSU5UMzIgKGhldmNfZGF0YSkgLSAweDg7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzaXplID0gbGVuIC0gMHg4OworCisgICAgICAgICAgICAgIGlmIChzaXplIDwgMSkKKyAgICAgICAgICAgICAgICAvKiBObyByZWFsIGRhdGEsIHNvIGJyZWFrIG91dCAqLworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIHN3aXRjaCAoUVRfRk9VUkNDIChoZXZjX2RhdGEgKyAweDQpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0NfaHZjQzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBwYXJzZSwgaWYgZm91bmQgKi8KKyAgICAgICAgICAgICAgICAgIEdzdEJ1ZmZlciAqYnVmOworCisgICAgICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZm91bmQgaHZjQyBjb2RlY19kYXRhIGluIHN0c2QiKTsKKworICAgICAgICAgICAgICAgICAgLyogRmlyc3QgNCBieXRlcyBhcmUgdGhlIGxlbmd0aCBvZiB0aGUgYXRvbSwgdGhlIG5leHQgNCBieXRlcworICAgICAgICAgICAgICAgICAgICogYXJlIHRoZSBmb3VyY2MsIHRoZSBuZXh0IDEgYnl0ZSBpcyB0aGUgdmVyc2lvbiwgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICogc3Vic2VxdWVudCBieXRlcyBhcmUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBsaWtlIGRhdGEuICovCisgICAgICAgICAgICAgICAgICBnc3RfY29kZWNfdXRpbHNfaDI2NV9jYXBzX3NldF9sZXZlbF90aWVyX2FuZF9wcm9maWxlCisgICAgICAgICAgICAgICAgICAgICAgKGVudHJ5LT5jYXBzLCBoZXZjX2RhdGEgKyA4ICsgMSwgc2l6ZSAtIDEpOworCisgICAgICAgICAgICAgICAgICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHNpemUpOworICAgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIGhldmNfZGF0YSArIDB4OCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChlbnRyeS0+Y2FwcywKKyAgICAgICAgICAgICAgICAgICAgICAiY29kZWNfZGF0YSIsIEdTVF9UWVBFX0JVRkZFUiwgYnVmLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGxlbiAtPSBzaXplICsgODsKKyAgICAgICAgICAgICAgaGV2Y19kYXRhICs9IHNpemUgKyA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgRk9VUkNDX21wNHY6CisgICAgICAgICAgY2FzZSBGT1VSQ0NfTVA0VjoKKyAgICAgICAgICBjYXNlIEZPVVJDQ19mbXA0OgorICAgICAgICAgIGNhc2UgRk9VUkNDX0ZNUDQ6CisgICAgICAgICAgY2FzZSBGT1VSQ0NfeHZpZDoKKyAgICAgICAgICBjYXNlIEZPVVJDQ19YVklEOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIEdOb2RlICpnbGJsOworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZm91bmQgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKworICAgICAgICAgICAgLyogY29kZWMgZGF0YSBtaWdodCBiZSBpbiBnbGJsIGV4dGVuc2lvbiBhdG9tICovCisgICAgICAgICAgICBnbGJsID0gbXA0diA/CisgICAgICAgICAgICAgICAgcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChtcDR2LCBGT1VSQ0NfZ2xibCkgOiBOVUxMOworICAgICAgICAgICAgaWYgKGdsYmwpIHsKKyAgICAgICAgICAgICAgZ3VpbnQ4ICpkYXRhOworICAgICAgICAgICAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICAgICAgICAgICAgZ2ludCBsZW47CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZvdW5kIGdsYmwgZGF0YSBpbiBzdHNkIik7CisgICAgICAgICAgICAgIGRhdGEgPSBnbGJsLT5kYXRhOworICAgICAgICAgICAgICBsZW4gPSBRVF9VSU5UMzIgKGRhdGEpOworICAgICAgICAgICAgICBpZiAobGVuID4gMHg4KSB7CisgICAgICAgICAgICAgICAgbGVuIC09IDB4ODsKKyAgICAgICAgICAgICAgICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGxlbik7CisgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIGRhdGEgKyA4LCBsZW4pOworICAgICAgICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGVudHJ5LT5jYXBzLAorICAgICAgICAgICAgICAgICAgICAiY29kZWNfZGF0YSIsIEdTVF9UWVBFX0JVRkZFUiwgYnVmLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBGT1VSQ0NfbWpwMjoKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBzZWUgYW5uZXggSSBvZiB0aGUganBlZzIwMDAgc3BlYyAqLworICAgICAgICAgICAgR05vZGUgKmpwMmgsICppaGRyLCAqY29sciwgKm1qcDIsICpmaWVsZCwgKnByZWZpeCwgKmNtYXAsICpjZGVmOworICAgICAgICAgICAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICAgICAgICAgICAgY29uc3QgZ2NoYXIgKmNvbG9yc3BhY2UgPSBOVUxMOworICAgICAgICAgICAgZ2ludCBuY29tcCA9IDA7CisgICAgICAgICAgICBndWludDMyIG5jb21wX21hcCA9IDA7CisgICAgICAgICAgICBnaW50MzIgKmNvbXBfbWFwID0gTlVMTDsKKyAgICAgICAgICAgIGd1aW50MzIgbmNoYW5fZGVmID0gMDsKKyAgICAgICAgICAgIGdpbnQzMiAqY2hhbl9kZWYgPSBOVUxMOworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZm91bmQgbWpwMiIpOworICAgICAgICAgICAgLyogc29tZSByZXF1aXJlZCBhdG9tcyAqLworICAgICAgICAgICAgbWpwMiA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfaW5kZXggKHN0c2QsIHN0c2RfaW5kZXgpOworICAgICAgICAgICAgaWYgKCFtanAyKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGpwMmggPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG1qcDIsIEZPVVJDQ19qcDJoKTsKKyAgICAgICAgICAgIGlmICghanAyaCkKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb21wb25lbnRzOyByZWR1bmRhbnQgd2l0aCBpbmZvIGluIGNvZGVzdHJlYW0sIGJ1dCB1c2VmdWwKKyAgICAgICAgICAgICAgIHRvIGEgbXV4ZXIgKi8KKyAgICAgICAgICAgIGloZHIgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKGpwMmgsIEZPVVJDQ19paGRyKTsKKyAgICAgICAgICAgIGlmICghaWhkciB8fCBRVF9VSU5UMzIgKGloZHItPmRhdGEpICE9IDIyKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG5jb21wID0gUVRfVUlOVDE2ICgoKGd1aW50OCAqKSBpaGRyLT5kYXRhKSArIDE2KTsKKworICAgICAgICAgICAgY29sciA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAoanAyaCwgRk9VUkNDX2NvbHIpOworICAgICAgICAgICAgaWYgKCFjb2xyKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJmb3VuZCBjb2xyIik7CisgICAgICAgICAgICAvKiBleHRyYWN0IGNvbG91ciBzcGFjZSBpbmZvICovCisgICAgICAgICAgICBpZiAoUVRfVUlOVDggKChndWludDggKikgY29sci0+ZGF0YSArIDgpID09IDEpIHsKKyAgICAgICAgICAgICAgc3dpdGNoIChRVF9VSU5UMzIgKChndWludDggKikgY29sci0+ZGF0YSArIDExKSkgeworICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICBjb2xvcnNwYWNlID0gInNSR0IiOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgIGNvbG9yc3BhY2UgPSAiR1JBWSI7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgY29sb3JzcGFjZSA9ICJzWVVWIjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICBjb2xvcnNwYWNlID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWNvbG9yc3BhY2UpCisgICAgICAgICAgICAgIC8qIGNvbHIgaXMgcmVxdWlyZWQsIGFuZCBvbmx5IHZhbHVlcyAxNiwgMTcsIGFuZCAxOCBhcmUgc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgICBzbyBlcnJvciBpZiB3ZSBoYXZlIG5vIGNvbG9yc3BhY2UgKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIGV4dHJhY3QgY29tcG9uZW50IG1hcHBpbmcgKi8KKyAgICAgICAgICAgIGNtYXAgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKGpwMmgsIEZPVVJDQ19jbWFwKTsKKyAgICAgICAgICAgIGlmIChjbWFwKSB7CisgICAgICAgICAgICAgIGd1aW50MzIgY21hcF9sZW4gPSAwOworICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgY21hcF9sZW4gPSBRVF9VSU5UMzIgKGNtYXAtPmRhdGEpOworICAgICAgICAgICAgICBpZiAoY21hcF9sZW4gPj0gOCkgeworICAgICAgICAgICAgICAgIC8qIG5vcm1hbCBib3gsIHN1YnRyYWN0IG9mZiBoZWFkZXIgKi8KKyAgICAgICAgICAgICAgICBjbWFwX2xlbiAtPSA4OworICAgICAgICAgICAgICAgIC8qIGNtYXA6IHsgdTE2IGNtcDsgdTggbXR5cDsgdTggcGNvbDsgfSogKi8KKyAgICAgICAgICAgICAgICBpZiAoY21hcF9sZW4gJSA0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgIG5jb21wX21hcCA9IChjbWFwX2xlbiAvIDQpOworICAgICAgICAgICAgICAgICAgY29tcF9tYXAgPSBnX25ldzAgKGdpbnQzMiwgbmNvbXBfbWFwKTsKKyAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuY29tcF9tYXA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBndWludDE2IGNtcDsKKyAgICAgICAgICAgICAgICAgICAgZ3VpbnQ4IG10eXAsIHBjb2w7CisgICAgICAgICAgICAgICAgICAgIGNtcCA9IFFUX1VJTlQxNiAoKChndWludDggKikgY21hcC0+ZGF0YSkgKyA4ICsgaSAqIDQpOworICAgICAgICAgICAgICAgICAgICBtdHlwID0gUVRfVUlOVDggKCgoZ3VpbnQ4ICopIGNtYXAtPmRhdGEpICsgOCArIGkgKiA0ICsgMik7CisgICAgICAgICAgICAgICAgICAgIHBjb2wgPSBRVF9VSU5UOCAoKChndWludDggKikgY21hcC0+ZGF0YSkgKyA4ICsgaSAqIDQgKyAzKTsKKyAgICAgICAgICAgICAgICAgICAgY29tcF9tYXBbaV0gPSAobXR5cCA8PCAyNCkgfCAocGNvbCA8PCAxNikgfCBjbXA7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBleHRyYWN0IGNoYW5uZWwgZGVmaW5pdGlvbnMgKi8KKyAgICAgICAgICAgIGNkZWYgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKGpwMmgsIEZPVVJDQ19jZGVmKTsKKyAgICAgICAgICAgIGlmIChjZGVmKSB7CisgICAgICAgICAgICAgIGd1aW50MzIgY2RlZl9sZW4gPSAwOworICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgY2RlZl9sZW4gPSBRVF9VSU5UMzIgKGNkZWYtPmRhdGEpOworICAgICAgICAgICAgICBpZiAoY2RlZl9sZW4gPj0gMTApIHsKKyAgICAgICAgICAgICAgICAvKiBub3JtYWwgYm94LCBzdWJ0cmFjdCBvZmYgaGVhZGVyIGFuZCBsZW4gKi8KKyAgICAgICAgICAgICAgICBjZGVmX2xlbiAtPSAxMDsKKyAgICAgICAgICAgICAgICAvKiBjZGVmOiB1MTYgbjsgeyB1MTYgY247IHUxNiB0eXA7IHUxNiBhc29jOyB9KiAqLworICAgICAgICAgICAgICAgIGlmIChjZGVmX2xlbiAlIDYgPT0gMCkgeworICAgICAgICAgICAgICAgICAgbmNoYW5fZGVmID0gKGNkZWZfbGVuIC8gNik7CisgICAgICAgICAgICAgICAgICBjaGFuX2RlZiA9IGdfbmV3MCAoZ2ludDMyLCBuY2hhbl9kZWYpOworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5jaGFuX2RlZjsgaSsrKQorICAgICAgICAgICAgICAgICAgICBjaGFuX2RlZltpXSA9IC0xOworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5jaGFuX2RlZjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGd1aW50MTYgY24sIHR5cCwgYXNvYzsKKyAgICAgICAgICAgICAgICAgICAgY24gPSBRVF9VSU5UMTYgKCgoZ3VpbnQ4ICopIGNkZWYtPmRhdGEpICsgMTAgKyBpICogNik7CisgICAgICAgICAgICAgICAgICAgIHR5cCA9IFFUX1VJTlQxNiAoKChndWludDggKikgY2RlZi0+ZGF0YSkgKyAxMCArIGkgKiA2ICsgMik7CisgICAgICAgICAgICAgICAgICAgIGFzb2MgPSBRVF9VSU5UMTYgKCgoZ3VpbnQ4ICopIGNkZWYtPmRhdGEpICsgMTAgKyBpICogNiArIDQpOworICAgICAgICAgICAgICAgICAgICBpZiAoY24gPCBuY2hhbl9kZWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuX2RlZltjbl0gPSBhc29jOworICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbl9kZWZbY25dID0gMDsgICAgIC8qIGFscGhhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbl9kZWZbY25dID0gLXR5cDsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgIm51bS1jb21wb25lbnRzIiwgR19UWVBFX0lOVCwgbmNvbXAsIE5VTEwpOworICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgImNvbG9yc3BhY2UiLCBHX1RZUEVfU1RSSU5HLCBjb2xvcnNwYWNlLCBOVUxMKTsKKworICAgICAgICAgICAgaWYgKGNvbXBfbWFwKSB7CisgICAgICAgICAgICAgIEdWYWx1ZSBhcnIgPSB7IDAsIH07CisgICAgICAgICAgICAgIEdWYWx1ZSBlbHQgPSB7IDAsIH07CisgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZhcnIsIEdTVF9UWVBFX0FSUkFZKTsKKyAgICAgICAgICAgICAgZ192YWx1ZV9pbml0ICgmZWx0LCBHX1RZUEVfSU5UKTsKKyAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5jb21wX21hcDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZ192YWx1ZV9zZXRfaW50ICgmZWx0LCBjb21wX21hcFtpXSk7CisgICAgICAgICAgICAgICAgZ3N0X3ZhbHVlX2FycmF5X2FwcGVuZF92YWx1ZSAoJmFyciwgJmVsdCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGVudHJ5LT5jYXBzLCAwKSwKKyAgICAgICAgICAgICAgICAgICJjb21wb25lbnQtbWFwIiwgJmFycik7CisgICAgICAgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZlbHQpOworICAgICAgICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmYXJyKTsKKyAgICAgICAgICAgICAgZ19mcmVlIChjb21wX21hcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaGFuX2RlZikgeworICAgICAgICAgICAgICBHVmFsdWUgYXJyID0geyAwLCB9OworICAgICAgICAgICAgICBHVmFsdWUgZWx0ID0geyAwLCB9OworICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgZ192YWx1ZV9pbml0ICgmYXJyLCBHU1RfVFlQRV9BUlJBWSk7CisgICAgICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJmVsdCwgR19UWVBFX0lOVCk7CisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuY2hhbl9kZWY7IGkrKykgeworICAgICAgICAgICAgICAgIGdfdmFsdWVfc2V0X2ludCAoJmVsdCwgY2hhbl9kZWZbaV0pOworICAgICAgICAgICAgICAgIGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfdmFsdWUgKCZhcnIsICZlbHQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChlbnRyeS0+Y2FwcywgMCksCisgICAgICAgICAgICAgICAgICAiY2hhbm5lbC1kZWZpbml0aW9ucyIsICZhcnIpOworICAgICAgICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmZWx0KTsKKyAgICAgICAgICAgICAgZ192YWx1ZV91bnNldCAoJmFycik7CisgICAgICAgICAgICAgIGdfZnJlZSAoY2hhbl9kZWYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBzb21lIG9wdGlvbmFsIGF0b21zICovCisgICAgICAgICAgICBmaWVsZCA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAobWpwMiwgRk9VUkNDX2ZpZWwpOworICAgICAgICAgICAgcHJlZml4ID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChtanAyLCBGT1VSQ0NfanAyeCk7CisKKyAgICAgICAgICAgIC8qIGluZGljYXRlIHBvc3NpYmxlIGZpZWxkcyBpbiBjYXBzICovCisgICAgICAgICAgICBpZiAoZmllbGQpIHsKKyAgICAgICAgICAgICAgZGF0YSA9IChndWludDggKikgZmllbGQtPmRhdGEgKyA4OworICAgICAgICAgICAgICBpZiAoKmRhdGEgIT0gMSkKKyAgICAgICAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChlbnRyeS0+Y2FwcywgImZpZWxkcyIsIEdfVFlQRV9JTlQsCisgICAgICAgICAgICAgICAgICAgIChnaW50KSAqIGRhdGEsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogYWRkIGNvZGVjX2RhdGEgaWYgcHJvdmlkZWQgKi8KKyAgICAgICAgICAgIGlmIChwcmVmaXgpIHsKKyAgICAgICAgICAgICAgR3N0QnVmZmVyICpidWY7CisgICAgICAgICAgICAgIGdpbnQgbGVuOworCisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJmb3VuZCBwcmVmaXggZGF0YSBpbiBzdHNkIik7CisgICAgICAgICAgICAgIGRhdGEgPSBwcmVmaXgtPmRhdGE7CisgICAgICAgICAgICAgIGxlbiA9IFFUX1VJTlQzMiAoZGF0YSk7CisgICAgICAgICAgICAgIGlmIChsZW4gPiAweDgpIHsKKyAgICAgICAgICAgICAgICBsZW4gLT0gMHg4OworICAgICAgICAgICAgICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobGVuKTsKKyAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgZGF0YSArIDgsIGxlbik7CisgICAgICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgICAgICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBidWYsIE5VTEwpOworICAgICAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZPVVJDQ19TVlEzOgorICAgICAgICAgIGNhc2UgRk9VUkNDX1ZQMzE6CisgICAgICAgICAgeworICAgICAgICAgICAgR3N0QnVmZmVyICpidWY7CisgICAgICAgICAgICBHc3RCdWZmZXIgKnNlcWggPSBOVUxMOworICAgICAgICAgICAgY29uc3QgZ3VpbnQ4ICpnYW1tYV9kYXRhID0gTlVMTDsKKyAgICAgICAgICAgIGdpbnQgbGVuID0gUVRfVUlOVDMyIChzdHNkX2RhdGEpOyAgIC8qIEZJWE1FIHJldmlldyAtIHdoeSBwdXQgdGhlIHdob2xlIHN0c2QgaW4gY29kZWMgZGF0YT8gKi8KKworICAgICAgICAgICAgcXRkZW11eF9wYXJzZV9zdnEzX3N0c2RfZGF0YSAocXRkZW11eCwgc3RzZF9lbnRyeV9kYXRhLCAmZ2FtbWFfZGF0YSwKKyAgICAgICAgICAgICAgICAmc2VxaCk7CisgICAgICAgICAgICBpZiAoZ2FtbWFfZGF0YSkgeworICAgICAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChlbnRyeS0+Y2FwcywgImFwcGxpZWQtZ2FtbWEiLCBHX1RZUEVfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgUVRfRlAzMiAoZ2FtbWFfZGF0YSksIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlcWgpIHsKKyAgICAgICAgICAgICAgLyogc29ycnkgZm9yIHRoZSBiYWQgbmFtZSwgYnV0IHdlIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzLCBvdGhlcgorICAgICAgICAgICAgICAgKiB0aGFuIGl0cyBvd24gZm91cmNjICovCisgICAgICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGVudHJ5LT5jYXBzLCAic2VxaCIsIEdTVF9UWVBFX0JVRkZFUiwgc2VxaCwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChzZXFoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZvdW5kIGNvZGVjX2RhdGEgaW4gc3RzZCIpOworICAgICAgICAgICAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChsZW4pOworICAgICAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIHN0c2RfZGF0YSwgbGVuKTsKKyAgICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGVudHJ5LT5jYXBzLAorICAgICAgICAgICAgICAgICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBidWYsIE5VTEwpOworICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZPVVJDQ19qcGVnOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9zdGFuZGFyZHMvcXRmZi0yMDAxLnBkZiwKKyAgICAgICAgICAgICAqIHBhZ2UgOTIsICJWaWRlbyBTYW1wbGUgRGVzY3JpcHRpb24iLCB1bmRlciB0YWJsZSAzLjEgKi8KKyAgICAgICAgICAgIEdzdEJ5dGVSZWFkZXIgYnI7CisKKyAgICAgICAgICAgIGNvbnN0IGdpbnQgY29tcHJlc3Nvcl9vZmZzZXQgPQorICAgICAgICAgICAgICAgIDE2ICsgNCArIDQgKiAzICsgMiAqIDIgKyAyICogNCArIDQgKyAyOworICAgICAgICAgICAgY29uc3QgZ2ludCBtaW5fc2l6ZSA9IGNvbXByZXNzb3Jfb2Zmc2V0ICsgMzIgKyAyICsgMjsKKyAgICAgICAgICAgIEdOb2RlICpqcGVnOworICAgICAgICAgICAgZ3VpbnQzMiBsZW47CisgICAgICAgICAgICBndWludDE2IGNvbG9yX3RhYmxlX2lkID0gMDsKKyAgICAgICAgICAgIGdib29sZWFuIG9rOworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZm91bmQganBlZyIpOworCisgICAgICAgICAgICAvKiByZWNvdmVyIGluZm9ybWF0aW9uIG9uIGludGVybGFjZWQvcHJvZ3Jlc3NpdmUgKi8KKyAgICAgICAgICAgIGpwZWcgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHN0c2QsIEZPVVJDQ19qcGVnKTsKKyAgICAgICAgICAgIGlmICghanBlZykKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGxlbiA9IFFUX1VJTlQzMiAoanBlZy0+ZGF0YSk7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiRm91bmQganBlZzogbGVuICV1LCBuZWVkICVkIiwgbGVuLAorICAgICAgICAgICAgICAgIG1pbl9zaXplKTsKKyAgICAgICAgICAgIGlmIChsZW4gPj0gbWluX3NpemUpIHsKKyAgICAgICAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZiciwganBlZy0+ZGF0YSwgbGVuKTsKKworICAgICAgICAgICAgICBnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJmJyLCBjb21wcmVzc29yX29mZnNldCArIDMyICsgMik7CisgICAgICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2xlICgmYnIsICZjb2xvcl90YWJsZV9pZCk7CisgICAgICAgICAgICAgIGlmIChjb2xvcl90YWJsZV9pZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgLyogdGhlIHNwZWMgc2F5cyB0aGVyZSBjYW4gYmUgY29uY2F0ZW5hdGVkIGNodW5rcyBpbiB0aGUgZGF0YSwgYW5kIHdlIHdhbnQKKyAgICAgICAgICAgICAgICAgKiB0byBmaW5kIG9uZSBjYWxsZWQgZmllbGQuIFdhbGsgdGhyb3VnaCB0aGVtLiAqLworICAgICAgICAgICAgICAgIGdpbnQgb2Zmc2V0ID0gbWluX3NpemU7CisgICAgICAgICAgICAgICAgd2hpbGUgKG9mZnNldCArIDggPCBsZW4pIHsKKyAgICAgICAgICAgICAgICAgIGd1aW50MzIgc2l6ZSA9IDAsIHRhZzsKKyAgICAgICAgICAgICAgICAgIG9rID0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKCZiciwgJnNpemUpOworICAgICAgICAgICAgICAgICAgb2sgJj0gZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfbGUgKCZiciwgJnRhZyk7CisgICAgICAgICAgICAgICAgICBpZiAoIW9rIHx8IHNpemUgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gd2FsayBvcHRpb25hbCBjaHVuayBsaXN0Iik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgICAiRm91bmQgb3B0aW9uYWwgJTQuNHMgY2h1bmssIHNpemUgJXUiLAorICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopICZ0YWcsIHNpemUpOworICAgICAgICAgICAgICAgICAgaWYgKHRhZyA9PSBGT1VSQ0NfZmllbCkgeworICAgICAgICAgICAgICAgICAgICBndWludDggbl9maWVsZHMgPSAwLCBvcmRlcmluZyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZiciwgJm5fZmllbGRzKTsKKyAgICAgICAgICAgICAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAoJmJyLCAmb3JkZXJpbmcpOworICAgICAgICAgICAgICAgICAgICBpZiAobl9maWVsZHMgPT0gMSB8fCBuX2ZpZWxkcyA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvdW5kIGZpZWwgdGFnIHdpdGggJXUgZmllbGRzLCBvcmRlcmluZyAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5fZmllbGRzLCBvcmRlcmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKG5fZmllbGRzID09IDIpCisgICAgICAgICAgICAgICAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmxhY2UtbW9kZSIsIEdfVFlQRV9TVFJJTkcsICJpbnRlcmxlYXZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRm91bmQgZmllbCB0YWcgd2l0aCBpbnZhbGlkIGZpZWxkcyAoJXUpIiwgbl9maWVsZHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgIkNvbG9yIHRhYmxlIElEIGlzIDAsIG5vdCB0cnlpbmcgdG8gZ2V0IGludGVybGFjZWRuZXNzIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICAgICAgICJMZW5ndGggb2YganBlZyBjaHVuayBpcyB0b28gc21hbGwsIG5vdCB0cnlpbmcgdG8gZ2V0IGludGVybGFjZWRuZXNzIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZPVVJDQ19ybGVfOgorICAgICAgICAgIGNhc2UgRk9VUkNDX1dSTEU6CisgICAgICAgICAgeworICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgImRlcHRoIiwgR19UWVBFX0lOVCwgUVRfVUlOVDE2IChzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQgKyA2NiksCisgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBGT1VSQ0NfWGlUaDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBHTm9kZSAqeGl0aCwgKnhkeHQ7CisKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJmb3VuZCBYaVRoIik7CisgICAgICAgICAgICB4aXRoID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV9pbmRleCAoc3RzZCwgc3RzZF9pbmRleCk7CisgICAgICAgICAgICBpZiAoIXhpdGgpCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB4ZHh0ID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlICh4aXRoLCBGT1VSQ0NfWGR4VCk7CisgICAgICAgICAgICBpZiAoIXhkeHQpCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZm91bmQgWGR4VCBub2RlIik7CisgICAgICAgICAgICAvKiBjb2xsZWN0IHRoZSBoZWFkZXJzIGFuZCBzdG9yZSB0aGVtIGluIGEgc3RyZWFtIGxpc3Qgc28gdGhhdCB3ZSBjYW4KKyAgICAgICAgICAgICAqIHNlbmQgdGhlbSBvdXQgZmlyc3QgKi8KKyAgICAgICAgICAgIHF0ZGVtdXhfcGFyc2VfdGhlb3JhX2V4dGVuc2lvbiAocXRkZW11eCwgc3RyZWFtLCB4ZHh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZPVVJDQ19vdmMxOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIEdOb2RlICpvdmMxOworICAgICAgICAgICAgZ3VpbnQ4ICpvdmMxX2RhdGE7CisgICAgICAgICAgICBndWludCBvdmMxX2xlbjsKKyAgICAgICAgICAgIEdzdEJ1ZmZlciAqYnVmOworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicGFyc2Ugb3ZjMSBoZWFkZXIiKTsKKyAgICAgICAgICAgIG92YzEgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X2luZGV4IChzdHNkLCBzdHNkX2luZGV4KTsKKyAgICAgICAgICAgIGlmICghb3ZjMSkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBvdmMxX2RhdGEgPSBvdmMxLT5kYXRhOworICAgICAgICAgICAgb3ZjMV9sZW4gPSBRVF9VSU5UMzIgKG92YzFfZGF0YSk7CisgICAgICAgICAgICBpZiAob3ZjMV9sZW4gPD0gMTk4KSB7CisgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIlRvbyBzbWFsbCBvdmMxIGhlYWRlciwgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG92YzFfbGVuIC0gMTk4KTsKKyAgICAgICAgICAgIGdzdF9idWZmZXJfZmlsbCAoYnVmLCAwLCBvdmMxX2RhdGEgKyAxOTgsIG92YzFfbGVuIC0gMTk4KTsKKyAgICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGVudHJ5LT5jYXBzLAorICAgICAgICAgICAgICAgICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBidWYsIE5VTEwpOworICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZPVVJDQ192Y18xOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGdpbnQgbGVuID0gUVRfVUlOVDMyIChzdHNkX2VudHJ5X2RhdGEpIC0gMHg1NjsKKyAgICAgICAgICAgIGNvbnN0IGd1aW50OCAqdmMxX2RhdGEgPSBzdHNkX2VudHJ5X2RhdGEgKyAweDU2OworCisgICAgICAgICAgICAvKiBmaW5kIGR2YzEgKi8KKyAgICAgICAgICAgIHdoaWxlIChsZW4gPj0gOCkgeworICAgICAgICAgICAgICBnaW50IHNpemU7CisKKyAgICAgICAgICAgICAgaWYgKFFUX1VJTlQzMiAodmMxX2RhdGEpIDw9IGxlbikKKyAgICAgICAgICAgICAgICBzaXplID0gUVRfVUlOVDMyICh2YzFfZGF0YSkgLSA4OworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2l6ZSA9IGxlbiAtIDg7CisKKyAgICAgICAgICAgICAgaWYgKHNpemUgPCAxKQorICAgICAgICAgICAgICAgIC8qIE5vIHJlYWwgZGF0YSwgc28gYnJlYWsgb3V0ICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgc3dpdGNoIChRVF9GT1VSQ0MgKHZjMV9kYXRhICsgMHg0KSkgeworICAgICAgICAgICAgICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnZCcsICd2JywgJ2MnLCAnMScpOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIEdzdEJ1ZmZlciAqYnVmOworCisgICAgICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZm91bmQgZHZjMSBjb2RlY19kYXRhIGluIHN0c2QiKTsKKyAgICAgICAgICAgICAgICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZSk7CisgICAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgdmMxX2RhdGEgKyA4LCBzaXplKTsKKyAgICAgICAgICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGVudHJ5LT5jYXBzLAorICAgICAgICAgICAgICAgICAgICAgICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBidWYsIE5VTEwpOworICAgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbGVuIC09IHNpemUgKyA4OworICAgICAgICAgICAgICB2YzFfZGF0YSArPSBzaXplICsgODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgR1NUX0lORk9fT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICJ0eXBlICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYyksIGVudHJ5LT5jYXBzKTsKKworICAgIH0gZWxzZSBpZiAoc3RyZWFtLT5zdWJ0eXBlID09IEZPVVJDQ19zb3VuKSB7CisgICAgICBHTm9kZSAqd2F2ZTsKKyAgICAgIGludCB2ZXJzaW9uLCBzYW1wbGVzaXplOworICAgICAgZ3VpbnQxNiBjb21wcmVzc2lvbl9pZDsKKyAgICAgIGdib29sZWFuIGFtcndiID0gRkFMU0U7CisKKyAgICAgIG9mZnNldCA9IDE2OworICAgICAgLyogc2FtcGxlIGRlc2NyaXB0aW9uIGVudHJ5ICgxNikgKyBzb3VuZCBzYW1wbGUgZGVzY3JpcHRpb24gdjAgKDIwKSAqLworICAgICAgaWYgKGxlbiA8IDM2KQorICAgICAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICAgICAgdmVyc2lvbiA9IFFUX1VJTlQzMiAoc3RzZF9lbnRyeV9kYXRhICsgb2Zmc2V0KTsKKyAgICAgIGVudHJ5LT5uX2NoYW5uZWxzID0gUVRfVUlOVDE2IChzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQgKyA4KTsKKyAgICAgIHNhbXBsZXNpemUgPSBRVF9VSU5UMTYgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDEwKTsKKyAgICAgIGNvbXByZXNzaW9uX2lkID0gUVRfVUlOVDE2IChzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQgKyAxMik7CisgICAgICBlbnRyeS0+cmF0ZSA9IFFUX0ZQMzIgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDE2KTsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJ2ZXJzaW9uL3JldjogICAgICAlMDh4IiwgdmVyc2lvbik7CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInZlbmRvcjogICAgICAgICAgICUwOHgiLAorICAgICAgICAgIFFUX1VJTlQzMiAoc3RzZF9lbnRyeV9kYXRhICsgb2Zmc2V0ICsgNCkpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJuX2NoYW5uZWxzOiAgICAgICAlZCIsIGVudHJ5LT5uX2NoYW5uZWxzKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAic2FtcGxlX3NpemU6ICAgICAgJWQiLCBzYW1wbGVzaXplKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiY29tcHJlc3Npb25faWQ6ICAgJWQiLCBjb21wcmVzc2lvbl9pZCk7CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInBhY2tldCBzaXplOiAgICAgICVkIiwKKyAgICAgICAgICBRVF9VSU5UMTYgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDE0KSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInNhbXBsZSByYXRlOiAgICAgICVnIiwgZW50cnktPnJhdGUpOworCisgICAgICBpZiAoY29tcHJlc3Npb25faWQgPT0gMHhmZmZlKQorICAgICAgICBlbnRyeS0+c2FtcGxlZCA9IFRSVUU7CisKKyAgICAgIC8qIGZpcnN0IGFzc3VtZSB1bmNvbXByZXNzZWQgYXVkaW8gKi8KKyAgICAgIGVudHJ5LT5ieXRlc19wZXJfc2FtcGxlID0gc2FtcGxlc2l6ZSAvIDg7CisgICAgICBlbnRyeS0+c2FtcGxlc19wZXJfZnJhbWUgPSBlbnRyeS0+bl9jaGFubmVsczsKKyAgICAgIGVudHJ5LT5ieXRlc19wZXJfZnJhbWUgPSBlbnRyeS0+bl9jaGFubmVscyAqIGVudHJ5LT5ieXRlc19wZXJfc2FtcGxlOworICAgICAgZW50cnktPnNhbXBsZXNfcGVyX3BhY2tldCA9IGVudHJ5LT5zYW1wbGVzX3Blcl9mcmFtZTsKKyAgICAgIGVudHJ5LT5ieXRlc19wZXJfcGFja2V0ID0gZW50cnktPmJ5dGVzX3Blcl9zYW1wbGU7CisKKyAgICAgIG9mZnNldCA9IDM2OworICAgICAgc3dpdGNoIChmb3VyY2MpIHsKKyAgICAgICAgICAvKiBZZXMsIHRoZXNlIGhhdmUgdG8gYmUgaGFyZC1jb2RlZCAqLworICAgICAgICBjYXNlIEZPVVJDQ19NQUM2OgorICAgICAgICB7CisgICAgICAgICAgZW50cnktPnNhbXBsZXNfcGVyX3BhY2tldCA9IDY7CisgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9wYWNrZXQgPSAxOworICAgICAgICAgIGVudHJ5LT5ieXRlc19wZXJfZnJhbWUgPSAxICogZW50cnktPm5fY2hhbm5lbHM7CisgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9zYW1wbGUgPSAxOworICAgICAgICAgIGVudHJ5LT5zYW1wbGVzX3Blcl9mcmFtZSA9IDYgKiBlbnRyeS0+bl9jaGFubmVsczsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQ19NQUMzOgorICAgICAgICB7CisgICAgICAgICAgZW50cnktPnNhbXBsZXNfcGVyX3BhY2tldCA9IDM7CisgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9wYWNrZXQgPSAxOworICAgICAgICAgIGVudHJ5LT5ieXRlc19wZXJfZnJhbWUgPSAxICogZW50cnktPm5fY2hhbm5lbHM7CisgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9zYW1wbGUgPSAxOworICAgICAgICAgIGVudHJ5LT5zYW1wbGVzX3Blcl9mcmFtZSA9IDMgKiBlbnRyeS0+bl9jaGFubmVsczsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQ19pbWE0OgorICAgICAgICB7CisgICAgICAgICAgZW50cnktPnNhbXBsZXNfcGVyX3BhY2tldCA9IDY0OworICAgICAgICAgIGVudHJ5LT5ieXRlc19wZXJfcGFja2V0ID0gMzQ7CisgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9mcmFtZSA9IDM0ICogZW50cnktPm5fY2hhbm5lbHM7CisgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9zYW1wbGUgPSAyOworICAgICAgICAgIGVudHJ5LT5zYW1wbGVzX3Blcl9mcmFtZSA9IDY0ICogZW50cnktPm5fY2hhbm5lbHM7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0NfdWxhdzoKKyAgICAgICAgY2FzZSBGT1VSQ0NfYWxhdzoKKyAgICAgICAgeworICAgICAgICAgIGVudHJ5LT5zYW1wbGVzX3Blcl9wYWNrZXQgPSAxOworICAgICAgICAgIGVudHJ5LT5ieXRlc19wZXJfcGFja2V0ID0gMTsKKyAgICAgICAgICBlbnRyeS0+Ynl0ZXNfcGVyX2ZyYW1lID0gMSAqIGVudHJ5LT5uX2NoYW5uZWxzOworICAgICAgICAgIGVudHJ5LT5ieXRlc19wZXJfc2FtcGxlID0gMTsKKyAgICAgICAgICBlbnRyeS0+c2FtcGxlc19wZXJfZnJhbWUgPSAxICogZW50cnktPm5fY2hhbm5lbHM7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0NfYWdzbToKKyAgICAgICAgeworICAgICAgICAgIGVudHJ5LT5zYW1wbGVzX3Blcl9wYWNrZXQgPSAxNjA7CisgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9wYWNrZXQgPSAzMzsKKyAgICAgICAgICBlbnRyeS0+Ynl0ZXNfcGVyX2ZyYW1lID0gMzMgKiBlbnRyeS0+bl9jaGFubmVsczsKKyAgICAgICAgICBlbnRyeS0+Ynl0ZXNfcGVyX3NhbXBsZSA9IDI7CisgICAgICAgICAgZW50cnktPnNhbXBsZXNfcGVyX2ZyYW1lID0gMTYwICogZW50cnktPm5fY2hhbm5lbHM7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKHZlcnNpb24gPT0gMHgwMDAxMDAwMCkgeworICAgICAgICAvKiBzYW1wbGUgZGVzY3JpcHRpb24gZW50cnkgKDE2KSArIHNvdW5kIHNhbXBsZSBkZXNjcmlwdGlvbiB2MSAoMjArMTYpICovCisgICAgICAgIGlmIChsZW4gPCA1MikKKyAgICAgICAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICAgICAgICBzd2l0Y2ggKGZvdXJjYykgeworICAgICAgICAgIGNhc2UgRk9VUkNDX3R3b3M6CisgICAgICAgICAgY2FzZSBGT1VSQ0Nfc293dDoKKyAgICAgICAgICBjYXNlIEZPVVJDQ19yYXdfOgorICAgICAgICAgIGNhc2UgRk9VUkNDX2xwY206CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG9ubHkgcGFyc2UgZXh0cmEgZGVjb2RpbmcgY29uZmlnIGZvciBub24tcGNtIGF1ZGlvICovCisgICAgICAgICAgICBlbnRyeS0+c2FtcGxlc19wZXJfcGFja2V0ID0gUVRfVUlOVDMyIChzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQpOworICAgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9wYWNrZXQgPSBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDQpOworICAgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9mcmFtZSA9IFFUX1VJTlQzMiAoc3RzZF9lbnRyeV9kYXRhICsgb2Zmc2V0ICsgOCk7CisgICAgICAgICAgICBlbnRyeS0+Ynl0ZXNfcGVyX3NhbXBsZSA9IFFUX1VJTlQzMiAoc3RzZF9lbnRyeV9kYXRhICsgb2Zmc2V0ICsgMTIpOworCisgICAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgInNhbXBsZXMvcGFja2V0OiAgICVkIiwKKyAgICAgICAgICAgICAgICBlbnRyeS0+c2FtcGxlc19wZXJfcGFja2V0KTsKKyAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiYnl0ZXMvcGFja2V0OiAgICAgJWQiLAorICAgICAgICAgICAgICAgIGVudHJ5LT5ieXRlc19wZXJfcGFja2V0KTsKKyAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiYnl0ZXMvZnJhbWU6ICAgICAgJWQiLAorICAgICAgICAgICAgICAgIGVudHJ5LT5ieXRlc19wZXJfZnJhbWUpOworICAgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJieXRlcy9zYW1wbGU6ICAgICAlZCIsCisgICAgICAgICAgICAgICAgZW50cnktPmJ5dGVzX3Blcl9zYW1wbGUpOworCisgICAgICAgICAgICBpZiAoIWVudHJ5LT5zYW1wbGVkICYmIGVudHJ5LT5ieXRlc19wZXJfcGFja2V0KSB7CisgICAgICAgICAgICAgIGVudHJ5LT5zYW1wbGVzX3Blcl9mcmFtZSA9IChlbnRyeS0+Ynl0ZXNfcGVyX2ZyYW1lIC8KKyAgICAgICAgICAgICAgICAgIGVudHJ5LT5ieXRlc19wZXJfcGFja2V0KSAqIGVudHJ5LT5zYW1wbGVzX3Blcl9wYWNrZXQ7CisgICAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAic2FtcGxlcy9mcmFtZTogICAgJWQiLAorICAgICAgICAgICAgICAgICAgZW50cnktPnNhbXBsZXNfcGVyX2ZyYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDB4MDAwMjAwMDApIHsKKyAgICAgICAgdW5pb24KKyAgICAgICAgeworICAgICAgICAgIGdkb3VibGUgZnA7CisgICAgICAgICAgZ3VpbnQ2NCB2YWw7CisgICAgICAgIH0gcXRmcDsKKworICAgICAgICAvKiBzYW1wbGUgZGVzY3JpcHRpb24gZW50cnkgKDE2KSArIHNvdW5kIHNhbXBsZSBkZXNjcmlwdGlvbiB2MiAoNTYpICovCisgICAgICAgIGlmIChsZW4gPCA3MikKKyAgICAgICAgICBnb3RvIGNvcnJ1cHRfZmlsZTsKKworICAgICAgICBxdGZwLnZhbCA9IFFUX1VJTlQ2NCAoc3RzZF9lbnRyeV9kYXRhICsgb2Zmc2V0ICsgNCk7CisgICAgICAgIGVudHJ5LT5yYXRlID0gcXRmcC5mcDsKKyAgICAgICAgZW50cnktPm5fY2hhbm5lbHMgPSBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDEyKTsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIlNvdW5kIHNhbXBsZSBkZXNjcmlwdGlvbiBWZXJzaW9uIDIiKTsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJzYW1wbGUgcmF0ZTogICAgICAgICVnIiwgZW50cnktPnJhdGUpOworICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIm5fY2hhbm5lbHM6ICAgICAgICAgJWQiLCBlbnRyeS0+bl9jaGFubmVscyk7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiYml0cy9jaGFubmVsOiAgICAgICAlZCIsCisgICAgICAgICAgICBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDIwKSk7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiZm9ybWF0IGZsYWdzOiAgICAgICAlWCIsCisgICAgICAgICAgICBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDI0KSk7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiYnl0ZXMvcGFja2V0OiAgICAgICAlZCIsCisgICAgICAgICAgICBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDI4KSk7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiTFBDTSBmcmFtZXMvcGFja2V0OiAlZCIsCisgICAgICAgICAgICBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSArIG9mZnNldCArIDMyKSk7CisgICAgICB9IGVsc2UgaWYgKHZlcnNpb24gIT0gMHgwMDAwMCkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJ1bmtub3duIGF1ZGlvIFNUU0QgdmVyc2lvbiAlMDh4IiwKKyAgICAgICAgICAgIHZlcnNpb24pOworICAgICAgfQorCisgICAgICBpZiAoZW50cnktPmNhcHMpCisgICAgICAgIGdzdF9jYXBzX3VucmVmIChlbnRyeS0+Y2Fwcyk7CisKKyAgICAgIGVudHJ5LT5jYXBzID0gcXRkZW11eF9hdWRpb19jYXBzIChxdGRlbXV4LCBzdHJlYW0sIGVudHJ5LCBmb3VyY2MsCisgICAgICAgICAgc3RzZF9lbnRyeV9kYXRhICsgMzIsIGxlbiAtIDE2LCAmY29kZWMpOworCisgICAgICBzd2l0Y2ggKGZvdXJjYykgeworICAgICAgICBjYXNlIEZPVVJDQ19pbjI0OgorICAgICAgICB7CisgICAgICAgICAgR05vZGUgKmVuZGE7CisgICAgICAgICAgR05vZGUgKmluMjQ7CisKKyAgICAgICAgICBpbjI0ID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChzdHNkLCBGT1VSQ0NfaW4yNCk7CisKKyAgICAgICAgICBlbmRhID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChpbjI0LCBGT1VSQ0NfZW5kYSk7CisgICAgICAgICAgaWYgKCFlbmRhKSB7CisgICAgICAgICAgICB3YXZlID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChpbjI0LCBGT1VSQ0Nfd2F2ZSk7CisgICAgICAgICAgICBpZiAod2F2ZSkKKyAgICAgICAgICAgICAgZW5kYSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAod2F2ZSwgRk9VUkNDX2VuZGEpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZW5kYSkgeworICAgICAgICAgICAgaW50IGVuZGFfdmFsdWUgPSBRVF9VSU5UMTYgKChndWludDggKikgZW5kYS0+ZGF0YSArIDgpOworICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsIChlbmRhX3ZhbHVlKSA/ICJTMjRMRSIgOiAiUzI0QkUiLAorICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQ19vd21hOgorICAgICAgICB7CisgICAgICAgICAgY29uc3QgZ3VpbnQ4ICpvd21hX2RhdGE7CisgICAgICAgICAgY29uc3QgZ2NoYXIgKmNvZGVjX25hbWUgPSBOVUxMOworICAgICAgICAgIGd1aW50IG93bWFfbGVuOworICAgICAgICAgIEdzdEJ1ZmZlciAqYnVmOworICAgICAgICAgIGdpbnQgdmVyc2lvbiA9IDE7CisgICAgICAgICAgLyogZnJvbSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZGQ3NTc3MjAoVlMuODUpLmFzcHggKi8KKyAgICAgICAgICAvKiBGSVhNRSB0aGlzIHNob3VsZCBhbHNvIGJlIGdzdF9yaWZmX3N0cmZfYXVkcywKKyAgICAgICAgICAgKiBidXQgdGhlIGxhdHRlciBvbmUgaXMgYWN0dWFsbHkgbWlzc2luZyBiaXRzLXBlci1zYW1wbGUgOiggKi8KKyAgICAgICAgICB0eXBlZGVmIHN0cnVjdAorICAgICAgICAgIHsKKyAgICAgICAgICAgIGdpbnQxNiB3Rm9ybWF0VGFnOworICAgICAgICAgICAgZ2ludDE2IG5DaGFubmVsczsKKyAgICAgICAgICAgIGdpbnQzMiBuU2FtcGxlc1BlclNlYzsKKyAgICAgICAgICAgIGdpbnQzMiBuQXZnQnl0ZXNQZXJTZWM7CisgICAgICAgICAgICBnaW50MTYgbkJsb2NrQWxpZ247CisgICAgICAgICAgICBnaW50MTYgd0JpdHNQZXJTYW1wbGU7CisgICAgICAgICAgICBnaW50MTYgY2JTaXplOworICAgICAgICAgIH0gV0FWRUZPUk1BVEVYOworICAgICAgICAgIFdBVkVGT1JNQVRFWCAqd2ZleDsKKworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJwYXJzZSBvd21hIik7CisgICAgICAgICAgb3dtYV9kYXRhID0gc3RzZF9lbnRyeV9kYXRhOworICAgICAgICAgIG93bWFfbGVuID0gUVRfVUlOVDMyIChvd21hX2RhdGEpOworICAgICAgICAgIGlmIChvd21hX2xlbiA8PSA1NCkgeworICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAiVG9vIHNtYWxsIG93bWEgaGVhZGVyLCBza2lwcGluZyIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHdmZXggPSAoV0FWRUZPUk1BVEVYICopIChvd21hX2RhdGEgKyAzNik7CisgICAgICAgICAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChvd21hX2xlbiAtIDU0KTsKKyAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgb3dtYV9kYXRhICsgNTQsIG93bWFfbGVuIC0gNTQpOworICAgICAgICAgIGlmICh3ZmV4LT53Rm9ybWF0VGFnID09IDB4MDE2MSkgeworICAgICAgICAgICAgY29kZWNfbmFtZSA9ICJXaW5kb3dzIE1lZGlhIEF1ZGlvIjsKKyAgICAgICAgICAgIHZlcnNpb24gPSAyOworICAgICAgICAgIH0gZWxzZSBpZiAod2ZleC0+d0Zvcm1hdFRhZyA9PSAweDAxNjIpIHsKKyAgICAgICAgICAgIGNvZGVjX25hbWUgPSAiV2luZG93cyBNZWRpYSBBdWRpbyA5IFBybyI7CisgICAgICAgICAgICB2ZXJzaW9uID0gMzsKKyAgICAgICAgICB9IGVsc2UgaWYgKHdmZXgtPndGb3JtYXRUYWcgPT0gMHgwMTYzKSB7CisgICAgICAgICAgICBjb2RlY19uYW1lID0gIldpbmRvd3MgTWVkaWEgQXVkaW8gOSBMb3NzbGVzcyI7CisgICAgICAgICAgICAvKiBpcyB0aGF0IGNvcnJlY3Q/IGdzdGZmbXBlZ2NvZGVjbWFwLmMgaXMgbWlzc2luZyBpdCwgYnV0CisgICAgICAgICAgICAgKiBmbHVlbmRvIGNvZGVjIHNlZW1zIHRvIHN1cHBvcnQgaXQgKi8KKyAgICAgICAgICAgIHZlcnNpb24gPSA0OworICAgICAgICAgIH0KKworICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGVudHJ5LT5jYXBzLAorICAgICAgICAgICAgICAiY29kZWNfZGF0YSIsIEdTVF9UWVBFX0JVRkZFUiwgYnVmLAorICAgICAgICAgICAgICAid21hdmVyc2lvbiIsIEdfVFlQRV9JTlQsIHZlcnNpb24sCisgICAgICAgICAgICAgICJibG9ja19hbGlnbiIsIEdfVFlQRV9JTlQsCisgICAgICAgICAgICAgIEdTVF9SRUFEX1VJTlQxNl9MRSAoJndmZXgtPm5CbG9ja0FsaWduKSwgImJpdHJhdGUiLCBHX1RZUEVfSU5ULAorICAgICAgICAgICAgICBHU1RfUkVBRF9VSU5UMzJfTEUgKCZ3ZmV4LT5uQXZnQnl0ZXNQZXJTZWMpLCAid2lkdGgiLCBHX1RZUEVfSU5ULAorICAgICAgICAgICAgICBHU1RfUkVBRF9VSU5UMTZfTEUgKCZ3ZmV4LT53Qml0c1BlclNhbXBsZSksICJkZXB0aCIsIEdfVFlQRV9JTlQsCisgICAgICAgICAgICAgIEdTVF9SRUFEX1VJTlQxNl9MRSAoJndmZXgtPndCaXRzUGVyU2FtcGxlKSwgTlVMTCk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAgICAgICAgIGlmIChjb2RlY19uYW1lKSB7CisgICAgICAgICAgICBnX2ZyZWUgKGNvZGVjKTsKKyAgICAgICAgICAgIGNvZGVjID0gZ19zdHJkdXAgKGNvZGVjX25hbWUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQ193bWFfOgorICAgICAgICB7CisgICAgICAgICAgZ2ludCBsZW4gPSBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSkgLSBvZmZzZXQ7CisgICAgICAgICAgY29uc3QgZ3VpbnQ4ICp3ZmV4X2RhdGEgPSBzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQ7CisgICAgICAgICAgY29uc3QgZ2NoYXIgKmNvZGVjX25hbWUgPSBOVUxMOworICAgICAgICAgIGdpbnQgdmVyc2lvbiA9IDE7CisgICAgICAgICAgLyogZnJvbSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZGQ3NTc3MjAoVlMuODUpLmFzcHggKi8KKyAgICAgICAgICAvKiBGSVhNRSB0aGlzIHNob3VsZCBhbHNvIGJlIGdzdF9yaWZmX3N0cmZfYXVkcywKKyAgICAgICAgICAgKiBidXQgdGhlIGxhdHRlciBvbmUgaXMgYWN0dWFsbHkgbWlzc2luZyBiaXRzLXBlci1zYW1wbGUgOiggKi8KKyAgICAgICAgICB0eXBlZGVmIHN0cnVjdAorICAgICAgICAgIHsKKyAgICAgICAgICAgIGdpbnQxNiB3Rm9ybWF0VGFnOworICAgICAgICAgICAgZ2ludDE2IG5DaGFubmVsczsKKyAgICAgICAgICAgIGdpbnQzMiBuU2FtcGxlc1BlclNlYzsKKyAgICAgICAgICAgIGdpbnQzMiBuQXZnQnl0ZXNQZXJTZWM7CisgICAgICAgICAgICBnaW50MTYgbkJsb2NrQWxpZ247CisgICAgICAgICAgICBnaW50MTYgd0JpdHNQZXJTYW1wbGU7CisgICAgICAgICAgICBnaW50MTYgY2JTaXplOworICAgICAgICAgIH0gV0FWRUZPUk1BVEVYOworICAgICAgICAgIFdBVkVGT1JNQVRFWCB3ZmV4OworCisgICAgICAgICAgLyogRklYTUU6IHVuaWZ5IHdpdGggc2ltaWxhciB3YXZmb3JtYXRleCBwYXJzaW5nIGNvZGUgYWJvdmUgKi8KKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicGFyc2Ugd21hLCBsb29raW5nIGZvciB3ZmV4Iik7CisKKyAgICAgICAgICAvKiBmaW5kIHdmZXggKi8KKyAgICAgICAgICB3aGlsZSAobGVuID49IDgpIHsKKyAgICAgICAgICAgIGdpbnQgc2l6ZTsKKworICAgICAgICAgICAgaWYgKFFUX1VJTlQzMiAod2ZleF9kYXRhKSA8PSBsZW4pCisgICAgICAgICAgICAgIHNpemUgPSBRVF9VSU5UMzIgKHdmZXhfZGF0YSkgLSA4OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBzaXplID0gbGVuIC0gODsKKworICAgICAgICAgICAgaWYgKHNpemUgPCAxKQorICAgICAgICAgICAgICAvKiBObyByZWFsIGRhdGEsIHNvIGJyZWFrIG91dCAqLworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgc3dpdGNoIChRVF9GT1VSQ0MgKHdmZXhfZGF0YSArIDQpKSB7CisgICAgICAgICAgICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgndycsICdmJywgJ2UnLCAneCcpOgorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZvdW5kIHdmZXggaW4gc3RzZCIpOworCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCA4ICsgMTgpCisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIHdmZXgud0Zvcm1hdFRhZyA9IEdTVF9SRUFEX1VJTlQxNl9MRSAod2ZleF9kYXRhICsgOCArIDApOworICAgICAgICAgICAgICAgIHdmZXgubkNoYW5uZWxzID0gR1NUX1JFQURfVUlOVDE2X0xFICh3ZmV4X2RhdGEgKyA4ICsgMik7CisgICAgICAgICAgICAgICAgd2ZleC5uU2FtcGxlc1BlclNlYyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAod2ZleF9kYXRhICsgOCArIDQpOworICAgICAgICAgICAgICAgIHdmZXgubkF2Z0J5dGVzUGVyU2VjID0gR1NUX1JFQURfVUlOVDMyX0xFICh3ZmV4X2RhdGEgKyA4ICsgOCk7CisgICAgICAgICAgICAgICAgd2ZleC5uQmxvY2tBbGlnbiA9IEdTVF9SRUFEX1VJTlQxNl9MRSAod2ZleF9kYXRhICsgOCArIDEyKTsKKyAgICAgICAgICAgICAgICB3ZmV4LndCaXRzUGVyU2FtcGxlID0gR1NUX1JFQURfVUlOVDE2X0xFICh3ZmV4X2RhdGEgKyA4ICsgMTQpOworICAgICAgICAgICAgICAgIHdmZXguY2JTaXplID0gR1NUX1JFQURfVUlOVDE2X0xFICh3ZmV4X2RhdGEgKyA4ICsgMTYpOworCisgICAgICAgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJGb3VuZCB3ZmV4IGJveCBpbiBzdHNkOiIpOworICAgICAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiRm9ybWF0VGFnID0gMHglMDR4LCBDaGFubmVscyA9ICV1LCAiCisgICAgICAgICAgICAgICAgICAgICJTYW1wbGVzUGVyU2VjID0gJXUsIEF2Z0J5dGVzUGVyU2VjID0gJXUsIEJsb2NrQWxpZ24gPSAldSwgIgorICAgICAgICAgICAgICAgICAgICAiQml0c1BlclNhbXBsZSA9ICV1LCBTaXplID0gJXUiLCB3ZmV4LndGb3JtYXRUYWcsCisgICAgICAgICAgICAgICAgICAgIHdmZXgubkNoYW5uZWxzLCB3ZmV4Lm5TYW1wbGVzUGVyU2VjLCB3ZmV4Lm5BdmdCeXRlc1BlclNlYywKKyAgICAgICAgICAgICAgICAgICAgd2ZleC5uQmxvY2tBbGlnbiwgd2ZleC53Qml0c1BlclNhbXBsZSwgd2ZleC5jYlNpemUpOworCisgICAgICAgICAgICAgICAgaWYgKHdmZXgud0Zvcm1hdFRhZyA9PSAweDAxNjEpIHsKKyAgICAgICAgICAgICAgICAgIGNvZGVjX25hbWUgPSAiV2luZG93cyBNZWRpYSBBdWRpbyI7CisgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdmZXgud0Zvcm1hdFRhZyA9PSAweDAxNjIpIHsKKyAgICAgICAgICAgICAgICAgIGNvZGVjX25hbWUgPSAiV2luZG93cyBNZWRpYSBBdWRpbyA5IFBybyI7CisgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdmZXgud0Zvcm1hdFRhZyA9PSAweDAxNjMpIHsKKyAgICAgICAgICAgICAgICAgIGNvZGVjX25hbWUgPSAiV2luZG93cyBNZWRpYSBBdWRpbyA5IExvc3NsZXNzIjsKKyAgICAgICAgICAgICAgICAgIC8qIGlzIHRoYXQgY29ycmVjdD8gZ3N0ZmZtcGVnY29kZWNtYXAuYyBpcyBtaXNzaW5nIGl0LCBidXQKKyAgICAgICAgICAgICAgICAgICAqIGZsdWVuZG8gY29kZWMgc2VlbXMgdG8gc3VwcG9ydCBpdCAqLworICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IDQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgICAgICJ3bWF2ZXJzaW9uIiwgR19UWVBFX0lOVCwgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgImJsb2NrX2FsaWduIiwgR19UWVBFX0lOVCwgd2ZleC5uQmxvY2tBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgImJpdHJhdGUiLCBHX1RZUEVfSU5ULCB3ZmV4Lm5BdmdCeXRlc1BlclNlYywKKyAgICAgICAgICAgICAgICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgd2ZleC53Qml0c1BlclNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgImRlcHRoIiwgR19UWVBFX0lOVCwgd2ZleC53Qml0c1BlclNhbXBsZSwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IHdmZXguY2JTaXplKSB7CisgICAgICAgICAgICAgICAgICBHc3RCdWZmZXIgKmJ1ZjsKKworICAgICAgICAgICAgICAgICAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplIC0gd2ZleC5jYlNpemUpOworICAgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIHdmZXhfZGF0YSArIDggKyB3ZmV4LmNiU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplIC0gd2ZleC5jYlNpemUpOworICAgICAgICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgICAgICAgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZiwgTlVMTCk7CisgICAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJubyBjb2RlYyBkYXRhIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGNvZGVjX25hbWUpIHsKKyAgICAgICAgICAgICAgICAgIGdfZnJlZSAoY29kZWMpOworICAgICAgICAgICAgICAgICAgY29kZWMgPSBnX3N0cmR1cCAoY29kZWNfbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW4gLT0gc2l6ZSArIDg7CisgICAgICAgICAgICB3ZmV4X2RhdGEgKz0gc2l6ZSArIDg7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDX29wdXM6CisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBndWludDggKm9wdXNfZGF0YTsKKyAgICAgICAgICBndWludDggKmNoYW5uZWxfbWFwcGluZyA9IE5VTEw7CisgICAgICAgICAgZ3VpbnQzMiByYXRlOworICAgICAgICAgIGd1aW50OCBjaGFubmVsczsKKyAgICAgICAgICBndWludDggY2hhbm5lbF9tYXBwaW5nX2ZhbWlseTsKKyAgICAgICAgICBndWludDggc3RyZWFtX2NvdW50OworICAgICAgICAgIGd1aW50OCBjb3VwbGVkX2NvdW50OworICAgICAgICAgIGd1aW50OCBpOworCisgICAgICAgICAgb3B1c19kYXRhID0gc3RzZF9lbnRyeV9kYXRhOworCisgICAgICAgICAgY2hhbm5lbHMgPSBHU1RfUkVBRF9VSU5UOCAob3B1c19kYXRhICsgNDUpOworICAgICAgICAgIHJhdGUgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKG9wdXNfZGF0YSArIDQ4KTsKKyAgICAgICAgICBjaGFubmVsX21hcHBpbmdfZmFtaWx5ID0gR1NUX1JFQURfVUlOVDggKG9wdXNfZGF0YSArIDU0KTsKKyAgICAgICAgICBzdHJlYW1fY291bnQgPSBHU1RfUkVBRF9VSU5UOCAob3B1c19kYXRhICsgNTUpOworICAgICAgICAgIGNvdXBsZWRfY291bnQgPSBHU1RfUkVBRF9VSU5UOCAob3B1c19kYXRhICsgNTYpOworCisgICAgICAgICAgaWYgKGNoYW5uZWxzID4gMCkgeworICAgICAgICAgICAgY2hhbm5lbF9tYXBwaW5nID0gZ19tYWxsb2MgKGNoYW5uZWxzICogc2l6ZW9mIChndWludDgpKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKQorICAgICAgICAgICAgICBjaGFubmVsX21hcHBpbmdbaV0gPSBHU1RfUkVBRF9VSU5UOCAob3B1c19kYXRhICsgaSArIDU3KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBlbnRyeS0+Y2FwcyA9IGdzdF9jb2RlY191dGlsc19vcHVzX2NyZWF0ZV9jYXBzIChyYXRlLCBjaGFubmVscywKKyAgICAgICAgICAgICAgY2hhbm5lbF9tYXBwaW5nX2ZhbWlseSwgc3RyZWFtX2NvdW50LCBjb3VwbGVkX2NvdW50LAorICAgICAgICAgICAgICBjaGFubmVsX21hcHBpbmcpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChjb2RlYykgeworICAgICAgICBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgICAgIGdpbnQgYml0cmF0ZSA9IDA7CisKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAoc3RyZWFtLT5zdHJlYW1fdGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICAgICAgR1NUX1RBR19BVURJT19DT0RFQywgY29kZWMsIE5VTEwpOworICAgICAgICBnX2ZyZWUgKGNvZGVjKTsKKyAgICAgICAgY29kZWMgPSBOVUxMOworCisgICAgICAgIC8qIHNvbWUgYml0cmF0ZSBpbmZvIG1heSBoYXZlIGVuZGVkIHVwIGluIGNhcHMgKi8KKyAgICAgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGVudHJ5LT5jYXBzLCAwKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAiYml0cmF0ZSIsICZiaXRyYXRlKTsKKyAgICAgICAgaWYgKGJpdHJhdGUgPiAwKQorICAgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHN0cmVhbS0+c3RyZWFtX3RhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgICAgICAgICAgR1NUX1RBR19CSVRSQVRFLCBiaXRyYXRlLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgbXA0YSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfaW5kZXggKHN0c2QsIHN0c2RfaW5kZXgpOworICAgICAgaWYgKCFzdHJlYW0tPnByb3RlY3RlZCkgeworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKFFUREVNVVhfVFJFRV9OT0RFX0ZPVVJDQyAobXA0dikgIT0gRk9VUkNDX2VuY3YpIHsKKyAgICAgICAgICBtcDR2ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHN0cmVhbS0+cHJvdGVjdGVkICYmIGZvdXJjYyA9PSBGT1VSQ0NfbXA0YSkgeworICAgICAgICBpZiAoUVRERU1VWF9UUkVFX05PREVfRk9VUkNDIChtcDRhKSAhPSBGT1VSQ0NfZW5jYSkgeworICAgICAgICAgIG1wNGEgPSBOVUxMOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoUVRERU1VWF9UUkVFX05PREVfRk9VUkNDIChtcDRhKSAhPSBGT1VSQ0NfbXA0YSkgeworICAgICAgICAgIG1wNGEgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHdhdmUgPSBOVUxMOworICAgICAgZXNkcyA9IE5VTEw7CisgICAgICBpZiAobXA0YSkgeworICAgICAgICB3YXZlID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChtcDRhLCBGT1VSQ0Nfd2F2ZSk7CisgICAgICAgIGlmICh3YXZlKQorICAgICAgICAgIGVzZHMgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHdhdmUsIEZPVVJDQ19lc2RzKTsKKyAgICAgICAgaWYgKCFlc2RzKQorICAgICAgICAgIGVzZHMgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG1wNGEsIEZPVVJDQ19lc2RzKTsKKyAgICAgIH0KKworCisgICAgICAvKiBJZiB0aGUgZm91cmNjJ3MgYm90dG9tIDE2IGJpdHMgZ2l2ZXMgJ3NtJywgdGhlbiB0aGUgdG9wCisgICAgICAgICAxNiBiaXRzIGlzIGEgYnl0ZS1zd2FwcGVkIHdhdmUtc3R5bGUgY29kZWMgaWRlbnRpZmllciwKKyAgICAgICAgIGFuZCB3ZSBjYW4gZmluZCBhIFdBVkUgaGVhZGVyIGludGVybmFsbHkgdG8gYSAnd2F2ZScgYXRvbSBoZXJlLgorICAgICAgICAgVGhpcyBjYW4gbW9yZSBjbGVhcmx5IGJlIHRob3VnaHQgb2YgYXMgJ21zJyBhcyB0aGUgdG9wIDE2IGJpdHMsIGFuZCBhCisgICAgICAgICBjb2RlYyBpZCBhcyB0aGUgYm90dG9tIDE2IGJpdHMgLSBidXQgYnl0ZS1zd2FwcGVkIHRvIHN0b3JlIGluIFFUICh3aGljaAorICAgICAgICAgaXMgYmlnLWVuZGlhbikuCisgICAgICAgKi8KKyAgICAgIGlmICgoZm91cmNjICYgMHhmZmZmKSA9PSAoKCdzJyA8PCA4KSB8ICdtJykpIHsKKyAgICAgICAgaWYgKGxlbiA8IG9mZnNldCArIDIwKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAiTm8gd2F2ZSBhdG9tIGluIE1TLXN0eWxlIGF1ZGlvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3VpbnQzMiBkYXRhbGVuID0gUVRfVUlOVDMyIChzdHNkX2VudHJ5X2RhdGEgKyBvZmZzZXQgKyAxNik7CisgICAgICAgICAgY29uc3QgZ3VpbnQ4ICpkYXRhID0gc3RzZF9lbnRyeV9kYXRhICsgb2Zmc2V0ICsgMTY7CisgICAgICAgICAgR05vZGUgKndhdmVub2RlOworICAgICAgICAgIEdOb2RlICp3YXZlaGVhZGVybm9kZTsKKworICAgICAgICAgIHdhdmVub2RlID0gZ19ub2RlX25ldyAoKGd1aW50OCAqKSBkYXRhKTsKKyAgICAgICAgICBpZiAocXRkZW11eF9wYXJzZV9ub2RlIChxdGRlbXV4LCB3YXZlbm9kZSwgZGF0YSwgZGF0YWxlbikpIHsKKyAgICAgICAgICAgIGNvbnN0IGd1aW50OCAqd2F2ZWhlYWRlcjsKKyAgICAgICAgICAgIGd1aW50MzIgaGVhZGVybGVuOworCisgICAgICAgICAgICB3YXZlaGVhZGVybm9kZSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAod2F2ZW5vZGUsIGZvdXJjYyk7CisgICAgICAgICAgICBpZiAod2F2ZWhlYWRlcm5vZGUpIHsKKyAgICAgICAgICAgICAgd2F2ZWhlYWRlciA9IChjb25zdCBndWludDggKikgd2F2ZWhlYWRlcm5vZGUtPmRhdGE7CisgICAgICAgICAgICAgIGhlYWRlcmxlbiA9IFFUX1VJTlQzMiAod2F2ZWhlYWRlcik7CisKKyAgICAgICAgICAgICAgaWYgKGhlYWRlcmxlbiA+IDgpIHsKKyAgICAgICAgICAgICAgICBnc3RfcmlmZl9zdHJmX2F1ZHMgKmhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgR3N0QnVmZmVyICpoZWFkZXJidWY7CisgICAgICAgICAgICAgICAgR3N0QnVmZmVyICpleHRyYTsKKworICAgICAgICAgICAgICAgIHdhdmVoZWFkZXIgKz0gODsKKyAgICAgICAgICAgICAgICBoZWFkZXJsZW4gLT0gODsKKworICAgICAgICAgICAgICAgIGhlYWRlcmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoaGVhZGVybGVuKTsKKyAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGhlYWRlcmJ1ZiwgMCwgd2F2ZWhlYWRlciwgaGVhZGVybGVuKTsKKworICAgICAgICAgICAgICAgIGlmIChnc3RfcmlmZl9wYXJzZV9zdHJmX2F1ZHMgKEdTVF9FTEVNRU5UX0NBU1QgKHF0ZGVtdXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyYnVmLCAmaGVhZGVyLCAmZXh0cmEpKSB7CisgICAgICAgICAgICAgICAgICBnc3RfY2Fwc191bnJlZiAoZW50cnktPmNhcHMpOworICAgICAgICAgICAgICAgICAgLyogRklYTUU6IE5lZWQgdG8gZG8gc29tZXRoaW5nIHdpdGggdGhlIGNoYW5uZWwgcmVvcmRlciBtYXAgKi8KKyAgICAgICAgICAgICAgICAgIGVudHJ5LT5jYXBzID0KKyAgICAgICAgICAgICAgICAgICAgICBnc3RfcmlmZl9jcmVhdGVfYXVkaW9fY2FwcyAoaGVhZGVyLT5mb3JtYXQsIE5VTEwsIGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICBleHRyYSwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChleHRyYSkKKyAgICAgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoZXh0cmEpOworICAgICAgICAgICAgICAgICAgZ19mcmVlIChoZWFkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgIEdTVF9ERUJVRyAoIkRpZG4ndCBmaW5kIHdhdmVoZWFkZXJub2RlIGZvciB0aGlzIGNvZGVjIik7CisgICAgICAgICAgfQorICAgICAgICAgIGdfbm9kZV9kZXN0cm95ICh3YXZlbm9kZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoZXNkcykgeworICAgICAgICBnc3RfcXRkZW11eF9oYW5kbGVfZXNkcyAocXRkZW11eCwgc3RyZWFtLCBlbnRyeSwgZXNkcywKKyAgICAgICAgICAgIHN0cmVhbS0+c3RyZWFtX3RhZ3MpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChmb3VyY2MpIHsKKyNpZiAwCisgICAgICAgICAgICAvKiBGSVhNRTogd2hhdCBpcyBpbiB0aGUgY2h1bms/ICovCisgICAgICAgICAgY2FzZSBGT1VSQ0NfUURNQzoKKyAgICAgICAgICB7CisgICAgICAgICAgICBnaW50IGxlbiA9IFFUX1VJTlQzMiAoc3RzZF9kYXRhKTsKKworICAgICAgICAgICAgLyogc2VlbXMgdG8gYmUgYWx3YXlzID0gMTE2ID0gMHg3NCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgY2FzZSBGT1VSQ0NfUURNMjoKKyAgICAgICAgICB7CisgICAgICAgICAgICBnaW50IGxlbiA9IFFUX1VJTlQzMiAoc3RzZF9lbnRyeV9kYXRhKTsKKworICAgICAgICAgICAgaWYgKGxlbiA+IDB4M0MpIHsKKyAgICAgICAgICAgICAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGxlbiAtIDB4M0MpOworCisgICAgICAgICAgICAgIGdzdF9idWZmZXJfZmlsbCAoYnVmLCAwLCBzdHNkX2VudHJ5X2RhdGEgKyAweDNDLCBsZW4gLSAweDNDKTsKKyAgICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgICAiY29kZWNfZGF0YSIsIEdTVF9UWVBFX0JVRkZFUiwgYnVmLCBOVUxMKTsKKyAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGVudHJ5LT5jYXBzLAorICAgICAgICAgICAgICAgICJzYW1wbGVzaXplIiwgR19UWVBFX0lOVCwgc2FtcGxlc2l6ZSwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBGT1VSQ0NfYWxhYzoKKyAgICAgICAgICB7CisgICAgICAgICAgICBHTm9kZSAqYWxhYywgKndhdmUgPSBOVUxMOworCisgICAgICAgICAgICAvKiBhcHBhcmVudGx5LCBtNGEgaGFzIHRoaXMgYXRvbSBhcHBlbmRlZCBkaXJlY3RseSBpbiB0aGUgc3RzZCBlbnRyeSwKKyAgICAgICAgICAgICAqIHdoaWxlIG1vdiBoYXMgaXQgaW4gYSB3YXZlIGF0b20gKi8KKyAgICAgICAgICAgIGFsYWMgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHN0c2QsIEZPVVJDQ19hbGFjKTsKKyAgICAgICAgICAgIGlmIChhbGFjKSB7CisgICAgICAgICAgICAgIC8qIGFsYWMgbm93IHJlZmVycyB0byBzdHNkIGVudHJ5IGF0b20gKi8KKyAgICAgICAgICAgICAgd2F2ZSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAoYWxhYywgRk9VUkNDX3dhdmUpOworICAgICAgICAgICAgICBpZiAod2F2ZSkKKyAgICAgICAgICAgICAgICBhbGFjID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlICh3YXZlLCBGT1VSQ0NfYWxhYyk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhbGFjID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChhbGFjLCBGT1VSQ0NfYWxhYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWxhYykgeworICAgICAgICAgICAgICBjb25zdCBndWludDggKmFsYWNfZGF0YSA9IGFsYWMtPmRhdGE7CisgICAgICAgICAgICAgIGdpbnQgbGVuID0gUVRfVUlOVDMyIChhbGFjLT5kYXRhKTsKKyAgICAgICAgICAgICAgR3N0QnVmZmVyICpidWY7CisKKyAgICAgICAgICAgICAgaWYgKGxlbiA8IDM2KSB7CisgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgImRpc2NhcmRpbmcgYWxhYyBhdG9tIHdpdGggdW5leHBlY3RlZCBsZW4gJWQiLCBsZW4pOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGNvZGVjLWRhdGEgY29udGFpbnMgYWxhYyBhdG9tIHNpemUgYW5kIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgKiBmZm1wZWcgbGlrZXMgaXQgdGhhdCB3YXksIG5vdCBxdWl0ZSBnc3QtaXNoIHRob3VnaCAuLi4qLworICAgICAgICAgICAgICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobGVuKTsKKyAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgYWxhYy0+ZGF0YSwgbGVuKTsKKyAgICAgICAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChlbnRyeS0+Y2FwcywKKyAgICAgICAgICAgICAgICAgICAgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZiwgTlVMTCk7CisgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAgICAgICAgICAgICAgIGVudHJ5LT5ieXRlc19wZXJfZnJhbWUgPSBRVF9VSU5UMzIgKGFsYWNfZGF0YSArIDEyKTsKKyAgICAgICAgICAgICAgICBlbnRyeS0+bl9jaGFubmVscyA9IFFUX1VJTlQ4IChhbGFjX2RhdGEgKyAyMSk7CisgICAgICAgICAgICAgICAgZW50cnktPnJhdGUgPSBRVF9VSU5UMzIgKGFsYWNfZGF0YSArIDMyKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgInNhbXBsZXNpemUiLCBHX1RZUEVfSU5ULCBzYW1wbGVzaXplLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZPVVJDQ19mTGFDOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSBjb2RpbmduYW1lIG9mIHRoZSBzYW1wbGUgZW50cnkgaXMgJ2ZMYUMnICovCisgICAgICAgICAgICBHTm9kZSAqZmxhYyA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAoc3RzZCwgRk9VUkNDX2ZMYUMpOworCisgICAgICAgICAgICBpZiAoZmxhYykgeworICAgICAgICAgICAgICAvKiBUaGUgJ2RmTGEnIGJveCBpcyBhZGRlZCB0byB0aGUgc2FtcGxlIGVudHJ5IHRvIGNvbnZleQorICAgICAgICAgICAgICAgICBpbml0aWFsaXppbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBkZWNvZGVyLiAqLworICAgICAgICAgICAgICBjb25zdCBHTm9kZSAqZGZsYSA9CisgICAgICAgICAgICAgICAgICBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKGZsYWMsIEZPVVJDQ19kZkxhKTsKKworICAgICAgICAgICAgICBpZiAoZGZsYSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuID0gUVRfVUlOVDMyIChkZmxhLT5kYXRhKTsKKworICAgICAgICAgICAgICAgIC8qIE11c3QgY29udGFpbiBhdCBsZWFzdCBkZkxhIGJveCBoZWFkZXIgKDEyKSwKKyAgICAgICAgICAgICAgICAgKiBNRVRBREFUQV9CTE9DS19IRUFERVIgKDQpLCBNRVRBREFUQV9CTE9DS19TVFJFQU1JTkZPICgzNCkgKi8KKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgNTApIHsKKyAgICAgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAgICAgICAgICAgImRpc2NhcmRpbmcgZGZsYSBhdG9tIHdpdGggdW5leHBlY3RlZCBsZW4gJWQiLCBsZW4pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAvKiBza2lwIGRmTGEgaGVhZGVyIHRvIGdldCB0aGUgTUVUQURBVEFfQkxPQ0tzICovCisgICAgICAgICAgICAgICAgICBjb25zdCBndWludDggKm1ldGFkYXRhX2Jsb2NrcyA9IChndWludDggKikgZGZsYS0+ZGF0YSArIDEyOworICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBtZXRhZGF0YV9ibG9ja3NfbGVuID0gbGVuIC0gMTI7CisKKyAgICAgICAgICAgICAgICAgIGdjaGFyICpzdHJlYW1fbWFya2VyID0gZ19zdHJkdXAgKCJmTGFDIik7CisgICAgICAgICAgICAgICAgICBHc3RCdWZmZXIgKmJsb2NrID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoc3RyZWFtX21hcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4gKHN0cmVhbV9tYXJrZXIpKTsKKworICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBpbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICBndWludDMyIHJlbWFpbmRlciA9IDA7CisgICAgICAgICAgICAgICAgICBndWludDMyIGJsb2NrX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgZ2Jvb2xlYW4gaXNfbGFzdCA9IEZBTFNFOworCisgICAgICAgICAgICAgICAgICBHVmFsdWUgYXJyYXkgPSBHX1ZBTFVFX0lOSVQ7CisgICAgICAgICAgICAgICAgICBHVmFsdWUgdmFsdWUgPSBHX1ZBTFVFX0lOSVQ7CisKKyAgICAgICAgICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJmFycmF5LCBHU1RfVFlQRV9BUlJBWSk7CisgICAgICAgICAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZ2YWx1ZSwgR1NUX1RZUEVfQlVGRkVSKTsKKworICAgICAgICAgICAgICAgICAgZ3N0X3ZhbHVlX3NldF9idWZmZXIgKCZ2YWx1ZSwgYmxvY2spOworICAgICAgICAgICAgICAgICAgZ3N0X3ZhbHVlX2FycmF5X2FwcGVuZF92YWx1ZSAoJmFycmF5LCAmdmFsdWUpOworICAgICAgICAgICAgICAgICAgZ192YWx1ZV9yZXNldCAoJnZhbHVlKTsKKworICAgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYmxvY2spOworCisgICAgICAgICAgICAgICAgICAvKiBjaGVjayB0aGVyZSdzIGF0IGxlYXN0IG9uZSBNRVRBREFUQV9CTE9DS19IRUFERVIncyB3b3J0aAorICAgICAgICAgICAgICAgICAgICogb2YgZGF0YSwgYW5kIHdlIGhhdmVuJ3QgYWxyZWFkeSBmaW5pc2hlZCBwYXJzaW5nICovCisgICAgICAgICAgICAgICAgICB3aGlsZSAoIWlzX2xhc3QgJiYgKChpbmRleCArIDMpIDwgbWV0YWRhdGFfYmxvY2tzX2xlbikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyID0gbWV0YWRhdGFfYmxvY2tzX2xlbiAtIGluZGV4OworCisgICAgICAgICAgICAgICAgICAgIC8qIGFkZCB0aGUgTUVUQURBVEFfQkxPQ0tfSEVBREVSIHNpemUgdG8gdGhlIHNpZ25hbGxlZCBzaXplICovCisgICAgICAgICAgICAgICAgICAgIGJsb2NrX3NpemUgPSA0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChtZXRhZGF0YV9ibG9ja3NbaW5kZXggKyAxXSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgKG1ldGFkYXRhX2Jsb2Nrc1tpbmRleCArIDJdIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhX2Jsb2Nrc1tpbmRleCArIDNdOworCisgICAgICAgICAgICAgICAgICAgIC8qIGJlIGNhcmVmdWwgbm90IHRvIHJlYWQgb2ZmIGVuZCBvZiBib3ggKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrX3NpemUgPiByZW1haW5kZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlzX2xhc3QgPSBtZXRhZGF0YV9ibG9ja3NbaW5kZXhdID4+IDc7CisKKyAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGJsb2NrX3NpemUpOworCisgICAgICAgICAgICAgICAgICAgIGdzdF9idWZmZXJfZmlsbCAoYmxvY2ssIDAsICZtZXRhZGF0YV9ibG9ja3NbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgZ3N0X3ZhbHVlX3NldF9idWZmZXIgKCZ2YWx1ZSwgYmxvY2spOworICAgICAgICAgICAgICAgICAgICBnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX3ZhbHVlICgmYXJyYXksICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGdfdmFsdWVfcmVzZXQgKCZ2YWx1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYmxvY2spOworCisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IGJsb2NrX3NpemU7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIC8qIG9ubHkgYXBwZW5kIHRoZSBtZXRhZGF0YSBpZiB3ZSBzdWNjZXNzZnVsbHkgcmVhZCBhbGwgb2YgaXQgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChpc19sYXN0KSB7CisgICAgICAgICAgICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChDVVJfU1RSRUFNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmVhbSktPmNhcHMsIDApLCAic3RyZWFtaGVhZGVyIiwgJmFycmF5KTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkaXNjYXJkaW5nIGFsbCBNRVRBREFUQV9CTE9DS3MgZHVlIHRvIGludmFsaWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgImJsb2NrX3NpemUgJWQgYXQgaWR4ICVkLCByZW0gJWQiLCBibG9ja19zaXplLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlcik7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmYXJyYXkpOworCisgICAgICAgICAgICAgICAgICAvKiBUaGUgc2FtcGxlIHJhdGUgb2J0YWluZWQgZnJvbSB0aGUgc3RzZCBtYXkgbm90IGJlIGFjY3VyYXRlCisgICAgICAgICAgICAgICAgICAgKiBzaW5jZSBpdCBjYW5ub3QgcmVwcmVzZW50IHJhdGVzIGdyZWF0ZXIgdGhhbiA2NTUzNUh6LCBzbworICAgICAgICAgICAgICAgICAgICogb3ZlcnJpZGUgdGhhdCB2YWx1ZSB3aXRoIHRoZSBzYW1wbGUgcmF0ZSBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICogTUVUQURBVEFfQkxPQ0tfU1RSRUFNSU5GTyBibG9jayAqLworICAgICAgICAgICAgICAgICAgQ1VSX1NUUkVBTSAoc3RyZWFtKS0+cmF0ZSA9CisgICAgICAgICAgICAgICAgICAgICAgKFFUX1VJTlQzMiAobWV0YWRhdGFfYmxvY2tzICsgMTQpID4+IDEyKSAmIDB4RkZGRkY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBGT1VSQ0Nfc2F3YjoKKyAgICAgICAgICAgIC8qIEZhbGx0aHJvdWdoISAqLworICAgICAgICAgICAgYW1yd2IgPSBUUlVFOworICAgICAgICAgIGNhc2UgRk9VUkNDX3NhbXI6CisgICAgICAgICAgeworICAgICAgICAgICAgZ2ludCBsZW4gPSBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSk7CisKKyAgICAgICAgICAgIGlmIChsZW4gPiAweDI0KSB7CisgICAgICAgICAgICAgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChsZW4gLSAweDI0KTsKKyAgICAgICAgICAgICAgZ3VpbnQgYml0cmF0ZTsKKworICAgICAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgc3RzZF9lbnRyeV9kYXRhICsgMHgyNCwgbGVuIC0gMHgyNCk7CisKKyAgICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBlbm91Z2ggZGF0YSwgbGV0J3MgdHJ5IHRvIGdldCB0aGUgJ2RhbXInIGF0b20uIFNlZQorICAgICAgICAgICAgICAgKiB0aGUgM0dQUCBjb250YWluZXIgc3BlYyAoMjYuMjQ0KSBmb3IgbW9yZSBkZXRhaWxzLiAqLworICAgICAgICAgICAgICBpZiAoKGxlbiAtIDB4MzQpID4gOCAmJgorICAgICAgICAgICAgICAgICAgKGJpdHJhdGUgPSBxdGRlbXV4X3BhcnNlX2Ftcl9iaXRyYXRlIChidWYsIGFtcndiKSkpIHsKKyAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfYWRkIChzdHJlYW0tPnN0cmVhbV90YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgICAgICAgICAgIEdTVF9UQUdfTUFYSU1VTV9CSVRSQVRFLCBiaXRyYXRlLCBOVUxMKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGVudHJ5LT5jYXBzLAorICAgICAgICAgICAgICAgICAgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZiwgTlVMTCk7CisgICAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBGT1VSQ0NfbXA0YToKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBtcDRhIGF0b20gd2l0aHRvdXQgRVNEUzsgQXR0ZW1wdCB0byBidWlsZCBjb2RlYyBkYXRhIGZyb20gYXRvbSAqLworICAgICAgICAgICAgZ2ludCBsZW4gPSBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSk7CisKKyAgICAgICAgICAgIGlmIChsZW4gPj0gMzQpIHsKKyAgICAgICAgICAgICAgZ3VpbnQxNiBzb3VuZF92ZXJzaW9uID0gUVRfVUlOVDE2IChzdHNkX2VudHJ5X2RhdGEgKyAxNik7CisKKyAgICAgICAgICAgICAgaWYgKHNvdW5kX3ZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgICAgIGd1aW50MTYgY2hhbm5lbHMgPSBRVF9VSU5UMTYgKHN0c2RfZW50cnlfZGF0YSArIDI0KTsKKyAgICAgICAgICAgICAgICBndWludDMyIHRpbWVfc2NhbGUgPSBRVF9VSU5UMzIgKHN0c2RfZW50cnlfZGF0YSArIDMwKTsKKyAgICAgICAgICAgICAgICBndWludDggY29kZWNfZGF0YVsyXTsKKyAgICAgICAgICAgICAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICAgICAgICAgICAgICBnaW50IHByb2ZpbGUgPSAyOyAgICAgICAvKiBGSVhNRTogQ2FuIHRoaXMgYmUgZGV0ZXJtaW5lZCBzb21laG93PyBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYW55dGhpbmcgaW4gbXA0YSBhdG9tIHRoYXQgc3BlY2lmaXMgY29tcHJlc3Npb24gKi8KKworICAgICAgICAgICAgICAgIGdpbnQgc2FtcGxlX3JhdGVfaW5kZXggPQorICAgICAgICAgICAgICAgICAgICBnc3RfY29kZWNfdXRpbHNfYWFjX2dldF9pbmRleF9mcm9tX3NhbXBsZV9yYXRlICh0aW1lX3NjYWxlKTsKKworICAgICAgICAgICAgICAgIC8qIGJ1aWxkIEFBQyBjb2RlYyBkYXRhICovCisgICAgICAgICAgICAgICAgY29kZWNfZGF0YVswXSA9IHByb2ZpbGUgPDwgMzsKKyAgICAgICAgICAgICAgICBjb2RlY19kYXRhWzBdIHw9ICgoc2FtcGxlX3JhdGVfaW5kZXggPj4gMSkgJiAweDcpOworICAgICAgICAgICAgICAgIGNvZGVjX2RhdGFbMV0gPSAoc2FtcGxlX3JhdGVfaW5kZXggJiAweDAxKSA8PCA3OworICAgICAgICAgICAgICAgIGNvZGVjX2RhdGFbMV0gfD0gKGNoYW5uZWxzICYgMHhGKSA8PCAzOworCisgICAgICAgICAgICAgICAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgyKTsKKyAgICAgICAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgY29kZWNfZGF0YSwgMik7CisgICAgICAgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsCisgICAgICAgICAgICAgICAgICAgICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBidWYsIE5VTEwpOworICAgICAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEZPVVJDQ19scGNtOgorICAgICAgICAgICAgLyogRnVsbHkgaGFuZGxlZCBlbHNld2hlcmUgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAgICAgInVuaGFuZGxlZCB0eXBlICUiIEdTVF9GT1VSQ0NfRk9STUFULCBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAidHlwZSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpLCBlbnRyeS0+Y2Fwcyk7CisKKyAgICB9IGVsc2UgaWYgKHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0Nfc3RybSkgeworICAgICAgaWYgKGZvdXJjYyA9PSBGT1VSQ0NfcnRzcCkgeworICAgICAgICBzdHJlYW0tPnJlZGlyZWN0X3VyaSA9IHF0ZGVtdXhfZ2V0X3J0c3BfdXJpX2Zyb21faG5kbCAocXRkZW11eCwgbWluZik7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsICJ1bmhhbmRsZWQgc3RyZWFtIHR5cGUgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYykpOworICAgICAgICBnb3RvIHVua25vd25fc3RyZWFtOworICAgICAgfQorICAgICAgZW50cnktPnNhbXBsZWQgPSBUUlVFOworICAgIH0gZWxzZSBpZiAoc3RyZWFtLT5zdWJ0eXBlID09IEZPVVJDQ19zdWJwIHx8IHN0cmVhbS0+c3VidHlwZSA9PSBGT1VSQ0NfdGV4dAorICAgICAgICB8fCBzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3NidGwgfHwgc3RyZWFtLT5zdWJ0eXBlID09IEZPVVJDQ19zdWJ0KSB7CisKKyAgICAgIGVudHJ5LT5zYW1wbGVkID0gVFJVRTsKKyAgICAgIGVudHJ5LT5zcGFyc2UgPSBUUlVFOworCisgICAgICBlbnRyeS0+Y2FwcyA9CisgICAgICAgICAgcXRkZW11eF9zdWJfY2FwcyAocXRkZW11eCwgc3RyZWFtLCBlbnRyeSwgZm91cmNjLCBzdHNkX2VudHJ5X2RhdGEsCisgICAgICAgICAgJmNvZGVjKTsKKyAgICAgIGlmIChjb2RlYykgeworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkIChzdHJlYW0tPnN0cmVhbV90YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgICBHU1RfVEFHX1NVQlRJVExFX0NPREVDLCBjb2RlYywgTlVMTCk7CisgICAgICAgIGdfZnJlZSAoY29kZWMpOworICAgICAgICBjb2RlYyA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIC8qIGh1bnQgZm9yIHNvcnQtb2YgY29kZWMgZGF0YSAqLworICAgICAgc3dpdGNoIChmb3VyY2MpIHsKKyAgICAgICAgY2FzZSBGT1VSQ0NfbXA0czoKKyAgICAgICAgeworICAgICAgICAgIEdOb2RlICptcDRzID0gTlVMTDsKKyAgICAgICAgICBHTm9kZSAqZXNkcyA9IE5VTEw7CisKKyAgICAgICAgICAvKiBsb29rIGZvciBwYWxldHRlIGluIGEgc3RzZC0+bXA0cy0+ZXNkcyBzdWItYXRvbSAqLworICAgICAgICAgIG1wNHMgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHN0c2QsIEZPVVJDQ19tcDRzKTsKKyAgICAgICAgICBpZiAobXA0cykKKyAgICAgICAgICAgIGVzZHMgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG1wNHMsIEZPVVJDQ19lc2RzKTsKKyAgICAgICAgICBpZiAoZXNkcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKiBJbnZhbGlkIFNUU0QgKi8KKyAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiU2tpcHBpbmcgaW52YWxpZCBzdHNkOiBubyBlc2RzIGNoaWxkIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBnc3RfcXRkZW11eF9oYW5kbGVfZXNkcyAocXRkZW11eCwgc3RyZWFtLCBlbnRyeSwgZXNkcywKKyAgICAgICAgICAgICAgc3RyZWFtLT5zdHJlYW1fdGFncyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICAgICAgICJ1bmhhbmRsZWQgdHlwZSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAidHlwZSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpLCBlbnRyeS0+Y2Fwcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGV2ZXJ5dGhpbmcgaW4gMSBzYW1wbGUgKi8KKyAgICAgIGVudHJ5LT5zYW1wbGVkID0gVFJVRTsKKworICAgICAgZW50cnktPmNhcHMgPQorICAgICAgICAgIHF0ZGVtdXhfZ2VuZXJpY19jYXBzIChxdGRlbXV4LCBzdHJlYW0sIGVudHJ5LCBmb3VyY2MsIHN0c2RfZW50cnlfZGF0YSwKKyAgICAgICAgICAmY29kZWMpOworCisgICAgICBpZiAoZW50cnktPmNhcHMgPT0gTlVMTCkKKyAgICAgICAgZ290byB1bmtub3duX3N0cmVhbTsKKworICAgICAgaWYgKGNvZGVjKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHN0cmVhbS0+c3RyZWFtX3RhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgICAgICAgIEdTVF9UQUdfU1VCVElUTEVfQ09ERUMsIGNvZGVjLCBOVUxMKTsKKyAgICAgICAgZ19mcmVlIChjb2RlYyk7CisgICAgICAgIGNvZGVjID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwcm9tb3RlIHRvIHNhbXBsZWQgZm9ybWF0ICovCisgICAgaWYgKGVudHJ5LT5mb3VyY2MgPT0gRk9VUkNDX3NhbXIpIHsKKyAgICAgIC8qIGZvcmNlIG1vbm8gODAwMCBIeiBmb3IgQU1SICovCisgICAgICBlbnRyeS0+c2FtcGxlZCA9IFRSVUU7CisgICAgICBlbnRyeS0+bl9jaGFubmVscyA9IDE7CisgICAgICBlbnRyeS0+cmF0ZSA9IDgwMDA7CisgICAgfSBlbHNlIGlmIChlbnRyeS0+Zm91cmNjID09IEZPVVJDQ19zYXdiKSB7CisgICAgICAvKiBmb3JjZSBtb25vIDE2MDAwIEh6IGZvciBBTVItV0IgKi8KKyAgICAgIGVudHJ5LT5zYW1wbGVkID0gVFJVRTsKKyAgICAgIGVudHJ5LT5uX2NoYW5uZWxzID0gMTsKKyAgICAgIGVudHJ5LT5yYXRlID0gMTYwMDA7CisgICAgfSBlbHNlIGlmIChlbnRyeS0+Zm91cmNjID09IEZPVVJDQ19tcDRhKSB7CisgICAgICBlbnRyeS0+c2FtcGxlZCA9IFRSVUU7CisgICAgfQorCisKKyAgICBzdHNkX2VudHJ5X2RhdGEgKz0gbGVuOworICAgIHJlbWFpbmluZ19zdHNkX2xlbiAtPSBsZW47CisKKyAgfQorCisgIC8qIGNvbGxlY3Qgc2FtcGxlIGluZm9ybWF0aW9uICovCisgIGlmICghcXRkZW11eF9zdGJsX2luaXQgKHF0ZGVtdXgsIHN0cmVhbSwgc3RibCkpCisgICAgZ290byBzYW1wbGVzX2ZhaWxlZDsKKworICBpZiAocXRkZW11eC0+ZnJhZ21lbnRlZCkgeworICAgIGd1aW50NjQgb2Zmc2V0OworCisgICAgLyogbmVlZCBhbGwgbW9vdiBzYW1wbGVzIGFzIGJhc2lzOyBwcm9iYWJseSBub3QgbWFueSBpZiBhbnkgYXQgYWxsICovCisgICAgLyogcHJldmVudCBtb29mIHBhcnNpbmcgdGFraW5nIG9mIGF0IHRoaXMgdGltZSAqLworICAgIG9mZnNldCA9IHF0ZGVtdXgtPm1vb2Zfb2Zmc2V0OworICAgIHF0ZGVtdXgtPm1vb2Zfb2Zmc2V0ID0gMDsKKyAgICBpZiAoc3RyZWFtLT5uX3NhbXBsZXMgJiYKKyAgICAgICAgIXF0ZGVtdXhfcGFyc2Vfc2FtcGxlcyAocXRkZW11eCwgc3RyZWFtLCBzdHJlYW0tPm5fc2FtcGxlcyAtIDEpKSB7CisgICAgICBxdGRlbXV4LT5tb29mX29mZnNldCA9IG9mZnNldDsKKyAgICAgIGdvdG8gc2FtcGxlc19mYWlsZWQ7CisgICAgfQorICAgIHF0ZGVtdXgtPm1vb2Zfb2Zmc2V0ID0gMDsKKyAgICAvKiBtb3ZpZSBkdXJhdGlvbiBtb3JlIHJlbGlhYmxlIGluIHRoaXMgY2FzZSAoZS5nLiBtZWhkKSAqLworICAgIGlmIChxdGRlbXV4LT5zZWdtZW50LmR1cmF0aW9uICYmCisgICAgICAgIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChxdGRlbXV4LT5zZWdtZW50LmR1cmF0aW9uKSkKKyAgICAgIHN0cmVhbS0+ZHVyYXRpb24gPQorICAgICAgICAgIEdTVFRJTUVfVE9fUVRTVFJFQU1USU1FIChzdHJlYW0sIHF0ZGVtdXgtPnNlZ21lbnQuZHVyYXRpb24pOworICB9CisKKyAgLyogY29uZmlndXJlIHNlZ21lbnRzICovCisgIGlmICghcXRkZW11eF9wYXJzZV9zZWdtZW50cyAocXRkZW11eCwgc3RyZWFtLCB0cmFrKSkKKyAgICBnb3RvIHNlZ21lbnRzX2ZhaWxlZDsKKworICAvKiBhZGQgc29tZSBsYW5ndWFnZSB0YWcsIGlmIHVzZWZ1bCAqLworICBpZiAoc3RyZWFtLT5sYW5nX2lkWzBdICE9ICdcMCcgJiYgc3RyY21wIChzdHJlYW0tPmxhbmdfaWQsICJ1bmsiKSAmJgorICAgICAgc3RyY21wIChzdHJlYW0tPmxhbmdfaWQsICJ1bmQiKSkgeworICAgIGNvbnN0IGdjaGFyICpsYW5nX2NvZGU7CisKKyAgICAvKiBjb252ZXJ0IElTTyA2MzktMiBjb2RlIHRvIElTTyA2MzktMSAqLworICAgIGxhbmdfY29kZSA9IGdzdF90YWdfZ2V0X2xhbmd1YWdlX2NvZGUgKHN0cmVhbS0+bGFuZ19pZCk7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAoc3RyZWFtLT5zdHJlYW1fdGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICBHU1RfVEFHX0xBTkdVQUdFX0NPREUsIChsYW5nX2NvZGUpID8gbGFuZ19jb2RlIDogc3RyZWFtLT5sYW5nX2lkLCBOVUxMKTsKKyAgfQorCisgIC8qIENoZWNrIGZvciBVRFRBIHRhZ3MgKi8KKyAgaWYgKCh1ZHRhID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlICh0cmFrLCBGT1VSQ0NfdWR0YSkpKSB7CisgICAgcXRkZW11eF9wYXJzZV91ZHRhIChxdGRlbXV4LCBzdHJlYW0tPnN0cmVhbV90YWdzLCB1ZHRhKTsKKyAgfQorCisgIC8qIG5vdyB3ZSBhcmUgcmVhZHkgdG8gYWRkIHRoZSBzdHJlYW0gKi8KKyAgaWYgKHF0ZGVtdXgtPm5fc3RyZWFtcyA+PSBHU1RfUVRERU1VWF9NQVhfU1RSRUFNUykKKyAgICBnb3RvIHRvb19tYW55X3N0cmVhbXM7CisKKyAgaWYgKCFxdGRlbXV4LT5nb3RfbW9vdikgeworICAgIHF0ZGVtdXgtPnN0cmVhbXNbcXRkZW11eC0+bl9zdHJlYW1zXSA9IHN0cmVhbTsKKyAgICBxdGRlbXV4LT5uX3N0cmVhbXMrKzsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAibl9zdHJlYW1zIGlzIG5vdyAlZCIsIHF0ZGVtdXgtPm5fc3RyZWFtcyk7CisgIH0KKworICByZXR1cm4gVFJVRTsKKworLyogRVJST1JTICovCitza2lwX3RyYWNrOgorICB7CisgICAgR1NUX0lORk9fT0JKRUNUIChxdGRlbXV4LCAic2tpcCBkaXNhYmxlZCB0cmFjayIpOworICAgIGlmIChuZXdfc3RyZWFtKQorICAgICAgZ3N0X3F0ZGVtdXhfc3RyZWFtX2ZyZWUgKHF0ZGVtdXgsIHN0cmVhbSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KK2NvcnJ1cHRfZmlsZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChxdGRlbXV4LCBTVFJFQU0sIERFTVVYLAorICAgICAgICAoXygiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIikpLCAoTlVMTCkpOworICAgIGlmIChuZXdfc3RyZWFtKQorICAgICAgZ3N0X3F0ZGVtdXhfc3RyZWFtX2ZyZWUgKHF0ZGVtdXgsIHN0cmVhbSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitlcnJvcl9lbmNyeXB0ZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocXRkZW11eCwgU1RSRUFNLCBERUNSWVBULCAoTlVMTCksIChOVUxMKSk7CisgICAgaWYgKG5ld19zdHJlYW0pCisgICAgICBnc3RfcXRkZW11eF9zdHJlYW1fZnJlZSAocXRkZW11eCwgc3RyZWFtKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3NhbXBsZXNfZmFpbGVkOgorc2VnbWVudHNfZmFpbGVkOgorICB7CisgICAgLyogd2UgcG9zdGVkIGFuIGVycm9yIGFscmVhZHkgKi8KKyAgICAvKiBmcmVlIHN0Ymwgc3ViLWF0b21zICovCisgICAgZ3N0X3F0ZGVtdXhfc3RibF9mcmVlIChzdHJlYW0pOworICAgIGlmIChuZXdfc3RyZWFtKQorICAgICAgZ3N0X3F0ZGVtdXhfc3RyZWFtX2ZyZWUgKHF0ZGVtdXgsIHN0cmVhbSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitleGlzdGluZ19zdHJlYW06CisgIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHF0ZGVtdXgsICJzdHJlYW0gd2l0aCB0cmFjayBpZCAlaSBhbHJlYWR5IGV4aXN0cyIsCisgICAgICAgIHRyYWNrX2lkKTsKKyAgICBpZiAobmV3X3N0cmVhbSkKKyAgICAgIGdzdF9xdGRlbXV4X3N0cmVhbV9mcmVlIChxdGRlbXV4LCBzdHJlYW0pOworICAgIHJldHVybiBUUlVFOworICB9Cit1bmtub3duX3N0cmVhbToKKyAgeworICAgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwgInVua25vd24gc3VidHlwZSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChzdHJlYW0tPnN1YnR5cGUpKTsKKyAgICBpZiAobmV3X3N0cmVhbSkKKyAgICAgIGdzdF9xdGRlbXV4X3N0cmVhbV9mcmVlIChxdGRlbXV4LCBzdHJlYW0pOworICAgIHJldHVybiBUUlVFOworICB9Cit0b29fbWFueV9zdHJlYW1zOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocXRkZW11eCwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgKF8oIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiKSwKKyAgICAgICAgICAgIEdTVF9RVERFTVVYX01BWF9TVFJFQU1TKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorfQorCisvKiBJZiB3ZSBjYW4gZXN0aW1hdGUgdGhlIG92ZXJhbGwgYml0cmF0ZSwgYW5kIGRvbid0IGhhdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgKiBzdHJlYW0gYml0cmF0ZSBmb3IgZXhhY3RseSBvbmUgc3RyZWFtLCB0aGlzIGd1ZXNzZXMgdGhlIHN0cmVhbSBiaXRyYXRlIGFzCisgKiB0aGUgb3ZlcmFsbCBiaXRyYXRlIG1pbnVzIHRoZSBzdW0gb2YgdGhlIGJpdHJhdGVzIG9mIGFsbCBvdGhlciBzdHJlYW1zLiBUaGlzCisgKiBzaG91bGQgYmUgdXNlZnVsIGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgd2UgaGF2ZSBvbmUgYXVkaW8gYW5kIG9uZSB2aWRlbworICogc3RyZWFtIGFuZCBjYW4gZXN0aW1hdGUgdGhlIGJpdHJhdGUgb2Ygb25lLCBidXQgbm90IHRoZSBvdGhlci4gKi8KK3N0YXRpYyB2b2lkCitnc3RfcXRkZW11eF9ndWVzc19iaXRyYXRlIChHc3RRVERlbXV4ICogcXRkZW11eCkKK3sKKyAgUXREZW11eFN0cmVhbSAqc3RyZWFtID0gTlVMTDsKKyAgZ2ludDY0IHNpemUsIHN5c19iaXRyYXRlLCBzdW1fYml0cmF0ZSA9IDA7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKKyAgZ2ludCBpOworICBndWludCBiaXRyYXRlOworCisgIGlmIChxdGRlbXV4LT5mcmFnbWVudGVkKQorICAgIHJldHVybjsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiTG9va2luZyBmb3Igc3RyZWFtcyB3aXRoIHVua25vd24gYml0cmF0ZSIpOworCisgIGlmICghZ3N0X3BhZF9wZWVyX3F1ZXJ5X2R1cmF0aW9uIChxdGRlbXV4LT5zaW5rcGFkLCBHU1RfRk9STUFUX0JZVEVTLCAmc2l6ZSkKKyAgICAgIHx8IHNpemUgPD0gMCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsCisgICAgICAgICJTaXplIGluIGJ5dGVzIG9mIHRoZSBzdHJlYW0gbm90IGtub3duIC0gYmFpbGluZyIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFN1YnRyYWN0IHRoZSBoZWFkZXIgc2l6ZSAqLworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiVG90YWwgc2l6ZSAlIiBHX0dJTlQ2NF9GT1JNQVQgIiwgaGVhZGVyIHNpemUgJXUiLAorICAgICAgc2l6ZSwgcXRkZW11eC0+aGVhZGVyX3NpemUpOworCisgIGlmIChzaXplIDwgcXRkZW11eC0+aGVhZGVyX3NpemUpCisgICAgcmV0dXJuOworCisgIHNpemUgPSBzaXplIC0gcXRkZW11eC0+aGVhZGVyX3NpemU7CisKKyAgaWYgKCFnc3RfcXRkZW11eF9nZXRfZHVyYXRpb24gKHF0ZGVtdXgsICZkdXJhdGlvbikpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiU3RyZWFtIGR1cmF0aW9uIG5vdCBrbm93biAtIGJhaWxpbmciKTsKKyAgICByZXR1cm47CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgcXRkZW11eC0+bl9zdHJlYW1zOyBpKyspIHsKKyAgICBzd2l0Y2ggKHF0ZGVtdXgtPnN0cmVhbXNbaV0tPnN1YnR5cGUpIHsKKyAgICAgIGNhc2UgRk9VUkNDX3NvdW46CisgICAgICBjYXNlIEZPVVJDQ192aWRlOgorICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiY2hlY2tpbmcgYml0cmF0ZSBmb3IgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgICBDVVJfU1RSRUFNIChxdGRlbXV4LT5zdHJlYW1zW2ldKS0+Y2Fwcyk7CisgICAgICAgIC8qIHJldHJpZXZlIGJpdHJhdGUsIHByZWZlciBhdmcgdGhlbiBtYXggKi8KKyAgICAgICAgYml0cmF0ZSA9IDA7CisgICAgICAgIGlmIChxdGRlbXV4LT5zdHJlYW1zW2ldLT5zdHJlYW1fdGFncykgeworICAgICAgICAgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X3VpbnQgKHF0ZGVtdXgtPnN0cmVhbXNbaV0tPnN0cmVhbV90YWdzLAorICAgICAgICAgICAgICAgICAgR1NUX1RBR19NQVhJTVVNX0JJVFJBVEUsICZiaXRyYXRlKSkKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJtYXgtYml0cmF0ZTogJXUiLCBiaXRyYXRlKTsKKyAgICAgICAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF91aW50IChxdGRlbXV4LT5zdHJlYW1zW2ldLT5zdHJlYW1fdGFncywKKyAgICAgICAgICAgICAgICAgIEdTVF9UQUdfTk9NSU5BTF9CSVRSQVRFLCAmYml0cmF0ZSkpCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAibm9taW5hbC1iaXRyYXRlOiAldSIsIGJpdHJhdGUpOworICAgICAgICAgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X3VpbnQgKHF0ZGVtdXgtPnN0cmVhbXNbaV0tPnN0cmVhbV90YWdzLAorICAgICAgICAgICAgICAgICAgR1NUX1RBR19CSVRSQVRFLCAmYml0cmF0ZSkpCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiYml0cmF0ZTogJXUiLCBiaXRyYXRlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYml0cmF0ZSkKKyAgICAgICAgICBzdW1fYml0cmF0ZSArPSBiaXRyYXRlOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiAoc3RyZWFtKSB7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICAgICAgICI+MSBzdHJlYW0gd2l0aCB1bmtub3duIGJpdHJhdGUgLSBiYWlsaW5nIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBzdHJlYW0gPSBxdGRlbXV4LT5zdHJlYW1zW2ldOworICAgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIEZvciBvdGhlciBzdWJ0eXBlcywgd2UgYXNzdW1lIG5vIHNpZ25pZmljYW50IGltcGFjdCBvbiBiaXRyYXRlICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmICghc3RyZWFtKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIkFsbCBzdHJlYW0gYml0cmF0ZXMgYXJlIGtub3duIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3lzX2JpdHJhdGUgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNpemUsIEdTVF9TRUNPTkQgKiA4LCBkdXJhdGlvbik7CisKKyAgaWYgKHN5c19iaXRyYXRlIDwgc3VtX2JpdHJhdGUpIHsKKyAgICAvKiBUaGlzIGNhbiBoYXBwZW4sIHNpbmNlIHN1bV9iaXRyYXRlIG1pZ2h0IGJlIGRlcml2ZWQgZnJvbSBtYXhpbXVtCisgICAgICogYml0cmF0ZXMgYW5kIG5vdCBhdmVyYWdlIGJpdHJhdGVzICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgIlN5c3RlbSBiaXRyYXRlIGxlc3MgdGhhbiBzdW0gYml0cmF0ZSAtIGJhaWxpbmciKTsKKyAgICByZXR1cm47CisgIH0KKworICBiaXRyYXRlID0gc3lzX2JpdHJhdGUgLSBzdW1fYml0cmF0ZTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIlN5c3RlbSBiaXRyYXRlID0gJSIgR19HSU5UNjRfRk9STUFUCisgICAgICAiLCBTdHJlYW0gYml0cmF0ZSA9ICV1Iiwgc3lzX2JpdHJhdGUsIGJpdHJhdGUpOworCisgIGlmICghc3RyZWFtLT5zdHJlYW1fdGFncykKKyAgICBzdHJlYW0tPnN0cmVhbV90YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZWxzZQorICAgIHN0cmVhbS0+c3RyZWFtX3RhZ3MgPSBnc3RfdGFnX2xpc3RfbWFrZV93cml0YWJsZSAoc3RyZWFtLT5zdHJlYW1fdGFncyk7CisKKyAgZ3N0X3RhZ19saXN0X2FkZCAoc3RyZWFtLT5zdHJlYW1fdGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgR1NUX1RBR19CSVRSQVRFLCBiaXRyYXRlLCBOVUxMKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK3F0ZGVtdXhfcHJlcGFyZV9zdHJlYW1zIChHc3RRVERlbXV4ICogcXRkZW11eCkKK3sKKyAgZ2ludCBpOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJwcmVwYXJlIHN0cmVhbXMiKTsKKworICBmb3IgKGkgPSAwOyByZXQgPT0gR1NUX0ZMT1dfT0sgJiYgaSA8IHF0ZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgUXREZW11eFN0cmVhbSAqc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1tpXTsKKyAgICBndWludDMyIHNhbXBsZV9udW0gPSAwOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInN0cmVhbSAlZCwgaWQgJWQsIGZvdXJjYyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgaSwgc3RyZWFtLT50cmFja19pZCwgR1NUX0ZPVVJDQ19BUkdTIChDVVJfU1RSRUFNIChzdHJlYW0pLT5mb3VyY2MpKTsKKworICAgIGlmIChxdGRlbXV4LT5mcmFnbWVudGVkKSB7CisgICAgICAvKiBuZWVkIGFsbCBtb292IHNhbXBsZXMgZmlyc3QgKi8KKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocXRkZW11eCk7CisgICAgICB3aGlsZSAoc3RyZWFtLT5uX3NhbXBsZXMgPT0gMCkKKyAgICAgICAgaWYgKChyZXQgPSBxdGRlbXV4X2FkZF9mcmFnbWVudGVkX3NhbXBsZXMgKHF0ZGVtdXgpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChxdGRlbXV4KTsKKyAgICB9IGVsc2UgeworICAgICAgLyogZGlzY2FyZCBhbnkgc3RyYXkgbW9vZiAqLworICAgICAgcXRkZW11eC0+bW9vZl9vZmZzZXQgPSAwOworICAgIH0KKworICAgIC8qIHByZXBhcmUgYnJha2luZyAqLworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfRVJST1IpCisgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKworICAgIC8qIGluIHB1bGwgbW9kZSwgd2Ugc2hvdWxkIGhhdmUgcGFyc2VkIHNvbWUgc2FtcGxlIGluZm8gYnkgbm93OworICAgICAqIGFuZCBxdWl0ZSBzb21lIGNvZGUgd2lsbCBub3QgaGFuZGxlIG5vIHNhbXBsZXMuCisgICAgICogaW4gcHVzaCBtb2RlLCB3ZSdsbCBqdXN0IGhhdmUgdG8gZGVhbCB3aXRoIGl0ICovCisgICAgaWYgKEdfVU5MSUtFTFkgKHF0ZGVtdXgtPnB1bGxiYXNlZCAmJiAhc3RyZWFtLT5uX3NhbXBsZXMpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAibm8gc2FtcGxlcyBmb3Igc3RyZWFtOyBkaXNjYXJkaW5nIik7CisgICAgICBnc3RfcXRkZW11eF9yZW1vdmVfc3RyZWFtIChxdGRlbXV4LCBpKTsKKyAgICAgIGktLTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIHBhcnNlIHRoZSBpbml0aWFsIHNhbXBsZSBmb3IgdXNlIGluIHNldHRpbmcgdGhlIGZyYW1lIHJhdGUgY2FwICovCisgICAgd2hpbGUgKHNhbXBsZV9udW0gPT0gMCAmJiBzYW1wbGVfbnVtIDwgc3RyZWFtLT5uX3NhbXBsZXMpIHsKKyAgICAgIGlmICghcXRkZW11eF9wYXJzZV9zYW1wbGVzIChxdGRlbXV4LCBzdHJlYW0sIHNhbXBsZV9udW0pKQorICAgICAgICBicmVhazsKKyAgICAgICsrc2FtcGxlX251bTsKKyAgICB9CisgICAgaWYgKHN0cmVhbS0+bl9zYW1wbGVzID4gMCAmJiBzdHJlYW0tPnN0YmxfaW5kZXggPj0gMCkgeworICAgICAgc3RyZWFtLT5maXJzdF9kdXJhdGlvbiA9IHN0cmVhbS0+c2FtcGxlc1swXS5kdXJhdGlvbjsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAic3RyZWFtICVkIGZpcnN0IGR1cmF0aW9uICV1IiwKKyAgICAgICAgICBzdHJlYW0tPnRyYWNrX2lkLCBzdHJlYW0tPmZpcnN0X2R1cmF0aW9uKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorcXRkZW11eF9leHBvc2Vfc3RyZWFtcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgpCit7CisgIGdpbnQgaTsKKyAgR1NMaXN0ICpvbGRwYWRzID0gTlVMTDsKKyAgR1NMaXN0ICppdGVyOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJleHBvc2luZyBzdHJlYW1zIik7CisKKyAgZm9yIChpID0gMDsgaSA8IHF0ZGVtdXgtPm5fc3RyZWFtczsgaSsrKSB7CisgICAgUXREZW11eFN0cmVhbSAqc3RyZWFtID0gcXRkZW11eC0+c3RyZWFtc1tpXTsKKyAgICBHc3RQYWQgKm9sZHBhZCA9IHN0cmVhbS0+cGFkOworICAgIEdzdFRhZ0xpc3QgKmxpc3Q7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic3RyZWFtICVkLCBpZCAlZCwgZm91cmNjICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICBpLCBzdHJlYW0tPnRyYWNrX2lkLCBHU1RfRk9VUkNDX0FSR1MgKENVUl9TVFJFQU0gKHN0cmVhbSktPmZvdXJjYykpOworCisgICAgaWYgKChzdHJlYW0tPnN1YnR5cGUgPT0gRk9VUkNDX3RleHQgfHwgc3RyZWFtLT5zdWJ0eXBlID09IEZPVVJDQ19zYnRsKSAmJgorICAgICAgICBzdHJlYW0tPnRyYWNrX2lkID09IHF0ZGVtdXgtPmNoYXB0ZXJzX3RyYWNrX2lkKSB7CisgICAgICAvKiBUT0RPIC0gcGFyc2UgY2hhcHRlcnMgdHJhY2sgYW5kIGV4cG9zZSBpdCBhcyBHc3RUb2M7IEZvciBub3cganVzdCBpZ25vcmUgaXQKKyAgICAgICAgIHNvIHRoYXQgaXQgZG9lc24ndCBsb29rIGxpa2UgYSBzdWJ0aXRsZSB0cmFjayAqLworICAgICAgZ3N0X3F0ZGVtdXhfcmVtb3ZlX3N0cmVhbSAocXRkZW11eCwgaSk7CisgICAgICBpLS07CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiBub3cgd2UgaGF2ZSBhbGwgaW5mbyBhbmQgY2FuIGV4cG9zZSAqLworICAgIGxpc3QgPSBzdHJlYW0tPnN0cmVhbV90YWdzOworICAgIHN0cmVhbS0+c3RyZWFtX3RhZ3MgPSBOVUxMOworICAgIGlmIChvbGRwYWQpCisgICAgICBvbGRwYWRzID0gZ19zbGlzdF9wcmVwZW5kIChvbGRwYWRzLCBvbGRwYWQpOworICAgIGlmICghZ3N0X3F0ZGVtdXhfYWRkX3N0cmVhbSAocXRkZW11eCwgc3RyZWFtLCBsaXN0KSkKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIGdzdF9xdGRlbXV4X2d1ZXNzX2JpdHJhdGUgKHF0ZGVtdXgpOworCisgIGdzdF9lbGVtZW50X25vX21vcmVfcGFkcyAoR1NUX0VMRU1FTlRfQ0FTVCAocXRkZW11eCkpOworCisgIGZvciAoaXRlciA9IG9sZHBhZHM7IGl0ZXI7IGl0ZXIgPSBnX3NsaXN0X25leHQgKGl0ZXIpKSB7CisgICAgR3N0UGFkICpvbGRwYWQgPSBpdGVyLT5kYXRhOworICAgIEdzdEV2ZW50ICpldmVudDsKKworICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19lb3MgKCk7CisgICAgaWYgKHF0ZGVtdXgtPnNlZ21lbnRfc2VxbnVtICE9IEdTVF9TRVFOVU1fSU5WQUxJRCkKKyAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgcXRkZW11eC0+c2VnbWVudF9zZXFudW0pOworCisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChvbGRwYWQsIGV2ZW50KTsKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKG9sZHBhZCwgRkFMU0UpOworICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UIChxdGRlbXV4KSwgb2xkcGFkKTsKKyAgICBnc3RfZmxvd19jb21iaW5lcl9yZW1vdmVfcGFkIChxdGRlbXV4LT5mbG93Y29tYmluZXIsIG9sZHBhZCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAob2xkcGFkKTsKKyAgfQorCisgIC8qIGNoZWNrIGlmIHdlIHNob3VsZCBwb3N0IGEgcmVkaXJlY3QgaW4gY2FzZSB0aGVyZSBpcyBhIHNpbmdsZSB0cmFrCisgICAqIGFuZCBpdCBpcyBhIHJlZGlyZWN0aW5nIHRyYWsgKi8KKyAgaWYgKHF0ZGVtdXgtPm5fc3RyZWFtcyA9PSAxICYmIHF0ZGVtdXgtPnN0cmVhbXNbMF0tPnJlZGlyZWN0X3VyaSAhPSBOVUxMKSB7CisgICAgR3N0TWVzc2FnZSAqbTsKKworICAgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwgIklzc3VpbmcgYSByZWRpcmVjdCBkdWUgdG8gYSBzaW5nbGUgdHJhY2sgd2l0aCAiCisgICAgICAgICJhbiBleHRlcm5hbCBjb250ZW50Iik7CisgICAgbSA9IGdzdF9tZXNzYWdlX25ld19lbGVtZW50IChHU1RfT0JKRUNUX0NBU1QgKHF0ZGVtdXgpLAorICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoInJlZGlyZWN0IiwKKyAgICAgICAgICAgICJuZXctbG9jYXRpb24iLCBHX1RZUEVfU1RSSU5HLCBxdGRlbXV4LT5zdHJlYW1zWzBdLT5yZWRpcmVjdF91cmksCisgICAgICAgICAgICBOVUxMKSk7CisgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChxdGRlbXV4KSwgbSk7CisgICAgcXRkZW11eC0+cG9zdGVkX3JlZGlyZWN0ID0gVFJVRTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBxdGRlbXV4LT5uX3N0cmVhbXM7IGkrKykgeworICAgIFF0RGVtdXhTdHJlYW0gKnN0cmVhbSA9IHF0ZGVtdXgtPnN0cmVhbXNbaV07CisKKyAgICBxdGRlbXV4X2RvX2FsbG9jYXRpb24gKHF0ZGVtdXgsIHN0cmVhbSk7CisgIH0KKworICBxdGRlbXV4LT5leHBvc2VkID0gVFJVRTsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCisvKiBjaGVjayBpZiBtYWpvciBvciBjb21wYXRpYmxlIGJyYW5kIGlzIDNHUCAqLworc3RhdGljIGlubGluZSBnYm9vbGVhbgorcXRkZW11eF9pc19icmFuZF8zZ3AgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBnYm9vbGVhbiBtYWpvcikKK3sKKyAgaWYgKG1ham9yKSB7CisgICAgcmV0dXJuICgocXRkZW11eC0+bWFqb3JfYnJhbmQgJiBHU1RfTUFLRV9GT1VSQ0MgKDI1NSwgMjU1LCAwLCAwKSkgPT0KKyAgICAgICAgRk9VUkNDXzNnX18pOworICB9IGVsc2UgaWYgKHF0ZGVtdXgtPmNvbXBfYnJhbmRzICE9IE5VTEwpIHsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBndWludDggKmRhdGE7CisgICAgZ3NpemUgc2l6ZTsKKyAgICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKworICAgIGdzdF9idWZmZXJfbWFwIChxdGRlbXV4LT5jb21wX2JyYW5kcywgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBkYXRhID0gbWFwLmRhdGE7CisgICAgc2l6ZSA9IG1hcC5zaXplOworICAgIHdoaWxlIChzaXplID49IDQpIHsKKyAgICAgIHJlcyA9IHJlcyB8fCAoKFFUX0ZPVVJDQyAoZGF0YSkgJiBHU1RfTUFLRV9GT1VSQ0MgKDI1NSwgMjU1LCAwLCAwKSkgPT0KKyAgICAgICAgICBGT1VSQ0NfM2dfXyk7CisgICAgICBkYXRhICs9IDQ7CisgICAgICBzaXplIC09IDQ7CisgICAgfQorICAgIGdzdF9idWZmZXJfdW5tYXAgKHF0ZGVtdXgtPmNvbXBfYnJhbmRzLCAmbWFwKTsKKyAgICByZXR1cm4gcmVzOworICB9IGVsc2UgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKiBjaGVjayBpZiB0YWcgaXMgYSBzcGVjJ2VkIDNHUCB0YWcga2V5d29yZCBzdG9yaW5nIGEgc3RyaW5nICovCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitxdGRlbXV4X2lzX3N0cmluZ190YWdfM2dwIChHc3RRVERlbXV4ICogcXRkZW11eCwgZ3VpbnQzMiBmb3VyY2MpCit7CisgIHJldHVybiBmb3VyY2MgPT0gRk9VUkNDX2NwcnQgfHwgZm91cmNjID09IEZPVVJDQ19nbnJlIHx8IGZvdXJjYyA9PSBGT1VSQ0NfdGl0bAorICAgICAgfHwgZm91cmNjID09IEZPVVJDQ19kc2NwIHx8IGZvdXJjYyA9PSBGT1VSQ0NfcGVyZiB8fCBmb3VyY2MgPT0gRk9VUkNDX2F1dGgKKyAgICAgIHx8IGZvdXJjYyA9PSBGT1VSQ0NfYWxibTsKK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfdGFnX2FkZF9sb2NhdGlvbiAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdFRhZ0xpc3QgKiB0YWdsaXN0LAorICAgIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqZHVtbXksIEdOb2RlICogbm9kZSkKK3sKKyAgY29uc3QgZ2NoYXIgKmVudl92YXJzW10gPSB7ICJHU1RfUVRfVEFHX0VOQ09ESU5HIiwgIkdTVF9UQUdfRU5DT0RJTkciLCBOVUxMIH07CisgIGludCBvZmZzZXQ7CisgIGNoYXIgKm5hbWU7CisgIGdjaGFyICpkYXRhOworICBnZG91YmxlIGxvbmdpdHVkZSwgbGF0aXR1ZGUsIGFsdGl0dWRlOworICBnaW50IGxlbjsKKworICBsZW4gPSBRVF9VSU5UMzIgKG5vZGUtPmRhdGEpOworICBpZiAobGVuIDw9IDE0KQorICAgIGdvdG8gc2hvcnRfcmVhZDsKKworICBkYXRhID0gbm9kZS0+ZGF0YTsKKyAgb2Zmc2V0ID0gMTQ7CisKKyAgLyogVE9ETzogbGFuZ3VhZ2UgY29kZSBza2lwcGVkICovCisKKyAgbmFtZSA9IGdzdF90YWdfZnJlZWZvcm1fc3RyaW5nX3RvX3V0ZjggKGRhdGEgKyBvZmZzZXQsIC0xLCBlbnZfdmFycyk7CisKKyAgaWYgKCFuYW1lKSB7CisgICAgLyogZG8gbm90IGFsYXJtIGluIHRyaXZpYWwgY2FzZSwgYnV0IGJhaWwgb3V0IG90aGVyd2lzZSAqLworICAgIGlmICgqKGRhdGEgKyBvZmZzZXQpICE9IDApIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJmYWlsZWQgdG8gY29udmVydCAlcyB0YWcgdG8gVVRGLTgsICIKKyAgICAgICAgICAiZ2l2aW5nIHVwIiwgdGFnKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICBHU1RfVEFHX0dFT19MT0NBVElPTl9OQU1FLCBuYW1lLCBOVUxMKTsKKyAgICBvZmZzZXQgKz0gc3RybGVuIChuYW1lKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworICB9CisKKyAgaWYgKGxlbiA8IG9mZnNldCArIDIgKyA0ICsgNCArIDQpCisgICAgZ290byBzaG9ydF9yZWFkOworCisgIC8qICsxICsxID0gc2tpcCBudWxsLXRlcm1pbmF0b3IgYW5kIGxvY2F0aW9uIHJvbGUgYnl0ZSAqLworICBvZmZzZXQgKz0gMSArIDE7CisgIC8qIHRhYmxlIGluIHNwZWMgc2F5cyB1bnNpZ25lZCwgc2VtYW50aWNzIHNheSBuZWdhdGl2ZSBoYXMgbWVhbmluZyAuLi4gKi8KKyAgbG9uZ2l0dWRlID0gUVRfU0ZQMzIgKGRhdGEgKyBvZmZzZXQpOworCisgIG9mZnNldCArPSA0OworICBsYXRpdHVkZSA9IFFUX1NGUDMyIChkYXRhICsgb2Zmc2V0KTsKKworICBvZmZzZXQgKz0gNDsKKyAgYWx0aXR1ZGUgPSBRVF9TRlAzMiAoZGF0YSArIG9mZnNldCk7CisKKyAgLyogb25lIGludmFsaWQgbWVhbnMgYWxsIGFyZSBpbnZhbGlkICovCisgIGlmIChsb25naXR1ZGUgPj0gLTE4MC4wICYmIGxvbmdpdHVkZSA8PSAxODAuMCAmJgorICAgICAgbGF0aXR1ZGUgPj0gLTkwLjAgJiYgbGF0aXR1ZGUgPD0gOTAuMCkgeworICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgICAgR1NUX1RBR19HRU9fTE9DQVRJT05fTEFUSVRVREUsIGxhdGl0dWRlLAorICAgICAgICBHU1RfVEFHX0dFT19MT0NBVElPTl9MT05HSVRVREUsIGxvbmdpdHVkZSwKKyAgICAgICAgR1NUX1RBR19HRU9fTE9DQVRJT05fRUxFVkFUSU9OLCBhbHRpdHVkZSwgTlVMTCk7CisgIH0KKworICAvKiBUT0RPOiBubyBHU1RfVEFHXywgc28gYXN0cm9ub21pY2FsIGJvZHkgYW5kIGFkZGl0aW9uYWwgbm90ZXMgc2tpcHBlZCAqLworCisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK3Nob3J0X3JlYWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic2hvcnQgcmVhZCBwYXJzaW5nIDNHUCBsb2NhdGlvbiIpOworICAgIHJldHVybjsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X3RhZ19hZGRfeWVhciAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdFRhZ0xpc3QgKiB0YWdsaXN0LAorICAgIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqZHVtbXksIEdOb2RlICogbm9kZSkKK3sKKyAgZ3VpbnQxNiB5OworICBHRGF0ZSAqZGF0ZTsKKyAgZ2ludCBsZW47CisKKyAgbGVuID0gUVRfVUlOVDMyIChub2RlLT5kYXRhKTsKKyAgaWYgKGxlbiA8IDE0KQorICAgIHJldHVybjsKKworICB5ID0gUVRfVUlOVDE2ICgoZ3VpbnQ4ICopIG5vZGUtPmRhdGEgKyAxMik7CisgIGlmICh5ID09IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAieWVhcjogJXUgaXMgbm90IGEgdmFsaWQgeWVhciIsIHkpOworICAgIHJldHVybjsKKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAieWVhcjogJXUiLCB5KTsKKworICBkYXRlID0gZ19kYXRlX25ld19kbXkgKDEsIDEsIHkpOworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIHRhZywgZGF0ZSwgTlVMTCk7CisgIGdfZGF0ZV9mcmVlIChkYXRlKTsKK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfdGFnX2FkZF9jbGFzc2lmaWNhdGlvbiAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdFRhZ0xpc3QgKiB0YWdsaXN0LAorICAgIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqZHVtbXksIEdOb2RlICogbm9kZSkKK3sKKyAgaW50IG9mZnNldDsKKyAgY2hhciAqdGFnX3N0ciA9IE5VTEw7CisgIGd1aW50OCAqZW50aXR5OworICBndWludDE2IHRhYmxlOworICBnaW50IGxlbjsKKworICBsZW4gPSBRVF9VSU5UMzIgKG5vZGUtPmRhdGEpOworICBpZiAobGVuIDw9IDIwKQorICAgIGdvdG8gc2hvcnRfcmVhZDsKKworICBvZmZzZXQgPSAxMjsKKyAgZW50aXR5ID0gKGd1aW50OCAqKSBub2RlLT5kYXRhICsgb2Zmc2V0OworICBpZiAoZW50aXR5WzBdID09IDAgfHwgZW50aXR5WzFdID09IDAgfHwgZW50aXR5WzJdID09IDAgfHwgZW50aXR5WzNdID09IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAiY2xhc3NpZmljYXRpb24gaW5mbzogJWMlYyVjJWMgaW52YWxpZCBjbGFzc2lmaWNhdGlvbiBlbnRpdHkiLAorICAgICAgICBlbnRpdHlbMF0sIGVudGl0eVsxXSwgZW50aXR5WzJdLCBlbnRpdHlbM10pOworICAgIHJldHVybjsKKyAgfQorCisgIG9mZnNldCArPSA0OworICB0YWJsZSA9IFFUX1VJTlQxNiAoKGd1aW50OCAqKSBub2RlLT5kYXRhICsgb2Zmc2V0KTsKKworICAvKiBMYW5ndWFnZSBjb2RlIHNraXBwZWQgKi8KKworICBvZmZzZXQgKz0gNDsKKworICAvKiBUYWcgZm9ybWF0OiAiWFhYWDovL1lbWVlZWV0vY2xhc3NpZmljYXRpb24gaW5mbyBzdHJpbmciCisgICAqIFhYWFg6IGNsYXNzaWZpY2F0aW9uIGVudGl0eSwgZml4ZWQgbGVuZ3RoIDQgY2hhcnMuCisgICAqIFlbWVlZWV06IGNsYXNzaWZpY2F0aW9uIHRhYmxlLCBtYXggNSBjaGFycy4KKyAgICovCisgIHRhZ19zdHIgPSBnX3N0cmR1cF9wcmludGYgKCItLS0tOi8vJXUvJXMiLAorICAgICAgdGFibGUsIChjaGFyICopIG5vZGUtPmRhdGEgKyBvZmZzZXQpOworCisgIC8qIG1lbWNweSBUbyBiZSBzdXJlIHdlJ3JlIHByZXNlcnZpbmcgYnl0ZSBvcmRlciAqLworICBtZW1jcHkgKHRhZ19zdHIsIGVudGl0eSwgNCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJjbGFzc2lmaWNhdGlvbiBpbmZvOiAlcyIsIHRhZ19zdHIpOworCisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELCB0YWcsIHRhZ19zdHIsIE5VTEwpOworCisgIGdfZnJlZSAodGFnX3N0cik7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworc2hvcnRfcmVhZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzaG9ydCByZWFkIHBhcnNpbmcgM0dQIGNsYXNzaWZpY2F0aW9uIik7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcXRkZW11eF90YWdfYWRkX3N0cl9mdWxsIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0VGFnTGlzdCAqIHRhZ2xpc3QsCisgICAgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICpkdW1teSwgR05vZGUgKiBub2RlKQoreworICBjb25zdCBnY2hhciAqZW52X3ZhcnNbXSA9IHsgIkdTVF9RVF9UQUdfRU5DT0RJTkciLCAiR1NUX1RBR19FTkNPRElORyIsIE5VTEwgfTsKKyAgR05vZGUgKmRhdGE7CisgIGNoYXIgKnM7CisgIGludCBsZW47CisgIGd1aW50MzIgdHlwZTsKKyAgaW50IG9mZnNldDsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKyAgY29uc3QgZ2NoYXIgKmNoYXJzZXQgPSBOVUxMOworCisgIGRhdGEgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG5vZGUsIEZPVVJDQ19kYXRhKTsKKyAgaWYgKGRhdGEpIHsKKyAgICBsZW4gPSBRVF9VSU5UMzIgKGRhdGEtPmRhdGEpOworICAgIHR5cGUgPSBRVF9VSU5UMzIgKChndWludDggKikgZGF0YS0+ZGF0YSArIDgpOworICAgIGlmICh0eXBlID09IDB4MDAwMDAwMDEgJiYgbGVuID4gMTYpIHsKKyAgICAgIHMgPSBnc3RfdGFnX2ZyZWVmb3JtX3N0cmluZ190b191dGY4ICgoY2hhciAqKSBkYXRhLT5kYXRhICsgMTYsIGxlbiAtIDE2LAorICAgICAgICAgIGVudl92YXJzKTsKKyAgICAgIGlmIChzKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJhZGRpbmcgdGFnICVzIiwgR1NUX1NUUl9OVUxMIChzKSk7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwgdGFnLCBzLCBOVUxMKTsKKyAgICAgICAgZ19mcmVlIChzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJmYWlsZWQgdG8gY29udmVydCAlcyB0YWcgdG8gVVRGLTgiLCB0YWcpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBsZW4gPSBRVF9VSU5UMzIgKG5vZGUtPmRhdGEpOworICAgIHR5cGUgPSBRVF9VSU5UMzIgKChndWludDggKikgbm9kZS0+ZGF0YSArIDQpOworICAgIGlmICgodHlwZSA+PiAyNCkgPT0gMHhhOSAmJiBsZW4gPiA4ICsgNCkgeworICAgICAgZ2ludCBzdHJfbGVuOworICAgICAgZ2ludCBsYW5nX2NvZGU7CisKKyAgICAgIC8qIFR5cGUgc3RhcnRzIHdpdGggdGhlIChDKSBzeW1ib2wsIHNvIHRoZSBuZXh0IGRhdGEgaXMgYSBsaXN0CisgICAgICAgKiBvZiAoc3RyaW5nIHNpemUoMTYpLCBsYW5ndWFnZSBjb2RlKDE2KSwgc3RyaW5nKSAqLworCisgICAgICBzdHJfbGVuID0gUVRfVUlOVDE2ICgoZ3VpbnQ4ICopIG5vZGUtPmRhdGEgKyA4KTsKKyAgICAgIGxhbmdfY29kZSA9IFFUX1VJTlQxNiAoKGd1aW50OCAqKSBub2RlLT5kYXRhICsgMTApOworCisgICAgICAvKiB0aGUgc3RyaW5nICsgZm91cmNjICsgc2l6ZSArIDIgMTZiaXQgZmllbGRzLAorICAgICAgICogbWVhbnMgdGhhdCB0aGVyZSBhcmUgbW9yZSB0YWdzIGluIHRoaXMgYXRvbSAqLworICAgICAgaWYgKGxlbiA+IHN0cl9sZW4gKyA4ICsgNCkgeworICAgICAgICAvKiBUT0RPIGhvdyB0byByZXByZXNlbnQgdGhlIHNhbWUgdGFnIGluIGRpZmZlcmVudCBsYW5ndWFnZXM/ICovCisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIklnbm9yaW5nIG1ldGFkYXRhIGVudHJ5IHdpdGggbXVsdGlwbGUgIgorICAgICAgICAgICAgInRleHQgYWx0ZXJuYXRpdmVzLCByZWFkaW5nIG9ubHkgZmlyc3Qgb25lIik7CisgICAgICB9CisKKyAgICAgIG9mZnNldCA9IDEyOworICAgICAgbGVuID0gTUlOIChsZW4sIHN0cl9sZW4gKyA4ICsgNCk7IC8qIHJlbW92ZSB0cmFpbGluZyBzdHJpbmdzIHRoYXQgd2UgZG9uJ3QgdXNlICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZm91bmQgaW50ZXJuYXRpb25hbCB0ZXh0IHRhZyIpOworCisgICAgICBpZiAobGFuZ19jb2RlIDwgMHg4MDApIHsgIC8qIE1BQyBlbmNvZGVkIHN0cmluZyAqLworICAgICAgICBjaGFyc2V0ID0gIm1hYyI7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChsZW4gPiAxNCAmJiBxdGRlbXV4X2lzX3N0cmluZ190YWdfM2dwIChxdGRlbXV4LAorICAgICAgICAgICAgUVRfRk9VUkNDICgoZ3VpbnQ4ICopIG5vZGUtPmRhdGEgKyA0KSkpIHsKKyAgICAgIGd1aW50MzIgdHlwZSA9IFFUX1VJTlQzMiAoKGd1aW50OCAqKSBub2RlLT5kYXRhICsgOCk7CisKKyAgICAgIC8qIHdlIGdvIGZvciAzR1Agc3R5bGUgZW5jb2RpbmcgaWYgbWFqb3IgYnJhbmRzIGNsYWltcyBzbywKKyAgICAgICAqIG9yIGlmIG5vIGhvcGUgZm9yIGRhdGEgYmUgb2sgVVRGLTgsIGFuZCBjb21wYXRpYmxlIDNHUCBicmFuZCBwcmVzZW50ICovCisgICAgICBpZiAocXRkZW11eF9pc19icmFuZF8zZ3AgKHF0ZGVtdXgsIFRSVUUpIHx8CisgICAgICAgICAgKHF0ZGVtdXhfaXNfYnJhbmRfM2dwIChxdGRlbXV4LCBGQUxTRSkgJiYKKyAgICAgICAgICAgICAgKCh0eXBlICYgMHgwMEZGRkZGRikgPT0gMHgwKSAmJiAodHlwZSA+PiAyNCA8PSAweEYpKSkgeworICAgICAgICBvZmZzZXQgPSAxNDsKKyAgICAgICAgLyogMTYtYml0IExhbmd1YWdlIGNvZGUgaXMgaWdub3JlZCBoZXJlIGFzIHdlbGwgKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImZvdW5kIDNncHAgdGV4dCB0YWciKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdvdG8gbm9ybWFsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgbm9ybWFsOgorICAgICAgb2Zmc2V0ID0gODsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJmb3VuZCBub3JtYWwgdGV4dCB0YWciKTsKKyAgICAgIHJldCA9IEZBTFNFOyAgICAgICAgICAgICAgLyogbWF5IGhhdmUgdG8gZmFsbGJhY2sgKi8KKyAgICB9CisgICAgaWYgKGNoYXJzZXQpIHsKKyAgICAgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICAgICAgcyA9IGdfY29udmVydCAoKGdjaGFyICopIG5vZGUtPmRhdGEgKyBvZmZzZXQsIGxlbiAtIG9mZnNldCwgInV0ZjgiLAorICAgICAgICAgIGNoYXJzZXQsIE5VTEwsIE5VTEwsICZlcnIpOworICAgICAgaWYgKGVycikgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiRmFpbGVkIHRvIGNvbnZlcnQgc3RyaW5nIGZyb20gY2hhcnNldCAlczoiCisgICAgICAgICAgICAiICVzKCVkKTogJXMiLCBjaGFyc2V0LCBnX3F1YXJrX3RvX3N0cmluZyAoZXJyLT5kb21haW4pLCBlcnItPmNvZGUsCisgICAgICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHMgPSBnc3RfdGFnX2ZyZWVmb3JtX3N0cmluZ190b191dGY4ICgoY2hhciAqKSBub2RlLT5kYXRhICsgb2Zmc2V0LAorICAgICAgICAgIGxlbiAtIG9mZnNldCwgZW52X3ZhcnMpOworICAgIH0KKyAgICBpZiAocykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImFkZGluZyB0YWcgJXMiLCBHU1RfU1RSX05VTEwgKHMpKTsKKyAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwgdGFnLCBzLCBOVUxMKTsKKyAgICAgIGdfZnJlZSAocyk7CisgICAgICByZXQgPSBUUlVFOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZmFpbGVkIHRvIGNvbnZlcnQgJXMgdGFnIHRvIFVURi04IiwgdGFnKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfdGFnX2FkZF9zdHIgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwKKyAgICBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKmR1bW15LCBHTm9kZSAqIG5vZGUpCit7CisgIHF0ZGVtdXhfdGFnX2FkZF9zdHJfZnVsbCAocXRkZW11eCwgdGFnbGlzdCwgdGFnLCBkdW1teSwgbm9kZSk7Cit9CisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X3RhZ19hZGRfa2V5d29yZHMgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwKKyAgICBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKmR1bW15LCBHTm9kZSAqIG5vZGUpCit7CisgIGNvbnN0IGdjaGFyICplbnZfdmFyc1tdID0geyAiR1NUX1FUX1RBR19FTkNPRElORyIsICJHU1RfVEFHX0VOQ09ESU5HIiwgTlVMTCB9OworICBndWludDggKmRhdGE7CisgIGNoYXIgKnMsICp0LCAqayA9IE5VTEw7CisgIGludCBsZW47CisgIGludCBvZmZzZXQ7CisgIGludCBjb3VudDsKKworICAvKiBmaXJzdCB0cnkgbm9ybWFsIHN0cmluZyB0YWcgaWYgbWFqb3IgYnJhbmQgbm90IDNHUCAqLworICBpZiAoIXF0ZGVtdXhfaXNfYnJhbmRfM2dwIChxdGRlbXV4LCBUUlVFKSkgeworICAgIGlmICghcXRkZW11eF90YWdfYWRkX3N0cl9mdWxsIChxdGRlbXV4LCB0YWdsaXN0LCB0YWcsIGR1bW15LCBub2RlKSkgeworICAgICAgLyogaG0sIHRoYXQgZGlkIG5vdCB3b3JrLCBtYXliZSAzZ3BwIHN0b3JhZ2UgaW4gbm9uLTNncHAgbWFqb3IgYnJhbmQ7CisgICAgICAgKiBsZXQncyB0cnkgaXQgM2dwcCB3YXkgYWZ0ZXIgbWlub3Igc2FmZXR5IGNoZWNrICovCisgICAgICBkYXRhID0gbm9kZS0+ZGF0YTsKKyAgICAgIGlmIChRVF9VSU5UMzIgKGRhdGEpIDwgMTUgfHwgIXF0ZGVtdXhfaXNfYnJhbmRfM2dwIChxdGRlbXV4LCBGQUxTRSkpCisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybjsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJmb3VuZCAzZ3BwIGtleXdvcmQgdGFnIik7CisKKyAgZGF0YSA9IG5vZGUtPmRhdGE7CisKKyAgbGVuID0gUVRfVUlOVDMyIChkYXRhKTsKKyAgaWYgKGxlbiA8IDE1KQorICAgIGdvdG8gc2hvcnRfcmVhZDsKKworICBjb3VudCA9IFFUX1VJTlQ4IChkYXRhICsgMTQpOworICBvZmZzZXQgPSAxNTsKKyAgZm9yICg7IGNvdW50OyBjb3VudC0tKSB7CisgICAgZ2ludCBzbGVuOworCisgICAgaWYgKG9mZnNldCArIDEgPiBsZW4pCisgICAgICBnb3RvIHNob3J0X3JlYWQ7CisgICAgc2xlbiA9IFFUX1VJTlQ4IChkYXRhICsgb2Zmc2V0KTsKKyAgICBvZmZzZXQgKz0gMTsKKyAgICBpZiAob2Zmc2V0ICsgc2xlbiA+IGxlbikKKyAgICAgIGdvdG8gc2hvcnRfcmVhZDsKKyAgICBzID0gZ3N0X3RhZ19mcmVlZm9ybV9zdHJpbmdfdG9fdXRmOCAoKGNoYXIgKikgbm9kZS0+ZGF0YSArIG9mZnNldCwKKyAgICAgICAgc2xlbiwgZW52X3ZhcnMpOworICAgIGlmIChzKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiYWRkaW5nIGtleXdvcmQgJXMiLCBHU1RfU1RSX05VTEwgKHMpKTsKKyAgICAgIGlmIChrKSB7CisgICAgICAgIHQgPSBnX3N0cmpvaW4gKCIsIiwgaywgcywgTlVMTCk7CisgICAgICAgIGdfZnJlZSAocyk7CisgICAgICAgIGdfZnJlZSAoayk7CisgICAgICAgIGsgPSB0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgayA9IHM7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJmYWlsZWQgdG8gY29udmVydCBrZXl3b3JkIHRvIFVURi04Iik7CisgICAgfQorICAgIG9mZnNldCArPSBzbGVuOworICB9CisKK2RvbmU6CisgIGlmIChrKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImFkZGluZyB0YWcgJXMiLCBHU1RfU1RSX05VTEwgKGspKTsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIHRhZywgaywgTlVMTCk7CisgIH0KKyAgZ19mcmVlIChrKTsKKworICByZXR1cm47CisKKyAgLyogRVJST1JTICovCitzaG9ydF9yZWFkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInNob3J0IHJlYWQgcGFyc2luZyAzR1Aga2V5d29yZHMiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfdGFnX2FkZF9udW0gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwKKyAgICBjb25zdCBjaGFyICp0YWcxLCBjb25zdCBjaGFyICp0YWcyLCBHTm9kZSAqIG5vZGUpCit7CisgIEdOb2RlICpkYXRhOworICBpbnQgbGVuOworICBpbnQgdHlwZTsKKyAgaW50IG4xLCBuMjsKKworICBkYXRhID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChub2RlLCBGT1VSQ0NfZGF0YSk7CisgIGlmIChkYXRhKSB7CisgICAgbGVuID0gUVRfVUlOVDMyIChkYXRhLT5kYXRhKTsKKyAgICB0eXBlID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIGRhdGEtPmRhdGEgKyA4KTsKKyAgICBpZiAodHlwZSA9PSAweDAwMDAwMDAwICYmIGxlbiA+PSAyMikgeworICAgICAgbjEgPSBRVF9VSU5UMTYgKChndWludDggKikgZGF0YS0+ZGF0YSArIDE4KTsKKyAgICAgIG4yID0gUVRfVUlOVDE2ICgoZ3VpbnQ4ICopIGRhdGEtPmRhdGEgKyAyMCk7CisgICAgICBpZiAobjEgPiAwKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJhZGRpbmcgdGFnICVzPSVkIiwgdGFnMSwgbjEpOworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIHRhZzEsIG4xLCBOVUxMKTsKKyAgICAgIH0KKyAgICAgIGlmIChuMiA+IDApIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImFkZGluZyB0YWcgJXM9JWQiLCB0YWcyLCBuMik7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwgdGFnMiwgbjIsIE5VTEwpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorcXRkZW11eF90YWdfYWRkX3RtcG8gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwKKyAgICBjb25zdCBjaGFyICp0YWcxLCBjb25zdCBjaGFyICpkdW1teSwgR05vZGUgKiBub2RlKQoreworICBHTm9kZSAqZGF0YTsKKyAgaW50IGxlbjsKKyAgaW50IHR5cGU7CisgIGludCBuMTsKKworICBkYXRhID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChub2RlLCBGT1VSQ0NfZGF0YSk7CisgIGlmIChkYXRhKSB7CisgICAgbGVuID0gUVRfVUlOVDMyIChkYXRhLT5kYXRhKTsKKyAgICB0eXBlID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIGRhdGEtPmRhdGEgKyA4KTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiaGF2ZSB0ZW1wbyB0YWcsIHR5cGU9JWQsbGVuPSVkIiwgdHlwZSwgbGVuKTsKKyAgICAvKiBzb21lIGZpbGVzIHdyb25nbHkgaGF2ZSBhIHR5cGUgMHgwZj0xNSwgYnV0IGl0IHNob3VsZCBiZSAweDE1ICovCisgICAgaWYgKCh0eXBlID09IDB4MDAwMDAwMTUgfHwgdHlwZSA9PSAweDAwMDAwMDBmKSAmJiBsZW4gPj0gMTgpIHsKKyAgICAgIG4xID0gUVRfVUlOVDE2ICgoZ3VpbnQ4ICopIGRhdGEtPmRhdGEgKyAxNik7CisgICAgICBpZiAobjEpIHsKKyAgICAgICAgLyogZG8gbm90IGFkZCBicG09MCAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiYWRkaW5nIHRhZyAlZCIsIG4xKTsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLCB0YWcxLCAoZ2RvdWJsZSkgbjEsCisgICAgICAgICAgICBOVUxMKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfdGFnX2FkZF91aW50MzIgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwKKyAgICBjb25zdCBjaGFyICp0YWcxLCBjb25zdCBjaGFyICpkdW1teSwgR05vZGUgKiBub2RlKQoreworICBHTm9kZSAqZGF0YTsKKyAgaW50IGxlbjsKKyAgaW50IHR5cGU7CisgIGd1aW50MzIgbnVtOworCisgIGRhdGEgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG5vZGUsIEZPVVJDQ19kYXRhKTsKKyAgaWYgKGRhdGEpIHsKKyAgICBsZW4gPSBRVF9VSU5UMzIgKGRhdGEtPmRhdGEpOworICAgIHR5cGUgPSBRVF9VSU5UMzIgKChndWludDggKikgZGF0YS0+ZGF0YSArIDgpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJoYXZlICVzIHRhZywgdHlwZT0lZCxsZW49JWQiLCB0YWcxLCB0eXBlLCBsZW4pOworICAgIC8qIHNvbWUgZmlsZXMgd3JvbmdseSBoYXZlIGEgdHlwZSAweDBmPTE1LCBidXQgaXQgc2hvdWxkIGJlIDB4MTUgKi8KKyAgICBpZiAoKHR5cGUgPT0gMHgwMDAwMDAxNSB8fCB0eXBlID09IDB4MDAwMDAwMGYpICYmIGxlbiA+PSAyMCkgeworICAgICAgbnVtID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIGRhdGEtPmRhdGEgKyAxNik7CisgICAgICBpZiAobnVtKSB7CisgICAgICAgIC8qIGRvIG5vdCBhZGQgbnVtPTAgKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImFkZGluZyB0YWcgJWQiLCBudW0pOworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIHRhZzEsIG51bSwgTlVMTCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X3RhZ19hZGRfY292ciAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdFRhZ0xpc3QgKiB0YWdsaXN0LAorICAgIGNvbnN0IGNoYXIgKnRhZzEsIGNvbnN0IGNoYXIgKmR1bW15LCBHTm9kZSAqIG5vZGUpCit7CisgIEdOb2RlICpkYXRhOworICBpbnQgbGVuOworICBpbnQgdHlwZTsKKyAgR3N0U2FtcGxlICpzYW1wbGU7CisKKyAgZGF0YSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAobm9kZSwgRk9VUkNDX2RhdGEpOworICBpZiAoZGF0YSkgeworICAgIGxlbiA9IFFUX1VJTlQzMiAoZGF0YS0+ZGF0YSk7CisgICAgdHlwZSA9IFFUX1VJTlQzMiAoKGd1aW50OCAqKSBkYXRhLT5kYXRhICsgOCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImhhdmUgY292ciB0YWcsIHR5cGU9JWQsbGVuPSVkIiwgdHlwZSwgbGVuKTsKKyAgICBpZiAoKHR5cGUgPT0gMHgwMDAwMDAwZCB8fCB0eXBlID09IDB4MDAwMDAwMGUpICYmIGxlbiA+IDE2KSB7CisgICAgICBHc3RUYWdJbWFnZVR5cGUgaW1hZ2VfdHlwZTsKKworICAgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfdGFnX3NpemUgKHRhZ2xpc3QsIEdTVF9UQUdfSU1BR0UpID09IDApCisgICAgICAgIGltYWdlX3R5cGUgPSBHU1RfVEFHX0lNQUdFX1RZUEVfRlJPTlRfQ09WRVI7CisgICAgICBlbHNlCisgICAgICAgIGltYWdlX3R5cGUgPSBHU1RfVEFHX0lNQUdFX1RZUEVfTk9ORTsKKworICAgICAgaWYgKChzYW1wbGUgPQorICAgICAgICAgICAgICBnc3RfdGFnX2ltYWdlX2RhdGFfdG9faW1hZ2Vfc2FtcGxlICgoZ3VpbnQ4ICopIGRhdGEtPmRhdGEgKyAxNiwKKyAgICAgICAgICAgICAgICAgIGxlbiAtIDE2LCBpbWFnZV90eXBlKSkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImFkZGluZyB0YWcgc2l6ZSAlZCIsIGxlbiAtIDE2KTsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLCB0YWcxLCBzYW1wbGUsIE5VTEwpOworICAgICAgICBnc3Rfc2FtcGxlX3VucmVmIChzYW1wbGUpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorcXRkZW11eF90YWdfYWRkX2RhdGUgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwKKyAgICBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKmR1bW15LCBHTm9kZSAqIG5vZGUpCit7CisgIEdOb2RlICpkYXRhOworICBjaGFyICpzOworICBpbnQgbGVuOworICBpbnQgdHlwZTsKKworICBkYXRhID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChub2RlLCBGT1VSQ0NfZGF0YSk7CisgIGlmIChkYXRhKSB7CisgICAgbGVuID0gUVRfVUlOVDMyIChkYXRhLT5kYXRhKTsKKyAgICB0eXBlID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIGRhdGEtPmRhdGEgKyA4KTsKKyAgICBpZiAodHlwZSA9PSAweDAwMDAwMDAxICYmIGxlbiA+IDE2KSB7CisgICAgICBndWludCB5LCBtID0gMSwgZCA9IDE7CisgICAgICBnaW50IHJldDsKKworICAgICAgcyA9IGdfc3RybmR1cCAoKGNoYXIgKikgZGF0YS0+ZGF0YSArIDE2LCBsZW4gLSAxNik7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiYWRkaW5nIGRhdGUgJyVzJyIsIHMpOworICAgICAgcmV0ID0gc3NjYW5mIChzLCAiJXUtJXUtJXUiLCAmeSwgJm0sICZkKTsKKyAgICAgIGlmIChyZXQgPj0gMSAmJiB5ID4gMTUwMCAmJiB5IDwgMzAwMCkgeworICAgICAgICBHRGF0ZSAqZGF0ZTsKKworICAgICAgICBkYXRlID0gZ19kYXRlX25ld19kbXkgKGQsIG0sIHkpOworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIHRhZywgZGF0ZSwgTlVMTCk7CisgICAgICAgIGdfZGF0ZV9mcmVlIChkYXRlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJjb3VsZCBub3QgcGFyc2UgZGF0ZSBzdHJpbmcgJyVzJyIsIHMpOworICAgICAgfQorICAgICAgZ19mcmVlIChzKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfdGFnX2FkZF9nbnJlIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0VGFnTGlzdCAqIHRhZ2xpc3QsCisgICAgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICpkdW1teSwgR05vZGUgKiBub2RlKQoreworICBHTm9kZSAqZGF0YTsKKworICBkYXRhID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChub2RlLCBGT1VSQ0NfZGF0YSk7CisKKyAgLyogcmUtcm91dGUgdG8gbm9ybWFsIHN0cmluZyB0YWcgaWYgbWFqb3IgYnJhbmQgc2F5cyBzbworICAgKiBvciBubyBkYXRhIGF0b20gYW5kIGNvbXBhdGlibGUgYnJhbmQgc3VnZ2VzdHMgc28gKi8KKyAgaWYgKHF0ZGVtdXhfaXNfYnJhbmRfM2dwIChxdGRlbXV4LCBUUlVFKSB8fAorICAgICAgKHF0ZGVtdXhfaXNfYnJhbmRfM2dwIChxdGRlbXV4LCBGQUxTRSkgJiYgIWRhdGEpKSB7CisgICAgcXRkZW11eF90YWdfYWRkX3N0ciAocXRkZW11eCwgdGFnbGlzdCwgdGFnLCBkdW1teSwgbm9kZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGRhdGEpIHsKKyAgICBndWludCBsZW4sIHR5cGUsIG47CisKKyAgICBsZW4gPSBRVF9VSU5UMzIgKGRhdGEtPmRhdGEpOworICAgIHR5cGUgPSBRVF9VSU5UMzIgKChndWludDggKikgZGF0YS0+ZGF0YSArIDgpOworICAgIGlmICh0eXBlID09IDB4MDAwMDAwMDAgJiYgbGVuID49IDE4KSB7CisgICAgICBuID0gUVRfVUlOVDE2ICgoZ3VpbnQ4ICopIGRhdGEtPmRhdGEgKyAxNik7CisgICAgICBpZiAobiA+IDApIHsKKyAgICAgICAgY29uc3QgZ2NoYXIgKmdlbnJlOworCisgICAgICAgIGdlbnJlID0gZ3N0X3RhZ19pZDNfZ2VucmVfZ2V0IChuIC0gMSk7CisgICAgICAgIGlmIChnZW5yZSAhPSBOVUxMKSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImFkZGluZyAlZCBbJXNdIiwgbiwgZ2VucmUpOworICAgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwgdGFnLCBnZW5yZSwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK3F0ZGVtdXhfYWRkX2RvdWJsZV90YWdfZnJvbV9zdHIgKEdzdFFURGVtdXggKiBkZW11eCwgR3N0VGFnTGlzdCAqIHRhZ2xpc3QsCisgICAgY29uc3QgZ2NoYXIgKiB0YWcsIGd1aW50OCAqIGRhdGEsIGd1aW50MzIgZGF0YXNpemUpCit7CisgIGdkb3VibGUgdmFsdWU7CisgIGdjaGFyICpkYXRhY29weTsKKworICAvKiBtYWtlIGEgY29weSB0byBoYXZlIFwwIGF0IHRoZSBlbmQgKi8KKyAgZGF0YWNvcHkgPSBnX3N0cm5kdXAgKChnY2hhciAqKSBkYXRhLCBkYXRhc2l6ZSk7CisKKyAgLyogY29udmVydCB0aGUgc3RyIHRvIGRvdWJsZSAqLworICBpZiAoc3NjYW5mIChkYXRhY29weSwgIiVsZiIsICZ2YWx1ZSkgPT0gMSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiYWRkaW5nIHRhZzogJXMgWyVzXSIsIHRhZywgZGF0YWNvcHkpOworICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwgdGFnLCB2YWx1ZSwgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIkZhaWxlZCB0byBwYXJzZSBkb3VibGUgZnJvbSBzdHJpbmc6ICVzIiwKKyAgICAgICAgZGF0YWNvcHkpOworICB9CisgIGdfZnJlZSAoZGF0YWNvcHkpOworfQorCisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X3RhZ19hZGRfcmV2ZG5zIChHc3RRVERlbXV4ICogZGVtdXgsIEdzdFRhZ0xpc3QgKiB0YWdsaXN0LAorICAgIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdGFnX2JpcywgR05vZGUgKiBub2RlKQoreworICBHTm9kZSAqbWVhbjsKKyAgR05vZGUgKm5hbWU7CisgIEdOb2RlICpkYXRhOworICBndWludDMyIG1lYW5zaXplOworICBndWludDMyIG5hbWVzaXplOworICBndWludDMyIGRhdGF0eXBlOworICBndWludDMyIGRhdGFzaXplOworICBjb25zdCBnY2hhciAqbWVhbnN0cjsKKyAgY29uc3QgZ2NoYXIgKm5hbWVzdHI7CisKKyAgLyogY2hlY2tpbmcgdGhlIHdob2xlIC0tLS0gYXRvbSBzaXplIGZvciBjb25zaXN0ZW5jeSAqLworICBpZiAoUVRfVUlOVDMyIChub2RlLT5kYXRhKSA8PSA0ICsgMTIgKyAxMiArIDE2KSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIlRhZyAtLS0tIGF0b20gaXMgdG9vIHNtYWxsLCBpZ25vcmluZyIpOworICAgIHJldHVybjsKKyAgfQorCisgIG1lYW4gPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG5vZGUsIEZPVVJDQ19tZWFuKTsKKyAgaWYgKCFtZWFuKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIk5vICdtZWFuJyBhdG9tIGZvdW5kIik7CisgICAgcmV0dXJuOworICB9CisKKyAgbWVhbnNpemUgPSBRVF9VSU5UMzIgKG1lYW4tPmRhdGEpOworICBpZiAobWVhbnNpemUgPD0gMTIpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiU21hbGwgbWVhbiBhdG9tLCBpZ25vcmluZyB0aGUgd2hvbGUgdGFnIik7CisgICAgcmV0dXJuOworICB9CisgIG1lYW5zdHIgPSAoKGdjaGFyICopIG1lYW4tPmRhdGEpICsgMTI7CisgIG1lYW5zaXplIC09IDEyOworCisgIG5hbWUgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG5vZGUsIEZPVVJDQ19uYW1lKTsKKyAgaWYgKCFuYW1lKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIiduYW1lJyBhdG9tIG5vdCBmb3VuZCwgaWdub3JpbmcgdGFnIik7CisgICAgcmV0dXJuOworICB9CisKKyAgbmFtZXNpemUgPSBRVF9VSU5UMzIgKG5hbWUtPmRhdGEpOworICBpZiAobmFtZXNpemUgPD0gMTIpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiJ25hbWUnIGF0b20gaXMgdG9vIHNtYWxsLCBpZ25vcmluZyB0YWciKTsKKyAgICByZXR1cm47CisgIH0KKyAgbmFtZXN0ciA9ICgoZ2NoYXIgKikgbmFtZS0+ZGF0YSkgKyAxMjsKKyAgbmFtZXNpemUgLT0gMTI7CisKKyAgLyoKKyAgICogRGF0YSBhdG9tIGlzOgorICAgKiB1aW50MzIgLSBzaXplCisgICAqIHVpbnQzMiAtIG5hbWUKKyAgICogdWludDggIC0gdmVyc2lvbgorICAgKiB1aW50MjQgLSBkYXRhIHR5cGUKKyAgICogdWludDMyIC0gYWxsIDAKKyAgICogcmVzdCAgIC0gdGhlIGRhdGEKKyAgICovCisgIGRhdGEgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG5vZGUsIEZPVVJDQ19kYXRhKTsKKyAgaWYgKCFkYXRhKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIk5vIGRhdGEgYXRvbSBpbiB0aGlzIHRhZyIpOworICAgIHJldHVybjsKKyAgfQorICBkYXRhc2l6ZSA9IFFUX1VJTlQzMiAoZGF0YS0+ZGF0YSk7CisgIGlmIChkYXRhc2l6ZSA8PSAxNikgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJEYXRhIGF0b20gdG9vIHNtYWxsIik7CisgICAgcmV0dXJuOworICB9CisgIGRhdGF0eXBlID0gUVRfVUlOVDMyICgoKGdjaGFyICopIGRhdGEtPmRhdGEpICsgOCkgJiAweEZGRkZGRjsKKworICBpZiAoKHN0cm5jbXAgKG1lYW5zdHIsICJjb20uYXBwbGUuaVR1bmVzIiwgbWVhbnNpemUpID09IDApIHx8CisgICAgICAoc3RybmNtcCAobWVhbnN0ciwgIm9yZy5oeWRyb2dlbmF1ZGlvLnJlcGxheWdhaW4iLCBtZWFuc2l6ZSkgPT0gMCkpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0CisgICAgeworICAgICAgY29uc3QgZ2NoYXIgbmFtZVsyOF07CisgICAgICBjb25zdCBnY2hhciB0YWdbMjhdOworICAgIH0gdGFnc1tdID0geworICAgICAgeworICAgICAgInJlcGxheWdhaW5fdHJhY2tfZ2FpbiIsIEdTVF9UQUdfVFJBQ0tfR0FJTn0sIHsKKyAgICAgICJyZXBsYXlnYWluX3RyYWNrX3BlYWsiLCBHU1RfVEFHX1RSQUNLX1BFQUt9LCB7CisgICAgICAicmVwbGF5Z2Fpbl9hbGJ1bV9nYWluIiwgR1NUX1RBR19BTEJVTV9HQUlOfSwgeworICAgICAgInJlcGxheWdhaW5fYWxidW1fcGVhayIsIEdTVF9UQUdfQUxCVU1fUEVBS30sIHsKKyAgICAgICJNdXNpY0JyYWlueiBUcmFjayBJZCIsIEdTVF9UQUdfTVVTSUNCUkFJTlpfVFJBQ0tJRH0sIHsKKyAgICAgICJNdXNpY0JyYWlueiBBcnRpc3QgSWQiLCBHU1RfVEFHX01VU0lDQlJBSU5aX0FSVElTVElEfSwgeworICAgICAgIk11c2ljQnJhaW56IEFsYnVtIElkIiwgR1NUX1RBR19NVVNJQ0JSQUlOWl9BTEJVTUlEfSwgeworICAgICAgIk11c2ljQnJhaW56IEFsYnVtIEFydGlzdCBJZCIsIEdTVF9UQUdfTVVTSUNCUkFJTlpfQUxCVU1BUlRJU1RJRH0KKyAgICB9OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAodGFncyk7ICsraSkgeworICAgICAgaWYgKCFnX2FzY2lpX3N0cm5jYXNlY21wICh0YWdzW2ldLm5hbWUsIG5hbWVzdHIsIG5hbWVzaXplKSkgeworICAgICAgICBzd2l0Y2ggKGdzdF90YWdfZ2V0X3R5cGUgKHRhZ3NbaV0udGFnKSkgeworICAgICAgICAgIGNhc2UgR19UWVBFX0RPVUJMRToKKyAgICAgICAgICAgIHF0ZGVtdXhfYWRkX2RvdWJsZV90YWdfZnJvbV9zdHIgKGRlbXV4LCB0YWdsaXN0LCB0YWdzW2ldLnRhZywKKyAgICAgICAgICAgICAgICAoKGd1aW50OCAqKSBkYXRhLT5kYXRhKSArIDE2LCBkYXRhc2l6ZSAtIDE2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR19UWVBFX1NUUklORzoKKyAgICAgICAgICAgIHF0ZGVtdXhfdGFnX2FkZF9zdHIgKGRlbXV4LCB0YWdsaXN0LCB0YWdzW2ldLnRhZywgTlVMTCwgbm9kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogbm90IHJlYWNoZWQgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA9PSBHX05fRUxFTUVOVFMgKHRhZ3MpKQorICAgICAgZ290byB1bmtub3duX3RhZzsKKyAgfSBlbHNlIHsKKyAgICBnb3RvIHVua25vd25fdGFnOworICB9CisKKyAgcmV0dXJuOworCisvKiBlcnJvcnMgKi8KK3Vua25vd25fdGFnOgorI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgeworICAgIGdjaGFyICpuYW1lc3RyX2RiZzsKKyAgICBnY2hhciAqbWVhbnN0cl9kYmc7CisKKyAgICBtZWFuc3RyX2RiZyA9IGdfc3RybmR1cCAobWVhbnN0ciwgbWVhbnNpemUpOworICAgIG5hbWVzdHJfZGJnID0gZ19zdHJuZHVwIChuYW1lc3RyLCBuYW1lc2l6ZSk7CisKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiVGhpcyB0YWcgJXM6JXMgdHlwZToldSBpcyBub3QgbWFwcGVkLCAiCisgICAgICAgICJmaWxlIGEgYnVnIGF0IGJ1Z3ppbGxhLmdub21lLm9yZyIsIG1lYW5zdHJfZGJnLCBuYW1lc3RyX2RiZywgZGF0YXR5cGUpOworCisgICAgZ19mcmVlIChuYW1lc3RyX2RiZyk7CisgICAgZ19mcmVlIChtZWFuc3RyX2RiZyk7CisgIH0KKyNlbmRpZgorICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X3RhZ19hZGRfaWQzMiAoR3N0UVREZW11eCAqIGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwgY29uc3QgY2hhciAqdGFnLAorICAgIGNvbnN0IGNoYXIgKnRhZ19iaXMsIEdOb2RlICogbm9kZSkKK3sKKyAgZ3VpbnQ4ICpkYXRhOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgZ3VpbnQgbGVuOworICBHc3RUYWdMaXN0ICppZDMyX3RhZ2xpc3QgPSBOVUxMOworCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgInBhcnNpbmcgSUQzMiIpOworCisgIGRhdGEgPSBub2RlLT5kYXRhOworICBsZW4gPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEpOworCisgIC8qIG5lZWQgYXQgbGVhc3QgZnVsbCBib3ggYW5kIGxhbmd1YWdlIHRhZyAqLworICBpZiAobGVuIDwgMTIgKyAyKQorICAgIHJldHVybjsKKworICBidWYgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgbGVuIC0gMTQsIE5VTEwpOworICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgZGF0YSArIDE0LCBsZW4gLSAxNCk7CisKKyAgaWQzMl90YWdsaXN0ID0gZ3N0X3RhZ19saXN0X2Zyb21faWQzdjJfdGFnIChidWYpOworICBpZiAoaWQzMl90YWdsaXN0KSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAicGFyc2luZyBvayIpOworICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKHRhZ2xpc3QsIGlkMzJfdGFnbGlzdCwgR1NUX1RBR19NRVJHRV9LRUVQKTsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKGlkMzJfdGFnbGlzdCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAicGFyc2luZyBmYWlsZWQiKTsKKyAgfQorCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7Cit9CisKK3R5cGVkZWYgdm9pZCAoKkdzdFFURGVtdXhBZGRUYWdGdW5jKSAoR3N0UVREZW11eCAqIGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwKKyAgICBjb25zdCBjaGFyICp0YWcsIGNvbnN0IGNoYXIgKnRhZ19iaXMsIEdOb2RlICogbm9kZSk7CisKKy8qIHVubWFwcGVkIHRhZ3MKK0ZPVVJDQ19wY3N0IC0+IGlmIG1lZGlhIGlzIGEgcG9kY2FzdCAtPiBib29sCitGT1VSQ0NfY3BpbCAtPiBpZiBtZWRpYSBpcyBwYXJ0IG9mIGEgY29tcGlsYXRpb24gLT4gYm9vbAorRk9VUkNDX3BnYXAgLT4gaWYgbWVkaWEgaXMgcGFydCBvZiBhIGdhcGxlc3MgY29udGV4dCAtPiBib29sCitGT1VSQ0NfdHZlbiAtPiB0aGUgdHYgZXBpc29kZSBpZCBlLmcuIFMwMUUyMyAtPiBzdHIKKyovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QKK3sKKyAgZ3VpbnQzMiBmb3VyY2M7CisgIGNvbnN0IGdjaGFyICpnc3RfdGFnOworICBjb25zdCBnY2hhciAqZ3N0X3RhZ19iaXM7CisgIGNvbnN0IEdzdFFURGVtdXhBZGRUYWdGdW5jIGZ1bmM7Cit9IGFkZF9mdW5jc1tdID0geworICB7CisgIEZPVVJDQ19fbmFtLCBHU1RfVEFHX1RJVExFLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfdGl0bCwgR1NUX1RBR19USVRMRSwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX19ncnAsIEdTVF9UQUdfR1JPVVBJTkcsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisgIEZPVVJDQ19fd3J0LCBHU1RfVEFHX0NPTVBPU0VSLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfX0FSVCwgR1NUX1RBR19BUlRJU1QsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisgIEZPVVJDQ19hQVJULCBHU1RfVEFHX0FMQlVNX0FSVElTVCwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX3BlcmYsIEdTVF9UQUdfQVJUSVNULCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfYXV0aCwgR1NUX1RBR19DT01QT1NFUiwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX19hbGIsIEdTVF9UQUdfQUxCVU0sIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisgIEZPVVJDQ19hbGJtLCBHU1RfVEFHX0FMQlVNLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfY3BydCwgR1NUX1RBR19DT1BZUklHSFQsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisgIEZPVVJDQ19fY3B5LCBHU1RfVEFHX0NPUFlSSUdIVCwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX19jbXQsIEdTVF9UQUdfQ09NTUVOVCwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX19kZXMsIEdTVF9UQUdfREVTQ1JJUFRJT04sIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisgIEZPVVJDQ19kZXNjLCBHU1RfVEFHX0RFU0NSSVBUSU9OLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfZHNjcCwgR1NUX1RBR19ERVNDUklQVElPTiwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX19seXIsIEdTVF9UQUdfTFlSSUNTLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfX2RheSwgR1NUX1RBR19EQVRFLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfZGF0ZX0sIHsKKyAgRk9VUkNDX3lycmMsIEdTVF9UQUdfREFURSwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3llYXJ9LCB7CisgIEZPVVJDQ19fdG9vLCBHU1RfVEFHX0VOQ09ERVIsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisgIEZPVVJDQ19faW5mLCBHU1RfVEFHX0NPTU1FTlQsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisgIEZPVVJDQ190cmtuLCBHU1RfVEFHX1RSQUNLX05VTUJFUiwgR1NUX1RBR19UUkFDS19DT1VOVCwgcXRkZW11eF90YWdfYWRkX251bX0sIHsKKyAgRk9VUkNDX2Rpc2ssIEdTVF9UQUdfQUxCVU1fVk9MVU1FX05VTUJFUiwgR1NUX1RBR19BTEJVTV9WT0xVTUVfQ09VTlQsCisgICAgICAgIHF0ZGVtdXhfdGFnX2FkZF9udW19LCB7CisgIEZPVVJDQ19kaXNjLCBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9OVU1CRVIsIEdTVF9UQUdfQUxCVU1fVk9MVU1FX0NPVU5ULAorICAgICAgICBxdGRlbXV4X3RhZ19hZGRfbnVtfSwgeworICBGT1VSQ0NfX2dlbiwgR1NUX1RBR19HRU5SRSwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX2ducmUsIEdTVF9UQUdfR0VOUkUsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9nbnJlfSwgeworICBGT1VSQ0NfdG1wbywgR1NUX1RBR19CRUFUU19QRVJfTUlOVVRFLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfdG1wb30sIHsKKyAgRk9VUkNDX2NvdnIsIEdTVF9UQUdfSU1BR0UsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9jb3ZyfSwgeworICBGT1VSQ0Nfc29ubSwgR1NUX1RBR19USVRMRV9TT1JUTkFNRSwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX3NvYWwsIEdTVF9UQUdfQUxCVU1fU09SVE5BTUUsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisgIEZPVVJDQ19zb2FyLCBHU1RfVEFHX0FSVElTVF9TT1JUTkFNRSwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX3NvYWEsIEdTVF9UQUdfQUxCVU1fQVJUSVNUX1NPUlROQU1FLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0Nfc29jbywgR1NUX1RBR19DT01QT1NFUl9TT1JUTkFNRSwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX3Nvc24sIEdTVF9UQUdfU0hPV19TT1JUTkFNRSwgTlVMTCwgcXRkZW11eF90YWdfYWRkX3N0cn0sIHsKKyAgRk9VUkNDX3R2c2gsIEdTVF9UQUdfU0hPV19OQU1FLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfdHZzbiwgR1NUX1RBR19TSE9XX1NFQVNPTl9OVU1CRVIsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF91aW50MzJ9LCB7CisgIEZPVVJDQ190dmVzLCBHU1RfVEFHX1NIT1dfRVBJU09ERV9OVU1CRVIsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF91aW50MzJ9LCB7CisgIEZPVVJDQ19reXdkLCBHU1RfVEFHX0tFWVdPUkRTLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfa2V5d29yZHN9LCB7CisgIEZPVVJDQ19rZXl3LCBHU1RfVEFHX0tFWVdPUkRTLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfX2VuYywgR1NUX1RBR19FTkNPREVSLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfbG9jaSwgR1NUX1RBR19HRU9fTE9DQVRJT05fTkFNRSwgTlVMTCwgcXRkZW11eF90YWdfYWRkX2xvY2F0aW9ufSwgeworICBGT1VSQ0NfY2xzZiwgR1NUX1FUX0RFTVVYX0NMQVNTSUZJQ0FUSU9OX1RBRywgTlVMTCwKKyAgICAgICAgcXRkZW11eF90YWdfYWRkX2NsYXNzaWZpY2F0aW9ufSwgeworICBGT1VSQ0NfX21haywgR1NUX1RBR19ERVZJQ0VfTUFOVUZBQ1RVUkVSLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfc3RyfSwgeworICBGT1VSQ0NfX21vZCwgR1NUX1RBR19ERVZJQ0VfTU9ERUwsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisgIEZPVVJDQ19fc3dyLCBHU1RfVEFHX0FQUExJQ0FUSU9OX05BTUUsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9zdHJ9LCB7CisKKyAgICAvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLCBzb21lIHRhZ3MgYXJlIHN0b3JlZCBpbiB0aGlzCisgICAgICogJ3JldmVyc2UgZG5zIG5hbWluZycsIGFjY29yZGluZyB0bzoKKyAgICAgKiBodHRwOi8vYXRvbWljcGFyc2xleS5zb3VyY2Vmb3JnZS5uZXQvbXBlZy00ZmlsZXMuaHRtbCBhbmQKKyAgICAgKiBidWcgIzYxNDQ3MQorICAgICAqLworICBGT1VSQ0NfX19fXywgIiIsIE5VTEwsIHF0ZGVtdXhfdGFnX2FkZF9yZXZkbnN9LCB7CisgICAgLyogc2VlIGh0dHA6Ly93d3cubXA0cmEub3JnL3NwZWNzLmh0bWwgZm9yIElEMzIgaW4gbWV0YSBib3ggKi8KKyAgRk9VUkNDX0lEMzIsICIiLCBOVUxMLCBxdGRlbXV4X3RhZ19hZGRfaWQzMn0KK307CisKK3N0cnVjdCBfR3N0UXREZW11eFRhZ0xpc3QKK3sKKyAgR3N0UVREZW11eCAqZGVtdXg7CisgIEdzdFRhZ0xpc3QgKnRhZ2xpc3Q7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFF0RGVtdXhUYWdMaXN0IEdzdFF0RGVtdXhUYWdMaXN0OworCitzdGF0aWMgdm9pZAorcXRkZW11eF90YWdfYWRkX2Jsb2IgKEdOb2RlICogbm9kZSwgR3N0UXREZW11eFRhZ0xpc3QgKiBxdGRlbXV4dGFnbGlzdCkKK3sKKyAgZ2ludCBsZW47CisgIGd1aW50OCAqZGF0YTsKKyAgR3N0QnVmZmVyICpidWY7CisgIGdjaGFyICptZWRpYV90eXBlOworICBjb25zdCBnY2hhciAqc3R5bGU7CisgIEdzdFNhbXBsZSAqc2FtcGxlOworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIGd1aW50IGk7CisgIGd1aW50OCBuZGF0YVs0XTsKKyAgR3N0UVREZW11eCAqZGVtdXggPSBxdGRlbXV4dGFnbGlzdC0+ZGVtdXg7CisgIEdzdFRhZ0xpc3QgKnRhZ2xpc3QgPSBxdGRlbXV4dGFnbGlzdC0+dGFnbGlzdDsKKworICBkYXRhID0gbm9kZS0+ZGF0YTsKKyAgbGVuID0gUVRfVUlOVDMyIChkYXRhKTsKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChsZW4pOworICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgZGF0YSwgbGVuKTsKKworICAvKiBoZXVyaXN0aWMgdG8gZGV0ZXJtaW5lIHN0eWxlIG9mIHRhZyAqLworICBpZiAoUVRfRk9VUkNDIChkYXRhICsgNCkgPT0gRk9VUkNDX19fX18gfHwKKyAgICAgIChsZW4gPiA4ICsgMTIgJiYgUVRfRk9VUkNDIChkYXRhICsgMTIpID09IEZPVVJDQ19kYXRhKSkKKyAgICBzdHlsZSA9ICJpdHVuZXMiOworICBlbHNlIGlmIChkZW11eC0+bWFqb3JfYnJhbmQgPT0gRk9VUkNDX3F0X18pCisgICAgc3R5bGUgPSAicXVpY2t0aW1lIjsKKyAgLyogZmFsbCBiYWNrIHRvIGFzc3VtaW5nIGlzby8zZ3AgdGFnIHN0eWxlICovCisgIGVsc2UKKyAgICBzdHlsZSA9ICJpc28iOworCisgIC8qIHNhbnRpemUgdGhlIG5hbWUgZm9yIHRoZSBjYXBzLiAqLworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgZ3VpbnQ4IGQgPSBkYXRhWzQgKyBpXTsKKyAgICBpZiAoZ19hc2NpaV9pc2FsbnVtIChkKSkKKyAgICAgIG5kYXRhW2ldID0gZ19hc2NpaV90b2xvd2VyIChkKTsKKyAgICBlbHNlCisgICAgICBuZGF0YVtpXSA9ICdfJzsKKyAgfQorCisgIG1lZGlhX3R5cGUgPSBnX3N0cmR1cF9wcmludGYgKCJhcHBsaWNhdGlvbi94LWdzdC1xdC0lYyVjJWMlYy10YWciLAorICAgICAgbmRhdGFbMF0sIG5kYXRhWzFdLCBuZGF0YVsyXSwgbmRhdGFbM10pOworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIm1lZGlhIHR5cGUgJXMiLCBtZWRpYV90eXBlKTsKKworICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKG1lZGlhX3R5cGUsICJzdHlsZSIsIEdfVFlQRV9TVFJJTkcsIHN0eWxlLCBOVUxMKTsKKyAgc2FtcGxlID0gZ3N0X3NhbXBsZV9uZXcgKGJ1ZiwgTlVMTCwgTlVMTCwgcyk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIGdfZnJlZSAobWVkaWFfdHlwZSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJhZGRpbmcgcHJpdmF0ZSB0YWc7IHNpemUgJWQsIGluZm8gJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBsZW4sIHMpOworCisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgR1NUX1FUX0RFTVVYX1BSSVZBVEVfVEFHLCBzYW1wbGUsIE5VTEwpOworCisgIGdzdF9zYW1wbGVfdW5yZWYgKHNhbXBsZSk7Cit9CisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X3BhcnNlX3VkdGEgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RUYWdMaXN0ICogdGFnbGlzdCwgR05vZGUgKiB1ZHRhKQoreworICBHTm9kZSAqbWV0YTsKKyAgR05vZGUgKmlsc3Q7CisgIEdOb2RlICp4bXBfOworICBHTm9kZSAqbm9kZTsKKyAgZ2ludCBpOworICBHc3RRdERlbXV4VGFnTGlzdCBkZW11eHRhZ2xpc3Q7CisKKyAgZGVtdXh0YWdsaXN0LmRlbXV4ID0gcXRkZW11eDsKKyAgZGVtdXh0YWdsaXN0LnRhZ2xpc3QgPSB0YWdsaXN0OworCisgIG1ldGEgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHVkdGEsIEZPVVJDQ19tZXRhKTsKKyAgaWYgKG1ldGEgIT0gTlVMTCkgeworICAgIGlsc3QgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKG1ldGEsIEZPVVJDQ19pbHN0KTsKKyAgICBpZiAoaWxzdCA9PSBOVUxMKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIm5vIGlsc3QiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWxzdCA9IHVkdGE7CisgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJubyBtZXRhIHNvIHVzaW5nIHVkdGEgaXRzZWxmIik7CisgIH0KKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBHX05fRUxFTUVOVFMgKGFkZF9mdW5jcykpIHsKKyAgICBub2RlID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChpbHN0LCBhZGRfZnVuY3NbaV0uZm91cmNjKTsKKyAgICBpZiAobm9kZSkgeworICAgICAgZ2ludCBsZW47CisKKyAgICAgIGxlbiA9IFFUX1VJTlQzMiAobm9kZS0+ZGF0YSk7CisgICAgICBpZiAobGVuIDwgMTIpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgInRvbyBzbWFsbCB0YWcgYXRvbSAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoYWRkX2Z1bmNzW2ldLmZvdXJjYykpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYWRkX2Z1bmNzW2ldLmZ1bmMgKHF0ZGVtdXgsIHRhZ2xpc3QsIGFkZF9mdW5jc1tpXS5nc3RfdGFnLAorICAgICAgICAgICAgYWRkX2Z1bmNzW2ldLmdzdF90YWdfYmlzLCBub2RlKTsKKyAgICAgIH0KKyAgICAgIGdfbm9kZV9kZXN0cm95IChub2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgaSsrOworICAgIH0KKyAgfQorCisgIC8qIHBhcnNlZCBub2RlcyBoYXZlIGJlZW4gcmVtb3ZlZCwgcGFzcyBhbG9uZyByZW1haW5kZXIgYXMgYmxvYiAqLworICBnX25vZGVfY2hpbGRyZW5fZm9yZWFjaCAoaWxzdCwgR19UUkFWRVJTRV9BTEwsCisgICAgICAoR05vZGVGb3JlYWNoRnVuYykgcXRkZW11eF90YWdfYWRkX2Jsb2IsICZkZW11eHRhZ2xpc3QpOworCisgIC8qIHBhcnNlIHVwIFhNUF8gbm9kZSBpZiBleGlzdGluZyAqLworICB4bXBfID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlICh1ZHRhLCBGT1VSQ0NfWE1QXyk7CisgIGlmICh4bXBfICE9IE5VTEwpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICBHc3RUYWdMaXN0ICp4bXB0YWdsaXN0OworCisgICAgYnVmID0gX2dzdF9idWZmZXJfbmV3X3dyYXBwZWQgKCgoZ3VpbnQ4ICopIHhtcF8tPmRhdGEpICsgOCwKKyAgICAgICAgUVRfVUlOVDMyICgoZ3VpbnQ4ICopIHhtcF8tPmRhdGEpIC0gOCwgTlVMTCk7CisgICAgeG1wdGFnbGlzdCA9IGdzdF90YWdfbGlzdF9mcm9tX3htcF9idWZmZXIgKGJ1Zik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAgIHF0ZGVtdXhfaGFuZGxlX3htcF90YWdsaXN0IChxdGRlbXV4LCB0YWdsaXN0LCB4bXB0YWdsaXN0KTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiTm8gWE1QXyBub2RlIGZvdW5kIik7CisgIH0KK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7ICAgICAgLyogaGVscGVyIGZvciBzb3J0IGZ1bmN0aW9uICovCisgIGdjaGFyICpsb2NhdGlvbjsKKyAgZ3VpbnQgbWluX3JlcV9iaXRyYXRlOworICBndWludCBtaW5fcmVxX3F0X3ZlcnNpb247Cit9IEdzdFF0UmVmZXJlbmNlOworCitzdGF0aWMgZ2ludAorcXRkZW11eF9yZWRpcmVjdHNfc29ydF9mdW5jIChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYikKK3sKKyAgR3N0UXRSZWZlcmVuY2UgKnJlZl9hID0gKEdzdFF0UmVmZXJlbmNlICopIGE7CisgIEdzdFF0UmVmZXJlbmNlICpyZWZfYiA9IChHc3RRdFJlZmVyZW5jZSAqKSBiOworCisgIGlmIChyZWZfYi0+bWluX3JlcV9xdF92ZXJzaW9uICE9IHJlZl9hLT5taW5fcmVxX3F0X3ZlcnNpb24pCisgICAgcmV0dXJuIHJlZl9iLT5taW5fcmVxX3F0X3ZlcnNpb24gLSByZWZfYS0+bWluX3JlcV9xdF92ZXJzaW9uOworCisgIC8qIGtub3duIGJpdHJhdGVzIGdvIGJlZm9yZSB1bmtub3duOyBoaWdoZXIgYml0cmF0ZXMgZ28gZmlyc3QgKi8KKyAgcmV0dXJuIHJlZl9iLT5taW5fcmVxX2JpdHJhdGUgLSByZWZfYS0+bWluX3JlcV9iaXRyYXRlOworfQorCisvKiBzb3J0IHRoZSByZWRpcmVjdHMgYW5kIHBvc3QgYSBtZXNzYWdlIGZvciB0aGUgYXBwbGljYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitxdGRlbXV4X3Byb2Nlc3NfcmVkaXJlY3RzIChHc3RRVERlbXV4ICogcXRkZW11eCwgR0xpc3QgKiByZWZlcmVuY2VzKQoreworICBHc3RRdFJlZmVyZW5jZSAqYmVzdDsKKyAgR3N0U3RydWN0dXJlICpzOworICBHc3RNZXNzYWdlICptc2c7CisgIEdWYWx1ZSBsaXN0X3ZhbCA9IHsgMCwgfTsKKyAgR0xpc3QgKmw7CisKKyAgZ19hc3NlcnQgKHJlZmVyZW5jZXMgIT0gTlVMTCk7CisKKyAgcmVmZXJlbmNlcyA9IGdfbGlzdF9zb3J0IChyZWZlcmVuY2VzLCBxdGRlbXV4X3JlZGlyZWN0c19zb3J0X2Z1bmMpOworCisgIGJlc3QgPSAoR3N0UXRSZWZlcmVuY2UgKikgcmVmZXJlbmNlcy0+ZGF0YTsKKworICBnX3ZhbHVlX2luaXQgKCZsaXN0X3ZhbCwgR1NUX1RZUEVfTElTVCk7CisKKyAgZm9yIChsID0gcmVmZXJlbmNlczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworICAgIEdzdFF0UmVmZXJlbmNlICpyZWYgPSAoR3N0UXRSZWZlcmVuY2UgKikgbC0+ZGF0YTsKKyAgICBHVmFsdWUgc3RydWN0X3ZhbCA9IHsgMCwgfTsKKworICAgIHJlZi0+c3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJyZWRpcmVjdCIsCisgICAgICAgICJuZXctbG9jYXRpb24iLCBHX1RZUEVfU1RSSU5HLCByZWYtPmxvY2F0aW9uLCBOVUxMKTsKKworICAgIGlmIChyZWYtPm1pbl9yZXFfYml0cmF0ZSA+IDApIHsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChyZWYtPnN0cnVjdHVyZSwgIm1pbmltdW0tYml0cmF0ZSIsIEdfVFlQRV9JTlQsCisgICAgICAgICAgcmVmLT5taW5fcmVxX2JpdHJhdGUsIE5VTEwpOworICAgIH0KKworICAgIGdfdmFsdWVfaW5pdCAoJnN0cnVjdF92YWwsIEdTVF9UWVBFX1NUUlVDVFVSRSk7CisgICAgZ192YWx1ZV9zZXRfYm94ZWQgKCZzdHJ1Y3RfdmFsLCByZWYtPnN0cnVjdHVyZSk7CisgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdF92YWwsICZzdHJ1Y3RfdmFsKTsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmc3RydWN0X3ZhbCk7CisgICAgLyogZG9uJ3QgZnJlZSBhbnl0aGluZyBoZXJlIHlldCwgc2luY2Ugd2UgbmVlZCBiZXN0LT5zdHJ1Y3R1cmUgYmVsb3cgKi8KKyAgfQorCisgIGdfYXNzZXJ0IChiZXN0ICE9IE5VTEwpOworICBzID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChiZXN0LT5zdHJ1Y3R1cmUpOworCisgIGlmIChnX2xpc3RfbGVuZ3RoIChyZWZlcmVuY2VzKSA+IDEpIHsKKyAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAocywgImxvY2F0aW9ucyIsICZsaXN0X3ZhbCk7CisgIH0KKworICBnX3ZhbHVlX3Vuc2V0ICgmbGlzdF92YWwpOworCisgIGZvciAobCA9IHJlZmVyZW5jZXM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKKyAgICBHc3RRdFJlZmVyZW5jZSAqcmVmID0gKEdzdFF0UmVmZXJlbmNlICopIGwtPmRhdGE7CisKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHJlZi0+c3RydWN0dXJlKTsKKyAgICBnX2ZyZWUgKHJlZi0+bG9jYXRpb24pOworICAgIGdfZnJlZSAocmVmKTsKKyAgfQorICBnX2xpc3RfZnJlZSAocmVmZXJlbmNlcyk7CisKKyAgR1NUX0lORk9fT0JKRUNUIChxdGRlbXV4LCAicG9zdGluZyByZWRpcmVjdCBtZXNzYWdlOiAlIiBHU1RfUFRSX0ZPUk1BVCwgcyk7CisgIG1zZyA9IGdzdF9tZXNzYWdlX25ld19lbGVtZW50IChHU1RfT0JKRUNUX0NBU1QgKHF0ZGVtdXgpLCBzKTsKKyAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChxdGRlbXV4KSwgbXNnKTsKKyAgcXRkZW11eC0+cG9zdGVkX3JlZGlyZWN0ID0gVFJVRTsKK30KKworLyogbG9vayBmb3IgcmVkaXJlY3Qgbm9kZXMsIGNvbGxlY3QgYWxsIHJlZGlyZWN0IGluZm9ybWF0aW9uIGFuZAorICogcHJvY2VzcyBpdC4KKyAqLworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X3BhcnNlX3JlZGlyZWN0cyAoR3N0UVREZW11eCAqIHF0ZGVtdXgpCit7CisgIEdOb2RlICpybXJhLCAqcm1kYSwgKnJkcmY7CisKKyAgcm1yYSA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAocXRkZW11eC0+bW9vdl9ub2RlLCBGT1VSQ0Nfcm1yYSk7CisgIGlmIChybXJhKSB7CisgICAgR0xpc3QgKnJlZGlyZWN0cyA9IE5VTEw7CisKKyAgICBybWRhID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChybXJhLCBGT1VSQ0Nfcm1kYSk7CisgICAgd2hpbGUgKHJtZGEpIHsKKyAgICAgIEdzdFF0UmVmZXJlbmNlIHJlZiA9IHsgTlVMTCwgTlVMTCwgMCwgMCB9OworICAgICAgR05vZGUgKnJtZHIsICpybXZjOworCisgICAgICBpZiAoKHJtZHIgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHJtZGEsIEZPVVJDQ19ybWRyKSkpIHsKKyAgICAgICAgcmVmLm1pbl9yZXFfYml0cmF0ZSA9IFFUX1VJTlQzMiAoKGd1aW50OCAqKSBybWRyLT5kYXRhICsgMTIpOworICAgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgImRhdGEgcmF0ZSBhdG9tLCByZXF1aXJlZCBiaXRyYXRlID0gJXUiLAorICAgICAgICAgICAgcmVmLm1pbl9yZXFfYml0cmF0ZSk7CisgICAgICB9CisKKyAgICAgIGlmICgocm12YyA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAocm1kYSwgRk9VUkNDX3JtdmMpKSkgeworICAgICAgICBndWludDMyIHBhY2thZ2UgPSBRVF9GT1VSQ0MgKChndWludDggKikgcm12Yy0+ZGF0YSArIDEyKTsKKyAgICAgICAgZ3VpbnQgdmVyc2lvbiA9IFFUX1VJTlQzMiAoKGd1aW50OCAqKSBybXZjLT5kYXRhICsgMTYpOworCisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworICAgICAgICBndWludCBiaXRtYXNrID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIHJtdmMtPmRhdGEgKyAyMCk7CisjZW5kaWYKKyAgICAgICAgZ3VpbnQgY2hlY2tfdHlwZSA9IFFUX1VJTlQxNiAoKGd1aW50OCAqKSBybXZjLT5kYXRhICsgMjQpOworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICAgInZlcnNpb24gY2hlY2sgYXRvbSBbJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIl0sIHZlcnNpb249MHglMDh4IgorICAgICAgICAgICAgIiwgbWFzaz0lMDh4LCBjaGVja190eXBlPSV1IiwgR1NUX0ZPVVJDQ19BUkdTIChwYWNrYWdlKSwgdmVyc2lvbiwKKyAgICAgICAgICAgIGJpdG1hc2ssIGNoZWNrX3R5cGUpOworICAgICAgICBpZiAocGFja2FnZSA9PSBGT1VSQ0NfcXRpbSAmJiBjaGVja190eXBlID09IDApIHsKKyAgICAgICAgICByZWYubWluX3JlcV9xdF92ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZHJmID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChybWRhLCBGT1VSQ0NfcmRyZik7CisgICAgICBpZiAocmRyZikgeworICAgICAgICBndWludDMyIHJlZl90eXBlOworICAgICAgICBndWludDggKnJlZl9kYXRhOworICAgICAgICBndWludCByZWZfbGVuOworCisgICAgICAgIHJlZl9sZW4gPSBRVF9VSU5UMzIgKChndWludDggKikgcmRyZi0+ZGF0YSk7CisgICAgICAgIGlmIChyZWZfbGVuID4gMjApIHsKKyAgICAgICAgICByZWZfdHlwZSA9IFFUX0ZPVVJDQyAoKGd1aW50OCAqKSByZHJmLT5kYXRhICsgMTIpOworICAgICAgICAgIHJlZl9kYXRhID0gKGd1aW50OCAqKSByZHJmLT5kYXRhICsgMjA7CisgICAgICAgICAgaWYgKHJlZl90eXBlID09IEZPVVJDQ19hbGlzKSB7CisgICAgICAgICAgICBndWludCByZWNvcmRfbGVuLCByZWNvcmRfdmVyc2lvbiwgZm5fbGVuOworCisgICAgICAgICAgICBpZiAocmVmX2xlbiA+IDcwKSB7CisgICAgICAgICAgICAgIC8qIE1hY09TWCBhbGlhcyByZWNvcmQsIGdvb2dsZSBmb3IgYWxpYXMtbGF5b3V0LnR4dCAqLworICAgICAgICAgICAgICByZWNvcmRfbGVuID0gUVRfVUlOVDE2IChyZWZfZGF0YSArIDQpOworICAgICAgICAgICAgICByZWNvcmRfdmVyc2lvbiA9IFFUX1VJTlQxNiAocmVmX2RhdGEgKyA0ICsgMik7CisgICAgICAgICAgICAgIGZuX2xlbiA9IFFUX1VJTlQ4IChyZWZfZGF0YSArIDUwKTsKKyAgICAgICAgICAgICAgaWYgKHJlY29yZF9sZW4gPiA1MCAmJiByZWNvcmRfdmVyc2lvbiA9PSAyICYmIGZuX2xlbiA+IDApIHsKKyAgICAgICAgICAgICAgICByZWYubG9jYXRpb24gPSBnX3N0cm5kdXAgKChnY2hhciAqKSByZWZfZGF0YSArIDUxLCBmbl9sZW4pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJJbnZhbGlkIHJkcmYvYWxpcyBzaXplICgldSA8IDcwKSIsCisgICAgICAgICAgICAgICAgICByZWZfbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKHJlZl90eXBlID09IEZPVVJDQ191cmxfKSB7CisgICAgICAgICAgICByZWYubG9jYXRpb24gPSBnX3N0cm5kdXAgKChnY2hhciAqKSByZWZfZGF0YSwgcmVmX2xlbiAtIDgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICAgICAgICJ1bmtub3duIHJkcmYgcmVmZXJlbmNlIHR5cGUgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChyZWZfdHlwZSkpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAocmVmLmxvY2F0aW9uICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwgIk5ldyBsb2NhdGlvbjogJXMiLCByZWYubG9jYXRpb24pOworICAgICAgICAgICAgcmVkaXJlY3RzID0KKyAgICAgICAgICAgICAgICBnX2xpc3RfcHJlcGVuZCAocmVkaXJlY3RzLCBnX21lbWR1cCAoJnJlZiwgc2l6ZW9mIChyZWYpKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGV4dHJhY3QgcmVkaXJlY3QgbG9jYXRpb24gZnJvbSByZHJmIGF0b20iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChxdGRlbXV4LCAiSW52YWxpZCByZHJmIHNpemUgKCV1IDwgMjApIiwgcmVmX2xlbik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogbG9vayBmb3Igb3RoZXJzICovCisgICAgICBybWRhID0gcXRkZW11eF90cmVlX2dldF9zaWJsaW5nX2J5X3R5cGUgKHJtZGEsIEZPVVJDQ19ybWRhKTsKKyAgICB9CisKKyAgICBpZiAocmVkaXJlY3RzICE9IE5VTEwpIHsKKyAgICAgIHF0ZGVtdXhfcHJvY2Vzc19yZWRpcmVjdHMgKHF0ZGVtdXgsIHJlZGlyZWN0cyk7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0VGFnTGlzdCAqCitxdGRlbXV4X2FkZF9jb250YWluZXJfZm9ybWF0IChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0VGFnTGlzdCAqIHRhZ3MpCit7CisgIGNvbnN0IGdjaGFyICpmbXQ7CisKKyAgaWYgKHRhZ3MgPT0gTlVMTCkgeworICAgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgIGdzdF90YWdfbGlzdF9zZXRfc2NvcGUgKHRhZ3MsIEdTVF9UQUdfU0NPUEVfR0xPQkFMKTsKKyAgfQorCisgIGlmIChxdGRlbXV4LT5tYWpvcl9icmFuZCA9PSBGT1VSQ0NfbWpwMikKKyAgICBmbXQgPSAiTW90aW9uIEpQRUcgMjAwMCI7CisgIGVsc2UgaWYgKChxdGRlbXV4LT5tYWpvcl9icmFuZCAmIDB4ZmZmZikgPT0gRk9VUkNDXzNnX18pCisgICAgZm10ID0gIjNHUCI7CisgIGVsc2UgaWYgKHF0ZGVtdXgtPm1ham9yX2JyYW5kID09IEZPVVJDQ19xdF9fKQorICAgIGZtdCA9ICJRdWlja3RpbWUiOworICBlbHNlIGlmIChxdGRlbXV4LT5mcmFnbWVudGVkKQorICAgIGZtdCA9ICJJU08gZk1QNCI7CisgIGVsc2UKKyAgICBmbXQgPSAiSVNPIE1QNC9NNEEiOworCisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAibWFwcGVkICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgdG8gJyVzJyIsCisgICAgICBHU1RfRk9VUkNDX0FSR1MgKHF0ZGVtdXgtPm1ham9yX2JyYW5kKSwgZm10KTsKKworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsIEdTVF9UQUdfQ09OVEFJTkVSX0ZPUk1BVCwKKyAgICAgIGZtdCwgTlVMTCk7CisKKyAgcmV0dXJuIHRhZ3M7Cit9CisKKy8qIHdlIGhhdmUgcmVhZCB0aGUgY29tcGxldGUgbW9vdiBub2RlIG5vdy4KKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGFsbCBvZiB0aGUgcmVsZXZhbnQgaW5mbywgY3JlYXRlcyB0aGUgdHJha3MgYW5kCisgKiBwcmVwYXJlcyBhbGwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBwbGF5YmFjaworICovCitzdGF0aWMgZ2Jvb2xlYW4KK3F0ZGVtdXhfcGFyc2VfdHJlZSAoR3N0UVREZW11eCAqIHF0ZGVtdXgpCit7CisgIEdOb2RlICptdmhkOworICBHTm9kZSAqdHJhazsKKyAgR05vZGUgKnVkdGE7CisgIEdOb2RlICptdmV4OworICBHc3RDbG9ja1RpbWUgZHVyYXRpb247CisgIEdOb2RlICpwc3NoOworICBndWludDY0IGNyZWF0aW9uX3RpbWU7CisgIEdzdERhdGVUaW1lICpkYXRldGltZSA9IE5VTEw7CisgIGdpbnQgdmVyc2lvbjsKKworICAvKiBtYWtlIHN1cmUgd2UgaGF2ZSBhIHVzYWJsZSB0YWdsaXN0ICovCisgIHF0ZGVtdXgtPnRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X21ha2Vfd3JpdGFibGUgKHF0ZGVtdXgtPnRhZ19saXN0KTsKKworICBtdmhkID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChxdGRlbXV4LT5tb292X25vZGUsIEZPVVJDQ19tdmhkKTsKKyAgaWYgKG12aGQgPT0gTlVMTCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiTm8gbXZoZCBub2RlIGZvdW5kLCBsb29raW5nIGZvciByZWRpcmVjdHMuIik7CisgICAgcmV0dXJuIHF0ZGVtdXhfcGFyc2VfcmVkaXJlY3RzIChxdGRlbXV4KTsKKyAgfQorCisgIHZlcnNpb24gPSBRVF9VSU5UOCAoKGd1aW50OCAqKSBtdmhkLT5kYXRhICsgOCk7CisgIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICBjcmVhdGlvbl90aW1lID0gUVRfVUlOVDY0ICgoZ3VpbnQ4ICopIG12aGQtPmRhdGEgKyAxMik7CisgICAgcXRkZW11eC0+dGltZXNjYWxlID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIG12aGQtPmRhdGEgKyAyOCk7CisgICAgcXRkZW11eC0+ZHVyYXRpb24gPSBRVF9VSU5UNjQgKChndWludDggKikgbXZoZC0+ZGF0YSArIDMyKTsKKyAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKKyAgICBjcmVhdGlvbl90aW1lID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIG12aGQtPmRhdGEgKyAxMik7CisgICAgcXRkZW11eC0+dGltZXNjYWxlID0gUVRfVUlOVDMyICgoZ3VpbnQ4ICopIG12aGQtPmRhdGEgKyAyMCk7CisgICAgcXRkZW11eC0+ZHVyYXRpb24gPSBRVF9VSU5UMzIgKChndWludDggKikgbXZoZC0+ZGF0YSArIDI0KTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHF0ZGVtdXgsICJVbmhhbmRsZWQgbXZoZCB2ZXJzaW9uICVkIiwgdmVyc2lvbik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogTW92aW5nIHF0IGNyZWF0aW9uIHRpbWUgKHNlY3Mgc2luY2UgMTkwNCkgdG8gdW5peCB0aW1lICovCisgIGlmIChjcmVhdGlvbl90aW1lICE9IDApIHsKKyAgICAvKiBUcnkgdG8gdXNlIGVwb2NoIGZpcnN0IGFzIGl0IHNob3VsZCBiZSBmYXN0ZXIgYW5kIG1vcmUgY29tbW9ubHkgZm91bmQgKi8KKyAgICBpZiAoY3JlYXRpb25fdGltZSA+PSBRVERFTVVYX1NFQ09ORFNfRlJPTV8xOTA0X1RPXzE5NzApIHsKKyAgICAgIEdUaW1lVmFsIG5vdzsKKworICAgICAgY3JlYXRpb25fdGltZSAtPSBRVERFTVVYX1NFQ09ORFNfRlJPTV8xOTA0X1RPXzE5NzA7CisgICAgICAvKiBzb21lIGRhdGEgY2xlYW5zaW5nIHNhbml0eSAqLworICAgICAgZ19nZXRfY3VycmVudF90aW1lICgmbm93KTsKKyAgICAgIGlmIChub3cudHZfc2VjICsgMjQgKiAzNjAwIDwgY3JlYXRpb25fdGltZSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiZGlzY2FyZGluZyBib2d1cyBmdXR1cmUgY3JlYXRpb24gdGltZSIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0ZXRpbWUgPSBnc3RfZGF0ZV90aW1lX25ld19mcm9tX3VuaXhfZXBvY2hfdXRjIChjcmVhdGlvbl90aW1lKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgR0RhdGVUaW1lICpiYXNlX2R0ID0gZ19kYXRlX3RpbWVfbmV3X3V0YyAoMTkwNCwgMSwgMSwgMCwgMCwgMCk7CisgICAgICBHRGF0ZVRpbWUgKmR0LCAqZHRfbG9jYWw7CisKKyAgICAgIGR0ID0gZ19kYXRlX3RpbWVfYWRkX3NlY29uZHMgKGJhc2VfZHQsIGNyZWF0aW9uX3RpbWUpOworICAgICAgZHRfbG9jYWwgPSBnX2RhdGVfdGltZV90b19sb2NhbCAoZHQpOworICAgICAgZGF0ZXRpbWUgPSBnc3RfZGF0ZV90aW1lX25ld19mcm9tX2dfZGF0ZV90aW1lIChkdF9sb2NhbCk7CisKKyAgICAgIGdfZGF0ZV90aW1lX3VucmVmIChiYXNlX2R0KTsKKyAgICAgIGdfZGF0ZV90aW1lX3VucmVmIChkdCk7CisgICAgfQorICB9CisgIGlmIChkYXRldGltZSkgeworICAgIC8qIFVzZSBLRUVQIGFzIGV4cGxpY2l0IHRhZ3Mgc2hvdWxkIGhhdmUgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiBtdmhkIHRhZyAqLworICAgIGdzdF90YWdfbGlzdF9hZGQgKHF0ZGVtdXgtPnRhZ19saXN0LCBHU1RfVEFHX01FUkdFX0tFRVAsIEdTVF9UQUdfREFURV9USU1FLAorICAgICAgICBkYXRldGltZSwgTlVMTCk7CisgICAgZ3N0X2RhdGVfdGltZV91bnJlZiAoZGF0ZXRpbWUpOworICB9CisKKyAgR1NUX0lORk9fT0JKRUNUIChxdGRlbXV4LCAidGltZXNjYWxlOiAldSIsIHF0ZGVtdXgtPnRpbWVzY2FsZSk7CisgIEdTVF9JTkZPX09CSkVDVCAocXRkZW11eCwgImR1cmF0aW9uOiAlIiBHX0dVSU5UNjRfRk9STUFULCBxdGRlbXV4LT5kdXJhdGlvbik7CisKKyAgLyogY2hlY2sgZm9yIGZyYWdtZW50ZWQgZmlsZSBhbmQgZ2V0IHNvbWUgKGRlZmF1bHQpIGRhdGEgKi8KKyAgbXZleCA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAocXRkZW11eC0+bW9vdl9ub2RlLCBGT1VSQ0NfbXZleCk7CisgIGlmIChtdmV4KSB7CisgICAgR05vZGUgKm1laGQ7CisgICAgR3N0Qnl0ZVJlYWRlciBtZWhkX2RhdGE7CisKKyAgICAvKiBsZXQgdHJhY2sgcGFyc2luZyBvciBhbnlvbmUga25vdyB3ZWlyZCBzdHVmZiBtaWdodCBoYXBwZW4gLi4uICovCisgICAgcXRkZW11eC0+ZnJhZ21lbnRlZCA9IFRSVUU7CisKKyAgICAvKiBjb21wZW5zYXRlIGZvciB0b3RhbCBkdXJhdGlvbiAqLworICAgIG1laGQgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGVfZnVsbCAobXZleCwgRk9VUkNDX21laGQsICZtZWhkX2RhdGEpOworICAgIGlmIChtZWhkKQorICAgICAgcXRkZW11eF9wYXJzZV9tZWhkIChxdGRlbXV4LCAmbWVoZF9kYXRhKTsKKyAgfQorCisgIC8qIHNldCBkdXJhdGlvbiBpbiB0aGUgc2VnbWVudCBpbmZvICovCisgIGdzdF9xdGRlbXV4X2dldF9kdXJhdGlvbiAocXRkZW11eCwgJmR1cmF0aW9uKTsKKyAgaWYgKGR1cmF0aW9uKSB7CisgICAgcXRkZW11eC0+c2VnbWVudC5kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgIC8qIGFsc28gZG8gbm90IGV4Y2VlZCBkdXJhdGlvbjsgc3RvcCBpcyBzZXQgdGhhdCB3YXkgcG9zdCBzZWVrIGFueXdheSwKKyAgICAgKiBhbmQgc2VnbWVudCBhY3RpdmF0aW9uIGZhbGxzIGJhY2sgdG8gZHVyYXRpb24sCisgICAgICogd2hlcmVhcyBsb29wIG9ubHkgY2hlY2tzIHN0b3AsIHNvIGxldCdzIGFsaWduIHRoaXMgaGVyZSBhcyB3ZWxsICovCisgICAgcXRkZW11eC0+c2VnbWVudC5zdG9wID0gZHVyYXRpb247CisgIH0KKworICAvKiBwYXJzZSBhbGwgdHJha3MgKi8KKyAgdHJhayA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAocXRkZW11eC0+bW9vdl9ub2RlLCBGT1VSQ0NfdHJhayk7CisgIHdoaWxlICh0cmFrKSB7CisgICAgcXRkZW11eF9wYXJzZV90cmFrIChxdGRlbXV4LCB0cmFrKTsKKyAgICAvKiBpdGVyYXRlIGFsbCBzaWJsaW5ncyAqLworICAgIHRyYWsgPSBxdGRlbXV4X3RyZWVfZ2V0X3NpYmxpbmdfYnlfdHlwZSAodHJhaywgRk9VUkNDX3RyYWspOworICB9CisKKyAgcXRkZW11eC0+dGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbWFrZV93cml0YWJsZSAocXRkZW11eC0+dGFnX2xpc3QpOworCisgIC8qIGZpbmQgdGFncyAqLworICB1ZHRhID0gcXRkZW11eF90cmVlX2dldF9jaGlsZF9ieV90eXBlIChxdGRlbXV4LT5tb292X25vZGUsIEZPVVJDQ191ZHRhKTsKKyAgaWYgKHVkdGEpIHsKKyAgICBxdGRlbXV4X3BhcnNlX3VkdGEgKHF0ZGVtdXgsIHF0ZGVtdXgtPnRhZ19saXN0LCB1ZHRhKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIk5vIHVkdGEgbm9kZSBmb3VuZC4iKTsKKyAgfQorCisgIC8qIG1heWJlIGFsc28gc29tZSB0YWdzIGluIG1ldGEgYm94ICovCisgIHVkdGEgPSBxdGRlbXV4X3RyZWVfZ2V0X2NoaWxkX2J5X3R5cGUgKHF0ZGVtdXgtPm1vb3Zfbm9kZSwgRk9VUkNDX21ldGEpOworICBpZiAodWR0YSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJQYXJzaW5nIG1ldGEgYm94IGZvciB0YWdzLiIpOworICAgIHF0ZGVtdXhfcGFyc2VfdWR0YSAocXRkZW11eCwgcXRkZW11eC0+dGFnX2xpc3QsIHVkdGEpOworICB9IGVsc2UgeworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiTm8gbWV0YSBub2RlIGZvdW5kLiIpOworICB9CisKKyAgLyogcGFyc2UgYW55IHByb3RlY3Rpb24gc3lzdGVtIGluZm8gKi8KKyAgcHNzaCA9IHF0ZGVtdXhfdHJlZV9nZXRfY2hpbGRfYnlfdHlwZSAocXRkZW11eC0+bW9vdl9ub2RlLCBGT1VSQ0NfcHNzaCk7CisgIHdoaWxlIChwc3NoKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICJQYXJzaW5nIHBzc2ggYm94LiIpOworICAgIHF0ZGVtdXhfcGFyc2VfcHNzaCAocXRkZW11eCwgcHNzaCk7CisgICAgcHNzaCA9IHF0ZGVtdXhfdHJlZV9nZXRfc2libGluZ19ieV90eXBlIChwc3NoLCBGT1VSQ0NfcHNzaCk7CisgIH0KKworICBxdGRlbXV4LT50YWdfbGlzdCA9IHF0ZGVtdXhfYWRkX2NvbnRhaW5lcl9mb3JtYXQgKHF0ZGVtdXgsIHF0ZGVtdXgtPnRhZ19saXN0KTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogdGFrZW4gZnJvbSBmZm1wZWcgKi8KK3N0YXRpYyBpbnQKK3JlYWRfZGVzY3Jfc2l6ZSAoZ3VpbnQ4ICogcHRyLCBndWludDggKiBlbmQsIGd1aW50OCAqKiBlbmRfb3V0KQoreworICBpbnQgY291bnQgPSA0OworICBpbnQgbGVuID0gMDsKKworICB3aGlsZSAoY291bnQtLSkgeworICAgIGludCBjOworCisgICAgaWYgKHB0ciA+PSBlbmQpCisgICAgICByZXR1cm4gLTE7CisKKyAgICBjID0gKnB0cisrOworICAgIGxlbiA9IChsZW4gPDwgNykgfCAoYyAmIDB4N2YpOworICAgIGlmICghKGMgJiAweDgwKSkKKyAgICAgIGJyZWFrOworICB9CisgICplbmRfb3V0ID0gcHRyOworICByZXR1cm4gbGVuOworfQorCisvKiB0aGlzIGNhbiBjaGFuZ2UgdGhlIGNvZGVjIG9yaWdpbmFsbHkgcHJlc2VudCBpbiBAbGlzdCAqLworc3RhdGljIHZvaWQKK2dzdF9xdGRlbXV4X2hhbmRsZV9lc2RzIChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwKKyAgICBRdERlbXV4U3RyZWFtU3RzZEVudHJ5ICogZW50cnksIEdOb2RlICogZXNkcywgR3N0VGFnTGlzdCAqIGxpc3QpCit7CisgIGludCBsZW4gPSBRVF9VSU5UMzIgKGVzZHMtPmRhdGEpOworICBndWludDggKnB0ciA9IGVzZHMtPmRhdGE7CisgIGd1aW50OCAqZW5kID0gcHRyICsgbGVuOworICBpbnQgdGFnOworICBndWludDggKmRhdGFfcHRyID0gTlVMTDsKKyAgaW50IGRhdGFfbGVuID0gMDsKKyAgZ3VpbnQ4IG9iamVjdF90eXBlX2lkID0gMDsKKyAgY29uc3QgY2hhciAqY29kZWNfbmFtZSA9IE5VTEw7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworCisgIEdTVF9NRU1EVU1QX09CSkVDVCAocXRkZW11eCwgImVzZHMiLCBwdHIsIGxlbik7CisgIHB0ciArPSA4OworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAidmVyc2lvbi9mbGFncyA9ICUwOHgiLCBRVF9VSU5UMzIgKHB0cikpOworICBwdHIgKz0gNDsKKyAgd2hpbGUgKHB0ciArIDEgPCBlbmQpIHsKKyAgICB0YWcgPSBRVF9VSU5UOCAocHRyKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAidGFnID0gJTAyeCIsIHRhZyk7CisgICAgcHRyKys7CisgICAgbGVuID0gcmVhZF9kZXNjcl9zaXplIChwdHIsIGVuZCwgJnB0cik7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImxlbiA9ICVkIiwgbGVuKTsKKworICAgIC8qIENoZWNrIHRoZSBzdGF0ZWQgYW1vdW50IG9mIGRhdGEgaXMgYXZhaWxhYmxlIGZvciByZWFkaW5nICovCisgICAgaWYgKGxlbiA8IDAgfHwgcHRyICsgbGVuID4gZW5kKQorICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKHRhZykgeworICAgICAgY2FzZSBFU19ERVNDUklQVE9SX1RBRzoKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgIklEICUwNHgiLCBRVF9VSU5UMTYgKHB0cikpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicHJpb3JpdHkgJTA0eCIsIFFUX1VJTlQ4IChwdHIgKyAyKSk7CisgICAgICAgIHB0ciArPSAzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgREVDT0RFUl9DT05GSUdfREVTQ19UQUc6eworICAgICAgICBndWludCBtYXhfYml0cmF0ZSwgYXZnX2JpdHJhdGU7CisKKyAgICAgICAgb2JqZWN0X3R5cGVfaWQgPSBRVF9VSU5UOCAocHRyKTsKKyAgICAgICAgbWF4X2JpdHJhdGUgPSBRVF9VSU5UMzIgKHB0ciArIDUpOworICAgICAgICBhdmdfYml0cmF0ZSA9IFFUX1VJTlQzMiAocHRyICsgOSk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJvYmplY3RfdHlwZV9pZCAlMDJ4Iiwgb2JqZWN0X3R5cGVfaWQpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAic3RyZWFtX3R5cGUgJTAyeCIsIFFUX1VJTlQ4IChwdHIgKyAxKSk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJidWZmZXJfc2l6ZV9kYiAlMDJ4IiwgUVRfVUlOVDI0IChwdHIgKyAyKSk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJtYXggYml0cmF0ZSAldSIsIG1heF9iaXRyYXRlKTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocXRkZW11eCwgImF2ZyBiaXRyYXRlICV1IiwgYXZnX2JpdHJhdGUpOworICAgICAgICBpZiAobWF4X2JpdHJhdGUgPiAwICYmIG1heF9iaXRyYXRlIDwgR19NQVhVSU5UMzIpIHsKKyAgICAgICAgICBnc3RfdGFnX2xpc3RfYWRkIChsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgICAgIEdTVF9UQUdfTUFYSU1VTV9CSVRSQVRFLCBtYXhfYml0cmF0ZSwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2Z19iaXRyYXRlID4gMCAmJiBhdmdfYml0cmF0ZSA8IEdfTUFYVUlOVDMyKSB7CisgICAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAobGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLCBHU1RfVEFHX0JJVFJBVEUsCisgICAgICAgICAgICAgIGF2Z19iaXRyYXRlLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBwdHIgKz0gMTM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBERUNPREVSX1NQRUNJRklDX0lORk9fVEFHOgorICAgICAgICBHU1RfTUVNRFVNUF9PQkpFQ1QgKHF0ZGVtdXgsICJkYXRhIiwgcHRyLCBsZW4pOworICAgICAgICBpZiAob2JqZWN0X3R5cGVfaWQgPT0gMHhlMCAmJiBsZW4gPT0gMHg0MCkgeworICAgICAgICAgIGd1aW50OCAqZGF0YTsKKyAgICAgICAgICBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgICAgICAgZ3VpbnQzMiBjbHV0WzE2XTsKKyAgICAgICAgICBnaW50IGk7CisKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LAorICAgICAgICAgICAgICAiSGF2ZSBWT0JTVUIgcGFsZXR0ZS4gQ3JlYXRpbmcgcGFsZXR0ZSBldmVudCIpOworICAgICAgICAgIC8qIG1vdmUgdG8gZGVjQ29uZmlnRGVzY3IgZGF0YSBhbmQgcmVhZCBwYWxldHRlICovCisgICAgICAgICAgZGF0YSA9IHB0cjsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgY2x1dFtpXSA9IFFUX1VJTlQzMiAoZGF0YSk7CisgICAgICAgICAgICBkYXRhICs9IDQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1nc3QtZHZkIiwgImV2ZW50IiwKKyAgICAgICAgICAgICAgR19UWVBFX1NUUklORywgImR2ZC1zcHUtY2x1dC1jaGFuZ2UiLAorICAgICAgICAgICAgICAiY2x1dDAwIiwgR19UWVBFX0lOVCwgY2x1dFswXSwgImNsdXQwMSIsIEdfVFlQRV9JTlQsIGNsdXRbMV0sCisgICAgICAgICAgICAgICJjbHV0MDIiLCBHX1RZUEVfSU5ULCBjbHV0WzJdLCAiY2x1dDAzIiwgR19UWVBFX0lOVCwgY2x1dFszXSwKKyAgICAgICAgICAgICAgImNsdXQwNCIsIEdfVFlQRV9JTlQsIGNsdXRbNF0sICJjbHV0MDUiLCBHX1RZUEVfSU5ULCBjbHV0WzVdLAorICAgICAgICAgICAgICAiY2x1dDA2IiwgR19UWVBFX0lOVCwgY2x1dFs2XSwgImNsdXQwNyIsIEdfVFlQRV9JTlQsIGNsdXRbN10sCisgICAgICAgICAgICAgICJjbHV0MDgiLCBHX1RZUEVfSU5ULCBjbHV0WzhdLCAiY2x1dDA5IiwgR19UWVBFX0lOVCwgY2x1dFs5XSwKKyAgICAgICAgICAgICAgImNsdXQxMCIsIEdfVFlQRV9JTlQsIGNsdXRbMTBdLCAiY2x1dDExIiwgR19UWVBFX0lOVCwgY2x1dFsxMV0sCisgICAgICAgICAgICAgICJjbHV0MTIiLCBHX1RZUEVfSU5ULCBjbHV0WzEyXSwgImNsdXQxMyIsIEdfVFlQRV9JTlQsIGNsdXRbMTNdLAorICAgICAgICAgICAgICAiY2x1dDE0IiwgR19UWVBFX0lOVCwgY2x1dFsxNF0sICJjbHV0MTUiLCBHX1RZUEVfSU5ULCBjbHV0WzE1XSwKKyAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgICAvKiBzdG9yZSBldmVudCBhbmQgdHJpZ2dlciBjdXN0b20gcHJvY2Vzc2luZyAqLworICAgICAgICAgIHN0cmVhbS0+cGVuZGluZ19ldmVudCA9CisgICAgICAgICAgICAgIGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU0sIHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIEdlbmVyaWMgY29kZWNfZGF0YSBoYW5kbGVyIHB1dHMgaXQgb24gdGhlIGNhcHMgKi8KKyAgICAgICAgICBkYXRhX3B0ciA9IHB0cjsKKyAgICAgICAgICBkYXRhX2xlbiA9IGxlbjsKKyAgICAgICAgfQorCisgICAgICAgIHB0ciArPSBsZW47CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTTF9DT05GSUdfREVTQ19UQUc6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJkYXRhICUwMngiLCBRVF9VSU5UOCAocHRyKSk7CisgICAgICAgIHB0ciArPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJVbmtub3duL3VuaGFuZGxlZCBkZXNjcmlwdG9yIHRhZyAlMDJ4IiwKKyAgICAgICAgICAgIHRhZyk7CisgICAgICAgIEdTVF9NRU1EVU1QX09CSkVDVCAocXRkZW11eCwgImRlc2NyaXB0b3IgZGF0YSIsIHB0ciwgbGVuKTsKKyAgICAgICAgcHRyICs9IGxlbjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyogb2JqZWN0X3R5cGVfaWQgaW4gdGhlIGVzZHMgYXRvbSBpbiBtcDRhIGFuZCBtcDR2IHRlbGxzIHVzIHdoaWNoIGNvZGVjIGlzCisgICAqIGluIHVzZSwgYW5kIHNob3VsZCBhbHNvIGJlIHVzZWQgdG8gb3ZlcnJpZGUgc29tZSBvdGhlciBwYXJhbWV0ZXJzIGZvciBzb21lCisgICAqIGNvZGVjcy4gKi8KKyAgc3dpdGNoIChvYmplY3RfdHlwZV9pZCkgeworICAgIGNhc2UgMHgyMDogICAgICAgICAgICAgICAgIC8qIE1QRUctNCAqLworICAgICAgLyogNCBieXRlcyBmb3IgdGhlIHZpc3VhbF9vYmplY3Rfc2VxdWVuY2Vfc3RhcnRfY29kZSBhbmQgMSBieXRlIGZvciB0aGUKKyAgICAgICAqIHByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24gKi8KKyAgICAgIGlmIChkYXRhX3B0ciAhPSBOVUxMICYmIGRhdGFfbGVuID49IDUgJiYKKyAgICAgICAgICBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGFfcHRyKSA9PSAweDAwMDAwMWIwKSB7CisgICAgICAgIGdzdF9jb2RlY191dGlsc19tcGVnNHZpZGVvX2NhcHNfc2V0X2xldmVsX2FuZF9wcm9maWxlIChlbnRyeS0+Y2FwcywKKyAgICAgICAgICAgIGRhdGFfcHRyICsgNCwgZGF0YV9sZW4gLSA0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgLyogTm90aGluZyBzcGVjaWFsIG5lZWRlZCBoZXJlICovCisgICAgY2FzZSAweDIxOiAgICAgICAgICAgICAgICAgLyogSC4yNjQgKi8KKyAgICAgIGNvZGVjX25hbWUgPSAiSC4yNjQgLyBBVkMiOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWgyNjQiLAorICAgICAgICAgICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgImF2YyIsCisgICAgICAgICAgImFsaWdubWVudCIsIEdfVFlQRV9TVFJJTkcsICJhdSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDQwOiAgICAgICAgICAgICAgICAgLyogQUFDIChhbnkpICovCisgICAgY2FzZSAweDY2OiAgICAgICAgICAgICAgICAgLyogQUFDIE1haW4gKi8KKyAgICBjYXNlIDB4Njc6ICAgICAgICAgICAgICAgICAvKiBBQUMgTEMgKi8KKyAgICBjYXNlIDB4Njg6ICAgICAgICAgICAgICAgICAvKiBBQUMgU1NSICovCisgICAgICAvKiBPdmVycmlkZSBjaGFubmVscyBhbmQgcmF0ZSBiYXNlZCBvbiB0aGUgY29kZWNfZGF0YSwgYXMgaXQncyBvZnRlbgorICAgICAgICogd3JvbmcuICovCisgICAgICAvKiBPbmx5IGRvIHNvIGZvciBiYXNpYyBzZXR1cCB3aXRob3V0IEhFLUFBQyBleHRlbnNpb24gKi8KKyAgICAgIGlmIChkYXRhX3B0ciAmJiBkYXRhX2xlbiA9PSAyKSB7CisgICAgICAgIGd1aW50IGNoYW5uZWxzLCByYXRlOworCisgICAgICAgIGNoYW5uZWxzID0gZ3N0X2NvZGVjX3V0aWxzX2FhY19nZXRfY2hhbm5lbHMgKGRhdGFfcHRyLCBkYXRhX2xlbik7CisgICAgICAgIGlmIChjaGFubmVscyA+IDApCisgICAgICAgICAgZW50cnktPm5fY2hhbm5lbHMgPSBjaGFubmVsczsKKworICAgICAgICByYXRlID0gZ3N0X2NvZGVjX3V0aWxzX2FhY19nZXRfc2FtcGxlX3JhdGUgKGRhdGFfcHRyLCBkYXRhX2xlbik7CisgICAgICAgIGlmIChyYXRlID4gMCkKKyAgICAgICAgICBlbnRyeS0+cmF0ZSA9IHJhdGU7CisgICAgICB9CisKKyAgICAgIC8qIFNldCBsZXZlbCBhbmQgcHJvZmlsZSBpZiBwb3NzaWJsZSAqLworICAgICAgaWYgKGRhdGFfcHRyICE9IE5VTEwgJiYgZGF0YV9sZW4gPj0gMikgeworICAgICAgICBnc3RfY29kZWNfdXRpbHNfYWFjX2NhcHNfc2V0X2xldmVsX2FuZF9wcm9maWxlIChlbnRyeS0+Y2FwcywKKyAgICAgICAgICAgIGRhdGFfcHRyLCBkYXRhX2xlbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBnY2hhciAqcHJvZmlsZV9zdHIgPSBOVUxMOworICAgICAgICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgICAgICAgR3N0TWFwSW5mbyBtYXA7CisgICAgICAgIGd1aW50OCAqY29kZWNfZGF0YTsKKyAgICAgICAgZ2ludCByYXRlX2lkeCwgcHJvZmlsZTsKKworICAgICAgICAvKiBObyBjb2RlY19kYXRhLCBsZXQncyBpbnZlbnQgc29tZXRoaW5nLgorICAgICAgICAgKiBGSVhNRTogVGhpcyBpcyB3cm9uZyBmb3IgU0JSISAqLworCisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocXRkZW11eCwgIk5vIGNvZGVjX2RhdGEgZm9yIEFBQyBhdmFpbGFibGUiKTsKKworICAgICAgICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDIpOworICAgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICAgICAgY29kZWNfZGF0YSA9IG1hcC5kYXRhOworCisgICAgICAgIHJhdGVfaWR4ID0KKyAgICAgICAgICAgIGdzdF9jb2RlY191dGlsc19hYWNfZ2V0X2luZGV4X2Zyb21fc2FtcGxlX3JhdGUgKENVUl9TVFJFQU0KKyAgICAgICAgICAgIChzdHJlYW0pLT5yYXRlKTsKKworICAgICAgICBzd2l0Y2ggKG9iamVjdF90eXBlX2lkKSB7CisgICAgICAgICAgY2FzZSAweDY2OgorICAgICAgICAgICAgcHJvZmlsZV9zdHIgPSAibWFpbiI7CisgICAgICAgICAgICBwcm9maWxlID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMHg2NzoKKyAgICAgICAgICAgIHByb2ZpbGVfc3RyID0gImxjIjsKKyAgICAgICAgICAgIHByb2ZpbGUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAweDY4OgorICAgICAgICAgICAgcHJvZmlsZV9zdHIgPSAic3NyIjsKKyAgICAgICAgICAgIHByb2ZpbGUgPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHByb2ZpbGUgPSAzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb2RlY19kYXRhWzBdID0gKChwcm9maWxlICsgMSkgPDwgMykgfCAoKHJhdGVfaWR4ICYgMHhFKSA+PiAxKTsKKyAgICAgICAgY29kZWNfZGF0YVsxXSA9CisgICAgICAgICAgICAoKHJhdGVfaWR4ICYgMHgxKSA8PCA3KSB8IChDVVJfU1RSRUFNIChzdHJlYW0pLT5uX2NoYW5uZWxzIDw8IDMpOworCisgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKENVUl9TVFJFQU0gKHN0cmVhbSktPmNhcHMsICJjb2RlY19kYXRhIiwKKyAgICAgICAgICAgIEdTVF9UWVBFX0JVRkZFUiwgYnVmZmVyLCBOVUxMKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICAgICAgICBpZiAocHJvZmlsZV9zdHIpIHsKKyAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChDVVJfU1RSRUFNIChzdHJlYW0pLT5jYXBzLCAicHJvZmlsZSIsCisgICAgICAgICAgICAgIEdfVFlQRV9TVFJJTkcsIHByb2ZpbGVfc3RyLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAweDYwOiAgICAgICAgICAgICAgICAgLyogTVBFRy0yLCB2YXJpb3VzIHByb2ZpbGVzICovCisgICAgY2FzZSAweDYxOgorICAgIGNhc2UgMHg2MjoKKyAgICBjYXNlIDB4NjM6CisgICAgY2FzZSAweDY0OgorICAgIGNhc2UgMHg2NToKKyAgICAgIGNvZGVjX25hbWUgPSAiTVBFRy0yIHZpZGVvIjsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8vbXBlZyIsCisgICAgICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMiwKKyAgICAgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg2OTogICAgICAgICAgICAgICAgIC8qIE1QRUctMiBCQyBhdWRpbyAqLworICAgIGNhc2UgMHg2QjogICAgICAgICAgICAgICAgIC8qIE1QRUctMSBhdWRpbyAqLworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9tcGVnIiwKKyAgICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgICAgIGNvZGVjX25hbWUgPSAiTVBFRy0xIGF1ZGlvIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg2QTogICAgICAgICAgICAgICAgIC8qIE1QRUctMSAqLworICAgICAgY29kZWNfbmFtZSA9ICJNUEVHLTEgdmlkZW8iOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby9tcGVnIiwKKyAgICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLAorICAgICAgICAgICJzeXN0ZW1zdHJlYW0iLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDZDOiAgICAgICAgICAgICAgICAgLyogTUpQRUcgKi8KKyAgICAgIGNhcHMgPQorICAgICAgICAgIGdzdF9jYXBzX25ld19zaW1wbGUgKCJpbWFnZS9qcGVnIiwgInBhcnNlZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLAorICAgICAgICAgIE5VTEwpOworICAgICAgY29kZWNfbmFtZSA9ICJNb3Rpb24tSlBFRyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4NkQ6ICAgICAgICAgICAgICAgICAvKiBQTkcgKi8KKyAgICAgIGNhcHMgPQorICAgICAgICAgIGdzdF9jYXBzX25ld19zaW1wbGUgKCJpbWFnZS9wbmciLCAicGFyc2VkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsCisgICAgICAgICAgTlVMTCk7CisgICAgICBjb2RlY19uYW1lID0gIlBORyBzdGlsbCBpbWFnZXMiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDZFOiAgICAgICAgICAgICAgICAgLyogSlBFRzIwMDAgKi8KKyAgICAgIGNvZGVjX25hbWUgPSAiSlBFRy0yMDAwIjsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiaW1hZ2UveC1qMmMiLCAiZmllbGRzIiwgR19UWVBFX0lOVCwgMSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4QTQ6ICAgICAgICAgICAgICAgICAvKiBEaXJhYyAqLworICAgICAgY29kZWNfbmFtZSA9ICJEaXJhYyI7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtZGlyYWMiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHhBNTogICAgICAgICAgICAgICAgIC8qIEFDMyAqLworICAgICAgY29kZWNfbmFtZSA9ICJBQy0zIGF1ZGlvIjsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1hYzMiLAorICAgICAgICAgICJmcmFtZWQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4QTk6ICAgICAgICAgICAgICAgICAvKiBBQzMgKi8KKyAgICAgIGNvZGVjX25hbWUgPSAiRFRTIGF1ZGlvIjsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1kdHMiLAorICAgICAgICAgICJmcmFtZWQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4RTE6ICAgICAgICAgICAgICAgICAvKiBRQ0VMUCAqLworICAgICAgLyogUUNFTFAsIHRoZSBjb2RlY19kYXRhIGlzIGEgcmlmZiB0YWcgKGxpdHRsZSBlbmRpYW4pIHdpdGgKKyAgICAgICAqIG1vcmUgaW5mbyAoaHR0cDovL2Z0cC4zZ3BwMi5vcmcvVFNHQy9Xb3JraW5nLzIwMDMvMjAwMy0wNS1TYW5EaWVnby9UU0ctQy0yMDAzLTA1LVNhbiUyMERpZWdvL1dHMS9TV0cxMi9DMTItMjAwMzA1MTItMDA2JTIwPSUyMEMxMi0yMDAzMDIxNy0wMTVfRHJhZnRfQmFzZWxpbmUlMjBUZXh0JTIwb2YlMjBGRk1TX1IyLmRvYykuICovCisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3FjZWxwIik7CisgICAgICBjb2RlY19uYW1lID0gIlFDRUxQIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIElmIHdlIGhhdmUgYSByZXBsYWNlbWVudCBjYXBzLCB0aGVuIGNoYW5nZSBvdXIgY2FwcyBmb3IgdGhpcyBzdHJlYW0gKi8KKyAgaWYgKGNhcHMpIHsKKyAgICBnc3RfY2Fwc191bnJlZiAoZW50cnktPmNhcHMpOworICAgIGVudHJ5LT5jYXBzID0gY2FwczsKKyAgfQorCisgIGlmIChjb2RlY19uYW1lICYmIGxpc3QpCisgICAgZ3N0X3RhZ19saXN0X2FkZCAobGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICBHU1RfVEFHX0FVRElPX0NPREVDLCBjb2RlY19uYW1lLCBOVUxMKTsKKworICAvKiBBZGQgdGhlIGNvZGVjX2RhdGEgYXR0cmlidXRlIHRvIGNhcHMsIGlmIHdlIGhhdmUgaXQgKi8KKyAgaWYgKGRhdGFfcHRyKSB7CisgICAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGRhdGFfbGVuKTsKKyAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZmZlciwgMCwgZGF0YV9wdHIsIGRhdGFfbGVuKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJzZXR0aW5nIGNvZGVjX2RhdGEgZnJvbSBlc2RzIik7CisgICAgR1NUX01FTURVTVBfT0JKRUNUIChxdGRlbXV4LCAiY29kZWNfZGF0YSBmcm9tIGVzZHMiLCBkYXRhX3B0ciwgZGF0YV9sZW4pOworCisgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZW50cnktPmNhcHMsICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLAorICAgICAgICBidWZmZXIsIE5VTEwpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgIH0KKworfQorCitzdGF0aWMgaW5saW5lIEdzdENhcHMgKgorX2dldF91bmtub3duX2NvZGVjX25hbWUgKGNvbnN0IGdjaGFyICogdHlwZSwgZ3VpbnQzMiBmb3VyY2MpCit7CisgIEdzdENhcHMgKmNhcHM7CisgIGd1aW50IGk7CisgIGNoYXIgKnMsIGZvdXJzdHJbNV07CisKKyAgZ19zbnByaW50ZiAoZm91cnN0ciwgNSwgIiUiIEdTVF9GT1VSQ0NfRk9STUFULCBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYykpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgaWYgKCFnX2FzY2lpX2lzYWxudW0gKGZvdXJzdHJbaV0pKQorICAgICAgZm91cnN0cltpXSA9ICdfJzsKKyAgfQorICBzID0gZ19zdHJkdXBfcHJpbnRmICgiJXMveC1nc3QtZm91cmNjLSVzIiwgdHlwZSwgZ19zdHJzdHJpcCAoZm91cnN0cikpOworICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAocyk7CisgIGdfZnJlZSAocyk7CisgIHJldHVybiBjYXBzOworfQorCisjZGVmaW5lIF9jb2RlYyhuYW1lKSBcCisgIGRvIHsgXAorICAgIGlmIChjb2RlY19uYW1lKSB7IFwKKyAgICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXAgKG5hbWUpOyBcCisgICAgfSBcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBHc3RDYXBzICoKK3F0ZGVtdXhfdmlkZW9fY2FwcyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIFF0RGVtdXhTdHJlYW0gKiBzdHJlYW0sCisgICAgUXREZW11eFN0cmVhbVN0c2RFbnRyeSAqIGVudHJ5LCBndWludDMyIGZvdXJjYywKKyAgICBjb25zdCBndWludDggKiBzdHNkX2VudHJ5X2RhdGEsIGdjaGFyICoqIGNvZGVjX25hbWUpCit7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworICBHc3RWaWRlb0Zvcm1hdCBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1VOS05PV047CisKKyAgc3dpdGNoIChmb3VyY2MpIHsKKyAgICBjYXNlIEZPVVJDQ19wbmc6CisgICAgICBfY29kZWMgKCJQTkcgc3RpbGwgaW1hZ2VzIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImltYWdlL3BuZyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfanBlZzoKKyAgICAgIF9jb2RlYyAoIkpQRUcgc3RpbGwgaW1hZ2VzIik7CisgICAgICBjYXBzID0KKyAgICAgICAgICBnc3RfY2Fwc19uZXdfc2ltcGxlICgiaW1hZ2UvanBlZyIsICJwYXJzZWQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwKKyAgICAgICAgICBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnbScsICdqJywgJ3AnLCAnYScpOgorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnQScsICdWJywgJ0QnLCAnSicpOgorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnTScsICdKJywgJ1AnLCAnRycpOgorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnZCcsICdtJywgJ2InLCAnMScpOgorICAgICAgX2NvZGVjICgiTW90aW9uLUpQRUciKTsKKyAgICAgIGNhcHMgPQorICAgICAgICAgIGdzdF9jYXBzX25ld19zaW1wbGUgKCJpbWFnZS9qcGVnIiwgInBhcnNlZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLAorICAgICAgICAgIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdtJywgJ2onLCAncCcsICdiJyk6CisgICAgICBfY29kZWMgKCJNb3Rpb24tSlBFRyBmb3JtYXQgQiIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LW1qcGVnLWIiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX21qcDI6CisgICAgICBfY29kZWMgKCJKUEVHLTIwMDAiKTsKKyAgICAgIC8qIG92ZXJyaWRlIHRvIHdoYXQgaXQgc2hvdWxkIGJlIGFjY29yZGluZyB0byBzcGVjLCBhdm9pZCBwYWxldHRlX2RhdGEgKi8KKyAgICAgIGVudHJ5LT5iaXRzX3Blcl9zYW1wbGUgPSAyNDsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiaW1hZ2UveC1qMmMiLCAiZmllbGRzIiwgR19UWVBFX0lOVCwgMSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19TVlEzOgorICAgICAgX2NvZGVjICgiU29yZW5zZW4gdmlkZW8gdi4zIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtc3ZxIiwKKyAgICAgICAgICAic3ZxdmVyc2lvbiIsIEdfVFlQRV9JTlQsIDMsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdzJywgJ3YnLCAncScsICdpJyk6CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdTJywgJ1YnLCAnUScsICcxJyk6CisgICAgICBfY29kZWMgKCJTb3JlbnNlbiB2aWRlbyB2LjEiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1zdnEiLAorICAgICAgICAgICJzdnF2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ1cnLCAnUicsICdBJywgJ1cnKToKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8veC1yYXciKTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiUkdCOFAiLCBOVUxMKTsKKyAgICAgIF9jb2RlYyAoIldpbmRvd3MgUmF3IFJHQiIpOworICAgICAgc3RyZWFtLT5hbGlnbm1lbnQgPSAzMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX3Jhd186CisgICAgeworICAgICAgZ3VpbnQxNiBicHM7CisKKyAgICAgIGJwcyA9IFFUX1VJTlQxNiAoc3RzZF9lbnRyeV9kYXRhICsgODIpOworICAgICAgc3dpdGNoIChicHMpIHsKKyAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1JHQjE1OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE2OgorICAgICAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfUkdCMTY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9SR0I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9BUkdCOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIC8qIHVua25vd24gKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ3knLCAndicsICcxJywgJzInKToKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfSTQyMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneScsICd1JywgJ3YnLCAnMicpOgorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnWScsICd1JywgJ3YnLCAnMicpOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfMnZ1eToKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJzInLCAnVicsICd1JywgJ3knKToKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfVVlWWTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgndicsICczJywgJzAnLCAnOCcpOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF92MzA4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd2JywgJzInLCAnMScsICc2Jyk6CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX3YyMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ192MjEwOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF92MjEwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdyJywgJzInLCAnMScsICcwJyk6CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX3IyMTA7CisgICAgICBicmVhazsKKyAgICAgIC8qIFBhY2tlZCBZVVYgNDo0OjQgMTAgYml0IGluIDMyIGJpdHMsIGNvbXBsZXgKKyAgICAgICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgndicsICc0JywgJzEnLCAnMCcpOgorICAgICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF92NDEwOworICAgICAgICAgYnJlYWs7CisgICAgICAgKi8KKyAgICAgIC8qIFBhY2tlZCBZVVYgNDo0OjQ6NCA4IGJpdCBpbiAzMiBiaXRzCisgICAgICAgKiBidXQgZGlmZmVyZW50IG9yZGVyIHRoYW4gQVlVVgorICAgICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgndicsICc0JywgJzAnLCAnOCcpOgorICAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfdjQwODsKKyAgICAgICBicmVhazsKKyAgICAgICAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnbScsICdwJywgJ2UnLCAnZycpOgorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnbScsICdwJywgJ2cnLCAnMScpOgorICAgICAgX2NvZGVjICgiTVBFRy0xIHZpZGVvIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL21wZWciLCAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLAorICAgICAgICAgICJzeXN0ZW1zdHJlYW0iLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdoJywgJ2QnLCAndicsICcxJyk6IC8qIEhEViA3MjBwMzAgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2gnLCAnZCcsICd2JywgJzInKTogLyogSERWIDEwODBpNjAgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2gnLCAnZCcsICd2JywgJzMnKTogLyogSERWIDEwODBpNTAgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2gnLCAnZCcsICd2JywgJzQnKTogLyogSERWIDcyMHAyNCAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnaCcsICdkJywgJ3YnLCAnNScpOiAvKiBIRFYgNzIwcDI1ICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdoJywgJ2QnLCAndicsICc2Jyk6IC8qIEhEViAxMDgwcDI0ICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdoJywgJ2QnLCAndicsICc3Jyk6IC8qIEhEViAxMDgwcDI1ICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdoJywgJ2QnLCAndicsICc4Jyk6IC8qIEhEViAxMDgwcDMwICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdoJywgJ2QnLCAndicsICc5Jyk6IC8qIEhEViA3MjBwNjAgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2gnLCAnZCcsICd2JywgJ2EnKTogLyogSERWIDcyMHA1MCAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnbScsICd4JywgJzUnLCAnbicpOiAvKiBNUEVHMiBJTVggTlRTQyA1MjUvNjAgNTBtYi9zIHByb2R1Y2VkIGJ5IEZDUCAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnbScsICd4JywgJzUnLCAncCcpOiAvKiBNUEVHMiBJTVggUEFMIDYyNS82MCA1MG1iL3MgcHJvZHVjZWQgYnkgRkNQICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdtJywgJ3gnLCAnNCcsICduJyk6IC8qIE1QRUcyIElNWCBOVFNDIDUyNS82MCA0MG1iL3MgcHJvZHVjZWQgYnkgRkNQICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdtJywgJ3gnLCAnNCcsICdwJyk6IC8qIE1QRUcyIElNWCBQQUwgNjI1LzYwIDQwbWIvcyBwcm9kdWNlZCBieSBGQ1AgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ20nLCAneCcsICczJywgJ24nKTogLyogTVBFRzIgSU1YIE5UU0MgNTI1LzYwIDMwbWIvcyBwcm9kdWNlZCBieSBGQ1AgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ20nLCAneCcsICczJywgJ3AnKTogLyogTVBFRzIgSU1YIFBBTCA2MjUvNTAgMzBtYi9zIHByb2R1Y2VkIGJ5IEZDUCAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJ3YnLCAnMScpOiAvKiBYRENBTSBIRCA3MjBwMzAgMzVNYi9zICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd4JywgJ2QnLCAndicsICcyJyk6IC8qIFhEQ0FNIEhEIDEwODBpNjAgMzVNYi9zICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd4JywgJ2QnLCAndicsICczJyk6IC8qIFhEQ0FNIEhEIDEwODBpNTAgMzVNYi9zICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd4JywgJ2QnLCAndicsICc0Jyk6IC8qIFhEQ0FNIEhEIDcyMHAyNCAzNU1iL3MgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ3gnLCAnZCcsICd2JywgJzUnKTogLyogWERDQU0gSEQgNzIwcDI1IDM1TWIvcyAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJ3YnLCAnNicpOiAvKiBYRENBTSBIRCAxMDgwcDI0IDM1TWIvcyAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJ3YnLCAnNycpOiAvKiBYRENBTSBIRCAxMDgwcDI1IDM1TWIvcyAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJ3YnLCAnOCcpOiAvKiBYRENBTSBIRCAxMDgwcDMwIDM1TWIvcyAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJ3YnLCAnOScpOiAvKiBYRENBTSBIRCA3MjBwNjAgMzVNYi9zICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd4JywgJ2QnLCAndicsICdhJyk6IC8qIFhEQ0FNIEhEIDcyMHA1MCAzNU1iL3MgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ3gnLCAnZCcsICd2JywgJ2InKTogLyogWERDQU0gRVggMTA4MGk2MCA1ME1iL3MgQ0JSICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd4JywgJ2QnLCAndicsICdjJyk6IC8qIFhEQ0FNIEVYIDEwODBpNTAgNTBNYi9zIENCUiAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJ3YnLCAnZCcpOiAvKiBYRENBTSBIRCAxMDgwcDI0IDUwTWIvcyBDQlIgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ3gnLCAnZCcsICd2JywgJ2UnKTogLyogWERDQU0gSEQgMTA4MHAyNSA1ME1iL3MgQ0JSICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd4JywgJ2QnLCAndicsICdmJyk6IC8qIFhEQ0FNIEhEIDEwODBwMzAgNTBNYi9zIENCUiAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJzUnLCAnMScpOiAvKiBYRENBTSBIRDQyMiA3MjBwMzAgNTBNYi9zIENCUiAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJzUnLCAnNCcpOiAvKiBYRENBTSBIRDQyMiA3MjBwMjQgNTBNYi9zIENCUiAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJzUnLCAnNScpOiAvKiBYRENBTSBIRDQyMiA3MjBwMjUgNTBNYi9zIENCUiAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJzUnLCAnOScpOiAvKiBYRENBTSBIRDQyMiA3MjBwNjAgNTBNYi9zIENCUiAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJzUnLCAnYScpOiAvKiBYRENBTSBIRDQyMiA3MjBwNTAgNTBNYi9zIENCUiAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJzUnLCAnYicpOiAvKiBYRENBTSBIRDQyMiAxMDgwaTUwIDUwTWIvcyBDQlIgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ3gnLCAnZCcsICc1JywgJ2MnKTogLyogWERDQU0gSEQ0MjIgMTA4MGk1MCA1ME1iL3MgQ0JSICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd4JywgJ2QnLCAnNScsICdkJyk6IC8qIFhEQ0FNIEhENDIyIDEwODBwMjQgNTBNYi9zIENCUiAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgneCcsICdkJywgJzUnLCAnZScpOiAvKiBYRENBTSBIRDQyMiAxMDgwcDI1IDUwTWIvcyBDQlIgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ3gnLCAnZCcsICc1JywgJ2YnKTogLyogWERDQU0gSEQ0MjIgMTA4MHAzMCA1ME1iL3MgQ0JSICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd4JywgJ2QnLCAnaCcsICdkJyk6IC8qIFhEQ0FNIEhEIDU0MHAgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ3gnLCAnZCcsICdoJywgJzInKTogLyogWERDQU0gSEQ0MjIgNTQwcCAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnQScsICdWJywgJ20nLCAncCcpOiAvKiBBVklEIElNWCBQQUwgKi8KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ20nLCAncCcsICdnJywgJzInKTogLyogQVZJRCBJTVggUEFMICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdtJywgJ3AnLCAnMicsICd2Jyk6IC8qIEFWSUQgSU1YIFBBTCAqLworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnbScsICcyJywgJ3YnLCAnMScpOgorICAgICAgX2NvZGVjICgiTVBFRy0yIHZpZGVvIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL21wZWciLCAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAyLAorICAgICAgICAgICJzeXN0ZW1zdHJlYW0iLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdnJywgJ2knLCAnZicsICcgJyk6CisgICAgICBfY29kZWMgKCJHSUYgc3RpbGwgaW1hZ2VzIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImltYWdlL2dpZiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfaDI2MzoKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ0gnLCAnMicsICc2JywgJzMnKToKKyAgICBjYXNlIEZPVVJDQ19zMjYzOgorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnVScsICcyJywgJzYnLCAnMycpOgorICAgICAgX2NvZGVjICgiSC4yNjMiKTsKKyAgICAgIC8qIGZmbXBlZyB1c2VzIHRoZSBoZWlnaHQvd2lkdGggcHJvcHMsIGRvbid0IGtub3cgd2h5ICovCisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtaDI2MyIsCisgICAgICAgICAgInZhcmlhbnQiLCBHX1RZUEVfU1RSSU5HLCAiaXR1IiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19tcDR2OgorICAgIGNhc2UgRk9VUkNDX01QNFY6CisgICAgICBfY29kZWMgKCJNUEVHLTQgdmlkZW8iKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8vbXBlZyIsICJtcGVndmVyc2lvbiIsIEdfVFlQRV9JTlQsIDQsCisgICAgICAgICAgInN5c3RlbXN0cmVhbSIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJzMnLCAnaScsICd2JywgJ2QnKToKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJzMnLCAnSScsICdWJywgJ0QnKToKKyAgICAgIF9jb2RlYyAoIk1pY3Jvc29mdCBNUEVHLTQgNC4zIik7ICAvKiBGSVhNRT8gKi8KKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1tc21wZWciLAorICAgICAgICAgICJtc21wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgNDMsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdEJywgJ0knLCAnVicsICczJyk6CisgICAgICBfY29kZWMgKCJEaXZYIDMiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1kaXZ4IiwKKyAgICAgICAgICAiZGl2eHZlcnNpb24iLCBHX1RZUEVfSU5ULCAzLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnRCcsICdJJywgJ1YnLCAnWCcpOgorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnZCcsICdpJywgJ3YnLCAneCcpOgorICAgICAgX2NvZGVjICgiRGl2WCA0Iik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtZGl2eCIsCisgICAgICAgICAgImRpdnh2ZXJzaW9uIiwgR19UWVBFX0lOVCwgNCwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ0QnLCAnWCcsICc1JywgJzAnKToKKyAgICAgIF9jb2RlYyAoIkRpdlggNSIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWRpdngiLAorICAgICAgICAgICJkaXZ4dmVyc2lvbiIsIEdfVFlQRV9JTlQsIDUsIE5VTEwpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ0YnLCAnRicsICdWJywgJzEnKToKKyAgICAgIF9jb2RlYyAoIkZGVjEiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1mZnYiLAorICAgICAgICAgICJmZnZ2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMSwgTlVMTCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnMycsICdJJywgJ1YnLCAnMScpOgorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnMycsICdJJywgJ1YnLCAnMicpOgorICAgIGNhc2UgRk9VUkNDX1hWSUQ6CisgICAgY2FzZSBGT1VSQ0NfeHZpZDoKKyAgICBjYXNlIEZPVVJDQ19GTVA0OgorICAgIGNhc2UgRk9VUkNDX2ZtcDQ6CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdVJywgJ00nLCAnUCcsICc0Jyk6CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL21wZWciLCAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCA0LAorICAgICAgICAgICJzeXN0ZW1zdHJlYW0iLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICAgICAgX2NvZGVjICgiTVBFRy00Iik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnYycsICd2JywgJ2knLCAnZCcpOgorICAgICAgX2NvZGVjICgiQ2luZXBhayIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LWNpbmVwYWsiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgncScsICdkJywgJ3InLCAndycpOgorICAgICAgX2NvZGVjICgiQXBwbGUgUXVpY2tEcmF3Iik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtcWRydyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdyJywgJ3AnLCAneicsICdhJyk6CisgICAgICBfY29kZWMgKCJBcHBsZSB2aWRlbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LWFwcGxlLXZpZGVvIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19IMjY0OgorICAgIGNhc2UgRk9VUkNDX2F2YzE6CisgICAgICBfY29kZWMgKCJILjI2NCAvIEFWQyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWgyNjQiLAorICAgICAgICAgICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgImF2YyIsCisgICAgICAgICAgImFsaWdubWVudCIsIEdfVFlQRV9TVFJJTkcsICJhdSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfYXZjMzoKKyAgICAgIF9jb2RlYyAoIkguMjY0IC8gQVZDIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtaDI2NCIsCisgICAgICAgICAgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiYXZjMyIsCisgICAgICAgICAgImFsaWdubWVudCIsIEdfVFlQRV9TVFJJTkcsICJhdSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfSDI2NToKKyAgICBjYXNlIEZPVVJDQ19odmMxOgorICAgICAgX2NvZGVjICgiSC4yNjUgLyBIRVZDIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtaDI2NSIsCisgICAgICAgICAgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiaHZjMSIsCisgICAgICAgICAgImFsaWdubWVudCIsIEdfVFlQRV9TVFJJTkcsICJhdSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfaGV2MToKKyAgICAgIF9jb2RlYyAoIkguMjY1IC8gSEVWQyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWgyNjUiLAorICAgICAgICAgICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgImhldjEiLAorICAgICAgICAgICJhbGlnbm1lbnQiLCBHX1RZUEVfU1RSSU5HLCAiYXUiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX3JsZV86CisgICAgICBfY29kZWMgKCJSdW4tbGVuZ3RoIGVuY29kaW5nIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcmxlIiwKKyAgICAgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgInF1aWNrdGltZSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfV1JMRToKKyAgICAgIF9jb2RlYyAoIlJ1bi1sZW5ndGggZW5jb2RpbmciKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1ybGUiLAorICAgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAibWljcm9zb2Z0IiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ0knLCAnVicsICczJywgJzInKToKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2knLCAndicsICczJywgJzInKToKKyAgICAgIF9jb2RlYyAoIkluZGVvIFZpZGVvIDMiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1pbmRlbyIsCisgICAgICAgICAgImluZGVvdmVyc2lvbiIsIEdfVFlQRV9JTlQsIDMsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdJJywgJ1YnLCAnNCcsICcxJyk6CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdpJywgJ3YnLCAnNCcsICcxJyk6CisgICAgICBfY29kZWMgKCJJbnRlbCBWaWRlbyA0Iik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtaW5kZW8iLAorICAgICAgICAgICJpbmRlb3ZlcnNpb24iLCBHX1RZUEVfSU5ULCA0LCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX2R2Y3A6CisgICAgY2FzZSBGT1VSQ0NfZHZjXzoKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2QnLCAndicsICdzJywgJ2QnKToKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ0QnLCAnVicsICdTJywgJ0QnKToKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2QnLCAndicsICdjJywgJ3MnKToKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ0QnLCAnVicsICdDJywgJ1MnKToKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2QnLCAndicsICcyJywgJzUnKToKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2QnLCAndicsICdwJywgJ3AnKToKKyAgICAgIF9jb2RlYyAoIkRWIFZpZGVvIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtZHYiLCAiZHZ2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMjUsCisgICAgICAgICAgInN5c3RlbXN0cmVhbSIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19kdjVuOiAgICAgICAgICAvKiBEVkNQUk81MCBOVFNDICovCisgICAgY2FzZSBGT1VSQ0NfZHY1cDogICAgICAgICAgLyogRFZDUFJPNTAgUEFMICovCisgICAgICBfY29kZWMgKCJEVkNQcm81MCBWaWRlbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWR2IiwgImR2dmVyc2lvbiIsIEdfVFlQRV9JTlQsIDUwLAorICAgICAgICAgICJzeXN0ZW1zdHJlYW0iLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdkJywgJ3YnLCAnaCcsICc1Jyk6IC8qIERWQ1BSTyBIRCA1MGkgcHJvZHVjZWQgYnkgRkNQICovCisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdkJywgJ3YnLCAnaCcsICc2Jyk6IC8qIERWQ1BSTyBIRCA2MGkgcHJvZHVjZWQgYnkgRkNQICovCisgICAgICBfY29kZWMgKCJEVkNQcm9IRCBWaWRlbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWR2IiwgImR2dmVyc2lvbiIsIEdfVFlQRV9JTlQsIDEwMCwKKyAgICAgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgncycsICdtJywgJ2MnLCAnICcpOgorICAgICAgX2NvZGVjICgiQXBwbGUgR3JhcGhpY3MgKFNNQykiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8veC1zbWMiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnVicsICdQJywgJzMnLCAnMScpOgorICAgICAgX2NvZGVjICgiVlAzIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtdnAzIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ1YnLCAnUCcsICc2JywgJ0YnKToKKyAgICAgIF9jb2RlYyAoIlZQNiBGbGFzaCIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LXZwNi1mbGFzaCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfWGlUaDoKKyAgICAgIF9jb2RlYyAoIlRoZW9yYSIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LXRoZW9yYSIpOworICAgICAgLyogdGhlb3JhIHVzZXMgb25lIGJ5dGUgb2YgcGFkZGluZyBpbiB0aGUgZGF0YSBzdHJlYW0gYmVjYXVzZSBpdCBkb2VzIG5vdAorICAgICAgICogYWxsb3cgMCBzaXplZCBwYWNrZXRzIHdoaWxlIHRoZW9yYSBkb2VzICovCisgICAgICBlbnRyeS0+cGFkZGluZyA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19kcmFjOgorICAgICAgX2NvZGVjICgiRGlyYWMiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8veC1kaXJhYyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCd0JywgJ2knLCAnZicsICdmJyk6CisgICAgICBfY29kZWMgKCJUSUZGIHN0aWxsIGltYWdlcyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJpbWFnZS90aWZmIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2knLCAnYycsICdvJywgJ2QnKToKKyAgICAgIF9jb2RlYyAoIkFwcGxlIEludGVybWVkaWF0ZSBDb2RlYyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgidmlkZW8veC1hcHBsZS1pbnRlcm1lZGlhdGUtY29kZWMiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnQScsICdWJywgJ2QnLCAnbicpOgorICAgICAgX2NvZGVjICgiQVZJRCBETnhIRCIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgidmlkZW8veC1kbnhoZCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfVlA4MDoKKyAgICBjYXNlIEZPVVJDQ192cDA4OgorICAgICAgX2NvZGVjICgiT24yIFZQOCIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgidmlkZW8veC12cDgiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX3ZwMDk6CisgICAgICBfY29kZWMgKCJHb29nbGUgVlA5Iik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKCJ2aWRlby94LXZwOSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfYXBjczoKKyAgICAgIF9jb2RlYyAoIkFwcGxlIFByb1JlcyBMVCIpOworICAgICAgY2FwcyA9CisgICAgICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcHJvcmVzIiwgInZhcmlhbnQiLCBHX1RZUEVfU1RSSU5HLCAibHQiLAorICAgICAgICAgIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfYXBjaDoKKyAgICAgIF9jb2RlYyAoIkFwcGxlIFByb1JlcyBIUSIpOworICAgICAgY2FwcyA9CisgICAgICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcHJvcmVzIiwgInZhcmlhbnQiLCBHX1RZUEVfU1RSSU5HLCAiaHEiLAorICAgICAgICAgIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfYXBjbjoKKyAgICAgIF9jb2RlYyAoIkFwcGxlIFByb1JlcyIpOworICAgICAgY2FwcyA9CisgICAgICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcHJvcmVzIiwgInZhcmlhbnQiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICAgICJzdGFuZGFyZCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfYXBjbzoKKyAgICAgIF9jb2RlYyAoIkFwcGxlIFByb1JlcyBQcm94eSIpOworICAgICAgY2FwcyA9CisgICAgICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcHJvcmVzIiwgInZhcmlhbnQiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICAgICJwcm94eSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfYXA0aDoKKyAgICAgIF9jb2RlYyAoIkFwcGxlIFByb1JlcyA0NDQ0Iik7CisgICAgICBjYXBzID0KKyAgICAgICAgICBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1wcm9yZXMiLCAidmFyaWFudCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgICAgIjQ0NDQiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX2FwNHg6CisgICAgICBfY29kZWMgKCJBcHBsZSBQcm9SZXMgNDQ0NCBYUSIpOworICAgICAgY2FwcyA9CisgICAgICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcHJvcmVzIiwgInZhcmlhbnQiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICAgICI0NDQ0eHEiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX2NmaGQ6CisgICAgICBfY29kZWMgKCJHb1BybyBDaW5lRm9ybSIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgidmlkZW8veC1jaW5lZm9ybSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfdmNfMToKKyAgICBjYXNlIEZPVVJDQ19vdmMxOgorICAgICAgX2NvZGVjICgiVkMtMSIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LXdtdiIsCisgICAgICAgICAgIndtdnZlcnNpb24iLCBHX1RZUEVfSU5ULCAzLCAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIldWQzEiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnaycsICdwJywgJ2MnLCAnZCcpOgorICAgIGRlZmF1bHQ6CisgICAgeworICAgICAgY2FwcyA9IF9nZXRfdW5rbm93bl9jb2RlY19uYW1lICgidmlkZW8iLCBmb3VyY2MpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGZvcm1hdCAhPSBHU1RfVklERU9fRk9STUFUX1VOS05PV04pIHsKKyAgICBHc3RWaWRlb0luZm8gaW5mbzsKKworICAgIGdzdF92aWRlb19pbmZvX2luaXQgKCZpbmZvKTsKKyAgICBnc3RfdmlkZW9faW5mb19zZXRfZm9ybWF0ICgmaW5mbywgZm9ybWF0LCBlbnRyeS0+d2lkdGgsIGVudHJ5LT5oZWlnaHQpOworCisgICAgY2FwcyA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZpbmZvKTsKKyAgICAqY29kZWNfbmFtZSA9IGdzdF9wYl91dGlsc19nZXRfY29kZWNfZGVzY3JpcHRpb24gKGNhcHMpOworCisgICAgLyogZW5hYmxlIGNsaXBwaW5nIGZvciByYXcgdmlkZW8gc3RyZWFtcyAqLworICAgIHN0cmVhbS0+bmVlZF9jbGlwID0gVFJVRTsKKyAgICBzdHJlYW0tPmFsaWdubWVudCA9IDMyOworICB9CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyBndWludAorcm91bmRfdXBfcG93MiAoZ3VpbnQgbikKK3sKKyAgbiA9IG4gLSAxOworICBuID0gbiB8IChuID4+IDEpOworICBuID0gbiB8IChuID4+IDIpOworICBuID0gbiB8IChuID4+IDQpOworICBuID0gbiB8IChuID4+IDgpOworICBuID0gbiB8IChuID4+IDE2KTsKKyAgcmV0dXJuIG4gKyAxOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitxdGRlbXV4X2F1ZGlvX2NhcHMgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBRdERlbXV4U3RyZWFtICogc3RyZWFtLAorICAgIFF0RGVtdXhTdHJlYW1TdHNkRW50cnkgKiBlbnRyeSwgZ3VpbnQzMiBmb3VyY2MsIGNvbnN0IGd1aW50OCAqIGRhdGEsCisgICAgaW50IGxlbiwgZ2NoYXIgKiogY29kZWNfbmFtZSkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzOworICBjb25zdCBnY2hhciAqbmFtZTsKKyAgZ2ludCBlbmRpYW4gPSAwOworICBHc3RBdWRpb0Zvcm1hdCBmb3JtYXQgPSAwOworICBnaW50IGRlcHRoOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHF0ZGVtdXgsICJyZXNvbHZlIGZvdXJjYyAweCUwOHgiLCBHVUlOVDMyX1RPX0JFIChmb3VyY2MpKTsKKworICBkZXB0aCA9IGVudHJ5LT5ieXRlc19wZXJfcGFja2V0ICogODsKKworICBzd2l0Y2ggKGZvdXJjYykgeworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnTicsICdPJywgJ04nLCAnRScpOgorICAgIGNhc2UgRk9VUkNDX3Jhd186CisgICAgICAvKiA4LWJpdCBhdWRpbyBpcyB1bnNpZ25lZCAqLworICAgICAgaWYgKGRlcHRoID09IDgpCisgICAgICAgIGZvcm1hdCA9IEdTVF9BVURJT19GT1JNQVRfVTg7CisgICAgICAvKiBvdGhlcndpc2UgaXQncyBzaWduZWQgYW5kIGJpZy1lbmRpYW4ganVzdCBsaWtlICd0d29zJyAqLworICAgIGNhc2UgRk9VUkNDX3R3b3M6CisgICAgICBlbmRpYW4gPSBHX0JJR19FTkRJQU47CisgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICBjYXNlIEZPVVJDQ19zb3d0OgorICAgIHsKKyAgICAgIGdjaGFyICpzdHI7CisKKyAgICAgIGlmICghZW5kaWFuKQorICAgICAgICBlbmRpYW4gPSBHX0xJVFRMRV9FTkRJQU47CisKKyAgICAgIGlmICghZm9ybWF0KQorICAgICAgICBmb3JtYXQgPSBnc3RfYXVkaW9fZm9ybWF0X2J1aWxkX2ludGVnZXIgKFRSVUUsIGVuZGlhbiwgZGVwdGgsIGRlcHRoKTsKKworICAgICAgc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiUmF3ICVkLWJpdCBQQ00gYXVkaW8iLCBkZXB0aCk7CisgICAgICBfY29kZWMgKHN0cik7CisgICAgICBnX2ZyZWUgKHN0cik7CisKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBnc3RfYXVkaW9fZm9ybWF0X3RvX3N0cmluZyAoZm9ybWF0KSwKKyAgICAgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwgTlVMTCk7CisgICAgICBzdHJlYW0tPmFsaWdubWVudCA9IEdTVF9ST1VORF9VUF84IChkZXB0aCk7CisgICAgICBzdHJlYW0tPmFsaWdubWVudCA9IHJvdW5kX3VwX3BvdzIgKHN0cmVhbS0+YWxpZ25tZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2YnLCAnbCcsICc2JywgJzQnKToKKyAgICAgIF9jb2RlYyAoIlJhdyA2NC1iaXQgZmxvYXRpbmctcG9pbnQgYXVkaW8iKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiRjY0QkUiLAorICAgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAiaW50ZXJsZWF2ZWQiLCBOVUxMKTsKKyAgICAgIHN0cmVhbS0+YWxpZ25tZW50ID0gODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnZicsICdsJywgJzMnLCAnMicpOgorICAgICAgX2NvZGVjICgiUmF3IDMyLWJpdCBmbG9hdGluZy1wb2ludCBhdWRpbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJGMzJCRSIsCisgICAgICAgICAgImxheW91dCIsIEdfVFlQRV9TVFJJTkcsICJpbnRlcmxlYXZlZCIsIE5VTEwpOworICAgICAgc3RyZWFtLT5hbGlnbm1lbnQgPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfaW4yNDoKKyAgICAgIF9jb2RlYyAoIlJhdyAyNC1iaXQgUENNIGF1ZGlvIik7CisgICAgICAvKiB3ZSBhc3N1bWUgQklHIEVORElBTiwgYW4gZW5kYSBib3ggd2lsbCB0ZWxsIHVzIHRvIGNoYW5nZSB0aGlzIHRvIGxpdHRsZQorICAgICAgICogZW5kaWFuIGxhdGVyICovCisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwKKyAgICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIlMyNEJFIiwKKyAgICAgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwgTlVMTCk7CisgICAgICBzdHJlYW0tPmFsaWdubWVudCA9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2knLCAnbicsICczJywgJzInKToKKyAgICAgIF9jb2RlYyAoIlJhdyAzMi1iaXQgUENNIGF1ZGlvIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwKKyAgICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIlMzMkJFIiwKKyAgICAgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwgTlVMTCk7CisgICAgICBzdHJlYW0tPmFsaWdubWVudCA9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ3MnLCAnMScsICc2JywgJ2wnKToKKyAgICAgIF9jb2RlYyAoIlJhdyAxNi1iaXQgUENNIGF1ZGlvIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwKKyAgICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIlMxNkxFIiwKKyAgICAgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwgTlVMTCk7CisgICAgICBzdHJlYW0tPmFsaWdubWVudCA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ191bGF3OgorICAgICAgX2NvZGVjICgiTXUtbGF3IGF1ZGlvIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtbXVsYXciKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX2FsYXc6CisgICAgICBfY29kZWMgKCJBLWxhdyBhdWRpbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby94LWFsYXciKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwMjAwNzM2ZDoKKyAgICBjYXNlIDB4NmQ3MzAwMDI6CisgICAgICBfY29kZWMgKCJNaWNyb3NvZnQgQURQQ00iKTsKKyAgICAgIC8qIE1pY3Jvc29mdCBBRFBDTS1BQ00gY29kZSAyICovCisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtYWRwY20iLAorICAgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAibWljcm9zb2Z0IiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTEwMDczNmQ6CisgICAgY2FzZSAweDZkNzMwMDExOgorICAgICAgX2NvZGVjICgiRFZJL0lNQSBBRFBDTSIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LWFkcGNtIiwKKyAgICAgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImR2aSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDE3MDA3MzZkOgorICAgIGNhc2UgMHg2ZDczMDAxNzoKKyAgICAgIF9jb2RlYyAoIkRWSS9JbnRlbCBJTUEgQURQQ00iKTsKKyAgICAgIC8qIEZJWE1FIERWSS9JbnRlbCBJTUEgQURQQ00vQUNNIGNvZGUgMTcgKi8KKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1hZHBjbSIsCisgICAgICAgICAgImxheW91dCIsIEdfVFlQRV9TVFJJTkcsICJxdWlja3RpbWUiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg1NTAwNzM2ZDoKKyAgICBjYXNlIDB4NmQ3MzAwNTU6CisgICAgICAvKiBNUEVHIGxheWVyIDMsIENCUiBvbmx5IChwcmUgUVQ0LjEpICovCisgICAgY2FzZSBGT1VSQ0NfX21wMzoKKyAgICAgIF9jb2RlYyAoIk1QRUctMSBsYXllciAzIik7CisgICAgICAvKiBNUEVHIGxheWVyIDMsIENCUiAmIFZCUiAoUVQ0LjEgYW5kIGxhdGVyKSAqLworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9tcGVnIiwgImxheWVyIiwgR19UWVBFX0lOVCwgMywKKyAgICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnLicsICdtJywgJ3AnLCAnMicpOgorICAgICAgX2NvZGVjICgiTVBFRy0xIGxheWVyIDIiKTsKKyAgICAgIC8qIE1QRUcgbGF5ZXIgMiAqLworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9tcGVnIiwgImxheWVyIiwgR19UWVBFX0lOVCwgMiwKKyAgICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHgyMDczNmQ6CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdlJywgJ2MnLCAnLScsICczJyk6CisgICAgICBfY29kZWMgKCJFQUMtMyBhdWRpbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LWVhYzMiLAorICAgICAgICAgICJmcmFtZWQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgICAgICBlbnRyeS0+c2FtcGxlZCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ3MnLCAnYScsICdjJywgJzMnKTogLy8gTmVybyBSZWNvZGUKKyAgICBjYXNlIEZPVVJDQ19hY18zOgorICAgICAgX2NvZGVjICgiQUMtMyBhdWRpbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LWFjMyIsCisgICAgICAgICAgImZyYW1lZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAgICAgIGVudHJ5LT5zYW1wbGVkID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnZCcsICd0JywgJ3MnLCAnYycpOgorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnRCcsICdUJywgJ1MnLCAnICcpOgorICAgICAgX2NvZGVjICgiRFRTIGF1ZGlvIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtZHRzIiwKKyAgICAgICAgICAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICAgICAgZW50cnktPnNhbXBsZWQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdkJywgJ3QnLCAncycsICdoJyk6IC8vIERUUy1IRAorICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnZCcsICd0JywgJ3MnLCAnbCcpOiAvLyBEVFMtSEQgTG9zc2xlc3MKKyAgICAgIF9jb2RlYyAoIkRUUy1IRCBhdWRpbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LWR0cyIsCisgICAgICAgICAgImZyYW1lZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAgICAgIGVudHJ5LT5zYW1wbGVkID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX01BQzM6CisgICAgICBfY29kZWMgKCJNQUNFLTMiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1tYWNlIiwKKyAgICAgICAgICAibWFjZXZlcnNpb24iLCBHX1RZUEVfSU5ULCAzLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX01BQzY6CisgICAgICBfY29kZWMgKCJNQUNFLTYiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1tYWNlIiwKKyAgICAgICAgICAibWFjZXZlcnNpb24iLCBHX1RZUEVfSU5ULCA2LCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnTycsICdnJywgJ2cnLCAnVicpOgorICAgICAgLyogb2dnL3ZvcmJpcyAqLworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi9vZ2ciKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnZCcsICd2JywgJ2MnLCAnYScpOgorICAgICAgX2NvZGVjICgiRFYgYXVkaW8iKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC1kdiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0NfbXA0YToKKyAgICAgIF9jb2RlYyAoIk1QRUctNCBBQUMgYXVkaW8iKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8vbXBlZyIsCisgICAgICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgNCwgImZyYW1lZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLAorICAgICAgICAgICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgInJhdyIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdRJywgJ0QnLCAnTScsICdDJyk6CisgICAgICBfY29kZWMgKCJRRGVzaWduIE11c2ljIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtcWRtIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19RRE0yOgorICAgICAgX2NvZGVjICgiUURlc2lnbiBNdXNpYyB2LjIiKTsKKyAgICAgIC8qIEZJWE1FOiBRRGVzaWduIG11c2ljIHZlcnNpb24gMiAobm8gY29uc3RhbnQpICovCisgICAgICBpZiAoRkFMU0UgJiYgZGF0YSkgeworICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcWRtMiIsCisgICAgICAgICAgICAiZnJhbWVzaXplIiwgR19UWVBFX0lOVCwgUVRfVUlOVDMyIChkYXRhICsgNTIpLAorICAgICAgICAgICAgImJpdHJhdGUiLCBHX1RZUEVfSU5ULCBRVF9VSU5UMzIgKGRhdGEgKyA0MCksCisgICAgICAgICAgICAiYmxvY2tzaXplIiwgR19UWVBFX0lOVCwgUVRfVUlOVDMyIChkYXRhICsgNDQpLCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC1xZG0yIik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19hZ3NtOgorICAgICAgX2NvZGVjICgiR1NNIGF1ZGlvIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtZ3NtIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19zYW1yOgorICAgICAgX2NvZGVjICgiQU1SIGF1ZGlvIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL0FNUiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0Nfc2F3YjoKKyAgICAgIF9jb2RlYyAoIkFNUi1XQiBhdWRpbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby9BTVItV0IiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX2ltYTQ6CisgICAgICBfY29kZWMgKCJRdWlja3RpbWUgSU1BIEFEUENNIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtYWRwY20iLAorICAgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAicXVpY2t0aW1lIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19hbGFjOgorICAgICAgX2NvZGVjICgiQXBwbGUgbG9zc2xlc3MgYXVkaW8iKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC1hbGFjIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19mTGFDOgorICAgICAgX2NvZGVjICgiRnJlZSBMb3NzbGVzcyBBdWRpbyBDb2RlYyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LWZsYWMiLAorICAgICAgICAgICJmcmFtZWQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ1EnLCAnYycsICdsJywgJ3AnKToKKyAgICAgIF9jb2RlYyAoIlF1YWxDb21tIFB1cmVWb2ljZSIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgiYXVkaW8vcWNlbHAiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX3dtYV86CisgICAgY2FzZSBGT1VSQ0Nfb3dtYToKKyAgICAgIF9jb2RlYyAoIldNQSIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby94LXdtYSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0Nfb3B1czoKKyAgICAgIF9jb2RlYyAoIk9wdXMiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC1vcHVzIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZPVVJDQ19scGNtOgorICAgIHsKKyAgICAgIGd1aW50MzIgZmxhZ3MgPSAwOworICAgICAgZ3VpbnQzMiBkZXB0aCA9IDA7CisgICAgICBndWludDMyIHdpZHRoID0gMDsKKyAgICAgIEdzdEF1ZGlvRm9ybWF0IGZvcm1hdDsKKyAgICAgIGVudW0KKyAgICAgIHsKKyAgICAgICAgRkxBR19JU19GTE9BVCA9IDB4MSwKKyAgICAgICAgRkxBR19JU19CSUdfRU5ESUFOID0gMHgyLAorICAgICAgICBGTEFHX0lTX1NJR05FRCA9IDB4NCwKKyAgICAgICAgRkxBR19JU19QQUNLRUQgPSAweDgsCisgICAgICAgIEZMQUdfSVNfQUxJR05FRF9ISUdIID0gMHgxMCwKKyAgICAgICAgRkxBR19JU19OT05fSU5URVJMRUFWRUQgPSAweDIwCisgICAgICB9OworICAgICAgX2NvZGVjICgiUmF3IExQQ00gYXVkaW8iKTsKKworICAgICAgaWYgKGRhdGEgJiYgbGVuID49IDM2KSB7CisgICAgICAgIGRlcHRoID0gUVRfVUlOVDMyIChkYXRhICsgMjQpOworICAgICAgICBmbGFncyA9IFFUX1VJTlQzMiAoZGF0YSArIDI4KTsKKyAgICAgICAgd2lkdGggPSBRVF9VSU5UMzIgKGRhdGEgKyAzMikgKiA4IC8gZW50cnktPm5fY2hhbm5lbHM7CisgICAgICB9CisgICAgICBpZiAoKGZsYWdzICYgRkxBR19JU19GTE9BVCkgPT0gMCkgeworICAgICAgICBpZiAoZGVwdGggPT0gMCkKKyAgICAgICAgICBkZXB0aCA9IDE2OworICAgICAgICBpZiAod2lkdGggPT0gMCkKKyAgICAgICAgICB3aWR0aCA9IDE2OworICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19JU19BTElHTkVEX0hJR0gpKQorICAgICAgICAgIGRlcHRoID0gd2lkdGg7CisKKyAgICAgICAgZm9ybWF0ID0gZ3N0X2F1ZGlvX2Zvcm1hdF9idWlsZF9pbnRlZ2VyICgoZmxhZ3MgJiBGTEFHX0lTX1NJR05FRCkgPworICAgICAgICAgICAgVFJVRSA6IEZBTFNFLCAoZmxhZ3MgJiBGTEFHX0lTX0JJR19FTkRJQU4pID8KKyAgICAgICAgICAgIEdfQklHX0VORElBTiA6IEdfTElUVExFX0VORElBTiwgd2lkdGgsIGRlcHRoKTsKKyAgICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywKKyAgICAgICAgICAgIGZvcm1hdCAhPQorICAgICAgICAgICAgR1NUX0FVRElPX0ZPUk1BVF9VTktOT1dOID8gZ3N0X2F1ZGlvX2Zvcm1hdF90b19zdHJpbmcgKGZvcm1hdCkgOgorICAgICAgICAgICAgIlVOS05PV04iLCAibGF5b3V0IiwgR19UWVBFX1NUUklORywKKyAgICAgICAgICAgIChmbGFncyAmIEZMQUdfSVNfTk9OX0lOVEVSTEVBVkVEKSA/ICJub24taW50ZXJsZWF2ZWQiIDoKKyAgICAgICAgICAgICJpbnRlcmxlYXZlZCIsIE5VTEwpOworICAgICAgICBzdHJlYW0tPmFsaWdubWVudCA9IEdTVF9ST1VORF9VUF84IChkZXB0aCk7CisgICAgICAgIHN0cmVhbS0+YWxpZ25tZW50ID0gcm91bmRfdXBfcG93MiAoc3RyZWFtLT5hbGlnbm1lbnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHdpZHRoID09IDApCisgICAgICAgICAgd2lkdGggPSAzMjsKKyAgICAgICAgaWYgKHdpZHRoID09IDY0KSB7CisgICAgICAgICAgaWYgKGZsYWdzICYgRkxBR19JU19CSUdfRU5ESUFOKQorICAgICAgICAgICAgZm9ybWF0ID0gR1NUX0FVRElPX0ZPUk1BVF9GNjRCRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBmb3JtYXQgPSBHU1RfQVVESU9fRk9STUFUX0Y2NExFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChmbGFncyAmIEZMQUdfSVNfQklHX0VORElBTikKKyAgICAgICAgICAgIGZvcm1hdCA9IEdTVF9BVURJT19GT1JNQVRfRjMyQkU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZm9ybWF0ID0gR1NUX0FVRElPX0ZPUk1BVF9GMzJMRTsKKyAgICAgICAgfQorICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwKKyAgICAgICAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBnc3RfYXVkaW9fZm9ybWF0X3RvX3N0cmluZyAoZm9ybWF0KSwKKyAgICAgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAoZmxhZ3MgJiBGTEFHX0lTX05PTl9JTlRFUkxFQVZFRCkgPworICAgICAgICAgICAgIm5vbi1pbnRlcmxlYXZlZCIgOiAiaW50ZXJsZWF2ZWQiLCBOVUxMKTsKKyAgICAgICAgc3RyZWFtLT5hbGlnbm1lbnQgPSB3aWR0aCAvIDg7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdxJywgJ3QnLCAndicsICdyJyk6CisgICAgICAvKiA/ICovCisgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICBjYXBzID0gX2dldF91bmtub3duX2NvZGVjX25hbWUgKCJhdWRpbyIsIGZvdXJjYyk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoY2FwcykgeworICAgIEdzdENhcHMgKnRlbXBsX2NhcHMgPQorICAgICAgICBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXRfY2FwcyAoJmdzdF9xdGRlbXV4X2F1ZGlvc3JjX3RlbXBsYXRlKTsKKyAgICBHc3RDYXBzICppbnRlcnNlY3Rpb24gPSBnc3RfY2Fwc19pbnRlcnNlY3QgKGNhcHMsIHRlbXBsX2NhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGVtcGxfY2Fwcyk7CisgICAgY2FwcyA9IGludGVyc2VjdGlvbjsKKyAgfQorCisgIC8qIGVuYWJsZSBjbGlwcGluZyBmb3IgcmF3IGF1ZGlvIHN0cmVhbXMgKi8KKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBuYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyk7CisgIGlmIChnX3N0cl9oYXNfcHJlZml4IChuYW1lLCAiYXVkaW8veC1yYXciKSkgeworICAgIHN0cmVhbS0+bmVlZF9jbGlwID0gVFJVRTsKKyAgICBzdHJlYW0tPm1heF9idWZmZXJfc2l6ZSA9IDQwOTYgKiBlbnRyeS0+Ynl0ZXNfcGVyX2ZyYW1lOworICAgIEdTVF9ERUJVRyAoInNldHRpbmcgbWF4IGJ1ZmZlciBzaXplIHRvICVkIiwgc3RyZWFtLT5tYXhfYnVmZmVyX3NpemUpOworICB9CisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitxdGRlbXV4X3N1Yl9jYXBzIChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwKKyAgICBRdERlbXV4U3RyZWFtU3RzZEVudHJ5ICogZW50cnksIGd1aW50MzIgZm91cmNjLAorICAgIGNvbnN0IGd1aW50OCAqIHN0c2RfZW50cnlfZGF0YSwgZ2NoYXIgKiogY29kZWNfbmFtZSkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKworICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAicmVzb2x2ZSBmb3VyY2MgMHglMDh4IiwgR1VJTlQzMl9UT19CRSAoZm91cmNjKSk7CisKKyAgc3dpdGNoIChmb3VyY2MpIHsKKyAgICBjYXNlIEZPVVJDQ19tcDRzOgorICAgICAgX2NvZGVjICgiRFZEIHN1YnRpdGxlIik7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInN1YnBpY3R1cmUveC1kdmQiKTsKKyAgICAgIHN0cmVhbS0+bmVlZF9wcm9jZXNzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRk9VUkNDX3RleHQ6CisgICAgICBfY29kZWMgKCJRdWlja3RpbWUgdGltZWQgdGV4dCIpOworICAgICAgZ290byB0ZXh0OworICAgIGNhc2UgRk9VUkNDX3R4M2c6CisgICAgICBfY29kZWMgKCIzR1BQIHRpbWVkIHRleHQiKTsKKyAgICB0ZXh0OgorICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ0ZXh0L3gtcmF3IiwgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgICAgInV0ZjgiLCBOVUxMKTsKKyAgICAgIC8qIGFjdHVhbCB0ZXh0IHBpZWNlIG5lZWRzIHRvIGJlIGV4dHJhY3RlZCAqLworICAgICAgc3RyZWFtLT5uZWVkX3Byb2Nlc3MgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1VSQ0Nfc3RwcDoKKyAgICAgIF9jb2RlYyAoIlhNTCBzdWJ0aXRsZXMiKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXBwbGljYXRpb24vdHRtbCt4bWwiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgeworICAgICAgY2FwcyA9IF9nZXRfdW5rbm93bl9jb2RlY19uYW1lICgidGV4dCIsIGZvdXJjYyk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK3F0ZGVtdXhfZ2VuZXJpY19jYXBzIChHc3RRVERlbXV4ICogcXRkZW11eCwgUXREZW11eFN0cmVhbSAqIHN0cmVhbSwKKyAgICBRdERlbXV4U3RyZWFtU3RzZEVudHJ5ICogZW50cnksIGd1aW50MzIgZm91cmNjLAorICAgIGNvbnN0IGd1aW50OCAqIHN0c2RfZW50cnlfZGF0YSwgZ2NoYXIgKiogY29kZWNfbmFtZSkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKworICBzd2l0Y2ggKGZvdXJjYykgeworICAgIGNhc2UgRk9VUkNDX20xdjoKKyAgICAgIF9jb2RlYyAoIk1QRUcgMSB2aWRlbyIpOworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby9tcGVnIiwgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMSwKKyAgICAgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBjYXBzID0gTlVMTDsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3F0ZGVtdXhfYXBwZW5kX3Byb3RlY3Rpb25fc3lzdGVtX2lkIChHc3RRVERlbXV4ICogcXRkZW11eCwKKyAgICBjb25zdCBnY2hhciAqIHN5c3RlbV9pZCkKK3sKKyAgZ2ludCBpOworCisgIGlmICghcXRkZW11eC0+cHJvdGVjdGlvbl9zeXN0ZW1faWRzKQorICAgIHF0ZGVtdXgtPnByb3RlY3Rpb25fc3lzdGVtX2lkcyA9CisgICAgICAgIGdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoKEdEZXN0cm95Tm90aWZ5KSBnX2ZyZWUpOworICAvKiBDaGVjayB3aGV0aGVyIHdlIGFscmVhZHkgaGF2ZSBhbiBlbnRyeSBmb3IgdGhpcyBzeXN0ZW0gSUQuICovCisgIGZvciAoaSA9IDA7IGkgPCBxdGRlbXV4LT5wcm90ZWN0aW9uX3N5c3RlbV9pZHMtPmxlbjsgKytpKSB7CisgICAgY29uc3QgZ2NoYXIgKmlkID0gZ19wdHJfYXJyYXlfaW5kZXggKHF0ZGVtdXgtPnByb3RlY3Rpb25fc3lzdGVtX2lkcywgaSk7CisgICAgaWYgKGdfYXNjaWlfc3RyY2FzZWNtcCAoc3lzdGVtX2lkLCBpZCkgPT0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChxdGRlbXV4LCAiQWRkaW5nIGNlbmMgcHJvdGVjdGlvbiBzeXN0ZW0gSUQgJXMiLCBzeXN0ZW1faWQpOworICBnX3B0cl9hcnJheV9hZGQgKHF0ZGVtdXgtPnByb3RlY3Rpb25fc3lzdGVtX2lkcywgZ19hc2NpaV9zdHJkb3duIChzeXN0ZW1faWQsCisgICAgICAgICAgLTEpKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvcXRkZW11eC5oIGIvZ3N0L2lzb21wNC9xdGRlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0ZGEzZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9pc29tcDQvcXRkZW11eC5oCkBAIC0wLDAgKzEsMjQyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1FUREVNVVhfSF9fCisjZGVmaW5lIF9fR1NUX1FUREVNVVhfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGZsb3djb21iaW5lci5oPgorI2luY2x1ZGUgImdzdGlzb2ZmLmgiCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9RVERFTVVYIFwKKyAgKGdzdF9xdGRlbXV4X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9RVERFTVVYKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUVRERU1VWCxHc3RRVERlbXV4KSkKKyNkZWZpbmUgR1NUX1FUREVNVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUVRERU1VWCxHc3RRVERlbXV4Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUVRERU1VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1FUREVNVVgpKQorI2RlZmluZSBHU1RfSVNfUVRERU1VWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9RVERFTVVYKSkKKworI2RlZmluZSBHU1RfUVRERU1VWF9DQVNUKG9iaikgKChHc3RRVERlbXV4ICopKG9iaikpCisKKy8qIHF0ZGVtdXggcHJvZHVjZXMgdGhlc2UgZm9yIGF0b21zIGl0IGNhbm5vdCBwYXJzZSAqLworI2RlZmluZSBHU1RfUVRfREVNVVhfUFJJVkFURV9UQUcgInByaXZhdGUtcXQtdGFnIgorI2RlZmluZSBHU1RfUVRfREVNVVhfQ0xBU1NJRklDQVRJT05fVEFHICJjbGFzc2lmaWNhdGlvbiIKKworI2RlZmluZSBHU1RfUVRERU1VWF9NQVhfU1RSRUFNUyAgICAgICAgIDMyCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RRVERlbXV4IEdzdFFURGVtdXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UVREZW11eENsYXNzIEdzdFFURGVtdXhDbGFzczsKK3R5cGVkZWYgc3RydWN0IF9RdERlbXV4U3RyZWFtIFF0RGVtdXhTdHJlYW07CisKK2VudW0gUXREZW11eFN0YXRlCit7CisgIFFUREVNVVhfU1RBVEVfSU5JVElBTCwgICAgICAgIC8qIEluaXRpYWwgc3RhdGUgKGhhdmVuJ3QgZ290IHRoZSBoZWFkZXIgeWV0KSAqLworICBRVERFTVVYX1NUQVRFX0hFQURFUiwgICAgICAgICAvKiBQYXJzaW5nIHRoZSBoZWFkZXIgKi8KKyAgUVRERU1VWF9TVEFURV9NT1ZJRSwgICAgICAgICAgLyogUGFyc2luZy9QbGF5aW5nIHRoZSBtZWRpYSBkYXRhICovCisgIFFUREVNVVhfU1RBVEVfQlVGRkVSX01EQVQgICAgIC8qIEJ1ZmZlcmluZyB0aGUgbWRhdCBhdG9tICovCit9OworCitzdHJ1Y3QgX0dzdFFURGVtdXggeworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgLyogR2xvYmFsIHN0YXRlICovCisgIGVudW0gUXREZW11eFN0YXRlIHN0YXRlOworCisgIC8qIHN0YXRpYyBzaW5rIHBhZCAqLworICBHc3RQYWQgKnNpbmtwYWQ7CisKKyAgLyogVFJVRSBpZiBwdWxsLWJhc2VkICovCisgIGdib29sZWFuIHB1bGxiYXNlZDsKKworICBnYm9vbGVhbiBwb3N0ZWRfcmVkaXJlY3Q7CisKKyAgUXREZW11eFN0cmVhbSAqc3RyZWFtc1tHU1RfUVRERU1VWF9NQVhfU1RSRUFNU107CisgIGdpbnQgICAgIG5fc3RyZWFtczsKKyAgZ2ludCAgICAgbl92aWRlb19zdHJlYW1zOworICBnaW50ICAgICBuX2F1ZGlvX3N0cmVhbXM7CisgIGdpbnQgICAgIG5fc3ViX3N0cmVhbXM7CisKKyAgR3N0Rmxvd0NvbWJpbmVyICpmbG93Y29tYmluZXI7CisKKyAgLyogSW5jb21pbmcgc3RyZWFtIGdyb3VwLWlkIHRvIHNldCBvbiBkb3duc3RyZWFtIFNUUkVBTV9TVEFSVCBldmVudHMuCisgICAqIElmIHVwc3RyZWFtIGRvZXNuJ3QgY29udGFpbiBvbmUsIGEgZ2xvYmFsIG9uZSB3aWxsIGJlIGdlbmVyYXRlZCAqLworICBnYm9vbGVhbiBoYXZlX2dyb3VwX2lkOworICBndWludCBncm91cF9pZDsKKworICBndWludCAgbWFqb3JfYnJhbmQ7CisgIEdzdEJ1ZmZlciAqY29tcF9icmFuZHM7CisKKyAgLyogW21vb3ZdIGhlYWRlci4KKyAgICogRklYTUUgOiBUaGlzIGlzIGRpc2NhcmRlZCBqdXN0IGFmdGVyIGl0J3MgY3JlYXRlZC4gSnVzdCBtb3ZlIGl0CisgICAqIHRvIGEgdGVtcG9yYXJ5IHZhcmlhYmxlID8gKi8KKyAgR05vZGUgKm1vb3Zfbm9kZTsKKworICAvKiBGSVhNRSA6IFRoaXMgaXMgbmV2ZXIgZnJlZWQuIEl0IGlzIG9ubHkgYXNzaWduZWQgb25jZS4gbWVtbGVhayA/ICovCisgIEdOb2RlICptb292X25vZGVfY29tcHJlc3NlZDsKKworICAvKiBTZXQgdG8gVFJVRSB3aGVuIHRoZSBbbW9vdl0gaGVhZGVyIGhhcyBiZWVuIGZ1bGx5IHBhcnNlZCAqLworICBnYm9vbGVhbiBnb3RfbW9vdjsKKworICAvKiBHbG9iYWwgdGltZXNjYWxlIGZvciB0aGUgaW5jb21pbmcgc3RyZWFtLiBVc2UgdGhlIFFUVElNRSBtYWNyb3MKKyAgICogdG8gY29udmVydCB2YWx1ZXMgdG8vZnJvbSBHc3RDbG9ja1RpbWUgKi8KKyAgZ3VpbnQzMiB0aW1lc2NhbGU7CisKKyAgLyogR2xvYmFsIGR1cmF0aW9uIChpbiBnbG9iYWwgdGltZXNjYWxlKS4gVXNlIFFUVElNRSBtYWNyb3MgdG8gZ2V0IEdzdENsb2NrVGltZSAqLworICBndWludDY0IGR1cmF0aW9uOworCisgIC8qIFRvdGFsIHNpemUgb2YgaGVhZGVyIGF0b21zLiBVc2VkIHRvIGNhbGN1bGF0ZSBmYWxsYmFjayBvdmVyYWxsIGJpdHJhdGUgKi8KKyAgZ3VpbnQgaGVhZGVyX3NpemU7CisKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisKKyAgLyogY29uZmlndXJlZCBwbGF5YmFjayByZWdpb24gKi8KKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIC8qIFRoZSBTRUdNRU5UX0VWRU5UIGZyb20gdXBzdHJlYW0gKk9SKiBnZW5lcmF0ZWQgZnJvbSBzZWdtZW50IChhYm92ZSkgKi8KKyAgR3N0RXZlbnQgKnBlbmRpbmdfbmV3c2VnbWVudDsKKworICBndWludDMyIHNlZ21lbnRfc2VxbnVtOworCisgIC8qIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggYSBzbW9vdGhzdHJlYW1pbmcgZnJhZ21lbnQKKyAgICogTXNzIGRvZXNuJ3QgaGF2ZSAnbW9vdicgb3IgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJlYW1zIGZvcm1hdCwKKyAgICogcmVxdWlyaW5nIHF0ZGVtdXggdG8gZXhwb3NlIGFuZCBjcmVhdGUgdGhlIHN0cmVhbXMgKi8KKyAgZ2Jvb2xlYW4gbXNzX21vZGU7CisKKyAgLyogU2V0IHRvIFRSVUUgaWYgdGhlIGluY29taW5nIHN0cmVhbSBpcyBlaXRoZXIgYSBNU1Mgc3RyZWFtIG9yCisgICAqIGEgRnJhZ21lbnRlZCBNUDQgKGNvbnRhaW5pbmcgdGhlIFttdmV4XSBhdG9tIGluIHRoZSBoZWFkZXIpICovCisgIGdib29sZWFuIGZyYWdtZW50ZWQ7CisKKyAgLyogUFVMTC1CQVNFRCBvbmx5IDogSWYgVFJVRSB0aGVyZSBpcyBhIHBlbmRpbmcgc2VlayAqLworICBnYm9vbGVhbiBmcmFnbWVudGVkX3NlZWtfcGVuZGluZzsKKworICAvKiBQVUxMLUJBU0VEIDogb2Zmc2V0IG9mIGZpcnN0IFttb29mXSBvciBvZiBmcmFnbWVudCB0byBzZWVrIHRvCisgICAqIFBVU0gtQkFTRUQgOiBvZmZzZXQgb2YgbGF0ZXN0IFttb29mXSAqLworICBndWludDY0IG1vb2Zfb2Zmc2V0OworCisgIC8qIE1TUyBzdHJlYW1zIGhhdmUgYSBzaW5nbGUgbWVkaWEgdGhhdCBpcyB1bnNwZWNpZmllZCBhdCB0aGUgYXRvbXMsIHNvCisgICAqIHVwc3RyZWFtIHByb3ZpZGVzIGl0IGF0IHRoZSBjYXBzICovCisgIEdzdENhcHMgKm1lZGlhX2NhcHM7CisKKyAgLyogU2V0IHRvIFRSVUUgd2hlbiBhbGwgc3RyZWFtcyBoYXZlIGJlZW4gZXhwb3NlZCAqLworICBnYm9vbGVhbiBleHBvc2VkOworCisgIGdpbnQ2NCBjaGFwdGVyc190cmFja19pZDsKKworICAvKiBwcm90ZWN0aW9uIHN1cHBvcnQgKi8KKyAgR1B0ckFycmF5ICpwcm90ZWN0aW9uX3N5c3RlbV9pZHM7IC8qIEhvbGRzIGlkZW50aWZpZXJzIG9mIGFsbCBjb250ZW50IHByb3RlY3Rpb24gc3lzdGVtcyBmb3IgYWxsIHRyYWNrcyAqLworICBHUXVldWUgcHJvdGVjdGlvbl9ldmVudF9xdWV1ZTsgLyogaG9sZHMgY29weSBvZiB1cHN0cmVhbSBwcm90ZWN0aW9uIGV2ZW50cyAqLworICBndWludDY0IGNlbmNfYXV4X2luZm9fb2Zmc2V0OworICBndWludDggKmNlbmNfYXV4X2luZm9fc2l6ZXM7CisgIGd1aW50MzIgY2VuY19hdXhfc2FtcGxlX2NvdW50OworCisKKyAgLyoKKyAgICogQUxMIFZBUklBQkxFUyBCRUxPVyBBUkUgT05MWSBVU0VEIElOIFBVU0gtQkFTRUQgTU9ERQorICAgKi8KKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKyAgZ3VpbnQgbmVlZGVkYnl0ZXM7CisgIGd1aW50IHRvZHJvcDsKKyAgLyogVXNlZCB0byBzdG9yZSBkYXRhIGlmIFttZGF0XSBpcyBiZWZvcmUgdGhlIGhlYWRlcnMgKi8KKyAgR3N0QnVmZmVyICptZGF0YnVmZmVyOworICAvKiBBbW91bnQgb2YgYnl0ZXMgbGVmdCB0byByZWFkIGluIHRoZSBjdXJyZW50IFttZGF0XSAqLworICBndWludDY0IG1kYXRsZWZ0LCBtZGF0c2l6ZTsKKworICAvKiBXaGVuIHJlc3RvcmluZyB0aGUgbWRhdCB0byB0aGUgYWRhcHRlciwgdGhpcyBidWZmZXIgc3RvcmVzIGFueQorICAgKiB0cmFpbGluZyBkYXRhIHRoYXQgd2FzIGFmdGVyIHRoZSBsYXN0IGF0b20gcGFyc2VkIGFzIGl0IGhhcyB0byBiZQorICAgKiByZXN0b3JlZCBsYXRlciBhbG9uZyB3aXRoIHRoZSBjb3JyZWN0IG9mZnNldC4gVXNlZCBpbiBmcmFnbWVudGVkCisgICAqIHNjZW5hcmlvIHdoZXJlIG1kYXQvbW9vZiBhcmUgb25lIGFmdGVyIHRoZSBvdGhlciBpbiBhbnkgb3JkZXIuCisgICAqCisgICAqIENoZWNrIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MTA2MjMgKi8KKyAgR3N0QnVmZmVyICpyZXN0b3JlZGF0YV9idWZmZXI7CisgIGd1aW50NjQgcmVzdG9yZWRhdGFfb2Zmc2V0OworCisgIC8qIFRoZSBjdXJyZW50IG9mZnNldCBpbiBieXRlcyBmcm9tIHVwc3RyZWFtLgorICAgKiBOb3RlOiBXaGlsZSBpdCBtYWtlcyBjb21wbGV0ZSBzZW5zZSB3aGVuIHdlIGFyZSBQVUxMLUJBU0VEIChwdWxsaW5nCisgICAqIGluIEJZVEVTIGZyb20gdXBzdHJlYW0pIGFuZCBQVVNILUJBU0VEIHdpdGggYSBCWVRFIFNFR01FTlQgKHJlY2VpdmluZworICAgKiBidWZmZXJzIHdpdGggYWN0dWFsIG9mZnNldHMpLCBpdCBpcyB1bmRlZmluZWQgaW4gUFVTSC1CQVNFRCB3aXRoIGEKKyAgICogVElNRSBTRUdNRU5UICovCisgIGd1aW50NjQgb2Zmc2V0OworCisgIC8qIG9mZnNldCBvZiB0aGUgbWRhdCBhdG9tICovCisgIGd1aW50NjQgbWRhdG9mZnNldDsKKyAgLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBtZGF0ICovCisgIGd1aW50NjQgZmlyc3RfbWRhdDsKKyAgLyogb2Zmc2V0IG9mIGxhc3QgW21vb3ZdIHNlZW4gKi8KKyAgZ3VpbnQ2NCBsYXN0X21vb3Zfb2Zmc2V0OworCisgIC8qIElmIFRSVUUsIHF0ZGVtdXggcmVjZWl2ZWQgdXBzdHJlYW0gbmV3c2VnbWVudCBpbiBUSU1FIGZvcm1hdAorICAgKiB3aGljaCBsaWtlbHkgbWVhbnMgdGhhdCB1cHN0cmVhbSBpcyBkcml2aW5nIHRoZSBwaXBlbGluZSAoc3VjaCBhcworICAgKiBhZGFwdGl2ZSBkZW11eGVycyBvciBkbG5hIHNvdXJjZXMpICovCisgIGdib29sZWFuIHVwc3RyZWFtX2Zvcm1hdF9pc190aW1lOworCisgIC8qIFNlcW51bSBvZiB0aGUgc2VlayBldmVudCBzZW50IHVwc3RyZWFtLiAgV2lsbCBiZSB1c2VkIHRvCisgICAqIGRldGVjdCBpbmNvbWluZyBGTFVTSCBldmVudHMgY29ycmVzcG9uZGluZyB0byB0aGF0ICovCisgIGd1aW50MzIgb2Zmc2V0X3NlZWtfc2VxbnVtOworCisgIC8qIFVQU1RSRUFNIEJZVEU6IFJlcXVlc3RlZCB1cHN0cmVhbSBieXRlIHNlZWsgb2Zmc2V0LgorICAgKiBDdXJyZW50bHkgaXQgaXMgb25seSB1c2VkIHRvIGNoZWNrIGlmIGFuIGluY29taW5nIEJZVEUgU0VHTUVOVAorICAgKiBjb3JyZXNwb25kcyB0byBhIHNlZWsgZXZlbnQgdGhhdCB3YXMgc2VudCB1cHN0cmVhbSAqLworICBnaW50NjQgc2Vla19vZmZzZXQ7CisKKyAgLyogVVBTVFJFQU0gQllURTogUmVxdWVzdGVkIHN0YXJ0L3N0b3AgVElNRSB2YWx1ZXMgZnJvbQorICAgKiBkb3duc3RyZWFtLgorICAgKiBVc2VkIHRvIHNldCBvbiB0aGUgZG93bnN0cmVhbSBzZWdtZW50IG9uY2UgdGhlIGNvcnJlc3BvbmRpbmcgdXBzdHJlYW0KKyAgICogQllURSBTRUVLIGhhcyBzdWNjZWVkZWQgKi8KKyAgZ2ludDY0IHB1c2hfc2Vla19zdGFydDsKKyAgZ2ludDY0IHB1c2hfc2Vla19zdG9wOworCisjaWYgMAorICAvKiBnc3QgaW5kZXggc3VwcG9ydCAqLworICBHc3RJbmRleCAqZWxlbWVudF9pbmRleDsKKyAgZ2ludCBpbmRleF9pZDsKKyNlbmRpZgorCisgIC8qIFdoZXRoZXIgdXBzdHJlYW0gaXMgc2Vla2FibGUgaW4gQllURVMgKi8KKyAgZ2Jvb2xlYW4gdXBzdHJlYW1fc2Vla2FibGU7CisgIC8qIFVQU1RSRUFNIEJZVEU6IFNpemUgb2YgdXBzdHJlYW0gY29udGVudC4KKyAgICogTm90ZSA6IFRoaXMgaXMgb25seSBjb21wdXRlZCBvbmNlICEgSWYgdXBzdHJlYW0gZ3Jvd3MgaW4gdGhlIG1lYW50aW1lCisgICAqIGl0IHdpbGwgbm90IGJlIHVwZGF0ZWQgKi8KKyAgZ2ludDY0IHVwc3RyZWFtX3NpemU7CisKKyAgLyogVVBTVFJFQU0gVElNRSA6IENvbnRhaW5zIHRoZSBQVFMgKGlmIGFueSkgb2YgdGhlCisgICAqIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIGEgW21vb2ZdIGhlYWRlci4gV2lsbCBiZSB1c2VkIHRvIGVzdGFibGlzaAorICAgKiB0aGUgYWN0dWFsIFBUUyBvZiB0aGUgc2FtcGxlcyBjb250YWluZWQgd2l0aGluIHRoYXQgZnJhZ21lbnQuICovCisgIGd1aW50NjQgZnJhZ21lbnRfc3RhcnQ7CisgIC8qIFVQU1RSRUFNIFRJTUUgOiBUaGUgb2Zmc2V0IGluIGJ5dGVzIG9mIHRoZSBbbW9vZl0KKyAgICogaGVhZGVyIHN0YXJ0LgorICAgKiBOb3RlIDogVGhpcyBpcyBub3QgY29tcHV0ZWQgZnJvbSB0aGUgR1NUX0JVRkZFUl9PRkZTRVQgZmllbGQgKi8KKyAgZ3VpbnQ2NCBmcmFnbWVudF9zdGFydF9vZmZzZXQ7Cit9OworCitzdHJ1Y3QgX0dzdFFURGVtdXhDbGFzcyB7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcXRkZW11eF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9RVERFTVVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9xdGRlbXV4X2RlYnVnLmggYi9nc3QvaXNvbXA0L3F0ZGVtdXhfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmRhMjY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9xdGRlbXV4X2RlYnVnLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfX0dTVF9RVERFTVVYX0RFQlVHX0hfXworI2RlZmluZSBfX0dTVF9RVERFTVVYX0RFQlVHX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKHF0ZGVtdXhfZGVidWcpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUVRERU1VWF9ERUJVR19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvcXRkZW11eF9kdW1wLmMgYi9nc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZjJlOTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5jCkBAIC0wLDAgKzEsMTA0OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTVEVyaWNzc29uIDxiZW5qYW1pbi5nYWlnbmFyZEBzdGVyaWNzc29uLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAicXRkZW11eF9kZWJ1Zy5oIgorI2luY2x1ZGUgInF0ZGVtdXhfdHlwZXMuaCIKKyNpbmNsdWRlICJxdGRlbXV4X2R1bXAuaCIKKyNpbmNsdWRlICJmb3VyY2MuaCIKKworI2luY2x1ZGUgInF0YXRvbXBhcnNlci5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHF0ZGVtdXhfZGVidWcKKworI2RlZmluZSBHRVRfVUlOVDgoZGF0YSkgICBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQ4X3VuY2hlY2tlZChkYXRhKQorI2RlZmluZSBHRVRfVUlOVDE2KGRhdGEpICBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9iZV91bmNoZWNrZWQoZGF0YSkKKyNkZWZpbmUgR0VUX1VJTlQzMihkYXRhKSAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmVfdW5jaGVja2VkKGRhdGEpCisjZGVmaW5lIEdFVF9VSU5UNjQoZGF0YSkgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDY0X2JlX3VuY2hlY2tlZChkYXRhKQorI2RlZmluZSBHRVRfRlAzMihkYXRhKSAgIChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZV91bmNoZWNrZWQoZGF0YSkvNjU1MzYuMCkKKyNkZWZpbmUgR0VUX0ZQMTYoZGF0YSkgICAoZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmVfdW5jaGVja2VkKGRhdGEpLzI1Ni4wKQorI2RlZmluZSBHRVRfRk9VUkNDKGRhdGEpICBxdF9hdG9tX3BhcnNlcl9nZXRfZm91cmNjX3VuY2hlY2tlZChkYXRhKQorCitnYm9vbGVhbgorcXRkZW11eF9kdW1wX212aGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwgaW50IGRlcHRoKQoreworICBndWludDMyIHZlcnNpb24gPSAwOworCisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX3JlbWFpbmluZyAoZGF0YSwgMTAwKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgdmVyc2lvbiA9IEdFVF9VSU5UMzIgKGRhdGEpOworICBHU1RfTE9HICgiJSpzICB2ZXJzaW9uL2ZsYWdzOiAlMDh4IiwgZGVwdGgsICIiLCB2ZXJzaW9uKTsKKworICB2ZXJzaW9uID0gdmVyc2lvbiA+PiAyNDsKKyAgaWYgKHZlcnNpb24gPT0gMCkgeworICAgIEdTVF9MT0cgKCIlKnMgIGNyZWF0aW9uIHRpbWU6ICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgICAgR1NUX0xPRyAoIiUqcyAgbW9kaWZ5IHRpbWU6ICAgJXUiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgICBHU1RfTE9HICgiJSpzICB0aW1lIHNjYWxlOiAgICAxLyV1IHNlYyIsIGRlcHRoLCAiIiwgR0VUX1VJTlQzMiAoZGF0YSkpOworICAgIEdTVF9MT0cgKCIlKnMgIGR1cmF0aW9uOiAgICAgICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAxKSB7CisgICAgR1NUX0xPRyAoIiUqcyAgY3JlYXRpb24gdGltZTogJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgZGVwdGgsICIiLCBHRVRfVUlOVDY0IChkYXRhKSk7CisgICAgR1NUX0xPRyAoIiUqcyAgbW9kaWZ5IHRpbWU6ICAgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgZGVwdGgsICIiLCBHRVRfVUlOVDY0IChkYXRhKSk7CisgICAgR1NUX0xPRyAoIiUqcyAgdGltZSBzY2FsZTogICAgMS8ldSBzZWMiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgICBHU1RfTE9HICgiJSpzICBkdXJhdGlvbjogICAgICAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICBkZXB0aCwgIiIsIEdFVF9VSU5UNjQgKGRhdGEpKTsKKyAgfSBlbHNlCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHByZWYuIHJhdGU6ICAgICVnIiwgZGVwdGgsICIiLCBHRVRfRlAzMiAoZGF0YSkpOworICBHU1RfTE9HICgiJSpzICBwcmVmLiB2b2x1bWU6ICAlZyIsIGRlcHRoLCAiIiwgR0VUX0ZQMTYgKGRhdGEpKTsKKyAgZ3N0X2J5dGVfcmVhZGVyX3NraXBfdW5jaGVja2VkIChkYXRhLCA0Nik7CisgIEdTVF9MT0cgKCIlKnMgIHByZXZpZXcgdGltZTogICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIEdTVF9MT0cgKCIlKnMgIHByZXZpZXcgZHVyLjogICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIEdTVF9MT0cgKCIlKnMgIHBvc3RlciB0aW1lOiAgICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIEdTVF9MT0cgKCIlKnMgIHNlbGVjdCB0aW1lOiAgICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIEdTVF9MT0cgKCIlKnMgIHNlbGVjdCBkdXIuOiAgICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIEdTVF9MT0cgKCIlKnMgIGN1cnJlbnQgdGltZTogICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIEdTVF9MT0cgKCIlKnMgIG5leHQgdHJhY2sgSUQ6ICVkIiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorcXRkZW11eF9kdW1wX3RraGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwgaW50IGRlcHRoKQoreworICBndWludDY0IGR1cmF0aW9uLCBjdGltZSwgbXRpbWU7CisgIGd1aW50MzIgdmVyc2lvbiA9IDAsIHRyYWNrX2lkID0gMCwgaXdpZHRoID0gMCwgaWhlaWdodCA9IDA7CisgIGd1aW50MTYgbGF5ZXIgPSAwLCBhbHRfZ3JvdXAgPSAwLCBpdm9sID0gMDsKKyAgZ3VpbnQgdmFsdWVfc2l6ZTsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmdmVyc2lvbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcnNpb24pOworCisgIHZhbHVlX3NpemUgPSAoKHZlcnNpb24gPj4gMjQpID09IDEpID8gc2l6ZW9mIChndWludDY0KSA6IHNpemVvZiAoZ3VpbnQzMik7CisKKyAgaWYgKHF0X2F0b21fcGFyc2VyX2dldF9vZmZzZXQgKGRhdGEsIHZhbHVlX3NpemUsICZjdGltZSkgJiYKKyAgICAgIHF0X2F0b21fcGFyc2VyX2dldF9vZmZzZXQgKGRhdGEsIHZhbHVlX3NpemUsICZtdGltZSkgJiYKKyAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmdHJhY2tfaWQpICYmCisgICAgICBnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoZGF0YSwgNCkgJiYKKyAgICAgIHF0X2F0b21fcGFyc2VyX2dldF9vZmZzZXQgKGRhdGEsIHZhbHVlX3NpemUsICZkdXJhdGlvbikgJiYKKyAgICAgIGdzdF9ieXRlX3JlYWRlcl9za2lwIChkYXRhLCA0KSAmJgorICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmUgKGRhdGEsICZsYXllcikgJiYKKyAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2JlIChkYXRhLCAmYWx0X2dyb3VwKSAmJgorICAgICAgZ3N0X2J5dGVfcmVhZGVyX3NraXAgKGRhdGEsIDQpICYmCisgICAgICBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9iZSAoZGF0YSwgJml2b2wpICYmCisgICAgICBnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoZGF0YSwgMiArICg5ICogNCkpICYmCisgICAgICBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJml3aWR0aCkgJiYKKyAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmaWhlaWdodCkpIHsKKyAgICBHU1RfTE9HICgiJSpzICBjcmVhdGlvbiB0aW1lOiAlIiBHX0dVSU5UNjRfRk9STUFULCBkZXB0aCwgIiIsIGN0aW1lKTsKKyAgICBHU1RfTE9HICgiJSpzICBtb2RpZnkgdGltZTogICAlIiBHX0dVSU5UNjRfRk9STUFULCBkZXB0aCwgIiIsIG10aW1lKTsKKyAgICBHU1RfTE9HICgiJSpzICB0cmFjayBJRDogICAgICAldSIsIGRlcHRoLCAiIiwgdHJhY2tfaWQpOworICAgIEdTVF9MT0cgKCIlKnMgIGR1cmF0aW9uOiAgICAgICUiIEdfR1VJTlQ2NF9GT1JNQVQsIGRlcHRoLCAiIiwgZHVyYXRpb24pOworICAgIEdTVF9MT0cgKCIlKnMgIGxheWVyOiAgICAgICAgICV1IiwgZGVwdGgsICIiLCBsYXllcik7CisgICAgR1NUX0xPRyAoIiUqcyAgYWx0IGdyb3VwOiAgICAgJXUiLCBkZXB0aCwgIiIsIGFsdF9ncm91cCk7CisgICAgR1NUX0xPRyAoIiUqcyAgdm9sdW1lOiAgICAgICAgJWciLCBkZXB0aCwgIiIsIGl2b2wgLyAyNTYuMCk7CisgICAgR1NUX0xPRyAoIiUqcyAgdHJhY2sgd2lkdGg6ICAgJWciLCBkZXB0aCwgIiIsIGl3aWR0aCAvIDY1NTM2LjApOworICAgIEdTVF9MT0cgKCIlKnMgIHRyYWNrIGhlaWdodDogICVnIiwgZGVwdGgsICIiLCBpaGVpZ2h0IC8gNjU1MzYuMCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfZWxzdCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MzIgdmVyX2ZsYWdzID0gMCwgbnVtX2VudHJpZXMgPSAwLCBpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ2ZXJfZmxhZ3MpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZudW1fZW50cmllcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcl9mbGFncyk7CisgIEdTVF9MT0cgKCIlKnMgIG4gZW50cmllczogICAgICVkIiwgZGVwdGgsICIiLCBudW1fZW50cmllcyk7CisKKyAgaWYgKCFxdF9hdG9tX3BhcnNlcl9oYXNfY2h1bmtzIChkYXRhLCBudW1fZW50cmllcywgNCArIDQgKyA0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyBpKyspIHsKKyAgICBHU1RfTE9HICgiJSpzICAgIHRyYWNrIGR1cjogICAgICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgICAgR1NUX0xPRyAoIiUqcyAgICBtZWRpYSB0aW1lOiAgICAldSIsIGRlcHRoLCAiIiwgR0VUX1VJTlQzMiAoZGF0YSkpOworICAgIEdTVF9MT0cgKCIlKnMgICAgbWVkaWEgcmF0ZTogICAgJWciLCBkZXB0aCwgIiIsIEdFVF9GUDMyIChkYXRhKSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfbWRoZCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MzIgdmVyc2lvbiA9IDA7CisgIGd1aW50NjQgZHVyYXRpb24sIGN0aW1lLCBtdGltZTsKKyAgZ3VpbnQzMiB0aW1lX3NjYWxlID0gMDsKKyAgZ3VpbnQxNiBsYW5ndWFnZSA9IDAsIHF1YWxpdHkgPSAwOworICBndWludCB2YWx1ZV9zaXplOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ2ZXJzaW9uKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0xPRyAoIiUqcyAgdmVyc2lvbi9mbGFnczogJTA4eCIsIGRlcHRoLCAiIiwgdmVyc2lvbik7CisKKyAgdmFsdWVfc2l6ZSA9ICgodmVyc2lvbiA+PiAyNCkgPT0gMSkgPyBzaXplb2YgKGd1aW50NjQpIDogc2l6ZW9mIChndWludDMyKTsKKworICBpZiAocXRfYXRvbV9wYXJzZXJfZ2V0X29mZnNldCAoZGF0YSwgdmFsdWVfc2l6ZSwgJmN0aW1lKSAmJgorICAgICAgcXRfYXRvbV9wYXJzZXJfZ2V0X29mZnNldCAoZGF0YSwgdmFsdWVfc2l6ZSwgJm10aW1lKSAmJgorICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ0aW1lX3NjYWxlKSAmJgorICAgICAgcXRfYXRvbV9wYXJzZXJfZ2V0X29mZnNldCAoZGF0YSwgdmFsdWVfc2l6ZSwgJmR1cmF0aW9uKSAmJgorICAgICAgZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmUgKGRhdGEsICZsYW5ndWFnZSkgJiYKKyAgICAgIGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2JlIChkYXRhLCAmcXVhbGl0eSkpIHsKKyAgICBHU1RfTE9HICgiJSpzICBjcmVhdGlvbiB0aW1lOiAlIiBHX0dVSU5UNjRfRk9STUFULCBkZXB0aCwgIiIsIGN0aW1lKTsKKyAgICBHU1RfTE9HICgiJSpzICBtb2RpZnkgdGltZTogICAlIiBHX0dVSU5UNjRfRk9STUFULCBkZXB0aCwgIiIsIG10aW1lKTsKKyAgICBHU1RfTE9HICgiJSpzICB0aW1lIHNjYWxlOiAgICAxLyV1IHNlYyIsIGRlcHRoLCAiIiwgdGltZV9zY2FsZSk7CisgICAgR1NUX0xPRyAoIiUqcyAgZHVyYXRpb246ICAgICAgJSIgR19HVUlOVDY0X0ZPUk1BVCwgZGVwdGgsICIiLCBkdXJhdGlvbik7CisgICAgR1NUX0xPRyAoIiUqcyAgbGFuZ3VhZ2U6ICAgICAgJXUiLCBkZXB0aCwgIiIsIGxhbmd1YWdlKTsKKyAgICBHU1RfTE9HICgiJSpzICBxdWFsaXR5OiAgICAgICAldSIsIGRlcHRoLCAiIiwgcXVhbGl0eSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfaGRsciAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MzIgdmVyc2lvbiwgdHlwZSwgc3VidHlwZSwgbWFudWZhY3R1cmVyOworICBjb25zdCBnY2hhciAqbmFtZTsKKworICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19yZW1haW5pbmcgKGRhdGEsIDQgKyA0ICsgNCArIDQgKyA0ICsgNCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHZlcnNpb24gPSBHRVRfVUlOVDMyIChkYXRhKTsKKyAgdHlwZSA9IEdFVF9GT1VSQ0MgKGRhdGEpOworICBzdWJ0eXBlID0gR0VUX0ZPVVJDQyAoZGF0YSk7CisgIG1hbnVmYWN0dXJlciA9IEdFVF9GT1VSQ0MgKGRhdGEpOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcnNpb24pOworICBHU1RfTE9HICgiJSpzICB0eXBlOiAgICAgICAgICAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwgZGVwdGgsICIiLAorICAgICAgR1NUX0ZPVVJDQ19BUkdTICh0eXBlKSk7CisgIEdTVF9MT0cgKCIlKnMgIHN1YnR5cGU6ICAgICAgICUiIEdTVF9GT1VSQ0NfRk9STUFULCBkZXB0aCwgIiIsCisgICAgICBHU1RfRk9VUkNDX0FSR1MgKHN1YnR5cGUpKTsKKyAgR1NUX0xPRyAoIiUqcyAgbWFudWZhY3R1cmVyOiAgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsIGRlcHRoLCAiIiwKKyAgICAgIEdTVF9GT1VSQ0NfQVJHUyAobWFudWZhY3R1cmVyKSk7CisgIEdTVF9MT0cgKCIlKnMgIGZsYWdzOiAgICAgICAgICUwOHgiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgR1NUX0xPRyAoIiUqcyAgZmxhZ3MgbWFzazogICAgJTA4eCIsIGRlcHRoLCAiIiwgR0VUX1VJTlQzMiAoZGF0YSkpOworCisgIC8qIHF1aWNrdGltZSB1c2VzIHBhc2NhbCBzdHJpbmcsIG1wNCB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5nICovCisgIGlmIChnc3RfYnl0ZV9yZWFkZXJfcGVla19zdHJpbmcgKGRhdGEsICZuYW1lKSkgeworICAgIEdTVF9MT0cgKCIlKnMgIG5hbWU6ICAgICAgICAgICVzIiwgZGVwdGgsICIiLCBuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBnY2hhciBidWZbMjU2XTsKKyAgICBndWludDggbGVuOworCisgICAgaWYgKGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKGRhdGEsICZsZW4pCisgICAgICAgICYmIHF0X2F0b21fcGFyc2VyX2hhc19yZW1haW5pbmcgKGRhdGEsIGxlbikpIHsKKyAgICAgIG1lbWNweSAoYnVmLCBnc3RfYnl0ZV9yZWFkZXJfcGVla19kYXRhX3VuY2hlY2tlZCAoZGF0YSksIGxlbik7CisgICAgICBidWZbbGVuXSA9ICdcMCc7CisgICAgICBHU1RfTE9HICgiJSpzICBuYW1lOiAgICAgICAgICAlcyIsIGRlcHRoLCAiIiwgYnVmKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfdm1oZCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX3JlbWFpbmluZyAoZGF0YSwgNCArIDQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBHU1RfTE9HICgiJSpzICB2ZXJzaW9uL2ZsYWdzOiAlMDh4IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIEdTVF9MT0cgKCIlKnMgIG1vZGUvY29sb3I6ICAgICUwOHgiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfZHJlZiAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MzIgdmVyX2ZsYWdzID0gMCwgbnVtX2VudHJpZXMgPSAwLCBpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ2ZXJfZmxhZ3MpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZudW1fZW50cmllcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcl9mbGFncyk7CisgIEdTVF9MT0cgKCIlKnMgIG4gZW50cmllczogICAgICV1IiwgZGVwdGgsICIiLCBudW1fZW50cmllcyk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fZW50cmllczsgaSsrKSB7CisgICAgZ3VpbnQzMiBzaXplID0gMCwgZm91cmNjOworCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnNpemUpIHx8CisgICAgICAgICFxdF9hdG9tX3BhcnNlcl9nZXRfZm91cmNjIChkYXRhLCAmZm91cmNjKSB8fCBzaXplIDwgOCB8fAorICAgICAgICAhZ3N0X2J5dGVfcmVhZGVyX3NraXAgKGRhdGEsIHNpemUgLSA4KSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIEdTVF9MT0cgKCIlKnMgICAgc2l6ZTogICAgICAgICAgJXUiLCBkZXB0aCwgIiIsIHNpemUpOworICAgIEdTVF9MT0cgKCIlKnMgICAgdHlwZTogICAgICAgICAgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsIGRlcHRoLCAiIiwKKyAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X2R1bXBfc3RzZF9hdmMxIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGd1aW50IHNpemUsCisgICAgaW50IGRlcHRoKQoreworICBndWludDMyIGZvdXJjYzsKKworICAvKiBTaXplIG9mIGF2YzEgPSA3OCBieXRlcyAqLworICBpZiAoc2l6ZSA8ICg2ICsgMiArIDQgKyA0ICsgNCArIDQgKyAyICsgMiArIDQgKyA0ICsgNCArIDIgKyAxICsgMzEgKyAyICsgMikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGdzdF9ieXRlX3JlYWRlcl9za2lwX3VuY2hlY2tlZCAoZGF0YSwgNik7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJSpzICAgIGRhdGEgcmVmZXJlbmNlOiVkIiwgZGVwdGgsICIiLAorICAgICAgR0VUX1VJTlQxNiAoZGF0YSkpOworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIiUqcyAgICB2ZXJzaW9uL3Jldi46ICAlMDh4IiwgZGVwdGgsICIiLAorICAgICAgR0VUX1VJTlQzMiAoZGF0YSkpOworICBmb3VyY2MgPSBHRVRfRk9VUkNDIChkYXRhKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICIlKnMgICAgdmVuZG9yOiAgICAgICAgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsIGRlcHRoLAorICAgICAgIiIsIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSk7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJSpzICAgIHRlbXBvcmFsIHF1YWw6ICV1IiwgZGVwdGgsICIiLAorICAgICAgR0VUX1VJTlQzMiAoZGF0YSkpOworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIiUqcyAgICBzcGF0aWFsIHF1YWw6ICAldSIsIGRlcHRoLCAiIiwKKyAgICAgIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICIlKnMgICAgd2lkdGg6ICAgICAgICAgJXUiLCBkZXB0aCwgIiIsCisgICAgICBHRVRfVUlOVDE2IChkYXRhKSk7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJSpzICAgIGhlaWdodDogICAgICAgICV1IiwgZGVwdGgsICIiLAorICAgICAgR0VUX1VJTlQxNiAoZGF0YSkpOworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIiUqcyAgICBob3Jpei4gcmVzb2w6ICAlZyIsIGRlcHRoLCAiIiwKKyAgICAgIEdFVF9GUDMyIChkYXRhKSk7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJSpzICAgIHZlcnQuIHJlc29sLjogICVnIiwgZGVwdGgsICIiLAorICAgICAgR0VUX0ZQMzIgKGRhdGEpKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHF0ZGVtdXgsICIlKnMgICAgZGF0YSBzaXplOiAgICAgJXUiLCBkZXB0aCwgIiIsCisgICAgICBHRVRfVUlOVDMyIChkYXRhKSk7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJSpzICAgIGZyYW1lIGNvdW50OiAgICV1IiwgZGVwdGgsICIiLAorICAgICAgR0VUX1VJTlQxNiAoZGF0YSkpOworICAvKiBzb21ldGhpbmcgaXMgbm90IHJpZ2h0IHdpdGggdGhpcywgaXQncyBzdXBwb3NlZCB0byBiZSBhIHN0cmluZyBidXQgaXQncworICAgKiBub3QgYXBwYXJlbnRseSwgc28ganVzdCBza2lwIHRoaXMgZm9yIG5vdyAqLworICBnc3RfYnl0ZV9yZWFkZXJfc2tpcF91bmNoZWNrZWQgKGRhdGEsIDEgKyAzMSk7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJSpzICAgIGNvbXByZXNzb3I6ICAgIChza2lwcGVkKSIsIGRlcHRoLCAiIik7CisgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJSpzICAgIGRlcHRoOiAgICAgICAgICV1IiwgZGVwdGgsICIiLAorICAgICAgR0VUX1VJTlQxNiAoZGF0YSkpOworICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIiUqcyAgICBjb2xvciB0YWJsZSBJRDoldSIsIGRlcHRoLCAiIiwKKyAgICAgIEdFVF9VSU5UMTYgKGRhdGEpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfZHVtcF9zdHNkIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGludCBkZXB0aCkKK3sKKyAgZ3VpbnQzMiB2ZXJfZmxhZ3MgPSAwLCBudW1fZW50cmllcyA9IDAsIGk7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnZlcl9mbGFncykgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJm51bV9lbnRyaWVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0xPRyAoIiUqcyAgdmVyc2lvbi9mbGFnczogJTA4eCIsIGRlcHRoLCAiIiwgdmVyX2ZsYWdzKTsKKyAgR1NUX0xPRyAoIiUqcyAgbiBlbnRyaWVzOiAgICAgJWQiLCBkZXB0aCwgIiIsIG51bV9lbnRyaWVzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykgeworICAgIEdzdEJ5dGVSZWFkZXIgc3ViOworICAgIGd1aW50MzIgc2l6ZSwgcmVtYWluOworICAgIGd1aW50MzIgZm91cmNjOworCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnNpemUpIHx8CisgICAgICAgICFxdF9hdG9tX3BhcnNlcl9nZXRfZm91cmNjIChkYXRhLCAmZm91cmNjKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChxdGRlbXV4LCAiJSpzICAgIHNpemU6ICAgICAgICAgICV1IiwgZGVwdGgsICIiLCBzaXplKTsKKyAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwgIiUqcyAgICB0eXBlOiAgICAgICAgICAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwgZGVwdGgsCisgICAgICAgICIiLCBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYykpOworCisgICAgcmVtYWluID0gZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKGRhdGEpOworICAgIC8qIFNpemUgaW5jbHVkZXMgdGhlIDggYnl0ZXMgd2UganVzdCByZWFkOiBsZW4gJiBmb3VyY2MsIHRoZW4gOCBieXRlcworICAgICAqIHZlcnNpb24sIGZsYWdzLCBlbnRyaWVzX2NvdW50ICovCisgICAgaWYgKHNpemUgPiByZW1haW4gKyA4KSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocXRkZW11eCwKKyAgICAgICAgICAiTm90IGVub3VnaCBkYXRhIGxlZnQgZm9yIHRoaXMgYXRvbSAoaGF2ZSAldSBuZWVkICV1KSIsIHJlbWFpbiwgc2l6ZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcXRfYXRvbV9wYXJzZXJfcGVla19zdWIgKGRhdGEsIDAsIHNpemUsICZzdWIpOworICAgIHN3aXRjaCAoZm91cmNjKSB7CisgICAgICBjYXNlIEZPVVJDQ19hdmMxOgorICAgICAgICBpZiAoIXF0ZGVtdXhfZHVtcF9zdHNkX2F2YzEgKHF0ZGVtdXgsICZzdWIsIHNpemUsIGRlcHRoICsgMSkpCisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk9VUkNDX2ZMYUM6CisgICAgICAgIC8qIHdpbGwgYmUgZHVtcGVkIGJ5IG5vZGVfZHVtcF9mb3JlYWNoICovCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGT1VSQ0NfbXA0czoKKyAgICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnN1YiwgJnZlcl9mbGFncykgfHwKKyAgICAgICAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoJnN1YiwgJm51bV9lbnRyaWVzKSkKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghcXRkZW11eF9kdW1wX3Vua25vd24gKHF0ZGVtdXgsICZzdWIsIGRlcHRoICsgMSkpCisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIFVua25vd24gc3RzZCBkYXRhLCBkdW1wIHRoZSBieXRlcyAqLworICAgICAgICBpZiAoIXF0ZGVtdXhfZHVtcF91bmtub3duIChxdGRlbXV4LCAmc3ViLCBkZXB0aCArIDEpKQorICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoZGF0YSwgc2l6ZSAtICg0ICsgNCkpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorcXRkZW11eF9kdW1wX3N0dHMgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwgaW50IGRlcHRoKQoreworICBndWludDMyIHZlcl9mbGFncyA9IDAsIG51bV9lbnRyaWVzID0gMCwgaTsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmdmVyX2ZsYWdzKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmbnVtX2VudHJpZXMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBHU1RfTE9HICgiJSpzICB2ZXJzaW9uL2ZsYWdzOiAlMDh4IiwgZGVwdGgsICIiLCB2ZXJfZmxhZ3MpOworICBHU1RfTE9HICgiJSpzICBuIGVudHJpZXM6ICAgICAlZCIsIGRlcHRoLCAiIiwgbnVtX2VudHJpZXMpOworCisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX2NodW5rcyAoZGF0YSwgbnVtX2VudHJpZXMsIDQgKyA0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyBpKyspIHsKKyAgICBHU1RfTE9HICgiJSpzICAgIGNvdW50OiAgICAgICAgICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgICAgR1NUX0xPRyAoIiUqcyAgICBkdXJhdGlvbjogICAgICAldSIsIGRlcHRoLCAiIiwgR0VUX1VJTlQzMiAoZGF0YSkpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorcXRkZW11eF9kdW1wX3N0cHMgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwgaW50IGRlcHRoKQoreworICBndWludDMyIHZlcl9mbGFncyA9IDAsIG51bV9lbnRyaWVzID0gMCwgaTsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmdmVyX2ZsYWdzKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmbnVtX2VudHJpZXMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBHU1RfTE9HICgiJSpzICB2ZXJzaW9uL2ZsYWdzOiAlMDh4IiwgZGVwdGgsICIiLCB2ZXJfZmxhZ3MpOworICBHU1RfTE9HICgiJSpzICBuIGVudHJpZXM6ICAgICAlZCIsIGRlcHRoLCAiIiwgbnVtX2VudHJpZXMpOworCisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX2NodW5rcyAoZGF0YSwgbnVtX2VudHJpZXMsIDQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykgeworICAgIEdTVF9MT0cgKCIlKnMgICAgc2FtcGxlOiAgICAgICAgJXUiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfZHVtcF9zdHNzIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGludCBkZXB0aCkKK3sKKyAgZ3VpbnQzMiB2ZXJfZmxhZ3MgPSAwLCBudW1fZW50cmllcyA9IDAsIGk7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnZlcl9mbGFncykgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJm51bV9lbnRyaWVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0xPRyAoIiUqcyAgdmVyc2lvbi9mbGFnczogJTA4eCIsIGRlcHRoLCAiIiwgdmVyX2ZsYWdzKTsKKyAgR1NUX0xPRyAoIiUqcyAgbiBlbnRyaWVzOiAgICAgJWQiLCBkZXB0aCwgIiIsIG51bV9lbnRyaWVzKTsKKworICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19jaHVua3MgKGRhdGEsIG51bV9lbnRyaWVzLCA0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyBpKyspIHsKKyAgICBHU1RfTE9HICgiJSpzICAgIHNhbXBsZTogICAgICAgICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfc3RzYyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MzIgdmVyX2ZsYWdzID0gMCwgbnVtX2VudHJpZXMgPSAwLCBpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ2ZXJfZmxhZ3MpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZudW1fZW50cmllcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcl9mbGFncyk7CisgIEdTVF9MT0cgKCIlKnMgIG4gZW50cmllczogICAgICVkIiwgZGVwdGgsICIiLCBudW1fZW50cmllcyk7CisKKyAgaWYgKCFxdF9hdG9tX3BhcnNlcl9oYXNfY2h1bmtzIChkYXRhLCBudW1fZW50cmllcywgNCArIDQgKyA0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyBpKyspIHsKKyAgICBHU1RfTE9HICgiJSpzICAgIGZpcnN0IGNodW5rOiAgICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgICAgR1NUX0xPRyAoIiUqcyAgICBzYW1wbGUgcGVyIGNoOiAldSIsIGRlcHRoLCAiIiwgR0VUX1VJTlQzMiAoZGF0YSkpOworICAgIEdTVF9MT0cgKCIlKnMgICAgc2FtcGxlIGRlc2MgaWQ6JTA4eCIsIGRlcHRoLCAiIiwgR0VUX1VJTlQzMiAoZGF0YSkpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorcXRkZW11eF9kdW1wX3N0c3ogKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwgaW50IGRlcHRoKQoreworICBndWludDMyIHZlcl9mbGFncyA9IDAsIHNhbXBsZV9zaXplID0gMCwgbnVtX2VudHJpZXMgPSAwLCBpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ2ZXJfZmxhZ3MpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZzYW1wbGVfc2l6ZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcl9mbGFncyk7CisgIEdTVF9MT0cgKCIlKnMgIHNhbXBsZSBzaXplOiAgICVkIiwgZGVwdGgsICIiLCBzYW1wbGVfc2l6ZSk7CisKKyAgaWYgKHNhbXBsZV9zaXplID09IDApIHsKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmbnVtX2VudHJpZXMpKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgR1NUX0xPRyAoIiUqcyAgbiBlbnRyaWVzOiAgICAgJWQiLCBkZXB0aCwgIiIsIG51bV9lbnRyaWVzKTsKKyAgICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19jaHVua3MgKGRhdGEsIG51bV9lbnRyaWVzLCA0KSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykgeworICAgICAgR1NUX1RSQUNFICgiJSpzICAgIHNhbXBsZSBzaXplOiAgICV1IiwgZGVwdGgsICIiLCBHRVRfVUlOVDMyIChkYXRhKSk7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorcXRkZW11eF9kdW1wX3N0Y28gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwgaW50IGRlcHRoKQoreworICBndWludDMyIHZlcl9mbGFncyA9IDAsIG51bV9lbnRyaWVzID0gMCwgaTsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmdmVyX2ZsYWdzKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmbnVtX2VudHJpZXMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBHU1RfTE9HICgiJSpzICB2ZXJzaW9uL2ZsYWdzOiAlMDh4IiwgZGVwdGgsICIiLCB2ZXJfZmxhZ3MpOworICBHU1RfTE9HICgiJSpzICBuIGVudHJpZXM6ICAgICAlZCIsIGRlcHRoLCAiIiwgbnVtX2VudHJpZXMpOworCisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX2NodW5rcyAoZGF0YSwgbnVtX2VudHJpZXMsIDQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykgeworICAgIEdTVF9MT0cgKCIlKnMgICAgY2h1bmsgb2Zmc2V0OiAgJXUiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfZHVtcF9jdHRzIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGludCBkZXB0aCkKK3sKKyAgZ3VpbnQzMiB2ZXJfZmxhZ3MgPSAwLCBudW1fZW50cmllcyA9IDAsIGksIGNvdW50OworICBnaW50MzIgb2Zmc2V0OworCisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnZlcl9mbGFncykgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJm51bV9lbnRyaWVzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0xPRyAoIiUqcyAgdmVyc2lvbi9mbGFnczogJTA4eCIsIGRlcHRoLCAiIiwgdmVyX2ZsYWdzKTsKKyAgR1NUX0xPRyAoIiUqcyAgbiBlbnRyaWVzOiAgICAgJXUiLCBkZXB0aCwgIiIsIG51bV9lbnRyaWVzKTsKKworICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19jaHVua3MgKGRhdGEsIG51bV9lbnRyaWVzLCA0ICsgNCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fZW50cmllczsgaSsrKSB7CisgICAgY291bnQgPSBHRVRfVUlOVDMyIChkYXRhKTsKKyAgICBvZmZzZXQgPSBHRVRfVUlOVDMyIChkYXRhKTsKKyAgICBHU1RfTE9HICgiJSpzICAgIHNhbXBsZSBjb3VudCA6JThkIG9mZnNldDogJThkIiwgZGVwdGgsICIiLCBjb3VudCwgb2Zmc2V0KTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfZHVtcF9jc2xnIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGludCBkZXB0aCkKK3sKKyAgZ3VpbnQzMiB2ZXJfZmxhZ3MgPSAwLCBzaGlmdCA9IDA7CisgIGdpbnQzMiBsZWFzdF9vZmZzZXQgPSAwLCBzdGFydF90aW1lID0gMCwgZW5kX3RpbWUgPSAwOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ2ZXJfZmxhZ3MpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZzaGlmdCkgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2ludDMyX2JlIChkYXRhLCAmbGVhc3Rfb2Zmc2V0KSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfaW50MzJfYmUgKGRhdGEsICZzdGFydF90aW1lKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfaW50MzJfYmUgKGRhdGEsICZlbmRfdGltZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcl9mbGFncyk7CisgIEdTVF9MT0cgKCIlKnMgIHNoaWZ0OiAgICAgICAgICV1IiwgZGVwdGgsICIiLCBzaGlmdCk7CisgIEdTVF9MT0cgKCIlKnMgIGxlYXN0IG9mZnNldDogICVkIiwgZGVwdGgsICIiLCBsZWFzdF9vZmZzZXQpOworICBHU1RfTE9HICgiJSpzICBzdGFydCB0aW1lOiAgICAlZCIsIGRlcHRoLCAiIiwgc3RhcnRfdGltZSk7CisgIEdTVF9MT0cgKCIlKnMgIGVuZCB0aW1lOiAgICAgICVkIiwgZGVwdGgsICIiLCBlbmRfdGltZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfY282NCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MzIgdmVyX2ZsYWdzID0gMCwgbnVtX2VudHJpZXMgPSAwLCBpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ2ZXJfZmxhZ3MpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZudW1fZW50cmllcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcl9mbGFncyk7CisgIEdTVF9MT0cgKCIlKnMgIG4gZW50cmllczogICAgICVkIiwgZGVwdGgsICIiLCBudW1fZW50cmllcyk7CisKKyAgaWYgKCFxdF9hdG9tX3BhcnNlcl9oYXNfY2h1bmtzIChkYXRhLCBudW1fZW50cmllcywgOCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fZW50cmllczsgaSsrKSB7CisgICAgR1NUX0xPRyAoIiUqcyAgICBjaHVuayBvZmZzZXQ6ICAlIiBHX0dVSU5UNjRfRk9STUFULCBkZXB0aCwgIiIsCisgICAgICAgIEdFVF9VSU5UNjQgKGRhdGEpKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfZHVtcF9kY29tIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGludCBkZXB0aCkKK3sKKyAgaWYgKCFxdF9hdG9tX3BhcnNlcl9oYXNfcmVtYWluaW5nIChkYXRhLCA0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0xPRyAoIiUqcyAgY29tcHJlc3Npb24gdHlwZTogJSIgR1NUX0ZPVVJDQ19GT1JNQVQsIGRlcHRoLCAiIiwKKyAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoR0VUX0ZPVVJDQyAoZGF0YSkpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfY212ZCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX3JlbWFpbmluZyAoZGF0YSwgNCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIGxlbmd0aDogJWQiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfbWZybyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX3JlbWFpbmluZyAoZGF0YSwgNCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgR1NUX0xPRyAoIiUqcyAgc2l6ZTogJWQiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfbWZoZCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGlmICghcXRfYXRvbV9wYXJzZXJfaGFzX3JlbWFpbmluZyAoZGF0YSwgNCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgR1NUX0xPRyAoIiUqcyAgc2VxdWVuY2VfbnVtYmVyOiAlZCIsIGRlcHRoLCAiIiwgR0VUX1VJTlQzMiAoZGF0YSkpOworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfZHVtcF90ZnJhIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGludCBkZXB0aCkKK3sKKyAgZ3VpbnQ2NCB0aW1lID0gMCwgbW9vZl9vZmZzZXQgPSAwOworICBndWludDMyIGxlbiA9IDAsIG51bV9lbnRyaWVzID0gMCwgdmVyX2ZsYWdzID0gMCwgdHJhY2tfaWQgPSAwLCBpOworICBndWludCB2YWx1ZV9zaXplLCB0cmFmX3NpemUsIHRydW5fc2l6ZSwgc2FtcGxlX3NpemU7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnZlcl9mbGFncykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcl9mbGFncyk7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnRyYWNrX2lkKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmbGVuKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmbnVtX2VudHJpZXMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBHU1RfTE9HICgiJSpzICB0cmFjayBJRDogICAgICAldSIsIGRlcHRoLCAiIiwgdHJhY2tfaWQpOworICBHU1RfTE9HICgiJSpzICBsZW5ndGg6ICAgICAgICAweCV4IiwgZGVwdGgsICIiLCBsZW4pOworICBHU1RfTE9HICgiJSpzICBuIGVudHJpZXM6ICAgICAldSIsIGRlcHRoLCAiIiwgbnVtX2VudHJpZXMpOworCisgIHZhbHVlX3NpemUgPSAoKHZlcl9mbGFncyA+PiAyNCkgPT0gMSkgPyBzaXplb2YgKGd1aW50NjQpIDogc2l6ZW9mIChndWludDMyKTsKKyAgc2FtcGxlX3NpemUgPSAobGVuICYgMykgKyAxOworICB0cnVuX3NpemUgPSAoKGxlbiAmIDEyKSA+PiAyKSArIDE7CisgIHRyYWZfc2l6ZSA9ICgobGVuICYgNDgpID4+IDQpICsgMTsKKworICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19jaHVua3MgKGRhdGEsIG51bV9lbnRyaWVzLAorICAgICAgICAgIHZhbHVlX3NpemUgKyB2YWx1ZV9zaXplICsgdHJhZl9zaXplICsgdHJ1bl9zaXplICsgc2FtcGxlX3NpemUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykgeworICAgIHF0X2F0b21fcGFyc2VyX2dldF9vZmZzZXQgKGRhdGEsIHZhbHVlX3NpemUsICZ0aW1lKTsKKyAgICBxdF9hdG9tX3BhcnNlcl9nZXRfb2Zmc2V0IChkYXRhLCB2YWx1ZV9zaXplLCAmbW9vZl9vZmZzZXQpOworICAgIEdTVF9MT0cgKCIlKnMgICAgdGltZTogICAgICAgICAgJSIgR19HVUlOVDY0X0ZPUk1BVCwgZGVwdGgsICIiLCB0aW1lKTsKKyAgICBHU1RfTE9HICgiJSpzICAgIG1vb2Zfb2Zmc2V0OiAgICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgIGRlcHRoLCAiIiwgbW9vZl9vZmZzZXQpOworICAgIEdTVF9MT0cgKCIlKnMgICAgdHJhZl9udW1iZXI6ICAgJXUiLCBkZXB0aCwgIiIsCisgICAgICAgIHF0X2F0b21fcGFyc2VyX2dldF91aW50X3dpdGhfc2l6ZV91bmNoZWNrZWQgKGRhdGEsIHRyYWZfc2l6ZSkpOworICAgIEdTVF9MT0cgKCIlKnMgICAgdHJ1bl9udW1iZXI6ICAgJXUiLCBkZXB0aCwgIiIsCisgICAgICAgIHF0X2F0b21fcGFyc2VyX2dldF91aW50X3dpdGhfc2l6ZV91bmNoZWNrZWQgKGRhdGEsIHRydW5fc2l6ZSkpOworICAgIEdTVF9MT0cgKCIlKnMgICAgc2FtcGxlX251bWJlcjogJXUiLCBkZXB0aCwgIiIsCisgICAgICAgIHF0X2F0b21fcGFyc2VyX2dldF91aW50X3dpdGhfc2l6ZV91bmNoZWNrZWQgKGRhdGEsIHNhbXBsZV9zaXplKSk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfZHVtcF90ZmhkIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGludCBkZXB0aCkKK3sKKyAgZ3VpbnQzMiBmbGFncyA9IDAsIG4gPSAwLCB0cmFja19pZCA9IDA7CisgIGd1aW50NjQgYmFzZV9kYXRhX29mZnNldCA9IDA7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoZGF0YSwgMSkgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQyNF9iZSAoZGF0YSwgJmZsYWdzKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIEdTVF9MT0cgKCIlKnMgIGZsYWdzOiAlMDh4IiwgZGVwdGgsICIiLCBmbGFncyk7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnRyYWNrX2lkKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIEdTVF9MT0cgKCIlKnMgIHRyYWNrX2lkOiAldSIsIGRlcHRoLCAiIiwgdHJhY2tfaWQpOworCisgIGlmIChmbGFncyAmIFRGX0JBU0VfREFUQV9PRkZTRVQpIHsKKyAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDY0X2JlIChkYXRhLCAmYmFzZV9kYXRhX29mZnNldCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgR1NUX0xPRyAoIiUqcyAgICBiYXNlLWRhdGEtb2Zmc2V0OiAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICBkZXB0aCwgIiIsIGJhc2VfZGF0YV9vZmZzZXQpOworICB9CisKKyAgaWYgKGZsYWdzICYgVEZfU0FNUExFX0RFU0NSSVBUSU9OX0lOREVYKSB7CisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJm4pKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIEdTVF9MT0cgKCIlKnMgICAgc2FtcGxlLWRlc2NyaXB0aW9uLWluZGV4OiAldSIsIGRlcHRoLCAiIiwgbik7CisgIH0KKworICBpZiAoZmxhZ3MgJiBURl9ERUZBVUxUX1NBTVBMRV9EVVJBVElPTikgeworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZuKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBHU1RfTE9HICgiJSpzICAgIGRlZmF1bHQtc2FtcGxlLWR1cmF0aW9uOiAgJXUiLCBkZXB0aCwgIiIsIG4pOworICB9CisKKyAgaWYgKGZsYWdzICYgVEZfREVGQVVMVF9TQU1QTEVfU0laRSkgeworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZuKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBHU1RfTE9HICgiJSpzICAgIGRlZmF1bHQtc2FtcGxlLXNpemU6ICAldSIsIGRlcHRoLCAiIiwgbik7CisgIH0KKworICBpZiAoZmxhZ3MgJiBURl9ERUZBVUxUX1NBTVBMRV9GTEFHUykgeworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZuKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBHU1RfTE9HICgiJSpzICAgIGRlZmF1bHQtc2FtcGxlLWZsYWdzOiAgJXUiLCBkZXB0aCwgIiIsIG4pOworICB9CisKKyAgR1NUX0xPRyAoIiUqcyAgICBkdXJhdGlvbi1pcy1lbXB0eTogICAgICVzIiwgZGVwdGgsICIiLAorICAgICAgZmxhZ3MgJiBURl9EVVJBVElPTl9JU19FTVBUWSA/ICJ5ZXMiIDogIm5vIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfdHJ1biAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MzIgZmxhZ3MgPSAwLCBzYW1wbGVzX2NvdW50ID0gMCwgZGF0YV9vZmZzZXQgPSAwLCBmaXJzdF9zYW1wbGVfZmxhZ3MgPSAwOworICBndWludDMyIHNhbXBsZV9kdXJhdGlvbiA9IDAsIHNhbXBsZV9zaXplID0gMCwgc2FtcGxlX2ZsYWdzID0KKyAgICAgIDAsIGNvbXBvc2l0aW9uX3RpbWVfb2Zmc2V0cyA9IDA7CisgIGludCBpID0gMDsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwIChkYXRhLCAxKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDI0X2JlIChkYXRhLCAmZmxhZ3MpKQorICAgIHJldHVybiBGQUxTRTsKKworICBHU1RfTE9HICgiJSpzICBmbGFnczogJTA4eCIsIGRlcHRoLCAiIiwgZmxhZ3MpOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZzYW1wbGVzX2NvdW50KSkKKyAgICByZXR1cm4gRkFMU0U7CisgIEdTVF9MT0cgKCIlKnMgIHNhbXBsZXNfY291bnQ6ICV1IiwgZGVwdGgsICIiLCBzYW1wbGVzX2NvdW50KTsKKworICBpZiAoZmxhZ3MgJiBUUl9EQVRBX09GRlNFVCkgeworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZkYXRhX29mZnNldCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgR1NUX0xPRyAoIiUqcyAgICBkYXRhLW9mZnNldDogJXUiLCBkZXB0aCwgIiIsIGRhdGFfb2Zmc2V0KTsKKyAgfQorCisgIGlmIChmbGFncyAmIFRSX0ZJUlNUX1NBTVBMRV9GTEFHUykgeworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZmaXJzdF9zYW1wbGVfZmxhZ3MpKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIEdTVF9MT0cgKCIlKnMgICAgZmlyc3Qtc2FtcGxlLWZsYWdzOiAldSIsIGRlcHRoLCAiIiwgZmlyc3Rfc2FtcGxlX2ZsYWdzKTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVzX2NvdW50OyBpKyspIHsKKyAgICBpZiAoZmxhZ3MgJiBUUl9TQU1QTEVfRFVSQVRJT04pIHsKKyAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZzYW1wbGVfZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBHU1RfVFJBQ0UgKCIlKnMgICAgc2FtcGxlLWR1cmF0aW9uOiAgJXUiLCBkZXB0aCwgIiIsIHNhbXBsZV9kdXJhdGlvbik7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgVFJfU0FNUExFX1NJWkUpIHsKKyAgICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZzYW1wbGVfc2l6ZSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIEdTVF9UUkFDRSAoIiUqcyAgICBzYW1wbGUtc2l6ZTogICV1IiwgZGVwdGgsICIiLCBzYW1wbGVfc2l6ZSk7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgVFJfU0FNUExFX0ZMQUdTKSB7CisgICAgICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmc2FtcGxlX2ZsYWdzKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgR1NUX1RSQUNFICgiJSpzICAgIHNhbXBsZS1mbGFnczogICV1IiwgZGVwdGgsICIiLCBzYW1wbGVfZmxhZ3MpOworICAgIH0KKworICAgIGlmIChmbGFncyAmIFRSX0NPTVBPU0lUSU9OX1RJTUVfT0ZGU0VUUykgeworICAgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJmNvbXBvc2l0aW9uX3RpbWVfb2Zmc2V0cykpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIEdTVF9UUkFDRSAoIiUqcyAgICBjb21wb3NpdGlvbl90aW1lX29mZnNldHM6ICAldSIsIGRlcHRoLCAiIiwKKyAgICAgICAgICBjb21wb3NpdGlvbl90aW1lX29mZnNldHMpOworICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorcXRkZW11eF9kdW1wX3RyZXggKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwgaW50IGRlcHRoKQoreworICBpZiAoIXF0X2F0b21fcGFyc2VyX2hhc19yZW1haW5pbmcgKGRhdGEsIDQgKyA0ICsgNCArIDQgKyA0ICsgNCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgR1NUX0xPRyAoIiUqcyAgdHJhY2sgSUQ6ICAgICAgJTA4eCIsIGRlcHRoLCAiIiwgR0VUX1VJTlQzMiAoZGF0YSkpOworICBHU1RfTE9HICgiJSpzICBkZWZhdWx0IHNhbXBsZSBkZXNjLiBpbmRleDogJTA4eCIsIGRlcHRoLCAiIiwKKyAgICAgIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgR1NUX0xPRyAoIiUqcyAgZGVmYXVsdCBzYW1wbGUgZHVyYXRpb246ICAgICUwOHgiLCBkZXB0aCwgIiIsCisgICAgICBHRVRfVUlOVDMyIChkYXRhKSk7CisgIEdTVF9MT0cgKCIlKnMgIGRlZmF1bHQgc2FtcGxlIHNpemU6ICAgICAgICAlMDh4IiwgZGVwdGgsICIiLAorICAgICAgR0VUX1VJTlQzMiAoZGF0YSkpOworICBHU1RfTE9HICgiJSpzICBkZWZhdWx0IHNhbXBsZSBmbGFnczogICAgICAgJTA4eCIsIGRlcHRoLCAiIiwKKyAgICAgIEdFVF9VSU5UMzIgKGRhdGEpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfZHVtcF9tZWhkIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGludCBkZXB0aCkKK3sKKyAgZ3VpbnQzMiB2ZXJzaW9uID0gMDsKKyAgZ3VpbnQ2NCBmcmFnbWVudF9kdXJhdGlvbjsKKyAgZ3VpbnQgdmFsdWVfc2l6ZTsKKworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlIChkYXRhLCAmdmVyc2lvbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcnNpb24pOworCisgIHZhbHVlX3NpemUgPSAoKHZlcnNpb24gPj4gMjQpID09IDEpID8gc2l6ZW9mIChndWludDY0KSA6IHNpemVvZiAoZ3VpbnQzMik7CisgIGlmIChxdF9hdG9tX3BhcnNlcl9nZXRfb2Zmc2V0IChkYXRhLCB2YWx1ZV9zaXplLCAmZnJhZ21lbnRfZHVyYXRpb24pKSB7CisgICAgR1NUX0xPRyAoIiUqcyAgZnJhZ21lbnQgZHVyYXRpb246ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgIGRlcHRoLCAiIiwgZnJhZ21lbnRfZHVyYXRpb24pOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitnYm9vbGVhbgorcXRkZW11eF9kdW1wX3RmZHQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwgaW50IGRlcHRoKQoreworICBndWludDMyIHZlcnNpb24gPSAwOworICBndWludDY0IGRlY29kZV90aW1lOworICBndWludCB2YWx1ZV9zaXplOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ2ZXJzaW9uKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0xPRyAoIiUqcyAgdmVyc2lvbi9mbGFnczogJTA4eCIsIGRlcHRoLCAiIiwgdmVyc2lvbik7CisKKyAgdmFsdWVfc2l6ZSA9ICgodmVyc2lvbiA+PiAyNCkgPT0gMSkgPyBzaXplb2YgKGd1aW50NjQpIDogc2l6ZW9mIChndWludDMyKTsKKyAgaWYgKHF0X2F0b21fcGFyc2VyX2dldF9vZmZzZXQgKGRhdGEsIHZhbHVlX3NpemUsICZkZWNvZGVfdGltZSkpIHsKKyAgICBHU1RfTE9HICgiJSpzICBUcmFjayBmcmFnbWVudCBkZWNvZGUgdGltZTogJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgZGVwdGgsICIiLCBkZWNvZGVfdGltZSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfc2R0cCAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MzIgdmVyc2lvbjsKKyAgZ3VpbnQ4IHZhbDsKKyAgZ3VpbnQgaSA9IDE7CisKKyAgdmVyc2lvbiA9IEdFVF9VSU5UMzIgKGRhdGEpOworICBHU1RfTE9HICgiJSpzICB2ZXJzaW9uL2ZsYWdzOiAlMDh4IiwgZGVwdGgsICIiLCB2ZXJzaW9uKTsKKworICAvKiB0aGUgc2FtcGxlX2NvdW50IGlzIHNwZWNpZmllZCBpbiB0aGUgc3RzeiBvciBzdHoyIGJveC4KKyAgICogdGhlIGluZm9ybWF0aW9uIGZvciBhIHNhbXBsZSBpcyBzdG9yZWQgaW4gYSBzaW5nbGUgYnl0ZSwKKyAgICogc28gd2UgcmVhZCB1bnRpbCB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIGJ5dGVzICovCisgIHdoaWxlIChxdF9hdG9tX3BhcnNlcl9oYXNfcmVtYWluaW5nIChkYXRhLCAxKSkgeworICAgIHZhbCA9IEdFVF9VSU5UOCAoZGF0YSk7CisgICAgR1NUX0xPRyAoIiUqcyAgICAgc2FtcGxlIG51bWJlcjogJWQiLCBkZXB0aCwgIiIsIGkpOworICAgIEdTVF9MT0cgKCIlKnMgICAgIHNhbXBsZV9kZXBlbmRzX29uOiAlZCIsIGRlcHRoLCAiIiwKKyAgICAgICAgKChndWludDE2KSAodmFsKSkgJiAweDMpOworICAgIEdTVF9MT0cgKCIlKnMgICAgIHNhbXBsZV9pc19kZXBlbmRlZF9vbjogJWQiLCBkZXB0aCwgIiIsCisgICAgICAgICgoZ3VpbnQxNikgKHZhbCA+PiAyKSkgJiAweDMpOworICAgIEdTVF9MT0cgKCIlKnMgICAgIHNhbXBsZV9oYXNfcmVkdW5kYW5jeTogJWQiLCBkZXB0aCwgIiIsCisgICAgICAgICgoZ3VpbnQxNikgKHZhbCA+PiA0KSkgJiAweDMpOworICAgIEdTVF9MT0cgKCIlKnMgICAgIGVhcmx5IGRpc3BsYXk6ICVkIiwgZGVwdGgsICIiLAorICAgICAgICAoKGd1aW50MTYpICh2YWwgPj4gNikpICYgMHgxKTsKKyAgICArK2k7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfc3ZtaSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MzIgdmVyc2lvbjsKKyAgZ3VpbnQgc3RlcmVvX21vbm9fY2hhbmdlX2NvdW50OworICBndWludCBpOworCisgIHZlcnNpb24gPSBHRVRfVUlOVDMyIChkYXRhKTsKKyAgR1NUX0xPRyAoIiUqcyAgdmVyc2lvbi9mbGFnczogJTA4eCIsIGRlcHRoLCAiIiwgdmVyc2lvbik7CisKKyAgaWYgKCF2ZXJzaW9uKSB7CisgICAgLyogc3RlcmVvc2NvcGljIHZpc3VhbCB0eXBlIGluZm9ybWF0aW9uICovCisgICAgR1NUX0xPRyAoIiUqcyAgICAgc3RlcmVvX2NvbXBvc2l0aW9uX3R5cGU6ICVkIiwgZGVwdGgsICIiLAorICAgICAgICBHRVRfVUlOVDggKGRhdGEpKTsKKyAgICBHU1RfTE9HICgiJSpzICAgICBpc19sZWZ0X2ZpcnN0OiAlZCIsIGRlcHRoLCAiIiwKKyAgICAgICAgKChndWludDgpIEdFVF9VSU5UOCAoZGF0YSkpICYgMHgwMSk7CisKKyAgICAvKiBzdGVyZW9fbW9ub19jaGFuZ2UgaW5mb3JtYXRpb24gKi8KKyAgICBzdGVyZW9fbW9ub19jaGFuZ2VfY291bnQgPSBHRVRfVUlOVDMyIChkYXRhKTsKKyAgICBHU1RfTE9HICgiJSpzICAgICBzdGVyZW9fbW9ub19jaGFuZ2VfY291bnQ6ICVkIiwgZGVwdGgsICIiLAorICAgICAgICBzdGVyZW9fbW9ub19jaGFuZ2VfY291bnQpOworICAgIGZvciAoaSA9IDE7IGkgPD0gc3RlcmVvX21vbm9fY2hhbmdlX2NvdW50OyBpKyspIHsKKyAgICAgIEdTVF9MT0cgKCIlKnMgICAgIHNhbXBsZV9jb3VudDogJWQiLCBkZXB0aCwgIiIsIEdFVF9VSU5UMzIgKGRhdGEpKTsKKyAgICAgIEdTVF9MT0cgKCIlKnMgICAgIHN0ZXJlb19mbGFnOiAlZCIsIGRlcHRoLCAiIiwKKyAgICAgICAgICAoKGd1aW50OCkgR0VUX1VJTlQ4IChkYXRhKSkgJiAweDAxKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfZGZMYSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGNvbnN0IGdjaGFyICpibG9ja190eXBlc1tdID0geworICAgICJTVFJFQU1JTkZPIiwgIlBBRERJTkciLCAiQVBQTElDQVRJT04iLCAiU0VFS1RBQkxFIiwgIlZPUkJJU19DT01NRU5UIiwKKyAgICAiQ1VFU0hFRVQiLCAiUElDVFVSRSIsICJVTktOT1dOIiwgIklOVkFMSUQiCisgIH07CisKKyAgZ3VpbnQzMiB2ZXJfZmxhZ3MsIGJsb2NrX2hlYWRlciwgYmxvY2tfc2l6ZTsKKyAgZ2ludDggYmxvY2tfdHlwZTsKKyAgZ2Jvb2xlYW4gaXNMYXN0ID0gRkFMU0U7CisKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnZlcl9mbGFncykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9MT0cgKCIlKnMgIHZlcnNpb24vZmxhZ3M6ICUwOHgiLCBkZXB0aCwgIiIsIHZlcl9mbGFncyk7CisKKyAgZG8geworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZibG9ja19oZWFkZXIpKQorICAgICAgYnJlYWs7CisKKyAgICBpc0xhc3QgPSAoYmxvY2tfaGVhZGVyID4+IDMxKSAmIDE7CisgICAgYmxvY2tfdHlwZSA9IChibG9ja19oZWFkZXIgPj4gMjQpICYgMHg3RjsKKyAgICBibG9ja19zaXplID0gYmxvY2tfaGVhZGVyICYgMHhGRkZGRkY7CisKKyAgICBpZiAoYmxvY2tfdHlwZSA9PSAxMjcpCisgICAgICBibG9ja190eXBlID0gODsKKyAgICBlbHNlIGlmIChibG9ja190eXBlID4gNikKKyAgICAgIGJsb2NrX3R5cGUgPSA3OworCisgICAgR1NUX0xPRyAoIiUqcyAgYmxvY2tfdHlwZTogICAgICAlcyIsIGRlcHRoLCAiIiwgYmxvY2tfdHlwZXNbYmxvY2tfdHlwZV0pOworICAgIEdTVF9MT0cgKCIlKnMgIGxhc3QtYmxvY2stZmxhZzogJXMiLCBkZXB0aCwgIiIsIGlzTGFzdCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgIEdTVF9MT0cgKCIlKnMgIGxlbmd0aDogICAgICAgICAgJWQiLCBkZXB0aCwgIiIsIGJsb2NrX3NpemUpOworCisgICAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoZGF0YSwgYmxvY2tfc2l6ZSkpCisgICAgICBicmVhazsKKyAgfSB3aGlsZSAoIWlzTGFzdCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitxdGRlbXV4X2R1bXBfZkxhQyAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLCBpbnQgZGVwdGgpCit7CisgIGd1aW50MTYgZGF0YV9yZWZfaWQsIG5fY2hhbm5lbHMsIHNhbXBsZV9zaXplOworICBndWludDMyIHNhbXBsZV9yYXRlOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKGRhdGEsIDYpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmUgKGRhdGEsICZkYXRhX3JlZl9pZCkgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoZGF0YSwgOCkgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9iZSAoZGF0YSwgJm5fY2hhbm5lbHMpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmUgKGRhdGEsICZzYW1wbGVfc2l6ZSkgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoZGF0YSwgNCkgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQzMl9iZSAoZGF0YSwgJnNhbXBsZV9yYXRlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0xPRyAoIiUqcyAgZGF0YSByZWZlcmVuY2U6ICVkIiwgZGVwdGgsICIiLCBkYXRhX3JlZl9pZCk7CisgIEdTVF9MT0cgKCIlKnMgIGNoYW5uZWwgY291bnQ6ICAlZCIsIGRlcHRoLCAiIiwgbl9jaGFubmVscyk7CisgIEdTVF9MT0cgKCIlKnMgIHNhbXBsZSBzaXplOiAgICAlZCIsIGRlcHRoLCAiIiwgc2FtcGxlX3NpemUpOworICBHU1RfTE9HICgiJSpzICBzYW1wbGUgcmF0ZTogICAgJWQiLCBkZXB0aCwgIiIsIChzYW1wbGVfcmF0ZSA+PiAxNikpOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorcXRkZW11eF9kdW1wX2dtaW4gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwgaW50IGRlcHRoKQoreworICBndWludDMyIHZlcl9mbGFnczsKKyAgZ3VpbnQxNiBncmFwaGljc19tb2RlLCBvcGNfciwgb3BjX2csIG9wY19iLCBiYWxhbmNlOworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MzJfYmUgKGRhdGEsICZ2ZXJfZmxhZ3MpKQorICAgIHJldHVybiBGQUxTRTsKKworICBHU1RfTE9HICgiJSpzICB2ZXJzaW9uL2ZsYWdzIDogJTA4eCIsIGRlcHRoLCAiIiwgdmVyX2ZsYWdzKTsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9iZSAoZGF0YSwgJmdyYXBoaWNzX21vZGUpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmUgKGRhdGEsICZvcGNfcikgfHwKKyAgICAgICFnc3RfYnl0ZV9yZWFkZXJfZ2V0X3VpbnQxNl9iZSAoZGF0YSwgJm9wY19nKSB8fAorICAgICAgIWdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDE2X2JlIChkYXRhLCAmb3BjX2IpIHx8CisgICAgICAhZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50MTZfYmUgKGRhdGEsICZiYWxhbmNlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgR1NUX0xPRyAoIiUqcyAgZ3JhcGhpY3MgbW9kZSA6IDB4JXgiLCBkZXB0aCwgIiIsIGdyYXBoaWNzX21vZGUpOworICBHU1RfTE9HICgiJSpzICBvcGNvbG9yIDogICAgICAgcjoweCV4IGc6MHgleCBiOjB4JXgiLCBkZXB0aCwgIiIsIG9wY19yLCBvcGNfZywKKyAgICAgIG9wY19iKTsKKyAgR1NUX0xPRyAoIiUqcyAgYmFsYW5jZSA6ICAgICAgICVkIiwgZGVwdGgsICIiLCBiYWxhbmNlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfZHVtcF91bmtub3duIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsIGludCBkZXB0aCkKK3sKKyAgaW50IGxlbjsKKworICBsZW4gPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoZGF0YSk7CisgIEdTVF9MT0cgKCIlKnMgIGxlbmd0aDogJWQiLCBkZXB0aCwgIiIsIGxlbik7CisKKyAgR1NUX01FTURVTVBfT0JKRUNUIChxdGRlbXV4LCAidW5rbm93biBhdG9tIGRhdGEiLAorICAgICAgZ3N0X2J5dGVfcmVhZGVyX3BlZWtfZGF0YV91bmNoZWNrZWQgKGRhdGEpLCBsZW4pOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitxdGRlbXV4X25vZGVfZHVtcF9mb3JlYWNoIChHTm9kZSAqIG5vZGUsIGdwb2ludGVyIHF0ZGVtdXgpCit7CisgIEdzdEJ5dGVSZWFkZXIgcGFyc2VyOworICBndWludDggKmJ1ZmZlciA9IChndWludDggKikgbm9kZS0+ZGF0YTsgICAgICAgLyogRklYTUU6IG1vdmUgdG8gYnl0ZSByZWFkZXIgKi8KKyAgZ3VpbnQzMiBub2RlX2xlbmd0aDsKKyAgZ3VpbnQzMiBmb3VyY2M7CisgIGNvbnN0IFF0Tm9kZVR5cGUgKnR5cGU7CisgIGludCBkZXB0aDsKKworICBub2RlX2xlbmd0aCA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoYnVmZmVyKTsKKyAgZm91cmNjID0gR1NUX1JFQURfVUlOVDMyX0xFIChidWZmZXIgKyA0KTsKKworICBnX3dhcm5faWZfZmFpbCAobm9kZV9sZW5ndGggPj0gOCk7CisKKyAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZwYXJzZXIsIGJ1ZmZlciArIDgsIG5vZGVfbGVuZ3RoIC0gOCk7CisKKyAgdHlwZSA9IHF0ZGVtdXhfdHlwZV9nZXQgKGZvdXJjYyk7CisKKyAgZGVwdGggPSAoZ19ub2RlX2RlcHRoIChub2RlKSAtIDEpICogMjsKKyAgR1NUX0xPRyAoIiUqcyclIiBHU1RfRk9VUkNDX0ZPUk1BVCAiJywgWyVkXSwgJXMiLAorICAgICAgZGVwdGgsICIiLCBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYyksIG5vZGVfbGVuZ3RoLCB0eXBlLT5uYW1lKTsKKworICBpZiAodHlwZS0+ZHVtcCkgeworICAgIGdib29sZWFuIHJldDsKKworICAgIHJldCA9IHR5cGUtPmR1bXAgKEdTVF9RVERFTVVYX0NBU1QgKHF0ZGVtdXgpLCAmcGFyc2VyLCBkZXB0aCk7CisKKyAgICBpZiAoIXJldCkgeworICAgICAgR1NUX1dBUk5JTkcgKCIlKnMgIG5vdCBlbm91Z2ggZGF0YSBwYXJzaW5nIGF0b20gJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgZGVwdGgsICIiLCBHU1RfRk9VUkNDX0FSR1MgKGZvdXJjYykpOworICAgIH0KKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworZ2Jvb2xlYW4KK3F0ZGVtdXhfbm9kZV9kdW1wIChHc3RRVERlbXV4ICogcXRkZW11eCwgR05vZGUgKiBub2RlKQoreworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgLyogT25seSB0cmF2ZXJzZS9kdW1wIGlmIHdlIGtub3cgaXQgd2lsbCBiZSBvdXRwdXR0ZWQgaW4gdGhlIGVuZCAqLworICBpZiAocXRkZW11eF9kZWJ1Zy0+dGhyZXNob2xkIDwgR1NUX0xFVkVMX0xPRykKKyAgICByZXR1cm4gVFJVRTsKKworICBnX25vZGVfdHJhdmVyc2UgKG5vZGUsIEdfUFJFX09SREVSLCBHX1RSQVZFUlNFX0FMTCwgLTEsCisgICAgICBxdGRlbXV4X25vZGVfZHVtcF9mb3JlYWNoLCBxdGRlbXV4KTsKKyNlbmRpZgorICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvcXRkZW11eF9kdW1wLmggYi9nc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZGNkM2YKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L3F0ZGVtdXhfZHVtcC5oCkBAIC0wLDAgKzEsOTggQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFNURXJpY3Nzb24gPGJlbmphbWluLmdhaWduYXJkQHN0ZXJpY3Nzb24uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUVRERU1VWF9EVU1QX0hfXworI2RlZmluZSBfX0dTVF9RVERFTVVYX0RVTVBfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8cXRkZW11eC5oPgorCitHX0JFR0lOX0RFQ0xTCisgICAgZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX212aGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3RraGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX2Vsc3QgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX21kaGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX2hkbHIgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3ZtaGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX2RyZWYgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3N0c2QgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3N0dHMgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3N0c3MgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3N0cHMgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3N0c2MgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3N0c3ogKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3N0Y28gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX2NvNjQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX2Rjb20gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX2NtdmQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX2N0dHMgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX2NzbGcgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX21mcm8gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX21maGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3RmcmEgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3RmaGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3RydW4gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3RyZXggKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX21laGQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3NkdHAgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3RmZHQgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3Vua25vd24gKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHc3RCeXRlUmVhZGVyICogZGF0YSwKKyAgICBpbnQgZGVwdGgpOworZ2Jvb2xlYW4gcXRkZW11eF9kdW1wX3N2bWkgKEdzdFFURGVtdXggKnF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKmRhdGEsCisgICAgaW50IGRlcHRoKTsKK2dib29sZWFuIHF0ZGVtdXhfZHVtcF9kZkxhIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsCisgICAgaW50IGRlcHRoKTsKK2dib29sZWFuIHF0ZGVtdXhfZHVtcF9mTGFDIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsCisgICAgaW50IGRlcHRoKTsKK2dib29sZWFuIHF0ZGVtdXhfZHVtcF9nbWluIChHc3RRVERlbXV4ICogcXRkZW11eCwgR3N0Qnl0ZVJlYWRlciAqIGRhdGEsCisgICAgaW50IGRlcHRoKTsKKworZ2Jvb2xlYW4gcXRkZW11eF9ub2RlX2R1bXAgKEdzdFFURGVtdXggKiBxdGRlbXV4LCBHTm9kZSAqIG5vZGUpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1FUREVNVVhfRFVNUF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvcXRkZW11eF9sYW5nLmMgYi9nc3QvaXNvbXA0L3F0ZGVtdXhfbGFuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NjQ2YjIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L3F0ZGVtdXhfbGFuZy5jCkBAIC0wLDAgKzEsMjA3IEBACisvKiBHU3RyZWFtZXIgUXVpY2t0aW1lL0lTTyBkZW11eGVyIGxhbmd1YWdlIHV0aWxpdHkgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAicXRkZW11eF9kZWJ1Zy5oIgorI2luY2x1ZGUgInF0ZGVtdXhfbGFuZy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHF0ZGVtdXhfZGVidWcKKworLyogaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vbWFjL2xpYnJhcnkvZG9jdW1lbnRhdGlvbi9RdWlja1RpbWUvUVRGRi9RVEZGQ2hhcDQvcXRmZjQuaHRtbCAqLworCitzdGF0aWMgY29uc3QgZ2NoYXIgcXRfbGFuZ19tYXBbXVs0XSA9IHsKKworLyogMDAwIEVuZ2xpc2gKKyAqIDAwMSBGcmVuY2gKKyAqIDAwMiBHZXJtYW4KKyAqIDAwMyBJdGFsaWFuCisgKiAwMDQgRHV0Y2gKKyAqIDAwNSBTd2VkaXNoCisgKiAwMDYgU3BhbmlzaAorICogMDA3IERhbmlzaAorICogMDA4IFBvcnR1Z3Vlc2UKKyAqIDAwOSBOb3J3ZWdpYW4KKyAqLworICAiZW5nIiwgImZyZSIsICJkZXUiLCAiaXRhIiwgIm5sZCIsICJzd2UiLCAic3BhIiwgImRhbiIsICJwb3IiLCAibm9yIiwKKworLyogMDEwIEhlYnJldworICogMDExIEphcGFuZXNlCisgKiAwMTIgQXJhYmljCisgKiAwMTMgRmlubmlzaAorICogMDE0IEdyZWVrCisgKiAwMTUgSWNlbGFuZGljCisgKiAwMTYgTWFsdGVzZQorICogMDE3IFR1cmtpc2gKKyAqIDAxOCBDcm9hdGlhbgorICogMDE5IFRyYWRpdGlvbmFsIENoaW5lc2UgKElTTyA2MzktMiBjYW4ndCBleHByZXNzIHNjcmlwdCBkaWZmZXJlbmNlcywgc28gemhvKQorICovCisgICJoZWIiLCAianBuIiwgImFyYSIsICJmaW4iLCAiZWxsIiwgImlzbCIsICJtbHQiLCAidHVyIiwgImhydiIsICJ6aG8iLAorCisvKiAwMjAgVXJkdQorICogMDIxIEhpbmRpCisgKiAwMjIgVGhhaQorICogMDIzIEtvcmVhbgorICogMDI0IExpdGh1YW5pYW4KKyAqIDAyNSBQb2xpc2gKKyAqIDAyNiBIdW5nYXJpYW4KKyAqIDAyNyBFc3RvbmlhbgorICogMDI4IExhdHZpYW4gLyBMZXR0aXNoCisgKiAwMjkgTGFwcGlzaCAvIFNhYW1pc2ggKHVzZWQgY29kZSBmb3IgTm90aGVybiBTYW1pKQorICovCisgICJ1cmQiLCAiaGluIiwgInRoYSIsICJrb3IiLCAibGl0IiwgInBvbCIsICJodW4iLCAiZXN0IiwgImxhdiIsICJzbWUiLAorCisvKiAwMzAgRmFlcm9lc2UKKyAqIDAzMSBGYXJzaQorICogMDMyIFJ1c3NpYW4KKyAqIDAzMyBTaW1wbGlmaWVkIENoaW5lc2UgKElTTyA2MzktMiBjYW4ndCBleHByZXNzIHNjcmlwdCBkaWZmZXJlbmNlcywgc28gemhvKQorICogMDM0IEZsZW1pc2ggKG5vIElTTyA2MzktMiBjb2RlLCB1c2VkIER1dGNoIGNvZGUpCisgKiAwMzUgSXJpc2gKKyAqIDAzNiBBbGJhbmlhbgorICogMDM3IFJvbWFuaWFuCisgKiAwMzggQ3plY2gKKyAqIDAzOSBTbG92YWsKKyAqLworICAiZmFvIiwgImZhcyIsICJydXMiLCAiemhvIiwgIm5sZCIsICJnbGUiLCAic3FpIiwgInJvbiIsICJjZXMiLCAic2xrIiwKKworLyogMDQwIFNsb3ZlbmlhbgorICogMDQxIFlpZGRpc2gKKyAqIDA0MiBTZXJiaWFuCisgKiAwNDMgTWFjZWRvbmlhbgorICogMDQ0IEJ1bGdhcmlhbgorICogMDQ1IFVrcmFpbmlhbgorICogMDQ2IEJ5ZWxvcnVzc2lhbgorICogMDQ3IFV6YmVrCisgKiAwNDggS2F6YWtoCisgKiAwNDkgQXplcmJhaWphbmkKKyAqLworICAic2x2IiwgInlpZCIsICJzcnAiLCAibWtkIiwgImJ1bCIsICJ1a3IiLCAiYmVsIiwgInV6YiIsICJrYXoiLCAiYXplIiwKKworLyogMDUwIEF6ZXJiYWlqYW5BciAocHJlc3VtYWJseSBzY3JpcHQgZGlmZmVyZW5jZT8gdXNlZCBhemUgaGVyZSkKKyAqIDA1MSBBcm1lbmlhbgorICogMDUyIEdlb3JnaWFuCisgKiAwNTMgTW9sZGF2aWFuCisgKiAwNTQgS2lyZ2hpegorICogMDU1IFRhamlraQorICogMDU2IFR1cmttZW4KKyAqIDA1NyBNb25nb2xpYW4KKyAqIDA1OCBNb25nb2xpYW5DeXIgKHByZXN1bWFibHkgc2NyaXB0IGRpZmZlcmVuY2U/IHVzZWQgbW9uIGhlcmUpCisgKiAwNTkgUGFzaHRvCisgKi8KKworICAiYXplIiwgImh5ZSIsICJrYXQiLCAibW9sIiwgImtpciIsICJ0Z2siLCAidHVrIiwgIm1vbiIsICJtb24iLCAicHVzIiwKKworCisvKiAwNjAgS3VyZGlzaAorICogMDYxIEthc2htaXJpCisgKiAwNjIgU2luZGhpCisgKiAwNjMgVGliZXRhbgorICogMDY0IE5lcGFsaQorICogMDY1IFNhbnNrcml0CisgKiAwNjYgTWFyYXRoaQorICogMDY3IEJlbmdhbGkKKyAqIDA2OCBBc3NhbWVzZQorICogMDY5IEd1amFyYXRpCisgKi8KKyAgImt1ciIsICJrYXMiLCAic25kIiwgImJvZCIsICJuZXAiLCAic2FuIiwgIm1hciIsICJiZW4iLCAiYXNtIiwgImd1aiIsCisKKy8qIDA3MCBQdW5qYWJpCisgKiAwNzEgT3JpeWEKKyAqIDA3MiBNYWxheWFsYW0KKyAqIDA3MyBLYW5uYWRhCisgKiAwNzQgVGFtaWwKKyAqIDA3NSBUZWx1Z3UKKyAqIDA3NiBTaW5oYWxlc2UKKyAqIDA3NyBCdXJtZXNlCisgKiAwNzggS2htZXIKKyAqIDA3OSBMYW8KKyAqLworICAicGFuIiwgIm9yaSIsICJtYWwiLCAia2FuIiwgInRhbSIsICJ0ZWwiLCAic2luIiwgIm15YSIsICJraG0iLCAibGFvIiwKKworLyogMDgwIFZpZXRuYW1lc2UKKyAqIDA4MSBJbmRvbmVzaWFuCisgKiAwODIgVGFnYWxvZworICogMDgzIE1hbGF5Um9tYW4KKyAqIDA4NCBNYWxheUFyYWJpYworICogMDg1IEFtaGFyaWMKKyAqIDA4NyBHYWxsYSAoc2FtZSBhcyBPcm9tbz8pCisgKiAwODcgT3JvbW8KKyAqIDA4OCBTb21hbGkKKyAqIDA4OSBTd2FoaWxpCisgKi8KKyAgInZpZSIsICJpbmQiLCAidGdsIiwgIm1zYSIsICJtc2EiLCAiYW1oIiwgIm9ybSIsICJvcm0iLCAic29tIiwgInN3YSIsCisKKy8qIDA5MCBSdWFuZGEKKyAqIDA5MSBSdW5kaQorICogMDkyIENoZXdhCisgKiAwOTMgTWFsYWdhc3kKKyAqIDA5NCBFc3BlcmFudG8KKyAqIDA5NSAtLS0KKyAqIDA5NiAtLS0KKyAqIDA5NyAtLS0KKyAqIDA5OCAtLS0KKyAqIDA5OSAtLS0KKyAqLworICAia2luIiwgInJ1biIsICJueWEiLCAibWxnIiwgImVwIiwgInVuZCIsICJ1bmQiLCAidW5kIiwgInVuZCIsICJ1bmQiLAorCisvKiAxMDAtMTA5IC0tLQorICogMTEwLTExOSAtLS0KKyAqLworICAidW5kIiwgInVuZCIsICJ1bmQiLCAidW5kIiwgInVuZCIsICJ1bmQiLCAidW5kIiwgInVuZCIsICJ1bmQiLCAidW5kIiwKKyAgInVuZCIsICJ1bmQiLCAidW5kIiwgInVuZCIsICJ1bmQiLCAidW5kIiwgInVuZCIsICJ1bmQiLCAidW5kIiwgInVuZCIsCisKKy8qIDEyMC0xMjcgLS0tCisgKiAxMjggV2Vsc2gKKyAqIDEyOSBCYXNxdWUKKyAqLworICAidW5kIiwgInVuZCIsICJ1bmQiLCAidW5kIiwgInVuZCIsICJ1bmQiLCAidW5kIiwgInVuZCIsICJjeW0iLCAiZXVzIiwKKworLyogMTMwIENhdGFsYW4KKyAqIDEzMSBMYXRpbgorICogMTMyIFF1ZWNodWEKKyAqIDEzMyBHdWFyYW5pCisgKiAxMzQgQXltYXJhCisgKiAxMzUgVGF0YXIKKyAqIDEzNiBVaWdodXIKKyAqIDEzNyBEem9uZ2toYQorICogMTM4IEphdmFuZXNlUm9tCisgKi8KKyAgImNhdCIsICJsYXQiLCAicXVlIiwgImdybiIsICJheW0iLCAidGF0IiwgInVpZyIsICJkem8iLCAiamF2IgorfTsKKworLyogbWFwIHF1aWNrdGltZSBsYW5ndWFnZSBjb2RlIHRvIElTTy02MzktMlQgaWQsIHJldHVybnMgInVuZCIgaWYgdW5rbm93biAqLwordm9pZAorcXRkZW11eF9sYW5nX21hcF9xdF9jb2RlX3RvX2lzbyAoZ2NoYXIgaWRbNF0sIGd1aW50MTYgcXRfbGFuZ19jb2RlKQoreworICBjb25zdCBnY2hhciAqaXNvX2NvZGU7CisKKyAgZ19hc3NlcnQgKHF0X2xhbmdfY29kZSA8IDB4NDAwKTsKKworICBpZiAocXRfbGFuZ19jb2RlIDwgR19OX0VMRU1FTlRTIChxdF9sYW5nX21hcCkpCisgICAgaXNvX2NvZGUgPSBxdF9sYW5nX21hcFtxdF9sYW5nX2NvZGVdOworICBlbHNlCisgICAgaXNvX2NvZGUgPSAidW5kIjsKKworICBHU1RfREVCVUcgKCJtYXBwZWQgcXVpY2t0aW1lIGxhbmd1YWdlIGNvZGUgJXUgdG8gSVNPIDYzOS0yVCBjb2RlICclcyciLAorICAgICAgcXRfbGFuZ19jb2RlLCBpc29fY29kZSk7CisKKyAgbWVtY3B5IChpZCwgaXNvX2NvZGUsIDQpOworCisgIGdfYXNzZXJ0IChpZFszXSA9PSAnXDAnKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvcXRkZW11eF9sYW5nLmggYi9nc3QvaXNvbXA0L3F0ZGVtdXhfbGFuZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwN2M1ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L3F0ZGVtdXhfbGFuZy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qIEdTdHJlYW1lciBRdWlja3RpbWUvSVNPIGRlbXV4ZXIgbGFuZ3VhZ2UgdXRpbGl0eSBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUVRERU1VWF9MQU5HX0hfXworI2RlZmluZSBfX0dTVF9RVERFTVVYX0xBTkdfSF9fCisKK0dfQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPGdsaWIuaD4KKwordm9pZCBxdGRlbXV4X2xhbmdfbWFwX3F0X2NvZGVfdG9faXNvIChnY2hhciBpZFs0XSwgZ3VpbnQxNiBxdF9sYW5nX2NvZGUpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUVRERU1VWF9MQU5HX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmMgYi9nc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGRiOGMyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2lzb21wNC9xdGRlbXV4X3R5cGVzLmMKQEAgLTAsMCArMSwyMzYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAicXRkZW11eF9kZWJ1Zy5oIgorI2luY2x1ZGUgInF0ZGVtdXhfdHlwZXMuaCIKKyNpbmNsdWRlICJxdGRlbXV4X2R1bXAuaCIKKyNpbmNsdWRlICJmb3VyY2MuaCIKKworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgcXRkZW11eF9kZWJ1ZworCitzdGF0aWMgY29uc3QgUXROb2RlVHlwZSBxdF9ub2RlX3R5cGVzW10gPSB7CisgIHtGT1VSQ0NfbW9vdiwgIm1vdmllIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19tdmhkLCAibW92aWUgaGVhZGVyIiwgMCwKKyAgICAgIHF0ZGVtdXhfZHVtcF9tdmhkfSwKKyAge0ZPVVJDQ19jbGlwLCAiY2xpcHBpbmciLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX3RyYWssICJ0cmFjayIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfdWR0YSwgInVzZXIgZGF0YSIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sICAgICAgIC8qIHNwZWNpYWwgY29udGFpbmVyICovCisgIHtGT1VSQ0NfY3RhYiwgImNvbG9yIHRhYmxlIiwgMCx9LAorICB7Rk9VUkNDX3RraGQsICJ0cmFjayBoZWFkZXIiLCAwLAorICAgICAgcXRkZW11eF9kdW1wX3RraGR9LAorICB7Rk9VUkNDX2NyZ24sICJjbGlwcGluZyByZWdpb24iLCAwLH0sCisgIHtGT1VSQ0NfbWF0dCwgInRyYWNrIG1hdHRlIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19rbWF0LCAiY29tcHJlc3NlZCBtYXR0ZSIsIDAsfSwKKyAge0ZPVVJDQ19lZHRzLCAiZWRpdCIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfZWxzdCwgImVkaXQgbGlzdCIsIDAsCisgICAgICBxdGRlbXV4X2R1bXBfZWxzdH0sCisgIHtGT1VSQ0NfbG9hZCwgInRyYWNrIGxvYWQgc2V0dGluZ3MiLCAwLH0sCisgIHtGT1VSQ0NfdHJlZiwgInRyYWNrIHJlZmVyZW5jZSIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfaW1hcCwgInRyYWNrIGlucHV0IG1hcCIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfX19pbiwgInRyYWNrIGlucHV0IiwgMCx9LCAgICAgLyogc3BlY2lhbCBjb250YWluZXIgKi8KKyAge0ZPVVJDQ19fX3R5LCAiaW5wdXQgdHlwZSIsIDAsfSwKKyAge0ZPVVJDQ19tZGlhLCAibWVkaWEiLCBRVF9GTEFHX0NPTlRBSU5FUn0sCisgIHtGT1VSQ0NfbWRoZCwgIm1lZGlhIGhlYWRlciIsIDAsCisgICAgICBxdGRlbXV4X2R1bXBfbWRoZH0sCisgIHtGT1VSQ0NfaGRsciwgImhhbmRsZXIgcmVmZXJlbmNlIiwgMCwKKyAgICAgIHF0ZGVtdXhfZHVtcF9oZGxyfSwKKyAge0ZPVVJDQ19taW5mLCAibWVkaWEgaW5mb3JtYXRpb24iLCBRVF9GTEFHX0NPTlRBSU5FUn0sCisgIHtGT1VSQ0Nfdm1oZCwgInZpZGVvIG1lZGlhIGluZm9ybWF0aW9uIiwgMCwKKyAgICAgIHF0ZGVtdXhfZHVtcF92bWhkfSwKKyAge0ZPVVJDQ19zbWhkLCAic291bmQgbWVkaWEgaW5mb3JtYXRpb24iLCAwfSwKKyAge0ZPVVJDQ19nbWhkLCAiYmFzZSBtZWRpYSBpbmZvcm1hdGlvbiBoZWFkZXIiLCBRVF9GTEFHX0NPTlRBSU5FUn0sCisgIHtGT1VSQ0NfZ21pbiwgImJhc2UgbWVkaWEgaW5mbyIsIDAsIHF0ZGVtdXhfZHVtcF9nbWlufSwKKyAge0ZPVVJDQ19kaW5mLCAiZGF0YSBpbmZvcm1hdGlvbiIsIFFUX0ZMQUdfQ09OVEFJTkVSfSwKKyAge0ZPVVJDQ19kcmVmLCAiZGF0YSByZWZlcmVuY2UiLCAwLAorICAgICAgcXRkZW11eF9kdW1wX2RyZWZ9LAorICB7Rk9VUkNDX3N0YmwsICJzYW1wbGUgdGFibGUiLCBRVF9GTEFHX0NPTlRBSU5FUn0sCisgIHtGT1VSQ0Nfc3RzZCwgInNhbXBsZSBkZXNjcmlwdGlvbiIsIDAsCisgICAgICBxdGRlbXV4X2R1bXBfc3RzZH0sCisgIHtGT1VSQ0Nfc3R0cywgInRpbWUtdG8tc2FtcGxlIiwgMCwKKyAgICAgIHF0ZGVtdXhfZHVtcF9zdHRzfSwKKyAge0ZPVVJDQ19zdHBzLCAicGFydGlhbCBzeW5jIHNhbXBsZSIsIDAsCisgICAgICBxdGRlbXV4X2R1bXBfc3Rwc30sCisgIHtGT1VSQ0Nfc3RzcywgInN5bmMgc2FtcGxlIiwgMCwKKyAgICAgIHF0ZGVtdXhfZHVtcF9zdHNzfSwKKyAge0ZPVVJDQ19zdHNjLCAic2FtcGxlLXRvLWNodW5rIiwgMCwKKyAgICAgIHF0ZGVtdXhfZHVtcF9zdHNjfSwKKyAge0ZPVVJDQ19zdHN6LCAic2FtcGxlIHNpemUiLCAwLAorICAgICAgcXRkZW11eF9kdW1wX3N0c3p9LAorICB7Rk9VUkNDX3N0Y28sICJjaHVuayBvZmZzZXQiLCAwLAorICAgICAgcXRkZW11eF9kdW1wX3N0Y299LAorICB7Rk9VUkNDX2NvNjQsICI2NC1iaXQgY2h1bmsgb2Zmc2V0IiwgMCwKKyAgICAgIHF0ZGVtdXhfZHVtcF9jbzY0fSwKKyAge0ZPVVJDQ192aWRlLCAidmlkZW8gbWVkaWEiLCAwfSwKKyAge0ZPVVJDQ19jbW92LCAiY29tcHJlc3NlZCBtb3ZpZSIsIFFUX0ZMQUdfQ09OVEFJTkVSfSwKKyAge0ZPVVJDQ19kY29tLCAiY29tcHJlc3NlZCBkYXRhIiwgMCwgcXRkZW11eF9kdW1wX2Rjb219LAorICB7Rk9VUkNDX2NtdmQsICJjb21wcmVzc2VkIG1vdmllIGRhdGEiLCAwLCBxdGRlbXV4X2R1bXBfY212ZH0sCisgIHtGT1VSQ0NfaGludCwgImhpbnQiLCAwLH0sCisgIHtGT1VSQ0NfbXA0YSwgIm1wNGEiLCAwLH0sCisgIHtGT1VSQ0NfbXA0diwgIm1wNHYiLCAwLH0sCisgIHtGT1VSQ0NfbWpwMiwgIm1qcDIiLCAwLH0sCisgIHtGT1VSQ0NfbWhkciwgIm1oZHIiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX2pwMmgsICJqcDJoIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19jb2xyLCAiY29sciIsIDAsfSwKKyAge0ZPVVJDQ19jbGFwLCAiY2xhcCIsIDAsfSwKKyAge0ZPVVJDQ190YXB0LCAidGFwdCIsIDAsfSwKKyAge0ZPVVJDQ19paGRyLCAiaWhkciIsIDAsfSwKKyAge0ZPVVJDQ19maWVsLCAiZmllbCIsIDAsfSwKKyAge0ZPVVJDQ19qcDJ4LCAianAyeCIsIDAsfSwKKyAge0ZPVVJDQ19hbGFjLCAiYWxhYyIsIDAsfSwKKyAge0ZPVVJDQ19mTGFDLCAiZkxhQyIsIDAsIHF0ZGVtdXhfZHVtcF9mTGFDfSwKKyAge0ZPVVJDQ19kZkxhLCAiZGZMYSIsIDAsIHF0ZGVtdXhfZHVtcF9kZkxhfSwKKyAge0ZPVVJDQ193YXZlLCAid2F2ZSIsIFFUX0ZMQUdfQ09OVEFJTkVSfSwKKyAge0ZPVVJDQ19hcHBsLCAiYXBwbCIsIFFUX0ZMQUdfQ09OVEFJTkVSfSwKKyAge0ZPVVJDQ19jZmhkLCAiY2ZoZCIsIFFUX0ZMQUdfQ09OVEFJTkVSfSwKKyAge0ZPVVJDQ19lc2RzLCAiZXNkcyIsIDB9LAorICB7Rk9VUkNDX2hudGksICJobnRpIiwgUVRfRkxBR19DT05UQUlORVJ9LAorICB7Rk9VUkNDX3J0cF8sICJydHAgIiwgMCwgcXRkZW11eF9kdW1wX3Vua25vd259LAorICB7Rk9VUkNDX3NkcF8sICJzZHAgIiwgMCwgcXRkZW11eF9kdW1wX3Vua25vd259LAorICB7Rk9VUkNDX21ldGEsICJtZXRhIiwgMCwgcXRkZW11eF9kdW1wX3Vua25vd259LAorICB7Rk9VUkNDX2lsc3QsICJpbHN0IiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19fbmFtLCAiTmFtZSIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfdGl0bCwgIlRpdGxlIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19fQVJULCAiQXJ0aXN0IiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19hQVJULCAiQWxidW0gQXJ0aXN0IiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19hdXRoLCAiQXV0aG9yIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19wZXJmLCAiUGVyZm9ybWVyIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19fd3J0LCAiV3JpdGVyIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19fZ3JwLCAiR3JvdXBpbmciLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX19hbGIsICJBbGJ1bSIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfYWxibSwgIkFsYnVtIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19fZGF5LCAiRGF0ZSIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfX2NweSwgIkNvcHlyaWdodCIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfX2NtdCwgIkNvbW1lbnQiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX19kZXMsICJEZXNjcmlwdGlvbiIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfZGVzYywgIkRlc2NyaXB0aW9uIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19kc2NwLCAiRGVzY3JpcHRpb24iLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX19seXIsICJMeXJpY3MiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX19yZXEsICJSZXF1aXJlbWVudCIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfX2VuYywgIkVuY29kZXIiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX2ducmUsICJHZW5yZSIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfdHJrbiwgIlRyYWNrIE51bWJlciIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfZGlzYywgIkRpc2MgTnVtYmVyIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19kaXNrLCAiRGlzYyBOdW1iZXIiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX2NwcnQsICJDb3B5cmlnaHQiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX2NwaWwsICJDb21waWxhdGlvbiIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfcGdhcCwgIkdhcGxlc3MiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX3Bjc3QsICJQb2RjYXN0IiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ190bXBvLCAiVGVtcG8iLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX2NvdnIsICJDb3ZlciIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0Nfc29ubSwgIlNvcnQgVGl0bGUiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX3NvYWwsICJTb3J0IEFsYnVtIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19zb2FyLCAiU29ydCBBcnRpc3QiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX3NvYWEsICJTb3J0IEFsYnVtIEFydGlzdCIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0Nfc29jbywgIlNvcnQgQ29tcG9zZXIiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX3Nvc24sICJTb3J0IFRWIFNob3ciLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX3R2c2gsICJUViBTaG93IiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ190dmVuLCAiVFYgRXBpc29kZSBJRCIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfdHZzbiwgIlRWIFNlYXNvbiBOdW1iZXIiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX3R2ZXMsICJUViBFcGlzb2RlIE51bWJlciIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0Nfa2V5dywgIktleXdvcmRzIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19reXdkLCAiS2V5d29yZHMiLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX190b28sICJFbmNvZGVyIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19fc3dyLCAiQXBwbGljYXRpb24gTmFtZSIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfX19fXywgIi0tLS0iLCBRVF9GTEFHX0NPTlRBSU5FUix9LAorICB7Rk9VUkNDX2RhdGEsICJkYXRhIiwgMCwgcXRkZW11eF9kdW1wX3Vua25vd259LAorICB7Rk9VUkNDX2ZyZWUsICJmcmVlIiwgMCx9LAorICB7Rk9VUkNDX3NraXAsICJza2lwIiwgMCx9LAorICB7Rk9VUkNDX1NWUTMsICJTVlEzIiwgMCx9LAorICB7Rk9VUkNDX3JtcmEsICJybXJhIiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19ybWRhLCAicm1kYSIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfcmRyZiwgInJkcmYiLCAwLH0sCisgIHtGT1VSQ0NfX2dlbiwgIkN1c3RvbSBHZW5yZSIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfY3R0cywgIkNvbXBvc2l0aW9uIHRpbWUgdG8gc2FtcGxlIiwgMCwgcXRkZW11eF9kdW1wX2N0dHN9LAorICB7Rk9VUkNDX2NzbGcsICJDb21wb3NpdGlvbiBTaGlmdCBMZWFzdCBHcmVhdGVzdCIsIDAsIHF0ZGVtdXhfZHVtcF9jc2xnfSwKKyAge0ZPVVJDQ19YaVRoLCAiWGlUaCIsIDB9LAorICB7Rk9VUkNDX1hkeFQsICJYZHhUIiwgMH0sCisgIHtGT1VSQ0NfbG9jaSwgImxvY2kiLCAwfSwKKyAge0ZPVVJDQ19jbHNmLCAiY2xzZiIsIDB9LAorICB7Rk9VUkNDX21mcmEsICJtb3ZpZSBmcmFnbWVudCByYW5kb20gYWNjZXNzIiwKKyAgICAgIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfdGZyYSwgInRyYWNrIGZyYWdtZW50IHJhbmRvbSBhY2Nlc3MiLCAwLAorICAgICAgcXRkZW11eF9kdW1wX3RmcmF9LAorICB7Rk9VUkNDX21mcm8sICJtb3ZpZSBmcmFnbWVudCByYW5kb20gYWNjZXNzIG9mZnNldCIsIDAsCisgICAgICBxdGRlbXV4X2R1bXBfbWZyb30sCisgIHtGT1VSQ0NfbW9vZiwgIm1vdmllIGZyYWdtZW50IiwgUVRfRkxBR19DT05UQUlORVIsfSwKKyAge0ZPVVJDQ19tZmhkLCAibW92aWUgZnJhZ21lbnQgaGVhZGVyIiwgMCwgcXRkZW11eF9kdW1wX21maGR9LAorICB7Rk9VUkNDX3RyYWYsICJ0cmFjayBmcmFnbWVudCIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfdGZoZCwgInRyYWNrIGZyYWdtZW50IGhlYWRlciIsIDAsCisgICAgICBxdGRlbXV4X2R1bXBfdGZoZH0sCisgIHtGT1VSQ0Nfc2R0cCwgImluZGVwZW5kZW50IGFuZCBkaXNwb3NhYmxlIHNhbXBsZXMiLCAwLAorICAgICAgcXRkZW11eF9kdW1wX3NkdHB9LAorICB7Rk9VUkNDX3RydW4sICJ0cmFjayBmcmFnbWVudCBydW4iLCAwLCBxdGRlbXV4X2R1bXBfdHJ1bn0sCisgIHtGT1VSQ0NfbWRhdCwgIm1vb3ZpZSBkYXRhIiwgMCwgcXRkZW11eF9kdW1wX3Vua25vd259LAorICB7Rk9VUkNDX3RyZXgsICJtb292aWUgZGF0YSIsIDAsIHF0ZGVtdXhfZHVtcF90cmV4fSwKKyAge0ZPVVJDQ19tdmV4LCAibXZleCIsIFFUX0ZMQUdfQ09OVEFJTkVSLH0sCisgIHtGT1VSQ0NfbWVoZCwgIm1vdmllIGV4dGVuZHMgaGVhZGVyIiwgMCwKKyAgICAgIHF0ZGVtdXhfZHVtcF9tZWhkfSwKKyAge0ZPVVJDQ19vdmMxLCAib3ZjMSIsIDB9LAorICB7Rk9VUkNDX293bWEsICJvd21hIiwgMH0sCisgIHtGT1VSQ0NfYXZjQywgIkFWIGNvZGVjIGNvbmZpZ3VyYXRpb24gY29udGFpbmVyIiwgMH0sCisgIHtGT1VSQ0NfYXZjMSwgIkFWIGNvZGVjIGNvbmZpZ3VyYXRpb24gdjEiLCAwfSwKKyAge0ZPVVJDQ19hdmMzLCAiQVYgY29kZWMgY29uZmlndXJhdGlvbiB2MyIsIDB9LAorICB7Rk9VUkNDX21wNHMsICJWT0JTVUIgY29kZWMgY29uZmlndXJhdGlvbiIsIDB9LAorICB7Rk9VUkNDX2h2YzEsICJIRVZDIGNvZGVjIGNvbmZpZ3VyYXRpb24iLCAwfSwKKyAge0ZPVVJDQ19oZXYxLCAiSEVWQyBjb2RlYyBjb25maWd1cmF0aW9uIiwgMH0sCisgIHtGT1VSQ0NfaHZjQywgIkhFVkMgY29kZWMgY29uZmlndXJhdGlvbiBjb250YWluZXIiLCAwfSwKKyAge0ZPVVJDQ190ZmR0LCAiVHJhY2sgZnJhZ21lbnQgZGVjb2RlIHRpbWUiLCAwLCBxdGRlbXV4X2R1bXBfdGZkdH0sCisgIHtGT1VSQ0NfY2hhcCwgIkNoYXB0ZXIgUmVmZXJlbmNlIn0sCisgIHtGT1VSQ0NfYnRydCwgIkJpdHJhdGUgaW5mb3JtYXRpb24iLCAwfSwKKyAge0ZPVVJDQ19mcm1hLCAiQXVkaW8gY29kZWMgZm9ybWF0IiwgMH0sCisgIHtGT1VSQ0NfbmFtZSwgIm5hbWUiLCAwfSwKKyAge0ZPVVJDQ19tZWFuLCAibWVhbiIsIDB9LAorICB7Rk9VUkNDX3N2bWksICJTdGVyZW9zY29waWMgVmlkZW8gTWVkaWEgSW5mb3JtYXRpb24iLCAwLAorICAgICAgcXRkZW11eF9kdW1wX3N2bWl9LAorICB7Rk9VUkNDX3NjZGksICJTdGVyZW9zY29waWMgQ2FtZXJhIGFuZCBEaXNwbGF5IEluZm9ybWF0aW9uIiwgMCwKKyAgICAgIHF0ZGVtdXhfZHVtcF91bmtub3dufSwKKyAge0ZPVVJDQ19zYWl6LCAic2FtcGxlIGF1eGlsaWFyeSBpbmZvcm1hdGlvbiBzaXplcyIsIDB9LAorICB7Rk9VUkNDX3NhaW8sICJzYW1wbGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIG9mZnNldHMiLCAwfSwKKyAge0ZPVVJDQ19lbmN2LCAiZW5jcnlwdGVkIHZpc3VhbCBzYW1wbGUgZW50cnkiLCAwfSwKKyAge0ZPVVJDQ19lbmNhLCAiZW5jcnlwdGVkIGF1ZGlvIHNhbXBsZSBlbnRyeSIsIDB9LAorICB7Rk9VUkNDX2VuY3QsICJlbmNyeXB0ZWQgdGV4dCBzYW1wbGUgZW50cnkiLCAwfSwKKyAge0ZPVVJDQ19lbmNzLCAiZW5jcnlwdGVkIHN5c3RlbSBzYW1wbGUgZW50cnkiLCAwfSwKKyAge0ZPVVJDQ19zaW5mLCAicHJvdGVjdGlvbiBzY2hlbWUgaW5mb3JtYXRpb24iLCBRVF9GTEFHX0NPTlRBSU5FUn0sCisgIHtGT1VSQ0NfZnJtYSwgIm9yaWdpbmFsIGZvcm1hdCIsIDB9LAorICB7Rk9VUkNDX3NjaG0sICJzY2hlbWUgdHlwZSIsIDB9LAorICB7Rk9VUkNDX3NjaGksICJzY2hlbWUgaW5mb3JtYXRpb24iLCBRVF9GTEFHX0NPTlRBSU5FUn0sCisgIHtGT1VSQ0NfcHNzaCwgInByb3RlY3Rpb24gc3lzdGVtIHNwZWNpZmljIGhlYWRlciIsIDB9LAorICB7Rk9VUkNDX3RlbmMsICJ0cmFjayBlbmNyeXB0aW9uIiwgMH0sCisgIHtGT1VSQ0Nfc3RwcCwgIlhNTCBzdWJ0aXRsZSBzYW1wbGUgZW50cnkiLCAwfSwKKyAgezAsICJ1bmtub3duIiwgMCx9LAorfTsKKworc3RhdGljIGNvbnN0IGludCBuX3F0X25vZGVfdHlwZXMgPQorICAgIHNpemVvZiAocXRfbm9kZV90eXBlcykgLyBzaXplb2YgKHF0X25vZGVfdHlwZXNbMF0pOworCitjb25zdCBRdE5vZGVUeXBlICoKK3F0ZGVtdXhfdHlwZV9nZXQgKGd1aW50MzIgZm91cmNjKQoreworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbl9xdF9ub2RlX3R5cGVzOyBpKyspIHsKKyAgICBpZiAoR19VTkxJS0VMWSAocXRfbm9kZV90eXBlc1tpXS5mb3VyY2MgPT0gZm91cmNjKSkKKyAgICAgIHJldHVybiBxdF9ub2RlX3R5cGVzICsgaTsKKyAgfQorCisgIEdTVF9XQVJOSU5HICgidW5rbm93biBRdWlja1RpbWUgbm9kZSB0eXBlICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKworICByZXR1cm4gcXRfbm9kZV90eXBlcyArIG5fcXRfbm9kZV90eXBlcyAtIDE7Cit9CmRpZmYgLS1naXQgYS9nc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuaCBiL2dzdC9pc29tcDQvcXRkZW11eF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZWY3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L3F0ZGVtdXhfdHlwZXMuaApAQCAtMCwwICsxLDgzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBTVEVyaWNzc29uIDxiZW5qYW1pbi5nYWlnbmFyZEBzdGVyaWNzc29uLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1FUREVNVVhfVFlQRVNfSF9fCisjZGVmaW5lIF9fR1NUX1FUREVNVVhfVFlQRVNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXJlYWRlci5oPgorCisjaW5jbHVkZSAicXRkZW11eC5oIgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgZ2Jvb2xlYW4gKCpRdER1bXBGdW5jKSAoR3N0UVREZW11eCAqIHF0ZGVtdXgsIEdzdEJ5dGVSZWFkZXIgKiBkYXRhLAorICAgIGludCBkZXB0aCk7CisKK3R5cGVkZWYgc3RydWN0IF9RdE5vZGVUeXBlIFF0Tm9kZVR5cGU7CisKKyNkZWZpbmUgUVRfVUlOVDMyKGEpICAoR1NUX1JFQURfVUlOVDMyX0JFKGEpKQorI2RlZmluZSBRVF9VSU5UMjQoYSkgIChHU1RfUkVBRF9VSU5UMzJfQkUoYSkgPj4gOCkKKyNkZWZpbmUgUVRfVUlOVDE2KGEpICAoR1NUX1JFQURfVUlOVDE2X0JFKGEpKQorI2RlZmluZSBRVF9VSU5UOChhKSAgIChHU1RfUkVBRF9VSU5UOChhKSkKKyNkZWZpbmUgUVRfRlAzMihhKSAgICAoKEdTVF9SRUFEX1VJTlQzMl9CRShhKSkvNjU1MzYuMCkKKyNkZWZpbmUgUVRfU0ZQMzIoYSkgICAoKChnaW50KShHU1RfUkVBRF9VSU5UMzJfQkUoYSkpKS82NTUzNi4wKQorI2RlZmluZSBRVF9GUDE2KGEpICAgICgoR1NUX1JFQURfVUlOVDE2X0JFKGEpKS8yNTYuMCkKKyNkZWZpbmUgUVRfRk9VUkNDKGEpICAoR1NUX1JFQURfVUlOVDMyX0xFKGEpKQorI2RlZmluZSBRVF9VSU5UNjQoYSkgICgoKChndWludDY0KVFUX1VJTlQzMihhKSk8PDMyKXxRVF9VSU5UMzIoKChndWludDggKilhKSs0KSkKKwordHlwZWRlZiBlbnVtIHsKKyAgUVRfRkxBR19OT05FICAgICAgPSAoMCksCisgIFFUX0ZMQUdfQ09OVEFJTkVSID0gKDEgPDwgMCkKK30gUXRGbGFnczsKKworc3RydWN0IF9RdE5vZGVUeXBlIHsKKyAgZ3VpbnQzMiAgICAgIGZvdXJjYzsKKyAgY29uc3QgZ2NoYXIgKm5hbWU7CisgIFF0RmxhZ3MgICAgICBmbGFnczsKKyAgUXREdW1wRnVuYyAgIGR1bXA7Cit9OworCitlbnVtIFRmRmxhZ3MKK3sKKyAgVEZfQkFTRV9EQVRBX09GRlNFVCAgICAgICAgID0gMHgwMDAwMDEsICAgLyogYmFzZS1kYXRhLW9mZnNldC1wcmVzZW50ICovCisgIFRGX1NBTVBMRV9ERVNDUklQVElPTl9JTkRFWCA9IDB4MDAwMDAyLCAgIC8qIHNhbXBsZS1kZXNjcmlwdGlvbi1pbmRleC1wcmVzZW50ICovCisgIFRGX0RFRkFVTFRfU0FNUExFX0RVUkFUSU9OICA9IDB4MDAwMDA4LCAgIC8qIGRlZmF1bHQtc2FtcGxlLWR1cmF0aW9uLXByZXNlbnQgKi8KKyAgVEZfREVGQVVMVF9TQU1QTEVfU0laRSAgICAgID0gMHgwMDAwMTAsICAgLyogZGVmYXVsdC1zYW1wbGUtc2l6ZS1wcmVzZW50ICovCisgIFRGX0RFRkFVTFRfU0FNUExFX0ZMQUdTICAgICA9IDB4MDAwMDIwLCAgIC8qIGRlZmF1bHQtc2FtcGxlLWZsYWdzLXByZXNlbnQgKi8KKyAgVEZfRFVSQVRJT05fSVNfRU1QVFkgICAgICAgID0gMHgwMTAwMDAsICAgLyogZHVyYXRpb24taXMtZW1wdHkgKi8KKyAgVEZfREVGQVVMVF9CQVNFX0lTX01PT0YgICAgID0gMHgwMjAwMDAgICAgLyogZGVmYXVsdC1iYXNlLWlzLW1vb2YgKi8KK307CisKK2VudW0gVHJGbGFncworeworICBUUl9EQVRBX09GRlNFVCAgICAgICAgICAgICAgPSAweDAwMDAwMSwgICAvKiBkYXRhLW9mZnNldC1wcmVzZW50ICovCisgIFRSX0ZJUlNUX1NBTVBMRV9GTEFHUyAgICAgICA9IDB4MDAwMDA0LCAgIC8qIGZpcnN0LXNhbXBsZS1mbGFncy1wcmVzZW50ICovCisgIFRSX1NBTVBMRV9EVVJBVElPTiAgICAgICAgICA9IDB4MDAwMTAwLCAgIC8qIHNhbXBsZS1kdXJhdGlvbi1wcmVzZW50ICovCisgIFRSX1NBTVBMRV9TSVpFICAgICAgICAgICAgICA9IDB4MDAwMjAwLCAgIC8qIHNhbXBsZS1zaXplLXByZXNlbnQgKi8KKyAgVFJfU0FNUExFX0ZMQUdTICAgICAgICAgICAgID0gMHgwMDA0MDAsICAgLyogc2FtcGxlLWZsYWdzLXByZXNlbnQgKi8KKyAgVFJfQ09NUE9TSVRJT05fVElNRV9PRkZTRVRTID0gMHgwMDA4MDAgICAgLyogc2FtcGxlLWNvbXBvc2l0aW9uLXRpbWUtb2Zmc2V0cy1wcmVzZW50cyAqLworfTsKKworY29uc3QgUXROb2RlVHlwZSAqcXRkZW11eF90eXBlX2dldCAoZ3VpbnQzMiBmb3VyY2MpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUVRERU1VWF9UWVBFU19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9pc29tcDQvcXRwYWxldHRlLmggYi9nc3QvaXNvbXA0L3F0cGFsZXR0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MWU5OTEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvaXNvbXA0L3F0cGFsZXR0ZS5oCkBAIC0wLDAgKzEsMTM3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1FUUEFMTEVURV9IX18KKyNkZWZpbmUgX19HU1RfUVRQQUxMRVRFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKK3N0YXRpYyBjb25zdCBndWludDMyIGZmX3F0X2RlZmF1bHRfcGFsZXR0ZV8yWzJdID0geworICAweGZmZmZmZiwgMHgwMDAwMDAKK307CisKK3N0YXRpYyBjb25zdCBndWludDMyIGZmX3F0X2RlZmF1bHRfcGFsZXR0ZV80WzRdID0geworICAweDkzNjU1ZSwgMHhmZmZmZmYsIDB4ZGZkMGFiLCAweDAwMDAwMAorfTsKKworc3RhdGljIGNvbnN0IGd1aW50MzIgZmZfcXRfZGVmYXVsdF9wYWxldHRlXzE2WzE2XSA9IHsKKyAgMHhmZmZiZmYsIDB4ZWZkOWJiLCAweGU4YzliMSwgMHg5MzY1NWUsCisgIDB4ZmNkZWU4LCAweDlkODg5MSwgMHhmZmZmZmYsIDB4ZmZmZmZmLAorICAweGZmZmZmZiwgMHg0NzQ4MzcsIDB4N2E1ZTU1LCAweGRmZDBhYiwKKyAgMHhmZmZiZjksIDB4ZThjYWM1LCAweDhhN2M3NywgMHgwMDAwMDAKK307CitzdGF0aWMgY29uc3QgZ3VpbnQzMiBmZl9xdF9kZWZhdWx0X3BhbGV0dGVfMjU2WzI1Nl0gPSB7CisgIDB4RkZGRkZGLCAweEZGRkZDQywgMHhGRkZGOTksIDB4RkZGRjY2LCAweEZGRkYzMywgMHhGRkZGMDAsCisgIDB4RkZDQ0ZGLCAweEZGQ0NDQywgMHhGRkNDOTksIDB4RkZDQzY2LCAweEZGQ0MzMywgMHhGRkNDMDAsCisgIDB4RkY5OUZGLCAweEZGOTlDQywgMHhGRjk5OTksIDB4RkY5OTY2LCAweEZGOTkzMywgMHhGRjk5MDAsCisgIDB4RkY2NkZGLCAweEZGNjZDQywgMHhGRjY2OTksIDB4RkY2NjY2LCAweEZGNjYzMywgMHhGRjY2MDAsCisgIDB4RkYzM0ZGLCAweEZGMzNDQywgMHhGRjMzOTksIDB4RkYzMzY2LCAweEZGMzMzMywgMHhGRjMzMDAsCisgIDB4RkYwMEZGLCAweEZGMDBDQywgMHhGRjAwOTksIDB4RkYwMDY2LCAweEZGMDAzMywgMHhGRjAwMDAsCisgIDB4Q0NGRkZGLCAweENDRkZDQywgMHhDQ0ZGOTksIDB4Q0NGRjY2LCAweENDRkYzMywgMHhDQ0ZGMDAsCisgIDB4Q0NDQ0ZGLCAweENDQ0NDQywgMHhDQ0NDOTksIDB4Q0NDQzY2LCAweENDQ0MzMywgMHhDQ0NDMDAsCisgIDB4Q0M5OUZGLCAweENDOTlDQywgMHhDQzk5OTksIDB4Q0M5OTY2LCAweENDOTkzMywgMHhDQzk5MDAsCisgIDB4Q0M2NkZGLCAweENDNjZDQywgMHhDQzY2OTksIDB4Q0M2NjY2LCAweENDNjYzMywgMHhDQzY2MDAsCisgIDB4Q0MzM0ZGLCAweENDMzNDQywgMHhDQzMzOTksIDB4Q0MzMzY2LCAweENDMzMzMywgMHhDQzMzMDAsCisgIDB4Q0MwMEZGLCAweENDMDBDQywgMHhDQzAwOTksIDB4Q0MwMDY2LCAweENDMDAzMywgMHhDQzAwMDAsCisgIDB4OTlGRkZGLCAweDk5RkZDQywgMHg5OUZGOTksIDB4OTlGRjY2LCAweDk5RkYzMywgMHg5OUZGMDAsCisgIDB4OTlDQ0ZGLCAweDk5Q0NDQywgMHg5OUNDOTksIDB4OTlDQzY2LCAweDk5Q0MzMywgMHg5OUNDMDAsCisgIDB4OTk5OUZGLCAweDk5OTlDQywgMHg5OTk5OTksIDB4OTk5OTY2LCAweDk5OTkzMywgMHg5OTk5MDAsCisgIDB4OTk2NkZGLCAweDk5NjZDQywgMHg5OTY2OTksIDB4OTk2NjY2LCAweDk5NjYzMywgMHg5OTY2MDAsCisgIDB4OTkzM0ZGLCAweDk5MzNDQywgMHg5OTMzOTksIDB4OTkzMzY2LCAweDk5MzMzMywgMHg5OTMzMDAsCisgIDB4OTkwMEZGLCAweDk5MDBDQywgMHg5OTAwOTksIDB4OTkwMDY2LCAweDk5MDAzMywgMHg5OTAwMDAsCisgIDB4NjZGRkZGLCAweDY2RkZDQywgMHg2NkZGOTksIDB4NjZGRjY2LCAweDY2RkYzMywgMHg2NkZGMDAsCisgIDB4NjZDQ0ZGLCAweDY2Q0NDQywgMHg2NkNDOTksIDB4NjZDQzY2LCAweDY2Q0MzMywgMHg2NkNDMDAsCisgIDB4NjY5OUZGLCAweDY2OTlDQywgMHg2Njk5OTksIDB4NjY5OTY2LCAweDY2OTkzMywgMHg2Njk5MDAsCisgIDB4NjY2NkZGLCAweDY2NjZDQywgMHg2NjY2OTksIDB4NjY2NjY2LCAweDY2NjYzMywgMHg2NjY2MDAsCisgIDB4NjYzM0ZGLCAweDY2MzNDQywgMHg2NjMzOTksIDB4NjYzMzY2LCAweDY2MzMzMywgMHg2NjMzMDAsCisgIDB4NjYwMEZGLCAweDY2MDBDQywgMHg2NjAwOTksIDB4NjYwMDY2LCAweDY2MDAzMywgMHg2NjAwMDAsCisgIDB4MzNGRkZGLCAweDMzRkZDQywgMHgzM0ZGOTksIDB4MzNGRjY2LCAweDMzRkYzMywgMHgzM0ZGMDAsCisgIDB4MzNDQ0ZGLCAweDMzQ0NDQywgMHgzM0NDOTksIDB4MzNDQzY2LCAweDMzQ0MzMywgMHgzM0NDMDAsCisgIDB4MzM5OUZGLCAweDMzOTlDQywgMHgzMzk5OTksIDB4MzM5OTY2LCAweDMzOTkzMywgMHgzMzk5MDAsCisgIDB4MzM2NkZGLCAweDMzNjZDQywgMHgzMzY2OTksIDB4MzM2NjY2LCAweDMzNjYzMywgMHgzMzY2MDAsCisgIDB4MzMzM0ZGLCAweDMzMzNDQywgMHgzMzMzOTksIDB4MzMzMzY2LCAweDMzMzMzMywgMHgzMzMzMDAsCisgIDB4MzMwMEZGLCAweDMzMDBDQywgMHgzMzAwOTksIDB4MzMwMDY2LCAweDMzMDAzMywgMHgzMzAwMDAsCisgIDB4MDBGRkZGLCAweDAwRkZDQywgMHgwMEZGOTksIDB4MDBGRjY2LCAweDAwRkYzMywgMHgwMEZGMDAsCisgIDB4MDBDQ0ZGLCAweDAwQ0NDQywgMHgwMENDOTksIDB4MDBDQzY2LCAweDAwQ0MzMywgMHgwMENDMDAsCisgIDB4MDA5OUZGLCAweDAwOTlDQywgMHgwMDk5OTksIDB4MDA5OTY2LCAweDAwOTkzMywgMHgwMDk5MDAsCisgIDB4MDA2NkZGLCAweDAwNjZDQywgMHgwMDY2OTksIDB4MDA2NjY2LCAweDAwNjYzMywgMHgwMDY2MDAsCisgIDB4MDAzM0ZGLCAweDAwMzNDQywgMHgwMDMzOTksIDB4MDAzMzY2LCAweDAwMzMzMywgMHgwMDMzMDAsCisgIDB4MDAwMEZGLCAweDAwMDBDQywgMHgwMDAwOTksIDB4MDAwMDY2LCAweDAwMDAzMywgMHhFRTAwMDAsCisgIDB4REQwMDAwLCAweEJCMDAwMCwgMHhBQTAwMDAsIDB4ODgwMDAwLCAweDc3MDAwMCwgMHg1NTAwMDAsCisgIDB4NDQwMDAwLCAweDIyMDAwMCwgMHgxMTAwMDAsIDB4MDBFRTAwLCAweDAwREQwMCwgMHgwMEJCMDAsCisgIDB4MDBBQTAwLCAweDAwODgwMCwgMHgwMDc3MDAsIDB4MDA1NTAwLCAweDAwNDQwMCwgMHgwMDIyMDAsCisgIDB4MDAxMTAwLCAweDAwMDBFRSwgMHgwMDAwREQsIDB4MDAwMEJCLCAweDAwMDBBQSwgMHgwMDAwODgsCisgIDB4MDAwMDc3LCAweDAwMDA1NSwgMHgwMDAwNDQsIDB4MDAwMDIyLCAweDAwMDAxMSwgMHhFRUVFRUUsCisgIDB4RERERERELCAweEJCQkJCQiwgMHhBQUFBQUEsIDB4ODg4ODg4LCAweDc3Nzc3NywgMHg1NTU1NTUsCisgIDB4NDQ0NDQ0LCAweDIyMjIyMiwgMHgxMTExMTEsIDB4MDAwMDAwCit9OworCitzdGF0aWMgY29uc3QgZ3VpbnQzMiBmZl9xdF9ncmF5c2NhbGVfcGFsZXR0ZV8xNlsxNl0gPSB7CisgIDB4ZmZmZmZmLCAweGVlZWVlZSwgMHhkZGRkZGQsIDB4Y2NjY2NjLAorICAweGJiYmJiYiwgMHhhYWFhYWEsIDB4OTk5OTk5LCAweDg4ODg4OCwKKyAgMHg3Nzc3NzcsIDB4NjY2NjY2LCAweDU1NTU1NSwgMHg0NDQ0NDQsCisgIDB4MzMzMzMzLCAweDIyMjIyMiwgMHgxMTExMTEsIDB4MDAwMDAwCit9OworCitzdGF0aWMgY29uc3QgZ3VpbnQzMiBmZl9xdF9ncmF5c2NhbGVfcGFsZXR0ZV8yNTZbMjU2XSA9IHsKKyAgMHhmZmZmZmYsIDB4ZmVmZWZlLCAweGZkZmRmZCwgMHhmY2ZjZmMsIDB4ZmJmYmZiLCAweGZhZmFmYSwgMHhmOWY5ZjksCisgIDB4ZjhmOGY4LCAweGY3ZjdmNywgMHhmNmY2ZjYsIDB4ZjVmNWY1LCAweGY0ZjRmNCwgMHhmM2YzZjMsIDB4ZjJmMmYyLAorICAweGYxZjFmMSwgMHhmMGYwZjAsIDB4ZWZlZmVmLCAweGVlZWVlZSwgMHhlZGVkZWQsIDB4ZWNlY2VjLCAweGViZWJlYiwKKyAgMHhlYWVhZWEsIDB4ZTllOWU5LCAweGU4ZThlOCwgMHhlN2U3ZTcsIDB4ZTZlNmU2LCAweGU1ZTVlNSwgMHhlNGU0ZTQsCisgIDB4ZTNlM2UzLCAweGUyZTJlMiwgMHhlMWUxZTEsIDB4ZTBlMGUwLCAweGRmZGZkZiwgMHhkZWRlZGUsIDB4ZGRkZGRkLAorICAweGRjZGNkYywgMHhkYmRiZGIsIDB4ZGFkYWRhLCAweGQ5ZDlkOSwgMHhkOGQ4ZDgsIDB4ZDdkN2Q3LCAweGQ2ZDZkNiwKKyAgMHhkNWQ1ZDUsIDB4ZDRkNGQ0LCAweGQzZDNkMywgMHhkMmQyZDIsIDB4ZDFkMWQxLCAweGQwZDBkMCwgMHhjZmNmY2YsCisgIDB4Y2VjZWNlLCAweGNkY2RjZCwgMHhjY2NjY2MsIDB4Y2JjYmNiLCAweGNhY2FjYSwgMHhjOWM5YzksIDB4YzhjOGM4LAorICAweGM3YzdjNywgMHhjNmM2YzYsIDB4YzVjNWM1LCAweGM0YzRjNCwgMHhjM2MzYzMsIDB4YzJjMmMyLCAweGMxYzFjMSwKKyAgMHhjMGMwYzAsIDB4YmZiZmJmLCAweGJlYmViZSwgMHhiZGJkYmQsIDB4YmNiY2JjLCAweGJiYmJiYiwgMHhiYWJhYmEsCisgIDB4YjliOWI5LCAweGI4YjhiOCwgMHhiN2I3YjcsIDB4YjZiNmI2LCAweGI1YjViNSwgMHhiNGI0YjQsIDB4YjNiM2IzLAorICAweGIyYjJiMiwgMHhiMWIxYjEsIDB4YjBiMGIwLCAweGFmYWZhZiwgMHhhZWFlYWUsIDB4YWRhZGFkLCAweGFjYWNhYywKKyAgMHhhYmFiYWIsIDB4YWFhYWFhLCAweGE5YTlhOSwgMHhhOGE4YTgsIDB4YTdhN2E3LCAweGE2YTZhNiwgMHhhNWE1YTUsCisgIDB4YTRhNGE0LCAweGEzYTNhMywgMHhhMmEyYTIsIDB4YTFhMWExLCAweGEwYTBhMCwgMHg5ZjlmOWYsIDB4OWU5ZTllLAorICAweDlkOWQ5ZCwgMHg5YzljOWMsIDB4OWI5YjliLCAweDlhOWE5YSwgMHg5OTk5OTksIDB4OTg5ODk4LCAweDk3OTc5NywKKyAgMHg5Njk2OTYsIDB4OTU5NTk1LCAweDk0OTQ5NCwgMHg5MzkzOTMsIDB4OTI5MjkyLCAweDkxOTE5MSwgMHg5MDkwOTAsCisgIDB4OGY4ZjhmLCAweDhlOGU4ZSwgMHg4ZDhkOGQsIDB4OGM4YzhjLCAweDhiOGI4YiwgMHg4YThhOGEsIDB4ODk4OTg5LAorICAweDg4ODg4OCwgMHg4Nzg3ODcsIDB4ODY4Njg2LCAweDg1ODU4NSwgMHg4NDg0ODQsIDB4ODM4MzgzLCAweDgyODI4MiwKKyAgMHg4MTgxODEsIDB4ODA4MDgwLCAweDdmN2Y3ZiwgMHg3ZTdlN2UsIDB4N2Q3ZDdkLCAweDdjN2M3YywgMHg3YjdiN2IsCisgIDB4N2E3YTdhLCAweDc5Nzk3OSwgMHg3ODc4NzgsIDB4Nzc3Nzc3LCAweDc2NzY3NiwgMHg3NTc1NzUsIDB4NzQ3NDc0LAorICAweDczNzM3MywgMHg3MjcyNzIsIDB4NzE3MTcxLCAweDcwNzA3MCwgMHg2ZjZmNmYsIDB4NmU2ZTZlLCAweDZkNmQ2ZCwKKyAgMHg2YzZjNmMsIDB4NmI2YjZiLCAweDZhNmE2YSwgMHg2OTY5NjksIDB4Njg2ODY4LCAweDY3Njc2NywgMHg2NjY2NjYsCisgIDB4NjU2NTY1LCAweDY0NjQ2NCwgMHg2MzYzNjMsIDB4NjI2MjYyLCAweDYxNjE2MSwgMHg2MDYwNjAsIDB4NWY1ZjVmLAorICAweDVlNWU1ZSwgMHg1ZDVkNWQsIDB4NWM1YzVjLCAweDViNWI1YiwgMHg1YTVhNWEsIDB4NTk1OTU5LCAweDU4NTg1OCwKKyAgMHg1NzU3NTcsIDB4NTY1NjU2LCAweDU1NTU1NSwgMHg1NDU0NTQsIDB4NTM1MzUzLCAweDUyNTI1MiwgMHg1MTUxNTEsCisgIDB4NTA1MDUwLCAweDRmNGY0ZiwgMHg0ZTRlNGUsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0YjRiNGIsIDB4NGE0YTRhLAorICAweDQ5NDk0OSwgMHg0ODQ4NDgsIDB4NDc0NzQ3LCAweDQ2NDY0NiwgMHg0NTQ1NDUsIDB4NDQ0NDQ0LCAweDQzNDM0MywKKyAgMHg0MjQyNDIsIDB4NDE0MTQxLCAweDQwNDA0MCwgMHgzZjNmM2YsIDB4M2UzZTNlLCAweDNkM2QzZCwgMHgzYzNjM2MsCisgIDB4M2IzYjNiLCAweDNhM2EzYSwgMHgzOTM5MzksIDB4MzgzODM4LCAweDM3MzczNywgMHgzNjM2MzYsIDB4MzUzNTM1LAorICAweDM0MzQzNCwgMHgzMzMzMzMsIDB4MzIzMjMyLCAweDMxMzEzMSwgMHgzMDMwMzAsIDB4MmYyZjJmLCAweDJlMmUyZSwKKyAgMHgyZDJkMmQsIDB4MmMyYzJjLCAweDJiMmIyYiwgMHgyYTJhMmEsIDB4MjkyOTI5LCAweDI4MjgyOCwgMHgyNzI3MjcsCisgIDB4MjYyNjI2LCAweDI1MjUyNSwgMHgyNDI0MjQsIDB4MjMyMzIzLCAweDIyMjIyMiwgMHgyMTIxMjEsIDB4MjAyMDIwLAorICAweDFmMWYxZiwgMHgxZTFlMWUsIDB4MWQxZDFkLCAweDFjMWMxYywgMHgxYjFiMWIsIDB4MWExYTFhLCAweDE5MTkxOSwKKyAgMHgxODE4MTgsIDB4MTcxNzE3LCAweDE2MTYxNiwgMHgxNTE1MTUsIDB4MTQxNDE0LCAweDEzMTMxMywgMHgxMjEyMTIsCisgIDB4MTExMTExLCAweDEwMTAxMCwgMHgwZjBmMGYsIDB4MGUwZTBlLCAweDBkMGQwZCwgMHgwYzBjMGMsIDB4MGIwYjBiLAorICAweDBhMGEwYSwgMHgwOTA5MDksIDB4MDgwODA4LCAweDA3MDcwNywgMHgwNjA2MDYsIDB4MDUwNTA1LCAweDA0MDQwNCwKKyAgMHgwMzAzMDMsIDB4MDIwMjAyLCAweDAxMDEwMSwgMHgwMDAwMDAKK307CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9RVFBBTEVUVEVfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvbGF3L01ha2VmaWxlLmFtIGIvZ3N0L2xhdy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWQ5NGJhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2xhdy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE1IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RhbGF3LmxhIGxpYmdzdG11bGF3LmxhCisKK2xpYmdzdGFsYXdfbGFfU09VUkNFUyA9IGFsYXctZW5jb2RlLmMgYWxhdy1kZWNvZGUuYyBhbGF3LmMKK2xpYmdzdGFsYXdfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQorbGliZ3N0YWxhd19sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RhdWRpby0kKEdTVF9BUElfVkVSU0lPTikgXAorCSQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykKK2xpYmdzdGFsYXdfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitsaWJnc3RtdWxhd19sYV9TT1VSQ0VTID0gbXVsYXctZW5jb2RlLmMgbXVsYXctY29udmVyc2lvbi5jIG11bGF3LWRlY29kZS5jIG11bGF3LmMKK2xpYmdzdG11bGF3X2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdG11bGF3X2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKQorbGliZ3N0bXVsYXdfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IG11bGF3LWNvbnZlcnNpb24uaCBhbGF3LWVuY29kZS5oIGFsYXctZGVjb2RlLmggbXVsYXctZW5jb2RlLmggbXVsYXctZGVjb2RlLmgKZGlmZiAtLWdpdCBhL2dzdC9sYXcvYWxhdy1kZWNvZGUuYyBiL2dzdC9sYXcvYWxhdy1kZWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWEyM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2xhdy9hbGF3LWRlY29kZS5jCkBAIC0wLDAgKzEsMjMxIEBACisvKiBHU3RyZWFtZXIgQS1MYXcgdG8gUENNIGNvbnZlcnNpb24KKyAqIENvcHlyaWdodCAoQykgMjAwMCBieSBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYWxhd2RlYworICoKKyAqIFRoaXMgZWxlbWVudCBkZWNvZGVzIGFsYXcgYXVkaW8uIEFsYXcgY29kaW5nIGlzIGFsc28ga25vd24gYXMgRy43MTEuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiYWxhdy1kZWNvZGUuaCIKKworZXh0ZXJuIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGFsYXdfZGVjX3NyY19mYWN0b3J5OworZXh0ZXJuIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGFsYXdfZGVjX3NpbmtfZmFjdG9yeTsKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoYWxhd19kZWNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgYWxhd19kZWNfZGVidWcKKworc3RhdGljIGdib29sZWFuIGdzdF9hbGF3X2RlY19zZXRfZm9ybWF0IChHc3RBdWRpb0RlY29kZXIgKiBkZWMsIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hbGF3X2RlY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworCisjZGVmaW5lIGdzdF9hbGF3X2RlY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RBTGF3RGVjLCBnc3RfYWxhd19kZWMsIEdTVF9UWVBFX0FVRElPX0RFQ09ERVIpOworCisvKiBzb21lIGRheSB3ZSBtaWdodCBoYXZlIGRlZmluZXMgaW4gZ3N0Y29uZmlnLmggdGhhdCB0ZWxsIHVzIGFib3V0IHRoZQorICogZGVzaXJlZCBjcHUvbWVtb3J5L2JpbmFyeSBzaXplIHRyYWRlLW9mZnMgKi8KKyNkZWZpbmUgR1NUX0FMQVdfREVDX1VTRV9UQUJMRQorCisjaWZkZWYgR1NUX0FMQVdfREVDX1VTRV9UQUJMRQorCitzdGF0aWMgY29uc3QgZ2ludCBhbGF3X3RvX3MxNl90YWJsZVsyNTZdID0geworICAtNTUwNCwgLTUyNDgsIC02MDE2LCAtNTc2MCwgLTQ0ODAsIC00MjI0LCAtNDk5MiwgLTQ3MzYsCisgIC03NTUyLCAtNzI5NiwgLTgwNjQsIC03ODA4LCAtNjUyOCwgLTYyNzIsIC03MDQwLCAtNjc4NCwKKyAgLTI3NTIsIC0yNjI0LCAtMzAwOCwgLTI4ODAsIC0yMjQwLCAtMjExMiwgLTI0OTYsIC0yMzY4LAorICAtMzc3NiwgLTM2NDgsIC00MDMyLCAtMzkwNCwgLTMyNjQsIC0zMTM2LCAtMzUyMCwgLTMzOTIsCisgIC0yMjAxNiwgLTIwOTkyLCAtMjQwNjQsIC0yMzA0MCwgLTE3OTIwLCAtMTY4OTYsIC0xOTk2OCwgLTE4OTQ0LAorICAtMzAyMDgsIC0yOTE4NCwgLTMyMjU2LCAtMzEyMzIsIC0yNjExMiwgLTI1MDg4LCAtMjgxNjAsIC0yNzEzNiwKKyAgLTExMDA4LCAtMTA0OTYsIC0xMjAzMiwgLTExNTIwLCAtODk2MCwgLTg0NDgsIC05OTg0LCAtOTQ3MiwKKyAgLTE1MTA0LCAtMTQ1OTIsIC0xNjEyOCwgLTE1NjE2LCAtMTMwNTYsIC0xMjU0NCwgLTE0MDgwLCAtMTM1NjgsCisgIC0zNDQsIC0zMjgsIC0zNzYsIC0zNjAsIC0yODAsIC0yNjQsIC0zMTIsIC0yOTYsCisgIC00NzIsIC00NTYsIC01MDQsIC00ODgsIC00MDgsIC0zOTIsIC00NDAsIC00MjQsCisgIC04OCwgLTcyLCAtMTIwLCAtMTA0LCAtMjQsIC04LCAtNTYsIC00MCwKKyAgLTIxNiwgLTIwMCwgLTI0OCwgLTIzMiwgLTE1MiwgLTEzNiwgLTE4NCwgLTE2OCwKKyAgLTEzNzYsIC0xMzEyLCAtMTUwNCwgLTE0NDAsIC0xMTIwLCAtMTA1NiwgLTEyNDgsIC0xMTg0LAorICAtMTg4OCwgLTE4MjQsIC0yMDE2LCAtMTk1MiwgLTE2MzIsIC0xNTY4LCAtMTc2MCwgLTE2OTYsCisgIC02ODgsIC02NTYsIC03NTIsIC03MjAsIC01NjAsIC01MjgsIC02MjQsIC01OTIsCisgIC05NDQsIC05MTIsIC0xMDA4LCAtOTc2LCAtODE2LCAtNzg0LCAtODgwLCAtODQ4LAorICA1NTA0LCA1MjQ4LCA2MDE2LCA1NzYwLCA0NDgwLCA0MjI0LCA0OTkyLCA0NzM2LAorICA3NTUyLCA3Mjk2LCA4MDY0LCA3ODA4LCA2NTI4LCA2MjcyLCA3MDQwLCA2Nzg0LAorICAyNzUyLCAyNjI0LCAzMDA4LCAyODgwLCAyMjQwLCAyMTEyLCAyNDk2LCAyMzY4LAorICAzNzc2LCAzNjQ4LCA0MDMyLCAzOTA0LCAzMjY0LCAzMTM2LCAzNTIwLCAzMzkyLAorICAyMjAxNiwgMjA5OTIsIDI0MDY0LCAyMzA0MCwgMTc5MjAsIDE2ODk2LCAxOTk2OCwgMTg5NDQsCisgIDMwMjA4LCAyOTE4NCwgMzIyNTYsIDMxMjMyLCAyNjExMiwgMjUwODgsIDI4MTYwLCAyNzEzNiwKKyAgMTEwMDgsIDEwNDk2LCAxMjAzMiwgMTE1MjAsIDg5NjAsIDg0NDgsIDk5ODQsIDk0NzIsCisgIDE1MTA0LCAxNDU5MiwgMTYxMjgsIDE1NjE2LCAxMzA1NiwgMTI1NDQsIDE0MDgwLCAxMzU2OCwKKyAgMzQ0LCAzMjgsIDM3NiwgMzYwLCAyODAsIDI2NCwgMzEyLCAyOTYsCisgIDQ3MiwgNDU2LCA1MDQsIDQ4OCwgNDA4LCAzOTIsIDQ0MCwgNDI0LAorICA4OCwgNzIsIDEyMCwgMTA0LCAyNCwgOCwgNTYsIDQwLAorICAyMTYsIDIwMCwgMjQ4LCAyMzIsIDE1MiwgMTM2LCAxODQsIDE2OCwKKyAgMTM3NiwgMTMxMiwgMTUwNCwgMTQ0MCwgMTEyMCwgMTA1NiwgMTI0OCwgMTE4NCwKKyAgMTg4OCwgMTgyNCwgMjAxNiwgMTk1MiwgMTYzMiwgMTU2OCwgMTc2MCwgMTY5NiwKKyAgNjg4LCA2NTYsIDc1MiwgNzIwLCA1NjAsIDUyOCwgNjI0LCA1OTIsCisgIDk0NCwgOTEyLCAxMDA4LCA5NzYsIDgxNiwgNzg0LCA4ODAsIDg0OAorfTsKKworc3RhdGljIGlubGluZSBnaW50CithbGF3X3RvX3MxNiAoZ3VpbnQ4IGFfdmFsKQoreworICByZXR1cm4gYWxhd190b19zMTZfdGFibGVbYV92YWxdOworfQorCisjZWxzZSAvKiBHU1RfQUxBV19ERUNfVVNFX1RBQkxFICovCisKK3N0YXRpYyBpbmxpbmUgZ2ludAorYWxhd190b19zMTYgKGd1aW50OCBhX3ZhbCkKK3sKKyAgZ2ludCB0OworICBnaW50IHNlZzsKKworICBhX3ZhbCBePSAweDU1OworICB0ID0gYV92YWwgJiAweDdmOworICBpZiAodCA8IDE2KQorICAgIHQgPSAodCA8PCA0KSArIDg7CisgIGVsc2UgeworICAgIHNlZyA9ICh0ID4+IDQpICYgMHgwNzsKKyAgICB0ID0gKCh0ICYgMHgwZikgPDwgNCkgKyAweDEwODsKKyAgICB0IDw8PSBzZWcgLSAxOworICB9CisgIHJldHVybiAoKGFfdmFsICYgMHg4MCkgPyB0IDogLXQpOworfQorCisjZW5kaWYgLyogR1NUX0FMQVdfREVDX1VTRV9UQUJMRSAqLworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hbGF3X2RlY19zZXRfZm9ybWF0IChHc3RBdWRpb0RlY29kZXIgKiBkZWMsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RBTGF3RGVjICphbGF3ZGVjID0gR1NUX0FMQVdfREVDIChkZWMpOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgaW50IHJhdGUsIGNoYW5uZWxzOworICBHc3RBdWRpb0luZm8gaW5mbzsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgaWYgKCFzdHJ1Y3R1cmUpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZWMsICJmYWlsZWQgdG8gZ2V0IHN0cnVjdHVyZSBmcm9tIGNhcHMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAicmF0ZSIsICZyYXRlKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlYywgImZhaWxlZCB0byBmaW5kIGZpZWxkIHJhdGUgaW4gaW5wdXQgY2FwcyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsICZjaGFubmVscykpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZWMsICJmYWlsZWQgdG8gZmluZCBmaWVsZCBjaGFubmVscyBpbiBpbnB1dCBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJmluZm8pOworICBnc3RfYXVkaW9faW5mb19zZXRfZm9ybWF0ICgmaW5mbywgR1NUX0FVRElPX0ZPUk1BVF9TMTYsIHJhdGUsIGNoYW5uZWxzLCBOVUxMKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChhbGF3ZGVjLCAicmF0ZT0lZCwgY2hhbm5lbHM9JWQiLCByYXRlLCBjaGFubmVscyk7CisKKyAgcmV0dXJuIGdzdF9hdWRpb19kZWNvZGVyX3NldF9vdXRwdXRfZm9ybWF0IChkZWMsICZpbmZvKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hbGF3X2RlY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RNYXBJbmZvIGlubWFwLCBvdXRtYXA7CisgIGdpbnQxNiAqbGluZWFyX2RhdGE7CisgIGd1aW50OCAqYWxhd19kYXRhOworICBnc2l6ZSBhbGF3X3NpemUsIGxpbmVhcl9zaXplOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ2ludCBpOworCisgIGlmICghYnVmZmVyKSB7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CisKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmaW5tYXAsIEdTVF9NQVBfUkVBRCkpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZWMsICJmYWlsZWQgdG8gbWFwIGlucHV0IGJ1ZmZlciIpOworICAgIGdvdG8gZXJyb3JfZmFpbGVkX21hcF9pbnB1dF9idWZmZXI7CisgIH0KKworICBhbGF3X2RhdGEgPSBpbm1hcC5kYXRhOworICBhbGF3X3NpemUgPSBpbm1hcC5zaXplOworCisgIGxpbmVhcl9zaXplID0gYWxhd19zaXplICogMjsKKworICBvdXRidWYgPSBnc3RfYXVkaW9fZGVjb2Rlcl9hbGxvY2F0ZV9vdXRwdXRfYnVmZmVyIChkZWMsIGxpbmVhcl9zaXplKTsKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmb3V0bWFwLCBHU1RfTUFQX1dSSVRFKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlYywgImZhaWxlZCB0byBtYXAgaW5wdXQgYnVmZmVyIik7CisgICAgZ290byBlcnJvcl9mYWlsZWRfbWFwX291dHB1dF9idWZmZXI7CisgIH0KKworICBsaW5lYXJfZGF0YSA9IChnaW50MTYgKikgb3V0bWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCBhbGF3X3NpemU7IGkrKykgeworICAgIGxpbmVhcl9kYXRhW2ldID0gYWxhd190b19zMTYgKGFsYXdfZGF0YVtpXSk7CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWYsICZvdXRtYXApOworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZpbm1hcCk7CisKKyAgcmV0dXJuIGdzdF9hdWRpb19kZWNvZGVyX2ZpbmlzaF9mcmFtZSAoZGVjLCBvdXRidWYsIC0xKTsKKworZXJyb3JfZmFpbGVkX21hcF9vdXRwdXRfYnVmZmVyOgorICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWYpOworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZpbm1hcCk7CisKK2Vycm9yX2ZhaWxlZF9tYXBfaW5wdXRfYnVmZmVyOgorICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FsYXdfZGVjX3N0YXJ0IChHc3RBdWRpb0RlY29kZXIgKiBkZWMpCit7CisgIGdzdF9hdWRpb19kZWNvZGVyX3NldF9lc3RpbWF0ZV9yYXRlIChkZWMsIFRSVUUpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FsYXdfZGVjX2NsYXNzX2luaXQgKEdzdEFMYXdEZWNDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RBdWRpb0RlY29kZXJDbGFzcyAqYXVkaW9kZWNfY2xhc3MgPSBHU1RfQVVESU9fREVDT0RFUl9DTEFTUyAoa2xhc3MpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmFsYXdfZGVjX3NyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmYWxhd19kZWNfc2lua19mYWN0b3J5KTsKKworICBhdWRpb2RlY19jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FsYXdfZGVjX3N0YXJ0KTsKKyAgYXVkaW9kZWNfY2xhc3MtPnNldF9mb3JtYXQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FsYXdfZGVjX3NldF9mb3JtYXQpOworICBhdWRpb2RlY19jbGFzcy0+aGFuZGxlX2ZyYW1lID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hbGF3X2RlY19oYW5kbGVfZnJhbWUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJBIExhdyBhdWRpbyBkZWNvZGVyIiwKKyAgICAgICJDb2RlYy9EZWNvZGVyL0F1ZGlvIiwKKyAgICAgICJDb252ZXJ0IDhiaXQgQSBsYXcgdG8gMTZiaXQgUENNIiwKKyAgICAgICJaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoYWxhd19kZWNfZGVidWcsICJhbGF3ZGVjIiwgMCwgIkEgTGF3IGF1ZGlvIGRlY29kZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9hbGF3X2RlY19pbml0IChHc3RBTGF3RGVjICogYWxhd2RlYykKK3sKKyAgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X25lZWRzX2Zvcm1hdCAoR1NUX0FVRElPX0RFQ09ERVIgKGFsYXdkZWMpLCBUUlVFKTsKKyAgZ3N0X2F1ZGlvX2RlY29kZXJfc2V0X3VzZV9kZWZhdWx0X3BhZF9hY2NlcHRjYXBzIChHU1RfQVVESU9fREVDT0RFUl9DQVNUCisgICAgICAoYWxhd2RlYyksIFRSVUUpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9BVURJT19ERUNPREVSX1NJTktfUEFEIChhbGF3ZGVjKSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvbGF3L2FsYXctZGVjb2RlLmggYi9nc3QvbGF3L2FsYXctZGVjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2NDdkYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9sYXcvYWxhdy1kZWNvZGUuaApAQCAtMCwwICsxLDU1IEBACisvKiBHU3RyZWFtZXIgQS1MYXcgdG8gUENNIGNvbnZlcnNpb24KKyAqIENvcHlyaWdodCAoQykgMjAwMCBieSBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BTEFXX0RFQ09ERV9IX18KKyNkZWZpbmUgX19HU1RfQUxBV19ERUNPREVfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9BTEFXX0RFQyBcCisgIChnc3RfYWxhd19kZWNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0FMQVdfREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQUxBV19ERUMsR3N0QUxhd0RlYykpCisjZGVmaW5lIEdTVF9BTEFXX0RFQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9BTEFXX0RFQyxHc3RBTGF3RGVjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQUxBV19ERUMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9BTEFXX0RFQykpCisjZGVmaW5lIEdTVF9JU19BTEFXX0RFQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9BTEFXX0RFQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBTGF3RGVjIEdzdEFMYXdEZWM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QUxhd0RlY0NsYXNzIEdzdEFMYXdEZWNDbGFzczsKKworc3RydWN0IF9Hc3RBTGF3RGVjIHsKKyAgR3N0QXVkaW9EZWNvZGVyIGVsZW1lbnQ7Cit9OworCitzdHJ1Y3QgX0dzdEFMYXdEZWNDbGFzcyB7CisgIEdzdEF1ZGlvRGVjb2RlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9hbGF3X2RlY19nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0FMQVdfREVDT0RFX0hfXyAqLworCmRpZmYgLS1naXQgYS9nc3QvbGF3L2FsYXctZW5jb2RlLmMgYi9nc3QvbGF3L2FsYXctZW5jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxNzAwMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9sYXcvYWxhdy1lbmNvZGUuYwpAQCAtMCwwICsxLDQyNyBAQAorLyogR1N0cmVhbWVyIFBDTSB0byBBLUxhdyBjb252ZXJzaW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgYnkgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LWFsYXdlbmMKKyAqCisgKiBUaGlzIGVsZW1lbnQgZW5jb2RlIGFsYXcgYXVkaW8uIEFsYXcgY29kaW5nIGlzIGFsc28ga25vd24gYXMgRy43MTEuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSAiYWxhdy1lbmNvZGUuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoYWxhd19lbmNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgYWxhd19lbmNfZGVidWcKKworZXh0ZXJuIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGFsYXdfZW5jX3NyY19mYWN0b3J5OworZXh0ZXJuIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGFsYXdfZW5jX3NpbmtfZmFjdG9yeTsKKworR19ERUZJTkVfVFlQRSAoR3N0QUxhd0VuYywgZ3N0X2FsYXdfZW5jLCBHU1RfVFlQRV9BVURJT19FTkNPREVSKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9hbGF3X2VuY19zdGFydCAoR3N0QXVkaW9FbmNvZGVyICogYXVkaW9lbmMpOworc3RhdGljIGdib29sZWFuIGdzdF9hbGF3X2VuY19zZXRfZm9ybWF0IChHc3RBdWRpb0VuY29kZXIgKiBlbmMsCisgICAgR3N0QXVkaW9JbmZvICogaW5mbyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfYWxhd19lbmNfaGFuZGxlX2ZyYW1lIChHc3RBdWRpb0VuY29kZXIgKiBlbmMsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworLyogc29tZSBkYXkgd2UgbWlnaHQgaGF2ZSBkZWZpbmVzIGluIGdzdGNvbmZpZy5oIHRoYXQgdGVsbCB1cyBhYm91dCB0aGUKKyAqIGRlc2lyZWQgY3B1L21lbW9yeS9iaW5hcnkgc2l6ZSB0cmFkZS1vZmZzICovCisjZGVmaW5lIEdTVF9BTEFXX0VOQ19VU0VfVEFCTEUKKworI2lmZGVmIEdTVF9BTEFXX0VOQ19VU0VfVEFCTEUKKworc3RhdGljIGNvbnN0IGd1aW50OCBhbGF3X2VuY29kZVsyMDQ4ICsgMV0gPSB7CisgIDB4ZDUsIDB4ZDQsIDB4ZDcsIDB4ZDYsIDB4ZDEsIDB4ZDAsIDB4ZDMsIDB4ZDIsIDB4ZGQsIDB4ZGMsIDB4ZGYsIDB4ZGUsCisgIDB4ZDksIDB4ZDgsIDB4ZGIsIDB4ZGEsIDB4YzUsIDB4YzQsIDB4YzcsIDB4YzYsIDB4YzEsIDB4YzAsIDB4YzMsIDB4YzIsCisgIDB4Y2QsIDB4Y2MsIDB4Y2YsIDB4Y2UsIDB4YzksIDB4YzgsIDB4Y2IsIDB4Y2EsIDB4ZjUsIDB4ZjUsIDB4ZjQsIDB4ZjQsCisgIDB4ZjcsIDB4ZjcsIDB4ZjYsIDB4ZjYsIDB4ZjEsIDB4ZjEsIDB4ZjAsIDB4ZjAsIDB4ZjMsIDB4ZjMsIDB4ZjIsIDB4ZjIsCisgIDB4ZmQsIDB4ZmQsIDB4ZmMsIDB4ZmMsIDB4ZmYsIDB4ZmYsIDB4ZmUsIDB4ZmUsIDB4ZjksIDB4ZjksIDB4ZjgsIDB4ZjgsCisgIDB4ZmIsIDB4ZmIsIDB4ZmEsIDB4ZmEsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsCisgIDB4ZTcsIDB4ZTcsIDB4ZTcsIDB4ZTcsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsCisgIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTMsIDB4ZTMsIDB4ZTMsIDB4ZTMsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsCisgIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsCisgIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsCisgIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWEsIDB4ZWEsIDB4ZWEsIDB4ZWEsIDB4OTUsIDB4OTUsIDB4OTUsIDB4OTUsCisgIDB4OTUsIDB4OTUsIDB4OTUsIDB4OTUsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsCisgIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTYsIDB4OTYsIDB4OTYsIDB4OTYsCisgIDB4OTYsIDB4OTYsIDB4OTYsIDB4OTYsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsCisgIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTMsIDB4OTMsIDB4OTMsIDB4OTMsCisgIDB4OTMsIDB4OTMsIDB4OTMsIDB4OTMsIDB4OTIsIDB4OTIsIDB4OTIsIDB4OTIsIDB4OTIsIDB4OTIsIDB4OTIsIDB4OTIsCisgIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWMsIDB4OWMsIDB4OWMsIDB4OWMsCisgIDB4OWMsIDB4OWMsIDB4OWMsIDB4OWMsIDB4OWYsIDB4OWYsIDB4OWYsIDB4OWYsIDB4OWYsIDB4OWYsIDB4OWYsIDB4OWYsCisgIDB4OWUsIDB4OWUsIDB4OWUsIDB4OWUsIDB4OWUsIDB4OWUsIDB4OWUsIDB4OWUsIDB4OTksIDB4OTksIDB4OTksIDB4OTksCisgIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsCisgIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWEsIDB4OWEsIDB4OWEsIDB4OWEsCisgIDB4OWEsIDB4OWEsIDB4OWEsIDB4OWEsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsCisgIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsCisgIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsCisgIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsCisgIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsCisgIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsCisgIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisgIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsCisgIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsCisgIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsCisgIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsCisgIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsCisgIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsCisgIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsCisgIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsCisgIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGUsIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksCisgIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsCisgIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsCisgIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsCisgIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsCisgIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsCisgIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsCisgIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjUsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsCisgIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsCisgIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsCisgIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsCisgIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsCisgIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsCisgIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsCisgIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsCisgIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsCisgIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsCisgIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsCisgIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsCisgIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsCisgIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsCisgIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsCisgIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsCisgIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsCisgIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsCisgIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsCisgIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsCisgIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsCisgIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsCisgIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsCisgIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsCisgIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsCisgIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsCisgIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YjksIDB4YjksIDB4YjksIDB4YjksCisgIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksCisgIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksCisgIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsCisgIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsCisgIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsCisgIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsCisgIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsCisgIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmIsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsCisgIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsCisgIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsCisgIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsCisgIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsCisgIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsCisgIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsCisgIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsCisgIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsCisgIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsCisgIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsCisgIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsCisgIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsCisgIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsCisgIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsCisgIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsCisgIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsCisgIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsCisgIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsCisgIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsCisgIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsCisgIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsCisgIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsCisgIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsCisgIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsCisgIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsCisgIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsCisgIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsCisgIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsCisgIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsCisgIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsCisgIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsCisgIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsCisgIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsCisgIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsCisgIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsCisgIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsCisgIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsCisgIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsCisgIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsCisgIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsCisgIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsCisgIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsCisgIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsCisgIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsCisgIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsCisgIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsCisgIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsCisgIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsCisgIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsCisgIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsCisgIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsCisgIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsCisgIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsCisgIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsCisgIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsCisgIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsCisgIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsCisgIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsCisgIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsCisgIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsCisgIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsCisgIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsCisgIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsCisgIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsCisgIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsCisgIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsCisgIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksCisgIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksCisgIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksCisgIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksCisgIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksCisgIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsCisgIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsCisgIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsCisgIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsCisgIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsCisgIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsCisgIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsCisgIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsCisgIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsCisgIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsCisgIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsCisgIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4MmEKK307CisKK3N0YXRpYyBpbmxpbmUgZ3VpbnQ4CitzMTZfdG9fYWxhdyAoZ2ludDE2IHBjbV92YWwpCit7CisgIGlmIChwY21fdmFsID49IDApCisgICAgcmV0dXJuIGFsYXdfZW5jb2RlW3BjbV92YWwgLyAxNl07CisgIGVsc2UKKyAgICByZXR1cm4gKDB4N0YgJiBhbGF3X2VuY29kZVtwY21fdmFsIC8gLTE2XSk7Cit9CisKKyNlbHNlIC8qIEdTVF9BTEFXX0VOQ19VU0VfVEFCTEUgKi8KKworLyoKKyAqIHMxNl90b19hbGF3KCkgLSBDb252ZXJ0IGEgMTYtYml0IGxpbmVhciBQQ00gdmFsdWUgdG8gOC1iaXQgQS1sYXcKKyAqCisgKiBzMTZfdG9fYWxhdygpIGFjY2VwdHMgYW4gMTYtYml0IGludGVnZXIgYW5kIGVuY29kZXMgaXQgYXMgQS1sYXcgZGF0YS4KKyAqCisgKiAgICAgICAgICAgICAgTGluZWFyIElucHV0IENvZGUgICAgICAgQ29tcHJlc3NlZCBDb2RlCisgKiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgIDAwMDAwMDB3eHl6YSAgICAgICAgICAgICAgICAgICAgMDAwd3h5egorICogICAgICAwMDAwMDAxd3h5emEgICAgICAgICAgICAgICAgICAgIDAwMXd4eXoKKyAqICAgICAgMDAwMDAxd3h5emFiICAgICAgICAgICAgICAgICAgICAwMTB3eHl6CisgKiAgICAgIDAwMDAxd3h5emFiYyAgICAgICAgICAgICAgICAgICAgMDExd3h5egorICogICAgICAwMDAxd3h5emFiY2QgICAgICAgICAgICAgICAgICAgIDEwMHd4eXoKKyAqICAgICAgMDAxd3h5emFiY2RlICAgICAgICAgICAgICAgICAgICAxMDF3eHl6CisgKiAgICAgIDAxd3h5emFiY2RlZiAgICAgICAgICAgICAgICAgICAgMTEwd3h5egorICogICAgICAxd3h5emFiY2RlZmcgICAgICAgICAgICAgICAgICAgIDExMXd4eXoKKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiBzZWUgSm9obiBDLiBCZWxsYW15J3MgRGlnaXRhbCBUZWxlcGhvbnksIDE5ODIsCisgKiBKb2huIFdpbGV5ICYgU29ucywgcHBzIDk4LTExMSBhbmQgNDcyLTQ3Ni4KKyAqLworCitzdGF0aWMgaW5saW5lIGdpbnQKK3ZhbF9zZWcgKGdpbnQgdmFsKQoreworICBnaW50IHIgPSAxOworCisgIHZhbCA+Pj0gODsKKyAgaWYgKHZhbCAmIDB4ZjApIHsKKyAgICB2YWwgPj49IDQ7CisgICAgciArPSA0OworICB9CisgIGlmICh2YWwgJiAweDBjKSB7CisgICAgdmFsID4+PSAyOworICAgIHIgKz0gMjsKKyAgfQorICBpZiAodmFsICYgMHgwMikKKyAgICByICs9IDE7CisgIHJldHVybiByOworfQorCitzdGF0aWMgaW5saW5lIGd1aW50OAorczE2X3RvX2FsYXcgKGdpbnQgcGNtX3ZhbCkKK3sKKyAgZ2ludCBzZWc7CisgIGd1aW50OCBtYXNrOworICBndWludDggYXZhbDsKKworICBpZiAocGNtX3ZhbCA+PSAwKSB7CisgICAgbWFzayA9IDB4RDU7CisgIH0gZWxzZSB7CisgICAgbWFzayA9IDB4NTU7CisgICAgcGNtX3ZhbCA9IC1wY21fdmFsOworICAgIGlmIChwY21fdmFsID4gMHg3ZmZmKQorICAgICAgcGNtX3ZhbCA9IDB4N2ZmZjsKKyAgfQorCisgIGlmIChwY21fdmFsIDwgMjU2KQorICAgIGF2YWwgPSBwY21fdmFsID4+IDQ7CisgIGVsc2UgeworICAgIC8qIENvbnZlcnQgdGhlIHNjYWxlZCBtYWduaXR1ZGUgdG8gc2VnbWVudCBudW1iZXIuICovCisgICAgc2VnID0gdmFsX3NlZyAocGNtX3ZhbCk7CisgICAgYXZhbCA9IChzZWcgPDwgNCkgfCAoKHBjbV92YWwgPj4gKHNlZyArIDMpKSAmIDB4MGYpOworICB9CisgIHJldHVybiBhdmFsIF4gbWFzazsKK30KKworI2VuZGlmIC8qIEdTVF9BTEFXX0VOQ19VU0VfVEFCTEUgKi8KKworc3RhdGljIGdib29sZWFuCitnc3RfYWxhd19lbmNfc3RhcnQgKEdzdEF1ZGlvRW5jb2RlciAqIGF1ZGlvZW5jKQoreworICBHc3RBTGF3RW5jICphbGF3ZW5jID0gR1NUX0FMQVdfRU5DIChhdWRpb2VuYyk7CisKKyAgYWxhd2VuYy0+Y2hhbm5lbHMgPSAwOworICBhbGF3ZW5jLT5yYXRlID0gMDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYWxhd19lbmNfc2V0X2Zvcm1hdCAoR3N0QXVkaW9FbmNvZGVyICogYXVkaW9lbmMsIEdzdEF1ZGlvSW5mbyAqIGluZm8pCit7CisgIEdzdENhcHMgKmJhc2VfY2FwczsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdEFMYXdFbmMgKmFsYXdlbmMgPSBHU1RfQUxBV19FTkMgKGF1ZGlvZW5jKTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIGFsYXdlbmMtPnJhdGUgPSBpbmZvLT5yYXRlOworICBhbGF3ZW5jLT5jaGFubmVscyA9IGluZm8tPmNoYW5uZWxzOworCisgIGJhc2VfY2FwcyA9CisgICAgICBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0FVRElPX0VOQ09ERVJfU1JDX1BBRCAoYXVkaW9lbmMpKTsKKyAgZ19hc3NlcnQgKGJhc2VfY2Fwcyk7CisgIGJhc2VfY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGJhc2VfY2Fwcyk7CisgIGdfYXNzZXJ0IChiYXNlX2NhcHMpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGJhc2VfY2FwcywgMCk7CisgIGdfYXNzZXJ0IChzdHJ1Y3R1cmUpOworICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLCAicmF0ZSIsIEdfVFlQRV9JTlQsIGFsYXdlbmMtPnJhdGUsIE5VTEwpOworICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBhbGF3ZW5jLT5jaGFubmVscywKKyAgICAgIE5VTEwpOworCisgIHJldCA9IGdzdF9hdWRpb19lbmNvZGVyX3NldF9vdXRwdXRfZm9ybWF0IChhdWRpb2VuYywgYmFzZV9jYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGJhc2VfY2Fwcyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9hbGF3X2VuY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRW5jb2RlciAqIGF1ZGlvZW5jLCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEFMYXdFbmMgKmFsYXdlbmM7CisgIEdzdE1hcEluZm8gaW5tYXAsIG91dG1hcDsKKyAgZ2ludDE2ICpsaW5lYXJfZGF0YTsKKyAgZ3NpemUgbGluZWFyX3NpemU7CisgIGd1aW50OCAqYWxhd19kYXRhOworICBndWludCBhbGF3X3NpemU7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ2ludCBpOworCisgIGlmICghYnVmZmVyKSB7CisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBkb25lOworICB9CisKKyAgYWxhd2VuYyA9IEdTVF9BTEFXX0VOQyAoYXVkaW9lbmMpOworCisgIGlmICghYWxhd2VuYy0+cmF0ZSB8fCAhYWxhd2VuYy0+Y2hhbm5lbHMpCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmaW5tYXAsIEdTVF9NQVBfUkVBRCk7CisgIGxpbmVhcl9kYXRhID0gKGdpbnQxNiAqKSBpbm1hcC5kYXRhOworICBsaW5lYXJfc2l6ZSA9IGlubWFwLnNpemU7CisKKyAgYWxhd19zaXplID0gbGluZWFyX3NpemUgLyAyOworCisgIG91dGJ1ZiA9IGdzdF9hdWRpb19lbmNvZGVyX2FsbG9jYXRlX291dHB1dF9idWZmZXIgKGF1ZGlvZW5jLCBhbGF3X3NpemUpOworCisgIGdfYXNzZXJ0IChvdXRidWYpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZvdXRtYXAsIEdTVF9NQVBfV1JJVEUpOworICBhbGF3X2RhdGEgPSBvdXRtYXAuZGF0YTsKKworICBmb3IgKGkgPSAwOyBpIDwgYWxhd19zaXplOyBpKyspIHsKKyAgICBhbGF3X2RhdGFbaV0gPSBzMTZfdG9fYWxhdyAobGluZWFyX2RhdGFbaV0pOworICB9CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmb3V0bWFwKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmaW5tYXApOworCisgIHJldCA9IGdzdF9hdWRpb19lbmNvZGVyX2ZpbmlzaF9mcmFtZSAoYXVkaW9lbmMsIG91dGJ1ZiwgLTEpOworCitkb25lOgorICByZXR1cm4gcmV0OworCitub3RfbmVnb3RpYXRlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFsYXdlbmMsICJubyBmb3JtYXQgbmVnb3RpYXRlZCIpOworICAgIHJldCA9IEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2FsYXdfZW5jX2NsYXNzX2luaXQgKEdzdEFMYXdFbmNDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBHc3RBdWRpb0VuY29kZXJDbGFzcyAqYXVkaW9fZW5jb2Rlcl9jbGFzcyA9IEdTVF9BVURJT19FTkNPREVSX0NMQVNTIChrbGFzcyk7CisKKyAgYXVkaW9fZW5jb2Rlcl9jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FsYXdfZW5jX3N0YXJ0KTsKKyAgYXVkaW9fZW5jb2Rlcl9jbGFzcy0+c2V0X2Zvcm1hdCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYWxhd19lbmNfc2V0X2Zvcm1hdCk7CisgIGF1ZGlvX2VuY29kZXJfY2xhc3MtPmhhbmRsZV9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2FsYXdfZW5jX2hhbmRsZV9mcmFtZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmYWxhd19lbmNfc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZhbGF3X2VuY19zaW5rX2ZhY3RvcnkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiQSBMYXcgYXVkaW8gZW5jb2RlciIsICJDb2RlYy9FbmNvZGVyL0F1ZGlvIiwKKyAgICAgICJDb252ZXJ0IDE2Yml0IFBDTSB0byA4Yml0IEEgbGF3IiwKKyAgICAgICJaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4iKTsKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGFsYXdfZW5jX2RlYnVnLCAiYWxhd2VuYyIsIDAsICJBIExhdyBhdWRpbyBlbmNvZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYWxhd19lbmNfaW5pdCAoR3N0QUxhd0VuYyAqIGFsYXdlbmMpCit7CisgIEdTVF9QQURfU0VUX0FDQ0VQVF9URU1QTEFURSAoR1NUX0FVRElPX0VOQ09ERVJfU0lOS19QQUQgKGFsYXdlbmMpKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9sYXcvYWxhdy1lbmNvZGUuaCBiL2dzdC9sYXcvYWxhdy1lbmNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjA4ZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2xhdy9hbGF3LWVuY29kZS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qIEdTdHJlYW1lciBQQ00gdG8gQS1MYXcgY29udmVyc2lvbgorICogQ29weXJpZ2h0IChDKSAyMDAwIGJ5IEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfQUxBV19FTkNPREVfSF9fCisjZGVmaW5lIF9fR1NUX0FMQVdfRU5DT0RFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQUxBV19FTkMgXAorICAoZ3N0X2FsYXdfZW5jX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9BTEFXX0VOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0FMQVdfRU5DLEdzdEFMYXdFbmMpKQorI2RlZmluZSBHU1RfQUxBV19FTkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfQUxBV19FTkMsR3N0QUxhd0VuY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0FMQVdfRU5DKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQUxBV19FTkMpKQorI2RlZmluZSBHU1RfSVNfQUxBV19FTkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfQUxBV19FTkMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0QUxhd0VuYyBHc3RBTGF3RW5jOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEFMYXdFbmNDbGFzcyBHc3RBTGF3RW5jQ2xhc3M7CisKK3N0cnVjdCBfR3N0QUxhd0VuYyB7CisgIEdzdEF1ZGlvRW5jb2RlciBlbmNvZGVyOworCisgIGdpbnQgY2hhbm5lbHM7CisgIGdpbnQgcmF0ZTsKK307CisKK3N0cnVjdCBfR3N0QUxhd0VuY0NsYXNzIHsKKyAgR3N0QXVkaW9FbmNvZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2FsYXdfZW5jX2dldF90eXBlKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfQUxBV19FTkNPREVfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvbGF3L2FsYXcuYyBiL2dzdC9sYXcvYWxhdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZjdlMDYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbGF3L2FsYXcuYwpAQCAtMCwwICsxLDc3IEBACisvKiBHU3RyZWFtZXIgUENNL0EtTGF3IGNvbnZlcnNpb25zCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgImFsYXctZW5jb2RlLmgiCisjaW5jbHVkZSAiYWxhdy1kZWNvZGUuaCIKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgYWxhd19kZWNfc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChTMTYpICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyA4MDAwLCAxOTIwMDAgXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXSIpCisgICAgKTsKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgYWxhd19kZWNfc2lua19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1hbGF3LCAiCisgICAgICAgICJyYXRlID0gWyA4MDAwICwgMTkyMDAwIF0sICIgImNoYW5uZWxzID0gWyAxICwgMiBdIikKKyAgICApOworCitHc3RTdGF0aWNQYWRUZW1wbGF0ZSBhbGF3X2VuY19zaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKFMxNikgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDgwMDAsIDE5MjAwMCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdIikKKyAgICApOworCitHc3RTdGF0aWNQYWRUZW1wbGF0ZSBhbGF3X2VuY19zcmNfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWFsYXcsICIKKyAgICAgICAgInJhdGUgPSBbIDgwMDAgLCAxOTIwMDAgXSwgIiAiY2hhbm5lbHMgPSBbIDEgLCAyIF0iKQorICAgICk7CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAiYWxhd2VuYyIsCisgICAgICAgICAgR1NUX1JBTktfUFJJTUFSWSwgR1NUX1RZUEVfQUxBV19FTkMpIHx8CisgICAgICAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImFsYXdkZWMiLAorICAgICAgICAgIEdTVF9SQU5LX1BSSU1BUlksIEdTVF9UWVBFX0FMQVdfREVDKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIEZJWE1FIDAuMTE6IG1lcmdlIGFsYXcgYW5kIG11bGF3IGludG8gb25lIHBsdWdpbj8gKi8KK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBhbGF3LAorICAgICJBTGF3IGF1ZGlvIGNvbnZlcnNpb24gcm91dGluZXMiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L2xhdy9tZXNvbi5idWlsZCBiL2dzdC9sYXcvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxODEwZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9sYXcvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxNyBAQAorZ3N0YWxhdyA9IGxpYnJhcnkoJ2dzdGFsYXcnLAorICAnYWxhdy1lbmNvZGUuYycsICdhbGF3LWRlY29kZS5jJywgJ2FsYXcuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0YmFzZV9kZXAsIGdzdGF1ZGlvX2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCisKK2dzdG11bGF3ID0gbGlicmFyeSgnZ3N0bXVsYXcnLAorICAnbXVsYXctZW5jb2RlLmMnLCAnbXVsYXctY29udmVyc2lvbi5jJywgJ211bGF3LWRlY29kZS5jJywgJ211bGF3LmMnLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnc3RhdWRpb19kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L2xhdy9tdWxhdy1jb252ZXJzaW9uLmMgYi9nc3QvbGF3L211bGF3LWNvbnZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWNkZTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2xhdy9tdWxhdy1jb252ZXJzaW9uLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBUaGlzIHJvdXRpbmUgY29udmVydHMgZnJvbSBsaW5lYXIgdG8gdWxhdworICogMjkgU2VwdGVtYmVyIDE5ODkKKyAqCisgKiBDcmFpZyBSZWVzZTogSURBL1N1cGVyY29tcHV0aW5nIFJlc2VhcmNoIENlbnRlcgorICogSm9lIENhbXBiZWxsOiBEZXBhcnRtZW50IG9mIERlZmVuc2UKKyAqCisgKiBSZWZlcmVuY2VzOgorICogMSkgQ0NJVFQgUmVjb21tZW5kYXRpb24gRy43MTEgICh2ZXJ5IGRpZmZpY3VsdCB0byBmb2xsb3cpCisgKiAyKSAiQSBOZXcgRGlnaXRhbCBUZWNobmlxdWUgZm9yIEltcGxlbWVudGF0aW9uIG9mIEFueSAKKyAqICAgICBDb250aW51b3VzIFBDTSBDb21wYW5kaW5nIExhdywiIFZpbGxlcmV0LCBNaWNoZWwsCisgKiAgICAgZXQgYWwuIDE5NzMgSUVFRSBJbnQuIENvbmYuIG9uIENvbW11bmljYXRpb25zLCBWb2wgMSwKKyAqICAgICAxOTczLCBwZy4gMTEuMTItMTEuMTcKKyAqIDMpIE1JTC1TVEQtMTg4LTExMywiSW50ZXJvcGVyYWJpbGl0eSBhbmQgUGVyZm9ybWFuY2UgU3RhbmRhcmRzCisgKiAgICAgZm9yIEFuYWxvZy10b19EaWdpdGFsIENvbnZlcnNpb24gVGVjaG5pcXVlcywiCisgKiAgICAgMTcgRmVicnVhcnkgMTk4NworICoKKyAqIElucHV0OiBTaWduZWQgMTYgYml0IGxpbmVhciBzYW1wbGUKKyAqIE91dHB1dDogOCBiaXQgdWxhdyBzYW1wbGUKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlICJtdWxhdy1jb252ZXJzaW9uLmgiCisKKyN1bmRlZiBaRVJPVFJBUCAgICAgICAgICAgICAgICAgLyogdHVybiBvbiB0aGUgdHJhcCBhcyBwZXIgdGhlIE1JTC1TVEQgKi8KKyNkZWZpbmUgQklBUyAweDg0ICAgICAgICAgICAgICAgLyogZGVmaW5lIHRoZSBhZGQtaW4gYmlhcyBmb3IgMTYgYml0IHNhbXBsZXMgKi8KKyNkZWZpbmUgQ0xJUCAzMjYzNQorCit2b2lkCittdWxhd19lbmNvZGUgKGdpbnQxNiAqIGluLCBndWludDggKiBvdXQsIGdpbnQgbnVtc2FtcGxlcykKK3sKKyAgc3RhdGljIGNvbnN0IGdpbnQxNiBleHBfbHV0WzI1Nl0gPSB7CisgICAgMCwgMCwgMSwgMSwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCisgICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwKKyAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisgICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKKyAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywKKyAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywKKyAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNworICB9OworICBnaW50MTYgc2lnbiwgZXhwb25lbnQsIG1hbnRpc3NhOworICBnaW50MTYgc2FtcGxlOworICBndWludDggdWxhd2J5dGU7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtc2FtcGxlczsgaSsrKSB7CisgICAgc2FtcGxlID0gaW5baV07CisgICAgICAvKiogZ2V0IHRoZSBzYW1wbGUgaW50byBzaWduLW1hZ25pdHVkZSAqKi8KKyAgICBzaWduID0gKHNhbXBsZSA+PiA4KSAmIDB4ODA7ICAgICAgICAvKiBzZXQgYXNpZGUgdGhlIHNpZ24gKi8KKyAgICBpZiAoc2lnbiAhPSAwKSB7CisgICAgICBzYW1wbGUgPSAtc2FtcGxlOyAgICAgICAgIC8qIGdldCBtYWduaXR1ZGUgKi8KKyAgICB9CisgICAgLyogc2FtcGxlIGNhbiBiZSB6ZXJvIGJlY2F1c2Ugd2UgY2FuIG92ZXJmbG93IGluIHRoZSBpbnZlcnNpb24sCisgICAgICogY2hlY2tpbmcgYWdhaW5zdCB0aGUgdW5zaWduZWQgdmVyc2lvbiBzb2x2ZXMgdGhpcyAqLworICAgIGlmICgoKGd1aW50MTYpIHNhbXBsZSkgPiBDTElQKQorICAgICAgc2FtcGxlID0gQ0xJUDsgICAgICAgICAgICAvKiBjbGlwIHRoZSBtYWduaXR1ZGUgKi8KKworICAgICAgLyoqIGNvbnZlcnQgZnJvbSAxNiBiaXQgbGluZWFyIHRvIHVsYXcgKiovCisgICAgc2FtcGxlID0gc2FtcGxlICsgQklBUzsKKyAgICBleHBvbmVudCA9IGV4cF9sdXRbKHNhbXBsZSA+PiA3KSAmIDB4RkZdOworICAgIG1hbnRpc3NhID0gKHNhbXBsZSA+PiAoZXhwb25lbnQgKyAzKSkgJiAweDBGOworICAgIHVsYXdieXRlID0gfihzaWduIHwgKGV4cG9uZW50IDw8IDQpIHwgbWFudGlzc2EpOworI2lmZGVmIFpFUk9UUkFQCisgICAgaWYgKHVsYXdieXRlID09IDApCisgICAgICB1bGF3Ynl0ZSA9IDB4MDI7ICAgICAgICAgIC8qIG9wdGlvbmFsIENDSVRUIHRyYXAgKi8KKyNlbmRpZgorICAgIG91dFtpXSA9IHVsYXdieXRlOworICB9Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgY29udmVydHMgZnJvbSB1bGF3IHRvIDE2IGJpdCBsaW5lYXIKKyAqIDI5IFNlcHRlbWJlciAxOTg5CisgKgorICogQ3JhaWcgUmVlc2U6IElEQS9TdXBlcmNvbXB1dGluZyBSZXNlYXJjaCBDZW50ZXIKKyAqCisgKiBSZWZlcmVuY2VzOgorICogMSkgQ0NJVFQgUmVjb21tZW5kYXRpb24gRy43MTEgICh2ZXJ5IGRpZmZpY3VsdCB0byBmb2xsb3cpCisgKiAyKSBNSUwtU1RELTE4OC0xMTMsIkludGVyb3BlcmFiaWxpdHkgYW5kIFBlcmZvcm1hbmNlIFN0YW5kYXJkcworICogICAgIGZvciBBbmFsb2ctdG9fRGlnaXRhbCBDb252ZXJzaW9uIFRlY2huaXF1ZXMsIgorICogICAgIDE3IEZlYnJ1YXJ5IDE5ODcKKyAqCisgKiBJbnB1dDogOCBiaXQgdWxhdyBzYW1wbGUKKyAqIE91dHB1dDogc2lnbmVkIDE2IGJpdCBsaW5lYXIgc2FtcGxlCisgKi8KKwordm9pZAorbXVsYXdfZGVjb2RlIChndWludDggKiBpbiwgZ2ludDE2ICogb3V0LCBnaW50IG51bXNhbXBsZXMpCit7CisgIHN0YXRpYyBjb25zdCBnaW50MTYgZXhwX2x1dFs4XSA9CisgICAgICB7IDAsIDEzMiwgMzk2LCA5MjQsIDE5ODAsIDQwOTIsIDgzMTYsIDE2NzY0IH07CisgIGdpbnQxNiBzaWduLCBleHBvbmVudCwgbWFudGlzc2E7CisgIGd1aW50OCB1bGF3Ynl0ZTsKKyAgZ2ludDE2IGxpbmVhcjsKKyAgZ2ludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1zYW1wbGVzOyBpKyspIHsKKyAgICB1bGF3Ynl0ZSA9IGluW2ldOworICAgIHVsYXdieXRlID0gfnVsYXdieXRlOworICAgIHNpZ24gPSAodWxhd2J5dGUgJiAweDgwKTsKKyAgICBleHBvbmVudCA9ICh1bGF3Ynl0ZSA+PiA0KSAmIDB4MDc7CisgICAgbWFudGlzc2EgPSB1bGF3Ynl0ZSAmIDB4MEY7CisgICAgbGluZWFyID0gZXhwX2x1dFtleHBvbmVudF0gKyAobWFudGlzc2EgPDwgKGV4cG9uZW50ICsgMykpOworICAgIGlmIChzaWduICE9IDApCisgICAgICBsaW5lYXIgPSAtbGluZWFyOworICAgIG91dFtpXSA9IGxpbmVhcjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L2xhdy9tdWxhdy1jb252ZXJzaW9uLmggYi9nc3QvbGF3L211bGF3LWNvbnZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODM2N2FkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2xhdy9tdWxhdy1jb252ZXJzaW9uLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfR1NUX1VMQVdfQ09OVkVSU0lPTl9ICisjZGVmaW5lIF9HU1RfVUxBV19DT05WRVJTSU9OX0gKKworI2luY2x1ZGUgPGdsaWIuaD4KKwordm9pZAorbXVsYXdfZW5jb2RlKGdpbnQxNiogaW4sIGd1aW50OCogb3V0LCBnaW50IG51bXNhbXBsZXMpOwordm9pZAorbXVsYXdfZGVjb2RlKGd1aW50OCogaW4sZ2ludDE2KiBvdXQsZ2ludCBudW1zYW1wbGVzKTsKKworI2VuZGlmIC8qIF9HU1RfVUxBV19DT05WRVJTSU9OX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZ3N0L2xhdy9tdWxhdy1kZWNvZGUuYyBiL2dzdC9sYXcvbXVsYXctZGVjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE3MGQwYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9sYXcvbXVsYXctZGVjb2RlLmMKQEAgLTAsMCArMSwxNzYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtbXVsYXdkZWMKKyAqCisgKiBUaGlzIGVsZW1lbnQgZGVjb2RlcyBtdWxhdyBhdWRpby4gTXVsYXcgY29kaW5nIGlzIGFsc28ga25vd24gYXMgRy43MTEuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgIm11bGF3LWRlY29kZS5oIgorI2luY2x1ZGUgIm11bGF3LWNvbnZlcnNpb24uaCIKKworZXh0ZXJuIEdzdFN0YXRpY1BhZFRlbXBsYXRlIG11bGF3X2RlY19zcmNfZmFjdG9yeTsKK2V4dGVybiBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBtdWxhd19kZWNfc2lua19mYWN0b3J5OworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X211bGF3ZGVjX3NldF9mb3JtYXQgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X211bGF3ZGVjX2hhbmRsZV9mcmFtZSAoR3N0QXVkaW9EZWNvZGVyICogZGVjLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKKworLyogU3RlcmVvIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAKK307CisKKyNkZWZpbmUgZ3N0X211bGF3ZGVjX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdE11TGF3RGVjLCBnc3RfbXVsYXdkZWMsIEdTVF9UWVBFX0FVRElPX0RFQ09ERVIpOworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWxhd2RlY19zZXRfZm9ybWF0IChHc3RBdWRpb0RlY29kZXIgKiBkZWMsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RNdUxhd0RlYyAqbXVsYXdkZWMgPSBHU1RfTVVMQVdERUMgKGRlYyk7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBpbnQgcmF0ZSwgY2hhbm5lbHM7CisgIEdzdEF1ZGlvSW5mbyBpbmZvOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBpZiAoIXN0cnVjdHVyZSkgeworICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBnZXQgc3RydWN0dXJlIGZyb20gY2FwcyIpOworICAgIGdvdG8gZXJyb3JfZmFpbGVkX2dldF9zdHJ1Y3R1cmU7CisgIH0KKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAicmF0ZSIsICZyYXRlKSkgeworICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBmaW5kIGZpZWxkIHJhdGUgaW4gaW5wdXQgY2FwcyIpOworICAgIGdvdG8gZXJyb3JfZmFpbGVkX2ZpbmRfcmF0ZTsKKyAgfQorCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsICZjaGFubmVscykpIHsKKyAgICBHU1RfRVJST1IgKCJmYWlsZWQgdG8gZmluZCBmaWVsZCBjaGFubmVscyBpbiBpbnB1dCBjYXBzIik7CisgICAgZ290byBlcnJvcl9mYWlsZWRfZmluZF9jaGFubmVsOworICB9CisKKyAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJmluZm8pOworICBnc3RfYXVkaW9faW5mb19zZXRfZm9ybWF0ICgmaW5mbywgR1NUX0FVRElPX0ZPUk1BVF9TMTYsIHJhdGUsIGNoYW5uZWxzLCBOVUxMKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChtdWxhd2RlYywgInJhdGU9JWQsIGNoYW5uZWxzPSVkIiwgcmF0ZSwgY2hhbm5lbHMpOworCisgIHJldHVybiBnc3RfYXVkaW9fZGVjb2Rlcl9zZXRfb3V0cHV0X2Zvcm1hdCAoZGVjLCAmaW5mbyk7CisKK2Vycm9yX2ZhaWxlZF9maW5kX2NoYW5uZWw6CitlcnJvcl9mYWlsZWRfZmluZF9yYXRlOgorZXJyb3JfZmFpbGVkX2dldF9zdHJ1Y3R1cmU6CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tdWxhd2RlY19oYW5kbGVfZnJhbWUgKEdzdEF1ZGlvRGVjb2RlciAqIGRlYywgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RNYXBJbmZvIGlubWFwLCBvdXRtYXA7CisgIGdpbnQxNiAqbGluZWFyX2RhdGE7CisgIGd1aW50OCAqbXVsYXdfZGF0YTsKKyAgZ3NpemUgbXVsYXdfc2l6ZSwgbGluZWFyX3NpemU7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworCisgIGlmICghYnVmZmVyKSB7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CisKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmaW5tYXAsIEdTVF9NQVBfUkVBRCkpIHsKKyAgICBHU1RfRVJST1IgKCJmYWlsZWQgdG8gbWFwIGlucHV0IGJ1ZmZlciIpOworICAgIGdvdG8gZXJyb3JfZmFpbGVkX21hcF9pbnB1dF9idWZmZXI7CisgIH0KKworICBtdWxhd19kYXRhID0gaW5tYXAuZGF0YTsKKyAgbXVsYXdfc2l6ZSA9IGlubWFwLnNpemU7CisKKyAgbGluZWFyX3NpemUgPSBtdWxhd19zaXplICogMjsKKworICBvdXRidWYgPSBnc3RfYXVkaW9fZGVjb2Rlcl9hbGxvY2F0ZV9vdXRwdXRfYnVmZmVyIChkZWMsIGxpbmVhcl9zaXplKTsKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmb3V0bWFwLCBHU1RfTUFQX1dSSVRFKSkgeworICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBtYXAgaW5wdXQgYnVmZmVyIik7CisgICAgZ290byBlcnJvcl9mYWlsZWRfbWFwX291dHB1dF9idWZmZXI7CisgIH0KKworICBsaW5lYXJfZGF0YSA9IChnaW50MTYgKikgb3V0bWFwLmRhdGE7CisKKyAgbXVsYXdfZGVjb2RlIChtdWxhd19kYXRhLCBsaW5lYXJfZGF0YSwgbXVsYXdfc2l6ZSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmb3V0bWFwKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmaW5tYXApOworCisgIHJldHVybiBnc3RfYXVkaW9fZGVjb2Rlcl9maW5pc2hfZnJhbWUgKGRlYywgb3V0YnVmLCAtMSk7CisKK2Vycm9yX2ZhaWxlZF9tYXBfb3V0cHV0X2J1ZmZlcjoKKyAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmaW5tYXApOworCitlcnJvcl9mYWlsZWRfbWFwX2lucHV0X2J1ZmZlcjoKKyAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWxhd2RlY19zdGFydCAoR3N0QXVkaW9EZWNvZGVyICogZGVjKQoreworICBnc3RfYXVkaW9fZGVjb2Rlcl9zZXRfZXN0aW1hdGVfcmF0ZSAoZGVjLCBUUlVFKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWxhd2RlY19jbGFzc19pbml0IChHc3RNdUxhd0RlY0NsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEF1ZGlvRGVjb2RlckNsYXNzICphdWRpb2RlY19jbGFzcyA9IEdTVF9BVURJT19ERUNPREVSX0NMQVNTIChrbGFzcyk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmbXVsYXdfZGVjX3NyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmbXVsYXdfZGVjX3NpbmtfZmFjdG9yeSk7CisKKworICBhdWRpb2RlY19jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X211bGF3ZGVjX3N0YXJ0KTsKKyAgYXVkaW9kZWNfY2xhc3MtPnNldF9mb3JtYXQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X211bGF3ZGVjX3NldF9mb3JtYXQpOworICBhdWRpb2RlY19jbGFzcy0+aGFuZGxlX2ZyYW1lID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tdWxhd2RlY19oYW5kbGVfZnJhbWUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJNdSBMYXcgYXVkaW8gZGVjb2RlciIsCisgICAgICAiQ29kZWMvRGVjb2Rlci9BdWRpbyIsCisgICAgICAiQ29udmVydCA4Yml0IG11IGxhdyB0byAxNmJpdCBQQ00iLAorICAgICAgIlphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X211bGF3ZGVjX2luaXQgKEdzdE11TGF3RGVjICogbXVsYXdkZWMpCit7CisgIGdzdF9hdWRpb19kZWNvZGVyX3NldF9uZWVkc19mb3JtYXQgKEdTVF9BVURJT19ERUNPREVSIChtdWxhd2RlYyksIFRSVUUpOworICBnc3RfYXVkaW9fZGVjb2Rlcl9zZXRfdXNlX2RlZmF1bHRfcGFkX2FjY2VwdGNhcHMgKEdTVF9BVURJT19ERUNPREVSX0NBU1QKKyAgICAgIChtdWxhd2RlYyksIFRSVUUpOworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9BVURJT19ERUNPREVSX1NJTktfUEFEIChtdWxhd2RlYykpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2xhdy9tdWxhdy1kZWNvZGUuaCBiL2dzdC9sYXcvbXVsYXctZGVjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkNjJmYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9sYXcvbXVsYXctZGVjb2RlLmgKQEAgLTAsMCArMSw1NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfTVVMQVdERUNPREVfSF9fCisjZGVmaW5lIF9fR1NUX01VTEFXREVDT0RFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2RlY29kZXIuaD4KKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9NVUxBV0RFQyBcCisgIChnc3RfbXVsYXdkZWNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX01VTEFXREVDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfTVVMQVdERUMsR3N0TXVMYXdEZWMpKQorI2RlZmluZSBHU1RfTVVMQVdERUNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfTVVMQVdERUMsR3N0TXVMYXdEZWNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19NVUxBV0RFQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX01VTEFXREVDKSkKKyNkZWZpbmUgR1NUX0lTX01VTEFXREVDX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX01VTEFXREVDKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RNdUxhd0RlYyBHc3RNdUxhd0RlYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RNdUxhd0RlY0NsYXNzIEdzdE11TGF3RGVjQ2xhc3M7CisKK3N0cnVjdCBfR3N0TXVMYXdEZWMKK3sKKyAgR3N0QXVkaW9EZWNvZGVyIGVsZW1lbnQ7Cit9OworCitzdHJ1Y3QgX0dzdE11TGF3RGVjQ2xhc3MKK3sKKyAgR3N0QXVkaW9EZWNvZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X211bGF3ZGVjX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9TVEVSRU9fSF9fICovCmRpZmYgLS1naXQgYS9nc3QvbGF3L211bGF3LWVuY29kZS5jIGIvZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjJjZTBkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2xhdy9tdWxhdy1lbmNvZGUuYwpAQCAtMCwwICsxLDIxMSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1tdWxhd2VuYworICoKKyAqIFRoaXMgZWxlbWVudCBlbmNvZGUgbXVsYXcgYXVkaW8uIE11bGF3IGNvZGluZyBpcyBhbHNvIGtub3duIGFzIEcuNzExLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJtdWxhdy1lbmNvZGUuaCIKKyNpbmNsdWRlICJtdWxhdy1jb252ZXJzaW9uLmgiCisKK2V4dGVybiBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBtdWxhd19lbmNfc3JjX2ZhY3Rvcnk7CitleHRlcm4gR3N0U3RhdGljUGFkVGVtcGxhdGUgbXVsYXdfZW5jX3NpbmtfZmFjdG9yeTsKKworLyogU3RlcmVvIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAKK307CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbXVsYXdlbmNfc3RhcnQgKEdzdEF1ZGlvRW5jb2RlciAqIGF1ZGlvZW5jKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbXVsYXdlbmNfc2V0X2Zvcm1hdCAoR3N0QXVkaW9FbmNvZGVyICogZW5jLAorICAgIEdzdEF1ZGlvSW5mbyAqIGluZm8pOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X211bGF3ZW5jX2hhbmRsZV9mcmFtZSAoR3N0QXVkaW9FbmNvZGVyICogZW5jLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CitzdGF0aWMgdm9pZCBnc3RfbXVsYXdlbmNfc2V0X3RhZ3MgKEdzdE11TGF3RW5jICogbXVsYXdlbmMpOworCisKKyNkZWZpbmUgZ3N0X211bGF3ZW5jX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdE11TGF3RW5jLCBnc3RfbXVsYXdlbmMsIEdTVF9UWVBFX0FVRElPX0VOQ09ERVIpOworCisvKnN0YXRpYyBndWludCBnc3Rfc3RlcmVvX3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07ICovCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X211bGF3ZW5jX3N0YXJ0IChHc3RBdWRpb0VuY29kZXIgKiBhdWRpb2VuYykKK3sKKyAgR3N0TXVMYXdFbmMgKm11bGF3ZW5jID0gR1NUX01VTEFXRU5DIChhdWRpb2VuYyk7CisKKyAgbXVsYXdlbmMtPmNoYW5uZWxzID0gMDsKKyAgbXVsYXdlbmMtPnJhdGUgPSAwOworCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyB2b2lkCitnc3RfbXVsYXdlbmNfc2V0X3RhZ3MgKEdzdE11TGF3RW5jICogbXVsYXdlbmMpCit7CisgIEdzdFRhZ0xpc3QgKnRhZ2xpc3Q7CisgIGd1aW50IGJpdHJhdGU7CisKKyAgLyogYml0cmF0ZSBvZiBtdWxhdyBpcyA4IGJpdHMvc2FtcGxlICogc2FtcGxlIHJhdGUgKiBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgYml0cmF0ZSA9IDggKiBtdWxhd2VuYy0+cmF0ZSAqIG11bGF3ZW5jLT5jaGFubmVsczsKKworICB0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZ3N0X3RhZ19saXN0X2FkZCAodGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgR1NUX1RBR19NQVhJTVVNX0JJVFJBVEUsIGJpdHJhdGUsIE5VTEwpOworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICBHU1RfVEFHX01JTklNVU1fQklUUkFURSwgYml0cmF0ZSwgTlVMTCk7CisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgIEdTVF9UQUdfQklUUkFURSwgYml0cmF0ZSwgTlVMTCk7CisKKyAgZ3N0X2F1ZGlvX2VuY29kZXJfbWVyZ2VfdGFncyAoR1NUX0FVRElPX0VOQ09ERVIgKG11bGF3ZW5jKSwKKyAgICAgIHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSk7CisKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdsaXN0KTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWxhd2VuY19zZXRfZm9ybWF0IChHc3RBdWRpb0VuY29kZXIgKiBhdWRpb2VuYywgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgR3N0Q2FwcyAqYmFzZV9jYXBzOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR3N0TXVMYXdFbmMgKm11bGF3ZW5jID0gR1NUX01VTEFXRU5DIChhdWRpb2VuYyk7CisgIGdib29sZWFuIHJldDsKKworICBtdWxhd2VuYy0+cmF0ZSA9IGluZm8tPnJhdGU7CisgIG11bGF3ZW5jLT5jaGFubmVscyA9IGluZm8tPmNoYW5uZWxzOworCisgIGJhc2VfY2FwcyA9CisgICAgICBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0FVRElPX0VOQ09ERVJfU1JDX1BBRCAoYXVkaW9lbmMpKTsKKyAgZ19hc3NlcnQgKGJhc2VfY2Fwcyk7CisgIGJhc2VfY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGJhc2VfY2Fwcyk7CisgIGdfYXNzZXJ0IChiYXNlX2NhcHMpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGJhc2VfY2FwcywgMCk7CisgIGdfYXNzZXJ0IChzdHJ1Y3R1cmUpOworICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLCAicmF0ZSIsIEdfVFlQRV9JTlQsIG11bGF3ZW5jLT5yYXRlLCBOVUxMKTsKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cnVjdHVyZSwgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgbXVsYXdlbmMtPmNoYW5uZWxzLAorICAgICAgTlVMTCk7CisKKyAgZ3N0X211bGF3ZW5jX3NldF90YWdzIChtdWxhd2VuYyk7CisKKyAgcmV0ID0gZ3N0X2F1ZGlvX2VuY29kZXJfc2V0X291dHB1dF9mb3JtYXQgKGF1ZGlvZW5jLCBiYXNlX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoYmFzZV9jYXBzKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X211bGF3ZW5jX2hhbmRsZV9mcmFtZSAoR3N0QXVkaW9FbmNvZGVyICogYXVkaW9lbmMsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0TXVMYXdFbmMgKm11bGF3ZW5jOworICBHc3RNYXBJbmZvIGlubWFwLCBvdXRtYXA7CisgIGdpbnQxNiAqbGluZWFyX2RhdGE7CisgIGdzaXplIGxpbmVhcl9zaXplOworICBndWludDggKm11bGF3X2RhdGE7CisgIGd1aW50IG11bGF3X3NpemU7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBpZiAoIWJ1ZmZlcikgeworICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIG11bGF3ZW5jID0gR1NUX01VTEFXRU5DIChhdWRpb2VuYyk7CisKKyAgaWYgKCFtdWxhd2VuYy0+cmF0ZSB8fCAhbXVsYXdlbmMtPmNoYW5uZWxzKQorICAgIGdvdG8gbm90X25lZ290aWF0ZWQ7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJmlubWFwLCBHU1RfTUFQX1JFQUQpOworICBsaW5lYXJfZGF0YSA9IChnaW50MTYgKikgaW5tYXAuZGF0YTsKKyAgbGluZWFyX3NpemUgPSBpbm1hcC5zaXplOworCisgIG11bGF3X3NpemUgPSBsaW5lYXJfc2l6ZSAvIDI7CisKKyAgb3V0YnVmID0gZ3N0X2F1ZGlvX2VuY29kZXJfYWxsb2NhdGVfb3V0cHV0X2J1ZmZlciAoYXVkaW9lbmMsIG11bGF3X3NpemUpOworCisgIGdfYXNzZXJ0IChvdXRidWYpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZvdXRtYXAsIEdTVF9NQVBfV1JJVEUpOworICBtdWxhd19kYXRhID0gb3V0bWFwLmRhdGE7CisKKyAgbXVsYXdfZW5jb2RlIChsaW5lYXJfZGF0YSwgbXVsYXdfZGF0YSwgbXVsYXdfc2l6ZSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmb3V0bWFwKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmaW5tYXApOworCisgIHJldCA9IGdzdF9hdWRpb19lbmNvZGVyX2ZpbmlzaF9mcmFtZSAoYXVkaW9lbmMsIG91dGJ1ZiwgLTEpOworCitkb25lOgorCisgIHJldHVybiByZXQ7CisKK25vdF9uZWdvdGlhdGVkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAobXVsYXdlbmMsICJubyBmb3JtYXQgbmVnb3RpYXRlZCIpOworICAgIHJldCA9IEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCisKKworc3RhdGljIHZvaWQKK2dzdF9tdWxhd2VuY19jbGFzc19pbml0IChHc3RNdUxhd0VuY0NsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdzdEF1ZGlvRW5jb2RlckNsYXNzICphdWRpb19lbmNvZGVyX2NsYXNzID0gR1NUX0FVRElPX0VOQ09ERVJfQ0xBU1MgKGtsYXNzKTsKKworICBhdWRpb19lbmNvZGVyX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXVsYXdlbmNfc3RhcnQpOworICBhdWRpb19lbmNvZGVyX2NsYXNzLT5zZXRfZm9ybWF0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tdWxhd2VuY19zZXRfZm9ybWF0KTsKKyAgYXVkaW9fZW5jb2Rlcl9jbGFzcy0+aGFuZGxlX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXVsYXdlbmNfaGFuZGxlX2ZyYW1lKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZtdWxhd19lbmNfc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZtdWxhd19lbmNfc2lua19mYWN0b3J5KTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiTXUgTGF3IGF1ZGlvIGVuY29kZXIiLAorICAgICAgIkNvZGVjL0VuY29kZXIvQXVkaW8iLAorICAgICAgIkNvbnZlcnQgMTZiaXQgUENNIHRvIDhiaXQgbXUgbGF3IiwKKyAgICAgICJaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWxhd2VuY19pbml0IChHc3RNdUxhd0VuYyAqIG11bGF3ZW5jKQoreworICBHU1RfUEFEX1NFVF9BQ0NFUFRfVEVNUExBVEUgKEdTVF9BVURJT19FTkNPREVSX1NJTktfUEFEIChtdWxhd2VuYykpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L2xhdy9tdWxhdy1lbmNvZGUuaCBiL2dzdC9sYXcvbXVsYXctZW5jb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhZGUzOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9sYXcvbXVsYXctZW5jb2RlLmgKQEAgLTAsMCArMSw1NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9NVUxBV0VOQ09ERV9IX18KKyNkZWZpbmUgX19HU1RfTVVMQVdFTkNPREVfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZW5jb2Rlci5oPgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX01VTEFXRU5DIFwKKyAgKGdzdF9tdWxhd2VuY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfTVVMQVdFTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9NVUxBV0VOQyxHc3RNdUxhd0VuYykpCisjZGVmaW5lIEdTVF9NVUxBV0VOQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9NVUxBV0VOQyxHc3RNdUxhd0VuY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX01VTEFXRU5DKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfTVVMQVdFTkMpKQorI2RlZmluZSBHU1RfSVNfTVVMQVdFTkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfTVVMQVdFTkMpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdE11TGF3RW5jIEdzdE11TGF3RW5jOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE11TGF3RW5jQ2xhc3MgR3N0TXVMYXdFbmNDbGFzczsKKworc3RydWN0IF9Hc3RNdUxhd0VuYworeworICBHc3RBdWRpb0VuY29kZXIgZWxlbWVudDsKKworICBnaW50IGNoYW5uZWxzOworICBnaW50IHJhdGU7Cit9OworCitzdHJ1Y3QgX0dzdE11TGF3RW5jQ2xhc3MKK3sKKyAgR3N0QXVkaW9FbmNvZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X211bGF3ZW5jX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9TVEVSRU9fSF9fICovCmRpZmYgLS1naXQgYS9nc3QvbGF3L211bGF3LmMgYi9nc3QvbGF3L211bGF3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlNjE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9sYXcvbXVsYXcuYwpAQCAtMCwwICsxLDc5IEBACisvKiBHU3RyZWFtZXIgUENNL0EtTGF3IGNvbnZlcnNpb25zCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSAibXVsYXctZW5jb2RlLmgiCisjaW5jbHVkZSAibXVsYXctZGVjb2RlLmgiCisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIElOVF9GT1JNQVQgIlMxNkxFIgorI2Vsc2UKKyNkZWZpbmUgSU5UX0ZPUk1BVCAiUzE2QkUiCisjZW5kaWYKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgbXVsYXdfZGVjX3NyY19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIElOVF9GT1JNQVQgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDgwMDAsIDE5MjAwMCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdIikKKyAgICApOworCitHc3RTdGF0aWNQYWRUZW1wbGF0ZSBtdWxhd19kZWNfc2lua19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1tdWxhdywgIgorICAgICAgICAicmF0ZSA9IFsgODAwMCAsIDE5MjAwMCBdLCAiICJjaGFubmVscyA9IFsgMSAsIDIgXSIpCisgICAgKTsKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgbXVsYXdfZW5jX3NpbmtfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIElOVF9GT1JNQVQgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDgwMDAsIDE5MjAwMCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdIikKKyAgICApOworCitHc3RTdGF0aWNQYWRUZW1wbGF0ZSBtdWxhd19lbmNfc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1tdWxhdywgIgorICAgICAgICAicmF0ZSA9IFsgODAwMCAsIDE5MjAwMCBdLCAiICJjaGFubmVscyA9IFsgMSAsIDIgXSIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJtdWxhd2VuYyIsCisgICAgICAgICAgR1NUX1JBTktfUFJJTUFSWSwgR1NUX1RZUEVfTVVMQVdFTkMpIHx8CisgICAgICAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm11bGF3ZGVjIiwKKyAgICAgICAgICBHU1RfUkFOS19QUklNQVJZLCBHU1RfVFlQRV9NVUxBV0RFQykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgbXVsYXcsCisgICAgIk11TGF3IGF1ZGlvIGNvbnZlcnNpb24gcm91dGluZXMiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L2xldmVsLy5naXRpZ25vcmUgYi9nc3QvbGV2ZWwvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWVmZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2xldmVsLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorbGV2ZWwtZXhhbXBsZQpkaWZmIC0tZ2l0IGEvZ3N0L2xldmVsL01ha2VmaWxlLmFtIGIvZ3N0L2xldmVsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YzdiMjgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbGV2ZWwvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RsZXZlbC5sYQorCitsaWJnc3RsZXZlbF9sYV9TT1VSQ0VTID0gZ3N0bGV2ZWwuYworbGliZ3N0bGV2ZWxfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdGxldmVsX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEdTVF9CQVNFX0xJQlMpICQoTElCTSkKK2xpYmdzdGxldmVsX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RsZXZlbC5oCmRpZmYgLS1naXQgYS9nc3QvbGV2ZWwvZ3N0bGV2ZWwuYyBiL2dzdC9sZXZlbC9nc3RsZXZlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjI5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbGV2ZWwvZ3N0bGV2ZWwuYwpAQCAtMCwwICsxLDgwNSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEsMjAwMiwyMDAzLDIwMDUKKyAqICAgICAgICAgICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtbGV2ZWwKKyAqCisgKiBMZXZlbCBhbmFseXNlcyBpbmNvbWluZyBhdWRpbyBidWZmZXJzIGFuZCwgaWYgdGhlICNHc3RMZXZlbDptZXNzYWdlIHByb3BlcnR5CisgKiBpcyAlVFJVRSwgZ2VuZXJhdGVzIGFuIGVsZW1lbnQgbWVzc2FnZSBuYW1lZAorICogPGNsYXNzbmFtZT4mcXVvdDtsZXZlbCZxdW90OzwvY2xhc3NuYW1lPjoKKyAqIGFmdGVyIGVhY2ggaW50ZXJ2YWwgb2YgdGltZSBnaXZlbiBieSB0aGUgI0dzdExldmVsOmludGVydmFsIHByb3BlcnR5LgorICogVGhlIG1lc3NhZ2UncyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlc2UgZmllbGRzOgorICogPGl0ZW1pemVkbGlzdD4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNHc3RDbG9ja1RpbWUKKyAqICAgPGNsYXNzbmFtZT4mcXVvdDt0aW1lc3RhbXAmcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGJ1ZmZlciB0aGF0IHRyaWdnZXJlZCB0aGUgbWVzc2FnZS4KKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNHc3RDbG9ja1RpbWUKKyAqICAgPGNsYXNzbmFtZT4mcXVvdDtzdHJlYW0tdGltZSZxdW90OzwvY2xhc3NuYW1lPjoKKyAqICAgdGhlIHN0cmVhbSB0aW1lIG9mIHRoZSBidWZmZXIuCisgKiAgIDwvcGFyYT4KKyAqIDwvbGlzdGl0ZW0+CisgKiA8bGlzdGl0ZW0+CisgKiAgIDxwYXJhPgorICogICAjR3N0Q2xvY2tUaW1lCisgKiAgIDxjbGFzc25hbWU+JnF1b3Q7cnVubmluZy10aW1lJnF1b3Q7PC9jbGFzc25hbWU+OgorICogICB0aGUgcnVubmluZ190aW1lIG9mIHRoZSBidWZmZXIuCisgKiAgIDwvcGFyYT4KKyAqIDwvbGlzdGl0ZW0+CisgKiA8bGlzdGl0ZW0+CisgKiAgIDxwYXJhPgorICogICAjR3N0Q2xvY2tUaW1lCisgKiAgIDxjbGFzc25hbWU+JnF1b3Q7ZHVyYXRpb24mcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgIHRoZSBkdXJhdGlvbiBvZiB0aGUgYnVmZmVyLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPGxpc3RpdGVtPgorICogICA8cGFyYT4KKyAqICAgI0dzdENsb2NrVGltZQorICogICA8Y2xhc3NuYW1lPiZxdW90O2VuZHRpbWUmcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgIHRoZSBlbmQgdGltZSBvZiB0aGUgYnVmZmVyIHRoYXQgdHJpZ2dlcmVkIHRoZSBtZXNzYWdlIGFzIHN0cmVhbSB0aW1lICh0aGlzCisgKiAgIGlzIGRlcHJlY2F0ZWQsIGFzIGl0IGNhbiBiZSBjYWxjdWxhdGVkIGZyb20gc3RyZWFtLXRpbWUgKyBkdXJhdGlvbikKKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNHVmFsdWVBcnJheSBvZiAjZ2RvdWJsZQorICogICA8Y2xhc3NuYW1lPiZxdW90O3BlYWsmcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgIHRoZSBwZWFrIHBvd2VyIGxldmVsIGluIGRCIGZvciBlYWNoIGNoYW5uZWwKKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNHVmFsdWVBcnJheSBvZiAjZ2RvdWJsZQorICogICA8Y2xhc3NuYW1lPiZxdW90O2RlY2F5JnF1b3Q7PC9jbGFzc25hbWU+OgorICogICB0aGUgZGVjYXlpbmcgcGVhayBwb3dlciBsZXZlbCBpbiBkQiBmb3IgZWFjaCBjaGFubmVsCisgKiAgIFRoZSBkZWNheWluZyBwZWFrIGxldmVsIGZvbGxvd3MgdGhlIHBlYWsgbGV2ZWwsIGJ1dCBzdGFydHMgZHJvcHBpbmcgaWYgbm8KKyAqICAgbmV3IHBlYWsgaXMgcmVhY2hlZCBhZnRlciB0aGUgdGltZSBnaXZlbiBieSB0aGUgI0dzdExldmVsOnBlYWstdHRsLgorICogICBXaGVuIHRoZSBkZWNheWluZyBwZWFrIGxldmVsIGRyb3BzLCBpdCBkb2VzIHNvIGF0IHRoZSBkZWNheSByYXRlIGFzCisgKiAgIHNwZWNpZmllZCBieSB0aGUgI0dzdExldmVsOnBlYWstZmFsbG9mZi4KKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNHVmFsdWVBcnJheSBvZiAjZ2RvdWJsZQorICogICA8Y2xhc3NuYW1lPiZxdW90O3JtcyZxdW90OzwvY2xhc3NuYW1lPjoKKyAqICAgdGhlIFJvb3QgTWVhbiBTcXVhcmUgKG9yIGF2ZXJhZ2UgcG93ZXIpIGxldmVsIGluIGRCIGZvciBlYWNoIGNoYW5uZWwKKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDwvaXRlbWl6ZWRsaXN0PgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGFwcGxpY2F0aW9uPC90aXRsZT4KKyAqIDxpbmZvcm1hbGV4YW1wbGU+PHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJDIj4KKyAqIDx4aTppbmNsdWRlIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzL1hJbmNsdWRlIiBwYXJzZT0idGV4dCIgaHJlZj0iLi4vLi4vLi4vLi4vdGVzdHMvZXhhbXBsZXMvbGV2ZWwvbGV2ZWwtZXhhbXBsZS5jIiAvPgorICogPC9wcm9ncmFtbGlzdGluZz48L2luZm9ybWFsZXhhbXBsZT4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisvKiBGSVhNRSAwLjExOiBzdXBwcmVzcyB3YXJuaW5ncyBmb3IgZGVwcmVjYXRlZCBBUEkgc3VjaCBhcyBHVmFsdWVBcnJheQorICogd2l0aCBuZXdlciBHTGliIHZlcnNpb25zICg+PSAyLjMxLjApICovCisjZGVmaW5lIEdMSUJfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgImdzdGxldmVsLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGxldmVsX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGxldmVsX2RlYnVnCisKKyNkZWZpbmUgRVBTSUxPTiAxZS0zNWYKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGVfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgeyBTOCwgIiBHU1RfQVVESU9fTkUgKFMxNikgIiwgIiBHU1RfQVVESU9fTkUgKFMzMikKKyAgICAgICAgIiwgIiBHU1RfQVVESU9fTkUgKEYzMikgIiwiIEdTVF9BVURJT19ORSAoRjY0KSAiIH0sIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgTUFYIF0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGVfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgUzgsICIgR1NUX0FVRElPX05FIChTMTYpICIsICIgR1NUX0FVRElPX05FIChTMzIpCisgICAgICAgICIsICIgR1NUX0FVRElPX05FIChGMzIpICIsIiBHU1RfQVVESU9fTkUgKEY2NCkgIiB9LCIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdIikKKyAgICApOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9QT1NUX01FU1NBR0VTLAorICBQUk9QX01FU1NBR0UsCisgIFBST1BfSU5URVJWQUwsCisgIFBST1BfUEVBS19UVEwsCisgIFBST1BfUEVBS19GQUxMT0ZGCit9OworCisjZGVmaW5lIGdzdF9sZXZlbF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RMZXZlbCwgZ3N0X2xldmVsLCBHU1RfVFlQRV9CQVNFX1RSQU5TRk9STSk7CisKK3N0YXRpYyB2b2lkIGdzdF9sZXZlbF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfbGV2ZWxfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2xldmVsX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9sZXZlbF9zZXRfY2FwcyAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLCBHc3RDYXBzICogaW4sCisgICAgR3N0Q2FwcyAqIG91dCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2xldmVsX3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X2xldmVsX3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdEJ1ZmZlciAqIGluKTsKK3N0YXRpYyB2b2lkIGdzdF9sZXZlbF9wb3N0X21lc3NhZ2UgKEdzdExldmVsICogZmlsdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbGV2ZWxfc2lua19ldmVudCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIHZvaWQgZ3N0X2xldmVsX3JlY2FsY19pbnRlcnZhbF9mcmFtZXMgKEdzdExldmVsICogbGV2ZWwpOworCitzdGF0aWMgdm9pZAorZ3N0X2xldmVsX2NsYXNzX2luaXQgKEdzdExldmVsQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzICp0cmFuc19jbGFzcyA9IEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9sZXZlbF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9sZXZlbF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2xldmVsX2ZpbmFsaXplOworCisgIC8qKgorICAgKiBHc3RMZXZlbDpwb3N0LW1lc3NhZ2VzCisgICAqCisgICAqIFBvc3QgbWVzc2FnZXMgb24gdGhlIGJ1cyB3aXRoIGxldmVsIGluZm9ybWF0aW9uLgorICAgKgorICAgKiBTaW5jZTogMS4xLjAKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUE9TVF9NRVNTQUdFUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgicG9zdC1tZXNzYWdlcyIsICJQb3N0IE1lc3NhZ2VzIiwKKyAgICAgICAgICAiV2hldGhlciB0byBwb3N0IGEgJ2xldmVsJyBlbGVtZW50IG1lc3NhZ2Ugb24gdGhlIGJ1cyBmb3IgZWFjaCAiCisgICAgICAgICAgInBhc3NlZCBpbnRlcnZhbCIsIFRSVUUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKiBGSVhNRSgyLjApOiByZW1vdmUgdGhpcyBwcm9wZXJ0eSAqLworICAvKioKKyAgICogR3N0TGV2ZWw6cG9zdC1tZXNzYWdlcworICAgKgorICAgKiBQb3N0IG1lc3NhZ2VzIG9uIHRoZSBidXMgd2l0aCBsZXZlbCBpbmZvcm1hdGlvbi4KKyAgICoKKyAgICogRGVwcmVjYXRlZDogdXNlIHRoZSAjR3N0TGV2ZWw6cG9zdC1tZXNzYWdlcyBwcm9wZXJ0eQorICAgKi8KKyNpZm5kZWYgR1NUX1JFTU9WRV9ERVBSRUNBVEVECisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUVTU0FHRSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgibWVzc2FnZSIsICJtZXNzYWdlIiwKKyAgICAgICAgICAiUG9zdCBhICdsZXZlbCcgbWVzc2FnZSBmb3IgZWFjaCBwYXNzZWQgaW50ZXJ2YWwgIgorICAgICAgICAgICIoZGVwcmVjYXRlZCwgdXNlIHRoZSBwb3N0LW1lc3NhZ2VzIHByb3BlcnR5IGluc3RlYWQpIiwgVFJVRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fREVQUkVDQVRFRCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyNlbmRpZgorICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lOVEVSVkFMLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoImludGVydmFsIiwgIkludGVydmFsIiwKKyAgICAgICAgICAiSW50ZXJ2YWwgb2YgdGltZSBiZXR3ZWVuIG1lc3NhZ2UgcG9zdHMgKGluIG5hbm9zZWNvbmRzKSIsCisgICAgICAgICAgMSwgR19NQVhVSU5UNjQsIEdTVF9TRUNPTkQgLyAxMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QRUFLX1RUTCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJwZWFrLXR0bCIsICJQZWFrIFRUTCIsCisgICAgICAgICAgIlRpbWUgVG8gTGl2ZSBvZiBkZWNheSBwZWFrIGJlZm9yZSBpdCBmYWxscyBiYWNrIChpbiBuYW5vc2Vjb25kcykiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDY0LCBHU1RfU0VDT05EIC8gMTAgKiAzLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BFQUtfRkFMTE9GRiwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJwZWFrLWZhbGxvZmYiLCAiUGVhayBGYWxsb2ZmIiwKKyAgICAgICAgICAiRGVjYXkgcmF0ZSBvZiBkZWNheSBwZWFrIGFmdGVyIFRUTCAoaW4gZEIvc2VjKSIsCisgICAgICAgICAgMC4wLCBHX01BWERPVUJMRSwgMTAuMCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGxldmVsX2RlYnVnLCAibGV2ZWwiLCAwLCAiTGV2ZWwgY2FsY3VsYXRpb24iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZzaW5rX3RlbXBsYXRlX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZzcmNfdGVtcGxhdGVfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJMZXZlbCIsCisgICAgICAiRmlsdGVyL0FuYWx5emVyL0F1ZGlvIiwKKyAgICAgICJSTVMvUGVhay9EZWNheWluZyBQZWFrIExldmVsIG1lc3NhZ2VyIGZvciBhdWRpby9yYXciLAorICAgICAgIlRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4iKTsKKworICB0cmFuc19jbGFzcy0+c2V0X2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2xldmVsX3NldF9jYXBzKTsKKyAgdHJhbnNfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9sZXZlbF9zdGFydCk7CisgIHRyYW5zX2NsYXNzLT50cmFuc2Zvcm1faXAgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2xldmVsX3RyYW5zZm9ybV9pcCk7CisgIHRyYW5zX2NsYXNzLT5zaW5rX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9sZXZlbF9zaW5rX2V2ZW50KTsKKyAgdHJhbnNfY2xhc3MtPnBhc3N0aHJvdWdoX29uX3NhbWVfY2FwcyA9IFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbGV2ZWxfaW5pdCAoR3N0TGV2ZWwgKiBmaWx0ZXIpCit7CisgIGZpbHRlci0+Q1MgPSBOVUxMOworICBmaWx0ZXItPnBlYWsgPSBOVUxMOworICBmaWx0ZXItPmxhc3RfcGVhayA9IE5VTEw7CisgIGZpbHRlci0+ZGVjYXlfcGVhayA9IE5VTEw7CisgIGZpbHRlci0+ZGVjYXlfcGVha19iYXNlID0gTlVMTDsKKyAgZmlsdGVyLT5kZWNheV9wZWFrX2FnZSA9IE5VTEw7CisKKyAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJmZpbHRlci0+aW5mbyk7CisKKyAgZmlsdGVyLT5pbnRlcnZhbCA9IEdTVF9TRUNPTkQgLyAxMDsKKyAgZmlsdGVyLT5kZWNheV9wZWFrX3R0bCA9IEdTVF9TRUNPTkQgLyAxMCAqIDM7CisgIGZpbHRlci0+ZGVjYXlfcGVha19mYWxsb2ZmID0gMTAuMDsgICAgLyogZEIgZmFsbG9mZiAoL3NlYykgKi8KKworICBmaWx0ZXItPnBvc3RfbWVzc2FnZXMgPSBUUlVFOworCisgIGZpbHRlci0+cHJvY2VzcyA9IE5VTEw7CisKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9nYXBfYXdhcmUgKEdTVF9CQVNFX1RSQU5TRk9STSAoZmlsdGVyKSwgVFJVRSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbGV2ZWxfZmluYWxpemUgKEdPYmplY3QgKiBvYmopCit7CisgIEdzdExldmVsICpmaWx0ZXIgPSBHU1RfTEVWRUwgKG9iaik7CisKKyAgZ19mcmVlIChmaWx0ZXItPkNTKTsKKyAgZ19mcmVlIChmaWx0ZXItPnBlYWspOworICBnX2ZyZWUgKGZpbHRlci0+bGFzdF9wZWFrKTsKKyAgZ19mcmVlIChmaWx0ZXItPmRlY2F5X3BlYWspOworICBnX2ZyZWUgKGZpbHRlci0+ZGVjYXlfcGVha19iYXNlKTsKKyAgZ19mcmVlIChmaWx0ZXItPmRlY2F5X3BlYWtfYWdlKTsKKworICBmaWx0ZXItPkNTID0gTlVMTDsKKyAgZmlsdGVyLT5wZWFrID0gTlVMTDsKKyAgZmlsdGVyLT5sYXN0X3BlYWsgPSBOVUxMOworICBmaWx0ZXItPmRlY2F5X3BlYWsgPSBOVUxMOworICBmaWx0ZXItPmRlY2F5X3BlYWtfYmFzZSA9IE5VTEw7CisgIGZpbHRlci0+ZGVjYXlfcGVha19hZ2UgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9sZXZlbF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0TGV2ZWwgKmZpbHRlciA9IEdTVF9MRVZFTCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUE9TVF9NRVNTQUdFUzoKKyAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgIGNhc2UgUFJPUF9NRVNTQUdFOgorICAgICAgZmlsdGVyLT5wb3N0X21lc3NhZ2VzID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lOVEVSVkFMOgorICAgICAgZmlsdGVyLT5pbnRlcnZhbCA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpOworICAgICAgLyogTm90IGV4YWN0bHkgdGhyZWFkLXNhZmUsIGJ1dCBwcm9wZXJ0eSBkb2VzIG5vdCBhZHZlcnRpc2UgdGhhdCBpdAorICAgICAgICogY2FuIGJlIGNoYW5nZWQgYXQgcnVudGltZSBhbnl3YXkgKi8KKyAgICAgIGlmIChHU1RfQVVESU9fSU5GT19SQVRFICgmZmlsdGVyLT5pbmZvKSkgeworICAgICAgICBnc3RfbGV2ZWxfcmVjYWxjX2ludGVydmFsX2ZyYW1lcyAoZmlsdGVyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QRUFLX1RUTDoKKyAgICAgIGZpbHRlci0+ZGVjYXlfcGVha190dGwgPQorICAgICAgICAgIGdzdF9ndWludDY0X3RvX2dkb3VibGUgKGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QRUFLX0ZBTExPRkY6CisgICAgICBmaWx0ZXItPmRlY2F5X3BlYWtfZmFsbG9mZiA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2xldmVsX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RMZXZlbCAqZmlsdGVyID0gR1NUX0xFVkVMIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QT1NUX01FU1NBR0VTOgorICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgY2FzZSBQUk9QX01FU1NBR0U6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmlsdGVyLT5wb3N0X21lc3NhZ2VzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTlRFUlZBTDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIGZpbHRlci0+aW50ZXJ2YWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BFQUtfVFRMOgorICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgZmlsdGVyLT5kZWNheV9wZWFrX3R0bCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUEVBS19GQUxMT0ZGOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgZmlsdGVyLT5kZWNheV9wZWFrX2ZhbGxvZmYpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisKKy8qIHByb2Nlc3Mgb25lIChpbnRlcmxlYXZlZCkgY2hhbm5lbCBvZiBpbmNvbWluZyBzYW1wbGVzCisgKiBjYWxjdWxhdGUgc3F1YXJlIHN1bSBvZiBzYW1wbGVzCisgKiBub3JtYWxpemUgYW5kIGF2ZXJhZ2Ugb3ZlciBudW1iZXIgb2Ygc2FtcGxlcworICogcmV0dXJucyBhIG5vcm1hbGl6ZWQgY3VtdWxhdGl2ZSBzcXVhcmUgdmFsdWUsIHdoaWNoIGNhbiBiZSBhdmVyYWdlZAorICogdG8gcmV0dXJuIHRoZSBhdmVyYWdlIHBvd2VyIGFzIGEgZG91YmxlIGJldHdlZW4gMCBhbmQgMQorICogYWxzbyByZXR1cm5zIHRoZSBub3JtYWxpemVkIHBlYWsgcG93ZXIgKHNxdWFyZSBvZiB0aGUgaGlnaGVzdCBhbXBsaXR1ZGUpCisgKgorICogY2FsbGVyIG11c3QgYXNzdXJlIG51bSBpcyBhIG11bHRpcGxlIG9mIGNoYW5uZWxzCisgKiBzYW1wbGVzIGZvciBtdWx0aXBsZSBjaGFubmVscyBhcmUgaW50ZXJsZWF2ZWQKKyAqIGlucHV0IHNhbXBsZSBkYXRhIGVudGVycyBpbiAqaW5fZGF0YSBhbmQgaXMgbm90IG1vZGlmaWVkCisgKiB0aGlzIGZpbHRlciBvbmx5IGFjY2VwdHMgc2lnbmVkIGF1ZGlvIGRhdGEsIHNvIG1pZCBsZXZlbCBpcyBhbHdheXMgMAorICoKKyAqIGZvciBpbnRlZ2VycywgdGhpcyBjb2RlIGNvbnNpZGVycyB0aGUgbm9uLWV4aXN0YW50IHBvc2l0aXZlIG1heCB2YWx1ZSB0byBiZQorICogZnVsbC1zY2FsZTsgc28gbWF4LTEgd2lsbCBub3QgbWFwIHRvIDEuMAorICovCisKKyNkZWZpbmUgREVGSU5FX0lOVF9MRVZFTF9DQUxDVUxBVE9SKFRZUEUsIFJFU09MVVRJT04pICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIGlubGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2dzdF9sZXZlbF9jYWxjdWxhdGVfIyNUWVBFIChncG9pbnRlciBkYXRhLCBndWludCBudW0sIGd1aW50IGNoYW5uZWxzLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICpOQ1MsIGdkb3VibGUgKk5QUykgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVFlQRSAqIGluID0gKFRZUEUgKilkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmVnaXN0ZXIgZ3VpbnQgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2RvdWJsZSBzcXVhcmVzdW0gPSAwLjA7ICAgICAgICAgICAvKiBzcXVhcmUgc3VtIG9mIHRoZSBpbnB1dCBzYW1wbGVzICovICAgIFwKKyAgcmVnaXN0ZXIgZ2RvdWJsZSBzcXVhcmUgPSAwLjA7ICAgICAvKiBTcXVhcmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmVnaXN0ZXIgZ2RvdWJsZSBwZWFrc3F1YXJlID0gMC4wOyAvKiBQZWFrIFNxdWFyZSBTYW1wbGUgKi8gICAgICAgICAgICAgICAgIFwKKyAgZ2RvdWJsZSBub3JtYWxpemVyOyAgICAgICAgICAgICAgICAvKiBkaXZpc29yIHRvIGdldCBhIFstMS4wLCAxLjBdIHJhbmdlICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogKk5DUyA9IDAuMDsgTm9ybWFsaXplZCBDdW11bGF0aXZlIFNxdWFyZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogKk5QUyA9IDAuMDsgTm9ybWFsaXplZCBQZWFrIFNxdWFyZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChqID0gMDsgaiA8IG51bTsgaiArPSBjaGFubmVscykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcXVhcmUgPSAoKGdkb3VibGUpIGluW2pdKSAqIGluW2pdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc3F1YXJlID4gcGVha3NxdWFyZSkgcGVha3NxdWFyZSA9IHNxdWFyZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcXVhcmVzdW0gKz0gc3F1YXJlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbm9ybWFsaXplciA9IChnZG91YmxlKSAoR19HSU5UNjRfQ09OU1RBTlQoMSkgPDwgKFJFU09MVVRJT04gKiAyKSk7ICAgICAgICAgIFwKKyAgKk5DUyA9IHNxdWFyZXN1bSAvIG5vcm1hbGl6ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKk5QUyA9IHBlYWtzcXVhcmUgLyBub3JtYWxpemVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworREVGSU5FX0lOVF9MRVZFTF9DQUxDVUxBVE9SIChnaW50MzIsIDMxKTsKK0RFRklORV9JTlRfTEVWRUxfQ0FMQ1VMQVRPUiAoZ2ludDE2LCAxNSk7CitERUZJTkVfSU5UX0xFVkVMX0NBTENVTEFUT1IgKGdpbnQ4LCA3KTsKKworLyogRklYTUU6IHVzZSBvcmMgdG8gY2FsY3VsYXRlIHNxdWFyZXN1bXM/ICovCisjZGVmaW5lIERFRklORV9GTE9BVF9MRVZFTF9DQUxDVUxBVE9SKFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBpbmxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitnc3RfbGV2ZWxfY2FsY3VsYXRlXyMjVFlQRSAoZ3BvaW50ZXIgZGF0YSwgZ3VpbnQgbnVtLCBndWludCBjaGFubmVscywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAqTkNTLCBnZG91YmxlICpOUFMpICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRZUEUgKiBpbiA9IChUWVBFICopZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJlZ2lzdGVyIGd1aW50IGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdkb3VibGUgc3F1YXJlc3VtID0gMC4wOyAgICAgICAgICAgLyogc3F1YXJlIHN1bSBvZiB0aGUgaW5wdXQgc2FtcGxlcyAqLyAgICBcCisgIHJlZ2lzdGVyIGdkb3VibGUgc3F1YXJlID0gMC4wOyAgICAgLyogU3F1YXJlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJlZ2lzdGVyIGdkb3VibGUgcGVha3NxdWFyZSA9IDAuMDsgLyogUGVhayBTcXVhcmUgU2FtcGxlICovICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qICpOQ1MgPSAwLjA7IE5vcm1hbGl6ZWQgQ3VtdWxhdGl2ZSBTcXVhcmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qICpOUFMgPSAwLjA7IE5vcm1hbGl6ZWQgUGVhayBTcXVhcmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIG9yY19sZXZlbF9zcXVhcmVzdW1fZjY0KCZzcXVhcmVzdW0saW4sbnVtKTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaiA9IDA7IGogPCBudW07IGogKz0gY2hhbm5lbHMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3F1YXJlID0gKChnZG91YmxlKSBpbltqXSkgKiBpbltqXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHNxdWFyZSA+IHBlYWtzcXVhcmUpIHBlYWtzcXVhcmUgPSBzcXVhcmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3F1YXJlc3VtICs9IHNxdWFyZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICpOQ1MgPSBzcXVhcmVzdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICpOUFMgPSBwZWFrc3F1YXJlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0RFRklORV9GTE9BVF9MRVZFTF9DQUxDVUxBVE9SIChnZmxvYXQpOworREVGSU5FX0ZMT0FUX0xFVkVMX0NBTENVTEFUT1IgKGdkb3VibGUpOworCisvKiB3ZSB3b3VsZCBuZWVkIHN0cmlkZSB0byBkZWludGVybGVhdmUgYWxzbworc3RhdGljIHZvaWQgaW5saW5lCitnc3RfbGV2ZWxfY2FsY3VsYXRlX2dkb3VibGUgKGdwb2ludGVyIGRhdGEsIGd1aW50IG51bSwgZ3VpbnQgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAqTkNTLCBnZG91YmxlICpOUFMpCit7CisgIG9yY19sZXZlbF9zcXVhcmVzdW1fZjY0KE5DUywoZ2RvdWJsZSAqKWRhdGEsbnVtKTsKKyAgKk5QUyA9IDAuMDsKK30KKyovCisKK3N0YXRpYyB2b2lkCitnc3RfbGV2ZWxfcmVjYWxjX2ludGVydmFsX2ZyYW1lcyAoR3N0TGV2ZWwgKiBsZXZlbCkKK3sKKyAgR3N0Q2xvY2tUaW1lIGludGVydmFsID0gbGV2ZWwtPmludGVydmFsOworICBndWludCBzYW1wbGVfcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKCZsZXZlbC0+aW5mbyk7CisgIGd1aW50IGludGVydmFsX2ZyYW1lczsKKworICBpbnRlcnZhbF9mcmFtZXMgPSBHU1RfQ0xPQ0tfVElNRV9UT19GUkFNRVMgKGludGVydmFsLCBzYW1wbGVfcmF0ZSk7CisKKyAgaWYgKGludGVydmFsX2ZyYW1lcyA9PSAwKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChsZXZlbCwgImludGVydmFsICUiIEdTVF9USU1FX0ZPUk1BVCAiIGlzIHRvbyBzbWFsbCwgIgorICAgICAgICAic2hvdWxkIGJlIGF0IGxlYXN0ICUiIEdTVF9USU1FX0ZPUk1BVCAiIGZvciBzYW1wbGUgcmF0ZSAldSIsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGludGVydmFsKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0ZSQU1FU19UT19DTE9DS19USU1FICgxLCBzYW1wbGVfcmF0ZSkpLCBzYW1wbGVfcmF0ZSk7CisgICAgaW50ZXJ2YWxfZnJhbWVzID0gMTsKKyAgfQorCisgIGxldmVsLT5pbnRlcnZhbF9mcmFtZXMgPSBpbnRlcnZhbF9mcmFtZXM7CisKKyAgR1NUX0lORk9fT0JKRUNUIChsZXZlbCwgImludGVydmFsX2ZyYW1lcyBub3cgJXUgZm9yIGludGVydmFsICIKKyAgICAgICIlIiBHU1RfVElNRV9GT1JNQVQgIiBhbmQgc2FtcGxlIHJhdGUgJXUiLCBpbnRlcnZhbF9mcmFtZXMsCisgICAgICBHU1RfVElNRV9BUkdTIChpbnRlcnZhbCksIHNhbXBsZV9yYXRlKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbGV2ZWxfc2V0X2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0Q2FwcyAqIGluLCBHc3RDYXBzICogb3V0KQoreworICBHc3RMZXZlbCAqZmlsdGVyID0gR1NUX0xFVkVMICh0cmFucyk7CisgIEdzdEF1ZGlvSW5mbyBpbmZvOworICBnaW50IGksIGNoYW5uZWxzOworCisgIGlmICghZ3N0X2F1ZGlvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBzd2l0Y2ggKEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoJmluZm8pKSB7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1M4OgorICAgICAgZmlsdGVyLT5wcm9jZXNzID0gZ3N0X2xldmVsX2NhbGN1bGF0ZV9naW50ODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMTY6CisgICAgICBmaWx0ZXItPnByb2Nlc3MgPSBnc3RfbGV2ZWxfY2FsY3VsYXRlX2dpbnQxNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMzI6CisgICAgICBmaWx0ZXItPnByb2Nlc3MgPSBnc3RfbGV2ZWxfY2FsY3VsYXRlX2dpbnQzMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GMzI6CisgICAgICBmaWx0ZXItPnByb2Nlc3MgPSBnc3RfbGV2ZWxfY2FsY3VsYXRlX2dmbG9hdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GNjQ6CisgICAgICBmaWx0ZXItPnByb2Nlc3MgPSBnc3RfbGV2ZWxfY2FsY3VsYXRlX2dkb3VibGU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZmlsdGVyLT5wcm9jZXNzID0gTlVMTDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgZmlsdGVyLT5pbmZvID0gaW5mbzsKKworICBjaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTICgmaW5mbyk7CisKKyAgLyogYWxsb2NhdGUgY2hhbm5lbCB2YXJpYWJsZSBhcnJheXMgKi8KKyAgZ19mcmVlIChmaWx0ZXItPkNTKTsKKyAgZ19mcmVlIChmaWx0ZXItPnBlYWspOworICBnX2ZyZWUgKGZpbHRlci0+bGFzdF9wZWFrKTsKKyAgZ19mcmVlIChmaWx0ZXItPmRlY2F5X3BlYWspOworICBnX2ZyZWUgKGZpbHRlci0+ZGVjYXlfcGVha19iYXNlKTsKKyAgZ19mcmVlIChmaWx0ZXItPmRlY2F5X3BlYWtfYWdlKTsKKyAgZmlsdGVyLT5DUyA9IGdfbmV3IChnZG91YmxlLCBjaGFubmVscyk7CisgIGZpbHRlci0+cGVhayA9IGdfbmV3IChnZG91YmxlLCBjaGFubmVscyk7CisgIGZpbHRlci0+bGFzdF9wZWFrID0gZ19uZXcgKGdkb3VibGUsIGNoYW5uZWxzKTsKKyAgZmlsdGVyLT5kZWNheV9wZWFrID0gZ19uZXcgKGdkb3VibGUsIGNoYW5uZWxzKTsKKyAgZmlsdGVyLT5kZWNheV9wZWFrX2Jhc2UgPSBnX25ldyAoZ2RvdWJsZSwgY2hhbm5lbHMpOworCisgIGZpbHRlci0+ZGVjYXlfcGVha19hZ2UgPSBnX25ldyAoR3N0Q2xvY2tUaW1lLCBjaGFubmVscyk7CisKKyAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyArK2kpIHsKKyAgICBmaWx0ZXItPkNTW2ldID0gZmlsdGVyLT5wZWFrW2ldID0gZmlsdGVyLT5sYXN0X3BlYWtbaV0gPQorICAgICAgICBmaWx0ZXItPmRlY2F5X3BlYWtbaV0gPSBmaWx0ZXItPmRlY2F5X3BlYWtfYmFzZVtpXSA9IDAuMDsKKyAgICBmaWx0ZXItPmRlY2F5X3BlYWtfYWdlW2ldID0gR19HVUlOVDY0X0NPTlNUQU5UICgwKTsKKyAgfQorCisgIGdzdF9sZXZlbF9yZWNhbGNfaW50ZXJ2YWxfZnJhbWVzIChmaWx0ZXIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9sZXZlbF9zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zKQoreworICBHc3RMZXZlbCAqZmlsdGVyID0gR1NUX0xFVkVMICh0cmFucyk7CisKKyAgZmlsdGVyLT5udW1fZnJhbWVzID0gMDsKKyAgZmlsdGVyLT5tZXNzYWdlX3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdE1lc3NhZ2UgKgorZ3N0X2xldmVsX21lc3NhZ2VfbmV3IChHc3RMZXZlbCAqIGxldmVsLCBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLAorICAgIEdzdENsb2NrVGltZSBkdXJhdGlvbikKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybSAqdHJhbnMgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0FTVCAobGV2ZWwpOworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdWYWx1ZSB2ID0geyAwLCB9OworICBHc3RDbG9ja1RpbWUgZW5kdGltZSwgcnVubmluZ190aW1lLCBzdHJlYW1fdGltZTsKKworICBydW5uaW5nX3RpbWUgPSBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZ0cmFucy0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgdGltZXN0YW1wKTsKKyAgc3RyZWFtX3RpbWUgPSBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJnRyYW5zLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICB0aW1lc3RhbXApOworICAvKiBlbmR0aW1lIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworICBlbmR0aW1lID0gc3RyZWFtX3RpbWUgKyBkdXJhdGlvbjsKKworICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJsZXZlbCIsCisgICAgICAiZW5kdGltZSIsIEdTVF9UWVBFX0NMT0NLX1RJTUUsIGVuZHRpbWUsCisgICAgICAidGltZXN0YW1wIiwgR19UWVBFX1VJTlQ2NCwgdGltZXN0YW1wLAorICAgICAgInN0cmVhbS10aW1lIiwgR19UWVBFX1VJTlQ2NCwgc3RyZWFtX3RpbWUsCisgICAgICAicnVubmluZy10aW1lIiwgR19UWVBFX1VJTlQ2NCwgcnVubmluZ190aW1lLAorICAgICAgImR1cmF0aW9uIiwgR19UWVBFX1VJTlQ2NCwgZHVyYXRpb24sIE5VTEwpOworCisgIGdfdmFsdWVfaW5pdCAoJnYsIEdfVFlQRV9WQUxVRV9BUlJBWSk7CisgIGdfdmFsdWVfdGFrZV9ib3hlZCAoJnYsIGdfdmFsdWVfYXJyYXlfbmV3ICgwKSk7CisgIGdzdF9zdHJ1Y3R1cmVfdGFrZV92YWx1ZSAocywgInJtcyIsICZ2KTsKKworICBnX3ZhbHVlX2luaXQgKCZ2LCBHX1RZUEVfVkFMVUVfQVJSQVkpOworICBnX3ZhbHVlX3Rha2VfYm94ZWQgKCZ2LCBnX3ZhbHVlX2FycmF5X25ldyAoMCkpOworICBnc3Rfc3RydWN0dXJlX3Rha2VfdmFsdWUgKHMsICJwZWFrIiwgJnYpOworCisgIGdfdmFsdWVfaW5pdCAoJnYsIEdfVFlQRV9WQUxVRV9BUlJBWSk7CisgIGdfdmFsdWVfdGFrZV9ib3hlZCAoJnYsIGdfdmFsdWVfYXJyYXlfbmV3ICgwKSk7CisgIGdzdF9zdHJ1Y3R1cmVfdGFrZV92YWx1ZSAocywgImRlY2F5IiwgJnYpOworCisgIHJldHVybiBnc3RfbWVzc2FnZV9uZXdfZWxlbWVudCAoR1NUX09CSkVDVCAobGV2ZWwpLCBzKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9sZXZlbF9tZXNzYWdlX2FwcGVuZF9jaGFubmVsIChHc3RNZXNzYWdlICogbSwgZ2RvdWJsZSBybXMsIGdkb3VibGUgcGVhaywKKyAgICBnZG91YmxlIGRlY2F5KQoreworICBjb25zdCBHVmFsdWUgKmFycmF5X3ZhbDsKKyAgR3N0U3RydWN0dXJlICpzOworICBHVmFsdWVBcnJheSAqYXJyOworICBHVmFsdWUgdiA9IHsgMCwgfTsKKworICBnX3ZhbHVlX2luaXQgKCZ2LCBHX1RZUEVfRE9VQkxFKTsKKworICBzID0gKEdzdFN0cnVjdHVyZSAqKSBnc3RfbWVzc2FnZV9nZXRfc3RydWN0dXJlIChtKTsKKworICBhcnJheV92YWwgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgInJtcyIpOworICBhcnIgPSAoR1ZhbHVlQXJyYXkgKikgZ192YWx1ZV9nZXRfYm94ZWQgKGFycmF5X3ZhbCk7CisgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIHJtcyk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kIChhcnIsICZ2KTsgICAgICAgLyogY29waWVzIGJ5IHZhbHVlICovCisKKyAgYXJyYXlfdmFsID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJwZWFrIik7CisgIGFyciA9IChHVmFsdWVBcnJheSAqKSBnX3ZhbHVlX2dldF9ib3hlZCAoYXJyYXlfdmFsKTsKKyAgZ192YWx1ZV9zZXRfZG91YmxlICgmdiwgcGVhayk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kIChhcnIsICZ2KTsgICAgICAgLyogY29waWVzIGJ5IHZhbHVlICovCisKKyAgYXJyYXlfdmFsID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJkZWNheSIpOworICBhcnIgPSAoR1ZhbHVlQXJyYXkgKikgZ192YWx1ZV9nZXRfYm94ZWQgKGFycmF5X3ZhbCk7CisgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIGRlY2F5KTsKKyAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKGFyciwgJnYpOyAgICAgICAvKiBjb3BpZXMgYnkgdmFsdWUgKi8KKworICBnX3ZhbHVlX3Vuc2V0ICgmdik7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbGV2ZWxfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEJ1ZmZlciAqIGluKQoreworICBHc3RMZXZlbCAqZmlsdGVyOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4ICppbl9kYXRhOworICBnc2l6ZSBpbl9zaXplOworICBnZG91YmxlIENTOworICBndWludCBpOworICBndWludCBudW1fZnJhbWVzOworICBndWludCBudW1faW50X3NhbXBsZXMgPSAwOyAgICAvKiBudW1iZXIgb2YgaW50ZXJsZWF2ZWQgc2FtcGxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpZS4gdG90YWwgY291bnQgZm9yIGFsbCBjaGFubmVscyBjb21iaW5lZCAqLworICBndWludCBibG9ja19zaXplLCBibG9ja19pbnRfc2l6ZTsgICAgIC8qIHdlIHN1YmRpdmlkZSBidWZmZXJzIHRvIG5vdCBza2lwIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbnRlcnZhbHMgKi8KKyAgR3N0Q2xvY2tUaW1lRGlmZiBmYWxsb2ZmX3RpbWU7CisgIGdpbnQgY2hhbm5lbHMsIHJhdGUsIGJwczsKKworICBmaWx0ZXIgPSBHU1RfTEVWRUwgKHRyYW5zKTsKKworICBjaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTICgmZmlsdGVyLT5pbmZvKTsKKyAgYnBzID0gR1NUX0FVRElPX0lORk9fQlBTICgmZmlsdGVyLT5pbmZvKTsKKyAgcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKCZmaWx0ZXItPmluZm8pOworCisgIGdzdF9idWZmZXJfbWFwIChpbiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgaW5fZGF0YSA9IG1hcC5kYXRhOworICBpbl9zaXplID0gbWFwLnNpemU7CisKKyAgbnVtX2ludF9zYW1wbGVzID0gaW5fc2l6ZSAvIGJwczsKKworICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAiYW5hbHl6aW5nICV1IHNhbXBsZSBmcmFtZXMgYXQgdHMgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgbnVtX2ludF9zYW1wbGVzLCBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW4pKSk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKG51bV9pbnRfc2FtcGxlcyAlIGNoYW5uZWxzID09IDAsIEdTVF9GTE9XX0VSUk9SKTsKKworICBpZiAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoaW4sIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKSkgeworICAgIGZpbHRlci0+bWVzc2FnZV90cyA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbik7CisgICAgZmlsdGVyLT5udW1fZnJhbWVzID0gMDsKKyAgfQorICBpZiAoR19VTkxJS0VMWSAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChmaWx0ZXItPm1lc3NhZ2VfdHMpKSkgeworICAgIGZpbHRlci0+bWVzc2FnZV90cyA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbik7CisgIH0KKworICBudW1fZnJhbWVzID0gbnVtX2ludF9zYW1wbGVzIC8gY2hhbm5lbHM7CisgIHdoaWxlIChudW1fZnJhbWVzID4gMCkgeworICAgIGJsb2NrX3NpemUgPSBmaWx0ZXItPmludGVydmFsX2ZyYW1lcyAtIGZpbHRlci0+bnVtX2ZyYW1lczsKKyAgICBibG9ja19zaXplID0gTUlOIChibG9ja19zaXplLCBudW1fZnJhbWVzKTsKKyAgICBibG9ja19pbnRfc2l6ZSA9IGJsb2NrX3NpemUgKiBjaGFubmVsczsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgKytpKSB7CisgICAgICBpZiAoIUdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGluLCBHU1RfQlVGRkVSX0ZMQUdfR0FQKSkgeworICAgICAgICBmaWx0ZXItPnByb2Nlc3MgKGluX2RhdGEgKyAoYnBzICogaSksIGJsb2NrX2ludF9zaXplLCBjaGFubmVscywgJkNTLAorICAgICAgICAgICAgJmZpbHRlci0+cGVha1tpXSk7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsCisgICAgICAgICAgICAiWyVkXTogY3VtdWxhdGl2ZSBzcXVhcmVzICVsZiwgb3ZlciAlZCBzYW1wbGVzLyVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgIGksIENTLCBibG9ja19pbnRfc2l6ZSwgY2hhbm5lbHMpOworICAgICAgICBmaWx0ZXItPkNTW2ldICs9IENTOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsdGVyLT5wZWFrW2ldID0gMC4wOworICAgICAgfQorCisgICAgICBmaWx0ZXItPmRlY2F5X3BlYWtfYWdlW2ldICs9IEdTVF9GUkFNRVNfVE9fQ0xPQ0tfVElNRSAobnVtX2ZyYW1lcywgcmF0ZSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLAorICAgICAgICAgICJbJWRdOiBwZWFrICVmLCBsYXN0IHBlYWsgJWYsIGRlY2F5IHBlYWsgJWYsIGFnZSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgaSwgZmlsdGVyLT5wZWFrW2ldLCBmaWx0ZXItPmxhc3RfcGVha1tpXSwgZmlsdGVyLT5kZWNheV9wZWFrW2ldLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGZpbHRlci0+ZGVjYXlfcGVha19hZ2VbaV0pKTsKKworICAgICAgLyogdXBkYXRlIHJ1bm5pbmcgcGVhayAqLworICAgICAgaWYgKGZpbHRlci0+cGVha1tpXSA+IGZpbHRlci0+bGFzdF9wZWFrW2ldKQorICAgICAgICBmaWx0ZXItPmxhc3RfcGVha1tpXSA9IGZpbHRlci0+cGVha1tpXTsKKworICAgICAgLyogbWFrZSBkZWNheSBwZWFrIGZhbGwgb2ZmIGlmIHRvbyBvbGQgKi8KKyAgICAgIGZhbGxvZmZfdGltZSA9CisgICAgICAgICAgR1NUX0NMT0NLX0RJRkYgKGdzdF9nZG91YmxlX3RvX2d1aW50NjQgKGZpbHRlci0+ZGVjYXlfcGVha190dGwpLAorICAgICAgICAgIGZpbHRlci0+ZGVjYXlfcGVha19hZ2VbaV0pOworICAgICAgaWYgKGZhbGxvZmZfdGltZSA+IDApIHsKKyAgICAgICAgZ2RvdWJsZSBmYWxsb2ZmX2RCOworICAgICAgICBnZG91YmxlIGZhbGxvZmY7CisgICAgICAgIGdkb3VibGUgbGVuZ3RoOyAgICAgICAgIC8qIGxlbmd0aCBvZiBmYWxsb2ZmIHRpbWUgaW4gc2Vjb25kcyAqLworCisgICAgICAgIGxlbmd0aCA9IChnZG91YmxlKSBmYWxsb2ZmX3RpbWUgLyAoZ2RvdWJsZSkgR1NUX1NFQ09ORDsKKyAgICAgICAgZmFsbG9mZl9kQiA9IGZpbHRlci0+ZGVjYXlfcGVha19mYWxsb2ZmICogbGVuZ3RoOworICAgICAgICBmYWxsb2ZmID0gcG93ICgxMCwgZmFsbG9mZl9kQiAvIC0yMC4wKTsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLAorICAgICAgICAgICAgImZhbGxvZmY6IGN1cnJlbnQgJWYsIGJhc2UgJWYsIGludGVydmFsICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAgICAgIiwgZEIgZmFsbG9mZiAlZiwgZmFjdG9yICVlIiwKKyAgICAgICAgICAgIGZpbHRlci0+ZGVjYXlfcGVha1tpXSwgZmlsdGVyLT5kZWNheV9wZWFrX2Jhc2VbaV0sCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChmYWxsb2ZmX3RpbWUpLCBmYWxsb2ZmX2RCLCBmYWxsb2ZmKTsKKyAgICAgICAgZmlsdGVyLT5kZWNheV9wZWFrW2ldID0gZmlsdGVyLT5kZWNheV9wZWFrX2Jhc2VbaV0gKiBmYWxsb2ZmOworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLAorICAgICAgICAgICAgInBlYWsgaXMgJSIgR1NUX1RJTUVfRk9STUFUICIgb2xkLCBkZWNheWVkIHdpdGggZmFjdG9yICVlIHRvICVmIiwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGZpbHRlci0+ZGVjYXlfcGVha19hZ2VbaV0pLCBmYWxsb2ZmLAorICAgICAgICAgICAgZmlsdGVyLT5kZWNheV9wZWFrW2ldKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICJwZWFrIG5vdCBvbGQgZW5vdWdoLCBub3QgZGVjYXlpbmciKTsKKyAgICAgIH0KKworICAgICAgLyogaWYgdGhlIHBlYWsgb2YgdGhpcyBydW4gaXMgaGlnaGVyLCB0aGUgZGVjYXkgcGVhayBnZXRzIHJlc2V0ICovCisgICAgICBpZiAoZmlsdGVyLT5wZWFrW2ldID49IGZpbHRlci0+ZGVjYXlfcGVha1tpXSkgeworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAibmV3IHBlYWssICVmIiwgZmlsdGVyLT5wZWFrW2ldKTsKKyAgICAgICAgZmlsdGVyLT5kZWNheV9wZWFrW2ldID0gZmlsdGVyLT5wZWFrW2ldOworICAgICAgICBmaWx0ZXItPmRlY2F5X3BlYWtfYmFzZVtpXSA9IGZpbHRlci0+cGVha1tpXTsKKyAgICAgICAgZmlsdGVyLT5kZWNheV9wZWFrX2FnZVtpXSA9IEdfR0lOVDY0X0NPTlNUQU5UICgwKTsKKyAgICAgIH0KKyAgICB9CisgICAgaW5fZGF0YSArPSBibG9ja19zaXplICogYnBzICogY2hhbm5lbHM7CisKKyAgICBmaWx0ZXItPm51bV9mcmFtZXMgKz0gYmxvY2tfc2l6ZTsKKyAgICBudW1fZnJhbWVzIC09IGJsb2NrX3NpemU7CisKKyAgICAvKiBkbyB3ZSBuZWVkIHRvIG1lc3NhZ2UgPyAqLworICAgIGlmIChmaWx0ZXItPm51bV9mcmFtZXMgPj0gZmlsdGVyLT5pbnRlcnZhbF9mcmFtZXMpIHsKKyAgICAgIGdzdF9sZXZlbF9wb3N0X21lc3NhZ2UgKGZpbHRlcik7CisgICAgfQorICB9CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW4sICZtYXApOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2dzdF9sZXZlbF9wb3N0X21lc3NhZ2UgKEdzdExldmVsICogZmlsdGVyKQoreworICBndWludCBpOworICBnaW50IGNoYW5uZWxzLCByYXRlLCBmcmFtZXMgPSBmaWx0ZXItPm51bV9mcmFtZXM7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKKworICBjaGFubmVscyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTICgmZmlsdGVyLT5pbmZvKTsKKyAgcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKCZmaWx0ZXItPmluZm8pOworICBkdXJhdGlvbiA9IEdTVF9GUkFNRVNfVE9fQ0xPQ0tfVElNRSAoZnJhbWVzLCByYXRlKTsKKworICBpZiAoZmlsdGVyLT5wb3N0X21lc3NhZ2VzKSB7CisgICAgR3N0TWVzc2FnZSAqbSA9CisgICAgICAgIGdzdF9sZXZlbF9tZXNzYWdlX25ldyAoZmlsdGVyLCBmaWx0ZXItPm1lc3NhZ2VfdHMsIGR1cmF0aW9uKTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsCisgICAgICAgICJtZXNzYWdlOiB0cyAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZHVyYXRpb24gJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICIsIG51bV9mcmFtZXMgJWQiLCBHU1RfVElNRV9BUkdTIChmaWx0ZXItPm1lc3NhZ2VfdHMpLAorICAgICAgICBHU1RfVElNRV9BUkdTIChkdXJhdGlvbiksIGZyYW1lcyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7ICsraSkgeworICAgICAgZ2RvdWJsZSBSTVM7CisgICAgICBnZG91YmxlIFJNU2RCLCBwZWFrZEIsIGRlY2F5ZEI7CisKKyAgICAgIFJNUyA9IHNxcnQgKGZpbHRlci0+Q1NbaV0gLyBmcmFtZXMpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwKKyAgICAgICAgICAibWVzc2FnZTogY2hhbm5lbCAlZCwgQ1MgJWYsIFJNUyAlZiIsIGksIGZpbHRlci0+Q1NbaV0sIFJNUyk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLAorICAgICAgICAgICJtZXNzYWdlOiBsYXN0X3BlYWs6ICVmLCBkZWNheV9wZWFrOiAlZiIsCisgICAgICAgICAgZmlsdGVyLT5sYXN0X3BlYWtbaV0sIGZpbHRlci0+ZGVjYXlfcGVha1tpXSk7CisgICAgICAvKiBSTVMgdmFsdWVzIGFyZSBjYWxjdWxhdGVkIGluIGFtcGxpdHVkZSwgc28gMjAgKiBsb2cgMTAgKi8KKyAgICAgIFJNU2RCID0gMjAgKiBsb2cxMCAoUk1TICsgRVBTSUxPTik7CisgICAgICAvKiBwZWFrIHZhbHVlcyBhcmUgc3F1YXJlIHN1bXMsIGllLiBwb3dlciwgc28gMTAgKiBsb2cgMTAgKi8KKyAgICAgIHBlYWtkQiA9IDEwICogbG9nMTAgKGZpbHRlci0+bGFzdF9wZWFrW2ldICsgRVBTSUxPTik7CisgICAgICBkZWNheWRCID0gMTAgKiBsb2cxMCAoZmlsdGVyLT5kZWNheV9wZWFrW2ldICsgRVBTSUxPTik7CisKKyAgICAgIGlmIChmaWx0ZXItPmRlY2F5X3BlYWtbaV0gPCBmaWx0ZXItPmxhc3RfcGVha1tpXSkgeworICAgICAgICAvKiB0aGlzIGNhbiBoYXBwZW4gaW4gY2VydGFpbiBjYXNlcywgZm9yIGV4YW1wbGUgd2hlbgorICAgICAgICAgKiB0aGUgbGFzdCBwZWFrIGlzIGJldHdlZW4gZGVjYXlfcGVhayBhbmQgZGVjYXlfcGVha19iYXNlICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwKKyAgICAgICAgICAgICJtZXNzYWdlOiBkZWNheSBwZWFrIGRCICVmIHNtYWxsZXIgdGhhbiBsYXN0IHBlYWsgZEIgJWYsIGNvcHlpbmciLAorICAgICAgICAgICAgZGVjYXlkQiwgcGVha2RCKTsKKyAgICAgICAgZmlsdGVyLT5kZWNheV9wZWFrW2ldID0gZmlsdGVyLT5sYXN0X3BlYWtbaV07CisgICAgICB9CisgICAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLAorICAgICAgICAgICJtZXNzYWdlOiBSTVMgJWYgZEIsIHBlYWsgJWYgZEIsIGRlY2F5ICVmIGRCIiwKKyAgICAgICAgICBSTVNkQiwgcGVha2RCLCBkZWNheWRCKTsKKworICAgICAgZ3N0X2xldmVsX21lc3NhZ2VfYXBwZW5kX2NoYW5uZWwgKG0sIFJNU2RCLCBwZWFrZEIsIGRlY2F5ZEIpOworCisgICAgICAvKiByZXNldCBjdW11bGF0aXZlIGFuZCBub3JtYWwgcGVhayAqLworICAgICAgZmlsdGVyLT5DU1tpXSA9IDAuMDsKKyAgICAgIGZpbHRlci0+bGFzdF9wZWFrW2ldID0gMC4wOworICAgIH0KKworICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKGZpbHRlciksIG0pOworCisgIH0KKyAgZmlsdGVyLT5udW1fZnJhbWVzIC09IGZyYW1lczsKKyAgZmlsdGVyLT5tZXNzYWdlX3RzICs9IGR1cmF0aW9uOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2xldmVsX3NpbmtfZXZlbnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX0VPUykgeworICAgIEdzdExldmVsICpmaWx0ZXIgPSBHU1RfTEVWRUwgKHRyYW5zKTsKKworICAgIGdzdF9sZXZlbF9wb3N0X21lc3NhZ2UgKGZpbHRlcik7CisgIH0KKworICByZXR1cm4gR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50ICh0cmFucywgZXZlbnQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAibGV2ZWwiLCBHU1RfUkFOS19OT05FLCBHU1RfVFlQRV9MRVZFTCk7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBsZXZlbCwKKyAgICAiQXVkaW8gbGV2ZWwgcGx1Z2luIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9nc3QvbGV2ZWwvZ3N0bGV2ZWwuaCBiL2dzdC9sZXZlbC9nc3RsZXZlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZDkyN2EKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbGV2ZWwvZ3N0bGV2ZWwuaApAQCAtMCwwICsxLDkyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEsMjAwMiwyMDAzLDIwMDUKKyAqICAgICAgICAgICBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX0xFVkVMX0hfXworI2RlZmluZSBfX0dTVF9MRVZFTF9IX18KKworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworR19CRUdJTl9ERUNMUworCisKKyNkZWZpbmUgR1NUX1RZUEVfTEVWRUwgXAorICAoZ3N0X2xldmVsX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9MRVZFTChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0xFVkVMLEdzdExldmVsKSkKKyNkZWZpbmUgR1NUX0xFVkVMX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0xFVkVMLEdzdExldmVsQ2xhc3MpKQorI2RlZmluZSBHU1RfTEVWRUxfR0VUX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUygob2JqKSxHU1RfVFlQRV9MRVZFTCxHc3RMZXZlbENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0xFVkVMKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfTEVWRUwpKQorI2RlZmluZSBHU1RfSVNfTEVWRUxfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfTEVWRUwpKQorCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RMZXZlbCBHc3RMZXZlbDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RMZXZlbENsYXNzIEdzdExldmVsQ2xhc3M7CisKKy8qKgorICogR3N0TGV2ZWw6CisgKgorICogT3BhcXVlIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdExldmVsIHsKKyAgR3N0QmFzZVRyYW5zZm9ybSBlbGVtZW50OworCisgIC8qIHByb3BlcnRpZXMgKi8KKyAgZ2Jvb2xlYW4gcG9zdF9tZXNzYWdlczsgICAgICAgLyogd2hldGhlciBvciBub3QgdG8gcG9zdCBtZXNzYWdlcyAqLworICBndWludDY0IGludGVydmFsOyAgICAgICAgICAgICAvKiBob3cgbWFueSBuYW5vc2Vjb25kcyBiZXR3ZWVuIGVtaXRzICovCisgIGdkb3VibGUgZGVjYXlfcGVha190dGw7ICAgICAgIC8qIHRpbWUgdG8gbGl2ZSBmb3IgcGVhayBpbiBuYW5vc2Vjb25kcyAqLworICBnZG91YmxlIGRlY2F5X3BlYWtfZmFsbG9mZjsgICAvKiBmYWxsb2ZmIGluIGRCL3NlYyAqLworCisgIEdzdEF1ZGlvSW5mbyBpbmZvOworICBnaW50IG51bV9mcmFtZXM7ICAgICAgICAgICAgICAvKiBmcmFtZSBjb3VudCAoMSBzYW1wbGUgcGVyIGNoYW5uZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpbmNlIGxhc3QgZW1pdCAqLworICBnaW50IGludGVydmFsX2ZyYW1lczsgICAgICAgICAvKiBhZnRlciBob3cgbWFueSBmcmFtZSB0byBzZW50IGEgbWVzc2FnZSAqLworICBHc3RDbG9ja1RpbWUgbWVzc2FnZV90czsgICAgICAvKiBzdGFydHRpbWUgZm9yIG5leHQgbWVzc2FnZSAqLworCisgIC8qIHBlci1jaGFubmVsIGFycmF5cyBmb3IgaW50ZXJtZWRpYXRlIHZhbHVlcyAqLworICBnZG91YmxlICpDUzsgICAgICAgICAgICAgICAgICAvKiBub3JtYWxpemVkIEN1bXVsYXRpdmUgU3F1YXJlICovCisgIGdkb3VibGUgKnBlYWs7ICAgICAgICAgICAgICAgIC8qIG5vcm1hbGl6ZWQgUGVhayB2YWx1ZSBvdmVyIGJ1ZmZlciAqLworICBnZG91YmxlICpsYXN0X3BlYWs7ICAgICAgICAgICAvKiBsYXN0IG5vcm1hbGl6ZWQgUGVhayB2YWx1ZSBvdmVyIGludGVydmFsICovCisgIGdkb3VibGUgKmRlY2F5X3BlYWs7ICAgICAgICAgIC8qIHJ1bm5pbmcgZGVjYXlpbmcgbm9ybWFsaXplZCBQZWFrICovCisgIGdkb3VibGUgKmRlY2F5X3BlYWtfYmFzZTsgICAgIC8qIHZhbHVlIG9mIGxhc3QgcGVhayB3ZSBhcmUgZGVjYXlpbmcgZnJvbSAqLworICBHc3RDbG9ja1RpbWUgKmRlY2F5X3BlYWtfYWdlOyAvKiBhZ2Ugb2YgbGFzdCBwZWFrICovCisKKyAgdm9pZCAoKnByb2Nlc3MpKGdwb2ludGVyLCBndWludCwgZ3VpbnQsIGdkb3VibGUqLCBnZG91YmxlKik7Cit9OworCitzdHJ1Y3QgX0dzdExldmVsQ2xhc3MgeworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2xldmVsX2dldF90eXBlICh2b2lkKTsKKworCitHX0VORF9ERUNMUworCisKKyNlbmRpZiAvKiBfX0dTVF9MRVZFTF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9sZXZlbC9tZXNvbi5idWlsZCBiL2dzdC9sZXZlbC9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGFjNGM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L2xldmVsL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsOCBAQAorZ3N0bGV2ZWwgPSBsaWJyYXJ5KCdnc3RsZXZlbCcsCisgICdnc3RsZXZlbC5jJywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0YXVkaW9fZGVwLCBsaWJtXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2dzdC9tYXRyb3NrYS9NYWtlZmlsZS5hbSBiL2dzdC9tYXRyb3NrYS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGU5ODY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21hdHJvc2thL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDMgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdG1hdHJvc2thLmxhCisKK2xpYmdzdG1hdHJvc2thX2xhX1NPVVJDRVMgPSBcCisJZWJtbC1yZWFkLmMgXAorCWVibWwtd3JpdGUuYyBcCisJbWF0cm9za2EuYyBcCisJbWF0cm9za2EtZGVtdXguYyBcCisJbWF0cm9za2EtcGFyc2UuYyBcCisJbWF0cm9za2EtaWRzLmMgXAorCW1hdHJvc2thLW11eC5jIFwKKwltYXRyb3NrYS1yZWFkLWNvbW1vbi5jIFwKKwl3ZWJtLW11eC5jIFwKKwlsem8uYworCitub2luc3RfSEVBREVSUyA9IFwKKwllYm1sLWlkcy5oIFwKKwllYm1sLXJlYWQuaCBcCisJZWJtbC13cml0ZS5oIFwKKwltYXRyb3NrYS1kZW11eC5oIFwKKwltYXRyb3NrYS1wYXJzZS5oIFwKKwltYXRyb3NrYS1pZHMuaCBcCisJbWF0cm9za2EtbXV4LmggXAorCW1hdHJvc2thLXJlYWQtY29tbW9uLmggXAorCXdlYm0tbXV4LmggXAorCWx6by5oCisKK2xpYmdzdG1hdHJvc2thX2xhX0NGTEFHUyA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9DRkxBR1MpCitsaWJnc3RtYXRyb3NrYV9sYV9MSUJBREQgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwktbGdzdHJpZmYtQEdTVF9BUElfVkVSU0lPTkAgXAorCS1sZ3N0YXVkaW8tQEdTVF9BUElfVkVSU0lPTkAgXAorCS1sZ3N0dmlkZW8tQEdTVF9BUElfVkVSU0lPTkAgXAorCS1sZ3N0dGFnLUBHU1RfQVBJX1ZFUlNJT05AIFwKKwktbGdzdHBidXRpbHMtQEdTVF9BUElfVkVSU0lPTkAgXAorCSQoR1NUX0JBU0VfTElCUykgXAorCSQoR1NUX0xJQlMpIFwKKwkkKFpMSUJfTElCUykgXAorCSQoQloyX0xJQlMpIFwKKwkkKExJQk0pCitsaWJnc3RtYXRyb3NrYV9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2EvZWJtbC1pZHMuaCBiL2dzdC9tYXRyb3NrYS9lYm1sLWlkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMmU2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbWF0cm9za2EvZWJtbC1pZHMuaApAQCAtMCwwICsxLDU0IEBACisvKiBHU3RyZWFtZXIgRUJNTCBJL08KKyAqIChjKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqCisgKiBlYm1sLWlkcy5oOiBkZWZpbml0aW9uIG9mIEVCTUwgZGF0YSBJRHMKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0VCTUxfSURTX0hfXworI2RlZmluZSBfX0dTVF9FQk1MX0lEU19IX18KKworR19CRUdJTl9ERUNMUworCisvKiBFQk1MIHZlcnNpb24gc3VwcG9ydGVkICovCisjZGVmaW5lIEdTVF9FQk1MX1ZFUlNJT04gMQorCisvKiBVbmtub3duIHNpemUgKGFsbCBiaXRzIHNldCB0byAxKSAqLworI2RlZmluZSBHU1RfRUJNTF9TSVpFX1VOS05PV04gICAgICAgICAgR19HSU5UNjRfQ09OU1RBTlQoMHgwMGZmZmZmZmZmZmZmZmZmKQorCisvKiB0b3AtbGV2ZWwgbWFzdGVyLUlEcyAqLworI2RlZmluZSBHU1RfRUJNTF9JRF9IRUFERVIgICAgICAgICAgICAgMHgxQTQ1REZBMworCisvKiBJRHMgaW4gdGhlIEhFQURFUiBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX0VCTUxfSURfRUJNTFZFUlNJT04gICAgICAgIDB4NDI4NgorI2RlZmluZSBHU1RfRUJNTF9JRF9FQk1MUkVBRFZFUlNJT04gICAgMHg0MkY3CisjZGVmaW5lIEdTVF9FQk1MX0lEX0VCTUxNQVhJRExFTkdUSCAgICAweDQyRjIKKyNkZWZpbmUgR1NUX0VCTUxfSURfRUJNTE1BWFNJWkVMRU5HVEggIDB4NDJGMworI2RlZmluZSBHU1RfRUJNTF9JRF9ET0NUWVBFICAgICAgICAgICAgMHg0MjgyCisjZGVmaW5lIEdTVF9FQk1MX0lEX0RPQ1RZUEVWRVJTSU9OICAgICAweDQyODcKKyNkZWZpbmUgR1NUX0VCTUxfSURfRE9DVFlQRVJFQURWRVJTSU9OIDB4NDI4NQorCisvKiBnZW5lcmFsIEVCTUwgdHlwZXMgKi8KKyNkZWZpbmUgR1NUX0VCTUxfSURfVk9JRCAgICAgICAgICAgICAgIDB4RUMKKyNkZWZpbmUgR1NUX0VCTUxfSURfQ1JDMzIgICAgICAgICAgICAgIDB4QkYKKworLyogRWJtbERhdGUgb2Zmc2V0IGZyb20gdGhlIHVuaXggZXBvY2ggaW4gc2Vjb25kcywgMjAwMS8wMS8wMSAwMDowMDowMCBVVEMgKi8KKyNkZWZpbmUgR1NUX0VCTUxfREFURV9PRkZTRVQgICAgICAgICAgIDk3ODMwNzIwMAorCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfRUJNTF9JRFNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2EvZWJtbC1yZWFkLmMgYi9nc3QvbWF0cm9za2EvZWJtbC1yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4OTNmMQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tYXRyb3NrYS9lYm1sLXJlYWQuYwpAQCAtMCwwICsxLDY2OSBAQAorLyogR1N0cmVhbWVyIEVCTUwgSS9PCisgKiAoYykgMjAwMyBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKgorICogZWJtbC1yZWFkLmM6IHJlYWQgRUJNTCBkYXRhIGZyb20gZmlsZS9zdHJlYW0KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImVibWwtcmVhZC5oIgorI2luY2x1ZGUgImVibWwtaWRzLmgiCisKKyNpbmNsdWRlIDxnc3QvbWF0aC1jb21wYXQuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZIChlYm1scmVhZF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBlYm1scmVhZF9kZWJ1ZworCisvKiBQZWVrcyBmb2xsb3dpbmcgZWxlbWVudCBpZCBhbmQgZWxlbWVudCBsZW5ndGggaW4gZGF0YXN0cmVhbSBwcm92aWRlZAorICogYnkgQHBlZWsgd2l0aCBAY3R4IGFzIHVzZXIgZGF0YS4KKyAqIFJldHVybnMgR1NUX0ZMT1dfRU9TIGlmIG5vdCBlbm91Z2ggZGF0YSB0byByZWFkIGlkIGFuZCBsZW5ndGguCisgKiBPdGhlcndpc2UsIEBuZWVkZWQgcHJvdmlkZXMgdGhlIHByZWZpeCBsZW5ndGggKGlkICsgbGVuZ3RoKSwgYW5kCisgKiBAbGVuZ3RoIHByb3ZpZGVzIGVsZW1lbnQgbGVuZ3RoLgorICoKKyAqIEBvYmplY3QgYW5kIEBvZmZzZXQgYXJlIHByb3ZpZGVkIGZvciBpbmZvcm1hdGl2ZSBtZXNzYWdpbmcvZGVidWcgcHVycG9zZXMuCisgKi8KK0dzdEZsb3dSZXR1cm4KK2dzdF9lYm1sX3BlZWtfaWRfbGVuZ3RoIChndWludDMyICogX2lkLCBndWludDY0ICogX2xlbmd0aCwgZ3VpbnQgKiBfbmVlZGVkLAorICAgIEdzdFBlZWtEYXRhIHBlZWssIGdwb2ludGVyICogY3R4LCBHc3RFbGVtZW50ICogZWwsIGd1aW50NjQgb2Zmc2V0KQoreworICBndWludCBuZWVkZWQ7CisgIGNvbnN0IGd1aW50OCAqYnVmOworICBnaW50IGxlbl9tYXNrID0gMHg4MCwgcmVhZCA9IDEsIG4gPSAxLCBudW1fZmZzID0gMDsKKyAgZ3VpbnQ2NCB0b3RhbDsKKyAgZ3VpbnQ4IGI7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChfaWQgIT0gTlVMTCwgR1NUX0ZMT1dfRVJST1IpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoX2xlbmd0aCAhPSBOVUxMLCBHU1RfRkxPV19FUlJPUik7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChfbmVlZGVkICE9IE5VTEwsIEdTVF9GTE9XX0VSUk9SKTsKKworICAvKiB3ZWxsIC4uLiAqLworICAqX2lkID0gKGd1aW50MzIpIEdTVF9FQk1MX1NJWkVfVU5LTk9XTjsKKyAgKl9sZW5ndGggPSBHU1RfRUJNTF9TSVpFX1VOS05PV047CisKKyAgLyogcmVhZCBlbGVtZW50IGlkICovCisgIG5lZWRlZCA9IDI7CisgIHJldCA9IHBlZWsgKGN0eCwgbmVlZGVkLCAmYnVmKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIHBlZWtfZXJyb3I7CisgIGIgPSBHU1RfUkVBRF9VSU5UOCAoYnVmKTsKKyAgdG90YWwgPSAoZ3VpbnQ2NCkgYjsKKyAgd2hpbGUgKHJlYWQgPD0gNCAmJiAhKHRvdGFsICYgbGVuX21hc2spKSB7CisgICAgcmVhZCsrOworICAgIGxlbl9tYXNrID4+PSAxOworICB9CisgIGlmIChHX1VOTElLRUxZIChyZWFkID4gNCkpCisgICAgZ290byBpbnZhbGlkX2lkOworCisgIC8qIG5lZWQgaWQgYW5kIGF0IGxlYXN0IHNvbWV0aGluZyBmb3Igc3Vic2VxdWVudCBsZW5ndGggKi8KKyAgbmVlZGVkID0gcmVhZCArIDE7CisgIHJldCA9IHBlZWsgKGN0eCwgbmVlZGVkLCAmYnVmKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIHBlZWtfZXJyb3I7CisgIHdoaWxlIChuIDwgcmVhZCkgeworICAgIGIgPSBHU1RfUkVBRF9VSU5UOCAoYnVmICsgbik7CisgICAgdG90YWwgPSAodG90YWwgPDwgOCkgfCBiOworICAgICsrbjsKKyAgfQorICAqX2lkID0gKGd1aW50MzIpIHRvdGFsOworCisgIC8qIHJlYWQgZWxlbWVudCBsZW5ndGggKi8KKyAgYiA9IEdTVF9SRUFEX1VJTlQ4IChidWYgKyBuKTsKKyAgdG90YWwgPSAoZ3VpbnQ2NCkgYjsKKyAgbGVuX21hc2sgPSAweDgwOworICByZWFkID0gMTsKKyAgd2hpbGUgKHJlYWQgPD0gOCAmJiAhKHRvdGFsICYgbGVuX21hc2spKSB7CisgICAgcmVhZCsrOworICAgIGxlbl9tYXNrID4+PSAxOworICB9CisgIGlmIChHX1VOTElLRUxZIChyZWFkID4gOCkpCisgICAgZ290byBpbnZhbGlkX2xlbmd0aDsKKyAgaWYgKCh0b3RhbCAmPSAobGVuX21hc2sgLSAxKSkgPT0gbGVuX21hc2sgLSAxKQorICAgIG51bV9mZnMrKzsKKworICBuZWVkZWQgKz0gcmVhZCAtIDE7CisgIHJldCA9IHBlZWsgKGN0eCwgbmVlZGVkLCAmYnVmKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIHBlZWtfZXJyb3I7CisgIGJ1ZiArPSAobmVlZGVkIC0gcmVhZCk7CisgIG4gPSAxOworICB3aGlsZSAobiA8IHJlYWQpIHsKKyAgICBndWludDggYiA9IEdTVF9SRUFEX1VJTlQ4IChidWYgKyBuKTsKKworICAgIGlmIChHX1VOTElLRUxZIChiID09IDB4ZmYpKQorICAgICAgbnVtX2ZmcysrOworICAgIHRvdGFsID0gKHRvdGFsIDw8IDgpIHwgYjsKKyAgICArK247CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAocmVhZCA9PSBudW1fZmZzKSkKKyAgICAqX2xlbmd0aCA9IEdfTUFYVUlOVDY0OworICBlbHNlCisgICAgKl9sZW5ndGggPSB0b3RhbDsKKworICAqX25lZWRlZCA9IG5lZWRlZDsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCitwZWVrX2Vycm9yOgorICB7CisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19GTFVTSElORyAmJiByZXQgIT0gR1NUX0ZMT1dfRU9TKQorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbCwgInBlZWsgZmFpbGVkLCByZXQgPSAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICBlbHNlCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChlbCwgInBlZWsgZmFpbGVkLCByZXQgPSAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICAqX25lZWRlZCA9IG5lZWRlZDsKKyAgICByZXR1cm4gcmV0OworICB9CitpbnZhbGlkX2lkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZWwsCisgICAgICAgICJJbnZhbGlkIEVCTUwgSUQgc2l6ZSB0YWcgKDB4JXgpIGF0IHBvc2l0aW9uICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiAoMHglIgorICAgICAgICBHX0dJTlQ2NF9NT0RJRklFUiAieCkiLCAoZ3VpbnQpIGIsIG9mZnNldCwgb2Zmc2V0KTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2ludmFsaWRfbGVuZ3RoOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZWwsCisgICAgICAgICJJbnZhbGlkIEVCTUwgbGVuZ3RoIHNpemUgdGFnICgweCV4KSBhdCBwb3NpdGlvbiAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICIgKDB4JSIgR19HSU5UNjRfTU9ESUZJRVIgIngpIiwgKGd1aW50KSBiLCBvZmZzZXQsIG9mZnNldCk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKKy8qIHNldHVwIGZvciBwYXJzaW5nIEBidWYgYXQgcG9zaXRpb24gQG9mZnNldCBvbiBiZWhhbGYgb2YgQGVsLgorICogVGFrZXMgb3duZXJzaGlwIG9mIEBidWYuICovCit2b2lkCitnc3RfZWJtbF9yZWFkX2luaXQgKEdzdEVibWxSZWFkICogZWJtbCwgR3N0RWxlbWVudCAqIGVsLCBHc3RCdWZmZXIgKiBidWYsCisgICAgZ3VpbnQ2NCBvZmZzZXQpCit7CisgIEdzdEVibWxNYXN0ZXIgbTsKKworICBnX3JldHVybl9pZl9mYWlsIChlbCk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKGJ1Zik7CisKKyAgZWJtbC0+ZWwgPSBlbDsKKyAgZWJtbC0+b2Zmc2V0ID0gb2Zmc2V0OworICBlYm1sLT5idWYgPSBidWY7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZlYm1sLT5tYXAsIEdTVF9NQVBfUkVBRCk7CisgIGVibWwtPnJlYWRlcnMgPSBnX2FycmF5X3NpemVkX25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKEdzdEVibWxNYXN0ZXIpLCAxMCk7CisgIG0ub2Zmc2V0ID0gZWJtbC0+b2Zmc2V0OworICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJm0uYnIsIGVibWwtPm1hcC5kYXRhLCBlYm1sLT5tYXAuc2l6ZSk7CisgIGdfYXJyYXlfYXBwZW5kX3ZhbCAoZWJtbC0+cmVhZGVycywgbSk7Cit9CisKK3ZvaWQKK2dzdF9lYm1sX3JlYWRfY2xlYXIgKEdzdEVibWxSZWFkICogZWJtbCkKK3sKKyAgaWYgKGVibWwtPnJlYWRlcnMpCisgICAgZ19hcnJheV9mcmVlIChlYm1sLT5yZWFkZXJzLCBUUlVFKTsKKyAgZWJtbC0+cmVhZGVycyA9IE5VTEw7CisgIGlmIChlYm1sLT5idWYpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChlYm1sLT5idWYsICZlYm1sLT5tYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGVibWwtPmJ1Zik7CisgIH0KKyAgZWJtbC0+YnVmID0gTlVMTDsKKyAgZWJtbC0+ZWwgPSBOVUxMOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2VibWxfcmVhZF9wZWVrIChHc3RCeXRlUmVhZGVyICogYnIsIGd1aW50IHBlZWssIGNvbnN0IGd1aW50OCAqKiBkYXRhKQoreworICBpZiAoR19MSUtFTFkgKGdzdF9ieXRlX3JlYWRlcl9wZWVrX2RhdGEgKGJyLCBwZWVrLCBkYXRhKSkpCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICBlbHNlCisgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9lYm1sX3BlZWtfaWRfZnVsbCAoR3N0RWJtbFJlYWQgKiBlYm1sLCBndWludDMyICogaWQsIGd1aW50NjQgKiBsZW5ndGgsCisgICAgZ3VpbnQgKiBwcmVmaXgpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIHJldCA9IGdzdF9lYm1sX3BlZWtfaWRfbGVuZ3RoIChpZCwgbGVuZ3RoLCBwcmVmaXgsCisgICAgICAoR3N0UGVla0RhdGEpIGdzdF9lYm1sX3JlYWRfcGVlaywgKGdwb2ludGVyKSBnc3RfZWJtbF9yZWFkX2JyIChlYm1sKSwKKyAgICAgIGVibWwtPmVsLCBnc3RfZWJtbF9yZWFkX2dldF9wb3MgKGVibWwpKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gcmV0OworCisgIEdTVF9MT0dfT0JKRUNUIChlYm1sLT5lbCwgImlkIDB4JXggYXQgb2Zmc2V0IDB4JSIgR19HSU5UNjRfTU9ESUZJRVIgIngiCisgICAgICAiIG9mIGxlbmd0aCAlIiBHX0dVSU5UNjRfRk9STUFUICIsIHByZWZpeCAlZCIsICppZCwKKyAgICAgIGdzdF9lYm1sX3JlYWRfZ2V0X3BvcyAoZWJtbCksICpsZW5ndGgsICpwcmVmaXgpOworCisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworICBpZiAoZWJtbHJlYWRfZGVidWctPnRocmVzaG9sZCA+PSBHU1RfTEVWRUxfTE9HKSB7CisgICAgY29uc3QgZ3VpbnQ4ICpkYXRhID0gTlVMTDsKKyAgICBHc3RCeXRlUmVhZGVyICpiciA9IGdzdF9lYm1sX3JlYWRfYnIgKGVibWwpOworICAgIGd1aW50IHNpemUgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoYnIpOworCisgICAgaWYgKGdzdF9ieXRlX3JlYWRlcl9wZWVrX2RhdGEgKGJyLCBzaXplLCAmZGF0YSkpIHsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKGVibWwtPmVsLCAiY3VycmVudCBiciAlcDsgcmVtYWluaW5nICVkIiwgYnIsIHNpemUpOworICAgICAgaWYgKGRhdGEpCisgICAgICAgIEdTVF9NRU1EVU1QX09CSkVDVCAoZWJtbC0+ZWwsICJlbGVtZW50IiwgZGF0YSwgTUlOIChzaXplLCAqbGVuZ3RoKSk7CisgICAgfQorICB9CisjZW5kaWYKKworICByZXR1cm4gcmV0OworfQorCitHc3RGbG93UmV0dXJuCitnc3RfZWJtbF9wZWVrX2lkIChHc3RFYm1sUmVhZCAqIGVibWwsIGd1aW50MzIgKiBpZCkKK3sKKyAgZ3VpbnQ2NCBsZW5ndGg7CisgIGd1aW50IG5lZWRlZDsKKworICByZXR1cm4gZ3N0X2VibWxfcGVla19pZF9mdWxsIChlYm1sLCBpZCwgJmxlbmd0aCwgJm5lZWRlZCk7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBuZXh0IGVsZW1lbnQsIHRoZSBjb250ZW50cyBhcmUgc3VwcG9zZWQgdG8gYmUgc3ViLWVsZW1lbnRzIHdoaWNoCisgKiBjYW4gYmUgcmVhZCBzZXBhcmF0ZWx5LiAgQSBuZXcgYnl0ZXJlYWRlciBpcyBzZXR1cCBmb3IgZG9pbmcgc28uCisgKi8KK0dzdEZsb3dSZXR1cm4KK2dzdF9lYm1sX3JlYWRfbWFzdGVyIChHc3RFYm1sUmVhZCAqIGVibWwsIGd1aW50MzIgKiBpZCkKK3sKKyAgZ3VpbnQ2NCBsZW5ndGg7CisgIGd1aW50IHByZWZpeDsKKyAgY29uc3QgZ3VpbnQ4ICpkYXRhID0gTlVMTDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdEVibWxNYXN0ZXIgbTsKKworICByZXQgPSBnc3RfZWJtbF9wZWVrX2lkX2Z1bGwgKGVibWwsIGlkLCAmbGVuZ3RoLCAmcHJlZml4KTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gcmV0OworCisgIC8qIHdlIGp1c3QgYXQgbGVhc3QgcGVla2VkIHRoZSBpZCAqLworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwIChnc3RfZWJtbF9yZWFkX2JyIChlYm1sKSwgcHJlZml4KSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7ICAgICAgLyogRklYTUU6IGRvIHByb3BlciBlcnJvciBoYW5kbGluZyAqLworCisgIG0ub2Zmc2V0ID0gZ3N0X2VibWxfcmVhZF9nZXRfcG9zIChlYm1sKTsKKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfZ2V0X2RhdGEgKGdzdF9lYm1sX3JlYWRfYnIgKGVibWwpLCBsZW5ndGgsICZkYXRhKSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfUEFSU0U7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGVibWwtPmVsLCAicHVzaGluZyBsZXZlbCAlZCBhdCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgIGVibWwtPnJlYWRlcnMtPmxlbiwgbS5vZmZzZXQpOworICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJm0uYnIsIGRhdGEsIGxlbmd0aCk7CisgIGdfYXJyYXlfYXBwZW5kX3ZhbCAoZWJtbC0+cmVhZGVycywgbSk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCisvKiBleHBsaWNpdGx5IHBvcCBhIGJ5dGVyZWFkZXIgZnJvbSBzdGFjay4gIFVzdWFsbHkgaW52b2tlZCBhdXRvbWFnaWNhbGx5LiAqLworR3N0Rmxvd1JldHVybgorZ3N0X2VibWxfcmVhZF9wb3BfbWFzdGVyIChHc3RFYm1sUmVhZCAqIGVibWwpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChlYm1sLT5yZWFkZXJzLCBHU1RfRkxPV19FUlJPUik7CisKKyAgLyogbmV2ZXIgcmVtb3ZlIGluaXRpYWwgYnl0ZXJlYWRlciAqLworICBpZiAoZWJtbC0+cmVhZGVycy0+bGVuID4gMSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChlYm1sLT5lbCwgInBvcHBpbmcgbGV2ZWwgJWQiLCBlYm1sLT5yZWFkZXJzLT5sZW4gLSAxKTsKKyAgICBnX2FycmF5X3JlbW92ZV9pbmRleCAoZWJtbC0+cmVhZGVycywgZWJtbC0+cmVhZGVycy0+bGVuIC0gMSk7CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKKy8qCisgKiBTa2lwIHRoZSBuZXh0IGVsZW1lbnQuCisgKi8KKworR3N0Rmxvd1JldHVybgorZ3N0X2VibWxfcmVhZF9za2lwIChHc3RFYm1sUmVhZCAqIGVibWwpCit7CisgIGd1aW50NjQgbGVuZ3RoOworICBndWludDMyIGlkOworICBndWludCBwcmVmaXg7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIHJldCA9IGdzdF9lYm1sX3BlZWtfaWRfZnVsbCAoZWJtbCwgJmlkLCAmbGVuZ3RoLCAmcHJlZml4KTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gcmV0OworCisgIGlmICghZ3N0X2J5dGVfcmVhZGVyX3NraXAgKGdzdF9lYm1sX3JlYWRfYnIgKGVibWwpLCBsZW5ndGggKyBwcmVmaXgpKQorICAgIHJldHVybiBHU1RfRkxPV19QQVJTRTsKKworICByZXR1cm4gcmV0OworfQorCisvKgorICogUmVhZCB0aGUgbmV4dCBlbGVtZW50IGFzIGEgR3N0QnVmZmVyIChiaW5hcnkpLgorICovCisKK0dzdEZsb3dSZXR1cm4KK2dzdF9lYm1sX3JlYWRfYnVmZmVyIChHc3RFYm1sUmVhZCAqIGVibWwsIGd1aW50MzIgKiBpZCwgR3N0QnVmZmVyICoqIGJ1ZikKK3sKKyAgZ3VpbnQ2NCBsZW5ndGg7CisgIGd1aW50IHByZWZpeDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgcmV0ID0gZ3N0X2VibWxfcGVla19pZF9mdWxsIChlYm1sLCBpZCwgJmxlbmd0aCwgJnByZWZpeCk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICAvKiB3ZSBqdXN0IGF0IGxlYXN0IHBlZWtlZCB0aGUgaWQgKi8KKyAgaWYgKCFnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoZ3N0X2VibWxfcmVhZF9iciAoZWJtbCksIHByZWZpeCkpCisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOyAgICAgIC8qIEZJWE1FOiBkbyBwcm9wZXIgZXJyb3IgaGFuZGxpbmcgKi8KKworICBpZiAoR19MSUtFTFkgKGxlbmd0aCA+IDApKSB7CisgICAgZ3VpbnQgb2Zmc2V0OworCisgICAgb2Zmc2V0ID0gZ3N0X2VibWxfcmVhZF9nZXRfcG9zIChlYm1sKSAtIGVibWwtPm9mZnNldDsKKyAgICBpZiAoR19MSUtFTFkgKGdzdF9ieXRlX3JlYWRlcl9za2lwIChnc3RfZWJtbF9yZWFkX2JyIChlYm1sKSwgbGVuZ3RoKSkpIHsKKyAgICAgICpidWYgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChlYm1sLT5idWYsIEdTVF9CVUZGRVJfQ09QWV9BTEwsCisgICAgICAgICAgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICAqYnVmID0gTlVMTDsKKyAgICAgIHJldHVybiBHU1RfRkxPV19QQVJTRTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgKmJ1ZiA9IGdzdF9idWZmZXJfbmV3ICgpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlYWQgdGhlIG5leHQgZWxlbWVudCwgcmV0dXJuIGEgcG9pbnRlciB0byBpdCBhbmQgaXRzIHNpemUuCisgKi8KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9lYm1sX3JlYWRfYnl0ZXMgKEdzdEVibWxSZWFkICogZWJtbCwgZ3VpbnQzMiAqIGlkLCBjb25zdCBndWludDggKiogZGF0YSwKKyAgICBndWludCAqIHNpemUpCit7CisgIGd1aW50NjQgbGVuZ3RoOworICBndWludCBwcmVmaXg7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgICpzaXplID0gMDsKKworICByZXQgPSBnc3RfZWJtbF9wZWVrX2lkX2Z1bGwgKGVibWwsIGlkLCAmbGVuZ3RoLCAmcHJlZml4KTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gcmV0OworCisgIC8qIHdlIGp1c3QgYXQgbGVhc3QgcGVla2VkIHRoZSBpZCAqLworICBpZiAoIWdzdF9ieXRlX3JlYWRlcl9za2lwIChnc3RfZWJtbF9yZWFkX2JyIChlYm1sKSwgcHJlZml4KSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7ICAgICAgLyogRklYTUU6IGRvIHByb3BlciBlcnJvciBoYW5kbGluZyAqLworCisgICpkYXRhID0gTlVMTDsKKyAgaWYgKEdfTElLRUxZIChsZW5ndGggPiAwKSkgeworICAgIGlmICghZ3N0X2J5dGVfcmVhZGVyX2dldF9kYXRhIChnc3RfZWJtbF9yZWFkX2JyIChlYm1sKSwgbGVuZ3RoLCBkYXRhKSkKKyAgICAgIHJldHVybiBHU1RfRkxPV19QQVJTRTsKKyAgfQorCisgICpzaXplID0gbGVuZ3RoOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBuZXh0IGVsZW1lbnQgYXMgYW4gdW5zaWduZWQgaW50LgorICovCisKK0dzdEZsb3dSZXR1cm4KK2dzdF9lYm1sX3JlYWRfdWludCAoR3N0RWJtbFJlYWQgKiBlYm1sLCBndWludDMyICogaWQsIGd1aW50NjQgKiBudW0pCit7CisgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQgc2l6ZTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgcmV0ID0gZ3N0X2VibWxfcmVhZF9ieXRlcyAoZWJtbCwgaWQsICZkYXRhLCAmc2l6ZSk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICBpZiAoc2l6ZSA+IDgpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChlYm1sLT5lbCwKKyAgICAgICAgIkludmFsaWQgaW50ZWdlciBlbGVtZW50IHNpemUgJWQgYXQgcG9zaXRpb24gJSIgR19HVUlOVDY0X0ZPUk1BVCAiICgweCUiCisgICAgICAgIEdfR0lOVDY0X01PRElGSUVSICJ4KSIsIHNpemUsIGdzdF9lYm1sX3JlYWRfZ2V0X3BvcyAoZWJtbCkgLSBzaXplLAorICAgICAgICBnc3RfZWJtbF9yZWFkX2dldF9wb3MgKGVibWwpIC0gc2l6ZSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgaWYgKHNpemUgPT0gMCkgeworICAgICpudW0gPSAwOworICAgIHJldHVybiByZXQ7CisgIH0KKworICAqbnVtID0gMDsKKyAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgKm51bSA9ICgqbnVtIDw8IDgpIHwgKmRhdGE7CisgICAgc2l6ZS0tOworICAgIGRhdGErKzsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBuZXh0IGVsZW1lbnQgYXMgYSBzaWduZWQgaW50LgorICovCisKK0dzdEZsb3dSZXR1cm4KK2dzdF9lYm1sX3JlYWRfc2ludCAoR3N0RWJtbFJlYWQgKiBlYm1sLCBndWludDMyICogaWQsIGdpbnQ2NCAqIG51bSkKK3sKKyAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICBndWludCBzaXplOworICBnYm9vbGVhbiBuZWdhdGl2ZSA9IDA7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIHJldCA9IGdzdF9lYm1sX3JlYWRfYnl0ZXMgKGVibWwsIGlkLCAmZGF0YSwgJnNpemUpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIHJldHVybiByZXQ7CisKKyAgaWYgKHNpemUgPiA4KSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZWJtbC0+ZWwsCisgICAgICAgICJJbnZhbGlkIGludGVnZXIgZWxlbWVudCBzaXplICVkIGF0IHBvc2l0aW9uICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiAoMHglIgorICAgICAgICBHX0dJTlQ2NF9NT0RJRklFUiAieCkiLCBzaXplLCBnc3RfZWJtbF9yZWFkX2dldF9wb3MgKGVibWwpIC0gc2l6ZSwKKyAgICAgICAgZ3N0X2VibWxfcmVhZF9nZXRfcG9zIChlYm1sKSAtIHNpemUpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIGlmIChzaXplID09IDApIHsKKyAgICAqbnVtID0gMDsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgKm51bSA9IDA7CisgIGlmICgqZGF0YSAmIDB4ODApIHsKKyAgICBuZWdhdGl2ZSA9IDE7CisgICAgKm51bSA9ICpkYXRhICYgfjB4ODA7CisgICAgc2l6ZS0tOworICAgIGRhdGErKzsKKyAgfQorCisgIHdoaWxlIChzaXplID4gMCkgeworICAgICpudW0gPSAoKm51bSA8PCA4KSB8ICpkYXRhOworICAgIHNpemUtLTsKKyAgICBkYXRhKys7CisgIH0KKworICAvKiBtYWtlIHNpZ25lZCAqLworICBpZiAobmVnYXRpdmUpIHsKKyAgICAqbnVtID0gMCAtICpudW07CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKiBDb252ZXJ0IDgwIGJpdCBleHRlbmRlZCBwcmVjaXNpb24gZmxvYXQgaW4gYmlnIGVuZGlhbiBmb3JtYXQgdG8gZG91YmxlLgorICogQ29kZSB0YWtlbiBmcm9tIGxpYmF2dXRpbC9pbnRmbG9hdF9yZWFkd3JpdGUuYyBmcm9tIGZmbXBlZywKKyAqIGxpY2Vuc2VkIHVuZGVyIExHUEwgKi8KKworc3RydWN0IF9leHRfZmxvYXQKK3sKKyAgZ3VpbnQ4IGV4cG9uZW50WzJdOworICBndWludDggbWFudGlzc2FbOF07Cit9OworCitzdGF0aWMgZ2RvdWJsZQorX2V4dDJkYmwgKGNvbnN0IGd1aW50OCAqIGRhdGEpCit7CisgIHN0cnVjdCBfZXh0X2Zsb2F0IGV4dDsKKyAgZ3VpbnQ2NCBtID0gMDsKKyAgZ2ludCBlLCBpOworCisgIG1lbWNweSAoJmV4dC5leHBvbmVudCwgZGF0YSwgMik7CisgIG1lbWNweSAoJmV4dC5tYW50aXNzYSwgZGF0YSArIDIsIDgpOworCisgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgbSA9IChtIDw8IDgpICsgZXh0Lm1hbnRpc3NhW2ldOworICBlID0gKCgoZ2ludCkgZXh0LmV4cG9uZW50WzBdICYgMHg3ZikgPDwgOCkgfCBleHQuZXhwb25lbnRbMV07CisgIGlmIChlID09IDB4N2ZmZiAmJiBtKQorICAgIHJldHVybiBOQU47CisgIGUgLT0gMTYzODMgKyA2MzsgICAgICAgICAgICAgIC8qIEluIElFRUUgODAgYml0cywgdGhlIHdob2xlIChpLmUuIDEueHh4eCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbWFudGlzc2EgYml0IGlzIHdyaXR0ZW4gYXMgb3Bwb3NlZCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2luZ2xlIGFuZCBkb3VibGUgcHJlY2lzaW9uIGZvcm1hdHMgKi8KKyAgaWYgKGV4dC5leHBvbmVudFswXSAmIDB4ODApCisgICAgbSA9IC1tOworICByZXR1cm4gbGRleHAgKG0sIGUpOworfQorCisvKgorICogUmVhZCB0aGUgbmV4dCBlbGVtZW50IGFzIGEgZmxvYXQuCisgKi8KKworR3N0Rmxvd1JldHVybgorZ3N0X2VibWxfcmVhZF9mbG9hdCAoR3N0RWJtbFJlYWQgKiBlYm1sLCBndWludDMyICogaWQsIGdkb3VibGUgKiBudW0pCit7CisgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQgc2l6ZTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgcmV0ID0gZ3N0X2VibWxfcmVhZF9ieXRlcyAoZWJtbCwgaWQsICZkYXRhLCAmc2l6ZSk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICBpZiAoc2l6ZSAhPSAwICYmIHNpemUgIT0gNCAmJiBzaXplICE9IDggJiYgc2l6ZSAhPSAxMCkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGVibWwtPmVsLAorICAgICAgICAiSW52YWxpZCBmbG9hdCBlbGVtZW50IHNpemUgJWQgYXQgcG9zaXRpb24gJSIgR19HVUlOVDY0X0ZPUk1BVCAiICgweCUiCisgICAgICAgIEdfR0lOVDY0X01PRElGSUVSICJ4KSIsIHNpemUsIGdzdF9lYm1sX3JlYWRfZ2V0X3BvcyAoZWJtbCkgLSBzaXplLAorICAgICAgICBnc3RfZWJtbF9yZWFkX2dldF9wb3MgKGVibWwpIC0gc2l6ZSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgaWYgKHNpemUgPT0gNCkgeworICAgIGdmbG9hdCBmOworCisgICAgbWVtY3B5ICgmZiwgZGF0YSwgNCk7CisgICAgZiA9IEdGTE9BVF9GUk9NX0JFIChmKTsKKworICAgICpudW0gPSBmOworICB9IGVsc2UgaWYgKHNpemUgPT0gOCkgeworICAgIGdkb3VibGUgZDsKKworICAgIG1lbWNweSAoJmQsIGRhdGEsIDgpOworICAgIGQgPSBHRE9VQkxFX0ZST01fQkUgKGQpOworCisgICAgKm51bSA9IGQ7CisgIH0gZWxzZSBpZiAoc2l6ZSA9PSAxMCkgeworICAgICpudW0gPSBfZXh0MmRibCAoZGF0YSk7CisgIH0gZWxzZSB7CisgICAgLyogc2l6ZSA9PSAwIG1lYW5zIGEgdmFsdWUgb2YgMC4wICovCisgICAgKm51bSA9IDAuMDsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBuZXh0IGVsZW1lbnQgYXMgYSBDIHN0cmluZy4KKyAqLworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2VibWxfcmVhZF9zdHJpbmcgKEdzdEVibWxSZWFkICogZWJtbCwgZ3VpbnQzMiAqIGlkLCBnY2hhciAqKiBzdHIpCit7CisgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQgc2l6ZTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgcmV0ID0gZ3N0X2VibWxfcmVhZF9ieXRlcyAoZWJtbCwgaWQsICZkYXRhLCAmc2l6ZSk7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICAqc3RyID0gZ19tYWxsb2MgKHNpemUgKyAxKTsKKyAgbWVtY3B5ICgqc3RyLCBkYXRhLCBzaXplKTsKKyAgKCpzdHIpW3NpemVdID0gJ1wwJzsKKworICByZXR1cm4gcmV0OworfQorCisvKgorICogUmVhZCB0aGUgbmV4dCBlbGVtZW50IGFzIGFuIEFTQ0lJIHN0cmluZy4KKyAqLworCitHc3RGbG93UmV0dXJuCitnc3RfZWJtbF9yZWFkX2FzY2lpIChHc3RFYm1sUmVhZCAqIGVibWwsIGd1aW50MzIgKiBpZCwgZ2NoYXIgKiogc3RyX291dCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIGdjaGFyICpzdHI7CisgIGdjaGFyICppdGVyOworCisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworICBndWludDY0IG9sZG9mZiA9IGVibWwtPm9mZnNldDsKKyNlbmRpZgorCisgIHJldCA9IGdzdF9lYm1sX3JlYWRfc3RyaW5nIChlYm1sLCBpZCwgJnN0cik7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICBmb3IgKGl0ZXIgPSBzdHI7ICppdGVyICE9ICdcMCc7IGl0ZXIrKykgeworICAgIGlmIChHX1VOTElLRUxZICgqaXRlciAmIDB4ODApKSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChlYm1sLAorICAgICAgICAgICJJbnZhbGlkIEFTQ0lJIHN0cmluZyBhdCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwgb2xkb2ZmKTsKKyAgICAgIGdfZnJlZSAoc3RyKTsKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgICB9CisgIH0KKworICAqc3RyX291dCA9IHN0cjsKKyAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlYWQgdGhlIG5leHQgZWxlbWVudCBhcyBhIFVURi04IHN0cmluZy4KKyAqLworCitHc3RGbG93UmV0dXJuCitnc3RfZWJtbF9yZWFkX3V0ZjggKEdzdEVibWxSZWFkICogZWJtbCwgZ3VpbnQzMiAqIGlkLCBnY2hhciAqKiBzdHIpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworICBndWludDY0IG9sZG9mZiA9IGdzdF9lYm1sX3JlYWRfZ2V0X3BvcyAoZWJtbCk7CisjZW5kaWYKKworICByZXQgPSBnc3RfZWJtbF9yZWFkX3N0cmluZyAoZWJtbCwgaWQsIHN0cik7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgcmV0dXJuIHJldDsKKworICBpZiAoc3RyICE9IE5VTEwgJiYgKnN0ciAhPSBOVUxMICYmICoqc3RyICE9ICdcMCcgJiYKKyAgICAgICFnX3V0ZjhfdmFsaWRhdGUgKCpzdHIsIC0xLCBOVUxMKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZWJtbC0+ZWwsCisgICAgICAgICJJbnZhbGlkIFVURi04IHN0cmluZyBhdCBvZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwgb2xkb2ZmKTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBuZXh0IGVsZW1lbnQgYXMgYSBkYXRlLgorICogUmV0dXJucyB0aGUgc2Vjb25kcyBzaW5jZSB0aGUgdW5peCBlcG9jaC4KKyAqLworCitHc3RGbG93UmV0dXJuCitnc3RfZWJtbF9yZWFkX2RhdGUgKEdzdEVibWxSZWFkICogZWJtbCwgZ3VpbnQzMiAqIGlkLCBnaW50NjQgKiBkYXRlKQoreworICBnaW50NjQgZWJtbF9kYXRlOworICBHc3RGbG93UmV0dXJuIHJldDsKKworICByZXQgPSBnc3RfZWJtbF9yZWFkX3NpbnQgKGVibWwsIGlkLCAmZWJtbF9kYXRlKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gcmV0OworCisgICpkYXRlID0gKGVibWxfZGF0ZSAvIEdTVF9TRUNPTkQpICsgR1NUX0VCTUxfREFURV9PRkZTRVQ7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlYWQgdGhlIG5leHQgZWxlbWVudCBhcyBiaW5hcnkgZGF0YS4KKyAqLworCitHc3RGbG93UmV0dXJuCitnc3RfZWJtbF9yZWFkX2JpbmFyeSAoR3N0RWJtbFJlYWQgKiBlYm1sLAorICAgIGd1aW50MzIgKiBpZCwgZ3VpbnQ4ICoqIGJpbmFyeSwgZ3VpbnQ2NCAqIGxlbmd0aCkKK3sKKyAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICBndWludCBzaXplOworICBHc3RGbG93UmV0dXJuIHJldDsKKworICByZXQgPSBnc3RfZWJtbF9yZWFkX2J5dGVzIChlYm1sLCBpZCwgJmRhdGEsICZzaXplKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gcmV0OworCisgICpsZW5ndGggPSBzaXplOworICAqYmluYXJ5ID0gZ19tZW1kdXAgKGRhdGEsIHNpemUpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KZGlmZiAtLWdpdCBhL2dzdC9tYXRyb3NrYS9lYm1sLXJlYWQuaCBiL2dzdC9tYXRyb3NrYS9lYm1sLXJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTg5NGRhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21hdHJvc2thL2VibWwtcmVhZC5oCkBAIC0wLDAgKzEsMTcxIEBACisvKiBHU3RyZWFtZXIgRUJNTCBJL08KKyAqIChjKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqCisgKiBlYm1sLXJlYWQuYzogcmVhZCBFQk1MIGRhdGEgZnJvbSBmaWxlL3N0cmVhbQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfRUJNTF9SRUFEX0hfXworI2RlZmluZSBfX0dTVF9FQk1MX1JFQURfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXJlYWRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfRUJNTF9SRUFEIFwKKyAgKGdzdF9lYm1sX3JlYWRfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9FQk1MX1JFQUQob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0VCTUxfUkVBRCwgR3N0RWJtbFJlYWQpKQorI2RlZmluZSBHU1RfRUJNTF9SRUFEX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfRUJNTF9SRUFELCBHc3RFYm1sUmVhZENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0VCTUxfUkVBRChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfRUJNTF9SRUFEKSkKKyNkZWZpbmUgR1NUX0lTX0VCTUxfUkVBRF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0VCTUxfUkVBRCkpCisjZGVmaW5lIEdTVF9FQk1MX1JFQURfR0VUX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX0VCTUxfUkVBRCwgR3N0RWJtbFJlYWRDbGFzcykpCisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKGVibWxyZWFkX2RlYnVnKTsKKworLyogY3VzdG9tIGZsb3cgcmV0dXJuIGNvZGUgKi8KKyNkZWZpbmUgIEdTVF9GTE9XX1BBUlNFICBHU1RfRkxPV19DVVNUT01fRVJST1IKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEVibWxNYXN0ZXIgeworICBndWludDY0ICAgICAgIG9mZnNldDsKKyAgR3N0Qnl0ZVJlYWRlciBicjsKK30gR3N0RWJtbE1hc3RlcjsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEVibWxSZWFkIHsKKyAgR3N0RWxlbWVudCAqZWw7CisKKyAgR3N0QnVmZmVyICpidWY7CisgIGd1aW50NjQgb2Zmc2V0OworICBHc3RNYXBJbmZvIG1hcDsKKworICBHQXJyYXkgKnJlYWRlcnM7Cit9IEdzdEVibWxSZWFkOworCit0eXBlZGVmIEdzdEZsb3dSZXR1cm4gKCpHc3RQZWVrRGF0YSkgKGdwb2ludGVyICogY29udGV4dCwgZ3VpbnQgcGVlaywgY29uc3QgZ3VpbnQ4ICoqIGRhdGEpOworCisvKiByZXR1cm5zIFVORVhQRUNURUQgaWYgbm90IGVub3VnaCBkYXRhICovCitHc3RGbG93UmV0dXJuIGdzdF9lYm1sX3BlZWtfaWRfbGVuZ3RoICAgIChndWludDMyICogX2lkLCBndWludDY0ICogX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50ICogX25lZWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFBlZWtEYXRhIHBlZWssIGdwb2ludGVyICogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0RWxlbWVudCAqIGVsLCBndWludDY0IG9mZnNldCk7CisKK3ZvaWQgICAgICAgICAgZ3N0X2VibWxfcmVhZF9pbml0ICAgICAgICAgKEdzdEVibWxSZWFkICogZWJtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdEVsZW1lbnQgKiBlbCwgR3N0QnVmZmVyICogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCBvZmZzZXQpOworCit2b2lkICAgICAgICAgIGdzdF9lYm1sX3JlYWRfY2xlYXIgICAgICAgIChHc3RFYm1sUmVhZCAqIGVibWwpOworCitHc3RGbG93UmV0dXJuIGdzdF9lYm1sX3BlZWtfaWQgICAgICAgICAgIChHc3RFYm1sUmVhZCAqIGVibWwsIGd1aW50MzIgKiBpZCk7CisKKy8qIHJldHVybiBfUEFSU0UgaWYgbm90IGVub3VnaCBkYXRhIHRvIHJlYWQgd2hhdCBpcyBuZWVkZWQsIF9FUlJPUiBvciBfT0sgKi8KK0dzdEZsb3dSZXR1cm4gZ3N0X2VibWxfcmVhZF9za2lwICAgICAgICAgKEdzdEVibWxSZWFkICplYm1sKTsKKworR3N0Rmxvd1JldHVybiBnc3RfZWJtbF9yZWFkX2J1ZmZlciAgICAgICAoR3N0RWJtbFJlYWQgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAqaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RCdWZmZXIgICoqYnVmKTsKKworR3N0Rmxvd1JldHVybiBnc3RfZWJtbF9yZWFkX3VpbnQgICAgICAgICAoR3N0RWJtbFJlYWQgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAqaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0ICAgICAqbnVtKTsKKworR3N0Rmxvd1JldHVybiBnc3RfZWJtbF9yZWFkX3NpbnQgICAgICAgICAoR3N0RWJtbFJlYWQgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAqaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50NjQgICAgICAqbnVtKTsKKworR3N0Rmxvd1JldHVybiBnc3RfZWJtbF9yZWFkX2Zsb2F0ICAgICAgICAoR3N0RWJtbFJlYWQgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAqaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICAgICAqbnVtKTsKKworR3N0Rmxvd1JldHVybiBnc3RfZWJtbF9yZWFkX2FzY2lpICAgICAgICAoR3N0RWJtbFJlYWQgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAqaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAgICAgICoqc3RyKTsKKworR3N0Rmxvd1JldHVybiBnc3RfZWJtbF9yZWFkX3V0ZjggICAgICAgICAoR3N0RWJtbFJlYWQgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAqaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAgICAgICoqc3RyKTsKKworR3N0Rmxvd1JldHVybiBnc3RfZWJtbF9yZWFkX2RhdGUgICAgICAgICAoR3N0RWJtbFJlYWQgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAqaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50NjQgICAgICAqZGF0ZSk7CisKK0dzdEZsb3dSZXR1cm4gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgICAgICAgKEdzdEVibWxSZWFkICplYm1sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAgICAgKmlkKTsKKworR3N0Rmxvd1JldHVybiBnc3RfZWJtbF9yZWFkX3BvcF9tYXN0ZXIgICAoR3N0RWJtbFJlYWQgKmVibWwpOworCitHc3RGbG93UmV0dXJuIGdzdF9lYm1sX3JlYWRfYmluYXJ5ICAgICAgIChHc3RFYm1sUmVhZCAqZWJtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgICAgICppZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50OCAgICAgKipiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0ICAgICAqbGVuZ3RoKTsKKworR3N0Rmxvd1JldHVybiBnc3RfZWJtbF9yZWFkX2hlYWRlciAgICAgICAoR3N0RWJtbFJlYWQgKnJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAgICAgICoqZG9jdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50ICAgICAgICp2ZXJzaW9uKTsKKworLyogUmV0dXJucyBjdXJyZW50IChhYnNvbHV0ZSkgcG9zaXRpb24gb2YgRWJtbCBwYXJzZXIsCisgKiBpLmUuIHRha2luZyBpbnRvIGFjY291bnQgb2Zmc2V0IHByb3ZpZGVkIGF0IGluaXQgKi8KK3N0YXRpYyBpbmxpbmUgZ3VpbnQ2NAorZ3N0X2VibWxfcmVhZF9nZXRfcG9zIChHc3RFYm1sUmVhZCAqIGVibWwpCit7CisgIEdzdEVibWxNYXN0ZXIgKm07CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGVibWwtPnJlYWRlcnMsIDApOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZWJtbC0+cmVhZGVycy0+bGVuLCAwKTsKKworICBtID0gJihnX2FycmF5X2luZGV4IChlYm1sLT5yZWFkZXJzLCBHc3RFYm1sTWFzdGVyLCBlYm1sLT5yZWFkZXJzLT5sZW4gLSAxKSk7CisgIHJldHVybiBtLT5vZmZzZXQgKyBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3BvcyAoJm0tPmJyKTsKK30KKworLyogUmV0dXJucyBzdGFydGluZyBvZmZzZXQgb2YgRWJtbCBwYXJzZXIgKi8KK3N0YXRpYyBpbmxpbmUgZ3VpbnQ2NAorZ3N0X2VibWxfcmVhZF9nZXRfb2Zmc2V0IChHc3RFYm1sUmVhZCAqIGVibWwpCit7CisgIHJldHVybiBlYm1sLT5vZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgR3N0Qnl0ZVJlYWRlciAqCitnc3RfZWJtbF9yZWFkX2JyIChHc3RFYm1sUmVhZCAqIGVibWwpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChlYm1sLT5yZWFkZXJzLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGVibWwtPnJlYWRlcnMtPmxlbiwgTlVMTCk7CisKKyAgcmV0dXJuICYoZ19hcnJheV9pbmRleCAoZWJtbC0+cmVhZGVycywKKyAgICAgICAgICBHc3RFYm1sTWFzdGVyLCBlYm1sLT5yZWFkZXJzLT5sZW4gLSAxKS5icik7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2Jvb2xlYW4KK2dzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoR3N0RWJtbFJlYWQgKiBlYm1sLCBndWludDY0IGJ5dGVzX25lZWRlZCwKKyAgICBnYm9vbGVhbiBhdXRvX3BvcCkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHJlcyA9IChnc3RfYnl0ZV9yZWFkZXJfZ2V0X3JlbWFpbmluZyAoZ3N0X2VibWxfcmVhZF9iciAoZWJtbCkpID49IGJ5dGVzX25lZWRlZCk7CisgIGlmIChHX0xJS0VMWSAoIXJlcyAmJiBhdXRvX3BvcCkpIHsKKyAgICBnc3RfZWJtbF9yZWFkX3BvcF9tYXN0ZXIgKGVibWwpOworICB9CisKKyAgcmV0dXJuIEdfTElLRUxZIChyZXMpOworfQorCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfRUJNTF9SRUFEX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuYyBiL2dzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlOTNiYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tYXRyb3NrYS9lYm1sLXdyaXRlLmMKQEAgLTAsMCArMSw5NDEgQEAKKy8qIEdTdHJlYW1lciBFQk1MIEkvTworICogKGMpIDIwMDMgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogKGMpIDIwMDUgTWljaGFsIEJlbmVzIDxtaWNoYWwuYmVuZXNAeGVyaXMuY3o+CisgKgorICogZWJtbC13cml0ZS5jOiB3cml0ZSBFQk1MIGRhdGEgdG8gZmlsZS9zdHJlYW0KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImVibWwtd3JpdGUuaCIKKyNpbmNsdWRlICJlYm1sLWlkcy5oIgorCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9lYm1sX3dyaXRlX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9lYm1sX3dyaXRlX2RlYnVnCisKKyNkZWZpbmUgX2RvX2luaXQgXAorICAgICAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9lYm1sX3dyaXRlX2RlYnVnLCAiZWJtbHdyaXRlIiwgMCwgIldyaXRlIEVCTUwgc3RydWN0dXJlZCBkYXRhIikKKyNkZWZpbmUgcGFyZW50X2NsYXNzIGdzdF9lYm1sX3dyaXRlX3BhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdEVibWxXcml0ZSwgZ3N0X2VibWxfd3JpdGUsIEdTVF9UWVBFX09CSkVDVCwKKyAgICBfZG9faW5pdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9lYm1sX3dyaXRlX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIHZvaWQKK2dzdF9lYm1sX3dyaXRlX2NsYXNzX2luaXQgKEdzdEVibWxXcml0ZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0ID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBvYmplY3QtPmZpbmFsaXplID0gZ3N0X2VibWxfd3JpdGVfZmluYWxpemU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZWJtbF93cml0ZV9pbml0IChHc3RFYm1sV3JpdGUgKiBlYm1sKQoreworICBlYm1sLT5zcmNwYWQgPSBOVUxMOworICBlYm1sLT5wb3MgPSAwOworICBlYm1sLT5sYXN0X3BvcyA9IEdfTUFYVUlOVDY0OyAvKiBmb3JjZSBzZWdtZW50IGV2ZW50ICovCisKKyAgZWJtbC0+Y2FjaGUgPSBOVUxMOworICBlYm1sLT5zdHJlYW1oZWFkZXIgPSBOVUxMOworICBlYm1sLT5zdHJlYW1oZWFkZXJfcG9zID0gMDsKKyAgZWJtbC0+d3JpdGluZ19zdHJlYW1oZWFkZXIgPSBGQUxTRTsKKyAgZWJtbC0+Y2FwcyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZWJtbF93cml0ZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0RWJtbFdyaXRlICplYm1sID0gR1NUX0VCTUxfV1JJVEUgKG9iamVjdCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoZWJtbC0+c3JjcGFkKTsKKworICBpZiAoZWJtbC0+Y2FjaGUpIHsKKyAgICBnc3RfYnl0ZV93cml0ZXJfZnJlZSAoZWJtbC0+Y2FjaGUpOworICAgIGVibWwtPmNhY2hlID0gTlVMTDsKKyAgfQorCisgIGlmIChlYm1sLT5zdHJlYW1oZWFkZXIpIHsKKyAgICBnc3RfYnl0ZV93cml0ZXJfZnJlZSAoZWJtbC0+c3RyZWFtaGVhZGVyKTsKKyAgICBlYm1sLT5zdHJlYW1oZWFkZXIgPSBOVUxMOworICB9CisKKyAgaWYgKGVibWwtPmNhcHMpIHsKKyAgICBnc3RfY2Fwc191bnJlZiAoZWJtbC0+Y2Fwcyk7CisgICAgZWJtbC0+Y2FwcyA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKworLyoqCisgKiBnc3RfZWJtbF93cml0ZV9uZXc6CisgKiBAc3JjcGFkOiBTb3VyY2UgcGFkIHRvIHdoaWNoIHRoZSBvdXRwdXQgd2lsbCBiZSBwdXNoZWQuCisgKgorICogQ3JlYXRlcyBhIG5ldyAjR3N0RWJtbFdyaXRlLgorICoKKyAqIFJldHVybnM6IGEgbmV3ICNHc3RFYm1sV3JpdGUKKyAqLworR3N0RWJtbFdyaXRlICoKK2dzdF9lYm1sX3dyaXRlX25ldyAoR3N0UGFkICogc3JjcGFkKQoreworICBHc3RFYm1sV3JpdGUgKmVibWwgPQorICAgICAgR1NUX0VCTUxfV1JJVEUgKGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfRUJNTF9XUklURSwgTlVMTCkpOworCisgIGVibWwtPnNyY3BhZCA9IGdzdF9vYmplY3RfcmVmIChzcmNwYWQpOworICBlYm1sLT50aW1lc3RhbXAgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIGdzdF9lYm1sX3dyaXRlX3Jlc2V0IChlYm1sKTsKKworICByZXR1cm4gZWJtbDsKK30KKworCisvKioKKyAqIGdzdF9lYm1sX3dyaXRlX3Jlc2V0OgorICogQGVibWw6IGEgI0dzdEVibWxXcml0ZS4KKyAqCisgKiBSZXNldCBpbnRlcm5hbCBzdGF0ZSBvZiAjR3N0RWJtbFdyaXRlLgorICovCit2b2lkCitnc3RfZWJtbF93cml0ZV9yZXNldCAoR3N0RWJtbFdyaXRlICogZWJtbCkKK3sKKyAgZWJtbC0+cG9zID0gMDsKKyAgZWJtbC0+bGFzdF9wb3MgPSBHX01BWFVJTlQ2NDsgLyogZm9yY2Ugc2VnbWVudCBldmVudCAqLworCisgIGlmIChlYm1sLT5jYWNoZSkgeworICAgIGdzdF9ieXRlX3dyaXRlcl9mcmVlIChlYm1sLT5jYWNoZSk7CisgICAgZWJtbC0+Y2FjaGUgPSBOVUxMOworICB9CisKKyAgaWYgKGVibWwtPmNhcHMpIHsKKyAgICBnc3RfY2Fwc191bnJlZiAoZWJtbC0+Y2Fwcyk7CisgICAgZWJtbC0+Y2FwcyA9IE5VTEw7CisgIH0KKworICBlYm1sLT5sYXN0X3dyaXRlX3Jlc3VsdCA9IEdTVF9GTE9XX09LOworICBlYm1sLT50aW1lc3RhbXAgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworfQorCisKKy8qKgorICogZ3N0X2VibWxfbGFzdF93cml0ZV9yZXN1bHQ6CisgKiBAZWJtbDogYSAjR3N0RWJtbFdyaXRlLgorICoKKyAqIFJldHVybnM6IEdTVF9GTE9XX09LIGlmIHRoZXJlIHdhcyBub3Qgd3JpdGUgZXJyb3Igc2luY2UgdGhlIGxhc3QgY2FsbCBvZgorICogICAgICAgICAgZ3N0X2VibWxfbGFzdF93cml0ZV9yZXN1bHQgb3IgY29kZSBvZiB0aGUgZXJyb3IuCisgKi8KK0dzdEZsb3dSZXR1cm4KK2dzdF9lYm1sX2xhc3Rfd3JpdGVfcmVzdWx0IChHc3RFYm1sV3JpdGUgKiBlYm1sKQoreworICBHc3RGbG93UmV0dXJuIHJlcyA9IGVibWwtPmxhc3Rfd3JpdGVfcmVzdWx0OworCisgIGVibWwtPmxhc3Rfd3JpdGVfcmVzdWx0ID0gR1NUX0ZMT1dfT0s7CisKKyAgcmV0dXJuIHJlczsKK30KKworCit2b2lkCitnc3RfZWJtbF9zdGFydF9zdHJlYW1oZWFkZXIgKEdzdEVibWxXcml0ZSAqIGVibWwpCit7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKGVibWwtPnN0cmVhbWhlYWRlciA9PSBOVUxMKTsKKworICBHU1RfREVCVUcgKCJTdGFydGluZyBzdHJlYW1oZWFkZXIgYXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwgZWJtbC0+cG9zKTsKKyAgZWJtbC0+c3RyZWFtaGVhZGVyID0gZ3N0X2J5dGVfd3JpdGVyX25ld193aXRoX3NpemUgKDEwMDAsIEZBTFNFKTsKKyAgZWJtbC0+c3RyZWFtaGVhZGVyX3BvcyA9IGVibWwtPnBvczsKKyAgZWJtbC0+d3JpdGluZ19zdHJlYW1oZWFkZXIgPSBUUlVFOworfQorCitHc3RCdWZmZXIgKgorZ3N0X2VibWxfc3RvcF9zdHJlYW1oZWFkZXIgKEdzdEVibWxXcml0ZSAqIGVibWwpCit7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworCisgIGlmICghZWJtbC0+c3RyZWFtaGVhZGVyKQorICAgIHJldHVybiBOVUxMOworCisgIGJ1ZmZlciA9IGdzdF9ieXRlX3dyaXRlcl9mcmVlX2FuZF9nZXRfYnVmZmVyIChlYm1sLT5zdHJlYW1oZWFkZXIpOworICBlYm1sLT5zdHJlYW1oZWFkZXIgPSBOVUxMOworICBHU1RfREVCVUcgKCJTdHJlYW1oZWFkZXIgd2FzIHNpemUgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpKTsKKworICBlYm1sLT53cml0aW5nX3N0cmVhbWhlYWRlciA9IEZBTFNFOworICByZXR1cm4gYnVmZmVyOworfQorCisvKioKKyAqIGdzdF9lYm1sX3dyaXRlX3NldF9jYWNoZToKKyAqIEBlYm1sOiBhICNHc3RFYm1sV3JpdGUuCisgKiBAc2l6ZTogc2l6ZSBvZiB0aGUgY2FjaGUuCisgKiBDcmVhdGUgYSBjYWNoZS4KKyAqCisgKiBUaGUgaWRlYSBpcyB0aGF0IHlvdSB1c2UgdGhpcyBmb3Igd3JpdGluZyBhIGxvdAorICogb2Ygc21hbGwgZWxlbWVudHMuIFRoaXMgd2lsbCBqdXN0ICJxdWV1ZSIgYWxsIG9mCisgKiB0aGVtIGFuZCB0aGV5J2xsIGJlIHB1c2hlZCB0byB0aGUgbmV4dCBlbGVtZW50IGFsbAorICogYXQgb25jZS4gVGhpcyBzYXZlcyBtZW1vcnkgYW5kIHRpbWUgZm9yIGJ1ZmZlcgorICogYWxsb2NhdGlvbiBhbmQgaW5pdCwgYW5kIGl0IGxvb2tzIGJldHRlci4KKyAqLwordm9pZAorZ3N0X2VibWxfd3JpdGVfc2V0X2NhY2hlIChHc3RFYm1sV3JpdGUgKiBlYm1sLCBndWludCBzaXplKQoreworICBnX3JldHVybl9pZl9mYWlsIChlYm1sLT5jYWNoZSA9PSBOVUxMKTsKKworICBHU1RfREVCVUcgKCJTdGFydGluZyBjYWNoZSBhdCAlIiBHX0dVSU5UNjRfRk9STUFULCBlYm1sLT5wb3MpOworICBlYm1sLT5jYWNoZSA9IGdzdF9ieXRlX3dyaXRlcl9uZXdfd2l0aF9zaXplIChzaXplLCBGQUxTRSk7CisgIGVibWwtPmNhY2hlX3BvcyA9IGVibWwtPnBvczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZWJtbF93cml0ZXJfc2VuZF9zZWdtZW50X2V2ZW50IChHc3RFYm1sV3JpdGUgKiBlYm1sLCBndWludDY0IG5ld19wb3MpCit7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIEdTVF9JTkZPICgic2Vla2luZyB0byAlIiBHX0dVSU5UNjRfRk9STUFULCBuZXdfcG9zKTsKKworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwKKyAgICAgIGVibWwtPnN0cmVhbWFibGUgPyBHU1RfRk9STUFUX1RJTUUgOiBHU1RfRk9STUFUX0JZVEVTKTsKKyAgc2VnbWVudC5zdGFydCA9IG5ld19wb3M7CisgIHNlZ21lbnQuc3RvcCA9IC0xOworICBzZWdtZW50LnBvc2l0aW9uID0gMDsKKworICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKGVibWwtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIGlmICghcmVzKQorICAgIEdTVF9XQVJOSU5HICgic2VlayB0byAlIiBHX0dVSU5UNjRfRk9STUFUICJmYWlsZWQiLCBuZXdfcG9zKTsKKworICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIGdzdF9lYm1sX3dyaXRlX2ZsdXNoX2NhY2hlOgorICogQGVibWw6ICAgICAgYSAjR3N0RWJtbFdyaXRlLgorICogQHRpbWVzdGFtcDogdGltZXN0YW1wIG9mIHRoZSBidWZmZXIuCisgKgorICogRmx1c2ggdGhlIGNhY2hlLgorICovCit2b2lkCitnc3RfZWJtbF93cml0ZV9mbHVzaF9jYWNoZSAoR3N0RWJtbFdyaXRlICogZWJtbCwgZ2Jvb2xlYW4gaXNfa2V5ZnJhbWUsCisgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCkKK3sKKyAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgaWYgKCFlYm1sLT5jYWNoZSkKKyAgICByZXR1cm47CisKKyAgYnVmZmVyID0gZ3N0X2J5dGVfd3JpdGVyX2ZyZWVfYW5kX2dldF9idWZmZXIgKGVibWwtPmNhY2hlKTsKKyAgZWJtbC0+Y2FjaGUgPSBOVUxMOworICBHU1RfREVCVUcgKCJGbHVzaGluZyBjYWNoZSBvZiBzaXplICUiIEdfR1NJWkVfRk9STUFULAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpID0gdGltZXN0YW1wOworICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSA9IGVibWwtPnBvcyAtIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcik7CisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmZmVyKSA9IGVibWwtPnBvczsKKyAgaWYgKGVibWwtPmxhc3Rfd3JpdGVfcmVzdWx0ID09IEdTVF9GTE9XX09LKSB7CisgICAgaWYgKEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpICE9IGVibWwtPmxhc3RfcG9zKSB7CisgICAgICBnc3RfZWJtbF93cml0ZXJfc2VuZF9zZWdtZW50X2V2ZW50IChlYm1sLCBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSk7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICB9CisgICAgaWYgKGVibWwtPndyaXRpbmdfc3RyZWFtaGVhZGVyKSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19IRUFERVIpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0hFQURFUik7CisgICAgfQorICAgIGlmICghaXNfa2V5ZnJhbWUpIHsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworICAgIH0KKyAgICBlYm1sLT5sYXN0X3BvcyA9IGVibWwtPnBvczsKKyAgICBlYm1sLT5sYXN0X3dyaXRlX3Jlc3VsdCA9IGdzdF9wYWRfcHVzaCAoZWJtbC0+c3JjcGFkLCBidWZmZXIpOworICB9IGVsc2UgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgIH0KK30KKworCisvKioKKyAqIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfbmV3OgorICogQGVibWw6IGEgI0dzdEVibWxXcml0ZS4KKyAqIEBzaXplOiBzaXplIG9mIHRoZSByZXF1ZXN0ZWQgYnVmZmVyLgorICoKKyAqIENyZWF0ZSBhIGJ1ZmZlciBmb3Igb25lIGVsZW1lbnQuIElmIHRoZXJlIGlzCisgKiBhIGNhY2hlLCB1c2UgdGhhdCBpbnN0ZWFkLgorICoKKyAqIFJldHVybnM6IEEgbmV3ICNHc3RCdWZmZXIuCisgKi8KK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9uZXcgKEdzdEVibWxXcml0ZSAqIGVibWwsIEdzdE1hcEluZm8gKiBtYXAsIGd1aW50IHNpemUpCit7CisgIC8qIENyZWF0ZSBuZXcgYnVmZmVyIG9mIHNpemUgKyBJRCArIGxlbmd0aCAqLworICBHc3RCdWZmZXIgKmJ1ZjsKKworICAvKiBsZW5ndGgsIElEICovCisgIHNpemUgKz0gMTI7CisKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikgPSBlYm1sLT50aW1lc3RhbXA7CisKKyAgLyogRklYTUUgdW5tYXAgbm90IHBvc3NpYmxlICovCisgIGdzdF9idWZmZXJfbWFwIChidWYsIG1hcCwgR1NUX01BUF9XUklURSk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworCisvKioKKyAqIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfaWQ6CisgKiBAZGF0YV9pbm91dDogUG9pbnRlciB0byBkYXRhIHBvaW50ZXIKKyAqIEBpZDogRWxlbWVudCBJRCB0aGF0IHNob3VsZCBiZSB3cml0dGVuLgorICogCisgKiBXcml0ZSBlbGVtZW50IElEIGludG8gYSBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfZWJtbF93cml0ZV9lbGVtZW50X2lkIChndWludDggKiogZGF0YV9pbm91dCwgZ3VpbnQzMiBpZCkKK3sKKyAgZ3VpbnQ4ICpkYXRhID0gKmRhdGFfaW5vdXQ7CisgIGd1aW50IGJ5dGVzID0gNCwgbWFzayA9IDB4MTA7CisKKyAgLyogZ2V0IElEIGxlbmd0aCAqLworICB3aGlsZSAoIShpZCAmIChtYXNrIDw8ICgoYnl0ZXMgLSAxKSAqIDgpKSkgJiYgYnl0ZXMgPiAwKSB7CisgICAgbWFzayA8PD0gMTsKKyAgICBieXRlcy0tOworICB9CisKKyAgLyogaWYgaW52YWxpZCBJRCwgdXNlIGR1bW15ICovCisgIGlmIChieXRlcyA9PSAwKSB7CisgICAgR1NUX1dBUk5JTkcgKCJJbnZhbGlkIElELCB2b2lkaW5nIik7CisgICAgYnl0ZXMgPSAxOworICAgIGlkID0gR1NUX0VCTUxfSURfVk9JRDsKKyAgfQorCisgIC8qIHdyaXRlIG91dCwgQkUgKi8KKyAgKmRhdGFfaW5vdXQgKz0gYnl0ZXM7CisgIHdoaWxlIChieXRlcy0tKSB7CisgICAgZGF0YVtieXRlc10gPSBpZCAmIDB4ZmY7CisgICAgaWQgPj49IDg7CisgIH0KK30KKworCisvKioKKyAqIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfc2l6ZToKKyAqIEBkYXRhX2lub3V0OiBQb2ludGVyIHRvIGRhdGEgcG9pbnRlcgorICogQHNpemU6IEVsZW1lbnQgbGVuZ3RoLgorICoKKyAqIFdyaXRlIGVsZW1lbnQgbGVuZ3RoIGludG8gYSBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfZWJtbF93cml0ZV9lbGVtZW50X3NpemUgKGd1aW50OCAqKiBkYXRhX2lub3V0LCBndWludDY0IHNpemUpCit7CisgIGd1aW50OCAqZGF0YSA9ICpkYXRhX2lub3V0OworICBndWludCBieXRlcyA9IDEsIG1hc2sgPSAweDgwOworCisgIGlmIChzaXplICE9IEdTVF9FQk1MX1NJWkVfVU5LTk9XTikgeworICAgIC8qIGhvdyBtYW55IGJ5dGVzPyAtIHVzZSBtYXNrLTEgYmVjYXVzZSBhbiBhbGwtMSBiaXRzZXQgaXMgbm90IGFsbG93ZWQgKi8KKyAgICB3aGlsZSAoYnl0ZXMgPD0gOCAmJiAoc2l6ZSA+PiAoKGJ5dGVzIC0gMSkgKiA4KSkgPj0gKG1hc2sgLSAxKSkgeworICAgICAgbWFzayA+Pj0gMTsKKyAgICAgIGJ5dGVzKys7CisgICAgfQorCisgICAgLyogaWYgaW52YWxpZCBzaXplLCB1c2UgbWF4LiAqLworICAgIGlmIChieXRlcyA+IDgpIHsKKyAgICAgIEdTVF9XQVJOSU5HICgiSW52YWxpZCBzaXplLCB3cml0aW5nIHNpemUgdW5rbm93biIpOworICAgICAgbWFzayA9IDB4MDE7CisgICAgICBieXRlcyA9IDg7CisgICAgICAvKiBOb3cgaGVyZSdzIGEgcmVhbCBGSVhNRTogd2UgY2Fubm90IHJlYWQgdGhvc2UgeWV0ISAqLworICAgICAgc2l6ZSA9IEdTVF9FQk1MX1NJWkVfVU5LTk9XTjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbWFzayA9IDB4MDE7CisgICAgYnl0ZXMgPSA4OworICB9CisKKyAgLyogd3JpdGUgb3V0LCBCRSwgd2l0aCBsZW5ndGggc2l6ZSBtYXJrZXIgKi8KKyAgKmRhdGFfaW5vdXQgKz0gYnl0ZXM7CisgIHdoaWxlIChieXRlcy0tID4gMCkgeworICAgIGRhdGFbYnl0ZXNdID0gc2l6ZSAmIDB4ZmY7CisgICAgc2l6ZSA+Pj0gODsKKyAgICBpZiAoIWJ5dGVzKQorICAgICAgKmRhdGEgfD0gbWFzazsKKyAgfQorfQorCisKKy8qKgorICogZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9kYXRhOgorICogQGRhdGFfaW5vdXQ6IFBvaW50ZXIgdG8gZGF0YSBwb2ludGVyCisgKiBAd3JpdGU6IERhdGEgdGhhdCBzaG91bGQgYmUgd3JpdHRlbi4KKyAqIEBsZW5ndGg6IExlbmd0aCBvZiB0aGUgZGF0YS4KKyAqCisgKiBXcml0ZSBlbGVtZW50IGRhdGEgaW50byBhIGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQKK2dzdF9lYm1sX3dyaXRlX2VsZW1lbnRfZGF0YSAoZ3VpbnQ4ICoqIGRhdGFfaW5vdXQsIGd1aW50OCAqIHdyaXRlLAorICAgIGd1aW50NjQgbGVuZ3RoKQoreworICBtZW1jcHkgKCpkYXRhX2lub3V0LCB3cml0ZSwgbGVuZ3RoKTsKKyAgKmRhdGFfaW5vdXQgKz0gbGVuZ3RoOworfQorCisKKy8qKgorICogZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9wdXNoOgorICogQGVibWw6ICNHc3RFYm1sV3JpdGUKKyAqIEBidWY6ICNHc3RCdWZmZXIgdG8gYmUgd3JpdHRlbi4KKyAqIEBidWZfZGF0YTogU3RhcnQgb2YgZGF0YSB0byBwdXNoIGZyb20gQGJ1ZiAob3IgTlVMTCBmb3Igd2hvbGUgYnVmZmVyKS4KKyAqIEBidWZfZGF0YV9lbmQ6IERhdGEgcG9pbnRlciBwb3NpdGlvbmVkIGFmdGVyIHRoZSBsYXN0IGJ5dGUgaW4gQGJ1Zl9kYXRhIChvcgorICogTlVMTCBmb3Igd2hvbGUgYnVmZmVyKS4KKyAqIAorICogV3JpdGUgb3V0IGJ1ZmZlciBieSBtb3ZpbmcgaXQgdG8gdGhlIG5leHQgZWxlbWVudC4KKyAqLworc3RhdGljIHZvaWQKK2dzdF9lYm1sX3dyaXRlX2VsZW1lbnRfcHVzaCAoR3N0RWJtbFdyaXRlICogZWJtbCwgR3N0QnVmZmVyICogYnVmLAorICAgIGd1aW50OCAqIGJ1Zl9kYXRhLCBndWludDggKiBidWZfZGF0YV9lbmQpCit7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludCBkYXRhX3NpemU7CisKKyAgbWFwLmRhdGEgPSBOVUxMOworCisgIGlmIChidWZfZGF0YV9lbmQpCisgICAgZGF0YV9zaXplID0gYnVmX2RhdGFfZW5kIC0gYnVmX2RhdGE7CisgIGVsc2UKKyAgICBkYXRhX3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworCisgIGVibWwtPnBvcyArPSBkYXRhX3NpemU7CisKKyAgLyogaWYgdGhlcmUncyBubyBjYWNoZSwgdGhlbiBkb24ndCBwdXNoIGl0ISAqLworICBpZiAoZWJtbC0+d3JpdGluZ19zdHJlYW1oZWFkZXIpIHsKKyAgICBpZiAoIWJ1Zl9kYXRhKSB7CisgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgYnVmX2RhdGEgPSBtYXAuZGF0YTsKKyAgICB9CisgICAgaWYgKCFidWZfZGF0YSkKKyAgICAgIEdTVF9XQVJOSU5HICgiRmFpbGVkIHRvIG1hcCBidWZmZXIiKTsKKyAgICBlbHNlIGlmICghZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhIChlYm1sLT5zdHJlYW1oZWFkZXIsIGJ1Zl9kYXRhLAorICAgICAgICAgICAgZGF0YV9zaXplKSkKKyAgICAgIEdTVF9XQVJOSU5HICgiRXJyb3Igd3JpdGluZyBkYXRhIHRvIHN0cmVhbWhlYWRlciIpOworICB9CisgIGlmIChlYm1sLT5jYWNoZSkgeworICAgIGlmICghYnVmX2RhdGEpIHsKKyAgICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICBidWZfZGF0YSA9IG1hcC5kYXRhOworICAgIH0KKyAgICBpZiAoIWJ1Zl9kYXRhKQorICAgICAgR1NUX1dBUk5JTkcgKCJGYWlsZWQgdG8gbWFwIGJ1ZmZlciIpOworICAgIGVsc2UgaWYgKCFnc3RfYnl0ZV93cml0ZXJfcHV0X2RhdGEgKGVibWwtPmNhY2hlLCBidWZfZGF0YSwgZGF0YV9zaXplKSkKKyAgICAgIEdTVF9XQVJOSU5HICgiRXJyb3Igd3JpdGluZyBkYXRhIHRvIGNhY2hlIik7CisgICAgaWYgKG1hcC5kYXRhKQorICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChidWZfZGF0YSAmJiBtYXAuZGF0YSkKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIGlmIChlYm1sLT5sYXN0X3dyaXRlX3Jlc3VsdCA9PSBHU1RfRkxPV19PSykgeworICAgIGJ1ZiA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoYnVmKTsKKyAgICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSA9IGVibWwtPnBvcyAtIGRhdGFfc2l6ZTsKKyAgICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZikgPSBlYm1sLT5wb3M7CisgICAgaWYgKGVibWwtPndyaXRpbmdfc3RyZWFtaGVhZGVyKSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19IRUFERVIpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0hFQURFUik7CisgICAgfQorICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgICAgaWYgKEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpICE9IGVibWwtPmxhc3RfcG9zKSB7CisgICAgICBnc3RfZWJtbF93cml0ZXJfc2VuZF9zZWdtZW50X2V2ZW50IChlYm1sLCBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSk7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICB9CisgICAgZWJtbC0+bGFzdF9wb3MgPSBlYm1sLT5wb3M7CisgICAgZWJtbC0+bGFzdF93cml0ZV9yZXN1bHQgPSBnc3RfcGFkX3B1c2ggKGVibWwtPnNyY3BhZCwgYnVmKTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICB9Cit9CisKKworLyoqCisgKiBnc3RfZWJtbF93cml0ZV9zZWVrOgorICogQGVibWw6ICNHc3RFYm1sV3JpdGUKKyAqIEBwb3M6IFNlZWsgcG9zaXRpb24uCisgKiAKKyAqIFNlZWsuCisgKi8KK3ZvaWQKK2dzdF9lYm1sX3dyaXRlX3NlZWsgKEdzdEVibWxXcml0ZSAqIGVibWwsIGd1aW50NjQgcG9zKQoreworICBpZiAoZWJtbC0+d3JpdGluZ19zdHJlYW1oZWFkZXIpIHsKKyAgICBHU1RfREVCVUcgKCJ3YW50aW5nIHRvIHNlZWsgdG8gcG9zICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHBvcyk7CisgICAgaWYgKHBvcyA+PSBlYm1sLT5zdHJlYW1oZWFkZXJfcG9zICYmCisgICAgICAgIHBvcyA8PSBlYm1sLT5zdHJlYW1oZWFkZXJfcG9zICsgZWJtbC0+c3RyZWFtaGVhZGVyLT5wYXJlbnQuc2l6ZSkgeworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3NldF9wb3MgKGVibWwtPnN0cmVhbWhlYWRlciwKKyAgICAgICAgICBwb3MgLSBlYm1sLT5zdHJlYW1oZWFkZXJfcG9zKTsKKyAgICAgIEdTVF9ERUJVRyAoInNlZWtlZCBpbiBzdHJlYW1oZWFkZXIgdG8gcG9zaXRpb24gJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICBwb3MgLSBlYm1sLT5zdHJlYW1oZWFkZXJfcG9zKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkcKKyAgICAgICAgICAoIndlIGFyZSB3cml0aW5nIHN0cmVhbWhlYWRlciBzdGlsbCBhbmQgc2VlayBpcyBvdXQgb2YgYm91bmRzIik7CisgICAgfQorICB9CisgIC8qIENhY2hlIHNlZWtpbmcuIEEgYml0IGRhbmdlcm91cywgd2UgYXNzdW1lIHRoZSBjbGllbnQgd3JpdGVyCisgICAqIGtub3dzIHdoYXQgaGUncyBkb2luZy4uLiAqLworICBpZiAoZWJtbC0+Y2FjaGUpIHsKKyAgICAvKiB3aXRoaW4gYm91bmRzPyAqLworICAgIGlmIChwb3MgPj0gZWJtbC0+Y2FjaGVfcG9zICYmCisgICAgICAgIHBvcyA8PSBlYm1sLT5jYWNoZV9wb3MgKyBlYm1sLT5jYWNoZS0+cGFyZW50LnNpemUpIHsKKyAgICAgIEdTVF9ERUJVRyAoInNlZWtpbmcgaW4gY2FjaGUgdG8gJSIgR19HVUlOVDY0X0ZPUk1BVCwgcG9zKTsKKyAgICAgIGVibWwtPnBvcyA9IHBvczsKKyAgICAgIGdzdF9ieXRlX3dyaXRlcl9zZXRfcG9zIChlYm1sLT5jYWNoZSwgZWJtbC0+cG9zIC0gZWJtbC0+Y2FjaGVfcG9zKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0xPRyAoIlNlZWsgb3V0c2lkZSBjYWNoZSByYW5nZS4gQ2xlYXJpbmcuLi4iKTsKKyAgICAgIGdzdF9lYm1sX3dyaXRlX2ZsdXNoX2NhY2hlIChlYm1sLCBGQUxTRSwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgICAgfQorICB9CisKKyAgR1NUX0lORk8gKCJzY2hlZHVsaW5nIHNlZWsgdG8gJSIgR19HVUlOVDY0X0ZPUk1BVCwgcG9zKTsKKyAgZWJtbC0+cG9zID0gcG9zOworfQorCisKKy8qKgorICogZ3N0X2VibWxfd3JpdGVfZ2V0X3VpbnRfc2l6ZToKKyAqIEBudW06IE51bWJlciB0byBiZSBlbmNvZGVkLgorICogCisgKiBHZXQgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byB3cml0ZSBhIHVpbnQuCisgKgorICogUmV0dXJuczogRW5jb2RlZCB1aW50IGxlbmd0aC4KKyAqLworc3RhdGljIGd1aW50Citnc3RfZWJtbF93cml0ZV9nZXRfdWludF9zaXplIChndWludDY0IG51bSkKK3sKKyAgZ3VpbnQgc2l6ZSA9IDE7CisKKyAgLyogZ2V0IHNpemUgKi8KKyAgd2hpbGUgKHNpemUgPCA4ICYmIG51bSA+PSAoR19HSU5UNjRfQ09OU1RBTlQgKDEpIDw8IChzaXplICogOCkpKSB7CisgICAgc2l6ZSsrOworICB9CisKKyAgcmV0dXJuIHNpemU7Cit9CisKKworLyoqCisgKiBnc3RfZWJtbF93cml0ZV9zZXRfdWludDoKKyAqIEBkYXRhX2lub3V0OiBQb2ludGVyIHRvIGRhdGEgcG9pbnRlcgorICogQG51bTogTnVtYmVyIHRvIGJlIHdyaXR0ZW4uCisgKiBAc2l6ZTogRW5jb2RlZCBudW1iZXIgbGVuZ3RoLgorICoKKyAqIFdyaXRlIGFuIHVpbnQgaW50byBhIGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQKK2dzdF9lYm1sX3dyaXRlX3NldF91aW50IChndWludDggKiogZGF0YV9pbm91dCwgZ3VpbnQ2NCBudW0sIGd1aW50IHNpemUpCit7CisgIGd1aW50OCAqZGF0YSA9ICpkYXRhX2lub3V0OworCisgICpkYXRhX2lub3V0ICs9IHNpemU7CisKKyAgd2hpbGUgKHNpemUtLSA+IDApIHsKKyAgICBkYXRhW3NpemVdID0gbnVtICYgMHhmZjsKKyAgICBudW0gPj49IDg7CisgIH0KK30KKworCisvKioKKyAqIGdzdF9lYm1sX3dyaXRlX3VpbnQ6CisgKiBAZWJtbDogI0dzdEVibWxXcml0ZQorICogQGlkOiBFbGVtZW50IElELgorICogQG51bTogTnVtYmVyIHRvIGJlIHdyaXR0ZW4uCisgKgorICogV3JpdGUgdWludCBlbGVtZW50LgorICovCit2b2lkCitnc3RfZWJtbF93cml0ZV91aW50IChHc3RFYm1sV3JpdGUgKiBlYm1sLCBndWludDMyIGlkLCBndWludDY0IG51bSkKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIGd1aW50OCAqZGF0YV9zdGFydCwgKmRhdGFfZW5kOworICBndWludCBzaXplID0gZ3N0X2VibWxfd3JpdGVfZ2V0X3VpbnRfc2l6ZSAobnVtKTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYnVmID0gZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9uZXcgKGVibWwsICZtYXAsIHNpemVvZiAobnVtKSk7CisgIGRhdGFfZW5kID0gZGF0YV9zdGFydCA9IG1hcC5kYXRhOworCisgIC8qIHdyaXRlICovCisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfaWQgKCZkYXRhX2VuZCwgaWQpOworICBnc3RfZWJtbF93cml0ZV9lbGVtZW50X3NpemUgKCZkYXRhX2VuZCwgc2l6ZSk7CisgIGdzdF9lYm1sX3dyaXRlX3NldF91aW50ICgmZGF0YV9lbmQsIG51bSwgc2l6ZSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfc2V0X3NpemUgKGJ1ZiwgKGRhdGFfZW5kIC0gZGF0YV9zdGFydCkpOworCisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfcHVzaCAoZWJtbCwgYnVmLCBkYXRhX3N0YXJ0LCBkYXRhX2VuZCk7Cit9CisKKworLyoqCisgKiBnc3RfZWJtbF93cml0ZV9zaW50OgorICogQGVibWw6ICNHc3RFYm1sV3JpdGUKKyAqIEBpZDogRWxlbWVudCBJRC4KKyAqIEBudW06IE51bWJlciB0byBiZSB3cml0dGVuLgorICoKKyAqIFdyaXRlIHNpbnQgZWxlbWVudC4KKyAqLwordm9pZAorZ3N0X2VibWxfd3JpdGVfc2ludCAoR3N0RWJtbFdyaXRlICogZWJtbCwgZ3VpbnQzMiBpZCwgZ2ludDY0IG51bSkKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIGd1aW50OCAqZGF0YV9zdGFydCwgKmRhdGFfZW5kOworICBHc3RNYXBJbmZvIG1hcDsKKworICAvKiBpZiB0aGUgc2lnbmVkIG51bWJlciBpcyBvbiB0aGUgZWRnZSBvZiBhIGV4dHJhLWJ5dGUsCisgICAqIHRoZW4gd2UnbGwgZmFsbCBvdmVyIHdoZW4gZGV0ZWN0aW5nIGl0LiBFeGFtcGxlOiBpZiBJCisgICAqIGhhdmUgYSBudW1iZXIgKC0pMHg4MDAwIChHX01JTlNIT1JUKSwgdGhlbiBteSBhYnMoKTw8MQorICAgKiB3aWxsIGJlIDB4MTAwMDA7IHRoaXMgaXMgR19NQVhVU0hPUlQrMSEgU286IGlmICg8MCkgLTEuICovCisgIGd1aW50NjQgdW51bSA9IChudW0gPCAwID8gKC1udW0gLSAxKSA8PCAxIDogbnVtIDw8IDEpOworICBndWludCBzaXplID0gZ3N0X2VibWxfd3JpdGVfZ2V0X3VpbnRfc2l6ZSAodW51bSk7CisKKyAgYnVmID0gZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9uZXcgKGVibWwsICZtYXAsIHNpemVvZiAobnVtKSk7CisgIGRhdGFfZW5kID0gZGF0YV9zdGFydCA9IG1hcC5kYXRhOworCisgIC8qIG1ha2UgdW5zaWduZWQgKi8KKyAgaWYgKG51bSA+PSAwKSB7CisgICAgdW51bSA9IG51bTsKKyAgfSBlbHNlIHsKKyAgICB1bnVtID0gKChndWludDY0KSAweDgwKSA8PCAoKHNpemUgLSAxKSAqIDgpOworICAgIHVudW0gKz0gbnVtOworICAgIHVudW0gfD0gKChndWludDY0KSAweDgwKSA8PCAoKHNpemUgLSAxKSAqIDgpOworICB9CisKKyAgLyogd3JpdGUgKi8KKyAgZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9pZCAoJmRhdGFfZW5kLCBpZCk7CisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfc2l6ZSAoJmRhdGFfZW5kLCBzaXplKTsKKyAgZ3N0X2VibWxfd3JpdGVfc2V0X3VpbnQgKCZkYXRhX2VuZCwgdW51bSwgc2l6ZSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfc2V0X3NpemUgKGJ1ZiwgKGRhdGFfZW5kIC0gZGF0YV9zdGFydCkpOworCisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfcHVzaCAoZWJtbCwgYnVmLCBkYXRhX3N0YXJ0LCBkYXRhX2VuZCk7Cit9CisKKworLyoqCisgKiBnc3RfZWJtbF93cml0ZV9mbG9hdDoKKyAqIEBlYm1sOiAjR3N0RWJtbFdyaXRlCisgKiBAaWQ6IEVsZW1lbnQgSUQuCisgKiBAbnVtOiBOdW1iZXIgdG8gYmUgd3JpdHRlbi4KKyAqCisgKiBXcml0ZSBmbG9hdCBlbGVtZW50LgorICovCit2b2lkCitnc3RfZWJtbF93cml0ZV9mbG9hdCAoR3N0RWJtbFdyaXRlICogZWJtbCwgZ3VpbnQzMiBpZCwgZ2RvdWJsZSBudW0pCit7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4ICpkYXRhX3N0YXJ0LCAqZGF0YV9lbmQ7CisKKyAgYnVmID0gZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9uZXcgKGVibWwsICZtYXAsIHNpemVvZiAobnVtKSk7CisgIGRhdGFfZW5kID0gZGF0YV9zdGFydCA9IG1hcC5kYXRhOworCisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfaWQgKCZkYXRhX2VuZCwgaWQpOworICBnc3RfZWJtbF93cml0ZV9lbGVtZW50X3NpemUgKCZkYXRhX2VuZCwgOCk7CisgIG51bSA9IEdET1VCTEVfVE9fQkUgKG51bSk7CisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfZGF0YSAoJmRhdGFfZW5kLCAoZ3VpbnQ4ICopICYgbnVtLCA4KTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl9zZXRfc2l6ZSAoYnVmLCAoZGF0YV9lbmQgLSBkYXRhX3N0YXJ0KSk7CisKKyAgZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9wdXNoIChlYm1sLCBidWYsIGRhdGFfc3RhcnQsIGRhdGFfZW5kKTsKK30KKworCisvKioKKyAqIGdzdF9lYm1sX3dyaXRlX2FzY2lpOgorICogQGVibWw6ICNHc3RFYm1sV3JpdGUKKyAqIEBpZDogRWxlbWVudCBJRC4KKyAqIEBzdHI6IFN0cmluZyB0byBiZSB3cml0dGVuLgorICoKKyAqIFdyaXRlIHN0cmluZyBlbGVtZW50LgorICovCit2b2lkCitnc3RfZWJtbF93cml0ZV9hc2NpaSAoR3N0RWJtbFdyaXRlICogZWJtbCwgZ3VpbnQzMiBpZCwgY29uc3QgZ2NoYXIgKiBzdHIpCit7CisgIGdpbnQgbGVuID0gc3RybGVuIChzdHIpICsgMTsgIC8qIGFkZCB0cmFpbGluZyAnXDAnICovCisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4ICpkYXRhX3N0YXJ0LCAqZGF0YV9lbmQ7CisKKyAgYnVmID0gZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9uZXcgKGVibWwsICZtYXAsIGxlbik7CisgIGRhdGFfZW5kID0gZGF0YV9zdGFydCA9IG1hcC5kYXRhOworCisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfaWQgKCZkYXRhX2VuZCwgaWQpOworICBnc3RfZWJtbF93cml0ZV9lbGVtZW50X3NpemUgKCZkYXRhX2VuZCwgbGVuKTsKKyAgZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9kYXRhICgmZGF0YV9lbmQsIChndWludDggKikgc3RyLCBsZW4pOworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBnc3RfYnVmZmVyX3NldF9zaXplIChidWYsIChkYXRhX2VuZCAtIGRhdGFfc3RhcnQpKTsKKworICBnc3RfZWJtbF93cml0ZV9lbGVtZW50X3B1c2ggKGVibWwsIGJ1ZiwgZGF0YV9zdGFydCwgZGF0YV9lbmQpOworfQorCisKKy8qKgorICogZ3N0X2VibWxfd3JpdGVfdXRmODoKKyAqIEBlYm1sOiAjR3N0RWJtbFdyaXRlCisgKiBAaWQ6IEVsZW1lbnQgSUQuCisgKiBAc3RyOiBTdHJpbmcgdG8gYmUgd3JpdHRlbi4KKyAqCisgKiBXcml0ZSB1dGY4IGVuY29kZWQgc3RyaW5nIGVsZW1lbnQuCisgKi8KK3ZvaWQKK2dzdF9lYm1sX3dyaXRlX3V0ZjggKEdzdEVibWxXcml0ZSAqIGVibWwsIGd1aW50MzIgaWQsIGNvbnN0IGdjaGFyICogc3RyKQoreworICBnc3RfZWJtbF93cml0ZV9hc2NpaSAoZWJtbCwgaWQsIHN0cik7Cit9CisKKworLyoqCisgKiBnc3RfZWJtbF93cml0ZV9kYXRlOgorICogQGVibWw6ICNHc3RFYm1sV3JpdGUKKyAqIEBpZDogRWxlbWVudCBJRC4KKyAqIEBkYXRlOiBEYXRlIGluIHNlY29uZHMgc2luY2UgdGhlIHVuaXggZXBvY2guCisgKgorICogV3JpdGUgZGF0ZSBlbGVtZW50LgorICovCit2b2lkCitnc3RfZWJtbF93cml0ZV9kYXRlIChHc3RFYm1sV3JpdGUgKiBlYm1sLCBndWludDMyIGlkLCBnaW50NjQgZGF0ZSkKK3sKKyAgZ3N0X2VibWxfd3JpdGVfc2ludCAoZWJtbCwgaWQsIChkYXRlIC0gR1NUX0VCTUxfREFURV9PRkZTRVQpICogR1NUX1NFQ09ORCk7Cit9CisKKy8qKgorICogZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0OgorICogQGVibWw6ICNHc3RFYm1sV3JpdGUKKyAqIEBpZDogRWxlbWVudCBJRC4KKyAqCisgKiBTdGFydCB3aXJpdGluZyBtYXRlciBlbGVtZW50LgorICoKKyAqIE1hc3RlciB3cml0aW5nIGlzIGFubm95aW5nLiBXZSB1c2UgYSBzaXplIG1hcmtlciBvZgorICogdGhlIG1heC4gYWxsb3dlZCBsZW5ndGgsIHNvIHRoYXQgd2UgY2FuIGxhdGVyIGZpbGwgaXQKKyAqIGluIHZhbGlkbHkuIAorICoKKyAqIFJldHVybnM6IE1hc3RlciBzdGFydGluZyBwb3NpdGlvbi4KKyAqLworZ3VpbnQ2NAorZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChHc3RFYm1sV3JpdGUgKiBlYm1sLCBndWludDMyIGlkKQoreworICBndWludDY0IHBvcyA9IGVibWwtPnBvczsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmRhdGFfc3RhcnQsICpkYXRhX2VuZDsKKworICBidWYgPSBnc3RfZWJtbF93cml0ZV9lbGVtZW50X25ldyAoZWJtbCwgJm1hcCwgMCk7CisgIGRhdGFfZW5kID0gZGF0YV9zdGFydCA9IG1hcC5kYXRhOworCisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfaWQgKCZkYXRhX2VuZCwgaWQpOworICBwb3MgKz0gZGF0YV9lbmQgLSBkYXRhX3N0YXJ0OworICBnc3RfZWJtbF93cml0ZV9lbGVtZW50X3NpemUgKCZkYXRhX2VuZCwgR1NUX0VCTUxfU0laRV9VTktOT1dOKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl9zZXRfc2l6ZSAoYnVmLCAoZGF0YV9lbmQgLSBkYXRhX3N0YXJ0KSk7CisKKyAgZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9wdXNoIChlYm1sLCBidWYsIGRhdGFfc3RhcnQsIGRhdGFfZW5kKTsKKworICByZXR1cm4gcG9zOworfQorCisKKy8qKgorICogZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaF9mdWxsOgorICogQGVibWw6ICNHc3RFYm1sV3JpdGUKKyAqIEBzdGFydHBvczogTWFzdGVyIHN0YXJ0aW5nIHBvc2l0aW9uLgorICoKKyAqIEZpbmlzaCB3cml0aW5nIG1hc3RlciBlbGVtZW50LiAgU2l6ZSBvZiBtYXN0ZXIgZWxlbWVudCBpcyBkaWZmZXJlbmNlIGJldHdlZW4KKyAqIGN1cnJlbnQgcG9zaXRpb24gYW5kIHRoZSBlbGVtZW50IHN0YXJ0LCBhbmQgQGV4dHJhX3NpemUgYWRkZWQgdG8gdGhpcy4KKyAqLwordm9pZAorZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaF9mdWxsIChHc3RFYm1sV3JpdGUgKiBlYm1sLCBndWludDY0IHN0YXJ0cG9zLAorICAgIGd1aW50NjQgZXh0cmFfc2l6ZSkKK3sKKyAgZ3VpbnQ2NCBwb3MgPSBlYm1sLT5wb3M7CisgIGd1aW50OCAqZGF0YSA9IGdfbWFsbG9jICg4KTsKKyAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChkYXRhLCA4KTsKKworICBnc3RfZWJtbF93cml0ZV9zZWVrIChlYm1sLCBzdGFydHBvcyk7CisKKyAgR1NUX1dSSVRFX1VJTlQ2NF9CRSAoZGF0YSwKKyAgICAgIChHX0dJTlQ2NF9DT05TVEFOVCAoMSkgPDwgNTYpIHwgKHBvcyAtIHN0YXJ0cG9zIC0gOCArIGV4dHJhX3NpemUpKTsKKworICBnc3RfZWJtbF93cml0ZV9lbGVtZW50X3B1c2ggKGVibWwsIGJ1ZiwgTlVMTCwgTlVMTCk7CisgIGdzdF9lYm1sX3dyaXRlX3NlZWsgKGVibWwsIHBvcyk7Cit9CisKK3ZvaWQKK2dzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKEdzdEVibWxXcml0ZSAqIGVibWwsIGd1aW50NjQgc3RhcnRwb3MpCit7CisgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2hfZnVsbCAoZWJtbCwgc3RhcnRwb3MsIDApOworfQorCisvKioKKyAqIGdzdF9lYm1sX3dyaXRlX2JpbmFyeToKKyAqIEBlYm1sOiAjR3N0RWJtbFdyaXRlCisgKiBAaWQ6IEVsZW1lbnQgSUQuCisgKiBAYmluYXJ5OiBEYXRhIHRvIGJlIHdyaXR0ZW4uCisgKiBAbGVuZ3RoOiBMZW5ndGggb2YgdGhlIGRhdGEKKyAqCisgKiBXcml0ZSBhbiBlbGVtZW50IHdpdGggYmluYXJ5IGRhdGEuCisgKi8KK3ZvaWQKK2dzdF9lYm1sX3dyaXRlX2JpbmFyeSAoR3N0RWJtbFdyaXRlICogZWJtbCwKKyAgICBndWludDMyIGlkLCBndWludDggKiBiaW5hcnksIGd1aW50NjQgbGVuZ3RoKQoreworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YV9zdGFydCwgKmRhdGFfZW5kOworCisgIGJ1ZiA9IGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfbmV3IChlYm1sLCAmbWFwLCBsZW5ndGgpOworICBkYXRhX2VuZCA9IGRhdGFfc3RhcnQgPSBtYXAuZGF0YTsKKworICBnc3RfZWJtbF93cml0ZV9lbGVtZW50X2lkICgmZGF0YV9lbmQsIGlkKTsKKyAgZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9zaXplICgmZGF0YV9lbmQsIGxlbmd0aCk7CisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfZGF0YSAoJmRhdGFfZW5kLCBiaW5hcnksIGxlbmd0aCk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfc2V0X3NpemUgKGJ1ZiwgKGRhdGFfZW5kIC0gZGF0YV9zdGFydCkpOworCisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfcHVzaCAoZWJtbCwgYnVmLCBkYXRhX3N0YXJ0LCBkYXRhX2VuZCk7Cit9CisKKworLyoqCisgKiBnc3RfZWJtbF93cml0ZV9idWZmZXJfaGVhZGVyOgorICogQGVibWw6ICNHc3RFYm1sV3JpdGUKKyAqIEBpZDogRWxlbWVudCBJRC4KKyAqIEBsZW5ndGg6IExlbmd0aCBvZiB0aGUgZGF0YQorICogCisgKiBXcml0ZSBoZWFkZXIgb2YgdGhlIGJpbmFyeSBlbGVtZW50ICh1c2Ugd2l0aCBnc3RfZWJtbF93cml0ZV9idWZmZXIgZnVuY3Rpb24pLgorICogCisgKiBGb3IgdGhpbmdzIGxpa2UgdmlkZW8gZnJhbWVzIGFuZCBhdWRpbyBzYW1wbGVzLAorICogeW91IHdhbnQgdG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzIGl0IGRvZXNuJ3QgaGF2ZQorICogdGhlIG92ZXJoZWFkIG9mIG1lbWNweSgpIHRoYXQgb3RoZXIgZnVuY3Rpb25zCisgKiBzdWNoIGFzIHdyaXRlX2JpbmFyeSgpIGRvIGhhdmUuCisgKi8KK3ZvaWQKK2dzdF9lYm1sX3dyaXRlX2J1ZmZlcl9oZWFkZXIgKEdzdEVibWxXcml0ZSAqIGVibWwsIGd1aW50MzIgaWQsIGd1aW50NjQgbGVuZ3RoKQoreworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YV9zdGFydCwgKmRhdGFfZW5kOworCisgIGJ1ZiA9IGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfbmV3IChlYm1sLCAmbWFwLCAwKTsKKyAgZGF0YV9lbmQgPSBkYXRhX3N0YXJ0ID0gbWFwLmRhdGE7CisKKyAgZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9pZCAoJmRhdGFfZW5kLCBpZCk7CisgIGdzdF9lYm1sX3dyaXRlX2VsZW1lbnRfc2l6ZSAoJmRhdGFfZW5kLCBsZW5ndGgpOworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBnc3RfYnVmZmVyX3NldF9zaXplIChidWYsIChkYXRhX2VuZCAtIGRhdGFfc3RhcnQpKTsKKworICBnc3RfZWJtbF93cml0ZV9lbGVtZW50X3B1c2ggKGVibWwsIGJ1ZiwgZGF0YV9zdGFydCwgZGF0YV9lbmQpOworfQorCisKKy8qKgorICogZ3N0X2VibWxfd3JpdGVfYnVmZmVyOgorICogQGVibWw6ICNHc3RFYm1sV3JpdGUKKyAqIEBidWY6ICNHc3RCdWZmZXIgY29pbnRhaW5pbmcgdGhlIGRhdGEuCisgKgorICogV3JpdGUgIGJpbmFyeSBlbGVtZW50IChzZWUgZ3N0X2VibWxfd3JpdGVfYnVmZmVyX2hlYWRlcikuCisgKi8KK3ZvaWQKK2dzdF9lYm1sX3dyaXRlX2J1ZmZlciAoR3N0RWJtbFdyaXRlICogZWJtbCwgR3N0QnVmZmVyICogYnVmKQoreworICBnc3RfZWJtbF93cml0ZV9lbGVtZW50X3B1c2ggKGVibWwsIGJ1ZiwgTlVMTCwgTlVMTCk7Cit9CisKKworLyoqCisgKiBnc3RfZWJtbF9yZXBsYWNlX3VpbnQ6CisgKiBAZWJtbDogI0dzdEVibWxXcml0ZQorICogQHBvczogUG9zaXRpb24gb2YgdGhlIHVpbnQgdGhhdCBzaG91bGQgYmUgcmVwbGFjZWQuCisgKiBAbnVtOiBOZXcgdmFsdWUuCisgKgorICogUmVwbGFjZSB1aW50IHdpdGggYSBuZXcgdmFsdWUuCisgKiAKKyAqIFdoZW4gcmVwbGFjaW5nIGEgdWludCwgd2UgYXNzdW1lIHRoYXQgaXQgaXMgKmFsd2F5cyoKKyAqIDgtYnl0ZSwgc2luY2UgdGhhdCdzIHRoZSBzYWZlc3QgZ3Vlc3Mgd2UgY2FuIGRvLiBUaGlzCisgKiBpcyBqdXN0IGZvciBzaW1wbGljaXR5LgorICoKKyAqIEZJWE1FOiB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJlcGxhY2VkIHdpdGggc29tZXRoaW5nCisgKiBwcm9wZXIuIFRoaXMgaXMgYSBjcnVkZSBoYWNrLgorICovCit2b2lkCitnc3RfZWJtbF9yZXBsYWNlX3VpbnQgKEdzdEVibWxXcml0ZSAqIGVibWwsIGd1aW50NjQgcG9zLCBndWludDY0IG51bSkKK3sKKyAgZ3VpbnQ2NCBvbGRwb3MgPSBlYm1sLT5wb3M7CisgIGd1aW50OCAqZGF0YV9zdGFydCwgKmRhdGFfZW5kOworICBHc3RCdWZmZXIgKmJ1ZjsKKworICBkYXRhX3N0YXJ0ID0gZ19tYWxsb2MgKDgpOworICBkYXRhX2VuZCA9IGRhdGFfc3RhcnQ7CisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGRhdGFfc3RhcnQsIDgpOworCisgIGdzdF9lYm1sX3dyaXRlX3NlZWsgKGVibWwsIHBvcyk7CisgIGdzdF9lYm1sX3dyaXRlX3NldF91aW50ICgmZGF0YV9lbmQsIG51bSwgOCk7CisKKyAgZ3N0X2VibWxfd3JpdGVfZWxlbWVudF9wdXNoIChlYm1sLCBidWYsIGRhdGFfc3RhcnQsIGRhdGFfZW5kKTsKKyAgZ3N0X2VibWxfd3JpdGVfc2VlayAoZWJtbCwgb2xkcG9zKTsKK30KKworLyoqCisgKiBnc3RfZWJtbF93cml0ZV9oZWFkZXI6CisgKiBAZWJtbDogI0dzdEVibWxXcml0ZQorICogQGRvY3R5cGU6IERvY3VtZW50IHR5cGUuCisgKiBAdmVyc2lvbjogRG9jdW1lbnQgdHlwZSB2ZXJzaW9uLgorICogCisgKiBXcml0ZSBFQk1MIGhlYWRlci4KKyAqLwordm9pZAorZ3N0X2VibWxfd3JpdGVfaGVhZGVyIChHc3RFYm1sV3JpdGUgKiBlYm1sLCBjb25zdCBnY2hhciAqIGRvY3R5cGUsCisgICAgZ3VpbnQgdmVyc2lvbikKK3sKKyAgZ3VpbnQ2NCBwb3M7CisKKyAgLyogd3JpdGUgdGhlIGJhc2ljIEVCTUwgaGVhZGVyICovCisgIGdzdF9lYm1sX3dyaXRlX3NldF9jYWNoZSAoZWJtbCwgMHg0MCk7CisgIHBvcyA9IGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAoZWJtbCwgR1NUX0VCTUxfSURfSEVBREVSKTsKKyNpZiAoR1NUX0VCTUxfVkVSU0lPTiAhPSAxKQorICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfRUJNTF9JRF9FQk1MVkVSU0lPTiwgR1NUX0VCTUxfVkVSU0lPTik7CisgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9FQk1MX0lEX0VCTUxSRUFEVkVSU0lPTiwgR1NUX0VCTUxfVkVSU0lPTik7CisjZW5kaWYKKyNpZiAwCisgIC8qIHdlIGRvbid0IHdyaXRlIHRoZXNlIHVudGlsIHRoZXkncmUgIm5vbi1kZWZhdWx0IiAobmV2ZXIhKSAqLworICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfRUJNTF9JRF9FQk1MTUFYSURMRU5HVEgsIHNpemVvZiAoZ3VpbnQzMikpOworICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfRUJNTF9JRF9FQk1MTUFYU0laRUxFTkdUSCwgc2l6ZW9mIChndWludDY0KSk7CisjZW5kaWYKKyAgZ3N0X2VibWxfd3JpdGVfYXNjaWkgKGVibWwsIEdTVF9FQk1MX0lEX0RPQ1RZUEUsIGRvY3R5cGUpOworICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfRUJNTF9JRF9ET0NUWVBFVkVSU0lPTiwgdmVyc2lvbik7CisgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9FQk1MX0lEX0RPQ1RZUEVSRUFEVkVSU0lPTiwgdmVyc2lvbik7CisgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIHBvcyk7CisgIGdzdF9lYm1sX3dyaXRlX2ZsdXNoX2NhY2hlIChlYm1sLCBGQUxTRSwgMCk7Cit9CmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2EvZWJtbC13cml0ZS5oIGIvZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzE0M2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21hdHJvc2thL2VibWwtd3JpdGUuaApAQCAtMCwwICsxLDE1NCBAQAorLyogR1N0cmVhbWVyIEVCTUwgSS9PCisgKiAoYykgMjAwMyBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAoYykgMjAwNSBNaWNoYWwgQmVuZXMgPG1pY2hhbC5iZW5lc0B4ZXJpcy5jej4KKyAqCisgKiBlYm1sLXdyaXRlLmM6IHdyaXRlIEVCTUwgZGF0YSB0byBmaWxlL3N0cmVhbQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfRUJNTF9XUklURV9IX18KKyNkZWZpbmUgX19HU1RfRUJNTF9XUklURV9IX18KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXdyaXRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfRUJNTF9XUklURSBcCisgIChnc3RfZWJtbF93cml0ZV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX0VCTUxfV1JJVEUob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0VCTUxfV1JJVEUsIEdzdEVibWxXcml0ZSkpCisjZGVmaW5lIEdTVF9FQk1MX1dSSVRFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfRUJNTF9XUklURSwgR3N0RWJtbFdyaXRlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfRUJNTF9XUklURShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfRUJNTF9XUklURSkpCisjZGVmaW5lIEdTVF9JU19FQk1MX1dSSVRFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfRUJNTF9XUklURSkpCisjZGVmaW5lIEdTVF9FQk1MX1dSSVRFX0dFVF9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9FQk1MX1dSSVRFLCBHc3RFYm1sV3JpdGVDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RFYm1sV3JpdGUgeworICBHc3RPYmplY3Qgb2JqZWN0OworCisgIEdzdFBhZCAqc3JjcGFkOworICBndWludDY0IHBvczsKKyAgZ3VpbnQ2NCBsYXN0X3BvczsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKworICBHc3RCeXRlV3JpdGVyICpjYWNoZTsKKyAgZ3VpbnQ2NCBjYWNoZV9wb3M7CisKKyAgR3N0Rmxvd1JldHVybiBsYXN0X3dyaXRlX3Jlc3VsdDsKKworICBnYm9vbGVhbiB3cml0aW5nX3N0cmVhbWhlYWRlcjsKKyAgR3N0Qnl0ZVdyaXRlciAqc3RyZWFtaGVhZGVyOworICBndWludDY0IHN0cmVhbWhlYWRlcl9wb3M7CisKKyAgR3N0Q2FwcyAqY2FwczsKKworICBnYm9vbGVhbiBzdHJlYW1hYmxlOworfSBHc3RFYm1sV3JpdGU7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RFYm1sV3JpdGVDbGFzcyB7CisgIEdzdE9iamVjdENsYXNzIHBhcmVudDsKK30gR3N0RWJtbFdyaXRlQ2xhc3M7CisKK0dUeXBlICAgZ3N0X2VibWxfd3JpdGVfZ2V0X3R5cGUgICAgICAodm9pZCk7CisKK0dzdEVibWxXcml0ZSAqZ3N0X2VibWxfd3JpdGVfbmV3ICAgICAoR3N0UGFkICpzcmNwYWQpOwordm9pZCAgICBnc3RfZWJtbF93cml0ZV9yZXNldCAgICAgICAgIChHc3RFYm1sV3JpdGUgKmVibWwpOworCitHc3RGbG93UmV0dXJuIGdzdF9lYm1sX2xhc3Rfd3JpdGVfcmVzdWx0IChHc3RFYm1sV3JpdGUgKmVibWwpOworCisvKiBVc2VkIHRvIGNyZWF0ZSBzdHJlYW1oZWFkZXJzICovCit2b2lkICAgIGdzdF9lYm1sX3N0YXJ0X3N0cmVhbWhlYWRlciAgKEdzdEVibWxXcml0ZSAqZWJtbCk7CitHc3RCdWZmZXIqICAgIGdzdF9lYm1sX3N0b3Bfc3RyZWFtaGVhZGVyICAgKEdzdEVibWxXcml0ZSAqZWJtbCk7CisKKy8qCisgKiBDYWNoaW5nIG1lYW5zIHRoYXQgd2UgZG8gbm90IHB1c2ggb25lIGJ1ZmZlciBmb3IKKyAqIGVhY2ggZWxlbWVudCwgYnV0IGZpbGwgdGhpcyBvbmUgdW50aWwgYSBmbHVzaC4KKyAqLwordm9pZCAgICBnc3RfZWJtbF93cml0ZV9zZXRfY2FjaGUgICAgIChHc3RFYm1sV3JpdGUgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50ICAgICAgICAgc2l6ZSk7Cit2b2lkICAgIGdzdF9lYm1sX3dyaXRlX2ZsdXNoX2NhY2hlICAgKEdzdEVibWxXcml0ZSAqZWJtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Jvb2xlYW4gaXNfa2V5ZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXApOworCisvKgorICogU2Vla2luZy4KKyAqLwordm9pZCAgICBnc3RfZWJtbF93cml0ZV9zZWVrICAgICAgICAgIChHc3RFYm1sV3JpdGUgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50NjQgICAgICAgcG9zKTsKKworLyoKKyAqIERhdGEgd3JpdGluZy4gCisgKi8KK3ZvaWQgICAgZ3N0X2VibWxfd3JpdGVfdWludCAgICAgICAgICAoR3N0RWJtbFdyaXRlICplYm1sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0ICAgICAgIG51bSk7Cit2b2lkICAgIGdzdF9lYm1sX3dyaXRlX3NpbnQgICAgICAgICAgKEdzdEVibWxXcml0ZSAqZWJtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDY0ICAgICAgICBudW0pOwordm9pZCAgICBnc3RfZWJtbF93cml0ZV9mbG9hdCAgICAgICAgIChHc3RFYm1sV3JpdGUgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgICAgICAgbnVtKTsKK3ZvaWQgICAgZ3N0X2VibWxfd3JpdGVfYXNjaWkgICAgICAgICAoR3N0RWJtbFdyaXRlICplYm1sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgKnN0cik7Cit2b2lkICAgIGdzdF9lYm1sX3dyaXRlX3V0ZjggICAgICAgICAgKEdzdEVibWxXcml0ZSAqZWJtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICpzdHIpOwordm9pZCAgICBnc3RfZWJtbF93cml0ZV9kYXRlICAgICAgICAgIChHc3RFYm1sV3JpdGUgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQ2NCAgICAgICAgZGF0ZSk7CitndWludDY0IGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAgKEdzdEVibWxXcml0ZSAqZWJtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAgICAgICBpZCk7Cit2b2lkICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKEdzdEVibWxXcml0ZSAqZWJtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCAgICAgICBzdGFydHBvcyk7Cit2b2lkICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2hfZnVsbCAoR3N0RWJtbFdyaXRlICogZWJtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCBzdGFydHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCBleHRyYV9zaXplKTsKK3ZvaWQgICAgZ3N0X2VibWxfd3JpdGVfYmluYXJ5ICAgICAgICAoR3N0RWJtbFdyaXRlICplYm1sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWNoYXIgICAgICAgKmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCAgICAgICBsZW5ndGgpOwordm9pZCAgICBnc3RfZWJtbF93cml0ZV9oZWFkZXIgICAgICAgIChHc3RFYm1sV3JpdGUgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAqZG9jdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQgICAgICAgICB2ZXJzaW9uKTsKKworLyoKKyAqIE5vdGU6IHRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBvbmx5IGZvciBtZWRpYSBkYXRhLgorICovCit2b2lkICAgIGdzdF9lYm1sX3dyaXRlX2J1ZmZlcl9oZWFkZXIgKEdzdEVibWxXcml0ZSAqZWJtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCAgICAgICBsZW5ndGgpOwordm9pZCAgICBnc3RfZWJtbF93cml0ZV9idWZmZXIgICAgICAgIChHc3RFYm1sV3JpdGUgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdEJ1ZmZlciAgICAqZGF0YSk7CisKKy8qCisgKiBBIGhhY2ssIGJhc2ljYWxseS4uLiBTZWUgbWF0cm9za2EtbXV4LmMuIEkgc2hvdWxkIGFjdHVhbGx5CisgKiBtYWtlIGEgbmljZSBfcmVwbGFjZV9lbGVtZW50X3dpdGhfc2l6ZSgpIG9yIHNvLCBidXQgdGhpcworICogd29ya3MgZm9yIG5vdy4KKyAqLwordm9pZCAgICBnc3RfZWJtbF9yZXBsYWNlX3VpbnQgICAgICAgIChHc3RFYm1sV3JpdGUgKmVibWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50NjQgICAgICAgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0ICAgICAgIG51bSk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9FQk1MX1dSSVRFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L21hdHJvc2thL2x6by5jIGIvZ3N0L21hdHJvc2thL2x6by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMWU4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbWF0cm9za2EvbHpvLmMKQEAgLTAsMCArMSwyOTIgQEAKKy8qCisgKiBMWk8gMXggZGVjb21wcmVzc2lvbgorICogQ29weXJpZ2h0IChjKSAyMDA2IFJlaW1hciBEb2VmZmluZ2VyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibHpvLmgiCisKKy8qISBkZWZpbmUgaWYgd2UgbWF5IHdyaXRlIHVwIHRvIDEyIGJ5dGVzIGJleW9uZCB0aGUgb3V0cHV0IGJ1ZmZlciAqLworLyogI2RlZmluZSBPVVRCVUZfUEFEREVEIDEgKi8KKy8qISBkZWZpbmUgaWYgd2UgbWF5IHJlYWQgdXAgdG8gOCBieXRlcyBiZXlvbmQgdGhlIGlucHV0IGJ1ZmZlciAqLworLyogI2RlZmluZSBJTkJVRl9QQURERUQgMSAqLwordHlwZWRlZiBzdHJ1Y3QgTFpPQ29udGV4dAoreworICBjb25zdCBndWludDggKmluLCAqaW5fZW5kOworICBndWludDggKm91dF9zdGFydCwgKm91dCwgKm91dF9lbmQ7CisgIGludCBlcnJvcjsKK30gTFpPQ29udGV4dDsKKworLyoKKyAqIFxicmllZiByZWFkIG9uZSBieXRlIGZyb20gaW5wdXQgYnVmZmVyLCBhdm9pZGluZyBvdmVycnVuCisgKiBccmV0dXJuIGJ5dGUgcmVhZAorICovCitzdGF0aWMgaW5saW5lIGludAorZ2V0X2J5dGUgKExaT0NvbnRleHQgKiBjKQoreworICBpZiAoYy0+aW4gPCBjLT5pbl9lbmQpCisgICAgcmV0dXJuICpjLT5pbisrOworICBjLT5lcnJvciB8PSBMWk9fSU5QVVRfREVQTEVURUQ7CisgIHJldHVybiAxOworfQorCisjaWZkZWYgSU5CVUZfUEFEREVECisjZGVmaW5lIEdFVEIoYykgKCooYykuaW4rKykKKyNlbHNlCisjZGVmaW5lIEdFVEIoYykgZ2V0X2J5dGUoJihjKSkKKyNlbmRpZgorCisvKgorICogXGJyaWVmIGRlY29kZSBhIGxlbmd0aCB2YWx1ZSBpbiB0aGUgY29kaW5nIHVzZWQgYnkgbHpvCisgKiBccGFyYW0geCBwcmV2aW91cyBieXRlIHZhbHVlCisgKiBccGFyYW0gbWFzayBiaXRzIHVzZWQgZnJvbSB4CisgKiBccmV0dXJuIGRlY29kZWQgbGVuZ3RoIHZhbHVlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitnZXRfbGVuIChMWk9Db250ZXh0ICogYywgaW50IHgsIGludCBtYXNrKQoreworICBpbnQgY250ID0geCAmIG1hc2s7CisgIGlmICghY250KSB7CisgICAgd2hpbGUgKCEoeCA9IGdldF9ieXRlIChjKSkpCisgICAgICBjbnQgKz0gMjU1OworICAgIGNudCArPSBtYXNrICsgeDsKKyAgfQorICByZXR1cm4gY250OworfQorCisvKiNkZWZpbmUgVU5BTElHTkVEX0xPQURTVE9SRSAqLworI2RlZmluZSBCVUlMVElOX01FTUNQWQorI2lmZGVmIFVOQUxJR05FRF9MT0FEU1RPUkUKKyNkZWZpbmUgQ09QWTIoZCwgcykgKihndWludDE2ICopKGQpID0gKihndWludDE2ICopKHMpOworI2RlZmluZSBDT1BZNChkLCBzKSAqKGd1aW50MzIgKikoZCkgPSAqKGd1aW50MzIgKikocyk7CisjZWxpZiBkZWZpbmVkKEJVSUxUSU5fTUVNQ1BZKQorI2RlZmluZSBDT1BZMihkLCBzKSBtZW1jcHkoZCwgcywgMik7CisjZGVmaW5lIENPUFk0KGQsIHMpIG1lbWNweShkLCBzLCA0KTsKKyNlbHNlCisjZGVmaW5lIENPUFkyKGQsIHMpIChkKVswXSA9IChzKVswXTsgKGQpWzFdID0gKHMpWzFdOworI2RlZmluZSBDT1BZNChkLCBzKSAoZClbMF0gPSAocylbMF07IChkKVsxXSA9IChzKVsxXTsgKGQpWzJdID0gKHMpWzJdOyAoZClbM10gPSAocylbM107CisjZW5kaWYKKworLyoKKyAqIFxicmllZiBjb3B5IGJ5dGVzIGZyb20gaW5wdXQgdG8gb3V0cHV0IGJ1ZmZlciB3aXRoIGNoZWNraW5nCisgKiBccGFyYW0gY250IG51bWJlciBvZiBieXRlcyB0byBjb3B5LCBtdXN0IGJlID49IDAKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitjb3B5IChMWk9Db250ZXh0ICogYywgaW50IGNudCkKK3sKKyAgcmVnaXN0ZXIgY29uc3QgZ3VpbnQ4ICpzcmMgPSBjLT5pbjsKKyAgcmVnaXN0ZXIgZ3VpbnQ4ICpkc3QgPSBjLT5vdXQ7CisgIGlmIChjbnQgPiBjLT5pbl9lbmQgLSBzcmMpIHsKKyAgICBjbnQgPSBNQVggKGMtPmluX2VuZCAtIHNyYywgMCk7CisgICAgYy0+ZXJyb3IgfD0gTFpPX0lOUFVUX0RFUExFVEVEOworICB9CisgIGlmIChjbnQgPiBjLT5vdXRfZW5kIC0gZHN0KSB7CisgICAgY250ID0gTUFYIChjLT5vdXRfZW5kIC0gZHN0LCAwKTsKKyAgICBjLT5lcnJvciB8PSBMWk9fT1VUUFVUX0ZVTEw7CisgIH0KKyNpZiBkZWZpbmVkKElOQlVGX1BBRERFRCkgJiYgZGVmaW5lZChPVVRCVUZfUEFEREVEKQorICBDT1BZNCAoZHN0LCBzcmMpOworICBzcmMgKz0gNDsKKyAgZHN0ICs9IDQ7CisgIGNudCAtPSA0OworICBpZiAoY250ID4gMCkKKyNlbmRpZgorICAgIG1lbWNweSAoZHN0LCBzcmMsIGNudCk7CisgIGMtPmluID0gc3JjICsgY250OworICBjLT5vdXQgPSBkc3QgKyBjbnQ7Cit9CisKKy8qCisgKiBcYnJpZWYgY29weSBwcmV2aW91c2x5IGRlY29kZWQgYnl0ZXMgdG8gY3VycmVudCBwb3NpdGlvbgorICogXHBhcmFtIGJhY2sgaG93IG1hbnkgYnl0ZXMgYmFjayB3ZSBzdGFydAorICogXHBhcmFtIGNudCBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSwgbXVzdCBiZSA+PSAwCisgKgorICogY250ID4gYmFjayBpcyB2YWxpZCwgdGhpcyB3aWxsIGNvcHkgdGhlIGJ5dGVzIHdlIGp1c3QgY29waWVkLAorICogdGh1cyBjcmVhdGluZyBhIHJlcGVhdGluZyBwYXR0ZXJuIHdpdGggYSBwZXJpb2QgbGVuZ3RoIG9mIGJhY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorY29weV9iYWNrcHRyIChMWk9Db250ZXh0ICogYywgaW50IGJhY2ssIGludCBjbnQpCit7CisgIHJlZ2lzdGVyIGNvbnN0IGd1aW50OCAqc3JjID0gJmMtPm91dFstYmFja107CisgIHJlZ2lzdGVyIGd1aW50OCAqZHN0ID0gYy0+b3V0OworICBpZiAoc3JjIDwgYy0+b3V0X3N0YXJ0IHx8IHNyYyA+IGRzdCkgeworICAgIGMtPmVycm9yIHw9IExaT19JTlZBTElEX0JBQ0tQVFI7CisgICAgcmV0dXJuOworICB9CisgIGlmIChjbnQgPiBjLT5vdXRfZW5kIC0gZHN0KSB7CisgICAgY250ID0gTUFYIChjLT5vdXRfZW5kIC0gZHN0LCAwKTsKKyAgICBjLT5lcnJvciB8PSBMWk9fT1VUUFVUX0ZVTEw7CisgIH0KKyAgaWYgKGJhY2sgPT0gMSkgeworICAgIG1lbXNldCAoZHN0LCAqc3JjLCBjbnQpOworICAgIGRzdCArPSBjbnQ7CisgIH0gZWxzZSB7CisjaWZkZWYgT1VUQlVGX1BBRERFRAorICAgIENPUFkyIChkc3QsIHNyYyk7CisgICAgQ09QWTIgKGRzdCArIDIsIHNyYyArIDIpOworICAgIHNyYyArPSA0OworICAgIGRzdCArPSA0OworICAgIGNudCAtPSA0OworICAgIGlmIChjbnQgPiAwKSB7CisgICAgICBDT1BZMiAoZHN0LCBzcmMpOworICAgICAgQ09QWTIgKGRzdCArIDIsIHNyYyArIDIpOworICAgICAgQ09QWTIgKGRzdCArIDQsIHNyYyArIDQpOworICAgICAgQ09QWTIgKGRzdCArIDYsIHNyYyArIDYpOworICAgICAgc3JjICs9IDg7CisgICAgICBkc3QgKz0gODsKKyAgICAgIGNudCAtPSA4OworICAgIH0KKyNlbmRpZgorICAgIGlmIChjbnQgPiAwKSB7CisgICAgICBpbnQgYmxvY2tsZW4gPSBiYWNrOworICAgICAgd2hpbGUgKGNudCA+IGJsb2NrbGVuKSB7CisgICAgICAgIG1lbWNweSAoZHN0LCBzcmMsIGJsb2NrbGVuKTsKKyAgICAgICAgZHN0ICs9IGJsb2NrbGVuOworICAgICAgICBjbnQgLT0gYmxvY2tsZW47CisgICAgICAgIGJsb2NrbGVuIDw8PSAxOworICAgICAgfQorICAgICAgbWVtY3B5IChkc3QsIHNyYywgY250KTsKKyAgICB9CisgICAgZHN0ICs9IGNudDsKKyAgfQorICBjLT5vdXQgPSBkc3Q7Cit9CisKKy8qCisgKiBcYnJpZWYgZGVjb2RlIExaTyAxeCBjb21wcmVzc2VkIGRhdGEKKyAqIFxwYXJhbSBvdXQgb3V0cHV0IGJ1ZmZlcgorICogXHBhcmFtIG91dGxlbiBzaXplIG9mIG91dHB1dCBidWZmZXIsIG51bWJlciBvZiBieXRlcyBsZWZ0IGFyZSByZXR1cm5lZCBoZXJlCisgKiBccGFyYW0gaW4gaW5wdXQgYnVmZmVyCisgKiBccGFyYW0gaW5sZW4gc2l6ZSBvZiBpbnB1dCBidWZmZXIsIG51bWJlciBvZiBieXRlcyBsZWZ0IGFyZSByZXR1cm5lZCBoZXJlCisgKiBccmV0dXJuIDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIGZsYWdzLCBzZWUgbHpvLmgKKyAqCisgKiBtYWtlIHN1cmUgYWxsIGJ1ZmZlcnMgYXJlIGFwcHJvcHJpYXRlbHkgcGFkZGVkLCBpbiBtdXN0IHByb3ZpZGUKKyAqIExaT19JTlBVVF9QQURESU5HLCBvdXQgbXVzdCBwcm92aWRlIExaT19PVVRQVVRfUEFERElORyBhZGRpdGlvbmFsIGJ5dGVzCisgKi8KK2ludAorbHpvMXhfZGVjb2RlICh2b2lkICpvdXQsIGludCAqb3V0bGVuLCBjb25zdCB2b2lkICppbiwgaW50ICppbmxlbikKK3sKKyAgaW50IHN0YXRlID0gMDsKKyAgaW50IHg7CisgIExaT0NvbnRleHQgYzsKKyAgYy5pbiA9IGluOworICBjLmluX2VuZCA9IChjb25zdCBndWludDggKikgaW4gKyAqaW5sZW47CisgIGMub3V0ID0gYy5vdXRfc3RhcnQgPSBvdXQ7CisgIGMub3V0X2VuZCA9IChndWludDggKikgb3V0ICsgKm91dGxlbjsKKyAgYy5lcnJvciA9IDA7CisgIHggPSBHRVRCIChjKTsKKyAgaWYgKHggPiAxNykgeworICAgIGNvcHkgKCZjLCB4IC0gMTcpOworICAgIHggPSBHRVRCIChjKTsKKyAgICBpZiAoeCA8IDE2KQorICAgICAgYy5lcnJvciB8PSBMWk9fRVJST1I7CisgIH0KKyAgaWYgKGMuaW4gPiBjLmluX2VuZCkKKyAgICBjLmVycm9yIHw9IExaT19JTlBVVF9ERVBMRVRFRDsKKyAgd2hpbGUgKCFjLmVycm9yKSB7CisgICAgaW50IGNudCwgYmFjazsKKyAgICBpZiAoeCA+IDE1KSB7CisgICAgICBpZiAoeCA+IDYzKSB7CisgICAgICAgIGNudCA9ICh4ID4+IDUpIC0gMTsKKyAgICAgICAgYmFjayA9IChHRVRCIChjKSA8PCAzKSArICgoeCA+PiAyKSAmIDcpICsgMTsKKyAgICAgIH0gZWxzZSBpZiAoeCA+IDMxKSB7CisgICAgICAgIGNudCA9IGdldF9sZW4gKCZjLCB4LCAzMSk7CisgICAgICAgIHggPSBHRVRCIChjKTsKKyAgICAgICAgYmFjayA9IChHRVRCIChjKSA8PCA2KSArICh4ID4+IDIpICsgMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNudCA9IGdldF9sZW4gKCZjLCB4LCA3KTsKKyAgICAgICAgYmFjayA9ICgxIDw8IDE0KSArICgoeCAmIDgpIDw8IDExKTsKKyAgICAgICAgeCA9IEdFVEIgKGMpOworICAgICAgICBiYWNrICs9IChHRVRCIChjKSA8PCA2KSArICh4ID4+IDIpOworICAgICAgICBpZiAoYmFjayA9PSAoMSA8PCAxNCkpIHsKKyAgICAgICAgICBpZiAoY250ICE9IDEpCisgICAgICAgICAgICBjLmVycm9yIHw9IExaT19FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0YXRlKSB7CisgICAgICBjbnQgPSBnZXRfbGVuICgmYywgeCwgMTUpOworICAgICAgY29weSAoJmMsIGNudCArIDMpOworICAgICAgeCA9IEdFVEIgKGMpOworICAgICAgaWYgKHggPiAxNSkKKyAgICAgICAgY29udGludWU7CisgICAgICBjbnQgPSAxOworICAgICAgYmFjayA9ICgxIDw8IDExKSArIChHRVRCIChjKSA8PCAyKSArICh4ID4+IDIpICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgY250ID0gMDsKKyAgICAgIGJhY2sgPSAoR0VUQiAoYykgPDwgMikgKyAoeCA+PiAyKSArIDE7CisgICAgfQorICAgIGNvcHlfYmFja3B0ciAoJmMsIGJhY2ssIGNudCArIDIpOworICAgIHN0YXRlID0gY250ID0geCAmIDM7CisgICAgY29weSAoJmMsIGNudCk7CisgICAgeCA9IEdFVEIgKGMpOworICB9CisgICppbmxlbiA9IGMuaW5fZW5kIC0gYy5pbjsKKyAgaWYgKGMuaW4gPiBjLmluX2VuZCkKKyAgICAqaW5sZW4gPSAwOworICAqb3V0bGVuID0gYy5vdXRfZW5kIC0gYy5vdXQ7CisgIHJldHVybiBjLmVycm9yOworfQorCisjaWZkZWYgVEVTVAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bHpvL2x6bzF4Lmg+CisjaW5jbHVkZSAibG9nLmgiCisjZGVmaW5lIE1BWFNaICgxMCoxMDI0KjEwMjQpCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIEZJTEUgKmluID0gZm9wZW4gKGFyZ3ZbMV0sICJyYiIpOworICBndWludDggKm9yaWcgPSBhdl9tYWxsb2MgKE1BWFNaICsgMTYpOworICBndWludDggKmNvbXAgPSBhdl9tYWxsb2MgKDIgKiBNQVhTWiArIDE2KTsKKyAgZ3VpbnQ4ICpkZWNvbXAgPSBhdl9tYWxsb2MgKE1BWFNaICsgMTYpOworICBnc2l6ZSBzID0gZnJlYWQgKG9yaWcsIDEsIE1BWFNaLCBpbik7CisgIGx6b191aW50IGNsZW4gPSAwOworICBsb25nIHRtcFtMWk8xWF9NRU1fQ09NUFJFU1NdOworICBpbnQgaW5sZW4sIG91dGxlbjsKKyAgaW50IGk7CisgIGF2X2xvZ19sZXZlbCA9IEFWX0xPR19ERUJVRzsKKyAgbHpvMXhfOTk5X2NvbXByZXNzIChvcmlnLCBzLCBjb21wLCAmY2xlbiwgdG1wKTsKKyAgZm9yIChpID0gMDsgaSA8IDMwMDsgaSsrKSB7CisgICAgU1RBUlRfVElNRVIgaW5sZW4gPSBjbGVuOworICAgIG91dGxlbiA9IE1BWFNaOworI2lmZGVmIExJQkxaTworICAgIGlmIChsem8xeF9kZWNvbXByZXNzX3NhZmUgKGNvbXAsIGlubGVuLCBkZWNvbXAsICZvdXRsZW4sIE5VTEwpKQorI2VsaWYgZGVmaW5lZChMSUJMWk9fVU5TQUZFKQorICAgIGlmIChsem8xeF9kZWNvbXByZXNzIChjb21wLCBpbmxlbiwgZGVjb21wLCAmb3V0bGVuLCBOVUxMKSkKKyNlbHNlCisgICAgaWYgKGx6bzF4X2RlY29kZSAoZGVjb21wLCAmb3V0bGVuLCBjb21wLCAmaW5sZW4pKQorI2VuZGlmCisgICAgICBhdl9sb2cgKE5VTEwsIEFWX0xPR19FUlJPUiwgImRlY29tcHJlc3Npb24gZXJyb3JcbiIpOworICAgIFNUT1BfVElNRVIgKCJsem9kIikKKyAgfQorICBpZiAobWVtY21wIChvcmlnLCBkZWNvbXAsIHMpKQorICAgIGF2X2xvZyAoTlVMTCwgQVZfTE9HX0VSUk9SLCAiZGVjb21wcmVzc2lvbiBpbmNvcnJlY3RcbiIpOworICBlbHNlCisgICAgYXZfbG9nIChOVUxMLCBBVl9MT0dfRVJST1IsICJkZWNvbXByZXNzaW9uIG9rXG4iKTsKKworICBmY2xvc2UgKGluKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9tYXRyb3NrYS9sem8uaCBiL2dzdC9tYXRyb3NrYS9sem8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzc5NWY3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21hdHJvc2thL2x6by5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMWk8gMXggZGVjb21wcmVzc2lvbgorICogY29weXJpZ2h0IChjKSAyMDA2IFJlaW1hciBEb2VmZmluZ2VyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgRkZNUEVHX0xaT19ICisjZGVmaW5lIEZGTVBFR19MWk9fSAorCisjZGVmaW5lIExaT19JTlBVVF9ERVBMRVRFRCAxCisjZGVmaW5lIExaT19PVVRQVVRfRlVMTCAyCisjZGVmaW5lIExaT19JTlZBTElEX0JBQ0tQVFIgNAorI2RlZmluZSBMWk9fRVJST1IgOAorCisjZGVmaW5lIExaT19JTlBVVF9QQURESU5HIDgKKyNkZWZpbmUgTFpPX09VVFBVVF9QQURESU5HIDEyCisKK2ludCBsem8xeF9kZWNvZGUodm9pZCAqb3V0LCBpbnQgKm91dGxlbiwgY29uc3Qgdm9pZCAqaW4sIGludCAqaW5sZW4pOworCisjZW5kaWYgLyogRkZNUEVHX0xaT19IICovCmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYyBiL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYmY3NjMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguYwpAQCAtMCwwICsxLDY0MDcgQEAKKy8qIEdTdHJlYW1lciBNYXRyb3NrYSBtdXhlci9kZW11eGVyCisgKiAoYykgMjAwMyBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAoYykgMjAwNiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICogKGMpIDIwMDggU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICogKGMpIDIwMTEgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorICoKKyAqIG1hdHJvc2thLWRlbXV4LmM6IG1hdHJvc2thIGZpbGUvc3RyZWFtIGRlbXV4ZXIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKiBUT0RPOiBjaGVjayBDUkMzMiBpZiBwcmVzZW50CisgKiBUT0RPOiB0aGVyZSBjYW4gYmUgYSBzZWdtZW50IGFmdGVyIHRoZSBmaXJzdCBzZWdtZW50LiBIYW5kbGUgbGlrZQorICogICAgICAgY2hhaW5lZCBvZ2dzLiBGaXhlcyAjMzM0MDgyCisgKiBUT0RPOiBUZXN0IHNhbXBsZXM6IGh0dHA6Ly93d3cubWF0cm9za2Eub3JnL3NhbXBsZXMvbWF0cml4L2luZGV4Lmh0bWwKKyAqICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3NhbXBsZXMubXBsYXllcmhxLmh1L01hdHJvc2thLworICogVE9ETzogY2hlY2sgaWYgZGVtdXhpbmcgaXMgZG9uZSBjb3JyZWN0IGZvciBhbGwgY29kZWNzIGFjY29yZGluZyB0byBzcGVjCisgKiBUT0RPOiBzZWVraW5nIHdpdGggaW5jb21wbGV0ZSBvciB3aXRob3V0IENVRQorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LW1hdHJvc2thZGVtdXgKKyAqCisgKiBtYXRyb3NrYWRlbXV4IGRlbXV4ZXMgYSBNYXRyb3NrYSBmaWxlIGludG8gdGhlIGRpZmZlcmVudCBjb250YWluZWQgc3RyZWFtcy4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgZmlsZXNyYyBsb2NhdGlvbj0vcGF0aC90by9ta3YgISBtYXRyb3NrYWRlbXV4ICEgdm9yYmlzZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIGF1dG9hdWRpb3NpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgZGVtdXhlcyBhIE1hdHJvc2thIGZpbGUgYW5kIG91dHB1dHMgdGhlIGNvbnRhaW5lZCBWb3JiaXMgYXVkaW8uCisgKiA8L3JlZnNlY3QyPgorICovCisKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdsaWIvZ3ByaW50Zi5oPgorCisvKiBGb3IgQVZJIGNvbXBhdGliaWxpdHkgbW9kZQorICAgYW5kIGZvciBmb3VyY2Mgc3R1ZmYgKi8KKyNpbmNsdWRlIDxnc3QvcmlmZi9yaWZmLXJlYWQuaD4KKyNpbmNsdWRlIDxnc3QvcmlmZi9yaWZmLWlkcy5oPgorI2luY2x1ZGUgPGdzdC9yaWZmL3JpZmYtbWVkaWEuaD4KKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvcGJ1dGlscy5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSAibWF0cm9za2EtZGVtdXguaCIKKyNpbmNsdWRlICJtYXRyb3NrYS1pZHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAobWF0cm9za2FkZW11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBtYXRyb3NrYWRlbXV4X2RlYnVnCisKKyNkZWZpbmUgREVCVUdfRUxFTUVOVF9TVEFSVChkZW11eCwgZWJtbCwgZWxlbWVudCkgXAorICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiUGFyc2luZyAiIGVsZW1lbnQgIiBlbGVtZW50IGF0IG9mZnNldCAlIiBcCisgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGdzdF9lYm1sX3JlYWRfZ2V0X3BvcyAoZWJtbCkpCisKKyNkZWZpbmUgREVCVUdfRUxFTUVOVF9TVE9QKGRlbXV4LCBlYm1sLCBlbGVtZW50LCByZXQpIFwKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlBhcnNpbmcgIiBlbGVtZW50ICIgZWxlbWVudCAiIFwKKyAgICAgICAgIiBmaW5pc2hlZCB3aXRoICclcyciLCBnc3RfZmxvd19nZXRfbmFtZSAocmV0KSkKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTUVUQURBVEEsCisgIFBST1BfU1RSRUFNSU5GTywKKyAgUFJPUF9NQVhfR0FQX1RJTUUKK307CisKKyNkZWZpbmUgIERFRkFVTFRfTUFYX0dBUF9USU1FICAgICAgKDIgKiBHU1RfU0VDT05EKQorI2RlZmluZSAgSU5WQUxJRF9EQVRBX1RIUkVTSE9MRCAgICAoMiAqIDEwMjQgKiAxMDI0KQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbCA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtbWF0cm9za2E7IHZpZGVvL3gtbWF0cm9za2E7ICIKKyAgICAgICAgInZpZGVvL3gtbWF0cm9za2EtM2Q7IGF1ZGlvL3dlYm07IHZpZGVvL3dlYm0iKQorICAgICk7CisKKy8qIFRPRE86IGZpbGwgaW4gY2FwcyEgKi8KKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGF1ZGlvX3NyY190ZW1wbCA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoImF1ZGlvXyV1IiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJBTlkiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSB2aWRlb19zcmNfdGVtcGwgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJ2aWRlb18ldSIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiQU5ZIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3VidGl0bGVfc3JjX3RlbXBsID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInN1YnRpdGxlXyV1IiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ0ZXh0L3gtcmF3LCBmb3JtYXQ9cGFuZ28tbWFya3VwOyBhcHBsaWNhdGlvbi94LXNzYTsgIgorICAgICAgICAiYXBwbGljYXRpb24veC1hc3M7YXBwbGljYXRpb24veC11c2Y7IHN1YnBpY3R1cmUveC1kdmQ7ICIKKyAgICAgICAgInN1YnBpY3R1cmUveC1wZ3M7IHN1YnRpdGxlL3gta2F0ZTsgIiAiYXBwbGljYXRpb24veC1zdWJ0aXRsZS11bmtub3duIikKKyAgICApOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfaWQgKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCwKKyAgICBndWludDMyIGlkLCBndWludDY0IGxlbmd0aCwgZ3VpbnQgbmVlZGVkKTsKKworLyogZWxlbWVudCBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIGdzdF9tYXRyb3NrYV9kZW11eF9sb29wIChHc3RQYWQgKiBwYWQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX2RlbXV4X2VsZW1lbnRfc2VuZF9ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX2RlbXV4X2VsZW1lbnRfcXVlcnkgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworCisvKiBwYWQgZnVuY3Rpb25zICovCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX2RlbXV4X3NpbmtfYWN0aXZhdGUgKEdzdFBhZCAqIHNpbmtwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbWF0cm9za2FfZGVtdXhfc2lua19hY3RpdmF0ZV9tb2RlIChHc3RQYWQgKiBzaW5rcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UGFkTW9kZSBtb2RlLCBnYm9vbGVhbiBhY3RpdmUpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50IChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgsCisgICAgR3N0UGFkICogcGFkLCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdFF1ZXJ5ICogcXVlcnkpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9tYXRyb3NrYV9kZW11eF9jaGFpbiAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIG9iamVjdCwgR3N0QnVmZmVyICogYnVmZmVyKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfbWF0cm9za2FfZGVtdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKyNpZiAwCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX2RlbXV4X3NldF9pbmRleCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEluZGV4ICogaW5kZXgpOworc3RhdGljIEdzdEluZGV4ICpnc3RfbWF0cm9za2FfZGVtdXhfZ2V0X2luZGV4IChHc3RFbGVtZW50ICogZWxlbWVudCk7CisjZW5kaWYKKworLyogY2FwcyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBHc3RDYXBzICpnc3RfbWF0cm9za2FfZGVtdXhfdmlkZW9fY2FwcyAoR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dAorICAgICogdmlkZW9jb250ZXh0LCBjb25zdCBnY2hhciAqIGNvZGVjX2lkLCBndWludDggKiBkYXRhLCBndWludCBzaXplLAorICAgIGdjaGFyICoqIGNvZGVjX25hbWUsIGd1aW50MzIgKiByaWZmX2ZvdXJjYyk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X21hdHJvc2thX2RlbXV4X2F1ZGlvX2NhcHMgKEdzdE1hdHJvc2thVHJhY2tBdWRpb0NvbnRleHQKKyAgICAqIGF1ZGlvY29udGV4dCwgY29uc3QgZ2NoYXIgKiBjb2RlY19pZCwgZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSwKKyAgICBnY2hhciAqKiBjb2RlY19uYW1lLCBndWludDE2ICogcmlmZl9hdWRpb19mbXQpOworc3RhdGljIEdzdENhcHMKKyAgICAqIGdzdF9tYXRyb3NrYV9kZW11eF9zdWJ0aXRsZV9jYXBzIChHc3RNYXRyb3NrYVRyYWNrU3VidGl0bGVDb250ZXh0ICoKKyAgICBzdWJ0aXRsZWNvbnRleHQsIGNvbnN0IGdjaGFyICogY29kZWNfaWQsIGdwb2ludGVyIGRhdGEsIGd1aW50IHNpemUpOworCisvKiBzdHJlYW0gbWV0aG9kcyAqLworc3RhdGljIHZvaWQgZ3N0X21hdHJvc2thX2RlbXV4X3Jlc2V0IChHc3RFbGVtZW50ICogZWxlbWVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gcGVyZm9ybV9zZWVrX3RvX29mZnNldCAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4LAorICAgIGdkb3VibGUgcmF0ZSwgZ3VpbnQ2NCBvZmZzZXQsIGd1aW50MzIgc2VxbnVtLCBHc3RTZWVrRmxhZ3MgZmxhZ3MpOworCisvKiBnb2JqZWN0IGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgZ3N0X21hdHJvc2thX2RlbXV4X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9tYXRyb3NrYV9kZW11eF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK0dUeXBlIGdzdF9tYXRyb3NrYV9kZW11eF9nZXRfdHlwZSAodm9pZCk7CisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfbWF0cm9za2FfZGVtdXhfcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RNYXRyb3NrYURlbXV4LCBnc3RfbWF0cm9za2FfZGVtdXgsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX2RlbXV4X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RNYXRyb3NrYURlbXV4ICpkZW11eCA9IEdTVF9NQVRST1NLQV9ERU1VWCAob2JqZWN0KTsKKworICBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZmluYWxpemUgKCZkZW11eC0+Y29tbW9uKTsKKyAgZ3N0X2Zsb3dfY29tYmluZXJfZnJlZSAoZGVtdXgtPmZsb3djb21iaW5lcik7CisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9kZW11eF9jbGFzc19pbml0IChHc3RNYXRyb3NrYURlbXV4Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAobWF0cm9za2FkZW11eF9kZWJ1ZywgIm1hdHJvc2thZGVtdXgiLCAwLAorICAgICAgIk1hdHJvc2thIGRlbXV4ZXIiKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9tYXRyb3NrYV9kZW11eF9maW5hbGl6ZTsKKworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfbWF0cm9za2FfZGVtdXhfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfbWF0cm9za2FfZGVtdXhfc2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX0dBUF9USU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoIm1heC1nYXAtdGltZSIsICJNYXhpbXVtIGdhcCB0aW1lIiwKKyAgICAgICAgICAiVGhlIGRlbXV4ZXIgc2VuZHMgb3V0IHNlZ21lbnQgZXZlbnRzIGZvciBza2lwcGluZyAiCisgICAgICAgICAgImdhcHMgbG9uZ2VyIHRoYW4gdGhpcyAoMCA9IGRpc2FibGVkKS4iLCAwLCBHX01BWFVJTlQ2NCwKKyAgICAgICAgICBERUZBVUxUX01BWF9HQVBfVElNRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbWF0cm9za2FfZGVtdXhfY2hhbmdlX3N0YXRlKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+c2VuZF9ldmVudCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX2RlbXV4X2VsZW1lbnRfc2VuZF9ldmVudCk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPnF1ZXJ5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbWF0cm9za2FfZGVtdXhfZWxlbWVudF9xdWVyeSk7CisjaWYgMAorICBnc3RlbGVtZW50X2NsYXNzLT5zZXRfaW5kZXggPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9kZW11eF9zZXRfaW5kZXgpOworICBnc3RlbGVtZW50X2NsYXNzLT5nZXRfaW5kZXggPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9kZW11eF9nZXRfaW5kZXgpOworI2VuZGlmCisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmdmlkZW9fc3JjX3RlbXBsKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmYXVkaW9fc3JjX3RlbXBsKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmc3VidGl0bGVfc3JjX3RlbXBsKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiTWF0cm9za2EgZGVtdXhlciIsCisgICAgICAiQ29kZWMvRGVtdXhlciIsCisgICAgICAiRGVtdXhlcyBNYXRyb3NrYS9XZWJNIHN0cmVhbXMgaW50byB2aWRlby9hdWRpby9zdWJ0aXRsZXMiLAorICAgICAgIkdTdHJlYW1lciBtYWludGFpbmVycyA8Z3N0cmVhbWVyLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZz4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9kZW11eF9pbml0IChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgpCit7CisgIGRlbXV4LT5jb21tb24uc2lua3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua190ZW1wbCwKKyAgICAgICJzaW5rIik7CisgIGdzdF9wYWRfc2V0X2FjdGl2YXRlX2Z1bmN0aW9uIChkZW11eC0+Y29tbW9uLnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX2RlbXV4X3NpbmtfYWN0aXZhdGUpKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZhdGVtb2RlX2Z1bmN0aW9uIChkZW11eC0+Y29tbW9uLnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX2RlbXV4X3NpbmtfYWN0aXZhdGVfbW9kZSkpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoZGVtdXgtPmNvbW1vbi5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9kZW11eF9jaGFpbikpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoZGVtdXgtPmNvbW1vbi5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc2lua19ldmVudCkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoZGVtdXgpLCBkZW11eC0+Y29tbW9uLnNpbmtwYWQpOworCisgIC8qIGluaXQgZGVmYXVsdHMgZm9yIGNvbW1vbiByZWFkIGNvbnRleHQgKi8KKyAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2luaXQgKCZkZW11eC0+Y29tbW9uKTsKKworICAvKiBwcm9wZXJ0eSBkZWZhdWx0cyAqLworICBkZW11eC0+bWF4X2dhcF90aW1lID0gREVGQVVMVF9NQVhfR0FQX1RJTUU7CisKKyAgR1NUX09CSkVDVF9GTEFHX1NFVCAoZGVtdXgsIEdTVF9FTEVNRU5UX0ZMQUdfSU5ERVhBQkxFKTsKKworICBkZW11eC0+Zmxvd2NvbWJpbmVyID0gZ3N0X2Zsb3dfY29tYmluZXJfbmV3ICgpOworCisgIC8qIGZpbmlzaCBvZmYgKi8KKyAgZ3N0X21hdHJvc2thX2RlbXV4X3Jlc2V0IChHU1RfRUxFTUVOVCAoZGVtdXgpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9kZW11eF9yZXNldCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdE1hdHJvc2thRGVtdXggKmRlbXV4ID0gR1NUX01BVFJPU0tBX0RFTVVYIChlbGVtZW50KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlJlc2V0dGluZyBzdGF0ZSIpOworCisgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9yZXNldCAoR1NUX0VMRU1FTlQgKGRlbXV4KSwgJmRlbXV4LT5jb21tb24pOworCisgIGRlbXV4LT5udW1fYV9zdHJlYW1zID0gMDsKKyAgZGVtdXgtPm51bV90X3N0cmVhbXMgPSAwOworICBkZW11eC0+bnVtX3Zfc3RyZWFtcyA9IDA7CisKKyAgZGVtdXgtPmhhdmVfZ3JvdXBfaWQgPSBGQUxTRTsKKyAgZGVtdXgtPmdyb3VwX2lkID0gR19NQVhVSU5UOworCisgIGRlbXV4LT5jbG9jayA9IE5VTEw7CisgIGRlbXV4LT50cmFja3NfcGFyc2VkID0gRkFMU0U7CisKKyAgaWYgKGRlbXV4LT5jbHVzdGVycykgeworICAgIGdfYXJyYXlfZnJlZSAoZGVtdXgtPmNsdXN0ZXJzLCBUUlVFKTsKKyAgICBkZW11eC0+Y2x1c3RlcnMgPSBOVUxMOworICB9CisKKyAgZ19saXN0X2ZvcmVhY2ggKGRlbXV4LT5zZWVrX3BhcnNlZCwKKyAgICAgIChHRnVuYykgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2ZyZWVfcGFyc2VkX2VsLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGRlbXV4LT5zZWVrX3BhcnNlZCk7CisgIGRlbXV4LT5zZWVrX3BhcnNlZCA9IE5VTEw7CisKKyAgZGVtdXgtPmxhc3Rfc3RvcF9lbmQgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBkZW11eC0+c2Vla19ibG9jayA9IDA7CisgIGRlbXV4LT5zdHJlYW1fc3RhcnRfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGRlbXV4LT50b190aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgZGVtdXgtPmNsdXN0ZXJfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGRlbXV4LT5jbHVzdGVyX29mZnNldCA9IDA7CisgIGRlbXV4LT5uZXh0X2NsdXN0ZXJfb2Zmc2V0ID0gMDsKKyAgZGVtdXgtPnN0cmVhbV9sYXN0X3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBkZW11eC0+bGFzdF9jbHVzdGVyX29mZnNldCA9IDA7CisgIGRlbXV4LT5pbmRleF9vZmZzZXQgPSAwOworICBkZW11eC0+c2Vla2FibGUgPSBGQUxTRTsKKyAgZGVtdXgtPm5lZWRfc2VnbWVudCA9IEZBTFNFOworICBkZW11eC0+c2VnbWVudF9zZXFudW0gPSAwOworICBkZW11eC0+cmVxdWVzdGVkX3NlZWtfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGRlbXV4LT5zZWVrX29mZnNldCA9IC0xOworICBkZW11eC0+YnVpbGRpbmdfaW5kZXggPSBGQUxTRTsKKyAgaWYgKGRlbXV4LT5zZWVrX2V2ZW50KSB7CisgICAgZ3N0X2V2ZW50X3VucmVmIChkZW11eC0+c2Vla19ldmVudCk7CisgICAgZGVtdXgtPnNlZWtfZXZlbnQgPSBOVUxMOworICB9CisKKyAgZGVtdXgtPnNlZWtfaW5kZXggPSBOVUxMOworICBkZW11eC0+c2Vla19lbnRyeSA9IDA7CisKKyAgaWYgKGRlbXV4LT5uZXdfc2VnbWVudCkgeworICAgIGdzdF9ldmVudF91bnJlZiAoZGVtdXgtPm5ld19zZWdtZW50KTsKKyAgICBkZW11eC0+bmV3X3NlZ21lbnQgPSBOVUxMOworICB9CisKKyAgZGVtdXgtPmludmFsaWRfZHVyYXRpb24gPSBGQUxTRTsKKworICBkZW11eC0+Y2FjaGVkX2xlbmd0aCA9IEdfTUFYVUlOVDY0OworCisgIGdzdF9mbG93X2NvbWJpbmVyX2NsZWFyIChkZW11eC0+Zmxvd2NvbWJpbmVyKTsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfbWF0cm9za2FfZGVjb2RlX2J1ZmZlciAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdE1hcEluZm8gbWFwOworICBncG9pbnRlciBkYXRhOworICBnc2l6ZSBzaXplOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfQlVGRkVSIChidWYpLCBOVUxMKTsKKworICBHU1RfREVCVUcgKCJkZWNvZGluZyBidWZmZXIgJXAiLCBidWYpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgc2l6ZSA9IG1hcC5zaXplOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzaXplID4gMCwgYnVmKTsKKworICBpZiAoZ3N0X21hdHJvc2thX2RlY29kZV9kYXRhIChjb250ZXh0LT5lbmNvZGluZ3MsICZkYXRhLCAmc2l6ZSwKKyAgICAgICAgICBHU1RfTUFUUk9TS0FfVFJBQ0tfRU5DT0RJTkdfU0NPUEVfRlJBTUUsIEZBTFNFKSkgeworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZGF0YSwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHICgiZGVjb2RlIGRhdGEgZmFpbGVkIik7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbV9oZWFkZXJzX3RvX2NhcHMgKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCwKKyAgICBHc3RCdWZmZXJMaXN0ICogbGlzdCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgR1ZhbHVlIGFycl92YWwgPSBHX1ZBTFVFX0lOSVQ7CisgIEdWYWx1ZSBidWZfdmFsID0gR19WQUxVRV9JTklUOworICBnaW50IGksIG51bTsKKworICBnX2Fzc2VydCAoZ3N0X2NhcHNfaXNfd3JpdGFibGUgKGNhcHMpKTsKKworICBnX3ZhbHVlX2luaXQgKCZhcnJfdmFsLCBHU1RfVFlQRV9BUlJBWSk7CisgIGdfdmFsdWVfaW5pdCAoJmJ1Zl92YWwsIEdTVF9UWVBFX0JVRkZFUik7CisKKyAgbnVtID0gZ3N0X2J1ZmZlcl9saXN0X2xlbmd0aCAobGlzdCk7CisgIGZvciAoaSA9IDA7IGkgPCBudW07ICsraSkgeworICAgIGdfdmFsdWVfc2V0X2JveGVkICgmYnVmX3ZhbCwgZ3N0X2J1ZmZlcl9saXN0X2dldCAobGlzdCwgaSkpOworICAgIGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfdmFsdWUgKCZhcnJfdmFsLCAmYnVmX3ZhbCk7CisgIH0KKworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGdzdF9zdHJ1Y3R1cmVfdGFrZV92YWx1ZSAocywgInN0cmVhbWhlYWRlciIsICZhcnJfdmFsKTsKKyAgZ192YWx1ZV91bnNldCAoJmJ1Zl92YWwpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NvbG91ciAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4LCBHc3RFYm1sUmVhZCAqIGVibWwsCisgICAgR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqIHZpZGVvX2NvbnRleHQpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RWaWRlb0NvbG9yaW1ldHJ5IGNvbG9yaW1ldHJ5OworICBndWludDMyIGlkOworICBndWludDY0IG51bTsKKworICBjb2xvcmltZXRyeS5yYW5nZSA9IEdTVF9WSURFT19DT0xPUl9SQU5HRV9VTktOT1dOOworICBjb2xvcmltZXRyeS5tYXRyaXggPSBHU1RfVklERU9fQ09MT1JfTUFUUklYX1VOS05PV047CisgIGNvbG9yaW1ldHJ5LnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX1VOS05PV047CisgIGNvbG9yaW1ldHJ5LnByaW1hcmllcyA9IEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfVU5LTk9XTjsKKworICBERUJVR19FTEVNRU5UX1NUQVJUIChkZW11eCwgZWJtbCwgIlRyYWNrVmlkZW9Db2xvdXIiKTsKKworICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfbWFzdGVyIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIGJlYWNoOworCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIGJlYWNoOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9NQVRSSVhDT0VGRklDSUVOVFM6eworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgZ290byBiZWFjaDsKKworICAgICAgICBzd2l0Y2ggKG51bSkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5Lm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfUkdCOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY29sb3JpbWV0cnkubWF0cml4ID0gR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9CVDcwOTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5Lm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfVU5LTk9XTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5Lm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfRkNDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKiBGSVhNRTogIjU6IEJUNDcwQkciIGlzIHVuZGVmaW5lZCBpbiBHc3RWaWRlb0NvbG9yTWF0cml4CisgICAgICAgICAgICAgKiBidXQgaXQncyBmdW5jdGlvbmFsbHkgc2FtZSBhcyAiNjogQlQ2MDEiICovCisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5Lm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQ2MDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBjb2xvcmltZXRyeS5tYXRyaXggPSBHU1RfVklERU9fQ09MT1JfTUFUUklYX1NNUFRFMjQwTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5Lm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQyMDIwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKGRlbXV4LCAiVW5zdXBwb3J0ZWQgY29sb3IgbWF0cml4IGNvZWZmaWNpZW50cyAgJSIKKyAgICAgICAgICAgICAgICBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPUkFOR0U6eworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgZ290byBiZWFjaDsKKworICAgICAgICBzd2l0Y2ggKG51bSkgeworICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5LnJhbmdlID0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFX1VOS05PV047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjb2xvcmltZXRyeS5yYW5nZSA9IEdTVF9WSURFT19DT0xPUl9SQU5HRV8xNl8yMzU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBjb2xvcmltZXRyeS5yYW5nZSA9IEdTVF9WSURFT19DT0xPUl9SQU5HRV8wXzI1NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBHU1RfRklYTUVfT0JKRUNUIChkZW11eCwgIlVuc3VwcG9ydGVkIGNvbG9yIHJhbmdlICAlIgorICAgICAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9UUkFOU0ZFUkNIQVJBQ1RFUklTVElDUzp7CisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBnb3RvIGJlYWNoOworCisgICAgICAgIHN3aXRjaCAobnVtKSB7CisgICAgICAgICAgICAvKiBGSVhNRTogIjY6IEJUNjAxIiBhbmQgIjE0OiBCVDIwMjBfMTAiIGFyZSB1bmRlZmluZWQgaW4KKyAgICAgICAgICAgICAqIEdzdFZpZGVvVHJhbnNmZXJGdW5jdGlvbiwgYnV0IGZ1bmN0aW9uYWxseSBzYW1lIGFzICIxOiBCVDcwOSIgKi8KKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICBjb2xvcmltZXRyeS50cmFuc2ZlciA9IEdTVF9WSURFT19UUkFOU0ZFUl9CVDcwOTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5LnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX1VOS05PV047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBjb2xvcmltZXRyeS50cmFuc2ZlciA9IEdTVF9WSURFT19UUkFOU0ZFUl9HQU1NQTIyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgY29sb3JpbWV0cnkudHJhbnNmZXIgPSBHU1RfVklERU9fVFJBTlNGRVJfR0FNTUEyODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5LnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX1NNUFRFMjQwTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5LnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX0dBTU1BMTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICBjb2xvcmltZXRyeS50cmFuc2ZlciA9IEdTVF9WSURFT19UUkFOU0ZFUl9MT0cxMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgY29sb3JpbWV0cnkudHJhbnNmZXIgPSBHU1RfVklERU9fVFJBTlNGRVJfTE9HMzE2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5LnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX1NSR0I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgY29sb3JpbWV0cnkudHJhbnNmZXIgPSBHU1RfVklERU9fVFJBTlNGRVJfQlQyMDIwXzEyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBjb2xvciB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpY3MgICUiCisgICAgICAgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9WSURFT1BSSU1BUklFUzp7CisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBnb3RvIGJlYWNoOworCisgICAgICAgIHN3aXRjaCAobnVtKSB7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY29sb3JpbWV0cnkucHJpbWFyaWVzID0gR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19CVDcwOTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5LnByaW1hcmllcyA9IEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfVU5LTk9XTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5LnByaW1hcmllcyA9IEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfQlQ0NzBNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgY29sb3JpbWV0cnkucHJpbWFyaWVzID0gR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19CVDQ3MEJHOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgY29sb3JpbWV0cnkucHJpbWFyaWVzID0gR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19TTVBURTE3ME07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBjb2xvcmltZXRyeS5wcmltYXJpZXMgPSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX1NNUFRFMjQwTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5LnByaW1hcmllcyA9IEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfRklMTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgIGNvbG9yaW1ldHJ5LnByaW1hcmllcyA9IEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfQlQyMDIwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKGRlbXV4LCAiVW5zdXBwb3J0ZWQgY29sb3IgcHJpbWFyaWVzICAlIgorICAgICAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX0ZJWE1FX09CSkVDVCAoZGVtdXgsICJVbnN1cHBvcnRlZCBzdWJlbGVtZW50IDB4JXggaW4gQ29sb3VyIiwgaWQpOworICAgICAgICByZXQgPSBnc3RfZWJtbF9yZWFkX3NraXAgKGVibWwpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBtZW1jcHkgKCZ2aWRlb19jb250ZXh0LT5jb2xvcmltZXRyeSwgJmNvbG9yaW1ldHJ5LAorICAgICAgc2l6ZW9mIChHc3RWaWRlb0NvbG9yaW1ldHJ5KSk7CisKK2JlYWNoOgorICBERUJVR19FTEVNRU5UX1NUT1AgKGRlbXV4LCBlYm1sLCAiVHJhY2tWaWRlb0NvbG91ciIsIHJldCk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4LCBHc3RFYm1sUmVhZCAqIGVibWwpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqa2xhc3MgPSBHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKGRlbXV4KTsKKyAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKmNvbnRleHQ7CisgIEdzdFBhZFRlbXBsYXRlICp0ZW1wbCA9IE5VTEw7CisgIEdzdFN0cmVhbUZsYWdzIHN0cmVhbV9mbGFnczsKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisgIEdzdFRhZ0xpc3QgKmNhY2hlZF90YWdsaXN0OworICBnY2hhciAqcGFkbmFtZSA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludDMyIGlkLCByaWZmX2ZvdXJjYyA9IDA7CisgIGd1aW50MTYgcmlmZl9hdWRpb19mbXQgPSAwOworICBHc3RFdmVudCAqc3RyZWFtX3N0YXJ0OworICBnY2hhciAqY29kZWMgPSBOVUxMOworICBnY2hhciAqc3RyZWFtX2lkOworCisgIERFQlVHX0VMRU1FTlRfU1RBUlQgKGRlbXV4LCBlYm1sLCAiVHJhY2tFbnRyeSIpOworCisgIC8qIHN0YXJ0IHdpdGggdGhlIG1hc3RlciAqLworICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfbWFzdGVyIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykgeworICAgIERFQlVHX0VMRU1FTlRfU1RPUCAoZGVtdXgsIGVibWwsICJUcmFja0VudHJ5IiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgLyogYWxsb2NhdGUgZ2VuZXJpYy4uLiBpZiB3ZSBrbm93IHRoZSB0eXBlLCB3ZSdsbCBnX3JlbmV3KCkKKyAgICogd2l0aCB0aGUgcHJlY2lzZSB0eXBlICovCisgIGNvbnRleHQgPSBnX25ldzAgKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0LCAxKTsKKyAgZ19wdHJfYXJyYXlfYWRkIChkZW11eC0+Y29tbW9uLnNyYywgY29udGV4dCk7CisgIGNvbnRleHQtPmluZGV4ID0gZGVtdXgtPmNvbW1vbi5udW1fc3RyZWFtczsKKyAgY29udGV4dC0+aW5kZXhfd3JpdGVyX2lkID0gLTE7CisgIGNvbnRleHQtPnR5cGUgPSAwOyAgICAgICAgICAgIC8qIG5vIHR5cGUgeWV0ICovCisgIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24gPSAwOworICBjb250ZXh0LT5wb3MgPSAwOworICBjb250ZXh0LT5zZXRfZGlzY29udCA9IFRSVUU7CisgIGNvbnRleHQtPnRpbWVjb2Rlc2NhbGUgPSAxLjA7CisgIGNvbnRleHQtPmZsYWdzID0KKyAgICAgIEdTVF9NQVRST1NLQV9UUkFDS19FTkFCTEVEIHwgR1NUX01BVFJPU0tBX1RSQUNLX0RFRkFVTFQgfAorICAgICAgR1NUX01BVFJPU0tBX1RSQUNLX0xBQ0lORzsKKyAgY29udGV4dC0+ZnJvbV90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgY29udGV4dC0+ZnJvbV9vZmZzZXQgPSAtMTsKKyAgY29udGV4dC0+dG9fb2Zmc2V0ID0gR19NQVhJTlQ2NDsKKyAgY29udGV4dC0+YWxpZ25tZW50ID0gMTsKKyAgY29udGV4dC0+ZHRzX29ubHkgPSBGQUxTRTsKKyAgY29udGV4dC0+aW50cmFfb25seSA9IEZBTFNFOworICBjb250ZXh0LT50YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZGVtdXgtPmNvbW1vbi5udW1fc3RyZWFtcysrOworICBnX2Fzc2VydCAoZGVtdXgtPmNvbW1vbi5zcmMtPmxlbiA9PSBkZW11eC0+Y29tbW9uLm51bV9zdHJlYW1zKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlN0cmVhbSBudW1iZXIgJWQiLCBjb250ZXh0LT5pbmRleCk7CisKKyAgLyogdHJ5IHJlYWRpbmcgdGhlIHRyYWNrZW50cnkgaGVhZGVycyAqLworICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmIGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3BlZWtfaWQgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgIC8qIHRyYWNrIG51bWJlciAodW5pcXVlIHN0cmVhbSBJRCkgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLTlVNQkVSOnsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChudW0gPT0gMCkgeworICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlbXV4LCAiSW52YWxpZCBUcmFja051bWJlciAwIik7CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoIWdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl90cmFja251bWJlcl91bmlxdWUgKCZkZW11eC0+Y29tbW9uLAorICAgICAgICAgICAgICAgIG51bSkpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChkZW11eCwgIlRyYWNrTnVtYmVyICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAgICAgIiBpcyBub3QgdW5pcXVlIiwgbnVtKTsKKyAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVHJhY2tOdW1iZXI6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgIGNvbnRleHQtPm51bSA9IG51bTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAgIC8qIHRyYWNrIFVJRCAodW5pcXVlIGlkZW50aWZpZXIpICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS1VJRDp7CisgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAobnVtID09IDApIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChkZW11eCwgIkludmFsaWQgVHJhY2tVSUQgMCIpOworICAgICAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJUcmFja1VJRDogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgY29udGV4dC0+dWlkID0gbnVtOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiB0cmFjayB0eXBlICh2aWRlbywgYXVkaW8sIGNvbWJpbmVkLCBzdWJ0aXRsZSwgZXRjLikgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLVFlQRTp7CisgICAgICAgIGd1aW50NjQgdHJhY2tfdHlwZTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmdHJhY2tfdHlwZSkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29udGV4dC0+dHlwZSAhPSAwICYmIGNvbnRleHQtPnR5cGUgIT0gdHJhY2tfdHlwZSkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICJNb3JlIHRoYW4gb25lIHRyYWNrdHlwZSBkZWZpbmVkIGluIGEgVHJhY2tFbnRyeSAtIHNraXBwaW5nIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2tfdHlwZSA8IDEgfHwgdHJhY2tfdHlwZSA+IDI1NCkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJJbnZhbGlkIFRyYWNrVHlwZSAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgICB0cmFja190eXBlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVHJhY2tUeXBlOiAlIiBHX0dVSU5UNjRfRk9STUFULCB0cmFja190eXBlKTsKKworICAgICAgICAvKiBvaywgc28gd2UncmUgYWN0dWFsbHkgZ29pbmcgdG8gcmVhbGxvY2F0ZSB0aGlzIHRoaW5nICovCisgICAgICAgIHN3aXRjaCAodHJhY2tfdHlwZSkgeworICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU86CisgICAgICAgICAgICBnc3RfbWF0cm9za2FfdHJhY2tfaW5pdF92aWRlb19jb250ZXh0ICgmY29udGV4dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX0FVRElPOgorICAgICAgICAgICAgZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfYXVkaW9fY29udGV4dCAoJmNvbnRleHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRToKKyAgICAgICAgICAgIGdzdF9tYXRyb3NrYV90cmFja19pbml0X3N1YnRpdGxlX2NvbnRleHQgKCZjb250ZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQ09NUExFWDoKKyAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX0xPR086CisgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9CVVRUT05TOgorICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQ09OVFJPTDoKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgICAiVW5rbm93biBvciB1bnN1cHBvcnRlZCBUcmFja1R5cGUgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgICAgICB0cmFja190eXBlKTsKKyAgICAgICAgICAgIGNvbnRleHQtPnR5cGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZ19wdHJfYXJyYXlfaW5kZXggKGRlbXV4LT5jb21tb24uc3JjLCBkZW11eC0+Y29tbW9uLm51bV9zdHJlYW1zIC0gMSkKKyAgICAgICAgICAgID0gY29udGV4dDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgLyogdHJhY2t0eXBlIHNwZWNpZmljIHN0dWZmIGZvciB2aWRlbyAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tWSURFTzp7CisgICAgICAgIEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQgKnZpZGVvY29udGV4dDsKKworICAgICAgICBERUJVR19FTEVNRU5UX1NUQVJUIChkZW11eCwgZWJtbCwgIlRyYWNrVmlkZW8iKTsKKworICAgICAgICBpZiAoIWdzdF9tYXRyb3NrYV90cmFja19pbml0X3ZpZGVvX2NvbnRleHQgKCZjb250ZXh0KSkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICJUcmFja1ZpZGVvIGVsZW1lbnQgaW4gbm9uLXZpZGVvIHRyYWNrIC0gaWdub3JpbmcgdHJhY2siKTsKKyAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdmlkZW9jb250ZXh0ID0gKEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQgKikgY29udGV4dDsKKyAgICAgICAgZ19wdHJfYXJyYXlfaW5kZXggKGRlbXV4LT5jb21tb24uc3JjLCBkZW11eC0+Y29tbW9uLm51bV9zdHJlYW1zIC0gMSkKKyAgICAgICAgICAgID0gY29udGV4dDsKKworICAgICAgICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmCisgICAgICAgICAgICBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgc3dpdGNoIChpZCkgeworICAgICAgICAgICAgICAvKiBTaG91bGQgYmUgb25lIGxldmVsIHVwIGJ1dCBzb21lIGJyb2tlbiBtdXhlcnMgd3JpdGUgaXQgaGVyZS4gKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLREVGQVVMVERVUkFUSU9OOnsKKyAgICAgICAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGlmIChudW0gPT0gMCkgeworICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJJbnZhbGlkIFRyYWNrRGVmYXVsdER1cmF0aW9uIDAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAgICAgIlRyYWNrRGVmYXVsdER1cmF0aW9uOiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICAgICAgICBjb250ZXh0LT5kZWZhdWx0X2R1cmF0aW9uID0gbnVtOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiB2aWRlbyBmcmFtZXJhdGUgKi8KKyAgICAgICAgICAgICAgLyogTk9URTogVGhpcyBvbmUgaXMgaGVyZSBvbmx5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICAgICAgICAgICAgICAgKiBVc2UgX1RSQUNLREVGQVVMRFVSQVRJT04gb25lIGxldmVsIHVwLiAqLworICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9GUkFNRVJBVEU6eworICAgICAgICAgICAgICBnZG91YmxlIG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfZmxvYXQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGlmIChudW0gPD0gMC4wKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIkludmFsaWQgVHJhY2tWaWRlb0ZQUyAlbGYiLCBudW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJUcmFja1ZpZGVvRnJhbWVSYXRlOiAlbGYiLCBudW0pOworICAgICAgICAgICAgICBpZiAoY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbiA9PSAwKQorICAgICAgICAgICAgICAgIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24gPQorICAgICAgICAgICAgICAgICAgICBnc3RfZ2RvdWJsZV90b19ndWludDY0ICgoZ2RvdWJsZSkgR1NUX1NFQ09ORCAqICgxLjAgLyBudW0pKTsKKyAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5kZWZhdWx0X2ZwcyA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogd2lkdGggb2YgdGhlIHNpemUgdG8gZGlzcGxheSB0aGUgdmlkZW8gYXQgKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPRElTUExBWVdJRFRIOnsKKyAgICAgICAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGlmIChudW0gPT0gMCkgeworICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJJbnZhbGlkIFRyYWNrVmlkZW9EaXNwbGF5V2lkdGggMCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAiVHJhY2tWaWRlb0Rpc3BsYXlXaWR0aDogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5kaXNwbGF5X3dpZHRoID0gbnVtOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiBoZWlnaHQgb2YgdGhlIHNpemUgdG8gZGlzcGxheSB0aGUgdmlkZW8gYXQgKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPRElTUExBWUhFSUdIVDp7CisgICAgICAgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBpZiAobnVtID09IDApIHsKKyAgICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiSW52YWxpZCBUcmFja1ZpZGVvRGlzcGxheUhlaWdodCAwIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgICAgICJUcmFja1ZpZGVvRGlzcGxheUhlaWdodDogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogd2lkdGggb2YgdGhlIHZpZGVvIGluIHRoZSBmaWxlICovCisgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9WSURFT1BJWEVMV0lEVEg6eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIkludmFsaWQgVHJhY2tWaWRlb1BpeGVsV2lkdGggMCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAiVHJhY2tWaWRlb1BpeGVsV2lkdGg6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgICAgICAgIHZpZGVvY29udGV4dC0+cGl4ZWxfd2lkdGggPSBudW07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIGhlaWdodCBvZiB0aGUgdmlkZW8gaW4gdGhlIGZpbGUgKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPUElYRUxIRUlHSFQ6eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIkludmFsaWQgVHJhY2tWaWRlb1BpeGVsSGVpZ2h0IDAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAgICAgIlRyYWNrVmlkZW9QaXhlbEhlaWdodDogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5waXhlbF9oZWlnaHQgPSBudW07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIHdoZXRoZXIgdGhlIHZpZGVvIGlzIGludGVybGFjZWQgKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPRkxBR0lOVEVSTEFDRUQ6eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSkKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5mbGFncyB8PSBHU1RfTUFUUk9TS0FfVklERU9UUkFDS19JTlRFUkxBQ0VEOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29udGV4dC0+ZmxhZ3MgJj0gfkdTVF9NQVRST1NLQV9WSURFT1RSQUNLX0lOVEVSTEFDRUQ7CisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVHJhY2tWaWRlb0ludGVybGFjZWQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgIChjb250ZXh0LT5mbGFncyAmIEdTVF9NQVRST1NLQV9WSURFT1RSQUNLX0lOVEVSTEFDRUQpID8gMSA6CisgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogYXNwZWN0IHJhdGlvIGJlaGF2aW91ciAqLworICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9BU1BFQ1RSQVRJT1RZUEU6eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSAhPSBHU1RfTUFUUk9TS0FfQVNQRUNUX1JBVElPX01PREVfRlJFRSAmJgorICAgICAgICAgICAgICAgICAgbnVtICE9IEdTVF9NQVRST1NLQV9BU1BFQ1RfUkFUSU9fTU9ERV9LRUVQICYmCisgICAgICAgICAgICAgICAgICBudW0gIT0gR1NUX01BVFJPU0tBX0FTUEVDVF9SQVRJT19NT0RFX0ZJWEVEKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgIlVua25vd24gVHJhY2tWaWRlb0FzcGVjdFJhdGlvVHlwZSAweCV4IiwgKGd1aW50KSBudW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAgICAgIlRyYWNrVmlkZW9Bc3BlY3RSYXRpb1R5cGU6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgICAgICAgIHZpZGVvY29udGV4dC0+YXNyX21vZGUgPSBudW07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIGNvbG91cnNwYWNlIChvbmx5IG1hdHRlcnMgZm9yIHJhdyB2aWRlbykgZm91cmNjICovCisgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9WSURFT0NPTE9VUlNQQUNFOnsKKyAgICAgICAgICAgICAgZ3VpbnQ4ICpkYXRhOworICAgICAgICAgICAgICBndWludDY0IGRhdGFsZW47CisKKyAgICAgICAgICAgICAgaWYgKChyZXQgPQorICAgICAgICAgICAgICAgICAgICAgIGdzdF9lYm1sX3JlYWRfYmluYXJ5IChlYm1sLCAmaWQsICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YWxlbikpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGlmIChkYXRhbGVuICE9IDQpIHsKKyAgICAgICAgICAgICAgICBnX2ZyZWUgKGRhdGEpOworICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFRyYWNrVmlkZW9Db2xvdXJTcGFjZSBsZW5ndGggJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgZGF0YWxlbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBtZW1jcHkgKCZ2aWRlb2NvbnRleHQtPmZvdXJjYywgZGF0YSwgNCk7CisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAgICAgIlRyYWNrVmlkZW9Db2xvdXJTcGFjZTogJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHZpZGVvY29udGV4dC0+Zm91cmNjKSk7CisgICAgICAgICAgICAgIGdfZnJlZSAoZGF0YSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIGNvbG9yIGluZm8gKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPQ09MT1VSOnsKKyAgICAgICAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NvbG91ciAoZGVtdXgsIGVibWwsIHZpZGVvY29udGV4dCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9WSURFT1NURVJFT01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlN0ZXJlb01vZGU6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisKKyAgICAgICAgICAgICAgc3dpdGNoIChudW0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9TVEVSRU9fTU9ERV9TQlNfUkw6CisgICAgICAgICAgICAgICAgICB2aWRlb2NvbnRleHQtPm11bHRpdmlld19mbGFncyA9CisgICAgICAgICAgICAgICAgICAgICAgR1NUX1ZJREVPX01VTFRJVklFV19GTEFHU19SSUdIVF9WSUVXX0ZJUlNUOworICAgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfU1RFUkVPX01PREVfU0JTX0xSOgorICAgICAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfbW9kZSA9CisgICAgICAgICAgICAgICAgICAgICAgR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX1NJREVfQllfU0lERTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX1RCX1JMOgorICAgICAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICAgIEdTVF9WSURFT19NVUxUSVZJRVdfRkxBR1NfUklHSFRfVklFV19GSVJTVDsKKyAgICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX1RCX0xSOgorICAgICAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfbW9kZSA9CisgICAgICAgICAgICAgICAgICAgICAgR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX1RPUF9CT1RUT007CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9TVEVSRU9fTU9ERV9DSEVDS0VSX1JMOgorICAgICAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICAgIEdTVF9WSURFT19NVUxUSVZJRVdfRkxBR1NfUklHSFRfVklFV19GSVJTVDsKKyAgICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX0NIRUNLRVJfTFI6CisgICAgICAgICAgICAgICAgICB2aWRlb2NvbnRleHQtPm11bHRpdmlld19tb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICBHU1RfVklERU9fTVVMVElWSUVXX01PREVfQ0hFQ0tFUkJPQVJEOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfU1RFUkVPX01PREVfRkJGX1JMOgorICAgICAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICAgIEdTVF9WSURFT19NVUxUSVZJRVdfRkxBR1NfUklHSFRfVklFV19GSVJTVDsKKyAgICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX0ZCRl9MUjoKKyAgICAgICAgICAgICAgICAgIHZpZGVvY29udGV4dC0+bXVsdGl2aWV3X21vZGUgPQorICAgICAgICAgICAgICAgICAgICAgIEdTVF9WSURFT19NVUxUSVZJRVdfTU9ERV9GUkFNRV9CWV9GUkFNRTsKKyAgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBJbiBmcmFtZS1ieS1mcmFtZSBtb2RlLCBsZWZ0L3JpZ2h0IGZyYW1lIGJ1ZmZlcnMgYXJlCisgICAgICAgICAgICAgICAgICAgKiBsYWNlZCB3aXRoaW4gb25lIGJsb2NrLCBhbmQgd2UnbGwgbmVlZCB0byBhcHBseSBGSVJTVF9JTl9CVU5ETEUKKyAgICAgICAgICAgICAgICAgICAqIGFjY29yZGluZ2x5LiBTZWUgaHR0cDovL3d3dy5tYXRyb3NrYS5vcmcvdGVjaG5pY2FsL3NwZWNzL2luZGV4Lmh0bWwjU3RlcmVvTW9kZSAqLworICAgICAgICAgICAgICAgICAgR1NUX0ZJWE1FX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAgICAgIkZyYW1lLWJ5LWZyYW1lIHN0ZXJlb3Njb3BpYyBtb2RlIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAiVW5rbm93biBUcmFja1ZpZGVvIHN1YmVsZW1lbnQgMHgleCAtIGlnbm9yaW5nIiwgaWQpOworICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPRElTUExBWVVOSVQ6CisgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9WSURFT1BJWEVMQ1JPUEJPVFRPTToKKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPUElYRUxDUk9QVE9QOgorICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9QSVhFTENST1BMRUZUOgorICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9QSVhFTENST1BSSUdIVDoKKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPR0FNTUFWQUxVRToKKyAgICAgICAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9za2lwIChlYm1sKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgREVCVUdfRUxFTUVOVF9TVE9QIChkZW11eCwgZWJtbCwgIlRyYWNrVmlkZW8iLCByZXQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiB0cmFja3R5cGUgc3BlY2lmaWMgc3R1ZmYgZm9yIGF1ZGlvICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0FVRElPOnsKKyAgICAgICAgR3N0TWF0cm9za2FUcmFja0F1ZGlvQ29udGV4dCAqYXVkaW9jb250ZXh0OworCisgICAgICAgIERFQlVHX0VMRU1FTlRfU1RBUlQgKGRlbXV4LCBlYm1sLCAiVHJhY2tBdWRpbyIpOworCisgICAgICAgIGlmICghZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfYXVkaW9fY29udGV4dCAoJmNvbnRleHQpKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgIlRyYWNrQXVkaW8gZWxlbWVudCBpbiBub24tYXVkaW8gdHJhY2sgLSBpZ25vcmluZyB0cmFjayIpOworICAgICAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgYXVkaW9jb250ZXh0ID0gKEdzdE1hdHJvc2thVHJhY2tBdWRpb0NvbnRleHQgKikgY29udGV4dDsKKyAgICAgICAgZ19wdHJfYXJyYXlfaW5kZXggKGRlbXV4LT5jb21tb24uc3JjLCBkZW11eC0+Y29tbW9uLm51bV9zdHJlYW1zIC0gMSkKKyAgICAgICAgICAgID0gY29udGV4dDsKKworICAgICAgICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmCisgICAgICAgICAgICBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgc3dpdGNoIChpZCkgeworICAgICAgICAgICAgICAvKiBzYW1wbGVyYXRlICovCisgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9BVURJT1NBTVBMSU5HRlJFUTp7CisgICAgICAgICAgICAgIGdkb3VibGUgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9mbG9hdCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgICBpZiAobnVtIDw9IDAuMCkgeworICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFRyYWNrQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSAlbGYiLCBudW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJUcmFja0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3k6ICVsZiIsIG51bSk7CisgICAgICAgICAgICAgIGF1ZGlvY29udGV4dC0+c2FtcGxlcmF0ZSA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogYml0ZGVwdGggKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0FVRElPQklUREVQVEg6eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIkludmFsaWQgVHJhY2tBdWRpb0JpdERlcHRoIDAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVHJhY2tBdWRpb0JpdERlcHRoOiAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgICAgICAgbnVtKTsKKyAgICAgICAgICAgICAgYXVkaW9jb250ZXh0LT5iaXRkZXB0aCA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogY2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0FVRElPQ0hBTk5FTFM6eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIkludmFsaWQgVHJhY2tBdWRpb0NoYW5uZWxzIDAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVHJhY2tBdWRpb0NoYW5uZWxzOiAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgICAgICAgbnVtKTsKKyAgICAgICAgICAgICAgYXVkaW9jb250ZXh0LT5jaGFubmVscyA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAiVW5rbm93biBUcmFja0F1ZGlvIHN1YmVsZW1lbnQgMHgleCAtIGlnbm9yaW5nIiwgaWQpOworICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0FVRElPQ0hBTk5FTFBPU0lUSU9OUzoKKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0FVRElPT1VUUFVUU0FNUExJTkdGUkVROgorICAgICAgICAgICAgICByZXQgPSBnc3RfZWJtbF9yZWFkX3NraXAgKGVibWwpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBERUJVR19FTEVNRU5UX1NUT1AgKGRlbXV4LCBlYm1sLCAiVHJhY2tBdWRpbyIsIHJldCk7CisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgLyogY29kZWMgaWRlbnRpZmllciAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNJRDp7CisgICAgICAgIGdjaGFyICp0ZXh0OworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9hc2NpaSAoZWJtbCwgJmlkLCAmdGV4dCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiQ29kZWNJRDogJXMiLCBHU1RfU1RSX05VTEwgKHRleHQpKTsKKyAgICAgICAgY29udGV4dC0+Y29kZWNfaWQgPSB0ZXh0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBjb2RlYyBwcml2YXRlIGRhdGEgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPREVDUFJJVkFURTp7CisgICAgICAgIGd1aW50OCAqZGF0YTsKKyAgICAgICAgZ3VpbnQ2NCBzaXplOworCisgICAgICAgIGlmICgocmV0ID0KKyAgICAgICAgICAgICAgICBnc3RfZWJtbF9yZWFkX2JpbmFyeSAoZWJtbCwgJmlkLCAmZGF0YSwgJnNpemUpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjb250ZXh0LT5jb2RlY19wcml2ID0gZGF0YTsKKyAgICAgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplID0gc2l6ZTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkNvZGVjUHJpdmF0ZSBvZiBzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICBzaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgLyogbmFtZSBvZiB0aGUgY29kZWMgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPREVDTkFNRTp7CisgICAgICAgIGdjaGFyICp0ZXh0OworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91dGY4IChlYm1sLCAmaWQsICZ0ZXh0KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJDb2RlY05hbWU6ICVzIiwgR1NUX1NUUl9OVUxMICh0ZXh0KSk7CisgICAgICAgIGNvbnRleHQtPmNvZGVjX25hbWUgPSB0ZXh0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBjb2RlYyBkZWxheSAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNERUxBWTp7CisgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjb250ZXh0LT5jb2RlY19kZWxheSA9IG51bTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkNvZGVjRGVsYXk6ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKG51bSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBjb2RlYyBkZWxheSAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfU0VFS1BSRVJPTEw6eworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY29udGV4dC0+c2Vla19wcmVyb2xsID0gbnVtOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiU2Vla1ByZXJvbGw6ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKG51bSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBuYW1lIG9mIHRoaXMgdHJhY2sgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLTkFNRTp7CisgICAgICAgIGdjaGFyICp0ZXh0OworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91dGY4IChlYm1sLCAmaWQsICZ0ZXh0KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY29udGV4dC0+bmFtZSA9IHRleHQ7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVHJhY2tOYW1lOiAlcyIsIEdTVF9TVFJfTlVMTCAodGV4dCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBsYW5ndWFnZSAobWF0dGVycyBmb3IgYXVkaW8vc3VidGl0bGVzLCBtb3N0bHkpICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0xBTkdVQUdFOnsKKyAgICAgICAgZ2NoYXIgKnRleHQ7CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3V0ZjggKGVibWwsICZpZCwgJnRleHQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNvbnRleHQtPmxhbmd1YWdlID0gdGV4dDsKKworICAgICAgICAvKiBmcmUtY2EgPT4gZnJlICovCisgICAgICAgIGlmIChzdHJsZW4gKGNvbnRleHQtPmxhbmd1YWdlKSA+PSA0ICYmIGNvbnRleHQtPmxhbmd1YWdlWzNdID09ICctJykKKyAgICAgICAgICBjb250ZXh0LT5sYW5ndWFnZVszXSA9ICdcMCc7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJUcmFja0xhbmd1YWdlOiAlcyIsCisgICAgICAgICAgICBHU1RfU1RSX05VTEwgKGNvbnRleHQtPmxhbmd1YWdlKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAgIC8qIHdoZXRoZXIgdGhpcyBpcyBhY3R1YWxseSB1c2VkICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0ZMQUdFTkFCTEVEOnsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChudW0pCisgICAgICAgICAgY29udGV4dC0+ZmxhZ3MgfD0gR1NUX01BVFJPU0tBX1RSQUNLX0VOQUJMRUQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBjb250ZXh0LT5mbGFncyAmPSB+R1NUX01BVFJPU0tBX1RSQUNLX0VOQUJMRUQ7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJUcmFja0VuYWJsZWQ6ICVkIiwKKyAgICAgICAgICAgIChjb250ZXh0LT5mbGFncyAmIEdTVF9NQVRST1NLQV9UUkFDS19FTkFCTEVEKSA/IDEgOiAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgLyogd2hldGhlciBpdCdzIHRoZSBkZWZhdWx0IGZvciB0aGlzIHRyYWNrIHR5cGUgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLRkxBR0RFRkFVTFQ6eworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSkKKyAgICAgICAgICBjb250ZXh0LT5mbGFncyB8PSBHU1RfTUFUUk9TS0FfVFJBQ0tfREVGQVVMVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGNvbnRleHQtPmZsYWdzICY9IH5HU1RfTUFUUk9TS0FfVFJBQ0tfREVGQVVMVDsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlRyYWNrRGVmYXVsdDogJWQiLAorICAgICAgICAgICAgKGNvbnRleHQtPmZsYWdzICYgR1NUX01BVFJPU0tBX1RSQUNLX0RFRkFVTFQpID8gMSA6IDApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiB3aGV0aGVyIHRoZSB0cmFjayBtdXN0IGJlIHVzZWQgZHVyaW5nIHBsYXliYWNrICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0ZMQUdGT1JDRUQ6eworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSkKKyAgICAgICAgICBjb250ZXh0LT5mbGFncyB8PSBHU1RfTUFUUk9TS0FfVFJBQ0tfRk9SQ0VEOworICAgICAgICBlbHNlCisgICAgICAgICAgY29udGV4dC0+ZmxhZ3MgJj0gfkdTVF9NQVRST1NLQV9UUkFDS19GT1JDRUQ7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJUcmFja0ZvcmNlZDogJWQiLAorICAgICAgICAgICAgKGNvbnRleHQtPmZsYWdzICYgR1NUX01BVFJPU0tBX1RSQUNLX0ZPUkNFRCkgPyAxIDogMCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAgIC8qIGxhY2luZyAobGlrZSBNUEVHLCB3aGVyZSBibG9ja3MgZG9uJ3QgZW5kL3N0YXJ0IG9uIGZyYW1lCisgICAgICAgICAqIGJvdW5kYXJpZXMpICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0ZMQUdMQUNJTkc6eworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSkKKyAgICAgICAgICBjb250ZXh0LT5mbGFncyB8PSBHU1RfTUFUUk9TS0FfVFJBQ0tfTEFDSU5HOworICAgICAgICBlbHNlCisgICAgICAgICAgY29udGV4dC0+ZmxhZ3MgJj0gfkdTVF9NQVRST1NLQV9UUkFDS19MQUNJTkc7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJUcmFja0xhY2luZzogJWQiLAorICAgICAgICAgICAgKGNvbnRleHQtPmZsYWdzICYgR1NUX01BVFJPU0tBX1RSQUNLX0xBQ0lORykgPyAxIDogMCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAgIC8qIGRlZmF1bHQgbGVuZ3RoIChpbiB0aW1lKSBvZiBvbmUgZGF0YSBibG9jayBpbiB0aGlzIHRyYWNrICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0RFRkFVTFREVVJBVElPTjp7CisgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGlmIChudW0gPT0gMCkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJJbnZhbGlkIFRyYWNrRGVmYXVsdER1cmF0aW9uIDAiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVHJhY2tEZWZhdWx0RHVyYXRpb246ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICBudW0pOworICAgICAgICBjb250ZXh0LT5kZWZhdWx0X2R1cmF0aW9uID0gbnVtOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ09OVEVOVEVOQ09ESU5HUzp7CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9yZWFkX3RyYWNrX2VuY29kaW5ncyAoJmRlbXV4LT5jb21tb24sCisgICAgICAgICAgICBlYm1sLCBjb250ZXh0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLVElNRUNPREVTQ0FMRTp7CisgICAgICAgIGdkb3VibGUgbnVtOworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9mbG9hdCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSA8PSAwLjApIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiSW52YWxpZCBUcmFja1RpbWVDb2RlU2NhbGUgJWxmIiwgbnVtKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiVHJhY2tUaW1lQ29kZVNjYWxlOiAlbGYiLCBudW0pOworICAgICAgICBjb250ZXh0LT50aW1lY29kZXNjYWxlID0gbnVtOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJVbmtub3duIFRyYWNrRW50cnkgc3ViZWxlbWVudCAweCV4IC0gaWdub3JpbmciLCBpZCk7CisgICAgICAgIC8qIHBhc3MtdGhyb3VnaCAqLworCisgICAgICAgIC8qIHdlIGlnbm9yZSB0aGVzZSBiZWNhdXNlIHRoZXkncmUgbm90aGluZyB1c2VmdWwgKGkuZS4gY3JhcCkKKyAgICAgICAgICogb3Igc2ltcGx5IG5vdCBpbXBsZW1lbnRlZCB5ZXQuICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS01JTkNBQ0hFOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tNQVhDQUNIRToKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX01BWEJMT0NLQURESVRJT05JRDoKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLQVRUQUNITUVOVExJTks6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS09WRVJMQVk6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS1RSQU5TTEFURToKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLT0ZGU0VUOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNTRVRUSU5HUzoKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPREVDSU5GT1VSTDoKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPREVDRE9XTkxPQURVUkw6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DT0RFQ0RFQ09ERUFMTDoKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9za2lwIChlYm1sKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgREVCVUdfRUxFTUVOVF9TVE9QIChkZW11eCwgZWJtbCwgIlRyYWNrRW50cnkiLCByZXQpOworCisgIC8qIERlY29kZSBjb2RlYyBwcml2YXRlIGRhdGEgaWYgbmVjZXNzYXJ5ICovCisgIGlmIChjb250ZXh0LT5lbmNvZGluZ3MgJiYgY29udGV4dC0+ZW5jb2RpbmdzLT5sZW4gPiAwICYmIGNvbnRleHQtPmNvZGVjX3ByaXYKKyAgICAgICYmIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA+IDApIHsKKyAgICBpZiAoIWdzdF9tYXRyb3NrYV9kZWNvZGVfZGF0YSAoY29udGV4dC0+ZW5jb2RpbmdzLAorICAgICAgICAgICAgJmNvbnRleHQtPmNvZGVjX3ByaXYsICZjb250ZXh0LT5jb2RlY19wcml2X3NpemUsCisgICAgICAgICAgICBHU1RfTUFUUk9TS0FfVFJBQ0tfRU5DT0RJTkdfU0NPUEVfQ09ERUNfREFUQSwgVFJVRSkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJEZWNvZGluZyBjb2RlYyBwcml2YXRlIGRhdGEgZmFpbGVkIik7CisgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICB9CisgIH0KKworICBpZiAoY29udGV4dC0+dHlwZSA9PSAwIHx8IGNvbnRleHQtPmNvZGVjX2lkID09IE5VTEwgfHwgKHJldCAhPSBHU1RfRkxPV19PSworICAgICAgICAgICYmIHJldCAhPSBHU1RfRkxPV19FT1MpKSB7CisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSyB8fCByZXQgPT0gR1NUX0ZMT1dfRU9TKQorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlYm1sLCAiVW5rbm93biBzdHJlYW0vY29kZWMgaW4gdHJhY2sgZW50cnkgaGVhZGVyIik7CisKKyAgICBkZW11eC0+Y29tbW9uLm51bV9zdHJlYW1zLS07CisgICAgZ19wdHJfYXJyYXlfcmVtb3ZlX2luZGV4IChkZW11eC0+Y29tbW9uLnNyYywgZGVtdXgtPmNvbW1vbi5udW1fc3RyZWFtcyk7CisgICAgZ19hc3NlcnQgKGRlbXV4LT5jb21tb24uc3JjLT5sZW4gPT0gZGVtdXgtPmNvbW1vbi5udW1fc3RyZWFtcyk7CisgICAgZ3N0X21hdHJvc2thX3RyYWNrX2ZyZWUgKGNvbnRleHQpOworCisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIC8qIGNoZWNrIGZvciBhIGNhY2hlZCB0cmFjayB0YWdsaXN0ICAqLworICBjYWNoZWRfdGFnbGlzdCA9CisgICAgICAoR3N0VGFnTGlzdCAqKSBnX2hhc2hfdGFibGVfbG9va3VwIChkZW11eC0+Y29tbW9uLmNhY2hlZF90cmFja190YWdsaXN0cywKKyAgICAgIEdVSU5UX1RPX1BPSU5URVIgKGNvbnRleHQtPnVpZCkpOworICBpZiAoY2FjaGVkX3RhZ2xpc3QpCisgICAgZ3N0X3RhZ19saXN0X2luc2VydCAoY29udGV4dC0+dGFncywgY2FjaGVkX3RhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5EKTsKKworICAvKiBub3cgY3JlYXRlIHRoZSBHU3RyZWFtZXIgY29ubmVjdGl2aXR5ICovCisgIHN3aXRjaCAoY29udGV4dC0+dHlwZSkgeworICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU86eworICAgICAgR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqdmlkZW9jb250ZXh0ID0KKyAgICAgICAgICAoR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqKSBjb250ZXh0OworCisgICAgICBwYWRuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgidmlkZW9fJXUiLCBkZW11eC0+bnVtX3Zfc3RyZWFtcysrKTsKKyAgICAgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJ2aWRlb18ldSIpOworICAgICAgY2FwcyA9IGdzdF9tYXRyb3NrYV9kZW11eF92aWRlb19jYXBzICh2aWRlb2NvbnRleHQsCisgICAgICAgICAgY29udGV4dC0+Y29kZWNfaWQsIGNvbnRleHQtPmNvZGVjX3ByaXYsCisgICAgICAgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplLCAmY29kZWMsICZyaWZmX2ZvdXJjYyk7CisKKyAgICAgIGlmIChjb2RlYykgeworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkIChjb250ZXh0LT50YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgICBHU1RfVEFHX1ZJREVPX0NPREVDLCBjb2RlYywgTlVMTCk7CisgICAgICAgIGNvbnRleHQtPnRhZ3NfY2hhbmdlZCA9IFRSVUU7CisgICAgICAgIGdfZnJlZSAoY29kZWMpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9BVURJTzp7CisgICAgICBHc3RNYXRyb3NrYVRyYWNrQXVkaW9Db250ZXh0ICphdWRpb2NvbnRleHQgPQorICAgICAgICAgIChHc3RNYXRyb3NrYVRyYWNrQXVkaW9Db250ZXh0ICopIGNvbnRleHQ7CisKKyAgICAgIHBhZG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJhdWRpb18ldSIsIGRlbXV4LT5udW1fYV9zdHJlYW1zKyspOworICAgICAgdGVtcGwgPSBnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywgImF1ZGlvXyV1Iik7CisgICAgICBjYXBzID0gZ3N0X21hdHJvc2thX2RlbXV4X2F1ZGlvX2NhcHMgKGF1ZGlvY29udGV4dCwKKyAgICAgICAgICBjb250ZXh0LT5jb2RlY19pZCwgY29udGV4dC0+Y29kZWNfcHJpdiwgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplLAorICAgICAgICAgICZjb2RlYywgJnJpZmZfYXVkaW9fZm10KTsKKworICAgICAgaWYgKGNvZGVjKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQgKGNvbnRleHQtPnRhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgICAgICAgIEdTVF9UQUdfQVVESU9fQ09ERUMsIGNvZGVjLCBOVUxMKTsKKyAgICAgICAgY29udGV4dC0+dGFnc19jaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgZ19mcmVlIChjb2RlYyk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFOnsKKyAgICAgIEdzdE1hdHJvc2thVHJhY2tTdWJ0aXRsZUNvbnRleHQgKnN1YnRpdGxlY29udGV4dCA9CisgICAgICAgICAgKEdzdE1hdHJvc2thVHJhY2tTdWJ0aXRsZUNvbnRleHQgKikgY29udGV4dDsKKworICAgICAgcGFkbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInN1YnRpdGxlXyV1IiwgZGVtdXgtPm51bV90X3N0cmVhbXMrKyk7CisgICAgICB0ZW1wbCA9IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLCAic3VidGl0bGVfJXUiKTsKKyAgICAgIGNhcHMgPSBnc3RfbWF0cm9za2FfZGVtdXhfc3VidGl0bGVfY2FwcyAoc3VidGl0bGVjb250ZXh0LAorICAgICAgICAgIGNvbnRleHQtPmNvZGVjX2lkLCBjb250ZXh0LT5jb2RlY19wcml2LCBjb250ZXh0LT5jb2RlY19wcml2X3NpemUpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9DT01QTEVYOgorICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfTE9HTzoKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX0JVVFRPTlM6CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9DT05UUk9MOgorICAgIGRlZmF1bHQ6CisgICAgICAvKiB3ZSBzaG91bGQgYWxyZWFkeSBoYXZlIHF1aXQgYnkgbm93ICovCisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgfQorCisgIGlmICgoY29udGV4dC0+bGFuZ3VhZ2UgPT0gTlVMTCB8fCAqY29udGV4dC0+bGFuZ3VhZ2UgPT0gJ1wwJykgJiYKKyAgICAgIChjb250ZXh0LT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX0FVRElPIHx8CisgICAgICAgICAgY29udGV4dC0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRSkpIHsKKyAgICBHU1RfTE9HICgic3RyZWFtICVkOiBsYW5ndWFnZT1lbmcgKGFzc3VtaW5nIGRlZmF1bHQpIiwgY29udGV4dC0+aW5kZXgpOworICAgIGNvbnRleHQtPmxhbmd1YWdlID0gZ19zdHJkdXAgKCJlbmciKTsKKyAgfQorCisgIGlmIChjb250ZXh0LT5sYW5ndWFnZSkgeworICAgIGNvbnN0IGdjaGFyICpsYW5nOworCisgICAgLyogTWF0cm9za2EgY29udGFpbnMgSVNPIDYzOS0yQiBjb2Rlcywgd2Ugd2FudCBJU08gNjM5LTEgKi8KKyAgICBsYW5nID0gZ3N0X3RhZ19nZXRfbGFuZ3VhZ2VfY29kZSAoY29udGV4dC0+bGFuZ3VhZ2UpOworICAgIGdzdF90YWdfbGlzdF9hZGQgKGNvbnRleHQtPnRhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgICAgR1NUX1RBR19MQU5HVUFHRV9DT0RFLCAobGFuZykgPyBsYW5nIDogY29udGV4dC0+bGFuZ3VhZ2UsIE5VTEwpOworICAgIGNvbnRleHQtPnRhZ3NfY2hhbmdlZCA9IFRSVUU7CisgIH0KKworICBpZiAoY2FwcyA9PSBOVUxMKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgImNvdWxkIG5vdCBkZXRlcm1pbmUgY2FwcyBmb3Igc3RyZWFtIHdpdGggIgorICAgICAgICAiY29kZWNfaWQ9JyVzJyIsIGNvbnRleHQtPmNvZGVjX2lkKTsKKyAgICBzd2l0Y2ggKGNvbnRleHQtPnR5cGUpIHsKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU86CisgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8veC11bmtub3duIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9BVURJTzoKKyAgICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby94LXVua25vd24iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFOgorICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtc3VidGl0bGUtdW5rbm93biIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQ09NUExFWDoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXBwbGljYXRpb24veC1tYXRyb3NrYS11bmtub3duIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiY29kZWMtaWQiLCBHX1RZUEVfU1RSSU5HLCBjb250ZXh0LT5jb2RlY19pZCwKKyAgICAgICAgTlVMTCk7CisKKyAgICAvKiBhZGQgYW55IHVucmVjb2duaXNlZCByaWZmIGZvdXJjYyAvIGF1ZGlvIGZvcm1hdCwgYnV0IGFmdGVyIGNvZGVjLWlkICovCisgICAgaWYgKGNvbnRleHQtPnR5cGUgPT0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQVVESU8gJiYgcmlmZl9hdWRpb19mbXQgIT0gMCkKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJmb3JtYXQiLCBHX1RZUEVfSU5ULCByaWZmX2F1ZGlvX2ZtdCwgTlVMTCk7CisgICAgZWxzZSBpZiAoY29udGV4dC0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9WSURFTyAmJiByaWZmX2ZvdXJjYyAhPSAwKSB7CisgICAgICBnY2hhciAqZnN0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIiUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAocmlmZl9mb3VyY2MpKTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJmb3VyY2MiLCBHX1RZUEVfU1RSSU5HLCBmc3RyLCBOVUxMKTsKKyAgICAgIGdfZnJlZSAoZnN0cik7CisgICAgfQorICB9IGVsc2UgaWYgKGNvbnRleHQtPnN0cmVhbV9oZWFkZXJzICE9IE5VTEwpIHsKKyAgICBnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbV9oZWFkZXJzX3RvX2NhcHMgKGRlbXV4LAorICAgICAgICBjb250ZXh0LT5zdHJlYW1faGVhZGVycywgY2Fwcyk7CisgIH0KKworICAvKiB0aGUgcGFkIGluIGhlcmUgKi8KKyAgY29udGV4dC0+cGFkID0gZ3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAodGVtcGwsIHBhZG5hbWUpOworICBjb250ZXh0LT5jYXBzID0gY2FwczsKKworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoY29udGV4dC0+cGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc3JjX2V2ZW50KSk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChjb250ZXh0LT5wYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zcmNfcXVlcnkpKTsKKworICBHU1RfSU5GT19PQkpFQ1QgKGRlbXV4LCAiQWRkaW5nIHBhZCAnJXMnIHdpdGggY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIHBhZG5hbWUsIGNhcHMpOworCisgIGdzdF9wYWRfc2V0X2VsZW1lbnRfcHJpdmF0ZSAoY29udGV4dC0+cGFkLCBjb250ZXh0KTsKKworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChjb250ZXh0LT5wYWQpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKGNvbnRleHQtPnBhZCwgVFJVRSk7CisKKyAgc3RyZWFtX2lkID0KKyAgICAgIGdzdF9wYWRfY3JlYXRlX3N0cmVhbV9pZF9wcmludGYgKGNvbnRleHQtPnBhZCwgR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLAorICAgICAgIiUwMyIgR19HVUlOVDY0X0ZPUk1BVCAiOiUwMyIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgIGNvbnRleHQtPm51bSwgY29udGV4dC0+dWlkKTsKKyAgc3RyZWFtX3N0YXJ0ID0KKyAgICAgIGdzdF9wYWRfZ2V0X3N0aWNreV9ldmVudCAoZGVtdXgtPmNvbW1vbi5zaW5rcGFkLCBHU1RfRVZFTlRfU1RSRUFNX1NUQVJULAorICAgICAgMCk7CisgIGlmIChzdHJlYW1fc3RhcnQpIHsKKyAgICBpZiAoZ3N0X2V2ZW50X3BhcnNlX2dyb3VwX2lkIChzdHJlYW1fc3RhcnQsICZkZW11eC0+Z3JvdXBfaWQpKQorICAgICAgZGVtdXgtPmhhdmVfZ3JvdXBfaWQgPSBUUlVFOworICAgIGVsc2UKKyAgICAgIGRlbXV4LT5oYXZlX2dyb3VwX2lkID0gRkFMU0U7CisgICAgZ3N0X2V2ZW50X3VucmVmIChzdHJlYW1fc3RhcnQpOworICB9IGVsc2UgaWYgKCFkZW11eC0+aGF2ZV9ncm91cF9pZCkgeworICAgIGRlbXV4LT5oYXZlX2dyb3VwX2lkID0gVFJVRTsKKyAgICBkZW11eC0+Z3JvdXBfaWQgPSBnc3RfdXRpbF9ncm91cF9pZF9uZXh0ICgpOworICB9CisKKyAgc3RyZWFtX3N0YXJ0ID0gZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKHN0cmVhbV9pZCk7CisgIGdfZnJlZSAoc3RyZWFtX2lkKTsKKyAgaWYgKGRlbXV4LT5oYXZlX2dyb3VwX2lkKQorICAgIGdzdF9ldmVudF9zZXRfZ3JvdXBfaWQgKHN0cmVhbV9zdGFydCwgZGVtdXgtPmdyb3VwX2lkKTsKKyAgc3RyZWFtX2ZsYWdzID0gR1NUX1NUUkVBTV9GTEFHX05PTkU7CisgIGlmIChjb250ZXh0LT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFKQorICAgIHN0cmVhbV9mbGFncyB8PSBHU1RfU1RSRUFNX0ZMQUdfU1BBUlNFOworICBpZiAoY29udGV4dC0+ZmxhZ3MgJiBHU1RfTUFUUk9TS0FfVFJBQ0tfREVGQVVMVCkKKyAgICBzdHJlYW1fZmxhZ3MgfD0gR1NUX1NUUkVBTV9GTEFHX1NFTEVDVDsKKyAgZ3N0X2V2ZW50X3NldF9zdHJlYW1fZmxhZ3MgKHN0cmVhbV9zdGFydCwgc3RyZWFtX2ZsYWdzKTsKKyAgZ3N0X3BhZF9wdXNoX2V2ZW50IChjb250ZXh0LT5wYWQsIHN0cmVhbV9zdGFydCk7CisgIGdzdF9wYWRfc2V0X2NhcHMgKGNvbnRleHQtPnBhZCwgY29udGV4dC0+Y2Fwcyk7CisKKworICBpZiAoZGVtdXgtPmNvbW1vbi5nbG9iYWxfdGFncykgeworICAgIEdzdEV2ZW50ICp0YWdfZXZlbnQ7CisKKyAgICBnc3RfdGFnX2xpc3RfYWRkIChkZW11eC0+Y29tbW9uLmdsb2JhbF90YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgIEdTVF9UQUdfQ09OVEFJTkVSX0ZPUk1BVCwgIk1hdHJvc2thIiwgTlVMTCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoY29udGV4dC0+cGFkLCAiU2VuZGluZyBnbG9iYWxfdGFncyAlcDogJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgIGRlbXV4LT5jb21tb24uZ2xvYmFsX3RhZ3MsIGRlbXV4LT5jb21tb24uZ2xvYmFsX3RhZ3MpOworCisgICAgdGFnX2V2ZW50ID0KKyAgICAgICAgZ3N0X2V2ZW50X25ld190YWcgKGdzdF90YWdfbGlzdF9jb3B5IChkZW11eC0+Y29tbW9uLmdsb2JhbF90YWdzKSk7CisKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKGNvbnRleHQtPnBhZCwgdGFnX2V2ZW50KTsKKyAgfQorCisgIGlmIChHX1VOTElLRUxZIChjb250ZXh0LT50YWdzX2NoYW5nZWQpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoY29udGV4dC0+cGFkLCAiU2VuZGluZyB0YWdzICVwOiAlIgorICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgY29udGV4dC0+dGFncywgY29udGV4dC0+dGFncyk7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChjb250ZXh0LT5wYWQsCisgICAgICAgIGdzdF9ldmVudF9uZXdfdGFnIChnc3RfdGFnX2xpc3RfY29weSAoY29udGV4dC0+dGFncykpKTsKKyAgICBjb250ZXh0LT50YWdzX2NoYW5nZWQgPSBGQUxTRTsKKyAgfQorCisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChkZW11eCksIGNvbnRleHQtPnBhZCk7CisgIGdzdF9mbG93X2NvbWJpbmVyX2FkZF9wYWQgKGRlbXV4LT5mbG93Y29tYmluZXIsIGNvbnRleHQtPnBhZCk7CisKKyAgZ19mcmVlIChwYWRuYW1lKTsKKworICAvKiB0YWRhYWghICovCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX2RlbXV4X3F1ZXJ5IChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKyAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKmNvbnRleHQgPSBOVUxMOworCisgIGlmIChwYWQpIHsKKyAgICBjb250ZXh0ID0gZ3N0X3BhZF9nZXRfZWxlbWVudF9wcml2YXRlIChwYWQpOworICB9CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfUE9TSVRJT046CisgICAgeworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3Bvc2l0aW9uIChxdWVyeSwgJmZvcm1hdCwgTlVMTCk7CisKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBpZiAoZm9ybWF0ID09IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgICAgICAgaWYgKGNvbnRleHQpCisgICAgICAgICAgZ3N0X3F1ZXJ5X3NldF9wb3NpdGlvbiAocXVlcnksIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgICAgICAgTUFYIChjb250ZXh0LT5wb3MsIGRlbXV4LT5zdHJlYW1fc3RhcnRfdGltZSkgLQorICAgICAgICAgICAgICBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgZ3N0X3F1ZXJ5X3NldF9wb3NpdGlvbiAocXVlcnksIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgICAgICAgTUFYIChkZW11eC0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb24sIGRlbXV4LT5zdHJlYW1fc3RhcnRfdGltZSkgLQorICAgICAgICAgICAgICBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWUpOworICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gR1NUX0ZPUk1BVF9ERUZBVUxUICYmIGNvbnRleHQKKyAgICAgICAgICAmJiBjb250ZXh0LT5kZWZhdWx0X2R1cmF0aW9uKSB7CisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgR1NUX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgY29udGV4dC0+cG9zIC8gY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbik7CisgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICJvbmx5IHBvc2l0aW9uIHF1ZXJ5IGluIFRJTUUgYW5kIERFRkFVTFQgZm9ybWF0IGlzIHN1cHBvcnRlZCIpOworICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX0RVUkFUSU9OOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9kdXJhdGlvbiAocXVlcnksICZmb3JtYXQsIE5VTEwpOworCisgICAgICByZXMgPSBUUlVFOworICAgICAgaWYgKGZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgICAgICAgIGdzdF9xdWVyeV9zZXRfZHVyYXRpb24gKHF1ZXJ5LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICBkZW11eC0+Y29tbW9uLnNlZ21lbnQuZHVyYXRpb24pOworICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gR1NUX0ZPUk1BVF9ERUZBVUxUICYmIGNvbnRleHQKKyAgICAgICAgICAmJiBjb250ZXh0LT5kZWZhdWx0X2R1cmF0aW9uKSB7CisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAgICAgICBnc3RfcXVlcnlfc2V0X2R1cmF0aW9uIChxdWVyeSwgR1NUX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgZGVtdXgtPmNvbW1vbi5zZWdtZW50LmR1cmF0aW9uIC8gY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbik7CisgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICJvbmx5IGR1cmF0aW9uIHF1ZXJ5IGluIFRJTUUgYW5kIERFRkFVTFQgZm9ybWF0IGlzIHN1cHBvcnRlZCIpOworICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR1NUX1FVRVJZX1NFRUtJTkc6CisgICAgeworICAgICAgR3N0Rm9ybWF0IGZtdDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3NlZWtpbmcgKHF1ZXJ5LCAmZm10LCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAgICAgaWYgKGZtdCA9PSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgZ2Jvb2xlYW4gc2Vla2FibGU7CisKKyAgICAgICAgaWYgKGRlbXV4LT5zdHJlYW1pbmcpIHsKKyAgICAgICAgICAvKiBhc3N1bWluZyB3ZSdsbCBiZSBhYmxlIHRvIGdldCBhbiBpbmRleCAuLi4gKi8KKyAgICAgICAgICBzZWVrYWJsZSA9IGRlbXV4LT5zZWVrYWJsZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZWVrYWJsZSA9IFRSVUU7CisgICAgICAgIH0KKworICAgICAgICBnc3RfcXVlcnlfc2V0X3NlZWtpbmcgKHF1ZXJ5LCBHU1RfRk9STUFUX1RJTUUsIHNlZWthYmxlLAorICAgICAgICAgICAgMCwgZGVtdXgtPmNvbW1vbi5zZWdtZW50LmR1cmF0aW9uKTsKKyAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfU0VHTUVOVDoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworICAgICAgZ2ludDY0IHN0YXJ0LCBzdG9wOworCisgICAgICBmb3JtYXQgPSBkZW11eC0+Y29tbW9uLnNlZ21lbnQuZm9ybWF0OworCisgICAgICBzdGFydCA9CisgICAgICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZkZW11eC0+Y29tbW9uLnNlZ21lbnQsIGZvcm1hdCwKKyAgICAgICAgICBkZW11eC0+Y29tbW9uLnNlZ21lbnQuc3RhcnQpOworICAgICAgaWYgKChzdG9wID0gZGVtdXgtPmNvbW1vbi5zZWdtZW50LnN0b3ApID09IC0xKQorICAgICAgICBzdG9wID0gZGVtdXgtPmNvbW1vbi5zZWdtZW50LmR1cmF0aW9uOworICAgICAgZWxzZQorICAgICAgICBzdG9wID0KKyAgICAgICAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmZGVtdXgtPmNvbW1vbi5zZWdtZW50LCBmb3JtYXQsIHN0b3ApOworCisgICAgICBnc3RfcXVlcnlfc2V0X3NlZ21lbnQgKHF1ZXJ5LCBkZW11eC0+Y29tbW9uLnNlZ21lbnQucmF0ZSwgZm9ybWF0LCBzdGFydCwKKyAgICAgICAgICBzdG9wKTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChwYWQpCisgICAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCAoR3N0T2JqZWN0ICopIGRlbXV4LCBxdWVyeSk7CisgICAgICBlbHNlCisgICAgICAgIHJlcyA9CisgICAgICAgICAgICBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+cXVlcnkgKEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwKKyAgICAgICAgICAgIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbWF0cm9za2FfZGVtdXhfZWxlbWVudF9xdWVyeSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIHJldHVybiBnc3RfbWF0cm9za2FfZGVtdXhfcXVlcnkgKEdTVF9NQVRST1NLQV9ERU1VWCAoZWxlbWVudCksIE5VTEwsIHF1ZXJ5KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NyY19xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0TWF0cm9za2FEZW11eCAqZGVtdXggPSBHU1RfTUFUUk9TS0FfREVNVVggKHBhcmVudCk7CisKKyAgcmV0dXJuIGdzdF9tYXRyb3NrYV9kZW11eF9xdWVyeSAoZGVtdXgsIHBhZCwgcXVlcnkpOworfQorCisvKiByZXR1cm5zIEZBTFNFIGlmIHRoZXJlIGFyZSBubyBwYWRzIHRvIGRlbGl2ZXIgZXZlbnQgdG8sCisgKiBvdGhlcndpc2UgVFJVRSAod2hhdGV2ZXIgdGhlIG91dGNvbWUgb2YgZXZlbnQgc2VuZGluZyksCisgKiB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIHBhc3NlZCBldmVudCEgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfZXZlbnQgKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisgIGdpbnQgaTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZXZlbnQgIT0gTlVMTCwgRkFMU0UpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiU2VuZGluZyBldmVudCBvZiB0eXBlICVzIHRvIGFsbCBzb3VyY2UgcGFkcyIsCisgICAgICBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIGdfYXNzZXJ0IChkZW11eC0+Y29tbW9uLnNyYy0+bGVuID09IGRlbXV4LT5jb21tb24ubnVtX3N0cmVhbXMpOworICBmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPmNvbW1vbi5zcmMtPmxlbjsgaSsrKSB7CisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKnN0cmVhbTsKKworICAgIHN0cmVhbSA9IGdfcHRyX2FycmF5X2luZGV4IChkZW11eC0+Y29tbW9uLnNyYywgaSk7CisgICAgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5wYWQsIGV2ZW50KTsKKyAgICByZXQgPSBUUlVFOworICB9CisKKyAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfZGVtdXhfc2VuZF90YWdzIChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgpCit7CisgIGdpbnQgaTsKKworICBpZiAoR19VTkxJS0VMWSAoZGVtdXgtPmNvbW1vbi5nbG9iYWxfdGFnc19jaGFuZ2VkKSkgeworICAgIEdzdEV2ZW50ICp0YWdfZXZlbnQ7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAoZGVtdXgtPmNvbW1vbi5nbG9iYWxfdGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICBHU1RfVEFHX0NPTlRBSU5FUl9GT1JNQVQsICJNYXRyb3NrYSIsIE5VTEwpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiU2VuZGluZyBnbG9iYWxfdGFncyAlcCA6ICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICBkZW11eC0+Y29tbW9uLmdsb2JhbF90YWdzLCBkZW11eC0+Y29tbW9uLmdsb2JhbF90YWdzKTsKKworICAgIHRhZ19ldmVudCA9CisgICAgICAgIGdzdF9ldmVudF9uZXdfdGFnIChnc3RfdGFnX2xpc3RfY29weSAoZGVtdXgtPmNvbW1vbi5nbG9iYWxfdGFncykpOworCisgICAgZm9yIChpID0gMDsgaSA8IGRlbXV4LT5jb21tb24uc3JjLT5sZW47IGkrKykgeworICAgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKnN0cmVhbTsKKworICAgICAgc3RyZWFtID0gZ19wdHJfYXJyYXlfaW5kZXggKGRlbXV4LT5jb21tb24uc3JjLCBpKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5wYWQsIGdzdF9ldmVudF9yZWYgKHRhZ19ldmVudCkpOworICAgIH0KKworICAgIGdzdF9ldmVudF91bnJlZiAodGFnX2V2ZW50KTsKKyAgICBkZW11eC0+Y29tbW9uLmdsb2JhbF90YWdzX2NoYW5nZWQgPSBGQUxTRTsKKyAgfQorCisgIGdfYXNzZXJ0IChkZW11eC0+Y29tbW9uLnNyYy0+bGVuID09IGRlbXV4LT5jb21tb24ubnVtX3N0cmVhbXMpOworICBmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPmNvbW1vbi5zcmMtPmxlbjsgaSsrKSB7CisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKnN0cmVhbTsKKworICAgIHN0cmVhbSA9IGdfcHRyX2FycmF5X2luZGV4IChkZW11eC0+Y29tbW9uLnNyYywgaSk7CisKKyAgICBpZiAoR19VTkxJS0VMWSAoc3RyZWFtLT50YWdzX2NoYW5nZWQpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlNlbmRpbmcgdGFncyAlcCBmb3IgcGFkICVzOiVzIDogJSIKKyAgICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgc3RyZWFtLT50YWdzLAorICAgICAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAoc3RyZWFtLT5wYWQpLCBzdHJlYW0tPnRhZ3MpOworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzdHJlYW0tPnBhZCwKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X3RhZyAoZ3N0X3RhZ19saXN0X2NvcHkgKHN0cmVhbS0+dGFncykpKTsKKyAgICAgIHN0cmVhbS0+dGFnc19jaGFuZ2VkID0gRkFMU0U7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX2RlbXV4X2VsZW1lbnRfc2VuZF9ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdE1hdHJvc2thRGVtdXggKmRlbXV4ID0gR1NUX01BVFJPU0tBX0RFTVVYIChlbGVtZW50KTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChldmVudCAhPSBOVUxMLCBGQUxTRSk7CisKKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX1NFRUspIHsKKyAgICAvKiBubyBzZWVraW5nIHVudGlsIHdlIGFyZSAoc2FmZWx5KSByZWFkeSAqLworICAgIGlmIChkZW11eC0+Y29tbW9uLnN0YXRlICE9IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0RBVEEpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAibm90IHJlYWR5IGZvciBzZWVraW5nIHlldCIpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJlcyA9IGdzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc2Vla19ldmVudCAoZGVtdXgsIE5VTEwsIGV2ZW50KTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiVW5oYW5kbGVkIGV2ZW50IG9mIHR5cGUgJXMiLAorICAgICAgICBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworICAgIHJlcyA9IEZBTFNFOworICB9CisgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9kZW11eF9tb3ZlX3RvX2VudHJ5IChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgsCisgICAgR3N0TWF0cm9za2FJbmRleCAqIGVudHJ5LCBnYm9vbGVhbiByZXNldCwgZ2Jvb2xlYW4gdXBkYXRlKQoreworICBnaW50IGk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisKKyAgaWYgKHVwZGF0ZSkgeworICAgIC8qIHNlZWsgKHJlbGF0aXZlIHRvIG1hdHJvc2thIHNlZ21lbnQpICovCisgICAgLyogcG9zaXRpb24gbWlnaHQgYmUgaW52YWxpZDsgd2lsbCBlcnJvciB3aGVuIHN0cmVhbWluZyByZXN1bWVzIC4uLiAqLworICAgIGRlbXV4LT5jb21tb24ub2Zmc2V0ID0gZW50cnktPnBvcyArIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X3N0YXJ0OworICAgIGRlbXV4LT5uZXh0X2NsdXN0ZXJfb2Zmc2V0ID0gMDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAiU2Vla2VkIHRvIG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFUICIsIGJsb2NrICVkLCAiICJ0aW1lICUiCisgICAgICAgIEdTVF9USU1FX0ZPUk1BVCwgZW50cnktPnBvcyArIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X3N0YXJ0LAorICAgICAgICBlbnRyeS0+YmxvY2ssIEdTVF9USU1FX0FSR1MgKGVudHJ5LT50aW1lKSk7CisKKyAgICAvKiB1cGRhdGUgdGhlIHRpbWUgKi8KKyAgICBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcmVzZXRfc3RyZWFtcyAoJmRlbXV4LT5jb21tb24sIGVudHJ5LT50aW1lLCBUUlVFKTsKKyAgICBnc3RfZmxvd19jb21iaW5lcl9yZXNldCAoZGVtdXgtPmZsb3djb21iaW5lcik7CisgICAgZGVtdXgtPmNvbW1vbi5zZWdtZW50LnBvc2l0aW9uID0gZW50cnktPnRpbWU7CisgICAgZGVtdXgtPnNlZWtfYmxvY2sgPSBlbnRyeS0+YmxvY2s7CisgICAgZGVtdXgtPnNlZWtfZmlyc3QgPSBUUlVFOworICAgIGRlbXV4LT5sYXN0X3N0b3BfZW5kID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBkZW11eC0+Y29tbW9uLnNyYy0+bGVuOyBpKyspIHsKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqc3RyZWFtID0gZ19wdHJfYXJyYXlfaW5kZXggKGRlbXV4LT5jb21tb24uc3JjLCBpKTsKKworICAgIGlmIChyZXNldCkgeworICAgICAgc3RyZWFtLT50b19vZmZzZXQgPSBHX01BWElOVDY0OworICAgIH0gZWxzZSB7CisgICAgICBpZiAoc3RyZWFtLT5mcm9tX29mZnNldCAhPSAtMSkKKyAgICAgICAgc3RyZWFtLT50b19vZmZzZXQgPSBzdHJlYW0tPmZyb21fb2Zmc2V0OworICAgIH0KKyAgICBzdHJlYW0tPmZyb21fb2Zmc2V0ID0gLTE7CisgICAgc3RyZWFtLT5mcm9tX3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdpbnQKK2dzdF9tYXRyb3NrYV9jbHVzdGVyX2NvbXBhcmUgKGdpbnQ2NCAqIGkxLCBnaW50NjQgKiBpMikKK3sKKyAgaWYgKCppMSA8ICppMikKKyAgICByZXR1cm4gLTE7CisgIGVsc2UgaWYgKCppMSA+ICppMikKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBzZWFyY2hlcyBmb3IgYSBjbHVzdGVyIHN0YXJ0IGZyb20gQHBvcywKKyAqIHJldHVybiBHU1RfRkxPV19PSyBhbmQgY2x1c3RlciBwb3NpdGlvbiBpbiBAcG9zIGlmIGZvdW5kICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X3NlYXJjaF9jbHVzdGVyIChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgsIGdpbnQ2NCAqIHBvcywKKyAgICBnYm9vbGVhbiBmb3J3YXJkKQoreworICBnaW50NjQgbmV3cG9zID0gKnBvczsKKyAgZ2ludDY0IG9yaWdfb2Zmc2V0OworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBjb25zdCBndWludCBjaHVuayA9IDEyOCAqIDEwMjQ7CisgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdwb2ludGVyIGRhdGEgPSBOVUxMOworICBnc2l6ZSBzaXplOworICBndWludDY0IGxlbmd0aDsKKyAgZ3VpbnQzMiBpZDsKKyAgZ3VpbnQgbmVlZGVkOworICBnaW50NjQgb2xkcG9zLCBvbGRsZW5ndGg7CisKKyAgb3JpZ19vZmZzZXQgPSBkZW11eC0+Y29tbW9uLm9mZnNldDsKKworICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJzZWFyY2hpbmcgY2x1c3RlciAlcyBvZmZzZXQgJSIgR19HSU5UNjRfRk9STUFULAorICAgICAgZm9yd2FyZCA/ICJmb2xsb3dpbmciIDogInByZWNlZGluZyIsICpwb3MpOworCisgIGlmIChkZW11eC0+Y2x1c3RlcnMpIHsKKyAgICBnaW50NjQgKmNwb3M7CisKKyAgICBjcG9zID0gZ3N0X3V0aWxfYXJyYXlfYmluYXJ5X3NlYXJjaCAoZGVtdXgtPmNsdXN0ZXJzLT5kYXRhLAorICAgICAgICBkZW11eC0+Y2x1c3RlcnMtPmxlbiwgc2l6ZW9mIChnaW50NjQpLAorICAgICAgICAoR0NvbXBhcmVEYXRhRnVuYykgZ3N0X21hdHJvc2thX2NsdXN0ZXJfY29tcGFyZSwKKyAgICAgICAgZm9yd2FyZCA/IEdTVF9TRUFSQ0hfTU9ERV9BRlRFUiA6IEdTVF9TRUFSQ0hfTU9ERV9CRUZPUkUsIHBvcywgTlVMTCk7CisgICAgLyogc2FuaXR5IGNoZWNrICovCisgICAgaWYgKGNwb3MpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICJjbHVzdGVyIHJlcG9ydGVkIGF0IG9mZnNldCAlIiBHX0dJTlQ2NF9GT1JNQVQsICpjcG9zKTsKKyAgICAgIGRlbXV4LT5jb21tb24ub2Zmc2V0ID0gKmNwb3M7CisgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGVla19pZF9sZW5ndGhfcHVsbCAoJmRlbXV4LT5jb21tb24sCisgICAgICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCAmaWQsICZsZW5ndGgsICZuZWVkZWQpOworICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBpZCA9PSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUikgeworICAgICAgICBuZXdwb3MgPSAqY3BvczsKKyAgICAgICAgZ290byBleGl0OworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIHJlYWQgaW4gYXQgbmV3cG9zIGFuZCBzY2FuIGZvciBlYm1sIGNsdXN0ZXIgaWQgKi8KKyAgb2xkcG9zID0gb2xkbGVuZ3RoID0gLTE7CisgIHdoaWxlICgxKSB7CisgICAgR3N0Qnl0ZVJlYWRlciByZWFkZXI7CisgICAgZ2ludCBjbHVzdGVyX3BvczsKKyAgICBndWludCB0b3JlYWQgPSBjaHVuazsKKworICAgIGlmICghZm9yd2FyZCkgeworICAgICAgLyogbmV2ZXIgcmVhZCBiZXlvbmQgdGhlIHJlcXVlc3RlZCB0YXJnZXQgKi8KKyAgICAgIGlmIChHX1VOTElLRUxZIChuZXdwb3MgPCBjaHVuaykpIHsKKyAgICAgICAgdG9yZWFkID0gbmV3cG9zOworICAgICAgICBuZXdwb3MgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV3cG9zIC09IGNodW5rOworICAgICAgfQorICAgIH0KKyAgICBpZiAoYnVmICE9IE5VTEwpIHsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgYnVmID0gTlVMTDsKKyAgICB9CisgICAgcmV0ID0gZ3N0X3BhZF9wdWxsX3JhbmdlIChkZW11eC0+Y29tbW9uLnNpbmtwYWQsIG5ld3BvcywgdG9yZWFkLCAmYnVmKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICJyZWFkIGJ1ZmZlciBzaXplICUiIEdfR1NJWkVfRk9STUFUICIgYXQgb2Zmc2V0ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSwgbmV3cG9zKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIGRhdGEgPSBtYXAuZGF0YTsKKyAgICBzaXplID0gbWFwLnNpemU7CisgICAgaWYgKG9sZHBvcyA9PSBuZXdwb3MgJiYgb2xkbGVuZ3RoID09IG1hcC5zaXplKSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChkZW11eCwgIlN0dWNrIGF0IHNhbWUgcG9zaXRpb24iKTsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgZ290byBleGl0OworICAgIH0gZWxzZSB7CisgICAgICBvbGRwb3MgPSBuZXdwb3M7CisgICAgICBvbGRsZW5ndGggPSBtYXAuc2l6ZTsKKyAgICB9CisKKyAgICBnc3RfYnl0ZV9yZWFkZXJfaW5pdCAoJnJlYWRlciwgZGF0YSwgc2l6ZSk7CisgICAgY2x1c3Rlcl9wb3MgPSAtMTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgZ2ludCBmb3VuZCA9IGdzdF9ieXRlX3JlYWRlcl9tYXNrZWRfc2Nhbl91aW50MzIgKCZyZWFkZXIsIDB4ZmZmZmZmZmYsCisgICAgICAgICAgR1NUX01BVFJPU0tBX0lEX0NMVVNURVIsIDAsIGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nICgmcmVhZGVyKSk7CisgICAgICBpZiAoZm9yd2FyZCkgeworICAgICAgICBjbHVzdGVyX3BvcyA9IGZvdW5kOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8qIG5lZWQgbGFzdCBvY2N1cnJlbmNlIHdoZW4gc2VhcmNoaW5nIGJhY2t3YXJkcyAqLworICAgICAgaWYgKGZvdW5kID49IDApIHsKKyAgICAgICAgY2x1c3Rlcl9wb3MgPSBnc3RfYnl0ZV9yZWFkZXJfZ2V0X3BvcyAoJnJlYWRlcikgKyBmb3VuZDsKKyAgICAgICAgZ3N0X2J5dGVfcmVhZGVyX3NraXAgKCZyZWFkZXIsIGZvdW5kICsgNCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2x1c3Rlcl9wb3MgPj0gMCkgeworICAgICAgbmV3cG9zICs9IGNsdXN0ZXJfcG9zOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgImZvdW5kIGNsdXN0ZXIgZWJtbCBpZCBhdCBvZmZzZXQgJSIgR19HSU5UNjRfRk9STUFULCBuZXdwb3MpOworICAgICAgLyogZXh0cmEgY2hlY2tzIHdoZXRoZXIgd2UgcmVhbGx5IHN5bmMnZWQgdG8gYSBjbHVzdGVyOgorICAgICAgICogLSBlaXRoZXIgaXQgaXMgdGhlIGZpcnN0IGFuZCBvbmx5IGNsdXN0ZXIKKyAgICAgICAqIC0gZWl0aGVyIHRoZXJlIGlzIGEgY2x1c3RlciBhZnRlciB0aGlzIG9uZQorICAgICAgICogLSBlaXRoZXIgY2x1c3RlciBsZW5ndGggaXMgdW5kZWZpbmVkCisgICAgICAgKi8KKyAgICAgIC8qIG9rIGlmIGZpcnN0IGNsdXN0ZXIgKHRoZXJlIG1heSBub3QgYSBzdWJzZXF1ZW50IG9uZSkgKi8KKyAgICAgIGlmIChuZXdwb3MgPT0gZGVtdXgtPmZpcnN0X2NsdXN0ZXJfb2Zmc2V0KSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiY2x1c3RlciBpcyBmaXJzdCBjbHVzdGVyIC0+IE9LIik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVtdXgtPmNvbW1vbi5vZmZzZXQgPSBuZXdwb3M7CisgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGVla19pZF9sZW5ndGhfcHVsbCAoJmRlbXV4LT5jb21tb24sCisgICAgICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCAmaWQsICZsZW5ndGgsICZuZWVkZWQpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIm5lZWQgbW9yZSBkYXRhIC0+IGNvbnRpbnVlIik7CisgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgIH0KKyAgICAgIGdfYXNzZXJ0IChpZCA9PSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUik7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImNsdXN0ZXIgc2l6ZSAlIiBHX0dVSU5UNjRfRk9STUFUICIsIHByZWZpeCAlZCIsCisgICAgICAgICAgbGVuZ3RoLCBuZWVkZWQpOworICAgICAgLyogb2sgaWYgdW5kZWZpbmVkIGxlbmd0aCBvciBmaXJzdCBjbHVzdGVyICovCisgICAgICBpZiAobGVuZ3RoID09IEdTVF9FQk1MX1NJWkVfVU5LTk9XTiB8fCBsZW5ndGggPT0gR19NQVhVSU5UNjQpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJjbHVzdGVyIGhhcyB1bmRlZmluZWQgbGVuZ3RoIC0+IE9LIik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLyogc2tpcCBjbHVzdGVyICovCisgICAgICBkZW11eC0+Y29tbW9uLm9mZnNldCArPSBsZW5ndGggKyBuZWVkZWQ7CisgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGVla19pZF9sZW5ndGhfcHVsbCAoJmRlbXV4LT5jb21tb24sCisgICAgICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCAmaWQsICZsZW5ndGgsICZuZWVkZWQpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBuZXh0OworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJuZXh0IGVsZW1lbnQgaXMgJXNjbHVzdGVyIiwKKyAgICAgICAgICBpZCA9PSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUiA/ICIiIDogIm5vdCAiKTsKKyAgICAgIGlmIChpZCA9PSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUikKKyAgICAgICAgYnJlYWs7CisgICAgbmV4dDoKKyAgICAgIGlmIChmb3J3YXJkKQorICAgICAgICBuZXdwb3MgKz0gMTsKKyAgICB9IGVsc2UgeworICAgICAgLyogcGFydGlhbCBjbHVzdGVyIGlkIG1heSBoYXZlIGJlZW4gaW4gdGFpbCBvZiBidWZmZXIgKi8KKyAgICAgIG5ld3BvcyArPQorICAgICAgICAgIGZvcndhcmQgPyBNQVggKGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nICgmcmVhZGVyKSwgNCkgLSAzIDogMzsKKyAgICB9CisgIH0KKworICBpZiAoYnVmKSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIGJ1ZiA9IE5VTEw7CisgIH0KKworZXhpdDoKKyAgZGVtdXgtPmNvbW1vbi5vZmZzZXQgPSBvcmlnX29mZnNldDsKKyAgKnBvcyA9IG5ld3BvczsKKyAgcmV0dXJuIHJldDsKK30KKworLyogYmlzZWN0IGFuZCBzY2FuIHRocm91Z2ggZmlsZSBmb3IgY2x1c3RlciBzdGFydGluZyBiZWZvcmUgQHRpbWUsCisgKiByZXR1cm5zIGZha2UgaW5kZXggZW50cnkgd2l0aCBjb3JyZXNwb25kaW5nIGluZm8gb24gY2x1c3RlciAqLworc3RhdGljIEdzdE1hdHJvc2thSW5kZXggKgorZ3N0X21hdHJvc2thX2RlbXV4X3NlYXJjaF9wb3MgKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCwgR3N0Q2xvY2tUaW1lIHRpbWUpCit7CisgIEdzdE1hdHJvc2thSW5kZXggKmVudHJ5ID0gTlVMTDsKKyAgR3N0TWF0cm9za2FSZWFkU3RhdGUgY3VycmVudF9zdGF0ZTsKKyAgR3N0Q2xvY2tUaW1lIG90aW1lLCBwcmV2X2NsdXN0ZXJfdGltZSwgY3VycmVudF9jbHVzdGVyX3RpbWUsIGNsdXN0ZXJfdGltZTsKKyAgR3N0Q2xvY2tUaW1lIGF0aW1lOworICBnaW50NjQgb3BvcywgbmV3cG9zLCBjdXJyZW50X29mZnNldDsKKyAgZ2ludDY0IHByZXZfY2x1c3Rlcl9vZmZzZXQgPSAtMSwgY3VycmVudF9jbHVzdGVyX29mZnNldCwgY2x1c3Rlcl9vZmZzZXQ7CisgIGdpbnQ2NCBhcG9zLCBtYXhwb3M7CisgIGd1aW50NjQgY2x1c3Rlcl9zaXplID0gMDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIGd1aW50NjQgbGVuZ3RoOworICBndWludDMyIGlkOworICBndWludCBuZWVkZWQ7CisKKyAgLyogZXN0aW1hdGUgbmV3IHBvc2l0aW9uLCByZXN5bmMgdXNpbmcgY2x1c3RlciBlYm1sIGlkLAorICAgKiBhbmQgYmlzZWN0IGZ1cnRoZXIgb3Igc2NhbiBmb3J3YXJkIHRvIGFwcHJvcHJpYXRlIGNsdXN0ZXIgKi8KKworICAvKiBzdG9yZSBzb21lIGN1cnJlbnQgc3RhdGUgKi8KKyAgY3VycmVudF9zdGF0ZSA9IGRlbXV4LT5jb21tb24uc3RhdGU7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChjdXJyZW50X3N0YXRlID09IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0RBVEEsIE5VTEwpOworCisgIGN1cnJlbnRfY2x1c3Rlcl9vZmZzZXQgPSBkZW11eC0+Y2x1c3Rlcl9vZmZzZXQ7CisgIGN1cnJlbnRfY2x1c3Rlcl90aW1lID0gZGVtdXgtPmNsdXN0ZXJfdGltZTsKKyAgY3VycmVudF9vZmZzZXQgPSBkZW11eC0+Y29tbW9uLm9mZnNldDsKKworICBkZW11eC0+Y29tbW9uLnN0YXRlID0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0NBTk5JTkc7CisKKyAgLyogZXN0aW1hdGUgdXNpbmcgc3RhcnQgYW5kIGxhc3Qga25vd24gY2x1c3RlciAqLworICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgYXBvcyA9IGRlbXV4LT5maXJzdF9jbHVzdGVyX29mZnNldDsKKyAgYXRpbWUgPSBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWU7CisgIG9wb3MgPSBkZW11eC0+bGFzdF9jbHVzdGVyX29mZnNldDsKKyAgb3RpbWUgPSBkZW11eC0+c3RyZWFtX2xhc3RfdGltZTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKworICAvKiBzYW5pdGl6ZSAqLworICB0aW1lID0gTUFYICh0aW1lLCBhdGltZSk7CisgIG90aW1lID0gTUFYIChvdGltZSwgYXRpbWUpOworICBvcG9zID0gTUFYIChvcG9zLCBhcG9zKTsKKworICBtYXhwb3MgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZ2V0X2xlbmd0aCAoJmRlbXV4LT5jb21tb24pOworCisgIC8qIGludmFyaWFudHM7CisgICAqIGFwb3MgPD0gb3BvcworICAgKiBhdGltZSA8PSBvdGltZQorICAgKiBhcG9zIGFsd2F5cyByZWZlciB0byBhIGNsdXN0ZXIgYmVmb3JlIHRhcmdldCB0aW1lOworICAgKiBvcG9zIG1heSBvciBtYXkgbm90IGJlIGFmdGVyIHRhcmdldCB0aW1lLCBidXQgaWYgaXQgaXMgb25jZSBzbywKKyAgICogdGhlbiBhbHNvIGluIG5leHQgaXRlcmF0aW9uCisgICAqICovCisKK3JldHJ5OgorICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsCisgICAgICAiYXBvczogJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBhdGltZTogJSIgR1NUX1RJTUVfRk9STUFUICIsICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQgIiBpbiBzdHJlYW0gdGltZSwgIgorICAgICAgIm9wb3M6ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgb3RpbWU6ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCAlIgorICAgICAgR1NUX1RJTUVfRk9STUFUICIgaW4gc3RyZWFtIHRpbWUgKHN0YXJ0ICUiIEdTVF9USU1FX0ZPUk1BVCAiKSwgdGltZSAlIgorICAgICAgR1NUX1RJTUVfRk9STUFULCBhcG9zLCBHU1RfVElNRV9BUkdTIChhdGltZSksCisgICAgICBHU1RfVElNRV9BUkdTIChhdGltZSAtIGRlbXV4LT5zdHJlYW1fc3RhcnRfdGltZSksIG9wb3MsCisgICAgICBHU1RfVElNRV9BUkdTIChvdGltZSksIEdTVF9USU1FX0FSR1MgKG90aW1lIC0gZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKGRlbXV4LT5zdHJlYW1fc3RhcnRfdGltZSksIEdTVF9USU1FX0FSR1MgKHRpbWUpKTsKKworICBnX2Fzc2VydCAoYXRpbWUgPD0gb3RpbWUpOworICBnX2Fzc2VydCAoYXBvcyA8PSBvcG9zKTsKKyAgaWYgKHRpbWUgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic2VhcmNoaW5nIGxhc3QgY2x1c3RlciIpOworICAgIG5ld3BvcyA9IG1heHBvczsKKyAgICBpZiAobmV3cG9zID09IC0xKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInVua25vd24gZmlsZSBzaXplOyBiYWlsaW5nIG91dCIpOworICAgICAgZ290byBleGl0OworICAgIH0KKyAgfSBlbHNlIGlmIChvdGltZSA8PSBhdGltZSkgeworICAgIG5ld3BvcyA9IGFwb3M7CisgIH0gZWxzZSB7CisgICAgbmV3cG9zID0gYXBvcyArCisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAob3BvcyAtIGFwb3MsIHRpbWUgLSBhdGltZSwgb3RpbWUgLSBhdGltZSk7CisgICAgaWYgKG1heHBvcyAhPSAtMSAmJiBuZXdwb3MgPiBtYXhwb3MpCisgICAgICBuZXdwb3MgPSBtYXhwb3M7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICJlc3RpbWF0ZWQgb2Zmc2V0IGZvciAlIiBHU1RfVElNRV9GT1JNQVQgIjogJSIgR19HSU5UNjRfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZSksIG5ld3Bvcyk7CisKKyAgLyogc2VhcmNoIGJhY2t3YXJkcyAqLworICBpZiAobmV3cG9zID4gYXBvcykgeworICAgIHJldCA9IGdzdF9tYXRyb3NrYV9kZW11eF9zZWFyY2hfY2x1c3RlciAoZGVtdXgsICZuZXdwb3MsIEZBTFNFKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBleGl0OworICB9CisKKyAgLyogdGhlbiBzdGFydCBzY2FubmluZyBhbmQgcGFyc2luZyBmb3IgY2x1c3RlciB0aW1lLAorICAgKiByZS1lc3RpbWF0ZSBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIG5leHQgY2x1c3RlciBhbmQgc28gb24gKi8KKyAgLyogbm90ZSB0aGF0IGVhY2ggcmUtZXN0aW1hdGUgaXMgZW50ZXJlZCB3aXRoIGEgY2hhbmdlIGluIGFwb3Mgb3Igb3BvcywKKyAgICogYXZvaWRpbmcgaW5maW5pdGUgbG9vcCAqLworICBkZW11eC0+Y29tbW9uLm9mZnNldCA9IG5ld3BvczsKKyAgZGVtdXgtPmNsdXN0ZXJfdGltZSA9IGNsdXN0ZXJfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGNsdXN0ZXJfc2l6ZSA9IDA7CisgIHByZXZfY2x1c3Rlcl90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgd2hpbGUgKDEpIHsKKyAgICAvKiBwZWVrIGFuZCBwYXJzZSBzb21lIGVsZW1lbnRzICovCisgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BlZWtfaWRfbGVuZ3RoX3B1bGwgKCZkZW11eC0+Y29tbW9uLAorICAgICAgICBHU1RfRUxFTUVOVF9DQVNUIChkZW11eCksICZpZCwgJmxlbmd0aCwgJm5lZWRlZCk7CisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiT2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgRWxlbWVudCBpZCAweCV4LCAiCisgICAgICAgICJzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgbmVlZGVkICVkIiwgZGVtdXgtPmNvbW1vbi5vZmZzZXQsIGlkLAorICAgICAgICBsZW5ndGgsIG5lZWRlZCk7CisgICAgcmV0ID0gZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2lkIChkZW11eCwgaWQsIGxlbmd0aCwgbmVlZGVkKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBlcnJvcjsKKworICAgIGlmIChpZCA9PSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUikgeworICAgICAgY2x1c3Rlcl90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgIGlmIChsZW5ndGggPT0gR19NQVhVSU5UNjQpCisgICAgICAgIGNsdXN0ZXJfc2l6ZSA9IDA7CisgICAgICBlbHNlCisgICAgICAgIGNsdXN0ZXJfc2l6ZSA9IGxlbmd0aCArIG5lZWRlZDsKKyAgICB9CisgICAgaWYgKGRlbXV4LT5jbHVzdGVyX3RpbWUgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSAmJgorICAgICAgICBjbHVzdGVyX3RpbWUgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgICAgY2x1c3Rlcl90aW1lID0gZGVtdXgtPmNsdXN0ZXJfdGltZSAqIGRlbXV4LT5jb21tb24udGltZV9zY2FsZTsKKyAgICAgIGNsdXN0ZXJfb2Zmc2V0ID0gZGVtdXgtPmNsdXN0ZXJfb2Zmc2V0OworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJmb3VuZCBjbHVzdGVyIGF0IG9mZnNldCAlIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAiIHdpdGggdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsIGNsdXN0ZXJfb2Zmc2V0LAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGNsdXN0ZXJfdGltZSkpOworICAgICAgaWYgKHRpbWUgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImZvdW5kIGxhc3QgY2x1c3RlciIpOworICAgICAgICBwcmV2X2NsdXN0ZXJfdGltZSA9IGNsdXN0ZXJfdGltZTsKKyAgICAgICAgcHJldl9jbHVzdGVyX29mZnNldCA9IGNsdXN0ZXJfb2Zmc2V0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChjbHVzdGVyX3RpbWUgPiB0aW1lKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAib3ZlcnNob3QgdGFyZ2V0Iik7CisgICAgICAgIC8qIGNsdXN0ZXIgb3ZlcnNob290cyAqLworICAgICAgICBpZiAoY2x1c3Rlcl9vZmZzZXQgPT0gZGVtdXgtPmZpcnN0X2NsdXN0ZXJfb2Zmc2V0KSB7CisgICAgICAgICAgLyogYnV0IG5vIHByZXYgb25lICovCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJidXQgdXNpbmcgZmlyc3QgY2x1c3RlciBhbnl3YXkiKTsKKyAgICAgICAgICBwcmV2X2NsdXN0ZXJfdGltZSA9IGNsdXN0ZXJfdGltZTsKKyAgICAgICAgICBwcmV2X2NsdXN0ZXJfb2Zmc2V0ID0gY2x1c3Rlcl9vZmZzZXQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZXZfY2x1c3Rlcl90aW1lICE9IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICAgICAgICAvKiBwcmV2IGNsdXN0ZXIgZGlkIG5vdCBvdmVyc2hvb3QsIHNvIHByZXYgY2x1c3RlciBpcyB0YXJnZXQgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiByZS1lc3RpbWF0ZSB1c2luZyB0aGlzIG5ldyBwb3NpdGlvbiBpbmZvICovCisgICAgICAgICAgb3BvcyA9IGNsdXN0ZXJfb2Zmc2V0OworICAgICAgICAgIG90aW1lID0gY2x1c3Rlcl90aW1lOworICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGNsdXN0ZXIgdW5kZXJzaG9vdHMgKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJ1bmRlcnNob3QgdGFyZ2V0Iik7CisgICAgICAgIC8qIG9rIGlmIGNsb3NlIGVub3VnaCAqLworICAgICAgICBpZiAoR1NUX0NMT0NLX0RJRkYgKGNsdXN0ZXJfdGltZSwgdGltZSkgPCA1ICogR1NUX1NFQ09ORCkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAidGFyZ2V0IGNsb3NlIGVub3VnaCIpOworICAgICAgICAgIHByZXZfY2x1c3Rlcl90aW1lID0gY2x1c3Rlcl90aW1lOworICAgICAgICAgIHByZXZfY2x1c3Rlcl9vZmZzZXQgPSBjbHVzdGVyX29mZnNldDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAob3RpbWUgPiB0aW1lKSB7CisgICAgICAgICAgLyogd2UgYXJlIGluIGJldHdlZW4gYXRpbWUgYW5kIG90aW1lID0+IGNhbiBiaXNlY3QgaWYgd29ydGh3aGlsZSAqLworICAgICAgICAgIGlmIChwcmV2X2NsdXN0ZXJfdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmCisgICAgICAgICAgICAgIGNsdXN0ZXJfdGltZSA+IHByZXZfY2x1c3Rlcl90aW1lICYmCisgICAgICAgICAgICAgIChHU1RfQ0xPQ0tfRElGRiAocHJldl9jbHVzdGVyX3RpbWUsIGNsdXN0ZXJfdGltZSkgKiAxMCA8CisgICAgICAgICAgICAgICAgICBHU1RfQ0xPQ0tfRElGRiAoY2x1c3Rlcl90aW1lLCB0aW1lKSkpIHsKKyAgICAgICAgICAgIC8qIHdlIG1vdmVkIGF0IGxlYXN0IG9uZSBjbHVzdGVyIGZvcndhcmQsCisgICAgICAgICAgICAgKiBhbmQgaXQgbG9va3MgbGlrZSB0YXJnZXQgaXMgc3RpbGwgZmFyIGF3YXksCisgICAgICAgICAgICAgKiBsZXQncyBlc3RpbWF0ZSBhZ2FpbiAqLworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJiaXNlY3Rpbmcgd2l0aCBuZXcgYXBvcyIpOworICAgICAgICAgICAgYXBvcyA9IGNsdXN0ZXJfb2Zmc2V0OworICAgICAgICAgICAgYXRpbWUgPSBjbHVzdGVyX3RpbWU7CisgICAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBjbHVzdGVyIHVuZGVyc2hvb3RzLCBnb3RvIG5leHQgb25lICovCisgICAgICAgIHByZXZfY2x1c3Rlcl90aW1lID0gY2x1c3Rlcl90aW1lOworICAgICAgICBwcmV2X2NsdXN0ZXJfb2Zmc2V0ID0gY2x1c3Rlcl9vZmZzZXQ7CisgICAgICAgIC8qIHNraXAgY2x1c3RlciBpZiBsZW5ndGggaXMgZGVmaW5lZCwKKyAgICAgICAgICogb3RoZXJ3aXNlIHdpbGwgYmUgc2tpcHBpbmdseSBwYXJzZWQgaW50byAqLworICAgICAgICBpZiAoY2x1c3Rlcl9zaXplKSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJza2lwcGluZyB0byBuZXh0IGNsdXN0ZXIiKTsKKyAgICAgICAgICBkZW11eC0+Y29tbW9uLm9mZnNldCA9IGNsdXN0ZXJfb2Zmc2V0ICsgY2x1c3Rlcl9zaXplOworICAgICAgICAgIGRlbXV4LT5jbHVzdGVyX3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAicGFyc2luZy9za2lwcGluZyBjbHVzdGVyIGVsZW1lbnRzIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgY29udGludWU7CisKKyAgZXJyb3I6CisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19FT1MpIHsKKyAgICAgIGlmIChwcmV2X2NsdXN0ZXJfdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgZ290byBleGl0OworICB9CisKKyAgZW50cnkgPSBnX25ldzAgKEdzdE1hdHJvc2thSW5kZXgsIDEpOworICBlbnRyeS0+dGltZSA9IHByZXZfY2x1c3Rlcl90aW1lOworICBlbnRyeS0+cG9zID0gcHJldl9jbHVzdGVyX29mZnNldCAtIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X3N0YXJ0OworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInNpbXVsYXRlZCBpbmRleCBlbnRyeTsgdGltZSAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIsIHBvcyAlIiBHX0dVSU5UNjRfRk9STUFULCBHU1RfVElNRV9BUkdTIChlbnRyeS0+dGltZSksIGVudHJ5LT5wb3MpOworCitleGl0OgorCisgIC8qIHJlc3RvcmUgc29tZSBzdGF0ZSAqLworICBkZW11eC0+Y2x1c3Rlcl9vZmZzZXQgPSBjdXJyZW50X2NsdXN0ZXJfb2Zmc2V0OworICBkZW11eC0+Y2x1c3Rlcl90aW1lID0gY3VycmVudF9jbHVzdGVyX3RpbWU7CisgIGRlbXV4LT5jb21tb24ub2Zmc2V0ID0gY3VycmVudF9vZmZzZXQ7CisgIGRlbXV4LT5jb21tb24uc3RhdGUgPSBjdXJyZW50X3N0YXRlOworCisgIHJldHVybiBlbnRyeTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NlZWtfZXZlbnQgKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCwKKyAgICBHc3RQYWQgKiBwYWQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdE1hdHJvc2thSW5kZXggKmVudHJ5ID0gTlVMTDsKKyAgR3N0TWF0cm9za2FJbmRleCBzY2FuX2VudHJ5OworICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgIEdzdFNlZWtUeXBlIGN1cl90eXBlLCBzdG9wX3R5cGU7CisgIEdzdEZvcm1hdCBmb3JtYXQ7CisgIGdib29sZWFuIGZsdXNoLCBrZXl1bml0LCBiZWZvcmUsIGFmdGVyLCBzbmFwX25leHQ7CisgIGdkb3VibGUgcmF0ZTsKKyAgZ2ludDY0IGN1ciwgc3RvcDsKKyAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKnRyYWNrID0gTlVMTDsKKyAgR3N0U2VnbWVudCBzZWVrc2VnbWVudCA9IHsgMCwgfTsKKyAgZ2Jvb2xlYW4gdXBkYXRlID0gVFJVRTsKKyAgZ2Jvb2xlYW4gcGFkX2xvY2tlZCA9IEZBTFNFOworICBndWludDMyIHNlcW51bTsKKyAgR3N0U2VhcmNoTW9kZSBzbmFwX2RpcjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZXZlbnQgIT0gTlVMTCwgRkFMU0UpOworCisgIGlmIChwYWQpCisgICAgdHJhY2sgPSBnc3RfcGFkX2dldF9lbGVtZW50X3ByaXZhdGUgKHBhZCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJIYXZlIHNlZWsgJSIgR1NUX1BUUl9GT1JNQVQsIGV2ZW50KTsKKworICBnc3RfZXZlbnRfcGFyc2Vfc2VlayAoZXZlbnQsICZyYXRlLCAmZm9ybWF0LCAmZmxhZ3MsICZjdXJfdHlwZSwgJmN1ciwKKyAgICAgICZzdG9wX3R5cGUsICZzdG9wKTsKKyAgc2VxbnVtID0gZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KTsKKworICAvKiB3ZSBjYW4gb25seSBzZWVrIG9uIHRpbWUgKi8KKyAgaWYgKGZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkNhbiBvbmx5IHNlZWsgb24gVElNRSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIGNvcHkgc2VnbWVudCwgd2UgbmVlZCB0aGlzIGJlY2F1c2Ugd2Ugc3RpbGwgbmVlZCB0aGUgb2xkCisgICAqIHNlZ21lbnQgd2hlbiB3ZSBjbG9zZSB0aGUgY3VycmVudCBzZWdtZW50LiAqLworICBtZW1jcHkgKCZzZWVrc2VnbWVudCwgJmRlbXV4LT5jb21tb24uc2VnbWVudCwgc2l6ZW9mIChHc3RTZWdtZW50KSk7CisKKyAgLyogcHVsbCBtb2RlIHdpdGhvdXQgaW5kZXggbWVhbnMgdGhhdCB0aGUgYWN0dWFsIGR1cmF0aW9uIGlzIG5vdCBrbm93biwKKyAgICogd2UgbWlnaHQgYmUgcGxheWluZyBhIGZpbGUgdGhhdCdzIHN0aWxsIGJlaW5nIHJlY29yZGVkCisgICAqIHNvLCBpbnZhbGlkYXRlIG91ciBjdXJyZW50IGR1cmF0aW9uLCB3aGljaCBpcyBvbmx5IGEgbW92aW5nIHRhcmdldCwKKyAgICogYW5kIHNob3VsZCBub3QgYmUgdXNlZCB0byBjbGFtcCBhbnl0aGluZyAqLworICBpZiAoIWRlbXV4LT5zdHJlYW1pbmcgJiYgIWRlbXV4LT5jb21tb24uaW5kZXggJiYgZGVtdXgtPmludmFsaWRfZHVyYXRpb24pIHsKKyAgICBzZWVrc2VnbWVudC5kdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImNvbmZpZ3VyaW5nIHNlZWsiKTsKKyAgLyogU3VidHJhY3Qgc3RyZWFtX3N0YXJ0X3RpbWUgc28gd2UgYWx3YXlzIHNlZWsgb24gYSBzZWdtZW50CisgICAqIGluIHN0cmVhbSB0aW1lICovCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lKSkgeworICAgIHNlZWtzZWdtZW50LnN0YXJ0IC09IGRlbXV4LT5zdHJlYW1fc3RhcnRfdGltZTsKKyAgICBzZWVrc2VnbWVudC5wb3NpdGlvbiAtPSBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWU7CisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzZWVrc2VnbWVudC5zdG9wKSkKKyAgICAgIHNlZWtzZWdtZW50LnN0b3AgLT0gZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lOworICAgIGVsc2UKKyAgICAgIHNlZWtzZWdtZW50LnN0b3AgPSBzZWVrc2VnbWVudC5kdXJhdGlvbjsKKyAgfQorCisgIGdzdF9zZWdtZW50X2RvX3NlZWsgKCZzZWVrc2VnbWVudCwgcmF0ZSwgZm9ybWF0LCBmbGFncywKKyAgICAgIGN1cl90eXBlLCBjdXIsIHN0b3BfdHlwZSwgc3RvcCwgJnVwZGF0ZSk7CisKKyAgLyogUmVzdG9yZSB0aGUgY2xpcCB0aW1lc3RhbXAgb2Zmc2V0ICovCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lKSkgeworICAgIHNlZWtzZWdtZW50LnBvc2l0aW9uICs9IGRlbXV4LT5zdHJlYW1fc3RhcnRfdGltZTsKKyAgICBzZWVrc2VnbWVudC5zdGFydCArPSBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWU7CisgICAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc2Vla3NlZ21lbnQuc3RvcCkpCisgICAgICBzZWVrc2VnbWVudC5zdG9wID0gc2Vla3NlZ21lbnQuZHVyYXRpb247CisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzZWVrc2VnbWVudC5zdG9wKSkKKyAgICAgIHNlZWtzZWdtZW50LnN0b3AgKz0gZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lOworICB9CisKKyAgLyogcmVzdG9yZSBzZWdtZW50IGR1cmF0aW9uIChpZiBhbnkgZWZmZWN0KSwKKyAgICogd291bGQgYmUgZGV0ZXJtaW5lZCBhZ2FpbiB3aGVuIHBhcnNpbmcsIGJ1dCBhbnl3YXkgLi4uICovCisgIHNlZWtzZWdtZW50LmR1cmF0aW9uID0gZGVtdXgtPmNvbW1vbi5zZWdtZW50LmR1cmF0aW9uOworCisgIGZsdXNoID0gISAhKGZsYWdzICYgR1NUX1NFRUtfRkxBR19GTFVTSCk7CisgIGtleXVuaXQgPSAhICEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0tFWV9VTklUKTsKKyAgYWZ0ZXIgPSAhICEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NOQVBfQUZURVIpOworICBiZWZvcmUgPSAhICEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NOQVBfQkVGT1JFKTsKKworICAvKiBhbHdheXMgZG8gZnVsbCB1cGRhdGUgaWYgZmx1c2hpbmcsCisgICAqIG90aGVyd2lzZSBwcm9ibGVtcyBtaWdodCBhcmlzZSBkb3duc3RyZWFtIHdpdGggbWlzc2luZyBrZXlmcmFtZXMgZXRjICovCisgIHVwZGF0ZSA9IHVwZGF0ZSB8fCBmbHVzaDsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIk5ldyBzZWdtZW50ICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwgJnNlZWtzZWdtZW50KTsKKworICAvKiBjaGVjayBzYW5pdHkgYmVmb3JlIHdlIHN0YXJ0IGZsdXNoaW5nIGFuZCBhbGwgdGhhdCAqLworICBzbmFwX25leHQgPSBhZnRlciAmJiAhYmVmb3JlOworICBpZiAoc2Vla3NlZ21lbnQucmF0ZSA8IDApCisgICAgc25hcF9kaXIgPSBzbmFwX25leHQgPyBHU1RfU0VBUkNIX01PREVfQkVGT1JFIDogR1NUX1NFQVJDSF9NT0RFX0FGVEVSOworICBlbHNlCisgICAgc25hcF9kaXIgPSBzbmFwX25leHQgPyBHU1RfU0VBUkNIX01PREVfQUZURVIgOiBHU1RfU0VBUkNIX01PREVfQkVGT1JFOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICB0cmFjayA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9nZXRfc2Vla190cmFjayAoJmRlbXV4LT5jb21tb24sIHRyYWNrKTsKKyAgaWYgKChlbnRyeSA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9kb19pbmRleF9zZWVrICgmZGVtdXgtPmNvbW1vbiwgdHJhY2ssCisgICAgICAgICAgICAgIHNlZWtzZWdtZW50LnBvc2l0aW9uLCAmZGVtdXgtPnNlZWtfaW5kZXgsICZkZW11eC0+c2Vla19lbnRyeSwKKyAgICAgICAgICAgICAgc25hcF9kaXIpKSA9PSBOVUxMKSB7CisgICAgLyogcHVsbCBtb2RlIHdpdGhvdXQgaW5kZXggY2FuIHNjYW4gbGF0ZXIgb24gKi8KKyAgICBpZiAoZGVtdXgtPnN0cmVhbWluZykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJObyBtYXRjaGluZyBzZWVrIGVudHJ5IGluIGluZGV4Iik7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0gZWxzZSBpZiAocmF0ZSA8IDAuMCkgeworICAgICAgLyogRklYTUU6IFdlIHNob3VsZCBidWlsZCBhbiBpbmRleCBkdXJpbmcgcGxheWJhY2sgb3Igd2hlbiBzY2FubmluZworICAgICAgICogdGhhdCBjYW4gYmUgdXNlZCBoZXJlLiBUaGUgcmV2ZXJzZSBwbGF5YmFjayBjb2RlIHJlcXVpcmVzIHNlZWtfaW5kZXgKKyAgICAgICAqIGFuZCBzZWVrX2VudHJ5IHRvIGJlIHNldCEKKyAgICAgICAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgIk5vIG1hdGNoaW5nIHNlZWsgZW50cnkgaW4gaW5kZXgsIG5lZWRlZCBmb3IgcmV2ZXJzZSBwbGF5YmFjayIpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJTZWVrIHBvc2l0aW9uIGxvb2tzIHNhbmUiKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKworICBpZiAoIXVwZGF0ZSkgeworICAgIC8qIG9ubHkgaGF2ZSB0byB1cGRhdGUgc29tZSBzZWdtZW50LAorICAgICAqIGJ1dCBhbHNvIHN0aWxsIGhhdmUgdG8gaG9ub3VyIGZsdXNoIGFuZCBzbyBvbiAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiLi4uIG5vIHVwZGF0ZSIpOworICAgIC8qIGJhZCBnb3RvLCBiYWQgLi4uICovCisgICAgZ290byBuZXh0OworICB9CisKKyAgaWYgKGRlbXV4LT5zdHJlYW1pbmcpCisgICAgZ290byBmaW5pc2g7CisKK25leHQ6CisgIGlmIChmbHVzaCkgeworICAgIEdzdEV2ZW50ICpmbHVzaF9ldmVudCA9IGdzdF9ldmVudF9uZXdfZmx1c2hfc3RhcnQgKCk7CisgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGZsdXNoX2V2ZW50LCBzZXFudW0pOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiU3RhcnRpbmcgZmx1c2giKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKGRlbXV4LT5jb21tb24uc2lua3BhZCwgZ3N0X2V2ZW50X3JlZiAoZmx1c2hfZXZlbnQpKTsKKyAgICBnc3RfbWF0cm9za2FfZGVtdXhfc2VuZF9ldmVudCAoZGVtdXgsIGZsdXNoX2V2ZW50KTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIk5vbi1mbHVzaGluZyBzZWVrLCBwYXVzaW5nIHRhc2siKTsKKyAgICBnc3RfcGFkX3BhdXNlX3Rhc2sgKGRlbXV4LT5jb21tb24uc2lua3BhZCk7CisgIH0KKyAgLyogb3VjaCAqLworICBpZiAoIXVwZGF0ZSkgeworICAgIEdTVF9QQURfU1RSRUFNX0xPQ0sgKGRlbXV4LT5jb21tb24uc2lua3BhZCk7CisgICAgcGFkX2xvY2tlZCA9IFRSVUU7CisgICAgZ290byBleGl0OworICB9CisKKyAgLyogbm93IGdyYWIgdGhlIHN0cmVhbSBsb2NrIHNvIHRoYXQgc3RyZWFtaW5nIGNhbm5vdCBjb250aW51ZSwgZm9yCisgICAqIG5vbiBmbHVzaGluZyBzZWVrcyB3aGVuIHRoZSBlbGVtZW50IGlzIGluIFBBVVNFRCB0aGlzIGNvdWxkIGJsb2NrCisgICAqIGZvcmV2ZXIuICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiV2FpdGluZyBmb3Igc3RyZWFtaW5nIHRvIHN0b3AiKTsKKyAgR1NUX1BBRF9TVFJFQU1fTE9DSyAoZGVtdXgtPmNvbW1vbi5zaW5rcGFkKTsKKyAgcGFkX2xvY2tlZCA9IFRSVUU7CisKKyAgLyogcHVsbCBtb2RlIHdpdGhvdXQgaW5kZXggY2FuIGRvIHNvbWUgc2Nhbm5pbmcgKi8KKyAgaWYgKCFkZW11eC0+c3RyZWFtaW5nICYmICFlbnRyeSkgeworICAgIEdzdEV2ZW50ICpmbHVzaF9ldmVudDsKKworICAgIC8qIG5lZWQgdG8gc3RvcCBmbHVzaGluZyB1cHN0cmVhbSBhcyB3ZSBuZWVkIGl0IG5leHQgKi8KKyAgICBpZiAoZmx1c2gpIHsKKyAgICAgIGZsdXNoX2V2ZW50ID0gZ3N0X2V2ZW50X25ld19mbHVzaF9zdG9wIChUUlVFKTsKKyAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChmbHVzaF9ldmVudCwgc2VxbnVtKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoZGVtdXgtPmNvbW1vbi5zaW5rcGFkLCBmbHVzaF9ldmVudCk7CisgICAgfQorICAgIGVudHJ5ID0gZ3N0X21hdHJvc2thX2RlbXV4X3NlYXJjaF9wb3MgKGRlbXV4LCBzZWVrc2VnbWVudC5wb3NpdGlvbik7CisgICAgLyoga2VlcCBsb2NhbCBjb3B5ICovCisgICAgaWYgKGVudHJ5KSB7CisgICAgICBzY2FuX2VudHJ5ID0gKmVudHJ5OworICAgICAgZ19mcmVlIChlbnRyeSk7CisgICAgICBlbnRyeSA9ICZzY2FuX2VudHJ5OworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlNjYW4gZmFpbGVkIHRvIGZpbmQgbWF0Y2hpbmcgcG9zaXRpb24iKTsKKyAgICAgIGlmIChmbHVzaCkgeworICAgICAgICBmbHVzaF9ldmVudCA9IGdzdF9ldmVudF9uZXdfZmx1c2hfc3RvcCAoVFJVRSk7CisgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChmbHVzaF9ldmVudCwgc2VxbnVtKTsKKyAgICAgICAgZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfZXZlbnQgKGRlbXV4LCBmbHVzaF9ldmVudCk7CisgICAgICB9CisgICAgICBnb3RvIHNlZWtfZXJyb3I7CisgICAgfQorICB9CisKK2ZpbmlzaDoKKyAgaWYgKGtleXVuaXQgJiYgc2Vla3NlZ21lbnQucmF0ZSA+IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInNlZWsgdG8ga2V5IHVuaXQsIGFkanVzdGluZyBzZWdtZW50IHN0YXJ0IGZyb20gJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFUICIgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChzZWVrc2VnbWVudC5zdGFydCksIEdTVF9USU1FX0FSR1MgKGVudHJ5LT50aW1lKSk7CisgICAgc2Vla3NlZ21lbnQuc3RhcnQgPSBNQVggKGVudHJ5LT50aW1lLCBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWUpOworICAgIHNlZWtzZWdtZW50LnBvc2l0aW9uID0gc2Vla3NlZ21lbnQuc3RhcnQ7CisgICAgc2Vla3NlZ21lbnQudGltZSA9IHNlZWtzZWdtZW50LnN0YXJ0IC0gZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lOworICB9IGVsc2UgaWYgKGtleXVuaXQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInNlZWsgdG8ga2V5IHVuaXQsIGFkanVzdGluZyBzZWdtZW50IHN0b3AgZnJvbSAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHNlZWtzZWdtZW50LnN0b3ApLCBHU1RfVElNRV9BUkdTIChlbnRyeS0+dGltZSkpOworICAgIHNlZWtzZWdtZW50LnN0b3AgPSBNQVggKGVudHJ5LT50aW1lLCBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWUpOworICAgIHNlZWtzZWdtZW50LnBvc2l0aW9uID0gc2Vla3NlZ21lbnQuc3RvcDsKKyAgfQorCisgIGlmIChkZW11eC0+c3RyZWFtaW5nKSB7CisgICAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgICAgLyogdHJhY2sgcmVhbCBwb3NpdGlvbiB3ZSBzaG91bGQgc3RhcnQgYXQgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInN0b3Jpbmcgc2VnbWVudCBzdGFydCIpOworICAgIGRlbXV4LT5yZXF1ZXN0ZWRfc2Vla190aW1lID0gc2Vla3NlZ21lbnQucG9zaXRpb247CisgICAgZGVtdXgtPnNlZWtfb2Zmc2V0ID0gZW50cnktPnBvcyArIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X3N0YXJ0OworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgLyogbmVlZCB0byBzZWVrIHRvIGNsdXN0ZXIgc3RhcnQgdG8gcGljayB1cCBjbHVzdGVyIHRpbWUgKi8KKyAgICAvKiB1cHN0cmVhbSB0YWtlcyBjYXJlIG9mIGZsdXNoaW5nIGFuZCBhbGwgdGhhdAorICAgICAqIC4uLiBhbmQgbmV3c2VnbWVudCBldmVudCBoYW5kbGluZyB0YWtlcyBjYXJlIG9mIHRoZSByZXN0ICovCisgICAgcmV0dXJuIHBlcmZvcm1fc2Vla190b19vZmZzZXQgKGRlbXV4LCByYXRlLAorICAgICAgICBlbnRyeS0+cG9zICsgZGVtdXgtPmNvbW1vbi5lYm1sX3NlZ21lbnRfc3RhcnQsIHNlcW51bSwgZmxhZ3MpOworICB9CisKK2V4aXQ6CisgIGlmIChmbHVzaCkgeworICAgIEdzdEV2ZW50ICpmbHVzaF9ldmVudCA9IGdzdF9ldmVudF9uZXdfZmx1c2hfc3RvcCAoVFJVRSk7CisgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGZsdXNoX2V2ZW50LCBzZXFudW0pOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiU3RvcHBpbmcgZmx1c2giKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKGRlbXV4LT5jb21tb24uc2lua3BhZCwgZ3N0X2V2ZW50X3JlZiAoZmx1c2hfZXZlbnQpKTsKKyAgICBnc3RfbWF0cm9za2FfZGVtdXhfc2VuZF9ldmVudCAoZGVtdXgsIGZsdXNoX2V2ZW50KTsKKyAgfQorCisgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAvKiBub3cgdXBkYXRlIHRoZSByZWFsIHNlZ21lbnQgaW5mbyAqLworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkNvbW1pdHRpbmcgbmV3IHNlZWsgc2VnbWVudCIpOworICBtZW1jcHkgKCZkZW11eC0+Y29tbW9uLnNlZ21lbnQsICZzZWVrc2VnbWVudCwgc2l6ZW9mIChHc3RTZWdtZW50KSk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisKKyAgLyogdXBkYXRlIHNvbWUgKHNlZ21lbnQpIHN0YXRlICovCisgIGlmICghZ3N0X21hdHJvc2thX2RlbXV4X21vdmVfdG9fZW50cnkgKGRlbXV4LCBlbnRyeSwgVFJVRSwgdXBkYXRlKSkKKyAgICBnb3RvIHNlZWtfZXJyb3I7CisKKyAgLyogbm90aWZ5IHN0YXJ0IG9mIG5ldyBzZWdtZW50ICovCisgIGlmIChkZW11eC0+Y29tbW9uLnNlZ21lbnQuZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NFR01FTlQpIHsKKyAgICBHc3RNZXNzYWdlICptc2c7CisKKyAgICBtc2cgPSBnc3RfbWVzc2FnZV9uZXdfc2VnbWVudF9zdGFydCAoR1NUX09CSkVDVCAoZGVtdXgpLAorICAgICAgICBHU1RfRk9STUFUX1RJTUUsIGRlbXV4LT5jb21tb24uc2VnbWVudC5zdGFydCk7CisgICAgZ3N0X21lc3NhZ2Vfc2V0X3NlcW51bSAobXNnLCBzZXFudW0pOworICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKGRlbXV4KSwgbXNnKTsKKyAgfQorCisgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICBpZiAoZGVtdXgtPm5ld19zZWdtZW50KQorICAgIGdzdF9ldmVudF91bnJlZiAoZGVtdXgtPm5ld19zZWdtZW50KTsKKworICAvKiBPbiBwb3J0IGZyb20gMC4xMCwgZGlzY2FyZGVkICF1cGRhdGUgKGZvciBzZWdtZW50LnVwZGF0ZSkgaGVyZSwgRklYTUU/ICovCisgIGRlbXV4LT5uZXdfc2VnbWVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmRlbXV4LT5jb21tb24uc2VnbWVudCk7CisgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChkZW11eC0+bmV3X3NlZ21lbnQsIHNlcW51bSk7CisgIGlmIChkZW11eC0+Y29tbW9uLnNlZ21lbnQucmF0ZSA8IDAgJiYgZGVtdXgtPmNvbW1vbi5zZWdtZW50LnN0b3AgPT0gLTEpCisgICAgZGVtdXgtPnRvX3RpbWUgPSBkZW11eC0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb247CisgIGVsc2UKKyAgICBkZW11eC0+dG9fdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGRlbXV4LT5zZWdtZW50X3NlcW51bSA9IHNlcW51bTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKworICAvKiByZXN0YXJ0IG91ciB0YXNrIHNpbmNlIGl0IG1pZ2h0IGhhdmUgYmVlbiBzdG9wcGVkIHdoZW4gd2UgZGlkIHRoZQorICAgKiBmbHVzaC4gKi8KKyAgZ3N0X3BhZF9zdGFydF90YXNrIChkZW11eC0+Y29tbW9uLnNpbmtwYWQsCisgICAgICAoR3N0VGFza0Z1bmN0aW9uKSBnc3RfbWF0cm9za2FfZGVtdXhfbG9vcCwgZGVtdXgtPmNvbW1vbi5zaW5rcGFkLCBOVUxMKTsKKworICAvKiBzdHJlYW1pbmcgY2FuIGNvbnRpbnVlIG5vdyAqLworICBpZiAocGFkX2xvY2tlZCkgeworICAgIEdTVF9QQURfU1RSRUFNX1VOTE9DSyAoZGVtdXgtPmNvbW1vbi5zaW5rcGFkKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworCitzZWVrX2Vycm9yOgorICB7CisgICAgaWYgKHBhZF9sb2NrZWQpIHsKKyAgICAgIEdTVF9QQURfU1RSRUFNX1VOTE9DSyAoZGVtdXgtPmNvbW1vbi5zaW5rcGFkKTsKKyAgICB9CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlbXV4LCBTVFJFQU0sIERFTVVYLCAoTlVMTCksICgiR290IGEgc2VlayBlcnJvciIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyoKKyAqIEhhbmRsZSB3aGV0aGVyIHdlIGNhbiBwZXJmb3JtIHRoZSBzZWVrIGV2ZW50IG9yIGlmIHdlIGhhdmUgdG8gbGV0IHRoZSBjaGFpbgorICogZnVuY3Rpb24gaGFuZGxlIHNlZWtzIHRvIGJ1aWxkIHRoZSBzZWVrIGluZGV4ZXMgZmlyc3QuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX3B1c2ggKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCwgR3N0UGFkICogcGFkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFNlZWtGbGFncyBmbGFnczsKKyAgR3N0U2Vla1R5cGUgY3VyX3R5cGUsIHN0b3BfdHlwZTsKKyAgR3N0Rm9ybWF0IGZvcm1hdDsKKyAgZ2RvdWJsZSByYXRlOworICBnaW50NjQgY3VyLCBzdG9wOworCisgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgJnJhdGUsICZmb3JtYXQsICZmbGFncywgJmN1cl90eXBlLCAmY3VyLAorICAgICAgJnN0b3BfdHlwZSwgJnN0b3ApOworCisgIC8qIHNhbml0eSBjaGVja3MgKi8KKworICAvKiB3ZSBjYW4gb25seSBzZWVrIG9uIHRpbWUgKi8KKyAgaWYgKGZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkNhbiBvbmx5IHNlZWsgb24gVElNRSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmIChzdG9wX3R5cGUgIT0gR1NUX1NFRUtfVFlQRV9OT05FICYmIHN0b3AgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiU2VlayBlbmQtdGltZSBub3Qgc3VwcG9ydGVkIGluIHN0cmVhbWluZyBtb2RlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKCEoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0ZMVVNIKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAiTm9uLWZsdXNoaW5nIHNlZWsgbm90IHN1cHBvcnRlZCBpbiBzdHJlYW1pbmcgbW9kZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmIChmbGFncyAmIEdTVF9TRUVLX0ZMQUdfU0VHTUVOVCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiU2VnbWVudCBzZWVrIG5vdCBzdXBwb3J0ZWQgaW4gc3RyZWFtaW5nIG1vZGUiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBjaGVjayBmb3IgaGF2aW5nIHBhcnNlZCBpbmRleCBhbHJlYWR5ICovCisgIGlmICghZGVtdXgtPmNvbW1vbi5pbmRleF9wYXJzZWQpIHsKKyAgICBnYm9vbGVhbiBidWlsZGluZ19pbmRleDsKKyAgICBndWludDY0IG9mZnNldCA9IDA7CisKKyAgICBpZiAoIWRlbXV4LT5pbmRleF9vZmZzZXQpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAibm8gaW5kZXggKGxvY2F0aW9uKTsgbm8gc2VlayBpbiBwdXNoIG1vZGUiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgICAvKiBoYW5kbGUgdGhlIHNlZWsgZXZlbnQgaW4gdGhlIGNoYWluIGZ1bmN0aW9uICovCisgICAgZGVtdXgtPmNvbW1vbi5zdGF0ZSA9IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX1NFRUs7CisgICAgLyogbm8gbW9yZSBzZWVrIGNhbiBiZSBpc3N1ZWQgdW50aWwgc3RhdGUgcmVzZXQgdG8gX0RBVEEgKi8KKworICAgIC8qIGNvcHkgdGhlIGV2ZW50ICovCisgICAgaWYgKGRlbXV4LT5zZWVrX2V2ZW50KQorICAgICAgZ3N0X2V2ZW50X3VucmVmIChkZW11eC0+c2Vla19ldmVudCk7CisgICAgZGVtdXgtPnNlZWtfZXZlbnQgPSBnc3RfZXZlbnRfcmVmIChldmVudCk7CisKKyAgICAvKiBzZXQgdGhlIGJ1aWxkaW5nX2luZGV4IGZsYWcgc28gdGhhdCBvbmx5IG9uZSB0aHJlYWQgY2FuIHNldHVwIHRoZQorICAgICAqIHN0cnVjdHVyZXMgZm9yIGluZGV4IHNlZWtpbmcuICovCisgICAgYnVpbGRpbmdfaW5kZXggPSBkZW11eC0+YnVpbGRpbmdfaW5kZXg7CisgICAgaWYgKCFidWlsZGluZ19pbmRleCkgeworICAgICAgZGVtdXgtPmJ1aWxkaW5nX2luZGV4ID0gVFJVRTsKKyAgICAgIG9mZnNldCA9IGRlbXV4LT5pbmRleF9vZmZzZXQ7CisgICAgfQorICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisKKyAgICBpZiAoIWJ1aWxkaW5nX2luZGV4KSB7CisgICAgICAvKiBzZWVrIHRvIHRoZSBmaXJzdCBzdWJpbmRleCBvciBsZWdhY3kgaW5kZXggKi8KKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoZGVtdXgsICJTZWVraW5nIHRvIEN1ZXMgYXQgJSIgR19HVUlOVDY0X0ZPUk1BVCwgb2Zmc2V0KTsKKyAgICAgIHJldHVybiBwZXJmb3JtX3NlZWtfdG9fb2Zmc2V0IChkZW11eCwgcmF0ZSwgb2Zmc2V0LAorICAgICAgICAgIGdzdF9ldmVudF9nZXRfc2VxbnVtIChldmVudCksIEdTVF9TRUVLX0ZMQUdfTk9ORSk7CisgICAgfQorCisgICAgLyogd2VsbCwgd2UgYXJlIGhhbmRsaW5nIGl0IGFscmVhZHkgKi8KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIC8qIGRlbGVnYXRlIHRvIHR3ZWFrZWQgcmVndWxhciBzZWVrICovCisgIHJldHVybiBnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NlZWtfZXZlbnQgKGRlbXV4LCBwYWQsIGV2ZW50KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0TWF0cm9za2FEZW11eCAqZGVtdXggPSBHU1RfTUFUUk9TS0FfREVNVVggKHBhcmVudCk7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICAgIC8qIG5vIHNlZWtpbmcgdW50aWwgd2UgYXJlIChzYWZlbHkpIHJlYWR5ICovCisgICAgICBpZiAoZGVtdXgtPmNvbW1vbi5zdGF0ZSAhPSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9EQVRBKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAibm90IHJlYWR5IGZvciBzZWVraW5nIHlldCIpOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorCisgICAgICB7CisgICAgICAgIGd1aW50MzIgc2VxbnVtID0gZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KTsKKyAgICAgICAgaWYgKHNlcW51bSA9PSBkZW11eC0+c2VnbWVudF9zZXFudW0pIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocGFkLAorICAgICAgICAgICAgICAiRHJvcCBkdXBsaWNhdGVkIFNFRUsgZXZlbnQgc2VxbnVtICUiIEdfR1VJTlQzMl9GT1JNQVQsIHNlcW51bSk7CisgICAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKCFkZW11eC0+c3RyZWFtaW5nKQorICAgICAgICByZXMgPSBnc3RfbWF0cm9za2FfZGVtdXhfaGFuZGxlX3NlZWtfZXZlbnQgKGRlbXV4LCBwYWQsIGV2ZW50KTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmVzID0gZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX3B1c2ggKGRlbXV4LCBwYWQsIGV2ZW50KTsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdTVF9FVkVOVF9RT1M6CisgICAgeworICAgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKmNvbnRleHQgPSBnc3RfcGFkX2dldF9lbGVtZW50X3ByaXZhdGUgKHBhZCk7CisgICAgICBpZiAoY29udGV4dC0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9WSURFTykgeworICAgICAgICBHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICp2aWRlb2NvbnRleHQgPQorICAgICAgICAgICAgKEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQgKikgY29udGV4dDsKKyAgICAgICAgZ2RvdWJsZSBwcm9wb3J0aW9uOworICAgICAgICBHc3RDbG9ja1RpbWVEaWZmIGRpZmY7CisgICAgICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisKKyAgICAgICAgZ3N0X2V2ZW50X3BhcnNlX3FvcyAoZXZlbnQsIE5VTEwsICZwcm9wb3J0aW9uLCAmZGlmZiwgJnRpbWVzdGFtcCk7CisKKyAgICAgICAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgICAgICAgIHZpZGVvY29udGV4dC0+ZWFybGllc3RfdGltZSA9IHRpbWVzdGFtcCArIGRpZmY7CisgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICB9CisgICAgICByZXMgPSBUUlVFOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdTVF9FVkVOVF9UT0NfU0VMRUNUOgorICAgIHsKKyAgICAgIGNoYXIgKnVpZCA9IE5VTEw7CisgICAgICBHc3RUb2NFbnRyeSAqZW50cnkgPSBOVUxMOworICAgICAgR3N0RXZlbnQgKnNlZWtfZXZlbnQ7CisgICAgICBnaW50NjQgc3RhcnRfcG9zOworCisgICAgICBpZiAoIWRlbXV4LT5jb21tb24udG9jKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAibm8gVE9DIHRvIHNlbGVjdCIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICBnc3RfZXZlbnRfcGFyc2VfdG9jX3NlbGVjdCAoZXZlbnQsICZ1aWQpOworICAgICAgICBpZiAodWlkICE9IE5VTEwpIHsKKyAgICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgICAgICAgICBlbnRyeSA9IGdzdF90b2NfZmluZF9lbnRyeSAoZGVtdXgtPmNvbW1vbi50b2MsIHVpZCk7CisgICAgICAgICAgaWYgKGVudHJ5ID09IE5VTEwpIHsKKyAgICAgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAibm8gVE9DIGVudHJ5IHdpdGggZ2l2ZW4gVUlEOiAlcyIsIHVpZCk7CisgICAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ3N0X3RvY19lbnRyeV9nZXRfc3RhcnRfc3RvcF90aW1lcyAoZW50cnksICZzdGFydF9wb3MsIE5VTEwpOworICAgICAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgICAgICAgICAgIHNlZWtfZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZWsgKDEuMCwKKyAgICAgICAgICAgICAgICBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICAgICAgR1NUX1NFRUtfRkxBR19GTFVTSCwKKyAgICAgICAgICAgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgc3RhcnRfcG9zLCBHU1RfU0VFS19UWVBFX1NFVCwgLTEpOworICAgICAgICAgICAgcmVzID0gZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50IChkZW11eCwgcGFkLCBzZWVrX2V2ZW50KTsKKyAgICAgICAgICAgIGdzdF9ldmVudF91bnJlZiAoc2Vla19ldmVudCk7CisgICAgICAgICAgfQorICAgICAgICAgIGdfZnJlZSAodWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAicmVjZWl2ZWQgZW1wdHkgVE9DIHNlbGVjdCBldmVudCIpOworICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICB9CisgICAgICB9CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgICAgLyogZXZlbnRzIHdlIGRvbid0IG5lZWQgdG8gaGFuZGxlICovCisgICAgY2FzZSBHU1RfRVZFTlRfTkFWSUdBVElPTjoKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgcmVzID0gRkFMU0U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR1NUX0VWRU5UX0xBVEVOQ1k6CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAoZGVtdXgtPmNvbW1vbi5zaW5rcGFkLCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfZGVtdXhfc2Vla190b19wcmV2aW91c19rZXlmcmFtZSAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4KQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgZ2Jvb2xlYW4gZG9uZSA9IFRSVUU7CisgIGdpbnQgaTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZGVtdXgtPnNlZWtfaW5kZXgsIEdTVF9GTE9XX0VPUyk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChkZW11eC0+c2Vla19lbnRyeSA8IGRlbXV4LT5zZWVrX2luZGV4LT5sZW4sCisgICAgICBHU1RfRkxPV19FT1MpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAibG9jYXRpbmcgcHJldmlvdXMga2V5ZnJhbWUiKTsKKworICBpZiAoIWRlbXV4LT5zZWVrX2VudHJ5KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJubyBlYXJsaWVyIGluZGV4IGVudHJ5Iik7CisgICAgZ290byBleGl0OworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGRlbXV4LT5jb21tb24uc3JjLT5sZW47IGkrKykgeworICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpzdHJlYW0gPSBnX3B0cl9hcnJheV9pbmRleCAoZGVtdXgtPmNvbW1vbi5zcmMsIGkpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzZWdtZW50IHN0YXJ0ICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAiLCBzdHJlYW0gJWQgYXQgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+Y29tbW9uLnNlZ21lbnQuc3RhcnQpLCBzdHJlYW0tPmluZGV4LAorICAgICAgICBHU1RfVElNRV9BUkdTIChzdHJlYW0tPmZyb21fdGltZSkpOworICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtLT5mcm9tX3RpbWUpKSB7CisgICAgICBpZiAoc3RyZWFtLT5mcm9tX3RpbWUgPiBkZW11eC0+Y29tbW9uLnNlZ21lbnQuc3RhcnQpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzdHJlYW0gJWQgbm90IGZpbmlzaGVkIHlldCIsIHN0cmVhbS0+aW5kZXgpOworICAgICAgICBkb25lID0gRkFMU0U7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIG5vdGhpbmcgcHVzaGVkIGZvciB0aGlzIHN0cmVhbTsKKyAgICAgICAqIGxpa2VseSBzZWVrIGVudHJ5IGRpZCBub3Qgc3RhcnQgYXQga2V5ZnJhbWUsIHNvIGFsbCB3YXMgc2tpcHBlZC4KKyAgICAgICAqIFNvIHdlIG5lZWQgYW4gZWFybGllciBlbnRyeSAqLworICAgICAgZG9uZSA9IEZBTFNFOworICAgIH0KKyAgfQorCisgIGlmICghZG9uZSkgeworICAgIEdzdE1hdHJvc2thSW5kZXggKmVudHJ5OworCisgICAgZW50cnkgPSAmZ19hcnJheV9pbmRleCAoZGVtdXgtPnNlZWtfaW5kZXgsIEdzdE1hdHJvc2thSW5kZXgsCisgICAgICAgIC0tZGVtdXgtPnNlZWtfZW50cnkpOworICAgIGlmICghZ3N0X21hdHJvc2thX2RlbXV4X21vdmVfdG9fZW50cnkgKGRlbXV4LCBlbnRyeSwgRkFMU0UsIFRSVUUpKQorICAgICAgZ290byBleGl0OworCisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgIH0KKworZXhpdDoKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV90cmFja3MgKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCwgR3N0RWJtbFJlYWQgKiBlYm1sKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludDMyIGlkOworCisgIERFQlVHX0VMRU1FTlRfU1RBUlQgKGRlbXV4LCBlYm1sLCAiVHJhY2tzIik7CisKKyAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBERUJVR19FTEVNRU5UX1NUT1AgKGRlbXV4LCBlYm1sLCAiVHJhY2tzIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgICAvKiBvbmUgdHJhY2sgd2l0aGluIHRoZSAiYWxsLXRyYWNrcyIgaGVhZGVyICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0VOVFJZOgorICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSAoZGVtdXgsIGVibWwpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX3NraXAgKCZkZW11eC0+Y29tbW9uLCBlYm1sLAorICAgICAgICAgICAgIlRyYWNrIiwgaWQpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgREVCVUdfRUxFTUVOVF9TVE9QIChkZW11eCwgZWJtbCwgIlRyYWNrcyIsIHJldCk7CisKKyAgZGVtdXgtPnRyYWNrc19wYXJzZWQgPSBUUlVFOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWFkIHNpZ25lZC91bnNpZ25lZCAiRUJNTCIgbnVtYmVycy4KKyAqIFJldHVybjogbnVtYmVyIG9mIGJ5dGVzIHByb2Nlc3NlZC4KKyAqLworCitzdGF0aWMgZ2ludAorZ3N0X21hdHJvc2thX2VibWxudW1fdWludCAoZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSwgZ3VpbnQ2NCAqIG51bSkKK3sKKyAgZ2ludCBsZW5fbWFzayA9IDB4ODAsIHJlYWQgPSAxLCBuID0gMSwgbnVtX2ZmcyA9IDA7CisgIGd1aW50NjQgdG90YWw7CisKKyAgaWYgKHNpemUgPD0gMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHRvdGFsID0gZGF0YVswXTsKKyAgd2hpbGUgKHJlYWQgPD0gOCAmJiAhKHRvdGFsICYgbGVuX21hc2spKSB7CisgICAgcmVhZCsrOworICAgIGxlbl9tYXNrID4+PSAxOworICB9CisgIGlmIChyZWFkID4gOCkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKCh0b3RhbCAmPSAobGVuX21hc2sgLSAxKSkgPT0gbGVuX21hc2sgLSAxKQorICAgIG51bV9mZnMrKzsKKyAgaWYgKHNpemUgPCByZWFkKQorICAgIHJldHVybiAtMTsKKyAgd2hpbGUgKG4gPCByZWFkKSB7CisgICAgaWYgKGRhdGFbbl0gPT0gMHhmZikKKyAgICAgIG51bV9mZnMrKzsKKyAgICB0b3RhbCA9ICh0b3RhbCA8PCA4KSB8IGRhdGFbbl07CisgICAgbisrOworICB9CisKKyAgaWYgKHJlYWQgPT0gbnVtX2ZmcyAmJiB0b3RhbCAhPSAwKQorICAgICpudW0gPSBHX01BWFVJTlQ2NDsKKyAgZWxzZQorICAgICpudW0gPSB0b3RhbDsKKworICByZXR1cm4gcmVhZDsKK30KKworc3RhdGljIGdpbnQKK2dzdF9tYXRyb3NrYV9lYm1sbnVtX3NpbnQgKGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIGdpbnQ2NCAqIG51bSkKK3sKKyAgZ3VpbnQ2NCB1bnVtOworICBnaW50IHJlczsKKworICAvKiByZWFkIGFzIHVuc2lnbmVkIG51bWJlciBmaXJzdCAqLworICBpZiAoKHJlcyA9IGdzdF9tYXRyb3NrYV9lYm1sbnVtX3VpbnQgKGRhdGEsIHNpemUsICZ1bnVtKSkgPCAwKQorICAgIHJldHVybiAtMTsKKworICAvKiBtYWtlIHNpZ25lZCAqLworICBpZiAodW51bSA9PSBHX01BWFVJTlQ2NCkKKyAgICAqbnVtID0gR19NQVhJTlQ2NDsKKyAgZWxzZQorICAgICpudW0gPSB1bnVtIC0gKCgxIDw8ICgoNyAqIHJlcykgLSAxKSkgLSAxKTsKKworICByZXR1cm4gcmVzOworfQorCisvKgorICogTW9zdGx5IHVzZWQgZm9yIHN1YnRpdGxlcy4gV2UgYWRkIHZvaWQgZmlsbGVyIGRhdGEgZm9yIGVhY2gKKyAqIGxhZ2dpbmcgc3RyZWFtIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBkZWFkbG9jay4KKyAqLworCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX2RlbXV4X3N5bmNfc3RyZWFtcyAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4KQoreworICBHc3RDbG9ja1RpbWUgZ2FwX3RocmVzaG9sZDsKKyAgZ2ludCBzdHJlYW1fbnI7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiU3luYyB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb24pKTsKKworICBnX2Fzc2VydCAoZGVtdXgtPmNvbW1vbi5udW1fc3RyZWFtcyA9PSBkZW11eC0+Y29tbW9uLnNyYy0+bGVuKTsKKyAgZm9yIChzdHJlYW1fbnIgPSAwOyBzdHJlYW1fbnIgPCBkZW11eC0+Y29tbW9uLnNyYy0+bGVuOyBzdHJlYW1fbnIrKykgeworICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0OworCisgICAgY29udGV4dCA9IGdfcHRyX2FycmF5X2luZGV4IChkZW11eC0+Y29tbW9uLnNyYywgc3RyZWFtX25yKTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwKKyAgICAgICAgIkNoZWNraW5nIGZvciByZXN5bmMgb24gc3RyZWFtICVkICglIiBHU1RfVElNRV9GT1JNQVQgIikiLCBzdHJlYW1fbnIsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGNvbnRleHQtPnBvcykpOworCisgICAgLyogT25seSBzZW5kIGdhcCBldmVudHMgb24gbm9uLXN1YnRpdGxlIHN0cmVhbXMgaWYgbGFnZ2luZyB3YXkgYmVoaW5kLgorICAgICAqIFRoZSAwLjUgc2Vjb25kIHRocmVzaG9sZCBmb3Igc3VidGl0bGUgc3RyZWFtcyBpcyBhbHNvIHF1aXRlIHJhbmRvbS4gKi8KKyAgICBpZiAoY29udGV4dC0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRSkKKyAgICAgIGdhcF90aHJlc2hvbGQgPSBHU1RfU0VDT05EIC8gMjsKKyAgICBlbHNlCisgICAgICBnYXBfdGhyZXNob2xkID0gMyAqIEdTVF9TRUNPTkQ7CisKKyAgICAvKiBMYWcgbmVlZCBvbmx5IGJlIGNvbnNpZGVyZWQgaWYgd2UgaGF2ZSBhZHZhbmNlZCBpbnRvIHJlcXVlc3RlZCBzZWdtZW50ICovCisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChjb250ZXh0LT5wb3MpICYmCisgICAgICAgIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkZW11eC0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb24pICYmCisgICAgICAgIGRlbXV4LT5jb21tb24uc2VnbWVudC5wb3NpdGlvbiA+IGRlbXV4LT5jb21tb24uc2VnbWVudC5zdGFydCAmJgorICAgICAgICBjb250ZXh0LT5wb3MgKyBnYXBfdGhyZXNob2xkIDwgZGVtdXgtPmNvbW1vbi5zZWdtZW50LnBvc2l0aW9uKSB7CisKKyAgICAgIEdzdEV2ZW50ICpldmVudDsKKyAgICAgIGd1aW50NjQgc3RhcnQgPSBjb250ZXh0LT5wb3M7CisgICAgICBndWludDY0IHN0b3AgPSBkZW11eC0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb24gLSBnYXBfdGhyZXNob2xkOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAiU3luY2hyb25pemluZyBzdHJlYW0gJWQgd2l0aCBvdGhlciBieSBhZHZhbmNpbmcgdGltZSBmcm9tICUiCisgICAgICAgICAgR1NUX1RJTUVfRk9STUFUICIgdG8gJSIgR1NUX1RJTUVfRk9STUFULCBzdHJlYW1fbnIsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc3RhcnQpLCBHU1RfVElNRV9BUkdTIChzdG9wKSk7CisKKyAgICAgIGNvbnRleHQtPnBvcyA9IHN0b3A7CisKKyAgICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19nYXAgKHN0YXJ0LCBzdG9wIC0gc3RhcnQpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoY29udGV4dC0+cGFkLCBldmVudCk7CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgICB9CisgIH0KKworICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X3B1c2hfc3RyZWFtX2hlYWRlcnMgKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCwKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIHN0cmVhbSkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ2ludCBpLCBudW07CisKKyAgbnVtID0gZ3N0X2J1ZmZlcl9saXN0X2xlbmd0aCAoc3RyZWFtLT5zdHJlYW1faGVhZGVycyk7CisgIGZvciAoaSA9IDA7IGkgPCBudW07ICsraSkgeworICAgIEdzdEJ1ZmZlciAqYnVmOworCisgICAgYnVmID0gZ3N0X2J1ZmZlcl9saXN0X2dldCAoc3RyZWFtLT5zdHJlYW1faGVhZGVycywgaSk7CisgICAgYnVmID0gZ3N0X2J1ZmZlcl9jb3B5IChidWYpOworCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKworICAgIGlmIChzdHJlYW0tPnNldF9kaXNjb250KSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICAgIHN0cmVhbS0+c2V0X2Rpc2NvbnQgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICB9CisKKyAgICAvKiBwdXNoIG91dCBhbGwgaGVhZGVycyBpbiBvbmUgZ28gYW5kIHVzZSBsYXN0IGZsb3cgcmV0dXJuICovCisgICAgcmV0ID0gZ3N0X3BhZF9wdXNoIChzdHJlYW0tPnBhZCwgYnVmKTsKKyAgfQorCisgIC8qIGRvbid0IG5lZWQgdGhlc2UgYW55ICBsb25nZXIgKi8KKyAgZ3N0X2J1ZmZlcl9saXN0X3VucmVmIChzdHJlYW0tPnN0cmVhbV9oZWFkZXJzKTsKKyAgc3RyZWFtLT5zdHJlYW1faGVhZGVycyA9IE5VTEw7CisKKyAgLyogY29tYmluZSBmbG93cyAqLworICByZXQgPSBnc3RfZmxvd19jb21iaW5lcl91cGRhdGVfZmxvdyAoZGVtdXgtPmZsb3djb21iaW5lciwgcmV0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX2RlbXV4X3B1c2hfZHZkX2NsdXRfY2hhbmdlX2V2ZW50IChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBzdHJlYW0pCit7CisgIGdjaGFyICpidWYsICpzdGFydDsKKworICBnX2Fzc2VydCAoIXN0cmNtcCAoc3RyZWFtLT5jb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX1ZPQlNVQikpOworCisgIGlmICghc3RyZWFtLT5jb2RlY19wcml2KQorICAgIHJldHVybjsKKworICAvKiBpZGVhbGx5LCBWb2JTdWIgcHJpdmF0ZSBkYXRhIHNob3VsZCBiZSBwYXJzZWQgYW5kIHN0b3JlZCBtb3JlIGNvbnZlbmllbnQKKyAgICogZWxzZXdoZXJlLCBidXQgZm9yIG5vdywgb25seSBpbnRlcmVzdGVkIGluIGEgc21hbGwgcGFydCAqLworCisgIC8qIG1ha2Ugc3VyZSB3ZSBoYXZlIHRlcm1pbmF0aW5nIDAgKi8KKyAgYnVmID0gZ19zdHJuZHVwIChzdHJlYW0tPmNvZGVjX3ByaXYsIHN0cmVhbS0+Y29kZWNfcHJpdl9zaXplKTsKKworICAvKiBqdXN0IGxvY2F0ZSBhbmQgcGFyc2UgcGFsZXR0ZSBwYXJ0ICovCisgIHN0YXJ0ID0gc3Ryc3RyIChidWYsICJwYWxldHRlOiIpOworICBpZiAoc3RhcnQpIHsKKyAgICBnaW50IGk7CisgICAgZ3VpbnQzMiBjbHV0WzE2XTsKKyAgICBndWludDMyIGNvbDsKKyAgICBndWludDggciwgZywgYiwgeSwgdSwgdjsKKworICAgIHN0YXJ0ICs9IDg7CisgICAgd2hpbGUgKGdfYXNjaWlfaXNzcGFjZSAoKnN0YXJ0KSkKKyAgICAgIHN0YXJ0Kys7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgIGlmIChzc2NhbmYgKHN0YXJ0LCAiJTA2eCIsICZjb2wpICE9IDEpCisgICAgICAgIGJyZWFrOworICAgICAgc3RhcnQgKz0gNjsKKyAgICAgIHdoaWxlICgoKnN0YXJ0ID09ICcsJykgfHwgZ19hc2NpaV9pc3NwYWNlICgqc3RhcnQpKQorICAgICAgICBzdGFydCsrOworICAgICAgLyogc2lnaCwgbmVlZCB0byBjb252ZXJ0IHRoaXMgZnJvbSB2b2JzdWIgcHNldWRvLVJHQiB0byBZVVYgKi8KKyAgICAgIHIgPSAoY29sID4+IDE2KSAmIDB4ZmY7CisgICAgICBnID0gKGNvbCA+PiA4KSAmIDB4ZmY7CisgICAgICBiID0gY29sICYgMHhmZjsKKyAgICAgIHkgPSBDTEFNUCAoKDAuMTQ5NCAqIHIgKyAwLjYwNjEgKiBnICsgMC4yNDQ1ICogYikgKiAyMTkgLyAyNTUgKyAxNiwgMCwKKyAgICAgICAgICAyNTUpOworICAgICAgdSA9IENMQU1QICgwLjYwNjYgKiByIC0gMC40MzIyICogZyAtIDAuMTc0NCAqIGIgKyAxMjgsIDAsIDI1NSk7CisgICAgICB2ID0gQ0xBTVAgKC0wLjA4NDM1ICogciAtIDAuMzQyMiAqIGcgKyAwLjQyNjYgKiBiICsgMTI4LCAwLCAyNTUpOworICAgICAgY2x1dFtpXSA9ICh5IDw8IDE2KSB8ICh1IDw8IDgpIHwgdjsKKyAgICB9CisKKyAgICAvKiBnb3QgdGhlbSBhbGwgd2l0aG91dCBwcm9ibGVtczsgYnVpbGQgYW5kIHNlbmQgZXZlbnQgKi8KKyAgICBpZiAoaSA9PSAxNikgeworICAgICAgR3N0U3RydWN0dXJlICpzOworCisgICAgICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LWdzdC1kdmQiLCAiZXZlbnQiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICAgICJkdmQtc3B1LWNsdXQtY2hhbmdlIiwgImNsdXQwMCIsIEdfVFlQRV9JTlQsIGNsdXRbMF0sICJjbHV0MDEiLAorICAgICAgICAgIEdfVFlQRV9JTlQsIGNsdXRbMV0sICJjbHV0MDIiLCBHX1RZUEVfSU5ULCBjbHV0WzJdLCAiY2x1dDAzIiwKKyAgICAgICAgICBHX1RZUEVfSU5ULCBjbHV0WzNdLCAiY2x1dDA0IiwgR19UWVBFX0lOVCwgY2x1dFs0XSwgImNsdXQwNSIsCisgICAgICAgICAgR19UWVBFX0lOVCwgY2x1dFs1XSwgImNsdXQwNiIsIEdfVFlQRV9JTlQsIGNsdXRbNl0sICJjbHV0MDciLAorICAgICAgICAgIEdfVFlQRV9JTlQsIGNsdXRbN10sICJjbHV0MDgiLCBHX1RZUEVfSU5ULCBjbHV0WzhdLCAiY2x1dDA5IiwKKyAgICAgICAgICBHX1RZUEVfSU5ULCBjbHV0WzldLCAiY2x1dDEwIiwgR19UWVBFX0lOVCwgY2x1dFsxMF0sICJjbHV0MTEiLAorICAgICAgICAgIEdfVFlQRV9JTlQsIGNsdXRbMTFdLCAiY2x1dDEyIiwgR19UWVBFX0lOVCwgY2x1dFsxMl0sICJjbHV0MTMiLAorICAgICAgICAgIEdfVFlQRV9JTlQsIGNsdXRbMTNdLCAiY2x1dDE0IiwgR19UWVBFX0lOVCwgY2x1dFsxNF0sICJjbHV0MTUiLAorICAgICAgICAgIEdfVFlQRV9JTlQsIGNsdXRbMTVdLCBOVUxMKTsKKworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzdHJlYW0tPnBhZCwKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNX1NUSUNLWSwgcykpOworICAgIH0KKyAgfQorICBnX2ZyZWUgKGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfZGVtdXhfcHVzaF9jb2RlY19kYXRhX2FsbCAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4KQoreworICBnaW50IHN0cmVhbV9ucjsKKworICBnX2Fzc2VydCAoZGVtdXgtPmNvbW1vbi5udW1fc3RyZWFtcyA9PSBkZW11eC0+Y29tbW9uLnNyYy0+bGVuKTsKKyAgZm9yIChzdHJlYW1fbnIgPSAwOyBzdHJlYW1fbnIgPCBkZW11eC0+Y29tbW9uLnNyYy0+bGVuOyBzdHJlYW1fbnIrKykgeworICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpzdHJlYW07CisKKyAgICBzdHJlYW0gPSBnX3B0cl9hcnJheV9pbmRleCAoZGVtdXgtPmNvbW1vbi5zcmMsIHN0cmVhbV9ucik7CisKKyAgICBpZiAoc3RyZWFtLT5zZW5kX3N0cmVhbV9oZWFkZXJzKSB7CisgICAgICBpZiAoc3RyZWFtLT5zdHJlYW1faGVhZGVycyAhPSBOVUxMKSB7CisgICAgICAgIGdzdF9tYXRyb3NrYV9kZW11eF9wdXNoX3N0cmVhbV9oZWFkZXJzIChkZW11eCwgc3RyZWFtKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEZJWE1FOiBwZXJoYXBzIHdlIGNhbiBqdXN0IGRpc2FibGUgYW5kIHNraXAgdGhpcyBzdHJlYW0gdGhlbiAqLworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksCisgICAgICAgICAgICAoIkZhaWxlZCB0byBleHRyYWN0IHN0cmVhbSBoZWFkZXJzIGZyb20gY29kZWMgcHJpdmF0ZSBkYXRhIikpOworICAgICAgfQorICAgICAgc3RyZWFtLT5zZW5kX3N0cmVhbV9oZWFkZXJzID0gRkFMU0U7CisgICAgfQorCisgICAgaWYgKHN0cmVhbS0+c2VuZF9kdmRfZXZlbnQpIHsKKyAgICAgIGdzdF9tYXRyb3NrYV9kZW11eF9wdXNoX2R2ZF9jbHV0X2NoYW5nZV9ldmVudCAoZGVtdXgsIHN0cmVhbSk7CisgICAgICAvKiBGSVhNRTogc2hvdWxkIHdlIHNlbmQgdGhpcyBldmVudCBhZ2FpbiBhZnRlciAoZmx1c2hpbmcpIHNlZWsgPyAqLworICAgICAgc3RyZWFtLT5zZW5kX2R2ZF9ldmVudCA9IEZBTFNFOworICAgIH0KKyAgfQorCit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfZGVtdXhfYWRkX21wZWdfc2VxX2hlYWRlciAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBzdHJlYW0sIEdzdEJ1ZmZlciAqKiBidWYpCit7CisgIGd1aW50OCAqc2VxX2hlYWRlcjsKKyAgZ3VpbnQgc2VxX2hlYWRlcl9sZW47CisgIGd1aW50MzIgaGVhZGVyLCB0bXA7CisKKyAgaWYgKHN0cmVhbS0+Y29kZWNfc3RhdGUpIHsKKyAgICBzZXFfaGVhZGVyID0gc3RyZWFtLT5jb2RlY19zdGF0ZTsKKyAgICBzZXFfaGVhZGVyX2xlbiA9IHN0cmVhbS0+Y29kZWNfc3RhdGVfc2l6ZTsKKyAgfSBlbHNlIGlmIChzdHJlYW0tPmNvZGVjX3ByaXYpIHsKKyAgICBzZXFfaGVhZGVyID0gc3RyZWFtLT5jb2RlY19wcml2OworICAgIHNlcV9oZWFkZXJfbGVuID0gc3RyZWFtLT5jb2RlY19wcml2X3NpemU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CisKKyAgLyogU2VxdWVuY2UgaGVhZGVyIG9ubHkgbmVlZGVkIGZvciBrZXlmcmFtZXMgKi8KKyAgaWYgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKCpidWYsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgaWYgKGdzdF9idWZmZXJfZ2V0X3NpemUgKCpidWYpIDwgNCkKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgZ3N0X2J1ZmZlcl9leHRyYWN0ICgqYnVmLCAwLCAmdG1wLCBzaXplb2YgKGd1aW50MzIpKTsKKyAgaGVhZGVyID0gR1VJTlQzMl9GUk9NX0JFICh0bXApOworCisgIC8qIFNlcXVlbmNlIHN0YXJ0IGNvZGUsIGlmIG5vdCBmb3VuZCBwcmVwZW5kICovCisgIGlmIChoZWFkZXIgIT0gMHgwMDAwMDFiMykgeworICAgIEdzdEJ1ZmZlciAqbmV3YnVmOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZWxlbWVudCwgIlByZXBlbmRpbmcgTVBFRyBzZXF1ZW5jZSBoZWFkZXIiKTsKKworICAgIG5ld2J1ZiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGdfbWVtZHVwIChzZXFfaGVhZGVyLCBzZXFfaGVhZGVyX2xlbiksCisgICAgICAgIHNlcV9oZWFkZXJfbGVuKTsKKworICAgIGdzdF9idWZmZXJfY29weV9pbnRvIChuZXdidWYsICpidWYsIEdTVF9CVUZGRVJfQ09QWV9USU1FU1RBTVBTIHwKKyAgICAgICAgR1NUX0JVRkZFUl9DT1BZX0ZMQUdTIHwgR1NUX0JVRkZFUl9DT1BZX01FTU9SWSwgMCwKKyAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoKmJ1ZikpOworCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoKmJ1Zik7CisgICAgKmJ1ZiA9IG5ld2J1ZjsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9kZW11eF9hZGRfd3Zwa19oZWFkZXIgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICogc3RyZWFtLCBHc3RCdWZmZXIgKiogYnVmKQoreworICBHc3RNYXRyb3NrYVRyYWNrQXVkaW9Db250ZXh0ICphdWRpb2NvbnRleHQgPQorICAgICAgKEdzdE1hdHJvc2thVHJhY2tBdWRpb0NvbnRleHQgKikgc3RyZWFtOworICBHc3RCdWZmZXIgKm5ld2J1ZiA9IE5VTEw7CisgIEdzdE1hcEluZm8gbWFwLCBvdXRtYXA7CisgIGd1aW50OCAqYnVmX2RhdGEsICpkYXRhOworICBXYXZwYWNrNEhlYWRlciB3dmg7CisKKyAgd3ZoLmNrX2lkWzBdID0gJ3cnOworICB3dmguY2tfaWRbMV0gPSAndic7CisgIHd2aC5ja19pZFsyXSA9ICdwJzsKKyAgd3ZoLmNrX2lkWzNdID0gJ2snOworCisgIHd2aC52ZXJzaW9uID0gR1NUX1JFQURfVUlOVDE2X0xFIChzdHJlYW0tPmNvZGVjX3ByaXYpOworICB3dmgudHJhY2tfbm8gPSAwOworICB3dmguaW5kZXhfbm8gPSAwOworICB3dmgudG90YWxfc2FtcGxlcyA9IC0xOworICB3dmguYmxvY2tfaW5kZXggPSBhdWRpb2NvbnRleHQtPnd2cGtfYmxvY2tfaW5kZXg7CisKKyAgaWYgKGF1ZGlvY29udGV4dC0+Y2hhbm5lbHMgPD0gMikgeworICAgIGd1aW50MzIgYmxvY2tfc2FtcGxlcywgdG1wOworICAgIGdzaXplIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplICgqYnVmKTsKKworICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoKmJ1ZiwgMCwgJnRtcCwgc2l6ZW9mIChndWludDMyKSk7CisgICAgYmxvY2tfc2FtcGxlcyA9IEdVSU5UMzJfRlJPTV9MRSAodG1wKTsKKyAgICAvKiB3ZSBuZWVkIHRvIHJlY29uc3RydWN0IHRoZSBoZWFkZXIgb2YgdGhlIHdhdnBhY2sgYmxvY2sgKi8KKworICAgIC8qIC0yMCBiZWNhdXNlIGNrX3NpemUgaXMgdGhlIHNpemUgb2YgdGhlIHdhdnBhY2sgYmxvY2sgLTgKKyAgICAgKiBhbmQgbGFjZV9zaXplIGlzIHRoZSBzaXplIG9mIHRoZSB3YXZwYWNrIGJsb2NrICsgMTIKKyAgICAgKiAodGhlIHRocmVlIGd1aW50MzIgb2YgdGhlIGhlYWRlciB0aGF0IGFscmVhZHkgYXJlIGluIHRoZSBidWZmZXIpICovCisgICAgd3ZoLmNrX3NpemUgPSBzaXplICsgc2l6ZW9mIChXYXZwYWNrNEhlYWRlcikgLSAyMDsKKworICAgIC8qIGJsb2NrX3NhbXBsZXMsIGZsYWdzIGFuZCBjcmMgYXJlIGFscmVhZHkgaW4gdGhlIGJ1ZmZlciAqLworICAgIG5ld2J1ZiA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBzaXplb2YgKFdhdnBhY2s0SGVhZGVyKSAtIDEyLCBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChuZXdidWYsICZvdXRtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgIGRhdGEgPSBvdXRtYXAuZGF0YTsKKyAgICBkYXRhWzBdID0gJ3cnOworICAgIGRhdGFbMV0gPSAndic7CisgICAgZGF0YVsyXSA9ICdwJzsKKyAgICBkYXRhWzNdID0gJ2snOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGRhdGEgKyA0LCB3dmguY2tfc2l6ZSk7CisgICAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoZGF0YSArIDgsIHd2aC52ZXJzaW9uKTsKKyAgICBHU1RfV1JJVEVfVUlOVDggKGRhdGEgKyAxMCwgd3ZoLnRyYWNrX25vKTsKKyAgICBHU1RfV1JJVEVfVUlOVDggKGRhdGEgKyAxMSwgd3ZoLmluZGV4X25vKTsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhICsgMTIsIHd2aC50b3RhbF9zYW1wbGVzKTsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhICsgMTYsIHd2aC5ibG9ja19pbmRleCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAobmV3YnVmLCAmb3V0bWFwKTsKKworICAgIC8qIEFwcGVuZCBkYXRhIGZyb20gYnVmOiAqLworICAgIGdzdF9idWZmZXJfY29weV9pbnRvIChuZXdidWYsICpidWYsIEdTVF9CVUZGRVJfQ09QWV9USU1FU1RBTVBTIHwKKyAgICAgICAgR1NUX0JVRkZFUl9DT1BZX0ZMQUdTIHwgR1NUX0JVRkZFUl9DT1BZX01FTU9SWSwgMCwgc2l6ZSk7CisKKyAgICBnc3RfYnVmZmVyX3VucmVmICgqYnVmKTsKKyAgICAqYnVmID0gbmV3YnVmOworICAgIGF1ZGlvY29udGV4dC0+d3Zwa19ibG9ja19pbmRleCArPSBibG9ja19zYW1wbGVzOworICB9IGVsc2UgeworICAgIGd1aW50OCAqb3V0ZGF0YSA9IE5VTEw7CisgICAgZ3VpbnQgb3V0cG9zID0gMDsKKyAgICBnc2l6ZSBidWZfc2l6ZSwgc2l6ZSwgb3V0X3NpemUgPSAwOworICAgIGd1aW50MzIgYmxvY2tfc2FtcGxlcywgZmxhZ3MsIGNyYywgYmxvY2tzaXplOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKCpidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgYnVmX2RhdGEgPSBtYXAuZGF0YTsKKyAgICBidWZfc2l6ZSA9IG1hcC5zaXplOworCisgICAgaWYgKGJ1Zl9zaXplIDwgNCkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAoZWxlbWVudCwgIlRvbyBzbWFsbCB3YXZwYWNrIGJ1ZmZlciIpOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoKmJ1ZiwgJm1hcCk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorCisgICAgZGF0YSA9IGJ1Zl9kYXRhOworICAgIHNpemUgPSBidWZfc2l6ZTsKKworICAgIGJsb2NrX3NhbXBsZXMgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEpOworICAgIGRhdGEgKz0gNDsKKyAgICBzaXplIC09IDQ7CisKKyAgICB3aGlsZSAoc2l6ZSA+IDEyKSB7CisgICAgICBmbGFncyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSk7CisgICAgICBkYXRhICs9IDQ7CisgICAgICBzaXplIC09IDQ7CisgICAgICBjcmMgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEpOworICAgICAgZGF0YSArPSA0OworICAgICAgc2l6ZSAtPSA0OworICAgICAgYmxvY2tzaXplID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKyAgICAgIGRhdGEgKz0gNDsKKyAgICAgIHNpemUgLT0gNDsKKworICAgICAgaWYgKGJsb2Nrc2l6ZSA9PSAwIHx8IHNpemUgPCBibG9ja3NpemUpCisgICAgICAgIGJyZWFrOworCisgICAgICBnX2Fzc2VydCAoKG5ld2J1ZiA9PSBOVUxMKSA9PSAob3V0ZGF0YSA9PSBOVUxMKSk7CisKKyAgICAgIGlmIChuZXdidWYgPT0gTlVMTCkgeworICAgICAgICBvdXRfc2l6ZSA9IHNpemVvZiAoV2F2cGFjazRIZWFkZXIpICsgYmxvY2tzaXplOworICAgICAgICBuZXdidWYgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgb3V0X3NpemUsIE5VTEwpOworCisgICAgICAgIGdzdF9idWZmZXJfY29weV9pbnRvIChuZXdidWYsICpidWYsCisgICAgICAgICAgICBHU1RfQlVGRkVSX0NPUFlfVElNRVNUQU1QUyB8IEdTVF9CVUZGRVJfQ09QWV9GTEFHUywgMCwgLTEpOworCisgICAgICAgIG91dHBvcyA9IDA7CisgICAgICAgIGdzdF9idWZmZXJfbWFwIChuZXdidWYsICZvdXRtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgICAgICBvdXRkYXRhID0gb3V0bWFwLmRhdGE7CisgICAgICB9IGVsc2UgeworICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChuZXdidWYsICZvdXRtYXApOworICAgICAgICBvdXRfc2l6ZSArPSBzaXplb2YgKFdhdnBhY2s0SGVhZGVyKSArIGJsb2Nrc2l6ZTsKKyAgICAgICAgZ3N0X2J1ZmZlcl9zZXRfc2l6ZSAobmV3YnVmLCBvdXRfc2l6ZSk7CisgICAgICAgIGdzdF9idWZmZXJfbWFwIChuZXdidWYsICZvdXRtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgICAgICBvdXRkYXRhID0gb3V0bWFwLmRhdGE7CisgICAgICB9CisKKyAgICAgIG91dGRhdGFbb3V0cG9zXSA9ICd3JzsKKyAgICAgIG91dGRhdGFbb3V0cG9zICsgMV0gPSAndic7CisgICAgICBvdXRkYXRhW291dHBvcyArIDJdID0gJ3AnOworICAgICAgb3V0ZGF0YVtvdXRwb3MgKyAzXSA9ICdrJzsKKyAgICAgIG91dHBvcyArPSA0OworCisgICAgICBHU1RfV1JJVEVfVUlOVDMyX0xFIChvdXRkYXRhICsgb3V0cG9zLAorICAgICAgICAgIGJsb2Nrc2l6ZSArIHNpemVvZiAoV2F2cGFjazRIZWFkZXIpIC0gOCk7CisgICAgICBHU1RfV1JJVEVfVUlOVDE2X0xFIChvdXRkYXRhICsgb3V0cG9zICsgNCwgd3ZoLnZlcnNpb24pOworICAgICAgR1NUX1dSSVRFX1VJTlQ4IChvdXRkYXRhICsgb3V0cG9zICsgNiwgd3ZoLnRyYWNrX25vKTsKKyAgICAgIEdTVF9XUklURV9VSU5UOCAob3V0ZGF0YSArIG91dHBvcyArIDcsIHd2aC5pbmRleF9ubyk7CisgICAgICBHU1RfV1JJVEVfVUlOVDMyX0xFIChvdXRkYXRhICsgb3V0cG9zICsgOCwgd3ZoLnRvdGFsX3NhbXBsZXMpOworICAgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAob3V0ZGF0YSArIG91dHBvcyArIDEyLCB3dmguYmxvY2tfaW5kZXgpOworICAgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAob3V0ZGF0YSArIG91dHBvcyArIDE2LCBibG9ja19zYW1wbGVzKTsKKyAgICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKG91dGRhdGEgKyBvdXRwb3MgKyAyMCwgZmxhZ3MpOworICAgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAob3V0ZGF0YSArIG91dHBvcyArIDI0LCBjcmMpOworICAgICAgb3V0cG9zICs9IDI4OworCisgICAgICBtZW1tb3ZlIChvdXRkYXRhICsgb3V0cG9zLCBkYXRhLCBibG9ja3NpemUpOworICAgICAgb3V0cG9zICs9IGJsb2Nrc2l6ZTsKKyAgICAgIGRhdGEgKz0gYmxvY2tzaXplOworICAgICAgc2l6ZSAtPSBibG9ja3NpemU7CisgICAgfQorICAgIGdzdF9idWZmZXJfdW5tYXAgKCpidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKCpidWYpOworCisgICAgaWYgKG5ld2J1ZikKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG5ld2J1ZiwgJm91dG1hcCk7CisKKyAgICAqYnVmID0gbmV3YnVmOworICAgIGF1ZGlvY29udGV4dC0+d3Zwa19ibG9ja19pbmRleCArPSBibG9ja19zYW1wbGVzOworICB9CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9wcm9yZXNfaGVhZGVyIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIHN0cmVhbSwgR3N0QnVmZmVyICoqIGJ1ZikKK3sKKyAgR3N0QnVmZmVyICpuZXdidWYgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgOCwgTlVMTCk7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDMyIGZyYW1lX3NpemU7CisKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAobmV3YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKSkgeworICAgIEdTVF9FUlJPUiAoIkZhaWxlZCB0byBtYXAgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIGZyYW1lX3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplICgqYnVmKTsKKworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChtYXAuZGF0YSwgZnJhbWVfc2l6ZSk7CisgIG1hcC5kYXRhWzRdID0gJ2knOworICBtYXAuZGF0YVs1XSA9ICdjJzsKKyAgbWFwLmRhdGFbNl0gPSAncCc7CisgIG1hcC5kYXRhWzddID0gJ2YnOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG5ld2J1ZiwgJm1hcCk7CisgICpidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAobmV3YnVmLCAqYnVmKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKKy8qIEB0ZXh0IG11c3QgYmUgbnVsbC10ZXJtaW5hdGVkICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9kZW11eF9zdWJ0aXRsZV9jaHVua19oYXNfdGFnIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBjb25zdCBnY2hhciAqIHRleHQpCit7CisgIGdjaGFyICp0YWc7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHRleHQgIT0gTlVMTCwgRkFMU0UpOworCisgIC8qIHllcywgdGhpcyBtaWdodCBhbGwgbGVhZCB0byBmYWxzZSBwb3NpdGl2ZXMgLi4uICovCisgIHRhZyA9IChnY2hhciAqKSB0ZXh0OworICB3aGlsZSAoKHRhZyA9IHN0cmNociAodGFnLCAnPCcpKSkgeworICAgIHRhZysrOworICAgIGlmICgqdGFnICE9ICdcMCcgJiYgKih0YWcgKyAxKSA9PSAnPicpIHsKKyAgICAgIC8qIHNvbWUgY29tbW9uIGNvbnZlbmllbmNlIG9uZXMgKi8KKyAgICAgIC8qIG1heWJlIGFueSBjaGFyYWN0ZXIgd2lsbCBkbyBoZXJlID8gKi8KKyAgICAgIHN3aXRjaCAoKnRhZykgeworICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgY2FzZSAnaSc6CisgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKHN0cnN0ciAodGV4dCwgIjxzcGFuIikpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X2NoZWNrX3N1YnRpdGxlX2J1ZmZlciAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBzdHJlYW0sIEdzdEJ1ZmZlciAqKiBidWYpCit7CisgIEdzdE1hdHJvc2thVHJhY2tTdWJ0aXRsZUNvbnRleHQgKnN1Yl9zdHJlYW07CisgIGNvbnN0IGdjaGFyICplbmNvZGluZzsKKyAgR0Vycm9yICplcnIgPSBOVUxMOworICBHc3RCdWZmZXIgKm5ld2J1ZjsKKyAgZ2NoYXIgKnV0Zjg7CisgIEdzdE1hcEluZm8gbWFwOworICBnYm9vbGVhbiBuZWVkc191bm1hcCA9IFRSVUU7CisKKyAgc3ViX3N0cmVhbSA9IChHc3RNYXRyb3NrYVRyYWNrU3VidGl0bGVDb250ZXh0ICopIHN0cmVhbTsKKworICBpZiAoIWdzdF9idWZmZXJfZ2V0X3NpemUgKCpidWYpIHx8ICFnc3RfYnVmZmVyX21hcCAoKmJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogVGhlIHN1YnRpdGxlIGJ1ZmZlciB3ZSBwdXNoIG91dCBzaG91bGQgbm90IGluY2x1ZGUgYSBOVUwgdGVybWluYXRvciBhcworICAgKiBwYXJ0IG9mIHRoZSBkYXRhLiAqLworICBpZiAobWFwLmRhdGFbbWFwLnNpemUgLSAxXSA9PSAnXDAnKSB7CisgICAgZ3N0X2J1ZmZlcl9zZXRfc2l6ZSAoKmJ1ZiwgbWFwLnNpemUgLSAxKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwICgqYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoKmJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgfQorCisgIGlmICghc3ViX3N0cmVhbS0+aW52YWxpZF91dGY4KSB7CisgICAgaWYgKGdfdXRmOF92YWxpZGF0ZSAoKGdjaGFyICopIG1hcC5kYXRhLCBtYXAuc2l6ZSwgTlVMTCkpIHsKKyAgICAgIGdvdG8gbmV4dDsKKyAgICB9CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChlbGVtZW50LCAic3VidGl0bGUgc3RyZWFtICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgIiBpcyBub3QgdmFsaWQgVVRGLTgsIHRoaXMgaXMgYnJva2VuIGFjY29yZGluZyB0byB0aGUgbWF0cm9za2EiCisgICAgICAgICIgc3BlY2lmaWNhdGlvbiIsIHN0cmVhbS0+bnVtKTsKKyAgICBzdWJfc3RyZWFtLT5pbnZhbGlkX3V0ZjggPSBUUlVFOworICB9CisKKyAgLyogZmlsZSB3aXRoIGJyb2tlbiBub24tVVRGOCBzdWJ0aXRsZSwgZG8gdGhlIGJlc3Qgd2UgY2FuIGRvIHRvIGZpeCBpdCAqLworICBlbmNvZGluZyA9IGdfZ2V0ZW52ICgiR1NUX1NVQlRJVExFX0VOQ09ESU5HIik7CisgIGlmIChlbmNvZGluZyA9PSBOVUxMIHx8ICplbmNvZGluZyA9PSAnXDAnKSB7CisgICAgLyogaWYgbG9jYWwgZW5jb2RpbmcgaXMgVVRGLTggYW5kIG5vIGVuY29kaW5nIHNwZWNpZmllZAorICAgICAqIHZpYSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUsIGFzc3VtZSBJU08tODg1OS0xNSAqLworICAgIGlmIChnX2dldF9jaGFyc2V0ICgmZW5jb2RpbmcpKSB7CisgICAgICBlbmNvZGluZyA9ICJJU08tODg1OS0xNSI7CisgICAgfQorICB9CisKKyAgdXRmOCA9CisgICAgICBnX2NvbnZlcnRfd2l0aF9mYWxsYmFjayAoKGdjaGFyICopIG1hcC5kYXRhLCBtYXAuc2l6ZSwgIlVURi04IiwgZW5jb2RpbmcsCisgICAgICAoY2hhciAqKSAiKiIsIE5VTEwsIE5VTEwsICZlcnIpOworCisgIGlmIChlcnIpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoZWxlbWVudCwgImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyBmcm9tICclcycgdG8gVVRGLTg6ICVzIiwKKyAgICAgICAgZW5jb2RpbmcsIGVyci0+bWVzc2FnZSk7CisgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgIGdfZnJlZSAodXRmOCk7CisKKyAgICAvKiBpbnZhbGlkIGlucHV0IGVuY29kaW5nLCBmYWxsIGJhY2sgdG8gSVNPLTg4NTktMTUgKGFsd2F5cyBzdWNjZWVkcykgKi8KKyAgICBlbmNvZGluZyA9ICJJU08tODg1OS0xNSI7CisgICAgdXRmOCA9CisgICAgICAgIGdfY29udmVydF93aXRoX2ZhbGxiYWNrICgoZ2NoYXIgKikgbWFwLmRhdGEsIG1hcC5zaXplLCAiVVRGLTgiLAorICAgICAgICBlbmNvZGluZywgKGNoYXIgKikgIioiLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChlbGVtZW50LCAiY29udmVydGVkIHN1YnRpdGxlIHRleHQgZnJvbSAlcyB0byBVVEYtOCAlcyIsCisgICAgICBlbmNvZGluZywgKGVycikgPyAiKHVzaW5nIElTTy04ODU5LTE1IGFzIGZhbGxiYWNrKSIgOiAiIik7CisKKyAgaWYgKHV0ZjggPT0gTlVMTCkKKyAgICB1dGY4ID0gZ19zdHJkdXAgKCJpbnZhbGlkIHN1YnRpdGxlIik7CisKKyAgbmV3YnVmID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAodXRmOCwgc3RybGVuICh1dGY4KSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKCpidWYsICZtYXApOworICBnc3RfYnVmZmVyX2NvcHlfaW50byAobmV3YnVmLCAqYnVmLAorICAgICAgR1NUX0JVRkZFUl9DT1BZX1RJTUVTVEFNUFMgfCBHU1RfQlVGRkVSX0NPUFlfRkxBR1MgfCBHU1RfQlVGRkVSX0NPUFlfTUVUQSwKKyAgICAgIDAsIC0xKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoKmJ1Zik7CisKKyAgKmJ1ZiA9IG5ld2J1ZjsKKyAgZ3N0X2J1ZmZlcl9tYXAgKCpidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKK25leHQ6CisKKyAgaWYgKHN1Yl9zdHJlYW0tPmNoZWNrX21hcmt1cCkgeworICAgIC8qIGNhcHMgY2xhaW0gbWFya3VwIHRleHQsIHNvIHdlIG5lZWQgdG8gZXNjYXBlIHRleHQsCisgICAgICogZXhjZXB0IGlmIHRleHQgaXMgYWxyZWFkeSBtYXJrdXAgYW5kIHRoZW4gbmVlZHMgbm8gZnVydGhlciBlc2NhcGluZyAqLworICAgIHN1Yl9zdHJlYW0tPnNlZW5fbWFya3VwX3RhZyA9IHN1Yl9zdHJlYW0tPnNlZW5fbWFya3VwX3RhZyB8fAorICAgICAgICBnc3RfbWF0cm9za2FfZGVtdXhfc3VidGl0bGVfY2h1bmtfaGFzX3RhZyAoZWxlbWVudCwgKGdjaGFyICopIG1hcC5kYXRhKTsKKworICAgIGlmICghc3ViX3N0cmVhbS0+c2Vlbl9tYXJrdXBfdGFnKSB7CisgICAgICB1dGY4ID0gZ19tYXJrdXBfZXNjYXBlX3RleHQgKChnY2hhciAqKSBtYXAuZGF0YSwgbWFwLnNpemUpOworCisgICAgICBuZXdidWYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkICh1dGY4LCBzdHJsZW4gKHV0ZjgpKTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKCpidWYsICZtYXApOworICAgICAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKG5ld2J1ZiwgKmJ1ZiwKKyAgICAgICAgICBHU1RfQlVGRkVSX0NPUFlfVElNRVNUQU1QUyB8IEdTVF9CVUZGRVJfQ09QWV9GTEFHUyB8CisgICAgICAgICAgR1NUX0JVRkZFUl9DT1BZX01FVEEsIDAsIC0xKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKCpidWYpOworCisgICAgICAqYnVmID0gbmV3YnVmOworICAgICAgbmVlZHNfdW5tYXAgPSBGQUxTRTsKKyAgICB9CisgIH0KKworICBpZiAobmVlZHNfdW5tYXApCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoKmJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X2NoZWNrX2FhYyAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBzdHJlYW0sIEdzdEJ1ZmZlciAqKiBidWYpCit7CisgIGd1aW50OCBkYXRhWzJdOworICBndWludCBzaXplOworCisgIGdzdF9idWZmZXJfZXh0cmFjdCAoKmJ1ZiwgMCwgZGF0YSwgMik7CisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplICgqYnVmKTsKKworICBpZiAoc2l6ZSA+IDIgJiYgZGF0YVswXSA9PSAweGZmICYmIChkYXRhWzFdID4+IDQgPT0gMHgwZikpIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgICAvKiB0c3MsIEFEVFMgZGF0YSwgcmVtb3ZlIGNvZGVjX2RhdGEKKyAgICAgKiBzdGlsbCBhc3N1bWUgaXQgaXMgYXQgbGVhc3QgcGFyc2VkICovCisgICAgc3RyZWFtLT5jYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoc3RyZWFtLT5jYXBzKTsKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoc3RyZWFtLT5jYXBzLCAwKTsKKyAgICBnX2Fzc2VydCAocyk7CisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJjb2RlY19kYXRhIik7CisgICAgZ3N0X3BhZF9zZXRfY2FwcyAoc3RyZWFtLT5wYWQsIHN0cmVhbS0+Y2Fwcyk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZWxlbWVudCwgIkFEVFMgQUFDIGF1ZGlvIGRhdGE7IHJlbW92aW5nIGNvZGVjLWRhdGEsICIKKyAgICAgICAgIm5ldyBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgc3RyZWFtLT5jYXBzKTsKKyAgfQorCisgIC8qIGRpc2FibGUgc3Vic2VxdWVudCBjaGVja2luZyAqLworICBzdHJlYW0tPnBvc3Rwcm9jZXNzX2ZyYW1lID0gTlVMTDsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X21hdHJvc2thX2RlbXV4X2FsaWduX2J1ZmZlciAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlciwgZ3NpemUgYWxpZ25tZW50KQoreworICBHc3RNYXBJbmZvIG1hcDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIGlmIChtYXAuc2l6ZSA8IHNpemVvZiAoZ3VpbnRwdHIpKSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICByZXR1cm4gYnVmZmVyOworICB9CisKKyAgaWYgKCgoZ3VpbnRwdHIpIG1hcC5kYXRhKSAmIChhbGlnbm1lbnQgLSAxKSkgeworICAgIEdzdEJ1ZmZlciAqbmV3X2J1ZmZlcjsKKyAgICBHc3RBbGxvY2F0aW9uUGFyYW1zIHBhcmFtcyA9IHsgMCwgYWxpZ25tZW50IC0gMSwgMCwgMCwgfTsKKworICAgIG5ld19idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwKKyAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSwgJnBhcmFtcyk7CisKKyAgICAvKiBDb3B5IGRhdGEgImJ5IGhhbmQiLCBzbyBlbnN1cmUgYWxpZ25tZW50IGlzIGtlcHQ6ICovCisgICAgZ3N0X2J1ZmZlcl9maWxsIChuZXdfYnVmZmVyLCAwLCBtYXAuZGF0YSwgbWFwLnNpemUpOworCisgICAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKG5ld19idWZmZXIsIGJ1ZmZlciwgR1NUX0JVRkZFUl9DT1BZX01FVEFEQVRBLCAwLCAtMSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICJXZSB3YW50IG91dHB1dCBhbGlnbmVkIG9uICUiIEdfR1NJWkVfRk9STUFUICIsIHJlYWxsb2NhdGVkIiwKKyAgICAgICAgYWxpZ25tZW50KTsKKworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICAgIHJldHVybiBuZXdfYnVmZmVyOworICB9CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrIChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgsCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sLCBndWludDY0IGNsdXN0ZXJfdGltZSwgZ3VpbnQ2NCBjbHVzdGVyX29mZnNldCwKKyAgICBnYm9vbGVhbiBpc19zaW1wbGVibG9jaykKK3sKKyAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKnN0cmVhbSA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGdib29sZWFuIHJlYWRibG9jayA9IEZBTFNFOworICBndWludDMyIGlkOworICBndWludDY0IGJsb2NrX2R1cmF0aW9uID0gLTE7CisgIGdpbnQ2NCBibG9ja19kaXNjYXJkcGFkZGluZyA9IDA7CisgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdpbnQgc3RyZWFtX251bSA9IC0xLCBuLCBsYWNlcyA9IDA7CisgIGd1aW50IHNpemUgPSAwOworICBnaW50ICpsYWNlX3NpemUgPSBOVUxMOworICBnaW50NjQgdGltZSA9IDA7CisgIGdpbnQgZmxhZ3MgPSAwOworICBnaW50NjQgcmVmZXJlbmNlYmxvY2sgPSAwOworICBnaW50NjQgb2Zmc2V0OworICBHc3RDbG9ja1RpbWUgYnVmZmVyX3RpbWVzdGFtcDsKKworICBvZmZzZXQgPSBnc3RfZWJtbF9yZWFkX2dldF9vZmZzZXQgKGVibWwpOworCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIGlmICghaXNfc2ltcGxlYmxvY2spIHsKKyAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgICAgZ290byBkYXRhX2Vycm9yOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZCA9IEdTVF9NQVRST1NLQV9JRF9TSU1QTEVCTE9DSzsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgIC8qIG9uZSBibG9jayBpbnNpZGUgdGhlIGdyb3VwLiBOb3RlLCBibG9jayBwYXJzaW5nIGlzIG9uZQorICAgICAgICAgKiBvZiB0aGUgaGFyZGVyIHRoaW5ncywgc28gdGhpcyBjb2RlIGlzIGEgYml0IGNvbXBsaWNhdGVkLgorICAgICAgICAgKiBTZWUgaHR0cDovL3d3dy5tYXRyb3NrYS5vcmcvIGZvciBkb2N1bWVudGF0aW9uLiAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfU0lNUExFQkxPQ0s6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9CTE9DSzoKKyAgICAgIHsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisgICAgICAgIGd1aW50OCAqZGF0YTsKKworICAgICAgICBpZiAoYnVmKSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgIGJ1ZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX2J1ZmZlciAoZWJtbCwgJmlkLCAmYnVmKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgICAgZGF0YSA9IG1hcC5kYXRhOworICAgICAgICBzaXplID0gbWFwLnNpemU7CisKKyAgICAgICAgLyogZmlyc3QgYnl0ZShzKTogYmxvY2tudW0gKi8KKyAgICAgICAgaWYgKChuID0gZ3N0X21hdHJvc2thX2VibWxudW1fdWludCAoZGF0YSwgc2l6ZSwgJm51bSkpIDwgMCkKKyAgICAgICAgICBnb3RvIGRhdGFfZXJyb3I7CisgICAgICAgIGRhdGEgKz0gbjsKKyAgICAgICAgc2l6ZSAtPSBuOworCisgICAgICAgIC8qIGZldGNoIHN0cmVhbSBmcm9tIG51bSAqLworICAgICAgICBzdHJlYW1fbnVtID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3N0cmVhbV9mcm9tX251bSAoJmRlbXV4LT5jb21tb24sCisgICAgICAgICAgICBudW0pOworICAgICAgICBpZiAoR19VTkxJS0VMWSAoc2l6ZSA8IDMpKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgIkludmFsaWQgc2l6ZSAldSIsIHNpemUpOworICAgICAgICAgIC8qIG5vbi1mYXRhbCwgdHJ5IG5leHQgYmxvY2soZ3JvdXApICovCisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9IGVsc2UgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbV9udW0gPCAwIHx8CisgICAgICAgICAgICAgICAgc3RyZWFtX251bSA+PSBkZW11eC0+Y29tbW9uLm51bV9zdHJlYW1zKSkgeworICAgICAgICAgIC8qIGxldCdzIG5vdCBnaXZlIHVwIG9uIGEgc3RyYXkgaW52YWxpZCB0cmFjayBudW1iZXIgKi8KKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAiSW52YWxpZCBzdHJlYW0gJWQgZm9yIHRyYWNrIG51bWJlciAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgICAgICI7IGlnbm9yaW5nIGJsb2NrIiwgc3RyZWFtX251bSwgbnVtKTsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgICBzdHJlYW0gPSBnX3B0cl9hcnJheV9pbmRleCAoZGVtdXgtPmNvbW1vbi5zcmMsIHN0cmVhbV9udW0pOworCisgICAgICAgIC8qIHRpbWUgKHJlbGF0aXZlIHRvIGNsdXN0ZXIgdGltZSkgKi8KKyAgICAgICAgdGltZSA9ICgoZ2ludDE2KSBHU1RfUkVBRF9VSU5UMTZfQkUgKGRhdGEpKTsKKyAgICAgICAgZGF0YSArPSAyOworICAgICAgICBzaXplIC09IDI7CisgICAgICAgIGZsYWdzID0gR1NUX1JFQURfVUlOVDggKGRhdGEpOworICAgICAgICBkYXRhICs9IDE7CisgICAgICAgIHNpemUgLT0gMTsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJ0aW1lICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgZmxhZ3MgJWQiLCB0aW1lLAorICAgICAgICAgICAgZmxhZ3MpOworCisgICAgICAgIHN3aXRjaCAoKGZsYWdzICYgMHgwNikgPj4gMSkgeworICAgICAgICAgIGNhc2UgMHgwOiAgICAgICAgICAgIC8qIG5vIGxhY2luZyAqLworICAgICAgICAgICAgbGFjZXMgPSAxOworICAgICAgICAgICAgbGFjZV9zaXplID0gZ19uZXcgKGdpbnQsIDEpOworICAgICAgICAgICAgbGFjZV9zaXplWzBdID0gc2l6ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDE6ICAgICAgICAgICAgLyogeGlwaCBsYWNpbmcgKi8KKyAgICAgICAgICBjYXNlIDB4MjogICAgICAgICAgICAvKiBmaXhlZC1zaXplIGxhY2luZyAqLworICAgICAgICAgIGNhc2UgMHgzOiAgICAgICAgICAgIC8qIEVCTUwgbGFjaW5nICovCisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICAgICAgICBnb3RvIGludmFsaWRfbGFjaW5nOworICAgICAgICAgICAgbGFjZXMgPSBHU1RfUkVBRF9VSU5UOCAoZGF0YSkgKyAxOworICAgICAgICAgICAgZGF0YSArPSAxOworICAgICAgICAgICAgc2l6ZSAtPSAxOworICAgICAgICAgICAgbGFjZV9zaXplID0gZ19uZXcwIChnaW50LCBsYWNlcyk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoKGZsYWdzICYgMHgwNikgPj4gMSkgeworICAgICAgICAgICAgICBjYXNlIDB4MTogICAgICAgIC8qIHhpcGggbGFjaW5nICovICB7CisgICAgICAgICAgICAgICAgZ3VpbnQgdGVtcCwgdG90YWwgPSAwOworCisgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgcmV0ID09IEdTVF9GTE9XX09LICYmIG4gPCBsYWNlcyAtIDE7IG4rKykgeworICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICBnb3RvIGludmFsaWRfbGFjaW5nOworICAgICAgICAgICAgICAgICAgICB0ZW1wID0gR1NUX1JFQURfVUlOVDggKGRhdGEpOworICAgICAgICAgICAgICAgICAgICBsYWNlX3NpemVbbl0gKz0gdGVtcDsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSArPSAxOworICAgICAgICAgICAgICAgICAgICBzaXplIC09IDE7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wICE9IDB4ZmYpCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB0b3RhbCArPSBsYWNlX3NpemVbbl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhY2Vfc2l6ZVtuXSA9IHNpemUgLSB0b3RhbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNhc2UgMHgyOiAgICAgICAgLyogZml4ZWQtc2l6ZSBsYWNpbmcgKi8KKyAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbGFjZXM7IG4rKykKKyAgICAgICAgICAgICAgICAgIGxhY2Vfc2l6ZVtuXSA9IHNpemUgLyBsYWNlczsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIDB4MzogICAgICAgIC8qIEVCTUwgbGFjaW5nICovICB7CisgICAgICAgICAgICAgICAgZ3VpbnQgdG90YWw7CisKKyAgICAgICAgICAgICAgICBpZiAoKG4gPSBnc3RfbWF0cm9za2FfZWJtbG51bV91aW50IChkYXRhLCBzaXplLCAmbnVtKSkgPCAwKQorICAgICAgICAgICAgICAgICAgZ290byBkYXRhX2Vycm9yOworICAgICAgICAgICAgICAgIGRhdGEgKz0gbjsKKyAgICAgICAgICAgICAgICBzaXplIC09IG47CisgICAgICAgICAgICAgICAgdG90YWwgPSBsYWNlX3NpemVbMF0gPSBudW07CisgICAgICAgICAgICAgICAgZm9yIChuID0gMTsgcmV0ID09IEdTVF9GTE9XX09LICYmIG4gPCBsYWNlcyAtIDE7IG4rKykgeworICAgICAgICAgICAgICAgICAgZ2ludDY0IHNudW07CisgICAgICAgICAgICAgICAgICBnaW50IHI7CisKKyAgICAgICAgICAgICAgICAgIGlmICgociA9IGdzdF9tYXRyb3NrYV9lYm1sbnVtX3NpbnQgKGRhdGEsIHNpemUsICZzbnVtKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGRhdGFfZXJyb3I7CisgICAgICAgICAgICAgICAgICBkYXRhICs9IHI7CisgICAgICAgICAgICAgICAgICBzaXplIC09IHI7CisgICAgICAgICAgICAgICAgICBsYWNlX3NpemVbbl0gPSBsYWNlX3NpemVbbiAtIDFdICsgc251bTsKKyAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGxhY2Vfc2l6ZVtuXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG4gPCBsYWNlcykKKyAgICAgICAgICAgICAgICAgIGxhY2Vfc2l6ZVtuXSA9IHNpemUgLSB0b3RhbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHJlYWRibG9jayA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9CTE9DS0RVUkFUSU9OOnsKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZibG9ja19kdXJhdGlvbik7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiQmxvY2tEdXJhdGlvbjogJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIGJsb2NrX2R1cmF0aW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0RJU0NBUkRQQURESU5HOnsKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9zaW50IChlYm1sLCAmaWQsICZibG9ja19kaXNjYXJkcGFkZGluZyk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiRGlzY2FyZFBhZGRpbmc6ICUiIEdTVF9TVElNRV9GT1JNQVQsCisgICAgICAgICAgICBHU1RfU1RJTUVfQVJHUyAoYmxvY2tfZGlzY2FyZHBhZGRpbmcpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1JFRkVSRU5DRUJMT0NLOnsKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9zaW50IChlYm1sLCAmaWQsICZyZWZlcmVuY2VibG9jayk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiUmVmZXJlbmNlQmxvY2s6ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIHJlZmVyZW5jZWJsb2NrKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPREVDU1RBVEU6eworICAgICAgICBndWludDggKmRhdGE7CisgICAgICAgIGd1aW50NjQgZGF0YV9sZW4gPSAwOworCisgICAgICAgIGlmICgocmV0ID0KKyAgICAgICAgICAgICAgICBnc3RfZWJtbF9yZWFkX2JpbmFyeSAoZWJtbCwgJmlkLCAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgJmRhdGFfbGVuKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbSA9PSBOVUxMKSkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICJVbmV4cGVjdGVkIENvZGVjU3RhdGUgc3ViZWxlbWVudCAtIGlnbm9yaW5nIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBnX2ZyZWUgKHN0cmVhbS0+Y29kZWNfc3RhdGUpOworICAgICAgICBzdHJlYW0tPmNvZGVjX3N0YXRlID0gZGF0YTsKKyAgICAgICAgc3RyZWFtLT5jb2RlY19zdGF0ZV9zaXplID0gZGF0YV9sZW47CisKKyAgICAgICAgLyogRGVjb2RlIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICBpZiAoc3RyZWFtLT5lbmNvZGluZ3MgJiYgc3RyZWFtLT5lbmNvZGluZ3MtPmxlbiA+IDAKKyAgICAgICAgICAgICYmIHN0cmVhbS0+Y29kZWNfc3RhdGUgJiYgc3RyZWFtLT5jb2RlY19zdGF0ZV9zaXplID4gMCkgeworICAgICAgICAgIGlmICghZ3N0X21hdHJvc2thX2RlY29kZV9kYXRhIChzdHJlYW0tPmVuY29kaW5ncywKKyAgICAgICAgICAgICAgICAgICZzdHJlYW0tPmNvZGVjX3N0YXRlLCAmc3RyZWFtLT5jb2RlY19zdGF0ZV9zaXplLAorICAgICAgICAgICAgICAgICAgR1NUX01BVFJPU0tBX1RSQUNLX0VOQ09ESU5HX1NDT1BFX0NPREVDX0RBVEEsIFRSVUUpKSB7CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiRGVjb2RpbmcgY29kZWMgc3RhdGUgZmFpbGVkIik7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJDb2RlY1N0YXRlIG9mICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMiLAorICAgICAgICAgICAgc3RyZWFtLT5jb2RlY19zdGF0ZV9zaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwICgmZGVtdXgtPmNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICJCbG9ja0dyb3VwIiwgaWQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQkxPQ0tWSVJUVUFMOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQkxPQ0tBRERJVElPTlM6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9SRUZFUkVOQ0VQUklPUklUWToKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1JFRkVSRU5DRVZJUlRVQUw6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TTElDRVM6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgIlNraXBwaW5nIEJsb2NrR3JvdXAgc3ViZWxlbWVudCAweCV4IC0gaWdub3JpbmciLCBpZCk7CisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfc2tpcCAoZWJtbCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChpc19zaW1wbGVibG9jaykKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogcmVhZGluZyBhIG51bWJlciBvciBzbyBjb3VsZCBoYXZlIGZhaWxlZCAqLworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZGF0YV9lcnJvcjsKKworICBpZiAocmV0ID09IEdTVF9GTE9XX09LICYmIHJlYWRibG9jaykgeworICAgIGdib29sZWFuIGludmlzaWJsZV9mcmFtZSA9IEZBTFNFOworICAgIGdib29sZWFuIGRlbHRhX3VuaXQgPSBGQUxTRTsKKyAgICBndWludDY0IGR1cmF0aW9uID0gMDsKKyAgICBnaW50NjQgbGFjZV90aW1lID0gMDsKKworICAgIHN0cmVhbSA9IGdfcHRyX2FycmF5X2luZGV4IChkZW11eC0+Y29tbW9uLnNyYywgc3RyZWFtX251bSk7CisKKyAgICBpZiAoY2x1c3Rlcl90aW1lICE9IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICAgIC8qIEZJWE1FOiBXaGF0IHRvIGRvIHdpdGggbmVnYXRpdmUgdGltZXN0YW1wcz8gR2l2ZSB0aW1lc3RhbXAgMCBvciAtMT8KKyAgICAgICAqIERyb3AgdW5sZXNzIHRoZSBsYWNlIGNvbnRhaW5zIHRpbWVzdGFtcCAwPyAqLworICAgICAgaWYgKHRpbWUgPCAwICYmICgtdGltZSkgPiBjbHVzdGVyX3RpbWUpIHsKKyAgICAgICAgbGFjZV90aW1lID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzdHJlYW0tPnRpbWVjb2Rlc2NhbGUgPT0gMS4wKQorICAgICAgICAgIGxhY2VfdGltZSA9IChjbHVzdGVyX3RpbWUgKyB0aW1lKSAqIGRlbXV4LT5jb21tb24udGltZV9zY2FsZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGxhY2VfdGltZSA9CisgICAgICAgICAgICAgIGdzdF91dGlsX2d1aW50NjRfdG9fZ2RvdWJsZSAoKGNsdXN0ZXJfdGltZSArIHRpbWUpICoKKyAgICAgICAgICAgICAgZGVtdXgtPmNvbW1vbi50aW1lX3NjYWxlKSAqIHN0cmVhbS0+dGltZWNvZGVzY2FsZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbGFjZV90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICB9CisKKyAgICAvKiBuZWVkIHRvIHJlZnJlc2ggc2VnbWVudCBpbmZvIEFTQVAgKi8KKyAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGxhY2VfdGltZSkgJiYgZGVtdXgtPm5lZWRfc2VnbWVudCkgeworICAgICAgR3N0U2VnbWVudCAqc2VnbWVudCA9ICZkZW11eC0+Y29tbW9uLnNlZ21lbnQ7CisgICAgICBndWludDY0IGNsYWNlX3RpbWU7CisgICAgICBHc3RFdmVudCAqc2VnbWVudF9ldmVudDsKKworICAgICAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lKSkgeworICAgICAgICBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWUgPSBsYWNlX3RpbWU7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgIlNldHRpbmcgc3RyZWFtIHN0YXJ0IHRpbWUgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobGFjZV90aW1lKSk7CisgICAgICB9CisgICAgICBjbGFjZV90aW1lID0gTUFYIChsYWNlX3RpbWUsIGRlbXV4LT5zdHJlYW1fc3RhcnRfdGltZSk7CisgICAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGRlbXV4LT5jb21tb24uc2VnbWVudC5wb3NpdGlvbikgJiYKKyAgICAgICAgICBkZW11eC0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb24gIT0gMCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICJ1c2luZyBzdG9yZWQgc2VlayBwb3NpdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb24pKTsKKyAgICAgICAgY2xhY2VfdGltZSA9IGRlbXV4LT5jb21tb24uc2VnbWVudC5wb3NpdGlvbjsKKyAgICAgICAgc2VnbWVudC0+cG9zaXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgfQorICAgICAgc2VnbWVudC0+c3RhcnQgPSBjbGFjZV90aW1lOworICAgICAgc2VnbWVudC0+c3RvcCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICBzZWdtZW50LT50aW1lID0gc2VnbWVudC0+c3RhcnQgLSBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWU7CisgICAgICBzZWdtZW50LT5wb3NpdGlvbiA9IHNlZ21lbnQtPnN0YXJ0IC0gZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgImdlbmVyYXRlZCBzZWdtZW50IHN0YXJ0aW5nIGF0ICUiIEdTVF9USU1FX0ZPUk1BVCAiOiAlIgorICAgICAgICAgIEdTVF9TRUdNRU5UX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAobGFjZV90aW1lKSwgc2VnbWVudCk7CisgICAgICAvKiBub3cgY29udmV5IG91ciBzZWdtZW50IG5vdGlvbiBkb3duc3RyZWFtICovCisgICAgICBzZWdtZW50X2V2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50IChzZWdtZW50KTsKKyAgICAgIGlmIChkZW11eC0+c2VnbWVudF9zZXFudW0pCisgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChzZWdtZW50X2V2ZW50LCBkZW11eC0+c2VnbWVudF9zZXFudW0pOworICAgICAgZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfZXZlbnQgKGRlbXV4LCBzZWdtZW50X2V2ZW50KTsKKyAgICAgIGRlbXV4LT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgICAgIGRlbXV4LT5zZWdtZW50X3NlcW51bSA9IDA7CisgICAgfQorCisgICAgLyogc2VuZCBwZW5kaW5nIGNvZGVjIGRhdGEgaGVhZGVycyBmb3IgYWxsIHN0cmVhbXMsCisgICAgICogYmVmb3JlIHdlIHBlcmZvcm0gc3luYyBhY3Jvc3MgYWxsIHN0cmVhbXMgKi8KKyAgICBnc3RfbWF0cm9za2FfZGVtdXhfcHVzaF9jb2RlY19kYXRhX2FsbCAoZGVtdXgpOworCisgICAgaWYgKGJsb2NrX2R1cmF0aW9uICE9IC0xKSB7CisgICAgICBpZiAoc3RyZWFtLT50aW1lY29kZXNjYWxlID09IDEuMCkKKyAgICAgICAgZHVyYXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGJsb2NrX2R1cmF0aW9uLAorICAgICAgICAgICAgZGVtdXgtPmNvbW1vbi50aW1lX3NjYWxlLCAxKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZHVyYXRpb24gPQorICAgICAgICAgICAgZ3N0X3V0aWxfZ2RvdWJsZV90b19ndWludDY0IChnc3RfdXRpbF9ndWludDY0X3RvX2dkb3VibGUKKyAgICAgICAgICAgIChnc3RfdXRpbF91aW50NjRfc2NhbGUgKGJsb2NrX2R1cmF0aW9uLCBkZW11eC0+Y29tbW9uLnRpbWVfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgIDEpKSAqIHN0cmVhbS0+dGltZWNvZGVzY2FsZSk7CisgICAgfSBlbHNlIGlmIChzdHJlYW0tPmRlZmF1bHRfZHVyYXRpb24pIHsKKyAgICAgIGR1cmF0aW9uID0gc3RyZWFtLT5kZWZhdWx0X2R1cmF0aW9uICogbGFjZXM7CisgICAgfQorICAgIC8qIGVsc2UgZHVyYXRpb24gaXMgZGlmZiBiZXR3ZWVuIHRpbWVjb2RlIG9mIHRoaXMgYW5kIG5leHQgYmxvY2sgKi8KKworICAgIGlmIChzdHJlYW0tPnR5cGUgPT0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU8pIHsKKyAgICAgIC8qIEZvciBTaW1wbGVCbG9jaywgbG9vayBhdCB0aGUga2V5ZnJhbWUgYml0IGluIGZsYWdzLiBPdGhlcndpc2UsCisgICAgICAgICBhIFJlZmVyZW5jZUJsb2NrIGltcGxpZXMgdGhhdCB0aGlzIGlzIG5vdCBhIGtleWZyYW1lLiBJbiBlaXRoZXIKKyAgICAgICAgIGNhc2UsIGl0IG9ubHkgbWFrZXMgc2Vuc2UgZm9yIHZpZGVvIHN0cmVhbXMuICovCisgICAgICBpZiAoKGlzX3NpbXBsZWJsb2NrICYmICEoZmxhZ3MgJiAweDgwKSkgfHwgcmVmZXJlbmNlYmxvY2spIHsKKyAgICAgICAgZGVsdGFfdW5pdCA9IFRSVUU7CisgICAgICAgIGludmlzaWJsZV9mcmFtZSA9ICgoZmxhZ3MgJiAweDA4KSkgJiYKKyAgICAgICAgICAgICghc3RyY21wIChzdHJlYW0tPmNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fVlA4KSB8fAorICAgICAgICAgICAgIXN0cmNtcCAoc3RyZWFtLT5jb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1ZQOSkgfHwKKyAgICAgICAgICAgICFzdHJjbXAgKHN0cmVhbS0+Y29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19BVjEpKTsKKyAgICAgIH0KKworICAgICAgLyogSWYgd2UncmUgZG9pbmcgYSBrZXlmcmFtZS1vbmx5IHRyaWNrbW9kZSwgb25seSBwdXNoIGtleWZyYW1lcyBvbiB2aWRlbworICAgICAgICogc3RyZWFtcyAqLworICAgICAgaWYgKGRlbHRhX3VuaXQKKyAgICAgICAgICAmJiBkZW11eC0+Y29tbW9uLgorICAgICAgICAgIHNlZ21lbnQuZmxhZ3MgJiBHU1RfU0VHTUVOVF9GTEFHX1RSSUNLTU9ERV9LRVlfVU5JVFMpIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAiU2tpcHBpbmcgbm9uLWtleWZyYW1lIG9uIHN0cmVhbSAlZCIsCisgICAgICAgICAgICBzdHJlYW0tPmluZGV4KTsKKyAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgbGFjZXM7IG4rKykgeworICAgICAgR3N0QnVmZmVyICpzdWI7CisKKyAgICAgIGlmIChHX1VOTElLRUxZIChsYWNlX3NpemVbbl0gPiBzaXplKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiSW52YWxpZCBsYWNlIHNpemUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qIFFvUyBmb3IgdmlkZW8gdHJhY2sgd2l0aCBhbiBpbmRleC4gdGhlIGFzc3VtcHRpb24gaXMgdGhhdAorICAgICAgICAgaW5kZXggZW50cmllcyBwb2ludCB0byBrZXlmcmFtZXMsIGJ1dCBpZiB0aGF0IGlzIG5vdCB0cnVlIHdlCisgICAgICAgICB3aWxsIGluc3RhZCBza2lwIHVudGlsIHRoZSBuZXh0IGtleWZyYW1lLiAqLworICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChsYWNlX3RpbWUpICYmCisgICAgICAgICAgc3RyZWFtLT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1ZJREVPICYmCisgICAgICAgICAgc3RyZWFtLT5pbmRleF90YWJsZSAmJiBkZW11eC0+Y29tbW9uLnNlZ21lbnQucmF0ZSA+IDAuMCkgeworICAgICAgICBHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICp2aWRlb2NvbnRleHQgPQorICAgICAgICAgICAgKEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQgKikgc3RyZWFtOworICAgICAgICBHc3RDbG9ja1RpbWUgZWFybGllc3RfdGltZTsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIGVhcmxpZXN0X3N0cmVhbV90aW1lOworCisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAgICAgICBlYXJsaWVzdF90aW1lID0gdmlkZW9jb250ZXh0LT5lYXJsaWVzdF90aW1lOworICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworICAgICAgICBlYXJsaWVzdF9zdHJlYW1fdGltZSA9CisgICAgICAgICAgICBnc3Rfc2VnbWVudF9wb3NpdGlvbl9mcm9tX3J1bm5pbmdfdGltZSAoJmRlbXV4LT5jb21tb24uc2VnbWVudCwKKyAgICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwgZWFybGllc3RfdGltZSk7CisKKyAgICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChsYWNlX3RpbWUpICYmCisgICAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZWFybGllc3Rfc3RyZWFtX3RpbWUpICYmCisgICAgICAgICAgICBsYWNlX3RpbWUgPD0gZWFybGllc3Rfc3RyZWFtX3RpbWUpIHsKKyAgICAgICAgICAvKiBmaW5kIGluZGV4IGVudHJ5IChrZXlmcmFtZSkgPD0gZWFybGllc3Rfc3RyZWFtX3RpbWUgKi8KKyAgICAgICAgICBHc3RNYXRyb3NrYUluZGV4ICplbnRyeSA9CisgICAgICAgICAgICAgIGdzdF91dGlsX2FycmF5X2JpbmFyeV9zZWFyY2ggKHN0cmVhbS0+aW5kZXhfdGFibGUtPmRhdGEsCisgICAgICAgICAgICAgIHN0cmVhbS0+aW5kZXhfdGFibGUtPmxlbiwgc2l6ZW9mIChHc3RNYXRyb3NrYUluZGV4KSwKKyAgICAgICAgICAgICAgKEdDb21wYXJlRGF0YUZ1bmMpIGdzdF9tYXRyb3NrYV9pbmRleF9zZWVrX2ZpbmQsCisgICAgICAgICAgICAgIEdTVF9TRUFSQ0hfTU9ERV9CRUZPUkUsICZlYXJsaWVzdF9zdHJlYW1fdGltZSwgTlVMTCk7CisKKyAgICAgICAgICAvKiBpZiB0aGF0IGVudHJ5IChrZXlmcmFtZSkgaXMgYWZ0ZXIgdGhlIGN1cnJlbnQgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICBidWZmZXIsIHdlIGNhbiBza2lwIHB1c2hpbmcgKGFuZCB0aHVzIGRlY29kaW5nKSBhbGwKKyAgICAgICAgICAgICBidWZmZXJzIHVudGlsIHRoYXQga2V5ZnJhbWUuICovCisgICAgICAgICAgaWYgKGVudHJ5ICYmIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChlbnRyeS0+dGltZSkgJiYKKyAgICAgICAgICAgICAgZW50cnktPnRpbWUgPiBsYWNlX3RpbWUpIHsKKyAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIlNraXBwaW5nIGxhY2UgYmVmb3JlIGxhdGUga2V5ZnJhbWUiKTsKKyAgICAgICAgICAgIHN0cmVhbS0+c2V0X2Rpc2NvbnQgPSBUUlVFOworICAgICAgICAgICAgZ290byBuZXh0X2xhY2U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHN1YiA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKGJ1ZiwgR1NUX0JVRkZFUl9DT1BZX0FMTCwKKyAgICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpIC0gc2l6ZSwgbGFjZV9zaXplW25dKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiY3JlYXRlZCBzdWJidWZmZXIgJXAiLCBzdWIpOworCisgICAgICBpZiAoZGVsdGFfdW5pdCkKKyAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoc3ViLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgICBlbHNlCisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAoc3ViLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisKKyAgICAgIGlmIChpbnZpc2libGVfZnJhbWUpCisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKHN1YiwgR1NUX0JVRkZFUl9GTEFHX0RFQ09ERV9PTkxZKTsKKworICAgICAgaWYgKHN0cmVhbS0+ZW5jb2RpbmdzICE9IE5VTEwgJiYgc3RyZWFtLT5lbmNvZGluZ3MtPmxlbiA+IDApCisgICAgICAgIHN1YiA9IGdzdF9tYXRyb3NrYV9kZWNvZGVfYnVmZmVyIChzdHJlYW0sIHN1Yik7CisKKyAgICAgIGlmIChzdWIgPT0gTlVMTCkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiRGVjb2RpbmcgYnVmZmVyIGZhaWxlZCIpOworICAgICAgICBnb3RvIG5leHRfbGFjZTsKKyAgICAgIH0KKworICAgICAgaWYgKCFzdHJlYW0tPmR0c19vbmx5KSB7CisgICAgICAgIEdTVF9CVUZGRVJfUFRTIChzdWIpID0gbGFjZV90aW1lOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0JVRkZFUl9EVFMgKHN1YikgPSBsYWNlX3RpbWU7CisgICAgICAgIGlmIChzdHJlYW0tPmludHJhX29ubHkpCisgICAgICAgICAgR1NUX0JVRkZFUl9QVFMgKHN1YikgPSBsYWNlX3RpbWU7CisgICAgICB9CisKKyAgICAgIGJ1ZmZlcl90aW1lc3RhbXAgPSBnc3RfbWF0cm9za2FfdHJhY2tfZ2V0X2J1ZmZlcl90aW1lc3RhbXAgKHN0cmVhbSwgc3ViKTsKKworICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChsYWNlX3RpbWUpKSB7CisgICAgICAgIEdzdENsb2NrVGltZSBsYXN0X3N0b3BfZW5kOworCisgICAgICAgIC8qIENoZWNrIGlmIHRoaXMgc3RyZWFtIGlzIGFmdGVyIHNlZ21lbnQgc3RvcCAqLworICAgICAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGRlbXV4LT5jb21tb24uc2VnbWVudC5zdG9wKSAmJgorICAgICAgICAgICAgbGFjZV90aW1lID49IGRlbXV4LT5jb21tb24uc2VnbWVudC5zdG9wKSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICJTdHJlYW0gJWQgYWZ0ZXIgc2VnbWVudCBzdG9wICUiIEdTVF9USU1FX0ZPUk1BVCwgc3RyZWFtLT5pbmRleCwKKyAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZGVtdXgtPmNvbW1vbi5zZWdtZW50LnN0b3ApKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChzdWIpOworICAgICAgICAgIGdvdG8gZW9zOworICAgICAgICB9CisgICAgICAgIGlmIChvZmZzZXQgPj0gc3RyZWFtLT50b19vZmZzZXQKKyAgICAgICAgICAgIHx8IChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZGVtdXgtPnRvX3RpbWUpCisgICAgICAgICAgICAgICAgJiYgbGFjZV90aW1lID4gZGVtdXgtPnRvX3RpbWUpKSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJTdHJlYW0gJWQgYWZ0ZXIgcGxheWJhY2sgc2VjdGlvbiIsCisgICAgICAgICAgICAgIHN0cmVhbS0+aW5kZXgpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHN1Yik7CisgICAgICAgICAgZ290byBlb3M7CisgICAgICAgIH0KKworICAgICAgICAvKiBoYW5kbGUgZ2FwcywgZS5nLiBub24temVybyBzdGFydC10aW1lLCBvciBhbiBjdWUgaW5kZXggZW50cnkKKyAgICAgICAgICogdGhhdCBsYW5kZWQgdXMgd2l0aCB0aW1lc3RhbXBzIG5vdCBxdWl0ZSBpbnRlbmRlZCAqLworICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgICAgICAgaWYgKGRlbXV4LT5tYXhfZ2FwX3RpbWUgJiYKKyAgICAgICAgICAgIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkZW11eC0+bGFzdF9zdG9wX2VuZCkgJiYKKyAgICAgICAgICAgIGRlbXV4LT5jb21tb24uc2VnbWVudC5yYXRlID4gMC4wKSB7CisgICAgICAgICAgR3N0Q2xvY2tUaW1lRGlmZiBkaWZmOworCisgICAgICAgICAgLyogb25seSBzZW5kIHNlZ21lbnRzIHdpdGggaW5jcmVhc2luZyBzdGFydCB0aW1lcywKKyAgICAgICAgICAgKiBvdGhlcndpc2UgaWYgdGhlc2UgZ28gYmFjayBhbmQgZm9ydGggZG93bnN0cmVhbSAoc2lua3MpIGluY3JlYXNlCisgICAgICAgICAgICogYWNjdW11bGF0ZWQgdGltZSBhbmQgcnVubmluZ190aW1lICovCisgICAgICAgICAgZGlmZiA9IEdTVF9DTE9DS19ESUZGIChkZW11eC0+bGFzdF9zdG9wX2VuZCwgbGFjZV90aW1lKTsKKyAgICAgICAgICBpZiAoZGlmZiA+IDAgJiYgZGlmZiA+IGRlbXV4LT5tYXhfZ2FwX3RpbWUKKyAgICAgICAgICAgICAgJiYgbGFjZV90aW1lID4gZGVtdXgtPmNvbW1vbi5zZWdtZW50LnN0YXJ0CisgICAgICAgICAgICAgICYmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGRlbXV4LT5jb21tb24uc2VnbWVudC5zdG9wKQorICAgICAgICAgICAgICAgICAgfHwgbGFjZV90aW1lIDwgZGVtdXgtPmNvbW1vbi5zZWdtZW50LnN0b3ApKSB7CisgICAgICAgICAgICBHc3RFdmVudCAqZXZlbnQ7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgICAiR2FwIG9mICUiIEdfR0lOVDY0X0ZPUk1BVCAiIG5zIGRldGVjdGVkIGluIgorICAgICAgICAgICAgICAgICJzdHJlYW0gJWQgKCUiIEdTVF9USU1FX0ZPUk1BVCAiIC0+ICUiIEdTVF9USU1FX0ZPUk1BVCAiKS4gIgorICAgICAgICAgICAgICAgICJTZW5kaW5nIHVwZGF0ZWQgU0VHTUVOVCBldmVudHMiLCBkaWZmLAorICAgICAgICAgICAgICAgIHN0cmVhbS0+aW5kZXgsIEdTVF9USU1FX0FSR1MgKHN0cmVhbS0+cG9zKSwKKyAgICAgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChsYWNlX3RpbWUpKTsKKworICAgICAgICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2dhcCAoZGVtdXgtPmxhc3Rfc3RvcF9lbmQsIGRpZmYpOworICAgICAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgICAgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5wYWQsIGV2ZW50KTsKKyAgICAgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGRlbXV4LT5jb21tb24uc2VnbWVudC5wb3NpdGlvbikKKyAgICAgICAgICAgIHx8IGRlbXV4LT5jb21tb24uc2VnbWVudC5wb3NpdGlvbiA8IGxhY2VfdGltZSkgeworICAgICAgICAgIGRlbXV4LT5jb21tb24uc2VnbWVudC5wb3NpdGlvbiA9IGxhY2VfdGltZTsKKyAgICAgICAgfQorICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworCisgICAgICAgIGxhc3Rfc3RvcF9lbmQgPSBsYWNlX3RpbWU7CisgICAgICAgIGlmIChkdXJhdGlvbikgeworICAgICAgICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKHN1YikgPSBkdXJhdGlvbiAvIGxhY2VzOworICAgICAgICAgIGxhc3Rfc3RvcF9lbmQgKz0gR1NUX0JVRkZFUl9EVVJBVElPTiAoc3ViKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGRlbXV4LT5sYXN0X3N0b3BfZW5kKSB8fAorICAgICAgICAgICAgZGVtdXgtPmxhc3Rfc3RvcF9lbmQgPCBsYXN0X3N0b3BfZW5kKQorICAgICAgICAgIGRlbXV4LT5sYXN0X3N0b3BfZW5kID0gbGFzdF9zdG9wX2VuZDsKKworICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgICAgICAgaWYgKGRlbXV4LT5jb21tb24uc2VnbWVudC5kdXJhdGlvbiA9PSAtMSB8fAorICAgICAgICAgICAgZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lICsgZGVtdXgtPmNvbW1vbi5zZWdtZW50LmR1cmF0aW9uIDwKKyAgICAgICAgICAgIGxhc3Rfc3RvcF9lbmQpIHsKKyAgICAgICAgICBkZW11eC0+Y29tbW9uLnNlZ21lbnQuZHVyYXRpb24gPQorICAgICAgICAgICAgICBsYXN0X3N0b3BfZW5kIC0gZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lOworICAgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICAgICAgaWYgKCFkZW11eC0+aW52YWxpZF9kdXJhdGlvbikgeworICAgICAgICAgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChkZW11eCksCisgICAgICAgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2R1cmF0aW9uX2NoYW5nZWQgKEdTVF9PQkpFQ1RfQ0FTVCAoZGVtdXgpKSk7CisgICAgICAgICAgICBkZW11eC0+aW52YWxpZF9kdXJhdGlvbiA9IFRSVUU7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3RyZWFtLT5wb3MgPSBsYWNlX3RpbWU7CisKKyAgICAgIGdzdF9tYXRyb3NrYV9kZW11eF9zeW5jX3N0cmVhbXMgKGRlbXV4KTsKKworICAgICAgaWYgKHN0cmVhbS0+c2V0X2Rpc2NvbnQpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJtYXJraW5nIERJU0NPTlQiKTsKKyAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoc3ViLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgICAgIHN0cmVhbS0+c2V0X2Rpc2NvbnQgPSBGQUxTRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAoc3ViLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgICB9CisKKyAgICAgIC8qIHJldmVyc2UgcGxheWJhY2sgYm9vay1rZWVwaW5nICovCisgICAgICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW0tPmZyb21fdGltZSkpCisgICAgICAgIHN0cmVhbS0+ZnJvbV90aW1lID0gbGFjZV90aW1lOworICAgICAgaWYgKHN0cmVhbS0+ZnJvbV9vZmZzZXQgPT0gLTEpCisgICAgICAgIHN0cmVhbS0+ZnJvbV9vZmZzZXQgPSBvZmZzZXQ7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICJQdXNoaW5nIGxhY2UgJWQsIGRhdGEgb2Ygc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVAorICAgICAgICAgICIgZm9yIHN0cmVhbSAlZCwgdGltZT0lIiBHU1RfVElNRV9GT1JNQVQgIiBhbmQgZHVyYXRpb249JSIKKyAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIG4sIGdzdF9idWZmZXJfZ2V0X3NpemUgKHN1YiksIHN0cmVhbV9udW0sCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoYnVmZmVyX3RpbWVzdGFtcCksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVVJBVElPTiAoc3ViKSkpOworCisjaWYgMAorICAgICAgaWYgKGRlbXV4LT5jb21tb24uZWxlbWVudF9pbmRleCkgeworICAgICAgICBpZiAoc3RyZWFtLT5pbmRleF93cml0ZXJfaWQgPT0gLTEpCisgICAgICAgICAgZ3N0X2luZGV4X2dldF93cml0ZXJfaWQgKGRlbXV4LT5jb21tb24uZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgICAgR1NUX09CSkVDVCAoc3RyZWFtLT5wYWQpLCAmc3RyZWFtLT5pbmRleF93cml0ZXJfaWQpOworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgImFkZGluZyBhc3NvY2lhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQgIi0+ICUiCisgICAgICAgICAgICBHX0dVSU5UNjRfRk9STUFUICIgZm9yIHdyaXRlciBpZCAlZCIsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChidWZmZXJfdGltZXN0YW1wKSwgY2x1c3Rlcl9vZmZzZXQsCisgICAgICAgICAgICBzdHJlYW0tPmluZGV4X3dyaXRlcl9pZCk7CisgICAgICAgIGdzdF9pbmRleF9hZGRfYXNzb2NpYXRpb24gKGRlbXV4LT5jb21tb24uZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgIHN0cmVhbS0+aW5kZXhfd3JpdGVyX2lkLCBHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChzdWIsCisgICAgICAgICAgICAgICAgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpID8gMCA6IEdTVF9BU1NPQ0lBVElPTl9GTEFHX0tFWV9VTklULAorICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBidWZmZXJfdGltZXN0YW1wLCBHU1RfRk9STUFUX0JZVEVTLCBjbHVzdGVyX29mZnNldCwKKyAgICAgICAgICAgIE5VTEwpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8qIFBvc3Rwcm9jZXNzIHRoZSBidWZmZXJzIGRlcGVuZGluZyBvbiB0aGUgY29kZWMgdXNlZCAqLworICAgICAgaWYgKHN0cmVhbS0+cG9zdHByb2Nlc3NfZnJhbWUpIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAicnVubmluZyBwb3N0IHByb2Nlc3MiKTsKKyAgICAgICAgcmV0ID0gc3RyZWFtLT5wb3N0cHJvY2Vzc19mcmFtZSAoR1NUX0VMRU1FTlQgKGRlbXV4KSwgc3RyZWFtLCAmc3ViKTsKKyAgICAgIH0KKworICAgICAgLyogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBhIHN1Yi1idWZmZXIgcG9pbnRpbmcgYXQgZGF0YSB3aXRoaW4gYSBsYXJnZXIKKyAgICAgICAgIGJ1ZmZlci4gVGhpcyBkYXRhIG1pZ2h0IG5vdCBiZSBhbGlnbmVkIHdpdGggYW55dGhpbmcuIElmIHRoZSBkYXRhIGlzCisgICAgICAgICByYXcgc2FtcGxlcyB0aG91Z2gsIHdlIHdhbnQgaXQgYWxpZ25lZCB0byB0aGUgcmF3IHR5cGUgKGVnLCA0IGJ5dGVzCisgICAgICAgICBmb3IgMzIgYml0IHNhbXBsZXMsIGV0YyksIG9yIGJhZCB0aGluZ3Mgd2lsbCBoYXBwZW4gZG93bnN0cmVhbSBhcworICAgICAgICAgZWxlbWVudHMgdHlwaWNhbGx5IGFzc3VtZSBtaW5pbWFsIGFsaWdubWVudC4KKyAgICAgICAgIFRoZXJlZm9yZSwgY3JlYXRlIGFuIGFsaWduZWQgY29weSBpZiBuZWNlc3NhcnkuICovCisgICAgICBzdWIgPSBnc3RfbWF0cm9za2FfZGVtdXhfYWxpZ25fYnVmZmVyIChkZW11eCwgc3ViLCBzdHJlYW0tPmFsaWdubWVudCk7CisKKyAgICAgIGlmICghc3RyY21wIChzdHJlYW0tPmNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fT1BVUykpIHsKKyAgICAgICAgZ3VpbnQ2NCBzdGFydF9jbGlwID0gMCwgZW5kX2NsaXAgPSAwOworCisgICAgICAgIC8qIENvZGVjIGRlbGF5IGlzIHBhcnQgb2YgdGhlIHRpbWVzdGFtcHMgKi8KKyAgICAgICAgaWYgKEdTVF9CVUZGRVJfUFRTX0lTX1ZBTElEIChzdWIpICYmIHN0cmVhbS0+Y29kZWNfZGVsYXkpIHsKKyAgICAgICAgICBpZiAoR1NUX0JVRkZFUl9QVFMgKHN1YikgPiBzdHJlYW0tPmNvZGVjX2RlbGF5KSB7CisgICAgICAgICAgICBHU1RfQlVGRkVSX1BUUyAoc3ViKSAtPSBzdHJlYW0tPmNvZGVjX2RlbGF5OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfQlVGRkVSX1BUUyAoc3ViKSA9IDA7CisgICAgICAgICAgICBzdGFydF9jbGlwID0KKyAgICAgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKHN0cmVhbS0+Y29kZWNfZGVsYXksIDQ4MDAwLAorICAgICAgICAgICAgICAgIEdTVF9TRUNPTkQpOworCisgICAgICAgICAgICBpZiAoR1NUX0JVRkZFUl9EVVJBVElPTl9JU19WQUxJRCAoc3ViKSkgeworICAgICAgICAgICAgICBpZiAoR1NUX0JVRkZFUl9EVVJBVElPTiAoc3ViKSA+IHN0cmVhbS0+Y29kZWNfZGVsYXkpCisgICAgICAgICAgICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoc3ViKSAtPSBzdHJlYW0tPmNvZGVjX2RlbGF5OworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoc3ViKSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGJsb2NrX2Rpc2NhcmRwYWRkaW5nKSB7CisgICAgICAgICAgZW5kX2NsaXAgPQorICAgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKGJsb2NrX2Rpc2NhcmRwYWRkaW5nLCA0ODAwMCwKKyAgICAgICAgICAgICAgR1NUX1NFQ09ORCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhcnRfY2xpcCB8fCBlbmRfY2xpcCkgeworICAgICAgICAgIGdzdF9idWZmZXJfYWRkX2F1ZGlvX2NsaXBwaW5nX21ldGEgKHN1YiwgR1NUX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICBzdGFydF9jbGlwLCBlbmRfY2xpcCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKEdTVF9CVUZGRVJfUFRTX0lTX1ZBTElEIChzdWIpKSB7CisgICAgICAgIHN0cmVhbS0+cG9zID0gR1NUX0JVRkZFUl9QVFMgKHN1Yik7CisgICAgICAgIGlmIChHU1RfQlVGRkVSX0RVUkFUSU9OX0lTX1ZBTElEIChzdWIpKQorICAgICAgICAgIHN0cmVhbS0+cG9zICs9IEdTVF9CVUZGRVJfRFVSQVRJT04gKHN1Yik7CisgICAgICB9IGVsc2UgaWYgKEdTVF9CVUZGRVJfRFRTX0lTX1ZBTElEIChzdWIpKSB7CisgICAgICAgIHN0cmVhbS0+cG9zID0gR1NUX0JVRkZFUl9EVFMgKHN1Yik7CisgICAgICAgIGlmIChHU1RfQlVGRkVSX0RVUkFUSU9OX0lTX1ZBTElEIChzdWIpKQorICAgICAgICAgIHN0cmVhbS0+cG9zICs9IEdTVF9CVUZGRVJfRFVSQVRJT04gKHN1Yik7CisgICAgICB9CisKKyAgICAgIHJldCA9IGdzdF9wYWRfcHVzaCAoc3RyZWFtLT5wYWQsIHN1Yik7CisKKyAgICAgIGlmIChkZW11eC0+Y29tbW9uLnNlZ21lbnQucmF0ZSA8IDApIHsKKyAgICAgICAgaWYgKGxhY2VfdGltZSA+IGRlbXV4LT5jb21tb24uc2VnbWVudC5zdG9wICYmIHJldCA9PSBHU1RfRkxPV19FT1MpIHsKKyAgICAgICAgICAvKiBJbiByZXZlcnNlIHBsYXliYWNrIHdlIGNhbiBnZXQgYSBHU1RfRkxPV19FT1Mgd2hlbgorICAgICAgICAgICAqIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzZWdtZW50LCBzbyB3ZSBqdXN0IG5lZWQgdG8ganVtcAorICAgICAgICAgICAqIGJhY2sgdG8gdGhlIHByZXZpb3VzIHNlY3Rpb24uICovCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJkb3duc3RyZWFtIGhhcyByZWFjaGVkIGVuZCBvZiBzZWdtZW50Iik7CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIGNvbWJpbmUgZmxvd3MgKi8KKyAgICAgIHJldCA9IGdzdF9mbG93X2NvbWJpbmVyX3VwZGF0ZV9wYWRfZmxvdyAoZGVtdXgtPmZsb3djb21iaW5lciwKKyAgICAgICAgICBzdHJlYW0tPnBhZCwgcmV0KTsKKworICAgIG5leHRfbGFjZToKKyAgICAgIHNpemUgLT0gbGFjZV9zaXplW25dOworICAgICAgaWYgKGxhY2VfdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmIGR1cmF0aW9uKQorICAgICAgICBsYWNlX3RpbWUgKz0gZHVyYXRpb24gLyBsYWNlczsKKyAgICAgIGVsc2UKKyAgICAgICAgbGFjZV90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICB9CisgIH0KKworZG9uZToKKyAgaWYgKGJ1ZikgeworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgfQorICBnX2ZyZWUgKGxhY2Vfc2l6ZSk7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFWElUUyAqLworZW9zOgorICB7CisgICAgc3RyZWFtLT5lb3MgPSBUUlVFOworICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIC8qIGNvbWJpbmUgZmxvd3MgKi8KKyAgICByZXQgPSBnc3RfZmxvd19jb21iaW5lcl91cGRhdGVfcGFkX2Zsb3cgKGRlbXV4LT5mbG93Y29tYmluZXIsIHN0cmVhbS0+cGFkLAorICAgICAgICByZXQpOworICAgIGdvdG8gZG9uZTsKKyAgfQoraW52YWxpZF9sYWNpbmc6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChkZW11eCwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLCAoIkludmFsaWQgbGFjaW5nIHNpemUiKSk7CisgICAgLyogbm9uLWZhdGFsLCB0cnkgbmV4dCBibG9jayhncm91cCkgKi8KKyAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICBnb3RvIGRvbmU7CisgIH0KK2RhdGFfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChkZW11eCwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLCAoIkRhdGEgZXJyb3IiKSk7CisgICAgLyogbm9uLWZhdGFsLCB0cnkgbmV4dCBibG9jayhncm91cCkgKi8KKyAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworLyogcmV0dXJuIEZBTFNFIGlmIGJsb2NrKGdyb3VwKSBzaG91bGQgYmUgc2tpcHBlZCAoZHVlIHRvIGEgc2VlaykgKi8KK3N0YXRpYyBpbmxpbmUgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9kZW11eF9zZWVrX2Jsb2NrIChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgpCit7CisgIGlmIChHX1VOTElLRUxZIChkZW11eC0+c2Vla19ibG9jaykpIHsKKyAgICBpZiAoISgtLWRlbXV4LT5zZWVrX2Jsb2NrKSkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgInNob3VsZCBza2lwIGJsb2NrIGR1ZSB0byBzZWVrIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiBUUlVFOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfY29udGVudHNfc2Vla2VudHJ5IChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgsCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sKQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ3VpbnQ2NCBzZWVrX3BvcyA9IChndWludDY0KSAtIDE7CisgIGd1aW50MzIgc2Vla19pZCA9IDA7CisgIGd1aW50MzIgaWQ7CisKKyAgREVCVUdfRUxFTUVOVF9TVEFSVCAoZGVtdXgsIGVibWwsICJTZWVrIik7CisKKyAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBERUJVR19FTEVNRU5UX1NUT1AgKGRlbXV4LCBlYm1sLCAiU2VlayIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1NFRUtJRDoKKyAgICAgIHsKKyAgICAgICAgZ3VpbnQ2NCB0OworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZ0KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJTZWVrSUQ6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHQpOworICAgICAgICBzZWVrX2lkID0gdDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1NFRUtQT1NJVElPTjoKKyAgICAgIHsKKyAgICAgICAgZ3VpbnQ2NCB0OworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZ0KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKHQgPiBHX01BWElOVDY0KSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgIlRvbyBsYXJnZSBTZWVrUG9zaXRpb24gJSIgR19HVUlOVDY0X0ZPUk1BVCwgdCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIlNlZWtQb3NpdGlvbjogJSIgR19HVUlOVDY0X0ZPUk1BVCwgdCk7CisgICAgICAgIHNlZWtfcG9zID0gdDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwICgmZGVtdXgtPmNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICJTZWVrSGVhZCIsIGlkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSyAmJiByZXQgIT0gR1NUX0ZMT1dfRU9TKQorICAgIHJldHVybiByZXQ7CisKKyAgaWYgKCFzZWVrX2lkIHx8IHNlZWtfcG9zID09IChndWludDY0KSAtIDEpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LCAiSW5jb21wbGV0ZSBzZWVraGVhZCBlbnRyeSAoMHgleC8lIgorICAgICAgICBHX0dVSU5UNjRfRk9STUFUICIpIiwgc2Vla19pZCwgc2Vla19wb3MpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorCisgIHN3aXRjaCAoc2Vla19pZCkgeworICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1NFRUtIRUFEOgorICAgIHsKKyAgICB9CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ1VFUzoKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UQUdTOgorICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLUzoKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUdNRU5USU5GTzoKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9BVFRBQ0hNRU5UUzoKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSUzoKKyAgICB7CisgICAgICBndWludDY0IGJlZm9yZV9wb3MsIGxlbmd0aDsKKyAgICAgIGd1aW50IG5lZWRlZDsKKworICAgICAgLyogcmVtZW1iZXIgKi8KKyAgICAgIGxlbmd0aCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9nZXRfbGVuZ3RoICgmZGVtdXgtPmNvbW1vbik7CisgICAgICBiZWZvcmVfcG9zID0gZGVtdXgtPmNvbW1vbi5vZmZzZXQ7CisKKyAgICAgIGlmIChsZW5ndGggPT0gKGd1aW50NjQpIC0gMSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIm5vIHVwc3RyZWFtIGxlbmd0aCwgc2tpcHBpbmcgU2Vha0hlYWQgZW50cnkiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qIGNoZWNrIGZvciB2YWxpZGl0eSAqLworICAgICAgaWYgKHNlZWtfcG9zICsgZGVtdXgtPmNvbW1vbi5lYm1sX3NlZ21lbnRfc3RhcnQgKyAxMiA+PSBsZW5ndGgpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICJTZWVrSGVhZCByZWZlcmVuY2UgbGllcyBvdXRzaWRlIGZpbGUhIiAiICglIgorICAgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiKyUiIEdfR1VJTlQ2NF9GT1JNQVQgIisxMiA+PSAlIgorICAgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiKSIsIHNlZWtfcG9zLCBkZW11eC0+Y29tbW9uLmVibWxfc2VnbWVudF9zdGFydCwKKyAgICAgICAgICAgIGxlbmd0aCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvKiBvbmx5IHBpY2sgdXAgaW5kZXggbG9jYXRpb24gd2hlbiBzdHJlYW1pbmcgKi8KKyAgICAgIGlmIChkZW11eC0+c3RyZWFtaW5nKSB7CisgICAgICAgIGlmIChzZWVrX2lkID09IEdTVF9NQVRST1NLQV9JRF9DVUVTKSB7CisgICAgICAgICAgZGVtdXgtPmluZGV4X29mZnNldCA9IHNlZWtfcG9zICsgZGVtdXgtPmNvbW1vbi5lYm1sX3NlZ21lbnRfc3RhcnQ7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJDdWVzIGxvY2F0ZWQgYXQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICAgIGRlbXV4LT5pbmRleF9vZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvKiBzZWVrICovCisgICAgICBkZW11eC0+Y29tbW9uLm9mZnNldCA9IHNlZWtfcG9zICsgZGVtdXgtPmNvbW1vbi5lYm1sX3NlZ21lbnRfc3RhcnQ7CisKKyAgICAgIC8qIGNoZWNrIElEICovCisgICAgICBpZiAoKHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX2lkX2xlbmd0aF9wdWxsICgmZGVtdXgtPmNvbW1vbiwKKyAgICAgICAgICAgICAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwgJmlkLCAmbGVuZ3RoLCAmbmVlZGVkKSkgIT0KKyAgICAgICAgICBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBmaW5pc2g7CisKKyAgICAgIGlmIChpZCAhPSBzZWVrX2lkKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAiV2UgbG9va2VkIGZvciBJRD0weCV4IGJ1dCBnb3QgSUQ9MHgleCAocG9zPSUiIEdfR1VJTlQ2NF9GT1JNQVQgIikiLAorICAgICAgICAgICAgc2Vla19pZCwgaWQsIHNlZWtfcG9zICsgZGVtdXgtPmNvbW1vbi5lYm1sX3NlZ21lbnRfc3RhcnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogbm93IHBhcnNlICovCisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pZCAoZGVtdXgsIGlkLCBsZW5ndGgsIG5lZWRlZCk7CisgICAgICB9CisKKyAgICBmaW5pc2g6CisgICAgICAvKiBzZWVrIGJhY2sgKi8KKyAgICAgIGRlbXV4LT5jb21tb24ub2Zmc2V0ID0gYmVmb3JlX3BvczsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NMVVNURVI6CisgICAgeworICAgICAgZ3VpbnQ2NCBwb3MgPSBzZWVrX3BvcyArIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X3N0YXJ0OworCisgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJDbHVzdGVyIHBvc2l0aW9uIik7CisgICAgICBpZiAoR19VTkxJS0VMWSAoIWRlbXV4LT5jbHVzdGVycykpCisgICAgICAgIGRlbXV4LT5jbHVzdGVycyA9IGdfYXJyYXlfc2l6ZWRfbmV3IChUUlVFLCBUUlVFLCBzaXplb2YgKGd1aW50NjQpLCAxMDApOworICAgICAgZ19hcnJheV9hcHBlbmRfdmFsIChkZW11eC0+Y2x1c3RlcnMsIHBvcyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJJZ25vcmluZyBTZWVrIGVudHJ5IGZvciBJRD0weCV4Iiwgc2Vla19pZCk7CisgICAgICBicmVhazsKKyAgfQorICBERUJVR19FTEVNRU5UX1NUT1AgKGRlbXV4LCBlYm1sLCAiU2VlayIsIHJldCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9jb250ZW50cyAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4LCBHc3RFYm1sUmVhZCAqIGVibWwpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGd1aW50MzIgaWQ7CisKKyAgREVCVUdfRUxFTUVOVF9TVEFSVCAoZGVtdXgsIGVibWwsICJTZWVrSGVhZCIpOworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChkZW11eCwgZWJtbCwgIlNlZWtIZWFkIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfU0VFS0VOVFJZOgorICAgICAgeworICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfY29udGVudHNfc2Vla2VudHJ5IChkZW11eCwgZWJtbCk7CisgICAgICAgIC8qIElnbm9yZSBFT1MgYW5kIGVycm9ycyBoZXJlICovCisgICAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIklnbm9yaW5nICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICAgICAgICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2Vfc2tpcCAoJmRlbXV4LT5jb21tb24sCisgICAgICAgICAgICBlYm1sLCAiU2Vla0hlYWQiLCBpZCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIERFQlVHX0VMRU1FTlRfU1RPUCAoZGVtdXgsIGVibWwsICJTZWVrSGVhZCIsIHJldCk7CisKKyAgLyogU29ydCBjbHVzdGVycyBieSBwb3NpdGlvbiBmb3IgZWFzaWVyIHNlYXJjaGluZyAqLworICBpZiAoZGVtdXgtPmNsdXN0ZXJzKQorICAgIGdfYXJyYXlfc29ydCAoZGVtdXgtPmNsdXN0ZXJzLCAoR0NvbXBhcmVGdW5jKSBnc3RfbWF0cm9za2FfY2x1c3Rlcl9jb21wYXJlKTsKKworICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIEdTVF9GTE9XX09WRVJGTE9XICAgR1NUX0ZMT1dfQ1VTVE9NX0VSUk9SCisKKyNkZWZpbmUgTUFYX0JMT0NLX1NJWkUgKDE1ICogMTAyNCAqIDEwMjQpCisKK3N0YXRpYyBpbmxpbmUgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X2NoZWNrX3JlYWRfc2l6ZSAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4LCBndWludDY0IGJ5dGVzKQoreworICBpZiAoR19VTkxJS0VMWSAoYnl0ZXMgPiBNQVhfQkxPQ0tfU0laRSkpIHsKKyAgICAvKiBvbmx5IGEgZmV3IGJsb2NrcyBhcmUgZXhwZWN0ZWQvYWxsb3dlZCB0byBiZSBsYXJnZSwKKyAgICAgKiBhbmQgd2lsbCBiZSByZWN1cnNlZCBpbnRvLCB3aGVyZWFzIG90aGVycyB3aWxsIGJlIHJlYWQgYW5kIG11c3QgZml0ICovCisgICAgaWYgKGRlbXV4LT5zdHJlYW1pbmcpIHsKKyAgICAgIC8qIGZhdGFsIGluIHN0cmVhbWluZyBjYXNlLCBhcyB3ZSBjYW4ndCBzdGVwIG92ZXIgZWFzaWx5ICovCisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwKKyAgICAgICAgICAoInJlYWRpbmcgbGFyZ2UgYmxvY2sgb2Ygc2l6ZSAlIiBHX0dVSU5UNjRfRk9STUFUICIgbm90IHN1cHBvcnRlZDsgIgorICAgICAgICAgICAgICAiZmlsZSBtaWdodCBiZSBjb3JydXB0LiIsIGJ5dGVzKSk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGluZGljYXRlIGhpZ2hlciBsZXZlbCB0byBxdWlldGx5IGdpdmUgdXAgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICJ0b28gbGFyZ2UgYmxvY2sgb2Ygc2l6ZSAlIiBHX0dVSU5UNjRfRk9STUFULCBieXRlcyk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorfQorCisvKiByZXR1cm5zIFRSVUUgaWYgd2UgdHJ1ZWx5IGFyZSBpbiBlcnJvciBzdGF0ZSwgYW5kIHNob3VsZCBnaXZlIHVwICovCitzdGF0aWMgaW5saW5lIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9kZW11eF9jaGVja19wYXJzZV9lcnJvciAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4KQoreworICBpZiAoIWRlbXV4LT5zdHJlYW1pbmcgJiYgZGVtdXgtPm5leHRfY2x1c3Rlcl9vZmZzZXQgPiAwKSB7CisgICAgLyoganVzdCByZXBvc2l0aW9uaW5nIHRvIHdoZXJlIG5leHQgY2x1c3RlciBzaG91bGQgYmUgYW5kIHRyeSBmcm9tIHRoZXJlICovCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgInBhcnNlIGVycm9yLCB0cnlpbmcgbmV4dCBjbHVzdGVyIGV4cGVjdGVkIGF0ICUiCisgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGRlbXV4LT5uZXh0X2NsdXN0ZXJfb2Zmc2V0KTsKKyAgICBkZW11eC0+Y29tbW9uLm9mZnNldCA9IGRlbXV4LT5uZXh0X2NsdXN0ZXJfb2Zmc2V0OworICAgIGRlbXV4LT5uZXh0X2NsdXN0ZXJfb2Zmc2V0ID0gMDsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0gZWxzZSB7CisgICAgZ2ludDY0IHBvczsKKyAgICBHc3RGbG93UmV0dXJuIHJldDsKKworICAgIC8qIHNpZ2gsIG9uZSBsYXN0IGF0dGVtcHQgYWJvdmUgYW5kIGJleW9uZCBjYWxsIG9mIGR1dHkgLi4uOworICAgICAqIHNlYXJjaCBmb3IgY2x1c3RlciBtYXJrIGZvbGxvd2luZyBjdXJyZW50IHBvcyAqLworICAgIHBvcyA9IGRlbXV4LT5jb21tb24ub2Zmc2V0OworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsICJwYXJzZSBlcnJvciwgbG9va2luZyBmb3IgbmV4dCBjbHVzdGVyIik7CisgICAgaWYgKChyZXQgPSBnc3RfbWF0cm9za2FfZGVtdXhfc2VhcmNoX2NsdXN0ZXIgKGRlbXV4LCAmcG9zLCBUUlVFKSkgIT0KKyAgICAgICAgR1NUX0ZMT1dfT0spIHsKKyAgICAgIC8qIGRpZCBub3Qgd29yaywgZ2l2ZSB1cCAqLworICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICIuLi4gZm91bmQgYXQgICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHBvcyk7CisgICAgICAvKiB0cnkgdGhhdCBwb3NpdGlvbiAqLworICAgICAgZGVtdXgtPmNvbW1vbi5vZmZzZXQgPSBwb3M7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X2ZsdXNoIChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgsIGd1aW50IGZsdXNoKQoreworICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJza2lwcGluZyAlZCBieXRlcyIsIGZsdXNoKTsKKyAgZGVtdXgtPmNvbW1vbi5vZmZzZXQgKz0gZmx1c2g7CisgIGlmIChkZW11eC0+c3RyZWFtaW5nKSB7CisgICAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgICAvKiBoYXJkIHRvIHNraXAgbGFyZ2UgYmxvY2tzIHdoZW4gc3RyZWFtaW5nICovCisgICAgcmV0ID0gZ3N0X21hdHJvc2thX2RlbXV4X2NoZWNrX3JlYWRfc2l6ZSAoZGVtdXgsIGZsdXNoKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoZmx1c2ggPD0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZW11eC0+Y29tbW9uLmFkYXB0ZXIpKQorICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGRlbXV4LT5jb21tb24uYWRhcHRlciwgZmx1c2gpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisgIH0KKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCisvKiBpbml0aWFsaXplcyBAZWJtbCB3aXRoIEBieXRlcyBmcm9tIGlucHV0IHN0cmVhbSBhdCBjdXJyZW50IG9mZnNldC4KKyAqIFJldHVybnMgRU9TIGlmIGluc3VmZmljaWVudCBhdmFpbGFibGUsCisgKiBFUlJPUiBpZiB0b28gbXVjaCB3YXMgYXR0ZW1wdGVkIHRvIHJlYWQuICovCitzdGF0aWMgaW5saW5lIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9kZW11eF90YWtlIChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgsIGd1aW50NjQgYnl0ZXMsCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sKQoreworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlbXV4LCAidGFraW5nICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBieXRlcyBmb3IgcGFyc2luZyIsCisgICAgICBieXRlcyk7CisgIHJldCA9IGdzdF9tYXRyb3NrYV9kZW11eF9jaGVja19yZWFkX3NpemUgKGRlbXV4LCBieXRlcyk7CisgIGlmIChHX1VOTElLRUxZIChyZXQgIT0gR1NUX0ZMT1dfT0spKSB7CisgICAgaWYgKCFkZW11eC0+c3RyZWFtaW5nKSB7CisgICAgICAvKiBpbiBwdWxsIG1vZGUsIHdlIGNhbiBza2lwICovCisgICAgICBpZiAoKHJldCA9IGdzdF9tYXRyb3NrYV9kZW11eF9mbHVzaCAoZGVtdXgsIGJ5dGVzKSkgPT0gR1NUX0ZMT1dfT0spCisgICAgICAgIHJldCA9IEdTVF9GTE9XX09WRVJGTE9XOworICAgIH0gZWxzZSB7CisgICAgICAvKiBvdGhlcndpc2UgZmF0YWwgKi8KKyAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIH0KKyAgICBnb3RvIGV4aXQ7CisgIH0KKyAgaWYgKGRlbXV4LT5zdHJlYW1pbmcpIHsKKyAgICBpZiAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZW11eC0+Y29tbW9uLmFkYXB0ZXIpID49IGJ5dGVzKQorICAgICAgYnVmZmVyID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGRlbXV4LT5jb21tb24uYWRhcHRlciwgYnl0ZXMpOworICAgIGVsc2UKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgfSBlbHNlCisgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BlZWtfYnl0ZXMgKCZkZW11eC0+Y29tbW9uLAorICAgICAgICBkZW11eC0+Y29tbW9uLm9mZnNldCwgYnl0ZXMsICZidWZmZXIsIE5VTEwpOworICBpZiAoR19MSUtFTFkgKGJ1ZmZlcikpIHsKKyAgICBnc3RfZWJtbF9yZWFkX2luaXQgKGVibWwsIEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwgYnVmZmVyLAorICAgICAgICBkZW11eC0+Y29tbW9uLm9mZnNldCk7CisgICAgZGVtdXgtPmNvbW1vbi5vZmZzZXQgKz0gYnl0ZXM7CisgIH0KK2V4aXQ6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfZGVtdXhfY2hlY2tfc2Vla2FiaWxpdHkgKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCkKK3sKKyAgR3N0UXVlcnkgKnF1ZXJ5OworICBnYm9vbGVhbiBzZWVrYWJsZSA9IEZBTFNFOworICBnaW50NjQgc3RhcnQgPSAtMSwgc3RvcCA9IC0xOworCisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19zZWVraW5nIChHU1RfRk9STUFUX0JZVEVTKTsKKyAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnkgKGRlbXV4LT5jb21tb24uc2lua3BhZCwgcXVlcnkpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzZWVraW5nIHF1ZXJ5IGZhaWxlZCIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGdzdF9xdWVyeV9wYXJzZV9zZWVraW5nIChxdWVyeSwgTlVMTCwgJnNlZWthYmxlLCAmc3RhcnQsICZzdG9wKTsKKworICAvKiB0cnkgaGFyZGVyIHRvIHF1ZXJ5IHVwc3RyZWFtIHNpemUgaWYgd2UgZGlkbid0IGdldCBpdCB0aGUgZmlyc3QgdGltZSAqLworICBpZiAoc2Vla2FibGUgJiYgc3RvcCA9PSAtMSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZG9pbmcgZHVyYXRpb24gcXVlcnkgdG8gZml4IHVwIHVuc2V0IHN0b3AiKTsKKyAgICBnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKGRlbXV4LT5jb21tb24uc2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICAgICAgJnN0b3ApOworICB9CisKKyAgLyogaWYgdXBzdHJlYW0gZG9lc24ndCBrbm93IHRoZSBzaXplLCBpdCdzIGxpa2VseSB0aGF0IGl0J3Mgbm90IHNlZWthYmxlIGluCisgICAqIHByYWN0aWNlIGV2ZW4gaWYgaXQgdGVjaG5pY2FsbHkgbWF5IGJlIHNlZWthYmxlICovCisgIGlmIChzZWVrYWJsZSAmJiAoc3RhcnQgIT0gMCB8fCBzdG9wIDw9IHN0YXJ0KSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic2Vla2FibGUgYnV0IHVua25vd24gc3RhcnQvc3RvcCAtPiBkaXNhYmxlIik7CisgICAgc2Vla2FibGUgPSBGQUxTRTsKKyAgfQorCitkb25lOgorICBHU1RfSU5GT19PQkpFQ1QgKGRlbXV4LCAic2Vla2FibGU6ICVkICglIiBHX0dVSU5UNjRfRk9STUFUICIgLSAlIgorICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiKSIsIHNlZWthYmxlLCBzdGFydCwgc3RvcCk7CisgIGRlbXV4LT5zZWVrYWJsZSA9IHNlZWthYmxlOworCisgIGdzdF9xdWVyeV91bnJlZiAocXVlcnkpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X2ZpbmRfdHJhY2tzIChHc3RNYXRyb3NrYURlbXV4ICogZGVtdXgpCit7CisgIGd1aW50MzIgaWQ7CisgIGd1aW50NjQgYmVmb3JlX3BvczsKKyAgZ3VpbnQ2NCBsZW5ndGg7CisgIGd1aW50IG5lZWRlZDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlbXV4LAorICAgICAgIkZvdW5kIENsdXN0ZXIgZWxlbWVudCBiZWZvcmUgVHJhY2tzLCBzZWFyY2hpbmcgVHJhY2tzIik7CisKKyAgLyogcmVtZW1iZXIgKi8KKyAgYmVmb3JlX3BvcyA9IGRlbXV4LT5jb21tb24ub2Zmc2V0OworCisgIC8qIFNlYXJjaCBUcmFja3MgZWxlbWVudCAqLworICB3aGlsZSAoVFJVRSkgeworICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX2lkX2xlbmd0aF9wdWxsICgmZGVtdXgtPmNvbW1vbiwKKyAgICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCAmaWQsICZsZW5ndGgsICZuZWVkZWQpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIGlmIChpZCAhPSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tTKSB7CisgICAgICAvKiB3ZSBtYXkgYmUgc2tpcHBpbmcgbGFyZ2UgY2x1c3RlciBoZXJlLCBzbyBmb3JlZ28gc2l6ZSBjaGVjayBldGMgKi8KKyAgICAgIC8qIC4uLiBidXQgd2UgY2FuJ3Qgc2tpcCB1bmRlZmluZWQgc2l6ZTsgZm9yY2UgZXJyb3IgKi8KKyAgICAgIGlmIChsZW5ndGggPT0gR19NQVhVSU5UNjQpIHsKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX2RlbXV4X2NoZWNrX3JlYWRfc2l6ZSAoZGVtdXgsIGxlbmd0aCk7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVtdXgtPmNvbW1vbi5vZmZzZXQgKz0gbmVlZGVkOworICAgICAgICBkZW11eC0+Y29tbW9uLm9mZnNldCArPSBsZW5ndGg7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiB3aWxsIGxlYWQgdG8gdHJhY2sgcGFyc2luZyAuLi4gKi8KKyAgICByZXQgPSBnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfaWQgKGRlbXV4LCBpZCwgbGVuZ3RoLCBuZWVkZWQpOworICAgIGJyZWFrOworICB9CisKKyAgLyogc2VlayBiYWNrICovCisgIGRlbXV4LT5jb21tb24ub2Zmc2V0ID0gYmVmb3JlX3BvczsKKworICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIEdTVF9SRUFEX0NIRUNLKHN0bXQpICBcCitHX1NUTVRfU1RBUlQgeyBcCisgIGlmIChHX1VOTElLRUxZICgocmV0ID0gKHN0bXQpKSAhPSBHU1RfRkxPV19PSykpIHsgXAorICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT1ZFUkZMT1cpIHsgXAorICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7IFwKKyAgICB9IFwKKyAgICBnb3RvIHJlYWRfZXJyb3I7IFwKKyAgfSBcCit9IEdfU1RNVF9FTkQKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pZCAoR3N0TWF0cm9za2FEZW11eCAqIGRlbXV4LCBndWludDMyIGlkLAorICAgIGd1aW50NjQgbGVuZ3RoLCBndWludCBuZWVkZWQpCit7CisgIEdzdEVibWxSZWFkIGVibWwgPSB7IDAsIH07CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGd1aW50NjQgcmVhZDsKKworICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJQYXJzaW5nIEVsZW1lbnQgaWQgMHgleCwgIgorICAgICAgInNpemUgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBwcmVmaXggJWQiLCBpZCwgbGVuZ3RoLCBuZWVkZWQpOworCisgIC8qIGlmIHdlIHBsYW4gdG8gcmVhZCBhbmQgcGFyc2UgdGhpcyBlbGVtZW50LCB3ZSBuZWVkIHByZWZpeCAoaWQgKyBsZW5ndGgpCisgICAqIGFuZCB0aGUgY29udGVudHMgKi8KKyAgLyogbWluZCBhYm91dCBvdmVyZmxvdyB3cmFwLWFyb3VuZCB3aGVuIGRlYWxpbmcgd2l0aCB1bmRlZmluZWQgc2l6ZSAqLworICByZWFkID0gbGVuZ3RoOworICBpZiAoR19MSUtFTFkgKGxlbmd0aCAhPSBHX01BWFVJTlQ2NCkpCisgICAgcmVhZCArPSBuZWVkZWQ7CisKKyAgc3dpdGNoIChkZW11eC0+Y29tbW9uLnN0YXRlKSB7CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TVEFSVDoKKyAgICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgY2FzZSBHU1RfRUJNTF9JRF9IRUFERVI6CisgICAgICAgICAgR1NUX1JFQURfQ0hFQ0sgKGdzdF9tYXRyb3NrYV9kZW11eF90YWtlIChkZW11eCwgcmVhZCwgJmVibWwpKTsKKyAgICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfaGVhZGVyICgmZGVtdXgtPmNvbW1vbiwgJmVibWwpOworICAgICAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKyAgICAgICAgICBkZW11eC0+Y29tbW9uLnN0YXRlID0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0VHTUVOVDsKKyAgICAgICAgICBnc3RfbWF0cm9za2FfZGVtdXhfY2hlY2tfc2Vla2FiaWxpdHkgKGRlbXV4KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBnb3RvIGludmFsaWRfaGVhZGVyOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TRUdNRU5UOgorICAgICAgc3dpdGNoIChpZCkgeworICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUdNRU5UOgorICAgICAgICAgIC8qIGVhdCBzZWdtZW50IHByZWZpeCAqLworICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfZGVtdXhfZmx1c2ggKGRlbXV4LCBuZWVkZWQpKTsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwKKyAgICAgICAgICAgICAgIkZvdW5kIFNlZ21lbnQgc3RhcnQgYXQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiB3aXRoIHNpemUgJSIKKyAgICAgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgZGVtdXgtPmNvbW1vbi5vZmZzZXQsIGxlbmd0aCk7CisgICAgICAgICAgLyogc2Vla3MgYXJlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VnbWVudCwKKyAgICAgICAgICAgKiBhZnRlciB0aGUgc2VnbWVudCBJRC9sZW5ndGggKi8KKyAgICAgICAgICBkZW11eC0+Y29tbW9uLmVibWxfc2VnbWVudF9zdGFydCA9IGRlbXV4LT5jb21tb24ub2Zmc2V0OworICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgICAgIGxlbmd0aCA9IEdfTUFYVUlOVDY0OworICAgICAgICAgIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X2xlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgICBkZW11eC0+Y29tbW9uLnN0YXRlID0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfSEVBREVSOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICJFeHBlY3RlZCBhIFNlZ21lbnQgSUQgKDB4JXgpLCBidXQgcmVjZWl2ZWQgMHgleCEiLAorICAgICAgICAgICAgICBHU1RfTUFUUk9TS0FfSURfU0VHTUVOVCwgaWQpOworICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfZGVtdXhfZmx1c2ggKGRlbXV4LCByZWFkKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX1NDQU5OSU5HOgorICAgICAgaWYgKGlkICE9IEdTVF9NQVRST1NLQV9JRF9DTFVTVEVSICYmCisgICAgICAgICAgaWQgIT0gR1NUX01BVFJPU0tBX0lEX0NMVVNURVJUSU1FQ09ERSkgeworICAgICAgICBpZiAoZGVtdXgtPmNvbW1vbi5zdGFydF9yZXN5bmNfb2Zmc2V0ICE9IC0xKSB7CisgICAgICAgICAgLyogd2UgbmVlZCB0byBza2lwIGJ5dGUgcGVyIGJ5dGUgaWYgd2UgYXJlIHNjYW5uaW5nIGZvciBhIG5ldyBjbHVzdGVyCisgICAgICAgICAgICogYWZ0ZXIgaW52YWxpZCBkYXRhIGlzIGZvdW5kCisgICAgICAgICAgICovCisgICAgICAgICAgcmVhZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZ290byBza2lwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGRlbXV4LT5jb21tb24uc3RhcnRfcmVzeW5jX29mZnNldCAhPSAtMSkgeworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIlJlc3luYyBkb25lLCBuZXcgY2x1c3RlciBmb3VuZCEiKTsKKyAgICAgICAgICBkZW11eC0+Y29tbW9uLnN0YXJ0X3Jlc3luY19vZmZzZXQgPSAtMTsKKyAgICAgICAgICBkZW11eC0+Y29tbW9uLnN0YXRlID0gZGVtdXgtPmNvbW1vbi5zdGF0ZV90b19yZXN0b3JlOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICBjYXNlIEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0hFQURFUjoKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0RBVEE6CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TRUVLOgorICAgICAgc3dpdGNoIChpZCkgeworICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUdNRU5USU5GTzoKKyAgICAgICAgICBpZiAoIWRlbXV4LT5jb21tb24uc2VnbWVudGluZm9fcGFyc2VkKSB7CisgICAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX2RlbXV4X3Rha2UgKGRlbXV4LCByZWFkLCAmZWJtbCkpOworICAgICAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX2luZm8gKCZkZW11eC0+Y29tbW9uLAorICAgICAgICAgICAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwgJmVibWwpOworICAgICAgICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfdGFncyAoZGVtdXgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX2RlbXV4X2ZsdXNoIChkZW11eCwgcmVhZCkpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tTOgorICAgICAgICAgIGlmICghZGVtdXgtPnRyYWNrc19wYXJzZWQpIHsKKyAgICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfZGVtdXhfdGFrZSAoZGVtdXgsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfdHJhY2tzIChkZW11eCwgJmVibWwpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX2RlbXV4X2ZsdXNoIChkZW11eCwgcmVhZCkpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUjoKKyAgICAgICAgICBpZiAoR19VTkxJS0VMWSAoIWRlbXV4LT50cmFja3NfcGFyc2VkKSkgeworICAgICAgICAgICAgaWYgKGRlbXV4LT5zdHJlYW1pbmcpIHsKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJDbHVzdGVyIGJlZm9yZSBUcmFjayIpOworICAgICAgICAgICAgICBnb3RvIG5vdF9zdHJlYW1hYmxlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX2RlbXV4X2ZpbmRfdHJhY2tzIChkZW11eCk7CisgICAgICAgICAgICAgIGlmICghZGVtdXgtPnRyYWNrc19wYXJzZWQpCisgICAgICAgICAgICAgICAgZ290byBub190cmFja3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChHX1VOTElLRUxZIChkZW11eC0+Y29tbW9uLnN0YXRlCisgICAgICAgICAgICAgICAgICA9PSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9IRUFERVIpKSB7CisgICAgICAgICAgICBkZW11eC0+Y29tbW9uLnN0YXRlID0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfREFUQTsKKyAgICAgICAgICAgIGRlbXV4LT5maXJzdF9jbHVzdGVyX29mZnNldCA9IGRlbXV4LT5jb21tb24ub2Zmc2V0OworICAgICAgICAgICAgaWYgKCFkZW11eC0+c3RyZWFtaW5nICYmCisgICAgICAgICAgICAgICAgIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkZW11eC0+Y29tbW9uLnNlZ21lbnQuZHVyYXRpb24pKSB7CisgICAgICAgICAgICAgIEdzdE1hdHJvc2thSW5kZXggKmxhc3QgPSBOVUxMOworCisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LAorICAgICAgICAgICAgICAgICAgImVzdGltYXRpbmcgZHVyYXRpb24gdXNpbmcgbGFzdCBjbHVzdGVyIik7CisgICAgICAgICAgICAgIGlmICgobGFzdCA9IGdzdF9tYXRyb3NrYV9kZW11eF9zZWFyY2hfcG9zIChkZW11eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBkZW11eC0+bGFzdF9jbHVzdGVyX29mZnNldCA9CisgICAgICAgICAgICAgICAgICAgIGxhc3QtPnBvcyArIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X3N0YXJ0OworICAgICAgICAgICAgICAgIGRlbXV4LT5zdHJlYW1fbGFzdF90aW1lID0gbGFzdC0+dGltZTsKKyAgICAgICAgICAgICAgICBkZW11eC0+Y29tbW9uLnNlZ21lbnQuZHVyYXRpb24gPQorICAgICAgICAgICAgICAgICAgICBkZW11eC0+c3RyZWFtX2xhc3RfdGltZSAtIGRlbXV4LT5zdHJlYW1fc3RhcnRfdGltZTsKKyAgICAgICAgICAgICAgICAvKiBhYm92ZSBlc3RpbWF0ZSBzaG91bGQgbm90IGJlIHRha2VuIGFsbCB0b28gc3Ryb25nbHkgKi8KKyAgICAgICAgICAgICAgICBkZW11eC0+aW52YWxpZF9kdXJhdGlvbiA9IFRSVUU7CisgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICAgICAgICJlc3RpbWF0ZWQgZHVyYXRpb24gYXMgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+Y29tbW9uLnNlZ21lbnQuZHVyYXRpb24pKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzaWduYWxpbmcgbm8gbW9yZSBwYWRzIik7CisgICAgICAgICAgICBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgKEdTVF9FTEVNRU5UIChkZW11eCkpOworICAgICAgICAgICAgLyogc2VuZCBpbml0aWFsIHNlZ21lbnQgLSB3ZSB3YWl0IHRpbGwgd2Uga25vdyB0aGUgZmlyc3QKKyAgICAgICAgICAgICAgIGluY29taW5nIHRpbWVzdGFtcCwgc28gd2UgY2FuIHByb3Blcmx5IHNldCB0aGUgc3RhcnQgb2YKKyAgICAgICAgICAgICAgIHRoZSBzZWdtZW50LiAqLworICAgICAgICAgICAgZGVtdXgtPm5lZWRfc2VnbWVudCA9IFRSVUU7CisgICAgICAgICAgfQorICAgICAgICAgIGRlbXV4LT5jbHVzdGVyX3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgICAgIGRlbXV4LT5jbHVzdGVyX29mZnNldCA9IGRlbXV4LT5jb21tb24ub2Zmc2V0OworICAgICAgICAgIGlmIChHX1VOTElLRUxZICghZGVtdXgtPnNlZWtfZmlyc3QgJiYgZGVtdXgtPnNlZWtfYmxvY2spKSB7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInNlZWsgdGFyZ2V0IGJsb2NrICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAgICAgICAiIG5vdCBmb3VuZCBpbiBDbHVzdGVyLCB0cnlpbmcgbmV4dCBDbHVzdGVyJ3MgZmlyc3QgYmxvY2sgaW5zdGVhZCIsCisgICAgICAgICAgICAgICAgZGVtdXgtPnNlZWtfYmxvY2spOworICAgICAgICAgICAgZGVtdXgtPnNlZWtfYmxvY2sgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBkZW11eC0+c2Vla19maXJzdCA9IEZBTFNFOworICAgICAgICAgIC8qIHJlY29yZCBuZXh0IGNsdXN0ZXIgZm9yIHJlY292ZXJ5ICovCisgICAgICAgICAgaWYgKHJlYWQgIT0gR19NQVhVSU5UNjQpCisgICAgICAgICAgICBkZW11eC0+bmV4dF9jbHVzdGVyX29mZnNldCA9IGRlbXV4LT5jbHVzdGVyX29mZnNldCArIHJlYWQ7CisgICAgICAgICAgLyogZWF0IGNsdXN0ZXIgcHJlZml4ICovCisgICAgICAgICAgZ3N0X21hdHJvc2thX2RlbXV4X2ZsdXNoIChkZW11eCwgbmVlZGVkKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUlRJTUVDT0RFOgorICAgICAgICB7CisgICAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX2RlbXV4X3Rha2UgKGRlbXV4LCByZWFkLCAmZWJtbCkpOworICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50ICgmZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgIkNsdXN0ZXJUaW1lQ29kZTogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICBkZW11eC0+Y2x1c3Rlcl90aW1lID0gbnVtOworICAgICAgICAgIC8qIHRyYWNrIGxhc3QgY2x1c3RlciAqLworICAgICAgICAgIGlmIChkZW11eC0+Y2x1c3Rlcl9vZmZzZXQgPiBkZW11eC0+bGFzdF9jbHVzdGVyX29mZnNldCkgeworICAgICAgICAgICAgZGVtdXgtPmxhc3RfY2x1c3Rlcl9vZmZzZXQgPSBkZW11eC0+Y2x1c3Rlcl9vZmZzZXQ7CisgICAgICAgICAgICBkZW11eC0+c3RyZWFtX2xhc3RfdGltZSA9CisgICAgICAgICAgICAgICAgZGVtdXgtPmNsdXN0ZXJfdGltZSAqIGRlbXV4LT5jb21tb24udGltZV9zY2FsZTsKKyAgICAgICAgICB9CisjaWYgMAorICAgICAgICAgIGlmIChkZW11eC0+Y29tbW9uLmVsZW1lbnRfaW5kZXgpIHsKKyAgICAgICAgICAgIGlmIChkZW11eC0+Y29tbW9uLmVsZW1lbnRfaW5kZXhfd3JpdGVyX2lkID09IC0xKQorICAgICAgICAgICAgICBnc3RfaW5kZXhfZ2V0X3dyaXRlcl9pZCAoZGVtdXgtPmNvbW1vbi5lbGVtZW50X2luZGV4LAorICAgICAgICAgICAgICAgICAgR1NUX09CSkVDVCAoZGVtdXgpLCAmZGVtdXgtPmNvbW1vbi5lbGVtZW50X2luZGV4X3dyaXRlcl9pZCk7CisgICAgICAgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJhZGRpbmcgYXNzb2NpYXRpb24gJSIgR1NUX1RJTUVfRk9STUFUICItPiAlIgorICAgICAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIiBmb3Igd3JpdGVyIGlkICVkIiwKKyAgICAgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChkZW11eC0+Y2x1c3Rlcl90aW1lKSwgZGVtdXgtPmNsdXN0ZXJfb2Zmc2V0LAorICAgICAgICAgICAgICAgIGRlbXV4LT5jb21tb24uZWxlbWVudF9pbmRleF93cml0ZXJfaWQpOworICAgICAgICAgICAgZ3N0X2luZGV4X2FkZF9hc3NvY2lhdGlvbiAoZGVtdXgtPmNvbW1vbi5lbGVtZW50X2luZGV4LAorICAgICAgICAgICAgICAgIGRlbXV4LT5jb21tb24uZWxlbWVudF9pbmRleF93cml0ZXJfaWQsCisgICAgICAgICAgICAgICAgR1NUX0FTU09DSUFUSU9OX0ZMQUdfS0VZX1VOSVQsCisgICAgICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBkZW11eC0+Y2x1c3Rlcl90aW1lLAorICAgICAgICAgICAgICAgIEdTVF9GT1JNQVRfQllURVMsIGRlbXV4LT5jbHVzdGVyX29mZnNldCwgTlVMTCk7CisgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQkxPQ0tHUk9VUDoKKyAgICAgICAgICBpZiAoIWdzdF9tYXRyb3NrYV9kZW11eF9zZWVrX2Jsb2NrIChkZW11eCkpCisgICAgICAgICAgICBnb3RvIHNraXA7CisgICAgICAgICAgR1NUX1JFQURfQ0hFQ0sgKGdzdF9tYXRyb3NrYV9kZW11eF90YWtlIChkZW11eCwgcmVhZCwgJmVibWwpKTsKKyAgICAgICAgICBERUJVR19FTEVNRU5UX1NUQVJUIChkZW11eCwgJmVibWwsICJCbG9ja0dyb3VwIik7CisgICAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoJmVibWwsICZpZCkpID09IEdTVF9GTE9XX09LKSB7CisgICAgICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfZGVtdXhfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayAoZGVtdXgsCisgICAgICAgICAgICAgICAgJmVibWwsIGRlbXV4LT5jbHVzdGVyX3RpbWUsIGRlbXV4LT5jbHVzdGVyX29mZnNldCwgRkFMU0UpOworICAgICAgICAgIH0KKyAgICAgICAgICBERUJVR19FTEVNRU5UX1NUT1AgKGRlbXV4LCAmZWJtbCwgIkJsb2NrR3JvdXAiLCByZXQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TSU1QTEVCTE9DSzoKKyAgICAgICAgICBpZiAoIWdzdF9tYXRyb3NrYV9kZW11eF9zZWVrX2Jsb2NrIChkZW11eCkpCisgICAgICAgICAgICBnb3RvIHNraXA7CisgICAgICAgICAgR1NUX1JFQURfQ0hFQ0sgKGdzdF9tYXRyb3NrYV9kZW11eF90YWtlIChkZW11eCwgcmVhZCwgJmVibWwpKTsKKyAgICAgICAgICBERUJVR19FTEVNRU5UX1NUQVJUIChkZW11eCwgJmVibWwsICJTaW1wbGVCbG9jayIpOworICAgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrIChkZW11eCwKKyAgICAgICAgICAgICAgJmVibWwsIGRlbXV4LT5jbHVzdGVyX3RpbWUsIGRlbXV4LT5jbHVzdGVyX29mZnNldCwgVFJVRSk7CisgICAgICAgICAgREVCVUdfRUxFTUVOVF9TVE9QIChkZW11eCwgJmVibWwsICJTaW1wbGVCbG9jayIsIHJldCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0FUVEFDSE1FTlRTOgorICAgICAgICAgIGlmICghZGVtdXgtPmNvbW1vbi5hdHRhY2htZW50c19wYXJzZWQpIHsKKyAgICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfZGVtdXhfdGFrZSAoZGVtdXgsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfYXR0YWNobWVudHMgKCZkZW11eC0+Y29tbW9uLAorICAgICAgICAgICAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwgJmVibWwpOworICAgICAgICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfdGFncyAoZGVtdXgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX2RlbXV4X2ZsdXNoIChkZW11eCwgcmVhZCkpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVEFHUzoKKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX2RlbXV4X3Rha2UgKGRlbXV4LCByZWFkLCAmZWJtbCkpOworICAgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9tZXRhZGF0YSAoJmRlbXV4LT5jb21tb24sCisgICAgICAgICAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwgJmVibWwpOworICAgICAgICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICBnc3RfbWF0cm9za2FfZGVtdXhfc2VuZF90YWdzIChkZW11eCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJTOgorICAgICAgICAgIGlmICghZGVtdXgtPmNvbW1vbi5jaGFwdGVyc19wYXJzZWQpIHsKKyAgICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfZGVtdXhfdGFrZSAoZGVtdXgsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgICByZXQgPQorICAgICAgICAgICAgICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9jaGFwdGVycyAoJmRlbXV4LT5jb21tb24sICZlYm1sKTsKKworICAgICAgICAgICAgaWYgKGRlbXV4LT5jb21tb24udG9jKSB7CisgICAgICAgICAgICAgIGdzdF9tYXRyb3NrYV9kZW11eF9zZW5kX2V2ZW50IChkZW11eCwKKyAgICAgICAgICAgICAgICAgIGdzdF9ldmVudF9uZXdfdG9jIChkZW11eC0+Y29tbW9uLnRvYywgRkFMU0UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfZGVtdXhfZmx1c2ggKGRlbXV4LCByZWFkKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1NFRUtIRUFEOgorICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfZGVtdXhfdGFrZSAoZGVtdXgsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2NvbnRlbnRzIChkZW11eCwgJmVibWwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DVUVTOgorICAgICAgICAgIGlmIChkZW11eC0+Y29tbW9uLmluZGV4X3BhcnNlZCkgeworICAgICAgICAgICAgR1NUX1JFQURfQ0hFQ0sgKGdzdF9tYXRyb3NrYV9kZW11eF9mbHVzaCAoZGVtdXgsIHJlYWQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX2RlbXV4X3Rha2UgKGRlbXV4LCByZWFkLCAmZWJtbCkpOworICAgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9pbmRleCAoJmRlbXV4LT5jb21tb24sICZlYm1sKTsKKyAgICAgICAgICAvKiBvbmx5IHB1c2ggYmFzZWQ7IGRlbGF5ZWQgaW5kZXggYnVpbGRpbmcgKi8KKyAgICAgICAgICBpZiAocmV0ID09IEdTVF9GTE9XX09LCisgICAgICAgICAgICAgICYmIGRlbXV4LT5jb21tb24uc3RhdGUgPT0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0VFSykgeworICAgICAgICAgICAgR3N0RXZlbnQgKmV2ZW50OworCisgICAgICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgICAgICAgICAgIGV2ZW50ID0gZGVtdXgtPnNlZWtfZXZlbnQ7CisgICAgICAgICAgICBkZW11eC0+c2Vla19ldmVudCA9IE5VTEw7CisgICAgICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworCisgICAgICAgICAgICBnX2Fzc2VydCAoZXZlbnQpOworICAgICAgICAgICAgLyogdW5saWtlbHkgdG8gZmFpbCwgc2luY2Ugd2UgbWFuYWdlZCB0byBzZWVrIHRvIHRoaXMgcG9pbnQgKi8KKyAgICAgICAgICAgIGlmICghZ3N0X21hdHJvc2thX2RlbXV4X2hhbmRsZV9zZWVrX2V2ZW50IChkZW11eCwgTlVMTCwgZXZlbnQpKSB7CisgICAgICAgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgICAgICAgICBnb3RvIHNlZWtfZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgICAgICAvKiByZXN1bWUgZGF0YSBoYW5kbGluZywgbWFpbiB0aHJlYWQgY2xlYXIgdG8gc2VlayBhZ2FpbiAqLworICAgICAgICAgICAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgICAgICAgICAgICBkZW11eC0+Y29tbW9uLnN0YXRlID0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfREFUQTsKKyAgICAgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9QT1NJVElPTjoKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfUFJFVlNJWkU6CisgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0VOQ1JZUFRFREJMT0NLOgorICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TSUxFTlRUUkFDS1M6CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAgICJTa2lwcGluZyBDbHVzdGVyIHN1YmVsZW1lbnQgMHgleCAtIGlnbm9yaW5nIiwgaWQpOworICAgICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICBza2lwOgorICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAic2tpcHBpbmcgRWxlbWVudCAweCV4IiwgaWQpOworICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfZGVtdXhfZmx1c2ggKGRlbXV4LCByZWFkKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfUEFSU0UpCisgICAgZ290byBwYXJzZV9mYWlsZWQ7CisKK2V4aXQ6CisgIGdzdF9lYm1sX3JlYWRfY2xlYXIgKCZlYm1sKTsKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK3JlYWRfZXJyb3I6CisgIHsKKyAgICAvKiBzaW1wbHkgZXhpdCwgbWF5YmUgbm90IGVub3VnaCBkYXRhIHlldCAqLworICAgIC8qIG5vIGVibWwgdG8gY2xlYXIgaWYgcmVhZCBlcnJvciAqLworICAgIHJldHVybiByZXQ7CisgIH0KK3BhcnNlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZW11eCwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBwYXJzZSBFbGVtZW50IDB4JXgiLCBpZCkpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorbm90X3N0cmVhbWFibGU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwKKyAgICAgICAgKCJGaWxlIGxheW91dCBkb2VzIG5vdCBwZXJtaXQgc3RyZWFtaW5nIikpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorbm9fdHJhY2tzOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlbXV4LCBTVFJFQU0sIERFTVVYLCAoTlVMTCksCisgICAgICAgICgiTm8gVHJhY2tzIGVsZW1lbnQgZm91bmQiKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBleGl0OworICB9CitpbnZhbGlkX2hlYWRlcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZW11eCwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLCAoIkludmFsaWQgaGVhZGVyIikpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorc2Vla19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwgKCJGYWlsZWQgdG8gc2VlayIpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGV4aXQ7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9kZW11eF9sb29wIChHc3RQYWQgKiBwYWQpCit7CisgIEdzdE1hdHJvc2thRGVtdXggKmRlbXV4ID0gR1NUX01BVFJPU0tBX0RFTVVYIChHU1RfUEFEX1BBUkVOVCAocGFkKSk7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludDMyIGlkOworICBndWludDY0IGxlbmd0aDsKKyAgZ3VpbnQgbmVlZGVkOworCisgIC8qIElmIHdlIGhhdmUgdG8gY2xvc2UgYSBzZWdtZW50LCBzZW5kIGEgbmV3IHNlZ21lbnQgdG8gZG8gdGhpcyBub3cgKi8KKyAgaWYgKEdfTElLRUxZIChkZW11eC0+Y29tbW9uLnN0YXRlID09IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0RBVEEpKSB7CisgICAgaWYgKEdfVU5MSUtFTFkgKGRlbXV4LT5uZXdfc2VnbWVudCkpIHsKKyAgICAgIGdzdF9tYXRyb3NrYV9kZW11eF9zZW5kX2V2ZW50IChkZW11eCwgZGVtdXgtPm5ld19zZWdtZW50KTsKKyAgICAgIGRlbXV4LT5uZXdfc2VnbWVudCA9IE5VTEw7CisgICAgfQorICB9CisKKyAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BlZWtfaWRfbGVuZ3RoX3B1bGwgKCZkZW11eC0+Y29tbW9uLAorICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCAmaWQsICZsZW5ndGgsICZuZWVkZWQpOworICBpZiAocmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgIGdvdG8gZW9zOworICB9IGVsc2UgaWYgKHJldCA9PSBHU1RfRkxPV19GTFVTSElORykgeworICAgIGdvdG8gcGF1c2U7CisgIH0gZWxzZSBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgcmV0ID0gZ3N0X21hdHJvc2thX2RlbXV4X2NoZWNrX3BhcnNlX2Vycm9yIChkZW11eCk7CisKKyAgICAvKiBPbmx5IGhhbmRsZSBFT1MgYXMgbm8gZXJyb3IgaWYgd2UncmUgb3V0c2lkZSB0aGUgc2VnbWVudCBhbHJlYWR5ICovCisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19FT1MgJiYgKGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X2xlbmd0aCAhPSBHX01BWFVJTlQ2NAorICAgICAgICAgICAgJiYgZGVtdXgtPmNvbW1vbi5vZmZzZXQgPj0KKyAgICAgICAgICAgIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X3N0YXJ0ICsKKyAgICAgICAgICAgIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X2xlbmd0aCkpCisgICAgICBnb3RvIGVvczsKKyAgICBlbHNlIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIHBhdXNlOworICAgIGVsc2UKKyAgICAgIHJldHVybjsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIk9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFUICIsIEVsZW1lbnQgaWQgMHgleCwgIgorICAgICAgInNpemUgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBuZWVkZWQgJWQiLCBkZW11eC0+Y29tbW9uLm9mZnNldCwgaWQsCisgICAgICBsZW5ndGgsIG5lZWRlZCk7CisKKyAgcmV0ID0gZ3N0X21hdHJvc2thX2RlbXV4X3BhcnNlX2lkIChkZW11eCwgaWQsIGxlbmd0aCwgbmVlZGVkKTsKKyAgaWYgKHJldCA9PSBHU1RfRkxPV19FT1MpCisgICAgZ290byBlb3M7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBwYXVzZTsKKworICAvKiBjaGVjayBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIGEgY29uZmlndXJlZCBzZWdtZW50ICovCisgIGlmIChHX0xJS0VMWSAoZGVtdXgtPmNvbW1vbi5zcmMtPmxlbikpIHsKKyAgICBndWludCBpOworCisgICAgZ19hc3NlcnQgKGRlbXV4LT5jb21tb24ubnVtX3N0cmVhbXMgPT0gZGVtdXgtPmNvbW1vbi5zcmMtPmxlbik7CisgICAgZm9yIChpID0gMDsgaSA8IGRlbXV4LT5jb21tb24uc3JjLT5sZW47IGkrKykgeworICAgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKmNvbnRleHQgPSBnX3B0cl9hcnJheV9pbmRleCAoZGVtdXgtPmNvbW1vbi5zcmMsCisgICAgICAgICAgaSk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb250ZXh0LT5wYWQsICJwb3MgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGNvbnRleHQtPnBvcykpOworICAgICAgaWYgKGNvbnRleHQtPmVvcyA9PSBGQUxTRSkKKyAgICAgICAgZ290byBuZXh0OworICAgIH0KKworICAgIEdTVF9JTkZPX09CSkVDVCAoZGVtdXgsICJBbGwgc3RyZWFtcyBhcmUgRU9TIik7CisgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgIGdvdG8gZW9zOworICB9CisKK25leHQ6CisgIGlmIChHX1VOTElLRUxZIChkZW11eC0+Y2FjaGVkX2xlbmd0aCA9PSBHX01BWFVJTlQ2NCB8fAorICAgICAgICAgIGRlbXV4LT5jb21tb24ub2Zmc2V0ID49IGRlbXV4LT5jYWNoZWRfbGVuZ3RoKSkgeworICAgIGRlbXV4LT5jYWNoZWRfbGVuZ3RoID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2dldF9sZW5ndGggKCZkZW11eC0+Y29tbW9uKTsKKyAgICBpZiAoZGVtdXgtPmNvbW1vbi5vZmZzZXQgPT0gZGVtdXgtPmNhY2hlZF9sZW5ndGgpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIlJlYWNoZWQgZW5kIG9mIHN0cmVhbSIpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgICAgZ290byBlb3M7CisgICAgfQorICB9CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworZW9zOgorICB7CisgICAgaWYgKGRlbXV4LT5jb21tb24uc2VnbWVudC5yYXRlIDwgMC4wKSB7CisgICAgICByZXQgPSBnc3RfbWF0cm9za2FfZGVtdXhfc2Vla190b19wcmV2aW91c19rZXlmcmFtZSAoZGVtdXgpOworICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgfQorcGF1c2U6CisgIHsKKyAgICBjb25zdCBnY2hhciAqcmVhc29uID0gZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCk7CisgICAgZ2Jvb2xlYW4gcHVzaF9lb3MgPSBGQUxTRTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgInBhdXNpbmcgdGFzaywgcmVhc29uICVzIiwgcmVhc29uKTsKKyAgICBnc3RfcGFkX3BhdXNlX3Rhc2sgKGRlbXV4LT5jb21tb24uc2lua3BhZCk7CisKKyAgICBpZiAocmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgICAgLyogcGVyZm9ybSBFT1MgbG9naWMgKi8KKworICAgICAgLyogSWYgd2Ugd2VyZSBpbiB0aGUgaGVhZGVycywgbWFrZSBzdXJlIHdlIHNlbmQgbm8tbW9yZS1wYWRzLgorICAgICAgICAgVGhpcyB3aWxsIGVuc3VyZSBkZWNvZGViaW4gZG9lcyBub3QgZ2V0IHN0dWNrIHRoaW5raW5nCisgICAgICAgICB0aGUgY2hhaW4gaXMgbm90IGNvbXBsZXRlIHlldCwgYW5kIHdhaXRpbmcgaW5kZWZpbml0ZWx5LiAqLworICAgICAgaWYgKEdfVU5MSUtFTFkgKGRlbXV4LT5jb21tb24uc3RhdGUgPT0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfSEVBREVSKSkgeworICAgICAgICBpZiAoZGVtdXgtPmNvbW1vbi5zcmMtPmxlbiA9PSAwKSB7CisgICAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlbXV4LCBTVFJFQU0sIEZBSUxFRCwgKE5VTEwpLAorICAgICAgICAgICAgICAoIk5vIHBhZHMgY3JlYXRlZCIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChkZW11eCwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAgICAgICAoIkZhaWxlZCB0byBmaW5pc2ggcmVhZGluZyBoZWFkZXJzIikpOworICAgICAgICB9CisgICAgICAgIGdzdF9lbGVtZW50X25vX21vcmVfcGFkcyAoR1NUX0VMRU1FTlQgKGRlbXV4KSk7CisgICAgICB9CisKKyAgICAgIGlmIChkZW11eC0+Y29tbW9uLnNlZ21lbnQuZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NFR01FTlQpIHsKKyAgICAgICAgR3N0RXZlbnQgKmV2ZW50OworICAgICAgICBHc3RNZXNzYWdlICptc2c7CisgICAgICAgIGdpbnQ2NCBzdG9wOworCisgICAgICAgIC8qIGZvciBzZWdtZW50IHBsYXliYWNrIHdlIG5lZWQgdG8gcG9zdCB3aGVuIChpbiBzdHJlYW0gdGltZSkKKyAgICAgICAgICogd2Ugc3RvcHBlZCwgdGhpcyBpcyBlaXRoZXIgc3RvcCAod2hlbiBzZXQpIG9yIHRoZSBkdXJhdGlvbi4gKi8KKyAgICAgICAgaWYgKChzdG9wID0gZGVtdXgtPmNvbW1vbi5zZWdtZW50LnN0b3ApID09IC0xKQorICAgICAgICAgIHN0b3AgPSBkZW11eC0+bGFzdF9zdG9wX2VuZDsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJTZW5kaW5nIHNlZ21lbnQgZG9uZSwgYXQgZW5kIG9mIHNlZ21lbnQiKTsKKyAgICAgICAgbXNnID0gZ3N0X21lc3NhZ2VfbmV3X3NlZ21lbnRfZG9uZSAoR1NUX09CSkVDVCAoZGVtdXgpLCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICBzdG9wKTsKKyAgICAgICAgaWYgKGRlbXV4LT5zZWdtZW50X3NlcW51bSkKKyAgICAgICAgICBnc3RfbWVzc2FnZV9zZXRfc2VxbnVtIChtc2csIGRlbXV4LT5zZWdtZW50X3NlcW51bSk7CisgICAgICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKGRlbXV4KSwgbXNnKTsKKworICAgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudF9kb25lIChHU1RfRk9STUFUX1RJTUUsIHN0b3ApOworICAgICAgICBpZiAoZGVtdXgtPnNlZ21lbnRfc2VxbnVtKQorICAgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgZGVtdXgtPnNlZ21lbnRfc2VxbnVtKTsKKyAgICAgICAgZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfZXZlbnQgKGRlbXV4LCBldmVudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwdXNoX2VvcyA9IFRSVUU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXQgPT0gR1NUX0ZMT1dfTk9UX0xJTktFRCB8fCByZXQgPCBHU1RfRkxPV19FT1MpIHsKKyAgICAgIC8qIGZvciBmYXRhbCBlcnJvcnMgd2UgcG9zdCBhbiBlcnJvciBtZXNzYWdlICovCisgICAgICBHU1RfRUxFTUVOVF9GTE9XX0VSUk9SIChkZW11eCwgcmV0KTsKKyAgICAgIHB1c2hfZW9zID0gVFJVRTsKKyAgICB9CisgICAgaWYgKHB1c2hfZW9zKSB7CisgICAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICAgIC8qIHNlbmQgRU9TLCBhbmQgcHJldmVudCBoYW5naW5nIGlmIG5vIHN0cmVhbXMgeWV0ICovCisgICAgICBHU1RfTE9HX09CSkVDVCAoZGVtdXgsICJTZW5kaW5nIEVPUywgYXQgZW5kIG9mIHN0cmVhbSIpOworICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2VvcyAoKTsKKyAgICAgIGlmIChkZW11eC0+c2VnbWVudF9zZXFudW0pCisgICAgICAgIGdzdF9ldmVudF9zZXRfc2VxbnVtIChldmVudCwgZGVtdXgtPnNlZ21lbnRfc2VxbnVtKTsKKyAgICAgIGlmICghZ3N0X21hdHJvc2thX2RlbXV4X3NlbmRfZXZlbnQgKGRlbXV4LCBldmVudCkgJiYKKyAgICAgICAgICAocmV0ID09IEdTVF9GTE9XX0VPUykpIHsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlbXV4LCBTVFJFQU0sIERFTVVYLAorICAgICAgICAgICAgKE5VTEwpLCAoImdvdCBlb3MgYnV0IG5vIHN0cmVhbXMgKHlldCkiKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgfQorfQorCisvKgorICogQ3JlYXRlIGFuZCBwdXNoIGEgZmx1c2hpbmcgc2VlayBldmVudCB1cHN0cmVhbQorICovCitzdGF0aWMgZ2Jvb2xlYW4KK3BlcmZvcm1fc2Vla190b19vZmZzZXQgKEdzdE1hdHJvc2thRGVtdXggKiBkZW11eCwgZ2RvdWJsZSByYXRlLCBndWludDY0IG9mZnNldCwKKyAgICBndWludDMyIHNlcW51bSwgR3N0U2Vla0ZsYWdzIGZsYWdzKQoreworICBHc3RFdmVudCAqZXZlbnQ7CisgIGdib29sZWFuIHJlcyA9IDA7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJTZWVraW5nIHRvICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG9mZnNldCk7CisKKyAgZXZlbnQgPQorICAgICAgZ3N0X2V2ZW50X25ld19zZWVrIChyYXRlLCBHU1RfRk9STUFUX0JZVEVTLAorICAgICAgZmxhZ3MgfCBHU1RfU0VFS19GTEFHX0ZMVVNIIHwgR1NUX1NFRUtfRkxBR19BQ0NVUkFURSwKKyAgICAgIEdTVF9TRUVLX1RZUEVfU0VULCBvZmZzZXQsIEdTVF9TRUVLX1RZUEVfTk9ORSwgLTEpOworICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZXZlbnQsIHNlcW51bSk7CisKKyAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChkZW11eC0+Y29tbW9uLnNpbmtwYWQsIGV2ZW50KTsKKworICAvKiBzZWdtZW50IGV2ZW50IHdpbGwgdXBkYXRlIG9mZnNldCAqLworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlbXV4X2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RNYXRyb3NrYURlbXV4ICpkZW11eCA9IEdTVF9NQVRST1NLQV9ERU1VWCAocGFyZW50KTsKKyAgZ3VpbnQgYXZhaWxhYmxlOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludCBuZWVkZWQgPSAwOworICBndWludDMyIGlkOworICBndWludDY0IGxlbmd0aDsKKworICBpZiAoR19VTkxJS0VMWSAoR1NUX0JVRkZFUl9JU19ESVNDT05UIChidWZmZXIpKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZ290IERJU0NPTlQiKTsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAoZGVtdXgtPmNvbW1vbi5hZGFwdGVyKTsKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKGRlbXV4KTsKKyAgICBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcmVzZXRfc3RyZWFtcyAoJmRlbXV4LT5jb21tb24sCisgICAgICAgIEdTVF9DTE9DS19USU1FX05PTkUsIEZBTFNFKTsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworICB9CisKKyAgZ3N0X2FkYXB0ZXJfcHVzaCAoZGVtdXgtPmNvbW1vbi5hZGFwdGVyLCBidWZmZXIpOworICBidWZmZXIgPSBOVUxMOworCituZXh0OgorICBhdmFpbGFibGUgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGRlbXV4LT5jb21tb24uYWRhcHRlcik7CisKKyAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BlZWtfaWRfbGVuZ3RoX3B1c2ggKCZkZW11eC0+Y29tbW9uLAorICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCAmaWQsICZsZW5ndGgsICZuZWVkZWQpOworICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LICYmIHJldCAhPSBHU1RfRkxPV19FT1MpKSB7CisgICAgaWYgKGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X2xlbmd0aCAhPSBHX01BWFVJTlQ2NAorICAgICAgICAmJiBkZW11eC0+Y29tbW9uLm9mZnNldCA+PQorICAgICAgICBkZW11eC0+Y29tbW9uLmVibWxfc2VnbWVudF9zdGFydCArIGRlbXV4LT5jb21tb24uZWJtbF9zZWdtZW50X2xlbmd0aCkgeworICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgIH0gZWxzZSB7CisgICAgICBnaW50NjQgYnl0ZXNfc2Nhbm5lZDsKKyAgICAgIGlmIChkZW11eC0+Y29tbW9uLnN0YXJ0X3Jlc3luY19vZmZzZXQgPT0gLTEpIHsKKyAgICAgICAgZGVtdXgtPmNvbW1vbi5zdGFydF9yZXN5bmNfb2Zmc2V0ID0gZGVtdXgtPmNvbW1vbi5vZmZzZXQ7CisgICAgICAgIGRlbXV4LT5jb21tb24uc3RhdGVfdG9fcmVzdG9yZSA9IGRlbXV4LT5jb21tb24uc3RhdGU7CisgICAgICB9CisgICAgICBieXRlc19zY2FubmVkID0gZGVtdXgtPmNvbW1vbi5vZmZzZXQgLSBkZW11eC0+Y29tbW9uLnN0YXJ0X3Jlc3luY19vZmZzZXQ7CisgICAgICBpZiAoYnl0ZXNfc2Nhbm5lZCA8PSBJTlZBTElEX0RBVEFfVEhSRVNIT0xEKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAicGFyc2UgZXJyb3IsIGxvb2tpbmcgZm9yIG5leHQgY2x1c3RlciwgYWN0dWFsIG9mZnNldCAlIgorICAgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiLCBzdGFydCByZXN5bmMgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICBkZW11eC0+Y29tbW9uLm9mZnNldCwgZGVtdXgtPmNvbW1vbi5zdGFydF9yZXN5bmNfb2Zmc2V0KTsKKyAgICAgICAgZGVtdXgtPmNvbW1vbi5zdGF0ZSA9IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX1NDQU5OSU5HOworICAgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgICAidW5yZWNvdmVyYWJsZSBwYXJzZSBlcnJvciwgbmV4dCBjbHVzdGVyIG5vdCBmb3VuZCBhbmQgdGhyZXNob2xkICIKKyAgICAgICAgICAgICJleGNlZWRlZCwgYnl0ZXMgc2Nhbm5lZCAlIiBHX0dJTlQ2NF9GT1JNQVQsIGJ5dGVzX3NjYW5uZWQpOworICAgICAgICByZXR1cm4gcmV0OworICAgICAgfQorICAgIH0KKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChkZW11eCwgIk9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFUICIsIEVsZW1lbnQgaWQgMHgleCwgIgorICAgICAgInNpemUgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBuZWVkZWQgJWQsIGF2YWlsYWJsZSAlZCIsCisgICAgICBkZW11eC0+Y29tbW9uLm9mZnNldCwgaWQsIGxlbmd0aCwgbmVlZGVkLCBhdmFpbGFibGUpOworCisgIGlmIChuZWVkZWQgPiBhdmFpbGFibGUpCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIHJldCA9IGdzdF9tYXRyb3NrYV9kZW11eF9wYXJzZV9pZCAoZGVtdXgsIGlkLCBsZW5ndGgsIG5lZWRlZCk7CisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRU9TKSB7CisgICAgLyogbmVlZCBtb3JlIGRhdGEgKi8KKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0gZWxzZSBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfSBlbHNlCisgICAgZ290byBuZXh0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9kZW11eF9oYW5kbGVfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKyAgR3N0TWF0cm9za2FEZW11eCAqZGVtdXggPSBHU1RfTUFUUk9TS0FfREVNVVggKHBhcmVudCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAiaGF2ZSBldmVudCB0eXBlICVzOiAlcCBvbiBzaW5rIHBhZCIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSwgZXZlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgeworICAgICAgY29uc3QgR3N0U2VnbWVudCAqc2VnbWVudDsKKworICAgICAgLyogc29tZSBkZWJ1ZyBvdXRwdXQgKi8KKyAgICAgIGdzdF9ldmVudF9wYXJzZV9zZWdtZW50IChldmVudCwgJnNlZ21lbnQpOworICAgICAgLyogRklYTUU6IGRvIHdlIG5lZWQgdG8gdXBkYXRlIHNlZ21lbnQgYmFzZSBoZXJlIChsaWtlIGFjY3VtIGluIDAuMTApPyAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsCisgICAgICAgICAgInJlY2VpdmVkIGZvcm1hdCAlZCBzZWdtZW50ICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwgc2VnbWVudC0+Zm9ybWF0LAorICAgICAgICAgIHNlZ21lbnQpOworCisgICAgICBpZiAoZGVtdXgtPmNvbW1vbi5zdGF0ZSA8IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0RBVEEpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJzdGlsbCBzdGFydGluZyIpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgICB9CisKKyAgICAgIC8qIHdlIG9ubHkgZXhwZWN0IGEgQllURSBzZWdtZW50LCBlLmcuIGZvbGxvd2luZyBhIHNlZWsgKi8KKyAgICAgIGlmIChzZWdtZW50LT5mb3JtYXQgIT0gR1NUX0ZPUk1BVF9CWVRFUykgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInVuc3VwcG9ydGVkIHNlZ21lbnQgZm9ybWF0LCBpZ25vcmluZyIpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgICB9CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiY2xlYXJpbmcgc2VnbWVudCBzdGF0ZSIpOworICAgICAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgICAgICAvKiBjbGVhciBjdXJyZW50IHNlZ21lbnQgbGVmdG92ZXIgKi8KKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChkZW11eC0+Y29tbW9uLmFkYXB0ZXIpOworICAgICAgLyogYW5kIHNvbWUgc3RyZWFtaW5nIHNldHVwICovCisgICAgICBkZW11eC0+Y29tbW9uLm9mZnNldCA9IHNlZ21lbnQtPnN0YXJ0OworICAgICAgLyogYWNjdW11bGF0ZSBiYXNlIGJhc2VkIG9uIGN1cnJlbnQgcG9zaXRpb24gKi8KKyAgICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZGVtdXgtPmNvbW1vbi5zZWdtZW50LnBvc2l0aW9uKSkKKyAgICAgICAgZGVtdXgtPmNvbW1vbi5zZWdtZW50LmJhc2UgKz0KKyAgICAgICAgICAgIChNQVggKGRlbXV4LT5jb21tb24uc2VnbWVudC5wb3NpdGlvbiwgZGVtdXgtPnN0cmVhbV9zdGFydF90aW1lKQorICAgICAgICAgICAgLSBkZW11eC0+c3RyZWFtX3N0YXJ0X3RpbWUpIC8gZmFicyAoZGVtdXgtPmNvbW1vbi5zZWdtZW50LnJhdGUpOworICAgICAgLyogZG8gbm90IGtub3cgd2hlcmUgd2UgYXJlOworICAgICAgICogbmVlZCB0byBjb21lIGFjcm9zcyBhIGNsdXN0ZXIgYW5kIGdlbmVyYXRlIHNlZ21lbnQgKi8KKyAgICAgIGRlbXV4LT5jb21tb24uc2VnbWVudC5wb3NpdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICBkZW11eC0+Y2x1c3Rlcl90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgIGRlbXV4LT5jbHVzdGVyX29mZnNldCA9IDA7CisgICAgICBkZW11eC0+bmVlZF9zZWdtZW50ID0gVFJVRTsKKyAgICAgIGRlbXV4LT5zZWdtZW50X3NlcW51bSA9IGdzdF9ldmVudF9nZXRfc2VxbnVtIChldmVudCk7CisgICAgICAvKiBidXQga2VlcCBzb21lIG9mIHRoZSB1cHN0cmVhbSBzZWdtZW50ICovCisgICAgICBkZW11eC0+Y29tbW9uLnNlZ21lbnQucmF0ZSA9IHNlZ21lbnQtPnJhdGU7CisgICAgICBkZW11eC0+Y29tbW9uLnNlZ21lbnQuZmxhZ3MgPSBzZWdtZW50LT5mbGFnczsKKyAgICAgIC8qIGFsc28gY2hlY2sgaWYgbmVlZCB0byBrZWVwIHNvbWUgb2YgdGhlIHJlcXVlc3RlZCBzZWVrIHBvc2l0aW9uICovCisgICAgICBpZiAoZGVtdXgtPnNlZWtfb2Zmc2V0ID09IHNlZ21lbnQtPnN0YXJ0KSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAicG9zaXRpb24gbWF0Y2hlcyByZXF1ZXN0ZWQgc2VlayIpOworICAgICAgICBkZW11eC0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb24gPSBkZW11eC0+cmVxdWVzdGVkX3NlZWtfdGltZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAidW5leHBlY3RlZCBzZWdtZW50IHBvc2l0aW9uIik7CisgICAgICB9CisgICAgICBkZW11eC0+cmVxdWVzdGVkX3NlZWtfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICBkZW11eC0+c2Vla19vZmZzZXQgPSAtMTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgZXhpdDoKKyAgICAgIC8qIGNoYWluIHdpbGwgc2VuZCBpbml0aWFsIHNlZ21lbnQgYWZ0ZXIgcGFkcyBoYXZlIGJlZW4gYWRkZWQsCisgICAgICAgKiBvciBvdGhlcndpc2UgY29tZSB1cCB3aXRoIG9uZSAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJlYXRpbmcgZXZlbnQiKTsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgeworICAgICAgaWYgKGRlbXV4LT5jb21tb24uc3RhdGUgIT0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfREFUQQorICAgICAgICAgICYmIGRlbXV4LT5jb21tb24uc3RhdGUgIT0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0NBTk5JTkcpIHsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZW11eCwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgICAgIChOVUxMKSwgKCJnb3QgZW9zIGFuZCBkaWRuJ3QgcmVjZWl2ZSBhIGNvbXBsZXRlIGhlYWRlciBvYmplY3QiKSk7CisgICAgICB9IGVsc2UgaWYgKGRlbXV4LT5jb21tb24ubnVtX3N0cmVhbXMgPT0gMCkgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZGVtdXgsIFNUUkVBTSwgREVNVVgsCisgICAgICAgICAgICAoTlVMTCksICgiZ290IGVvcyBidXQgbm8gc3RyZWFtcyAoeWV0KSIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9tYXRyb3NrYV9kZW11eF9zZW5kX2V2ZW50IChkZW11eCwgZXZlbnQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgeworICAgICAgZ3VpbnQ2NCBkdXI7CisKKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChkZW11eC0+Y29tbW9uLmFkYXB0ZXIpOworICAgICAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgICAgICBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcmVzZXRfc3RyZWFtcyAoJmRlbXV4LT5jb21tb24sCisgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSwgVFJVRSk7CisgICAgICBnc3RfZmxvd19jb21iaW5lcl9yZXNldCAoZGVtdXgtPmZsb3djb21iaW5lcik7CisgICAgICBkdXIgPSBkZW11eC0+Y29tbW9uLnNlZ21lbnQuZHVyYXRpb247CisgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmZGVtdXgtPmNvbW1vbi5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICAgICAgZGVtdXgtPmNvbW1vbi5zZWdtZW50LmR1cmF0aW9uID0gZHVyOworICAgICAgZGVtdXgtPmNsdXN0ZXJfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICBkZW11eC0+Y2x1c3Rlcl9vZmZzZXQgPSAwOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9kZW11eF9zaW5rX2FjdGl2YXRlIChHc3RQYWQgKiBzaW5rcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQpCit7CisgIEdzdE1hdHJvc2thRGVtdXggKmRlbXV4ID0gR1NUX01BVFJPU0tBX0RFTVVYIChwYXJlbnQpOworICBHc3RRdWVyeSAqcXVlcnk7CisgIGdib29sZWFuIHB1bGxfbW9kZSA9IEZBTFNFOworCisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19zY2hlZHVsaW5nICgpOworCisgIGlmIChnc3RfcGFkX3BlZXJfcXVlcnkgKHNpbmtwYWQsIHF1ZXJ5KSkKKyAgICBwdWxsX21vZGUgPSBnc3RfcXVlcnlfaGFzX3NjaGVkdWxpbmdfbW9kZV93aXRoX2ZsYWdzIChxdWVyeSwKKyAgICAgICAgR1NUX1BBRF9NT0RFX1BVTEwsIEdTVF9TQ0hFRFVMSU5HX0ZMQUdfU0VFS0FCTEUpOworCisgIGdzdF9xdWVyeV91bnJlZiAocXVlcnkpOworCisgIGlmIChwdWxsX21vZGUpIHsKKyAgICBHU1RfREVCVUcgKCJnb2luZyB0byBwdWxsIG1vZGUiKTsKKyAgICBkZW11eC0+c3RyZWFtaW5nID0gRkFMU0U7CisgICAgcmV0dXJuIGdzdF9wYWRfYWN0aXZhdGVfbW9kZSAoc2lua3BhZCwgR1NUX1BBRF9NT0RFX1BVTEwsIFRSVUUpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVRyAoImdvaW5nIHRvIHB1c2ggKHN0cmVhbWluZykgbW9kZSIpOworICAgIGRlbXV4LT5zdHJlYW1pbmcgPSBUUlVFOworICAgIHJldHVybiBnc3RfcGFkX2FjdGl2YXRlX21vZGUgKHNpbmtwYWQsIEdTVF9QQURfTU9ERV9QVVNILCBUUlVFKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9kZW11eF9zaW5rX2FjdGl2YXRlX21vZGUgKEdzdFBhZCAqIHNpbmtwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSkKK3sKKyAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBHU1RfUEFEX01PREVfUFVMTDoKKyAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgLyogaWYgd2UgaGF2ZSBhIHNjaGVkdWxlciB3ZSBjYW4gc3RhcnQgdGhlIHRhc2sgKi8KKyAgICAgICAgZ3N0X3BhZF9zdGFydF90YXNrIChzaW5rcGFkLCAoR3N0VGFza0Z1bmN0aW9uKSBnc3RfbWF0cm9za2FfZGVtdXhfbG9vcCwKKyAgICAgICAgICAgIHNpbmtwYWQsIE5VTEwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3N0X3BhZF9zdG9wX3Rhc2sgKHNpbmtwYWQpOworICAgICAgfQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgY2FzZSBHU1RfUEFEX01PREVfUFVTSDoKKyAgICAgIHJldHVybiBUUlVFOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X21hdHJvc2thX2RlbXV4X3ZpZGVvX2NhcHMgKEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQgKgorICAgIHZpZGVvY29udGV4dCwgY29uc3QgZ2NoYXIgKiBjb2RlY19pZCwgZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSwKKyAgICBnY2hhciAqKiBjb2RlY19uYW1lLCBndWludDMyICogcmlmZl9mb3VyY2MpCit7CisgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0ID0gKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICopIHZpZGVvY29udGV4dDsKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisKKyAgZ19hc3NlcnQgKHZpZGVvY29udGV4dCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGNvZGVjX25hbWUgIT0gTlVMTCk7CisKKyAgaWYgKHJpZmZfZm91cmNjKQorICAgICpyaWZmX2ZvdXJjYyA9IDA7CisKKyAgLyogVE9ETzogY2hlY2sgaWYgd2UgaGF2ZSBhbGwgY29kZWMgdHlwZXMgZnJvbSBtYXRyb3NrYS1pZHMuaAorICAgKiAgICAgICBjaGVjayBpZiB3ZSBoYXZlIHRvIGRvIG1vcmUgc3BlY2lhbCB0aGluZ3Mgd2l0aCBjb2RlY19wcml2YXRlCisgICAqCisgICAqIEFkZCBzdXBwb3J0IGZvcgorICAgKiAgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1FVSUNLVElNRQorICAgKiAgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1NOT1cKKyAgICovCisKKyAgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fVkZXX0ZPVVJDQykpIHsKKyAgICBnc3RfcmlmZl9zdHJmX3ZpZHMgKnZpZHMgPSBOVUxMOworCisgICAgaWYgKGRhdGEpIHsKKyAgICAgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKworICAgICAgdmlkcyA9IChnc3RfcmlmZl9zdHJmX3ZpZHMgKikgZGF0YTsKKworICAgICAgLyogYXNzdXJlIHNpemUgaXMgYmlnIGVub3VnaCAqLworICAgICAgaWYgKHNpemUgPCAyNCkgeworICAgICAgICBHU1RfV0FSTklORyAoIlRvbyBzbWFsbCBCSVRNQVBJTkZPSEVBREVSICglZCBieXRlcykiLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBpZiAoc2l6ZSA8IHNpemVvZiAoZ3N0X3JpZmZfc3RyZl92aWRzKSkgeworICAgICAgICB2aWRzID0gZ19uZXcgKGdzdF9yaWZmX3N0cmZfdmlkcywgMSk7CisgICAgICAgIG1lbWNweSAodmlkcywgZGF0YSwgc2l6ZSk7CisgICAgICB9CisKKyAgICAgIGNvbnRleHQtPmR0c19vbmx5ID0gVFJVRTsgLyogVkZXIGZpbGVzIG9ubHkgc3RvcmUgRFRTICovCisKKyAgICAgIC8qIGxpdHRsZS1lbmRpYW4gLT4gYnl0ZS1vcmRlciAqLworICAgICAgdmlkcy0+c2l6ZSA9IEdVSU5UMzJfRlJPTV9MRSAodmlkcy0+c2l6ZSk7CisgICAgICB2aWRzLT53aWR0aCA9IEdVSU5UMzJfRlJPTV9MRSAodmlkcy0+d2lkdGgpOworICAgICAgdmlkcy0+aGVpZ2h0ID0gR1VJTlQzMl9GUk9NX0xFICh2aWRzLT5oZWlnaHQpOworICAgICAgdmlkcy0+cGxhbmVzID0gR1VJTlQxNl9GUk9NX0xFICh2aWRzLT5wbGFuZXMpOworICAgICAgdmlkcy0+Yml0X2NudCA9IEdVSU5UMTZfRlJPTV9MRSAodmlkcy0+Yml0X2NudCk7CisgICAgICB2aWRzLT5jb21wcmVzc2lvbiA9IEdVSU5UMzJfRlJPTV9MRSAodmlkcy0+Y29tcHJlc3Npb24pOworICAgICAgdmlkcy0+aW1hZ2Vfc2l6ZSA9IEdVSU5UMzJfRlJPTV9MRSAodmlkcy0+aW1hZ2Vfc2l6ZSk7CisgICAgICB2aWRzLT54cGVsc19tZXRlciA9IEdVSU5UMzJfRlJPTV9MRSAodmlkcy0+eHBlbHNfbWV0ZXIpOworICAgICAgdmlkcy0+eXBlbHNfbWV0ZXIgPSBHVUlOVDMyX0ZST01fTEUgKHZpZHMtPnlwZWxzX21ldGVyKTsKKyAgICAgIHZpZHMtPm51bV9jb2xvcnMgPSBHVUlOVDMyX0ZST01fTEUgKHZpZHMtPm51bV9jb2xvcnMpOworICAgICAgdmlkcy0+aW1wX2NvbG9ycyA9IEdVSU5UMzJfRlJPTV9MRSAodmlkcy0+aW1wX2NvbG9ycyk7CisKKyAgICAgIGlmIChzaXplID4gc2l6ZW9mIChnc3RfcmlmZl9zdHJmX3ZpZHMpKSB7IC8qIHNvbWUgZXh0cmFfZGF0YSAqLworICAgICAgICBnc2l6ZSBvZmZzZXQgPSBzaXplb2YgKGdzdF9yaWZmX3N0cmZfdmlkcyk7CisKKyAgICAgICAgYnVmID0KKyAgICAgICAgICAgIGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGdfbWVtZHVwICgoZ3VpbnQ4ICopIHZpZHMgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgc2l6ZSAtIG9mZnNldCksIHNpemUgLSBvZmZzZXQpOworICAgICAgfQorCisgICAgICBpZiAocmlmZl9mb3VyY2MpCisgICAgICAgICpyaWZmX2ZvdXJjYyA9IHZpZHMtPmNvbXByZXNzaW9uOworCisgICAgICBjYXBzID0gZ3N0X3JpZmZfY3JlYXRlX3ZpZGVvX2NhcHMgKHZpZHMtPmNvbXByZXNzaW9uLCBOVUxMLCB2aWRzLAorICAgICAgICAgIGJ1ZiwgTlVMTCwgY29kZWNfbmFtZSk7CisKKyAgICAgIGlmIChjYXBzID09IE5VTEwpIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJVbmhhbmRsZWQgUklGRiBmb3VyY2MgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHZpZHMtPmNvbXByZXNzaW9uKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGF0aWMgR3N0U3RhdGljQ2FwcyBpbnRyYV9jYXBzID0gR1NUX1NUQVRJQ19DQVBTICgiaW1hZ2UvanBlZzsgIgorICAgICAgICAgICAgInZpZGVvL3gtcmF3OyBpbWFnZS9wbmc7IHZpZGVvL3gtZHY7IHZpZGVvL3gtaHVmZnl1djsgdmlkZW8veC1mZnY7ICIKKyAgICAgICAgICAgICJ2aWRlby94LWNvbXByZXNzZWQteXV2Iik7CisgICAgICAgIGNvbnRleHQtPmludHJhX29ubHkgPQorICAgICAgICAgICAgZ3N0X2NhcHNfY2FuX2ludGVyc2VjdCAoZ3N0X3N0YXRpY19jYXBzX2dldCAoJmludHJhX2NhcHMpLCBjYXBzKTsKKyAgICAgIH0KKworICAgICAgaWYgKGJ1ZikKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAgICAgaWYgKHZpZHMgIT0gKGdzdF9yaWZmX3N0cmZfdmlkcyAqKSBkYXRhKQorICAgICAgICBnX2ZyZWUgKHZpZHMpOworICAgIH0KKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1VOQ09NUFJFU1NFRCkpIHsKKyAgICBHc3RWaWRlb0luZm8gaW5mbzsKKyAgICBHc3RWaWRlb0Zvcm1hdCBmb3JtYXQ7CisKKyAgICBnc3RfdmlkZW9faW5mb19pbml0ICgmaW5mbyk7CisgICAgc3dpdGNoICh2aWRlb2NvbnRleHQtPmZvdXJjYykgeworICAgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdJJywgJzQnLCAnMicsICcwJyk6CisgICAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfSTQyMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ1knLCAnVScsICdZJywgJzInKToKKyAgICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnWScsICdWJywgJzEnLCAnMicpOgorICAgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1lWMTI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdVJywgJ1knLCAnVicsICdZJyk6CisgICAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfVVlWWTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ0EnLCAnWScsICdVJywgJ1YnKToKKyAgICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnWScsICc4JywgJzAnLCAnMCcpOgorICAgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdZJywgJzgnLCAnICcsICcgJyk6CisgICAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfR1JBWTg7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdSJywgJ0cnLCAnQicsIDI0KToKKyAgICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9SR0I7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfTUFLRV9GT1VSQ0MgKCdCJywgJ0cnLCAnUicsIDI0KToKKyAgICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9CR1I7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX0RFQlVHICgiVW5rbm93biBmb3VyY2MgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHZpZGVvY29udGV4dC0+Zm91cmNjKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNvbnRleHQtPmludHJhX29ubHkgPSBUUlVFOworCisgICAgZ3N0X3ZpZGVvX2luZm9fc2V0X2Zvcm1hdCAoJmluZm8sIGZvcm1hdCwgdmlkZW9jb250ZXh0LT5waXhlbF93aWR0aCwKKyAgICAgICAgdmlkZW9jb250ZXh0LT5waXhlbF9oZWlnaHQpOworICAgIGNhcHMgPSBnc3RfdmlkZW9faW5mb190b19jYXBzICgmaW5mbyk7CisgICAgKmNvZGVjX25hbWUgPSBnc3RfcGJfdXRpbHNfZ2V0X2NvZGVjX2Rlc2NyaXB0aW9uIChjYXBzKTsKKyAgICBjb250ZXh0LT5hbGlnbm1lbnQgPSAzMjsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX01QRUc0X1NQKSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1kaXZ4IiwKKyAgICAgICAgImRpdnh2ZXJzaW9uIiwgR19UWVBFX0lOVCwgNCwgTlVMTCk7CisgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cCAoIk1QRUctNCBzaW1wbGUgcHJvZmlsZSIpOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFRzRfQVNQKSB8fAorICAgICAgIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19NUEVHNF9BUCkpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL21wZWciLAorICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCA0LAorICAgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICBpZiAoZGF0YSkgeworICAgICAgR3N0QnVmZmVyICpwcml2OworCisgICAgICBwcml2ID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ19tZW1kdXAgKGRhdGEsIHNpemUpLCBzaXplKTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBwcml2LCBOVUxMKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHByaXYpOworCisgICAgICBnc3RfY29kZWNfdXRpbHNfbXBlZzR2aWRlb19jYXBzX3NldF9sZXZlbF9hbmRfcHJvZmlsZSAoY2FwcywgZGF0YSwgc2l6ZSk7CisgICAgfQorICAgIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX01QRUc0X0FTUCkpCisgICAgICAqY29kZWNfbmFtZSA9IGdfc3RyZHVwICgiTVBFRy00IGFkdmFuY2VkIHNpbXBsZSBwcm9maWxlIik7CisgICAgZWxzZQorICAgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cCAoIk1QRUctNCBhZHZhbmNlZCBwcm9maWxlIik7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19NU01QRUc0VjMpKSB7CisjaWYgMAorICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZnVsbCAoZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2aWRlby94LWRpdngiLAorICAgICAgICAgICAgImRpdnh2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMywgTlVMTCksCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgidmlkZW8veC1tc21wZWciLAorICAgICAgICAgICAgIm1zbXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCA0MywgTlVMTCksIE5VTEwpOworI2VuZGlmCisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LW1zbXBlZyIsCisgICAgICAgICJtc21wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgNDMsIE5VTEwpOworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXAgKCJNaWNyb3NvZnQgTVBFRy00IHYuMyIpOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFRzEpIHx8CisgICAgICAhc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX01QRUcyKSkgeworICAgIGdpbnQgbXBlZ3ZlcnNpb247CisKKyAgICBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19NUEVHMSkpCisgICAgICBtcGVndmVyc2lvbiA9IDE7CisgICAgZWxzZQorICAgICAgbXBlZ3ZlcnNpb24gPSAyOworCisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby9tcGVnIiwKKyAgICAgICAgInN5c3RlbXN0cmVhbSIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwKKyAgICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgbXBlZ3ZlcnNpb24sIE5VTEwpOworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiTVBFRy0lZCB2aWRlbyIsIG1wZWd2ZXJzaW9uKTsKKyAgICBjb250ZXh0LT5wb3N0cHJvY2Vzc19mcmFtZSA9IGdzdF9tYXRyb3NrYV9kZW11eF9hZGRfbXBlZ19zZXFfaGVhZGVyOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTUpQRUcpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJpbWFnZS9qcGVnIik7CisgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cCAoIk1vdGlvbi1KUEVHIik7CisgICAgY29udGV4dC0+aW50cmFfb25seSA9IFRSVUU7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19NUEVHNF9BVkMpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LWgyNjQiKTsKKyAgICBpZiAoZGF0YSkgeworICAgICAgR3N0QnVmZmVyICpwcml2OworCisgICAgICAvKiBGaXJzdCBieXRlIGlzIHRoZSB2ZXJzaW9uLCBzZWNvbmQgaXMgdGhlIHByb2ZpbGUgaW5kaWNhdGlvbiwgYW5kIHRoaXJkCisgICAgICAgKiBpcyB0aGUgNSBjb250cmFpbnRfc2V0X2ZsYWdzIGFuZCAzIHJlc2VydmVkIGJpdHMuIEZvdXJ0aCBieXRlIGlzIHRoZQorICAgICAgICogbGV2ZWwgaW5kaWNhdGlvbi4gKi8KKyAgICAgIGdzdF9jb2RlY191dGlsc19oMjY0X2NhcHNfc2V0X2xldmVsX2FuZF9wcm9maWxlIChjYXBzLCBkYXRhICsgMSwKKyAgICAgICAgICBzaXplIC0gMSk7CisKKyAgICAgIHByaXYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChnX21lbWR1cCAoZGF0YSwgc2l6ZSksIHNpemUpOworICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIHByaXYsIE5VTEwpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocHJpdik7CisKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgImF2YyIsCisgICAgICAgICAgImFsaWdubWVudCIsIEdfVFlQRV9TVFJJTkcsICJhdSIsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklORyAoIk5vIGNvZGVjIGRhdGEgZm91bmQsIGFzc3VtaW5nIG91dHB1dCBpcyBieXRlLXN0cmVhbSIpOworICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiYnl0ZS1zdHJlYW0iLAorICAgICAgICAgIE5VTEwpOworICAgIH0KKyAgICAqY29kZWNfbmFtZSA9IGdfc3RyZHVwICgiSDI2NCIpOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFR0hfSEVWQykpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtaDI2NSIpOworICAgIGlmIChkYXRhKSB7CisgICAgICBHc3RCdWZmZXIgKnByaXY7CisKKyAgICAgIGdzdF9jb2RlY191dGlsc19oMjY1X2NhcHNfc2V0X2xldmVsX3RpZXJfYW5kX3Byb2ZpbGUgKGNhcHMsIGRhdGEgKyAxLAorICAgICAgICAgIHNpemUgLSAxKTsKKworICAgICAgcHJpdiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGdfbWVtZHVwIChkYXRhLCBzaXplKSwgc2l6ZSk7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiY29kZWNfZGF0YSIsIEdTVF9UWVBFX0JVRkZFUiwgcHJpdiwgTlVMTCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChwcml2KTsKKworICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiaHZjMSIsCisgICAgICAgICAgImFsaWdubWVudCIsIEdfVFlQRV9TVFJJTkcsICJhdSIsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklORyAoIk5vIGNvZGVjIGRhdGEgZm91bmQsIGFzc3VtaW5nIG91dHB1dCBpcyBieXRlLXN0cmVhbSIpOworICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiYnl0ZS1zdHJlYW0iLAorICAgICAgICAgIE5VTEwpOworICAgIH0KKyAgICAqY29kZWNfbmFtZSA9IGdfc3RyZHVwICgiSEVWQyIpOworICB9IGVsc2UgaWYgKCghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1JFQUxWSURFTzEpKSB8fAorICAgICAgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fUkVBTFZJREVPMikpIHx8CisgICAgICAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19SRUFMVklERU8zKSkgfHwKKyAgICAgICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1JFQUxWSURFTzQpKSkgeworICAgIGdpbnQgcm12ZXJzaW9uID0gLTE7CisKKyAgICBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19SRUFMVklERU8xKSkKKyAgICAgIHJtdmVyc2lvbiA9IDE7CisgICAgZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19SRUFMVklERU8yKSkKKyAgICAgIHJtdmVyc2lvbiA9IDI7CisgICAgZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19SRUFMVklERU8zKSkKKyAgICAgIHJtdmVyc2lvbiA9IDM7CisgICAgZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19SRUFMVklERU80KSkKKyAgICAgIHJtdmVyc2lvbiA9IDQ7CisKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcG4tcmVhbHZpZGVvIiwKKyAgICAgICAgInJtdmVyc2lvbiIsIEdfVFlQRV9JTlQsIHJtdmVyc2lvbiwgTlVMTCk7CisgICAgR1NUX0RFQlVHICgiZGF0YTolcCwgc2l6ZToweCV4IiwgZGF0YSwgc2l6ZSk7CisgICAgLyogV2UgbmVlZCB0byBleHRyYWN0IHRoZSBleHRyYWRhdGEgISAqLworICAgIGlmIChkYXRhICYmIChzaXplID49IDB4MjIpKSB7CisgICAgICBHc3RCdWZmZXIgKnByaXY7CisgICAgICBndWludCByZm9ybWF0OworICAgICAgZ3VpbnQgc3ViZm9ybWF0OworCisgICAgICBzdWJmb3JtYXQgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEgKyAweDFhKTsKKyAgICAgIHJmb3JtYXQgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEgKyAweDFlKTsKKworICAgICAgcHJpdiA9CisgICAgICAgICAgZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ19tZW1kdXAgKGRhdGEgKyAweDFhLCBzaXplIC0gMHgxYSksCisgICAgICAgICAgc2l6ZSAtIDB4MWEpOworICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIHByaXYsICJmb3JtYXQiLAorICAgICAgICAgIEdfVFlQRV9JTlQsIHJmb3JtYXQsICJzdWJmb3JtYXQiLCBHX1RZUEVfSU5ULCBzdWJmb3JtYXQsIE5VTEwpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocHJpdik7CisKKyAgICB9CisgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJSZWFsVmlkZW8gJWQuMCIsIHJtdmVyc2lvbik7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19USEVPUkEpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LXRoZW9yYSIpOworICAgIGNvbnRleHQtPnN0cmVhbV9oZWFkZXJzID0KKyAgICAgICAgZ3N0X21hdHJvc2thX3BhcnNlX3hpcGhfc3RyZWFtX2hlYWRlcnMgKGNvbnRleHQtPmNvZGVjX3ByaXYsCisgICAgICAgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSk7CisgICAgLyogRklYTUU6IG1hcmsgc3RyZWFtIGFzIGJyb2tlbiBhbmQgc2tpcCBpZiB0aGVyZSBhcmUgbm8gc3RyZWFtIGhlYWRlcnMgKi8KKyAgICBjb250ZXh0LT5zZW5kX3N0cmVhbV9oZWFkZXJzID0gVFJVRTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX0RJUkFDKSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8veC1kaXJhYyIpOworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiRGlyYWMiKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1ZQOCkpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtdnA4Iik7CisgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJPbjIgVlA4Iik7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19WUDkpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LXZwOSIpOworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiT24yIFZQOSIpOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fQVYxKSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8veC1hdjEiKTsKKyAgICAqY29kZWNfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoIkFPTSBBVjEiKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1BST1JFUykpIHsKKyAgICBndWludDMyIGZvdXJjYzsKKyAgICBjb25zdCBnY2hhciAqdmFyaWFudCwgKnZhcmlhbnRfZGVzY3IgPSAiIjsKKworICAgIC8qIEV4cGVjdCBhIGZvdXJjYyBpbiB0aGUgY29kZWMgcHJpdmF0ZSBkYXRhICovCisgICAgaWYgKCFkYXRhIHx8IHNpemUgPCA0KSB7CisgICAgICBHU1RfV0FSTklORyAoIk5vIG9yIHRvbyBzbWFsbCBQUk9SRVNTIGZvdXJjYyAoJWQgYnl0ZXMpIiwgc2l6ZSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3VyY2MgPSBHU1RfU1RSX0ZPVVJDQyAoZGF0YSk7CisgICAgc3dpdGNoIChmb3VyY2MpIHsKKyAgICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnYScsICdwJywgJ2MnLCAncycpOgorICAgICAgICB2YXJpYW50X2Rlc2NyID0gIiA0OjI6MiBMVCI7CisgICAgICAgIHZhcmlhbnQgPSAibHQiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnYScsICdwJywgJ2MnLCAnaCcpOgorICAgICAgICB2YXJpYW50ID0gImhxIjsKKyAgICAgICAgdmFyaWFudF9kZXNjciA9ICIgNDoyOjIgSFEiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX01BS0VfRk9VUkNDICgnYScsICdwJywgJzQnLCAnaCcpOgorICAgICAgICB2YXJpYW50ID0gIjQ0NDQiOworICAgICAgICB2YXJpYW50X2Rlc2NyID0gIiA0OjQ6NDo0IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2EnLCAncCcsICdjJywgJ28nKToKKyAgICAgICAgdmFyaWFudCA9ICJwcm94eSI7CisgICAgICAgIHZhcmlhbnRfZGVzY3IgPSAiIDQ6MjoyIFByb3h5IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9NQUtFX0ZPVVJDQyAoJ2EnLCAncCcsICdjJywgJ24nKToKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHZhcmlhbnQgPSAic3RhbmRhcmQiOworICAgICAgICB2YXJpYW50X2Rlc2NyID0gIiA0OjI6MiBTRCI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIEdTVF9MT0cgKCJQcm9yZXMgdmlkZW8sIGNvZGVjIGZvdXJjYyAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3VyY2MpKTsKKworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1wcm9yZXMiLAorICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgdmFyaWFudCwgTlVMTCk7CisgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJBcHBsZSBQcm9SZXMlcyIsIHZhcmlhbnRfZGVzY3IpOworICAgIGNvbnRleHQtPnBvc3Rwcm9jZXNzX2ZyYW1lID0gZ3N0X21hdHJvc2thX2RlbXV4X2FkZF9wcm9yZXNfaGVhZGVyOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HICgiVW5rbm93biBjb2RlYyAnJXMnLCBjYW5ub3QgYnVpbGQgQ2FwcyIsIGNvZGVjX2lkKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChjYXBzICE9IE5VTEwpIHsKKyAgICBpbnQgaTsKKyAgICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7IGkrKykgeworICAgICAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSk7CisKKyAgICAgIC8qIEZJWE1FOiB1c2UgdGhlIHJlYWwgdW5pdCBoZXJlISAqLworICAgICAgR1NUX0RFQlVHICgidmlkZW8gc2l6ZSAlZHglZCwgdGFyZ2V0IGRpc3BsYXkgc2l6ZSAlZHglZCAoYW55IHVuaXQpIiwKKyAgICAgICAgICB2aWRlb2NvbnRleHQtPnBpeGVsX3dpZHRoLAorICAgICAgICAgIHZpZGVvY29udGV4dC0+cGl4ZWxfaGVpZ2h0LAorICAgICAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV93aWR0aCwgdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCk7CisKKyAgICAgIC8qIHBpeGVsIHdpZHRoIGFuZCBoZWlnaHQgYXJlIHRoZSB3IGFuZCBoIG9mIHRoZSB2aWRlbyBpbiBwaXhlbHMgKi8KKyAgICAgIGlmICh2aWRlb2NvbnRleHQtPnBpeGVsX3dpZHRoID4gMCAmJiB2aWRlb2NvbnRleHQtPnBpeGVsX2hlaWdodCA+IDApIHsKKyAgICAgICAgZ2ludCB3ID0gdmlkZW9jb250ZXh0LT5waXhlbF93aWR0aDsKKyAgICAgICAgZ2ludCBoID0gdmlkZW9jb250ZXh0LT5waXhlbF9oZWlnaHQ7CisKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cnVjdHVyZSwKKyAgICAgICAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHcsICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBoLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgaWYgKHZpZGVvY29udGV4dC0+ZGlzcGxheV93aWR0aCA+IDAgfHwgdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCA+IDApIHsKKyAgICAgICAgaW50IG4sIGQ7CisKKyAgICAgICAgaWYgKHZpZGVvY29udGV4dC0+ZGlzcGxheV93aWR0aCA8PSAwKQorICAgICAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV93aWR0aCA9IHZpZGVvY29udGV4dC0+cGl4ZWxfd2lkdGg7CisgICAgICAgIGlmICh2aWRlb2NvbnRleHQtPmRpc3BsYXlfaGVpZ2h0IDw9IDApCisgICAgICAgICAgdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCA9IHZpZGVvY29udGV4dC0+cGl4ZWxfaGVpZ2h0OworCisgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgcGl4ZWwgYXNwZWN0IHJhdGlvIHVzaW5nIHRoZSBkaXNwbGF5IGFuZCBwaXhlbCB3L2ggKi8KKyAgICAgICAgbiA9IHZpZGVvY29udGV4dC0+ZGlzcGxheV93aWR0aCAqIHZpZGVvY29udGV4dC0+cGl4ZWxfaGVpZ2h0OworICAgICAgICBkID0gdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCAqIHZpZGVvY29udGV4dC0+cGl4ZWxfd2lkdGg7CisgICAgICAgIEdTVF9ERUJVRyAoInNldHRpbmcgUEFSIHRvICVkLyVkIiwgbiwgZCk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzdHJ1Y3R1cmUsICJwaXhlbC1hc3BlY3QtcmF0aW8iLAorICAgICAgICAgICAgR1NUX1RZUEVfRlJBQ1RJT04sCisgICAgICAgICAgICB2aWRlb2NvbnRleHQtPmRpc3BsYXlfd2lkdGggKiB2aWRlb2NvbnRleHQtPnBpeGVsX2hlaWdodCwKKyAgICAgICAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV9oZWlnaHQgKiB2aWRlb2NvbnRleHQtPnBpeGVsX3dpZHRoLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgaWYgKHZpZGVvY29udGV4dC0+ZGVmYXVsdF9mcHMgPiAwLjApIHsKKyAgICAgICAgZ2ludCBmcHNfbiwgZnBzX2Q7CisKKyAgICAgICAgZ3N0X3V0aWxfZG91YmxlX3RvX2ZyYWN0aW9uICh2aWRlb2NvbnRleHQtPmRlZmF1bHRfZnBzLCAmZnBzX24sICZmcHNfZCk7CisKKyAgICAgICAgR1NUX0RFQlVHICgidXNpbmcgZGVmYXVsdCBmcHMgJWQvJWQiLCBmcHNfbiwgZnBzX2QpOworCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzdHJ1Y3R1cmUsICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwgZnBzX24sCisgICAgICAgICAgICBmcHNfZCwgTlVMTCk7CisgICAgICB9IGVsc2UgaWYgKGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24gPiAwKSB7CisgICAgICAgIGludCBmcHNfbiwgZnBzX2Q7CisKKyAgICAgICAgZ3N0X3ZpZGVvX2d1ZXNzX2ZyYW1lcmF0ZSAoY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbiwgJmZwc19uLCAmZnBzX2QpOworCisgICAgICAgIEdTVF9JTkZPICgidXNpbmcgZGVmYXVsdCBkdXJhdGlvbiAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgICAiIGZyYW1lcmF0ZSAlZC8lZCIsIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24sIGZwc19uLCBmcHNfZCk7CisKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cnVjdHVyZSwgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLAorICAgICAgICAgICAgZnBzX24sIGZwc19kLCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzdHJ1Y3R1cmUsICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwKKyAgICAgICAgICAgIDAsIDEsIE5VTEwpOworICAgICAgfQorCisgICAgICBpZiAodmlkZW9jb250ZXh0LT5wYXJlbnQuZmxhZ3MgJiBHU1RfTUFUUk9TS0FfVklERU9UUkFDS19JTlRFUkxBQ0VEKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLCAiaW50ZXJsYWNlLW1vZGUiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICAgICAgIm1peGVkIiwgTlVMTCk7CisgICAgfQorICAgIGlmICh2aWRlb2NvbnRleHQtPm11bHRpdmlld19tb2RlICE9IEdTVF9WSURFT19NVUxUSVZJRVdfTU9ERV9OT05FKSB7CisgICAgICBpZiAoZ3N0X3ZpZGVvX211bHRpdmlld19ndWVzc19oYWxmX2FzcGVjdCAodmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfbW9kZSwKKyAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5waXhlbF93aWR0aCwgdmlkZW9jb250ZXh0LT5waXhlbF9oZWlnaHQsCisgICAgICAgICAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV93aWR0aCAqIHZpZGVvY29udGV4dC0+cGl4ZWxfaGVpZ2h0LAorICAgICAgICAgICAgICB2aWRlb2NvbnRleHQtPmRpc3BsYXlfaGVpZ2h0ICogdmlkZW9jb250ZXh0LT5waXhlbF93aWR0aCkpIHsKKyAgICAgICAgdmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfZmxhZ3MgfD0gR1NUX1ZJREVPX01VTFRJVklFV19GTEFHU19IQUxGX0FTUEVDVDsKKyAgICAgIH0KKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsCisgICAgICAgICAgIm11bHRpdmlldy1tb2RlIiwgR19UWVBFX1NUUklORywKKyAgICAgICAgICBnc3RfdmlkZW9fbXVsdGl2aWV3X21vZGVfdG9fY2Fwc19zdHJpbmcKKyAgICAgICAgICAodmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfbW9kZSksICJtdWx0aXZpZXctZmxhZ3MiLAorICAgICAgICAgIEdTVF9UWVBFX1ZJREVPX01VTFRJVklFV19GTEFHU0VULCB2aWRlb2NvbnRleHQtPm11bHRpdmlld19mbGFncywKKyAgICAgICAgICBHU1RfRkxBR19TRVRfTUFTS19FWEFDVCwgTlVMTCk7CisgICAgfQorCisgICAgaWYgKHZpZGVvY29udGV4dC0+Y29sb3JpbWV0cnkucmFuZ2UgIT0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFX1VOS05PV04gfHwKKyAgICAgICAgdmlkZW9jb250ZXh0LT5jb2xvcmltZXRyeS5tYXRyaXggIT0gR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9VTktOT1dOIHx8CisgICAgICAgIHZpZGVvY29udGV4dC0+Y29sb3JpbWV0cnkudHJhbnNmZXIgIT0gR1NUX1ZJREVPX1RSQU5TRkVSX1VOS05PV04gfHwKKyAgICAgICAgdmlkZW9jb250ZXh0LT5jb2xvcmltZXRyeS5wcmltYXJpZXMgIT0KKyAgICAgICAgR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19VTktOT1dOKSB7CisgICAgICBnY2hhciAqY29sb3JpbWV0cnkgPQorICAgICAgICAgIGdzdF92aWRlb19jb2xvcmltZXRyeV90b19zdHJpbmcgKCZ2aWRlb2NvbnRleHQtPmNvbG9yaW1ldHJ5KTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjb2xvcmltZXRyeSIsIEdfVFlQRV9TVFJJTkcsIGNvbG9yaW1ldHJ5LAorICAgICAgICAgIE5VTEwpOworICAgICAgR1NUX0RFQlVHICgic2V0dGluZyBjb2xvcmltZXRyeSB0byAlcyIsIGNvbG9yaW1ldHJ5KTsKKyAgICAgIGdfZnJlZSAoY29sb3JpbWV0cnkpOworICAgIH0KKworICAgIGNhcHMgPSBnc3RfY2Fwc19zaW1wbGlmeSAoY2Fwcyk7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworLyoKKyAqIFNvbWUgQUFDIHNwZWNpZmljIGNvZGUuLi4gKnNpZ2gqCisgKiBGSVhNRTogbWF5YmUgd2Ugc2hvdWxkIHVzZSAnMTUnIGFuZCBjb2RlIHRoZSBzYW1wbGUgcmF0ZSBleHBsaWNpdGx5CisgKiBpZiB0aGUgc2FtcGxlIHJhdGUgZG9lc24ndCBtYXRjaCB0aGUgcHJlZGVmaW5lZCByYXRlcyBleGFjdGx5PyAodHBtKQorICovCisKK3N0YXRpYyBnaW50CithYWNfcmF0ZV9pZHggKGdpbnQgcmF0ZSkKK3sKKyAgaWYgKDkyMDE3IDw9IHJhdGUpCisgICAgcmV0dXJuIDA7CisgIGVsc2UgaWYgKDc1MTMyIDw9IHJhdGUpCisgICAgcmV0dXJuIDE7CisgIGVsc2UgaWYgKDU1NDI2IDw9IHJhdGUpCisgICAgcmV0dXJuIDI7CisgIGVsc2UgaWYgKDQ2MDA5IDw9IHJhdGUpCisgICAgcmV0dXJuIDM7CisgIGVsc2UgaWYgKDM3NTY2IDw9IHJhdGUpCisgICAgcmV0dXJuIDQ7CisgIGVsc2UgaWYgKDI3NzEzIDw9IHJhdGUpCisgICAgcmV0dXJuIDU7CisgIGVsc2UgaWYgKDIzMDA0IDw9IHJhdGUpCisgICAgcmV0dXJuIDY7CisgIGVsc2UgaWYgKDE4NzgzIDw9IHJhdGUpCisgICAgcmV0dXJuIDc7CisgIGVsc2UgaWYgKDEzODU2IDw9IHJhdGUpCisgICAgcmV0dXJuIDg7CisgIGVsc2UgaWYgKDExNTAyIDw9IHJhdGUpCisgICAgcmV0dXJuIDk7CisgIGVsc2UgaWYgKDkzOTEgPD0gcmF0ZSkKKyAgICByZXR1cm4gMTA7CisgIGVsc2UKKyAgICByZXR1cm4gMTE7Cit9CisKK3N0YXRpYyBnaW50CithYWNfcHJvZmlsZV9pZHggKGNvbnN0IGdjaGFyICogY29kZWNfaWQpCit7CisgIGdpbnQgcHJvZmlsZTsKKworICBpZiAoc3RybGVuIChjb2RlY19pZCkgPD0gMTIpCisgICAgcHJvZmlsZSA9IDM7CisgIGVsc2UgaWYgKCFzdHJuY21wICgmY29kZWNfaWRbMTJdLCAiTUFJTiIsIDQpKQorICAgIHByb2ZpbGUgPSAwOworICBlbHNlIGlmICghc3RybmNtcCAoJmNvZGVjX2lkWzEyXSwgIkxDIiwgMikpCisgICAgcHJvZmlsZSA9IDE7CisgIGVsc2UgaWYgKCFzdHJuY21wICgmY29kZWNfaWRbMTJdLCAiU1NSIiwgMykpCisgICAgcHJvZmlsZSA9IDI7CisgIGVsc2UKKyAgICBwcm9maWxlID0gMzsKKworICByZXR1cm4gcHJvZmlsZTsKK30KKworc3RhdGljIGd1aW50Cityb3VuZF91cF9wb3cyIChndWludCBuKQoreworICBuID0gbiAtIDE7CisgIG4gPSBuIHwgKG4gPj4gMSk7CisgIG4gPSBuIHwgKG4gPj4gMik7CisgIG4gPSBuIHwgKG4gPj4gNCk7CisgIG4gPSBuIHwgKG4gPj4gOCk7CisgIG4gPSBuIHwgKG4gPj4gMTYpOworICByZXR1cm4gbiArIDE7Cit9CisKKyNkZWZpbmUgQUFDX1NZTkNfRVhURU5TSU9OX1RZUEUgMHgwMmI3CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9tYXRyb3NrYV9kZW11eF9hdWRpb19jYXBzIChHc3RNYXRyb3NrYVRyYWNrQXVkaW9Db250ZXh0ICoKKyAgICBhdWRpb2NvbnRleHQsIGNvbnN0IGdjaGFyICogY29kZWNfaWQsIGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsCisgICAgZ2NoYXIgKiogY29kZWNfbmFtZSwgZ3VpbnQxNiAqIHJpZmZfYXVkaW9fZm10KQoreworICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqY29udGV4dCA9IChHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqKSBhdWRpb2NvbnRleHQ7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworCisgIGdfYXNzZXJ0IChhdWRpb2NvbnRleHQgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChjb2RlY19uYW1lICE9IE5VTEwpOworCisgIGlmIChyaWZmX2F1ZGlvX2ZtdCkKKyAgICAqcmlmZl9hdWRpb19mbXQgPSAwOworCisgIC8qIFRPRE86IGNoZWNrIGlmIHdlIGhhdmUgYWxsIGNvZGVjIHR5cGVzIGZyb20gbWF0cm9za2EtaWRzLmgKKyAgICogICAgICAgY2hlY2sgaWYgd2UgaGF2ZSB0byBkbyBtb3JlIHNwZWNpYWwgdGhpbmdzIHdpdGggY29kZWNfcHJpdmF0ZQorICAgKiAgICAgICBjaGVjayBpZiB3ZSBuZWVkIGJpdGRlcHRoIGluIGRpZmZlcmVudCBwbGFjZXMgdG9vCisgICAqICAgICAgIGltcGxlbWVudCBjaGFubmVsIHBvc2l0aW9uIG1hZ2ljCisgICAqIEFkZCBzdXBwb3J0IGZvcjoKKyAgICogIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19BQzNfQlNJRDkKKyAgICogIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19BQzNfQlNJRDEwCisgICAqICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUVVJQ0tUSU1FX1FETUMKKyAgICogIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19RVUlDS1RJTUVfUURNMgorICAgKi8KKworICBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19NUEVHMV9MMSkgfHwKKyAgICAgICFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fTVBFRzFfTDIpIHx8CisgICAgICAhc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX01QRUcxX0wzKSkgeworICAgIGdpbnQgbGF5ZXI7CisKKyAgICBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19NUEVHMV9MMSkpCisgICAgICBsYXllciA9IDE7CisgICAgZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19NUEVHMV9MMikpCisgICAgICBsYXllciA9IDI7CisgICAgZWxzZQorICAgICAgbGF5ZXIgPSAzOworCisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9tcGVnIiwKKyAgICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMSwgImxheWVyIiwgR19UWVBFX0lOVCwgbGF5ZXIsIE5VTEwpOworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiTVBFRy0xIGxheWVyICVkIiwgbGF5ZXIpOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUENNX0lOVF9CRSkgfHwKKyAgICAgICFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUENNX0lOVF9MRSkpIHsKKyAgICBnYm9vbGVhbiBzaWduOworICAgIGdpbnQgZW5kaWFubmVzczsKKyAgICBHc3RBdWRpb0Zvcm1hdCBmb3JtYXQ7CisKKyAgICBzaWduID0gKGF1ZGlvY29udGV4dC0+Yml0ZGVwdGggIT0gOCk7CisgICAgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUENNX0lOVF9CRSkpCisgICAgICBlbmRpYW5uZXNzID0gR19CSUdfRU5ESUFOOworICAgIGVsc2UKKyAgICAgIGVuZGlhbm5lc3MgPSBHX0xJVFRMRV9FTkRJQU47CisKKyAgICBmb3JtYXQgPSBnc3RfYXVkaW9fZm9ybWF0X2J1aWxkX2ludGVnZXIgKHNpZ24sIGVuZGlhbm5lc3MsCisgICAgICAgIGF1ZGlvY29udGV4dC0+Yml0ZGVwdGgsIGF1ZGlvY29udGV4dC0+Yml0ZGVwdGgpOworCisgICAgLyogRklYTUU6IENoYW5uZWwgbWFzayBhbmQgcmVvcmRlcmluZyAqLworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgZ3N0X2F1ZGlvX2Zvcm1hdF90b19zdHJpbmcgKGZvcm1hdCksCisgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAiaW50ZXJsZWF2ZWQiLAorICAgICAgICAiY2hhbm5lbC1tYXNrIiwgR1NUX1RZUEVfQklUTUFTSywKKyAgICAgICAgZ3N0X2F1ZGlvX2NoYW5uZWxfZ2V0X2ZhbGxiYWNrX21hc2sgKGF1ZGlvY29udGV4dC0+Y2hhbm5lbHMpLCBOVUxMKTsKKworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiUmF3ICVkLWJpdCBQQ00gYXVkaW8iLAorICAgICAgICBhdWRpb2NvbnRleHQtPmJpdGRlcHRoKTsKKyAgICBjb250ZXh0LT5hbGlnbm1lbnQgPSBHU1RfUk9VTkRfVVBfOCAoYXVkaW9jb250ZXh0LT5iaXRkZXB0aCkgLyA4OworICAgIGNvbnRleHQtPmFsaWdubWVudCA9IHJvdW5kX3VwX3BvdzIgKGNvbnRleHQtPmFsaWdubWVudCk7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19QQ01fRkxPQVQpKSB7CisgICAgY29uc3QgZ2NoYXIgKmZvcm1hdDsKKyAgICBpZiAoYXVkaW9jb250ZXh0LT5iaXRkZXB0aCA9PSAzMikKKyAgICAgIGZvcm1hdCA9ICJGMzJMRSI7CisgICAgZWxzZQorICAgICAgZm9ybWF0ID0gIkY2NExFIjsKKyAgICAvKiBGSVhNRTogQ2hhbm5lbCBtYXNrIGFuZCByZW9yZGVyaW5nICovCisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBmb3JtYXQsCisgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAiaW50ZXJsZWF2ZWQiLAorICAgICAgICAiY2hhbm5lbC1tYXNrIiwgR1NUX1RZUEVfQklUTUFTSywKKyAgICAgICAgZ3N0X2F1ZGlvX2NoYW5uZWxfZ2V0X2ZhbGxiYWNrX21hc2sgKGF1ZGlvY29udGV4dC0+Y2hhbm5lbHMpLCBOVUxMKTsKKyAgICAqY29kZWNfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoIlJhdyAlZC1iaXQgZmxvYXRpbmctcG9pbnQgYXVkaW8iLAorICAgICAgICBhdWRpb2NvbnRleHQtPmJpdGRlcHRoKTsKKyAgICBjb250ZXh0LT5hbGlnbm1lbnQgPSBhdWRpb2NvbnRleHQtPmJpdGRlcHRoIC8gODsKKyAgICBjb250ZXh0LT5hbGlnbm1lbnQgPSByb3VuZF91cF9wb3cyIChjb250ZXh0LT5hbGlnbm1lbnQpOworICB9IGVsc2UgaWYgKCFzdHJuY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX0FDMywKKyAgICAgICAgICBzdHJsZW4gKEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19BQzMpKSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1hYzMiLAorICAgICAgICAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXAgKCJBQy0zIGF1ZGlvIik7CisgIH0gZWxzZSBpZiAoIXN0cm5jbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fRUFDMywKKyAgICAgICAgICBzdHJsZW4gKEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19FQUMzKSkpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtZWFjMyIsCisgICAgICAgICJmcmFtZWQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cCAoIkUtQUMtMyBhdWRpbyIpOworICB9IGVsc2UgaWYgKCFzdHJuY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1RSVUVIRCwKKyAgICAgICAgICBzdHJsZW4gKEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19UUlVFSEQpKSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC10cnVlLWhkIik7CisgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cCAoIkRvbGJ5IFRydWVIRCIpOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fRFRTKSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC1kdHMiKTsKKyAgICAqY29kZWNfbmFtZSA9IGdfc3RyZHVwICgiRFRTIGF1ZGlvIik7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19WT1JCSVMpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby94LXZvcmJpcyIpOworICAgIGNvbnRleHQtPnN0cmVhbV9oZWFkZXJzID0KKyAgICAgICAgZ3N0X21hdHJvc2thX3BhcnNlX3hpcGhfc3RyZWFtX2hlYWRlcnMgKGNvbnRleHQtPmNvZGVjX3ByaXYsCisgICAgICAgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSk7CisgICAgLyogRklYTUU6IG1hcmsgc3RyZWFtIGFzIGJyb2tlbiBhbmQgc2tpcCBpZiB0aGVyZSBhcmUgbm8gc3RyZWFtIGhlYWRlcnMgKi8KKyAgICBjb250ZXh0LT5zZW5kX3N0cmVhbV9oZWFkZXJzID0gVFJVRTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX0ZMQUMpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby94LWZsYWMiKTsKKyAgICBjb250ZXh0LT5zdHJlYW1faGVhZGVycyA9CisgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9mbGFjX3N0cmVhbV9oZWFkZXJzIChjb250ZXh0LT5jb2RlY19wcml2LAorICAgICAgICBjb250ZXh0LT5jb2RlY19wcml2X3NpemUpOworICAgIC8qIEZJWE1FOiBtYXJrIHN0cmVhbSBhcyBicm9rZW4gYW5kIHNraXAgaWYgdGhlcmUgYXJlIG5vIHN0cmVhbSBoZWFkZXJzICovCisgICAgY29udGV4dC0+c2VuZF9zdHJlYW1faGVhZGVycyA9IFRSVUU7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19TUEVFWCkpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtc3BlZXgiKTsKKyAgICBjb250ZXh0LT5zdHJlYW1faGVhZGVycyA9CisgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9zcGVleF9zdHJlYW1faGVhZGVycyAoY29udGV4dC0+Y29kZWNfcHJpdiwKKyAgICAgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplKTsKKyAgICAvKiBGSVhNRTogbWFyayBzdHJlYW0gYXMgYnJva2VuIGFuZCBza2lwIGlmIHRoZXJlIGFyZSBubyBzdHJlYW0gaGVhZGVycyAqLworICAgIGNvbnRleHQtPnNlbmRfc3RyZWFtX2hlYWRlcnMgPSBUUlVFOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fT1BVUykpIHsKKyAgICBHc3RCdWZmZXIgKnRtcDsKKworICAgIGlmIChjb250ZXh0LT5jb2RlY19wcml2X3NpemUgPj0gMTkpIHsKKyAgICAgIGlmIChhdWRpb2NvbnRleHQtPnNhbXBsZXJhdGUpCisgICAgICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKChndWludDggKikgY29udGV4dC0+Y29kZWNfcHJpdiArIDEyLAorICAgICAgICAgICAgYXVkaW9jb250ZXh0LT5zYW1wbGVyYXRlKTsKKyAgICAgIGlmIChjb250ZXh0LT5jb2RlY19kZWxheSkgeworICAgICAgICBndWludDY0IGRlbGF5ID0KKyAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAoY29udGV4dC0+Y29kZWNfZGVsYXksIDQ4MDAwLAorICAgICAgICAgICAgR1NUX1NFQ09ORCk7CisgICAgICAgIEdTVF9XUklURV9VSU5UMTZfTEUgKChndWludDggKikgY29udGV4dC0+Y29kZWNfcHJpdiArIDEwLCBkZWxheSk7CisgICAgICB9CisKKyAgICAgIHRtcCA9CisgICAgICAgICAgZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ19tZW1kdXAgKGNvbnRleHQtPmNvZGVjX3ByaXYsCisgICAgICAgICAgICAgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSksIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSk7CisgICAgICBjYXBzID0gZ3N0X2NvZGVjX3V0aWxzX29wdXNfY3JlYXRlX2NhcHNfZnJvbV9oZWFkZXIgKHRtcCwgTlVMTCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmICh0bXApOworICAgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cCAoIk9wdXMiKTsKKyAgICB9IGVsc2UgaWYgKGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA9PSAwKSB7CisgICAgICBHU1RfV0FSTklORyAoIk5vIE9wdXMgY29kZWMgZGF0YSBmb3VuZCwgdHJ5aW5nIHRvIGNyZWF0ZSBvbmUiKTsKKyAgICAgIGlmIChhdWRpb2NvbnRleHQtPmNoYW5uZWxzIDw9IDIpIHsKKyAgICAgICAgZ3VpbnQ4IHN0cmVhbXMsIGNvdXBsZWQsIGNoYW5uZWxzOworICAgICAgICBndWludDMyIHNhbXBsZXJhdGU7CisKKyAgICAgICAgc2FtcGxlcmF0ZSA9CisgICAgICAgICAgICBhdWRpb2NvbnRleHQtPnNhbXBsZXJhdGUgPT0gMCA/IDQ4MDAwIDogYXVkaW9jb250ZXh0LT5zYW1wbGVyYXRlOworICAgICAgICBjaGFubmVscyA9IGF1ZGlvY29udGV4dC0+Y2hhbm5lbHMgPT0gMCA/IDIgOiBhdWRpb2NvbnRleHQtPmNoYW5uZWxzOworICAgICAgICBpZiAoY2hhbm5lbHMgPT0gMSkgeworICAgICAgICAgIHN0cmVhbXMgPSAxOworICAgICAgICAgIGNvdXBsZWQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0cmVhbXMgPSAxOworICAgICAgICAgIGNvdXBsZWQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgY2FwcyA9CisgICAgICAgICAgICBnc3RfY29kZWNfdXRpbHNfb3B1c19jcmVhdGVfY2FwcyAoc2FtcGxlcmF0ZSwgY2hhbm5lbHMsIDAsIHN0cmVhbXMsCisgICAgICAgICAgICBjb3VwbGVkLCBOVUxMKTsKKyAgICAgICAgaWYgKGNhcHMpIHsKKyAgICAgICAgICAqY29kZWNfbmFtZSA9IGdfc3RyZHVwICgiT3B1cyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9XQVJOSU5HICgiRmFpbGVkIHRvIGNyZWF0ZSBPcHVzIGNhcHMgZnJvbSBhdWRpbyBjb250ZXh0Iik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9XQVJOSU5HICgiTm8gT3B1cyBjb2RlYyBkYXRhLCBhbmQgbm90IGVub3VnaCBpbmZvIHRvIGNyZWF0ZSBvbmUiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkcgKCJJbnZhbGlkIE9wdXMgY29kZWMgZGF0YSBzaXplIChnb3QgJSIgR19HU0laRV9GT1JNQVQKKyAgICAgICAgICAiLCBleHBlY3RlZCAxOSkiLCBjb250ZXh0LT5jb2RlY19wcml2X3NpemUpOworICAgIH0KKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX0FDTSkpIHsKKyAgICBnc3RfcmlmZl9zdHJmX2F1ZHMgYXVkczsKKworICAgIGlmIChkYXRhICYmIHNpemUgPj0gMTgpIHsKKyAgICAgIEdzdEJ1ZmZlciAqY29kZWNfZGF0YSA9IE5VTEw7CisKKyAgICAgIC8qIGxpdHRsZS1lbmRpYW4gLT4gYnl0ZS1vcmRlciAqLworICAgICAgYXVkcy5mb3JtYXQgPSBHU1RfUkVBRF9VSU5UMTZfTEUgKGRhdGEpOworICAgICAgYXVkcy5jaGFubmVscyA9IEdTVF9SRUFEX1VJTlQxNl9MRSAoZGF0YSArIDIpOworICAgICAgYXVkcy5yYXRlID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhICsgNCk7CisgICAgICBhdWRzLmF2X2JwcyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDgpOworICAgICAgYXVkcy5ibG9ja2FsaWduID0gR1NUX1JFQURfVUlOVDE2X0xFIChkYXRhICsgMTIpOworICAgICAgYXVkcy5iaXRzX3Blcl9zYW1wbGUgPSBHU1RfUkVBRF9VSU5UMTZfTEUgKGRhdGEgKyAxNik7CisKKyAgICAgIC8qIDE4IGlzIHRoZSB3YXZlZm9ybWF0ZXggc2l6ZSAqLworICAgICAgaWYgKHNpemUgPiAxOCkgeworICAgICAgICBjb2RlY19kYXRhID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksCisgICAgICAgICAgICBkYXRhICsgMTgsIHNpemUgLSAxOCwgMCwgc2l6ZSAtIDE4LCBOVUxMLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgaWYgKHJpZmZfYXVkaW9fZm10KQorICAgICAgICAqcmlmZl9hdWRpb19mbXQgPSBhdWRzLmZvcm1hdDsKKworICAgICAgLyogRklYTUU6IEhhbmRsZSByZW9yZGVyIG1hcCAqLworICAgICAgY2FwcyA9IGdzdF9yaWZmX2NyZWF0ZV9hdWRpb19jYXBzIChhdWRzLmZvcm1hdCwgTlVMTCwgJmF1ZHMsIE5VTEwsCisgICAgICAgICAgY29kZWNfZGF0YSwgY29kZWNfbmFtZSwgTlVMTCk7CisgICAgICBpZiAoY29kZWNfZGF0YSkKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoY29kZWNfZGF0YSk7CisKKyAgICAgIGlmIChjYXBzID09IE5VTEwpIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJVbmhhbmRsZWQgUklGRiBhdWRpbyBmb3JtYXQgMHglMDJ4IiwgYXVkcy5mb3JtYXQpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklORyAoIkludmFsaWQgY29kZWMgZGF0YSBzaXplICglZCBleHBlY3RlZCwgZ290ICVkKSIsIDE4LCBzaXplKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZ19zdHJfaGFzX3ByZWZpeCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19BQUMpKSB7CisgICAgR3N0QnVmZmVyICpwcml2ID0gTlVMTDsKKyAgICBnaW50IG1wZWd2ZXJzaW9uOworICAgIGdpbnQgcmF0ZV9pZHgsIHByb2ZpbGU7CisgICAgZ3VpbnQ4ICpkYXRhID0gTlVMTDsKKworICAgIC8qIHVuc3BlY2lmaWVkIEFBQyBwcm9maWxlIHdpdGggb3BhcXVlIHByaXZhdGUgY29kZWMgZGF0YSAqLworICAgIGlmIChzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUFDKSA9PSAwKSB7CisgICAgICBpZiAoY29udGV4dC0+Y29kZWNfcHJpdl9zaXplID49IDIpIHsKKyAgICAgICAgZ3VpbnQgb2JqX3R5cGUsIGZyZXFfaW5kZXgsIGV4cGxpY2l0X2ZyZXFfYnl0ZXMgPSAwOworCisgICAgICAgIGNvZGVjX2lkID0gR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX0FBQ19NUEVHNDsKKyAgICAgICAgbXBlZ3ZlcnNpb24gPSA0OworICAgICAgICBmcmVxX2luZGV4ID0gKEdTVF9SRUFEX1VJTlQxNl9CRSAoY29udGV4dC0+Y29kZWNfcHJpdikgJiAweDc4MCkgPj4gNzsKKyAgICAgICAgb2JqX3R5cGUgPSAoR1NUX1JFQURfVUlOVDE2X0JFIChjb250ZXh0LT5jb2RlY19wcml2KSAmIDB4RjgwMCkgPj4gMTE7CisgICAgICAgIGlmIChmcmVxX2luZGV4ID09IDE1KQorICAgICAgICAgIGV4cGxpY2l0X2ZyZXFfYnl0ZXMgPSAzOworICAgICAgICBHU1RfREVCVUcgKCJvYmpfdHlwZSA9ICV1LCBmcmVxX2luZGV4ID0gJXUiLCBvYmpfdHlwZSwgZnJlcV9pbmRleCk7CisgICAgICAgIHByaXYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChnX21lbWR1cCAoY29udGV4dC0+Y29kZWNfcHJpdiwKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5jb2RlY19wcml2X3NpemUpLCBjb250ZXh0LT5jb2RlY19wcml2X3NpemUpOworICAgICAgICAvKiBhc3N1bWUgU0JSIGlmIHNhbXBsZXJhdGUgPD0gMjRrSHogKi8KKyAgICAgICAgaWYgKG9ial90eXBlID09IDUgfHwgKGZyZXFfaW5kZXggPj0gNiAmJiBmcmVxX2luZGV4ICE9IDE1KSB8fAorICAgICAgICAgICAgKGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA9PSAoNSArIGV4cGxpY2l0X2ZyZXFfYnl0ZXMpKSkgeworICAgICAgICAgIGF1ZGlvY29udGV4dC0+c2FtcGxlcmF0ZSAqPSAyOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfV0FSTklORyAoIk9wYXF1ZSBBX0FBQyBjb2RlYyBJRCwgYnV0IG5vIGNvZGVjIHByaXZhdGUgZGF0YSIpOworICAgICAgICAvKiB0aGlzIGlzIHByZXR0eSBicm9rZW47CisgICAgICAgICAqIG1heWJlIHdlIG5lZWQgdG8gbWFrZSB1cCBzb21lIGRlZmF1bHQgcHJpdmF0ZSwKKyAgICAgICAgICogb3IgbWF5YmUgQURUUyBkYXRhIGdvdCBkdW1wZWQgaW4uCisgICAgICAgICAqIExldCdzIHNldCB1cCBzb21lIHByaXZhdGUgZGF0YSBub3csIGFuZCBjaGVjayBhY3R1YWwgZGF0YSBsYXRlciAqLworICAgICAgICAvKiBqdXN0IHRyeSB0aGlzIGFuZCBzZWUgd2hhdCBoYXBwZW5zIC4uLiAqLworICAgICAgICBjb2RlY19pZCA9IEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19BQUNfTVBFRzQ7CisgICAgICAgIGNvbnRleHQtPnBvc3Rwcm9jZXNzX2ZyYW1lID0gZ3N0X21hdHJvc2thX2RlbXV4X2NoZWNrX2FhYzsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBtYWtlIHVwIGRlY29kZXItc3BlY2lmaWMgZGF0YSBpZiBpdCBpcyBub3Qgc3VwcGxpZWQgKi8KKyAgICBpZiAocHJpdiA9PSBOVUxMKSB7CisgICAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgICAgcHJpdiA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCA1LCBOVUxMKTsKKyAgICAgIGdzdF9idWZmZXJfbWFwIChwcml2LCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICAgIGRhdGEgPSBtYXAuZGF0YTsKKyAgICAgIHJhdGVfaWR4ID0gYWFjX3JhdGVfaWR4IChhdWRpb2NvbnRleHQtPnNhbXBsZXJhdGUpOworICAgICAgcHJvZmlsZSA9IGFhY19wcm9maWxlX2lkeCAoY29kZWNfaWQpOworCisgICAgICBkYXRhWzBdID0gKChwcm9maWxlICsgMSkgPDwgMykgfCAoKHJhdGVfaWR4ICYgMHhFKSA+PiAxKTsKKyAgICAgIGRhdGFbMV0gPSAoKHJhdGVfaWR4ICYgMHgxKSA8PCA3KSB8IChhdWRpb2NvbnRleHQtPmNoYW5uZWxzIDw8IDMpOworCisgICAgICBpZiAoIXN0cm5jbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUFDX01QRUcyLAorICAgICAgICAgICAgICBzdHJsZW4gKEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19BQUNfTVBFRzIpKSkgeworICAgICAgICBtcGVndmVyc2lvbiA9IDI7CisgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHByaXYsICZtYXApOworICAgICAgICBnc3RfYnVmZmVyX3NldF9zaXplIChwcml2LCAyKTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUFDX01QRUc0LAorICAgICAgICAgICAgICBzdHJsZW4gKEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19BQUNfTVBFRzQpKSkgeworICAgICAgICBtcGVndmVyc2lvbiA9IDQ7CisKKyAgICAgICAgaWYgKGdfc3RycnN0ciAoY29kZWNfaWQsICJTQlIiKSkgeworICAgICAgICAgIC8qIEhFLUFBQyAoYWthIFNCUiBBQUMpICovCisgICAgICAgICAgYXVkaW9jb250ZXh0LT5zYW1wbGVyYXRlICo9IDI7CisgICAgICAgICAgcmF0ZV9pZHggPSBhYWNfcmF0ZV9pZHggKGF1ZGlvY29udGV4dC0+c2FtcGxlcmF0ZSk7CisgICAgICAgICAgZGF0YVsyXSA9IEFBQ19TWU5DX0VYVEVOU0lPTl9UWVBFID4+IDM7CisgICAgICAgICAgZGF0YVszXSA9ICgoQUFDX1NZTkNfRVhURU5TSU9OX1RZUEUgJiAweDA3KSA8PCA1KSB8IDU7CisgICAgICAgICAgZGF0YVs0XSA9ICgxIDw8IDcpIHwgKHJhdGVfaWR4IDw8IDMpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHByaXYsICZtYXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHByaXYsICZtYXApOworICAgICAgICAgIGdzdF9idWZmZXJfc2V0X3NpemUgKHByaXYsIDIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChwcml2LCAmbWFwKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocHJpdik7CisgICAgICAgIHByaXYgPSBOVUxMOworICAgICAgICBHU1RfRVJST1IgKCJVbmtub3duIEFBQyBwcm9maWxlIGFuZCBubyBjb2RlYyBwcml2YXRlIGRhdGEiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJpdikgeworICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9tcGVnIiwKKyAgICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCBtcGVndmVyc2lvbiwKKyAgICAgICAgICAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsCisgICAgICAgICAgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAicmF3IiwgTlVMTCk7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiY29kZWNfZGF0YSIsIEdTVF9UWVBFX0JVRkZFUiwgcHJpdiwgTlVMTCk7CisgICAgICBpZiAoY29udGV4dC0+Y29kZWNfcHJpdiAmJiBjb250ZXh0LT5jb2RlY19wcml2X3NpemUgPiAwKQorICAgICAgICBnc3RfY29kZWNfdXRpbHNfYWFjX2NhcHNfc2V0X2xldmVsX2FuZF9wcm9maWxlIChjYXBzLAorICAgICAgICAgICAgY29udGV4dC0+Y29kZWNfcHJpdiwgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplKTsKKyAgICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiTVBFRy0lZCBBQUMgYXVkaW8iLCBtcGVndmVyc2lvbik7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChwcml2KTsKKyAgICB9CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19UVEEpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXR0YSIsCisgICAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIGF1ZGlvY29udGV4dC0+Yml0ZGVwdGgsIE5VTEwpOworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXAgKCJUVEEgYXVkaW8iKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1dBVlBBQ0s0KSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC13YXZwYWNrIiwKKyAgICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgYXVkaW9jb250ZXh0LT5iaXRkZXB0aCwKKyAgICAgICAgImZyYW1lZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAgICAqY29kZWNfbmFtZSA9IGdfc3RyZHVwICgiV2F2cGFjayBhdWRpbyIpOworICAgIGNvbnRleHQtPnBvc3Rwcm9jZXNzX2ZyYW1lID0gZ3N0X21hdHJvc2thX2RlbXV4X2FkZF93dnBrX2hlYWRlcjsKKyAgICBhdWRpb2NvbnRleHQtPnd2cGtfYmxvY2tfaW5kZXggPSAwOworICB9IGVsc2UgaWYgKCghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1JFQUxfMTRfNCkpIHx8CisgICAgICAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19SRUFMXzI4XzgpKSB8fAorICAgICAgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF9DT09LKSkpIHsKKyAgICBnaW50IHJhdmVyc2lvbiA9IC0xOworCisgICAgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF8xNF80KSkKKyAgICAgIHJhdmVyc2lvbiA9IDE7CisgICAgZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19SRUFMX0NPT0spKQorICAgICAgcmF2ZXJzaW9uID0gODsKKyAgICBlbHNlCisgICAgICByYXZlcnNpb24gPSAyOworCisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXBuLXJlYWxhdWRpbyIsCisgICAgICAgICJyYXZlcnNpb24iLCBHX1RZUEVfSU5ULCByYXZlcnNpb24sIE5VTEwpOworICAgIC8qIEV4dHJhY3QgZXh0cmEgaW5mb3JtYXRpb24gZnJvbSBjYXBzLCBtYXBwaW5nIHZhcmllcyBiYXNlZCBvbiBjb2RlYyAqLworICAgIGlmIChkYXRhICYmIChzaXplID49IDB4NTApKSB7CisgICAgICBHc3RCdWZmZXIgKnByaXY7CisgICAgICBndWludCBmbGF2b3I7CisgICAgICBndWludCBwYWNrZXRfc2l6ZTsKKyAgICAgIGd1aW50IGhlaWdodDsKKyAgICAgIGd1aW50IGxlYWZfc2l6ZTsKKyAgICAgIGd1aW50IHNhbXBsZV93aWR0aDsKKyAgICAgIGd1aW50IGV4dHJhX2RhdGFfc2l6ZTsKKworICAgICAgR1NUX0RFQlVHICgicmVhbCBhdWRpbyByYXZlcnNpb246JWQiLCByYXZlcnNpb24pOworICAgICAgaWYgKHJhdmVyc2lvbiA9PSA4KSB7CisgICAgICAgIC8qIENPT0sgKi8KKyAgICAgICAgZmxhdm9yID0gR1NUX1JFQURfVUlOVDE2X0JFIChkYXRhICsgMjIpOworICAgICAgICBwYWNrZXRfc2l6ZSA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoZGF0YSArIDI0KTsKKyAgICAgICAgaGVpZ2h0ID0gR1NUX1JFQURfVUlOVDE2X0JFIChkYXRhICsgNDApOworICAgICAgICBsZWFmX3NpemUgPSBHU1RfUkVBRF9VSU5UMTZfQkUgKGRhdGEgKyA0NCk7CisgICAgICAgIHNhbXBsZV93aWR0aCA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoZGF0YSArIDU4KTsKKyAgICAgICAgZXh0cmFfZGF0YV9zaXplID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhICsgNzQpOworCisgICAgICAgIEdTVF9ERUJVRworICAgICAgICAgICAgKCJmbGF2b3I6JWQsIHBhY2tldF9zaXplOiVkLCBoZWlnaHQ6JWQsIGxlYWZfc2l6ZTolZCwgc2FtcGxlX3dpZHRoOiVkLCBleHRyYV9kYXRhX3NpemU6JWQiLAorICAgICAgICAgICAgZmxhdm9yLCBwYWNrZXRfc2l6ZSwgaGVpZ2h0LCBsZWFmX3NpemUsIHNhbXBsZV93aWR0aCwKKyAgICAgICAgICAgIGV4dHJhX2RhdGFfc2l6ZSk7CisgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJmbGF2b3IiLCBHX1RZUEVfSU5ULCBmbGF2b3IsICJwYWNrZXRfc2l6ZSIsCisgICAgICAgICAgICBHX1RZUEVfSU5ULCBwYWNrZXRfc2l6ZSwgImhlaWdodCIsIEdfVFlQRV9JTlQsIGhlaWdodCwgImxlYWZfc2l6ZSIsCisgICAgICAgICAgICBHX1RZUEVfSU5ULCBsZWFmX3NpemUsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHNhbXBsZV93aWR0aCwgTlVMTCk7CisKKyAgICAgICAgaWYgKChzaXplIC0gNzgpID49IGV4dHJhX2RhdGFfc2l6ZSkgeworICAgICAgICAgIHByaXYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChnX21lbWR1cCAoZGF0YSArIDc4LCBleHRyYV9kYXRhX3NpemUpLAorICAgICAgICAgICAgICBleHRyYV9kYXRhX3NpemUpOworICAgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBwcml2LCBOVUxMKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChwcml2KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiUmVhbEF1ZGlvICVkLjAiLCByYXZlcnNpb24pOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF9TSVBSKSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC1zaXBybyIpOworICAgICpjb2RlY19uYW1lID0gZ19zdHJkdXAgKCJTaXByby9BQ0VMUC5ORVQgVm9pY2UgQ29kZWMiKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1JFQUxfUkFMRikpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtcmFsZi1tcGVnNC1nZW5lcmljIik7CisgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cCAoIlJlYWwgQXVkaW8gTG9zc2xlc3MiKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1JFQUxfQVRSQykpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtdm5kLnNvbnkuYXRyYWMzIik7CisgICAgKmNvZGVjX25hbWUgPSBnX3N0cmR1cCAoIlNvbnkgQVRSQUMzIik7CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkcgKCJVbmtub3duIGNvZGVjICclcycsIGNhbm5vdCBidWlsZCBDYXBzIiwgY29kZWNfaWQpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKGNhcHMgIT0gTlVMTCkgeworICAgIGlmIChhdWRpb2NvbnRleHQtPnNhbXBsZXJhdGUgPiAwICYmIGF1ZGlvY29udGV4dC0+Y2hhbm5lbHMgPiAwKSB7CisgICAgICBnaW50IGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7IGkrKykgeworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSksCisgICAgICAgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBhdWRpb2NvbnRleHQtPmNoYW5uZWxzLAorICAgICAgICAgICAgInJhdGUiLCBHX1RZUEVfSU5ULCBhdWRpb2NvbnRleHQtPnNhbXBsZXJhdGUsIE5VTEwpOworICAgICAgfQorICAgIH0KKworICAgIGNhcHMgPSBnc3RfY2Fwc19zaW1wbGlmeSAoY2Fwcyk7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X21hdHJvc2thX2RlbXV4X3N1YnRpdGxlX2NhcHMgKEdzdE1hdHJvc2thVHJhY2tTdWJ0aXRsZUNvbnRleHQgKgorICAgIHN1YnRpdGxlY29udGV4dCwgY29uc3QgZ2NoYXIgKiBjb2RlY19pZCwgZ3BvaW50ZXIgZGF0YSwgZ3VpbnQgc2l6ZSkKK3sKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0ID0KKyAgICAgIChHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqKSBzdWJ0aXRsZWNvbnRleHQ7CisKKyAgLyogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisgIGlmICghZ19hc2NpaV9zdHJjYXNlY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX0FTQ0lJKSkKKyAgICBjb2RlY19pZCA9IEdTVF9NQVRST1NLQV9DT0RFQ19JRF9TVUJUSVRMRV9VVEY4OworICBlbHNlIGlmICghZ19hc2NpaV9zdHJjYXNlY21wIChjb2RlY19pZCwgIlNfU1NBIikpCisgICAgY29kZWNfaWQgPSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfU1NBOworICBlbHNlIGlmICghZ19hc2NpaV9zdHJjYXNlY21wIChjb2RlY19pZCwgIlNfQVNTIikpCisgICAgY29kZWNfaWQgPSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfQVNTOworICBlbHNlIGlmICghZ19hc2NpaV9zdHJjYXNlY21wIChjb2RlY19pZCwgIlNfVVNGIikpCisgICAgY29kZWNfaWQgPSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfVVNGOworCisgIC8qIFRPRE86IEFkZCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfQk1QIHN1cHBvcnQKKyAgICogQ2hlY2sgaWYgd2UgaGF2ZSB0byBkbyBzb21ldGhpbmcgd2l0aCBjb2RlY19wcml2YXRlICovCisgIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX1VURjgpKSB7CisgICAgLyogd2VsbCwgcGxhaW4gdGV4dCBzaW1wbHkgZG9lcyBub3QgaGF2ZSBhIGxvdCBvZiBtYXJrdXAgLi4uICovCisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ0ZXh0L3gtcmF3IiwgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgICJwYW5nby1tYXJrdXAiLCBOVUxMKTsKKyAgICBjb250ZXh0LT5wb3N0cHJvY2Vzc19mcmFtZSA9IGdzdF9tYXRyb3NrYV9kZW11eF9jaGVja19zdWJ0aXRsZV9idWZmZXI7CisgICAgc3VidGl0bGVjb250ZXh0LT5jaGVja19tYXJrdXAgPSBUUlVFOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfU1NBKSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXBwbGljYXRpb24veC1zc2EiKTsKKyAgICBjb250ZXh0LT5wb3N0cHJvY2Vzc19mcmFtZSA9IGdzdF9tYXRyb3NrYV9kZW11eF9jaGVja19zdWJ0aXRsZV9idWZmZXI7CisgICAgc3VidGl0bGVjb250ZXh0LT5jaGVja19tYXJrdXAgPSBGQUxTRTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX0FTUykpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtYXNzIik7CisgICAgY29udGV4dC0+cG9zdHByb2Nlc3NfZnJhbWUgPSBnc3RfbWF0cm9za2FfZGVtdXhfY2hlY2tfc3VidGl0bGVfYnVmZmVyOworICAgIHN1YnRpdGxlY29udGV4dC0+Y2hlY2tfbWFya3VwID0gRkFMU0U7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9TVUJUSVRMRV9VU0YpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXVzZiIpOworICAgIGNvbnRleHQtPnBvc3Rwcm9jZXNzX2ZyYW1lID0gZ3N0X21hdHJvc2thX2RlbXV4X2NoZWNrX3N1YnRpdGxlX2J1ZmZlcjsKKyAgICBzdWJ0aXRsZWNvbnRleHQtPmNoZWNrX21hcmt1cCA9IEZBTFNFOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfVk9CU1VCKSkgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgic3VicGljdHVyZS94LWR2ZCIpOworICAgICgoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKikgc3VidGl0bGVjb250ZXh0KS0+c2VuZF9kdmRfZXZlbnQgPSBUUlVFOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfSERNVlBHUykpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInN1YnBpY3R1cmUveC1wZ3MiKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChjb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX0tBVEUpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJzdWJ0aXRsZS94LWthdGUiKTsKKyAgICBjb250ZXh0LT5zdHJlYW1faGVhZGVycyA9CisgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV94aXBoX3N0cmVhbV9oZWFkZXJzIChjb250ZXh0LT5jb2RlY19wcml2LAorICAgICAgICBjb250ZXh0LT5jb2RlY19wcml2X3NpemUpOworICAgIC8qIEZJWE1FOiBtYXJrIHN0cmVhbSBhcyBicm9rZW4gYW5kIHNraXAgaWYgdGhlcmUgYXJlIG5vIHN0cmVhbSBoZWFkZXJzICovCisgICAgY29udGV4dC0+c2VuZF9zdHJlYW1faGVhZGVycyA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHICgiVW5rbm93biBzdWJ0aXRsZSBzdHJlYW06IGNvZGVjX2lkPSclcyciLCBjb2RlY19pZCk7CisgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXN1YnRpdGxlLXVua25vd24iKTsKKyAgfQorCisgIGlmIChkYXRhICE9IE5VTEwgJiYgc2l6ZSA+IDApIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZjsKKworICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGdfbWVtZHVwIChkYXRhLCBzaXplKSwgc2l6ZSk7CisgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZiwgTlVMTCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgfQorCisgIHJldHVybiBjYXBzOworfQorCisjaWYgMAorc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9kZW11eF9zZXRfaW5kZXggKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RJbmRleCAqIGluZGV4KQoreworICBHc3RNYXRyb3NrYURlbXV4ICpkZW11eCA9IEdTVF9NQVRST1NLQV9ERU1VWCAoZWxlbWVudCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgIGlmIChkZW11eC0+Y29tbW9uLmVsZW1lbnRfaW5kZXgpCisgICAgZ3N0X29iamVjdF91bnJlZiAoZGVtdXgtPmNvbW1vbi5lbGVtZW50X2luZGV4KTsKKyAgZGVtdXgtPmNvbW1vbi5lbGVtZW50X2luZGV4ID0gaW5kZXggPyBnc3Rfb2JqZWN0X3JlZiAoaW5kZXgpIDogTlVMTDsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJTZXQgaW5kZXggJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBkZW11eC0+Y29tbW9uLmVsZW1lbnRfaW5kZXgpOworfQorCitzdGF0aWMgR3N0SW5kZXggKgorZ3N0X21hdHJvc2thX2RlbXV4X2dldF9pbmRleCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdEluZGV4ICpyZXN1bHQgPSBOVUxMOworICBHc3RNYXRyb3NrYURlbXV4ICpkZW11eCA9IEdTVF9NQVRST1NLQV9ERU1VWCAoZWxlbWVudCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgIGlmIChkZW11eC0+Y29tbW9uLmVsZW1lbnRfaW5kZXgpCisgICAgcmVzdWx0ID0gZ3N0X29iamVjdF9yZWYgKGRlbXV4LT5jb21tb24uZWxlbWVudF9pbmRleCk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJSZXR1cm5pbmcgaW5kZXggJSIgR1NUX1BUUl9GT1JNQVQsIHJlc3VsdCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9tYXRyb3NrYV9kZW11eF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdE1hdHJvc2thRGVtdXggKmRlbXV4ID0gR1NUX01BVFJPU0tBX0RFTVVYIChlbGVtZW50KTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTOworCisgIC8qIGhhbmRsZSB1cHdhcmRzIHN0YXRlIGNoYW5nZXMgaGVyZSAqLworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICAvKiBoYW5kbGUgZG93bndhcmRzIHN0YXRlIGNoYW5nZXMgKi8KKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9tYXRyb3NrYV9kZW11eF9yZXNldCAoR1NUX0VMRU1FTlQgKGRlbXV4KSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX2RlbXV4X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RNYXRyb3NrYURlbXV4ICpkZW11eDsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfTUFUUk9TS0FfREVNVVggKG9iamVjdCkpOworICBkZW11eCA9IEdTVF9NQVRST1NLQV9ERU1VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTUFYX0dBUF9USU1FOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgICAgICBkZW11eC0+bWF4X2dhcF90aW1lID0gZ192YWx1ZV9nZXRfdWludDY0ICh2YWx1ZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoZGVtdXgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX2RlbXV4X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RNYXRyb3NrYURlbXV4ICpkZW11eDsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfTUFUUk9TS0FfREVNVVggKG9iamVjdCkpOworICBkZW11eCA9IEdTVF9NQVRST1NLQV9ERU1VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTUFYX0dBUF9USU1FOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChkZW11eCk7CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBkZW11eC0+bWF4X2dhcF90aW1lKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChkZW11eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2dib29sZWFuCitnc3RfbWF0cm9za2FfZGVtdXhfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgZ3N0X3JpZmZfaW5pdCAoKTsKKworICAvKiBwYXJzZXIgaGVscGVyIHNlcGFyYXRlIGRlYnVnICovCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChlYm1scmVhZF9kZWJ1ZywgImVibWxyZWFkIiwKKyAgICAgIDAsICJFQk1MIHN0cmVhbSBoZWxwZXIgY2xhc3MiKTsKKworICAvKiBjcmVhdGUgYW4gZWxlbWVudGZhY3RvcnkgZm9yIHRoZSBtYXRyb3NrYV9kZW11eCBlbGVtZW50ICovCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm1hdHJvc2thZGVtdXgiLAorICAgICAgICAgIEdTVF9SQU5LX1BSSU1BUlksIEdTVF9UWVBFX01BVFJPU0tBX0RFTVVYKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaCBiL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1kZW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZTI0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbWF0cm9za2EvbWF0cm9za2EtZGVtdXguaApAQCAtMCwwICsxLDEyNiBAQAorLyogR1N0cmVhbWVyIE1hdHJvc2thIG11eGVyL2RlbXV4ZXIKKyAqIChjKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqIChjKSAyMDExIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKyAqCisgKiBtYXRyb3NrYS1kZW11eC5oOiBtYXRyb3NrYSBmaWxlL3N0cmVhbSBkZW11eGVyIGRlZmluaXRpb24KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX01BVFJPU0tBX0RFTVVYX0hfXworI2RlZmluZSBfX0dTVF9NQVRST1NLQV9ERU1VWF9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RmbG93Y29tYmluZXIuaD4KKworI2luY2x1ZGUgImVibWwtcmVhZC5oIgorI2luY2x1ZGUgIm1hdHJvc2thLWlkcy5oIgorI2luY2x1ZGUgIm1hdHJvc2thLXJlYWQtY29tbW9uLmgiCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9NQVRST1NLQV9ERU1VWCBcCisgIChnc3RfbWF0cm9za2FfZGVtdXhfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9NQVRST1NLQV9ERU1VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfTUFUUk9TS0FfREVNVVgsIEdzdE1hdHJvc2thRGVtdXgpKQorI2RlZmluZSBHU1RfTUFUUk9TS0FfREVNVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9NQVRST1NLQV9ERU1VWCwgR3N0TWF0cm9za2FEZW11eENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX01BVFJPU0tBX0RFTVVYKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9NQVRST1NLQV9ERU1VWCkpCisjZGVmaW5lIEdTVF9JU19NQVRST1NLQV9ERU1VWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX01BVFJPU0tBX0RFTVVYKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1hdHJvc2thRGVtdXggeworICBHc3RFbGVtZW50ICAgICAgICAgICAgICBwYXJlbnQ7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKworICBHc3RNYXRyb3NrYVJlYWRDb21tb24gICAgY29tbW9uOworCisgIC8qIHBhZHMgKi8KKyAgR3N0Q2xvY2sgICAgICAgICAgICAgICAgKmNsb2NrOworICBndWludCAgICAgICAgICAgICAgICAgICAgbnVtX3Zfc3RyZWFtczsKKyAgZ3VpbnQgICAgICAgICAgICAgICAgICAgIG51bV9hX3N0cmVhbXM7CisgIGd1aW50ICAgICAgICAgICAgICAgICAgICBudW1fdF9zdHJlYW1zOworCisgIGd1aW50ICAgICAgICAgICAgICAgICAgICBncm91cF9pZDsKKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIGhhdmVfZ3JvdXBfaWQ7CisKKyAgR3N0Rmxvd0NvbWJpbmVyICAgICAgICAgKmZsb3djb21iaW5lcjsKKworICAvKiBzdGF0ZSAqLworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgc3RyZWFtaW5nOworICBndWludDY0ICAgICAgICAgICAgICAgICAgc2Vla19ibG9jazsKKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIHNlZWtfZmlyc3Q7CisKKyAgLyogZGlkIHdlIHBhcnNlIGN1ZXMvdHJhY2tzL3NlZ21lbnRpbmZvIGFscmVhZHk/ICovCisgIGdib29sZWFuICAgICAgICAgICAgICAgICB0cmFja3NfcGFyc2VkOworICBHTGlzdCAgICAgICAgICAgICAgICAgICAqc2Vla19wYXJzZWQ7CisKKyAgLyogY2x1c3RlciBwb3NpdGlvbnMgKG9wdGlvbmFsKSAqLworICBHQXJyYXkgICAgICAgICAgICAgICAgICAqY2x1c3RlcnM7CisKKyAgLyoga2VlcGluZyB0cmFjayBvZiBwbGF5YmFjayBwb3NpdGlvbiAqLworICBHc3RDbG9ja1RpbWUgICAgICAgICAgICAgbGFzdF9zdG9wX2VuZDsKKyAgR3N0Q2xvY2tUaW1lICAgICAgICAgICAgIHN0cmVhbV9zdGFydF90aW1lOworCisgIC8qIFN0b3AgdGltZSBmb3IgcmV2ZXJzZSBwbGF5YmFjayAqLworICBHc3RDbG9ja1RpbWUgICAgICAgICAgICAgdG9fdGltZTsKKyAgR3N0RXZlbnQgICAgICAgICAgICAgICAgKm5ld19zZWdtZW50OworCisgIC8qIHNvbWUgc3RhdGUgc2F2aW5nICovCisgIEdzdENsb2NrVGltZSAgICAgICAgICAgICBjbHVzdGVyX3RpbWU7CisgIGd1aW50NjQgICAgICAgICAgICAgICAgICBjbHVzdGVyX29mZnNldDsKKyAgZ3VpbnQ2NCAgICAgICAgICAgICAgICAgIGZpcnN0X2NsdXN0ZXJfb2Zmc2V0OworICBndWludDY0ICAgICAgICAgICAgICAgICAgbmV4dF9jbHVzdGVyX29mZnNldDsKKyAgR3N0Q2xvY2tUaW1lICAgICAgICAgICAgIHJlcXVlc3RlZF9zZWVrX3RpbWU7CisgIGd1aW50NjQgICAgICAgICAgICAgICAgICBzZWVrX29mZnNldDsKKworICAvKiBhbHRlcm5hdGl2ZSBkdXJhdGlvbjsgb3B0aW9uYWxseSBvYnRhaW5lZCBmcm9tIGxhc3QgY2x1c3RlciAqLworICBndWludDY0ICAgICAgICAgICAgICAgICAgbGFzdF9jbHVzdGVyX29mZnNldDsKKyAgR3N0Q2xvY2tUaW1lICAgICAgICAgICAgIHN0cmVhbV9sYXN0X3RpbWU7CisKKyAgLyogaW5kZXggc3R1ZmYgKi8KKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIHNlZWthYmxlOworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgYnVpbGRpbmdfaW5kZXg7CisgIGd1aW50NjQgICAgICAgICAgICAgICAgICBpbmRleF9vZmZzZXQ7CisgIEdzdEV2ZW50ICAgICAgICAgICAgICAgICpzZWVrX2V2ZW50OworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgbmVlZF9zZWdtZW50OworICBndWludDMyICAgICAgICAgICAgICAgICAgc2VnbWVudF9zZXFudW07CisKKyAgLyogcmV2ZXJzZSBwbGF5YmFjayAqLworICBHQXJyYXkgICAgICAgICAgICAgICAgICAqc2Vla19pbmRleDsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICAgIHNlZWtfZW50cnk7CisKKyAgLyogZ2FwIGhhbmRsaW5nICovCisgIGd1aW50NjQgICAgICAgICAgICAgICAgICBtYXhfZ2FwX3RpbWU7CisKKyAgLyogZm9yIG5vbi1maW5hbGl6ZWQgZmlsZXMsIHdpdGggaW52YWxpZCBzZWdtZW50IGR1cmF0aW9uICovCisgIGdib29sZWFuICAgICAgICAgICAgICAgICBpbnZhbGlkX2R1cmF0aW9uOworCisgIC8qIENhY2hlZCB1cHN0cmVhbSBsZW5ndGggKGRlZmF1bHQgR19NQVhVSU5UNjQpICovCisgIGd1aW50NjQJICAgICAgICAgICBjYWNoZWRfbGVuZ3RoOworfSBHc3RNYXRyb3NrYURlbXV4OworCit0eXBlZGVmIHN0cnVjdCBfR3N0TWF0cm9za2FEZW11eENsYXNzIHsKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudDsKK30gR3N0TWF0cm9za2FEZW11eENsYXNzOworCitnYm9vbGVhbiBnc3RfbWF0cm9za2FfZGVtdXhfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX01BVFJPU0tBX0RFTVVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5jIGIvZ3N0L21hdHJvc2thL21hdHJvc2thLWlkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZTNkMjcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmMKQEAgLTAsMCArMSwzNTUgQEAKKy8qIEdTdHJlYW1lciBNYXRyb3NrYSBtdXhlci9kZW11eGVyCisgKiAoQykgMjAwMyBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAoQykgMjAwNiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIG1hdHJvc2thLWlkcy5jOiBtYXRyb3NrYSB0cmFjayBjb250ZXh0IHV0aWxpdHkgZnVuY3Rpb25zCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAibWF0cm9za2EtaWRzLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV90cmFja19pbml0X3ZpZGVvX2NvbnRleHQgKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICoqIHBfY29udGV4dCkKK3sKKyAgR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqdmlkZW9fY29udGV4dDsKKworICBnX2Fzc2VydCAocF9jb250ZXh0ICE9IE5VTEwgJiYgKnBfY29udGV4dCAhPSBOVUxMKTsKKworICAvKiBhbHJlYWR5IHNldCB1cD8gKHRyYWNrIGluZm8gbWlnaHQgY29tZSBiZWZvcmUgdHJhY2sgdHlwZSkgKi8KKyAgaWYgKCgqcF9jb250ZXh0KS0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9WSURFTykgeworICAgIEdTVF9MT0cgKCJ2aWRlbyBjb250ZXh0IGFscmVhZHkgc2V0IHVwIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICAvKiBpdCBiZXR0ZXIgbm90IGhhdmUgYmVlbiBzZXQgdXAgYXMgc29tZSBvdGhlciB0cmFjayB0eXBlIC4uLiAqLworICBpZiAoKCpwX2NvbnRleHQpLT50eXBlICE9IDApIHsKKyAgICBnX3JldHVybl92YWxfaWZfcmVhY2hlZCAoRkFMU0UpOworICB9CisKKyAgdmlkZW9fY29udGV4dCA9IGdfcmVuZXcgKEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQsICpwX2NvbnRleHQsIDEpOworICAqcF9jb250ZXh0ID0gKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICopIHZpZGVvX2NvbnRleHQ7CisKKyAgLyogZGVmYXVsdHMgKi8KKyAgKCpwX2NvbnRleHQpLT50eXBlID0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU87CisgIHZpZGVvX2NvbnRleHQtPmRpc3BsYXlfd2lkdGggPSAwOworICB2aWRlb19jb250ZXh0LT5kaXNwbGF5X2hlaWdodCA9IDA7CisgIHZpZGVvX2NvbnRleHQtPnBpeGVsX3dpZHRoID0gMDsKKyAgdmlkZW9fY29udGV4dC0+cGl4ZWxfaGVpZ2h0ID0gMDsKKyAgdmlkZW9fY29udGV4dC0+YXNyX21vZGUgPSAwOworICB2aWRlb19jb250ZXh0LT5mb3VyY2MgPSAwOworICB2aWRlb19jb250ZXh0LT5kZWZhdWx0X2ZwcyA9IDAuMDsKKyAgdmlkZW9fY29udGV4dC0+ZWFybGllc3RfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIHZpZGVvX2NvbnRleHQtPm11bHRpdmlld19tb2RlID0gR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX05PTkU7CisgIHZpZGVvX2NvbnRleHQtPm11bHRpdmlld19mbGFncyA9IEdTVF9WSURFT19NVUxUSVZJRVdfRkxBR1NfTk9ORTsKKyAgdmlkZW9fY29udGV4dC0+Y29sb3JpbWV0cnkucmFuZ2UgPSBHU1RfVklERU9fQ09MT1JfUkFOR0VfVU5LTk9XTjsKKyAgdmlkZW9fY29udGV4dC0+Y29sb3JpbWV0cnkubWF0cml4ID0gR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9VTktOT1dOOworICB2aWRlb19jb250ZXh0LT5jb2xvcmltZXRyeS50cmFuc2ZlciA9IEdTVF9WSURFT19UUkFOU0ZFUl9VTktOT1dOOworICB2aWRlb19jb250ZXh0LT5jb2xvcmltZXRyeS5wcmltYXJpZXMgPSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX1VOS05PV047CisKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV90cmFja19pbml0X2F1ZGlvX2NvbnRleHQgKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICoqIHBfY29udGV4dCkKK3sKKyAgR3N0TWF0cm9za2FUcmFja0F1ZGlvQ29udGV4dCAqYXVkaW9fY29udGV4dDsKKworICBnX2Fzc2VydCAocF9jb250ZXh0ICE9IE5VTEwgJiYgKnBfY29udGV4dCAhPSBOVUxMKTsKKworICAvKiBhbHJlYWR5IHNldCB1cD8gKHRyYWNrIGluZm8gbWlnaHQgY29tZSBiZWZvcmUgdHJhY2sgdHlwZSkgKi8KKyAgaWYgKCgqcF9jb250ZXh0KS0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9BVURJTykKKyAgICByZXR1cm4gVFJVRTsKKworICAvKiBpdCBiZXR0ZXIgbm90IGhhdmUgYmVlbiBzZXQgdXAgYXMgc29tZSBvdGhlciB0cmFjayB0eXBlIC4uLiAqLworICBpZiAoKCpwX2NvbnRleHQpLT50eXBlICE9IDApIHsKKyAgICBnX3JldHVybl92YWxfaWZfcmVhY2hlZCAoRkFMU0UpOworICB9CisKKyAgYXVkaW9fY29udGV4dCA9IGdfcmVuZXcgKEdzdE1hdHJvc2thVHJhY2tBdWRpb0NvbnRleHQsICpwX2NvbnRleHQsIDEpOworICAqcF9jb250ZXh0ID0gKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICopIGF1ZGlvX2NvbnRleHQ7CisKKyAgLyogZGVmYXVsdHMgKi8KKyAgKCpwX2NvbnRleHQpLT50eXBlID0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQVVESU87CisgIGF1ZGlvX2NvbnRleHQtPmNoYW5uZWxzID0gMTsKKyAgYXVkaW9fY29udGV4dC0+c2FtcGxlcmF0ZSA9IDgwMDA7CisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfc3VidGl0bGVfY29udGV4dCAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiogcF9jb250ZXh0KQoreworICBHc3RNYXRyb3NrYVRyYWNrU3VidGl0bGVDb250ZXh0ICpzdWJ0aXRsZV9jb250ZXh0OworCisgIGdfYXNzZXJ0IChwX2NvbnRleHQgIT0gTlVMTCAmJiAqcF9jb250ZXh0ICE9IE5VTEwpOworCisgIC8qIGFscmVhZHkgc2V0IHVwPyAodHJhY2sgaW5mbyBtaWdodCBjb21lIGJlZm9yZSB0cmFjayB0eXBlKSAqLworICBpZiAoKCpwX2NvbnRleHQpLT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFKQorICAgIHJldHVybiBUUlVFOworCisgIC8qIGl0IGJldHRlciBub3QgaGF2ZSBiZWVuIHNldCB1cCBhcyBzb21lIG90aGVyIHRyYWNrIHR5cGUgLi4uICovCisgIGlmICgoKnBfY29udGV4dCktPnR5cGUgIT0gMCkgeworICAgIGdfcmV0dXJuX3ZhbF9pZl9yZWFjaGVkIChGQUxTRSk7CisgIH0KKworICBzdWJ0aXRsZV9jb250ZXh0ID0gZ19yZW5ldyAoR3N0TWF0cm9za2FUcmFja1N1YnRpdGxlQ29udGV4dCwgKnBfY29udGV4dCwgMSk7CisgICpwX2NvbnRleHQgPSAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKikgc3VidGl0bGVfY29udGV4dDsKKworICAoKnBfY29udGV4dCktPnR5cGUgPSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRTsKKyAgc3VidGl0bGVfY29udGV4dC0+aW52YWxpZF91dGY4ID0gRkFMU0U7CisgIHN1YnRpdGxlX2NvbnRleHQtPnNlZW5fbWFya3VwX3RhZyA9IEZBTFNFOworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorZ3N0X21hdHJvc2thX3JlZ2lzdGVyX3RhZ3MgKHZvaWQpCit7CisgIC8qIFRPRE86IHJlZ2lzdGVyIG90aGVyIGN1c3RvbSB0YWdzICovCit9CisKK0dzdEJ1ZmZlckxpc3QgKgorZ3N0X21hdHJvc2thX3BhcnNlX3hpcGhfc3RyZWFtX2hlYWRlcnMgKGdwb2ludGVyIGNvZGVjX2RhdGEsCisgICAgZ3NpemUgY29kZWNfZGF0YV9zaXplKQoreworICBHc3RCdWZmZXJMaXN0ICpsaXN0ID0gTlVMTDsKKyAgZ3VpbnQ4ICpwID0gY29kZWNfZGF0YTsKKyAgZ2ludCBpLCBvZmZzZXQsIG51bV9wYWNrZXRzOworICBndWludCAqbGVuZ3RoLCBsYXN0OworCisgIEdTVF9NRU1EVU1QICgieGlwaCBjb2RlYyBkYXRhIiwgY29kZWNfZGF0YSwgY29kZWNfZGF0YV9zaXplKTsKKworICBpZiAoY29kZWNfZGF0YSA9PSBOVUxMIHx8IGNvZGVjX2RhdGFfc2l6ZSA9PSAwKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogc3RhcnQgb2YgdGhlIHN0cmVhbSBhbmQgdm9yYmlzIGF1ZGlvIG9yIHRoZW9yYSB2aWRlbywgbmVlZCB0bworICAgKiBzZW5kIHRoZSBjb2RlY19wcml2IGRhdGEgYXMgZmlyc3QgdGhyZWUgcGFja2V0cyAqLworICBudW1fcGFja2V0cyA9IHBbMF0gKyAxOworICBHU1RfREVCVUcgKCIldSBzdHJlYW0gaGVhZGVycywgdG90YWwgbGVuZ3RoPSUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMiLAorICAgICAgKGd1aW50KSBudW1fcGFja2V0cywgY29kZWNfZGF0YV9zaXplKTsKKworICBsZW5ndGggPSBnX2FsbG9jYSAobnVtX3BhY2tldHMgKiBzaXplb2YgKGd1aW50KSk7CisgIGxhc3QgPSAwOworICBvZmZzZXQgPSAxOworCisgIC8qIGZpcnN0IHBhY2tldHMsIHJlYWQgbGVuZ3RoIHZhbHVlcyAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhY2tldHMgLSAxOyBpKyspIHsKKyAgICBsZW5ndGhbaV0gPSAwOworICAgIHdoaWxlIChvZmZzZXQgPCBjb2RlY19kYXRhX3NpemUpIHsKKyAgICAgIGxlbmd0aFtpXSArPSBwW29mZnNldF07CisgICAgICBpZiAocFtvZmZzZXQrK10gIT0gMHhmZikKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGxhc3QgKz0gbGVuZ3RoW2ldOworICB9CisgIGlmIChvZmZzZXQgKyBsYXN0ID4gY29kZWNfZGF0YV9zaXplKQorICAgIGdvdG8gZXJyb3I7CisKKyAgLyogbGFzdCBwYWNrZXQgaXMgdGhlIHJlbWFpbmluZyBzaXplICovCisgIGxlbmd0aFtpXSA9IGNvZGVjX2RhdGFfc2l6ZSAtIG9mZnNldCAtIGxhc3Q7CisKKyAgbGlzdCA9IGdzdF9idWZmZXJfbGlzdF9uZXcgKCk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9wYWNrZXRzOyBpKyspIHsKKyAgICBHc3RCdWZmZXIgKmhkcjsKKworICAgIEdTVF9ERUJVRyAoImJ1ZmZlciAlZDogJXUgYnl0ZXMiLCBpLCAoZ3VpbnQpIGxlbmd0aFtpXSk7CisKKyAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoW2ldID4gY29kZWNfZGF0YV9zaXplKQorICAgICAgZ290byBlcnJvcjsKKworICAgIGhkciA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGdfbWVtZHVwIChwICsgb2Zmc2V0LCBsZW5ndGhbaV0pLCBsZW5ndGhbaV0pOworICAgIGdzdF9idWZmZXJfbGlzdF9hZGQgKGxpc3QsIGhkcik7CisKKyAgICBvZmZzZXQgKz0gbGVuZ3RoW2ldOworICB9CisKKyAgcmV0dXJuIGxpc3Q7CisKKy8qIEVSUk9SUyAqLworZXJyb3I6CisgIHsKKyAgICBpZiAobGlzdCAhPSBOVUxMKQorICAgICAgZ3N0X2J1ZmZlcl9saXN0X3VucmVmIChsaXN0KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitHc3RCdWZmZXJMaXN0ICoKK2dzdF9tYXRyb3NrYV9wYXJzZV9zcGVleF9zdHJlYW1faGVhZGVycyAoZ3BvaW50ZXIgY29kZWNfZGF0YSwKKyAgICBnc2l6ZSBjb2RlY19kYXRhX3NpemUpCit7CisgIEdzdEJ1ZmZlckxpc3QgKmxpc3QgPSBOVUxMOworICBHc3RCdWZmZXIgKmhkcjsKKyAgZ3VpbnQ4ICpwZGF0YSA9IGNvZGVjX2RhdGE7CisKKyAgR1NUX01FTURVTVAgKCJzcGVleCBjb2RlYyBkYXRhIiwgY29kZWNfZGF0YSwgY29kZWNfZGF0YV9zaXplKTsKKworICBpZiAoY29kZWNfZGF0YSA9PSBOVUxMIHx8IGNvZGVjX2RhdGFfc2l6ZSA8IDgwKSB7CisgICAgR1NUX1dBUk5JTkcgKCJub3QgZW5vdWdoIGNvZGVjIHByaXYgZGF0YSBmb3Igc3BlZXggaGVhZGVycyIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKG1lbWNtcCAocGRhdGEsICJTcGVleCAgICIsIDgpICE9IDApIHsKKyAgICBHU1RfV0FSTklORyAoIm5vIFNwZWV4IG1hcmtlciBhdCBzdGFydCBvZiBzdHJlYW0gaGVhZGVycyIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgbGlzdCA9IGdzdF9idWZmZXJfbGlzdF9uZXcgKCk7CisKKyAgaGRyID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ19tZW1kdXAgKHBkYXRhLCA4MCksIDgwKTsKKyAgZ3N0X2J1ZmZlcl9saXN0X2FkZCAobGlzdCwgaGRyKTsKKworICBpZiAoY29kZWNfZGF0YV9zaXplID4gODApIHsKKyAgICBoZHIgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChnX21lbWR1cCAocGRhdGEgKyA4MCwgY29kZWNfZGF0YV9zaXplIC0gODApLAorICAgICAgICBjb2RlY19kYXRhX3NpemUgLSA4MCk7CisgICAgZ3N0X2J1ZmZlcl9saXN0X2FkZCAobGlzdCwgaGRyKTsKKyAgfQorCisgIHJldHVybiBsaXN0OworfQorCitHc3RCdWZmZXJMaXN0ICoKK2dzdF9tYXRyb3NrYV9wYXJzZV9vcHVzX3N0cmVhbV9oZWFkZXJzIChncG9pbnRlciBjb2RlY19kYXRhLAorICAgIGdzaXplIGNvZGVjX2RhdGFfc2l6ZSkKK3sKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdCA9IE5VTEw7CisgIEdzdEJ1ZmZlciAqaGRyOworICBndWludDggKnBkYXRhID0gY29kZWNfZGF0YTsKKworICBHU1RfTUVNRFVNUCAoIm9wdXMgY29kZWMgZGF0YSIsIGNvZGVjX2RhdGEsIGNvZGVjX2RhdGFfc2l6ZSk7CisKKyAgaWYgKGNvZGVjX2RhdGEgPT0gTlVMTCB8fCBjb2RlY19kYXRhX3NpemUgPCAxOSkgeworICAgIEdTVF9XQVJOSU5HICgibm90IGVub3VnaCBjb2RlYyBwcml2IGRhdGEgZm9yIG9wdXMgaGVhZGVycyIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKG1lbWNtcCAocGRhdGEsICJPcHVzSGVhZCIsIDgpICE9IDApIHsKKyAgICBHU1RfV0FSTklORyAoIm5vIE9wdXNIZWFkIG1hcmtlciBhdCBzdGFydCBvZiBzdHJlYW0gaGVhZGVycyIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgbGlzdCA9IGdzdF9idWZmZXJfbGlzdF9uZXcgKCk7CisKKyAgaGRyID0KKyAgICAgIGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGdfbWVtZHVwIChwZGF0YSwgY29kZWNfZGF0YV9zaXplKSwKKyAgICAgIGNvZGVjX2RhdGFfc2l6ZSk7CisgIGdzdF9idWZmZXJfbGlzdF9hZGQgKGxpc3QsIGhkcik7CisKKyAgcmV0dXJuIGxpc3Q7Cit9CisKK0dzdEJ1ZmZlckxpc3QgKgorZ3N0X21hdHJvc2thX3BhcnNlX2ZsYWNfc3RyZWFtX2hlYWRlcnMgKGdwb2ludGVyIGNvZGVjX2RhdGEsCisgICAgZ3NpemUgY29kZWNfZGF0YV9zaXplKQoreworICBHc3RCdWZmZXJMaXN0ICpsaXN0ID0gTlVMTDsKKyAgR3N0QnVmZmVyICpoZHI7CisgIGd1aW50OCAqcGRhdGEgPSBjb2RlY19kYXRhOworICBndWludCBsZW4sIG9mZjsKKworICBHU1RfTUVNRFVNUCAoImZsYWMgY29kZWMgZGF0YSIsIGNvZGVjX2RhdGEsIGNvZGVjX2RhdGFfc2l6ZSk7CisKKyAgLyogbmVlZCBhdCBsZWFzdCAnZkxhQycgbWFya2VyICsgU1RSRUFNSU5GTyBtZXRhZGF0YSBibG9jayAqLworICBpZiAoY29kZWNfZGF0YSA9PSBOVUxMIHx8IGNvZGVjX2RhdGFfc2l6ZSA8ICgoNCkgKyAoNCArIDM0KSkpIHsKKyAgICBHU1RfV0FSTklORyAoIm5vdCBlbm91Z2ggY29kZWMgcHJpdiBkYXRhIGZvciBmbGFjIGhlYWRlcnMiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChtZW1jbXAgKHBkYXRhLCAiZkxhQyIsIDQpICE9IDApIHsKKyAgICBHU1RfV0FSTklORyAoIm5vIGZsYWMgbWFya2VyIGF0IHN0YXJ0IG9mIHN0cmVhbSBoZWFkZXJzIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBsaXN0ID0gZ3N0X2J1ZmZlcl9saXN0X25ldyAoKTsKKworICBoZHIgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChnX21lbWR1cCAocGRhdGEsIDQpLCA0KTsKKyAgZ3N0X2J1ZmZlcl9saXN0X2FkZCAobGlzdCwgaGRyKTsKKworICAvKiBza2lwIGZMYUMgbWFya2VyICovCisgIG9mZiA9IDQ7CisKKyAgd2hpbGUgKG9mZiA8IGNvZGVjX2RhdGFfc2l6ZSAtIDMpIHsKKyAgICBsZW4gPSBHU1RfUkVBRF9VSU5UOCAocGRhdGEgKyBvZmYgKyAxKSA8PCAxNjsKKyAgICBsZW4gfD0gR1NUX1JFQURfVUlOVDggKHBkYXRhICsgb2ZmICsgMikgPDwgODsKKyAgICBsZW4gfD0gR1NUX1JFQURfVUlOVDggKHBkYXRhICsgb2ZmICsgMyk7CisKKyAgICBHU1RfREVCVUcgKCJoZWFkZXIgcGFja2V0OiBsZW49JXUgYnl0ZXMsIGZsYWdzPTB4JTAyeCIsIGxlbiwgcGRhdGFbb2ZmXSk7CisKKyAgICBpZiAob2ZmICsgbGVuID4gY29kZWNfZGF0YV9zaXplKSB7CisgICAgICBnc3RfYnVmZmVyX2xpc3RfdW5yZWYgKGxpc3QpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaGRyID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAoZ19tZW1kdXAgKHBkYXRhICsgb2ZmLCBsZW4gKyA0KSwgbGVuICsgNCk7CisgICAgZ3N0X2J1ZmZlcl9saXN0X2FkZCAobGlzdCwgaGRyKTsKKworICAgIG9mZiArPSA0ICsgbGVuOworICB9CisgIHJldHVybiBsaXN0OworfQorCitHc3RDbG9ja1RpbWUKK2dzdF9tYXRyb3NrYV90cmFja19nZXRfYnVmZmVyX3RpbWVzdGFtcCAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiB0cmFjaywKKyAgICBHc3RCdWZmZXIgKiBidWYpCit7CisgIGlmICh0cmFjay0+ZHRzX29ubHkpIHsKKyAgICByZXR1cm4gR1NUX0JVRkZFUl9EVFNfT1JfUFRTIChidWYpOworICB9IGVsc2UgeworICAgIHJldHVybiBHU1RfQlVGRkVSX1BUUyAoYnVmKTsKKyAgfQorfQorCit2b2lkCitnc3RfbWF0cm9za2FfdHJhY2tfZnJlZSAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiB0cmFjaykKK3sKKyAgZ19mcmVlICh0cmFjay0+Y29kZWNfaWQpOworICBnX2ZyZWUgKHRyYWNrLT5jb2RlY19uYW1lKTsKKyAgZ19mcmVlICh0cmFjay0+bmFtZSk7CisgIGdfZnJlZSAodHJhY2stPmxhbmd1YWdlKTsKKyAgZ19mcmVlICh0cmFjay0+Y29kZWNfcHJpdik7CisgIGdfZnJlZSAodHJhY2stPmNvZGVjX3N0YXRlKTsKKworICBpZiAodHJhY2stPmVuY29kaW5ncyAhPSBOVUxMKSB7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdHJhY2stPmVuY29kaW5ncy0+bGVuOyArK2kpIHsKKyAgICAgIEdzdE1hdHJvc2thVHJhY2tFbmNvZGluZyAqZW5jID0gJmdfYXJyYXlfaW5kZXggKHRyYWNrLT5lbmNvZGluZ3MsCisgICAgICAgICAgR3N0TWF0cm9za2FUcmFja0VuY29kaW5nLAorICAgICAgICAgIGkpOworCisgICAgICBnX2ZyZWUgKGVuYy0+Y29tcF9zZXR0aW5ncyk7CisgICAgfQorICAgIGdfYXJyYXlfZnJlZSAodHJhY2stPmVuY29kaW5ncywgVFJVRSk7CisgIH0KKworICBpZiAodHJhY2stPnRhZ3MpCisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0cmFjay0+dGFncyk7CisKKyAgaWYgKHRyYWNrLT5pbmRleF90YWJsZSkKKyAgICBnX2FycmF5X2ZyZWUgKHRyYWNrLT5pbmRleF90YWJsZSwgVFJVRSk7CisKKyAgaWYgKHRyYWNrLT5zdHJlYW1faGVhZGVycykKKyAgICBnc3RfYnVmZmVyX2xpc3RfdW5yZWYgKHRyYWNrLT5zdHJlYW1faGVhZGVycyk7CisKKyAgZ19mcmVlICh0cmFjayk7Cit9CmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmggYi9nc3QvbWF0cm9za2EvbWF0cm9za2EtaWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE4ODAxMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1pZHMuaApAQCAtMCwwICsxLDY4OSBAQAorLyogR1N0cmVhbWVyIE1hdHJvc2thIG11eGVyL2RlbXV4ZXIKKyAqIChjKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqCisgKiBtYXRyb3NrYS1pZHMuaDogbWF0cm9za2EgZmlsZS9zdHJlYW0gZGF0YSBJRHMKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX01BVFJPU0tBX0lEU19IX18KKyNkZWZpbmUgX19HU1RfTUFUUk9TS0FfSURTX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby1pbmZvLmg+CisKKyNpbmNsdWRlICJlYm1sLWlkcy5oIgorCisvKgorICogRUJNTCBEb2NUeXBlLgorICovCisKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0RPQ1RZUEVfTUFUUk9TS0EgICAgICAgICAgICAgICJtYXRyb3NrYSIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0RPQ1RZUEVfV0VCTSAgICAgICAgICAgICAgICAgICJ3ZWJtIgorCisvKgorICogTWF0cm9za2EgZWxlbWVudCBJRHMuIG1heC4gMzItYml0LgorICovCisKKy8qIHRvcGxldmVsIFNlZ21lbnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1NFR01FTlQgICAgICAgICAgICAgICAgICAgIDB4MTg1MzgwNjcKKworLyogbWF0cm9za2EgdG9wLWxldmVsIG1hc3RlciBJRHMsIGNoaWxkcyBvZiBTZWdtZW50ICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9TRUdNRU5USU5GTyAgICAgICAgICAgICAgICAweDE1NDlBOTY2CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UUkFDS1MgICAgICAgICAgICAgICAgICAgICAweDE2NTRBRTZCCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DVUVTICAgICAgICAgICAgICAgICAgICAgICAweDFDNTNCQjZCCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UQUdTICAgICAgICAgICAgICAgICAgICAgICAweDEyNTRDMzY3CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9TRUVLSEVBRCAgICAgICAgICAgICAgICAgICAweDExNEQ5Qjc0CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DTFVTVEVSICAgICAgICAgICAgICAgICAgICAweDFGNDNCNjc1CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9BVFRBQ0hNRU5UUyAgICAgICAgICAgICAgICAweDE5NDFBNDY5CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSUyAgICAgICAgICAgICAgICAgICAweDEwNDNBNzcwCisKKy8qIElEcyBpbiB0aGUgU2VnbWVudEluZm8gbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9USU1FQ09ERVNDQUxFICAgICAgICAgICAgICAweDJBRDdCMQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfRFVSQVRJT04gICAgICAgICAgICAgICAgICAgMHg0NDg5CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9XUklUSU5HQVBQICAgICAgICAgICAgICAgICAweDU3NDEKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX01VWElOR0FQUCAgICAgICAgICAgICAgICAgIDB4NEQ4MAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfREFURVVUQyAgICAgICAgICAgICAgICAgICAgMHg0NDYxCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9TRUdNRU5UVUlEICAgICAgICAgICAgICAgICAweDczQTQKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1NFR01FTlRGSUxFTkFNRSAgICAgICAgICAgIDB4NzM4NAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfUFJFVlVJRCAgICAgICAgICAgICAgICAgICAgMHgzQ0I5MjMKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1BSRVZGSUxFTkFNRSAgICAgICAgICAgICAgIDB4M0M4M0FCCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9ORVhUVUlEICAgICAgICAgICAgICAgICAgICAweDNFQjkyMworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfTkVYVEZJTEVOQU1FICAgICAgICAgICAgICAgMHgzRTgzQkIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RJVExFICAgICAgICAgICAgICAgICAgICAgIDB4N0JBOQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfU0VHTUVOVEZBTUlMWSAgICAgICAgICAgICAgMHg0NDQ0CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSVFJBTlNMQVRFICAgICAgICAgICAweDY5MjQKKworLyogSURzIGluIHRoZSBDaGFwdGVyVHJhbnNsYXRlIG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUlRSQU5TTEFURUVESVRJT05VSUQgMHg2OUZDCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSVFJBTlNMQVRFQ09ERUMgICAgICAweDY5QkYKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJUUkFOU0xBVEVJRCAgICAgICAgIDB4NjlBNQorCisvKiBJRCBpbiB0aGUgVHJhY2tzIG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tFTlRSWSAgICAgICAgICAgICAgICAgMHhBRQorCisvKiBJRHMgaW4gdGhlIFRyYWNrRW50cnkgbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UUkFDS05VTUJFUiAgICAgICAgICAgICAgICAweEQ3CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UUkFDS1VJRCAgICAgICAgICAgICAgICAgICAweDczQzUKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RSQUNLVFlQRSAgICAgICAgICAgICAgICAgIDB4ODMKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RSQUNLQVVESU8gICAgICAgICAgICAgICAgIDB4RTEKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RSQUNLVklERU8gICAgICAgICAgICAgICAgIDB4RTAKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRFTkNPRElOR1MgICAgICAgICAgIDB4NkQ4MAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNJRCAgICAgICAgICAgICAgICAgICAgMHg4NgorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNQUklWQVRFICAgICAgICAgICAgICAgMHg2M0EyCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DT0RFQ05BTUUgICAgICAgICAgICAgICAgICAweDI1ODY4OAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tOQU1FICAgICAgICAgICAgICAgICAgMHg1MzZFCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UUkFDS0xBTkdVQUdFICAgICAgICAgICAgICAweDIyQjU5QworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tGTEFHRU5BQkxFRCAgICAgICAgICAgMHhCOQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tGTEFHREVGQVVMVCAgICAgICAgICAgMHg4OAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tGTEFHRk9SQ0VEICAgICAgICAgICAgMHg1NUFBCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UUkFDS0ZMQUdMQUNJTkcgICAgICAgICAgICAweDlDCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UUkFDS01JTkNBQ0hFICAgICAgICAgICAgICAweDZERTcKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RSQUNLTUFYQ0FDSEUgICAgICAgICAgICAgIDB4NkRGOAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tERUZBVUxURFVSQVRJT04gICAgICAgMHgyM0UzODMKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RSQUNLVElNRUNPREVTQ0FMRSAgICAgICAgIDB4MjMzMTRGCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9NQVhCTE9DS0FERElUSU9OSUQgICAgICAgICAweDU1RUUKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RSQUNLQVRUQUNITUVOVExJTksgICAgICAgIDB4NzQ0NgorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tPVkVSTEFZICAgICAgICAgICAgICAgMHg2RkFCCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UUkFDS1RSQU5TTEFURSAgICAgICAgICAgICAweDY2MjQKKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RSQUNLT0ZGU0VUICAgICAgICAgICAgICAgIDB4NTM3RgorLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNTRVRUSU5HUyAgICAgICAgICAgICAgMHgzQTk2OTcKKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NPREVDSU5GT1VSTCAgICAgICAgICAgICAgIDB4M0I0MDQwCisvKiBzZW1pLWRyYWZ0ICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DT0RFQ0RPV05MT0FEVVJMICAgICAgICAgICAweDI2QjI0MAorLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNERUNPREVBTEwgICAgICAgICAgICAgMHhBQQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfU0VFS1BSRVJPTEwgICAgICAgICAgICAgICAgMHg1NkJCCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DT0RFQ0RFTEFZICAgICAgICAgICAgICAgICAweDU2QUEKKworLyogSURzIGluIHRoZSBUcmFja1RyYW5zbGF0ZSBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RSQUNLVFJBTlNMQVRFRURJVElPTlVJRCAgIDB4NjZGQworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tUUkFOU0xBVEVDT0RFQyAgICAgICAgMHg2NkJGCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UUkFDS1RSQU5TTEFURVRSQUNLSUQgICAgICAweDY2QTUKKworCisvKiBJRHMgaW4gdGhlIFRyYWNrVmlkZW8gbWFzdGVyICovCisvKiBOT1RFOiBUaGlzIG9uZSBpcyBoZXJlIG9ubHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKiBVc2UgX1RSQUNLREVGQVVMRFVSQVRJT04gKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1ZJREVPRlJBTUVSQVRFICAgICAgICAgICAgIDB4MjM4M0UzCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9WSURFT0RJU1BMQVlXSURUSCAgICAgICAgICAweDU0QjAKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1ZJREVPRElTUExBWUhFSUdIVCAgICAgICAgIDB4NTRCQQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVklERU9ESVNQTEFZVU5JVCAgICAgICAgICAgMHg1NEIyCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9WSURFT1BJWEVMV0lEVEggICAgICAgICAgICAweEIwCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9WSURFT1BJWEVMSEVJR0hUICAgICAgICAgICAweEJBCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9WSURFT1BJWEVMQ1JPUEJPVFRPTSAgICAgICAweDU0QUEKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1ZJREVPUElYRUxDUk9QVE9QICAgICAgICAgIDB4NTRCQgorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVklERU9QSVhFTENST1BMRUZUICAgICAgICAgMHg1NENDCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9WSURFT1BJWEVMQ1JPUFJJR0hUICAgICAgICAweDU0REQKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1ZJREVPRkxBR0lOVEVSTEFDRUQgICAgICAgIDB4OUEKKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1ZJREVPU1RFUkVPTU9ERSAgICAgICAgICAgIDB4NTNCOAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVklERU9BU1BFQ1RSQVRJT1RZUEUgICAgICAgMHg1NEIzCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9WSURFT0NPTE9VUlNQQUNFICAgICAgICAgICAweDJFQjUyNAorLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVklERU9HQU1NQVZBTFVFICAgICAgICAgICAgMHgyRkI1MjMKKworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVklERU9DT0xPVVIgICAgICAgICAgICAgICAgMHg1NUIwCisvKiBJRHMgaW4gdGhlIENvbG91ciBtYXN0ZXIqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVklERU9NQVRSSVhDT0VGRklDSUVOVFMgICAgMHg1NUIxCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9WSURFT1JBTkdFICAgICAgICAgICAgICAgICAweDU1QjkKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1ZJREVPVFJBTlNGRVJDSEFSQUNURVJJU1RJQ1MgIDB4NTVCQQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVklERU9QUklNQVJJRVMgICAgICAgICAgICAgMHg1NUJCCisKKy8qIElEcyBpbiB0aGUgVHJhY2tBdWRpbyBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0FVRElPU0FNUExJTkdGUkVRICAgICAgICAgIDB4QjUKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0FVRElPQklUREVQVEggICAgICAgICAgICAgIDB4NjI2NAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQVVESU9DSEFOTkVMUyAgICAgICAgICAgICAgMHg5RgorLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQVVESU9DSEFOTkVMUE9TSVRJT05TICAgICAgMHg3RDdCCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9BVURJT09VVFBVVFNBTVBMSU5HRlJFUSAgICAweDc4QjUKKworLyogSURzIGluIHRoZSBUcmFja0NvbnRlbnRFbmNvZGluZyBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRFTkNPRElORyAgICAgICAgICAgIDB4NjI0MAorCisvKiBJRHMgaW4gdGhlIENvbnRlbnRFbmNvZGluZyBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRFTkNPRElOR09SREVSICAgICAgIDB4NTAzMQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ09OVEVOVEVOQ09ESU5HU0NPUEUgICAgICAgMHg1MDMyCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DT05URU5URU5DT0RJTkdUWVBFICAgICAgICAweDUwMzMKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRDT01QUkVTU0lPTiAgICAgICAgIDB4NTAzNAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ09OVEVOVEVOQ1JZUFRJT04gICAgICAgICAgMHg1MDM1CisKKy8qIElEcyBpbiB0aGUgQ29udGVudENvbXByZXNzaW9uIG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ09OVEVOVENPTVBBTEdPICAgICAgICAgICAgMHg0MjU0CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DT05URU5UQ09NUFNFVFRJTkdTICAgICAgICAweDQyNTUKKworLyogSURzIGluIHRoZSBDb250ZW50RW5jcnlwdGlvbiBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRFTkNBTEdPICAgICAgICAgICAgIDB4NDdFMQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ09OVEVOVEVOQ0tFWUlEICAgICAgICAgICAgMHg0N0UyCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DT05URU5UU0lHTkFUVVJFICAgICAgICAgICAweDQ3RTMKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRTSUdLRVlJRCAgICAgICAgICAgIDB4NDdFNAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ09OVEVOVFNJR0FMR08gICAgICAgICAgICAgMHg0N0U1CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DT05URU5UU0lHSEFTSEFMR08gICAgICAgICAweDQ3RTYKKworLyogSUQgaW4gdGhlIENVRXMgbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9QT0lOVEVOVFJZICAgICAgICAgICAgICAgICAweEJCCisKKy8qIElEcyBpbiB0aGUgcG9pbnRlbnRyeSBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NVRVRJTUUgICAgICAgICAgICAgICAgICAgIDB4QjMKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NVRVRSQUNLUE9TSVRJT05TICAgICAgICAgIDB4QjcKKworLyogSURzIGluIHRoZSBDdWVUcmFja1Bvc2l0aW9ucyBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NVRVRSQUNLICAgICAgICAgICAgICAgICAgIDB4RjcKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NVRUNMVVNURVJQT1NJVElPTiAgICAgICAgIDB4RjEKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NVRUJMT0NLTlVNQkVSICAgICAgICAgICAgIDB4NTM3OAorLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ1VFQ09ERUNTVEFURSAgICAgICAgICAgICAgMHhFQQorLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ1VFUkVGRVJFTkNFICAgICAgICAgICAgICAgMHhEQgorCisvKiBJRHMgaW4gdGhlIEN1ZVJlZmVyZW5jZSBtYXN0ZXIgKi8KKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NVRVJFRlRJTUUgICAgICAgICAgICAgICAgIDB4OTYKKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NVRVJFRkNMVVNURVIgICAgICAgICAgICAgIDB4OTcKKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NVRVJFRk5VTUJFUiAgICAgICAgICAgICAgIDB4NTM1RgorLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ1VFUkVGQ09ERUNTVEFURSAgICAgICAgICAgMHhFQgorCisvKiBJRHMgaW4gdGhlIFRhZ3MgbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UQUcgICAgICAgICAgICAgICAgICAgICAgICAweDczNzMKKworLyogaW4gdGhlIFRhZyBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1NJTVBMRVRBRyAgICAgICAgICAgICAgICAgIDB4NjdDOAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVEFSR0VUUyAgICAgICAgICAgICAgICAgICAgMHg2M0MwCisKKy8qIGluIHRoZSBTaW1wbGVUYWcgbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UQUdOQU1FICAgICAgICAgICAgICAgICAgICAweDQ1QTMKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RBR1NUUklORyAgICAgICAgICAgICAgICAgIDB4NDQ4NworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVEFHTEFOR1VBR0UgICAgICAgICAgICAgICAgMHg0NDdBCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UQUdERUZBVUxUICAgICAgICAgICAgICAgICAweDQ0ODQKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RBR0JJTkFSWSAgICAgICAgICAgICAgICAgIDB4NDQ4NQorCisvKiBpbiB0aGUgVGFyZ2V0cyBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RBUkdFVFRZUEVWQUxVRSAgICAgICAgICAgIDB4NjhDQQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVEFSR0VUVFlQRSAgICAgICAgICAgICAgICAgMHg2M0NBCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UQVJHRVRUUkFDS1VJRCAgICAgICAgICAgICAweDYzQzUKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1RBUkdFVEVESVRJT05VSUQgICAgICAgICAgIDB4NjNDOQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVEFSR0VUQ0hBUFRFUlVJRCAgICAgICAgICAgMHg2M0M0CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9UQVJHRVRBVFRBQ0hNRU5UVUlEICAgICAgICAweDYzQzYKKworLyogSURzIGluIHRoZSBTZWVrSGVhZCBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1NFRUtFTlRSWSAgICAgICAgICAgICAgICAgIDB4NERCQgorCisvKiBJRHMgaW4gdGhlIFNlZWtFbnRyeSBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1NFRUtJRCAgICAgICAgICAgICAgICAgICAgIDB4NTNBQgorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfU0VFS1BPU0lUSU9OICAgICAgICAgICAgICAgMHg1M0FDCisKKy8qIElEcyBpbiB0aGUgQ2x1c3RlciBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NMVVNURVJUSU1FQ09ERSAgICAgICAgICAgIDB4RTcKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0JMT0NLR1JPVVAgICAgICAgICAgICAgICAgIDB4QTAKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1NJTVBMRUJMT0NLICAgICAgICAgICAgICAgIDB4QTMKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1JFRkVSRU5DRUJMT0NLICAgICAgICAgICAgIDB4RkIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1BPU0lUSU9OICAgICAgICAgICAgICAgICAgIDB4QTcKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1BSRVZTSVpFICAgICAgICAgICAgICAgICAgIDB4QUIKKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0VOQ1JZUFRFREJMT0NLICAgICAgICAgICAgIDB4QUYKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1NJTEVOVFRSQUNLUyAgICAgICAgICAgICAgIDB4NTg1NAorCisvKiBJRHMgaW4gdGhlIFNpbGVudFRyYWNrcyBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1NJTEVOVFRSQUNLTlVNQkVSICAgICAgICAgIDB4NThENworCisvKiBJRHMgaW4gdGhlIEJsb2NrR3JvdXAgbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9CTE9DSyAgICAgICAgICAgICAgICAgICAgICAweEExCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9CTE9DS0RVUkFUSU9OICAgICAgICAgICAgICAweDlCCisvKiBzZW1pLWRyYWZ0ICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9CTE9DS1ZJUlRVQUwgICAgICAgICAgICAgICAweEEyCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9SRUZFUkVOQ0VCTE9DSyAgICAgICAgICAgICAweEZCCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9CTE9DS0FERElUSU9OUyAgICAgICAgICAgICAweDc1QTEKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1JFRkVSRU5DRVBSSU9SSVRZICAgICAgICAgIDB4RkEKKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1JFRkVSRU5DRVZJUlRVQUwgICAgICAgICAgIDB4RkQKKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NPREVDU1RBVEUgICAgICAgICAgICAgICAgIDB4QTQKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX1NMSUNFUyAgICAgICAgICAgICAgICAgICAgIDB4OEUKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0RJU0NBUkRQQURESU5HICAgICAgICAgICAgIDB4NzVBMgorCisvKiBJRHMgaW4gdGhlIEJsb2NrQWRkaXRpb25zIG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQkxPQ0tNT1JFICAgICAgICAgICAgICAgICAgMHhBNgorCisvKiBJRHMgaW4gdGhlIEJsb2NrTW9yZSBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0JMT0NLQURESUQgICAgICAgICAgICAgICAgIDB4RUUKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0JMT0NLQURESVRJT05BTCAgICAgICAgICAgIDB4QTUKKworLyogSURzIGluIHRoZSBTbGljZXMgbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9USU1FU0xJQ0UgICAgICAgICAgICAgICAgICAweEU4CisKKy8qIElEcyBpbiB0aGUgVGltZVNsaWNlIG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfTEFDRU5VTUJFUiAgICAgICAgICAgICAgICAgMHhDQworLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfRlJBTUVOVU1CRVIgICAgICAgICAgICAgICAgMHhDRAorLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQkxPQ0tBRERJVElPTklEICAgICAgICAgICAgMHhDQgorLyogc2VtaS1kcmFmdCAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVElNRVNMSUNFREVMQVkgICAgICAgICAgICAgMHhDRQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfVElNRVNMSUNFRFVSQVRJT04gICAgICAgICAgMHhDRgorCisvKiBJRHMgaW4gdGhlIEF0dGFjaG1lbnRzIG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQVRUQUNIRURGSUxFICAgICAgICAgICAgICAgMHg2MUE3CisKKy8qIElEcyBpbiB0aGUgQXR0YWNoZWRGaWxlIG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfRklMRURFU0NSSVBUSU9OICAgICAgICAgICAgMHg0NjdFCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9GSUxFTkFNRSAgICAgICAgICAgICAgICAgICAweDQ2NkUKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0ZJTEVNSU1FVFlQRSAgICAgICAgICAgICAgIDB4NDY2MAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfRklMRURBVEEgICAgICAgICAgICAgICAgICAgMHg0NjVDCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9GSUxFVUlEICAgICAgICAgICAgICAgICAgICAweDQ2QUUKKy8qIHNlbWktZHJhZnQgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0ZJTEVSRUZFUlJBTCAgICAgICAgICAgICAgIDB4NDY3NQorCisvKiBJRHMgaW4gdGhlIENoYXB0ZXJzIG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfRURJVElPTkVOVFJZICAgICAgICAgICAgICAgMHg0NUI5CisKKy8qIElEcyBpbiB0aGUgRWRpdGlvbkVudHJ5IG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfRURJVElPTlVJRCAgICAgICAgICAgICAgICAgMHg0NUJDCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9FRElUSU9ORkxBR0hJRERFTiAgICAgICAgICAweDQ1QkQKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0VESVRJT05GTEFHREVGQVVMVCAgICAgICAgIDB4NDVEQgorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfRURJVElPTkZMQUdPUkRFUkVEICAgICAgICAgMHg0NURECisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSQVRPTSAgICAgICAgICAgICAgICAweEI2CisKKy8qIElEcyBpbiB0aGUgQ2hhcHRlckF0b20gbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSVUlEICAgICAgICAgICAgICAgICAweDczQzQKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJTVFJJTkdVSUQgICAgICAgICAgIDB4NTY1NAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUlRJTUVTVEFSVCAgICAgICAgICAgMHg5MQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUlRJTUVTVE9QICAgICAgICAgICAgMHg5MgorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUkZMQUdISURERU4gICAgICAgICAgMHg5OAorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUkZMQUdFTkFCTEVEICAgICAgICAgMHg0NTk4CisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSU0VHTUVOVFVJRCAgICAgICAgICAweDZFNjcKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJTRUdNRU5URURJVElPTlVJRCAgIDB4NkVCQworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUlBIWVNJQ0FMRVFVSVYgICAgICAgMHg2M0MzCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSVFJBQ0sgICAgICAgICAgICAgICAweDhGCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSRElTUExBWSAgICAgICAgICAgICAweDgwCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQUFJPQ0VTUyAgICAgICAgICAgICAgICAweDY5NDQKKworLyogSURzIGluIHRoZSBDaGFwUHJvY2VzcyBtYXN0ZXIgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NIQVBQUk9DRVNTQ09ERUNJRCAgICAgICAgIDB4Njk1NQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFBST0NFU1NQUklWQVRFICAgICAgICAgMHg0NTBECisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQUFJPQ0VTU0NPTU1BTkQgICAgICAgICAweDY5MTEKKworLyogSURzIGluIHRoZSBDaGFwUHJvY2Vzc0NvbW1hbmQgbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQUFJPQ0VTU1RJTUUgICAgICAgICAgICAweDY5MjIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0lEX0NIQVBQUk9DRVNTREFUQSAgICAgICAgICAgIDB4NjkzMworCisvKiBJRHMgaW4gdGhlIENoYXB0ZXJEaXNwbGF5IG1hc3RlciAqLworI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFNUUklORyAgICAgICAgICAgICAgICAgMHg4NQorI2RlZmluZSBHU1RfTUFUUk9TS0FfSURfQ0hBUExBTkdVQUdFICAgICAgICAgICAgICAgMHg0MzdDCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQQ09VTlRSWSAgICAgICAgICAgICAgICAweDQzN0UKKworLyogSURzIGluIHRoZSBDaGFwdGVyVHJhY2sgbWFzdGVyICovCisjZGVmaW5lIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSVFJBQ0tOVU1CRVIgICAgICAgICAweDg5CisKKy8qCisgKiBNYXRyb3NrYSBDb2RlYyBJRHMuIFN0cmluZ3MuCisgKi8KKworI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fVkZXX0ZPVVJDQyAgICJWX01TL1ZGVy9GT1VSQ0MiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19VTkNPTVBSRVNTRUQgIlZfVU5DT01QUkVTU0VEIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFRzRfU1AgICAgICJWX01QRUc0L0lTTy9TUCIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX01QRUc0X0FTUCAgICAiVl9NUEVHNC9JU08vQVNQIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFRzRfQVAgICAgICJWX01QRUc0L0lTTy9BUCIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX01QRUc0X0FWQyAgICAiVl9NUEVHNC9JU08vQVZDIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVNNUEVHNFYzICAgICJWX01QRUc0L01TL1YzIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFRzEgICAgICAgICJWX01QRUcxIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFRzIgICAgICAgICJWX01QRUcyIgorLyogRklYTUU6IG5vdCAoeWV0KSBpbiB0aGUgc3BlYyEgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX01KUEVHICAgICAgICAiVl9NSlBFRyIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1JFQUxWSURFTzEgICAiVl9SRUFML1JWMTAiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19SRUFMVklERU8yICAgIlZfUkVBTC9SVjIwIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fUkVBTFZJREVPMyAgICJWX1JFQUwvUlYzMCIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1JFQUxWSURFTzQgICAiVl9SRUFML1JWNDAiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19USEVPUkEgICAgICAgIlZfVEhFT1JBIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fUVVJQ0tUSU1FICAgICJWX1FVSUNLVElNRSIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1NOT1cgICAgICAgICAiVl9TTk9XIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fRElSQUMgICAgICAgICJWX0RJUkFDIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fVlA4ICAgICAgICAgICJWX1ZQOCIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1ZQOSAgICAgICAgICAiVl9WUDkiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19BVjEgICAgICAgICAgIlZfQVYxIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFR0hfSEVWQyAgICJWX01QRUdIL0lTTy9IRVZDIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fUFJPUkVTICAgICAgICJWX1BST1JFUyIKKworI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fTVBFRzFfTDEgICAgICAgIkFfTVBFRy9MMSIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX01QRUcxX0wyICAgICAgICJBX01QRUcvTDIiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19NUEVHMV9MMyAgICAgICAiQV9NUEVHL0wzIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUENNX0lOVF9CRSAgICAgIkFfUENNL0lOVC9CSUciCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19QQ01fSU5UX0xFICAgICAiQV9QQ00vSU5UL0xJVCIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1BDTV9GTE9BVCAgICAgICJBX1BDTS9GTE9BVC9JRUVFIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUMzICAgICAgICAgICAgIkFfQUMzIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUMzX0JTSUQ5ICAgICAgIkFfQUMzL0JTSUQ5IgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUMzX0JTSUQxMCAgICAgIkFfQUMzL0JTSUQxMCIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX0VBQzMgICAgICAgICAgICJBX0VBQzMiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19UUlVFSEQgICAgICAgICAiQV9UUlVFSEQiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19EVFMgICAgICAgICAgICAiQV9EVFMiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19WT1JCSVMgICAgICAgICAiQV9WT1JCSVMiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19GTEFDICAgICAgICAgICAiQV9GTEFDIgorLyogRklYTUU6IG5vdCB5ZXQgaW4gdGhlIHNwZWMgKi8KKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1NQRUVYICAgICAgICAgICJBX1NQRUVYIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUNNICAgICAgICAgICAgIkFfTVMvQUNNIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fVFRBICAgICAgICAgICAgIkFfVFRBMSIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1dBVlBBQ0s0ICAgICAgICJBX1dBVlBBQ0s0IgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF8xNF80ICAgICAgIkFfUkVBTC8xNF80IgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF8yOF84ICAgICAgIkFfUkVBTC8yOF84IgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF9DT09LICAgICAgIkFfUkVBTC9DT09LIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF9TSVBSICAgICAgIkFfUkVBTC9TSVBSIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF9SQUxGICAgICAgIkFfUkVBTC9SQUxGIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF9BVFJDICAgICAgIkFfUkVBTC9BVFJDIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUFDICAgICAgICAgICAgIkFfQUFDIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUFDX01QRUcyICAgICAgIkFfQUFDL01QRUcyLyIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX0FBQ19NUEVHNCAgICAgICJBX0FBQy9NUEVHNC8iCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19RVUlDS1RJTUVfUURNQyAiQV9RVUlDS1RJTUUvUURNQyIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1FVSUNLVElNRV9RRE0yICJBX1FVSUNLVElNRS9RRE0yIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fT1BVUyAgICAgICAgICAgIkFfT1BVUyIKKy8qIFVuZGVmaW5lZCBmb3Igbm93OgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fTVBDICAgICAgICAgICAgIkFfTVBDIgorKi8KKworI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfQVNDSUkgICAgICJTX1RFWFQvQVNDSUkiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9TVUJUSVRMRV9VVEY4ICAgICAgIlNfVEVYVC9VVEY4IgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfU1NBICAgICAgICJTX1RFWFQvU1NBIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfQVNTICAgICAgICJTX1RFWFQvQVNTIiAKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX1VTRiAgICAgICAiU19URVhUL1VTRiIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX1ZPQlNVQiAgICAiU19WT0JTVUIiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9TVUJUSVRMRV9IRE1WUEdTICAgIlNfSERNVi9QR1MiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9TVUJUSVRMRV9CTVAgICAgICAgIlNfSU1BR0UvQk1QIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfS0FURSAgICAgICJTX0tBVEUiCisKKy8qCisgKiBNYXRyb3NrYSB0YWdzLiBTdHJpbmdzLgorICovCisKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9USVRMRSAgICAiVElUTEUiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfQVVUSE9SICAgIkFVVEhPUiIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9BUlRJU1QgICAiQVJUSVNUIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0FMQlVNICAgICJBTEJVTSIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9DT01NRU5UUyAiQ09NTUVOVFMiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfQ09NTUVOVCAgIkNPTU1FTlQiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfQklUU1BTICAgIkJJVFNQUyIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9CUFMgICAgICAiQlBTIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0VOQ09ERVIgICJFTkNPREVSIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0lTUkMgICAgICJJU1JDIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0NPUFlSSUdIVCAiQ09QWVJJR0hUIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0JQTSAgICAgICAiQlBNIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX1RFUk1TX09GX1VTRSAiVEVSTVNfT0ZfVVNFIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0RBVEUgICAgICAiREFURSIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9DT01QT1NFUiAgIkNPTVBPU0VSIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0xFQURfUEVSRk9STUVSICAiTEVBRF9QRVJGT01FUiIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9HRU5SRSAgICAgIkdFTlJFIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX1RPVEFMX1BBUlRTICJUT1RBTF9QQVJUUyIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9QQVJUX05VTUJFUiAiUEFSVF9OVU1CRVIiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfU1VCVElUTEUgIlNVQlRJVExFIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0FDQ09NUEFOSU1FTlQgIkFDQ09NUEFOSU1FTlQiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfTFlSSUNTICJMWVJJQ1MiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfQ09ORFVDVE9SICJDT05EVUNUT1IiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfRU5DT0RFRF9CWSAiRU5DT0RFRF9CWSIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9ERVNDUklQVElPTiAiREVTQ1JJUFRJT04iCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfS0VZV09SRFMgIktFWVdPUkRTIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0RBVEVfUkVMRUFTRUQgIkRBVEVfUkVMRUFTRUQiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfREFURV9SRUNPUkRFRCAiREFURV9SRUNPUkRFRCIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9EQVRFX0VOQ09ERUQgIkRBVEVfRU5DT0RFRCIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9EQVRFX1RBR0dFRCAiREFURV9UQUdHRUQiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfREFURV9ESUdJVElaRUQgIkRBVEVfRElHSVRJWkVEIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0RBVEVfV1JJVFRFTiAiREFURV9XUklUVEVOIgorI2RlZmluZSBHU1RfTUFUUk9TS0FfVEFHX0lEX0RBVEVfUFVSQ0hBU0VEICJEQVRFX1BVUkNIQVNFRCIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9SRUNPUkRJTkdfTE9DQVRJT04gIlJFQ09SRElOR19MT0NBVElPTiIKKyNkZWZpbmUgR1NUX01BVFJPU0tBX1RBR19JRF9QUk9EVUNUSU9OX0NPUFlSSUdIVCAiUFJPRFVDVElPTl9DT1BZUklHSFQiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UQUdfSURfTElDRU5TRSAiTElDRU5TRSIKKworLyoKKyAqIFRPRE86IGFkZCB0aGlzIHRhZyAmIG1hcHBpbmdzCisgKiAiUkVQTEFZR0FJTl9HQUlOIiAtPiBHU1RfVEFHXypfR0FJTiAgIHNlZSBodHRwOi8vcmVwbGF5Z2Fpbi5oeWRyb2dlbmF1ZGlvLm9yZy9yZ19kYXRhX2Zvcm1hdC5odG1sCisgKiAiUkVQTEFZR0FJTl9QRUFLIiAtPiBHU1RfVEFHXypfUEVBSyAgIHNlZSBodHRwOi8vcmVwbGF5Z2Fpbi5oeWRyb2dlbmF1ZGlvLm9yZy9wZWFrX2RhdGFfZm9ybWF0Lmh0bWwKKyAqIGJvdGggYXJlIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0ICh0cmFjaywgYWxidW0/KQorICoKKyAqICJUT1RBTF9QQVJUUyIgLT4gR1NUX1RBR19UUkFDS19DT1VOVCAgICBkZXBlbmRpbmcgb24gdGFyZ2V0CisgKiAiUEFSVF9OVU1CRVIiIC0+IEdTVF9UQUdfVFJBQ0tfTlVNQkVSICAgZGVwZW5kaW5nIG9uIHRhcmdldAorICoKKyAqICJTT1JUX1dJVEgiIC0+IG5lc3RlZCBpbiBvdGhlciBlbGVtZW50cywgR1NUX1RBR19USVRMRV9TT1JUTkFNRSwgZXRjCisgKgorICogVE9ETzogbWF5YmUgYWRkIGN1c3RvbSBnc3RyZWFtZXIgdGFncyBmb3Igb3RoZXIgc3RhbmRhcmQgbWF0cm9za2EgdGFncywKKyAqIHNlZSBodHRwOi8vbWF0cm9za2Eub3JnL3RlY2huaWNhbC9zcGVjcy90YWdnaW5nL2luZGV4Lmh0bWwKKyAqCisgKiBUT0RPOiBoYW5kbGUgdGFnIHRhcmdldHMgYW5kIG5lc3RpbmcgY29ycmVjdGx5CisgKi8KKworLyoKKyAqIEVudW1lcmF0aW9ucyBmb3IgdmFyaW91cyB0eXBlcyAobWFwcGluZyBmcm9tIGJpbmFyeQorICogdmFsdWUgdG8gd2hhdCBpdCBhY3R1YWxseSBtZWFucykuCisgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU8gICAgPSAweDEsCisgIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX0FVRElPICAgID0gMHgyLAorICBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9DT01QTEVYICA9IDB4MywKKyAgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfTE9HTyAgICAgPSAweDEwLAorICBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRSA9IDB4MTEsCisgIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX0JVVFRPTlMgID0gMHgxMiwKKyAgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQ09OVFJPTCAgPSAweDIwLAorfSBHc3RNYXRyb3NrYVRyYWNrVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX01BVFJPU0tBX0FTUEVDVF9SQVRJT19NT0RFX0ZSRUUgID0gMHgwLAorICBHU1RfTUFUUk9TS0FfQVNQRUNUX1JBVElPX01PREVfS0VFUCAgPSAweDEsCisgIEdTVF9NQVRST1NLQV9BU1BFQ1RfUkFUSU9fTU9ERV9GSVhFRCA9IDB4MiwKK30gR3N0TWF0cm9za2FBc3BlY3RSYXRpb01vZGU7CisKKy8qCisgKiBUaGVzZSBhcmVuJ3QgaW4gYW55IHdheSAibWF0cm9za2EtZm9ybSIgdGhpbmdzLAorICogaXQncyBqdXN0IHNvbWV0aGluZyBJIHVzZSBpbiB0aGUgbXV4ZXIvZGVtdXhlci4KKyAqLworCit0eXBlZGVmIGVudW0geworICBHU1RfTUFUUk9TS0FfVFJBQ0tfRU5BQkxFRCA9ICgxPDwwKSwKKyAgR1NUX01BVFJPU0tBX1RSQUNLX0RFRkFVTFQgPSAoMTw8MSksCisgIEdTVF9NQVRST1NLQV9UUkFDS19MQUNJTkcgID0gKDE8PDIpLAorICBHU1RfTUFUUk9TS0FfVFJBQ0tfRk9SQ0VEICA9ICgxPDwzKSwKKyAgR1NUX01BVFJPU0tBX1RSQUNLX1NISUZUICAgPSAoMTw8MTYpCit9IEdzdE1hdHJvc2thVHJhY2tGbGFnczsKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX01BVFJPU0tBX1ZJREVPVFJBQ0tfSU5URVJMQUNFRCA9IChHU1RfTUFUUk9TS0FfVFJBQ0tfU0hJRlQ8PDApCit9IEdzdE1hdHJvc2thVmlkZW9UcmFja0ZsYWdzOworCit0eXBlZGVmIGVudW0geworICBHU1RfTUFUUk9TS0FfU1RFUkVPX01PREVfU0JTX0xSICAgICAgPSAweDEsCisgIEdTVF9NQVRST1NLQV9TVEVSRU9fTU9ERV9UQl9STCAgICAgICA9IDB4MiwKKyAgR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX1RCX0xSICAgICAgID0gMHgzLAorICBHU1RfTUFUUk9TS0FfU1RFUkVPX01PREVfQ0hFQ0tFUl9STCAgPSAweDQsCisgIEdTVF9NQVRST1NLQV9TVEVSRU9fTU9ERV9DSEVDS0VSX0xSICA9IDB4NSwKKyAgR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX1NCU19STCAgICAgID0gMHg5LAorICBHU1RfTUFUUk9TS0FfU1RFUkVPX01PREVfRkJGX0xSICAgICAgPSAweEQsCisgIEdTVF9NQVRST1NLQV9TVEVSRU9fTU9ERV9GQkZfUkwgICAgICA9IDB4RQorfSBHc3RNYXRyb3NrYVN0ZXJlb01vZGU7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RNYXRyb3NrYVRyYWNrQ29udGV4dCBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dDsKKworLyogVE9ETzogY2hlY2sgaWYgYWxsIGZpZWxkcyBhcmUgdXNlZCAqLworc3RydWN0IF9Hc3RNYXRyb3NrYVRyYWNrQ29udGV4dCB7CisgIEdzdFBhZCAgICAgICAqcGFkOworICBHc3RDYXBzICAgICAgKmNhcHM7CisgIGd1aW50ICAgICAgICAgaW5kZXg7CisgIC8qIHJldmVyc2UgcGxheWJhY2sgKi8KKyAgR3N0Q2xvY2tUaW1lICBmcm9tX3RpbWU7CisgIGdpbnQ2NCAgICAgICAgICAgICAgICAgICBmcm9tX29mZnNldDsKKyAgZ2ludDY0ICAgICAgICAgICAgICAgICAgIHRvX29mZnNldDsKKworICBHQXJyYXkgICAgICAgKmluZGV4X3RhYmxlOworCisgIGdpbnQgICAgICAgICAgaW5kZXhfd3JpdGVyX2lkOworCisgIC8qIHNvbWUgb2Z0ZW4tdXNlZCBpbmZvICovCisgIGdjaGFyICAgICAgICAqY29kZWNfaWQsICpjb2RlY19uYW1lLCAqbmFtZSwgKmxhbmd1YWdlOworICBncG9pbnRlciAgICAgIGNvZGVjX3ByaXY7CisgIGdzaXplICAgICAgICAgY29kZWNfcHJpdl9zaXplOworICBncG9pbnRlciAgICAgIGNvZGVjX3N0YXRlOworICBnc2l6ZSAgICAgICAgIGNvZGVjX3N0YXRlX3NpemU7CisgIEdzdE1hdHJvc2thVHJhY2tUeXBlIHR5cGU7CisgIGd1aW50NjQgICAgICAgdWlkLCBudW07CisgIEdzdE1hdHJvc2thVHJhY2tGbGFncyBmbGFnczsKKyAgZ3VpbnQ2NCAgICAgICBkZWZhdWx0X2R1cmF0aW9uOworICBndWludDY0ICAgICAgIHBvczsKKyAgZ2RvdWJsZSAgICAgICB0aW1lY29kZXNjYWxlOworICBndWludDY0ICAgICAgIHNlZWtfcHJlcm9sbDsKKyAgZ3VpbnQ2NCAgICAgICBjb2RlY19kZWxheTsKKworICBnYm9vbGVhbiAgICAgIHNldF9kaXNjb250OyAvKiBUUlVFID0gc2V0IERJU0NPTlQgZmxhZyBvbiBuZXh0IGJ1ZmZlciAqLworCisgIC8qIFN0cmVhbSBoZWFkZXIgYnVmZmVyLCB0byBwdXQgaW50byBjYXBzIGFuZCBzZW5kIGJlZm9yZSBhbnkgb3RoZXIgYnVmZmVycyAqLworICBHc3RCdWZmZXJMaXN0ICogc3RyZWFtX2hlYWRlcnM7CisgIGdib29sZWFuICAgICAgICBzZW5kX3N0cmVhbV9oZWFkZXJzOworCisgIC8qIFNwZWNpYWwgZmxhZyBmb3IgVm9iU3ViLCBmb3Igd2hpY2ggd2UgaGF2ZSB0byBzZW5kIGNvbG91ciB0YWJsZSBpbmZvCisgICAqIChpZiBhdmFpbGFibGUpIGZpcnN0IGJlZm9yZSBzZW5kaW5nIGFueSBkYXRhLCBhbmQganVzdCB0ZXN0aW5nCisgICAqIGZvciB0aW1lID09IDAgaXMgbm90IGVub3VnaCB0byBkZXRlY3QgdGhhdC4gVXNlZCBieSBkZW11eGVyICovCisgIGdib29sZWFuICAgICAgc2VuZF9kdmRfZXZlbnQ7CisKKyAgLyogU3BlY2lhbCBjb3VudGVyIGZvciBtdXhlciB0byBza2lwIHRoZSBmaXJzdCBOIHZvcmJpcy90aGVvcmEgaGVhZGVycyAtCisgICAqIHRoZXkgYXJlIHB1dCBpbnRvIGNvZGVjIHByaXZhdGUgZGF0YSwgbm90IG11eGVkIGludG8gdGhlIHN0cmVhbSAqLworICBndWludCAgICAgICAgIHhpcGhfaGVhZGVyc190b19za2lwOworCisgIC8qIFVzZWQgZm9yIHBvc3Rwcm9jZXNzaW5nIGEgZnJhbWUgYmVmb3JlIGl0IGlzIHB1c2hlZCBmcm9tIHRoZSBkZW11eGVyICovCisgIEdzdEZsb3dSZXR1cm4gKCpwb3N0cHJvY2Vzc19mcmFtZSkgKEdzdEVsZW1lbnQgKmVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0LAorCQkJCSAgICAgIEdzdEJ1ZmZlciAqKmJ1ZmZlcik7CisKKyAgLyogTGlzdCBvZiB0YWdzIGZvciB0aGlzIHN0cmVhbSAqLworICBHc3RUYWdMaXN0ICAgKnRhZ3M7CisgIC8qIFRhZ3MgY2hhbmdlZCBhbmQgc2hvdWxkIGJlIHB1c2hlZCBhZ2FpbiAqLworICBnYm9vbGVhbiAgICAgIHRhZ3NfY2hhbmdlZDsKKworICAvKiBBIEdBcnJheSBvZiBHc3RNYXRyb3NrYVRyYWNrRW5jb2Rpbmcgc3RydWN0dXJlcyB3aGljaCBjb250YWluIHRoZQorICAgKiBlbmNvZGluZyAoY29tcHJlc3Npb24vZW5jcnlwdGlvbikgc2V0dGluZ3MgZm9yIHRoaXMgdHJhY2ssIGlmIGFueSAqLworICBHQXJyYXkgICAgICAgKmVuY29kaW5nczsKKworICAvKiBXaGV0aGVyIHRoZSBzdHJlYW0gaXMgRU9TICovCisgIGdib29sZWFuICAgICAgZW9zOworCisgIC8qIGFueSBhbGlnbm1lbnQgd2UgbmVlZCBvdXIgb3V0cHV0IGJ1ZmZlcnMgdG8gaGF2ZSAqLworICBnaW50ICAgICAgICAgIGFsaWdubWVudDsKKyAgCisgIC8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggVkZXIGZpbGVzLCB3aGVyZSB0aW1lc3RhbXAgcmVwcmVzZW50cyBEVFMgKi8KKyAgZ2Jvb2xlYW4gICAgICBkdHNfb25seTsKKyAgCisgIC8qIGluZGljYXRlIHRoYXQgdGhlIHRyYWNrIGlzIHJhdyAoanBlZyxyYXcgdmFyaWFudHMpIGFuZCBzbyBwdHM9ZHRzICovCisgIGdib29sZWFuCQlpbnRyYV9vbmx5OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQgeworICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCBwYXJlbnQ7CisKKyAgZ3VpbnQgICAgICAgICBwaXhlbF93aWR0aCwgcGl4ZWxfaGVpZ2h0OworICBndWludCAgICAgICAgIGRpc3BsYXlfd2lkdGgsIGRpc3BsYXlfaGVpZ2h0OworICBnZG91YmxlICAgICAgIGRlZmF1bHRfZnBzOworICBHc3RNYXRyb3NrYUFzcGVjdFJhdGlvTW9kZSBhc3JfbW9kZTsKKyAgZ3VpbnQzMiAgICAgICBmb3VyY2M7CisKKyAgR3N0VmlkZW9NdWx0aXZpZXdNb2RlIG11bHRpdmlld19tb2RlOworICBHc3RWaWRlb011bHRpdmlld0ZsYWdzIG11bHRpdmlld19mbGFnczsKKworICAvKiBRb1MgKi8KKyAgR3N0Q2xvY2tUaW1lICBlYXJsaWVzdF90aW1lOworCisgIEdzdEJ1ZmZlciAgICAgKmRpcmFjX3VuaXQ7CisgIEdzdFZpZGVvQ29sb3JpbWV0cnkgY29sb3JpbWV0cnk7Cit9IEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RNYXRyb3NrYVRyYWNrQXVkaW9Db250ZXh0IHsKKyAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgcGFyZW50OworCisgIGd1aW50ICAgICAgICAgc2FtcGxlcmF0ZSwgY2hhbm5lbHMsIGJpdGRlcHRoOworCisgIGd1aW50MzIgICAgICAgd3Zwa19ibG9ja19pbmRleDsKK30gR3N0TWF0cm9za2FUcmFja0F1ZGlvQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1hdHJvc2thVHJhY2tTdWJ0aXRsZUNvbnRleHQgeworICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCBwYXJlbnQ7CisKKyAgZ2Jvb2xlYW4gICAgY2hlY2tfdXRmODsgICAgIC8qIGJ1ZmZlcnMgc2hvdWxkIGJlIHZhbGlkIFVURi04ICovCisgIGdib29sZWFuICAgIGNoZWNrX21hcmt1cDsgICAvKiBjaGVjayBpZiBidWZmZXJzIGNvbnRhaW4gbWFya3VwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvciBwbGFpbnRleHQgYW5kIGVzY2FwZSBjaGFyYWN0ZXJzICovCisgIGdib29sZWFuICAgIGludmFsaWRfdXRmODsgICAvKiB3b3JrIGFyb3VuZCBicm9rZW4gZmlsZXMgICAgICAqLworICBnYm9vbGVhbiAgICBzZWVuX21hcmt1cF90YWc7ICAvKiBtYXJrdXAgZm91bmQgaW4gdGV4dCAqLworfSBHc3RNYXRyb3NrYVRyYWNrU3VidGl0bGVDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBfR3N0TWF0cm9za2FJbmRleCB7CisgIGd1aW50NjQgICAgICAgIHBvczsgICAgICAvKiBvZiB0aGUgY29ycmVzcG9uZGluZyAqY2x1c3RlciohICovCisgIEdzdENsb2NrVGltZSAgIHRpbWU7ICAgICAvKiBpbiBuYW5vc2Vjb25kcyAqLworICBndWludDMyICAgICAgICBibG9jazsgICAgLyogbnVtYmVyIG9mIHRoZSBibG9jayBpbiB0aGUgY2x1c3RlciAqLworICBndWludDE2ICAgICAgICB0cmFjazsgICAgLyogcmVmZXJlbmNlIHRvICdudW0nICovCit9IEdzdE1hdHJvc2thSW5kZXg7CisKK3R5cGVkZWYgc3RydWN0IF9XYXZwYWNrNEhlYWRlciB7CisgIGd1Y2hhciAgY2tfaWQgWzRdOyAgICAgLyogInd2cGsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBndWludDMyIGNrX3NpemU7ICAgICAgIC8qIHNpemUgb2YgZW50aXJlIGZyYW1lIChtaW51cyA4LCBvZiBjb3Vyc2UpICAgICAgKi8KKyAgZ3VpbnQxNiB2ZXJzaW9uOyAgICAgICAvKiAweDQwMyBmb3Igbm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGd1aW50OCAgdHJhY2tfbm87ICAgICAgLyogdHJhY2sgbnVtYmVyICgwIGlmIG5vdCB1c2VkLCBsaWtlIG5vdykgICAgICAgICAqLworICBndWludDggIGluZGV4X25vOyAgICAgIC8qIHJlbWVtYmVyIHRoZXNlPyAoMCBpZiBub3QgdXNlZCwgbGlrZSBub3cpICAgICAgKi8KKyAgZ3VpbnQzMiB0b3RhbF9zYW1wbGVzOyAvKiBmb3IgZW50aXJlIGZpbGUgKC0xIGlmIHVua25vd24pICAgICAgICAgICAgICAgICovCisgIGd1aW50MzIgYmxvY2tfaW5kZXg7ICAgLyogaW5kZXggb2YgZmlyc3Qgc2FtcGxlIGluIGJsb2NrICh0byBmaWxlIGJlZ2luKSAqLworICBndWludDMyIGJsb2NrX3NhbXBsZXM7IC8qICMgc2FtcGxlcyBpbiB0aGlzIGJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgZ3VpbnQzMiBmbGFnczsgICAgICAgICAvKiB2YXJpb3VzIGZsYWdzIGZvciBpZCBhbmQgZGVjb2RpbmcgICAgICAgICAgICAgICovCisgIGd1aW50MzIgY3JjOyAgICAgICAgICAgLyogY3JjIGZvciBhY3R1YWwgZGVjb2RlZCBkYXRhICAgICAgICAgICAgICAgICAgICAqLworfSBXYXZwYWNrNEhlYWRlcjsKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX01BVFJPU0tBX1RSQUNLX0VOQ09ESU5HX1NDT1BFX0ZSQU1FID0gKDE8PDApLAorICBHU1RfTUFUUk9TS0FfVFJBQ0tfRU5DT0RJTkdfU0NPUEVfQ09ERUNfREFUQSA9ICgxPDwxKSwKKyAgR1NUX01BVFJPU0tBX1RSQUNLX0VOQ09ESU5HX1NDT1BFX05FWFRfQ09OVEVOVF9FTkNPRElORyA9ICgxPDwyKQorfSBHc3RNYXRyb3NrYVRyYWNrRW5jb2RpbmdTY29wZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX01BVFJPU0tBX1RSQUNLX0NPTVBSRVNTSU9OX0FMR09SSVRITV9aTElCID0gMCwKKyAgR1NUX01BVFJPU0tBX1RSQUNLX0NPTVBSRVNTSU9OX0FMR09SSVRITV9CWkxJQiA9IDEsCisgIEdTVF9NQVRST1NLQV9UUkFDS19DT01QUkVTU0lPTl9BTEdPUklUSE1fTFpPMVggPSAyLAorICBHU1RfTUFUUk9TS0FfVFJBQ0tfQ09NUFJFU1NJT05fQUxHT1JJVEhNX0hFQURFUlNUUklQID0gMworfSBHc3RNYXRyb3NrYVRyYWNrQ29tcHJlc3Npb25BbGdvcml0aG07CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RNYXRyb3NrYVRyYWNrRW5jb2RpbmcgeworICBndWludCAgIG9yZGVyOworICBndWludCAgIHNjb3BlICAgICA6IDM7CisgIGd1aW50ICAgdHlwZSAgICAgIDogMTsKKyAgZ3VpbnQgICBjb21wX2FsZ28gOiAyOworICBndWludDggKmNvbXBfc2V0dGluZ3M7CisgIGd1aW50ICAgY29tcF9zZXR0aW5nc19sZW5ndGg7Cit9IEdzdE1hdHJvc2thVHJhY2tFbmNvZGluZzsKKworZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfdmlkZW9fY29udGV4dCAgICAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiogcF9jb250ZXh0KTsKK2dib29sZWFuIGdzdF9tYXRyb3NrYV90cmFja19pbml0X2F1ZGlvX2NvbnRleHQgICAgKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICoqIHBfY29udGV4dCk7CitnYm9vbGVhbiBnc3RfbWF0cm9za2FfdHJhY2tfaW5pdF9zdWJ0aXRsZV9jb250ZXh0IChHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqKiBwX2NvbnRleHQpOworCit2b2lkIGdzdF9tYXRyb3NrYV9yZWdpc3Rlcl90YWdzICh2b2lkKTsKKworR3N0QnVmZmVyTGlzdCAqIGdzdF9tYXRyb3NrYV9wYXJzZV94aXBoX3N0cmVhbV9oZWFkZXJzICAoZ3BvaW50ZXIgY29kZWNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzaXplIGNvZGVjX2RhdGFfc2l6ZSk7CisKK0dzdEJ1ZmZlckxpc3QgKiBnc3RfbWF0cm9za2FfcGFyc2Vfc3BlZXhfc3RyZWFtX2hlYWRlcnMgKGdwb2ludGVyIGNvZGVjX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc2l6ZSBjb2RlY19kYXRhX3NpemUpOworCitHc3RCdWZmZXJMaXN0ICogZ3N0X21hdHJvc2thX3BhcnNlX29wdXNfc3RyZWFtX2hlYWRlcnMgIChncG9pbnRlciBjb2RlY19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NpemUgY29kZWNfZGF0YV9zaXplKTsKKworR3N0QnVmZmVyTGlzdCAqIGdzdF9tYXRyb3NrYV9wYXJzZV9mbGFjX3N0cmVhbV9oZWFkZXJzICAoZ3BvaW50ZXIgY29kZWNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzaXplIGNvZGVjX2RhdGFfc2l6ZSk7Cit2b2lkIGdzdF9tYXRyb3NrYV90cmFja19mcmVlIChHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIHRyYWNrKTsKK0dzdENsb2NrVGltZSBnc3RfbWF0cm9za2FfdHJhY2tfZ2V0X2J1ZmZlcl90aW1lc3RhbXAgKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICogdHJhY2ssIEdzdEJ1ZmZlciAqYnVmKTsKKworI2VuZGlmIC8qIF9fR1NUX01BVFJPU0tBX0lEU19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYyBiL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDA5ZTJlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21hdHJvc2thL21hdHJvc2thLW11eC5jCkBAIC0wLDAgKzEsNDA2NyBAQAorLyogR1N0cmVhbWVyIE1hdHJvc2thIG11eGVyL2RlbXV4ZXIKKyAqIChjKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqIChjKSAyMDA1IE1pY2hhbCBCZW5lcyA8bWljaGFsLmJlbmVzQHhlcmlzLmN6PgorICogKGMpIDIwMDggU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKiAoYykgMjAxMSBNYXJrIE5hdXdlbGFlcnRzIDxtYXJrLm5hdXdlbGFlcnRzQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBtYXRyb3NrYS1tdXguYzogbWF0cm9za2EgZmlsZS9zdHJlYW0gbXV4ZXIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKiBUT0RPOiAtIGNoZWNrIGV2ZXJ5d2hlcmUgdGhhdCB3ZSBkb24ndCB3cml0ZSBpbnZhbGlkIHZhbHVlcworICogICAgICAgLSBtYWtlIHN1cmUgdGltZXN0YW1wcyBhcmUgY29ycmVjdGx5IHNjYWxlZCBldmVyeXdoZXJlCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtbWF0cm9za2FtdXgKKyAqCisgKiBtYXRyb3NrYW11eCBtdXhlcyBkaWZmZXJlbnQgaW5wdXQgc3RyZWFtcyBpbnRvIGEgTWF0cm9za2EgZmlsZS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgZmlsZXNyYyBsb2NhdGlvbj0vcGF0aC90by9tcDMgISBtcGVnYXVkaW9wYXJzZSAhIG1hdHJvc2thbXV4IG5hbWU9bXV4ICEgZmlsZXNpbmsgbG9jYXRpb249dGVzdC5ta3YgIGZpbGVzcmMgbG9jYXRpb249L3BhdGgvdG8vdGhlb3JhLm9nZyAhIG9nZ2RlbXV4ICEgdGhlb3JhcGFyc2UgISBtdXguCisgKiBdfCBUaGlzIHBpcGVsaW5lIG11eGVzIGFuIE1QMyBmaWxlIGFuZCBhIE9nZyBUaGVvcmEgdmlkZW8gaW50byBhIE1hdHJvc2thIGZpbGUuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgYXVkaW90ZXN0c3JjIG51bS1idWZmZXJzPTEwMCAhIGF1ZGlvY29udmVydCAhIHZvcmJpc2VuYyAhIG1hdHJvc2thbXV4ICEgZmlsZXNpbmsgbG9jYXRpb249dGVzdC5ta2EKKyAqIF18IFRoaXMgcGlwZWxpbmUgbXV4ZXMgYSA0NDBIeiBzaW5lIHdhdmUgZW5jb2RlZCB3aXRoIHRoZSBWb3JiaXMgY29kZWMgaW50byBhIE1hdHJvc2thIGZpbGUuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L3JpZmYvcmlmZi1tZWRpYS5oPgorI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvY29kZWMtdXRpbHMuaD4KKworI2luY2x1ZGUgIm1hdHJvc2thLW11eC5oIgorI2luY2x1ZGUgIm1hdHJvc2thLWlkcy5oIgorCisjZGVmaW5lIEdTVF9NQVRST1NLQV9NVVhfQ0hBUExBTkcgInVuZCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAobWF0cm9za2FtdXhfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgbWF0cm9za2FtdXhfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfV1JJVElOR19BUFAsCisgIFBST1BfRE9DVFlQRV9WRVJTSU9OLAorICBQUk9QX01JTl9JTkRFWF9JTlRFUlZBTCwKKyAgUFJPUF9TVFJFQU1BQkxFLAorICBQUk9QX1RJTUVDT0RFU0NBTEUsCisgIFBST1BfTUlOX0NMVVNURVJfRFVSQVRJT04sCisgIFBST1BfTUFYX0NMVVNURVJfRFVSQVRJT04KK307CisKKyNkZWZpbmUgIERFRkFVTFRfRE9DVFlQRV9WRVJTSU9OICAgICAgICAgMgorI2RlZmluZSAgREVGQVVMVF9XUklUSU5HX0FQUCAgICAgICAgICAgICAiR1N0cmVhbWVyIE1hdHJvc2thIG11eGVyIgorI2RlZmluZSAgREVGQVVMVF9NSU5fSU5ERVhfSU5URVJWQUwgICAgICAwCisjZGVmaW5lICBERUZBVUxUX1NUUkVBTUFCTEUgICAgICAgICAgICAgIEZBTFNFCisjZGVmaW5lICBERUZBVUxUX1RJTUVDT0RFU0NBTEUgICAgICAgICAgIEdTVF9NU0VDT05ECisjZGVmaW5lICBERUZBVUxUX01JTl9DTFVTVEVSX0RVUkFUSU9OICAgIDUwMCAqIEdTVF9NU0VDT05ECisjZGVmaW5lICBERUZBVUxUX01BWF9DTFVTVEVSX0RVUkFUSU9OICAgIDY1NTM1ICogR1NUX01TRUNPTkQKKworLyogV0FWRUZPUk1BVEVYIGlzIGdzdF9yaWZmX3N0cmZfYXVkcyArIGFuIGV4dHJhIGd1aW50MTYgZXh0ZW5zaW9uIHNpemUgKi8KKyNkZWZpbmUgV0FWRUZPUk1BVEVYX1NJWkUgICgyICsgc2l6ZW9mIChnc3RfcmlmZl9zdHJmX2F1ZHMpKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtbWF0cm9za2E7IHZpZGVvL3gtbWF0cm9za2EtM2Q7IGF1ZGlvL3gtbWF0cm9za2EiKQorICAgICk7CisKKyNkZWZpbmUgQ09NTU9OX1ZJREVPX0NBUFMgXAorICAid2lkdGggPSAoaW50KSBbIDE2LCBNQVggXSwgIiBcCisgICJoZWlnaHQgPSAoaW50KSBbIDE2LCBNQVggXSAiCisKKy8qIEZJWE1FOgorICogKiByZXF1aXJlIGNvZGVjIGRhdGEsIGV0YyBhcyBuZWVkZWQKKyAqLworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgdmlkZW9zaW5rX3RlbXBsID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInZpZGVvXyV1IiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9SRVFVRVNULAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL21wZWcsICIKKyAgICAgICAgIm1wZWd2ZXJzaW9uID0gKGludCkgeyAxLCAyLCA0IH0sICIKKyAgICAgICAgInN5c3RlbXN0cmVhbSA9IChib29sZWFuKSBmYWxzZSwgIgorICAgICAgICBDT01NT05fVklERU9fQ0FQUyAiOyAiCisgICAgICAgICJ2aWRlby94LWgyNjQsIHN0cmVhbS1mb3JtYXQ9YXZjLCBhbGlnbm1lbnQ9YXUsICIKKyAgICAgICAgQ09NTU9OX1ZJREVPX0NBUFMgIjsgIgorICAgICAgICAidmlkZW8veC1oMjY1LCBzdHJlYW0tZm9ybWF0PWh2YzEsIGFsaWdubWVudD1hdSwgIgorICAgICAgICBDT01NT05fVklERU9fQ0FQUyAiOyAiCisgICAgICAgICJ2aWRlby94LWRpdngsICIKKyAgICAgICAgQ09NTU9OX1ZJREVPX0NBUFMgIjsgIgorICAgICAgICAidmlkZW8veC1odWZmeXV2LCAiCisgICAgICAgIENPTU1PTl9WSURFT19DQVBTICI7ICIKKyAgICAgICAgInZpZGVvL3gtZHYsICIKKyAgICAgICAgQ09NTU9OX1ZJREVPX0NBUFMgIjsgIgorICAgICAgICAidmlkZW8veC1oMjYzLCAiCisgICAgICAgIENPTU1PTl9WSURFT19DQVBTICI7ICIKKyAgICAgICAgInZpZGVvL3gtbXNtcGVnLCAiCisgICAgICAgIENPTU1PTl9WSURFT19DQVBTICI7ICIKKyAgICAgICAgImltYWdlL2pwZWcsICIKKyAgICAgICAgQ09NTU9OX1ZJREVPX0NBUFMgIjsgIgorICAgICAgICAidmlkZW8veC10aGVvcmE7ICIKKyAgICAgICAgInZpZGVvL3gtZGlyYWMsICIKKyAgICAgICAgQ09NTU9OX1ZJREVPX0NBUFMgIjsgIgorICAgICAgICAidmlkZW8veC1wbi1yZWFsdmlkZW8sICIKKyAgICAgICAgInJtdmVyc2lvbiA9IChpbnQpIFsxLCA0XSwgIgorICAgICAgICBDT01NT05fVklERU9fQ0FQUyAiOyAiCisgICAgICAgICJ2aWRlby94LXZwOCwgIgorICAgICAgICBDT01NT05fVklERU9fQ0FQUyAiOyAiCisgICAgICAgICJ2aWRlby94LXZwOSwgIgorICAgICAgICBDT01NT05fVklERU9fQ0FQUyAiOyAiCisgICAgICAgICJ2aWRlby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgeyBZVVkyLCBJNDIwLCBZVjEyLCBVWVZZLCBBWVVWLCBHUkFZOCwgQkdSLCBSR0IgfSwgIgorICAgICAgICBDT01NT05fVklERU9fQ0FQUyAiOyAiCisgICAgICAgICJ2aWRlby94LXByb3JlcywgIgorICAgICAgICBDT01NT05fVklERU9fQ0FQUyAiOyAiCisgICAgICAgICJ2aWRlby94LXdtdiwgIiAid212dmVyc2lvbiA9IChpbnQpIFsgMSwgMyBdLCAiIENPTU1PTl9WSURFT19DQVBTKQorICAgICk7CisKKyNkZWZpbmUgQ09NTU9OX0FVRElPX0NBUFMgXAorICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdLCAiIFwKKyAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdIgorCisvKiBGSVhNRToKKyAqICogcmVxdWlyZSBjb2RlYyBkYXRhLCBldGMgYXMgbmVlZGVkCisgKi8KK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBhdWRpb3NpbmtfdGVtcGwgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgiYXVkaW9fJXUiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8vbXBlZywgIgorICAgICAgICAibXBlZ3ZlcnNpb24gPSAoaW50KSAxLCAiCisgICAgICAgICJsYXllciA9IChpbnQpIFsgMSwgMyBdLCAiCisgICAgICAgIENPTU1PTl9BVURJT19DQVBTICI7ICIKKyAgICAgICAgImF1ZGlvL21wZWcsICIKKyAgICAgICAgIm1wZWd2ZXJzaW9uID0gKGludCkgeyAyLCA0IH0sICIKKyAgICAgICAgInN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSByYXcsICIKKyAgICAgICAgQ09NTU9OX0FVRElPX0NBUFMgIjsgIgorICAgICAgICAiYXVkaW8veC1hYzMsICIKKyAgICAgICAgQ09NTU9OX0FVRElPX0NBUFMgIjsgIgorICAgICAgICAiYXVkaW8veC1lYWMzLCAiCisgICAgICAgIENPTU1PTl9BVURJT19DQVBTICI7ICIKKyAgICAgICAgImF1ZGlvL3gtZHRzLCAiCisgICAgICAgIENPTU1PTl9BVURJT19DQVBTICI7ICIKKyAgICAgICAgImF1ZGlvL3gtdm9yYmlzLCAiCisgICAgICAgIENPTU1PTl9BVURJT19DQVBTICI7ICIKKyAgICAgICAgImF1ZGlvL3gtZmxhYywgIgorICAgICAgICBDT01NT05fQVVESU9fQ0FQUyAiOyAiCisgICAgICAgICJhdWRpby94LW9wdXM7ICIKKyAgICAgICAgImF1ZGlvL3gtc3BlZXgsICIKKyAgICAgICAgQ09NTU9OX0FVRElPX0NBUFMgIjsgIgorICAgICAgICAiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgVTgsIFMxNkJFLCBTMTZMRSwgUzI0QkUsIFMyNExFLCBTMzJCRSwgUzMyTEUsIEYzMkxFLCBGNjRMRSB9LCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICBDT01NT05fQVVESU9fQ0FQUyAiOyIKKyAgICAgICAgImF1ZGlvL3gtdHRhLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIHsgOCwgMTYsIDI0IH0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgeyAxLCAyIH0sICIgInJhdGUgPSAoaW50KSBbIDgwMDAsIDk2MDAwIF07ICIKKyAgICAgICAgImF1ZGlvL3gtcG4tcmVhbGF1ZGlvLCAiCisgICAgICAgICJyYXZlcnNpb24gPSAoaW50KSB7IDEsIDIsIDggfSwgIiBDT01NT05fQVVESU9fQ0FQUyAiOyAiCisgICAgICAgICJhdWRpby94LXdtYSwgIiAid21hdmVyc2lvbiA9IChpbnQpIFsgMSwgMyBdLCAiCisgICAgICAgICJibG9ja19hbGlnbiA9IChpbnQpIFsgMCwgNjU1MzUgXSwgYml0cmF0ZSA9IChpbnQpIFsgMCwgNTI0Mjg4IF0sICIKKyAgICAgICAgQ09NTU9OX0FVRElPX0NBUFMgIjsiCisgICAgICAgICJhdWRpby94LWFsYXcsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgezEsIDJ9LCAiICJyYXRlID0gKGludCkgWyA4MDAwLCAxOTIwMDAgXTsgIgorICAgICAgICAiYXVkaW8veC1tdWxhdywgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSB7MSwgMn0sICIgInJhdGUgPSAoaW50KSBbIDgwMDAsIDE5MjAwMCBdOyAiCisgICAgICAgICJhdWRpby94LWFkcGNtLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKWR2aSwgIgorICAgICAgICAiYmxvY2tfYWxpZ24gPSAoaW50KVs2NCwgODE5Ml0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgeyAxLCAyIH0sICIgInJhdGUgPSAoaW50KSBbIDgwMDAsIDk2MDAwIF07ICIKKyAgICAgICAgImF1ZGlvL0c3MjIsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkxLCIgInJhdGUgPSAoaW50KTE2MDAwOyAiCisgICAgICAgICJhdWRpby94LWFkcGNtLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKWc3MjYsICIgImNoYW5uZWxzID0gKGludCkxLCIgInJhdGUgPSAoaW50KTgwMDA7ICIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHN1YnRpdGxlc2lua190ZW1wbCA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzdWJ0aXRsZV8ldSIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJzdWJ0aXRsZS94LWthdGU7ICIKKyAgICAgICAgInRleHQveC1yYXcsIGZvcm1hdD11dGY4OyBhcHBsaWNhdGlvbi94LXNzYTsgYXBwbGljYXRpb24veC1hc3M7ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtdXNmOyBzdWJwaWN0dXJlL3gtZHZkOyAiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXN1YnRpdGxlLXVua25vd24iKQorICAgICk7CisKK3N0YXRpYyBncG9pbnRlciBwYXJlbnRfY2xhc3M7ICAgLyogTlVMTCAqLworCisvKiBNYXRyb3NrYSBtdXhlciBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZCBnc3RfbWF0cm9za2FfbXV4X2NsYXNzX2luaXQgKEdzdE1hdHJvc2thTXV4Q2xhc3MgKiBrbGFzcyk7CitzdGF0aWMgdm9pZCBnc3RfbWF0cm9za2FfbXV4X2luaXQgKEdzdE1hdHJvc2thTXV4ICogbXV4LCBncG9pbnRlciBnX2NsYXNzKTsKK3N0YXRpYyB2b2lkIGdzdF9tYXRyb3NrYV9tdXhfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCisvKiBQYWRzIGNvbGxlY3RlZCBjYWxsYmFjayAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X21hdHJvc2thX211eF9oYW5kbGVfYnVmZmVyIChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsCisgICAgR3N0Q29sbGVjdERhdGEgKiBkYXRhLCBHc3RCdWZmZXIgKiBidWYsIGdwb2ludGVyIHVzZXJfZGF0YSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX211eF9oYW5kbGVfc2lua19ldmVudCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLAorICAgIEdzdENvbGxlY3REYXRhICogZGF0YSwgR3N0RXZlbnQgKiBldmVudCwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKworLyogcGFkIGZ1bmN0aW9ucyAqLworc3RhdGljIGdib29sZWFuIGdzdF9tYXRyb3NrYV9tdXhfaGFuZGxlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0UGFkICpnc3RfbWF0cm9za2FfbXV4X3JlcXVlc3RfbmV3X3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgY29uc3QgZ2NoYXIgKiBuYW1lLCBjb25zdCBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgdm9pZCBnc3RfbWF0cm9za2FfbXV4X3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKTsKKworLyogZ3N0IGludGVybmFsIGNoYW5nZSBzdGF0ZSBoYW5kbGVyICovCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9tYXRyb3NrYV9tdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKKy8qIGdvYmplY3QgYmxhIGJsYSAqLworc3RhdGljIHZvaWQgZ3N0X21hdHJvc2thX211eF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfbWF0cm9za2FfbXV4X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworLyogcmVzZXQgbXV4ZXIgKi8KK3N0YXRpYyB2b2lkIGdzdF9tYXRyb3NrYV9tdXhfcmVzZXQgKEdzdEVsZW1lbnQgKiBlbGVtZW50KTsKKworLyogdWlkIGdlbmVyYXRpb24gKi8KK3N0YXRpYyBndWludDY0IGdzdF9tYXRyb3NrYV9tdXhfY3JlYXRlX3VpZCAoR3N0TWF0cm9za2FNdXggKiBtdXgpOworCitzdGF0aWMgZ2Jvb2xlYW4gdGhlb3JhX3N0cmVhbWhlYWRlcl90b19jb2RlY2RhdGEgKGNvbnN0IEdWYWx1ZSAqIHN0cmVhbWhlYWRlciwKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIGNvbnRleHQpOworc3RhdGljIGdib29sZWFuIHZvcmJpc19zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChjb25zdCBHVmFsdWUgKiBzdHJlYW1oZWFkZXIsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0KTsKK3N0YXRpYyBnYm9vbGVhbiBzcGVleF9zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChjb25zdCBHVmFsdWUgKiBzdHJlYW1oZWFkZXIsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0KTsKK3N0YXRpYyBnYm9vbGVhbiBrYXRlX3N0cmVhbWhlYWRlcl90b19jb2RlY2RhdGEgKGNvbnN0IEdWYWx1ZSAqIHN0cmVhbWhlYWRlciwKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIGNvbnRleHQpOworc3RhdGljIGdib29sZWFuIGZsYWNfc3RyZWFtaGVhZGVyX3RvX2NvZGVjZGF0YSAoY29uc3QgR1ZhbHVlICogc3RyZWFtaGVhZGVyLAorICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICogY29udGV4dCk7CitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnIChjb25zdCBHc3RUYWdMaXN0ICogbGlzdCwgY29uc3QgZ2NoYXIgKiB0YWcsCisgICAgZ3BvaW50ZXIgZGF0YSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX211eF90YWdfbGlzdF9pc19lbXB0eSAoY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QpOworc3RhdGljIHZvaWQgZ3N0X21hdHJvc2thX211eF93cml0ZV9zdHJlYW1zX3RhZ3MgKEdzdE1hdHJvc2thTXV4ICogbXV4KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbWF0cm9za2FfbXV4X3N0cmVhbXNfaGF2ZV90YWdzIChHc3RNYXRyb3NrYU11eCAqIG11eCk7CisKKy8qIENhbm5vdCB1c2UgYm9pbGVycGxhdGUgbWFjcm9zIGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRoZSBmdWxsIGluaXQgZnVuY3Rpb24KKyAqIHNpZ25hdHVyZSB3aXRoIHRoZSBhZGRpdGlvbmFsIGNsYXNzIGFyZ3VtZW50LCBzbyB3ZSB1c2UgdGhlIHJpZ2h0IHRlbXBsYXRlCisgKiBmb3IgdGhlIHNpbmsgY2FwcyAqLworR1R5cGUKK2dzdF9tYXRyb3NrYV9tdXhfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBvYmplY3RfdHlwZTsgICAgIC8qIDAgKi8KKworICBpZiAob2JqZWN0X3R5cGUgPT0gMCkgeworICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gb2JqZWN0X2luZm8gPSB7CisgICAgICBzaXplb2YgKEdzdE1hdHJvc2thTXV4Q2xhc3MpLAorICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlX2luaXQgKi8KKyAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogYmFzZV9maW5hbGl6ZSAqLworICAgICAgKEdDbGFzc0luaXRGdW5jKSBnc3RfbWF0cm9za2FfbXV4X2NsYXNzX2luaXQsCisgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIGNsYXNzX2ZpbmFsaXplICovCisgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIGNsYXNzX2RhdGEgKi8KKyAgICAgIHNpemVvZiAoR3N0TWF0cm9za2FNdXgpLAorICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBuX3ByZWFsbG9jcyAqLworICAgICAgKEdJbnN0YW5jZUluaXRGdW5jKSBnc3RfbWF0cm9za2FfbXV4X2luaXQKKyAgICB9OworICAgIGNvbnN0IEdJbnRlcmZhY2VJbmZvIGlmYWNlX2luZm8gPSB7IE5VTEwgfTsKKworICAgIG9iamVjdF90eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoR1NUX1RZUEVfRUxFTUVOVCwKKyAgICAgICAgIkdzdE1hdHJvc2thTXV4IiwgJm9iamVjdF9pbmZvLCAoR1R5cGVGbGFncykgMCk7CisKKyAgICBnX3R5cGVfYWRkX2ludGVyZmFjZV9zdGF0aWMgKG9iamVjdF90eXBlLCBHU1RfVFlQRV9UQUdfU0VUVEVSLCAmaWZhY2VfaW5mbyk7CisgICAgZ190eXBlX2FkZF9pbnRlcmZhY2Vfc3RhdGljIChvYmplY3RfdHlwZSwgR1NUX1RZUEVfVE9DX1NFVFRFUiwgJmlmYWNlX2luZm8pOworICB9CisKKyAgcmV0dXJuIG9iamVjdF90eXBlOworfQorCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX211eF9jbGFzc19pbml0IChHc3RNYXRyb3NrYU11eENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZ2aWRlb3NpbmtfdGVtcGwpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZhdWRpb3NpbmtfdGVtcGwpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZzdWJ0aXRsZXNpbmtfdGVtcGwpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbCk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJNYXRyb3NrYSBtdXhlciIsCisgICAgICAiQ29kZWMvTXV4ZXIiLAorICAgICAgIk11eGVzIHZpZGVvL2F1ZGlvL3N1YnRpdGxlIHN0cmVhbXMgaW50byBhIG1hdHJvc2thIHN0cmVhbSIsCisgICAgICAiR1N0cmVhbWVyIG1haW50YWluZXJzIDxnc3RyZWFtZXItZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnPiIpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChtYXRyb3NrYW11eF9kZWJ1ZywgIm1hdHJvc2thbXV4IiwgMCwKKyAgICAgICJNYXRyb3NrYSBtdXhlciIpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X21hdHJvc2thX211eF9maW5hbGl6ZTsKKworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfbWF0cm9za2FfbXV4X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X21hdHJvc2thX211eF9zZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9XUklUSU5HX0FQUCwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJ3cml0aW5nLWFwcCIsICJXcml0aW5nIGFwcGxpY2F0aW9uLiIsCisgICAgICAgICAgIlRoZSBuYW1lIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGNyZWF0ZXMgdGhlIG1hdHJvc2thIGZpbGUuIiwKKyAgICAgICAgICBOVUxMLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ET0NUWVBFX1ZFUlNJT04sCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgidmVyc2lvbiIsICJEb2NUeXBlIHZlcnNpb24iLAorICAgICAgICAgICJUaGlzIHBhcmFtZXRlciBkZXRlcm1pbmVzIHdoYXQgTWF0cm9za2EgZmVhdHVyZXMgY2FuIGJlIHVzZWQuIiwKKyAgICAgICAgICAxLCAyLCBERUZBVUxUX0RPQ1RZUEVfVkVSU0lPTiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NSU5fSU5ERVhfSU5URVJWQUwsCisgICAgICBnX3BhcmFtX3NwZWNfaW50NjQgKCJtaW4taW5kZXgtaW50ZXJ2YWwiLCAiTWluaW11bSB0aW1lIGJldHdlZW4gaW5kZXggIgorICAgICAgICAgICJlbnRyaWVzIiwgIkFuIGluZGV4IGVudHJ5IGlzIGNyZWF0ZWQgZXZlcnkgc28gbWFueSBuYW5vc2Vjb25kcy4iLAorICAgICAgICAgIDAsIEdfTUFYSU5UNjQsIERFRkFVTFRfTUlOX0lOREVYX0lOVEVSVkFMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NUUkVBTUFCTEUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInN0cmVhbWFibGUiLCAiRGV0ZXJtaW5lcyB3aGV0aGVyIG91dHB1dCBzaG91bGQgIgorICAgICAgICAgICJiZSBzdHJlYW1hYmxlIiwgIklmIHNldCB0byB0cnVlLCB0aGUgb3V0cHV0IHNob3VsZCBiZSBhcyBpZiBpdCBpcyAiCisgICAgICAgICAgInRvIGJlIHN0cmVhbWVkIGFuZCBoZW5jZSBubyBpbmRleGVzIHdyaXR0ZW4gb3IgZHVyYXRpb24gd3JpdHRlbi4iLAorICAgICAgICAgIERFRkFVTFRfU1RSRUFNQUJMRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVElNRUNPREVTQ0FMRSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQ2NCAoInRpbWVjb2Rlc2NhbGUiLCAiVGltZWNvZGUgU2NhbGUiLAorICAgICAgICAgICJUaW1lY29kZVNjYWxlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBSYXcgVGltZWNvZGUgb2YgYSBCbG9jayIsIDEsCisgICAgICAgICAgR1NUX1NFQ09ORCwgREVGQVVMVF9USU1FQ09ERVNDQUxFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01JTl9DTFVTVEVSX0RVUkFUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX2ludDY0ICgibWluLWNsdXN0ZXItZHVyYXRpb24iLCAiTWluaW11bSBjbHVzdGVyIGR1cmF0aW9uIiwKKyAgICAgICAgICAiRGVzaWRlcmVkIGNsdXN0ZXIgZHVyYXRpb24gYXMgbmFub3NlY29uZHMuIEEgbmV3IGNsdXN0ZXIgd2lsbCBiZSAiCisgICAgICAgICAgImNyZWF0ZWQgaXJyZXNwZWN0aXZlIG9mIHRoaXMgcHJvcGVydHkgaWYgYSBmb3JjZSBrZXkgdW5pdCBldmVudCAiCisgICAgICAgICAgImlzIHJlY2VpdmVkLiAwIG1lYW5zIGNyZWF0ZSBhIG5ldyBjbHVzdGVyIGZvciBlYWNoIHZpZGVvIGtleWZyYW1lICIKKyAgICAgICAgICAib3IgZm9yIGVhY2ggYXVkaW8gYnVmZmVyIGluIGF1ZGlvIG9ubHkgc3RyZWFtcy4iLCAwLAorICAgICAgICAgIEdfTUFYSU5UNjQsIERFRkFVTFRfTUlOX0NMVVNURVJfRFVSQVRJT04sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX0NMVVNURVJfRFVSQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfaW50NjQgKCJtYXgtY2x1c3Rlci1kdXJhdGlvbiIsICJNYXhpbXVtIGNsdXN0ZXIgZHVyYXRpb24iLAorICAgICAgICAgICJBIG5ldyBjbHVzdGVyIHdpbGwgYmUgY3JlYXRlZCBpZiBpdHMgZHVyYXRpb24gZXhjZWVkcyB0aGlzIHZhbHVlLiAiCisgICAgICAgICAgIjAgbWVhbnMgbm8gbWF4aW11bSBkdXJhdGlvbi4iLCAwLAorICAgICAgICAgIEdfTUFYSU5UNjQsIERFRkFVTFRfTUFYX0NMVVNURVJfRFVSQVRJT04sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbWF0cm9za2FfbXV4X2NoYW5nZV9zdGF0ZSk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPnJlcXVlc3RfbmV3X3BhZCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX211eF9yZXF1ZXN0X25ld19wYWQpOworICBnc3RlbGVtZW50X2NsYXNzLT5yZWxlYXNlX3BhZCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX211eF9yZWxlYXNlX3BhZCk7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7Cit9CisKKy8qCisgKiBTdGFydCBvZiBwYWQgb3B0aW9uIGhhbmRsZXIgY29kZQorICovCisjZGVmaW5lIERFRkFVTFRfUEFEX0ZSQU1FX0RVUkFUSU9OIFRSVUUKKworZW51bQoreworICBQUk9QX1BBRF8wLAorICBQUk9QX1BBRF9GUkFNRV9EVVJBVElPTgorfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0UGFkIHBhcmVudDsKKyAgZ2Jvb2xlYW4gZnJhbWVfZHVyYXRpb247CisgIGdib29sZWFuIGZyYW1lX2R1cmF0aW9uX3VzZXI7Cit9IEdzdE1hdHJvc2thbXV4UGFkOworCit0eXBlZGVmIEdzdFBhZENsYXNzIEdzdE1hdHJvc2thbXV4UGFkQ2xhc3M7CisKK0dUeXBlIGdzdF9tYXRyb3NrYW11eF9wYWRfZ2V0X3R5cGUgKHZvaWQpOworR19ERUZJTkVfVFlQRSAoR3N0TWF0cm9za2FtdXhQYWQsIGdzdF9tYXRyb3NrYW11eF9wYWQsIEdTVF9UWVBFX1BBRCk7CisKKyNkZWZpbmUgR1NUX1RZUEVfTUFUUk9TS0FNVVhfUEFEIChnc3RfbWF0cm9za2FtdXhfcGFkX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9NQVRST1NLQU1VWF9QQUQocGFkKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKHBhZCksR1NUX1RZUEVfTUFUUk9TS0FNVVhfUEFELEdzdE1hdHJvc2thbXV4UGFkKSkKKyNkZWZpbmUgR1NUX01BVFJPU0tBTVVYX1BBRF9DQVNUKHBhZCkgKChHc3RNYXRyb3NrYW11eFBhZCAqKSBwYWQpCisjZGVmaW5lIEdTVF9JU19NQVRST1NLQU1VWF9QQUQocGFkKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKHBhZCksR1NUX1RZUEVfTUFUUk9TS0FNVVhfUEFEKSkKKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYW11eF9wYWRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE1hdHJvc2thbXV4UGFkICpwYWQgPSBHU1RfTUFUUk9TS0FNVVhfUEFEIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QQURfRlJBTUVfRFVSQVRJT046CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcGFkLT5mcmFtZV9kdXJhdGlvbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FtdXhfcGFkX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RNYXRyb3NrYW11eFBhZCAqcGFkID0gR1NUX01BVFJPU0tBTVVYX1BBRCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUEFEX0ZSQU1FX0RVUkFUSU9OOgorICAgICAgcGFkLT5mcmFtZV9kdXJhdGlvbiA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIHBhZC0+ZnJhbWVfZHVyYXRpb25fdXNlciA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FtdXhfcGFkX2NsYXNzX2luaXQgKEdzdE1hdHJvc2thbXV4UGFkQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfbWF0cm9za2FtdXhfcGFkX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X21hdHJvc2thbXV4X3BhZF9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QQURfRlJBTUVfRFVSQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImZyYW1lLWR1cmF0aW9uIiwgIkZyYW1lIGR1cmF0aW9uIiwKKyAgICAgICAgICAiRGVmYXVsdCBmcmFtZSBkdXJhdGlvbiIsIERFRkFVTFRfUEFEX0ZSQU1FX0RVUkFUSU9OLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYW11eF9wYWRfaW5pdCAoR3N0TWF0cm9za2FtdXhQYWQgKiBwYWQpCit7CisgIHBhZC0+ZnJhbWVfZHVyYXRpb24gPSBERUZBVUxUX1BBRF9GUkFNRV9EVVJBVElPTjsKKyAgcGFkLT5mcmFtZV9kdXJhdGlvbl91c2VyID0gRkFMU0U7Cit9CisKKy8qCisgKiBFbmQgb2YgcGFkIG9wdGlvbiBoYW5kbGVyIGNvZGUKKyAqKi8KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9tdXhfaW5pdCAoR3N0TWF0cm9za2FNdXggKiBtdXgsIGdwb2ludGVyIGdfY2xhc3MpCit7CisgIEdzdFBhZFRlbXBsYXRlICp0ZW1wbDsKKworICB0ZW1wbCA9CisgICAgICBnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChHU1RfRUxFTUVOVF9DTEFTUyAoZ19jbGFzcyksICJzcmMiKTsKKyAgbXV4LT5zcmNwYWQgPSBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlICh0ZW1wbCwgInNyYyIpOworCisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChtdXgtPnNyY3BhZCwgZ3N0X21hdHJvc2thX211eF9oYW5kbGVfc3JjX2V2ZW50KTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKG11eCksIG11eC0+c3JjcGFkKTsKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAobXV4LT5zcmNwYWQpOworCisgIG11eC0+Y29sbGVjdCA9IGdzdF9jb2xsZWN0X3BhZHNfbmV3ICgpOworICBnc3RfY29sbGVjdF9wYWRzX3NldF9jbGlwX2Z1bmN0aW9uIChtdXgtPmNvbGxlY3QsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2NvbGxlY3RfcGFkc19jbGlwX3J1bm5pbmdfdGltZSksIG11eCk7CisgIGdzdF9jb2xsZWN0X3BhZHNfc2V0X2J1ZmZlcl9mdW5jdGlvbiAobXV4LT5jb2xsZWN0LAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9tdXhfaGFuZGxlX2J1ZmZlciksIG11eCk7CisgIGdzdF9jb2xsZWN0X3BhZHNfc2V0X2V2ZW50X2Z1bmN0aW9uIChtdXgtPmNvbGxlY3QsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX211eF9oYW5kbGVfc2lua19ldmVudCksIG11eCk7CisKKyAgbXV4LT5lYm1sX3dyaXRlID0gZ3N0X2VibWxfd3JpdGVfbmV3IChtdXgtPnNyY3BhZCk7CisgIG11eC0+ZG9jdHlwZSA9IEdTVF9NQVRST1NLQV9ET0NUWVBFX01BVFJPU0tBOworCisgIC8qIHByb3BlcnR5IGRlZmF1bHRzICovCisgIG11eC0+ZG9jdHlwZV92ZXJzaW9uID0gREVGQVVMVF9ET0NUWVBFX1ZFUlNJT047CisgIG11eC0+d3JpdGluZ19hcHAgPSBnX3N0cmR1cCAoREVGQVVMVF9XUklUSU5HX0FQUCk7CisgIG11eC0+bWluX2luZGV4X2ludGVydmFsID0gREVGQVVMVF9NSU5fSU5ERVhfSU5URVJWQUw7CisgIG11eC0+ZWJtbF93cml0ZS0+c3RyZWFtYWJsZSA9IERFRkFVTFRfU1RSRUFNQUJMRTsKKyAgbXV4LT50aW1lX3NjYWxlID0gREVGQVVMVF9USU1FQ09ERVNDQUxFOworICBtdXgtPm1pbl9jbHVzdGVyX2R1cmF0aW9uID0gREVGQVVMVF9NSU5fQ0xVU1RFUl9EVVJBVElPTjsKKyAgbXV4LT5tYXhfY2x1c3Rlcl9kdXJhdGlvbiA9IERFRkFVTFRfTUFYX0NMVVNURVJfRFVSQVRJT047CisKKyAgLyogaW5pdGlhbGl6ZSBpbnRlcm5hbCB2YXJpYWJsZXMgKi8KKyAgbXV4LT5pbmRleCA9IE5VTEw7CisgIG11eC0+bnVtX3N0cmVhbXMgPSAwOworICBtdXgtPm51bV9hX3N0cmVhbXMgPSAwOworICBtdXgtPm51bV90X3N0cmVhbXMgPSAwOworICBtdXgtPm51bV92X3N0cmVhbXMgPSAwOworICBtdXgtPmludGVybmFsX3RvYyA9IE5VTEw7CisKKyAgLyogY3JlYXRlIHVzZWQgdWlkIGxpc3QgKi8KKyAgbXV4LT51c2VkX3VpZHMgPSBnX2FycmF5X3NpemVkX25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKGd1aW50NjQpLCAxMCk7CisKKyAgLyogaW5pdGlhbGl6ZSByZW1haW5pbmcgdmFyaWFibGVzICovCisgIGdzdF9tYXRyb3NrYV9tdXhfcmVzZXQgKEdTVF9FTEVNRU5UIChtdXgpKTsKK30KKworCisvKioKKyAqIGdzdF9tYXRyb3NrYV9tdXhfZmluYWxpemU6CisgKiBAb2JqZWN0OiAjR3N0TWF0cm9za2FNdXggdGhhdCBzaG91bGQgYmUgZmluYWxpemVkLgorICoKKyAqIEZpbmFsaXplIG1hdHJvc2thIG11eGVyLgorICovCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX211eF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0TWF0cm9za2FNdXggKm11eCA9IEdTVF9NQVRST1NLQV9NVVggKG9iamVjdCk7CisKKyAgZ3N0X2V2ZW50X3JlcGxhY2UgKCZtdXgtPmZvcmNlX2tleV91bml0X2V2ZW50LCBOVUxMKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChtdXgtPmNvbGxlY3QpOworICBnc3Rfb2JqZWN0X3VucmVmIChtdXgtPmVibWxfd3JpdGUpOworICBnX2ZyZWUgKG11eC0+d3JpdGluZ19hcHApOworCisgIGdfYXJyYXlfZnJlZSAobXV4LT51c2VkX3VpZHMsIFRSVUUpOworCisgIGlmIChtdXgtPmludGVybmFsX3RvYykgeworICAgIGdzdF90b2NfdW5yZWYgKG11eC0+aW50ZXJuYWxfdG9jKTsKKyAgICBtdXgtPmludGVybmFsX3RvYyA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X2NyZWF0ZV91aWQ6CisgKiBAbXV4OiAjR3N0TWF0cm9za2FNdXggdG8gZ2VuZXJhdGUgVUlEIGZvci4KKyAqCisgKiBHZW5lcmF0ZSBuZXcgdW51c2VkIHRyYWNrIFVJRC4KKyAqCisgKiBSZXR1cm5zOiBOZXcgdHJhY2sgVUlELgorICovCitzdGF0aWMgZ3VpbnQ2NAorZ3N0X21hdHJvc2thX211eF9jcmVhdGVfdWlkIChHc3RNYXRyb3NrYU11eCAqIG11eCkKK3sKKyAgZ3VpbnQ2NCB1aWQgPSAwOworCisgIHdoaWxlICghdWlkKSB7CisgICAgZ3VpbnQgaTsKKworICAgIHVpZCA9ICgoKGd1aW50NjQpIGdfcmFuZG9tX2ludCAoKSkgPDwgMzIpIHwgZ19yYW5kb21faW50ICgpOworICAgIGZvciAoaSA9IDA7IGkgPCBtdXgtPnVzZWRfdWlkcy0+bGVuOyBpKyspIHsKKyAgICAgIGlmIChnX2FycmF5X2luZGV4IChtdXgtPnVzZWRfdWlkcywgZ3VpbnQ2NCwgaSkgPT0gdWlkKSB7CisgICAgICAgIHVpZCA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBnX2FycmF5X2FwcGVuZF92YWwgKG11eC0+dXNlZF91aWRzLCB1aWQpOworICB9CisKKyAgcmV0dXJuIHVpZDsKK30KKworCisvKioKKyAqIGdzdF9tYXRyb3NrYV9wYWRfcmVzZXQ6CisgKiBAY29sbGVjdF9wYWQ6IHRoZSAjR3N0TWF0cm9za2FQYWQKKyAqCisgKiBSZXNldCBhbmQvb3IgcmVsZWFzZSByZXNvdXJjZXMgb2YgYSBtYXRyb3NrYSBjb2xsZWN0IHBhZC4KKyAqLworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9wYWRfcmVzZXQgKEdzdE1hdHJvc2thUGFkICogY29sbGVjdF9wYWQsIGdib29sZWFuIGZ1bGwpCit7CisgIGdjaGFyICpuYW1lID0gTlVMTDsKKyAgR3N0TWF0cm9za2FUcmFja1R5cGUgdHlwZSA9IDA7CisKKyAgLyogZnJlZSB0cmFjayBpbmZvcm1hdGlvbiAqLworICBpZiAoY29sbGVjdF9wYWQtPnRyYWNrICE9IE5VTEwpIHsKKyAgICAvKiByZXRyaWV2ZSBmb3Igb3B0aW9uYWwgbGF0ZXIgdXNlICovCisgICAgbmFtZSA9IGNvbGxlY3RfcGFkLT50cmFjay0+bmFtZTsKKyAgICB0eXBlID0gY29sbGVjdF9wYWQtPnRyYWNrLT50eXBlOworICAgIC8qIGV4dHJhIGZvciB2aWRlbyAqLworICAgIGlmICh0eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1ZJREVPKSB7CisgICAgICBHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICpjdHggPQorICAgICAgICAgIChHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICopIGNvbGxlY3RfcGFkLT50cmFjazsKKworICAgICAgaWYgKGN0eC0+ZGlyYWNfdW5pdCkgeworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChjdHgtPmRpcmFjX3VuaXQpOworICAgICAgICBjdHgtPmRpcmFjX3VuaXQgPSBOVUxMOworICAgICAgfQorICAgIH0KKyAgICBnX2ZyZWUgKGNvbGxlY3RfcGFkLT50cmFjay0+Y29kZWNfaWQpOworICAgIGdfZnJlZSAoY29sbGVjdF9wYWQtPnRyYWNrLT5jb2RlY19uYW1lKTsKKyAgICBpZiAoZnVsbCkKKyAgICAgIGdfZnJlZSAoY29sbGVjdF9wYWQtPnRyYWNrLT5uYW1lKTsKKyAgICBnX2ZyZWUgKGNvbGxlY3RfcGFkLT50cmFjay0+bGFuZ3VhZ2UpOworICAgIGdfZnJlZSAoY29sbGVjdF9wYWQtPnRyYWNrLT5jb2RlY19wcml2KTsKKyAgICBnX2ZyZWUgKGNvbGxlY3RfcGFkLT50cmFjayk7CisgICAgY29sbGVjdF9wYWQtPnRyYWNrID0gTlVMTDsKKyAgICBpZiAoY29sbGVjdF9wYWQtPnRhZ3MpIHsKKyAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAoY29sbGVjdF9wYWQtPnRhZ3MpOworICAgICAgY29sbGVjdF9wYWQtPnRhZ3MgPSBOVUxMOworICAgIH0KKyAgfQorCisgIGlmICghZnVsbCAmJiB0eXBlICE9IDApIHsKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqY29udGV4dDsKKworICAgIC8qIGNyZWF0ZSBhIGZyZXNoIGNvbnRleHQgKi8KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU86CisgICAgICAgIGNvbnRleHQgPSAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKikKKyAgICAgICAgICAgIGdfbmV3MCAoR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCwgMSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9BVURJTzoKKyAgICAgICAgY29udGV4dCA9IChHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqKQorICAgICAgICAgICAgZ19uZXcwIChHc3RNYXRyb3NrYVRyYWNrQXVkaW9Db250ZXh0LCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFOgorICAgICAgICBjb250ZXh0ID0gKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICopCisgICAgICAgICAgICBnX25ldzAgKEdzdE1hdHJvc2thVHJhY2tTdWJ0aXRsZUNvbnRleHQsIDEpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29udGV4dC0+dHlwZSA9IHR5cGU7CisgICAgY29udGV4dC0+bmFtZSA9IG5hbWU7CisgICAgY29udGV4dC0+dWlkID0gZ3N0X21hdHJvc2thX211eF9jcmVhdGVfdWlkIChjb2xsZWN0X3BhZC0+bXV4KTsKKyAgICAvKiBUT0RPOiBjaGVjayBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGNvbnRleHQgKi8KKyAgICBjb250ZXh0LT5mbGFncyA9IEdTVF9NQVRST1NLQV9UUkFDS19FTkFCTEVEIHwgR1NUX01BVFJPU0tBX1RSQUNLX0RFRkFVTFQ7CisgICAgY29sbGVjdF9wYWQtPnRyYWNrID0gY29udGV4dDsKKyAgICBjb2xsZWN0X3BhZC0+c3RhcnRfdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgIGNvbGxlY3RfcGFkLT5lbmRfdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgIGNvbGxlY3RfcGFkLT50YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgICBnc3RfdGFnX2xpc3Rfc2V0X3Njb3BlIChjb2xsZWN0X3BhZC0+dGFncywgR1NUX1RBR19TQ09QRV9TVFJFQU0pOworICB9Cit9CisKKy8qKgorICogZ3N0X21hdHJvc2thX3BhZF9mcmVlOgorICogQGNvbGxlY3RfcGFkOiB0aGUgI0dzdE1hdHJvc2thUGFkCisgKgorICogUmVsZWFzZSByZXNvdXJjZXMgb2YgYSBtYXRyb3NrYSBjb2xsZWN0IHBhZC4KKyAqLworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9wYWRfZnJlZSAoR3N0UGFkICogY29sbGVjdF9wYWQpCit7CisgIGdzdF9tYXRyb3NrYV9wYWRfcmVzZXQgKChHc3RNYXRyb3NrYVBhZCAqKSBjb2xsZWN0X3BhZCwgVFJVRSk7Cit9CisKKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X3Jlc2V0OgorICogQGVsZW1lbnQ6ICNHc3RNYXRyb3NrYU11eCB0aGF0IHNob3VsZCBiZSByZXNldGVkLgorICoKKyAqIFJlc2V0IG1hdHJvc2thIG11eGVyIGJhY2sgdG8gaW5pdGlhbCBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9tdXhfcmVzZXQgKEdzdEVsZW1lbnQgKiBlbGVtZW50KQoreworICBHc3RNYXRyb3NrYU11eCAqbXV4ID0gR1NUX01BVFJPU0tBX01VWCAoZWxlbWVudCk7CisgIEdTTGlzdCAqd2FsazsKKworICAvKiByZXNldCBFQk1MIHdyaXRlICovCisgIGdzdF9lYm1sX3dyaXRlX3Jlc2V0IChtdXgtPmVibWxfd3JpdGUpOworCisgIC8qIHJlc2V0IGlucHV0ICovCisgIG11eC0+c3RhdGUgPSBHU1RfTUFUUk9TS0FfTVVYX1NUQVRFX1NUQVJUOworCisgIC8qIGNsZWFuIHVwIGV4aXN0aW5nIHN0cmVhbXMgKi8KKworICBmb3IgKHdhbGsgPSBtdXgtPmNvbGxlY3QtPmRhdGE7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0TWF0cm9za2FQYWQgKmNvbGxlY3RfcGFkOworCisgICAgY29sbGVjdF9wYWQgPSAoR3N0TWF0cm9za2FQYWQgKikgd2Fsay0+ZGF0YTsKKworICAgIC8qIHJlc2V0IGNvbGxlY3QgcGFkIHRvIHByaXN0aW5lIHN0YXRlICovCisgICAgZ3N0X21hdHJvc2thX3BhZF9yZXNldCAoY29sbGVjdF9wYWQsIEZBTFNFKTsKKyAgfQorCisgIC8qIHJlc2V0IGluZGV4ZXMgKi8KKyAgbXV4LT5udW1faW5kZXhlcyA9IDA7CisgIGdfZnJlZSAobXV4LT5pbmRleCk7CisgIG11eC0+aW5kZXggPSBOVUxMOworCisgIC8qIHJlc2V0IHRpbWVycyAqLworICBtdXgtPmR1cmF0aW9uID0gMDsKKworICAvKiByZXNldCBjbHVzdGVyICovCisgIG11eC0+Y2x1c3RlciA9IDA7CisgIG11eC0+Y2x1c3Rlcl90aW1lID0gMDsKKyAgbXV4LT5jbHVzdGVyX3BvcyA9IDA7CisgIG11eC0+cHJldl9jbHVzdGVyX3NpemUgPSAwOworCisgIC8qIHJlc2V0IHRhZ3MgKi8KKyAgZ3N0X3RhZ19zZXR0ZXJfcmVzZXRfdGFncyAoR1NUX1RBR19TRVRURVIgKG11eCkpOworCisgIG11eC0+dGFnc19wb3MgPSAwOworCisgIC8qIHJlc2V0IGNoYXB0ZXJzICovCisgIGdzdF90b2Nfc2V0dGVyX3Jlc2V0IChHU1RfVE9DX1NFVFRFUiAobXV4KSk7CisgIGlmIChtdXgtPmludGVybmFsX3RvYykgeworICAgIGdzdF90b2NfdW5yZWYgKG11eC0+aW50ZXJuYWxfdG9jKTsKKyAgICBtdXgtPmludGVybmFsX3RvYyA9IE5VTEw7CisgIH0KKworICBtdXgtPmNoYXB0ZXJzX3BvcyA9IDA7CisKKyAgLyogY2xlYXIgdXNlZCB1aWRzICovCisgIGlmIChtdXgtPnVzZWRfdWlkcy0+bGVuID4gMCkgeworICAgIGdfYXJyYXlfcmVtb3ZlX3JhbmdlIChtdXgtPnVzZWRfdWlkcywgMCwgbXV4LT51c2VkX3VpZHMtPmxlbik7CisgIH0KK30KKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X2hhbmRsZV9zcmNfZXZlbnQ6CisgKiBAcGFkOiBQYWQgd2hpY2ggcmVjZWl2ZWQgdGhlIGV2ZW50LgorICogQGV2ZW50OiBSZWNlaXZlZCBldmVudC4KKyAqCisgKiBoYW5kbGUgZXZlbnRzIC0gY29waWVkIGZyb20gb2dnbXV4IHdpdGhvdXQgdW5kZXJzdGFuZGluZworICoKKyAqIFJldHVybnM6ICVUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX211eF9oYW5kbGVfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RFdmVudFR5cGUgdHlwZTsKKworICB0eXBlID0gZXZlbnQgPyBHU1RfRVZFTlRfVFlQRSAoZXZlbnQpIDogR1NUX0VWRU5UX1VOS05PV047CisKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICAgIC8qIGRpc2FibGUgc2Vla2luZyBmb3Igbm93ICovCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICogY29udGV4dCkKK3sKKyAgaWYgKGNvbnRleHQtPmNvZGVjX3ByaXYgIT0gTlVMTCkgeworICAgIGdfZnJlZSAoY29udGV4dC0+Y29kZWNfcHJpdik7CisgICAgY29udGV4dC0+Y29kZWNfcHJpdiA9IE5VTEw7CisgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplID0gMDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX211eF9idWlsZF92b2JzdWJfcHJpdmF0ZSAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0LAorICAgIGNvbnN0IGd1aW50ICogY2x1dCkKK3sKKyAgZ2NoYXIgKmNsdXR2WzE3XTsKKyAgZ2NoYXIgKnNjbHV0OworICBnaW50IGk7CisgIGd1aW50MzIgY29sOworICBnZG91YmxlIHksIHUsIHY7CisgIGd1aW50OCByLCBnLCBiOworCisgIC8qIHByb2R1Y2UgY29tbWEtc2VwYXJhdGVkIGxpc3QgaW4gaGV4IGZvcm1hdCAqLworICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgIGNvbCA9IGNsdXRbaV07CisgICAgLyogcmVwbGljYXRlIHZvYnN1YidzIHNsaWdodGx5IG9mZiBSR0IgY29udmVyc2lvbiBjYWxjdWxhdGlvbiAqLworICAgIHkgPSAoKChjb2wgPj4gMTYpICYgMHhmZikgLSAxNikgKiAyNTUgLyAyMTk7CisgICAgdSA9ICgoY29sID4+IDgpICYgMHhmZikgLSAxMjg7CisgICAgdiA9IChjb2wgJiAweGZmKSAtIDEyODsKKyAgICByID0gQ0xBTVAgKDEuMCAqIHkgKyAxLjQwMjIgKiB1LCAwLCAyNTUpOworICAgIGcgPSBDTEFNUCAoMS4wICogeSAtIDAuMzQ1NiAqIHUgLSAwLjcxNDUgKiB2LCAwLCAyNTUpOworICAgIGIgPSBDTEFNUCAoMS4wICogeSArIDEuNzcxMCAqIHYsIDAsIDI1NSk7CisgICAgY2x1dHZbaV0gPSBnX3N0cmR1cF9wcmludGYgKCIlMDJ4JTAyeCUwMngiLCByLCBnLCBiKTsKKyAgfQorICBjbHV0dltpXSA9IE5VTEw7CisgIHNjbHV0ID0gZ19zdHJqb2ludiAoIiwiLCBjbHV0dik7CisKKyAgLyogYnVpbGQgY29kZWMgcHJpdmF0ZTsgb25seSBwYWxldHRlIGZvciBub3cgKi8KKyAgZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKGNvbnRleHQpOworICBjb250ZXh0LT5jb2RlY19wcml2ID0gKGd1aW50OCAqKSBnX3N0cmR1cF9wcmludGYgKCJwYWxldHRlOiAlcyIsIHNjbHV0KTsKKyAgLyogaW5jbHVkZSB0ZXJtaW5hdGluZyAwICovCisgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA9IHN0cmxlbiAoKGdjaGFyICopIGNvbnRleHQtPmNvZGVjX3ByaXYpICsgMTsKKyAgZ19mcmVlIChzY2x1dCk7CisgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgZ19mcmVlIChjbHV0dltpXSk7CisgIH0KK30KKworCisvKioKKyAqIGdzdF9tYXRyb3NrYV9tdXhfaGFuZGxlX3NpbmtfZXZlbnQ6CisgKiBAcGFkOiBQYWQgd2hpY2ggcmVjZWl2ZWQgdGhlIGV2ZW50LgorICogQGV2ZW50OiBSZWNlaXZlZCBldmVudC4KKyAqCisgKiBoYW5kbGUgZXZlbnRzIC0gaW5mb3JtYXRpb25hbCBvbmVzIGxpa2UgdGFncworICoKKyAqIFJldHVybnM6ICVUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX211eF9oYW5kbGVfc2lua19ldmVudCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLAorICAgIEdzdENvbGxlY3REYXRhICogZGF0YSwgR3N0RXZlbnQgKiBldmVudCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RNYXRyb3NrYVBhZCAqY29sbGVjdF9wYWQ7CisgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0OworICBHc3RNYXRyb3NrYU11eCAqbXV4OworICBHc3RQYWQgKnBhZDsKKyAgR3N0VGFnTGlzdCAqbGlzdDsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICBtdXggPSBHU1RfTUFUUk9TS0FfTVVYICh1c2VyX2RhdGEpOworICBjb2xsZWN0X3BhZCA9IChHc3RNYXRyb3NrYVBhZCAqKSBkYXRhOworICBwYWQgPSBkYXRhLT5wYWQ7CisgIGNvbnRleHQgPSBjb2xsZWN0X3BhZC0+dHJhY2s7CisgIGdfYXNzZXJ0IChjb250ZXh0KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOnsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIGNvbGxlY3RfcGFkID0gKEdzdE1hdHJvc2thUGFkICopIGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChldmVudCwgJmNhcHMpOworCisgICAgICByZXQgPSBjb2xsZWN0X3BhZC0+Y2Fwc2Z1bmMgKHBhZCwgY2Fwcyk7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGV2ZW50ID0gTlVMTDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9UQUc6eworICAgICAgZ2NoYXIgKmxhbmcgPSBOVUxMOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJyZWNlaXZlZCB0YWcgZXZlbnQiKTsKKyAgICAgIGdzdF9ldmVudF9wYXJzZV90YWcgKGV2ZW50LCAmbGlzdCk7CisKKyAgICAgIC8qIE1hdHJvc2thIHdhbnRzIElTTyA2MzktMkIgY29kZSwgdGFnbGlzdCBtb3N0IGxpa2VseSBjb250YWlucyA2MzktMSAqLworICAgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nIChsaXN0LCBHU1RfVEFHX0xBTkdVQUdFX0NPREUsICZsYW5nKSkgeworICAgICAgICBjb25zdCBnY2hhciAqbGFuZ19jb2RlOworCisgICAgICAgIGxhbmdfY29kZSA9IGdzdF90YWdfZ2V0X2xhbmd1YWdlX2NvZGVfaXNvXzYzOV8yQiAobGFuZyk7CisgICAgICAgIGlmIChsYW5nX2NvZGUpIHsKKyAgICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHBhZCwgIlNldHRpbmcgbGFuZ3VhZ2UgdG8gJyVzJyIsIGxhbmdfY29kZSk7CisgICAgICAgICAgZ19mcmVlIChjb250ZXh0LT5sYW5ndWFnZSk7CisgICAgICAgICAgY29udGV4dC0+bGFuZ3VhZ2UgPSBnX3N0cmR1cCAobGFuZ19jb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhZCwgIkRpZCBub3QgZ2V0IGxhbmd1YWdlIGNvZGUgZm9yICclcyciLCBsYW5nKTsKKyAgICAgICAgfQorICAgICAgICBnX2ZyZWUgKGxhbmcpOworICAgICAgfQorCisgICAgICAvKiBGSVhNRTogd2hhdCBhYm91dCBzdHJlYW0tc3BlY2lmaWMgdGFncz8gKi8KKyAgICAgIGlmIChnc3RfdGFnX2xpc3RfZ2V0X3Njb3BlIChsaXN0KSA9PSBHU1RfVEFHX1NDT1BFX0dMT0JBTCkgeworICAgICAgICBnc3RfdGFnX3NldHRlcl9tZXJnZV90YWdzIChHU1RfVEFHX1NFVFRFUiAobXV4KSwgbGlzdCwKKyAgICAgICAgICAgIGdzdF90YWdfc2V0dGVyX2dldF90YWdfbWVyZ2VfbW9kZSAoR1NUX1RBR19TRVRURVIgKG11eCkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKGNvbGxlY3RfcGFkLT50YWdzLCBsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UpOworICAgICAgfQorCisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIC8qIGhhbmRsZWQgdGhpcywgZG9uJ3Qgd2FudCBjb2xsZWN0cGFkcyB0byBmb3J3YXJkIGl0IGRvd25zdHJlYW0gKi8KKyAgICAgIGV2ZW50ID0gTlVMTDsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfVE9DOnsKKyAgICAgIEdzdFRvYyAqdG9jLCAqb2xkX3RvYzsKKworICAgICAgaWYgKG11eC0+Y2hhcHRlcnNfcG9zID4gMCkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgInJlY2VpdmVkIHRvYyBldmVudCIpOworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3RvYyAoZXZlbnQsICZ0b2MsIE5VTEwpOworCisgICAgICBpZiAodG9jICE9IE5VTEwpIHsKKyAgICAgICAgb2xkX3RvYyA9IGdzdF90b2Nfc2V0dGVyX2dldF90b2MgKEdTVF9UT0NfU0VUVEVSIChtdXgpKTsKKyAgICAgICAgaWYgKG9sZF90b2MgIT0gTlVMTCkgeworICAgICAgICAgIGlmIChvbGRfdG9jICE9IHRvYykKKyAgICAgICAgICAgIEdTVF9JTkZPX09CSkVDVCAocGFkLCAiUmVwbGFjaW5nIFRPQyB3aXRoIGEgbmV3IG9uZSIpOworICAgICAgICAgIGdzdF90b2NfdW5yZWYgKG9sZF90b2MpOworICAgICAgICB9CisKKyAgICAgICAgZ3N0X3RvY19zZXR0ZXJfc2V0X3RvYyAoR1NUX1RPQ19TRVRURVIgKG11eCksIHRvYyk7CisgICAgICAgIGdzdF90b2NfdW5yZWYgKHRvYyk7CisgICAgICB9CisKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgLyogaGFuZGxlZCB0aGlzLCBkb24ndCB3YW50IGNvbGxlY3RwYWRzIHRvIGZvcndhcmQgaXQgZG93bnN0cmVhbSAqLworICAgICAgZXZlbnQgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNOgorICAgIGNhc2UgR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNX1NUSUNLWTp7CisgICAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKworICAgICAgc3RydWN0dXJlID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzdHJ1Y3R1cmUsICJHc3RGb3JjZUtleVVuaXQiKSkgeworICAgICAgICBnc3RfZXZlbnRfcmVwbGFjZSAoJm11eC0+Zm9yY2Vfa2V5X3VuaXRfZXZlbnQsIE5VTEwpOworICAgICAgICBtdXgtPmZvcmNlX2tleV91bml0X2V2ZW50ID0gZXZlbnQ7CisgICAgICAgIGV2ZW50ID0gTlVMTDsKKyAgICAgIH0gZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAoc3RydWN0dXJlLCAiYXBwbGljYXRpb24veC1nc3QtZHZkIikgJiYKKyAgICAgICAgICAhc3RyY21wICgiZHZkLXNwdS1jbHV0LWNoYW5nZSIsCisgICAgICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZXZlbnQiKSkpIHsKKyAgICAgICAgZ2NoYXIgbmFtZVsxNl07CisgICAgICAgIGdpbnQgaSwgdmFsdWU7CisgICAgICAgIGd1aW50IGNsdXRbMTZdOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIk5ldyBEVkQgY29sb3VyIHRhYmxlIHJlY2VpdmVkIik7CisgICAgICAgIGlmIChjb250ZXh0LT50eXBlICE9IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiLi4uIGRpc2NhcmRpbmciKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBmaXJzdCB0cmFuc2Zvcm0gZXZlbnQgZGF0YSBpbnRvIHRhYmxlIGZvcm0gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgICBnX3NucHJpbnRmIChuYW1lLCBzaXplb2YgKG5hbWUpLCAiY2x1dCUwMmQiLCBpKTsKKyAgICAgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCBuYW1lLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChtdXgsICJkdmQtc3B1LWNsdXQtY2hhbmdlIGV2ZW50IGRpZCBub3QgIgorICAgICAgICAgICAgICAgICJjb250YWluICVzIGZpZWxkIiwgbmFtZSk7CisgICAgICAgICAgICBnb3RvIGJyZWFrX2hhcmQ7CisgICAgICAgICAgfQorICAgICAgICAgIGNsdXRbaV0gPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHRyYW5zZm9ybSBpbnRvIHByaXZhdGUgZGF0YSBmb3Igc3RyZWFtOyB0ZXh0IGZvcm0gKi8KKyAgICAgICAgZ3N0X21hdHJvc2thX211eF9idWlsZF92b2JzdWJfcHJpdmF0ZSAoY29udGV4dCwgY2x1dCk7CisgICAgICB9CisgICAgfQorICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKK2JyZWFrX2hhcmQ6CisgIGlmIChldmVudCAhPSBOVUxMKQorICAgIHJldHVybiBnc3RfY29sbGVjdF9wYWRzX2V2ZW50X2RlZmF1bHQgKHBhZHMsIGRhdGEsIGV2ZW50LCBGQUxTRSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIGNvbnRleHQsCisgICAgY29uc3QgY2hhciAqaWQpCit7CisgIGdfYXNzZXJ0IChjb250ZXh0ICYmIGlkKTsKKyAgZ19mcmVlIChjb250ZXh0LT5jb2RlY19pZCk7CisgIGNvbnRleHQtPmNvZGVjX2lkID0gZ19zdHJkdXAgKGlkKTsKK30KKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzOgorICogQHBhZDogUGFkIHdoaWNoIGdvdCB0aGUgY2Fwcy4KKyAqIEBjYXBzOiBOZXcgY2Fwcy4KKyAqCisgKiBTZXRjYXBzIGZ1bmN0aW9uIGZvciB2aWRlbyBzaW5rIHBhZC4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9tdXhfdmlkZW9fcGFkX3NldGNhcHMgKEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0ID0gTlVMTDsKKyAgR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqdmlkZW9jb250ZXh0OworICBHc3RNYXRyb3NrYU11eCAqbXV4OworICBHc3RNYXRyb3NrYVBhZCAqY29sbGVjdF9wYWQ7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBnY2hhciAqbWltZXR5cGU7CisgIGNvbnN0IGdjaGFyICppbnRlcmxhY2VfbW9kZSwgKnM7CisgIGNvbnN0IEdWYWx1ZSAqdmFsdWUgPSBOVUxMOworICBHc3RCdWZmZXIgKmNvZGVjX2J1ZiA9IE5VTEw7CisgIGdpbnQgd2lkdGgsIGhlaWdodCwgcGl4ZWxfd2lkdGgsIHBpeGVsX2hlaWdodDsKKyAgZ2ludCBmcHNfZCwgZnBzX247CisgIGd1aW50IG11bHRpdmlld19mbGFnczsKKworICBtdXggPSBHU1RfTUFUUk9TS0FfTVVYIChHU1RfUEFEX1BBUkVOVCAocGFkKSk7CisKKyAgLyogZmluZCBjb250ZXh0ICovCisgIGNvbGxlY3RfcGFkID0gKEdzdE1hdHJvc2thUGFkICopIGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgZ19hc3NlcnQgKGNvbGxlY3RfcGFkKTsKKyAgY29udGV4dCA9IGNvbGxlY3RfcGFkLT50cmFjazsKKyAgZ19hc3NlcnQgKGNvbnRleHQpOworICBnX2Fzc2VydCAoY29udGV4dC0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9WSURFTyk7CisgIHZpZGVvY29udGV4dCA9IChHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICopIGNvbnRleHQ7CisKKyAgLyogZ3N0IC0+IG1hdHJvc2thIElEJ2luZyAqLworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBtaW1ldHlwZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSk7CisKKyAgaW50ZXJsYWNlX21vZGUgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImludGVybGFjZS1tb2RlIik7CisgIGlmIChpbnRlcmxhY2VfbW9kZSAhPSBOVUxMICYmIHN0cmNtcCAoaW50ZXJsYWNlX21vZGUsICJwcm9ncmVzc2l2ZSIpICE9IDApCisgICAgY29udGV4dC0+ZmxhZ3MgfD0gR1NUX01BVFJPU0tBX1ZJREVPVFJBQ0tfSU5URVJMQUNFRDsKKworICBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LXRoZW9yYSIpKSB7CisgICAgLyogd2UnbGwgZXh0cmFjdCB0aGUgZGV0YWlscyBsYXRlciBmcm9tIHRoZSB0aGVvcmEgaWRlbnRpZmljYXRpb24gaGVhZGVyICovCisgICAgZ290byBza2lwX2RldGFpbHM7CisgIH0KKworICAvKiBnZXQgZ2VuZXJhbCBwcm9wZXJ0aWVzICovCisgIC8qIHNwZWMgc2F5cyBpdCBpcyBtYW5kYXRvcnkgKi8KKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIndpZHRoIiwgJndpZHRoKSB8fAorICAgICAgIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiaGVpZ2h0IiwgJmhlaWdodCkpCisgICAgZ290byByZWZ1c2VfY2FwczsKKworICB2aWRlb2NvbnRleHQtPnBpeGVsX3dpZHRoID0gd2lkdGg7CisgIHZpZGVvY29udGV4dC0+cGl4ZWxfaGVpZ2h0ID0gaGVpZ2h0OworCisgIGlmIChHU1RfTUFUUk9TS0FNVVhfUEFEX0NBU1QgKHBhZCktPmZyYW1lX2R1cmF0aW9uCisgICAgICAmJiBnc3Rfc3RydWN0dXJlX2dldF9mcmFjdGlvbiAoc3RydWN0dXJlLCAiZnJhbWVyYXRlIiwgJmZwc19uLCAmZnBzX2QpCisgICAgICAmJiBmcHNfbiA+IDApIHsKKyAgICBjb250ZXh0LT5kZWZhdWx0X2R1cmF0aW9uID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoR1NUX1NFQ09ORCwgZnBzX2QsIGZwc19uKTsKKyAgICBHU1RfTE9HX09CSkVDVCAocGFkLCAiZGVmYXVsdCBkdXJhdGlvbiA9ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbikpOworICB9IGVsc2UgeworICAgIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24gPSAwOworICB9CisgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9mcmFjdGlvbiAoc3RydWN0dXJlLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwKKyAgICAgICAgICAmcGl4ZWxfd2lkdGgsICZwaXhlbF9oZWlnaHQpKSB7CisgICAgaWYgKHBpeGVsX3dpZHRoID4gcGl4ZWxfaGVpZ2h0KSB7CisgICAgICB2aWRlb2NvbnRleHQtPmRpc3BsYXlfd2lkdGggPSB3aWR0aCAqIHBpeGVsX3dpZHRoIC8gcGl4ZWxfaGVpZ2h0OworICAgICAgdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCA9IGhlaWdodDsKKyAgICB9IGVsc2UgaWYgKHBpeGVsX3dpZHRoIDwgcGl4ZWxfaGVpZ2h0KSB7CisgICAgICB2aWRlb2NvbnRleHQtPmRpc3BsYXlfd2lkdGggPSB3aWR0aDsKKyAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV9oZWlnaHQgPSBoZWlnaHQgKiBwaXhlbF9oZWlnaHQgLyBwaXhlbF93aWR0aDsKKyAgICB9IGVsc2UgeworICAgICAgdmlkZW9jb250ZXh0LT5kaXNwbGF5X3dpZHRoID0gMDsKKyAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV9oZWlnaHQgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB2aWRlb2NvbnRleHQtPmRpc3BsYXlfd2lkdGggPSAwOworICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV9oZWlnaHQgPSAwOworICB9CisKKyAgLyogQ29sbGVjdCBzdGVyZW9zY29waWMgaW5mbywgaWYgYW55ICovCisgIGlmICgocyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAibXVsdGl2aWV3LW1vZGUiKSkpCisgICAgdmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfbW9kZSA9CisgICAgICAgIGdzdF92aWRlb19tdWx0aXZpZXdfbW9kZV9mcm9tX2NhcHNfc3RyaW5nIChzKTsKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfZmxhZ3NldCAoc3RydWN0dXJlLCAibXVsdGl2aWV3LWZsYWdzIiwgJm11bHRpdmlld19mbGFncywKKyAgICAgIE5VTEwpOworICB2aWRlb2NvbnRleHQtPm11bHRpdmlld19mbGFncyA9IG11bHRpdmlld19mbGFnczsKKworCitza2lwX2RldGFpbHM6CisKKyAgdmlkZW9jb250ZXh0LT5hc3JfbW9kZSA9IEdTVF9NQVRST1NLQV9BU1BFQ1RfUkFUSU9fTU9ERV9GUkVFOworICB2aWRlb2NvbnRleHQtPmZvdXJjYyA9IDA7CisKKyAgLyogVE9ETzogLSBjaGVjayBpZiB3ZSBoYW5kbGUgYWxsIGNvZGVjcyBieSB0aGUgc3BlYywgaS5lLiBjb2RlYyBwcml2YXRlCisgICAqICAgICAgICAgZGF0YSBhbmQgb3RoZXIgc2V0dGluZ3MKKyAgICogICAgICAgLSBhZGQgbmV3IGZvcm1hdHMKKyAgICovCisKKyAgLyogZXh0cmFjdCBjb2RlY19kYXRhLCBtYXkgdHVybiBvdXQgbmVlZGVkICovCisgIHZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImNvZGVjX2RhdGEiKTsKKyAgaWYgKHZhbHVlKQorICAgIGNvZGVjX2J1ZiA9IChHc3RCdWZmZXIgKikgZ3N0X3ZhbHVlX2dldF9idWZmZXIgKHZhbHVlKTsKKworICAvKiBmaW5kIHR5cGUgKi8KKyAgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1yYXciKSkgeworICAgIGNvbnN0IGdjaGFyICpmc3RyOworICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LAorICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fVU5DT01QUkVTU0VEKTsKKyAgICBmc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJmb3JtYXQiKTsKKyAgICBpZiAoZnN0cikgeworICAgICAgaWYgKHN0cmxlbiAoZnN0cikgPT0gNCkKKyAgICAgICAgdmlkZW9jb250ZXh0LT5mb3VyY2MgPSBHU1RfU1RSX0ZPVVJDQyAoZnN0cik7CisgICAgICBlbHNlIGlmICghc3RyY21wIChmc3RyLCAiR1JBWTgiKSkKKyAgICAgICAgdmlkZW9jb250ZXh0LT5mb3VyY2MgPSBHU1RfTUFLRV9GT1VSQ0MgKCdZJywgJzgnLCAnMCcsICcwJyk7CisgICAgICBlbHNlIGlmICghc3RyY21wIChmc3RyLCAiQkdSIikpCisgICAgICAgIHZpZGVvY29udGV4dC0+Zm91cmNjID0gR1NUX01BS0VfRk9VUkNDICgnQicsICdHJywgJ1InLCAyNCk7CisgICAgICBlbHNlIGlmICghc3RyY21wIChmc3RyLCAiUkdCIikpCisgICAgICAgIHZpZGVvY29udGV4dC0+Zm91cmNjID0gR1NUX01BS0VfRk9VUkNDICgnUicsICdHJywgJ0InLCAyNCk7CisgICAgfQorICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1odWZmeXV2IikgICAgICAvKiBNUy9WZlcgY29tcGF0aWJpbGl0eSBjYXNlcyAqLworICAgICAgfHwhc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtZGl2eCIpCisgICAgICB8fCAhc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtZHYiKQorICAgICAgfHwgIXN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LWgyNjMiKQorICAgICAgfHwgIXN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LW1zbXBlZyIpCisgICAgICB8fCAhc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtd212IikKKyAgICAgIHx8ICFzdHJjbXAgKG1pbWV0eXBlLCAiaW1hZ2UvanBlZyIpKSB7CisgICAgZ3N0X3JpZmZfc3RyZl92aWRzICpiaWg7CisgICAgZ2ludCBzaXplID0gc2l6ZW9mIChnc3RfcmlmZl9zdHJmX3ZpZHMpOworICAgIGd1aW50MzIgZm91cmNjID0gMDsKKworICAgIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtaHVmZnl1diIpKQorICAgICAgZm91cmNjID0gR1NUX01BS0VfRk9VUkNDICgnSCcsICdGJywgJ1knLCAnVScpOworICAgIGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1kdiIpKQorICAgICAgZm91cmNjID0gR1NUX01BS0VfRk9VUkNDICgnRCcsICdWJywgJ1MnLCAnRCcpOworICAgIGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1oMjYzIikpCisgICAgICBmb3VyY2MgPSBHU1RfTUFLRV9GT1VSQ0MgKCdIJywgJzInLCAnNicsICczJyk7CisgICAgZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LWRpdngiKSkgeworICAgICAgZ2ludCBkaXZ4dmVyc2lvbjsKKworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJkaXZ4dmVyc2lvbiIsICZkaXZ4dmVyc2lvbik7CisgICAgICBzd2l0Y2ggKGRpdnh2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICBmb3VyY2MgPSBHU1RfTUFLRV9GT1VSQ0MgKCdEJywgJ0knLCAnVicsICczJyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICBmb3VyY2MgPSBHU1RfTUFLRV9GT1VSQ0MgKCdEJywgJ0knLCAnVicsICdYJyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICBmb3VyY2MgPSBHU1RfTUFLRV9GT1VSQ0MgKCdEJywgJ1gnLCAnNScsICcwJyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtbXNtcGVnIikpIHsKKyAgICAgIGdpbnQgbXNtcGVndmVyc2lvbjsKKworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJtc21wZWd2ZXJzaW9uIiwgJm1zbXBlZ3ZlcnNpb24pOworICAgICAgc3dpdGNoIChtc21wZWd2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgNDE6CisgICAgICAgICAgZm91cmNjID0gR1NUX01BS0VfRk9VUkNDICgnTScsICdQJywgJ0cnLCAnNCcpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQyOgorICAgICAgICAgIGZvdXJjYyA9IEdTVF9NQUtFX0ZPVVJDQyAoJ00nLCAnUCcsICc0JywgJzInKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0MzoKKyAgICAgICAgICBnb3RvIG1zbXBlZzQzOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LXdtdiIpKSB7CisgICAgICBnaW50IHdtdnZlcnNpb247CisgICAgICBjb25zdCBnY2hhciAqZnN0cjsKKworICAgICAgZnN0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZm9ybWF0Iik7CisgICAgICBpZiAoZnN0ciAmJiBzdHJsZW4gKGZzdHIpID09IDQpIHsKKyAgICAgICAgZm91cmNjID0gR1NUX1NUUl9GT1VSQ0MgKGZzdHIpOworICAgICAgfSBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIndtdnZlcnNpb24iLCAmd212dmVyc2lvbikpIHsKKyAgICAgICAgaWYgKHdtdnZlcnNpb24gPT0gMikgeworICAgICAgICAgIGZvdXJjYyA9IEdTVF9NQUtFX0ZPVVJDQyAoJ1cnLCAnTScsICdWJywgJzInKTsKKyAgICAgICAgfSBlbHNlIGlmICh3bXZ2ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICBmb3VyY2MgPSBHU1RfTUFLRV9GT1VSQ0MgKCdXJywgJ00nLCAnVicsICcxJyk7CisgICAgICAgIH0gZWxzZSBpZiAod212dmVyc2lvbiA9PSAzKSB7CisgICAgICAgICAgZm91cmNjID0gR1NUX01BS0VfRk9VUkNDICgnVycsICdNJywgJ1YnLCAnMycpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImltYWdlL2pwZWciKSkgeworICAgICAgZm91cmNjID0gR1NUX01BS0VfRk9VUkNDICgnTScsICdKJywgJ1AnLCAnRycpOworICAgIH0KKworICAgIGlmICghZm91cmNjKQorICAgICAgZ290byByZWZ1c2VfY2FwczsKKworICAgIGJpaCA9IGdfbmV3MCAoZ3N0X3JpZmZfc3RyZl92aWRzLCAxKTsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0xFICgmYmloLT5zaXplLCBzaXplKTsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0xFICgmYmloLT53aWR0aCwgdmlkZW9jb250ZXh0LT5waXhlbF93aWR0aCk7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoJmJpaC0+aGVpZ2h0LCB2aWRlb2NvbnRleHQtPnBpeGVsX2hlaWdodCk7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoJmJpaC0+Y29tcHJlc3Npb24sIGZvdXJjYyk7CisgICAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoJmJpaC0+cGxhbmVzLCAoZ3VpbnQxNikgMSk7CisgICAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoJmJpaC0+Yml0X2NudCwgKGd1aW50MTYpIDI0KTsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0xFICgmYmloLT5pbWFnZV9zaXplLCB2aWRlb2NvbnRleHQtPnBpeGVsX3dpZHRoICoKKyAgICAgICAgdmlkZW9jb250ZXh0LT5waXhlbF9oZWlnaHQgKiAzKTsKKworICAgIC8qIHByb2Nlc3MgY29kZWMgcHJpdmF0ZS9pbml0aWFsaXphdGlvbiBkYXRhLCBpZiBhbnkgKi8KKyAgICBpZiAoY29kZWNfYnVmKSB7CisgICAgICBzaXplICs9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGNvZGVjX2J1Zik7CisgICAgICBiaWggPSBnX3JlYWxsb2MgKGJpaCwgc2l6ZSk7CisgICAgICBHU1RfV1JJVEVfVUlOVDMyX0xFICgmYmloLT5zaXplLCBzaXplKTsKKyAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoY29kZWNfYnVmLCAwLAorICAgICAgICAgIChndWludDggKikgYmloICsgc2l6ZW9mIChnc3RfcmlmZl9zdHJmX3ZpZHMpLCAtMSk7CisgICAgfQorCisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19WRldfRk9VUkNDKTsKKyAgICBnc3RfbWF0cm9za2FfbXV4X2ZyZWVfY29kZWNfcHJpdiAoY29udGV4dCk7CisgICAgY29udGV4dC0+Y29kZWNfcHJpdiA9IChncG9pbnRlcikgYmloOworICAgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA9IHNpemU7CisgICAgY29udGV4dC0+ZHRzX29ubHkgPSBUUlVFOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1oMjY0IikpIHsKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwKKyAgICAgICAgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX01QRUc0X0FWQyk7CisgICAgZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKGNvbnRleHQpOworICAgIC8qIENyZWF0ZSBhdmNDIGhlYWRlciAqLworICAgIGlmIChjb2RlY19idWYgIT0gTlVMTCkgeworICAgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoY29kZWNfYnVmKTsKKyAgICAgIGNvbnRleHQtPmNvZGVjX3ByaXYgPSBnX21hbGxvYzAgKGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSk7CisgICAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKGNvZGVjX2J1ZiwgMCwgY29udGV4dC0+Y29kZWNfcHJpdiwgLTEpOworICAgIH0KKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtaDI2NSIpKSB7CisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19NUEVHSF9IRVZDKTsKKyAgICBnc3RfbWF0cm9za2FfbXV4X2ZyZWVfY29kZWNfcHJpdiAoY29udGV4dCk7CisgICAgLyogQ3JlYXRlIGh2Y0MgaGVhZGVyICovCisgICAgaWYgKGNvZGVjX2J1ZiAhPSBOVUxMKSB7CisgICAgICBjb250ZXh0LT5jb2RlY19wcml2X3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChjb2RlY19idWYpOworICAgICAgY29udGV4dC0+Y29kZWNfcHJpdiA9IGdfbWFsbG9jMCAoY29udGV4dC0+Y29kZWNfcHJpdl9zaXplKTsKKyAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoY29kZWNfYnVmLCAwLCBjb250ZXh0LT5jb2RlY19wcml2LCAtMSk7CisgICAgfQorICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC10aGVvcmEiKSkgeworICAgIGNvbnN0IEdWYWx1ZSAqc3RyZWFtaGVhZGVyOworCisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19USEVPUkEpOworCisgICAgZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKGNvbnRleHQpOworCisgICAgc3RyZWFtaGVhZGVyID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgInN0cmVhbWhlYWRlciIpOworICAgIGlmICghdGhlb3JhX3N0cmVhbWhlYWRlcl90b19jb2RlY2RhdGEgKHN0cmVhbWhlYWRlciwgY29udGV4dCkpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksCisgICAgICAgICAgKCJ0aGVvcmEgc3RyZWFtIGhlYWRlcnMgbWlzc2luZyBvciBtYWxmb3JtZWQiKSk7CisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtZGlyYWMiKSkgeworICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fRElSQUMpOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC12cDgiKSkgeworICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fVlA4KTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtdnA5IikpIHsKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1ZQOSk7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJ2aWRlby94LWF2MSIpKSB7CisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19BVjEpOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8vbXBlZyIpKSB7CisgICAgZ2ludCBtcGVndmVyc2lvbjsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAibXBlZ3ZlcnNpb24iLCAmbXBlZ3ZlcnNpb24pOworICAgIHN3aXRjaCAobXBlZ3ZlcnNpb24pIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFRzEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFRzIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVBFRzRfQVNQKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKworICAgIC8qIGdsb2JhbCBoZWFkZXJzIG1heSBiZSBpbiBjb2RlYyBkYXRhICovCisgICAgaWYgKGNvZGVjX2J1ZiAhPSBOVUxMKSB7CisgICAgICBnc3RfbWF0cm9za2FfbXV4X2ZyZWVfY29kZWNfcHJpdiAoY29udGV4dCk7CisgICAgICBjb250ZXh0LT5jb2RlY19wcml2X3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChjb2RlY19idWYpOworICAgICAgY29udGV4dC0+Y29kZWNfcHJpdiA9IGdfbWFsbG9jMCAoY29udGV4dC0+Y29kZWNfcHJpdl9zaXplKTsKKyAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoY29kZWNfYnVmLCAwLCBjb250ZXh0LT5jb2RlY19wcml2LCAtMSk7CisgICAgfQorICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAidmlkZW8veC1tc21wZWciKSkgeworICBtc21wZWc0MzoKKyAgICAvKiBjYW4gb25seSBtYWtlIGl0IGhlcmUgaWYgcHJlY2VkaW5nIGNhc2UgdmVyaWZpZWQgaXQgd2FzIHZlcnNpb24gMyAqLworICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LAorICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fTVNNUEVHNFYzKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtcG4tcmVhbHZpZGVvIikpIHsKKyAgICBnaW50IHJtdmVyc2lvbjsKKyAgICBjb25zdCBHVmFsdWUgKm1kcHJfZGF0YTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAicm12ZXJzaW9uIiwgJnJtdmVyc2lvbik7CisgICAgc3dpdGNoIChybXZlcnNpb24pIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fUkVBTFZJREVPMSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwKKyAgICAgICAgICAgIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19SRUFMVklERU8yKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6CisgICAgICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LAorICAgICAgICAgICAgR1NUX01BVFJPU0tBX0NPREVDX0lEX1ZJREVPX1JFQUxWSURFTzMpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fUkVBTFZJREVPNCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgICB9CisKKyAgICBtZHByX2RhdGEgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAibWRwcl9kYXRhIik7CisgICAgaWYgKG1kcHJfZGF0YSAhPSBOVUxMKSB7CisgICAgICBndWludDggKnByaXZfZGF0YSA9IE5VTEw7CisgICAgICBndWludCBwcml2X2RhdGFfc2l6ZSA9IDA7CisKKyAgICAgIEdzdEJ1ZmZlciAqY29kZWNfZGF0YV9idWYgPSBnX3ZhbHVlX3BlZWtfcG9pbnRlciAobWRwcl9kYXRhKTsKKworICAgICAgcHJpdl9kYXRhX3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChjb2RlY19kYXRhX2J1Zik7CisgICAgICBwcml2X2RhdGEgPSBnX21hbGxvYzAgKHByaXZfZGF0YV9zaXplKTsKKworICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChjb2RlY19kYXRhX2J1ZiwgMCwgcHJpdl9kYXRhLCAtMSk7CisKKyAgICAgIGdzdF9tYXRyb3NrYV9tdXhfZnJlZV9jb2RlY19wcml2IChjb250ZXh0KTsKKyAgICAgIGNvbnRleHQtPmNvZGVjX3ByaXYgPSBwcml2X2RhdGE7CisgICAgICBjb250ZXh0LT5jb2RlY19wcml2X3NpemUgPSBwcml2X2RhdGFfc2l6ZTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3RyY21wIChtaW1ldHlwZSwgInZpZGVvL3gtcHJvcmVzIikgPT0gMCkgeworICAgIGNvbnN0IGdjaGFyICp2YXJpYW50OworCisgICAgZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKGNvbnRleHQpOworCisgICAgdmFyaWFudCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZm9ybWF0Iik7CisgICAgaWYgKCF2YXJpYW50IHx8ICFnX3N0cmNtcDAgKHZhcmlhbnQsICJzdGFuZGFyZCIpKQorICAgICAgY29udGV4dC0+Y29kZWNfcHJpdiA9IGdfc3RyZHVwICgiYXBjbiIpOworICAgIGVsc2UgaWYgKCFnX3N0cmNtcDAgKHZhcmlhbnQsICJocSIpKQorICAgICAgY29udGV4dC0+Y29kZWNfcHJpdiA9IGdfc3RyZHVwICgiYXBjaCIpOworICAgIGVsc2UgaWYgKCFnX3N0cmNtcDAgKHZhcmlhbnQsICJsdCIpKQorICAgICAgY29udGV4dC0+Y29kZWNfcHJpdiA9IGdfc3RyZHVwICgiYXBjcyIpOworICAgIGVsc2UgaWYgKCFnX3N0cmNtcDAgKHZhcmlhbnQsICJwcm94eSIpKQorICAgICAgY29udGV4dC0+Y29kZWNfcHJpdiA9IGdfc3RyZHVwICgiYXBjbyIpOworICAgIGVsc2UgaWYgKCFnX3N0cmNtcDAgKHZhcmlhbnQsICI0NDQ0IikpCisgICAgICBjb250ZXh0LT5jb2RlY19wcml2ID0gZ19zdHJkdXAgKCJhcDRoIik7CisgICAgZWxzZSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgIlVuaGFuZGxlZCBwcm9yZXMgZm9ybWF0OiAlcyIsIHZhcmlhbnQpOworCisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKworICAgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA9IHNpemVvZiAoZ3VpbnQzMik7CisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19QUk9SRVMpOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCityZWZ1c2VfY2FwczoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAicGFkICVzIHJlZnVzZWQgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgR1NUX1BBRF9OQU1FIChwYWQpLCBjYXBzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogTiA+IDAgdG8gZXhwZWN0IGEgcGFydGljdWxhciBudW1iZXIgb2YgaGVhZGVycywgbmVnYXRpdmUgaWYgdGhlCisgICBudW1iZXIgb2YgaGVhZGVycyBpcyB2YXJpYWJsZSAqLworc3RhdGljIGdib29sZWFuCit4aXBoTl9zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChjb25zdCBHVmFsdWUgKiBzdHJlYW1oZWFkZXIsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0LCBHc3RCdWZmZXIgKiogcF9idWYwLCBpbnQgTikKK3sKKyAgR3N0QnVmZmVyICoqYnVmID0gTlVMTDsKKyAgR0FycmF5ICpidWZhcnI7CisgIGd1aW50OCAqcHJpdl9kYXRhOworICBndWludCBidWZpLCBpLCBvZmZzZXQsIHByaXZfZGF0YV9zaXplOworCisgIGlmIChzdHJlYW1oZWFkZXIgPT0gTlVMTCkKKyAgICBnb3RvIG5vX3N0cmVhbV9oZWFkZXJzOworCisgIGlmIChHX1ZBTFVFX1RZUEUgKHN0cmVhbWhlYWRlcikgIT0gR1NUX1RZUEVfQVJSQVkpCisgICAgZ290byB3cm9uZ190eXBlOworCisgIGJ1ZmFyciA9IGdfdmFsdWVfcGVla19wb2ludGVyIChzdHJlYW1oZWFkZXIpOworICBpZiAoYnVmYXJyLT5sZW4gPD0gMCB8fCBidWZhcnItPmxlbiA+IDI1NSkgICAgLyogYXQgbGVhc3Qgb25lIGhlYWRlciwgYW5kIGNvdW50IHN0b3JlZCBpbiBhIGJ5dGUgKi8KKyAgICBnb3RvIHdyb25nX2NvdW50OworICBpZiAoTiA+IDAgJiYgYnVmYXJyLT5sZW4gIT0gTikKKyAgICBnb3RvIHdyb25nX2NvdW50OworCisgIGNvbnRleHQtPnhpcGhfaGVhZGVyc190b19za2lwID0gYnVmYXJyLT5sZW47CisKKyAgYnVmID0gKEdzdEJ1ZmZlciAqKikgZ19tYWxsb2MwIChzaXplb2YgKEdzdEJ1ZmZlciAqKSAqIGJ1ZmFyci0+bGVuKTsKKyAgZm9yIChpID0gMDsgaSA8IGJ1ZmFyci0+bGVuOyBpKyspIHsKKyAgICBHVmFsdWUgKmJ1ZnZhbCA9ICZnX2FycmF5X2luZGV4IChidWZhcnIsIEdWYWx1ZSwgaSk7CisKKyAgICBpZiAoR19WQUxVRV9UWVBFIChidWZ2YWwpICE9IEdTVF9UWVBFX0JVRkZFUikgeworICAgICAgZ19mcmVlIChidWYpOworICAgICAgZ290byB3cm9uZ19jb250ZW50X3R5cGU7CisgICAgfQorCisgICAgYnVmW2ldID0gZ192YWx1ZV9wZWVrX3BvaW50ZXIgKGJ1ZnZhbCk7CisgIH0KKworICBwcml2X2RhdGFfc2l6ZSA9IDE7CisgIGlmIChidWZhcnItPmxlbiA+IDApIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmYXJyLT5sZW4gLSAxOyBpKyspIHsKKyAgICAgIHByaXZfZGF0YV9zaXplICs9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZltpXSkgLyAweGZmICsgMTsKKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgYnVmYXJyLT5sZW47ICsraSkgeworICAgIHByaXZfZGF0YV9zaXplICs9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZltpXSk7CisgIH0KKworICBwcml2X2RhdGEgPSBnX21hbGxvYzAgKHByaXZfZGF0YV9zaXplKTsKKworICBwcml2X2RhdGFbMF0gPSBidWZhcnItPmxlbiAtIDE7CisgIG9mZnNldCA9IDE7CisKKyAgaWYgKGJ1ZmFyci0+bGVuID4gMCkgeworICAgIGZvciAoYnVmaSA9IDA7IGJ1ZmkgPCBidWZhcnItPmxlbiAtIDE7IGJ1ZmkrKykgeworICAgICAgZm9yIChpID0gMDsgaSA8IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZltidWZpXSkgLyAweGZmOyArK2kpIHsKKyAgICAgICAgcHJpdl9kYXRhW29mZnNldCsrXSA9IDB4ZmY7CisgICAgICB9CisgICAgICBwcml2X2RhdGFbb2Zmc2V0KytdID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmW2J1ZmldKSAlIDB4ZmY7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGJ1ZmFyci0+bGVuOyArK2kpIHsKKyAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKGJ1ZltpXSwgMCwgcHJpdl9kYXRhICsgb2Zmc2V0LCAtMSk7CisgICAgb2Zmc2V0ICs9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZltpXSk7CisgIH0KKworICBnc3RfbWF0cm9za2FfbXV4X2ZyZWVfY29kZWNfcHJpdiAoY29udGV4dCk7CisgIGNvbnRleHQtPmNvZGVjX3ByaXYgPSBwcml2X2RhdGE7CisgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA9IHByaXZfZGF0YV9zaXplOworCisgIGlmIChwX2J1ZjApCisgICAgKnBfYnVmMCA9IGdzdF9idWZmZXJfcmVmIChidWZbMF0pOworCisgIGdfZnJlZSAoYnVmKTsKKworICByZXR1cm4gVFJVRTsKKworLyogRVJST1JTICovCitub19zdHJlYW1faGVhZGVyczoKKyAgeworICAgIEdTVF9XQVJOSU5HICgicmVxdWlyZWQgc3RyZWFtaGVhZGVycyBtaXNzaW5nIGluIHNpbmsgY2FwcyEiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3dyb25nX3R5cGU6CisgIHsKKyAgICBHU1RfV0FSTklORyAoInN0cmVhbWhlYWRlcnMgYXJlIG5vdCBhIEdTVF9UWVBFX0FSUkFZLCBidXQgYSAlcyIsCisgICAgICAgIEdfVkFMVUVfVFlQRV9OQU1FIChzdHJlYW1oZWFkZXIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3dyb25nX2NvdW50OgorICB7CisgICAgR1NUX1dBUk5JTkcgKCJnb3QgJXUgc3RyZWFtaGVhZGVycywgbm90ICVkIGFzIGV4cGVjdGVkIiwgYnVmYXJyLT5sZW4sIE4pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQord3JvbmdfY29udGVudF90eXBlOgorICB7CisgICAgR1NUX1dBUk5JTkcgKCJzdHJlYW1oZWFkZXJzIGFycmF5IGRvZXMgbm90IGNvbnRhaW4gR3N0QnVmZmVycyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3ZvcmJpc19zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChjb25zdCBHVmFsdWUgKiBzdHJlYW1oZWFkZXIsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0KQoreworICBHc3RCdWZmZXIgKmJ1ZjAgPSBOVUxMOworCisgIGlmICgheGlwaE5fc3RyZWFtaGVhZGVyX3RvX2NvZGVjZGF0YSAoc3RyZWFtaGVhZGVyLCBjb250ZXh0LCAmYnVmMCwgMykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChidWYwID09IE5VTEwgfHwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmMCkgPCAxICsgNiArIDQpIHsKKyAgICBHU1RfV0FSTklORyAoIkZpcnN0IHZvcmJpcyBoZWFkZXIgdG9vIHNtYWxsLCBpZ25vcmluZyIpOworICB9IGVsc2UgeworICAgIGlmIChnc3RfYnVmZmVyX21lbWNtcCAoYnVmMCwgMSwgInZvcmJpcyIsIDYpID09IDApIHsKKyAgICAgIEdzdE1hdHJvc2thVHJhY2tBdWRpb0NvbnRleHQgKmF1ZGlvY29udGV4dDsKKyAgICAgIEdzdE1hcEluZm8gbWFwOworICAgICAgZ3VpbnQ4ICpoZHI7CisKKyAgICAgIGdzdF9idWZmZXJfbWFwIChidWYwLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgaGRyID0gbWFwLmRhdGEgKyAxICsgNiArIDQ7CisgICAgICBhdWRpb2NvbnRleHQgPSAoR3N0TWF0cm9za2FUcmFja0F1ZGlvQ29udGV4dCAqKSBjb250ZXh0OworICAgICAgYXVkaW9jb250ZXh0LT5jaGFubmVscyA9IEdTVF9SRUFEX1VJTlQ4IChoZHIpOworICAgICAgYXVkaW9jb250ZXh0LT5zYW1wbGVyYXRlID0gR1NUX1JFQURfVUlOVDMyX0xFIChoZHIgKyAxKTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZjAsICZtYXApOworICAgIH0KKyAgfQorCisgIGlmIChidWYwKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZjApOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3RoZW9yYV9zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChjb25zdCBHVmFsdWUgKiBzdHJlYW1oZWFkZXIsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0KQoreworICBHc3RCdWZmZXIgKmJ1ZjAgPSBOVUxMOworCisgIGlmICgheGlwaE5fc3RyZWFtaGVhZGVyX3RvX2NvZGVjZGF0YSAoc3RyZWFtaGVhZGVyLCBjb250ZXh0LCAmYnVmMCwgMykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChidWYwID09IE5VTEwgfHwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmMCkgPCAxICsgNiArIDI2KSB7CisgICAgR1NUX1dBUk5JTkcgKCJGaXJzdCB0aGVvcmEgaGVhZGVyIHRvbyBzbWFsbCwgaWdub3JpbmciKTsKKyAgfSBlbHNlIGlmIChnc3RfYnVmZmVyX21lbWNtcCAoYnVmMCwgMCwgIlwyMDB0aGVvcmFcMDAzXDAwMiIsIDkpICE9IDApIHsKKyAgICBHU1RfV0FSTklORyAoIkZpcnN0IGhlYWRlciBub3QgYSB0aGVvcmEgaWRlbnRpZmljYXRpb24gaGVhZGVyLCBpZ25vcmluZyIpOworICB9IGVsc2UgeworICAgIEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQgKnZpZGVvY29udGV4dDsKKyAgICBndWludCBmcHNfbnVtLCBmcHNfZGVub20sIHBhcl9udW0sIHBhcl9kZW5vbTsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBndWludDggKmhkcjsKKworICAgIGdzdF9idWZmZXJfbWFwIChidWYwLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIGhkciA9IG1hcC5kYXRhICsgMSArIDYgKyAzICsgMiArIDI7CisKKyAgICB2aWRlb2NvbnRleHQgPSAoR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqKSBjb250ZXh0OworICAgIHZpZGVvY29udGV4dC0+cGl4ZWxfd2lkdGggPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGhkcikgPj4gODsKKyAgICB2aWRlb2NvbnRleHQtPnBpeGVsX2hlaWdodCA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoaGRyICsgMykgPj4gODsKKyAgICBoZHIgKz0gMyArIDMgKyAxICsgMTsKKyAgICBmcHNfbnVtID0gR1NUX1JFQURfVUlOVDMyX0JFIChoZHIpOworICAgIGZwc19kZW5vbSA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoaGRyICsgNCk7CisgICAgY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbiA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKEdTVF9TRUNPTkQsCisgICAgICAgIGZwc19kZW5vbSwgZnBzX251bSk7CisgICAgaGRyICs9IDQgKyA0OworICAgIHBhcl9udW0gPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGhkcikgPj4gODsKKyAgICBwYXJfZGVub20gPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGhkciArIDMpID4+IDg7CisgICAgaWYgKHBhcl9udW0gPiAwICYmIHBhcl9kZW5vbSA+IDApIHsKKyAgICAgIGlmIChwYXJfbnVtID4gcGFyX2Rlbm9tKSB7CisgICAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV93aWR0aCA9CisgICAgICAgICAgICB2aWRlb2NvbnRleHQtPnBpeGVsX3dpZHRoICogcGFyX251bSAvIHBhcl9kZW5vbTsKKyAgICAgICAgdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCA9IHZpZGVvY29udGV4dC0+cGl4ZWxfaGVpZ2h0OworICAgICAgfSBlbHNlIGlmIChwYXJfbnVtIDwgcGFyX2Rlbm9tKSB7CisgICAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV93aWR0aCA9IHZpZGVvY29udGV4dC0+cGl4ZWxfd2lkdGg7CisgICAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV9oZWlnaHQgPQorICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5waXhlbF9oZWlnaHQgKiBwYXJfZGVub20gLyBwYXJfbnVtOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmlkZW9jb250ZXh0LT5kaXNwbGF5X3dpZHRoID0gMDsKKyAgICAgICAgdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCA9IDA7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHZpZGVvY29udGV4dC0+ZGlzcGxheV93aWR0aCA9IDA7CisgICAgICB2aWRlb2NvbnRleHQtPmRpc3BsYXlfaGVpZ2h0ID0gMDsKKyAgICB9CisKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYwLCAmbWFwKTsKKyAgfQorCisgIGlmIChidWYwKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZjApOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2thdGVfc3RyZWFtaGVhZGVyX3RvX2NvZGVjZGF0YSAoY29uc3QgR1ZhbHVlICogc3RyZWFtaGVhZGVyLAorICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICogY29udGV4dCkKK3sKKyAgR3N0QnVmZmVyICpidWYwID0gTlVMTDsKKworICBpZiAoIXhpcGhOX3N0cmVhbWhlYWRlcl90b19jb2RlY2RhdGEgKHN0cmVhbWhlYWRlciwgY29udGV4dCwgJmJ1ZjAsIC0xKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGJ1ZjAgPT0gTlVMTCB8fCBnc3RfYnVmZmVyX2dldF9zaXplIChidWYwKSA8IDY0KSB7ICAgICAgICAvKiBLYXRlIElEIGhlYWRlciBpcyA2NCBieXRlcyAqLworICAgIEdTVF9XQVJOSU5HICgiRmlyc3Qga2F0ZSBoZWFkZXIgdG9vIHNtYWxsLCBpZ25vcmluZyIpOworICB9IGVsc2UgaWYgKGdzdF9idWZmZXJfbWVtY21wIChidWYwLCAwLCAiXDIwMGthdGVcMFwwXDAiLCA4KSAhPSAwKSB7CisgICAgR1NUX1dBUk5JTkcgKCJGaXJzdCBoZWFkZXIgbm90IGEga2F0ZSBpZGVudGlmaWNhdGlvbiBoZWFkZXIsIGlnbm9yaW5nIik7CisgIH0KKworICBpZiAoYnVmMCkKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYwKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitmbGFjX3N0cmVhbWhlYWRlcl90b19jb2RlY2RhdGEgKGNvbnN0IEdWYWx1ZSAqIHN0cmVhbWhlYWRlciwKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIGNvbnRleHQpCit7CisgIEdBcnJheSAqYnVmYXJyOworICBnaW50IGk7CisgIEdWYWx1ZSAqYnVmdmFsOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKworICBpZiAoc3RyZWFtaGVhZGVyID09IE5VTEwgfHwgR19WQUxVRV9UWVBFIChzdHJlYW1oZWFkZXIpICE9IEdTVF9UWVBFX0FSUkFZKSB7CisgICAgR1NUX1dBUk5JTkcgKCJObyBvciBpbnZhbGlkIHN0cmVhbWhlYWRlciBmaWVsZCBpbiB0aGUgY2FwcyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGJ1ZmFyciA9IGdfdmFsdWVfcGVla19wb2ludGVyIChzdHJlYW1oZWFkZXIpOworICBpZiAoYnVmYXJyLT5sZW4gPCAyKSB7CisgICAgR1NUX1dBUk5JTkcgKCJUb28gZmV3IGhlYWRlcnMgaW4gc3RyZWFtaGVhZGVyIGZpZWxkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgY29udGV4dC0+eGlwaF9oZWFkZXJzX3RvX3NraXAgPSBidWZhcnItPmxlbiArIDE7CisKKyAgYnVmdmFsID0gJmdfYXJyYXlfaW5kZXggKGJ1ZmFyciwgR1ZhbHVlLCAwKTsKKyAgaWYgKEdfVkFMVUVfVFlQRSAoYnVmdmFsKSAhPSBHU1RfVFlQRV9CVUZGRVIpIHsKKyAgICBHU1RfV0FSTklORyAoInN0cmVhbWhlYWRlcnMgYXJyYXkgZG9lcyBub3QgY29udGFpbiBHc3RCdWZmZXJzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgYnVmZmVyID0gZ192YWx1ZV9wZWVrX3BvaW50ZXIgKGJ1ZnZhbCk7CisKKyAgLyogTmVlZCBhdCBsZWFzdCBPZ2dGTEFDIG1hcHBpbmcgaGVhZGVyLCBmTGFDIG1hcmtlciBhbmQgU1RSRUFNSU5GTyBibG9jayAqLworICBpZiAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSA8IDkgKyA0ICsgNCArIDM0CisgICAgICB8fCBnc3RfYnVmZmVyX21lbWNtcCAoYnVmZmVyLCAxLCAiRkxBQyIsIDQpICE9IDAKKyAgICAgIHx8IGdzdF9idWZmZXJfbWVtY21wIChidWZmZXIsIDksICJmTGFDIiwgNCkgIT0gMCkgeworICAgIEdTVF9XQVJOSU5HICgiSW52YWxpZCBzdHJlYW1oZWFkZXIgZm9yIEZMQUMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBnc3RfbWF0cm9za2FfbXV4X2ZyZWVfY29kZWNfcHJpdiAoY29udGV4dCk7CisgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikgLSA5OworICBjb250ZXh0LT5jb2RlY19wcml2ID0gZ19tYWxsb2MgKGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSk7CisgIGdzdF9idWZmZXJfZXh0cmFjdCAoYnVmZmVyLCA5LCBjb250ZXh0LT5jb2RlY19wcml2LCAtMSk7CisKKyAgZm9yIChpID0gMTsgaSA8IGJ1ZmFyci0+bGVuOyBpKyspIHsKKyAgICBndWludCBvbGRfc2l6ZTsKKyAgICBidWZ2YWwgPSAmZ19hcnJheV9pbmRleCAoYnVmYXJyLCBHVmFsdWUsIGkpOworCisgICAgaWYgKEdfVkFMVUVfVFlQRSAoYnVmdmFsKSAhPSBHU1RfVFlQRV9CVUZGRVIpIHsKKyAgICAgIGdzdF9tYXRyb3NrYV9tdXhfZnJlZV9jb2RlY19wcml2IChjb250ZXh0KTsKKyAgICAgIEdTVF9XQVJOSU5HICgic3RyZWFtaGVhZGVycyBhcnJheSBkb2VzIG5vdCBjb250YWluIEdzdEJ1ZmZlcnMiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBidWZmZXIgPSBnX3ZhbHVlX3BlZWtfcG9pbnRlciAoYnVmdmFsKTsKKworICAgIG9sZF9zaXplID0gY29udGV4dC0+Y29kZWNfcHJpdl9zaXplOworICAgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSArPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworCisgICAgY29udGV4dC0+Y29kZWNfcHJpdiA9IGdfcmVhbGxvYyAoY29udGV4dC0+Y29kZWNfcHJpdiwKKyAgICAgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplKTsKKyAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKGJ1ZmZlciwgMCwKKyAgICAgICAgKGd1aW50OCAqKSBjb250ZXh0LT5jb2RlY19wcml2ICsgb2xkX3NpemUsIC0xKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3NwZWV4X3N0cmVhbWhlYWRlcl90b19jb2RlY2RhdGEgKGNvbnN0IEdWYWx1ZSAqIHN0cmVhbWhlYWRlciwKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIGNvbnRleHQpCit7CisgIEdBcnJheSAqYnVmYXJyOworICBHVmFsdWUgKmJ1ZnZhbDsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIGd1aW50IG9sZF9zaXplOworCisgIGlmIChzdHJlYW1oZWFkZXIgPT0gTlVMTCB8fCBHX1ZBTFVFX1RZUEUgKHN0cmVhbWhlYWRlcikgIT0gR1NUX1RZUEVfQVJSQVkpIHsKKyAgICBHU1RfV0FSTklORyAoIk5vIG9yIGludmFsaWQgc3RyZWFtaGVhZGVyIGZpZWxkIGluIHRoZSBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgYnVmYXJyID0gZ192YWx1ZV9wZWVrX3BvaW50ZXIgKHN0cmVhbWhlYWRlcik7CisgIGlmIChidWZhcnItPmxlbiAhPSAyKSB7CisgICAgR1NUX1dBUk5JTkcgKCJUb28gZmV3IGhlYWRlcnMgaW4gc3RyZWFtaGVhZGVyIGZpZWxkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgY29udGV4dC0+eGlwaF9oZWFkZXJzX3RvX3NraXAgPSBidWZhcnItPmxlbiArIDE7CisKKyAgYnVmdmFsID0gJmdfYXJyYXlfaW5kZXggKGJ1ZmFyciwgR1ZhbHVlLCAwKTsKKyAgaWYgKEdfVkFMVUVfVFlQRSAoYnVmdmFsKSAhPSBHU1RfVFlQRV9CVUZGRVIpIHsKKyAgICBHU1RfV0FSTklORyAoInN0cmVhbWhlYWRlcnMgYXJyYXkgZG9lcyBub3QgY29udGFpbiBHc3RCdWZmZXJzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgYnVmZmVyID0gZ192YWx1ZV9wZWVrX3BvaW50ZXIgKGJ1ZnZhbCk7CisKKyAgaWYgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikgPCA4MAorICAgICAgfHwgZ3N0X2J1ZmZlcl9tZW1jbXAgKGJ1ZmZlciwgMCwgIlNwZWV4ICAgIiwgOCkgIT0gMCkgeworICAgIEdTVF9XQVJOSU5HICgiSW52YWxpZCBzdHJlYW1oZWFkZXIgZm9yIFNwZWV4Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKGNvbnRleHQpOworICBjb250ZXh0LT5jb2RlY19wcml2X3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworICBjb250ZXh0LT5jb2RlY19wcml2ID0gZ19tYWxsb2MgKGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSk7CisgIGdzdF9idWZmZXJfZXh0cmFjdCAoYnVmZmVyLCAwLCBjb250ZXh0LT5jb2RlY19wcml2LCAtMSk7CisKKyAgYnVmdmFsID0gJmdfYXJyYXlfaW5kZXggKGJ1ZmFyciwgR1ZhbHVlLCAxKTsKKworICBpZiAoR19WQUxVRV9UWVBFIChidWZ2YWwpICE9IEdTVF9UWVBFX0JVRkZFUikgeworICAgIGdzdF9tYXRyb3NrYV9tdXhfZnJlZV9jb2RlY19wcml2IChjb250ZXh0KTsKKyAgICBHU1RfV0FSTklORyAoInN0cmVhbWhlYWRlcnMgYXJyYXkgZG9lcyBub3QgY29udGFpbiBHc3RCdWZmZXJzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgYnVmZmVyID0gZ192YWx1ZV9wZWVrX3BvaW50ZXIgKGJ1ZnZhbCk7CisKKyAgb2xkX3NpemUgPSBjb250ZXh0LT5jb2RlY19wcml2X3NpemU7CisgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSArPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworICBjb250ZXh0LT5jb2RlY19wcml2ID0gZ19yZWFsbG9jIChjb250ZXh0LT5jb2RlY19wcml2LAorICAgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplKTsKKyAgZ3N0X2J1ZmZlcl9leHRyYWN0IChidWZmZXIsIDAsIChndWludDggKikgY29udGV4dC0+Y29kZWNfcHJpdiArIG9sZF9zaXplLCAtMSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorb3B1c19zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChjb25zdCBHVmFsdWUgKiBzdHJlYW1oZWFkZXIsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0KQoreworICBHQXJyYXkgKmJ1ZmFycjsKKyAgR1ZhbHVlICpidWZ2YWw7CisgIEdzdEJ1ZmZlciAqYnVmOworCisgIGlmIChHX1ZBTFVFX1RZUEUgKHN0cmVhbWhlYWRlcikgIT0gR1NUX1RZUEVfQVJSQVkpCisgICAgZ290byB3cm9uZ190eXBlOworCisgIGJ1ZmFyciA9IGdfdmFsdWVfcGVla19wb2ludGVyIChzdHJlYW1oZWFkZXIpOworICBpZiAoYnVmYXJyLT5sZW4gIT0gMSAmJiBidWZhcnItPmxlbiAhPSAyKSAgICAgLyogb25lIGhlYWRlciwgYW5kIGNvdW50IHN0b3JlZCBpbiBhIGJ5dGUgKi8KKyAgICBnb3RvIHdyb25nX2NvdW50OworCisgIC8qIE9wdXMgaGVhZGVycyBhcmUgbm90IGluLWJhbmQgKi8KKyAgY29udGV4dC0+eGlwaF9oZWFkZXJzX3RvX3NraXAgPSAwOworCisgIGJ1ZnZhbCA9ICZnX2FycmF5X2luZGV4IChidWZhcnIsIEdWYWx1ZSwgMCk7CisgIGlmIChHX1ZBTFVFX1RZUEUgKGJ1ZnZhbCkgIT0gR1NUX1RZUEVfQlVGRkVSKSB7CisgICAgZ290byB3cm9uZ19jb250ZW50X3R5cGU7CisgIH0KKyAgYnVmID0gZ192YWx1ZV9wZWVrX3BvaW50ZXIgKGJ1ZnZhbCk7CisKKyAgZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKGNvbnRleHQpOworCisgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisgIGNvbnRleHQtPmNvZGVjX3ByaXYgPSBnX21hbGxvYzAgKGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSk7CisgIGdzdF9idWZmZXJfZXh0cmFjdCAoYnVmLCAwLCBjb250ZXh0LT5jb2RlY19wcml2LCAtMSk7CisKKyAgY29udGV4dC0+Y29kZWNfZGVsYXkgPQorICAgICAgR1NUX1JFQURfVUlOVDE2X0xFICgoZ3VpbnQ4ICopIGNvbnRleHQtPmNvZGVjX3ByaXYgKyAxMCk7CisgIGNvbnRleHQtPmNvZGVjX2RlbGF5ID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAoY29udGV4dC0+Y29kZWNfZGVsYXksIEdTVF9TRUNPTkQsIDQ4MDAwKTsKKyAgY29udGV4dC0+c2Vla19wcmVyb2xsID0gODAgKiBHU1RfTVNFQ09ORDsKKworICByZXR1cm4gVFJVRTsKKworLyogRVJST1JTICovCit3cm9uZ190eXBlOgorICB7CisgICAgR1NUX1dBUk5JTkcgKCJzdHJlYW1oZWFkZXJzIGFyZSBub3QgYSBHU1RfVFlQRV9BUlJBWSwgYnV0IGEgJXMiLAorICAgICAgICBHX1ZBTFVFX1RZUEVfTkFNRSAoc3RyZWFtaGVhZGVyKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ19jb3VudDoKKyAgeworICAgIEdTVF9XQVJOSU5HICgiZ290ICV1IHN0cmVhbWhlYWRlcnMsIG5vdCAxIG9yIDIgYXMgZXhwZWN0ZWQiLCBidWZhcnItPmxlbik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ19jb250ZW50X3R5cGU6CisgIHsKKyAgICBHU1RfV0FSTklORyAoInN0cmVhbWhlYWRlcnMgYXJyYXkgZG9lcyBub3QgY29udGFpbiBHc3RCdWZmZXJzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorb3B1c19tYWtlX2NvZGVjZGF0YSAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0LCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ3VpbnQzMiByYXRlOworICBndWludDggY2hhbm5lbHM7CisgIGd1aW50OCBjaGFubmVsX21hcHBpbmdfZmFtaWx5OworICBndWludDggc3RyZWFtX2NvdW50LCBjb3VwbGVkX2NvdW50LCBjaGFubmVsX21hcHBpbmdbMjU2XTsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdzdE1hcEluZm8gbWFwOworCisgIC8qIE9wdXMgaGVhZGVycyBhcmUgbm90IGluLWJhbmQgKi8KKyAgY29udGV4dC0+eGlwaF9oZWFkZXJzX3RvX3NraXAgPSAwOworCisgIGNvbnRleHQtPmNvZGVjX2RlbGF5ID0gMDsKKyAgY29udGV4dC0+c2Vla19wcmVyb2xsID0gODAgKiBHU1RfTVNFQ09ORDsKKworICBpZiAoIWdzdF9jb2RlY191dGlsc19vcHVzX3BhcnNlX2NhcHMgKGNhcHMsICZyYXRlLCAmY2hhbm5lbHMsCisgICAgICAgICAgJmNoYW5uZWxfbWFwcGluZ19mYW1pbHksICZzdHJlYW1fY291bnQsICZjb3VwbGVkX2NvdW50LAorICAgICAgICAgIGNoYW5uZWxfbWFwcGluZykpIHsKKyAgICBHU1RfV0FSTklORyAoIkZhaWxlZCB0byBwYXJzZSBjYXBzIGZvciBPcHVzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgYnVmZmVyID0KKyAgICAgIGdzdF9jb2RlY191dGlsc19vcHVzX2NyZWF0ZV9oZWFkZXIgKHJhdGUsIGNoYW5uZWxzLAorICAgICAgY2hhbm5lbF9tYXBwaW5nX2ZhbWlseSwgc3RyZWFtX2NvdW50LCBjb3VwbGVkX2NvdW50LCBjaGFubmVsX21hcHBpbmcsIDAsCisgICAgICAwKTsKKyAgaWYgKCFidWZmZXIpIHsKKyAgICBHU1RfV0FSTklORyAoIkZhaWxlZCB0byBjcmVhdGUgT3B1cyBoZWFkZXIgZnJvbSBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplID0gbWFwLnNpemU7CisgIGNvbnRleHQtPmNvZGVjX3ByaXYgPSBnX21hbGxvYyAoY29udGV4dC0+Y29kZWNfcHJpdl9zaXplKTsKKyAgbWVtY3B5IChjb250ZXh0LT5jb2RlY19wcml2LCBtYXAuZGF0YSwgbWFwLnNpemUpOworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX3NldGNhcHM6CisgKiBAcGFkOiBQYWQgd2hpY2ggZ290IHRoZSBjYXBzLgorICogQGNhcHM6IE5ldyBjYXBzLgorICoKKyAqIFNldGNhcHMgZnVuY3Rpb24gZm9yIGF1ZGlvIHNpbmsgcGFkLgorICoKKyAqIFJldHVybnM6ICVUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX211eF9hdWRpb19wYWRfc2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKmNvbnRleHQgPSBOVUxMOworICBHc3RNYXRyb3NrYVRyYWNrQXVkaW9Db250ZXh0ICphdWRpb2NvbnRleHQ7CisgIEdzdE1hdHJvc2thTXV4ICptdXg7CisgIEdzdE1hdHJvc2thUGFkICpjb2xsZWN0X3BhZDsKKyAgY29uc3QgZ2NoYXIgKm1pbWV0eXBlOworICBnaW50IHNhbXBsZXJhdGUgPSAwLCBjaGFubmVscyA9IDA7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBHVmFsdWUgKmNvZGVjX2RhdGEgPSBOVUxMOworICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisgIGNvbnN0IGdjaGFyICpzdHJlYW1fZm9ybWF0ID0gTlVMTDsKKworICBtdXggPSBHU1RfTUFUUk9TS0FfTVVYIChHU1RfUEFEX1BBUkVOVCAocGFkKSk7CisKKyAgLyogZmluZCBjb250ZXh0ICovCisgIGNvbGxlY3RfcGFkID0gKEdzdE1hdHJvc2thUGFkICopIGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgZ19hc3NlcnQgKGNvbGxlY3RfcGFkKTsKKyAgY29udGV4dCA9IGNvbGxlY3RfcGFkLT50cmFjazsKKyAgZ19hc3NlcnQgKGNvbnRleHQpOworICBnX2Fzc2VydCAoY29udGV4dC0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9BVURJTyk7CisgIGF1ZGlvY29udGV4dCA9IChHc3RNYXRyb3NrYVRyYWNrQXVkaW9Db250ZXh0ICopIGNvbnRleHQ7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIG1pbWV0eXBlID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3RydWN0dXJlKTsKKworICAvKiBnZW5lcmFsIHNldHVwICovCisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAicmF0ZSIsICZzYW1wbGVyYXRlKTsKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsICZjaGFubmVscyk7CisKKyAgYXVkaW9jb250ZXh0LT5zYW1wbGVyYXRlID0gc2FtcGxlcmF0ZTsKKyAgYXVkaW9jb250ZXh0LT5jaGFubmVscyA9IGNoYW5uZWxzOworICBhdWRpb2NvbnRleHQtPmJpdGRlcHRoID0gMDsKKyAgY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbiA9IDA7CisKKyAgY29kZWNfZGF0YSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJjb2RlY19kYXRhIik7CisgIGlmIChjb2RlY19kYXRhKQorICAgIGJ1ZiA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyIChjb2RlY19kYXRhKTsKKworICAvKiBUT0RPOiAtIGNoZWNrIGlmIHdlIGhhbmRsZSBhbGwgY29kZWNzIGJ5IHRoZSBzcGVjLCBpLmUuIGNvZGVjIHByaXZhdGUKKyAgICogICAgICAgICBkYXRhIGFuZCBvdGhlciBzZXR0aW5ncworICAgKiAgICAgICAtIGFkZCBuZXcgZm9ybWF0cworICAgKi8KKworICBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJhdWRpby9tcGVnIikpIHsKKyAgICBnaW50IG1wZWd2ZXJzaW9uID0gMDsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAibXBlZ3ZlcnNpb24iLCAmbXBlZ3ZlcnNpb24pOworICAgIHN3aXRjaCAobXBlZ3ZlcnNpb24pIHsKKyAgICAgIGNhc2UgMTp7CisgICAgICAgIGdpbnQgbGF5ZXI7CisgICAgICAgIGdpbnQgdmVyc2lvbiA9IDE7CisgICAgICAgIGdpbnQgc3BmOworCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAibGF5ZXIiLCAmbGF5ZXIpOworCisgICAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJtcGVnYXVkaW92ZXJzaW9uIiwgJnZlcnNpb24pKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsCisgICAgICAgICAgICAgICJVbmFibGUgdG8gZGV0ZXJtaW5lIE1QRUcgYXVkaW8gdmVyc2lvbiwgYXNzdW1pbmcgMSIpOworICAgICAgICAgIHZlcnNpb24gPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxheWVyID09IDEpCisgICAgICAgICAgc3BmID0gMzg0OworICAgICAgICBlbHNlIGlmIChsYXllciA9PSAyKQorICAgICAgICAgIHNwZiA9IDExNTI7CisgICAgICAgIGVsc2UgaWYgKHZlcnNpb24gPT0gMikKKyAgICAgICAgICBzcGYgPSA1NzY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzcGYgPSAxMTUyOworCisgICAgICAgIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24gPQorICAgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChHU1RfU0VDT05ELCBzcGYsIGF1ZGlvY29udGV4dC0+c2FtcGxlcmF0ZSk7CisKKyAgICAgICAgc3dpdGNoIChsYXllcikgeworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LAorICAgICAgICAgICAgICAgIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19NUEVHMV9MMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwKKyAgICAgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fTVBFRzFfTDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgICAgICAgICAgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX01QRUcxX0wzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAyOgorICAgICAgY2FzZSA0OgorICAgICAgICBzdHJlYW1fZm9ybWF0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJzdHJlYW0tZm9ybWF0Iik7CisgICAgICAgIC8qIGNoZWNrIHRoaXMgaXMgcmF3IGFhYyAqLworICAgICAgICBpZiAoc3RyZWFtX2Zvcm1hdCkgeworICAgICAgICAgIGlmIChzdHJjbXAgKHN0cmVhbV9mb3JtYXQsICJyYXciKSAhPSAwKSB7CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgIkFBQyBzdHJlYW0tZm9ybWF0IG11c3QgYmUgJ3JhdycsIG5vdCAlcyIsCisgICAgICAgICAgICAgICAgc3RyZWFtX2Zvcm1hdCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAiQUFDIHN0cmVhbS1mb3JtYXQgbm90IHNwZWNpZmllZCwgIgorICAgICAgICAgICAgICAiYXNzdW1pbmcgJ3JhdyciKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChidWYpIHsKKyAgICAgICAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwKKyAgICAgICAgICAgICAgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX0FBQyk7CisgICAgICAgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKyAgICAgICAgICBjb250ZXh0LT5jb2RlY19wcml2ID0gZ19tYWxsb2MgKGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChidWYsIDAsIGNvbnRleHQtPmNvZGVjX3ByaXYsCisgICAgICAgICAgICAgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAibm8gQUFDIGNvZGVjX2RhdGE7IG5vdCBwYWNrZXRpemVkIik7CisgICAgICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgfQorICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1yYXciKSkgeworICAgIEdzdEF1ZGlvSW5mbyBpbmZvOworCisgICAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoJmluZm8pOworICAgIGlmICghZ3N0X2F1ZGlvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgY2FwcykpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwKKyAgICAgICAgICAiYnJva2VuIGNhcHMsIHJlamVjdGVkIGJ5IGdzdF9hdWRpb19pbmZvX2Zyb21fY2FwcyIpOworICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgICB9CisKKyAgICBzd2l0Y2ggKEdTVF9BVURJT19JTkZPX0ZPUk1BVCAoJmluZm8pKSB7CisgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfVTg6CisgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzE2QkU6CisgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzE2TEU6CisgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzI0QkU6CisgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzI0TEU6CisgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzMyQkU6CisgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzMyTEU6CisgICAgICAgIGlmIChHU1RfQVVESU9fSU5GT19XSURUSCAoJmluZm8pICE9IEdTVF9BVURJT19JTkZPX0RFUFRIICgmaW5mbykpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJ3aWR0aCBtdXN0IGJlIHNhbWUgYXMgZGVwdGghIik7CisgICAgICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgICAgICAgfQorICAgICAgICBpZiAoR1NUX0FVRElPX0lORk9fSVNfQklHX0VORElBTiAoJmluZm8pKQorICAgICAgICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LAorICAgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUENNX0lOVF9CRSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwKKyAgICAgICAgICAgICAgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1BDTV9JTlRfTEUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GMzJMRToKKyAgICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GNjRMRToKKyAgICAgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUENNX0ZMT0FUKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgIndyb25nIGZvcm1hdCBpbiByYXcgYXVkaW8gY2FwcyIpOworICAgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKworICAgIGF1ZGlvY29udGV4dC0+Yml0ZGVwdGggPSBHU1RfQVVESU9fSU5GT19XSURUSCAoJmluZm8pOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC12b3JiaXMiKSkgeworICAgIGNvbnN0IEdWYWx1ZSAqc3RyZWFtaGVhZGVyOworCisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19WT1JCSVMpOworCisgICAgZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKGNvbnRleHQpOworCisgICAgc3RyZWFtaGVhZGVyID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgInN0cmVhbWhlYWRlciIpOworICAgIGlmICghdm9yYmlzX3N0cmVhbWhlYWRlcl90b19jb2RlY2RhdGEgKHN0cmVhbWhlYWRlciwgY29udGV4dCkpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksCisgICAgICAgICAgKCJ2b3JiaXMgc3RyZWFtIGhlYWRlcnMgbWlzc2luZyBvciBtYWxmb3JtZWQiKSk7CisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtZmxhYyIpKSB7CisgICAgY29uc3QgR1ZhbHVlICpzdHJlYW1oZWFkZXI7CisKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX0ZMQUMpOworCisgICAgZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKGNvbnRleHQpOworCisgICAgc3RyZWFtaGVhZGVyID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgInN0cmVhbWhlYWRlciIpOworICAgIGlmICghZmxhY19zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChzdHJlYW1oZWFkZXIsIGNvbnRleHQpKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAobXV4LCBTVFJFQU0sIE1VWCwgKE5VTEwpLAorICAgICAgICAgICgiZmxhYyBzdHJlYW0gaGVhZGVycyBtaXNzaW5nIG9yIG1hbGZvcm1lZCIpKTsKKyAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgfQorICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1zcGVleCIpKSB7CisgICAgY29uc3QgR1ZhbHVlICpzdHJlYW1oZWFkZXI7CisKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1NQRUVYKTsKKyAgICBnc3RfbWF0cm9za2FfbXV4X2ZyZWVfY29kZWNfcHJpdiAoY29udGV4dCk7CisKKyAgICBzdHJlYW1oZWFkZXIgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAic3RyZWFtaGVhZGVyIik7CisgICAgaWYgKCFzcGVleF9zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChzdHJlYW1oZWFkZXIsIGNvbnRleHQpKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAobXV4LCBTVFJFQU0sIE1VWCwgKE5VTEwpLAorICAgICAgICAgICgic3BlZXggc3RyZWFtIGhlYWRlcnMgbWlzc2luZyBvciBtYWxmb3JtZWQiKSk7CisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtb3B1cyIpKSB7CisgICAgY29uc3QgR1ZhbHVlICpzdHJlYW1oZWFkZXI7CisKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX09QVVMpOworCisgICAgc3RyZWFtaGVhZGVyID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgInN0cmVhbWhlYWRlciIpOworICAgIGlmIChzdHJlYW1oZWFkZXIpIHsKKyAgICAgIGdzdF9tYXRyb3NrYV9tdXhfZnJlZV9jb2RlY19wcml2IChjb250ZXh0KTsKKyAgICAgIGlmICghb3B1c19zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChzdHJlYW1oZWFkZXIsIGNvbnRleHQpKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksCisgICAgICAgICAgICAoIm9wdXMgc3RyZWFtIGhlYWRlcnMgbWlzc2luZyBvciBtYWxmb3JtZWQiKSk7CisgICAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIG5vIHN0cmVhbWhlYWRlciwgYnV0IHdlIG5lZWQgdG8gaGF2ZSBvbmUsIHNvIHdlIG1ha2Ugb25lIHVwCisgICAgICAgICBiYXNlZCBvbiBjYXBzICovCisgICAgICBnc3RfbWF0cm9za2FfbXV4X2ZyZWVfY29kZWNfcHJpdiAoY29udGV4dCk7CisgICAgICBpZiAoIW9wdXNfbWFrZV9jb2RlY2RhdGEgKGNvbnRleHQsIGNhcHMpKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdXgsIFNUUkVBTSwgTVVYLCAoTlVMTCksCisgICAgICAgICAgICAoIm9wdXMgc3RyZWFtIGhlYWRlcnMgbWlzc2luZyBvciBtYWxmb3JtZWQiKSk7CisgICAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1hYzMiKSkgeworICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fQUMzKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtZWFjMyIpKSB7CisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19FQUMzKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtZHRzIikpIHsKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX0RUUyk7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJhdWRpby94LXR0YSIpKSB7CisgICAgZ2ludCB3aWR0aDsKKworICAgIC8qIFRUQSBmcmFtZSBkdXJhdGlvbiAqLworICAgIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24gPSAxLjA0NDg5Nzk1OTE4MzY3MzQ2OTM5ICogR1NUX1NFQ09ORDsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAid2lkdGgiLCAmd2lkdGgpOworICAgIGF1ZGlvY29udGV4dC0+Yml0ZGVwdGggPSB3aWR0aDsKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1RUQSk7CisKKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtcG4tcmVhbGF1ZGlvIikpIHsKKyAgICBnaW50IHJhdmVyc2lvbjsKKyAgICBjb25zdCBHVmFsdWUgKm1kcHJfZGF0YTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAicmF2ZXJzaW9uIiwgJnJhdmVyc2lvbik7CisgICAgc3dpdGNoIChyYXZlcnNpb24pIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsCisgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fUkVBTF8xNF80KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LAorICAgICAgICAgICAgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX1JFQUxfMjhfOCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4OgorICAgICAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwKKyAgICAgICAgICAgIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19SRUFMX0NPT0spOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgfQorCisgICAgbWRwcl9kYXRhID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgIm1kcHJfZGF0YSIpOworICAgIGlmIChtZHByX2RhdGEgIT0gTlVMTCkgeworICAgICAgZ3VpbnQ4ICpwcml2X2RhdGEgPSBOVUxMOworICAgICAgZ3VpbnQgcHJpdl9kYXRhX3NpemUgPSAwOworCisgICAgICBHc3RCdWZmZXIgKmNvZGVjX2RhdGFfYnVmID0gZ192YWx1ZV9wZWVrX3BvaW50ZXIgKG1kcHJfZGF0YSk7CisKKyAgICAgIHByaXZfZGF0YV9zaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoY29kZWNfZGF0YV9idWYpOworICAgICAgcHJpdl9kYXRhID0gZ19tYWxsb2MwIChwcml2X2RhdGFfc2l6ZSk7CisKKyAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoY29kZWNfZGF0YV9idWYsIDAsIHByaXZfZGF0YSwgLTEpOworCisgICAgICBnc3RfbWF0cm9za2FfbXV4X2ZyZWVfY29kZWNfcHJpdiAoY29udGV4dCk7CisKKyAgICAgIGNvbnRleHQtPmNvZGVjX3ByaXYgPSBwcml2X2RhdGE7CisgICAgICBjb250ZXh0LT5jb2RlY19wcml2X3NpemUgPSBwcml2X2RhdGFfc2l6ZTsKKyAgICB9CisKKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtd21hIikKKyAgICAgIHx8ICFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1hbGF3IikKKyAgICAgIHx8ICFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1tdWxhdyIpCisgICAgICB8fCAhc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtYWRwY20iKQorICAgICAgfHwgIXN0cmNtcCAobWltZXR5cGUsICJhdWRpby9HNzIyIikpIHsKKyAgICBndWludDggKmNvZGVjX3ByaXY7CisgICAgZ3VpbnQgY29kZWNfcHJpdl9zaXplOworICAgIGd1aW50MTYgZm9ybWF0ID0gMDsKKyAgICBnaW50IGJsb2NrX2FsaWduID0gMDsKKyAgICBnaW50IGJpdHJhdGUgPSAwOworCisgICAgaWYgKHNhbXBsZXJhdGUgPT0gMCB8fCBjaGFubmVscyA9PSAwKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgIk1pc3NpbmcgY2hhbm5lbHMvc2FtcGxlcmF0ZSBvbiBjYXBzIik7CisgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgIH0KKworICAgIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtd21hIikpIHsKKyAgICAgIGdpbnQgd21hdmVyc2lvbjsKKyAgICAgIGdpbnQgZGVwdGg7CisKKyAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJ3bWF2ZXJzaW9uIiwgJndtYXZlcnNpb24pCisgICAgICAgICAgfHwgIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiYmxvY2tfYWxpZ24iLCAmYmxvY2tfYWxpZ24pCisgICAgICAgICAgfHwgIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiYml0cmF0ZSIsICZiaXRyYXRlKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgIk1pc3Npbmcgd21hdmVyc2lvbi9ibG9ja19hbGlnbi9iaXRyYXRlIgorICAgICAgICAgICAgIiBvbiBXTUEgY2FwcyIpOworICAgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKHdtYXZlcnNpb24pIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIGZvcm1hdCA9IEdTVF9SSUZGX1dBVkVfRk9STUFUX1dNQVYxOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgZm9ybWF0ID0gR1NUX1JJRkZfV0FWRV9GT1JNQVRfV01BVjI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICBmb3JtYXQgPSBHU1RfUklGRl9XQVZFX0ZPUk1BVF9XTUFWMzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgIlVuZXhwZWN0ZWQgV01BIHZlcnNpb246ICVkIiwgd21hdmVyc2lvbik7CisgICAgICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgICAgIH0KKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiZGVwdGgiLCAmZGVwdGgpKQorICAgICAgICBhdWRpb2NvbnRleHQtPmJpdGRlcHRoID0gZGVwdGg7CisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtYWxhdyIpCisgICAgICAgIHx8ICFzdHJjbXAgKG1pbWV0eXBlLCAiYXVkaW8veC1tdWxhdyIpKSB7CisgICAgICBhdWRpb2NvbnRleHQtPmJpdGRlcHRoID0gODsKKyAgICAgIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtYWxhdyIpKQorICAgICAgICBmb3JtYXQgPSBHU1RfUklGRl9XQVZFX0ZPUk1BVF9BTEFXOworICAgICAgZWxzZQorICAgICAgICBmb3JtYXQgPSBHU1RfUklGRl9XQVZFX0ZPUk1BVF9NVUxBVzsKKworICAgICAgYmxvY2tfYWxpZ24gPSBjaGFubmVsczsKKyAgICAgIGJpdHJhdGUgPSBibG9ja19hbGlnbiAqIHNhbXBsZXJhdGU7CisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL3gtYWRwY20iKSkgeworICAgICAgY29uc3QgY2hhciAqbGF5b3V0OworCisgICAgICBsYXlvdXQgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImxheW91dCIpOworICAgICAgaWYgKCFsYXlvdXQpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsICJNaXNzaW5nIGxheW91dCBvbiBhZHBjbSBjYXBzIik7CisgICAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgICB9CisKKyAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJibG9ja19hbGlnbiIsICZibG9ja19hbGlnbikpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsICJNaXNzaW5nIGJsb2NrX2FsaWduIG9uIGFkcGNtIGNhcHMiKTsKKyAgICAgICAgZ290byByZWZ1c2VfY2FwczsKKyAgICAgIH0KKworICAgICAgaWYgKCFzdHJjbXAgKGxheW91dCwgImR2aSIpKSB7CisgICAgICAgIGZvcm1hdCA9IEdTVF9SSUZGX1dBVkVfRk9STUFUX0RWSV9BRFBDTTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAobGF5b3V0LCAiZzcyNiIpKSB7CisgICAgICAgIGZvcm1hdCA9IEdTVF9SSUZGX1dBVkVfRk9STUFUX0lUVV9HNzI2X0FEUENNOworICAgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiYml0cmF0ZSIsICZiaXRyYXRlKSkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAiTWlzc2luZyBiaXRyYXRlIG9uIGFkcGNtIGc3MjYgY2FwcyIpOworICAgICAgICAgIGdvdG8gcmVmdXNlX2NhcHM7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAiVW5rbm93biBsYXlvdXQgb24gYWRwY20gY2FwcyIpOworICAgICAgICBnb3RvIHJlZnVzZV9jYXBzOworICAgICAgfQorCisgICAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImF1ZGlvL0c3MjIiKSkgeworICAgICAgZm9ybWF0ID0gR1NUX1JJRkZfV0FWRV9GT1JNQVRfQURQQ01fRzcyMjsKKyAgICB9CisgICAgZ19hc3NlcnQgKGZvcm1hdCAhPSAwKTsKKworICAgIGNvZGVjX3ByaXZfc2l6ZSA9IFdBVkVGT1JNQVRFWF9TSVpFOworICAgIGlmIChidWYpCisgICAgICBjb2RlY19wcml2X3NpemUgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKworICAgIC8qIHNlcmlhbGl6ZSB3YXZlZm9ybWF0ZXggc3RydWN0dXJlICovCisgICAgY29kZWNfcHJpdiA9IGdfbWFsbG9jMCAoY29kZWNfcHJpdl9zaXplKTsKKyAgICBHU1RfV1JJVEVfVUlOVDE2X0xFIChjb2RlY19wcml2LCBmb3JtYXQpOworICAgIEdTVF9XUklURV9VSU5UMTZfTEUgKGNvZGVjX3ByaXYgKyAyLCBjaGFubmVscyk7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoY29kZWNfcHJpdiArIDQsIHNhbXBsZXJhdGUpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGNvZGVjX3ByaXYgKyA4LCBiaXRyYXRlIC8gOCk7CisgICAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoY29kZWNfcHJpdiArIDEyLCBibG9ja19hbGlnbik7CisgICAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoY29kZWNfcHJpdiArIDE0LCAwKTsKKyAgICBpZiAoYnVmKQorICAgICAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoY29kZWNfcHJpdiArIDE2LCBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpKTsKKyAgICBlbHNlCisgICAgICBHU1RfV1JJVEVfVUlOVDE2X0xFIChjb2RlY19wcml2ICsgMTYsIDApOworCisgICAgLyogcHJvY2VzcyBjb2RlYyBwcml2YXRlL2luaXRpYWxpemF0aW9uIGRhdGEsIGlmIGFueSAqLworICAgIGlmIChidWYpIHsKKyAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoYnVmLCAwLAorICAgICAgICAgIChndWludDggKikgY29kZWNfcHJpdiArIFdBVkVGT1JNQVRFWF9TSVpFLCAtMSk7CisgICAgfQorCisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9BVURJT19BQ00pOworICAgIGdzdF9tYXRyb3NrYV9tdXhfZnJlZV9jb2RlY19wcml2IChjb250ZXh0KTsKKyAgICBjb250ZXh0LT5jb2RlY19wcml2ID0gKGdwb2ludGVyKSBjb2RlY19wcml2OworICAgIGNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSA9IGNvZGVjX3ByaXZfc2l6ZTsKKyAgfQorCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworcmVmdXNlX2NhcHM6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgInBhZCAlcyByZWZ1c2VkIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgIEdTVF9QQURfTkFNRSAocGFkKSwgY2Fwcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIHdlIHByb2JhYmx5IGRvbid0IGhhdmUgdGhlIGRhdGEgYXQgc3RhcnQsCisgKiBzbyBoYXZlIHRvIHJlc2VydmUgKGEgbWF4aW11bSkgc3BhY2UgdG8gd3JpdGUgdGhpcyBhdCB0aGUgZW5kLgorICogYml0IHNwYWN5LCBidXQgc29tZSBmb3JtYXRzIGNhbiBob2xkIHF1aXRlIHNvbWUgKi8KKyNkZWZpbmUgU1VCVElUTEVfTUFYX0NPREVDX1BSSVZBVEUgICAyMDQ4ICAgICAgIC8qIG11c3QgYmUgPiAxMjggKi8KKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X3N1YnRpdGxlX3BhZF9zZXRjYXBzOgorICogQHBhZDogUGFkIHdoaWNoIGdvdCB0aGUgY2Fwcy4KKyAqIEBjYXBzOiBOZXcgY2Fwcy4KKyAqCisgKiBTZXRjYXBzIGZ1bmN0aW9uIGZvciBzdWJ0aXRsZSBzaW5rIHBhZC4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9tdXhfc3VidGl0bGVfcGFkX3NldGNhcHMgKEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIC8qIFRoZXJlIGlzIG5vdyAoYXQgbGVhc3QpIG9uZSBzdWNoIGFsZW1lbnQgKGthdGVlbmMpLCBhbmQgSSdtIGdvaW5nCisgICAgIHRvIGhhbmRsZSBpdCBoZXJlIGFuZCBjbGFpbSBpdCB3b3JrcyB3aGVuIGl0IGNhbiBiZSBwaXBlZCBiYWNrCisgICAgIHRocm91Z2ggR1N0cmVhbWVyIGFuZCBWTEMgKi8KKworICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqY29udGV4dCA9IE5VTEw7CisgIEdzdE1hdHJvc2thVHJhY2tTdWJ0aXRsZUNvbnRleHQgKnNjb250ZXh0OworICBHc3RNYXRyb3NrYU11eCAqbXV4OworICBHc3RNYXRyb3NrYVBhZCAqY29sbGVjdF9wYWQ7CisgIGNvbnN0IGdjaGFyICptaW1ldHlwZTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IEdWYWx1ZSAqdmFsdWUgPSBOVUxMOworICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgbXV4ID0gR1NUX01BVFJPU0tBX01VWCAoR1NUX1BBRF9QQVJFTlQgKHBhZCkpOworCisgIC8qIGZpbmQgY29udGV4dCAqLworICBjb2xsZWN0X3BhZCA9IChHc3RNYXRyb3NrYVBhZCAqKSBnc3RfcGFkX2dldF9lbGVtZW50X3ByaXZhdGUgKHBhZCk7CisgIGdfYXNzZXJ0IChjb2xsZWN0X3BhZCk7CisgIGNvbnRleHQgPSBjb2xsZWN0X3BhZC0+dHJhY2s7CisgIGdfYXNzZXJ0IChjb250ZXh0KTsKKyAgZ19hc3NlcnQgKGNvbnRleHQtPnR5cGUgPT0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfU1VCVElUTEUpOworICBzY29udGV4dCA9IChHc3RNYXRyb3NrYVRyYWNrU3VidGl0bGVDb250ZXh0ICopIGNvbnRleHQ7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIG1pbWV0eXBlID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3RydWN0dXJlKTsKKworICAvKiBnZW5lcmFsIHNldHVwICovCisgIHNjb250ZXh0LT5jaGVja191dGY4ID0gMTsKKyAgc2NvbnRleHQtPmludmFsaWRfdXRmOCA9IDA7CisgIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24gPSAwOworCisgIGlmICghc3RyY21wIChtaW1ldHlwZSwgInN1YnRpdGxlL3gta2F0ZSIpKSB7CisgICAgY29uc3QgR1ZhbHVlICpzdHJlYW1oZWFkZXI7CisKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwKKyAgICAgICAgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX0tBVEUpOworCisgICAgZ3N0X21hdHJvc2thX211eF9mcmVlX2NvZGVjX3ByaXYgKGNvbnRleHQpOworCisgICAgc3RyZWFtaGVhZGVyID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgInN0cmVhbWhlYWRlciIpOworICAgIGlmICgha2F0ZV9zdHJlYW1oZWFkZXJfdG9fY29kZWNkYXRhIChzdHJlYW1oZWFkZXIsIGNvbnRleHQpKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAobXV4LCBTVFJFQU0sIE1VWCwgKE5VTEwpLAorICAgICAgICAgICgia2F0ZSBzdHJlYW0gaGVhZGVycyBtaXNzaW5nIG9yIG1hbGZvcm1lZCIpKTsKKyAgICAgIHJldCA9IEZBTFNFOworICAgICAgZ290byBleGl0OworICAgIH0KKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgInRleHQveC1yYXciKSkgeworICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LAorICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfVVRGOCk7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJhcHBsaWNhdGlvbi94LXNzYSIpKSB7CisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbnRleHQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9TVUJUSVRMRV9TU0EpOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKG1pbWV0eXBlLCAiYXBwbGljYXRpb24veC1hc3MiKSkgeworICAgIGdzdF9tYXRyb3NrYV9tdXhfc2V0X2NvZGVjX2lkIChjb250ZXh0LCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfU1VCVElUTEVfQVNTKTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChtaW1ldHlwZSwgImFwcGxpY2F0aW9uL3gtdXNmIikpIHsKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX1VTRik7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWltZXR5cGUsICJzdWJwaWN0dXJlL3gtZHZkIikpIHsKKyAgICBnc3RfbWF0cm9za2FfbXV4X3NldF9jb2RlY19pZCAoY29udGV4dCwKKyAgICAgICAgR1NUX01BVFJPU0tBX0NPREVDX0lEX1NVQlRJVExFX1ZPQlNVQik7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gRkFMU0U7CisgICAgZ290byBleGl0OworICB9CisKKyAgLyogbWF5YmUgc29tZSBwcml2YXRlIGRhdGEsIGUuZy4gdm9ic3ViICovCisgIHZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImNvZGVjX2RhdGEiKTsKKyAgaWYgKHZhbHVlKQorICAgIGJ1ZiA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyICh2YWx1ZSk7CisgIGlmIChidWYgIT0gTlVMTCkgeworICAgIEdzdE1hcEluZm8gbWFwOworICAgIGd1aW50OCAqcHJpdl9kYXRhID0gTlVMTDsKKworICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgICBpZiAobWFwLnNpemUgPiBTVUJUSVRMRV9NQVhfQ09ERUNfUFJJVkFURSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsICJwYWQgJSIgR1NUX1BUUl9GT1JNQVQgIiBzdWJ0aXRsZSBwcml2YXRlIGRhdGEiCisgICAgICAgICAgIiBleGNlZWRlZCBtYXhpbXVtICglZCk7IGRpc2NhcmRpbmciLCBwYWQsCisgICAgICAgICAgU1VCVElUTEVfTUFYX0NPREVDX1BSSVZBVEUpOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIGdzdF9tYXRyb3NrYV9tdXhfZnJlZV9jb2RlY19wcml2IChjb250ZXh0KTsKKworICAgIHByaXZfZGF0YSA9IGdfbWFsbG9jMCAobWFwLnNpemUpOworICAgIG1lbWNweSAocHJpdl9kYXRhLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAgIGNvbnRleHQtPmNvZGVjX3ByaXYgPSBwcml2X2RhdGE7CisgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplID0gbWFwLnNpemU7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgImNvZGVjX2lkICVzLCBjb2RlYyBkYXRhIHNpemUgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICBHU1RfU1RSX05VTEwgKGNvbnRleHQtPmNvZGVjX2lkKSwgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplKTsKKworZXhpdDoKKworICByZXR1cm4gcmV0OworfQorCisKKy8qKgorICogZ3N0X21hdHJvc2thX211eF9yZXF1ZXN0X25ld19wYWQ6CisgKiBAZWxlbWVudDogI0dzdE1hdHJvc2thTXV4LgorICogQHRlbXBsOiAjR3N0UGFkVGVtcGxhdGUuCisgKiBAcGFkX25hbWU6IE5ldyBwYWQgbmFtZS4KKyAqCisgKiBSZXF1ZXN0IHBhZCBmdW5jdGlvbiBmb3Igc2luayB0ZW1wbGF0ZXMuCisgKgorICogUmV0dXJuczogTmV3ICNHc3RQYWQuCisgKi8KK3N0YXRpYyBHc3RQYWQgKgorZ3N0X21hdHJvc2thX211eF9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogcmVxX25hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChlbGVtZW50KTsKKyAgR3N0TWF0cm9za2FNdXggKm11eCA9IEdTVF9NQVRST1NLQV9NVVggKGVsZW1lbnQpOworICBHc3RNYXRyb3NrYVBhZCAqY29sbGVjdF9wYWQ7CisgIEdzdE1hdHJvc2thbXV4UGFkICpuZXdwYWQ7CisgIGdjaGFyICpuYW1lID0gTlVMTDsKKyAgY29uc3QgZ2NoYXIgKnBhZF9uYW1lID0gTlVMTDsKKyAgR3N0TWF0cm9za2FDYXBzRnVuYyBjYXBzZnVuYyA9IE5VTEw7CisgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0ID0gTlVMTDsKKyAgZ2ludCBwYWRfaWQ7CisgIGdib29sZWFuIGxvY2tlZCA9IFRSVUU7CisgIGNvbnN0IGdjaGFyICppZCA9IE5VTEw7CisKKyAgaWYgKHRlbXBsID09IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLCAiYXVkaW9fJXUiKSkgeworICAgIC8qIGRvbid0IG1peCBuYW1lZCBhbmQgdW5uYW1lZCBwYWRzLCBpZiB0aGUgcGFkIGFscmVhZHkgZXhpc3RzIHdlIGZhaWwgd2hlbgorICAgICAqIHRyeWluZyB0byBhZGQgaXQgKi8KKyAgICBpZiAocmVxX25hbWUgIT0gTlVMTCAmJiBzc2NhbmYgKHJlcV9uYW1lLCAiYXVkaW9fJXUiLCAmcGFkX2lkKSA9PSAxKSB7CisgICAgICBwYWRfbmFtZSA9IHJlcV9uYW1lOworICAgIH0gZWxzZSB7CisgICAgICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgiYXVkaW9fJXUiLCBtdXgtPm51bV9hX3N0cmVhbXMrKyk7CisgICAgICBwYWRfbmFtZSA9IG5hbWU7CisgICAgfQorICAgIGNhcHNmdW5jID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9tdXhfYXVkaW9fcGFkX3NldGNhcHMpOworICAgIGNvbnRleHQgPSAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKikKKyAgICAgICAgZ19uZXcwIChHc3RNYXRyb3NrYVRyYWNrQXVkaW9Db250ZXh0LCAxKTsKKyAgICBjb250ZXh0LT50eXBlID0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQVVESU87CisgICAgY29udGV4dC0+bmFtZSA9IGdfc3RyZHVwICgiQXVkaW8iKTsKKyAgfSBlbHNlIGlmICh0ZW1wbCA9PSBnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywgInZpZGVvXyV1IikpIHsKKyAgICAvKiBkb24ndCBtaXggbmFtZWQgYW5kIHVubmFtZWQgcGFkcywgaWYgdGhlIHBhZCBhbHJlYWR5IGV4aXN0cyB3ZSBmYWlsIHdoZW4KKyAgICAgKiB0cnlpbmcgdG8gYWRkIGl0ICovCisgICAgaWYgKHJlcV9uYW1lICE9IE5VTEwgJiYgc3NjYW5mIChyZXFfbmFtZSwgInZpZGVvXyV1IiwgJnBhZF9pZCkgPT0gMSkgeworICAgICAgcGFkX25hbWUgPSByZXFfbmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInZpZGVvXyV1IiwgbXV4LT5udW1fdl9zdHJlYW1zKyspOworICAgICAgcGFkX25hbWUgPSBuYW1lOworICAgIH0KKyAgICBjYXBzZnVuYyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbWF0cm9za2FfbXV4X3ZpZGVvX3BhZF9zZXRjYXBzKTsKKyAgICBjb250ZXh0ID0gKEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICopCisgICAgICAgIGdfbmV3MCAoR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCwgMSk7CisgICAgY29udGV4dC0+dHlwZSA9IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1ZJREVPOworICAgIGNvbnRleHQtPm5hbWUgPSBnX3N0cmR1cCAoIlZpZGVvIik7CisgIH0gZWxzZSBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJzdWJ0aXRsZV8ldSIpKSB7CisgICAgLyogZG9uJ3QgbWl4IG5hbWVkIGFuZCB1bm5hbWVkIHBhZHMsIGlmIHRoZSBwYWQgYWxyZWFkeSBleGlzdHMgd2UgZmFpbCB3aGVuCisgICAgICogdHJ5aW5nIHRvIGFkZCBpdCAqLworICAgIGlmIChyZXFfbmFtZSAhPSBOVUxMICYmIHNzY2FuZiAocmVxX25hbWUsICJzdWJ0aXRsZV8ldSIsICZwYWRfaWQpID09IDEpIHsKKyAgICAgIHBhZF9uYW1lID0gcmVxX25hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzdWJ0aXRsZV8ldSIsIG11eC0+bnVtX3Rfc3RyZWFtcysrKTsKKyAgICAgIHBhZF9uYW1lID0gbmFtZTsKKyAgICB9CisgICAgY2Fwc2Z1bmMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX211eF9zdWJ0aXRsZV9wYWRfc2V0Y2Fwcyk7CisgICAgY29udGV4dCA9IChHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqKQorICAgICAgICBnX25ldzAgKEdzdE1hdHJvc2thVHJhY2tTdWJ0aXRsZUNvbnRleHQsIDEpOworICAgIGNvbnRleHQtPnR5cGUgPSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRTsKKyAgICBjb250ZXh0LT5uYW1lID0gZ19zdHJkdXAgKCJTdWJ0aXRsZSIpOworICAgIC8qIHNldGNhcHMgbWF5IG9ubHkgcHJvdmlkZSBwcm9wZXIgb25lIGEgbG90IGxhdGVyICovCisgICAgaWQgPSAiU19TVUJfVU5LTk9XTiI7CisgICAgbG9ja2VkID0gRkFMU0U7CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsICJUaGlzIGlzIG5vdCBvdXIgdGVtcGxhdGUhIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBuZXdwYWQgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX01BVFJPU0tBTVVYX1BBRCwKKyAgICAgICJuYW1lIiwgcGFkX25hbWUsICJkaXJlY3Rpb24iLCB0ZW1wbC0+ZGlyZWN0aW9uLCAidGVtcGxhdGUiLCB0ZW1wbCwgTlVMTCk7CisKKyAgZ3N0X21hdHJvc2thbXV4X3BhZF9pbml0IChuZXdwYWQpOworICBjb2xsZWN0X3BhZCA9IChHc3RNYXRyb3NrYVBhZCAqKQorICAgICAgZ3N0X2NvbGxlY3RfcGFkc19hZGRfcGFkIChtdXgtPmNvbGxlY3QsIEdTVF9QQUQgKG5ld3BhZCksCisgICAgICBzaXplb2YgKEdzdE1hdHJvc2thbXV4UGFkKSwKKyAgICAgIChHc3RDb2xsZWN0RGF0YURlc3Ryb3lOb3RpZnkpIGdzdF9tYXRyb3NrYV9wYWRfZnJlZSwgbG9ja2VkKTsKKworICBjb2xsZWN0X3BhZC0+bXV4ID0gbXV4OworICBjb2xsZWN0X3BhZC0+dHJhY2sgPSBjb250ZXh0OworICBnc3RfbWF0cm9za2FfcGFkX3Jlc2V0IChjb2xsZWN0X3BhZCwgRkFMU0UpOworICBpZiAoaWQpCisgICAgZ3N0X21hdHJvc2thX211eF9zZXRfY29kZWNfaWQgKGNvbGxlY3RfcGFkLT50cmFjaywgaWQpOworICBjb2xsZWN0X3BhZC0+dHJhY2stPmR0c19vbmx5ID0gRkFMU0U7CisKKyAgY29sbGVjdF9wYWQtPmNhcHNmdW5jID0gY2Fwc2Z1bmM7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoR1NUX1BBRCAobmV3cGFkKSwgVFJVRSk7CisgIGlmICghZ3N0X2VsZW1lbnRfYWRkX3BhZCAoZWxlbWVudCwgR1NUX1BBRCAobmV3cGFkKSkpCisgICAgZ290byBwYWRfYWRkX2ZhaWxlZDsKKworICBnX2ZyZWUgKG5hbWUpOworCisgIG11eC0+bnVtX3N0cmVhbXMrKzsKKworICBHU1RfREVCVUdfT0JKRUNUIChuZXdwYWQsICJBZGRlZCBuZXcgcmVxdWVzdCBwYWQiKTsKKworICByZXR1cm4gR1NUX1BBRCAobmV3cGFkKTsKKworICAvKiBFUlJPUiBjYXNlcyAqLworcGFkX2FkZF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgIkFkZGluZyB0aGUgbmV3IHBhZCAnJXMnIGZhaWxlZCIsIHBhZF9uYW1lKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKG5ld3BhZCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X3JlbGVhc2VfcGFkOgorICogQGVsZW1lbnQ6ICNHc3RNYXRyb3NrYU11eC4KKyAqIEBwYWQ6IFBhZCB0byByZWxlYXNlLgorICoKKyAqIFJlbGVhc2UgYSBwcmV2aW91c2x5IHJlcXVlc3RlZCBwYWQuCisqLworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9tdXhfcmVsZWFzZV9wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWQgKiBwYWQpCit7CisgIEdzdE1hdHJvc2thTXV4ICptdXg7CisgIEdTTGlzdCAqd2FsazsKKworICBtdXggPSBHU1RfTUFUUk9TS0FfTVVYIChHU1RfUEFEX1BBUkVOVCAocGFkKSk7CisKKyAgZm9yICh3YWxrID0gbXV4LT5jb2xsZWN0LT5kYXRhOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdENvbGxlY3REYXRhICpjZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSB3YWxrLT5kYXRhOworICAgIEdzdE1hdHJvc2thUGFkICpjb2xsZWN0X3BhZCA9IChHc3RNYXRyb3NrYVBhZCAqKSBjZGF0YTsKKworICAgIGlmIChjZGF0YS0+cGFkID09IHBhZCkgeworICAgICAgLyoKKyAgICAgICAqIG9ic2VydmVkIGR1cmF0aW9uLCB0aGlzIHdpbGwgcmVtYWluIEdTVF9DTE9DS19USU1FX05PTkUKKyAgICAgICAqIG9ubHkgaWYgdGhlIHBhZCBpcyByZXNldHRlZCAKKyAgICAgICAqLworICAgICAgR3N0Q2xvY2tUaW1lIGNvbGxlY3RlZF9kdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoY29sbGVjdF9wYWQtPnN0YXJ0X3RzKSAmJgorICAgICAgICAgIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChjb2xsZWN0X3BhZC0+ZW5kX3RzKSkgeworICAgICAgICBjb2xsZWN0ZWRfZHVyYXRpb24gPQorICAgICAgICAgICAgR1NUX0NMT0NLX0RJRkYgKGNvbGxlY3RfcGFkLT5zdGFydF90cywgY29sbGVjdF9wYWQtPmVuZF90cyk7CisgICAgICB9CisKKyAgICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoY29sbGVjdGVkX2R1cmF0aW9uKQorICAgICAgICAgICYmIG11eC0+ZHVyYXRpb24gPCBjb2xsZWN0ZWRfZHVyYXRpb24pCisgICAgICAgIG11eC0+ZHVyYXRpb24gPSBjb2xsZWN0ZWRfZHVyYXRpb247CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGdzdF9jb2xsZWN0X3BhZHNfcmVtb3ZlX3BhZCAobXV4LT5jb2xsZWN0LCBwYWQpOworICBpZiAoZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoZWxlbWVudCwgcGFkKSkKKyAgICBtdXgtPm51bV9zdHJlYW1zLS07Cit9CisKKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X3RyYWNrX2hlYWRlcjoKKyAqIEBtdXg6ICNHc3RNYXRyb3NrYU11eAorICogQGNvbnRleHQ6IFRhY2sgY29udGV4dC4KKyAqCisgKiBXcml0ZSBhIHRyYWNrIGhlYWRlci4KKyAqLworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9tdXhfdHJhY2tfaGVhZGVyIChHc3RNYXRyb3NrYU11eCAqIG11eCwKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIGNvbnRleHQpCit7CisgIEdzdEVibWxXcml0ZSAqZWJtbCA9IG11eC0+ZWJtbF93cml0ZTsKKyAgZ3VpbnQ2NCBtYXN0ZXI7CisKKyAgLyogVE9ETzogY2hlY2sgaWYgZXZlcnl0aGluZyBuZWNlc3NhcnkgaXMgd3JpdHRlbiBhbmQgY2hlY2sgZGVmYXVsdCB2YWx1ZXMgKi8KKworICAvKiB0cmFjayB0eXBlIGdvZXMgYmVmb3JlIHRoZSB0eXBlLXNwZWNpZmljIHN0dWZmICovCisgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UUkFDS05VTUJFUiwgY29udGV4dC0+bnVtKTsKKyAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RSQUNLVFlQRSwgY29udGV4dC0+dHlwZSk7CisKKyAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RSQUNLVUlELCBjb250ZXh0LT51aWQpOworICBpZiAoY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbikgeworICAgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UUkFDS0RFRkFVTFREVVJBVElPTiwKKyAgICAgICAgY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbik7CisgIH0KKyAgaWYgKGNvbnRleHQtPmxhbmd1YWdlKSB7CisgICAgZ3N0X2VibWxfd3JpdGVfdXRmOCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RSQUNLTEFOR1VBR0UsCisgICAgICAgIGNvbnRleHQtPmxhbmd1YWdlKTsKKyAgfQorCisgIC8qIEZJWE1FOiB1bnRpbCB3ZSBoYXZlIGEgbmljZSB3YXkgb2YgZ2V0dGluZyB0aGUgY29kZWNuYW1lCisgICAqIG91dCBvZiB0aGUgY2FwcywgSSdtIG5vdCBnb2luZyB0byBlbmFibGUgdGhpcy4gVG9vIG11Y2gKKyAgICogKHVzZWxlc3MsIGRvdWJsZSwgYm9yaW5nKSB3b3JrLi4uICovCisgIC8qIFRPRE86IFVzZSB2YWx1ZSBmcm9tIHRhZ3MgaWYgYW55ICovCisgIC8qZ3N0X2VibWxfd3JpdGVfdXRmOCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0NPREVDTkFNRSwKKyAgICAgY29udGV4dC0+Y29kZWNfbmFtZSk7ICovCisgIGdzdF9lYm1sX3dyaXRlX3V0ZjggKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UUkFDS05BTUUsIGNvbnRleHQtPm5hbWUpOworCisgIC8qIHR5cGUtc3BlY2lmaWMgc3R1ZmYgKi8KKyAgc3dpdGNoIChjb250ZXh0LT50eXBlKSB7CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9WSURFTzp7CisgICAgICBHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICp2aWRlb2NvbnRleHQgPQorICAgICAgICAgIChHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICopIGNvbnRleHQ7CisKKyAgICAgIG1hc3RlciA9IGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RSQUNLVklERU8pOworICAgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1ZJREVPUElYRUxXSURUSCwKKyAgICAgICAgICB2aWRlb2NvbnRleHQtPnBpeGVsX3dpZHRoKTsKKyAgICAgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9WSURFT1BJWEVMSEVJR0hULAorICAgICAgICAgIHZpZGVvY29udGV4dC0+cGl4ZWxfaGVpZ2h0KTsKKyAgICAgIGlmICh2aWRlb2NvbnRleHQtPmRpc3BsYXlfd2lkdGggJiYgdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCkgeworICAgICAgICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfVklERU9ESVNQTEFZV0lEVEgsCisgICAgICAgICAgICB2aWRlb2NvbnRleHQtPmRpc3BsYXlfd2lkdGgpOworICAgICAgICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfVklERU9ESVNQTEFZSEVJR0hULAorICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5kaXNwbGF5X2hlaWdodCk7CisgICAgICB9CisgICAgICBpZiAoY29udGV4dC0+ZmxhZ3MgJiBHU1RfTUFUUk9TS0FfVklERU9UUkFDS19JTlRFUkxBQ0VEKQorICAgICAgICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfVklERU9GTEFHSU5URVJMQUNFRCwgMSk7CisgICAgICBpZiAodmlkZW9jb250ZXh0LT5mb3VyY2MpIHsKKyAgICAgICAgZ3VpbnQzMiBmY2NfbGUgPSBHVUlOVDMyX1RPX0xFICh2aWRlb2NvbnRleHQtPmZvdXJjYyk7CisKKyAgICAgICAgZ3N0X2VibWxfd3JpdGVfYmluYXJ5IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfVklERU9DT0xPVVJTUEFDRSwKKyAgICAgICAgICAgIChncG9pbnRlcikgJiBmY2NfbGUsIDQpOworICAgICAgfQorICAgICAgaWYgKHZpZGVvY29udGV4dC0+bXVsdGl2aWV3X21vZGUgIT0gR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX05PTkUpIHsKKyAgICAgICAgZ3VpbnQ2NCBzdGVyZW9fbW9kZSA9IDA7CisKKyAgICAgICAgc3dpdGNoICh2aWRlb2NvbnRleHQtPm11bHRpdmlld19tb2RlKSB7CisgICAgICAgICAgY2FzZSBHU1RfVklERU9fTVVMVElWSUVXX01PREVfTU9OTzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX1NJREVfQllfU0lERToKKyAgICAgICAgICAgIGlmICh2aWRlb2NvbnRleHQtPm11bHRpdmlld19mbGFncyAmCisgICAgICAgICAgICAgICAgR1NUX1ZJREVPX01VTFRJVklFV19GTEFHU19SSUdIVF9WSUVXX0ZJUlNUKQorICAgICAgICAgICAgICBzdGVyZW9fbW9kZSA9IEdTVF9NQVRST1NLQV9TVEVSRU9fTU9ERV9TQlNfUkw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHN0ZXJlb19tb2RlID0gR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX1NCU19MUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX01VTFRJVklFV19NT0RFX1RPUF9CT1RUT006CisgICAgICAgICAgICBpZiAodmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfZmxhZ3MgJgorICAgICAgICAgICAgICAgIEdTVF9WSURFT19NVUxUSVZJRVdfRkxBR1NfUklHSFRfVklFV19GSVJTVCkKKyAgICAgICAgICAgICAgc3RlcmVvX21vZGUgPSBHU1RfTUFUUk9TS0FfU1RFUkVPX01PREVfVEJfUkw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHN0ZXJlb19tb2RlID0gR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX1RCX0xSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHU1RfVklERU9fTVVMVElWSUVXX01PREVfQ0hFQ0tFUkJPQVJEOgorICAgICAgICAgICAgaWYgKHZpZGVvY29udGV4dC0+bXVsdGl2aWV3X2ZsYWdzICYKKyAgICAgICAgICAgICAgICBHU1RfVklERU9fTVVMVElWSUVXX0ZMQUdTX1JJR0hUX1ZJRVdfRklSU1QpCisgICAgICAgICAgICAgIHN0ZXJlb19tb2RlID0gR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX0NIRUNLRVJfUkw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHN0ZXJlb19tb2RlID0gR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX0NIRUNLRVJfTFI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9WSURFT19NVUxUSVZJRVdfTU9ERV9GUkFNRV9CWV9GUkFNRToKKyAgICAgICAgICAgIGlmICh2aWRlb2NvbnRleHQtPm11bHRpdmlld19mbGFncyAmCisgICAgICAgICAgICAgICAgR1NUX1ZJREVPX01VTFRJVklFV19GTEFHU19SSUdIVF9WSUVXX0ZJUlNUKQorICAgICAgICAgICAgICBzdGVyZW9fbW9kZSA9IEdTVF9NQVRST1NLQV9TVEVSRU9fTU9ERV9GQkZfUkw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHN0ZXJlb19tb2RlID0gR1NUX01BVFJPU0tBX1NURVJFT19NT0RFX0ZCRl9MUjsKKyAgICAgICAgICAgIC8qIEZJWE1FOiBJbiBmcmFtZS1ieS1mcmFtZSBtb2RlLCBsZWZ0L3JpZ2h0IGZyYW1lIGJ1ZmZlcnMgbmVlZCB0byBiZQorICAgICAgICAgICAgICogbGFjZWQgd2l0aGluIG9uZSBibG9jay4gU2VlIGh0dHA6Ly93d3cubWF0cm9za2Eub3JnL3RlY2huaWNhbC9zcGVjcy9pbmRleC5odG1sI1N0ZXJlb01vZGUgKi8KKyAgICAgICAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKG11eCwKKyAgICAgICAgICAgICAgICAiRnJhbWUtYnktZnJhbWUgc3RlcmVvc2NvcGljIG1vZGUgbm90IGZ1bGx5IGltcGxlbWVudGVkIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtdXgsCisgICAgICAgICAgICAgICAgIk11bHRpdmlldyBtb2RlICVkIG5vdCBzdXBwb3J0ZWQgaW4gTWF0cm9za2EvV2ViTSIsCisgICAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5tdWx0aXZpZXdfbW9kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGVyZW9fbW9kZSAhPSAwKQorICAgICAgICAgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9WSURFT1NURVJFT01PREUsCisgICAgICAgICAgICAgIHN0ZXJlb19tb2RlKTsKKyAgICAgIH0KKyAgICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIG1hc3Rlcik7CisKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQVVESU86eworICAgICAgR3N0TWF0cm9za2FUcmFja0F1ZGlvQ29udGV4dCAqYXVkaW9jb250ZXh0ID0KKyAgICAgICAgICAoR3N0TWF0cm9za2FUcmFja0F1ZGlvQ29udGV4dCAqKSBjb250ZXh0OworCisgICAgICBtYXN0ZXIgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UUkFDS0FVRElPKTsKKyAgICAgIGlmIChhdWRpb2NvbnRleHQtPnNhbXBsZXJhdGUgIT0gODAwMCkKKyAgICAgICAgZ3N0X2VibWxfd3JpdGVfZmxvYXQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9BVURJT1NBTVBMSU5HRlJFUSwKKyAgICAgICAgICAgIGF1ZGlvY29udGV4dC0+c2FtcGxlcmF0ZSk7CisgICAgICBpZiAoYXVkaW9jb250ZXh0LT5jaGFubmVscyAhPSAxKQorICAgICAgICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfQVVESU9DSEFOTkVMUywKKyAgICAgICAgICAgIGF1ZGlvY29udGV4dC0+Y2hhbm5lbHMpOworICAgICAgaWYgKGF1ZGlvY29udGV4dC0+Yml0ZGVwdGgpIHsKKyAgICAgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0FVRElPQklUREVQVEgsCisgICAgICAgICAgICBhdWRpb2NvbnRleHQtPmJpdGRlcHRoKTsKKyAgICAgIH0KKworICAgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgbWFzdGVyKTsKKworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRTp7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIGRvZXNuJ3QgbmVlZCB0eXBlLXNwZWNpZmljIGRhdGEgKi8KKyAgICAgIGJyZWFrOworICB9CisKKyAgZ3N0X2VibWxfd3JpdGVfYXNjaWkgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9DT0RFQ0lELCBjb250ZXh0LT5jb2RlY19pZCk7CisgIGlmIChjb250ZXh0LT5jb2RlY19wcml2KQorICAgIGdzdF9lYm1sX3dyaXRlX2JpbmFyeSAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0NPREVDUFJJVkFURSwKKyAgICAgICAgY29udGV4dC0+Y29kZWNfcHJpdiwgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplKTsKKworICBpZiAoY29udGV4dC0+c2Vla19wcmVyb2xsKSB7CisgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1NFRUtQUkVST0xMLAorICAgICAgICBjb250ZXh0LT5zZWVrX3ByZXJvbGwpOworICB9CisKKyAgaWYgKGNvbnRleHQtPmNvZGVjX2RlbGF5KSB7CisgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0NPREVDREVMQVksCisgICAgICAgIGNvbnRleHQtPmNvZGVjX2RlbGF5KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX211eF93cml0ZV9jaGFwdGVyX3RpdGxlIChjb25zdCBnY2hhciAqIHRpdGxlLCBHc3RFYm1sV3JpdGUgKiBlYm1sKQoreworICBndWludDY0IHRpdGxlX21hc3RlcjsKKworICB0aXRsZV9tYXN0ZXIgPQorICAgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUkRJU1BMQVkpOworCisgIGdzdF9lYm1sX3dyaXRlX3V0ZjggKGVibWwsIEdTVF9NQVRST1NLQV9JRF9DSEFQU1RSSU5HLCB0aXRsZSk7CisgIGdzdF9lYm1sX3dyaXRlX2FzY2lpIChlYm1sLCBHU1RfTUFUUk9TS0FfSURfQ0hBUExBTkdVQUdFLAorICAgICAgR1NUX01BVFJPU0tBX01VWF9DSEFQTEFORyk7CisKKyAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgdGl0bGVfbWFzdGVyKTsKK30KKworc3RhdGljIEdzdFRvY0VudHJ5ICoKK2dzdF9tYXRyb3NrYV9tdXhfd3JpdGVfY2hhcHRlciAoR3N0TWF0cm9za2FNdXggKiBtdXgsIEdzdFRvY0VudHJ5ICogZWRpdGlvbiwKKyAgICBHc3RUb2NFbnRyeSAqIGVudHJ5LCBHc3RFYm1sV3JpdGUgKiBlYm1sLCBndWludDY0ICogbWFzdGVyX2NoYXB0ZXJzLAorICAgIGd1aW50NjQgKiBtYXN0ZXJfZWRpdGlvbikKK3sKKyAgZ3VpbnQ2NCBtYXN0ZXJfY2hhcHRlcmF0b207CisgIEdMaXN0ICpjdXI7CisgIGd1aW50IGNvdW50LCBpOworICBnY2hhciAqdGl0bGU7CisgIGdpbnQ2NCBzdGFydCwgc3RvcDsKKyAgZ3VpbnQ2NCB1aWQ7CisgIGdjaGFyIHNfdWlkWzMyXTsKKyAgR3N0VG9jRW50cnkgKmludGVybmFsX2NoYXB0ZXIsICppbnRlcm5hbF9uZXN0ZWQ7CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisKKyAgaWYgKEdfVU5MSUtFTFkgKG1hc3Rlcl9jaGFwdGVycyAhPSBOVUxMICYmICptYXN0ZXJfY2hhcHRlcnMgPT0gMCkpCisgICAgKm1hc3Rlcl9jaGFwdGVycyA9CisgICAgICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJTKTsKKworICBpZiAoR19VTkxJS0VMWSAobWFzdGVyX2VkaXRpb24gIT0gTlVMTCAmJiAqbWFzdGVyX2VkaXRpb24gPT0gMCkpIHsKKyAgICAvKiBjcmVhdGUgdWlkIGZvciB0aGUgcGFyZW50ICovCisgICAgKm1hc3Rlcl9lZGl0aW9uID0KKyAgICAgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfRURJVElPTkVOVFJZKTsKKworICAgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9FRElUSU9OVUlELAorICAgICAgICBnX2FzY2lpX3N0cnRvdWxsIChnc3RfdG9jX2VudHJ5X2dldF91aWQgKGVkaXRpb24pLCBOVUxMLCAxMCkpOworICAgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9FRElUSU9ORkxBR0hJRERFTiwgMCk7CisgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0VESVRJT05GTEFHREVGQVVMVCwgMCk7CisgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0VESVRJT05GTEFHT1JERVJFRCwgMCk7CisgIH0KKworICBnc3RfdG9jX2VudHJ5X2dldF9zdGFydF9zdG9wX3RpbWVzIChlbnRyeSwgJnN0YXJ0LCAmc3RvcCk7CisgIHRhZ3MgPSBnc3RfdG9jX2VudHJ5X2dldF90YWdzIChlbnRyeSk7CisgIGlmICh0YWdzICE9IE5VTEwpIHsKKyAgICB0YWdzID0gZ3N0X3RhZ19saXN0X2NvcHkgKHRhZ3MpOworICB9CisKKyAgLyogYnVpbGQgaW50ZXJuYWwgY2hhcHRlciAqLworICB1aWQgPSBnc3RfbWF0cm9za2FfbXV4X2NyZWF0ZV91aWQgKG11eCk7CisgIGdfc25wcmludGYgKHNfdWlkLCBzaXplb2YgKHNfdWlkKSwgIiUiIEdfR0lOVDY0X0ZPUk1BVCwgdWlkKTsKKyAgaW50ZXJuYWxfY2hhcHRlciA9IGdzdF90b2NfZW50cnlfbmV3IChHU1RfVE9DX0VOVFJZX1RZUEVfQ0hBUFRFUiwgc191aWQpOworCisgIC8qIFdyaXRlIHRoZSBjaGFwdGVyIGVudHJ5ICovCisgIG1hc3Rlcl9jaGFwdGVyYXRvbSA9CisgICAgICBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSQVRPTSk7CisKKyAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJVSUQsIHVpZCk7CisgIC8qIFN0b3JlIHRoZSB1c2VyIHByb3ZpZGVkIFVJRCBpbiB0aGUgQ2hhcHRlclN0cmluZ1VJRCAqLworICBnc3RfZWJtbF93cml0ZV91dGY4IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUlNUUklOR1VJRCwKKyAgICAgIGdzdF90b2NfZW50cnlfZ2V0X3VpZCAoZW50cnkpKTsKKyAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJUSU1FU1RBUlQsIHN0YXJ0KTsKKyAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJUSU1FU1RPUCwgc3RvcCk7CisgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSRkxBR0hJRERFTiwgMCk7CisgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSRkxBR0VOQUJMRUQsIDEpOworCisgIC8qIHdyaXRlIGN1cnJlbnQgQ2hhcHRlckRpc3BsYXlzIGJlZm9yZSB0aGUgbmVzdGVkIGNoYXB0ZXJzICovCisgIGlmIChHX0xJS0VMWSAodGFncyAhPSBOVUxMKSkgeworICAgIGNvdW50ID0gZ3N0X3RhZ19saXN0X2dldF90YWdfc2l6ZSAodGFncywgR1NUX1RBR19USVRMRSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgZ3N0X3RhZ19saXN0X2dldF9zdHJpbmdfaW5kZXggKHRhZ3MsIEdTVF9UQUdfVElUTEUsIGksICZ0aXRsZSk7CisgICAgICAvKiBGSVhNRTogaGFuZGxlIENoYXB0ZXJMYW5ndWFnZSBlbnRyaWVzICovCisgICAgICBnc3RfbWF0cm9za2FfbXV4X3dyaXRlX2NoYXB0ZXJfdGl0bGUgKHRpdGxlLCBlYm1sKTsKKyAgICAgIGdfZnJlZSAodGl0bGUpOworICAgIH0KKworICAgIC8qIHJlbW92ZSB0aXRsZSB0YWcgKi8KKyAgICBpZiAoR19MSUtFTFkgKGNvdW50ID4gMCkpCisgICAgICBnc3RfdGFnX2xpc3RfcmVtb3ZlX3RhZyAodGFncywgR1NUX1RBR19USVRMRSk7CisKKyAgICBnc3RfdG9jX2VudHJ5X3NldF90YWdzIChpbnRlcm5hbF9jaGFwdGVyLCB0YWdzKTsKKyAgfQorCisgIC8qIFdyaXRlIG5lc3RlZCBjaGFwdGVycyAqLworICBmb3IgKGN1ciA9IGdzdF90b2NfZW50cnlfZ2V0X3N1Yl9lbnRyaWVzIChlbnRyeSk7IGN1ciAhPSBOVUxMOworICAgICAgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgaW50ZXJuYWxfbmVzdGVkID0gZ3N0X21hdHJvc2thX211eF93cml0ZV9jaGFwdGVyIChtdXgsIE5VTEwsIGN1ci0+ZGF0YSwKKyAgICAgICAgZWJtbCwgTlVMTCwgTlVMTCk7CisKKyAgICBnc3RfdG9jX2VudHJ5X2FwcGVuZF9zdWJfZW50cnkgKGludGVybmFsX2NoYXB0ZXIsIGludGVybmFsX25lc3RlZCk7CisgIH0KKworICBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfZmluaXNoIChlYm1sLCBtYXN0ZXJfY2hhcHRlcmF0b20pOworCisgIHJldHVybiBpbnRlcm5hbF9jaGFwdGVyOworfQorCitzdGF0aWMgR3N0VG9jRW50cnkgKgorZ3N0X21hdHJvc2thX211eF93cml0ZV9jaGFwdGVyX2VkaXRpb24gKEdzdE1hdHJvc2thTXV4ICogbXV4LAorICAgIEdzdFRvY0VudHJ5ICogZWRpdGlvbiwgR0xpc3QgKiBjaGFwdGVycywgR3N0RWJtbFdyaXRlICogZWJtbCwKKyAgICBndWludDY0ICogbWFzdGVyX2NoYXB0ZXJzKQoreworICBndWludDY0IG1hc3Rlcl9lZGl0aW9uID0gMDsKKyAgZ2NoYXIgc191aWRbMzJdOworICBHTGlzdCAqY3VyOworICBHc3RUb2NFbnRyeSAqaW50ZXJuYWxfZWRpdGlvbiwgKmludGVybmFsX2NoYXB0ZXI7CisgIEdzdFRhZ0xpc3QgKnRhZ3MgPSBOVUxMOworCisgIGdfc25wcmludGYgKHNfdWlkLCBzaXplb2YgKHNfdWlkKSwgIiUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgIGdzdF9tYXRyb3NrYV9tdXhfY3JlYXRlX3VpZCAobXV4KSk7CisKKyAgaWYgKGVkaXRpb24gIT0gTlVMTCkgeworICAgIC8qIEVkaXRpb24gZW50cnkgZGVmaW5lZCwgZ2V0IGl0cyB0YWdzICovCisgICAgdGFncyA9IGdzdF90b2NfZW50cnlfZ2V0X3RhZ3MgKGVkaXRpb24pOworICAgIGlmICh0YWdzICE9IE5VTEwpIHsKKyAgICAgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfY29weSAodGFncyk7CisgICAgfQorICB9CisKKyAgaW50ZXJuYWxfZWRpdGlvbiA9IGdzdF90b2NfZW50cnlfbmV3IChHU1RfVE9DX0VOVFJZX1RZUEVfRURJVElPTiwgc191aWQpOworICBpZiAodGFncyAhPSBOVUxMKSB7CisgICAgZ3N0X3RvY19lbnRyeV9zZXRfdGFncyAoaW50ZXJuYWxfZWRpdGlvbiwgdGFncyk7CisgIH0KKworICBmb3IgKGN1ciA9IGdfbGlzdF9maXJzdCAoY2hhcHRlcnMpOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgaW50ZXJuYWxfY2hhcHRlciA9IGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfY2hhcHRlciAobXV4LCBpbnRlcm5hbF9lZGl0aW9uLAorICAgICAgICBjdXItPmRhdGEsIGVibWwsIG1hc3Rlcl9jaGFwdGVycywgJm1hc3Rlcl9lZGl0aW9uKTsKKworICAgIGdzdF90b2NfZW50cnlfYXBwZW5kX3N1Yl9lbnRyeSAoaW50ZXJuYWxfZWRpdGlvbiwgaW50ZXJuYWxfY2hhcHRlcik7CisgIH0KKworICBpZiAoR19MSUtFTFkgKG1hc3Rlcl9lZGl0aW9uICE9IDApKQorICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIG1hc3Rlcl9lZGl0aW9uKTsKKworICByZXR1cm4gaW50ZXJuYWxfZWRpdGlvbjsKK30KKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X3N0YXJ0OgorICogQG11eDogI0dzdE1hdHJvc2thTXV4CisgKgorICogU3RhcnQgYSBuZXcgbWF0cm9za2EgZmlsZSAod3JpdGUgaGVhZGVycyBldGMuLi4pCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfbXV4X3N0YXJ0IChHc3RNYXRyb3NrYU11eCAqIG11eCwgR3N0TWF0cm9za2FQYWQgKiBmaXJzdF9wYWQsCisgICAgR3N0QnVmZmVyICogZmlyc3RfcGFkX2J1ZikKK3sKKyAgR3N0RWJtbFdyaXRlICplYm1sID0gbXV4LT5lYm1sX3dyaXRlOworICBjb25zdCBnY2hhciAqZG9jdHlwZTsKKyAgZ3VpbnQzMiBzZWVraGVhZF9pZFtdID0geyBHU1RfTUFUUk9TS0FfSURfU0VHTUVOVElORk8sCisgICAgR1NUX01BVFJPU0tBX0lEX1RSQUNLUywKKyAgICBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUlMsCisgICAgR1NUX01BVFJPU0tBX0lEX0NVRVMsCisgICAgR1NUX01BVFJPU0tBX0lEX1RBR1MsCisgICAgMAorICB9OworICBjb25zdCBnY2hhciAqbWVkaWFfdHlwZTsKKyAgZ2Jvb2xlYW4gYXVkaW9fb25seTsKKyAgZ3VpbnQ2NCBtYXN0ZXIsIGNoaWxkOworICBHU0xpc3QgKmNvbGxlY3RlZDsKKyAgaW50IGk7CisgIGd1aW50IHRyYWNrbnVtID0gMTsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uID0gMDsKKyAgZ3VpbnQzMiBzZWdtZW50X3VpZFs0XTsKKyAgR1RpbWVWYWwgdGltZSA9IHsgMCwgMCB9OworICBnY2hhciBzX2lkWzMyXTsKKyAgR3N0VG9jICp0b2M7CisKKyAgLyogaWYgbm90IHN0cmVhbWluZywgY2hlY2sgaWYgZG93bnN0cmVhbSBpcyBzZWVrYWJsZSAqLworICBpZiAoIW11eC0+ZWJtbF93cml0ZS0+c3RyZWFtYWJsZSkgeworICAgIGdib29sZWFuIHNlZWthYmxlOworICAgIEdzdFF1ZXJ5ICpxdWVyeTsKKworICAgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19zZWVraW5nIChHU1RfRk9STUFUX0JZVEVTKTsKKyAgICBpZiAoZ3N0X3BhZF9wZWVyX3F1ZXJ5IChtdXgtPnNyY3BhZCwgcXVlcnkpKSB7CisgICAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksIE5VTEwsICZzZWVrYWJsZSwgTlVMTCwgTlVMTCk7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKG11eCwgImRvd25zdHJlYW0gaXMgJXNzZWVrYWJsZSIsIHNlZWthYmxlID8gIiIgOiAibm90ICIpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBhc3N1bWUgc2Vla2luZyBpcyBub3Qgc3VwcG9ydGVkIGlmIHF1ZXJ5IG5vdCBoYW5kbGVkIGRvd25zdHJlYW0gKi8KKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAiZG93bnN0cmVhbSBkaWQgbm90IGhhbmRsZSBzZWVraW5nIHF1ZXJ5Iik7CisgICAgICBzZWVrYWJsZSA9IEZBTFNFOworICAgIH0KKyAgICBpZiAoIXNlZWthYmxlKSB7CisgICAgICBtdXgtPmVibWxfd3JpdGUtPnN0cmVhbWFibGUgPSBUUlVFOworICAgICAgZ19vYmplY3Rfbm90aWZ5IChHX09CSkVDVCAobXV4KSwgInN0cmVhbWFibGUiKTsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAiZG93bnN0cmVhbSBpcyBub3Qgc2Vla2FibGUsIGJ1dCAiCisgICAgICAgICAgInN0cmVhbWFibGU9ZmFsc2UuIFdpbGwgaWdub3JlIHRoYXQgYW5kIGNyZWF0ZSBzdHJlYW1hYmxlIG91dHB1dCAiCisgICAgICAgICAgImluc3RlYWQiKTsKKyAgICB9CisgICAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisgIH0KKworICAvKiBzdHJlYW0tc3RhcnQgKEZJWE1FOiBjcmVhdGUgaWQgYmFzZWQgb24gaW5wdXQgaWRzKSAqLworICBnX3NucHJpbnRmIChzX2lkLCBzaXplb2YgKHNfaWQpLCAibWF0cm9za2FtdXgtJTA4eCIsIGdfcmFuZG9tX2ludCAoKSk7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAobXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0IChzX2lkKSk7CisKKyAgLyogb3V0cHV0IGNhcHMgKi8KKyAgYXVkaW9fb25seSA9IG11eC0+bnVtX3Zfc3RyZWFtcyA9PSAwICYmIG11eC0+bnVtX2Ffc3RyZWFtcyA+IDA7CisgIGlmIChtdXgtPmlzX3dlYm0pIHsKKyAgICBtZWRpYV90eXBlID0gKGF1ZGlvX29ubHkpID8gImF1ZGlvL3dlYm0iIDogInZpZGVvL3dlYm0iOworICB9IGVsc2UgeworICAgIG1lZGlhX3R5cGUgPSAoYXVkaW9fb25seSkgPyAiYXVkaW8veC1tYXRyb3NrYSIgOiAidmlkZW8veC1tYXRyb3NrYSI7CisgIH0KKyAgZWJtbC0+Y2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKG1lZGlhX3R5cGUpOworICBnc3RfcGFkX3NldF9jYXBzIChtdXgtPnNyY3BhZCwgZWJtbC0+Y2Fwcyk7CisgIC8qIHdlIHN0YXJ0IHdpdGggYSBFQk1MIGhlYWRlciAqLworICBkb2N0eXBlID0gbXV4LT5kb2N0eXBlOworICBHU1RfSU5GT19PQkpFQ1QgKGVibWwsICJEb2NUeXBlOiAlcywgVmVyc2lvbjogJWQiLAorICAgICAgZG9jdHlwZSwgbXV4LT5kb2N0eXBlX3ZlcnNpb24pOworICBnc3RfZWJtbF93cml0ZV9oZWFkZXIgKGVibWwsIGRvY3R5cGUsIG11eC0+ZG9jdHlwZV92ZXJzaW9uKTsKKworICAvKiB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyIGlzIGNhY2hlZCAqLworICBnc3RfZWJtbF93cml0ZV9zZXRfY2FjaGUgKGVibWwsIDB4MTAwMCk7CisKKyAgLyogc3RhcnQgYSBzZWdtZW50ICovCisgIG11eC0+c2VnbWVudF9wb3MgPQorICAgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfU0VHTUVOVCk7CisgIG11eC0+c2VnbWVudF9tYXN0ZXIgPSBlYm1sLT5wb3M7CisKKyAgaWYgKCFtdXgtPmVibWxfd3JpdGUtPnN0cmVhbWFibGUpIHsKKyAgICAvKiBzZWVraGVhZCAodGFibGUgb2YgY29udGVudHMpIC0gd2Ugc2V0IHRoZSBwb3NpdGlvbnMgbGF0ZXIgKi8KKyAgICBtdXgtPnNlZWtoZWFkX3BvcyA9IGVibWwtPnBvczsKKyAgICBtYXN0ZXIgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9TRUVLSEVBRCk7CisgICAgZm9yIChpID0gMDsgc2Vla2hlYWRfaWRbaV0gIT0gMDsgaSsrKSB7CisgICAgICBjaGlsZCA9IGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1NFRUtFTlRSWSk7CisgICAgICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfU0VFS0lELCBzZWVraGVhZF9pZFtpXSk7CisgICAgICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfU0VFS1BPU0lUSU9OLCAtMSk7CisgICAgICBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfZmluaXNoIChlYm1sLCBjaGlsZCk7CisgICAgfQorICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIG1hc3Rlcik7CisgIH0KKworICBpZiAobXV4LT5lYm1sX3dyaXRlLT5zdHJlYW1hYmxlKSB7CisgICAgY29uc3QgR3N0VGFnTGlzdCAqdGFnczsKKyAgICBnYm9vbGVhbiBoYXNfbWFpbl90YWdzOworCisgICAgLyogdGFncyAqLworICAgIHRhZ3MgPSBnc3RfdGFnX3NldHRlcl9nZXRfdGFnX2xpc3QgKEdTVF9UQUdfU0VUVEVSIChtdXgpKTsKKyAgICBoYXNfbWFpbl90YWdzID0gdGFncyAhPSBOVUxMICYmICFnc3RfbWF0cm9za2FfbXV4X3RhZ19saXN0X2lzX2VtcHR5ICh0YWdzKTsKKworICAgIGlmIChoYXNfbWFpbl90YWdzIHx8IGdzdF9tYXRyb3NrYV9tdXhfc3RyZWFtc19oYXZlX3RhZ3MgKG11eCkpIHsKKyAgICAgIGd1aW50NjQgbWFzdGVyX3RhZ3MsIG1hc3Rlcl90YWc7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgIldyaXRpbmcgdGFncyIpOworCisgICAgICBtdXgtPnRhZ3NfcG9zID0gZWJtbC0+cG9zOworICAgICAgbWFzdGVyX3RhZ3MgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UQUdTKTsKKyAgICAgIGlmIChoYXNfbWFpbl90YWdzKSB7CisgICAgICAgIG1hc3Rlcl90YWcgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UQUcpOworICAgICAgICBnc3RfdGFnX2xpc3RfZm9yZWFjaCAodGFncywgZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnLCBlYm1sKTsKKyAgICAgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgbWFzdGVyX3RhZyk7CisgICAgICB9CisgICAgICBnc3RfbWF0cm9za2FfbXV4X3dyaXRlX3N0cmVhbXNfdGFncyAobXV4KTsKKyAgICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIG1hc3Rlcl90YWdzKTsKKyAgICB9CisgIH0KKworICAvKiBzZWdtZW50IGluZm8gKi8KKyAgbXV4LT5pbmZvX3BvcyA9IGVibWwtPnBvczsKKyAgbWFzdGVyID0gZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfU0VHTUVOVElORk8pOworCisgIC8qIFdlYk0gZG9lcyBub3Qgc3VwcG9ydCBTZWdtZW50VUlEIGZpZWxkIG9uIFNlZ21lbnRJbmZvICovCisgIGlmICghbXV4LT5pc193ZWJtKSB7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgc2VnbWVudF91aWRbaV0gPSBnX3JhbmRvbV9pbnQgKCk7CisgICAgfQorICAgIGdzdF9lYm1sX3dyaXRlX2JpbmFyeSAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1NFR01FTlRVSUQsCisgICAgICAgIChndWludDggKikgc2VnbWVudF91aWQsIDE2KTsKKyAgfQorCisgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9USU1FQ09ERVNDQUxFLCBtdXgtPnRpbWVfc2NhbGUpOworICBtdXgtPmR1cmF0aW9uX3BvcyA9IGVibWwtPnBvczsKKyAgLyogZ2V0IGR1cmF0aW9uICovCisgIGlmICghbXV4LT5lYm1sX3dyaXRlLT5zdHJlYW1hYmxlKSB7CisgICAgZm9yIChjb2xsZWN0ZWQgPSBtdXgtPmNvbGxlY3QtPmRhdGE7IGNvbGxlY3RlZDsKKyAgICAgICAgY29sbGVjdGVkID0gZ19zbGlzdF9uZXh0IChjb2xsZWN0ZWQpKSB7CisgICAgICBHc3RNYXRyb3NrYVBhZCAqY29sbGVjdF9wYWQ7CisgICAgICBHc3RQYWQgKnRoZXBhZDsKKyAgICAgIGdpbnQ2NCB0cmFja2R1cmF0aW9uOworCisgICAgICBjb2xsZWN0X3BhZCA9IChHc3RNYXRyb3NrYVBhZCAqKSBjb2xsZWN0ZWQtPmRhdGE7CisgICAgICB0aGVwYWQgPSBjb2xsZWN0X3BhZC0+Y29sbGVjdC5wYWQ7CisKKyAgICAgIC8qIFF1ZXJ5IHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIHRyYWNrLiAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAodGhlcGFkLCAicXVlcnlpbmcgcGVlciBkdXJhdGlvbiIpOworICAgICAgaWYgKGdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAodGhlcGFkLCBHU1RfRk9STUFUX1RJTUUsICZ0cmFja2R1cmF0aW9uKSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh0aGVwYWQsICJkdXJhdGlvbjogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAodHJhY2tkdXJhdGlvbikpOworICAgICAgICBpZiAodHJhY2tkdXJhdGlvbiAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmIHRyYWNrZHVyYXRpb24gPiBkdXJhdGlvbikgeworICAgICAgICAgIGR1cmF0aW9uID0gKEdzdENsb2NrVGltZSkgdHJhY2tkdXJhdGlvbjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBnc3RfZWJtbF93cml0ZV9mbG9hdCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0RVUkFUSU9OLAorICAgICAgICBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChkdXJhdGlvbikgLworICAgICAgICBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChtdXgtPnRpbWVfc2NhbGUpKTsKKyAgfQorICBnc3RfZWJtbF93cml0ZV91dGY4IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfTVVYSU5HQVBQLAorICAgICAgIkdTdHJlYW1lciBtYXRyb3NrYW11eCB2ZXJzaW9uICIgUEFDS0FHRV9WRVJTSU9OKTsKKyAgaWYgKG11eC0+d3JpdGluZ19hcHAgJiYgbXV4LT53cml0aW5nX2FwcFswXSkgeworICAgIGdzdF9lYm1sX3dyaXRlX3V0ZjggKGVibWwsIEdTVF9NQVRST1NLQV9JRF9XUklUSU5HQVBQLCBtdXgtPndyaXRpbmdfYXBwKTsKKyAgfQorICBnX2dldF9jdXJyZW50X3RpbWUgKCZ0aW1lKTsKKyAgZ3N0X2VibWxfd3JpdGVfZGF0ZSAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0RBVEVVVEMsIHRpbWUudHZfc2VjKTsKKyAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgbWFzdGVyKTsKKworICAvKiB0cmFja3MgKi8KKyAgbXV4LT50cmFja3NfcG9zID0gZWJtbC0+cG9zOworICBtYXN0ZXIgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UUkFDS1MpOworCisgIGZvciAoY29sbGVjdGVkID0gbXV4LT5jb2xsZWN0LT5kYXRhOyBjb2xsZWN0ZWQ7CisgICAgICBjb2xsZWN0ZWQgPSBnX3NsaXN0X25leHQgKGNvbGxlY3RlZCkpIHsKKyAgICBHc3RNYXRyb3NrYVBhZCAqY29sbGVjdF9wYWQ7CisgICAgR3N0QnVmZmVyICpidWY7CisKKyAgICBjb2xsZWN0X3BhZCA9IChHc3RNYXRyb3NrYVBhZCAqKSBjb2xsZWN0ZWQtPmRhdGE7CisKKyAgICAvKiBUaGlzIHdpbGwgY2F1c2UgYW4gZXJyb3IgYXQgYSBsYXRlciB0aW1lICovCisgICAgaWYgKGNvbGxlY3RfcGFkLT50cmFjay0+Y29kZWNfaWQgPT0gTlVMTCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogRm9yIGF1ZGlvIHRyYWNrcywgdXNlIHRoZSBmaXJzdCBidWZmZXJzIGR1cmF0aW9uIGFzIHRoZSBkZWZhdWx0CisgICAgICogZHVyYXRpb24gaWYgd2UgZGlkbid0IGdldCBhbnkgYmV0dGVyIGlkZWEgZnJvbSB0aGUgY2FwcyBldmVudCBhbHJlYWR5CisgICAgICovCisgICAgaWYgKGNvbGxlY3RfcGFkLT50cmFjay0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9BVURJTyAmJgorICAgICAgICBjb2xsZWN0X3BhZC0+dHJhY2stPmRlZmF1bHRfZHVyYXRpb24gPT0gMCkgeworICAgICAgaWYgKGNvbGxlY3RfcGFkID09IGZpcnN0X3BhZCkKKyAgICAgICAgYnVmID0gZmlyc3RfcGFkX2J1ZiA/IGdzdF9idWZmZXJfcmVmIChmaXJzdF9wYWRfYnVmKSA6IE5VTEw7CisgICAgICBlbHNlCisgICAgICAgIGJ1ZiA9IGdzdF9jb2xsZWN0X3BhZHNfcGVlayAobXV4LT5jb2xsZWN0LCBjb2xsZWN0ZWQtPmRhdGEpOworCisgICAgICBpZiAoYnVmICYmIEdTVF9CVUZGRVJfRFVSQVRJT05fSVNfVkFMSUQgKGJ1ZikpCisgICAgICAgIGNvbGxlY3RfcGFkLT50cmFjay0+ZGVmYXVsdF9kdXJhdGlvbiA9CisgICAgICAgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpICsgY29sbGVjdF9wYWQtPnRyYWNrLT5jb2RlY19kZWxheTsKKyAgICAgIGlmIChidWYpCisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgfQorCisgICAgY29sbGVjdF9wYWQtPnRyYWNrLT5udW0gPSB0cmFja251bSsrOworICAgIGNoaWxkID0gZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfVFJBQ0tFTlRSWSk7CisgICAgZ3N0X21hdHJvc2thX211eF90cmFja19oZWFkZXIgKG11eCwgY29sbGVjdF9wYWQtPnRyYWNrKTsKKyAgICBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfZmluaXNoIChlYm1sLCBjaGlsZCk7CisgICAgLyogc29tZSByZW1haW5pbmcgcGFkL3RyYWNrIHNldHVwICovCisgICAgY29sbGVjdF9wYWQtPmRlZmF1bHRfZHVyYXRpb25fc2NhbGVkID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChjb2xsZWN0X3BhZC0+dHJhY2stPmRlZmF1bHRfZHVyYXRpb24sCisgICAgICAgIDEsIG11eC0+dGltZV9zY2FsZSk7CisgIH0KKyAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgbWFzdGVyKTsKKworICAvKiBjaGFwdGVycyAqLworICB0b2MgPSBnc3RfdG9jX3NldHRlcl9nZXRfdG9jIChHU1RfVE9DX1NFVFRFUiAobXV4KSk7CisgIGlmICh0b2MgIT0gTlVMTCAmJiAhbXV4LT5lYm1sX3dyaXRlLT5zdHJlYW1hYmxlKSB7CisgICAgZ3VpbnQ2NCBtYXN0ZXJfY2hhcHRlcnMgPSAwOworICAgIEdzdFRvY0VudHJ5ICppbnRlcm5hbF9lZGl0aW9uOworICAgIEdMaXN0ICpjdXIsICpjaGFwdGVyczsKKworICAgIEdTVF9ERUJVRyAoIldyaXRpbmcgY2hhcHRlcnMiKTsKKworICAgIC8qIFRoZXJlIGFyZSB0d28gVUlEcyBmb3IgQ2hhcHRlcnM6CisgICAgICogLSBUaGUgQ2hhcHRlclVJRCBpcyBhIG1hbmRhdG9yeSB1bnNpZ25lZCBpbnRlZ2VyIHdoaWNoIGludGVybmFsbHkKKyAgICAgKiByZWZlcnMgdG8gYSBnaXZlbiBjaGFwdGVyLiBFeGNlcHQgZm9yIHRoZSB0aXRsZSAmIGxhbmd1YWdlIHdoaWNoIHVzZQorICAgICAqIGRlZGljYXRlZCBmaWVsZHMsIHRoaXMgVUlEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYWRkIHRhZ3MgdG8gdGhlIENoYXB0ZXIuCisgICAgICogVGhlIHRhZ3MgY29tZSBpbiBhIHNlcGFyYXRlIHNlY3Rpb24gb2YgdGhlIGNvbnRhaW5lci4KKyAgICAgKiAtIFRoZSBDaGFwdGVyU3RyaW5nVUlEIGlzIGFuIG9wdGlvbmFsIFVURi04IHN0cmluZyB3aGljaCBhbHNvIHVuaXF1ZWx5CisgICAgICogcmVmZXJzIHRvIGEgY2hhcHRlciBidXQgZnJvbSBhbiBleHRlcm5hbCBwZXJzcGVjdGl2ZS4gSXQgY2FuIGFjdCBhcyBhCisgICAgICogIldlYlZUVCBjdWUgaWRlbnRpZmllciIgd2hpY2ggImNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSBhIHNwZWNpZmljIGN1ZSwKKyAgICAgKiBmb3IgZXhhbXBsZSBmcm9tIHNjcmlwdCBvciBDU1MiLgorICAgICAqCisgICAgICogVGhlIENoYXB0ZXJVSUQgd2lsbCBiZSBnZW5lcmF0ZWQgYW5kIGNoZWNrZWQgZm9yIHVuaWNpdHksIHdoaWxlIHRoZQorICAgICAqIENoYXB0ZXJTdHJpbmdVSUQgd2lsbCByZWNlaXZlIHRoZSB1c2VyIGRlZmluZWQgVUlELgorICAgICAqCisgICAgICogSW4gb3JkZXIgdG8gYmUgYWJsZSB0byByZWZlciB0byBjaGFwdGVycyBmcm9tIHRoZSB0YWdzIHNlY3Rpb24sCisgICAgICogd2UgbXVzdCBtYWludGFpbiBhbiBpbnRlcm5hbCBUb2MgdHJlZSB3aXRoIHRoZSBnZW5lcmF0ZWQgQ2hhcHRlclVJRAorICAgICAqIChzZWUgZ3N0X21hdHJvc2thX211eF93cml0ZV90b2NfZW50cnlfdGFncykgKi8KKworICAgIC8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBlZGl0aW9ucyBvciBjaGFwdGVycyBhdCB0aGUgcm9vdCBsZXZlbC4gKi8KKyAgICBjdXIgPSBnc3RfdG9jX2dldF9lbnRyaWVzICh0b2MpOworICAgIGlmIChjdXIgIT0gTlVMTCkgeworICAgICAgbXV4LT5jaGFwdGVyc19wb3MgPSBlYm1sLT5wb3M7CisKKyAgICAgIG11eC0+aW50ZXJuYWxfdG9jID0gZ3N0X3RvY19uZXcgKEdTVF9UT0NfU0NPUEVfR0xPQkFMKTsKKworICAgICAgaWYgKGdzdF90b2NfZW50cnlfZ2V0X2VudHJ5X3R5cGUgKGN1ci0+ZGF0YSkgPT0KKyAgICAgICAgICBHU1RfVE9DX0VOVFJZX1RZUEVfRURJVElPTikgeworICAgICAgICAvKiBFZGl0aW9ucyBhdCB0aGUgcm9vdCBsZXZlbCAqLworICAgICAgICBmb3IgKDsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICAgIGNoYXB0ZXJzID0gZ3N0X3RvY19lbnRyeV9nZXRfc3ViX2VudHJpZXMgKGN1ci0+ZGF0YSk7CisgICAgICAgICAgaW50ZXJuYWxfZWRpdGlvbiA9IGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfY2hhcHRlcl9lZGl0aW9uIChtdXgsCisgICAgICAgICAgICAgIGN1ci0+ZGF0YSwgY2hhcHRlcnMsIGVibWwsICZtYXN0ZXJfY2hhcHRlcnMpOworICAgICAgICAgIGdzdF90b2NfYXBwZW5kX2VudHJ5IChtdXgtPmludGVybmFsX3RvYywgaW50ZXJuYWxfZWRpdGlvbik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIENoYXB0ZXJzIGF0IHRoZSByb290IGxldmVsICovCisgICAgICAgIGludGVybmFsX2VkaXRpb24gPSBnc3RfbWF0cm9za2FfbXV4X3dyaXRlX2NoYXB0ZXJfZWRpdGlvbiAobXV4LAorICAgICAgICAgICAgTlVMTCwgY3VyLCBlYm1sLCAmbWFzdGVyX2NoYXB0ZXJzKTsKKyAgICAgICAgZ3N0X3RvY19hcHBlbmRfZW50cnkgKG11eC0+aW50ZXJuYWxfdG9jLCBpbnRlcm5hbF9lZGl0aW9uKTsKKyAgICAgIH0KKworICAgICAgLyogY2xvc2UgbWFzdGVyIGVsZW1lbnQgaWYgYW55IGVkaXRpb24gd2FzIHdyaXR0ZW4gKi8KKyAgICAgIGlmIChHX0xJS0VMWSAobWFzdGVyX2NoYXB0ZXJzICE9IDApKQorICAgICAgICBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfZmluaXNoIChlYm1sLCBtYXN0ZXJfY2hhcHRlcnMpOworICAgIH0KKyAgfQorCisgIC8qIGxhc3RseSwgZmx1c2ggdGhlIGNhY2hlICovCisgIGdzdF9lYm1sX3dyaXRlX2ZsdXNoX2NhY2hlIChlYm1sLCBGQUxTRSwgMCk7CisKKyAgaWYgKHRvYyAhPSBOVUxMKQorICAgIGdzdF90b2NfdW5yZWYgKHRvYyk7Cit9CisKKy8qIFRPRE86IG1vcmUgc2Vuc2libGUgdGFnIG1hcHBpbmdzICovCitzdGF0aWMgY29uc3Qgc3RydWN0Cit7CisgIGNvbnN0IGdjaGFyICptYXRyb3NrYV90YWduYW1lOworICBjb25zdCBnY2hhciAqZ3N0cmVhbWVyX3RhZ25hbWU7Cit9Citnc3RfbWF0cm9za2FfdGFnX2NvbnZbXSA9IHsKKyAgeworICBHU1RfTUFUUk9TS0FfVEFHX0lEX1RJVExFLCBHU1RfVEFHX1RJVExFfSwgeworICBHU1RfTUFUUk9TS0FfVEFHX0lEX0FSVElTVCwgR1NUX1RBR19BUlRJU1R9LCB7CisgIEdTVF9NQVRST1NLQV9UQUdfSURfQUxCVU0sIEdTVF9UQUdfQUxCVU19LCB7CisgIEdTVF9NQVRST1NLQV9UQUdfSURfQ09NTUVOVFMsIEdTVF9UQUdfQ09NTUVOVH0sIHsKKyAgR1NUX01BVFJPU0tBX1RBR19JRF9CSVRTUFMsIEdTVF9UQUdfQklUUkFURX0sIHsKKyAgR1NUX01BVFJPU0tBX1RBR19JRF9CUFMsIEdTVF9UQUdfQklUUkFURX0sIHsKKyAgR1NUX01BVFJPU0tBX1RBR19JRF9FTkNPREVSLCBHU1RfVEFHX0VOQ09ERVJ9LCB7CisgIEdTVF9NQVRST1NLQV9UQUdfSURfREFURSwgR1NUX1RBR19EQVRFfSwgeworICBHU1RfTUFUUk9TS0FfVEFHX0lEX0lTUkMsIEdTVF9UQUdfSVNSQ30sIHsKKyAgR1NUX01BVFJPU0tBX1RBR19JRF9DT1BZUklHSFQsIEdTVF9UQUdfQ09QWVJJR0hUfSwgeworICBHU1RfTUFUUk9TS0FfVEFHX0lEX0JQTSwgR1NUX1RBR19CRUFUU19QRVJfTUlOVVRFfSwgeworICBHU1RfTUFUUk9TS0FfVEFHX0lEX1RFUk1TX09GX1VTRSwgR1NUX1RBR19MSUNFTlNFfSwgeworICBHU1RfTUFUUk9TS0FfVEFHX0lEX0NPTVBPU0VSLCBHU1RfVEFHX0NPTVBPU0VSfSwgeworICBHU1RfTUFUUk9TS0FfVEFHX0lEX0xFQURfUEVSRk9STUVSLCBHU1RfVEFHX1BFUkZPUk1FUn0sIHsKKyAgR1NUX01BVFJPU0tBX1RBR19JRF9HRU5SRSwgR1NUX1RBR19HRU5SRX0KK307CisKKy8qIEV2ZXJ5IHN0YWdlZnJpZ2h0IGltcGxlbWVudGF0aW9uIG9uIGFuZHJvaWQgdXAgdG8gYW5kIGluY2x1ZGluZyA2LjAuMSBpcyB1c2luZworIGxpYndlYm0gd2l0aCBidWcgaW4gbWF0cm9za2EgcGFyc2luZywgd2hlcmUgaXQgd2lsbCBjaG9rZSBvbiBlbXB0eSB0YWcgZWxlbWVudHM7Cisgc28gYmVmb3JlIG91dHB1dHRpbmcgdGFncyBhbmQgdGFnIGVsZW1lbnRzIHdlIGJldHRlciBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUKKyBhY3R1YWxseSB0YWdzIHdlIGFyZSBnb2luZyB0byB3cml0ZSAqLworc3RhdGljIGdib29sZWFuCitnc3RfbWF0cm9za2FfbXV4X3RhZ19saXN0X2lzX2VtcHR5IChjb25zdCBHc3RUYWdMaXN0ICogbGlzdCkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBnc3RfdGFnX2xpc3Rfbl90YWdzIChsaXN0KTsgaSsrKSB7CisgICAgY29uc3QgZ2NoYXIgKnRhZyA9IGdzdF90YWdfbGlzdF9udGhfdGFnX25hbWUgKGxpc3QsIGkpOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBHX05fRUxFTUVOVFMgKGdzdF9tYXRyb3NrYV90YWdfY29udik7IGkrKykgeworICAgICAgY29uc3QgZ2NoYXIgKnRhZ25hbWVfZ3N0ID0gZ3N0X21hdHJvc2thX3RhZ19jb252W2ldLmdzdHJlYW1lcl90YWduYW1lOworICAgICAgaWYgKHN0cmNtcCAodGFnbmFtZV9nc3QsIHRhZykgPT0gMCkgeworICAgICAgICBHVmFsdWUgc3JjID0geyAwLCB9OworICAgICAgICBnY2hhciAqZGVzdDsKKworICAgICAgICBpZiAoIWdzdF90YWdfbGlzdF9jb3B5X3ZhbHVlICgmc3JjLCBsaXN0LCB0YWcpKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZXN0ID0gZ3N0X3ZhbHVlX3NlcmlhbGl6ZSAoJnNyYyk7CisKKyAgICAgICAgZ192YWx1ZV91bnNldCAoJnNyYyk7CisgICAgICAgIGlmIChkZXN0KSB7CisgICAgICAgICAgZ19mcmVlIChkZXN0KTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfbXV4X3dyaXRlX3NpbXBsZV90YWcgKGNvbnN0IEdzdFRhZ0xpc3QgKiBsaXN0LCBjb25zdCBnY2hhciAqIHRhZywKKyAgICBncG9pbnRlciBkYXRhKQoreworICBHc3RFYm1sV3JpdGUgKmVibWwgPSAoR3N0RWJtbFdyaXRlICopIGRhdGE7CisgIGd1aW50IGk7CisgIGd1aW50NjQgc2ltcGxldGFnX21hc3RlcjsKKworICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChnc3RfbWF0cm9za2FfdGFnX2NvbnYpOyBpKyspIHsKKyAgICBjb25zdCBnY2hhciAqdGFnbmFtZV9nc3QgPSBnc3RfbWF0cm9za2FfdGFnX2NvbnZbaV0uZ3N0cmVhbWVyX3RhZ25hbWU7CisgICAgY29uc3QgZ2NoYXIgKnRhZ25hbWVfbWt2ID0gZ3N0X21hdHJvc2thX3RhZ19jb252W2ldLm1hdHJvc2thX3RhZ25hbWU7CisKKyAgICBpZiAoc3RyY21wICh0YWduYW1lX2dzdCwgdGFnKSA9PSAwKSB7CisgICAgICBHVmFsdWUgc3JjID0geyAwLCB9OworICAgICAgZ2NoYXIgKmRlc3Q7CisKKyAgICAgIGlmICghZ3N0X3RhZ19saXN0X2NvcHlfdmFsdWUgKCZzcmMsIGxpc3QsIHRhZykpCisgICAgICAgIGJyZWFrOworICAgICAgaWYgKChkZXN0ID0gZ3N0X3ZhbHVlX3NlcmlhbGl6ZSAoJnNyYykpKSB7CisKKyAgICAgICAgc2ltcGxldGFnX21hc3RlciA9IGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAoZWJtbCwKKyAgICAgICAgICAgIEdTVF9NQVRST1NLQV9JRF9TSU1QTEVUQUcpOworICAgICAgICBnc3RfZWJtbF93cml0ZV9hc2NpaSAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RBR05BTUUsIHRhZ25hbWVfbWt2KTsKKyAgICAgICAgZ3N0X2VibWxfd3JpdGVfdXRmOCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RBR1NUUklORywgZGVzdCk7CisgICAgICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIHNpbXBsZXRhZ19tYXN0ZXIpOworICAgICAgICBnX2ZyZWUgKGRlc3QpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJDYW4ndCB0cmFuc2Zvcm0gdGFnICclcycgdG8gc3RyaW5nIiwgdGFnbmFtZV9ta3YpOworICAgICAgfQorICAgICAgZ192YWx1ZV91bnNldCAoJnNyYyk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9tdXhfd3JpdGVfc3RyZWFtX3RhZ3MgKEdzdE1hdHJvc2thTXV4ICogbXV4LCBHc3RNYXRyb3NrYVBhZCAqIG1wYWQpCit7CisgIGd1aW50NjQgbWFzdGVyX3RhZywgbWFzdGVyX3RhcmdldHM7CisgIEdzdEVibWxXcml0ZSAqZWJtbDsKKworICBlYm1sID0gbXV4LT5lYm1sX3dyaXRlOworCisgIGlmIChHX1VOTElLRUxZIChtcGFkLT50YWdzID09IE5VTEwKKyAgICAgICAgICB8fCBnc3RfbWF0cm9za2FfbXV4X3RhZ19saXN0X2lzX2VtcHR5IChtcGFkLT50YWdzKSkpCisgICAgcmV0dXJuOworCisgIG1hc3Rlcl90YWcgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UQUcpOworICBtYXN0ZXJfdGFyZ2V0cyA9IGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RBUkdFVFMpOworCisgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UQVJHRVRUUkFDS1VJRCwgbXBhZC0+dHJhY2stPnVpZCk7CisKKyAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgbWFzdGVyX3RhcmdldHMpOworICBnc3RfdGFnX2xpc3RfZm9yZWFjaCAobXBhZC0+dGFncywgZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnLCBlYm1sKTsKKyAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgbWFzdGVyX3RhZyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfbXV4X3dyaXRlX3N0cmVhbXNfdGFncyAoR3N0TWF0cm9za2FNdXggKiBtdXgpCit7CisgIEdTTGlzdCAqd2FsazsKKworICBmb3IgKHdhbGsgPSBtdXgtPmNvbGxlY3QtPmRhdGE7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0TWF0cm9za2FQYWQgKmNvbGxlY3RfcGFkOworCisgICAgY29sbGVjdF9wYWQgPSAoR3N0TWF0cm9za2FQYWQgKikgd2Fsay0+ZGF0YTsKKworICAgIGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfc3RyZWFtX3RhZ3MgKG11eCwgY29sbGVjdF9wYWQpOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX211eF9zdHJlYW1zX2hhdmVfdGFncyAoR3N0TWF0cm9za2FNdXggKiBtdXgpCit7CisgIEdTTGlzdCAqd2FsazsKKworICBmb3IgKHdhbGsgPSBtdXgtPmNvbGxlY3QtPmRhdGE7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0TWF0cm9za2FQYWQgKmNvbGxlY3RfcGFkOworCisgICAgY29sbGVjdF9wYWQgPSAoR3N0TWF0cm9za2FQYWQgKikgd2Fsay0+ZGF0YTsKKyAgICBpZiAoIWdzdF9tYXRyb3NrYV9tdXhfdGFnX2xpc3RfaXNfZW1wdHkgKGNvbGxlY3RfcGFkLT50YWdzKSkKKyAgICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9tdXhfd3JpdGVfdG9jX2VudHJ5X3RhZ3MgKEdzdE1hdHJvc2thTXV4ICogbXV4LAorICAgIGNvbnN0IEdzdFRvY0VudHJ5ICogZW50cnksIGd1aW50NjQgKiBtYXN0ZXJfdGFncywgZ2Jvb2xlYW4gKiBoYXNfdGFncykKK3sKKyAgZ3VpbnQ2NCBtYXN0ZXJfdGFnLCBtYXN0ZXJfdGFyZ2V0czsKKyAgR3N0RWJtbFdyaXRlICplYm1sOworICBHTGlzdCAqY3VyOworICBjb25zdCBHc3RUYWdMaXN0ICp0YWdzOworCisgIGVibWwgPSBtdXgtPmVibWxfd3JpdGU7CisKKyAgdGFncyA9IGdzdF90b2NfZW50cnlfZ2V0X3RhZ3MgKGVudHJ5KTsKKyAgaWYgKEdfVU5MSUtFTFkgKHRhZ3MgIT0gTlVMTCAmJiAhZ3N0X21hdHJvc2thX211eF90YWdfbGlzdF9pc19lbXB0eSAodGFncykpKSB7CisgICAgKmhhc190YWdzID0gVFJVRTsKKworICAgIGlmICgqbWFzdGVyX3RhZ3MgPT0gMCkgeworICAgICAgbXV4LT50YWdzX3BvcyA9IGVibWwtPnBvczsKKyAgICAgICptYXN0ZXJfdGFncyA9IGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RBR1MpOworICAgIH0KKworICAgIG1hc3Rlcl90YWcgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UQUcpOworICAgIG1hc3Rlcl90YXJnZXRzID0KKyAgICAgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfVEFSR0VUUyk7CisKKyAgICBpZiAoZ3N0X3RvY19lbnRyeV9nZXRfZW50cnlfdHlwZSAoZW50cnkpID09IEdTVF9UT0NfRU5UUllfVFlQRV9FRElUSU9OKQorICAgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RBUkdFVEVESVRJT05VSUQsCisgICAgICAgICAgZ19hc2NpaV9zdHJ0b3VsbCAoZ3N0X3RvY19lbnRyeV9nZXRfdWlkIChlbnRyeSksIE5VTEwsIDEwKSk7CisgICAgZWxzZQorICAgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1RBUkdFVENIQVBURVJVSUQsCisgICAgICAgICAgZ19hc2NpaV9zdHJ0b3VsbCAoZ3N0X3RvY19lbnRyeV9nZXRfdWlkIChlbnRyeSksIE5VTEwsIDEwKSk7CisKKyAgICBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfZmluaXNoIChlYm1sLCBtYXN0ZXJfdGFyZ2V0cyk7CisgICAgZ3N0X3RhZ19saXN0X2ZvcmVhY2ggKHRhZ3MsIGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfc2ltcGxlX3RhZywgZWJtbCk7CisgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgbWFzdGVyX3RhZyk7CisgIH0KKworICBmb3IgKGN1ciA9IGdzdF90b2NfZW50cnlfZ2V0X3N1Yl9lbnRyaWVzIChlbnRyeSk7IGN1ciAhPSBOVUxMOworICAgICAgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgZ3N0X21hdHJvc2thX211eF93cml0ZV90b2NfZW50cnlfdGFncyAobXV4LCBjdXItPmRhdGEsIG1hc3Rlcl90YWdzLAorICAgICAgICBoYXNfdGFncyk7CisgIH0KK30KKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X2ZpbmlzaDoKKyAqIEBtdXg6ICNHc3RNYXRyb3NrYU11eAorICoKKyAqIEZpbmlzaCBhIG5ldyBtYXRyb3NrYSBmaWxlICh3cml0ZSBpbmRleCBldGMuLi4pCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfbXV4X2ZpbmlzaCAoR3N0TWF0cm9za2FNdXggKiBtdXgpCit7CisgIEdzdEVibWxXcml0ZSAqZWJtbCA9IG11eC0+ZWJtbF93cml0ZTsKKyAgZ3VpbnQ2NCBwb3M7CisgIGd1aW50NjQgZHVyYXRpb24gPSAwOworICBHU0xpc3QgKmNvbGxlY3RlZDsKKyAgY29uc3QgR3N0VGFnTGlzdCAqdGFncywgKnRvY190YWdzOworICBjb25zdCBHc3RUb2MgKnRvYzsKKyAgZ2Jvb2xlYW4gaGFzX21haW5fdGFncywgdG9jX2hhc190YWdzID0gRkFMU0U7CisgIEdMaXN0ICpjdXI7CisKKyAgLyogZmluaXNoIGxhc3QgY2x1c3RlciAqLworICBpZiAobXV4LT5jbHVzdGVyKSB7CisgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgbXV4LT5jbHVzdGVyKTsKKyAgfQorCisgIC8qIGN1ZXMgKi8KKyAgaWYgKG11eC0+aW5kZXggIT0gTlVMTCkgeworICAgIGd1aW50IG47CisgICAgZ3VpbnQ2NCBtYXN0ZXIsIHBvaW50ZW50cnlfbWFzdGVyLCB0cmFja3Bvc19tYXN0ZXI7CisKKyAgICBtdXgtPmN1ZXNfcG9zID0gZWJtbC0+cG9zOworICAgIGdzdF9lYm1sX3dyaXRlX3NldF9jYWNoZSAoZWJtbCwgMTIgKyA0MSAqIG11eC0+bnVtX2luZGV4ZXMpOworICAgIG1hc3RlciA9IGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0NVRVMpOworCisgICAgZm9yIChuID0gMDsgbiA8IG11eC0+bnVtX2luZGV4ZXM7IG4rKykgeworICAgICAgR3N0TWF0cm9za2FJbmRleCAqaWR4ID0gJm11eC0+aW5kZXhbbl07CisKKyAgICAgIHBvaW50ZW50cnlfbWFzdGVyID0gZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChlYm1sLAorICAgICAgICAgIEdTVF9NQVRST1NLQV9JRF9QT0lOVEVOVFJZKTsKKyAgICAgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9DVUVUSU1FLAorICAgICAgICAgIGlkeC0+dGltZSAvIG11eC0+dGltZV9zY2FsZSk7CisgICAgICB0cmFja3Bvc19tYXN0ZXIgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsCisgICAgICAgICAgR1NUX01BVFJPU0tBX0lEX0NVRVRSQUNLUE9TSVRJT05TKTsKKyAgICAgIGdzdF9lYm1sX3dyaXRlX3VpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9DVUVUUkFDSywgaWR4LT50cmFjayk7CisgICAgICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfQ1VFQ0xVU1RFUlBPU0lUSU9OLAorICAgICAgICAgIGlkeC0+cG9zIC0gbXV4LT5zZWdtZW50X21hc3Rlcik7CisgICAgICBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfZmluaXNoIChlYm1sLCB0cmFja3Bvc19tYXN0ZXIpOworICAgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgcG9pbnRlbnRyeV9tYXN0ZXIpOworICAgIH0KKworICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIG1hc3Rlcik7CisgICAgZ3N0X2VibWxfd3JpdGVfZmx1c2hfY2FjaGUgKGVibWwsIEZBTFNFLCBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKyAgfQorCisgIC8qIHRhZ3MgKi8KKyAgdGFncyA9IGdzdF90YWdfc2V0dGVyX2dldF90YWdfbGlzdCAoR1NUX1RBR19TRVRURVIgKG11eCkpOworICBoYXNfbWFpbl90YWdzID0gdGFncyAhPSBOVUxMICYmICFnc3RfbWF0cm9za2FfbXV4X3RhZ19saXN0X2lzX2VtcHR5ICh0YWdzKTsKKyAgdG9jID0gZ3N0X3RvY19zZXR0ZXJfZ2V0X3RvYyAoR1NUX1RPQ19TRVRURVIgKG11eCkpOworCisgIGlmIChoYXNfbWFpbl90YWdzIHx8IGdzdF9tYXRyb3NrYV9tdXhfc3RyZWFtc19oYXZlX3RhZ3MgKG11eCkgfHwgdG9jICE9IE5VTEwpIHsKKyAgICBndWludDY0IG1hc3Rlcl90YWdzID0gMCwgbWFzdGVyX3RhZzsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgIldyaXRpbmcgdGFncyIpOworCisgICAgaWYgKGhhc19tYWluX3RhZ3MpIHsKKyAgICAgIC8qIFRPRE86IG1heWJlIGxpbWl0IHZpYSB0aGUgVEFSR0VUUyBpZCBieSBsb29raW5nIGF0IHRoZSBzb3VyY2UgcGFkICovCisgICAgICBtdXgtPnRhZ3NfcG9zID0gZWJtbC0+cG9zOworICAgICAgbWFzdGVyX3RhZ3MgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UQUdTKTsKKyAgICAgIG1hc3Rlcl90YWcgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UQUcpOworCisgICAgICBpZiAodGFncyAhPSBOVUxMKQorICAgICAgICBnc3RfdGFnX2xpc3RfZm9yZWFjaCAodGFncywgZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnLCBlYm1sKTsKKyAgICAgIGlmIChtdXgtPmludGVybmFsX3RvYyAhPSBOVUxMKSB7CisgICAgICAgIHRvY190YWdzID0gZ3N0X3RvY19nZXRfdGFncyAobXV4LT5pbnRlcm5hbF90b2MpOworICAgICAgICB0b2NfaGFzX3RhZ3MgPSAodG9jX3RhZ3MgIT0gTlVMTCk7CisgICAgICAgIGdzdF90YWdfbGlzdF9mb3JlYWNoICh0b2NfdGFncywgZ3N0X21hdHJvc2thX211eF93cml0ZV9zaW1wbGVfdGFnLAorICAgICAgICAgICAgZWJtbCk7CisgICAgICB9CisKKyAgICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIG1hc3Rlcl90YWcpOworICAgIH0KKworICAgIGlmIChtdXgtPmludGVybmFsX3RvYyAhPSBOVUxMKSB7CisgICAgICBmb3IgKGN1ciA9IGdzdF90b2NfZ2V0X2VudHJpZXMgKG11eC0+aW50ZXJuYWxfdG9jKTsgY3VyICE9IE5VTEw7CisgICAgICAgICAgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGdzdF9tYXRyb3NrYV9tdXhfd3JpdGVfdG9jX2VudHJ5X3RhZ3MgKG11eCwgY3VyLT5kYXRhLCAmbWFzdGVyX3RhZ3MsCisgICAgICAgICAgICAmdG9jX2hhc190YWdzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWFzdGVyX3RhZ3MgPT0gMCAmJiBnc3RfbWF0cm9za2FfbXV4X3N0cmVhbXNfaGF2ZV90YWdzIChtdXgpKSB7CisgICAgICBtdXgtPnRhZ3NfcG9zID0gZWJtbC0+cG9zOworICAgICAgbWFzdGVyX3RhZ3MgPSBnc3RfZWJtbF93cml0ZV9tYXN0ZXJfc3RhcnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9UQUdTKTsKKyAgICB9CisgICAgZ3N0X21hdHJvc2thX211eF93cml0ZV9zdHJlYW1zX3RhZ3MgKG11eCk7CisKKyAgICBpZiAobWFzdGVyX3RhZ3MgIT0gMCkKKyAgICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIG1hc3Rlcl90YWdzKTsKKyAgfQorCisgIC8qIHVwZGF0ZSBzZWVraGVhZC4gV2Uga25vdyB0aGF0OgorICAgKiAtIGEgc2Vla2hlYWQgY29udGFpbnMgNSBlbnRyaWVzLgorICAgKiAtIG9yZGVyIG9mIGVudHJpZXMgaXMgYXMgYWJvdmUuCisgICAqIC0gYSBzZWVraGVhZCBoYXMgYSA0LWJ5dGUgaGVhZGVyICsgOC1ieXRlIGxlbmd0aAorICAgKiAtIGVhY2ggZW50cnkgaXMgMi1ieXRlIG1hc3RlciwgMi1ieXRlIElEIHBvaW50ZXIsCisgICAqICAgICAyLWJ5dGUgbGVuZ3RoIHBvaW50ZXIsIGFsbCA4LzEtYnl0ZSBsZW5ndGgsIDQtCisgICAqICAgICBieXRlIElEIGFuZCA4LWJ5dGUgbGVuZ3RoIHBvaW50ZXIsIHdoZXJlIHRoZQorICAgKiAgICAgbGVuZ3RoIHBvaW50ZXIgc3RhcnRzIGF0IDIwLgorICAgKiAtIGFsbCBlbnRyaWVzIGFyZSBsb2NhbCB0byB0aGUgc2VnbWVudCAoc28gcG9zIC0gc2VnbWVudF9tYXN0ZXIpLgorICAgKiAtIHNvIGVhY2ggZW50cnkgaXMgYXQgMTIgKyAyMCArIG51bSAqIDI4LiAqLworICBnc3RfZWJtbF9yZXBsYWNlX3VpbnQgKGVibWwsIG11eC0+c2Vla2hlYWRfcG9zICsgMzIsCisgICAgICBtdXgtPmluZm9fcG9zIC0gbXV4LT5zZWdtZW50X21hc3Rlcik7CisgIGdzdF9lYm1sX3JlcGxhY2VfdWludCAoZWJtbCwgbXV4LT5zZWVraGVhZF9wb3MgKyA2MCwKKyAgICAgIG11eC0+dHJhY2tzX3BvcyAtIG11eC0+c2VnbWVudF9tYXN0ZXIpOworICBpZiAodG9jICE9IE5VTEwgJiYgbXV4LT5jaGFwdGVyc19wb3MgPiAwKSB7CisgICAgZ3N0X2VibWxfcmVwbGFjZV91aW50IChlYm1sLCBtdXgtPnNlZWtoZWFkX3BvcyArIDg4LAorICAgICAgICBtdXgtPmNoYXB0ZXJzX3BvcyAtIG11eC0+c2VnbWVudF9tYXN0ZXIpOworICB9IGVsc2UgeworICAgIC8qIHZvaWQnaWZ5ICovCisgICAgZ3VpbnQ2NCBteV9wb3MgPSBlYm1sLT5wb3M7CisKKyAgICBnc3RfZWJtbF93cml0ZV9zZWVrIChlYm1sLCBtdXgtPnNlZWtoZWFkX3BvcyArIDY4KTsKKyAgICBnc3RfZWJtbF93cml0ZV9idWZmZXJfaGVhZGVyIChlYm1sLCBHU1RfRUJNTF9JRF9WT0lELCAyNik7CisgICAgZ3N0X2VibWxfd3JpdGVfc2VlayAoZWJtbCwgbXlfcG9zKTsKKyAgfQorICBpZiAobXV4LT5pbmRleCAhPSBOVUxMKSB7CisgICAgZ3N0X2VibWxfcmVwbGFjZV91aW50IChlYm1sLCBtdXgtPnNlZWtoZWFkX3BvcyArIDExNiwKKyAgICAgICAgbXV4LT5jdWVzX3BvcyAtIG11eC0+c2VnbWVudF9tYXN0ZXIpOworICB9IGVsc2UgeworICAgIC8qIHZvaWQnaWZ5ICovCisgICAgZ3VpbnQ2NCBteV9wb3MgPSBlYm1sLT5wb3M7CisKKyAgICBnc3RfZWJtbF93cml0ZV9zZWVrIChlYm1sLCBtdXgtPnNlZWtoZWFkX3BvcyArIDk2KTsKKyAgICBnc3RfZWJtbF93cml0ZV9idWZmZXJfaGVhZGVyIChlYm1sLCBHU1RfRUJNTF9JRF9WT0lELCAyNik7CisgICAgZ3N0X2VibWxfd3JpdGVfc2VlayAoZWJtbCwgbXlfcG9zKTsKKyAgfQorCisgIGlmICh0YWdzICE9IE5VTEwgfHwgdG9jX2hhc190YWdzKSB7CisgICAgZ3N0X2VibWxfcmVwbGFjZV91aW50IChlYm1sLCBtdXgtPnNlZWtoZWFkX3BvcyArIDE0NCwKKyAgICAgICAgbXV4LT50YWdzX3BvcyAtIG11eC0+c2VnbWVudF9tYXN0ZXIpOworICB9IGVsc2UgeworICAgIC8qIHZvaWQnaWZ5ICovCisgICAgZ3VpbnQ2NCBteV9wb3MgPSBlYm1sLT5wb3M7CisKKyAgICBnc3RfZWJtbF93cml0ZV9zZWVrIChlYm1sLCBtdXgtPnNlZWtoZWFkX3BvcyArIDEyNCk7CisgICAgZ3N0X2VibWxfd3JpdGVfYnVmZmVyX2hlYWRlciAoZWJtbCwgR1NUX0VCTUxfSURfVk9JRCwgMjYpOworICAgIGdzdF9lYm1sX3dyaXRlX3NlZWsgKGVibWwsIG15X3Bvcyk7CisgIH0KKworICBpZiAodG9jICE9IE5VTEwpIHsKKyAgICBnc3RfdG9jX3VucmVmICh0b2MpOworICB9CisKKyAgLyogbG9vcCB0cmFja3M6CisgICAqIC0gZmlyc3QgZ2V0IHRoZSBvdmVyYWxsIGR1cmF0aW9uCisgICAqICAgKGEgcmVsZWFzZWQgdHJhY2sgbWF5IGhhdmUgbGVmdCBhIGR1cmF0aW9uIGluIGhlcmUpCisgICAqIC0gd3JpdGUgc29tZSB0cmFjayBoZWFkZXIgZGF0YSBmb3Igc3VidGl0bGVzCisgICAqLworICBkdXJhdGlvbiA9IG11eC0+ZHVyYXRpb247CisgIHBvcyA9IGVibWwtPnBvczsKKyAgZm9yIChjb2xsZWN0ZWQgPSBtdXgtPmNvbGxlY3QtPmRhdGE7IGNvbGxlY3RlZDsKKyAgICAgIGNvbGxlY3RlZCA9IGdfc2xpc3RfbmV4dCAoY29sbGVjdGVkKSkgeworICAgIEdzdE1hdHJvc2thUGFkICpjb2xsZWN0X3BhZDsKKyAgICAvKgorICAgICAqIG9ic2VydmVkIGR1cmF0aW9uLCB0aGlzIHdpbGwgbmV2ZXIgcmVtYWluIEdTVF9DTE9DS19USU1FX05PTkUKKyAgICAgKiBzaW5jZSB0aGlzIG1lYW5zIGJ1ZmZlciB3aXRob3V0IHRpbWVzdGFtcHMgdGhhdCBpcyBub3QgcG9zc2liaWxlCisgICAgICovCisgICAgR3N0Q2xvY2tUaW1lIGNvbGxlY3RlZF9kdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgICBjb2xsZWN0X3BhZCA9IChHc3RNYXRyb3NrYVBhZCAqKSBjb2xsZWN0ZWQtPmRhdGE7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChtdXgsCisgICAgICAgICJQYWQgJSIgR1NUX1BUUl9GT1JNQVQgIiBzdGFydCB0cyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgIiBlbmQgdHMgJSIgR1NUX1RJTUVfRk9STUFULCBjb2xsZWN0X3BhZCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoY29sbGVjdF9wYWQtPnN0YXJ0X3RzKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoY29sbGVjdF9wYWQtPmVuZF90cykpOworCisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChjb2xsZWN0X3BhZC0+c3RhcnRfdHMpICYmCisgICAgICAgIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChjb2xsZWN0X3BhZC0+ZW5kX3RzKSkgeworICAgICAgY29sbGVjdGVkX2R1cmF0aW9uID0KKyAgICAgICAgICBHU1RfQ0xPQ0tfRElGRiAoY29sbGVjdF9wYWQtPnN0YXJ0X3RzLCBjb2xsZWN0X3BhZC0+ZW5kX3RzKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbGxlY3RfcGFkLAorICAgICAgICAgICJmaW5hbCB0cmFjayBkdXJhdGlvbjogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGNvbGxlY3RlZF9kdXJhdGlvbikpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvbGxlY3RfcGFkLCAidW5hYmxlIHRvIGdldCBmaW5hbCB0cmFjayBkdXJhdGlvbiIpOworICAgIH0KKyAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGNvbGxlY3RlZF9kdXJhdGlvbikgJiYKKyAgICAgICAgZHVyYXRpb24gPCBjb2xsZWN0ZWRfZHVyYXRpb24pCisgICAgICBkdXJhdGlvbiA9IGNvbGxlY3RlZF9kdXJhdGlvbjsKKworICB9CisKKyAgLyogc2VlayBiYWNrIChvcHRpb25hbCwgYnV0IGRvIGFueXdheSkgKi8KKyAgZ3N0X2VibWxfd3JpdGVfc2VlayAoZWJtbCwgcG9zKTsKKworICAvKiB1cGRhdGUgZHVyYXRpb24gKi8KKyAgaWYgKGR1cmF0aW9uICE9IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJmaW5hbCB0b3RhbCBkdXJhdGlvbjogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChkdXJhdGlvbikpOworICAgIHBvcyA9IG11eC0+ZWJtbF93cml0ZS0+cG9zOworICAgIGdzdF9lYm1sX3dyaXRlX3NlZWsgKGVibWwsIG11eC0+ZHVyYXRpb25fcG9zKTsKKyAgICBnc3RfZWJtbF93cml0ZV9mbG9hdCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0RVUkFUSU9OLAorICAgICAgICBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChkdXJhdGlvbikgLworICAgICAgICBnc3RfZ3VpbnQ2NF90b19nZG91YmxlIChtdXgtPnRpbWVfc2NhbGUpKTsKKyAgICBnc3RfZWJtbF93cml0ZV9zZWVrIChlYm1sLCBwb3MpOworICB9IGVsc2UgeworICAgIC8qIHZvaWQnaWZ5ICovCisgICAgZ3VpbnQ2NCBteV9wb3MgPSBlYm1sLT5wb3M7CisKKyAgICBnc3RfZWJtbF93cml0ZV9zZWVrIChlYm1sLCBtdXgtPmR1cmF0aW9uX3Bvcyk7CisgICAgZ3N0X2VibWxfd3JpdGVfYnVmZmVyX2hlYWRlciAoZWJtbCwgR1NUX0VCTUxfSURfVk9JRCwgOCk7CisgICAgZ3N0X2VibWxfd3JpdGVfc2VlayAoZWJtbCwgbXlfcG9zKTsKKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJmaW5pc2hpbmcgc2VnbWVudCIpOworICAvKiBmaW5pc2ggc2VnbWVudCAtIHRoaXMgYWxzbyB3cml0ZXMgZWxlbWVudCBsZW5ndGggKi8KKyAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaCAoZWJtbCwgbXV4LT5zZWdtZW50X3Bvcyk7Cit9CisKKy8qKgorICogZ3N0X21hdHJvc2thX211eF9idWZmZXJfaGVhZGVyOgorICogQHRyYWNrOiBUcmFjayBjb250ZXh0LgorICogQHJlbGF0aXZlX3RpbWVzdGFtcDogcmVsYXRpdmUgdGltZXN0YW1wIG9mIHRoZSBidWZmZXIKKyAqIEBmbGFnczogQnVmZmVyIGZsYWdzLgorICoKKyAqIENyZWF0ZSBhIGJ1ZmZlciBjb250YWluaW5nIGJ1ZmZlciBoZWFkZXIuCisgKgorICogUmV0dXJuczogTmV3IGJ1ZmZlci4KKyAqLworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfbWF0cm9za2FfbXV4X2NyZWF0ZV9idWZmZXJfaGVhZGVyIChHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIHRyYWNrLAorICAgIGdpbnQxNiByZWxhdGl2ZV90aW1lc3RhbXAsIGludCBmbGFncykKK3sKKyAgR3N0QnVmZmVyICpoZHI7CisgIGd1aW50OCAqZGF0YSA9IGdfbWFsbG9jICg0KTsKKworICBoZHIgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChkYXRhLCA0KTsKKyAgLyogdHJhY2sgbnVtIC0gRklYTUU6IHdoYXQgaWYgbnVtID49IDB4ODAgKHVubGlrZWx5KT8gKi8KKyAgZGF0YVswXSA9IHRyYWNrLT5udW0gfCAweDgwOworICAvKiB0aW1lIHJlbGF0aXZlIHRvIGNsdXN0ZXJ0aW1lICovCisgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEgKyAxLCByZWxhdGl2ZV90aW1lc3RhbXApOworCisgIC8qIGZsYWdzICovCisgIGRhdGFbM10gPSBmbGFnczsKKworICByZXR1cm4gaGRyOworfQorCisjZGVmaW5lIERJUkFDX1BBUlNFX0NPREVfU0VRVUVOQ0VfSEVBREVSIDB4MDAKKyNkZWZpbmUgRElSQUNfUEFSU0VfQ09ERV9FTkRfT0ZfU0VRVUVOQ0UgMHgxMAorI2RlZmluZSBESVJBQ19QQVJTRV9DT0RFX0lTX1BJQ1RVUkUoeCkgKCh4ICYgMHgwOCkgIT0gMCkKKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfbWF0cm9za2FfbXV4X2hhbmRsZV9kaXJhY19wYWNrZXQgKEdzdE1hdHJvc2thTXV4ICogbXV4LAorICAgIEdzdE1hdHJvc2thUGFkICogY29sbGVjdF9wYWQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqY3R4ID0KKyAgICAgIChHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICopIGNvbGxlY3RfcGFkLT50cmFjazsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgc2l6ZTsKKyAgZ3VpbnQ4IHBhcnNlX2NvZGU7CisgIGd1aW50MzIgbmV4dF9wYXJzZV9vZmZzZXQ7CisgIEdzdEJ1ZmZlciAqcmV0ID0gTlVMTDsKKyAgZ2Jvb2xlYW4gaXNfbXV4aW5nX3VuaXQgPSBGQUxTRTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBkYXRhID0gbWFwLmRhdGE7CisgIHNpemUgPSBtYXAuc2l6ZTsKKworICBpZiAoc2l6ZSA8IDEzKSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICAvKiBDaGVjayBpZiB0aGlzIGJ1ZmZlciBjb250YWlucyBhIHBpY3R1cmUgb3IgZW5kLW9mLXNlcXVlbmNlIHBhY2tldCAqLworICB3aGlsZSAoc2l6ZSA+PSAxMykgeworICAgIGlmIChHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEpICE9IDB4NDI0MjQzNDQgLyogJ0JCQ0QnICovICkgeworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHBhcnNlX2NvZGUgPSBHU1RfUkVBRF9VSU5UOCAoZGF0YSArIDQpOworICAgIGlmIChwYXJzZV9jb2RlID09IERJUkFDX1BBUlNFX0NPREVfU0VRVUVOQ0VfSEVBREVSKSB7CisgICAgICBpZiAoY3R4LT5kaXJhY191bml0KSB7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGN0eC0+ZGlyYWNfdW5pdCk7CisgICAgICAgIGN0eC0+ZGlyYWNfdW5pdCA9IE5VTEw7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChESVJBQ19QQVJTRV9DT0RFX0lTX1BJQ1RVUkUgKHBhcnNlX2NvZGUpIHx8CisgICAgICAgIHBhcnNlX2NvZGUgPT0gRElSQUNfUEFSU0VfQ09ERV9FTkRfT0ZfU0VRVUVOQ0UpIHsKKyAgICAgIGlzX211eGluZ191bml0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIG5leHRfcGFyc2Vfb2Zmc2V0ID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhICsgNSk7CisKKyAgICBpZiAoR19VTkxJS0VMWSAobmV4dF9wYXJzZV9vZmZzZXQgPT0gMCB8fCBuZXh0X3BhcnNlX29mZnNldCA+IHNpemUpKQorICAgICAgYnJlYWs7CisKKyAgICBkYXRhICs9IG5leHRfcGFyc2Vfb2Zmc2V0OworICAgIHNpemUgLT0gbmV4dF9wYXJzZV9vZmZzZXQ7CisgIH0KKworICBpZiAoY3R4LT5kaXJhY191bml0KQorICAgIGN0eC0+ZGlyYWNfdW5pdCA9IGdzdF9idWZmZXJfYXBwZW5kIChjdHgtPmRpcmFjX3VuaXQsIGdzdF9idWZmZXJfcmVmIChidWYpKTsKKyAgZWxzZQorICAgIGN0eC0+ZGlyYWNfdW5pdCA9IGdzdF9idWZmZXJfcmVmIChidWYpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgaWYgKGlzX211eGluZ191bml0KSB7CisgICAgcmV0ID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChjdHgtPmRpcmFjX3VuaXQpOworICAgIGN0eC0+ZGlyYWNfdW5pdCA9IE5VTEw7CisgICAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKHJldCwgYnVmLAorICAgICAgICBHU1RfQlVGRkVSX0NPUFlfRkxBR1MgfCBHU1RfQlVGRkVSX0NPUFlfVElNRVNUQU1QUywgMCwgLTEpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIH0gZWxzZSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXQgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9tdXhfc3RvcF9zdHJlYW1oZWFkZXIgKEdzdE1hdHJvc2thTXV4ICogbXV4KQoreworICBHc3RDYXBzICpjYXBzOworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdWYWx1ZSBzdHJlYW1oZWFkZXIgPSB7IDAgfTsKKyAgR1ZhbHVlIGJ1ZnZhbCA9IHsgMCB9OworICBHc3RCdWZmZXIgKnN0cmVhbWhlYWRlcl9idWZmZXI7CisgIEdzdEVibWxXcml0ZSAqZWJtbCA9IG11eC0+ZWJtbF93cml0ZTsKKworICBzdHJlYW1oZWFkZXJfYnVmZmVyID0gZ3N0X2VibWxfc3RvcF9zdHJlYW1oZWFkZXIgKGVibWwpOworICBjYXBzID0gZ3N0X2NhcHNfY29weSAobXV4LT5lYm1sX3dyaXRlLT5jYXBzKTsKKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBnX3ZhbHVlX2luaXQgKCZzdHJlYW1oZWFkZXIsIEdTVF9UWVBFX0FSUkFZKTsKKyAgZ192YWx1ZV9pbml0ICgmYnVmdmFsLCBHU1RfVFlQRV9CVUZGRVIpOworICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChzdHJlYW1oZWFkZXJfYnVmZmVyLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKyAgZ3N0X3ZhbHVlX3NldF9idWZmZXIgKCZidWZ2YWwsIHN0cmVhbWhlYWRlcl9idWZmZXIpOworICBnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX3ZhbHVlICgmc3RyZWFtaGVhZGVyLCAmYnVmdmFsKTsKKyAgZ192YWx1ZV91bnNldCAoJmJ1ZnZhbCk7CisgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzLCAic3RyZWFtaGVhZGVyIiwgJnN0cmVhbWhlYWRlcik7CisgIGdfdmFsdWVfdW5zZXQgKCZzdHJlYW1oZWFkZXIpOworICBnc3RfY2Fwc19yZXBsYWNlICgmZWJtbC0+Y2FwcywgY2Fwcyk7CisgIGdzdF9idWZmZXJfdW5yZWYgKHN0cmVhbWhlYWRlcl9idWZmZXIpOworICBnc3RfcGFkX3NldF9jYXBzIChtdXgtPnNyY3BhZCwgY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKK30KKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X3dyaXRlX2RhdGE6CisgKiBAbXV4OiAjR3N0TWF0cm9za2FNdXgKKyAqIEBjb2xsZWN0X3BhZDogI0dzdE1hdHJvc2thUGFkIHdpdGggdGhlIGRhdGEKKyAqCisgKiBXcml0ZSBjb2xsZWN0ZWQgZGF0YSAoY2FsbGVkIGZyb20gZ3N0X21hdHJvc2thX211eF9jb2xsZWN0ZWQpLgorICoKKyAqIFJldHVybnM6IFJlc3VsdCBvZiB0aGUgZ3N0X3BhZF9wdXNoIGlzc3VlZCB0byB3cml0ZSB0aGUgZGF0YS4KKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9tdXhfd3JpdGVfZGF0YSAoR3N0TWF0cm9za2FNdXggKiBtdXgsIEdzdE1hdHJvc2thUGFkICogY29sbGVjdF9wYWQsCisgICAgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RFYm1sV3JpdGUgKmVibWwgPSBtdXgtPmVibWxfd3JpdGU7CisgIEdzdEJ1ZmZlciAqaGRyOworICBndWludDY0IGJsb2NrZ3JvdXA7CisgIGdib29sZWFuIHdyaXRlX2R1cmF0aW9uOworICBnaW50MTYgcmVsYXRpdmVfdGltZXN0YW1wOworICBnaW50NjQgcmVsYXRpdmVfdGltZXN0YW1wNjQ7CisgIGd1aW50NjQgYmxvY2tfZHVyYXRpb24sIGR1cmF0aW9uX2RpZmYgPSAwOworICBnYm9vbGVhbiBpc192aWRlb19rZXlmcmFtZSA9IEZBTFNFOworICBnYm9vbGVhbiBpc192aWRlb19pbnZpc2libGUgPSBGQUxTRTsKKyAgZ2Jvb2xlYW4gaXNfYXVkaW9fb25seSA9IEZBTFNFOworICBnYm9vbGVhbiBpc19taW5fZHVyYXRpb25fcmVhY2hlZCA9IEZBTFNFOworICBnYm9vbGVhbiBpc19tYXhfZHVyYXRpb25fZXhjZWVkZWQgPSBGQUxTRTsKKyAgR3N0TWF0cm9za2FtdXhQYWQgKnBhZDsKKyAgZ2ludCBmbGFncyA9IDA7CisgIEdzdENsb2NrVGltZSBidWZmZXJfdGltZXN0YW1wOworICBHc3RBdWRpb0NsaXBwaW5nTWV0YSAqY21ldGEgPSBOVUxMOworCisgIC8qIHdyaXRlIGRhdGEgKi8KKyAgcGFkID0gR1NUX01BVFJPU0tBTVVYX1BBRF9DQVNUIChjb2xsZWN0X3BhZC0+Y29sbGVjdC5wYWQpOworCisgIC8qIHZvcmJpcy90aGVvcmEgaGVhZGVycyBhcmUgcmV0cmlldmVkIGZyb20gY2FwcyBhbmQgcHV0IGluIENvZGVjUHJpdmF0ZSAqLworICBpZiAoY29sbGVjdF9wYWQtPnRyYWNrLT54aXBoX2hlYWRlcnNfdG9fc2tpcCA+IDApIHsKKyAgICAtLWNvbGxlY3RfcGFkLT50cmFjay0+eGlwaF9oZWFkZXJzX3RvX3NraXA7CisgICAgaWYgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0hFQURFUikpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChjb2xsZWN0X3BhZC0+Y29sbGVjdC5wYWQsICJkcm9wcGluZyBzdHJlYW1oZWFkZXIgYnVmZmVyIik7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgIH0KKyAgfQorCisgIC8qIGZvciBkaXJhYyB3ZSBoYXZlIHRvIHF1ZXVlIHVwIGV2ZXJ5dGhpbmcgdXAgdG8gYSBwaWN0dXJlIHVuaXQgKi8KKyAgaWYgKCFzdHJjbXAgKGNvbGxlY3RfcGFkLT50cmFjay0+Y29kZWNfaWQsIEdTVF9NQVRST1NLQV9DT0RFQ19JRF9WSURFT19ESVJBQykpIHsKKyAgICBidWYgPSBnc3RfbWF0cm9za2FfbXV4X2hhbmRsZV9kaXJhY19wYWNrZXQgKG11eCwgY29sbGVjdF9wYWQsIGJ1Zik7CisgICAgaWYgKCFidWYpCisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoY29sbGVjdF9wYWQtPnRyYWNrLT5jb2RlY19pZCwKKyAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fUFJPUkVTKSkgeworICAgIC8qIFJlbW92ZSB0aGUgJ0ZyYW1lIGNvbnRhaW5lciBhdG9tJyBoZWFkZXInICovCisgICAgYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChidWYpOworICAgIGdzdF9idWZmZXJfcmVzaXplIChidWYsIDgsIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikgLSA4KTsKKyAgfQorCisgIGJ1ZmZlcl90aW1lc3RhbXAgPQorICAgICAgZ3N0X21hdHJvc2thX3RyYWNrX2dldF9idWZmZXJfdGltZXN0YW1wIChjb2xsZWN0X3BhZC0+dHJhY2ssIGJ1Zik7CisKKyAgLyogaG0sIGludmFsaWQgdGltZXN0YW1wIChkdWUgdG8gLS10byBiZSBmaXhlZC0tLSBlbGVtZW50IHVwc3RyZWFtKTsKKyAgICogdGhpcyB3b3VsZCB3cmVhayBoYXZvYyB3aXRoIHRpbWUgc3RvcmVkIGluIG1hdHJvc2thIGZpbGUgKi8KKyAgLyogVE9ETzogbWF5YmUgY2FsY3VsYXRlIGEgdGltZXN0YW1wIGJ5IHVzaW5nIHRoZSBwcmV2aW91cyB0aW1lc3RhbXAKKyAgICogYW5kIGRlZmF1bHQgZHVyYXRpb24gKi8KKyAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoYnVmZmVyX3RpbWVzdGFtcCkpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvbGxlY3RfcGFkLT5jb2xsZWN0LnBhZCwKKyAgICAgICAgIkludmFsaWQgYnVmZmVyIHRpbWVzdGFtcDsgZHJvcHBpbmcgYnVmZmVyIik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICBpZiAoIXN0cmNtcCAoY29sbGVjdF9wYWQtPnRyYWNrLT5jb2RlY19pZCwgR1NUX01BVFJPU0tBX0NPREVDX0lEX0FVRElPX09QVVMpCisgICAgICAmJiBjb2xsZWN0X3BhZC0+dHJhY2stPmNvZGVjX2RlbGF5KSB7CisgICAgLyogQWxsIHRpbWVzdGFtcHMgc2hvdWxkIGluY2x1ZGUgdGhlIGNvZGVjIGRlbGF5ICovCisgICAgaWYgKGJ1ZmZlcl90aW1lc3RhbXAgPiBjb2xsZWN0X3BhZC0+dHJhY2stPmNvZGVjX2RlbGF5KSB7CisgICAgICBidWZmZXJfdGltZXN0YW1wICs9IGNvbGxlY3RfcGFkLT50cmFjay0+Y29kZWNfZGVsYXk7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1ZmZlcl90aW1lc3RhbXAgPSAwOworICAgICAgZHVyYXRpb25fZGlmZiA9IGNvbGxlY3RfcGFkLT50cmFjay0+Y29kZWNfZGVsYXkgLSBidWZmZXJfdGltZXN0YW1wOworICAgIH0KKyAgfQorCisgIC8qIHNldCB0aGUgdGltZXN0YW1wIGZvciBvdXRnb2luZyBidWZmZXJzICovCisgIGVibWwtPnRpbWVzdGFtcCA9IGJ1ZmZlcl90aW1lc3RhbXA7CisKKyAgaWYgKGNvbGxlY3RfcGFkLT50cmFjay0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9WSURFTykgeworICAgIGlmICghR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCkpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChtdXgsICJoYXZlIHZpZGVvIGtleWZyYW1lLCB0cz0lIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoYnVmZmVyX3RpbWVzdGFtcCkpOworICAgICAgaXNfdmlkZW9fa2V5ZnJhbWUgPSBUUlVFOworICAgIH0gZWxzZSBpZiAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVDT0RFX09OTFkpICYmCisgICAgICAgICghc3RyY21wIChjb2xsZWN0X3BhZC0+dHJhY2stPmNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fVlA4KQorICAgICAgICAgICAgfHwgIXN0cmNtcCAoY29sbGVjdF9wYWQtPnRyYWNrLT5jb2RlY19pZCwKKyAgICAgICAgICAgICAgICBHU1RfTUFUUk9TS0FfQ09ERUNfSURfVklERU9fVlA5KSkpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChtdXgsCisgICAgICAgICAgImhhdmUgVlA4IHZpZGVvIGludmlzaWJsZSBmcmFtZSwgIiAidHM9JSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGJ1ZmZlcl90aW1lc3RhbXApKTsKKyAgICAgIGlzX3ZpZGVvX2ludmlzaWJsZSA9IFRSVUU7CisgICAgfQorICB9CisKKyAgaXNfYXVkaW9fb25seSA9IChjb2xsZWN0X3BhZC0+dHJhY2stPnR5cGUgPT0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQVVESU8pICYmCisgICAgICAobXV4LT5udW1fc3RyZWFtcyA9PSAxKTsKKyAgaXNfbWluX2R1cmF0aW9uX3JlYWNoZWQgPSAobXV4LT5taW5fY2x1c3Rlcl9kdXJhdGlvbiA9PSAwCisgICAgICB8fCAoYnVmZmVyX3RpbWVzdGFtcCA+IG11eC0+Y2x1c3Rlcl90aW1lCisgICAgICAgICAgJiYgKGJ1ZmZlcl90aW1lc3RhbXAgLSBtdXgtPmNsdXN0ZXJfdGltZSkgPj0KKyAgICAgICAgICBtdXgtPm1pbl9jbHVzdGVyX2R1cmF0aW9uKSk7CisgIGlzX21heF9kdXJhdGlvbl9leGNlZWRlZCA9IChtdXgtPm1heF9jbHVzdGVyX2R1cmF0aW9uID4gMAorICAgICAgJiYgYnVmZmVyX3RpbWVzdGFtcCA+IG11eC0+Y2x1c3Rlcl90aW1lCisgICAgICAmJiAoYnVmZmVyX3RpbWVzdGFtcCAtIG11eC0+Y2x1c3Rlcl90aW1lKSA+PSBtdXgtPm1heF9jbHVzdGVyX2R1cmF0aW9uKTsKKworICBpZiAobXV4LT5jbHVzdGVyKSB7CisgICAgLyogc3RhcnQgYSBuZXcgY2x1c3RlciBhdCBldmVyeSBrZXlmcmFtZSwgYXQgZXZlcnkgR3N0Rm9yY2VLZXlVbml0IGV2ZW50LAorICAgICAqIG9yIHdoZW4gd2UgbWF5IGJlIHJlYWNoaW5nIHRoZSBsaW1pdCBvZiB0aGUgcmVsYXRpdmUgdGltZXN0YW1wICovCisgICAgaWYgKGlzX21heF9kdXJhdGlvbl9leGNlZWRlZCB8fCAoaXNfdmlkZW9fa2V5ZnJhbWUKKyAgICAgICAgICAgICYmIGlzX21pbl9kdXJhdGlvbl9yZWFjaGVkKSB8fCBtdXgtPmZvcmNlX2tleV91bml0X2V2ZW50CisgICAgICAgIHx8IChpc19hdWRpb19vbmx5ICYmIGlzX21pbl9kdXJhdGlvbl9yZWFjaGVkKSkgeworICAgICAgaWYgKCFtdXgtPmVibWxfd3JpdGUtPnN0cmVhbWFibGUpCisgICAgICAgIGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9maW5pc2ggKGVibWwsIG11eC0+Y2x1c3Rlcik7CisKKyAgICAgIC8qIEZvcndhcmQgdGhlIEdzdEZvcmNlS2V5VW5pdCBldmVudCBhZnRlciBmaW5pc2hpbmcgdGhlIGNsdXN0ZXIgKi8KKyAgICAgIGlmIChtdXgtPmZvcmNlX2tleV91bml0X2V2ZW50KSB7CisgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAobXV4LT5zcmNwYWQsIG11eC0+Zm9yY2Vfa2V5X3VuaXRfZXZlbnQpOworICAgICAgICBtdXgtPmZvcmNlX2tleV91bml0X2V2ZW50ID0gTlVMTDsKKyAgICAgIH0KKworICAgICAgbXV4LT5wcmV2X2NsdXN0ZXJfc2l6ZSA9IGVibWwtPnBvcyAtIG11eC0+Y2x1c3Rlcl9wb3M7CisgICAgICBtdXgtPmNsdXN0ZXJfcG9zID0gZWJtbC0+cG9zOworICAgICAgZ3N0X2VibWxfd3JpdGVfc2V0X2NhY2hlIChlYm1sLCAweDIwKTsKKyAgICAgIG11eC0+Y2x1c3RlciA9CisgICAgICAgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUik7CisgICAgICBnc3RfZWJtbF93cml0ZV91aW50IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUlRJTUVDT0RFLAorICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoYnVmZmVyX3RpbWVzdGFtcCwgMSwgbXV4LT50aW1lX3NjYWxlKSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAobXV4LCAiY2x1c3RlciB0aW1lc3RhbXAgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGJ1ZmZlcl90aW1lc3RhbXAsIDEsIG11eC0+dGltZV9zY2FsZSkpOworICAgICAgZ3N0X2VibWxfd3JpdGVfZmx1c2hfY2FjaGUgKGVibWwsIFRSVUUsIGJ1ZmZlcl90aW1lc3RhbXApOworICAgICAgbXV4LT5jbHVzdGVyX3RpbWUgPSBidWZmZXJfdGltZXN0YW1wOworICAgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX1BSRVZTSVpFLAorICAgICAgICAgIG11eC0+cHJldl9jbHVzdGVyX3NpemUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBmaXJzdCBjbHVzdGVyICovCisKKyAgICBtdXgtPmNsdXN0ZXJfcG9zID0gZWJtbC0+cG9zOworICAgIGdzdF9lYm1sX3dyaXRlX3NldF9jYWNoZSAoZWJtbCwgMHgyMCk7CisgICAgbXV4LT5jbHVzdGVyID0gZ3N0X2VibWxfd3JpdGVfbWFzdGVyX3N0YXJ0IChlYm1sLCBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUik7CisgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0NMVVNURVJUSU1FQ09ERSwKKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChidWZmZXJfdGltZXN0YW1wLCAxLCBtdXgtPnRpbWVfc2NhbGUpKTsKKyAgICBnc3RfZWJtbF93cml0ZV9mbHVzaF9jYWNoZSAoZWJtbCwgVFJVRSwgYnVmZmVyX3RpbWVzdGFtcCk7CisgICAgbXV4LT5jbHVzdGVyX3RpbWUgPSBidWZmZXJfdGltZXN0YW1wOworICB9CisKKyAgLyogV2UgY3VycmVudGx5IHdyaXRlIGluZGV4IGVudHJpZXMgZm9yIGFsbCB2aWRlbyB0cmFja3Mgb3IgZm9yIHRoZSBhdWRpbworICAgKiB0cmFjayBpbiBhIHNpbmdsZS10cmFjayBhdWRpbyBmaWxlLiAgVGhpcyBjb3VsZCBiZSBpbXByb3ZlZCBieSBrZWVwaW5nIHRoZQorICAgKiBpbmRleCBvbmx5IGZvciB0aGUgKmZpcnN0KiB2aWRlbyB0cmFjay4gKi8KKworICAvKiBUT0RPOiBpbmRleCBpcyB1c2VmdWwgZm9yIGV2ZXJ5IHRyYWNrLCBzaG91bGQgY29udGFpbiB0aGUgbnVtYmVyIG9mCisgICAqIHRoZSBibG9jayBpbiB0aGUgY2x1c3RlciB3aGljaCBjb250YWlucyB0aGUgdGltZXN0YW1wLCBzaG91bGQgYWxzbyB3b3JrCisgICAqIGZvciBmaWxlcyB3aXRoIG11bHRpcGxlIGF1ZGlvIHRyYWNrcy4KKyAgICovCisgIGlmICghbXV4LT5lYm1sX3dyaXRlLT5zdHJlYW1hYmxlICYmIChpc192aWRlb19rZXlmcmFtZSB8fCBpc19hdWRpb19vbmx5KSkgeworICAgIGdpbnQgbGFzdF9pZHggPSAtMTsKKworICAgIGlmIChtdXgtPm1pbl9pbmRleF9pbnRlcnZhbCAhPSAwKSB7CisgICAgICBmb3IgKGxhc3RfaWR4ID0gbXV4LT5udW1faW5kZXhlcyAtIDE7IGxhc3RfaWR4ID49IDA7IGxhc3RfaWR4LS0pIHsKKyAgICAgICAgaWYgKG11eC0+aW5kZXhbbGFzdF9pZHhdLnRyYWNrID09IGNvbGxlY3RfcGFkLT50cmFjay0+bnVtKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChsYXN0X2lkeCA8IDAgfHwgbXV4LT5taW5faW5kZXhfaW50ZXJ2YWwgPT0gMCB8fAorICAgICAgICAoR1NUX0NMT0NLX0RJRkYgKG11eC0+aW5kZXhbbGFzdF9pZHhdLnRpbWUsIGJ1ZmZlcl90aW1lc3RhbXApCisgICAgICAgICAgICA+PSBtdXgtPm1pbl9pbmRleF9pbnRlcnZhbCkpIHsKKyAgICAgIEdzdE1hdHJvc2thSW5kZXggKmlkeDsKKworICAgICAgaWYgKG11eC0+bnVtX2luZGV4ZXMgJSAzMiA9PSAwKSB7CisgICAgICAgIG11eC0+aW5kZXggPSBnX3JlbmV3IChHc3RNYXRyb3NrYUluZGV4LCBtdXgtPmluZGV4LAorICAgICAgICAgICAgbXV4LT5udW1faW5kZXhlcyArIDMyKTsKKyAgICAgIH0KKyAgICAgIGlkeCA9ICZtdXgtPmluZGV4W211eC0+bnVtX2luZGV4ZXMrK107CisKKyAgICAgIGlkeC0+cG9zID0gbXV4LT5jbHVzdGVyX3BvczsKKyAgICAgIGlkeC0+dGltZSA9IGJ1ZmZlcl90aW1lc3RhbXA7CisgICAgICBpZHgtPnRyYWNrID0gY29sbGVjdF9wYWQtPnRyYWNrLT5udW07CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgaWYgdGhlIGR1cmF0aW9uIGRpZmZlcnMgZnJvbSB0aGUgZGVmYXVsdCBkdXJhdGlvbi4gKi8KKyAgd3JpdGVfZHVyYXRpb24gPSBGQUxTRTsKKyAgYmxvY2tfZHVyYXRpb24gPSAwOworICBpZiAocGFkLT5mcmFtZV9kdXJhdGlvbiAmJiBHU1RfQlVGRkVSX0RVUkFUSU9OX0lTX1ZBTElEIChidWYpKSB7CisgICAgYmxvY2tfZHVyYXRpb24gPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpICsgZHVyYXRpb25fZGlmZjsKKyAgICBibG9ja19kdXJhdGlvbiA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoYmxvY2tfZHVyYXRpb24sIDEsIG11eC0+dGltZV9zY2FsZSk7CisKKyAgICAvKiBzbWFsbCBkaWZmZXJlbmNlIHNob3VsZCBiZSBvay4gKi8KKyAgICBpZiAoYmxvY2tfZHVyYXRpb24gPiBjb2xsZWN0X3BhZC0+ZGVmYXVsdF9kdXJhdGlvbl9zY2FsZWQgKyAxIHx8CisgICAgICAgIGJsb2NrX2R1cmF0aW9uIDwgY29sbGVjdF9wYWQtPmRlZmF1bHRfZHVyYXRpb25fc2NhbGVkIC0gMSkgeworICAgICAgd3JpdGVfZHVyYXRpb24gPSBUUlVFOworICAgIH0KKyAgfQorCisgIC8qIHdyaXRlIHRoZSBibG9jaywgZm9yIGRvY3R5cGUgdjIgdXNlIFNpbXBsZUJsb2NrIGlmIHBvc3NpYmxlCisgICAqIG9uZSBzbGljZSAoKmJyZWF0aCopLgorICAgKiBGSVhNRTogTmVlZCB0byBkbyBjb3JyZWN0IGxhY2luZyEgKi8KKyAgcmVsYXRpdmVfdGltZXN0YW1wNjQgPSBidWZmZXJfdGltZXN0YW1wIC0gbXV4LT5jbHVzdGVyX3RpbWU7CisgIGlmIChyZWxhdGl2ZV90aW1lc3RhbXA2NCA+PSAwKSB7CisgICAgLyogcm91bmQgdGhlIHRpbWVzdGFtcCAqLworICAgIHJlbGF0aXZlX3RpbWVzdGFtcDY0ICs9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAobXV4LT50aW1lX3NjYWxlLCAxLCAyKTsKKyAgICByZWxhdGl2ZV90aW1lc3RhbXAgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHJlbGF0aXZlX3RpbWVzdGFtcDY0LCAxLAorICAgICAgICBtdXgtPnRpbWVfc2NhbGUpOworICB9IGVsc2UgeworICAgIC8qIHJvdW5kIHRoZSB0aW1lc3RhbXAgKi8KKyAgICByZWxhdGl2ZV90aW1lc3RhbXA2NCAtPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKG11eC0+dGltZV9zY2FsZSwgMSwgMik7CisgICAgcmVsYXRpdmVfdGltZXN0YW1wID0KKyAgICAgICAgLSgoZ2ludDE2KSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKC1yZWxhdGl2ZV90aW1lc3RhbXA2NCwgMSwKKyAgICAgICAgICAgIG11eC0+dGltZV9zY2FsZSkpOworICB9CisKKyAgaWYgKGlzX3ZpZGVvX2ludmlzaWJsZSkKKyAgICBmbGFncyB8PSAweDA4OworCisgIGlmICghc3RyY21wIChjb2xsZWN0X3BhZC0+dHJhY2stPmNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fT1BVUykpIHsKKyAgICBjbWV0YSA9IGdzdF9idWZmZXJfZ2V0X2F1ZGlvX2NsaXBwaW5nX21ldGEgKGJ1Zik7CisgICAgZ19hc3NlcnQgKCFjbWV0YSB8fCBjbWV0YS0+Zm9ybWF0ID09IEdTVF9GT1JNQVRfREVGQVVMVCk7CisKKyAgICAvKiBTdGFydCBjbGlwcGluZyBpcyBkb25lIHZpYSBoZWFkZXIgYW5kIENvZGVjRGVsYXkgKi8KKyAgICBpZiAoY21ldGEgJiYgIWNtZXRhLT5lbmQpCisgICAgICBjbWV0YSA9IE5VTEw7CisgIH0KKworICBpZiAobXV4LT5kb2N0eXBlX3ZlcnNpb24gPiAxICYmICF3cml0ZV9kdXJhdGlvbiAmJiAhY21ldGEpIHsKKyAgICBpZiAoaXNfdmlkZW9fa2V5ZnJhbWUpCisgICAgICBmbGFncyB8PSAweDgwOworCisgICAgaGRyID0KKyAgICAgICAgZ3N0X21hdHJvc2thX211eF9jcmVhdGVfYnVmZmVyX2hlYWRlciAoY29sbGVjdF9wYWQtPnRyYWNrLAorICAgICAgICByZWxhdGl2ZV90aW1lc3RhbXAsIGZsYWdzKTsKKyAgICBnc3RfZWJtbF93cml0ZV9zZXRfY2FjaGUgKGVibWwsIDB4NDApOworICAgIGdzdF9lYm1sX3dyaXRlX2J1ZmZlcl9oZWFkZXIgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9TSU1QTEVCTE9DSywKKyAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSArIGdzdF9idWZmZXJfZ2V0X3NpemUgKGhkcikpOworICAgIGdzdF9lYm1sX3dyaXRlX2J1ZmZlciAoZWJtbCwgaGRyKTsKKyAgICBnc3RfZWJtbF93cml0ZV9mbHVzaF9jYWNoZSAoZWJtbCwgRkFMU0UsIGJ1ZmZlcl90aW1lc3RhbXApOworICAgIGdzdF9lYm1sX3dyaXRlX2J1ZmZlciAoZWJtbCwgYnVmKTsKKworICAgIHJldHVybiBnc3RfZWJtbF9sYXN0X3dyaXRlX3Jlc3VsdCAoZWJtbCk7CisgIH0gZWxzZSB7CisgICAgZ3N0X2VibWxfd3JpdGVfc2V0X2NhY2hlIChlYm1sLCBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpICogMik7CisgICAgLyogd3JpdGUgYW5kIGNhbGwgb3JkZXIgc2xpZ2h0bHkgdW5uYXR1cmFsLAorICAgICAqIGJ1dCBhdm9pZHMgc2VlayBhbmQgbWluaXplcyBwdXNoaW5nICovCisgICAgYmxvY2tncm91cCA9IGdzdF9lYm1sX3dyaXRlX21hc3Rlcl9zdGFydCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0JMT0NLR1JPVVApOworICAgIGhkciA9CisgICAgICAgIGdzdF9tYXRyb3NrYV9tdXhfY3JlYXRlX2J1ZmZlcl9oZWFkZXIgKGNvbGxlY3RfcGFkLT50cmFjaywKKyAgICAgICAgcmVsYXRpdmVfdGltZXN0YW1wLCBmbGFncyk7CisgICAgaWYgKHdyaXRlX2R1cmF0aW9uKQorICAgICAgZ3N0X2VibWxfd3JpdGVfdWludCAoZWJtbCwgR1NUX01BVFJPU0tBX0lEX0JMT0NLRFVSQVRJT04sIGJsb2NrX2R1cmF0aW9uKTsKKworICAgIGlmICghc3RyY21wIChjb2xsZWN0X3BhZC0+dHJhY2stPmNvZGVjX2lkLCBHU1RfTUFUUk9TS0FfQ09ERUNfSURfQVVESU9fT1BVUykKKyAgICAgICAgJiYgY21ldGEpIHsKKyAgICAgIC8qIFN0YXJ0IGNsaXBwaW5nIGlzIGRvbmUgdmlhIGhlYWRlciBhbmQgQ29kZWNEZWxheSAqLworICAgICAgaWYgKGNtZXRhLT5lbmQpIHsKKyAgICAgICAgZ3VpbnQ2NCBlbmQgPQorICAgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX3JvdW5kIChjbWV0YS0+ZW5kLCBHU1RfU0VDT05ELCA0ODAwMCk7CisgICAgICAgIGdzdF9lYm1sX3dyaXRlX3NpbnQgKGVibWwsIEdTVF9NQVRST1NLQV9JRF9ESVNDQVJEUEFERElORywgZW5kKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnc3RfZWJtbF93cml0ZV9idWZmZXJfaGVhZGVyIChlYm1sLCBHU1RfTUFUUk9TS0FfSURfQkxPQ0ssCisgICAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikgKyBnc3RfYnVmZmVyX2dldF9zaXplIChoZHIpKTsKKyAgICBnc3RfZWJtbF93cml0ZV9idWZmZXIgKGVibWwsIGhkcik7CisgICAgZ3N0X2VibWxfd3JpdGVfbWFzdGVyX2ZpbmlzaF9mdWxsIChlYm1sLCBibG9ja2dyb3VwLAorICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpKTsKKyAgICBnc3RfZWJtbF93cml0ZV9mbHVzaF9jYWNoZSAoZWJtbCwgRkFMU0UsIGJ1ZmZlcl90aW1lc3RhbXApOworICAgIGdzdF9lYm1sX3dyaXRlX2J1ZmZlciAoZWJtbCwgYnVmKTsKKworICAgIHJldHVybiBnc3RfZWJtbF9sYXN0X3dyaXRlX3Jlc3VsdCAoZWJtbCk7CisgIH0KK30KKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X2hhbmRsZV9idWZmZXI6CisgKiBAcGFkczogI0dzdENvbGxlY3RQYWRzCisgKiBAdXVzZXJfZGF0YTogI0dzdE1hdHJvc2thTXV4CisgKgorICogQ29sbGVjdHBhZHMgY2FsbGJhY2suCisgKgorICogUmV0dXJuczogI0dzdEZsb3dSZXR1cm4KKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9tdXhfaGFuZGxlX2J1ZmZlciAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLCBHc3RDb2xsZWN0RGF0YSAqIGRhdGEsCisgICAgR3N0QnVmZmVyICogYnVmLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdENsb2NrVGltZSBidWZmZXJfdGltZXN0YW1wOworICBHc3RNYXRyb3NrYU11eCAqbXV4ID0gR1NUX01BVFJPU0tBX01VWCAodXNlcl9kYXRhKTsKKyAgR3N0RWJtbFdyaXRlICplYm1sID0gbXV4LT5lYm1sX3dyaXRlOworICBHc3RNYXRyb3NrYVBhZCAqYmVzdCA9IChHc3RNYXRyb3NrYVBhZCAqKSBkYXRhOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJDb2xsZWN0ZWQgcGFkcyIpOworCisgIC8qIHN0YXJ0IHdpdGggYSBoZWFkZXIgKi8KKyAgaWYgKG11eC0+c3RhdGUgPT0gR1NUX01BVFJPU0tBX01VWF9TVEFURV9TVEFSVCkgeworICAgIGlmIChtdXgtPmNvbGxlY3QtPmRhdGEgPT0gTlVMTCkgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKG11eCwgU1RSRUFNLCBNVVgsIChOVUxMKSwKKyAgICAgICAgICAoIk5vIGlucHV0IHN0cmVhbXMgY29uZmlndXJlZCIpKTsKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgICB9CisgICAgbXV4LT5zdGF0ZSA9IEdTVF9NQVRST1NLQV9NVVhfU1RBVEVfSEVBREVSOworICAgIGdzdF9lYm1sX3N0YXJ0X3N0cmVhbWhlYWRlciAoZWJtbCk7CisgICAgZ3N0X21hdHJvc2thX211eF9zdGFydCAobXV4LCBiZXN0LCBidWYpOworICAgIGdzdF9tYXRyb3NrYV9tdXhfc3RvcF9zdHJlYW1oZWFkZXIgKG11eCk7CisgICAgbXV4LT5zdGF0ZSA9IEdTVF9NQVRST1NLQV9NVVhfU1RBVEVfREFUQTsKKyAgfQorCisgIC8qIGlmIHRoZXJlIGlzIG5vIGJlc3QgcGFkLCB3ZSBoYXZlIHJlYWNoZWQgRU9TICovCisgIGlmIChiZXN0ID09IE5VTEwpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICJObyBiZXN0IHBhZC4gRmluaXNoaW5nLi4uIik7CisgICAgaWYgKCFtdXgtPmVibWxfd3JpdGUtPnN0cmVhbWFibGUpIHsKKyAgICAgIGdzdF9tYXRyb3NrYV9tdXhfZmluaXNoIChtdXgpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChtdXgsICIuLi4gYnV0IHN0cmVhbWFibGUsIG5vdGhpbmcgdG8gZmluaXNoIik7CisgICAgfQorICAgIGdzdF9wYWRfcHVzaF9ldmVudCAobXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FT1M7CisgICAgZ290byBleGl0OworICB9CisKKyAgaWYgKGJlc3QtPnRyYWNrLT5jb2RlY19pZCA9PSBOVUxMKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoYmVzdC0+Y29sbGVjdC5wYWQsICJObyBjb2RlYy1pZCBmb3IgcGFkIik7CisgICAgcmV0ID0gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgICAgZ290byBleGl0OworICB9CisKKyAgLyogaWYgd2UgaGF2ZSBhIGJlc3Qgc3RyZWFtLCBzaG91bGQgYWxzbyBoYXZlIGEgYnVmZmVyICovCisgIGdfYXNzZXJ0IChidWYpOworCisgIGJ1ZmZlcl90aW1lc3RhbXAgPSBnc3RfbWF0cm9za2FfdHJhY2tfZ2V0X2J1ZmZlcl90aW1lc3RhbXAgKGJlc3QtPnRyYWNrLCBidWYpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGJlc3QtPmNvbGxlY3QucGFkLCAiYmVzdCBwYWQgLSBidWZmZXIgdHMgJSIKKyAgICAgIEdTVF9USU1FX0ZPUk1BVCAiIGR1ciAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChidWZmZXJfdGltZXN0YW1wKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikpKTsKKworICAvKiBtYWtlIG5vdGUgb2YgZmlyc3QgYW5kIGxhc3QgZW5jb3VudGVyZWQgdGltZXN0YW1wcywgc28gd2UgY2FuIGNhbGN1bGF0ZQorICAgKiB0aGUgYWN0dWFsIGR1cmF0aW9uIGxhdGVyIHdoZW4gd2Ugc2VuZCBhbiB1cGRhdGVkIGhlYWRlciBvbiBlb3MgKi8KKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChidWZmZXJfdGltZXN0YW1wKSkgeworICAgIEdzdENsb2NrVGltZSBzdGFydF90cyA9IGJ1ZmZlcl90aW1lc3RhbXA7CisgICAgR3N0Q2xvY2tUaW1lIGVuZF90cyA9IHN0YXJ0X3RzOworCisgICAgaWYgKEdTVF9CVUZGRVJfRFVSQVRJT05fSVNfVkFMSUQgKGJ1ZikpCisgICAgICBlbmRfdHMgKz0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKTsKKyAgICBlbHNlIGlmIChiZXN0LT50cmFjay0+ZGVmYXVsdF9kdXJhdGlvbikKKyAgICAgIGVuZF90cyArPSBiZXN0LT50cmFjay0+ZGVmYXVsdF9kdXJhdGlvbjsKKworICAgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGJlc3QtPmVuZF90cykgfHwgZW5kX3RzID4gYmVzdC0+ZW5kX3RzKQorICAgICAgYmVzdC0+ZW5kX3RzID0gZW5kX3RzOworCisgICAgaWYgKEdfVU5MSUtFTFkgKGJlc3QtPnN0YXJ0X3RzID09IEdTVF9DTE9DS19USU1FX05PTkUgfHwKKyAgICAgICAgICAgIHN0YXJ0X3RzIDwgYmVzdC0+c3RhcnRfdHMpKQorICAgICAgYmVzdC0+c3RhcnRfdHMgPSBzdGFydF90czsKKyAgfQorCisgIC8qIHdyaXRlIG9uZSBidWZmZXIgKi8KKyAgcmV0ID0gZ3N0X21hdHJvc2thX211eF93cml0ZV9kYXRhIChtdXgsIGJlc3QsIGJ1Zik7CisKK2V4aXQ6CisgIHJldHVybiByZXQ7Cit9CisKKworLyoqCisgKiBnc3RfbWF0cm9za2FfbXV4X2NoYW5nZV9zdGF0ZToKKyAqIEBlbGVtZW50OiAjR3N0TWF0cm9za2FNdXgKKyAqIEB0cmFuc2l0aW9uOiBTdGF0ZSBjaGFuZ2UgdHJhbnNpdGlvbi4KKyAqCisgKiBDaGFuZ2UgdGhlIG11eGVyIHN0YXRlLgorICoKKyAqIFJldHVybnM6ICNHc3RTdGF0ZUNoYW5nZVJldHVybgorICovCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9tYXRyb3NrYV9tdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RNYXRyb3NrYU11eCAqbXV4ID0gR1NUX01BVFJPU0tBX01VWCAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X2NvbGxlY3RfcGFkc19zdGFydCAobXV4LT5jb2xsZWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUExBWUlORzoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfY29sbGVjdF9wYWRzX3N0b3AgKG11eC0+Y29sbGVjdCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUExBWUlOR19UT19QQVVTRUQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X21hdHJvc2thX211eF9yZXNldCAoR1NUX0VMRU1FTlQgKG11eCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX211eF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0TWF0cm9za2FNdXggKm11eDsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfTUFUUk9TS0FfTVVYIChvYmplY3QpKTsKKyAgbXV4ID0gR1NUX01BVFJPU0tBX01VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfV1JJVElOR19BUFA6CisgICAgICBpZiAoIWdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAid3JpdGluZy1hcHAgcHJvcGVydHkgY2FuIG5vdCBiZSBOVUxMIik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZ19mcmVlIChtdXgtPndyaXRpbmdfYXBwKTsKKyAgICAgIG11eC0+d3JpdGluZ19hcHAgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ET0NUWVBFX1ZFUlNJT046CisgICAgICBtdXgtPmRvY3R5cGVfdmVyc2lvbiA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01JTl9JTkRFWF9JTlRFUlZBTDoKKyAgICAgIG11eC0+bWluX2luZGV4X2ludGVydmFsID0gZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVFJFQU1BQkxFOgorICAgICAgbXV4LT5lYm1sX3dyaXRlLT5zdHJlYW1hYmxlID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RJTUVDT0RFU0NBTEU6CisgICAgICBtdXgtPnRpbWVfc2NhbGUgPSBnX3ZhbHVlX2dldF9pbnQ2NCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01JTl9DTFVTVEVSX0RVUkFUSU9OOgorICAgICAgbXV4LT5taW5fY2x1c3Rlcl9kdXJhdGlvbiA9IGdfdmFsdWVfZ2V0X2ludDY0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX0NMVVNURVJfRFVSQVRJT046CisgICAgICBtdXgtPm1heF9jbHVzdGVyX2R1cmF0aW9uID0gZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9tdXhfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE1hdHJvc2thTXV4ICptdXg7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX01BVFJPU0tBX01VWCAob2JqZWN0KSk7CisgIG11eCA9IEdTVF9NQVRST1NLQV9NVVggKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1dSSVRJTkdfQVBQOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgbXV4LT53cml0aW5nX2FwcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRE9DVFlQRV9WRVJTSU9OOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgbXV4LT5kb2N0eXBlX3ZlcnNpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01JTl9JTkRFWF9JTlRFUlZBTDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludDY0ICh2YWx1ZSwgbXV4LT5taW5faW5kZXhfaW50ZXJ2YWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUUkVBTUFCTEU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgbXV4LT5lYm1sX3dyaXRlLT5zdHJlYW1hYmxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USU1FQ09ERVNDQUxFOgorICAgICAgZ192YWx1ZV9zZXRfaW50NjQgKHZhbHVlLCBtdXgtPnRpbWVfc2NhbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01JTl9DTFVTVEVSX0RVUkFUSU9OOgorICAgICAgZ192YWx1ZV9zZXRfaW50NjQgKHZhbHVlLCBtdXgtPm1pbl9jbHVzdGVyX2R1cmF0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfQ0xVU1RFUl9EVVJBVElPTjoKKyAgICAgIGdfdmFsdWVfc2V0X2ludDY0ICh2YWx1ZSwgbXV4LT5tYXhfY2x1c3Rlcl9kdXJhdGlvbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmggYi9nc3QvbWF0cm9za2EvbWF0cm9za2EtbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4Mzg0MAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1tdXguaApAQCAtMCwwICsxLDE1NiBAQAorLyogR1N0cmVhbWVyIE1hdHJvc2thIG11eGVyL2RlbXV4ZXIKKyAqIChjKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqIChjKSAyMDA1IE1pY2hhbCBCZW5lcyA8bWljaGFsLmJlbmVzQHhlcmlzLmN6PgorICoKKyAqIG1hdHJvc2thLW11eC5oOiBtYXRyb3NrYSBmaWxlL3N0cmVhbSBtdXhlciBvYmplY3QgdHlwZXMKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX01BVFJPU0tBX01VWF9IX18KKyNkZWZpbmUgX19HU1RfTUFUUk9TS0FfTVVYX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGNvbGxlY3RwYWRzLmg+CisKKyNpbmNsdWRlICJlYm1sLXdyaXRlLmgiCisjaW5jbHVkZSAibWF0cm9za2EtaWRzLmgiCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9NQVRST1NLQV9NVVggXAorICAoZ3N0X21hdHJvc2thX211eF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX01BVFJPU0tBX01VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfTUFUUk9TS0FfTVVYLCBHc3RNYXRyb3NrYU11eCkpCisjZGVmaW5lIEdTVF9NQVRST1NLQV9NVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9NQVRST1NLQV9NVVgsIEdzdE1hdHJvc2thTXV4Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfTUFUUk9TS0FfTVVYKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9NQVRST1NLQV9NVVgpKQorI2RlZmluZSBHU1RfSVNfTUFUUk9TS0FfTVVYX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfTUFUUk9TS0FfTVVYKSkKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX01BVFJPU0tBX01VWF9TVEFURV9TVEFSVCwKKyAgR1NUX01BVFJPU0tBX01VWF9TVEFURV9IRUFERVIsCisgIEdTVF9NQVRST1NLQV9NVVhfU1RBVEVfREFUQSwKK30gR3N0TWF0cm9za2FNdXhTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1hdHJvc2thTWV0YVNlZWtJbmRleCB7CisgIGd1aW50MzIgIGlkOworICBndWludDY0ICBwb3M7Cit9IEdzdE1hdHJvc2thTWV0YVNlZWtJbmRleDsKKwordHlwZWRlZiBnYm9vbGVhbiAoKkdzdE1hdHJvc2thQ2Fwc0Z1bmMpIChHc3RQYWQgKnBhZCwgR3N0Q2FwcyAqY2Fwcyk7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RNYXRyb3NrYU11eCBHc3RNYXRyb3NrYU11eDsKKworLyogYWxsIGluZm9ybWF0aW9uIG5lZWRlZCBmb3Igb25lIG1hdHJvc2thIHN0cmVhbSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0Q29sbGVjdERhdGEgY29sbGVjdDsgICAgICAgLyogd2UgZXh0ZW5kIHRoZSBDb2xsZWN0RGF0YSAqLworICBHc3RNYXRyb3NrYUNhcHNGdW5jIGNhcHNmdW5jOworICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqdHJhY2s7CisKKyAgR3N0TWF0cm9za2FNdXggKm11eDsKKworICBHc3RUYWdMaXN0ICp0YWdzOworCisgIEdzdENsb2NrVGltZSBzdGFydF90czsKKyAgR3N0Q2xvY2tUaW1lIGVuZF90czsgICAgLyogbGFzdCB0aW1lc3RhbXAgKyAoaWYgYXZhaWxhYmxlKSBkdXJhdGlvbiAqLworICBndWludDY0IGRlZmF1bHRfZHVyYXRpb25fc2NhbGVkOworfQorR3N0TWF0cm9za2FQYWQ7CisKKworc3RydWN0IF9Hc3RNYXRyb3NrYU11eCB7CisgIEdzdEVsZW1lbnQgICAgIGVsZW1lbnQ7CisgIAorICAvKiA8IHByaXZhdGUgPiAqLworCisgIC8qIHBhZHMgKi8KKyAgR3N0UGFkICAgICAgICAqc3JjcGFkOworICBHc3RDb2xsZWN0UGFkcyAqY29sbGVjdDsKKyAgR3N0RWJtbFdyaXRlICplYm1sX3dyaXRlOworCisgIGd1aW50ICAgICAgICAgIG51bV9zdHJlYW1zLAorICAgICAgICAgICAgICAgICBudW1fdl9zdHJlYW1zLCBudW1fYV9zdHJlYW1zLCBudW1fdF9zdHJlYW1zOworCisgIC8qIEFwcGxpY2F0aW9uIG5hbWUgKGZvciB0aGUgd3JpdGluZyBhcHBsaWNhdGlvbiBoZWFkZXIgZWxlbWVudCkgKi8KKyAgZ2NoYXIgICAgICAgICAgKndyaXRpbmdfYXBwOworCisgIC8qIEVCTUwgRG9jVHlwZS4gKi8KKyAgY29uc3QgZ2NoYXIgICAgKmRvY3R5cGU7CisKKyAgLyogRG9jVHlwZSB2ZXJzaW9uLiAqLworICBndWludCAgICAgICAgICBkb2N0eXBlX3ZlcnNpb247CisKKyAgLyogc3RhdGUgKi8KKyAgR3N0TWF0cm9za2FNdXhTdGF0ZSBzdGF0ZTsKKworICAvKiBhIGN1ZSAoaW5kZXgpIHRhYmxlICovCisgIEdzdE1hdHJvc2thSW5kZXggKmluZGV4OworICBndWludCAgICAgICAgICBudW1faW5kZXhlczsKKyAgR3N0Q2xvY2tUaW1lRGlmZiBtaW5faW5kZXhfaW50ZXJ2YWw7CisgCisgIC8qIHRpbWVzY2FsZSBpbiB0aGUgZmlsZSAqLworICBndWludDY0ICAgICAgICB0aW1lX3NjYWxlOworICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGxpbWl0IG9mIG5hbm9zZWNvbmRzIHlvdSBjYW4gaGF2ZSBpbiBhIGNsdXN0ZXIgKi8KKyAgZ3VpbnQ2NCAgICAgICAgbWF4X2NsdXN0ZXJfZHVyYXRpb247CisgIGd1aW50NjQgICAgICAgIG1pbl9jbHVzdGVyX2R1cmF0aW9uOworCisgIC8qIGxlbmd0aCwgcG9zaXRpb24gKHRpbWUsIG5zKSAqLworICBndWludDY0ICAgICAgICBkdXJhdGlvbjsKKworICAvKiBieXRlLXBvc2l0aW9ucyBvZiBtYXN0ZXItZWxlbWVudHMgKGZvciByZXBsYWNpbmcgY29udGVudHMpICovCisgIGd1aW50NjQgICAgICAgIHNlZ21lbnRfcG9zLAorICAgICAgICAgICAgICAgICBzZWVraGVhZF9wb3MsCisgICAgICAgICAgICAgICAgIGN1ZXNfcG9zLAorICAgICAgICAgICAgICAgICBjaGFwdGVyc19wb3MsCisgICAgICAgICAgICAgICAgIHRhZ3NfcG9zLAorICAgICAgICAgICAgICAgICBpbmZvX3BvcywKKyAgICAgICAgICAgICAgICAgdHJhY2tzX3BvcywKKyAgICAgICAgICAgICAgICAgZHVyYXRpb25fcG9zLAorICAgICAgICAgICAgICAgICBtZXRhX3BvczsKKyAgZ3VpbnQ2NCAgICAgICAgc2VnbWVudF9tYXN0ZXI7CisKKyAgLyogY3VycmVudCBjbHVzdGVyICovCisgIGd1aW50NjQgICAgICAgIGNsdXN0ZXIsCisgICAgICAgICAgICAgICAgIGNsdXN0ZXJfdGltZSwKKyAgICAgICAgICAgICAgICAgY2x1c3Rlcl9wb3MsCisJCSBwcmV2X2NsdXN0ZXJfc2l6ZTsKKworICAvKiBHc3RGb3JjZUtleVVuaXQgZXZlbnQgKi8KKyAgR3N0RXZlbnQgICAgICAgKmZvcmNlX2tleV91bml0X2V2ZW50OworCisgIC8qIEludGVybmFsIFRvYyAoYWRqdXN0ZWQgVUlEcyBhbmQgdGl0bGUgdGFncyByZW1vdmVkIHdoZW4gcHJvY2Vzc2VkKSAqLworICBHc3RUb2MgICAgICAgICAqaW50ZXJuYWxfdG9jOworCisgIC8qIEZsYWcgdG8gZWFzZSBoYW5kbGluZyBvZiBXZWJNIHNwZWNpZmljcyAqLworICBnYm9vbGVhbiBpc193ZWJtOworCisgIC8qIHVzZWQgdWlkcyAqLworICBHQXJyYXkgKnVzZWRfdWlkczsKK307CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RNYXRyb3NrYU11eENsYXNzIHsKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudDsKK30gR3N0TWF0cm9za2FNdXhDbGFzczsKKworR1R5cGUgICBnc3RfbWF0cm9za2FfbXV4X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX01BVFJPU0tBX01VWF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jIGIvZ3N0L21hdHJvc2thL21hdHJvc2thLXBhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2YTQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5jCkBAIC0wLDAgKzEsMzIzNiBAQAorLyogR1N0cmVhbWVyIE1hdHJvc2thIG11eGVyL2RlbXV4ZXIKKyAqIChjKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqIChjKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiAoYykgMjAwOCBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKiAoYykgMjAxMSBEZWJhcnNoaSBSYXkgPHJpc2hpQGdudS5vcmc+CisgKgorICogbWF0cm9za2EtcGFyc2UuYzogbWF0cm9za2EgZmlsZS9zdHJlYW0gcGFyc2VyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyogVE9ETzogY2hlY2sgQ1JDMzIgaWYgcHJlc2VudAorICogVE9ETzogdGhlcmUgY2FuIGJlIGEgc2VnbWVudCBhZnRlciB0aGUgZmlyc3Qgc2VnbWVudC4gSGFuZGxlIGxpa2UKKyAqICAgICAgIGNoYWluZWQgb2dncy4gRml4ZXMgIzMzNDA4MgorICogVE9ETzogVGVzdCBzYW1wbGVzOiBodHRwOi8vd3d3Lm1hdHJvc2thLm9yZy9zYW1wbGVzL21hdHJpeC9pbmRleC5odG1sCisgKiAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly9zYW1wbGVzLm1wbGF5ZXJocS5odS9NYXRyb3NrYS8KKyAqIFRPRE86IGNoZWNrIGlmIHBhcnNlaW5nIGlzIGRvbmUgY29ycmVjdCBmb3IgYWxsIGNvZGVjcyBhY2NvcmRpbmcgdG8gc3BlYworICogVE9ETzogc2Vla2luZyB3aXRoIGluY29tcGxldGUgb3Igd2l0aG91dCBDVUUKKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1tYXRyb3NrYXBhcnNlCisgKgorICogbWF0cm9za2FwYXJzZSBwYXJzZWVzIGEgTWF0cm9za2EgZmlsZSBpbnRvIHRoZSBkaWZmZXJlbnQgY29udGFpbmVkIHN0cmVhbXMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249L3BhdGgvdG8vbWt2ICEgbWF0cm9za2FwYXJzZSAhIHZvcmJpc2RlYyAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIHBhcnNlZXMgYSBNYXRyb3NrYSBmaWxlIGFuZCBvdXRwdXRzIHRoZSBjb250YWluZWQgVm9yYmlzIGF1ZGlvLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnbGliL2dwcmludGYuaD4KKworLyogRm9yIEFWSSBjb21wYXRpYmlsaXR5IG1vZGUKKyAgIGFuZCBmb3IgZm91cmNjIHN0dWZmICovCisjaW5jbHVkZSA8Z3N0L3JpZmYvcmlmZi1yZWFkLmg+CisjaW5jbHVkZSA8Z3N0L3JpZmYvcmlmZi1pZHMuaD4KKyNpbmNsdWRlIDxnc3QvcmlmZi9yaWZmLW1lZGlhLmg+CisKKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorCisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvcGJ1dGlscy5oPgorCisjaW5jbHVkZSAibWF0cm9za2EtcGFyc2UuaCIKKyNpbmNsdWRlICJtYXRyb3NrYS1pZHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAobWF0cm9za2FwYXJzZV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBtYXRyb3NrYXBhcnNlX2RlYnVnCisKKyNkZWZpbmUgREVCVUdfRUxFTUVOVF9TVEFSVChwYXJzZSwgZWJtbCwgZWxlbWVudCkgXAorICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiUGFyc2luZyAiIGVsZW1lbnQgIiBlbGVtZW50IGF0IG9mZnNldCAlIiBcCisgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGdzdF9lYm1sX3JlYWRfZ2V0X3BvcyAoZWJtbCkpCisKKyNkZWZpbmUgREVCVUdfRUxFTUVOVF9TVE9QKHBhcnNlLCBlYm1sLCBlbGVtZW50LCByZXQpIFwKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlBhcnNpbmcgIiBlbGVtZW50ICIgZWxlbWVudCAiIFwKKyAgICAgICAgIiBmaW5pc2hlZCB3aXRoICclcyciLCBnc3RfZmxvd19nZXRfbmFtZSAocmV0KSkKKworI2RlZmluZSBJTlZBTElEX0RBVEFfVEhSRVNIT0xEICgyICogMTAyNCAqIDEwMjQpCisKK2VudW0KK3sKKyAgUFJPUF8wCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbCA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtbWF0cm9za2E7IHZpZGVvL3gtbWF0cm9za2E7ICIKKyAgICAgICAgInZpZGVvL3gtbWF0cm9za2EtM2Q7IGF1ZGlvL3dlYm07IHZpZGVvL3dlYm0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGwgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1tYXRyb3NrYTsgdmlkZW8veC1tYXRyb3NrYTsgIgorICAgICAgICAidmlkZW8veC1tYXRyb3NrYS0zZDsgYXVkaW8vd2VibTsgdmlkZW8vd2VibSIpCisgICAgKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X21hdHJvc2thX3BhcnNlX3BhcnNlX2lkIChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UsCisgICAgZ3VpbnQzMiBpZCwgZ3VpbnQ2NCBsZW5ndGgsIGd1aW50IG5lZWRlZCk7CisKKy8qIGVsZW1lbnQgZnVuY3Rpb25zICovCisvL3N0YXRpYyB2b2lkIGdzdF9tYXRyb3NrYV9wYXJzZV9sb29wIChHc3RQYWQgKiBwYWQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX3BhcnNlX2VsZW1lbnRfc2VuZF9ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX3BhcnNlX2VsZW1lbnRfcXVlcnkgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworCisvKiBwYWQgZnVuY3Rpb25zICovCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX3BhcnNlX2hhbmRsZV9zZWVrX2V2ZW50IChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UsCisgICAgR3N0UGFkICogcGFkLCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbWF0cm9za2FfcGFyc2VfaGFuZGxlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX3BhcnNlX2hhbmRsZV9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdFF1ZXJ5ICogcXVlcnkpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX3BhcnNlX2hhbmRsZV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9tYXRyb3NrYV9wYXJzZV9jaGFpbiAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmZmVyKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfbWF0cm9za2FfcGFyc2VfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKyNpZiAwCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX3BhcnNlX3NldF9pbmRleCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEluZGV4ICogaW5kZXgpOworc3RhdGljIEdzdEluZGV4ICpnc3RfbWF0cm9za2FfcGFyc2VfZ2V0X2luZGV4IChHc3RFbGVtZW50ICogZWxlbWVudCk7CisjZW5kaWYKKworLyogc3RyZWFtIG1ldGhvZHMgKi8KK3N0YXRpYyB2b2lkIGdzdF9tYXRyb3NrYV9wYXJzZV9yZXNldCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpOworc3RhdGljIGdib29sZWFuIHBlcmZvcm1fc2Vla190b19vZmZzZXQgKEdzdE1hdHJvc2thUGFyc2UgKiBwYXJzZSwKKyAgICBndWludDY0IG9mZnNldCk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X21hdHJvc2thX3BhcnNlX2ZvcmdlX2NhcHMgKGdib29sZWFuIGlzX3dlYm0sCisgICAgZ2Jvb2xlYW4gaGFzX3ZpZGVvKTsKKworR1R5cGUgZ3N0X21hdHJvc2thX3BhcnNlX2dldF90eXBlICh2b2lkKTsKKyNkZWZpbmUgcGFyZW50X2NsYXNzIGdzdF9tYXRyb3NrYV9wYXJzZV9wYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdE1hdHJvc2thUGFyc2UsIGdzdF9tYXRyb3NrYV9wYXJzZSwgR1NUX1RZUEVfRUxFTUVOVCk7CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfcGFyc2VfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdE1hdHJvc2thUGFyc2UgKnBhcnNlID0gR1NUX01BVFJPU0tBX1BBUlNFIChvYmplY3QpOworCisgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9maW5hbGl6ZSAoJnBhcnNlLT5jb21tb24pOworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfcGFyc2VfY2xhc3NfaW5pdCAoR3N0TWF0cm9za2FQYXJzZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKG1hdHJvc2thcGFyc2VfZGVidWcsICJtYXRyb3NrYXBhcnNlIiwgMCwKKyAgICAgICJNYXRyb3NrYSBwYXJzZXIiKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9tYXRyb3NrYV9wYXJzZV9maW5hbGl6ZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9wYXJzZV9jaGFuZ2Vfc3RhdGUpOworICBnc3RlbGVtZW50X2NsYXNzLT5zZW5kX2V2ZW50ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbWF0cm9za2FfcGFyc2VfZWxlbWVudF9zZW5kX2V2ZW50KTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cXVlcnkgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9wYXJzZV9lbGVtZW50X3F1ZXJ5KTsKKworI2lmIDAKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+c2V0X2luZGV4ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbWF0cm9za2FfcGFyc2Vfc2V0X2luZGV4KTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Z2V0X2luZGV4ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbWF0cm9za2FfcGFyc2VfZ2V0X2luZGV4KTsKKyNlbmRpZgorCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIk1hdHJvc2thIHBhcnNlciIsICJDb2RlYy9QYXJzZXIiLAorICAgICAgIlBhcnNlcyBNYXRyb3NrYS9XZWJNIHN0cmVhbXMgaW50byB2aWRlby9hdWRpby9zdWJ0aXRsZXMiLAorICAgICAgIkdTdHJlYW1lciBtYWludGFpbmVycyA8Z3N0cmVhbWVyLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZz4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9wYXJzZV9pbml0IChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UpCit7CisgIHBhcnNlLT5jb21tb24uc2lua3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua190ZW1wbCwKKyAgICAgICJzaW5rIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChwYXJzZS0+Y29tbW9uLnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX3BhcnNlX2NoYWluKSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChwYXJzZS0+Y29tbW9uLnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21hdHJvc2thX3BhcnNlX2hhbmRsZV9zaW5rX2V2ZW50KSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChwYXJzZSksIHBhcnNlLT5jb21tb24uc2lua3BhZCk7CisKKyAgcGFyc2UtPnNyY3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc3JjX3RlbXBsLCAic3JjIik7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChwYXJzZS0+c3JjcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9wYXJzZV9oYW5kbGVfc3JjX2V2ZW50KSk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChwYXJzZS0+c3JjcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tYXRyb3NrYV9wYXJzZV9oYW5kbGVfc3JjX3F1ZXJ5KSk7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKHBhcnNlLT5zcmNwYWQpOworCisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChwYXJzZSksIHBhcnNlLT5zcmNwYWQpOworCisgIC8qIGluaXQgZGVmYXVsdHMgZm9yIGNvbW1vbiByZWFkIGNvbnRleHQgKi8KKyAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2luaXQgKCZwYXJzZS0+Y29tbW9uKTsKKworICBHU1RfT0JKRUNUX0ZMQUdfU0VUIChwYXJzZSwgR1NUX0VMRU1FTlRfRkxBR19JTkRFWEFCTEUpOworCisgIC8qIGZpbmlzaCBvZmYgKi8KKyAgZ3N0X21hdHJvc2thX3BhcnNlX3Jlc2V0IChHU1RfRUxFTUVOVCAocGFyc2UpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9wYXJzZV9yZXNldCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdE1hdHJvc2thUGFyc2UgKnBhcnNlID0gR1NUX01BVFJPU0tBX1BBUlNFIChlbGVtZW50KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlJlc2V0dGluZyBzdGF0ZSIpOworCisgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9yZXNldCAoR1NUX0VMRU1FTlQgKHBhcnNlKSwgJnBhcnNlLT5jb21tb24pOworCisgIHBhcnNlLT5udW1fYV9zdHJlYW1zID0gMDsKKyAgcGFyc2UtPm51bV90X3N0cmVhbXMgPSAwOworICBwYXJzZS0+bnVtX3Zfc3RyZWFtcyA9IDA7CisKKyAgcGFyc2UtPmNsb2NrID0gTlVMTDsKKyAgcGFyc2UtPnRyYWNrc19wYXJzZWQgPSBGQUxTRTsKKworICBnX2xpc3RfZm9yZWFjaCAocGFyc2UtPnNlZWtfcGFyc2VkLAorICAgICAgKEdGdW5jKSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZnJlZV9wYXJzZWRfZWwsIE5VTEwpOworICBnX2xpc3RfZnJlZSAocGFyc2UtPnNlZWtfcGFyc2VkKTsKKyAgcGFyc2UtPnNlZWtfcGFyc2VkID0gTlVMTDsKKworICBwYXJzZS0+bGFzdF9zdG9wX2VuZCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIHBhcnNlLT5zZWVrX2Jsb2NrID0gMDsKKyAgcGFyc2UtPmNsdXN0ZXJfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIHBhcnNlLT5jbHVzdGVyX29mZnNldCA9IDA7CisgIHBhcnNlLT5uZXh0X2NsdXN0ZXJfb2Zmc2V0ID0gMDsKKyAgcGFyc2UtPmluZGV4X29mZnNldCA9IDA7CisgIHBhcnNlLT5zZWVrYWJsZSA9IEZBTFNFOworICBwYXJzZS0+bmVlZF9uZXdzZWdtZW50ID0gVFJVRTsKKyAgcGFyc2UtPmJ1aWxkaW5nX2luZGV4ID0gRkFMU0U7CisgIGlmIChwYXJzZS0+c2Vla19ldmVudCkgeworICAgIGdzdF9ldmVudF91bnJlZiAocGFyc2UtPnNlZWtfZXZlbnQpOworICAgIHBhcnNlLT5zZWVrX2V2ZW50ID0gTlVMTDsKKyAgfQorCisgIHBhcnNlLT5zZWVrX2luZGV4ID0gTlVMTDsKKyAgcGFyc2UtPnNlZWtfZW50cnkgPSAwOworCisgIGlmIChwYXJzZS0+Y2xvc2Vfc2VnbWVudCkgeworICAgIGdzdF9ldmVudF91bnJlZiAocGFyc2UtPmNsb3NlX3NlZ21lbnQpOworICAgIHBhcnNlLT5jbG9zZV9zZWdtZW50ID0gTlVMTDsKKyAgfQorCisgIGlmIChwYXJzZS0+bmV3X3NlZ21lbnQpIHsKKyAgICBnc3RfZXZlbnRfdW5yZWYgKHBhcnNlLT5uZXdfc2VnbWVudCk7CisgICAgcGFyc2UtPm5ld19zZWdtZW50ID0gTlVMTDsKKyAgfQorCisgIGlmIChwYXJzZS0+c3RyZWFtaGVhZGVyICE9IE5VTEwpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChwYXJzZS0+c3RyZWFtaGVhZGVyKTsKKyAgICBwYXJzZS0+c3RyZWFtaGVhZGVyID0gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3BhcnNlX2FkZF9zdHJlYW0gKEdzdE1hdHJvc2thUGFyc2UgKiBwYXJzZSwgR3N0RWJtbFJlYWQgKiBlYm1sKQoreworICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqY29udGV4dDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIGd1aW50MzIgaWQ7CisKKyAgREVCVUdfRUxFTUVOVF9TVEFSVCAocGFyc2UsIGVibWwsICJUcmFja0VudHJ5Iik7CisKKyAgLyogc3RhcnQgd2l0aCB0aGUgbWFzdGVyICovCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChwYXJzZSwgZWJtbCwgIlRyYWNrRW50cnkiLCByZXQpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICAvKiBhbGxvY2F0ZSBnZW5lcmljLi4uIGlmIHdlIGtub3cgdGhlIHR5cGUsIHdlJ2xsIGdfcmVuZXcoKQorICAgKiB3aXRoIHRoZSBwcmVjaXNlIHR5cGUgKi8KKyAgY29udGV4dCA9IGdfbmV3MCAoR3N0TWF0cm9za2FUcmFja0NvbnRleHQsIDEpOworICBnX3B0cl9hcnJheV9hZGQgKHBhcnNlLT5jb21tb24uc3JjLCBjb250ZXh0KTsKKyAgY29udGV4dC0+aW5kZXggPSBwYXJzZS0+Y29tbW9uLm51bV9zdHJlYW1zOworICBjb250ZXh0LT5pbmRleF93cml0ZXJfaWQgPSAtMTsKKyAgY29udGV4dC0+dHlwZSA9IDA7ICAgICAgICAgICAgLyogbm8gdHlwZSB5ZXQgKi8KKyAgY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbiA9IDA7CisgIGNvbnRleHQtPnBvcyA9IDA7CisgIGNvbnRleHQtPnNldF9kaXNjb250ID0gVFJVRTsKKyAgY29udGV4dC0+dGltZWNvZGVzY2FsZSA9IDEuMDsKKyAgY29udGV4dC0+ZmxhZ3MgPQorICAgICAgR1NUX01BVFJPU0tBX1RSQUNLX0VOQUJMRUQgfCBHU1RfTUFUUk9TS0FfVFJBQ0tfREVGQVVMVCB8CisgICAgICBHU1RfTUFUUk9TS0FfVFJBQ0tfTEFDSU5HOworICBjb250ZXh0LT50b19vZmZzZXQgPSBHX01BWElOVDY0OworICBjb250ZXh0LT5hbGlnbm1lbnQgPSAxOworICBwYXJzZS0+Y29tbW9uLm51bV9zdHJlYW1zKys7CisgIGdfYXNzZXJ0IChwYXJzZS0+Y29tbW9uLnNyYy0+bGVuID09IHBhcnNlLT5jb21tb24ubnVtX3N0cmVhbXMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiU3RyZWFtIG51bWJlciAlZCIsIGNvbnRleHQtPmluZGV4KTsKKworICAvKiB0cnkgcmVhZGluZyB0aGUgdHJhY2tlbnRyeSBoZWFkZXJzICovCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgLyogdHJhY2sgbnVtYmVyICh1bmlxdWUgc3RyZWFtIElEKSAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tOVU1CRVI6eworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocGFyc2UsICJJbnZhbGlkIFRyYWNrTnVtYmVyIDAiKTsKKyAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmICghZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3RyYWNrbnVtYmVyX3VuaXF1ZSAoJnBhcnNlLT5jb21tb24sCisgICAgICAgICAgICAgICAgbnVtKSkgeworICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBhcnNlLCAiVHJhY2tOdW1iZXIgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAgICAgICAiIGlzIG5vdCB1bmlxdWUiLCBudW0pOworICAgICAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJUcmFja051bWJlcjogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgY29udGV4dC0+bnVtID0gbnVtOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgICAgLyogdHJhY2sgVUlEICh1bmlxdWUgaWRlbnRpZmllcikgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLVUlEOnsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChudW0gPT0gMCkgeworICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBhcnNlLCAiSW52YWxpZCBUcmFja1VJRCAwIik7CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlRyYWNrVUlEOiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICBjb250ZXh0LT51aWQgPSBudW07CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAgIC8qIHRyYWNrIHR5cGUgKHZpZGVvLCBhdWRpbywgY29tYmluZWQsIHN1YnRpdGxlLCBldGMuKSAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tUWVBFOnsKKyAgICAgICAgZ3VpbnQ2NCB0cmFja190eXBlOworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZ0cmFja190eXBlKSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb250ZXh0LT50eXBlICE9IDAgJiYgY29udGV4dC0+dHlwZSAhPSB0cmFja190eXBlKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAgICAgIk1vcmUgdGhhbiBvbmUgdHJhY2t0eXBlIGRlZmluZWQgaW4gYSBUcmFja0VudHJ5IC0gc2tpcHBpbmciKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFja190eXBlIDwgMSB8fCB0cmFja190eXBlID4gMjU0KSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkludmFsaWQgVHJhY2tUeXBlICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICAgIHRyYWNrX3R5cGUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJUcmFja1R5cGU6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHRyYWNrX3R5cGUpOworCisgICAgICAgIC8qIG9rLCBzbyB3ZSdyZSBhY3R1YWxseSBnb2luZyB0byByZWFsbG9jYXRlIHRoaXMgdGhpbmcgKi8KKyAgICAgICAgc3dpdGNoICh0cmFja190eXBlKSB7CisgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9WSURFTzoKKyAgICAgICAgICAgIGdzdF9tYXRyb3NrYV90cmFja19pbml0X3ZpZGVvX2NvbnRleHQgKCZjb250ZXh0KTsKKyAgICAgICAgICAgIHBhcnNlLT5jb21tb24uaGFzX3ZpZGVvID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQVVESU86CisgICAgICAgICAgICBnc3RfbWF0cm9za2FfdHJhY2tfaW5pdF9hdWRpb19jb250ZXh0ICgmY29udGV4dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFOgorICAgICAgICAgICAgZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfc3VidGl0bGVfY29udGV4dCAoJmNvbnRleHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9DT01QTEVYOgorICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfTE9HTzoKKyAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX0JVVFRPTlM6CisgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9DT05UUk9MOgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLAorICAgICAgICAgICAgICAgICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIFRyYWNrVHlwZSAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgICAgIHRyYWNrX3R5cGUpOworICAgICAgICAgICAgY29udGV4dC0+dHlwZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBnX3B0cl9hcnJheV9pbmRleCAocGFyc2UtPmNvbW1vbi5zcmMsIHBhcnNlLT5jb21tb24ubnVtX3N0cmVhbXMgLSAxKQorICAgICAgICAgICAgPSBjb250ZXh0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiB0cmFja3R5cGUgc3BlY2lmaWMgc3R1ZmYgZm9yIHZpZGVvICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS1ZJREVPOnsKKyAgICAgICAgR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqdmlkZW9jb250ZXh0OworCisgICAgICAgIERFQlVHX0VMRU1FTlRfU1RBUlQgKHBhcnNlLCBlYm1sLCAiVHJhY2tWaWRlbyIpOworCisgICAgICAgIGlmICghZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfdmlkZW9fY29udGV4dCAoJmNvbnRleHQpKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAgICAgIlRyYWNrVmlkZW8gZWxlbWVudCBpbiBub24tdmlkZW8gdHJhY2sgLSBpZ25vcmluZyB0cmFjayIpOworICAgICAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2aWRlb2NvbnRleHQgPSAoR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqKSBjb250ZXh0OworICAgICAgICBnX3B0cl9hcnJheV9pbmRleCAocGFyc2UtPmNvbW1vbi5zcmMsIHBhcnNlLT5jb21tb24ubnVtX3N0cmVhbXMgLSAxKQorICAgICAgICAgICAgPSBjb250ZXh0OworCisgICAgICAgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYKKyAgICAgICAgICAgIGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3BlZWtfaWQgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgICAgICAgIC8qIFNob3VsZCBiZSBvbmUgbGV2ZWwgdXAgYnV0IHNvbWUgYnJva2VuIG11eGVycyB3cml0ZSBpdCBoZXJlLiAqLworICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tERUZBVUxURFVSQVRJT046eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkludmFsaWQgVHJhY2tEZWZhdWx0RHVyYXRpb24gMCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICAgICAiVHJhY2tEZWZhdWx0RHVyYXRpb246ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgICAgICAgIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24gPSBudW07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIHZpZGVvIGZyYW1lcmF0ZSAqLworICAgICAgICAgICAgICAvKiBOT1RFOiBUaGlzIG9uZSBpcyBoZXJlIG9ubHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgICAgICAgICAgICAgICAqIFVzZSBfVFJBQ0tERUZBVUxEVVJBVElPTiBvbmUgbGV2ZWwgdXAuICovCisgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9WSURFT0ZSQU1FUkFURTp7CisgICAgICAgICAgICAgIGdkb3VibGUgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9mbG9hdCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSA8PSAwLjApIHsKKyAgICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLCAiSW52YWxpZCBUcmFja1ZpZGVvRlBTICVsZiIsIG51bSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlRyYWNrVmlkZW9GcmFtZVJhdGU6ICVsZiIsIG51bSk7CisgICAgICAgICAgICAgIGlmIChjb250ZXh0LT5kZWZhdWx0X2R1cmF0aW9uID09IDApCisgICAgICAgICAgICAgICAgY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIGdzdF9nZG91YmxlX3RvX2d1aW50NjQgKChnZG91YmxlKSBHU1RfU0VDT05EICogKDEuMCAvIG51bSkpOworICAgICAgICAgICAgICB2aWRlb2NvbnRleHQtPmRlZmF1bHRfZnBzID0gbnVtOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiB3aWR0aCBvZiB0aGUgc2l6ZSB0byBkaXNwbGF5IHRoZSB2aWRlbyBhdCAqLworICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9ESVNQTEFZV0lEVEg6eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkludmFsaWQgVHJhY2tWaWRlb0Rpc3BsYXlXaWR0aCAwIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAgICAgICAgICJUcmFja1ZpZGVvRGlzcGxheVdpZHRoOiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICAgICAgICB2aWRlb2NvbnRleHQtPmRpc3BsYXlfd2lkdGggPSBudW07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIGhlaWdodCBvZiB0aGUgc2l6ZSB0byBkaXNwbGF5IHRoZSB2aWRlbyBhdCAqLworICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9ESVNQTEFZSEVJR0hUOnsKKyAgICAgICAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGlmIChudW0gPT0gMCkgeworICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsICJJbnZhbGlkIFRyYWNrVmlkZW9EaXNwbGF5SGVpZ2h0IDAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLAorICAgICAgICAgICAgICAgICAgIlRyYWNrVmlkZW9EaXNwbGF5SGVpZ2h0OiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICAgICAgICB2aWRlb2NvbnRleHQtPmRpc3BsYXlfaGVpZ2h0ID0gbnVtOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiB3aWR0aCBvZiB0aGUgdmlkZW8gaW4gdGhlIGZpbGUgKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPUElYRUxXSURUSDp7CisgICAgICAgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBpZiAobnVtID09IDApIHsKKyAgICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLCAiSW52YWxpZCBUcmFja1ZpZGVvUGl4ZWxXaWR0aCAwIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAgICAgICAgICJUcmFja1ZpZGVvUGl4ZWxXaWR0aDogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5waXhlbF93aWR0aCA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogaGVpZ2h0IG9mIHRoZSB2aWRlbyBpbiB0aGUgZmlsZSAqLworICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9QSVhFTEhFSUdIVDp7CisgICAgICAgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBpZiAobnVtID09IDApIHsKKyAgICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLCAiSW52YWxpZCBUcmFja1ZpZGVvUGl4ZWxIZWlnaHQgMCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICAgICAiVHJhY2tWaWRlb1BpeGVsSGVpZ2h0OiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICAgICAgICB2aWRlb2NvbnRleHQtPnBpeGVsX2hlaWdodCA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogd2hldGhlciB0aGUgdmlkZW8gaXMgaW50ZXJsYWNlZCAqLworICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9GTEFHSU5URVJMQUNFRDp7CisgICAgICAgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBpZiAobnVtKQorICAgICAgICAgICAgICAgIGNvbnRleHQtPmZsYWdzIHw9IEdTVF9NQVRST1NLQV9WSURFT1RSQUNLX0lOVEVSTEFDRUQ7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5mbGFncyAmPSB+R1NUX01BVFJPU0tBX1ZJREVPVFJBQ0tfSU5URVJMQUNFRDsKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJUcmFja1ZpZGVvSW50ZXJsYWNlZDogJWQiLAorICAgICAgICAgICAgICAgICAgKGNvbnRleHQtPmZsYWdzICYgR1NUX01BVFJPU0tBX1ZJREVPVFJBQ0tfSU5URVJMQUNFRCkgPyAxIDoKKyAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiBhc3BlY3QgcmF0aW8gYmVoYXZpb3VyICovCisgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9WSURFT0FTUEVDVFJBVElPVFlQRTp7CisgICAgICAgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBpZiAobnVtICE9IEdTVF9NQVRST1NLQV9BU1BFQ1RfUkFUSU9fTU9ERV9GUkVFICYmCisgICAgICAgICAgICAgICAgICBudW0gIT0gR1NUX01BVFJPU0tBX0FTUEVDVF9SQVRJT19NT0RFX0tFRVAgJiYKKyAgICAgICAgICAgICAgICAgIG51bSAhPSBHU1RfTUFUUk9TS0FfQVNQRUNUX1JBVElPX01PREVfRklYRUQpIHsKKyAgICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLAorICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBUcmFja1ZpZGVvQXNwZWN0UmF0aW9UeXBlIDB4JXgiLCAoZ3VpbnQpIG51bSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICAgICAiVHJhY2tWaWRlb0FzcGVjdFJhdGlvVHlwZTogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICAgICAgdmlkZW9jb250ZXh0LT5hc3JfbW9kZSA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogY29sb3Vyc3BhY2UgKG9ubHkgbWF0dGVycyBmb3IgcmF3IHZpZGVvKSBmb3VyY2MgKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPQ09MT1VSU1BBQ0U6eworICAgICAgICAgICAgICBndWludDggKmRhdGE7CisgICAgICAgICAgICAgIGd1aW50NjQgZGF0YWxlbjsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9CisgICAgICAgICAgICAgICAgICAgICAgZ3N0X2VibWxfcmVhZF9iaW5hcnkgKGVibWwsICZpZCwgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhbGVuKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKGRhdGFsZW4gIT0gNCkgeworICAgICAgICAgICAgICAgIGdfZnJlZSAoZGF0YSk7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgVHJhY2tWaWRlb0NvbG91clNwYWNlIGxlbmd0aCAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgICAgICAgICBkYXRhbGVuKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIG1lbWNweSAoJnZpZGVvY29udGV4dC0+Zm91cmNjLCBkYXRhLCA0KTsKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICAgICAiVHJhY2tWaWRlb0NvbG91clNwYWNlOiAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAodmlkZW9jb250ZXh0LT5mb3VyY2MpKTsKKyAgICAgICAgICAgICAgZ19mcmVlIChkYXRhKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICAgICAiVW5rbm93biBUcmFja1ZpZGVvIHN1YmVsZW1lbnQgMHgleCAtIGlnbm9yaW5nIiwgaWQpOworICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPU1RFUkVPTU9ERToKKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPRElTUExBWVVOSVQ6CisgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9WSURFT1BJWEVMQ1JPUEJPVFRPTToKKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPUElYRUxDUk9QVE9QOgorICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9QSVhFTENST1BMRUZUOgorICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVklERU9QSVhFTENST1BSSUdIVDoKKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1ZJREVPR0FNTUFWQUxVRToKKyAgICAgICAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9za2lwIChlYm1sKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgREVCVUdfRUxFTUVOVF9TVE9QIChwYXJzZSwgZWJtbCwgIlRyYWNrVmlkZW8iLCByZXQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiB0cmFja3R5cGUgc3BlY2lmaWMgc3R1ZmYgZm9yIGF1ZGlvICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0FVRElPOnsKKyAgICAgICAgR3N0TWF0cm9za2FUcmFja0F1ZGlvQ29udGV4dCAqYXVkaW9jb250ZXh0OworCisgICAgICAgIERFQlVHX0VMRU1FTlRfU1RBUlQgKHBhcnNlLCBlYm1sLCAiVHJhY2tBdWRpbyIpOworCisgICAgICAgIGlmICghZ3N0X21hdHJvc2thX3RyYWNrX2luaXRfYXVkaW9fY29udGV4dCAoJmNvbnRleHQpKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAgICAgIlRyYWNrQXVkaW8gZWxlbWVudCBpbiBub24tYXVkaW8gdHJhY2sgLSBpZ25vcmluZyB0cmFjayIpOworICAgICAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgYXVkaW9jb250ZXh0ID0gKEdzdE1hdHJvc2thVHJhY2tBdWRpb0NvbnRleHQgKikgY29udGV4dDsKKyAgICAgICAgZ19wdHJfYXJyYXlfaW5kZXggKHBhcnNlLT5jb21tb24uc3JjLCBwYXJzZS0+Y29tbW9uLm51bV9zdHJlYW1zIC0gMSkKKyAgICAgICAgICAgID0gY29udGV4dDsKKworICAgICAgICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmCisgICAgICAgICAgICBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgc3dpdGNoIChpZCkgeworICAgICAgICAgICAgICAvKiBzYW1wbGVyYXRlICovCisgICAgICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9BVURJT1NBTVBMSU5HRlJFUTp7CisgICAgICAgICAgICAgIGdkb3VibGUgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9mbG9hdCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgICBpZiAobnVtIDw9IDAuMCkgeworICAgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFRyYWNrQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSAlbGYiLCBudW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJUcmFja0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3k6ICVsZiIsIG51bSk7CisgICAgICAgICAgICAgIGF1ZGlvY29udGV4dC0+c2FtcGxlcmF0ZSA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogYml0ZGVwdGggKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0FVRElPQklUREVQVEg6eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkludmFsaWQgVHJhY2tBdWRpb0JpdERlcHRoIDAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiVHJhY2tBdWRpb0JpdERlcHRoOiAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgICAgICAgbnVtKTsKKyAgICAgICAgICAgICAgYXVkaW9jb250ZXh0LT5iaXRkZXB0aCA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogY2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0FVRElPQ0hBTk5FTFM6eworICAgICAgICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkludmFsaWQgVHJhY2tBdWRpb0NoYW5uZWxzIDAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiVHJhY2tBdWRpb0NoYW5uZWxzOiAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgICAgICAgbnVtKTsKKyAgICAgICAgICAgICAgYXVkaW9jb250ZXh0LT5jaGFubmVscyA9IG51bTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICAgICAiVW5rbm93biBUcmFja0F1ZGlvIHN1YmVsZW1lbnQgMHgleCAtIGlnbm9yaW5nIiwgaWQpOworICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0FVRElPQ0hBTk5FTFBPU0lUSU9OUzoKKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0FVRElPT1VUUFVUU0FNUExJTkdGUkVROgorICAgICAgICAgICAgICByZXQgPSBnc3RfZWJtbF9yZWFkX3NraXAgKGVibWwpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBERUJVR19FTEVNRU5UX1NUT1AgKHBhcnNlLCBlYm1sLCAiVHJhY2tBdWRpbyIsIHJldCk7CisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgLyogY29kZWMgaWRlbnRpZmllciAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNJRDp7CisgICAgICAgIGdjaGFyICp0ZXh0OworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9hc2NpaSAoZWJtbCwgJmlkLCAmdGV4dCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiQ29kZWNJRDogJXMiLCBHU1RfU1RSX05VTEwgKHRleHQpKTsKKyAgICAgICAgY29udGV4dC0+Y29kZWNfaWQgPSB0ZXh0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBjb2RlYyBwcml2YXRlIGRhdGEgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPREVDUFJJVkFURTp7CisgICAgICAgIGd1aW50OCAqZGF0YTsKKyAgICAgICAgZ3VpbnQ2NCBzaXplOworCisgICAgICAgIGlmICgocmV0ID0KKyAgICAgICAgICAgICAgICBnc3RfZWJtbF9yZWFkX2JpbmFyeSAoZWJtbCwgJmlkLCAmZGF0YSwgJnNpemUpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjb250ZXh0LT5jb2RlY19wcml2ID0gZGF0YTsKKyAgICAgICAgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplID0gc2l6ZTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIkNvZGVjUHJpdmF0ZSBvZiBzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICBzaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgLyogbmFtZSBvZiB0aGUgY29kZWMgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPREVDTkFNRTp7CisgICAgICAgIGdjaGFyICp0ZXh0OworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91dGY4IChlYm1sLCAmaWQsICZ0ZXh0KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJDb2RlY05hbWU6ICVzIiwgR1NUX1NUUl9OVUxMICh0ZXh0KSk7CisgICAgICAgIGNvbnRleHQtPmNvZGVjX25hbWUgPSB0ZXh0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBuYW1lIG9mIHRoaXMgdHJhY2sgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLTkFNRTp7CisgICAgICAgIGdjaGFyICp0ZXh0OworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91dGY4IChlYm1sLCAmaWQsICZ0ZXh0KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY29udGV4dC0+bmFtZSA9IHRleHQ7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiVHJhY2tOYW1lOiAlcyIsIEdTVF9TVFJfTlVMTCAodGV4dCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBsYW5ndWFnZSAobWF0dGVycyBmb3IgYXVkaW8vc3VidGl0bGVzLCBtb3N0bHkpICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0xBTkdVQUdFOnsKKyAgICAgICAgZ2NoYXIgKnRleHQ7CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3V0ZjggKGVibWwsICZpZCwgJnRleHQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNvbnRleHQtPmxhbmd1YWdlID0gdGV4dDsKKworICAgICAgICAvKiBmcmUtY2EgPT4gZnJlICovCisgICAgICAgIGlmIChzdHJsZW4gKGNvbnRleHQtPmxhbmd1YWdlKSA+PSA0ICYmIGNvbnRleHQtPmxhbmd1YWdlWzNdID09ICctJykKKyAgICAgICAgICBjb250ZXh0LT5sYW5ndWFnZVszXSA9ICdcMCc7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJUcmFja0xhbmd1YWdlOiAlcyIsCisgICAgICAgICAgICBHU1RfU1RSX05VTEwgKGNvbnRleHQtPmxhbmd1YWdlKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAgIC8qIHdoZXRoZXIgdGhpcyBpcyBhY3R1YWxseSB1c2VkICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0ZMQUdFTkFCTEVEOnsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChudW0pCisgICAgICAgICAgY29udGV4dC0+ZmxhZ3MgfD0gR1NUX01BVFJPU0tBX1RSQUNLX0VOQUJMRUQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBjb250ZXh0LT5mbGFncyAmPSB+R1NUX01BVFJPU0tBX1RSQUNLX0VOQUJMRUQ7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJUcmFja0VuYWJsZWQ6ICVkIiwKKyAgICAgICAgICAgIChjb250ZXh0LT5mbGFncyAmIEdTVF9NQVRST1NLQV9UUkFDS19FTkFCTEVEKSA/IDEgOiAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgLyogd2hldGhlciBpdCdzIHRoZSBkZWZhdWx0IGZvciB0aGlzIHRyYWNrIHR5cGUgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLRkxBR0RFRkFVTFQ6eworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSkKKyAgICAgICAgICBjb250ZXh0LT5mbGFncyB8PSBHU1RfTUFUUk9TS0FfVFJBQ0tfREVGQVVMVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGNvbnRleHQtPmZsYWdzICY9IH5HU1RfTUFUUk9TS0FfVFJBQ0tfREVGQVVMVDsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlRyYWNrRGVmYXVsdDogJWQiLAorICAgICAgICAgICAgKGNvbnRleHQtPmZsYWdzICYgR1NUX01BVFJPU0tBX1RSQUNLX0VOQUJMRUQpID8gMSA6IDApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiB3aGV0aGVyIHRoZSB0cmFjayBtdXN0IGJlIHVzZWQgZHVyaW5nIHBsYXliYWNrICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS0ZMQUdGT1JDRUQ6eworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSkKKyAgICAgICAgICBjb250ZXh0LT5mbGFncyB8PSBHU1RfTUFUUk9TS0FfVFJBQ0tfRk9SQ0VEOworICAgICAgICBlbHNlCisgICAgICAgICAgY29udGV4dC0+ZmxhZ3MgJj0gfkdTVF9NQVRST1NLQV9UUkFDS19GT1JDRUQ7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJUcmFja0ZvcmNlZDogJWQiLAorICAgICAgICAgICAgKGNvbnRleHQtPmZsYWdzICYgR1NUX01BVFJPU0tBX1RSQUNLX0VOQUJMRUQpID8gMSA6IDApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBsYWNpbmcgKGxpa2UgTVBFRywgd2hlcmUgYmxvY2tzIGRvbid0IGVuZC9zdGFydCBvbiBmcmFtZQorICAgICAgICAgKiBib3VuZGFyaWVzKSAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tGTEFHTEFDSU5HOnsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChudW0pCisgICAgICAgICAgY29udGV4dC0+ZmxhZ3MgfD0gR1NUX01BVFJPU0tBX1RSQUNLX0xBQ0lORzsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGNvbnRleHQtPmZsYWdzICY9IH5HU1RfTUFUUk9TS0FfVFJBQ0tfTEFDSU5HOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiVHJhY2tMYWNpbmc6ICVkIiwKKyAgICAgICAgICAgIChjb250ZXh0LT5mbGFncyAmIEdTVF9NQVRST1NLQV9UUkFDS19FTkFCTEVEKSA/IDEgOiAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgLyogZGVmYXVsdCBsZW5ndGggKGluIHRpbWUpIG9mIG9uZSBkYXRhIGJsb2NrIGluIHRoaXMgdHJhY2sgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLREVGQVVMVERVUkFUSU9OOnsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkludmFsaWQgVHJhY2tEZWZhdWx0RHVyYXRpb24gMCIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJUcmFja0RlZmF1bHREdXJhdGlvbjogJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIG51bSk7CisgICAgICAgIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24gPSBudW07CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DT05URU5URU5DT0RJTkdTOnsKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3JlYWRfdHJhY2tfZW5jb2RpbmdzICgmcGFyc2UtPmNvbW1vbiwKKyAgICAgICAgICAgIGVibWwsIGNvbnRleHQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tUSU1FQ09ERVNDQUxFOnsKKyAgICAgICAgZ2RvdWJsZSBudW07CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX2Zsb2F0IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAobnVtIDw9IDAuMCkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsICJJbnZhbGlkIFRyYWNrVGltZUNvZGVTY2FsZSAlbGYiLCBudW0pOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJUcmFja1RpbWVDb2RlU2NhbGU6ICVsZiIsIG51bSk7CisgICAgICAgIGNvbnRleHQtPnRpbWVjb2Rlc2NhbGUgPSBudW07CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfV0FSTklORyAoIlVua25vd24gVHJhY2tFbnRyeSBzdWJlbGVtZW50IDB4JXggLSBpZ25vcmluZyIsIGlkKTsKKyAgICAgICAgLyogcGFzcy10aHJvdWdoICovCisKKyAgICAgICAgLyogd2UgaWdub3JlIHRoZXNlIGJlY2F1c2UgdGhleSdyZSBub3RoaW5nIHVzZWZ1bCAoaS5lLiBjcmFwKQorICAgICAgICAgKiBvciBzaW1wbHkgbm90IGltcGxlbWVudGVkIHlldC4gKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLTUlOQ0FDSEU6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS01BWENBQ0hFOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfTUFYQkxPQ0tBRERJVElPTklEOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tBVFRBQ0hNRU5UTElOSzoKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLT1ZFUkxBWToKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLVFJBTlNMQVRFOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tPRkZTRVQ6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DT0RFQ1NFVFRJTkdTOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNJTkZPVVJMOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ09ERUNET1dOTE9BRFVSTDoKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPREVDREVDT0RFQUxMOgorICAgICAgICByZXQgPSBnc3RfZWJtbF9yZWFkX3NraXAgKGVibWwpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBERUJVR19FTEVNRU5UX1NUT1AgKHBhcnNlLCBlYm1sLCAiVHJhY2tFbnRyeSIsIHJldCk7CisKKyAgLyogRGVjb2RlIGNvZGVjIHByaXZhdGUgZGF0YSBpZiBuZWNlc3NhcnkgKi8KKyAgaWYgKGNvbnRleHQtPmVuY29kaW5ncyAmJiBjb250ZXh0LT5lbmNvZGluZ3MtPmxlbiA+IDAgJiYgY29udGV4dC0+Y29kZWNfcHJpdgorICAgICAgJiYgY29udGV4dC0+Y29kZWNfcHJpdl9zaXplID4gMCkgeworICAgIGlmICghZ3N0X21hdHJvc2thX2RlY29kZV9kYXRhIChjb250ZXh0LT5lbmNvZGluZ3MsCisgICAgICAgICAgICAmY29udGV4dC0+Y29kZWNfcHJpdiwgJmNvbnRleHQtPmNvZGVjX3ByaXZfc2l6ZSwKKyAgICAgICAgICAgIEdTVF9NQVRST1NLQV9UUkFDS19FTkNPRElOR19TQ09QRV9DT0RFQ19EQVRBLCBUUlVFKSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkRlY29kaW5nIGNvZGVjIHByaXZhdGUgZGF0YSBmYWlsZWQiKTsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIH0KKyAgfQorCisgIGlmIChjb250ZXh0LT50eXBlID09IDAgfHwgY29udGV4dC0+Y29kZWNfaWQgPT0gTlVMTCB8fCAocmV0ICE9IEdTVF9GTE9XX09LCisgICAgICAgICAgJiYgcmV0ICE9IEdTVF9GTE9XX0VPUykpIHsKKyAgICBpZiAocmV0ID09IEdTVF9GTE9XX09LIHx8IHJldCA9PSBHU1RfRkxPV19FT1MpCisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGVibWwsICJVbmtub3duIHN0cmVhbS9jb2RlYyBpbiB0cmFjayBlbnRyeSBoZWFkZXIiKTsKKworICAgIHBhcnNlLT5jb21tb24ubnVtX3N0cmVhbXMtLTsKKyAgICBnX3B0cl9hcnJheV9yZW1vdmVfaW5kZXggKHBhcnNlLT5jb21tb24uc3JjLCBwYXJzZS0+Y29tbW9uLm51bV9zdHJlYW1zKTsKKyAgICBnX2Fzc2VydCAocGFyc2UtPmNvbW1vbi5zcmMtPmxlbiA9PSBwYXJzZS0+Y29tbW9uLm51bV9zdHJlYW1zKTsKKyAgICBnc3RfbWF0cm9za2FfdHJhY2tfZnJlZSAoY29udGV4dCk7CisKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgaWYgKChjb250ZXh0LT5sYW5ndWFnZSA9PSBOVUxMIHx8ICpjb250ZXh0LT5sYW5ndWFnZSA9PSAnXDAnKSAmJgorICAgICAgKGNvbnRleHQtPnR5cGUgPT0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfQVVESU8gfHwKKyAgICAgICAgICBjb250ZXh0LT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFKSkgeworICAgIEdTVF9MT0cgKCJzdHJlYW0gJWQ6IGxhbmd1YWdlPWVuZyAoYXNzdW1pbmcgZGVmYXVsdCkiLCBjb250ZXh0LT5pbmRleCk7CisgICAgY29udGV4dC0+bGFuZ3VhZ2UgPSBnX3N0cmR1cCAoImVuZyIpOworICB9CisKKworICAvKiB0YWRhYWghICovCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX3BhcnNlX3F1ZXJ5IChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKyAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKmNvbnRleHQgPSBOVUxMOworCisgIGlmIChwYWQpIHsKKyAgICBjb250ZXh0ID0gZ3N0X3BhZF9nZXRfZWxlbWVudF9wcml2YXRlIChwYWQpOworICB9CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfUE9TSVRJT046CisgICAgeworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3Bvc2l0aW9uIChxdWVyeSwgJmZvcm1hdCwgTlVMTCk7CisKKyAgICAgIGlmIChmb3JtYXQgPT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocGFyc2UpOworICAgICAgICBpZiAoY29udGV4dCkKKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgR1NUX0ZPUk1BVF9USU1FLCBjb250ZXh0LT5wb3MpOworICAgICAgICBlbHNlCisgICAgICAgICAgZ3N0X3F1ZXJ5X3NldF9wb3NpdGlvbiAocXVlcnksIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgICAgICAgcGFyc2UtPmNvbW1vbi5zZWdtZW50LnBvc2l0aW9uKTsKKyAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHBhcnNlKTsKKyAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IEdTVF9GT1JNQVRfREVGQVVMVCAmJiBjb250ZXh0CisgICAgICAgICAgJiYgY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbikgeworICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHBhcnNlKTsKKyAgICAgICAgZ3N0X3F1ZXJ5X3NldF9wb3NpdGlvbiAocXVlcnksIEdTVF9GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgIGNvbnRleHQtPnBvcyAvIGNvbnRleHQtPmRlZmF1bHRfZHVyYXRpb24pOworICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocGFyc2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAib25seSBwb3NpdGlvbiBxdWVyeSBpbiBUSU1FIGFuZCBERUZBVUxUIGZvcm1hdCBpcyBzdXBwb3J0ZWQiKTsKKyAgICAgIH0KKworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9EVVJBVElPTjoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfZHVyYXRpb24gKHF1ZXJ5LCAmZm9ybWF0LCBOVUxMKTsKKworICAgICAgaWYgKGZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgR1NUX09CSkVDVF9MT0NLIChwYXJzZSk7CisgICAgICAgIGdzdF9xdWVyeV9zZXRfZHVyYXRpb24gKHF1ZXJ5LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICBwYXJzZS0+Y29tbW9uLnNlZ21lbnQuZHVyYXRpb24pOworICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocGFyc2UpOworICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gR1NUX0ZPUk1BVF9ERUZBVUxUICYmIGNvbnRleHQKKyAgICAgICAgICAmJiBjb250ZXh0LT5kZWZhdWx0X2R1cmF0aW9uKSB7CisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocGFyc2UpOworICAgICAgICBnc3RfcXVlcnlfc2V0X2R1cmF0aW9uIChxdWVyeSwgR1NUX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgcGFyc2UtPmNvbW1vbi5zZWdtZW50LmR1cmF0aW9uIC8gY29udGV4dC0+ZGVmYXVsdF9kdXJhdGlvbik7CisgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChwYXJzZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAgICJvbmx5IGR1cmF0aW9uIHF1ZXJ5IGluIFRJTUUgYW5kIERFRkFVTFQgZm9ybWF0IGlzIHN1cHBvcnRlZCIpOworICAgICAgfQorCisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHU1RfUVVFUllfU0VFS0lORzoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgZm10OworCisgICAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksICZmbXQsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgaWYgKGZtdCA9PSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgZ2Jvb2xlYW4gc2Vla2FibGU7CisKKyAgICAgICAgLyogYXNzdW1pbmcgd2UnbGwgYmUgYWJsZSB0byBnZXQgYW4gaW5kZXggLi4uICovCisgICAgICAgIHNlZWthYmxlID0gcGFyc2UtPnNlZWthYmxlOworCisgICAgICAgIGdzdF9xdWVyeV9zZXRfc2Vla2luZyAocXVlcnksIEdTVF9GT1JNQVRfVElNRSwgc2Vla2FibGUsCisgICAgICAgICAgICAwLCBwYXJzZS0+Y29tbW9uLnNlZ21lbnQuZHVyYXRpb24pOworICAgICAgICByZXMgPSBUUlVFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBpZiAocGFkKQorICAgICAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgKEdzdE9iamVjdCAqKSBwYXJzZSwgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9wYXJzZV9lbGVtZW50X3F1ZXJ5IChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgcmV0dXJuIGdzdF9tYXRyb3NrYV9wYXJzZV9xdWVyeSAoR1NUX01BVFJPU0tBX1BBUlNFIChlbGVtZW50KSwgTlVMTCwgcXVlcnkpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9wYXJzZV9oYW5kbGVfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXQ7CisgIEdzdE1hdHJvc2thUGFyc2UgKnBhcnNlID0gR1NUX01BVFJPU0tBX1BBUlNFIChwYXJlbnQpOworCisgIHJldCA9IGdzdF9tYXRyb3NrYV9wYXJzZV9xdWVyeSAocGFyc2UsIHBhZCwgcXVlcnkpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfcGFyc2Vfc2VuZF90YWdzIChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UpCit7CisgIGlmIChHX1VOTElLRUxZIChwYXJzZS0+Y29tbW9uLmdsb2JhbF90YWdzX2NoYW5nZWQpKSB7CisgICAgR3N0RXZlbnQgKnRhZ19ldmVudDsKKyAgICBnc3RfdGFnX2xpc3RfYWRkIChwYXJzZS0+Y29tbW9uLmdsb2JhbF90YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgIEdTVF9UQUdfQ09OVEFJTkVSX0ZPUk1BVCwgIk1hdHJvc2thIiwgTlVMTCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJTZW5kaW5nIGdsb2JhbF90YWdzICVwIDogJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgIHBhcnNlLT5jb21tb24uZ2xvYmFsX3RhZ3MsIHBhcnNlLT5jb21tb24uZ2xvYmFsX3RhZ3MpOworCisgICAgLyogU2VuZCBhIGNvcHkgYXMgd2Ugd2FudCB0byBrZWVwIG91ciBsb2NhbCByZWYgd3JpdGFibGUgdG8gYWRkIG1vcmUgdGFncworICAgICAqIGlmIGFueSBhcmUgZm91bmQgKi8KKyAgICB0YWdfZXZlbnQgPQorICAgICAgICBnc3RfZXZlbnRfbmV3X3RhZyAoZ3N0X3RhZ19saXN0X2NvcHkgKHBhcnNlLT5jb21tb24uZ2xvYmFsX3RhZ3MpKTsKKworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocGFyc2UtPnNyY3BhZCwgdGFnX2V2ZW50KTsKKworICAgIHBhcnNlLT5jb21tb24uZ2xvYmFsX3RhZ3NfY2hhbmdlZCA9IEZBTFNFOworICB9Cit9CisKKy8qIHJldHVybnMgRkFMU0UgaWYgdGhlcmUgYXJlIG5vIHBhZHMgdG8gZGVsaXZlciBldmVudCB0bywKKyAqIG90aGVyd2lzZSBUUlVFICh3aGF0ZXZlciB0aGUgb3V0Y29tZSBvZiBldmVudCBzZW5kaW5nKSwKKyAqIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgcGFzc2VkIGV2ZW50ISAqLworc3RhdGljIGdib29sZWFuCitnc3RfbWF0cm9za2FfcGFyc2Vfc2VuZF9ldmVudCAoR3N0TWF0cm9za2FQYXJzZSAqIHBhcnNlLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZXZlbnQgIT0gTlVMTCwgRkFMU0UpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiU2VuZGluZyBldmVudCBvZiB0eXBlICVzIHRvIGFsbCBzb3VyY2UgcGFkcyIsCisgICAgICBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIGdzdF9wYWRfcHVzaF9ldmVudCAocGFyc2UtPnNyY3BhZCwgZXZlbnQpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX3BhcnNlX2VsZW1lbnRfc2VuZF9ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdE1hdHJvc2thUGFyc2UgKnBhcnNlID0gR1NUX01BVFJPU0tBX1BBUlNFIChlbGVtZW50KTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChldmVudCAhPSBOVUxMLCBGQUxTRSk7CisKKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX1NFRUspIHsKKyAgICByZXMgPSBnc3RfbWF0cm9za2FfcGFyc2VfaGFuZGxlX3NlZWtfZXZlbnQgKHBhcnNlLCBOVUxMLCBldmVudCk7CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIlVuaGFuZGxlZCBldmVudCBvZiB0eXBlICVzIiwKKyAgICAgICAgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKyAgICByZXMgPSBGQUxTRTsKKyAgfQorICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgcmV0dXJuIHJlczsKK30KKworI2lmIDAKKy8qIHNlYXJjaGVzIGZvciBhIGNsdXN0ZXIgc3RhcnQgZnJvbSBAcG9zLAorICogcmV0dXJuIEdTVF9GTE9XX09LIGFuZCBjbHVzdGVyIHBvc2l0aW9uIGluIEBwb3MgaWYgZm91bmQgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcGFyc2Vfc2VhcmNoX2NsdXN0ZXIgKEdzdE1hdHJvc2thUGFyc2UgKiBwYXJzZSwgZ2ludDY0ICogcG9zKQoreworICBnaW50NjQgbmV3cG9zID0gKnBvczsKKyAgZ2ludDY0IG9yaWdfb2Zmc2V0OworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBjb25zdCBndWludCBjaHVuayA9IDY0ICogMTAyNDsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdE1hcEluZm8gbWFwOworICBncG9pbnRlciBkYXRhOworICBnc2l6ZSBzaXplOworICBndWludDY0IGxlbmd0aDsKKyAgZ3VpbnQzMiBpZDsKKyAgZ3VpbnQgbmVlZGVkOworCisgIG9yaWdfb2Zmc2V0ID0gcGFyc2UtPmNvbW1vbi5vZmZzZXQ7CisKKyAgLyogcmVhZCBpbiBhdCBuZXdwb3MgYW5kIHNjYW4gZm9yIGVibWwgY2x1c3RlciBpZCAqLworICB3aGlsZSAoMSkgeworICAgIEdzdEJ5dGVSZWFkZXIgcmVhZGVyOworICAgIGdpbnQgY2x1c3Rlcl9wb3M7CisKKyAgICBidWYgPSBOVUxMOworICAgIHJldCA9IGdzdF9wYWRfcHVsbF9yYW5nZSAocGFyc2UtPmNvbW1vbi5zaW5rcGFkLCBuZXdwb3MsIGNodW5rLCAmYnVmKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICJyZWFkIGJ1ZmZlciBzaXplICUiIEdfR1NJWkVfRk9STUFUICIgYXQgb2Zmc2V0ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSwgbmV3cG9zKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIGRhdGEgPSBtYXAuZGF0YTsKKyAgICBzaXplID0gbWFwLnNpemU7CisgICAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZyZWFkZXIsIGRhdGEsIHNpemUpOworICAgIGNsdXN0ZXJfcG9zID0gMDsKKyAgcmVzdW1lOgorICAgIGNsdXN0ZXJfcG9zID0gZ3N0X2J5dGVfcmVhZGVyX21hc2tlZF9zY2FuX3VpbnQzMiAoJnJlYWRlciwgMHhmZmZmZmZmZiwKKyAgICAgICAgR1NUX01BVFJPU0tBX0lEX0NMVVNURVIsIGNsdXN0ZXJfcG9zLCBzaXplIC0gY2x1c3Rlcl9wb3MpOworICAgIGlmIChjbHVzdGVyX3BvcyA+PSAwKSB7CisgICAgICBuZXdwb3MgKz0gY2x1c3Rlcl9wb3M7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAiZm91bmQgY2x1c3RlciBlYm1sIGlkIGF0IG9mZnNldCAlIiBHX0dJTlQ2NF9GT1JNQVQsIG5ld3Bvcyk7CisgICAgICAvKiBleHRyYSBjaGVja3Mgd2hldGhlciB3ZSByZWFsbHkgc3luYydlZCB0byBhIGNsdXN0ZXI6CisgICAgICAgKiAtIGVpdGhlciBpdCBpcyB0aGUgZmlyc3QgYW5kIG9ubHkgY2x1c3RlcgorICAgICAgICogLSBlaXRoZXIgdGhlcmUgaXMgYSBjbHVzdGVyIGFmdGVyIHRoaXMgb25lCisgICAgICAgKiAtIGVpdGhlciBjbHVzdGVyIGxlbmd0aCBpcyB1bmRlZmluZWQKKyAgICAgICAqLworICAgICAgLyogb2sgaWYgZmlyc3QgY2x1c3RlciAodGhlcmUgbWF5IG5vdCBhIHN1YnNlcXVlbnQgb25lKSAqLworICAgICAgaWYgKG5ld3BvcyA9PSBwYXJzZS0+Zmlyc3RfY2x1c3Rlcl9vZmZzZXQpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJjbHVzdGVyIGlzIGZpcnN0IGNsdXN0ZXIgLT4gT0siKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBwYXJzZS0+Y29tbW9uLm9mZnNldCA9IG5ld3BvczsKKyAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX2lkX2xlbmd0aF9wdWxsICgmcGFyc2UtPmNvbW1vbiwKKyAgICAgICAgICBHU1RfRUxFTUVOVF9DQVNUIChwYXJzZSksICZpZCwgJmxlbmd0aCwgJm5lZWRlZCk7CisgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICBnb3RvIHJlc3VtZTsKKyAgICAgIGdfYXNzZXJ0IChpZCA9PSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUik7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgImNsdXN0ZXIgc2l6ZSAlIiBHX0dVSU5UNjRfRk9STUFUICIsIHByZWZpeCAlZCIsCisgICAgICAgICAgbGVuZ3RoLCBuZWVkZWQpOworICAgICAgLyogb2sgaWYgdW5kZWZpbmVkIGxlbmd0aCBvciBmaXJzdCBjbHVzdGVyICovCisgICAgICBpZiAobGVuZ3RoID09IEdfTUFYVUlOVDY0KSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiY2x1c3RlciBoYXMgdW5kZWZpbmVkIGxlbmd0aCAtPiBPSyIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8qIHNraXAgY2x1c3RlciAqLworICAgICAgcGFyc2UtPmNvbW1vbi5vZmZzZXQgKz0gbGVuZ3RoICsgbmVlZGVkOworICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BlZWtfaWRfbGVuZ3RoX3B1bGwgKCZwYXJzZS0+Y29tbW9uLAorICAgICAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKHBhcnNlKSwgJmlkLCAmbGVuZ3RoLCAmbmVlZGVkKTsKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gcmVzdW1lOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJuZXh0IGVsZW1lbnQgaXMgJXNjbHVzdGVyIiwKKyAgICAgICAgICBpZCA9PSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUiA/ICIiIDogIm5vdCAiKTsKKyAgICAgIGlmIChpZCA9PSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUikKKyAgICAgICAgYnJlYWs7CisgICAgICAvKiBub3Qgb2ssIHJlc3VtZSAqLworICAgICAgZ290byByZXN1bWU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHBhcnRpYWwgY2x1c3RlciBpZCBtYXkgaGF2ZSBiZWVuIGluIHRhaWwgb2YgYnVmZmVyICovCisgICAgICBuZXdwb3MgKz0gTUFYIChzaXplLCA0KSAtIDM7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgIGJ1ZiA9IE5VTEw7CisgICAgfQorICB9CisKKyAgaWYgKGJ1ZikgeworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICBidWYgPSBOVUxMOworICB9CisKKyAgcGFyc2UtPmNvbW1vbi5vZmZzZXQgPSBvcmlnX29mZnNldDsKKyAgKnBvcyA9IG5ld3BvczsKKyAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9wYXJzZV9oYW5kbGVfc2Vla19ldmVudCAoR3N0TWF0cm9za2FQYXJzZSAqIHBhcnNlLAorICAgIEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0TWF0cm9za2FJbmRleCAqZW50cnkgPSBOVUxMOworICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgIEdzdFNlZWtUeXBlIGN1cl90eXBlLCBzdG9wX3R5cGU7CisgIEdzdEZvcm1hdCBmb3JtYXQ7CisgIGdkb3VibGUgcmF0ZTsKKyAgZ2ludDY0IGN1ciwgc3RvcDsKKyAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKnRyYWNrID0gTlVMTDsKKyAgR3N0U2VnbWVudCBzZWVrc2VnbWVudCA9IHsgMCwgfTsKKyAgZ2Jvb2xlYW4gdXBkYXRlOworICBHc3RTZWFyY2hNb2RlIHNuYXBfZGlyOworCisgIGlmIChwYWQpCisgICAgdHJhY2sgPSBnc3RfcGFkX2dldF9lbGVtZW50X3ByaXZhdGUgKHBhZCk7CisKKyAgdHJhY2sgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZ2V0X3NlZWtfdHJhY2sgKCZwYXJzZS0+Y29tbW9uLCB0cmFjayk7CisKKyAgZ3N0X2V2ZW50X3BhcnNlX3NlZWsgKGV2ZW50LCAmcmF0ZSwgJmZvcm1hdCwgJmZsYWdzLCAmY3VyX3R5cGUsICZjdXIsCisgICAgICAmc3RvcF90eXBlLCAmc3RvcCk7CisKKyAgLyogd2UgY2FuIG9ubHkgc2VlayBvbiB0aW1lICovCisgIGlmIChmb3JtYXQgIT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJDYW4gb25seSBzZWVrIG9uIFRJTUUiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBjb3B5IHNlZ21lbnQsIHdlIG5lZWQgdGhpcyBiZWNhdXNlIHdlIHN0aWxsIG5lZWQgdGhlIG9sZAorICAgKiBzZWdtZW50IHdoZW4gd2UgY2xvc2UgdGhlIGN1cnJlbnQgc2VnbWVudC4gKi8KKyAgbWVtY3B5ICgmc2Vla3NlZ21lbnQsICZwYXJzZS0+Y29tbW9uLnNlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworCisgIGlmIChldmVudCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiY29uZmlndXJpbmcgc2VlayIpOworICAgIGdzdF9zZWdtZW50X2RvX3NlZWsgKCZzZWVrc2VnbWVudCwgcmF0ZSwgZm9ybWF0LCBmbGFncywKKyAgICAgICAgY3VyX3R5cGUsIGN1ciwgc3RvcF90eXBlLCBzdG9wLCAmdXBkYXRlKTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiTmV3IHNlZ21lbnQgJSIgR1NUX1NFR01FTlRfRk9STUFULCAmc2Vla3NlZ21lbnQpOworCisgIGlmIChzZWVrc2VnbWVudC5yYXRlIDwgMCkKKyAgICBzbmFwX2RpciA9IEdTVF9TRUFSQ0hfTU9ERV9BRlRFUjsKKyAgZWxzZQorICAgIHNuYXBfZGlyID0gR1NUX1NFQVJDSF9NT0RFX0JFRk9SRTsKKworICAvKiBjaGVjayBzYW5pdHkgYmVmb3JlIHdlIHN0YXJ0IGZsdXNoaW5nIGFuZCBhbGwgdGhhdCAqLworICBHU1RfT0JKRUNUX0xPQ0sgKHBhcnNlKTsKKyAgaWYgKChlbnRyeSA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9kb19pbmRleF9zZWVrICgmcGFyc2UtPmNvbW1vbiwgdHJhY2ssCisgICAgICAgICAgICAgIHNlZWtzZWdtZW50LnBvc2l0aW9uLCAmcGFyc2UtPnNlZWtfaW5kZXgsICZwYXJzZS0+c2Vla19lbnRyeSwKKyAgICAgICAgICAgICAgc25hcF9kaXIpKSA9PSBOVUxMKSB7CisgICAgLyogcHVsbCBtb2RlIHdpdGhvdXQgaW5kZXggY2FuIHNjYW4gbGF0ZXIgb24gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIk5vIG1hdGNoaW5nIHNlZWsgZW50cnkgaW4gaW5kZXgiKTsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocGFyc2UpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlNlZWsgcG9zaXRpb24gbG9va3Mgc2FuZSIpOworICBHU1RfT0JKRUNUX1VOTE9DSyAocGFyc2UpOworCisgIC8qIG5lZWQgdG8gc2VlayB0byBjbHVzdGVyIHN0YXJ0IHRvIHBpY2sgdXAgY2x1c3RlciB0aW1lICovCisgIC8qIHVwc3RyZWFtIHRha2VzIGNhcmUgb2YgZmx1c2hpbmcgYW5kIGFsbCB0aGF0CisgICAqIC4uLiBhbmQgbmV3c2VnbWVudCBldmVudCBoYW5kbGluZyB0YWtlcyBjYXJlIG9mIHRoZSByZXN0ICovCisgIHJldHVybiBwZXJmb3JtX3NlZWtfdG9fb2Zmc2V0IChwYXJzZSwgZW50cnktPnBvcworICAgICAgKyBwYXJzZS0+Y29tbW9uLmVibWxfc2VnbWVudF9zdGFydCk7Cit9CisKKy8qCisgKiBIYW5kbGUgd2hldGhlciB3ZSBjYW4gcGVyZm9ybSB0aGUgc2VlayBldmVudCBvciBpZiB3ZSBoYXZlIHRvIGxldCB0aGUgY2hhaW4KKyAqIGZ1bmN0aW9uIGhhbmRsZSBzZWVrcyB0byBidWlsZCB0aGUgc2VlayBpbmRleGVzIGZpcnN0LgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9wYXJzZV9oYW5kbGVfc2Vla19wdXNoIChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgIEdzdFNlZWtUeXBlIGN1cl90eXBlLCBzdG9wX3R5cGU7CisgIEdzdEZvcm1hdCBmb3JtYXQ7CisgIGdkb3VibGUgcmF0ZTsKKyAgZ2ludDY0IGN1ciwgc3RvcDsKKworICBnc3RfZXZlbnRfcGFyc2Vfc2VlayAoZXZlbnQsICZyYXRlLCAmZm9ybWF0LCAmZmxhZ3MsICZjdXJfdHlwZSwgJmN1ciwKKyAgICAgICZzdG9wX3R5cGUsICZzdG9wKTsKKworICAvKiBzYW5pdHkgY2hlY2tzICovCisKKyAgLyogd2UgY2FuIG9ubHkgc2VlayBvbiB0aW1lICovCisgIGlmIChmb3JtYXQgIT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJDYW4gb25seSBzZWVrIG9uIFRJTUUiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoc3RvcF90eXBlICE9IEdTVF9TRUVLX1RZUEVfTk9ORSAmJiBzdG9wICE9IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlNlZWsgZW5kLXRpbWUgbm90IHN1cHBvcnRlZCBpbiBzdHJlYW1pbmcgbW9kZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICghKGZsYWdzICYgR1NUX1NFRUtfRkxBR19GTFVTSCkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgIk5vbi1mbHVzaGluZyBzZWVrIG5vdCBzdXBwb3J0ZWQgaW4gc3RyZWFtaW5nIG1vZGUiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NFR01FTlQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlNlZ21lbnQgc2VlayBub3Qgc3VwcG9ydGVkIGluIHN0cmVhbWluZyBtb2RlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogY2hlY2sgZm9yIGhhdmluZyBwYXJzZWQgaW5kZXggYWxyZWFkeSAqLworICBpZiAoIXBhcnNlLT5jb21tb24uaW5kZXhfcGFyc2VkKSB7CisgICAgZ2Jvb2xlYW4gYnVpbGRpbmdfaW5kZXg7CisgICAgZ3VpbnQ2NCBvZmZzZXQgPSAwOworCisgICAgaWYgKCFwYXJzZS0+aW5kZXhfb2Zmc2V0KSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIm5vIGluZGV4IChsb2NhdGlvbik7IG5vIHNlZWsgaW4gcHVzaCBtb2RlIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgR1NUX09CSkVDVF9MT0NLIChwYXJzZSk7CisgICAgLyogaGFuZGxlIHRoZSBzZWVrIGV2ZW50IGluIHRoZSBjaGFpbiBmdW5jdGlvbiAqLworICAgIHBhcnNlLT5jb21tb24uc3RhdGUgPSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TRUVLOworICAgIC8qIG5vIG1vcmUgc2VlayBjYW4gYmUgaXNzdWVkIHVudGlsIHN0YXRlIHJlc2V0IHRvIF9EQVRBICovCisKKyAgICAvKiBjb3B5IHRoZSBldmVudCAqLworICAgIGlmIChwYXJzZS0+c2Vla19ldmVudCkKKyAgICAgIGdzdF9ldmVudF91bnJlZiAocGFyc2UtPnNlZWtfZXZlbnQpOworICAgIHBhcnNlLT5zZWVrX2V2ZW50ID0gZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworCisgICAgLyogc2V0IHRoZSBidWlsZGluZ19pbmRleCBmbGFnIHNvIHRoYXQgb25seSBvbmUgdGhyZWFkIGNhbiBzZXR1cCB0aGUKKyAgICAgKiBzdHJ1Y3R1cmVzIGZvciBpbmRleCBzZWVraW5nLiAqLworICAgIGJ1aWxkaW5nX2luZGV4ID0gcGFyc2UtPmJ1aWxkaW5nX2luZGV4OworICAgIGlmICghYnVpbGRpbmdfaW5kZXgpIHsKKyAgICAgIHBhcnNlLT5idWlsZGluZ19pbmRleCA9IFRSVUU7CisgICAgICBvZmZzZXQgPSBwYXJzZS0+aW5kZXhfb2Zmc2V0OworICAgIH0KKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocGFyc2UpOworCisgICAgaWYgKCFidWlsZGluZ19pbmRleCkgeworICAgICAgLyogc2VlayB0byB0aGUgZmlyc3Qgc3ViaW5kZXggb3IgbGVnYWN5IGluZGV4ICovCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHBhcnNlLCAiU2Vla2luZyB0byBDdWVzIGF0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG9mZnNldCk7CisgICAgICByZXR1cm4gcGVyZm9ybV9zZWVrX3RvX29mZnNldCAocGFyc2UsIG9mZnNldCk7CisgICAgfQorCisgICAgLyogd2VsbCwgd2UgYXJlIGhhbmRsaW5nIGl0IGFscmVhZHkgKi8KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIC8qIGRlbGVnYXRlIHRvIHR3ZWFrZWQgcmVndWxhciBzZWVrICovCisgIHJldHVybiBnc3RfbWF0cm9za2FfcGFyc2VfaGFuZGxlX3NlZWtfZXZlbnQgKHBhcnNlLCBwYWQsIGV2ZW50KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbWF0cm9za2FfcGFyc2VfaGFuZGxlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0TWF0cm9za2FQYXJzZSAqcGFyc2UgPSBHU1RfTUFUUk9TS0FfUEFSU0UgKHBhcmVudCk7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICAgIC8qIG5vIHNlZWtpbmcgdW50aWwgd2UgYXJlIChzYWZlbHkpIHJlYWR5ICovCisgICAgICBpZiAocGFyc2UtPmNvbW1vbi5zdGF0ZSAhPSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9EQVRBKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAibm90IHJlYWR5IGZvciBzZWVraW5nIHlldCIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICByZXMgPSBnc3RfbWF0cm9za2FfcGFyc2VfaGFuZGxlX3NlZWtfcHVzaCAocGFyc2UsIHBhZCwgZXZlbnQpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR1NUX0VWRU5UX1FPUzoKKyAgICB7CisgICAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqY29udGV4dCA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgICAgIGlmIChjb250ZXh0LT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1ZJREVPKSB7CisgICAgICAgIEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQgKnZpZGVvY29udGV4dCA9CisgICAgICAgICAgICAoR3N0TWF0cm9za2FUcmFja1ZpZGVvQ29udGV4dCAqKSBjb250ZXh0OworICAgICAgICBnZG91YmxlIHByb3BvcnRpb247CisgICAgICAgIEdzdENsb2NrVGltZURpZmYgZGlmZjsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKworICAgICAgICBnc3RfZXZlbnRfcGFyc2VfcW9zIChldmVudCwgTlVMTCwgJnByb3BvcnRpb24sICZkaWZmLCAmdGltZXN0YW1wKTsKKworICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHBhcnNlKTsKKyAgICAgICAgdmlkZW9jb250ZXh0LT5lYXJsaWVzdF90aW1lID0gdGltZXN0YW1wICsgZGlmZjsKKyAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHBhcnNlKTsKKyAgICAgIH0KKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgICAgLyogZXZlbnRzIHdlIGRvbid0IG5lZWQgdG8gaGFuZGxlICovCisgICAgY2FzZSBHU1RfRVZFTlRfTkFWSUdBVElPTjoKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgcmVzID0gRkFMU0U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR1NUX0VWRU5UX0xBVEVOQ1k6CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAocGFyc2UtPmNvbW1vbi5zaW5rcGFkLCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcGFyc2VfcGFyc2VfdHJhY2tzIChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UsIEdzdEVibWxSZWFkICogZWJtbCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ3VpbnQzMiBpZDsKKworICBERUJVR19FTEVNRU5UX1NUQVJUIChwYXJzZSwgZWJtbCwgIlRyYWNrcyIpOworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChwYXJzZSwgZWJtbCwgIlRyYWNrcyIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgLyogb25lIHRyYWNrIHdpdGhpbiB0aGUgImFsbC10cmFja3MiIGhlYWRlciAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tFTlRSWToKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3BhcnNlX2FkZF9zdHJlYW0gKHBhcnNlLCBlYm1sKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwICgmcGFyc2UtPmNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICJUcmFjayIsIGlkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIERFQlVHX0VMRU1FTlRfU1RPUCAocGFyc2UsIGVibWwsICJUcmFja3MiLCByZXQpOworCisgIHBhcnNlLT50cmFja3NfcGFyc2VkID0gVFJVRTsKKworICByZXR1cm4gcmV0OworfQorCisvKgorICogUmVhZCBzaWduZWQvdW5zaWduZWQgIkVCTUwiIG51bWJlcnMuCisgKiBSZXR1cm46IG51bWJlciBvZiBieXRlcyBwcm9jZXNzZWQuCisgKi8KKworc3RhdGljIGdpbnQKK2dzdF9tYXRyb3NrYV9lYm1sbnVtX3VpbnQgKGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIGd1aW50NjQgKiBudW0pCit7CisgIGdpbnQgbGVuX21hc2sgPSAweDgwLCByZWFkID0gMSwgbiA9IDEsIG51bV9mZnMgPSAwOworICBndWludDY0IHRvdGFsOworCisgIGlmIChzaXplIDw9IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICB0b3RhbCA9IGRhdGFbMF07CisgIHdoaWxlIChyZWFkIDw9IDggJiYgISh0b3RhbCAmIGxlbl9tYXNrKSkgeworICAgIHJlYWQrKzsKKyAgICBsZW5fbWFzayA+Pj0gMTsKKyAgfQorICBpZiAocmVhZCA+IDgpCisgICAgcmV0dXJuIC0xOworCisgIGlmICgodG90YWwgJj0gKGxlbl9tYXNrIC0gMSkpID09IGxlbl9tYXNrIC0gMSkKKyAgICBudW1fZmZzKys7CisgIGlmIChzaXplIDwgcmVhZCkKKyAgICByZXR1cm4gLTE7CisgIHdoaWxlIChuIDwgcmVhZCkgeworICAgIGlmIChkYXRhW25dID09IDB4ZmYpCisgICAgICBudW1fZmZzKys7CisgICAgdG90YWwgPSAodG90YWwgPDwgOCkgfCBkYXRhW25dOworICAgIG4rKzsKKyAgfQorCisgIGlmIChyZWFkID09IG51bV9mZnMgJiYgdG90YWwgIT0gMCkKKyAgICAqbnVtID0gR19NQVhVSU5UNjQ7CisgIGVsc2UKKyAgICAqbnVtID0gdG90YWw7CisKKyAgcmV0dXJuIHJlYWQ7Cit9CisKK3N0YXRpYyBnaW50Citnc3RfbWF0cm9za2FfZWJtbG51bV9zaW50IChndWludDggKiBkYXRhLCBndWludCBzaXplLCBnaW50NjQgKiBudW0pCit7CisgIGd1aW50NjQgdW51bTsKKyAgZ2ludCByZXM7CisKKyAgLyogcmVhZCBhcyB1bnNpZ25lZCBudW1iZXIgZmlyc3QgKi8KKyAgaWYgKChyZXMgPSBnc3RfbWF0cm9za2FfZWJtbG51bV91aW50IChkYXRhLCBzaXplLCAmdW51bSkpIDwgMCkKKyAgICByZXR1cm4gLTE7CisKKyAgLyogbWFrZSBzaWduZWQgKi8KKyAgaWYgKHVudW0gPT0gR19NQVhVSU5UNjQpCisgICAgKm51bSA9IEdfTUFYSU5UNjQ7CisgIGVsc2UKKyAgICAqbnVtID0gdW51bSAtICgoMSA8PCAoKDcgKiByZXMpIC0gMSkpIC0gMSk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9wYXJzZV9wYXJzZV9ibG9ja2dyb3VwX29yX3NpbXBsZWJsb2NrIChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UsCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sLCBndWludDY0IGNsdXN0ZXJfdGltZSwgZ3VpbnQ2NCBjbHVzdGVyX29mZnNldCwKKyAgICBnYm9vbGVhbiBpc19zaW1wbGVibG9jaykKK3sKKyAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKnN0cmVhbSA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGdib29sZWFuIHJlYWRibG9jayA9IEZBTFNFOworICBndWludDMyIGlkOworICBndWludDY0IGJsb2NrX2R1cmF0aW9uID0gMDsKKyAgR3N0QnVmZmVyICpidWYgPSBOVUxMOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2ludCBzdHJlYW1fbnVtID0gLTEsIG4sIGxhY2VzID0gMDsKKyAgZ3VpbnQgc2l6ZSA9IDA7CisgIGdpbnQgKmxhY2Vfc2l6ZSA9IE5VTEw7CisgIGdpbnQ2NCB0aW1lID0gMDsKKyAgZ2ludCBmbGFncyA9IDA7CisgIGdpbnQ2NCByZWZlcmVuY2VibG9jayA9IDA7CisKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgaWYgKCFpc19zaW1wbGVibG9jaykgeworICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykgeworICAgICAgICBnb3RvIGRhdGFfZXJyb3I7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlkID0gR1NUX01BVFJPU0tBX0lEX1NJTVBMRUJMT0NLOworICAgIH0KKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgLyogb25lIGJsb2NrIGluc2lkZSB0aGUgZ3JvdXAuIE5vdGUsIGJsb2NrIHBhcnNpbmcgaXMgb25lCisgICAgICAgICAqIG9mIHRoZSBoYXJkZXIgdGhpbmdzLCBzbyB0aGlzIGNvZGUgaXMgYSBiaXQgY29tcGxpY2F0ZWQuCisgICAgICAgICAqIFNlZSBodHRwOi8vd3d3Lm1hdHJvc2thLm9yZy8gZm9yIGRvY3VtZW50YXRpb24uICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TSU1QTEVCTE9DSzoKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0JMT0NLOgorICAgICAgeworICAgICAgICBndWludDY0IG51bTsKKyAgICAgICAgZ3VpbnQ4ICpkYXRhOworCisgICAgICAgIGlmIChidWYpIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgIGJ1ZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX2J1ZmZlciAoZWJtbCwgJmlkLCAmYnVmKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgICAgZGF0YSA9IG1hcC5kYXRhOworICAgICAgICBzaXplID0gbWFwLnNpemU7CisKKyAgICAgICAgLyogZmlyc3QgYnl0ZShzKTogYmxvY2tudW0gKi8KKyAgICAgICAgaWYgKChuID0gZ3N0X21hdHJvc2thX2VibWxudW1fdWludCAoZGF0YSwgc2l6ZSwgJm51bSkpIDwgMCkKKyAgICAgICAgICBnb3RvIGRhdGFfZXJyb3I7CisgICAgICAgIGRhdGEgKz0gbjsKKyAgICAgICAgc2l6ZSAtPSBuOworCisgICAgICAgIC8qIGZldGNoIHN0cmVhbSBmcm9tIG51bSAqLworICAgICAgICBzdHJlYW1fbnVtID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3N0cmVhbV9mcm9tX251bSAoJnBhcnNlLT5jb21tb24sCisgICAgICAgICAgICBudW0pOworICAgICAgICBpZiAoR19VTkxJS0VMWSAoc2l6ZSA8IDMpKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkludmFsaWQgc2l6ZSAldSIsIHNpemUpOworICAgICAgICAgIC8qIG5vbi1mYXRhbCwgdHJ5IG5leHQgYmxvY2soZ3JvdXApICovCisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9IGVsc2UgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbV9udW0gPCAwIHx8CisgICAgICAgICAgICAgICAgc3RyZWFtX251bSA+PSBwYXJzZS0+Y29tbW9uLm51bV9zdHJlYW1zKSkgeworICAgICAgICAgIC8qIGxldCdzIG5vdCBnaXZlIHVwIG9uIGEgc3RyYXkgaW52YWxpZCB0cmFjayBudW1iZXIgKi8KKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLAorICAgICAgICAgICAgICAiSW52YWxpZCBzdHJlYW0gJWQgZm9yIHRyYWNrIG51bWJlciAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgICAgICI7IGlnbm9yaW5nIGJsb2NrIiwgc3RyZWFtX251bSwgbnVtKTsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgICBzdHJlYW0gPSBnX3B0cl9hcnJheV9pbmRleCAocGFyc2UtPmNvbW1vbi5zcmMsIHN0cmVhbV9udW0pOworCisgICAgICAgIC8qIHRpbWUgKHJlbGF0aXZlIHRvIGNsdXN0ZXIgdGltZSkgKi8KKyAgICAgICAgdGltZSA9ICgoZ2ludDE2KSBHU1RfUkVBRF9VSU5UMTZfQkUgKGRhdGEpKTsKKyAgICAgICAgZGF0YSArPSAyOworICAgICAgICBzaXplIC09IDI7CisgICAgICAgIGZsYWdzID0gR1NUX1JFQURfVUlOVDggKGRhdGEpOworICAgICAgICBkYXRhICs9IDE7CisgICAgICAgIHNpemUgLT0gMTsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJ0aW1lICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgZmxhZ3MgJWQiLCB0aW1lLAorICAgICAgICAgICAgZmxhZ3MpOworCisgICAgICAgIHN3aXRjaCAoKGZsYWdzICYgMHgwNikgPj4gMSkgeworICAgICAgICAgIGNhc2UgMHgwOiAgICAgICAgICAgIC8qIG5vIGxhY2luZyAqLworICAgICAgICAgICAgbGFjZXMgPSAxOworICAgICAgICAgICAgbGFjZV9zaXplID0gZ19uZXcgKGdpbnQsIDEpOworICAgICAgICAgICAgbGFjZV9zaXplWzBdID0gc2l6ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAweDE6ICAgICAgICAgICAgLyogeGlwaCBsYWNpbmcgKi8KKyAgICAgICAgICBjYXNlIDB4MjogICAgICAgICAgICAvKiBmaXhlZC1zaXplIGxhY2luZyAqLworICAgICAgICAgIGNhc2UgMHgzOiAgICAgICAgICAgIC8qIEVCTUwgbGFjaW5nICovCisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICAgICAgICBnb3RvIGludmFsaWRfbGFjaW5nOworICAgICAgICAgICAgbGFjZXMgPSBHU1RfUkVBRF9VSU5UOCAoZGF0YSkgKyAxOworICAgICAgICAgICAgZGF0YSArPSAxOworICAgICAgICAgICAgc2l6ZSAtPSAxOworICAgICAgICAgICAgbGFjZV9zaXplID0gZ19uZXcwIChnaW50LCBsYWNlcyk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoKGZsYWdzICYgMHgwNikgPj4gMSkgeworICAgICAgICAgICAgICBjYXNlIDB4MTogICAgICAgIC8qIHhpcGggbGFjaW5nICovICB7CisgICAgICAgICAgICAgICAgZ3VpbnQgdGVtcCwgdG90YWwgPSAwOworCisgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgcmV0ID09IEdTVF9GTE9XX09LICYmIG4gPCBsYWNlcyAtIDE7IG4rKykgeworICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICBnb3RvIGludmFsaWRfbGFjaW5nOworICAgICAgICAgICAgICAgICAgICB0ZW1wID0gR1NUX1JFQURfVUlOVDggKGRhdGEpOworICAgICAgICAgICAgICAgICAgICBsYWNlX3NpemVbbl0gKz0gdGVtcDsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSArPSAxOworICAgICAgICAgICAgICAgICAgICBzaXplIC09IDE7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wICE9IDB4ZmYpCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB0b3RhbCArPSBsYWNlX3NpemVbbl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhY2Vfc2l6ZVtuXSA9IHNpemUgLSB0b3RhbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNhc2UgMHgyOiAgICAgICAgLyogZml4ZWQtc2l6ZSBsYWNpbmcgKi8KKyAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbGFjZXM7IG4rKykKKyAgICAgICAgICAgICAgICAgIGxhY2Vfc2l6ZVtuXSA9IHNpemUgLyBsYWNlczsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIDB4MzogICAgICAgIC8qIEVCTUwgbGFjaW5nICovICB7CisgICAgICAgICAgICAgICAgZ3VpbnQgdG90YWw7CisKKyAgICAgICAgICAgICAgICBpZiAoKG4gPSBnc3RfbWF0cm9za2FfZWJtbG51bV91aW50IChkYXRhLCBzaXplLCAmbnVtKSkgPCAwKQorICAgICAgICAgICAgICAgICAgZ290byBkYXRhX2Vycm9yOworICAgICAgICAgICAgICAgIGRhdGEgKz0gbjsKKyAgICAgICAgICAgICAgICBzaXplIC09IG47CisgICAgICAgICAgICAgICAgdG90YWwgPSBsYWNlX3NpemVbMF0gPSBudW07CisgICAgICAgICAgICAgICAgZm9yIChuID0gMTsgcmV0ID09IEdTVF9GTE9XX09LICYmIG4gPCBsYWNlcyAtIDE7IG4rKykgeworICAgICAgICAgICAgICAgICAgZ2ludDY0IHNudW07CisgICAgICAgICAgICAgICAgICBnaW50IHI7CisKKyAgICAgICAgICAgICAgICAgIGlmICgociA9IGdzdF9tYXRyb3NrYV9lYm1sbnVtX3NpbnQgKGRhdGEsIHNpemUsICZzbnVtKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGRhdGFfZXJyb3I7CisgICAgICAgICAgICAgICAgICBkYXRhICs9IHI7CisgICAgICAgICAgICAgICAgICBzaXplIC09IHI7CisgICAgICAgICAgICAgICAgICBsYWNlX3NpemVbbl0gPSBsYWNlX3NpemVbbiAtIDFdICsgc251bTsKKyAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGxhY2Vfc2l6ZVtuXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG4gPCBsYWNlcykKKyAgICAgICAgICAgICAgICAgIGxhY2Vfc2l6ZVtuXSA9IHNpemUgLSB0b3RhbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHJlYWRibG9jayA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9CTE9DS0RVUkFUSU9OOnsKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZibG9ja19kdXJhdGlvbik7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiQmxvY2tEdXJhdGlvbjogJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIGJsb2NrX2R1cmF0aW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1JFRkVSRU5DRUJMT0NLOnsKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9zaW50IChlYm1sLCAmaWQsICZyZWZlcmVuY2VibG9jayk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiUmVmZXJlbmNlQmxvY2s6ICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIHJlZmVyZW5jZWJsb2NrKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPREVDU1RBVEU6eworICAgICAgICBndWludDggKmRhdGE7CisgICAgICAgIGd1aW50NjQgZGF0YV9sZW4gPSAwOworCisgICAgICAgIGlmICgocmV0ID0KKyAgICAgICAgICAgICAgICBnc3RfZWJtbF9yZWFkX2JpbmFyeSAoZWJtbCwgJmlkLCAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgJmRhdGFfbGVuKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKEdfVU5MSUtFTFkgKHN0cmVhbSA9PSBOVUxMKSkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICJVbmV4cGVjdGVkIENvZGVjU3RhdGUgc3ViZWxlbWVudCAtIGlnbm9yaW5nIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBnX2ZyZWUgKHN0cmVhbS0+Y29kZWNfc3RhdGUpOworICAgICAgICBzdHJlYW0tPmNvZGVjX3N0YXRlID0gZGF0YTsKKyAgICAgICAgc3RyZWFtLT5jb2RlY19zdGF0ZV9zaXplID0gZGF0YV9sZW47CisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwICgmcGFyc2UtPmNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICJCbG9ja0dyb3VwIiwgaWQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQkxPQ0tWSVJUVUFMOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQkxPQ0tBRERJVElPTlM6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9SRUZFUkVOQ0VQUklPUklUWToKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1JFRkVSRU5DRVZJUlRVQUw6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TTElDRVM6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLAorICAgICAgICAgICAgIlNraXBwaW5nIEJsb2NrR3JvdXAgc3ViZWxlbWVudCAweCV4IC0gaWdub3JpbmciLCBpZCk7CisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfc2tpcCAoZWJtbCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChpc19zaW1wbGVibG9jaykKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogcmVhZGluZyBhIG51bWJlciBvciBzbyBjb3VsZCBoYXZlIGZhaWxlZCAqLworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZGF0YV9lcnJvcjsKKworICBpZiAocmV0ID09IEdTVF9GTE9XX09LICYmIHJlYWRibG9jaykgeworICAgIGd1aW50NjQgZHVyYXRpb24gPSAwOworICAgIGdpbnQ2NCBsYWNlX3RpbWUgPSAwOworICAgIGdib29sZWFuIGRlbHRhX3VuaXQ7CisKKyAgICBzdHJlYW0gPSBnX3B0cl9hcnJheV9pbmRleCAocGFyc2UtPmNvbW1vbi5zcmMsIHN0cmVhbV9udW0pOworCisgICAgaWYgKGNsdXN0ZXJfdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgICAvKiBGSVhNRTogV2hhdCB0byBkbyB3aXRoIG5lZ2F0aXZlIHRpbWVzdGFtcHM/IEdpdmUgdGltZXN0YW1wIDAgb3IgLTE/CisgICAgICAgKiBEcm9wIHVubGVzcyB0aGUgbGFjZSBjb250YWlucyB0aW1lc3RhbXAgMD8gKi8KKyAgICAgIGlmICh0aW1lIDwgMCAmJiAoLXRpbWUpID4gY2x1c3Rlcl90aW1lKSB7CisgICAgICAgIGxhY2VfdGltZSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc3RyZWFtLT50aW1lY29kZXNjYWxlID09IDEuMCkKKyAgICAgICAgICBsYWNlX3RpbWUgPSAoY2x1c3Rlcl90aW1lICsgdGltZSkgKiBwYXJzZS0+Y29tbW9uLnRpbWVfc2NhbGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBsYWNlX3RpbWUgPQorICAgICAgICAgICAgICBnc3RfdXRpbF9ndWludDY0X3RvX2dkb3VibGUgKChjbHVzdGVyX3RpbWUgKyB0aW1lKSAqCisgICAgICAgICAgICAgIHBhcnNlLT5jb21tb24udGltZV9zY2FsZSkgKiBzdHJlYW0tPnRpbWVjb2Rlc2NhbGU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGxhY2VfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgfQorCisgICAgaWYgKGxhY2VfdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgICBwYXJzZS0+bGFzdF90aW1lc3RhbXAgPSBsYWNlX3RpbWU7CisgICAgfQorICAgIC8qIG5lZWQgdG8gcmVmcmVzaCBzZWdtZW50IGluZm8gQVNBUCAqLworICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAobGFjZV90aW1lKSAmJiBwYXJzZS0+bmVlZF9uZXdzZWdtZW50KSB7CisgICAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAiZ2VuZXJhdGluZyBzZWdtZW50IHN0YXJ0aW5nIGF0ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChsYWNlX3RpbWUpKTsKKyAgICAgIC8qIHByZXRlbmQgd2Ugc2Vla2VkIGhlcmUgKi8KKyAgICAgIGdzdF9zZWdtZW50X2RvX3NlZWsgKCZwYXJzZS0+Y29tbW9uLnNlZ21lbnQsIHBhcnNlLT5jb21tb24uc2VnbWVudC5yYXRlLAorICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwgMCwgR1NUX1NFRUtfVFlQRV9TRVQsIGxhY2VfdGltZSwKKyAgICAgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgR1NUX0NMT0NLX1RJTUVfTk9ORSwgTlVMTCk7CisgICAgICAvKiBub3cgY29udmV5IG91ciBzZWdtZW50IG5vdGlvbiBkb3duc3RyZWFtICovCisgICAgICBzZWdtZW50ID0gcGFyc2UtPmNvbW1vbi5zZWdtZW50OworICAgICAgc2VnbWVudC5wb3NpdGlvbiA9IHNlZ21lbnQuc3RhcnQ7CisgICAgICBnc3RfbWF0cm9za2FfcGFyc2Vfc2VuZF9ldmVudCAocGFyc2UsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKyAgICAgIHBhcnNlLT5uZWVkX25ld3NlZ21lbnQgPSBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoYmxvY2tfZHVyYXRpb24pIHsKKyAgICAgIGlmIChzdHJlYW0tPnRpbWVjb2Rlc2NhbGUgPT0gMS4wKQorICAgICAgICBkdXJhdGlvbiA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoYmxvY2tfZHVyYXRpb24sCisgICAgICAgICAgICBwYXJzZS0+Y29tbW9uLnRpbWVfc2NhbGUsIDEpOworICAgICAgZWxzZQorICAgICAgICBkdXJhdGlvbiA9CisgICAgICAgICAgICBnc3RfdXRpbF9nZG91YmxlX3RvX2d1aW50NjQgKGdzdF91dGlsX2d1aW50NjRfdG9fZ2RvdWJsZQorICAgICAgICAgICAgKGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoYmxvY2tfZHVyYXRpb24sIHBhcnNlLT5jb21tb24udGltZV9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgMSkpICogc3RyZWFtLT50aW1lY29kZXNjYWxlKTsKKyAgICB9IGVsc2UgaWYgKHN0cmVhbS0+ZGVmYXVsdF9kdXJhdGlvbikgeworICAgICAgZHVyYXRpb24gPSBzdHJlYW0tPmRlZmF1bHRfZHVyYXRpb24gKiBsYWNlczsKKyAgICB9CisgICAgLyogZWxzZSBkdXJhdGlvbiBpcyBkaWZmIGJldHdlZW4gdGltZWNvZGUgb2YgdGhpcyBhbmQgbmV4dCBibG9jayAqLworCisgICAgLyogRm9yIFNpbXBsZUJsb2NrLCBsb29rIGF0IHRoZSBrZXlmcmFtZSBiaXQgaW4gZmxhZ3MuIE90aGVyd2lzZSwKKyAgICAgICBhIFJlZmVyZW5jZUJsb2NrIGltcGxpZXMgdGhhdCB0aGlzIGlzIG5vdCBhIGtleWZyYW1lLiBJbiBlaXRoZXIKKyAgICAgICBjYXNlLCBpdCBvbmx5IG1ha2VzIHNlbnNlIGZvciB2aWRlbyBzdHJlYW1zLiAqLworICAgIGRlbHRhX3VuaXQgPSBzdHJlYW0tPnR5cGUgPT0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU8gJiYKKyAgICAgICAgKChpc19zaW1wbGVibG9jayAmJiAhKGZsYWdzICYgMHg4MCkpIHx8IHJlZmVyZW5jZWJsb2NrKTsKKworICAgIGlmIChkZWx0YV91bml0ICYmIHN0cmVhbS0+c2V0X2Rpc2NvbnQpIHsKKyAgICAgIC8qIFdoZW4gZG9pbmcgc2Vla3Mgb3Igc3VjaCwgd2UgbmVlZCB0byByZXN0YXJ0IG9uIGtleSBmcmFtZXMgb3IKKyAgICAgICAqIGRlY29kZXJzIG1pZ2h0IGNob2tlLiAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJza2lwcGluZyBkZWx0YSB1bml0Iik7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgZm9yIChuID0gMDsgbiA8IGxhY2VzOyBuKyspIHsKKyAgICAgIGlmIChHX1VOTElLRUxZIChsYWNlX3NpemVbbl0gPiBzaXplKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLCAiSW52YWxpZCBsYWNlIHNpemUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qIFFvUyBmb3IgdmlkZW8gdHJhY2sgd2l0aCBhbiBpbmRleC4gdGhlIGFzc3VtcHRpb24gaXMgdGhhdAorICAgICAgICAgaW5kZXggZW50cmllcyBwb2ludCB0byBrZXlmcmFtZXMsIGJ1dCBpZiB0aGF0IGlzIG5vdCB0cnVlIHdlCisgICAgICAgICB3aWxsIGluc3RhZCBza2lwIHVudGlsIHRoZSBuZXh0IGtleWZyYW1lLiAqLworICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChsYWNlX3RpbWUpICYmCisgICAgICAgICAgc3RyZWFtLT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1ZJREVPICYmCisgICAgICAgICAgc3RyZWFtLT5pbmRleF90YWJsZSAmJiBwYXJzZS0+Y29tbW9uLnNlZ21lbnQucmF0ZSA+IDAuMCkgeworICAgICAgICBHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICp2aWRlb2NvbnRleHQgPQorICAgICAgICAgICAgKEdzdE1hdHJvc2thVHJhY2tWaWRlb0NvbnRleHQgKikgc3RyZWFtOworICAgICAgICBHc3RDbG9ja1RpbWUgZWFybGllc3RfdGltZTsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIGVhcmxpZXN0X3N0cmVhbV90aW1lOworCisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocGFyc2UpOworICAgICAgICBlYXJsaWVzdF90aW1lID0gdmlkZW9jb250ZXh0LT5lYXJsaWVzdF90aW1lOworICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocGFyc2UpOworICAgICAgICBlYXJsaWVzdF9zdHJlYW1fdGltZSA9CisgICAgICAgICAgICBnc3Rfc2VnbWVudF9wb3NpdGlvbl9mcm9tX3J1bm5pbmdfdGltZSAoJnBhcnNlLT5jb21tb24uc2VnbWVudCwKKyAgICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwgZWFybGllc3RfdGltZSk7CisKKyAgICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChsYWNlX3RpbWUpICYmCisgICAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZWFybGllc3Rfc3RyZWFtX3RpbWUpICYmCisgICAgICAgICAgICBsYWNlX3RpbWUgPD0gZWFybGllc3Rfc3RyZWFtX3RpbWUpIHsKKyAgICAgICAgICAvKiBmaW5kIGluZGV4IGVudHJ5IChrZXlmcmFtZSkgPD0gZWFybGllc3Rfc3RyZWFtX3RpbWUgKi8KKyAgICAgICAgICBHc3RNYXRyb3NrYUluZGV4ICplbnRyeSA9CisgICAgICAgICAgICAgIGdzdF91dGlsX2FycmF5X2JpbmFyeV9zZWFyY2ggKHN0cmVhbS0+aW5kZXhfdGFibGUtPmRhdGEsCisgICAgICAgICAgICAgIHN0cmVhbS0+aW5kZXhfdGFibGUtPmxlbiwgc2l6ZW9mIChHc3RNYXRyb3NrYUluZGV4KSwKKyAgICAgICAgICAgICAgKEdDb21wYXJlRGF0YUZ1bmMpIGdzdF9tYXRyb3NrYV9pbmRleF9zZWVrX2ZpbmQsCisgICAgICAgICAgICAgIEdTVF9TRUFSQ0hfTU9ERV9CRUZPUkUsICZlYXJsaWVzdF9zdHJlYW1fdGltZSwgTlVMTCk7CisKKyAgICAgICAgICAvKiBpZiB0aGF0IGVudHJ5IChrZXlmcmFtZSkgaXMgYWZ0ZXIgdGhlIGN1cnJlbnQgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICBidWZmZXIsIHdlIGNhbiBza2lwIHB1c2hpbmcgKGFuZCB0aHVzIGRlY29kaW5nKSBhbGwKKyAgICAgICAgICAgICBidWZmZXJzIHVudGlsIHRoYXQga2V5ZnJhbWUuICovCisgICAgICAgICAgaWYgKGVudHJ5ICYmIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChlbnRyeS0+dGltZSkgJiYKKyAgICAgICAgICAgICAgZW50cnktPnRpbWUgPiBsYWNlX3RpbWUpIHsKKyAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgIlNraXBwaW5nIGxhY2UgYmVmb3JlIGxhdGUga2V5ZnJhbWUiKTsKKyAgICAgICAgICAgIHN0cmVhbS0+c2V0X2Rpc2NvbnQgPSBUUlVFOworICAgICAgICAgICAgZ290byBuZXh0X2xhY2U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisjaWYgMAorICAgICAgc3ViID0gZ3N0X2J1ZmZlcl9jcmVhdGVfc3ViIChidWYsCisgICAgICAgICAgR1NUX0JVRkZFUl9TSVpFIChidWYpIC0gc2l6ZSwgbGFjZV9zaXplW25dKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiY3JlYXRlZCBzdWJidWZmZXIgJXAiLCBzdWIpOworCisgICAgICBpZiAoZGVsdGFfdW5pdCkKKyAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoc3ViLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgICBlbHNlCisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAoc3ViLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisKKyAgICAgIGlmIChzdHJlYW0tPmVuY29kaW5ncyAhPSBOVUxMICYmIHN0cmVhbS0+ZW5jb2RpbmdzLT5sZW4gPiAwKQorICAgICAgICBzdWIgPSBnc3RfbWF0cm9za2FfZGVjb2RlX2J1ZmZlciAoc3RyZWFtLCBzdWIpOworCisgICAgICBpZiAoc3ViID09IE5VTEwpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkRlY29kaW5nIGJ1ZmZlciBmYWlsZWQiKTsKKyAgICAgICAgZ290byBuZXh0X2xhY2U7CisgICAgICB9CisKKyAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChzdWIpID0gbGFjZV90aW1lOworCisgICAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGxhY2VfdGltZSkpIHsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIGxhc3Rfc3RvcF9lbmQ7CisKKyAgICAgICAgLyogQ2hlY2sgaWYgdGhpcyBzdHJlYW0gaXMgYWZ0ZXIgc2VnbWVudCBzdG9wICovCisgICAgICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAocGFyc2UtPmNvbW1vbi5zZWdtZW50LnN0b3ApICYmCisgICAgICAgICAgICBsYWNlX3RpbWUgPj0gcGFyc2UtPmNvbW1vbi5zZWdtZW50LnN0b3ApIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAgICAgIlN0cmVhbSAlZCBhZnRlciBzZWdtZW50IHN0b3AgJSIgR1NUX1RJTUVfRk9STUFULCBzdHJlYW0tPmluZGV4LAorICAgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChwYXJzZS0+Y29tbW9uLnNlZ21lbnQuc3RvcCkpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHN1Yik7CisgICAgICAgICAgZ290byBlb3M7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mZnNldCA+PSBzdHJlYW0tPnRvX29mZnNldCkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiU3RyZWFtICVkIGFmdGVyIHBsYXliYWNrIHNlY3Rpb24iLAorICAgICAgICAgICAgICBzdHJlYW0tPmluZGV4KTsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChzdWIpOworICAgICAgICAgIGdvdG8gZW9zOworICAgICAgICB9CisKKyAgICAgICAgLyogaGFuZGxlIGdhcHMsIGUuZy4gbm9uLXplcm8gc3RhcnQtdGltZSwgb3IgYW4gY3VlIGluZGV4IGVudHJ5CisgICAgICAgICAqIHRoYXQgbGFuZGVkIHVzIHdpdGggdGltZXN0YW1wcyBub3QgcXVpdGUgaW50ZW5kZWQgKi8KKyAgICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChwYXJzZS0+c2VnbWVudC5sYXN0X3N0b3ApICYmCisgICAgICAgICAgICBwYXJzZS0+c2VnbWVudC5yYXRlID4gMC4wKSB7CisgICAgICAgICAgR3N0Q2xvY2tUaW1lRGlmZiBkaWZmOworCisgICAgICAgICAgLyogb25seSBzZW5kIG5ld3NlZ21lbnRzIHdpdGggaW5jcmVhc2luZyBzdGFydCB0aW1lcywKKyAgICAgICAgICAgKiBvdGhlcndpc2UgaWYgdGhlc2UgZ28gYmFjayBhbmQgZm9ydGggZG93bnN0cmVhbSAoc2lua3MpIGluY3JlYXNlCisgICAgICAgICAgICogYWNjdW11bGF0ZWQgdGltZSBhbmQgcnVubmluZ190aW1lICovCisgICAgICAgICAgZGlmZiA9IEdTVF9DTE9DS19ESUZGIChwYXJzZS0+c2VnbWVudC5sYXN0X3N0b3AsIGxhY2VfdGltZSk7CisgICAgICAgICAgaWYgKGRpZmYgPiAyICogR1NUX1NFQ09ORCAmJiBsYWNlX3RpbWUgPiBwYXJzZS0+c2VnbWVudC5zdGFydCAmJgorICAgICAgICAgICAgICAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChwYXJzZS0+c2VnbWVudC5zdG9wKSB8fAorICAgICAgICAgICAgICAgICAgbGFjZV90aW1lIDwgcGFyc2UtPnNlZ21lbnQuc3RvcCkpIHsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLAorICAgICAgICAgICAgICAgICJHYXAgb2YgJSIgR19HSU5UNjRfRk9STUFUICIgbnMgZGV0ZWN0ZWQgaW4iCisgICAgICAgICAgICAgICAgInN0cmVhbSAlZCAoJSIgR1NUX1RJTUVfRk9STUFUICIgLT4gJSIgR1NUX1RJTUVfRk9STUFUICIpLiAiCisgICAgICAgICAgICAgICAgIlNlbmRpbmcgdXBkYXRlZCBORVdTRUdNRU5UIGV2ZW50cyIsIGRpZmYsCisgICAgICAgICAgICAgICAgc3RyZWFtLT5pbmRleCwgR1NUX1RJTUVfQVJHUyAoc3RyZWFtLT5wb3MpLAorICAgICAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGxhY2VfdGltZSkpOworICAgICAgICAgICAgLyogc2VuZCBuZXdzZWdtZW50IGV2ZW50cyBzdWNoIHRoYXQgdGhlIGdhcCBpcyBub3QgYWNjb3VudGVkIGluCisgICAgICAgICAgICAgKiBhY2N1bSB0aW1lLCBoZW5jZSBydW5uaW5nX3RpbWUgKi8KKyAgICAgICAgICAgIC8qIGNsb3NlIGFoZWFkIG9mIGdhcCAqLworICAgICAgICAgICAgZ3N0X21hdHJvc2thX3BhcnNlX3NlbmRfZXZlbnQgKHBhcnNlLAorICAgICAgICAgICAgICAgIGdzdF9ldmVudF9uZXdfbmV3X3NlZ21lbnQgKFRSVUUsIHBhcnNlLT5zZWdtZW50LnJhdGUsCisgICAgICAgICAgICAgICAgICAgIHBhcnNlLT5zZWdtZW50LmZvcm1hdCwgcGFyc2UtPnNlZ21lbnQubGFzdF9zdG9wLAorICAgICAgICAgICAgICAgICAgICBwYXJzZS0+c2VnbWVudC5sYXN0X3N0b3AsIHBhcnNlLT5zZWdtZW50Lmxhc3Rfc3RvcCkpOworICAgICAgICAgICAgLyogc2tpcCBnYXAgKi8KKyAgICAgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9zZW5kX2V2ZW50IChwYXJzZSwKKyAgICAgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X25ld19zZWdtZW50IChGQUxTRSwgcGFyc2UtPnNlZ21lbnQucmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgcGFyc2UtPnNlZ21lbnQuZm9ybWF0LCBsYWNlX3RpbWUsIHBhcnNlLT5zZWdtZW50LnN0b3AsCisgICAgICAgICAgICAgICAgICAgIGxhY2VfdGltZSkpOworICAgICAgICAgICAgLyogYWxpZ24gc2VnbWVudCB2aWV3IHdpdGggZG93bnN0cmVhbSwKKyAgICAgICAgICAgICAqIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZyBhY2N1bSB3aGVuIGNsb3Npbmcgc2VnbWVudCAqLworICAgICAgICAgICAgZ3N0X3NlZ21lbnRfc2V0X25ld3NlZ21lbnQgKCZwYXJzZS0+c2VnbWVudCwgRkFMU0UsCisgICAgICAgICAgICAgICAgcGFyc2UtPnNlZ21lbnQucmF0ZSwgcGFyc2UtPnNlZ21lbnQuZm9ybWF0LCBsYWNlX3RpbWUsCisgICAgICAgICAgICAgICAgcGFyc2UtPnNlZ21lbnQuc3RvcCwgbGFjZV90aW1lKTsKKyAgICAgICAgICAgIHBhcnNlLT5zZWdtZW50Lmxhc3Rfc3RvcCA9IGxhY2VfdGltZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChwYXJzZS0+c2VnbWVudC5sYXN0X3N0b3ApCisgICAgICAgICAgICB8fCBwYXJzZS0+c2VnbWVudC5sYXN0X3N0b3AgPCBsYWNlX3RpbWUpIHsKKyAgICAgICAgICBwYXJzZS0+c2VnbWVudC5sYXN0X3N0b3AgPSBsYWNlX3RpbWU7CisgICAgICAgIH0KKworICAgICAgICBsYXN0X3N0b3BfZW5kID0gbGFjZV90aW1lOworICAgICAgICBpZiAoZHVyYXRpb24pIHsKKyAgICAgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChzdWIpID0gZHVyYXRpb24gLyBsYWNlczsKKyAgICAgICAgICBsYXN0X3N0b3BfZW5kICs9IEdTVF9CVUZGRVJfRFVSQVRJT04gKHN1Yik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChwYXJzZS0+bGFzdF9zdG9wX2VuZCkgfHwKKyAgICAgICAgICAgIHBhcnNlLT5sYXN0X3N0b3BfZW5kIDwgbGFzdF9zdG9wX2VuZCkKKyAgICAgICAgICBwYXJzZS0+bGFzdF9zdG9wX2VuZCA9IGxhc3Rfc3RvcF9lbmQ7CisKKyAgICAgICAgaWYgKHBhcnNlLT5zZWdtZW50LmR1cmF0aW9uID09IC0xIHx8CisgICAgICAgICAgICBwYXJzZS0+c2VnbWVudC5kdXJhdGlvbiA8IGxhY2VfdGltZSkgeworICAgICAgICAgIGdzdF9zZWdtZW50X3NldF9kdXJhdGlvbiAoJnBhcnNlLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICAgIGxhc3Rfc3RvcF9lbmQpOworICAgICAgICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAocGFyc2UpLAorICAgICAgICAgICAgICBnc3RfbWVzc2FnZV9uZXdfZHVyYXRpb24gKEdTVF9PQkpFQ1RfQ0FTVCAocGFyc2UpLAorICAgICAgICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBHU1RfQ0xPQ0tfVElNRV9OT05FKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3RyZWFtLT5wb3MgPSBsYWNlX3RpbWU7CisKKyAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9zeW5jX3N0cmVhbXMgKHBhcnNlKTsKKworICAgICAgaWYgKHN0cmVhbS0+c2V0X2Rpc2NvbnQpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJtYXJraW5nIERJU0NPTlQiKTsKKyAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoc3ViLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgICAgIHN0cmVhbS0+c2V0X2Rpc2NvbnQgPSBGQUxTRTsKKyAgICAgIH0KKworICAgICAgLyogcmV2ZXJzZSBwbGF5YmFjayBib29rLWtlZXBpbmcgKi8KKyAgICAgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHN0cmVhbS0+ZnJvbV90aW1lKSkKKyAgICAgICAgc3RyZWFtLT5mcm9tX3RpbWUgPSBsYWNlX3RpbWU7CisgICAgICBpZiAoc3RyZWFtLT5mcm9tX29mZnNldCA9PSAtMSkKKyAgICAgICAgc3RyZWFtLT5mcm9tX29mZnNldCA9IG9mZnNldDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgIlB1c2hpbmcgbGFjZSAlZCwgZGF0YSBvZiBzaXplICVkIGZvciBzdHJlYW0gJWQsIHRpbWU9JSIKKyAgICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiBhbmQgZHVyYXRpb249JSIgR1NUX1RJTUVfRk9STUFULCBuLAorICAgICAgICAgIEdTVF9CVUZGRVJfU0laRSAoc3ViKSwgc3RyZWFtX251bSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoc3ViKSksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVVJBVElPTiAoc3ViKSkpOworCisgICAgICBpZiAocGFyc2UtPmVsZW1lbnRfaW5kZXgpIHsKKyAgICAgICAgaWYgKHN0cmVhbS0+aW5kZXhfd3JpdGVyX2lkID09IC0xKQorICAgICAgICAgIGdzdF9pbmRleF9nZXRfd3JpdGVyX2lkIChwYXJzZS0+ZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgICAgR1NUX09CSkVDVCAoc3RyZWFtLT5wYWQpLCAmc3RyZWFtLT5pbmRleF93cml0ZXJfaWQpOworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgImFkZGluZyBhc3NvY2lhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQgIi0+ICUiCisgICAgICAgICAgICBHX0dVSU5UNjRfRk9STUFUICIgZm9yIHdyaXRlciBpZCAlZCIsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoc3ViKSksIGNsdXN0ZXJfb2Zmc2V0LAorICAgICAgICAgICAgc3RyZWFtLT5pbmRleF93cml0ZXJfaWQpOworICAgICAgICBnc3RfaW5kZXhfYWRkX2Fzc29jaWF0aW9uIChwYXJzZS0+ZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgIHN0cmVhbS0+aW5kZXhfd3JpdGVyX2lkLCBHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChzdWIsCisgICAgICAgICAgICAgICAgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpID8gMCA6IEdTVF9BU1NPQ0lBVElPTl9GTEFHX0tFWV9VTklULAorICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoc3ViKSwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICAgICAgICAgIGNsdXN0ZXJfb2Zmc2V0LCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgZ3N0X2J1ZmZlcl9zZXRfY2FwcyAoc3ViLCBHU1RfUEFEX0NBUFMgKHBhcnNlLT5zcmNwYWQpKTsKKworICAgICAgLyogUG9zdHByb2Nlc3MgdGhlIGJ1ZmZlcnMgZGVwZW5kaW5nIG9uIHRoZSBjb2RlYyB1c2VkICovCisgICAgICBpZiAoc3RyZWFtLT5wb3N0cHJvY2Vzc19mcmFtZSkgeworICAgICAgICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJydW5uaW5nIHBvc3QgcHJvY2VzcyIpOworICAgICAgICByZXQgPSBzdHJlYW0tPnBvc3Rwcm9jZXNzX2ZyYW1lIChHU1RfRUxFTUVOVCAocGFyc2UpLCBzdHJlYW0sICZzdWIpOworICAgICAgfQorCisgICAgICByZXQgPSBnc3RfcGFkX3B1c2ggKHN0cmVhbS0+cGFkLCBzdWIpOworICAgICAgaWYgKHBhcnNlLT5zZWdtZW50LnJhdGUgPCAwKSB7CisgICAgICAgIGlmIChsYWNlX3RpbWUgPiBwYXJzZS0+c2VnbWVudC5zdG9wICYmIHJldCA9PSBHU1RfRkxPV19FT1MpIHsKKyAgICAgICAgICAvKiBJbiByZXZlcnNlIHBsYXliYWNrIHdlIGNhbiBnZXQgYSBHU1RfRkxPV19FT1Mgd2hlbgorICAgICAgICAgICAqIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzZWdtZW50LCBzbyB3ZSBqdXN0IG5lZWQgdG8ganVtcAorICAgICAgICAgICAqIGJhY2sgdG8gdGhlIHByZXZpb3VzIHNlY3Rpb24uICovCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJkb3duc3RyZWFtIGhhcyByZWFjaGVkIGVuZCBvZiBzZWdtZW50Iik7CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIGNvbWJpbmUgZmxvd3MgKi8KKyAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9wYXJzZV9jb21iaW5lX2Zsb3dzIChwYXJzZSwgc3RyZWFtLCByZXQpOworI2VuZGlmCisKKyAgICBuZXh0X2xhY2U6CisgICAgICBzaXplIC09IGxhY2Vfc2l6ZVtuXTsKKyAgICAgIGlmIChsYWNlX3RpbWUgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSAmJiBkdXJhdGlvbikKKyAgICAgICAgbGFjZV90aW1lICs9IGR1cmF0aW9uIC8gbGFjZXM7CisgICAgICBlbHNlCisgICAgICAgIGxhY2VfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgfQorICB9CisKK2RvbmU6CisgIGlmIChidWYpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIH0KKyAgZ19mcmVlIChsYWNlX3NpemUpOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVhJVFMgKi8KK2ludmFsaWRfbGFjaW5nOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocGFyc2UsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwgKCJJbnZhbGlkIGxhY2luZyBzaXplIikpOworICAgIC8qIG5vbi1mYXRhbCwgdHJ5IG5leHQgYmxvY2soZ3JvdXApICovCisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBkb25lOworICB9CitkYXRhX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocGFyc2UsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwgKCJEYXRhIGVycm9yIikpOworICAgIC8qIG5vbi1mYXRhbCwgdHJ5IG5leHQgYmxvY2soZ3JvdXApICovCisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBkb25lOworICB9Cit9CisKKy8qIHJldHVybiBGQUxTRSBpZiBibG9jayhncm91cCkgc2hvdWxkIGJlIHNraXBwZWQgKGR1ZSB0byBhIHNlZWspICovCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitnc3RfbWF0cm9za2FfcGFyc2Vfc2Vla19ibG9jayAoR3N0TWF0cm9za2FQYXJzZSAqIHBhcnNlKQoreworICBpZiAoR19VTkxJS0VMWSAocGFyc2UtPnNlZWtfYmxvY2spKSB7CisgICAgaWYgKCEoLS1wYXJzZS0+c2Vla19ibG9jaykpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJzaG91bGQgc2tpcCBibG9jayBkdWUgdG8gc2VlayIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3BhcnNlX3BhcnNlX2NvbnRlbnRzX3NlZWtlbnRyeSAoR3N0TWF0cm9za2FQYXJzZSAqIHBhcnNlLAorICAgIEdzdEVibWxSZWFkICogZWJtbCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIGd1aW50NjQgc2Vla19wb3MgPSAoZ3VpbnQ2NCkgLSAxOworICBndWludDMyIHNlZWtfaWQgPSAwOworICBndWludDMyIGlkOworCisgIERFQlVHX0VMRU1FTlRfU1RBUlQgKHBhcnNlLCBlYm1sLCAiU2VlayIpOworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChwYXJzZSwgZWJtbCwgIlNlZWsiLCByZXQpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmIGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3BlZWtfaWQgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUVLSUQ6CisgICAgICB7CisgICAgICAgIGd1aW50NjQgdDsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmdCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiU2Vla0lEOiAlIiBHX0dVSU5UNjRfRk9STUFULCB0KTsKKyAgICAgICAgc2Vla19pZCA9IHQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUVLUE9TSVRJT046CisgICAgICB7CisgICAgICAgIGd1aW50NjQgdDsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmdCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmICh0ID4gR19NQVhJTlQ2NCkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICJUb28gbGFyZ2UgU2Vla1Bvc2l0aW9uICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJTZWVrUG9zaXRpb246ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHQpOworICAgICAgICBzZWVrX3BvcyA9IHQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2Vfc2tpcCAoJnBhcnNlLT5jb21tb24sIGVibWwsCisgICAgICAgICAgICAiU2Vla0hlYWQiLCBpZCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0sgJiYgcmV0ICE9IEdTVF9GTE9XX0VPUykKKyAgICByZXR1cm4gcmV0OworCisgIGlmICghc2Vla19pZCB8fCBzZWVrX3BvcyA9PSAoZ3VpbnQ2NCkgLSAxKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwgIkluY29tcGxldGUgc2Vla2hlYWQgZW50cnkgKDB4JXgvJSIKKyAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiKSIsIHNlZWtfaWQsIHNlZWtfcG9zKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICBzd2l0Y2ggKHNlZWtfaWQpIHsKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUVLSEVBRDoKKyAgICB7CisgICAgfQorICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NVRVM6CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVEFHUzoKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UUkFDS1M6CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfU0VHTUVOVElORk86CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQVRUQUNITUVOVFM6CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUlM6CisgICAgeworICAgICAgZ3VpbnQ2NCBsZW5ndGg7CisKKyAgICAgIC8qIHJlbWVtYmVyICovCisgICAgICBsZW5ndGggPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZ2V0X2xlbmd0aCAoJnBhcnNlLT5jb21tb24pOworCisgICAgICBpZiAobGVuZ3RoID09IChndWludDY0KSAtIDEpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJubyB1cHN0cmVhbSBsZW5ndGgsIHNraXBwaW5nIFNlYWtIZWFkIGVudHJ5Iik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvKiBjaGVjayBmb3IgdmFsaWRpdHkgKi8KKyAgICAgIGlmIChzZWVrX3BvcyArIHBhcnNlLT5jb21tb24uZWJtbF9zZWdtZW50X3N0YXJ0ICsgMTIgPj0gbGVuZ3RoKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAiU2Vla0hlYWQgcmVmZXJlbmNlIGxpZXMgb3V0c2lkZSBmaWxlISIgIiAoJSIKKyAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIislIiBHX0dVSU5UNjRfRk9STUFUICIrMTIgPj0gJSIKKyAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIikiLCBzZWVrX3BvcywgcGFyc2UtPmNvbW1vbi5lYm1sX3NlZ21lbnRfc3RhcnQsCisgICAgICAgICAgICBsZW5ndGgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogb25seSBwaWNrIHVwIGluZGV4IGxvY2F0aW9uIHdoZW4gc3RyZWFtaW5nICovCisgICAgICBpZiAoc2Vla19pZCA9PSBHU1RfTUFUUk9TS0FfSURfQ1VFUykgeworICAgICAgICBwYXJzZS0+aW5kZXhfb2Zmc2V0ID0gc2Vla19wb3MgKyBwYXJzZS0+Y29tbW9uLmVibWxfc2VnbWVudF9zdGFydDsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJDdWVzIGxvY2F0ZWQgYXQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICBwYXJzZS0+aW5kZXhfb2Zmc2V0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIklnbm9yaW5nIFNlZWsgZW50cnkgZm9yIElEPTB4JXgiLCBzZWVrX2lkKTsKKyAgICAgIGJyZWFrOworICB9CisgIERFQlVHX0VMRU1FTlRfU1RPUCAocGFyc2UsIGVibWwsICJTZWVrIiwgcmV0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3BhcnNlX3BhcnNlX2NvbnRlbnRzIChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UsIEdzdEVibWxSZWFkICogZWJtbCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ3VpbnQzMiBpZDsKKworICBERUJVR19FTEVNRU5UX1NUQVJUIChwYXJzZSwgZWJtbCwgIlNlZWtIZWFkIik7CisKKyAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBERUJVR19FTEVNRU5UX1NUT1AgKHBhcnNlLCBlYm1sLCAiU2Vla0hlYWQiLCByZXQpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmIGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3BlZWtfaWQgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUVLRU5UUlk6CisgICAgICB7CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9wYXJzZV9wYXJzZV9jb250ZW50c19zZWVrZW50cnkgKHBhcnNlLCBlYm1sKTsKKyAgICAgICAgLyogSWdub3JlIEVPUyBhbmQgZXJyb3JzIGhlcmUgKi8KKyAgICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiSWdub3JpbmcgJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmV0KSk7CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwICgmcGFyc2UtPmNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICJTZWVrSGVhZCIsIGlkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgREVCVUdfRUxFTUVOVF9TVE9QIChwYXJzZSwgZWJtbCwgIlNlZWtIZWFkIiwgcmV0KTsKKworICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIEdTVF9GTE9XX09WRVJGTE9XICAgR1NUX0ZMT1dfQ1VTVE9NX0VSUk9SCisKKyNkZWZpbmUgTUFYX0JMT0NLX1NJWkUgKDE1ICogMTAyNCAqIDEwMjQpCisKK3N0YXRpYyBpbmxpbmUgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3BhcnNlX2NoZWNrX3JlYWRfc2l6ZSAoR3N0TWF0cm9za2FQYXJzZSAqIHBhcnNlLCBndWludDY0IGJ5dGVzKQoreworICBpZiAoR19VTkxJS0VMWSAoYnl0ZXMgPiBNQVhfQkxPQ0tfU0laRSkpIHsKKyAgICAvKiBvbmx5IGEgZmV3IGJsb2NrcyBhcmUgZXhwZWN0ZWQvYWxsb3dlZCB0byBiZSBsYXJnZSwKKyAgICAgKiBhbmQgd2lsbCBiZSByZWN1cnNlZCBpbnRvLCB3aGVyZWFzIG90aGVycyB3aWxsIGJlIHJlYWQgYW5kIG11c3QgZml0ICovCisgICAgLyogZmF0YWwgaW4gc3RyZWFtaW5nIGNhc2UsIGFzIHdlIGNhbid0IHN0ZXAgb3ZlciBlYXNpbHkgKi8KKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocGFyc2UsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwKKyAgICAgICAgKCJyZWFkaW5nIGxhcmdlIGJsb2NrIG9mIHNpemUgJSIgR19HVUlOVDY0X0ZPUk1BVCAiIG5vdCBzdXBwb3J0ZWQ7ICIKKyAgICAgICAgICAgICJmaWxlIG1pZ2h0IGJlIGNvcnJ1cHQuIiwgYnl0ZXMpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9Cit9CisKKyNpZiAwCisvKiByZXR1cm5zIFRSVUUgaWYgd2UgdHJ1ZWx5IGFyZSBpbiBlcnJvciBzdGF0ZSwgYW5kIHNob3VsZCBnaXZlIHVwICovCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitnc3RfbWF0cm9za2FfcGFyc2VfY2hlY2tfcGFyc2VfZXJyb3IgKEdzdE1hdHJvc2thUGFyc2UgKiBwYXJzZSkKK3sKKyAgZ2ludDY0IHBvczsKKworICAvKiBzaWdoLCBvbmUgbGFzdCBhdHRlbXB0IGFib3ZlIGFuZCBiZXlvbmQgY2FsbCBvZiBkdXR5IC4uLjsKKyAgICogc2VhcmNoIGZvciBjbHVzdGVyIG1hcmsgZm9sbG93aW5nIGN1cnJlbnQgcG9zICovCisgIHBvcyA9IHBhcnNlLT5jb21tb24ub2Zmc2V0OworICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLCAicGFyc2UgZXJyb3IsIGxvb2tpbmcgZm9yIG5leHQgY2x1c3RlciIpOworICBpZiAoZ3N0X21hdHJvc2thX3BhcnNlX3NlYXJjaF9jbHVzdGVyIChwYXJzZSwgJnBvcykgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAvKiBkaWQgbm90IHdvcmssIGdpdmUgdXAgKi8KKyAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIi4uLiBmb3VuZCBhdCAgJSIgR19HVUlOVDY0X0ZPUk1BVCwgcG9zKTsKKyAgICAvKiB0cnkgdGhhdCBwb3NpdGlvbiAqLworICAgIHBhcnNlLT5jb21tb24ub2Zmc2V0ID0gcG9zOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorI2VuZGlmCisKKy8qIGluaXRpYWxpemVzIEBlYm1sIHdpdGggQGJ5dGVzIGZyb20gaW5wdXQgc3RyZWFtIGF0IGN1cnJlbnQgb2Zmc2V0LgorICogUmV0dXJucyBFT1MgaWYgaW5zdWZmaWNpZW50IGF2YWlsYWJsZSwKKyAqIEVSUk9SIGlmIHRvbyBtdWNoIHdhcyBhdHRlbXB0ZWQgdG8gcmVhZC4gKi8KK3N0YXRpYyBpbmxpbmUgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3BhcnNlX3Rha2UgKEdzdE1hdHJvc2thUGFyc2UgKiBwYXJzZSwgZ3VpbnQ2NCBieXRlcywKKyAgICBHc3RFYm1sUmVhZCAqIGVibWwpCit7CisgIEdzdEJ1ZmZlciAqYnVmZmVyID0gTlVMTDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJ0YWtpbmcgJSIgR19HVUlOVDY0X0ZPUk1BVCAiIGJ5dGVzIGZvciBwYXJzaW5nIiwKKyAgICAgIGJ5dGVzKTsKKyAgcmV0ID0gZ3N0X21hdHJvc2thX3BhcnNlX2NoZWNrX3JlYWRfc2l6ZSAocGFyc2UsIGJ5dGVzKTsKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykpIHsKKyAgICAvKiBvdGhlcndpc2UgZmF0YWwgKi8KKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGV4aXQ7CisgIH0KKyAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocGFyc2UtPmNvbW1vbi5hZGFwdGVyKSA8IGJ5dGVzKQorICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisKKyAgYnVmZmVyID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHBhcnNlLT5jb21tb24uYWRhcHRlciwgYnl0ZXMpOworICBpZiAoR19MSUtFTFkgKGJ1ZmZlcikpIHsKKyAgICBnc3RfZWJtbF9yZWFkX2luaXQgKGVibWwsIEdTVF9FTEVNRU5UX0NBU1QgKHBhcnNlKSwgYnVmZmVyLAorICAgICAgICBwYXJzZS0+Y29tbW9uLm9mZnNldCk7CisgICAgcGFyc2UtPmNvbW1vbi5vZmZzZXQgKz0gYnl0ZXM7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2V4aXQ6CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9wYXJzZV9jaGVja19zZWVrYWJpbGl0eSAoR3N0TWF0cm9za2FQYXJzZSAqIHBhcnNlKQoreworICBHc3RRdWVyeSAqcXVlcnk7CisgIGdib29sZWFuIHNlZWthYmxlID0gRkFMU0U7CisgIGdpbnQ2NCBzdGFydCA9IC0xLCBzdG9wID0gLTE7CisKKyAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X3NlZWtpbmcgKEdTVF9GT1JNQVRfQllURVMpOworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeSAocGFyc2UtPmNvbW1vbi5zaW5rcGFkLCBxdWVyeSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgInNlZWtpbmcgcXVlcnkgZmFpbGVkIik7CisgICAgZ290byBkb25lOworICB9CisKKyAgZ3N0X3F1ZXJ5X3BhcnNlX3NlZWtpbmcgKHF1ZXJ5LCBOVUxMLCAmc2Vla2FibGUsICZzdGFydCwgJnN0b3ApOworCisgIC8qIHRyeSBoYXJkZXIgdG8gcXVlcnkgdXBzdHJlYW0gc2l6ZSBpZiB3ZSBkaWRuJ3QgZ2V0IGl0IHRoZSBmaXJzdCB0aW1lICovCisgIGlmIChzZWVrYWJsZSAmJiBzdG9wID09IC0xKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJkb2luZyBkdXJhdGlvbiBxdWVyeSB0byBmaXggdXAgdW5zZXQgc3RvcCIpOworICAgIGdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAocGFyc2UtPmNvbW1vbi5zaW5rcGFkLCBHU1RfRk9STUFUX0JZVEVTLAorICAgICAgICAmc3RvcCk7CisgIH0KKworICAvKiBpZiB1cHN0cmVhbSBkb2Vzbid0IGtub3cgdGhlIHNpemUsIGl0J3MgbGlrZWx5IHRoYXQgaXQncyBub3Qgc2Vla2FibGUgaW4KKyAgICogcHJhY3RpY2UgZXZlbiBpZiBpdCB0ZWNobmljYWxseSBtYXkgYmUgc2Vla2FibGUgKi8KKyAgaWYgKHNlZWthYmxlICYmIChzdGFydCAhPSAwIHx8IHN0b3AgPD0gc3RhcnQpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJzZWVrYWJsZSBidXQgdW5rbm93biBzdGFydC9zdG9wIC0+IGRpc2FibGUiKTsKKyAgICBzZWVrYWJsZSA9IEZBTFNFOworICB9CisKK2RvbmU6CisgIEdTVF9JTkZPX09CSkVDVCAocGFyc2UsICJzZWVrYWJsZTogJWQgKCUiIEdfR1VJTlQ2NF9GT1JNQVQgIiAtICUiCisgICAgICBHX0dVSU5UNjRfRk9STUFUICIpIiwgc2Vla2FibGUsIHN0YXJ0LCBzdG9wKTsKKyAgcGFyc2UtPnNlZWthYmxlID0gc2Vla2FibGU7CisKKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7Cit9CisKKyNpZiAwCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3BhcnNlX2ZpbmRfdHJhY2tzIChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UpCit7CisgIGd1aW50MzIgaWQ7CisgIGd1aW50NjQgYmVmb3JlX3BvczsKKyAgZ3VpbnQ2NCBsZW5ndGg7CisgIGd1aW50IG5lZWRlZDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLAorICAgICAgIkZvdW5kIENsdXN0ZXIgZWxlbWVudCBiZWZvcmUgVHJhY2tzLCBzZWFyY2hpbmcgVHJhY2tzIik7CisKKyAgLyogcmVtZW1iZXIgKi8KKyAgYmVmb3JlX3BvcyA9IHBhcnNlLT5jb21tb24ub2Zmc2V0OworCisgIC8qIFNlYXJjaCBUcmFja3MgZWxlbWVudCAqLworICB3aGlsZSAoVFJVRSkgeworICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX2lkX2xlbmd0aF9wdWxsICgmcGFyc2UtPmNvbW1vbiwKKyAgICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAocGFyc2UpLCAmaWQsICZsZW5ndGgsICZuZWVkZWQpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIGlmIChpZCAhPSBHU1RfTUFUUk9TS0FfSURfVFJBQ0tTKSB7CisgICAgICAvKiB3ZSBtYXkgYmUgc2tpcHBpbmcgbGFyZ2UgY2x1c3RlciBoZXJlLCBzbyBmb3JlZ28gc2l6ZSBjaGVjayBldGMgKi8KKyAgICAgIC8qIC4uLiBidXQgd2UgY2FuJ3Qgc2tpcCB1bmRlZmluZWQgc2l6ZTsgZm9yY2UgZXJyb3IgKi8KKyAgICAgIGlmIChsZW5ndGggPT0gR19NQVhVSU5UNjQpIHsKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3BhcnNlX2NoZWNrX3JlYWRfc2l6ZSAocGFyc2UsIGxlbmd0aCk7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyc2UtPmNvbW1vbi5vZmZzZXQgKz0gbmVlZGVkOworICAgICAgICBwYXJzZS0+b2Zmc2V0ICs9IGxlbmd0aDsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIHdpbGwgbGVhZCB0byB0cmFjayBwYXJzaW5nIC4uLiAqLworICAgIHJldCA9IGdzdF9tYXRyb3NrYV9wYXJzZV9wYXJzZV9pZCAocGFyc2UsIGlkLCBsZW5ndGgsIG5lZWRlZCk7CisgICAgYnJlYWs7CisgIH0KKworICAvKiBzZWVrIGJhY2sgKi8KKyAgcGFyc2UtPm9mZnNldCA9IGJlZm9yZV9wb3M7CisKKyAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisjZGVmaW5lIEdTVF9SRUFEX0NIRUNLKHN0bXQpICBcCitHX1NUTVRfU1RBUlQgeyBcCisgIGlmIChHX1VOTElLRUxZICgocmV0ID0gKHN0bXQpKSAhPSBHU1RfRkxPV19PSykpIHsgXAorICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfT1ZFUkZMT1cpIHsgXAorICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7IFwKKyAgICB9IFwKKyAgICBnb3RvIHJlYWRfZXJyb3I7IFwKKyAgfSBcCit9IEdfU1RNVF9FTkQKKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9wYXJzZV9hY2N1bXVsYXRlX3N0cmVhbWhlYWRlciAoR3N0TWF0cm9za2FQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgaWYgKHBhcnNlLT5wdXNoZWRfaGVhZGVycykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGFyc2UsCisgICAgICAgICJBY2N1bXVsYXRpbmcgaGVhZGVycywgYnV0IGhlYWRlcnMgYXJlIGFscmVhZHkgcHVzaGVkIik7CisgIH0KKworICBpZiAocGFyc2UtPnN0cmVhbWhlYWRlcikgeworICAgIHBhcnNlLT5zdHJlYW1oZWFkZXIgPSBnc3RfYnVmZmVyX2FwcGVuZCAocGFyc2UtPnN0cmVhbWhlYWRlciwKKyAgICAgICAgZ3N0X2J1ZmZlcl9yZWYgKGJ1ZmZlcikpOworICB9IGVsc2UgeworICAgIHBhcnNlLT5zdHJlYW1oZWFkZXIgPSBnc3RfYnVmZmVyX3JlZiAoYnVmZmVyKTsKKyAgfQorCisgIEdTVF9ERUJVRyAoIiUiIEdfR1NJWkVfRk9STUFULCBnc3RfYnVmZmVyX2dldF9zaXplIChwYXJzZS0+c3RyZWFtaGVhZGVyKSk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcGFyc2Vfb3V0cHV0IChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBnYm9vbGVhbiBrZXlmcmFtZSkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgaWYgKCFwYXJzZS0+cHVzaGVkX2hlYWRlcnMpIHsKKyAgICBHc3RDYXBzICpjYXBzOworICAgIEdzdFN0cnVjdHVyZSAqczsKKyAgICBHVmFsdWUgc3RyZWFtaGVhZGVyID0geyAwIH07CisgICAgR1ZhbHVlIGJ1ZnZhbCA9IHsgMCB9OworICAgIEdzdEJ1ZmZlciAqYnVmOworCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFyc2UtPmNvbW1vbi5zaW5rcGFkKTsKKyAgICBpZiAoY2FwcyA9PSBOVUxMKSB7CisgICAgICBjYXBzID0gZ3N0X21hdHJvc2thX3BhcnNlX2ZvcmdlX2NhcHMgKHBhcnNlLT5jb21tb24uaXNfd2VibSwKKyAgICAgICAgICBwYXJzZS0+Y29tbW9uLmhhc192aWRlbyk7CisgICAgfSBlbHNlCisgICAgICBjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoY2Fwcyk7CisKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgICAgZ192YWx1ZV9pbml0ICgmc3RyZWFtaGVhZGVyLCBHU1RfVFlQRV9BUlJBWSk7CisgICAgZ192YWx1ZV9pbml0ICgmYnVmdmFsLCBHU1RfVFlQRV9CVUZGRVIpOworICAgIGJ1ZiA9IGdzdF9idWZmZXJfY29weSAocGFyc2UtPnN0cmVhbWhlYWRlcik7CisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKyAgICBnc3RfdmFsdWVfc2V0X2J1ZmZlciAoJmJ1ZnZhbCwgYnVmKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIGdzdF92YWx1ZV9hcnJheV9hcHBlbmRfdmFsdWUgKCZzdHJlYW1oZWFkZXIsICZidWZ2YWwpOworICAgIGdfdmFsdWVfdW5zZXQgKCZidWZ2YWwpOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzLCAic3RyZWFtaGVhZGVyIiwgJnN0cmVhbWhlYWRlcik7CisgICAgZ192YWx1ZV91bnNldCAoJnN0cmVhbWhlYWRlcik7CisgICAgLy9nc3RfY2Fwc19yZXBsYWNlIChwYXJzZS0+Y2FwcywgY2Fwcyk7CisgICAgZ3N0X3BhZF9zZXRfY2FwcyAocGFyc2UtPnNyY3BhZCwgY2Fwcyk7CisKKyAgICBpZiAocGFyc2UtPm5lZWRfbmV3c2VnbWVudCkgeworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChwYXJzZS0+c3JjcGFkLAorICAgICAgICAgIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnBhcnNlLT5jb21tb24uc2VnbWVudCkpOworICAgICAgcGFyc2UtPm5lZWRfbmV3c2VnbWVudCA9IEZBTFNFOworICAgIH0KKworICAgIGJ1ZiA9IGdzdF9idWZmZXJfY29weSAocGFyc2UtPnN0cmVhbWhlYWRlcik7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKTsKKworICAgIHJldCA9IGdzdF9wYWRfcHVzaCAocGFyc2UtPnNyY3BhZCwgYnVmKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLCAiRmFpbGVkIHRvIHB1c2ggYnVmZmVyIik7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHBhcnNlLT5wdXNoZWRfaGVhZGVycyA9IFRSVUU7CisgIH0KKworICBpZiAoIWtleWZyYW1lKSB7CisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmZmVyLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKTsKKyAgfQorICBpZiAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcikgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgIHBhcnNlLT5sYXN0X3RpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpOworICB9IGVsc2UgeworICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpID0gcGFyc2UtPmxhc3RfdGltZXN0YW1wOworICB9CisKKyAgcmV0dXJuIGdzdF9wYWRfcHVzaCAocGFyc2UtPnNyY3BhZCwgZ3N0X2J1ZmZlcl9yZWYgKGJ1ZmZlcikpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3BhcnNlX3BhcnNlX2lkIChHc3RNYXRyb3NrYVBhcnNlICogcGFyc2UsIGd1aW50MzIgaWQsCisgICAgZ3VpbnQ2NCBsZW5ndGgsIGd1aW50IG5lZWRlZCkKK3sKKyAgR3N0RWJtbFJlYWQgZWJtbCA9IHsgMCwgfTsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ3VpbnQ2NCByZWFkOworICAvL0dzdEJ1ZmZlciAqYnVmZmVyOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiUGFyc2luZyBFbGVtZW50IGlkIDB4JXgsICIKKyAgICAgICJzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgcHJlZml4ICVkIiwgaWQsIGxlbmd0aCwgbmVlZGVkKTsKKworI2lmIDAKKyAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocGFyc2UtPmFkYXB0ZXIpID49IGxlbmd0aCArIG5lZWRlZCkgeworICAgIGJ1ZmZlciA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChwYXJzZS0+YWRhcHRlciwgbGVuZ3RoICsgbmVlZGVkKTsKKyAgICBnc3RfcGFkX3B1c2ggKHBhcnNlLT5zcmNwYWQsIGJ1ZmZlcik7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICB9CisgIC8vR1NUX1JFQURfQ0hFQ0sgKGdzdF9tYXRyb3NrYV9wYXJzZV90YWtlIChwYXJzZSwgcmVhZCwgJmVibWwpKTsKKworICByZXR1cm4gcmV0OworI2VuZGlmCisKKworCisgIC8qIGlmIHdlIHBsYW4gdG8gcmVhZCBhbmQgcGFyc2UgdGhpcyBlbGVtZW50LCB3ZSBuZWVkIHByZWZpeCAoaWQgKyBsZW5ndGgpCisgICAqIGFuZCB0aGUgY29udGVudHMgKi8KKyAgLyogbWluZCBhYm91dCBvdmVyZmxvdyB3cmFwLWFyb3VuZCB3aGVuIGRlYWxpbmcgd2l0aCB1bmRlZmluZWQgc2l6ZSAqLworICByZWFkID0gbGVuZ3RoOworICBpZiAoR19MSUtFTFkgKGxlbmd0aCAhPSBHX01BWFVJTlQ2NCkpCisgICAgcmVhZCArPSBuZWVkZWQ7CisKKyAgc3dpdGNoIChwYXJzZS0+Y29tbW9uLnN0YXRlKSB7CisgICAgY2FzZSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TVEFSVDoKKyAgICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgY2FzZSBHU1RfRUJNTF9JRF9IRUFERVI6CisgICAgICAgICAgR1NUX1JFQURfQ0hFQ0sgKGdzdF9tYXRyb3NrYV9wYXJzZV90YWtlIChwYXJzZSwgcmVhZCwgJmVibWwpKTsKKyAgICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfaGVhZGVyICgmcGFyc2UtPmNvbW1vbiwgJmVibWwpOworICAgICAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKyAgICAgICAgICBwYXJzZS0+Y29tbW9uLnN0YXRlID0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0VHTUVOVDsKKyAgICAgICAgICBnc3RfbWF0cm9za2FfcGFyc2VfY2hlY2tfc2Vla2FiaWxpdHkgKHBhcnNlKTsKKyAgICAgICAgICBnc3RfbWF0cm9za2FfcGFyc2VfYWNjdW11bGF0ZV9zdHJlYW1oZWFkZXIgKHBhcnNlLCBlYm1sLmJ1Zik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZ290byBpbnZhbGlkX2hlYWRlcjsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0VHTUVOVDoKKyAgICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfU0VHTUVOVDoKKyAgICAgICAgICAvKiBlYXQgc2VnbWVudCBwcmVmaXggKi8KKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX3BhcnNlX3Rha2UgKHBhcnNlLCBuZWVkZWQsICZlYm1sKSk7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICJGb3VuZCBTZWdtZW50IHN0YXJ0IGF0IG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFUICIgd2l0aCBzaXplICUiCisgICAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIHBhcnNlLT5jb21tb24ub2Zmc2V0LCBsZW5ndGgpOworICAgICAgICAgIC8qIHNlZWtzIGFyZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlZ21lbnQsCisgICAgICAgICAgICogYWZ0ZXIgdGhlIHNlZ21lbnQgSUQvbGVuZ3RoICovCisgICAgICAgICAgcGFyc2UtPmNvbW1vbi5lYm1sX3NlZ21lbnRfc3RhcnQgPSBwYXJzZS0+Y29tbW9uLm9mZnNldDsKKyAgICAgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgICAgICBsZW5ndGggPSBHX01BWFVJTlQ2NDsKKyAgICAgICAgICBwYXJzZS0+Y29tbW9uLmVibWxfc2VnbWVudF9sZW5ndGggPSBsZW5ndGg7CisgICAgICAgICAgcGFyc2UtPmNvbW1vbi5zdGF0ZSA9IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0hFQURFUjsKKyAgICAgICAgICBnc3RfbWF0cm9za2FfcGFyc2VfYWNjdW11bGF0ZV9zdHJlYW1oZWFkZXIgKHBhcnNlLCBlYm1sLmJ1Zik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJzZSwKKyAgICAgICAgICAgICAgIkV4cGVjdGVkIGEgU2VnbWVudCBJRCAoMHgleCksIGJ1dCByZWNlaXZlZCAweCV4ISIsCisgICAgICAgICAgICAgIEdTVF9NQVRST1NLQV9JRF9TRUdNRU5ULCBpZCk7CisgICAgICAgICAgR1NUX1JFQURfQ0hFQ0sgKGdzdF9tYXRyb3NrYV9wYXJzZV90YWtlIChwYXJzZSwgbmVlZGVkLCAmZWJtbCkpOworICAgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9hY2N1bXVsYXRlX3N0cmVhbWhlYWRlciAocGFyc2UsIGVibWwuYnVmKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0NBTk5JTkc6CisgICAgICBpZiAoaWQgIT0gR1NUX01BVFJPU0tBX0lEX0NMVVNURVIgJiYKKyAgICAgICAgICBpZCAhPSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUlRJTUVDT0RFKSB7CisgICAgICAgIC8qIHdlIG5lZWQgdG8gc2tpcCBieXRlIHBlciBieXRlIGlmIHdlIGFyZSBzY2FubmluZyBmb3IgYSBuZXcgY2x1c3RlciAqLworICAgICAgICByZWFkID0gMTsKKyAgICAgICAgZ290byBza2lwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAiUmVzeW5jIGRvbmUsIG5ldyBjbHVzdGVyIGZvdW5kISIpOworICAgICAgICBwYXJzZS0+Y29tbW9uLnN0YXJ0X3Jlc3luY19vZmZzZXQgPSAtMTsKKyAgICAgICAgcGFyc2UtPmNvbW1vbi5zdGF0ZSA9IHBhcnNlLT5jb21tb24uc3RhdGVfdG9fcmVzdG9yZTsKKyAgICAgIH0KKyAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgIGNhc2UgR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfSEVBREVSOgorICAgIGNhc2UgR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfREFUQToKKyAgICBjYXNlIEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX1NFRUs6CisgICAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1NFR01FTlRJTkZPOgorICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfcGFyc2VfdGFrZSAocGFyc2UsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgaWYgKCFwYXJzZS0+Y29tbW9uLnNlZ21lbnRpbmZvX3BhcnNlZCkgeworICAgICAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX2luZm8gKCZwYXJzZS0+Y29tbW9uLAorICAgICAgICAgICAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKHBhcnNlKSwgJmVibWwpOworICAgICAgICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgZ3N0X21hdHJvc2thX3BhcnNlX3NlbmRfdGFncyAocGFyc2UpOworICAgICAgICAgIH0KKyAgICAgICAgICBnc3RfbWF0cm9za2FfcGFyc2VfYWNjdW11bGF0ZV9zdHJlYW1oZWFkZXIgKHBhcnNlLCBlYm1sLmJ1Zik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RSQUNLUzoKKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX3BhcnNlX3Rha2UgKHBhcnNlLCByZWFkLCAmZWJtbCkpOworICAgICAgICAgIGlmICghcGFyc2UtPnRyYWNrc19wYXJzZWQpIHsKKyAgICAgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9wYXJzZV9wYXJzZV90cmFja3MgKHBhcnNlLCAmZWJtbCk7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9hY2N1bXVsYXRlX3N0cmVhbWhlYWRlciAocGFyc2UsIGVibWwuYnVmKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUjoKKyAgICAgICAgICBpZiAoR19VTkxJS0VMWSAoIXBhcnNlLT50cmFja3NfcGFyc2VkKSkgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJDbHVzdGVyIGJlZm9yZSBUcmFjayIpOworICAgICAgICAgICAgZ290byBub3Rfc3RyZWFtYWJsZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKEdfVU5MSUtFTFkgKHBhcnNlLT5jb21tb24uc3RhdGUKKyAgICAgICAgICAgICAgICAgID09IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0hFQURFUikpIHsKKyAgICAgICAgICAgIHBhcnNlLT5jb21tb24uc3RhdGUgPSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9EQVRBOworICAgICAgICAgICAgcGFyc2UtPmZpcnN0X2NsdXN0ZXJfb2Zmc2V0ID0gcGFyc2UtPmNvbW1vbi5vZmZzZXQ7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgInNpZ25hbGluZyBubyBtb3JlIHBhZHMiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcGFyc2UtPmNsdXN0ZXJfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICAgICAgcGFyc2UtPmNsdXN0ZXJfb2Zmc2V0ID0gcGFyc2UtPmNvbW1vbi5vZmZzZXQ7CisgICAgICAgICAgaWYgKEdfVU5MSUtFTFkgKCFwYXJzZS0+c2Vla19maXJzdCAmJiBwYXJzZS0+c2Vla19ibG9jaykpIHsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAic2VlayB0YXJnZXQgYmxvY2sgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAgICAgICAgICIgbm90IGZvdW5kIGluIENsdXN0ZXIsIHRyeWluZyBuZXh0IENsdXN0ZXIncyBmaXJzdCBibG9jayBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICBwYXJzZS0+c2Vla19ibG9jayk7CisgICAgICAgICAgICBwYXJzZS0+c2Vla19ibG9jayA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIHBhcnNlLT5zZWVrX2ZpcnN0ID0gRkFMU0U7CisgICAgICAgICAgLyogcmVjb3JkIG5leHQgY2x1c3RlciBmb3IgcmVjb3ZlcnkgKi8KKyAgICAgICAgICBpZiAocmVhZCAhPSBHX01BWFVJTlQ2NCkKKyAgICAgICAgICAgIHBhcnNlLT5uZXh0X2NsdXN0ZXJfb2Zmc2V0ID0gcGFyc2UtPmNsdXN0ZXJfb2Zmc2V0ICsgcmVhZDsKKyAgICAgICAgICAvKiBlYXQgY2x1c3RlciBwcmVmaXggKi8KKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX3BhcnNlX3Rha2UgKHBhcnNlLCBuZWVkZWQsICZlYm1sKSk7CisgICAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3BhcnNlX291dHB1dCAocGFyc2UsIGVibWwuYnVmLCBUUlVFKTsKKyAgICAgICAgICAvL2dzdF9tYXRyb3NrYV9wYXJzZV9hY2N1bXVsYXRlX3N0cmVhbWhlYWRlciAocGFyc2UsIGVibWwuYnVmKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ0xVU1RFUlRJTUVDT0RFOgorICAgICAgICB7CisgICAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX3BhcnNlX3Rha2UgKHBhcnNlLCByZWFkLCAmZWJtbCkpOworICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50ICgmZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIkNsdXN0ZXJUaW1lQ29kZTogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICBwYXJzZS0+Y2x1c3Rlcl90aW1lID0gbnVtOworI2lmIDAKKyAgICAgICAgICBpZiAocGFyc2UtPmNvbW1vbi5lbGVtZW50X2luZGV4KSB7CisgICAgICAgICAgICBpZiAocGFyc2UtPmNvbW1vbi5lbGVtZW50X2luZGV4X3dyaXRlcl9pZCA9PSAtMSkKKyAgICAgICAgICAgICAgZ3N0X2luZGV4X2dldF93cml0ZXJfaWQgKHBhcnNlLT5jb21tb24uZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgICAgICAgIEdTVF9PQkpFQ1QgKHBhcnNlKSwgJnBhcnNlLT5jb21tb24uZWxlbWVudF9pbmRleF93cml0ZXJfaWQpOworICAgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAiYWRkaW5nIGFzc29jaWF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVCAiLT4gJSIKKyAgICAgICAgICAgICAgICBHX0dVSU5UNjRfRk9STUFUICIgZm9yIHdyaXRlciBpZCAlZCIsCisgICAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocGFyc2UtPmNsdXN0ZXJfdGltZSksIHBhcnNlLT5jbHVzdGVyX29mZnNldCwKKyAgICAgICAgICAgICAgICBwYXJzZS0+Y29tbW9uLmVsZW1lbnRfaW5kZXhfd3JpdGVyX2lkKTsKKyAgICAgICAgICAgIGdzdF9pbmRleF9hZGRfYXNzb2NpYXRpb24gKHBhcnNlLT5jb21tb24uZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgICAgICBwYXJzZS0+Y29tbW9uLmVsZW1lbnRfaW5kZXhfd3JpdGVyX2lkLAorICAgICAgICAgICAgICAgIEdTVF9BU1NPQ0lBVElPTl9GTEFHX0tFWV9VTklULAorICAgICAgICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwgcGFyc2UtPmNsdXN0ZXJfdGltZSwKKyAgICAgICAgICAgICAgICBHU1RfRk9STUFUX0JZVEVTLCBwYXJzZS0+Y2x1c3Rlcl9vZmZzZXQsIE5VTEwpOworICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9vdXRwdXQgKHBhcnNlLCBlYm1sLmJ1ZiwgRkFMU0UpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0JMT0NLR1JPVVA6CisgICAgICAgICAgaWYgKCFnc3RfbWF0cm9za2FfcGFyc2Vfc2Vla19ibG9jayAocGFyc2UpKQorICAgICAgICAgICAgZ290byBza2lwOworICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfcGFyc2VfdGFrZSAocGFyc2UsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgREVCVUdfRUxFTUVOVF9TVEFSVCAocGFyc2UsICZlYm1sLCAiQmxvY2tHcm91cCIpOworICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKCZlYm1sLCAmaWQpKSA9PSBHU1RfRkxPV19PSykgeworICAgICAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3BhcnNlX3BhcnNlX2Jsb2NrZ3JvdXBfb3Jfc2ltcGxlYmxvY2sgKHBhcnNlLAorICAgICAgICAgICAgICAgICZlYm1sLCBwYXJzZS0+Y2x1c3Rlcl90aW1lLCBwYXJzZS0+Y2x1c3Rlcl9vZmZzZXQsIEZBTFNFKTsKKyAgICAgICAgICB9CisgICAgICAgICAgREVCVUdfRUxFTUVOVF9TVE9QIChwYXJzZSwgJmVibWwsICJCbG9ja0dyb3VwIiwgcmV0KTsKKyAgICAgICAgICBnc3RfbWF0cm9za2FfcGFyc2Vfb3V0cHV0IChwYXJzZSwgZWJtbC5idWYsIEZBTFNFKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfU0lNUExFQkxPQ0s6CisgICAgICAgICAgaWYgKCFnc3RfbWF0cm9za2FfcGFyc2Vfc2Vla19ibG9jayAocGFyc2UpKQorICAgICAgICAgICAgZ290byBza2lwOworICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfcGFyc2VfdGFrZSAocGFyc2UsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgREVCVUdfRUxFTUVOVF9TVEFSVCAocGFyc2UsICZlYm1sLCAiU2ltcGxlQmxvY2siKTsKKyAgICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcGFyc2VfcGFyc2VfYmxvY2tncm91cF9vcl9zaW1wbGVibG9jayAocGFyc2UsCisgICAgICAgICAgICAgICZlYm1sLCBwYXJzZS0+Y2x1c3Rlcl90aW1lLCBwYXJzZS0+Y2x1c3Rlcl9vZmZzZXQsIFRSVUUpOworICAgICAgICAgIERFQlVHX0VMRU1FTlRfU1RPUCAocGFyc2UsICZlYm1sLCAiU2ltcGxlQmxvY2siLCByZXQpOworICAgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9vdXRwdXQgKHBhcnNlLCBlYm1sLmJ1ZiwgRkFMU0UpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9BVFRBQ0hNRU5UUzoKKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX3BhcnNlX3Rha2UgKHBhcnNlLCByZWFkLCAmZWJtbCkpOworICAgICAgICAgIGlmICghcGFyc2UtPmNvbW1vbi5hdHRhY2htZW50c19wYXJzZWQpIHsKKyAgICAgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9hdHRhY2htZW50cyAoJnBhcnNlLT5jb21tb24sCisgICAgICAgICAgICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAocGFyc2UpLCAmZWJtbCk7CisgICAgICAgICAgICBpZiAocmV0ID09IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgICBnc3RfbWF0cm9za2FfcGFyc2Vfc2VuZF90YWdzIChwYXJzZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9vdXRwdXQgKHBhcnNlLCBlYm1sLmJ1ZiwgRkFMU0UpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UQUdTOgorICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfcGFyc2VfdGFrZSAocGFyc2UsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX21ldGFkYXRhICgmcGFyc2UtPmNvbW1vbiwKKyAgICAgICAgICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAocGFyc2UpLCAmZWJtbCk7CisgICAgICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9zZW5kX3RhZ3MgKHBhcnNlKTsKKyAgICAgICAgICBnc3RfbWF0cm9za2FfcGFyc2VfYWNjdW11bGF0ZV9zdHJlYW1oZWFkZXIgKHBhcnNlLCBlYm1sLmJ1Zik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJTOgorICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfcGFyc2VfdGFrZSAocGFyc2UsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX2NoYXB0ZXJzICgmcGFyc2UtPmNvbW1vbiwgJmVibWwpOworICAgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9vdXRwdXQgKHBhcnNlLCBlYm1sLmJ1ZiwgRkFMU0UpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUVLSEVBRDoKKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX3BhcnNlX3Rha2UgKHBhcnNlLCByZWFkLCAmZWJtbCkpOworICAgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9wYXJzZV9wYXJzZV9jb250ZW50cyAocGFyc2UsICZlYm1sKTsKKyAgICAgICAgICBnc3RfbWF0cm9za2FfcGFyc2Vfb3V0cHV0IChwYXJzZSwgZWJtbC5idWYsIEZBTFNFKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ1VFUzoKKyAgICAgICAgICBHU1RfUkVBRF9DSEVDSyAoZ3N0X21hdHJvc2thX3BhcnNlX3Rha2UgKHBhcnNlLCByZWFkLCAmZWJtbCkpOworICAgICAgICAgIGlmICghcGFyc2UtPmNvbW1vbi5pbmRleF9wYXJzZWQpIHsKKyAgICAgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9pbmRleCAoJnBhcnNlLT5jb21tb24sICZlYm1sKTsKKyAgICAgICAgICAgIC8qIG9ubHkgcHVzaCBiYXNlZDsgZGVsYXllZCBpbmRleCBidWlsZGluZyAqLworICAgICAgICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSworICAgICAgICAgICAgICAgICYmIHBhcnNlLT5jb21tb24uc3RhdGUgPT0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0VFSykgeworICAgICAgICAgICAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICAgICAgICAgICAgR1NUX09CSkVDVF9MT0NLIChwYXJzZSk7CisgICAgICAgICAgICAgIGV2ZW50ID0gcGFyc2UtPnNlZWtfZXZlbnQ7CisgICAgICAgICAgICAgIHBhcnNlLT5zZWVrX2V2ZW50ID0gTlVMTDsKKyAgICAgICAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHBhcnNlKTsKKworICAgICAgICAgICAgICBnX2Fzc2VydCAoZXZlbnQpOworICAgICAgICAgICAgICAvKiB1bmxpa2VseSB0byBmYWlsLCBzaW5jZSB3ZSBtYW5hZ2VkIHRvIHNlZWsgdG8gdGhpcyBwb2ludCAqLworICAgICAgICAgICAgICBpZiAoIWdzdF9tYXRyb3NrYV9wYXJzZV9oYW5kbGVfc2Vla19ldmVudCAocGFyc2UsIE5VTEwsIGV2ZW50KSkKKyAgICAgICAgICAgICAgICBnb3RvIHNlZWtfZmFpbGVkOworICAgICAgICAgICAgICAvKiByZXN1bWUgZGF0YSBoYW5kbGluZywgbWFpbiB0aHJlYWQgY2xlYXIgdG8gc2VlayBhZ2FpbiAqLworICAgICAgICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHBhcnNlKTsKKyAgICAgICAgICAgICAgcGFyc2UtPmNvbW1vbi5zdGF0ZSA9IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0RBVEE7CisgICAgICAgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChwYXJzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9vdXRwdXQgKHBhcnNlLCBlYm1sLmJ1ZiwgRkFMU0UpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9QT1NJVElPTjoKKyAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfUFJFVlNJWkU6CisgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0VOQ1JZUFRFREJMT0NLOgorICAgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TSUxFTlRUUkFDS1M6CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgICAgICJTa2lwcGluZyBDbHVzdGVyIHN1YmVsZW1lbnQgMHgleCAtIGlnbm9yaW5nIiwgaWQpOworICAgICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICBza2lwOgorICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAic2tpcHBpbmcgRWxlbWVudCAweCV4IiwgaWQpOworICAgICAgICAgIEdTVF9SRUFEX0NIRUNLIChnc3RfbWF0cm9za2FfcGFyc2VfdGFrZSAocGFyc2UsIHJlYWQsICZlYm1sKSk7CisgICAgICAgICAgZ3N0X21hdHJvc2thX3BhcnNlX291dHB1dCAocGFyc2UsIGVibWwuYnVmLCBGQUxTRSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfUEFSU0UpCisgICAgZ290byBwYXJzZV9mYWlsZWQ7CisKK2V4aXQ6CisgIGdzdF9lYm1sX3JlYWRfY2xlYXIgKCZlYm1sKTsKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK3JlYWRfZXJyb3I6CisgIHsKKyAgICAvKiBzaW1wbHkgZXhpdCwgbWF5YmUgbm90IGVub3VnaCBkYXRhIHlldCAqLworICAgIC8qIG5vIGVibWwgdG8gY2xlYXIgaWYgcmVhZCBlcnJvciAqLworICAgIHJldHVybiByZXQ7CisgIH0KK3BhcnNlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwYXJzZSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBwYXJzZSBFbGVtZW50IDB4JXgiLCBpZCkpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorbm90X3N0cmVhbWFibGU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocGFyc2UsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwKKyAgICAgICAgKCJGaWxlIGxheW91dCBkb2VzIG5vdCBwZXJtaXQgc3RyZWFtaW5nIikpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorI2lmIDAKK25vX3RyYWNrczoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwYXJzZSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAoIk5vIFRyYWNrcyBlbGVtZW50IGZvdW5kIikpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorI2VuZGlmCitpbnZhbGlkX2hlYWRlcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwYXJzZSwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLCAoIkludmFsaWQgaGVhZGVyIikpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorc2Vla19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocGFyc2UsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwgKCJGYWlsZWQgdG8gc2VlayIpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGV4aXQ7CisgIH0KK30KKworI2lmIDAKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfcGFyc2VfbG9vcCAoR3N0UGFkICogcGFkKQoreworICBHc3RNYXRyb3NrYVBhcnNlICpwYXJzZSA9IEdTVF9NQVRST1NLQV9QQVJTRSAoR1NUX1BBRF9QQVJFTlQgKHBhZCkpOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ3VpbnQzMiBpZDsKKyAgZ3VpbnQ2NCBsZW5ndGg7CisgIGd1aW50IG5lZWRlZDsKKworICAvKiBJZiB3ZSBoYXZlIHRvIGNsb3NlIGEgc2VnbWVudCwgc2VuZCBhIG5ldyBzZWdtZW50IHRvIGRvIHRoaXMgbm93ICovCisgIGlmIChHX0xJS0VMWSAocGFyc2UtPmNvbW1vbi5zdGF0ZSA9PSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9EQVRBKSkgeworICAgIGlmIChHX1VOTElLRUxZIChwYXJzZS0+Y2xvc2Vfc2VnbWVudCkpIHsKKyAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9zZW5kX2V2ZW50IChwYXJzZSwgcGFyc2UtPmNsb3NlX3NlZ21lbnQpOworICAgICAgcGFyc2UtPmNsb3NlX3NlZ21lbnQgPSBOVUxMOworICAgIH0KKyAgICBpZiAoR19VTkxJS0VMWSAocGFyc2UtPm5ld19zZWdtZW50KSkgeworICAgICAgZ3N0X21hdHJvc2thX3BhcnNlX3NlbmRfZXZlbnQgKHBhcnNlLCBwYXJzZS0+bmV3X3NlZ21lbnQpOworICAgICAgcGFyc2UtPm5ld19zZWdtZW50ID0gTlVMTDsKKyAgICB9CisgIH0KKworICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGVla19pZF9sZW5ndGhfcHVsbCAoJnBhcnNlLT5jb21tb24sCisgICAgICBHU1RfRUxFTUVOVF9DQVNUIChwYXJzZSksICZpZCwgJmxlbmd0aCwgJm5lZWRlZCk7CisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRU9TKQorICAgIGdvdG8gZW9zOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgaWYgKGdzdF9tYXRyb3NrYV9wYXJzZV9jaGVja19wYXJzZV9lcnJvciAocGFyc2UpKQorICAgICAgZ290byBwYXVzZTsKKyAgICBlbHNlCisgICAgICByZXR1cm47CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJPZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBFbGVtZW50IGlkIDB4JXgsICIKKyAgICAgICJzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgbmVlZGVkICVkIiwgcGFyc2UtPm9mZnNldCwgaWQsCisgICAgICBsZW5ndGgsIG5lZWRlZCk7CisKKyAgcmV0ID0gZ3N0X21hdHJvc2thX3BhcnNlX3BhcnNlX2lkIChwYXJzZSwgaWQsIGxlbmd0aCwgbmVlZGVkKTsKKyAgaWYgKHJldCA9PSBHU1RfRkxPV19FT1MpCisgICAgZ290byBlb3M7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBwYXVzZTsKKworICAvKiBjaGVjayBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIGEgY29uZmlndXJlZCBzZWdtZW50ICovCisgIGlmIChHX0xJS0VMWSAocGFyc2UtPnNyYy0+bGVuKSkgeworICAgIGd1aW50IGk7CisKKyAgICBnX2Fzc2VydCAocGFyc2UtPm51bV9zdHJlYW1zID09IHBhcnNlLT5zcmMtPmxlbik7CisgICAgZm9yIChpID0gMDsgaSA8IHBhcnNlLT5zcmMtPmxlbjsgaSsrKSB7CisgICAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqY29udGV4dCA9IGdfcHRyX2FycmF5X2luZGV4IChwYXJzZS0+c3JjLCBpKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbnRleHQtPnBhZCwgInBvcyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoY29udGV4dC0+cG9zKSk7CisgICAgICBpZiAoY29udGV4dC0+ZW9zID09IEZBTFNFKQorICAgICAgICBnb3RvIG5leHQ7CisgICAgfQorCisgICAgR1NUX0lORk9fT0JKRUNUIChwYXJzZSwgIkFsbCBzdHJlYW1zIGFyZSBFT1MiKTsKKyAgICByZXQgPSBHU1RfRkxPV19FT1M7CisgICAgZ290byBlb3M7CisgIH0KKworbmV4dDoKKyAgaWYgKEdfVU5MSUtFTFkgKHBhcnNlLT5vZmZzZXQgPT0KKyAgICAgICAgICBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZ2V0X2xlbmd0aCAoJnBhcnNlLT5jb21tb24pKSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgIlJlYWNoZWQgZW5kIG9mIHN0cmVhbSIpOworICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgICBnb3RvIGVvczsKKyAgfQorCisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK2VvczoKKyAgeworICAgIGlmIChwYXJzZS0+c2VnbWVudC5yYXRlIDwgMC4wKSB7CisgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcGFyc2Vfc2Vla190b19wcmV2aW91c19rZXlmcmFtZSAocGFyc2UpOworICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgfQorcGF1c2U6CisgIHsKKyAgICBjb25zdCBnY2hhciAqcmVhc29uID0gZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCk7CisgICAgZ2Jvb2xlYW4gcHVzaF9lb3MgPSBGQUxTRTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgInBhdXNpbmcgdGFzaywgcmVhc29uICVzIiwgcmVhc29uKTsKKyAgICBwYXJzZS0+c2VnbWVudF9ydW5uaW5nID0gRkFMU0U7CisgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChwYXJzZS0+Y29tbW9uLnNpbmtwYWQpOworCisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19FT1MpIHsKKyAgICAgIC8qIHBlcmZvcm0gRU9TIGxvZ2ljICovCisKKyAgICAgIC8qIENsb3NlIHRoZSBzZWdtZW50LCBpLmUuIHVwZGF0ZSBzZWdtZW50IHN0b3Agd2l0aCB0aGUgZHVyYXRpb24KKyAgICAgICAqIGlmIG5vIHN0b3Agd2FzIHNldCAqLworICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChwYXJzZS0+bGFzdF9zdG9wX2VuZCkgJiYKKyAgICAgICAgICAhR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHBhcnNlLT5zZWdtZW50LnN0b3ApKSB7CisgICAgICAgIEdzdEV2ZW50ICpldmVudCA9CisgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X25ld19zZWdtZW50X2Z1bGwgKFRSVUUsIHBhcnNlLT5zZWdtZW50LnJhdGUsCisgICAgICAgICAgICBwYXJzZS0+c2VnbWVudC5hcHBsaWVkX3JhdGUsIHBhcnNlLT5zZWdtZW50LmZvcm1hdCwKKyAgICAgICAgICAgIHBhcnNlLT5zZWdtZW50LnN0YXJ0LAorICAgICAgICAgICAgTUFYIChwYXJzZS0+bGFzdF9zdG9wX2VuZCwgcGFyc2UtPnNlZ21lbnQuc3RhcnQpLAorICAgICAgICAgICAgcGFyc2UtPnNlZ21lbnQudGltZSk7CisgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9zZW5kX2V2ZW50IChwYXJzZSwgZXZlbnQpOworICAgICAgfQorCisgICAgICBpZiAocGFyc2UtPnNlZ21lbnQuZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NFR01FTlQpIHsKKyAgICAgICAgZ2ludDY0IHN0b3A7CisKKyAgICAgICAgLyogZm9yIHNlZ21lbnQgcGxheWJhY2sgd2UgbmVlZCB0byBwb3N0IHdoZW4gKGluIHN0cmVhbSB0aW1lKQorICAgICAgICAgKiB3ZSBzdG9wcGVkLCB0aGlzIGlzIGVpdGhlciBzdG9wICh3aGVuIHNldCkgb3IgdGhlIGR1cmF0aW9uLiAqLworICAgICAgICBpZiAoKHN0b3AgPSBwYXJzZS0+c2VnbWVudC5zdG9wKSA9PSAtMSkKKyAgICAgICAgICBzdG9wID0gcGFyc2UtPmxhc3Rfc3RvcF9lbmQ7CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhcnNlLCAiU2VuZGluZyBzZWdtZW50IGRvbmUsIGF0IGVuZCBvZiBzZWdtZW50Iik7CisgICAgICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlQgKHBhcnNlKSwKKyAgICAgICAgICAgIGdzdF9tZXNzYWdlX25ld19zZWdtZW50X2RvbmUgKEdTVF9PQkpFQ1QgKHBhcnNlKSwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgICAgICAgIHN0b3ApKTsKKyAgICAgICAgZ3N0X21hdHJvc2thX3BhcnNlX3NlbmRfZXZlbnQgKHBhcnNlLAorICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19zZWdtZW50X2RvbmUgKEdTVF9GT1JNQVRfVElNRSwgc3RvcCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHVzaF9lb3MgPSBUUlVFOworICAgICAgfQorICAgIH0gZWxzZSBpZiAocmV0ID09IEdTVF9GTE9XX05PVF9MSU5LRUQgfHwgcmV0IDwgR1NUX0ZMT1dfRU9TKSB7CisgICAgICAvKiBmb3IgZmF0YWwgZXJyb3JzIHdlIHBvc3QgYW4gZXJyb3IgbWVzc2FnZSAqLworICAgICAgR1NUX0VMRU1FTlRfRkxPV19FUlJPUiAocGFyc2UsIHJldCk7CisgICAgICBwdXNoX2VvcyA9IFRSVUU7CisgICAgfQorICAgIGlmIChwdXNoX2VvcykgeworICAgICAgLyogc2VuZCBFT1MsIGFuZCBwcmV2ZW50IGhhbmdpbmcgaWYgbm8gc3RyZWFtcyB5ZXQgKi8KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXJzZSwgIlNlbmRpbmcgRU9TLCBhdCBlbmQgb2Ygc3RyZWFtIik7CisgICAgICBpZiAoIWdzdF9tYXRyb3NrYV9wYXJzZV9zZW5kX2V2ZW50IChwYXJzZSwgZ3N0X2V2ZW50X25ld19lb3MgKCkpICYmCisgICAgICAgICAgKHJldCA9PSBHU1RfRkxPV19FT1MpKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwYXJzZSwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgICAgIChOVUxMKSwgKCJnb3QgZW9zIGJ1dCBubyBzdHJlYW1zICh5ZXQpIikpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KK30KKyNlbmRpZgorCisvKgorICogQ3JlYXRlIGFuZCBwdXNoIGEgZmx1c2hpbmcgc2VlayBldmVudCB1cHN0cmVhbQorICovCitzdGF0aWMgZ2Jvb2xlYW4KK3BlcmZvcm1fc2Vla190b19vZmZzZXQgKEdzdE1hdHJvc2thUGFyc2UgKiBwYXJzZSwgZ3VpbnQ2NCBvZmZzZXQpCit7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgZ2Jvb2xlYW4gcmVzID0gMDsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlNlZWtpbmcgdG8gJSIgR19HVUlOVDY0X0ZPUk1BVCwgb2Zmc2V0KTsKKworICBldmVudCA9CisgICAgICBnc3RfZXZlbnRfbmV3X3NlZWsgKDEuMCwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICAgIEdTVF9TRUVLX0ZMQUdfRkxVU0ggfCBHU1RfU0VFS19GTEFHX0FDQ1VSQVRFLCBHU1RfU0VFS19UWVBFX1NFVCwgb2Zmc2V0LAorICAgICAgR1NUX1NFRUtfVFlQRV9OT05FLCAtMSk7CisKKyAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChwYXJzZS0+Y29tbW9uLnNpbmtwYWQsIGV2ZW50KTsKKworICAvKiBuZXdzZWdtZW50IGV2ZW50IHdpbGwgdXBkYXRlIG9mZnNldCAqLworICByZXR1cm4gcmVzOworfQorCisvKgorICogRm9yZ2UgZW1wdHkgZGVmYXVsdCBjYXBzIHdoZW4gYWxsIHdlIGtub3cgaXMgdGhlIHN0cmVhbSdzIEVCTUwKKyAqIHR5cGUgYW5kIHdoZXRoZXIgaXQgaGFzIHZpZGVvIG9yIG5vdC4KKyAqCisgKiBGSVhNRTogRG8gc29tZXRoaW5nIHdpdGggdmlkZW8veC1tYXRyb3NrYS0zZCBpZiBwb3NzaWJsZQorICovCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfbWF0cm9za2FfcGFyc2VfZm9yZ2VfY2FwcyAoZ2Jvb2xlYW4gaXNfd2VibSwgZ2Jvb2xlYW4gaGFzX3ZpZGVvKQoreworICBHc3RDYXBzICpjYXBzOworCisgIGlmIChpc193ZWJtKSB7CisgICAgaWYgKGhhc192aWRlbykKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgidmlkZW8vd2VibSIpOworICAgIGVsc2UKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8vd2VibSIpOworICB9IGVsc2UgeworICAgIGlmIChoYXNfdmlkZW8pCisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtbWF0cm9za2EiKTsKKyAgICBlbHNlCisgICAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtbWF0cm9za2EiKTsKKyAgfQorICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9wYXJzZV9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0TWF0cm9za2FQYXJzZSAqcGFyc2UgPSBHU1RfTUFUUk9TS0FfUEFSU0UgKHBhcmVudCk7CisgIGd1aW50IGF2YWlsYWJsZTsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ3VpbnQgbmVlZGVkID0gMDsKKyAgZ3VpbnQzMiBpZDsKKyAgZ3VpbnQ2NCBsZW5ndGg7CisKKyAgaWYgKEdfVU5MSUtFTFkgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAoYnVmZmVyKSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgImdvdCBESVNDT05UIik7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHBhcnNlLT5jb21tb24uYWRhcHRlcik7CisgICAgR1NUX09CSkVDVF9MT0NLIChwYXJzZSk7CisgICAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3Jlc2V0X3N0cmVhbXMgKCZwYXJzZS0+Y29tbW9uLAorICAgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FLCBGQUxTRSk7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHBhcnNlKTsKKyAgfQorCisgIGdzdF9hZGFwdGVyX3B1c2ggKHBhcnNlLT5jb21tb24uYWRhcHRlciwgYnVmZmVyKTsKKyAgYnVmZmVyID0gTlVMTDsKKworbmV4dDoKKyAgYXZhaWxhYmxlID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChwYXJzZS0+Y29tbW9uLmFkYXB0ZXIpOworCisgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX2lkX2xlbmd0aF9wdXNoICgmcGFyc2UtPmNvbW1vbiwKKyAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKHBhcnNlKSwgJmlkLCAmbGVuZ3RoLCAmbmVlZGVkKTsKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSyAmJiByZXQgIT0gR1NUX0ZMT1dfRU9TKSkgeworICAgIGlmIChwYXJzZS0+Y29tbW9uLmVibWxfc2VnbWVudF9sZW5ndGggIT0gR19NQVhVSU5UNjQKKyAgICAgICAgJiYgcGFyc2UtPmNvbW1vbi5vZmZzZXQgPj0KKyAgICAgICAgcGFyc2UtPmNvbW1vbi5lYm1sX3NlZ21lbnRfc3RhcnQgKyBwYXJzZS0+Y29tbW9uLmVibWxfc2VnbWVudF9sZW5ndGgpIHsKKyAgICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qCisgICAgICAgKiBwYXJzaW5nIGVycm9yOiB3ZSBuZWVkIHRvIGZsdXNoIGEgYnl0ZSBmcm9tIHRoZSBhZGFwdGVyIGlmIHRoZSBpZCBpcworICAgICAgICogbm90IGEgY2x1c3RlciBhbmQgc28gb24gdW50aWwgd2UgZm91bmQgYSBuZXcgY2x1c2VyIG9yIHRoZQorICAgICAgICogSU5WQUxJRF9EQVRBX1RIUkVTSE9MRCBpcyBleGNlZWRlZCwgd2UgcmV1c2UgZ3N0X21hdHJvc2thX3BhcnNlX3BhcnNlX2lkCisgICAgICAgKiBzZXR0aW5nIHRoZSBzdGF0ZSB0byBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TQ0FOTklORyBzbyB0aGUgYnl0ZXMKKyAgICAgICAqIGFyZSBza2lwcGVkIHVudGlsIGEgbmV3IGNsdXN0ZXIgaXMgZm91bmQKKyAgICAgICAqLworICAgICAgZ2ludDY0IGJ5dGVzX3NjYW5uZWQ7CisgICAgICBpZiAocGFyc2UtPmNvbW1vbi5zdGFydF9yZXN5bmNfb2Zmc2V0ID09IC0xKSB7CisgICAgICAgIHBhcnNlLT5jb21tb24uc3RhcnRfcmVzeW5jX29mZnNldCA9IHBhcnNlLT5jb21tb24ub2Zmc2V0OworICAgICAgICBwYXJzZS0+Y29tbW9uLnN0YXRlX3RvX3Jlc3RvcmUgPSBwYXJzZS0+Y29tbW9uLnN0YXRlOworICAgICAgfQorICAgICAgYnl0ZXNfc2Nhbm5lZCA9IHBhcnNlLT5jb21tb24ub2Zmc2V0IC0gcGFyc2UtPmNvbW1vbi5zdGFydF9yZXN5bmNfb2Zmc2V0OworICAgICAgaWYgKGJ5dGVzX3NjYW5uZWQgPD0gSU5WQUxJRF9EQVRBX1RIUkVTSE9MRCkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLAorICAgICAgICAgICAgInBhcnNlIGVycm9yLCBsb29raW5nIGZvciBuZXh0IGNsdXN0ZXIsIGFjdHVhbCBvZmZzZXQgJSIKKyAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIiwgc3RhcnQgcmVzeW5jIG9mZnNldCAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgcGFyc2UtPmNvbW1vbi5vZmZzZXQsIHBhcnNlLT5jb21tb24uc3RhcnRfcmVzeW5jX29mZnNldCk7CisgICAgICAgIHBhcnNlLT5jb21tb24uc3RhdGUgPSBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TQ0FOTklORzsKKyAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBhcnNlLAorICAgICAgICAgICAgInVucmVjb3ZlcmFibGUgcGFyc2UgZXJyb3IsIG5leHQgY2x1c3RlciBub3QgZm91bmQgYW5kIHRocmVzaG9sZCAiCisgICAgICAgICAgICAiZXhjZWVkZWQsIGJ5dGVzIHNjYW5uZWQgJSIgR19HSU5UNjRfRk9STUFULCBieXRlc19zY2FubmVkKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocGFyc2UsICJPZmZzZXQgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBFbGVtZW50IGlkIDB4JXgsICIKKyAgICAgICJzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgbmVlZGVkICVkLCBhdmFpbGFibGUgJWQiLAorICAgICAgcGFyc2UtPmNvbW1vbi5vZmZzZXQsIGlkLCBsZW5ndGgsIG5lZWRlZCwgYXZhaWxhYmxlKTsKKworICBpZiAobmVlZGVkID4gYXZhaWxhYmxlKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICByZXQgPSBnc3RfbWF0cm9za2FfcGFyc2VfcGFyc2VfaWQgKHBhcnNlLCBpZCwgbGVuZ3RoLCBuZWVkZWQpOworICBpZiAocmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgIC8qIG5lZWQgbW9yZSBkYXRhICovCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9IGVsc2UgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgIHJldHVybiByZXQ7CisgIH0gZWxzZQorICAgIGdvdG8gbmV4dDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbWF0cm9za2FfcGFyc2VfaGFuZGxlX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIEdzdE1hdHJvc2thUGFyc2UgKnBhcnNlID0gR1NUX01BVFJPU0tBX1BBUlNFIChHU1RfUEFEX1BBUkVOVCAocGFkKSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAiaGF2ZSBldmVudCB0eXBlICVzOiAlcCBvbiBzaW5rIHBhZCIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSwgZXZlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgeworICAgICAgY29uc3QgR3N0U2VnbWVudCAqc2VnbWVudDsKKworICAgICAgLyogc29tZSBkZWJ1ZyBvdXRwdXQgKi8KKyAgICAgIGdzdF9ldmVudF9wYXJzZV9zZWdtZW50IChldmVudCwgJnNlZ21lbnQpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsCisgICAgICAgICAgInJlY2VpdmVkIGZvcm1hdCAlZCBuZXdzZWdtZW50ICUiIEdTVF9TRUdNRU5UX0ZPUk1BVCwKKyAgICAgICAgICBzZWdtZW50LT5mb3JtYXQsIHNlZ21lbnQpOworCisgICAgICBpZiAocGFyc2UtPmNvbW1vbi5zdGF0ZSA8IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX0RBVEEpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJzdGlsbCBzdGFydGluZyIpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgICB9CisKKyAgICAgIC8qIHdlIG9ubHkgZXhwZWN0IGEgQllURSBzZWdtZW50LCBlLmcuIGZvbGxvd2luZyBhIHNlZWsgKi8KKyAgICAgIGlmIChzZWdtZW50LT5mb3JtYXQgIT0gR1NUX0ZPUk1BVF9CWVRFUykgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgInVuc3VwcG9ydGVkIHNlZ21lbnQgZm9ybWF0LCBpZ25vcmluZyIpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgICB9CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhcnNlLCAiY2xlYXJpbmcgc2VnbWVudCBzdGF0ZSIpOworICAgICAgLyogY2xlYXIgY3VycmVudCBzZWdtZW50IGxlZnRvdmVyICovCisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAocGFyc2UtPmNvbW1vbi5hZGFwdGVyKTsKKyAgICAgIC8qIGFuZCBzb21lIHN0cmVhbWluZyBzZXR1cCAqLworICAgICAgcGFyc2UtPmNvbW1vbi5vZmZzZXQgPSBzZWdtZW50LT5zdGFydDsKKyAgICAgIC8qIGRvIG5vdCBrbm93IHdoZXJlIHdlIGFyZTsKKyAgICAgICAqIG5lZWQgdG8gY29tZSBhY3Jvc3MgYSBjbHVzdGVyIGFuZCBnZW5lcmF0ZSBuZXdzZWdtZW50ICovCisgICAgICBwYXJzZS0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgcGFyc2UtPmNsdXN0ZXJfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICBwYXJzZS0+Y2x1c3Rlcl9vZmZzZXQgPSAwOworICAgICAgcGFyc2UtPm5lZWRfbmV3c2VnbWVudCA9IFRSVUU7CisgICAgICAvKiBidXQga2VlcCBzb21lIG9mIHRoZSB1cHN0cmVhbSBzZWdtZW50ICovCisgICAgICBwYXJzZS0+Y29tbW9uLnNlZ21lbnQucmF0ZSA9IHNlZ21lbnQtPnJhdGU7CisgICAgZXhpdDoKKyAgICAgIC8qIGNoYWluIHdpbGwgc2VuZCBpbml0aWFsIG5ld3NlZ21lbnQgYWZ0ZXIgcGFkcyBoYXZlIGJlZW4gYWRkZWQsCisgICAgICAgKiBvciBvdGhlcndpc2UgY29tZSB1cCB3aXRoIG9uZSAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFyc2UsICJlYXRpbmcgZXZlbnQiKTsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgeworICAgICAgaWYgKHBhcnNlLT5jb21tb24uc3RhdGUgIT0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfREFUQQorICAgICAgICAgICYmIHBhcnNlLT5jb21tb24uc3RhdGUgIT0gR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0NBTk5JTkcpIHsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChwYXJzZSwgU1RSRUFNLCBERU1VWCwKKyAgICAgICAgICAgIChOVUxMKSwgKCJnb3QgZW9zIGFuZCBkaWRuJ3QgcmVjZWl2ZSBhIGNvbXBsZXRlIGhlYWRlciBvYmplY3QiKSk7CisgICAgICB9IGVsc2UgaWYgKHBhcnNlLT5jb21tb24ubnVtX3N0cmVhbXMgPT0gMCkgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAocGFyc2UsIFNUUkVBTSwgREVNVVgsCisgICAgICAgICAgICAoTlVMTCksICgiZ290IGVvcyBidXQgbm8gc3RyZWFtcyAoeWV0KSIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9tYXRyb3NrYV9wYXJzZV9zZW5kX2V2ZW50IChwYXJzZSwgZXZlbnQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgeworICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHBhcnNlLT5jb21tb24uYWRhcHRlcik7CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHBhcnNlKTsKKyAgICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9yZXNldF9zdHJlYW1zICgmcGFyc2UtPmNvbW1vbiwKKyAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FLCBUUlVFKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChwYXJzZSk7CisgICAgICBwYXJzZS0+Y29tbW9uLnNlZ21lbnQucG9zaXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgcGFyc2UtPmNsdXN0ZXJfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICBwYXJzZS0+Y2x1c3Rlcl9vZmZzZXQgPSAwOworICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX3BhcnNlX3NldF9pbmRleCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEluZGV4ICogaW5kZXgpCit7CisgIEdzdE1hdHJvc2thUGFyc2UgKnBhcnNlID0gR1NUX01BVFJPU0tBX1BBUlNFIChlbGVtZW50KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHBhcnNlKTsKKyAgaWYgKHBhcnNlLT5jb21tb24uZWxlbWVudF9pbmRleCkKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwYXJzZS0+Y29tbW9uLmVsZW1lbnRfaW5kZXgpOworICBwYXJzZS0+Y29tbW9uLmVsZW1lbnRfaW5kZXggPSBpbmRleCA/IGdzdF9vYmplY3RfcmVmIChpbmRleCkgOiBOVUxMOworICBHU1RfT0JKRUNUX1VOTE9DSyAocGFyc2UpOworICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlNldCBpbmRleCAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIHBhcnNlLT5jb21tb24uZWxlbWVudF9pbmRleCk7Cit9CisKK3N0YXRpYyBHc3RJbmRleCAqCitnc3RfbWF0cm9za2FfcGFyc2VfZ2V0X2luZGV4IChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgR3N0SW5kZXggKnJlc3VsdCA9IE5VTEw7CisgIEdzdE1hdHJvc2thUGFyc2UgKnBhcnNlID0gR1NUX01BVFJPU0tBX1BBUlNFIChlbGVtZW50KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHBhcnNlKTsKKyAgaWYgKHBhcnNlLT5jb21tb24uZWxlbWVudF9pbmRleCkKKyAgICByZXN1bHQgPSBnc3Rfb2JqZWN0X3JlZiAocGFyc2UtPmNvbW1vbi5lbGVtZW50X2luZGV4KTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHBhcnNlKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYXJzZSwgIlJldHVybmluZyBpbmRleCAlIiBHU1RfUFRSX0ZPUk1BVCwgcmVzdWx0KTsKKworICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X21hdHJvc2thX3BhcnNlX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0TWF0cm9za2FQYXJzZSAqcGFyc2UgPSBHU1RfTUFUUk9TS0FfUEFSU0UgKGVsZW1lbnQpOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1M7CisKKyAgLyogaGFuZGxlIHVwd2FyZHMgc3RhdGUgY2hhbmdlcyBoZXJlICovCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIC8qIGhhbmRsZSBkb3dud2FyZHMgc3RhdGUgY2hhbmdlcyAqLworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X21hdHJvc2thX3BhcnNlX3Jlc2V0IChHU1RfRUxFTUVOVCAocGFyc2UpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfbWF0cm9za2FfcGFyc2VfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgZ3N0X3JpZmZfaW5pdCAoKTsKKworICAvKiBjcmVhdGUgYW4gZWxlbWVudGZhY3RvcnkgZm9yIHRoZSBtYXRyb3NrYV9wYXJzZSBlbGVtZW50ICovCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm1hdHJvc2thcGFyc2UiLAorICAgICAgICAgIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX01BVFJPU0tBX1BBUlNFKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuaCBiL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1wYXJzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNTk4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbWF0cm9za2EvbWF0cm9za2EtcGFyc2UuaApAQCAtMCwwICsxLDEwNSBAQAorLyogR1N0cmVhbWVyIE1hdHJvc2thIG11eGVyL2RlbXV4ZXIKKyAqIChjKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqIChjKSAyMDExIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKyAqCisgKiBtYXRyb3NrYS1wYXJzZS5oOiBtYXRyb3NrYSBmaWxlL3N0cmVhbSBwYXJzZWVyIGRlZmluaXRpb24KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX01BVFJPU0tBX1BBUlNFX0hfXworI2RlZmluZSBfX0dTVF9NQVRST1NLQV9QQVJTRV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImVibWwtcmVhZC5oIgorI2luY2x1ZGUgIm1hdHJvc2thLWlkcy5oIgorI2luY2x1ZGUgIm1hdHJvc2thLXJlYWQtY29tbW9uLmgiCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9NQVRST1NLQV9QQVJTRSBcCisgIChnc3RfbWF0cm9za2FfcGFyc2VfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIEdTVF9NQVRST1NLQV9QQVJTRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfTUFUUk9TS0FfUEFSU0UsIEdzdE1hdHJvc2thUGFyc2UpKQorI2RlZmluZSBHU1RfTUFUUk9TS0FfUEFSU0VfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9NQVRST1NLQV9QQVJTRSwgR3N0TWF0cm9za2FQYXJzZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX01BVFJPU0tBX1BBUlNFKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9NQVRST1NLQV9QQVJTRSkpCisjZGVmaW5lIEdTVF9JU19NQVRST1NLQV9QQVJTRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX01BVFJPU0tBX1BBUlNFKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1hdHJvc2thUGFyc2UgeworICBHc3RFbGVtZW50ICAgICAgICAgICAgICBwYXJlbnQ7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKworICBHc3RNYXRyb3NrYVJlYWRDb21tb24gICAgY29tbW9uOworCisgIC8qIHBhZHMgKi8KKyAgR3N0UGFkICAgICAgICAgICAgICAgICAgKnNyY3BhZDsKKyAgR3N0Q2xvY2sgICAgICAgICAgICAgICAgKmNsb2NrOworICBndWludCAgICAgICAgICAgICAgICAgICAgbnVtX3Zfc3RyZWFtczsKKyAgZ3VpbnQgICAgICAgICAgICAgICAgICAgIG51bV9hX3N0cmVhbXM7CisgIGd1aW50ICAgICAgICAgICAgICAgICAgICBudW1fdF9zdHJlYW1zOworCisgIEdzdEJ1ZmZlciAqc3RyZWFtaGVhZGVyOworICBnYm9vbGVhbiBwdXNoZWRfaGVhZGVyczsKKyAgR3N0Q2xvY2tUaW1lIGxhc3RfdGltZXN0YW1wOworCisgIC8qIHN0YXRlICovCisgIC8vZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIHN0cmVhbWluZzsKKyAgZ3VpbnQ2NCAgICAgICAgICAgICAgICAgIHNlZWtfYmxvY2s7CisgIGdib29sZWFuICAgICAgICAgICAgICAgICBzZWVrX2ZpcnN0OworCisgIC8qIGRpZCB3ZSBwYXJzZSBjdWVzL3RyYWNrcy9zZWdtZW50aW5mbyBhbHJlYWR5PyAqLworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgdHJhY2tzX3BhcnNlZDsKKyAgR0xpc3QgICAgICAgICAgICAgICAgICAgKnNlZWtfcGFyc2VkOworCisgIC8qIGtlZXBpbmcgdHJhY2sgb2YgcGxheWJhY2sgcG9zaXRpb24gKi8KKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIHNlZ21lbnRfcnVubmluZzsKKyAgR3N0Q2xvY2tUaW1lICAgICAgICAgICAgIGxhc3Rfc3RvcF9lbmQ7CisKKyAgR3N0RXZlbnQgICAgICAgICAgICAgICAgKmNsb3NlX3NlZ21lbnQ7CisgIEdzdEV2ZW50ICAgICAgICAgICAgICAgICpuZXdfc2VnbWVudDsKKworICAvKiBzb21lIHN0YXRlIHNhdmluZyAqLworICBHc3RDbG9ja1RpbWUgICAgICAgICAgICAgY2x1c3Rlcl90aW1lOworICBndWludDY0ICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9vZmZzZXQ7CisgIGd1aW50NjQgICAgICAgICAgICAgICAgICBmaXJzdF9jbHVzdGVyX29mZnNldDsKKyAgZ3VpbnQ2NCAgICAgICAgICAgICAgICAgIG5leHRfY2x1c3Rlcl9vZmZzZXQ7CisKKyAgLyogaW5kZXggc3R1ZmYgKi8KKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIHNlZWthYmxlOworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgYnVpbGRpbmdfaW5kZXg7CisgIGd1aW50NjQgICAgICAgICAgICAgICAgICBpbmRleF9vZmZzZXQ7CisgIEdzdEV2ZW50ICAgICAgICAgICAgICAgICpzZWVrX2V2ZW50OworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgbmVlZF9uZXdzZWdtZW50OworCisgIC8qIHJldmVyc2UgcGxheWJhY2sgKi8KKyAgR0FycmF5ICAgICAgICAgICAgICAgICAgKnNlZWtfaW5kZXg7CisgIGdpbnQgICAgICAgICAgICAgICAgICAgICBzZWVrX2VudHJ5OworfSBHc3RNYXRyb3NrYVBhcnNlOworCit0eXBlZGVmIHN0cnVjdCBfR3N0TWF0cm9za2FQYXJzZUNsYXNzIHsKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudDsKK30gR3N0TWF0cm9za2FQYXJzZUNsYXNzOworCitnYm9vbGVhbiBnc3RfbWF0cm9za2FfcGFyc2VfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX01BVFJPU0tBX1BBUlNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmMgYi9nc3QvbWF0cm9za2EvbWF0cm9za2EtcmVhZC1jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTliYTdmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmMKQEAgLTAsMCArMSwzMDcwIEBACisvKiBHU3RyZWFtZXIgTWF0cm9za2EgbXV4ZXIvZGVtdXhlcgorICogKGMpIDIwMDMgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogKGMpIDIwMDYgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqIChjKSAyMDA4IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqIChjKSAyMDExIERlYmFyc2hpIFJheSA8cmlzaGlAZ251Lm9yZz4KKyAqCisgKiBtYXRyb3NrYS1yZWFkLWNvbW1vbi5jOiBzaGFyZWQgYnkgbWF0cm9za2EgZmlsZS9zdHJlYW0gZGVtdXhlciBhbmQgcGFyc2VyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIEhBVkVfWkxJQgorI2luY2x1ZGUgPHpsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9CWjIKKyNpbmNsdWRlIDxiemxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdHR5cGVmaW5kaGVscGVyLmg+CisKKyNpbmNsdWRlICJsem8uaCIKKworI2luY2x1ZGUgImVibWwtcmVhZC5oIgorI2luY2x1ZGUgIm1hdHJvc2thLXJlYWQtY29tbW9uLmgiCisjaW5jbHVkZSAibWF0cm9za2EtaWRzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWSAobWF0cm9za2FyZWFkY29tbW9uX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIG1hdHJvc2thcmVhZGNvbW1vbl9kZWJ1ZworCisjZGVmaW5lIERFQlVHX0VMRU1FTlRfU1RBUlQoY29tbW9uLCBlYm1sLCBlbGVtZW50KSBcCisgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiUGFyc2luZyAiIGVsZW1lbnQgIiBlbGVtZW50IGF0IG9mZnNldCAlIiBcCisgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGdzdF9lYm1sX3JlYWRfZ2V0X3BvcyAoZWJtbCkpCisKKyNkZWZpbmUgREVCVUdfRUxFTUVOVF9TVE9QKGNvbW1vbiwgZWJtbCwgZWxlbWVudCwgcmV0KSBcCisgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiUGFyc2luZyAiIGVsZW1lbnQgIiBlbGVtZW50ICIgXAorICAgICAgICAiIGZpbmlzaGVkIHdpdGggJyVzJyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKQorCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UT0NfVUlEX0NIQVBURVIgImNoYXB0ZXIiCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UT0NfVUlEX0VESVRJT04gImVkaXRpb24iCisjZGVmaW5lIEdTVF9NQVRST1NLQV9UT0NfVUlEX0VNUFRZICJlbXB0eSIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0VGFnTGlzdCAqcmVzdWx0OworICBndWludDY0IHRhcmdldF90eXBlX3ZhbHVlOworICBnY2hhciAqdGFyZ2V0X3R5cGU7CisgIGdib29sZWFuIGF1ZGlvX29ubHk7Cit9IFRhcmdldFR5cGVDb250ZXh0OworCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21hdHJvc2thX2RlY29tcHJlc3NfZGF0YSAoR3N0TWF0cm9za2FUcmFja0VuY29kaW5nICogZW5jLAorICAgIGdwb2ludGVyICogZGF0YV9vdXQsIGdzaXplICogc2l6ZV9vdXQsCisgICAgR3N0TWF0cm9za2FUcmFja0NvbXByZXNzaW9uQWxnb3JpdGhtIGFsZ28pCit7CisgIGd1aW50OCAqbmV3X2RhdGEgPSBOVUxMOworICBndWludCBuZXdfc2l6ZSA9IDA7CisgIGd1aW50OCAqZGF0YSA9ICpkYXRhX291dDsKKyAgZ3VpbnQgc2l6ZSA9ICpzaXplX291dDsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICBpZiAoYWxnbyA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfQ09NUFJFU1NJT05fQUxHT1JJVEhNX1pMSUIpIHsKKyNpZmRlZiBIQVZFX1pMSUIKKyAgICAvKiB6bGliIGVuY29kZWQgZGF0YSAqLworICAgIHpfc3RyZWFtIHpzdHJlYW07CisgICAgZ3VpbnQgb3JpZ19zaXplOworICAgIGludCByZXN1bHQ7CisKKyAgICBvcmlnX3NpemUgPSBzaXplOworICAgIHpzdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpIDA7CisgICAgenN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpIDA7CisgICAgenN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKSAwOworICAgIGlmIChpbmZsYXRlSW5pdCAoJnpzdHJlYW0pICE9IFpfT0spIHsKKyAgICAgIEdTVF9XQVJOSU5HICgiemxpYiBpbml0aWFsaXphdGlvbiBmYWlsZWQuIik7CisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICB6c3RyZWFtLm5leHRfaW4gPSAoQnl0ZWYgKikgZGF0YTsKKyAgICB6c3RyZWFtLmF2YWlsX2luID0gb3JpZ19zaXplOworICAgIG5ld19zaXplID0gb3JpZ19zaXplOworICAgIG5ld19kYXRhID0gZ19tYWxsb2MgKG5ld19zaXplKTsKKyAgICB6c3RyZWFtLmF2YWlsX291dCA9IG5ld19zaXplOworICAgIHpzdHJlYW0ubmV4dF9vdXQgPSAoQnl0ZWYgKikgbmV3X2RhdGE7CisKKyAgICBkbyB7CisgICAgICByZXN1bHQgPSBpbmZsYXRlICgmenN0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgICBpZiAocmVzdWx0ID09IFpfU1RSRUFNX0VORCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IFpfT0spIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJpbmZsYXRlKCkgcmV0dXJuZWQgJWQiLCByZXN1bHQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgbmV3X3NpemUgKz0gNDA5NjsKKyAgICAgIG5ld19kYXRhID0gZ19yZWFsbG9jIChuZXdfZGF0YSwgbmV3X3NpemUpOworICAgICAgenN0cmVhbS5uZXh0X291dCA9IChCeXRlZiAqKSAobmV3X2RhdGEgKyB6c3RyZWFtLnRvdGFsX291dCk7CisgICAgICB6c3RyZWFtLmF2YWlsX291dCArPSA0MDk2OworICAgIH0gd2hpbGUgKHpzdHJlYW0uYXZhaWxfaW4gPiAwKTsKKworICAgIGlmIChyZXN1bHQgIT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIGdfZnJlZSAobmV3X2RhdGEpOworICAgIH0gZWxzZSB7CisgICAgICBuZXdfc2l6ZSA9IHpzdHJlYW0udG90YWxfb3V0OworICAgIH0KKyAgICBpbmZsYXRlRW5kICgmenN0cmVhbSk7CisKKyNlbHNlCisgICAgR1NUX1dBUk5JTkcgKCJ6bGliIGVuY29kZWQgdHJhY2tzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgcmV0ID0gRkFMU0U7CisgICAgZ290byBvdXQ7CisjZW5kaWYKKyAgfSBlbHNlIGlmIChhbGdvID09IEdTVF9NQVRST1NLQV9UUkFDS19DT01QUkVTU0lPTl9BTEdPUklUSE1fQlpMSUIpIHsKKyNpZmRlZiBIQVZFX0JaMgorICAgIC8qIGJ6aXAyIGVuY29kZWQgZGF0YSAqLworICAgIGJ6X3N0cmVhbSBienN0cmVhbTsKKyAgICBndWludCBvcmlnX3NpemU7CisgICAgaW50IHJlc3VsdDsKKworICAgIGJ6c3RyZWFtLmJ6YWxsb2MgPSBOVUxMOworICAgIGJ6c3RyZWFtLmJ6ZnJlZSA9IE5VTEw7CisgICAgYnpzdHJlYW0ub3BhcXVlID0gTlVMTDsKKyAgICBvcmlnX3NpemUgPSBzaXplOworCisgICAgaWYgKEJaMl9iekRlY29tcHJlc3NJbml0ICgmYnpzdHJlYW0sIDAsIDApICE9IEJaX09LKSB7CisgICAgICBHU1RfV0FSTklORyAoImJ6aXAyIGluaXRpYWxpemF0aW9uIGZhaWxlZC4iKTsKKyAgICAgIHJldCA9IEZBTFNFOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgYnpzdHJlYW0ubmV4dF9pbiA9IChjaGFyICopIGRhdGE7CisgICAgYnpzdHJlYW0uYXZhaWxfaW4gPSBvcmlnX3NpemU7CisgICAgbmV3X3NpemUgPSBvcmlnX3NpemU7CisgICAgbmV3X2RhdGEgPSBnX21hbGxvYyAobmV3X3NpemUpOworICAgIGJ6c3RyZWFtLmF2YWlsX291dCA9IG5ld19zaXplOworICAgIGJ6c3RyZWFtLm5leHRfb3V0ID0gKGNoYXIgKikgbmV3X2RhdGE7CisKKyAgICBkbyB7CisgICAgICByZXN1bHQgPSBCWjJfYnpEZWNvbXByZXNzICgmYnpzdHJlYW0pOworICAgICAgaWYgKHJlc3VsdCA9PSBCWl9TVFJFQU1fRU5EKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gQlpfT0spIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJCWjJfYnpEZWNvbXByZXNzKCkgcmV0dXJuZWQgJWQiLCByZXN1bHQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgbmV3X3NpemUgKz0gNDA5NjsKKyAgICAgIG5ld19kYXRhID0gZ19yZWFsbG9jIChuZXdfZGF0YSwgbmV3X3NpemUpOworICAgICAgYnpzdHJlYW0ubmV4dF9vdXQgPSAoY2hhciAqKSAobmV3X2RhdGEgKyBienN0cmVhbS50b3RhbF9vdXRfbG8zMik7CisgICAgICBienN0cmVhbS5hdmFpbF9vdXQgKz0gNDA5NjsKKyAgICB9IHdoaWxlIChienN0cmVhbS5hdmFpbF9pbiA+IDApOworCisgICAgaWYgKHJlc3VsdCAhPSBCWl9TVFJFQU1fRU5EKSB7CisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIGdfZnJlZSAobmV3X2RhdGEpOworICAgIH0gZWxzZSB7CisgICAgICBuZXdfc2l6ZSA9IGJ6c3RyZWFtLnRvdGFsX291dF9sbzMyOworICAgIH0KKyAgICBCWjJfYnpEZWNvbXByZXNzRW5kICgmYnpzdHJlYW0pOworCisjZWxzZQorICAgIEdTVF9XQVJOSU5HICgiYnppcDIgZW5jb2RlZCB0cmFja3Mgbm90IHN1cHBvcnRlZC4iKTsKKyAgICByZXQgPSBGQUxTRTsKKyAgICBnb3RvIG91dDsKKyNlbmRpZgorICB9IGVsc2UgaWYgKGFsZ28gPT0gR1NUX01BVFJPU0tBX1RSQUNLX0NPTVBSRVNTSU9OX0FMR09SSVRITV9MWk8xWCkgeworICAgIC8qIGx6byBlbmNvZGVkIGRhdGEgKi8KKyAgICBpbnQgcmVzdWx0OworICAgIGludCBvcmlnX3NpemUsIG91dF9zaXplOworCisgICAgb3JpZ19zaXplID0gc2l6ZTsKKyAgICBvdXRfc2l6ZSA9IHNpemU7CisgICAgbmV3X3NpemUgPSBzaXplOworICAgIG5ld19kYXRhID0gZ19tYWxsb2MgKG5ld19zaXplKTsKKworICAgIGRvIHsKKyAgICAgIG9yaWdfc2l6ZSA9IHNpemU7CisgICAgICBvdXRfc2l6ZSA9IG5ld19zaXplOworCisgICAgICByZXN1bHQgPSBsem8xeF9kZWNvZGUgKG5ld19kYXRhLCAmb3V0X3NpemUsIGRhdGEsICZvcmlnX3NpemUpOworCisgICAgICBpZiAob3JpZ19zaXplID4gMCkgeworICAgICAgICBuZXdfc2l6ZSArPSA0MDk2OworICAgICAgICBuZXdfZGF0YSA9IGdfcmVhbGxvYyAobmV3X2RhdGEsIG5ld19zaXplKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlIChvcmlnX3NpemUgPiAwICYmIHJlc3VsdCA9PSBMWk9fT1VUUFVUX0ZVTEwpOworCisgICAgbmV3X3NpemUgLT0gb3V0X3NpemU7CisKKyAgICBpZiAocmVzdWx0ICE9IExaT19PVVRQVVRfRlVMTCkgeworICAgICAgR1NUX1dBUk5JTkcgKCJsem8gZGVjb21wcmVzc2lvbiBmYWlsZWQiKTsKKyAgICAgIGdfZnJlZSAobmV3X2RhdGEpOworCisgICAgICByZXQgPSBGQUxTRTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICB9IGVsc2UgaWYgKGFsZ28gPT0gR1NUX01BVFJPU0tBX1RSQUNLX0NPTVBSRVNTSU9OX0FMR09SSVRITV9IRUFERVJTVFJJUCkgeworICAgIC8qIGhlYWRlciBzdHJpcHBlZCBlbmNvZGVkIGRhdGEgKi8KKyAgICBpZiAoZW5jLT5jb21wX3NldHRpbmdzX2xlbmd0aCA+IDApIHsKKyAgICAgIG5ld19kYXRhID0gZ19tYWxsb2MgKHNpemUgKyBlbmMtPmNvbXBfc2V0dGluZ3NfbGVuZ3RoKTsKKyAgICAgIG5ld19zaXplID0gc2l6ZSArIGVuYy0+Y29tcF9zZXR0aW5nc19sZW5ndGg7CisKKyAgICAgIG1lbWNweSAobmV3X2RhdGEsIGVuYy0+Y29tcF9zZXR0aW5ncywgZW5jLT5jb21wX3NldHRpbmdzX2xlbmd0aCk7CisgICAgICBtZW1jcHkgKG5ld19kYXRhICsgZW5jLT5jb21wX3NldHRpbmdzX2xlbmd0aCwgZGF0YSwgc2l6ZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9FUlJPUiAoImludmFsaWQgY29tcHJlc3Npb24gYWxnb3JpdGhtICVkIiwgYWxnbyk7CisgICAgcmV0ID0gRkFMU0U7CisgIH0KKworb3V0OgorCisgIGlmICghcmV0KSB7CisgICAgKmRhdGFfb3V0ID0gTlVMTDsKKyAgICAqc2l6ZV9vdXQgPSAwOworICB9IGVsc2UgeworICAgICpkYXRhX291dCA9IG5ld19kYXRhOworICAgICpzaXplX291dCA9IG5ld19zaXplOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX2RlY29kZV9jb250ZW50X2VuY29kaW5ncyAoR0FycmF5ICogZW5jb2RpbmdzKQoreworICBnaW50IGk7CisKKyAgaWYgKGVuY29kaW5ncyA9PSBOVUxMKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICBmb3IgKGkgPSAwOyBpIDwgZW5jb2RpbmdzLT5sZW47IGkrKykgeworICAgIEdzdE1hdHJvc2thVHJhY2tFbmNvZGluZyAqZW5jID0KKyAgICAgICAgJmdfYXJyYXlfaW5kZXggKGVuY29kaW5ncywgR3N0TWF0cm9za2FUcmFja0VuY29kaW5nLCBpKTsKKyAgICBncG9pbnRlciBkYXRhID0gTlVMTDsKKyAgICBnc2l6ZSBzaXplOworCisgICAgaWYgKChlbmMtPnNjb3BlICYgR1NUX01BVFJPU0tBX1RSQUNLX0VOQ09ESU5HX1NDT1BFX05FWFRfQ09OVEVOVF9FTkNPRElORykKKyAgICAgICAgPT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogRW5jcnlwdGlvbiBub3Qgc3VwcG9ydGVkIHlldCAqLworICAgIGlmIChlbmMtPnR5cGUgIT0gMCkKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKworICAgIGlmIChpICsgMSA+PSBlbmNvZGluZ3MtPmxlbikKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKworICAgIGlmIChlbmMtPmNvbXBfc2V0dGluZ3NfbGVuZ3RoID09IDApCisgICAgICBjb250aW51ZTsKKworICAgIGRhdGEgPSBlbmMtPmNvbXBfc2V0dGluZ3M7CisgICAgc2l6ZSA9IGVuYy0+Y29tcF9zZXR0aW5nc19sZW5ndGg7CisKKyAgICBpZiAoIWdzdF9tYXRyb3NrYV9kZWNvbXByZXNzX2RhdGEgKGVuYywgJmRhdGEsICZzaXplLCBlbmMtPmNvbXBfYWxnbykpCisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisKKyAgICBnX2ZyZWUgKGVuYy0+Y29tcF9zZXR0aW5ncyk7CisKKyAgICBlbmMtPmNvbXBfc2V0dGluZ3MgPSBkYXRhOworICAgIGVuYy0+Y29tcF9zZXR0aW5nc19sZW5ndGggPSBzaXplOworICB9CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitnYm9vbGVhbgorZ3N0X21hdHJvc2thX2RlY29kZV9kYXRhIChHQXJyYXkgKiBlbmNvZGluZ3MsIGdwb2ludGVyICogZGF0YV9vdXQsCisgICAgZ3NpemUgKiBzaXplX291dCwgR3N0TWF0cm9za2FUcmFja0VuY29kaW5nU2NvcGUgc2NvcGUsIGdib29sZWFuIGZyZWUpCit7CisgIGdwb2ludGVyIGRhdGE7CisgIGdzaXplIHNpemU7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIGdpbnQgaTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZW5jb2RpbmdzICE9IE5VTEwsIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGRhdGFfb3V0ICE9IE5VTEwgJiYgKmRhdGFfb3V0ICE9IE5VTEwsIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNpemVfb3V0ICE9IE5VTEwsIEZBTFNFKTsKKworICBkYXRhID0gKmRhdGFfb3V0OworICBzaXplID0gKnNpemVfb3V0OworCisgIGZvciAoaSA9IDA7IGkgPCBlbmNvZGluZ3MtPmxlbjsgaSsrKSB7CisgICAgR3N0TWF0cm9za2FUcmFja0VuY29kaW5nICplbmMgPQorICAgICAgICAmZ19hcnJheV9pbmRleCAoZW5jb2RpbmdzLCBHc3RNYXRyb3NrYVRyYWNrRW5jb2RpbmcsIGkpOworICAgIGdwb2ludGVyIG5ld19kYXRhID0gTlVMTDsKKyAgICBnc2l6ZSBuZXdfc2l6ZSA9IDA7CisKKyAgICBpZiAoKGVuYy0+c2NvcGUgJiBzY29wZSkgPT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogRW5jcnlwdGlvbiBub3Qgc3VwcG9ydGVkIHlldCAqLworICAgIGlmIChlbmMtPnR5cGUgIT0gMCkgeworICAgICAgcmV0ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBuZXdfZGF0YSA9IGRhdGE7CisgICAgbmV3X3NpemUgPSBzaXplOworCisgICAgcmV0ID0KKyAgICAgICAgZ3N0X21hdHJvc2thX2RlY29tcHJlc3NfZGF0YSAoZW5jLCAmbmV3X2RhdGEsICZuZXdfc2l6ZSwKKyAgICAgICAgZW5jLT5jb21wX2FsZ28pOworCisgICAgaWYgKCFyZXQpCisgICAgICBicmVhazsKKworICAgIGlmICgoZGF0YSA9PSAqZGF0YV9vdXQgJiYgZnJlZSkgfHwgKGRhdGEgIT0gKmRhdGFfb3V0KSkKKyAgICAgIGdfZnJlZSAoZGF0YSk7CisKKyAgICBkYXRhID0gbmV3X2RhdGE7CisgICAgc2l6ZSA9IG5ld19zaXplOworICB9CisKKyAgaWYgKCFyZXQpIHsKKyAgICBpZiAoKGRhdGEgPT0gKmRhdGFfb3V0ICYmIGZyZWUpIHx8IChkYXRhICE9ICpkYXRhX291dCkpCisgICAgICBnX2ZyZWUgKGRhdGEpOworCisgICAgKmRhdGFfb3V0ID0gTlVMTDsKKyAgICAqc2l6ZV9vdXQgPSAwOworICB9IGVsc2UgeworICAgICpkYXRhX291dCA9IGRhdGE7CisgICAgKnNpemVfb3V0ID0gc2l6ZTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnaW50Citnc3RfbWF0cm9za2FfaW5kZXhfY29tcGFyZSAoR3N0TWF0cm9za2FJbmRleCAqIGkxLCBHc3RNYXRyb3NrYUluZGV4ICogaTIpCit7CisgIGlmIChpMS0+dGltZSA8IGkyLT50aW1lKQorICAgIHJldHVybiAtMTsKKyAgZWxzZSBpZiAoaTEtPnRpbWUgPiBpMi0+dGltZSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZSBpZiAoaTEtPmJsb2NrIDwgaTItPmJsb2NrKQorICAgIHJldHVybiAtMTsKKyAgZWxzZSBpZiAoaTEtPmJsb2NrID4gaTItPmJsb2NrKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK2dpbnQKK2dzdF9tYXRyb3NrYV9pbmRleF9zZWVrX2ZpbmQgKEdzdE1hdHJvc2thSW5kZXggKiBpMSwgR3N0Q2xvY2tUaW1lICogdGltZSwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGlmIChpMS0+dGltZSA8ICp0aW1lKQorICAgIHJldHVybiAtMTsKKyAgZWxzZSBpZiAoaTEtPnRpbWUgPiAqdGltZSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitHc3RNYXRyb3NrYUluZGV4ICoKK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9kb19pbmRleF9zZWVrIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiB0cmFjaywgZ2ludDY0IHNlZWtfcG9zLCBHQXJyYXkgKiogX2luZGV4LAorICAgIGdpbnQgKiBfZW50cnlfaW5kZXgsIEdzdFNlYXJjaE1vZGUgc25hcF9kaXIpCit7CisgIEdzdE1hdHJvc2thSW5kZXggKmVudHJ5ID0gTlVMTDsKKyAgR0FycmF5ICppbmRleDsKKworICAvKiBmaW5kIGVudHJ5IGp1c3QgYmVmb3JlIG9yIGF0IHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gKi8KKyAgaWYgKHRyYWNrICYmIHRyYWNrLT5pbmRleF90YWJsZSkKKyAgICBpbmRleCA9IHRyYWNrLT5pbmRleF90YWJsZTsKKyAgZWxzZQorICAgIGluZGV4ID0gY29tbW9uLT5pbmRleDsKKworICBpZiAoIWluZGV4IHx8ICFpbmRleC0+bGVuKQorICAgIHJldHVybiBOVUxMOworCisgIGVudHJ5ID0KKyAgICAgIGdzdF91dGlsX2FycmF5X2JpbmFyeV9zZWFyY2ggKGluZGV4LT5kYXRhLCBpbmRleC0+bGVuLAorICAgICAgc2l6ZW9mIChHc3RNYXRyb3NrYUluZGV4KSwKKyAgICAgIChHQ29tcGFyZURhdGFGdW5jKSBnc3RfbWF0cm9za2FfaW5kZXhfc2Vla19maW5kLCBzbmFwX2RpciwgJnNlZWtfcG9zLAorICAgICAgTlVMTCk7CisKKyAgaWYgKGVudHJ5ID09IE5VTEwpIHsKKyAgICBpZiAoc25hcF9kaXIgPT0gR1NUX1NFQVJDSF9NT0RFX0FGVEVSKSB7CisgICAgICAvKiBDYW4gb25seSBoYXBwZW4gd2l0aCBhIHJldmVyc2Ugc2VlayBwYXN0IHRoZSBlbmQgKi8KKyAgICAgIGVudHJ5ID0gJmdfYXJyYXlfaW5kZXggKGluZGV4LCBHc3RNYXRyb3NrYUluZGV4LCBpbmRleC0+bGVuIC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIENhbiBvbmx5IGhhcHBlbiB3aXRoIGEgZm9yd2FyZCBzZWVrIGJlZm9yZSB0aGUgc3RhcnQgKi8KKyAgICAgIGVudHJ5ID0gJmdfYXJyYXlfaW5kZXggKGluZGV4LCBHc3RNYXRyb3NrYUluZGV4LCAwKTsKKyAgICB9CisgIH0KKworICBpZiAoX2luZGV4KQorICAgICpfaW5kZXggPSBpbmRleDsKKyAgaWYgKF9lbnRyeV9pbmRleCkKKyAgICAqX2VudHJ5X2luZGV4ID0gZW50cnkgLSAoR3N0TWF0cm9za2FJbmRleCAqKSBpbmRleC0+ZGF0YTsKKworICByZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyBnaW50Citnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZW5jb2RpbmdfY21wIChHc3RNYXRyb3NrYVRyYWNrRW5jb2RpbmcgKiBhLAorICAgIEdzdE1hdHJvc2thVHJhY2tFbmNvZGluZyAqIGIpCit7CisgIGlmIChiLT5vcmRlciA+IGEtPm9yZGVyKQorICAgIHJldHVybiAxOworICBlbHNlIGlmIChiLT5vcmRlciA8IGEtPm9yZGVyKQorICAgIHJldHVybiAtMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9lbmNvZGluZ19vcmRlcl91bmlxdWUgKEdBcnJheSAqIGVuY29kaW5ncywgZ3VpbnQ2NAorICAgIG9yZGVyKQoreworICBnaW50IGk7CisKKyAgaWYgKGVuY29kaW5ncyA9PSBOVUxMIHx8IGVuY29kaW5ncy0+bGVuID09IDApCisgICAgcmV0dXJuIFRSVUU7CisKKyAgZm9yIChpID0gMDsgaSA8IGVuY29kaW5ncy0+bGVuOyBpKyspCisgICAgaWYgKGdfYXJyYXlfaW5kZXggKGVuY29kaW5ncywgR3N0TWF0cm9za2FUcmFja0VuY29kaW5nLCBpKS5vcmRlciA9PSBvcmRlcikKKyAgICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogdGFrZXMgb3duZXJzaGlwIG9mIHRhZ2xpc3QgKi8KK3ZvaWQKK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9mb3VuZF9nbG9iYWxfdGFnIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWxlbWVudCAqIGVsLCBHc3RUYWdMaXN0ICogdGFnbGlzdCkKK3sKKyAgaWYgKGNvbW1vbi0+Z2xvYmFsX3RhZ3MpIHsKKyAgICBnc3RfdGFnX2xpc3RfaW5zZXJ0IChjb21tb24tPmdsb2JhbF90YWdzLCB0YWdsaXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCk7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdsaXN0KTsKKyAgfSBlbHNlIHsKKyAgICBjb21tb24tPmdsb2JhbF90YWdzID0gdGFnbGlzdDsKKyAgfQorICBjb21tb24tPmdsb2JhbF90YWdzX2NoYW5nZWQgPSBUUlVFOworfQorCitnaW50NjQKK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9nZXRfbGVuZ3RoIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24pCit7CisgIGdpbnQ2NCBlbmQgPSAtMTsKKworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAoY29tbW9uLT5zaW5rcGFkLCBHU1RfRk9STUFUX0JZVEVTLAorICAgICAgICAgICZlbmQpIHx8IGVuZCA8IDApCisgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAibm8gdXBzdHJlYW0gbGVuZ3RoIik7CisKKyAgcmV0dXJuIGVuZDsKK30KKworLyogZGV0ZXJtaW5lIHRyYWNrIHRvIHNlZWsgaW4gKi8KK0dzdE1hdHJvc2thVHJhY2tDb250ZXh0ICoKK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9nZXRfc2Vla190cmFjayAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLAorICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICogdHJhY2spCit7CisgIGdpbnQgaTsKKworICBpZiAodHJhY2sgJiYgdHJhY2stPnR5cGUgPT0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU8pCisgICAgcmV0dXJuIHRyYWNrOworCisgIGZvciAoaSA9IDA7IGkgPCBjb21tb24tPnNyYy0+bGVuOyBpKyspIHsKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqc3RyZWFtOworCisgICAgc3RyZWFtID0gZ19wdHJfYXJyYXlfaW5kZXggKGNvbW1vbi0+c3JjLCBpKTsKKyAgICBpZiAoc3RyZWFtLT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1ZJREVPICYmIHN0cmVhbS0+aW5kZXhfdGFibGUpCisgICAgICB0cmFjayA9IHN0cmVhbTsKKyAgfQorCisgIHJldHVybiB0cmFjazsKK30KKworLyogc2tpcCB1bmtub3duIG9yIGFsaWtlIGVsZW1lbnQgKi8KK0dzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sLCBjb25zdCBnY2hhciAqIHBhcmVudF9uYW1lLCBndWludCBpZCkKK3sKKyAgaWYgKGlkID09IEdTVF9FQk1MX0lEX1ZPSUQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJTa2lwcGluZyBFQk1MIFZvaWQgZWxlbWVudCIpOworICB9IGVsc2UgaWYgKGlkID09IEdTVF9FQk1MX0lEX0NSQzMyKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiU2tpcHBpbmcgRUJNTCBDUkMzMiBlbGVtZW50Iik7CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICJVbmtub3duICVzIHN1YmVsZW1lbnQgMHgleCAtIGlnbm9yaW5nIiwgcGFyZW50X25hbWUsIGlkKTsKKyAgfQorCisgIHJldHVybiBnc3RfZWJtbF9yZWFkX3NraXAgKGVibWwpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX2F0dGFjaGVkX2ZpbGUgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbiwKKyAgICBHc3RFYm1sUmVhZCAqIGVibWwsIEdzdFRhZ0xpc3QgKiB0YWdsaXN0KQoreworICBndWludDMyIGlkOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ2NoYXIgKmRlc2NyaXB0aW9uID0gTlVMTDsKKyAgZ2NoYXIgKmZpbGVuYW1lID0gTlVMTDsKKyAgZ2NoYXIgKm1pbWV0eXBlID0gTlVMTDsKKyAgZ3VpbnQ4ICpkYXRhID0gTlVMTDsKKyAgZ3VpbnQ2NCBkYXRhbGVuID0gMDsKKworICBERUJVR19FTEVNRU5UX1NUQVJUIChjb21tb24sIGVibWwsICJBdHRhY2hlZEZpbGUiKTsKKworICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfbWFzdGVyIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykgeworICAgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiQXR0YWNoZWRGaWxlIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgLyogcmVhZCBhbGwgc3ViLWVudHJpZXMgKi8KKworICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0ZJTEVERVNDUklQVElPTjoKKyAgICAgICAgaWYgKGRlc2NyaXB0aW9uKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICAgICAgICJGaWxlRGVzY3JpcHRpb24gY2FuIG9ubHkgYXBwZWFyIG9uY2UiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfdXRmOCAoZWJtbCwgJmlkLCAmZGVzY3JpcHRpb24pOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJGaWxlRGVzY3JpcHRpb246ICVzIiwKKyAgICAgICAgICAgIEdTVF9TVFJfTlVMTCAoZGVzY3JpcHRpb24pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9GSUxFTkFNRToKKyAgICAgICAgaWYgKGZpbGVuYW1lKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJGaWxlTmFtZSBjYW4gb25seSBhcHBlYXIgb25jZSIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF91dGY4IChlYm1sLCAmaWQsICZmaWxlbmFtZSk7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiRmlsZU5hbWU6ICVzIiwKKyAgICAgICAgICAgIEdTVF9TVFJfTlVMTCAoZmlsZW5hbWUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9GSUxFTUlNRVRZUEU6CisgICAgICAgIGlmIChtaW1ldHlwZSkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgICAiRmlsZU1pbWVUeXBlIGNhbiBvbmx5IGFwcGVhciBvbmNlIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBnc3RfZWJtbF9yZWFkX2FzY2lpIChlYm1sLCAmaWQsICZtaW1ldHlwZSk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIkZpbGVNaW1lVHlwZTogJXMiLAorICAgICAgICAgICAgR1NUX1NUUl9OVUxMIChtaW1ldHlwZSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0ZJTEVEQVRBOgorICAgICAgICBpZiAoZGF0YSkgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiRmlsZURhdGEgY2FuIG9ubHkgYXBwZWFyIG9uY2UiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfYmluYXJ5IChlYm1sLCAmaWQsICZkYXRhLCAmZGF0YWxlbik7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAgICJGaWxlRGF0YSBvZiBzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQsIGRhdGFsZW4pOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX3NraXAgKGNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICJBdHRhY2hlZEZpbGUiLCBpZCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfRklMRVVJRDoKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9za2lwIChlYm1sKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJBdHRhY2hlZEZpbGUiLCByZXQpOworCisgIGlmIChmaWxlbmFtZSAmJiBtaW1ldHlwZSAmJiBkYXRhICYmIGRhdGFsZW4gPiAwKSB7CisgICAgR3N0VGFnSW1hZ2VUeXBlIGltYWdlX3R5cGUgPSBHU1RfVEFHX0lNQUdFX1RZUEVfTk9ORTsKKyAgICBHc3RCdWZmZXIgKnRhZ2J1ZmZlciA9IE5VTEw7CisgICAgR3N0U2FtcGxlICp0YWdzYW1wbGUgPSBOVUxMOworICAgIEdzdFN0cnVjdHVyZSAqaW5mbyA9IE5VTEw7CisgICAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisgICAgZ2NoYXIgKmZpbGVuYW1lX2xjID0gZ191dGY4X3N0cmRvd24gKGZpbGVuYW1lLCAtMSk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJDcmVhdGluZyB0YWcgZm9yIGF0dGFjaG1lbnQgd2l0aCAiCisgICAgICAgICJmaWxlbmFtZSAnJXMnLCBtaW1ldHlwZSAnJXMnLCBkZXNjcmlwdGlvbiAnJXMnLCAiCisgICAgICAgICJzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQsIGZpbGVuYW1lLCBtaW1ldHlwZSwKKyAgICAgICAgR1NUX1NUUl9OVUxMIChkZXNjcmlwdGlvbiksIGRhdGFsZW4pOworCisgICAgLyogVE9ETzogYmV0dGVyIGhldXJpc3RpY3MgZm9yIGRpZmZlcmVudCBpbWFnZSB0eXBlcyAqLworICAgIGlmIChzdHJzdHIgKGZpbGVuYW1lX2xjLCAiY292ZXIiKSkgeworICAgICAgaWYgKHN0cnN0ciAoZmlsZW5hbWVfbGMsICJiYWNrIikpCisgICAgICAgIGltYWdlX3R5cGUgPSBHU1RfVEFHX0lNQUdFX1RZUEVfQkFDS19DT1ZFUjsKKyAgICAgIGVsc2UKKyAgICAgICAgaW1hZ2VfdHlwZSA9IEdTVF9UQUdfSU1BR0VfVFlQRV9GUk9OVF9DT1ZFUjsKKyAgICB9IGVsc2UgaWYgKGdfc3RyX2hhc19wcmVmaXggKG1pbWV0eXBlLCAiaW1hZ2UvIikgfHwKKyAgICAgICAgZ19zdHJfaGFzX3N1ZmZpeCAoZmlsZW5hbWVfbGMsICJwbmciKSB8fAorICAgICAgICBnX3N0cl9oYXNfc3VmZml4IChmaWxlbmFtZV9sYywgImpwZyIpIHx8CisgICAgICAgIGdfc3RyX2hhc19zdWZmaXggKGZpbGVuYW1lX2xjLCAianBlZyIpIHx8CisgICAgICAgIGdfc3RyX2hhc19zdWZmaXggKGZpbGVuYW1lX2xjLCAiZ2lmIikgfHwKKyAgICAgICAgZ19zdHJfaGFzX3N1ZmZpeCAoZmlsZW5hbWVfbGMsICJibXAiKSkgeworICAgICAgaW1hZ2VfdHlwZSA9IEdTVF9UQUdfSU1BR0VfVFlQRV9VTkRFRklORUQ7CisgICAgfQorICAgIGdfZnJlZSAoZmlsZW5hbWVfbGMpOworCisgICAgLyogRmlyc3QgdHJ5IHRvIGNyZWF0ZSBhbiBpbWFnZSB0YWcgYnVmZmVyIGZyb20gdGhpcyAqLworICAgIGlmIChpbWFnZV90eXBlICE9IEdTVF9UQUdfSU1BR0VfVFlQRV9OT05FKSB7CisgICAgICB0YWdzYW1wbGUgPQorICAgICAgICAgIGdzdF90YWdfaW1hZ2VfZGF0YV90b19pbWFnZV9zYW1wbGUgKGRhdGEsIGRhdGFsZW4sIGltYWdlX3R5cGUpOworCisgICAgICBpZiAoIXRhZ3NhbXBsZSkgeworICAgICAgICBpbWFnZV90eXBlID0gR1NUX1RBR19JTUFHRV9UWVBFX05PTkU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0YWdidWZmZXIgPSBnc3RfYnVmZmVyX3JlZiAoZ3N0X3NhbXBsZV9nZXRfYnVmZmVyICh0YWdzYW1wbGUpKTsKKyAgICAgICAgY2FwcyA9IGdzdF9jYXBzX3JlZiAoZ3N0X3NhbXBsZV9nZXRfY2FwcyAodGFnc2FtcGxlKSk7CisgICAgICAgIGluZm8gPSBnc3Rfc3RydWN0dXJlX2NvcHkgKGdzdF9zYW1wbGVfZ2V0X2luZm8gKHRhZ3NhbXBsZSkpOworICAgICAgICBnc3Rfc2FtcGxlX3VucmVmICh0YWdzYW1wbGUpOworICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIHRoaXMgZmFpbGVkIGNyZWF0ZSBhbiBhdHRhY2htZW50IGJ1ZmZlciAqLworICAgIGlmICghdGFnYnVmZmVyKSB7CisgICAgICB0YWdidWZmZXIgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChnX21lbWR1cCAoZGF0YSwgZGF0YWxlbiksIGRhdGFsZW4pOworCisgICAgICBjYXBzID0gZ3N0X3R5cGVfZmluZF9oZWxwZXJfZm9yX2J1ZmZlciAoTlVMTCwgdGFnYnVmZmVyLCBOVUxMKTsKKyAgICAgIGlmIChjYXBzID09IE5VTEwpCisgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlIChtaW1ldHlwZSk7CisgICAgfQorCisgICAgLyogU2V0IGZpbGVuYW1lIGFuZCBkZXNjcmlwdGlvbiBpbiB0aGUgaW5mbyAqLworICAgIGlmIChpbmZvID09IE5VTEwpCisgICAgICBpbmZvID0gZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCJHc3RUYWdJbWFnZUluZm8iKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChpbmZvLCAiZmlsZW5hbWUiLCBHX1RZUEVfU1RSSU5HLCBmaWxlbmFtZSwgTlVMTCk7CisgICAgaWYgKGRlc2NyaXB0aW9uKQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKGluZm8sICJkZXNjcmlwdGlvbiIsIEdfVFlQRV9TVFJJTkcsIGRlc2NyaXB0aW9uLCBOVUxMKTsKKworICAgIHRhZ3NhbXBsZSA9IGdzdF9zYW1wbGVfbmV3ICh0YWdidWZmZXIsIGNhcHMsIE5VTEwsIGluZm8pOworCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAodGFnYnVmZmVyKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICJDcmVhdGVkIGF0dGFjaG1lbnQgc2FtcGxlOiAlIiBHU1RfUFRSX0ZPUk1BVCwgdGFnc2FtcGxlKTsKKworICAgIC8qIGFuZCBhcHBlbmQgdG8gdGhlIHRhZyBsaXN0ICovCisgICAgaWYgKGltYWdlX3R5cGUgIT0gR1NUX1RBR19JTUFHRV9UWVBFX05PTkUpCisgICAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwgR1NUX1RBR19JTUFHRSwgdGFnc2FtcGxlLAorICAgICAgICAgIE5VTEwpOworICAgIGVsc2UKKyAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELCBHU1RfVEFHX0FUVEFDSE1FTlQsCisgICAgICAgICAgdGFnc2FtcGxlLCBOVUxMKTsKKworICAgIC8qIHRoZSBsaXN0IGFkZHMgaXQgb3duIHJlZiAqLworICAgIGdzdF9zYW1wbGVfdW5yZWYgKHRhZ3NhbXBsZSk7CisgIH0KKworICBnX2ZyZWUgKGZpbGVuYW1lKTsKKyAgZ19mcmVlIChtaW1ldHlwZSk7CisgIGdfZnJlZSAoZGF0YSk7CisgIGdfZnJlZSAoZGVzY3JpcHRpb24pOworCisgIHJldHVybiByZXQ7Cit9CisKK0dzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9hdHRhY2htZW50cyAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLAorICAgIEdzdEVsZW1lbnQgKiBlbCwgR3N0RWJtbFJlYWQgKiBlYm1sKQoreworICBndWludDMyIGlkOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RUYWdMaXN0ICp0YWdsaXN0OworCisgIERFQlVHX0VMRU1FTlRfU1RBUlQgKGNvbW1vbiwgZWJtbCwgIkF0dGFjaG1lbnRzIik7CisKKyAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBERUJVR19FTEVNRU5UX1NUT1AgKGNvbW1vbiwgZWJtbCwgIkF0dGFjaG1lbnRzIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgdGFnbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIGdzdF90YWdfbGlzdF9zZXRfc2NvcGUgKHRhZ2xpc3QsIEdTVF9UQUdfU0NPUEVfR0xPQkFMKTsKKworICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmIGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3BlZWtfaWQgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9BVFRBQ0hFREZJTEU6CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9hdHRhY2hlZF9maWxlIChjb21tb24sIGVibWwsCisgICAgICAgICAgICB0YWdsaXN0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwIChjb21tb24sIGVibWwsCisgICAgICAgICAgICAiQXR0YWNobWVudHMiLCBpZCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBERUJVR19FTEVNRU5UX1NUT1AgKGNvbW1vbiwgZWJtbCwgIkF0dGFjaG1lbnRzIiwgcmV0KTsKKworICBpZiAoZ3N0X3RhZ19saXN0X25fdGFncyAodGFnbGlzdCkgPiAwKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiU3RvcmluZyBhdHRhY2htZW50IHRhZ3MiKTsKKyAgICBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZm91bmRfZ2xvYmFsX3RhZyAoY29tbW9uLCBlbCwgdGFnbGlzdCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiTm8gdmFsaWQgYXR0YWNobWVudHMgZm91bmQiKTsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ2xpc3QpOworICB9CisKKyAgY29tbW9uLT5hdHRhY2htZW50c19wYXJzZWQgPSBUUlVFOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfdG9jX3RhZyAoR3N0VG9jRW50cnkgKiBlbnRyeSwKKyAgICBHc3RUb2NFbnRyeSAqIGludGVybmFsX2VudHJ5LCBHQXJyYXkgKiBlZGl0aW9uX3RhcmdldHMsCisgICAgR0FycmF5ICogY2hhcHRlcl90YXJnZXRzLCBHc3RUYWdMaXN0ICogdGFncykKK3sKKyAgZ2NoYXIgKnVpZDsKKyAgZ3VpbnQgaTsKKyAgZ3VpbnQ2NCB0Z3Q7CisgIEdBcnJheSAqdGFyZ2V0czsKKyAgR0xpc3QgKmN1ciwgKmludGVybmFsX2N1cjsKKyAgR3N0VGFnTGlzdCAqZXRhZ3M7CisKKyAgdGFyZ2V0cyA9CisgICAgICAoZ3N0X3RvY19lbnRyeV9nZXRfZW50cnlfdHlwZSAoZW50cnkpID09CisgICAgICBHU1RfVE9DX0VOVFJZX1RZUEVfRURJVElPTikgPyBlZGl0aW9uX3RhcmdldHMgOiBjaGFwdGVyX3RhcmdldHM7CisKKyAgZXRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgIGZvciAoaSA9IDA7IGkgPCB0YXJnZXRzLT5sZW47ICsraSkgeworICAgIHRndCA9IGdfYXJyYXlfaW5kZXggKHRhcmdldHMsIGd1aW50NjQsIGkpOworCisgICAgaWYgKHRndCA9PSAwKQorICAgICAgZ3N0X3RhZ19saXN0X2luc2VydCAoZXRhZ3MsIHRhZ3MsIEdTVF9UQUdfTUVSR0VfQVBQRU5EKTsKKyAgICBlbHNlIHsKKyAgICAgIHVpZCA9IGdfc3RyZHVwX3ByaW50ZiAoIiUiIEdfR1VJTlQ2NF9GT1JNQVQsIHRndCk7CisgICAgICBpZiAoZ19zdHJjbXAwIChnc3RfdG9jX2VudHJ5X2dldF91aWQgKGludGVybmFsX2VudHJ5KSwgdWlkKSA9PSAwKQorICAgICAgICBnc3RfdGFnX2xpc3RfaW5zZXJ0IChldGFncywgdGFncywgR1NUX1RBR19NRVJHRV9BUFBFTkQpOworICAgICAgZ19mcmVlICh1aWQpOworICAgIH0KKyAgfQorCisgIGdzdF90b2NfZW50cnlfbWVyZ2VfdGFncyAoZW50cnksIGV0YWdzLCBHU1RfVEFHX01FUkdFX0FQUEVORCk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAoZXRhZ3MpOworCisgIGN1ciA9IGdzdF90b2NfZW50cnlfZ2V0X3N1Yl9lbnRyaWVzIChlbnRyeSk7CisgIGludGVybmFsX2N1ciA9IGdzdF90b2NfZW50cnlfZ2V0X3N1Yl9lbnRyaWVzIChpbnRlcm5hbF9lbnRyeSk7CisgIHdoaWxlIChjdXIgIT0gTlVMTCAmJiBpbnRlcm5hbF9jdXIgIT0gTlVMTCkgeworICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV90b2NfdGFnIChjdXItPmRhdGEsIGludGVybmFsX2N1ci0+ZGF0YSwKKyAgICAgICAgZWRpdGlvbl90YXJnZXRzLCBjaGFwdGVyX3RhcmdldHMsIHRhZ3MpOworICAgIGN1ciA9IGN1ci0+bmV4dDsKKyAgICBpbnRlcm5hbF9jdXIgPSBpbnRlcm5hbF9jdXItPm5leHQ7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9tZXRhZGF0YV90YXJnZXRzIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sLCBHQXJyYXkgKiBlZGl0aW9uX3RhcmdldHMsIEdBcnJheSAqIGNoYXB0ZXJfdGFyZ2V0cywKKyAgICBHQXJyYXkgKiB0cmFja190YXJnZXRzLCBndWludDY0ICogdGFyZ2V0X3R5cGVfdmFsdWUsIGdjaGFyICoqIHRhcmdldF90eXBlKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludDMyIGlkOworICBndWludDY0IHVpZDsKKyAgZ3VpbnQ2NCB0bXA7CisgIGdjaGFyICpzdHI7CisKKyAgREVCVUdfRUxFTUVOVF9TVEFSVCAoY29tbW9uLCBlYm1sLCAiVGFnVGFyZ2V0cyIpOworCisgICp0YXJnZXRfdHlwZV92YWx1ZSA9IDUwOworICAqdGFyZ2V0X3R5cGUgPSBOVUxMOworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJUYWdUYXJnZXRzIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVEFSR0VUQ0hBUFRFUlVJRDoKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJnVpZCkpID09IEdTVF9GTE9XX09LKQorICAgICAgICAgIGdfYXJyYXlfYXBwZW5kX3ZhbCAoY2hhcHRlcl90YXJnZXRzLCB1aWQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVEFSR0VURURJVElPTlVJRDoKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJnVpZCkpID09IEdTVF9GTE9XX09LKQorICAgICAgICAgIGdfYXJyYXlfYXBwZW5kX3ZhbCAoZWRpdGlvbl90YXJnZXRzLCB1aWQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVEFSR0VUVFJBQ0tVSUQ6CisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZ1aWQpKSA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgICBnX2FycmF5X2FwcGVuZF92YWwgKHRyYWNrX3RhcmdldHMsIHVpZCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UQVJHRVRUWVBFVkFMVUU6CisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZ0bXApKSA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgICAqdGFyZ2V0X3R5cGVfdmFsdWUgPSB0bXA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UQVJHRVRUWVBFOgorICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfYXNjaWkgKGVibWwsICZpZCwgJnN0cikpID09IEdTVF9GTE9XX09LKSB7CisgICAgICAgICAgZ19mcmVlICgqdGFyZ2V0X3R5cGUpOworICAgICAgICAgICp0YXJnZXRfdHlwZSA9IHN0cjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0KKyAgICAgICAgICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwIChjb21tb24sIGVibWwsICJUYWdUYXJnZXRzIiwKKyAgICAgICAgICAgIGlkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJUYWdUYXJnZXRzIiwgcmV0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3Bvc3Rwcm9jZXNzX3RvY19lbnRyaWVzIChHTGlzdCAqIHRvY19lbnRyaWVzLAorICAgIGd1aW50NjQgbWF4LCBjb25zdCBnY2hhciAqIHBhcmVudF91aWQpCit7CisgIEdzdFRvY0VudHJ5ICpjdXJfaW5mbywgKnByZXZfaW5mbywgKm5leHRfaW5mbzsKKyAgR0xpc3QgKmN1cl9saXN0LCAqcHJldl9saXN0LCAqbmV4dF9saXN0OworICBnaW50NjQgY3VyX3N0YXJ0LCBwcmV2X3N0YXJ0LCBzdG9wOworCisgIGN1cl9saXN0ID0gdG9jX2VudHJpZXM7CisgIHdoaWxlIChjdXJfbGlzdCAhPSBOVUxMKSB7CisgICAgY3VyX2luZm8gPSBjdXJfbGlzdC0+ZGF0YTsKKworICAgIHN3aXRjaCAoZ3N0X3RvY19lbnRyeV9nZXRfZW50cnlfdHlwZSAoY3VyX2luZm8pKSB7CisgICAgICBjYXNlIEdTVF9UT0NfRU5UUllfVFlQRV9BTkdMRToKKyAgICAgIGNhc2UgR1NUX1RPQ19FTlRSWV9UWVBFX1ZFUlNJT046CisgICAgICBjYXNlIEdTVF9UT0NfRU5UUllfVFlQRV9FRElUSU9OOgorICAgICAgICAvKiBpbiBNYXRyb3NrYSB0ZXJtcyBlZGl0aW9uIGhhcyBkdXJhdGlvbiBvZiBmdWxsIHRyYWNrICovCisgICAgICAgIGdzdF90b2NfZW50cnlfc2V0X3N0YXJ0X3N0b3BfdGltZXMgKGN1cl9pbmZvLCAwLCBtYXgpOworCisgICAgICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wb3N0cHJvY2Vzc190b2NfZW50cmllcworICAgICAgICAgICAgKGdzdF90b2NfZW50cnlfZ2V0X3N1Yl9lbnRyaWVzIChjdXJfaW5mbyksIG1heCwKKyAgICAgICAgICAgIGdzdF90b2NfZW50cnlfZ2V0X3VpZCAoY3VyX2luZm8pKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgR1NUX1RPQ19FTlRSWV9UWVBFX1RJVExFOgorICAgICAgY2FzZSBHU1RfVE9DX0VOVFJZX1RZUEVfVFJBQ0s6CisgICAgICBjYXNlIEdTVF9UT0NfRU5UUllfVFlQRV9DSEFQVEVSOgorICAgICAgICBwcmV2X2xpc3QgPSBjdXJfbGlzdC0+cHJldjsKKyAgICAgICAgbmV4dF9saXN0ID0gY3VyX2xpc3QtPm5leHQ7CisKKyAgICAgICAgaWYgKHByZXZfbGlzdCAhPSBOVUxMKQorICAgICAgICAgIHByZXZfaW5mbyA9IHByZXZfbGlzdC0+ZGF0YTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHByZXZfaW5mbyA9IE5VTEw7CisKKyAgICAgICAgaWYgKG5leHRfbGlzdCAhPSBOVUxMKQorICAgICAgICAgIG5leHRfaW5mbyA9IG5leHRfbGlzdC0+ZGF0YTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG5leHRfaW5mbyA9IE5VTEw7CisKKyAgICAgICAgLyogdXBkYXRlZCBzdG9wIHRpbWUgaW4gcHJldmlvdXMgY2hhcHRlciBhbmQgaXQncyBzdWJjaGFwdGVycyAqLworICAgICAgICBpZiAocHJldl9pbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICBnc3RfdG9jX2VudHJ5X2dldF9zdGFydF9zdG9wX3RpbWVzIChwcmV2X2luZm8sICZwcmV2X3N0YXJ0LCAmc3RvcCk7CisgICAgICAgICAgZ3N0X3RvY19lbnRyeV9nZXRfc3RhcnRfc3RvcF90aW1lcyAoY3VyX2luZm8sICZjdXJfc3RhcnQsICZzdG9wKTsKKworICAgICAgICAgIHN0b3AgPSBjdXJfc3RhcnQ7CisgICAgICAgICAgZ3N0X3RvY19lbnRyeV9zZXRfc3RhcnRfc3RvcF90aW1lcyAocHJldl9pbmZvLCBwcmV2X3N0YXJ0LCBzdG9wKTsKKworICAgICAgICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wb3N0cHJvY2Vzc190b2NfZW50cmllcworICAgICAgICAgICAgICAoZ3N0X3RvY19lbnRyeV9nZXRfc3ViX2VudHJpZXMgKHByZXZfaW5mbyksIGN1cl9zdGFydCwKKyAgICAgICAgICAgICAgZ3N0X3RvY19lbnRyeV9nZXRfdWlkIChwcmV2X2luZm8pKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHVwZGF0ZWQgc3RvcCB0aW1lIGluIGN1cnJlbnQgY2hhcHRlciBhbmQgaXQncyBzdWJjaGFwdGVycyAqLworICAgICAgICBpZiAobmV4dF9pbmZvID09IE5VTEwpIHsKKyAgICAgICAgICBnc3RfdG9jX2VudHJ5X2dldF9zdGFydF9zdG9wX3RpbWVzIChjdXJfaW5mbywgJmN1cl9zdGFydCwgJnN0b3ApOworCisgICAgICAgICAgaWYgKHN0b3AgPT0gLTEpIHsKKyAgICAgICAgICAgIHN0b3AgPSBtYXg7CisgICAgICAgICAgICBnc3RfdG9jX2VudHJ5X3NldF9zdGFydF9zdG9wX3RpbWVzIChjdXJfaW5mbywgY3VyX3N0YXJ0LCBzdG9wKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcG9zdHByb2Nlc3NfdG9jX2VudHJpZXMKKyAgICAgICAgICAgICAgKGdzdF90b2NfZW50cnlfZ2V0X3N1Yl9lbnRyaWVzIChjdXJfaW5mbyksIHN0b3AsCisgICAgICAgICAgICAgIGdzdF90b2NfZW50cnlfZ2V0X3VpZCAoY3VyX2luZm8pKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1RPQ19FTlRSWV9UWVBFX0lOVkFMSUQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjdXJfbGlzdCA9IGN1cl9saXN0LT5uZXh0OworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfY2hhcHRlcl90aXRsZXMgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbiwKKyAgICBHc3RFYm1sUmVhZCAqIGVibWwsIEdzdFRhZ0xpc3QgKiB0aXRsZXMpCit7CisgIGd1aW50MzIgaWQ7CisgIGdjaGFyICp0aXRsZSA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgREVCVUdfRUxFTUVOVF9TVEFSVCAoY29tbW9uLCBlYm1sLCAiQ2hhcHRlcnNUaXRsZXMiKTsKKworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJDaGFwdGVyc1RpdGxlcyIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NIQVBTVFJJTkc6CisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfdXRmOCAoZWJtbCwgJmlkLCAmdGl0bGUpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0KKyAgICAgICAgICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwIChjb21tb24sIGVibWwsICJDaGFwdGVyc1RpdGxlcyIsCisgICAgICAgICAgICBpZCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiQ2hhcHRlcnNUaXRsZXMiLCByZXQpOworCisgIGlmICh0aXRsZSAhPSBOVUxMICYmIHJldCA9PSBHU1RfRkxPV19PSykKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0aXRsZXMsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELCBHU1RfVEFHX1RJVExFLCB0aXRsZSwgTlVMTCk7CisKKyAgZ19mcmVlICh0aXRsZSk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfY2hhcHRlcl9lbGVtZW50IChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sLCBHTGlzdCAqKiBzdWJlbnRyaWVzLCBHTGlzdCAqKiBpbnRlcm5hbF9zdWJlbnRyaWVzKQoreworICBndWludDMyIGlkOworICBndWludDY0IHN0YXJ0X3RpbWUgPSAtMSwgc3RvcF90aW1lID0gLTE7CisgIGd1aW50NjQgaXNfaGlkZGVuID0gMCwgaXNfZW5hYmxlZCA9IDEsIHVpZCA9IDA7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdFRvY0VudHJ5ICpjaGFwdGVyX2luZm8sICppbnRlcm5hbF9jaGFwdGVyX2luZm87CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisgIGdjaGFyICp1aWRfc3RyLCAqc3RyaW5nX3VpZCA9IE5VTEw7CisgIEdMaXN0ICpzdWJzdWJlbnRyaWVzID0gTlVMTCwgKmludGVybmFsX3N1YnN1YmVudHJpZXMgPSBOVUxMLCAqbCwgKmlsOworCisgIERFQlVHX0VMRU1FTlRfU1RBUlQgKGNvbW1vbiwgZWJtbCwgIkNoYXB0ZXJzRWxlbWVudCIpOworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJDaGFwdGVyc0VsZW1lbnQiLCByZXQpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICB0YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKworICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmIGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3BlZWtfaWQgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSVUlEOgorICAgICAgICByZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJnVpZCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSU1RSSU5HVUlEOgorICAgICAgICByZXQgPSBnc3RfZWJtbF9yZWFkX3V0ZjggKGVibWwsICZpZCwgJnN0cmluZ191aWQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUlRJTUVTVEFSVDoKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZzdGFydF90aW1lKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJUSU1FU1RPUDoKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZzdG9wX3RpbWUpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUkFUT006CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9jaGFwdGVyX2VsZW1lbnQgKGNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICZzdWJzdWJlbnRyaWVzLCAmaW50ZXJuYWxfc3Vic3ViZW50cmllcyk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSRElTUExBWToKKyAgICAgICAgcmV0ID0KKyAgICAgICAgICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9jaGFwdGVyX3RpdGxlcyAoY29tbW9uLCBlYm1sLCB0YWdzKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NIQVBURVJGTEFHSElEREVOOgorICAgICAgICByZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJmlzX2hpZGRlbik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DSEFQVEVSRkxBR0VOQUJMRUQ6CisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmaXNfZW5hYmxlZCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPQorICAgICAgICAgICAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX3NraXAgKGNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICJDaGFwdGVyc0VsZW1lbnQiLCBpZCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmICh1aWQgPT0gMCkKKyAgICB1aWQgPSAoKChndWludDY0KSBnX3JhbmRvbV9pbnQgKCkpIDw8IDMyKSB8IGdfcmFuZG9tX2ludCAoKTsKKyAgdWlkX3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIiUiIEdfR1VJTlQ2NF9GT1JNQVQsIHVpZCk7CisgIGlmIChzdHJpbmdfdWlkICE9IE5VTEwpIHsKKyAgICAvKiBpbml0IHRvYyB3aXRoIHByb3ZpZGVkIFN0cmluZyBVSUQgKi8KKyAgICBjaGFwdGVyX2luZm8gPSBnc3RfdG9jX2VudHJ5X25ldyAoR1NUX1RPQ19FTlRSWV9UWVBFX0NIQVBURVIsIHN0cmluZ191aWQpOworICAgIGdfZnJlZSAoc3RyaW5nX3VpZCk7CisgIH0gZWxzZSB7CisgICAgLyogTm8gU3RyaW5nIFVJRCBwcm92aWRlZCA9PiB1c2UgdGhlIGludGVybmFsIFVJRCBpbnN0ZWFkICovCisgICAgY2hhcHRlcl9pbmZvID0gZ3N0X3RvY19lbnRyeV9uZXcgKEdTVF9UT0NfRU5UUllfVFlQRV9DSEFQVEVSLCB1aWRfc3RyKTsKKyAgfQorICAvKiBpbml0IGludGVybmFsIHRvYyB3aXRoIGludGVybmFsIFVJRCAqLworICBpbnRlcm5hbF9jaGFwdGVyX2luZm8gPSBnc3RfdG9jX2VudHJ5X25ldyAoR1NUX1RPQ19FTlRSWV9UWVBFX0NIQVBURVIsCisgICAgICB1aWRfc3RyKTsKKyAgZ19mcmVlICh1aWRfc3RyKTsKKworICBnc3RfdG9jX2VudHJ5X3NldF90YWdzIChjaGFwdGVyX2luZm8sIHRhZ3MpOworICBnc3RfdG9jX2VudHJ5X3NldF9zdGFydF9zdG9wX3RpbWVzIChjaGFwdGVyX2luZm8sIHN0YXJ0X3RpbWUsIHN0b3BfdGltZSk7CisKKyAgZm9yIChsID0gc3Vic3ViZW50cmllcywgaWwgPSBpbnRlcm5hbF9zdWJzdWJlbnRyaWVzOworICAgICAgbCAmJiBpbDsgbCA9IGwtPm5leHQsIGlsID0gaWwtPm5leHQpIHsKKyAgICBnc3RfdG9jX2VudHJ5X2FwcGVuZF9zdWJfZW50cnkgKGNoYXB0ZXJfaW5mbywgbC0+ZGF0YSk7CisgICAgZ3N0X3RvY19lbnRyeV9hcHBlbmRfc3ViX2VudHJ5IChpbnRlcm5hbF9jaGFwdGVyX2luZm8sIGlsLT5kYXRhKTsKKyAgfQorICBnX2xpc3RfZnJlZSAoc3Vic3ViZW50cmllcyk7CisgIGdfbGlzdF9mcmVlIChpbnRlcm5hbF9zdWJzdWJlbnRyaWVzKTsKKworICBERUJVR19FTEVNRU5UX1NUT1AgKGNvbW1vbiwgZWJtbCwgIkNoYXB0ZXJzRWxlbWVudCIsIHJldCk7CisKKyAgLyogc3RhcnQgdGltZSBpcyBtYW5kYXRvcnkgYW5kIGhhcyBubyBkZWZhdWx0IHZhbHVlLAorICAgKiBzbyB3ZSBzaG91bGQgc2tpcCBjaGFwdGVycyB3aXRob3V0IGl0ICovCisgIGlmIChpc19oaWRkZW4gPT0gMCAmJiBpc19lbmFibGVkID4gMCAmJgorICAgICAgc3RhcnRfdGltZSAhPSAtMSAmJiByZXQgPT0gR1NUX0ZMT1dfT0spIHsKKyAgICAqc3ViZW50cmllcyA9IGdfbGlzdF9hcHBlbmQgKCpzdWJlbnRyaWVzLCBjaGFwdGVyX2luZm8pOworICAgICppbnRlcm5hbF9zdWJlbnRyaWVzID0gZ19saXN0X2FwcGVuZCAoKmludGVybmFsX3N1YmVudHJpZXMsCisgICAgICAgIGludGVybmFsX2NoYXB0ZXJfaW5mbyk7CisgIH0gZWxzZSB7CisgICAgZ3N0X3RvY19lbnRyeV91bnJlZiAoY2hhcHRlcl9pbmZvKTsKKyAgICBnc3RfdG9jX2VudHJ5X3VucmVmIChpbnRlcm5hbF9jaGFwdGVyX2luZm8pOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9jaGFwdGVyX2VkaXRpb24gKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbiwKKyAgICBHc3RFYm1sUmVhZCAqIGVibWwsIEdzdFRvYyAqIHRvYywgR3N0VG9jICogaW50ZXJuYWxfdG9jKQoreworICBndWludDMyIGlkOworICBndWludDY0IGlzX2hpZGRlbiA9IDAsIHVpZCA9IDA7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdFRvY0VudHJ5ICplZGl0aW9uX2luZm8sICppbnRlcm5hbF9lZGl0aW9uX2luZm87CisgIEdMaXN0ICpzdWJlbnRyaWVzID0gTlVMTCwgKmludGVybmFsX3N1YmVudHJpZXMgPSBOVUxMLCAqbCwgKmlsOworICBnY2hhciAqdWlkX3N0cjsKKworICBERUJVR19FTEVNRU5UX1NUQVJUIChjb21tb24sIGVibWwsICJDaGFwdGVyc0VkaXRpb24iKTsKKworICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfbWFzdGVyIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykgeworICAgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiQ2hhcHRlcnNFZGl0aW9uIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfRURJVElPTlVJRDoKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZ1aWQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUkFUT006CisgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9jaGFwdGVyX2VsZW1lbnQgKGNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICZzdWJlbnRyaWVzLCAmaW50ZXJuYWxfc3ViZW50cmllcyk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9FRElUSU9ORkxBR0hJRERFTjoKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZpc19oaWRkZW4pOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0KKyAgICAgICAgICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwIChjb21tb24sIGVibWwsCisgICAgICAgICAgICAiQ2hhcHRlcnNFZGl0aW9uIiwgaWQpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBERUJVR19FTEVNRU5UX1NUT1AgKGNvbW1vbiwgZWJtbCwgIkNoYXB0ZXJzRWRpdGlvbiIsIHJldCk7CisKKyAgaWYgKHVpZCA9PSAwKQorICAgIHVpZCA9ICgoKGd1aW50NjQpIGdfcmFuZG9tX2ludCAoKSkgPDwgMzIpIHwgZ19yYW5kb21faW50ICgpOworICB1aWRfc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiJSIgR19HVUlOVDY0X0ZPUk1BVCwgdWlkKTsKKyAgZWRpdGlvbl9pbmZvID0gZ3N0X3RvY19lbnRyeV9uZXcgKEdTVF9UT0NfRU5UUllfVFlQRV9FRElUSU9OLCB1aWRfc3RyKTsKKyAgZ3N0X3RvY19lbnRyeV9zZXRfc3RhcnRfc3RvcF90aW1lcyAoZWRpdGlvbl9pbmZvLCAtMSwgLTEpOworICBpbnRlcm5hbF9lZGl0aW9uX2luZm8gPSBnc3RfdG9jX2VudHJ5X25ldyAoR1NUX1RPQ19FTlRSWV9UWVBFX0VESVRJT04sCisgICAgICB1aWRfc3RyKTsKKyAgZ19mcmVlICh1aWRfc3RyKTsKKworICBmb3IgKGwgPSBzdWJlbnRyaWVzLCBpbCA9IGludGVybmFsX3N1YmVudHJpZXM7IGwgJiYgaWw7CisgICAgICBsID0gbC0+bmV4dCwgaWwgPSBpbC0+bmV4dCkgeworICAgIGdzdF90b2NfZW50cnlfYXBwZW5kX3N1Yl9lbnRyeSAoZWRpdGlvbl9pbmZvLCBsLT5kYXRhKTsKKyAgICBnc3RfdG9jX2VudHJ5X2FwcGVuZF9zdWJfZW50cnkgKGludGVybmFsX2VkaXRpb25faW5mbywgaWwtPmRhdGEpOworICB9CisgIGdfbGlzdF9mcmVlIChzdWJlbnRyaWVzKTsKKyAgZ19saXN0X2ZyZWUgKGludGVybmFsX3N1YmVudHJpZXMpOworCisgIGlmIChpc19oaWRkZW4gPT0gMCAmJiBzdWJlbnRyaWVzICE9IE5VTEwgJiYgcmV0ID09IEdTVF9GTE9XX09LKSB7CisgICAgZ3N0X3RvY19hcHBlbmRfZW50cnkgKHRvYywgZWRpdGlvbl9pbmZvKTsKKyAgICBnc3RfdG9jX2FwcGVuZF9lbnRyeSAoaW50ZXJuYWxfdG9jLCBpbnRlcm5hbF9lZGl0aW9uX2luZm8pOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgIlNraXBwaW5nIGVtcHR5IG9yIGhpZGRlbiBlZGl0aW9uIGluIHRoZSBjaGFwdGVycyBUT0MiKTsKKyAgICBnc3RfdG9jX2VudHJ5X3VucmVmIChlZGl0aW9uX2luZm8pOworICAgIGdzdF90b2NfZW50cnlfdW5yZWYgKGludGVybmFsX2VkaXRpb25faW5mbyk7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfY2hhcHRlcnMgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbiwKKyAgICBHc3RFYm1sUmVhZCAqIGVibWwpCit7CisgIGd1aW50MzIgaWQ7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdFRvYyAqdG9jLCAqaW50ZXJuYWxfdG9jOworCisgIERFQlVHX0VMRU1FTlRfU1RBUlQgKGNvbW1vbiwgZWJtbCwgIkNoYXB0ZXJzIik7CisKKyAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBERUJVR19FTEVNRU5UX1NUT1AgKGNvbW1vbiwgZWJtbCwgIkNoYXB0ZXJzIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgLyogRklYTUU6IGNyZWF0ZSBDVVJSRU5UIHRvYyBhcyB3ZWxsICovCisgIHRvYyA9IGdzdF90b2NfbmV3IChHU1RfVE9DX1NDT1BFX0dMT0JBTCk7CisgIGludGVybmFsX3RvYyA9IGdzdF90b2NfbmV3IChHU1RfVE9DX1NDT1BFX0dMT0JBTCk7CisKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfRURJVElPTkVOVFJZOgorICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfY2hhcHRlcl9lZGl0aW9uIChjb21tb24sIGVibWwsCisgICAgICAgICAgICB0b2MsIGludGVybmFsX3RvYyk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPQorICAgICAgICAgICAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX3NraXAgKGNvbW1vbiwgZWJtbCwgIkNoYXB0ZXJzIiwgaWQpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoZ3N0X3RvY19nZXRfZW50cmllcyAodG9jKSAhPSBOVUxMKSB7CisgICAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3Bvc3Rwcm9jZXNzX3RvY19lbnRyaWVzIChnc3RfdG9jX2dldF9lbnRyaWVzICh0b2MpLAorICAgICAgICBjb21tb24tPnNlZ21lbnQuZHVyYXRpb24sICIiKTsKKyAgICAvKiBubyBuZWVkIHRvIHBvc3Rwcm9jZXNzIGludGVybmFsX3RvYyBhcyB3ZSBkb24ndCBuZWVkIHRvIGtlZXAgdHJhY2sKKyAgICAgKiBvZiBzdGFydCAvIGVuZCBhbmQgdGFncyAob25seSBVSURzKSAqLworCisgICAgY29tbW9uLT50b2MgPSB0b2M7CisgICAgY29tbW9uLT5pbnRlcm5hbF90b2MgPSBpbnRlcm5hbF90b2M7CisgIH0gZWxzZSB7CisgICAgZ3N0X3RvY191bnJlZiAodG9jKTsKKyAgICBnc3RfdG9jX3VucmVmIChpbnRlcm5hbF90b2MpOworICB9CisKKyAgY29tbW9uLT5jaGFwdGVyc19wYXJzZWQgPSBUUlVFOworCisgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiQ2hhcHRlcnMiLCByZXQpOworICByZXR1cm4gcmV0OworfQorCitHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfaGVhZGVyIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sKQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ2NoYXIgKmRvY3R5cGU7CisgIGd1aW50IHZlcnNpb247CisgIGd1aW50MzIgaWQ7CisKKyAgLyogdGhpcyBmdW5jdGlvbiBpcyB0aGUgZmlyc3QgdG8gYmUgY2FsbGVkICovCisKKyAgLyogZGVmYXVsdCBpbml0ICovCisgIGRvY3R5cGUgPSBOVUxMOworICB2ZXJzaW9uID0gMTsKKworICByZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIHJldHVybiByZXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiaWQ6ICUwOHgiLCBpZCk7CisKKyAgaWYgKGlkICE9IEdTVF9FQk1MX0lEX0hFQURFUikgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIkZhaWxlZCB0byByZWFkIGhlYWRlciIpOworICAgIGdvdG8gZXhpdDsKKyAgfQorCisgIHJldCA9IGdzdF9lYm1sX3JlYWRfbWFzdGVyIChlYm1sLCAmaWQpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIHJldHVybiByZXQ7CisKKyAgd2hpbGUgKGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICByZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIGV4aXRfZXJyb3I7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgIC8qIGlzIG91ciByZWFkIHZlcnNpb24gdXB0b2RhdGU/ICovCisgICAgICBjYXNlIEdTVF9FQk1MX0lEX0VCTUxSRUFEVkVSU0lPTjp7CisgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKTsKKyAgICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBnb3RvIGV4aXRfZXJyb3I7CisgICAgICAgIGlmIChudW0gIT0gR1NUX0VCTUxfVkVSU0lPTikgeworICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIEVCTUwgdmVyc2lvbiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICAgIGdvdG8gZXhpdF9lcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAgICJFYm1sUmVhZFZlcnNpb246ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAgIC8qIHdlIG9ubHkgaGFuZGxlIDggYnl0ZSBsZW5ndGhzIGF0IG1heCAqLworICAgICAgY2FzZSBHU1RfRUJNTF9JRF9FQk1MTUFYU0laRUxFTkdUSDp7CisgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKTsKKyAgICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBnb3RvIGV4aXRfZXJyb3I7CisgICAgICAgIGlmIChudW0gPiBzaXplb2YgKGd1aW50NjQpKSB7CisgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgRUJNTCBtYXhpbXVtIHNpemUgJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgIkVibWxNYXhTaXplTGVuZ3RoOiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiB3ZSBoYW5kbGUgNCBieXRlIElEcyBhdCBtYXggKi8KKyAgICAgIGNhc2UgR1NUX0VCTUxfSURfRUJNTE1BWElETEVOR1RIOnsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pOworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGdvdG8gZXhpdF9lcnJvcjsKKyAgICAgICAgaWYgKG51bSA+IHNpemVvZiAoZ3VpbnQzMikpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBFQk1MIG1heGltdW0gSUQgJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgIkVibWxNYXhJZExlbmd0aDogJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX0VCTUxfSURfRE9DVFlQRTp7CisgICAgICAgIGdjaGFyICp0ZXh0OworCisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfYXNjaWkgKGVibWwsICZpZCwgJnRleHQpOworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGdvdG8gZXhpdF9lcnJvcjsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJFYm1sRG9jVHlwZTogJXMiLAorICAgICAgICAgICAgR1NUX1NUUl9OVUxMICh0ZXh0KSk7CisKKyAgICAgICAgZ19mcmVlIChkb2N0eXBlKTsKKyAgICAgICAgZG9jdHlwZSA9IHRleHQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9FQk1MX0lEX0RPQ1RZUEVSRUFEVkVSU0lPTjp7CisgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKTsKKyAgICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBnb3RvIGV4aXRfZXJyb3I7CisgICAgICAgIHZlcnNpb24gPSBudW07CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAgICJFYm1sUmVhZFZlcnNpb246ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2Vfc2tpcCAoY29tbW9uLCBlYm1sLAorICAgICAgICAgICAgIkVCTUwgaGVhZGVyIiwgaWQpOworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGdvdG8gZXhpdF9lcnJvcjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogd2UgaWdub3JlIHRoZXNlIHR3bywgYXMgdGhleSBkb24ndCB0ZWxsIHVzIGFueXRoaW5nIHdlIGNhcmUgYWJvdXQgKi8KKyAgICAgIGNhc2UgR1NUX0VCTUxfSURfRUJNTFZFUlNJT046CisgICAgICBjYXNlIEdTVF9FQk1MX0lEX0RPQ1RZUEVWRVJTSU9OOgorICAgICAgICByZXQgPSBnc3RfZWJtbF9yZWFkX3NraXAgKGVibWwpOworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGdvdG8gZXhpdF9lcnJvcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKK2V4aXQ6CisKKyAgaWYgKChkb2N0eXBlICE9IE5VTEwgJiYgIXN0cmNtcCAoZG9jdHlwZSwgR1NUX01BVFJPU0tBX0RPQ1RZUEVfTUFUUk9TS0EpKSB8fAorICAgICAgKGRvY3R5cGUgIT0gTlVMTCAmJiAhc3RyY21wIChkb2N0eXBlLCBHU1RfTUFUUk9TS0FfRE9DVFlQRV9XRUJNKSkgfHwKKyAgICAgIChkb2N0eXBlID09IE5VTEwpKSB7CisgICAgaWYgKHZlcnNpb24gPD0gMikgeworICAgICAgaWYgKGRvY3R5cGUpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJJbnB1dCBpcyAlcyB2ZXJzaW9uICVkIiwgZG9jdHlwZSwKKyAgICAgICAgICAgIHZlcnNpb24pOworICAgICAgICBpZiAoIXN0cmNtcCAoZG9jdHlwZSwgR1NUX01BVFJPU0tBX0RPQ1RZUEVfV0VCTSkpCisgICAgICAgICAgY29tbW9uLT5pc193ZWJtID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgIklucHV0IGlzIEVCTUwgd2l0aG91dCBkb2N0eXBlLCBhc3N1bWluZyAiICJtYXRyb3NrYSAodmVyc2lvbiAlZCkiLAorICAgICAgICAgICAgdmVyc2lvbik7CisgICAgICB9CisgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGNvbW1vbiwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAgICgiRGVtdXhlciB2ZXJzaW9uICgyKSBpcyB0b28gb2xkIHRvIHJlYWQgJXMgdmVyc2lvbiAlZCIsCisgICAgICAgICAgICAgIEdTVF9TVFJfTlVMTCAoZG9jdHlwZSksIHZlcnNpb24pKTsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoY29tbW9uLCBTVFJFQU0sIFdST05HX1RZUEUsIChOVUxMKSwKKyAgICAgICAgKCJJbnB1dCBpcyBub3QgYSBtYXRyb3NrYSBzdHJlYW0gKGRvY3R5cGU9JXMpIiwgZG9jdHlwZSkpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICB9CisKK2V4aXRfZXJyb3I6CisKKyAgZ19mcmVlIChkb2N0eXBlKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX2luZGV4X2N1ZXRyYWNrIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sLCBndWludCAqIG5lbnRyaWVzKQoreworICBndWludDMyIGlkOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0TWF0cm9za2FJbmRleCBpZHg7CisKKyAgaWR4LnBvcyA9IChndWludDY0KSAtIDE7CisgIGlkeC50cmFjayA9IDA7CisgIGlkeC50aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgaWR4LmJsb2NrID0gMTsKKworICBERUJVR19FTEVNRU5UX1NUQVJUIChjb21tb24sIGVibWwsICJDdWVUcmFja1Bvc2l0aW9ucyIpOworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJDdWVUcmFja1Bvc2l0aW9ucyIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgLyogdHJhY2sgbnVtYmVyICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DVUVUUkFDSzoKKyAgICAgIHsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChudW0gPT0gMCkgeworICAgICAgICAgIGlkeC50cmFjayA9IDA7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJJbnZhbGlkIEN1ZVRyYWNrIDAiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIkN1ZVRyYWNrOiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICBpZHgudHJhY2sgPSBudW07CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAgIC8qIHBvc2l0aW9uIGluIGZpbGUgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NVRUNMVVNURVJQT1NJVElPTjoKKyAgICAgIHsKKyAgICAgICAgZ3VpbnQ2NCBudW07CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3VpbnQgKGVibWwsICZpZCwgJm51bSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChudW0gPiBHX01BWElOVDY0KSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICAgICAgICJDdWVDbHVzdGVyUG9zaXRpb24gJSIgR19HVUlOVDY0X0ZPUk1BVCAiIHRvbyBsYXJnZSIsIG51bSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZHgucG9zID0gbnVtOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgICAvKiBudW1iZXIgb2YgYmxvY2sgaW4gdGhlIGNsdXN0ZXIgKi8KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NVRUJMT0NLTlVNQkVSOgorICAgICAgeworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSA9PSAwKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJJbnZhbGlkIEN1ZUJsb2NrTnVtYmVyIDAiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIkN1ZUJsb2NrTnVtYmVyOiAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICAgICAgbnVtKTsKKyAgICAgICAgaWR4LmJsb2NrID0gbnVtOworCisgICAgICAgIC8qIG1pbGQgc2FuaXR5IGNoZWNrLCBkaXNyZWdhcmQgc3RyYW5nZSBjYXNlcyAuLi4gKi8KKyAgICAgICAgaWYgKGlkeC5ibG9jayA+IEdfTUFYVUlOVDE2KSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiLi4uIGxvb2tzIHN1c3BpY2lvdXMsIGlnbm9yaW5nIik7CisgICAgICAgICAgaWR4LmJsb2NrID0gMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX3NraXAgKGNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICJDdWVUcmFja1Bvc2l0aW9ucyIsIGlkKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NVRUNPREVDU1RBVEU6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DVUVSRUZFUkVOQ0U6CisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfc2tpcCAoZWJtbCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiQ3VlVHJhY2tQb3NpdGlvbnMiLCByZXQpOworCisgIC8qIChlLmcuKSBsYXZmIHR5cGljYWxseSBjcmVhdGVzIGVudHJpZXMgd2l0aG91dCBhIGJsb2NrIG51bWJlciwKKyAgICogd2hpY2ggaXMgYm9ndXMgYW5kIGxlYWRzIHRvIGNvbnRyYWRpY3RvcnkgaW5mb3JtYXRpb24gKi8KKyAgaWYgKGNvbW1vbi0+aW5kZXgtPmxlbikgeworICAgIEdzdE1hdHJvc2thSW5kZXggKmxhc3RfaWR4OworCisgICAgbGFzdF9pZHggPSAmZ19hcnJheV9pbmRleCAoY29tbW9uLT5pbmRleCwgR3N0TWF0cm9za2FJbmRleCwKKyAgICAgICAgY29tbW9uLT5pbmRleC0+bGVuIC0gMSk7CisgICAgaWYgKGxhc3RfaWR4LT5ibG9jayA9PSBpZHguYmxvY2sgJiYgbGFzdF9pZHgtPnBvcyA9PSBpZHgucG9zICYmCisgICAgICAgIGxhc3RfaWR4LT50cmFjayA9PSBpZHgudHJhY2sgJiYgaWR4LnRpbWUgPiBsYXN0X2lkeC0+dGltZSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiQ3VlIGVudHJ5IHJlZmVycyB0byBzYW1lIGxvY2F0aW9uLCAiCisgICAgICAgICAgImJ1dCBoYXMgZGlmZmVyZW50IHRpbWUgdGhhbiBwcmV2aW91cyBlbnRyeTsgZGlzY2FyZGluZyIpOworICAgICAgaWR4LnRyYWNrID0gMDsKKyAgICB9CisgIH0KKworICBpZiAoKHJldCA9PSBHU1RfRkxPV19PSyB8fCByZXQgPT0gR1NUX0ZMT1dfRU9TKQorICAgICAgJiYgaWR4LnBvcyAhPSAoZ3VpbnQ2NCkgLSAxICYmIGlkeC50cmFjayA+IDApIHsKKyAgICBnX2FycmF5X2FwcGVuZF92YWwgKGNvbW1vbi0+aW5kZXgsIGlkeCk7CisgICAgKCpuZW50cmllcykrKzsKKyAgfSBlbHNlIGlmIChyZXQgPT0gR1NUX0ZMT1dfT0sgfHwgcmV0ID09IEdTVF9GTE9XX0VPUykgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgIkN1ZVRyYWNrUG9zaXRpb25zIHdpdGhvdXQgdmFsaWQgY29udGVudCIpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9pbmRleF9wb2ludGVudHJ5IChHc3RNYXRyb3NrYVJlYWRDb21tb24gKgorICAgIGNvbW1vbiwgR3N0RWJtbFJlYWQgKiBlYm1sKQoreworICBndWludDMyIGlkOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0Q2xvY2tUaW1lIHRpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBndWludCBuZW50cmllcyA9IDA7CisKKyAgREVCVUdfRUxFTUVOVF9TVEFSVCAoY29tbW9uLCBlYm1sLCAiQ3VlUG9pbnQiKTsKKworICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfbWFzdGVyIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykgeworICAgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiQ3VlUG9pbnQiLCByZXQpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmIGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3BlZWtfaWQgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgIC8qIG9uZSBzaW5nbGUgaW5kZXggZW50cnkgKCdwb2ludCcpICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DVUVUSU1FOgorICAgICAgeworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmdGltZSkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIkN1ZVRpbWU6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHRpbWUpOworICAgICAgICB0aW1lID0gdGltZSAqIGNvbW1vbi0+dGltZV9zY2FsZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICAgLyogcG9zaXRpb24gaW4gdGhlIGZpbGUgKyB0cmFjayB0byB3aGljaCBpdCBiZWxvbmdzICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DVUVUUkFDS1BPU0lUSU9OUzoKKyAgICAgIHsKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX2luZGV4X2N1ZXRyYWNrIChjb21tb24sIGVibWwsCisgICAgICAgICAgICAmbmVudHJpZXMpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX3NraXAgKGNvbW1vbiwgZWJtbCwgIkN1ZVBvaW50IiwKKyAgICAgICAgICAgIGlkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJDdWVQb2ludCIsIHJldCk7CisKKyAgaWYgKG5lbnRyaWVzID4gMCkgeworICAgIGlmICh0aW1lID09IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiQ3VlUG9pbnQgd2l0aG91dCB2YWxpZCB0aW1lIik7CisgICAgICBnX2FycmF5X3JlbW92ZV9yYW5nZSAoY29tbW9uLT5pbmRleCwgY29tbW9uLT5pbmRleC0+bGVuIC0gbmVudHJpZXMsCisgICAgICAgICAgbmVudHJpZXMpOworICAgIH0gZWxzZSB7CisgICAgICBnaW50IGk7CisKKyAgICAgIGZvciAoaSA9IGNvbW1vbi0+aW5kZXgtPmxlbiAtIG5lbnRyaWVzOyBpIDwgY29tbW9uLT5pbmRleC0+bGVuOyBpKyspIHsKKyAgICAgICAgR3N0TWF0cm9za2FJbmRleCAqaWR4ID0KKyAgICAgICAgICAgICZnX2FycmF5X2luZGV4IChjb21tb24tPmluZGV4LCBHc3RNYXRyb3NrYUluZGV4LCBpKTsKKworICAgICAgICBpZHgtPnRpbWUgPSB0aW1lOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJJbmRleCBlbnRyeTogcG9zPSUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAgICIsIHRpbWU9JSIgR1NUX1RJTUVfRk9STUFUICIsIHRyYWNrPSV1LCBibG9jaz0ldSIsIGlkeC0+cG9zLAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoaWR4LT50aW1lKSwgKGd1aW50KSBpZHgtPnRyYWNrLCAoZ3VpbnQpIGlkeC0+YmxvY2spOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJFbXB0eSBDdWVQb2ludCIpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworZ2ludAorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3N0cmVhbV9mcm9tX251bSAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLAorICAgIGd1aW50IHRyYWNrX251bSkKK3sKKyAgZ3VpbnQgbjsKKworICBnX2Fzc2VydCAoY29tbW9uLT5zcmMtPmxlbiA9PSBjb21tb24tPm51bV9zdHJlYW1zKTsKKyAgZm9yIChuID0gMDsgbiA8IGNvbW1vbi0+c3JjLT5sZW47IG4rKykgeworICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0ID0gZ19wdHJfYXJyYXlfaW5kZXggKGNvbW1vbi0+c3JjLCBuKTsKKworICAgIGlmIChjb250ZXh0LT5udW0gPT0gdHJhY2tfbnVtKSB7CisgICAgICByZXR1cm4gbjsKKyAgICB9CisgIH0KKworICBpZiAobiA9PSBjb21tb24tPm51bV9zdHJlYW1zKQorICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAiRmFpbGVkIHRvIGZpbmQgY29ycmVzcG9uZGluZyBwYWQgZm9yIHRyYWNrbnVtICVkIiwgdHJhY2tfbnVtKTsKKworICByZXR1cm4gLTE7Cit9CisKK0dzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9pbmRleCAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLAorICAgIEdzdEVibWxSZWFkICogZWJtbCkKK3sKKyAgZ3VpbnQzMiBpZDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ3VpbnQgaTsKKworICBpZiAoY29tbW9uLT5pbmRleCkKKyAgICBnX2FycmF5X2ZyZWUgKGNvbW1vbi0+aW5kZXgsIFRSVUUpOworICBjb21tb24tPmluZGV4ID0KKyAgICAgIGdfYXJyYXlfc2l6ZWRfbmV3IChGQUxTRSwgRkFMU0UsIHNpemVvZiAoR3N0TWF0cm9za2FJbmRleCksIDEyOCk7CisKKyAgREVCVUdfRUxFTUVOVF9TVEFSVCAoY29tbW9uLCBlYm1sLCAiQ3VlcyIpOworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJDdWVzIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgICAvKiBvbmUgc2luZ2xlIGluZGV4IGVudHJ5ICgncG9pbnQnKSAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfUE9JTlRFTlRSWToKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX2luZGV4X3BvaW50ZW50cnkgKGNvbW1vbiwgZWJtbCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2Vfc2tpcCAoY29tbW9uLCBlYm1sLCAiQ3VlcyIsIGlkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiQ3VlcyIsIHJldCk7CisKKyAgLyogU29ydCBpbmRleCBieSB0aW1lLCBzbWFsbGVzdCB0aW1lIGZpcnN0LCBmb3IgZWFzaWVyIHNlYXJjaGluZyAqLworICBnX2FycmF5X3NvcnQgKGNvbW1vbi0+aW5kZXgsIChHQ29tcGFyZUZ1bmMpIGdzdF9tYXRyb3NrYV9pbmRleF9jb21wYXJlKTsKKworICAvKiBOb3cgc29ydCB0aGUgdHJhY2sgc3BlY2lmaWMgaW5kZXggZW50cmllcyBpbnRvIHRoZWlyIG93biBhcnJheXMgKi8KKyAgZm9yIChpID0gMDsgaSA8IGNvbW1vbi0+aW5kZXgtPmxlbjsgaSsrKSB7CisgICAgR3N0TWF0cm9za2FJbmRleCAqaWR4ID0gJmdfYXJyYXlfaW5kZXggKGNvbW1vbi0+aW5kZXgsIEdzdE1hdHJvc2thSW5kZXgsCisgICAgICAgIGkpOworICAgIGdpbnQgdHJhY2tfbnVtOworICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjdHg7CisKKyNpZiAwCisgICAgaWYgKGNvbW1vbi0+ZWxlbWVudF9pbmRleCkgeworICAgICAgZ2ludCB3cml0ZXJfaWQ7CisKKyAgICAgIGlmIChpZHgtPnRyYWNrICE9IDAgJiYKKyAgICAgICAgICAodHJhY2tfbnVtID0KKyAgICAgICAgICAgICAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3N0cmVhbV9mcm9tX251bSAoY29tbW9uLAorICAgICAgICAgICAgICAgICAgaWR4LT50cmFjaykpICE9IC0xKSB7CisgICAgICAgIGN0eCA9IGdfcHRyX2FycmF5X2luZGV4IChjb21tb24tPnNyYywgdHJhY2tfbnVtKTsKKworICAgICAgICBpZiAoY3R4LT5pbmRleF93cml0ZXJfaWQgPT0gLTEpCisgICAgICAgICAgZ3N0X2luZGV4X2dldF93cml0ZXJfaWQgKGNvbW1vbi0+ZWxlbWVudF9pbmRleCwKKyAgICAgICAgICAgICAgR1NUX09CSkVDVCAoY3R4LT5wYWQpLCAmY3R4LT5pbmRleF93cml0ZXJfaWQpOworICAgICAgICB3cml0ZXJfaWQgPSBjdHgtPmluZGV4X3dyaXRlcl9pZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjb21tb24tPmVsZW1lbnRfaW5kZXhfd3JpdGVyX2lkID09IC0xKQorICAgICAgICAgIGdzdF9pbmRleF9nZXRfd3JpdGVyX2lkIChjb21tb24tPmVsZW1lbnRfaW5kZXgsIEdTVF9PQkpFQ1QgKGNvbW1vbiksCisgICAgICAgICAgICAgICZjb21tb24tPmVsZW1lbnRfaW5kZXhfd3JpdGVyX2lkKTsKKyAgICAgICAgd3JpdGVyX2lkID0gY29tbW9uLT5lbGVtZW50X2luZGV4X3dyaXRlcl9pZDsKKyAgICAgIH0KKworICAgICAgR1NUX0xPR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAiYWRkaW5nIGFzc29jaWF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVCAiLT4gJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAgICIgZm9yIHdyaXRlciBpZCAlZCIsIEdTVF9USU1FX0FSR1MgKGlkeC0+dGltZSksIGlkeC0+cG9zLCB3cml0ZXJfaWQpOworICAgICAgZ3N0X2luZGV4X2FkZF9hc3NvY2lhdGlvbiAoY29tbW9uLT5lbGVtZW50X2luZGV4LCB3cml0ZXJfaWQsCisgICAgICAgICAgR1NUX0FTU09DSUFUSU9OX0ZMQUdfS0VZX1VOSVQsIEdTVF9GT1JNQVRfVElNRSwgaWR4LT50aW1lLAorICAgICAgICAgIEdTVF9GT1JNQVRfQllURVMsIGlkeC0+cG9zICsgY29tbW9uLT5lYm1sX3NlZ21lbnRfc3RhcnQsIE5VTEwpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGlkeC0+dHJhY2sgPT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgdHJhY2tfbnVtID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3N0cmVhbV9mcm9tX251bSAoY29tbW9uLCBpZHgtPnRyYWNrKTsKKyAgICBpZiAodHJhY2tfbnVtID09IC0xKQorICAgICAgY29udGludWU7CisKKyAgICBjdHggPSBnX3B0cl9hcnJheV9pbmRleCAoY29tbW9uLT5zcmMsIHRyYWNrX251bSk7CisKKyAgICBpZiAoY3R4LT5pbmRleF90YWJsZSA9PSBOVUxMKQorICAgICAgY3R4LT5pbmRleF90YWJsZSA9CisgICAgICAgICAgZ19hcnJheV9zaXplZF9uZXcgKEZBTFNFLCBGQUxTRSwgc2l6ZW9mIChHc3RNYXRyb3NrYUluZGV4KSwgMTI4KTsKKworICAgIGdfYXJyYXlfYXBwZW5kX3ZhbHMgKGN0eC0+aW5kZXhfdGFibGUsIGlkeCwgMSk7CisgIH0KKworICBjb21tb24tPmluZGV4X3BhcnNlZCA9IFRSVUU7CisKKyAgLyogc2FuaXR5IGNoZWNrOyBlbXB0eSBpbmRleCBub3JtYWxpemVzIHRvIG5vIGluZGV4ICovCisgIGlmIChjb21tb24tPmluZGV4LT5sZW4gPT0gMCkgeworICAgIGdfYXJyYXlfZnJlZSAoY29tbW9uLT5pbmRleCwgVFJVRSk7CisgICAgY29tbW9uLT5pbmRleCA9IE5VTEw7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfaW5mbyAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLAorICAgIEdzdEVsZW1lbnQgKiBlbCwgR3N0RWJtbFJlYWQgKiBlYm1sKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBnZG91YmxlIGR1cl9mID0gLTEuMDsKKyAgZ3VpbnQzMiBpZDsKKworICBERUJVR19FTEVNRU5UX1NUQVJUIChjb21tb24sIGVibWwsICJTZWdtZW50SW5mbyIpOworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJTZWdtZW50SW5mbyIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgLyogY2x1c3RlciB0aW1lY29kZSAqLworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVElNRUNPREVTQ0FMRTp7CisgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIlRpbWVDb2RlU2NhbGU6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgICAgICBudW0pOworICAgICAgICBjb21tb24tPnRpbWVfc2NhbGUgPSBudW07CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9EVVJBVElPTjp7CisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9mbG9hdCAoZWJtbCwgJmlkLCAmZHVyX2YpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoZHVyX2YgPD0gMC4wKSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJJbnZhbGlkIGR1cmF0aW9uICVsZiIsIGR1cl9mKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIkR1cmF0aW9uOiAlbGYiLCBkdXJfZik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9XUklUSU5HQVBQOnsKKyAgICAgICAgZ2NoYXIgKnRleHQ7CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX3V0ZjggKGVibWwsICZpZCwgJnRleHQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJXcml0aW5nQXBwOiAlcyIsCisgICAgICAgICAgICBHU1RfU1RSX05VTEwgKHRleHQpKTsKKyAgICAgICAgY29tbW9uLT53cml0aW5nX2FwcCA9IHRleHQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9NVVhJTkdBUFA6eworICAgICAgICBnY2hhciAqdGV4dDsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdXRmOCAoZWJtbCwgJmlkLCAmdGV4dCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIk11eGluZ0FwcDogJXMiLAorICAgICAgICAgICAgR1NUX1NUUl9OVUxMICh0ZXh0KSk7CisgICAgICAgIGNvbW1vbi0+bXV4aW5nX2FwcCA9IHRleHQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9EQVRFVVRDOnsKKyAgICAgICAgZ2ludDY0IHRpbWU7CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX2RhdGUgKGVibWwsICZpZCwgJnRpbWUpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJEYXRlVVRDOiAlIiBHX0dJTlQ2NF9GT1JNQVQsIHRpbWUpOworICAgICAgICBjb21tb24tPmNyZWF0ZWQgPSB0aW1lOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVElUTEU6eworICAgICAgICBnY2hhciAqdGV4dDsKKyAgICAgICAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdXRmOCAoZWJtbCwgJmlkLCAmdGV4dCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIlRpdGxlOiAlcyIsIEdTVF9TVFJfTlVMTCAodGV4dCkpOworICAgICAgICB0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ldyAoR1NUX1RBR19USVRMRSwgdGV4dCwgTlVMTCk7CisgICAgICAgIGdzdF90YWdfbGlzdF9zZXRfc2NvcGUgKHRhZ2xpc3QsIEdTVF9UQUdfU0NPUEVfR0xPQkFMKTsKKyAgICAgICAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2ZvdW5kX2dsb2JhbF90YWcgKGNvbW1vbiwgZWwsIHRhZ2xpc3QpOworICAgICAgICBnX2ZyZWUgKHRleHQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX3NraXAgKGNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgICJTZWdtZW50SW5mbyIsIGlkKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUdNRU5UVUlEOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfU0VHTUVOVEZJTEVOQU1FOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfUFJFVlVJRDoKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1BSRVZGSUxFTkFNRToKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX05FWFRVSUQ6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9ORVhURklMRU5BTUU6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9TRUdNRU5URkFNSUxZOgorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ0hBUFRFUlRSQU5TTEFURToKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9za2lwIChlYm1sKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGR1cl9mID4gMC4wKSB7CisgICAgR3N0Q2xvY2tUaW1lIGR1cl91OworCisgICAgZHVyX3UgPSBnc3RfZ2RvdWJsZV90b19ndWludDY0IChkdXJfZiAqCisgICAgICAgIGdzdF9ndWludDY0X3RvX2dkb3VibGUgKGNvbW1vbi0+dGltZV9zY2FsZSkpOworICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZHVyX3UpICYmIGR1cl91IDw9IEdfTUFYSU5UNjQpCisgICAgICBjb21tb24tPnNlZ21lbnQuZHVyYXRpb24gPSBkdXJfdTsKKyAgfQorCisgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiU2VnbWVudEluZm8iLCByZXQpOworCisgIGNvbW1vbi0+c2VnbWVudGluZm9fcGFyc2VkID0gVFJVRTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX21ldGFkYXRhX2lkX3NpbXBsZV90YWcgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqCisgICAgY29tbW9uLCBHc3RFYm1sUmVhZCAqIGVibWwsIEdzdFRhZ0xpc3QgKiogcF90YWdsaXN0LCBnY2hhciAqIHBhcmVudCkKK3sKKyAgLyogRklYTUU6IGNoZWNrIGlmIHRoZXJlIGFyZSBtb3JlIHVzZWZ1bCBtYXBwaW5ncyAqLworICBzdGF0aWMgY29uc3Qgc3RydWN0CisgIHsKKyAgICBjb25zdCBnY2hhciAqbWF0cm9za2FfdGFnbmFtZTsKKyAgICBjb25zdCBnY2hhciAqZ3N0cmVhbWVyX3RhZ25hbWU7CisgIH0KKyAgdGFnX2NvbnZbXSA9IHsKKyAgICB7CisgICAgICAvKiBUaGUgZm9sbG93aW5nIGxpc3QgaGFzIHRoZSBfc2FtZV8gb3JkZXIgYXMgdGhlIG9uZSBpbiBNYXRyb3NrYSBzcGVjLiBQbGVhc2UsIGRvbid0IG1lc3MgaXQgdXAuICovCisgICAgICAvKiBUT0RPOiBOZXN0aW5nIGluZm9ybWF0aW9uOgorICAgICAgICAgT1JJR0lOQUwgQSBzcGVjaWFsIHRhZyB0aGF0IGlzIG1lYW50IHRvIGhhdmUgb3RoZXIgdGFncyBpbnNpZGUgKHVzaW5nIG5lc3RlZCB0YWdzKSB0byBkZXNjcmliZSB0aGUgb3JpZ2luYWwgd29yayBvZiBhcnQgdGhhdCB0aGlzIGl0ZW0gaXMgYmFzZWQgb24uIEFsbCB0YWdzIGluIHRoaXMgbGlzdCBjYW4gYmUgdXNlZCAidW5kZXIiIHRoZSBPUklHSU5BTCB0YWcgbGlrZSBMWVJJQ0lTVCwgUEVSRk9STUVSLCBldGMuCisgICAgICAgICBTQU1QTEUgQSB0YWcgdGhhdCBjb250YWlucyBvdGhlciB0YWdzIHRvIGRlc2NyaWJlIGEgc2FtcGxlIHVzZWQgaW4gdGhlIHRhcmdldGVkIGl0ZW0gdGFrZW4gZnJvbSBhbm90aGVyIHdvcmsgb2YgYXJ0LiBBbGwgdGFncyBpbiB0aGlzIGxpc3QgY2FuIGJlIHVzZWQgInVuZGVyIiB0aGUgU0FNUExFIHRhZyBsaWtlIFRJVExFLCBBUlRJU1QsIERBVEVfUkVMRUFTRUQsIGV0Yy4KKyAgICAgICAgIENPVU5UUlkgVGhlIG5hbWUgb2YgdGhlIGNvdW50cnkgKGJpYmxpbyBJU08tNjM5LTIpIHRoYXQgaXMgbWVhbnQgdG8gaGF2ZSBvdGhlciB0YWdzIGluc2lkZSAodXNpbmcgbmVzdGVkIHRhZ3MpIHRvIGNvdW50cnkgc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGl0ZW0uIEFsbCB0YWdzIGluIHRoaXMgbGlzdCBjYW4gYmUgdXNlZCAidW5kZXIiIHRoZSBDT1VOVFJZX1NQRUNJRklDIHRhZyBsaWtlIExBQkVMLCBQVUJMSVNIX1JBVElORywgZXRjLgorICAgICAgICovCisKKyAgICAgIC8qIE9yZ2FuaXphdGlvbmFsIEluZm9ybWF0aW9uICovCisgICAgR1NUX01BVFJPU0tBX1RBR19JRF9UT1RBTF9QQVJUUywgR1NUX1RBR19UUkFDS19DT1VOVH0sIHsKKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX1BBUlRfTlVNQkVSLCBHU1RfVEFHX1RSQUNLX05VTUJFUn0sIHsKKyAgICAgIC8qIFRPRE86IFBBUlRfT0ZGU0VUIEEgbnVtYmVyIHRvIGFkZCB0byBQQVJUX05VTUJFUiB3aGVuIHRoZSBwYXJ0cyBhdCB0aGF0IGxldmVsIGRvbid0IHN0YXJ0IGF0IDEuIChlLmcuIGlmIFRhcmdldFR5cGUgaXMgVFJBQ0ssIHRoZSB0cmFjayBudW1iZXIgb2YgdGhlIHNlY29uZCBhdWRpbyBDRCkgKi8KKworICAgICAgLyogVGl0bGVzICovCisgICAgR1NUX01BVFJPU0tBX1RBR19JRF9TVUJUSVRMRSwgR1NUX1RBR19USVRMRX0sIHsgICAgIC8qIFN1YiBUaXRsZSBvZiB0aGUgZW50aXR5LiBTaW5jZSB3ZSdyZSBjb25jYXQnaW5nIGFsbCB0aXRsZS1saWtlIGVudGl0aWVzIGFueXdheSwgbWlnaHQgYXMgd2VsbCBhZGQgdGhlIHN1Yi10aXRsZS4gKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX1RJVExFLCBHU1RfVEFHX1RJVExFfSwgeworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfQUxCVU0sIEdTVF9UQUdfQUxCVU19LCB7ICAgICAgICAvKiBNYXRyb3NrYSBzcGVjIGRvZXMgTk9UIGhhdmUgdGhpcyB0YWchIER1bm5vIHdoYXQgaXQgd2FzIGRvaW5nIGhlcmUsIHByb2JhYmx5IGZvciBjb21wYXRpYmlsaXR5LiAqLworCisgICAgICAvKiBUT0RPOiBOZXN0ZWQgSW5mb3JtYXRpb246CisgICAgICAgICBVUkwgVVJMIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhZyBpdCdzIGluY2x1ZGVkIGluLgorICAgICAgICAgU09SVF9XSVRIIEEgY2hpbGQgZWxlbWVudCB0byBpbmRpY2F0ZSB3aGF0IGFsdGVybmF0aXZlIHZhbHVlIHRoZSBwYXJlbnQgdGFnIGNhbiBoYXZlIHRvIGJlIHNvcnRlZCwgZm9yIGV4YW1wbGUgIlBldCBTaG9wIEJveXMiIGluc3RlYWQgb2YgIlRoZSBQZXQgU2hvcCBCb3lzIi4gT3IgIk1hcmxleSBCb2IiIGFuZCAiTWFybGV5IFppZ2d5IiAobm8gY29tbWEgbmVlZGVkKS4KKyAgICAgICAgIElOU1RSVU1FTlRTIFRoZSBpbnN0cnVtZW50cyB0aGF0IGFyZSBiZWluZyB1c2VkL3BsYXllZCwgc2VwYXJhdGVkIGJ5IGEgY29tbWEuIEl0IHNob3VsZCBiZSBhIGNoaWxkIG9mIHRoZSBmb2xsb3dpbmcgdGFnczogQVJUSVNULCBMRUFEX1BFUkZPUk1FUiBvciBBQ0NPTVBBTklNRU5ULgorICAgICAgICAgRU1BSUwgRW1haWwgY29ycmVzcG9uZGluZyB0byB0aGUgdGFnIGl0J3MgaW5jbHVkZWQgaW4uCisgICAgICAgICBBRERSRVNTIFRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBlbnRpdHkuIFRoZSBhZGRyZXNzIHNob3VsZCBpbmNsdWRlIGEgY291bnRyeSBjb2RlLiBJdCBjYW4gYmUgdXNlZnVsIGZvciBhIHJlY29yZGluZyBsYWJlbC4KKyAgICAgICAgIEZBWCBUaGUgZmF4IG51bWJlciBjb3JyZXNwb25kaW5nIHRvIHRoZSB0YWcgaXQncyBpbmNsdWRlZCBpbi4gSXQgY2FuIGJlIHVzZWZ1bCBmb3IgYSByZWNvcmRpbmcgbGFiZWwuCisgICAgICAgICBQSE9ORSBUaGUgcGhvbmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhZyBpdCdzIGluY2x1ZGVkIGluLiBJdCBjYW4gYmUgdXNlZnVsIGZvciBhIHJlY29yZGluZyBsYWJlbC4KKyAgICAgICAqLworCisgICAgICAvKiBFbnRpdGllcyAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfQVJUSVNULCBHU1RfVEFHX0FSVElTVH0sIHsKKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0xFQURfUEVSRk9STUVSLCBHU1RfVEFHX1BFUkZPUk1FUn0sIHsKKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0FDQ09NUEFOSU1FTlQsIEdTVF9UQUdfUEVSRk9STUVSfSwgeyAgICAvKiBCYW5kL29yY2hlc3RyYS9hY2NvbXBhbmltZW50L211c2ljaWFuLiBUaGlzIGlzIGFraW4gdG8gdGhlIFRQRTIgdGFnIGluIElEMy4gKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0NPTVBPU0VSLCBHU1RfVEFHX0NPTVBPU0VSfSwgeworICAgICAgLyogQVJSQU5HRVIgVGhlIHBlcnNvbiB3aG8gYXJyYW5nZWQgdGhlIHBpZWNlLCBlLmcuLCBSYXZlbC4gKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0xZUklDUywgR1NUX1RBR19MWVJJQ1N9LCB7ICAgICAgLyogVGhlIGx5cmljcyBjb3JyZXNwb25kaW5nIHRvIGEgc29uZyAoaW4gY2FzZSBhdWRpbyBzeW5jaHJvbml6YXRpb24gaXMgbm90IGtub3duIG9yIGFzIGEgZG91YmxvbiB0byBhIHN1YnRpdGxlIHRyYWNrKS4gRWRpdGluZyB0aGlzIHZhbHVlIHdoZW4gc3VidGl0bGVzIGFyZSBmb3VuZCBzaG91bGQgYWxzbyByZXN1bHQgaW4gZWRpdGluZyB0aGUgc3VidGl0bGUgdHJhY2sgZm9yIG1vcmUgY29uc2lzdGVuY3kuICovCisgICAgICAvKiBMWVJJQ0lTVCBUaGUgcGVyc29uIHdobyB3cm90ZSB0aGUgbHlyaWNzIGZvciBhIG11c2ljYWwgaXRlbS4gVGhpcyBpcyBha2luIHRvIHRoZSBURVhUIHRhZyBpbiBJRDMuICovCisgICAgR1NUX01BVFJPU0tBX1RBR19JRF9DT05EVUNUT1IsIEdTVF9UQUdfUEVSRk9STUVSfSwgeyAgICAgICAgLyogQ29uZHVjdG9yL3BlcmZvcm1lciByZWZpbmVtZW50LiBUaGlzIGlzIGFraW4gdG8gdGhlIFRQRTMgdGFnIGluIElEMy4gKi8KKyAgICAgIC8qIERJUkVDVE9SIFRoaXMgaXMgYWtpbiB0byB0aGUgSUFSVCB0YWcgaW4gUklGRi4gKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0FVVEhPUiwgR1NUX1RBR19BUlRJU1R9LCB7CisgICAgICAvKiBBU1NJU1RBTlRfRElSRUNUT1IgVGhlIG5hbWUgb2YgdGhlIGFzc2lzdGFudCBkaXJlY3Rvci4gKi8KKyAgICAgIC8qIERJUkVDVE9SX09GX1BIT1RPR1JBUEhZIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvciBvZiBwaG90b2dyYXBoeSwgYWxzbyBrbm93biBhcyBjaW5lbWF0b2dyYXBoZXIuIFRoaXMgaXMgYWtpbiB0byB0aGUgSUNOTSB0YWcgaW4gRXh0ZW5kZWQgUklGRi4gKi8KKyAgICAgIC8qIFNPVU5EX0VOR0lORUVSIFRoZSBuYW1lIG9mIHRoZSBzb3VuZCBlbmdpbmVlciBvciBzb3VuZCByZWNvcmRpc3QuICovCisgICAgICAvKiBBUlRfRElSRUNUT1IgVGhlIHBlcnNvbiB3aG8gb3ZlcnNlZXMgdGhlIGFydGlzdHMgYW5kIGNyYWZ0c3Blb3BsZSB3aG8gYnVpbGQgdGhlIHNldHMuICovCisgICAgICAvKiBQUk9EVUNUSU9OX0RFU0lHTkVSIEFydGlzdCByZXNwb25zaWJsZSBmb3IgZGVzaWduaW5nIHRoZSBvdmVyYWxsIHZpc3VhbCBhcHBlYXJhbmNlIG9mIGEgbW92aWUuICovCisgICAgICAvKiBDSE9SRUdSQVBIRVIgVGhlIG5hbWUgb2YgdGhlIGNob3JlZ3JhcGhlciAqLworICAgICAgLyogQ09TVFVNRV9ERVNJR05FUiBUaGUgbmFtZSBvZiB0aGUgY29zdHVtZSBkZXNpZ25lciAqLworICAgICAgLyogQUNUT1IgQW4gYWN0b3Igb3IgYWN0cmVzcyBwbGF5aW5nIGEgcm9sZSBpbiB0aGlzIG1vdmllLiBUaGlzIGlzIHRoZSBwZXJzb24ncyByZWFsIG5hbWUsIG5vdCB0aGUgY2hhcmFjdGVyJ3MgbmFtZSB0aGUgcGVyc29uIGlzIHBsYXlpbmcuICovCisgICAgICAvKiBDSEFSQUNURVIgVGhlIG5hbWUgb2YgdGhlIGNoYXJhY3RlciBhbiBhY3RvciBvciBhY3RyZXNzIHBsYXlzIGluIHRoaXMgbW92aWUuIFRoaXMgc2hvdWxkIGJlIGEgc3ViLXRhZyBvZiBhbiBBQ1RPUiB0YWcgaW4gb3JkZXIgbm90IHRvIGNhdXNlIGFtYmlndWl0aWVzLiAqLworICAgICAgLyogV1JJVFRFTl9CWSBUaGUgYXV0aG9yIG9mIHRoZSBzdG9yeSBvciBzY3JpcHQgKHVzZWQgZm9yIG1vdmllcyBhbmQgVFYgc2hvd3MpLiAqLworICAgICAgLyogU0NSRUVOUExBWV9CWSBUaGUgYXV0aG9yIG9mIHRoZSBzY3JlZW5wbGF5IG9yIHNjZW5hcmlvICh1c2VkIGZvciBtb3ZpZXMgYW5kIFRWIHNob3dzKS4gKi8KKyAgICAgIC8qIEVESVRFRF9CWSBUaGlzIGlzIGFraW4gdG8gdGhlIElFRFQgdGFnIGluIEV4dGVuZGVkIFJJRkYuICovCisgICAgICAvKiBQUk9EVUNFUiBQcm9kdWNlZCBieS4gVGhpcyBpcyBha2luIHRvIHRoZSBJUFJPIHRhZyBpbiBFeHRlbmRlZCBSSUZGLiAqLworICAgICAgLyogQ09QUk9EVUNFUiBUaGUgbmFtZSBvZiBhIGNvLXByb2R1Y2VyLiAqLworICAgICAgLyogRVhFQ1VUSVZFX1BST0RVQ0VSIFRoZSBuYW1lIG9mIGFuIGV4ZWN1dGl2ZSBwcm9kdWNlci4gKi8KKyAgICAgIC8qIERJU1RSSUJVVEVEX0JZIFRoaXMgaXMgYWtpbiB0byB0aGUgSURTVCB0YWcgaW4gRXh0ZW5kZWQgUklGRi4gKi8KKyAgICAgIC8qIE1BU1RFUkVEX0JZIFRoZSBlbmdpbmVlciB3aG8gbWFzdGVyZWQgdGhlIGNvbnRlbnQgZm9yIGEgcGh5c2ljYWwgbWVkaXVtIG9yIGZvciBkaWdpdGFsIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0VOQ09ERURfQlksIEdTVF9UQUdfRU5DT0RFRF9CWX0sIHsgICAgICAvKiBUaGlzIGlzIGFraW4gdG8gdGhlIFRFTkMgdGFnIGluIElEMy4gKi8KKyAgICAgIC8qIE1JWEVEX0JZIERKIG1peCBieSB0aGUgYXJ0aXN0IHNwZWNpZmllZCAqLworICAgICAgLyogUkVNSVhFRF9CWSBJbnRlcnByZXRlZCwgcmVtaXhlZCwgb3Igb3RoZXJ3aXNlIG1vZGlmaWVkIGJ5LiBUaGlzIGlzIGFraW4gdG8gdGhlIFRQRTQgdGFnIGluIElEMy4gKi8KKyAgICAgIC8qIFBST0RVQ1RJT05fU1RVRElPIFRoaXMgaXMgYWtpbiB0byB0aGUgSVNURCB0YWcgaW4gRXh0ZW5kZWQgUklGRi4gKi8KKyAgICAgIC8qIFRIQU5LU19UTyBBIHZlcnkgZ2VuZXJhbCB0YWcgZm9yIGV2ZXJ5b25lIGVsc2UgdGhhdCB3YW50cyB0byBiZSBsaXN0ZWQuICovCisgICAgICAvKiBQVUJMSVNIRVIgVGhpcyBpcyBha2luIHRvIHRoZSBUUFVCIHRhZyBpbiBJRDMuICovCisgICAgICAvKiBMQUJFTCBUaGUgcmVjb3JkIGxhYmVsIG9yIGltcHJpbnQgb24gdGhlIGRpc2MuICovCisgICAgICAvKiBTZWFyY2ggLyBDbGFzc2lmaWNhdGlvbiAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfR0VOUkUsIEdTVF9UQUdfR0VOUkV9LCB7CisgICAgICAvKiBNT09EIEludGVuZGVkIHRvIHJlZmxlY3QgdGhlIG1vb2Qgb2YgdGhlIGl0ZW0gd2l0aCBhIGZldyBrZXl3b3JkcywgZS5nLiAiUm9tYW50aWMiLCAiU2FkIiBvciAiVXBsaWZ0aW5nIi4gVGhlIGZvcm1hdCBmb2xsb3dzIHRoYXQgb2YgdGhlIFRNT08gdGFnIGluIElEMy4gKi8KKyAgICAgIC8qIE9SSUdJTkFMX01FRElBX1RZUEUgRGVzY3JpYmVzIHRoZSBvcmlnaW5hbCB0eXBlIG9mIHRoZSBtZWRpYSwgc3VjaCBhcywgIkRWRCIsICJDRCIsICJjb21wdXRlciBpbWFnZSwiICJkcmF3aW5nLCIgImxpdGhvZ3JhcGgsIiBhbmQgc28gZm9ydGguIFRoaXMgaXMgYWtpbiB0byB0aGUgVE1FRCB0YWcgaW4gSUQzLiAqLworICAgICAgLyogQ09OVEVOVF9UWVBFIFRoZSB0eXBlIG9mIHRoZSBpdGVtLiBlLmcuIERvY3VtZW50YXJ5LCBGZWF0dXJlIEZpbG0sIENhcnRvb24sIE11c2ljIFZpZGVvLCBNdXNpYywgU291bmQgRlgsIC4uLiAqLworICAgICAgLyogU1VCSkVDVCBEZXNjcmliZXMgdGhlIHRvcGljIG9mIHRoZSBmaWxlLCBzdWNoIGFzICJBZXJpYWwgdmlldyBvZiBTZWF0dGxlLiIgKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0RFU0NSSVBUSU9OLCBHU1RfVEFHX0RFU0NSSVBUSU9OfSwgeyAgICAvKiBBIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBjb250ZW50LCBzdWNoIGFzICJUd28gYmlyZHMgZmx5aW5nLiIgKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0tFWVdPUkRTLCBHU1RfVEFHX0tFWVdPUkRTfSwgeyAgLyogS2V5d29yZHMgdG8gdGhlIGl0ZW0gc2VwYXJhdGVkIGJ5IGEgY29tbWEsIHVzZWQgZm9yIHNlYXJjaGluZy4gKi8KKyAgICAgIC8qIFNVTU1BUlkgQSBwbG90IG91dGxpbmUgb3IgYSBzdW1tYXJ5IG9mIHRoZSBzdG9yeS4gKi8KKyAgICAgIC8qIFNZTk9QU0lTIEEgZGVzY3JpcHRpb24gb2YgdGhlIHN0b3J5IGxpbmUgb2YgdGhlIGl0ZW0uICovCisgICAgICAvKiBJTklUSUFMX0tFWSBUaGUgaW5pdGlhbCBrZXkgdGhhdCBhIG11c2ljYWwgdHJhY2sgc3RhcnRzIGluLiBUaGUgZm9ybWF0IGlzIGlkZW50aWNhbCB0byBJRDMuICovCisgICAgICAvKiBQRVJJT0QgRGVzY3JpYmVzIHRoZSBwZXJpb2QgdGhhdCB0aGUgcGllY2UgaXMgZnJvbSBvciBhYm91dC4gRm9yIGV4YW1wbGUsICJSZW5haXNzYW5jZSIuICovCisgICAgICAvKiBMQVdfUkFUSU5HIERlcGVuZGluZyBvbiB0aGUgY291bnRyeSBpdCdzIHRoZSBmb3JtYXQgb2YgdGhlIHJhdGluZyBvZiBhIG1vdmllIChQLCBSLCBYIGluIHRoZSBVU0EsIGFuIGFnZSBpbiBvdGhlciBjb3VudHJpZXMgb3IgYSBVUkkgZGVmaW5pbmcgYSBsb2dvKS4gKi8KKyAgICAgIC8qIElDUkEgVGhlIElDUkEgY29udGVudCByYXRpbmcgZm9yIHBhcmVudGFsIGNvbnRyb2wuIChQcmV2aW91c2x5IFJTQUNpKSAqLworCisgICAgICAvKiBUZW1wb3JhbCBJbmZvcm1hdGlvbiAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfREFURV9SRUxFQVNFRCwgR1NUX1RBR19EQVRFfSwgeyAvKiBUaGUgdGltZSB0aGF0IHRoZSBpdGVtIHdhcyBvcmlnaW5hbHkgcmVsZWFzZWQuIFRoaXMgaXMgYWtpbiB0byB0aGUgVERSTCB0YWcgaW4gSUQzLiAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfREFURV9SRUNPUkRFRCwgR1NUX1RBR19EQVRFfSwgeyAvKiBUaGUgdGltZSB0aGF0IHRoZSByZWNvcmRpbmcgYmVnYW4uIFRoaXMgaXMgYWtpbiB0byB0aGUgVERSQyB0YWcgaW4gSUQzLiAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfREFURV9FTkNPREVELCBHU1RfVEFHX0RBVEV9LCB7ICAvKiBUaGUgdGltZSB0aGF0IHRoZSBlbmNvZGluZyBvZiB0aGlzIGl0ZW0gd2FzIGNvbXBsZXRlZCBiZWdhbi4gVGhpcyBpcyBha2luIHRvIHRoZSBUREVOIHRhZyBpbiBJRDMuICovCisgICAgR1NUX01BVFJPU0tBX1RBR19JRF9EQVRFX1RBR0dFRCwgR1NUX1RBR19EQVRFfSwgeyAgIC8qIFRoZSB0aW1lIHRoYXQgdGhlIHRhZ3Mgd2VyZSBkb25lIGZvciB0aGlzIGl0ZW0uIFRoaXMgaXMgYWtpbiB0byB0aGUgVERURyB0YWcgaW4gSUQzLiAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfREFURV9ESUdJVElaRUQsIEdTVF9UQUdfREFURX0sIHsgICAgICAgIC8qIFRoZSB0aW1lIHRoYXQgdGhlIGl0ZW0gd2FzIHRyYW5mZXJlZCB0byBhIGRpZ2l0YWwgbWVkaXVtLiBUaGlzIGlzIGFraW4gdG8gdGhlIElESVQgdGFnIGluIFJJRkYuICovCisgICAgR1NUX01BVFJPU0tBX1RBR19JRF9EQVRFX1dSSVRURU4sIEdTVF9UQUdfREFURX0sIHsgIC8qIFRoZSB0aW1lIHRoYXQgdGhlIHdyaXRpbmcgb2YgdGhlIG11c2ljL3NjcmlwdCBiZWdhbi4gKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0RBVEVfUFVSQ0hBU0VELCBHU1RfVEFHX0RBVEV9LCB7ICAgICAgICAvKiBJbmZvcm1hdGlvbiBvbiB3aGVuIHRoZSBmaWxlIHdhcyBwdXJjaGFzZWQgKHNlZSBhbHNvIHB1cmNoYXNlIHRhZ3MpLiAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfREFURSwgR1NUX1RBR19EQVRFfSwgeyAgLyogTWF0cm9za2Egc3BlYyBkb2VzIE5PVCBoYXZlIHRoaXMgdGFnISBEdW5ubyB3aGF0IGl0IHdhcyBkb2luZyBoZXJlLCBwcm9iYWJseSBmb3IgY29tcGF0aWJpbGl0eS4gKi8KKworICAgICAgLyogU3BhY2lhbCBJbmZvcm1hdGlvbiAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfUkVDT1JESU5HX0xPQ0FUSU9OLCBHU1RfVEFHX0dFT19MT0NBVElPTl9OQU1FfSwgeyAgICAgICAvKiBUaGUgbG9jYXRpb24gd2hlcmUgdGhlIGl0ZW0gd2FzIHJlY29yZGVkLiBUaGUgY291bnRyaWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0cmluZywgc2FtZSAyIG9jdGV0cyBhcyBpbiBJbnRlcm5ldCBkb21haW5zLCBvciBwb3NzaWJseSBJU08tMzE2Ni4gVGhpcyBjb2RlIGlzIGZvbGxvd2VkIGJ5IGEgY29tbWEsIHRoZW4gbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBzdWNoIGFzIHN0YXRlL3Byb3ZpbmNlLCBhbm90aGVyIGNvbW1hLCBhbmQgdGhlbiBjaXR5LiBGb3IgZXhhbXBsZSwgIlVTLCBUZXhhcywgQXVzdGluIi4gVGhpcyB3aWxsIGFsbG93IGZvciBlYXN5IHNvcnRpbmcuIEl0IGlzIG9rYXkgdG8gb25seSBzdG9yZSB0aGUgY291bnRyeSwgb3IgdGhlIGNvdW50cnkgYW5kIHRoZSBzdGF0ZS9wcm92aW5jZS4gTW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBjYW4gYmUgYWRkZWQgYWZ0ZXIgdGhlIGNpdHkgdGhyb3VnaCB0aGUgdXNlIG9mIGFkZGl0aW9uYWwgY29tbWFzLiBJbiBjYXNlcyB3aGVyZSB0aGUgcHJvdmluY2Uvc3RhdGUgaXMgdW5rbm93biwgYnV0IHlvdSB3YW50IHRvIHN0b3JlIHRoZSBjaXR5LCBzaW1wbHkgbGVhdmUgYSBzcGFjZSBiZXR3ZWVuIHRoZSB0d28gY29tbWFzLiBGb3IgZXhhbXBsZSwgIlVTLCAsIEF1c3RpbiIuICovCisgICAgICAvKiBDT01QT1NJVElPTl9MT0NBVElPTiBMb2NhdGlvbiB0aGF0IHRoZSBpdGVtIHdhcyBvcmlnaW5hbHkgZGVzaWduZWQvd3JpdHRlbi4gVGhlIGNvdW50cmllcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdHJpbmcsIHNhbWUgMiBvY3RldHMgYXMgaW4gSW50ZXJuZXQgZG9tYWlucywgb3IgcG9zc2libHkgSVNPLTMxNjYuIFRoaXMgY29kZSBpcyBmb2xsb3dlZCBieSBhIGNvbW1hLCB0aGVuIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gc3VjaCBhcyBzdGF0ZS9wcm92aW5jZSwgYW5vdGhlciBjb21tYSwgYW5kIHRoZW4gY2l0eS4gRm9yIGV4YW1wbGUsICJVUywgVGV4YXMsIEF1c3RpbiIuIFRoaXMgd2lsbCBhbGxvdyBmb3IgZWFzeSBzb3J0aW5nLiBJdCBpcyBva2F5IHRvIG9ubHkgc3RvcmUgdGhlIGNvdW50cnksIG9yIHRoZSBjb3VudHJ5IGFuZCB0aGUgc3RhdGUvcHJvdmluY2UuIE1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gY2FuIGJlIGFkZGVkIGFmdGVyIHRoZSBjaXR5IHRocm91Z2ggdGhlIHVzZSBvZiBhZGRpdGlvbmFsIGNvbW1hcy4gSW4gY2FzZXMgd2hlcmUgdGhlIHByb3ZpbmNlL3N0YXRlIGlzIHVua25vd24sIGJ1dCB5b3Ugd2FudCB0byBzdG9yZSB0aGUgY2l0eSwgc2ltcGx5IGxlYXZlIGEgc3BhY2UgYmV0d2VlbiB0aGUgdHdvIGNvbW1hcy4gRm9yIGV4YW1wbGUsICJVUywgLCBBdXN0aW4iLiAqLworICAgICAgLyogQ09NUE9TRVJfTkFUSU9OQUxJVFkgTmF0aW9uYWxpdHkgb2YgdGhlIG1haW4gY29tcG9zZXIgb2YgdGhlIGl0ZW0sIG1vc3RseSBmb3IgY2xhc3NpY2FsIG11c2ljLiBUaGUgY291bnRyaWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0cmluZywgc2FtZSAyIG9jdGV0cyBhcyBpbiBJbnRlcm5ldCBkb21haW5zLCBvciBwb3NzaWJseSBJU08tMzE2Ni4gKi8KKworICAgICAgLyogUGVyc29uYWwgKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0NPTU1FTlQsIEdTVF9UQUdfQ09NTUVOVH0sIHsgICAgLyogQW55IGNvbW1lbnQgcmVsYXRlZCB0byB0aGUgY29udGVudC4gKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0NPTU1FTlRTLCBHU1RfVEFHX0NPTU1FTlR9LCB7ICAgLyogTWF0cm9za2Egc3BlYyBkb2VzIE5PVCBoYXZlIHRoaXMgdGFnISBEdW5ubyB3aGF0IGl0IHdhcyBkb2luZyBoZXJlLCBwcm9iYWJseSBmb3IgY29tcGF0aWJpbGl0eS4gKi8KKyAgICAgIC8qIFBMQVlfQ09VTlRFUiBUaGUgbnVtYmVyIG9mIHRpbWUgdGhlIGl0ZW0gaGFzIGJlZW4gcGxheWVkLiAqLworICAgICAgLyogVE9ETzogUkFUSU5HIEEgbnVtZXJpYyB2YWx1ZSBkZWZpbmluZyBob3cgbXVjaCBhIHBlcnNvbiBsaWtlcyB0aGUgc29uZy9tb3ZpZS4gVGhlIG51bWJlciBpcyBiZXR3ZWVuIDAgYW5kIDUgd2l0aCBkZWNpbWFsIHZhbHVlcyBwb3NzaWJsZSAoZS5nLiAyLjcpLCA1KC4wKSBiZWluZyB0aGUgaGlnaGVzdCBwb3NzaWJsZSByYXRpbmcuIE90aGVyIHJhdGluZyBzeXN0ZW1zIHdpdGggZGlmZmVyZW50IHJhbmdlcyB3aWxsIGhhdmUgdG8gYmUgc2NhbGVkLiAqLworCisgICAgICAvKiBUZWNobmljYWwgSW5mb3JtYXRpb24gKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0VOQ09ERVIsIEdTVF9UQUdfRU5DT0RFUn0sIHsKKyAgICAgIC8qIEVOQ09ERVJfU0VUVElOR1MgQSBsaXN0IG9mIHRoZSBzZXR0aW5ncyB1c2VkIGZvciBlbmNvZGluZyB0aGlzIGl0ZW0uIE5vIHNwZWNpZmljIGZvcm1hdC4gKi8KKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX0JQUywgR1NUX1RBR19CSVRSQVRFfSwgeworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfQklUU1BTLCBHU1RfVEFHX0JJVFJBVEV9LCB7ICAgICAvKiBNYXRyb3NrYSBzcGVjIGRvZXMgTk9UIGhhdmUgdGhpcyB0YWchIER1bm5vIHdoYXQgaXQgd2FzIGRvaW5nIGhlcmUsIHByb2JhYmx5IGZvciBjb21wYXRpYmlsaXR5LiAqLworICAgICAgLyogV09OVEZJWCAoYWxyZWFkeSBoYW5kbGVkIGluIGFub3RoZXIgd2F5KTogRlBTIFRoZSBhdmVyYWdlIGZyYW1lcyBwZXIgc2Vjb25kIG9mIHRoZSBzcGVjaWZpZWQgaXRlbS4gVGhpcyBpcyB0eXBpY2FsbHkgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIEJsb2NrcyBwZXIgc2Vjb25kLiBJbiB0aGUgZXZlbnQgdGhhdCBsYWNpbmcgaXMgdXNlZCwgZWFjaCBsYWNlZCBjaHVuayBpcyB0byBiZSBjb3VudGVkIGFzIGEgc2VwZXJhdGUgZnJhbWUuICovCisgICAgR1NUX01BVFJPU0tBX1RBR19JRF9CUE0sIEdTVF9UQUdfQkVBVFNfUEVSX01JTlVURX0sIHsKKyAgICAgIC8qIE1FQVNVUkUgSW4gbXVzaWMsIGEgbWVhc3VyZSBpcyBhIHVuaXQgb2YgdGltZSBpbiBXZXN0ZXJuIG11c2ljIGxpa2UgIjQvNCIuIEl0IHJlcHJlc2VudHMgYSByZWd1bGFyIGdyb3VwaW5nIG9mIGJlYXRzLCBhIG1ldGVyLCBhcyBpbmRpY2F0ZWQgaW4gbXVzaWNhbCBub3RhdGlvbiBieSB0aGUgdGltZSBzaWduYXR1cmUuLiBUaGUgbWFqb3JpdHkgb2YgdGhlIGNvbnRlbXBvcmFyeSByb2NrIGFuZCBwb3AgbXVzaWMgeW91IGhlYXIgb24gdGhlIHJhZGlvIHRoZXNlIGRheXMgaXMgd3JpdHRlbiBpbiB0aGUgNC80IHRpbWUgc2lnbmF0dXJlLiAqLworICAgICAgLyogVFVOSU5HIEl0IGlzIHNhdmVkIGFzIGEgZnJlcXVlbmN5IGluIGhlcnR6IHRvIGFsbG93IG5lYXItcGVyZmVjdCB0dW5pbmcgb2YgaW5zdHJ1bWVudHMgdG8gdGhlIHNhbWUgdG9uZSBhcyB0aGUgbXVzaWNhbCBwaWVjZSAoZS5nLiAiNDQxLjM0IiBpbiBIZXJ0eikuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDQ0MC4wIEh6LiAqLworICAgICAgLyogVE9ETzogUkVQTEFZR0FJTl9HQUlOIFRoZSBnYWluIHRvIGFwcGx5IHRvIHJlYWNoIDg5ZEIgU1BMIG9uIHBsYXliYWNrLiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBSZXBsYXkgR2FpbiBzdGFuZGFyZC4gTm90ZSB0aGF0IFJlcGxheUdhaW4gaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGF0IGFsbCBUYXJnZXRUeXBlIGxldmVscyAodHJhY2ssIGFsYnVtLCBldGMpLiAqLworICAgICAgLyogVE9ETzogUkVQTEFZR0FJTl9QRUFLIFRoZSBtYXhpbXVtIGFic29sdXRlIHBlYWsgdmFsdWUgb2YgdGhlIGl0ZW0uIFRoaXMgaXMgYmFzZWQgb24gdGhlIFJlcGxheSBHYWluIHN0YW5kYXJkLiAqLworCisgICAgICAvKiBJZGVudGlmaWVycyAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfSVNSQywgR1NUX1RBR19JU1JDfSwgeworICAgICAgLyogTUNESSBUaGlzIGlzIGEgYmluYXJ5IGR1bXAgb2YgdGhlIFRPQyBvZiB0aGUgQ0RST00gdGhhdCB0aGlzIGl0ZW0gd2FzIHRha2VuIGZyb20uIFRoaXMgaG9sZHMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIE1DREkgaW4gSUQzLiAqLworICAgICAgLyogSVNCTiBJbnRlcm5hdGlvbmFsIFN0YW5kYXJkIEJvb2sgTnVtYmVyICovCisgICAgICAvKiBCQVJDT0RFIEVBTi0xMyAoRXVyb3BlYW4gQXJ0aWNsZSBOdW1iZXJpbmcpIG9yIFVQQy1BIChVbml2ZXJzYWwgUHJvZHVjdCBDb2RlKSBiYXIgY29kZSBpZGVudGlmaWVyICovCisgICAgICAvKiBDQVRBTE9HX05VTUJFUiBBIGxhYmVsLXNwZWNpZmljIHN0cmluZyB1c2VkIHRvIGlkZW50aWZ5IHRoZSByZWxlYXNlIChUSUMgMDEgZm9yIGV4YW1wbGUpLiAqLworICAgICAgLyogTEFCRUxfQ09ERSBBIDQtZGlnaXQgb3IgNS1kaWdpdCBudW1iZXIgdG8gaWRlbnRpZnkgdGhlIHJlY29yZCBsYWJlbCwgdHlwaWNhbGx5IHByaW50ZWQgYXMgKExDKSB4eHh4IG9yIChMQykgMHh4eHggb24gQ0RzIG1lZGlhcyBvciBjb3ZlcnMgKG9ubHkgdGhlIG51bWJlciBpcyBzdG9yZWQpLiAqLworICAgICAgLyogTENDTiBMaWJyYXJ5IG9mIENvbmdyZXNzIENvbnRyb2wgTnVtYmVyICovCisKKyAgICAgIC8qIENvbW1lcmNpYWwgKi8KKyAgICAgIC8qIFBVUkNIQVNFX0lURU0gVVJMIHRvIHB1cmNoYXNlIHRoaXMgZmlsZS4gVGhpcyBpcyBha2luIHRvIHRoZSBXUEFZIHRhZyBpbiBJRDMuICovCisgICAgICAvKiBQVVJDSEFTRV9JTkZPIEluZm9ybWF0aW9uIG9uIHdoZXJlIHRvIHB1cmNoYXNlIHRoaXMgYWxidW0uIFRoaXMgaXMgYWtpbiB0byB0aGUgV0NPTSB0YWcgaW4gSUQzLiAqLworICAgICAgLyogUFVSQ0hBU0VfT1dORVIgSW5mb3JtYXRpb24gb24gdGhlIHBlcnNvbiB3aG8gcHVyY2hhc2VkIHRoZSBmaWxlLiBUaGlzIGlzIGFraW4gdG8gdGhlIFRPV04gdGFnIGluIElEMy4gKi8KKyAgICAgIC8qIFBVUkNIQVNFX1BSSUNFIFRoZSBhbW91bnQgcGFpZCBmb3IgZW50aXR5LiBUaGVyZSBzaG91bGQgb25seSBiZSBhIG51bWVyaWMgdmFsdWUgaW4gaGVyZS4gT25seSBudW1iZXJzLCBubyBsZXR0ZXJzIG9yIHN5bWJvbHMgb3RoZXIgdGhhbiAiLiIuIEZvciBpbnN0YW5jZSwgeW91IHdvdWxkIHN0b3JlICIxNS41OSIgaW5zdGVhZCBvZiAiJDE1LjU5VVNEIi4gKi8KKyAgICAgIC8qIFBVUkNIQVNFX0NVUlJFTkNZIFRoZSBjdXJyZW5jeSB0eXBlIHVzZWQgdG8gcGF5IGZvciB0aGUgZW50aXR5LiBVc2UgSVNPLTQyMTcgZm9yIHRoZSAzIGxldHRlciBjdXJyZW5jeSBjb2RlLiAqLworCisgICAgICAvKiBMZWdhbCAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfQ09QWVJJR0hULCBHU1RfVEFHX0NPUFlSSUdIVH0sIHsKKyAgICBHU1RfTUFUUk9TS0FfVEFHX0lEX1BST0RVQ1RJT05fQ09QWVJJR0hULCBHU1RfVEFHX0NPUFlSSUdIVH0sIHsgICAgIC8qIFRoZSBjb3B5cmlnaHQgaW5mb3JtYXRpb24gYXMgcGVyIHRoZSBwcm9kdWN0aW9uIGNvcHlyaWdodCBob2xkZXIuIFRoaXMgaXMgYWtpbiB0byB0aGUgVFBSTyB0YWcgaW4gSUQzLiAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfTElDRU5TRSwgR1NUX1RBR19MSUNFTlNFfSwgeyAgICAvKiBUaGUgbGljZW5zZSBhcHBsaWVkIHRvIHRoZSBjb250ZW50IChsaWtlIENyZWF0aXZlIENvbW1vbnMgdmFyaWFudHMpLiAqLworICAgIEdTVF9NQVRST1NLQV9UQUdfSURfVEVSTVNfT0ZfVVNFLCBHU1RfVEFHX0xJQ0VOU0V9CisgIH07CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QKKyAgeworICAgIGNvbnN0IGdjaGFyICptYXRyb3NrYV90YWduYW1lOworICAgIGNvbnN0IGdjaGFyICpnc3RyZWFtZXJfdGFnbmFtZTsKKyAgfQorICBjaGlsZF90YWdfY29udltdID0geworICAgIHsKKyAgICAiVElUTEUvU09SVF9XSVRIPSIsIEdTVF9UQUdfVElUTEVfU09SVE5BTUV9LCB7CisgICAgIkFSVElTVC9TT1JUX1dJVEg9IiwgR1NUX1RBR19BUlRJU1RfU09SVE5BTUV9LCB7CisgICAgICAvKiBBTEJVTS1zdHVmZiBpcyBoYW5kbGVkIGVsc2V3aGVyZSAqLworICAgICJDT01QT1NFUi9TT1JUX1dJVEg9IiwgR1NUX1RBR19USVRMRV9TT1JUTkFNRX0sIHsKKyAgICAiT1JJR0lOQUwvVVJMPSIsIEdTVF9UQUdfTE9DQVRJT059LCB7CisgICAgICAvKiBFTUFJTCwgUEhPTkUsIEZBWCBhbGwgY2FuIGJlIG1hcHBlZCB0byBHU1RfVEFHX0NPTlRBQ1QsIHRoZXJlIGlzIHNwZWNpYWwKKyAgICAgICAqIGNvZGUgZm9yIHRoYXQgbGF0ZXIuCisgICAgICAgKi8KKyAgICAiVElUTEUvVVJMPSIsIEdTVF9UQUdfSE9NRVBBR0V9LCB7CisgICAgIkFSVElTVC9VUkw9IiwgR1NUX1RBR19IT01FUEFHRX0sIHsKKyAgICAiQ09QWVJJR0hUL1VSTD0iLCBHU1RfVEFHX0NPUFlSSUdIVF9VUkl9LCB7CisgICAgIkxJQ0VOU0UvVVJMPSIsIEdTVF9UQUdfTElDRU5TRV9VUkl9LCB7CisgICAgIkxJQ0VOU0UvVVJMPSIsIEdTVF9UQUdfTElDRU5TRV9VUkl9CisgIH07CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludDMyIGlkOworICBnY2hhciAqdmFsdWUgPSBOVUxMOworICBnY2hhciAqdGFnID0gTlVMTDsKKyAgZ2NoYXIgKm5hbWVfd2l0aF9wYXJlbnQgPSBOVUxMOworICBHc3RUYWdMaXN0ICpjaGlsZF90YWdsaXN0ID0gTlVMTDsKKworICBERUJVR19FTEVNRU5UX1NUQVJUIChjb21tb24sIGVibWwsICJTaW1wbGVUYWciKTsKKworICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfbWFzdGVyIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykgeworICAgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiU2ltcGxlVGFnIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgaWYgKHBhcmVudCkKKyAgICBjaGlsZF90YWdsaXN0ID0gKnBfdGFnbGlzdDsKKyAgZWxzZQorICAgIGNoaWxkX3RhZ2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIC8qIHJlYWQgYWxsIHN1Yi1lbnRyaWVzICovCisKKyAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3BlZWtfaWQgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UQUdOQU1FOgorICAgICAgICBnX2ZyZWUgKHRhZyk7CisgICAgICAgIHRhZyA9IE5VTEw7CisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfYXNjaWkgKGVibWwsICZpZCwgJnRhZyk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIlRhZ05hbWU6ICVzIiwgR1NUX1NUUl9OVUxMICh0YWcpKTsKKyAgICAgICAgZ19mcmVlIChuYW1lX3dpdGhfcGFyZW50KTsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBOVUxMKQorICAgICAgICAgIG5hbWVfd2l0aF9wYXJlbnQgPSBnX3N0cmR1cF9wcmludGYgKCIlcy8lcyIsIHBhcmVudCwgdGFnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG5hbWVfd2l0aF9wYXJlbnQgPSBnX3N0cmR1cCAodGFnKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RBR1NUUklORzoKKyAgICAgICAgZ19mcmVlICh2YWx1ZSk7CisgICAgICAgIHZhbHVlID0gTlVMTDsKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF91dGY4IChlYm1sLCAmaWQsICZ2YWx1ZSk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgIlRhZ1N0cmluZzogJXMiLAorICAgICAgICAgICAgR1NUX1NUUl9OVUxMICh2YWx1ZSkpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfU0lNUExFVEFHOgorICAgICAgICAvKiBSZWN1cnNpdmUgU2ltcGxlVGFnICovCisgICAgICAgIC8qIFRoaXMgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGFnIG5hbWUgb2YgX3RoaXNfIHRhZyB0byBiZSBrbm93bgorICAgICAgICAgKiBpbiBvcmRlciB0byByZWFkIGl0cyBjaGlsZHJlbi4gSXQncyBub3QgaW4gdGhlIHNwZWMsIGp1c3QgdGhlIHdheQorICAgICAgICAgKiB0aGUgY29kZSBpcyB3cml0dGVuLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKG5hbWVfd2l0aF9wYXJlbnQgIT0gTlVMTCkgeworICAgICAgICAgIHJldCA9IGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9tZXRhZGF0YV9pZF9zaW1wbGVfdGFnIChjb21tb24sCisgICAgICAgICAgICAgIGVibWwsICZjaGlsZF90YWdsaXN0LCBuYW1lX3dpdGhfcGFyZW50KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX3NraXAgKGNvbW1vbiwgZWJtbCwgIlNpbXBsZVRhZyIsCisgICAgICAgICAgICBpZCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UQUdMQU5HVUFHRToKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX1RBR0RFRkFVTFQ6CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9UQUdCSU5BUlk6CisgICAgICAgIHJldCA9IGdzdF9lYm1sX3JlYWRfc2tpcCAoZWJtbCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiU2ltcGxlVGFnIiwgcmV0KTsKKworICBpZiAocGFyZW50ICYmIHRhZyAmJiB2YWx1ZSAmJiAqdmFsdWUgIT0gJ1wwJykgeworICAgIC8qIERvbid0IGJvdGhlciBtYXBwaW5nIGNoaWxkcmVuIHRhZ3MgLSBwYXJlbnQgd2lsbCBkbyB0aGF0ICovCisgICAgZ2NoYXIgKmtleV92YWw7CisgICAgLyogVE9ETzogcmVhZCBMQU5HVUFHRSBzdWItdGFnLCBhbmQgdXNlICJrZXlbbGNdPXZhbCIgZm9ybSAqLworICAgIGtleV92YWwgPSBnX3N0cmR1cF9wcmludGYgKCIlcz0lcyIsIG5hbWVfd2l0aF9wYXJlbnQsIHZhbHVlKTsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICgqcF90YWdsaXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgR1NUX1RBR19FWFRFTkRFRF9DT01NRU5ULCBrZXlfdmFsLCBOVUxMKTsKKyAgICBnX2ZyZWUgKGtleV92YWwpOworICB9IGVsc2UgaWYgKHRhZyAmJiB2YWx1ZSAmJiAqdmFsdWUgIT0gJ1wwJykgeworICAgIGdib29sZWFuIG1hdGNoZWQgPSBGQUxTRTsKKyAgICBndWludCBpOworCisgICAgZm9yIChpID0gMDsgIW1hdGNoZWQgJiYgaSA8IEdfTl9FTEVNRU5UUyAodGFnX2NvbnYpOyBpKyspIHsKKyAgICAgIGNvbnN0IGdjaGFyICp0YWduYW1lX2dzdCA9IHRhZ19jb252W2ldLmdzdHJlYW1lcl90YWduYW1lOworCisgICAgICBjb25zdCBnY2hhciAqdGFnbmFtZV9ta3YgPSB0YWdfY29udltpXS5tYXRyb3NrYV90YWduYW1lOworCisgICAgICBpZiAoc3RyY21wICh0YWduYW1lX21rdiwgdGFnKSA9PSAwKSB7CisgICAgICAgIEdWYWx1ZSBkZXN0ID0geyAwLCB9OworICAgICAgICBHVHlwZSBkZXN0X3R5cGUgPSBnc3RfdGFnX2dldF90eXBlICh0YWduYW1lX2dzdCk7CisKKyAgICAgICAgLyogRW5zdXJlIHRoYXQgYW55IGRhdGUgc3RyaW5nIGlzIGNvbXBsZXRlICovCisgICAgICAgIGlmIChkZXN0X3R5cGUgPT0gR19UWVBFX0RBVEUpIHsKKyAgICAgICAgICBndWludCB5ZWFyID0gMTkwMSwgbW9udGggPSAxLCBkYXkgPSAxOworCisgICAgICAgICAgLyogRGF0ZXMgY2FuIGJlIHl5eXktTU0tZGQsIHl5eXktTU0gb3IgeXl5eSwgYnV0IHdlIG5lZWQKKyAgICAgICAgICAgKiB0aGUgZmlyc3QgdHlwZSAqLworICAgICAgICAgIGlmIChzc2NhbmYgKHZhbHVlLCAiJTA0dS0lMDJ1LSUwMnUiLCAmeWVhciwgJm1vbnRoLCAmZGF5KSAhPSAwKSB7CisgICAgICAgICAgICBnX2ZyZWUgKHZhbHVlKTsKKyAgICAgICAgICAgIHZhbHVlID0gZ19zdHJkdXBfcHJpbnRmICgiJTA0dS0lMDJ1LSUwMnUiLCB5ZWFyLCBtb250aCwgZGF5KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBnX3ZhbHVlX2luaXQgKCZkZXN0LCBkZXN0X3R5cGUpOworICAgICAgICBpZiAoZ3N0X3ZhbHVlX2Rlc2VyaWFsaXplICgmZGVzdCwgdmFsdWUpKSB7CisgICAgICAgICAgZ3N0X3RhZ19saXN0X2FkZF92YWx1ZXMgKCpwX3RhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgICAgICAgICB0YWduYW1lX2dzdCwgJmRlc3QsIE5VTEwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiQ2FuJ3QgdHJhbnNmb3JtIHRhZyAnJXMnIHdpdGggIgorICAgICAgICAgICAgICAidmFsdWUgJyVzJyB0byB0YXJnZXQgdHlwZSAnJXMnIiwgdGFnLCB2YWx1ZSwKKyAgICAgICAgICAgICAgZ190eXBlX25hbWUgKGRlc3RfdHlwZSkpOworICAgICAgICB9CisgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZkZXN0KTsKKyAgICAgICAgbWF0Y2hlZCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICAgIGlmICghbWF0Y2hlZCkgeworICAgICAgZ2NoYXIgKmtleV92YWw7CisgICAgICAvKiBUT0RPOiByZWFkIExBTkdVQUdFIHN1Yi10YWcsIGFuZCB1c2UgImtleVtsY109dmFsIiBmb3JtICovCisgICAgICBrZXlfdmFsID0gZ19zdHJkdXBfcHJpbnRmICgiJXM9JXMiLCB0YWcsIHZhbHVlKTsKKyAgICAgIGdzdF90YWdfbGlzdF9hZGQgKCpwX3RhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgICAgIEdTVF9UQUdfRVhURU5ERURfQ09NTUVOVCwga2V5X3ZhbCwgTlVMTCk7CisgICAgICBnX2ZyZWUgKGtleV92YWwpOworICAgIH0KKyAgfQorCisgIGlmICghcGFyZW50KSB7CisgICAgLyogTWFwIGNoaWxkcmVuIHRhZ3MuIFRoaXMgb25seSBzdXBwb3J0cyB0b3AtYW5jaG9yZWQgbWFwcGluZy4gVGhhdCBpcywKKyAgICAgKiB3ZSBzdGFydCBhdCB0b3BsZXZlbCB0YWcgKHRoaXMgdGFnKSwgYW5kIHNlZSBob3cgaXRzIGNvbWJpbmF0aW9ucworICAgICAqIHdpdGggaXRzIGNoaWxkcmVuIGNhbiBiZSBtYXBwZWQuIFdoaWNoIG1lYW5zIHRoYXQgZ3JhbmRjaGlsZHJlbgorICAgICAqIGFyZSBhbHNvIGNvbWJpbmVkIGhlcmUsIHdpdGggX3RoaXNfIHRhZyB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uCisgICAgICogSWYgZ3JhbmRjaGlsZHJlbiBjYW4gYmUgY29tYmluZWQgb25seSB3aXRoIGNoaWxkcmVuLCB0aGF0IGNvbWJpbmF0aW9uCisgICAgICogd2lsbCBub3QgaGFwcGVuLgorICAgICAqLworICAgIGdpbnQgY2hpbGRfdGFnc19uID0gZ3N0X3RhZ19saXN0X25fdGFncyAoY2hpbGRfdGFnbGlzdCk7CisgICAgaWYgKGNoaWxkX3RhZ3NfbiA+IDApIHsKKyAgICAgIGdpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGlsZF90YWdzX247IGkrKykgeworICAgICAgICBnaW50IGo7CisgICAgICAgIGNvbnN0IGdjaGFyICpjaGlsZF9uYW1lID0gZ3N0X3RhZ19saXN0X250aF90YWdfbmFtZSAoY2hpbGRfdGFnbGlzdCwgaSk7CisgICAgICAgIGd1aW50IHRhZ2xlbiA9IGdzdF90YWdfbGlzdF9nZXRfdGFnX3NpemUgKGNoaWxkX3RhZ2xpc3QsIGNoaWxkX25hbWUpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGFnbGVuOyBqKyspIHsKKyAgICAgICAgICBnY2hhciAqdmFsOworICAgICAgICAgIGdib29sZWFuIG1hdGNoZWQgPSBGQUxTRTsKKyAgICAgICAgICBnY2hhciAqdmFsX3ByZSwgKnZhbF9wb3N0OworICAgICAgICAgIGdpbnQgazsKKworICAgICAgICAgIGlmICghZ3N0X3RhZ19saXN0X2dldF9zdHJpbmdfaW5kZXggKGNoaWxkX3RhZ2xpc3QsIGNoaWxkX25hbWUsCisgICAgICAgICAgICAgICAgICBqLCAmdmFsKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGlmICghc3RyY2hyICh2YWwsICc9JykpIHsKKyAgICAgICAgICAgIGdfZnJlZSAodmFsKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICB2YWxfcG9zdCA9IGdfc3RyZHVwIChzdHJjaHIgKHZhbCwgJz0nKSArIDEpOworICAgICAgICAgIHZhbF9wcmUgPSBnX3N0cmR1cCAodmFsKTsKKyAgICAgICAgICAqKHN0cmNociAodmFsX3ByZSwgJz0nKSArIDEpID0gJ1wwJzsKKworICAgICAgICAgIGZvciAoayA9IDA7ICFtYXRjaGVkICYmIGsgPCBHX05fRUxFTUVOVFMgKGNoaWxkX3RhZ19jb252KTsgaysrKSB7CisgICAgICAgICAgICBjb25zdCBnY2hhciAqdGFnbmFtZV9nc3QgPSBjaGlsZF90YWdfY29udltrXS5nc3RyZWFtZXJfdGFnbmFtZTsKKworICAgICAgICAgICAgY29uc3QgZ2NoYXIgKnRhZ25hbWVfbWt2ID0gY2hpbGRfdGFnX2NvbnZba10ubWF0cm9za2FfdGFnbmFtZTsKKworICAgICAgICAgICAgLyogVE9ETzogT25jZSAia2V5W2xjXT12YWx1ZSIgZm9ybSBzdXBwb3J0IGlzIGltcGxlbWVudGVkLAorICAgICAgICAgICAgICogc3RyaXAgW2xjXSBoZXJlLiBJdCBjYW4ndCBiZSB1c2VkIGluIGNvbWJpbmVkIHRhZ3MuCisgICAgICAgICAgICAgKiBJZiBhIHRhZyBpcyBub3QgY29tYmluZWQsIGxlYXZlIFtsY10gYXMgaXQgaXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChzdHJjbXAgKHRhZ25hbWVfbWt2LCB2YWxfcHJlKSA9PSAwKSB7CisgICAgICAgICAgICAgIEdWYWx1ZSBkZXN0ID0geyAwLCB9OworICAgICAgICAgICAgICBHVHlwZSBkZXN0X3R5cGUgPSBnc3RfdGFnX2dldF90eXBlICh0YWduYW1lX2dzdCk7CisKKyAgICAgICAgICAgICAgZ192YWx1ZV9pbml0ICgmZGVzdCwgZGVzdF90eXBlKTsKKyAgICAgICAgICAgICAgaWYgKGdzdF92YWx1ZV9kZXNlcmlhbGl6ZSAoJmRlc3QsIHZhbF9wb3N0KSkgeworICAgICAgICAgICAgICAgIGdzdF90YWdfbGlzdF9hZGRfdmFsdWVzICgqcF90YWdsaXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgICAgICAgICAgICAgdGFnbmFtZV9nc3QsICZkZXN0LCBOVUxMKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAgICAgICAgICAgIkNhbid0IHRyYW5zZm9ybSBjb21wbGV4IHRhZyAnJXMnICIgInRvIHRhcmdldCB0eXBlICclcyciLAorICAgICAgICAgICAgICAgICAgICB2YWwsIGdfdHlwZV9uYW1lIChkZXN0X3R5cGUpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmZGVzdCk7CisgICAgICAgICAgICAgIG1hdGNoZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIW1hdGNoZWQpIHsKKyAgICAgICAgICAgIGdjaGFyICpsYXN0X3NsYXNoID0gc3RycmNociAodmFsX3ByZSwgJy8nKTsKKyAgICAgICAgICAgIGlmIChsYXN0X3NsYXNoKSB7CisgICAgICAgICAgICAgIGxhc3Rfc2xhc2grKzsKKyAgICAgICAgICAgICAgaWYgKHN0cmNtcCAobGFzdF9zbGFzaCwgIkVNQUlMPSIpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgIHN0cmNtcCAobGFzdF9zbGFzaCwgIlBIT05FPSIpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgIHN0cmNtcCAobGFzdF9zbGFzaCwgIkFERFJFU1M9IikgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgc3RyY21wIChsYXN0X3NsYXNoLCAiRkFYPSIpID09IDApIHsKKyAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfYWRkICgqcF90YWdsaXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgICAgICAgICAgICAgR1NUX1RBR19DT05UQUNULCB2YWxfcG9zdCwgTlVMTCk7CisgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IFRSVUU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFtYXRjaGVkKQorICAgICAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAoKnBfdGFnbGlzdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsCisgICAgICAgICAgICAgICAgR1NUX1RBR19FWFRFTkRFRF9DT01NRU5ULCB2YWwsIE5VTEwpOworICAgICAgICAgIGdfZnJlZSAodmFsX3Bvc3QpOworICAgICAgICAgIGdfZnJlZSAodmFsX3ByZSk7CisgICAgICAgICAgZ19mcmVlICh2YWwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGdzdF90YWdfbGlzdF91bnJlZiAoY2hpbGRfdGFnbGlzdCk7CisgIH0KKworICBnX2ZyZWUgKHRhZyk7CisgIGdfZnJlZSAodmFsdWUpOworICBnX2ZyZWUgKG5hbWVfd2l0aF9wYXJlbnQpOworCisgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9jb3VudF9zdHJlYW1zIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgZ2ludCAqIGEsIGdpbnQgKiB2LCBnaW50ICogcykKK3sKKyAgZ2ludCBpOworICBnaW50IHZpZGVvX3N0cmVhbXMgPSAwLCBhdWRpb19zdHJlYW1zID0gMCwgc3VidGl0bGVfc3RyZWFtcyA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvbW1vbi0+c3JjLT5sZW47IGkrKykgeworICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpzdHJlYW07CisKKyAgICBzdHJlYW0gPSBnX3B0cl9hcnJheV9pbmRleCAoY29tbW9uLT5zcmMsIGkpOworICAgIGlmIChzdHJlYW0tPnR5cGUgPT0gR1NUX01BVFJPU0tBX1RSQUNLX1RZUEVfVklERU8pCisgICAgICB2aWRlb19zdHJlYW1zICs9IDE7CisgICAgZWxzZSBpZiAoc3RyZWFtLT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX0FVRElPKQorICAgICAgYXVkaW9fc3RyZWFtcyArPSAxOworICAgIGVsc2UgaWYgKHN0cmVhbS0+dHlwZSA9PSBHU1RfTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRSkKKyAgICAgIHN1YnRpdGxlX3N0cmVhbXMgKz0gMTsKKyAgfQorICAqdiA9IHZpZGVvX3N0cmVhbXM7CisgICphID0gYXVkaW9fc3RyZWFtczsKKyAgKnMgPSBzdWJ0aXRsZV9zdHJlYW1zOworfQorCisKK3N0YXRpYyB2b2lkCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fYXBwbHlfdGFyZ2V0X3R5cGVfZm9yZWFjaCAoY29uc3QgR3N0VGFnTGlzdCAqIGxpc3QsCisgICAgY29uc3QgZ2NoYXIgKiB0YWcsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ3VpbnQgdmFsbGVuOworICBndWludCBpOworICBUYXJnZXRUeXBlQ29udGV4dCAqY3R4ID0gKFRhcmdldFR5cGVDb250ZXh0ICopIHVzZXJfZGF0YTsKKworICB2YWxsZW4gPSBnc3RfdGFnX2xpc3RfZ2V0X3RhZ19zaXplIChsaXN0LCB0YWcpOworICBpZiAodmFsbGVuID09IDApCisgICAgcmV0dXJuOworCisgIGZvciAoaSA9IDA7IGkgPCB2YWxsZW47IGkrKykgeworICAgIGNvbnN0IEdWYWx1ZSAqdmFsX3JlZjsKKworICAgIHZhbF9yZWYgPSBnc3RfdGFnX2xpc3RfZ2V0X3ZhbHVlX2luZGV4IChsaXN0LCB0YWcsIGkpOworICAgIGlmICh2YWxfcmVmID09IE5VTEwpCisgICAgICBjb250aW51ZTsKKworICAgIC8qIFRPRE86IHVzZSB0aGUgb3B0aW9uYWwgY3R4LT50YXJnZXRfdHlwZSBzb21laG93ICovCisgICAgaWYgKHN0cmNtcCAodGFnLCBHU1RfVEFHX1RJVExFKSA9PSAwKSB7CisgICAgICBpZiAoY3R4LT50YXJnZXRfdHlwZV92YWx1ZSA+PSA3MCAmJiAhY3R4LT5hdWRpb19vbmx5KSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGRfdmFsdWUgKGN0eC0+cmVzdWx0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgICAgIEdTVF9UQUdfU0hPV19OQU1FLCB2YWxfcmVmKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgaWYgKGN0eC0+dGFyZ2V0X3R5cGVfdmFsdWUgPj0gNTApIHsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZF92YWx1ZSAoY3R4LT5yZXN1bHQsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgICAgICAgR1NUX1RBR19USVRMRSwgdmFsX3JlZik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfVElUTEVfU09SVE5BTUUpID09IDApIHsKKyAgICAgIGlmIChjdHgtPnRhcmdldF90eXBlX3ZhbHVlID49IDcwICYmICFjdHgtPmF1ZGlvX29ubHkpIHsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZF92YWx1ZSAoY3R4LT5yZXN1bHQsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgICAgICAgR1NUX1RBR19TSE9XX1NPUlROQU1FLCB2YWxfcmVmKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgaWYgKGN0eC0+dGFyZ2V0X3R5cGVfdmFsdWUgPj0gNTApIHsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZF92YWx1ZSAoY3R4LT5yZXN1bHQsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgICAgICAgR1NUX1RBR19USVRMRV9TT1JUTkFNRSwgdmFsX3JlZik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfQVJUSVNUKSA9PSAwKSB7CisgICAgICBpZiAoY3R4LT50YXJnZXRfdHlwZV92YWx1ZSA+PSA1MCkgeworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkX3ZhbHVlIChjdHgtPnJlc3VsdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsCisgICAgICAgICAgICBHU1RfVEFHX0FSVElTVCwgdmFsX3JlZik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfQVJUSVNUX1NPUlROQU1FKSA9PSAwKSB7CisgICAgICBpZiAoY3R4LT50YXJnZXRfdHlwZV92YWx1ZSA+PSA1MCkgeworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkX3ZhbHVlIChjdHgtPnJlc3VsdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsCisgICAgICAgICAgICBHU1RfVEFHX0FSVElTVF9TT1JUTkFNRSwgdmFsX3JlZik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3RyY21wICh0YWcsIEdTVF9UQUdfVFJBQ0tfQ09VTlQpID09IDApIHsKKyAgICAgIGlmIChjdHgtPnRhcmdldF90eXBlX3ZhbHVlID49IDYwKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGRfdmFsdWUgKGN0eC0+cmVzdWx0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgICAgIEdTVF9UQUdfQUxCVU1fVk9MVU1FX0NPVU5ULCB2YWxfcmVmKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChzdHJjbXAgKHRhZywgR1NUX1RBR19UUkFDS19OVU1CRVIpID09IDApIHsKKyAgICAgIGlmIChjdHgtPnRhcmdldF90eXBlX3ZhbHVlID49IDYwICYmICFjdHgtPmF1ZGlvX29ubHkpIHsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZF92YWx1ZSAoY3R4LT5yZXN1bHQsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgICAgICAgR1NUX1RBR19TSE9XX1NFQVNPTl9OVU1CRVIsIHZhbF9yZWYpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSBpZiAoY3R4LT50YXJnZXRfdHlwZV92YWx1ZSA+PSA1MCAmJiAhY3R4LT5hdWRpb19vbmx5KSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGRfdmFsdWUgKGN0eC0+cmVzdWx0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgICAgIEdTVF9UQUdfU0hPV19FUElTT0RFX05VTUJFUiwgdmFsX3JlZik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIGlmIChjdHgtPnRhcmdldF90eXBlX3ZhbHVlID49IDUwKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGRfdmFsdWUgKGN0eC0+cmVzdWx0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgICAgIEdTVF9UQUdfQUxCVU1fVk9MVU1FX05VTUJFUiwgdmFsX3JlZik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICBnc3RfdGFnX2xpc3RfYWRkX3ZhbHVlIChjdHgtPnJlc3VsdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsIHRhZywgdmFsX3JlZik7CisgIH0KK30KKworCitzdGF0aWMgR3N0VGFnTGlzdCAqCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fYXBwbHlfdGFyZ2V0X3R5cGUgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbiwKKyAgICBHc3RUYWdMaXN0ICogdGFnbGlzdCwgZ3VpbnQ2NCB0YXJnZXRfdHlwZV92YWx1ZSwgZ2NoYXIgKiB0YXJnZXRfdHlwZSkKK3sKKyAgVGFyZ2V0VHlwZUNvbnRleHQgY3R4OworICBnaW50IGEgPSAwOworICBnaW50IHYgPSAwOworICBnaW50IHMgPSAwOworCisgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9jb3VudF9zdHJlYW1zIChjb21tb24sICZhLCAmdiwgJnMpOworCisgIGN0eC5hdWRpb19vbmx5ID0gKGEgPiAwICYmIHYgPT0gMCAmJiBzID09IDApOworICBjdHgucmVzdWx0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgY3R4LnRhcmdldF90eXBlX3ZhbHVlID0gdGFyZ2V0X3R5cGVfdmFsdWU7CisgIGN0eC50YXJnZXRfdHlwZSA9IHRhcmdldF90eXBlOworCisgIGdzdF90YWdfbGlzdF9mb3JlYWNoICh0YWdsaXN0LAorICAgICAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2FwcGx5X3RhcmdldF90eXBlX2ZvcmVhY2gsICZjdHgpOworCisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnbGlzdCk7CisgIHJldHVybiBjdHgucmVzdWx0OworfQorCisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfbWV0YWRhdGFfaWRfdGFnIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sLCBHc3RUYWdMaXN0ICoqIHBfdGFnbGlzdCkKK3sKKyAgZ3VpbnQzMiBpZDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdBcnJheSAqY2hhcHRlcl90YXJnZXRzLCAqZWRpdGlvbl90YXJnZXRzLCAqdHJhY2tfdGFyZ2V0czsKKyAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKyAgR0xpc3QgKmN1ciwgKmludGVybmFsX2N1cjsKKyAgZ3VpbnQ2NCB0YXJnZXRfdHlwZV92YWx1ZSA9IDUwOworICBnY2hhciAqdGFyZ2V0X3R5cGUgPSBOVUxMOworCisgIERFQlVHX0VMRU1FTlRfU1RBUlQgKGNvbW1vbiwgZWJtbCwgIlRhZyIpOworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJUYWciLCByZXQpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICBlZGl0aW9uX3RhcmdldHMgPSBnX2FycmF5X25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKGd1aW50NjQpKTsKKyAgY2hhcHRlcl90YXJnZXRzID0gZ19hcnJheV9uZXcgKEZBTFNFLCBGQUxTRSwgc2l6ZW9mIChndWludDY0KSk7CisgIHRyYWNrX3RhcmdldHMgPSBnX2FycmF5X25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKGd1aW50NjQpKTsKKyAgdGFnbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIHRhcmdldF90eXBlID0gTlVMTDsKKworICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmIGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICAvKiByZWFkIGFsbCBzdWItZW50cmllcyAqLworCisgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfU0lNUExFVEFHOgorICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfbWV0YWRhdGFfaWRfc2ltcGxlX3RhZyAoY29tbW9uLAorICAgICAgICAgICAgZWJtbCwgJnRhZ2xpc3QsIE5VTEwpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVEFSR0VUUzoKKyAgICAgICAgZ19mcmVlICh0YXJnZXRfdHlwZSk7CisgICAgICAgIHRhcmdldF90eXBlID0gTlVMTDsKKyAgICAgICAgdGFyZ2V0X3R5cGVfdmFsdWUgPSA1MDsKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX21ldGFkYXRhX3RhcmdldHMgKGNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgIGVkaXRpb25fdGFyZ2V0cywgY2hhcHRlcl90YXJnZXRzLCB0cmFja190YXJnZXRzLAorICAgICAgICAgICAgJnRhcmdldF90eXBlX3ZhbHVlLCAmdGFyZ2V0X3R5cGUpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX3NraXAgKGNvbW1vbiwgZWJtbCwgIlRhZyIsIGlkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJUYWciLCByZXQpOworCisgIHRhZ2xpc3QgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fYXBwbHlfdGFyZ2V0X3R5cGUgKGNvbW1vbiwgdGFnbGlzdCwKKyAgICAgIHRhcmdldF90eXBlX3ZhbHVlLCB0YXJnZXRfdHlwZSk7CisgIGdfZnJlZSAodGFyZ2V0X3R5cGUpOworCisgIC8qIGlmIHRhZyBpcyBjaGFwdGVyL2VkaXRpb24gc3BlY2lmaWMgLSB0cnkgdG8gZmluZCB0aGF0IGVudHJ5ICovCisgIGlmIChHX1VOTElLRUxZIChjaGFwdGVyX3RhcmdldHMtPmxlbiA+IDAgfHwgZWRpdGlvbl90YXJnZXRzLT5sZW4gPiAwIHx8CisgICAgICAgICAgdHJhY2tfdGFyZ2V0cy0+bGVuID4gMCkpIHsKKyAgICBnaW50IGk7CisgICAgaWYgKGNoYXB0ZXJfdGFyZ2V0cy0+bGVuID4gMCB8fCBlZGl0aW9uX3RhcmdldHMtPmxlbiA+IDApIHsKKyAgICAgIGlmIChjb21tb24tPnRvYyA9PSBOVUxMKQorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAgICJGb3VuZCBjaGFwdGVyL2VkaXRpb24gc3BlY2lmaWMgdGFnLCBidXQgVE9DIGlzIG5vdCBwcmVzZW50Iik7CisgICAgICBlbHNlIHsKKyAgICAgICAgY3VyID0gZ3N0X3RvY19nZXRfZW50cmllcyAoY29tbW9uLT50b2MpOworICAgICAgICBpbnRlcm5hbF9jdXIgPSBnc3RfdG9jX2dldF9lbnRyaWVzIChjb21tb24tPmludGVybmFsX3RvYyk7CisgICAgICAgIHdoaWxlIChjdXIgIT0gTlVMTCAmJiBpbnRlcm5hbF9jdXIgIT0gTlVMTCkgeworICAgICAgICAgIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV90b2NfdGFnIChjdXItPmRhdGEsIGludGVybmFsX2N1ci0+ZGF0YSwKKyAgICAgICAgICAgICAgZWRpdGlvbl90YXJnZXRzLCBjaGFwdGVyX3RhcmdldHMsIHRhZ2xpc3QpOworICAgICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKKyAgICAgICAgICBpbnRlcm5hbF9jdXIgPSBpbnRlcm5hbF9jdXItPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgY29tbW9uLT50b2NfdXBkYXRlZCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCB0cmFja190YXJnZXRzLT5sZW47IGkrKykgeworICAgICAgZ2ludCBqOworICAgICAgZ2Jvb2xlYW4gZm91bmQgPSBGQUxTRTsKKyAgICAgIGd1aW50NjQgdGd0ID0gZ19hcnJheV9pbmRleCAodHJhY2tfdGFyZ2V0cywgZ3VpbnQ2NCwgaSk7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBjb21tb24tPnNyYy0+bGVuOyBqKyspIHsKKyAgICAgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKnN0cmVhbSA9IGdfcHRyX2FycmF5X2luZGV4IChjb21tb24tPnNyYywgaik7CisKKyAgICAgICAgaWYgKHN0cmVhbS0+dWlkID09IHRndCkgeworICAgICAgICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKHN0cmVhbS0+dGFncywgdGFnbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFKTsKKyAgICAgICAgICBzdHJlYW0tPnRhZ3NfY2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgIC8qIENhY2hlIHRoZSB0cmFjayB0YWdsaXN0OiBwb3NzaWJseSBiZWxvbmdzIHRvIGEgdHJhY2sgdGhhdCB3aWxsIGJlIHBhcnNlZAorICAgICAgICAgICBsYXRlciBpbiBnc3RfbWF0cm9za2FfZGVtdXguYzpnc3RfbWF0cm9za2FfZGVtdXhfYWRkX3N0cmVhbSAoLi4uKSAqLworICAgICAgICBncG9pbnRlciB0cmFja191aWQgPSBHVUlOVF9UT19QT0lOVEVSICh0Z3QpOworICAgICAgICBHc3RUYWdMaXN0ICpjYWNoZWRfdGFnbGlzdCA9CisgICAgICAgICAgICBnX2hhc2hfdGFibGVfbG9va3VwIChjb21tb24tPmNhY2hlZF90cmFja190YWdsaXN0cywgdHJhY2tfdWlkKTsKKyAgICAgICAgaWYgKGNhY2hlZF90YWdsaXN0KQorICAgICAgICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKGNhY2hlZF90YWdsaXN0LCB0YWdsaXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBnc3RfdGFnX2xpc3RfcmVmICh0YWdsaXN0KTsKKyAgICAgICAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChjb21tb24tPmNhY2hlZF90cmFja190YWdsaXN0cywgdHJhY2tfdWlkLAorICAgICAgICAgICAgICB0YWdsaXN0KTsKKyAgICAgICAgfQorICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICAgICAiRm91bmQgdHJhY2stc3BlY2lmaWMgdGFnKHMpLCBidXQgdHJhY2sgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAgICAgIiBpcyBub3Qga25vd24geWV0LCBjYWNoaW5nIiwgdGd0KTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZQorICAgIGdzdF90YWdfbGlzdF9pbnNlcnQgKCpwX3RhZ2xpc3QsIHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5EKTsKKworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ2xpc3QpOworICBnX2FycmF5X3VucmVmIChjaGFwdGVyX3RhcmdldHMpOworICBnX2FycmF5X3VucmVmIChlZGl0aW9uX3RhcmdldHMpOworICBnX2FycmF5X3VucmVmICh0cmFja190YXJnZXRzKTsKKworICByZXR1cm4gcmV0OworfQorCitHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfbWV0YWRhdGEgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbiwKKyAgICBHc3RFbGVtZW50ICogZWwsIEdzdEVibWxSZWFkICogZWJtbCkKK3sKKyAgR3N0VGFnTGlzdCAqdGFnbGlzdDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ3VpbnQzMiBpZDsKKyAgR0xpc3QgKmw7CisgIGd1aW50NjQgY3VycG9zOworCisgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBwYXJzZSBhIHRhZ3MgZWxlbWVudCB0d2ljZSBhbmQKKyAgICogcG9zdCBpdCdzIHRhZ3MgdHdpY2UgKi8KKyAgY3VycG9zID0gZ3N0X2VibWxfcmVhZF9nZXRfcG9zIChlYm1sKTsKKyAgZm9yIChsID0gY29tbW9uLT50YWdzX3BhcnNlZDsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICBndWludDY0ICpwb3MgPSBsLT5kYXRhOworCisgICAgaWYgKCpwb3MgPT0gY3VycG9zKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICAgIlNraXBwaW5nIGFscmVhZHkgcGFyc2VkIFRhZ3MgYXQgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIGN1cnBvcyk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgfQorICB9CisKKyAgY29tbW9uLT50YWdzX3BhcnNlZCA9CisgICAgICBnX2xpc3RfcHJlcGVuZCAoY29tbW9uLT50YWdzX3BhcnNlZCwgZ19zbGljZV9uZXcgKGd1aW50NjQpKTsKKyAgKigoZ3VpbnQ2NCAqKSBjb21tb24tPnRhZ3NfcGFyc2VkLT5kYXRhKSA9IGN1cnBvczsKKyAgLyogZmFsbC10aHJvdWdoICovCisKKyAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBERUJVR19FTEVNRU5UX1NUT1AgKGNvbW1vbiwgZWJtbCwgIlRhZ3MiLCByZXQpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICB0YWdsaXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZ3N0X3RhZ19saXN0X3NldF9zY29wZSAodGFnbGlzdCwgR1NUX1RBR19TQ09QRV9HTE9CQUwpOworICBjb21tb24tPnRvY191cGRhdGVkID0gRkFMU0U7CisKKyAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJiBnc3RfZWJtbF9yZWFkX2hhc19yZW1haW5pbmcgKGVibWwsIDEsIFRSVUUpKSB7CisgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9wZWVrX2lkIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChpZCkgeworICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfVEFHOgorICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfbWV0YWRhdGFfaWRfdGFnIChjb21tb24sIGVibWwsCisgICAgICAgICAgICAmdGFnbGlzdCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2Vfc2tpcCAoY29tbW9uLCBlYm1sLCAiVGFncyIsIGlkKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIEZJWE1FOiBVc2UgdG8gbGltaXQgdGhlIHRhZ3MgdG8gc3BlY2lmaWMgcGFkcyAqLworICAgIH0KKyAgfQorCisgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiVGFncyIsIHJldCk7CisKKyAgaWYgKEdfTElLRUxZICghZ3N0X3RhZ19saXN0X2lzX2VtcHR5ICh0YWdsaXN0KSkpCisgICAgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2ZvdW5kX2dsb2JhbF90YWcgKGNvbW1vbiwgZWwsIHRhZ2xpc3QpOworICBlbHNlCisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdsaXN0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BlZWtfYWRhcHRlciAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLCBndWludAorICAgIHBlZWssIGNvbnN0IGd1aW50OCAqKiBkYXRhKQoreworICAvKiBDYWxsZXIgbmVlZHMgdG8gZ3N0X2FkYXB0ZXJfdW5tYXAuICovCisgICpkYXRhID0gZ3N0X2FkYXB0ZXJfbWFwIChjb21tb24tPmFkYXB0ZXIsIHBlZWspOworICBpZiAoKmRhdGEgPT0gTlVMTCkKKyAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworLyoKKyAqIENhbGxzIHB1bGxfcmFuZ2UgZm9yIChvZmZzZXQsc2l6ZSkgd2l0aG91dCBhZHZhbmNpbmcgb3VyIG9mZnNldAorICovCitHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGVla19ieXRlcyAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLCBndWludDY0CisgICAgb2Zmc2V0LCBndWludCBzaXplLCBHc3RCdWZmZXIgKiogcF9idWYsIGd1aW50OCAqKiBieXRlcykKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgLyogQ2FjaGluZyBoZXJlIGFjdHVhbGx5IG1ha2VzIG11Y2ggbGVzcyBkaWZmZXJlbmNlIHRoYW4gb25lIHdvdWxkIGV4cGVjdC4KKyAgICogV2UgZG8gaXQgbWFpbmx5IHRvIGF2b2lkIHB1bGxpbmcgYnVmZmVycyBvZiAxIGJ5dGUgYWxsIHRoZSB0aW1lICovCisgIGlmIChjb21tb24tPmNhY2hlZF9idWZmZXIpIHsKKyAgICBndWludDY0IGNhY2hlX29mZnNldCA9IEdTVF9CVUZGRVJfT0ZGU0VUIChjb21tb24tPmNhY2hlZF9idWZmZXIpOworICAgIGdzaXplIGNhY2hlX3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChjb21tb24tPmNhY2hlZF9idWZmZXIpOworCisgICAgaWYgKGNhY2hlX29mZnNldCA8PSBjb21tb24tPm9mZnNldCAmJgorICAgICAgICAoY29tbW9uLT5vZmZzZXQgKyBzaXplKSA8PSAoY2FjaGVfb2Zmc2V0ICsgY2FjaGVfc2l6ZSkpIHsKKyAgICAgIGlmIChwX2J1ZikKKyAgICAgICAgKnBfYnVmID0gZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAoY29tbW9uLT5jYWNoZWRfYnVmZmVyLAorICAgICAgICAgICAgR1NUX0JVRkZFUl9DT1BZX0FMTCwgY29tbW9uLT5vZmZzZXQgLSBjYWNoZV9vZmZzZXQsIHNpemUpOworICAgICAgaWYgKGJ5dGVzKSB7CisgICAgICAgIGlmICghY29tbW9uLT5jYWNoZWRfZGF0YSkgeworICAgICAgICAgIGdzdF9idWZmZXJfbWFwIChjb21tb24tPmNhY2hlZF9idWZmZXIsICZjb21tb24tPmNhY2hlZF9tYXAsCisgICAgICAgICAgICAgIEdTVF9NQVBfUkVBRCk7CisgICAgICAgICAgY29tbW9uLT5jYWNoZWRfZGF0YSA9IGNvbW1vbi0+Y2FjaGVkX21hcC5kYXRhOworICAgICAgICB9CisgICAgICAgICpieXRlcyA9IGNvbW1vbi0+Y2FjaGVkX2RhdGEgKyBjb21tb24tPm9mZnNldCAtIGNhY2hlX29mZnNldDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgICB9CisgICAgLyogbm90IGVub3VnaCBkYXRhIGluIHRoZSBjYWNoZSwgZnJlZSBjYWNoZSBhbmQgZ2V0IGEgbmV3IG9uZSAqLworICAgIGlmIChjb21tb24tPmNhY2hlZF9kYXRhKSB7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChjb21tb24tPmNhY2hlZF9idWZmZXIsICZjb21tb24tPmNhY2hlZF9tYXApOworICAgICAgY29tbW9uLT5jYWNoZWRfZGF0YSA9IE5VTEw7CisgICAgfQorICAgIGdzdF9idWZmZXJfdW5yZWYgKGNvbW1vbi0+Y2FjaGVkX2J1ZmZlcik7CisgICAgY29tbW9uLT5jYWNoZWRfYnVmZmVyID0gTlVMTDsKKyAgfQorCisgIC8qIHJlZmlsbCB0aGUgY2FjaGUgKi8KKyAgcmV0ID0gZ3N0X3BhZF9wdWxsX3JhbmdlIChjb21tb24tPnNpbmtwYWQsIGNvbW1vbi0+b2Zmc2V0LAorICAgICAgTUFYIChzaXplLCA2NCAqIDEwMjQpLCAmY29tbW9uLT5jYWNoZWRfYnVmZmVyKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgIGNvbW1vbi0+Y2FjaGVkX2J1ZmZlciA9IE5VTEw7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIGlmIChnc3RfYnVmZmVyX2dldF9zaXplIChjb21tb24tPmNhY2hlZF9idWZmZXIpID49IHNpemUpIHsKKyAgICBpZiAocF9idWYpCisgICAgICAqcF9idWYgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChjb21tb24tPmNhY2hlZF9idWZmZXIsCisgICAgICAgICAgR1NUX0JVRkZFUl9DT1BZX0FMTCwgMCwgc2l6ZSk7CisgICAgaWYgKGJ5dGVzKSB7CisgICAgICBnc3RfYnVmZmVyX21hcCAoY29tbW9uLT5jYWNoZWRfYnVmZmVyLCAmY29tbW9uLT5jYWNoZWRfbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgY29tbW9uLT5jYWNoZWRfZGF0YSA9IGNvbW1vbi0+Y2FjaGVkX21hcC5kYXRhOworICAgICAgKmJ5dGVzID0gY29tbW9uLT5jYWNoZWRfZGF0YTsKKyAgICB9CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CisKKyAgLyogTm90IHBvc3NpYmxlIHRvIGdldCBlbm91Z2ggZGF0YSwgdHJ5IGEgbGFzdCB0aW1lIHdpdGgKKyAgICogcmVxdWVzdGluZyBleGFjdGx5IHRoZSBzaXplIHdlIG5lZWQgKi8KKyAgZ3N0X2J1ZmZlcl91bnJlZiAoY29tbW9uLT5jYWNoZWRfYnVmZmVyKTsKKyAgY29tbW9uLT5jYWNoZWRfYnVmZmVyID0gTlVMTDsKKworICByZXQgPQorICAgICAgZ3N0X3BhZF9wdWxsX3JhbmdlIChjb21tb24tPnNpbmtwYWQsIGNvbW1vbi0+b2Zmc2V0LCBzaXplLAorICAgICAgJmNvbW1vbi0+Y2FjaGVkX2J1ZmZlcik7CisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJwdWxsX3JhbmdlIHJldHVybmVkICVkIiwgcmV0KTsKKyAgICBpZiAocF9idWYpCisgICAgICAqcF9idWYgPSBOVUxMOworICAgIGlmIChieXRlcykKKyAgICAgICpieXRlcyA9IE5VTEw7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIGlmIChnc3RfYnVmZmVyX2dldF9zaXplIChjb21tb24tPmNhY2hlZF9idWZmZXIpIDwgc2l6ZSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiRHJvcHBpbmcgc2hvcnQgYnVmZmVyIGF0IG9mZnNldCAlIgorICAgICAgICBHX0dVSU5UNjRfRk9STUFUICI6IHdhbnRlZCAldSBieXRlcywgZ290ICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMiLAorICAgICAgICBjb21tb24tPm9mZnNldCwgc2l6ZSwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoY29tbW9uLT5jYWNoZWRfYnVmZmVyKSk7CisKKyAgICBnc3RfYnVmZmVyX3VucmVmIChjb21tb24tPmNhY2hlZF9idWZmZXIpOworICAgIGNvbW1vbi0+Y2FjaGVkX2J1ZmZlciA9IE5VTEw7CisgICAgaWYgKHBfYnVmKQorICAgICAgKnBfYnVmID0gTlVMTDsKKyAgICBpZiAoYnl0ZXMpCisgICAgICAqYnl0ZXMgPSBOVUxMOworICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisgIH0KKworICBpZiAocF9idWYpCisgICAgKnBfYnVmID0gZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAoY29tbW9uLT5jYWNoZWRfYnVmZmVyLAorICAgICAgICBHU1RfQlVGRkVSX0NPUFlfQUxMLCAwLCBzaXplKTsKKyAgaWYgKGJ5dGVzKSB7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKGNvbW1vbi0+Y2FjaGVkX2J1ZmZlciwgJmNvbW1vbi0+Y2FjaGVkX21hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBjb21tb24tPmNhY2hlZF9kYXRhID0gY29tbW9uLT5jYWNoZWRfbWFwLmRhdGE7CisgICAgKmJ5dGVzID0gY29tbW9uLT5jYWNoZWRfZGF0YTsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX3B1bGwgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbiwgZ3VpbnQgcGVlaywKKyAgICBndWludDggKiogZGF0YSkKK3sKKyAgcmV0dXJuIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX2J5dGVzIChjb21tb24sIGNvbW1vbi0+b2Zmc2V0LCBwZWVrLAorICAgICAgTlVMTCwgZGF0YSk7Cit9CisKK0dzdEZsb3dSZXR1cm4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX2lkX2xlbmd0aF9wdWxsIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWxlbWVudCAqIGVsLCBndWludDMyICogX2lkLCBndWludDY0ICogX2xlbmd0aCwgZ3VpbnQgKiBfbmVlZGVkKQoreworICByZXR1cm4gZ3N0X2VibWxfcGVla19pZF9sZW5ndGggKF9pZCwgX2xlbmd0aCwgX25lZWRlZCwKKyAgICAgIChHc3RQZWVrRGF0YSkgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BlZWtfcHVsbCwgKGdwb2ludGVyKSBjb21tb24sIGVsLAorICAgICAgY29tbW9uLT5vZmZzZXQpOworfQorCitHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGVla19pZF9sZW5ndGhfcHVzaCAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLAorICAgIEdzdEVsZW1lbnQgKiBlbCwgZ3VpbnQzMiAqIF9pZCwgZ3VpbnQ2NCAqIF9sZW5ndGgsIGd1aW50ICogX25lZWRlZCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgcmV0ID0gZ3N0X2VibWxfcGVla19pZF9sZW5ndGggKF9pZCwgX2xlbmd0aCwgX25lZWRlZCwKKyAgICAgIChHc3RQZWVrRGF0YSkgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BlZWtfYWRhcHRlciwgKGdwb2ludGVyKSBjb21tb24sCisgICAgICBlbCwgY29tbW9uLT5vZmZzZXQpOworCisgIGdzdF9hZGFwdGVyX3VubWFwIChjb21tb24tPmFkYXB0ZXIpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcmVhZF90cmFja19lbmNvZGluZyAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLAorICAgIEdzdEVibWxSZWFkICogZWJtbCwgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKiBjb250ZXh0KQoreworICBHc3RNYXRyb3NrYVRyYWNrRW5jb2RpbmcgZW5jID0geyAwLCB9OworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ3VpbnQzMiBpZDsKKworICBERUJVR19FTEVNRU5UX1NUQVJUIChjb21tb24sIGVibWwsICJDb250ZW50RW5jb2RpbmciKTsKKyAgLyogU2V0IGRlZmF1bHQgdmFsdWVzICovCisgIGVuYy5zY29wZSA9IDE7CisgIC8qIEFsbCBvdGhlciBkZWZhdWx0IHZhbHVlcyBhcmUgMCAqLworCisgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF9tYXN0ZXIgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKSB7CisgICAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJDb250ZW50RW5jb2RpbmciLCByZXQpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICB3aGlsZSAocmV0ID09IEdTVF9GTE9XX09LICYmIGdzdF9lYm1sX3JlYWRfaGFzX3JlbWFpbmluZyAoZWJtbCwgMSwgVFJVRSkpIHsKKyAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3BlZWtfaWQgKGVibWwsICZpZCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICBjYXNlIEdTVF9NQVRST1NLQV9JRF9DT05URU5URU5DT0RJTkdPUkRFUjp7CisgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoIWdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9lbmNvZGluZ19vcmRlcl91bmlxdWUgKGNvbnRleHQtPmVuY29kaW5ncywKKyAgICAgICAgICAgICAgICBudW0pKSB7CisgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgICAiQ29udGVudEVuY29kaW5nT3JkZXIgJSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgICAgICAgICAiaXMgbm90IHVuaXF1ZSBmb3IgdHJhY2sgJSIgR19HVUlOVDY0X0ZPUk1BVCwgbnVtLCBjb250ZXh0LT5udW0pOworICAgICAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgIkNvbnRlbnRFbmNvZGluZ09yZGVyOiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICBlbmMub3JkZXIgPSBudW07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ09OVEVOVEVOQ09ESU5HU0NPUEU6eworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSA+IDcgfHwgbnVtID09IDApIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJJbnZhbGlkIENvbnRlbnRFbmNvZGluZ1Njb3BlICUiCisgICAgICAgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICAgICAiQ29udGVudEVuY29kaW5nU2NvcGU6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgIGVuYy5zY29wZSA9IG51bTsKKworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRFTkNPRElOR1RZUEU6eworICAgICAgICBndWludDY0IG51bTsKKworICAgICAgICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfdWludCAoZWJtbCwgJmlkLCAmbnVtKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bSA+IDEpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsICJJbnZhbGlkIENvbnRlbnRFbmNvZGluZ1R5cGUgJSIKKyAgICAgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChudW0gIT0gMCkgeworICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAgICAgIkVuY3J5cHRlZCB0cmFja3MgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0Iik7CisgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgIkNvbnRlbnRFbmNvZGluZ1R5cGU6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIG51bSk7CisgICAgICAgIGVuYy50eXBlID0gbnVtOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRDT01QUkVTU0lPTjp7CisKKyAgICAgICAgREVCVUdfRUxFTUVOVF9TVEFSVCAoY29tbW9uLCBlYm1sLCAiQ29udGVudENvbXByZXNzaW9uIik7CisKKyAgICAgICAgaWYgKChyZXQgPSBnc3RfZWJtbF9yZWFkX21hc3RlciAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSyAmJgorICAgICAgICAgICAgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRDT01QQUxHTzp7CisgICAgICAgICAgICAgIGd1aW50NjQgbnVtOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcmVhZF91aW50IChlYm1sLCAmaWQsICZudW0pKSAhPSBHU1RfRkxPV19PSykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChudW0gPiAzKSB7CisgICAgICAgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLCAiSW52YWxpZCBDb250ZW50Q29tcEFsZ28gJSIKKyAgICAgICAgICAgICAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgbnVtKTsKKyAgICAgICAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICAgICAgICAgICAiQ29udGVudENvbXBBbGdvOiAlIiBHX0dVSU5UNjRfRk9STUFULCBudW0pOworICAgICAgICAgICAgICBlbmMuY29tcF9hbGdvID0gbnVtOworCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBHU1RfTUFUUk9TS0FfSURfQ09OVEVOVENPTVBTRVRUSU5HUzp7CisgICAgICAgICAgICAgIGd1aW50OCAqZGF0YTsKKyAgICAgICAgICAgICAgZ3VpbnQ2NCBzaXplOworCisgICAgICAgICAgICAgIGlmICgocmV0ID0KKyAgICAgICAgICAgICAgICAgICAgICBnc3RfZWJtbF9yZWFkX2JpbmFyeSAoZWJtbCwgJmlkLCAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKSAhPSBHU1RfRkxPV19PSykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVuYy5jb21wX3NldHRpbmdzID0gZGF0YTsKKyAgICAgICAgICAgICAgZW5jLmNvbXBfc2V0dGluZ3NfbGVuZ3RoID0gc2l6ZTsKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgICAgICAgIkNvbnRlbnRDb21wU2V0dGluZ3Mgb2Ygc2l6ZSAlIiBHX0dVSU5UNjRfRk9STUFULCBzaXplKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAgICAgICAgICJVbmtub3duIENvbnRlbnRDb21wcmVzc2lvbiBzdWJlbGVtZW50IDB4JXggLSBpZ25vcmluZyIsIGlkKTsKKyAgICAgICAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9za2lwIChlYm1sKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiQ29udGVudENvbXByZXNzaW9uIiwgcmV0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRFTkNSWVBUSU9OOgorICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChjb21tb24tPnNpbmtwYWQsCisgICAgICAgICAgICAiRW5jcnlwdGVkIHRyYWNrcyBub3QgeWV0IHN1cHBvcnRlZCIpOworICAgICAgICBnc3RfZWJtbF9yZWFkX3NraXAgKGVibWwpOworICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwKKyAgICAgICAgICAgICJVbmtub3duIENvbnRlbnRFbmNvZGluZyBzdWJlbGVtZW50IDB4JXggLSBpZ25vcmluZyIsIGlkKTsKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9za2lwIChlYm1sKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJDb250ZW50RW5jb2RpbmciLCByZXQpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LICYmIHJldCAhPSBHU1RfRkxPV19FT1MpCisgICAgcmV0dXJuIHJldDsKKworICAvKiBUT0RPOiBDaGVjayBpZiB0aGUgY29tYmluYXRpb24gb2YgdmFsdWVzIGlzIHZhbGlkICovCisKKyAgZ19hcnJheV9hcHBlbmRfdmFsIChjb250ZXh0LT5lbmNvZGluZ3MsIGVuYyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworR3N0Rmxvd1JldHVybgorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3JlYWRfdHJhY2tfZW5jb2RpbmdzIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWJtbFJlYWQgKiBlYm1sLCBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIGNvbnRleHQpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludDMyIGlkOworCisgIERFQlVHX0VMRU1FTlRfU1RBUlQgKGNvbW1vbiwgZWJtbCwgIkNvbnRlbnRFbmNvZGluZ3MiKTsKKworICBpZiAoKHJldCA9IGdzdF9lYm1sX3JlYWRfbWFzdGVyIChlYm1sLCAmaWQpKSAhPSBHU1RfRkxPV19PSykgeworICAgIERFQlVHX0VMRU1FTlRfU1RPUCAoY29tbW9uLCBlYm1sLCAiQ29udGVudEVuY29kaW5ncyIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIGNvbnRleHQtPmVuY29kaW5ncyA9CisgICAgICBnX2FycmF5X3NpemVkX25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKEdzdE1hdHJvc2thVHJhY2tFbmNvZGluZyksIDEpOworCisgIHdoaWxlIChyZXQgPT0gR1NUX0ZMT1dfT0sgJiYgZ3N0X2VibWxfcmVhZF9oYXNfcmVtYWluaW5nIChlYm1sLCAxLCBUUlVFKSkgeworICAgIGlmICgocmV0ID0gZ3N0X2VibWxfcGVla19pZCAoZWJtbCwgJmlkKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgIGNhc2UgR1NUX01BVFJPU0tBX0lEX0NPTlRFTlRFTkNPRElORzoKKyAgICAgICAgcmV0ID0gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3JlYWRfdHJhY2tfZW5jb2RpbmcgKGNvbW1vbiwgZWJtbCwKKyAgICAgICAgICAgIGNvbnRleHQpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29tbW9uLT5zaW5rcGFkLAorICAgICAgICAgICAgIlVua25vd24gQ29udGVudEVuY29kaW5ncyBzdWJlbGVtZW50IDB4JXggLSBpZ25vcmluZyIsIGlkKTsKKyAgICAgICAgcmV0ID0gZ3N0X2VibWxfcmVhZF9za2lwIChlYm1sKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgREVCVUdfRUxFTUVOVF9TVE9QIChjb21tb24sIGVibWwsICJDb250ZW50RW5jb2RpbmdzIiwgcmV0KTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSyAmJiByZXQgIT0gR1NUX0ZMT1dfRU9TKQorICAgIHJldHVybiByZXQ7CisKKyAgLyogU29ydCBlbmNvZGluZ3MgYWNjb3JkaW5nIHRvIHRoZWlyIG9yZGVyICovCisgIGdfYXJyYXlfc29ydCAoY29udGV4dC0+ZW5jb2RpbmdzLAorICAgICAgKEdDb21wYXJlRnVuYykgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2VuY29kaW5nX2NtcCk7CisKKyAgcmV0dXJuIGdzdF9tYXRyb3NrYV9kZWNvZGVfY29udGVudF9lbmNvZGluZ3MgKGNvbnRleHQtPmVuY29kaW5ncyk7Cit9CisKK3ZvaWQKK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9mcmVlX3BhcnNlZF9lbCAoZ3BvaW50ZXIgbWVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGdfc2xpY2VfZnJlZSAoZ3VpbnQ2NCwgbWVtKTsKK30KKwordm9pZAorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2luaXQgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGN0eCkKK3sKKyAgY3R4LT5zcmMgPSBOVUxMOworICBjdHgtPndyaXRpbmdfYXBwID0gTlVMTDsKKyAgY3R4LT5tdXhpbmdfYXBwID0gTlVMTDsKKyAgY3R4LT5pbmRleCA9IE5VTEw7CisgIGN0eC0+Z2xvYmFsX3RhZ3MgPSBOVUxMOworICBjdHgtPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIGN0eC0+dG9jID0gTlVMTDsKKyAgY3R4LT5pbnRlcm5hbF90b2MgPSBOVUxMOworICBjdHgtPnRvY191cGRhdGVkID0gRkFMU0U7CisgIGN0eC0+Y2FjaGVkX3RyYWNrX3RhZ2xpc3RzID0KKyAgICAgIGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X3RhZ19saXN0X3VucmVmKTsKK30KKwordm9pZAorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2ZpbmFsaXplIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjdHgpCit7CisgIGlmIChjdHgtPnNyYykgeworICAgIGdfcHRyX2FycmF5X2ZyZWUgKGN0eC0+c3JjLCBUUlVFKTsKKyAgICBjdHgtPnNyYyA9IE5VTEw7CisgIH0KKworICBpZiAoY3R4LT5nbG9iYWxfdGFncykgeworICAgIGdzdF90YWdfbGlzdF91bnJlZiAoY3R4LT5nbG9iYWxfdGFncyk7CisgICAgY3R4LT5nbG9iYWxfdGFncyA9IE5VTEw7CisgIH0KKworICBpZiAoY3R4LT50b2MpIHsKKyAgICBnc3RfdG9jX3VucmVmIChjdHgtPnRvYyk7CisgICAgY3R4LT50b2MgPSBOVUxMOworICB9CisgIGlmIChjdHgtPmludGVybmFsX3RvYykgeworICAgIGdzdF90b2NfdW5yZWYgKGN0eC0+aW50ZXJuYWxfdG9jKTsKKyAgICBjdHgtPmludGVybmFsX3RvYyA9IE5VTEw7CisgIH0KKworICBjdHgtPnRvY191cGRhdGVkID0gRkFMU0U7CisKKyAgZ19vYmplY3RfdW5yZWYgKGN0eC0+YWRhcHRlcik7CisgIGdfaGFzaF90YWJsZV9yZW1vdmVfYWxsIChjdHgtPmNhY2hlZF90cmFja190YWdsaXN0cyk7CisgIGdfaGFzaF90YWJsZV91bnJlZiAoY3R4LT5jYWNoZWRfdHJhY2tfdGFnbGlzdHMpOworCit9CisKK3ZvaWQKK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9yZXNldCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY3R4KQoreworICBndWludCBpOworCisgIEdTVF9MT0dfT0JKRUNUIChjdHgtPnNpbmtwYWQsICJyZXNldHRpbmcgcmVhZCBjb250ZXh0Iik7CisKKyAgLyogcmVzZXQgaW5wdXQgKi8KKyAgY3R4LT5zdGF0ZSA9IEdTVF9NQVRST1NLQV9SRUFEX1NUQVRFX1NUQVJUOworCisgIC8qIGNsZWFuIHVwIGV4aXN0aW5nIHN0cmVhbXMgaWYgYW55ICovCisgIGlmIChjdHgtPnNyYykgeworICAgIGdfYXNzZXJ0IChjdHgtPnNyYy0+bGVuID09IGN0eC0+bnVtX3N0cmVhbXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPnNyYy0+bGVuOyBpKyspIHsKKyAgICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0ID0gZ19wdHJfYXJyYXlfaW5kZXggKGN0eC0+c3JjLCBpKTsKKworICAgICAgaWYgKGNvbnRleHQtPnBhZCAhPSBOVUxMKQorICAgICAgICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChlbGVtZW50LCBjb250ZXh0LT5wYWQpOworCisgICAgICBnc3RfY2Fwc19yZXBsYWNlICgmY29udGV4dC0+Y2FwcywgTlVMTCk7CisgICAgICBnc3RfbWF0cm9za2FfdHJhY2tfZnJlZSAoY29udGV4dCk7CisgICAgfQorICAgIGdfcHRyX2FycmF5X2ZyZWUgKGN0eC0+c3JjLCBUUlVFKTsKKyAgfQorICBjdHgtPnNyYyA9IGdfcHRyX2FycmF5X25ldyAoKTsKKyAgY3R4LT5udW1fc3RyZWFtcyA9IDA7CisKKyAgLyogcmVzZXQgbWVkaWEgaW5mbyAqLworICBnX2ZyZWUgKGN0eC0+d3JpdGluZ19hcHApOworICBjdHgtPndyaXRpbmdfYXBwID0gTlVMTDsKKyAgZ19mcmVlIChjdHgtPm11eGluZ19hcHApOworICBjdHgtPm11eGluZ19hcHAgPSBOVUxMOworCisgIC8qIHJlc2V0IHN0cmVhbSB0eXBlICovCisgIGN0eC0+aXNfd2VibSA9IEZBTFNFOworICBjdHgtPmhhc192aWRlbyA9IEZBTFNFOworCisgIC8qIHJlc2V0IGluZGV4ZXMgKi8KKyAgaWYgKGN0eC0+aW5kZXgpIHsKKyAgICBnX2FycmF5X2ZyZWUgKGN0eC0+aW5kZXgsIFRSVUUpOworICAgIGN0eC0+aW5kZXggPSBOVUxMOworICB9CisKKyAgLyogcmVzZXQgdGltZXJzICovCisgIGN0eC0+dGltZV9zY2FsZSA9IDEwMDAwMDA7CisgIGN0eC0+Y3JlYXRlZCA9IEdfTUlOSU5UNjQ7CisKKyAgLyogY3Vlcy90cmFja3Mvc2VnbWVudGluZm8gKi8KKyAgY3R4LT5pbmRleF9wYXJzZWQgPSBGQUxTRTsKKyAgY3R4LT5zZWdtZW50aW5mb19wYXJzZWQgPSBGQUxTRTsKKyAgY3R4LT5hdHRhY2htZW50c19wYXJzZWQgPSBGQUxTRTsKKyAgY3R4LT5jaGFwdGVyc19wYXJzZWQgPSBGQUxTRTsKKworICAvKiB0YWdzICovCisgIGN0eC0+Z2xvYmFsX3RhZ3NfY2hhbmdlZCA9IEZBTFNFOworICBnX2xpc3RfZm9yZWFjaCAoY3R4LT50YWdzX3BhcnNlZCwKKyAgICAgIChHRnVuYykgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2ZyZWVfcGFyc2VkX2VsLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGN0eC0+dGFnc19wYXJzZWQpOworICBjdHgtPnRhZ3NfcGFyc2VkID0gTlVMTDsKKyAgaWYgKGN0eC0+Z2xvYmFsX3RhZ3MpIHsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKGN0eC0+Z2xvYmFsX3RhZ3MpOworICB9CisgIGN0eC0+Z2xvYmFsX3RhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3Rfc2V0X3Njb3BlIChjdHgtPmdsb2JhbF90YWdzLCBHU1RfVEFHX1NDT1BFX0dMT0JBTCk7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJmN0eC0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgY3R4LT5vZmZzZXQgPSAwOworICBjdHgtPnN0YXJ0X3Jlc3luY19vZmZzZXQgPSAtMTsKKyAgY3R4LT5zdGF0ZV90b19yZXN0b3JlID0gLTE7CisKKyAgaWYgKGN0eC0+Y2FjaGVkX2J1ZmZlcikgeworICAgIGlmIChjdHgtPmNhY2hlZF9kYXRhKSB7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChjdHgtPmNhY2hlZF9idWZmZXIsICZjdHgtPmNhY2hlZF9tYXApOworICAgICAgY3R4LT5jYWNoZWRfZGF0YSA9IE5VTEw7CisgICAgfQorICAgIGdzdF9idWZmZXJfdW5yZWYgKGN0eC0+Y2FjaGVkX2J1ZmZlcik7CisgICAgY3R4LT5jYWNoZWRfYnVmZmVyID0gTlVMTDsKKyAgfQorCisgIC8qIGZyZWUgY2hhcHRlcnMgVE9DIGlmIGFueSAqLworICBpZiAoY3R4LT50b2MpIHsKKyAgICBnc3RfdG9jX3VucmVmIChjdHgtPnRvYyk7CisgICAgY3R4LT50b2MgPSBOVUxMOworICB9CisgIGlmIChjdHgtPmludGVybmFsX3RvYykgeworICAgIGdzdF90b2NfdW5yZWYgKGN0eC0+aW50ZXJuYWxfdG9jKTsKKyAgICBjdHgtPmludGVybmFsX3RvYyA9IE5VTEw7CisgIH0KKyAgY3R4LT50b2NfdXBkYXRlZCA9IEZBTFNFOworfQorCisvKiBjYWxsIHdpdGggb2JqZWN0IGxvY2sgaGVsZCAqLwordm9pZAorZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3Jlc2V0X3N0cmVhbXMgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbiwKKyAgICBHc3RDbG9ja1RpbWUgdGltZSwgZ2Jvb2xlYW4gZnVsbCkKK3sKKyAgZ2ludCBpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGNvbW1vbi0+c2lua3BhZCwgInJlc2V0dGluZyBzdHJlYW0gc3RhdGUiKTsKKworICBnX2Fzc2VydCAoY29tbW9uLT5zcmMtPmxlbiA9PSBjb21tb24tPm51bV9zdHJlYW1zKTsKKyAgZm9yIChpID0gMDsgaSA8IGNvbW1vbi0+c3JjLT5sZW47IGkrKykgeworICAgIEdzdE1hdHJvc2thVHJhY2tDb250ZXh0ICpjb250ZXh0ID0gZ19wdHJfYXJyYXlfaW5kZXggKGNvbW1vbi0+c3JjLCBpKTsKKyAgICBjb250ZXh0LT5wb3MgPSB0aW1lOworICAgIGNvbnRleHQtPnNldF9kaXNjb250ID0gVFJVRTsKKyAgICBjb250ZXh0LT5lb3MgPSBGQUxTRTsKKyAgICBjb250ZXh0LT5mcm9tX3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgIGlmIChjb250ZXh0LT50eXBlID09IEdTVF9NQVRST1NLQV9UUkFDS19UWVBFX1ZJREVPKSB7CisgICAgICBHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICp2aWRlb2NvbnRleHQgPQorICAgICAgICAgIChHc3RNYXRyb3NrYVRyYWNrVmlkZW9Db250ZXh0ICopIGNvbnRleHQ7CisgICAgICAvKiBkZW11eCBvYmplY3QgbG9jayBoZWxkIGJ5IGNhbGxlciAqLworICAgICAgdmlkZW9jb250ZXh0LT5lYXJsaWVzdF90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICB9CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl90cmFja251bWJlcl91bmlxdWUgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbiwKKyAgICBndWludDY0IG51bSkKK3sKKyAgZ2ludCBpOworCisgIGdfYXNzZXJ0IChjb21tb24tPnNyYy0+bGVuID09IGNvbW1vbi0+bnVtX3N0cmVhbXMpOworICBmb3IgKGkgPSAwOyBpIDwgY29tbW9uLT5zcmMtPmxlbjsgaSsrKSB7CisgICAgR3N0TWF0cm9za2FUcmFja0NvbnRleHQgKmNvbnRleHQgPSBnX3B0cl9hcnJheV9pbmRleCAoY29tbW9uLT5zcmMsIGkpOworCisgICAgaWYgKGNvbnRleHQtPm51bSA9PSBudW0pCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oIGIvZ3N0L21hdHJvc2thL21hdHJvc2thLXJlYWQtY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyODJkNgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS1yZWFkLWNvbW1vbi5oCkBAIC0wLDAgKzEsMTcyIEBACisvKiBHU3RyZWFtZXIgTWF0cm9za2EgbXV4ZXIvZGVtdXhlcgorICogKGMpIDIwMDMgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogKGMpIDIwMTEgRGViYXJzaGkgUmF5IDxyaXNoaUBnbnUub3JnPgorICoKKyAqIG1hdHJvc2thLXJlYWQtY29tbW9uLmg6IHNoYXJlZCBieSBtYXRyb3NrYSBmaWxlL3N0cmVhbSBkZW11eGVyIGFuZCBwYXJzZXIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX01BVFJPU0tBX1JFQURfQ09NTU9OX0hfXworI2RlZmluZSBfX0dTVF9NQVRST1NLQV9SRUFEX0NPTU1PTl9IX18KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorCisjaW5jbHVkZSAibWF0cm9za2EtaWRzLmgiCisKK0dfQkVHSU5fREVDTFMKKworR1NUX0RFQlVHX0NBVEVHT1JZX0VYVEVSTihtYXRyb3NrYXJlYWRjb21tb25fZGVidWcpOworCit0eXBlZGVmIGVudW0geworICBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TVEFSVCwKKyAgR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfU0VHTUVOVCwKKyAgR1NUX01BVFJPU0tBX1JFQURfU1RBVEVfSEVBREVSLAorICBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9EQVRBLAorICBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TRUVLLAorICBHU1RfTUFUUk9TS0FfUkVBRF9TVEFURV9TQ0FOTklORworfSBHc3RNYXRyb3NrYVJlYWRTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1hdHJvc2thUmVhZENvbW1vbiB7CisjaWYgMAorICBHc3RJbmRleCAgICAgICAgICAgICAgICAqZWxlbWVudF9pbmRleDsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfaW5kZXhfd3JpdGVyX2lkOworI2VuZGlmCisKKyAgLyogcGFkcyAqLworICBHc3RQYWQgICAgICAgICAgICAgICAgICAqc2lua3BhZDsKKyAgR1B0ckFycmF5ICAgICAgICAgICAgICAgKnNyYzsKKyAgZ3VpbnQgICAgICAgICAgICAgICAgICAgIG51bV9zdHJlYW1zOworCisgIC8qIG1ldGFkYXRhICovCisgIGdjaGFyICAgICAgICAgICAgICAgICAgICptdXhpbmdfYXBwOworICBnY2hhciAgICAgICAgICAgICAgICAgICAqd3JpdGluZ19hcHA7CisgIGdpbnQ2NCAgICAgICAgICAgICAgICAgICBjcmVhdGVkOworCisgIC8qIHN0YXRlICovCisgIEdzdE1hdHJvc2thUmVhZFN0YXRlICAgICBzdGF0ZTsKKworICAvKiBzdHJlYW0gdHlwZSAqLworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgaXNfd2VibTsKKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIGhhc192aWRlbzsKKworICAvKiBkaWQgd2UgcGFyc2UgY3Vlcy90cmFja3Mvc2VnbWVudGluZm8gYWxyZWFkeT8gKi8KKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIGluZGV4X3BhcnNlZDsKKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIHNlZ21lbnRpbmZvX3BhcnNlZDsKKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzX3BhcnNlZDsKKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgIGNoYXB0ZXJzX3BhcnNlZDsKKyAgR0xpc3QgICAgICAgICAgICAgICAgICAgKnRhZ3NfcGFyc2VkOworCisgIC8qIGNoYXB0ZXJzIHN0dWZmICovCisgIC8qIEludGVybmFsIHRvYyBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGludGVybmFsIFVJRAorICAgKiB3aGljaCBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGV4dGVybmFsIFN0cmluZ1VJRCB1c2VkCisgICAqIGluIHRoZSB1c2VyIHRvYyAqLworICBHc3RUb2MgICAgICAgICAgICAgICAgICAqdG9jOworICBHc3RUb2MgICAgICAgICAgICAgICAgICAqaW50ZXJuYWxfdG9jOworICBnYm9vbGVhbiAgICAgICAgICAgICAgICB0b2NfdXBkYXRlZDsKKworICAvKiBzdGFydC1vZi1zZWdtZW50IGFuZCBsZW5ndGggKi8KKyAgZ3VpbnQ2NCAgICAgICAgICAgICAgICAgIGVibWxfc2VnbWVudF9zdGFydDsKKyAgZ3VpbnQ2NCAgICAgICAgICAgICAgICAgIGVibWxfc2VnbWVudF9sZW5ndGg7CisKKyAgLyogYSBjdWUgKGluZGV4KSB0YWJsZSAqLworICBHQXJyYXkgICAgICAgICAgICAgICAgICAqaW5kZXg7CisKKyAgLyogdGltZXNjYWxlIGluIHRoZSBmaWxlICovCisgIGd1aW50NjQgICAgICAgICAgICAgICAgICB0aW1lX3NjYWxlOworCisgIC8qIGtlZXBpbmcgdHJhY2sgb2YgcGxheWJhY2sgcG9zaXRpb24gKi8KKyAgR3N0U2VnbWVudCAgICAgICAgICAgICAgIHNlZ21lbnQ7CisKKyAgR3N0VGFnTGlzdCAgICAgICAgICAgICAgKmdsb2JhbF90YWdzOworICBnYm9vbGVhbiAgICAgICAgICAgICAgICAgZ2xvYmFsX3RhZ3NfY2hhbmdlZDsKKworICAvKiBwdWxsIG1vZGUgY2FjaGluZyAqLworICBHc3RCdWZmZXIgKmNhY2hlZF9idWZmZXI7CisgIGd1aW50OCAqY2FjaGVkX2RhdGE7CisgIEdzdE1hcEluZm8gY2FjaGVkX21hcDsKKworICAvKiBwdXNoIGFuZCBwdWxsIG1vZGUgKi8KKyAgZ3VpbnQ2NCAgICAgICAgICAgICAgICAgIG9mZnNldDsKKworICBndWludDY0ICAgICAgICAgICAgICAgICAgc3RhcnRfcmVzeW5jX29mZnNldDsKKworICAvKiBzdGF0ZSB0byByZXN0b3JlIGFmdGVyIHNjYW5uaW5nIGZvciBpbnZhbGlkIGRhdGEgKi8KKyAgZ2ludCAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3RvX3Jlc3RvcmU7CisKKyAgLyogcHVzaCBiYXNlZCBtb2RlIHVzdWFsIHN1c3BlY3RzICovCisgIEdzdEFkYXB0ZXIgICAgICAgICAgICAgICphZGFwdGVyOworCisgIC8qIGNhY2hlIGZvciB0cmFjayB0YWdzIHRoYXQgZm9yd2FyZC1yZWZlcmVuY2UgdGhlaXIgdHJhY2tzICovCisgIEdIYXNoVGFibGUgKmNhY2hlZF90cmFja190YWdsaXN0cyA7CisgCit9IEdzdE1hdHJvc2thUmVhZENvbW1vbjsKKworR3N0Rmxvd1JldHVybiBnc3RfbWF0cm9za2FfZGVjb2RlX2NvbnRlbnRfZW5jb2RpbmdzIChHQXJyYXkgKiBlbmNvZGluZ3MpOworZ2Jvb2xlYW4gZ3N0X21hdHJvc2thX2RlY29kZV9kYXRhIChHQXJyYXkgKiBlbmNvZGluZ3MsIGdwb2ludGVyICogZGF0YV9vdXQsCisgICAgZ3NpemUgKiBzaXplX291dCwgR3N0TWF0cm9za2FUcmFja0VuY29kaW5nU2NvcGUgc2NvcGUsIGdib29sZWFuIGZyZWUpOworZ2ludCBnc3RfbWF0cm9za2FfaW5kZXhfc2Vla19maW5kIChHc3RNYXRyb3NrYUluZGV4ICogaTEsIEdzdENsb2NrVGltZSAqIHRpbWUsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK0dzdE1hdHJvc2thSW5kZXggKiBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZG9faW5kZXhfc2VlayAoCisgICAgR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLCBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIHRyYWNrLCBnaW50NjQKKyAgICBzZWVrX3BvcywgR0FycmF5ICoqIF9pbmRleCwgZ2ludCAqIF9lbnRyeV9pbmRleCwgR3N0U2VhcmNoTW9kZSBzbmFwX2Rpcik7Cit2b2lkIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9mb3VuZF9nbG9iYWxfdGFnIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgR3N0RWxlbWVudCAqIGVsLCBHc3RUYWdMaXN0ICogdGFnbGlzdCk7CitnaW50NjQgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2dldF9sZW5ndGggKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGNvbW1vbik7CitHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9nZXRfc2Vla190cmFjayAoCisgICAgR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLCBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIHRyYWNrKTsKK0dzdEZsb3dSZXR1cm4gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX2luZGV4IChHc3RNYXRyb3NrYVJlYWRDb21tb24gKgorICAgIGNvbW1vbiwgR3N0RWJtbFJlYWQgKiBlYm1sKTsKK0dzdEZsb3dSZXR1cm4gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BhcnNlX2luZm8gKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqCisgICAgY29tbW9uLCBHc3RFbGVtZW50ICogZWwsIEdzdEVibWxSZWFkICogZWJtbCk7CitHc3RGbG93UmV0dXJuIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9hdHRhY2htZW50cyAoCisgICAgR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLCBHc3RFbGVtZW50ICogZWwsIEdzdEVibWxSZWFkICogZWJtbCk7CitHc3RGbG93UmV0dXJuIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9jaGFwdGVycyAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICoKKyAgICBjb21tb24sIEdzdEVibWxSZWFkICogZWJtbCk7CitHc3RGbG93UmV0dXJuIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9oZWFkZXIgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqCisgICAgY29tbW9uLCBHc3RFYm1sUmVhZCAqIGVibWwpOworR3N0Rmxvd1JldHVybiBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcGFyc2VfbWV0YWRhdGEgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqCisgICAgY29tbW9uLCBHc3RFbGVtZW50ICogZWwsIEdzdEVibWxSZWFkICogZWJtbCk7CitHc3RGbG93UmV0dXJuIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wYXJzZV9za2lwIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKgorICAgIGNvbW1vbiwgR3N0RWJtbFJlYWQgKiBlYm1sLCBjb25zdCBnY2hhciAqIHBhcmVudF9uYW1lLCBndWludCBpZCk7CitHc3RGbG93UmV0dXJuIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX2J5dGVzIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKgorICAgIGNvbW1vbiwgZ3VpbnQ2NCBvZmZzZXQsIGd1aW50IHNpemUsIEdzdEJ1ZmZlciAqKiBwX2J1ZiwgZ3VpbnQ4ICoqIGJ5dGVzKTsKK0dzdEZsb3dSZXR1cm4gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3BlZWtfaWRfbGVuZ3RoX3B1bGwgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqCisgICAgY29tbW9uLCBHc3RFbGVtZW50ICogZWwsIGd1aW50MzIgKiBfaWQsIGd1aW50NjQgKiBfbGVuZ3RoLCBndWludCAqCisgICAgX25lZWRlZCk7CitHc3RGbG93UmV0dXJuIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9wZWVrX2lkX2xlbmd0aF9wdXNoIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKgorICAgIGNvbW1vbiwgR3N0RWxlbWVudCAqIGVsLCBndWludDMyICogX2lkLCBndWludDY0ICogX2xlbmd0aCwgZ3VpbnQgKgorICAgIF9uZWVkZWQpOworZ2ludCBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fc3RyZWFtX2Zyb21fbnVtIChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sCisgICAgZ3VpbnQgdHJhY2tfbnVtKTsKK0dzdEZsb3dSZXR1cm4gZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX3JlYWRfdHJhY2tfZW5jb2RpbmdzICgKKyAgICBHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjb21tb24sIEdzdEVibWxSZWFkICogZWJtbCwKKyAgICBHc3RNYXRyb3NrYVRyYWNrQ29udGV4dCAqIGNvbnRleHQpOwordm9pZCBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fcmVzZXRfc3RyZWFtcyAoR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY29tbW9uLAorICAgIEdzdENsb2NrVGltZSB0aW1lLCBnYm9vbGVhbiBmdWxsKTsKK3ZvaWQgZ3N0X21hdHJvc2thX3JlYWRfY29tbW9uX2ZyZWVfcGFyc2VkX2VsIChncG9pbnRlciBtZW0sIGdwb2ludGVyIHVzZXJfZGF0YSk7Cit2b2lkIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9pbml0IChHc3RNYXRyb3NrYVJlYWRDb21tb24gKiBjdHgpOwordm9pZCBnc3RfbWF0cm9za2FfcmVhZF9jb21tb25fZmluYWxpemUgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqIGN0eCk7Cit2b2lkIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl9yZXNldCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0TWF0cm9za2FSZWFkQ29tbW9uICogY3R4KTsKK2dib29sZWFuIGdzdF9tYXRyb3NrYV9yZWFkX2NvbW1vbl90cmFja251bWJlcl91bmlxdWUgKEdzdE1hdHJvc2thUmVhZENvbW1vbiAqCisgICAgY29tbW9uLCBndWludDY0IG51bSk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9NQVRST1NLQV9SRUFEX0NPTU1PTl9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS5jIGIvZ3N0L21hdHJvc2thL21hdHJvc2thLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU0Mzk3MgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tYXRyb3NrYS9tYXRyb3NrYS5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qIEdTdHJlYW1lciBNYXRyb3NrYSBtdXhlci9kZW11eGVyCisgKiAoYykgMjAwMyBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKgorICogbWF0cm9za2EuYzogcGx1Z2luIGxvYWRlcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgIm1hdHJvc2thLWRlbXV4LmgiCisjaW5jbHVkZSAibWF0cm9za2EtcGFyc2UuaCIKKyNpbmNsdWRlICJtYXRyb3NrYS1yZWFkLWNvbW1vbi5oIgorI2luY2x1ZGUgIm1hdHJvc2thLW11eC5oIgorI2luY2x1ZGUgIm1hdHJvc2thLWlkcy5oIgorI2luY2x1ZGUgIndlYm0tbXV4LmgiCisKKyNpbmNsdWRlIDxnc3QvcGJ1dGlscy9wYnV0aWxzLmg+CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgZ2Jvb2xlYW4gcmV0OworCisgIGdzdF9wYl91dGlsc19pbml0ICgpOworCisgIGdzdF9tYXRyb3NrYV9yZWdpc3Rlcl90YWdzICgpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChtYXRyb3NrYXJlYWRjb21tb25fZGVidWcsICJtYXRyb3NrYXJlYWRjb21tb24iLCAwLAorICAgICAgIk1hdHJvc2thIGRlbXV4ZXIvcGFyc2VyIHNoYXJlZCBkZWJ1ZyIpOworCisgIHJldCA9IGdzdF9tYXRyb3NrYV9kZW11eF9wbHVnaW5faW5pdCAocGx1Z2luKTsKKyAgcmV0ICY9IGdzdF9tYXRyb3NrYV9wYXJzZV9wbHVnaW5faW5pdCAocGx1Z2luKTsKKyAgcmV0ICY9IGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJtYXRyb3NrYW11eCIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICBHU1RfVFlQRV9NQVRST1NLQV9NVVgpOworICByZXQgJj0gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIndlYm1tdXgiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgR1NUX1RZUEVfV0VCTV9NVVgpOworCisgIHJldHVybiByZXQ7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBtYXRyb3NrYSwKKyAgICAiTWF0cm9za2EgYW5kIFdlYk0gc3RyZWFtIGhhbmRsaW5nIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2EvbWVzb24uYnVpbGQgYi9nc3QvbWF0cm9za2EvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUzODZjZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tYXRyb3NrYS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDI0IEBACittYXRyb3NrYV9zb3VyY2VzID0gWworICAnZWJtbC1yZWFkLmMnLAorICAnZWJtbC13cml0ZS5jJywKKyAgJ21hdHJvc2thLmMnLAorICAnbWF0cm9za2EtZGVtdXguYycsCisgICdtYXRyb3NrYS1wYXJzZS5jJywKKyAgJ21hdHJvc2thLWlkcy5jJywKKyAgJ21hdHJvc2thLW11eC5jJywKKyAgJ21hdHJvc2thLXJlYWQtY29tbW9uLmMnLAorICAnd2VibS1tdXguYycsCisgICdsem8uYycsCitdCisKK2dzdG1hdHJvc2thID0gbGlicmFyeSgnZ3N0bWF0cm9za2EnLAorICBtYXRyb3NrYV9zb3VyY2VzLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGxpbmtfYXJncyA6IG5vc2VoX2xpbmtfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0cGJ1dGlsc19kZXAsIGdzdGF1ZGlvX2RlcCwgZ3N0cmlmZl9kZXAsCisgICAgICAgICAgICAgICAgICBnc3R2aWRlb19kZXAsIGdzdHRhZ19kZXAsIGdzdGJhc2VfZGVwLAorICAgICAgICAgICAgICAgICAgZ3N0X2RlcCwgemxpYl9kZXAsIGJ6MmxpYiwgbGlibV0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2Evd2VibS1tdXguYyBiL2dzdC9tYXRyb3NrYS93ZWJtLW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1Yzg2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbWF0cm9za2Evd2VibS1tdXguYwpAQCAtMCwwICsxLDEwMSBAQAorLyogR1N0cmVhbWVyIFdlYk0gbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC13ZWJtbXV4CisgKgorICogd2VibW11eCBtdXhlcyBWUDggdmlkZW8gYW5kIFZvcmJpcyBhdWRpbyBzdHJlYW1zIGludG8gYSBXZWJNIGZpbGUuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHdlYm1tdXggbmFtZT1tdXggISBmaWxlc2luayBsb2NhdGlvbj1uZXdmaWxlLndlYm0gICAgICAgICBcCisgKiAgIHVyaWRlY29kZWJpbiB1cmk9ZmlsZTovLy9wYXRoL3RvL3NvbWVmaWxlLm9ndiBuYW1lPWRlbXV4ICAgICAgICAgICAgICAgIFwKKyAqICAgZGVtdXguICEgdmlkZW9jb252ZXJ0ICEgdnA4ZW5jICEgcXVldWUgISBtdXgudmlkZW9fMCAgICBcCisgKiAgIGRlbXV4LiAhIHByb2dyZXNzcmVwb3J0ICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yYXRlICEgdm9yYmlzZW5jICEgcXVldWUgISBtdXguYXVkaW9fMAorICogXXwgVGhpcyBwaXBlbGluZSByZS1lbmNvZGVzIGEgdmlkZW8gZmlsZSBvZiBhbnkgZm9ybWF0IGludG8gYSBXZWJNIGZpbGUuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgd2VibW11eCBuYW1lPW11eCAhIGZpbGVzaW5rIGxvY2F0aW9uPXRlc3Qud2VibSAgICAgICAgICAgIFwKKyAqICAgdmlkZW90ZXN0c3JjIG51bS1idWZmZXJzPTI1MCAhIHZpZGVvL3gtcmF3LGZyYW1lcmF0ZT0yNS8xICEgdmlkZW9jb252ZXJ0ICEgdnA4ZW5jICEgcXVldWUgISBtdXgudmlkZW9fMCBcCisgKiAgIGF1ZGlvdGVzdHNyYyBzYW1wbGVzcGVyYnVmZmVyPTQ0MTAwIG51bS1idWZmZXJzPTEwICEgYXVkaW8veC1yYXcscmF0ZT00NDEwMCAhIHZvcmJpc2VuYyAhIHF1ZXVlICEgbXV4LmF1ZGlvXzAKKyAqIF18IFRoaXMgcGlwZWxpbmUgbXV4ZXMgYSB0ZXN0IHZpZGVvIGFuZCBhIHNpbmUgd2F2ZSBpbnRvIGEgV2ViTSBmaWxlLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ3ZWJtLW11eC5oIgorCisjZGVmaW5lIENPTU1PTl9WSURFT19DQVBTIFwKKyAgIndpZHRoID0gKGludCkgWyAxNiwgNDA5NiBdLCAiIFwKKyAgImhlaWdodCA9IChpbnQpIFsgMTYsIDQwOTYgXSwgIiBcCisgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIFsgMCwgTUFYIF0iCisKKyNkZWZpbmUgQ09NTU9OX0FVRElPX0NBUFMgXAorICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdLCAiIFwKKyAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdIgorCitHX0RFRklORV9UWVBFIChHc3RXZWJNTXV4LCBnc3Rfd2VibV9tdXgsIEdTVF9UWVBFX01BVFJPU0tBX01VWCk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSB3ZWJtX3NyY190ZW1wbCA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby93ZWJtOyBhdWRpby93ZWJtIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgd2VibV92aWRlb3NpbmtfdGVtcGwgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgidmlkZW9fJXUiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC12cDgsICIgQ09NTU9OX1ZJREVPX0NBUFMgIjsiCisgICAgICAgICJ2aWRlby94LXZwOSwgIiBDT01NT05fVklERU9fQ0FQUyAiOyIgInZpZGVvL3gtYXYxLCAiIENPTU1PTl9WSURFT19DQVBTKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSB3ZWJtX2F1ZGlvc2lua190ZW1wbCA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJhdWRpb18ldSIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXZvcmJpcywgIiBDT01NT05fQVVESU9fQ0FQUyAiOyIKKyAgICAgICAgImF1ZGlvL3gtb3B1cywgIiBDT01NT05fQVVESU9fQ0FQUykKKyAgICApOworCitzdGF0aWMgdm9pZAorZ3N0X3dlYm1fbXV4X2NsYXNzX2luaXQgKEdzdFdlYk1NdXhDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJndlYm1fdmlkZW9zaW5rX3RlbXBsKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmd2VibV9hdWRpb3NpbmtfdGVtcGwpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJndlYm1fc3JjX3RlbXBsKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIldlYk0gbXV4ZXIiLAorICAgICAgIkNvZGVjL011eGVyIiwKKyAgICAgICJNdXhlcyB2aWRlbyBhbmQgYXVkaW8gc3RyZWFtcyBpbnRvIGEgV2ViTSBzdHJlYW0iLAorICAgICAgIkdTdHJlYW1lciBtYWludGFpbmVycyA8Z3N0cmVhbWVyLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZz4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF93ZWJtX211eF9pbml0IChHc3RXZWJNTXV4ICogbXV4KQoreworICBHU1RfTUFUUk9TS0FfTVVYIChtdXgpLT5kb2N0eXBlID0gR1NUX01BVFJPU0tBX0RPQ1RZUEVfV0VCTTsKKyAgR1NUX01BVFJPU0tBX01VWCAobXV4KS0+aXNfd2VibSA9IFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvbWF0cm9za2Evd2VibS1tdXguaCBiL2dzdC9tYXRyb3NrYS93ZWJtLW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZWU4NDQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbWF0cm9za2Evd2VibS1tdXguaApAQCAtMCwwICsxLDQ5IEBACisvKiBHU3RyZWFtZXIgV2ViTSBtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfV0VCTV9NVVhfSF9fCisjZGVmaW5lIF9fR1NUX1dFQk1fTVVYX0hfXworCisjaW5jbHVkZSAibWF0cm9za2EtbXV4LmgiCisKKyNkZWZpbmUgR1NUX1RZUEVfV0VCTV9NVVggXAorICAoZ3N0X3dlYm1fbXV4X2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfV0VCTV9NVVgob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX1dFQk1fTVVYLCBHc3RXZWJNTXV4KSkKKyNkZWZpbmUgR1NUX1dFQk1fTVVYX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfV0VCTV9NVVgsIEdzdFdlYk1NdXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19XRUJNX01VWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfV0VCTV9NVVgpKQorI2RlZmluZSBHU1RfSVNfV0VCTV9NVVhfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9XRUJNX01VWCkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RXZWJNTXV4IEdzdFdlYk1NdXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0V2ViTU11eENsYXNzIEdzdFdlYk1NdXhDbGFzczsKKworc3RydWN0IF9Hc3RXZWJNTXV4IHsKKyAgR3N0TWF0cm9za2FNdXggbWF0cm9za2FtdXg7Cit9OworCitzdHJ1Y3QgX0dzdFdlYk1NdXhDbGFzcyB7CisgIEdzdE1hdHJvc2thTXV4Q2xhc3MgbWF0cm9za2FtdXhjbGFzczsKK307CisKK0dUeXBlICAgZ3N0X3dlYm1fbXV4X2dldF90eXBlICh2b2lkKTsKKworI2VuZGlmIC8qIF9fR1NUX1dFQk1fTVVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L21lc29uLmJ1aWxkIGIvZ3N0L21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZGY1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbWVzb24uYnVpbGQKQEAgLTAsMCArMSw0MyBAQAorc3ViZGlyKCdhbHBoYScpCitzdWJkaXIoJ2FwZXRhZycpCitzdWJkaXIoJ2F1ZGlvZngnKQorc3ViZGlyKCdhdWRpb3BhcnNlcnMnKQorc3ViZGlyKCdhdXBhcnNlJykKK3N1YmRpcignYXV0b2RldGVjdCcpCitzdWJkaXIoJ2F2aScpCitzdWJkaXIoJ2N1dHRlcicpCitzdWJkaXIoJ2RlYnVndXRpbHMnKQorc3ViZGlyKCdkZWludGVybGFjZScpCitzdWJkaXIoJ2R0bWYnKQorc3ViZGlyKCdlZmZlY3R2JykKK3N1YmRpcignZXF1YWxpemVyJykKK3N1YmRpcignZmx2JykKK3N1YmRpcignZmx4JykKK3N1YmRpcignZ29vbScpCitzdWJkaXIoJ2dvb20yazEnKQorc3ViZGlyKCdpY3lkZW11eCcpCitzdWJkaXIoJ2lkM2RlbXV4JykKK3N1YmRpcignaW1hZ2VmcmVlemUnKQorc3ViZGlyKCdpbnRlcmxlYXZlJykKK3N1YmRpcignaXNvbXA0JykKK3N1YmRpcignbGF3JykKK3N1YmRpcignbGV2ZWwnKQorc3ViZGlyKCdtYXRyb3NrYScpCitzdWJkaXIoJ21vbm9zY29wZScpCitzdWJkaXIoJ211bHRpZmlsZScpCitzdWJkaXIoJ211bHRpcGFydCcpCitzdWJkaXIoJ3JlcGxheWdhaW4nKQorc3ViZGlyKCdydHAnKQorc3ViZGlyKCdydHBtYW5hZ2VyJykKK3N1YmRpcigncnRzcCcpCitzdWJkaXIoJ3NoYXBld2lwZScpCitzdWJkaXIoJ3NtcHRlJykKK3N1YmRpcignc3BlY3RydW0nKQorc3ViZGlyKCd1ZHAnKQorc3ViZGlyKCd2aWRlb2JveCcpCitzdWJkaXIoJ3ZpZGVvY3JvcCcpCitzdWJkaXIoJ3ZpZGVvZmlsdGVyJykKK3N1YmRpcigndmlkZW9taXhlcicpCitzdWJkaXIoJ3dhdmVuYycpCitzdWJkaXIoJ3dhdnBhcnNlJykKK3N1YmRpcigneTRtJykKZGlmZiAtLWdpdCBhL2dzdC9tb25vc2NvcGUvLmdpdGlnbm9yZSBiL2dzdC9tb25vc2NvcGUvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGY1ZWQzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21vbm9zY29wZS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNyBAQAorTWFrZWZpbGUKK01ha2VmaWxlLmluCisqLm8KKyoubG8KKyoubGEKKy5kZXBzCisubGlicwpkaWZmIC0tZ2l0IGEvZ3N0L21vbm9zY29wZS9NYWtlZmlsZS5hbSBiL2dzdC9tb25vc2NvcGUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkYTg4NAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tb25vc2NvcGUvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw5IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3Rtb25vc2NvcGUubGEKKworbGliZ3N0bW9ub3Njb3BlX2xhX1NPVVJDRVMgPSBnc3Rtb25vc2NvcGUuYyBtb25vc2NvcGUuYyBjb252b2x2ZS5jCisKK25vaW5zdF9IRUFERVJTID0gZ3N0bW9ub3Njb3BlLmggbW9ub3Njb3BlLmggY29udm9sdmUuaAorCitsaWJnc3Rtb25vc2NvcGVfbGFfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykKK2xpYmdzdG1vbm9zY29wZV9sYV9MSUJBREQgPSAkKEdTVF9MSUJTKSAkKEdTVF9CQVNFX0xJQlMpCitsaWJnc3Rtb25vc2NvcGVfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQpkaWZmIC0tZ2l0IGEvZ3N0L21vbm9zY29wZS9SRUFETUUgYi9nc3QvbW9ub3Njb3BlL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWZmMGMwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21vbm9zY29wZS9SRUFETUUKQEAgLTAsMCArMSw5IEBACitUaGlzIGlzIGEgdmlzdWFsaXphdGlvbiBiYXNlZCBvbiBvbiB0aGUgbW9ub3Njb3BlIG91dHB1dCBwbHVnaW4gZnJvbQorYWxzYXBsYXllci4KKworVGhlIG1vbm9zY29wZSBjb252b2x1dGlvbiBtYXRjaGluZyBjb2RlIHdhcyB3cml0dGVuIGJ5IFJhbHBoIExvYWRlci4KKworVGhlIG1vbm9zY29wZS5jIGFuZCBtb25vc2NvcGUuaCBmaWxlcyBhcmUgdW5kZXIgdGhlIEJTRCBsaWNlbnNlICh3aXRob3V0IGFkdmVydGlzaW5nIGNsYXVzZSkuCisKK1RoaXMgaW1wbGVtZW50YXRpb24gaXMgdGFrZW4gZnJvbSBhbHNhcGxheWVyIHZlcnNpb24gMC45OS41NCwgYXQKK2h0dHA6Ly93d3cuYWxzYXBsYXllci5vcmcvCmRpZmYgLS1naXQgYS9nc3QvbW9ub3Njb3BlL2NvbnZvbHZlLmMgYi9nc3QvbW9ub3Njb3BlL2NvbnZvbHZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzZTc5NwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tb25vc2NvcGUvY29udm9sdmUuYwpAQCAtMCwwICsxLDM2MyBAQAorLyogS2FyYXRzdWJhIGNvbnZvbHV0aW9uCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OSBSYWxwaCBMb2FkZXIgPHN1Y2tmaXNoQGlodWcuY28ubno+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIE5vdGU6IDd0aCBEZWNlbWJlciAyMDA0OiBUaGlzIGZpbGUgdXNlZCB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLAorICogICAgICAgYnV0IHdlIGdvdCBwZXJtaXNzaW9uIGZyb20gUmFscCBMb2FkZXIgdG8gcmVsaWNlbnNlIGl0IHRvIExHUEwuCisgKgorICogICRJZCQKKyAqCisgKi8KKworLyogVGhlIGFsZ29yaXRobSBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nLiAgRm9yIHRoZSBjb252b2x1dGlvbiBvZiBhIHBhaXIKKyAqIG9mIHBhaXJzLCAoYSxiKSAqIChjLGQpID0gKDAsIGEuYywgYS5kK2IuYywgYi5kKSwgd2UgY2FuIHJlZHVjZSB0aGUgZm91cgorICogbXVsdGlwbGljYXRpb25zIHRvIHRocmVlLCBieSB0aGUgZm9ybXVsYWUgYS5kK2IuYyA9IChhK2IpLihjK2QpIC0gYS5jIC0KKyAqIGIuZC4gIEEgc2ltaWxhciByZWxhdGlvbiBlbmFibGVzIHVzIHRvIGNvbXB1dGUgYSAybiBieSAybiBjb252b2x1dGlvbgorICogdXNpbmcgMyBuIGJ5IG4gY29udm9sdXRpb25zLCBhbmQgdGh1cyBhIDJebiBieSAyXm4gY29udm9sdXRpb24gdXNpbmcgM15uCisgKiBtdWx0aXBsaWNhdGlvbnMgKGFzIG9wcG9zZWQgdG8gdGhlIDRebiB0aGF0IHRoZSBxdWFkcmF0aWMgYWxnb3JpdGhtCisgKiB0YWtlcy4gKi8KKworLyogRm9yIGxhcmdlIG4sIHRoaXMgaXMgc2xvd2VyIHRoYW4gdGhlIE8obiBsb2cgbikgdGhhdCB0aGUgRkZUIG1ldGhvZAorICogdGFrZXMsIGJ1dCB3ZSBhdm9pZCB1c2luZyBjb21wbGV4IG51bWJlcnMsIGFuZCB3ZSBvbmx5IGhhdmUgdG8gY29tcHV0ZQorICogb25lIGNvbnZvbHV0aW9uLCBhcyBvcHBvc2VkIHRvIDMgRkZUcy4gIFdlIGhhdmUgZ29vZCBsb2NhbGl0eS1vZi0KKyAqIHJlZmVyZW5jZSBhcyB3ZWxsLCB3aGljaCB3aWxsIGhlbHAgb24gQ1BVcyB3aXRoIHRpbnkgY2FjaGVzLiAgKi8KKworLyogRS5nLiwgZm9yIGEgNTEyIHggNTEyIGNvbnZvbHV0aW9uLCB0aGUgRkZUIG1ldGhvZCB0YWtlcyA1NSAqIDUxMiA9IDI4MTYwCisgKiAocmVhbCkgbXVsdGlwbGljYXRpb25zLCBhcyBvcHBvc2VkIHRvIDNeOSA9IDE5NjgzIGZvciB0aGUgS2FyYXRzdWJhCisgKiBhbGdvcml0aG0uICBXZSBhY3R1YWxseSB3YW50IDI1NyBvdXRwdXRzIG9mIGEgMjU2IHggNTEyIGNvbnZvbHV0aW9uOworICogdGhhdCBkb2Vzbid0IGFwcGVhciB0byBnaXZlIGFuIGVhc3kgYWR2YW50YWdlIGZvciB0aGUgRkZUIGFsZ29yaXRobSwgYnV0CisgKiBmb3IgdGhlIEthcmF0c3ViYSBhbGdvcml0aG0sIGl0J3MgZWFzeSB0byB1c2UgdHdvIDI1NiB4IDI1NgorICogY29udm9sdXRpb25zLCB0YWtpbmcgMiB4IDNeOCA9IDEyMzEyIG11bHRpcGxpY2F0aW9ucy4gIFtUaGlzIGRpZmZlcmVuY2UKKyAqIGlzIHRoYXQgdGhlIEZGVCBtZXRob2QgIndyYXBzIiB0aGUgYXJyYXlzLCBkb2luZyBhIDJebiB4IDJebiAtPiAyXm4sCisgKiB3aGlsZSB0aGUgS2FyYXRzdWJhIGFsZ29yaXRobSBwYWRzIHdpdGggemVyb3MsIGRvaW5nIDJebiB4IDJebiAtPiAyLjJebgorICogLSAxXS4gKi8KKworLyogVGhlcmUncyBhIGJpZyBsaWUgYWJvdmUsIGFjdHVhbGx5Li4uIGZvciBhIDR4NCBjb252b2x1dGlvbiwgaXQncyBxdWlja2VyCisgKiB0byBkbyBpdCB1c2luZyAxNiBtdWx0aXBsaWNhdGlvbnMgdGhhbiB0aGUgbW9yZSBjb21wbGV4IEthcmF0c3ViYQorICogYWxnb3JpdGhtLi4uICBTbyB0aGUgcmVjdXJzaW9uIGJvdHRvbXMgb3V0IGF0IDR4NHMuICBUaGlzIGluY3JlYXNlcyB0aGUKKyAqIG51bWJlciBvZiBtdWx0aXBsaWNhdGlvbnMgYnkgYSBmYWN0b3Igb2YgMTYvOSwgYnV0IHJlZHVjZXMgdGhlIG92ZXJoZWFkcworICogZHJhbWF0aWNhbGx5LiAqLworCisvKiBUaGUgY29udm9sdXRpb24gYWxnb3JpdGhtIGlzIGltcGxlbWVudGVkIGFzIGEgc3RhY2sgbWFjaGluZS4gIFdlIGhhdmUgYQorICogc3RhY2sgb2YgY29tbWFuZHMsIGVhY2ggaW4gb25lIG9mIHRoZSBmb3JtcyAiZG8gYSAyXm4geCAyXm4KKyAqIGNvbnZvbHV0aW9uIiwgb3IgImNvbWJpbmUgdGhlc2UgdGhyZWUgbGVuZ3RoIDJebiBvdXRwdXRzIGludG8gb25lCisgKiAyXntuKzF9IG91dHB1dC4iICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImNvbnZvbHZlLmgiCisKK3R5cGVkZWYgdW5pb24gc3RhY2tfZW50cnlfcworeworICBzdHJ1Y3QKKyAgeworICAgIGNvbnN0IGRvdWJsZSAqbGVmdCwgKnJpZ2h0OworICAgIGRvdWJsZSAqb3V0OworICB9CisgIHY7CisgIHN0cnVjdAorICB7CisgICAgZG91YmxlICptYWluLCAqbnVsbDsKKyAgfQorICBiOworCit9CitzdGFja19lbnRyeTsKKworc3RydWN0IF9zdHJ1Y3RfY29udm9sdmVfc3RhdGUKK3sKKyAgaW50IGRlcHRoLCBzbWFsbCwgYmlnLCBzdGFja19zaXplOworICBkb3VibGUgKmxlZnQ7CisgIGRvdWJsZSAqcmlnaHQ7CisgIGRvdWJsZSAqc2NyYXRjaDsKKyAgc3RhY2tfZW50cnkgKnN0YWNrOworfTsKKworLyoKKyAqIEluaXRpYWxpc2F0aW9uIHJvdXRpbmUgLSBzZXRzIHVwIHRhYmxlcyBhbmQgc3BhY2UgdG8gd29yayBpbi4KKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIGludGVybmFsIHN0YXRlLCB0byBiZSB1c2VkIHdoZW4gcGVyZm9ybWluZyBjYWxscy4KKyAqIE9uIGVycm9yLCByZXR1cm5zIE5VTEwuCisgKiBUaGUgcG9pbnRlciBzaG91bGQgYmUgZnJlZWQgd2hlbiBpdCBpcyBmaW5pc2hlZCB3aXRoLCBieSBjb252b2x2ZV9jbG9zZSgpLgorICovCitjb252b2x2ZV9zdGF0ZSAqCitjb252b2x2ZV9pbml0IChpbnQgZGVwdGgpCit7CisgIGNvbnZvbHZlX3N0YXRlICpzdGF0ZTsKKworICBzdGF0ZSA9IG1hbGxvYyAoc2l6ZW9mIChjb252b2x2ZV9zdGF0ZSkpOworICBzdGF0ZS0+ZGVwdGggPSBkZXB0aDsKKyAgc3RhdGUtPnNtYWxsID0gKDEgPDwgZGVwdGgpOworICBzdGF0ZS0+YmlnID0gKDIgPDwgZGVwdGgpOworICBzdGF0ZS0+c3RhY2tfc2l6ZSA9IGRlcHRoICogMzsKKyAgc3RhdGUtPmxlZnQgPSBjYWxsb2MgKHN0YXRlLT5iaWcsIHNpemVvZiAoZG91YmxlKSk7CisgIHN0YXRlLT5yaWdodCA9IGNhbGxvYyAoc3RhdGUtPnNtYWxsICogMywgc2l6ZW9mIChkb3VibGUpKTsKKyAgc3RhdGUtPnNjcmF0Y2ggPSBjYWxsb2MgKHN0YXRlLT5zbWFsbCAqIDMsIHNpemVvZiAoZG91YmxlKSk7CisgIHN0YXRlLT5zdGFjayA9IGNhbGxvYyAoc3RhdGUtPnN0YWNrX3NpemUgKyAxLCBzaXplb2YgKHN0YWNrX2VudHJ5KSk7CisgIHJldHVybiBzdGF0ZTsKK30KKworLyoKKyAqIEZyZWUgdGhlIHN0YXRlIGFsbG9jYXRlZCB3aXRoIGNvbnZvbHZlX2luaXQoKS4KKyAqLwordm9pZAorY29udm9sdmVfY2xvc2UgKGNvbnZvbHZlX3N0YXRlICogc3RhdGUpCit7CisgIGZyZWUgKHN0YXRlLT5sZWZ0KTsKKyAgZnJlZSAoc3RhdGUtPnJpZ2h0KTsKKyAgZnJlZSAoc3RhdGUtPnNjcmF0Y2gpOworICBmcmVlIChzdGF0ZS0+c3RhY2spOworICBmcmVlIChzdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitjb252b2x2ZV80IChkb3VibGUgKm91dCwgY29uc3QgZG91YmxlICpsZWZ0LCBjb25zdCBkb3VibGUgKnJpZ2h0KQorLyogVGhpcyBkb2VzIGEgNHg0IC0+IDcgY29udm9sdXRpb24uICBGb3Igd2hhdCBpdCdzIHdvcnRoLCB0aGUgc2xpZ2h0bHkgb2RkCisgKiBvcmRlcmluZyBnaXZlcyBhYm91dCBhIDElIHNwZWVkIHVwIG9uIG15IFBlbnRpdW0gSUkuICovCit7CisgIGRvdWJsZSBsMCwgbDEsIGwyLCBsMywgcjAsIHIxLCByMiwgcjM7CisgIGRvdWJsZSBhOworCisgIGwwID0gbGVmdFswXTsKKyAgcjAgPSByaWdodFswXTsKKyAgYSA9IGwwICogcjA7CisgIGwxID0gbGVmdFsxXTsKKyAgcjEgPSByaWdodFsxXTsKKyAgb3V0WzBdID0gYTsKKyAgYSA9IChsMCAqIHIxKSArIChsMSAqIHIwKTsKKyAgbDIgPSBsZWZ0WzJdOworICByMiA9IHJpZ2h0WzJdOworICBvdXRbMV0gPSBhOworICBhID0gKGwwICogcjIpICsgKGwxICogcjEpICsgKGwyICogcjApOworICBsMyA9IGxlZnRbM107CisgIHIzID0gcmlnaHRbM107CisgIG91dFsyXSA9IGE7CisKKyAgb3V0WzNdID0gKGwwICogcjMpICsgKGwxICogcjIpICsgKGwyICogcjEpICsgKGwzICogcjApOworICBvdXRbNF0gPSAobDEgKiByMykgKyAobDIgKiByMikgKyAobDMgKiByMSk7CisgIG91dFs1XSA9IChsMiAqIHIzKSArIChsMyAqIHIyKTsKKyAgb3V0WzZdID0gbDMgKiByMzsKK30KKworc3RhdGljIHZvaWQKK2NvbnZvbHZlX3J1biAoc3RhY2tfZW50cnkgKiB0b3AsIHVuc2lnbmVkIHNpemUsIGRvdWJsZSAqc2NyYXRjaCkKKy8qIEludGVycHJldCBhIHN0YWNrIG9mIGNvbW1hbmRzLiAgVGhlIHN0YWNrIHN0YXJ0cyB3aXRoIHR3byBlbnRyaWVzOyB0aGUKKyAqIGNvbnZvbHV0aW9uIHRvIGRvLCBhbmQgYW4gaWxsZWdhbCBlbnRyeSB1c2VkIHRvIG1hcmsgdGhlIHN0YWNrIHRvcC4gIFRoZQorICogc2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gZWFjaCBpbnB1dCwgYW5kIG11c3QgYmUgYSBwb3dlciBvZiAyLAorICogYW5kIGF0IGxlYXN0IDguICBJdCBpcyBPSyB0byBoYXZlIG91dCBlcXVhbCB0byBsZWZ0IGFuZC9vciByaWdodC4KKyAqIHNjcmF0Y2ggbXVzdCBoYXZlIGxlbmd0aCAzKnNpemUuICBUaGUgbnVtYmVyIG9mIHN0YWNrIGVudHJpZXMgbmVlZGVkIGlzCisgKiAzbi00IHdoZXJlIHNpemU9Ml5uLiAqLworeworICBkbyB7CisgICAgY29uc3QgZG91YmxlICpsZWZ0OworICAgIGNvbnN0IGRvdWJsZSAqcmlnaHQ7CisgICAgZG91YmxlICpvdXQ7CisKKyAgICAvKiBXaGVuIHdlIGdldCBoZXJlLCB0aGUgc3RhY2sgdG9wIGlzIGFsd2F5cyBhIGNvbnZvbHZlLAorICAgICAqIHdpdGggc2l6ZSA+IDQuICBTbyB3ZSB3aWxsIHNwbGl0IGl0LiAgV2UgcmVwZWF0ZWRseSBzcGxpdAorICAgICAqIHRoZSB0b3AgZW50cnkgdW50aWwgd2UgZ2V0IHRvIHNpemUgPSA0LiAqLworCisgICAgbGVmdCA9IHRvcC0+di5sZWZ0OworICAgIHJpZ2h0ID0gdG9wLT52LnJpZ2h0OworICAgIG91dCA9IHRvcC0+di5vdXQ7CisgICAgdG9wKys7CisKKyAgICBkbyB7CisgICAgICBkb3VibGUgKnNfbGVmdCwgKnNfcmlnaHQ7CisgICAgICBpbnQgaTsKKworICAgICAgLyogSGFsdmUgdGhlIHNpemUuICovCisgICAgICBzaXplID4+PSAxOworCisgICAgICAvKiBBbGxvY2F0ZSB0aGUgc2NyYXRjaCBhcmVhcy4gKi8KKyAgICAgIHNfbGVmdCA9IHNjcmF0Y2ggKyBzaXplICogMzsKKyAgICAgIC8qIHNfcmlnaHQgaXMgYSBsZW5ndGggMipzaXplIGJ1ZmZlciBhbHNvIHVzZWQgZm9yCisgICAgICAgKiBpbnRlcm1lZGlhdGUgb3V0cHV0LiAqLworICAgICAgc19yaWdodCA9IHNjcmF0Y2ggKyBzaXplICogNDsKKworICAgICAgLyogQ3JlYXRlIHRoZSBpbnRlcm1lZGlhdGUgZmFjdG9ycy4gKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgZG91YmxlIGwgPSBsZWZ0W2ldICsgbGVmdFtpICsgc2l6ZV07CisgICAgICAgIGRvdWJsZSByID0gcmlnaHRbaV0gKyByaWdodFtpICsgc2l6ZV07CisKKyAgICAgICAgc19sZWZ0W2kgKyBzaXplXSA9IHI7CisgICAgICAgIHNfbGVmdFtpXSA9IGw7CisgICAgICB9CisKKyAgICAgIC8qIFB1c2ggdGhlIGNvbWJpbmUgZW50cnkgb250byB0aGUgc3RhY2suICovCisgICAgICB0b3AgLT0gMzsKKyAgICAgIHRvcFsyXS5iLm1haW4gPSBvdXQ7CisgICAgICB0b3BbMl0uYi5udWxsID0gTlVMTDsKKworICAgICAgLyogUHVzaCB0aGUgbG93IGVudHJ5IG9udG8gdGhlIHN0YWNrLiAgVGhpcyBtdXN0IGJlCisgICAgICAgKiB0aGUgbGFzdCBvZiB0aGUgdGhyZWUgc3ViLWNvbnZvbHV0aW9ucywgYmVjYXVzZQorICAgICAgICogaXQgbWF5IG92ZXJ3cml0ZSB0aGUgYXJndW1lbnRzLiAqLworICAgICAgdG9wWzFdLnYubGVmdCA9IGxlZnQ7CisgICAgICB0b3BbMV0udi5yaWdodCA9IHJpZ2h0OworICAgICAgdG9wWzFdLnYub3V0ID0gb3V0OworCisgICAgICAvKiBQdXNoIHRoZSBtaWQgZW50cnkgb250byB0aGUgc3RhY2suICovCisgICAgICB0b3BbMF0udi5sZWZ0ID0gc19sZWZ0OworICAgICAgdG9wWzBdLnYucmlnaHQgPSBzX3JpZ2h0OworICAgICAgdG9wWzBdLnYub3V0ID0gc19yaWdodDsKKworICAgICAgLyogTGVhdmUgdGhlIGhpZ2ggZW50cnkgaW4gdmFyaWFibGVzLiAqLworICAgICAgbGVmdCArPSBzaXplOworICAgICAgcmlnaHQgKz0gc2l6ZTsKKyAgICAgIG91dCArPSBzaXplICogMjsKKworICAgIH0gd2hpbGUgKHNpemUgPiA0KTsKKworICAgIC8qIFdoZW4gd2UgZ2V0IGhlcmUsIHRoZSBzdGFjayB0b3AgaXMgYSBncm91cCBvZiAzCisgICAgICogY29udm9sdmVzLCB3aXRoIHNpemUgPSA0LCBmb2xsb3dlZCBieSBzb21lIGNvbWJpbmVzLiAgKi8KKyAgICBjb252b2x2ZV80IChvdXQsIGxlZnQsIHJpZ2h0KTsKKyAgICBjb252b2x2ZV80ICh0b3BbMF0udi5vdXQsIHRvcFswXS52LmxlZnQsIHRvcFswXS52LnJpZ2h0KTsKKyAgICBjb252b2x2ZV80ICh0b3BbMV0udi5vdXQsIHRvcFsxXS52LmxlZnQsIHRvcFsxXS52LnJpZ2h0KTsKKyAgICB0b3AgKz0gMjsKKworICAgIC8qIE5vdyBwcm9jZXNzIGNvbWJpbmVzLiAqLworICAgIGRvIHsKKyAgICAgIC8qIGIubWFpbiBpcyB0aGUgb3V0cHV0IGJ1ZmZlciwgbWlkIGlzIHRoZSBtaWRkbGUKKyAgICAgICAqIHBhcnQgd2hpY2ggbmVlZHMgdG8gYmUgYWRqdXN0ZWQgaW4gcGxhY2UsIGFuZAorICAgICAgICogdGhlbiBmb2xkZWQgYmFjayBpbnRvIHRoZSBvdXRwdXQuICBXZSBkbyB0aGlzIGluCisgICAgICAgKiBhIHNsaWdodGx5IHN0cmFuZ2Ugd2F5LCBzbyBhcyB0byBhdm9pZCBoYXZpbmcKKyAgICAgICAqIHR3byBsb29wcy4gKi8KKyAgICAgIGRvdWJsZSAqb3V0ID0gdG9wLT5iLm1haW47CisgICAgICBkb3VibGUgKm1pZCA9IHNjcmF0Y2ggKyBzaXplICogNDsKKyAgICAgIHVuc2lnbmVkIGludCBpOworCisgICAgICB0b3ArKzsKKyAgICAgIG91dFtzaXplICogMiAtIDFdID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKSB7CisgICAgICAgIGRvdWJsZSBsbzsKKyAgICAgICAgZG91YmxlIGhpOworCisgICAgICAgIGxvID0gbWlkWzBdIC0gKG91dFswXSArIG91dFsyICogc2l6ZV0pICsgb3V0W3NpemVdOworICAgICAgICBoaSA9IG1pZFtzaXplXSAtIChvdXRbc2l6ZV0gKyBvdXRbMyAqIHNpemVdKSArIG91dFsyICogc2l6ZV07CisgICAgICAgIG91dFtzaXplXSA9IGxvOworICAgICAgICBvdXRbMiAqIHNpemVdID0gaGk7CisgICAgICAgIG91dCsrOworICAgICAgICBtaWQrKzsKKyAgICAgIH0KKyAgICAgIHNpemUgPDw9IDE7CisgICAgfSB3aGlsZSAodG9wLT5iLm51bGwgPT0gTlVMTCk7CisgIH0gd2hpbGUgKHRvcC0+Yi5tYWluICE9IE5VTEwpOworfQorCisvKgorICogY29udm9sdmVfbWF0Y2g6CisgKiBAbGFzdGNob2ljZTogYW4gYXJyYXkgb2Ygc2l6ZSBTTUFMTC4KKyAqIEBpbnB1dDogYW4gYXJyYXkgb2Ygc2l6ZSBCSUcgKDIqU01BTEwpCisgKiBAc3RhdGU6IGEgKG5vbi1OVUxMKSBwb2ludGVyIHJldHVybmVkIGJ5IGNvbnZvbHZlX2luaXQuCisgKgorICogV2UgZmluZCB0aGUgY29udGlndW91cyBTTUFMTC1zaXplIHN1Yi1hcnJheSBvZiBpbnB1dCB0aGF0IGJlc3QgbWF0Y2hlcworICogbGFzdGNob2ljZS4gQSBtZWFzdXJlIG9mIGhvdyBnb29kIGEgc3ViLWFycmF5IGlzIGNvbXBhcmVkIHdpdGggdGhlIGxhc3RjaG9pY2UKKyAqIGlzIGdpdmVuIGJ5IHRoZSBzdW0gb2YgdGhlIHByb2R1Y3RzIG9mIGVhY2ggcGFpciBvZiBlbnRyaWVzLiAgV2UgbWF4aW1pc2UKKyAqIHRoYXQsIGJ5IHRha2luZyBhbiBhcHByb3ByaWF0ZSBjb252b2x1dGlvbiwgYW5kIHRoZW4gZmluZGluZyB0aGUgbWF4aW11bQorICogZW50cnkgaW4gdGhlIGNvbnZvbHV0aW9ucy4KKyAqCisgKiBSZXR1cm46IHRoZSBwb3NpdGlvbiBvZiB0aGUgYmVzdCBtYXRjaAorICovCitpbnQKK2NvbnZvbHZlX21hdGNoIChjb25zdCBpbnQgKmxhc3RjaG9pY2UsIGNvbnN0IHNob3J0ICppbnB1dCwKKyAgICBjb252b2x2ZV9zdGF0ZSAqIHN0YXRlKQoreworICBkb3VibGUgYXZnID0gMDsKKyAgZG91YmxlIGJlc3Q7CisgIGludCBwID0gMDsKKyAgaW50IGk7CisgIGRvdWJsZSAqbGVmdCA9IHN0YXRlLT5sZWZ0OworICBkb3VibGUgKnJpZ2h0ID0gc3RhdGUtPnJpZ2h0OworICBkb3VibGUgKnNjcmF0Y2ggPSBzdGF0ZS0+c2NyYXRjaDsKKyAgc3RhY2tfZW50cnkgKnRvcCA9IHN0YXRlLT5zdGFjayArIChzdGF0ZS0+c3RhY2tfc2l6ZSAtIDEpOworCisgIGZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+YmlnOyBpKyspCisgICAgbGVmdFtpXSA9IGlucHV0W2ldOworCisgIGZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+c21hbGw7IGkrKykgeworICAgIGRvdWJsZSBhID0gbGFzdGNob2ljZVsoc3RhdGUtPnNtYWxsIC0gMSkgLSBpXTsKKworICAgIHJpZ2h0W2ldID0gYTsKKyAgICBhdmcgKz0gYTsKKyAgfQorCisgIC8qIFdlIGFkanVzdCB0aGUgc21hbGxlciBvZiB0aGUgdHdvIGlucHV0IGFycmF5cyB0byBoYXZlIGF2ZXJhZ2UKKyAgICogdmFsdWUgMC4gIFRoaXMgbWFrZXMgdGhlIGV2ZW50dWFsIHJlc3VsdCBpbnNlbnNpdGl2ZSB0byBib3RoCisgICAqIGNvbnN0YW50IG9mZnNldHMgYW5kIHBvc2l0aXZlIG11bHRpcGxpZXJzIG9mIHRoZSBpbnB1dHMuICovCisgIGF2ZyAvPSBzdGF0ZS0+c21hbGw7CisgIGZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+c21hbGw7IGkrKykKKyAgICByaWdodFtpXSAtPSBhdmc7CisgIC8qIEVuZC1vZi1zdGFjayBtYXJrZXIuICovCisgIHRvcFsxXS5iLm51bGwgPSBzY3JhdGNoOworICB0b3BbMV0uYi5tYWluID0gTlVMTDsKKyAgLyogVGhlIGxvdyAoc21hbGwgeCBzbWFsbCkgcGFydCwgb2Ygd2hpY2ggd2Ugd2FudCB0aGUgaGlnaCBvdXRwdXRzLiAqLworICB0b3AtPnYubGVmdCA9IGxlZnQ7CisgIHRvcC0+di5yaWdodCA9IHJpZ2h0OworICB0b3AtPnYub3V0ID0gcmlnaHQgKyBzdGF0ZS0+c21hbGw7CisgIGNvbnZvbHZlX3J1biAodG9wLCBzdGF0ZS0+c21hbGwsIHNjcmF0Y2gpOworCisgIC8qIFRoZSBoaWdoIChzbWFsbCB4IHNtYWxsKSBwYXJ0LCBvZiB3aGljaCB3ZSB3YW50IHRoZSBsb3cgb3V0cHV0cy4gKi8KKyAgdG9wLT52LmxlZnQgPSBsZWZ0ICsgc3RhdGUtPnNtYWxsOworICB0b3AtPnYucmlnaHQgPSByaWdodDsKKyAgdG9wLT52Lm91dCA9IHJpZ2h0OworICBjb252b2x2ZV9ydW4gKHRvcCwgc3RhdGUtPnNtYWxsLCBzY3JhdGNoKTsKKworICAvKiBOb3cgZmluZCB0aGUgYmVzdCBwb3NpdGlvbiBhbW91bmdzIHRoaXMuICBBcGFydCBmcm9tIHRoZSBmaXJzdAorICAgKiBhbmQgbGFzdCwgdGhlIHJlcXVpcmVkIGNvbnZvbHV0aW9uIG91dHB1dHMgYXJlIGZvcm1lZCBieSBhZGRpbmcKKyAgICogb3V0cHV0cyBmcm9tIHRoZSB0d28gY29udm9sdXRpb25zIGFib3ZlLiAqLworICBiZXN0ID0gcmlnaHRbc3RhdGUtPmJpZyAtIDFdOworICByaWdodFtzdGF0ZS0+YmlnICsgc3RhdGUtPnNtYWxsIC0gMV0gPSAwOworICBwID0gLTE7CisgIGZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+c21hbGw7IGkrKykgeworICAgIGRvdWJsZSBhID0gcmlnaHRbaV0gKyByaWdodFtpICsgc3RhdGUtPmJpZ107CisKKyAgICBpZiAoYSA+IGJlc3QpIHsKKyAgICAgIGJlc3QgPSBhOworICAgICAgcCA9IGk7CisgICAgfQorICB9CisgIHArKzsKKworI2lmIDAKKyAgeworICAgIC8qIFRoaXMgaXMgc29tZSBkZWJ1Z2dpbmcgY29kZS4uLiAqLworICAgIGJlc3QgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+c21hbGw7IGkrKykKKyAgICAgIGJlc3QgKz0gKChkb3VibGUpIGlucHV0W2kgKyBwXSkgKiAoKGRvdWJsZSkgbGFzdGNob2ljZVtpXSAtIGF2Zyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IHN0YXRlLT5zbWFsbDsgaSsrKSB7CisgICAgICBkb3VibGUgdG90ID0gMDsKKyAgICAgIHVuc2lnbmVkIGludCBqOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgc3RhdGUtPnNtYWxsOyBqKyspCisgICAgICAgIHRvdCArPSAoKGRvdWJsZSkgaW5wdXRbaSArIGpdKSAqICgoZG91YmxlKSBsYXN0Y2hvaWNlW2pdIC0gYXZnKTsKKyAgICAgIGlmICh0b3QgPiBiZXN0KQorICAgICAgICBwcmludGYgKCIoJWkpIiwgaSk7CisgICAgICBpZiAodG90ICE9IGxlZnRbaSArIChzdGF0ZS0+c21hbGwgLSAxKV0pCisgICAgICAgIHByaW50ZiAoIiEiKTsKKyAgICB9CisKKyAgICBwcmludGYgKCIlaVxuIiwgcCk7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBwOworfQpkaWZmIC0tZ2l0IGEvZ3N0L21vbm9zY29wZS9jb252b2x2ZS5oIGIvZ3N0L21vbm9zY29wZS9jb252b2x2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YTdmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbW9ub3Njb3BlL2NvbnZvbHZlLmgKQEAgLTAsMCArMSw0OCBAQAorLyogY29udm9sdmUuaDogSGVhZGVyIGZvciBjb252b2x1dGlvbnMuCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OSBSYWxwaCBMb2FkZXIgPHN1Y2tmaXNoQGlodWcuY28ubno+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIE5vdGU6IDd0aCBEZWNlbWJlciAyMDA0OiBUaGlzIGZpbGUgdXNlZCB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLAorICogICAgICAgYnV0IHdlIGdvdCBwZXJtaXNzaW9uIGZyb20gUmFscCBMb2FkZXIgdG8gcmVsaWNlbnNlIGl0IHRvIExHUEwuCisgKgorICoKKyAqLworCisjaWZuZGVmIENPTlZPTFZFX0gKKyNkZWZpbmUgQ09OVk9MVkVfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIENvbnZvbHV0aW9uIHN0YXRlICovCit0eXBlZGVmIHN0cnVjdCBfc3RydWN0X2NvbnZvbHZlX3N0YXRlIGNvbnZvbHZlX3N0YXRlOworCitjb252b2x2ZV9zdGF0ZSAqY29udm9sdmVfaW5pdCAoaW50IGRlcHRoKTsKK3ZvaWQgY29udm9sdmVfY2xvc2UgKGNvbnZvbHZlX3N0YXRlICogc3RhdGUpOworCitpbnQgY29udm9sdmVfbWF0Y2ggKGNvbnN0IGludCAqIGxhc3RjaG9pY2UsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0IGludCAqIGlucHV0LAorICAgICAgICAgICAgICAgICAgICBjb252b2x2ZV9zdGF0ZSAqIHN0YXRlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5jIGIvZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2JkZTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuYwpAQCAtMCwwICsxLDU4MSBAQAorLyogZ3N0bW9ub3Njb3BlLmM6IGltcGxlbWVudGF0aW9uIG9mIG1vbm9zY29wZSBkcmF3aW5nIGVsZW1lbnQKKyAqIENvcHlyaWdodCAoQykgPDIwMDI+IFJpY2hhcmQgQm91bHRvbiA8cmljaGFyZEB0YXJ0YXJ1cy5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbSBhdCBmbHVlbmRvIGRvdCBjb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtbW9ub3Njb3BlCisgKiBAc2VlX2Fsc286IGdvb20KKyAqCisgKiBNb25vc2NvcGUgaXMgYW4gYXVkaW8gdmlzdWFsaXNhdGlvbiBlbGVtZW50LiBJdCBjcmVhdGVzIGEgY29sb3VyZWQKKyAqIGN1cnZlIG9mIHRoZSBhdWRpbyBzaWduYWwgbGlrZSBvbiBhbiBvc2NpbGxvc2NvcGUuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyAhIGF1ZGlvY29udmVydCAhIG1vbm9zY29wZSAhIHZpZGVvY29udmVydCAhIHhpbWFnZXNpbmsKKyAqIF18CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdzdG1vbm9zY29wZS5oIgorI2luY2x1ZGUgIm1vbm9zY29wZS5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChtb25vc2NvcGVfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgbW9ub3Njb3BlX2RlYnVnCisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19CSUdfRU5ESUFOCisjZGVmaW5lIFJHQl9PUkRFUiAieFJHQiIKKyNlbHNlCisjZGVmaW5lIFJHQl9PUkRFUiAiQkdSeCIKKyNlbmRpZgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIFJHQl9PUkRFUiAiLCAiCisgICAgICAgICJ3aWR0aCA9ICIgR19TVFJJTkdJRlkgKHNjb3BlX3dpZHRoKSAiLCAiCisgICAgICAgICJoZWlnaHQgPSAiIEdfU1RSSU5HSUZZIChzY29wZV9oZWlnaHQpICIsICIKKyAgICAgICAgImZyYW1lcmF0ZSA9ICIgR1NUX1ZJREVPX0ZQU19SQU5HRSkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzE2KSAiLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyA4MDAwLCA5NjAwMCBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkIikKKyAgICApOworCisKKyNkZWZpbmUgZ3N0X21vbm9zY29wZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RNb25vc2NvcGUsIGdzdF9tb25vc2NvcGUsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZCBnc3RfbW9ub3Njb3BlX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9tb25vc2NvcGVfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21vbm9zY29wZV9zcmNfc2V0Y2FwcyAoR3N0TW9ub3Njb3BlICogbW9ubywgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIGdib29sZWFuIGdzdF9tb25vc2NvcGVfc2lua19zZXRjYXBzIChHc3RNb25vc2NvcGUgKiBtb25vLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyB2b2lkIGdzdF9tb25vc2NvcGVfcmVzZXQgKEdzdE1vbm9zY29wZSAqIG1vbm9zY29wZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X21vbm9zY29wZV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbW9ub3Njb3BlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X21vbm9zY29wZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgdm9pZAorZ3N0X21vbm9zY29wZV9jbGFzc19pbml0IChHc3RNb25vc2NvcGVDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfbW9ub3Njb3BlX2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21vbm9zY29wZV9jaGFuZ2Vfc3RhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIk1vbm9zY29wZSIsCisgICAgICAiVmlzdWFsaXphdGlvbiIsCisgICAgICAiRGlzcGxheXMgYSBoaWdobHkgc3RhYmlsaXNlZCB3YXZlZm9ybSBvZiBhdWRpbyBpbnB1dCIsCisgICAgICAiUmljaGFyZCBCb3VsdG9uIDxyaWNoYXJkQHRhcnRhcnVzLm9yZz4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tb25vc2NvcGVfaW5pdCAoR3N0TW9ub3Njb3BlICogbW9ub3Njb3BlKQoreworICBtb25vc2NvcGUtPnNpbmtwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rX3RlbXBsYXRlLCAic2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAobW9ub3Njb3BlLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tb25vc2NvcGVfY2hhaW4pKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKG1vbm9zY29wZS0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbW9ub3Njb3BlX3NpbmtfZXZlbnQpKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKG1vbm9zY29wZSksIG1vbm9zY29wZS0+c2lua3BhZCk7CisKKyAgbW9ub3Njb3BlLT5zcmNwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNyY190ZW1wbGF0ZSwgInNyYyIpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAobW9ub3Njb3BlLT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X21vbm9zY29wZV9zcmNfZXZlbnQpKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKG1vbm9zY29wZSksIG1vbm9zY29wZS0+c3JjcGFkKTsKKworICBtb25vc2NvcGUtPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIG1vbm9zY29wZS0+bmV4dF90cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIG1vbm9zY29wZS0+YnBzID0gc2l6ZW9mIChnaW50MTYpOworCisgIC8qIHJlc2V0IHRoZSBpbml0aWFsIHZpZGVvIHN0YXRlICovCisgIG1vbm9zY29wZS0+d2lkdGggPSBzY29wZV93aWR0aDsKKyAgbW9ub3Njb3BlLT5oZWlnaHQgPSBzY29wZV9oZWlnaHQ7CisgIG1vbm9zY29wZS0+ZnBzX251bSA9IDI1OyAgICAgIC8qIGRlc2lyZWQgZnJhbWUgcmF0ZSAqLworICBtb25vc2NvcGUtPmZwc19kZW5vbSA9IDE7CisgIG1vbm9zY29wZS0+dmlzc3RhdGUgPSBOVUxMOworCisgIC8qIHJlc2V0IHRoZSBpbml0aWFsIGF1ZGlvIHN0YXRlICovCisgIG1vbm9zY29wZS0+cmF0ZSA9IEdTVF9BVURJT19ERUZfUkFURTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tb25vc2NvcGVfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdE1vbm9zY29wZSAqbW9ub3Njb3BlID0gR1NUX01PTk9TQ09QRSAob2JqZWN0KTsKKworICBpZiAobW9ub3Njb3BlLT52aXNzdGF0ZSkKKyAgICBtb25vc2NvcGVfY2xvc2UgKG1vbm9zY29wZS0+dmlzc3RhdGUpOworCisgIGdfb2JqZWN0X3VucmVmIChtb25vc2NvcGUtPmFkYXB0ZXIpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tb25vc2NvcGVfcmVzZXQgKEdzdE1vbm9zY29wZSAqIG1vbm9zY29wZSkKK3sKKyAgbW9ub3Njb3BlLT5uZXh0X3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBnc3RfYWRhcHRlcl9jbGVhciAobW9ub3Njb3BlLT5hZGFwdGVyKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJm1vbm9zY29wZS0+c2VnbWVudCwgR1NUX0ZPUk1BVF9VTkRFRklORUQpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAobW9ub3Njb3BlKTsKKyAgbW9ub3Njb3BlLT5wcm9wb3J0aW9uID0gMS4wOworICBtb25vc2NvcGUtPmVhcmxpZXN0X3RpbWUgPSAtMTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKG1vbm9zY29wZSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21vbm9zY29wZV9zaW5rX3NldGNhcHMgKEdzdE1vbm9zY29wZSAqIG1vbm9zY29wZSwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAicmF0ZSIsICZtb25vc2NvcGUtPnJhdGUpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG1vbm9zY29wZSwgInNhbXBsZSByYXRlID0gJWQiLCBtb25vc2NvcGUtPnJhdGUpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbW9ub3Njb3BlX3NyY19zZXRjYXBzIChHc3RNb25vc2NvcGUgKiBtb25vc2NvcGUsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAid2lkdGgiLCAmbW9ub3Njb3BlLT53aWR0aCk7CisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiaGVpZ2h0IiwgJm1vbm9zY29wZS0+aGVpZ2h0KTsKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfZnJhY3Rpb24gKHN0cnVjdHVyZSwgImZyYW1lcmF0ZSIsICZtb25vc2NvcGUtPmZwc19udW0sCisgICAgICAmbW9ub3Njb3BlLT5mcHNfZGVub20pOworCisgIG1vbm9zY29wZS0+b3V0c2l6ZSA9IG1vbm9zY29wZS0+d2lkdGggKiBtb25vc2NvcGUtPmhlaWdodCAqIDQ7CisgIG1vbm9zY29wZS0+ZnJhbWVfZHVyYXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChHU1RfU0VDT05ELAorICAgICAgbW9ub3Njb3BlLT5mcHNfZGVub20sIG1vbm9zY29wZS0+ZnBzX251bSk7CisgIG1vbm9zY29wZS0+c3BmID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKG1vbm9zY29wZS0+cmF0ZSwgbW9ub3Njb3BlLT5mcHNfZGVub20sCisgICAgICBtb25vc2NvcGUtPmZwc19udW0pOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG1vbm9zY29wZSwgImRpbWVuc2lvbiAlZHglZCwgZnJhbWVyYXRlICVkLyVkLCBzcGYgJWQiLAorICAgICAgbW9ub3Njb3BlLT53aWR0aCwgbW9ub3Njb3BlLT5oZWlnaHQsIG1vbm9zY29wZS0+ZnBzX251bSwKKyAgICAgIG1vbm9zY29wZS0+ZnBzX2Rlbm9tLCBtb25vc2NvcGUtPnNwZik7CisKKyAgaWYgKG1vbm9zY29wZS0+dmlzc3RhdGUpIHsKKyAgICBtb25vc2NvcGVfY2xvc2UgKG1vbm9zY29wZS0+dmlzc3RhdGUpOworICAgIG1vbm9zY29wZS0+dmlzc3RhdGUgPSBOVUxMOworICB9CisKKyAgbW9ub3Njb3BlLT52aXNzdGF0ZSA9IG1vbm9zY29wZV9pbml0IChtb25vc2NvcGUtPndpZHRoLCBtb25vc2NvcGUtPmhlaWdodCk7CisKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAobW9ub3Njb3BlLT5zcmNwYWQsIGNhcHMpOworCisgIHJldHVybiByZXMgJiYgKG1vbm9zY29wZS0+dmlzc3RhdGUgIT0gTlVMTCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21vbm9zY29wZV9zcmNfbmVnb3RpYXRlIChHc3RNb25vc2NvcGUgKiBtb25vc2NvcGUpCit7CisgIEdzdENhcHMgKm90aGVyY2FwcywgKnRhcmdldDsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdENhcHMgKnRlbXBsOworICBHc3RRdWVyeSAqcXVlcnk7CisgIEdzdEJ1ZmZlclBvb2wgKnBvb2w7CisgIEdzdFN0cnVjdHVyZSAqY29uZmlnOworICBndWludCBzaXplLCBtaW4sIG1heDsKKworICB0ZW1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChtb25vc2NvcGUtPnNyY3BhZCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAobW9ub3Njb3BlLCAicGVyZm9ybWluZyBuZWdvdGlhdGlvbiIpOworCisgIC8qIHNlZSB3aGF0IHRoZSBwZWVyIGNhbiBkbyAqLworICBvdGhlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAobW9ub3Njb3BlLT5zcmNwYWQsIE5VTEwpOworICBpZiAob3RoZXJjYXBzKSB7CisgICAgdGFyZ2V0ID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChvdGhlcmNhcHMsIHRlbXBsKTsKKyAgICBnc3RfY2Fwc191bnJlZiAob3RoZXJjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGVtcGwpOworCisgICAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5ICh0YXJnZXQpKQorICAgICAgZ290byBub19mb3JtYXQ7CisKKyAgICB0YXJnZXQgPSBnc3RfY2Fwc190cnVuY2F0ZSAodGFyZ2V0KTsKKyAgfSBlbHNlIHsKKyAgICB0YXJnZXQgPSB0ZW1wbDsKKyAgfQorCisgIHRhcmdldCA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKHRhcmdldCk7CisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHRhcmdldCwgMCk7CisgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfaW50IChzdHJ1Y3R1cmUsICJ3aWR0aCIsIDMyMCk7CisgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfaW50IChzdHJ1Y3R1cmUsICJoZWlnaHQiLCAyNDApOworICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ZyYWN0aW9uIChzdHJ1Y3R1cmUsICJmcmFtZXJhdGUiLCAyNSwgMSk7CisKKyAgZ3N0X21vbm9zY29wZV9zcmNfc2V0Y2FwcyAobW9ub3Njb3BlLCB0YXJnZXQpOworCisgIC8qIHRyeSB0byBnZXQgYSBidWZmZXJwb29sIG5vdyAqLworICAvKiBmaW5kIGEgcG9vbCBmb3IgdGhlIG5lZ290aWF0ZWQgY2FwcyBub3cgKi8KKyAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X2FsbG9jYXRpb24gKHRhcmdldCwgVFJVRSk7CisKKyAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnkgKG1vbm9zY29wZS0+c3JjcGFkLCBxdWVyeSkpIHsKKyAgfQorCisgIGlmIChnc3RfcXVlcnlfZ2V0X25fYWxsb2NhdGlvbl9wb29scyAocXVlcnkpID4gMCkgeworICAgIC8qIHdlIGdvdCBjb25maWd1cmF0aW9uIGZyb20gb3VyIHBlZXIsIHBhcnNlIHRoZW0gKi8KKyAgICBnc3RfcXVlcnlfcGFyc2VfbnRoX2FsbG9jYXRpb25fcG9vbCAocXVlcnksIDAsICZwb29sLCAmc2l6ZSwgJm1pbiwgJm1heCk7CisgIH0gZWxzZSB7CisgICAgcG9vbCA9IE5VTEw7CisgICAgc2l6ZSA9IG1vbm9zY29wZS0+b3V0c2l6ZTsKKyAgICBtaW4gPSBtYXggPSAwOworICB9CisKKyAgaWYgKHBvb2wgPT0gTlVMTCkgeworICAgIC8qIHdlIGRpZCBub3QgZ2V0IGEgcG9vbCwgbWFrZSBvbmUgb3Vyc2VsdmVzIHRoZW4gKi8KKyAgICBwb29sID0gZ3N0X2J1ZmZlcl9wb29sX25ldyAoKTsKKyAgfQorCisgIGNvbmZpZyA9IGdzdF9idWZmZXJfcG9vbF9nZXRfY29uZmlnIChwb29sKTsKKyAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19zZXRfcGFyYW1zIChjb25maWcsIHRhcmdldCwgc2l6ZSwgbWluLCBtYXgpOworICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2NvbmZpZyAocG9vbCwgY29uZmlnKTsKKworICBpZiAobW9ub3Njb3BlLT5wb29sKSB7CisgICAgZ3N0X2J1ZmZlcl9wb29sX3NldF9hY3RpdmUgKG1vbm9zY29wZS0+cG9vbCwgVFJVRSk7CisgICAgZ3N0X29iamVjdF91bnJlZiAobW9ub3Njb3BlLT5wb29sKTsKKyAgfQorICBtb25vc2NvcGUtPnBvb2wgPSBwb29sOworCisgIC8qIGFuZCBhY3RpdmF0ZSAqLworICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAocG9vbCwgVFJVRSk7CisKKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisgIGdzdF9jYXBzX3VucmVmICh0YXJnZXQpOworCisgIHJldHVybiBUUlVFOworCitub19mb3JtYXQ6CisgIHsKKyAgICBnc3RfY2Fwc191bnJlZiAodGFyZ2V0KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogbWFrZSBzdXJlIHdlIGFyZSBuZWdvdGlhdGVkICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZW5zdXJlX25lZ290aWF0ZWQgKEdzdE1vbm9zY29wZSAqIG1vbm9zY29wZSkKK3sKKyAgZ2Jvb2xlYW4gcmVjb25maWd1cmU7CisKKyAgcmVjb25maWd1cmUgPSBnc3RfcGFkX2NoZWNrX3JlY29uZmlndXJlIChtb25vc2NvcGUtPnNyY3BhZCk7CisKKyAgLyogd2UgZG9uJ3Qga25vdyBhbiBvdXRwdXQgZm9ybWF0IHlldCwgcGljayBvbmUgKi8KKyAgaWYgKHJlY29uZmlndXJlIHx8ICFnc3RfcGFkX2hhc19jdXJyZW50X2NhcHMgKG1vbm9zY29wZS0+c3JjcGFkKSkgeworICAgIGlmICghZ3N0X21vbm9zY29wZV9zcmNfbmVnb3RpYXRlIChtb25vc2NvcGUpKSB7CisgICAgICBnc3RfcGFkX21hcmtfcmVjb25maWd1cmUgKG1vbm9zY29wZS0+c3JjcGFkKTsKKyAgICAgIGlmIChHU1RfUEFEX0lTX0ZMVVNISU5HIChtb25vc2NvcGUtPnNyY3BhZCkpCisgICAgICAgIHJldHVybiBHU1RfRkxPV19GTFVTSElORzsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICAgIH0KKyAgfQorICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbW9ub3Njb3BlX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogaW5idWYpCit7CisgIEdzdEZsb3dSZXR1cm4gZmxvd19yZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0TW9ub3Njb3BlICptb25vc2NvcGU7CisKKyAgbW9ub3Njb3BlID0gR1NUX01PTk9TQ09QRSAocGFyZW50KTsKKworICBpZiAobW9ub3Njb3BlLT5yYXRlID09IDApIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChpbmJ1Zik7CisgICAgZmxvd19yZXQgPSBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIC8qIE1ha2Ugc3VyZSBoYXZlIGFuIG91dHB1dCBmb3JtYXQgKi8KKyAgZmxvd19yZXQgPSBlbnN1cmVfbmVnb3RpYXRlZCAobW9ub3Njb3BlKTsKKyAgaWYgKGZsb3dfcmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoaW5idWYpOworICAgIGdvdG8gb3V0OworICB9CisKKyAgLyogZG9uJ3QgdHJ5IHRvIGNvbWJpbmUgc2FtcGxlcyBmcm9tIGRpc2NvbnQgYnVmZmVyICovCisgIGlmIChHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChpbmJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpKSB7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKG1vbm9zY29wZS0+YWRhcHRlcik7CisgICAgbW9ub3Njb3BlLT5uZXh0X3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgfQorCisgIC8qIE1hdGNoIHRpbWVzdGFtcHMgZnJvbSB0aGUgaW5jb21pbmcgYXVkaW8gKi8KKyAgaWYgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZikgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICBtb25vc2NvcGUtPm5leHRfdHMgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWYpOworCisgIEdTVF9MT0dfT0JKRUNUIChtb25vc2NvcGUsCisgICAgICAiaW4gYnVmZmVyIGhhcyAlIiBHX0dTSVpFX0ZPUk1BVCAiIHNhbXBsZXMsIHRzPSUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGluYnVmKSAvIG1vbm9zY29wZS0+YnBzLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmKSkpOworCisgIGdzdF9hZGFwdGVyX3B1c2ggKG1vbm9zY29wZS0+YWRhcHRlciwgaW5idWYpOworICBpbmJ1ZiA9IE5VTEw7CisKKyAgLyogQ29sbGVjdCBzYW1wbGVzIHVudGlsIHdlIGhhdmUgZW5vdWdoIGZvciBhbiBvdXRwdXQgZnJhbWUgKi8KKyAgd2hpbGUgKGZsb3dfcmV0ID09IEdTVF9GTE9XX09LKSB7CisgICAgZ2ludDE2ICpzYW1wbGVzOworICAgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgICBndWludDMyICpwaXhlbHMsIGF2YWlsLCBieXRlc3BlcmZyYW1lOworCisgICAgYXZhaWwgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKG1vbm9zY29wZS0+YWRhcHRlcik7CisgICAgR1NUX0xPR19PQkpFQ1QgKG1vbm9zY29wZSwgImJ5dGVzIGF2YWlsIG5vdyAldSIsIGF2YWlsKTsKKworICAgIGJ5dGVzcGVyZnJhbWUgPSBtb25vc2NvcGUtPnNwZiAqIG1vbm9zY29wZS0+YnBzOworICAgIGlmIChhdmFpbCA8IGJ5dGVzcGVyZnJhbWUpCisgICAgICBicmVhazsKKworICAgIC8qIEZJWE1FOiBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCBRb1MsIHdlIGFyZSBza2lwcGluZyB3YXkgdG9vIG11Y2gKKyAgICAgKiBzdHVmZiBldmVuIHdpdGggdmVyeSBsb3cgQ1BVIGxvYWRzICovCisjaWYgMAorICAgIGlmIChtb25vc2NvcGUtPm5leHRfdHMgIT0gLTEpIHsKKyAgICAgIGdib29sZWFuIG5lZWRfc2tpcDsKKyAgICAgIGdpbnQ2NCBxb3N0aW1lOworCisgICAgICBxb3N0aW1lID0gZ3N0X3NlZ21lbnRfdG9fcnVubmluZ190aW1lICgmbW9ub3Njb3BlLT5zZWdtZW50LAorICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwgbW9ub3Njb3BlLT5uZXh0X3RzKTsKKworICAgICAgR1NUX09CSkVDVF9MT0NLIChtb25vc2NvcGUpOworICAgICAgLyogY2hlY2sgZm9yIFFvUywgZG9uJ3QgY29tcHV0ZSBidWZmZXJzIHRoYXQgYXJlIGtub3duIHRvIGJlIGxhdGUgKi8KKyAgICAgIG5lZWRfc2tpcCA9CisgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKG1vbm9zY29wZS0+ZWFybGllc3RfdGltZSkgJiYKKyAgICAgICAgICBxb3N0aW1lIDw9IG1vbm9zY29wZS0+ZWFybGllc3RfdGltZTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChtb25vc2NvcGUpOworCisgICAgICBpZiAobmVlZF9za2lwKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobW9ub3Njb3BlLAorICAgICAgICAgICAgIlFvUzogc2tpcCB0czogJSIgR1NUX1RJTUVfRk9STUFUICIsIGVhcmxpZXN0OiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChxb3N0aW1lKSwgR1NUX1RJTUVfQVJHUyAobW9ub3Njb3BlLT5lYXJsaWVzdF90aW1lKSk7CisgICAgICAgIGdvdG8gc2tpcDsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIHNhbXBsZXMgPSAoZ2ludDE2ICopIGdzdF9hZGFwdGVyX21hcCAobW9ub3Njb3BlLT5hZGFwdGVyLCBieXRlc3BlcmZyYW1lKTsKKworICAgIGlmIChtb25vc2NvcGUtPnNwZiA8IGNvbnZvbHZlcl9iaWcpIHsKKyAgICAgIGdpbnQxNiBpbl9kYXRhW2NvbnZvbHZlcl9iaWddLCBpOworICAgICAgZ2RvdWJsZSBzY2FsZSA9IChnZG91YmxlKSBtb25vc2NvcGUtPnNwZiAvIChnZG91YmxlKSBjb252b2x2ZXJfYmlnOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udm9sdmVyX2JpZzsgKytpKSB7CisgICAgICAgIGdkb3VibGUgb2ZmID0gKGdkb3VibGUpIGkgKiBzY2FsZTsKKyAgICAgICAgaW5fZGF0YVtpXSA9IHNhbXBsZXNbTUlOICgoZ3VpbnQpIG9mZiwgbW9ub3Njb3BlLT5zcGYpXTsKKyAgICAgIH0KKyAgICAgIHBpeGVscyA9IG1vbm9zY29wZV91cGRhdGUgKG1vbm9zY29wZS0+dmlzc3RhdGUsIGluX2RhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBub3QgcmVhbGx5IGNvcnJlY3QsIGJ1dCBsb29rcyBtdWNoIHByZXR0aWVyICovCisgICAgICBwaXhlbHMgPSBtb25vc2NvcGVfdXBkYXRlIChtb25vc2NvcGUtPnZpc3N0YXRlLCBzYW1wbGVzKTsKKyAgICB9CisKKyAgICBHU1RfTE9HX09CSkVDVCAobW9ub3Njb3BlLCAiYWxsb2NhdGluZyBvdXRwdXQgYnVmZmVyIik7CisgICAgZmxvd19yZXQgPSBnc3RfYnVmZmVyX3Bvb2xfYWNxdWlyZV9idWZmZXIgKG1vbm9zY29wZS0+cG9vbCwgJm91dGJ1ZiwgTlVMTCk7CisgICAgaWYgKGZsb3dfcmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgICBnc3RfYWRhcHRlcl91bm1hcCAobW9ub3Njb3BlLT5hZGFwdGVyKTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGdzdF9idWZmZXJfZmlsbCAob3V0YnVmLCAwLCBwaXhlbHMsIG1vbm9zY29wZS0+b3V0c2l6ZSk7CisKKyAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSA9IG1vbm9zY29wZS0+bmV4dF90czsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gbW9ub3Njb3BlLT5mcmFtZV9kdXJhdGlvbjsKKworICAgIGZsb3dfcmV0ID0gZ3N0X3BhZF9wdXNoIChtb25vc2NvcGUtPnNyY3BhZCwgb3V0YnVmKTsKKworI2lmIDAKKyAgc2tpcDoKKyNlbmRpZgorCisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChtb25vc2NvcGUtPm5leHRfdHMpKQorICAgICAgbW9ub3Njb3BlLT5uZXh0X3RzICs9IG1vbm9zY29wZS0+ZnJhbWVfZHVyYXRpb247CisKKyAgICBnc3RfYWRhcHRlcl9mbHVzaCAobW9ub3Njb3BlLT5hZGFwdGVyLCBieXRlc3BlcmZyYW1lKTsKKyAgfQorCitvdXQ6CisKKyAgcmV0dXJuIGZsb3dfcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tb25vc2NvcGVfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdE1vbm9zY29wZSAqbW9ub3Njb3BlOworICBnYm9vbGVhbiByZXM7CisKKyAgbW9ub3Njb3BlID0gR1NUX01PTk9TQ09QRSAocGFyZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVEFSVDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAobW9ub3Njb3BlLT5zcmNwYWQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgICBnc3RfbW9ub3Njb3BlX3Jlc2V0IChtb25vc2NvcGUpOworICAgICAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChtb25vc2NvcGUtPnNyY3BhZCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDoKKyAgICB7CisgICAgICAvKiB0aGUgbmV3c2VnbWVudCB2YWx1ZXMgYXJlIHVzZWQgdG8gY2xpcCB0aGUgaW5wdXQgc2FtcGxlcworICAgICAgICogYW5kIHRvIGNvbnZlcnQgdGhlIGluY29tbWluZyB0aW1lc3RhbXBzIHRvIHJ1bm5pbmcgdGltZSBzbworICAgICAgICogd2UgY2FuIGRvIFFvUyAqLworICAgICAgZ3N0X2V2ZW50X2NvcHlfc2VnbWVudCAoZXZlbnQsICZtb25vc2NvcGUtPnNlZ21lbnQpOworCisgICAgICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKG1vbm9zY29wZS0+c3JjcGFkLCBldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfY2FwcyAoZXZlbnQsICZjYXBzKTsKKyAgICAgIGdzdF9tb25vc2NvcGVfc2lua19zZXRjYXBzIChtb25vc2NvcGUsIGNhcHMpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKG1vbm9zY29wZS0+c3JjcGFkLCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X21vbm9zY29wZV9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RNb25vc2NvcGUgKm1vbm9zY29wZTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIG1vbm9zY29wZSA9IEdTVF9NT05PU0NPUEUgKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfUU9TOnsKKyAgICAgIGdkb3VibGUgcHJvcG9ydGlvbjsKKyAgICAgIEdzdENsb2NrVGltZURpZmYgZGlmZjsKKyAgICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9xb3MgKGV2ZW50LCBOVUxMLCAmcHJvcG9ydGlvbiwgJmRpZmYsICZ0aW1lc3RhbXApOworCisgICAgICAvKiBzYXZlIHN0dWZmIGZvciB0aGUgX2NoYWluKCkgZnVuY3Rpb24gKi8KKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAobW9ub3Njb3BlKTsKKyAgICAgIG1vbm9zY29wZS0+cHJvcG9ydGlvbiA9IHByb3BvcnRpb247CisgICAgICBpZiAoZGlmZiA+PSAwKQorICAgICAgICAvKiB3ZSdyZSBsYXRlLCB0aGlzIGlzIGEgZ29vZCBlc3RpbWF0ZSBmb3IgbmV4dCBkaXNwbGF5YWJsZQorICAgICAgICAgKiBmcmFtZSAoc2VlIHBhcnQtcW9zLnR4dCkgKi8KKyAgICAgICAgbW9ub3Njb3BlLT5lYXJsaWVzdF90aW1lID0KKyAgICAgICAgICAgIHRpbWVzdGFtcCArIDIgKiBkaWZmICsgbW9ub3Njb3BlLT5mcmFtZV9kdXJhdGlvbjsKKyAgICAgIGVsc2UKKyAgICAgICAgbW9ub3Njb3BlLT5lYXJsaWVzdF90aW1lID0gdGltZXN0YW1wICsgZGlmZjsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChtb25vc2NvcGUpOworCisgICAgICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKG1vbm9zY29wZS0+c2lua3BhZCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKG1vbm9zY29wZS0+c2lua3BhZCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9tb25vc2NvcGVfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0TW9ub3Njb3BlICptb25vc2NvcGUgPSBHU1RfTU9OT1NDT1BFIChlbGVtZW50KTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGdzdF9tb25vc2NvcGVfcmVzZXQgKG1vbm9zY29wZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgaWYgKG1vbm9zY29wZS0+cG9vbCkgeworICAgICAgICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAobW9ub3Njb3BlLT5wb29sLCBGQUxTRSk7CisgICAgICAgIGdzdF9vYmplY3RfcmVwbGFjZSAoKEdzdE9iamVjdCAqKikgJiBtb25vc2NvcGUtPnBvb2wsIE5VTEwpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChtb25vc2NvcGVfZGVidWcsICJtb25vc2NvcGUiLCAwLAorICAgICAgIm1vbm9zY29wZSBlbGVtZW50Iik7CisKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJtb25vc2NvcGUiLAorICAgICAgR1NUX1JBTktfTk9ORSwgR1NUX1RZUEVfTU9OT1NDT1BFKTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIG1vbm9zY29wZSwKKyAgICAiTW9ub3Njb3BlIHZpc3VhbGl6YXRpb24iLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9nc3QvbW9ub3Njb3BlL2dzdG1vbm9zY29wZS5oIGIvZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjZhNmQyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21vbm9zY29wZS9nc3Rtb25vc2NvcGUuaApAQCAtMCwwICsxLDgzIEBACisvKiBHU3RyZWFtZXIgbW9ub3Njb3BlIHZpc3VhbGlzYXRpb24gZWxlbWVudAorICogQ29weXJpZ2h0IChDKSA8MjAwMj4gUmljaGFyZCBCb3VsdG9uIDxyaWNoYXJkQHRhcnRhcnVzLm9yZz4KKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBXaW0gVGF5bWFucyA8d2ltIGF0IGZsdWVuZG8gZG90IGNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX01PTk9TQ09QRV9fCisjZGVmaW5lIF9fR1NUX01PTk9TQ09QRV9fCisKK0dfQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfTU9OT1NDT1BFICAgICAgICAgICAgKGdzdF9tb25vc2NvcGVfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX01PTk9TQ09QRShvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX01PTk9TQ09QRSxHc3RNb25vc2NvcGUpKQorI2RlZmluZSBHU1RfTU9OT1NDT1BFX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9NT05PU0NPUEUsR3N0TW9ub3Njb3BlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfTU9OT1NDT1BFKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfTU9OT1NDT1BFKSkKKyNkZWZpbmUgR1NUX0lTX01PTk9TQ09QRV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfTU9OT1NDT1BFKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1vbm9zY29wZSBHc3RNb25vc2NvcGU7Cit0eXBlZGVmIHN0cnVjdCBfR3N0TW9ub3Njb3BlQ2xhc3MgR3N0TW9ub3Njb3BlQ2xhc3M7CisKK3N0cnVjdCBfR3N0TW9ub3Njb3BlCit7CisgIEdzdEVsZW1lbnQgZWxlbWVudDsKKworICAvKiBwYWRzICovCisgIEdzdFBhZCAgICAgICpzaW5rcGFkOworICBHc3RQYWQgICAgICAqc3JjcGFkOworCisgIEdzdEFkYXB0ZXIgICphZGFwdGVyOworCisgIGd1aW50NjQgICAgICBuZXh0X3RzOyAgICAgICAgICAgICAvKiBleHBlY3RlZCB0aW1lc3RhbXAgb2YgdGhlIG5leHQgZnJhbWUgKi8KKyAgZ3VpbnQ2NCAgICAgIGZyYW1lX2R1cmF0aW9uOyAgICAgIC8qIHZpZGVvIGZyYW1lIGR1cmF0aW9uICAgICovCisgIGdpbnQgICAgICAgICByYXRlOyAgICAgICAgICAgICAgICAvKiBzYW1wbGUgcmF0ZSAgICAgICAgICAgICAqLworICBndWludCAgICAgICAgYnBzOyAgICAgICAgICAgICAgICAgLyogYnl0ZXMgcGVyIHNhbXBsZSAgICAgICAgKi8KKyAgZ3VpbnQgICAgICAgIHNwZjsgICAgICAgICAgICAgICAgIC8qIHNhbXBsZXMgcGVyIHZpZGVvIGZyYW1lICovCisgIEdzdEJ1ZmZlclBvb2wgKnBvb2w7CisKKyAgR3N0U2VnbWVudCAgIHNlZ21lbnQ7CisKKyAgLyogUW9TIHN0dWZmICovLyogd2l0aCBMT0NLICovCisgIGdkb3VibGUgICAgICBwcm9wb3J0aW9uOworICBHc3RDbG9ja1RpbWUgZWFybGllc3RfdGltZTsKKworICAvKiB2aWRlbyBzdGF0ZSAqLworICBnaW50ICAgICAgICAgZnBzX251bTsKKyAgZ2ludCAgICAgICAgIGZwc19kZW5vbTsKKyAgZ2ludCAgICAgICAgIHdpZHRoOworICBnaW50ICAgICAgICAgaGVpZ2h0OworICBndWludCAgICAgICAgb3V0c2l6ZTsKKworICAvKiB2aXN1YWxpc2F0aW9uIHN0YXRlICovCisgIHN0cnVjdCBtb25vc2NvcGVfc3RhdGUgKnZpc3N0YXRlOworfTsKKworc3RydWN0IF9Hc3RNb25vc2NvcGVDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X21vbm9zY29wZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9NT05PU0NPUEVfXyAqLworCmRpZmYgLS1naXQgYS9nc3QvbW9ub3Njb3BlL21lc29uLmJ1aWxkIGIvZ3N0L21vbm9zY29wZS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWFkMTkxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L21vbm9zY29wZS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDEwIEBACitnc3Rtb25vc2NvcGUgPSBsaWJyYXJ5KCdnc3Rtb25vc2NvcGUnLAorICAnZ3N0bW9ub3Njb3BlLmMnLAorICAnbW9ub3Njb3BlLmMnLAorICAnY29udm9sdmUuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0YmFzZV9kZXAsIGdzdGF1ZGlvX2RlcCwgZ3N0dmlkZW9fZGVwXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2dzdC9tb25vc2NvcGUvbW9ub3Njb3BlLmMgYi9nc3QvbW9ub3Njb3BlL21vbm9zY29wZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDA4NzkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbW9ub3Njb3BlL21vbm9zY29wZS5jCkBAIC0wLDAgKzEsMTY4IEBACisvKiAgbW9ub3Njb3BlLmNwcAorICogIENvcHlyaWdodCAoQykgMjAwMiBSaWNoYXJkIEJvdWx0b24gPHJpY2hhcmRAdGFydGFydXMub3JnPgorICogIENvcHlyaWdodCAoQykgMTk5OC0yMDAxIEFuZHkgTG8gQSBGb2UgPGFuZHlAYWxzYXBsYXllci5vcmc+CisgKiAgT3JpZ2luYWwgY29kZSBieSBUaW5pYyBVcm8KKyAqCisgKiAgVGhpcyBjb2RlIGlzIGNvcGllZCBmcm9tIEFsc2FwbGF5ZXIuIFRoZSBvcmdpbmFsIGNvZGUgd2FzIGJ5IFRpbmljIFVybyBhbmQgdW5kZXIKKyAqICB0aGUgQlNEIGxpY2Vuc2Ugd2l0aG91dCBhIGFkdmVydGlzaWcgY2xhdXNlLiBBbmR5IExvIEEgRm9lIHRoZW4gcmVsaWNlbnNlZCB0aGUKKyAqICBjb2RlIHdoZW4gaGUgdXNlZCBpdCBmb3IgQWxzYXBsYXllciB0byBHUEwgd2l0aCBUaW5pYydzIHBlcm1pc3Npb24uIFJpY2hhcmQgQm91bHRvbgorICogIHRoZW4gdG9vayB0aGlzIGNvZGUgYW5kIG1hZGUgYSBHUEwgcGx1Z2luIG91dCBvZiBpdC4KKyAqCisgKiAgN3RoIERlY2VtYmVyIDIwMDQgQ2hyaXN0aWFuIFNjaGFsbGVyOiBSaWNoYXJkIEJvdWx0b24gYW5kIEFuZHkgTG8gQSBGb2UgZ2F2ZQorICogIHBlcm1pc3Npb24gdG8gcmVsaWNlbnNlIHRoZWlyIGNoYW5nZXMgdW5kZXIgQlNEIGxpY2Vuc2Ugc28gd2Ugd2hlcmUgYWJsZSB0byByZXN0b3JlIHRoZQorICogIGNvZGUgdG8gVGluaWMncyBvcmlnaW5hbCBCU0QgbGljZW5zZS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgdW5kZXIgd2hhdCBpcyBrbm93biBhcyB0aGUgQlNEIGxpY2Vuc2U6CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgaQorICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mCisgKiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdAorICogb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworICogT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZCisgKiBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAibW9ub3Njb3BlLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIHZvaWQKK2NvbG9yc19pbml0IChndWludDMyICogY29sb3JzKQoreworICBpbnQgaTsKKyAgaW50IGhxID0gKHNjb3BlX2hlaWdodCAvIDQpOworICBpbnQgaHExID0gaHEgLSAxOworICBpbnQgaGgxID0gKHNjb3BlX2hlaWdodCAvIDIpIC0gMTsKKyAgZG91YmxlIHNjbCA9ICgyNTYuMCAvIChkb3VibGUpIGhxKTsKKworICBmb3IgKGkgPSAwOyBpIDwgaHE7IGkrKykgeworICAgIC8qIGdyZWVuIHRvIHllbGxvdyAqLworICAgIGNvbG9yc1tpXSA9ICgoaW50KSAoaSAqIHNjbCkgPDwgMTYpICsgKDI1NSA8PCA4KTsKKyAgICAvKiB5ZWxsb3cgdG8gcmVkICovCisgICAgY29sb3JzW2kgKyBocTFdID0gKDI1NSA8PCAxNikgKyAoKGludCkgKChocTEgLSBpKSAqIHNjbCkgPDwgOCk7CisgIH0KKyAgY29sb3JzW2hoMV0gPSAoNDAgPDwgMTYpICsgKDc1IDw8IDgpOworfQorCitzdHJ1Y3QgbW9ub3Njb3BlX3N0YXRlICoKK21vbm9zY29wZV9pbml0IChndWludDMyIHJlc3gsIGd1aW50MzIgcmVzeSkKK3sKKyAgc3RydWN0IG1vbm9zY29wZV9zdGF0ZSAqc3RhdGVwdHI7CisKKyAgLyogSSBkaWRuJ3QgcHJvZ3JhbSBtb25vc2NvcGUgdG8gb25seSBkbyAyNTYqMTI4LCBidXQgaXQgd29ya3MgdGhhdCB3YXkgKi8KKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHJlc3ggPT0gc2NvcGVfd2lkdGgsIDApOworICBnX3JldHVybl92YWxfaWZfZmFpbCAocmVzeSA9PSBzY29wZV9oZWlnaHQsIDApOworICBzdGF0ZXB0ciA9IGNhbGxvYyAoMSwgc2l6ZW9mIChzdHJ1Y3QgbW9ub3Njb3BlX3N0YXRlKSk7CisgIGlmIChzdGF0ZXB0ciA9PSAwKQorICAgIHJldHVybiAwOworICBzdGF0ZXB0ci0+Y3N0YXRlID0gY29udm9sdmVfaW5pdCAoY29udm9sdmVyX2RlcHRoKTsKKyAgY29sb3JzX2luaXQgKHN0YXRlcHRyLT5jb2xvcnMpOworICByZXR1cm4gc3RhdGVwdHI7Cit9CisKK3ZvaWQKK21vbm9zY29wZV9jbG9zZSAoc3RydWN0IG1vbm9zY29wZV9zdGF0ZSAqc3RhdGVwdHIpCit7CisgIGNvbnZvbHZlX2Nsb3NlIChzdGF0ZXB0ci0+Y3N0YXRlKTsKKyAgZnJlZSAoc3RhdGVwdHIpOworfQorCitndWludDMyICoKK21vbm9zY29wZV91cGRhdGUgKHN0cnVjdCBtb25vc2NvcGVfc3RhdGUgKnN0YXRlcHRyLCBnaW50MTYgZGF0YVtjb252b2x2ZXJfYmlnXSkKK3sKKyAgLyogUmVhbGx5LCB3ZSB3YW50IHNhbXBsZXMgZXZlbmx5IHNwcmVhZCBvdmVyIHRoZSBhdmFpbGFibGUgZGF0YS4KKyAgICogSnVzdCB0YWtpbmcgYSBjb250aW51b3VzIGNodW5rIHdpbGwgZG8gZm9yIG5vdywgdGhvdWdoLiAqLworICBpbnQgaTsKKyAgaW50IGZvbywgYmFyOworICBpbnQgYXZnOworICBpbnQgaDsKKyAgaW50IGhoID0gKHNjb3BlX2hlaWdodCAvIDIpOworICBpbnQgaGgxID0gaGggLSAxOworICBndWludDMyICpsb2M7CisKKyAgZG91YmxlIGZhY3RvcjsKKyAgaW50IG1heCA9IDE7CisgIHNob3J0ICp0aGlzRXEgPSBzdGF0ZXB0ci0+Y29weUVxOworCisgIG1lbWNweSAodGhpc0VxLCBkYXRhLCBzaXplb2YgKHNob3J0KSAqIGNvbnZvbHZlcl9iaWcpOworICB0aGlzRXEgKz0gY29udm9sdmVfbWF0Y2ggKHN0YXRlcHRyLT5hdmdFcSwgdGhpc0VxLCBzdGF0ZXB0ci0+Y3N0YXRlKTsKKworICBtZW1zZXQgKHN0YXRlcHRyLT5kaXNwbGF5LCAwLCBzY29wZV93aWR0aCAqIHNjb3BlX2hlaWdodCAqIHNpemVvZiAoZ3VpbnQzMikpOworICBmb3IgKGkgPSAwOyBpIDwgY29udm9sdmVyX3NtYWxsOyBpKyspIHsKKyAgICBhdmcgPSAodGhpc0VxW2ldICsgc3RhdGVwdHItPmF2Z0VxW2ldKSA+PiAxOworICAgIHN0YXRlcHRyLT5hdmdFcVtpXSA9IGF2ZzsKKyAgICBhdmcgPSBhYnMgKGF2Zyk7CisgICAgbWF4ID0gTUFYIChtYXgsIGF2Zyk7CisgIH0KKyAgLyogcnVubmluZyBhdmVyYWdlLCA0IHZhbHVlcyBpcyBlbm91Z2ggdG8gbWFrZSBpdCBmb2xsb3cgdm9sdW1lIGNoYW5nZXMKKyAgICogaWYgdGhpcyB2YWx1ZSBpcyB0b28gbGFyZ2UgaXQgd2lsbCBjb252ZXJnZSBzbG93bHkKKyAgICovCisgIHN0YXRlcHRyLT5hdmdNYXggKz0gKG1heCAvIDQpIC0gKHN0YXRlcHRyLT5hdmdNYXggLyA0KTsKKworICAvKiBpbnB1dCBpcyArLy0gYXZnTWF4LCBvdXRwdXQgaXMgKy8tIGhoICovCisgIGlmIChzdGF0ZXB0ci0+YXZnTWF4KSB7CisgICAgZmFjdG9yID0gKGdkb3VibGUpIGhoIC8gc3RhdGVwdHItPmF2Z01heDsKKyAgfSBlbHNlIHsKKyAgICBmYWN0b3IgPSAxLjA7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgc2NvcGVfd2lkdGg7IGkrKykgeworICAgIC8qIHNjYWxlIDE2Yml0IHNpZ25lZCBhdWRpbyB2YWx1ZXMgdG8gc2NvcGVfaGVpZ2h0ICovCisgICAgZm9vID0gc3RhdGVwdHItPmF2Z0VxW2ldICogZmFjdG9yOworICAgIGZvbyA9IENMQU1QIChmb28sIC1oaDEsIGhoMSk7CisgICAgYmFyID0gKGkgKyAoKGZvbyArIGhoKSAqIHNjb3BlX3dpZHRoKSk7CisgICAgaWYgKChiYXIgPiAwKSAmJiAoYmFyIDwgKHNjb3BlX3dpZHRoICogc2NvcGVfaGVpZ2h0KSkpIHsKKyAgICAgIGxvYyA9IHN0YXRlcHRyLT5kaXNwbGF5ICsgYmFyOworICAgICAgLyogZHJhdyB1cCAvIGRvd24gYmFycyAqLworICAgICAgaWYgKGZvbyA8IDApIHsKKyAgICAgICAgZm9yIChoID0gMDsgaCA8PSAoLWZvbyk7IGgrKykgeworICAgICAgICAgICpsb2MgPSBzdGF0ZXB0ci0+Y29sb3JzW2hdOworICAgICAgICAgIGxvYyArPSBzY29wZV93aWR0aDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChoID0gMDsgaCA8PSBmb287IGgrKykgeworICAgICAgICAgICpsb2MgPSBzdGF0ZXB0ci0+Y29sb3JzW2hdOworICAgICAgICAgIGxvYyAtPSBzY29wZV93aWR0aDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIERyYXcgZ3JpZC4gKi8KKyAgeworICAgIGd1aW50MzIgZ3JheSA9IHN0YXRlcHRyLT5jb2xvcnNbaGgxXTsKKworICAgIGZvciAoaSA9IDE2OyBpIDwgc2NvcGVfaGVpZ2h0OyBpICs9IDE2KSB7CisgICAgICBmb3IgKGggPSAwOyBoIDwgc2NvcGVfd2lkdGg7IGggKz0gMikgeworICAgICAgICBzdGF0ZXB0ci0+ZGlzcGxheVsoaSAqIHNjb3BlX3dpZHRoKSArIGhdID0gZ3JheTsKKyAgICAgICAgaWYgKGkgPT0gaGgpCisgICAgICAgICAgc3RhdGVwdHItPmRpc3BsYXlbKGkgKiBzY29wZV93aWR0aCkgKyBoICsgMV0gPSBncmF5OworICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAxNjsgaSA8IHNjb3BlX3dpZHRoOyBpICs9IDE2KSB7CisgICAgICBmb3IgKGggPSAwOyBoIDwgc2NvcGVfaGVpZ2h0OyBoICs9IDIpIHsKKyAgICAgICAgc3RhdGVwdHItPmRpc3BsYXlbaSArIChoICogc2NvcGVfd2lkdGgpXSA9IGdyYXk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBzdGF0ZXB0ci0+ZGlzcGxheTsKK30KZGlmZiAtLWdpdCBhL2dzdC9tb25vc2NvcGUvbW9ub3Njb3BlLmggYi9nc3QvbW9ub3Njb3BlL21vbm9zY29wZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmODRkYzkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbW9ub3Njb3BlL21vbm9zY29wZS5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZm5kZWYgX01PTk9TQ09QRV9ICisjZGVmaW5lIF9NT05PU0NPUEVfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgImNvbnZvbHZlLmgiCisKKyNkZWZpbmUgY29udm9sdmVyX2RlcHRoIDgKKyNkZWZpbmUgY29udm9sdmVyX3NtYWxsICgxIDw8IGNvbnZvbHZlcl9kZXB0aCkKKyNkZWZpbmUgY29udm9sdmVyX2JpZyAoMiA8PCBjb252b2x2ZXJfZGVwdGgpCisjZGVmaW5lIHNjb3BlX3dpZHRoIDI1NgorI2RlZmluZSBzY29wZV9oZWlnaHQgMTI4CisKK3N0cnVjdCBtb25vc2NvcGVfc3RhdGUgeworICBzaG9ydCBjb3B5RXFbY29udm9sdmVyX2JpZ107CisgIGludCBhdmdFcVtjb252b2x2ZXJfc21hbGxdOyAgICAgIC8qIGEgcnVubmluZyBhdmVyYWdlIG9mIHRoZSBsYXN0IGZldy4gKi8KKyAgaW50IGF2Z01heDsgICAgICAgICAgICAgICAgICAgICAvKiBydW5uaW5nIGF2ZXJhZ2Ugb2YgbWF4IHNhbXBsZS4gKi8KKyAgZ3VpbnQzMiBkaXNwbGF5W3Njb3BlX3dpZHRoICogc2NvcGVfaGVpZ2h0XTsKKworICBjb252b2x2ZV9zdGF0ZSAqY3N0YXRlOworICBndWludDMyIGNvbG9yc1tzY29wZV9oZWlnaHQgLyAyXTsKK307CisKK3N0cnVjdCBtb25vc2NvcGVfc3RhdGUgKiBtb25vc2NvcGVfaW5pdCAoZ3VpbnQzMiByZXN4LCBndWludDMyIHJlc3kpOworZ3VpbnQzMiAqIG1vbm9zY29wZV91cGRhdGUgKHN0cnVjdCBtb25vc2NvcGVfc3RhdGUgKiBzdGF0ZXB0ciwgZ2ludDE2IGRhdGEgW2NvbnZvbHZlcl9iaWddKTsKK3ZvaWQgbW9ub3Njb3BlX2Nsb3NlIChzdHJ1Y3QgbW9ub3Njb3BlX3N0YXRlICogc3RhdGVwdHIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvTWFrZWZpbGUuYW0gYi9nc3QvbXVsdGlmaWxlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZThhMTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbXVsdGlmaWxlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzEgQEAKKworcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0bXVsdGlmaWxlLmxhCisKK2xpYmdzdG11bHRpZmlsZV9sYV9TT1VSQ0VTID0gXAorCWdzdG11bHRpZmlsZXNpbmsuYyAgIFwKKwlnc3RtdWx0aWZpbGVzcmMuYyAgICBcCisJZ3N0bXVsdGlmaWxlLmMgICAgICAgXAorCWdzdHNwbGl0ZmlsZXNyYy5jICAgIFwKKwlnc3RzcGxpdG11eHNpbmsuYyAgICBcCisJZ3N0c3BsaXRtdXhwYXJ0cmVhZGVyLmMgXAorCWdzdHNwbGl0bXV4c3JjLmMgXAorCWdzdHNwbGl0dXRpbHMuYyAgICBcCisJcGF0dGVybnNwZWMuYworbGliZ3N0bXVsdGlmaWxlX2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoR0lPX0NGTEFHUykKK2xpYmdzdG11bHRpZmlsZV9sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R2aWRlby1AR1NUX0FQSV9WRVJTSU9OQCAkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoR0lPX0xJQlMpCitsaWJnc3RtdWx0aWZpbGVfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdG11bHRpZmlsZXNyYy5oIGdzdG11bHRpZmlsZXNpbmsuaCBnc3RzcGxpdGZpbGVzcmMuaCBnc3RzcGxpdG11eHNpbmsuaCBcCisJZ3N0c3BsaXRtdXhzcmMuaCBnc3RzcGxpdG11eHBhcnRyZWFkZXIuaCBnc3RzcGxpdHV0aWxzLmggcGF0dGVybnNwZWMuaAorCitub2luc3RfUFJPR1JBTVMgPSB0ZXN0LXNwbGl0bXV4LXBhcnQtcmVhZGVyCisKK3Rlc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfU09VUkNFUyA9IFwKKwl0ZXN0LXNwbGl0bXV4cGFydHJlYWRlci5jIFwKKwlnc3RzcGxpdG11eHBhcnRyZWFkZXIuYyBcCisJZ3N0c3BsaXRtdXhzcmMuYyBcCisJZ3N0c3BsaXR1dGlscy5jIFwKKwlwYXR0ZXJuc3BlYy5jCit0ZXN0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoR0lPX0NGTEFHUykKK3Rlc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R2aWRlby1AR1NUX0FQSV9WRVJTSU9OQCAkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoR0lPX0xJQlMpCit0ZXN0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlLmMgYi9nc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYmI2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZS5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDAwIFdpbSBUYXltYW5zIDx3dGF5QGNoZWxsby5iZT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDA2IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwNiBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBnc3RtdWx0aWZpbGVzaW5rLmM6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnc3RtdWx0aWZpbGVzaW5rLmgiCisjaW5jbHVkZSAiZ3N0bXVsdGlmaWxlc3JjLmgiCisjaW5jbHVkZSAiZ3N0c3BsaXRmaWxlc3JjLmgiCisjaW5jbHVkZSAiZ3N0c3BsaXRtdXhzaW5rLmgiCisjaW5jbHVkZSAiZ3N0c3BsaXRtdXhzcmMuaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAibXVsdGlmaWxlc3JjIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIGdzdF9tdWx0aV9maWxlX3NyY19nZXRfdHlwZSAoKSk7CisgIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJtdWx0aWZpbGVzaW5rIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIGdzdF9tdWx0aV9maWxlX3NpbmtfZ2V0X3R5cGUgKCkpOworICBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAic3BsaXRmaWxlc3JjIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIGdzdF9zcGxpdF9maWxlX3NyY19nZXRfdHlwZSAoKSk7CisKKyAgaWYgKCFyZWdpc3Rlcl9zcGxpdG11eHNpbmsgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghcmVnaXN0ZXJfc3BsaXRtdXhzcmMgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgbXVsdGlmaWxlLAorICAgICJSZWFkcy9Xcml0ZXMgYnVmZmVycyBmcm9tL3RvIHNlcXVlbnRpYWxseSBuYW1lZCBmaWxlcyIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKTsKZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jIGIvZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJhNTVlZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5jCkBAIC0wLDAgKzEsMTEyOSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAgICAgIDIwMDAgV2ltIFRheW1hbnMgPHd0YXlAY2hlbGxvLmJlPgorICogICAgICAgICAgICAgICAgICAgIDIwMDYgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDA2IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogICAgICAgICAgICAgICAgICAgIDIwMTEgQ29sbGFib3JhIEx0ZC4gPHRpbS5tdWxsZXJAY29sbGFib3JhLmNvLnVrPgorICogICAgICAgICAgICAgICAgICAgIDIwMTUgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBnc3RtdWx0aWZpbGVzaW5rLmM6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LW11bHRpZmlsZXNpbmsKKyAqIEBzZWVfYWxzbzogI0dzdEZpbGVTcmMKKyAqCisgKiBXcml0ZSBpbmNvbWluZyBkYXRhIHRvIGEgc2VyaWVzIG9mIHNlcXVlbnRpYWxseS1uYW1lZCBmaWxlcy4KKyAqCisgKiBUaGlzIGVsZW1lbnQgaXMgdXN1YWxseSB1c2VkIHdpdGggZGF0YSB3aGVyZSBlYWNoIGJ1ZmZlciBpcyBhbgorICogaW5kZXBlbmRlbnQgdW5pdCBvZiBkYXRhIGluIGl0cyBvd24gcmlnaHQgKGUuZy4gcmF3IHZpZGVvIGJ1ZmZlcnMgb3IKKyAqIGVuY29kZWQgSlBFRyBvciBQTkcgaW1hZ2VzKSBvciB3aXRoIHN0cmVhbWFibGUgY29udGFpbmVyIGZvcm1hdHMgc3VjaAorICogYXMgTVBFRy1UUyBvciBNUEVHLVBTLgorICoKKyAqIEl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgdGhpcyBlbGVtZW50IHRvIGNyZWF0ZSBpbmRlcGVuZGVudGx5IHBsYXlhYmxlCisgKiBtcDQgZmlsZXMsIHVzZSB0aGUgc3BsaXRtdXhzaW5rIGVsZW1lbnQgZm9yIHRoYXQgaW5zdGVhZC4KKyAqCisgKiBUaGUgZmlsZW5hbWUgcHJvcGVydHkgc2hvdWxkIGNvbnRhaW4gYSBzdHJpbmcgd2l0aCBhIFwlZCBwbGFjZWhvbGRlciB0aGF0IHdpbGwKKyAqIGJlIHN1YnN0aXR1dGVkIHdpdGggdGhlIGluZGV4IGZvciBlYWNoIGZpbGVuYW1lLgorICoKKyAqIElmIHRoZSAjR3N0TXVsdGlGaWxlU2luazpwb3N0LW1lc3NhZ2VzIHByb3BlcnR5IGlzICVUUlVFLCBpdCBzZW5kcyBhbiBhcHBsaWNhdGlvbgorICogbWVzc2FnZSBuYW1lZAorICogPGNsYXNzbmFtZT4mcXVvdDtHc3RNdWx0aUZpbGVTaW5rJnF1b3Q7PC9jbGFzc25hbWU+IGFmdGVyIHdyaXRpbmcgZWFjaAorICogYnVmZmVyLgorICoKKyAqIFRoZSBtZXNzYWdlJ3Mgc3RydWN0dXJlIGNvbnRhaW5zIHRoZXNlIGZpZWxkczoKKyAqIDxpdGVtaXplZGxpc3Q+CisgKiA8bGlzdGl0ZW0+CisgKiAgIDxwYXJhPgorICogICAjZ2NoYXIgKgorICogICA8Y2xhc3NuYW1lPiZxdW90O2ZpbGVuYW1lJnF1b3Q7PC9jbGFzc25hbWU+OgorICogICB0aGUgZmlsZW5hbWUgd2hlcmUgdGhlIGJ1ZmZlciB3YXMgd3JpdHRlbi4KKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNnaW50CisgKiAgIDxjbGFzc25hbWU+JnF1b3Q7aW5kZXgmcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgIHRoZSBpbmRleCBvZiB0aGUgYnVmZmVyLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPGxpc3RpdGVtPgorICogICA8cGFyYT4KKyAqICAgI0dzdENsb2NrVGltZQorICogICA8Y2xhc3NuYW1lPiZxdW90O3RpbWVzdGFtcCZxdW90OzwvY2xhc3NuYW1lPjoKKyAqICAgdGhlIHRpbWVzdGFtcCBvZiB0aGUgYnVmZmVyLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPGxpc3RpdGVtPgorICogICA8cGFyYT4KKyAqICAgI0dzdENsb2NrVGltZQorICogICA8Y2xhc3NuYW1lPiZxdW90O3N0cmVhbS10aW1lJnF1b3Q7PC9jbGFzc25hbWU+OgorICogICB0aGUgc3RyZWFtIHRpbWUgb2YgdGhlIGJ1ZmZlci4KKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNHc3RDbG9ja1RpbWUKKyAqICAgPGNsYXNzbmFtZT4mcXVvdDtydW5uaW5nLXRpbWUmcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgIHRoZSBydW5uaW5nX3RpbWUgb2YgdGhlIGJ1ZmZlci4KKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNHc3RDbG9ja1RpbWUKKyAqICAgPGNsYXNzbmFtZT4mcXVvdDtkdXJhdGlvbiZxdW90OzwvY2xhc3NuYW1lPjoKKyAqICAgdGhlIGR1cmF0aW9uIG9mIHRoZSBidWZmZXIuCisgKiAgIDwvcGFyYT4KKyAqIDwvbGlzdGl0ZW0+CisgKiA8bGlzdGl0ZW0+CisgKiAgIDxwYXJhPgorICogICAjZ3VpbnQ2NAorICogICA8Y2xhc3NuYW1lPiZxdW90O29mZnNldCZxdW90OzwvY2xhc3NuYW1lPjoKKyAqICAgdGhlIG9mZnNldCBvZiB0aGUgYnVmZmVyIHRoYXQgdHJpZ2dlcmVkIHRoZSBtZXNzYWdlLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPGxpc3RpdGVtPgorICogICA8cGFyYT4KKyAqICAgI2d1aW50NjQKKyAqICAgPGNsYXNzbmFtZT4mcXVvdDtvZmZzZXQtZW5kJnF1b3Q7PC9jbGFzc25hbWU+OgorICogICB0aGUgb2Zmc2V0LWVuZCBvZiB0aGUgYnVmZmVyIHRoYXQgdHJpZ2dlcmVkIHRoZSBtZXNzYWdlLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPC9pdGVtaXplZGxpc3Q+CisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGF1ZGlvdGVzdHNyYyAhIG11bHRpZmlsZXNpbmsKKyAqIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyAhIG11bHRpZmlsZXNpbmsgcG9zdC1tZXNzYWdlcz10cnVlIGxvY2F0aW9uPSJmcmFtZSVkIgorICogXXwKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdsaWIvZ3N0ZGlvLmg+CisjaW5jbHVkZSAiZ3N0bXVsdGlmaWxlc2luay5oIgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9tdWx0aV9maWxlX3NpbmtfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X211bHRpX2ZpbGVfc2lua19kZWJ1ZworCisjZGVmaW5lIERFRkFVTFRfTE9DQVRJT04gIiUwNWQiCisjZGVmaW5lIERFRkFVTFRfSU5ERVggMAorI2RlZmluZSBERUZBVUxUX1BPU1RfTUVTU0FHRVMgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9ORVhUX0ZJTEUgR1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX0JVRkZFUgorI2RlZmluZSBERUZBVUxUX01BWF9GSUxFUyAwCisjZGVmaW5lIERFRkFVTFRfTUFYX0ZJTEVfU0laRSBHX0dVSU5UNjRfQ09OU1RBTlQoMioxMDI0KjEwMjQqMTAyNCkKKyNkZWZpbmUgREVGQVVMVF9NQVhfRklMRV9EVVJBVElPTiBHU1RfQ0xPQ0tfVElNRV9OT05FCisjZGVmaW5lIERFRkFVTFRfQUdHUkVHQVRFX0dPUFMgRkFMU0UKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTE9DQVRJT04sCisgIFBST1BfSU5ERVgsCisgIFBST1BfUE9TVF9NRVNTQUdFUywKKyAgUFJPUF9ORVhUX0ZJTEUsCisgIFBST1BfTUFYX0ZJTEVTLAorICBQUk9QX01BWF9GSUxFX1NJWkUsCisgIFBST1BfTUFYX0ZJTEVfRFVSQVRJT04sCisgIFBST1BfQUdHUkVHQVRFX0dPUFMKK307CisKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aV9maWxlX3NpbmtfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3RfbXVsdGlfZmlsZV9zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aV9maWxlX3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X211bHRpX2ZpbGVfc2lua19zdGFydCAoR3N0QmFzZVNpbmsgKiBic2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X211bHRpX2ZpbGVfc2lua19zdG9wIChHc3RCYXNlU2luayAqIHNpbmspOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X211bHRpX2ZpbGVfc2lua19yZW5kZXIgKEdzdEJhc2VTaW5rICogc2luaywKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X211bHRpX2ZpbGVfc2lua19yZW5kZXJfbGlzdCAoR3N0QmFzZVNpbmsgKiBzaW5rLAorICAgIEdzdEJ1ZmZlckxpc3QgKiBidWZmZXJfbGlzdCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X211bHRpX2ZpbGVfc2lua19zZXRfY2FwcyAoR3N0QmFzZVNpbmsgKiBzaW5rLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbXVsdGlfZmlsZV9zaW5rX29wZW5fbmV4dF9maWxlIChHc3RNdWx0aUZpbGVTaW5rICoKKyAgICBtdWx0aWZpbGVzaW5rKTsKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aV9maWxlX3NpbmtfY2xvc2VfZmlsZSAoR3N0TXVsdGlGaWxlU2luayAqIG11bHRpZmlsZXNpbmssCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aV9maWxlX3NpbmtfYWRkX29sZF9maWxlIChHc3RNdWx0aUZpbGVTaW5rICogbXVsdGlmaWxlc2luaywKKyAgICBnY2hhciAqIGZuKTsKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aV9maWxlX3NpbmtfZW5zdXJlX21heF9maWxlcyAoR3N0TXVsdGlGaWxlU2luayAqCisgICAgbXVsdGlmaWxlc2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X211bHRpX2ZpbGVfc2lua19ldmVudCAoR3N0QmFzZVNpbmsgKiBzaW5rLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCisjZGVmaW5lIEdTVF9UWVBFX01VTFRJX0ZJTEVfU0lOS19ORVhUIChnc3RfbXVsdGlfZmlsZV9zaW5rX25leHRfZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9tdWx0aV9maWxlX3NpbmtfbmV4dF9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIG11bHRpX2ZpbGVfc2lua19uZXh0X3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBuZXh0X3R5cGVzW10gPSB7CisgICAge0dTVF9NVUxUSV9GSUxFX1NJTktfTkVYVF9CVUZGRVIsICJOZXcgZmlsZSBmb3IgZWFjaCBidWZmZXIiLCAiYnVmZmVyIn0sCisgICAge0dTVF9NVUxUSV9GSUxFX1NJTktfTkVYVF9ESVNDT05ULCAiTmV3IGZpbGUgYWZ0ZXIgZWFjaCBkaXNjb250aW51aXR5IiwKKyAgICAgICAgImRpc2NvbnQifSwKKyAgICB7R1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX0tFWV9GUkFNRSwgIk5ldyBmaWxlIGF0IGVhY2gga2V5IGZyYW1lICIKKyAgICAgICAgICAiKFVzZWZ1bCBmb3IgTVBFRy1UUyBzZWdtZW50aW5nKSIsICJrZXktZnJhbWUifSwKKyAgICB7R1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX0tFWV9VTklUX0VWRU5ULAorICAgICAgICAiTmV3IGZpbGUgYWZ0ZXIgYSBmb3JjZSBrZXkgdW5pdCBldmVudCIsICJrZXktdW5pdC1ldmVudCJ9LAorICAgIHtHU1RfTVVMVElfRklMRV9TSU5LX05FWFRfTUFYX1NJWkUsICJOZXcgZmlsZSB3aGVuIHRoZSBjb25maWd1cmVkIG1heGltdW0gIgorICAgICAgICAgICJmaWxlIHNpemUgd291bGQgYmUgZXhjZWVkZWQgd2l0aCB0aGUgbmV4dCBidWZmZXIgb3IgYnVmZmVyIGxpc3QiLAorICAgICAgICAibWF4LXNpemUifSwKKyAgICB7R1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX01BWF9EVVJBVElPTiwKKyAgICAgICAgICAiTmV3IGZpbGUgd2hlbiB0aGUgY29uZmlndXJlZCBtYXhpbXVtICIKKyAgICAgICAgICAiZmlsZSBkdXJhdGlvbiB3b3VsZCBiZSBleGNlZWRlZCB3aXRoIHRoZSBuZXh0IGJ1ZmZlciBvciBidWZmZXIgbGlzdCIsCisgICAgICAgICJtYXgtZHVyYXRpb24ifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0KKyAgfTsKKworICBpZiAoIW11bHRpX2ZpbGVfc2lua19uZXh0X3R5cGUpIHsKKyAgICBtdWx0aV9maWxlX3NpbmtfbmV4dF90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdE11bHRpRmlsZVNpbmtOZXh0IiwgbmV4dF90eXBlcyk7CisgIH0KKworICByZXR1cm4gbXVsdGlfZmlsZV9zaW5rX25leHRfdHlwZTsKK30KKworI2RlZmluZSBnc3RfbXVsdGlfZmlsZV9zaW5rX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdE11bHRpRmlsZVNpbmssIGdzdF9tdWx0aV9maWxlX3NpbmssIEdTVF9UWVBFX0JBU0VfU0lOSyk7CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGlfZmlsZV9zaW5rX2NsYXNzX2luaXQgKEdzdE11bHRpRmlsZVNpbmtDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBHc3RCYXNlU2lua0NsYXNzICpnc3RiYXNlc2lua19jbGFzcyA9IEdTVF9CQVNFX1NJTktfQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfbXVsdGlfZmlsZV9zaW5rX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X211bHRpX2ZpbGVfc2lua19nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MT0NBVElPTiwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJsb2NhdGlvbiIsICJGaWxlIExvY2F0aW9uIiwKKyAgICAgICAgICAiTG9jYXRpb24gb2YgdGhlIGZpbGUgdG8gd3JpdGUiLCBOVUxMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSU5ERVgsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiaW5kZXgiLCAiSW5kZXgiLAorICAgICAgICAgICJJbmRleCB0byB1c2Ugd2l0aCBsb2NhdGlvbiBwcm9wZXJ0eSB0byBjcmVhdGUgZmlsZSBuYW1lcy4gIFRoZSAiCisgICAgICAgICAgImluZGV4IGlzIGluY3JlbWVudGVkIGJ5IG9uZSBmb3IgZWFjaCBidWZmZXIgd3JpdHRlbi4iLAorICAgICAgICAgIDAsIEdfTUFYSU5ULCBERUZBVUxUX0lOREVYLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0TXVsdGlGaWxlU2luazpwb3N0LW1lc3NhZ2VzOgorICAgKgorICAgKiBQb3N0IGEgbWVzc2FnZSBvbiB0aGUgR3N0QnVzIGZvciBlYWNoIGZpbGUuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BPU1RfTUVTU0FHRVMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInBvc3QtbWVzc2FnZXMiLCAiUG9zdCBNZXNzYWdlcyIsCisgICAgICAgICAgIlBvc3QgYSBtZXNzYWdlIGZvciBlYWNoIGZpbGUgd2l0aCBpbmZvcm1hdGlvbiBvZiB0aGUgYnVmZmVyIiwKKyAgICAgICAgICBERUZBVUxUX1BPU1RfTUVTU0FHRVMsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0TXVsdGlGaWxlU2luazpuZXh0LWZpbGU6CisgICAqCisgICAqIFdoZW4gdG8gc3RhcnQgYSBuZXcgZmlsZS4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTkVYVF9GSUxFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJuZXh0LWZpbGUiLCAiTmV4dCBGaWxlIiwKKyAgICAgICAgICAiV2hlbiB0byBzdGFydCBhIG5ldyBmaWxlIiwKKyAgICAgICAgICBHU1RfVFlQRV9NVUxUSV9GSUxFX1NJTktfTkVYVCwgREVGQVVMVF9ORVhUX0ZJTEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKworICAvKioKKyAgICogR3N0TXVsdGlGaWxlU2luazptYXgtZmlsZXM6CisgICAqCisgICAqIE1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRvIGtlZXAgb24gZGlzay4gT25jZSB0aGUgbWF4aW11bSBpcyByZWFjaGVkLCBvbGQKKyAgICogZmlsZXMgc3RhcnQgdG8gYmUgZGVsZXRlZCB0byBtYWtlIHJvb20gZm9yIG5ldyBvbmVzLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfRklMRVMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm1heC1maWxlcyIsICJNYXggZmlsZXMiLAorICAgICAgICAgICJNYXhpbXVtIG51bWJlciBvZiBmaWxlcyB0byBrZWVwIG9uIGRpc2suIE9uY2UgdGhlIG1heGltdW0gaXMgcmVhY2hlZCwiCisgICAgICAgICAgIm9sZCBmaWxlcyBzdGFydCB0byBiZSBkZWxldGVkIHRvIG1ha2Ugcm9vbSBmb3IgbmV3IG9uZXMuIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfTUFYX0ZJTEVTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RNdWx0aUZpbGVTaW5rOm1heC1maWxlLXNpemU6CisgICAqCisgICAqIE1heGltdW0gZmlsZSBzaXplIGJlZm9yZSBzdGFydGluZyBhIG5ldyBmaWxlIGluIG1heC1zaXplIG1vZGUuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01BWF9GSUxFX1NJWkUsCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgibWF4LWZpbGUtc2l6ZSIsICJNYXhpbXVtIEZpbGUgU2l6ZSIsCisgICAgICAgICAgIk1heGltdW0gZmlsZSBzaXplIGJlZm9yZSBzdGFydGluZyBhIG5ldyBmaWxlIGluIG1heC1zaXplIG1vZGUiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDY0LCBERUZBVUxUX01BWF9GSUxFX1NJWkUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdE11bHRpRmlsZVNpbms6bWF4LWZpbGUtZHVyYXRpb246CisgICAqCisgICAqIE1heGltdW0gZmlsZSBzaXplIGJlZm9yZSBzdGFydGluZyBhIG5ldyBmaWxlIGluIG1heC1zaXplIG1vZGUuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01BWF9GSUxFX0RVUkFUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoIm1heC1maWxlLWR1cmF0aW9uIiwgIk1heGltdW0gRmlsZSBEdXJhdGlvbiIsCisgICAgICAgICAgIk1heGltdW0gZmlsZSBkdXJhdGlvbiBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgZmlsZSBpbiBtYXgtc2l6ZSBtb2RlICIKKyAgICAgICAgICAiKGluIG5hbm9zZWNvbmRzKSIsIDAsIEdfTUFYVUlOVDY0LCBERUZBVUxUX01BWF9GSUxFX0RVUkFUSU9OLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RNdWx0aUZpbGVTaW5rOmFnZ3JlZ2F0ZS1nb3BzOgorICAgKgorICAgKiBXaGV0aGVyIHRvIGFnZ3JlZ2F0ZSBjb21wbGV0ZSBHT1BzIGJlZm9yZSBkb2luZyBhbnkgcHJvY2Vzc2luZy4gU2V0IHRoaXMKKyAgICogdG8gVFJVRSB0byBtYWtlIHN1cmUgZWFjaCBuZXcgZmlsZSBzdGFydHMgd2l0aCBhIGtleWZyYW1lLiBUaGlzIHJlcXVpcmVzCisgICAqIHRoZSB1cHN0cmVhbSBlbGVtZW50IHRvIGZsYWcgYnVmZmVycyBjb250YWluaW5nIGtleSB1bml0cyBhbmQgZGVsdGEKKyAgICogdW5pdHMgY29ycmVjdGx5LiBBdCBsZWFzdCB0aGUgTVBFRy1QUyBhbmQgTVBFRy1UUyBtdXhlcnMgc2hvdWxkIGJlIGRvaW5nCisgICAqIHRoaXMuCisgICAqCisgICAqIFNpbmNlOiAxLjYKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQUdHUkVHQVRFX0dPUFMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImFnZ3JlZ2F0ZS1nb3BzIiwgIkFnZ3JlZ2F0ZSBHT1BzIiwKKyAgICAgICAgICAiV2hldGhlciB0byBhZ2dyZWdhdGUgR09QcyBhbmQgcHJvY2VzcyB0aGVtIGFzIGEgd2hvbGUgd2l0aG91dCAiCisgICAgICAgICAgInNwbGl0dGluZyIsIERFRkFVTFRfQUdHUkVHQVRFX0dPUFMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfbXVsdGlfZmlsZV9zaW5rX2ZpbmFsaXplOworCisgIGdzdGJhc2VzaW5rX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXVsdGlfZmlsZV9zaW5rX3N0YXJ0KTsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X211bHRpX2ZpbGVfc2lua19zdG9wKTsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnJlbmRlciA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXVsdGlfZmlsZV9zaW5rX3JlbmRlcik7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5yZW5kZXJfbGlzdCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X211bHRpX2ZpbGVfc2lua19yZW5kZXJfbGlzdCk7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5zZXRfY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X211bHRpX2ZpbGVfc2lua19zZXRfY2Fwcyk7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5ldmVudCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfbXVsdGlfZmlsZV9zaW5rX2V2ZW50KTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X211bHRpX2ZpbGVfc2lua19kZWJ1ZywgIm11bHRpZmlsZXNpbmsiLCAwLAorICAgICAgIm11bHRpZmlsZXNpbmsgZWxlbWVudCIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIk11bHRpLUZpbGUgU2luayIsCisgICAgICAiU2luay9GaWxlIiwKKyAgICAgICJXcml0ZSBidWZmZXJzIHRvIGEgc2VxdWVudGlhbGx5IG5hbWVkIHNldCBvZiBmaWxlcyIsCisgICAgICAiRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGlfZmlsZV9zaW5rX2luaXQgKEdzdE11bHRpRmlsZVNpbmsgKiBtdWx0aWZpbGVzaW5rKQoreworICBtdWx0aWZpbGVzaW5rLT5maWxlbmFtZSA9IGdfc3RyZHVwIChERUZBVUxUX0xPQ0FUSU9OKTsKKyAgbXVsdGlmaWxlc2luay0+aW5kZXggPSBERUZBVUxUX0lOREVYOworICBtdWx0aWZpbGVzaW5rLT5wb3N0X21lc3NhZ2VzID0gREVGQVVMVF9QT1NUX01FU1NBR0VTOworICBtdWx0aWZpbGVzaW5rLT5tYXhfZmlsZXMgPSBERUZBVUxUX01BWF9GSUxFUzsKKyAgbXVsdGlmaWxlc2luay0+bWF4X2ZpbGVfc2l6ZSA9IERFRkFVTFRfTUFYX0ZJTEVfU0laRTsKKyAgbXVsdGlmaWxlc2luay0+bWF4X2ZpbGVfZHVyYXRpb24gPSBERUZBVUxUX01BWF9GSUxFX0RVUkFUSU9OOworCisgIG11bHRpZmlsZXNpbmstPmFnZ3JlZ2F0ZV9nb3BzID0gREVGQVVMVF9BR0dSRUdBVEVfR09QUzsKKyAgbXVsdGlmaWxlc2luay0+Z29wX2FkYXB0ZXIgPSBOVUxMOworCisgIGdzdF9iYXNlX3Npbmtfc2V0X3N5bmMgKEdTVF9CQVNFX1NJTksgKG11bHRpZmlsZXNpbmspLCBGQUxTRSk7CisKKyAgbXVsdGlmaWxlc2luay0+bmV4dF9zZWdtZW50ID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgbXVsdGlmaWxlc2luay0+Zm9yY2Vfa2V5X3VuaXRfY291bnQgPSAtMTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3NpbmtfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdE11bHRpRmlsZVNpbmsgKnNpbmsgPSBHU1RfTVVMVElfRklMRV9TSU5LIChvYmplY3QpOworCisgIGdfZnJlZSAoc2luay0+ZmlsZW5hbWUpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbXVsdGlfZmlsZV9zaW5rX3NldF9sb2NhdGlvbiAoR3N0TXVsdGlGaWxlU2luayAqIHNpbmssCisgICAgY29uc3QgZ2NoYXIgKiBsb2NhdGlvbikKK3sKKyAgZ19mcmVlIChzaW5rLT5maWxlbmFtZSk7CisgIC8qIEZJWE1FOiB2YWxpZGF0ZSBsb2NhdGlvbiB0byBoYXZlIGp1c3Qgb25lICVkICovCisgIHNpbmstPmZpbGVuYW1lID0gZ19zdHJkdXAgKGxvY2F0aW9uKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3Npbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE11bHRpRmlsZVNpbmsgKnNpbmsgPSBHU1RfTVVMVElfRklMRV9TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjoKKyAgICAgIGdzdF9tdWx0aV9maWxlX3Npbmtfc2V0X2xvY2F0aW9uIChzaW5rLCBnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSU5ERVg6CisgICAgICBzaW5rLT5pbmRleCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BPU1RfTUVTU0FHRVM6CisgICAgICBzaW5rLT5wb3N0X21lc3NhZ2VzID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05FWFRfRklMRToKKyAgICAgIHNpbmstPm5leHRfZmlsZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfRklMRVM6CisgICAgICBzaW5rLT5tYXhfZmlsZXMgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX0ZJTEVfU0laRToKKyAgICAgIHNpbmstPm1heF9maWxlX3NpemUgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfRklMRV9EVVJBVElPTjoKKyAgICAgIHNpbmstPm1heF9maWxlX2R1cmF0aW9uID0gZ192YWx1ZV9nZXRfdWludDY0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQUdHUkVHQVRFX0dPUFM6CisgICAgICBzaW5rLT5hZ2dyZWdhdGVfZ29wcyA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE11bHRpRmlsZVNpbmsgKnNpbmsgPSBHU1RfTVVMVElfRklMRV9TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNpbmstPmZpbGVuYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTkRFWDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHNpbmstPmluZGV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QT1NUX01FU1NBR0VTOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNpbmstPnBvc3RfbWVzc2FnZXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05FWFRfRklMRToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBzaW5rLT5uZXh0X2ZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9GSUxFUzoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzaW5rLT5tYXhfZmlsZXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9GSUxFX1NJWkU6CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBzaW5rLT5tYXhfZmlsZV9zaXplKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfRklMRV9EVVJBVElPTjoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHNpbmstPm1heF9maWxlX2R1cmF0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BR0dSRUdBVEVfR09QUzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzaW5rLT5hZ2dyZWdhdGVfZ29wcyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X211bHRpX2ZpbGVfc2lua19zdGFydCAoR3N0QmFzZVNpbmsgKiBic2luaykKK3sKKyAgR3N0TXVsdGlGaWxlU2luayAqc2luayA9IEdTVF9NVUxUSV9GSUxFX1NJTksgKGJzaW5rKTsKKworICBpZiAoc2luay0+YWdncmVnYXRlX2dvcHMpCisgICAgc2luay0+Z29wX2FkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIHNpbmstPnBvdGVudGlhbF9uZXh0X2dvcCA9IE5VTEw7CisgIHNpbmstPmZpbGVfcHRzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBnX3F1ZXVlX2luaXQgKCZzaW5rLT5vbGRfZmlsZXMpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aV9maWxlX3Npbmtfc3RvcCAoR3N0QmFzZVNpbmsgKiBzaW5rKQoreworICBHc3RNdWx0aUZpbGVTaW5rICptdWx0aWZpbGVzaW5rOworICBpbnQgaTsKKworICBtdWx0aWZpbGVzaW5rID0gR1NUX01VTFRJX0ZJTEVfU0lOSyAoc2luayk7CisKKyAgaWYgKG11bHRpZmlsZXNpbmstPmZpbGUgIT0gTlVMTCkgeworICAgIGZjbG9zZSAobXVsdGlmaWxlc2luay0+ZmlsZSk7CisgICAgbXVsdGlmaWxlc2luay0+ZmlsZSA9IE5VTEw7CisgIH0KKworICBpZiAobXVsdGlmaWxlc2luay0+c3RyZWFtaGVhZGVycykgeworICAgIGZvciAoaSA9IDA7IGkgPCBtdWx0aWZpbGVzaW5rLT5uX3N0cmVhbWhlYWRlcnM7IGkrKykgeworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAobXVsdGlmaWxlc2luay0+c3RyZWFtaGVhZGVyc1tpXSk7CisgICAgfQorICAgIGdfZnJlZSAobXVsdGlmaWxlc2luay0+c3RyZWFtaGVhZGVycyk7CisgICAgbXVsdGlmaWxlc2luay0+c3RyZWFtaGVhZGVycyA9IE5VTEw7CisgIH0KKworICBpZiAobXVsdGlmaWxlc2luay0+Z29wX2FkYXB0ZXIgIT0gTlVMTCkgeworICAgIGdfb2JqZWN0X3VucmVmIChtdWx0aWZpbGVzaW5rLT5nb3BfYWRhcHRlcik7CisgICAgbXVsdGlmaWxlc2luay0+Z29wX2FkYXB0ZXIgPSBOVUxMOworICB9CisKKyAgaWYgKG11bHRpZmlsZXNpbmstPnBvdGVudGlhbF9uZXh0X2dvcCAhPSBOVUxMKSB7CisgICAgZ19saXN0X2ZyZWVfZnVsbCAobXVsdGlmaWxlc2luay0+cG90ZW50aWFsX25leHRfZ29wLAorICAgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9idWZmZXJfdW5yZWYpOworICAgIG11bHRpZmlsZXNpbmstPnBvdGVudGlhbF9uZXh0X2dvcCA9IE5VTEw7CisgIH0KKworICBtdWx0aWZpbGVzaW5rLT5mb3JjZV9rZXlfdW5pdF9jb3VudCA9IC0xOworCisgIGdfcXVldWVfZm9yZWFjaCAoJm11bHRpZmlsZXNpbmstPm9sZF9maWxlcywgKEdGdW5jKSBnX2ZyZWUsIE5VTEwpOworICBnX3F1ZXVlX2NsZWFyICgmbXVsdGlmaWxlc2luay0+b2xkX2ZpbGVzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X211bHRpX2ZpbGVfc2lua19wb3N0X21lc3NhZ2VfZnVsbCAoR3N0TXVsdGlGaWxlU2luayAqIG11bHRpZmlsZXNpbmssCisgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uLCBHc3RDbG9ja1RpbWUgb2Zmc2V0LAorICAgIEdzdENsb2NrVGltZSBvZmZzZXRfZW5kLCBHc3RDbG9ja1RpbWUgcnVubmluZ190aW1lLAorICAgIEdzdENsb2NrVGltZSBzdHJlYW1fdGltZSwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKworICBpZiAoIW11bHRpZmlsZXNpbmstPnBvc3RfbWVzc2FnZXMpCisgICAgcmV0dXJuOworCisgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoIkdzdE11bHRpRmlsZVNpbmsiLAorICAgICAgImZpbGVuYW1lIiwgR19UWVBFX1NUUklORywgZmlsZW5hbWUsCisgICAgICAiaW5kZXgiLCBHX1RZUEVfSU5ULCBtdWx0aWZpbGVzaW5rLT5pbmRleCwKKyAgICAgICJ0aW1lc3RhbXAiLCBHX1RZUEVfVUlOVDY0LCB0aW1lc3RhbXAsCisgICAgICAic3RyZWFtLXRpbWUiLCBHX1RZUEVfVUlOVDY0LCBzdHJlYW1fdGltZSwKKyAgICAgICJydW5uaW5nLXRpbWUiLCBHX1RZUEVfVUlOVDY0LCBydW5uaW5nX3RpbWUsCisgICAgICAiZHVyYXRpb24iLCBHX1RZUEVfVUlOVDY0LCBkdXJhdGlvbiwKKyAgICAgICJvZmZzZXQiLCBHX1RZUEVfVUlOVDY0LCBvZmZzZXQsCisgICAgICAib2Zmc2V0LWVuZCIsIEdfVFlQRV9VSU5UNjQsIG9mZnNldF9lbmQsIE5VTEwpOworCisgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAobXVsdGlmaWxlc2luayksCisgICAgICBnc3RfbWVzc2FnZV9uZXdfZWxlbWVudCAoR1NUX09CSkVDVF9DQVNUIChtdWx0aWZpbGVzaW5rKSwgcykpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X211bHRpX2ZpbGVfc2lua19wb3N0X21lc3NhZ2VfZnJvbV90aW1lIChHc3RNdWx0aUZpbGVTaW5rICogbXVsdGlmaWxlc2luaywKKyAgICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBHc3RDbG9ja1RpbWUgZHVyYXRpb24sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICBHc3RDbG9ja1RpbWUgcnVubmluZ190aW1lLCBzdHJlYW1fdGltZTsKKyAgZ3VpbnQ2NCBvZmZzZXQsIG9mZnNldF9lbmQ7CisgIEdzdFNlZ21lbnQgKnNlZ21lbnQ7CisgIEdzdEZvcm1hdCBmb3JtYXQ7CisKKyAgaWYgKCFtdWx0aWZpbGVzaW5rLT5wb3N0X21lc3NhZ2VzKQorICAgIHJldHVybjsKKworICBzZWdtZW50ID0gJkdTVF9CQVNFX1NJTksgKG11bHRpZmlsZXNpbmspLT5zZWdtZW50OworICBmb3JtYXQgPSBzZWdtZW50LT5mb3JtYXQ7CisKKyAgb2Zmc2V0ID0gLTE7CisgIG9mZnNldF9lbmQgPSAtMTsKKworICBydW5uaW5nX3RpbWUgPSBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKHNlZ21lbnQsIGZvcm1hdCwgdGltZXN0YW1wKTsKKyAgc3RyZWFtX3RpbWUgPSBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoc2VnbWVudCwgZm9ybWF0LCB0aW1lc3RhbXApOworCisgIGdzdF9tdWx0aV9maWxlX3NpbmtfcG9zdF9tZXNzYWdlX2Z1bGwgKG11bHRpZmlsZXNpbmssIHRpbWVzdGFtcCwgZHVyYXRpb24sCisgICAgICBvZmZzZXQsIG9mZnNldF9lbmQsIHJ1bm5pbmdfdGltZSwgc3RyZWFtX3RpbWUsIGZpbGVuYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3NpbmtfcG9zdF9tZXNzYWdlIChHc3RNdWx0aUZpbGVTaW5rICogbXVsdGlmaWxlc2luaywKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICBHc3RDbG9ja1RpbWUgZHVyYXRpb24sIHRpbWVzdGFtcDsKKyAgR3N0Q2xvY2tUaW1lIHJ1bm5pbmdfdGltZSwgc3RyZWFtX3RpbWU7CisgIGd1aW50NjQgb2Zmc2V0LCBvZmZzZXRfZW5kOworICBHc3RTZWdtZW50ICpzZWdtZW50OworICBHc3RGb3JtYXQgZm9ybWF0OworCisgIGlmICghbXVsdGlmaWxlc2luay0+cG9zdF9tZXNzYWdlcykKKyAgICByZXR1cm47CisKKyAgc2VnbWVudCA9ICZHU1RfQkFTRV9TSU5LIChtdWx0aWZpbGVzaW5rKS0+c2VnbWVudDsKKyAgZm9ybWF0ID0gc2VnbWVudC0+Zm9ybWF0OworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpOworICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisgIG9mZnNldCA9IEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpOworICBvZmZzZXRfZW5kID0gR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWZmZXIpOworCisgIHJ1bm5pbmdfdGltZSA9IGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoc2VnbWVudCwgZm9ybWF0LCB0aW1lc3RhbXApOworICBzdHJlYW1fdGltZSA9IGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lIChzZWdtZW50LCBmb3JtYXQsIHRpbWVzdGFtcCk7CisKKyAgZ3N0X211bHRpX2ZpbGVfc2lua19wb3N0X21lc3NhZ2VfZnVsbCAobXVsdGlmaWxlc2luaywgdGltZXN0YW1wLCBkdXJhdGlvbiwKKyAgICAgIG9mZnNldCwgb2Zmc2V0X2VuZCwgcnVubmluZ190aW1lLCBzdHJlYW1fdGltZSwgZmlsZW5hbWUpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aV9maWxlX3Npbmtfd3JpdGVfc3RyZWFtX2hlYWRlcnMgKEdzdE11bHRpRmlsZVNpbmsgKiBzaW5rKQoreworICBpbnQgaTsKKworICBpZiAoc2luay0+c3RyZWFtaGVhZGVycyA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIC8qIHdlIHdhbnQgdG8gd3JpdGUgdGhlc2UgYXQgdGhlIGJlZ2lubmluZyAqLworICBnX2Fzc2VydCAoc2luay0+Y3VyX2ZpbGVfc2l6ZSA9PSAwKTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2luay0+bl9zdHJlYW1oZWFkZXJzOyBpKyspIHsKKyAgICBHc3RCdWZmZXIgKmhkcjsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBpbnQgcmV0OworCisgICAgaGRyID0gc2luay0+c3RyZWFtaGVhZGVyc1tpXTsKKyAgICBnc3RfYnVmZmVyX21hcCAoaGRyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHJldCA9IGZ3cml0ZSAobWFwLmRhdGEsIG1hcC5zaXplLCAxLCBzaW5rLT5maWxlKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChoZHIsICZtYXApOworCisgICAgaWYgKHJldCAhPSAxKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgc2luay0+Y3VyX2ZpbGVfc2l6ZSArPSBtYXAuc2l6ZTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X211bHRpX2ZpbGVfc2lua193cml0ZV9idWZmZXIgKEdzdE11bHRpRmlsZVNpbmsgKiBtdWx0aWZpbGVzaW5rLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdjaGFyICpmaWxlbmFtZTsKKyAgZ2Jvb2xlYW4gcmV0OworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKyAgZ2Jvb2xlYW4gZmlyc3RfZmlsZSA9IFRSVUU7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICBzd2l0Y2ggKG11bHRpZmlsZXNpbmstPm5leHRfZmlsZSkgeworICAgIGNhc2UgR1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX0JVRkZFUjoKKyAgICAgIGdzdF9tdWx0aV9maWxlX3NpbmtfZW5zdXJlX21heF9maWxlcyAobXVsdGlmaWxlc2luayk7CisKKyAgICAgIGZpbGVuYW1lID0gZ19zdHJkdXBfcHJpbnRmIChtdWx0aWZpbGVzaW5rLT5maWxlbmFtZSwKKyAgICAgICAgICBtdWx0aWZpbGVzaW5rLT5pbmRleCk7CisgICAgICByZXQgPSBnX2ZpbGVfc2V0X2NvbnRlbnRzIChmaWxlbmFtZSwgKGNoYXIgKikgbWFwLmRhdGEsIG1hcC5zaXplLCAmZXJyb3IpOworICAgICAgaWYgKCFyZXQpCisgICAgICAgIGdvdG8gd3JpdGVfZXJyb3I7CisKKyAgICAgIGdzdF9tdWx0aV9maWxlX3NpbmtfcG9zdF9tZXNzYWdlIChtdWx0aWZpbGVzaW5rLCBidWZmZXIsIGZpbGVuYW1lKTsKKworICAgICAgZ3N0X211bHRpX2ZpbGVfc2lua19hZGRfb2xkX2ZpbGUgKG11bHRpZmlsZXNpbmssIGZpbGVuYW1lKTsKKworICAgICAgbXVsdGlmaWxlc2luay0+aW5kZXgrKzsKKworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTVVMVElfRklMRV9TSU5LX05FWFRfRElTQ09OVDoKKyAgICAgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKGJ1ZmZlcikpIHsKKyAgICAgICAgaWYgKG11bHRpZmlsZXNpbmstPmZpbGUpCisgICAgICAgICAgZ3N0X211bHRpX2ZpbGVfc2lua19jbG9zZV9maWxlIChtdWx0aWZpbGVzaW5rLCBidWZmZXIpOworICAgICAgfQorCisgICAgICBpZiAobXVsdGlmaWxlc2luay0+ZmlsZSA9PSBOVUxMKSB7CisgICAgICAgIGlmICghZ3N0X211bHRpX2ZpbGVfc2lua19vcGVuX25leHRfZmlsZSAobXVsdGlmaWxlc2luaykpCisgICAgICAgICAgZ290byBzdGRpb193cml0ZV9lcnJvcjsKKyAgICAgIH0KKworICAgICAgcmV0ID0gZndyaXRlIChtYXAuZGF0YSwgbWFwLnNpemUsIDEsIG11bHRpZmlsZXNpbmstPmZpbGUpOworICAgICAgaWYgKHJldCAhPSAxKQorICAgICAgICBnb3RvIHN0ZGlvX3dyaXRlX2Vycm9yOworCisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NVUxUSV9GSUxFX1NJTktfTkVYVF9LRVlfRlJBTUU6CisgICAgICBpZiAobXVsdGlmaWxlc2luay0+bmV4dF9zZWdtZW50ID09IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICAgICAgaWYgKEdTVF9CVUZGRVJfVElNRVNUQU1QX0lTX1ZBTElEIChidWZmZXIpKSB7CisgICAgICAgICAgbXVsdGlmaWxlc2luay0+bmV4dF9zZWdtZW50ID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcikgKworICAgICAgICAgICAgICAxMCAqIEdTVF9TRUNPTkQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKEdTVF9CVUZGRVJfVElNRVNUQU1QX0lTX1ZBTElEIChidWZmZXIpICYmCisgICAgICAgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcikgPj0gbXVsdGlmaWxlc2luay0+bmV4dF9zZWdtZW50ICYmCisgICAgICAgICAgIUdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpKSB7CisgICAgICAgIGlmIChtdWx0aWZpbGVzaW5rLT5maWxlKSB7CisgICAgICAgICAgZmlyc3RfZmlsZSA9IEZBTFNFOworICAgICAgICAgIGdzdF9tdWx0aV9maWxlX3NpbmtfY2xvc2VfZmlsZSAobXVsdGlmaWxlc2luaywgYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBtdWx0aWZpbGVzaW5rLT5uZXh0X3NlZ21lbnQgKz0gMTAgKiBHU1RfU0VDT05EOworICAgICAgfQorCisgICAgICBpZiAobXVsdGlmaWxlc2luay0+ZmlsZSA9PSBOVUxMKSB7CisgICAgICAgIGlmICghZ3N0X211bHRpX2ZpbGVfc2lua19vcGVuX25leHRfZmlsZSAobXVsdGlmaWxlc2luaykpCisgICAgICAgICAgZ290byBzdGRpb193cml0ZV9lcnJvcjsKKworICAgICAgICBpZiAoIWZpcnN0X2ZpbGUpCisgICAgICAgICAgZ3N0X211bHRpX2ZpbGVfc2lua193cml0ZV9zdHJlYW1faGVhZGVycyAobXVsdGlmaWxlc2luayk7CisgICAgICB9CisKKyAgICAgIHJldCA9IGZ3cml0ZSAobWFwLmRhdGEsIG1hcC5zaXplLCAxLCBtdWx0aWZpbGVzaW5rLT5maWxlKTsKKyAgICAgIGlmIChyZXQgIT0gMSkKKyAgICAgICAgZ290byBzdGRpb193cml0ZV9lcnJvcjsKKworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTVVMVElfRklMRV9TSU5LX05FWFRfS0VZX1VOSVRfRVZFTlQ6CisgICAgICBpZiAobXVsdGlmaWxlc2luay0+ZmlsZSA9PSBOVUxMKSB7CisgICAgICAgIGlmICghZ3N0X211bHRpX2ZpbGVfc2lua19vcGVuX25leHRfZmlsZSAobXVsdGlmaWxlc2luaykpCisgICAgICAgICAgZ290byBzdGRpb193cml0ZV9lcnJvcjsKKworICAgICAgICAvKiB3ZSBkb24ndCBuZWVkIHRvIHdyaXRlIHN0cmVhbSBoZWFkZXJzIGhlcmUsIHRoZXkgd2lsbCBiZSBpbnNlcnRlZCBpbgorICAgICAgICAgKiB0aGUgc3RyZWFtIGJ5IHVwc3RyZWFtIGVsZW1lbnRzIGlmIGtleSB1bml0IGV2ZW50cyBoYXZlCisgICAgICAgICAqIGFsbF9oZWFkZXJzPXRydWUgc2V0CisgICAgICAgICAqLworICAgICAgfQorCisgICAgICByZXQgPSBmd3JpdGUgKG1hcC5kYXRhLCBtYXAuc2l6ZSwgMSwgbXVsdGlmaWxlc2luay0+ZmlsZSk7CisKKyAgICAgIGlmIChyZXQgIT0gMSkKKyAgICAgICAgZ290byBzdGRpb193cml0ZV9lcnJvcjsKKworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTVVMVElfRklMRV9TSU5LX05FWFRfTUFYX1NJWkU6eworICAgICAgZ3VpbnQ2NCBuZXdfc2l6ZTsKKworICAgICAgbmV3X3NpemUgPSBtdWx0aWZpbGVzaW5rLT5jdXJfZmlsZV9zaXplICsgbWFwLnNpemU7CisgICAgICBpZiAobmV3X3NpemUgPiBtdWx0aWZpbGVzaW5rLT5tYXhfZmlsZV9zaXplKSB7CisKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChtdWx0aWZpbGVzaW5rLCAiY3VycmVudCBzaXplOiAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgICAiLCBuZXdfc2l6ZTogJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBtYXguIHNpemUgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgICAgIG11bHRpZmlsZXNpbmstPmN1cl9maWxlX3NpemUsIG5ld19zaXplLAorICAgICAgICAgICAgbXVsdGlmaWxlc2luay0+bWF4X2ZpbGVfc2l6ZSk7CisKKyAgICAgICAgaWYgKG11bHRpZmlsZXNpbmstPmZpbGUgIT0gTlVMTCkgeworICAgICAgICAgIGZpcnN0X2ZpbGUgPSBGQUxTRTsKKyAgICAgICAgICBnc3RfbXVsdGlfZmlsZV9zaW5rX2Nsb3NlX2ZpbGUgKG11bHRpZmlsZXNpbmssIGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKG11bHRpZmlsZXNpbmstPmZpbGUgPT0gTlVMTCkgeworICAgICAgICBpZiAoIWdzdF9tdWx0aV9maWxlX3Npbmtfb3Blbl9uZXh0X2ZpbGUgKG11bHRpZmlsZXNpbmspKQorICAgICAgICAgIGdvdG8gc3RkaW9fd3JpdGVfZXJyb3I7CisKKyAgICAgICAgaWYgKCFmaXJzdF9maWxlKQorICAgICAgICAgIGdzdF9tdWx0aV9maWxlX3Npbmtfd3JpdGVfc3RyZWFtX2hlYWRlcnMgKG11bHRpZmlsZXNpbmspOworICAgICAgfQorCisgICAgICByZXQgPSBmd3JpdGUgKG1hcC5kYXRhLCBtYXAuc2l6ZSwgMSwgbXVsdGlmaWxlc2luay0+ZmlsZSk7CisKKyAgICAgIGlmIChyZXQgIT0gMSkKKyAgICAgICAgZ290byBzdGRpb193cml0ZV9lcnJvcjsKKworICAgICAgbXVsdGlmaWxlc2luay0+Y3VyX2ZpbGVfc2l6ZSArPSBtYXAuc2l6ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9NVUxUSV9GSUxFX1NJTktfTkVYVF9NQVhfRFVSQVRJT046eworICAgICAgR3N0Q2xvY2tUaW1lIG5ld19kdXJhdGlvbiA9IDA7CisKKyAgICAgIGlmIChHU1RfQlVGRkVSX1BUU19JU19WQUxJRCAoYnVmZmVyKQorICAgICAgICAgICYmIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChtdWx0aWZpbGVzaW5rLT5maWxlX3B0cykpIHsKKyAgICAgICAgLyogVGhlIG5ldyBkdXJhdGlvbiB3aWxsIGV4dGVuZCB0byB0aGlzIG5ldyBidWZmZXIgcHRzIC4uLiAqLworICAgICAgICBuZXdfZHVyYXRpb24gPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKSAtIG11bHRpZmlsZXNpbmstPmZpbGVfcHRzOworICAgICAgICAvKiAuLi4gYW5kIGR1cmF0aW9uIChpZiBpdCBoYXMgb25lKSAqLworICAgICAgICBpZiAoR1NUX0JVRkZFUl9EVVJBVElPTl9JU19WQUxJRCAoYnVmZmVyKSkKKyAgICAgICAgICBuZXdfZHVyYXRpb24gKz0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKTsKKyAgICAgIH0KKworICAgICAgaWYgKG5ld19kdXJhdGlvbiA+IG11bHRpZmlsZXNpbmstPm1heF9maWxlX2R1cmF0aW9uKSB7CisKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChtdWx0aWZpbGVzaW5rLAorICAgICAgICAgICAgIm5ld19kdXJhdGlvbjogJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBtYXguIGR1cmF0aW9uICUiCisgICAgICAgICAgICBHX0dVSU5UNjRfRk9STUFULCBuZXdfZHVyYXRpb24sIG11bHRpZmlsZXNpbmstPm1heF9maWxlX2R1cmF0aW9uKTsKKworICAgICAgICBpZiAobXVsdGlmaWxlc2luay0+ZmlsZSAhPSBOVUxMKSB7CisgICAgICAgICAgZmlyc3RfZmlsZSA9IEZBTFNFOworICAgICAgICAgIGdzdF9tdWx0aV9maWxlX3NpbmtfY2xvc2VfZmlsZSAobXVsdGlmaWxlc2luaywgYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAobXVsdGlmaWxlc2luay0+ZmlsZSA9PSBOVUxMKSB7CisgICAgICAgIGlmICghZ3N0X211bHRpX2ZpbGVfc2lua19vcGVuX25leHRfZmlsZSAobXVsdGlmaWxlc2luaykpCisgICAgICAgICAgZ290byBzdGRpb193cml0ZV9lcnJvcjsKKworICAgICAgICBtdWx0aWZpbGVzaW5rLT5maWxlX3B0cyA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICAgICAgICBpZiAoIWZpcnN0X2ZpbGUpCisgICAgICAgICAgZ3N0X211bHRpX2ZpbGVfc2lua193cml0ZV9zdHJlYW1faGVhZGVycyAobXVsdGlmaWxlc2luayk7CisgICAgICB9CisKKyAgICAgIHJldCA9IGZ3cml0ZSAobWFwLmRhdGEsIG1hcC5zaXplLCAxLCBtdWx0aWZpbGVzaW5rLT5maWxlKTsKKworICAgICAgaWYgKHJldCAhPSAxKQorICAgICAgICBnb3RvIHN0ZGlvX3dyaXRlX2Vycm9yOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICB9CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIC8qIEVSUk9SUyAqLword3JpdGVfZXJyb3I6CisgIHsKKyAgICBzd2l0Y2ggKGVycm9yLT5jb2RlKSB7CisgICAgICBjYXNlIEdfRklMRV9FUlJPUl9OT1NQQzp7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdWx0aWZpbGVzaW5rLCBSRVNPVVJDRSwgTk9fU1BBQ0VfTEVGVCwgKE5VTEwpLAorICAgICAgICAgICAgKE5VTEwpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OnsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKG11bHRpZmlsZXNpbmssIFJFU09VUkNFLCBXUklURSwKKyAgICAgICAgICAgICgiRXJyb3Igd2hpbGUgd3JpdGluZyB0byBmaWxlIFwiJXNcIi4iLCBmaWxlbmFtZSksCisgICAgICAgICAgICAoIiVzIiwgZ19zdHJlcnJvciAoZXJybm8pKSk7CisgICAgICB9CisgICAgfQorICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgIGdfZnJlZSAoZmlsZW5hbWUpOworCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3N0ZGlvX3dyaXRlX2Vycm9yOgorICBzd2l0Y2ggKGVycm5vKSB7CisgICAgY2FzZSBFTk9TUEM6CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAobXVsdGlmaWxlc2luaywgUkVTT1VSQ0UsIE5PX1NQQUNFX0xFRlQsCisgICAgICAgICAgKCJFcnJvciB3aGlsZSB3cml0aW5nIHRvIGZpbGUuIiksICgiJXMiLCBnX3N0cmVycm9yIChlcnJubykpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAobXVsdGlmaWxlc2luaywgUkVTT1VSQ0UsIFdSSVRFLAorICAgICAgICAgICgiRXJyb3Igd2hpbGUgd3JpdGluZyB0byBmaWxlLiIpLCAoIiVzIiwgZ19zdHJlcnJvciAoZXJybm8pKSk7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X211bHRpX2ZpbGVfc2lua19yZW5kZXIgKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0TXVsdGlGaWxlU2luayAqc2luayA9IEdTVF9NVUxUSV9GSUxFX1NJTksgKGJzaW5rKTsKKyAgR3N0Rmxvd1JldHVybiBmbG93ID0gR1NUX0ZMT1dfT0s7CisgIGdib29sZWFuIGtleV91bml0LCBoZWFkZXI7CisKKyAgaGVhZGVyID0gR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmZmVyLCBHU1RfQlVGRkVSX0ZMQUdfSEVBREVSKTsKKyAga2V5X3VuaXQgPSAhR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmZmVyLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisKKyAgaWYgKHNpbmstPmFnZ3JlZ2F0ZV9nb3BzKSB7CisgICAgR3N0QnVmZmVyICpnb3BfYnVmZmVyID0gTlVMTDsKKyAgICBndWludCBhdmFpbDsKKworICAgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzaW5rLT5nb3BfYWRhcHRlcik7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoc2luaywgImFnZ3JlZ2F0ZSBHT1A6IHJlY2VpdmVkICVzJXMgdW5pdCBidWZmZXI6ICIKKyAgICAgICAgIiUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICAoa2V5X3VuaXQpID8gImtleSIgOiAiZGVsdGEiLCAoaGVhZGVyKSA/ICIgaGVhZGVyIiA6ICIiLCBidWZmZXIpOworCisgICAgLyogSWYgaXQncyBhIGhlYWRlciBidWZmZXIsIGl0IG1pZ2h0IHBvdGVudGlhbGx5IGJlIGZvciB0aGUgbmV4dCBHT1AgKi8KKyAgICBpZiAoaGVhZGVyKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc2luaywgIkFjY3VtdWxhdGluZyBidWZmZXIgdG8gcG90ZW50aWFsIG5leHQgR09QIik7CisgICAgICBzaW5rLT5wb3RlbnRpYWxfbmV4dF9nb3AgPQorICAgICAgICAgIGdfbGlzdF9hcHBlbmQgKHNpbmstPnBvdGVudGlhbF9uZXh0X2dvcCwgZ3N0X2J1ZmZlcl9yZWYgKGJ1ZmZlcikpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoa2V5X3VuaXQgJiYgYXZhaWwgPiAwKSB7CisgICAgICAgIEdzdENsb2NrVGltZSBwdHMsIGR0czsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHNpbmssICJHcmFiYmluZyBwZW5kaW5nIGNvbXBsZXRlZCBHT1AiKTsKKyAgICAgICAgcHRzID0gZ3N0X2FkYXB0ZXJfcHJldl9wdHNfYXRfb2Zmc2V0IChzaW5rLT5nb3BfYWRhcHRlciwgMCwgTlVMTCk7CisgICAgICAgIGR0cyA9IGdzdF9hZGFwdGVyX3ByZXZfZHRzX2F0X29mZnNldCAoc2luay0+Z29wX2FkYXB0ZXIsIDAsIE5VTEwpOworICAgICAgICBnb3BfYnVmZmVyID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHNpbmstPmdvcF9hZGFwdGVyLCBhdmFpbCk7CisgICAgICAgIEdTVF9CVUZGRVJfUFRTIChnb3BfYnVmZmVyKSA9IHB0czsKKyAgICAgICAgR1NUX0JVRkZFUl9EVFMgKGdvcF9idWZmZXIpID0gZHRzOworICAgICAgfQorCisgICAgICAvKiBqdXN0IGFjY3VtdWxhdGUgdGhlIGJ1ZmZlciAqLworICAgICAgaWYgKHNpbmstPnBvdGVudGlhbF9uZXh0X2dvcCkgeworICAgICAgICBHTGlzdCAqdG1wOworICAgICAgICBHU1RfTE9HX09CSkVDVCAoc2luaywKKyAgICAgICAgICAgICJDYXJyeWluZyBvdmVyIHBlbmRpbmcgbmV4dCBHT1AgZGF0YSBpbnRvIGFkYXB0ZXIiKTsKKyAgICAgICAgLyogSWYgd2UgaGF2ZSBwZW5kaW5nIGRhdGEsIHB1dCB0aGF0IGZpcnN0IGluIHRoZSBhZGFwdGVyICovCisgICAgICAgIGZvciAodG1wID0gc2luay0+cG90ZW50aWFsX25leHRfZ29wOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkgeworICAgICAgICAgIEdzdEJ1ZmZlciAqdG1wYiA9IChHc3RCdWZmZXIgKikgdG1wLT5kYXRhOworICAgICAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHNpbmstPmdvcF9hZGFwdGVyLCB0bXBiKTsKKyAgICAgICAgfQorICAgICAgICBnX2xpc3RfZnJlZSAoc2luay0+cG90ZW50aWFsX25leHRfZ29wKTsKKyAgICAgICAgc2luay0+cG90ZW50aWFsX25leHRfZ29wID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzaW5rLCAic3RvcmluZyBidWZmZXIgaW4gYWRhcHRlciIpOworICAgICAgZ3N0X2FkYXB0ZXJfcHVzaCAoc2luay0+Z29wX2FkYXB0ZXIsIGdzdF9idWZmZXJfcmVmIChidWZmZXIpKTsKKworICAgICAgaWYgKGdvcF9idWZmZXIgIT0gTlVMTCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAid3JpdGluZyBvdXQgcGVuZGluZyBHT1AsICV1IGJ5dGVzIiwgYXZhaWwpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLAorICAgICAgICAgICAgImdvcCBidWZmZXIgcHRzOiUiIEdTVF9USU1FX0ZPUk1BVCAiIGR0czolIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAgICIgZHVyYXRpb246JSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9QVFMgKGdvcF9idWZmZXIpKSwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFRTIChnb3BfYnVmZmVyKSksCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX0RVUkFUSU9OIChnb3BfYnVmZmVyKSkpOworICAgICAgICBmbG93ID0gZ3N0X211bHRpX2ZpbGVfc2lua193cml0ZV9idWZmZXIgKHNpbmssIGdvcF9idWZmZXIpOworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChnb3BfYnVmZmVyKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZmxvdyA9IGdzdF9tdWx0aV9maWxlX3Npbmtfd3JpdGVfYnVmZmVyIChzaW5rLCBidWZmZXIpOworICB9CisgIHJldHVybiBmbG93OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2J1ZmZlcl9saXN0X2NvcHlfZGF0YSAoR3N0QnVmZmVyICoqIGJ1ZiwgZ3VpbnQgaWR4LCBncG9pbnRlciBkYXRhKQoreworICBHc3RCdWZmZXIgKmRlc3QgPSBkYXRhOworICBndWludCBudW0sIGk7CisKKyAgaWYgKGlkeCA9PSAwKQorICAgIGdzdF9idWZmZXJfY29weV9pbnRvIChkZXN0LCAqYnVmLCBHU1RfQlVGRkVSX0NPUFlfTUVUQURBVEEsIDAsIC0xKTsKKworICBudW0gPSBnc3RfYnVmZmVyX25fbWVtb3J5ICgqYnVmKTsKKyAgZm9yIChpID0gMDsgaSA8IG51bTsgKytpKSB7CisgICAgR3N0TWVtb3J5ICptZW07CisKKyAgICBtZW0gPSBnc3RfYnVmZmVyX2dldF9tZW1vcnkgKCpidWYsIGkpOworICAgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAoZGVzdCwgbWVtKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBPdXIgYXNzdW1wdGlvbiBmb3Igbm93IGlzIHRoYXQgdGhlIGJ1ZmZlcnMgaW4gYSBidWZmZXIgbGlzdCBzaG91bGQgYWx3YXlzCisgKiBlbmQgdXAgaW4gdGhlIHNhbWUgZmlsZS4gSWYgc29tZW9uZSB3YW50cyBkaWZmZXJlbnQgYmVoYXZpb3VyLCB0aGV5J2xsIGp1c3QKKyAqIGhhdmUgdG8gYWRkIGEgcHJvcGVydHkgZm9yIHRoYXQuICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X211bHRpX2ZpbGVfc2lua19yZW5kZXJfbGlzdCAoR3N0QmFzZVNpbmsgKiBzaW5rLCBHc3RCdWZmZXJMaXN0ICogbGlzdCkKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIGd1aW50IHNpemU7CisKKyAgc2l6ZSA9IGdzdF9idWZmZXJfbGlzdF9jYWxjdWxhdGVfc2l6ZSAobGlzdCk7CisgIEdTVF9MT0dfT0JKRUNUIChzaW5rLCAidG90YWwgc2l6ZSBvZiBidWZmZXIgbGlzdCAlcDogJXUiLCBsaXN0LCBzaXplKTsKKworICAvKiBjb3B5IGFsbCBidWZmZXJzIGluIHRoZSBsaXN0IGludG8gb25lIHNpbmdsZSBidWZmZXIsIHNvIHdlIGNhbiB1c2UKKyAgICogdGhlIG5vcm1hbCByZW5kZXIgZnVuY3Rpb24gKEZJWE1FOiBvcHRpbWlzZSB0byBhdm9pZCB0aGUgbWVtY3B5KSAqLworICBidWYgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgZ3N0X2J1ZmZlcl9saXN0X2ZvcmVhY2ggKGxpc3QsIGJ1ZmZlcl9saXN0X2NvcHlfZGF0YSwgYnVmKTsKKyAgZ19hc3NlcnQgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikgPT0gc2l6ZSk7CisKKyAgZ3N0X211bHRpX2ZpbGVfc2lua19yZW5kZXIgKHNpbmssIGJ1Zik7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aV9maWxlX3Npbmtfc2V0X2NhcHMgKEdzdEJhc2VTaW5rICogc2luaywgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdE11bHRpRmlsZVNpbmsgKm11bHRpZmlsZXNpbms7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworCisgIG11bHRpZmlsZXNpbmsgPSBHU1RfTVVMVElfRklMRV9TSU5LIChzaW5rKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgaWYgKHN0cnVjdHVyZSkgeworICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWU7CisKKyAgICB2YWx1ZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJzdHJlYW1oZWFkZXIiKTsKKworICAgIGlmIChHU1RfVkFMVUVfSE9MRFNfQVJSQVkgKHZhbHVlKSkgeworICAgICAgaW50IGk7CisKKyAgICAgIGlmIChtdWx0aWZpbGVzaW5rLT5zdHJlYW1oZWFkZXJzKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtdWx0aWZpbGVzaW5rLT5uX3N0cmVhbWhlYWRlcnM7IGkrKykgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG11bHRpZmlsZXNpbmstPnN0cmVhbWhlYWRlcnNbaV0pOworICAgICAgICB9CisgICAgICAgIGdfZnJlZSAobXVsdGlmaWxlc2luay0+c3RyZWFtaGVhZGVycyk7CisgICAgICB9CisKKyAgICAgIG11bHRpZmlsZXNpbmstPm5fc3RyZWFtaGVhZGVycyA9IGdzdF92YWx1ZV9hcnJheV9nZXRfc2l6ZSAodmFsdWUpOworICAgICAgbXVsdGlmaWxlc2luay0+c3RyZWFtaGVhZGVycyA9CisgICAgICAgICAgZ19tYWxsb2MgKHNpemVvZiAoR3N0QnVmZmVyICopICogbXVsdGlmaWxlc2luay0+bl9zdHJlYW1oZWFkZXJzKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG11bHRpZmlsZXNpbmstPm5fc3RyZWFtaGVhZGVyczsgaSsrKSB7CisgICAgICAgIG11bHRpZmlsZXNpbmstPnN0cmVhbWhlYWRlcnNbaV0gPQorICAgICAgICAgICAgZ3N0X2J1ZmZlcl9yZWYgKGdzdF92YWx1ZV9nZXRfYnVmZmVyIChnc3RfdmFsdWVfYXJyYXlfZ2V0X3ZhbHVlCisgICAgICAgICAgICAgICAgKHZhbHVlLCBpKSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBUYWtlcyBvd25lcnNoaXAgb2YgdGhlIGZpbGVuYW1lIHN0cmluZyAqLworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3NpbmtfYWRkX29sZF9maWxlIChHc3RNdWx0aUZpbGVTaW5rICogbXVsdGlmaWxlc2luaywgZ2NoYXIgKiBmbikKK3sKKyAgLyogT25seSBhZGQgZmlsZSB0byB0aGUgbGlzdCBpZiBhIG1heF9maWxlcyBsaW1pdCBpcyBzZXQsIG90aGVyd2lzZSB3ZSBuZXZlcgorICAgKiBwcnVuZSB0aGUgbGlzdCBhbmQgbWVtb3J5IGp1c3QgYnVpbGRzIHVwIHVudGlsIHRoZSBwaXBlbGluZSBpcyBzdG9wcGVkLiAqLworICBpZiAobXVsdGlmaWxlc2luay0+bWF4X2ZpbGVzID4gMCkgeworICAgIGdfcXVldWVfcHVzaF90YWlsICgmbXVsdGlmaWxlc2luay0+b2xkX2ZpbGVzLCBmbik7CisgIH0gZWxzZSB7CisgICAgZ19mcmVlIChmbik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3NpbmtfZW5zdXJlX21heF9maWxlcyAoR3N0TXVsdGlGaWxlU2luayAqIG11bHRpZmlsZXNpbmspCit7CisgIGd1aW50IG1heF9maWxlcyA9IG11bHRpZmlsZXNpbmstPm1heF9maWxlczsKKworICBpZiAobWF4X2ZpbGVzID09IDApCisgICAgcmV0dXJuOworCisgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKCZtdWx0aWZpbGVzaW5rLT5vbGRfZmlsZXMpID49IG1heF9maWxlcykgeworICAgIGdjaGFyICpmaWxlbmFtZTsKKworICAgIGZpbGVuYW1lID0gZ19xdWV1ZV9wb3BfaGVhZCAoJm11bHRpZmlsZXNpbmstPm9sZF9maWxlcyk7CisgICAgZ19yZW1vdmUgKGZpbGVuYW1lKTsKKyAgICBnX2ZyZWUgKGZpbGVuYW1lKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aV9maWxlX3NpbmtfZXZlbnQgKEdzdEJhc2VTaW5rICogc2luaywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0TXVsdGlGaWxlU2luayAqbXVsdGlmaWxlc2luazsKKyAgZ2NoYXIgKmZpbGVuYW1lOworCisgIG11bHRpZmlsZXNpbmsgPSBHU1RfTVVMVElfRklMRV9TSU5LIChzaW5rKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DVVNUT01fRE9XTlNUUkVBTToKKyAgICB7CisgICAgICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBkdXJhdGlvbjsKKyAgICAgIEdzdENsb2NrVGltZSBydW5uaW5nX3RpbWUsIHN0cmVhbV90aW1lOworICAgICAgZ3VpbnQ2NCBvZmZzZXQsIG9mZnNldF9lbmQ7CisgICAgICBnYm9vbGVhbiBhbGxfaGVhZGVyczsKKyAgICAgIGd1aW50IGNvdW50OworCisgICAgICBpZiAobXVsdGlmaWxlc2luay0+bmV4dF9maWxlICE9IEdTVF9NVUxUSV9GSUxFX1NJTktfTkVYVF9LRVlfVU5JVF9FVkVOVCB8fAorICAgICAgICAgICFnc3RfdmlkZW9fZXZlbnRfaXNfZm9yY2Vfa2V5X3VuaXQgKGV2ZW50KSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAgIGdzdF92aWRlb19ldmVudF9wYXJzZV9kb3duc3RyZWFtX2ZvcmNlX2tleV91bml0IChldmVudCwgJnRpbWVzdGFtcCwKKyAgICAgICAgICAmc3RyZWFtX3RpbWUsICZydW5uaW5nX3RpbWUsICZhbGxfaGVhZGVycywgJmNvdW50KTsKKworICAgICAgaWYgKG11bHRpZmlsZXNpbmstPmZvcmNlX2tleV91bml0X2NvdW50ICE9IC0xICYmCisgICAgICAgICAgbXVsdGlmaWxlc2luay0+Zm9yY2Vfa2V5X3VuaXRfY291bnQgPT0gY291bnQpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgICBtdWx0aWZpbGVzaW5rLT5mb3JjZV9rZXlfdW5pdF9jb3VudCA9IGNvdW50OworCisgICAgICBpZiAobXVsdGlmaWxlc2luay0+ZmlsZSkgeworICAgICAgICBkdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICAgIG9mZnNldCA9IG9mZnNldF9lbmQgPSAtMTsKKyAgICAgICAgZmlsZW5hbWUgPSBnX3N0cmR1cF9wcmludGYgKG11bHRpZmlsZXNpbmstPmZpbGVuYW1lLAorICAgICAgICAgICAgbXVsdGlmaWxlc2luay0+aW5kZXgpOworCisgICAgICAgIGdzdF9tdWx0aV9maWxlX3NpbmtfY2xvc2VfZmlsZSAobXVsdGlmaWxlc2luaywgTlVMTCk7CisKKyAgICAgICAgZ3N0X211bHRpX2ZpbGVfc2lua19wb3N0X21lc3NhZ2VfZnVsbCAobXVsdGlmaWxlc2luaywgdGltZXN0YW1wLAorICAgICAgICAgICAgZHVyYXRpb24sIG9mZnNldCwgb2Zmc2V0X2VuZCwgcnVubmluZ190aW1lLCBzdHJlYW1fdGltZSwgZmlsZW5hbWUpOworICAgICAgICBnX2ZyZWUgKGZpbGVuYW1lKTsKKyAgICAgIH0KKworICAgICAgaWYgKG11bHRpZmlsZXNpbmstPmZpbGUgPT0gTlVMTCkgeworICAgICAgICBpZiAoIWdzdF9tdWx0aV9maWxlX3Npbmtfb3Blbl9uZXh0X2ZpbGUgKG11bHRpZmlsZXNpbmspKQorICAgICAgICAgIGdvdG8gc3RkaW9fd3JpdGVfZXJyb3I7CisgICAgICB9CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgICBpZiAobXVsdGlmaWxlc2luay0+YWdncmVnYXRlX2dvcHMpIHsKKyAgICAgICAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX25ldyAoKTsKKworICAgICAgICAvKiBwdXNoIGtleSB1bml0IGJ1ZmZlciB0byBmb3JjZSB3cml0aW5nIG91dCB0aGUgcGVuZGluZyBHT1AgZGF0YSAqLworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHNpbmssICJFT1MsIHdyaXRlIHBlbmRpbmcgR09QIGRhdGEiKTsKKyAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKTsKKyAgICAgICAgZ3N0X211bHRpX2ZpbGVfc2lua19yZW5kZXIgKHNpbmssIGJ1Zik7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICB9CisgICAgICBpZiAobXVsdGlmaWxlc2luay0+ZmlsZSkgeworICAgICAgICBnY2hhciAqZmlsZW5hbWU7CisKKyAgICAgICAgZmlsZW5hbWUgPSBnX3N0cmR1cF9wcmludGYgKG11bHRpZmlsZXNpbmstPmZpbGVuYW1lLAorICAgICAgICAgICAgbXVsdGlmaWxlc2luay0+aW5kZXgpOworCisgICAgICAgIGdzdF9tdWx0aV9maWxlX3NpbmtfY2xvc2VfZmlsZSAobXVsdGlmaWxlc2luaywgTlVMTCk7CisKKyAgICAgICAgZ3N0X211bHRpX2ZpbGVfc2lua19wb3N0X21lc3NhZ2VfZnJvbV90aW1lIChtdWx0aWZpbGVzaW5rLAorICAgICAgICAgICAgR1NUX0JBU0VfU0lOSyAobXVsdGlmaWxlc2luayktPnNlZ21lbnQucG9zaXRpb24sIC0xLCBmaWxlbmFtZSk7CisgICAgICAgIGdfZnJlZSAoZmlsZW5hbWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKK291dDoKKyAgcmV0dXJuIEdTVF9CQVNFX1NJTktfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmV2ZW50IChzaW5rLCBldmVudCk7CisKKyAgLyogRVJST1JTICovCitzdGRpb193cml0ZV9lcnJvcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdWx0aWZpbGVzaW5rLCBSRVNPVVJDRSwgV1JJVEUsCisgICAgICAgICgiRXJyb3Igd2hpbGUgd3JpdGluZyB0byBmaWxlLiIpLCAoTlVMTCkpOworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aV9maWxlX3Npbmtfb3Blbl9uZXh0X2ZpbGUgKEdzdE11bHRpRmlsZVNpbmsgKiBtdWx0aWZpbGVzaW5rKQoreworICBjaGFyICpmaWxlbmFtZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAobXVsdGlmaWxlc2luay0+ZmlsZSA9PSBOVUxMLCBGQUxTRSk7CisKKyAgZ3N0X211bHRpX2ZpbGVfc2lua19lbnN1cmVfbWF4X2ZpbGVzIChtdWx0aWZpbGVzaW5rKTsKKworICBmaWxlbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAobXVsdGlmaWxlc2luay0+ZmlsZW5hbWUsIG11bHRpZmlsZXNpbmstPmluZGV4KTsKKyAgbXVsdGlmaWxlc2luay0+ZmlsZSA9IGdfZm9wZW4gKGZpbGVuYW1lLCAid2IiKTsKKyAgaWYgKG11bHRpZmlsZXNpbmstPmZpbGUgPT0gTlVMTCkgeworICAgIGdfZnJlZSAoZmlsZW5hbWUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIEdTVF9JTkZPX09CSkVDVCAobXVsdGlmaWxlc2luaywgIm9wZW5pbmcgZmlsZSAlcyIsIGZpbGVuYW1lKTsKKworICBnc3RfbXVsdGlfZmlsZV9zaW5rX2FkZF9vbGRfZmlsZSAobXVsdGlmaWxlc2luaywgZmlsZW5hbWUpOworCisgIG11bHRpZmlsZXNpbmstPmN1cl9maWxlX3NpemUgPSAwOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3NpbmtfY2xvc2VfZmlsZSAoR3N0TXVsdGlGaWxlU2luayAqIG11bHRpZmlsZXNpbmssCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBjaGFyICpmaWxlbmFtZTsKKworICBmY2xvc2UgKG11bHRpZmlsZXNpbmstPmZpbGUpOworICBtdWx0aWZpbGVzaW5rLT5maWxlID0gTlVMTDsKKworICBpZiAoYnVmZmVyKSB7CisgICAgZmlsZW5hbWUgPSBnX3N0cmR1cF9wcmludGYgKG11bHRpZmlsZXNpbmstPmZpbGVuYW1lLCBtdWx0aWZpbGVzaW5rLT5pbmRleCk7CisgICAgZ3N0X211bHRpX2ZpbGVfc2lua19wb3N0X21lc3NhZ2UgKG11bHRpZmlsZXNpbmssIGJ1ZmZlciwgZmlsZW5hbWUpOworICAgIGdfZnJlZSAoZmlsZW5hbWUpOworICB9CisKKyAgbXVsdGlmaWxlc2luay0+aW5kZXgrKzsKK30KZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oIGIvZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmZTUzMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tdWx0aWZpbGUvZ3N0bXVsdGlmaWxlc2luay5oCkBAIC0wLDAgKzEsMTE4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwMCBXaW0gVGF5bWFucyA8d3RheUBjaGVsbG8uYmU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwNiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogICAgICAgICAgICAgICAgICAgIDIwMDYgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogZ3N0bXVsdGlmaWxlc2luay5oOgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfTVVMVElGSUxFU0lOS19IX18KKyNkZWZpbmUgX19HU1RfTVVMVElGSUxFU0lOS19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9iYXNlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9NVUxUSV9GSUxFX1NJTksgXAorICAoZ3N0X211bHRpX2ZpbGVfc2lua19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfTVVMVElfRklMRV9TSU5LKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfTVVMVElfRklMRV9TSU5LLEdzdE11bHRpRmlsZVNpbmspKQorI2RlZmluZSBHU1RfTVVMVElfRklMRV9TSU5LX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX01VTFRJX0ZJTEVfU0lOSyxHc3RNdWx0aUZpbGVTaW5rQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfTVVMVElfRklMRV9TSU5LKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfTVVMVElfRklMRV9TSU5LKSkKKyNkZWZpbmUgR1NUX0lTX01VTFRJX0ZJTEVfU0lOS19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9NVUxUSV9GSUxFX1NJTkspKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0TXVsdGlGaWxlU2luayBHc3RNdWx0aUZpbGVTaW5rOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE11bHRpRmlsZVNpbmtDbGFzcyBHc3RNdWx0aUZpbGVTaW5rQ2xhc3M7CisKKy8qKgorICogR3N0TXVsdGlGaWxlU2lua05leHQ6CisgKiBAR1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX0JVRkZFUjogTmV3IGZpbGUgZm9yIGVhY2ggYnVmZmVyCisgKiBAR1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX0RJU0NPTlQ6IE5ldyBmaWxlIGFmdGVyIGVhY2ggZGlzY29udGludWl0eQorICogQEdTVF9NVUxUSV9GSUxFX1NJTktfTkVYVF9LRVlfRlJBTUU6IE5ldyBmaWxlIGF0IGVhY2gga2V5IGZyYW1lCisgKiAgKFVzZWZ1bCBmb3IgTVBFRy1UUyBzZWdtZW50aW5nKQorICogQEdTVF9NVUxUSV9GSUxFX1NJTktfTkVYVF9LRVlfVU5JVF9FVkVOVDogTmV3IGZpbGUgYWZ0ZXIgYSBmb3JjZSBrZXkgdW5pdAorICogIGV2ZW50CisgKiBAR1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX01BWF9TSVpFOiBOZXcgZmlsZSB3aGVuIHRoZSBjb25maWd1cmVkIG1heGltdW0gZmlsZQorICogIHNpemUgd291bGQgYmUgZXhjZWVkZWQgd2l0aCB0aGUgbmV4dCBidWZmZXIgb3IgYnVmZmVyIGxpc3QKKyAqIEBHU1RfTVVMVElfRklMRV9TSU5LX05FWFRfTUFYX0RVUkFUSU9OOiBOZXcgZmlsZSB3aGVuIHRoZSBjb25maWd1cmVkIG1heGltdW0gZHVyYXRpb24KKyAqICB3b3VsZCBiZSBleGNlZWRlZCB3aXRoIHRoZSBuZXh0IGJ1ZmZlciBvciBidWZmZXIgbGlzdAorICoKKyAqIEZpbGUgc3BsaXR0aW5nIG1vZGVzLgorICovCit0eXBlZGVmIGVudW0geworICBHU1RfTVVMVElfRklMRV9TSU5LX05FWFRfQlVGRkVSLAorICBHU1RfTVVMVElfRklMRV9TSU5LX05FWFRfRElTQ09OVCwKKyAgR1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX0tFWV9GUkFNRSwKKyAgR1NUX01VTFRJX0ZJTEVfU0lOS19ORVhUX0tFWV9VTklUX0VWRU5ULAorICBHU1RfTVVMVElfRklMRV9TSU5LX05FWFRfTUFYX1NJWkUsCisgIEdTVF9NVUxUSV9GSUxFX1NJTktfTkVYVF9NQVhfRFVSQVRJT04KK30gR3N0TXVsdGlGaWxlU2lua05leHQ7CisKK3N0cnVjdCBfR3N0TXVsdGlGaWxlU2luaworeworICBHc3RCYXNlU2luayBwYXJlbnQ7CisKKyAgZ2NoYXIgKmZpbGVuYW1lOworICBnaW50IGluZGV4OworICBnYm9vbGVhbiBwb3N0X21lc3NhZ2VzOworICBHc3RNdWx0aUZpbGVTaW5rTmV4dCBuZXh0X2ZpbGU7CisgIEZJTEUgKmZpbGU7CisKKyAgZ3VpbnQgbWF4X2ZpbGVzOworICBHUXVldWUgb2xkX2ZpbGVzOyAgICAgICAgLyoga2VlcCB0cmFjayBvZiBvbGQgZmlsZXMgZm9yIG1heF9maWxlcyBoYW5kbGluZyAqLworCisgIGdpbnQ2NCBuZXh0X3NlZ21lbnQ7CisKKyAgaW50IG5fc3RyZWFtaGVhZGVyczsKKyAgR3N0QnVmZmVyICoqc3RyZWFtaGVhZGVyczsKKyAgZ3VpbnQgZm9yY2Vfa2V5X3VuaXRfY291bnQ7CisKKyAgZ3VpbnQ2NCBjdXJfZmlsZV9zaXplOworICBndWludDY0IG1heF9maWxlX3NpemU7CisKKyAgR3N0Q2xvY2tUaW1lIGZpbGVfcHRzOworICBHc3RDbG9ja1RpbWUgbWF4X2ZpbGVfZHVyYXRpb247CisKKyAgZ2Jvb2xlYW4gYWdncmVnYXRlX2dvcHM7CisgIEdzdEFkYXB0ZXIgKmdvcF9hZGFwdGVyOyAgLyogdG8gYWdncmVnYXRlIEdPUHMgKi8KKyAgR0xpc3QgKnBvdGVudGlhbF9uZXh0X2dvcDsJLyogVG8gZGV0ZWN0IGZhbHNlLXBvc2l0aXZlcyAqLworfTsKKworc3RydWN0IF9Hc3RNdWx0aUZpbGVTaW5rQ2xhc3MKK3sKKyAgR3N0QmFzZVNpbmtDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfbXVsdGlfZmlsZV9zaW5rX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX01VTFRJRklMRVNJTktfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5jIGIvZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWQxYTFiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuYwpAQCAtMCwwICsxLDU3MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogZ3N0bXVsdGlmaWxlc3JjLmM6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LW11bHRpZmlsZXNyYworICogQHNlZV9hbHNvOiAjR3N0RmlsZVNyYworICoKKyAqIFJlYWRzIGJ1ZmZlcnMgZnJvbSBzZXF1ZW50aWFsbHkgbmFtZWQgZmlsZXMuIElmIHVzZWQgdG9nZXRoZXIgd2l0aCBhbiBpbWFnZQorICogZGVjb2Rlciwgb25lIG5lZWRzIHRvIHVzZSB0aGUgI0dzdE11bHRpRmlsZVNyYzpjYXBzIHByb3BlcnR5IG9yIGEgY2Fwc2ZpbHRlcgorICogdG8gZm9yY2UgdG8gY2FwcyBjb250YWluaW5nIGEgZnJhbWVyYXRlLiBPdGhlcndpc2UgaW1hZ2UgZGVjb2RlcnMgc2VuZCBFT1MKKyAqIGFmdGVyIHRoZSBmaXJzdCBwaWN0dXJlLiBXZSBhbHNvIG5lZWQgYSB2aWRlb3JhdGUgZWxlbWVudCB0byBzZXQgdGltZXN0YW1wcworICogb24gYWxsIGJ1ZmZlcnMgYWZ0ZXIgdGhlIGZpcnN0IG9uZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGZyYW1lcmF0ZS4KKyAqCisgKiBGaWxlIG5hbWVzIGFyZSBjcmVhdGVkIGJ5IHJlcGxhY2luZyAiXCVkIiB3aXRoIHRoZSBpbmRleCB1c2luZyBwcmludGYoKS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgbXVsdGlmaWxlc3JjIGxvY2F0aW9uPSJpbWcuJTA0ZC5wbmciIGluZGV4PTAgY2Fwcz0iaW1hZ2UvcG5nLGZyYW1lcmF0ZT1cKGZyYWN0aW9uXCkxMi8xIiAhIFwKKyAqICAgICBwbmdkZWMgISB2aWRlb2NvbnZlcnQgISB2aWRlb3JhdGUgISB0aGVvcmFlbmMgISBvZ2dtdXggISBcCisgKiAgICAgZmlsZXNpbmsgbG9jYXRpb249ImltYWdlcy5vZ2ciCisgKiBdfCBUaGlzIHBpcGVsaW5lIGNyZWF0ZXMgYSB2aWRlbyBmaWxlICJpbWFnZXMub2dnIiBieSBqb2luaW5nIG11bHRpcGxlIFBORworICogZmlsZXMgbmFtZWQgaW1nLjAwMDAucG5nLCBpbWcuMDAwMS5wbmcsIGV0Yy4KKyAqIDwvcmVmc2VjdDI+CisqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdG11bHRpZmlsZXNyYy5oIgorCisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9tdWx0aV9maWxlX3NyY19jcmVhdGUgKEdzdFB1c2hTcmMgKiBzcmMsCisgICAgR3N0QnVmZmVyICoqIGJ1ZmZlcik7CisKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aV9maWxlX3NyY19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIHZvaWQgZ3N0X211bHRpX2ZpbGVfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aV9maWxlX3NyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X211bHRpX2ZpbGVfc3JjX2dldGNhcHMgKEdzdEJhc2VTcmMgKiBzcmMsIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9tdWx0aV9maWxlX3NyY19xdWVyeSAoR3N0QmFzZVNyYyAqIHNyYywgR3N0UXVlcnkgKiBxdWVyeSk7CitzdGF0aWMgdm9pZCBnc3RfbXVsdGlfZmlsZV9zcmNfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwKKyAgICBncG9pbnRlciBpZmFjZV9kYXRhKTsKKworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X211bHRpX2ZpbGVfc3JjX3BhZF90ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9tdWx0aV9maWxlX3NyY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfbXVsdGlfZmlsZV9zcmNfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTE9DQVRJT04sCisgIFBST1BfSU5ERVgsCisgIFBST1BfU1RBUlRfSU5ERVgsCisgIFBST1BfU1RPUF9JTkRFWCwKKyAgUFJPUF9DQVBTLAorICBQUk9QX0xPT1AKK307CisKKyNkZWZpbmUgREVGQVVMVF9MT0NBVElPTiAiJTA1ZCIKKyNkZWZpbmUgREVGQVVMVF9JTkRFWCAwCisKKyNkZWZpbmUgZ3N0X211bHRpX2ZpbGVfc3JjX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RNdWx0aUZpbGVTcmMsIGdzdF9tdWx0aV9maWxlX3NyYywgR1NUX1RZUEVfUFVTSF9TUkMsCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9VUklfSEFORExFUiwKKyAgICAgICAgZ3N0X211bHRpX2ZpbGVfc3JjX3VyaV9oYW5kbGVyX2luaXQpKTsKKworCitzdGF0aWMgZ2Jvb2xlYW4KK2lzX3NlZWthYmxlIChHc3RCYXNlU3JjICogc3JjKQoreworICBHc3RNdWx0aUZpbGVTcmMgKm1mcyA9IEdTVF9NVUxUSV9GSUxFX1NSQyAoc3JjKTsKKworICBpZiAobWZzLT5mcHNfbiAhPSAtMSkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZG9fc2VlayAoR3N0QmFzZVNyYyAqIGJzcmMsIEdzdFNlZ21lbnQgKiBzZWdtZW50KQoreworICBnYm9vbGVhbiByZXZlcnNlOworICBHc3RDbG9ja1RpbWUgcG9zaXRpb247CisgIEdzdE11bHRpRmlsZVNyYyAqc3JjOworCisgIHNyYyA9IEdTVF9NVUxUSV9GSUxFX1NSQyAoYnNyYyk7CisKKyAgc2VnbWVudC0+dGltZSA9IHNlZ21lbnQtPnN0YXJ0OworICBwb3NpdGlvbiA9IHNlZ21lbnQtPnBvc2l0aW9uOworICByZXZlcnNlID0gc2VnbWVudC0+cmF0ZSA8IDA7CisKKyAgaWYgKHJldmVyc2UpIHsKKyAgICBHU1RfRklYTUVfT0JKRUNUIChzcmMsICJIYW5kbGUgcmV2ZXJzZSBwbGF5YmFjayIpOworCisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogbm93IG1vdmUgdG8gdGhlIHBvc2l0aW9uIGluZGljYXRlZCAqLworICBpZiAoc3JjLT5mcHNfbikgeworICAgIHNyYy0+aW5kZXggPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHBvc2l0aW9uLAorICAgICAgICBzcmMtPmZwc19uLCBzcmMtPmZwc19kICogR1NUX1NFQ09ORCk7CisgIH0gZWxzZSB7CisgICAgc3JjLT5pbmRleCA9IDA7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJObyBGUFMgc2V0LCBjYW4gbm90IHNlZWsiKTsKKworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X211bHRpX2ZpbGVfc3JjX2NsYXNzX2luaXQgKEdzdE11bHRpRmlsZVNyY0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdzdFB1c2hTcmNDbGFzcyAqZ3N0cHVzaHNyY19jbGFzcyA9IEdTVF9QVVNIX1NSQ19DTEFTUyAoa2xhc3MpOworICBHc3RCYXNlU3JjQ2xhc3MgKmdzdGJhc2VzcmNfY2xhc3MgPSBHU1RfQkFTRV9TUkNfQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfbXVsdGlfZmlsZV9zcmNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfbXVsdGlfZmlsZV9zcmNfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTE9DQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibG9jYXRpb24iLCAiRmlsZSBMb2NhdGlvbiIsCisgICAgICAgICAgIlBhdHRlcm4gdG8gY3JlYXRlIGZpbGUgbmFtZXMgb2YgaW5wdXQgZmlsZXMuICBGaWxlIG5hbWVzIGFyZSAiCisgICAgICAgICAgImNyZWF0ZWQgYnkgY2FsbGluZyBzcHJpbnRmKCkgd2l0aCB0aGUgcGF0dGVybiBhbmQgdGhlIGN1cnJlbnQgIgorICAgICAgICAgICJpbmRleC4iLCBERUZBVUxUX0xPQ0FUSU9OLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lOREVYLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImluZGV4IiwgIkZpbGUgSW5kZXgiLAorICAgICAgICAgICJJbmRleCB0byB1c2Ugd2l0aCBsb2NhdGlvbiBwcm9wZXJ0eSB0byBjcmVhdGUgZmlsZSBuYW1lcy4gIFRoZSAiCisgICAgICAgICAgImluZGV4IGlzIGluY3JlbWVudGVkIGJ5IG9uZSBmb3IgZWFjaCBidWZmZXIgcmVhZC4iLAorICAgICAgICAgIDAsIElOVF9NQVgsIERFRkFVTFRfSU5ERVgsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU1RBUlRfSU5ERVgsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgic3RhcnQtaW5kZXgiLCAiU3RhcnQgSW5kZXgiLAorICAgICAgICAgICJTdGFydCB2YWx1ZSBvZiBpbmRleC4gIFRoZSBpbml0aWFsIHZhbHVlIG9mIGluZGV4IGNhbiBiZSBzZXQgIgorICAgICAgICAgICJlaXRoZXIgYnkgc2V0dGluZyBpbmRleCBvciBzdGFydC1pbmRleC4gIFdoZW4gdGhlIGVuZCBvZiB0aGUgbG9vcCAiCisgICAgICAgICAgImlzIHJlYWNoZWQsIHRoZSBpbmRleCB3aWxsIGJlIHNldCB0byB0aGUgdmFsdWUgc3RhcnQtaW5kZXguIiwKKyAgICAgICAgICAwLCBJTlRfTUFYLCBERUZBVUxUX0lOREVYLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NUT1BfSU5ERVgsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgic3RvcC1pbmRleCIsICJTdG9wIEluZGV4IiwKKyAgICAgICAgICAiU3RvcCB2YWx1ZSBvZiBpbmRleC4gIFRoZSBzcGVjaWFsIHZhbHVlIC0xIG1lYW5zIG5vIHN0b3AuIiwKKyAgICAgICAgICAtMSwgSU5UX01BWCwgREVGQVVMVF9JTkRFWCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DQVBTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgiY2FwcyIsICJDYXBzIiwKKyAgICAgICAgICAiQ2FwcyBkZXNjcmliaW5nIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEuIiwKKyAgICAgICAgICBHU1RfVFlQRV9DQVBTLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MT09QLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJsb29wIiwgIkxvb3AiLAorICAgICAgICAgICJXaGV0aGVyIHRvIHJlcGVhdCBmcm9tIHRoZSBiZWdpbm5pbmcgd2hlbiBhbGwgZmlsZXMgaGF2ZSBiZWVuIHJlYWQuIiwKKyAgICAgICAgICBGQUxTRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9tdWx0aV9maWxlX3NyY19kaXNwb3NlOworCisgIGdzdGJhc2VzcmNfY2xhc3MtPmdldF9jYXBzID0gZ3N0X211bHRpX2ZpbGVfc3JjX2dldGNhcHM7CisgIGdzdGJhc2VzcmNfY2xhc3MtPnF1ZXJ5ID0gZ3N0X211bHRpX2ZpbGVfc3JjX3F1ZXJ5OworICBnc3RiYXNlc3JjX2NsYXNzLT5pc19zZWVrYWJsZSA9IGlzX3NlZWthYmxlOworICBnc3RiYXNlc3JjX2NsYXNzLT5kb19zZWVrID0gZG9fc2VlazsKKworICBnc3RwdXNoc3JjX2NsYXNzLT5jcmVhdGUgPSBnc3RfbXVsdGlfZmlsZV9zcmNfY3JlYXRlOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfbXVsdGlfZmlsZV9zcmNfZGVidWcsICJtdWx0aWZpbGVzcmMiLCAwLAorICAgICAgIm11bHRpZmlsZXNyYyBlbGVtZW50Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X211bHRpX2ZpbGVfc3JjX3BhZF90ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJNdWx0aS1GaWxlIFNvdXJjZSIsCisgICAgICAiU291cmNlL0ZpbGUiLCAiUmVhZCBhIHNlcXVlbnRpYWxseSBuYW1lZCBzZXQgb2YgZmlsZXMgaW50byBidWZmZXJzIiwKKyAgICAgICJEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3NyY19pbml0IChHc3RNdWx0aUZpbGVTcmMgKiBtdWx0aWZpbGVzcmMpCit7CisgIG11bHRpZmlsZXNyYy0+c3RhcnRfaW5kZXggPSBERUZBVUxUX0lOREVYOworICBtdWx0aWZpbGVzcmMtPmluZGV4ID0gREVGQVVMVF9JTkRFWDsKKyAgbXVsdGlmaWxlc3JjLT5zdG9wX2luZGV4ID0gLTE7CisgIG11bHRpZmlsZXNyYy0+ZmlsZW5hbWUgPSBnX3N0cmR1cCAoREVGQVVMVF9MT0NBVElPTik7CisgIG11bHRpZmlsZXNyYy0+c3VjY2Vzc2Z1bF9yZWFkID0gRkFMU0U7CisgIG11bHRpZmlsZXNyYy0+ZnBzX24gPSBtdWx0aWZpbGVzcmMtPmZwc19kID0gLTE7CisKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3NyY19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RNdWx0aUZpbGVTcmMgKnNyYyA9IEdTVF9NVUxUSV9GSUxFX1NSQyAob2JqZWN0KTsKKworICBnX2ZyZWUgKHNyYy0+ZmlsZW5hbWUpOworICBzcmMtPmZpbGVuYW1lID0gTlVMTDsKKyAgaWYgKHNyYy0+Y2FwcykKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjLT5jYXBzKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X211bHRpX2ZpbGVfc3JjX2dldGNhcHMgKEdzdEJhc2VTcmMgKiBzcmMsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdE11bHRpRmlsZVNyYyAqbXVsdGlfZmlsZV9zcmMgPSBHU1RfTVVMVElfRklMRV9TUkMgKHNyYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicmV0dXJuaW5nICUiIEdTVF9QVFJfRk9STUFULCBtdWx0aV9maWxlX3NyYy0+Y2Fwcyk7CisKKyAgaWYgKG11bHRpX2ZpbGVfc3JjLT5jYXBzKSB7CisgICAgaWYgKGZpbHRlcikKKyAgICAgIHJldHVybiBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCBtdWx0aV9maWxlX3NyYy0+Y2FwcywKKyAgICAgICAgICBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBnc3RfY2Fwc19yZWYgKG11bHRpX2ZpbGVfc3JjLT5jYXBzKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZmlsdGVyKQorICAgICAgcmV0dXJuIGdzdF9jYXBzX3JlZiAoZmlsdGVyKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gZ3N0X2NhcHNfbmV3X2FueSAoKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aV9maWxlX3NyY19xdWVyeSAoR3N0QmFzZVNyYyAqIHNyYywgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RNdWx0aUZpbGVTcmMgKm1mc3JjOworCisgIG1mc3JjID0gR1NUX01VTFRJX0ZJTEVfU1JDIChzcmMpOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX1BPU0lUSU9OOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9wb3NpdGlvbiAocXVlcnksICZmb3JtYXQsIE5VTEwpOworICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0JVRkZFUlM6CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICAgIGdzdF9xdWVyeV9zZXRfcG9zaXRpb24gKHF1ZXJ5LCBmb3JtYXQsCisgICAgICAgICAgICAgIG1mc3JjLT5pbmRleCAtIG1mc3JjLT5zdGFydF9pbmRleCk7CisgICAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXMgPSBHU1RfQkFTRV9TUkNfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnF1ZXJ5IChzcmMsIHF1ZXJ5KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gR1NUX0JBU0VfU1JDX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5xdWVyeSAoc3JjLCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aV9maWxlX3NyY19zZXRfbG9jYXRpb24gKEdzdE11bHRpRmlsZVNyYyAqIHNyYywgY29uc3QgZ2NoYXIgKiBsb2NhdGlvbikKK3sKKyAgZ19mcmVlIChzcmMtPmZpbGVuYW1lKTsKKyAgaWYgKGxvY2F0aW9uICE9IE5VTEwpIHsKKyAgICBzcmMtPmZpbGVuYW1lID0gZ19zdHJkdXAgKGxvY2F0aW9uKTsKKyAgfSBlbHNlIHsKKyAgICBzcmMtPmZpbGVuYW1lID0gTlVMTDsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X211bHRpX2ZpbGVfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RNdWx0aUZpbGVTcmMgKnNyYyA9IEdTVF9NVUxUSV9GSUxFX1NSQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTE9DQVRJT046CisgICAgICBnc3RfbXVsdGlfZmlsZV9zcmNfc2V0X2xvY2F0aW9uIChzcmMsIGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTkRFWDoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3JjKTsKKyAgICAgIC8qIGluZGV4IHdhcyByZWFsbHkgbWVhbnQgdG8gYmUgcmVhZC1vbmx5LCBidXQgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5CisgICAgICAgKiB3ZSBzZXQgc3RhcnRfaW5kZXggdG8gbWFrZSBpdCB3b3JrIGFzIGl0IHVzZWQgdG8gKi8KKyAgICAgIGlmICghR1NUX09CSkVDVF9GTEFHX0lTX1NFVCAoc3JjLCBHU1RfQkFTRV9TUkNfRkxBR19TVEFSVEVEKSkKKyAgICAgICAgc3JjLT5zdGFydF9pbmRleCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgZWxzZQorICAgICAgICBzcmMtPmluZGV4ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc3JjKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVEFSVF9JTkRFWDoKKyAgICAgIHNyYy0+c3RhcnRfaW5kZXggPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVE9QX0lOREVYOgorICAgICAgc3JjLT5zdG9wX2luZGV4ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0FQUzoKKyAgICB7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnN0ID0gTlVMTDsKKyAgICAgIGNvbnN0IEdzdENhcHMgKmNhcHMgPSBnc3RfdmFsdWVfZ2V0X2NhcHMgKHZhbHVlKTsKKyAgICAgIEdzdENhcHMgKm5ld19jYXBzOworCisgICAgICBpZiAoY2FwcyA9PSBOVUxMKSB7CisgICAgICAgIG5ld19jYXBzID0gZ3N0X2NhcHNfbmV3X2FueSAoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5ld19jYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgICAgICB9CisgICAgICBnc3RfY2Fwc19yZXBsYWNlICgmc3JjLT5jYXBzLCBuZXdfY2Fwcyk7CisgICAgICBnc3RfcGFkX3NldF9jYXBzIChHU1RfQkFTRV9TUkNfUEFEIChzcmMpLCBuZXdfY2Fwcyk7CisKKyAgICAgIGlmIChuZXdfY2FwcyAmJiBnc3RfY2Fwc19nZXRfc2l6ZSAobmV3X2NhcHMpID09IDEgJiYKKyAgICAgICAgICAoc3QgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChuZXdfY2FwcywgMCkpCisgICAgICAgICAgJiYgZ3N0X3N0cnVjdHVyZV9nZXRfZnJhY3Rpb24gKHN0LCAiZnJhbWVyYXRlIiwgJnNyYy0+ZnBzX24sCisgICAgICAgICAgICAgICZzcmMtPmZwc19kKSkgeworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHNyYywgIlNldGluZyBmcmFtZXJhdGUgdG8gJWQvJWQiLCBzcmMtPmZwc19uLAorICAgICAgICAgICAgc3JjLT5mcHNfZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcmMtPmZwc19uID0gLTE7CisgICAgICAgIHNyYy0+ZnBzX2QgPSAtMTsKKyAgICAgIH0KKyAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTE9PUDoKKyAgICAgIHNyYy0+bG9vcCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aV9maWxlX3NyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0TXVsdGlGaWxlU3JjICpzcmMgPSBHU1RfTVVMVElfRklMRV9TUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xPQ0FUSU9OOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc3JjLT5maWxlbmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSU5ERVg6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBzcmMtPmluZGV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVEFSVF9JTkRFWDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHNyYy0+c3RhcnRfaW5kZXgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUT1BfSU5ERVg6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBzcmMtPnN0b3BfaW5kZXgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NBUFM6CisgICAgICBnc3RfdmFsdWVfc2V0X2NhcHMgKHZhbHVlLCBzcmMtPmNhcHMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xPT1A6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc3JjLT5sb29wKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdjaGFyICoKK2dzdF9tdWx0aV9maWxlX3NyY19nZXRfZmlsZW5hbWUgKEdzdE11bHRpRmlsZVNyYyAqIG11bHRpZmlsZXNyYykKK3sKKyAgZ2NoYXIgKmZpbGVuYW1lOworCisgIEdTVF9ERUJVRyAoIiVkIiwgbXVsdGlmaWxlc3JjLT5pbmRleCk7CisgIGZpbGVuYW1lID0gZ19zdHJkdXBfcHJpbnRmIChtdWx0aWZpbGVzcmMtPmZpbGVuYW1lLCBtdWx0aWZpbGVzcmMtPmluZGV4KTsKKworICByZXR1cm4gZmlsZW5hbWU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbXVsdGlfZmlsZV9zcmNfY3JlYXRlIChHc3RQdXNoU3JjICogc3JjLCBHc3RCdWZmZXIgKiogYnVmZmVyKQoreworICBHc3RNdWx0aUZpbGVTcmMgKm11bHRpZmlsZXNyYzsKKyAgZ3NpemUgc2l6ZTsKKyAgZ2NoYXIgKmRhdGE7CisgIGdjaGFyICpmaWxlbmFtZTsKKyAgR3N0QnVmZmVyICpidWY7CisgIGdib29sZWFuIHJldDsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgbXVsdGlmaWxlc3JjID0gR1NUX01VTFRJX0ZJTEVfU1JDIChzcmMpOworCisgIGlmIChtdWx0aWZpbGVzcmMtPmluZGV4IDwgbXVsdGlmaWxlc3JjLT5zdGFydF9pbmRleCkgeworICAgIG11bHRpZmlsZXNyYy0+aW5kZXggPSBtdWx0aWZpbGVzcmMtPnN0YXJ0X2luZGV4OworICB9CisKKyAgaWYgKG11bHRpZmlsZXNyYy0+c3RvcF9pbmRleCAhPSAtMSAmJgorICAgICAgbXVsdGlmaWxlc3JjLT5pbmRleCA+IG11bHRpZmlsZXNyYy0+c3RvcF9pbmRleCkgeworICAgIGlmIChtdWx0aWZpbGVzcmMtPmxvb3ApCisgICAgICBtdWx0aWZpbGVzcmMtPmluZGV4ID0gbXVsdGlmaWxlc3JjLT5zdGFydF9pbmRleDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworICB9CisKKyAgZmlsZW5hbWUgPSBnc3RfbXVsdGlfZmlsZV9zcmNfZ2V0X2ZpbGVuYW1lIChtdWx0aWZpbGVzcmMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG11bHRpZmlsZXNyYywgInJlYWRpbmcgZnJvbSBmaWxlIFwiJXNcIi4iLCBmaWxlbmFtZSk7CisKKyAgcmV0ID0gZ19maWxlX2dldF9jb250ZW50cyAoZmlsZW5hbWUsICZkYXRhLCAmc2l6ZSwgJmVycm9yKTsKKyAgaWYgKCFyZXQpIHsKKyAgICBpZiAobXVsdGlmaWxlc3JjLT5zdWNjZXNzZnVsX3JlYWQpIHsKKyAgICAgIC8qIElmIHdlJ3ZlIHJlYWQgYXQgbGVhc3Qgb25lIGJ1ZmZlciBzdWNjZXNzZnVsbHksIG5vdCBmaW5kaW5nIHRoZQorICAgICAgICogbmV4dCBmaWxlIGlzIEVPUy4gKi8KKyAgICAgIGdfZnJlZSAoZmlsZW5hbWUpOworICAgICAgaWYgKGVycm9yICE9IE5VTEwpCisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworCisgICAgICBpZiAobXVsdGlmaWxlc3JjLT5sb29wKSB7CisgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgICAgbXVsdGlmaWxlc3JjLT5pbmRleCA9IG11bHRpZmlsZXNyYy0+c3RhcnRfaW5kZXg7CisKKyAgICAgICAgZmlsZW5hbWUgPSBnc3RfbXVsdGlfZmlsZV9zcmNfZ2V0X2ZpbGVuYW1lIChtdWx0aWZpbGVzcmMpOworICAgICAgICByZXQgPSBnX2ZpbGVfZ2V0X2NvbnRlbnRzIChmaWxlbmFtZSwgJmRhdGEsICZzaXplLCAmZXJyb3IpOworICAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgIGdfZnJlZSAoZmlsZW5hbWUpOworICAgICAgICAgIGlmIChlcnJvciAhPSBOVUxMKQorICAgICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisKKyAgICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBnb3RvIGhhbmRsZV9lcnJvcjsKKyAgICB9CisgIH0KKworICBtdWx0aWZpbGVzcmMtPnN1Y2Nlc3NmdWxfcmVhZCA9IFRSVUU7CisgIG11bHRpZmlsZXNyYy0+aW5kZXgrKzsKKworICBidWYgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgZ3N0X2J1ZmZlcl9hcHBlbmRfbWVtb3J5IChidWYsCisgICAgICBnc3RfbWVtb3J5X25ld193cmFwcGVkICgwLCBkYXRhLCBzaXplLCAwLCBzaXplLCBkYXRhLCBnX2ZyZWUpKTsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPSBtdWx0aWZpbGVzcmMtPm9mZnNldDsKKyAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWYpID0gbXVsdGlmaWxlc3JjLT5vZmZzZXQgKyBzaXplOworICBtdWx0aWZpbGVzcmMtPm9mZnNldCArPSBzaXplOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG11bHRpZmlsZXNyYywgInJlYWQgZmlsZSBcIiVzXCIuIiwgZmlsZW5hbWUpOworCisgIGdfZnJlZSAoZmlsZW5hbWUpOworICAqYnVmZmVyID0gYnVmOworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKK2hhbmRsZV9lcnJvcjoKKyAgeworICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAobXVsdGlmaWxlc3JjLCBSRVNPVVJDRSwgUkVBRCwKKyAgICAgICAgICAoIkVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBmaWxlIFwiJXNcIi4iLCBmaWxlbmFtZSksCisgICAgICAgICAgKCIlcyIsIGVycm9yLT5tZXNzYWdlKSk7CisgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKG11bHRpZmlsZXNyYywgUkVTT1VSQ0UsIFJFQUQsCisgICAgICAgICAgKCJFcnJvciB3aGlsZSByZWFkaW5nIGZyb20gZmlsZSBcIiVzXCIuIiwgZmlsZW5hbWUpLAorICAgICAgICAgICgiJXMiLCBnX3N0cmVycm9yIChlcnJubykpKTsKKyAgICB9CisgICAgZ19mcmVlIChmaWxlbmFtZSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBHc3RVUklUeXBlCitnc3RfbXVsdGlfZmlsZV9zcmNfdXJpX2dldF90eXBlIChHVHlwZSB0eXBlKQoreworICByZXR1cm4gR1NUX1VSSV9TUkM7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqY29uc3QgKgorZ3N0X211bHRpX2ZpbGVfc3JjX3VyaV9nZXRfcHJvdG9jb2xzIChHVHlwZSB0eXBlKQoreworICBzdGF0aWMgY29uc3QgZ2NoYXIgKnByb3RvY29sc1tdID0geyAibXVsdGlmaWxlIiwgTlVMTCB9OworCisgIHJldHVybiAoY29uc3QgZ2NoYXIgKiBjb25zdCAqKSBwcm90b2NvbHM7Cit9CisKK3N0YXRpYyBnY2hhciAqCitnc3RfbXVsdGlfZmlsZV9zcmNfdXJpX2dldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyKQoreworICBHc3RNdWx0aUZpbGVTcmMgKnNyYyA9IEdTVF9NVUxUSV9GSUxFX1NSQyAoaGFuZGxlcik7CisgIGdjaGFyICpyZXQ7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworICBpZiAoc3JjLT5maWxlbmFtZSAhPSBOVUxMKSB7CisgICAgR3N0VXJpICp1cmkgPSBnc3RfdXJpX25ldyAoIm11bHRpZmxlIiwgTlVMTCwgTlVMTCwgR1NUX1VSSV9OT19QT1JULAorICAgICAgICBzcmMtPmZpbGVuYW1lLCBOVUxMLCBOVUxMKTsKKworICAgIHJldCA9IGdzdF91cmlfdG9fc3RyaW5nICh1cmkpOworICAgIGdzdF91cmlfdW5yZWYgKHVyaSk7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gTlVMTDsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoc3JjKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aV9maWxlX3NyY191cmlfc2V0X3VyaSAoR3N0VVJJSGFuZGxlciAqIGhhbmRsZXIsIGNvbnN0IGdjaGFyICogdXJpLAorICAgIEdFcnJvciAqKiBlcnJvcikKK3sKKyAgR3N0TXVsdGlGaWxlU3JjICpzcmMgPSBHU1RfTVVMVElfRklMRV9TUkMgKGhhbmRsZXIpOworICBHc3RVcmkgKmdzdHVyaTsKKyAgZ2NoYXIgKnBhdGg7CisKKyAgZ3N0dXJpID0gZ3N0X3VyaV9mcm9tX3N0cmluZyAodXJpKTsKKyAgaWYgKGdzdHVyaSA9PSBOVUxMKQorICAgIGdvdG8gaW52YWxpZF91cmk7CisKKyAgLyogVGhpcyBzaG91bGQgZ2V0IHVzIHRoZSB1bmVzY2FwZWQgcGF0aCAqLworICBwYXRoID0gZ3N0X3VyaV9nZXRfcGF0aCAoZ3N0dXJpKTsKKyAgaWYgKHBhdGggPT0gTlVMTCkKKyAgICBnb3RvIGludmFsaWRfdXJpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoc3JjKTsKKyAgZ3N0X211bHRpX2ZpbGVfc3JjX3NldF9sb2NhdGlvbiAoc3JjLCBwYXRoKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisKKyAgZ19mcmVlIChwYXRoKTsKKyAgZ3N0X3VyaV91bnJlZiAoZ3N0dXJpKTsKKworICByZXR1cm4gVFJVRTsKKworLyogRVJST1JTICovCitpbnZhbGlkX3VyaToKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiSW52YWxpZCBtdWx0aWZpbGUgVVJJICclcyciLCB1cmkpOworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgR1NUX1VSSV9FUlJPUiwgR1NUX1VSSV9FUlJPUl9CQURfVVJJLAorICAgICAgICAiSW52YWxpZCBtdWx0aWZpbGUgVVJJIik7CisgICAgaWYgKGdzdHVyaSkKKyAgICAgIGdzdF91cmlfdW5yZWYgKGdzdHVyaSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGlfZmlsZV9zcmNfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0VVJJSGFuZGxlckludGVyZmFjZSAqaWZhY2UgPSAoR3N0VVJJSGFuZGxlckludGVyZmFjZSAqKSBnX2lmYWNlOworCisgIGlmYWNlLT5nZXRfdHlwZSA9IGdzdF9tdWx0aV9maWxlX3NyY191cmlfZ2V0X3R5cGU7CisgIGlmYWNlLT5nZXRfcHJvdG9jb2xzID0gZ3N0X211bHRpX2ZpbGVfc3JjX3VyaV9nZXRfcHJvdG9jb2xzOworICBpZmFjZS0+Z2V0X3VyaSA9IGdzdF9tdWx0aV9maWxlX3NyY191cmlfZ2V0X3VyaTsKKyAgaWZhY2UtPnNldF91cmkgPSBnc3RfbXVsdGlfZmlsZV9zcmNfdXJpX3NldF91cmk7Cit9CmRpZmYgLS1naXQgYS9nc3QvbXVsdGlmaWxlL2dzdG11bHRpZmlsZXNyYy5oIGIvZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWI5NzMwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpZmlsZS9nc3RtdWx0aWZpbGVzcmMuaApAQCAtMCwwICsxLDcyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBnc3RtdWx0aWZpbGVzcmMuYzoKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX01VTFRJRklMRVNSQ19IX18KKyNkZWZpbmUgX19HU1RfTVVMVElGSUxFU1JDX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdHB1c2hzcmMuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX01VTFRJX0ZJTEVfU1JDIFwKKyAgKGdzdF9tdWx0aV9maWxlX3NyY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfTVVMVElfRklMRV9TUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9NVUxUSV9GSUxFX1NSQyxHc3RNdWx0aUZpbGVTcmMpKQorI2RlZmluZSBHU1RfTVVMVElfRklMRV9TUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfTVVMVElfRklMRV9TUkMsR3N0TXVsdGlGaWxlU3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfTVVMVElfRklMRV9TUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9NVUxUSV9GSUxFX1NSQykpCisjZGVmaW5lIEdTVF9JU19NVUxUSV9GSUxFX1NSQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9NVUxUSV9GSUxFX1NSQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RNdWx0aUZpbGVTcmMgR3N0TXVsdGlGaWxlU3JjOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE11bHRpRmlsZVNyY0NsYXNzIEdzdE11bHRpRmlsZVNyY0NsYXNzOworCitzdHJ1Y3QgX0dzdE11bHRpRmlsZVNyYworeworICBHc3RQdXNoU3JjIHBhcmVudDsKKworICBnY2hhciAqZmlsZW5hbWU7CisgIGludCBzdGFydF9pbmRleDsKKyAgaW50IHN0b3BfaW5kZXg7CisgIGludCBpbmRleDsKKworICBpbnQgb2Zmc2V0OworCisgIGdib29sZWFuIGxvb3A7CisKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Jvb2xlYW4gc3VjY2Vzc2Z1bF9yZWFkOworCisgIGdpbnQgZnBzX24sIGZwc19kOworfTsKKworc3RydWN0IF9Hc3RNdWx0aUZpbGVTcmNDbGFzcworeworICBHc3RQdXNoU3JjQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X211bHRpX2ZpbGVfc3JjX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX01VTFRJRklMRVNSQ19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmMgYi9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMmQwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5jCkBAIC0wLDAgKzEsNTk4IEBACisvKiBHU3RyZWFtZXIgU3BsaXQgRmlsZSBTb3VyY2UKKyAqIENvcHlyaWdodCAoQykgMjAxMSBDb2xsYWJvcmEgTHRkLiA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LXNwbGl0ZmlsZXNyYworICogQHNlZV9hbHNvOiAjR3N0RmlsZVNyYywgI0dzdE11bHRpRmlsZVNyYworICoKKyAqIFJlYWRzIGRhdGEgZnJvbSBtdWx0aXBsZSBmaWxlcywgcHJlc2VudGluZyB0aG9zZSBmaWxlcyBhcyBvbmUgY29udGludW91cworICogZmlsZSB0byBkb3duc3RyZWFtIGVsZW1lbnRzLiBUaGlzIGlzIHVzZWZ1bCBmb3IgcmVhZGluZyBhIGxhcmdlIGZpbGUgdGhhdAorICogaGFkIHRvIGJlIHNwbGl0IGludG8gbXVsdGlwbGUgcGFydHMgZHVlIHRvIGZpbGVzeXN0ZW0gZmlsZSBzaXplIGxpbWl0YXRpb25zLAorICogZm9yIGV4YW1wbGUuCisgKgorICogVGhlIGZpbGVzIHRvIHNlbGVjdCBhcmUgY2hvc2VuIHZpYSB0aGUgbG9jYXRpb24gcHJvcGVydHksIHdoaWNoIHN1cHBvcnRzCisgKiAoYW5kIGV4cGVjdHMpIHNoZWxsLXN0eWxlIHdpbGRjYXJkcyAoYnV0IG9ubHkgZm9yIHRoZSBmaWxlbmFtZSwgbm90IGZvcgorICogZGlyZWN0b3JpZXMpLiBUaGUgcmVzdWx0cyB3aWxsIGJlIHNvcnRlZC4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHNwbGl0ZmlsZXNyYyBsb2NhdGlvbj0iL3BhdGgvdG8vcGFydC0qLm1wZyIgISBkZWNvZGViaW4gISAuLi4KKyAqIF18IFBsYXlzIHRoZSBkaWZmZXJlbnQgcGFydHMgYXMgaWYgdGhleSB3ZXJlIG9uZSBzaW5nbGUgTVBFRyBmaWxlLgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHBsYXliaW4gdXJpPSJzcGxpdGZpbGU6Ly9wYXRoL3RvL2Zvby5hdmkuKiIKKyAqIF18IFBsYXlzIHRoZSBkaWZmZXJlbnQgcGFydHMgYXMgaWYgdGhleSB3ZXJlIG9uZSBzaW5nbGUgQVZJIGZpbGUuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0c3BsaXRmaWxlc3JjLmgiCisjaW5jbHVkZSAiZ3N0c3BsaXR1dGlscy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2VudW0KK3sKKyAgUFJPUF9MT0NBVElPTiA9IDEKK307CisKKyNkZWZpbmUgREVGQVVMVF9MT0NBVElPTiBOVUxMCisKK3N0YXRpYyB2b2lkIGdzdF9zcGxpdF9maWxlX3NyY191cmlfaGFuZGxlcl9pbml0IChncG9pbnRlciBnX2lmYWNlLAorICAgIGdwb2ludGVyIGlmYWNlX2RhdGEpOworc3RhdGljIHZvaWQgZ3N0X3NwbGl0X2ZpbGVfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9zcGxpdF9maWxlX3NyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfc3BsaXRfZmlsZV9zcmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmopOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NwbGl0X2ZpbGVfc3JjX3N0YXJ0IChHc3RCYXNlU3JjICogYmFzZXNyYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NwbGl0X2ZpbGVfc3JjX3N0b3AgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc3BsaXRfZmlsZV9zcmNfY2FuX3NlZWsgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc3BsaXRfZmlsZV9zcmNfZ2V0X3NpemUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjLCBndWludDY0ICogcyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NwbGl0X2ZpbGVfc3JjX3VubG9jayAoR3N0QmFzZVNyYyAqIGJhc2VzcmMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3NwbGl0X2ZpbGVfc3JjX2NyZWF0ZSAoR3N0QmFzZVNyYyAqIGJhc2VzcmMsCisgICAgZ3VpbnQ2NCBvZmZzZXQsIGd1aW50IHNpemUsIEdzdEJ1ZmZlciAqKiBidWZmZXIpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3NwbGl0X2ZpbGVfc3JjX3BhZF90ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHNwbGl0ZmlsZXNyY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBzcGxpdGZpbGVzcmNfZGVidWcKKworCitHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoR3N0U3BsaXRGaWxlU3JjLCBnc3Rfc3BsaXRfZmlsZV9zcmMsIEdTVF9UWVBFX0JBU0VfU1JDLAorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfVVJJX0hBTkRMRVIsCisgICAgICAgIGdzdF9zcGxpdF9maWxlX3NyY191cmlfaGFuZGxlcl9pbml0KSk7CisKKyNpZmRlZiBHX09TX1dJTjMyCisjZGVmaW5lIFdJTjMyX0JMVVJCICIgTG9jYXRpb24gc3RyaW5nIG11c3QgYmUgaW4gVVRGLTggZW5jb2RpbmcgKG9uIFdpbmRvd3MpLiIKKyNlbHNlCisjZGVmaW5lIFdJTjMyX0JMVVJCICAgICAgICAgICAgIC8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorZ3N0X3NwbGl0X2ZpbGVfc3JjX2NsYXNzX2luaXQgKEdzdFNwbGl0RmlsZVNyY0NsYXNzICoga2xhc3MpCit7CisgIEdzdEJhc2VTcmNDbGFzcyAqZ3N0YmFzZXNyY19jbGFzcyA9IEdTVF9CQVNFX1NSQ19DTEFTUyAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9zcGxpdF9maWxlX3NyY19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9zcGxpdF9maWxlX3NyY19nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3NwbGl0X2ZpbGVfc3JjX2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTE9DQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibG9jYXRpb24iLCAiRmlsZSBMb2NhdGlvbiIsCisgICAgICAgICAgIldpbGRjYXJkIHBhdHRlcm4gdG8gbWF0Y2ggZmlsZSBuYW1lcyBvZiB0aGUgaW5wdXQgZmlsZXMuIElmICIKKyAgICAgICAgICAidGhlIGxvY2F0aW9uIGlzIGFuIGFic29sdXRlIHBhdGggb3IgY29udGFpbnMgZGlyZWN0b3J5IGNvbXBvbmVudHMsICIKKyAgICAgICAgICAib25seSB0aGUgYmFzZSBmaWxlIG5hbWUgcGFydCB3aWxsIGJlIGNvbnNpZGVyZWQgZm9yIHBhdHRlcm4gIgorICAgICAgICAgICJtYXRjaGluZy4gVGhlIHJlc3VsdHMgd2lsbCBiZSBzb3J0ZWQuIiBXSU4zMl9CTFVSQiwKKyAgICAgICAgICBERUZBVUxUX0xPQ0FUSU9OLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RiYXNlc3JjX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BsaXRfZmlsZV9zcmNfc3RhcnQpOworICBnc3RiYXNlc3JjX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zcGxpdF9maWxlX3NyY19zdG9wKTsKKyAgZ3N0YmFzZXNyY19jbGFzcy0+Y3JlYXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zcGxpdF9maWxlX3NyY19jcmVhdGUpOworICBnc3RiYXNlc3JjX2NsYXNzLT5nZXRfc2l6ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BsaXRfZmlsZV9zcmNfZ2V0X3NpemUpOworICBnc3RiYXNlc3JjX2NsYXNzLT51bmxvY2sgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NwbGl0X2ZpbGVfc3JjX3VubG9jayk7CisgIGdzdGJhc2VzcmNfY2xhc3MtPmlzX3NlZWthYmxlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BsaXRfZmlsZV9zcmNfY2FuX3NlZWspOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChzcGxpdGZpbGVzcmNfZGVidWcsICJzcGxpdGZpbGVzcmMiLCAwLAorICAgICAgInNwbGl0ZmlsZXNyYyBlbGVtZW50Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3NwbGl0X2ZpbGVfc3JjX3BhZF90ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlNwbGl0LUZpbGUgU291cmNlIiwKKyAgICAgICJTb3VyY2UvRmlsZSIsCisgICAgICAiUmVhZCBhIHNlcXVlbnRpYWxseSBuYW1lZCBzZXQgb2YgZmlsZXMgYXMgaWYgaXQgd2FzIG9uZSBsYXJnZSBmaWxlIiwKKyAgICAgICJUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGxpdF9maWxlX3NyY19pbml0IChHc3RTcGxpdEZpbGVTcmMgKiBzcGxpdGZpbGVzcmMpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRfZmlsZV9zcmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmopCit7CisgIEdzdFNwbGl0RmlsZVNyYyAqc3JjID0gR1NUX1NQTElUX0ZJTEVfU1JDIChvYmopOworCisgIGdfZnJlZSAoc3JjLT5sb2NhdGlvbik7CisgIHNyYy0+bG9jYXRpb24gPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChnc3Rfc3BsaXRfZmlsZV9zcmNfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iaik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NwbGl0X2ZpbGVfc3JjX2Nhbl9zZWVrIChHc3RCYXNlU3JjICogYmFzZXNyYykKK3sKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NwbGl0X2ZpbGVfc3JjX3VubG9jayAoR3N0QmFzZVNyYyAqIGJhc2VzcmMpCit7CisgIC8qIFRoaXMgaXMgbm90IGFjdHVhbGx5IHRoYXQgdXNlZnVsLCBzaW5jZSBhbGwgbm9ybWFsIGZpbGUKKyAgICogb3BlcmF0aW9ucyBhcmUgZnVsbHkgYmxvY2tpbmcgYW55d2F5ICovCisjaWYgMAorICBHc3RTcGxpdEZpbGVTcmMgKnNyYyA9IEdTVF9TUExJVF9GSUxFX1NSQyAoYmFzZXNyYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY2FuY2VsbGluZyBwZW5kaW5nIEkvTyBvcGVyYXRpb24gaWYgdGhlcmUgaXMgb25lIik7CisgIC8qIGdfY2FuY2VsbGFibGVfY2FuY2VsIChzcmMtPmNhbmNlbGxhYmxlKTsgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZG9uZSIpOworI2VuZGlmCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NwbGl0X2ZpbGVfc3JjX2dldF9zaXplIChHc3RCYXNlU3JjICogYmFzZXNyYywgZ3VpbnQ2NCAqIHNpemUpCit7CisgIEdzdFNwbGl0RmlsZVNyYyAqc3JjID0gR1NUX1NQTElUX0ZJTEVfU1JDIChiYXNlc3JjKTsKKworICAqc2l6ZSA9IHNyYy0+cGFydHNbc3JjLT5udW1fcGFydHMgLSAxXS5zdG9wICsgMTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRfZmlsZV9zcmNfc2V0X2xvY2F0aW9uIChHc3RTcGxpdEZpbGVTcmMgKiBzcmMsIGNvbnN0IGNoYXIgKmxvY2F0aW9uKQoreworICBHU1RfT0JKRUNUX0xPQ0sgKHNyYyk7CisgIGdfZnJlZSAoc3JjLT5sb2NhdGlvbik7CisKKyAgaWYgKGxvY2F0aW9uICE9IE5VTEwgJiYgZ19zdHJfaGFzX3ByZWZpeCAobG9jYXRpb24sICJzcGxpdGZpbGU6Ly8iKSkKKyAgICBzcmMtPmxvY2F0aW9uID0gZ3N0X3VyaV9nZXRfbG9jYXRpb24gKGxvY2F0aW9uKTsKKyAgZWxzZQorICAgIHNyYy0+bG9jYXRpb24gPSBnX3N0cmR1cCAobG9jYXRpb24pOworI2lmZGVmIEdfT1NfV0lOMzIKKyAgaWYgKCFnX3V0ZjhfdmFsaWRhdGUgKHNyYy0+bG9jYXRpb24sIC0xLCBOVUxMKSkgeworICAgIGdfd2FybmluZyAoInNwbGl0ZmlsZXNyYyAnbG9jYXRpb24nIHByb3BlcnR5IG11c3QgYmUgaW4gVVRGLTggIgorICAgICAgICAiZW5jb2Rpbmcgb24gV2luZG93cyIpOworICB9CisjZW5kaWYKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRfZmlsZV9zcmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFNwbGl0RmlsZVNyYyAqc3JjID0gR1NUX1NQTElUX0ZJTEVfU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjoKKyAgICAgIGdzdF9zcGxpdF9maWxlX3NyY19zZXRfbG9jYXRpb24gKHNyYywgZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwbGl0X2ZpbGVfc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTcGxpdEZpbGVTcmMgKnNyYyA9IEdTVF9TUExJVF9GSUxFX1NSQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTE9DQVRJT046CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNyYyk7CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzcmMtPmxvY2F0aW9uKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcmMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zcGxpdF9maWxlX3NyY19zdGFydCAoR3N0QmFzZVNyYyAqIGJhc2VzcmMpCit7CisgIEdzdFNwbGl0RmlsZVNyYyAqc3JjID0gR1NUX1NQTElUX0ZJTEVfU1JDIChiYXNlc3JjKTsKKyAgR0NhbmNlbGxhYmxlICpjYW5jZWw7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworICBndWludDY0IG9mZnNldDsKKyAgR0Vycm9yICplcnIgPSBOVUxMOworICBnY2hhciAqYmFzZW5hbWUgPSBOVUxMOworICBnY2hhciAqZGlybmFtZSA9IE5VTEw7CisgIGdjaGFyICoqZmlsZXM7CisgIGd1aW50IGk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworICBpZiAoc3JjLT5sb2NhdGlvbiAhPSBOVUxMICYmIHNyYy0+bG9jYXRpb25bMF0gIT0gJ1wwJykgeworICAgIGJhc2VuYW1lID0gZ19wYXRoX2dldF9iYXNlbmFtZSAoc3JjLT5sb2NhdGlvbik7CisgICAgZGlybmFtZSA9IGdfcGF0aF9nZXRfZGlybmFtZSAoc3JjLT5sb2NhdGlvbik7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisKKyAgZmlsZXMgPSBnc3Rfc3BsaXRfdXRpbF9maW5kX2ZpbGVzIChkaXJuYW1lLCBiYXNlbmFtZSwgJmVycik7CisKKyAgaWYgKGZpbGVzID09IE5VTEwgfHwgKmZpbGVzID09IE5VTEwpCisgICAgZ290byBub19maWxlczsKKworICBzcmMtPm51bV9wYXJ0cyA9IGdfc3Rydl9sZW5ndGggKGZpbGVzKTsKKyAgc3JjLT5wYXJ0cyA9IGdfbmV3MCAoR3N0RmlsZVBhcnQsIHNyYy0+bnVtX3BhcnRzKTsKKworICBjYW5jZWwgPSBzcmMtPmNhbmNlbGxhYmxlOworCisgIG9mZnNldCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBzcmMtPm51bV9wYXJ0czsgKytpKSB7CisgICAgR0ZpbGVJbnB1dFN0cmVhbSAqc3RyZWFtOworICAgIEdGaWxlSW5mbyAqaW5mbzsKKyAgICBnb2Zmc2V0IHNpemU7CisgICAgR0ZpbGUgKmZpbGU7CisKKyAgICBmaWxlID0gZ19maWxlX25ld19mb3JfcGF0aCAoZmlsZXNbaV0pOworICAgIHN0cmVhbSA9IGdfZmlsZV9yZWFkIChmaWxlLCBjYW5jZWwsICZlcnIpOworICAgIGdfb2JqZWN0X3VucmVmIChmaWxlKTsKKworICAgIGlmIChlcnIgIT0gTlVMTCkKKyAgICAgIGdvdG8gb3Blbl9yZWFkX2Vycm9yOworCisgICAgaW5mbyA9IGdfZmlsZV9pbnB1dF9zdHJlYW1fcXVlcnlfaW5mbyAoc3RyZWFtLCAic3RhbmRhcmQ6OioiLCBOVUxMLCAmZXJyKTsKKyAgICBpZiAoZXJyICE9IE5VTEwpIHsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzdHJlYW0pOworICAgICAgZ290byBxdWVyeV9pbmZvX2Vycm9yOworICAgIH0KKworICAgIHNpemUgPSBnX2ZpbGVfaW5mb19nZXRfc2l6ZSAoaW5mbyk7CisgICAgZ19vYmplY3RfdW5yZWYgKGluZm8pOworCisgICAgc3JjLT5wYXJ0c1tpXS5zdHJlYW0gPSBzdHJlYW07CisgICAgc3JjLT5wYXJ0c1tpXS5wYXRoID0gZ19zdHJkdXAgKGZpbGVzW2ldKTsKKyAgICBzcmMtPnBhcnRzW2ldLnN0YXJ0ID0gb2Zmc2V0OworICAgIHNyYy0+cGFydHNbaV0uc3RvcCA9IG9mZnNldCArIHNpemUgLSAxOworCisgICAgR1NUX0RFQlVHICgiWyUwMTAiIEdfR1VJTlQ2NF9GT1JNQVQgIi0lMDEwIiBHX0dVSU5UNjRfRk9STUFUICJdICVzIiwKKyAgICAgICAgc3JjLT5wYXJ0c1tpXS5zdGFydCwgc3JjLT5wYXJ0c1tpXS5zdG9wLCBzcmMtPnBhcnRzW2ldLnBhdGgpOworCisgICAgb2Zmc2V0ICs9IHNpemU7CisgIH0KKworICBHU1RfSU5GTyAoIlN1Y2Nlc3NmdWxseSBvcGVuZWQgJXUgZmlsZSBwYXJ0cyBmb3IgcmVhZGluZyIsIHNyYy0+bnVtX3BhcnRzKTsKKworICBzcmMtPmN1cl9wYXJ0ID0gMDsKKworICBzcmMtPmNhbmNlbGxhYmxlID0gZ19jYW5jZWxsYWJsZV9uZXcgKCk7CisKKyAgcmV0ID0gVFJVRTsKKworZG9uZToKKyAgaWYgKGVyciAhPSBOVUxMKQorICAgIGdfZXJyb3JfZnJlZSAoZXJyKTsKKyAgZ19zdHJmcmVldiAoZmlsZXMpOworICBnX2ZyZWUgKGJhc2VuYW1lKTsKKyAgZ19mcmVlIChkaXJuYW1lKTsKKyAgcmV0dXJuIHJldDsKKworLyogRVJST1JTICovCitub19maWxlczoKKyAgeworICAgIGlmIChlcnItPmNvZGUgPT0gR19JT19FUlJPUl9DQU5DRUxMRUQpCisgICAgICBnb3RvIGNhbmNlbGxlZDsKKworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBPUEVOX1JFQUQsICgiJXMiLCBlcnItPm1lc3NhZ2UpLAorICAgICAgICAoIkZhaWxlZCB0byBmaW5kIGZpbGVzIGluICclcycgZm9yIHBhdHRlcm4gJyVzJyIsCisgICAgICAgICAgICBHU1RfU1RSX05VTEwgKGRpcm5hbWUpLCBHU1RfU1RSX05VTEwgKGJhc2VuYW1lKSkpOworICAgIGdvdG8gZG9uZTsKKyAgfQorb3Blbl9yZWFkX2Vycm9yOgorICB7CisgICAgaWYgKGVyci0+Y29kZSA9PSBHX0lPX0VSUk9SX0NBTkNFTExFRCkKKyAgICAgIGdvdG8gY2FuY2VsbGVkOworCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwgKCIlcyIsIGVyci0+bWVzc2FnZSksCisgICAgICAgICgiRmFpbGVkIHRvIG9wZW4gZmlsZSAnJXMnIGZvciByZWFkaW5nIiwgZmlsZXNbaV0pKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3F1ZXJ5X2luZm9fZXJyb3I6CisgIHsKKyAgICBpZiAoZXJyLT5jb2RlID09IEdfSU9fRVJST1JfQ0FOQ0VMTEVEKQorICAgICAgZ290byBjYW5jZWxsZWQ7CisKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgT1BFTl9SRUFELCAoIiVzIiwgZXJyLT5tZXNzYWdlKSwKKyAgICAgICAgKCJGYWlsZWQgdG8gcXVlcnkgaW5mbyBmb3IgZmlsZSAnJXMnIiwgZmlsZXNbaV0pKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK2NhbmNlbGxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIkkvTyBvcGVyYXRpb24gY2FuY2VsbGVkIGZyb20gYW5vdGhlciB0aHJlYWQiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BsaXRfZmlsZV9zcmNfc3RvcCAoR3N0QmFzZVNyYyAqIGJhc2VzcmMpCit7CisgIEdzdFNwbGl0RmlsZVNyYyAqc3JjID0gR1NUX1NQTElUX0ZJTEVfU1JDIChiYXNlc3JjKTsKKyAgZ3VpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgc3JjLT5udW1fcGFydHM7ICsraSkgeworICAgIGlmIChzcmMtPnBhcnRzW2ldLnN0cmVhbSAhPSBOVUxMKQorICAgICAgZ19vYmplY3RfdW5yZWYgKHNyYy0+cGFydHNbaV0uc3RyZWFtKTsKKyAgICBnX2ZyZWUgKHNyYy0+cGFydHNbaV0ucGF0aCk7CisgIH0KKyAgZ19mcmVlIChzcmMtPnBhcnRzKTsKKyAgc3JjLT5wYXJ0cyA9IE5VTEw7CisgIHNyYy0+bnVtX3BhcnRzID0gMDsKKworICBnX29iamVjdF91bnJlZiAoc3JjLT5jYW5jZWxsYWJsZSk7CisgIHNyYy0+Y2FuY2VsbGFibGUgPSBOVUxMOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2ludAorZ3N0X3NwbGl0X2ZpbGVfc3JjX3BhcnRfc2VhcmNoIChHc3RGaWxlUGFydCAqIHBhcnQsIGd1aW50NjQgKiBvZmZzZXQsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBpZiAoKm9mZnNldCA+IHBhcnQtPnN0b3ApCisgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgIC8qIFRoZSB0YXJnZXQgaXMgYWZ0ZXIgdGhpcyBwYXJ0ICovCisgIGVsc2UgaWYgKCpvZmZzZXQgPCBwYXJ0LT5zdGFydCkKKyAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAgICAgLyogVGhlIHRhcmdldCBpcyBiZWZvcmUgdGhpcyBwYXJ0ICovCisgIGVsc2UKKyAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgdGFyZ2V0IHBhcnQgKi8KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BsaXRfZmlsZV9zcmNfZmluZF9wYXJ0X2Zvcl9vZmZzZXQgKEdzdFNwbGl0RmlsZVNyYyAqIHNyYywgZ3VpbnQ2NCBvZmZzZXQsCisgICAgZ3VpbnQgKiBwYXJ0X251bWJlcikKK3sKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKyAgR3N0RmlsZVBhcnQgKnBhcnQ7CisKKyAgcGFydCA9CisgICAgICBnc3RfdXRpbF9hcnJheV9iaW5hcnlfc2VhcmNoIChzcmMtPnBhcnRzLCBzcmMtPm51bV9wYXJ0cywKKyAgICAgIHNpemVvZiAoR3N0RmlsZVBhcnQpLAorICAgICAgKEdDb21wYXJlRGF0YUZ1bmMpIGdzdF9zcGxpdF9maWxlX3NyY19wYXJ0X3NlYXJjaCwKKyAgICAgIEdTVF9TRUFSQ0hfTU9ERV9BRlRFUiwgJm9mZnNldCwgTlVMTCk7CisKKyAgaWYgKHBhcnQpCisgICAgKnBhcnRfbnVtYmVyID0gcGFydCAtIHNyYy0+cGFydHM7CisgIGVsc2UKKyAgICByZXMgPSBGQUxTRTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NwbGl0X2ZpbGVfc3JjX2NyZWF0ZSAoR3N0QmFzZVNyYyAqIGJhc2VzcmMsIGd1aW50NjQgb2Zmc2V0LCBndWludCBzaXplLAorICAgIEdzdEJ1ZmZlciAqKiBidWZmZXIpCit7CisgIEdzdFNwbGl0RmlsZVNyYyAqc3JjID0gR1NUX1NQTElUX0ZJTEVfU1JDIChiYXNlc3JjKTsKKyAgR3N0RmlsZVBhcnQgY3VyX3BhcnQ7CisgIEdJbnB1dFN0cmVhbSAqc3RyZWFtOworICBHQ2FuY2VsbGFibGUgKmNhbmNlbDsKKyAgR1NlZWthYmxlICpzZWVrYWJsZTsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgZ3VpbnQ2NCByZWFkX29mZnNldDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQgdG9fcmVhZDsKKworICBjdXJfcGFydCA9IHNyYy0+cGFydHNbc3JjLT5jdXJfcGFydF07CisgIGlmIChvZmZzZXQgPCBjdXJfcGFydC5zdGFydCB8fCBvZmZzZXQgPiBjdXJfcGFydC5zdG9wKSB7CisgICAgaWYgKCFnc3Rfc3BsaXRfZmlsZV9zcmNfZmluZF9wYXJ0X2Zvcl9vZmZzZXQgKHNyYywgb2Zmc2V0LCAmc3JjLT5jdXJfcGFydCkpCisgICAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworICAgIGN1cl9wYXJ0ID0gc3JjLT5wYXJ0c1tzcmMtPmN1cl9wYXJ0XTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICJjdXJyZW50IHBhcnQ6ICV1ICglIiBHX0dVSU5UNjRfRk9STUFUICIgLSAiCisgICAgICAiJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCAlcykiLCBzcmMtPmN1cl9wYXJ0LCBjdXJfcGFydC5zdGFydCwKKyAgICAgIGN1cl9wYXJ0LnN0b3AsIGN1cl9wYXJ0LnBhdGgpOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBzaXplLCBOVUxMKTsKKworICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSA9IG9mZnNldDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworCisgIGNhbmNlbCA9IHNyYy0+Y2FuY2VsbGFibGU7CisKKyAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgZ3VpbnQ2NCBieXRlc190b19lbmRfb2ZfcGFydDsKKyAgICBnc2l6ZSByZWFkID0gMDsKKworICAgIC8qIHdlIHdhbnQgdGhlIG9mZnNldCBpbnRvIHRoZSBmaWxlIHBhcnQgKi8KKyAgICByZWFkX29mZnNldCA9IG9mZnNldCAtIGN1cl9wYXJ0LnN0YXJ0OworCisgICAgR1NUX0xPRyAoIlJlYWRpbmcgcGFydCAlMDN1IGZyb20gb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiAoJXMpIiwKKyAgICAgICAgc3JjLT5jdXJfcGFydCwgcmVhZF9vZmZzZXQsIGN1cl9wYXJ0LnBhdGgpOworCisgICAgLyogRklYTUU6IG9ubHkgc2VlayB3aGVuIG5lZWRlZCAoaG9wZWZ1bGx5IGdpbyBpcyBzbWFydCkgKi8KKyAgICBzZWVrYWJsZSA9IEdfU0VFS0FCTEUgKGN1cl9wYXJ0LnN0cmVhbSk7CisgICAgaWYgKCFnX3NlZWthYmxlX3NlZWsgKHNlZWthYmxlLCByZWFkX29mZnNldCwgR19TRUVLX1NFVCwgY2FuY2VsLCAmZXJyKSkKKyAgICAgIGdvdG8gc2Vla19mYWlsZWQ7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAibm93OiAlIiBHX0dVSU5UNjRfRk9STUFULCBnX3NlZWthYmxlX3RlbGwgKHNlZWthYmxlKSk7CisKKyAgICBieXRlc190b19lbmRfb2ZfcGFydCA9IChjdXJfcGFydC5zdG9wIC0gY3VyX3BhcnQuc3RhcnQpICsgMSAtIHJlYWRfb2Zmc2V0OworICAgIHRvX3JlYWQgPSBNSU4gKHNpemUsIGJ5dGVzX3RvX2VuZF9vZl9wYXJ0KTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICJyZWFkaW5nICV1IGJ5dGVzIGZyb20gcGFydCAldSAoYnl0ZXMgdG8gZW5kIG9mICIKKyAgICAgICAgInBhcnQ6ICV1KSIsIHRvX3JlYWQsIHNyYy0+Y3VyX3BhcnQsIChndWludCkgYnl0ZXNfdG9fZW5kX29mX3BhcnQpOworCisgICAgc3RyZWFtID0gR19JTlBVVF9TVFJFQU0gKGN1cl9wYXJ0LnN0cmVhbSk7CisKKyAgICAvKiBOQjogd2Ugd29uJ3QgdHJ5IHRvIHJlYWQgYmV5b25kIEVPRiAqLworICAgIGlmICghZ19pbnB1dF9zdHJlYW1fcmVhZF9hbGwgKHN0cmVhbSwgZGF0YSwgdG9fcmVhZCwgJnJlYWQsIGNhbmNlbCwgJmVycikpCisgICAgICBnb3RvIHJlYWRfZmFpbGVkOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgInJlYWQgJXUgYnl0ZXMiLCAoZ3VpbnQpIHJlYWQpOworCisgICAgZGF0YSArPSByZWFkOworICAgIHNpemUgLT0gcmVhZDsKKyAgICBvZmZzZXQgKz0gcmVhZDsKKworICAgIC8qIGFyZSB3ZSBkb25lPyAqLworICAgIGlmIChzaXplID09IDApCisgICAgICBicmVhazsKKworICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIldSBieXRlcyBsZWZ0IHRvIHJlYWQgZm9yIHRoaXMgY2h1bmsiLCBzaXplKTsKKworICAgIC8qIGNvcm5lciBjYXNlLCB0aGlzIHNob3VsZCBuZXZlciByZWFsbHkgaGFwcGVuIChhc3N1bWluZyBiYXNlc3JjIGNsaXBzCisgICAgICogcmVxdWVzdHMgYmV5b25kIHRoZSBmaWxlIHNpemUpICovCisgICAgaWYgKHJlYWQgPCB0b19yZWFkKSB7CisgICAgICBpZiAoc3JjLT5jdXJfcGFydCA9PSBzcmMtPm51bV9wYXJ0cyAtIDEpIHsKKyAgICAgICAgLyogbGFzdCBmaWxlIHBhcnQsIHN0b3AgcmVhZGluZyBhbmQgdHJ1bmNhdGUgYnVmZmVyICovCisgICAgICAgIGdzdF9idWZmZXJfc2V0X3NpemUgKGJ1Ziwgb2Zmc2V0IC0gR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikpOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdvdG8gZmlsZV9wYXJ0X2NoYW5nZWQ7CisgICAgICB9CisgICAgfQorCisgICAgKytzcmMtPmN1cl9wYXJ0OworICAgIGN1cl9wYXJ0ID0gc3JjLT5wYXJ0c1tzcmMtPmN1cl9wYXJ0XTsKKyAgfQorCisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmKSA9IG9mZnNldDsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgICpidWZmZXIgPSBidWY7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICJyZWFkICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgaW50byBidWYgJXAiLAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSwgYnVmKTsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCisvKiBFUlJPUlMgKi8KK3NlZWtfZmFpbGVkOgorICB7CisgICAgaWYgKGVyci0+Y29kZSA9PSBHX0lPX0VSUk9SX0NBTkNFTExFRCkKKyAgICAgIGdvdG8gY2FuY2VsbGVkOworCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFNFRUssIChOVUxMKSwKKyAgICAgICAgKCJTZWVrIHRvICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBpbiAlcyBmYWlsZWQiLCByZWFkX29mZnNldCwKKyAgICAgICAgICAgIGN1cl9wYXJ0LnBhdGgpKTsKKyAgICBnX2Vycm9yX2ZyZWUgKGVycik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3JlYWRfZmFpbGVkOgorICB7CisgICAgaWYgKGVyci0+Y29kZSA9PSBHX0lPX0VSUk9SX0NBTkNFTExFRCkKKyAgICAgIGdvdG8gY2FuY2VsbGVkOworCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFJFQUQsICgiJXMiLCBlcnItPm1lc3NhZ2UpLAorICAgICAgICAoIlJlYWQgZnJvbSAlIiBHX0dVSU5UNjRfRk9STUFUICIgaW4gJXMgZmFpbGVkIiwgcmVhZF9vZmZzZXQsCisgICAgICAgICAgICBjdXJfcGFydC5wYXRoKSk7CisgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CitmaWxlX3BhcnRfY2hhbmdlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBSRUFELAorICAgICAgICAoIlJlYWQgZXJyb3Igd2hpbGUgcmVhZGluZyBmaWxlIHBhcnQgJXMiLCBjdXJfcGFydC5wYXRoKSwKKyAgICAgICAgKCJTaG9ydCByZWFkIGluIGZpbGUgcGFydCwgZmlsZSBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlIHN0YXJ0IikpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CitjYW5jZWxsZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJJL08gb3BlcmF0aW9uIGNhbmNlbGxlZCBmcm9tIGFub3RoZXIgdGhyZWFkIik7CisgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICB9Cit9CisKK3N0YXRpYyBHc3RVUklUeXBlCitnc3Rfc3BsaXRfZmlsZV9zcmNfdXJpX2dldF90eXBlIChHVHlwZSB0eXBlKQoreworICByZXR1cm4gR1NUX1VSSV9TUkM7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqY29uc3QgKgorZ3N0X3NwbGl0X2ZpbGVfc3JjX3VyaV9nZXRfcHJvdG9jb2xzIChHVHlwZSB0eXBlKQoreworICBzdGF0aWMgY29uc3QgZ2NoYXIgKnByb3RvY29sc1tdID0geyAic3BsaXRmaWxlIiwgTlVMTCB9OworCisgIHJldHVybiAoY29uc3QgZ2NoYXIgKiBjb25zdCAqKSBwcm90b2NvbHM7Cit9CisKK3N0YXRpYyBnY2hhciAqCitnc3Rfc3BsaXRfZmlsZV9zcmNfdXJpX2dldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyKQoreworICBHc3RTcGxpdEZpbGVTcmMgKnNyYyA9IEdTVF9TUExJVF9GSUxFX1NSQyAoaGFuZGxlcik7CisgIGdjaGFyICpyZXQ7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworICBpZiAoc3JjLT5sb2NhdGlvbiAhPSBOVUxMKQorICAgIHJldCA9IGdfc3RyZHVwX3ByaW50ZiAoInNwbGl0ZmlsZTovLyVzIiwgc3JjLT5sb2NhdGlvbik7CisgIGVsc2UKKyAgICByZXQgPSBOVUxMOworICBHU1RfT0JKRUNUX1VOTE9DSyAoc3JjKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zcGxpdF9maWxlX3NyY191cmlfc2V0X3VyaSAoR3N0VVJJSGFuZGxlciAqIGhhbmRsZXIsIGNvbnN0IGdjaGFyICogdXJpLAorICAgIEdFcnJvciAqKiBlcnJvcikKK3sKKyAgR3N0U3BsaXRGaWxlU3JjICpzcmMgPSBHU1RfU1BMSVRfRklMRV9TUkMgKGhhbmRsZXIpOworCisgIGdzdF9zcGxpdF9maWxlX3NyY19zZXRfbG9jYXRpb24gKHNyYywgdXJpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGxpdF9maWxlX3NyY191cmlfaGFuZGxlcl9pbml0IChncG9pbnRlciBnX2lmYWNlLCBncG9pbnRlciBpZmFjZV9kYXRhKQoreworICBHc3RVUklIYW5kbGVySW50ZXJmYWNlICppZmFjZSA9IChHc3RVUklIYW5kbGVySW50ZXJmYWNlICopIGdfaWZhY2U7CisKKyAgaWZhY2UtPmdldF90eXBlID0gZ3N0X3NwbGl0X2ZpbGVfc3JjX3VyaV9nZXRfdHlwZTsKKyAgaWZhY2UtPmdldF9wcm90b2NvbHMgPSBnc3Rfc3BsaXRfZmlsZV9zcmNfdXJpX2dldF9wcm90b2NvbHM7CisgIGlmYWNlLT5nZXRfdXJpID0gZ3N0X3NwbGl0X2ZpbGVfc3JjX3VyaV9nZXRfdXJpOworICBpZmFjZS0+c2V0X3VyaSA9IGdzdF9zcGxpdF9maWxlX3NyY191cmlfc2V0X3VyaTsKK30KZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRmaWxlc3JjLmggYi9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYWJkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0ZmlsZXNyYy5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIEdTdHJlYW1lciBTcGxpdCBGaWxlIFNvdXJjZQorICogQ29weXJpZ2h0IChDKSAyMDExIENvbGxhYm9yYSBMdGQuIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBfX0dTVF9TUExJVF9GSUxFX1NSQ19IX18KKyNkZWZpbmUgX19HU1RfU1BMSVRfRklMRV9TUkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXNyYy5oPgorI2luY2x1ZGUgPGdpby9naW8uaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1NQTElUX0ZJTEVfU1JDIFwKKyAgKGdzdF9zcGxpdF9maWxlX3NyY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfU1BMSVRfRklMRV9TUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9TUExJVF9GSUxFX1NSQyxHc3RTcGxpdEZpbGVTcmMpKQorI2RlZmluZSBHU1RfU1BMSVRfRklMRV9TUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfU1BMSVRfRklMRV9TUkMsR3N0U3BsaXRGaWxlU3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfU1BMSVRfRklMRV9TUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9TUExJVF9GSUxFX1NSQykpCisjZGVmaW5lIEdTVF9JU19TUExJVF9GSUxFX1NSQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9TUExJVF9GSUxFX1NSQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RGaWxlUGFydCBHc3RGaWxlUGFydDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RTcGxpdEZpbGVTcmMgR3N0U3BsaXRGaWxlU3JjOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNwbGl0RmlsZVNyY0NsYXNzIEdzdFNwbGl0RmlsZVNyY0NsYXNzOworCitzdHJ1Y3QgX0dzdEZpbGVQYXJ0Cit7CisgIEdGaWxlSW5wdXRTdHJlYW0gICpzdHJlYW07CisgIGdjaGFyICAgICAgICAgICAgICpwYXRoOworICBndWludDY0ICAgICAgICAgICAgc3RhcnQ7IC8qIGluY2x1c2l2ZSAqLworICBndWludDY0ICAgICAgICAgICAgc3RvcDsgIC8qIGluY2x1c2l2ZSAqLworfTsKKworc3RydWN0IF9Hc3RTcGxpdEZpbGVTcmMKK3sKKyAgR3N0QmFzZVNyYyAgIHBhcmVudDsKKworICBnY2hhciAgICAgICAqbG9jYXRpb247ICAvKiBPQkpFQ1RfTE9DSyAqLworCisgIEdzdEZpbGVQYXJ0ICpwYXJ0czsKKyAgZ3VpbnQgICAgICAgIG51bV9wYXJ0czsKKworICBndWludCAgICAgICAgY3VyX3BhcnQ7ICAvKiBwYXJ0IHVzZWQgbGFzdCAobGlrZWx5IGFsc28gdG8gYmUgdXNlZCBuZXh0KSAqLworCisgIEdDYW5jZWxsYWJsZSAqY2FuY2VsbGFibGU7IC8qIHNvIHdlIGNhbiBpbnRlcnJ1cHQgYmxvY2tpbmcgb3BlcmF0aW9ucyAqLworfTsKKworc3RydWN0IF9Hc3RTcGxpdEZpbGVTcmNDbGFzcworeworICBHc3RCYXNlU3JjQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3NwbGl0X2ZpbGVfc3JjX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1NQTElUX0ZJTEVfU1JDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuYyBiL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhwYXJ0cmVhZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxNzFjYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhwYXJ0cmVhZGVyLmMKQEAgLTAsMCArMSwxMzcwIEBACisvKiBHU3RyZWFtZXIgU3BsaXQgRGVtdXhlciBiaW4gdGhhdCByZWNvbWJpbmVzIGZpbGVzIGNyZWF0ZWQgYnkKKyAqIHRoZSBzcGxpdG11eHNpbmsgZWxlbWVudC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDE0PiBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnc3RzcGxpdG11eHNyYy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChzcGxpdG11eF9wYXJ0X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHNwbGl0bXV4X3BhcnRfZGVidWcKKworI2RlZmluZSBTUExJVE1VWF9QQVJUX0xPQ0socCkgZ19tdXRleF9sb2NrKCYocCktPmxvY2spCisjZGVmaW5lIFNQTElUTVVYX1BBUlRfVU5MT0NLKHApIGdfbXV0ZXhfdW5sb2NrKCYocCktPmxvY2spCisjZGVmaW5lIFNQTElUTVVYX1BBUlRfV0FJVChwKSBnX2NvbmRfd2FpdCAoJihwKS0+aW5hY3RpdmVfY29uZCwgJihwKS0+bG9jaykKKyNkZWZpbmUgU1BMSVRNVVhfUEFSVF9CUk9BRENBU1QocCkgZ19jb25kX2Jyb2FkY2FzdCAoJihwKS0+aW5hY3RpdmVfY29uZCkKKworI2RlZmluZSBTUExJVE1VWF9QQVJUX1RZUEVfTE9DSyhwKSBnX211dGV4X2xvY2soJihwKS0+dHlwZV9sb2NrKQorI2RlZmluZSBTUExJVE1VWF9QQVJUX1RZUEVfVU5MT0NLKHApIGdfbXV0ZXhfdW5sb2NrKCYocCktPnR5cGVfbG9jaykKKworZW51bQoreworICBTSUdOQUxfUFJFUEFSRUQsCisgIExBU1RfU0lHTkFMCit9OworCitzdGF0aWMgZ3VpbnQgcGFydF9yZWFkZXJfc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNwbGl0TXV4UGFydFBhZAoreworICBHc3RQYWQgcGFyZW50OworCisgIC8qIFJlYWRlciB3ZSBiZWxvbmcgdG8gKi8KKyAgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXI7CisgIC8qIE91dHB1dCBzcGxpdG11eHNyYyBzb3VyY2UgcGFkICovCisgIEdzdFBhZCAqdGFyZ2V0OworCisgIEdzdERhdGFRdWV1ZSAqcXVldWU7CisKKyAgZ2Jvb2xlYW4gaXNfZW9zOworICBnYm9vbGVhbiBmbHVzaGluZzsKKyAgZ2Jvb2xlYW4gc2Vlbl9idWZmZXI7CisKKyAgZ2Jvb2xlYW4gaXNfc3BhcnNlOworICBHc3RDbG9ja1RpbWUgbWF4X3RzOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgR3N0U2VnbWVudCBvcmlnX3NlZ21lbnQ7CisgIEdzdENsb2NrVGltZSBpbml0aWFsX3RzX29mZnNldDsKK30gR3N0U3BsaXRNdXhQYXJ0UGFkOworCit0eXBlZGVmIHN0cnVjdCBfR3N0U3BsaXRNdXhQYXJ0UGFkQ2xhc3MKK3sKKyAgR3N0UGFkQ2xhc3MgcGFyZW50OworfSBHc3RTcGxpdE11eFBhcnRQYWRDbGFzczsKKworc3RhdGljIEdUeXBlIGdzdF9zcGxpdG11eF9wYXJ0X3BhZF9nZXRfdHlwZSAodm9pZCk7CisjZGVmaW5lIFNQTElUTVVYX1RZUEVfUEFSVF9QQUQgZ3N0X3NwbGl0bXV4X3BhcnRfcGFkX2dldF90eXBlKCkKKyNkZWZpbmUgU1BMSVRNVVhfUEFSVF9QQURfQ0FTVChwKSAoKEdzdFNwbGl0TXV4UGFydFBhZCAqKShwKSkKKworc3RhdGljIHZvaWQgc3BsaXRtdXhfcGFydF9wYWRfY29uc3RydWN0ZWQgKEdPYmplY3QgKiBwYWQpOworc3RhdGljIHZvaWQgc3BsaXRtdXhfcGFydF9wYWRfZmluYWxpemUgKEdPYmplY3QgKiBwYWQpOworc3RhdGljIHZvaWQgaGFuZGxlX2J1ZmZlcl9tZWFzdXJpbmcgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlciwKKyAgICBHc3RTcGxpdE11eFBhcnRQYWQgKiBwYXJ0X3BhZCwgR3N0QnVmZmVyICogYnVmKTsKKworc3RhdGljIGdib29sZWFuIHNwbGl0bXV4X2RhdGFfcXVldWVfaXNfZnVsbF9jYiAoR3N0RGF0YVF1ZXVlICogcXVldWUsCisgICAgZ3VpbnQgdmlzaWJsZSwgZ3VpbnQgYnl0ZXMsIGd1aW50NjQgdGltZSwgZ3BvaW50ZXIgY2hlY2tkYXRhKTsKK3N0YXRpYyB2b2lkIHR5cGVfZm91bmQgKEdzdEVsZW1lbnQgKiB0eXBlZmluZCwgZ3VpbnQgcHJvYmFiaWxpdHksCisgICAgR3N0Q2FwcyAqIGNhcHMsIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlcik7CitzdGF0aWMgdm9pZCBjaGVja19pZl9wYWRzX2NvbGxlY3RlZCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcmVhZGVyKTsKKworLyogQ2FsbGVkIHdpdGggcmVhZGVyIGxvY2sgaGVsZCAqLworc3RhdGljIGdib29sZWFuCitoYXZlX2VtcHR5X3F1ZXVlIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIpCit7CisgIEdMaXN0ICpjdXI7CisKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHJlYWRlci0+cGFkcyk7IGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgIEdzdFNwbGl0TXV4UGFydFBhZCAqcGFydF9wYWQgPSBTUExJVE1VWF9QQVJUX1BBRF9DQVNUIChjdXItPmRhdGEpOworICAgIGlmIChwYXJ0X3BhZC0+aXNfZW9zKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocGFydF9wYWQsICJQYWQgaXMgRU9TIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgaWYgKGdzdF9kYXRhX3F1ZXVlX2lzX2VtcHR5IChwYXJ0X3BhZC0+cXVldWUpKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocGFydF9wYWQsICJRdWV1ZSBpcyBlbXB0eSIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiBDYWxsZWQgd2l0aCByZWFkZXIgbG9jayBoZWxkICovCitzdGF0aWMgZ2Jvb2xlYW4KK2Jsb2NrX3VudGlsX2Nhbl9wdXNoIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIpCit7CisgIHdoaWxlIChyZWFkZXItPnJ1bm5pbmcpIHsKKyAgICBpZiAocmVhZGVyLT5mbHVzaGluZykKKyAgICAgIGdvdG8gb3V0OworICAgIGlmIChyZWFkZXItPmFjdGl2ZSAmJiBoYXZlX2VtcHR5X3F1ZXVlIChyZWFkZXIpKQorICAgICAgZ290byBvdXQ7CisKKyAgICBHU1RfTE9HX09CSkVDVCAocmVhZGVyLAorICAgICAgICAiV2FpdGluZyBmb3IgYWN0aXZhdGlvbiBvciBlbXB0eSBxdWV1ZSBvbiByZWFkZXIgJXMiLCByZWFkZXItPnBhdGgpOworICAgIFNQTElUTVVYX1BBUlRfV0FJVCAocmVhZGVyKTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChyZWFkZXIsICJEb25lIHdhaXRpbmcgb24gcmVhZGVyICVzIGFjdGl2ZSAlZCBmbHVzaGluZyAlZCIsCisgICAgICByZWFkZXItPnBhdGgsIHJlYWRlci0+YWN0aXZlLCByZWFkZXItPmZsdXNoaW5nKTsKK291dDoKKyAgcmV0dXJuIHJlYWRlci0+YWN0aXZlICYmICFyZWFkZXItPmZsdXNoaW5nOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX2J1ZmZlcl9tZWFzdXJpbmcgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlciwKKyAgICBHc3RTcGxpdE11eFBhcnRQYWQgKiBwYXJ0X3BhZCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RDbG9ja1RpbWVEaWZmIHRzID0gR1NUX0NMT0NLX1NUSU1FX05PTkU7CisgIEdzdENsb2NrVGltZURpZmYgb2Zmc2V0OworCisgIGlmIChyZWFkZXItPnByZXBfc3RhdGUgPT0gUEFSVF9TVEFURV9QUkVQQVJJTkdfQ09MTEVDVF9TVFJFQU1TICYmCisgICAgICAhcGFydF9wYWQtPnNlZW5fYnVmZmVyKSB7CisgICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYnVmZmVyIG9uIHRoZSBwYWQgaW4gdGhlIGNvbGxlY3Rfc3RyZWFtcyBzdGF0ZSwKKyAgICAgKiB0aGVuIGNhbGN1bGF0ZSBpbml0YWwgb2Zmc2V0IGJhc2VkIG9uIHJ1bm5pbmcgdGltZSBvZiB0aGlzIHNlZ21lbnQgKi8KKyAgICBwYXJ0X3BhZC0+aW5pdGlhbF90c19vZmZzZXQgPQorICAgICAgICBwYXJ0X3BhZC0+b3JpZ19zZWdtZW50LnN0YXJ0ICsgcGFydF9wYWQtPm9yaWdfc2VnbWVudC5iYXNlIC0KKyAgICAgICAgcGFydF9wYWQtPm9yaWdfc2VnbWVudC50aW1lOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJlYWRlciwKKyAgICAgICAgIkluaXRpYWwgVFMgb2Zmc2V0IGZvciBwYWQgJSIgR1NUX1BUUl9GT1JNQVQgIiBub3cgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBwYXJ0X3BhZCwgR1NUX1RJTUVfQVJHUyAocGFydF9wYWQtPmluaXRpYWxfdHNfb2Zmc2V0KSk7CisgIH0KKyAgcGFydF9wYWQtPnNlZW5fYnVmZmVyID0gVFJVRTsKKworICAvKiBBZGp1c3QgYnVmZmVyIHRpbWVzdGFtcHMgKi8KKyAgb2Zmc2V0ID0gcmVhZGVyLT5zdGFydF9vZmZzZXQgKyBwYXJ0X3BhZC0+c2VnbWVudC5iYXNlOworICBvZmZzZXQgLT0gcGFydF9wYWQtPmluaXRpYWxfdHNfb2Zmc2V0OworCisgIC8qIFVwZGF0ZSB0aGUgc3RvcmVkIG1heCBkdXJhdGlvbiBvbiB0aGUgcGFkLAorICAgKiBhbHdheXMgcHJlZmVycmluZyBtYWtpbmcgRFRTIGNvbnRpZ3VvdXMKKyAgICogd2hlcmUgcG9zc2libGUgKi8KKyAgaWYgKEdTVF9CVUZGRVJfRFRTX0lTX1ZBTElEIChidWYpKQorICAgIHRzID0gR1NUX0JVRkZFUl9EVFMgKGJ1ZikgKyBvZmZzZXQ7CisgIGVsc2UgaWYgKEdTVF9CVUZGRVJfUFRTX0lTX1ZBTElEIChidWYpKQorICAgIHRzID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZikgKyBvZmZzZXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocmVhZGVyLCAiUGFkICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAiIGluY29taW5nIFBUUyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIgRFRTICUiIEdTVF9USU1FX0ZPUk1BVCAiIG9mZnNldCBieSAlIiBHU1RfU1RJTUVfRk9STUFUCisgICAgICAiIHRvICUiIEdTVF9TVElNRV9GT1JNQVQsIHBhcnRfcGFkLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVFMgKGJ1ZikpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9QVFMgKGJ1ZikpLAorICAgICAgR1NUX1NUSU1FX0FSR1MgKG9mZnNldCksIEdTVF9TVElNRV9BUkdTICh0cykpOworCisgIGlmIChHU1RfQ0xPQ0tfU1RJTUVfSVNfVkFMSUQgKHRzKSkgeworICAgIGlmIChHU1RfQlVGRkVSX0RVUkFUSU9OX0lTX1ZBTElEIChidWYpKQorICAgICAgdHMgKz0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKTsKKworICAgIGlmIChHU1RfQ0xPQ0tfU1RJTUVfSVNfVkFMSUQgKHRzKQorICAgICAgICAmJiB0cyA+IChHc3RDbG9ja1RpbWVEaWZmKSBwYXJ0X3BhZC0+bWF4X3RzKSB7CisgICAgICBwYXJ0X3BhZC0+bWF4X3RzID0gdHM7CisgICAgICBHU1RfTE9HX09CSkVDVCAocmVhZGVyLAorICAgICAgICAgICJwYWQgJSIgR1NUX1BUUl9GT1JNQVQgIiBtYXggVFMgbm93ICUiIEdTVF9USU1FX0ZPUk1BVCwgcGFydF9wYWQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocGFydF9wYWQtPm1heF90cykpOworICAgIH0KKyAgfQorICAvKiBJcyBpdCB0aW1lIHRvIG1vdmUgdG8gbWVhc3VyaW5nIHN0YXRlIHlldD8gKi8KKyAgY2hlY2tfaWZfcGFkc19jb2xsZWN0ZWQgKHJlYWRlcik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorc3BsaXRtdXhfZGF0YV9xdWV1ZV9pc19mdWxsX2NiIChHc3REYXRhUXVldWUgKiBxdWV1ZSwKKyAgICBndWludCB2aXNpYmxlLCBndWludCBieXRlcywgZ3VpbnQ2NCB0aW1lLCBncG9pbnRlciBjaGVja2RhdGEpCit7CisgIC8qIEFyYml0cmFyeSBzYWZldHkgbGltaXQuIElmIHdlIGhpdCBpdCwgcGxheWJhY2sgaXMgbGlrZWx5IHRvIHN0YWxsICovCisgIGlmICh0aW1lID4gMjAgKiBHU1RfU0VDT05EKQorICAgIHJldHVybiBUUlVFOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitzcGxpdG11eF9wYXJ0X2ZyZWVfcXVldWVfaXRlbSAoR3N0RGF0YVF1ZXVlSXRlbSAqIGl0ZW0pCit7CisgIGdzdF9taW5pX29iamVjdF91bnJlZiAoaXRlbS0+b2JqZWN0KTsKKyAgZ19zbGljZV9mcmVlIChHc3REYXRhUXVldWVJdGVtLCBpdGVtKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK3NwbGl0bXV4X3BhcnRfcGFkX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RTcGxpdE11eFBhcnRQYWQgKnBhcnRfcGFkID0gU1BMSVRNVVhfUEFSVF9QQURfQ0FTVCAocGFkKTsKKyAgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXIgPSBwYXJ0X3BhZC0+cmVhZGVyOworICBHc3REYXRhUXVldWVJdGVtICppdGVtOworICBHc3RDbG9ja1RpbWVEaWZmIG9mZnNldDsKKworICBHU1RfTE9HX09CSkVDVCAocmVhZGVyLCAiUGFkICUiIEdTVF9QVFJfRk9STUFUICIgJSIgR1NUX1BUUl9GT1JNQVQsIHBhZCwgYnVmKTsKKyAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworCisgIGlmIChyZWFkZXItPnByZXBfc3RhdGUgPT0gUEFSVF9TVEFURV9QUkVQQVJJTkdfQ09MTEVDVF9TVFJFQU1TIHx8CisgICAgICByZWFkZXItPnByZXBfc3RhdGUgPT0gUEFSVF9TVEFURV9QUkVQQVJJTkdfTUVBU1VSRV9TVFJFQU1TKSB7CisgICAgaGFuZGxlX2J1ZmZlcl9tZWFzdXJpbmcgKHJlYWRlciwgcGFydF9wYWQsIGJ1Zik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICBpZiAoIWJsb2NrX3VudGlsX2Nhbl9wdXNoIChyZWFkZXIpKSB7CisgICAgLyogRmx1c2hpbmcgKi8KKyAgICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBHU1RfRkxPV19GTFVTSElORzsKKyAgfQorCisgIC8qIEFkanVzdCBidWZmZXIgdGltZXN0YW1wcyAqLworICBvZmZzZXQgPSByZWFkZXItPnN0YXJ0X29mZnNldCArIHBhcnRfcGFkLT5zZWdtZW50LmJhc2U7CisgIG9mZnNldCAtPSBwYXJ0X3BhZC0+aW5pdGlhbF90c19vZmZzZXQ7CisKKyAgaWYgKEdTVF9CVUZGRVJfUFRTX0lTX1ZBTElEIChidWYpKQorICAgIEdTVF9CVUZGRVJfUFRTIChidWYpICs9IG9mZnNldDsKKyAgaWYgKEdTVF9CVUZGRVJfRFRTX0lTX1ZBTElEIChidWYpKQorICAgIEdTVF9CVUZGRVJfRFRTIChidWYpICs9IG9mZnNldDsKKworICAvKiBXZSBhcmUgYWN0aXZlLCBhbmQgb25lIHF1ZXVlIGlzIGVtcHR5LCBwbGFjZSB0aGlzIGJ1ZmZlciBpbgorICAgKiB0aGUgZGF0YXF1ZXVlICovCisgIEdTVF9MT0dfT0JKRUNUIChyZWFkZXIsICJFbnF1ZXVlaW5nIGJ1ZmZlciAlIiBHU1RfUFRSX0ZPUk1BVCwgYnVmKTsKKyAgaXRlbSA9IGdfc2xpY2VfbmV3IChHc3REYXRhUXVldWVJdGVtKTsKKyAgaXRlbS0+ZGVzdHJveSA9IChHRGVzdHJveU5vdGlmeSkgc3BsaXRtdXhfcGFydF9mcmVlX3F1ZXVlX2l0ZW07CisgIGl0ZW0tPm9iamVjdCA9IEdTVF9NSU5JX09CSkVDVCAoYnVmKTsKKyAgaXRlbS0+c2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisgIGl0ZW0tPmR1cmF0aW9uID0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKTsKKyAgaWYgKGl0ZW0tPmR1cmF0aW9uID09IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgaXRlbS0+ZHVyYXRpb24gPSAwOworICBpdGVtLT52aXNpYmxlID0gVFJVRTsKKworICBnc3Rfb2JqZWN0X3JlZiAocGFydF9wYWQpOworCisgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworCisgIGlmICghZ3N0X2RhdGFfcXVldWVfcHVzaCAocGFydF9wYWQtPnF1ZXVlLCBpdGVtKSkgeworICAgIHNwbGl0bXV4X3BhcnRfZnJlZV9xdWV1ZV9pdGVtIChpdGVtKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwYXJ0X3BhZCk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICB9CisKKyAgZ3N0X29iamVjdF91bnJlZiAocGFydF9wYWQpOworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKKy8qIENhbGxlZCB3aXRoIHNwbGl0bXV4IHBhcnQgbG9jayBoZWxkICovCitzdGF0aWMgZ2Jvb2xlYW4KK3NwbGl0bXV4X3BhcnRfaXNfZW9zX2xvY2tlZCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcGFydCkKK3sKKyAgR0xpc3QgKmN1cjsKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHBhcnQtPnBhZHMpOyBjdXIgIT0gTlVMTDsgY3VyID0gZ19saXN0X25leHQgKGN1cikpIHsKKyAgICBHc3RTcGxpdE11eFBhcnRQYWQgKnBhcnRfcGFkID0gU1BMSVRNVVhfUEFSVF9QQURfQ0FTVCAoY3VyLT5kYXRhKTsKKyAgICBpZiAoIXBhcnRfcGFkLT5pc19lb3MpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitzcGxpdG11eF9wYXJ0X2lzX3ByZXJvbGxlZF9sb2NrZWQgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHBhcnQpCit7CisgIEdMaXN0ICpjdXI7CisgIEdTVF9MT0dfT0JKRUNUIChwYXJ0LCAiQ2hlY2tpbmcgZm9yIHByZXJvbGwiKTsKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHBhcnQtPnBhZHMpOyBjdXIgIT0gTlVMTDsgY3VyID0gZ19saXN0X25leHQgKGN1cikpIHsKKyAgICBHc3RTcGxpdE11eFBhcnRQYWQgKnBhcnRfcGFkID0gU1BMSVRNVVhfUEFSVF9QQURfQ0FTVCAoY3VyLT5kYXRhKTsKKyAgICBpZiAoIXBhcnRfcGFkLT5zZWVuX2J1ZmZlcikgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhcnQsICJQYXJ0IHBhZCAlIiBHU1RfUFRSX0ZPUk1BVCAiIGlzIG5vdCBwcmVyb2xsZWQiLAorICAgICAgICAgIHBhcnRfcGFkKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgR1NUX0xPR19PQkpFQ1QgKHBhcnQsICJQYXJ0IGlzIHByZXJvbGxlZCIpOworICByZXR1cm4gVFJVRTsKK30KKworCitnYm9vbGVhbgorZ3N0X3NwbGl0bXV4X3BhcnRfaXNfZW9zIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIpCit7CisgIGdib29sZWFuIHJlczsKKworICBTUExJVE1VWF9QQVJUX0xPQ0sgKHJlYWRlcik7CisgIHJlcyA9IHNwbGl0bXV4X3BhcnRfaXNfZW9zX2xvY2tlZCAocmVhZGVyKTsKKyAgU1BMSVRNVVhfUEFSVF9VTkxPQ0sgKHJlYWRlcik7CisKKyAgcmV0dXJuIHJlczsKK30KKworLyogQ2FsbGVkIHdpdGggc3BsaXRtdXggcGFydCBsb2NrIGhlbGQgKi8KK3N0YXRpYyBnYm9vbGVhbgorc3BsaXRtdXhfaXNfZmx1c2hpbmcgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlcikKK3sKKyAgR0xpc3QgKmN1cjsKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHJlYWRlci0+cGFkcyk7IGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgIEdzdFNwbGl0TXV4UGFydFBhZCAqcGFydF9wYWQgPSBTUExJVE1VWF9QQVJUX1BBRF9DQVNUIChjdXItPmRhdGEpOworICAgIGlmIChwYXJ0X3BhZC0+Zmx1c2hpbmcpCisgICAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitzcGxpdG11eF9wYXJ0X3BhZF9ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFNwbGl0TXV4UGFydFBhZCAqcGFydF9wYWQgPSBTUExJVE1VWF9QQVJUX1BBRF9DQVNUIChwYWQpOworICBHc3RTcGxpdE11eFBhcnRSZWFkZXIgKnJlYWRlciA9IHBhcnRfcGFkLT5yZWFkZXI7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIFNwbGl0TXV4U3JjUGFkICp0YXJnZXQ7CisgIEdzdERhdGFRdWV1ZUl0ZW0gKml0ZW07CisKKyAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworCisgIHRhcmdldCA9IGdzdF9vYmplY3RfcmVmIChwYXJ0X3BhZC0+dGFyZ2V0KTsKKworICBHU1RfTE9HX09CSkVDVCAocmVhZGVyLCAiUGFkICUiIEdTVF9QVFJfRk9STUFUICIgZXZlbnQgJSIgR1NUX1BUUl9GT1JNQVQsIHBhZCwKKyAgICAgIGV2ZW50KTsKKworICBpZiAocGFydF9wYWQtPmZsdXNoaW5nICYmIEdTVF9FVkVOVF9UWVBFIChldmVudCkgIT0gR1NUX0VWRU5UX0ZMVVNIX1NUT1ApCisgICAgZ290byBkcm9wX2V2ZW50OworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1NUUkVBTV9TVEFSVDp7CisgICAgICBHc3RTdHJlYW1GbGFncyBmbGFnczsKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9zdHJlYW1fZmxhZ3MgKGV2ZW50LCAmZmxhZ3MpOworICAgICAgcGFydF9wYWQtPmlzX3NwYXJzZSA9IChmbGFncyAmIEdTVF9TVFJFQU1fRkxBR19TUEFSU0UpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6eworICAgICAgR3N0U2VnbWVudCAqc2VnID0gJnBhcnRfcGFkLT5zZWdtZW50OworCisgICAgICBHU1RfTE9HX09CSkVDVCAocGFkLCAiUmVjZWl2ZWQgc2VnbWVudCAlIiBHU1RfUFRSX0ZPUk1BVCwgZXZlbnQpOworCisgICAgICBnc3RfZXZlbnRfY29weV9zZWdtZW50IChldmVudCwgc2VnKTsKKyAgICAgIGdzdF9ldmVudF9jb3B5X3NlZ21lbnQgKGV2ZW50LCAmcGFydF9wYWQtPm9yaWdfc2VnbWVudCk7CisKKyAgICAgIGlmIChzZWctPmZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUpCisgICAgICAgIGdvdG8gd3Jvbmdfc2VnbWVudDsKKworICAgICAgLyogQWRqdXN0IHNlZ21lbnQgKi8KKyAgICAgIC8qIEFkanVzdCBzdGFydC9zdG9wIHNvIHRoZSBvdmVyYWxsIGZpbGUgaXMgMCArIHN0YXJ0X29mZnNldCBiYXNlZCAqLworICAgICAgaWYgKHNlZy0+c3RvcCAhPSAtMSkgeworICAgICAgICBzZWctPnN0b3AgLT0gc2VnLT5zdGFydDsKKyAgICAgICAgc2VnLT5zdG9wICs9IHNlZy0+dGltZSArIHJlYWRlci0+c3RhcnRfb2Zmc2V0OworICAgICAgfQorICAgICAgc2VnLT5zdGFydCA9IHNlZy0+dGltZSArIHJlYWRlci0+c3RhcnRfb2Zmc2V0OworICAgICAgc2VnLT50aW1lICs9IHJlYWRlci0+c3RhcnRfb2Zmc2V0OworICAgICAgc2VnLT5wb3NpdGlvbiArPSByZWFkZXItPnN0YXJ0X29mZnNldDsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIkFkanVzdGVkIHNlZ21lbnQgbm93ICUiIEdTVF9QVFJfRk9STUFULCBldmVudCk7CisKKyAgICAgIC8qIFJlcGxhY2UgZXZlbnQgKi8KKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKHNlZyk7CisKKyAgICAgIGlmIChyZWFkZXItPnByZXBfc3RhdGUgIT0gUEFSVF9TVEFURV9QUkVQQVJJTkdfQ09MTEVDVF9TVFJFQU1TCisgICAgICAgICAgJiYgcmVhZGVyLT5wcmVwX3N0YXRlICE9IFBBUlRfU1RBVEVfUFJFUEFSSU5HX01FQVNVUkVfU1RSRUFNUykKKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogT25seSBkbyBmdXJ0aGVyIHN0dWZmIHdpdGggc2VnbWVudHMgZHVyaW5nIGluaXRpYWwgbWVhc3VyaW5nICovCisKKyAgICAgIC8qIFRha2UgdGhlIGZpcnN0IHNlZ21lbnQgZnJvbSB0aGUgZmlyc3QgcGFydCAqLworICAgICAgaWYgKHRhcmdldC0+c2VnbWVudC5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9VTkRFRklORUQpIHsKKyAgICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvIChzZWcsICZ0YXJnZXQtPnNlZ21lbnQpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChyZWFkZXIsCisgICAgICAgICAgICAiVGFyZ2V0IHBhZCBzZWdtZW50IG5vdyAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsICZ0YXJnZXQtPnNlZ21lbnQpOworICAgICAgfQorCisgICAgICBpZiAoc2VnLT5zdG9wICE9IC0xICYmIHRhcmdldC0+c2VnbWVudC5zdG9wICE9IC0xKSB7CisgICAgICAgIEdzdENsb2NrVGltZSBzdG9wID0gc2VnLT5iYXNlICsgc2VnLT5zdG9wOworICAgICAgICBpZiAoc3RvcCA+IHRhcmdldC0+c2VnbWVudC5zdG9wKSB7CisgICAgICAgICAgdGFyZ2V0LT5zZWdtZW50LnN0b3AgPSBzdG9wOworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJlYWRlciwKKyAgICAgICAgICAgICAgIkFkanVzdGluZyBzZWdtZW50IHN0b3AgYnkgJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICAgICAgICIgb3V0cHV0IG5vdyAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsCisgICAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHJlYWRlci0+c3RhcnRfb2Zmc2V0KSwgJnRhcmdldC0+c2VnbWVudCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJGb3J3YXJkaW5nIHNlZ21lbnQgJSIgR1NUX1BUUl9GT1JNQVQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6eworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXJ0X3BhZCwKKyAgICAgICAgICAiU3RhdGUgJXUgRU9TIGV2ZW50LiBNYXhUUyBzZWVuICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICByZWFkZXItPnByZXBfc3RhdGUsIEdTVF9USU1FX0FSR1MgKHBhcnRfcGFkLT5tYXhfdHMpKTsKKworICAgICAgaWYgKHJlYWRlci0+cHJlcF9zdGF0ZSA9PSBQQVJUX1NUQVRFX1BSRVBBUklOR19DT0xMRUNUX1NUUkVBTVMgfHwKKyAgICAgICAgICByZWFkZXItPnByZXBfc3RhdGUgPT0gUEFSVF9TVEFURV9QUkVQQVJJTkdfTUVBU1VSRV9TVFJFQU1TKSB7CisgICAgICAgIC8qIE1hcmsgdGhpcyBwYWQgYXMgRU9TICovCisgICAgICAgIHBhcnRfcGFkLT5pc19lb3MgPSBUUlVFOworICAgICAgICBpZiAoc3BsaXRtdXhfcGFydF9pc19lb3NfbG9ja2VkIChyZWFkZXIpKSB7CisgICAgICAgICAgLyogRmluaXNoZWQgbWVhc3VyaW5nIHRoaW5ncywgc2V0IHN0YXRlIGFuZCB0ZWxsIHRoZSBzdGF0ZSBjaGFuZ2UgZnVuYworICAgICAgICAgICAqIHNvIGl0IGNhbiBzZWVrIGJhY2sgdG8gdGhlIHN0YXJ0ICovCisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHJlYWRlciwKKyAgICAgICAgICAgICAgIkVPUyB3aGlsZSBtZWFzdXJpbmcgc3RyZWFtcy4gUmVzZXR0aW5nIGZvciByZWFkeSIpOworICAgICAgICAgIHJlYWRlci0+cHJlcF9zdGF0ZSA9IFBBUlRfU1RBVEVfUFJFUEFSSU5HX1JFU0VUX0ZPUl9SRUFEWTsKKyAgICAgICAgICBTUExJVE1VWF9QQVJUX0JST0FEQ0FTVCAocmVhZGVyKTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIGRyb3BfZXZlbnQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RBUlQ6CisgICAgICByZWFkZXItPmZsdXNoaW5nID0gVFJVRTsKKyAgICAgIHBhcnRfcGFkLT5mbHVzaGluZyA9IFRSVUU7CisgICAgICBHU1RfTE9HX09CSkVDVCAocmVhZGVyLCAiUGFkICUiIEdTVF9QVFJfRk9STUFUICIgZmx1c2hpbmcgZGF0YXF1ZXVlIiwKKyAgICAgICAgICBwYXJ0X3BhZCk7CisgICAgICBnc3RfZGF0YV9xdWV1ZV9zZXRfZmx1c2hpbmcgKHBhcnRfcGFkLT5xdWV1ZSwgVFJVRSk7CisgICAgICBTUExJVE1VWF9QQVJUX0JST0FEQ0FTVCAocmVhZGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6eworICAgICAgZ3N0X2RhdGFfcXVldWVfc2V0X2ZsdXNoaW5nIChwYXJ0X3BhZC0+cXVldWUsIEZBTFNFKTsKKyAgICAgIGdzdF9kYXRhX3F1ZXVlX2ZsdXNoIChwYXJ0X3BhZC0+cXVldWUpOworICAgICAgcGFydF9wYWQtPnNlZW5fYnVmZmVyID0gRkFMU0U7CisgICAgICBwYXJ0X3BhZC0+Zmx1c2hpbmcgPSBGQUxTRTsKKyAgICAgIHBhcnRfcGFkLT5pc19lb3MgPSBGQUxTRTsKKworICAgICAgcmVhZGVyLT5mbHVzaGluZyA9IHNwbGl0bXV4X2lzX2ZsdXNoaW5nIChyZWFkZXIpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHJlYWRlciwKKyAgICAgICAgICAiJXMgcGFkICUiIEdTVF9QVFJfRk9STUFUICIgZmx1c2hfc3RvcC4gT3ZlcmFsbCBmbHVzaGluZz0lZCIsCisgICAgICAgICAgcmVhZGVyLT5wYXRoLCBwYWQsIHJlYWRlci0+Zmx1c2hpbmcpOworICAgICAgU1BMSVRNVVhfUEFSVF9CUk9BRENBU1QgKHJlYWRlcik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRG9uJ3Qgc2VuZCBldmVudHMgZG93bnN0cmVhbSB3aGlsZSBwcmVwYXJpbmcgKi8KKyAgaWYgKHJlYWRlci0+cHJlcF9zdGF0ZSAhPSBQQVJUX1NUQVRFX1JFQURZKQorICAgIGdvdG8gZHJvcF9ldmVudDsKKworICAvKiBEb24ndCBwYXNzIGZsdXNoIGV2ZW50cyAtIHRob3NlIGFyZSBkb25lIGJ5IHRoZSBwYXJlbnQgKi8KKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX0ZMVVNIX1NUQVJUIHx8CisgICAgICBHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9GTFVTSF9TVE9QKQorICAgIGdvdG8gZHJvcF9ldmVudDsKKworICBpZiAoIWJsb2NrX3VudGlsX2Nhbl9wdXNoIChyZWFkZXIpKQorICAgIGdvdG8gZHJvcF9ldmVudDsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9HQVA6eworICAgICAgLyogRklYTUU6IERyb3AgaW5pdGlhbCBnYXAgKGlmIGFueSkgaW4gZWFjaCBzZWdtZW50LCBub3QgYWxsIEdBUHMgKi8KKyAgICAgIGdvdG8gZHJvcF9ldmVudDsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogV2UgYXJlIGFjdGl2ZSwgYW5kIG9uZSBxdWV1ZSBpcyBlbXB0eSwgcGxhY2UgdGhpcyBidWZmZXIgaW4KKyAgICogdGhlIGRhdGFxdWV1ZSAqLworICBnc3Rfb2JqZWN0X3JlZiAocGFydF9wYWQtPnF1ZXVlKTsKKyAgU1BMSVRNVVhfUEFSVF9VTkxPQ0sgKHJlYWRlcik7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHJlYWRlciwgIkVucXVldWVpbmcgZXZlbnQgJSIgR1NUX1BUUl9GT1JNQVQsIGV2ZW50KTsKKyAgaXRlbSA9IGdfc2xpY2VfbmV3IChHc3REYXRhUXVldWVJdGVtKTsKKyAgaXRlbS0+ZGVzdHJveSA9IChHRGVzdHJveU5vdGlmeSkgc3BsaXRtdXhfcGFydF9mcmVlX3F1ZXVlX2l0ZW07CisgIGl0ZW0tPm9iamVjdCA9IEdTVF9NSU5JX09CSkVDVCAoZXZlbnQpOworICBpdGVtLT5zaXplID0gMDsKKyAgaXRlbS0+ZHVyYXRpb24gPSAwOworICBpZiAoaXRlbS0+ZHVyYXRpb24gPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICBpdGVtLT5kdXJhdGlvbiA9IDA7CisgIGl0ZW0tPnZpc2libGUgPSBGQUxTRTsKKworICBpZiAoIWdzdF9kYXRhX3F1ZXVlX3B1c2ggKHBhcnRfcGFkLT5xdWV1ZSwgaXRlbSkpIHsKKyAgICBzcGxpdG11eF9wYXJ0X2ZyZWVfcXVldWVfaXRlbSAoaXRlbSk7CisgICAgcmV0ID0gRkFMU0U7CisgIH0KKworICBnc3Rfb2JqZWN0X3VucmVmIChwYXJ0X3BhZC0+cXVldWUpOworICBnc3Rfb2JqZWN0X3VucmVmICh0YXJnZXQpOworCisgIHJldHVybiByZXQ7Cit3cm9uZ19zZWdtZW50OgorICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgZ3N0X29iamVjdF91bnJlZiAodGFyZ2V0KTsKKyAgU1BMSVRNVVhfUEFSVF9VTkxPQ0sgKHJlYWRlcik7CisgIEdTVF9FTEVNRU5UX0VSUk9SIChyZWFkZXIsIFNUUkVBTSwgRkFJTEVELCAoTlVMTCksCisgICAgICAoIlJlY2VpdmVkIG5vbi10aW1lIHNlZ21lbnQgLSByZWFkZXIgJXMgcGFkICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICAgIHJlYWRlci0+cGF0aCwgcGFkKSk7CisgIHJldHVybiBGQUxTRTsKK2Ryb3BfZXZlbnQ6CisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJEcm9wcGluZyBldmVudCAlIiBHU1RfUFRSX0ZPUk1BVAorICAgICAgIiBmcm9tICUiIEdTVF9QVFJfRk9STUFUICIgb24gJSIgR1NUX1BUUl9GT1JNQVQsIGV2ZW50LCBwYWQsIHRhcmdldCk7CisgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICBnc3Rfb2JqZWN0X3VucmVmICh0YXJnZXQpOworICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorc3BsaXRtdXhfcGFydF9wYWRfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RTcGxpdE11eFBhcnRQYWQgKnBhcnRfcGFkID0gU1BMSVRNVVhfUEFSVF9QQURfQ0FTVCAocGFkKTsKKyAgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXIgPSBwYXJ0X3BhZC0+cmVhZGVyOworICBHc3RQYWQgKnRhcmdldDsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisgIGdib29sZWFuIGFjdGl2ZTsKKworICBTUExJVE1VWF9QQVJUX0xPQ0sgKHJlYWRlcik7CisgIHRhcmdldCA9IGdzdF9vYmplY3RfcmVmIChwYXJ0X3BhZC0+dGFyZ2V0KTsKKyAgYWN0aXZlID0gcmVhZGVyLT5hY3RpdmU7CisgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworCisgIGlmIChhY3RpdmUpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocGFkLCAiRm9yd2FyZGluZyBxdWVyeSAlIiBHU1RfUFRSX0ZPUk1BVAorICAgICAgICAiIGZyb20gJSIgR1NUX1BUUl9GT1JNQVQgIiBvbiAlIiBHU1RfUFRSX0ZPUk1BVCwgcXVlcnksIHBhZCwgdGFyZ2V0KTsKKworICAgIHJldCA9IGdzdF9wYWRfcXVlcnkgKHRhcmdldCwgcXVlcnkpOworICB9CisKKyAgZ3N0X29iamVjdF91bnJlZiAodGFyZ2V0KTsKKworICByZXR1cm4gcmV0OworfQorCitHX0RFRklORV9UWVBFIChHc3RTcGxpdE11eFBhcnRQYWQsIGdzdF9zcGxpdG11eF9wYXJ0X3BhZCwgR1NUX1RZUEVfUEFEKTsKKworc3RhdGljIHZvaWQKK3NwbGl0bXV4X3BhcnRfcGFkX2NvbnN0cnVjdGVkIChHT2JqZWN0ICogcGFkKQoreworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoR1NUX1BBRCAocGFkKSwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChzcGxpdG11eF9wYXJ0X3BhZF9jaGFpbikpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoR1NUX1BBRCAocGFkKSwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChzcGxpdG11eF9wYXJ0X3BhZF9ldmVudCkpOworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAoR1NUX1BBRCAocGFkKSwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChzcGxpdG11eF9wYXJ0X3BhZF9xdWVyeSkpOworCisgIEdfT0JKRUNUX0NMQVNTIChnc3Rfc3BsaXRtdXhfcGFydF9wYWRfcGFyZW50X2NsYXNzKS0+Y29uc3RydWN0ZWQgKHBhZCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfcGFydF9wYWRfY2xhc3NfaW5pdCAoR3N0U3BsaXRNdXhQYXJ0UGFkQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2tsYXNzID0gKEdPYmplY3RDbGFzcyAqKSAoa2xhc3MpOworCisgIGdvYmplY3Rfa2xhc3MtPmNvbnN0cnVjdGVkID0gc3BsaXRtdXhfcGFydF9wYWRfY29uc3RydWN0ZWQ7CisgIGdvYmplY3Rfa2xhc3MtPmZpbmFsaXplID0gc3BsaXRtdXhfcGFydF9wYWRfZmluYWxpemU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfcGFydF9wYWRfaW5pdCAoR3N0U3BsaXRNdXhQYXJ0UGFkICogcGFkKQoreworICBwYWQtPnF1ZXVlID0gZ3N0X2RhdGFfcXVldWVfbmV3IChzcGxpdG11eF9kYXRhX3F1ZXVlX2lzX2Z1bGxfY2IsCisgICAgICBOVUxMLCBOVUxMLCBwYWQpOworICBnc3Rfc2VnbWVudF9pbml0ICgmcGFkLT5zZWdtZW50LCBHU1RfRk9STUFUX1VOREVGSU5FRCk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZwYWQtPm9yaWdfc2VnbWVudCwgR1NUX0ZPUk1BVF9VTkRFRklORUQpOworfQorCitzdGF0aWMgdm9pZAorc3BsaXRtdXhfcGFydF9wYWRfZmluYWxpemUgKEdPYmplY3QgKiBvYmopCit7CisgIEdzdFNwbGl0TXV4UGFydFBhZCAqcGFkID0gKEdzdFNwbGl0TXV4UGFydFBhZCAqKSAob2JqKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChvYmosICJmaW5hbGl6ZSIpOworICBnc3RfZGF0YV9xdWV1ZV9zZXRfZmx1c2hpbmcgKHBhZC0+cXVldWUsIFRSVUUpOworICBnc3RfZGF0YV9xdWV1ZV9mbHVzaCAocGFkLT5xdWV1ZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1RfQ0FTVCAocGFkLT5xdWV1ZSkpOworICBwYWQtPnF1ZXVlID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAoZ3N0X3NwbGl0bXV4X3BhcnRfcGFkX3BhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmopOworfQorCitzdGF0aWMgdm9pZAorbmV3X2RlY29kZWRfcGFkX2FkZGVkX2NiIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkLAorICAgIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHBhcnQpOworc3RhdGljIHZvaWQgbm9fbW9yZV9wYWRzIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcmVhZGVyKTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NlbmRfZXZlbnQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIHZvaWQgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NldF9mbHVzaGluZ19sb2NrZWQgKEdzdFNwbGl0TXV4UGFydFJlYWRlcgorICAgICogcGFydCwgZ2Jvb2xlYW4gZmx1c2hpbmcpOworc3RhdGljIHZvaWQgYnVzX2hhbmRsZXIgKEdzdEJpbiAqIGJpbiwgR3N0TWVzc2FnZSAqIG1zZyk7CitzdGF0aWMgdm9pZCBzcGxpdG11eF9wYXJ0X3JlYWRlcl9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyB2b2lkIHNwbGl0bXV4X3BhcnRfcmVhZGVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyB2b2lkIHNwbGl0bXV4X3BhcnRfcmVhZGVyX3Jlc2V0IChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIpOworCisjZGVmaW5lIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RTcGxpdE11eFBhcnRSZWFkZXIsIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlciwKKyAgICBHU1RfVFlQRV9QSVBFTElORSk7CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfY2xhc3NfaW5pdCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2tsYXNzID0gKEdPYmplY3RDbGFzcyAqKSAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHc3RCaW5DbGFzcyAqZ3N0YmluX2NsYXNzID0gKEdzdEJpbkNsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChzcGxpdG11eF9wYXJ0X2RlYnVnLCAic3BsaXRtdXhwYXJ0cmVhZGVyIiwgMCwKKyAgICAgICJTcGxpdCBGaWxlIERlbXV4aW5nIFNvdXJjZSBoZWxwZXIiKTsKKworICBnb2JqZWN0X2tsYXNzLT5kaXNwb3NlID0gc3BsaXRtdXhfcGFydF9yZWFkZXJfZGlzcG9zZTsKKyAgZ29iamVjdF9rbGFzcy0+ZmluYWxpemUgPSBzcGxpdG11eF9wYXJ0X3JlYWRlcl9maW5hbGl6ZTsKKworICBwYXJ0X3JlYWRlcl9zaWduYWxzW1NJR05BTF9QUkVQQVJFRF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgicHJlcGFyZWQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0ZJUlNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFNwbGl0TXV4UGFydFJlYWRlckNsYXNzLAorICAgICAgICAgIHByZXBhcmVkKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1ZPSUQsIEdfVFlQRV9OT05FLCAwKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2NoYW5nZV9zdGF0ZTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+c2VuZF9ldmVudCA9IGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9zZW5kX2V2ZW50OworCisgIGdzdGJpbl9jbGFzcy0+aGFuZGxlX21lc3NhZ2UgPSBidXNfaGFuZGxlcjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9pbml0IChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIpCit7CisgIEdzdEVsZW1lbnQgKnR5cGVmaW5kOworCisgIHJlYWRlci0+YWN0aXZlID0gRkFMU0U7CisgIHJlYWRlci0+ZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIGdfY29uZF9pbml0ICgmcmVhZGVyLT5pbmFjdGl2ZV9jb25kKTsKKyAgZ19tdXRleF9pbml0ICgmcmVhZGVyLT5sb2NrKTsKKyAgZ19tdXRleF9pbml0ICgmcmVhZGVyLT50eXBlX2xvY2spOworCisgIC8qIEZJWE1FOiBDcmVhdGUgZWxlbWVudHMgb24gYSBzdGF0ZSBjaGFuZ2UgKi8KKyAgcmVhZGVyLT5zcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmaWxlc3JjIiwgTlVMTCk7CisgIGlmIChyZWFkZXItPnNyYyA9PSBOVUxMKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocmVhZGVyLCAiRmFpbGVkIHRvIGNyZWF0ZSBmaWxlc3JjIGVsZW1lbnQiKTsKKyAgICByZXR1cm47CisgIH0KKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU5fQ0FTVCAocmVhZGVyKSwgcmVhZGVyLT5zcmMpOworCisgIHR5cGVmaW5kID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidHlwZWZpbmQiLCBOVUxMKTsKKyAgaWYgKCF0eXBlZmluZCkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJlYWRlciwKKyAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgdHlwZWZpbmQgZWxlbWVudCAtIGNoZWNrIHlvdXIgaW5zdGFsbGF0aW9uIik7CisgICAgcmV0dXJuOworICB9CisKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU5fQ0FTVCAocmVhZGVyKSwgdHlwZWZpbmQpOworICByZWFkZXItPnR5cGVmaW5kID0gdHlwZWZpbmQ7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rX3BhZHMgKHJlYWRlci0+c3JjLCBOVUxMLCB0eXBlZmluZCwgInNpbmsiKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJlYWRlciwKKyAgICAgICAgIkZhaWxlZCB0byBsaW5rIHR5cGVmaW5kIGVsZW1lbnQgLSBjaGVjayB5b3VyIGluc3RhbGxhdGlvbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJlYWRlci0+dHlwZWZpbmQsICJoYXZlLXR5cGUiLCBHX0NBTExCQUNLICh0eXBlX2ZvdW5kKSwKKyAgICAgIHJlYWRlcik7Cit9CisKK3N0YXRpYyB2b2lkCitzcGxpdG11eF9wYXJ0X3JlYWRlcl9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RTcGxpdE11eFBhcnRSZWFkZXIgKnJlYWRlciA9IChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKikgb2JqZWN0OworCisgIHNwbGl0bXV4X3BhcnRfcmVhZGVyX3Jlc2V0IChyZWFkZXIpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorc3BsaXRtdXhfcGFydF9yZWFkZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqcmVhZGVyID0gKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqKSBvYmplY3Q7CisKKyAgZ19jb25kX2NsZWFyICgmcmVhZGVyLT5pbmFjdGl2ZV9jb25kKTsKKyAgZ19tdXRleF9jbGVhciAoJnJlYWRlci0+bG9jayk7CisgIGdfbXV0ZXhfY2xlYXIgKCZyZWFkZXItPnR5cGVfbG9jayk7CisKKyAgZ19mcmVlIChyZWFkZXItPnBhdGgpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3NwbGl0bXV4X3BhcnRfcmVhZGVyX3Jlc2V0IChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIpCit7CisgIEdMaXN0ICpjdXI7CisKKyAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworICBmb3IgKGN1ciA9IGdfbGlzdF9maXJzdCAocmVhZGVyLT5wYWRzKTsgY3VyICE9IE5VTEw7IGN1ciA9IGdfbGlzdF9uZXh0IChjdXIpKSB7CisgICAgR3N0UGFkICpwYWQgPSBHU1RfUEFEX0NBU1QgKGN1ci0+ZGF0YSk7CisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlIChHU1RfUEFEX0NBU1QgKHBhZCksIEZBTFNFKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChHU1RfT0JKRUNUX0NBU1QgKHBhZCkpOworICB9CisKKyAgZ19saXN0X2ZyZWUgKHJlYWRlci0+cGFkcyk7CisgIHJlYWRlci0+cGFkcyA9IE5VTEw7CisgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworfQorCitzdGF0aWMgR3N0U3BsaXRNdXhQYXJ0UGFkICoKK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9uZXdfcHJveHlfcGFkIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIsCisgICAgR3N0UGFkICogdGFyZ2V0KQoreworICBHc3RTcGxpdE11eFBhcnRQYWQgKnBhZCA9IGdfb2JqZWN0X25ldyAoU1BMSVRNVVhfVFlQRV9QQVJUX1BBRCwKKyAgICAgICJuYW1lIiwgR1NUX1BBRF9OQU1FICh0YXJnZXQpLAorICAgICAgImRpcmVjdGlvbiIsIEdTVF9QQURfU0lOSywKKyAgICAgIE5VTEwpOworICBwYWQtPnRhcmdldCA9IHRhcmdldDsKKyAgcGFkLT5yZWFkZXIgPSByZWFkZXI7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChHU1RfUEFEX0NBU1QgKHBhZCksIFRSVUUpOworCisgIHJldHVybiBwYWQ7Cit9CisKK3N0YXRpYyB2b2lkCituZXdfZGVjb2RlZF9wYWRfYWRkZWRfY2IgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWQgKiBwYWQsCisgICAgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcmVhZGVyKQoreworICBHc3RQYWQgKm91dF9wYWQgPSBOVUxMOworICBHc3RTcGxpdE11eFBhcnRQYWQgKnByb3h5X3BhZDsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0UGFkTGlua1JldHVybiBsaW5rX3JldDsKKworICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChwYWQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJlYWRlciwgImZpbGUgJXMgbmV3IGRlY29kZWQgcGFkICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAiIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIHJlYWRlci0+cGF0aCwgcGFkLCBjYXBzKTsKKworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgLyogTG9vayB1cCBvciBjcmVhdGUgdGhlIG91dHB1dCBwYWQgKi8KKyAgaWYgKHJlYWRlci0+Z2V0X3BhZF9jYikKKyAgICBvdXRfcGFkID0gcmVhZGVyLT5nZXRfcGFkX2NiIChyZWFkZXIsIHBhZCwgcmVhZGVyLT5jYl9kYXRhKTsKKyAgaWYgKG91dF9wYWQgPT0gTlVMTCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJlYWRlciwKKyAgICAgICAgIk5vIG91dHB1dCBwYWQgZm9yICUiIEdTVF9QVFJfRk9STUFUICIuIElnbm9yaW5nIiwgcGFkKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBDcmVhdGUgb3VyIHByb3h5IHBhZCB0byBpbnRlcmFjdCB3aXRoIHRoaXMgbmV3IHBhZCAqLworICBwcm94eV9wYWQgPSBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfbmV3X3Byb3h5X3BhZCAocmVhZGVyLCBvdXRfcGFkKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocmVhZGVyLAorICAgICAgImNyZWF0ZWQgcHJveHkgcGFkICUiIEdTVF9QVFJfRk9STUFUICIgZm9yIHRhcmdldCAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIHByb3h5X3BhZCwgb3V0X3BhZCk7CisKKyAgbGlua19yZXQgPSBnc3RfcGFkX2xpbmsgKHBhZCwgR1NUX1BBRCAocHJveHlfcGFkKSk7CisgIGlmIChsaW5rX3JldCAhPSBHU1RfUEFEX0xJTktfT0spIHsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwcm94eV9wYWQpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChyZWFkZXIsIFNUUkVBTSwgRkFJTEVELCAoTlVMTCksCisgICAgICAgICgiRmFpbGVkIHRvIGxpbmsgcHJveHkgcGFkIGZvciBzdHJlYW0gcGFydCAlcyBwYWQgJSIgR1NUX1BUUl9GT1JNQVQKKyAgICAgICAgICAgICIgcmV0ICVkIiwgcmVhZGVyLT5wYXRoLCBwYWQsIGxpbmtfcmV0KSk7CisgICAgcmV0dXJuOworICB9CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJlYWRlciwKKyAgICAgICJuZXcgZGVjb2RlZCBwYWQgJSIgR1NUX1BUUl9GT1JNQVQgIiBsaW5rZWQgdG8gJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBwYWQsIHByb3h5X3BhZCk7CisKKyAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworICByZWFkZXItPnBhZHMgPSBnX2xpc3RfcHJlcGVuZCAocmVhZGVyLT5wYWRzLCBwcm94eV9wYWQpOworICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfc2VuZF9ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqcmVhZGVyID0gKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqKSBlbGVtZW50OworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKyAgR3N0UGFkICpwYWQgPSBOVUxMOworCisgIC8qIFNlbmQgZXZlbnQgdG8gdGhlIGZpcnN0IHNvdXJjZSBwYWQgd2UgZm91bmQgKi8KKyAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworICBpZiAocmVhZGVyLT5wYWRzKSB7CisgICAgR3N0UGFkICpwcm94eV9wYWQgPSBHU1RfUEFEX0NBU1QgKHJlYWRlci0+cGFkcy0+ZGF0YSk7CisgICAgcGFkID0gZ3N0X3BhZF9nZXRfcGVlciAocHJveHlfcGFkKTsKKyAgfQorICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKKworICBpZiAocGFkKSB7CisgICAgcmV0ID0gZ3N0X3BhZF9zZW5kX2V2ZW50IChwYWQsIGV2ZW50KTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworICB9IGVsc2UgeworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogQ2FsbGVkIHdpdGggbG9jayBoZWxkLiBTZWVrcyB0byBhbiAnaW50ZXJuYWwnIHRpbWUgZnJvbSAwIHRvIGxlbmd0aCBvZiB0aGlzIHBpZWNlICovCitzdGF0aWMgdm9pZAorZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NlZWtfdG9fdGltZV9sb2NrZWQgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlciwKKyAgICBHc3RDbG9ja1RpbWUgdGltZSkKK3sKKyAgU1BMSVRNVVhfUEFSVF9VTkxPQ0sgKHJlYWRlcik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJlYWRlciwgIlNlZWtpbmcgdG8gdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lKSk7CisgIGdzdF9lbGVtZW50X3NlZWsgKEdTVF9FTEVNRU5UX0NBU1QgKHJlYWRlciksIDEuMCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgR1NUX1NFRUtfRkxBR19GTFVTSCB8IEdTVF9TRUVLX0ZMQUdfQUNDVVJBVEUsIEdTVF9TRUVLX1RZUEVfU0VULCB0aW1lLAorICAgICAgR1NUX1NFRUtfVFlQRV9FTkQsIDApOworCisgIFNQTElUTVVYX1BBUlRfTE9DSyAocmVhZGVyKTsKKworICAvKiBXYWl0IGZvciBmbHVzaCB0byBmaW5pc2gsIHNvIG9sZCBkYXRhIGlzIGdvbmUgKi8KKyAgd2hpbGUgKHJlYWRlci0+Zmx1c2hpbmcpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocmVhZGVyLCAiJXMgV2FpdGluZyBmb3IgZmx1c2ggdG8gZmluaXNoIiwgcmVhZGVyLT5wYXRoKTsKKyAgICBTUExJVE1VWF9QQVJUX1dBSVQgKHJlYWRlcik7CisgIH0KK30KKworLyogTWFwIHRoZSBwYXNzZWQgc2VnbWVudCB0byAnaW50ZXJuYWwnIHRpbWUgZnJvbSAwIHRvIGxlbmd0aCBvZiB0aGlzIHBpZWNlIGFuZCBzZWVrLiBMb2NrIGNhbm5vdCBiZSBoZWxkICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9zZWVrX3RvX3NlZ21lbnQgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlciwKKyAgICBHc3RTZWdtZW50ICogdGFyZ2V0X3NlZywgR3N0U2Vla0ZsYWdzIGV4dHJhX2ZsYWdzKQoreworICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgIEdzdENsb2NrVGltZSBzdGFydCA9IDAsIHN0b3AgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIGZsYWdzID0gdGFyZ2V0X3NlZy0+ZmxhZ3MgfCBHU1RfU0VFS19GTEFHX0ZMVVNIIHwgZXh0cmFfZmxhZ3M7CisKKyAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworICBpZiAodGFyZ2V0X3NlZy0+c3RhcnQgPj0gcmVhZGVyLT5zdGFydF9vZmZzZXQpCisgICAgc3RhcnQgPSB0YXJnZXRfc2VnLT5zdGFydCAtIHJlYWRlci0+c3RhcnRfb2Zmc2V0OworICAvKiBJZiB0aGUgc2VnbWVudCBzdG9wIGlzIHdpdGhpbiB0aGlzIHBhcnQsIGRvbid0IHBsYXkgdG8gdGhlIGVuZCAqLworICBpZiAodGFyZ2V0X3NlZy0+c3RvcCAhPSAtMSAmJgorICAgICAgdGFyZ2V0X3NlZy0+c3RvcCA8IHJlYWRlci0+c3RhcnRfb2Zmc2V0ICsgcmVhZGVyLT5kdXJhdGlvbikKKyAgICBzdG9wID0gdGFyZ2V0X3NlZy0+c3RvcCAtIHJlYWRlci0+c3RhcnRfb2Zmc2V0OworCisgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJlYWRlciwKKyAgICAgICJTZWVraW5nIHJhdGUgJWYgZm9ybWF0ICVkIGZsYWdzIDB4JXggc3RhcnQgJSIgR1NUX1RJTUVfRk9STUFUICIgc3RvcCAlIgorICAgICAgR1NUX1RJTUVfRk9STUFULCB0YXJnZXRfc2VnLT5yYXRlLCB0YXJnZXRfc2VnLT5mb3JtYXQsIGZsYWdzLAorICAgICAgR1NUX1RJTUVfQVJHUyAoc3RhcnQpLCBHU1RfVElNRV9BUkdTIChzdG9wKSk7CisKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3NlZWsgKEdTVF9FTEVNRU5UX0NBU1QgKHJlYWRlciksIHRhcmdldF9zZWctPnJhdGUsCisgICAgICB0YXJnZXRfc2VnLT5mb3JtYXQsIGZsYWdzLCBHU1RfU0VFS19UWVBFX1NFVCwgc3RhcnQsIEdTVF9TRUVLX1RZUEVfU0VULAorICAgICAgc3RvcCk7Cit9CisKKy8qIENhbGxlZCB3aXRoIGxvY2sgaGVsZCAqLworc3RhdGljIHZvaWQKK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9tZWFzdXJlX3N0cmVhbXMgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlcikKK3sKKyAgLyogVHJpZ2dlciBhIGZsdXNoaW5nIHNlZWsgdG8gbmVhciB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBydW4gZWFjaCBzdHJlYW0KKyAgICogdG8gRU9TIGluIG9yZGVyIHRvIGZpbmQgdGhlIHNtYWxsZXN0IGVuZCB0aW1lc3RhbXAgdG8gc3RhcnQgdGhlIG5leHQKKyAgICogZmlsZSBmcm9tCisgICAqLworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHJlYWRlci0+ZHVyYXRpb24pCisgICAgICAmJiByZWFkZXItPmR1cmF0aW9uID4gR1NUX1NFQ09ORCkgeworICAgIEdzdENsb2NrVGltZSBzZWVrX3RzID0gcmVhZGVyLT5kdXJhdGlvbiAtICgwLjUgKiBHU1RfU0VDT05EKTsKKyAgICBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfc2Vla190b190aW1lX2xvY2tlZCAocmVhZGVyLCBzZWVrX3RzKTsKKyAgfQorCisgIC8qIFdhaXQgZm9yIHRoaW5ncyB0byBoYXBwZW4gKi8KKyAgd2hpbGUgKHJlYWRlci0+cHJlcF9zdGF0ZSA9PSBQQVJUX1NUQVRFX1BSRVBBUklOR19NRUFTVVJFX1NUUkVBTVMpCisgICAgU1BMSVRNVVhfUEFSVF9XQUlUIChyZWFkZXIpOworCisgIGlmIChyZWFkZXItPnByZXBfc3RhdGUgPT0gUEFSVF9TVEFURV9QUkVQQVJJTkdfUkVTRVRfRk9SX1JFQURZKSB7CisgICAgLyogRmlyZSB0aGUgcHJlcGFyZWQgc2lnbmFsIGFuZCBnbyB0byBSRUFEWSBzdGF0ZSAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJlYWRlciwKKyAgICAgICAgIlN0cmVhbSBtZWFzdXJpbmcgY29tcGxldGUuIEZpbGUgJXMgaXMgbm93IHJlYWR5LiBGaXJpbmcgcHJlcGFyZWQgc2lnbmFsIiwKKyAgICAgICAgcmVhZGVyLT5wYXRoKTsKKyAgICByZWFkZXItPnByZXBfc3RhdGUgPSBQQVJUX1NUQVRFX1JFQURZOworICAgIGdfc2lnbmFsX2VtaXQgKHJlYWRlciwgcGFydF9yZWFkZXJfc2lnbmFsc1tTSUdOQUxfUFJFUEFSRURdLCAwLCBOVUxMKTsKKyAgfQorfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitmaW5kX2RlbXV4ZXIgKEdzdENhcHMgKiBjYXBzKQoreworICBHTGlzdCAqZmFjdG9yaWVzID0KKyAgICAgIGdzdF9lbGVtZW50X2ZhY3RvcnlfbGlzdF9nZXRfZWxlbWVudHMgKEdTVF9FTEVNRU5UX0ZBQ1RPUllfVFlQRV9ERU1VWEVSLAorICAgICAgR1NUX1JBTktfTUFSR0lOQUwpOworICBHTGlzdCAqY29tcGF0X2VsZW1lbnRzOworICBHc3RFbGVtZW50ICplID0gTlVMTDsKKworICBpZiAoZmFjdG9yaWVzID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgY29tcGF0X2VsZW1lbnRzID0KKyAgICAgIGdzdF9lbGVtZW50X2ZhY3RvcnlfbGlzdF9maWx0ZXIgKGZhY3RvcmllcywgY2FwcywgR1NUX1BBRF9TSU5LLCBUUlVFKTsKKworICBpZiAoY29tcGF0X2VsZW1lbnRzKSB7CisgICAgLyogSnVzdCB0YWtlIHRoZSBmaXJzdCAoaGlnaGVzdCByYW5rZWQpIG9wdGlvbiAqLworICAgIEdzdEVsZW1lbnRGYWN0b3J5ICpmYWN0b3J5ID0KKyAgICAgICAgR1NUX0VMRU1FTlRfRkFDVE9SWV9DQVNUIChjb21wYXRfZWxlbWVudHMtPmRhdGEpOworICAgIGUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X2NyZWF0ZSAoZmFjdG9yeSwgTlVMTCk7CisgICAgZ3N0X3BsdWdpbl9mZWF0dXJlX2xpc3RfZnJlZSAoY29tcGF0X2VsZW1lbnRzKTsKKyAgfQorCisgIGlmIChmYWN0b3JpZXMpCisgICAgZ3N0X3BsdWdpbl9mZWF0dXJlX2xpc3RfZnJlZSAoZmFjdG9yaWVzKTsKKworICByZXR1cm4gZTsKK30KKworc3RhdGljIHZvaWQKK3R5cGVfZm91bmQgKEdzdEVsZW1lbnQgKiB0eXBlZmluZCwgZ3VpbnQgcHJvYmFiaWxpdHksCisgICAgR3N0Q2FwcyAqIGNhcHMsIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlcikKK3sKKyAgR3N0RWxlbWVudCAqZGVtdXg7CisKKyAgR1NUX0lORk9fT0JKRUNUIChyZWFkZXIsICJHb3QgdHlwZSAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgLyogdHlwZWZpbmQgZm91bmQgYSB0eXBlLiBMb29rIGZvciB0aGUgZGVtdXhlciB0byBoYW5kbGUgaXQgKi8KKyAgZGVtdXggPSByZWFkZXItPmRlbXV4ID0gZmluZF9kZW11eGVyIChjYXBzKTsKKyAgaWYgKHJlYWRlci0+ZGVtdXggPT0gTlVMTCkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJlYWRlciwgIkZhaWxlZCB0byBjcmVhdGUgZGVtdXhlciBlbGVtZW50Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogQ29ubmVjdCB0byBkZW11eCBzaWduYWxzICovCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGRlbXV4LAorICAgICAgInBhZC1hZGRlZCIsIEdfQ0FMTEJBQ0sgKG5ld19kZWNvZGVkX3BhZF9hZGRlZF9jYiksIHJlYWRlcik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGRlbXV4LCAibm8tbW9yZS1wYWRzIiwgR19DQUxMQkFDSyAobm9fbW9yZV9wYWRzKSwgcmVhZGVyKTsKKworICBnc3RfZWxlbWVudF9zZXRfbG9ja2VkX3N0YXRlIChkZW11eCwgVFJVRSk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOX0NBU1QgKHJlYWRlciksIGRlbXV4KTsKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzIChyZWFkZXItPnR5cGVmaW5kLCAic3JjIiwgZGVtdXgsIE5VTEwpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHJlYWRlci0+ZGVtdXgsIEdTVF9TVEFURV9UQVJHRVQgKHJlYWRlcikpOworICBnc3RfZWxlbWVudF9zZXRfbG9ja2VkX3N0YXRlIChkZW11eCwgRkFMU0UpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfaWZfcGFkc19jb2xsZWN0ZWQgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlcikKK3sKKyAgaWYgKHJlYWRlci0+cHJlcF9zdGF0ZSA9PSBQQVJUX1NUQVRFX1BSRVBBUklOR19DT0xMRUNUX1NUUkVBTVMpIHsKKyAgICAvKiBDaGVjayB3ZSBoYXZlIGFsbCBwYWRzIGFuZCBlYWNoIHBhZCBoYXMgc2VlbiBhIGJ1ZmZlciAqLworICAgIGlmIChyZWFkZXItPm5vX21vcmVfcGFkcyAmJiBzcGxpdG11eF9wYXJ0X2lzX3ByZXJvbGxlZF9sb2NrZWQgKHJlYWRlcikpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJlYWRlciwKKyAgICAgICAgICAibm8gbW9yZSBwYWRzIC0gZmlsZSAlcy4gTWVhc3VyaW5nIHN0cmVhbSBsZW5ndGgiLCByZWFkZXItPnBhdGgpOworICAgICAgcmVhZGVyLT5wcmVwX3N0YXRlID0gUEFSVF9TVEFURV9QUkVQQVJJTkdfTUVBU1VSRV9TVFJFQU1TOworICAgICAgU1BMSVRNVVhfUEFSVF9CUk9BRENBU1QgKHJlYWRlcik7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitub19tb3JlX3BhZHMgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIpCit7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIEdMaXN0ICpjdXI7CisgIC8qIFF1ZXJ5IHRoZSBtaW5pbXVtIGR1cmF0aW9uIG9mIGFueSBwYWQgaW4gdGhpcyBwaWVjZSBhbmQgc3RvcmUgaXQuCisgICAqIEZJWE1FOiBPbmx5IGNvbnNpZGVyIGF1ZGlvIGFuZCB2aWRlbyAqLworICBTUExJVE1VWF9QQVJUX0xPQ0sgKHJlYWRlcik7CisgIGZvciAoY3VyID0gZ19saXN0X2ZpcnN0IChyZWFkZXItPnBhZHMpOyBjdXIgIT0gTlVMTDsgY3VyID0gZ19saXN0X25leHQgKGN1cikpIHsKKyAgICBHc3RQYWQgKnRhcmdldCA9IEdTVF9QQURfQ0FTVCAoY3VyLT5kYXRhKTsKKyAgICBpZiAodGFyZ2V0KSB7CisgICAgICBnaW50NjQgY3VyX2R1cmF0aW9uOworICAgICAgaWYgKGdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAodGFyZ2V0LCBHU1RfRk9STUFUX1RJTUUsICZjdXJfZHVyYXRpb24pKSB7CisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAocmVhZGVyLAorICAgICAgICAgICAgImZpbGUgJXMgcGFkICUiIEdTVF9QVFJfRk9STUFUICIgZHVyYXRpb24gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgcmVhZGVyLT5wYXRoLCB0YXJnZXQsIEdTVF9USU1FX0FSR1MgKGN1cl9kdXJhdGlvbikpOworICAgICAgICBpZiAoY3VyX2R1cmF0aW9uIDwgZHVyYXRpb24pCisgICAgICAgICAgZHVyYXRpb24gPSBjdXJfZHVyYXRpb247CisgICAgICB9CisgICAgfQorICB9CisgIEdTVF9JTkZPX09CSkVDVCAocmVhZGVyLCAiZmlsZSAlcyBkdXJhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICByZWFkZXItPnBhdGgsIEdTVF9USU1FX0FSR1MgKGR1cmF0aW9uKSk7CisgIHJlYWRlci0+ZHVyYXRpb24gPSAoR3N0Q2xvY2tUaW1lKSBkdXJhdGlvbjsKKworICByZWFkZXItPm5vX21vcmVfcGFkcyA9IFRSVUU7CisKKyAgY2hlY2tfaWZfcGFkc19jb2xsZWN0ZWQgKHJlYWRlcik7CisgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworfQorCitnYm9vbGVhbgorZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NyY19xdWVyeSAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcGFydCwKKyAgICBHc3RQYWQgKiBzcmNfcGFkLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RQYWQgKnRhcmdldCA9IE5VTEw7CisgIGdib29sZWFuIHJldDsKKyAgR0xpc3QgKmN1cjsKKworICBTUExJVE1VWF9QQVJUX0xPQ0sgKHBhcnQpOworICAvKiBGaW5kIHRoZSBwYWQgY29ycmVzcG9uZGluZyB0byB0aGUgdmlzaWJsZSBvdXRwdXQgdGFyZ2V0IHBhZCAqLworICBmb3IgKGN1ciA9IGdfbGlzdF9maXJzdCAocGFydC0+cGFkcyk7IGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgIEdzdFNwbGl0TXV4UGFydFBhZCAqcGFydF9wYWQgPSBTUExJVE1VWF9QQVJUX1BBRF9DQVNUIChjdXItPmRhdGEpOworICAgIGlmIChwYXJ0X3BhZC0+dGFyZ2V0ID09IHNyY19wYWQpIHsKKyAgICAgIHRhcmdldCA9IGdzdF9vYmplY3RfcmVmIChHU1RfT0JKRUNUX0NBU1QgKHBhcnRfcGFkKSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgU1BMSVRNVVhfUEFSVF9VTkxPQ0sgKHBhcnQpOworCisgIGlmICh0YXJnZXQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0ID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5ICh0YXJnZXQsIHF1ZXJ5KTsKKworICBpZiAocmV0ID09IEZBTFNFKQorICAgIGdvdG8gb3V0OworCisgIC8qIFBvc3QtbWFzc2FnaW5nIG9mIHF1ZXJpZXMgKi8KKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfUE9TSVRJT046eworICAgICAgR3N0Rm9ybWF0IGZtdDsKKyAgICAgIGdpbnQ2NCBwb3NpdGlvbjsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3Bvc2l0aW9uIChxdWVyeSwgJmZtdCwgJnBvc2l0aW9uKTsKKyAgICAgIGlmIChmbXQgIT0gR1NUX0ZPUk1BVF9USU1FKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBTUExJVE1VWF9QQVJUX0xPQ0sgKHBhcnQpOworICAgICAgcG9zaXRpb24gKz0gcGFydC0+c3RhcnRfb2Zmc2V0OworICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhcnQsICJQb3NpdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocG9zaXRpb24pKTsKKyAgICAgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChwYXJ0KTsKKworICAgICAgZ3N0X3F1ZXJ5X3NldF9wb3NpdGlvbiAocXVlcnksIGZtdCwgcG9zaXRpb24pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCitvdXQ6CisgIGdzdF9vYmplY3RfdW5yZWYgKHRhcmdldCk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RTcGxpdE11eFBhcnRSZWFkZXIgKnJlYWRlciA9IChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKikgZWxlbWVudDsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWTp7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDp7CisgICAgICAvKiBIb2xkIHRoZSBzcGxpdG11eCB0eXBlIGxvY2sgdW50aWwgYWZ0ZXIgdGhlCisgICAgICAgKiBwYXJlbnQgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uIGhhcyBmaW5pc2hlZAorICAgICAgICogY2hhbmdpbmcgdGhlIHN0YXRlcyBvZiB0aGluZ3MsIGFuZCB0eXBlIGZpbmRpbmcgY2FuIGNvbnRpbnVlICovCisgICAgICBTUExJVE1VWF9QQVJUX0xPQ0sgKHJlYWRlcik7CisgICAgICBnX29iamVjdF9zZXQgKHJlYWRlci0+c3JjLCAibG9jYXRpb24iLCByZWFkZXItPnBhdGgsIE5VTEwpOworICAgICAgcmVhZGVyLT5wcmVwX3N0YXRlID0gUEFSVF9TVEFURV9QUkVQQVJJTkdfQ09MTEVDVF9TVFJFQU1TOworICAgICAgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NldF9mbHVzaGluZ19sb2NrZWQgKHJlYWRlciwgRkFMU0UpOworICAgICAgcmVhZGVyLT5ydW5uaW5nID0gVFJVRTsKKyAgICAgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworICAgICAgU1BMSVRNVVhfUEFSVF9UWVBFX0xPQ0sgKHJlYWRlcik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIFNQTElUTVVYX1BBUlRfTE9DSyAocmVhZGVyKTsKKyAgICAgIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9zZXRfZmx1c2hpbmdfbG9ja2VkIChyZWFkZXIsIFRSVUUpOworICAgICAgcmVhZGVyLT5ydW5uaW5nID0gRkFMU0U7CisgICAgICBTUExJVE1VWF9QQVJUX0JST0FEQ0FTVCAocmVhZGVyKTsKKyAgICAgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworICAgICAgcmVhZGVyLT5hY3RpdmUgPSBGQUxTRTsKKyAgICAgIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9zZXRfZmx1c2hpbmdfbG9ja2VkIChyZWFkZXIsIFRSVUUpOworICAgICAgU1BMSVRNVVhfUEFSVF9CUk9BRENBU1QgKHJlYWRlcik7CisgICAgICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkgeworICAgIGlmICh0cmFuc2l0aW9uID09IEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEKSB7CisgICAgICAvKiBNYWtlIHN1cmUgdG8gcmVsZWFzZSB0aGUgbG9jayB3ZSB0b29rIGFib3ZlICovCisgICAgICBTUExJVE1VWF9QQVJUX1RZUEVfVU5MT0NLIChyZWFkZXIpOworICAgIH0KKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIC8qIFNsZWVwIGFuZCB3YWl0IHVudGlsIGFsbCBzdHJlYW1zIGhhdmUgYmVlbiBjb2xsZWN0ZWQsIHRoZW4gZG8gdGhlIHNlZWtzCisgICAgICAgKiB0byBtZWFzdXJlIHRoZSBzdHJlYW0gbGVuZ3Rocy4gVGhpcyB0b29rIHRoZSB0eXBlIGxvY2sgYWJvdmUsCisgICAgICAgKiBidXQgaXQncyBPSyB0byByZWxlYXNlIGl0IG5vdyBhbmQgbGV0IHR5cGVmaW5kaW5nIGhhcHBlbi4uLiAqLworICAgICAgU1BMSVRNVVhfUEFSVF9UWVBFX1VOTE9DSyAocmVhZGVyKTsKKworICAgICAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworCisgICAgICB3aGlsZSAocmVhZGVyLT5wcmVwX3N0YXRlID09IFBBUlRfU1RBVEVfUFJFUEFSSU5HX0NPTExFQ1RfU1RSRUFNUykgeworICAgICAgICBHU1RfTE9HX09CSkVDVCAocmVhZGVyLCAiV2FpdGluZyB0byBjb2xsZWN0IGFsbCBvdXRwdXQgc3RyZWFtcyIpOworICAgICAgICBTUExJVE1VWF9QQVJUX1dBSVQgKHJlYWRlcik7CisgICAgICB9CisKKyAgICAgIGlmIChyZWFkZXItPnByZXBfc3RhdGUgPT0gUEFSVF9TVEFURV9QUkVQQVJJTkdfTUVBU1VSRV9TVFJFQU1TIHx8CisgICAgICAgICAgcmVhZGVyLT5wcmVwX3N0YXRlID09IFBBUlRfU1RBVEVfUFJFUEFSSU5HX1JFU0VUX0ZPUl9SRUFEWSkgeworICAgICAgICBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfbWVhc3VyZV9zdHJlYW1zIChyZWFkZXIpOworICAgICAgfSBlbHNlIGlmIChyZWFkZXItPnByZXBfc3RhdGUgPT0gUEFSVF9TVEFURV9GQUlMRUQpCisgICAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKyAgICAgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19QTEFZSU5HOgorICAgICAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworICAgICAgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NldF9mbHVzaGluZ19sb2NrZWQgKHJlYWRlciwgRkFMU0UpOworICAgICAgcmVhZGVyLT5hY3RpdmUgPSBUUlVFOworICAgICAgU1BMSVRNVVhfUEFSVF9CUk9BRENBU1QgKHJlYWRlcik7CisgICAgICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgcmVhZGVyLT5wcmVwX3N0YXRlID0gUEFSVF9TVEFURV9OVUxMOworICAgICAgc3BsaXRtdXhfcGFydF9yZWFkZXJfcmVzZXQgKHJlYWRlcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworYmVhY2g6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorY2hlY2tfYnVzX21lc3NhZ2VzIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiBwYXJ0KQoreworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKyAgR3N0QnVzICpidXM7CisgIEdzdE1lc3NhZ2UgKm07CisKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAoR1NUX0VMRU1FTlRfQ0FTVCAocGFydCkpOworICB3aGlsZSAoKG0gPSBnc3RfYnVzX3BvcCAoYnVzKSkgIT0gTlVMTCkgeworICAgIGlmIChHU1RfTUVTU0FHRV9UWVBFIChtKSA9PSBHU1RfTUVTU0FHRV9FUlJPUikgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhcnQsICJHb3QgZXJyb3IgbWVzc2FnZSB3aGlsZSBwcmVwYXJpbmcuIEZhaWxpbmcuIik7CisgICAgICBnc3RfbWVzc2FnZV91bnJlZiAobSk7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIGdzdF9tZXNzYWdlX3VucmVmIChtKTsKKyAgfQorICByZXQgPSBUUlVFOworZG9uZToKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9wcmVwYXJlIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiBwYXJ0KQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChHU1RfRUxFTUVOVF9DQVNUIChwYXJ0KSwgR1NUX1NUQVRFX1BBVVNFRCk7CisKKyAgaWYgKHJldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBjaGVja19idXNfbWVzc2FnZXMgKHBhcnQpOworfQorCit2b2lkCitnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfdW5wcmVwYXJlIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiBwYXJ0KQoreworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKEdTVF9FTEVNRU5UX0NBU1QgKHBhcnQpLCBHU1RfU1RBVEVfTlVMTCk7Cit9CisKK3ZvaWQKK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9zZXRfbG9jYXRpb24gKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlciwKKyAgICBjb25zdCBnY2hhciAqIHBhdGgpCit7CisgIHJlYWRlci0+cGF0aCA9IGdfc3RyZHVwIChwYXRoKTsKK30KKworZ2Jvb2xlYW4KK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9hY3RpdmF0ZSAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcmVhZGVyLAorICAgIEdzdFNlZ21lbnQgKiBzZWcsIEdzdFNlZWtGbGFncyBleHRyYV9mbGFncykKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAocmVhZGVyLCAiQWN0aXZhdGluZyBwYXJ0IHJlYWRlciIpOworCisgIGlmICghZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NlZWtfdG9fc2VnbWVudCAocmVhZGVyLCBzZWcsIGV4dHJhX2ZsYWdzKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJlYWRlciwgIkZhaWxlZCB0byBzZWVrIHBhcnQgdG8gJSIgR1NUX1NFR01FTlRfRk9STUFULAorICAgICAgICBzZWcpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChHU1RfRUxFTUVOVF9DQVNUIChyZWFkZXIpLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChyZWFkZXIsICJGYWlsZWQgdG8gc2V0IHN0YXRlIHRvIFBMQVlJTkciKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfaXNfYWN0aXZlIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiBwYXJ0KQoreworICBnYm9vbGVhbiByZXQ7CisKKyAgU1BMSVRNVVhfUEFSVF9MT0NLIChwYXJ0KTsKKyAgcmV0ID0gcGFydC0+YWN0aXZlOworICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocGFydCk7CisKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZAorZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2RlYWN0aXZhdGUgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlcikKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAocmVhZGVyLCAiRGVhY3RpdmF0aW5nIHJlYWRlciIpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKEdTVF9FTEVNRU5UX0NBU1QgKHJlYWRlciksIEdTVF9TVEFURV9QQVVTRUQpOworfQorCit2b2lkCitnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfc2V0X2ZsdXNoaW5nX2xvY2tlZCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcmVhZGVyLAorICAgIGdib29sZWFuIGZsdXNoaW5nKQoreworICBHTGlzdCAqY3VyOworCisgIEdTVF9MT0dfT0JKRUNUIChyZWFkZXIsICIlcyBkYXRhcXVldWVzIiwKKyAgICAgIGZsdXNoaW5nID8gIkZsdXNoaW5nIiA6ICJEb25lIGZsdXNoaW5nIik7CisgIGZvciAoY3VyID0gZ19saXN0X2ZpcnN0IChyZWFkZXItPnBhZHMpOyBjdXIgIT0gTlVMTDsgY3VyID0gZ19saXN0X25leHQgKGN1cikpIHsKKyAgICBHc3RTcGxpdE11eFBhcnRQYWQgKnBhcnRfcGFkID0gU1BMSVRNVVhfUEFSVF9QQURfQ0FTVCAoY3VyLT5kYXRhKTsKKyAgICBnc3RfZGF0YV9xdWV1ZV9zZXRfZmx1c2hpbmcgKHBhcnRfcGFkLT5xdWV1ZSwgZmx1c2hpbmcpOworICAgIGlmIChmbHVzaGluZykKKyAgICAgIGdzdF9kYXRhX3F1ZXVlX2ZsdXNoIChwYXJ0X3BhZC0+cXVldWUpOworICB9Cit9OworCit2b2lkCitnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfc2V0X2NhbGxiYWNrcyAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcmVhZGVyLAorICAgIGdwb2ludGVyIGNiX2RhdGEsIEdzdFNwbGl0TXV4UGFydFJlYWRlclBhZENiIGdldF9wYWRfY2IpCit7CisgIHJlYWRlci0+Y2JfZGF0YSA9IGNiX2RhdGE7CisgIHJlYWRlci0+Z2V0X3BhZF9jYiA9IGdldF9wYWRfY2I7Cit9CisKK0dzdENsb2NrVGltZQorZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2dldF9lbmRfb2Zmc2V0IChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIpCit7CisgIEdMaXN0ICpjdXI7CisgIEdzdENsb2NrVGltZSByZXQgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIFNQTElUTVVYX1BBUlRfTE9DSyAocmVhZGVyKTsKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHJlYWRlci0+cGFkcyk7IGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgIEdzdFNwbGl0TXV4UGFydFBhZCAqcGFydF9wYWQgPSBTUExJVE1VWF9QQVJUX1BBRF9DQVNUIChjdXItPmRhdGEpOworICAgIGlmICghcGFydF9wYWQtPmlzX3NwYXJzZSAmJiBwYXJ0X3BhZC0+bWF4X3RzIDwgcmV0KQorICAgICAgcmV0ID0gcGFydF9wYWQtPm1heF90czsKKyAgfQorCisgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworCisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9zZXRfc3RhcnRfb2Zmc2V0IChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIsCisgICAgR3N0Q2xvY2tUaW1lIG9mZnNldCkKK3sKKyAgU1BMSVRNVVhfUEFSVF9MT0NLIChyZWFkZXIpOworICByZWFkZXItPnN0YXJ0X29mZnNldCA9IG9mZnNldDsKKyAgR1NUX0lORk9fT0JKRUNUIChyZWFkZXIsICJUUyBvZmZzZXQgbm93ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKG9mZnNldCkpOworICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKK30KKworR3N0Q2xvY2tUaW1lCitnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfZ2V0X3N0YXJ0X29mZnNldCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcmVhZGVyKQoreworICBHc3RDbG9ja1RpbWUgcmV0ID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBTUExJVE1VWF9QQVJUX0xPQ0sgKHJlYWRlcik7CisgIHJldCA9IHJlYWRlci0+c3RhcnRfb2Zmc2V0OworICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKKworICByZXR1cm4gcmV0OworfQorCitHc3RDbG9ja1RpbWUKK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9nZXRfZHVyYXRpb24gKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlcikKK3sKKyAgR3N0Q2xvY2tUaW1lIGR1cjsKKworICBTUExJVE1VWF9QQVJUX0xPQ0sgKHJlYWRlcik7CisgIGR1ciA9IHJlYWRlci0+ZHVyYXRpb247CisgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworCisgIHJldHVybiBkdXI7Cit9CisKK0dzdFBhZCAqCitnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfbG9va3VwX3BhZCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcmVhZGVyLAorICAgIEdzdFBhZCAqIHRhcmdldCkKK3sKKyAgR3N0UGFkICpyZXN1bHQgPSBOVUxMOworICBHTGlzdCAqY3VyOworCisgIFNQTElUTVVYX1BBUlRfTE9DSyAocmVhZGVyKTsKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHJlYWRlci0+cGFkcyk7IGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgIEdzdFNwbGl0TXV4UGFydFBhZCAqcGFydF9wYWQgPSBTUExJVE1VWF9QQVJUX1BBRF9DQVNUIChjdXItPmRhdGEpOworICAgIGlmIChwYXJ0X3BhZC0+dGFyZ2V0ID09IHRhcmdldCkgeworICAgICAgcmVzdWx0ID0gKEdzdFBhZCAqKSBnc3Rfb2JqZWN0X3JlZiAocGFydF9wYWQpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK0dzdEZsb3dSZXR1cm4KK2dzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9wb3AgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlciwgR3N0UGFkICogcGFkLAorICAgIEdzdERhdGFRdWV1ZUl0ZW0gKiogaXRlbSkKK3sKKyAgR3N0U3BsaXRNdXhQYXJ0UGFkICpwYXJ0X3BhZCA9IChHc3RTcGxpdE11eFBhcnRQYWQgKikgKHBhZCk7CisgIEdzdERhdGFRdWV1ZSAqcTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgLyogR2V0IG9uZSBpdGVtIGZyb20gdGhlIGFwcHJvcHJpYXRlIGRhdGFxdWV1ZSAqLworICBTUExJVE1VWF9QQVJUX0xPQ0sgKHJlYWRlcik7CisgIGlmIChyZWFkZXItPnByZXBfc3RhdGUgPT0gUEFSVF9TVEFURV9GQUlMRUQpIHsKKyAgICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICBxID0gZ3N0X29iamVjdF9yZWYgKHBhcnRfcGFkLT5xdWV1ZSk7CisKKyAgLyogSGF2ZSB0byBkcm9wIHRoZSBsb2NrIGFyb3VuZCBwb3AsIHNvIHdlIGNhbiBiZSB3b2tlbiB1cCBmb3IgZmx1c2ggKi8KKyAgU1BMSVRNVVhfUEFSVF9VTkxPQ0sgKHJlYWRlcik7CisgIGlmICghZ3N0X2RhdGFfcXVldWVfcG9wIChxLCBpdGVtKSB8fCAoKml0ZW0gPT0gTlVMTCkpIHsKKyAgICByZXQgPSBHU1RfRkxPV19GTFVTSElORzsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIFNQTElUTVVYX1BBUlRfTE9DSyAocmVhZGVyKTsKKworICBTUExJVE1VWF9QQVJUX0JST0FEQ0FTVCAocmVhZGVyKTsKKyAgaWYgKEdTVF9JU19FVkVOVCAoKCppdGVtKS0+b2JqZWN0KSkgeworICAgIEdzdEV2ZW50ICplID0gKEdzdEV2ZW50ICopICgoKml0ZW0pLT5vYmplY3QpOworICAgIC8qIE1hcmsgdGhpcyBwYWQgYXMgRU9TICovCisgICAgaWYgKEdTVF9FVkVOVF9UWVBFIChlKSA9PSBHU1RfRVZFTlRfRU9TKQorICAgICAgcGFydF9wYWQtPmlzX2VvcyA9IFRSVUU7CisgIH0KKworICBTUExJVE1VWF9QQVJUX1VOTE9DSyAocmVhZGVyKTsKKworICByZXQgPSBHU1RfRkxPV19PSzsKK291dDoKKyAgZ3N0X29iamVjdF91bnJlZiAocSk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfaGFuZGxlciAoR3N0QmluICogYmluLCBHc3RNZXNzYWdlICogbWVzc2FnZSkKK3sKKyAgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXIgPSAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICopIGJpbjsKKworICBzd2l0Y2ggKEdTVF9NRVNTQUdFX1RZUEUgKG1lc3NhZ2UpKSB7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FUlJPUjoKKyAgICAgIC8qIE1ha2Ugc3VyZSB0byBzZXQgdGhlIHN0YXRlIHRvIGZhaWxlZCBhbmQgd2FrZSB1cCB0aGUgbGlzdGVuZXIKKyAgICAgICAqIG9uIGVycm9yICovCisgICAgICBTUExJVE1VWF9QQVJUX0xPQ0sgKHJlYWRlcik7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChyZWFkZXIsICJHb3QgZXJyb3IgbWVzc2FnZSBmcm9tIGNoaWxkICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAgICAgIiBtYXJraW5nIHRoaXMgcmVhZGVyIGFzIGZhaWxlZCIsIEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSkpOworICAgICAgcmVhZGVyLT5wcmVwX3N0YXRlID0gUEFSVF9TVEFURV9GQUlMRUQ7CisgICAgICBTUExJVE1VWF9QQVJUX0JST0FEQ0FTVCAocmVhZGVyKTsKKyAgICAgIFNQTElUTVVYX1BBUlRfVU5MT0NLIChyZWFkZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgR1NUX0JJTl9DTEFTUyAocGFyZW50X2NsYXNzKS0+aGFuZGxlX21lc3NhZ2UgKGJpbiwgbWVzc2FnZSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4cGFydHJlYWRlci5oIGIvZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2I4YjVjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHBhcnRyZWFkZXIuaApAQCAtMCwwICsxLDExOSBAQAorLyogR1N0cmVhbWVyIFNwbGl0IE11eGVkIEZpbGUgU291cmNlIC0gUGFydCByZWFkZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNCBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBfX0dTVF9TUExJVE1VWF9QQVJUX1JFQURFUl9IX18KKyNkZWZpbmUgX19HU1RfU1BMSVRNVVhfUEFSVF9SRUFERVJfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0ZGF0YXF1ZXVlLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9TUExJVE1VWF9QQVJUX1JFQURFUiBcCisgIChnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1NQTElUTVVYX1BBUlRfUkVBREVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfU1BMSVRNVVhfUEFSVF9SRUFERVIsR3N0U3BsaXRNdXhTcmMpKQorI2RlZmluZSBHU1RfU1BMSVRNVVhfUEFSVF9SRUFERVJfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfU1BMSVRNVVhfUEFSVF9SRUFERVIsR3N0U3BsaXRNdXhTcmNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19TUExJVE1VWF9QQVJUX1JFQURFUihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1NQTElUTVVYX1BBUlRfUkVBREVSKSkKKyNkZWZpbmUgR1NUX0lTX1NQTElUTVVYX1BBUlRfUkVBREVSX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1NQTElUTVVYX1BBUlRfUkVBREVSKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNwbGl0TXV4UGFydFJlYWRlciBHc3RTcGxpdE11eFBhcnRSZWFkZXI7Cit0eXBlZGVmIHN0cnVjdCBfR3N0U3BsaXRNdXhQYXJ0UmVhZGVyQ2xhc3MgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyQ2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBfU3BsaXRNdXhTcmNQYWQgU3BsaXRNdXhTcmNQYWQ7Cit0eXBlZGVmIHN0cnVjdCBfU3BsaXRNdXhTcmNQYWRDbGFzcyBTcGxpdE11eFNyY1BhZENsYXNzOworCit0eXBlZGVmIGVudW0KK3sKKyAgUEFSVF9TVEFURV9OVUxMLAorICBQQVJUX1NUQVRFX1BSRVBBUklOR19DT0xMRUNUX1NUUkVBTVMsCisgIFBBUlRfU1RBVEVfUFJFUEFSSU5HX01FQVNVUkVfU1RSRUFNUywKKyAgUEFSVF9TVEFURV9QUkVQQVJJTkdfUkVTRVRfRk9SX1JFQURZLAorICBQQVJUX1NUQVRFX1JFQURZLAorICBQQVJUX1NUQVRFX0ZBSUxFRCwKK30gR3N0U3BsaXRNdXhQYXJ0U3RhdGU7CisKK3R5cGVkZWYgR3N0UGFkICooKkdzdFNwbGl0TXV4UGFydFJlYWRlclBhZENiKShHc3RTcGxpdE11eFBhcnRSZWFkZXIgKnJlYWRlciwgR3N0UGFkICpzcmNfcGFkLCBncG9pbnRlciBjYl9kYXRhKTsKKworc3RydWN0IF9Hc3RTcGxpdE11eFBhcnRSZWFkZXIKK3sKKyAgR3N0UGlwZWxpbmUgcGFyZW50OworCisgIEdzdFNwbGl0TXV4UGFydFN0YXRlIHByZXBfc3RhdGU7CisKKyAgZ2NoYXIgKnBhdGg7CisKKyAgR3N0RWxlbWVudCAqc3JjOworICBHc3RFbGVtZW50ICp0eXBlZmluZDsKKyAgR3N0RWxlbWVudCAqZGVtdXg7CisKKyAgZ2Jvb2xlYW4gYWN0aXZlOworICBnYm9vbGVhbiBydW5uaW5nOworICBnYm9vbGVhbiBwcmVwYXJlZDsKKyAgZ2Jvb2xlYW4gZmx1c2hpbmc7CisgIGdib29sZWFuIG5vX21vcmVfcGFkczsKKworICBHc3RDbG9ja1RpbWUgZHVyYXRpb247CisgIEdzdENsb2NrVGltZSBzdGFydF9vZmZzZXQ7CisKKyAgR0xpc3QgKnBhZHM7CisKKyAgR0NvbmQgaW5hY3RpdmVfY29uZDsKKyAgR011dGV4IGxvY2s7CisgIEdNdXRleCB0eXBlX2xvY2s7CisKKyAgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyUGFkQ2IgZ2V0X3BhZF9jYjsKKyAgZ3BvaW50ZXIgY2JfZGF0YTsKK307CisKK3N0cnVjdCBfR3N0U3BsaXRNdXhQYXJ0UmVhZGVyQ2xhc3MKK3sKKyAgR3N0UGlwZWxpbmVDbGFzcyBwYXJlbnRfY2xhc3M7CisKKyAgdm9pZCAoKnByZXBhcmVkKSAgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqcmVhZGVyKTsKKyAgdm9pZCAoKmVuZF9vZl9wYXJ0KSAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXIpOworfTsKKworR1R5cGUgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2dldF90eXBlICh2b2lkKTsKKwordm9pZCBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfc2V0X2NhbGxiYWNrcyAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXIsCisgICAgZ3BvaW50ZXIgY2JfZGF0YSwgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyUGFkQ2IgZ2V0X3BhZF9jYik7CitnYm9vbGVhbiBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfcHJlcGFyZSAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpwYXJ0KTsKK3ZvaWQgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3VucHJlcGFyZSAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpwYXJ0KTsKK3ZvaWQgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NldF9sb2NhdGlvbiAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXIsCisgICAgY29uc3QgZ2NoYXIgKnBhdGgpOworZ2Jvb2xlYW4gZ3N0X3NwbGl0bXV4X3BhcnRfaXNfZW9zIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKnJlYWRlcik7CisKK2dib29sZWFuIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9hY3RpdmF0ZSAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpwYXJ0LCBHc3RTZWdtZW50ICpzZWcsIEdzdFNlZWtGbGFncyBleHRyYV9mbGFncyk7Cit2b2lkIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9kZWFjdGl2YXRlIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKnBhcnQpOworZ2Jvb2xlYW4gZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2lzX2FjdGl2ZSAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpwYXJ0KTsKKworZ2Jvb2xlYW4gZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NyY19xdWVyeSAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpwYXJ0LCBHc3RQYWQgKnNyY19wYWQsIEdzdFF1ZXJ5ICogcXVlcnkpOwordm9pZCBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfc2V0X3N0YXJ0X29mZnNldCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpwYXJ0LCBHc3RDbG9ja1RpbWUgb2Zmc2V0KTsKK0dzdENsb2NrVGltZSBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfZ2V0X3N0YXJ0X29mZnNldCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpwYXJ0KTsKK0dzdENsb2NrVGltZSBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfZ2V0X2VuZF9vZmZzZXQgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqcGFydCk7CitHc3RDbG9ja1RpbWUgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2dldF9kdXJhdGlvbiAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcmVhZGVyKTsKKworR3N0UGFkICpnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfbG9va3VwX3BhZCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXIsIEdzdFBhZCAqdGFyZ2V0KTsKK0dzdEZsb3dSZXR1cm4gZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3BvcCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXIsIEdzdFBhZCAqcGFydF9wYWQsIEdzdERhdGFRdWV1ZUl0ZW0gKiogaXRlbSk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNpbmsuYyBiL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUzNzkzMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmMKQEAgLTAsMCArMSwyNTAwIEBACisvKiBHU3RyZWFtZXIgTXV4ZXIgYmluIHRoYXQgc3BsaXRzIG91dHB1dCBzdHJlYW0gYnkgc2l6ZS90aW1lCisgKiBDb3B5cmlnaHQgKEMpIDwyMDE0PiBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1zcGxpdG11eHNpbmsKKyAqIEBzaG9ydF9kZXNjcmlwdGlvbjogTXV4ZXIgd3JhcHBlciBmb3Igc3BsaXR0aW5nIG91dHB1dCBzdHJlYW0gYnkgc2l6ZSBvciB0aW1lCisgKgorICogVGhpcyBlbGVtZW50IHdyYXBzIGEgbXV4ZXIgYW5kIGEgc2luaywgYW5kIHN0YXJ0cyBhIG5ldyBmaWxlIHdoZW4gdGhlIG11eAorICogY29udGVudHMgYXJlIGFib3V0IHRvIGNyb3NzIGEgdGhyZXNob2xkIG9mIG1heGltdW0gc2l6ZSBvZiBtYXhpbXVtIHRpbWUsCisgKiBzcGxpdHRpbmcgYXQgdmlkZW8ga2V5ZnJhbWUgYm91bmRhcmllcy4gRXhhY3RseSBvbmUgaW5wdXQgdmlkZW8gc3RyZWFtCisgKiBjYW4gYmUgbXV4ZWQsIHdpdGggYXMgbWFueSBhY2NvbXBhbnlpbmcgYXVkaW8gYW5kIHN1YnRpdGxlIHN0cmVhbXMgYXMKKyAqIGRlc2lyZWQuCisgKgorICogQnkgZGVmYXVsdCwgaXQgdXNlcyBtcDRtdXggYW5kIGZpbGVzaW5rLCBidXQgdGhleSBjYW4gYmUgY2hhbmdlZCB2aWEKKyAqIHRoZSAnbXV4ZXInIGFuZCAnc2luaycgcHJvcGVydGllcy4KKyAqCisgKiBUaGUgbWluaW11bSBmaWxlIHNpemUgaXMgMSBHT1AsIGhvd2V2ZXIgLSBzbyBsaW1pdHMgbWF5IGJlIG92ZXJydW4gaWYgdGhlCisgKiBkaXN0YW5jZSBiZXR3ZWVuIGFueSAyIGtleWZyYW1lcyBpcyBsYXJnZXIgdGhhbiB0aGUgbGltaXRzLgorICoKKyAqIElmIGEgdmlkZW8gc3RyZWFtIGlzIGF2YWlsYWJsZSwgdGhlIHNwbGl0dGluZyBwcm9jZXNzIGlzIGRyaXZlbiBieSB0aGUgdmlkZW8KKyAqIHN0cmVhbSBjb250ZW50cywgYW5kIHRoZSB2aWRlbyBzdHJlYW0gbXVzdCBjb250YWluIGNsb3NlZCBHT1BzIGZvciB0aGUgb3V0cHV0CisgKiBmaWxlIHBhcnRzIHRvIGJlIHBsYXllZCBpbmRpdmlkdWFsbHkgY29ycmVjdGx5LiBJbiB0aGUgYWJzZW5jZSBvZiBhIHZpZGVvCisgKiBzdHJlYW0sIHRoZSBmaXJzdCBhdmFpbGFibGUgc3RyZWFtIGlzIHVzZWQgYXMgcmVmZXJlbmNlIGZvciBzeW5jaHJvbml6YXRpb24uCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtZSB2NGwyc3JjIG51bS1idWZmZXJzPTUwMCAhIHZpZGVvL3gtcmF3LHdpZHRoPTMyMCxoZWlnaHQ9MjQwICEgdmlkZW9jb252ZXJ0ICEgcXVldWUgISB0aW1lb3ZlcmxheSAhIHgyNjRlbmMga2V5LWludC1tYXg9MTAgISBoMjY0cGFyc2UgISBzcGxpdG11eHNpbmsgbG9jYXRpb249dmlkZW8lMDJkLm1vdiBtYXgtc2l6ZS10aW1lPTEwMDAwMDAwMDAwIG1heC1zaXplLWJ5dGVzPTEwMDAwMDAKKyAqIF18CisgKiBSZWNvcmRzIGEgdmlkZW8gc3RyZWFtIGNhcHR1cmVkIGZyb20gYSB2NGwyIGRldmljZSBhbmQgbXV4ZXMgaXQgaW50bworICogSVNPIG1wNCBmaWxlcywgc3BsaXR0aW5nIGFzIG5lZWRlZCB0byBsaW1pdCBzaXplL2R1cmF0aW9uIHRvIDEwIHNlY29uZHMKKyAqIGFuZCAxTUIgbWF4aW11bSBzaXplLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnbGliL2dzdGRpby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgImdzdHNwbGl0bXV4c2luay5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChzcGxpdG11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBzcGxpdG11eF9kZWJ1ZworCisjZGVmaW5lIEdTVF9TUExJVE1VWF9MT0NLKHMpIGdfbXV0ZXhfbG9jaygmKHMpLT5sb2NrKQorI2RlZmluZSBHU1RfU1BMSVRNVVhfVU5MT0NLKHMpIGdfbXV0ZXhfdW5sb2NrKCYocyktPmxvY2spCisjZGVmaW5lIEdTVF9TUExJVE1VWF9XQUlUX0lOUFVUKHMpIGdfY29uZF93YWl0ICgmKHMpLT5pbnB1dF9jb25kLCAmKHMpLT5sb2NrKQorI2RlZmluZSBHU1RfU1BMSVRNVVhfQlJPQURDQVNUX0lOUFVUKHMpIGdfY29uZF9icm9hZGNhc3QgKCYocyktPmlucHV0X2NvbmQpCisKKyNkZWZpbmUgR1NUX1NQTElUTVVYX1dBSVRfT1VUUFVUKHMpIGdfY29uZF93YWl0ICgmKHMpLT5vdXRwdXRfY29uZCwgJihzKS0+bG9jaykKKyNkZWZpbmUgR1NUX1NQTElUTVVYX0JST0FEQ0FTVF9PVVRQVVQocykgZ19jb25kX2Jyb2FkY2FzdCAoJihzKS0+b3V0cHV0X2NvbmQpCisKK3N0YXRpYyB2b2lkIHNwbGl0X25vdyAoR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MT0NBVElPTiwKKyAgUFJPUF9NQVhfU0laRV9USU1FLAorICBQUk9QX01BWF9TSVpFX0JZVEVTLAorICBQUk9QX01BWF9TSVpFX1RJTUVDT0RFLAorICBQUk9QX1NFTkRfS0VZRlJBTUVfUkVRVUVTVFMsCisgIFBST1BfTUFYX0ZJTEVTLAorICBQUk9QX01VWEVSX09WRVJIRUFELAorICBQUk9QX1VTRV9ST0JVU1RfTVVYSU5HLAorICBQUk9QX0FMSUdOTUVOVF9USFJFU0hPTEQsCisgIFBST1BfTVVYRVIsCisgIFBST1BfU0lOSworfTsKKworI2RlZmluZSBERUZBVUxUX01BWF9TSVpFX1RJTUUgICAgICAgMAorI2RlZmluZSBERUZBVUxUX01BWF9TSVpFX0JZVEVTICAgICAgMAorI2RlZmluZSBERUZBVUxUX01BWF9GSUxFUyAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX01VWEVSX09WRVJIRUFEICAgICAgMC4wMgorI2RlZmluZSBERUZBVUxUX1NFTkRfS0VZRlJBTUVfUkVRVUVTVFMgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9BTElHTk1FTlRfVEhSRVNIT0xEIDAKKyNkZWZpbmUgREVGQVVMVF9NVVhFUiAibXA0bXV4IgorI2RlZmluZSBERUZBVUxUX1NJTksgImZpbGVzaW5rIgorI2RlZmluZSBERUZBVUxUX1VTRV9ST0JVU1RfTVVYSU5HIEZBTFNFCisKK2VudW0KK3sKKyAgU0lHTkFMX0ZPUk1BVF9MT0NBVElPTiwKKyAgU0lHTkFMX0ZPUk1BVF9MT0NBVElPTl9GVUxMLAorICBTSUdOQUxfU1BMSVRfTk9XLAorICBTSUdOQUxfTEFTVAorfTsKKworc3RhdGljIGd1aW50IHNpZ25hbHNbU0lHTkFMX0xBU1RdOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgdmlkZW9fc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInZpZGVvIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9SRVFVRVNULAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGF1ZGlvX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJhdWRpb18ldSIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzdWJ0aXRsZV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3VidGl0bGVfJXUiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK3N0YXRpYyBHUXVhcmsgUEFEX0NPTlRFWFQ7CisKK3N0YXRpYyB2b2lkCitfZG9faW5pdCAodm9pZCkKK3sKKyAgUEFEX0NPTlRFWFQgPSBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoInBhZC1jb250ZXh0Iik7Cit9CisKKyNkZWZpbmUgZ3N0X3NwbGl0bXV4X3NpbmtfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9FWFRFTkRFRCAoR3N0U3BsaXRNdXhTaW5rLCBnc3Rfc3BsaXRtdXhfc2luaywgR1NUX1RZUEVfQklOLCAwLAorICAgIF9kb19pbml0ICgpKTsKKworc3RhdGljIGdib29sZWFuIGNyZWF0ZV9tdXhlciAoR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgpOworc3RhdGljIGdib29sZWFuIGNyZWF0ZV9zaW5rIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCk7CitzdGF0aWMgdm9pZCBnc3Rfc3BsaXRtdXhfc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfc3BsaXRtdXhfc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfc3BsaXRtdXhfc2lua19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyB2b2lkIGdzdF9zcGxpdG11eF9zaW5rX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIEdzdFBhZCAqZ3N0X3NwbGl0bXV4X3NpbmtfcmVxdWVzdF9uZXdfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIG5hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyB2b2lkIGdzdF9zcGxpdG11eF9zaW5rX3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9zcGxpdG11eF9zaW5rX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyB2b2lkIGJ1c19oYW5kbGVyIChHc3RCaW4gKiBiaW4sIEdzdE1lc3NhZ2UgKiBtc2cpOworc3RhdGljIHZvaWQgc2V0X25leHRfZmlsZW5hbWUgKEdzdFNwbGl0TXV4U2luayAqIHNwbGl0bXV4LCBNcVN0cmVhbUN0eCAqIGN0eCk7CitzdGF0aWMgdm9pZCBzdGFydF9uZXh0X2ZyYWdtZW50IChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCwgTXFTdHJlYW1DdHggKiBjdHgpOworc3RhdGljIHZvaWQgbXFfc3RyZWFtX2N0eF91bnJlZiAoTXFTdHJlYW1DdHggKiBjdHgpOworc3RhdGljIHZvaWQgZ3Jvd19ibG9ja2VkX3F1ZXVlcyAoR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgpOworCitzdGF0aWMgdm9pZCBnc3Rfc3BsaXRtdXhfc2lua19lbnN1cmVfbWF4X2ZpbGVzIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCk7CitzdGF0aWMgR3N0RWxlbWVudCAqY3JlYXRlX2VsZW1lbnQgKEdzdFNwbGl0TXV4U2luayAqIHNwbGl0bXV4LAorICAgIGNvbnN0IGdjaGFyICogZmFjdG9yeSwgY29uc3QgZ2NoYXIgKiBuYW1lLCBnYm9vbGVhbiBsb2NrZWQpOworCitzdGF0aWMgdm9pZCBkb19hc3luY19kb25lIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCk7CisKK3N0YXRpYyBNcVN0cmVhbUJ1ZiAqCittcV9zdHJlYW1fYnVmX25ldyAodm9pZCkKK3sKKyAgcmV0dXJuIGdfc2xpY2VfbmV3MCAoTXFTdHJlYW1CdWYpOworfQorCitzdGF0aWMgdm9pZAorbXFfc3RyZWFtX2J1Zl9mcmVlIChNcVN0cmVhbUJ1ZiAqIGRhdGEpCit7CisgIGdfc2xpY2VfZnJlZSAoTXFTdHJlYW1CdWYsIGRhdGEpOworfQorCitzdGF0aWMgU3BsaXRNdXhPdXRwdXRDb21tYW5kICoKK291dF9jbWRfYnVmX25ldyAodm9pZCkKK3sKKyAgcmV0dXJuIGdfc2xpY2VfbmV3MCAoU3BsaXRNdXhPdXRwdXRDb21tYW5kKTsKK30KKworc3RhdGljIHZvaWQKK291dF9jbWRfYnVmX2ZyZWUgKFNwbGl0TXV4T3V0cHV0Q29tbWFuZCAqIGRhdGEpCit7CisgIGdfc2xpY2VfZnJlZSAoU3BsaXRNdXhPdXRwdXRDb21tYW5kLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGxpdG11eF9zaW5rX2NsYXNzX2luaXQgKEdzdFNwbGl0TXV4U2lua0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEJpbkNsYXNzICpnc3RiaW5fY2xhc3MgPSAoR3N0QmluQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3NwbGl0bXV4X3Npbmtfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfc3BsaXRtdXhfc2lua19nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3Rfc3BsaXRtdXhfc2lua19kaXNwb3NlOworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9zcGxpdG11eF9zaW5rX2ZpbmFsaXplOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiU3BsaXQgTXV4aW5nIEJpbiIsICJHZW5lcmljL0Jpbi9NdXhlciIsCisgICAgICAiQ29udmVuaWVuY2UgYmluIHRoYXQgbXV4ZXMgaW5jb21pbmcgc3RyZWFtcyBpbnRvIG11bHRpcGxlIHRpbWUvc2l6ZSBsaW1pdGVkIGZpbGVzIiwKKyAgICAgICJKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZ2aWRlb19zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmYXVkaW9fc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJnN1YnRpdGxlX3NpbmtfdGVtcGxhdGUpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NwbGl0bXV4X3NpbmtfY2hhbmdlX3N0YXRlKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVxdWVzdF9uZXdfcGFkID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BsaXRtdXhfc2lua19yZXF1ZXN0X25ld19wYWQpOworICBnc3RlbGVtZW50X2NsYXNzLT5yZWxlYXNlX3BhZCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NwbGl0bXV4X3NpbmtfcmVsZWFzZV9wYWQpOworCisgIGdzdGJpbl9jbGFzcy0+aGFuZGxlX21lc3NhZ2UgPSBidXNfaGFuZGxlcjsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0xPQ0FUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImxvY2F0aW9uIiwgIkZpbGUgT3V0cHV0IFBhdHRlcm4iLAorICAgICAgICAgICJGb3JtYXQgc3RyaW5nIHBhdHRlcm4gZm9yIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZXMgdG8gd3JpdGUgKGUuZy4gdmlkZW8lMDVkLm1wNCkiLAorICAgICAgICAgIE5VTEwsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01VWEVSX09WRVJIRUFELAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoIm11eC1vdmVyaGVhZCIsICJNdXhpbmcgT3ZlcmhlYWQiLAorICAgICAgICAgICJFeHRyYSBzaXplIG92ZXJoZWFkIG9mIG11eGluZyAoMC4wMiA9IDIlKSIsIDAuMCwgMS4wLAorICAgICAgICAgIERFRkFVTFRfTVVYRVJfT1ZFUkhFQUQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX1NJWkVfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJtYXgtc2l6ZS10aW1lIiwgIk1heC4gc2l6ZSAobnMpIiwKKyAgICAgICAgICAiTWF4LiBhbW91bnQgb2YgdGltZSBwZXIgZmlsZSAoaW4gbnMsIDA9ZGlzYWJsZSkiLCAwLCBHX01BWFVJTlQ2NCwKKyAgICAgICAgICBERUZBVUxUX01BWF9TSVpFX1RJTUUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01BWF9TSVpFX0JZVEVTLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoIm1heC1zaXplLWJ5dGVzIiwgIk1heC4gc2l6ZSBieXRlcyIsCisgICAgICAgICAgIk1heC4gYW1vdW50IG9mIGRhdGEgcGVyIGZpbGUgKGluIGJ5dGVzLCAwPWRpc2FibGUpIiwgMCwgR19NQVhVSU5UNjQsCisgICAgICAgICAgREVGQVVMVF9NQVhfU0laRV9CWVRFUywgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX1NJWkVfVElNRUNPREUsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibWF4LXNpemUtdGltZWNvZGUiLCAiTWF4aW11bSB0aW1lY29kZSBkaWZmZXJlbmNlIiwKKyAgICAgICAgICAiTWF4aW11bSBkaWZmZXJlbmNlIGluIHRpbWVjb2RlIGJldHdlZW4gZmlyc3QgYW5kIGxhc3QgZnJhbWUuICIKKyAgICAgICAgICAiU2VwYXJhdG9yIGlzIGFzc3VtZWQgdG8gYmUgXCI6XCIgZXZlcnl3aGVyZSAoZS5nLiAwMTowMDowMDowMCkuICIKKyAgICAgICAgICAiV2lsbCBvbmx5IGJlIGVmZmVjdGl2ZSBpZiBhIHRpbWVjb2RlIHRyYWNrIGlzIHByZXNlbnQuIiwKKyAgICAgICAgICBOVUxMLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TRU5EX0tFWUZSQU1FX1JFUVVFU1RTLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzZW5kLWtleWZyYW1lLXJlcXVlc3RzIiwKKyAgICAgICAgICAiUmVxdWVzdCBrZXlmcmFtZXMgYXQgbWF4LXNpemUtdGltZSIsCisgICAgICAgICAgIlJlcXVlc3QgYSBrZXlmcmFtZSBldmVyeSBtYXgtc2l6ZS10aW1lIG5zIHRvIHRyeSBzcGxpdHRpbmcgYXQgdGhhdCBwb2ludC4gIgorICAgICAgICAgICJOZWVkcyBtYXgtc2l6ZS1ieXRlcyB0byBiZSAwIGluIG9yZGVyIHRvIGJlIGVmZmVjdGl2ZS4iLAorICAgICAgICAgIERFRkFVTFRfU0VORF9LRVlGUkFNRV9SRVFVRVNUUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfRklMRVMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm1heC1maWxlcyIsICJNYXggZmlsZXMiLAorICAgICAgICAgICJNYXhpbXVtIG51bWJlciBvZiBmaWxlcyB0byBrZWVwIG9uIGRpc2suIE9uY2UgdGhlIG1heGltdW0gaXMgcmVhY2hlZCwiCisgICAgICAgICAgIm9sZCBmaWxlcyBzdGFydCB0byBiZSBkZWxldGVkIHRvIG1ha2Ugcm9vbSBmb3IgbmV3IG9uZXMuIiwgMCwKKyAgICAgICAgICBHX01BWFVJTlQsIERFRkFVTFRfTUFYX0ZJTEVTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0FMSUdOTUVOVF9USFJFU0hPTEQsCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgiYWxpZ25tZW50LXRocmVzaG9sZCIsICJBbGlnbm1lbnQgdGhyZXNob2xkIChucykiLAorICAgICAgICAgICJBbGxvdyBub24tcmVmZXJlbmNlIHN0cmVhbXMgdG8gYmUgdGhhdCBtYW55IG5zIGJlZm9yZSB0aGUgcmVmZXJlbmNlIgorICAgICAgICAgICIgc3RyZWFtIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQ2NCwgREVGQVVMVF9BTElHTk1FTlRfVEhSRVNIT0xELAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTVVYRVIsCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgibXV4ZXIiLCAiTXV4ZXIiLAorICAgICAgICAgICJUaGUgbXV4ZXIgZWxlbWVudCB0byB1c2UgKE5VTEwgPSBkZWZhdWx0IG1wNG11eCkiLAorICAgICAgICAgIEdTVF9UWVBFX0VMRU1FTlQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NJTkssCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgic2luayIsICJTaW5rIiwKKyAgICAgICAgICAiVGhlIHNpbmsgZWxlbWVudCAob3IgZWxlbWVudCBjaGFpbikgdG8gdXNlIChOVUxMID0gZGVmYXVsdCBmaWxlc2luaykiLAorICAgICAgICAgIEdTVF9UWVBFX0VMRU1FTlQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVVNFX1JPQlVTVF9NVVhJTkcsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInVzZS1yb2J1c3QtbXV4aW5nIiwKKyAgICAgICAgICAiU3VwcG9ydCByb2J1c3QtbXV4aW5nIG1vZGUgb2Ygc29tZSBtdXhlcnMiLAorICAgICAgICAgICJDaGVjayBpZiBtdXhlcnMgc3VwcG9ydCByb2J1c3QgbXV4aW5nIHZpYSB0aGUgcmVzZXJ2ZWQtbWF4LWR1cmF0aW9uIGFuZCAiCisgICAgICAgICAgInJlc2VydmVkLWR1cmF0aW9uLXJlbWFpbmluZyBwcm9wZXJ0aWVzIGFuZCB1c2UgdGhlbSBpZiBzby4gIgorICAgICAgICAgICIoT25seSBwcmVzZW50IG9uIHF0bXV4IGFuZCBtcDRtdXggZm9yIG5vdykuIHNwbGl0bXV4c2luayBtYXkgdGhlbiBhbHNvICIKKyAgICAgICAgICAiIGNyZWF0ZSBuZXcgZnJhZ21lbnRzIGlmIHRoZSByZXNlcnZlZCBoZWFkZXIgc3BhY2UgaXMgYWJvdXQgdG8gb3ZlcmZsb3cuICIKKyAgICAgICAgICAiTm90ZSB0aGlzIGRvZXMgbm90IHNldCByZXNlcnZlZC1tb292LXVwZGF0ZS1wZXJpb2QgLSBhcHBzIHNob3VsZCBkbyB0aGF0IG1hbnVhbGx5IiwKKyAgICAgICAgICBERUZBVUxUX1VTRV9ST0JVU1RfTVVYSU5HLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RTcGxpdE11eFNpbms6OmZvcm1hdC1sb2NhdGlvbjoKKyAgICogQHNwbGl0bXV4OiB0aGUgI0dzdFNwbGl0TXV4U2luaworICAgKiBAZnJhZ21lbnRfaWQ6IHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGZpbGUgdG8gYmUgY3JlYXRlZAorICAgKgorICAgKiBSZXR1cm5zOiB0aGUgbG9jYXRpb24gdG8gYmUgdXNlZCBmb3IgdGhlIG5leHQgb3V0cHV0IGZpbGUKKyAgICovCisgIHNpZ25hbHNbU0lHTkFMX0ZPUk1BVF9MT0NBVElPTl0gPQorICAgICAgZ19zaWduYWxfbmV3ICgiZm9ybWF0LWxvY2F0aW9uIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBHX1RZUEVfU1RSSU5HLCAxLCBHX1RZUEVfVUlOVCk7CisKKyAgLyoqCisgICAqIEdzdFNwbGl0TXV4U2luazo6Zm9ybWF0LWxvY2F0aW9uLWZ1bGw6CisgICAqIEBzcGxpdG11eDogdGhlICNHc3RTcGxpdE11eFNpbmsKKyAgICogQGZyYWdtZW50X2lkOiB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBmaWxlIHRvIGJlIGNyZWF0ZWQKKyAgICogQGZpcnN0X3NhbXBsZTogQSAjR3N0U2FtcGxlIGNvbnRhaW5pbmcgdGhlIGZpcnN0IGJ1ZmZlcgorICAgKiAgIGZyb20gdGhlIHJlZmVyZW5jZSBzdHJlYW0gaW4gdGhlIG5ldyBmaWxlCisgICAqCisgICAqIFJldHVybnM6IHRoZSBsb2NhdGlvbiB0byBiZSB1c2VkIGZvciB0aGUgbmV4dCBvdXRwdXQgZmlsZQorICAgKi8KKyAgc2lnbmFsc1tTSUdOQUxfRk9STUFUX0xPQ0FUSU9OX0ZVTExdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoImZvcm1hdC1sb2NhdGlvbi1mdWxsIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBHX1RZUEVfU1RSSU5HLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdTVF9UWVBFX1NBTVBMRSk7CisKKyAgLyoqCisgICAqIEdzdFNwbGl0TXV4U2luazo6c3BsaXQtbm93OgorICAgKiBAc3BsaXRtdXg6IHRoZSAjR3N0U3BsaXRNdXhTaW5rCisgICAqCisgICAqIFdoZW4gY2FsbGVkIGJ5IHRoZSB1c2VyLCB0aGlzIGFjdGlvbiBzaWduYWwgc3BsaXRzIHRoZSB2aWRlbyBmaWxlIChhbmQgYmVnaW5zIGEgbmV3IG9uZSkgaW1tZWRpYXRlbHkuCisgICAqCisgICAqCisgICAqIFNpbmNlOiAxLjE0CisgICAqLworCisgIHNpZ25hbHNbU0lHTkFMX1NQTElUX05PV10gPQorICAgICAgZ19zaWduYWxfbmV3ICgic3BsaXQtbm93IiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFNwbGl0TXV4U2lua0NsYXNzLAorICAgICAgICAgIHNwbGl0X25vdyksIE5VTEwsIE5VTEwsIE5VTEwsIEdfVFlQRV9OT05FLCAwKTsKKworICBrbGFzcy0+c3BsaXRfbm93ID0gc3BsaXRfbm93OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwbGl0bXV4X3NpbmtfaW5pdCAoR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgpCit7CisgIGdfbXV0ZXhfaW5pdCAoJnNwbGl0bXV4LT5sb2NrKTsKKyAgZ19jb25kX2luaXQgKCZzcGxpdG11eC0+aW5wdXRfY29uZCk7CisgIGdfY29uZF9pbml0ICgmc3BsaXRtdXgtPm91dHB1dF9jb25kKTsKKyAgZ19xdWV1ZV9pbml0ICgmc3BsaXRtdXgtPm91dF9jbWRfcSk7CisKKyAgc3BsaXRtdXgtPm11eF9vdmVyaGVhZCA9IERFRkFVTFRfTVVYRVJfT1ZFUkhFQUQ7CisgIHNwbGl0bXV4LT50aHJlc2hvbGRfdGltZSA9IERFRkFVTFRfTUFYX1NJWkVfVElNRTsKKyAgc3BsaXRtdXgtPnRocmVzaG9sZF9ieXRlcyA9IERFRkFVTFRfTUFYX1NJWkVfQllURVM7CisgIHNwbGl0bXV4LT5tYXhfZmlsZXMgPSBERUZBVUxUX01BWF9GSUxFUzsKKyAgc3BsaXRtdXgtPnNlbmRfa2V5ZnJhbWVfcmVxdWVzdHMgPSBERUZBVUxUX1NFTkRfS0VZRlJBTUVfUkVRVUVTVFM7CisgIHNwbGl0bXV4LT5uZXh0X21heF90Y190aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgc3BsaXRtdXgtPmFsaWdubWVudF90aHJlc2hvbGQgPSBERUZBVUxUX0FMSUdOTUVOVF9USFJFU0hPTEQ7CisgIHNwbGl0bXV4LT51c2Vfcm9idXN0X211eGluZyA9IERFRkFVTFRfVVNFX1JPQlVTVF9NVVhJTkc7CisKKyAgc3BsaXRtdXgtPnRocmVzaG9sZF90aW1lY29kZV9zdHIgPSBOVUxMOworCisgIEdTVF9PQkpFQ1RfRkxBR19TRVQgKHNwbGl0bXV4LCBHU1RfRUxFTUVOVF9GTEFHX1NJTkspOworICBzcGxpdG11eC0+c3BsaXRfbm93ID0gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfcmVzZXQgKEdzdFNwbGl0TXV4U2luayAqIHNwbGl0bXV4KQoreworICBpZiAoc3BsaXRtdXgtPm11eGVyKSB7CisgICAgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSAoc3BsaXRtdXgtPm11eGVyLCBUUlVFKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNwbGl0bXV4LT5tdXhlciwgR1NUX1NUQVRFX05VTEwpOworICAgIGdzdF9iaW5fcmVtb3ZlIChHU1RfQklOIChzcGxpdG11eCksIHNwbGl0bXV4LT5tdXhlcik7CisgIH0KKyAgaWYgKHNwbGl0bXV4LT5hY3RpdmVfc2luaykgeworICAgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHNwbGl0bXV4LT5hY3RpdmVfc2luaywgVFJVRSk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzcGxpdG11eC0+YWN0aXZlX3NpbmssIEdTVF9TVEFURV9OVUxMKTsKKyAgICBnc3RfYmluX3JlbW92ZSAoR1NUX0JJTiAoc3BsaXRtdXgpLCBzcGxpdG11eC0+YWN0aXZlX3NpbmspOworICB9CisKKyAgc3BsaXRtdXgtPnNpbmsgPSBzcGxpdG11eC0+YWN0aXZlX3NpbmsgPSBzcGxpdG11eC0+bXV4ZXIgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwbGl0bXV4X3NpbmtfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0U3BsaXRNdXhTaW5rICpzcGxpdG11eCA9IEdTVF9TUExJVE1VWF9TSU5LIChvYmplY3QpOworCisgIC8qIENhbGxpbmcgcGFyZW50IGRpc3Bvc2UgaW52YWxpZGF0ZXMgYWxsIGNoaWxkIHBvaW50ZXJzICovCisgIHNwbGl0bXV4LT5zaW5rID0gc3BsaXRtdXgtPmFjdGl2ZV9zaW5rID0gc3BsaXRtdXgtPm11eGVyID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGxpdG11eF9zaW5rX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RTcGxpdE11eFNpbmsgKnNwbGl0bXV4ID0gR1NUX1NQTElUTVVYX1NJTksgKG9iamVjdCk7CisgIGdfY29uZF9jbGVhciAoJnNwbGl0bXV4LT5pbnB1dF9jb25kKTsKKyAgZ19jb25kX2NsZWFyICgmc3BsaXRtdXgtPm91dHB1dF9jb25kKTsKKyAgZ19tdXRleF9jbGVhciAoJnNwbGl0bXV4LT5sb2NrKTsKKyAgZ19xdWV1ZV9mb3JlYWNoICgmc3BsaXRtdXgtPm91dF9jbWRfcSwgKEdGdW5jKSBvdXRfY21kX2J1Zl9mcmVlLCBOVUxMKTsKKyAgZ19xdWV1ZV9jbGVhciAoJnNwbGl0bXV4LT5vdXRfY21kX3EpOworCisgIGlmIChzcGxpdG11eC0+cHJvdmlkZWRfc2luaykKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzcGxpdG11eC0+cHJvdmlkZWRfc2luayk7CisgIGlmIChzcGxpdG11eC0+cHJvdmlkZWRfbXV4ZXIpCisgICAgZ3N0X29iamVjdF91bnJlZiAoc3BsaXRtdXgtPnByb3ZpZGVkX211eGVyKTsKKworICBpZiAoc3BsaXRtdXgtPnRocmVzaG9sZF90aW1lY29kZV9zdHIpCisgICAgZ19mcmVlIChzcGxpdG11eC0+dGhyZXNob2xkX3RpbWVjb2RlX3N0cik7CisKKyAgZ19mcmVlIChzcGxpdG11eC0+bG9jYXRpb24pOworCisgIC8qIE1ha2Ugc3VyZSB0byBmcmVlIGFueSB1bi1yZWxlYXNlZCBjb250ZXh0cyAqLworICBnX2xpc3RfZm9yZWFjaCAoc3BsaXRtdXgtPmNvbnRleHRzLCAoR0Z1bmMpIG1xX3N0cmVhbV9jdHhfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoc3BsaXRtdXgtPmNvbnRleHRzKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKy8qCisgKiBTZXQgYW55IHRpbWUgdGhyZXNob2xkIHRvIHRoZSBtdXhlciwgaWYgaXQgaGFzCisgKiByZXNlcnZlZC1tYXgtZHVyYXRpb24gYW5kIHJlc2VydmVkLWR1cmF0aW9uLXJlbWFpbmluZworICogcHJvcGVydGllcy4gQ2FsbGVkIHdoZW4gY3JlYXRpbmcvY2xhaW1pbmcgdGhlIG11eGVyCisgKiBpbiBjcmVhdGVfZWxlbWVudHMoKSAqLworc3RhdGljIHZvaWQKK3VwZGF0ZV9tdXhlcl9wcm9wZXJ0aWVzIChHc3RTcGxpdE11eFNpbmsgKiBzaW5rKQoreworICBHT2JqZWN0Q2xhc3MgKmtsYXNzOworICBHc3RDbG9ja1RpbWUgdGhyZXNob2xkX3RpbWU7CisKKyAgc2luay0+bXV4ZXJfaGFzX3Jlc2VydmVkX3Byb3BzID0gRkFMU0U7CisgIGlmIChzaW5rLT5tdXhlciA9PSBOVUxMKQorICAgIHJldHVybjsKKyAga2xhc3MgPSBHX09CSkVDVF9HRVRfQ0xBU1MgKHNpbmstPm11eGVyKTsKKyAgaWYgKGdfb2JqZWN0X2NsYXNzX2ZpbmRfcHJvcGVydHkgKGtsYXNzLCAicmVzZXJ2ZWQtbWF4LWR1cmF0aW9uIikgPT0gTlVMTCkKKyAgICByZXR1cm47CisgIGlmIChnX29iamVjdF9jbGFzc19maW5kX3Byb3BlcnR5IChrbGFzcywKKyAgICAgICAgICAicmVzZXJ2ZWQtZHVyYXRpb24tcmVtYWluaW5nIikgPT0gTlVMTCkKKyAgICByZXR1cm47CisgIHNpbmstPm11eGVyX2hhc19yZXNlcnZlZF9wcm9wcyA9IFRSVUU7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNpbmssICJTZXR0aW5nIG11eGVyIHJlc2VydmVkIHRpbWUgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoc2luay0+dGhyZXNob2xkX3RpbWUpKTsKKyAgR1NUX09CSkVDVF9MT0NLIChzaW5rKTsKKyAgdGhyZXNob2xkX3RpbWUgPSBzaW5rLT50aHJlc2hvbGRfdGltZTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNpbmspOworCisgIGlmICh0aHJlc2hvbGRfdGltZSA+IDApIHsKKyAgICAvKiBUZWxsIHRoZSBtdXhlciBob3cgbXVjaCBzcGFjZSB0byByZXNlcnZlICovCisgICAgR3N0Q2xvY2tUaW1lIG11eGVyX3RocmVzaG9sZCA9IHRocmVzaG9sZF90aW1lOworICAgIGdfb2JqZWN0X3NldCAoc2luay0+bXV4ZXIsICJyZXNlcnZlZC1tYXgtZHVyYXRpb24iLCBtdXhlcl90aHJlc2hvbGQsIE5VTEwpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0U3BsaXRNdXhTaW5rICpzcGxpdG11eCA9IEdTVF9TUExJVE1VWF9TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjp7CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGdfZnJlZSAoc3BsaXRtdXgtPmxvY2F0aW9uKTsKKyAgICAgIHNwbGl0bXV4LT5sb2NhdGlvbiA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfTUFYX1NJWkVfQllURVM6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIHNwbGl0bXV4LT50aHJlc2hvbGRfYnl0ZXMgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX1NJWkVfVElNRToKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgc3BsaXRtdXgtPnRocmVzaG9sZF90aW1lID0gZ192YWx1ZV9nZXRfdWludDY0ICh2YWx1ZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc3BsaXRtdXgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9TSVpFX1RJTUVDT0RFOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzcGxpdG11eCk7CisgICAgICBzcGxpdG11eC0+dGhyZXNob2xkX3RpbWVjb2RlX3N0ciA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TRU5EX0tFWUZSQU1FX1JFUVVFU1RTOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzcGxpdG11eCk7CisgICAgICBzcGxpdG11eC0+c2VuZF9rZXlmcmFtZV9yZXF1ZXN0cyA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX0ZJTEVTOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzcGxpdG11eCk7CisgICAgICBzcGxpdG11eC0+bWF4X2ZpbGVzID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NVVhFUl9PVkVSSEVBRDoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgc3BsaXRtdXgtPm11eF9vdmVyaGVhZCA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VfUk9CVVNUX01VWElORzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgc3BsaXRtdXgtPnVzZV9yb2J1c3RfbXV4aW5nID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGlmIChzcGxpdG11eC0+dXNlX3JvYnVzdF9tdXhpbmcpCisgICAgICAgIHVwZGF0ZV9tdXhlcl9wcm9wZXJ0aWVzIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQUxJR05NRU5UX1RIUkVTSE9MRDoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgc3BsaXRtdXgtPmFsaWdubWVudF90aHJlc2hvbGQgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0lOSzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgaWYgKHNwbGl0bXV4LT5wcm92aWRlZF9zaW5rKQorICAgICAgICBnc3Rfb2JqZWN0X3VucmVmIChzcGxpdG11eC0+cHJvdmlkZWRfc2luayk7CisgICAgICBzcGxpdG11eC0+cHJvdmlkZWRfc2luayA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOworICAgICAgZ3N0X29iamVjdF9yZWZfc2luayAoc3BsaXRtdXgtPnByb3ZpZGVkX3NpbmspOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NVVhFUjoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgaWYgKHNwbGl0bXV4LT5wcm92aWRlZF9tdXhlcikKKyAgICAgICAgZ3N0X29iamVjdF91bnJlZiAoc3BsaXRtdXgtPnByb3ZpZGVkX211eGVyKTsKKyAgICAgIHNwbGl0bXV4LT5wcm92aWRlZF9tdXhlciA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOworICAgICAgZ3N0X29iamVjdF9yZWZfc2luayAoc3BsaXRtdXgtPnByb3ZpZGVkX211eGVyKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0U3BsaXRNdXhTaW5rICpzcGxpdG11eCA9IEdTVF9TUExJVE1VWF9TSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc3BsaXRtdXgtPmxvY2F0aW9uKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX1NJWkVfQllURVM6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHNwbGl0bXV4LT50aHJlc2hvbGRfYnl0ZXMpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfU0laRV9USU1FOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzcGxpdG11eCk7CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBzcGxpdG11eC0+dGhyZXNob2xkX3RpbWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfU0laRV9USU1FQ09ERToKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc3BsaXRtdXgtPnRocmVzaG9sZF90aW1lY29kZV9zdHIpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TRU5EX0tFWUZSQU1FX1JFUVVFU1RTOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzcGxpdG11eCk7CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc3BsaXRtdXgtPnNlbmRfa2V5ZnJhbWVfcmVxdWVzdHMpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfRklMRVM6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzcGxpdG11eC0+bWF4X2ZpbGVzKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTVVYRVJfT1ZFUkhFQUQ6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIHNwbGl0bXV4LT5tdXhfb3ZlcmhlYWQpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VfUk9CVVNUX01VWElORzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNwbGl0bXV4LT51c2Vfcm9idXN0X211eGluZyk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc3BsaXRtdXgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FMSUdOTUVOVF9USFJFU0hPTEQ6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHNwbGl0bXV4LT5hbGlnbm1lbnRfdGhyZXNob2xkKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0lOSzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc3BsaXRtdXgtPnByb3ZpZGVkX3NpbmspOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NVVhFUjoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc3BsaXRtdXgtPnByb3ZpZGVkX211eGVyKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIENvbnZlbmllbmNlIGZ1bmN0aW9uICovCitzdGF0aWMgaW5saW5lIEdzdENsb2NrVGltZURpZmYKK215X3NlZ21lbnRfdG9fcnVubmluZ190aW1lIChHc3RTZWdtZW50ICogc2VnbWVudCwgR3N0Q2xvY2tUaW1lIHZhbCkKK3sKKyAgR3N0Q2xvY2tUaW1lRGlmZiByZXMgPSBHU1RfQ0xPQ0tfU1RJTUVfTk9ORTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHZhbCkpIHsKKyAgICBnYm9vbGVhbiBzaWduID0KKyAgICAgICAgZ3N0X3NlZ21lbnRfdG9fcnVubmluZ190aW1lX2Z1bGwgKHNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdmFsLCAmdmFsKTsKKyAgICBpZiAoc2lnbiA+IDApCisgICAgICByZXMgPSB2YWw7CisgICAgZWxzZSBpZiAoc2lnbiA8IDApCisgICAgICByZXMgPSAtdmFsOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBNcVN0cmVhbUN0eCAqCittcV9zdHJlYW1fY3R4X25ldyAoR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgpCit7CisgIE1xU3RyZWFtQ3R4ICpjdHg7CisKKyAgY3R4ID0gZ19uZXcwIChNcVN0cmVhbUN0eCwgMSk7CisgIGdfYXRvbWljX2ludF9zZXQgKCZjdHgtPnJlZmNvdW50LCAxKTsKKyAgY3R4LT5zcGxpdG11eCA9IHNwbGl0bXV4OworICBnc3Rfc2VnbWVudF9pbml0ICgmY3R4LT5pbl9zZWdtZW50LCBHU1RfRk9STUFUX1VOREVGSU5FRCk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZjdHgtPm91dF9zZWdtZW50LCBHU1RfRk9STUFUX1VOREVGSU5FRCk7CisgIGN0eC0+aW5fcnVubmluZ190aW1lID0gY3R4LT5vdXRfcnVubmluZ190aW1lID0gR1NUX0NMT0NLX1NUSU1FX05PTkU7CisgIGdfcXVldWVfaW5pdCAoJmN0eC0+cXVldWVkX2J1ZnMpOworICByZXR1cm4gY3R4OworfQorCitzdGF0aWMgdm9pZAorbXFfc3RyZWFtX2N0eF9mcmVlIChNcVN0cmVhbUN0eCAqIGN0eCkKK3sKKyAgaWYgKGN0eC0+cSkgeworICAgIGdfc2lnbmFsX2hhbmRsZXJfZGlzY29ubmVjdCAoY3R4LT5xLCBjdHgtPnFfb3ZlcnJ1bl9pZCk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSAoY3R4LT5xLCBUUlVFKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGN0eC0+cSwgR1NUX1NUQVRFX05VTEwpOworICAgIGdzdF9iaW5fcmVtb3ZlIChHU1RfQklOIChjdHgtPnNwbGl0bXV4KSwgY3R4LT5xKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChjdHgtPnEpOworICB9CisgIGdzdF9idWZmZXJfcmVwbGFjZSAoJmN0eC0+cHJldl9pbl9rZXlmcmFtZSwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGN0eC0+c2lua3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGN0eC0+c3JjcGFkKTsKKyAgZ19xdWV1ZV9mb3JlYWNoICgmY3R4LT5xdWV1ZWRfYnVmcywgKEdGdW5jKSBtcV9zdHJlYW1fYnVmX2ZyZWUsIE5VTEwpOworICBnX3F1ZXVlX2NsZWFyICgmY3R4LT5xdWV1ZWRfYnVmcyk7CisgIGdfZnJlZSAoY3R4KTsKK30KKworc3RhdGljIHZvaWQKK21xX3N0cmVhbV9jdHhfdW5yZWYgKE1xU3RyZWFtQ3R4ICogY3R4KQoreworICBpZiAoZ19hdG9taWNfaW50X2RlY19hbmRfdGVzdCAoJmN0eC0+cmVmY291bnQpKQorICAgIG1xX3N0cmVhbV9jdHhfZnJlZSAoY3R4KTsKK30KKworc3RhdGljIHZvaWQKK21xX3N0cmVhbV9jdHhfcmVmIChNcVN0cmVhbUN0eCAqIGN0eCkKK3sKKyAgZ19hdG9taWNfaW50X2luYyAoJmN0eC0+cmVmY291bnQpOworfQorCitzdGF0aWMgdm9pZAorX3BhZF9ibG9ja19kZXN0cm95X3Npbmtfbm90aWZ5IChNcVN0cmVhbUN0eCAqIGN0eCkKK3sKKyAgY3R4LT5zaW5rX3BhZF9ibG9ja19pZCA9IDA7CisgIG1xX3N0cmVhbV9jdHhfdW5yZWYgKGN0eCk7Cit9CisKK3N0YXRpYyB2b2lkCitfcGFkX2Jsb2NrX2Rlc3Ryb3lfc3JjX25vdGlmeSAoTXFTdHJlYW1DdHggKiBjdHgpCit7CisgIGN0eC0+c3JjX3BhZF9ibG9ja19pZCA9IDA7CisgIG1xX3N0cmVhbV9jdHhfdW5yZWYgKGN0eCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX2ZyYWdtZW50X29wZW5lZF9jbG9zZWRfbXNnIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCwgZ2Jvb2xlYW4gb3BlbmVkKQoreworICBnY2hhciAqbG9jYXRpb24gPSBOVUxMOworICBHc3RNZXNzYWdlICptc2c7CisgIGNvbnN0IGdjaGFyICptc2dfbmFtZSA9IG9wZW5lZCA/CisgICAgICAic3BsaXRtdXhzaW5rLWZyYWdtZW50LW9wZW5lZCIgOiAic3BsaXRtdXhzaW5rLWZyYWdtZW50LWNsb3NlZCI7CisKKyAgZ19vYmplY3RfZ2V0IChzcGxpdG11eC0+c2luaywgImxvY2F0aW9uIiwgJmxvY2F0aW9uLCBOVUxMKTsKKworICBtc2cgPSBnc3RfbWVzc2FnZV9uZXdfZWxlbWVudCAoR1NUX09CSkVDVCAoc3BsaXRtdXgpLAorICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKG1zZ19uYW1lLAorICAgICAgICAgICJsb2NhdGlvbiIsIEdfVFlQRV9TVFJJTkcsIGxvY2F0aW9uLAorICAgICAgICAgICJydW5uaW5nLXRpbWUiLCBHU1RfVFlQRV9DTE9DS19USU1FLAorICAgICAgICAgIHNwbGl0bXV4LT5yZWZlcmVuY2VfY3R4LT5vdXRfcnVubmluZ190aW1lLCBOVUxMKSk7CisgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAoc3BsaXRtdXgpLCBtc2cpOworCisgIGdfZnJlZSAobG9jYXRpb24pOworfQorCisvKiBDYWxsZWQgd2l0aCBsb2NrIGhlbGQsIGRyb3BzIHRoZSBsb2NrIHRvIHNlbmQgRU9TIHRvIHRoZQorICogcGFkCisgKi8KK3N0YXRpYyB2b2lkCitzZW5kX2VvcyAoR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgsIE1xU3RyZWFtQ3R4ICogY3R4KQoreworICBHc3RFdmVudCAqZW9zOworICBHc3RQYWQgKnBhZDsKKworICBlb3MgPSBnc3RfZXZlbnRfbmV3X2VvcyAoKTsKKyAgcGFkID0gZ3N0X3BhZF9nZXRfcGVlciAoY3R4LT5zcmNwYWQpOworCisgIGN0eC0+b3V0X2VvcyA9IFRSVUU7CisKKyAgR1NUX0lORk9fT0JKRUNUIChzcGxpdG11eCwgIlNlbmRpbmcgRU9TIG9uICUiIEdTVF9QVFJfRk9STUFULCBwYWQpOworICBHU1RfU1BMSVRNVVhfVU5MT0NLIChzcGxpdG11eCk7CisgIGdzdF9wYWRfc2VuZF9ldmVudCAocGFkLCBlb3MpOworICBHU1RfU1BMSVRNVVhfTE9DSyAoc3BsaXRtdXgpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7Cit9CisKKy8qIENhbGxlZCB3aXRoIHNwbGl0bXV4IGxvY2sgaGVsZCB0byBjaGVjayBpZiB0aGlzIG91dHB1dAorICogY29udGV4dCBuZWVkcyB0byBzbGVlcCB0byB3YWl0IGZvciB0aGUgcmVsZWFzZSBvZiB0aGUKKyAqIG5leHQgR09QLCBvciB0byBzZW5kIEVPUyB0byBjbG9zZSBvdXQgdGhlIGN1cnJlbnQgZmlsZQorICovCitzdGF0aWMgdm9pZAorY29tcGxldGVfb3Jfd2FpdF9vbl9vdXQgKEdzdFNwbGl0TXV4U2luayAqIHNwbGl0bXV4LCBNcVN0cmVhbUN0eCAqIGN0eCkKK3sKKyAgaWYgKGN0eC0+Y2Fwc19jaGFuZ2UpCisgICAgcmV0dXJuOworCisgIGRvIHsKKyAgICAvKiBXaGVuIGZpcnN0IHN0YXJ0aW5nIHVwLCB0aGUgcmVmZXJlbmNlIHN0cmVhbSBoYXMgdG8gb3V0cHV0CisgICAgICogdGhlIGZpcnN0IGJ1ZmZlciB0byBwcmVwYXJlIHRoZSBtdXhlciBhbmQgc2luayAqLworICAgIGdib29sZWFuIGNhbl9vdXRwdXQgPSAoY3R4LT5pc19yZWZlcmVuY2UgfHwgc3BsaXRtdXgtPnJlYWR5X2Zvcl9vdXRwdXQpOworICAgIEdzdENsb2NrVGltZURpZmYgbXlfbWF4X291dF9ydW5uaW5nX3RpbWUgPSBzcGxpdG11eC0+bWF4X291dF9ydW5uaW5nX3RpbWU7CisKKyAgICBpZiAoIShzcGxpdG11eC0+bWF4X291dF9ydW5uaW5nX3RpbWUgPT0gMCB8fAorICAgICAgICAgICAgc3BsaXRtdXgtPm1heF9vdXRfcnVubmluZ190aW1lID09IEdTVF9DTE9DS19TVElNRV9OT05FIHx8CisgICAgICAgICAgICBzcGxpdG11eC0+YWxpZ25tZW50X3RocmVzaG9sZCA9PSAwIHx8CisgICAgICAgICAgICBzcGxpdG11eC0+bWF4X291dF9ydW5uaW5nX3RpbWUgPCBzcGxpdG11eC0+YWxpZ25tZW50X3RocmVzaG9sZCkpIHsKKyAgICAgIG15X21heF9vdXRfcnVubmluZ190aW1lIC09IHNwbGl0bXV4LT5hbGlnbm1lbnRfdGhyZXNob2xkOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGN0eC0+c3JjcGFkLAorICAgICAgICAgICJNYXggb3V0IHJ1bm5pbmcgdGltZSBjdXJyZW50bHkgJSIgR1NUX1NUSU1FX0ZPUk1BVAorICAgICAgICAgICIsIHdpdGggdGhyZXNob2xkIGFwcGxpZWQgaXQgaXMgJSIgR1NUX1NUSU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfU1RJTUVfQVJHUyAoc3BsaXRtdXgtPm1heF9vdXRfcnVubmluZ190aW1lKSwKKyAgICAgICAgICBHU1RfU1RJTUVfQVJHUyAobXlfbWF4X291dF9ydW5uaW5nX3RpbWUpKTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5mbHVzaGluZworICAgICAgICB8fCBzcGxpdG11eC0+b3V0cHV0X3N0YXRlID09IFNQTElUTVVYX09VVFBVVF9TVEFURV9TVE9QUEVEKQorICAgICAgcmV0dXJuOworCisgICAgR1NUX0xPR19PQkpFQ1QgKGN0eC0+c3JjcGFkLAorICAgICAgICAiQ2hlY2tpbmcgcnVubmluZyB0aW1lICUiIEdTVF9TVElNRV9GT1JNQVQgIiBhZ2FpbnN0IG1heCAlIgorICAgICAgICBHU1RfU1RJTUVfRk9STUFULCBHU1RfU1RJTUVfQVJHUyAoY3R4LT5vdXRfcnVubmluZ190aW1lKSwKKyAgICAgICAgR1NUX1NUSU1FX0FSR1MgKG15X21heF9vdXRfcnVubmluZ190aW1lKSk7CisKKyAgICBpZiAoY2FuX291dHB1dCkgeworICAgICAgaWYgKHNwbGl0bXV4LT5tYXhfb3V0X3J1bm5pbmdfdGltZSA9PSBHU1RfQ0xPQ0tfU1RJTUVfTk9ORSB8fAorICAgICAgICAgIGN0eC0+b3V0X3J1bm5pbmdfdGltZSA8IG15X21heF9vdXRfcnVubmluZ190aW1lKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChzcGxpdG11eC0+b3V0cHV0X3N0YXRlKSB7CisgICAgICAgIGNhc2UgU1BMSVRNVVhfT1VUUFVUX1NUQVRFX09VVFBVVF9HT1A6CisgICAgICAgICAgLyogV2Ugb25seSBnZXQgaGVyZSBpZiB3ZSd2ZSBmaW5pc2hlZCBvdXRwdXR0aW5nIGEgR09QIGFuZCBuZWVkIHRvIGtub3cKKyAgICAgICAgICAgKiB3aGF0IHRvIGRvIG5leHQgKi8KKyAgICAgICAgICBzcGxpdG11eC0+b3V0cHV0X3N0YXRlID0gU1BMSVRNVVhfT1VUUFVUX1NUQVRFX0FXQUlUSU5HX0NPTU1BTkQ7CisgICAgICAgICAgR1NUX1NQTElUTVVYX0JST0FEQ0FTVF9PVVRQVVQgKHNwbGl0bXV4KTsKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBjYXNlIFNQTElUTVVYX09VVFBVVF9TVEFURV9FTkRJTkdfRklMRToKKyAgICAgICAgICAvKiBXZSd2ZSByZWFjaGVkIHRoZSBtYXggb3V0IHJ1bm5pbmdfdGltZSB0byBnZXQgaGVyZSwgc28gZW5kIHRoaXMgZmlsZSBub3cgKi8KKyAgICAgICAgICBpZiAoY3R4LT5vdXRfZW9zID09IEZBTFNFKSB7CisgICAgICAgICAgICBzZW5kX2VvcyAoc3BsaXRtdXgsIGN0eCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1BMSVRNVVhfT1VUUFVUX1NUQVRFX1NUQVJUX05FWFRfRklMRToKKyAgICAgICAgICBpZiAoY3R4LT5pc19yZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIC8qIFNwZWNpYWwgaGFuZGxpbmcgb24gdGhlIHJlZmVyZW5jZSBjdHggdG8gc3RhcnQgbmV3IGZyYWdtZW50cworICAgICAgICAgICAgICogYW5kIGNvbGxlY3QgY29tbWFuZHMgZnJvbSB0aGUgY29tbWFuZCBxdWV1ZSAqLworICAgICAgICAgICAgLyogZHJvcHMgdGhlIHNwbGl0bXV4IGxvY2sgYnJpZWZseTogKi8KKyAgICAgICAgICAgIHN0YXJ0X25leHRfZnJhZ21lbnQgKHNwbGl0bXV4LCBjdHgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1BMSVRNVVhfT1VUUFVUX1NUQVRFX0FXQUlUSU5HX0NPTU1BTkQ6eworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIFNwbGl0TXV4T3V0cHV0Q29tbWFuZCAqY21kID0KKyAgICAgICAgICAgICAgICBnX3F1ZXVlX3BvcF90YWlsICgmc3BsaXRtdXgtPm91dF9jbWRfcSk7CisgICAgICAgICAgICBpZiAoY21kICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgLyogSWYgd2UgcG9wIHRoZSBsYXN0IGNvbW1hbmQsIHdlIG5lZWQgdG8gbWFrZSBvdXIgcXVldWVzIGJpZ2dlciAqLworICAgICAgICAgICAgICBpZiAoZ19xdWV1ZV9nZXRfbGVuZ3RoICgmc3BsaXRtdXgtPm91dF9jbWRfcSkgPT0gMCkKKyAgICAgICAgICAgICAgICBncm93X2Jsb2NrZWRfcXVldWVzIChzcGxpdG11eCk7CisKKyAgICAgICAgICAgICAgaWYgKGNtZC0+c3RhcnRfbmV3X2ZyYWdtZW50KSB7CisgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsICJHb3QgY21kIHRvIHN0YXJ0IG5ldyBmcmFnbWVudCIpOworICAgICAgICAgICAgICAgIHNwbGl0bXV4LT5vdXRwdXRfc3RhdGUgPSBTUExJVE1VWF9PVVRQVVRfU1RBVEVfRU5ESU5HX0ZJTEU7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICAgICAgICAgICAgICJHb3QgbmV3IG91dHB1dCBjbWQgZm9yIHRpbWUgJSIgR1NUX1NUSU1FX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgR1NUX1NUSU1FX0FSR1MgKGNtZC0+bWF4X291dHB1dF90cykpOworCisgICAgICAgICAgICAgICAgLyogRXh0ZW5kIHRoZSBvdXRwdXQgcmFuZ2UgaW1tZWRpYXRlbHkgKi8KKyAgICAgICAgICAgICAgICBzcGxpdG11eC0+bWF4X291dF9ydW5uaW5nX3RpbWUgPSBjbWQtPm1heF9vdXRwdXRfdHM7CisgICAgICAgICAgICAgICAgc3BsaXRtdXgtPm91dHB1dF9zdGF0ZSA9IFNQTElUTVVYX09VVFBVVF9TVEFURV9PVVRQVVRfR09QOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIEdTVF9TUExJVE1VWF9CUk9BRENBU1RfT1VUUFVUIChzcGxpdG11eCk7CisKKyAgICAgICAgICAgICAgb3V0X2NtZF9idWZfZnJlZSAoY21kKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBHU1RfU1BMSVRNVVhfV0FJVF9PVVRQVVQgKHNwbGl0bXV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IHdoaWxlIChzcGxpdG11eC0+b3V0cHV0X3N0YXRlID09CisgICAgICAgICAgICAgIFNQTElUTVVYX09VVFBVVF9TVEFURV9BV0FJVElOR19DT01NQU5EKTsKKyAgICAgICAgICAvKiBsb29wIGFuZCByZS1jaGVjayB0aGUgc3RhdGUgKi8KKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNQTElUTVVYX09VVFBVVF9TVEFURV9TVE9QUEVEOgorICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGN0eC0+c3JjcGFkLAorICAgICAgICAiU2xlZXBpbmcgZm9yIHJ1bm5pbmcgdGltZSAlIgorICAgICAgICBHU1RfU1RJTUVfRk9STUFUICIgKG1heCAlIiBHU1RfU1RJTUVfRk9STUFUICIpIG9yIHN0YXRlIGNoYW5nZS4iLAorICAgICAgICBHU1RfU1RJTUVfQVJHUyAoY3R4LT5vdXRfcnVubmluZ190aW1lKSwKKyAgICAgICAgR1NUX1NUSU1FX0FSR1MgKHNwbGl0bXV4LT5tYXhfb3V0X3J1bm5pbmdfdGltZSkpOworICAgIEdTVF9TUExJVE1VWF9XQUlUX09VVFBVVCAoc3BsaXRtdXgpOworICAgIEdTVF9JTkZPX09CSkVDVCAoY3R4LT5zcmNwYWQsCisgICAgICAgICJXb2tlbiBmb3IgbmV3IG1heCBydW5uaW5nIHRpbWUgJSIgR1NUX1NUSU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1NUSU1FX0FSR1MgKHNwbGl0bXV4LT5tYXhfb3V0X3J1bm5pbmdfdGltZSkpOworICB9CisgIHdoaWxlICgxKTsKK30KKworc3RhdGljIEdzdENsb2NrVGltZQorY2FsY3VsYXRlX25leHRfbWF4X3RpbWVjb2RlIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCwKKyAgICBjb25zdCBHc3RWaWRlb1RpbWVDb2RlICogY3VyX3RjKQoreworICBHc3RWaWRlb1RpbWVDb2RlICp0YXJnZXRfdGM7CisgIEdzdFZpZGVvVGltZUNvZGVJbnRlcnZhbCAqdGNfaW50ZXI7CisgIEdzdENsb2NrVGltZSBjdXJfdGNfdGltZSwgdGFyZ2V0X3RjX3RpbWUsIG5leHRfbWF4X3RjX3RpbWU7CisKKyAgaWYgKGN1cl90YyA9PSBOVUxMIHx8IHNwbGl0bXV4LT50aHJlc2hvbGRfdGltZWNvZGVfc3RyID09IE5VTEwpCisgICAgcmV0dXJuIEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgdGNfaW50ZXIgPQorICAgICAgZ3N0X3ZpZGVvX3RpbWVfY29kZV9pbnRlcnZhbF9uZXdfZnJvbV9zdHJpbmcKKyAgICAgIChzcGxpdG11eC0+dGhyZXNob2xkX3RpbWVjb2RlX3N0cik7CisgIHRhcmdldF90YyA9IGdzdF92aWRlb190aW1lX2NvZGVfYWRkX2ludGVydmFsIChjdXJfdGMsIHRjX2ludGVyKTsKKyAgZ3N0X3ZpZGVvX3RpbWVfY29kZV9pbnRlcnZhbF9mcmVlICh0Y19pbnRlcik7CisKKyAgLyogQ29udmVydCB0byBucyAqLworICB0YXJnZXRfdGNfdGltZSA9IGdzdF92aWRlb190aW1lX2NvZGVfbnNlY19zaW5jZV9kYWlseV9qYW0gKHRhcmdldF90Yyk7CisgIGN1cl90Y190aW1lID0gZ3N0X3ZpZGVvX3RpbWVfY29kZV9uc2VjX3NpbmNlX2RhaWx5X2phbSAoY3VyX3RjKTsKKworICAvKiBBZGQgZnJhZ21lbnRfc3RhcnRfdGltZSwgYWNjb3VudGluZyBmb3Igd3JhcGFyb3VuZCAqLworICBpZiAodGFyZ2V0X3RjX3RpbWUgPj0gY3VyX3RjX3RpbWUpIHsKKyAgICBuZXh0X21heF90Y190aW1lID0KKyAgICAgICAgdGFyZ2V0X3RjX3RpbWUgLSBjdXJfdGNfdGltZSArIHNwbGl0bXV4LT5mcmFnbWVudF9zdGFydF90aW1lOworICB9IGVsc2UgeworICAgIEdzdENsb2NrVGltZSBkYXlfaW5fbnMgPSAyNCAqIDYwICogNjAgKiBHU1RfU0VDT05EOworCisgICAgbmV4dF9tYXhfdGNfdGltZSA9CisgICAgICAgIGRheV9pbl9ucyAtIGN1cl90Y190aW1lICsgdGFyZ2V0X3RjX3RpbWUgKworICAgICAgICBzcGxpdG11eC0+ZnJhZ21lbnRfc3RhcnRfdGltZTsKKyAgfQorICBHU1RfSU5GT19PQkpFQ1QgKHNwbGl0bXV4LCAiTmV4dCBtYXggVEMgdGltZTogJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAiIGZyb20gcmVmIFRDOiAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKG5leHRfbWF4X3RjX3RpbWUpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoY3VyX3RjX3RpbWUpKTsKKyAgZ3N0X3ZpZGVvX3RpbWVfY29kZV9mcmVlICh0YXJnZXRfdGMpOworCisgIHJldHVybiBuZXh0X21heF90Y190aW1lOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3JlcXVlc3RfbmV4dF9rZXlmcmFtZSAoR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0RXZlbnQgKmV2OworICBHc3RDbG9ja1RpbWUgdGFyZ2V0X3RpbWU7CisgIGdib29sZWFuIHRpbWVjb2RlX2Jhc2VkID0gRkFMU0U7CisKKyAgc3BsaXRtdXgtPm5leHRfbWF4X3RjX3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBpZiAoc3BsaXRtdXgtPnRocmVzaG9sZF90aW1lY29kZV9zdHIpIHsKKyAgICBHc3RWaWRlb1RpbWVDb2RlTWV0YSAqdGNfbWV0YTsKKworICAgIGlmIChidWZmZXIgIT0gTlVMTCkgeworICAgICAgdGNfbWV0YSA9IGdzdF9idWZmZXJfZ2V0X3ZpZGVvX3RpbWVfY29kZV9tZXRhIChidWZmZXIpOworICAgICAgaWYgKHRjX21ldGEpIHsKKyAgICAgICAgc3BsaXRtdXgtPm5leHRfbWF4X3RjX3RpbWUgPQorICAgICAgICAgICAgY2FsY3VsYXRlX25leHRfbWF4X3RpbWVjb2RlIChzcGxpdG11eCwgJnRjX21ldGEtPnRjKTsKKyAgICAgICAgdGltZWNvZGVfYmFzZWQgPSAoc3BsaXRtdXgtPm5leHRfbWF4X3RjX3RpbWUgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBpbiB0aGUgcHJlc2VuY2Ugb2YgR0FQIGV2ZW50cyB0aGF0IHRyaWdnZXIKKyAgICAgICAqIGEgbmV3IGZyYWdtZW50IHN0YXJ0ICovCisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNwbGl0bXV4LAorICAgICAgICAgICJObyBidWZmZXIgYXZhaWxhYmxlIHRvIGNhbGN1bGF0ZSBuZXh0IHRpbWVjb2RlIik7CisgICAgfQorICB9CisKKyAgaWYgKHNwbGl0bXV4LT5zZW5kX2tleWZyYW1lX3JlcXVlc3RzID09IEZBTFNFCisgICAgICB8fCAoc3BsaXRtdXgtPnRocmVzaG9sZF90aW1lID09IDAgJiYgIXRpbWVjb2RlX2Jhc2VkKQorICAgICAgfHwgc3BsaXRtdXgtPnRocmVzaG9sZF9ieXRlcyAhPSAwKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICh0aW1lY29kZV9iYXNlZCkgeworICAgIC8qIFdlIG1pZ2h0IGhhdmUgcm91bmRpbmcgZXJyb3JzOiBhaW0gc2xpZ2h0bHkgZWFybGllciAqLworICAgIHRhcmdldF90aW1lID0gc3BsaXRtdXgtPm5leHRfbWF4X3RjX3RpbWUgLSA1ICogR1NUX1VTRUNPTkQ7CisgIH0gZWxzZSB7CisgICAgdGFyZ2V0X3RpbWUgPSBzcGxpdG11eC0+ZnJhZ21lbnRfc3RhcnRfdGltZSArIHNwbGl0bXV4LT50aHJlc2hvbGRfdGltZTsKKyAgfQorICBldiA9IGdzdF92aWRlb19ldmVudF9uZXdfdXBzdHJlYW1fZm9yY2Vfa2V5X3VuaXQgKHRhcmdldF90aW1lLCBUUlVFLCAwKTsKKyAgR1NUX0lORk9fT0JKRUNUIChzcGxpdG11eCwgIlJlcXVlc3RpbmcgbmV4dCBrZXlmcmFtZSBhdCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0YXJnZXRfdGltZSkpOworICByZXR1cm4gZ3N0X3BhZF9wdXNoX2V2ZW50IChzcGxpdG11eC0+cmVmZXJlbmNlX2N0eC0+c2lua3BhZCwgZXYpOworfQorCitzdGF0aWMgR3N0UGFkUHJvYmVSZXR1cm4KK2hhbmRsZV9tcV9vdXRwdXQgKEdzdFBhZCAqIHBhZCwgR3N0UGFkUHJvYmVJbmZvICogaW5mbywgTXFTdHJlYW1DdHggKiBjdHgpCit7CisgIEdzdFNwbGl0TXV4U2luayAqc3BsaXRtdXggPSBjdHgtPnNwbGl0bXV4OworICBNcVN0cmVhbUJ1ZiAqYnVmX2luZm8gPSBOVUxMOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJGaXJlZCBwcm9iZSB0eXBlIDB4JXgiLCBpbmZvLT50eXBlKTsKKworICAvKiBGSVhNRTogSGFuZGxlIGJ1ZmZlciBsaXN0cywgdW50aWwgdGhlbiBtYWtlIGl0IGNsZWFyIHRoZXkgd29uJ3Qgd29yayAqLworICBpZiAoaW5mby0+dHlwZSAmIEdTVF9QQURfUFJPQkVfVFlQRV9CVUZGRVJfTElTVCkgeworICAgIGdfd2FybmluZyAoIkJ1ZmZlciBsaXN0IGhhbmRsaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworICAgIHJldHVybiBHU1RfUEFEX1BST0JFX0RST1A7CisgIH0KKyAgaWYgKGluZm8tPnR5cGUgJiBHU1RfUEFEX1BST0JFX1RZUEVfRVZFTlRfRE9XTlNUUkVBTSB8fAorICAgICAgaW5mby0+dHlwZSAmIEdTVF9QQURfUFJPQkVfVFlQRV9FVkVOVF9GTFVTSCkgeworICAgIEdzdEV2ZW50ICpldmVudCA9IGdzdF9wYWRfcHJvYmVfaW5mb19nZXRfZXZlbnQgKGluZm8pOworICAgIGdib29sZWFuIGxvY2tlZCA9IEZBTFNFOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIkV2ZW50ICUiIEdTVF9QVFJfRk9STUFULCBldmVudCk7CisKKyAgICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgICAgIGdzdF9ldmVudF9jb3B5X3NlZ21lbnQgKGV2ZW50LCAmY3R4LT5vdXRfc2VnbWVudCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgICAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgICAgbG9ja2VkID0gVFJVRTsKKyAgICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJmN0eC0+b3V0X3NlZ21lbnQsIEdTVF9GT1JNQVRfVU5ERUZJTkVEKTsKKyAgICAgICAgZ19xdWV1ZV9mb3JlYWNoICgmY3R4LT5xdWV1ZWRfYnVmcywgKEdGdW5jKSBtcV9zdHJlYW1fYnVmX2ZyZWUsIE5VTEwpOworICAgICAgICBnX3F1ZXVlX2NsZWFyICgmY3R4LT5xdWV1ZWRfYnVmcyk7CisgICAgICAgIGN0eC0+Zmx1c2hpbmcgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVEFSVDoKKyAgICAgICAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgICAgbG9ja2VkID0gVFJVRTsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIkZsdXNoIHN0YXJ0Iik7CisgICAgICAgIGN0eC0+Zmx1c2hpbmcgPSBUUlVFOworICAgICAgICBHU1RfU1BMSVRNVVhfQlJPQURDQVNUX09VVFBVVCAoc3BsaXRtdXgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgICAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgICAgbG9ja2VkID0gVFJVRTsKKyAgICAgICAgaWYgKHNwbGl0bXV4LT5vdXRwdXRfc3RhdGUgPT0gU1BMSVRNVVhfT1VUUFVUX1NUQVRFX1NUT1BQRUQpCisgICAgICAgICAgZ290byBiZWFjaDsKKyAgICAgICAgY3R4LT5vdXRfZW9zID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9FVkVOVF9HQVA6eworICAgICAgICBHc3RDbG9ja1RpbWUgZ2FwX3RzOworICAgICAgICBHc3RDbG9ja1RpbWVEaWZmIHJ0aW1lOworCisgICAgICAgIGdzdF9ldmVudF9wYXJzZV9nYXAgKGV2ZW50LCAmZ2FwX3RzLCBOVUxMKTsKKyAgICAgICAgaWYgKGdhcF90cyA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEdTVF9TUExJVE1VWF9MT0NLIChzcGxpdG11eCk7CisgICAgICAgIGxvY2tlZCA9IFRSVUU7CisKKyAgICAgICAgaWYgKHNwbGl0bXV4LT5vdXRwdXRfc3RhdGUgPT0gU1BMSVRNVVhfT1VUUFVUX1NUQVRFX1NUT1BQRUQpCisgICAgICAgICAgZ290byBiZWFjaDsKKworICAgICAgICAvKiBXaGVuIHdlIGdldCBhIGdhcCBldmVudCBvbiB0aGUKKyAgICAgICAgICogcmVmZXJlbmNlIHN0cmVhbSBhbmQgd2UncmUgdHJ5aW5nIHRvIG9wZW4gYQorICAgICAgICAgKiBuZXcgZmlsZSwgd2UgbmVlZCB0byBzdG9yZSBpdCB1bnRpbCB3ZSBnZXQKKyAgICAgICAgICogdGhlIGJ1ZmZlciBhZnRlcndhcmRzCisgICAgICAgICAqLworICAgICAgICBpZiAoY3R4LT5pc19yZWZlcmVuY2UgJiYKKyAgICAgICAgICAgIChzcGxpdG11eC0+b3V0cHV0X3N0YXRlICE9IFNQTElUTVVYX09VVFBVVF9TVEFURV9PVVRQVVRfR09QKSkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIlN0b3JpbmcgR0FQIGV2ZW50IHVudGlsIGJ1ZmZlciBhcnJpdmVzIik7CisgICAgICAgICAgZ3N0X2V2ZW50X3JlcGxhY2UgKCZjdHgtPnBlbmRpbmdfZ2FwLCBldmVudCk7CisgICAgICAgICAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICAgICAgICAgIHJldHVybiBHU1RfUEFEX1BST0JFX0hBTkRMRUQ7CisgICAgICAgIH0KKworICAgICAgICBydGltZSA9IG15X3NlZ21lbnRfdG9fcnVubmluZ190aW1lICgmY3R4LT5vdXRfc2VnbWVudCwgZ2FwX3RzKTsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAocGFkLCAiSGF2ZSBHQVAgdy8gdHMgJSIgR1NUX1NUSU1FX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9TVElNRV9BUkdTIChydGltZSkpOworCisgICAgICAgIGlmIChydGltZSAhPSBHU1RfQ0xPQ0tfU1RJTUVfTk9ORSkgeworICAgICAgICAgIGN0eC0+b3V0X3J1bm5pbmdfdGltZSA9IHJ0aW1lOworICAgICAgICAgIGNvbXBsZXRlX29yX3dhaXRfb25fb3V0IChzcGxpdG11eCwgY3R4KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNOnsKKyAgICAgICAgY29uc3QgR3N0U3RydWN0dXJlICpzOworICAgICAgICBHc3RDbG9ja1RpbWVEaWZmIHRzID0gMDsKKworICAgICAgICBzID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKyAgICAgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAic3BsaXRtdXhzaW5rLXVuYmxvY2siKSkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQ2NCAocywgInRpbWVzdGFtcCIsICZ0cyk7CisKKyAgICAgICAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgICAgbG9ja2VkID0gVFJVRTsKKworICAgICAgICBpZiAoc3BsaXRtdXgtPm91dHB1dF9zdGF0ZSA9PSBTUExJVE1VWF9PVVRQVVRfU1RBVEVfU1RPUFBFRCkKKyAgICAgICAgICBnb3RvIGJlYWNoOworICAgICAgICBjdHgtPm91dF9ydW5uaW5nX3RpbWUgPSB0czsKKyAgICAgICAgaWYgKCFjdHgtPmlzX3JlZmVyZW5jZSkKKyAgICAgICAgICBjb21wbGV0ZV9vcl93YWl0X29uX291dCAoc3BsaXRtdXgsIGN0eCk7CisgICAgICAgIEdTVF9TUExJVE1VWF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgICAgcmV0dXJuIEdTVF9QQURfUFJPQkVfRFJPUDsKKyAgICAgIH0KKyAgICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6eworICAgICAgICBHc3RQYWQgKnBlZXI7CisKKyAgICAgICAgaWYgKCFjdHgtPmlzX3JlZmVyZW5jZSkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBwZWVyID0gZ3N0X3BhZF9nZXRfcGVlciAocGFkKTsKKyAgICAgICAgaWYgKHBlZXIpIHsKKyAgICAgICAgICBnYm9vbGVhbiBvayA9IGdzdF9wYWRfc2VuZF9ldmVudCAocGVlciwgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpKTsKKworICAgICAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHBlZXIpOworCisgICAgICAgICAgaWYgKG9rKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBUaGlzIGlzIGluIHRoZSBjYXNlIHRoZSBtdXhlciBkb2Vzbid0IGFsbG93IHRoaXMgY2hhbmdlIG9mIGNhcHMgKi8KKyAgICAgICAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgICAgbG9ja2VkID0gVFJVRTsKKyAgICAgICAgY3R4LT5jYXBzX2NoYW5nZSA9IFRSVUU7CisKKyAgICAgICAgaWYgKHNwbGl0bXV4LT5vdXRwdXRfc3RhdGUgIT0gU1BMSVRNVVhfT1VUUFVUX1NUQVRFX1NUQVJUX05FWFRfRklMRSkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNwbGl0bXV4LAorICAgICAgICAgICAgICAiTmV3IGNhcHMgd2VyZSBub3QgYWNjZXB0ZWQuIFN3aXRjaGluZyBvdXRwdXQgZmlsZSIpOworICAgICAgICAgIGlmIChjdHgtPm91dF9lb3MgPT0gRkFMU0UpIHsKKyAgICAgICAgICAgIHNwbGl0bXV4LT5vdXRwdXRfc3RhdGUgPSBTUExJVE1VWF9PVVRQVVRfU1RBVEVfRU5ESU5HX0ZJTEU7CisgICAgICAgICAgICBHU1RfU1BMSVRNVVhfQlJPQURDQVNUX09VVFBVVCAoc3BsaXRtdXgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIExldHMgaXQgZmFsbCB0aHJvdWdoLCBpZiBpdCBmYWlscyBhZ2FpbiwgdGhlbiB0aGUgbXV4ZXIganVzdCBjYW4ndAorICAgICAgICAgKiBzdXBwb3J0IHRoaXMgZm9ybWF0LCBidXQgYXQgbGVhc3Qgd2UgaGF2ZSBhIGNsb3NlZCBmaWxlLgorICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSBldmVudHMgYXJlbid0IHBhc3NlZAorICAgICAqIHVudGlsIHRoZSBtdXhlciAvIHNpbmsgYXJlIHJlYWR5IGZvciBpdCAqLworICAgIGlmICghbG9ja2VkKQorICAgICAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICBpZiAoIWN0eC0+aXNfcmVmZXJlbmNlKQorICAgICAgY29tcGxldGVfb3Jfd2FpdF9vbl9vdXQgKHNwbGl0bXV4LCBjdHgpOworICAgIEdTVF9TUExJVE1VWF9VTkxPQ0sgKHNwbGl0bXV4KTsKKworICAgIC8qIERvbid0IHRyeSB0byBmb3J3YXJkIHN0aWNreSBldmVudHMgYmVmb3JlIHRoZSBuZXh0IGJ1ZmZlciBpcyB0aGVyZQorICAgICAqIGJlY2F1c2UgaXQgd291bGQgY2F1c2UgYSBuZXcgZmlsZSB0byBiZSBjcmVhdGVkIHdpdGhvdXQgdGhlIGZpcnN0CisgICAgICogYnVmZmVyIGJlaW5nIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBpZiAoY3R4LT5jYXBzX2NoYW5nZSAmJiBHU1RfRVZFTlRfSVNfU1RJQ0tZIChldmVudCkpIHsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgcmV0dXJuIEdTVF9QQURfUFJPQkVfSEFORExFRDsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiBHU1RfUEFEX1BST0JFX1BBU1M7CisgIH0KKworICAvKiBBbGxvdyBldmVyeXRoaW5nIHRocm91Z2ggdW50aWwgdGhlIGNvbmZpZ3VyZWQgbmV4dCBzdG9wcGluZyBwb2ludCAqLworICBHU1RfU1BMSVRNVVhfTE9DSyAoc3BsaXRtdXgpOworCisgIGJ1Zl9pbmZvID0gZ19xdWV1ZV9wb3BfdGFpbCAoJmN0eC0+cXVldWVkX2J1ZnMpOworICBpZiAoYnVmX2luZm8gPT0gTlVMTCkKKyAgICAvKiBDYW4gb25seSBoYXBwZW4gZHVlIHRvIGEgcG9vcmx5IHRpbWVkIGZsdXNoICovCisgICAgZ290byBiZWFjaDsKKworICAvKiBJZiB3ZSBoYXZlIHBvcHBlZCBhIGtleWZyYW1lLCBkZWNyZW1lbnQgdGhlIHF1ZXVlZF9nb3AgY291bnQgKi8KKyAgaWYgKGJ1Zl9pbmZvLT5rZXlmcmFtZSAmJiBzcGxpdG11eC0+cXVldWVkX2tleWZyYW1lcyA+IDApCisgICAgc3BsaXRtdXgtPnF1ZXVlZF9rZXlmcmFtZXMtLTsKKworICBjdHgtPm91dF9ydW5uaW5nX3RpbWUgPSBidWZfaW5mby0+cnVuX3RzOworICBjdHgtPmN1cl9vdXRfYnVmZmVyID0gZ3N0X3BhZF9wcm9iZV9pbmZvX2dldF9idWZmZXIgKGluZm8pOworCisgIEdTVF9MT0dfT0JKRUNUIChzcGxpdG11eCwKKyAgICAgICJQYWQgJSIgR1NUX1BUUl9GT1JNQVQgIiBidWZmZXIgd2l0aCBydW4gVFMgJSIgR1NUX1NUSU1FX0ZPUk1BVAorICAgICAgIiBzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBwYWQsIEdTVF9TVElNRV9BUkdTIChjdHgtPm91dF9ydW5uaW5nX3RpbWUpLCBidWZfaW5mby0+YnVmX3NpemUpOworCisgIGN0eC0+Y2Fwc19jaGFuZ2UgPSBGQUxTRTsKKworICBjb21wbGV0ZV9vcl93YWl0X29uX291dCAoc3BsaXRtdXgsIGN0eCk7CisKKyAgc3BsaXRtdXgtPm11eGVkX291dF9ieXRlcyArPSBidWZfaW5mby0+YnVmX3NpemU7CisKKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9wYWRfcHJvYmVfaW5mb19nZXRfYnVmZmVyIChpbmZvKTsKKyAgICBHU1RfTE9HX09CSkVDVCAocGFkLCAiUmV0dXJuaW5nIHRvIHBhc3MgYnVmZmVyICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAgICIgcnVuIHRzICUiIEdTVF9TVElNRV9GT1JNQVQsIGJ1ZiwKKyAgICAgICAgR1NUX1NUSU1FX0FSR1MgKGN0eC0+b3V0X3J1bm5pbmdfdGltZSkpOworICB9CisjZW5kaWYKKworICBjdHgtPmN1cl9vdXRfYnVmZmVyID0gTlVMTDsKKyAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworCisgIC8qIHBlbmRpbmdfZ2FwIGlzIHByb3RlY3RlZCBieSB0aGUgU1RSRUFNIGxvY2sgKi8KKyAgaWYgKGN0eC0+cGVuZGluZ19nYXApIHsKKyAgICAvKiBJZiB3ZSBwcmV2aW91c2x5IHN0b3JlZCBhIGdhcCBldmVudCwgc2VuZCBpdCBub3cgKi8KKyAgICBHc3RQYWQgKnBlZXIgPSBnc3RfcGFkX2dldF9wZWVyIChjdHgtPnNyY3BhZCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcGxpdG11eCwKKyAgICAgICAgIlBhZCAlIiBHU1RfUFRSX0ZPUk1BVCAiIHNlbmRpbmcgcGVuZGluZyBHQVAgZXZlbnQiLCBjdHgtPnNyY3BhZCk7CisKKyAgICBnc3RfcGFkX3NlbmRfZXZlbnQgKHBlZXIsIGN0eC0+cGVuZGluZ19nYXApOworICAgIGN0eC0+cGVuZGluZ19nYXAgPSBOVUxMOworCisgICAgZ3N0X29iamVjdF91bnJlZiAocGVlcik7CisgIH0KKworICBtcV9zdHJlYW1fYnVmX2ZyZWUgKGJ1Zl9pbmZvKTsKKworICByZXR1cm4gR1NUX1BBRF9QUk9CRV9QQVNTOworCitiZWFjaDoKKyAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICByZXR1cm4gR1NUX1BBRF9QUk9CRV9EUk9QOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3Jlc2VuZF9zdGlja3kgKEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiogZXZlbnQsIEdzdFBhZCAqIHBlZXIpCit7CisgIHJldHVybiBnc3RfcGFkX3NlbmRfZXZlbnQgKHBlZXIsIGdzdF9ldmVudF9yZWYgKCpldmVudCkpOworfQorCitzdGF0aWMgdm9pZAorcmVzdGFydF9jb250ZXh0IChNcVN0cmVhbUN0eCAqIGN0eCwgR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgpCit7CisgIEdzdFBhZCAqcGVlciA9IGdzdF9wYWRfZ2V0X3BlZXIgKGN0eC0+c3JjcGFkKTsKKworICBnc3RfcGFkX3N0aWNreV9ldmVudHNfZm9yZWFjaCAoY3R4LT5zcmNwYWQsCisgICAgICAoR3N0UGFkU3RpY2t5RXZlbnRzRm9yZWFjaEZ1bmN0aW9uKSAocmVzZW5kX3N0aWNreSksIHBlZXIpOworCisgIC8qIENsZWFyIEVPUyBmbGFnIGlmIG5vdCBhY3R1YWxseSBFT1MgKi8KKyAgY3R4LT5vdXRfZW9zID0gR1NUX1BBRF9JU19FT1MgKGN0eC0+c3JjcGFkKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChwZWVyKTsKK30KKworLyogQ2FsbGVkIHdpdGggbG9jayBoZWxkIHdoZW4gYSBmcmFnbWVudAorICogcmVhY2hlcyBFT1MgYW5kIGl0IGlzIHRpbWUgdG8gcmVzdGFydAorICogYSBuZXcgZnJhZ21lbnQKKyAqLworc3RhdGljIHZvaWQKK3N0YXJ0X25leHRfZnJhZ21lbnQgKEdzdFNwbGl0TXV4U2luayAqIHNwbGl0bXV4LCBNcVN0cmVhbUN0eCAqIGN0eCkKK3sKKyAgR3N0RWxlbWVudCAqbXV4ZXIsICpzaW5rOworCisgIC8qIDEgY2hhbmdlIHRvIG5ldyBmaWxlICovCisgIHNwbGl0bXV4LT5zd2l0Y2hpbmdfZnJhZ21lbnQgPSBUUlVFOworCisgIC8qIFdlIG5lZWQgdG8gZHJvcCB0aGUgc3BsaXRtdXggbG9jayB0byBhY3F1aXJlIHRoZSBzdGF0ZSBsb2NrCisgICAqIGhlcmUgYW5kIGVuc3VyZSB0aGVyZSdzIG5vIHJhY3kgc3RhdGUgY2hhbmdlIGdvaW5nIG9uIGVsc2V3aGVyZSAqLworICBtdXhlciA9IGdzdF9vYmplY3RfcmVmIChzcGxpdG11eC0+bXV4ZXIpOworICBzaW5rID0gZ3N0X29iamVjdF9yZWYgKHNwbGl0bXV4LT5hY3RpdmVfc2luayk7CisKKyAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICBHU1RfU1RBVEVfTE9DSyAoc3BsaXRtdXgpOworCisgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKG11eGVyLCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSAoc2luaywgVFJVRSk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobXV4ZXIsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzaW5rLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgaWYgKHNwbGl0bXV4LT5tdXhlZF9vdXRfYnl0ZXMgPiAwIHx8IHNwbGl0bXV4LT5mcmFnbWVudF9pZCA9PSAwKQorICAgIHNldF9uZXh0X2ZpbGVuYW1lIChzcGxpdG11eCwgY3R4KTsKKyAgc3BsaXRtdXgtPm11eGVkX291dF9ieXRlcyA9IDA7CisgIEdTVF9TUExJVE1VWF9VTkxPQ0sgKHNwbGl0bXV4KTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNpbmssIEdTVF9TVEFURV9UQVJHRVQgKHNwbGl0bXV4KSk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobXV4ZXIsIEdTVF9TVEFURV9UQVJHRVQgKHNwbGl0bXV4KSk7CisgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKG11eGVyLCBGQUxTRSk7CisgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHNpbmssIEZBTFNFKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rKTsKKyAgZ3N0X29iamVjdF91bnJlZiAobXV4ZXIpOworCisgIEdTVF9TUExJVE1VWF9MT0NLIChzcGxpdG11eCk7CisgIEdTVF9TVEFURV9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgc3BsaXRtdXgtPnN3aXRjaGluZ19mcmFnbWVudCA9IEZBTFNFOworICBkb19hc3luY19kb25lIChzcGxpdG11eCk7CisKKyAgc3BsaXRtdXgtPnJlYWR5X2Zvcl9vdXRwdXQgPSBUUlVFOworCisgIGdfbGlzdF9mb3JlYWNoIChzcGxpdG11eC0+Y29udGV4dHMsIChHRnVuYykgcmVzdGFydF9jb250ZXh0LCBzcGxpdG11eCk7CisKKyAgc2VuZF9mcmFnbWVudF9vcGVuZWRfY2xvc2VkX21zZyAoc3BsaXRtdXgsIFRSVUUpOworCisgIC8qIEZJWE1FOiBJcyB0aGlzIGFsd2F5cyB0aGUgY29ycmVjdCBuZXh0IHN0YXRlPyAqLworICBzcGxpdG11eC0+b3V0cHV0X3N0YXRlID0gU1BMSVRNVVhfT1VUUFVUX1NUQVRFX0FXQUlUSU5HX0NPTU1BTkQ7CisgIEdTVF9TUExJVE1VWF9CUk9BRENBU1RfT1VUUFVUIChzcGxpdG11eCk7Cit9CisKK3N0YXRpYyB2b2lkCitidXNfaGFuZGxlciAoR3N0QmluICogYmluLCBHc3RNZXNzYWdlICogbWVzc2FnZSkKK3sKKyAgR3N0U3BsaXRNdXhTaW5rICpzcGxpdG11eCA9IEdTVF9TUExJVE1VWF9TSU5LIChiaW4pOworCisgIHN3aXRjaCAoR1NUX01FU1NBR0VfVFlQRSAobWVzc2FnZSkpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VPUzoKKyAgICAgIC8qIElmIHRoZSBzdGF0ZSBpcyBkcmFpbmluZyBvdXQgdGhlIGN1cnJlbnQgZmlsZSwgZHJvcCB0aGlzIEVPUyAqLworICAgICAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKworICAgICAgc2VuZF9mcmFnbWVudF9vcGVuZWRfY2xvc2VkX21zZyAoc3BsaXRtdXgsIEZBTFNFKTsKKworICAgICAgaWYgKHNwbGl0bXV4LT5vdXRwdXRfc3RhdGUgPT0gU1BMSVRNVVhfT1VUUFVUX1NUQVRFX0VORElOR19GSUxFKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNwbGl0bXV4LCAiQ2F1Z2h0IEVPUyBhdCBlbmQgb2YgZnJhZ21lbnQsIGRyb3BwaW5nIik7CisgICAgICAgIHNwbGl0bXV4LT5vdXRwdXRfc3RhdGUgPSBTUExJVE1VWF9PVVRQVVRfU1RBVEVfU1RBUlRfTkVYVF9GSUxFOworICAgICAgICBHU1RfU1BMSVRNVVhfQlJPQURDQVNUX09VVFBVVCAoc3BsaXRtdXgpOworCisgICAgICAgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcGxpdG11eCwKKyAgICAgICAgICAgICJQYXNzaW5nIEVPUyBtZXNzYWdlLiBPdXRwdXQgc3RhdGUgJWQgbWF4X291dF9ydW5uaW5nX3RpbWUgJSIKKyAgICAgICAgICAgIEdTVF9TVElNRV9GT1JNQVQsIHNwbGl0bXV4LT5vdXRwdXRfc3RhdGUsCisgICAgICAgICAgICBHU1RfU1RJTUVfQVJHUyAoc3BsaXRtdXgtPm1heF9vdXRfcnVubmluZ190aW1lKSk7CisgICAgICB9CisgICAgICBHU1RfU1BMSVRNVVhfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0FTWU5DX1NUQVJUOgorICAgIGNhc2UgR1NUX01FU1NBR0VfQVNZTkNfRE9ORToKKyAgICAgIC8qIElnbm9yZSBzdGF0ZSBjaGFuZ2VzIGZyb20gb3VyIGNoaWxkcmVuIHdoaWxlIHN3aXRjaGluZyAqLworICAgICAgaWYgKHNwbGl0bXV4LT5zd2l0Y2hpbmdfZnJhZ21lbnQpIHsKKyAgICAgICAgaWYgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSkgPT0gKEdzdE9iamVjdCAqKSBzcGxpdG11eC0+YWN0aXZlX3NpbmsKKyAgICAgICAgICAgIHx8IEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSkgPT0gKEdzdE9iamVjdCAqKSBzcGxpdG11eC0+bXV4ZXIpIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICAgICAgICJJZ25vcmluZyBzdGF0ZSBjaGFuZ2UgZnJvbSBjaGlsZCAlIiBHU1RfUFRSX0ZPUk1BVAorICAgICAgICAgICAgICAiIHdoaWxlIHN3aXRjaGluZyIsIEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSkpOworICAgICAgICAgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01FU1NBR0VfV0FSTklORzoKKyAgICB7CisgICAgICBHRXJyb3IgKmdlcnJvciA9IE5VTEw7CisKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX3dhcm5pbmcgKG1lc3NhZ2UsICZnZXJyb3IsIE5VTEwpOworCisgICAgICBpZiAoZ19lcnJvcl9tYXRjaGVzIChnZXJyb3IsIEdTVF9TVFJFQU1fRVJST1IsIEdTVF9TVFJFQU1fRVJST1JfRk9STUFUKSkgeworICAgICAgICBHTGlzdCAqaXRlbTsKKyAgICAgICAgZ2Jvb2xlYW4gY2Fwc19jaGFuZ2UgPSBGQUxTRTsKKworICAgICAgICBHU1RfU1BMSVRNVVhfTE9DSyAoc3BsaXRtdXgpOworCisgICAgICAgIGZvciAoaXRlbSA9IHNwbGl0bXV4LT5jb250ZXh0czsgaXRlbTsgaXRlbSA9IGl0ZW0tPm5leHQpIHsKKyAgICAgICAgICBNcVN0cmVhbUN0eCAqY3R4ID0gaXRlbS0+ZGF0YTsKKworICAgICAgICAgIGlmIChjdHgtPmNhcHNfY2hhbmdlKSB7CisgICAgICAgICAgICBjYXBzX2NoYW5nZSA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBHU1RfU1BMSVRNVVhfVU5MT0NLIChzcGxpdG11eCk7CisKKyAgICAgICAgaWYgKGNhcHNfY2hhbmdlKSB7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHNwbGl0bXV4LAorICAgICAgICAgICAgICAiSWdub3Jpbmcgd2FybmluZyBjaGFuZ2UgZnJvbSBjaGlsZCAlIiBHU1RfUFRSX0ZPUk1BVAorICAgICAgICAgICAgICAiIHdoaWxlIHN3aXRjaGluZyBjYXBzIiwgR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSk7CisgICAgICAgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIEdTVF9CSU5fQ0xBU1MgKHBhcmVudF9jbGFzcyktPmhhbmRsZV9tZXNzYWdlIChiaW4sIG1lc3NhZ2UpOworfQorCitzdGF0aWMgdm9pZAorY3R4X3NldF91bmJsb2NrIChNcVN0cmVhbUN0eCAqIGN0eCkKK3sKKyAgY3R4LT5uZWVkX3VuYmxvY2sgPSBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK25lZWRfbmV3X2ZyYWdtZW50IChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCwKKyAgICBHc3RDbG9ja1RpbWUgcXVldWVkX3RpbWUsIEdzdENsb2NrVGltZSBxdWV1ZWRfZ29wX3RpbWUsCisgICAgZ3VpbnQ2NCBxdWV1ZWRfYnl0ZXMpCit7CisgIGd1aW50NjQgdGhyZXNoX2J5dGVzOworICBHc3RDbG9ja1RpbWUgdGhyZXNoX3RpbWU7CisgIGdib29sZWFuIGNoZWNrX3JvYnVzdF9tdXhpbmc7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzcGxpdG11eCk7CisgIHRocmVzaF9ieXRlcyA9IHNwbGl0bXV4LT50aHJlc2hvbGRfYnl0ZXM7CisgIHRocmVzaF90aW1lID0gc3BsaXRtdXgtPnRocmVzaG9sZF90aW1lOworICBjaGVja19yb2J1c3RfbXV4aW5nID0gc3BsaXRtdXgtPnVzZV9yb2J1c3RfbXV4aW5nCisgICAgICAmJiBzcGxpdG11eC0+bXV4ZXJfaGFzX3Jlc2VydmVkX3Byb3BzOworICBHU1RfT0JKRUNUX1VOTE9DSyAoc3BsaXRtdXgpOworCisgIC8qIEhhdmUgd2UgbXV4ZWQgYW55dGhpbmcgaW50byB0aGUgbmV3IGZpbGUgYXQgYWxsPyAqLworICBpZiAoc3BsaXRtdXgtPmZyYWdtZW50X3RvdGFsX2J5dGVzIDw9IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIFVzZXIgdG9sZCB1cyB0byBzcGxpdCBub3cgKi8KKyAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCYoc3BsaXRtdXgtPnNwbGl0X25vdykpID09IFRSVUUpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKHRocmVzaF9ieXRlcyA+IDAgJiYgcXVldWVkX2J5dGVzID49IHRocmVzaF9ieXRlcykKKyAgICByZXR1cm4gVFJVRTsgICAgICAgICAgICAgICAgLyogV291bGQgb3ZlcnJ1biBieXRlIGxpbWl0ICovCisKKyAgaWYgKHRocmVzaF90aW1lID4gMCAmJiBxdWV1ZWRfdGltZSA+PSB0aHJlc2hfdGltZSkKKyAgICByZXR1cm4gVFJVRTsgICAgICAgICAgICAgICAgLyogV291bGQgb3ZlcnJ1biBieXRlIGxpbWl0ICovCisKKyAgLyogVGltZWNvZGUtYmFzZWQgdGhyZXNob2xkIGFjY291bnRzIGZvciBwb3NzaWJsZSByb3VuZGluZyBlcnJvcnM6CisgICAqIDV1cyBzaG91bGQgYmUgYmlnZ2VyIHRoYW4gYWxsIHBvc3NpYmxlIHJvdW5kaW5nIGVycm9ycyBidXQgbm93aGVyZSBuZWFyCisgICAqIGJpZyBlbm91Z2ggdG8gc2tpcCB0byBhbm90aGVyIGZyYW1lICovCisgIGlmIChzcGxpdG11eC0+bmV4dF9tYXhfdGNfdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmCisgICAgICBzcGxpdG11eC0+cmVmZXJlbmNlX2N0eC0+aW5fcnVubmluZ190aW1lID4KKyAgICAgIHNwbGl0bXV4LT5uZXh0X21heF90Y190aW1lICsgNSAqIEdTVF9VU0VDT05EKQorICAgIHJldHVybiBUUlVFOyAgICAgICAgICAgICAgICAvKiBUaW1lY29kZSB0aHJlc2hvbGQgKi8KKworICBpZiAoY2hlY2tfcm9idXN0X211eGluZykgeworICAgIEdzdENsb2NrVGltZSBtdXhfcmVzZXJ2ZWRfcmVtYWluOworCisgICAgZ19vYmplY3RfZ2V0IChzcGxpdG11eC0+bXV4ZXIsCisgICAgICAgICJyZXNlcnZlZC1kdXJhdGlvbi1yZW1haW5pbmciLCAmbXV4X3Jlc2VydmVkX3JlbWFpbiwgTlVMTCk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICJNdXhlciByb2J1c3QgbXV4aW5nIHJlcG9ydCAtICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgIiByZW1haW5pbmcuIE5ldyBHT1Agd291bGQgZW5xdWV1ZSAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICBtdXhfcmVzZXJ2ZWRfcmVtYWluLCBxdWV1ZWRfZ29wX3RpbWUpOworCisgICAgaWYgKHF1ZXVlZF9nb3BfdGltZSA+PSBtdXhfcmVzZXJ2ZWRfcmVtYWluKSB7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHNwbGl0bXV4LAorICAgICAgICAgICJGaWxlIGlzIGFib3V0IHRvIHJ1biBvdXQgb2YgaGVhZGVyIHJvb20gLSAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgIiByZW1haW5pbmcuIE5ldyBHT1Agd291bGQgZW5xdWV1ZSAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgIi4gU3dpdGNoaW5nIHRvIG5ldyBmaWxlIiwgbXV4X3Jlc2VydmVkX3JlbWFpbiwgcXVldWVkX2dvcF90aW1lKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorCisgIC8qIENvbnRpbnVlIGFuZCBtdXggdGhpcyBHT1AgKi8KKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiBDYWxsZWQgd2l0aCBzcGxpdG11eCBsb2NrIGhlbGQgKi8KKy8qIENhbGxlZCB3aGVuIGVudGVyaW5nIFByb2Nlc3NpbmdDb21wbGV0ZUdvcCBzdGF0ZQorICogQXNzZXNzIGlmIG1xIGNvbnRlbnRzIG92ZXJmbG93ZWQgdGhlIGN1cnJlbnQgZmlsZQorICogICAtPiBJZiB5ZXMsIG5lZWQgdG8gc3dpdGNoIHRvIG5ldyBmaWxlCisgKiAgIC0+IGlmIG5vLCBzZXQgbWF4X291dF9ydW5uaW5nX3RpbWUgdG8gbGV0IHRoaXMgR09QIGluIGFuZAorICogICAgICBnbyB0byBDT0xMRUNUSU5HX0dPUF9TVEFSVCBzdGF0ZQorICovCitzdGF0aWMgdm9pZAoraGFuZGxlX2dhdGhlcmVkX2dvcCAoR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgpCit7CisgIGd1aW50NjQgcXVldWVkX2J5dGVzOworICBHc3RDbG9ja1RpbWVEaWZmIHF1ZXVlZF90aW1lID0gMDsKKyAgR3N0Q2xvY2tUaW1lRGlmZiBxdWV1ZWRfZ29wX3RpbWUgPSAwOworICBHc3RDbG9ja1RpbWVEaWZmIG5ld19vdXRfdHMgPSBzcGxpdG11eC0+cmVmZXJlbmNlX2N0eC0+aW5fcnVubmluZ190aW1lOworICBTcGxpdE11eE91dHB1dENvbW1hbmQgKmNtZDsKKworICAvKiBBc3Nlc3MgaWYgdGhlIG11bHRpcXVldWUgY29udGVudHMgb3ZlcmZsb3dlZCB0aGUgY3VycmVudCBmaWxlICovCisgIC8qIFdoZW4gY29uc2lkZXJpbmcgaWYgYSBuZXdseSBnYXRoZXJlZCBHT1Agb3ZlcmZsb3dzCisgICAqIHRoZSB0aW1lIGxpbWl0IGZvciB0aGUgZmlsZSwgb25seSBjb25zaWRlciB0aGUgcnVubmluZyB0aW1lIG9mIHRoZQorICAgKiByZWZlcmVuY2Ugc3RyZWFtLiBPdGhlciBzdHJlYW1zIG1pZ2h0IGhhdmUgcnVuIGFoZWFkIGEgbGl0dGxlIGJpdCwKKyAgICogYnV0IGV4dHJhIHBpZWNlcyB3b24ndCBiZSByZWxlYXNlZCB0byB0aGUgbXV4ZXIgYmV5b25kIHRoZSByZWZlcmVuY2UKKyAgICogc3RyZWFtIGN1dC1vZmYgYW55d2F5IC0gc28gaXQgZm9ybXMgdGhlIGxpbWl0LiAqLworICBxdWV1ZWRfYnl0ZXMgPSBzcGxpdG11eC0+ZnJhZ21lbnRfdG90YWxfYnl0ZXMgKyBzcGxpdG11eC0+Z29wX3RvdGFsX2J5dGVzOworICBxdWV1ZWRfdGltZSA9IHNwbGl0bXV4LT5yZWZlcmVuY2VfY3R4LT5pbl9ydW5uaW5nX3RpbWU7CisgIC8qIHF1ZXVlZF9nb3BfdGltZSB0cmFja3MgaG93IG11Y2ggdW53cml0dGVuIGRhdGEgdGhlcmUgaXMgd2FpdGluZyB0bworICAgKiBiZSB3cml0dGVuIHRvIHRoaXMgZnJhZ21lbnQgaW5jbHVkaW5nIHRoaXMgR09QICovCisgIGlmIChzcGxpdG11eC0+cmVmZXJlbmNlX2N0eC0+b3V0X3J1bm5pbmdfdGltZSAhPSBHU1RfQ0xPQ0tfU1RJTUVfTk9ORSkKKyAgICBxdWV1ZWRfZ29wX3RpbWUgPQorICAgICAgICBzcGxpdG11eC0+cmVmZXJlbmNlX2N0eC0+aW5fcnVubmluZ190aW1lIC0KKyAgICAgICAgc3BsaXRtdXgtPnJlZmVyZW5jZV9jdHgtPm91dF9ydW5uaW5nX3RpbWU7CisgIGVsc2UKKyAgICBxdWV1ZWRfZ29wX3RpbWUgPQorICAgICAgICBzcGxpdG11eC0+cmVmZXJlbmNlX2N0eC0+aW5fcnVubmluZ190aW1lIC0gc3BsaXRtdXgtPmdvcF9zdGFydF90aW1lOworCisgIEdTVF9MT0dfT0JKRUNUIChzcGxpdG11eCwgIiBxdWV1ZWRfYnl0ZXMgJSIgR19HVUlOVDY0X0ZPUk1BVCwgcXVldWVkX2J5dGVzKTsKKworICBnX2Fzc2VydCAocXVldWVkX2dvcF90aW1lID49IDApOworICBnX2Fzc2VydCAocXVldWVkX3RpbWUgPj0gc3BsaXRtdXgtPmZyYWdtZW50X3N0YXJ0X3RpbWUpOworCisgIHF1ZXVlZF90aW1lIC09IHNwbGl0bXV4LT5mcmFnbWVudF9zdGFydF90aW1lOworICBpZiAocXVldWVkX3RpbWUgPCBxdWV1ZWRfZ29wX3RpbWUpCisgICAgcXVldWVkX2dvcF90aW1lID0gcXVldWVkX3RpbWU7CisKKyAgLyogRXhwYW5kIHF1ZXVlZCBieXRlcyBlc3RpbWF0ZSBieSBtdXhlciBvdmVyaGVhZCAqLworICBxdWV1ZWRfYnl0ZXMgKz0gKHF1ZXVlZF9ieXRlcyAqIHNwbGl0bXV4LT5tdXhfb3ZlcmhlYWQpOworCisgIEdTVF9MT0dfT0JKRUNUIChzcGxpdG11eCwgIm1xIGF0IFRTICUiIEdTVF9TVElNRV9GT1JNQVQKKyAgICAgICIgYnl0ZXMgJSIgR19HVUlOVDY0X0ZPUk1BVCwgR1NUX1NUSU1FX0FSR1MgKHF1ZXVlZF90aW1lKSwgcXVldWVkX2J5dGVzKTsKKyAgaWYgKHNwbGl0bXV4LT5uZXh0X21heF90Y190aW1lICE9IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICJ0aW1lY29kZSBtcSBUUyAlIiBHU1RfVElNRV9GT1JNQVQgIiB2cyB0YXJnZXQgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChzcGxpdG11eC0+cmVmZXJlbmNlX2N0eC0+aW5fcnVubmluZ190aW1lKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoc3BsaXRtdXgtPm5leHRfbWF4X3RjX3RpbWUgKyA1ICogR1NUX1VTRUNPTkQpKTsKKyAgfQorCisgIC8qIENoZWNrIGZvciBvdmVycnVuIC0gaGF2ZSB3ZSBvdXRwdXQgYXQgbGVhc3Qgb25lIGJ5dGUgYW5kIG92ZXJydW4KKyAgICogZWl0aGVyIHRocmVzaG9sZD8gKi8KKyAgaWYgKG5lZWRfbmV3X2ZyYWdtZW50IChzcGxpdG11eCwgcXVldWVkX3RpbWUsIHF1ZXVlZF9nb3BfdGltZSwgcXVldWVkX2J5dGVzKSkgeworICAgIGdfYXRvbWljX2ludF9zZXQgKCYoc3BsaXRtdXgtPnNwbGl0X25vdyksIEZBTFNFKTsKKyAgICAvKiBUZWxsIHRoZSBvdXRwdXQgc2lkZSB0byBzdGFydCBhIG5ldyBmcmFnbWVudCAqLworICAgIEdTVF9JTkZPX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICJUaGlzIEdPUCAoZHVyICUiIEdTVF9TVElNRV9GT1JNQVQKKyAgICAgICAgIikgd291bGQgb3ZlcmZsb3cgdGhlIGZyYWdtZW50LCBTZW5kaW5nIHN0YXJ0X25ld19mcmFnbWVudCBjbWQiLAorICAgICAgICBHU1RfU1RJTUVfQVJHUyAoc3BsaXRtdXgtPnJlZmVyZW5jZV9jdHgtPmluX3J1bm5pbmdfdGltZSAtCisgICAgICAgICAgICBzcGxpdG11eC0+Z29wX3N0YXJ0X3RpbWUpKTsKKyAgICBjbWQgPSBvdXRfY21kX2J1Zl9uZXcgKCk7CisgICAgY21kLT5zdGFydF9uZXdfZnJhZ21lbnQgPSBUUlVFOworICAgIGdfcXVldWVfcHVzaF9oZWFkICgmc3BsaXRtdXgtPm91dF9jbWRfcSwgY21kKTsKKyAgICBHU1RfU1BMSVRNVVhfQlJPQURDQVNUX09VVFBVVCAoc3BsaXRtdXgpOworCisgICAgbmV3X291dF90cyA9IHNwbGl0bXV4LT5yZWZlcmVuY2VfY3R4LT5pbl9ydW5uaW5nX3RpbWU7CisgICAgc3BsaXRtdXgtPmZyYWdtZW50X3N0YXJ0X3RpbWUgPSBzcGxpdG11eC0+Z29wX3N0YXJ0X3RpbWU7CisgICAgc3BsaXRtdXgtPmZyYWdtZW50X3RvdGFsX2J5dGVzID0gMDsKKworICAgIGlmIChyZXF1ZXN0X25leHRfa2V5ZnJhbWUgKHNwbGl0bXV4LAorICAgICAgICAgICAgc3BsaXRtdXgtPnJlZmVyZW5jZV9jdHgtPnByZXZfaW5fa2V5ZnJhbWUpID09IEZBTFNFKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNwbGl0bXV4LAorICAgICAgICAgICJDb3VsZCBub3QgcmVxdWVzdCBhIGtleWZyYW1lLiBGaWxlcyBtYXkgbm90IHNwbGl0IGF0IHRoZSBleGFjdCBsb2NhdGlvbiB0aGV5IHNob3VsZCIpOworICAgIH0KKyAgICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZzcGxpdG11eC0+cmVmZXJlbmNlX2N0eC0+cHJldl9pbl9rZXlmcmFtZSwgTlVMTCk7CisgIH0KKworICAvKiBBbmQgc2V0IHVwIHRvIGNvbGxlY3QgdGhlIG5leHQgR09QICovCisgIGlmICghc3BsaXRtdXgtPnJlZmVyZW5jZV9jdHgtPmluX2VvcykgeworICAgIHNwbGl0bXV4LT5pbnB1dF9zdGF0ZSA9IFNQTElUTVVYX0lOUFVUX1NUQVRFX0NPTExFQ1RJTkdfR09QX1NUQVJUOworICAgIHNwbGl0bXV4LT5nb3Bfc3RhcnRfdGltZSA9IG5ld19vdXRfdHM7CisgIH0gZWxzZSB7CisgICAgLyogVGhpcyBpcyBwcm9iYWJseSBhbHJlYWR5IHRoZSBjdXJyZW50IHN0YXRlLCBidXQganVzdCBpbiBjYXNlOiAqLworICAgIHNwbGl0bXV4LT5pbnB1dF9zdGF0ZSA9IFNQTElUTVVYX0lOUFVUX1NUQVRFX0ZJTklTSElOR19VUDsKKyAgICBuZXdfb3V0X3RzID0gR1NUX0NMT0NLX1NUSU1FX05PTkU7ICAvKiBFT1MgcnVucyB1bnRpbCBmb3JldmVyICovCisgIH0KKworICAvKiBBbmQgd2FrZSBhbGwgaW5wdXQgY29udGV4dHMgdG8gc2VuZCBhIHdha2UtdXAgZXZlbnQgKi8KKyAgZ19saXN0X2ZvcmVhY2ggKHNwbGl0bXV4LT5jb250ZXh0cywgKEdGdW5jKSBjdHhfc2V0X3VuYmxvY2ssIE5VTEwpOworICBHU1RfU1BMSVRNVVhfQlJPQURDQVNUX0lOUFVUIChzcGxpdG11eCk7CisKKyAgLyogTm93IGVpdGhlciB3YXkgLSBlaXRoZXIgdGhlcmUgd2FzIG5vIG92ZXJmbG93LCBvciB3ZSByZXF1ZXN0ZWQgYSBuZXcgZnJhZ21lbnQ6IHJlbGVhc2UgdGhpcyBHT1AgKi8KKyAgc3BsaXRtdXgtPmZyYWdtZW50X3RvdGFsX2J5dGVzICs9IHNwbGl0bXV4LT5nb3BfdG90YWxfYnl0ZXM7CisKKyAgaWYgKHNwbGl0bXV4LT5nb3BfdG90YWxfYnl0ZXMgPiAwKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNwbGl0bXV4LAorICAgICAgICAiUmVsZWFzaW5nIEdPUCB0byBvdXRwdXQuIEJ5dGVzIGluIGZyYWdtZW50IG5vdyAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICIgdGltZSAlIiBHU1RfU1RJTUVfRk9STUFULAorICAgICAgICBzcGxpdG11eC0+ZnJhZ21lbnRfdG90YWxfYnl0ZXMsIEdTVF9TVElNRV9BUkdTIChxdWV1ZWRfdGltZSkpOworCisgICAgLyogU2VuZCB0aGlzIEdPUCB0byB0aGUgb3V0cHV0IGNvbW1hbmQgcXVldWUgKi8KKyAgICBjbWQgPSBvdXRfY21kX2J1Zl9uZXcgKCk7CisgICAgY21kLT5zdGFydF9uZXdfZnJhZ21lbnQgPSBGQUxTRTsKKyAgICBjbWQtPm1heF9vdXRwdXRfdHMgPSBuZXdfb3V0X3RzOworICAgIEdTVF9MT0dfT0JKRUNUIChzcGxpdG11eCwgIlNlbmRpbmcgR09QIGNtZCB0byBvdXRwdXQgZm9yIFRTICUiCisgICAgICAgIEdTVF9TVElNRV9GT1JNQVQsIEdTVF9TVElNRV9BUkdTIChuZXdfb3V0X3RzKSk7CisgICAgZ19xdWV1ZV9wdXNoX2hlYWQgKCZzcGxpdG11eC0+b3V0X2NtZF9xLCBjbWQpOworCisgICAgR1NUX1NQTElUTVVYX0JST0FEQ0FTVF9PVVRQVVQgKHNwbGl0bXV4KTsKKyAgfQorCisgIHNwbGl0bXV4LT5nb3BfdG90YWxfYnl0ZXMgPSAwOworfQorCisvKiBDYWxsZWQgd2l0aCBzcGxpdG11eCBsb2NrIGhlbGQgKi8KKy8qIENhbGxlZCBmcm9tIGVhY2ggaW5wdXQgcGFkIHdoZW4gaXQgaXMgaGFzIGFsbCB0aGUgcGllY2VzCisgKiBmb3IgYSBHT1Agb3IgRU9TLCBzdGFydGluZyB3aXRoIHRoZSByZWZlcmVuY2UgcGFkIHdoaWNoIGhhcyBzZXQgdGhlCisgKiBzcGxpdG11eC0+bWF4X2luX3J1bm5pbmdfdGltZQorICovCitzdGF0aWMgdm9pZAorY2hlY2tfY29tcGxldGVkX2dvcCAoR3N0U3BsaXRNdXhTaW5rICogc3BsaXRtdXgsIE1xU3RyZWFtQ3R4ICogY3R4KQoreworICBHTGlzdCAqY3VyOworICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgLyogT24gRU5ESU5HX0ZJTEUsIHRoZSByZWZlcmVuY2Ugc3RyZWFtIHNlbmRzIGEgY29tbWFuZCB0byBzdGFydCBhIG5ldworICAgKiBmcmFnbWVudCwgdGhlbiByZWxlYXNlcyB0aGUgR09QIGZvciBvdXRwdXQgaW4gdGhlIG5ldyBmcmFnbWVudC4KKyAgICogIElmIHNvbWVzIHN0cmVhbXMgcmVjZWl2ZWQgbm8gYnVmZmVyIGR1cmluZyB0aGUgbGFzdCBHT1AgdGhhdCBvdmVycmFuLAorICAgKiBiZWNhdXNlIGl0cyBuZXh0IGJ1ZmZlciBoYXMgYSB0aW1lc3RhbXAgYmlnZ2VyIHRoYW4KKyAgICogY3R4LT5tYXhfaW5fcnVubmluZ190aW1lLCBpdHMgcXVldWUgaXMgZW1wdHkuIEluIHRoYXQgY2FzZSB0aGUgb25seQorICAgKiB3YXkgdG8gd2FrZXVwIHRoZSBvdXRwdXQgdGhyZWFkIGlzIGJ5IGluamVjdGluZyBhbiBldmVudCBpbiB0aGUKKyAgICogcXVldWUuIFRoaXMgdXN1YWxseSBoYXBwZW4gd2l0aCBzdWJ0aXRsZSBzdHJlYW1zLgorICAgKiBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTc2MzcxMS4gKi8KKyAgaWYgKGN0eC0+bmVlZF91bmJsb2NrKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGN0eC0+c2lua3BhZCwgIlNlbmRpbmcgc3BsaXRtdXhzaW5rLXVuYmxvY2sgZXZlbnQiKTsKKyAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU0gfAorICAgICAgICBHU1RfRVZFTlRfVFlQRV9TRVJJQUxJWkVELAorICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoInNwbGl0bXV4c2luay11bmJsb2NrIiwgInRpbWVzdGFtcCIsCisgICAgICAgICAgICBHX1RZUEVfSU5UNjQsIHNwbGl0bXV4LT5tYXhfaW5fcnVubmluZ190aW1lLCBOVUxMKSk7CisKKyAgICBHU1RfU1BMSVRNVVhfVU5MT0NLIChzcGxpdG11eCk7CisgICAgZ3N0X3BhZF9zZW5kX2V2ZW50IChjdHgtPnNpbmtwYWQsIGV2ZW50KTsKKyAgICBHU1RfU1BMSVRNVVhfTE9DSyAoc3BsaXRtdXgpOworCisgICAgY3R4LT5uZWVkX3VuYmxvY2sgPSBGQUxTRTsKKyAgICBHU1RfU1BMSVRNVVhfQlJPQURDQVNUX0lOUFVUIChzcGxpdG11eCk7CisgICAgLyogc3RhdGUgbWF5IGhhdmUgY2hhbmdlZCB3aGlsZSB3ZSB3ZXJlIHVubG9ja2VkLiBMb29wIGFnYWluIGlmIHNvICovCisgICAgaWYgKHNwbGl0bXV4LT5pbnB1dF9zdGF0ZSAhPSBTUExJVE1VWF9JTlBVVF9TVEFURV9XQUlUSU5HX0dPUF9DT0xMRUNUKQorICAgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHNwbGl0bXV4LT5pbnB1dF9zdGF0ZSA9PSBTUExJVE1VWF9JTlBVVF9TVEFURV9XQUlUSU5HX0dPUF9DT0xMRUNUKSB7CisgICAgZ2Jvb2xlYW4gcmVhZHkgPSBUUlVFOworCisgICAgLyogSXRlcmF0ZSBlYWNoIHBhZCwgYW5kIGNoZWNrIHRoYXQgdGhlIGlucHV0IHJ1bm5pbmcgdGltZSBpcyBhdCBsZWFzdAorICAgICAqIHVwIHRvIHRoZSByZWZlcmVuY2UgcnVubmluZyB0aW1lLCBhbmQgaWYgc28gaGFuZGxlIHRoZSBjb2xsZWN0ZWQgR09QICovCisgICAgR1NUX0xPR19PQkpFQ1QgKHNwbGl0bXV4LCAiQ2hlY2tpbmcgR09QIGNvbGxlY3RlZCwgTWF4IGluIHJ1bm5pbmcgdGltZSAlIgorICAgICAgICBHU1RfU1RJTUVfRk9STUFUICIgY3R4ICVwIiwKKyAgICAgICAgR1NUX1NUSU1FX0FSR1MgKHNwbGl0bXV4LT5tYXhfaW5fcnVubmluZ190aW1lKSwgY3R4KTsKKyAgICBmb3IgKGN1ciA9IGdfbGlzdF9maXJzdCAoc3BsaXRtdXgtPmNvbnRleHRzKTsgY3VyICE9IE5VTEw7CisgICAgICAgIGN1ciA9IGdfbGlzdF9uZXh0IChjdXIpKSB7CisgICAgICBNcVN0cmVhbUN0eCAqdG1wY3R4ID0gKE1xU3RyZWFtQ3R4ICopIChjdXItPmRhdGEpOworCisgICAgICBHU1RfTE9HX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICAgIkNvbnRleHQgJXAgKHNyYyBwYWQgJSIgR1NUX1BUUl9GT1JNQVQgIikgVFMgJSIgR1NUX1NUSU1FX0ZPUk1BVAorICAgICAgICAgICIgRU9TICVkIiwgdG1wY3R4LCB0bXBjdHgtPnNyY3BhZCwKKyAgICAgICAgICBHU1RfU1RJTUVfQVJHUyAodG1wY3R4LT5pbl9ydW5uaW5nX3RpbWUpLCB0bXBjdHgtPmluX2Vvcyk7CisKKyAgICAgIGlmIChzcGxpdG11eC0+bWF4X2luX3J1bm5pbmdfdGltZSAhPSBHU1RfQ0xPQ0tfU1RJTUVfTk9ORSAmJgorICAgICAgICAgIHRtcGN0eC0+aW5fcnVubmluZ190aW1lIDwgc3BsaXRtdXgtPm1heF9pbl9ydW5uaW5nX3RpbWUgJiYKKyAgICAgICAgICAhdG1wY3R4LT5pbl9lb3MpIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHNwbGl0bXV4LAorICAgICAgICAgICAgIkNvbnRleHQgJXAgKHNyYyBwYWQgJSIgR1NUX1BUUl9GT1JNQVQgIikgbm90IHJlYWR5LiBXZSdsbCBzbGVlcCIsCisgICAgICAgICAgICB0bXBjdHgsIHRtcGN0eC0+c3JjcGFkKTsKKyAgICAgICAgcmVhZHkgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChyZWFkeSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICAgIkNvbGxlY3RlZCBHT1AgaXMgY29tcGxldGUuIFByb2Nlc3NpbmcgKGN0eCAlcCkiLCBjdHgpOworICAgICAgLyogQWxsIHBhZHMgaGF2ZSBhIGNvbXBsZXRlIEdPUCwgcmVsZWFzZSBpdCBpbnRvIHRoZSBtdWx0aXF1ZXVlICovCisgICAgICBoYW5kbGVfZ2F0aGVyZWRfZ29wIChzcGxpdG11eCk7CisgICAgfQorICB9CisKKyAgLyogSWYgdXBzdHJlYW0gcmVhY2hlZCBFT1Mgd2UgYXJlIG5vdCBleHBlY3RpbmcgbW9yZSBkYXRhLCBubyBuZWVkIHRvIHdhaXQKKyAgICogaGVyZS4gKi8KKyAgaWYgKGN0eC0+aW5fZW9zKQorICAgIHJldHVybjsKKworICAvKiBTb21lIHBhZCBpcyBub3QgeWV0IHJlYWR5LCBvciBHT1AgaXMgYmVpbmcgcHVzaGVkCisgICAqIGVpdGhlciB3YXksIHNsZWVwIGFuZCB3YWl0IHRvIGdldCB3b2tlbiAqLworICB3aGlsZSAoc3BsaXRtdXgtPmlucHV0X3N0YXRlID09IFNQTElUTVVYX0lOUFVUX1NUQVRFX1dBSVRJTkdfR09QX0NPTExFQ1QgJiYKKyAgICAgICFjdHgtPmZsdXNoaW5nICYmCisgICAgICAoY3R4LT5pbl9ydW5uaW5nX3RpbWUgPj0gc3BsaXRtdXgtPm1heF9pbl9ydW5uaW5nX3RpbWUpICYmCisgICAgICAoc3BsaXRtdXgtPm1heF9pbl9ydW5uaW5nX3RpbWUgIT0gR1NUX0NMT0NLX1NUSU1FX05PTkUpKSB7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoc3BsaXRtdXgsICJTbGVlcGluZyBmb3IgR09QIGNvbGxlY3Rpb24gKGN0eCAlcCkiLCBjdHgpOworICAgIEdTVF9TUExJVE1VWF9XQUlUX0lOUFVUIChzcGxpdG11eCk7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNwbGl0bXV4LCAiRG9uZSB3YWl0aW5nIGZvciBjb21wbGV0ZSBHT1AgKGN0eCAlcCkiLCBjdHgpOworICB9Cit9CisKK3N0YXRpYyBHc3RQYWRQcm9iZVJldHVybgoraGFuZGxlX21xX2lucHV0IChHc3RQYWQgKiBwYWQsIEdzdFBhZFByb2JlSW5mbyAqIGluZm8sIE1xU3RyZWFtQ3R4ICogY3R4KQoreworICBHc3RTcGxpdE11eFNpbmsgKnNwbGl0bXV4ID0gY3R4LT5zcGxpdG11eDsKKyAgR3N0QnVmZmVyICpidWY7CisgIE1xU3RyZWFtQnVmICpidWZfaW5mbyA9IE5VTEw7CisgIEdzdENsb2NrVGltZSB0czsKKyAgZ2Jvb2xlYW4gbG9vcF9hZ2FpbjsKKyAgZ2Jvb2xlYW4ga2V5ZnJhbWUgPSBGQUxTRTsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiRmlyZWQgcHJvYmUgdHlwZSAweCV4IiwgaW5mby0+dHlwZSk7CisKKyAgLyogRklYTUU6IEhhbmRsZSBidWZmZXIgbGlzdHMsIHVudGlsIHRoZW4gbWFrZSBpdCBjbGVhciB0aGV5IHdvbid0IHdvcmsgKi8KKyAgaWYgKGluZm8tPnR5cGUgJiBHU1RfUEFEX1BST0JFX1RZUEVfQlVGRkVSX0xJU1QpIHsKKyAgICBnX3dhcm5pbmcgKCJCdWZmZXIgbGlzdCBoYW5kbGluZyBub3QgaW1wbGVtZW50ZWQiKTsKKyAgICByZXR1cm4gR1NUX1BBRF9QUk9CRV9EUk9QOworICB9CisgIGlmIChpbmZvLT50eXBlICYgR1NUX1BBRF9QUk9CRV9UWVBFX0VWRU5UX0RPV05TVFJFQU0gfHwKKyAgICAgIGluZm8tPnR5cGUgJiBHU1RfUEFEX1BST0JFX1RZUEVfRVZFTlRfRkxVU0gpIHsKKyAgICBHc3RFdmVudCAqZXZlbnQgPSBnc3RfcGFkX3Byb2JlX2luZm9fZ2V0X2V2ZW50IChpbmZvKTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJFdmVudCAlIiBHU1RfUFRSX0ZPUk1BVCwgZXZlbnQpOworCisgICAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgICAgICBnc3RfZXZlbnRfY29weV9zZWdtZW50IChldmVudCwgJmN0eC0+aW5fc2VnbWVudCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgICAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJmN0eC0+aW5fc2VnbWVudCwgR1NUX0ZPUk1BVF9VTkRFRklORUQpOworICAgICAgICBjdHgtPmluX2VvcyA9IEZBTFNFOworICAgICAgICBjdHgtPmluX3J1bm5pbmdfdGltZSA9IEdTVF9DTE9DS19TVElNRV9OT05FOworICAgICAgICBHU1RfU1BMSVRNVVhfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfRVZFTlRfRU9TOgorICAgICAgICBHU1RfU1BMSVRNVVhfTE9DSyAoc3BsaXRtdXgpOworICAgICAgICBjdHgtPmluX2VvcyA9IFRSVUU7CisKKyAgICAgICAgaWYgKHNwbGl0bXV4LT5pbnB1dF9zdGF0ZSA9PSBTUExJVE1VWF9JTlBVVF9TVEFURV9TVE9QUEVEKQorICAgICAgICAgIGdvdG8gYmVhY2g7CisKKyAgICAgICAgaWYgKGN0eC0+aXNfcmVmZXJlbmNlKSB7CisgICAgICAgICAgR1NUX0lORk9fT0JKRUNUIChzcGxpdG11eCwgIkdvdCBSZWZlcmVuY2UgRU9TLiBGaW5pc2hpbmcgdXAiKTsKKyAgICAgICAgICAvKiBjaGVja19jb21wbGV0ZWRfZ29wIHdpbGwgYWN0IGFzIGlmIHRoaXMgaXMgYSBuZXcga2V5ZnJhbWUgd2l0aCBpbmZpbml0ZSB0aW1lc3RhbXAgKi8KKyAgICAgICAgICBzcGxpdG11eC0+aW5wdXRfc3RhdGUgPSBTUExJVE1VWF9JTlBVVF9TVEFURV9XQUlUSU5HX0dPUF9DT0xMRUNUOworICAgICAgICAgIC8qIFdha2UgdXAgb3RoZXIgaW5wdXQgcGFkcyB0byBjb2xsZWN0IHRoaXMgR09QICovCisgICAgICAgICAgR1NUX1NQTElUTVVYX0JST0FEQ0FTVF9JTlBVVCAoc3BsaXRtdXgpOworICAgICAgICAgIGNoZWNrX2NvbXBsZXRlZF9nb3AgKHNwbGl0bXV4LCBjdHgpOworICAgICAgICB9IGVsc2UgaWYgKHNwbGl0bXV4LT5pbnB1dF9zdGF0ZSA9PQorICAgICAgICAgICAgU1BMSVRNVVhfSU5QVVRfU1RBVEVfV0FJVElOR19HT1BfQ09MTEVDVCkgeworICAgICAgICAgIC8qIElmIHdlIGFyZSB3YWl0aW5nIGZvciBhIEdPUCB0byBiZSBjb21wbGV0ZWQgKGllLCBmb3IgYXV4CisgICAgICAgICAgICogcGFkcyB0byBjYXRjaCB1cCksIHRoZW4gdGhpcyBwYWQgaXMgY29tcGxldGUsIHNvIGNoZWNrCisgICAgICAgICAgICogaWYgdGhlIHdob2xlIEdPUCBpcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBjaGVja19jb21wbGV0ZWRfZ29wIChzcGxpdG11eCwgY3R4KTsKKyAgICAgICAgfQorICAgICAgICBHU1RfU1BMSVRNVVhfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfRVZFTlRfR0FQOnsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIGdhcF90czsKKyAgICAgICAgR3N0Q2xvY2tUaW1lRGlmZiBydGltZTsKKworICAgICAgICBnc3RfZXZlbnRfcGFyc2VfZ2FwIChldmVudCwgJmdhcF90cywgTlVMTCk7CisgICAgICAgIGlmIChnYXBfdHMgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBHU1RfU1BMSVRNVVhfTE9DSyAoc3BsaXRtdXgpOworCisgICAgICAgIGlmIChzcGxpdG11eC0+aW5wdXRfc3RhdGUgPT0gU1BMSVRNVVhfSU5QVVRfU1RBVEVfU1RPUFBFRCkKKyAgICAgICAgICBnb3RvIGJlYWNoOworICAgICAgICBydGltZSA9IG15X3NlZ21lbnRfdG9fcnVubmluZ190aW1lICgmY3R4LT5pbl9zZWdtZW50LCBnYXBfdHMpOworCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJIYXZlIEdBUCB3LyB0cyAlIiBHU1RfU1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1NUSU1FX0FSR1MgKHJ0aW1lKSk7CisKKyAgICAgICAgaWYgKGN0eC0+aXNfcmVmZXJlbmNlCisgICAgICAgICAgICAmJiBzcGxpdG11eC0+ZnJhZ21lbnRfc3RhcnRfdGltZSA9PSBHU1RfQ0xPQ0tfU1RJTUVfTk9ORSkgeworICAgICAgICAgIHNwbGl0bXV4LT5nb3Bfc3RhcnRfdGltZSA9IHNwbGl0bXV4LT5mcmFnbWVudF9zdGFydF90aW1lID0gcnRpbWU7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHNwbGl0bXV4LCAiTXV4IHN0YXJ0IHRpbWUgbm93ICUiIEdTVF9TVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgIEdTVF9TVElNRV9BUkdTIChzcGxpdG11eC0+ZnJhZ21lbnRfc3RhcnRfdGltZSkpOworICAgICAgICAgIC8qIEFsc28gdGFrZSB0aGlzIGFzIHRoZSBmaXJzdCBzdGFydCB0aW1lIHdoZW4gc3RhcnRpbmcgdXAsCisgICAgICAgICAgICogc28gdGhhdCB3ZSBzdGFydCBjb3VudGluZyBvdmVyZmxvdyBmcm9tIHRoZSBmaXJzdCBmcmFtZSAqLworICAgICAgICAgIGlmICghR1NUX0NMT0NLX1NUSU1FX0lTX1ZBTElEIChzcGxpdG11eC0+bWF4X2luX3J1bm5pbmdfdGltZSkpCisgICAgICAgICAgICBzcGxpdG11eC0+bWF4X2luX3J1bm5pbmdfdGltZSA9IHNwbGl0bXV4LT5mcmFnbWVudF9zdGFydF90aW1lOworICAgICAgICB9CisKKyAgICAgICAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gR1NUX1BBRF9QUk9CRV9QQVNTOworICB9IGVsc2UgaWYgKGluZm8tPnR5cGUgJiBHU1RfUEFEX1BST0JFX1RZUEVfUVVFUllfRE9XTlNUUkVBTSkgeworICAgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKEdTVF9RVUVSWSAoaW5mby0+ZGF0YSkpKSB7CisgICAgICBjYXNlIEdTVF9RVUVSWV9BTExPQ0FUSU9OOgorICAgICAgICByZXR1cm4gR1NUX1BBRF9QUk9CRV9EUk9QOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEdTVF9QQURfUFJPQkVfUEFTUzsKKyAgICB9CisgIH0KKworICBidWYgPSBnc3RfcGFkX3Byb2JlX2luZm9fZ2V0X2J1ZmZlciAoaW5mbyk7CisgIGJ1Zl9pbmZvID0gbXFfc3RyZWFtX2J1Zl9uZXcgKCk7CisKKyAgaWYgKEdTVF9CVUZGRVJfUFRTX0lTX1ZBTElEIChidWYpKQorICAgIHRzID0gR1NUX0JVRkZFUl9QVFMgKGJ1Zik7CisgIGVsc2UKKyAgICB0cyA9IEdTVF9CVUZGRVJfRFRTIChidWYpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJCdWZmZXIgVFMgaXMgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTICh0cykpOworCisgIEdTVF9TUExJVE1VWF9MT0NLIChzcGxpdG11eCk7CisKKyAgaWYgKHNwbGl0bXV4LT5pbnB1dF9zdGF0ZSA9PSBTUExJVE1VWF9JTlBVVF9TVEFURV9TVE9QUEVEKQorICAgIGdvdG8gYmVhY2g7CisKKyAgLyogSWYgdGhpcyBidWZmZXIgaGFzIGEgdGltZXN0YW1wLCBhZHZhbmNlIHRoZSBpbnB1dCB0aW1lc3RhbXAgb2YgdGhlCisgICAqIHN0cmVhbSAqLworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHRzKSkgeworICAgIEdzdENsb2NrVGltZURpZmYgcnVubmluZ190aW1lID0KKyAgICAgICAgbXlfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZjdHgtPmluX3NlZ21lbnQsIHRzKTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJCdWZmZXIgcnVubmluZyBUUyBpcyAlIiBHU1RfU1RJTUVfRk9STUFULAorICAgICAgICBHU1RfU1RJTUVfQVJHUyAocnVubmluZ190aW1lKSk7CisKKyAgICBpZiAoR1NUX0NMT0NLX1NUSU1FX0lTX1ZBTElEIChydW5uaW5nX3RpbWUpCisgICAgICAgICYmIHJ1bm5pbmdfdGltZSA+IGN0eC0+aW5fcnVubmluZ190aW1lKQorICAgICAgY3R4LT5pbl9ydW5uaW5nX3RpbWUgPSBydW5uaW5nX3RpbWU7CisgIH0KKworICAvKiBUcnkgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBydW5uaW5nIHRpbWUgKi8KKyAgaWYgKCFHU1RfQ0xPQ0tfU1RJTUVfSVNfVkFMSUQgKGN0eC0+aW5fcnVubmluZ190aW1lKSkgeworICAgIGN0eC0+aW5fcnVubmluZ190aW1lID0KKyAgICAgICAgbXlfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZjdHgtPmluX3NlZ21lbnQsIGN0eC0+aW5fc2VnbWVudC5zdGFydCk7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiaW4gcnVubmluZyB0aW1lIG5vdyAlIiBHU1RfU1RJTUVfRk9STUFULAorICAgICAgR1NUX1NUSU1FX0FSR1MgKGN0eC0+aW5fcnVubmluZ190aW1lKSk7CisKKyAgYnVmX2luZm8tPnJ1bl90cyA9IGN0eC0+aW5fcnVubmluZ190aW1lOworICBidWZfaW5mby0+YnVmX3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworICBidWZfaW5mby0+ZHVyYXRpb24gPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpOworCisgIC8qIGluaXRpYWxpemUgZnJhZ21lbnRfc3RhcnRfdGltZSAqLworICBpZiAoY3R4LT5pc19yZWZlcmVuY2UKKyAgICAgICYmIHNwbGl0bXV4LT5mcmFnbWVudF9zdGFydF90aW1lID09IEdTVF9DTE9DS19TVElNRV9OT05FKSB7CisgICAgc3BsaXRtdXgtPmdvcF9zdGFydF90aW1lID0gc3BsaXRtdXgtPmZyYWdtZW50X3N0YXJ0X3RpbWUgPSBidWZfaW5mby0+cnVuX3RzOworICAgIEdTVF9MT0dfT0JKRUNUIChzcGxpdG11eCwgIk11eCBzdGFydCB0aW1lIG5vdyAlIiBHU1RfU1RJTUVfRk9STUFULAorICAgICAgICBHU1RfU1RJTUVfQVJHUyAoc3BsaXRtdXgtPmZyYWdtZW50X3N0YXJ0X3RpbWUpKTsKKyAgICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZjdHgtPnByZXZfaW5fa2V5ZnJhbWUsIGJ1Zik7CisKKyAgICAvKiBBbHNvIHRha2UgdGhpcyBhcyB0aGUgZmlyc3Qgc3RhcnQgdGltZSB3aGVuIHN0YXJ0aW5nIHVwLAorICAgICAqIHNvIHRoYXQgd2Ugc3RhcnQgY291bnRpbmcgb3ZlcmZsb3cgZnJvbSB0aGUgZmlyc3QgZnJhbWUgKi8KKyAgICBpZiAoIUdTVF9DTE9DS19TVElNRV9JU19WQUxJRCAoc3BsaXRtdXgtPm1heF9pbl9ydW5uaW5nX3RpbWUpKQorICAgICAgc3BsaXRtdXgtPm1heF9pbl9ydW5uaW5nX3RpbWUgPSBzcGxpdG11eC0+ZnJhZ21lbnRfc3RhcnRfdGltZTsKKyAgICBpZiAocmVxdWVzdF9uZXh0X2tleWZyYW1lIChzcGxpdG11eCwgY3R4LT5wcmV2X2luX2tleWZyYW1lKSA9PSBGQUxTRSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcGxpdG11eCwKKyAgICAgICAgICAiQ291bGQgbm90IHJlcXVlc3QgYSBrZXlmcmFtZS4gRmlsZXMgbWF5IG5vdCBzcGxpdCBhdCB0aGUgZXhhY3QgbG9jYXRpb24gdGhleSBzaG91bGQiKTsKKyAgICB9CisgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmc3BsaXRtdXgtPnJlZmVyZW5jZV9jdHgtPnByZXZfaW5fa2V5ZnJhbWUsIE5VTEwpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiQnVmIFRTICUiIEdTVF9TVElNRV9GT1JNQVQKKyAgICAgICIgdG90YWwgR09QIGJ5dGVzICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBHU1RfU1RJTUVfQVJHUyAoYnVmX2luZm8tPnJ1bl90cyksIHNwbGl0bXV4LT5nb3BfdG90YWxfYnl0ZXMpOworCisgIGxvb3BfYWdhaW4gPSBUUlVFOworICBkbyB7CisgICAgaWYgKGN0eC0+Zmx1c2hpbmcpCisgICAgICBicmVhazsKKworICAgIHN3aXRjaCAoc3BsaXRtdXgtPmlucHV0X3N0YXRlKSB7CisgICAgICBjYXNlIFNQTElUTVVYX0lOUFVUX1NUQVRFX0NPTExFQ1RJTkdfR09QX1NUQVJUOgorICAgICAgICBpZiAoY3R4LT5pc19yZWZlcmVuY2UpIHsKKyAgICAgICAgICAvKiBJZiBhIGtleWZyYW1lLCB3ZSBoYXZlIGEgY29tcGxldGUgR09QICovCisgICAgICAgICAgaWYgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpIHx8CisgICAgICAgICAgICAgICFHU1RfQ0xPQ0tfU1RJTUVfSVNfVkFMSUQgKGN0eC0+aW5fcnVubmluZ190aW1lKSB8fAorICAgICAgICAgICAgICBzcGxpdG11eC0+bWF4X2luX3J1bm5pbmdfdGltZSA+PSBjdHgtPmluX3J1bm5pbmdfdGltZSkgeworICAgICAgICAgICAgLyogUGFzcyB0aGlzIGJ1ZmZlciB0aHJvdWdoICovCisgICAgICAgICAgICBsb29wX2FnYWluID0gRkFMU0U7CisgICAgICAgICAgICAvKiBBbGxvdyBvdGhlciBpbnB1dCBwYWRzIHRvIGNhdGNoIHVwIHRvIGhlcmUgdG9vICovCisgICAgICAgICAgICBzcGxpdG11eC0+bWF4X2luX3J1bm5pbmdfdGltZSA9IGN0eC0+aW5fcnVubmluZ190aW1lOworICAgICAgICAgICAgR1NUX1NQTElUTVVYX0JST0FEQ0FTVF9JTlBVVCAoc3BsaXRtdXgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIEdTVF9JTkZPX09CSkVDVCAocGFkLAorICAgICAgICAgICAgICAiSGF2ZSBrZXlmcmFtZSB3aXRoIHJ1bm5pbmcgdGltZSAlIiBHU1RfU1RJTUVfRk9STUFULAorICAgICAgICAgICAgICBHU1RfU1RJTUVfQVJHUyAoY3R4LT5pbl9ydW5uaW5nX3RpbWUpKTsKKyAgICAgICAgICBrZXlmcmFtZSA9IFRSVUU7CisgICAgICAgICAgc3BsaXRtdXgtPmlucHV0X3N0YXRlID0gU1BMSVRNVVhfSU5QVVRfU1RBVEVfV0FJVElOR19HT1BfQ09MTEVDVDsKKyAgICAgICAgICBzcGxpdG11eC0+bWF4X2luX3J1bm5pbmdfdGltZSA9IGN0eC0+aW5fcnVubmluZ190aW1lOworICAgICAgICAgIC8qIFdha2UgdXAgb3RoZXIgaW5wdXQgcGFkcyB0byBjb2xsZWN0IHRoaXMgR09QICovCisgICAgICAgICAgR1NUX1NQTElUTVVYX0JST0FEQ0FTVF9JTlBVVCAoc3BsaXRtdXgpOworICAgICAgICAgIGNoZWNrX2NvbXBsZXRlZF9nb3AgKHNwbGl0bXV4LCBjdHgpOworICAgICAgICAgIC8qIFN0b3JlIHRoaXMgbmV3IGtleWZyYW1lIHRvIHJlbWVtYmVyIHRoZSBzdGFydCBvZiBHT1AgKi8KKyAgICAgICAgICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZjdHgtPnByZXZfaW5fa2V5ZnJhbWUsIGJ1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogUGFzcyB0aGlzIGJ1ZmZlciBpZiB0aGUgcmVmZXJlbmNlIGN0eCBpcyBmYXIgZW5vdWdoIGFoZWFkICovCisgICAgICAgICAgaWYgKGN0eC0+aW5fcnVubmluZ190aW1lIDwgc3BsaXRtdXgtPm1heF9pbl9ydW5uaW5nX3RpbWUpIHsKKyAgICAgICAgICAgIGxvb3BfYWdhaW4gPSBGQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIFdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIGEga2V5ZnJhbWUgb24gdGhlIHJlZmVyZW5jZSBwYWQsIHNsZWVwICovCisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIlNsZWVwaW5nIGZvciBHT1Agc3RhcnQiKTsKKyAgICAgICAgICBHU1RfU1BMSVRNVVhfV0FJVF9JTlBVVCAoc3BsaXRtdXgpOworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYWQsCisgICAgICAgICAgICAgICJEb25lIHNsZWVwaW5nIGZvciBHT1Agc3RhcnQgaW5wdXQgc3RhdGUgbm93ICVkIiwKKyAgICAgICAgICAgICAgc3BsaXRtdXgtPmlucHV0X3N0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1BMSVRNVVhfSU5QVVRfU1RBVEVfV0FJVElOR19HT1BfQ09MTEVDVDp7CisgICAgICAgIC8qIFdlJ3JlIGNvbGxlY3RpbmcgYSBHT1AuIElmIHRoaXMgaXMgdGhlIHJlZmVyZW5jZSBjb250ZXh0LAorICAgICAgICAgKiB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoaXMgaXMgYSBrZXlmcmFtZSB0aGF0IG1hcmtzIHRoZSBzdGFydAorICAgICAgICAgKiBvZiB0aGUgbmV4dCBHT1AuIElmIGl0IGlzLCBpdCBtYXJrcyB0aGUgZW5kIG9mIHRoZSBHT1Agd2UncmUKKyAgICAgICAgICogY29sbGVjdGluZywgc28gc2xlZXAgYW5kIHdhaXQgdW50aWwgYWxsIHRoZSBvdGhlciBwYWRzIGFsc28KKyAgICAgICAgICogcmVhY2ggdGhhdCB0aW1lc3RhbXAgLSBhdCB3aGljaCBwb2ludCwgd2UgaGF2ZSBhbiBlbnRpcmUgR09QCisgICAgICAgICAqIGFuZCBlaXRoZXIgZ28gdG8gRU5ESU5HX0ZJTEUgb3IgcmVsZWFzZSB0aGlzIEdPUCB0byB0aGUgbXV4ZXIgYW5kCisgICAgICAgICAqIGdvIGJhY2sgdG8gQ09MTEVDVF9HT1BfU1RBUlQuICovCisKKyAgICAgICAgLyogSWYgd2Ugb3ZlcnJhbiB0aGUgdGFyZ2V0IHRpbWVzdGFtcCwgaXQgbWlnaHQgYmUgdGltZSB0byBwcm9jZXNzCisgICAgICAgICAqIHRoZSBHT1AsIG90aGVyd2lzZSBiYWlsIG91dCBmb3IgbW9yZSBkYXRhCisgICAgICAgICAqLworICAgICAgICBHU1RfTE9HX09CSkVDVCAocGFkLAorICAgICAgICAgICAgIkNoZWNraW5nIFRTICUiIEdTVF9TVElNRV9GT1JNQVQgIiBhZ2FpbnN0IG1heCAlIgorICAgICAgICAgICAgR1NUX1NUSU1FX0ZPUk1BVCwgR1NUX1NUSU1FX0FSR1MgKGN0eC0+aW5fcnVubmluZ190aW1lKSwKKyAgICAgICAgICAgIEdTVF9TVElNRV9BUkdTIChzcGxpdG11eC0+bWF4X2luX3J1bm5pbmdfdGltZSkpOworCisgICAgICAgIGlmIChjdHgtPmluX3J1bm5pbmdfdGltZSA8IHNwbGl0bXV4LT5tYXhfaW5fcnVubmluZ190aW1lKSB7CisgICAgICAgICAgbG9vcF9hZ2FpbiA9IEZBTFNFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhZCwKKyAgICAgICAgICAgICJDb2xsZWN0ZWQgbGFzdCBwYWNrZXQgb2YgR09QLiBDaGVja2luZyBvdGhlciBwYWRzIik7CisgICAgICAgIGNoZWNrX2NvbXBsZXRlZF9nb3AgKHNwbGl0bXV4LCBjdHgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgU1BMSVRNVVhfSU5QVVRfU1RBVEVfRklOSVNISU5HX1VQOgorICAgICAgICBsb29wX2FnYWluID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbG9vcF9hZ2FpbiA9IEZBTFNFOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgd2hpbGUgKGxvb3BfYWdhaW4pOworCisgIGlmIChrZXlmcmFtZSkgeworICAgIHNwbGl0bXV4LT5xdWV1ZWRfa2V5ZnJhbWVzKys7CisgICAgYnVmX2luZm8tPmtleWZyYW1lID0gVFJVRTsKKyAgfQorCisgIC8qIFVwZGF0ZSB0b3RhbCBpbnB1dCBieXRlIGNvdW50ZXIgZm9yIG92ZXJmbG93IGRldGVjdCAqLworICBzcGxpdG11eC0+Z29wX3RvdGFsX2J5dGVzICs9IGJ1Zl9pbmZvLT5idWZfc2l6ZTsKKworICAvKiBOb3cgYWRkIHRoaXMgYnVmZmVyIHRvIHRoZSBxdWV1ZSBqdXN0IGJlZm9yZSByZXR1cm5pbmcgKi8KKyAgZ19xdWV1ZV9wdXNoX2hlYWQgKCZjdHgtPnF1ZXVlZF9idWZzLCBidWZfaW5mbyk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIlJldHVybmluZyB0byBxdWV1ZSBidWZmZXIgJSIgR1NUX1BUUl9GT1JNQVQKKyAgICAgICIgcnVuIHRzICUiIEdTVF9TVElNRV9GT1JNQVQsIGJ1ZiwgR1NUX1NUSU1FX0FSR1MgKGN0eC0+aW5fcnVubmluZ190aW1lKSk7CisKKyAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICByZXR1cm4gR1NUX1BBRF9QUk9CRV9QQVNTOworCitiZWFjaDoKKyAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICBpZiAoYnVmX2luZm8pCisgICAgbXFfc3RyZWFtX2J1Zl9mcmVlIChidWZfaW5mbyk7CisgIHJldHVybiBHU1RfUEFEX1BST0JFX1BBU1M7Cit9CisKK3N0YXRpYyB2b2lkCitncm93X2Jsb2NrZWRfcXVldWVzIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCkKK3sKKyAgR0xpc3QgKmN1cjsKKworICAvKiBTY2FuIG90aGVyIHF1ZXVlcyBmb3IgZnVsbC1uZXNzIGFuZCBncm93IHRoZW0gKi8KKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHNwbGl0bXV4LT5jb250ZXh0cyk7CisgICAgICBjdXIgIT0gTlVMTDsgY3VyID0gZ19saXN0X25leHQgKGN1cikpIHsKKyAgICBNcVN0cmVhbUN0eCAqdG1wY3R4ID0gKE1xU3RyZWFtQ3R4ICopIChjdXItPmRhdGEpOworICAgIGd1aW50IGN1cl9saW1pdDsKKyAgICBndWludCBjdXJfbGVuID0gZ19xdWV1ZV9nZXRfbGVuZ3RoICgmdG1wY3R4LT5xdWV1ZWRfYnVmcyk7CisKKyAgICBnX29iamVjdF9nZXQgKHRtcGN0eC0+cSwgIm1heC1zaXplLWJ1ZmZlcnMiLCAmY3VyX2xpbWl0LCBOVUxMKTsKKyAgICBHU1RfTE9HX09CSkVDVCAodG1wY3R4LT5xLCAiUXVldWUgbGVuICV1IiwgY3VyX2xlbik7CisKKyAgICBpZiAoY3VyX2xlbiA+PSBjdXJfbGltaXQpIHsKKyAgICAgIGN1cl9saW1pdCA9IGN1cl9sZW4gKyAxOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAodG1wY3R4LT5xLAorICAgICAgICAgICJRdWV1ZSBvdmVyZmxvd2VkIGFuZCBuZWVkcyBlbmxhcmdpbmcuIEdyb3dpbmcgdG8gJXUgYnVmZmVycyIsCisgICAgICAgICAgY3VyX2xpbWl0KTsKKyAgICAgIGdfb2JqZWN0X3NldCAodG1wY3R4LT5xLCAibWF4LXNpemUtYnVmZmVycyIsIGN1cl9saW1pdCwgTlVMTCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfcV91bmRlcnJ1biAoR3N0RWxlbWVudCAqIHEsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgTXFTdHJlYW1DdHggKmN0eCA9IChNcVN0cmVhbUN0eCAqKSAodXNlcl9kYXRhKTsKKyAgR3N0U3BsaXRNdXhTaW5rICpzcGxpdG11eCA9IGN0eC0+c3BsaXRtdXg7CisKKyAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocSwKKyAgICAgICJRdWV1ZSByZXBvcnRlZCB1bmRlcnJ1biB3aXRoICVkIGtleWZyYW1lcyBhbmQgJWQgY21kcyBlbnF1ZXVlZCIsCisgICAgICBzcGxpdG11eC0+cXVldWVkX2tleWZyYW1lcywgZ19xdWV1ZV9nZXRfbGVuZ3RoICgmc3BsaXRtdXgtPm91dF9jbWRfcSkpOworICBncm93X2Jsb2NrZWRfcXVldWVzIChzcGxpdG11eCk7CisgIEdTVF9TUExJVE1VWF9VTkxPQ0sgKHNwbGl0bXV4KTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9xX292ZXJydW4gKEdzdEVsZW1lbnQgKiBxLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIE1xU3RyZWFtQ3R4ICpjdHggPSAoTXFTdHJlYW1DdHggKikgKHVzZXJfZGF0YSk7CisgIEdzdFNwbGl0TXV4U2luayAqc3BsaXRtdXggPSBjdHgtPnNwbGl0bXV4OworICBnYm9vbGVhbiBhbGxvd19ncm93ID0gRkFMU0U7CisKKyAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocSwKKyAgICAgICJRdWV1ZSByZXBvcnRlZCBvdmVycnVuIHdpdGggJWQga2V5ZnJhbWVzIGFuZCAlZCBjbWRzIGVucXVldWVkIiwKKyAgICAgIHNwbGl0bXV4LT5xdWV1ZWRfa2V5ZnJhbWVzLCBnX3F1ZXVlX2dldF9sZW5ndGggKCZzcGxpdG11eC0+b3V0X2NtZF9xKSk7CisKKyAgaWYgKHNwbGl0bXV4LT5xdWV1ZWRfa2V5ZnJhbWVzIDwgMikgeworICAgIC8qIExlc3MgdGhhbiBhIGZ1bGwgR09QIHF1ZXVlZCwgZ3JvdyB0aGUgcXVldWUgKi8KKyAgICBhbGxvd19ncm93ID0gVFJVRTsKKyAgfSBlbHNlIGlmIChnX3F1ZXVlX2dldF9sZW5ndGggKCZzcGxpdG11eC0+b3V0X2NtZF9xKSA8IDEpIHsKKyAgICBhbGxvd19ncm93ID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICAvKiBJZiBhbm90aGVyIHF1ZXVlIGlzIHN0YXJ2ZWQsIGdyb3cgKi8KKyAgICBHTGlzdCAqY3VyOworICAgIGZvciAoY3VyID0gZ19saXN0X2ZpcnN0IChzcGxpdG11eC0+Y29udGV4dHMpOworICAgICAgICBjdXIgIT0gTlVMTDsgY3VyID0gZ19saXN0X25leHQgKGN1cikpIHsKKyAgICAgIE1xU3RyZWFtQ3R4ICp0bXBjdHggPSAoTXFTdHJlYW1DdHggKikgKGN1ci0+ZGF0YSk7CisgICAgICBpZiAodG1wY3R4ICE9IGN0eCAmJiBnX3F1ZXVlX2dldF9sZW5ndGggKCZ0bXBjdHgtPnF1ZXVlZF9idWZzKSA8IDEpIHsKKyAgICAgICAgYWxsb3dfZ3JvdyA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9CisgIEdTVF9TUExJVE1VWF9VTkxPQ0sgKHNwbGl0bXV4KTsKKworICBpZiAoYWxsb3dfZ3JvdykgeworICAgIGd1aW50IGN1cl9saW1pdDsKKworICAgIGdfb2JqZWN0X2dldCAocSwgIm1heC1zaXplLWJ1ZmZlcnMiLCAmY3VyX2xpbWl0LCBOVUxMKTsKKyAgICBjdXJfbGltaXQrKzsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHEsCisgICAgICAgICJRdWV1ZSBvdmVyZmxvd2VkIGFuZCBuZWVkcyBlbmxhcmdpbmcuIEdyb3dpbmcgdG8gJXUgYnVmZmVycyIsCisgICAgICAgIGN1cl9saW1pdCk7CisKKyAgICBnX29iamVjdF9zZXQgKHEsICJtYXgtc2l6ZS1idWZmZXJzIiwgY3VyX2xpbWl0LCBOVUxMKTsKKyAgfQorfQorCitzdGF0aWMgR3N0UGFkICoKK2dzdF9zcGxpdG11eF9zaW5rX3JlcXVlc3RfbmV3X3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgY29uc3QgZ2NoYXIgKiBuYW1lLCBjb25zdCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3BsaXRNdXhTaW5rICpzcGxpdG11eCA9IChHc3RTcGxpdE11eFNpbmsgKikgZWxlbWVudDsKKyAgR3N0UGFkVGVtcGxhdGUgKm11eF90ZW1wbGF0ZSA9IE5VTEw7CisgIEdzdFBhZCAqcmVzID0gTlVMTDsKKyAgR3N0RWxlbWVudCAqcTsKKyAgR3N0UGFkICpxX3NpbmsgPSBOVUxMLCAqcV9zcmMgPSBOVUxMOworICBnY2hhciAqZ25hbWU7CisgIGdib29sZWFuIGlzX3ZpZGVvID0gRkFMU0U7CisgIE1xU3RyZWFtQ3R4ICpjdHg7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZWxlbWVudCwgInRlbXBsOiVzLCBuYW1lOiVzIiwgdGVtcGwtPm5hbWVfdGVtcGxhdGUsIG5hbWUpOworCisgIEdTVF9TUExJVE1VWF9MT0NLIChzcGxpdG11eCk7CisgIGlmICghY3JlYXRlX211eGVyIChzcGxpdG11eCkpCisgICAgZ290byBmYWlsOworCisgIGlmICh0ZW1wbC0+bmFtZV90ZW1wbGF0ZSkgeworICAgIGlmIChnX3N0cl9lcXVhbCAodGVtcGwtPm5hbWVfdGVtcGxhdGUsICJ2aWRlbyIpKSB7CisgICAgICBpZiAoc3BsaXRtdXgtPmhhdmVfdmlkZW8pCisgICAgICAgIGdvdG8gYWxyZWFkeV9oYXZlX3ZpZGVvOworCisgICAgICAvKiBGSVhNRTogTG9vayBmb3IgYSBwYWQgdGVtcGxhdGUgd2l0aCBtYXRjaGluZyBjYXBzLCByYXRoZXIgdGhhbiBieSBuYW1lICovCisgICAgICBtdXhfdGVtcGxhdGUgPQorICAgICAgICAgIGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKEdTVF9FTEVNRU5UX0dFVF9DTEFTUworICAgICAgICAgIChzcGxpdG11eC0+bXV4ZXIpLCAidmlkZW9fJXUiKTsKKworICAgICAgLyogRmFsbGJhY2sgdG8gZmluZCBzaW5rIHBhZCB0ZW1wbGF0ZXMgbmFtZWQgJ3ZpZGVvJyAoZmx2bXV4KSAqLworICAgICAgaWYgKCFtdXhfdGVtcGxhdGUpIHsKKyAgICAgICAgbXV4X3RlbXBsYXRlID0KKyAgICAgICAgICAgIGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKEdTVF9FTEVNRU5UX0dFVF9DTEFTUworICAgICAgICAgICAgKHNwbGl0bXV4LT5tdXhlciksICJ2aWRlbyIpOworICAgICAgfQorICAgICAgaXNfdmlkZW8gPSBUUlVFOworICAgICAgbmFtZSA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIG11eF90ZW1wbGF0ZSA9CisgICAgICAgICAgZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoR1NUX0VMRU1FTlRfR0VUX0NMQVNTCisgICAgICAgICAgKHNwbGl0bXV4LT5tdXhlciksIHRlbXBsLT5uYW1lX3RlbXBsYXRlKTsKKworICAgICAgLyogRmFsbGJhY2sgdG8gZmluZCBzaW5rIHBhZCB0ZW1wbGF0ZXMgbmFtZWQgJ2F1ZGlvJyAoZmx2bXV4KSAqLworICAgICAgaWYgKCFtdXhfdGVtcGxhdGUpIHsKKyAgICAgICAgbXV4X3RlbXBsYXRlID0KKyAgICAgICAgICAgIGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKEdTVF9FTEVNRU5UX0dFVF9DTEFTUworICAgICAgICAgICAgKHNwbGl0bXV4LT5tdXhlciksICJhdWRpbyIpOworICAgICAgICBuYW1lID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG11eF90ZW1wbGF0ZSA9PSBOVUxMKSB7CisgICAgICAvKiBGYWxsYmFjayB0byBmaW5kIHNpbmsgcGFkIHRlbXBsYXRlcyBuYW1lZCAnc2lua18lZCcgKG1wZWd0c211eCkgKi8KKyAgICAgIG11eF90ZW1wbGF0ZSA9CisgICAgICAgICAgZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoR1NUX0VMRU1FTlRfR0VUX0NMQVNTCisgICAgICAgICAgKHNwbGl0bXV4LT5tdXhlciksICJzaW5rXyVkIik7CisgICAgICBuYW1lID0gTlVMTDsKKyAgICB9CisgIH0KKworICByZXMgPSBnc3RfZWxlbWVudF9yZXF1ZXN0X3BhZCAoc3BsaXRtdXgtPm11eGVyLCBtdXhfdGVtcGxhdGUsIG5hbWUsIGNhcHMpOworICBpZiAocmVzID09IE5VTEwpCisgICAgZ290byBmYWlsOworCisgIGlmIChpc192aWRlbykKKyAgICBnbmFtZSA9IGdfc3RyZHVwICgidmlkZW8iKTsKKyAgZWxzZSBpZiAobmFtZSA9PSBOVUxMKQorICAgIGduYW1lID0gZ3N0X3BhZF9nZXRfbmFtZSAocmVzKTsKKyAgZWxzZQorICAgIGduYW1lID0gZ19zdHJkdXAgKG5hbWUpOworCisgIGlmICgocSA9IGNyZWF0ZV9lbGVtZW50IChzcGxpdG11eCwgInF1ZXVlIiwgTlVMTCwgRkFMU0UpKSA9PSBOVUxMKQorICAgIGdvdG8gZmFpbDsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHEsIEdTVF9TVEFURV9UQVJHRVQgKHNwbGl0bXV4KSk7CisKKyAgZ19vYmplY3Rfc2V0IChxLCAibWF4LXNpemUtYnl0ZXMiLCAwLCAibWF4LXNpemUtdGltZSIsIChndWludDY0KSAoMCksCisgICAgICAibWF4LXNpemUtYnVmZmVycyIsIDUsIE5VTEwpOworCisgIHFfc2luayA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChxLCAic2luayIpOworICBxX3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChxLCAic3JjIik7CisKKyAgaWYgKGdzdF9wYWRfbGluayAocV9zcmMsIHJlcykgIT0gR1NUX1BBRF9MSU5LX09LKSB7CisgICAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAoc3BsaXRtdXgtPm11eGVyLCByZXMpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKHJlcykpOworICAgIGdvdG8gZmFpbDsKKyAgfQorCisgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKHJlcykpOworCisgIGN0eCA9IG1xX3N0cmVhbV9jdHhfbmV3IChzcGxpdG11eCk7CisgIC8qIENvbnRleHQgaG9sZHMgYSByZWY6ICovCisgIGN0eC0+cSA9IGdzdF9vYmplY3RfcmVmIChxKTsKKyAgY3R4LT5zcmNwYWQgPSBxX3NyYzsKKyAgY3R4LT5zaW5rcGFkID0gcV9zaW5rOworICBjdHgtPnFfb3ZlcnJ1bl9pZCA9CisgICAgICBnX3NpZ25hbF9jb25uZWN0IChxLCAib3ZlcnJ1biIsIChHQ2FsbGJhY2spIGhhbmRsZV9xX292ZXJydW4sIGN0eCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHEsICJ1bmRlcnJ1biIsIChHQ2FsbGJhY2spIGhhbmRsZV9xX3VuZGVycnVuLCBjdHgpOworCisgIG1xX3N0cmVhbV9jdHhfcmVmIChjdHgpOworICBjdHgtPnNyY19wYWRfYmxvY2tfaWQgPQorICAgICAgZ3N0X3BhZF9hZGRfcHJvYmUgKHFfc3JjLAorICAgICAgR1NUX1BBRF9QUk9CRV9UWVBFX0RBVEFfRE9XTlNUUkVBTSB8IEdTVF9QQURfUFJPQkVfVFlQRV9FVkVOVF9GTFVTSCwKKyAgICAgIChHc3RQYWRQcm9iZUNhbGxiYWNrKSBoYW5kbGVfbXFfb3V0cHV0LCBjdHgsIChHRGVzdHJveU5vdGlmeSkKKyAgICAgIF9wYWRfYmxvY2tfZGVzdHJveV9zcmNfbm90aWZ5KTsKKyAgaWYgKGlzX3ZpZGVvICYmIHNwbGl0bXV4LT5yZWZlcmVuY2VfY3R4ICE9IE5VTEwpIHsKKyAgICBzcGxpdG11eC0+cmVmZXJlbmNlX2N0eC0+aXNfcmVmZXJlbmNlID0gRkFMU0U7CisgICAgc3BsaXRtdXgtPnJlZmVyZW5jZV9jdHggPSBOVUxMOworICB9CisgIGlmIChzcGxpdG11eC0+cmVmZXJlbmNlX2N0eCA9PSBOVUxMKSB7CisgICAgc3BsaXRtdXgtPnJlZmVyZW5jZV9jdHggPSBjdHg7CisgICAgY3R4LT5pc19yZWZlcmVuY2UgPSBUUlVFOworICB9CisKKyAgcmVzID0gZ3N0X2dob3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAoZ25hbWUsIHFfc2luaywgdGVtcGwpOworICBnX29iamVjdF9zZXRfcWRhdGEgKChHT2JqZWN0ICopIChyZXMpLCBQQURfQ09OVEVYVCwgY3R4KTsKKworICBtcV9zdHJlYW1fY3R4X3JlZiAoY3R4KTsKKyAgY3R4LT5zaW5rX3BhZF9ibG9ja19pZCA9CisgICAgICBnc3RfcGFkX2FkZF9wcm9iZSAocV9zaW5rLAorICAgICAgR1NUX1BBRF9QUk9CRV9UWVBFX0RBVEFfRE9XTlNUUkVBTSB8IEdTVF9QQURfUFJPQkVfVFlQRV9FVkVOVF9GTFVTSCB8CisgICAgICBHU1RfUEFEX1BST0JFX1RZUEVfUVVFUllfRE9XTlNUUkVBTSwKKyAgICAgIChHc3RQYWRQcm9iZUNhbGxiYWNrKSBoYW5kbGVfbXFfaW5wdXQsIGN0eCwgKEdEZXN0cm95Tm90aWZ5KQorICAgICAgX3BhZF9ibG9ja19kZXN0cm95X3Npbmtfbm90aWZ5KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcGxpdG11eCwgIlJlcXVlc3QgcGFkICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAiIGZlZWRzIHF1ZXVlIHBhZCAlIiBHU1RfUFRSX0ZPUk1BVCwgcmVzLCBxX3NpbmspOworCisgIHNwbGl0bXV4LT5jb250ZXh0cyA9IGdfbGlzdF9wcmVwZW5kIChzcGxpdG11eC0+Y29udGV4dHMsIGN0eCk7CisKKyAgZ19mcmVlIChnbmFtZSk7CisKKyAgaWYgKGlzX3ZpZGVvKQorICAgIHNwbGl0bXV4LT5oYXZlX3ZpZGVvID0gVFJVRTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJlcywgVFJVRSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGVsZW1lbnQsIHJlcyk7CisKKyAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworCisgIHJldHVybiByZXM7CitmYWlsOgorICBHU1RfU1BMSVRNVVhfVU5MT0NLIChzcGxpdG11eCk7CisKKyAgaWYgKHFfc2luaykKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChxX3NpbmspOworICBpZiAocV9zcmMpCisgICAgZ3N0X29iamVjdF91bnJlZiAocV9zcmMpOworICByZXR1cm4gTlVMTDsKK2FscmVhZHlfaGF2ZV92aWRlbzoKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsICJ2aWRlbyBzaW5rIHBhZCBhbHJlYWR5IHJlcXVlc3RlZCIpOworICBHU1RfU1BMSVRNVVhfVU5MT0NLIChzcGxpdG11eCk7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwbGl0bXV4X3NpbmtfcmVsZWFzZV9wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWQgKiBwYWQpCit7CisgIEdzdFNwbGl0TXV4U2luayAqc3BsaXRtdXggPSAoR3N0U3BsaXRNdXhTaW5rICopIGVsZW1lbnQ7CisgIEdzdFBhZCAqbXV4cGFkID0gTlVMTDsKKyAgTXFTdHJlYW1DdHggKmN0eCA9CisgICAgICAoTXFTdHJlYW1DdHggKikgKGdfb2JqZWN0X2dldF9xZGF0YSAoKEdPYmplY3QgKikgKHBhZCksIFBBRF9DT05URVhUKSk7CisKKyAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKworICBpZiAoc3BsaXRtdXgtPm11eGVyID09IE5VTEwpCisgICAgZ290byBmYWlsOyAgICAgICAgICAgICAgICAgIC8qIEVsZW1lbnRzIGRvbid0IGV4aXN0IHlldCAtIG5vdGhpbmcgdG8gcmVsZWFzZSAqLworCisgIEdTVF9JTkZPX09CSkVDVCAocGFkLCAicmVsZWFzaW5nIHJlcXVlc3QgcGFkIik7CisKKyAgbXV4cGFkID0gZ3N0X3BhZF9nZXRfcGVlciAoY3R4LT5zcmNwYWQpOworCisgIC8qIFJlbW92ZSB0aGUgY29udGV4dCBmcm9tIG91ciBjb25zaWRlcmF0aW9uICovCisgIHNwbGl0bXV4LT5jb250ZXh0cyA9IGdfbGlzdF9yZW1vdmUgKHNwbGl0bXV4LT5jb250ZXh0cywgY3R4KTsKKworICBpZiAoY3R4LT5zaW5rX3BhZF9ibG9ja19pZCkKKyAgICBnc3RfcGFkX3JlbW92ZV9wcm9iZSAoY3R4LT5zaW5rcGFkLCBjdHgtPnNpbmtfcGFkX2Jsb2NrX2lkKTsKKworICBpZiAoY3R4LT5zcmNfcGFkX2Jsb2NrX2lkKQorICAgIGdzdF9wYWRfcmVtb3ZlX3Byb2JlIChjdHgtPnNyY3BhZCwgY3R4LT5zcmNfcGFkX2Jsb2NrX2lkKTsKKworICAvKiBDYW4gcmVsZWFzZSB0aGUgY29udGV4dCBub3cgKi8KKyAgbXFfc3RyZWFtX2N0eF91bnJlZiAoY3R4KTsKKyAgaWYgKGN0eCA9PSBzcGxpdG11eC0+cmVmZXJlbmNlX2N0eCkKKyAgICBzcGxpdG11eC0+cmVmZXJlbmNlX2N0eCA9IE5VTEw7CisKKyAgLyogUmVsZWFzZSBhbmQgZnJlZSB0aGUgbXV4ZXIgaW5wdXQgKi8KKyAgaWYgKG11eHBhZCkgeworICAgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHNwbGl0bXV4LT5tdXhlciwgbXV4cGFkKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChtdXhwYWQpOworICB9CisKKyAgaWYgKEdTVF9QQURfUEFEX1RFTVBMQVRFIChwYWQpICYmCisgICAgICBnX3N0cl9lcXVhbCAoR1NUX1BBRF9URU1QTEFURV9OQU1FX1RFTVBMQVRFIChHU1RfUEFEX1BBRF9URU1QTEFURQorICAgICAgICAgICAgICAocGFkKSksICJ2aWRlbyIpKQorICAgIHNwbGl0bXV4LT5oYXZlX3ZpZGVvID0gRkFMU0U7CisKKyAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoZWxlbWVudCwgcGFkKTsKKworICAvKiBSZXNldCB0aGUgaW50ZXJuYWwgZWxlbWVudHMgb25seSBhZnRlciBhbGwgcmVxdWVzdCBwYWRzIGFyZSByZWxlYXNlZCAqLworICBpZiAoc3BsaXRtdXgtPmNvbnRleHRzID09IE5VTEwpCisgICAgZ3N0X3NwbGl0bXV4X3Jlc2V0IChzcGxpdG11eCk7CisKK2ZhaWw6CisgIEdTVF9TUExJVE1VWF9VTkxPQ0sgKHNwbGl0bXV4KTsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorY3JlYXRlX2VsZW1lbnQgKEdzdFNwbGl0TXV4U2luayAqIHNwbGl0bXV4LAorICAgIGNvbnN0IGdjaGFyICogZmFjdG9yeSwgY29uc3QgZ2NoYXIgKiBuYW1lLCBnYm9vbGVhbiBsb2NrZWQpCit7CisgIEdzdEVsZW1lbnQgKnJldCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoZmFjdG9yeSwgbmFtZSk7CisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIGdfd2FybmluZyAoIkZhaWxlZCB0byBjcmVhdGUgJXMgLSBzcGxpdG11eHNpbmsgd2lsbCBub3Qgd29yayIsIG5hbWUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKGxvY2tlZCkgeworICAgIC8qIEVuc3VyZSB0aGUgc2luayBzdGFydHMgaW4gbG9ja2VkIHN0YXRlIGFuZCBOVUxMIC0gaXQgd2lsbCBiZSBjaGFuZ2VkCisgICAgICogYnkgdGhlIGZpbGVuYW1lIHNldHRpbmcgY29kZSAqLworICAgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHJldCwgVFJVRSk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChyZXQsIEdTVF9TVEFURV9OVUxMKTsKKyAgfQorCisgIGlmICghZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHNwbGl0bXV4KSwgcmV0KSkgeworICAgIGdfd2FybmluZyAoIkNvdWxkIG5vdCBhZGQgJXMgZWxlbWVudCAtIHNwbGl0bXV4c2luayB3aWxsIG5vdCB3b3JrIiwgbmFtZSk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocmV0KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorY3JlYXRlX211eGVyIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCkKK3sKKyAgLyogQ3JlYXRlIGludGVybmFsIGVsZW1lbnRzICovCisgIGlmIChzcGxpdG11eC0+bXV4ZXIgPT0gTlVMTCkgeworICAgIEdzdEVsZW1lbnQgKnByb3ZpZGVkX211eGVyID0gTlVMTDsKKworICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgIGlmIChzcGxpdG11eC0+cHJvdmlkZWRfbXV4ZXIgIT0gTlVMTCkKKyAgICAgIHByb3ZpZGVkX211eGVyID0gZ3N0X29iamVjdF9yZWYgKHNwbGl0bXV4LT5wcm92aWRlZF9tdXhlcik7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKworICAgIGlmIChwcm92aWRlZF9tdXhlciA9PSBOVUxMKSB7CisgICAgICBpZiAoKHNwbGl0bXV4LT5tdXhlciA9CisgICAgICAgICAgICAgIGNyZWF0ZV9lbGVtZW50IChzcGxpdG11eCwgIm1wNG11eCIsICJtdXhlciIsIEZBTFNFKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOworICAgIH0gZWxzZSB7CisgICAgICAvKiBFbnN1cmUgaXQncyBub3QgaW4gbG9ja2VkIHN0YXRlICh3ZSBtaWdodCBiZSByZXVzaW5nIGFuIG9sZCBlbGVtZW50KSAqLworICAgICAgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSAocHJvdmlkZWRfbXV4ZXIsIEZBTFNFKTsKKyAgICAgIGlmICghZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHNwbGl0bXV4KSwgcHJvdmlkZWRfbXV4ZXIpKSB7CisgICAgICAgIGdfd2FybmluZyAoIkNvdWxkIG5vdCBhZGQgbXV4ZXIgZWxlbWVudCAtIHNwbGl0bXV4c2luayB3aWxsIG5vdCB3b3JrIik7CisgICAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHByb3ZpZGVkX211eGVyKTsKKyAgICAgICAgZ290byBmYWlsOworICAgICAgfQorCisgICAgICBzcGxpdG11eC0+bXV4ZXIgPSBwcm92aWRlZF9tdXhlcjsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHByb3ZpZGVkX211eGVyKTsKKyAgICB9CisKKyAgICBpZiAoc3BsaXRtdXgtPnVzZV9yb2J1c3RfbXV4aW5nKSB7CisgICAgICB1cGRhdGVfbXV4ZXJfcHJvcGVydGllcyAoc3BsaXRtdXgpOworICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOworZmFpbDoKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitmaW5kX3NpbmsgKEdzdEVsZW1lbnQgKiBlKQoreworICBHc3RFbGVtZW50ICpyZXMgPSBOVUxMOworICBHc3RJdGVyYXRvciAqaXRlcjsKKyAgZ2Jvb2xlYW4gZG9uZSA9IEZBTFNFOworICBHVmFsdWUgZGF0YSA9IHsgMCwgfTsKKworICBpZiAoIUdTVF9JU19CSU4gKGUpKQorICAgIHJldHVybiBlOworCisgIGlmIChnX29iamVjdF9jbGFzc19maW5kX3Byb3BlcnR5IChHX09CSkVDVF9HRVRfQ0xBU1MgKGUpLCAibG9jYXRpb24iKSAhPSBOVUxMKQorICAgIHJldHVybiBlOworCisgIGl0ZXIgPSBnc3RfYmluX2l0ZXJhdGVfc2lua3MgKEdTVF9CSU4gKGUpKTsKKyAgd2hpbGUgKCFkb25lKSB7CisgICAgc3dpdGNoIChnc3RfaXRlcmF0b3JfbmV4dCAoaXRlciwgJmRhdGEpKSB7CisgICAgICBjYXNlIEdTVF9JVEVSQVRPUl9PSzoKKyAgICAgIHsKKyAgICAgICAgR3N0RWxlbWVudCAqY2hpbGQgPSBnX3ZhbHVlX2dldF9vYmplY3QgKCZkYXRhKTsKKyAgICAgICAgaWYgKGdfb2JqZWN0X2NsYXNzX2ZpbmRfcHJvcGVydHkgKEdfT0JKRUNUX0dFVF9DTEFTUyAoY2hpbGQpLAorICAgICAgICAgICAgICAgICJsb2NhdGlvbiIpICE9IE5VTEwpIHsKKyAgICAgICAgICByZXMgPSBjaGlsZDsKKyAgICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBnX3ZhbHVlX3Jlc2V0ICgmZGF0YSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfUkVTWU5DOgorICAgICAgICBnc3RfaXRlcmF0b3JfcmVzeW5jIChpdGVyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9JVEVSQVRPUl9ET05FOgorICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9JVEVSQVRPUl9FUlJPUjoKKyAgICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBnX3ZhbHVlX3Vuc2V0ICgmZGF0YSk7CisgIGdzdF9pdGVyYXRvcl9mcmVlIChpdGVyKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2NyZWF0ZV9zaW5rIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCkKK3sKKyAgR3N0RWxlbWVudCAqcHJvdmlkZWRfc2luayA9IE5VTEw7CisKKyAgaWYgKHNwbGl0bXV4LT5hY3RpdmVfc2luayA9PSBOVUxMKSB7CisKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICBpZiAoc3BsaXRtdXgtPnByb3ZpZGVkX3NpbmsgIT0gTlVMTCkKKyAgICAgIHByb3ZpZGVkX3NpbmsgPSBnc3Rfb2JqZWN0X3JlZiAoc3BsaXRtdXgtPnByb3ZpZGVkX3NpbmspOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisKKyAgICBpZiAocHJvdmlkZWRfc2luayA9PSBOVUxMKSB7CisgICAgICBpZiAoKHNwbGl0bXV4LT5zaW5rID0KKyAgICAgICAgICAgICAgY3JlYXRlX2VsZW1lbnQgKHNwbGl0bXV4LCBERUZBVUxUX1NJTkssICJzaW5rIiwgVFJVRSkpID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgIHNwbGl0bXV4LT5hY3RpdmVfc2luayA9IHNwbGl0bXV4LT5zaW5rOworICAgIH0gZWxzZSB7CisgICAgICAvKiBFbnN1cmUgdGhlIHNpbmsgc3RhcnRzIGluIGxvY2tlZCBzdGF0ZSBhbmQgTlVMTCAtIGl0IHdpbGwgYmUgY2hhbmdlZAorICAgICAgICogYnkgdGhlIGZpbGVuYW1lIHNldHRpbmcgY29kZSAqLworICAgICAgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSAocHJvdmlkZWRfc2luaywgVFJVRSk7CisgICAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHByb3ZpZGVkX3NpbmssIEdTVF9TVEFURV9OVUxMKTsKKyAgICAgIGlmICghZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHNwbGl0bXV4KSwgcHJvdmlkZWRfc2luaykpIHsKKyAgICAgICAgZ193YXJuaW5nICgiQ291bGQgbm90IGFkZCBzaW5rIGVsZW1lbnRzIC0gc3BsaXRtdXhzaW5rIHdpbGwgbm90IHdvcmsiKTsKKyAgICAgICAgZ3N0X29iamVjdF91bnJlZiAocHJvdmlkZWRfc2luayk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgIH0KKworICAgICAgc3BsaXRtdXgtPmFjdGl2ZV9zaW5rID0gcHJvdmlkZWRfc2luazsKKworICAgICAgLyogVGhlIGJpbiBob2xkcyBhIHJlZiBub3csIHdlIGNhbiBkcm9wIG91ciB0bXAgcmVmICovCisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChwcm92aWRlZF9zaW5rKTsKKworICAgICAgLyogRmluZCB0aGUgc2luayBlbGVtZW50ICovCisgICAgICBzcGxpdG11eC0+c2luayA9IGZpbmRfc2luayAoc3BsaXRtdXgtPmFjdGl2ZV9zaW5rKTsKKyAgICAgIGlmIChzcGxpdG11eC0+c2luayA9PSBOVUxMKSB7CisgICAgICAgIGdfd2FybmluZworICAgICAgICAgICAgKCJDb3VsZCBub3QgbG9jYXRlIHNpbmsgZWxlbWVudCBpbiBwcm92aWRlZCBzaW5rIC0gc3BsaXRtdXhzaW5rIHdpbGwgbm90IHdvcmsiKTsKKyAgICAgICAgZ290byBmYWlsOworICAgICAgfQorICAgIH0KKworI2lmIDEKKyAgICBpZiAoZ19vYmplY3RfY2xhc3NfZmluZF9wcm9wZXJ0eSAoR19PQkpFQ1RfR0VUX0NMQVNTIChzcGxpdG11eC0+c2luayksCisgICAgICAgICAgICAiYXN5bmMiKSAhPSBOVUxMKSB7CisgICAgICAvKiBhc3luYyBjaGlsZCBlbGVtZW50cyBhcmUgY2F1c2luZyBzdGF0ZSBjaGFuZ2UgcmFjZXMgYW5kIHdlaXJkCisgICAgICAgKiBmYWlsdXJlcywgc28gbGV0J3MgdHJ5IGFuZCB0dXJuIHRoYXQgb2ZmICovCisgICAgICBnX29iamVjdF9zZXQgKHNwbGl0bXV4LT5zaW5rLCAiYXN5bmMiLCBGQUxTRSwgTlVMTCk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIWdzdF9lbGVtZW50X2xpbmsgKHNwbGl0bXV4LT5tdXhlciwgc3BsaXRtdXgtPmFjdGl2ZV9zaW5rKSkgeworICAgICAgZ193YXJuaW5nICgiRmFpbGVkIHRvIGxpbmsgbXV4ZXIgYW5kIHNpbmstIHNwbGl0bXV4c2luayB3aWxsIG5vdCB3b3JrIik7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFRSVUU7CitmYWlsOgorICByZXR1cm4gRkFMU0U7Cit9CisKKyNpZmRlZiBfX0dOVUNfXworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2Zvcm1hdC1ub25saXRlcmFsIgorI2VuZGlmCitzdGF0aWMgdm9pZAorc2V0X25leHRfZmlsZW5hbWUgKEdzdFNwbGl0TXV4U2luayAqIHNwbGl0bXV4LCBNcVN0cmVhbUN0eCAqIGN0eCkKK3sKKyAgZ2NoYXIgKmZuYW1lID0gTlVMTDsKKyAgR3N0U2FtcGxlICpzYW1wbGU7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgZ3N0X3NwbGl0bXV4X3NpbmtfZW5zdXJlX21heF9maWxlcyAoc3BsaXRtdXgpOworCisgIGlmIChjdHgtPmN1cl9vdXRfYnVmZmVyID09IE5VTEwpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNwbGl0bXV4LCAiU3RhcnRpbmcgbmV4dCBmaWxlIHdpdGhvdXQgYnVmZmVyIik7CisgIH0KKworICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChjdHgtPnNyY3BhZCk7CisgIHNhbXBsZSA9IGdzdF9zYW1wbGVfbmV3IChjdHgtPmN1cl9vdXRfYnVmZmVyLCBjYXBzLCAmY3R4LT5vdXRfc2VnbWVudCwgTlVMTCk7CisgIGdfc2lnbmFsX2VtaXQgKHNwbGl0bXV4LCBzaWduYWxzW1NJR05BTF9GT1JNQVRfTE9DQVRJT05fRlVMTF0sIDAsCisgICAgICBzcGxpdG11eC0+ZnJhZ21lbnRfaWQsIHNhbXBsZSwgJmZuYW1lKTsKKyAgZ3N0X3NhbXBsZV91bnJlZiAoc2FtcGxlKTsKKyAgaWYgKGNhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGlmIChmbmFtZSA9PSBOVUxMKSB7CisgICAgLyogRmFsbGJhY2sgdG8gdGhlIG9sZCBzaWduYWwgaWYgdGhlIG5ldyBvbmUgcmV0dXJuZWQgbm90aGluZyAqLworICAgIGdfc2lnbmFsX2VtaXQgKHNwbGl0bXV4LCBzaWduYWxzW1NJR05BTF9GT1JNQVRfTE9DQVRJT05dLCAwLAorICAgICAgICBzcGxpdG11eC0+ZnJhZ21lbnRfaWQsICZmbmFtZSk7CisgIH0KKworICBpZiAoIWZuYW1lKQorICAgIGZuYW1lID0gc3BsaXRtdXgtPmxvY2F0aW9uID8KKyAgICAgICAgZ19zdHJkdXBfcHJpbnRmIChzcGxpdG11eC0+bG9jYXRpb24sIHNwbGl0bXV4LT5mcmFnbWVudF9pZCkgOiBOVUxMOworCisgIGlmIChmbmFtZSkgeworICAgIEdTVF9JTkZPX09CSkVDVCAoc3BsaXRtdXgsICJTZXR0aW5nIGZpbGUgdG8gJXMiLCBmbmFtZSk7CisgICAgZ19vYmplY3Rfc2V0IChzcGxpdG11eC0+c2luaywgImxvY2F0aW9uIiwgZm5hbWUsIE5VTEwpOworICAgIGdfZnJlZSAoZm5hbWUpOworCisgICAgc3BsaXRtdXgtPmZyYWdtZW50X2lkKys7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2RvX2FzeW5jX3N0YXJ0IChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCkKK3sKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKworICBpZiAoIXNwbGl0bXV4LT5uZWVkX2FzeW5jX3N0YXJ0KSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChzcGxpdG11eCwgIm5vIGFzeW5jX3N0YXJ0IG5lZWRlZCIpOworICAgIHJldHVybjsKKyAgfQorCisgIHNwbGl0bXV4LT5hc3luY19wZW5kaW5nID0gVFJVRTsKKworICBHU1RfSU5GT19PQkpFQ1QgKHNwbGl0bXV4LCAiU2VuZGluZyBhc3luY19zdGFydCBtZXNzYWdlIik7CisgIG1lc3NhZ2UgPSBnc3RfbWVzc2FnZV9uZXdfYXN5bmNfc3RhcnQgKEdTVF9PQkpFQ1RfQ0FTVCAoc3BsaXRtdXgpKTsKKyAgR1NUX0JJTl9DTEFTUyAocGFyZW50X2NsYXNzKS0+aGFuZGxlX21lc3NhZ2UgKEdTVF9CSU5fQ0FTVAorICAgICAgKHNwbGl0bXV4KSwgbWVzc2FnZSk7Cit9CisKK3N0YXRpYyB2b2lkCitkb19hc3luY19kb25lIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCkKK3sKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKworICBpZiAoc3BsaXRtdXgtPmFzeW5jX3BlbmRpbmcpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHNwbGl0bXV4LCAiU2VuZGluZyBhc3luY19kb25lIG1lc3NhZ2UiKTsKKyAgICBtZXNzYWdlID0KKyAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2FzeW5jX2RvbmUgKEdTVF9PQkpFQ1RfQ0FTVCAoc3BsaXRtdXgpLAorICAgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKyAgICBHU1RfQklOX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5oYW5kbGVfbWVzc2FnZSAoR1NUX0JJTl9DQVNUCisgICAgICAgIChzcGxpdG11eCksIG1lc3NhZ2UpOworCisgICAgc3BsaXRtdXgtPmFzeW5jX3BlbmRpbmcgPSBGQUxTRTsKKyAgfQorCisgIHNwbGl0bXV4LT5uZWVkX2FzeW5jX3N0YXJ0ID0gRkFMU0U7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3NwbGl0bXV4X3NpbmtfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RTcGxpdE11eFNpbmsgKnNwbGl0bXV4ID0gKEdzdFNwbGl0TXV4U2luayAqKSBlbGVtZW50OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOnsKKyAgICAgIEdTVF9TUExJVE1VWF9MT0NLIChzcGxpdG11eCk7CisgICAgICBpZiAoIWNyZWF0ZV9tdXhlciAoc3BsaXRtdXgpIHx8ICFjcmVhdGVfc2luayAoc3BsaXRtdXgpKSB7CisgICAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKyAgICAgICAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICAgICAgICBnb3RvIGJlYWNoOworICAgICAgfQorICAgICAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICAgICAgc3BsaXRtdXgtPmZyYWdtZW50X2lkID0gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOnsKKyAgICAgIEdTVF9TUExJVE1VWF9MT0NLIChzcGxpdG11eCk7CisgICAgICAvKiBTdGFydCBieSBjb2xsZWN0aW5nIG9uZSBpbnB1dCBvbiBlYWNoIHBhZCAqLworICAgICAgc3BsaXRtdXgtPmlucHV0X3N0YXRlID0gU1BMSVRNVVhfSU5QVVRfU1RBVEVfQ09MTEVDVElOR19HT1BfU1RBUlQ7CisgICAgICBzcGxpdG11eC0+b3V0cHV0X3N0YXRlID0gU1BMSVRNVVhfT1VUUFVUX1NUQVRFX1NUQVJUX05FWFRfRklMRTsKKyAgICAgIHNwbGl0bXV4LT5tYXhfaW5fcnVubmluZ190aW1lID0gR1NUX0NMT0NLX1NUSU1FX05PTkU7CisgICAgICBzcGxpdG11eC0+Z29wX3N0YXJ0X3RpbWUgPSBzcGxpdG11eC0+ZnJhZ21lbnRfc3RhcnRfdGltZSA9CisgICAgICAgICAgR1NUX0NMT0NLX1NUSU1FX05PTkU7CisgICAgICBzcGxpdG11eC0+bXV4ZWRfb3V0X2J5dGVzID0gMDsKKyAgICAgIHNwbGl0bXV4LT5yZWFkeV9mb3Jfb3V0cHV0ID0gRkFMU0U7CisgICAgICBHU1RfU1BMSVRNVVhfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdfYXRvbWljX2ludF9zZXQgKCYoc3BsaXRtdXgtPnNwbGl0X25vdyksIEZBTFNFKTsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIEdTVF9TUExJVE1VWF9MT0NLIChzcGxpdG11eCk7CisgICAgICBzcGxpdG11eC0+b3V0cHV0X3N0YXRlID0gU1BMSVRNVVhfT1VUUFVUX1NUQVRFX1NUT1BQRUQ7CisgICAgICBzcGxpdG11eC0+aW5wdXRfc3RhdGUgPSBTUExJVE1VWF9JTlBVVF9TVEFURV9TVE9QUEVEOworICAgICAgLyogV2FrZSB1cCBhbnkgYmxvY2tlZCB0aHJlYWRzICovCisgICAgICBHU1RfTE9HX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICAgIlN0YXRlIGNoYW5nZSAtPiBOVUxMIG9yIFJFQURZLiBXYWtpbmcgdGhyZWFkcyIpOworICAgICAgR1NUX1NQTElUTVVYX0JST0FEQ0FTVF9JTlBVVCAoc3BsaXRtdXgpOworICAgICAgR1NUX1NQTElUTVVYX0JST0FEQ0FTVF9PVVRQVVQgKHNwbGl0bXV4KTsKKyAgICAgIEdTVF9TUExJVE1VWF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICBnb3RvIGJlYWNoOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QTEFZSU5HX1RPX1BBVVNFRDoKKyAgICAgIHNwbGl0bXV4LT5uZWVkX2FzeW5jX3N0YXJ0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6eworICAgICAgLyogQ2hhbmdlIHN0YXRlIGFzeW5jLCBiZWNhdXNlIG91ciBjaGlsZCBzaW5rIG1pZ2h0IG5vdAorICAgICAgICogYmUgcmVhZHkgdG8gZG8gdGhhdCBmb3IgdXMgeWV0IGlmIGl0J3Mgc3RhdGUgaXMgc3RpbGwgbG9ja2VkICovCisKKyAgICAgIHNwbGl0bXV4LT5uZWVkX2FzeW5jX3N0YXJ0ID0gVFJVRTsKKyAgICAgIC8qIHdlIHdhbnQgdG8gZ28gYXN5bmMgdG8gUEFVU0VEIHVudGlsIHdlIG1hbmFnZWQgdG8gY29uZmlndXJlIGFuZCBhZGQgdGhlCisgICAgICAgKiBzaW5rICovCisgICAgICBHU1RfU1BMSVRNVVhfTE9DSyAoc3BsaXRtdXgpOworICAgICAgZG9fYXN5bmNfc3RhcnQgKHNwbGl0bXV4KTsKKyAgICAgIEdTVF9TUExJVE1VWF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfQVNZTkM7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBHU1RfU1BMSVRNVVhfTE9DSyAoc3BsaXRtdXgpOworICAgICAgc3BsaXRtdXgtPmZyYWdtZW50X2lkID0gMDsKKyAgICAgIC8qIFJlc2V0IGludGVybmFsIGVsZW1lbnRzIG9ubHkgaWYgbm8gcGFkIGNvbnRleHRzIGFyZSB1c2luZyB0aGVtICovCisgICAgICBpZiAoc3BsaXRtdXgtPmNvbnRleHRzID09IE5VTEwpCisgICAgICAgIGdzdF9zcGxpdG11eF9yZXNldCAoc3BsaXRtdXgpOworICAgICAgZG9fYXN5bmNfZG9uZSAoc3BsaXRtdXgpOworICAgICAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKK2JlYWNoOgorICBpZiAodHJhbnNpdGlvbiA9PSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFkgJiYKKyAgICAgIHJldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpIHsKKyAgICAvKiBDbGVhbnVwIGVsZW1lbnRzIG9uIGZhaWxlZCB0cmFuc2l0aW9uIG91dCBvZiBOVUxMICovCisgICAgZ3N0X3NwbGl0bXV4X3Jlc2V0IChzcGxpdG11eCk7CisgICAgR1NUX1NQTElUTVVYX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICBkb19hc3luY19kb25lIChzcGxpdG11eCk7CisgICAgR1NUX1NQTElUTVVYX1VOTE9DSyAoc3BsaXRtdXgpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCityZWdpc3Rlcl9zcGxpdG11eHNpbmsgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHNwbGl0bXV4X2RlYnVnLCAic3BsaXRtdXhzaW5rIiwgMCwKKyAgICAgICJTcGxpdCBGaWxlIE11eGluZyBTaW5rIik7CisKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJzcGxpdG11eHNpbmsiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfU1BMSVRNVVhfU0lOSyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfc2lua19lbnN1cmVfbWF4X2ZpbGVzIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCkKK3sKKyAgaWYgKHNwbGl0bXV4LT5tYXhfZmlsZXMgJiYgc3BsaXRtdXgtPmZyYWdtZW50X2lkID49IHNwbGl0bXV4LT5tYXhfZmlsZXMpIHsKKyAgICBzcGxpdG11eC0+ZnJhZ21lbnRfaWQgPSAwOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitzcGxpdF9ub3cgKEdzdFNwbGl0TXV4U2luayAqIHNwbGl0bXV4KQoreworICBnX2F0b21pY19pbnRfc2V0ICgmKHNwbGl0bXV4LT5zcGxpdF9ub3cpLCBUUlVFKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzaW5rLmggYi9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYjkwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0bXV4c2luay5oCkBAIC0wLDAgKzEsMTg0IEBACisvKiBHU3RyZWFtZXIgc3BsaXQgbXV4ZXIgYmluCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9TUExJVE1VWFNJTktfSF9fCisjZGVmaW5lIF9fR1NUX1NQTElUTVVYU0lOS19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcGJ1dGlscy9wYnV0aWxzLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfU1BMSVRNVVhfU0lOSyAgICAgICAgICAgICAgIChnc3Rfc3BsaXRtdXhfc2lua19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfU1BMSVRNVVhfU0lOSyhvYmopICAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1NQTElUTVVYX1NJTkssR3N0U3BsaXRNdXhTaW5rKSkKKyNkZWZpbmUgR1NUX1NQTElUTVVYX1NJTktfQ0xBU1Moa2xhc3MpICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1NQTElUTVVYX1NJTkssR3N0U3BsaXRNdXhTaW5rQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfU1BMSVRNVVhfU0lOSyhvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1NQTElUTVVYX1NJTkspKQorI2RlZmluZSBHU1RfSVNfU1BMSVRNVVhfU0lOS19DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfU1BMSVRNVVhfU0lOSykpCit0eXBlZGVmIHN0cnVjdCBfR3N0U3BsaXRNdXhTaW5rIEdzdFNwbGl0TXV4U2luazsKK3R5cGVkZWYgc3RydWN0IF9Hc3RTcGxpdE11eFNpbmtDbGFzcyBHc3RTcGxpdE11eFNpbmtDbGFzczsKKworR1R5cGUgZ3N0X3NwbGl0bXV4X3NpbmtfZ2V0X3R5cGUgKHZvaWQpOworZ2Jvb2xlYW4gcmVnaXN0ZXJfc3BsaXRtdXhzaW5rIChHc3RQbHVnaW4gKiBwbHVnaW4pOworCit0eXBlZGVmIGVudW0gX1NwbGl0TXV4SW5wdXRTdGF0ZQoreworICBTUExJVE1VWF9JTlBVVF9TVEFURV9TVE9QUEVELAorICBTUExJVE1VWF9JTlBVVF9TVEFURV9DT0xMRUNUSU5HX0dPUF9TVEFSVCwgICAgLyogV2FpdGluZyBmb3IgdGhlIG5leHQgcmVmIGN0eCBrZXlmcmFtZSAqLworICBTUExJVE1VWF9JTlBVVF9TVEFURV9XQUlUSU5HX0dPUF9DT0xMRUNULCAgICAgLyogV2FpdGluZyBmb3IgYWxsIHN0cmVhbXMgdG8gY29sbGVjdCBHT1AgKi8KKyAgU1BMSVRNVVhfSU5QVVRfU1RBVEVfRklOSVNISU5HX1VQICAgICAgICAgICAgIC8qIEdvdCBFT1MgZnJvbSByZWZlcmVuY2UgY3R4LCBzZW5kIGV2ZXJ5dGhpbmcgKi8KK30gU3BsaXRNdXhJbnB1dFN0YXRlOworCit0eXBlZGVmIGVudW0gX1NwbGl0TXV4T3V0cHV0U3RhdGUKK3sKKyAgU1BMSVRNVVhfT1VUUFVUX1NUQVRFX1NUT1BQRUQsCisgIFNQTElUTVVYX09VVFBVVF9TVEFURV9BV0FJVElOR19DT01NQU5ELCAgICAgICAvKiBXYWl0aW5nIGZpcnN0IGNvbW1hbmQgcGFja2V0IGZyb20gaW5wdXQgKi8KKyAgU1BMSVRNVVhfT1VUUFVUX1NUQVRFX09VVFBVVF9HT1AsICAgICAvKiBPdXRwdXR0aW5nIGEgY29sbGVjdGVkIEdPUCAqLworICBTUExJVE1VWF9PVVRQVVRfU1RBVEVfRU5ESU5HX0ZJTEUsICAgIC8qIEZpbmlzaGluZyB0aGUgY3VycmVudCBmcmFnbWVudCAqLworICBTUExJVE1VWF9PVVRQVVRfU1RBVEVfU1RBUlRfTkVYVF9GSUxFIC8qIFJlc3RhcnRpbmcgYWZ0ZXIgRU5ESU5HX0ZJTEUgKi8KK30gU3BsaXRNdXhPdXRwdXRTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgX1NwbGl0TXV4T3V0cHV0Q29tbWFuZAoreworICBnYm9vbGVhbiBzdGFydF9uZXdfZnJhZ21lbnQ7ICAvKiBXaGV0aGVyIHRvIHN0YXJ0IGEgbmV3IGZyYWdtZW50IGJlZm9yZSBhZHZhbmNpbmcgb3V0cHV0IHRzICovCisgIEdzdENsb2NrVGltZURpZmYgbWF4X291dHB1dF90czsgICAgICAgLyogU2V0IHRoZSBsaW1pdCB0byBzdG9wIEdPUCBvdXRwdXQgKi8KK30gU3BsaXRNdXhPdXRwdXRDb21tYW5kOworCit0eXBlZGVmIHN0cnVjdCBfTXFTdHJlYW1CdWYKK3sKKyAgZ2Jvb2xlYW4ga2V5ZnJhbWU7CisgIEdzdENsb2NrVGltZURpZmYgcnVuX3RzOworICBndWludDY0IGJ1Zl9zaXplOworICBHc3RDbG9ja1RpbWUgZHVyYXRpb247Cit9IE1xU3RyZWFtQnVmOworCit0eXBlZGVmIHN0cnVjdCBfTXFTdHJlYW1DdHgKK3sKKyAgZ2ludCByZWZjb3VudDsKKworICBHc3RTcGxpdE11eFNpbmsgKnNwbGl0bXV4OworCisgIGd1aW50IHFfb3ZlcnJ1bl9pZDsKKyAgZ3VpbnQgc2lua19wYWRfYmxvY2tfaWQ7CisgIGd1aW50IHNyY19wYWRfYmxvY2tfaWQ7CisKKyAgZ2Jvb2xlYW4gaXNfcmVmZXJlbmNlOworCisgIGdib29sZWFuIGZsdXNoaW5nOworICBnYm9vbGVhbiBpbl9lb3M7CisgIGdib29sZWFuIG91dF9lb3M7CisgIGdib29sZWFuIG5lZWRfdW5ibG9jazsKKyAgZ2Jvb2xlYW4gY2Fwc19jaGFuZ2U7CisKKyAgR3N0U2VnbWVudCBpbl9zZWdtZW50OworICBHc3RTZWdtZW50IG91dF9zZWdtZW50OworCisgIEdzdENsb2NrVGltZURpZmYgaW5fcnVubmluZ190aW1lOworICBHc3RDbG9ja1RpbWVEaWZmIG91dF9ydW5uaW5nX3RpbWU7CisKKyAgR3N0QnVmZmVyICpwcmV2X2luX2tleWZyYW1lOyAvKiBzdG9yZSBrZXlmcmFtZSBmb3IgZWFjaCBHT1AgKi8KKworICBHc3RFbGVtZW50ICpxOworICBHUXVldWUgcXVldWVkX2J1ZnM7CisKKyAgR3N0UGFkICpzaW5rcGFkOworICBHc3RQYWQgKnNyY3BhZDsKKworICBHc3RCdWZmZXIgKmN1cl9vdXRfYnVmZmVyOworICBHc3RFdmVudCAqcGVuZGluZ19nYXA7Cit9IE1xU3RyZWFtQ3R4OworCitzdHJ1Y3QgX0dzdFNwbGl0TXV4U2luaworeworICBHc3RCaW4gcGFyZW50OworCisgIEdNdXRleCBsb2NrOworICBHQ29uZCBpbnB1dF9jb25kOworICBHQ29uZCBvdXRwdXRfY29uZDsKKworICBnZG91YmxlIG11eF9vdmVyaGVhZDsKKworICBHc3RDbG9ja1RpbWUgdGhyZXNob2xkX3RpbWU7CisgIGd1aW50NjQgdGhyZXNob2xkX2J5dGVzOworICBndWludCBtYXhfZmlsZXM7CisgIGdib29sZWFuIHNlbmRfa2V5ZnJhbWVfcmVxdWVzdHM7CisgIGdjaGFyICp0aHJlc2hvbGRfdGltZWNvZGVfc3RyOworICBHc3RDbG9ja1RpbWUgbmV4dF9tYXhfdGNfdGltZTsKKyAgR3N0Q2xvY2tUaW1lIGFsaWdubWVudF90aHJlc2hvbGQ7CisKKyAgR3N0RWxlbWVudCAqbXV4ZXI7CisgIEdzdEVsZW1lbnQgKnNpbms7CisKKyAgR3N0RWxlbWVudCAqcHJvdmlkZWRfbXV4ZXI7CisKKyAgR3N0RWxlbWVudCAqcHJvdmlkZWRfc2luazsKKyAgR3N0RWxlbWVudCAqYWN0aXZlX3Npbms7CisKKyAgZ2Jvb2xlYW4gcmVhZHlfZm9yX291dHB1dDsKKworICBnY2hhciAqbG9jYXRpb247CisgIGd1aW50IGZyYWdtZW50X2lkOworCisgIEdMaXN0ICpjb250ZXh0czsKKworICBTcGxpdE11eElucHV0U3RhdGUgaW5wdXRfc3RhdGU7CisgIEdzdENsb2NrVGltZURpZmYgbWF4X2luX3J1bm5pbmdfdGltZTsKKyAgLyogTnVtYmVyIG9mIGJ5dGVzIHNlbnQgdG8gdGhlCisgICAqIGN1cnJlbnQgZnJhZ21lbnQgKi8KKyAgZ3VpbnQ2NCBmcmFnbWVudF90b3RhbF9ieXRlczsKKyAgLyogTnVtYmVyIG9mIGJ5dGVzIHdlJ3ZlIGNvbGxlY3RlZCBpbnRvCisgICAqIHRoZSBHT1AgdGhhdCdzIGJlaW5nIGNvbGxlY3RlZCAqLworICBndWludDY0IGdvcF90b3RhbF9ieXRlczsKKyAgLyogU3RhcnQgdGltZSBvZiB0aGUgY3VycmVudCBmcmFnbWVudCAqLworICBHc3RDbG9ja1RpbWVEaWZmIGZyYWdtZW50X3N0YXJ0X3RpbWU7CisgIC8qIFN0YXJ0IHRpbWUgb2YgdGhlIGN1cnJlbnQgR09QICovCisgIEdzdENsb2NrVGltZURpZmYgZ29wX3N0YXJ0X3RpbWU7CisKKyAgR1F1ZXVlIG91dF9jbWRfcTsgICAgICAgICAgICAgLyogUXVldWUgb2YgY29tbWFuZHMgZm9yIG91dHB1dCB0aHJlYWQgKi8KKworICBTcGxpdE11eE91dHB1dFN0YXRlIG91dHB1dF9zdGF0ZTsKKyAgR3N0Q2xvY2tUaW1lRGlmZiBtYXhfb3V0X3J1bm5pbmdfdGltZTsKKworICBndWludDY0IG11eGVkX291dF9ieXRlczsKKworICBNcVN0cmVhbUN0eCAqcmVmZXJlbmNlX2N0eDsKKyAgLyogQ291bnQgb2YgcXVldWVkIGtleWZyYW1lcyBpbiB0aGUgcmVmZXJlbmNlIGN0eCAqLworICBndWludCBxdWV1ZWRfa2V5ZnJhbWVzOworCisgIGdib29sZWFuIHN3aXRjaGluZ19mcmFnbWVudDsKKworICBnYm9vbGVhbiBoYXZlX3ZpZGVvOworCisgIGdib29sZWFuIG5lZWRfYXN5bmNfc3RhcnQ7CisgIGdib29sZWFuIGFzeW5jX3BlbmRpbmc7CisKKyAgZ2Jvb2xlYW4gdXNlX3JvYnVzdF9tdXhpbmc7CisgIGdib29sZWFuIG11eGVyX2hhc19yZXNlcnZlZF9wcm9wczsKKworICBnYm9vbGVhbiBzcGxpdF9ub3c7Cit9OworCitzdHJ1Y3QgX0dzdFNwbGl0TXV4U2lua0NsYXNzCit7CisgIEdzdEJpbkNsYXNzIHBhcmVudF9jbGFzczsKKworICAvKiBhY3Rpb25zICovCisgIHZvaWQgICAgICgqc3BsaXRfbm93KSAgIChHc3RTcGxpdE11eFNpbmsgKiBzcGxpdG11eCk7Cit9OworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1NQTElUTVVYU0lOS19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYyBiL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjFlZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNyYy5jCkBAIC0wLDAgKzEsMTI3MSBAQAorLyogR1N0cmVhbWVyIFNwbGl0IERlbXV4ZXIgYmluIHRoYXQgcmVjb21iaW5lcyBmaWxlcyBjcmVhdGVkIGJ5CisgKiB0aGUgc3BsaXRtdXhzaW5rIGVsZW1lbnQuCisgKgorICogQ29weXJpZ2h0IChDKSA8MjAxND4gSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtc3BsaXRtdXhzcmMKKyAqIEBzaG9ydF9kZXNjcmlwdGlvbjogU3BsaXQgRGVtdXhlciBiaW4gdGhhdCByZWNvbWJpbmVzIGZpbGVzIGNyZWF0ZWQgYnkKKyAqIHRoZSBzcGxpdG11eHNpbmsgZWxlbWVudC4KKyAqCisgKiBUaGlzIGVsZW1lbnQgcmVhZHMgYSBzZXQgb2YgaW5wdXQgZmlsZXMgY3JlYXRlZCBieSB0aGUgc3BsaXRtdXhzaW5rIGVsZW1lbnQKKyAqIGNvbnRhaW5pbmcgY29udGlndW91cyBlbGVtZW50YXJ5IHN0cmVhbXMgc3BsaXQgYWNyb3NzIG11bHRpcGxlIGZpbGVzLgorICoKKyAqIFRoaXMgZWxlbWVudCBpcyBzaW1pbGFyIHRvIHNwbGl0ZmlsZXNyYywgZXhjZXB0IHRoYXQgaXQgcmVjb21iaW5lcyB0aGUKKyAqIHN0cmVhbXMgaW4gZWFjaCBmaWxlIHBhcnQgYXQgdGhlIGRlbXV4ZWQgZWxlbWVudGFyeSBsZXZlbCwgcmF0aGVyIHRoYW4KKyAqIGFzIGEgc2luZ2xlIGxhcmdlciBieXRlc3RyZWFtLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgc3BsaXRtdXhzcmMgbG9jYXRpb249dmlkZW8qLm1vdiAhIGRlY29kZWJpbiAhIHh2aW1hZ2VzaW5rCisgKiBdfCBEZW11eCBlYWNoIGZpbGUgcGFydCBhbmQgb3V0cHV0IHRoZSB2aWRlbyBzdHJlYW0gYXMgb25lIGNvbnRpbnVvdXMgc3RyZWFtCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgcGxheWJpbiB1cmk9InNwbGl0bXV4Oi8vcGF0aC90by9mb28ubXA0LioiCisgKiBdfCBQbGF5IGJhY2sgYSBzZXQgb2YgZmlsZXMgY3JlYXRlZCBieSBzcGxpdG11eHNpbmsKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0c3BsaXRtdXhzcmMuaCIKKyNpbmNsdWRlICJnc3RzcGxpdHV0aWxzLmgiCisKKyNpbmNsdWRlICIuLi8uLi9nc3QtbGlicy9nc3QvZ3N0LWkxOG4tcGx1Z2luLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWSAoc3BsaXRtdXhfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgc3BsaXRtdXhfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTE9DQVRJT04KK307CisKK2VudW0KK3sKKyAgU0lHTkFMX0ZPUk1BVF9MT0NBVElPTiwKKyAgU0lHTkFMX0xBU1QKK307CisKK3N0YXRpYyBndWludCBzaWduYWxzW1NJR05BTF9MQVNUXTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHZpZGVvX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInZpZGVvIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGF1ZGlvX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoImF1ZGlvXyV1IiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHN1YnRpdGxlX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInN1YnRpdGxlXyV1IiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9zcGxpdG11eF9zcmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyB2b2lkIGdzdF9zcGxpdG11eF9zcmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3NwbGl0bXV4X3NyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfc3BsaXRtdXhfc3JjX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X3NwbGl0bXV4X3NyY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NwbGl0bXV4X3NyY19zdGFydCAoR3N0U3BsaXRNdXhTcmMgKiBzcGxpdG11eCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NwbGl0bXV4X3NyY19zdG9wIChHc3RTcGxpdE11eFNyYyAqIHNwbGl0bXV4KTsKK3N0YXRpYyB2b2lkIHNwbGl0bXV4X3NyY19wYWRfY29uc3RydWN0ZWQgKEdPYmplY3QgKiBwYWQpOworc3RhdGljIGdib29sZWFuIHNwbGl0bXV4X3NyY19wYWRfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIHNwbGl0bXV4X3NyY19wYWRfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIHZvaWQgc3BsaXRtdXhfc3JjX3VyaV9oYW5kbGVyX2luaXQgKGdwb2ludGVyIGdfaWZhY2UsCisgICAgZ3BvaW50ZXIgaWZhY2VfZGF0YSk7CisKKworc3RhdGljIEdzdFBhZCAqZ3N0X3NwbGl0bXV4X2ZpbmRfb3V0cHV0X3BhZCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcGFydCwKKyAgICBHc3RQYWQgKiBwYWQsIEdzdFNwbGl0TXV4U3JjICogc3BsaXRtdXgpOworc3RhdGljIHZvaWQgZ3N0X3NwbGl0bXV4X3BhcnRfcHJlcGFyZWQgKEdzdFNwbGl0TXV4UGFydFJlYWRlciAqIHJlYWRlciwKKyAgICBHc3RTcGxpdE11eFNyYyAqIHNwbGl0bXV4KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc3BsaXRtdXhfZW5kX29mX3BhcnQgKEdzdFNwbGl0TXV4U3JjICogc3BsaXRtdXgsCisgICAgU3BsaXRNdXhTcmNQYWQgKiBwYWQpOworc3RhdGljIGdib29sZWFuIGdzdF9zcGxpdG11eF9jaGVja19uZXdfY2FwcyAoU3BsaXRNdXhTcmNQYWQgKiBzcGxpdHBhZCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworI2RlZmluZSBfZG9faW5pdCBcCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFKEdTVF9UWVBFX1VSSV9IQU5ETEVSLCBzcGxpdG11eF9zcmNfdXJpX2hhbmRsZXJfaW5pdCk7CisjZGVmaW5lIGdzdF9zcGxpdG11eF9zcmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworCitHX0RFRklORV9UWVBFX0VYVEVOREVEIChHc3RTcGxpdE11eFNyYywgZ3N0X3NwbGl0bXV4X3NyYywgR1NUX1RZUEVfQklOLCAwLAorICAgIF9kb19pbml0KTsKKworc3RhdGljIEdzdFVSSVR5cGUKK3NwbGl0bXV4X3NyY191cmlfZ2V0X3R5cGUgKEdUeXBlIHR5cGUpCit7CisgIHJldHVybiBHU1RfVVJJX1NSQzsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICpjb25zdCAqCitzcGxpdG11eF9zcmNfdXJpX2dldF9wcm90b2NvbHMgKEdUeXBlIHR5cGUpCit7CisgIHN0YXRpYyBjb25zdCBnY2hhciAqcHJvdG9jb2xzW10gPSB7ICJzcGxpdG11eCIsIE5VTEwgfTsKKworICByZXR1cm4gcHJvdG9jb2xzOworfQorCitzdGF0aWMgZ2NoYXIgKgorc3BsaXRtdXhfc3JjX3VyaV9nZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlcikKK3sKKyAgR3N0U3BsaXRNdXhTcmMgKnNwbGl0bXV4ID0gR1NUX1NQTElUTVVYX1NSQyAoaGFuZGxlcik7CisgIGdjaGFyICpyZXQgPSBOVUxMOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICBpZiAoc3BsaXRtdXgtPmxvY2F0aW9uKQorICAgIHJldCA9IGdfc3RyZHVwX3ByaW50ZiAoInNwbGl0bXV4Oi8vJXMiLCBzcGxpdG11eC0+bG9jYXRpb24pOworICBHU1RfT0JKRUNUX1VOTE9DSyAoc3BsaXRtdXgpOworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3NwbGl0bXV4X3NyY191cmlfc2V0X3VyaSAoR3N0VVJJSGFuZGxlciAqIGhhbmRsZXIsIGNvbnN0IGdjaGFyICogdXJpLAorICAgIEdFcnJvciAqKiBlcnIpCit7CisgIEdzdFNwbGl0TXV4U3JjICpzcGxpdG11eCA9IEdTVF9TUExJVE1VWF9TUkMgKGhhbmRsZXIpOworICBnY2hhciAqcHJvdG9jb2wsICpsb2NhdGlvbjsKKworICBwcm90b2NvbCA9IGdzdF91cmlfZ2V0X3Byb3RvY29sICh1cmkpOworICBpZiAocHJvdG9jb2wgPT0gTlVMTCB8fCAhZ19zdHJfZXF1YWwgKHByb3RvY29sLCAic3BsaXRtdXgiKSkKKyAgICBnb3RvIHdyb25nX3VyaTsKKyAgZ19mcmVlIChwcm90b2NvbCk7CisKKyAgbG9jYXRpb24gPSBnc3RfdXJpX2dldF9sb2NhdGlvbiAodXJpKTsKKyAgR1NUX09CSkVDVF9MT0NLIChzcGxpdG11eCk7CisgIGdfZnJlZSAoc3BsaXRtdXgtPmxvY2F0aW9uKTsKKyAgc3BsaXRtdXgtPmxvY2F0aW9uID0gbG9jYXRpb247CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisKKyAgcmV0dXJuIFRSVUU7CisKK3dyb25nX3VyaToKKyAgZ19mcmVlIChwcm90b2NvbCk7CisgIEdTVF9FTEVNRU5UX0VSUk9SIChzcGxpdG11eCwgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICgiRXJyb3IgcGFyc2luZyB1cmkgJXMiLCB1cmkpKTsKKyAgZ19zZXRfZXJyb3JfbGl0ZXJhbCAoZXJyLCBHU1RfVVJJX0VSUk9SLCBHU1RfVVJJX0VSUk9SX0JBRF9VUkksCisgICAgICAiQ291bGQgbm90IHBhcnNlIHNwbGl0bXV4IFVSSSIpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitzcGxpdG11eF9zcmNfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0VVJJSGFuZGxlckludGVyZmFjZSAqaWZhY2UgPSAoR3N0VVJJSGFuZGxlckludGVyZmFjZSAqKSAoZ19pZmFjZSk7CisKKyAgaWZhY2UtPmdldF90eXBlID0gc3BsaXRtdXhfc3JjX3VyaV9nZXRfdHlwZTsKKyAgaWZhY2UtPmdldF9wcm90b2NvbHMgPSBzcGxpdG11eF9zcmNfdXJpX2dldF9wcm90b2NvbHM7CisgIGlmYWNlLT5zZXRfdXJpID0gc3BsaXRtdXhfc3JjX3VyaV9zZXRfdXJpOworICBpZmFjZS0+Z2V0X3VyaSA9IHNwbGl0bXV4X3NyY191cmlfZ2V0X3VyaTsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3NwbGl0bXV4X3NyY19jbGFzc19pbml0IChHc3RTcGxpdE11eFNyY0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3NwbGl0bXV4X3NyY19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9zcGxpdG11eF9zcmNfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X3NwbGl0bXV4X3NyY19kaXNwb3NlOworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9zcGxpdG11eF9zcmNfZmluYWxpemU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJTcGxpdCBGaWxlIERlbXV4aW5nIEJpbiIsICJHZW5lcmljL0Jpbi9EZW11eGVyIiwKKyAgICAgICJTb3VyY2UgdGhhdCByZWFkcyBhIHNldCBvZiBmaWxlcyBjcmVhdGVkIGJ5IHNwbGl0bXV4c2luayIsCisgICAgICAiSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmdmlkZW9fc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmYXVkaW9fc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmc3VidGl0bGVfc3JjX3RlbXBsYXRlKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zcGxpdG11eF9zcmNfY2hhbmdlX3N0YXRlKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0xPQ0FUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImxvY2F0aW9uIiwgIkZpbGUgSW5wdXQgUGF0dGVybiIsCisgICAgICAgICAgIkdsb2IgcGF0dGVybiBmb3IgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaWxlcyB0byByZWFkIiwgTlVMTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0U3BsaXRNdXhTcmM6OmZvcm1hdC1sb2NhdGlvbjoKKyAgICogQHNwbGl0bXV4OiB0aGUgI0dzdFNwbGl0TXV4U3JjCisgICAqCisgICAqIFJldHVybnM6IEEgTlVMTC10ZXJtaW5hdGVkIHNvcnRlZCBhcnJheSBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlCisgICAqICAgZmlsZW5hbWVzIG9mIHRoZSBpbnB1dCBmaWxlcy4gVGhlIGFycmF5IHdpbGwgYmUgZnJlZWQgaW50ZXJuYWxseQorICAgKiAgIHVzaW5nIGdfc3RyZnJlZXYoKQorICAgKgorICAgKiBTaW5jZTogMS44CisgICAqLworICBzaWduYWxzW1NJR05BTF9GT1JNQVRfTE9DQVRJT05dID0KKyAgICAgIGdfc2lnbmFsX25ldyAoImZvcm1hdC1sb2NhdGlvbiIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgR19UWVBFX1NUUlYsIDApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwbGl0bXV4X3NyY19pbml0IChHc3RTcGxpdE11eFNyYyAqIHNwbGl0bXV4KQoreworICBnX211dGV4X2luaXQgKCZzcGxpdG11eC0+bG9jayk7CisgIGdfbXV0ZXhfaW5pdCAoJnNwbGl0bXV4LT5wYWRzX2xvY2spOworICBzcGxpdG11eC0+dG90YWxfZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBnc3Rfc2VnbWVudF9pbml0ICgmc3BsaXRtdXgtPnBsYXlfc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGxpdG11eF9zcmNfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0U3BsaXRNdXhTcmMgKnNwbGl0bXV4ID0gR1NUX1NQTElUTVVYX1NSQyAob2JqZWN0KTsKKyAgR0xpc3QgKmN1cjsKKworICBTUExJVE1VWF9TUkNfUEFEU19MT0NLIChzcGxpdG11eCk7CisKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHNwbGl0bXV4LT5wYWRzKTsKKyAgICAgIGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgIEdzdFBhZCAqcGFkID0gR1NUX1BBRCAoY3VyLT5kYXRhKTsKKyAgICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVCAoc3BsaXRtdXgpLCBwYWQpOworICB9CisgIGdfbGlzdF9mcmVlIChzcGxpdG11eC0+cGFkcyk7CisgIHNwbGl0bXV4LT5wYWRzID0gTlVMTDsKKyAgU1BMSVRNVVhfU1JDX1BBRFNfVU5MT0NLIChzcGxpdG11eCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfc3JjX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RTcGxpdE11eFNyYyAqc3BsaXRtdXggPSBHU1RfU1BMSVRNVVhfU1JDIChvYmplY3QpOworICBnX211dGV4X2NsZWFyICgmc3BsaXRtdXgtPmxvY2spOworICBnX211dGV4X2NsZWFyICgmc3BsaXRtdXgtPnBhZHNfbG9jayk7CisgIGdfZnJlZSAoc3BsaXRtdXgtPmxvY2F0aW9uKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTcGxpdE11eFNyYyAqc3BsaXRtdXggPSBHU1RfU1BMSVRNVVhfU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjp7CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGdfZnJlZSAoc3BsaXRtdXgtPmxvY2F0aW9uKTsKKyAgICAgIHNwbGl0bXV4LT5sb2NhdGlvbiA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTcGxpdE11eFNyYyAqc3BsaXRtdXggPSBHU1RfU1BMSVRNVVhfU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc3BsaXRtdXgtPmxvY2F0aW9uKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3NwbGl0bXV4X3NyY19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdFNwbGl0TXV4U3JjICpzcGxpdG11eCA9IChHc3RTcGxpdE11eFNyYyAqKSBlbGVtZW50OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOnsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOnsKKyAgICAgIGlmICghZ3N0X3NwbGl0bXV4X3NyY19zdGFydCAoc3BsaXRtdXgpKQorICAgICAgICByZXR1cm4gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICAvKiBNYWtlIHN1cmUgdGhlIGVsZW1lbnQgd2lsbCBzaHV0IGRvd24gKi8KKyAgICAgIGlmICghZ3N0X3NwbGl0bXV4X3NyY19zdG9wIChzcGxpdG11eCkpCisgICAgICAgIHJldHVybiBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICoKK2dzdF9zcGxpdG11eF9wYXJ0X2NyZWF0ZSAoR3N0U3BsaXRNdXhTcmMgKiBzcGxpdG11eCwgY2hhciAqZmlsZW5hbWUpCit7CisgIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqcjsKKworICByID0gZ19vYmplY3RfbmV3IChHU1RfVFlQRV9TUExJVE1VWF9QQVJUX1JFQURFUiwgTlVMTCk7CisKKyAgZ19zaWduYWxfY29ubmVjdCAociwgInByZXBhcmVkIiwgKEdDYWxsYmFjaykgZ3N0X3NwbGl0bXV4X3BhcnRfcHJlcGFyZWQsCisgICAgICBzcGxpdG11eCk7CisKKyAgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NldF9jYWxsYmFja3MgKHIsIHNwbGl0bXV4LAorICAgICAgKEdzdFNwbGl0TXV4UGFydFJlYWRlclBhZENiKSBnc3Rfc3BsaXRtdXhfZmluZF9vdXRwdXRfcGFkKTsKKyAgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NldF9sb2NhdGlvbiAociwgZmlsZW5hbWUpOworCisgIHJldHVybiByOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zcGxpdG11eF9jaGVja19uZXdfY2FwcyAoU3BsaXRNdXhTcmNQYWQgKiBzcGxpdHBhZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0Q2FwcyAqY3VyY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoKEdzdFBhZCAqKSAoc3BsaXRwYWQpKTsKKyAgR3N0Q2FwcyAqbmV3Y2FwczsKKyAgR3N0Q2FwcyAqdG1wY2FwczsKKyAgR3N0Q2FwcyAqdG1wY3VyY2FwczsKKworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmbmV3Y2Fwcyk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNwbGl0cGFkLCAiQ29tcGFyaW5nIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQKKyAgICAgICIgYW5kICUiIEdTVF9QVFJfRk9STUFULCBjdXJjYXBzLCBuZXdjYXBzKTsKKworICBpZiAoY3VyY2FwcyA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIC8qIElmIGNhcHMgYXJlIGV4YWN0bHkgZXF1YWwgZXhpdCBlYXJseSAqLworICBpZiAoZ3N0X2NhcHNfaXNfZXF1YWwgKGN1cmNhcHMsIG5ld2NhcHMpKSB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGN1cmNhcHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIE1vcmUgZXh0ZW5zaXZlIGNoZWNrLCBpZ25vcmUgY2hhbmdlcyBpbiBmcmFtZXJhdGUsIGJlY2F1c2UKKyAgICogZGVtdXhlcnMgZ2V0IHRoYXQgd3JvbmcgKi8KKyAgdG1wY2FwcyA9IGdzdF9jYXBzX2NvcHkgKG5ld2NhcHMpOworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAodG1wY2FwcywgMCk7CisgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCAiZnJhbWVyYXRlIik7CisKKyAgdG1wY3VyY2FwcyA9IGdzdF9jYXBzX2NvcHkgKGN1cmNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY3VyY2Fwcyk7CisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlICh0bXBjdXJjYXBzLCAwKTsKKyAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJmcmFtZXJhdGUiKTsKKworICAvKiBOb3cgY2hlY2sgaWYgdGhlc2UgZmlsdGVyZWQgY2FwcyBhcmUgZXF1YWwgKi8KKyAgaWYgKGdzdF9jYXBzX2lzX2VxdWFsICh0bXBjdXJjYXBzLCB0bXBjYXBzKSkgeworICAgIEdTVF9JTkZPX09CSkVDVCAoc3BsaXRwYWQsICJJZ25vcmluZyBmcmFtZXJhdGUtb25seSBjYXBzIGNoYW5nZSIpOworICAgIHJlcyA9IEZBTFNFOworICB9CisKKyAgZ3N0X2NhcHNfdW5yZWYgKHRtcGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAodG1wY3VyY2Fwcyk7CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfaGFuZGxlX2V2ZW50IChHc3RTcGxpdE11eFNyYyAqIHNwbGl0bXV4LAorICAgIFNwbGl0TXV4U3JjUGFkICogc3BsaXRwYWQsIEdzdFBhZCAqIHBhcnRfcGFkLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TVFJFQU1fU1RBUlQ6eworICAgICAgaWYgKHNwbGl0cGFkLT5zZW50X3N0cmVhbV9zdGFydCkKKyAgICAgICAgZ290byBkcm9wX2V2ZW50OworICAgICAgc3BsaXRwYWQtPnNlbnRfc3RyZWFtX3N0YXJ0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6eworICAgICAgaWYgKGdzdF9zcGxpdG11eF9lbmRfb2ZfcGFydCAoc3BsaXRtdXgsIHNwbGl0cGFkKSkKKyAgICAgICAgLy8gQ29udGludWluZyB0byBuZXh0IHBhcnQsIGRyb3AgdGhlIEVPUworICAgICAgICBnb3RvIGRyb3BfZXZlbnQ7CisgICAgICBpZiAoc3BsaXRtdXgtPnNlZ21lbnRfc2VxbnVtKQorICAgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZXZlbnQsIHNwbGl0bXV4LT5zZWdtZW50X3NlcW51bSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDp7CisgICAgICBHc3RDbG9ja1RpbWUgZHVyYXRpb247CisgICAgICBHc3RTZWdtZW50IHNlZzsKKworICAgICAgZ3N0X2V2ZW50X2NvcHlfc2VnbWVudCAoZXZlbnQsICZzZWcpOworCisgICAgICBzcGxpdHBhZC0+c2VnbWVudC5wb3NpdGlvbiA9IHNlZy5wb3NpdGlvbjsKKworICAgICAgaWYgKHNwbGl0cGFkLT5zZW50X3NlZ21lbnQpCisgICAgICAgIGdvdG8gZHJvcF9ldmVudDsgICAgICAgIC8qIFdlIGFscmVhZHkgZm9yd2FyZGVkIGEgc2VnbWVudCBldmVudCAqLworCisgICAgICAvKiBDYWxjdWxhdGUgb3V0cHV0IHNlZ21lbnQgKi8KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcGxpdHBhZCwgIlBhZCBzZWcgJSIgR1NUX1NFR01FTlRfRk9STUFUCisgICAgICAgICAgIiBnb3Qgc2VnICUiIEdTVF9TRUdNRU5UX0ZPUk1BVAorICAgICAgICAgICIgcGxheSBzZWcgJSIgR1NUX1NFR01FTlRfRk9STUFULAorICAgICAgICAgICZzcGxpdHBhZC0+c2VnbWVudCwgJnNlZywgJnNwbGl0bXV4LT5wbGF5X3NlZ21lbnQpOworCisgICAgICAvKiBJZiBwbGF5aW5nIGZvcndhcmQsIHRha2UgdGhlIHN0b3AgdGltZSBmcm9tIHRoZSBvdmVyYWxsCisgICAgICAgKiBzZWcgb3IgcGxheV9zZWdtZW50ICovCisgICAgICBpZiAoc3BsaXRtdXgtPnBsYXlfc2VnbWVudC5yYXRlID4gMC4wKSB7CisgICAgICAgIGlmIChzcGxpdG11eC0+cGxheV9zZWdtZW50LnN0b3AgIT0gLTEpCisgICAgICAgICAgc2VnLnN0b3AgPSBzcGxpdG11eC0+cGxheV9zZWdtZW50LnN0b3A7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzZWcuc3RvcCA9IHNwbGl0cGFkLT5zZWdtZW50LnN0b3A7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBSZXZlcnNlIHBsYXliYWNrIGZyb20gc3RvcCB0aW1lIHRvIHN0YXJ0IHRpbWUgKi8KKyAgICAgICAgLyogU2VlIGlmIGFuIGVuZCBwb2ludCB3YXMgcmVxdWVzdGVkIGluIHRoZSBzZWVrICovCisgICAgICAgIGlmIChzcGxpdG11eC0+cGxheV9zZWdtZW50LnN0YXJ0ICE9IC0xKSB7CisgICAgICAgICAgc2VnLnN0YXJ0ID0gc3BsaXRtdXgtPnBsYXlfc2VnbWVudC5zdGFydDsKKyAgICAgICAgICBzZWcudGltZSA9IHNwbGl0bXV4LT5wbGF5X3NlZ21lbnQudGltZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZWcuc3RhcnQgPSBzcGxpdHBhZC0+c2VnbWVudC5zdGFydDsKKyAgICAgICAgICBzZWcudGltZSA9IHNwbGl0cGFkLT5zZWdtZW50LnRpbWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgR1NUX09CSkVDVF9MT0NLIChzcGxpdG11eCk7CisgICAgICBkdXJhdGlvbiA9IHNwbGl0bXV4LT50b3RhbF9kdXJhdGlvbjsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdG11eCk7CisKKyAgICAgIGlmIChkdXJhdGlvbiA+IDApCisgICAgICAgIHNlZy5kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgZWxzZQorICAgICAgICBzZWcuZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHNwbGl0cGFkLAorICAgICAgICAgICJGb3J3YXJkaW5nIHNlZ21lbnQgJSIgR1NUX1NFR01FTlRfRk9STUFULCAmc2VnKTsKKworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZyk7CisgICAgICBpZiAoc3BsaXRtdXgtPnNlZ21lbnRfc2VxbnVtKQorICAgICAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZXZlbnQsIHNwbGl0bXV4LT5zZWdtZW50X3NlcW51bSk7CisgICAgICBzcGxpdHBhZC0+c2VudF9zZWdtZW50ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOnsKKyAgICAgIGlmICghZ3N0X3NwbGl0bXV4X2NoZWNrX25ld19jYXBzIChzcGxpdHBhZCwgZXZlbnQpKQorICAgICAgICBnb3RvIGRyb3BfZXZlbnQ7CisgICAgICBzcGxpdHBhZC0+c2VudF9jYXBzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBnc3RfcGFkX3B1c2hfZXZlbnQgKChHc3RQYWQgKikgKHNwbGl0cGFkKSwgZXZlbnQpOworICByZXR1cm47Citkcm9wX2V2ZW50OgorICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NwbGl0bXV4X2hhbmRsZV9idWZmZXIgKEdzdFNwbGl0TXV4U3JjICogc3BsaXRtdXgsCisgICAgU3BsaXRNdXhTcmNQYWQgKiBzcGxpdHBhZCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBpZiAoc3BsaXRwYWQtPmNsZWFyX25leHRfZGlzY29udCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChzcGxpdHBhZCwgIkNsZWFyaW5nIGRpc2NvbnQgZmxhZyBvbiBidWZmZXIiKTsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgIHNwbGl0cGFkLT5jbGVhcl9uZXh0X2Rpc2NvbnQgPSBGQUxTRTsKKyAgfQorICBpZiAoc3BsaXRwYWQtPnNldF9uZXh0X2Rpc2NvbnQpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoc3BsaXRwYWQsICJTZXR0aW5nIGRpc2NvbnQgZmxhZyBvbiBidWZmZXIiKTsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICBzcGxpdHBhZC0+c2V0X25leHRfZGlzY29udCA9IEZBTFNFOworICB9CisKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChHU1RfUEFEX0NBU1QgKHNwbGl0cGFkKSwgYnVmKTsKKworICBHU1RfTE9HX09CSkVDVCAoc3BsaXRwYWQsICJQYWQgcHVzaCByZXR1cm5lZCAlZCIsIHJldCk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BsaXRtdXhfcGFkX2xvb3AgKEdzdFBhZCAqIHBhZCkKK3sKKyAgLyogR2V0IG9uZSBldmVudC9idWZmZXIgZnJvbSB0aGUgYXNzb2NpYXRlZCBwYXJ0IGFuZCBwdXNoICovCisgIFNwbGl0TXV4U3JjUGFkICpzcGxpdHBhZCA9IChTcGxpdE11eFNyY1BhZCAqKSAocGFkKTsKKyAgR3N0U3BsaXRNdXhTcmMgKnNwbGl0bXV4ID0gKEdzdFNwbGl0TXV4U3JjICopIGdzdF9wYWRfZ2V0X3BhcmVudCAocGFkKTsKKyAgR3N0RGF0YVF1ZXVlSXRlbSAqaXRlbSA9IE5VTEw7CisgIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqcmVhZGVyID0gc3BsaXRwYWQtPnJlYWRlcjsKKyAgR3N0UGFkICpwYXJ0X3BhZDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzcGxpdHBhZCk7CisgIGlmIChzcGxpdHBhZC0+cGFydF9wYWQgPT0gTlVMTCkgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdHBhZCk7CisgICAgcmV0dXJuOworICB9CisgIHBhcnRfcGFkID0gZ3N0X29iamVjdF9yZWYgKHNwbGl0cGFkLT5wYXJ0X3BhZCk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcGxpdHBhZCk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNwbGl0cGFkLCAiUG9wcGluZyBkYXRhIHF1ZXVlIGl0ZW0gZnJvbSAlIiBHU1RfUFRSX0ZPUk1BVAorICAgICAgIiBwYWQgJSIgR1NUX1BUUl9GT1JNQVQsIHJlYWRlciwgcGFydF9wYWQpOworICByZXQgPSBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfcG9wIChyZWFkZXIsIHBhcnRfcGFkLCAmaXRlbSk7CisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRVJST1IpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKHJldCA9PSBHU1RfRkxPV19GTFVTSElORyB8fCBpdGVtID09IE5VTEwpCisgICAgZ290byBmbHVzaGluZzsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcGxpdHBhZCwgIkdvdCBkYXRhIHF1ZXVlIGl0ZW0gJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBpdGVtLT5vYmplY3QpOworCisgIGlmIChHU1RfSVNfRVZFTlQgKGl0ZW0tPm9iamVjdCkpIHsKKyAgICBHc3RFdmVudCAqZXZlbnQgPSAoR3N0RXZlbnQgKikgKGl0ZW0tPm9iamVjdCk7CisgICAgZ3N0X3NwbGl0bXV4X2hhbmRsZV9ldmVudCAoc3BsaXRtdXgsIHNwbGl0cGFkLCBwYXJ0X3BhZCwgZXZlbnQpOworICB9IGVsc2UgeworICAgIEdzdEJ1ZmZlciAqYnVmID0gKEdzdEJ1ZmZlciAqKSAoaXRlbS0+b2JqZWN0KTsKKyAgICBHc3RGbG93UmV0dXJuIHJldCA9IGdzdF9zcGxpdG11eF9oYW5kbGVfYnVmZmVyIChzcGxpdG11eCwgc3BsaXRwYWQsIGJ1Zik7CisgICAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSyAmJiByZXQgIT0gR1NUX0ZMT1dfRU9TKSkgeworICAgICAgLyogU3RvcCBpbW1lZGlhdGVseSBvbiBlcnJvciBvciBmbHVzaGluZyAqLworICAgICAgR1NUX0lORk9fT0JKRUNUIChzcGxpdHBhZCwgIlN0b3BwaW5nIGR1ZSB0byBwYWRfcHVzaCgpIHJlc3VsdCAlZCIsIHJldCk7CisgICAgICBnc3RfcGFkX3BhdXNlX3Rhc2sgKHBhZCk7CisgICAgICBpZiAocmV0IDwgR1NUX0ZMT1dfRU9TIHx8IHJldCA9PSBHU1RfRkxPV19OT1RfTElOS0VEKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0ZMT1dfRVJST1IgKHNwbGl0bXV4LCByZXQpOworICAgICAgfQorICAgIH0KKyAgfQorICBnX3NsaWNlX2ZyZWUgKEdzdERhdGFRdWV1ZUl0ZW0sIGl0ZW0pOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHBhcnRfcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3BsaXRtdXgpOworICByZXR1cm47CisKK2Vycm9yOgorICAvKiBGYWxsIHRocm91Z2ggKi8KKyAgR1NUX0VMRU1FTlRfRVJST1IgKHNwbGl0bXV4LCBSRVNPVVJDRSwgT1BFTl9SRUFELCAoTlVMTCksCisgICAgICAoIkVycm9yIHJlYWRpbmcgcGFydCBmaWxlICVzIiwgR1NUX1NUUl9OVUxMIChyZWFkZXItPnBhdGgpKSk7CitmbHVzaGluZzoKKyAgZ3N0X3BhZF9wYXVzZV90YXNrIChwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYXJ0X3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNwbGl0bXV4KTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zcGxpdG11eF9zcmNfYWN0aXZhdGVfcGFydCAoR3N0U3BsaXRNdXhTcmMgKiBzcGxpdG11eCwgZ3VpbnQgcGFydCwKKyAgICBHc3RTZWVrRmxhZ3MgZXh0cmFfZmxhZ3MpCit7CisgIEdMaXN0ICpjdXI7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsICJBY3RpdmF0aW5nIHBhcnQgJWQiLCBwYXJ0KTsKKworICBzcGxpdG11eC0+Y3VyX3BhcnQgPSBwYXJ0OworICBpZiAoIWdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9hY3RpdmF0ZSAoc3BsaXRtdXgtPnBhcnRzW3BhcnRdLAorICAgICAgICAgICZzcGxpdG11eC0+cGxheV9zZWdtZW50LCBleHRyYV9mbGFncykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIFNQTElUTVVYX1NSQ19QQURTX0xPQ0sgKHNwbGl0bXV4KTsKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHNwbGl0bXV4LT5wYWRzKTsKKyAgICAgIGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgIFNwbGl0TXV4U3JjUGFkICpzcGxpdHBhZCA9IChTcGxpdE11eFNyY1BhZCAqKSAoY3VyLT5kYXRhKTsKKyAgICBzcGxpdHBhZC0+Y3VyX3BhcnQgPSBwYXJ0OworICAgIHNwbGl0cGFkLT5yZWFkZXIgPSBzcGxpdG11eC0+cGFydHNbc3BsaXRwYWQtPmN1cl9wYXJ0XTsKKyAgICBpZiAoc3BsaXRwYWQtPnBhcnRfcGFkKQorICAgICAgZ3N0X29iamVjdF91bnJlZiAoc3BsaXRwYWQtPnBhcnRfcGFkKTsKKyAgICBzcGxpdHBhZC0+cGFydF9wYWQgPQorICAgICAgICBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfbG9va3VwX3BhZCAoc3BsaXRwYWQtPnJlYWRlciwKKyAgICAgICAgKEdzdFBhZCAqKSAoc3BsaXRwYWQpKTsKKworICAgIC8qIE1ha2Ugc3VyZSB3ZSBzdGFydCB3aXRoIGEgRElTQ09OVCAqLworICAgIHNwbGl0cGFkLT5zZXRfbmV4dF9kaXNjb250ID0gVFJVRTsKKyAgICBzcGxpdHBhZC0+Y2xlYXJfbmV4dF9kaXNjb250ID0gRkFMU0U7CisKKyAgICBnc3RfcGFkX3N0YXJ0X3Rhc2sgKEdTVF9QQUQgKHNwbGl0cGFkKSwKKyAgICAgICAgKEdzdFRhc2tGdW5jdGlvbikgZ3N0X3NwbGl0bXV4X3BhZF9sb29wLCBzcGxpdHBhZCwgTlVMTCk7CisgIH0KKyAgU1BMSVRNVVhfU1JDX1BBRFNfVU5MT0NLIChzcGxpdG11eCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NwbGl0bXV4X3NyY19zdGFydCAoR3N0U3BsaXRNdXhTcmMgKiBzcGxpdG11eCkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgZ2NoYXIgKmJhc2VuYW1lID0gTlVMTDsKKyAgZ2NoYXIgKmRpcm5hbWUgPSBOVUxMOworICBnY2hhciAqKmZpbGVzOworICBHc3RDbG9ja1RpbWUgbmV4dF9vZmZzZXQgPSAwOworICBndWludCBpOworICBHc3RDbG9ja1RpbWUgdG90YWxfZHVyYXRpb24gPSAwOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNwbGl0bXV4LCAiU3RhcnRpbmciKTsKKworICBnX3NpZ25hbF9lbWl0IChzcGxpdG11eCwgc2lnbmFsc1tTSUdOQUxfRk9STUFUX0xPQ0FUSU9OXSwgMCwgJmZpbGVzKTsKKworICBpZiAoZmlsZXMgPT0gTlVMTCB8fCAqZmlsZXMgPT0gTlVMTCkgeworICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgIGlmIChzcGxpdG11eC0+bG9jYXRpb24gIT0gTlVMTCAmJiBzcGxpdG11eC0+bG9jYXRpb25bMF0gIT0gJ1wwJykgeworICAgICAgYmFzZW5hbWUgPSBnX3BhdGhfZ2V0X2Jhc2VuYW1lIChzcGxpdG11eC0+bG9jYXRpb24pOworICAgICAgZGlybmFtZSA9IGdfcGF0aF9nZXRfZGlybmFtZSAoc3BsaXRtdXgtPmxvY2F0aW9uKTsKKyAgICB9CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKworICAgIGdfc3RyZnJlZXYgKGZpbGVzKTsKKyAgICBmaWxlcyA9IGdzdF9zcGxpdF91dGlsX2ZpbmRfZmlsZXMgKGRpcm5hbWUsIGJhc2VuYW1lLCAmZXJyKTsKKworICAgIGlmIChmaWxlcyA9PSBOVUxMIHx8ICpmaWxlcyA9PSBOVUxMKQorICAgICAgZ290byBub19maWxlczsKKyAgfQorCisgIFNQTElUTVVYX1NSQ19MT0NLIChzcGxpdG11eCk7CisgIHNwbGl0bXV4LT5wYWRzX2NvbXBsZXRlID0gRkFMU0U7CisgIHNwbGl0bXV4LT5ydW5uaW5nID0gVFJVRTsKKyAgU1BMSVRNVVhfU1JDX1VOTE9DSyAoc3BsaXRtdXgpOworCisgIHNwbGl0bXV4LT5udW1fcGFydHMgPSBnX3N0cnZfbGVuZ3RoIChmaWxlcyk7CisKKyAgc3BsaXRtdXgtPnBhcnRzID0gZ19uZXcwIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiwgc3BsaXRtdXgtPm51bV9wYXJ0cyk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNwbGl0bXV4LT5udW1fcGFydHM7IGkrKykgeworICAgIHNwbGl0bXV4LT5wYXJ0c1tpXSA9IGdzdF9zcGxpdG11eF9wYXJ0X2NyZWF0ZSAoc3BsaXRtdXgsIGZpbGVzW2ldKTsKKyAgICBpZiAoc3BsaXRtdXgtPnBhcnRzW2ldID09IE5VTEwpCisgICAgICBicmVhazsKKworICAgIC8qIEZpZ3VyZSBvdXQgdGhlIG5leHQgb2Zmc2V0IC0gdGhlIHNtYWxsZXN0IG9uZSAqLworICAgIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9zZXRfc3RhcnRfb2Zmc2V0IChzcGxpdG11eC0+cGFydHNbaV0sIG5leHRfb2Zmc2V0KTsKKyAgICBpZiAoIWdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9wcmVwYXJlIChzcGxpdG11eC0+cGFydHNbaV0pKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNwbGl0bXV4LAorICAgICAgICAgICJGYWlsZWQgdG8gcHJlcGFyZSBmaWxlIHBhcnQgJXMuIENhbm5vdCBwbGF5IHBhc3QgdGhlcmUuIiwgZmlsZXNbaV0pOworICAgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoc3BsaXRtdXgsIFJFU09VUkNFLCBSRUFELCAoTlVMTCksCisgICAgICAgICAgKCJGYWlsZWQgdG8gcHJlcGFyZSBmaWxlIHBhcnQgJXMuIENhbm5vdCBwbGF5IHBhc3QgdGhlcmUuIiwKKyAgICAgICAgICAgICAgZmlsZXNbaV0pKTsKKyAgICAgIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl91bnByZXBhcmUgKHNwbGl0bXV4LT5wYXJ0c1tpXSk7CisgICAgICBnX29iamVjdF91bnJlZiAoc3BsaXRtdXgtPnBhcnRzW2ldKTsKKyAgICAgIHNwbGl0bXV4LT5wYXJ0c1tpXSA9IE5VTEw7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBFeHRlbmQgb3VyIHRvdGFsIGR1cmF0aW9uIHRvIGNvdmVyIHRoaXMgcGFydCAqLworICAgIHRvdGFsX2R1cmF0aW9uID0KKyAgICAgICAgbmV4dF9vZmZzZXQgKworICAgICAgICBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfZ2V0X2R1cmF0aW9uIChzcGxpdG11eC0+cGFydHNbaV0pOworICAgIHNwbGl0bXV4LT5wbGF5X3NlZ21lbnQuZHVyYXRpb24gPSB0b3RhbF9kdXJhdGlvbjsKKworICAgIG5leHRfb2Zmc2V0ID0gZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2dldF9lbmRfb2Zmc2V0IChzcGxpdG11eC0+cGFydHNbaV0pOworICB9CisKKyAgLyogVXBkYXRlIHRvdGFsX2R1cmF0aW9uIHN0YXRlIHZhcmlhYmxlICovCisgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICBzcGxpdG11eC0+dG90YWxfZHVyYXRpb24gPSB0b3RhbF9kdXJhdGlvbjsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNwbGl0bXV4KTsKKworICAvKiBTdG9yZSBob3cgbWFueSBwYXJ0cyB3ZSBhY3R1YWxseSBjcmVhdGVkICovCisgIHNwbGl0bXV4LT5udW1fcGFydHMgPSBpOworCisgIGlmIChzcGxpdG11eC0+bnVtX3BhcnRzIDwgMSkKKyAgICBnb3RvIGZhaWxlZF9wYXJ0OworCisgIC8qIEFsbCBkb25lIHByZXBhcmluZywgYWN0aXZhdGUgdGhlIGZpcnN0IHBhcnQgKi8KKyAgR1NUX0lORk9fT0JKRUNUIChzcGxpdG11eCwKKyAgICAgICJBbGwgcGFydHMgcHJlcGFyZWQuIFRvdGFsIGR1cmF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiBBY3RpdmF0aW5nIGZpcnN0IHBhcnQiLCBHU1RfVElNRV9BUkdTICh0b3RhbF9kdXJhdGlvbikpOworICByZXQgPSBnc3Rfc3BsaXRtdXhfc3JjX2FjdGl2YXRlX3BhcnQgKHNwbGl0bXV4LCAwLCBHU1RfU0VFS19GTEFHX05PTkUpOworICBpZiAocmV0ID09IEZBTFNFKQorICAgIGdvdG8gZmFpbGVkX2ZpcnN0X3BhcnQ7Citkb25lOgorICBpZiAoZXJyICE9IE5VTEwpCisgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICBnX3N0cmZyZWV2IChmaWxlcyk7CisgIGdfZnJlZSAoYmFzZW5hbWUpOworICBnX2ZyZWUgKGRpcm5hbWUpOworCisgIHJldHVybiByZXQ7CisKKy8qIEVSUk9SUyAqLworbm9fZmlsZXM6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3BsaXRtdXgsIFJFU09VUkNFLCBPUEVOX1JFQUQsICgiJXMiLCBlcnItPm1lc3NhZ2UpLAorICAgICAgICAoIkZhaWxlZCB0byBmaW5kIGZpbGVzIGluICclcycgZm9yIHBhdHRlcm4gJyVzJyIsCisgICAgICAgICAgICBHU1RfU1RSX05VTEwgKGRpcm5hbWUpLCBHU1RfU1RSX05VTEwgKGJhc2VuYW1lKSkpOworICAgIGdvdG8gZG9uZTsKKyAgfQorZmFpbGVkX3BhcnQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3BsaXRtdXgsIFJFU09VUkNFLCBPUEVOX1JFQUQsIChOVUxMKSwKKyAgICAgICAgKCJGYWlsZWQgdG8gb3BlbiBhbnkgZmlsZXMgZm9yIHJlYWRpbmciKSk7CisgICAgZ290byBkb25lOworICB9CitmYWlsZWRfZmlyc3RfcGFydDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcGxpdG11eCwgUkVTT1VSQ0UsIE9QRU5fUkVBRCwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBhY3RpdmF0ZSBmaXJzdCBwYXJ0IGZvciBwbGF5YmFjayIpKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BsaXRtdXhfc3JjX3N0b3AgKEdzdFNwbGl0TXV4U3JjICogc3BsaXRtdXgpCit7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIGd1aW50IGk7CisgIEdMaXN0ICpjdXIsICpwYWRzX2xpc3Q7CisKKyAgU1BMSVRNVVhfU1JDX0xPQ0sgKHNwbGl0bXV4KTsKKyAgaWYgKCFzcGxpdG11eC0+cnVubmluZykKKyAgICBnb3RvIG91dDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcGxpdG11eCwgIlN0b3BwaW5nIik7CisKKyAgLyogU3RvcCBhbmQgZGVzdHJveSBhbGwgcGFydHMgICovCisgIGZvciAoaSA9IDA7IGkgPCBzcGxpdG11eC0+bnVtX3BhcnRzOyBpKyspIHsKKyAgICBpZiAoc3BsaXRtdXgtPnBhcnRzW2ldID09IE5VTEwpCisgICAgICBjb250aW51ZTsKKyAgICBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfdW5wcmVwYXJlIChzcGxpdG11eC0+cGFydHNbaV0pOworICAgIGdfb2JqZWN0X3VucmVmIChzcGxpdG11eC0+cGFydHNbaV0pOworICAgIHNwbGl0bXV4LT5wYXJ0c1tpXSA9IE5VTEw7CisgIH0KKworICBTUExJVE1VWF9TUkNfUEFEU19MT0NLIChzcGxpdG11eCk7CisgIHBhZHNfbGlzdCA9IHNwbGl0bXV4LT5wYWRzOworICBzcGxpdG11eC0+cGFkcyA9IE5VTEw7CisgIFNQTElUTVVYX1NSQ19QQURTX1VOTE9DSyAoc3BsaXRtdXgpOworCisgIFNQTElUTVVYX1NSQ19VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHBhZHNfbGlzdCk7IGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgIFNwbGl0TXV4U3JjUGFkICp0bXAgPSAoU3BsaXRNdXhTcmNQYWQgKikgKGN1ci0+ZGF0YSk7CisgICAgZ3N0X3BhZF9zdG9wX3Rhc2sgKEdTVF9QQUQgKHRtcCkpOworICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UIChzcGxpdG11eCksIEdTVF9QQUQgKHRtcCkpOworICB9CisgIGdfbGlzdF9mcmVlIChwYWRzX2xpc3QpOworICBTUExJVE1VWF9TUkNfTE9DSyAoc3BsaXRtdXgpOworCisgIGdfZnJlZSAoc3BsaXRtdXgtPnBhcnRzKTsKKyAgc3BsaXRtdXgtPnBhcnRzID0gTlVMTDsKKyAgc3BsaXRtdXgtPm51bV9wYXJ0cyA9IDA7CisgIHNwbGl0bXV4LT5ydW5uaW5nID0gRkFMU0U7CisgIHNwbGl0bXV4LT50b3RhbF9kdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIC8qIFJlc2V0IHBsYXliYWNrIHNlZ21lbnQgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNwbGl0bXV4LT5wbGF5X3NlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CitvdXQ6CisgIFNQTElUTVVYX1NSQ19VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgcmV0dXJuIHJldDsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0U3BsaXRNdXhTcmMgKnNwbGl0bXV4OworICBTcGxpdE11eFNyY1BhZCAqc3BsaXRwYWQ7Cit9IFNwbGl0TXV4QW5kUGFkOworCitzdGF0aWMgZ2Jvb2xlYW4KK2hhbmRsZV9zdGlja3lfZXZlbnRzIChHc3RQYWQgKiBwYWQsIEdzdEV2ZW50ICoqIGV2ZW50LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIFNwbGl0TXV4QW5kUGFkICpzcGxpdG11eF9hbmRfcGFkOworICBHc3RTcGxpdE11eFNyYyAqc3BsaXRtdXg7CisgIFNwbGl0TXV4U3JjUGFkICpzcGxpdHBhZDsKKworICBzcGxpdG11eF9hbmRfcGFkID0gdXNlcl9kYXRhOworICBzcGxpdG11eCA9IHNwbGl0bXV4X2FuZF9wYWQtPnNwbGl0bXV4OworICBzcGxpdHBhZCA9IHNwbGl0bXV4X2FuZF9wYWQtPnNwbGl0cGFkOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNwbGl0cGFkLCAiaGFuZGxlIHN0aWNreSBldmVudCAlIiBHU1RfUFRSX0ZPUk1BVCwgKmV2ZW50KTsKKyAgZ3N0X2V2ZW50X3JlZiAoKmV2ZW50KTsKKyAgZ3N0X3NwbGl0bXV4X2hhbmRsZV9ldmVudCAoc3BsaXRtdXgsIHNwbGl0cGFkLCBwYWQsICpldmVudCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RQYWQgKgorZ3N0X3NwbGl0bXV4X2ZpbmRfb3V0cHV0X3BhZCAoR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICogcGFydCwgR3N0UGFkICogcGFkLAorICAgIEdzdFNwbGl0TXV4U3JjICogc3BsaXRtdXgpCit7CisgIEdMaXN0ICpjdXI7CisgIGdjaGFyICpwYWRfbmFtZSA9IGdzdF9wYWRfZ2V0X25hbWUgKHBhZCk7CisgIEdzdFBhZCAqdGFyZ2V0ID0gTlVMTDsKKyAgZ2Jvb2xlYW4gaXNfbmV3X3BhZCA9IEZBTFNFOworCisgIFNQTElUTVVYX1NSQ19MT0NLIChzcGxpdG11eCk7CisgIFNQTElUTVVYX1NSQ19QQURTX0xPQ0sgKHNwbGl0bXV4KTsKKyAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHNwbGl0bXV4LT5wYWRzKTsKKyAgICAgIGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgIEdzdFBhZCAqdG1wID0gKEdzdFBhZCAqKSAoY3VyLT5kYXRhKTsKKyAgICBpZiAoZ19zdHJfZXF1YWwgKEdTVF9QQURfTkFNRSAodG1wKSwgcGFkX25hbWUpKSB7CisgICAgICB0YXJnZXQgPSB0bXA7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAodGFyZ2V0ID09IE5VTEwgJiYgIXNwbGl0bXV4LT5wYWRzX2NvbXBsZXRlKSB7CisgICAgU3BsaXRNdXhBbmRQYWQgc3BsaXRtdXhfYW5kX3BhZDsKKworICAgIC8qIE5vIHBhZCBmb3VuZCwgY3JlYXRlIG9uZSAqLworICAgIHRhcmdldCA9IGdfb2JqZWN0X25ldyAoU1BMSVRNVVhfVFlQRV9TUkNfUEFELAorICAgICAgICAibmFtZSIsIHBhZF9uYW1lLCAiZGlyZWN0aW9uIiwgR1NUX1BBRF9TUkMsIE5VTEwpOworICAgIHNwbGl0bXV4LT5wYWRzID0gZ19saXN0X3ByZXBlbmQgKHNwbGl0bXV4LT5wYWRzLCB0YXJnZXQpOworCisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlICh0YXJnZXQsIFRSVUUpOworCisgICAgc3BsaXRtdXhfYW5kX3BhZC5zcGxpdG11eCA9IHNwbGl0bXV4OworICAgIHNwbGl0bXV4X2FuZF9wYWQuc3BsaXRwYWQgPSAoU3BsaXRNdXhTcmNQYWQgKikgdGFyZ2V0OworICAgIGdzdF9wYWRfc3RpY2t5X2V2ZW50c19mb3JlYWNoIChwYWQsIGhhbmRsZV9zdGlja3lfZXZlbnRzLAorICAgICAgICAmc3BsaXRtdXhfYW5kX3BhZCk7CisgICAgaXNfbmV3X3BhZCA9IFRSVUU7CisgIH0KKyAgU1BMSVRNVVhfU1JDX1BBRFNfVU5MT0NLIChzcGxpdG11eCk7CisgIFNQTElUTVVYX1NSQ19VTkxPQ0sgKHNwbGl0bXV4KTsKKworICBnX2ZyZWUgKHBhZF9uYW1lKTsKKworICBpZiAodGFyZ2V0ID09IE5VTEwpCisgICAgZ290byBwYWRfbm90X2ZvdW5kOworCisgIGlmIChpc19uZXdfcGFkKQorICAgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHNwbGl0bXV4KSwgdGFyZ2V0KTsKKworICByZXR1cm4gdGFyZ2V0OworCitwYWRfbm90X2ZvdW5kOgorICBHU1RfRUxFTUVOVF9FUlJPUiAoc3BsaXRtdXgsIFNUUkVBTSwgRkFJTEVELCAoTlVMTCksCisgICAgICAoIlN0cmVhbSBwYXJ0ICVzIGNvbnRhaW5zIGV4dHJhIHVua25vd24gcGFkICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICAgIHBhcnQtPnBhdGgsIHBhZCkpOworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGxpdG11eF9wYXJ0X3ByZXBhcmVkIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIsCisgICAgR3N0U3BsaXRNdXhTcmMgKiBzcGxpdG11eCkKK3sKKyAgZ2Jvb2xlYW4gbmVlZF9ub19tb3JlX3BhZHM7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNwbGl0bXV4LCAiUGFydCAlIiBHU1RfUFRSX0ZPUk1BVCAiIHByZXBhcmVkIiwgcmVhZGVyKTsKKyAgU1BMSVRNVVhfU1JDX0xPQ0sgKHNwbGl0bXV4KTsKKyAgbmVlZF9ub19tb3JlX3BhZHMgPSAhc3BsaXRtdXgtPnBhZHNfY29tcGxldGU7CisgIHNwbGl0bXV4LT5wYWRzX2NvbXBsZXRlID0gVFJVRTsKKyAgU1BMSVRNVVhfU1JDX1VOTE9DSyAoc3BsaXRtdXgpOworCisgIGlmIChuZWVkX25vX21vcmVfcGFkcykgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNwbGl0bXV4LCAiU2lnbmFsbGluZyBuby1tb3JlLXBhZHMiKTsKKyAgICBnc3RfZWxlbWVudF9ub19tb3JlX3BhZHMgKEdTVF9FTEVNRU5UX0NBU1QgKHNwbGl0bXV4KSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGxpdG11eF9wdXNoX2V2ZW50IChHc3RTcGxpdE11eFNyYyAqIHNwbGl0bXV4LCBHc3RFdmVudCAqIGUsCisgICAgZ3VpbnQzMiBzZXFudW0pCit7CisgIEdMaXN0ICpjdXI7CisKKyAgaWYgKHNlcW51bSkKKyAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZSwgc2VxbnVtKTsKKworICBTUExJVE1VWF9TUkNfUEFEU19MT0NLIChzcGxpdG11eCk7CisgIGZvciAoY3VyID0gZ19saXN0X2ZpcnN0IChzcGxpdG11eC0+cGFkcyk7CisgICAgICBjdXIgIT0gTlVMTDsgY3VyID0gZ19saXN0X25leHQgKGN1cikpIHsKKyAgICBHc3RQYWQgKnBhZCA9IEdTVF9QQURfQ0FTVCAoY3VyLT5kYXRhKTsKKyAgICBnc3RfZXZlbnRfcmVmIChlKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHBhZCwgZSk7CisgIH0KKyAgU1BMSVRNVVhfU1JDX1BBRFNfVU5MT0NLIChzcGxpdG11eCk7CisKKyAgZ3N0X2V2ZW50X3VucmVmIChlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGxpdG11eF9wdXNoX2ZsdXNoX3N0b3AgKEdzdFNwbGl0TXV4U3JjICogc3BsaXRtdXgsIGd1aW50MzIgc2VxbnVtKQoreworICBHc3RFdmVudCAqZSA9IGdzdF9ldmVudF9uZXdfZmx1c2hfc3RvcCAoVFJVRSk7CisgIEdMaXN0ICpjdXI7CisKKyAgaWYgKHNlcW51bSkKKyAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZSwgc2VxbnVtKTsKKworICBTUExJVE1VWF9TUkNfUEFEU19MT0NLIChzcGxpdG11eCk7CisgIGZvciAoY3VyID0gZ19saXN0X2ZpcnN0IChzcGxpdG11eC0+cGFkcyk7CisgICAgICBjdXIgIT0gTlVMTDsgY3VyID0gZ19saXN0X25leHQgKGN1cikpIHsKKyAgICBTcGxpdE11eFNyY1BhZCAqdGFyZ2V0ID0gKFNwbGl0TXV4U3JjUGFkICopIChjdXItPmRhdGEpOworCisgICAgZ3N0X2V2ZW50X3JlZiAoZSk7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChHU1RfUEFEX0NBU1QgKHRhcmdldCksIGUpOworICAgIHRhcmdldC0+c2VudF9jYXBzID0gRkFMU0U7CisgICAgdGFyZ2V0LT5zZW50X3N0cmVhbV9zdGFydCA9IEZBTFNFOworICAgIHRhcmdldC0+c2VudF9zZWdtZW50ID0gRkFMU0U7CisgIH0KKyAgU1BMSVRNVVhfU1JDX1BBRFNfVU5MT0NLIChzcGxpdG11eCk7CisKKyAgZ3N0X2V2ZW50X3VucmVmIChlKTsKK30KKworLyogQ2FsbGJhY2sgZm9yIHdoZW4gYSBwYXJ0IGZpbmlzaGVzIGFuZCB3ZSBuZWVkIHRvIG1vdmUgdG8gdGhlIG5leHQgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NwbGl0bXV4X2VuZF9vZl9wYXJ0IChHc3RTcGxpdE11eFNyYyAqIHNwbGl0bXV4LCBTcGxpdE11eFNyY1BhZCAqIHNwbGl0cGFkKQoreworICBnaW50IG5leHRfcGFydCA9IC0xOworICBnaW50IGN1cl9wYXJ0ID0gc3BsaXRwYWQtPmN1cl9wYXJ0OworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKworICBpZiAoc3BsaXRtdXgtPnBsYXlfc2VnbWVudC5yYXRlID49IDAuMCkgeworICAgIGlmIChjdXJfcGFydCArIDEgPCBzcGxpdG11eC0+bnVtX3BhcnRzKQorICAgICAgbmV4dF9wYXJ0ID0gY3VyX3BhcnQgKyAxOworICAgIC8qIE1ha2Ugc3VyZSB0aGUgdHJhbnNpdGlvbiBpcyBzZWFtbGVzcyAqLworICAgIHNwbGl0cGFkLT5zZXRfbmV4dF9kaXNjb250ID0gRkFMU0U7CisgICAgc3BsaXRwYWQtPmNsZWFyX25leHRfZGlzY29udCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgLyogUmV2ZXJzZSBwbGF5IC0gbW92ZSB0byBwcmV2aW91cyBzZWdtZW50ICovCisgICAgaWYgKGN1cl9wYXJ0ID4gMCkgeworICAgICAgbmV4dF9wYXJ0ID0gY3VyX3BhcnQgLSAxOworICAgICAgLyogTm9uLXNlYW1sZXNzIHRyYW5zaXRpb24gaW4gcmV2ZXJzZSAqLworICAgICAgc3BsaXRwYWQtPnNldF9uZXh0X2Rpc2NvbnQgPSBUUlVFOworICAgICAgc3BsaXRwYWQtPmNsZWFyX25leHRfZGlzY29udCA9IEZBTFNFOworICAgIH0KKyAgfQorCisgIFNQTElUTVVYX1NSQ19MT0NLIChzcGxpdG11eCk7CisKKyAgLyogSWYgYWxsIHBhZHMgYXJlIGRvbmUgd2l0aCB0aGlzIHBhcnQsIGRlYWN0aXZhdGUgaXQgKi8KKyAgaWYgKGdzdF9zcGxpdG11eF9wYXJ0X2lzX2VvcyAoc3BsaXRtdXgtPnBhcnRzW3NwbGl0cGFkLT5jdXJfcGFydF0pKQorICAgIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9kZWFjdGl2YXRlIChzcGxpdG11eC0+cGFydHNbY3VyX3BhcnRdKTsKKworICBpZiAoc3BsaXRtdXgtPnBsYXlfc2VnbWVudC5yYXRlID49IDAuMCkgeworICAgIGlmIChzcGxpdG11eC0+cGxheV9zZWdtZW50LnN0b3AgIT0gLTEpIHsKKyAgICAgIEdzdENsb2NrVGltZSBwYXJ0X2VuZCA9CisgICAgICAgICAgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2dldF9lbmRfb2Zmc2V0IChzcGxpdG11eC0+cGFydHNbY3VyX3BhcnRdKTsKKyAgICAgIGlmIChwYXJ0X2VuZCA+PSBzcGxpdG11eC0+cGxheV9zZWdtZW50LnN0b3ApIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICAgICAiU3RvcCBwb3NpdGlvbiB3YXMgd2l0aGluIHRoYXQgcGFydC4gRmluaXNoaW5nIik7CisgICAgICAgIG5leHRfcGFydCA9IC0xOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoc3BsaXRtdXgtPnBsYXlfc2VnbWVudC5zdGFydCAhPSAtMSkgeworICAgICAgR3N0Q2xvY2tUaW1lIHBhcnRfc3RhcnQgPQorICAgICAgICAgIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9nZXRfc3RhcnRfb2Zmc2V0IChzcGxpdG11eC0+cGFydHNbY3VyX3BhcnRdKTsKKyAgICAgIGlmIChwYXJ0X3N0YXJ0IDw9IHNwbGl0bXV4LT5wbGF5X3NlZ21lbnQuc3RhcnQpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICAgICAiU3RhcnQgcG9zaXRpb24gJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICAgICAiIHdhcyB3aXRoaW4gdGhhdCBwYXJ0LiBGaW5pc2hpbmciLAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc3BsaXRtdXgtPnBsYXlfc2VnbWVudC5zdGFydCkpOworICAgICAgICBuZXh0X3BhcnQgPSAtMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAobmV4dF9wYXJ0ICE9IC0xKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsICJBdCBFT1Mgb24gcGFkICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAgICIgbW92aW5nIHRvIHBhcnQgJWQiLCBzcGxpdHBhZCwgbmV4dF9wYXJ0KTsKKyAgICBzcGxpdHBhZC0+Y3VyX3BhcnQgPSBuZXh0X3BhcnQ7CisgICAgc3BsaXRwYWQtPnJlYWRlciA9IHNwbGl0bXV4LT5wYXJ0c1tzcGxpdHBhZC0+Y3VyX3BhcnRdOworICAgIGlmIChzcGxpdHBhZC0+cGFydF9wYWQpCisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChzcGxpdHBhZC0+cGFydF9wYWQpOworICAgIHNwbGl0cGFkLT5wYXJ0X3BhZCA9CisgICAgICAgIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9sb29rdXBfcGFkIChzcGxpdHBhZC0+cmVhZGVyLAorICAgICAgICAoR3N0UGFkICopIChzcGxpdHBhZCkpOworCisgICAgaWYgKHNwbGl0bXV4LT5jdXJfcGFydCAhPSBuZXh0X3BhcnQpIHsKKyAgICAgIGlmICghZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2lzX2FjdGl2ZSAoc3BsaXRwYWQtPnJlYWRlcikpIHsKKyAgICAgICAgR3N0U2VnbWVudCB0bXA7CisgICAgICAgIC8qIElmIG1vdmluZyBiYWNrd2FyZCBpbnRvIGEgbmV3IHBhcnQsIHNldCBzdG9wCisgICAgICAgICAqIHRvIC0xIHRvIGVuc3VyZSB3ZSBwbGF5IHRoZSBlbnRpcmUgZmlsZSAtIHdvcmthcm91bmQKKyAgICAgICAgICogYSBidWcgaW4gcXRkZW11eCB0aGF0IG1pc3NlcyBiaXRzIGF0IHRoZSBlbmQgKi8KKyAgICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvICgmc3BsaXRtdXgtPnBsYXlfc2VnbWVudCwgJnRtcCk7CisgICAgICAgIGlmICh0bXAucmF0ZSA8IDApCisgICAgICAgICAgdG1wLnN0b3AgPSAtMTsKKworICAgICAgICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBwYWQgdG8gbW92ZSB0byB0aGUgbmV3IHBhcnQsIGFjdGl2YXRlIGl0ICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNwbGl0cGFkLAorICAgICAgICAgICAgIkZpcnN0IHBhZCB0byBjaGFuZ2UgcGFydC4gQWN0aXZhdGluZyBwYXJ0ICVkIHdpdGggc2VnICUiCisgICAgICAgICAgICBHU1RfU0VHTUVOVF9GT1JNQVQsIG5leHRfcGFydCwgJnRtcCk7CisgICAgICAgIGlmICghZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2FjdGl2YXRlIChzcGxpdHBhZC0+cmVhZGVyLCAmdG1wLAorICAgICAgICAgICAgICAgIEdTVF9TRUVLX0ZMQUdfTk9ORSkpCisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0KKyAgICAgIHNwbGl0bXV4LT5jdXJfcGFydCA9IG5leHRfcGFydDsKKyAgICB9CisgICAgcmVzID0gVFJVRTsKKyAgfQorCisgIFNQTElUTVVYX1NSQ19VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgcmV0dXJuIHJlczsKK2Vycm9yOgorICBTUExJVE1VWF9TUkNfVU5MT0NLIChzcGxpdG11eCk7CisgIEdTVF9FTEVNRU5UX0VSUk9SIChzcGxpdG11eCwgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICgiRmFpbGVkIHRvIGFjdGl2YXRlIHBhcnQgJWQiLCBzcGxpdG11eC0+Y3VyX3BhcnQpKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitHX0RFRklORV9UWVBFIChTcGxpdE11eFNyY1BhZCwgc3BsaXRtdXhfc3JjX3BhZCwgR1NUX1RZUEVfUEFEKTsKKworc3RhdGljIHZvaWQKK3NwbGl0bXV4X3NyY19wYWRfY29uc3RydWN0ZWQgKEdPYmplY3QgKiBwYWQpCit7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChHU1RfUEFEIChwYWQpLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKHNwbGl0bXV4X3NyY19wYWRfZXZlbnQpKTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKEdTVF9QQUQgKHBhZCksCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoc3BsaXRtdXhfc3JjX3BhZF9xdWVyeSkpOworCisgIEdfT0JKRUNUX0NMQVNTIChzcGxpdG11eF9zcmNfcGFkX3BhcmVudF9jbGFzcyktPmNvbnN0cnVjdGVkIChwYWQpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwbGl0bXV4X3NyY19wYWRfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgU3BsaXRNdXhTcmNQYWQgKnBhZCA9IChTcGxpdE11eFNyY1BhZCAqKSAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHBhZCk7CisgIGlmIChwYWQtPnBhcnRfcGFkKSB7CisgICAgZ3N0X29iamVjdF91bnJlZiAocGFkLT5wYXJ0X3BhZCk7CisgICAgcGFkLT5wYXJ0X3BhZCA9IE5VTEw7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHBhZCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHNwbGl0bXV4X3NyY19wYWRfcGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3NwbGl0bXV4X3NyY19wYWRfY2xhc3NfaW5pdCAoU3BsaXRNdXhTcmNQYWRDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3Rfa2xhc3MgPSAoR09iamVjdENsYXNzICopIChrbGFzcyk7CisKKyAgZ29iamVjdF9rbGFzcy0+Y29uc3RydWN0ZWQgPSBzcGxpdG11eF9zcmNfcGFkX2NvbnN0cnVjdGVkOworICBnb2JqZWN0X2tsYXNzLT5kaXNwb3NlID0gZ3N0X3NwbGl0bXV4X3NyY19wYWRfZGlzcG9zZTsKK30KKworc3RhdGljIHZvaWQKK3NwbGl0bXV4X3NyY19wYWRfaW5pdCAoU3BsaXRNdXhTcmNQYWQgKiBwYWQpCit7Cit9CisKKy8qIEV2ZW50IGhhbmRsZXIgZm9yIHNvdXJjZSBwYWRzLiBQcm94eSBldmVudHMgaW50byB0aGUgY2hpbGQKKyAqIHBhcnRzIGFzIG5lZWRlZAorICovCitzdGF0aWMgZ2Jvb2xlYW4KK3NwbGl0bXV4X3NyY19wYWRfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RTcGxpdE11eFNyYyAqc3BsaXRtdXggPSBHU1RfU1BMSVRNVVhfU1JDIChwYXJlbnQpOworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYXJlbnQsICJldmVudCAlIiBHU1RfUFRSX0ZPUk1BVAorICAgICAgIiBvbiAlIiBHU1RfUFRSX0ZPUk1BVCwgZXZlbnQsIHBhZCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzp7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworICAgICAgZ2RvdWJsZSByYXRlOworICAgICAgR3N0U2Vla0ZsYWdzIGZsYWdzOworICAgICAgR3N0U2Vla1R5cGUgc3RhcnRfdHlwZSwgc3RvcF90eXBlOworICAgICAgZ2ludDY0IHN0YXJ0LCBzdG9wOworICAgICAgZ3VpbnQzMiBzZXFudW07CisgICAgICBnaW50IGk7CisgICAgICBHc3RDbG9ja1RpbWUgcGFydF9zdGFydCwgcG9zaXRpb247CisgICAgICBHTGlzdCAqY3VyOworICAgICAgR3N0U2VnbWVudCB0bXA7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgJnJhdGUsICZmb3JtYXQsICZmbGFncywKKyAgICAgICAgICAmc3RhcnRfdHlwZSwgJnN0YXJ0LCAmc3RvcF90eXBlLCAmc3RvcCk7CisKKyAgICAgIGlmIChmb3JtYXQgIT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNwbGl0bXV4LCAiY2FuIG9ubHkgc2VlayBvbiBUSU1FIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICB9CisgICAgICAvKiBGSVhNRTogU3VwcG9ydCBub24tZmx1c2hpbmcgc2Vla3MsIHdoaWNoIG1pZ2h0IG5ldmVyIHdha2UgdXAgKi8KKyAgICAgIGlmICghKGZsYWdzICYgR1NUX1NFRUtfRkxBR19GTFVTSCkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsICJPbmx5IGZsdXNoaW5nIHNlZWtzIHN1cHBvcnRlZCIpOworICAgICAgICBnb3RvIGVycm9yOworICAgICAgfQorICAgICAgc2VxbnVtID0gZ3N0X2V2ZW50X2dldF9zZXFudW0gKGV2ZW50KTsKKworICAgICAgU1BMSVRNVVhfU1JDX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGlmICghc3BsaXRtdXgtPnJ1bm5pbmcgfHwgc3BsaXRtdXgtPm51bV9wYXJ0cyA8IDEpIHsKKyAgICAgICAgLyogTm90IHN0YXJ0ZWQgeWV0ICovCisgICAgICAgIFNQTElUTVVYX1NSQ19VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0KKworICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvICgmc3BsaXRtdXgtPnBsYXlfc2VnbWVudCwgJnRtcCk7CisKKyAgICAgIGlmICghZ3N0X3NlZ21lbnRfZG9fc2VlayAoJnRtcCwgcmF0ZSwKKyAgICAgICAgICAgICAgZm9ybWF0LCBmbGFncywgc3RhcnRfdHlwZSwgc3RhcnQsIHN0b3BfdHlwZSwgc3RvcCwgTlVMTCkpIHsKKyAgICAgICAgLyogSW52YWxpZCBzZWVrIHJlcXVlc3RlZCwgaWdub3JlIGl0ICovCisgICAgICAgIFNQTElUTVVYX1NSQ19VTkxPQ0sgKHNwbGl0bXV4KTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0KKyAgICAgIHBvc2l0aW9uID0gdG1wLnBvc2l0aW9uOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcGxpdG11eCwgIlBlcmZvcm1pbmcgc2VlayB3aXRoIHNlZyAlIgorICAgICAgICAgIEdTVF9TRUdNRU5UX0ZPUk1BVCwgJnRtcCk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNwbGl0bXV4LAorICAgICAgICAgICJIYW5kbGluZyBmbHVzaGluZyBzZWVrLiBTZW5kaW5nIGZsdXNoIHN0YXJ0Iik7CisKKyAgICAgIC8qIFNlbmQgZmx1c2hfc3RhcnQgKi8KKyAgICAgIGdzdF9zcGxpdG11eF9wdXNoX2V2ZW50IChzcGxpdG11eCwgZ3N0X2V2ZW50X25ld19mbHVzaF9zdGFydCAoKSwgc2VxbnVtKTsKKworICAgICAgLyogU3RvcCBhbGwgcGFydHMsIHdoaWNoIHdpbGwgd29yayBiZWNhdXNlIG9mIHRoZSBmbHVzaCAqLworICAgICAgU1BMSVRNVVhfU1JDX1BBRFNfTE9DSyAoc3BsaXRtdXgpOworICAgICAgU1BMSVRNVVhfU1JDX1VOTE9DSyAoc3BsaXRtdXgpOworICAgICAgZm9yIChjdXIgPSBnX2xpc3RfZmlyc3QgKHNwbGl0bXV4LT5wYWRzKTsKKyAgICAgICAgICBjdXIgIT0gTlVMTDsgY3VyID0gZ19saXN0X25leHQgKGN1cikpIHsKKyAgICAgICAgU3BsaXRNdXhTcmNQYWQgKnRhcmdldCA9IChTcGxpdE11eFNyY1BhZCAqKSAoY3VyLT5kYXRhKTsKKyAgICAgICAgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpyZWFkZXIgPSBzcGxpdG11eC0+cGFydHNbdGFyZ2V0LT5jdXJfcGFydF07CisgICAgICAgIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9kZWFjdGl2YXRlIChyZWFkZXIpOworICAgICAgfQorCisgICAgICAvKiBTaHV0IGRvd24gcGFkIHRhc2tzICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcGxpdG11eCwgIlBhdXNpbmcgcGFkIHRhc2tzIik7CisgICAgICBmb3IgKGN1ciA9IGdfbGlzdF9maXJzdCAoc3BsaXRtdXgtPnBhZHMpOworICAgICAgICAgIGN1ciAhPSBOVUxMOyBjdXIgPSBnX2xpc3RfbmV4dCAoY3VyKSkgeworICAgICAgICBHc3RQYWQgKnNwbGl0cGFkID0gKEdzdFBhZCAqKSAoY3VyLT5kYXRhKTsKKyAgICAgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChHU1RfUEFEIChzcGxpdHBhZCkpOworICAgICAgfQorICAgICAgU1BMSVRNVVhfU1JDX1BBRFNfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBTUExJVE1VWF9TUkNfTE9DSyAoc3BsaXRtdXgpOworCisgICAgICAvKiBTZW5kIGZsdXNoIHN0b3AgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNwbGl0bXV4LCAiU2VuZGluZyBmbHVzaCBzdG9wIik7CisgICAgICBnc3Rfc3BsaXRtdXhfcHVzaF9mbHVzaF9zdG9wIChzcGxpdG11eCwgc2VxbnVtKTsKKworICAgICAgLyogRXZlcnl0aGluZyBpcyBzdG9wcGVkLCBzbyB1cGRhdGUgdGhlIHBsYXlfc2VnbWVudCAqLworICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvICgmdG1wLCAmc3BsaXRtdXgtPnBsYXlfc2VnbWVudCk7CisgICAgICBzcGxpdG11eC0+c2VnbWVudF9zZXFudW0gPSBzZXFudW07CisKKyAgICAgIC8qIFdvcmsgb3V0IHdoZXJlIHRvIHN0YXJ0IGZyb20gbm93ICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgc3BsaXRtdXgtPm51bV9wYXJ0czsgaSsrKSB7CisgICAgICAgIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqcmVhZGVyID0gc3BsaXRtdXgtPnBhcnRzW2ldOworICAgICAgICBHc3RDbG9ja1RpbWUgcGFydF9lbmQgPQorICAgICAgICAgICAgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX2dldF9lbmRfb2Zmc2V0IChyZWFkZXIpOworCisgICAgICAgIGlmIChwYXJ0X2VuZCA+IHBvc2l0aW9uKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGkgPT0gc3BsaXRtdXgtPm51bV9wYXJ0cykKKyAgICAgICAgaSA9IHNwbGl0bXV4LT5udW1fcGFydHMgLSAxOworCisgICAgICBwYXJ0X3N0YXJ0ID0KKyAgICAgICAgICBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfZ2V0X3N0YXJ0X29mZnNldCAoc3BsaXRtdXgtPnBhcnRzW2ldKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3BsaXRtdXgsCisgICAgICAgICAgIlNlZWsgdG8gdGltZSAlIiBHU1RfVElNRV9GT1JNQVQgIiBsYW5kZWQgaW4gcGFydCAlZCBvZmZzZXQgJSIKKyAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHBvc2l0aW9uKSwKKyAgICAgICAgICBpLCBHU1RfVElNRV9BUkdTIChwb3NpdGlvbiAtIHBhcnRfc3RhcnQpKTsKKworICAgICAgcmV0ID0gZ3N0X3NwbGl0bXV4X3NyY19hY3RpdmF0ZV9wYXJ0IChzcGxpdG11eCwgaSwgZmxhZ3MpOworICAgICAgU1BMSVRNVVhfU1JDX1VOTE9DSyAoc3BsaXRtdXgpOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKK2Vycm9yOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3NwbGl0bXV4X3NyY19wYWRfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICAvKiBRdWVyeSBoYW5kbGVyIGZvciBzb3VyY2UgcGFkcy4gUHJveHkgcXVlcmllcyBpbnRvIHRoZSBjaGlsZAorICAgKiBwYXJ0cyBhcyBuZWVkZWQKKyAgICovCisgIEdzdFNwbGl0TXV4U3JjICpzcGxpdG11eCA9IEdTVF9TUExJVE1VWF9TUkMgKHBhcmVudCk7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIEdTVF9MT0dfT0JKRUNUIChwYXJlbnQsICJxdWVyeSAlIiBHU1RfUFRSX0ZPUk1BVAorICAgICAgIiBvbiAlIiBHU1RfUFRSX0ZPUk1BVCwgcXVlcnksIHBhZCk7CisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0NBUFM6CisgICAgY2FzZSBHU1RfUVVFUllfUE9TSVRJT046eworICAgICAgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICpwYXJ0OworICAgICAgU3BsaXRNdXhTcmNQYWQgKmFueXBhZDsKKworICAgICAgU1BMSVRNVVhfU1JDX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIFNQTElUTVVYX1NSQ19QQURTX0xPQ0sgKHNwbGl0bXV4KTsKKyAgICAgIGFueXBhZCA9IChTcGxpdE11eFNyY1BhZCAqKSAoc3BsaXRtdXgtPnBhZHMtPmRhdGEpOworICAgICAgcGFydCA9IHNwbGl0bXV4LT5wYXJ0c1thbnlwYWQtPmN1cl9wYXJ0XTsKKyAgICAgIHJldCA9IGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl9zcmNfcXVlcnkgKHBhcnQsIHBhZCwgcXVlcnkpOworICAgICAgU1BMSVRNVVhfU1JDX1BBRFNfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBTUExJVE1VWF9TUkNfVU5MT0NLIChzcGxpdG11eCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfRFVSQVRJT046eworICAgICAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uOworICAgICAgR3N0Rm9ybWF0IGZtdDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2R1cmF0aW9uIChxdWVyeSwgJmZtdCwgTlVMTCk7CisgICAgICBpZiAoZm10ICE9IEdTVF9GT1JNQVRfVElNRSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3BsaXRtdXgpOworICAgICAgZHVyYXRpb24gPSBzcGxpdG11eC0+dG90YWxfZHVyYXRpb247CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc3BsaXRtdXgpOworCisgICAgICBpZiAoZHVyYXRpb24gPiAwICYmIGR1cmF0aW9uICE9IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICAgICAgZ3N0X3F1ZXJ5X3NldF9kdXJhdGlvbiAocXVlcnksIEdTVF9GT1JNQVRfVElNRSwgZHVyYXRpb24pOworICAgICAgICByZXQgPSBUUlVFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX1NFRUtJTkc6eworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX3NlZWtpbmcgKHF1ZXJ5LCAmZm9ybWF0LCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgIGlmIChmb3JtYXQgIT0gR1NUX0ZPUk1BVF9USU1FKQorICAgICAgICBicmVhazsKKworICAgICAgR1NUX09CSkVDVF9MT0NLIChzcGxpdG11eCk7CisgICAgICBnc3RfcXVlcnlfc2V0X3NlZWtpbmcgKHF1ZXJ5LCBHU1RfRk9STUFUX1RJTUUsIFRSVUUsIDAsCisgICAgICAgICAgc3BsaXRtdXgtPnRvdGFsX2R1cmF0aW9uKTsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc3BsaXRtdXgpOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKKworZ2Jvb2xlYW4KK3JlZ2lzdGVyX3NwbGl0bXV4c3JjIChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChzcGxpdG11eF9kZWJ1ZywgInNwbGl0bXV4c3JjIiwgMCwKKyAgICAgICJTcGxpdCBGaWxlIERlbXV4aW5nIFNvdXJjZSIpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAic3BsaXRtdXhzcmMiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfU1BMSVRNVVhfU1JDKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuaCBiL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjM0YzkwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpZmlsZS9nc3RzcGxpdG11eHNyYy5oCkBAIC0wLDAgKzEsMTA5IEBACisvKiBHU3RyZWFtZXIgU3BsaXQgTXV4ZWQgRmlsZSBTb3VyY2UKKyAqIENvcHlyaWdodCAoQykgMjAxNCBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBfX0dTVF9TUExJVE1VWF9TUkNfSF9fCisjZGVmaW5lIF9fR1NUX1NQTElUTVVYX1NSQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImdzdHNwbGl0bXV4cGFydHJlYWRlci5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfU1BMSVRNVVhfU1JDIFwKKyAgKGdzdF9zcGxpdG11eF9zcmNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1NQTElUTVVYX1NSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1NQTElUTVVYX1NSQyxHc3RTcGxpdE11eFNyYykpCisjZGVmaW5lIEdTVF9TUExJVE1VWF9TUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfU1BMSVRNVVhfU1JDLEdzdFNwbGl0TXV4U3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfU1BMSVRNVVhfU1JDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfU1BMSVRNVVhfU1JDKSkKKyNkZWZpbmUgR1NUX0lTX1NQTElUTVVYX1NSQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9TUExJVE1VWF9TUkMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0U3BsaXRNdXhTcmMgR3N0U3BsaXRNdXhTcmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0U3BsaXRNdXhTcmNDbGFzcyBHc3RTcGxpdE11eFNyY0NsYXNzOworCitzdHJ1Y3QgX0dzdFNwbGl0TXV4U3JjCit7CisgIEdzdEJpbiBwYXJlbnQ7CisKKyAgR011dGV4IGxvY2s7CisgIGdib29sZWFuICAgICBydW5uaW5nOworCisgIGdjaGFyICAgICAgICpsb2NhdGlvbjsgIC8qIE9CSkVDVF9MT0NLICovCisKKyAgR3N0U3BsaXRNdXhQYXJ0UmVhZGVyICoqcGFydHM7CisgIGd1aW50ICAgICAgICBudW1fcGFydHM7CisgIGd1aW50ICAgICAgICBjdXJfcGFydDsKKworICBnYm9vbGVhbiBwYWRzX2NvbXBsZXRlOworICBHTXV0ZXggcGFkc19sb2NrOworICBHTGlzdCAgKnBhZHM7IC8qIHBhZHNfbG9jayAqLworCisgIEdzdENsb2NrVGltZSB0b3RhbF9kdXJhdGlvbjsKKyAgR3N0U2VnbWVudCBwbGF5X3NlZ21lbnQ7CisgIGd1aW50MzIgc2VnbWVudF9zZXFudW07Cit9OworCitzdHJ1Y3QgX0dzdFNwbGl0TXV4U3JjQ2xhc3MKK3sKKyAgR3N0QmluQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgc3BsaXRtdXhfc3JjX3BhZF9nZXRfdHlwZSAodm9pZCk7CisjZGVmaW5lIFNQTElUTVVYX1RZUEVfU1JDX1BBRCBzcGxpdG11eF9zcmNfcGFkX2dldF90eXBlKCkKKyNkZWZpbmUgU1BMSVRNVVhfU1JDX1BBRF9DQVNUKHApICgoU3BsaXRNdXhTcmNQYWQgKikocCkpCisjZGVmaW5lIFNQTElUTVVYX1NSQ19QQUQob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxTUExJVE1VWF9UWVBFX1NSQ19QQUQsU3BsaXRNdXhTcmNQYWQpKQorCitzdHJ1Y3QgX1NwbGl0TXV4U3JjUGFkCit7CisgIEdzdFBhZCBwYXJlbnQ7CisKKyAgZ3VpbnQgY3VyX3BhcnQ7CisgIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqcmVhZGVyOworICBHc3RQYWQgKnBhcnRfcGFkOworCisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBnYm9vbGVhbiBzZXRfbmV4dF9kaXNjb250OworICBnYm9vbGVhbiBjbGVhcl9uZXh0X2Rpc2NvbnQ7CisKKyAgZ2Jvb2xlYW4gc2VudF9zdHJlYW1fc3RhcnQ7CisgIGdib29sZWFuIHNlbnRfY2FwczsKKyAgZ2Jvb2xlYW4gc2VudF9zZWdtZW50OworfTsKKworc3RydWN0IF9TcGxpdE11eFNyY1BhZENsYXNzCit7CisgIEdzdFBhZENsYXNzIHBhcmVudDsKK307CisKK0dUeXBlIGdzdF9zcGxpdG11eF9zcmNfZ2V0X3R5cGUgKHZvaWQpOworZ2Jvb2xlYW4gcmVnaXN0ZXJfc3BsaXRtdXhzcmMgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKKyNkZWZpbmUgU1BMSVRNVVhfU1JDX0xPQ0socykgZ19tdXRleF9sb2NrKCYocyktPmxvY2spCisjZGVmaW5lIFNQTElUTVVYX1NSQ19VTkxPQ0socykgZ19tdXRleF91bmxvY2soJihzKS0+bG9jaykKKworI2RlZmluZSBTUExJVE1VWF9TUkNfUEFEU19MT0NLKHMpIGdfbXV0ZXhfbG9jaygmKHMpLT5wYWRzX2xvY2spCisjZGVmaW5lIFNQTElUTVVYX1NSQ19QQURTX1VOTE9DSyhzKSBnX211dGV4X3VubG9jaygmKHMpLT5wYWRzX2xvY2spCisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9TUExJVE1VWF9TUkNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0dXRpbHMuYyBiL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXR1dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMDg4YTUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbXVsdGlmaWxlL2dzdHNwbGl0dXRpbHMuYwpAQCAtMCwwICsxLDEwNSBAQAorLyogR1N0cmVhbWVyIFNwbGl0IFNvdXJjZSBVdGlsaXR5IEZ1bmN0aW9ucworICogQ29weXJpZ2h0IChDKSAyMDExIENvbGxhYm9yYSBMdGQuIDx0aW0ubXVsbGVyQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCAoQykgMjAxNCBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0c3BsaXR1dGlscy5oIgorI2luY2x1ZGUgInBhdHRlcm5zcGVjLmgiCisKK3N0YXRpYyBpbnQKK2dzdF9zcGxpdF91dGlsX2FycmF5X3NvcnRmdW5jIChnY2hhciAqKiBhLCBnY2hhciAqKiBiKQoreworICByZXR1cm4gc3RyY21wICgqYSwgKmIpOworfQorCitnY2hhciAqKgorZ3N0X3NwbGl0X3V0aWxfZmluZF9maWxlcyAoY29uc3QgZ2NoYXIgKiBkaXJuYW1lLAorICAgIGNvbnN0IGdjaGFyICogYmFzZW5hbWUsIEdFcnJvciAqKiBlcnIpCit7CisgIFBhdHRlcm5TcGVjICpwc3BlYzsKKyAgR1B0ckFycmF5ICpmaWxlczsKKyAgY29uc3QgZ2NoYXIgKm5hbWU7CisgIEdEaXIgKmRpcjsKKworICBpZiAoZGlybmFtZSA9PSBOVUxMIHx8IGJhc2VuYW1lID09IE5VTEwpCisgICAgZ290byBpbnZhbGlkX2xvY2F0aW9uOworCisgIEdTVF9JTkZPICgiY2hlY2tpbmcgaW4gZGlyZWN0b3J5ICclcycgZm9yIHBhdHRlcm4gJyVzJyIsIGRpcm5hbWUsIGJhc2VuYW1lKTsKKworICBkaXIgPSBnX2Rpcl9vcGVuIChkaXJuYW1lLCAwLCBlcnIpOworICBpZiAoZGlyID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKERFRkFVTFRfUEFUVEVSTl9NQVRDSF9NT0RFID09IE1BVENIX01PREVfVVRGOCAmJgorICAgICAgIWdfdXRmOF92YWxpZGF0ZSAoYmFzZW5hbWUsIC0xLCBOVUxMKSkgeworICAgIGdvdG8gbm90X3V0Zjg7CisgIH0KKworICAvKiBtb2RlIHdpbGwgYmUgQVVUTyBvbiBsaW51eC91bml4IGFuZCBVVEY4IG9uIHdpbjMyICovCisgIHBzcGVjID0gcGF0dGVybl9zcGVjX25ldyAoYmFzZW5hbWUsIERFRkFVTFRfUEFUVEVSTl9NQVRDSF9NT0RFKTsKKworICBmaWxlcyA9IGdfcHRyX2FycmF5X25ldyAoKTsKKworICB3aGlsZSAoKG5hbWUgPSBnX2Rpcl9yZWFkX25hbWUgKGRpcikpKSB7CisgICAgR1NUX1RSQUNFICgiY2hlY2s6ICVzIiwgbmFtZSk7CisgICAgaWYgKHBhdHRlcm5fbWF0Y2hfc3RyaW5nIChwc3BlYywgbmFtZSkpIHsKKyAgICAgIEdTVF9ERUJVRyAoIm1hdGNoOiAlcyIsIG5hbWUpOworICAgICAgZ19wdHJfYXJyYXlfYWRkIChmaWxlcywgZ19idWlsZF9maWxlbmFtZSAoZGlybmFtZSwgbmFtZSwgTlVMTCkpOworICAgIH0KKyAgfQorCisgIGlmIChmaWxlcy0+bGVuID09IDApCisgICAgZ290byBub19tYXRjaGVzOworCisgIGdfcHRyX2FycmF5X3NvcnQgKGZpbGVzLCAoR0NvbXBhcmVGdW5jKSBnc3Rfc3BsaXRfdXRpbF9hcnJheV9zb3J0ZnVuYyk7CisgIGdfcHRyX2FycmF5X2FkZCAoZmlsZXMsIE5VTEwpOworCisgIHBhdHRlcm5fc3BlY19mcmVlIChwc3BlYyk7CisgIGdfZGlyX2Nsb3NlIChkaXIpOworCisgIHJldHVybiAoZ2NoYXIgKiopIGdfcHRyX2FycmF5X2ZyZWUgKGZpbGVzLCBGQUxTRSk7CisKKy8qIEVSUk9SUyAqLworaW52YWxpZF9sb2NhdGlvbjoKKyAgeworICAgIGdfc2V0X2Vycm9yX2xpdGVyYWwgKGVyciwgR19GSUxFX0VSUk9SLCBHX0ZJTEVfRVJST1JfSU5WQUwsCisgICAgICAgICJObyBmaWxlbmFtZSBzcGVjaWZpZWQuIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK25vdF91dGY4OgorICB7CisgICAgZ19kaXJfY2xvc2UgKGRpcik7CisgICAgZ19zZXRfZXJyb3JfbGl0ZXJhbCAoZXJyLCBHX0ZJTEVfRVJST1IsIEdfRklMRV9FUlJPUl9JTlZBTCwKKyAgICAgICAgIkZpbGVuYW1lIHBhdHRlcm4gbXVzdCBiZSBVVEYtOCBvbiBXaW5kb3dzLiIpOworICAgIHJldHVybiBOVUxMOworICB9Citub19tYXRjaGVzOgorICB7CisgICAgcGF0dGVybl9zcGVjX2ZyZWUgKHBzcGVjKTsKKyAgICBnX2Rpcl9jbG9zZSAoZGlyKTsKKyAgICBnX3NldF9lcnJvcl9saXRlcmFsIChlcnIsIEdfRklMRV9FUlJPUiwgR19GSUxFX0VSUk9SX05PRU5ULAorICAgICAgICAiRm91bmQgbm8gZmlsZXMgbWF0Y2hpbmcgdGhlIHBhdHRlcm4uIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXR1dGlscy5oIGIvZ3N0L211bHRpZmlsZS9nc3RzcGxpdHV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM3OGIyMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXR1dGlscy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qIEdTdHJlYW1lciBTcGxpdCBTb3VyY2UgVXRpbGl0eSBGdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMjAxMSBDb2xsYWJvcmEgTHRkLiA8dGltLm11bGxlckBjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSmFuIFNjaG1pZHQgPGphbkBjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9TUExJVFVUSUxTX0hfXworI2RlZmluZSBfX0dTVF9TUExJVFVUSUxTX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNpZmRlZiBHX09TX1dJTjMyCisjZGVmaW5lIERFRkFVTFRfUEFUVEVSTl9NQVRDSF9NT0RFIE1BVENIX01PREVfVVRGOAorI2Vsc2UKKyNkZWZpbmUgREVGQVVMVF9QQVRURVJOX01BVENIX01PREUgTUFUQ0hfTU9ERV9BVVRPCisjZW5kaWYKKworZ2NoYXIgKioKK2dzdF9zcGxpdF91dGlsX2ZpbmRfZmlsZXMgKGNvbnN0IGdjaGFyICogZGlybmFtZSwKKyAgICBjb25zdCBnY2hhciAqIGJhc2VuYW1lLCBHRXJyb3IgKiogZXJyKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nc3QvbXVsdGlmaWxlL21lc29uLmJ1aWxkIGIvZ3N0L211bHRpZmlsZS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWU0NzM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpZmlsZS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDM3IEBACittdWx0aWZpbGVfc291cmNlcyA9IFsKKyAgJ2dzdG11bHRpZmlsZXNpbmsuYycsCisgICdnc3RtdWx0aWZpbGVzcmMuYycsCisgICdnc3RtdWx0aWZpbGUuYycsCisgICdnc3RzcGxpdGZpbGVzcmMuYycsCisgICdnc3RzcGxpdG11eHBhcnRyZWFkZXIuYycsCisgICdnc3RzcGxpdG11eHNpbmsuYycsCisgICdnc3RzcGxpdG11eHNyYy5jJywKKyAgJ2dzdHNwbGl0dXRpbHMuYycsCisgICdwYXR0ZXJuc3BlYy5jJywKK10KKworZ3N0bXVsdGlmaWxlID0gbGlicmFyeSgnZ3N0bXVsdGlmaWxlJywKKyAgbXVsdGlmaWxlX3NvdXJjZXMsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0dmlkZW9fZGVwLCBnc3RiYXNlX2RlcCwKKyAgICAgICAgICAgICAgICAgIGdzdHBidXRpbHNfZGVwLCBnaW9fZGVwXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKKwordGVzdF9zcGxpdG11eHBhcnRyZWFkZXJfc291cmNlcyA9IFsKKyAgJ3Rlc3Qtc3BsaXRtdXhwYXJ0cmVhZGVyLmMnLAorICAnZ3N0c3BsaXRtdXhwYXJ0cmVhZGVyLmMnLAorICAnZ3N0c3BsaXRtdXhzcmMuYycsCisgICdnc3RzcGxpdHV0aWxzLmMnLAorICAncGF0dGVybnNwZWMuYycsCitdCisKK2V4ZWN1dGFibGUoJ3Rlc3Qtc3BsaXRtdXhwYXJ0cmVhZGVyJywKKyAgdGVzdF9zcGxpdG11eHBhcnRyZWFkZXJfc291cmNlcywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3R0YWdfZGVwLCBnc3RiYXNlX2RlcF0sCisgIGluc3RhbGwgOiBmYWxzZSwKKykKZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvcGF0dGVybnNwZWMuYyBiL2dzdC9tdWx0aWZpbGUvcGF0dGVybnNwZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDhhYWJhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpZmlsZS9wYXR0ZXJuc3BlYy5jCkBAIC0wLDAgKzEsMzM0IEBACisvKiBHUGF0dGVybiBjb3B5IHRoYXQgc3VwcG9ydHMgcmF3IChub24tdXRmOCkgbWF0Y2hpbmcKKyAqIGJhc2VkIG9uOiBHTElCIC0gTGlicmFyeSBvZiB1c2VmdWwgcm91dGluZXMgZm9yIEMgcHJvZ3JhbW1pbmcKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCAxOTk5ICBQZXRlciBNYXR0aXMsIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAicGF0dGVybnNwZWMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordHlwZWRlZiBlbnVtCit7CisgIE1BVENIX0FMTCwgICAgICAgICAgICAgICAgICAgIC8qICIqQT9BKiIgKi8KKyAgTUFUQ0hfQUxMX1RBSUwsICAgICAgICAgICAgICAgLyogIipBP0FBIiAqLworICBNQVRDSF9IRUFELCAgICAgICAgICAgICAgICAgICAvKiAiQUFBQSoiICovCisgIE1BVENIX1RBSUwsICAgICAgICAgICAgICAgICAgIC8qICIqQUFBQSIgKi8KKyAgTUFUQ0hfRVhBQ1QsICAgICAgICAgICAgICAgICAgLyogIkFBQUFBIiAqLworICBNQVRDSF9MQVNUCit9IE1hdGNoVHlwZTsKKworc3RydWN0IF9QYXR0ZXJuU3BlYworeworICBNYXRjaE1vZGUgbWF0Y2hfbW9kZTsKKyAgTWF0Y2hUeXBlIG1hdGNoX3R5cGU7CisgIGd1aW50IHBhdHRlcm5fbGVuZ3RoOworICBndWludCBtaW5fbGVuZ3RoOworICBndWludCBtYXhfbGVuZ3RoOworICBnY2hhciAqcGF0dGVybjsKK307CisKK3N0YXRpYyBpbmxpbmUgZ2NoYXIgKgorcmF3X3N0cnJldmVyc2UgKGNvbnN0IGdjaGFyICogc3RyLCBnc3NpemUgc2l6ZSkKK3sKKyAgZ19hc3NlcnQgKHNpemUgPiAwKTsKKyAgcmV0dXJuIGdfc3RycmV2ZXJzZSAoZ19zdHJuZHVwIChzdHIsIHNpemUpKTsKK30KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorcGF0dGVybl9waF9tYXRjaCAoY29uc3QgZ2NoYXIgKiBtYXRjaF9wYXR0ZXJuLCBNYXRjaE1vZGUgbWF0Y2hfbW9kZSwKKyAgICBjb25zdCBnY2hhciAqIG1hdGNoX3N0cmluZywgZ2Jvb2xlYW4gKiB3aWxkY2FyZF9yZWFjaGVkX3ApCit7CisgIHJlZ2lzdGVyIGNvbnN0IGdjaGFyICpwYXR0ZXJuLCAqc3RyaW5nOworICByZWdpc3RlciBnY2hhciBjaDsKKworICBwYXR0ZXJuID0gbWF0Y2hfcGF0dGVybjsKKyAgc3RyaW5nID0gbWF0Y2hfc3RyaW5nOworCisgIGNoID0gKnBhdHRlcm47CisgIHBhdHRlcm4rKzsKKyAgd2hpbGUgKGNoKSB7CisgICAgc3dpdGNoIChjaCkgeworICAgICAgY2FzZSAnPyc6CisgICAgICAgIGlmICghKnN0cmluZykKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChtYXRjaF9tb2RlID09IE1BVENIX01PREVfVVRGOCkKKyAgICAgICAgICBzdHJpbmcgPSBnX3V0ZjhfbmV4dF9jaGFyIChzdHJpbmcpOworICAgICAgICBlbHNlCisgICAgICAgICAgKytzdHJpbmc7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICcqJzoKKyAgICAgICAgKndpbGRjYXJkX3JlYWNoZWRfcCA9IFRSVUU7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBjaCA9ICpwYXR0ZXJuOworICAgICAgICAgIHBhdHRlcm4rKzsKKyAgICAgICAgICBpZiAoY2ggPT0gJz8nKSB7CisgICAgICAgICAgICBpZiAoISpzdHJpbmcpCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIGlmIChtYXRjaF9tb2RlID09IE1BVENIX01PREVfVVRGOCkKKyAgICAgICAgICAgICAgc3RyaW5nID0gZ191dGY4X25leHRfY2hhciAoc3RyaW5nKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgKytzdHJpbmc7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlIChjaCA9PSAnKicgfHwgY2ggPT0gJz8nKTsKKyAgICAgICAgaWYgKCFjaCkKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgZG8geworICAgICAgICAgIGdib29sZWFuIG5leHRfd2lsZGNhcmRfcmVhY2hlZCA9IEZBTFNFOworICAgICAgICAgIHdoaWxlIChjaCAhPSAqc3RyaW5nKSB7CisgICAgICAgICAgICBpZiAoISpzdHJpbmcpCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIGlmIChtYXRjaF9tb2RlID09IE1BVENIX01PREVfVVRGOCkKKyAgICAgICAgICAgICAgc3RyaW5nID0gZ191dGY4X25leHRfY2hhciAoc3RyaW5nKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgKytzdHJpbmc7CisgICAgICAgICAgfQorICAgICAgICAgIHN0cmluZysrOworICAgICAgICAgIGlmIChwYXR0ZXJuX3BoX21hdGNoIChwYXR0ZXJuLCBtYXRjaF9tb2RlLCBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAmbmV4dF93aWxkY2FyZF9yZWFjaGVkKSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgIGlmIChuZXh0X3dpbGRjYXJkX3JlYWNoZWQpCisgICAgICAgICAgICAvKiB0aGUgZm9ydGhjb21pbmcgcGF0dGVybiBzdWJzdHJpbmcgdXAgdG8gdGhlIG5leHQgd2lsZGNhcmQgaGFzCisgICAgICAgICAgICAgKiBiZWVuIG1hdGNoZWQsIGJ1dCBhIG1pc21hdGNoIG9jY291cmVkIGZvciB0aGUgcmVzdCBvZiB0aGUKKyAgICAgICAgICAgICAqIHBhdHRlcm4sIGZvbGxvd2luZyB0aGUgbmV4dCB3aWxkY2FyZC4KKyAgICAgICAgICAgICAqIHRoZXJlJ3Mgbm8gbmVlZCB0byBhZHZhbmNlIHRoZSBjdXJyZW50IG1hdGNoIHBvc2l0aW9uIGFueQorICAgICAgICAgICAgICogZnVydGhlciBpZiB0aGUgcmVzdCBwYXR0ZXJuIHdpbGwgbm90IG1hdGNoLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKCpzdHJpbmcpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGNoID09ICpzdHJpbmcpCisgICAgICAgICAgc3RyaW5nKys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNoID0gKnBhdHRlcm47CisgICAgcGF0dGVybisrOworICB9CisKKyAgcmV0dXJuICpzdHJpbmcgPT0gMDsKK30KKworc3RhdGljIGdib29sZWFuCitwYXR0ZXJuX21hdGNoIChQYXR0ZXJuU3BlYyAqIHBzcGVjLCBndWludCBzdHJpbmdfbGVuZ3RoLAorICAgIGNvbnN0IGdjaGFyICogc3RyaW5nLCBjb25zdCBnY2hhciAqIHN0cmluZ19yZXZlcnNlZCkKK3sKKyAgTWF0Y2hNb2RlIG1hdGNoX21vZGU7CisKKyAgZ19hc3NlcnQgKHBzcGVjICE9IE5VTEwpOworICBnX2Fzc2VydCAoc3RyaW5nICE9IE5VTEwpOworCisgIGlmIChzdHJpbmdfbGVuZ3RoIDwgcHNwZWMtPm1pbl9sZW5ndGggfHwgc3RyaW5nX2xlbmd0aCA+IHBzcGVjLT5tYXhfbGVuZ3RoKQorICAgIHJldHVybiBGQUxTRTsKKworICBtYXRjaF9tb2RlID0gcHNwZWMtPm1hdGNoX21vZGU7CisgIGlmIChtYXRjaF9tb2RlID09IE1BVENIX01PREVfQVVUTykgeworICAgIGlmICghZ191dGY4X3ZhbGlkYXRlIChzdHJpbmcsIHN0cmluZ19sZW5ndGgsIE5VTEwpKQorICAgICAgbWF0Y2hfbW9kZSA9IE1BVENIX01PREVfUkFXOworICAgIGVsc2UKKyAgICAgIG1hdGNoX21vZGUgPSBNQVRDSF9NT0RFX1VURjg7CisgIH0KKworICBzd2l0Y2ggKHBzcGVjLT5tYXRjaF90eXBlKSB7CisgICAgICBnYm9vbGVhbiBkdW1teTsKKyAgICBjYXNlIE1BVENIX0FMTDoKKyAgICAgIHJldHVybiBwYXR0ZXJuX3BoX21hdGNoIChwc3BlYy0+cGF0dGVybiwgbWF0Y2hfbW9kZSwgc3RyaW5nLCAmZHVtbXkpOworICAgIGNhc2UgTUFUQ0hfQUxMX1RBSUw6CisgICAgICBpZiAoc3RyaW5nX3JldmVyc2VkKQorICAgICAgICByZXR1cm4gcGF0dGVybl9waF9tYXRjaCAocHNwZWMtPnBhdHRlcm4sIG1hdGNoX21vZGUsIHN0cmluZ19yZXZlcnNlZCwKKyAgICAgICAgICAgICZkdW1teSk7CisgICAgICBlbHNlIHsKKyAgICAgICAgZ2Jvb2xlYW4gcmVzdWx0OworICAgICAgICBnY2hhciAqdG1wOworICAgICAgICBpZiAobWF0Y2hfbW9kZSA9PSBNQVRDSF9NT0RFX1VURjgpIHsKKyAgICAgICAgICB0bXAgPSBnX3V0Zjhfc3RycmV2ZXJzZSAoc3RyaW5nLCBzdHJpbmdfbGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0bXAgPSByYXdfc3RycmV2ZXJzZSAoc3RyaW5nLCBzdHJpbmdfbGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBwYXR0ZXJuX3BoX21hdGNoIChwc3BlYy0+cGF0dGVybiwgbWF0Y2hfbW9kZSwgdG1wLCAmZHVtbXkpOworICAgICAgICBnX2ZyZWUgKHRtcCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgY2FzZSBNQVRDSF9IRUFEOgorICAgICAgaWYgKHBzcGVjLT5wYXR0ZXJuX2xlbmd0aCA9PSBzdHJpbmdfbGVuZ3RoKQorICAgICAgICByZXR1cm4gbWVtY21wIChwc3BlYy0+cGF0dGVybiwgc3RyaW5nLCBzdHJpbmdfbGVuZ3RoKSA9PSAwOworICAgICAgZWxzZSBpZiAocHNwZWMtPnBhdHRlcm5fbGVuZ3RoKQorICAgICAgICByZXR1cm4gbWVtY21wIChwc3BlYy0+cGF0dGVybiwgc3RyaW5nLCBwc3BlYy0+cGF0dGVybl9sZW5ndGgpID09IDA7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgTUFUQ0hfVEFJTDoKKyAgICAgIGlmIChwc3BlYy0+cGF0dGVybl9sZW5ndGgpCisgICAgICAgIC8qIGNvbXBhcmUgaW5jbC4gTlVMIHRlcm1pbmF0b3IgKi8KKyAgICAgICAgcmV0dXJuIG1lbWNtcCAocHNwZWMtPnBhdHRlcm4sCisgICAgICAgICAgICBzdHJpbmcgKyAoc3RyaW5nX2xlbmd0aCAtIHBzcGVjLT5wYXR0ZXJuX2xlbmd0aCksCisgICAgICAgICAgICBwc3BlYy0+cGF0dGVybl9sZW5ndGggKyAxKSA9PSAwOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICBjYXNlIE1BVENIX0VYQUNUOgorICAgICAgaWYgKHBzcGVjLT5wYXR0ZXJuX2xlbmd0aCAhPSBzdHJpbmdfbGVuZ3RoKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBtZW1jbXAgKHBzcGVjLT5wYXR0ZXJuLCBzdHJpbmcsIHN0cmluZ19sZW5ndGgpID09IDA7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChwc3BlYy0+bWF0Y2hfdHlwZSA8IE1BVENIX0xBU1QsIEZBTFNFKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitQYXR0ZXJuU3BlYyAqCitwYXR0ZXJuX3NwZWNfbmV3IChjb25zdCBnY2hhciAqIHBhdHRlcm4sIE1hdGNoTW9kZSBtYXRjaF9tb2RlKQoreworICBQYXR0ZXJuU3BlYyAqcHNwZWM7CisgIGdib29sZWFuIHNlZW5fam9rZXIgPSBGQUxTRSwgc2Vlbl93aWxkY2FyZCA9IEZBTFNFLCBtb3JlX3dpbGRjYXJkcyA9IEZBTFNFOworICBnaW50IGh3X3BvcyA9IC0xLCB0d19wb3MgPSAtMSwgaGpfcG9zID0gLTEsIHRqX3BvcyA9IC0xOworICBnYm9vbGVhbiBmb2xsb3dzX3dpbGRjYXJkID0gRkFMU0U7CisgIGd1aW50IHBlbmRpbmdfam9rZXJzID0gMDsKKyAgY29uc3QgZ2NoYXIgKnM7CisgIGdjaGFyICpkOworICBndWludCBpOworCisgIGdfYXNzZXJ0IChwYXR0ZXJuICE9IE5VTEwpOworICBnX2Fzc2VydCAobWF0Y2hfbW9kZSAhPSBNQVRDSF9NT0RFX1VURjgKKyAgICAgIHx8IGdfdXRmOF92YWxpZGF0ZSAocGF0dGVybiwgLTEsIE5VTEwpKTsKKworICAvKiBjYW5vbmljYWxpemUgcGF0dGVybiBhbmQgY29sbGVjdCBuZWNlc3Nhcnkgc3RhdHMgKi8KKyAgcHNwZWMgPSBnX25ldyAoUGF0dGVyblNwZWMsIDEpOworICBwc3BlYy0+bWF0Y2hfbW9kZSA9IG1hdGNoX21vZGU7CisgIHBzcGVjLT5wYXR0ZXJuX2xlbmd0aCA9IHN0cmxlbiAocGF0dGVybik7CisgIHBzcGVjLT5taW5fbGVuZ3RoID0gMDsKKyAgcHNwZWMtPm1heF9sZW5ndGggPSAwOworICBwc3BlYy0+cGF0dGVybiA9IGdfbmV3IChnY2hhciwgcHNwZWMtPnBhdHRlcm5fbGVuZ3RoICsgMSk7CisKKyAgaWYgKHBzcGVjLT5tYXRjaF9tb2RlID09IE1BVENIX01PREVfQVVUTykgeworICAgIGlmICghZ191dGY4X3ZhbGlkYXRlIChwYXR0ZXJuLCAtMSwgTlVMTCkpCisgICAgICBwc3BlYy0+bWF0Y2hfbW9kZSA9IE1BVENIX01PREVfUkFXOworICB9CisKKyAgZCA9IHBzcGVjLT5wYXR0ZXJuOworICBmb3IgKGkgPSAwLCBzID0gcGF0dGVybjsgKnMgIT0gMDsgcysrKSB7CisgICAgc3dpdGNoICgqcykgeworICAgICAgY2FzZSAnKic6CisgICAgICAgIGlmIChmb2xsb3dzX3dpbGRjYXJkKSB7IC8qIGNvbXByZXNzIG11bHRpcGxlIHdpbGRjYXJkcyAqLworICAgICAgICAgIHBzcGVjLT5wYXR0ZXJuX2xlbmd0aC0tOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvbGxvd3Nfd2lsZGNhcmQgPSBUUlVFOworICAgICAgICBpZiAoaHdfcG9zIDwgMCkKKyAgICAgICAgICBod19wb3MgPSBpOworICAgICAgICB0d19wb3MgPSBpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJz8nOgorICAgICAgICBwZW5kaW5nX2pva2VycysrOworICAgICAgICBwc3BlYy0+bWluX2xlbmd0aCsrOworICAgICAgICBpZiAocHNwZWMtPm1hdGNoX21vZGUgPT0gTUFUQ0hfTU9ERV9SQVcpIHsKKyAgICAgICAgICBwc3BlYy0+bWF4X2xlbmd0aCArPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBzcGVjLT5tYXhfbGVuZ3RoICs9IDQ7ICAgICAgIC8qIG1heGltdW0gVVRGLTggY2hhcmFjdGVyIGxlbmd0aCAqLworICAgICAgICB9CisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZm9yICg7IHBlbmRpbmdfam9rZXJzOyBwZW5kaW5nX2pva2Vycy0tLCBpKyspIHsKKyAgICAgICAgICAqZCsrID0gJz8nOworICAgICAgICAgIGlmIChoal9wb3MgPCAwKQorICAgICAgICAgICAgaGpfcG9zID0gaTsKKyAgICAgICAgICB0al9wb3MgPSBpOworICAgICAgICB9CisgICAgICAgIGZvbGxvd3Nfd2lsZGNhcmQgPSBGQUxTRTsKKyAgICAgICAgcHNwZWMtPm1pbl9sZW5ndGgrKzsKKyAgICAgICAgcHNwZWMtPm1heF9sZW5ndGgrKzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICpkKysgPSAqczsKKyAgICBpKys7CisgIH0KKyAgZm9yICg7IHBlbmRpbmdfam9rZXJzOyBwZW5kaW5nX2pva2Vycy0tKSB7CisgICAgKmQrKyA9ICc/JzsKKyAgICBpZiAoaGpfcG9zIDwgMCkKKyAgICAgIGhqX3BvcyA9IGk7CisgICAgdGpfcG9zID0gaTsKKyAgfQorICAqZCsrID0gMDsKKyAgc2Vlbl9qb2tlciA9IGhqX3BvcyA+PSAwOworICBzZWVuX3dpbGRjYXJkID0gaHdfcG9zID49IDA7CisgIG1vcmVfd2lsZGNhcmRzID0gc2Vlbl93aWxkY2FyZCAmJiBod19wb3MgIT0gdHdfcG9zOworICBpZiAoc2Vlbl93aWxkY2FyZCkKKyAgICBwc3BlYy0+bWF4X2xlbmd0aCA9IEdfTUFYVUlOVDsKKworICAvKiBzcGVjaWFsIGNhc2Ugc29sZSBoZWFkL3RhaWwgd2lsZGNhcmQgb3IgZXhhY3QgbWF0Y2hlcyAqLworICBpZiAoIXNlZW5fam9rZXIgJiYgIW1vcmVfd2lsZGNhcmRzKSB7CisgICAgaWYgKHBzcGVjLT5wYXR0ZXJuWzBdID09ICcqJykgeworICAgICAgcHNwZWMtPm1hdGNoX3R5cGUgPSBNQVRDSF9UQUlMOworICAgICAgbWVtbW92ZSAocHNwZWMtPnBhdHRlcm4sIHBzcGVjLT5wYXR0ZXJuICsgMSwgLS1wc3BlYy0+cGF0dGVybl9sZW5ndGgpOworICAgICAgcHNwZWMtPnBhdHRlcm5bcHNwZWMtPnBhdHRlcm5fbGVuZ3RoXSA9IDA7CisgICAgICByZXR1cm4gcHNwZWM7CisgICAgfQorICAgIGlmIChwc3BlYy0+cGF0dGVybl9sZW5ndGggPiAwICYmCisgICAgICAgIHBzcGVjLT5wYXR0ZXJuW3BzcGVjLT5wYXR0ZXJuX2xlbmd0aCAtIDFdID09ICcqJykgeworICAgICAgcHNwZWMtPm1hdGNoX3R5cGUgPSBNQVRDSF9IRUFEOworICAgICAgcHNwZWMtPnBhdHRlcm5bLS1wc3BlYy0+cGF0dGVybl9sZW5ndGhdID0gMDsKKyAgICAgIHJldHVybiBwc3BlYzsKKyAgICB9CisgICAgaWYgKCFzZWVuX3dpbGRjYXJkKSB7CisgICAgICBwc3BlYy0+bWF0Y2hfdHlwZSA9IE1BVENIX0VYQUNUOworICAgICAgcmV0dXJuIHBzcGVjOworICAgIH0KKyAgfQorCisgIC8qIG5vdyBqdXN0IG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBoZWFkIG9yIHRhaWwgbWF0Y2ggc3RhcnQgKi8KKyAgdHdfcG9zID0gcHNwZWMtPnBhdHRlcm5fbGVuZ3RoIC0gMSAtIHR3X3BvczsgIC8qIGxhc3QgcG9zIHRvIHRhaWwgZGlzdGFuY2UgKi8KKyAgdGpfcG9zID0gcHNwZWMtPnBhdHRlcm5fbGVuZ3RoIC0gMSAtIHRqX3BvczsgIC8qIGxhc3QgcG9zIHRvIHRhaWwgZGlzdGFuY2UgKi8KKyAgaWYgKHNlZW5fd2lsZGNhcmQpCisgICAgcHNwZWMtPm1hdGNoX3R5cGUgPSB0d19wb3MgPiBod19wb3MgPyBNQVRDSF9BTExfVEFJTCA6IE1BVENIX0FMTDsKKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2Vlbl9qb2tlciAqLworICAgIHBzcGVjLT5tYXRjaF90eXBlID0gdGpfcG9zID4gaGpfcG9zID8gTUFUQ0hfQUxMX1RBSUwgOiBNQVRDSF9BTEw7CisgIGlmIChwc3BlYy0+bWF0Y2hfdHlwZSA9PSBNQVRDSF9BTExfVEFJTCkgeworICAgIGdjaGFyICp0bXAgPSBwc3BlYy0+cGF0dGVybjsKKworICAgIGlmIChwc3BlYy0+bWF0Y2hfbW9kZSA9PSBNQVRDSF9NT0RFX1JBVykgeworICAgICAgcHNwZWMtPnBhdHRlcm4gPSByYXdfc3RycmV2ZXJzZSAocHNwZWMtPnBhdHRlcm4sIHBzcGVjLT5wYXR0ZXJuX2xlbmd0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBzcGVjLT5wYXR0ZXJuID0KKyAgICAgICAgICBnX3V0Zjhfc3RycmV2ZXJzZSAocHNwZWMtPnBhdHRlcm4sIHBzcGVjLT5wYXR0ZXJuX2xlbmd0aCk7CisgICAgfQorICAgIGdfZnJlZSAodG1wKTsKKyAgfQorICByZXR1cm4gcHNwZWM7Cit9CisKK3ZvaWQKK3BhdHRlcm5fc3BlY19mcmVlIChQYXR0ZXJuU3BlYyAqIHBzcGVjKQoreworICBnX2Fzc2VydCAocHNwZWMgIT0gTlVMTCk7CisKKyAgZ19mcmVlIChwc3BlYy0+cGF0dGVybik7CisgIGdfZnJlZSAocHNwZWMpOworfQorCitnYm9vbGVhbgorcGF0dGVybl9tYXRjaF9zdHJpbmcgKFBhdHRlcm5TcGVjICogcHNwZWMsIGNvbnN0IGdjaGFyICogc3RyaW5nKQoreworICByZXR1cm4gcGF0dGVybl9tYXRjaCAocHNwZWMsIHN0cmxlbiAoc3RyaW5nKSwgc3RyaW5nLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9tdWx0aWZpbGUvcGF0dGVybnNwZWMuaCBiL2dzdC9tdWx0aWZpbGUvcGF0dGVybnNwZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmI5YjQwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpZmlsZS9wYXR0ZXJuc3BlYy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qIEdQYXR0ZXJuIGNvcHkgdGhhdCBzdXBwb3J0cyByYXcgKG5vbi11dGY4KSBtYXRjaGluZworICogYmFzZWQgb246IEdMSUIgLSBMaWJyYXJ5IG9mIHVzZWZ1bCByb3V0aW5lcyBmb3IgQyBwcm9ncmFtbWluZworICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIDE5OTkgIFBldGVyIE1hdHRpcywgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19QQVRURVJOX1NQRUNfSF9fCisjZGVmaW5lIF9fUEFUVEVSTl9TUEVDX0hfXworCisjaW5jbHVkZSA8Z2xpYi5oPgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgZW51bQoreworICBNQVRDSF9NT0RFX0FVVE8gPSAwLAorICBNQVRDSF9NT0RFX1VURjgsCisgIE1BVENIX01PREVfUkFXCit9IE1hdGNoTW9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgX1BhdHRlcm5TcGVjIFBhdHRlcm5TcGVjOworCitQYXR0ZXJuU3BlYyAqIHBhdHRlcm5fc3BlY19uZXcgICAgICAgKGNvbnN0IGdjaGFyICAqIHBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGNoTW9kZSAgICAgIG1hdGNoX21vZGUpOworCit2b2lkICAgICAgICAgIHBhdHRlcm5fc3BlY19mcmVlICAgICAgKFBhdHRlcm5TcGVjICAqIHBzcGVjKTsKKworZ2Jvb2xlYW4gICAgICBwYXR0ZXJuX21hdGNoX3N0cmluZyAgIChQYXR0ZXJuU3BlYyAgKiBwc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICogc3RyaW5nKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fUEFUVEVSTl9TUEVDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L211bHRpZmlsZS90ZXN0LXNwbGl0bXV4cGFydHJlYWRlci5jIGIvZ3N0L211bHRpZmlsZS90ZXN0LXNwbGl0bXV4cGFydHJlYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NzU2YTYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbXVsdGlmaWxlL3Rlc3Qtc3BsaXRtdXhwYXJ0cmVhZGVyLmMKQEAgLTAsMCArMSwxMDQgQEAKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAiZ3N0c3BsaXRtdXhwYXJ0cmVhZGVyLmgiCisjaW5jbHVkZSAiZ3N0c3BsaXRtdXhzcmMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX0VYVEVSTiAoc3BsaXRtdXhfZGVidWcpOworCitzdGF0aWMgY29uc3QgZ2NoYXIgKmNvbnN0IHBhdGggPSAib3V0MDAxLm1wNCI7CisKK3R5cGVkZWYgc3RydWN0IF9DdXN0b21EYXRhCit7CisgIEdzdFNwbGl0TXV4UGFydFJlYWRlciAqcmVhZGVyOworICBHTWFpbkxvb3AgKm1haW5fbG9vcDsKKyAgR3N0QnVzICpidXM7Cit9IEN1c3RvbURhdGE7CisKK3N0YXRpYyB2b2lkCitwYXJ0X3ByZXBhcmVkIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIpCit7CisgIGdfcHJpbnQgKCJQYXJ0IHByZXBhcmVkXG4iKTsKK30KKworc3RhdGljIGdib29sZWFuCitoYW5kbGVfbWVzc2FnZSAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbXNnLCBDdXN0b21EYXRhICogZGF0YSkKK3sKKyAgR0Vycm9yICplcnI7CisgIGdjaGFyICpkZWJ1Z19pbmZvOworCisgIHN3aXRjaCAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6CisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobXNnLCAmZXJyLCAmZGVidWdfaW5mbyk7CisgICAgICBnX3ByaW50ICgiRXJyb3IgcmVjZWl2ZWQgZnJvbSBlbGVtZW50ICVzOiAlc1xuIiwKKyAgICAgICAgICBHU1RfT0JKRUNUX05BTUUgKG1zZy0+c3JjKSwgZXJyLT5tZXNzYWdlKTsKKyAgICAgIGdfcHJpbnQgKCJEZWJ1Z2dpbmcgaW5mb3JtYXRpb246ICVzXG4iLCBkZWJ1Z19pbmZvID8gZGVidWdfaW5mbyA6ICJub25lIik7CisgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICAgIGdfZnJlZSAoZGVidWdfaW5mbyk7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChkYXRhLT5tYWluX2xvb3ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FT1M6CisgICAgICBnX3ByaW50ICgiRW5kLU9mLVN0cmVhbSByZWFjaGVkLlxuIik7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChkYXRhLT5tYWluX2xvb3ApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorc3RhcnRfcmVhZGVyIChDdXN0b21EYXRhICogZGF0YSkKK3sKKyAgZ19wcmludCAoIlByZXBhcmluZyBwYXJ0IHJlYWRlciBmb3IgJXNcbiIsIHBhdGgpOworICBnc3Rfc3BsaXRtdXhfcGFydF9yZWFkZXJfcHJlcGFyZSAoZGF0YS0+cmVhZGVyKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgR3N0UGFkICoKK2hhbmRsZV9nZXRfcGFkIChHc3RTcGxpdE11eFBhcnRSZWFkZXIgKiByZWFkZXIsIEdzdFBhZCAqIHNyY19wYWQsCisgICAgQ3VzdG9tRGF0YSAqIGRhdGEpCit7CisgIC8qIENyZWF0ZSBhIGR1bW15IHRhcmdldCBwYWQgZm9yIHRoZSByZWFkZXIgKi8KKyAgR3N0UGFkICpuZXdfcGFkID0gZ19vYmplY3RfbmV3IChTUExJVE1VWF9UWVBFX1NSQ19QQUQsCisgICAgICAibmFtZSIsIEdTVF9QQURfTkFNRSAoc3JjX3BhZCksICJkaXJlY3Rpb24iLCBHU1RfUEFEX1NSQywgTlVMTCk7CisKKyAgZ19wcmludCAoIkNyZWF0aW5nIG5ldyBkdW1teSBwYWQgJXNcbiIsIEdTVF9QQURfTkFNRSAoc3JjX3BhZCkpOworCisgIHJldHVybiBuZXdfcGFkOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgQ3VzdG9tRGF0YSBkYXRhOworCisgIGdzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGRhdGEubWFpbl9sb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisKKyAgZGF0YS5yZWFkZXIgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX1NQTElUTVVYX1BBUlRfUkVBREVSLCBOVUxMKTsKKyAgZGF0YS5idXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChHU1RfRUxFTUVOVF9DQVNUIChkYXRhLnJlYWRlcikpOworCisgIC8qIExpc3RlbiBmb3IgYnVzIG1lc3NhZ2VzICovCisgIGdzdF9idXNfYWRkX3dhdGNoIChkYXRhLmJ1cywgKEdzdEJ1c0Z1bmMpIGhhbmRsZV9tZXNzYWdlLCAmZGF0YSk7CisKKyAgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NldF9sb2NhdGlvbiAoZGF0YS5yZWFkZXIsIHBhdGgpOworCisgIC8qIENvbm5lY3QgdG8gcHJlcGFyZSBzaWduYWwgKi8KKyAgZ19zaWduYWxfY29ubmVjdCAoZGF0YS5yZWFkZXIsICJwcmVwYXJlZCIsIChHQ2FsbGJhY2spIHBhcnRfcHJlcGFyZWQsICZkYXRhKTsKKyAgZ3N0X3NwbGl0bXV4X3BhcnRfcmVhZGVyX3NldF9jYWxsYmFja3MgKGRhdGEucmVhZGVyLCAmZGF0YSwKKyAgICAgIChHc3RTcGxpdE11eFBhcnRSZWFkZXJQYWRDYikgaGFuZGxlX2dldF9wYWQpOworCisgIGdfaWRsZV9hZGQgKChHU291cmNlRnVuYykgc3RhcnRfcmVhZGVyLCAmZGF0YSk7CisKKyAgLyogUnVuIG1haW5sb29wICovCisgIGdfbWFpbl9sb29wX3J1biAoZGF0YS5tYWluX2xvb3ApOworCisgIGdzdF9zcGxpdG11eF9wYXJ0X3JlYWRlcl91bnByZXBhcmUgKGRhdGEucmVhZGVyKTsKKworICBnX21haW5fbG9vcF91bnJlZiAoZGF0YS5tYWluX2xvb3ApOworICBnc3Rfb2JqZWN0X3VucmVmIChkYXRhLmJ1cyk7CisgIGdfb2JqZWN0X3VucmVmIChkYXRhLnJlYWRlcik7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9nc3QvbXVsdGlwYXJ0L01ha2VmaWxlLmFtIGIvZ3N0L211bHRpcGFydC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzczMGU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpcGFydC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDggQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdG11bHRpcGFydC5sYQorCitsaWJnc3RtdWx0aXBhcnRfbGFfU09VUkNFUyA9IG11bHRpcGFydC5jIG11bHRpcGFydGRlbXV4LmMgbXVsdGlwYXJ0bXV4LmMKK2xpYmdzdG11bHRpcGFydF9sYV9DRkxBR1MgPSAkKEdTVF9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKQorbGliZ3N0bXVsdGlwYXJ0X2xhX0xJQkFERCA9ICQoR1NUX0xJQlMpICQoR1NUX0JBU0VfTElCUykKK2xpYmdzdG11bHRpcGFydF9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gbXVsdGlwYXJ0ZGVtdXguaCBtdWx0aXBhcnRtdXguaApkaWZmIC0tZ2l0IGEvZ3N0L211bHRpcGFydC9tZXNvbi5idWlsZCBiL2dzdC9tdWx0aXBhcnQvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhY2E2MgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tdWx0aXBhcnQvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxMCBAQAorZ3N0bXVsdGlwYXJ0ID0gbGlicmFyeSgnZ3N0bXVsdGlwYXJ0JywKKyAgJ211bHRpcGFydC5jJywKKyAgJ211bHRpcGFydGRlbXV4LmMnLAorICAnbXVsdGlwYXJ0bXV4LmMnLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2dzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0LmMgYi9nc3QvbXVsdGlwYXJ0L211bHRpcGFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZjEwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvbXVsdGlwYXJ0L211bHRpcGFydC5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJtdWx0aXBhcnRkZW11eC5oIgorI2luY2x1ZGUgIm11bHRpcGFydG11eC5oIgorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIGdzdF9tdWx0aXBhcnRfZGVtdXhfcGx1Z2luX2luaXQgKHBsdWdpbik7CisgIGdzdF9tdWx0aXBhcnRfbXV4X3BsdWdpbl9pbml0IChwbHVnaW4pOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgbXVsdGlwYXJ0LAorICAgICJtdWx0aXBhcnQgc3RyZWFtIG1hbmlwdWxhdGlvbiIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmMgYi9nc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlNjdjMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguYwpAQCAtMCwwICsxLDgxMCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA0IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogZ3N0bXVsdGlwYXJ0ZGVtdXguYzogbXVsdGlwYXJ0IHN0cmVhbSBkZW11eGVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtbXVsdGlwYXJ0ZGVtdXgKKyAqIEBzZWVfYWxzbzogI0dzdE11bHRpcGFydE11eAorICoKKyAqIE11bHRpcGFydERlbXV4IHVzZXMgdGhlIENvbnRlbnQtdHlwZSBmaWVsZCBvZiBpbmNvbWluZyBidWZmZXJzIHRvIGRlbXV4IGFuZCAKKyAqIHB1c2ggZGF0YSB0byBkeW5hbWljIHNvdXJjZSBwYWRzLiBNb3N0IG9mIHRoZSB0aW1lIG11bHRpcGFydCBzdHJlYW1zIGFyZSAKKyAqIHNlcXVlbnRpYWwgSlBFRyBmcmFtZXMgZ2VuZXJhdGVkIGZyb20gYSBsaXZlIHNvdXJjZSBzdWNoIGFzIGEgbmV0d29yayBzb3VyY2UKKyAqIG9yIGEgY2FtZXJhLgorICoKKyAqIFRoZSBvdXRwdXQgYnVmZmVycyBvZiB0aGUgbXVsdGlwYXJ0ZGVtdXggdHlwaWNhbGx5IGhhdmUgbm8gdGltZXN0YW1wcyBhbmQgYXJlCisgKiB1c3VhbGx5IHBsYXllZCBhcyBmYXN0IGFzIHBvc3NpYmxlIChhdCB0aGUgcmF0ZSB0aGF0IHRoZSBzb3VyY2UgcHJvdmlkZXMgdGhlCisgKiBkYXRhKS4KKyAqCisgKiB0aGUgY29udGVudCBpbiBtdWx0aXBhcnQgZmlsZXMgaXMgc2VwYXJhdGVkIHdpdGggYSBib3VuZGFyeSBzdHJpbmcgdGhhdCBjYW4KKyAqIGJlIGNvbmZpZ3VyZWQgc3BlY2lmaWNhbGx5IHdpdGggdGhlICNHc3RNdWx0aXBhcnREZW11eDpib3VuZGFyeSBwcm9wZXJ0eQorICogb3RoZXJ3aXNlIGl0IHdpbGwgYmUgYXV0b2RldGVjdGVkLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5TYW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPS90bXAvdGVzdC5tdWx0aXBhcnQgISBtdWx0aXBhcnRkZW11eCAhIGltYWdlL2pwZWcsZnJhbWVyYXRlPVwoZnJhY3Rpb25cKTUvMSAhIGpwZWdwYXJzZSAhIGpwZWdkZWMgISB2aWRlb2NvbnZlcnQgISBhdXRvdmlkZW9zaW5rCisgKiBdfCBhIHNpbXBsZSBwaXBlbGluZSB0byBkZW11eCBhIG11bHRpcGFydCBmaWxlIG11eGVkIHdpdGggI0dzdE11bHRpcGFydE11eAorICogY29udGFpbmluZyBKUEVHIGZyYW1lcy4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAibXVsdGlwYXJ0ZGVtdXguaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X211bHRpcGFydF9kZW11eF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfbXVsdGlwYXJ0X2RlbXV4X2RlYnVnCisKKyNkZWZpbmUgREVGQVVMVF9CT1VOREFSWQkJTlVMTAorI2RlZmluZSBERUZBVUxUX1NJTkdMRV9TVFJFQU0JRkFMU0UKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQk9VTkRBUlksCisgIFBST1BfU0lOR0xFX1NUUkVBTQorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIG11bHRpcGFydF9kZW11eF9zcmNfdGVtcGxhdGVfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyY18ldSIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBtdWx0aXBhcnRfZGVtdXhfc2lua190ZW1wbGF0ZV9mYWN0b3J5ID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoIm11bHRpcGFydC94LW1peGVkLXJlcGxhY2UiKQorICAgICk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGdjaGFyICprZXk7CisgIGNvbnN0IGdjaGFyICp2YWw7Cit9IEdzdE5hbWVzTWFwOworCisvKiBjb252ZXJ0IGZyb20gbWltZSB0eXBlcyB0byBnc3Qgc3RydWN0dXJlIG5hbWVzLiBBZGQgbW9yZSB3aGVuIG5lZWRlZC4gVGhlCisgKiBtaW1lLXR5cGUgaXMgc3RvcmVkIGFzIGxvd2VyY2FzZSAqLworc3RhdGljIGNvbnN0IEdzdE5hbWVzTWFwIGdzdG5hbWVzW10gPSB7CisgIC8qIFJGQyAyMDQ2IHNheXMgYXVkaW8vYmFzaWMgaXMgbXVsYXcsIG1vbm8sIDgwMDBIeiAqLworICB7ImF1ZGlvL2Jhc2ljIiwgImF1ZGlvL3gtbXVsYXcsIGNoYW5uZWxzPTEsIHJhdGU9ODAwMCJ9LAorICB7ImF1ZGlvL2c3MjYtMTYiLAorICAgICAgImF1ZGlvL3gtYWRwY20sIGJpdHJhdGU9MTYwMDAsIGxheW91dD1nNzI2LCBjaGFubmVscz0xLCByYXRlPTgwMDAifSwKKyAgeyJhdWRpby9nNzI2LTI0IiwKKyAgICAgICJhdWRpby94LWFkcGNtLCBiaXRyYXRlPTI0MDAwLCBsYXlvdXQ9ZzcyNiwgY2hhbm5lbHM9MSwgcmF0ZT04MDAwIn0sCisgIHsiYXVkaW8vZzcyNi0zMiIsCisgICAgICAiYXVkaW8veC1hZHBjbSwgYml0cmF0ZT0zMjAwMCwgbGF5b3V0PWc3MjYsIGNoYW5uZWxzPTEsIHJhdGU9ODAwMCJ9LAorICB7ImF1ZGlvL2c3MjYtNDAiLAorICAgICAgImF1ZGlvL3gtYWRwY20sIGJpdHJhdGU9NDAwMDAsIGxheW91dD1nNzI2LCBjaGFubmVscz0xLCByYXRlPTgwMDAifSwKKyAgLyogUGFuYXNvbmljIE5ldHdvcmsgQ2FtZXJhcyBub24tc3RhbmRhcmQgdHlwZXMgKi8KKyAgeyJhdWRpby9nNzI2IiwKKyAgICAgICJhdWRpby94LWFkcGNtLCBiaXRyYXRlPTMyMDAwLCBsYXlvdXQ9ZzcyNiwgY2hhbm5lbHM9MSwgcmF0ZT04MDAwIn0sCisgIHtOVUxMLCBOVUxMfQorfTsKKworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYWluIChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWYpOworc3RhdGljIGdib29sZWFuIGdzdF9tdWx0aXBhcnRfZGVtdXhfZXZlbnQgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X211bHRpcGFydF9kZW11eF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKgorICAgIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgdm9pZCBnc3RfbXVsdGlwYXJ0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIHZvaWQgZ3N0X211bHRpcGFydF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aXBhcnRfZGVtdXhfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CisKKyNkZWZpbmUgZ3N0X211bHRpcGFydF9kZW11eF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RNdWx0aXBhcnREZW11eCwgZ3N0X211bHRpcGFydF9kZW11eCwgR1NUX1RZUEVfRUxFTUVOVCk7CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGlwYXJ0X2RlbXV4X2NsYXNzX2luaXQgKEdzdE11bHRpcGFydERlbXV4Q2xhc3MgKiBrbGFzcykKK3sKKyAgaW50IGk7CisKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X211bHRpcGFydF9kZW11eF9kaXNwb3NlOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfbXVsdGlwYXJ0X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X211bHRpcGFydF9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CT1VOREFSWSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJib3VuZGFyeSIsICJCb3VuZGFyeSIsCisgICAgICAgICAgIlRoZSBib3VuZGFyeSBzdHJpbmcgc2VwYXJhdGluZyBkYXRhLCBhdXRvbWF0aWMgaWYgTlVMTCIsCisgICAgICAgICAgREVGQVVMVF9CT1VOREFSWSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RNdWx0aXBhcnREZW11eDpzaW5nbGUtc3RyZWFtOgorICAgKgorICAgKiBBc3N1bWUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBzdHJlYW0gd2hvc2UgY29udGVudC10eXBlIHdpbGwKKyAgICogbm90IGNoYW5nZSBhbmQgZW1pdCBuby1tb3JlLXBhZHMgYXMgc29vbiBhcyB0aGUgZmlyc3QgYm91bmRhcnkKKyAgICogY29udGVudCBpcyBwYXJzZWQsIGRlY29kZWQsIGFuZCBwYWRzIGFyZSBsaW5rZWQuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NJTkdMRV9TVFJFQU0sCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInNpbmdsZS1zdHJlYW0iLCAiU2luZ2xlIFN0cmVhbSIsCisgICAgICAgICAgIkFzc3VtZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIHN0cmVhbSB3aG9zZSBjb250ZW50LXR5cGUgd2lsbCBub3QgY2hhbmdlIGFuZCBlbWl0IG5vLW1vcmUtcGFkcyBhcyBzb29uIGFzIHRoZSBmaXJzdCBib3VuZGFyeSBjb250ZW50IGlzIHBhcnNlZCwgZGVjb2RlZCwgYW5kIHBhZHMgYXJlIGxpbmtlZCIsCisgICAgICAgICAgREVGQVVMVF9TSU5HTEVfU1RSRUFNLCBHX1BBUkFNX1JFQURXUklURSkpOworCisgIC8qIHBvcHVsYXRlIGdzdCBuYW1lcyBhbmQgbWltZSB0eXBlcyBwYWlycyAqLworICBrbGFzcy0+Z3N0bmFtZXMgPSBnX2hhc2hfdGFibGVfbmV3IChnX3N0cl9oYXNoLCBnX3N0cl9lcXVhbCk7CisgIGZvciAoaSA9IDA7IGdzdG5hbWVzW2ldLmtleTsgaSsrKSB7CisgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoa2xhc3MtPmdzdG5hbWVzLCAoZ3BvaW50ZXIpIGdzdG5hbWVzW2ldLmtleSwKKyAgICAgICAgKGdwb2ludGVyKSBnc3RuYW1lc1tpXS52YWwpOworICB9CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X211bHRpcGFydF9kZW11eF9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmbXVsdGlwYXJ0X2RlbXV4X3NpbmtfdGVtcGxhdGVfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJm11bHRpcGFydF9kZW11eF9zcmNfdGVtcGxhdGVfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJNdWx0aXBhcnQgZGVtdXhlciIsCisgICAgICAiQ29kZWMvRGVtdXhlciIsICJkZW11eCBtdWx0aXBhcnQgc3RyZWFtcyIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4sIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXBhcnRfZGVtdXhfaW5pdCAoR3N0TXVsdGlwYXJ0RGVtdXggKiBtdWx0aXBhcnQpCit7CisgIC8qIGNyZWF0ZSB0aGUgc2luayBwYWQgKi8KKyAgbXVsdGlwYXJ0LT5zaW5rcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmbXVsdGlwYXJ0X2RlbXV4X3NpbmtfdGVtcGxhdGVfZmFjdG9yeSwKKyAgICAgICJzaW5rIik7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKG11bHRpcGFydCksIG11bHRpcGFydC0+c2lua3BhZCk7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChtdWx0aXBhcnQtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X211bHRpcGFydF9kZW11eF9jaGFpbikpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAobXVsdGlwYXJ0LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tdWx0aXBhcnRfZGVtdXhfZXZlbnQpKTsKKworICBtdWx0aXBhcnQtPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIG11bHRpcGFydC0+Ym91bmRhcnkgPSBERUZBVUxUX0JPVU5EQVJZOworICBtdWx0aXBhcnQtPm1pbWVfdHlwZSA9IE5VTEw7CisgIG11bHRpcGFydC0+Y29udGVudF9sZW5ndGggPSAtMTsKKyAgbXVsdGlwYXJ0LT5oZWFkZXJfY29tcGxldGVkID0gRkFMU0U7CisgIG11bHRpcGFydC0+c2NhbnBvcyA9IDA7CisgIG11bHRpcGFydC0+c2luZ2xlU3RyZWFtID0gREVGQVVMVF9TSU5HTEVfU1RSRUFNOworICBtdWx0aXBhcnQtPmhhdmVfZ3JvdXBfaWQgPSBGQUxTRTsKKyAgbXVsdGlwYXJ0LT5ncm91cF9pZCA9IEdfTUFYVUlOVDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXBhcnRfZGVtdXhfcmVtb3ZlX3NyY19wYWRzIChHc3RNdWx0aXBhcnREZW11eCAqIGRlbXV4KQoreworICB3aGlsZSAoZGVtdXgtPnNyY3BhZHMgIT0gTlVMTCkgeworICAgIEdzdE11bHRpcGFydFBhZCAqbXBwYWQgPSBkZW11eC0+c3JjcGFkcy0+ZGF0YTsKKworICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UIChkZW11eCksIG1wcGFkLT5wYWQpOworICAgIGdfZnJlZSAobXBwYWQtPm1pbWUpOworICAgIGdfZnJlZSAobXBwYWQpOworICAgIGRlbXV4LT5zcmNwYWRzID0gZ19zbGlzdF9kZWxldGVfbGluayAoZGVtdXgtPnNyY3BhZHMsIGRlbXV4LT5zcmNwYWRzKTsKKyAgfQorICBkZW11eC0+c3JjcGFkcyA9IE5VTEw7CisgIGRlbXV4LT5udW1wYWRzID0gMDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXBhcnRfZGVtdXhfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0TXVsdGlwYXJ0RGVtdXggKmRlbXV4ID0gR1NUX01VTFRJUEFSVF9ERU1VWCAob2JqZWN0KTsKKworICBpZiAoZGVtdXgtPmFkYXB0ZXIgIT0gTlVMTCkKKyAgICBnX29iamVjdF91bnJlZiAoZGVtdXgtPmFkYXB0ZXIpOworICBkZW11eC0+YWRhcHRlciA9IE5VTEw7CisgIGdfZnJlZSAoZGVtdXgtPmJvdW5kYXJ5KTsKKyAgZGVtdXgtPmJvdW5kYXJ5ID0gTlVMTDsKKyAgZ19mcmVlIChkZW11eC0+bWltZV90eXBlKTsKKyAgZGVtdXgtPm1pbWVfdHlwZSA9IE5VTEw7CisgIGdzdF9tdWx0aXBhcnRfZGVtdXhfcmVtb3ZlX3NyY19wYWRzIChkZW11eCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqCitnc3RfbXVsdGlwYXJ0X2RlbXV4X2dldF9nc3RuYW1lIChHc3RNdWx0aXBhcnREZW11eCAqIGRlbXV4LCBnY2hhciAqIG1pbWV0eXBlKQoreworICBHc3RNdWx0aXBhcnREZW11eENsYXNzICprbGFzczsKKyAgY29uc3QgZ2NoYXIgKmdzdG5hbWU7CisKKyAga2xhc3MgPSBHU1RfTVVMVElQQVJUX0RFTVVYX0dFVF9DTEFTUyAoZGVtdXgpOworCisgIC8qIHVzZSBoYXNodGFibGUgdG8gY29udmVydCB0byBnc3QgbmFtZSAqLworICBnc3RuYW1lID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAoa2xhc3MtPmdzdG5hbWVzLCBtaW1ldHlwZSk7CisgIGlmIChnc3RuYW1lID09IE5VTEwpIHsKKyAgICAvKiBubyBnc3QgbmFtZSBtYXBwaW5nLCB1c2UgbWltZSB0eXBlICovCisgICAgZ3N0bmFtZSA9IG1pbWV0eXBlOworICB9CisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZ3N0IG5hbWUgZm9yICVzIGlzICVzIiwgbWltZXR5cGUsIGdzdG5hbWUpOworICByZXR1cm4gZ3N0bmFtZTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tdWx0aXBhcnRfY29tYmluZV9mbG93cyAoR3N0TXVsdGlwYXJ0RGVtdXggKiBkZW11eCwgR3N0TXVsdGlwYXJ0UGFkICogcGFkLAorICAgIEdzdEZsb3dSZXR1cm4gcmV0KQoreworICBHU0xpc3QgKndhbGs7CisKKyAgLyogc3RvcmUgdGhlIHZhbHVlICovCisgIHBhZC0+bGFzdF9yZXQgPSByZXQ7CisKKyAgLyogYW55IG90aGVyIGVycm9yIHRoYXQgaXMgbm90LWxpbmtlZCBjYW4gYmUgcmV0dXJuZWQgcmlnaHQKKyAgICogYXdheSAqLworICBpZiAocmV0ICE9IEdTVF9GTE9XX05PVF9MSU5LRUQpCisgICAgZ290byBkb25lOworCisgIC8qIG9ubHkgcmV0dXJuIE5PVF9MSU5LRUQgaWYgYWxsIG90aGVyIHBhZHMgcmV0dXJuZWQgTk9UX0xJTktFRCAqLworICBmb3IgKHdhbGsgPSBkZW11eC0+c3JjcGFkczsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RNdWx0aXBhcnRQYWQgKm9wYWQgPSAoR3N0TXVsdGlwYXJ0UGFkICopIHdhbGstPmRhdGE7CisKKyAgICByZXQgPSBvcGFkLT5sYXN0X3JldDsKKyAgICAvKiBzb21lIG90aGVyIHJldHVybiB2YWx1ZSAobXVzdCBiZSBTVUNDRVNTIGJ1dCB3ZSBjYW4gcmV0dXJuCisgICAgICogb3RoZXIgdmFsdWVzIGFzIHdlbGwpICovCisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19OT1RfTElOS0VEKQorICAgICAgZ290byBkb25lOworICB9CisgIC8qIGlmIHdlIGdldCBoZXJlLCBhbGwgb3RoZXIgcGFkcyB3ZXJlIHVubGlua2VkIGFuZCB3ZSByZXR1cm4KKyAgICogTk9UX0xJTktFRCB0aGVuICovCitkb25lOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0TXVsdGlwYXJ0UGFkICoKK2dzdF9tdWx0aXBhcnRfZmluZF9wYWRfYnlfbWltZSAoR3N0TXVsdGlwYXJ0RGVtdXggKiBkZW11eCwgZ2NoYXIgKiBtaW1lLAorICAgIGdib29sZWFuICogY3JlYXRlZCkKK3sKKyAgR1NMaXN0ICp3YWxrOworCisgIHdhbGsgPSBkZW11eC0+c3JjcGFkczsKKyAgd2hpbGUgKHdhbGspIHsKKyAgICBHc3RNdWx0aXBhcnRQYWQgKnBhZCA9IChHc3RNdWx0aXBhcnRQYWQgKikgd2Fsay0+ZGF0YTsKKworICAgIGlmICghc3RyY21wIChwYWQtPm1pbWUsIG1pbWUpKSB7CisgICAgICBpZiAoY3JlYXRlZCkgeworICAgICAgICAqY3JlYXRlZCA9IEZBTFNFOworICAgICAgfQorICAgICAgcmV0dXJuIHBhZDsKKyAgICB9CisKKyAgICB3YWxrID0gd2Fsay0+bmV4dDsKKyAgfQorICAvKiBwYWQgbm90IGZvdW5kLCBjcmVhdGUgaXQgKi8KKyAgeworICAgIEdzdFBhZCAqcGFkOworICAgIEdzdE11bHRpcGFydFBhZCAqbXBwYWQ7CisgICAgZ2NoYXIgKm5hbWU7CisgICAgY29uc3QgZ2NoYXIgKmNhcHNuYW1lOworICAgIEdzdENhcHMgKmNhcHM7CisgICAgZ2NoYXIgKnN0cmVhbV9pZDsKKyAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICBtcHBhZCA9IGdfbmV3MCAoR3N0TXVsdGlwYXJ0UGFkLCAxKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiY3JlYXRpbmcgcGFkIHdpdGggbWltZTogJXMiLCBtaW1lKTsKKworICAgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzcmNfJXUiLCBkZW11eC0+bnVtcGFkcyk7CisgICAgcGFkID0KKyAgICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZtdWx0aXBhcnRfZGVtdXhfc3JjX3RlbXBsYXRlX2ZhY3RvcnksCisgICAgICAgIG5hbWUpOworICAgIGdfZnJlZSAobmFtZSk7CisKKyAgICBtcHBhZC0+cGFkID0gcGFkOworICAgIG1wcGFkLT5taW1lID0gZ19zdHJkdXAgKG1pbWUpOworICAgIG1wcGFkLT5sYXN0X3JldCA9IEdTVF9GTE9XX09LOworICAgIG1wcGFkLT5sYXN0X3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICBtcHBhZC0+ZGlzY29udCA9IFRSVUU7CisKKyAgICBkZW11eC0+c3JjcGFkcyA9IGdfc2xpc3RfcHJlcGVuZCAoZGVtdXgtPnNyY3BhZHMsIG1wcGFkKTsKKyAgICBkZW11eC0+bnVtcGFkcysrOworCisgICAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAocGFkKTsKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKHBhZCwgVFJVRSk7CisKKyAgICAvKiBwcmVwYXJlIGFuZCBzZW5kIHN0cmVhbS1zdGFydCAqLworICAgIGlmICghZGVtdXgtPmhhdmVfZ3JvdXBfaWQpIHsKKyAgICAgIGV2ZW50ID0gZ3N0X3BhZF9nZXRfc3RpY2t5X2V2ZW50IChkZW11eC0+c2lua3BhZCwKKyAgICAgICAgICBHU1RfRVZFTlRfU1RSRUFNX1NUQVJULCAwKTsKKworICAgICAgaWYgKGV2ZW50KSB7CisgICAgICAgIGRlbXV4LT5oYXZlX2dyb3VwX2lkID0KKyAgICAgICAgICAgIGdzdF9ldmVudF9wYXJzZV9ncm91cF9pZCAoZXZlbnQsICZkZW11eC0+Z3JvdXBfaWQpOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIH0gZWxzZSBpZiAoIWRlbXV4LT5oYXZlX2dyb3VwX2lkKSB7CisgICAgICAgIGRlbXV4LT5oYXZlX2dyb3VwX2lkID0gVFJVRTsKKyAgICAgICAgZGVtdXgtPmdyb3VwX2lkID0gZ3N0X3V0aWxfZ3JvdXBfaWRfbmV4dCAoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdHJlYW1faWQgPSBnc3RfcGFkX2NyZWF0ZV9zdHJlYW1faWQgKHBhZCwKKyAgICAgICAgR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCBkZW11eC0+bWltZV90eXBlKTsKKworICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKHN0cmVhbV9pZCk7CisgICAgaWYgKGRlbXV4LT5oYXZlX2dyb3VwX2lkKQorICAgICAgZ3N0X2V2ZW50X3NldF9ncm91cF9pZCAoZXZlbnQsIGRlbXV4LT5ncm91cF9pZCk7CisKKyAgICBnc3RfcGFkX3N0b3JlX3N0aWNreV9ldmVudCAocGFkLCBldmVudCk7CisgICAgZ19mcmVlIChzdHJlYW1faWQpOworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworCisgICAgLyogdGFrZSB0aGUgbWltZSB0eXBlLCBjb252ZXJ0IGl0IHRvIHRoZSBjYXBzIG5hbWUgKi8KKyAgICBjYXBzbmFtZSA9IGdzdF9tdWx0aXBhcnRfZGVtdXhfZ2V0X2dzdG5hbWUgKGRlbXV4LCBtaW1lKTsKKyAgICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKGNhcHNuYW1lKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImNhcHMgZm9yIHBhZDogJXMiLCBjYXBzbmFtZSk7CisgICAgZ3N0X3BhZF9zZXRfY2FwcyAocGFkLCBjYXBzKTsKKyAgICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChkZW11eCksIHBhZCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgaWYgKGNyZWF0ZWQpIHsKKyAgICAgICpjcmVhdGVkID0gVFJVRTsKKyAgICB9CisKKyAgICBpZiAoZGVtdXgtPnNpbmdsZVN0cmVhbSkgeworICAgICAgZ3N0X2VsZW1lbnRfbm9fbW9yZV9wYWRzIChHU1RfRUxFTUVOVF9DQVNUIChkZW11eCkpOworICAgIH0KKworICAgIHJldHVybiBtcHBhZDsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dldF9saW5lX2VuZCAoY29uc3QgZ3VpbnQ4ICogZGF0YSwgY29uc3QgZ3VpbnQ4ICogZGF0YWVuZCwgZ3VpbnQ4ICoqIGVuZCwKKyAgICBndWludDggKiogbmV4dCkKK3sKKyAgZ3VpbnQ4ICp4OworICBnYm9vbGVhbiBmb3VuZHIgPSBGQUxTRTsKKworICBmb3IgKHggPSAoZ3VpbnQ4ICopIGRhdGE7IHggPCBkYXRhZW5kOyB4KyspIHsKKyAgICBpZiAoKnggPT0gJ1xyJykgeworICAgICAgZm91bmRyID0gVFJVRTsKKyAgICB9IGVsc2UgaWYgKCp4ID09ICdcbicpIHsKKyAgICAgICplbmQgPSB4IC0gKGZvdW5kciA/IDEgOiAwKTsKKyAgICAgICpuZXh0ID0geCArIDE7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ3VpbnQKK2dldF9taW1lX2xlbiAoY29uc3QgZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgbWF4bGVuKQoreworICBndWludDggKng7CisKKyAgeCA9IChndWludDggKikgZGF0YTsKKyAgd2hpbGUgKCp4ICE9ICdcMCcgJiYgKnggIT0gJ1xyJyAmJiAqeCAhPSAnXG4nICYmICp4ICE9ICc7JykgeworICAgIHgrKzsKKyAgfQorICByZXR1cm4geCAtIGRhdGE7Cit9CisKK3N0YXRpYyBnaW50CittdWx0aXBhcnRfcGFyc2VfaGVhZGVyIChHc3RNdWx0aXBhcnREZW11eCAqIG11bHRpcGFydCkKK3sKKyAgY29uc3QgZ3VpbnQ4ICpkYXRhOworICBjb25zdCBndWludDggKmRhdGFlbmQ7CisgIGdjaGFyICpib3VuZGFyeTsKKyAgaW50IGJvdW5kYXJ5X2xlbjsKKyAgaW50IGRhdGFsZW47CisgIGd1aW50OCAqcG9zOworICBndWludDggKmVuZCwgKm5leHQ7CisKKyAgZGF0YWxlbiA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAobXVsdGlwYXJ0LT5hZGFwdGVyKTsKKyAgZGF0YSA9IGdzdF9hZGFwdGVyX21hcCAobXVsdGlwYXJ0LT5hZGFwdGVyLCBkYXRhbGVuKTsKKyAgZGF0YWVuZCA9IGRhdGEgKyBkYXRhbGVuOworCisgIC8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlLCBwb3MgZW5kcG9zaXRpb24gc2hvdWxkIGF0IGxlYXN0IGxlYXZlIHNwYWNlIGZvcgorICAgKiB0aGUgYm91bmRhcnkgYW5kIGEgXG4gKi8KKyAgZm9yIChwb3MgPSAoZ3VpbnQ4ICopIGRhdGE7IHBvcyA8IGRhdGFlbmQgLSA0ICYmIGdfYXNjaWlfaXNzcGFjZSAoKnBvcyk7CisgICAgICBwb3MrKyk7CisKKyAgaWYgKHBvcyA+PSBkYXRhZW5kIC0gNCkKKyAgICBnb3RvIG5lZWRfbW9yZV9kYXRhOworCisgIGlmIChHX1VOTElLRUxZIChwb3NbMF0gIT0gJy0nIHx8IHBvc1sxXSAhPSAnLScpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAobXVsdGlwYXJ0LCAiTm8gYm91bmRhcnkgYXZhaWxhYmxlIik7CisgICAgZ290byB3cm9uZ19oZWFkZXI7CisgIH0KKworICAvKiBGaXJzdCB0aGUgYm91bmRhcnkgKi8KKyAgaWYgKCFnZXRfbGluZV9lbmQgKHBvcywgZGF0YWVuZCwgJmVuZCwgJm5leHQpKQorICAgIGdvdG8gbmVlZF9tb3JlX2RhdGE7CisKKyAgLyogSWdub3JlIHRoZSBsZWFkaW5nIC0tICovCisgIGJvdW5kYXJ5X2xlbiA9IGVuZCAtIHBvcyAtIDI7CisgIGJvdW5kYXJ5ID0gKGdjaGFyICopIHBvcyArIDI7CisgIGlmIChib3VuZGFyeV9sZW4gPCAxKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAobXVsdGlwYXJ0LCAiTm8gYm91bmRhcnkgYXZhaWxhYmxlIik7CisgICAgZ290byB3cm9uZ19oZWFkZXI7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAobXVsdGlwYXJ0LT5ib3VuZGFyeSA9PSBOVUxMKSkgeworICAgIC8qIEZpcnN0IHRpbWUgd2Ugc2VlIHRoZSBib3VuZGFyeSwgY29weSBpdCAqLworICAgIG11bHRpcGFydC0+Ym91bmRhcnkgPSBnX3N0cm5kdXAgKGJvdW5kYXJ5LCBib3VuZGFyeV9sZW4pOworICAgIG11bHRpcGFydC0+Ym91bmRhcnlfbGVuID0gYm91bmRhcnlfbGVuOworICB9IGVsc2UgaWYgKEdfVU5MSUtFTFkgKGJvdW5kYXJ5X2xlbiAhPSBtdWx0aXBhcnQtPmJvdW5kYXJ5X2xlbikpIHsKKyAgICAvKiBTb21ldGhpbmcgb2RkIGlzIGdvaW5nIG9uLCBlaXRoZXIgdGhlIGJvdW5kYXJ5IGluZGljYXRlZCBFT1Mgb3IgaXQncworICAgICAqIGludmFsaWQgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAoYm91bmRhcnlfbGVuID09IG11bHRpcGFydC0+Ym91bmRhcnlfbGVuICsgMiAmJgorICAgICAgICAgICAgIXN0cm5jbXAgKGJvdW5kYXJ5LCBtdWx0aXBhcnQtPmJvdW5kYXJ5LCBtdWx0aXBhcnQtPmJvdW5kYXJ5X2xlbikgJiYKKyAgICAgICAgICAgICFzdHJuY21wIChib3VuZGFyeSArIG11bHRpcGFydC0+Ym91bmRhcnlfbGVuLCAiLS0iLCAyKSkpCisgICAgICBnb3RvIGVvczsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11bHRpcGFydCwKKyAgICAgICAgIkJvdW5kYXJ5IGxlbmd0aCBkb2Vzbid0IG1hdGNoIGRldGVjdGVkIGJvdW5kYXJ5ICglZCA8PiAlZCIsCisgICAgICAgIGJvdW5kYXJ5X2xlbiwgbXVsdGlwYXJ0LT5ib3VuZGFyeV9sZW4pOworICAgIGdvdG8gd3JvbmdfaGVhZGVyOworICB9IGVsc2UgaWYgKEdfVU5MSUtFTFkgKHN0cm5jbXAgKGJvdW5kYXJ5LCBtdWx0aXBhcnQtPmJvdW5kYXJ5LCBib3VuZGFyeV9sZW4pKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11bHRpcGFydCwgIkJvdW5kYXJ5IGRvZXNuJ3QgbWF0Y2ggcHJldmlvdXMgYm91bmRhcnkiKTsKKyAgICBnb3RvIHdyb25nX2hlYWRlcjsKKyAgfQorCisgIHBvcyA9IG5leHQ7CisgIHdoaWxlIChnZXRfbGluZV9lbmQgKHBvcywgZGF0YWVuZCwgJmVuZCwgJm5leHQpKSB7CisgICAgZ3VpbnQgbGVuID0gZW5kIC0gcG9zOworCisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAvKiBlbXB0eSBsaW5lLCBkYXRhIHN0YXJ0cyBiZWhpbmQgdXMgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11bHRpcGFydCwKKyAgICAgICAgICAiUGFyc2VkIHRoZSBoZWFkZXIgLSBib3VuZGFyeTogJXMsIG1pbWUtdHlwZTogJXMsIGNvbnRlbnQtbGVuZ3RoOiAlZCIsCisgICAgICAgICAgbXVsdGlwYXJ0LT5ib3VuZGFyeSwgbXVsdGlwYXJ0LT5taW1lX3R5cGUsIG11bHRpcGFydC0+Y29udGVudF9sZW5ndGgpOworICAgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKG11bHRpcGFydC0+YWRhcHRlcik7CisgICAgICByZXR1cm4gbmV4dCAtIGRhdGE7CisgICAgfQorCisgICAgaWYgKGxlbiA+PSAxNCAmJiAhZ19hc2NpaV9zdHJuY2FzZWNtcCAoImNvbnRlbnQtdHlwZToiLCAoZ2NoYXIgKikgcG9zLCAxMykpIHsKKyAgICAgIGd1aW50IG1pbWVfbGVuOworCisgICAgICAvKiBvbmx5IHRha2UgdGhlIG1pbWUgdHlwZSB1cCB0byB0aGUgZmlyc3QgOyBpZiBhbnkuIEFmdGVyIDsgdGhlcmUgY2FuIGJlCisgICAgICAgKiBwcm9wZXJ0aWVzIHRoYXQgd2UgZG9uJ3QgaGFuZGxlIHlldC4gKi8KKyAgICAgIG1pbWVfbGVuID0gZ2V0X21pbWVfbGVuIChwb3MgKyAxNCwgbGVuIC0gMTQpOworCisgICAgICBnX2ZyZWUgKG11bHRpcGFydC0+bWltZV90eXBlKTsKKyAgICAgIG11bHRpcGFydC0+bWltZV90eXBlID0gZ19hc2NpaV9zdHJkb3duICgoZ2NoYXIgKikgcG9zICsgMTQsIG1pbWVfbGVuKTsKKyAgICB9IGVsc2UgaWYgKGxlbiA+PSAxNSAmJgorICAgICAgICAhZ19hc2NpaV9zdHJuY2FzZWNtcCAoImNvbnRlbnQtbGVuZ3RoOiIsIChnY2hhciAqKSBwb3MsIDE1KSkgeworICAgICAgbXVsdGlwYXJ0LT5jb250ZW50X2xlbmd0aCA9CisgICAgICAgICAgZ19hc2NpaV9zdHJ0b3VsbCAoKGdjaGFyICopIHBvcyArIDE1LCBOVUxMLCAxMCk7CisgICAgfQorICAgIHBvcyA9IG5leHQ7CisgIH0KKworbmVlZF9tb3JlX2RhdGE6CisgIEdTVF9ERUJVR19PQkpFQ1QgKG11bHRpcGFydCwgIk5lZWQgbW9yZSBkYXRhIGZvciB0aGUgaGVhZGVyIik7CisgIGdzdF9hZGFwdGVyX3VubWFwIChtdWx0aXBhcnQtPmFkYXB0ZXIpOworCisgIHJldHVybiBNVUxUSVBBUlRfTkVFRF9NT1JFX0RBVEE7CisKK3dyb25nX2hlYWRlcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdWx0aXBhcnQsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwKKyAgICAgICAgKCJCb3VuZGFyeSBub3QgZm91bmQgaW4gdGhlIG11bHRpcGFydCBoZWFkZXIiKSk7CisgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKG11bHRpcGFydC0+YWRhcHRlcik7CisgICAgcmV0dXJuIE1VTFRJUEFSVF9EQVRBX0VSUk9SOworICB9Citlb3M6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChtdWx0aXBhcnQsICJ3ZSBhcmUgRU9TIik7CisgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKG11bHRpcGFydC0+YWRhcHRlcik7CisgICAgcmV0dXJuIE1VTFRJUEFSVF9EQVRBX0VPUzsKKyAgfQorfQorCitzdGF0aWMgZ2ludAorbXVsdGlwYXJ0X2ZpbmRfYm91bmRhcnkgKEdzdE11bHRpcGFydERlbXV4ICogbXVsdGlwYXJ0LCBnaW50ICogZGF0YWxlbikKK3sKKyAgLyogQWRhcHRvciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgZGF0YSAqLworICBjb25zdCBndWludDggKmRhdGEsICpwb3M7CisgIGNvbnN0IGd1aW50OCAqZGF0YWVuZDsKKyAgZ2ludCBsZW47CisKKyAgaWYgKG11bHRpcGFydC0+Y29udGVudF9sZW5ndGggPj0gMCkgeworICAgIC8qIGZhc3QgcGF0aCwga25vd24gY29udGVudCBsZW5ndGggOikgKi8KKyAgICBsZW4gPSBtdWx0aXBhcnQtPmNvbnRlbnRfbGVuZ3RoOworICAgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKG11bHRpcGFydC0+YWRhcHRlcikgPj0gbGVuICsgMikgeworICAgICAgKmRhdGFsZW4gPSBsZW47CisgICAgICBkYXRhID0gZ3N0X2FkYXB0ZXJfbWFwIChtdWx0aXBhcnQtPmFkYXB0ZXIsIGxlbiArIDEpOworCisgICAgICAvKiBJZiBkYXRhW2xlbl0gY29udGFpbnMgXHIgdGhlbiBhc3N1bWUgYSBuZXdsaW5lIGlzIFxyXG4gKi8KKyAgICAgIGlmIChkYXRhW2xlbl0gPT0gJ1xyJykKKyAgICAgICAgbGVuICs9IDI7CisgICAgICBlbHNlIGlmIChkYXRhW2xlbl0gPT0gJ1xuJykKKyAgICAgICAgbGVuICs9IDE7CisKKyAgICAgIGdzdF9hZGFwdGVyX3VubWFwIChtdWx0aXBhcnQtPmFkYXB0ZXIpOworICAgICAgLyogRG9uJ3QgY2hlY2sgaWYgYm91bmRhcnkgaXMgYWN0dWFsbHkgdGhlcmUsIGJ1dCBsZXQgdGhlIGhlYWRlciBwYXJzaW5nCisgICAgICAgKiBiYWlsIG91dCBpZiBpdCBpc24ndCAqLworICAgICAgcmV0dXJuIGxlbjsKKyAgICB9IGVsc2UgeworICAgICAgLyogbmVlZCBtb3JlIGRhdGEgKi8KKyAgICAgIHJldHVybiBNVUxUSVBBUlRfTkVFRF9NT1JFX0RBVEE7CisgICAgfQorICB9CisKKyAgbGVuID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChtdWx0aXBhcnQtPmFkYXB0ZXIpOworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuIE1VTFRJUEFSVF9ORUVEX01PUkVfREFUQTsKKyAgZGF0YSA9IGdzdF9hZGFwdGVyX21hcCAobXVsdGlwYXJ0LT5hZGFwdGVyLCBsZW4pOworICBkYXRhZW5kID0gZGF0YSArIGxlbjsKKworICBmb3IgKHBvcyA9IGRhdGEgKyBtdWx0aXBhcnQtPnNjYW5wb3M7CisgICAgICBwb3MgPD0gZGF0YWVuZCAtIG11bHRpcGFydC0+Ym91bmRhcnlfbGVuIC0gMjsgcG9zKyspIHsKKyAgICBpZiAoKnBvcyA9PSAnLScgJiYgcG9zWzFdID09ICctJyAmJgorICAgICAgICAhc3RybmNtcCAoKGdjaGFyICopIHBvcyArIDIsCisgICAgICAgICAgICBtdWx0aXBhcnQtPmJvdW5kYXJ5LCBtdWx0aXBhcnQtPmJvdW5kYXJ5X2xlbikpIHsKKyAgICAgIC8qIEZvdW5kIHRoZSBib3VuZGFyeSEgQ2hlY2sgaWYgdGhlcmUgd2FzIGEgbmV3bGluZSBiZWZvcmUgdGhlIGJvdW5kYXJ5ICovCisgICAgICBsZW4gPSBwb3MgLSBkYXRhOworICAgICAgaWYgKHBvcyAtIDIgPiBkYXRhICYmIHBvc1stMl0gPT0gJ1xyJykKKyAgICAgICAgbGVuIC09IDI7CisgICAgICBlbHNlIGlmIChwb3MgLSAxID4gZGF0YSAmJiBwb3NbLTFdID09ICdcbicpCisgICAgICAgIGxlbiAtPSAxOworICAgICAgKmRhdGFsZW4gPSBsZW47CisKKyAgICAgIGdzdF9hZGFwdGVyX3VubWFwIChtdWx0aXBhcnQtPmFkYXB0ZXIpOworICAgICAgbXVsdGlwYXJ0LT5zY2FucG9zID0gMDsKKyAgICAgIHJldHVybiBwb3MgLSBkYXRhOworICAgIH0KKyAgfQorICBnc3RfYWRhcHRlcl91bm1hcCAobXVsdGlwYXJ0LT5hZGFwdGVyKTsKKyAgbXVsdGlwYXJ0LT5zY2FucG9zID0gcG9zIC0gZGF0YTsKKyAgcmV0dXJuIE1VTFRJUEFSVF9ORUVEX01PUkVfREFUQTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbXVsdGlwYXJ0X2RlbXV4X2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0TXVsdGlwYXJ0RGVtdXggKm11bHRpcGFydDsKKworICBtdWx0aXBhcnQgPSBHU1RfTVVMVElQQVJUX0RFTVVYIChwYXJlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIGlmICghbXVsdGlwYXJ0LT5zcmNwYWRzKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdWx0aXBhcnQsIFNUUkVBTSwgV1JPTkdfVFlQRSwKKyAgICAgICAgICAgICgiVGhpcyBzdHJlYW0gY29udGFpbnMgbm8gdmFsaWQgc3RyZWFtcy4iKSwKKyAgICAgICAgICAgICgiR290IEVPUyBiZWZvcmUgYWRkaW5nIGFueSBwYWRzIikpOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RNdWx0aXBhcnREZW11eCAqbXVsdGlwYXJ0OworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBnaW50IHNpemUgPSAxOworICBHc3RGbG93UmV0dXJuIHJlczsKKworICBtdWx0aXBhcnQgPSBHU1RfTVVMVElQQVJUX0RFTVVYIChwYXJlbnQpOworICBhZGFwdGVyID0gbXVsdGlwYXJ0LT5hZGFwdGVyOworCisgIHJlcyA9IEdTVF9GTE9XX09LOworCisgIGlmIChHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKSkgeworICAgIEdTTGlzdCAqbDsKKworICAgIGZvciAobCA9IG11bHRpcGFydC0+c3JjcGFkczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworICAgICAgR3N0TXVsdGlwYXJ0UGFkICpzcmNwYWQgPSBsLT5kYXRhOworCisgICAgICBzcmNwYWQtPmRpc2NvbnQgPSBUUlVFOworICAgIH0KKyAgICBnc3RfYWRhcHRlcl9jbGVhciAoYWRhcHRlcik7CisgIH0KKyAgZ3N0X2FkYXB0ZXJfcHVzaCAoYWRhcHRlciwgYnVmKTsKKworICB3aGlsZSAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChhZGFwdGVyKSA+IDApIHsKKyAgICBHc3RNdWx0aXBhcnRQYWQgKnNyY3BhZDsKKyAgICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgICBnYm9vbGVhbiBjcmVhdGVkOworICAgIGdpbnQgZGF0YWxlbjsKKworICAgIGlmIChHX1VOTElLRUxZICghbXVsdGlwYXJ0LT5oZWFkZXJfY29tcGxldGVkKSkgeworICAgICAgaWYgKChzaXplID0gbXVsdGlwYXJ0X3BhcnNlX2hlYWRlciAobXVsdGlwYXJ0KSkgPCAwKSB7CisgICAgICAgIGdvdG8gbm9kYXRhOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGFkYXB0ZXIsIHNpemUpOworICAgICAgICBtdWx0aXBhcnQtPmhlYWRlcl9jb21wbGV0ZWQgPSBUUlVFOworICAgICAgfQorICAgIH0KKyAgICBpZiAoKHNpemUgPSBtdWx0aXBhcnRfZmluZF9ib3VuZGFyeSAobXVsdGlwYXJ0LCAmZGF0YWxlbikpIDwgMCkgeworICAgICAgZ290byBub2RhdGE7CisgICAgfQorCisgICAgLyogSW52YWxpZGF0ZSBoZWFkZXIgaW5mbyAqLworICAgIG11bHRpcGFydC0+aGVhZGVyX2NvbXBsZXRlZCA9IEZBTFNFOworICAgIG11bHRpcGFydC0+Y29udGVudF9sZW5ndGggPSAtMTsKKworICAgIGlmIChHX1VOTElLRUxZIChkYXRhbGVuIDw9IDApKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChtdWx0aXBhcnQsICJza2lwcGluZyBlbXB0eSBjb250ZW50LiIpOworICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKGFkYXB0ZXIsIHNpemUgLSBkYXRhbGVuKTsKKyAgICB9IGVsc2UgaWYgKEdfVU5MSUtFTFkgKCFtdWx0aXBhcnQtPm1pbWVfdHlwZSkpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG11bHRpcGFydCwgImNvbnRlbnQgaGFzIG5vIE1JTUUgdHlwZS4iKTsKKyAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChhZGFwdGVyLCBzaXplIC0gZGF0YWxlbik7CisgICAgfSBlbHNlIHsKKyAgICAgIEdzdENsb2NrVGltZSB0czsKKworICAgICAgc3JjcGFkID0KKyAgICAgICAgICBnc3RfbXVsdGlwYXJ0X2ZpbmRfcGFkX2J5X21pbWUgKG11bHRpcGFydCwKKyAgICAgICAgICBtdWx0aXBhcnQtPm1pbWVfdHlwZSwgJmNyZWF0ZWQpOworCisgICAgICB0cyA9IGdzdF9hZGFwdGVyX3ByZXZfcHRzIChhZGFwdGVyLCBOVUxMKTsKKyAgICAgIG91dGJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChhZGFwdGVyLCBkYXRhbGVuKTsKKyAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChhZGFwdGVyLCBzaXplIC0gZGF0YWxlbik7CisKKyAgICAgIGlmIChjcmVhdGVkKSB7CisgICAgICAgIEdzdFRhZ0xpc3QgKnRhZ3M7CisgICAgICAgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICAgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKworICAgICAgICAvKiBQdXNoIG5ldyBzZWdtZW50LCBmaXJzdCBidWZmZXIgaGFzIDAgdGltZXN0YW1wICovCisgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjcGFkLT5wYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKworICAgICAgICB0YWdzID0gZ3N0X3RhZ19saXN0X25ldyAoR1NUX1RBR19DT05UQUlORVJfRk9STUFULCAiTXVsdGlwYXJ0IiwgTlVMTCk7CisgICAgICAgIGdzdF90YWdfbGlzdF9zZXRfc2NvcGUgKHRhZ3MsIEdTVF9UQUdfU0NPUEVfR0xPQkFMKTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmNwYWQtPnBhZCwgZ3N0X2V2ZW50X25ld190YWcgKHRhZ3MpKTsKKyAgICAgIH0KKworICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChvdXRidWYpOworICAgICAgaWYgKHNyY3BhZC0+bGFzdF90cyA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FIHx8IHNyY3BhZC0+bGFzdF90cyAhPSB0cykgeworICAgICAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSA9IHRzOworICAgICAgICBzcmNwYWQtPmxhc3RfdHMgPSB0czsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgIH0KKworICAgICAgaWYgKHNyY3BhZC0+ZGlzY29udCkgeworICAgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICAgICAgc3JjcGFkLT5kaXNjb250ID0gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgICAgfQorCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChtdWx0aXBhcnQsCisgICAgICAgICAgInB1c2hpbmcgYnVmZmVyIHdpdGggdGltZXN0YW1wICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSkpOworICAgICAgcmVzID0gZ3N0X3BhZF9wdXNoIChzcmNwYWQtPnBhZCwgb3V0YnVmKTsKKyAgICAgIHJlcyA9IGdzdF9tdWx0aXBhcnRfY29tYmluZV9mbG93cyAobXVsdGlwYXJ0LCBzcmNwYWQsIHJlcyk7CisgICAgICBpZiAocmVzICE9IEdTVF9GTE9XX09LKQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworbm9kYXRhOgorICBpZiAoR19VTkxJS0VMWSAoc2l6ZSA9PSBNVUxUSVBBUlRfREFUQV9FUlJPUikpCisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICBpZiAoR19VTkxJS0VMWSAoc2l6ZSA9PSBNVUxUSVBBUlRfREFUQV9FT1MpKQorICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfbXVsdGlwYXJ0X2RlbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0TXVsdGlwYXJ0RGVtdXggKm11bHRpcGFydDsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIG11bHRpcGFydCA9IEdTVF9NVUxUSVBBUlRfREVNVVggKGVsZW1lbnQpOworCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICByZXR1cm4gcmV0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QTEFZSU5HX1RPX1BBVVNFRDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBtdWx0aXBhcnQtPmhlYWRlcl9jb21wbGV0ZWQgPSBGQUxTRTsKKyAgICAgIGdfZnJlZSAobXVsdGlwYXJ0LT5ib3VuZGFyeSk7CisgICAgICBtdWx0aXBhcnQtPmJvdW5kYXJ5ID0gTlVMTDsKKyAgICAgIGdfZnJlZSAobXVsdGlwYXJ0LT5taW1lX3R5cGUpOworICAgICAgbXVsdGlwYXJ0LT5taW1lX3R5cGUgPSBOVUxMOworICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKG11bHRpcGFydC0+YWRhcHRlcik7CisgICAgICBtdWx0aXBhcnQtPmNvbnRlbnRfbGVuZ3RoID0gLTE7CisgICAgICBtdWx0aXBhcnQtPnNjYW5wb3MgPSAwOworICAgICAgZ3N0X211bHRpcGFydF9kZW11eF9yZW1vdmVfc3JjX3BhZHMgKG11bHRpcGFydCk7CisgICAgICBtdWx0aXBhcnQtPmhhdmVfZ3JvdXBfaWQgPSBGQUxTRTsKKyAgICAgIG11bHRpcGFydC0+Z3JvdXBfaWQgPSBHX01BWFVJTlQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXBhcnRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE11bHRpcGFydERlbXV4ICpmaWx0ZXI7CisKKyAgZmlsdGVyID0gR1NUX01VTFRJUEFSVF9ERU1VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQk9VTkRBUlk6CisgICAgICAvKiBOb3QgcmVhbGx5IHRoYXQgdXNlZnVsIGFueW1vcmUgYXMgd2UgY2FuIHJlbGlhYmx5IGF1dG9zY2FuICovCisgICAgICBnX2ZyZWUgKGZpbHRlci0+Ym91bmRhcnkpOworICAgICAgZmlsdGVyLT5ib3VuZGFyeSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgaWYgKGZpbHRlci0+Ym91bmRhcnkgIT0gTlVMTCkgeworICAgICAgICBmaWx0ZXItPmJvdW5kYXJ5X2xlbiA9IHN0cmxlbiAoZmlsdGVyLT5ib3VuZGFyeSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0lOR0xFX1NUUkVBTToKKyAgICAgIGZpbHRlci0+c2luZ2xlU3RyZWFtID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X211bHRpcGFydF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0TXVsdGlwYXJ0RGVtdXggKmZpbHRlcjsKKworICBmaWx0ZXIgPSBHU1RfTVVMVElQQVJUX0RFTVVYIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9CT1VOREFSWToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIGZpbHRlci0+Ym91bmRhcnkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NJTkdMRV9TVFJFQU06CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmlsdGVyLT5zaW5nbGVTdHJlYW0pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisKKworZ2Jvb2xlYW4KK2dzdF9tdWx0aXBhcnRfZGVtdXhfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9tdWx0aXBhcnRfZGVtdXhfZGVidWcsCisgICAgICAibXVsdGlwYXJ0ZGVtdXgiLCAwLCAibXVsdGlwYXJ0IGRlbXV4ZXIiKTsKKworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm11bHRpcGFydGRlbXV4IiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgIEdTVF9UWVBFX01VTFRJUEFSVF9ERU1VWCk7Cit9CmRpZmYgLS1naXQgYS9nc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmggYi9nc3QvbXVsdGlwYXJ0L211bHRpcGFydGRlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4MWE4MwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9tdWx0aXBhcnQvbXVsdGlwYXJ0ZGVtdXguaApAQCAtMCwwICsxLDExMCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA0IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogZ3N0bXVsdGlwYXJ0ZGVtdXguaDogbXVsdGlwYXJ0IHN0cmVhbSBkZW11eGVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9NVUxUSVBBUlRfREVNVVhfXworI2RlZmluZSBfX0dTVF9NVUxUSVBBUlRfREVNVVhfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfTVVMVElQQVJUX0RFTVVYIChnc3RfbXVsdGlwYXJ0X2RlbXV4X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9NVUxUSVBBUlRfREVNVVgob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfTVVMVElQQVJUX0RFTVVYLCBHc3RNdWx0aXBhcnREZW11eCkpCisjZGVmaW5lIEdTVF9NVUxUSVBBUlRfREVNVVhfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX01VTFRJUEFSVF9ERU1VWCwgR3N0TXVsdGlwYXJ0RGVtdXgpKQorI2RlZmluZSBHU1RfTVVMVElQQVJUX0RFTVVYX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfTVVMVElQQVJUX0RFTVVYLCBHc3RNdWx0aXBhcnREZW11eENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX01VTFRJUEFSVF9ERU1VWChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9NVUxUSVBBUlRfREVNVVgpKQorI2RlZmluZSBHU1RfSVNfTVVMVElQQVJUX0RFTVVYX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9NVUxUSVBBUlRfREVNVVgpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0TXVsdGlwYXJ0RGVtdXggR3N0TXVsdGlwYXJ0RGVtdXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0TXVsdGlwYXJ0RGVtdXhDbGFzcyBHc3RNdWx0aXBhcnREZW11eENsYXNzOworCisjZGVmaW5lIE1VTFRJUEFSVF9ORUVEX01PUkVfREFUQSAtMQorI2RlZmluZSBNVUxUSVBBUlRfREFUQV9FUlJPUiAgICAgLTIKKyNkZWZpbmUgTVVMVElQQVJUX0RBVEFfRU9TICAgICAgIC0zCisKKy8qIGFsbCBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIG9uZSBtdWx0aXBhcnQgc3RyZWFtICovCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RQYWQgKnBhZDsgICAgICAgICAgICAgICAgICAvKiByZWZlcmVuY2UgZm9yIHRoaXMgcGFkIGlzIGhlbGQgYnkgZWxlbWVudCB3ZSBiZWxvbmcgdG8gKi8KKworICBnY2hhciAqbWltZTsKKworICBHc3RDbG9ja1RpbWUgIGxhc3RfdHM7ICAgICAgICAvKiBsYXN0IHRpbWVzdGFtcCB0byBtYWtlIHN1cmUgd2UgZG9uJ3Qgc2VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0d28gYnVmZmVycyB3aXRoIHRoZSBzYW1lIHRpbWVzdGFtcCAqLworICBHc3RGbG93UmV0dXJuIGxhc3RfcmV0OworCisgIGdib29sZWFuICAgICAgZGlzY29udDsKK30KK0dzdE11bHRpcGFydFBhZDsKKworLyoqCisgKiBHc3RNdWx0aXBhcnREZW11eDoKKyAqCisgKiBUaGUgb3BhcXVlICNHc3RNdWx0aXBhcnREZW11eCBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0TXVsdGlwYXJ0RGVtdXgKK3sKKyAgR3N0RWxlbWVudCBlbGVtZW50OworCisgIC8qIHBhZCAqLworICBHc3RQYWQgKnNpbmtwYWQ7CisKKyAgR1NMaXN0ICpzcmNwYWRzOworICBndWludCBudW1wYWRzOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisKKyAgLyogSGVhZGVyIGluZm9ybWF0aW9uIG9mIHRoZSBjdXJyZW50IGZyYW1lICovCisgIGdib29sZWFuIGhlYWRlcl9jb21wbGV0ZWQ7CisgIGdjaGFyICpib3VuZGFyeTsKKyAgZ3VpbnQgYm91bmRhcnlfbGVuOworICBnY2hhciAqbWltZV90eXBlOworICBnaW50IGNvbnRlbnRfbGVuZ3RoOworCisgIC8qIEluZGV4IGluc2lkZSB0aGUgY3VycmVudCBkYXRhIHdoZW4gbWFudWFsbHkgbG9va2luZyBmb3IgdGhlIGJvdW5kYXJ5ICovCisgIGdpbnQgc2NhbnBvczsKKworICBnYm9vbGVhbiBzaW5nbGVTdHJlYW07CisKKyAgLyogdG8gaGFuZGxlIHN0cmVhbS1zdGFydCAqLworICBnYm9vbGVhbiBoYXZlX2dyb3VwX2lkOworICBndWludCBncm91cF9pZDsKK307CisKK3N0cnVjdCBfR3N0TXVsdGlwYXJ0RGVtdXhDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworCisgIEdIYXNoVGFibGUgKmdzdG5hbWVzOworfTsKKworR1R5cGUgZ3N0X211bHRpcGFydF9kZW11eF9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9tdWx0aXBhcnRfZGVtdXhfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9NVUxUSVBBUlRfREVNVVhfXyAqLworCmRpZmYgLS1naXQgYS9nc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5jIGIvZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjI3MWZmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguYwpAQCAtMCwwICsxLDY5NSBAQAorLyogbXVsdGlwYXJ0IG11eGVyIHBsdWdpbiBmb3IgR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1tdWx0aXBhcnRtdXgKKyAqCisgKiBNdWx0aXBhcnRNdXggdXNlcyB0aGUgI0dzdENhcHMgb2YgdGhlIHNpbmsgcGFkIGFzIHRoZSBDb250ZW50LXR5cGUgZmllbGQgZm9yCisgKiBpbmNvbWluZyBidWZmZXJzIHdoZW4gbXV4aW5nIHRoZW0gdG8gYSBtdWx0aXBhcnQgc3RyZWFtLiBNb3N0IG9mIHRoZSB0aW1lIAorICogbXVsdGlwYXJ0IHN0cmVhbXMgYXJlIHNlcXVlbnRpYWwgSlBFRyBmcmFtZXMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPlNhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyAhIHZpZGVvL3gtcmF3LCBmcmFtZXJhdGU9JyhmcmFjdGlvbiknNS8xICEganBlZ2VuYyAhIG11bHRpcGFydG11eCAhIGZpbGVzaW5rIGxvY2F0aW9uPS90bXAvdGVzdC5tdWx0aXBhcnQKKyAqIF18IGEgcGlwZWxpbmUgdG8gbXV4IDUgSlBFRyBmcmFtZXMgcGVyIHNlY29uZCBpbnRvIGEgbXVsdGlwYXJ0IHN0cmVhbQorICogc3RvcmVkIHRvIGEgZmlsZS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworLyogRklYTUU6IGRyb3AvbWVyZ2UgdGFnIGV2ZW50cywgb3IgYXQgbGVhc3Qgc2VuZCB0aGVtIGRlbGF5ZWQgYWZ0ZXIgc3RyZWFtLXN0YXJ0ICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJtdWx0aXBhcnRtdXguaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X211bHRpcGFydF9tdXhfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X211bHRpcGFydF9tdXhfZGVidWcKKworI2RlZmluZSBERUZBVUxUX0JPVU5EQVJZICAgICAgICAiVGhpc1JhbmRvbVN0cmluZyIKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQk9VTkRBUlkKKyAgICAgIC8qIEZJTEwgTUUgKi8KK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJtdWx0aXBhcnQveC1taXhlZC1yZXBsYWNlIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rXyV1IiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9SRVFVRVNULAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkgICAgICAgICAvKiB3ZSBjYW4gdGFrZSBhbnl0aGluZywgcmVhbGx5ICovCisgICAgKTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgZ2NoYXIgKmtleTsKKyAgY29uc3QgZ2NoYXIgKnZhbDsKK30gTWltZVR5cGVNYXA7CisKKy8qIGNvbnZlcnQgZnJvbSBnc3Qgc3RydWN0dXJlIG5hbWVzIHRvIG1pbWUgdHlwZXMuIEFkZCBtb3JlIHdoZW4gbmVlZGVkLiAqLworc3RhdGljIGNvbnN0IE1pbWVUeXBlTWFwIG1pbWV0eXBlc1tdID0geworICB7ImF1ZGlvL3gtbXVsYXciLCAiYXVkaW8vYmFzaWMifSwKKyAge05VTEwsIE5VTEx9Cit9OworCitzdGF0aWMgdm9pZCBnc3RfbXVsdGlwYXJ0X211eF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbXVsdGlwYXJ0X211eF9oYW5kbGVfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RQYWQgKmdzdF9tdWx0aXBhcnRfbXV4X3JlcXVlc3RfbmV3X3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgY29uc3QgZ2NoYXIgKiBuYW1lLCBjb25zdCBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X211bHRpcGFydF9tdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9tdWx0aXBhcnRfbXV4X3NpbmtfZXZlbnQgKEdzdENvbGxlY3RQYWRzICogcGFkcywKKyAgICBHc3RDb2xsZWN0RGF0YSAqIHBhZCwgR3N0RXZlbnQgKiBldmVudCwgR3N0TXVsdGlwYXJ0TXV4ICogbXV4KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9tdWx0aXBhcnRfbXV4X2NvbGxlY3RlZCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLAorICAgIEdzdE11bHRpcGFydE11eCAqIG11eCk7CisKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aXBhcnRfbXV4X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aXBhcnRfbXV4X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworI2RlZmluZSBnc3RfbXVsdGlwYXJ0X211eF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RNdWx0aXBhcnRNdXgsIGdzdF9tdWx0aXBhcnRfbXV4LCBHU1RfVFlQRV9FTEVNRU5UKTsKKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXBhcnRfbXV4X2NsYXNzX2luaXQgKEdzdE11bHRpcGFydE11eENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBnaW50IGk7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIHBhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X211bHRpcGFydF9tdXhfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9tdWx0aXBhcnRfbXV4X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X211bHRpcGFydF9tdXhfc2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQk9VTkRBUlksCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiYm91bmRhcnkiLCAiQm91bmRhcnkiLCAiQm91bmRhcnkgc3RyaW5nIiwKKyAgICAgICAgICBERUZBVUxUX0JPVU5EQVJZLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5yZXF1ZXN0X25ld19wYWQgPSBnc3RfbXVsdGlwYXJ0X211eF9yZXF1ZXN0X25ld19wYWQ7CisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9tdWx0aXBhcnRfbXV4X2NoYW5nZV9zdGF0ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX2ZhY3RvcnkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJNdWx0aXBhcnQgbXV4ZXIiLAorICAgICAgIkNvZGVjL011eGVyIiwgIm11eCBtdWx0aXBhcnQgc3RyZWFtcyIsICJXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPiIpOworCisgIC8qIHBvcHVsYXRlIG1pbWUgdHlwZXMgKi8KKyAga2xhc3MtPm1pbWV0eXBlcyA9IGdfaGFzaF90YWJsZV9uZXcgKGdfc3RyX2hhc2gsIGdfc3RyX2VxdWFsKTsKKyAgZm9yIChpID0gMDsgbWltZXR5cGVzW2ldLmtleTsgaSsrKSB7CisgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoa2xhc3MtPm1pbWV0eXBlcywgKGdwb2ludGVyKSBtaW1ldHlwZXNbaV0ua2V5LAorICAgICAgICAoZ3BvaW50ZXIpIG1pbWV0eXBlc1tpXS52YWwpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGlwYXJ0X211eF9pbml0IChHc3RNdWx0aXBhcnRNdXggKiBtdWx0aXBhcnRfbXV4KQoreworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChtdWx0aXBhcnRfbXV4KTsKKworICBtdWx0aXBhcnRfbXV4LT5zcmNwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAoZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsCisgICAgICAgICAgInNyYyIpLCAic3JjIik7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChtdWx0aXBhcnRfbXV4LT5zcmNwYWQsCisgICAgICBnc3RfbXVsdGlwYXJ0X211eF9oYW5kbGVfc3JjX2V2ZW50KTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKG11bHRpcGFydF9tdXgpLCBtdWx0aXBhcnRfbXV4LT5zcmNwYWQpOworCisgIG11bHRpcGFydF9tdXgtPmJvdW5kYXJ5ID0gZ19zdHJkdXAgKERFRkFVTFRfQk9VTkRBUlkpOworCisgIG11bHRpcGFydF9tdXgtPmNvbGxlY3QgPSBnc3RfY29sbGVjdF9wYWRzX25ldyAoKTsKKyAgZ3N0X2NvbGxlY3RfcGFkc19zZXRfZXZlbnRfZnVuY3Rpb24gKG11bHRpcGFydF9tdXgtPmNvbGxlY3QsCisgICAgICAoR3N0Q29sbGVjdFBhZHNFdmVudEZ1bmN0aW9uKQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tdWx0aXBhcnRfbXV4X3NpbmtfZXZlbnQpLCBtdWx0aXBhcnRfbXV4KTsKKyAgZ3N0X2NvbGxlY3RfcGFkc19zZXRfZnVuY3Rpb24gKG11bHRpcGFydF9tdXgtPmNvbGxlY3QsCisgICAgICAoR3N0Q29sbGVjdFBhZHNGdW5jdGlvbikgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9tdWx0aXBhcnRfbXV4X2NvbGxlY3RlZCksCisgICAgICBtdWx0aXBhcnRfbXV4KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXBhcnRfbXV4X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RNdWx0aXBhcnRNdXggKm11bHRpcGFydF9tdXg7CisKKyAgbXVsdGlwYXJ0X211eCA9IEdTVF9NVUxUSVBBUlRfTVVYIChvYmplY3QpOworCisgIGdfZnJlZSAobXVsdGlwYXJ0X211eC0+Ym91bmRhcnkpOworCisgIGlmIChtdWx0aXBhcnRfbXV4LT5jb2xsZWN0KQorICAgIGdzdF9vYmplY3RfdW5yZWYgKG11bHRpcGFydF9tdXgtPmNvbGxlY3QpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdFBhZCAqCitnc3RfbXVsdGlwYXJ0X211eF9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogcmVxX25hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKQoreworICBHc3RNdWx0aXBhcnRNdXggKm11bHRpcGFydF9tdXg7CisgIEdzdFBhZCAqbmV3cGFkOworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChlbGVtZW50KTsKKyAgZ2NoYXIgKm5hbWU7CisKKyAgaWYgKHRlbXBsICE9IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLCAic2lua18ldSIpKQorICAgIGdvdG8gd3JvbmdfdGVtcGxhdGU7CisKKyAgbXVsdGlwYXJ0X211eCA9IEdTVF9NVUxUSVBBUlRfTVVYIChlbGVtZW50KTsKKworICAvKiBjcmVhdGUgbmV3IHBhZCB3aXRoIHRoZSBuYW1lICovCisgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzaW5rXyV1IiwgbXVsdGlwYXJ0X211eC0+bnVtcGFkcyk7CisgIG5ld3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKHRlbXBsLCBuYW1lKTsKKyAgZ19mcmVlIChuYW1lKTsKKworICAvKiBjb25zdHJ1Y3Qgb3VyIG93biB3cmFwcGVyIGRhdGEgc3RydWN0dXJlIGZvciB0aGUgcGFkIHRvCisgICAqIGtlZXAgdHJhY2sgb2YgaXRzIHN0YXR1cyAqLworICB7CisgICAgR3N0TXVsdGlwYXJ0UGFkRGF0YSAqbXVsdGlwYXJ0cGFkOworCisgICAgbXVsdGlwYXJ0cGFkID0gKEdzdE11bHRpcGFydFBhZERhdGEgKikKKyAgICAgICAgZ3N0X2NvbGxlY3RfcGFkc19hZGRfcGFkIChtdWx0aXBhcnRfbXV4LT5jb2xsZWN0LCBuZXdwYWQsCisgICAgICAgIHNpemVvZiAoR3N0TXVsdGlwYXJ0UGFkRGF0YSksIE5VTEwsIFRSVUUpOworCisgICAgLyogc2F2ZSBhIHBvaW50ZXIgdG8gb3VyIGRhdGEgaW4gdGhlIHBhZCAqLworICAgIG11bHRpcGFydHBhZC0+cGFkID0gbmV3cGFkOworICAgIGdzdF9wYWRfc2V0X2VsZW1lbnRfcHJpdmF0ZSAobmV3cGFkLCBtdWx0aXBhcnRwYWQpOworICAgIG11bHRpcGFydF9tdXgtPm51bXBhZHMrKzsKKyAgfQorCisgIC8qIGFkZCB0aGUgcGFkIHRvIHRoZSBlbGVtZW50ICovCisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGVsZW1lbnQsIG5ld3BhZCk7CisKKyAgcmV0dXJuIG5ld3BhZDsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX3RlbXBsYXRlOgorICB7CisgICAgZ193YXJuaW5nICgibXVsdGlwYXJ0X211eDogdGhpcyBpcyBub3Qgb3VyIHRlbXBsYXRlISIpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKKy8qIGhhbmRsZSBldmVudHMgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X211bHRpcGFydF9tdXhfaGFuZGxlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0RXZlbnRUeXBlIHR5cGU7CisKKyAgdHlwZSA9IGV2ZW50ID8gR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSA6IEdTVF9FVkVOVF9VTktOT1dOOworCisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1NFRUs6CisgICAgICAvKiBkaXNhYmxlIHNlZWtpbmcgZm9yIG5vdyAqLworICAgICAgcmV0dXJuIEZBTFNFOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqCitnc3RfbXVsdGlwYXJ0X211eF9nZXRfbWltZSAoR3N0TXVsdGlwYXJ0TXV4ICogbXV4LCBHc3RTdHJ1Y3R1cmUgKiBzKQoreworICBHc3RNdWx0aXBhcnRNdXhDbGFzcyAqa2xhc3M7CisgIGNvbnN0IGdjaGFyICptaW1lOworICBjb25zdCBnY2hhciAqbmFtZTsKKyAgZ2ludCByYXRlOworICBnaW50IGNoYW5uZWxzOworICBnaW50IGJpdHJhdGUgPSAwOworCisgIGtsYXNzID0gR1NUX01VTFRJUEFSVF9NVVhfR0VUX0NMQVNTIChtdXgpOworCisgIG5hbWUgPSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKTsKKworICAvKiB1c2UgaGFzaHRhYmxlIHRvIGNvbnZlcnQgdG8gbWltZSB0eXBlICovCisgIG1pbWUgPSBnX2hhc2hfdGFibGVfbG9va3VwIChrbGFzcy0+bWltZXR5cGVzLCBuYW1lKTsKKyAgaWYgKG1pbWUgPT0gTlVMTCkgeworICAgIGlmICghc3RyY21wIChuYW1lLCAiYXVkaW8veC1hZHBjbSIpKQorICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAiYml0cmF0ZSIsICZiaXRyYXRlKTsKKworICAgIHN3aXRjaCAoYml0cmF0ZSkgeworICAgICAgY2FzZSAxNjAwMDoKKyAgICAgICAgbWltZSA9ICJhdWRpby9HNzI2LTE2IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI0MDAwOgorICAgICAgICBtaW1lID0gImF1ZGlvL0c3MjYtMjQiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzIwMDA6CisgICAgICAgIG1pbWUgPSAiYXVkaW8vRzcyNi0zMiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0MDAwMDoKKyAgICAgICAgbWltZSA9ICJhdWRpby9HNzI2LTQwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBubyBtaW1lIHR5cGUgbWFwcGluZywgdXNlIG5hbWUgKi8KKyAgICAgICAgbWltZSA9IG5hbWU7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAvKiBSRkMyMDQ2IHJlcXVpcmVzIGF1ZGlvL2Jhc2ljIHRvIGJlIG11bGF3IDgwMDBIeiBtb25vICovCisgIGlmIChnX2FzY2lpX3N0cmNhc2VjbXAgKG1pbWUsICJhdWRpby9iYXNpYyIpID09IDApIHsKKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAicmF0ZSIsICZyYXRlKSAmJgorICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJjaGFubmVscyIsICZjaGFubmVscykpIHsKKyAgICAgIGlmIChyYXRlICE9IDgwMDAgfHwgY2hhbm5lbHMgIT0gMSkgeworICAgICAgICBtaW1lID0gbmFtZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbWltZSA9IG5hbWU7CisgICAgfQorICB9CisgIHJldHVybiBtaW1lOworfQorCisvKgorICogR2l2ZW4gdHdvIHBhZHMsIGNvbXBhcmUgdGhlIGJ1ZmZlcnMgcXVldWVkIG9uIGl0IGFuZCByZXR1cm4gMCBpZiB0aGV5IGhhdmUKKyAqIGFuIGVxdWFsIHByaW9yaXR5LCAxIGlmIHRoZSBuZXcgcGFkIGlzIGJldHRlciwgLTEgaWYgdGhlIG9sZCBwYWQgaXMgYmV0dGVyIAorICovCitzdGF0aWMgZ2ludAorZ3N0X211bHRpcGFydF9tdXhfY29tcGFyZV9wYWRzIChHc3RNdWx0aXBhcnRNdXggKiBtdWx0aXBhcnRfbXV4LAorICAgIEdzdE11bHRpcGFydFBhZERhdGEgKiBvbGQsIEdzdE11bHRpcGFydFBhZERhdGEgKiBuZXcpCit7CisgIGd1aW50NjQgb2xkdGltZSwgbmV3dGltZTsKKworICAvKiBpZiB0aGUgb2xkIHBhZCBkb2Vzbid0IGNvbnRhaW4gYW55dGhpbmcgb3IgaXMgZXZlbiBOVUxMLCByZXR1cm4gCisgICAqIHRoZSBuZXcgcGFkIGFzIGJlc3QgY2FuZGlkYXRlIGFuZCB2aWNlIHZlcnNhICovCisgIGlmIChvbGQgPT0gTlVMTCB8fCBvbGQtPmJ1ZmZlciA9PSBOVUxMKQorICAgIHJldHVybiAxOworICBpZiAobmV3ID09IE5VTEwgfHwgbmV3LT5idWZmZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChvbGQtPmR0c190aW1lc3RhbXApICYmCisgICAgICBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAobmV3LT5kdHNfdGltZXN0YW1wKSkgeworICAgIG9sZHRpbWUgPSBvbGQtPmR0c190aW1lc3RhbXA7CisgICAgbmV3dGltZSA9IG5ldy0+ZHRzX3RpbWVzdGFtcDsKKyAgfSBlbHNlIHsKKyAgICBvbGR0aW1lID0gb2xkLT5wdHNfdGltZXN0YW1wOworICAgIG5ld3RpbWUgPSBuZXctPnB0c190aW1lc3RhbXA7CisgIH0KKworICAvKiBubyB0aW1lc3RhbXAgb24gb2xkIGJ1ZmZlciwgaXQgbXVzdCBnbyBmaXJzdCAqLworICBpZiAob2xkdGltZSA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgIHJldHVybiAtMTsKKworICAvKiBubyB0aW1lc3RhbXAgb24gbmV3IGJ1ZmZlciwgaXQgbXVzdCBnbyBmaXJzdCAqLworICBpZiAobmV3dGltZSA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgIHJldHVybiAxOworCisgIC8qIG9sZCBidWZmZXIgaGFzIGhpZ2hlciB0aW1lc3RhbXAsIG5ldyBvbmUgc2hvdWxkIGdvIGZpcnN0ICovCisgIGlmIChuZXd0aW1lIDwgb2xkdGltZSkKKyAgICByZXR1cm4gMTsKKyAgLyogbmV3IGJ1ZmZlciBoYXMgaGlnaGVyIHRpbWVzdGFtcCwgb2xkIG9uZSBzaG91bGQgZ28gZmlyc3QgKi8KKyAgZWxzZSBpZiAobmV3dGltZSA+IG9sZHRpbWUpCisgICAgcmV0dXJuIC0xOworCisgIC8qIHNhbWUgcHJpb3JpdHkgaWYgYWxsIG9mIHRoZSBhYm92ZSBmYWlsZWQgKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qIG1ha2Ugc3VyZSBhIGJ1ZmZlciBpcyBxdWV1ZWQgb24gYWxsIHBhZHMsIHJldHVybnMgYSBwb2ludGVyIHRvIGFuIG11bHRpcGFydHBhZAorICogdGhhdCBob2xkcyB0aGUgYmVzdCBidWZmZXIgb3IgTlVMTCB3aGVuIG5vIHBhZCB3YXMgdXNhYmxlICovCitzdGF0aWMgR3N0TXVsdGlwYXJ0UGFkRGF0YSAqCitnc3RfbXVsdGlwYXJ0X211eF9xdWV1ZV9wYWRzIChHc3RNdWx0aXBhcnRNdXggKiBtdXgpCit7CisgIEdTTGlzdCAqd2FsayA9IE5VTEw7CisgIEdzdE11bHRpcGFydFBhZERhdGEgKmJlc3RwYWQgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfTVVMVElQQVJUX01VWCAobXV4KSwgTlVMTCk7CisKKyAgLyogdHJ5IHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgYnVmZmVyIGZyb20gZWFjaCB1c2FibGUgcGFkIGZpcnN0ICovCisgIHdhbGsgPSBtdXgtPmNvbGxlY3QtPmRhdGE7CisgIHdoaWxlICh3YWxrKSB7CisgICAgR3N0Q29sbGVjdERhdGEgKmRhdGEgPSAoR3N0Q29sbGVjdERhdGEgKikgd2Fsay0+ZGF0YTsKKyAgICBHc3RNdWx0aXBhcnRQYWREYXRhICpwYWQgPSAoR3N0TXVsdGlwYXJ0UGFkRGF0YSAqKSBkYXRhOworCisgICAgd2FsayA9IGdfc2xpc3RfbmV4dCAod2Fsayk7CisKKyAgICAvKiB0cnkgdG8gZ2V0IGEgbmV3IGJ1ZmZlciBmb3IgdGhpcyBwYWQgaWYgbmVlZGVkIGFuZCBwb3NzaWJsZSAqLworICAgIGlmIChwYWQtPmJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisKKyAgICAgIGJ1ZiA9IGdzdF9jb2xsZWN0X3BhZHNfcG9wIChtdXgtPmNvbGxlY3QsIGRhdGEpOworCisgICAgICAvKiBTdG9yZSB0aW1lc3RhbXBzIHdpdGggc2VnbWVudF9zdGFydCBhbmQgcHJlcm9sbCAqLworICAgICAgaWYgKGJ1ZiAmJiBHU1RfQlVGRkVSX1BUU19JU19WQUxJRCAoYnVmKSkgeworICAgICAgICBwYWQtPnB0c190aW1lc3RhbXAgPQorICAgICAgICAgICAgZ3N0X3NlZ21lbnRfdG9fcnVubmluZ190aW1lICgmZGF0YS0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgICAgR1NUX0JVRkZFUl9QVFMgKGJ1ZikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFkLT5wdHNfdGltZXN0YW1wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgIH0KKyAgICAgIGlmIChidWYgJiYgR1NUX0JVRkZFUl9EVFNfSVNfVkFMSUQgKGJ1ZikpIHsKKyAgICAgICAgcGFkLT5kdHNfdGltZXN0YW1wID0KKyAgICAgICAgICAgIGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJmRhdGEtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgICAgIEdTVF9CVUZGRVJfRFRTIChidWYpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhZC0+ZHRzX3RpbWVzdGFtcCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgICB9CisKKworICAgICAgcGFkLT5idWZmZXIgPSBidWY7CisgICAgfQorCisgICAgLyogd2Ugc2hvdWxkIGhhdmUgYSBidWZmZXIgbm93LCBzZWUgaWYgaXQgaXMgdGhlIGJlc3Qgc3RyZWFtIHRvCisgICAgICogcHVsbCBvbiAqLworICAgIGlmIChwYWQtPmJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICBpZiAoZ3N0X211bHRpcGFydF9tdXhfY29tcGFyZV9wYWRzIChtdXgsIGJlc3RwYWQsIHBhZCkgPiAwKSB7CisgICAgICAgIGJlc3RwYWQgPSBwYWQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGJlc3RwYWQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X211bHRpcGFydF9tdXhfc2lua19ldmVudCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLCBHc3RDb2xsZWN0RGF0YSAqIGRhdGEsCisgICAgR3N0RXZlbnQgKiBldmVudCwgR3N0TXVsdGlwYXJ0TXV4ICogbXV4KQoreworICBnYm9vbGVhbiByZXQ7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICB7CisgICAgICBtdXgtPm5lZWRfc2VnbWVudCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gZ3N0X2NvbGxlY3RfcGFkc19ldmVudF9kZWZhdWx0IChwYWRzLCBkYXRhLCBldmVudCwgRkFMU0UpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qIGJhc2ljIGlkZWE6CisgKgorICogMSkgZmluZCBhIHBhZCB0byBwdWxsIG9uLCB0aGlzIGlzIGRvbmUgYnkgcHVsbGluZyBvbiBhbGwgcGFkcyBhbmQKKyAqICAgIGxvb2tpbmcgYXQgdGhlIGJ1ZmZlcnMgdG8gZGVjaWRlIHdoaWNoIG9uZSBzaG91bGQgYmUgbXV4ZWQgZmlyc3QuCisgKiAyKSBjcmVhdGUgYSBuZXcgYnVmZmVyIGZvciB0aGUgaGVhZGVyCisgKiAzKSBwdXNoIGJvdGggYnVmZmVycyBvbiBiZXN0IHBhZCwgZ28gdG8gMQorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X211bHRpcGFydF9tdXhfY29sbGVjdGVkIChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsIEdzdE11bHRpcGFydE11eCAqIG11eCkKK3sKKyAgR3N0TXVsdGlwYXJ0UGFkRGF0YSAqYmVzdDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ2NoYXIgKmhlYWRlciA9IE5VTEw7CisgIHNpemVfdCBoZWFkZXJsZW47CisgIEdzdEJ1ZmZlciAqaGVhZGVyYnVmID0gTlVMTDsKKyAgR3N0QnVmZmVyICpmb290ZXJidWYgPSBOVUxMOworICBHc3RCdWZmZXIgKmRhdGFidWYgPSBOVUxMOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSA9IE5VTEw7CisgIEdzdENhcHMgKmNhcHM7CisgIGNvbnN0IGdjaGFyICptaW1lOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgImFsbCBwYWRzIGFyZSBjb2xsZWN0ZWQiKTsKKworICBpZiAobXV4LT5uZWVkX3N0cmVhbV9zdGFydCkgeworICAgIGdjaGFyIHNfaWRbMzJdOworCisgICAgLyogc3RyZWFtLXN0YXJ0IChGSVhNRTogY3JlYXRlIGlkIGJhc2VkIG9uIGlucHV0IGlkcykgKi8KKyAgICBnX3NucHJpbnRmIChzX2lkLCBzaXplb2YgKHNfaWQpLCAibXVsdGlwYXJ0bXV4LSUwOHgiLCBnX3JhbmRvbV9pbnQgKCkpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAobXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0IChzX2lkKSk7CisKKyAgICBtdXgtPm5lZWRfc3RyZWFtX3N0YXJ0ID0gRkFMU0U7CisgIH0KKworICAvKiBxdWV1ZSBidWZmZXJzIG9uIGFsbCBwYWRzOyBmaW5kIGEgYnVmZmVyIHdpdGggdGhlIGxvd2VzdCB0aW1lc3RhbXAgKi8KKyAgYmVzdCA9IGdzdF9tdWx0aXBhcnRfbXV4X3F1ZXVlX3BhZHMgKG11eCk7CisgIGlmICghYmVzdCkKKyAgICAvKiBFT1MgKi8KKyAgICBnb3RvIGVvczsKKyAgZWxzZSBpZiAoIWJlc3QtPmJ1ZmZlcikKKyAgICBnb3RvIGJ1ZmZlcl9lcnJvcjsKKworICAvKiBJZiBub3QgbmVnb3RpYXRlZCB5ZXQgc2V0IGNhcHMgb24gc3JjIHBhZCAqLworICBpZiAoIW11eC0+bmVnb3RpYXRlZCkgeworICAgIEdzdENhcHMgKm5ld2NhcHM7CisKKyAgICBuZXdjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoIm11bHRpcGFydC94LW1peGVkLXJlcGxhY2UiLAorICAgICAgICAiYm91bmRhcnkiLCBHX1RZUEVfU1RSSU5HLCBtdXgtPmJvdW5kYXJ5LCBOVUxMKTsKKworICAgIGlmICghZ3N0X3BhZF9zZXRfY2FwcyAobXV4LT5zcmNwYWQsIG5ld2NhcHMpKSB7CisgICAgICBnc3RfY2Fwc191bnJlZiAobmV3Y2Fwcyk7CisgICAgICBnb3RvIG5lZ29fZXJyb3I7CisgICAgfQorCisgICAgZ3N0X2NhcHNfdW5yZWYgKG5ld2NhcHMpOworICAgIG11eC0+bmVnb3RpYXRlZCA9IFRSVUU7CisgIH0KKworICAvKiBzZWUgaWYgd2UgbmVlZCB0byBwdXNoIGEgc2VnbWVudCAqLworICBpZiAobXV4LT5uZWVkX3NlZ21lbnQpIHsKKyAgICBHc3RDbG9ja1RpbWUgdGltZTsKKyAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgICBpZiAoYmVzdC0+ZHRzX3RpbWVzdGFtcCAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgICB0aW1lID0gYmVzdC0+ZHRzX3RpbWVzdGFtcDsKKyAgICB9IGVsc2UgaWYgKGJlc3QtPnB0c190aW1lc3RhbXAgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgICAgdGltZSA9IGJlc3QtPnB0c190aW1lc3RhbXA7CisgICAgfSBlbHNlIHsKKyAgICAgIHRpbWUgPSAwOworICAgIH0KKworICAgIC8qIGZvciB0aGUgc2VnbWVudCwgd2UgdGFrZSB0aGUgZmlyc3QgdGltZXN0YW1wIHdlIHNlZSwgd2UgZG9uJ3Qga25vdyB0aGUKKyAgICAgKiBsZW5ndGggYW5kIHRoZSBwb3NpdGlvbiBpcyAwICovCisgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgICAgc2VnbWVudC5zdGFydCA9IHRpbWU7CisKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKG11eC0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSk7CisKKyAgICBtdXgtPm5lZWRfc2VnbWVudCA9IEZBTFNFOworICB9CisKKyAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoYmVzdC0+cGFkKTsKKyAgaWYgKGNhcHMgPT0gTlVMTCkKKyAgICBnb3RvIG5vX2NhcHM7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGlmICghc3RydWN0dXJlKSB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIGdvdG8gbm9fY2FwczsKKyAgfQorCisgIC8qIGdldCB0aGUgbWltZSB0eXBlIGZvciB0aGUgc3RydWN0dXJlICovCisgIG1pbWUgPSBnc3RfbXVsdGlwYXJ0X211eF9nZXRfbWltZSAobXV4LCBzdHJ1Y3R1cmUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgaGVhZGVyID0gZ19zdHJkdXBfcHJpbnRmICgiLS0lc1xyXG5Db250ZW50LVR5cGU6ICVzXHJcbiIKKyAgICAgICJDb250ZW50LUxlbmd0aDogJSIgR19HU0laRV9GT1JNQVQgIlxyXG5cclxuIiwKKyAgICAgIG11eC0+Ym91bmRhcnksIG1pbWUsIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJlc3QtPmJ1ZmZlcikpOworICBoZWFkZXJsZW4gPSBzdHJsZW4gKGhlYWRlcik7CisKKyAgaGVhZGVyYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIGhlYWRlcmxlbiwgTlVMTCk7CisgIGdzdF9idWZmZXJfZmlsbCAoaGVhZGVyYnVmLCAwLCBoZWFkZXIsIGhlYWRlcmxlbik7CisgIGdfZnJlZSAoaGVhZGVyKTsKKworICAvKiB0aGUgaGVhZGVyIGhhcyB0aGUgc2FtZSB0aW1lc3RhbXBzIGFzIHRoZSBkYXRhIGJ1ZmZlciAod2hpY2ggd2Ugd2lsbCBwdXNoCisgICAqIGJlbG93KSBhbmQgaGFzIGEgZHVyYXRpb24gb2YgMCAqLworICBHU1RfQlVGRkVSX1BUUyAoaGVhZGVyYnVmKSA9IGJlc3QtPnB0c190aW1lc3RhbXA7CisgIEdTVF9CVUZGRVJfRFRTIChoZWFkZXJidWYpID0gYmVzdC0+ZHRzX3RpbWVzdGFtcDsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoaGVhZGVyYnVmKSA9IDA7CisgIEdTVF9CVUZGRVJfT0ZGU0VUIChoZWFkZXJidWYpID0gbXV4LT5vZmZzZXQ7CisgIG11eC0+b2Zmc2V0ICs9IGhlYWRlcmxlbjsKKyAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChoZWFkZXJidWYpID0gbXV4LT5vZmZzZXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAicHVzaGluZyAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIGhlYWRlciBidWZmZXIiLAorICAgICAgaGVhZGVybGVuKTsKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChtdXgtPnNyY3BhZCwgaGVhZGVyYnVmKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAvKiBwdXNoIGFsd2F5cyB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGJ1ZmZlciwgZXZlbiBhZnRlciBhbiBlcnJvciwgc28gd2UKKyAgICAgKiBkb24ndCBuZWVkIHRvIHVucmVmIGhlYWRlcmJ1ZiBoZXJlLiAqLworICAgIGdvdG8gYmVhY2g7CisKKyAgLyogdGFrZSBiZXN0LT5idWZmZXIsIHdlIGRvbid0IG5lZWQgdG8gdW5yZWYgaXQgbGF0ZXIgYXMgd2Ugd2lsbCBwdXNoIGl0CisgICAqIG5vdy4gKi8KKyAgZGF0YWJ1ZiA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoYmVzdC0+YnVmZmVyKTsKKyAgYmVzdC0+YnVmZmVyID0gTlVMTDsKKworICAvKiB3ZSBuZWVkIHRvIHVwZGF0ZWQgdGhlIHRpbWVzdGFtcHMgdG8gbWF0Y2ggdGhlIHJ1bm5pbmdfdGltZSAqLworICBHU1RfQlVGRkVSX1BUUyAoZGF0YWJ1ZikgPSBiZXN0LT5wdHNfdGltZXN0YW1wOworICBHU1RfQlVGRkVSX0RUUyAoZGF0YWJ1ZikgPSBiZXN0LT5kdHNfdGltZXN0YW1wOworICBHU1RfQlVGRkVSX09GRlNFVCAoZGF0YWJ1ZikgPSBtdXgtPm9mZnNldDsKKyAgbXV4LT5vZmZzZXQgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZGF0YWJ1Zik7CisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoZGF0YWJ1ZikgPSBtdXgtPm9mZnNldDsKKyAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoZGF0YWJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgInB1c2hpbmcgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyBkYXRhIGJ1ZmZlciIsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChkYXRhYnVmKSk7CisgIHJldCA9IGdzdF9wYWRfcHVzaCAobXV4LT5zcmNwYWQsIGRhdGFidWYpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIC8qIHB1c2ggYWx3YXlzIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgYnVmZmVyLCBldmVuIGFmdGVyIGFuIGVycm9yLCBzbyB3ZQorICAgICAqIGRvbid0IG5lZWQgdG8gdW5yZWYgaGVhZGVyYnVmIGhlcmUuICovCisgICAgZ290byBiZWFjaDsKKworICBmb290ZXJidWYgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgMiwgTlVMTCk7CisgIGdzdF9idWZmZXJfZmlsbCAoZm9vdGVyYnVmLCAwLCAiXHJcbiIsIDIpOworCisgIC8qIHRoZSBmb290ZXIgaGFzIHRoZSBzYW1lIHRpbWVzdGFtcHMgYXMgdGhlIGRhdGEgYnVmZmVyIGFuZCBoYXMgYQorICAgKiBkdXJhdGlvbiBvZiAwICovCisgIEdTVF9CVUZGRVJfUFRTIChmb290ZXJidWYpID0gYmVzdC0+cHRzX3RpbWVzdGFtcDsKKyAgR1NUX0JVRkZFUl9EVFMgKGZvb3RlcmJ1ZikgPSBiZXN0LT5kdHNfdGltZXN0YW1wOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChmb290ZXJidWYpID0gMDsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGZvb3RlcmJ1ZikgPSBtdXgtPm9mZnNldDsKKyAgbXV4LT5vZmZzZXQgKz0gMjsKKyAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChmb290ZXJidWYpID0gbXV4LT5vZmZzZXQ7CisgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGZvb3RlcmJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG11eCwgInB1c2hpbmcgMiBieXRlcyBmb290ZXIgYnVmZmVyIik7CisgIHJldCA9IGdzdF9wYWRfcHVzaCAobXV4LT5zcmNwYWQsIGZvb3RlcmJ1Zik7CisKK2JlYWNoOgorICBpZiAoYmVzdCAmJiBiZXN0LT5idWZmZXIpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChiZXN0LT5idWZmZXIpOworICAgIGJlc3QtPmJ1ZmZlciA9IE5VTEw7CisgIH0KKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK2J1ZmZlcl9lcnJvcjoKKyAgeworICAgIC8qIFRoZXJlIGlzIGEgYmVzdCBidXQgbm8gYnVmZmVyLCB0aGlzIGlzIG5vdCBxdWl0ZSByaWdodC4uICovCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG11eCwgU1RSRUFNLCBGQUlMRUQsIChOVUxMKSwgKCJpbnRlcm5hbCBtdXhpbmcgZXJyb3IiKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBiZWFjaDsKKyAgfQorZW9zOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAobXV4LCAiUHVzaGluZyBFT1MiKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKG11eC0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgIGdvdG8gYmVhY2g7CisgIH0KK25lZ29fZXJyb3I6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG11eCwgImZhaWxlZCB0byBzZXQgY2FwcyIpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtdXgsIENPUkUsIE5FR09USUFUSU9OLCAoTlVMTCksIChOVUxMKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgICAgZ290byBiZWFjaDsKKyAgfQorbm9fY2FwczoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAibm8gY2FwcyBvbiB0aGUgaW5jb21pbmcgYnVmZmVyICVwIiwgYmVzdC0+YnVmZmVyKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAobXV4LCBDT1JFLCBORUdPVElBVElPTiwgKE5VTEwpLCAoTlVMTCkpOworICAgIHJldCA9IEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICAgIGdvdG8gYmVhY2g7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXBhcnRfbXV4X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RNdWx0aXBhcnRNdXggKm11eDsKKworICBtdXggPSBHU1RfTVVMVElQQVJUX01VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQk9VTkRBUlk6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBtdXgtPmJvdW5kYXJ5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXBhcnRfbXV4X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RNdWx0aXBhcnRNdXggKm11eDsKKworICBtdXggPSBHU1RfTVVMVElQQVJUX01VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQk9VTkRBUlk6CisgICAgICBnX2ZyZWUgKG11eC0+Ym91bmRhcnkpOworICAgICAgbXV4LT5ib3VuZGFyeSA9IGdfc3RyZHVwIChnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X211bHRpcGFydF9tdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0TXVsdGlwYXJ0TXV4ICptdWx0aXBhcnRfbXV4OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgbXVsdGlwYXJ0X211eCA9IEdTVF9NVUxUSVBBUlRfTVVYIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgbXVsdGlwYXJ0X211eC0+b2Zmc2V0ID0gMDsKKyAgICAgIG11bHRpcGFydF9tdXgtPm5lZ290aWF0ZWQgPSBGQUxTRTsKKyAgICAgIG11bHRpcGFydF9tdXgtPm5lZWRfc2VnbWVudCA9IFRSVUU7CisgICAgICBtdWx0aXBhcnRfbXV4LT5uZWVkX3N0cmVhbV9zdGFydCA9IFRSVUU7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChtdWx0aXBhcnRfbXV4LCAic3RhcnRpbmcgY29sbGVjdCBwYWRzIik7CisgICAgICBnc3RfY29sbGVjdF9wYWRzX3N0YXJ0IChtdWx0aXBhcnRfbXV4LT5jb2xsZWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChtdWx0aXBhcnRfbXV4LCAic3RvcHBpbmcgY29sbGVjdCBwYWRzIik7CisgICAgICBnc3RfY29sbGVjdF9wYWRzX3N0b3AgKG11bHRpcGFydF9tdXgtPmNvbGxlY3QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKQorICAgIHJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9tdWx0aXBhcnRfbXV4X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfbXVsdGlwYXJ0X211eF9kZWJ1ZywgIm11bHRpcGFydG11eCIsIDAsCisgICAgICAibXVsdGlwYXJ0IG11eGVyIik7CisKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJtdWx0aXBhcnRtdXgiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfTVVMVElQQVJUX01VWCk7Cit9CmRpZmYgLS1naXQgYS9nc3QvbXVsdGlwYXJ0L211bHRpcGFydG11eC5oIGIvZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjQ0ZjVhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L211bHRpcGFydC9tdWx0aXBhcnRtdXguaApAQCAtMCwwICsxLDk4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNCBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIGdzdG11bHRpcGFydG11eC5oOiBtdWx0aXBhcnQgc3RyZWFtIG11eGVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9NVUxUSVBBUlRfTVVYX18KKyNkZWZpbmUgX19HU1RfTVVMVElQQVJUX01VWF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Y29sbGVjdHBhZHMuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfTVVMVElQQVJUX01VWCAoZ3N0X211bHRpcGFydF9tdXhfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX01VTFRJUEFSVF9NVVgob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfTVVMVElQQVJUX01VWCwgR3N0TXVsdGlwYXJ0TXV4KSkKKyNkZWZpbmUgR1NUX01VTFRJUEFSVF9NVVhfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX01VTFRJUEFSVF9NVVgsIEdzdE11bHRpcGFydE11eCkpCisjZGVmaW5lIEdTVF9NVUxUSVBBUlRfTVVYX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfTVVMVElQQVJUX01VWCwgR3N0TXVsdGlwYXJ0TXV4Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfTVVMVElQQVJUX01VWChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9NVUxUSVBBUlRfTVVYKSkKKyNkZWZpbmUgR1NUX0lTX01VTFRJUEFSVF9NVVhfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX01VTFRJUEFSVF9NVVgpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0TXVsdGlwYXJ0TXV4IEdzdE11bHRpcGFydE11eDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RNdWx0aXBhcnRNdXhDbGFzcyBHc3RNdWx0aXBhcnRNdXhDbGFzczsKKworLyogYWxsIGluZm9ybWF0aW9uIG5lZWRlZCBmb3Igb25lIG11bHRpcGFydCBzdHJlYW0gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdENvbGxlY3REYXRhIGNvbGxlY3Q7ICAgICAgIC8qIHdlIGV4dGVuZCB0aGUgQ29sbGVjdERhdGEgKi8KKworICBHc3RCdWZmZXIgKmJ1ZmZlcjsgICAgICAgICAgICAvKiB0aGUgcXVldWVkIGJ1ZmZlciBmb3IgdGhpcyBwYWQgKi8KKyAgR3N0Q2xvY2tUaW1lIHB0c190aW1lc3RhbXA7ICAgLyogaXRzIHB0cyB0aW1lc3RhbXAsIGNvbnZlcnRlZCB0byBydW5uaW5nX3RpbWUgc28gdGhhdCB3ZSBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdGx5IHNvcnQgb3ZlciBtdWx0aXBsZSBzZWdtZW50cy4gKi8KKyAgR3N0Q2xvY2tUaW1lIGR0c190aW1lc3RhbXA7ICAgLyogaXRzIGR0cyB0aW1lc3RhbXAsIGNvbnZlcnRlZCB0byBydW5uaW5nX3RpbWUgc28gdGhhdCB3ZSBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdGx5IHNvcnQgb3ZlciBtdWx0aXBsZSBzZWdtZW50cy4gKi8KKyAgR3N0UGFkICpwYWQ7Cit9CitHc3RNdWx0aXBhcnRQYWREYXRhOworCisvKioKKyAqIEdzdE11bHRpcGFydE11eDoKKyAqCisgKiBUaGUgb3BhcXVlICNHc3RNdWx0aXBhcnRNdXggc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdE11bHRpcGFydE11eAoreworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgLyogcGFkICovCisgIEdzdFBhZCAqc3JjcGFkOworCisgIC8qIHNpbmtwYWRzICovCisgIEdzdENvbGxlY3RQYWRzICpjb2xsZWN0OworCisgIGdpbnQgbnVtcGFkczsKKworICAvKiBvZmZzZXQgaW4gc3RyZWFtICovCisgIGd1aW50NjQgb2Zmc2V0OworCisgIC8qIGJvdW5kYXJ5IHN0cmluZyAqLworICBnY2hhciAqYm91bmRhcnk7CisKKyAgZ2Jvb2xlYW4gbmVnb3RpYXRlZDsKKyAgZ2Jvb2xlYW4gbmVlZF9zZWdtZW50OworICBnYm9vbGVhbiBuZWVkX3N0cmVhbV9zdGFydDsKK307CisKK3N0cnVjdCBfR3N0TXVsdGlwYXJ0TXV4Q2xhc3MKK3sKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudF9jbGFzczsKKworICBHSGFzaFRhYmxlICptaW1ldHlwZXM7Cit9OworCitHVHlwZSBnc3RfbXVsdGlwYXJ0X211eF9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9tdWx0aXBhcnRfbXV4X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfTVVMVElQQVJUX01VWF9fICovCisKZGlmZiAtLWdpdCBhL2dzdC9yZXBsYXlnYWluL01ha2VmaWxlLmFtIGIvZ3N0L3JlcGxheWdhaW4vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlMjQwNgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9yZXBsYXlnYWluL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjIgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdHJlcGxheWdhaW4ubGEKKworbGliZ3N0cmVwbGF5Z2Fpbl9sYV9TT1VSQ0VTID0gXAorCWdzdHJnYW5hbHlzaXMuYyAgICAgICBcCisJZ3N0cmdsaW1pdGVyLmMgICAgICAgIFwKKwlnc3RyZ3ZvbHVtZS5jICAgICAgICAgXAorCXJlcGxheWdhaW4uYyAgICAgICAgICBcCisJcmdhbmFseXNpcy5jCitsaWJnc3RyZXBsYXlnYWluX2xhX0NGTEFHUyAgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykKK2xpYmdzdHJlcGxheWdhaW5fbGFfTElCQUREICA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RwYnV0aWxzLSQoR1NUX0FQSV9WRVJTSU9OKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKVwKKwkkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoTElCTSkKK2xpYmdzdHJlcGxheWdhaW5fbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCisjIGhlYWRlcnMgd2UgbmVlZCBidXQgZG9uJ3Qgd2FudCBpbnN0YWxsZWQKK25vaW5zdF9IRUFERVJTID0gICAgICAgICBcCisJZ3N0cmdhbmFseXNpcy5oICBcCisJZ3N0cmdsaW1pdGVyLmggICBcCisJZ3N0cmd2b2x1bWUuaCAgICBcCisJcmVwbGF5Z2Fpbi5oICAgICBcCisJcmdhbmFseXNpcy5oCmRpZmYgLS1naXQgYS9nc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmMgYi9nc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0OTAxZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9yZXBsYXlnYWluL2dzdHJnYW5hbHlzaXMuYwpAQCAtMCwwICsxLDcwOSBAQAorLyogR1N0cmVhbWVyIFJlcGxheUdhaW4gYW5hbHlzaXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVuZSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorICogCisgKiBnc3RyZ2FuYWx5c2lzLmM6IEVsZW1lbnQgdGhhdCBwZXJmb3JtcyB0aGUgUmVwbGF5R2FpbiBhbmFseXNpcworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJnYW5hbHlzaXMKKyAqIEBzZWVfYWxzbzogI0dzdFJnVm9sdW1lCisgKgorICogVGhpcyBlbGVtZW50IGFuYWx5emVzIHJhdyBhdWRpbyBzYW1wbGUgZGF0YSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHByb3Bvc2VkCisgKiA8dWxpbmsgdXJsPSJodHRwOi8vcmVwbGF5Z2Fpbi5vcmciPlJlcGxheUdhaW4gc3RhbmRhcmQ8L3VsaW5rPiBmb3IKKyAqIGNhbGN1bGF0aW5nIHRoZSBpZGVhbCByZXBsYXkgZ2FpbiBmb3IgbXVzaWMgdHJhY2tzIGFuZCBhbGJ1bXMuICBUaGUgZWxlbWVudAorICogaXMgZGVzaWduZWQgYXMgYSBwYXNzLXRocm91Z2ggZmlsdGVyIHRoYXQgbmV2ZXIgbW9kaWZpZXMgYW55IGRhdGEuICBBcyBpdAorICogcmVjZWl2ZXMgYW4gRU9TIGV2ZW50LCBpdCBmaW5hbGl6ZXMgdGhlIG9uZ29pbmcgYW5hbHlzaXMgYW5kIGdlbmVyYXRlcyBhIHRhZworICogbGlzdCBjb250YWluaW5nIHRoZSByZXN1bHRzLiAgSXQgaXMgc2VudCBkb3duc3RyZWFtIHdpdGggYSB0YWcgZXZlbnQgYW5kCisgKiBwb3N0ZWQgb24gdGhlIG1lc3NhZ2UgYnVzIHdpdGggYSB0YWcgbWVzc2FnZS4gIFRoZSBFT1MgZXZlbnQgaXMgZm9yd2FyZGVkIGFzCisgKiBub3JtYWwgYWZ0ZXJ3YXJkcy4gIFJlc3VsdCB0YWcgbGlzdHMgYXQgbGVhc3QgY29udGFpbiB0aGUgdGFncworICogI0dTVF9UQUdfVFJBQ0tfR0FJTiwgI0dTVF9UQUdfVFJBQ0tfUEVBSyBhbmQgI0dTVF9UQUdfUkVGRVJFTkNFX0xFVkVMLgorICogCisgKiBCZWNhdXNlIHRoZSBnZW5lcmF0ZWQgbWV0YWRhdGEgdGFncyBiZWNvbWUgYXZhaWxhYmxlIGF0IHRoZSBlbmQgb2Ygc3RyZWFtcywKKyAqIGRvd25zdHJlYW0gbXV4ZXIgYW5kIGVuY29kZXIgZWxlbWVudHMgYXJlIG5vcm1hbGx5IHVuYWJsZSB0byBzYXZlIHRoZW0gaW4KKyAqIHRoZWlyIG91dHB1dCBzaW5jZSB0aGV5IGdlbmVyYWxseSBzYXZlIG1ldGFkYXRhIGluIHRoZSBmaWxlIGhlYWRlci4KKyAqIFRoZXJlZm9yZSwgaXQgaXMgb2Z0ZW4gbmVjZXNzYXJ5IHRoYXQgYXBwbGljYXRpb25zIHJlYWQgdGhlIHJlc3VsdHMgaW4gYSBidXMKKyAqIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSB0YWcgbWVzc2FnZS4gIE9idGFpbmluZyB0aGUgdmFsdWVzIHRoaXMgd2F5IGlzIGFsd2F5cworICogbmVlZGVkIGZvciBhbGJ1bSBwcm9jZXNzaW5nIChzZWUgI0dzdFJnQW5hbHlzaXM6bnVtLXRyYWNrcyBwcm9wZXJ0eSkgc2luY2UKKyAqIHRoZSBhbGJ1bSBnYWluIGFuZCBwZWFrIHZhbHVlcyBuZWVkIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhbGwgdHJhY2tzIG9mIGFuCisgKiBhbGJ1bSwgbm90IGp1c3QgdGhlIGxhc3Qgb25lLgorICogCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC10IGF1ZGlvdGVzdHNyYyB3YXZlPXNpbmUgbnVtLWJ1ZmZlcnM9NTEyICEgcmdhbmFseXNpcyAhIGZha2VzaW5rCisgKiBdfCBBbmFseXplIGEgc2ltcGxlIHRlc3Qgd2F2ZWZvcm0KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdCBmaWxlc3JjIGxvY2F0aW9uPWZpbGVuYW1lLmV4dCAhIGRlY29kZWJpbiBcCisgKiAgICAgISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgcmdhbmFseXNpcyAhIGZha2VzaW5rCisgKiBdfCBBbmFseXplIGEgZ2l2ZW4gZmlsZQorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC10IGdub21ldmZzc3JjIGxvY2F0aW9uPWh0dHA6Ly9yZXBsYXlnYWluLmh5ZHJvZ2VuYXVkaW8ub3JnL3JlZl9waW5rLndhdiBcCisgKiAgICAgISB3YXZwYXJzZSAhIHJnYW5hbHlzaXMgISBmYWtlc2luaworICogXXwgQW5hbHl6ZSB0aGUgcGluayBub2lzZSByZWZlcmVuY2UgZmlsZQorICogPHBhcmE+CisgKiBUaGUgYWJvdmUgbGF1bmNoIGxpbmUgeWllbGRzIGEgcmVzdWx0IGdhaW4gb2YgKzYgZEIgKGluc3RlYWQgb2YgdGhlIGV4cGVjdGVkCisgKiArMCBkQikuICBUaGlzIGlzIG5vdCBpbiBlcnJvciwgcmVmZXIgdG8gdGhlICNHc3RSZ0FuYWx5c2lzOnJlZmVyZW5jZS1sZXZlbAorICogcHJvcGVydHkgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqIDwvcGFyYT4KKyAqIDwvcmVmc2VjdDI+CisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+QWNrbm93bGVkZ2VtZW50czwvdGl0bGU+CisgKiA8cGFyYT4KKyAqIFRoaXMgZWxlbWVudCBpcyBiYXNlZCBvbiBjb2RlIHVzZWQgaW4gdGhlIDx1bGluaworICogdXJsPSJodHRwOi8vc2plbmcub3JnL3ZvcmJpc2dhaW4uaHRtbCI+dm9yYmlzZ2FpbjwvdWxpbms+IHByb2dyYW0gYW5kIG1hbnkKKyAqIG90aGVycy4gIFRoZSByZWxldmFudCBwYXJ0cyBhcmUgY29weXJpZ2h0ZWQgYnkgRGF2aWQgUm9iaW5zb24sIEdsZW4gU2F3eWVyCisgKiBhbmQgRnJhbmsgS2xlbW0uCisgKiA8L3BhcmE+CisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RyZ2FuYWx5c2lzLmgiCisjaW5jbHVkZSAicmVwbGF5Z2Fpbi5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfcmdfYW5hbHlzaXNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3JnX2FuYWx5c2lzX2RlYnVnCisKKy8qIERlZmF1bHQgcHJvcGVydHkgdmFsdWUuICovCisjZGVmaW5lIEZPUkNFRF9ERUZBVUxUIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9NRVNTQUdFIEZBTFNFCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX05VTV9UUkFDS1MsCisgIFBST1BfRk9SQ0VELAorICBQUk9QX1JFRkVSRU5DRV9MRVZFTCwKKyAgUFJPUF9NRVNTQUdFCit9OworCisvKiBUaGUgUmVwbGF5R2FpbiBhbGdvcml0aG0gaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIG1vbm8gYW5kIHN0ZXJlbworICogYXVkaW8uICBUaGUgdXNlZCBpbXBsZW1lbnRhdGlvbiBoYXMgZmlsdGVyIGNvZWZmaWNpZW50cyBmb3IgdGhlCisgKiAidXN1YWwiIHNhbXBsZSByYXRlcyBpbiB0aGUgODAwMCB0byA0ODAwMCBIeiByYW5nZS4gKi8KKyNkZWZpbmUgUkVQTEFZX0dBSU5fQ0FQUyAiYXVkaW8veC1yYXcsIiBcCisgICJmb3JtYXQgPSAoc3RyaW5nKSB7ICJHU1RfQVVESU9fTkUoRjMyKSIsIkdTVF9BVURJT19ORShTMTYpIiB9LCAiICAgICBcCisgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJjaGFubmVscyA9IChpbnQpIDEsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJyYXRlID0gKGludCkgeyA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCAiICAgICBcCisgICI0NDEwMCwgNDgwMDAgfTsgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhdWRpby94LXJhdywiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJmb3JtYXQgPSAoc3RyaW5nKSB7ICJHU1RfQVVESU9fTkUoRjMyKSIsIkdTVF9BVURJT19ORShTMTYpIiB9LCAiICAgICBcCisgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJjaGFubmVscyA9IChpbnQpIDIsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJjaGFubmVsLW1hc2sgPSAoYml0bWFzaykgMHgzLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJyYXRlID0gKGludCkgeyA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCAiICAgICBcCisgICI0NDEwMCwgNDgwMDAgfSIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoUkVQTEFZX0dBSU5fQ0FQUykpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChSRVBMQVlfR0FJTl9DQVBTKSk7CisKKyNkZWZpbmUgZ3N0X3JnX2FuYWx5c2lzX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJnQW5hbHlzaXMsIGdzdF9yZ19hbmFseXNpcywgR1NUX1RZUEVfQkFTRV9UUkFOU0ZPUk0pOworCitzdGF0aWMgdm9pZCBnc3RfcmdfYW5hbHlzaXNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3JnX2FuYWx5c2lzX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9yZ19hbmFseXNpc19zdGFydCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UpOworc3RhdGljIGdib29sZWFuIGdzdF9yZ19hbmFseXNpc19zZXRfY2FwcyAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UsCisgICAgR3N0Q2FwcyAqIGluY2FwcywgR3N0Q2FwcyAqIG91dGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3JnX2FuYWx5c2lzX3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UsCisgICAgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcmdfYW5hbHlzaXNfc2lua19ldmVudCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3JnX2FuYWx5c2lzX3N0b3AgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlKTsKKworc3RhdGljIHZvaWQgZ3N0X3JnX2FuYWx5c2lzX2hhbmRsZV90YWdzIChHc3RSZ0FuYWx5c2lzICogZmlsdGVyLAorICAgIGNvbnN0IEdzdFRhZ0xpc3QgKiB0YWdfbGlzdCk7CitzdGF0aWMgdm9pZCBnc3RfcmdfYW5hbHlzaXNfaGFuZGxlX2VvcyAoR3N0UmdBbmFseXNpcyAqIGZpbHRlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3JnX2FuYWx5c2lzX3RyYWNrX3Jlc3VsdCAoR3N0UmdBbmFseXNpcyAqIGZpbHRlciwKKyAgICBHc3RUYWdMaXN0ICoqIHRhZ19saXN0KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcmdfYW5hbHlzaXNfYWxidW1fcmVzdWx0IChHc3RSZ0FuYWx5c2lzICogZmlsdGVyLAorICAgIEdzdFRhZ0xpc3QgKiogdGFnX2xpc3QpOworCitzdGF0aWMgdm9pZAorZ3N0X3JnX2FuYWx5c2lzX2NsYXNzX2luaXQgKEdzdFJnQW5hbHlzaXNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzICp0cmFuc19jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3JnX2FuYWx5c2lzX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3JnX2FuYWx5c2lzX2dldF9wcm9wZXJ0eTsKKworICAvKioKKyAgICogR3N0UmdBbmFseXNpczpudW0tdHJhY2tzOgorICAgKgorICAgKiBOdW1iZXIgb2YgcmVtYWluaW5nIGFsYnVtIHRyYWNrcy4KKyAgICogCisgICAqIEFuYWx5emluZyBzZXZlcmFsIHN0cmVhbXMgc2VxdWVudGlhbGx5IGFuZCBhc3NpZ25pbmcgdGhlbSBhIGNvbW1vbiByZXN1bHQKKyAgICogZ2FpbiBpcyBrbm93biBhcyAiYWxidW0gcHJvY2Vzc2luZyIuICBJZiB0aGlzIGdhaW4gaXMgdXNlZCBkdXJpbmcgcGxheWJhY2sKKyAgICogKGJ5IHN3aXRjaGluZyB0byAiYWxidW0gbW9kZSIpLCBhbGwgdHJhY2tzIG9mIGFuIGFsYnVtIHJlY2VpdmUgdGhlIHNhbWUKKyAgICogYW1wbGlmaWNhdGlvbi4gIFRoaXMga2VlcHMgdGhlIHJlbGF0aXZlIHZvbHVtZSBsZXZlbHMgYmV0d2VlbiB0aGUgdHJhY2tzCisgICAqIGludGFjdC4gIFRvIGVuYWJsZSB0aGlzLCBzZXQgdGhpcyBwcm9wZXJ0eSB0byB0aGUgbnVtYmVyIG9mIHN0cmVhbXMgdGhhdAorICAgKiB3aWxsIGJlIHByb2Nlc3NlZCBhcyBhbGJ1bSB0cmFja3MuCisgICAqCisgICAqIEV2ZXJ5IHRpbWUgYW4gRU9TIGV2ZW50IGlzIHJlY2VpdmVkLCB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpcworICAgKiBkZWNyZW1lbnRlZCBieSBvbmUuICBBcyBpdCByZWFjaGVzIHplcm8sIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgbGFzdCB0cmFjaworICAgKiBvZiB0aGUgYWxidW0gZmluaXNoZWQuICBUaGUgdGFnIGxpc3QgZm9yIHRoZSBmaW5hbCBzdHJlYW0gd2lsbCBjb250YWluIHRoZQorICAgKiBhZGRpdGlvbmFsIHRhZ3MgI0dTVF9UQUdfQUxCVU1fR0FJTiBhbmQgI0dTVF9UQUdfQUxCVU1fUEVBSy4gIEFsbCBvdGhlcgorICAgKiBzdHJlYW1zIGp1c3QgZ2V0IHRoZSB0d28gdHJhY2sgdGFncyBwb3N0ZWQgYmVjYXVzZSB0aGUgdmFsdWVzIGZvciB0aGUgYWxidW0KKyAgICogdGFncyBhcmUgbm90IGtub3duIGJlZm9yZSBhbGwgdHJhY2tzIGFyZSBhbmFseXplZC4gIEFwcGxpY2F0aW9ucyBuZWVkIHRvCisgICAqIGVuc3VyZSB0aGF0IHRoZSBhbGJ1bSBnYWluIGFuZCBwZWFrIHZhbHVlcyBhcmUgYWxzbyBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAqIG90aGVyIHRyYWNrcyB3aGVuIHN0b3JpbmcgdGhlIHJlc3VsdHMuCisgICAqCisgICAqIElmIHRoZSB0b3RhbCBudW1iZXIgb2YgYWxidW0gdHJhY2tzIGlzIHVua25vd24gYmVmb3JlaGFuZCwganVzdCBlbnN1cmUgdGhhdAorICAgKiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDEgYmVmb3JlIGVhY2ggdHJhY2sgc3RhcnRzLiAgVGhlbiBiZWZvcmUgdGhlIGVuZAorICAgKiBvZiB0aGUgbGFzdCB0cmFjaywgc2V0IGl0IHRvIHRoZSB2YWx1ZSAxLgorICAgKgorICAgKiBUbyBwZXJmb3JtIGFsYnVtIHByb2Nlc3NpbmcsIHRoZSBlbGVtZW50IGhhcyB0byBwcmVzZXJ2ZSBkYXRhIGJldHdlZW4KKyAgICogc3RyZWFtcy4gIFRoaXMgY2Fubm90IHN1cnZpdmUgYSBzdGF0ZSBjaGFuZ2UgdG8gdGhlIE5VTEwgb3IgUkVBRFkgc3RhdGUuCisgICAqIElmIHlvdSBjaGFuZ2UgeW91ciBwaXBlbGluZSdzIHN0YXRlIHRvIE5VTEwgb3IgUkVBRFkgYmV0d2VlbiB0cmFja3MsIGxvY2sKKyAgICogdGhlIGVsZW1lbnQncyBzdGF0ZSB1c2luZyBnc3RfZWxlbWVudF9zZXRfbG9ja2VkX3N0YXRlKCkgd2hlbiBpdCBpcyBpbgorICAgKiBQQVVTRUQgb3IgUExBWUlORy4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTlVNX1RSQUNLUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJudW0tdHJhY2tzIiwgIk51bWJlciBvZiBhbGJ1bSB0cmFja3MiLAorICAgICAgICAgICJOdW1iZXIgb2YgcmVtYWluaW5nIGFsYnVtIHRyYWNrcyIsIDAsIEdfTUFYSU5ULCAwLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0UmdBbmFseXNpczpmb3JjZWQ6CisgICAqCisgICAqIFdoZXRoZXIgdG8gYW5hbHl6ZSBzdHJlYW1zIGV2ZW4gd2hlbiBSZXBsYXlHYWluIHRhZ3MgZXhpc3QuCisgICAqCisgICAqIEZvciBhc3Npc3RpbmcgdHJhbnNjb2Rlci9jb252ZXJ0ZXIgYXBwbGljYXRpb25zLCB0aGUgZWxlbWVudCBjYW4gc2lsZW50bHkKKyAgICogc2tpcCB0aGUgcHJvY2Vzc2luZyBvZiBzdHJlYW1zIHRoYXQgYWxyZWFkeSBjb250YWluIHRoZSBuZWNlc3NhcnkgdGFncy4KKyAgICogRGF0YSB3aWxsIGZsb3cgYXMgdXN1YWwgYnV0IHRoZSBlbGVtZW50IHdpbGwgbm90IGNvbnN1bWUgQ1BVIHRpbWUgYW5kIHdpbGwKKyAgICogbm90IGdlbmVyYXRlIHJlc3VsdCB0YWdzLiAgVG8gZW5hYmxlIHBvc3NpYmxlIHNraXBwaW5nLCBzZXQgdGhpcyBwcm9wZXJ0eQorICAgKiB0byAlRkFMU0UuCisgICAqCisgICAqIElmIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCA8bGluayBsaW5rZW5kPSJHc3RSZ0FuYWx5c2lzLS1udW0tdHJhY2tzIj5hbGJ1bQorICAgKiBwcm9jZXNzaW5nPC9saW5rPiwgdGhlIGVsZW1lbnQgd2lsbCBza2lwIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGFsYnVtCisgICAqIHRyYWNrcyBpZiBhIGZ1bGwgc2V0IG9mIHRhZ3MgaXMgZm91bmQgZm9yIHRoZSBmaXJzdCB0cmFjay4gIElmIGEgc3Vic2VxdWVudAorICAgKiB0cmFjayBvZiB0aGUgYWxidW0gaXMgbWlzc2luZyB0YWdzLCBwcm9jZXNzaW5nIGNhbm5vdCBzdGFydCBhZ2Fpbi4gIElmIHRoaXMKKyAgICogaXMgdW5kZXNpcmVkLCB0aGUgYXBwbGljYXRpb24gaGFzIHRvIHNjYW4gYWxsIGZpbGVzIGJlZm9yZWhhbmQgYW5kIGVuYWJsZQorICAgKiBmb3JjaW5nIG9mIHByb2Nlc3NpbmcgaWYgbmVlZGVkLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9GT1JDRUQsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImZvcmNlZCIsICJGb3JjZWQiLAorICAgICAgICAgICJBbmFseXplIGV2ZW4gaWYgUmVwbGF5R2FpbiB0YWdzIGV4aXN0IiwKKyAgICAgICAgICBGT1JDRURfREVGQVVMVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RSZ0FuYWx5c2lzOnJlZmVyZW5jZS1sZXZlbDoKKyAgICoKKyAgICogUmVmZXJlbmNlIGxldmVsIFtkQl0uCisgICAqCisgICAqIEFuYWx5emluZyB0aGUgUmVwbGF5R2FpbiBwaW5rIG5vaXNlIHJlZmVyZW5jZSB3YXZlZm9ybSBjb21wdXRlcyBhIHJlc3VsdCBvZgorICAgKiArNiBkQiBpbnN0ZWFkIG9mIHRoZSBleHBlY3RlZCAwIGRCLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBkZWZhdWx0IHJlZmVyZW5jZQorICAgKiBsZXZlbCBpcyA4OSBkQi4gIFRvIG9idGFpbiB2YWx1ZXMgYXMgbGluZWQgb3V0IGluIHRoZSBvcmlnaW5hbCBwcm9wb3NhbCBvZgorICAgKiBSZXBsYXlHYWluLCBzZXQgdGhpcyBwcm9wZXJ0eSB0byA4My4KKyAgICoKKyAgICogQWxtb3N0IGFsbCBzb2Z0d2FyZSB1c2VzIDg5IGRCIGFzIGEgcmVmZXJlbmNlIGhvd2V2ZXIsIGFuZCB0aGlzIHZhbHVlIGhhcworICAgKiBiZWNvbWUgdGhlIG5ldyBvZmZpY2lhbCB2YWx1ZS4gIFRoYXQgaXMgdG8gc2F5LCB3aGlsZSB0aGUgY2hhbmdlIGhhcyBiZWVuCisgICAqIGFjY2xhaW1lZCBieSB0aGUgYXV0aG9yIG9mIHRoZSBSZXBsYXlHYWluIHByb3Bvc2FsLCB0aGUgPHVsaW5rCisgICAqIHVybD0iaHR0cDovL3JlcGxheWdhaW4ub3JnIj53ZWJwYWdlPC91bGluaz4gaXMgc3RpbGwgb3V0ZGF0ZWQgYXQgdGhlIHRpbWUKKyAgICogb2YgdGhpcyB3cml0aW5nLgorICAgKgorICAgKiBUaGUgdmFsdWUgd2FzIGNoYW5nZWQgYmVjYXVzZSB0aGUgb3JpZ2luYWwgcHJvcG9zYWwgcmVjb21tZW5kcyBhIGRlZmF1bHQKKyAgICogcHJlLWFtcCB2YWx1ZSBvZiArNiBkQiBmb3IgcGxheWJhY2suICBUaGlzIHNlZW1lZCBhIGJpdCBvZGQsIGFzIGl0IG1lYW5zCisgICAqIHRoYXQgdGhlIGFsZ29yaXRobSBoYXMgdGhlIGdlbmVyYWwgdGVuZGVuY3kgdG8gcHJvZHVjZSBhZGp1c3RtZW50IHZhbHVlcworICAgKiB0aGF0IGFyZSA2IGRCIHRvbyBsb3cuICBCdW1waW5nIHRoZSByZWZlcmVuY2UgbGV2ZWwgYnkgNiBkQiBjb21wZW5zYXRlZCBmb3IKKyAgICogdGhpcy4KKyAgICoKKyAgICogVGhlIHByb2JsZW0gb2YgdGhlIHJlZmVyZW5jZSBsZXZlbCBiZWluZyBhbWJpZ3VvdXMgZm9yIGxhY2sgb2YgY29uY2lzZQorICAgKiBzdGFuZGFyZGl6YXRpb24gaXMgdG8gYmUgc29sdmVkIGJ5IGFkb3B0aW5nIHRoZSAjR1NUX1RBR19SRUZFUkVOQ0VfTEVWRUwKKyAgICogdGFnLCB3aGljaCBhbGxvd3MgdG8gc3RvcmUgdGhlIHVzZWQgdmFsdWUgYWxvbmdzaWRlIHRoZSBnYWluIHZhbHVlcy4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkVGRVJFTkNFX0xFVkVMLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoInJlZmVyZW5jZS1sZXZlbCIsICJSZWZlcmVuY2UgbGV2ZWwiLAorICAgICAgICAgICJSZWZlcmVuY2UgbGV2ZWwgW2RCXSIsIDAuMCwgMTUwLiwgUkdfUkVGRVJFTkNFX0xFVkVMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfTUVTU0FHRSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgibWVzc2FnZSIsICJNZXNzYWdlIiwKKyAgICAgICAgICAiUG9zdCBzdGF0aWNzIG1lc3NhZ2VzIiwKKyAgICAgICAgICBERUZBVUxUX01FU1NBR0UsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVCB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICB0cmFuc19jbGFzcyA9IChHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKikga2xhc3M7CisgIHRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcmdfYW5hbHlzaXNfc3RhcnQpOworICB0cmFuc19jbGFzcy0+c2V0X2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3JnX2FuYWx5c2lzX3NldF9jYXBzKTsKKyAgdHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9pcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcmdfYW5hbHlzaXNfdHJhbnNmb3JtX2lwKTsKKyAgdHJhbnNfY2xhc3MtPnNpbmtfZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3JnX2FuYWx5c2lzX3NpbmtfZXZlbnQpOworICB0cmFuc19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcmdfYW5hbHlzaXNfc3RvcCk7CisgIHRyYW5zX2NsYXNzLT5wYXNzdGhyb3VnaF9vbl9zYW1lX2NhcHMgPSBUUlVFOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJSZXBsYXlHYWluIGFuYWx5c2lzIiwKKyAgICAgICJGaWx0ZXIvQW5hbHl6ZXIvQXVkaW8iLAorICAgICAgIlBlcmZvcm0gdGhlIFJlcGxheUdhaW4gYW5hbHlzaXMiLAorICAgICAgIlJlblx4YzNceGE5IFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9yZ19hbmFseXNpc19kZWJ1ZywgInJnYW5hbHlzaXMiLCAwLAorICAgICAgIlJlcGxheUdhaW4gYW5hbHlzaXMgZWxlbWVudCIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JnX2FuYWx5c2lzX2luaXQgKEdzdFJnQW5hbHlzaXMgKiBmaWx0ZXIpCit7CisgIEdzdEJhc2VUcmFuc2Zvcm0gKmJhc2UgPSBHU1RfQkFTRV9UUkFOU0ZPUk0gKGZpbHRlcik7CisKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9nYXBfYXdhcmUgKGJhc2UsIFRSVUUpOworCisgIGZpbHRlci0+bnVtX3RyYWNrcyA9IDA7CisgIGZpbHRlci0+Zm9yY2VkID0gRk9SQ0VEX0RFRkFVTFQ7CisgIGZpbHRlci0+bWVzc2FnZSA9IERFRkFVTFRfTUVTU0FHRTsKKyAgZmlsdGVyLT5yZWZlcmVuY2VfbGV2ZWwgPSBSR19SRUZFUkVOQ0VfTEVWRUw7CisKKyAgZmlsdGVyLT5jdHggPSBOVUxMOworICBmaWx0ZXItPmFuYWx5emUgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JnX2FuYWx5c2lzX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSZ0FuYWx5c2lzICpmaWx0ZXIgPSBHU1RfUkdfQU5BTFlTSVMgKG9iamVjdCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTlVNX1RSQUNLUzoKKyAgICAgIGZpbHRlci0+bnVtX3RyYWNrcyA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZPUkNFRDoKKyAgICAgIGZpbHRlci0+Zm9yY2VkID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFRkVSRU5DRV9MRVZFTDoKKyAgICAgIGZpbHRlci0+cmVmZXJlbmNlX2xldmVsID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUVTU0FHRToKKyAgICAgIGZpbHRlci0+bWVzc2FnZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGZpbHRlcik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcmdfYW5hbHlzaXNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJnQW5hbHlzaXMgKmZpbHRlciA9IEdTVF9SR19BTkFMWVNJUyAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGZpbHRlcik7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9OVU1fVFJBQ0tTOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZmlsdGVyLT5udW1fdHJhY2tzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GT1JDRUQ6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmlsdGVyLT5mb3JjZWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFRkVSRU5DRV9MRVZFTDoKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIGZpbHRlci0+cmVmZXJlbmNlX2xldmVsKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NRVNTQUdFOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIGZpbHRlci0+bWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JnX2FuYWx5c2lzX3Bvc3RfbWVzc2FnZSAoZ3BvaW50ZXIgcmdhbmFseXNpcywgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwKKyAgICBHc3RDbG9ja1RpbWUgZHVyYXRpb24sIGdkb3VibGUgcmdsZXZlbCkKK3sKKyAgR3N0UmdBbmFseXNpcyAqZmlsdGVyID0gR1NUX1JHX0FOQUxZU0lTIChyZ2FuYWx5c2lzKTsKKyAgaWYgKGZpbHRlci0+bWVzc2FnZSkgeworICAgIEdzdE1lc3NhZ2UgKm07CisKKyAgICBtID0gZ3N0X21lc3NhZ2VfbmV3X2VsZW1lbnQgKEdTVF9PQkpFQ1RfQ0FTVCAocmdhbmFseXNpcyksCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgicmdhbmFseXNpcyIsCisgICAgICAgICAgICAidGltZXN0YW1wIiwgR19UWVBFX1VJTlQ2NCwgdGltZXN0YW1wLAorICAgICAgICAgICAgImR1cmF0aW9uIiwgR19UWVBFX1VJTlQ2NCwgZHVyYXRpb24sCisgICAgICAgICAgICAicmdsZXZlbCIsIEdfVFlQRV9ET1VCTEUsIHJnbGV2ZWwsIE5VTEwpKTsKKworICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAocmdhbmFseXNpcyksIG0pOworICB9Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfcmdfYW5hbHlzaXNfc3RhcnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiBiYXNlKQoreworICBHc3RSZ0FuYWx5c2lzICpmaWx0ZXIgPSBHU1RfUkdfQU5BTFlTSVMgKGJhc2UpOworCisgIGZpbHRlci0+aWdub3JlX3RhZ3MgPSBGQUxTRTsKKyAgZmlsdGVyLT5za2lwID0gRkFMU0U7CisgIGZpbHRlci0+aGFzX3RyYWNrX2dhaW4gPSBGQUxTRTsKKyAgZmlsdGVyLT5oYXNfdHJhY2tfcGVhayA9IEZBTFNFOworICBmaWx0ZXItPmhhc19hbGJ1bV9nYWluID0gRkFMU0U7CisgIGZpbHRlci0+aGFzX2FsYnVtX3BlYWsgPSBGQUxTRTsKKworICBmaWx0ZXItPmN0eCA9IHJnX2FuYWx5c2lzX25ldyAoKTsKKyAgR1NUX09CSkVDVF9MT0NLIChmaWx0ZXIpOworICByZ19hbmFseXNpc19pbml0X3NpbGVuY2VfZGV0ZWN0aW9uIChmaWx0ZXItPmN0eCwgZ3N0X3JnX2FuYWx5c2lzX3Bvc3RfbWVzc2FnZSwKKyAgICAgIGZpbHRlcik7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChmaWx0ZXIpOworICBmaWx0ZXItPmFuYWx5emUgPSBOVUxMOworCisgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICJzdGFydGVkIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3JnX2FuYWx5c2lzX3NldF9jYXBzIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwgR3N0Q2FwcyAqIGluX2NhcHMsCisgICAgR3N0Q2FwcyAqIG91dF9jYXBzKQoreworICBHc3RSZ0FuYWx5c2lzICpmaWx0ZXIgPSBHU1RfUkdfQU5BTFlTSVMgKGJhc2UpOworICBHc3RBdWRpb0luZm8gaW5mbzsKKyAgZ2ludCByYXRlLCBjaGFubmVsczsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZmlsdGVyLT5jdHggIT0gTlVMTCwgRkFMU0UpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGZpbHRlciwKKyAgICAgICJzZXRfY2FwcyBpbiAlIiBHU1RfUFRSX0ZPUk1BVCAiIG91dCAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIGluX2NhcHMsIG91dF9jYXBzKTsKKworICBpZiAoIWdzdF9hdWRpb19pbmZvX2Zyb21fY2FwcyAoJmluZm8sIGluX2NhcHMpKQorICAgIGdvdG8gaW52YWxpZF9mb3JtYXQ7CisKKyAgcmF0ZSA9IEdTVF9BVURJT19JTkZPX1JBVEUgKCZpbmZvKTsKKworICBpZiAoIXJnX2FuYWx5c2lzX3NldF9zYW1wbGVfcmF0ZSAoZmlsdGVyLT5jdHgsIHJhdGUpKQorICAgIGdvdG8gaW52YWxpZF9mb3JtYXQ7CisKKyAgY2hhbm5lbHMgPSBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJmluZm8pOworCisgIGlmIChjaGFubmVscyA8IDEgfHwgY2hhbm5lbHMgPiAyKQorICAgIGdvdG8gaW52YWxpZF9mb3JtYXQ7CisKKyAgc3dpdGNoIChHU1RfQVVESU9fSU5GT19GT1JNQVQgKCZpbmZvKSkgeworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GMzI6CisgICAgICAvKiBUaGUgZGVwdGggaXMgbm90IHZhcmlhYmxlIGZvciBmbG9hdCBmb3JtYXRzIG9mIGNvdXJzZS4gIEl0IGp1c3QKKyAgICAgICAqIG1ha2VzIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb24gbmljZSBhbmQgc2ltcGxlIGlmIHRoZQorICAgICAgICogcmdfYW5hbHlzaXNfYW5hbHl6ZV8qIGZ1bmN0aW9ucyBoYXZlIGEgY29tbW9uIHNpZ25hdHVyZS4gKi8KKyAgICAgIGZpbHRlci0+ZGVwdGggPSBzaXplb2YgKGdmbG9hdCkgKiA4OworCisgICAgICBpZiAoY2hhbm5lbHMgPT0gMSkKKyAgICAgICAgZmlsdGVyLT5hbmFseXplID0gcmdfYW5hbHlzaXNfYW5hbHl6ZV9tb25vX2Zsb2F0OworICAgICAgZWxzZQorICAgICAgICBmaWx0ZXItPmFuYWx5emUgPSByZ19hbmFseXNpc19hbmFseXplX3N0ZXJlb19mbG9hdDsKKworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MxNjoKKyAgICAgIGZpbHRlci0+ZGVwdGggPSBzaXplb2YgKGdpbnQxNikgKiA4OworCisgICAgICBpZiAoY2hhbm5lbHMgPT0gMSkKKyAgICAgICAgZmlsdGVyLT5hbmFseXplID0gcmdfYW5hbHlzaXNfYW5hbHl6ZV9tb25vX2ludDE2OworICAgICAgZWxzZQorICAgICAgICBmaWx0ZXItPmFuYWx5emUgPSByZ19hbmFseXNpc19hbmFseXplX3N0ZXJlb19pbnQxNjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIGludmFsaWRfZm9ybWF0OworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRXJyb3JzLiAqLworaW52YWxpZF9mb3JtYXQ6CisgIHsKKyAgICBmaWx0ZXItPmFuYWx5emUgPSBOVUxMOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChmaWx0ZXIsIENPUkUsIE5FR09USUFUSU9OLAorICAgICAgICAoIkludmFsaWQgaW5jb21pbmcgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGluX2NhcHMpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3JnX2FuYWx5c2lzX3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0UmdBbmFseXNpcyAqZmlsdGVyID0gR1NUX1JHX0FOQUxZU0lTIChiYXNlKTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGZpbHRlci0+Y3R4ICE9IE5VTEwsIEdTVF9GTE9XX0ZMVVNISU5HKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGZpbHRlci0+YW5hbHl6ZSAhPSBOVUxMLCBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRCk7CisKKyAgaWYgKGZpbHRlci0+c2tpcCkKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwgInByb2Nlc3NpbmcgYnVmZmVyIG9mIHNpemUgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICBtYXAuc2l6ZSk7CisKKyAgcmdfYW5hbHlzaXNfc3RhcnRfYnVmZmVyIChmaWx0ZXItPmN0eCwgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikpOworICBmaWx0ZXItPmFuYWx5emUgKGZpbHRlci0+Y3R4LCBtYXAuZGF0YSwgbWFwLnNpemUsIGZpbHRlci0+ZGVwdGgpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9yZ19hbmFseXNpc19zaW5rX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UmdBbmFseXNpcyAqZmlsdGVyID0gR1NUX1JHX0FOQUxZU0lTIChiYXNlKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZmlsdGVyLT5jdHggIT0gTlVMTCwgVFJVRSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisKKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwgInJlY2VpdmVkIEVPUyBldmVudCIpOworCisgICAgICBnc3RfcmdfYW5hbHlzaXNfaGFuZGxlX2VvcyAoZmlsdGVyKTsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKGZpbHRlciwgInBhc3Npbmcgb24gRU9TIGV2ZW50Iik7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9UQUc6CisgICAgeworICAgICAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisKKyAgICAgIC8qIFRoZSByZWZlcmVuY2UgdG8gdGhlIHRhZyBsaXN0IGlzIGJvcnJvd2VkLiAqLworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAoZXZlbnQsICZ0YWdfbGlzdCk7CisgICAgICBnc3RfcmdfYW5hbHlzaXNfaGFuZGxlX3RhZ3MgKGZpbHRlciwgdGFnX2xpc3QpOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAoYmFzZSwgZXZlbnQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9yZ19hbmFseXNpc19zdG9wIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSkKK3sKKyAgR3N0UmdBbmFseXNpcyAqZmlsdGVyID0gR1NUX1JHX0FOQUxZU0lTIChiYXNlKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZmlsdGVyLT5jdHggIT0gTlVMTCwgRkFMU0UpOworCisgIHJnX2FuYWx5c2lzX2Rlc3Ryb3kgKGZpbHRlci0+Y3R4KTsKKyAgZmlsdGVyLT5jdHggPSBOVUxMOworCisgIEdTVF9MT0dfT0JKRUNUIChmaWx0ZXIsICJzdG9wcGVkIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIEZJWE1FOiBoYW5kbGUgZ2xvYmFsIHZzLiBzdHJlYW0tdGFncz8gKi8KK3N0YXRpYyB2b2lkCitnc3RfcmdfYW5hbHlzaXNfaGFuZGxlX3RhZ3MgKEdzdFJnQW5hbHlzaXMgKiBmaWx0ZXIsCisgICAgY29uc3QgR3N0VGFnTGlzdCAqIHRhZ19saXN0KQoreworICBnYm9vbGVhbiBhbGJ1bV9wcm9jZXNzaW5nID0gKGZpbHRlci0+bnVtX3RyYWNrcyA+IDApOworICBnZG91YmxlIGR1bW15OworCisgIGlmICghYWxidW1fcHJvY2Vzc2luZykKKyAgICBmaWx0ZXItPmlnbm9yZV90YWdzID0gRkFMU0U7CisKKyAgaWYgKGZpbHRlci0+c2tpcCAmJiBhbGJ1bV9wcm9jZXNzaW5nKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAiaWdub3JpbmcgdGFnIGV2ZW50OiBza2lwcGluZyBhbGJ1bSIpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmIChmaWx0ZXItPnNraXApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJpZ25vcmluZyB0YWcgZXZlbnQ6IHNraXBwaW5nIHRyYWNrIik7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKGZpbHRlci0+aWdub3JlX3RhZ3MpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJpZ25vcmluZyB0YWcgZXZlbnQ6IGNhbm5vdCBza2lwIGFueXdheXMiKTsKKyAgICByZXR1cm47CisgIH0KKworICBmaWx0ZXItPmhhc190cmFja19nYWluIHw9IGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwKKyAgICAgIEdTVF9UQUdfVFJBQ0tfR0FJTiwgJmR1bW15KTsKKyAgZmlsdGVyLT5oYXNfdHJhY2tfcGVhayB8PSBnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAodGFnX2xpc3QsCisgICAgICBHU1RfVEFHX1RSQUNLX1BFQUssICZkdW1teSk7CisgIGZpbHRlci0+aGFzX2FsYnVtX2dhaW4gfD0gZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ19saXN0LAorICAgICAgR1NUX1RBR19BTEJVTV9HQUlOLCAmZHVtbXkpOworICBmaWx0ZXItPmhhc19hbGJ1bV9wZWFrIHw9IGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwKKyAgICAgIEdTVF9UQUdfQUxCVU1fUEVBSywgJmR1bW15KTsKKworICBpZiAoIShmaWx0ZXItPmhhc190cmFja19nYWluICYmIGZpbHRlci0+aGFzX3RyYWNrX3BlYWspKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAidHJhY2sgdGFncyBub3QgY29tcGxldGUgeWV0Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGFsYnVtX3Byb2Nlc3NpbmcgJiYgIShmaWx0ZXItPmhhc19hbGJ1bV9nYWluICYmIGZpbHRlci0+aGFzX2FsYnVtX3BlYWspKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAiYWxidW0gdGFncyBub3QgY29tcGxldGUgeWV0Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGZpbHRlci0+Zm9yY2VkKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLAorICAgICAgICAiZXhpc3RpbmcgdGFncyBhcmUgc3VmZmljaWVudCwgYnV0IHByb2Nlc3NpbmcgYW55d2F5IChmb3JjZWQpIik7CisgICAgcmV0dXJuOworICB9CisKKyAgZmlsdGVyLT5za2lwID0gVFJVRTsKKyAgcmdfYW5hbHlzaXNfcmVzZXQgKGZpbHRlci0+Y3R4KTsKKworICBpZiAoIWFsYnVtX3Byb2Nlc3NpbmcpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsCisgICAgICAgICJleGlzdGluZyB0YWdzIGFyZSBzdWZmaWNpZW50LCB3aWxsIG5vdCBwcm9jZXNzIHRoaXMgdHJhY2siKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsCisgICAgICAgICJleGlzdGluZyB0YWdzIGFyZSBzdWZmaWNpZW50LCB3aWxsIG5vdCBwcm9jZXNzIHRoaXMgYWxidW0iKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3JnX2FuYWx5c2lzX2hhbmRsZV9lb3MgKEdzdFJnQW5hbHlzaXMgKiBmaWx0ZXIpCit7CisgIGdib29sZWFuIGFsYnVtX3Byb2Nlc3NpbmcgPSAoZmlsdGVyLT5udW1fdHJhY2tzID4gMCk7CisgIGdib29sZWFuIGFsYnVtX2ZpbmlzaGVkID0gKGZpbHRlci0+bnVtX3RyYWNrcyA9PSAxKTsKKyAgZ2Jvb2xlYW4gYWxidW1fc2tpcHBpbmcgPSBhbGJ1bV9wcm9jZXNzaW5nICYmIGZpbHRlci0+c2tpcDsKKworICBmaWx0ZXItPmhhc190cmFja19nYWluID0gRkFMU0U7CisgIGZpbHRlci0+aGFzX3RyYWNrX3BlYWsgPSBGQUxTRTsKKworICBpZiAoYWxidW1fZmluaXNoZWQpIHsKKyAgICBmaWx0ZXItPmlnbm9yZV90YWdzID0gRkFMU0U7CisgICAgZmlsdGVyLT5za2lwID0gRkFMU0U7CisgICAgZmlsdGVyLT5oYXNfYWxidW1fZ2FpbiA9IEZBTFNFOworICAgIGZpbHRlci0+aGFzX2FsYnVtX3BlYWsgPSBGQUxTRTsKKyAgfSBlbHNlIGlmICghYWxidW1fc2tpcHBpbmcpIHsKKyAgICBmaWx0ZXItPnNraXAgPSBGQUxTRTsKKyAgfQorCisgIC8qIFdlIG1pZ2h0IGhhdmUganVzdCBmdWxseSBwcm9jZXNzZWQgYSB0cmFjayBiZWNhdXNlIGl0IGhhcworICAgKiBpbmNvbXBsZXRlIHRhZ3MuICBJZiB3ZSBkbyBhbGJ1bSBwcm9jZXNzaW5nIGFuZCBhbGxvdyBza2lwcGluZworICAgKiAobm90IGZvcmNlZCksIHByZXZlbnQgc3dpdGNoaW5nIHRvIHNraXBwaW5nIGlmIGEgbGF0ZXIgdHJhY2sgd2l0aAorICAgKiBmdWxsIHRhZ3MgY29tZXMgYWxvbmc6ICovCisgIGlmICghZmlsdGVyLT5mb3JjZWQgJiYgYWxidW1fcHJvY2Vzc2luZyAmJiAhYWxidW1fZmluaXNoZWQpCisgICAgZmlsdGVyLT5pZ25vcmVfdGFncyA9IFRSVUU7CisKKyAgaWYgKCFmaWx0ZXItPnNraXApIHsKKyAgICBHc3RUYWdMaXN0ICp0YWdfbGlzdCA9IE5VTEw7CisgICAgZ2Jvb2xlYW4gdHJhY2tfc3VjY2VzczsKKyAgICBnYm9vbGVhbiBhbGJ1bV9zdWNjZXNzID0gRkFMU0U7CisKKyAgICB0cmFja19zdWNjZXNzID0gZ3N0X3JnX2FuYWx5c2lzX3RyYWNrX3Jlc3VsdCAoZmlsdGVyLCAmdGFnX2xpc3QpOworCisgICAgaWYgKGFsYnVtX2ZpbmlzaGVkKQorICAgICAgYWxidW1fc3VjY2VzcyA9IGdzdF9yZ19hbmFseXNpc19hbGJ1bV9yZXN1bHQgKGZpbHRlciwgJnRhZ19saXN0KTsKKyAgICBlbHNlIGlmICghYWxidW1fcHJvY2Vzc2luZykKKyAgICAgIHJnX2FuYWx5c2lzX3Jlc2V0X2FsYnVtIChmaWx0ZXItPmN0eCk7CisKKyAgICBpZiAodHJhY2tfc3VjY2VzcyB8fCBhbGJ1bV9zdWNjZXNzKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAoZmlsdGVyLCAicG9zdGluZyB0YWcgbGlzdCB3aXRoIHJlc3VsdHMiKTsKKyAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgICBHU1RfVEFHX1JFRkVSRU5DRV9MRVZFTCwgZmlsdGVyLT5yZWZlcmVuY2VfbGV2ZWwsIE5VTEwpOworICAgICAgLyogVGhpcyB0YWtlcyBvd25lcnNoaXAgb2Ygb3VyIHJlZmVyZW5jZSB0byB0aGUgbGlzdCAqLworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChHU1RfQkFTRV9UUkFOU0ZPUk1fU1JDX1BBRCAoZmlsdGVyKSwKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X3RhZyAodGFnX2xpc3QpKTsKKyAgICAgIHRhZ19saXN0ID0gTlVMTDsKKyAgICB9CisgIH0KKworICBpZiAoYWxidW1fcHJvY2Vzc2luZykgeworICAgIGZpbHRlci0+bnVtX3RyYWNrcy0tOworCisgICAgaWYgKCFhbGJ1bV9maW5pc2hlZCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZmlsdGVyLCAiYWxidW0gbm90IGZpbmlzaGVkIHlldCAobnVtLXRyYWNrcyBpcyBub3cgJXUpIiwKKyAgICAgICAgICBmaWx0ZXItPm51bV90cmFja3MpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChmaWx0ZXIsICJhbGJ1bSBmaW5pc2hlZCAobnVtLXRyYWNrcyBpcyBub3cgMCkiKTsKKyAgICB9CisgIH0KKworICBpZiAoYWxidW1fcHJvY2Vzc2luZykKKyAgICBnX29iamVjdF9ub3RpZnkgKEdfT0JKRUNUIChmaWx0ZXIpLCAibnVtLXRyYWNrcyIpOworfQorCisvKiBGSVhNRTogcmV0dXJuIHRhZyBsaXN0IChsaXN0cz8pIGJhc2VkIG9uIGlucHV0IHRhZ3MuLiAqLworc3RhdGljIGdib29sZWFuCitnc3RfcmdfYW5hbHlzaXNfdHJhY2tfcmVzdWx0IChHc3RSZ0FuYWx5c2lzICogZmlsdGVyLCBHc3RUYWdMaXN0ICoqIHRhZ19saXN0KQoreworICBnYm9vbGVhbiB0cmFja19zdWNjZXNzOworICBnZG91YmxlIHRyYWNrX2dhaW4sIHRyYWNrX3BlYWs7CisKKyAgdHJhY2tfc3VjY2VzcyA9IHJnX2FuYWx5c2lzX3RyYWNrX3Jlc3VsdCAoZmlsdGVyLT5jdHgsICZ0cmFja19nYWluLAorICAgICAgJnRyYWNrX3BlYWspOworCisgIGlmICh0cmFja19zdWNjZXNzKSB7CisgICAgdHJhY2tfZ2FpbiArPSBmaWx0ZXItPnJlZmVyZW5jZV9sZXZlbCAtIFJHX1JFRkVSRU5DRV9MRVZFTDsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGZpbHRlciwgInRyYWNrIGdhaW4gaXMgJSsuMmYgZEIsIHBlYWsgJS42ZiIsIHRyYWNrX2dhaW4sCisgICAgICAgIHRyYWNrX3BlYWspOworICB9IGVsc2UgeworICAgIEdTVF9JTkZPX09CSkVDVCAoZmlsdGVyLCAidHJhY2sgd2FzIHRvbyBzaG9ydCB0byBhbmFseXplIik7CisgIH0KKworICBpZiAodHJhY2tfc3VjY2VzcykgeworICAgIGlmICgqdGFnX2xpc3QgPT0gTlVMTCkKKyAgICAgICp0YWdfbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAoKnRhZ19saXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgICAgR1NUX1RBR19UUkFDS19QRUFLLCB0cmFja19wZWFrLCBHU1RfVEFHX1RSQUNLX0dBSU4sIHRyYWNrX2dhaW4sIE5VTEwpOworICB9CisKKyAgcmV0dXJuIHRyYWNrX3N1Y2Nlc3M7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3JnX2FuYWx5c2lzX2FsYnVtX3Jlc3VsdCAoR3N0UmdBbmFseXNpcyAqIGZpbHRlciwgR3N0VGFnTGlzdCAqKiB0YWdfbGlzdCkKK3sKKyAgZ2Jvb2xlYW4gYWxidW1fc3VjY2VzczsKKyAgZ2RvdWJsZSBhbGJ1bV9nYWluLCBhbGJ1bV9wZWFrOworCisgIGFsYnVtX3N1Y2Nlc3MgPSByZ19hbmFseXNpc19hbGJ1bV9yZXN1bHQgKGZpbHRlci0+Y3R4LCAmYWxidW1fZ2FpbiwKKyAgICAgICZhbGJ1bV9wZWFrKTsKKworICBpZiAoYWxidW1fc3VjY2VzcykgeworICAgIGFsYnVtX2dhaW4gKz0gZmlsdGVyLT5yZWZlcmVuY2VfbGV2ZWwgLSBSR19SRUZFUkVOQ0VfTEVWRUw7CisgICAgR1NUX0lORk9fT0JKRUNUIChmaWx0ZXIsICJhbGJ1bSBnYWluIGlzICUrLjJmIGRCLCBwZWFrICUuNmYiLCBhbGJ1bV9nYWluLAorICAgICAgICBhbGJ1bV9wZWFrKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGZpbHRlciwgImFsYnVtIHdhcyB0b28gc2hvcnQgdG8gYW5hbHl6ZSIpOworICB9CisKKyAgaWYgKGFsYnVtX3N1Y2Nlc3MpIHsKKyAgICBpZiAoKnRhZ19saXN0ID09IE5VTEwpCisgICAgICAqdGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgIGdzdF90YWdfbGlzdF9hZGQgKCp0YWdfbGlzdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsCisgICAgICAgIEdTVF9UQUdfQUxCVU1fUEVBSywgYWxidW1fcGVhaywgR1NUX1RBR19BTEJVTV9HQUlOLCBhbGJ1bV9nYWluLCBOVUxMKTsKKyAgfQorCisgIHJldHVybiBhbGJ1bV9zdWNjZXNzOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3JlcGxheWdhaW4vZ3N0cmdhbmFseXNpcy5oIGIvZ3N0L3JlcGxheWdhaW4vZ3N0cmdhbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNjhlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcmVwbGF5Z2Fpbi9nc3RyZ2FuYWx5c2lzLmgKQEAgLTAsMCArMSw4NiBAQAorLyogR1N0cmVhbWVyIFJlcGxheUdhaW4gYW5hbHlzaXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVuZSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorICoKKyAqIGdzdHJnYW5hbHlzaXMuaDogRWxlbWVudCB0aGF0IHBlcmZvcm1zIHRoZSBSZXBsYXlHYWluIGFuYWx5c2lzCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfX0dTVF9SR19BTkFMWVNJU19IX18KKyNkZWZpbmUgX19HU1RfUkdfQU5BTFlTSVNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorCisjaW5jbHVkZSAicmdhbmFseXNpcy5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUkdfQU5BTFlTSVMgXAorICAoZ3N0X3JnX2FuYWx5c2lzX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SR19BTkFMWVNJUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JHX0FOQUxZU0lTLEdzdFJnQW5hbHlzaXMpKQorI2RlZmluZSBHU1RfUkdfQU5BTFlTSVNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUkdfQU5BTFlTSVMsR3N0UmdBbmFseXNpc0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JHX0FOQUxZU0lTKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUkdfQU5BTFlTSVMpKQorI2RlZmluZSBHU1RfSVNfUkdfQU5BTFlTSVNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUkdfQU5BTFlTSVMpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFJnQW5hbHlzaXMgR3N0UmdBbmFseXNpczsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSZ0FuYWx5c2lzQ2xhc3MgR3N0UmdBbmFseXNpc0NsYXNzOworCisvKioKKyAqIEdzdFJnQW5hbHlzaXM6CisgKgorICogT3BhcXVlIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdFJnQW5hbHlzaXMKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybSBlbGVtZW50OworCisgIC8qPCBwcml2YXRlID4qLworCisgIFJnQW5hbHlzaXNDdHggKmN0eDsKKyAgdm9pZCAoKmFuYWx5emUpIChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnY29uc3Rwb2ludGVyIGRhdGEsIGdzaXplIHNpemUsCisgICAgICBndWludCBkZXB0aCk7CisgIGdpbnQgZGVwdGg7CisKKyAgLyogUHJvcGVydHkgdmFsdWVzLiAqLworICBndWludCBudW1fdHJhY2tzOworICBnZG91YmxlIHJlZmVyZW5jZV9sZXZlbDsKKyAgZ2Jvb2xlYW4gZm9yY2VkOworICBnYm9vbGVhbiBtZXNzYWdlOworCisgIC8qIFN0YXRlIG1hY2hpbmVyeSBmb3Igc2tpcHBpbmcuICovCisgIGdib29sZWFuIGlnbm9yZV90YWdzOworICBnYm9vbGVhbiBza2lwOworICBnYm9vbGVhbiBoYXNfdHJhY2tfZ2FpbjsKKyAgZ2Jvb2xlYW4gaGFzX3RyYWNrX3BlYWs7CisgIGdib29sZWFuIGhhc19hbGJ1bV9nYWluOworICBnYm9vbGVhbiBoYXNfYWxidW1fcGVhazsKK307CisKK3N0cnVjdCBfR3N0UmdBbmFseXNpc0NsYXNzCit7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcmdfYW5hbHlzaXNfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUkdfQU5BTFlTSVNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYyBiL2dzdC9yZXBsYXlnYWluL2dzdHJnbGltaXRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMDRlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcmVwbGF5Z2Fpbi9nc3RyZ2xpbWl0ZXIuYwpAQCAtMCwwICsxLDE5OSBAQAorLyogR1N0cmVhbWVyIFJlcGxheUdhaW4gbGltaXRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZW5lIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisgKiAKKyAqIGdzdHJnbGltaXRlci5jOiBFbGVtZW50IHRvIGFwcGx5IHNpZ25hbCBjb21wcmVzc2lvbiB0byByYXcgYXVkaW8gZGF0YQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJnbGltaXRlcgorICogQHNlZV9hbHNvOiAjR3N0UmdWb2x1bWUKKyAqCisgKiBUaGlzIGVsZW1lbnQgYXBwbGllcyBzaWduYWwgY29tcHJlc3Npb24vbGltaXRpbmcgdG8gcmF3IGF1ZGlvIGRhdGEuICBJdAorICogcGVyZm9ybXMgc3RyaWN0IGhhcmQgbGltaXRpbmcgd2l0aCBzb2Z0LWtuZWUgY2hhcmFjdGVyaXN0aWNzLCB1c2luZyBhCisgKiB0aHJlc2hvbGQgb2YgLTYgZEIuICBUaGlzIHR5cGUgb2YgZmlsdGVyIGlzIG1lbnRpb25lZCBpbiB0aGUgcHJvcG9zZWQgPHVsaW5rCisgKiB1cmw9Imh0dHA6Ly9yZXBsYXlnYWluLm9yZyI+UmVwbGF5R2FpbiBzdGFuZGFyZDwvdWxpbms+LgorICogCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj1maWxlbmFtZS5leHQgISBkZWNvZGViaW4gISBhdWRpb2NvbnZlcnQgXAorICogICAgICAgICAgICAhIHJndm9sdW1lIHByZS1hbXA9Ni4wIGhlYWRyb29tPTEwLjAgISByZ2xpbWl0ZXIgXAorICogICAgICAgICAgICAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhbHNhc2luaworICogXXxQbGF5YmFjayBvZiBhIGZpbGUKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgImdzdHJnbGltaXRlci5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfcmdfbGltaXRlcl9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfcmdfbGltaXRlcl9kZWJ1ZworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9FTkFCTEVELAorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoRjMyKSAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSB7IGludGVybGVhdmVkLCBub24taW50ZXJsZWF2ZWQgfSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbMSwgTUFYXSwgIiAicmF0ZSA9IChpbnQpIFsxLCBNQVhdIikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChGMzIpICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIHsgaW50ZXJsZWF2ZWQsIG5vbi1pbnRlcmxlYXZlZH0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgWzEsIE1BWF0sICIgInJhdGUgPSAoaW50KSBbMSwgTUFYXSIpKTsKKworI2RlZmluZSBnc3RfcmdfbGltaXRlcl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSZ0xpbWl0ZXIsIGdzdF9yZ19saW1pdGVyLCBHU1RfVFlQRV9CQVNFX1RSQU5TRk9STSk7CisKK3N0YXRpYyB2b2lkIGdzdF9yZ19saW1pdGVyX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9yZ19saW1pdGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3JnX2xpbWl0ZXJfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwKKyAgICBHc3RCdWZmZXIgKiBidWYpOworCitzdGF0aWMgdm9pZAorZ3N0X3JnX2xpbWl0ZXJfY2xhc3NfaW5pdCAoR3N0UmdMaW1pdGVyQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqdHJhbnNfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9yZ19saW1pdGVyX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3JnX2xpbWl0ZXJfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRU5BQkxFRCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZW5hYmxlZCIsICJFbmFibGVkIiwgIkVuYWJsZSBwcm9jZXNzaW5nIiwgVFJVRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICB0cmFuc19jbGFzcyA9IEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAoa2xhc3MpOworICB0cmFuc19jbGFzcy0+dHJhbnNmb3JtX2lwID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9yZ19saW1pdGVyX3RyYW5zZm9ybV9pcCk7CisgIHRyYW5zX2NsYXNzLT5wYXNzdGhyb3VnaF9vbl9zYW1lX2NhcHMgPSBGQUxTRTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzaW5rX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiUmVwbGF5R2FpbiBsaW1pdGVyIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L0F1ZGlvIiwKKyAgICAgICJBcHBseSBzaWduYWwgY29tcHJlc3Npb24gdG8gcmF3IGF1ZGlvIGRhdGEiLAorICAgICAgIlJlblx4YzNceGE5IFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9yZ19saW1pdGVyX2RlYnVnLCAicmdsaW1pdGVyIiwgMCwKKyAgICAgICJSZXBsYXlHYWluIGxpbWl0ZXIgZWxlbWVudCIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JnX2xpbWl0ZXJfaW5pdCAoR3N0UmdMaW1pdGVyICogZmlsdGVyKQoreworICBHc3RCYXNlVHJhbnNmb3JtICpiYXNlID0gR1NUX0JBU0VfVFJBTlNGT1JNIChmaWx0ZXIpOworCisgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfcGFzc3Rocm91Z2ggKGJhc2UsIEZBTFNFKTsKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9nYXBfYXdhcmUgKGJhc2UsIFRSVUUpOworCisgIGZpbHRlci0+ZW5hYmxlZCA9IFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcmdfbGltaXRlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UmdMaW1pdGVyICpmaWx0ZXIgPSBHU1RfUkdfTElNSVRFUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfRU5BQkxFRDoKKyAgICAgIGZpbHRlci0+ZW5hYmxlZCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfcGFzc3Rocm91Z2ggKEdTVF9CQVNFX1RSQU5TRk9STSAoZmlsdGVyKSwKKyAgICAgICAgICAhZmlsdGVyLT5lbmFibGVkKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9yZ19saW1pdGVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSZ0xpbWl0ZXIgKmZpbHRlciA9IEdTVF9SR19MSU1JVEVSIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9FTkFCTEVEOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIGZpbHRlci0+ZW5hYmxlZCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKyNkZWZpbmUgTElNSVQgMS4wCisjZGVmaW5lIFRIUkVTIDAuNSAgICAgICAgICAgICAgIC8qIGNhLiAtNiBkQiAqLworI2RlZmluZSBDT01QTCAwLjUgICAgICAgICAgICAgICAvKiBMSU1JVCAtIFRIUkVTSCAqLworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3JnX2xpbWl0ZXJfdHJhbnNmb3JtX2lwIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RSZ0xpbWl0ZXIgKmZpbHRlciA9IEdTVF9SR19MSU1JVEVSIChiYXNlKTsKKyAgZ2Zsb2F0ICppbnB1dDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50IGNvdW50OworICBndWludCBpOworCisgIGlmICghZmlsdGVyLT5lbmFibGVkKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICBpZiAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfR0FQKSkKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgaW5wdXQgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBjb3VudCA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikgLyBzaXplb2YgKGdmbG9hdCk7CisKKyAgZm9yIChpID0gY291bnQ7IGktLTspIHsKKyAgICBpZiAoKmlucHV0ID4gVEhSRVMpCisgICAgICAqaW5wdXQgPSB0YW5oZiAoKCppbnB1dCAtIFRIUkVTKSAvIENPTVBMKSAqIENPTVBMICsgVEhSRVM7CisgICAgZWxzZSBpZiAoKmlucHV0IDwgLVRIUkVTKQorICAgICAgKmlucHV0ID0gdGFuaGYgKCgqaW5wdXQgKyBUSFJFUykgLyBDT01QTCkgKiBDT01QTCAtIFRIUkVTOworICAgIGlucHV0Kys7CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KZGlmZiAtLWdpdCBhL2dzdC9yZXBsYXlnYWluL2dzdHJnbGltaXRlci5oIGIvZ3N0L3JlcGxheWdhaW4vZ3N0cmdsaW1pdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiZDgwNAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9yZXBsYXlnYWluL2dzdHJnbGltaXRlci5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qIEdTdHJlYW1lciBSZXBsYXlHYWluIGxpbWl0ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVuZSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorICoKKyAqIGdzdHJnbGltaXRlci5oOiBFbGVtZW50IHRvIGFwcGx5IHNpZ25hbCBjb21wcmVzc2lvbiB0byByYXcgYXVkaW8gZGF0YQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX19HU1RfUkdfTElNSVRFUl9IX18KKyNkZWZpbmUgX19HU1RfUkdfTElNSVRFUl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfUkdfTElNSVRFUiBcCisgIChnc3RfcmdfbGltaXRlcl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUkdfTElNSVRFUihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JHX0xJTUlURVIsR3N0UmdMaW1pdGVyKSkKKyNkZWZpbmUgR1NUX1JHX0xJTUlURVJfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUkdfTElNSVRFUixHc3RSZ0xpbWl0ZXJDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SR19MSU1JVEVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUkdfTElNSVRFUikpCisjZGVmaW5lIEdTVF9JU19SR19MSU1JVEVSX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JHX0xJTUlURVIpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UmdMaW1pdGVyIEdzdFJnTGltaXRlcjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSZ0xpbWl0ZXJDbGFzcyBHc3RSZ0xpbWl0ZXJDbGFzczsKKworLyoqCisgKiBHc3RSZ0xpbWl0ZXI6CisgKgorICogT3BhcXVlIGRhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdFJnTGltaXRlcgoreworICBHc3RCYXNlVHJhbnNmb3JtIGVsZW1lbnQ7CisKKyAgLyo8IHByaXZhdGUgPiovCisKKyAgZ2Jvb2xlYW4gZW5hYmxlZDsKK307CisKK3N0cnVjdCBfR3N0UmdMaW1pdGVyQ2xhc3MKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9yZ19saW1pdGVyX2dldF90eXBlICh2b2lkKTsKKworI2VuZGlmIC8qIF9fR1NUX1JHX0xJTUlURVJfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcmVwbGF5Z2Fpbi9nc3RyZ3ZvbHVtZS5jIGIvZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzRmMjgxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3JlcGxheWdhaW4vZ3N0cmd2b2x1bWUuYwpAQCAtMCwwICsxLDY4NiBAQAorLyogR1N0cmVhbWVyIFJlcGxheUdhaW4gdm9sdW1lIGFkanVzdG1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVuZSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorICogCisgKiBnc3RyZ3ZvbHVtZS5jOiBFbGVtZW50IHRvIGFwcGx5IFJlcGxheUdhaW4gdm9sdW1lIGFkanVzdG1lbnQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1yZ3ZvbHVtZQorICogQHNlZV9hbHNvOiAjR3N0UmdMaW1pdGVyLCAjR3N0UmdBbmFseXNpcworICoKKyAqIFRoaXMgZWxlbWVudCBhcHBsaWVzIHZvbHVtZSBjaGFuZ2VzIHRvIHN0cmVhbXMgYXMgbGluZWQgb3V0IGluIHRoZSBwcm9wb3NlZAorICogPHVsaW5rIHVybD0iaHR0cDovL3JlcGxheWdhaW4ub3JnIj5SZXBsYXlHYWluIHN0YW5kYXJkPC91bGluaz4uICBJdAorICogaW50ZXJwcmV0cyB0aGUgUmVwbGF5R2FpbiBtZXRhIGRhdGEgdGFncyBhbmQgY2FycmllcyBvdXQgdGhlIGFkanVzdG1lbnQgKGJ5CisgKiB1c2luZyBhIHZvbHVtZSBlbGVtZW50IGludGVybmFsbHkpLiAgVGhlIHJlbGV2YW50IHRhZ3MgYXJlOgorICogPGl0ZW1pemVkbGlzdD4KKyAqIDxsaXN0aXRlbT4jR1NUX1RBR19UUkFDS19HQUlOPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4jR1NUX1RBR19UUkFDS19QRUFLPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4jR1NUX1RBR19BTEJVTV9HQUlOPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4jR1NUX1RBR19BTEJVTV9QRUFLPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4jR1NUX1RBR19SRUZFUkVOQ0VfTEVWRUw8L2xpc3RpdGVtPgorICogPC9pdGVtaXplZGxpc3Q+CisgKiBUaGUgaW5mb3JtYXRpb24gY2FycmllZCBieSB0aGVzZSB0YWdzIG11c3QgaGF2ZSBiZWVuIGNhbGN1bGF0ZWQgYmVmb3JlaGFuZCBieQorICogcGVyZm9ybWluZyB0aGUgUmVwbGF5R2FpbiBhbmFseXNpcy4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIDxsaW5rCisgKiBsaW5rZW5kPSJHc3RSZ0FuYWx5c2lzIj5yZ2FuYWx5c2lzPC9saW5rPiBlbGVtZW50LgorICogCisgKiBUaGUgc2lnbmFsIGNvbXByZXNzaW9uL2xpbWl0aW5nIHJlY29tbWVuZGF0aW9ucyBvdXRsaW5lZCBpbiB0aGUgcHJvcG9zZWQKKyAqIHN0YW5kYXJkIGFyZSBub3QgaW1wbGVtZW50ZWQgYnkgdGhpcyBlbGVtZW50LiAgVGhpcyBoYXMgdG8gYmUgaGFuZGxlZCBieQorICogc2VwYXJhdGUgZWxlbWVudHMgYmVjYXVzZSBhcHBsaWNhdGlvbnMgbWlnaHQgd2FudCB0byBoYXZlIGFkZGl0aW9uYWwgZmlsdGVycworICogYmV0d2VlbiB0aGUgdm9sdW1lIGFkanVzdG1lbnQgYW5kIHRoZSBsaW1pdGluZyBzdGFnZS4gIEEgYmFzaWMgbGltaXRlciBpcworICogaW5jbHVkZWQgd2l0aCB0aGlzIHBsdWdpbjogVGhlIDxsaW5rIGxpbmtlbmQ9IkdzdFJnTGltaXRlciI+cmdsaW1pdGVyPC9saW5rPgorICogZWxlbWVudCBhcHBsaWVzIC02IGRCIGhhcmQgbGltaXRpbmcgYXMgbWVudGlvbmVkIGluIHRoZSBSZXBsYXlHYWluIHN0YW5kYXJkLgorICogCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj1maWxlbmFtZS5leHQgISBkZWNvZGViaW4gISBhdWRpb2NvbnZlcnQgXAorICogICAgICEgcmd2b2x1bWUgISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgYWxzYXNpbmsKKyAqIF18IFBsYXliYWNrIG9mIGEgZmlsZQorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvcGJ1dGlscy5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImdzdHJndm9sdW1lLmgiCisjaW5jbHVkZSAicmVwbGF5Z2Fpbi5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3Rfcmdfdm9sdW1lX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9yZ192b2x1bWVfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQUxCVU1fTU9ERSwKKyAgUFJPUF9IRUFEUk9PTSwKKyAgUFJPUF9QUkVfQU1QLAorICBQUk9QX0ZBTExCQUNLX0dBSU4sCisgIFBST1BfVEFSR0VUX0dBSU4sCisgIFBST1BfUkVTVUxUX0dBSU4KK307CisKKyNkZWZpbmUgREVGQVVMVF9BTEJVTV9NT0RFIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9IRUFEUk9PTSAwLjAKKyNkZWZpbmUgREVGQVVMVF9QUkVfQU1QIDAuMAorI2RlZmluZSBERUZBVUxUX0ZBTExCQUNLX0dBSU4gMC4wCisKKyNkZWZpbmUgREJfVE9fTElORUFSKHgpIHBvdyAoMTAuLCAoeCkgLyAyMC4pCisjZGVmaW5lIExJTkVBUl9UT19EQih4KSAoMjAuICogbG9nMTAgKHgpKQorCisjZGVmaW5lIEdBSU5fRk9STUFUICIrLjAyZiBkQiIKKyNkZWZpbmUgUEVBS19GT1JNQVQgIi4wNmYiCisKKyNkZWZpbmUgVkFMSURfR0FJTih4KSAoKHgpID4gLTYwLjAwICYmICh4KSA8IDYwLjAwKQorI2RlZmluZSBWQUxJRF9QRUFLKHgpICgoeCkgPiAwLikKKworLyogU2FtZSB0ZW1wbGF0ZSBjYXBzIGFzIEdzdFZvbHVtZSwgZm9yIEkgZG9uJ3QgbGlrZSBoYXZpbmcganVzdCBBTlkgY2Fwcy4gKi8KKworI2RlZmluZSBGT1JNQVQgInsgIkdTVF9BVURJT19ORShGMzIpIiwiR1NUX0FVRElPX05FKFMxNikiIH0iCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgRk9STUFUICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIHsgaW50ZXJsZWF2ZWQsIG5vbi1pbnRlcmxlYXZlZCB9LCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdIikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEZPUk1BVCAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSB7IGludGVybGVhdmVkLCBub24taW50ZXJsZWF2ZWQgfSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIgImNoYW5uZWxzID0gKGludCkgWyAxLCBNQVggXSIpKTsKKworI2RlZmluZSBnc3Rfcmdfdm9sdW1lX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJnVm9sdW1lLCBnc3Rfcmdfdm9sdW1lLCBHU1RfVFlQRV9CSU4pOworCitzdGF0aWMgdm9pZCBnc3Rfcmdfdm9sdW1lX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9yZ192b2x1bWVfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3JnX3ZvbHVtZV9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9yZ192b2x1bWVfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfcmdfdm9sdW1lX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgR3N0RXZlbnQgKmdzdF9yZ192b2x1bWVfdGFnX2V2ZW50IChHc3RSZ1ZvbHVtZSAqIHNlbGYsIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIHZvaWQgZ3N0X3JnX3ZvbHVtZV9yZXNldCAoR3N0UmdWb2x1bWUgKiBzZWxmKTsKK3N0YXRpYyB2b2lkIGdzdF9yZ192b2x1bWVfdXBkYXRlX2dhaW4gKEdzdFJnVm9sdW1lICogc2VsZik7CitzdGF0aWMgaW5saW5lIHZvaWQgZ3N0X3JnX3ZvbHVtZV9kZXRlcm1pbmVfZ2FpbiAoR3N0UmdWb2x1bWUgKiBzZWxmLAorICAgIGdkb3VibGUgKiB0YXJnZXRfZ2FpbiwgZ2RvdWJsZSAqIHJlc3VsdF9nYWluKTsKKworc3RhdGljIHZvaWQKK2dzdF9yZ192b2x1bWVfY2xhc3NfaW5pdCAoR3N0UmdWb2x1bWVDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR3N0QmluQ2xhc3MgKmJpbl9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3Rfcmdfdm9sdW1lX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3JnX3ZvbHVtZV9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3Rfcmdfdm9sdW1lX2Rpc3Bvc2U7CisKKyAgLyoqCisgICAqIEdzdFJnVm9sdW1lOmFsYnVtLW1vZGU6CisgICAqCisgICAqIFdoZXRoZXIgdG8gcHJlZmVyIGFsYnVtIGdhaW4gb3ZlciB0cmFjayBnYWluLgorICAgKgorICAgKiBJZiBzZXQgdG8gJVRSVUUsIHVzZSBhbGJ1bSBnYWluIGluc3RlYWQgb2YgdHJhY2sgZ2FpbiBpZiBib3RoIGFyZQorICAgKiBhdmFpbGFibGUuICBUaGlzIGtlZXBzIHRoZSByZWxhdGl2ZSBsb3VkbmVzcyBsZXZlbHMgb2YgdHJhY2tzIGZyb20gdGhlIHNhbWUKKyAgICogYWxidW0gaW50YWN0LgorICAgKgorICAgKiBJZiBzZXQgdG8gJUZBTFNFLCB0cmFjayBtb2RlIGlzIHVzZWQgaW5zdGVhZC4gIFRoaXMgZWZmZWN0aXZlbHkgbGVhZHMgdG8KKyAgICogbW9yZSBleHRlbnNpdmUgbm9ybWFsaXphdGlvbi4KKyAgICoKKyAgICogSWYgYWxidW0gbW9kZSBpcyBlbmFibGVkIGJ1dCB0aGUgYWxidW0gZ2FpbiB0YWcgaXMgYWJzZW50IGluIHRoZSBzdHJlYW0sCisgICAqIHRoZSB0cmFjayBnYWluIGlzIHVzZWQgaW5zdGVhZC4gIElmIGJvdGggZ2FpbiB0YWdzIGFyZSBtaXNzaW5nLCB0aGUgdmFsdWUKKyAgICogb2YgdGhlICNHc3RSZ1ZvbHVtZTpmYWxsYmFjay1nYWluIHByb3BlcnR5IGlzIHVzZWQgaW5zdGVhZC4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQUxCVU1fTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiYWxidW0tbW9kZSIsICJBbGJ1bSBtb2RlIiwKKyAgICAgICAgICAiUHJlZmVyIGFsYnVtIG92ZXIgdHJhY2sgZ2FpbiIsIERFRkFVTFRfQUxCVU1fTU9ERSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgLyoqCisgICAqIEdzdFJnVm9sdW1lOmhlYWRyb29tOgorICAgKgorICAgKiBFeHRyYSBoZWFkcm9vbSBbZEJdLiAgVGhpcyBjb250cm9scyB0aGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBvdXRwdXQgY2FuCisgICAqIGV4Y2VlZCBkaWdpdGFsIGZ1bGwgc2NhbGUuCisgICAqCisgICAqIE9ubHkgc2V0IHRoaXMgdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gMC4wIGlmIHNpZ25hbCBjb21wcmVzc2lvbi9saW1pdGluZyBvZgorICAgKiBhIHN1aXRhYmxlIGZvcm0gaXMgYXBwbGllZCB0byB0aGUgb3V0cHV0IChvciBvdXRwdXQgaXMgYnJvdWdodCBpbnRvIHRoZQorICAgKiBjb3JyZWN0IHJhbmdlIGJ5IHNvbWUgb3RoZXIgdHJhbnNmb3JtYXRpb24pLgorICAgKgorICAgKiBUaGlzIGVsZW1lbnQgaW50ZXJuYWxseSB1c2VzIGEgdm9sdW1lIGVsZW1lbnQsIHdoaWNoIGFsc28gc3VwcG9ydHMKKyAgICogb3BlcmF0aW5nIG9uIGludGVnZXIgYXVkaW8gZm9ybWF0cy4gIFRoZXNlIGZvcm1hdHMgZG8gbm90IGFsbG93IGV4Y2VlZGluZworICAgKiBkaWdpdGFsIGZ1bGwgc2NhbGUuICBJZiBleHRyYSBoZWFkcm9vbSBpcyB1c2VkLCBtYWtlIHN1cmUgdGhhdCB0aGUgcmF3CisgICAqIGF1ZGlvIGRhdGEgZm9ybWF0IGlzIGZsb2F0aW5nIHBvaW50IChGMzIpLiAgT3RoZXJ3aXNlLAorICAgKiBjbGlwcGluZyBkaXN0b3J0aW9uIG1pZ2h0IGJlIGludHJvZHVjZWQgYXMgcGFydCBvZiB0aGUgdm9sdW1lIGFkanVzdG1lbnQKKyAgICogaXRzZWxmLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9IRUFEUk9PTSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJoZWFkcm9vbSIsICJIZWFkcm9vbSIsICJFeHRyYSBoZWFkcm9vbSBbZEJdIiwKKyAgICAgICAgICAwLiwgNjAuLCBERUZBVUxUX0hFQURST09NLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0UmdWb2x1bWU6cHJlLWFtcDoKKyAgICoKKyAgICogQWRkaXRpb25hbCBnYWluIHRvIGFwcGx5IGdsb2JhbGx5IFtkQl0uICBUaGlzIGNvbnRyb2xzIHRoZSB0cmFkZS1vZmYKKyAgICogYmV0d2VlbiB1bmlmb3JtaXR5IG9mIG5vcm1hbGl6YXRpb24gYW5kIHV0aWxpemF0aW9uIG9mIGF2YWlsYWJsZSBkeW5hbWljCisgICAqIHJhbmdlLgorICAgKgorICAgKiBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgdmFsdWUgaXMgMCBkQiBiZWNhdXNlIHRoZSBSZXBsYXlHYWluIHJlZmVyZW5jZSB2YWx1ZQorICAgKiB3YXMgYWRqdXN0ZWQgYnkgKzYgZEIgKGZyb20gODMgdG8gODkgZEIpLiAgQXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCB0aGUKKyAgICogPHVsaW5rIHVybD0iaHR0cDovL3JlcGxheWdhaW4ub3JnIj53ZWJwYWdlPC91bGluaz4gaXMgc3RpbGwgb3V0ZGF0ZWQgYW5kCisgICAqIGRvZXMgbm90IHJlZmxlY3QgdGhpcyBjaGFuZ2UgaG93ZXZlci4gIFdoZXJlIHRoZSBvcmlnaW5hbCBwcm9wb3NhbCBzdGF0ZXMKKyAgICogdGhhdCBhIHByb3BlciBkZWZhdWx0IHByZS1hbXAgdmFsdWUgaXMgKzYgZEIsIHRoaXMgdHJhbnNsYXRlcyB0byB0aGUgdXNlZCAwCisgICAqIGRCLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QUkVfQU1QLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoInByZS1hbXAiLCAiUHJlLWFtcCIsICJFeHRyYSBnYWluIFtkQl0iLAorICAgICAgICAgIC02MC4sIDYwLiwgREVGQVVMVF9QUkVfQU1QLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0UmdWb2x1bWU6ZmFsbGJhY2stZ2FpbjoKKyAgICoKKyAgICogRmFsbGJhY2sgZ2FpbiBbZEJdIGZvciBzdHJlYW1zIG1pc3NpbmcgUmVwbGF5R2FpbiB0YWdzLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9GQUxMQkFDS19HQUlOLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImZhbGxiYWNrLWdhaW4iLCAiRmFsbGJhY2sgZ2FpbiIsCisgICAgICAgICAgIkdhaW4gZm9yIHN0cmVhbXMgbWlzc2luZyB0YWdzIFtkQl0iLAorICAgICAgICAgIC02MC4sIDYwLiwgREVGQVVMVF9GQUxMQkFDS19HQUlOLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0UmdWb2x1bWU6cmVzdWx0LWdhaW46CisgICAqCisgICAqIEFwcGxpZWQgZ2FpbiBbZEJdLiAgVGhpcyBnYWluIGlzIGFwcGxpZWQgdG8gcHJvY2Vzc2VkIGJ1ZmZlciBkYXRhLgorICAgKgorICAgKiBUaGlzIGlzIHNldCB0byB0aGUgI0dzdFJnVm9sdW1lOnRhcmdldC1nYWluIGlmIGFtcGxpZmljYXRpb24gYnkgdGhhdCBhbW91bnQKKyAgICogY2FuIGJlIGFwcGxpZWQgc2FmZWx5LiAiU2FmZWx5IiBtZWFucyB0aGF0IHRoZSB2b2x1bWUgYWRqdXN0bWVudCBkb2VzIG5vdAorICAgKiBpbmZsaWN0IGNsaXBwaW5nIGRpc3RvcnRpb24uICBTaG91bGQgdGhpcyBub3QgYmUgdGhlIGNhc2UsIHRoZSByZXN1bHQgZ2FpbgorICAgKiBpcyBzZXQgdG8gYW4gYXBwcm9wcmlhdGVseSByZWR1Y2VkIHZhbHVlIChieSBhcHBseWluZyBwZWFrIG5vcm1hbGl6YXRpb24pLgorICAgKiBUaGUgcHJvcG9zZWQgc3RhbmRhcmQgY2FsbHMgdGhpcyAiY2xpcHBpbmcgcHJldmVudGlvbiIuCisgICAqCisgICAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGFuZCByZXN1bHQgZ2FpbiByZWZsZWN0cyB0aGUgbmVjZXNzYXJ5IGFtb3VudAorICAgKiBvZiByZWR1Y3Rpb24uICBBcHBsaWNhdGlvbnMgY2FuIG1ha2UgdXNlIG9mIHRoaXMgaW5mb3JtYXRpb24gdG8gdGVtcG9yYXJpbHkKKyAgICogcmVkdWNlIHRoZSAjR3N0UmdWb2x1bWU6cHJlLWFtcCBmb3Igc3Vic2VxdWVudCBzdHJlYW1zLCBhcyByZWNvbW1lbmRlZCBieQorICAgKiB0aGUgUmVwbGF5R2FpbiBzdGFuZGFyZC4KKyAgICoKKyAgICogTm90ZSB0aGF0IHRhcmdldCBhbmQgcmVzdWx0IGdhaW4gZGlmZmVyaW5nIGZvciBhIGdyZWF0IG1ham9yaXR5IG9mIHN0cmVhbXMKKyAgICogaW5kaWNhdGVzIGEgcHJvYmxlbTogV2hhdCBoYXBwZW5zIGluIHRoaXMgY2FzZSBpcyB0aGF0IG1vc3Qgc3RyZWFtcyByZWNlaXZlCisgICAqIHBlYWsgbm9ybWFsaXphdGlvbiBpbnN0ZWFkIG9mIGFtcGxpZmljYXRpb24gYnkgdGhlIGlkZWFsIHJlcGxheSBnYWluLiAgVG8KKyAgICogcHJldmVudCB0aGlzLCB0aGUgI0dzdFJnVm9sdW1lOnByZS1hbXAgaGFzIHRvIGJlIGxvd2VyZWQgYW5kL29yIGEgbGltaXRlcgorICAgKiBoYXMgdG8gYmUgdXNlZCB3aGljaCBmYWNpbGl0YXRlcyB0aGUgdXNlIG9mICNHc3RSZ1ZvbHVtZTpoZWFkcm9vbS4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkVTVUxUX0dBSU4sCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgicmVzdWx0LWdhaW4iLCAiUmVzdWx0LWdhaW4iLCAiQXBwbGllZCBnYWluIFtkQl0iLAorICAgICAgICAgIC0xMjAuLCAxMjAuLCAwLiwgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgLyoqCisgICAqIEdzdFJnVm9sdW1lOnRhcmdldC1nYWluOgorICAgKgorICAgKiBBcHBsaWNhYmxlIGdhaW4gW2RCXS4gIFRoaXMgZ2FpbiBpcyBzdXBwb3NlZCB0byBiZSBhcHBsaWVkLgorICAgKgorICAgKiBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSAjR3N0UmdWb2x1bWU6YWxidW0tbW9kZSBwcm9wZXJ0eSBhbmQgdGhlCisgICAqIHByZXNlbmNlIG9mIFJlcGxheUdhaW4gdGFncyBpbiB0aGUgc3RyZWFtLCB0aGlzIGlzIHNldCBhY2NvcmRpbmcgdG8gb25lIG9mCisgICAqIHRoZXNlIHNpbXBsZSBmb3JtdWxhczoKKyAgICoKKyAgICogPGl0ZW1pemVkbGlzdD4KKyAgICogPGxpc3RpdGVtPiNHc3RSZ1ZvbHVtZTpwcmUtYW1wICsgYWxidW0gZ2FpbiBvZiB0aGUgc3RyZWFtPC9saXN0aXRlbT4KKyAgICogPGxpc3RpdGVtPiNHc3RSZ1ZvbHVtZTpwcmUtYW1wICsgdHJhY2sgZ2FpbiBvZiB0aGUgc3RyZWFtPC9saXN0aXRlbT4KKyAgICogPGxpc3RpdGVtPiNHc3RSZ1ZvbHVtZTpwcmUtYW1wICsgI0dzdFJnVm9sdW1lOmZhbGxiYWNrLWdhaW48L2xpc3RpdGVtPgorICAgKiA8L2l0ZW1pemVkbGlzdD4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVEFSR0VUX0dBSU4sCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgidGFyZ2V0LWdhaW4iLCAiVGFyZ2V0LWdhaW4iLAorICAgICAgICAgICJBcHBsaWNhYmxlIGdhaW4gW2RCXSIsIC0xMjAuLCAxMjAuLCAwLiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3JnX3ZvbHVtZV9jaGFuZ2Vfc3RhdGUpOworCisgIGJpbl9jbGFzcyA9IChHc3RCaW5DbGFzcyAqKSBrbGFzczsKKyAgLyogU2V0dGluZyB0aGVzZSB0byBOVUxMIG1ha2VzIGdzdF9iaW5fYWRkIGFuZCBfcmVtb3ZlIHJlZnVzZSB0byBsZXQgYW55b25lCisgICAqIG1lc3Mgd2l0aCBvdXIgaW50ZXJuYWxzLiAqLworICBiaW5fY2xhc3MtPmFkZF9lbGVtZW50ID0gTlVMTDsKKyAgYmluX2NsYXNzLT5yZW1vdmVfZWxlbWVudCA9IE5VTEw7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiUmVwbGF5R2FpbiB2b2x1bWUiLAorICAgICAgIkZpbHRlci9FZmZlY3QvQXVkaW8iLAorICAgICAgIkFwcGx5IFJlcGxheUdhaW4gdm9sdW1lIGFkanVzdG1lbnQiLAorICAgICAgIlJlblx4YzNceGE5IFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9yZ192b2x1bWVfZGVidWcsICJyZ3ZvbHVtZSIsIDAsCisgICAgICAiUmVwbGF5R2FpbiB2b2x1bWUgZWxlbWVudCIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JnX3ZvbHVtZV9pbml0IChHc3RSZ1ZvbHVtZSAqIHNlbGYpCit7CisgIEdPYmplY3RDbGFzcyAqdm9sdW1lX2NsYXNzOworICBHc3RQYWQgKnZvbHVtZV9wYWQsICpnaG9zdF9wYWQ7CisKKyAgc2VsZi0+YWxidW1fbW9kZSA9IERFRkFVTFRfQUxCVU1fTU9ERTsKKyAgc2VsZi0+aGVhZHJvb20gPSBERUZBVUxUX0hFQURST09NOworICBzZWxmLT5wcmVfYW1wID0gREVGQVVMVF9QUkVfQU1QOworICBzZWxmLT5mYWxsYmFja19nYWluID0gREVGQVVMVF9GQUxMQkFDS19HQUlOOworICBzZWxmLT50YXJnZXRfZ2FpbiA9IDAuMDsKKyAgc2VsZi0+cmVzdWx0X2dhaW4gPSAwLjA7CisKKyAgc2VsZi0+dm9sdW1lX2VsZW1lbnQgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2b2x1bWUiLCAicmd2b2x1bWUtdm9sdW1lIik7CisgIGlmIChHX1VOTElLRUxZIChzZWxmLT52b2x1bWVfZWxlbWVudCA9PSBOVUxMKSkgeworICAgIEdzdE1lc3NhZ2UgKm1zZzsKKworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2VsZiwgImNvdWxkIG5vdCBjcmVhdGUgdm9sdW1lIGVsZW1lbnQiKTsKKyAgICBtc2cgPSBnc3RfbWlzc2luZ19lbGVtZW50X21lc3NhZ2VfbmV3IChHU1RfRUxFTUVOVF9DQVNUIChzZWxmKSwgInZvbHVtZSIpOworICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAoc2VsZiksIG1zZyk7CisKKyAgICAvKiBOb3RoaW5nIGVsc2UgdG8gZG8sIHdlIHdpbGwgcmVmdXNlIHRoZSBzdGF0ZSBjaGFuZ2UgZnJvbSBOVUxMIHRvIFJFQURZIHRvCisgICAgICogaW5kaWNhdGUgdGhhdCBzb21ldGhpbmcgd2VudCB2ZXJ5IHdyb25nLiAgSXQgaXMgZG91YnRmdWwgdGhhdCBzb21lb25lCisgICAgICogYXR0ZW1wdHMgY2hhbmdpbmcgb3VyIHN0YXRlIHRob3VnaCwgc2luY2Ugd2UgZW5kIHVwIGhhdmluZyBubyBwYWRzISAqLworICAgIHJldHVybjsKKyAgfQorCisgIHZvbHVtZV9jbGFzcyA9IEdfT0JKRUNUX0dFVF9DTEFTUyAoR19PQkpFQ1QgKHNlbGYtPnZvbHVtZV9lbGVtZW50KSk7CisgIHNlbGYtPm1heF92b2x1bWUgPSBHX1BBUkFNX1NQRUNfRE9VQkxFCisgICAgICAoZ19vYmplY3RfY2xhc3NfZmluZF9wcm9wZXJ0eSAodm9sdW1lX2NsYXNzLCAidm9sdW1lIikpLT5tYXhpbXVtOworCisgIEdTVF9CSU5fQ0xBU1MgKHBhcmVudF9jbGFzcyktPmFkZF9lbGVtZW50IChHU1RfQklOX0NBU1QgKHNlbGYpLAorICAgICAgc2VsZi0+dm9sdW1lX2VsZW1lbnQpOworCisgIHZvbHVtZV9wYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2VsZi0+dm9sdW1lX2VsZW1lbnQsICJzaW5rIik7CisgIGdob3N0X3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKCJzaW5rIiwgdm9sdW1lX3BhZCwKKyAgICAgIEdTVF9QQURfUEFEX1RFTVBMQVRFICh2b2x1bWVfcGFkKSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHZvbHVtZV9wYWQpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoZ2hvc3RfcGFkLCBnc3Rfcmdfdm9sdW1lX3NpbmtfZXZlbnQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChzZWxmKSwgZ2hvc3RfcGFkKTsKKworICB2b2x1bWVfcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNlbGYtPnZvbHVtZV9lbGVtZW50LCAic3JjIik7CisgIGdob3N0X3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKCJzcmMiLCB2b2x1bWVfcGFkLAorICAgICAgR1NUX1BBRF9QQURfVEVNUExBVEUgKHZvbHVtZV9wYWQpKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodm9sdW1lX3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHNlbGYpLCBnaG9zdF9wYWQpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JnX3ZvbHVtZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UmdWb2x1bWUgKnNlbGYgPSBHU1RfUkdfVk9MVU1FIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9BTEJVTV9NT0RFOgorICAgICAgc2VsZi0+YWxidW1fbW9kZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9IRUFEUk9PTToKKyAgICAgIHNlbGYtPmhlYWRyb29tID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUFJFX0FNUDoKKyAgICAgIHNlbGYtPnByZV9hbXAgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GQUxMQkFDS19HQUlOOgorICAgICAgc2VsZi0+ZmFsbGJhY2tfZ2FpbiA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorCisgIGdzdF9yZ192b2x1bWVfdXBkYXRlX2dhaW4gKHNlbGYpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3JnX3ZvbHVtZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UmdWb2x1bWUgKnNlbGYgPSBHU1RfUkdfVk9MVU1FIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9BTEJVTV9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNlbGYtPmFsYnVtX21vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0hFQURST09NOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgc2VsZi0+aGVhZHJvb20pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BSRV9BTVA6CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBzZWxmLT5wcmVfYW1wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GQUxMQkFDS19HQUlOOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgc2VsZi0+ZmFsbGJhY2tfZ2Fpbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEFSR0VUX0dBSU46CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBzZWxmLT50YXJnZXRfZ2Fpbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVTVUxUX0dBSU46CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBzZWxmLT5yZXN1bHRfZ2Fpbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfcmdfdm9sdW1lX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJnVm9sdW1lICpzZWxmID0gR1NUX1JHX1ZPTFVNRSAob2JqZWN0KTsKKworICBpZiAoc2VsZi0+dm9sdW1lX2VsZW1lbnQgIT0gTlVMTCkgeworICAgIC8qIE1hbnVhbGx5IHJlbW92ZSBvdXIgY2hpbGQgdXNpbmcgdGhlIGJpbiBpbXBsZW1lbnRhdGlvbiBvZiByZW1vdmVfZWxlbWVudC4KKyAgICAgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHdlIHByZXZlbnQgZ3N0X2Jpbl9yZW1vdmUgZnJvbSB3b3JraW5nLCB3aGljaCB0aGUKKyAgICAgKiBwYXJlbnQgZGlzcG9zZSBoYW5kbGVyIHdvdWxkIHVzZSBpZiB3ZSBoYWQgYW55IGNoaWxkcmVuIGxlZnQuICovCisgICAgR1NUX0JJTl9DTEFTUyAocGFyZW50X2NsYXNzKS0+cmVtb3ZlX2VsZW1lbnQgKEdTVF9CSU5fQ0FTVCAoc2VsZiksCisgICAgICAgIHNlbGYtPnZvbHVtZV9lbGVtZW50KTsKKyAgICBzZWxmLT52b2x1bWVfZWxlbWVudCA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3Rfcmdfdm9sdW1lX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJnVm9sdW1lICpzZWxmID0gR1NUX1JHX1ZPTFVNRSAoZWxlbWVudCk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJlczsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKworICAgICAgaWYgKEdfVU5MSUtFTFkgKHNlbGYtPnZvbHVtZV9lbGVtZW50ID09IE5VTEwpKSB7CisgICAgICAgIC8qIENyZWF0aW5nIG91ciBjaGlsZCB2b2x1bWUgZWxlbWVudCBpbiBfaW5pdCBmYWlsZWQuICovCisgICAgICAgIHJldHVybiBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisKKyAgICAgIGdzdF9yZ192b2x1bWVfcmVzZXQgKHNlbGYpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXMgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICByZXR1cm4gcmVzOworfQorCisvKiBFdmVudCBmdW5jdGlvbiBmb3IgdGhlIGdob3N0IHNpbmsgcGFkLiAqLworc3RhdGljIGdib29sZWFuCitnc3Rfcmdfdm9sdW1lX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSZ1ZvbHVtZSAqc2VsZjsKKyAgR3N0RXZlbnQgKnNlbmRfZXZlbnQgPSBldmVudDsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHNlbGYgPSBHU1RfUkdfVk9MVU1FIChwYXJlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1RBRzoKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNlbGYsICJyZWNlaXZlZCB0YWcgZXZlbnQiKTsKKworICAgICAgc2VuZF9ldmVudCA9IGdzdF9yZ192b2x1bWVfdGFnX2V2ZW50IChzZWxmLCBldmVudCk7CisKKyAgICAgIGlmIChzZW5kX2V2ZW50ID09IE5VTEwpCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChzZWxmLCAiYWxsIHRhZ3MgaGFuZGxlZCwgZHJvcHBpbmcgZXZlbnQiKTsKKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisKKyAgICAgIGdzdF9yZ192b2x1bWVfcmVzZXQgKHNlbGYpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoR19MSUtFTFkgKHNlbmRfZXZlbnQgIT0gTlVMTCkpCisgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgc2VuZF9ldmVudCk7CisgIGVsc2UKKyAgICByZXMgPSBUUlVFOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RFdmVudCAqCitnc3Rfcmdfdm9sdW1lX3RhZ19ldmVudCAoR3N0UmdWb2x1bWUgKiBzZWxmLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsKKyAgZ2Jvb2xlYW4gaGFzX3RyYWNrX2dhaW4sIGhhc190cmFja19wZWFrLCBoYXNfYWxidW1fZ2FpbiwgaGFzX2FsYnVtX3BlYWs7CisgIGdib29sZWFuIGhhc19yZWZfbGV2ZWw7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGV2ZW50ICE9IE5VTEwsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSA9PSBHU1RfRVZFTlRfVEFHLCBldmVudCk7CisKKyAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAoZXZlbnQsICZ0YWdfbGlzdCk7CisKKyAgaWYgKGdzdF90YWdfbGlzdF9pc19lbXB0eSAodGFnX2xpc3QpKQorICAgIHJldHVybiBldmVudDsKKworICBoYXNfdHJhY2tfZ2FpbiA9IGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwgR1NUX1RBR19UUkFDS19HQUlOLAorICAgICAgJnNlbGYtPnRyYWNrX2dhaW4pOworICBoYXNfdHJhY2tfcGVhayA9IGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwgR1NUX1RBR19UUkFDS19QRUFLLAorICAgICAgJnNlbGYtPnRyYWNrX3BlYWspOworICBoYXNfYWxidW1fZ2FpbiA9IGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwgR1NUX1RBR19BTEJVTV9HQUlOLAorICAgICAgJnNlbGYtPmFsYnVtX2dhaW4pOworICBoYXNfYWxidW1fcGVhayA9IGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwgR1NUX1RBR19BTEJVTV9QRUFLLAorICAgICAgJnNlbGYtPmFsYnVtX3BlYWspOworICBoYXNfcmVmX2xldmVsID0gZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ19saXN0LCBHU1RfVEFHX1JFRkVSRU5DRV9MRVZFTCwKKyAgICAgICZzZWxmLT5yZWZlcmVuY2VfbGV2ZWwpOworCisgIGlmICghaGFzX3RyYWNrX2dhaW4gJiYgIWhhc190cmFja19wZWFrICYmICFoYXNfYWxidW1fZ2FpbiAmJiAhaGFzX2FsYnVtX3BlYWspCisgICAgcmV0dXJuIGV2ZW50OworCisgIGlmIChoYXNfcmVmX2xldmVsICYmIChoYXNfdHJhY2tfZ2FpbiB8fCBoYXNfYWxidW1fZ2FpbikKKyAgICAgICYmIChBQlMgKHNlbGYtPnJlZmVyZW5jZV9sZXZlbCAtIFJHX1JFRkVSRU5DRV9MRVZFTCkgPiAxLmUtNikpIHsKKyAgICAvKiBMb2cgYSBtZXNzYWdlIHN0YXRpbmcgdGhlIGFtb3VudCBvZiBhZGp1c3RtZW50IHRoYXQgaXMgYXBwbGllZCBiZWxvdy4gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgICAiY29tcGVuc2F0aW5nIGZvciByZWZlcmVuY2UgbGV2ZWwgZGlmZmVyZW5jZSBieSAlIiBHQUlOX0ZPUk1BVCwKKyAgICAgICAgUkdfUkVGRVJFTkNFX0xFVkVMIC0gc2VsZi0+cmVmZXJlbmNlX2xldmVsKTsKKyAgfQorICBpZiAoaGFzX3RyYWNrX2dhaW4pIHsKKyAgICBzZWxmLT50cmFja19nYWluICs9IFJHX1JFRkVSRU5DRV9MRVZFTCAtIHNlbGYtPnJlZmVyZW5jZV9sZXZlbDsKKyAgfQorICBpZiAoaGFzX2FsYnVtX2dhaW4pIHsKKyAgICBzZWxmLT5hbGJ1bV9nYWluICs9IFJHX1JFRkVSRU5DRV9MRVZFTCAtIHNlbGYtPnJlZmVyZW5jZV9sZXZlbDsKKyAgfQorCisgIC8qIElnbm9yZSB2YWx1ZXMgdGhhdCBhcmUgb2J2aW91c2x5IGludmFsaWQuICovCisgIGlmIChHX1VOTElLRUxZIChoYXNfdHJhY2tfZ2FpbiAmJiAhVkFMSURfR0FJTiAoc2VsZi0+dHJhY2tfZ2FpbikpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwKKyAgICAgICAgImlnbm9yaW5nIGJvZ3VzIHRyYWNrIGdhaW4gdmFsdWUgJSIgR0FJTl9GT1JNQVQsIHNlbGYtPnRyYWNrX2dhaW4pOworICAgIGhhc190cmFja19nYWluID0gRkFMU0U7CisgIH0KKyAgaWYgKEdfVU5MSUtFTFkgKGhhc190cmFja19wZWFrICYmICFWQUxJRF9QRUFLIChzZWxmLT50cmFja19wZWFrKSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgICAiaWdub3JpbmcgYm9ndXMgdHJhY2sgcGVhayB2YWx1ZSAlIiBQRUFLX0ZPUk1BVCwgc2VsZi0+dHJhY2tfcGVhayk7CisgICAgaGFzX3RyYWNrX3BlYWsgPSBGQUxTRTsKKyAgfQorICBpZiAoR19VTkxJS0VMWSAoaGFzX2FsYnVtX2dhaW4gJiYgIVZBTElEX0dBSU4gKHNlbGYtPmFsYnVtX2dhaW4pKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICJpZ25vcmluZyBib2d1cyBhbGJ1bSBnYWluIHZhbHVlICUiIEdBSU5fRk9STUFULCBzZWxmLT5hbGJ1bV9nYWluKTsKKyAgICBoYXNfYWxidW1fZ2FpbiA9IEZBTFNFOworICB9CisgIGlmIChHX1VOTElLRUxZIChoYXNfYWxidW1fcGVhayAmJiAhVkFMSURfUEVBSyAoc2VsZi0+YWxidW1fcGVhaykpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwKKyAgICAgICAgImlnbm9yaW5nIGJvZ3VzIGFsYnVtIHBlYWsgdmFsdWUgJSIgUEVBS19GT1JNQVQsIHNlbGYtPmFsYnVtX3BlYWspOworICAgIGhhc19hbGJ1bV9wZWFrID0gRkFMU0U7CisgIH0KKworICAvKiBDbGFtcCBwZWFrcyA+MS4wLiAgRmxvYXQgYmFzZWQgZGVjb2RlcnMgY2FuIHByb2R1Y2Ugc3B1cmlvdXMgc2FtcGxlcyA+MS4wLAorICAgKiBjdXR0aW5nIHRoZXNlIGZpbGVzIGJhY2sgdG8gMS4wIHNob3VsZCBub3QgY2F1c2UgYW55IGF1ZGlibGUgZGlzdG9ydGlvbi4KKyAgICogVGhpcyBpcyBtb3N0IG9mdGVuIHNlZW4gd2l0aCBWb3JiaXMgZmlsZXMuICovCisgIGlmIChoYXNfdHJhY2tfcGVhayAmJiBzZWxmLT50cmFja19wZWFrID4gMS4pIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLAorICAgICAgICAiY2xhbXBpbmcgdHJhY2sgcGVhayAlIiBQRUFLX0ZPUk1BVCAiIHRvIDEuMCIsIHNlbGYtPnRyYWNrX3BlYWspOworICAgIHNlbGYtPnRyYWNrX3BlYWsgPSAxLjA7CisgIH0KKyAgaWYgKGhhc19hbGJ1bV9wZWFrICYmIHNlbGYtPmFsYnVtX3BlYWsgPiAxLikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsCisgICAgICAgICJjbGFtcGluZyBhbGJ1bSBwZWFrICUiIFBFQUtfRk9STUFUICIgdG8gMS4wIiwgc2VsZi0+YWxidW1fcGVhayk7CisgICAgc2VsZi0+YWxidW1fcGVhayA9IDEuMDsKKyAgfQorCisgIHNlbGYtPmhhc190cmFja19nYWluIHw9IGhhc190cmFja19nYWluOworICBzZWxmLT5oYXNfdHJhY2tfcGVhayB8PSBoYXNfdHJhY2tfcGVhazsKKyAgc2VsZi0+aGFzX2FsYnVtX2dhaW4gfD0gaGFzX2FsYnVtX2dhaW47CisgIHNlbGYtPmhhc19hbGJ1bV9wZWFrIHw9IGhhc19hbGJ1bV9wZWFrOworCisgIHRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X2NvcHkgKHRhZ19saXN0KTsKKyAgZ3N0X3RhZ19saXN0X3JlbW92ZV90YWcgKHRhZ19saXN0LCBHU1RfVEFHX1RSQUNLX0dBSU4pOworICBnc3RfdGFnX2xpc3RfcmVtb3ZlX3RhZyAodGFnX2xpc3QsIEdTVF9UQUdfVFJBQ0tfUEVBSyk7CisgIGdzdF90YWdfbGlzdF9yZW1vdmVfdGFnICh0YWdfbGlzdCwgR1NUX1RBR19BTEJVTV9HQUlOKTsKKyAgZ3N0X3RhZ19saXN0X3JlbW92ZV90YWcgKHRhZ19saXN0LCBHU1RfVEFHX0FMQlVNX1BFQUspOworICBnc3RfdGFnX2xpc3RfcmVtb3ZlX3RhZyAodGFnX2xpc3QsIEdTVF9UQUdfUkVGRVJFTkNFX0xFVkVMKTsKKworICBnc3Rfcmdfdm9sdW1lX3VwZGF0ZV9nYWluIChzZWxmKTsKKworICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgaWYgKGdzdF90YWdfbGlzdF9pc19lbXB0eSAodGFnX2xpc3QpKSB7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gZ3N0X2V2ZW50X25ld190YWcgKHRhZ19saXN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9yZ192b2x1bWVfcmVzZXQgKEdzdFJnVm9sdW1lICogc2VsZikKK3sKKyAgc2VsZi0+aGFzX3RyYWNrX2dhaW4gPSBGQUxTRTsKKyAgc2VsZi0+aGFzX3RyYWNrX3BlYWsgPSBGQUxTRTsKKyAgc2VsZi0+aGFzX2FsYnVtX2dhaW4gPSBGQUxTRTsKKyAgc2VsZi0+aGFzX2FsYnVtX3BlYWsgPSBGQUxTRTsKKworICBzZWxmLT5yZWZlcmVuY2VfbGV2ZWwgPSBSR19SRUZFUkVOQ0VfTEVWRUw7CisKKyAgZ3N0X3JnX3ZvbHVtZV91cGRhdGVfZ2FpbiAoc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfcmdfdm9sdW1lX3VwZGF0ZV9nYWluIChHc3RSZ1ZvbHVtZSAqIHNlbGYpCit7CisgIGdkb3VibGUgdGFyZ2V0X2dhaW4sIHJlc3VsdF9nYWluLCByZXN1bHRfdm9sdW1lOworICBnYm9vbGVhbiB0YXJnZXRfZ2Fpbl9jaGFuZ2VkLCByZXN1bHRfZ2Fpbl9jaGFuZ2VkOworCisgIGdzdF9yZ192b2x1bWVfZGV0ZXJtaW5lX2dhaW4gKHNlbGYsICZ0YXJnZXRfZ2FpbiwgJnJlc3VsdF9nYWluKTsKKworICByZXN1bHRfdm9sdW1lID0gREJfVE9fTElORUFSIChyZXN1bHRfZ2Fpbik7CisKKyAgLyogRW5zdXJlIHRoYXQgdGhlIHJlc3VsdCB2b2x1bWUgaXMgd2l0aGluIHRoZSByYW5nZSB0aGF0IHRoZSB2b2x1bWUgZWxlbWVudAorICAgKiBjYW4gaGFuZGxlLiAgQ3VycmVudGx5LCB0aGUgbGltaXQgaXMgMTAuICgrMjAgZEIpLCB3aGljaCBzaG91bGQgbm90IGJlCisgICAqIHJlc3RyaWN0aXZlLiAqLworICBpZiAoR19VTkxJS0VMWSAocmVzdWx0X3ZvbHVtZSA+IHNlbGYtPm1heF92b2x1bWUpKSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChzZWxmLAorICAgICAgICAiY2Fubm90IGhhbmRsZSByZXN1bHQgZ2FpbiBvZiAlIiBHQUlOX0ZPUk1BVCAiICglMC42ZiksIGFkanVzdGluZyIsCisgICAgICAgIHJlc3VsdF9nYWluLCByZXN1bHRfdm9sdW1lKTsKKworICAgIHJlc3VsdF92b2x1bWUgPSBzZWxmLT5tYXhfdm9sdW1lOworICAgIHJlc3VsdF9nYWluID0gTElORUFSX1RPX0RCIChyZXN1bHRfdm9sdW1lKTsKKyAgfQorCisgIC8qIERpcmVjdCBjb21wYXJpc29uIGlzIE9LIGluIHRoaXMgY2FzZS4gKi8KKyAgaWYgKHRhcmdldF9nYWluID09IHJlc3VsdF9nYWluKSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChzZWxmLAorICAgICAgICAicmVzdWx0IGdhaW4gaXMgJSIgR0FJTl9GT1JNQVQgIiAoJTAuNmYpLCBtYXRjaGluZyB0YXJnZXQiLAorICAgICAgICByZXN1bHRfZ2FpbiwgcmVzdWx0X3ZvbHVtZSk7CisgIH0gZWxzZSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChzZWxmLAorICAgICAgICAicmVzdWx0IGdhaW4gaXMgJSIgR0FJTl9GT1JNQVQgIiAoJTAuNmYpLCB0YXJnZXQgaXMgJSIgR0FJTl9GT1JNQVQsCisgICAgICAgIHJlc3VsdF9nYWluLCByZXN1bHRfdm9sdW1lLCB0YXJnZXRfZ2Fpbik7CisgIH0KKworICB0YXJnZXRfZ2Fpbl9jaGFuZ2VkID0gKHNlbGYtPnRhcmdldF9nYWluICE9IHRhcmdldF9nYWluKTsKKyAgcmVzdWx0X2dhaW5fY2hhbmdlZCA9IChzZWxmLT5yZXN1bHRfZ2FpbiAhPSByZXN1bHRfZ2Fpbik7CisKKyAgc2VsZi0+dGFyZ2V0X2dhaW4gPSB0YXJnZXRfZ2FpbjsKKyAgc2VsZi0+cmVzdWx0X2dhaW4gPSByZXN1bHRfZ2FpbjsKKworICBnX29iamVjdF9zZXQgKHNlbGYtPnZvbHVtZV9lbGVtZW50LCAidm9sdW1lIiwgcmVzdWx0X3ZvbHVtZSwgTlVMTCk7CisKKyAgaWYgKHRhcmdldF9nYWluX2NoYW5nZWQpCisgICAgZ19vYmplY3Rfbm90aWZ5ICgoR09iamVjdCAqKSBzZWxmLCAidGFyZ2V0LWdhaW4iKTsKKyAgaWYgKHJlc3VsdF9nYWluX2NoYW5nZWQpCisgICAgZ19vYmplY3Rfbm90aWZ5ICgoR09iamVjdCAqKSBzZWxmLCAicmVzdWx0LWdhaW4iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitnc3Rfcmdfdm9sdW1lX2RldGVybWluZV9nYWluIChHc3RSZ1ZvbHVtZSAqIHNlbGYsIGdkb3VibGUgKiB0YXJnZXRfZ2FpbiwKKyAgICBnZG91YmxlICogcmVzdWx0X2dhaW4pCit7CisgIGdkb3VibGUgZ2FpbiwgcGVhazsKKworICBpZiAoIXNlbGYtPmhhc190cmFja19nYWluICYmICFzZWxmLT5oYXNfYWxidW1fZ2FpbikgeworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgInVzaW5nIGZhbGxiYWNrIGdhaW4iKTsKKyAgICBnYWluID0gc2VsZi0+ZmFsbGJhY2tfZ2FpbjsKKyAgICBwZWFrID0gMS4wOworCisgIH0gZWxzZSBpZiAoKHNlbGYtPmFsYnVtX21vZGUgJiYgc2VsZi0+aGFzX2FsYnVtX2dhaW4pCisgICAgICB8fCAoIXNlbGYtPmFsYnVtX21vZGUgJiYgIXNlbGYtPmhhc190cmFja19nYWluKSkgeworCisgICAgZ2FpbiA9IHNlbGYtPmFsYnVtX2dhaW47CisgICAgaWYgKEdfTElLRUxZIChzZWxmLT5oYXNfYWxidW1fcGVhaykpIHsKKyAgICAgIHBlYWsgPSBzZWxmLT5hbGJ1bV9wZWFrOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiYWxidW0gcGVhayBtaXNzaW5nLCBhc3N1bWluZyAxLjAiKTsKKyAgICAgIHBlYWsgPSAxLjA7CisgICAgfQorICAgIC8qIEZhbGxpbmcgYmFjayBmcm9tIHRyYWNrIHRvIGFsYnVtIGdhaW4gc2hvdWxkbid0IHJlYWxseSBoYXBwZW4uICovCisgICAgaWYgKEdfVU5MSUtFTFkgKCFzZWxmLT5hbGJ1bV9tb2RlKSkKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoc2VsZiwgImZhbGxpbmcgYmFjayB0byBhbGJ1bSBnYWluIik7CisKKyAgfSBlbHNlIHsKKyAgICAvKiAhYWxidW1fbW9kZSAmJiAhaGFzX2FsYnVtX2dhaW4gfHwgYWxidW1fbW9kZSAmJiBoYXNfdHJhY2tfZ2FpbiAqLworCisgICAgZ2FpbiA9IHNlbGYtPnRyYWNrX2dhaW47CisgICAgaWYgKEdfTElLRUxZIChzZWxmLT5oYXNfdHJhY2tfcGVhaykpIHsKKyAgICAgIHBlYWsgPSBzZWxmLT50cmFja19wZWFrOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAidHJhY2sgcGVhayBtaXNzaW5nLCBhc3N1bWluZyAxLjAiKTsKKyAgICAgIHBlYWsgPSAxLjA7CisgICAgfQorICAgIGlmIChzZWxmLT5hbGJ1bV9tb2RlKQorICAgICAgR1NUX0lORk9fT0JKRUNUIChzZWxmLCAiZmFsbGluZyBiYWNrIHRvIHRyYWNrIGdhaW4iKTsKKyAgfQorCisgIGdhaW4gKz0gc2VsZi0+cHJlX2FtcDsKKworICAqdGFyZ2V0X2dhaW4gPSBnYWluOworICAqcmVzdWx0X2dhaW4gPSBnYWluOworCisgIGlmIChMSU5FQVJfVE9fREIgKHBlYWspICsgZ2FpbiA+IHNlbGYtPmhlYWRyb29tKSB7CisgICAgKnJlc3VsdF9nYWluID0gTElORUFSX1RPX0RCICgxLiAvIHBlYWspICsgc2VsZi0+aGVhZHJvb207CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC9yZXBsYXlnYWluL2dzdHJndm9sdW1lLmggYi9nc3QvcmVwbGF5Z2Fpbi9nc3RyZ3ZvbHVtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYTVhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcmVwbGF5Z2Fpbi9nc3RyZ3ZvbHVtZS5oCkBAIC0wLDAgKzEsODggQEAKKy8qIEdTdHJlYW1lciBSZXBsYXlHYWluIHZvbHVtZSBhZGp1c3RtZW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlbmUgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKyAqCisgKiBnc3RyZ3ZvbHVtZS5oOiBFbGVtZW50IHRvIGFwcGx5IFJlcGxheUdhaW4gdm9sdW1lIGFkanVzdG1lbnQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9fR1NUX1JHX1ZPTFVNRV9IX18KKyNkZWZpbmUgX19HU1RfUkdfVk9MVU1FX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUkdfVk9MVU1FIFwKKyAgKGdzdF9yZ192b2x1bWVfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JHX1ZPTFVNRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JHX1ZPTFVNRSxHc3RSZ1ZvbHVtZSkpCisjZGVmaW5lIEdTVF9SR19WT0xVTUVfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUkdfVk9MVU1FLEdzdFJnVm9sdW1lQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUkdfVk9MVU1FKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUkdfVk9MVU1FKSkKKyNkZWZpbmUgR1NUX0lTX1JHX1ZPTFVNRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SR19WT0xVTUUpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UmdWb2x1bWUgR3N0UmdWb2x1bWU7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UmdWb2x1bWVDbGFzcyBHc3RSZ1ZvbHVtZUNsYXNzOworCisvKioKKyAqIEdzdFJnVm9sdW1lOgorICoKKyAqIE9wYXF1ZSBkYXRhIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RSZ1ZvbHVtZQoreworICBHc3RCaW4gYmluOworCisgIC8qPCBwcml2YXRlID4qLworCisgIEdzdEVsZW1lbnQgKnZvbHVtZV9lbGVtZW50OworICBnZG91YmxlIG1heF92b2x1bWU7CisKKyAgZ2Jvb2xlYW4gYWxidW1fbW9kZTsKKyAgZ2RvdWJsZSBoZWFkcm9vbTsKKyAgZ2RvdWJsZSBwcmVfYW1wOworICBnZG91YmxlIGZhbGxiYWNrX2dhaW47CisKKyAgZ2RvdWJsZSB0YXJnZXRfZ2FpbjsKKyAgZ2RvdWJsZSByZXN1bHRfZ2FpbjsKKworICBnZG91YmxlIHRyYWNrX2dhaW47CisgIGdkb3VibGUgdHJhY2tfcGVhazsKKyAgZ2RvdWJsZSBhbGJ1bV9nYWluOworICBnZG91YmxlIGFsYnVtX3BlYWs7CisKKyAgZ2Jvb2xlYW4gaGFzX3RyYWNrX2dhaW47CisgIGdib29sZWFuIGhhc190cmFja19wZWFrOworICBnYm9vbGVhbiBoYXNfYWxidW1fZ2FpbjsKKyAgZ2Jvb2xlYW4gaGFzX2FsYnVtX3BlYWs7CisKKyAgZ2RvdWJsZSByZWZlcmVuY2VfbGV2ZWw7Cit9OworCitzdHJ1Y3QgX0dzdFJnVm9sdW1lQ2xhc3MKK3sKKyAgR3N0QmluQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3JnX3ZvbHVtZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SR19WT0xVTUVfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcmVwbGF5Z2Fpbi9tZXNvbi5idWlsZCBiL2dzdC9yZXBsYXlnYWluL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NDM3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcmVwbGF5Z2Fpbi9tZXNvbi5idWlsZApAQCAtMCwwICsxLDE3IEBACityZXBsYXlnYWluX3NvdXJjZXMgPSBbCisgICdnc3RyZ2FuYWx5c2lzLmMnLAorICAnZ3N0cmdsaW1pdGVyLmMnLAorICAnZ3N0cmd2b2x1bWUuYycsCisgICdyZXBsYXlnYWluLmMnLAorICAncmdhbmFseXNpcy5jJywKK10KKworZ3N0cmVwbGF5Z2FpbiA9IGxpYnJhcnkoJ2dzdHJlcGxheWdhaW4nLAorICByZXBsYXlnYWluX3NvdXJjZXMsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0X2RlcCwgZ3N0YmFzZV9kZXAsIGdzdHBidXRpbHNfZGVwLCBnc3RhdWRpb19kZXAsIGxpYm1dLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQorCmRpZmYgLS1naXQgYS9nc3QvcmVwbGF5Z2Fpbi9yZXBsYXlnYWluLmMgYi9nc3QvcmVwbGF5Z2Fpbi9yZXBsYXlnYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0OTllZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9yZXBsYXlnYWluL3JlcGxheWdhaW4uYwpAQCAtMCwwICsxLDUzIEBACisvKiBHU3RyZWFtZXIgUmVwbGF5R2FpbiBwbHVnaW4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVuZSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorICogCisgKiByZXBsYXlnYWluLmM6IFBsdWdpbiBwcm92aWRpbmcgUmVwbGF5R2FpbiByZWxhdGVkIGVsZW1lbnRzCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaW5jbHVkZSAiZ3N0cmdhbmFseXNpcy5oIgorI2luY2x1ZGUgImdzdHJnbGltaXRlci5oIgorI2luY2x1ZGUgImdzdHJndm9sdW1lLmgiCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicmdhbmFseXNpcyIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfUkdfQU5BTFlTSVMpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJyZ2xpbWl0ZXIiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX1JHX0xJTUlURVIpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJyZ3ZvbHVtZSIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfUkdfVk9MVU1FKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwgR1NUX1ZFUlNJT05fTUlOT1IsIHJlcGxheWdhaW4sCisgICAgIlJlcGxheUdhaW4gdm9sdW1lIG5vcm1hbGl6YXRpb24iLCBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsCisgICAgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKTsKZGlmZiAtLWdpdCBhL2dzdC9yZXBsYXlnYWluL3JlcGxheWdhaW4uaCBiL2dzdC9yZXBsYXlnYWluL3JlcGxheWdhaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWJlODg4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3JlcGxheWdhaW4vcmVwbGF5Z2Fpbi5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIEdTdHJlYW1lciBSZXBsYXlHYWluIHBsdWdpbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSZW5lIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisgKgorICogcmVwbGF5Z2Fpbi5oOiBQbHVnaW4gcHJvdmlkaW5nIFJlcGxheUdhaW4gcmVsYXRlZCBlbGVtZW50cworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX19SRVBMQVlHQUlOX0hfXworI2RlZmluZSBfX1JFUExBWUdBSU5fSF9fCisKK0dfQkVHSU5fREVDTFMKKworLyogUmVmZXJlbmNlIGxldmVsIChpbiBkQlNQTCkuICBUaGUgMjAwMSBwcm9wb3NhbCBzcGVjaWZpZXMgODMuICBUaGlzIHdhcworICogY2hhbmdlZCBsYXRlciBpbiBhbGwgaW1wbGVtZW50YXRpb25zIHRvIDg5LCB3aGljaCBpcyB0aGUgbmV3LCBvZmZpY2FsIHZhbHVlOgorICogRGF2aWQgUm9iaW5zb24gYWNrbm93bGVkZ2VkIHRoZSBjaGFuZ2UgYnV0IGRpZG4ndCB1cGRhdGUgdGhlIHdlYnNpdGUgeWV0LiAqLworCisjZGVmaW5lIFJHX1JFRkVSRU5DRV9MRVZFTCA4OS4KKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fUkVQTEFZR0FJTl9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9yZXBsYXlnYWluL3JnYW5hbHlzaXMuYyBiL2dzdC9yZXBsYXlnYWluL3JnYW5hbHlzaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDQwMzc2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3JlcGxheWdhaW4vcmdhbmFseXNpcy5jCkBAIC0wLDAgKzEsODI0IEBACisvKiBHU3RyZWFtZXIgUmVwbGF5R2FpbiBhbmFseXNpcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSZW5lIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgRGF2aWQgUm9iaW5zb24gPERhdmlkQFJvYmluc29uLm9yZz4KKyAqICAgICAgICAgICAgICAgICAgICBHbGVuIFNhd3llciA8Z2xlbnNhd3llckBob3RtYWlsLmNvbT4KKyAqCisgKiByZ2FuYWx5c2lzLmM6IEFuYWx5emUgcmF3IGF1ZGlvIGRhdGEgaW4gYWNjb3JkYW5jZSB3aXRoIFJlcGxheUdhaW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKiBCYXNlZCBvbiBjb2RlIHdpdGggQ29weXJpZ2h0IChDKSAyMDAxIERhdmlkIFJvYmluc29uCisgKiA8RGF2aWRAUm9iaW5zb24ub3JnPiBhbmQgR2xlbiBTYXd5ZXIgPGdsZW5zYXd5ZXJAaG90bWFpbC5jb20+LAorICogd2hpY2ggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExHUEwgYXMgcGFydCBvZiB0aGUgdm9yYmlzZ2FpbgorICogcHJvZ3JhbS4gIFRoZSBvcmlnaW5hbCBjb2RlIGFsc28gbWVudGlvbnMgRnJhbmsgS2xlbW0KKyAqIChodHRwOi8vd3d3LnVuaS1qZW5hLmRlL35wZmsvbXBwLykgZm9yIGhhdmluZyBjb250cmlidXRlZCBsb3RzIG9mCisgKiBnb29kIGNvZGUuICBTcGVjaWZpY2FsbHksIHRoaXMgaXMgYmFzZWQgb24gdGhlIGZpbGUKKyAqICJnYWluX2FuYWx5c2lzLmMiIGZyb20gdm9yYmlzZ2FpbiB2ZXJzaW9uIDAuMzQuCisgKi8KKworLyogUm9vbSBmb3IgZnV0dXJlIGltcHJvdmVtZW50OiBNb25vIGRhdGEgaXMgY3VycmVudGx5IGluIGZhY3QgY29waWVkCisgKiB0byB0d28gY2hhbm5lbHMgd2hpY2ggZ2V0IHByb2Nlc3NlZCBub3JtYWxseS4gIFRoaXMgbWVhbnMgdGhhdCBtb25vCisgKiBpbnB1dCBkYXRhIGlzIHByb2Nlc3NlZCB0d2ljZS4KKyAqLworCisvKiBIZWxwZnVsIGluZm9ybWF0aW9uIGZvciB1bmRlcnN0YW5kaW5nIHRoaXMgY29kZTogVGhlIHR3byBJSVIKKyAqIGZpbHRlcnMgZGVwZW5kIG9uIHByZXZpb3VzIGlucHV0IF9hbmRfIHByZXZpb3VzIG91dHB1dCBzYW1wbGVzICh1cAorICogdG8gdGhlIGZpbHRlcidzIG9yZGVyIG51bWJlciBvZiBzYW1wbGVzKS4gIFRoaXMgZXhwbGFpbnMgdGhlIHdob2xlCisgKiBsb3Qgb2YgbWVtY3B5J2luZyBkb25lIGluIHJnX2FuYWx5c2lzX2FuYWx5emUgYW5kIHdoeSB0aGUgY29udGV4dAorICogaG9sZHMgc28gbWFueSBidWZmZXJzLgorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSAicmdhbmFseXNpcy5oIgorCisjZGVmaW5lIFlVTEVfT1JERVIgICAgICAgICAxMAorI2RlZmluZSBCVVRURVJfT1JERVIgICAgICAgIDIKKy8qIFBlcmNlbnRpbGUgd2hpY2ggaXMgbG91ZGVyIHRoYW4gdGhlIHByb3Bvc2VkIGxldmVsOiAqLworI2RlZmluZSBSTVNfUEVSQ0VOVElMRSAgICAgOTUKKy8qIER1cmF0aW9uIG9mIFJNUyB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzOiAqLworI2RlZmluZSBSTVNfV0lORE9XX01TRUNTICAgNTAKKy8qIEhpc3RvZ3JhbSBhcnJheSBlbGVtZW50cyBwZXIgZEI6ICovCisjZGVmaW5lIFNURVBTX1BFUl9EQiAgICAgIDEwMAorLyogSGlzdG9ncmFtIHVwcGVyIGJvdW5kIGluIGRCIChub3JtYWwgbWF4LiB2YWx1ZXMgaW4gdGhlIHdpbGQgYXJlCisgKiBhc3N1bWVkIHRvIGJlIGFyb3VuZCA3MCwgODAgZEIpOiAqLworI2RlZmluZSBNQVhfREIgICAgICAgICAgICAxMjAKKy8qIENhbGlicmF0aW9uIHZhbHVlOiAqLworI2RlZmluZSBQSU5LX1JFRiAgICAgICAgICAgNjQuODIgICAgICAgIC8qIDI5ODY0MDg4Mzc5NSAqLworCisjZGVmaW5lIE1BWF9PUkRFUiAgICAgICAgIE1BWCAoQlVUVEVSX09SREVSLCBZVUxFX09SREVSKQorI2RlZmluZSBNQVhfU0FNUExFX1JBVEUgICA0ODAwMAorLyogVGhlICsgOTk5IGhhcyB0aGUgZWZmZWN0IG9mIGNlaWwoKWluZzogKi8KKyNkZWZpbmUgTUFYX1NBTVBMRV9XSU5ET1cgKGd1aW50KSBcCisgICgoTUFYX1NBTVBMRV9SQVRFICogUk1TX1dJTkRPV19NU0VDUyArIDk5OSkgLyAxMDAwKQorCisvKiBBbmFseXNpcyByZXN1bHQgYWNjdW11bGF0b3IuICovCisKK3N0cnVjdCBfUmdBbmFseXNpc0FjYworeworICBndWludDMyIGhpc3RvZ3JhbVtTVEVQU19QRVJfREIgKiBNQVhfREJdOworICBnZG91YmxlIHBlYWs7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfUmdBbmFseXNpc0FjYyBSZ0FuYWx5c2lzQWNjOworCisvKiBBbmFseXNpcyBjb250ZXh0LiAqLworCitzdHJ1Y3QgX1JnQW5hbHlzaXNDdHgKK3sKKyAgLyogRmlsdGVyIGJ1ZmZlcnMgZm9yIGxlZnQgY2hhbm5lbC4gKi8KKyAgZ2Zsb2F0IGlucHJlYnVmX2xbTUFYX09SREVSICogMl07CisgIGdmbG9hdCAqaW5wcmVfbDsKKyAgZ2Zsb2F0IHN0ZXBidWZfbFtNQVhfU0FNUExFX1dJTkRPVyArIE1BWF9PUkRFUl07CisgIGdmbG9hdCAqc3RlcF9sOworICBnZmxvYXQgb3V0YnVmX2xbTUFYX1NBTVBMRV9XSU5ET1cgKyBNQVhfT1JERVJdOworICBnZmxvYXQgKm91dF9sOworICAvKiBGaWx0ZXIgYnVmZmVycyBmb3IgcmlnaHQgY2hhbm5lbC4gKi8KKyAgZ2Zsb2F0IGlucHJlYnVmX3JbTUFYX09SREVSICogMl07CisgIGdmbG9hdCAqaW5wcmVfcjsKKyAgZ2Zsb2F0IHN0ZXBidWZfcltNQVhfU0FNUExFX1dJTkRPVyArIE1BWF9PUkRFUl07CisgIGdmbG9hdCAqc3RlcF9yOworICBnZmxvYXQgb3V0YnVmX3JbTUFYX1NBTVBMRV9XSU5ET1cgKyBNQVhfT1JERVJdOworICBnZmxvYXQgKm91dF9yOworCisgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWNoIGR1cmF0aW9uIG9mIHRoZSBSTVMgd2luZG93OiAqLworICBndWludCB3aW5kb3dfbl9zYW1wbGVzOworICAvKiBQcm9ncmVzcyBvZiB0aGUgcnVubmluZyB3aW5kb3c6ICovCisgIGd1aW50IHdpbmRvd19uX3NhbXBsZXNfZG9uZTsKKyAgZ2RvdWJsZSB3aW5kb3dfc3F1YXJlX3N1bTsKKworICBnaW50IHNhbXBsZV9yYXRlOworICBnaW50IHNhbXBsZV9yYXRlX2luZGV4OworCisgIFJnQW5hbHlzaXNBY2MgdHJhY2s7CisgIFJnQW5hbHlzaXNBY2MgYWxidW07CisgIHZvaWQgKCpwb3N0X21lc3NhZ2UpIChncG9pbnRlciBhbmFseXNpcywKKyAgICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIEdzdENsb2NrVGltZSBkdXJhdGlvbiwgZ2RvdWJsZSByZ2xldmVsKTsKKyAgZ3BvaW50ZXIgYW5hbHlzaXM7CisgIC8qIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGN1cnJlbnQgaW5jb21pbmcgYnVmZmVyLiAqLworICBHc3RDbG9ja1RpbWUgYnVmZmVyX3RpbWVzdGFtcDsKKyAgLyogTnVtYmVyIG9mIHNhbXBsZXMgcHJvY2Vzc2VkIGluIGN1cnJlbnQgYnVmZmVyLCBkdXJpbmcgZW1pdF9zaWduYWwsCisgICAgIHRoaXMgd2lsbCBhbHdheXMgYmUgb24gYW4gUk1TIHdpbmRvdyBib3VuZGFyeS4gKi8KKyAgZ3VpbnQgYnVmZmVyX25fc2FtcGxlc19kb25lOworfTsKKworLyogRmlsdGVyIGNvZWZmaWNpZW50cyBmb3IgdGhlIElJUiBmaWx0ZXJzIHRoYXQgZm9ybSB0aGUgZXF1YWwKKyAqIGxvdWRuZXNzIGZpbHRlci4gIFhGaWx0ZXJbY3R4LT5zYW1wbGVfcmF0ZV9pbmRleF0gZ2l2ZXMgdGhlIGFycmF5CisgKiBvZiB0aGUgWCBjb2VmZmljaWVudHMgKEEgb3IgQikgZm9yIHRoZSBjb25maWd1cmVkIHNhbXBsZSByYXRlLiAqLworCisjaWZkZWYgX01TQ19WRVIKKy8qIERpc2FibGUgZG91YmxlLXRvLWZsb2F0IHdhcm5pbmc6ICovCisvKiBBIGJldHRlciBzb2x1dGlvbiB3b3VsZCBiZSB0byBhcHBlbmQgJ2YnIHRvIGVhY2ggY29uc3RhbnQsIGJ1dCB0aGF0CisgKiBtYWtlcyB0aGUgY29kZSB1Z2x5LiAqLworI3ByYWdtYSB3YXJuaW5nICggZGlzYWJsZSA6IDQzMDUgKQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBnZmxvYXQgQVl1bGVbOV1bMTFdID0geworICB7MS4sIC0zLjg0NjY0NjE3MTE4MDY3LCA3LjgxNTAxNjUzMDA1NTM4LCAtMTEuMzQxNzAzNTUxMzIwNDIsCisgICAgICAgIDEzLjA1NTA0MjE5MzI3NTQ1LCAtMTIuMjg3NTk4OTUxNDUyOTQsIDkuNDgyOTM4MDYzMTk3OTAsCisgICAgICAgIC01Ljg3MjU3ODYxNzc1OTk5LCAyLjc1NDY1ODYxODc0NjEzLCAtMC44Njk4NDM3NjU5MzU1MSwKKyAgICAgIDAuMTM5MTkzMTQ1Njc0MzJ9LAorICB7MS4sIC0zLjQ3ODQ1OTQ4NTUwMDcxLCA2LjM2MzE3Nzc3NTY2MTQ4LCAtOC41NDc1MTUyNzQ3MTg3NCwgOS40NzY5MzYwNzgwMTI4MCwKKyAgICAgICAgLTguODE0OTg2ODEzNzAxNTUsIDYuODU0MDE1NDA5MzY5OTgsIC00LjM5NDcwOTk2MDc5NTU5LAorICAgICAgMi4xOTYxMTY4NDg5MDc3NCwgLTAuNzUxMDQzMDI0NTE0MzIsIDAuMTMxNDkzMTc5NTg4MDh9LAorICB7MS4sIC0yLjM3ODk4ODM0OTczMDg0LCAyLjg0ODY4MTUxMTU2MzI3LCAtMi42NDU3NzE3MDIyOTgyNSwgMi4yMzY5NzY1NzQ1MTcxMywKKyAgICAgICAgLTEuNjcxNDgxNTMzNjc2MDIsIDEuMDA1OTU5NTQ4MDg1NDcsIC0wLjQ1OTUzNDU4MDU0OTgzLAorICAgICAgMC4xNjM3ODE2NDg1ODU5NiwgLTAuMDUwMzIwNzc3MTcxMzEsIDAuMDIzNDc4OTc0MDcwMjB9LAorICB7MS4sIC0xLjYxMjczMTY1MTM3MjQ3LCAxLjA3OTc3NDkyMjU5OTcwLCAtMC4yNTY1NjI1Nzc1NDA3MCwKKyAgICAgICAgLTAuMTYyNzY3MTkxMjA0NDAsIC0wLjIyNjM4ODkzNzczOTA2LCAwLjM5MTIwODAwNzg4Mjg0LAorICAgICAgICAtMC4yMjEzODEzODk1NDkyNSwgMC4wNDUwMDIzNTM4NzM1MiwgMC4wMjAwNTg1MTgwNjUwMSwKKyAgICAgIDAuMDAzMDI0MzkwOTU3NDF9LAorICB7MS4sIC0xLjQ5ODU4OTc5MzY3Nzk5LCAwLjg3MzUwMjcxNDE4MTg4LCAwLjEyMjA1MDIyMzA4MDg0LCAtMC44MDc3NDk0NDY3MTQzOCwKKyAgICAgICAgMC40Nzg1NDc5NDU2MjMyNiwgLTAuMTI0NTM0NTgxNDAwMTksIC0wLjA0MDY3NTEwMTk3MDE0LAorICAgICAgMC4wODMzMzc1NTI4NDEwNywgLTAuMDQyMzczNDgwMjU3NDYsIDAuMDI5NzcyMDczMTk5MjV9LAorICB7MS4sIC0wLjYyODIwNjE5MjMzNjcxLCAwLjI5NjYxNzgzNzA2MzY2LCAtMC4zNzI1NjM3Mjk0MjQwMCwgMC4wMDIxMzc2Nzg1NzEyNCwKKyAgICAgICAgLTAuNDIwMjk4MjAxNzA5MTgsIDAuMjIxOTk2NTA1NjQ4MjQsIDAuMDA2MTM0MjQzNTA2ODIsIDAuMDY3NDc2MjA3NDQ2ODMsCisgICAgICAwLjA1Nzg0ODIwMzc1ODAxLCAwLjAzMjIyNzU0MDcyMTczfSwKKyAgezEuLCAtMS4wNDgwMDMzNTEyNjM0OSwgMC4yOTE1NjMxMTk3MTI0OSwgLTAuMjY4MDYwMDEwNDI5NDcsIDAuMDA4MTk5OTk2NDU4NTgsCisgICAgICAgIDAuNDUwNTQ3MzQ1MDUwMDgsIC0wLjMzMDMyNDAzMzE0MDA2LCAwLjA2NzM5MzY4MzMzMTEwLAorICAgICAgLTAuMDQ3ODQyNTQyMjkwMzMsIDAuMDE2Mzk5MDc4MzYxODksIDAuMDE4MDczNjQzMjM1NzN9LAorICB7MS4sIC0wLjUxMDM1MzI3MDk1MTg0LCAtMC4zMTg2MzU2MzMyNTI0NSwgLTAuMjAyNTY0MTM0ODQ0NzcsCisgICAgICAgIDAuMTQ3MjgxNTQxMzQzMzAsIDAuMzg5NTI2Mzk5Nzg5OTksIC0wLjIzMzEzMjcxODgwODY4LAorICAgICAgICAtMC4wNTI0NjAxOTAyNDQ2MywgLTAuMDI1MDU5NjE3MjQwNTMsIDAuMDI0NDIzNTczMTYwOTksCisgICAgICAwLjAxODE4ODAxMTExNTAzfSwKKyAgezEuLCAtMC4yNTA0OTg3MTk1NjAyMCwgLTAuNDMxOTM5NDIzMTExMTQsIC0wLjAzNDI0NjgxMDE3Njc1LAorICAgICAgICAtMC4wNDY3ODMyODc4NDI0MiwgMC4yNjQwODMwMDIwMDk1NSwgMC4xNTExMzEzMDUzMzIxNiwKKyAgICAgICAgLTAuMTc1NTY0OTMzNjY0NDksIC0wLjE4ODIzMDA5MjYyMTE1LCAwLjA1NDc3NzIwNDI4Njc0LAorICAgICAgMC4wNDcwNDQwOTY4ODEyMH0KK307CisKK3N0YXRpYyBjb25zdCBnZmxvYXQgQll1bGVbOV1bMTFdID0geworICB7MC4wMzg1NzU5OTQzNTIwMCwgLTAuMDIxNjAzNjcxODQxODUsIC0wLjAwMTIzMzk1MzE2ODUxLCAtMC4wMDAwOTI5MTY3Nzk1OSwKKyAgICAgICAgLTAuMDE2NTUyNjAzNDE2MTksIDAuMDIxNjE1MjY4NDMyNzQsIC0wLjAyMDc0MDQ1MjE1Mjg1LAorICAgICAgMC4wMDU5NDI5ODA2NTEyNSwgMC4wMDMwNjQyODAyMzE5MSwgMC4wMDAxMjAyNTMyMjAyNywgMC4wMDI4ODQ2MzY4MzkxNn0sCisgIHswLjA1NDE4NjU2NDA2NDMwLCAtMC4wMjkxMTAwNzgwODk0OCwgLTAuMDA4NDg3MDkzNzk4NTEsIC0wLjAwODUxMTY1NjQ1NDY5LAorICAgICAgICAtMC4wMDgzNDk5MDkwNDkzNiwgMC4wMjI0NTI5MzI1MzMzOSwgLTAuMDI1OTYzMzg1MTI5MTUsCisgICAgICAgIDAuMDE2MjQ4NjQ5NjI5NzUsIC0wLjAwMjQwODc5MDUxNTg0LCAwLjAwNjc0NjEzNjgyMjQ3LAorICAgICAgLTAuMDAxODc3NjM3NzczNjJ9LAorICB7MC4xNTQ1NzI5OTY4MTkyNCwgLTAuMDkzMzEwNDkwNTYzMTUsIC0wLjA2MjQ3ODgwMTUzNjUzLCAwLjAyMTYzNTQxODg4Nzk4LAorICAgICAgICAtMC4wNTU4ODM5MzMyOTg1NiwgMC4wNDc4MTQ3NjY3NDkyMSwgMC4wMDIyMjMxMjU5Nzc0MywgMC4wMzE3NDA5MjU0MDA0OSwKKyAgICAgIC0wLjAxMzkwNTg5NDIxODk4LCAwLjAwNjUxNDIwNjY3ODMxLCAtMC4wMDg4MTM2MjczMzgzOX0sCisgIHswLjMwMjk2OTA3MzE5MzI3LCAtMC4yMjYxMzk4ODY4MjEyMywgLTAuMDg1ODczMjM3MzA3NzIsIDAuMDMyODI5MzAxNzI2NjQsCisgICAgICAgIC0wLjAwOTE1NzAyOTMzNDM0LCAtMC4wMjM2NDE0MTIwMjUyMiwgLTAuMDA1ODQ0NTYwMzk5MTMsCisgICAgICAgIDAuMDYyNzYxMDEzMjE3NDksIC0wLjAwMDAwODI4MDg2NzQ4LCAwLjAwMjA1ODYxODg1NTY0LAorICAgICAgLTAuMDI5NTAxMzQ5ODMyODd9LAorICB7MC4zMzY0MjMwNDg1NjEzMiwgLTAuMjU1NzIyNDE0MjU1NzAsIC0wLjExODI4NTcwMTc3NTU1LCAwLjExOTIxMTQ4Njc1MjAzLAorICAgICAgICAtMC4wNzgzNDQ4OTYwOTQ3OSwgLTAuMDA0Njk5Nzc5MTQzODAsIC0wLjAwNTg5NTAwMjI0NDQwLAorICAgICAgICAwLjA1NzI0MjI4MTQwMzUxLCAwLjAwODMyMDQzOTgwNzczLCAtMC4wMTYzNTM4MTM4NDU0MCwKKyAgICAgIC0wLjAxNzYwMTc2NTY4MTUwfSwKKyAgezAuNDQ5MTUyNTY2MDg0NTAsIC0wLjE0MzUxNzU3NDY0NTQ3LCAtMC4yMjc4NDM5NDQyOTc0OSwgLTAuMDE0MTkxNDAxMDA1NTEsCisgICAgICAgIDAuMDQwNzgyNjI3OTcxMzksIC0wLjEyMzk4MTYzMzgxNzQ4LCAwLjA0MDk3NTY1MTM1NjQ4LCAwLjEwNDc4NTAzNjAwMjUxLAorICAgICAgLTAuMDE4NjM4ODc4MTA5MjcsIC0wLjAzMTkzNDI4NDM4OTE1LCAwLjAwNTQxOTA3NzQ4NzA3fSwKKyAgezAuNTY2MTk0NzA3NTc2NDEsIC0wLjc1NDY0NDU2OTM5MzAyLCAwLjE2MjQyMTM3NzQyMjMwLCAwLjE2NzQ0MjQzNDkzNjcyLAorICAgICAgICAtMC4xODkwMTYwNDE5OTYwOSwgMC4zMDkzMTc4Mjg0MTgzMCwgLTAuMjc1NjI5NjE5ODYyMjQsCisgICAgICAgIDAuMDA2NDczMTA2NzcyNDYsIDAuMDg2NDc1MDM3ODAzNTEsIC0wLjAzNzg4OTg0NTU0ODQwLAorICAgICAgLTAuMDA1ODgyMTU0NDM0MjF9LAorICB7MC41ODEwMDQ5NDk2MDU1MywgLTAuNTMxNzQ5MDkwNTg1NzgsIC0wLjE0Mjg5Nzk5MDM0MjUzLCAwLjE3NTIwNzA0ODM1NTIyLAorICAgICAgICAwLjAyMzc3OTQ1MjE3NjE1LCAwLjE1NTU4NDQ5MTM1NTczLCAtMC4yNTM0NDc5MDA1OTM1MywgMC4wMTYyODQ2MjQwNjMzMywKKyAgICAgIDAuMDY5MjA0Njc3NjM5NTksIC0wLjAzNzIxNjExMzk1ODAxLCAtMC4wMDc0OTYxODc5NzE3Mn0sCisgIHswLjUzNjQ4Nzg5MjU1MTA1LCAtMC40MjE2MzAzNDM1MDY5NiwgLTAuMDAyNzU5NTM2MTE5MjksIDAuMDQyNjc4NDIyMTk0MTUsCisgICAgICAgIC0wLjEwMjE0ODY0MTc5Njc2LCAwLjE0NTkwNzcyMjg5Mzg4LCAtMC4wMjQ1OTg2NDg1OTM0NSwKKyAgICAgICAgLTAuMTEyMDIzMTUxOTUzODgsIC0wLjA0MDYwMDM0MTI3MDAwLCAwLjA0Nzg4NjY1NTQ4MTgwLAorICAgICAgLTAuMDIyMTc5MzY4MDExMzR9Cit9OworCitzdGF0aWMgY29uc3QgZ2Zsb2F0IEFCdXR0ZXJbOV1bM10gPSB7CisgIHsxLiwgLTEuOTcyMjMzNzI5MTk1MjcsIDAuOTcyNjEzOTY5MzEzMDZ9LAorICB7MS4sIC0xLjk2OTc3ODU1NTgyNjE4LCAwLjk3MDIyODQ3NTY2MzUwfSwKKyAgezEuLCAtMS45NTgzNTM4MDk3NTM5OCwgMC45NTkyMDM0OTk2NTQ1OX0sCisgIHsxLiwgLTEuOTUwMDI3NTkxNDk4NzgsIDAuOTUxMjQ2MTM2Njk4MzV9LAorICB7MS4sIC0xLjk0NTYxMDIzNTY2NTI3LCAwLjk0NzA1MDcwNDI2MTE4fSwKKyAgezEuLCAtMS45Mjc4MzI4Njk3NzAzNiwgMC45MzAzNDc3NTIzNDI2OH0sCisgIHsxLiwgLTEuOTE4NTg5NTMwMzM3ODQsIDAuOTIxNzc2MTg3NjgzODF9LAorICB7MS4sIC0xLjkxNTQyMTA4MDc0NzgwLCAwLjkxODg1NTU4MzIzNjI1fSwKKyAgezEuLCAtMS44ODkwMzMwNzkzOTQ1MiwgMC44OTQ4NzQzNDQ2MTY2NH0KK307CisKK3N0YXRpYyBjb25zdCBnZmxvYXQgQkJ1dHRlcls5XVszXSA9IHsKKyAgezAuOTg2MjExOTI0NjI3MDgsIC0xLjk3MjQyMzg0OTI1NDE2LCAwLjk4NjIxMTkyNDYyNzA4fSwKKyAgezAuOTg1MDAxNzU3ODcyNDIsIC0xLjk3MDAwMzUxNTc0NDg0LCAwLjk4NTAwMTc1Nzg3MjQyfSwKKyAgezAuOTc5Mzg5MzI3MzUyMTQsIC0xLjk1ODc3ODY1NDcwNDI4LCAwLjk3OTM4OTMyNzM1MjE0fSwKKyAgezAuOTc1MzE4NDMyMDQ5MjgsIC0xLjk1MDYzNjg2NDA5ODU3LCAwLjk3NTMxODQzMjA0OTI4fSwKKyAgezAuOTczMTY1MjM0OTgxNjEsIC0xLjk0NjMzMDQ2OTk2MzIzLCAwLjk3MzE2NTIzNDk4MTYxfSwKKyAgezAuOTY0NTQ1MTU1NTI4MjYsIC0xLjkyOTA5MDMxMTA1NjUyLCAwLjk2NDU0NTE1NTUyODI2fSwKKyAgezAuOTYwMDkxNDI5NTA1NDEsIC0xLjkyMDE4Mjg1OTAxMDgyLCAwLjk2MDA5MTQyOTUwNTQxfSwKKyAgezAuOTU4NTY5MTY1OTk2MDEsIC0xLjkxNzEzODMzMTk5MjAzLCAwLjk1ODU2OTE2NTk5NjAxfSwKKyAgezAuOTQ1OTc2ODU2MDAyNzksIC0xLjg5MTk1MzcxMjAwNTU4LCAwLjk0NTk3Njg1NjAwMjc5fQorfTsKKworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcgKCBkZWZhdWx0IDogNDMwNSApCisjZW5kaWYKKworLyogRmlsdGVyIGZ1bmN0aW9ucy4gIFRoZXNlIGFjY2VzcyBlbGVtZW50cyB3aXRoIG5lZ2F0aXZlIGluZGljZXMgb2YKKyAqIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFycmF5cyAodXAgdG8gdGhlIGZpbHRlcidzIG9yZGVyKS4gKi8KKworLyogRm9yIG11Y2ggYmV0dGVyIHBlcmZvcm1hbmNlLCB0aGUgZnVuY3Rpb24gYmVsb3cgaGFzIGJlZW4KKyAqIGltcGxlbWVudGVkIGJ5IHVucm9sbGluZyB0aGUgaW5uZXIgbG9vcCBmb3Igb3VyIHR3byB1c2UgY2FzZXMuICovCisKKy8qCisgKiBzdGF0aWMgaW5saW5lIHZvaWQKKyAqIGFwcGx5X2ZpbHRlciAoY29uc3QgZ2Zsb2F0ICogaW5wdXQsIGdmbG9hdCAqIG91dHB1dCwgZ3VpbnQgbl9zYW1wbGVzLAorICogICAgIGNvbnN0IGdmbG9hdCAqIGEsIGNvbnN0IGdmbG9hdCAqIGIsIGd1aW50IG9yZGVyKQorICogeworICogICBnZmxvYXQgeTsKKyAqICAgZ2ludCBpLCBrOworICogCisgKiAgIGZvciAoaSA9IDA7IGkgPCBuX3NhbXBsZXM7IGkrKykgeworICogICAgIHkgPSBpbnB1dFtpXSAqIGJbMF07CisgKiAgICAgZm9yIChrID0gMTsgayA8PSBvcmRlcjsgaysrKQorICogICAgICAgeSArPSBpbnB1dFtpIC0ga10gKiBiW2tdIC0gb3V0cHV0W2kgLSBrXSAqIGFba107CisgKiAgICAgb3V0cHV0W2ldID0geTsKKyAqICAgfQorICogfQorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAoreXVsZV9maWx0ZXIgKGNvbnN0IGdmbG9hdCAqIGlucHV0LCBnZmxvYXQgKiBvdXRwdXQsCisgICAgY29uc3QgZ2Zsb2F0ICogYSwgY29uc3QgZ2Zsb2F0ICogYikKK3sKKyAgLyogMWUtMTAgaXMgYWRkZWQgYmVsb3cgdG8gYXZvaWQgcnVubmluZyBpbnRvIGRlbm9ybWFscyB3aGVuIG9wZXJhdGluZyBvbgorICAgKiBuZWFyIHNpbGVuY2UuICovCisKKyAgb3V0cHV0WzBdID0gMWUtMTAgKyBpbnB1dFswXSAqIGJbMF0KKyAgICAgICsgaW5wdXRbLTFdICogYlsxXSAtIG91dHB1dFstMV0gKiBhWzFdCisgICAgICArIGlucHV0Wy0yXSAqIGJbMl0gLSBvdXRwdXRbLTJdICogYVsyXQorICAgICAgKyBpbnB1dFstM10gKiBiWzNdIC0gb3V0cHV0Wy0zXSAqIGFbM10KKyAgICAgICsgaW5wdXRbLTRdICogYls0XSAtIG91dHB1dFstNF0gKiBhWzRdCisgICAgICArIGlucHV0Wy01XSAqIGJbNV0gLSBvdXRwdXRbLTVdICogYVs1XQorICAgICAgKyBpbnB1dFstNl0gKiBiWzZdIC0gb3V0cHV0Wy02XSAqIGFbNl0KKyAgICAgICsgaW5wdXRbLTddICogYls3XSAtIG91dHB1dFstN10gKiBhWzddCisgICAgICArIGlucHV0Wy04XSAqIGJbOF0gLSBvdXRwdXRbLThdICogYVs4XQorICAgICAgKyBpbnB1dFstOV0gKiBiWzldIC0gb3V0cHV0Wy05XSAqIGFbOV0KKyAgICAgICsgaW5wdXRbLTEwXSAqIGJbMTBdIC0gb3V0cHV0Wy0xMF0gKiBhWzEwXTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitidXR0ZXJfZmlsdGVyIChjb25zdCBnZmxvYXQgKiBpbnB1dCwgZ2Zsb2F0ICogb3V0cHV0LAorICAgIGNvbnN0IGdmbG9hdCAqIGEsIGNvbnN0IGdmbG9hdCAqIGIpCit7CisgIG91dHB1dFswXSA9IGlucHV0WzBdICogYlswXQorICAgICAgKyBpbnB1dFstMV0gKiBiWzFdIC0gb3V0cHV0Wy0xXSAqIGFbMV0KKyAgICAgICsgaW5wdXRbLTJdICogYlsyXSAtIG91dHB1dFstMl0gKiBhWzJdOworfQorCisvKiBCZWNhdXNlIGJ1dHRlcl9maWx0ZXIgYW5kIHl1bGVfZmlsdGVyIGFyZSBpbmxpbmVkLCB0aGlzIGZ1bmN0aW9uIGlzCisgKiBhIGJpdCBibG93bi11cCAoY29kZS1zaXplIHdpc2UpLCBidXQgbm90IGlubGluaW5nIGdpdmVzIGEgY2EuIDQwJQorICogcGVyZm9ybWFuY2UgcGVuYWx0eS4gKi8KKworc3RhdGljIGlubGluZSB2b2lkCithcHBseV9maWx0ZXJzIChjb25zdCBSZ0FuYWx5c2lzQ3R4ICogY3R4LCBjb25zdCBnZmxvYXQgKiBpbnB1dF9sLAorICAgIGNvbnN0IGdmbG9hdCAqIGlucHV0X3IsIGd1aW50IG5fc2FtcGxlcykKK3sKKyAgY29uc3QgZ2Zsb2F0ICpheXVsZSA9IEFZdWxlW2N0eC0+c2FtcGxlX3JhdGVfaW5kZXhdOworICBjb25zdCBnZmxvYXQgKmJ5dWxlID0gQll1bGVbY3R4LT5zYW1wbGVfcmF0ZV9pbmRleF07CisgIGNvbnN0IGdmbG9hdCAqYWJ1dHRlciA9IEFCdXR0ZXJbY3R4LT5zYW1wbGVfcmF0ZV9pbmRleF07CisgIGNvbnN0IGdmbG9hdCAqYmJ1dHRlciA9IEJCdXR0ZXJbY3R4LT5zYW1wbGVfcmF0ZV9pbmRleF07CisgIGdpbnQgcG9zID0gY3R4LT53aW5kb3dfbl9zYW1wbGVzX2RvbmU7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbl9zYW1wbGVzOyBpKyssIHBvcysrKSB7CisgICAgeXVsZV9maWx0ZXIgKGlucHV0X2wgKyBpLCBjdHgtPnN0ZXBfbCArIHBvcywgYXl1bGUsIGJ5dWxlKTsKKyAgICBidXR0ZXJfZmlsdGVyIChjdHgtPnN0ZXBfbCArIHBvcywgY3R4LT5vdXRfbCArIHBvcywgYWJ1dHRlciwgYmJ1dHRlcik7CisKKyAgICB5dWxlX2ZpbHRlciAoaW5wdXRfciArIGksIGN0eC0+c3RlcF9yICsgcG9zLCBheXVsZSwgYnl1bGUpOworICAgIGJ1dHRlcl9maWx0ZXIgKGN0eC0+c3RlcF9yICsgcG9zLCBjdHgtPm91dF9yICsgcG9zLCBhYnV0dGVyLCBiYnV0dGVyKTsKKyAgfQorfQorCisvKiBDbGVhciBmaWx0ZXIgYnVmZmVyIHN0YXRlIGFuZCBjdXJyZW50IFJNUyB3aW5kb3cuICovCisKK3N0YXRpYyB2b2lkCityZXNldF9maWx0ZXJzIChSZ0FuYWx5c2lzQ3R4ICogY3R4KQoreworICBnaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9PUkRFUjsgaSsrKSB7CisKKyAgICBjdHgtPmlucHJlYnVmX2xbaV0gPSAwLjsKKyAgICBjdHgtPnN0ZXBidWZfbFtpXSA9IDAuOworICAgIGN0eC0+b3V0YnVmX2xbaV0gPSAwLjsKKworICAgIGN0eC0+aW5wcmVidWZfcltpXSA9IDAuOworICAgIGN0eC0+c3RlcGJ1Zl9yW2ldID0gMC47CisgICAgY3R4LT5vdXRidWZfcltpXSA9IDAuOworICB9CisKKyAgY3R4LT53aW5kb3dfc3F1YXJlX3N1bSA9IDAuOworICBjdHgtPndpbmRvd19uX3NhbXBsZXNfZG9uZSA9IDA7Cit9CisKKy8qIEFjY3VtdWxhdG9yIGZ1bmN0aW9ucy4gKi8KKworLyogQWRkIHR3byBhY2N1bXVsYXRvcnMgaW4tcGxhY2UuICBUaGUgc3VtIGlzIGRlZmluZWQgYXMgdGhlIHJlc3VsdCBvZgorICogdGhlIHZlY3RvciBzdW0gb2YgdGhlIGhpc3RvZ3JhbSBhcnJheSBhbmQgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlCisgKiBwZWFrIGZpZWxkLiAgVGh1cyAiYWRkaW5nIiB0aGUgYWNjdW11bGF0b3JzIGZvciBhbGwgdHJhY2tzIHlpZWxkcworICogdGhlIGNvcnJlY3QgcmVzdWx0IGZvciBvYnRhaW5pbmcgdGhlIGFsYnVtIGdhaW4gYW5kIHBlYWsuICovCisKK3N0YXRpYyB2b2lkCithY2N1bXVsYXRvcl9hZGQgKFJnQW5hbHlzaXNBY2MgKiBhY2MsIGNvbnN0IFJnQW5hbHlzaXNBY2MgKiBhY2Nfb3RoZXIpCit7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChhY2MtPmhpc3RvZ3JhbSk7IGkrKykKKyAgICBhY2MtPmhpc3RvZ3JhbVtpXSArPSBhY2Nfb3RoZXItPmhpc3RvZ3JhbVtpXTsKKworICBhY2MtPnBlYWsgPSBNQVggKGFjYy0+cGVhaywgYWNjX290aGVyLT5wZWFrKTsKK30KKworLyogUmVzZXQgYW4gYWNjdW11bGF0b3IgdG8gemVyby4gKi8KKworc3RhdGljIHZvaWQKK2FjY3VtdWxhdG9yX2NsZWFyIChSZ0FuYWx5c2lzQWNjICogYWNjKQoreworICBtZW1zZXQgKGFjYy0+aGlzdG9ncmFtLCAwLCBzaXplb2YgKGFjYy0+aGlzdG9ncmFtKSk7CisgIGFjYy0+cGVhayA9IDAuOworfQorCisvKiBPYnRhaW4gZmluYWwgYW5hbHlzaXMgcmVzdWx0IGZyb20gYW4gYWNjdW11bGF0b3IuICBSZXR1cm5zIFRSVUUgb24KKyAqIHN1Y2Nlc3MsIEZBTFNFIG9uIGVycm9yIChpZiBhY2N1bXVsYXRvciBpcyBzdGlsbCB6ZXJvKS4gKi8KKworc3RhdGljIGdib29sZWFuCithY2N1bXVsYXRvcl9yZXN1bHQgKGNvbnN0IFJnQW5hbHlzaXNBY2MgKiBhY2MsIGdkb3VibGUgKiByZXN1bHRfZ2FpbiwKKyAgICBnZG91YmxlICogcmVzdWx0X3BlYWspCit7CisgIGd1aW50MzIgc3VtID0gMDsKKyAgZ3VpbnQzMiB1cHBlcjsKKyAgZ3VpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChhY2MtPmhpc3RvZ3JhbSk7IGkrKykKKyAgICBzdW0gKz0gYWNjLT5oaXN0b2dyYW1baV07CisKKyAgaWYgKHN1bSA9PSAwKQorICAgIC8qIEFsbCBlbnRyaWVzIGFyZSAwOiBXZSBnb3QgbGVzcyB0aGFuIDUwbXMgb2YgZGF0YS4gKi8KKyAgICByZXR1cm4gRkFMU0U7CisKKyAgdXBwZXIgPSAoZ3VpbnQzMikgY2VpbCAoc3VtICogKDEuIC0gKGdkb3VibGUpIChSTVNfUEVSQ0VOVElMRSAvIDEwMC4pKSk7CisKKyAgZm9yIChpID0gR19OX0VMRU1FTlRTIChhY2MtPmhpc3RvZ3JhbSk7IGktLTspIHsKKyAgICBpZiAodXBwZXIgPD0gYWNjLT5oaXN0b2dyYW1baV0pCisgICAgICBicmVhazsKKyAgICB1cHBlciAtPSBhY2MtPmhpc3RvZ3JhbVtpXTsKKyAgfQorCisgIGlmIChyZXN1bHRfcGVhayAhPSBOVUxMKQorICAgICpyZXN1bHRfcGVhayA9IGFjYy0+cGVhazsKKyAgaWYgKHJlc3VsdF9nYWluICE9IE5VTEwpCisgICAgKnJlc3VsdF9nYWluID0gUElOS19SRUYgLSAoZ2RvdWJsZSkgaSAvIFNURVBTX1BFUl9EQjsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogRnVuY3Rpb25zIHRoYXQgb3BlcmF0ZSBvbiBjb250ZXh0cywgZm9yIGV4dGVybmFsIHVzYWdlLiAqLworCisvKiBDcmVhdGUgYSBuZXcgY29udGV4dC4gIEJlZm9yZSBpdCBjYW4gYmUgdXNlZCwgYSBzYW1wbGUgcmF0ZSBtdXN0IGJlCisgKiBjb25maWd1cmVkIHVzaW5nIHJnX2FuYWx5c2lzX3NldF9zYW1wbGVfcmF0ZS4gKi8KKworUmdBbmFseXNpc0N0eCAqCityZ19hbmFseXNpc19uZXcgKHZvaWQpCit7CisgIFJnQW5hbHlzaXNDdHggKmN0eDsKKworICBjdHggPSBnX25ldyAoUmdBbmFseXNpc0N0eCwgMSk7CisKKyAgY3R4LT5pbnByZV9sID0gY3R4LT5pbnByZWJ1Zl9sICsgTUFYX09SREVSOworICBjdHgtPnN0ZXBfbCA9IGN0eC0+c3RlcGJ1Zl9sICsgTUFYX09SREVSOworICBjdHgtPm91dF9sID0gY3R4LT5vdXRidWZfbCArIE1BWF9PUkRFUjsKKworICBjdHgtPmlucHJlX3IgPSBjdHgtPmlucHJlYnVmX3IgKyBNQVhfT1JERVI7CisgIGN0eC0+c3RlcF9yID0gY3R4LT5zdGVwYnVmX3IgKyBNQVhfT1JERVI7CisgIGN0eC0+b3V0X3IgPSBjdHgtPm91dGJ1Zl9yICsgTUFYX09SREVSOworCisgIGN0eC0+c2FtcGxlX3JhdGUgPSAwOworCisgIGFjY3VtdWxhdG9yX2NsZWFyICgmY3R4LT50cmFjayk7CisgIGFjY3VtdWxhdG9yX2NsZWFyICgmY3R4LT5hbGJ1bSk7CisKKyAgcmV0dXJuIGN0eDsKK30KKworc3RhdGljIHZvaWQKK3Jlc2V0X3NpbGVuY2VfZGV0ZWN0aW9uIChSZ0FuYWx5c2lzQ3R4ICogY3R4KQoreworICBjdHgtPmJ1ZmZlcl90aW1lc3RhbXAgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBjdHgtPmJ1ZmZlcl9uX3NhbXBsZXNfZG9uZSA9IDA7Cit9CisKKy8qIEFkYXB0IHRvIGdpdmVuIHNhbXBsZSByYXRlLiAgRG9lcyBub3RoaW5nIGlmIGFscmVhZHkgdGhlIGN1cnJlbnQKKyAqIHJhdGUgKHJldHVybnMgVFJVRSB0aGVuKS4gIFJldHVybnMgRkFMU0Ugb25seSBpZiBnaXZlbiBzYW1wbGUgcmF0ZQorICogaXMgbm90IHN1cHBvcnRlZC4gIElmIHRoZSBjb25maWd1cmVkIHJhdGUgY2hhbmdlcywgdGhlIGxhc3QKKyAqIHVucHJvY2Vzc2VkIGluY29tcGxldGUgNTBtcyBjaHVuayBvZiBkYXRhIGlzIGRyb3BwZWQgYmVjYXVzZSB0aGUKKyAqIGZpbHRlcnMgYXJlIHJlc2V0LiAqLworCitnYm9vbGVhbgorcmdfYW5hbHlzaXNfc2V0X3NhbXBsZV9yYXRlIChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnaW50IHNhbXBsZV9yYXRlKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoY3R4ICE9IE5VTEwsIEZBTFNFKTsKKworICBpZiAoY3R4LT5zYW1wbGVfcmF0ZSA9PSBzYW1wbGVfcmF0ZSkKKyAgICByZXR1cm4gVFJVRTsKKworICBzd2l0Y2ggKHNhbXBsZV9yYXRlKSB7CisgICAgY2FzZSA0ODAwMDoKKyAgICAgIGN0eC0+c2FtcGxlX3JhdGVfaW5kZXggPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0NDEwMDoKKyAgICAgIGN0eC0+c2FtcGxlX3JhdGVfaW5kZXggPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjAwMDoKKyAgICAgIGN0eC0+c2FtcGxlX3JhdGVfaW5kZXggPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDAwMDoKKyAgICAgIGN0eC0+c2FtcGxlX3JhdGVfaW5kZXggPSAzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjA1MDoKKyAgICAgIGN0eC0+c2FtcGxlX3JhdGVfaW5kZXggPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjAwMDoKKyAgICAgIGN0eC0+c2FtcGxlX3JhdGVfaW5kZXggPSA1OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjAwMDoKKyAgICAgIGN0eC0+c2FtcGxlX3JhdGVfaW5kZXggPSA2OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMTAyNToKKyAgICAgIGN0eC0+c2FtcGxlX3JhdGVfaW5kZXggPSA3OworICAgICAgYnJlYWs7CisgICAgY2FzZSA4MDAwOgorICAgICAgY3R4LT5zYW1wbGVfcmF0ZV9pbmRleCA9IDg7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgY3R4LT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworICAvKiBUaGUgKyA5OTkgaGFzIHRoZSBlZmZlY3Qgb2YgY2VpbCgpaW5nOiAqLworICBjdHgtPndpbmRvd19uX3NhbXBsZXMgPSAoZ3VpbnQpICgoc2FtcGxlX3JhdGUgKiBSTVNfV0lORE9XX01TRUNTICsgOTk5KQorICAgICAgLyAxMDAwKTsKKworICByZXNldF9maWx0ZXJzIChjdHgpOworICByZXNldF9zaWxlbmNlX2RldGVjdGlvbiAoY3R4KTsKKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorcmdfYW5hbHlzaXNfaW5pdF9zaWxlbmNlX2RldGVjdGlvbiAoUmdBbmFseXNpc0N0eCAqIGN0eCwKKyAgICB2b2lkICgqcG9zdF9tZXNzYWdlKSAoZ3BvaW50ZXIgYW5hbHlzaXMsIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsCisgICAgICAgIEdzdENsb2NrVGltZSBkdXJhdGlvbiwgZ2RvdWJsZSByZ2xldmVsKSwgZ3BvaW50ZXIgYW5hbHlzaXMpCit7CisgIGN0eC0+cG9zdF9tZXNzYWdlID0gcG9zdF9tZXNzYWdlOworICBjdHgtPmFuYWx5c2lzID0gYW5hbHlzaXM7CisgIHJlc2V0X3NpbGVuY2VfZGV0ZWN0aW9uIChjdHgpOworfQorCit2b2lkCityZ19hbmFseXNpc19zdGFydF9idWZmZXIgKFJnQW5hbHlzaXNDdHggKiBjdHgsIEdzdENsb2NrVGltZSBidWZmZXJfdGltZXN0YW1wKQoreworICBjdHgtPmJ1ZmZlcl90aW1lc3RhbXAgPSBidWZmZXJfdGltZXN0YW1wOworICBjdHgtPmJ1ZmZlcl9uX3NhbXBsZXNfZG9uZSA9IDA7Cit9CisKK3ZvaWQKK3JnX2FuYWx5c2lzX2Rlc3Ryb3kgKFJnQW5hbHlzaXNDdHggKiBjdHgpCit7CisgIGdfZnJlZSAoY3R4KTsKK30KKworLyogRW50cnkgcG9pbnRzIGZvciBhbmFseXppbmcgc2FtcGxlIGRhdGEgaW4gY29tbW9uIHJhdyBkYXRhIGZvcm1hdHMuCisgKiBUaGUgc3RlcmVvIGZvcm1hdCBmdW5jdGlvbnMgZXhwZWN0IGludGVybGVhdmVkIGZyYW1lcy4gIEl0IGlzCisgKiBwb3NzaWJsZSB0byBwYXNzIGRhdGEgaW4gZGlmZmVyZW50IGZvcm1hdHMgZm9yIHRoZSBzYW1lIGNvbnRleHQsCisgKiB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zLiAgQWxsIGZ1bmN0aW9ucyBoYXZlIHRoZSBzYW1lIHNpZ25hdHVyZTsKKyAqIHRoZSBkZXB0aCBhcmd1bWVudCBmb3IgdGhlIGZsb2F0IGZ1bmN0aW9ucyBpcyBub3QgdmFyaWFibGUgYW5kIG11c3QKKyAqIGJlIGdpdmVuIHRoZSB2YWx1ZSAzMi4gKi8KKwordm9pZAorcmdfYW5hbHlzaXNfYW5hbHl6ZV9tb25vX2Zsb2F0IChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnY29uc3Rwb2ludGVyIGRhdGEsCisgICAgZ3NpemUgc2l6ZSwgZ3VpbnQgZGVwdGgpCit7CisgIGdmbG9hdCBjb252X3NhbXBsZXNbNTEyXTsKKyAgY29uc3QgZ2Zsb2F0ICpzYW1wbGVzID0gKGdmbG9hdCAqKSBkYXRhOworICBndWludCBuX3NhbXBsZXMgPSBzaXplIC8gc2l6ZW9mIChnZmxvYXQpOworICBnaW50IGk7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoZGVwdGggPT0gMzIpOworICBnX3JldHVybl9pZl9mYWlsIChzaXplICUgc2l6ZW9mIChnZmxvYXQpID09IDApOworCisgIHdoaWxlIChuX3NhbXBsZXMpIHsKKyAgICBnaW50IG4gPSBNSU4gKG5fc2FtcGxlcywgR19OX0VMRU1FTlRTIChjb252X3NhbXBsZXMpKTsKKworICAgIG5fc2FtcGxlcyAtPSBuOworICAgIG1lbWNweSAoY29udl9zYW1wbGVzLCBzYW1wbGVzLCBuICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBjdHgtPnRyYWNrLnBlYWsgPSBNQVggKGN0eC0+dHJhY2sucGVhaywgZmFicyAoY29udl9zYW1wbGVzW2ldKSk7CisgICAgICBjb252X3NhbXBsZXNbaV0gKj0gMzI3NjguOworICAgIH0KKyAgICBzYW1wbGVzICs9IG47CisgICAgcmdfYW5hbHlzaXNfYW5hbHl6ZSAoY3R4LCBjb252X3NhbXBsZXMsIE5VTEwsIG4pOworICB9Cit9CisKK3ZvaWQKK3JnX2FuYWx5c2lzX2FuYWx5emVfc3RlcmVvX2Zsb2F0IChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnY29uc3Rwb2ludGVyIGRhdGEsCisgICAgZ3NpemUgc2l6ZSwgZ3VpbnQgZGVwdGgpCit7CisgIGdmbG9hdCBjb252X3NhbXBsZXNfbFsyNTZdOworICBnZmxvYXQgY29udl9zYW1wbGVzX3JbMjU2XTsKKyAgY29uc3QgZ2Zsb2F0ICpzYW1wbGVzID0gKGdmbG9hdCAqKSBkYXRhOworICBndWludCBuX2ZyYW1lcyA9IHNpemUgLyAoc2l6ZW9mIChnZmxvYXQpICogMik7CisgIGdpbnQgaTsKKworICBnX3JldHVybl9pZl9mYWlsIChkZXB0aCA9PSAzMik7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKHNpemUgJSAoc2l6ZW9mIChnZmxvYXQpICogMikgPT0gMCk7CisKKyAgd2hpbGUgKG5fZnJhbWVzKSB7CisgICAgZ2ludCBuID0gTUlOIChuX2ZyYW1lcywgR19OX0VMRU1FTlRTIChjb252X3NhbXBsZXNfbCkpOworCisgICAgbl9mcmFtZXMgLT0gbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBnZmxvYXQgb2xkX3NhbXBsZTsKKworICAgICAgb2xkX3NhbXBsZSA9IHNhbXBsZXNbMiAqIGldOworICAgICAgY3R4LT50cmFjay5wZWFrID0gTUFYIChjdHgtPnRyYWNrLnBlYWssIGZhYnMgKG9sZF9zYW1wbGUpKTsKKyAgICAgIGNvbnZfc2FtcGxlc19sW2ldID0gb2xkX3NhbXBsZSAqIDMyNzY4LjsKKworICAgICAgb2xkX3NhbXBsZSA9IHNhbXBsZXNbMiAqIGkgKyAxXTsKKyAgICAgIGN0eC0+dHJhY2sucGVhayA9IE1BWCAoY3R4LT50cmFjay5wZWFrLCBmYWJzIChvbGRfc2FtcGxlKSk7CisgICAgICBjb252X3NhbXBsZXNfcltpXSA9IG9sZF9zYW1wbGUgKiAzMjc2OC47CisgICAgfQorICAgIHNhbXBsZXMgKz0gMiAqIG47CisgICAgcmdfYW5hbHlzaXNfYW5hbHl6ZSAoY3R4LCBjb252X3NhbXBsZXNfbCwgY29udl9zYW1wbGVzX3IsIG4pOworICB9Cit9CisKK3ZvaWQKK3JnX2FuYWx5c2lzX2FuYWx5emVfbW9ub19pbnQxNiAoUmdBbmFseXNpc0N0eCAqIGN0eCwgZ2NvbnN0cG9pbnRlciBkYXRhLAorICAgIGdzaXplIHNpemUsIGd1aW50IGRlcHRoKQoreworICBnZmxvYXQgY29udl9zYW1wbGVzWzUxMl07CisgIGdpbnQzMiBwZWFrX3NhbXBsZSA9IDA7CisgIGNvbnN0IGdpbnQxNiAqc2FtcGxlcyA9IChnaW50MTYgKikgZGF0YTsKKyAgZ3VpbnQgbl9zYW1wbGVzID0gc2l6ZSAvIHNpemVvZiAoZ2ludDE2KTsKKyAgZ2ludCBzaGlmdCA9IDEgPDwgKHNpemVvZiAoZ2ludDE2KSAqIDggLSBkZXB0aCk7CisgIGdpbnQgaTsKKworICBnX3JldHVybl9pZl9mYWlsIChkZXB0aCA8PSAoc2l6ZW9mIChnaW50MTYpICogOCkpOworICBnX3JldHVybl9pZl9mYWlsIChzaXplICUgc2l6ZW9mIChnaW50MTYpID09IDApOworCisgIHdoaWxlIChuX3NhbXBsZXMpIHsKKyAgICBnaW50IG4gPSBNSU4gKG5fc2FtcGxlcywgR19OX0VMRU1FTlRTIChjb252X3NhbXBsZXMpKTsKKworICAgIG5fc2FtcGxlcyAtPSBuOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIGdpbnQxNiBvbGRfc2FtcGxlID0gc2FtcGxlc1tpXSAqIHNoaWZ0OworCisgICAgICBwZWFrX3NhbXBsZSA9IE1BWCAocGVha19zYW1wbGUsIEFCUyAoKGdpbnQzMikgb2xkX3NhbXBsZSkpOworICAgICAgY29udl9zYW1wbGVzW2ldID0gKGdmbG9hdCkgb2xkX3NhbXBsZTsKKyAgICB9CisgICAgc2FtcGxlcyArPSBuOworICAgIHJnX2FuYWx5c2lzX2FuYWx5emUgKGN0eCwgY29udl9zYW1wbGVzLCBOVUxMLCBuKTsKKyAgfQorICBjdHgtPnRyYWNrLnBlYWsgPSBNQVggKGN0eC0+dHJhY2sucGVhaywKKyAgICAgIChnZG91YmxlKSBwZWFrX3NhbXBsZSAvICgoZ2RvdWJsZSkgKDF1IDw8IDE1KSkpOworfQorCit2b2lkCityZ19hbmFseXNpc19hbmFseXplX3N0ZXJlb19pbnQxNiAoUmdBbmFseXNpc0N0eCAqIGN0eCwgZ2NvbnN0cG9pbnRlciBkYXRhLAorICAgIGdzaXplIHNpemUsIGd1aW50IGRlcHRoKQoreworICBnZmxvYXQgY29udl9zYW1wbGVzX2xbMjU2XTsKKyAgZ2Zsb2F0IGNvbnZfc2FtcGxlc19yWzI1Nl07CisgIGdpbnQzMiBwZWFrX3NhbXBsZSA9IDA7CisgIGNvbnN0IGdpbnQxNiAqc2FtcGxlcyA9IChnaW50MTYgKikgZGF0YTsKKyAgZ3VpbnQgbl9mcmFtZXMgPSBzaXplIC8gKHNpemVvZiAoZ2ludDE2KSAqIDIpOworICBnaW50IHNoaWZ0ID0gMSA8PCAoc2l6ZW9mIChnaW50MTYpICogOCAtIGRlcHRoKTsKKyAgZ2ludCBpOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKGRlcHRoIDw9IChzaXplb2YgKGdpbnQxNikgKiA4KSk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKHNpemUgJSAoc2l6ZW9mIChnaW50MTYpICogMikgPT0gMCk7CisKKyAgd2hpbGUgKG5fZnJhbWVzKSB7CisgICAgZ2ludCBuID0gTUlOIChuX2ZyYW1lcywgR19OX0VMRU1FTlRTIChjb252X3NhbXBsZXNfbCkpOworCisgICAgbl9mcmFtZXMgLT0gbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBnaW50MTYgb2xkX3NhbXBsZTsKKworICAgICAgb2xkX3NhbXBsZSA9IHNhbXBsZXNbMiAqIGldICogc2hpZnQ7CisgICAgICBwZWFrX3NhbXBsZSA9IE1BWCAocGVha19zYW1wbGUsIEFCUyAoKGdpbnQzMikgb2xkX3NhbXBsZSkpOworICAgICAgY29udl9zYW1wbGVzX2xbaV0gPSAoZ2Zsb2F0KSBvbGRfc2FtcGxlOworCisgICAgICBvbGRfc2FtcGxlID0gc2FtcGxlc1syICogaSArIDFdICogc2hpZnQ7CisgICAgICBwZWFrX3NhbXBsZSA9IE1BWCAocGVha19zYW1wbGUsIEFCUyAoKGdpbnQzMikgb2xkX3NhbXBsZSkpOworICAgICAgY29udl9zYW1wbGVzX3JbaV0gPSAoZ2Zsb2F0KSBvbGRfc2FtcGxlOworICAgIH0KKyAgICBzYW1wbGVzICs9IDIgKiBuOworICAgIHJnX2FuYWx5c2lzX2FuYWx5emUgKGN0eCwgY29udl9zYW1wbGVzX2wsIGNvbnZfc2FtcGxlc19yLCBuKTsKKyAgfQorICBjdHgtPnRyYWNrLnBlYWsgPSBNQVggKGN0eC0+dHJhY2sucGVhaywKKyAgICAgIChnZG91YmxlKSBwZWFrX3NhbXBsZSAvICgoZ2RvdWJsZSkgKDF1IDw8IDE1KSkpOworfQorCisvKiBBbmFseXplIHRoZSBnaXZlbiBjaHVuayBvZiBzYW1wbGVzLiAgVGhlIHNhbXBsZSBkYXRhIGlzIGdpdmVuIGluCisgKiBmbG9hdGluZyBwb2ludCBmb3JtYXQgYnV0IHNob3VsZCBiZSBzY2FsZWQgc3VjaCB0aGF0IHRoZSB2YWx1ZXMKKyAqICsvLTMyNzY4LjAgY29ycmVzcG9uZCB0byB0aGUgLTBkQkZTIHJlZmVyZW5jZSBhbXBsaXR1ZGUuCisgKgorICogc2FtcGxlc19sOiBCdWZmZXIgd2l0aCBzYW1wbGUgZGF0YSBmb3IgdGhlIGxlZnQgY2hhbm5lbCBvciBvZiB0aGUKKyAqIG1vbm8gY2hhbm5lbC4KKyAqCisgKiBzYW1wbGVzX3I6IEJ1ZmZlciB3aXRoIHNhbXBsZSBkYXRhIGZvciB0aGUgcmlnaHQgY2hhbm5lbCBvciBOVUxMCisgKiBmb3IgbW9uby4KKyAqCisgKiBuX3NhbXBsZXM6IE51bWJlciBvZiBzYW1wbGVzIHBhc3NlZCBpbiBlYWNoIGJ1ZmZlci4KKyAqLworCit2b2lkCityZ19hbmFseXNpc19hbmFseXplIChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBjb25zdCBnZmxvYXQgKiBzYW1wbGVzX2wsCisgICAgY29uc3QgZ2Zsb2F0ICogc2FtcGxlc19yLCBndWludCBuX3NhbXBsZXMpCit7CisgIGNvbnN0IGdmbG9hdCAqaW5wdXRfbCwgKmlucHV0X3I7CisgIGd1aW50IG5fc2FtcGxlc19kb25lOworICBnaW50IGk7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoY3R4ICE9IE5VTEwpOworICBnX3JldHVybl9pZl9mYWlsIChzYW1wbGVzX2wgIT0gTlVMTCk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKGN0eC0+c2FtcGxlX3JhdGUgIT0gMCk7CisKKyAgaWYgKG5fc2FtcGxlcyA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAoc2FtcGxlc19yID09IE5VTEwpCisgICAgLyogTW9uby4gKi8KKyAgICBzYW1wbGVzX3IgPSBzYW1wbGVzX2w7CisKKyAgbWVtY3B5IChjdHgtPmlucHJlX2wsIHNhbXBsZXNfbCwKKyAgICAgIE1JTiAobl9zYW1wbGVzLCBNQVhfT1JERVIpICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgbWVtY3B5IChjdHgtPmlucHJlX3IsIHNhbXBsZXNfciwKKyAgICAgIE1JTiAobl9zYW1wbGVzLCBNQVhfT1JERVIpICogc2l6ZW9mIChnZmxvYXQpKTsKKworICBuX3NhbXBsZXNfZG9uZSA9IDA7CisgIHdoaWxlIChuX3NhbXBsZXNfZG9uZSA8IG5fc2FtcGxlcykgeworICAgIC8qIExpbWl0IG51bWJlciBvZiBzYW1wbGVzIHRvIGJlIHByb2Nlc3NlZCBpbiB0aGlzIGl0ZXJhdGlvbiB0bworICAgICAqIHRoZSBudW1iZXIgbmVlZGVkIHRvIGNvbXBsZXRlIHRoZSBuZXh0IHdpbmRvdzogKi8KKyAgICBndWludCBuX3NhbXBsZXNfY3VycmVudCA9IE1JTiAobl9zYW1wbGVzIC0gbl9zYW1wbGVzX2RvbmUsCisgICAgICAgIGN0eC0+d2luZG93X25fc2FtcGxlcyAtIGN0eC0+d2luZG93X25fc2FtcGxlc19kb25lKTsKKworICAgIGlmIChuX3NhbXBsZXNfZG9uZSA8IE1BWF9PUkRFUikgeworICAgICAgaW5wdXRfbCA9IGN0eC0+aW5wcmVfbCArIG5fc2FtcGxlc19kb25lOworICAgICAgaW5wdXRfciA9IGN0eC0+aW5wcmVfciArIG5fc2FtcGxlc19kb25lOworICAgICAgbl9zYW1wbGVzX2N1cnJlbnQgPSBNSU4gKG5fc2FtcGxlc19jdXJyZW50LCBNQVhfT1JERVIgLSBuX3NhbXBsZXNfZG9uZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlucHV0X2wgPSBzYW1wbGVzX2wgKyBuX3NhbXBsZXNfZG9uZTsKKyAgICAgIGlucHV0X3IgPSBzYW1wbGVzX3IgKyBuX3NhbXBsZXNfZG9uZTsKKyAgICB9CisKKyAgICBhcHBseV9maWx0ZXJzIChjdHgsIGlucHV0X2wsIGlucHV0X3IsIG5fc2FtcGxlc19jdXJyZW50KTsKKworICAgIC8qIFVwZGF0ZSB0aGUgc3F1YXJlIHN1bS4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbl9zYW1wbGVzX2N1cnJlbnQ7IGkrKykKKyAgICAgIGN0eC0+d2luZG93X3NxdWFyZV9zdW0gKz0gY3R4LT5vdXRfbFtjdHgtPndpbmRvd19uX3NhbXBsZXNfZG9uZSArIGldCisgICAgICAgICAgKiBjdHgtPm91dF9sW2N0eC0+d2luZG93X25fc2FtcGxlc19kb25lICsgaV0KKyAgICAgICAgICArIGN0eC0+b3V0X3JbY3R4LT53aW5kb3dfbl9zYW1wbGVzX2RvbmUgKyBpXQorICAgICAgICAgICogY3R4LT5vdXRfcltjdHgtPndpbmRvd19uX3NhbXBsZXNfZG9uZSArIGldOworCisgICAgY3R4LT53aW5kb3dfbl9zYW1wbGVzX2RvbmUgKz0gbl9zYW1wbGVzX2N1cnJlbnQ7CisgICAgY3R4LT5idWZmZXJfbl9zYW1wbGVzX2RvbmUgKz0gbl9zYW1wbGVzX2N1cnJlbnQ7CisKKyAgICBnX3JldHVybl9pZl9mYWlsIChjdHgtPndpbmRvd19uX3NhbXBsZXNfZG9uZSA8PSBjdHgtPndpbmRvd19uX3NhbXBsZXMpOworCisgICAgaWYgKGN0eC0+d2luZG93X25fc2FtcGxlc19kb25lID09IGN0eC0+d2luZG93X25fc2FtcGxlcykgeworICAgICAgLyogR2V0IHRoZSBSb290IE1lYW4gU3F1YXJlIChSTVMpIGZvciB0aGlzIHNldCBvZiBzYW1wbGVzLiAqLworICAgICAgZ2RvdWJsZSB2YWwgPSBTVEVQU19QRVJfREIgKiAxMC4gKiBsb2cxMCAoY3R4LT53aW5kb3dfc3F1YXJlX3N1bSAvCisgICAgICAgICAgY3R4LT53aW5kb3dfbl9zYW1wbGVzICogMC41ICsgMS5lLTM3KTsKKyAgICAgIGdpbnQgaXZhbCA9IENMQU1QICgoZ2ludCkgdmFsLCAwLAorICAgICAgICAgIChnaW50KSBHX05fRUxFTUVOVFMgKGN0eC0+dHJhY2suaGlzdG9ncmFtKSAtIDEpOworICAgICAgLyogQ29tcHV0ZSB0aGUgcGVyLXdpbmRvdyBnYWluICovCisgICAgICBjb25zdCBnZG91YmxlIGdhaW4gPSBQSU5LX1JFRiAtIChnZG91YmxlKSBpdmFsIC8gU1RFUFNfUEVSX0RCOworICAgICAgY29uc3QgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCA9IGN0eC0+YnVmZmVyX3RpbWVzdGFtcAorICAgICAgICAgICsgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludF9jZWlsIChHU1RfU0VDT05ELAorICAgICAgICAgIGN0eC0+YnVmZmVyX25fc2FtcGxlc19kb25lLAorICAgICAgICAgIGN0eC0+c2FtcGxlX3JhdGUpCisgICAgICAgICAgLSBSTVNfV0lORE9XX01TRUNTICogR1NUX01TRUNPTkQ7CisKKyAgICAgIGN0eC0+cG9zdF9tZXNzYWdlIChjdHgtPmFuYWx5c2lzLCB0aW1lc3RhbXAsCisgICAgICAgICAgUk1TX1dJTkRPV19NU0VDUyAqIEdTVF9NU0VDT05ELCAtZ2Fpbik7CisKKworICAgICAgY3R4LT50cmFjay5oaXN0b2dyYW1baXZhbF0rKzsKKyAgICAgIGN0eC0+d2luZG93X3NxdWFyZV9zdW0gPSAwLjsKKyAgICAgIGN0eC0+d2luZG93X25fc2FtcGxlc19kb25lID0gMDsKKworICAgICAgLyogTm8gbmVlZCBmb3IgbWVtbW92ZSBoZXJlLCB0aGUgYXJlYXMgbmV2ZXIgb3ZlcmxhcDogRXZlbiBmb3IKKyAgICAgICAqIHRoZSBzbWFsbGVzdCBzYW1wbGUgcmF0ZSwgdGhlIG51bWJlciBvZiBzYW1wbGVzIG5lZWRlZCBmb3IKKyAgICAgICAqIHRoZSB3aW5kb3cgaXMgZ3JlYXRlciB0aGFuIE1BWF9PUkRFUi4gKi8KKworICAgICAgbWVtY3B5IChjdHgtPnN0ZXBidWZfbCwgY3R4LT5zdGVwYnVmX2wgKyBjdHgtPndpbmRvd19uX3NhbXBsZXMsCisgICAgICAgICAgTUFYX09SREVSICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgICAgIG1lbWNweSAoY3R4LT5vdXRidWZfbCwgY3R4LT5vdXRidWZfbCArIGN0eC0+d2luZG93X25fc2FtcGxlcywKKyAgICAgICAgICBNQVhfT1JERVIgKiBzaXplb2YgKGdmbG9hdCkpOworCisgICAgICBtZW1jcHkgKGN0eC0+c3RlcGJ1Zl9yLCBjdHgtPnN0ZXBidWZfciArIGN0eC0+d2luZG93X25fc2FtcGxlcywKKyAgICAgICAgICBNQVhfT1JERVIgKiBzaXplb2YgKGdmbG9hdCkpOworICAgICAgbWVtY3B5IChjdHgtPm91dGJ1Zl9yLCBjdHgtPm91dGJ1Zl9yICsgY3R4LT53aW5kb3dfbl9zYW1wbGVzLAorICAgICAgICAgIE1BWF9PUkRFUiAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgICAgfQorCisgICAgbl9zYW1wbGVzX2RvbmUgKz0gbl9zYW1wbGVzX2N1cnJlbnQ7CisgIH0KKworICBpZiAobl9zYW1wbGVzID49IE1BWF9PUkRFUikgeworCisgICAgbWVtY3B5IChjdHgtPmlucHJlYnVmX2wsIHNhbXBsZXNfbCArIG5fc2FtcGxlcyAtIE1BWF9PUkRFUiwKKyAgICAgICAgTUFYX09SREVSICogc2l6ZW9mIChnZmxvYXQpKTsKKworICAgIG1lbWNweSAoY3R4LT5pbnByZWJ1Zl9yLCBzYW1wbGVzX3IgKyBuX3NhbXBsZXMgLSBNQVhfT1JERVIsCisgICAgICAgIE1BWF9PUkRFUiAqIHNpemVvZiAoZ2Zsb2F0KSk7CisKKyAgfSBlbHNlIHsKKworICAgIG1lbW1vdmUgKGN0eC0+aW5wcmVidWZfbCwgY3R4LT5pbnByZWJ1Zl9sICsgbl9zYW1wbGVzLAorICAgICAgICAoTUFYX09SREVSIC0gbl9zYW1wbGVzKSAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgICAgbWVtY3B5IChjdHgtPmlucHJlYnVmX2wgKyBNQVhfT1JERVIgLSBuX3NhbXBsZXMsIHNhbXBsZXNfbCwKKyAgICAgICAgbl9zYW1wbGVzICogc2l6ZW9mIChnZmxvYXQpKTsKKworICAgIG1lbW1vdmUgKGN0eC0+aW5wcmVidWZfciwgY3R4LT5pbnByZWJ1Zl9yICsgbl9zYW1wbGVzLAorICAgICAgICAoTUFYX09SREVSIC0gbl9zYW1wbGVzKSAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgICAgbWVtY3B5IChjdHgtPmlucHJlYnVmX3IgKyBNQVhfT1JERVIgLSBuX3NhbXBsZXMsIHNhbXBsZXNfciwKKyAgICAgICAgbl9zYW1wbGVzICogc2l6ZW9mIChnZmxvYXQpKTsKKworICB9Cit9CisKKy8qIE9idGFpbiB0cmFjayBnYWluIGFuZCBwZWFrLiAgUmV0dXJucyBUUlVFIG9uIHN1Y2Nlc3MuICBDYW4gZmFpbCBpZgorICogbm90IGVub3VnaCBzYW1wbGVzIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBVcGRhdGVzIGFsYnVtIGFjY3VtdWxhdG9yLgorICogUmVzZXRzIHRyYWNrIGFjY3VtdWxhdG9yLiAqLworCitnYm9vbGVhbgorcmdfYW5hbHlzaXNfdHJhY2tfcmVzdWx0IChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnZG91YmxlICogZ2FpbiwgZ2RvdWJsZSAqIHBlYWspCit7CisgIGdib29sZWFuIHJlc3VsdDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoY3R4ICE9IE5VTEwsIEZBTFNFKTsKKworICBhY2N1bXVsYXRvcl9hZGQgKCZjdHgtPmFsYnVtLCAmY3R4LT50cmFjayk7CisgIHJlc3VsdCA9IGFjY3VtdWxhdG9yX3Jlc3VsdCAoJmN0eC0+dHJhY2ssIGdhaW4sIHBlYWspOworICBhY2N1bXVsYXRvcl9jbGVhciAoJmN0eC0+dHJhY2spOworCisgIHJlc2V0X2ZpbHRlcnMgKGN0eCk7CisgIHJlc2V0X3NpbGVuY2VfZGV0ZWN0aW9uIChjdHgpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIE9idGFpbiBhbGJ1bSBnYWluIGFuZCBwZWFrLiAgUmV0dXJucyBUUlVFIG9uIHN1Y2Nlc3MuICBDYW4gZmFpbCBpZgorICogbm90IGVub3VnaCBzYW1wbGVzIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBSZXNldHMgYWxidW0KKyAqIGFjY3VtdWxhdG9yLiAqLworCitnYm9vbGVhbgorcmdfYW5hbHlzaXNfYWxidW1fcmVzdWx0IChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnZG91YmxlICogZ2FpbiwgZ2RvdWJsZSAqIHBlYWspCit7CisgIGdib29sZWFuIHJlc3VsdDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoY3R4ICE9IE5VTEwsIEZBTFNFKTsKKworICByZXN1bHQgPSBhY2N1bXVsYXRvcl9yZXN1bHQgKCZjdHgtPmFsYnVtLCBnYWluLCBwZWFrKTsKKyAgYWNjdW11bGF0b3JfY2xlYXIgKCZjdHgtPmFsYnVtKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkCityZ19hbmFseXNpc19yZXNldF9hbGJ1bSAoUmdBbmFseXNpc0N0eCAqIGN0eCkKK3sKKyAgYWNjdW11bGF0b3JfY2xlYXIgKCZjdHgtPmFsYnVtKTsKK30KKworLyogUmVzZXQgaW50ZXJuYWwgYnVmZmVycyBhcyB3ZWxsIGFzIHRyYWNrIGFuZCBhbGJ1bSBhY2N1bXVsYXRvcnMuCisgKiBDb25maWd1cmVkIHNhbXBsZSByYXRlIGlzIGtlcHQgaW50YWN0LiAqLworCit2b2lkCityZ19hbmFseXNpc19yZXNldCAoUmdBbmFseXNpc0N0eCAqIGN0eCkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoY3R4ICE9IE5VTEwpOworCisgIHJlc2V0X2ZpbHRlcnMgKGN0eCk7CisgIGFjY3VtdWxhdG9yX2NsZWFyICgmY3R4LT50cmFjayk7CisgIGFjY3VtdWxhdG9yX2NsZWFyICgmY3R4LT5hbGJ1bSk7CisgIHJlc2V0X3NpbGVuY2VfZGV0ZWN0aW9uIChjdHgpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3JlcGxheWdhaW4vcmdhbmFseXNpcy5oIGIvZ3N0L3JlcGxheWdhaW4vcmdhbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1N2FkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcmVwbGF5Z2Fpbi9yZ2FuYWx5c2lzLmgKQEAgLTAsMCArMSw2MyBAQAorLyogR1N0cmVhbWVyIFJlcGxheUdhaW4gYW5hbHlzaXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVuZSBTdGFkbGVyIDxtYWlsQHJlbmVzdGFkbGVyLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDAxIERhdmlkIFJvYmluc29uIDxEYXZpZEBSb2JpbnNvbi5vcmc+CisgKiAgICAgICAgICAgICAgICAgICAgR2xlbiBTYXd5ZXIgPGdsZW5zYXd5ZXJAaG90bWFpbC5jb20+CisgKgorICogcmdhbmFseXNpcy5oOiBBbmFseXplIHJhdyBhdWRpbyBkYXRhIGluIGFjY29yZGFuY2Ugd2l0aCBSZXBsYXlHYWluCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfX1JHX0FOQUxZU0lTX0hfXworI2RlZmluZSBfX1JHX0FOQUxZU0lTX0hfXworCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfUmdBbmFseXNpc0N0eCBSZ0FuYWx5c2lzQ3R4OworCitSZ0FuYWx5c2lzQ3R4ICpyZ19hbmFseXNpc19uZXcgKHZvaWQpOworZ2Jvb2xlYW4gcmdfYW5hbHlzaXNfc2V0X3NhbXBsZV9yYXRlIChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnaW50IHNhbXBsZV9yYXRlKTsKK3ZvaWQgcmdfYW5hbHlzaXNfYW5hbHl6ZV9tb25vX2Zsb2F0IChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnY29uc3Rwb2ludGVyIGRhdGEsCisgICAgZ3NpemUgc2l6ZSwgZ3VpbnQgZGVwdGgpOwordm9pZCByZ19hbmFseXNpc19hbmFseXplX3N0ZXJlb19mbG9hdCAoUmdBbmFseXNpc0N0eCAqIGN0eCwgZ2NvbnN0cG9pbnRlciBkYXRhLAorICAgIGdzaXplIHNpemUsIGd1aW50IGRlcHRoKTsKK3ZvaWQgcmdfYW5hbHlzaXNfYW5hbHl6ZV9tb25vX2ludDE2IChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnY29uc3Rwb2ludGVyIGRhdGEsCisgICAgZ3NpemUgc2l6ZSwgZ3VpbnQgZGVwdGgpOwordm9pZCByZ19hbmFseXNpc19hbmFseXplX3N0ZXJlb19pbnQxNiAoUmdBbmFseXNpc0N0eCAqIGN0eCwgZ2NvbnN0cG9pbnRlciBkYXRhLAorICAgIGdzaXplIHNpemUsIGd1aW50IGRlcHRoKTsKK3ZvaWQgcmdfYW5hbHlzaXNfYW5hbHl6ZSAoUmdBbmFseXNpc0N0eCAqIGN0eCwgY29uc3QgZ2Zsb2F0ICogc2FtcGxlc19sLAorICAgIGNvbnN0IGdmbG9hdCAqIHNhbXBsZXNfciwgZ3VpbnQgbl9zYW1wbGVzKTsKK2dib29sZWFuIHJnX2FuYWx5c2lzX3RyYWNrX3Jlc3VsdCAoUmdBbmFseXNpc0N0eCAqIGN0eCwgZ2RvdWJsZSAqIGdhaW4sCisgICAgZ2RvdWJsZSAqIHBlYWspOworZ2Jvb2xlYW4gcmdfYW5hbHlzaXNfYWxidW1fcmVzdWx0IChSZ0FuYWx5c2lzQ3R4ICogY3R4LCBnZG91YmxlICogZ2FpbiwKKyAgICBnZG91YmxlICogcGVhayk7Cit2b2lkIHJnX2FuYWx5c2lzX2luaXRfc2lsZW5jZV9kZXRlY3Rpb24gKAorICAgIFJnQW5hbHlzaXNDdHggKiBjdHgsCisgICAgdm9pZCAoKnBvc3RfbWVzc2FnZSkgKGdwb2ludGVyIGFuYWx5c2lzLCBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBHc3RDbG9ja1RpbWUgZHVyYXRpb24sIGdkb3VibGUgcmdsZXZlbCksCisgICAgZ3BvaW50ZXIgYW5hbHlzaXMpOwordm9pZCByZ19hbmFseXNpc19zdGFydF9idWZmZXIgKFJnQW5hbHlzaXNDdHggKiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0Q2xvY2tUaW1lIGJ1ZmZlcl90aW1lc3RhbXApOwordm9pZCByZ19hbmFseXNpc19yZXNldF9hbGJ1bSAoUmdBbmFseXNpc0N0eCAqIGN0eCk7Cit2b2lkIHJnX2FuYWx5c2lzX3Jlc2V0IChSZ0FuYWx5c2lzQ3R4ICogY3R4KTsKK3ZvaWQgcmdfYW5hbHlzaXNfZGVzdHJveSAoUmdBbmFseXNpc0N0eCAqIGN0eCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX1JHX0FOQUxZU0lTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9NYWtlZmlsZS5hbSBiL2dzdC9ydHAvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IyYWZkNQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyMDkgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdHJ0cC5sYQorCitsaWJnc3RydHBfbGFfU09VUkNFUyA9IFwKKwlkYm9vbGh1ZmYuYyBcCisJZm52MWhhc2guYyBcCisJZ3N0cnRwLmMgXAorCWdzdHJ0cGNoYW5uZWxzLmMgXAorCWdzdHJ0cGFjM2RlcGF5LmMgXAorCWdzdHJ0cGFjM3BheS5jIFwKKwlnc3RydHBidmRlcGF5LmMgXAorCWdzdHJ0cGJ2cGF5LmMgXAorCWdzdHJ0cGNlbHRkZXBheS5jIFwKKwlnc3RydHBjZWx0cGF5LmMgXAorCWdzdHJ0cGR2ZGVwYXkuYyBcCisJZ3N0cnRwZHZwYXkuYyBcCisJZ3N0cnRwZ3N0ZGVwYXkuYyBcCisJZ3N0cnRwZ3N0cGF5LmMgXAorCWdzdHJ0cGlsYmNkZXBheS5jIFwKKwlnc3RydHBpbGJjcGF5LmMgXAorCWdzdHJ0cG1wYWRlcGF5LmMgXAorCWdzdHJ0cG1wYXBheS5jIFwKKwlnc3RydHBtcGFyb2J1c3RkZXBheS5jIFwKKwlnc3RydHBtcHZkZXBheS5jIFwKKwlnc3RydHBtcHZwYXkuYyBcCisJZ3N0cnRwcGNtYWRlcGF5LmMgXAorCWdzdHJ0cHBjbXVkZXBheS5jIFwKKwlnc3RydHBwY211cGF5LmMgXAorCWdzdHJ0cHBjbWFwYXkuYyBcCisJZ3N0cnRwZzcyMmRlcGF5LmMgXAorCWdzdHJ0cGc3MjJwYXkuYyBcCisJZ3N0cnRwZzcyM2RlcGF5LmMgXAorCWdzdHJ0cGc3MjNwYXkuYyBcCisJZ3N0cnRwZzcyNnBheS5jIFwKKwlnc3RydHBnNzI2ZGVwYXkuYyBcCisJZ3N0cnRwZzcyOXBheS5jIFwKKwlnc3RydHBnNzI5ZGVwYXkuYyBcCisJZ3N0cnRwZ3NtZGVwYXkuYyBcCisJZ3N0cnRwZ3NtcGF5LmMgXAorCWdzdHJ0cGFtcmRlcGF5LmMgXAorCWdzdHJ0cGFtcnBheS5jIFwKKwlnc3RydHBoMjYxcGF5LmMgXAorCWdzdHJ0cGgyNjFkZXBheS5jIFwKKwlnc3RydHBoMjYzcGRlcGF5LmMgXAorCWdzdHJ0cGgyNjNwcGF5LmMgXAorCWdzdHJ0cGgyNjNkZXBheS5jIFwKKwlnc3RydHBoMjYzcGF5LmMgXAorCWdzdHJ0cGgyNjRkZXBheS5jIFwKKwlnc3RydHBoMjY0cGF5LmMgXAorCWdzdHJ0cGgyNjVkZXBheS5jIFwKKwlnc3RydHBoMjY1cGF5LmMgXAorCWdzdHJ0cGoya2RlcGF5LmMgXAorCWdzdHJ0cGoya3BheS5jIFwKKwlnc3RydHBqcGVnZGVwYXkuYyBcCisJZ3N0cnRwanBlZ3BheS5jIFwKKwlnc3RydHBrbHZkZXBheS5jIFwKKwlnc3RydHBrbHZwYXkuYyBcCisJZ3N0cnRwTDhkZXBheS5jIFwKKwlnc3RydHBMOHBheS5jIFwKKwlnc3RydHBMMTZkZXBheS5jIFwKKwlnc3RydHBMMTZwYXkuYyBcCisJZ3N0cnRwTDI0ZGVwYXkuYyBcCisJZ3N0cnRwTDI0cGF5LmMgXAorCWdzdGFzdGVyaXNraDI2My5jIFwKKwlnc3RydHBtcDFzZGVwYXkuYyBcCisJZ3N0cnRwbXAydGRlcGF5LmMgXAorCWdzdHJ0cG1wMnRwYXkuYyBcCisJZ3N0cnRwbXA0dmRlcGF5LmMgXAorCWdzdHJ0cG1wNHZwYXkuYyBcCisJZ3N0cnRwbXA0Z2RlcGF5LmMgXAorCWdzdHJ0cG1wNGdwYXkuYyBcCisJZ3N0cnRwbXA0YWRlcGF5LmMgXAorCWdzdHJ0cG1wNGFwYXkuYyBcCisJZ3N0cnRwb3B1c2RlcGF5LmMgXAorCWdzdHJ0cG9wdXNwYXkuYyBcCisJZ3N0cnRwcWNlbHBkZXBheS5jIFwKKwlnc3RydHBxZG1kZXBheS5jIFwKKwlnc3RydHBzYmNkZXBheS5jIFwKKwlnc3RydHBzYmNwYXkuYyBcCisJZ3N0cnRwc2lyZW5wYXkuYyBcCisJZ3N0cnRwc2lyZW5kZXBheS5jIFwKKwlnc3RydHBzcGVleGRlcGF5LmMgXAorCWdzdHJ0cHNwZWV4cGF5LmMgXAorCWdzdHJ0cHN2M3ZkZXBheS5jIFwKKwlnc3RydHB0aGVvcmFkZXBheS5jIFwKKwlnc3RydHB0aGVvcmFwYXkuYyBcCisJZ3N0cnRwdm9yYmlzZGVwYXkuYyBcCisJZ3N0cnRwdm9yYmlzcGF5LmMgIFwKKwlnc3RydHB2cDhkZXBheS5jIFwKKwlnc3RydHB2cDhwYXkuYyBcCisJZ3N0cnRwdnA5ZGVwYXkuYyBcCisJZ3N0cnRwdnA5cGF5LmMgXAorCWdzdHJ0cHZyYXdkZXBheS5jICBcCisJZ3N0cnRwdnJhd3BheS5jIFwKKwlnc3RydHBzdHJlYW1wYXkuYyBcCisJZ3N0cnRwc3RyZWFtZGVwYXkuYyBcCisJZ3N0cnRwdXRpbHMuYworCitsaWJnc3RydHBfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9DRkxBR1MpIC1EdnA4X25vcm09Z3N0X3J0cHZwOF92cDhfbm9ybSBcCisJLUR2cDhkeF9zdGFydF9kZWNvZGU9Z3N0X3J0cHZwOF92cDhkeF9zdGFydF9kZWNvZGUgXAorCS1EdnA4ZHhfYm9vbF9kZWNvZGVyX2ZpbGw9Z3N0X3J0cHZwOF92cDhkeF9ib29sX2RlY29kZXJfZmlsbAorCitsaWJnc3RydHBfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwktbGdzdGF1ZGlvLUBHU1RfQVBJX1ZFUlNJT05AIFwKKwktbGdzdHZpZGVvLUBHU1RfQVBJX1ZFUlNJT05AIFwKKwktbGdzdHRhZy1AR1NUX0FQSV9WRVJTSU9OQCBcCisJLWxnc3RydHAtQEdTVF9BUElfVkVSU0lPTkAgXAorCS1sZ3N0cGJ1dGlscy1AR1NUX0FQSV9WRVJTSU9OQCBcCisJJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSBcCisJJChMSUJNKQorbGliZ3N0cnRwX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykgCisKK25vaW5zdF9IRUFERVJTID0JCQlcCisJZGJvb2xodWZmLmggXAorCWZudjFoYXNoLmggXAorCWdzdHJ0cGNoYW5uZWxzLmggXAorCWdzdHJ0cEw4ZGVwYXkuaCBcCisJZ3N0cnRwTDhwYXkuaCBcCisJZ3N0cnRwTDE2ZGVwYXkuaCBcCisJZ3N0cnRwTDE2cGF5LmggXAorCWdzdHJ0cEwyNGRlcGF5LmggXAorCWdzdHJ0cEwyNHBheS5oIFwKKwlnc3RydHBhYzNkZXBheS5oIFwKKwlnc3RydHBhYzNwYXkuaCBcCisJZ3N0cnRwYnZkZXBheS5oIFwKKwlnc3RydHBidnBheS5oIFwKKwlnc3RydHBjZWx0cGF5LmgJXAorCWdzdHJ0cGNlbHRkZXBheS5oIFwKKwlnc3RydHBkdmRlcGF5LmggXAorCWdzdHJ0cGR2cGF5LmggXAorCWdzdHJ0cGFtcmRlcGF5LmggXAorCWdzdHJ0cGFtcnBheS5oIAlcCisJZ3N0cnRwZ3N0ZGVwYXkuaCBcCisJZ3N0cnRwZ3N0cGF5LmggCVwKKwlnc3RydHBpbGJjZGVwYXkuaCBcCisJZ3N0cnRwaWxiY3BheS5oIFwKKwlnc3RydHBwY21hZGVwYXkuaCBcCisJZ3N0cnRwcGNtdWRlcGF5LmggXAorCWdzdHJ0cHBjbXVwYXkuaCBcCisJZ3N0cnRwcGNtYXBheS5oIFwKKwlnc3RydHBnNzIyZGVwYXkuaCBcCisJZ3N0cnRwZzcyMnBheS5oIFwKKwlnc3RydHBnNzIzZGVwYXkuaFwKKwlnc3RydHBnNzIzcGF5LmggXAorCWdzdHJ0cGc3MjZkZXBheS5oIFwKKwlnc3RydHBnNzI2cGF5LmggXAorCWdzdHJ0cGc3MjlkZXBheS5oIFwKKwlnc3RydHBnNzI5cGF5LmggXAorCWdzdHJ0cGdzbWRlcGF5LmggXAorCWdzdHJ0cGdzbXBheS5oIAlcCisJZ3N0cnRwbXBhZGVwYXkuaCBcCisJZ3N0cnRwbXBhcm9idXN0ZGVwYXkuaCBcCisJZ3N0cnRwbXBhcGF5LmggXAorCWdzdHJ0cG1wdmRlcGF5LmggXAorCWdzdHJ0cG1wdnBheS5oIFwKKwlnc3RydHBoMjYxcGF5LmggXAorCWdzdHJ0cGgyNjFkZXBheS5oIFwKKwlnc3RydHBoMjYzcGRlcGF5LmggXAorCWdzdHJ0cGgyNjNwcGF5LmggXAorCWdzdHJ0cGgyNjNkZXBheS5oIFwKKwlnc3RydHBoMjYzcGF5LmggXAorCWdzdHJ0cGgyNjRkZXBheS5oIFwKKwlnc3RydHBoMjY0cGF5LmggXAorCWdzdHJ0cGgyNjVkZXBheS5oIFwKKwlnc3RydHBoMjY1cGF5LmggXAorCWdzdHJ0cGgyNjV0eXBlcy5oIFwKKwlnc3RydHBqMmtkZXBheS5oIFwKKwlnc3RydHBqMmtwYXkuaCBcCisJZ3N0cnRwajJrY29tbW9uLmggXAorCWdzdHJ0cGpwZWdkZXBheS5oIFwKKwlnc3RydHBqcGVncGF5LmggXAorCWdzdHJ0cGtsdmRlcGF5LmggXAorCWdzdHJ0cGtsdnBheS5oIFwKKwlnc3RydHBtcDFzZGVwYXkuaCBcCisJZ3N0cnRwbXAydGRlcGF5LmggXAorCWdzdHJ0cG1wMnRwYXkuaCBcCisJZ3N0cnRwbXA0dmRlcGF5LmggXAorCWdzdHJ0cG1wNHZwYXkuaAlcCisJZ3N0cnRwbXA0Z2RlcGF5LmggXAorCWdzdHJ0cG1wNGdwYXkuaAlcCisJZ3N0cnRwbXA0YWRlcGF5LmggXAorCWdzdHJ0cG1wNGFwYXkuaCBcCisJZ3N0cnRwb3B1c2RlcGF5LmggXAorCWdzdHJ0cG9wdXNwYXkuaCBcCisJZ3N0YXN0ZXJpc2toMjYzLmggXAorCWdzdHJ0cHFjZWxwZGVwYXkuaCBcCisJZ3N0cnRwcWRtZGVwYXkuaCBcCisJZ3N0cnRwc2JjZGVwYXkuaCBcCisJZ3N0cnRwc2JjcGF5LmggXAorCWdzdHJ0cHNpcmVucGF5LmggXAorCWdzdHJ0cHNpcmVuZGVwYXkuaCBcCisJZ3N0cnRwc3BlZXhkZXBheS5oIFwKKwlnc3RydHBzcGVleHBheS5oIFwKKwlnc3RydHBzdjN2ZGVwYXkuaCBcCisJZ3N0cnRwdGhlb3JhZGVwYXkuaCBcCisJZ3N0cnRwdGhlb3JhcGF5LmggXAorCWdzdHJ0cHZvcmJpc2RlcGF5LmggXAorCWdzdHJ0cHZvcmJpc3BheS5oIFwKKwlnc3RydHB2cDhkZXBheS5oIFwKKwlnc3RydHB2cDhwYXkuaCBcCisJZ3N0cnRwdnA5ZGVwYXkuaCBcCisJZ3N0cnRwdnA5cGF5LmggXAorCWdzdHJ0cHZyYXdkZXBheS5oIFwKKwlnc3RydHB2cmF3cGF5LmggXAorCWdzdHJ0cHN0cmVhbXBheS5oIFwKKwlnc3RydHBzdHJlYW1kZXBheS5oIFwKKwlnc3RydHB1dGlscy5oCisKK0VYVFJBX0RJU1QgPSBkYm9vbGh1ZmYuTElDRU5TRQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9SRUFETUUgYi9nc3QvcnRwL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTQzMTFlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9SRUFETUUKQEAgLTAsMCArMSwzOTggQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHNvbWUgUlRQIHBheWxvYWRlcnMvZGVwYXlsb2FkZXJzIGZvciBkaWZmZXJlbnQgcGF5bG9hZAordHlwZXMuIFVzZSBvbmUgcGF5bG9hZGVyL2RlcGF5bG9kZXIgcGFpciBwZXIgcGF5bG9hZC4gSWYgc2V2ZXJhbCBwYXlsb2FkcyBjYW4gYmUKK3BheWxvYWRlZC9kZXBheWxvYWRlZCBieSB0aGUgc2FtZSBlbGVtZW50LCBtYWtlIGRpZmZlcmVudCBjb3BpZXMgb2YgaXQsIG9uZSBmb3IKK2VhY2ggcGF5bG9hZC4KKworVGhlIGFwcGxpY2F0aW9uL3gtcnRwIG1pbWUgdHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGb3IgdmFsaWQgUlRQIHBhY2tldHMgZW5jYXBzdWxhdGVkIGluIEdzdEJ1ZmZlcnMsIHdlIHVzZSB0aGUgY2FwcyB3aXRoCittaW1lIHR5cGUgYXBwbGljYXRpb24veC1ydHAuCisKK1RoZSBmb2xsb3dpbmcgZmllbGRzIGNhbiBvciBtdXN0ICgqKSBiZSBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdHVyZToKKworICogbWVkaWE6IChTdHJpbmcpIFsgImF1ZGlvIiwgInZpZGVvIiwgImFwcGxpY2F0aW9uIiwgImRhdGEiLCAiY29udHJvbCIgXQorICAgICBEZWZpbmVkIGluIFJGQyAyMzI3IGluIHRoZSBTRFAgbWVkaWEgYW5ub3VuY2VtZW50IGZpZWxkLgorICAgICBDb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KKworICogcGF5bG9hZDogKGludCkgWzAsIDEyN10KKyAgICAgRm9yIGF1ZGlvIGFuZCB2aWRlbywgdGhlc2Ugd2lsbCBub3JtYWxseSBiZSBhIG1lZGlhIHBheWxvYWQgdHlwZSBhcyAKKyAgICAgZGVmaW5lZCBpbiB0aGUgUlRQIEF1ZGlvL1ZpZGVvIFByb2ZpbGUuIEZvciBkeW5hbWljYWx5IGFsbG9jYXRlZCAKKyAgICAgcGF5bG9hZCB0eXBlcywgdGhpcyB2YWx1ZSB3aWxsIGJlID49IDk2IGFuZCB0aGUgZW5jb2RpbmctbmFtZSBtdXN0IGJlCisgICAgIHNldC4KKworICogY2xvY2stcmF0ZTogKGludCkgWzAgLSBNQVhJTlRdCisgICAgVGhlIFJUUCBjbG9jayByYXRlLiAKKworICAgZW5jb2RpbmctbmFtZTogKFN0cmluZykgQU5ZCisgICAgIHR5cGljYWxseSBzZWNvbmQgcGFydCBvZiB0aGUgbWltZSB0eXBlLiBleC4gTVA0Vi1FUy4gb25seSByZXF1aXJlZCBpZgorICAgICBwYXlsb2FkIHR5cGUgPj0gOTYuIENvbnZlcnRlZCB0byB1cHBlciBjYXNlLgorCisgICBlbmNvZGluZy1wYXJhbXM6IChTdHJpbmcpIEFOWQorICAgICBleHRyYSBlbmNvZGluZyBwYXJhbWV0ZXJzIChhcyBpbiB0aGUgU0RQIGE9cnRwbWFwOiBmaWVsZCkuIG9ubHkgcmVxdWlyZWQKKyAgICAgaWYgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgb2YgdGhlIGVuY29kaW5nLW5hbWUuCisgICAgIENvbnZlcnRlZCB0byBsb3dlci1jYXNlLgorICAgICAKKyAgIHNzcmM6ICh1aW50KSBbMCAtIE1BWElOVF0KKyAgICBUaGUgc3NyYyB2YWx1ZSBjdXJyZW50bHkgaW4gdXNlLiAoZGVmYXVsdCA9IHRoZSBTU1JDIG9mIHRoZSBmaXJzdCBSVFAKKyAgICBwYWNrZXQpCisKKyAgIHRpbWVzdGFtcC1vZmZzZXQ6ICh1aW50KSBbMCAtIE1BWElOVF0KKyAgICBUaGUgUlRQIHRpbWUgcmVwcmVzZW50aW5nIHRpbWUgbnB0LXN0YXJ0LiAoZGVmYXVsdCA9IHJ0cHRpbWUgb2YgZmlyc3QgUlRQCisgICAgcGFja2V0KS4KKworICAgc2VxbnVtLW9mZnNldDogKHVpbnQpIFswIC0gTUFYSU5UXQorICAgIFRoZSBSVFAgc2VxdWVuY2UgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgZmlyc3QgcnRwIHBhY2tldC4gV2hlbiB0aGlzCisgICAgcGFyYW1ldGVyIGlzIGdpdmVuLCBhbGwgc2VxdWVuY2UgbnVtYmVycyBiZWxvdyB0aGlzIHNlcW51bSBzaG91bGQgYmUKKyAgICBpZ25vcmVkLiAoZGVmYXVsdCA9IHNlcW51bSBvZiBmaXJzdCBSVFAgcGFja2V0KS4KKworICAgbnB0LXN0YXJ0OiAodWludDY0KSBbMCAtIE1BWElOVF0KKyAgICBUaGUgTm9ybWFsIFBsYXkgVGltZSBmb3IgY2xvY2stYmFzZS4gVGhpcyBpcyB0aGUgcG9zaXRpb24gaW4gdGhlIHN0cmVhbSBhbmQKKyAgICBpcyBiZXR3ZWVuIDAgYW5kIHRoZSBkdXJhdGlvbiBvZiB0aGUgc3RyZWFtLiBUaGlzIHZhbHVlIGlzIGV4cHJlc3NlZCBpbgorICAgIG5hbm9zZWNvbmRzIEdzdENsb2NrVGltZS4gKGRlZmF1bHQgPSAwKQorCisgICBucHQtc3RvcDogKHVpbnQ2NCkgWzAgLSBNQVhJTlRdIAorICAgIFRoZSBsYXN0IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0uIFRoaXMgdmFsdWUgaXMgZXhwcmVzc2VkIGluIG5hbm9zZWNvbmRzCisgICAgR3N0Q2xvY2tUaW1lLiAoZGVmYXVsdCA9IC0xLCBzdG9wIHVua25vd24pCisKKyAgIHBsYXktc3BlZWQ6IChnZG91YmxlKSBbLU1JTiAtIE1BWF0KKyAgICBUaGUgaW50ZW5kZWQgcGxheWJhY2sgc3BlZWQgb2YgdGhlIHN0cmVhbS4gVGhlIGNsaWVudCBpcyBkZWxpdmVyZWQgZGF0YSBhdAorICAgIHRoZSBhZGp1c3RlZCBzcGVlZC4gVGhlIGNsaWVudCBzaG91bGQgYWRqdXN0IGl0cyBwbGF5YmFjayBzcGVlZCB3aXRoIHRoaXMKKyAgICB2YWx1ZSBhbmQgdGh1cyBjb3JyZXNwb25kcyB0byB0aGUgR1N0cmVhbWVyIHJhdGUgZmllbGQgaW4gdGhlIE5FV1NFR01FTlQKKyAgICBldmVudC4gKGRlZmF1bHQgPSAxLjApCisgICAgCisgICBwbGF5LXNjYWxlOiAoZ2RvdWJsZSkgWy1NSU4gLSBNQVhdCisgICAgVGhlIHJhdGUgYWxyZWFkeSBhcHBsaWVkIHRvIHRoZSBzdHJlYW0uIFRoZSBjbGllbnQgaXMgZGVsaXZlcmVkIGEgc3RyZWFtCisgICAgdGhhdCBpcyBzY2FsZWQgYnkgdGhpcyBhbW91bnQuIFRoaXMgdmFsdWUgaXMgdXNlZCB0byBhZGp1c3QgcG9zaXRpb24KKyAgICByZXBvcnRpbmcgYW5kIGNvcnJlc3BvbmRzIHRvIHRoZSBHU3RyZWFtIGFwcGxpZWQtcmF0ZSBmaWVsZCBpbiB0aGUKKyAgICBORVdTRUdNRU5UIGV2ZW50LiAoZGVmYXVsdCA9IDEuMCkKKworICAgbWF4cHRpbWU6ICh1aW50KSBbMCwgTUFYXQorICAgIFRoZSBtYXhwdGltZSBhcyBkZWZpbmVkIGluIFJGQyA0NTY2LCB0aGlzIGRlZmluZXMgdGhlIG1heGltdW0gc2l6ZSBvZiBhCisgICAgcGFja2V0LiBJdCBvdmVycmlkZXMgdGhlIG1heC1wdGltZSBwcm9wZXJ0eSBvZiBwYXlsb2FkZXJzLgorCisgICBPcHRpb25hbCBwYXJhbWV0ZXJzIGFzIGtleS92YWx1ZSBwYWlycywgbWVkaWEgdHlwZSBzcGVjaWZpYy4gVGhlIHZhbHVlIHR5cGUKKyAgIHNob3VsZCBiZSBvZiB0eXBlIEdfVFlQRV9TVFJJTkcuIFRoZSBrZXkgaXMgY29udmVydGVkIHRvIGxvd2VyLWNhc2UuIFRoZQorICAgdmFsdWUgaXMgbGVmdCBpbiBpdHMgb3JpZ2luYWwgY2FzZS4KKyAgIEEgcGFyYW1ldGVyIHdpdGggbm8gdmFsdWUgaXMgY29udmVydGVkIHRvIDxwYXJhbT49MS4KKworIEV4YW1wbGU6CisKKyAgImFwcGxpY2F0aW9uL3gtcnRwIiwKKyAgICAgICJtZWRpYSIsIEdfVFlQRV9TVFJJTkcsICJhdWRpbyIsCQktLgorICAgICAgInBheWxvYWQiLCBHX1RZUEVfSU5ULCA5NiwgICAgICAgICAgICAgICAgIHwgLSByZXF1aXJlZAorICAgICAgImNsb2NrLXJhdGUiLCBHX1RZUEVfSU5ULCA4MDAwLCAgICAgICAgICAgLScKKyAgICAgICJlbmNvZGluZy1uYW1lIiwgR19UWVBFX1NUUklORywgIkFNUiIsICAgIC0uIC0gcmVxdWlyZWQgc2luY2UgcGF5bG9hZCA+PSA5NgorICAgICAgImVuY29kaW5nLXBhcmFtcyIsIEdfVFlQRV9TVFJJTkcsICIxIiwJLScgLSBvcHRpb25hbCBwYXJhbSBmb3IgQU1SCisgICAgICAib2N0ZXQtYWxpZ24iLCBHX1RZUEVfU1RSSU5HLCAiMSIsCS0uCisgICAgICAiY3JjIiwgR19UWVBFX1NUUklORywgIjAiLCAgICAgICAgICAgICAgICAgfAorICAgICAgInJvYnVzdC1zb3J0aW5nIiwgR19UWVBFX1NUUklORywgIjAiLCAgICAgIHwgIEFNUiBzcGVjaWZpYyBwYXJhbXMuCisgICAgICAiaW50ZXJsZWF2aW5nIiwgR19UWVBFX1NUUklORywgIjAiLCAgICAgICAtJworICAKKyBNYXBwaW5nIG9mIGNhcHMgdG8gYW5kIGZyb20gU0RQIGZpZWxkczoKKworICAgbT08bWVkaWE+IDx1ZHAgcG9ydD4gUlRQL0FWUCA8cGF5bG9hZD4gICAgICAgLV0gbWVkaWEgYW5kIHBheWxvYWQgZnJvbSBjYXBzCisgICBhPXJ0cG1hcDo8cGF5bG9hZD4gPGVuY29kaW5nLW5hbWU+LzxjbG9jay1yYXRlPlsvPGVuY29kaW5nLXBhcmFtcz5dCisgICAgICAgICAgICAgIC0+IHdoZW4gPHBheWxvYWQ+ID49IDk2CisgICBhPWZtdHA6PHBheWxvYWQ+IDxwYXJhbT49PHZhbHVlPjsuLi4KKworIEZvciBhYm92ZSBjYXBzOgorCisgICBtPWF1ZGlvIDx1ZHAgcG9ydD4gUlRQL0FWUCA5NgorICAgYT1ydHBtYXA6OTYgQU1SLzgwMDAvMQorICAgYT1mbXRwOjk2IG9jdGV0LWFsaWduPTE7Y3JjPTA7cm9idXN0LXNvcnRpbmc9MDtpbnRlcmxlYXZpbmc9MAorCisgQXR0cmlidXRlcyBhcmUgY29udmVydGVkIGFzIGZvbGxvd3M6CisKKyAgSUFOQSByZWdpc3RlcmVkIGF0dHJpYnV0ZSBuYW1lcyBhcmUgcHJlcGVuZGVkIHdpdGggJ2EtJyBiZWZvcmUgcHV0dGluZyB0aGVtIGluCisgIHRoZSBjYXBzLiBVbnJlZ2lzdGVyZWQga2V5cyAoc3RhcnRpbmcgd2l0aCAneC0nKSBhcmUgY29waWVkIGRpcmVjdGx5IGludG8gdGhlCisgIGNhcHMuCisKKyBpbiBSVFNQLCB0aGUgU1NSQyBpcyBhbHNvIHNlbnQuCisKKyBUaGUgb3B0aW9uYWwgcGFyYW1ldGVycyBpbiB0aGUgU0RQIGZpZWxkcyBhcmUgY2FzZSBpbnNlbnNpdGl2ZS4gSW4gdGhlIGNhcHMgd2UKKyBhbHdheXMgdXNlIHRoZSBsb3dlcmNhc2UgbmFtZXMgc28gdGhhdCB0aGUgU0RQIC0+IGNhcHMgbWFwcGluZyByZW1haW5zCisgcG9zc2libGUuCisKKyBNYXBwaW5nIG9mIGNhcHMgdG8gTkVXU0VHTUVOVDoKKworICByYXRlOiAgICAgICAgIDxwbGF5LXNwZWVkPgorICBhcHBsaWVkLXJhdGU6IDxwbGF5LXNjYWxlPgorICBmb3JtYXQ6ICAgICAgIEdTVF9GT1JNQVRfVElNRQorICBzdGFydDogICAgICAgIDxjbG9jay1iYXNlPiAqIEdTVF9TRUNPTkQgLyA8Y2xvY2stcmF0ZT4KKyAgc3RvcDogICAgICAgICBpZiA8bnRwLXN0b3A+ICE9IC0xCisgICAgICAgICAgICAgICAgICA8bnB0LXN0b3A+IC0gPG5wdC1zdGFydD4gKyBzdGFydAorCQllbHNlIAorCQkgIC0xCisgIHRpbWU6ICAgICAgICAgPG5wdC1zdGFydD4KKworCitUaW1lc3RhbXBpbmcKKy0tLS0tLS0tLS0tLQorCitSVFAgaW4gR1N0cmVhbWVyIHVzZXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgUlRQIHRpbWVzdGFtcHMgYW5kIEdTdHJlYW1lciBidWZmZXIKK3RpbWVzdGFtcHMgdG8gZW5zdXJlIHByb3BlciBzeW5jaHJvbmlzYXRpb24gYXQgdGhlIHNlbmRlciBhbmQgdGhlIHJlY2VpdmVyIGVuZC4KKworSW4gUlRQIGFwcGxpY2F0aW9ucywgdGhlIHN5bmNocm9uaXNhdGlvbiBpcyBtb3N0IGNvbXBsZXggYXQgdGhlIHJlY2VpdmVyIHNpZGUuCisKK0F0IHRoZSBzZW5kZXIgc2lkZSwgdGhlIFJUUCB0aW1lc3RhbXBzIGFyZSBnZW5lcmF0ZWQgaW4gdGhlIHBheWxvYWRlcnMgYmFzZWQgb24KK0dTdHJlYW1lciB0aW1lc3RhbXBzLiBBdCB0aGUgcmVjZWl2ZXIsIEdTdHJlYW1lciB0aW1lc3RhbXBzIGFyZSByZWNvbnN0cnVjdGVkCitmcm9tIHRoZSBSVFAgdGltZXN0YW1wcyBhbmQgdGhlIEdTdHJlYW1lciB0aW1lc3RhbXBzIGluIHRoZSBqaXR0ZXJidWZmZXIuIFRoaXMKK3Byb2Nlc3MgaXMgZXhwbGFpbmVkIGluIG1vcmUgZGV0YWlsIGJlbG93LgorCis9IHN5bmNocm9uaXNhdGlvbiBhdCB0aGUgc2VuZGVyCisKK0luZGl2aWR1YWwgc3RyZWFtcyBhdCB0aGUgc2VuZGVyIGFyZSBzeW5jaHJvbmlzZWQgdXNpbmcgR1N0cmVhbWVyIHRpbWVzdGFtcHMuCitUaGUgcGF5bG9hZGVyIGF0IHRoZSBzZW5kZXIgd2lsbCBjb252ZXJ0IHRoZSBHU3RyZWFtZXIgdGltZXN0YW1wIGludG8gYW4gUlRQCit0aW1lc3RhbXAgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtdWxhOgorCisgICBSVFAgPSAoKFJUIC0gUlQtYmFzZSkgKiBjbG9jay1yYXRlIC8gR1NUX1NFQ09ORCkgKyBSVFAtb2Zmc2V0CisKKyAgUlRQOiAgICAgICAgdGhlIFJUUCB0aW1lc3RhbXAgZm9yIHRoZSBzdHJlYW0uIFRoaXMgdmFsdWUgaXMgdHJ1bmNhdGVkIHRvCisgICAgICAgICAgICAgIDMyIGJpdHMuCisgIFJUOiAgICAgICAgIHRoZSBHU3RyZWFtZXIgcnVubmluZyB0aW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRpbWVzdGFtcCBvZiB0aGUKKyAgICAgICAgICAgICAgcGFja2V0IHRvIHBheWxvYWQKKyAgUlQtYmFzZTogICAgdGhlIEdTdHJlYW1lciBydW5uaW5nIHRpbWUgb2YgdGhlIGZpcnN0IHBhY2tldCBlbmNvZGVkCisgIGNsb2NrLXJhdGU6IHRoZSBjbG9jay1yYXRlIG9mIHRoZSBzdHJlYW0KKyAgUlRQLW9mZnNldDogYSByYW5kb20gUlRQIG9mZnNldAorCitUaGUgUlRQIHRpbWVzdGFtcCBjb3JyZXNwb25kaW5nIHRvIFJULWJhc2UgaXMgdGhlIGNsb2NrLWJhc2UgKHNlZSBjYXBzIGFib3ZlKS4gCisKK0luIGFkZGl0aW9uIHRvIHNldHRpbmcgYW4gUlRQIHRpbWVzdGFtcCBpbiB0aGUgUlRQIHBhY2tldCwgdGhlIHBheWxvYWRlciBpcyBhbHNvCityZXNwb25zaWJsZSBmb3IgcHV0dGluZyB0aGUgR1N0cmVhbWVyIHRpbWVzdGFtcCBvbiB0aGUgcmVzdWx0aW5nIG91dHB1dCBidWZmZXIuCitUaGlzIHRpbWVzdGFtcCBpcyB1c2VkIGZvciBmdXJ0aGVyIHN5bmNocm9uaXNhdGlvbiBhdCB0aGUgc2VuZGVyIHBpcGVsaW5lLCBzdWNoCithcyBmb3Igc2VuZGluZyBvdXQgdGhlIHBhY2tldCBvbiB0aGUgbmV0d29yay4KKworTm90aWNlIHRoYXQgdGhlIGFic29sdXRlIHRpbWluZyBpbmZvcm1hdGlvbiBpcyBsb3N0OyBpZiB0aGUgc2VuZGVyIGlzIHNlbmRpbmcKK211bHRpcGxlIHN0cmVhbXMsIHRoZSBSVFAgdGltZXN0YW1wcyBpbiB0aGUgcGFja2V0cyBkbyBub3QgY29udGFpbiBlbm91Z2gKK2luZm9ybWF0aW9uIHRvIHN5bmNocm9uaXplIHRoZW0gaW4gdGhlIHJlY2VpdmVyLiBUaGUgcmVjZWl2ZXIgY2FuIGhvd2V2ZXIgdXNlCit0aGUgUlRQIHRpbWVzdGFtcHMgdG8gcmVjb25zdHJ1Y3QgdGhlIHRpbWluZyBvZiB0aGUgc3RyZWFtIGFzIGl0IHdhcyBjcmVhdGVkIGJ5Cit0aGUgc2VuZGVyIGFjY29yZGluZyB0byB0aGUgc2VuZGVyJ3MgY2xvY2suCisKK0JlY2F1c2UgdGhlIHBheWxvYWRlZCBwYWNrZXQgY29udGFpbnMgYm90aCBhbiBSVFAgdGltZXN0YW1wIGFuZCBhIEdTdHJlYW1lcgordGltZXN0YW1wLCBpdCBpcyBwb3NzaWJsZSBmb3IgYW4gUlRQIHNlc3Npb24gbWFuYWdlciB0byBkZXJpdmUgdGhlIHJlbGF0aW9uCitiZXR3ZWVuIHRoZSBSVFAgYW5kIEdTVCB0aW1lc3RhbXBzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgYnkgYSBzZXNzaW9uCittYW5hZ2VyIHRvIGNyZWF0ZSBTUiByZXBvcnRzLiBUaGUgTlRQIHRpbWUgaW4gdGhlIHJlcG9ydCB3aWxsIGNvbnRhaW4gdGhlCitydW5uaW5nIHRpbWUgY29udmVydGVkIHRvIE5UUCB0aW1lIGFuZCB0aGUgY29ycmVzcG9uZGluZyBSVFAgdGltZXN0YW1wLgorCitOb3RlIHRoYXQgYXQgdGhlIHNlbmRlciBzaWRlLCB0aGUgUlRQIGFuZCBHU3RyZWFtZXIgdGltZXN0YW1wIGJvdGggaW5jcmVtZW50IGF0Cit0aGUgc2FtZSByYXRlLCB0aGUgc2VuZGVyIHJhdGUuIFRoaXMgcmF0ZSBkZXBlbmRzIG9uIHRoZSBnbG9iYWwgcGlwZWxpbmUgY2xvY2sKK29mIHRoZSBzZW5kZXIuIAorCitTb21lIHBpcGVsaW5lcyB0byBpbGx1c3RyYXRlIHRoZSBwcm9jZXNzOgorCisgICAgZ3N0LWxhdW5jaC0xLjAgdjRsMnNyYyAhIHZpZGVvY29udmVydCAhIGF2ZW5jX2gyNjNwICEgcnRwaDI2M3BwYXkgISB1ZHBzaW5rCisKKyAgdjRsMnNyYyBwdXRzIGEgR1N0cmVhbWVyIHRpbWVzdGFtcCBvbiB0aGUgdmlkZW8gZnJhbWVzIGJhc2Ugb24gdGhlIGN1cnJlbnQKKyAgcnVubmluZ190aW1lLiBUaGUgZW5jb2RlciBlbmNvZGVzIGFuZCBwYXNzZWQgdGhlIHRpbWVzdGFtcCBvbi4gVGhlIHBheWxvYWRlcgorICBnZW5lcmF0ZXMgYW4gUlRQIHRpbWVzdGFtcCB1c2luZyB0aGUgYWJvdmUgZm9ybXVsYSBhbmQgcHV0cyBpdCBpbiB0aGUgUlRQCisgIHBhY2tldC4gSXQgYWxzbyBjb3BpZXMgdGhlIGluY29tbWluZyBHU3RyZWFtZXIgdGltZXN0YW1wIG9uIHRoZSBvdXRwdXQgUlRQCisgIHBhY2tldC4gdWRwc2luayBzeW5jaHJvbml6ZXMgb24gdGhlIGdzdHJlYW1lciB0aW1lc3RhbXAgYmVmb3JlIHB1c2hpbmcgb3V0IHRoZQorICBwYWNrZXQuIAorCisKKz0gc3luY2hyb25pc2F0aW9uIGF0IHRoZSByZWNlaXZlcgorCitUaGUgcmVjZWl2ZXIgaXMgcmVzcG9uc2libGUgZm9yIHRpbWVzdGFtcGluZyB0aGUgcmVjZWl2ZWQgUlRQIHBhY2tldCB3aXRoIHRoZQorcnVubmluZ190aW1lIG9mIHRoZSBjbG9jayBhdCB0aGUgdGltZSB0aGUgcGFja2V0IHdhcyByZWNlaXZlZC4gVGhpcyBHU3RyZWFtZXIKK3RpbWVzdGFtcCByZWZsZWN0cyB0aGUgcmVjZWl2ZXIgcmF0ZSBhbmQgZGVwZW5kcyBvbiB0aGUgZ2xvYmFsIHBpcGVsaW5lIGNsb2NrIG9mCit0aGUgcmVjZWl2ZXIuIFRoZSBnc3RyZWFtZXIgdGltZXN0YW1wIG9mIHRoZSByZWNlaXZlZCBSVFAgcGFja2V0IGNvbnRhaW5zIGEKK2NlcnRhaW4gYW1vdW50IG9mIGppdHRlciBpbnRyb2R1Y2VkIGJ5IHRoZSBuZXR3b3JrLgorCitUaGUgbW9zdCBzaW1wbGUgb3B0aW9uIGZvciB0aGUgcmVjZWl2ZXIgaXMgdG8gZGVwYXlsb2FkIHRoZSBSVFAgcGFja2V0IGFuZCBwbGF5CitpdCBiYWNrIGFzIHNvb24gYXMgcG9zc2libGUsIHRoaXMgaXMgd2l0aCB0aGUgdGltZXN0YW1wIHdoZW4gaXQgd2FzIHJlY2VpdmVkCitmcm9tIHRoZSBuZXR3b3JrLiBGb3IgdGhlIGFib3ZlIHNlbmRlciBwaXBlbGluZSB0aGlzIHdvdWxkIGJlIGRvbmUgd2l0aCB0aGUKK2ZvbGxvd2luZyBwaXBlbGluZToKKworICAgIGdzdC1sYXVuY2gtMS4wIHVkcHNyYyBjYXBzPSJhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywKKyAgICAgIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjMtMTk5OCIgISBydHBoMjYzcGRlcGF5ICEKKyAgICAgIGF2ZGVjX2gyNjMgISBhdXRvdmlkZW9zaW5rCisKK0l0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBkZXBheWxvYWRlciBjb3BpZXMgdGhlIGluY29tbWluZyBHU3RyZWFtZXIgdGltZXN0YW1wCitkaXJlY3RseSB0byB0aGUgZGVwYXlsb2FkZWQgb3V0cHV0IGJ1ZmZlci4gSXQgc2hvdWxkIG5ldmVyIGF0dGVtcHQgdG8gcGVyZm9ybQorYW55IGxvZ2ljIHdpdGggdGhlIFJUUCB0aW1lc3RhbXAsIHRoaXMgdGFzayBpcyBmb3IgdGhlIGppdHRlcmJ1ZmZlciBhcyB3ZSB3aWxsCitzZWUgbmV4dC4KKworVGhlIGFib3ZlIHBpcGVsaW5lIGRvZXMgbm90IGF0dGVtcHQgdG8gZGVhbCB3aXRoIHJlb3JkZXJlZCBwYWNrZXRzIG9yIG5ldHdvcmsKK2ppdHRlciwgd2hpY2ggY291bGQgcmVzdWx0IGluIGplcmt5IHBsYXliYWNrIGluIHRoZSBjYXNlIG9mIGhpZ2ggaml0dGVyIG9yCitjb3JydXB0ZWQgdmlkZW8gaW4gdGhlIGNhc2Ugb2YgcGFja2V0IGxvc3Mgb3IgcmVvcmRlcmluZy4gVGhpcyBmdW5jdGlvbmFsaXR5IGlzCitwZXJmb3JtZWQgYnkgdGhlIGdzdHJ0cGppdHRlcmJ1ZmZlciBpbiBHU3RyZWFtZXIuCisKK1RoZSB0YXNrIG9mIHRoZSBnc3RydHBqaXR0ZXJidWZmZXIgZWxlbWVudCBpcyB0bzoKKworIC0gZGVhbCB3aXRoIHJlb3JkZXJlZCBwYWNrZXRzIGJhc2VkIG9uIHRoZSBzZXFudW0KKyAtIGNhbGN1bGF0ZSB0aGUgZHJpZnQgYmV0d2VlbiB0aGUgc2VuZGVyIGFuZCByZWNlaXZlciBjbG9ja3MgdXNpbmcgdGhlCisgICBHU3RyZWFtZXIgdGltZXN0YW1wcyAocmVjZWl2ZXIgY2xvY2sgcmF0ZSkgYW5kIFJUUCB0aW1lc3RhbXBzIChzZW5kZXIgY2xvY2sKKyAgIHJhdGUpLgorCitUbyBkZWFsIHdpdGggcmVvcmRlcmVkIHBhY2tldCwgdGhlIGppdHRlcmJ1ZmZlciBob2xkcyBvbiB0byB0aGUgcmVjZWl2ZWQgUlRQCitwYWNrZXRzIGluIGEgcXVldWUgZm9yIGEgY29uZmlndXJhYmxlIGFtb3VudCBvZiB0aW1lLCBjYWxsZWQgdGhlIGxhdGVuY3kuCisKK1RoZSBqaXR0ZXJidWZmZXIgYWxzbyBlbGltaW5hdGVzIG5ldHdvcmsgaml0dGVyIGFuZCB0aGVuIHRyYWNrcyB0aGUgZHJpZnQKK2JldHdlZW4gdGhlIGxvY2FsIGNsb2NrIChhcyBleHByZXNzZWQgaW4gdGhlIEdTdHJlYW1lciB0aW1lc3RhbXBzKSBhbmQgdGhlCityZW1vdGUgY2xvY2sgKGFzIGV4cHJlc3NlZCBpbiB0aGUgUlRQIHRpbWVzdGFtcHMpLiBJdCB3aWxsIHJlbW92ZSB0aGUgaml0dGVyCithbmQgd2lsbCBhcHBseSB0aGUgZHJpZnQgY29ycmVjdGlvbiB0byB0aGUgR1N0cmVhbWVyIHRpbWVzdGFtcCBiZWZvcmUgcHVzaGluZwordGhlIGJ1ZmZlciBkb3duc3RyZWFtLiBUaGUgcmVzdWx0IGlzIHRoYXQgdGhlIGRlcGF5bG9hZGVyIHJlY2VpdmVzIGEgc21vb3RoZWQKK0dTdHJlYW1lciB0aW1lc3RhbXAgb24gdGhlIFJUUCBwYWNrZXQsIHdoaWNoIGlzIGNvcGllZCB0byB0aGUgZGVwYXlsb2FkZWQgZGF0YS4KKworVGhlIGZvbGxvd2luZyBwaXBlbGluZSBpbGx1c3RyYXRlcyBhIHJlY2VpdmVyIHdpdGggYSBqaXR0ZXJidWZmZXIuCisKKyAgICBnc3QtbGF1bmNoLTEuMCB1ZHBzcmMgY2Fwcz0iYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sCisgICAgICBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjYzLTE5OTgiICEKKyAgICAgIHJ0cGppdHRlcmJ1ZmZlciBsYXRlbmN5PTEwMCAhIHJ0cGgyNjNwZGVwYXkgISAgYXZkZWNfaDI2MyAhIGF1dG92aWRlb3NpbmsKKworVGhlIGxhdGVuY3kgcHJvcGVydHkgb24gdGhlIGppdHRlcmJ1ZmZlciBjb250cm9scyB0aGUgYW1vdW50IG9mIGRlbGF5IChpbgorbWlsbGlzZWNvbmRzKSB0byBhcHBseSB0byB0aGUgb3V0Z29pbmcgcGFja2V0cy4gQSBoaWdoZXIgbGF0ZW5jeSB3aWxsIHByb2R1Y2UKK3Ntb290aGVyIHBsYXliYWNrIGluIG5ldHdvcmtzIHdpdGggaGlnaCBqaXR0ZXIgYnV0IGNhdXNlIGEgaGlnaGVyIGxhdGVuY3kuCitDaG9vc2luZyBhIGdvb2QgdmFsdWUgZm9yIHRoZSBsYXRlbmN5IGlzIGEgdHJhZGVvZmYgYmV0d2VlbiB0aGUgcXVhbGl0eSBhbmQKK2xhdGVuY3kuIFRoZSBiZXR0ZXIgdGhlIG5ldHdvcmssIHRoZSBsb3dlciB0aGUgbGF0ZW5jeSBjYW4gYmUgc2V0LgorCisKK3VzYWdlIHdpdGggVURQCistLS0tLS0tLS0tLS0tLQorCitUbyBjb3JyZWN0bHkgYW5kIGNvbXBsZXRlbHkgdXNlIHRoZSBSVFAgcGF5bG9hZGVycyBvbiB0aGUgc2VuZGVyIGFuZCB0aGUKK3JlY2VpdmVyIHlvdSBuZWVkIHRvIHdyaXRlIGFuIGFwcGxpY2F0aW9uLiBJdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYSBmdWxsCitibG93biBSVFAgc2VydmVyIHdpdGggYSBzaW5nbGUgZ3N0LWxhdW5jaC0xLjAgbGluZS4KKworVGhhdCBzYWlkLCBpdCBpcyBwb3NzaWJsZSB0byBkbyBzb21ldGhpbmcgZnVuY3Rpb25hbCB3aXRoIGEgZmV3IGdzdC1sYXVuY2gKK2xpbmVzLiBUaGUgYmlnZ2VzdCBwcm9ibGVtIHdoZW4gY29uc3RydWN0aW5nIGEgY29ycmVjdCBnc3QtbGF1bmNoLTEuMCBsaW5lIGxpZXMgb24KK3RoZSByZWNlaXZlciBlbmQuIAorCitUaGUgcmVjZWl2ZXIgbmVlZHMgdG8ga25vdyBhYm91dCB0aGUgdHlwZSBvZiB0aGUgUlRQIGRhdGEgYWxvbmcgd2l0aCBhIHNldCBvZgorUlRQIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c3VhbGx5IHRyYW5zbWl0dGVkIHRvIHRoZQorY2xpZW50IHVzaW5nIHNvbWUgc29ydCBvZiBzZXNzaW9uIGRlc2NyaXB0aW9uIGxhbmd1YWdlIChTRFApIG92ZXIgc29tZSByZWxpYWJsZQorY2hhbm5lbCAoSFRUUC9SVFNQLy4uLikuICAKKworQWxsIG9mIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzIHRvIGNvbm5lY3QgYW5kIHVzZSB0aGUgUlRQIHNlc3Npb24gb24gdGhlCitzZXJ2ZXIgY2FuIGJlIGZvdW5kIGluIHRoZSBjYXBzIG9uIHRoZSBzZXJ2ZXIgZW5kLiBUaGUgY2xpZW50IHJlY2VpdmVzIHRoaXMKK2luZm9ybWF0aW9uIGluIHNvbWUgd2F5IChjYXBzIGFyZSBjb252ZXJ0ZWQgdG8gYW5kIGZyb20gU0RQLCBhcyBleHBsYWluZWQgYWJvdmUsCitmb3IgZXhhbXBsZSkuCisKK1NvbWUgZ3N0LWxhdW5jaC0xLjAgbGluZXM6CisKKyAgZ3N0LWxhdW5jaC0xLjAgLXYgdmlkZW90ZXN0c3JjICEgdmlkZW9jb252ZXJ0ICEgYXZlbmNfaDI2M3AgISBydHBoMjYzcHBheSAhIHVkcHNpbmsKKworICAgU2V0dGluZyBwaXBlbGluZSB0byBQQVVTRUQgLi4uCisgICAvcGlwZWxpbmUwL3ZpZGVvdGVzdHNyYzAuc3JjOiBjYXBzID0gdmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKUk0MjAsCisgICB3aWR0aD0oaW50KTMyMCwgaGVpZ2h0PShpbnQpMjQwLCBmcmFtZXJhdGU9KGZyYWN0aW9uKTMwLzEKKyAgIFBpcGVsaW5lIGlzIFBSRVJPTExJTkcgLi4uCisgICAuLi4uCisgICAvcGlwZWxpbmUwL3VkcHNpbmswLnNpbms6IGNhcHMgPSBhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZyl2aWRlbywKKyAgIHBheWxvYWQ9KGludCk5NiwgY2xvY2stcmF0ZT0oaW50KTkwMDAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpSDI2My0xOTk4LAorICAgc3NyYz0oZ3VpbnQpNTI3ODQyMzQ1LCBjbG9jay1iYXNlPShndWludCkxMTUwNzc2OTQxLCBzZXFudW0tYmFzZT0oZ3VpbnQpMzA5ODIKKyAgIC4uLi4KKyAgIFBpcGVsaW5lIGlzIFBSRVJPTExFRCAuLi4KKyAgIFNldHRpbmcgcGlwZWxpbmUgdG8gUExBWUlORyAuLi4KKyAgIE5ldyBjbG9jazogR3N0U3lzdGVtQ2xvY2sKKworIFdyaXRlIGRvd24gdGhlIGNhcHMgb24gdGhlIHVkcHNpbmsgYW5kIHNldCB0aGVtIGFzIHRoZSBjYXBzIG9mIHRoZSBVRFAgCisgcmVjZWl2ZXI6CisKKyAgZ3N0LWxhdW5jaC0xLjAgLXYgdWRwc3JjIGNhcHM9ImFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKXZpZGVvLAorICBwYXlsb2FkPShpbnQpOTYsIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjMtMTk5OCwKKyAgc3NyYz0oZ3VpbnQpNTI3ODQyMzQ1LCBjbG9jay1iYXNlPShndWludCkxMTUwNzc2OTQxLCBzZXFudW0tYmFzZT0oZ3VpbnQpMzA5ODIiCisgICEgcnRwaDI2M3BkZXBheSAhIGF2ZGVjX2gyNjMgISBhdXRvdmlkZW9zaW5rCisKKyBUaGUgcmVjZWl2ZXIgbm93IGRpc3BsYXlzIGFuIGgyNjMgaW1hZ2UuIFNpbmNlIHRoZXJlIGlzIG5vIGppdHRlcmJ1ZmZlciBpbiB0aGUKKyBwaXBlbGluZSwgZnJhbWVzIHdpbGwgYmUgZGlzcGxheWVkIGF0IHRoZSB0aW1lIHdoZW4gdGhleSBhcmUgcmVjZWl2ZWQuIFRoaXMgY2FuCisgcmVzdWx0IGluIGplcmt5IHBsYXliYWNrIGluIHRoZSBjYXNlIG9mIGhpZ2ggbmV0d29yayBqaXR0ZXIgb3IgY3VycnVwdGVkIHZpZGVvCisgd2hlbiBwYWNrZXRzIGFyZSBkcm9wcGVkIG9yIHJlb3JkZXJlZC4KKworIFN0cmVhbSBhIHF1aWNrdGltZSBmaWxlIHdpdGggbXBlZzQgdmlkZW8gYW5kIEFBQyBhdWRpbyBvbiBwb3J0IDUwMDAgYW5kIHBvcnQKKyA1MDAyLgorCisgIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249fi9kYXRhL3NpbmNpdHkubXA0ICEgcXRkZW11eCBuYW1lPWQgISBxdWV1ZSAhIHJ0cG1wNHZwYXkgISB1ZHBzaW5rIHBvcnQ9NTAwMAorICAgICAgICAgICAgICAgICAgICAgICAgIGQuICEgcXVldWUgISBydHBtcDRncGF5ICEgdWRwc2luayBwb3J0PTUwMDIKKyAgICAuLi4uCisgICAgL3BpcGVsaW5lMC91ZHBzaW5rMC5zaW5rOiBjYXBzID0gYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sCisgICAgcGF5bG9hZD0oaW50KTk2LCBjbG9jay1yYXRlPShpbnQpOTAwMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylNUDRWLUVTLAorICAgIHNzcmM9KGd1aW50KTExNjI3MDM3MDMsIGNsb2NrLWJhc2U9KGd1aW50KTgxNjEzNTgzNSwgc2VxbnVtLWJhc2U9KGd1aW50KTkyOTQsCisgICAgcHJvZmlsZS1sZXZlbC1pZD0oc3RyaW5nKTMsIGNvbmZpZz0oc3RyaW5nKTAwMDAwMWIwMDMwMDAwMDFiNTA5MDAwMDAxMDAwMDAwMDEyMDAwODZjNWQ0YzMwN2QzMTQwNDNjMTQ2MzAwMDAwMWIyNTg3NjY5NDQzMDMwMzMzNAorICAgIC9waXBlbGluZTAvdWRwc2luazEuc2luazogY2FwcyA9IGFwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLAorICAgIHBheWxvYWQ9KGludCk5NiwgY2xvY2stcmF0ZT0oaW50KTQ0MTAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTVBFRzQtR0VORVJJQywKKyAgICBzc3JjPShndWludCkzMjQ2MTQ5ODk4LCBjbG9jay1iYXNlPShndWludCk0MTM0NTE0MDU4LCBzZXFudW0tYmFzZT0oZ3VpbnQpNTc2MzMsCisgICAgZW5jb2RpbmctcGFyYW1zPShzdHJpbmcpMiwgc3RyZWFtdHlwZT0oc3RyaW5nKTUsIHByb2ZpbGUtbGV2ZWwtaWQ9KHN0cmluZykxLAorICAgIG1vZGU9KHN0cmluZylhYWMtaGJyLCBjb25maWc9KHN0cmluZykxMjEwLCBzaXplbGVuZ3RoPShzdHJpbmcpMTMsCisgICAgaW5kZXhsZW5ndGg9KHN0cmluZykzLCBpbmRleGRlbHRhbGVuZ3RoPShzdHJpbmcpMworICAgIC4uLi4KKworIEFnYWluIGNvcHkgdGhlIGNhcHMgb24gYm90aCBzaW5rcyB0byB0aGUgcmVjZWl2ZXIgbGF1bmNoIGxpbmUKKworICAgIGdzdC1sYXVuY2gtMS4wCisgICAgIHVkcHNyYyBwb3J0PTUwMDAgY2Fwcz0iYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpdmlkZW8sIHBheWxvYWQ9KGludCk5NiwKKyAgICAgIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKU1QNFYtRVMsIHNzcmM9KGd1aW50KTExNjI3MDM3MDMsCisgICAgICBjbG9jay1iYXNlPShndWludCk4MTYxMzU4MzUsIHNlcW51bS1iYXNlPShndWludCk5Mjk0LCBwcm9maWxlLWxldmVsLWlkPShzdHJpbmcpMywKKyAgICAgIGNvbmZpZz0oc3RyaW5nKTAwMDAwMWIwMDMwMDAwMDFiNTA5MDAwMDAxMDAwMDAwMDEyMDAwODZjNWQ0YzMwN2QzMTQwNDNjMTQ2MzAwMDAwMWIyNTg3NjY5NDQzMDMwMzMzNCIKKyAgICAgICEgcnRwbXA0dmRlcGF5ICEgZmZkZWNfbXBlZzQgISBhdXRvdmlkZW9zaW5rIHN5bmM9ZmFsc2UKKyAgICAgdWRwc3JjIHBvcnQ9NTAwMiBjYXBzPSJhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgcGF5bG9hZD0oaW50KTk2LAorICAgICAgY2xvY2stcmF0ZT0oaW50KTQ0MTAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpTVBFRzQtR0VORVJJQywgc3NyYz0oZ3VpbnQpMzI0NjE0OTg5OCwKKyAgICAgIGNsb2NrLWJhc2U9KGd1aW50KTQxMzQ1MTQwNTgsIHNlcW51bS1iYXNlPShndWludCk1NzYzMywgZW5jb2RpbmctcGFyYW1zPShzdHJpbmcpMiwKKyAgICAgIHN0cmVhbXR5cGU9KHN0cmluZyk1LCBwcm9maWxlLWxldmVsLWlkPShzdHJpbmcpMSwgbW9kZT0oc3RyaW5nKWFhYy1oYnIsCisgICAgICBjb25maWc9KHN0cmluZykxMjEwLCBzaXplbGVuZ3RoPShzdHJpbmcpMTMsIGluZGV4bGVuZ3RoPShzdHJpbmcpMywKKyAgICAgIGluZGV4ZGVsdGFsZW5ndGg9KHN0cmluZykzIiAKKyAgICAgICEgcnRwbXA0Z2RlcGF5ICEgZmFhZCAhIGFsc2FzaW5rIHN5bmM9ZmFsc2UKKworIFRoZSBjYXBzIG9uIHRoZSB1ZHBzaW5rcyBjYW4gYmUgcmV0cmlldmVkIHdoZW4gdGhlIHNlcnZlciBwaXBlbGluZSBwcmVyb2xsZWQgdG8KKyBQQVVTRUQuCisKKyBUaGUgYWJvdmUgcGlwZWxpbmUgc2V0cyBzeW5jPWZhbHNlIG9uIHRoZSBhdWRpbyBhbmQgdmlkZW8gc2luayB3aGljaCBtZWFucyB0aGF0Cisgbm8gc3luY2hyb25pc2F0aW9uIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBzaW5rcywgdGhleSBwbGF5IHRoZSBkYXRhIHdoZW4gaXQKKyBhcnJpdmVzLiBJZiB5b3Ugd2FudCB0byBlbmFibGUgc3luY2hyb25pc2F0aW9uIGluIHRoZSBzaW5rcyBpdCBpcyBoaWdobHkKKyByZWNvbW1lbmRlZCB0byB1c2UgYSBnc3RydHBqaXR0ZXJidWZmZXIgYWZ0ZXIgdGhlIHVkcHNyYyBlbGVtZW50cy4gCisgCisgRXZlbiB3aGVuIHN5bmMgaXMgZW5hYmxlZCwgdGhlIHR3byBkaWZmZXJlbnQgc3RyZWFtcyB3aWxsIG5vdCBwbGF5IHN5bmNocm9uaXNlZAorIGFnYWluc3QgZWFjaG90aGVyIGJlY2F1c2UgdGhlIHJlY2VpdmVyIGRvZXMgbm90IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvCisgcGVyZm9ybSB0aGlzIHRhc2suIEZvciB0aGlzIHlvdSBuZWVkIHRvIGFkZCB0aGUgcnRwYmluIGVsZW1lbnQgaW4gYm90aCB0aGUKKyBzZW5kZXIgYW5kIHJlY2VpdmVyIHBpcGVsaW5lIGFuZCB1c2UgYWRkaXRpb25hbCBzb3VyY2VzIGFuZCBzaW5rcyB0byB0cmFuc21pdAorIFJUQ1AgcGFja2V0cyB1c2VkIGZvciBpbnRlci1zdHJlYW0gc3luY2hyb25pc2F0aW9uLgorCisgVGhlIGNhcHMgb24gdGhlIHJlY2VpdmVyIHNpZGUgY2FuIGJlIHNldCBvbiB0aGUgVURQIHNvdXJjZSBlbGVtZW50cyB3aGVuIHRoZQorIHBpcGVsaW5lIHdlbnQgdG8gUEFVU0VELiBJbiB0aGF0IHN0YXRlIG5vIGRhdGEgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgVURQIHNvdXJjZXMKKyBhcyB0aGV5IGFyZSBsaXZlIHNvdXJjZXMgYW5kIG9ubHkgcHJvZHVjZSBkYXRhIGluIFBMQVlJTkcuCisKKworUmVsZXZhbnQgUkZDcworLS0tLS0tLS0tLS0tLQorCiszNTUwIFJUUDogQSBUcmFuc3BvcnQgUHJvdG9jb2wgZm9yIFJlYWwtVGltZSBBcHBsaWNhdGlvbnMuICggMTg4OSBPYnNvbGV0ZSApCisKKzIxOTggUlRQIFBheWxvYWQgZm9yIFJlZHVuZGFudCBBdWRpbyBEYXRhLgorMzExOSBBIE1vcmUgTG9zcy1Ub2xlcmFudCBSVFAgUGF5bG9hZCBGb3JtYXQgZm9yIE1QMyBBdWRpby4KKworMjc5MyBSVFAgUGF5bG9hZCBmb3IgVGV4dCBDb252ZXJzYXRpb24uCisKKzIwMzIgUlRQIFBheWxvYWQgRm9ybWF0IGZvciBILjI2MSBWaWRlbyBTdHJlYW1zLgorMjE5MCBSVFAgUGF5bG9hZCBGb3JtYXQgZm9yIEguMjYzIFZpZGVvIFN0cmVhbXMuCisyMjUwIFJUUCBQYXlsb2FkIEZvcm1hdCBmb3IgTVBFRzEvTVBFRzIgVmlkZW8uCisyMzQzIFJUUCBQYXlsb2FkIEZvcm1hdCBmb3IgQnVuZGxlZCBNUEVHLgorMjQyOSBSVFAgUGF5bG9hZCBGb3JtYXQgZm9yIHRoZSAxOTk4IFZlcnNpb24gb2YgSVRVLVQgUmVjLiBILjI2MyBWaWRlbworMjQzMSBSVFAgUGF5bG9hZCBGb3JtYXQgZm9yIEJULjY1NiBWaWRlbyBFbmNvZGluZy4KKzI0MzUgUlRQIFBheWxvYWQgRm9ybWF0IGZvciBKUEVHLWNvbXByZXNzZWQgVmlkZW8uCiszMDE2IFJUUCBQYXlsb2FkIEZvcm1hdCBmb3IgTVBFRy00IEF1ZGlvL1Zpc3VhbCBTdHJlYW1zLgorMzA0NyBSVFAgUGF5bG9hZCBGb3JtYXQgZm9yIElUVS1UIFJlY29tbWVuZGF0aW9uIEcuNzIyLjEuCiszMTg5IFJUUCBQYXlsb2FkIEZvcm1hdCBmb3IgRFYgKElFQyA2MTgzNCkgVmlkZW8uCiszMTkwIFJUUCBQYXlsb2FkIEZvcm1hdCBmb3IgMTItYml0IERBVCBBdWRpbyBhbmQgMjAtIGFuZCAyNC1iaXQgTGluZWFyIFNhbXBsZWQgQXVkaW8uCiszMzg5IFJlYWwtdGltZSBUcmFuc3BvcnQgUHJvdG9jb2wgKFJUUCkgUGF5bG9hZCBmb3IgQ29tZm9ydCBOb2lzZSAoQ04pCisyNzMzIEFuIFJUUCBQYXlsb2FkIEZvcm1hdCBmb3IgR2VuZXJpYyBGb3J3YXJkIEVycm9yIENvcnJlY3Rpb24uCisyODMzIFJUUCBQYXlsb2FkIGZvciBEVE1GIERpZ2l0cywgVGVsZXBob255IFRvbmVzIGFuZCBUZWxlcGhvbnkKKyAgICAgU2lnbmFscy4KKzI4NjIgUlRQIFBheWxvYWQgRm9ybWF0IGZvciBSZWFsLVRpbWUgUG9pbnRlcnMuCiszMzUxIFJUUCBQcm9maWxlIGZvciBBdWRpbyBhbmQgVmlkZW8gQ29uZmVyZW5jZXMgd2l0aCBNaW5pbWFsIENvbnRyb2wuICggMTg5MCBPYnNvbGV0ZSApCiszNTU1IE1JTUUgVHlwZSBSZWdpc3RyYXRpb24gb2YgUlRQIFBheWxvYWQgRm9ybWF0cy4KKworMjUwOCBDb21wcmVzc2luZyBJUC9VRFAvUlRQIEhlYWRlcnMgZm9yIExvdy1TcGVlZCBTZXJpYWwgTGlua3MuCisxMzA1IE5ldHdvcmsgVGltZSBQcm90b2NvbCAoVmVyc2lvbiAzKSBTcGVjaWZpY2F0aW9uLCBJbXBsZW1lbnRhdGlvbiBhbmQgQW5hbHlzaXMuCiszMzM5IERhdGUgYW5kIFRpbWUgb24gdGhlIEludGVybmV0OiBUaW1lc3RhbXBzLgorMjI0NiBUaGUgVExTIFByb3RvY29sIFZlcnNpb24gMS4wCiszNTQ2IFRyYW5zcG9ydCBMYXllciBTZWN1cml0eSAoVExTKSBFeHRlbnNpb25zLiAoIFVwZGF0ZXMgMjI0NiApCisKK2RvIHdlIGNhcmU/CistLS0tLS0tLS0tLQorCisyMDI5IFJUUCBQYXlsb2FkIEZvcm1hdCBvZiBTdW4ncyBDZWxsQiBWaWRlbyBFbmNvZGluZy4KKwordXNlZnVsCistLS0tLS0KKworaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9ydHAtcGFyYW1ldGVycwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9UT0RPIGIvZ3N0L3J0cC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNjVhOWMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL1RPRE8KQEAgLTAsMCArMSwxNSBAQAorKiBNUEVHNCBoZWFkZXIKKyAgLSBmZm1wZWcgbXBlZzQgZGVjb2RlciBnaXZlcyBlcnJvciBtZXNzYWdlIHdoZW4gc2VuZGluZyBvbmx5IHRoZSBjb25maWcKKyAgICBzdHJpbmcsIHBhcnNpbmcgaXMgT0ssIGVycm9yIGp1c3QgbWVhbnMgbm8gcGljdHVyZSB3YXMgZm91bmQgaW4gdGhlCisgICAgc3RyZWFtLgorCisqIGNvbXBhcmUgSDI2MyBlbmNvZGVycyBhbmQgSDI2MysKKworKiBiZXR0ZXIgUlRQIHBhY2tldGl6aW5nIGZvciBoMjYzCisKKyogYml0cmF0ZSB0dW5pbmcgaW4gZmZtcGVnCisgIC0gZml4ZWQgdGhlIHFtYXggdmFsdWVzIHNvIHdlIGNhbiBxdWFudGl6ZSBtb3JlLgorCisqIG1ha2UgZmZtcGVnIG5lZ290aWF0ZSBvbmx5IHdpdGggYWNjZXB0ZWQgZnJhbWVyYXRlcworCisKZGlmZiAtLWdpdCBhL2dzdC9ydHAvZGJvb2xodWZmLkxJQ0VOU0UgYi9nc3QvcnRwL2Rib29saHVmZi5MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZTRlNmYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2Rib29saHVmZi5MSUNFTlNFCkBAIC0wLDAgKzEsMjkgQEAKK0NvcHlyaWdodCAoYykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICAgIGRpc3RyaWJ1dGlvbi4KKworICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKyAgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCitBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZGJvb2xodWZmLmMgYi9nc3QvcnRwL2Rib29saHVmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMGZjOGYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2Rib29saHVmZi5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRoZSBXZWJNIHByb2plY3QgYXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorICogIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBkYm9vbGh1ZmYuTElDRU5TRSBmaWxlIGluIHRoaXMgZGlyZWN0b3J5LgorICogIFNlZSB0aGUgbGlidnB4IG9yaWdpbmFsIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiwKKyAqICBpbmNsdWRpbmcgcGF0ZW50IGluZm9ybWF0aW9uLCBhbmQgYXV0aG9yIGluZm9ybWF0aW9uLgorICovCisKKworI2luY2x1ZGUgImRib29saHVmZi5oIgorCisjaWZkZWYgX01TQ19WRVIKK19fZGVjbHNwZWMgKGFsaWduICgxNikpCisgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgdnA4X25vcm1bMjU2XSA9IHsKKyNlbHNlCitjb25zdCB1bnNpZ25lZCBjaGFyIHZwOF9ub3JtWzI1Nl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDE2KSkpID0geworI2VuZGlmCiswLCA3LCA2LCA2LCA1LCA1LCA1LCA1LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKKworaW50Cit2cDhkeF9zdGFydF9kZWNvZGUgKEJPT0xfREVDT0RFUiAqIGJyLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgdW5zaWduZWQgaW50IHNvdXJjZV9zeikKK3sKKyAgYnItPnVzZXJfYnVmZmVyX2VuZCA9IHNvdXJjZSArIHNvdXJjZV9zejsKKyAgYnItPnVzZXJfYnVmZmVyID0gc291cmNlOworICBici0+dmFsdWUgPSAwOworICBici0+Y291bnQgPSAtODsKKyAgYnItPnJhbmdlID0gMjU1OworCisgIGlmIChzb3VyY2Vfc3ogJiYgIXNvdXJjZSkKKyAgICByZXR1cm4gMTsKKworICAvKiBQb3B1bGF0ZSB0aGUgYnVmZmVyICovCisgIHZwOGR4X2Jvb2xfZGVjb2Rlcl9maWxsIChicik7CisKKyAgcmV0dXJuIDA7Cit9CisKKwordm9pZAordnA4ZHhfYm9vbF9kZWNvZGVyX2ZpbGwgKEJPT0xfREVDT0RFUiAqIGJyKQoreworICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWZwdHI7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmVuZDsKKyAgVlA4X0JEX1ZBTFVFIHZhbHVlOworICBpbnQgY291bnQ7CisgIGJ1ZmVuZCA9IGJyLT51c2VyX2J1ZmZlcl9lbmQ7CisgIGJ1ZnB0ciA9IGJyLT51c2VyX2J1ZmZlcjsKKyAgdmFsdWUgPSBici0+dmFsdWU7CisgIGNvdW50ID0gYnItPmNvdW50OworCisgIFZQOERYX0JPT0xfREVDT0RFUl9GSUxMIChjb3VudCwgdmFsdWUsIGJ1ZnB0ciwgYnVmZW5kKTsKKworICBici0+dXNlcl9idWZmZXIgPSBidWZwdHI7CisgIGJyLT52YWx1ZSA9IHZhbHVlOworICBici0+Y291bnQgPSBjb3VudDsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZGJvb2xodWZmLmggYi9nc3QvcnRwL2Rib29saHVmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYTQ1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2Rib29saHVmZi5oCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMCBUaGUgV2ViTSBwcm9qZWN0IGF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKyAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgZGJvb2xodWZmLkxJQ0VOU0UgZmlsZSBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqICBTZWUgdGhlIGxpYnZweCBvcmlnaW5hbCBkaXN0cmlidXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24sCisgKiAgaW5jbHVkaW5nIHBhdGVudCBpbmZvcm1hdGlvbiwgYW5kIGF1dGhvciBpbmZvcm1hdGlvbi4KKyAqLworCisKKyNpZm5kZWYgREJPT0xIVUZGX0gKKyNkZWZpbmUgREJPT0xIVUZGX0gKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxnbGliLmg+CisKK3R5cGVkZWYgc2l6ZV90IFZQOF9CRF9WQUxVRTsKKworIyBkZWZpbmUgVlA4X0JEX1ZBTFVFX1NJWkUgKChpbnQpc2l6ZW9mKFZQOF9CRF9WQUxVRSkqQ0hBUl9CSVQpCisvKlRoaXMgaXMgbWVhbnQgdG8gYmUgYSBsYXJnZSwgcG9zaXRpdmUgY29uc3RhbnQgdGhhdCBjYW4gc3RpbGwgYmUgZWZmaWNpZW50bHkKKyAgIGxvYWRlZCBhcyBhbiBpbW1lZGlhdGUgKG9uIHBsYXRmb3JtcyBsaWtlIEFSTSwgZm9yIGV4YW1wbGUpLgorICBFdmVuIHJlbGF0aXZlbHkgbW9kZXN0IHZhbHVlcyBsaWtlIDEwMCB3b3VsZCB3b3JrIGZpbmUuKi8KKyMgZGVmaW5lIFZQOF9MT1RTX09GX0JJVFMgKDB4NDAwMDAwMDApCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcl9idWZmZXJfZW5kOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzZXJfYnVmZmVyOworICAgIFZQOF9CRF9WQUxVRSAgICAgICAgIHZhbHVlOworICAgIGludCAgICAgICAgICAgICAgICAgIGNvdW50OworICAgIHVuc2lnbmVkIGludCAgICAgICAgIHJhbmdlOworfSBCT09MX0RFQ09ERVI7CisKKyNpZmRlZiBfTVNDX1ZFUgorX19kZWNsc3BlYyhhbGlnbigxNikpIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIHZwOF9ub3JtWzI1Nl07CisjZWxzZQorZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgdnA4X25vcm1bMjU2XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpOworI2VuZGlmCisKK2ludCB2cDhkeF9zdGFydF9kZWNvZGUoQk9PTF9ERUNPREVSICpiciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc291cmNlX3N6KTsKKwordm9pZCB2cDhkeF9ib29sX2RlY29kZXJfZmlsbChCT09MX0RFQ09ERVIgKmJyKTsKKworLypUaGUgcmVmaWxsIGxvb3AgaXMgdXNlZCBpbiBzZXZlcmFsIHBsYWNlcywgc28gZGVmaW5lIGl0IGluIGEgbWFjcm8gdG8gbWFrZQorICAgc3VyZSB0aGV5J3JlIGFsbCBjb25zaXN0ZW50LgorICBBbiBpbmxpbmUgZnVuY3Rpb24gd291bGQgYmUgY2xlYW5lciwgYnV0IGhhcyBhIHNpZ25pZmljYW50IHBlbmFsdHksIGJlY2F1c2UKKyAgIG11bHRpcGxlIEJPT0xfREVDT0RFUiBmaWVsZHMgbXVzdCBiZSBtb2RpZmllZCwgYW5kIHRoZSBjb21waWxlciBpcyBub3Qgc21hcnQKKyAgIGVub3VnaCB0byBlbGltaW5hdGUgdGhlIHN0b3JlcyB0byB0aG9zZSBmaWVsZHMgYW5kIHRoZSBzdWJzZXF1ZW50IHJlbG9hZHMKKyAgIGZyb20gdGhlbSB3aGVuIGlubGluaW5nIHRoZSBmdW5jdGlvbi4qLworI2RlZmluZSBWUDhEWF9CT09MX0RFQ09ERVJfRklMTChfY291bnQsX3ZhbHVlLF9idWZwdHIsX2J1ZmVuZCkgXAorICAgIGRvIFwKKyAgICB7IFwKKyAgICAgICAgaW50IHNoaWZ0ID0gVlA4X0JEX1ZBTFVFX1NJWkUgLSA4IC0gKChfY291bnQpICsgOCk7IFwKKyAgICAgICAgaW50IGxvb3BfZW5kLCB4OyBcCisgICAgICAgIHNpemVfdCBiaXRzX2xlZnQgPSAoKF9idWZlbmQpLShfYnVmcHRyKSkqQ0hBUl9CSVQ7IFwKKyAgICAgICAgXAorICAgICAgICB4ID0gc2hpZnQgKyBDSEFSX0JJVCAtIGJpdHNfbGVmdDsgXAorICAgICAgICBsb29wX2VuZCA9IDA7IFwKKyAgICAgICAgaWYoeCA+PSAwKSBcCisgICAgICAgIHsgXAorICAgICAgICAgICAgKF9jb3VudCkgKz0gVlA4X0xPVFNfT0ZfQklUUzsgXAorICAgICAgICAgICAgbG9vcF9lbmQgPSB4OyBcCisgICAgICAgICAgICBpZighYml0c19sZWZ0KSBicmVhazsgXAorICAgICAgICB9IFwKKyAgICAgICAgd2hpbGUoc2hpZnQgPj0gbG9vcF9lbmQpIFwKKyAgICAgICAgeyBcCisgICAgICAgICAgICAoX2NvdW50KSArPSBDSEFSX0JJVDsgXAorICAgICAgICAgICAgKF92YWx1ZSkgfD0gKFZQOF9CRF9WQUxVRSkqKF9idWZwdHIpKysgPDwgc2hpZnQ7IFwKKyAgICAgICAgICAgIHNoaWZ0IC09IENIQVJfQklUOyBcCisgICAgICAgIH0gXAorICAgIH0gXAorICAgIHdoaWxlKDApIFwKKworCitzdGF0aWMgaW50IHZwOGR4X2RlY29kZV9ib29sKEJPT0xfREVDT0RFUiAqYnIsIGludCBwcm9iYWJpbGl0eSkgeworICAgIHVuc2lnbmVkIGludCBiaXQgPSAwOworICAgIFZQOF9CRF9WQUxVRSB2YWx1ZTsKKyAgICB1bnNpZ25lZCBpbnQgc3BsaXQ7CisgICAgVlA4X0JEX1ZBTFVFIGJpZ3NwbGl0OworICAgIGludCBjb3VudDsKKyAgICB1bnNpZ25lZCBpbnQgcmFuZ2U7CisKKyAgICBzcGxpdCA9IDEgKyAoKChici0+cmFuZ2UgLSAxKSAqIHByb2JhYmlsaXR5KSA+PiA4KTsKKworICAgIGlmKGJyLT5jb3VudCA8IDApCisgICAgICAgIHZwOGR4X2Jvb2xfZGVjb2Rlcl9maWxsKGJyKTsKKworICAgIHZhbHVlID0gYnItPnZhbHVlOworICAgIGNvdW50ID0gYnItPmNvdW50OworCisgICAgYmlnc3BsaXQgPSAoVlA4X0JEX1ZBTFVFKXNwbGl0IDw8IChWUDhfQkRfVkFMVUVfU0laRSAtIDgpOworCisgICAgcmFuZ2UgPSBzcGxpdDsKKworICAgIGlmICh2YWx1ZSA+PSBiaWdzcGxpdCkKKyAgICB7CisgICAgICAgIHJhbmdlID0gYnItPnJhbmdlIC0gc3BsaXQ7CisgICAgICAgIHZhbHVlID0gdmFsdWUgLSBiaWdzcGxpdDsKKyAgICAgICAgYml0ID0gMTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBzaGlmdCA9IHZwOF9ub3JtW3JhbmdlXTsKKyAgICAgICAgcmFuZ2UgPDw9IHNoaWZ0OworICAgICAgICB2YWx1ZSA8PD0gc2hpZnQ7CisgICAgICAgIGNvdW50IC09IHNoaWZ0OworICAgIH0KKyAgICBici0+dmFsdWUgPSB2YWx1ZTsKKyAgICBici0+Y291bnQgPSBjb3VudDsKKyAgICBici0+cmFuZ2UgPSByYW5nZTsKKworICAgIHJldHVybiBiaXQ7Cit9CisKK3N0YXRpYyBHX0dOVUNfVU5VU0VEIGludCB2cDhfZGVjb2RlX3ZhbHVlKEJPT0xfREVDT0RFUiAqYnIsIGludCBiaXRzKQoreworICAgIGludCB6ID0gMDsKKyAgICBpbnQgYml0OworCisgICAgZm9yIChiaXQgPSBiaXRzIC0gMTsgYml0ID49IDA7IGJpdC0tKQorICAgIHsKKyAgICAgICAgeiB8PSAodnA4ZHhfZGVjb2RlX2Jvb2woYnIsIDB4ODApIDw8IGJpdCk7CisgICAgfQorCisgICAgcmV0dXJuIHo7Cit9CisKK3N0YXRpYyBHX0dOVUNfVU5VU0VEIGludCB2cDhkeF9ib29sX2Vycm9yKEJPT0xfREVDT0RFUiAqYnIpCit7CisgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFZhcmlhYmxlICdjb3VudCcgc3RvcmVzIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgJ3ZhbHVlJyBidWZmZXIsIG1pbnVzCisgICAgICogOC4gVGhlIHRvcCBieXRlIGlzIHBhcnQgb2YgdGhlIGFsZ29yaXRobSwgYW5kIHRoZSByZW1haW5kZXIgaXMgYnVmZmVyZWQKKyAgICAgKiB0byBiZSBzaGlmdGVkIGludG8gaXQuIFNvIGlmIGNvdW50ID09IDgsIHRoZSB0b3AgMTYgYml0cyBvZiAndmFsdWUnIGFyZQorICAgICAqIG9jY3VwaWVkLCA4IGZvciB0aGUgYWxnb3JpdGhtIGFuZCA4IGluIHRoZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBXaGVuIHJlYWRpbmcgYSBieXRlIGZyb20gdGhlIHVzZXIncyBidWZmZXIsIGNvdW50IGlzIGZpbGxlZCB3aXRoIDggYW5kCisgICAgICogb25lIGJ5dGUgaXMgZmlsbGVkIGludG8gdGhlIHZhbHVlIGJ1ZmZlci4gV2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZQorICAgICAqIGRhdGEsIGNvdW50IGlzIGFkZGl0aW9uYWxseSBmaWxsZWQgd2l0aCBWUDhfTE9UU19PRl9CSVRTLiBTbyB3aGVuCisgICAgICogY291bnQgPT0gVlA4X0xPVFNfT0ZfQklUUyAtIDEsIHRoZSB1c2VyJ3MgZGF0YSBoYXMgYmVlbiBleGhhdXN0ZWQuCisgICAgICovCisgICAgaWYgKChici0+Y291bnQgPiBWUDhfQkRfVkFMVUVfU0laRSkgJiYgKGJyLT5jb3VudCA8IFZQOF9MT1RTX09GX0JJVFMpKQorICAgIHsKKyAgICAgICAvKiBXZSBoYXZlIHRyaWVkIHRvIGRlY29kZSBiaXRzIGFmdGVyIHRoZSBlbmQgb2YKKyAgICAgICAgKiBzdHJlYW0gd2FzIGVuY291bnRlcmVkLgorICAgICAgICAqLworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBObyBlcnJvci4gKi8KKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9mbnYxaGFzaC5jIGIvZ3N0L3J0cC9mbnYxaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ODViYjIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2ZudjFoYXNoLmMKQEAgLTAsMCArMSw2MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSAiZm52MWhhc2guaCIKKworLyogVGhpcyBmaWxlIGltcGxlbWVudHMgRk5WLTEgaGFzaGluZyB1c2VkIGluIHRoZSBPZ2cgcGF5bG9hZCBlbmNvZGVycworICogdG8gZ2VuZXJhdGUgdGhlIDI0LWJpdCBpZGVudCB2YWx1ZSBiYXNlZCBvbiB0aGUgaGVhZGVyIHBhZ2VzLgorICogU2VlIGh0dHA6Ly9pc3RoZS5jb20vY2hvbmdvL3RlY2gvY29tcC9mbnYvCisgKi8KKworI2RlZmluZSBNQVNLXzI0ICgoKGd1aW50MzIpIDEgPDwgMjQpIC0xKQorCisjZGVmaW5lIEZOVjFfSEFTSF8zMl9JTklUICgoZ3VpbnQzMikgMHg4MTFDOURDNUwpCisvLzIxNjYxMzYyNjFMKQorI2RlZmluZSBGTlYxX0hBU0hfMzJfUFJJTUUgMTY3Nzc2MTkKKworZ3VpbnQzMgorZm52MV9oYXNoXzMyX25ldyAodm9pZCkKK3sKKyAgcmV0dXJuIEZOVjFfSEFTSF8zMl9JTklUOworfQorCitndWludDMyCitmbnYxX2hhc2hfMzJfdXBkYXRlIChndWludDMyIGhhc2gsIGNvbnN0IGd1Y2hhciAqIGRhdGEsIGd1aW50IGxlbmd0aCkKK3sKKyAgZ3VpbnQgaTsKKyAgY29uc3QgZ3VjaGFyICpwID0gZGF0YTsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2ksICsrcCkgeworICAgIGhhc2ggKj0gRk5WMV9IQVNIXzMyX1BSSU1FOworICAgIGhhc2ggXj0gKnA7CisgIH0KKworICByZXR1cm4gaGFzaDsKK30KKworZ3VpbnQzMgorZm52MV9oYXNoXzMyX3RvXzI0IChndWludDMyIGhhc2gpCit7CisgIHJldHVybiAoaGFzaCA+PiAyNCkgXiAoaGFzaCAmIE1BU0tfMjQpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9mbnYxaGFzaC5oIGIvZ3N0L3J0cC9mbnYxaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNDcwNjcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2ZudjFoYXNoLmgKQEAgLTAsMCArMSwzNiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfRk5WMV9IQVNIX0hfXworI2RlZmluZSBfX0dTVF9GTlYxX0hBU0hfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCitndWludDMyIGZudjFfaGFzaF8zMl9uZXcgKHZvaWQpOworZ3VpbnQzMiBmbnYxX2hhc2hfMzJfdXBkYXRlIChndWludDMyIGhhc2gsIGNvbnN0IGd1Y2hhciAqZGF0YSwgZ3VpbnQgbGVuZ3RoKTsKK2d1aW50MzIgZm52MV9oYXNoXzMyX3RvXzI0IChndWludDMyIGhhc2gpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfRk5WMV9IQVNIX0hfXyAqLworCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdGFzdGVyaXNraDI2My5jIGIvZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWE3ZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuYwpAQCAtMCwwICsxLDIzMCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgImdzdGFzdGVyaXNraDI2My5oIgorCisjZGVmaW5lIEdTVF9BU1RFUklTS0gyNjNfSEVBREVSX0xFTiA2CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBc3Rlcmlza0gyNjNIZWFkZXIKK3sKKyAgZ3VpbnQzMiB0aW1lc3RhbXA7ICAgICAgICAgICAgLyogVGltZXN0YW1wICovCisgIGd1aW50MTYgbGVuZ3RoOyAgICAgICAgICAgICAgIC8qIExlbmd0aCAqLworfSBHc3RBc3Rlcmlza0gyNjNIZWFkZXI7CisKKyNkZWZpbmUgR1NUX0FTVEVSSVNLSDI2M19IRUFERVJfVElNRVNUQU1QKGRhdGEpICgoKEdzdEFzdGVyaXNrSDI2M0hlYWRlciAqKShkYXRhKSktPnRpbWVzdGFtcCkKKyNkZWZpbmUgR1NUX0FTVEVSSVNLSDI2M19IRUFERVJfTEVOR1RIKGRhdGEpICgoKEdzdEFzdGVyaXNrSDI2M0hlYWRlciAqKShkYXRhKSktPmxlbmd0aCkKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9hc3Rlcmlza2gyNjNfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LWFzdGVyaXNraDI2MyIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9hc3Rlcmlza2gyNjNfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSBbIDk2LCAxMjcgXSwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJIMjYzLTE5OThcIiIpCisgICAgKTsKKworc3RhdGljIHZvaWQgZ3N0X2FzdGVyaXNraDI2M19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9hc3Rlcmlza2gyNjNfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfYXN0ZXJpc2toMjYzX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKKyNkZWZpbmUgZ3N0X2FzdGVyaXNraDI2M19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RBc3Rlcmlza2gyNjMsIGdzdF9hc3Rlcmlza2gyNjMsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZAorZ3N0X2FzdGVyaXNraDI2M19jbGFzc19pbml0IChHc3RBc3Rlcmlza2gyNjNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfYXN0ZXJpc2toMjYzX2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9hc3Rlcmlza2gyNjNfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9hc3Rlcmlza2gyNjNfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X2FzdGVyaXNraDI2M19zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBBc3RlcmlzayBIMjYzIGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBIMjYzIHZpZGVvIGZyb20gUlRQIGFuZCBlbmNvZGVzIGluIEFzdGVyaXNrIEgyNjMgZm9ybWF0IiwKKyAgICAgICJOZWlsIFN0cmF0Zm9yZCA8bmVpbHNAdmlwYWRpYS5jb20+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXN0ZXJpc2toMjYzX2luaXQgKEdzdEFzdGVyaXNraDI2MyAqIGFzdGVyaXNraDI2MykKK3sKKyAgYXN0ZXJpc2toMjYzLT5zcmNwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZnc3RfYXN0ZXJpc2toMjYzX3NyY190ZW1wbGF0ZSwgInNyYyIpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoYXN0ZXJpc2toMjYzKSwgYXN0ZXJpc2toMjYzLT5zcmNwYWQpOworCisgIGFzdGVyaXNraDI2My0+c2lua3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJmdzdF9hc3Rlcmlza2gyNjNfc2lua190ZW1wbGF0ZSwKKyAgICAgICJzaW5rIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChhc3Rlcmlza2gyNjMtPnNpbmtwYWQsIGdzdF9hc3Rlcmlza2gyNjNfY2hhaW4pOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoYXN0ZXJpc2toMjYzKSwgYXN0ZXJpc2toMjYzLT5zaW5rcGFkKTsKKworICBhc3Rlcmlza2gyNjMtPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXN0ZXJpc2toMjYzX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RBc3Rlcmlza2gyNjMgKmFzdGVyaXNraDI2MzsKKworICBhc3Rlcmlza2gyNjMgPSBHU1RfQVNURVJJU0tfSDI2MyAob2JqZWN0KTsKKworICBnX29iamVjdF91bnJlZiAoYXN0ZXJpc2toMjYzLT5hZGFwdGVyKTsKKyAgYXN0ZXJpc2toMjYzLT5hZGFwdGVyID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfYXN0ZXJpc2toMjYzX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RBc3Rlcmlza2gyNjMgKmFzdGVyaXNraDI2MzsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIGFzdGVyaXNraDI2MyA9IEdTVF9BU1RFUklTS19IMjYzIChwYXJlbnQpOworCisgIHsKKyAgICBnaW50IHBheWxvYWRfbGVuOworICAgIGd1aW50OCAqcGF5bG9hZDsKKyAgICBnYm9vbGVhbiBNOworICAgIGd1aW50MzIgdGltZXN0YW1wOworICAgIGd1aW50MzIgc2FtcGxlczsKKyAgICBndWludDE2IGFzdGVyaXNrX2xlbjsKKyAgICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICBpZiAoIWdzdF9ydHBfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQUQsICZydHApKQorICAgICAgZ290byBiYWRfcGFja2V0OworCisgICAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKCZydHApOworICAgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisKKyAgICBNID0gZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAoJnJ0cCk7CisgICAgdGltZXN0YW1wID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3RpbWVzdGFtcCAoJnJ0cCk7CisKKyAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHBheWxvYWRfbGVuICsKKyAgICAgICAgR1NUX0FTVEVSSVNLSDI2M19IRUFERVJfTEVOKTsKKworICAgIC8qIGJ1aWxkIHRoZSBhc3RlcmlzayBoZWFkZXIgKi8KKyAgICBhc3Rlcmlza19sZW4gPSBwYXlsb2FkX2xlbjsKKyAgICBpZiAoTSkKKyAgICAgIGFzdGVyaXNrX2xlbiB8PSAweDgwMDA7CisgICAgaWYgKCFhc3Rlcmlza2gyNjMtPmxhc3R0cykKKyAgICAgIGFzdGVyaXNraDI2My0+bGFzdHRzID0gdGltZXN0YW1wOworICAgIHNhbXBsZXMgPSB0aW1lc3RhbXAgLSBhc3Rlcmlza2gyNjMtPmxhc3R0czsKKyAgICBhc3Rlcmlza2gyNjMtPmxhc3R0cyA9IHRpbWVzdGFtcDsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgIEdTVF9BU1RFUklTS0gyNjNfSEVBREVSX1RJTUVTVEFNUCAobWFwLmRhdGEpID0gZ19odG9ubCAoc2FtcGxlcyk7CisgICAgR1NUX0FTVEVSSVNLSDI2M19IRUFERVJfTEVOR1RIIChtYXAuZGF0YSkgPSBnX2h0b25zIChhc3Rlcmlza19sZW4pOworCisgICAgLyogY29weSB0aGUgZGF0YSBpbnRvIHBsYWNlICovCisgICAgbWVtY3B5IChtYXAuZGF0YSArIEdTVF9BU1RFUklTS0gyNjNfSEVBREVSX0xFTiwgcGF5bG9hZCwgcGF5bG9hZF9sZW4pOworCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gdGltZXN0YW1wOworICAgIGlmICghZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChhc3Rlcmlza2gyNjMtPnNyY3BhZCkpIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIGNhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoYXN0ZXJpc2toMjYzLT5zcmNwYWQpOworICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAoYXN0ZXJpc2toMjYzLT5zcmNwYWQsIGNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIH0KKworICAgIHJldCA9IGdzdF9wYWRfcHVzaCAoYXN0ZXJpc2toMjYzLT5zcmNwYWQsIG91dGJ1Zik7CisKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICB9CisKKyAgcmV0dXJuIHJldDsKKworYmFkX3BhY2tldDoKKyAgeworICAgIEdTVF9ERUJVRyAoIlBhY2tldCBkb2VzIG5vdCB2YWxpZGF0ZSIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X2FzdGVyaXNraDI2M19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RBc3Rlcmlza2gyNjMgKmFzdGVyaXNraDI2MzsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIGFzdGVyaXNraDI2MyA9IEdTVF9BU1RFUklTS19IMjYzIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGFzdGVyaXNraDI2My0+YWRhcHRlcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICAvKgorICAgICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgIGJyZWFrOworICAgICBkZWZhdWx0OgorICAgICBicmVhazsKKyAgICAgfQorICAgKi8KKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9hc3Rlcmlza2gyNjNfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJhc3Rlcmlza2gyNjMiLAorICAgICAgR1NUX1JBTktfTk9ORSwgR1NUX1RZUEVfQVNURVJJU0tfSDI2Myk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdGFzdGVyaXNraDI2My5oIGIvZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzk1MjNkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3Rhc3Rlcmlza2gyNjMuaApAQCAtMCwwICsxLDY1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9BU1RFUklTS19IMjYzX0hfXworI2RlZmluZSBfX0dTVF9BU1RFUklTS19IMjYzX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0FTVEVSSVNLX0gyNjMgXAorICAoZ3N0X2FzdGVyaXNraDI2M19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVNURVJJU0tfSDI2MyhvYmopIFwKKyAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfQVNURVJJU0tfSDI2MyxHc3RBc3Rlcmlza2gyNjMpKQorI2RlZmluZSBHU1RfQVNURVJJU0tfSDI2M19DTEFTUyhrbGFzcykgXAorIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0FTVEVSSVNLX0gyNjMsR3N0QXN0ZXJpc2toMjYzQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVNURVJJU0tfSDI2MyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0FTVEVSSVNLX0gyNjMpKQorI2RlZmluZSBHU1RfSVNfQVNURVJJU0tfSDI2M19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9BU1RFUklTS19IMjYzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEFzdGVyaXNraDI2MyBHc3RBc3Rlcmlza2gyNjM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0QXN0ZXJpc2toMjYzQ2xhc3MgR3N0QXN0ZXJpc2toMjYzQ2xhc3M7CisKK3N0cnVjdCBfR3N0QXN0ZXJpc2toMjYzCit7CisgIEdzdEVsZW1lbnQgZWxlbWVudDsKKworICBHc3RQYWQgKnNpbmtwYWQ7CisgIEdzdFBhZCAqc3JjcGFkOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisKKyAgZ3VpbnQzMiBsYXN0dHM7Cit9OworCitzdHJ1Y3QgX0dzdEFzdGVyaXNraDI2M0NsYXNzCit7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfYXN0ZXJpc2toMjYzX2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X2FzdGVyaXNraDI2M19wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0FTVEVSSVNLX0gyNjNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cC5jIGIvZ3N0L3J0cC9nc3RydHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjBlZjU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHAuYwpAQCAtMCwwICsxLDM5OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC90YWcvdGFnLmg+CisKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCisjaW5jbHVkZSAiZ3N0cnRwYWMzZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBhYzNwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBidmRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwYnZwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBjZWx0ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBjZWx0cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwZHZkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cGR2cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwZ3N0ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBnc3RwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBpbGJjZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBpbGJjcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwcGNtdXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHBjbWFwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBwY21hZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBwY211ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBnNzIyZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBnNzIycGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwZzcyM2RlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwZzcyM3BheS5oIgorI2luY2x1ZGUgImdzdHJ0cGc3MjZkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cGc3MjZwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBnNzI5ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBnNzI5cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwZ3NtcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwZ3NtZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBhbXJwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBhbXJkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cG1wYXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cG1wYWRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwbXBhcm9idXN0ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBtcHZkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cG1wdnBheS5oIgorI2luY2x1ZGUgImdzdHJ0cG9wdXNkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cG9wdXNwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBoMjYxcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwaDI2MWRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwaDI2M3BkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cGgyNjNwcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwaDI2M2RlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwaDI2M3BheS5oIgorI2luY2x1ZGUgImdzdHJ0cGgyNjRkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cGgyNjRwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBoMjY1ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBoMjY1cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwajJrZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBqMmtwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBqcGVnZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBqcGVncGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwa2x2ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBrbHZwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBMOGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwTDhwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBMMTZkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cEwxNnBheS5oIgorI2luY2x1ZGUgImdzdHJ0cEwyNGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwTDI0cGF5LmgiCisjaW5jbHVkZSAiZ3N0YXN0ZXJpc2toMjYzLmgiCisjaW5jbHVkZSAiZ3N0cnRwbXAxc2RlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwbXAydGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwbXAydHBheS5oIgorI2luY2x1ZGUgImdzdHJ0cG1wNHZkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cG1wNHZwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBtcDRhZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBtcDRhcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwbXA0Z2RlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwbXA0Z3BheS5oIgorI2luY2x1ZGUgImdzdHJ0cHFjZWxwZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBxZG1kZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHNiY2RlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwc2JjcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwc2lyZW5wYXkuaCIKKyNpbmNsdWRlICJnc3RydHBzaXJlbmRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwc3BlZXhwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBzcGVleGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwc3YzdmRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdGhlb3JhZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB0aGVvcmFwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB2b3JiaXNkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHZvcmJpc3BheS5oIgorI2luY2x1ZGUgImdzdHJ0cHZwOGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdnA4cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdnA5ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB2cDlwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB2cmF3ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB2cmF3cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwc3RyZWFtcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwc3RyZWFtZGVwYXkuaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBnc3RfdGFnX2ltYWdlX3R5cGVfZ2V0X3R5cGUgKCk7CisKKyAgcnRwX3F1YXJrX21ldGFfdGFnX3ZpZGVvID0KKyAgICAgIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nIChHU1RfTUVUQV9UQUdfVklERU9fU1RSKTsKKyAgcnRwX3F1YXJrX21ldGFfdGFnX2F1ZGlvID0KKyAgICAgIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nIChHU1RfTUVUQV9UQUdfQVVESU9fU1RSKTsKKworICBpZiAoIWdzdF9ydHBfYWMzX2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfYWMzX3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2J2X2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfYnZfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfY2VsdF9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2NlbHRfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfZHZfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9kdl9wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9nc3RfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9nc3RfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfaWxiY19wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9pbGJjX2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfZzcyMl9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2c3MjJfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfZzcyM19kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2c3MjNfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfZzcyNl9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2c3MjZfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfZzcyOV9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2c3MjlfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfZ3NtX2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfZ3NtX3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2Ftcl9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2Ftcl9wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9wY21hX2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfcGNtdV9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3BjbXVfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfcGNtYV9wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9tcGFfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9tcGFfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX21wdl9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX21wdl9wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9vcHVzX2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfb3B1c19wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9oMjYxX3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2gyNjFfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9oMjYzcF9wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9oMjYzcF9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2gyNjNfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9oMjYzX3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2gyNjRfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9oMjY0X3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2gyNjVfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9oMjY1X3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2oya19kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX2oya19wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9qcGVnX2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfanBlZ19wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9rbHZfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9rbHZfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfTDhfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfTDhfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9MMTZfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfTDE2X2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfTDI0X3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX0wyNF9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfYXN0ZXJpc2toMjYzX3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfbXAxc19kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX21wMnRfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9tcDJ0X3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX21wNHZfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfbXA0dl9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX21wNGFfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfbXA0YV9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX21wNGdfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9tcDRnX3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3FjZWxwX2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfcWRtMl9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3NiY19kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3NiY19wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9zaXJlbl9wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9zaXJlbl9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3NwZWV4X3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3NwZWV4X2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfc3Yzdl9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3RoZW9yYV9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3RoZW9yYV9wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF92b3JiaXNfZGVwYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF92b3JiaXNfcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfdnA4X2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfdnA4X3BheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3ZwOV9kZXBheV9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3ZwOV9wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF92cmF3X2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfdnJhd19wYXlfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9zdHJlYW1fcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfc3RyZWFtX2RlcGF5X3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHJ0cCwKKyAgICAiUmVhbC10aW1lIHByb3RvY29sIHBsdWdpbnMiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxZjE2ZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwTDE2ZGVwYXkuYwpAQCAtMCwwICsxLDI4NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cEwxNmRlcGF5CisgKiBAc2VlX2Fsc286IHJ0cEwxNnBheQorICoKKyAqIEV4dHJhY3QgcmF3IGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyAzNTUxLgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzU1MS50eHQKKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdWRwc3JjIGNhcHM9J2FwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpNDQxMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylMMTYsIGVuY29kaW5nLXBhcmFtcz0oc3RyaW5nKTEsIGNoYW5uZWxzPShpbnQpMSwgcGF5bG9hZD0oaW50KTk2JyAhIHJ0cEwxNmRlcGF5ICEgcHVsc2VzaW5rCisgKiBdfCBUaGlzIGV4YW1wbGUgcGlwZWxpbmUgd2lsbCBkZXBheWxvYWQgYW4gUlRQIHJhdyBhdWRpbyBzdHJlYW0uIFJlZmVyIHRvCisgKiB0aGUgcnRwTDE2cGF5IGV4YW1wbGUgdG8gY3JlYXRlIHRoZSBSVFAgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSAiZ3N0cnRwTDE2ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cEwxNmRlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBMMTZkZXBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfTDE2X2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIFMxNkJFLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIgImNoYW5uZWxzID0gKGludCkgWyAxLCBNQVggXSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfTDE2X2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIiAiY2xvY2stcmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIKKyAgICAgICAgLyogImNoYW5uZWxzID0gKGludCkgWzEsIE1BWF0iICAqLworICAgICAgICAvKiAiZW1waGFzaXMgPSAoc3RyaW5nKSBBTlkiICovCisgICAgICAgIC8qICJjaGFubmVsLW9yZGVyID0gKHN0cmluZykgQU5ZIiAqLworICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTDE2XCI7IgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgeyAiIEdTVF9SVFBfUEFZTE9BRF9MMTZfU1RFUkVPX1NUUklORyAiLCAiCisgICAgICAgIEdTVF9SVFBfUEFZTE9BRF9MMTZfTU9OT19TVFJJTkcgIiB9LCIgImNsb2NrLXJhdGUgPSAoaW50KSBbIDEsIE1BWCBdIgorICAgICAgICAvKiAiY2hhbm5lbHMgPSAoaW50KSBbMSwgTUFYXSIgKi8KKyAgICAgICAgLyogImVtcGhhc2lzID0gKHN0cmluZykgQU5ZIiAqLworICAgICAgICAvKiAiY2hhbm5lbC1vcmRlciA9IChzdHJpbmcpIEFOWSIgKi8KKyAgICApCisgICAgKTsKKworI2RlZmluZSBnc3RfcnRwX0wxNl9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBMMTZEZXBheSwgZ3N0X3J0cF9MMTZfZGVwYXksIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX0wxNl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfTDE2X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfTDE2X2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEwxNkRlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9MMTZfZGVwYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+cHJvY2Vzc19ydHBfcGFja2V0ID0gZ3N0X3J0cF9MMTZfZGVwYXlfcHJvY2VzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX0wxNl9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX0wxNl9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBhdWRpbyBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgcmF3IGF1ZGlvIGZyb20gUlRQIHBhY2tldHMiLAorICAgICAgIlplZXNoYW4gQWxpIDx6YWsxNDdAeWFob28uY29tPiwiICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBMMTZkZXBheV9kZWJ1ZywgInJ0cEwxNmRlcGF5IiwgMCwKKyAgICAgICJSYXcgQXVkaW8gUlRQIERlcGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX0wxNl9kZXBheV9pbml0IChHc3RSdHBMMTZEZXBheSAqIHJ0cEwxNmRlcGF5KQoreworfQorCitzdGF0aWMgZ2ludAorZ3N0X3J0cF9MMTZfZGVwYXlfcGFyc2VfaW50IChHc3RTdHJ1Y3R1cmUgKiBzdHJ1Y3R1cmUsIGNvbnN0IGdjaGFyICogZmllbGQsCisgICAgZ2ludCBkZWYpCit7CisgIGNvbnN0IGdjaGFyICpzdHI7CisgIGdpbnQgcmVzOworCisgIGlmICgoc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsIGZpZWxkKSkpCisgICAgcmV0dXJuIGF0b2kgKHN0cik7CisKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCBmaWVsZCwgJnJlcykpCisgICAgcmV0dXJuIHJlczsKKworICByZXR1cm4gZGVmOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfTDE2X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR3N0UnRwTDE2RGVwYXkgKnJ0cEwxNmRlcGF5OworICBnaW50IGNsb2NrX3JhdGUsIHBheWxvYWQ7CisgIGdpbnQgY2hhbm5lbHM7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIGdib29sZWFuIHJlczsKKyAgY29uc3QgZ2NoYXIgKmNoYW5uZWxfb3JkZXI7CisgIGNvbnN0IEdzdFJUUENoYW5uZWxPcmRlciAqb3JkZXI7CisgIEdzdEF1ZGlvSW5mbyAqaW5mbzsKKworICBydHBMMTZkZXBheSA9IEdTVF9SVFBfTDE2X0RFUEFZIChkZXBheWxvYWQpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIHBheWxvYWQgPSA5NjsKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJwYXlsb2FkIiwgJnBheWxvYWQpOworICBzd2l0Y2ggKHBheWxvYWQpIHsKKyAgICBjYXNlIEdTVF9SVFBfUEFZTE9BRF9MMTZfU1RFUkVPOgorICAgICAgY2hhbm5lbHMgPSAyOworICAgICAgY2xvY2tfcmF0ZSA9IDQ0MTAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUlRQX1BBWUxPQURfTDE2X01PTk86CisgICAgICBjaGFubmVscyA9IDE7CisgICAgICBjbG9ja19yYXRlID0gNDQxMDA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogbm8gZml4ZWQgbWFwcGluZywgd2UgbmVlZCBjbG9jay1yYXRlICovCisgICAgICBjaGFubmVscyA9IDA7CisgICAgICBjbG9ja19yYXRlID0gMDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogY2FwcyBjYW4gb3ZlcndyaXRlIGRlZmF1bHRzICovCisgIGNsb2NrX3JhdGUgPQorICAgICAgZ3N0X3J0cF9MMTZfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgY2xvY2tfcmF0ZSk7CisgIGlmIChjbG9ja19yYXRlID09IDApCisgICAgZ290byBub19jbG9ja3JhdGU7CisKKyAgY2hhbm5lbHMgPQorICAgICAgZ3N0X3J0cF9MMTZfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJlbmNvZGluZy1wYXJhbXMiLCBjaGFubmVscyk7CisgIGlmIChjaGFubmVscyA9PSAwKSB7CisgICAgY2hhbm5lbHMgPSBnc3RfcnRwX0wxNl9kZXBheV9wYXJzZV9pbnQgKHN0cnVjdHVyZSwgImNoYW5uZWxzIiwgY2hhbm5lbHMpOworICAgIGlmIChjaGFubmVscyA9PSAwKSB7CisgICAgICAvKiBjaGFubmVscyBkZWZhdWx0cyB0byAxIG90aGVyd2lzZSAqLworICAgICAgY2hhbm5lbHMgPSAxOworICAgIH0KKyAgfQorCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgaW5mbyA9ICZydHBMMTZkZXBheS0+aW5mbzsKKyAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoaW5mbyk7CisgIGluZm8tPmZpbmZvID0gZ3N0X2F1ZGlvX2Zvcm1hdF9nZXRfaW5mbyAoR1NUX0FVRElPX0ZPUk1BVF9TMTZCRSk7CisgIGluZm8tPnJhdGUgPSBjbG9ja19yYXRlOworICBpbmZvLT5jaGFubmVscyA9IGNoYW5uZWxzOworICBpbmZvLT5icGYgPSAoaW5mby0+ZmluZm8tPndpZHRoIC8gOCkgKiBjaGFubmVsczsKKworICAvKiBhZGQgY2hhbm5lbCBwb3NpdGlvbnMgKi8KKyAgY2hhbm5lbF9vcmRlciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiY2hhbm5lbC1vcmRlciIpOworCisgIG9yZGVyID0gZ3N0X3J0cF9jaGFubmVsc19nZXRfYnlfb3JkZXIgKGNoYW5uZWxzLCBjaGFubmVsX29yZGVyKTsKKyAgcnRwTDE2ZGVwYXktPm9yZGVyID0gb3JkZXI7CisgIGlmIChvcmRlcikgeworICAgIG1lbWNweSAoaW5mby0+cG9zaXRpb24sIG9yZGVyLT5wb3MsCisgICAgICAgIHNpemVvZiAoR3N0QXVkaW9DaGFubmVsUG9zaXRpb24pICogY2hhbm5lbHMpOworICAgIGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b192YWxpZF9vcmRlciAoaW5mby0+cG9zaXRpb24sIGluZm8tPmNoYW5uZWxzKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBMMTZkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJVbmtub3duIGNoYW5uZWwgb3JkZXIgJyVzJyBmb3IgJWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgR1NUX1NUUl9OVUxMIChjaGFubmVsX29yZGVyKSwgY2hhbm5lbHMpKTsKKyAgICAvKiBjcmVhdGUgZGVmYXVsdCBOT05FIGxheW91dCAqLworICAgIGdzdF9ydHBfY2hhbm5lbHNfY3JlYXRlX2RlZmF1bHQgKGNoYW5uZWxzLCBpbmZvLT5wb3NpdGlvbik7CisgIH0KKworICBzcmNjYXBzID0gZ3N0X2F1ZGlvX2luZm9fdG9fY2FwcyAoaW5mbyk7CisgIHJlcyA9IGdzdF9wYWRfc2V0X2NhcHMgKGRlcGF5bG9hZC0+c3JjcGFkLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitub19jbG9ja3JhdGU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZXBheWxvYWQsICJubyBjbG9jay1yYXRlIHNwZWNpZmllZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfTDE2X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0UnRwTDE2RGVwYXkgKnJ0cEwxNmRlcGF5OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ2ludCBwYXlsb2FkX2xlbjsKKyAgZ2Jvb2xlYW4gbWFya2VyOworCisgIHJ0cEwxNmRlcGF5ID0gR1NUX1JUUF9MMTZfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisKKyAgaWYgKHBheWxvYWRfbGVuIDw9IDApCisgICAgZ290byBlbXB0eV9wYWNrZXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwTDE2ZGVwYXksICJnb3QgcGF5bG9hZCBvZiAlZCBieXRlcyIsIHBheWxvYWRfbGVuKTsKKworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9idWZmZXIgKHJ0cCk7CisgIG1hcmtlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgaWYgKG1hcmtlcikgeworICAgIC8qIG1hcmsgdGFsayBzcHVydCB3aXRoIFJFU1lOQyAqLworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1JFU1lOQyk7CisgIH0KKworICBvdXRidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKG91dGJ1Zik7CisgIGlmIChydHBMMTZkZXBheS0+b3JkZXIgJiYKKyAgICAgICFnc3RfYXVkaW9fYnVmZmVyX3Jlb3JkZXJfY2hhbm5lbHMgKG91dGJ1ZiwKKyAgICAgICAgICBydHBMMTZkZXBheS0+aW5mby5maW5mby0+Zm9ybWF0LCBydHBMMTZkZXBheS0+aW5mby5jaGFubmVscywKKyAgICAgICAgICBydHBMMTZkZXBheS0+aW5mby5wb3NpdGlvbiwgcnRwTDE2ZGVwYXktPm9yZGVyLT5wb3MpKSB7CisgICAgZ290byByZW9yZGVyX2ZhaWxlZDsKKyAgfQorCisgIGdzdF9ydHBfZHJvcF9ub25fYXVkaW9fbWV0YSAocnRwTDE2ZGVwYXksIG91dGJ1Zik7CisKKyAgcmV0dXJuIG91dGJ1ZjsKKworICAvKiBFUlJPUlMgKi8KK2VtcHR5X3BhY2tldDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cEwxNmRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJFbXB0eSBQYXlsb2FkLiIpLCAoTlVMTCkpOworICAgIHJldHVybiBOVUxMOworICB9CityZW9yZGVyX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChydHBMMTZkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgICgiQ2hhbm5lbCByZW9yZGVyaW5nIGZhaWxlZC4iKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF9MMTZfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBMMTZkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9MMTZfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBMMTZkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNWQ0Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cEwxNmRlcGF5LmgKQEAgLTAsMCArMSw2NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0wxNl9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0wxNl9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgImdzdHJ0cGNoYW5uZWxzLmgiCisKK0dfQkVHSU5fREVDTFMKKworLyogU3RhbmRhcmQgbWFjcm9zIGZvciBkZWZpbmluZyB0eXBlcyBmb3IgdGhpcyBlbGVtZW50LiAgKi8KKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0wxNl9ERVBBWSBcCisgIChnc3RfcnRwX0wxNl9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0wxNl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9MMTZfREVQQVksR3N0UnRwTDE2RGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX0wxNl9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTDE2X0RFUEFZLEdzdFJ0cEwxNkRlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0wxNl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9MMTZfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0wxNl9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTDE2X0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEwxNkRlcGF5IEdzdFJ0cEwxNkRlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEwxNkRlcGF5Q2xhc3MgR3N0UnRwTDE2RGVwYXlDbGFzczsKKworLyogRGVmaW5pdGlvbiBvZiBzdHJ1Y3R1cmUgc3RvcmluZyBkYXRhIGZvciB0aGlzIGVsZW1lbnQuICovCitzdHJ1Y3QgX0dzdFJ0cEwxNkRlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCisgIEdzdEF1ZGlvSW5mbyBpbmZvOworICBjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgKm9yZGVyOworfTsKKworLyogU3RhbmRhcmQgZGVmaW5pdGlvbiBkZWZpbmluZyBhIGNsYXNzIGZvciB0aGlzIGVsZW1lbnQuICovCitzdHJ1Y3QgX0dzdFJ0cEwxNkRlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfTDE2X2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9MMTZfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfTDE2X0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBMMTZwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwTDE2cGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4M2E2NQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwTDE2cGF5LmMKQEAgLTAsMCArMSwyNjMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHBMMTZwYXkKKyAqIEBzZWVfYWxzbzogcnRwTDE2ZGVwYXkKKyAqCisgKiBQYXlsb2FkIHJhdyBhdWRpbyBpbnRvIFJUUCBwYWNrZXRzIGFjY29yZGluZyB0byBSRkMgMzU1MS4KKyAqIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBzZWU6IGh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzM1NTEudHh0CisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyAhIGF1ZGlvY29udmVydCAhIHJ0cEwxNnBheSAhIHVkcHNpbmsKKyAqIF18IFRoaXMgZXhhbXBsZSBwaXBlbGluZSB3aWxsIHBheWxvYWQgcmF3IGF1ZGlvLiBSZWZlciB0bworICogdGhlIHJ0cEwxNmRlcGF5IGV4YW1wbGUgdG8gZGVwYXlsb2FkIGFuZCBwbGF5IHRoZSBSVFAgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworI2luY2x1ZGUgImdzdHJ0cEwxNnBheS5oIgorI2luY2x1ZGUgImdzdHJ0cGNoYW5uZWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cEwxNnBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwTDE2cGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9MMTZfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIFMxNkJFLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIgImNoYW5uZWxzID0gKGludCkgWyAxLCBNQVggXSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfTDE2X3BheV9zcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSBbIDk2LCAxMjcgXSwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkwxNlwiLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgTUFYIF07IgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJMMTZcIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0wxNl9TVEVSRU9fU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA0NDEwMDsiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkwxNlwiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfTDE2X01PTk9fU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA0NDEwMCIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfTDE2X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfcnRwX0wxNl9wYXlfZ2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBydHBwYXlsb2FkLAorICAgIEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9MMTZfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworI2RlZmluZSBnc3RfcnRwX0wxNl9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwTDE2UGF5LCBnc3RfcnRwX0wxNl9wYXksIEdTVF9UWVBFX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9MMTZfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEwxNlBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9MMTZfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5nZXRfY2FwcyA9IGdzdF9ydHBfTDE2X3BheV9nZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9IGdzdF9ydHBfTDE2X3BheV9oYW5kbGVfYnVmZmVyOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfTDE2X3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX0wxNl9wYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgYXVkaW8gcGF5bG9hZGVyIiwgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZC1lbmNvZGUgUmF3IGF1ZGlvIGludG8gUlRQIHBhY2tldHMgKFJGQyAzNTUxKSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwTDE2cGF5X2RlYnVnLCAicnRwTDE2cGF5IiwgMCwKKyAgICAgICJMMTYgUlRQIFBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9MMTZfcGF5X2luaXQgKEdzdFJ0cEwxNlBheSAqIHJ0cEwxNnBheSkKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZCAqcnRwYmFzZWF1ZGlvcGF5bG9hZDsKKworICBydHBiYXNlYXVkaW9wYXlsb2FkID0gR1NUX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQgKHJ0cEwxNnBheSk7CisKKyAgLyogdGVsbCBydHBiYXNlYXVkaW9wYXlsb2FkIHRoYXQgdGhpcyBpcyBhIHNhbXBsZSBiYXNlZCBjb2RlYyAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfc2FtcGxlX2Jhc2VkIChydHBiYXNlYXVkaW9wYXlsb2FkKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX0wxNl9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFJ0cEwxNlBheSAqcnRwTDE2cGF5OworICBnYm9vbGVhbiByZXM7CisgIGdjaGFyICpwYXJhbXM7CisgIEdzdEF1ZGlvSW5mbyAqaW5mbzsKKyAgY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICpvcmRlcjsKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZCAqcnRwYmFzZWF1ZGlvcGF5bG9hZDsKKworICBydHBiYXNlYXVkaW9wYXlsb2FkID0gR1NUX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQgKGJhc2VwYXlsb2FkKTsKKyAgcnRwTDE2cGF5ID0gR1NUX1JUUF9MMTZfUEFZIChiYXNlcGF5bG9hZCk7CisKKyAgaW5mbyA9ICZydHBMMTZwYXktPmluZm87CisgIGdzdF9hdWRpb19pbmZvX2luaXQgKGluZm8pOworICBpZiAoIWdzdF9hdWRpb19pbmZvX2Zyb21fY2FwcyAoaW5mbywgY2FwcykpCisgICAgZ290byBpbnZhbGlkX2NhcHM7CisKKyAgb3JkZXIgPSBnc3RfcnRwX2NoYW5uZWxzX2dldF9ieV9wb3MgKGluZm8tPmNoYW5uZWxzLCBpbmZvLT5wb3NpdGlvbik7CisgIHJ0cEwxNnBheS0+b3JkZXIgPSBvcmRlcjsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAoYmFzZXBheWxvYWQsICJhdWRpbyIsIFRSVUUsICJMMTYiLAorICAgICAgaW5mby0+cmF0ZSk7CisgIHBhcmFtcyA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgaW5mby0+Y2hhbm5lbHMpOworCisgIGlmICghb3JkZXIgJiYgaW5mby0+Y2hhbm5lbHMgPiAyKSB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwTDE2cGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIlVua25vd24gY2hhbm5lbCBvcmRlciBmb3IgJWQgY2hhbm5lbHMiLCBpbmZvLT5jaGFubmVscykpOworICB9CisKKyAgaWYgKG9yZGVyICYmIG9yZGVyLT5uYW1lKSB7CisgICAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLAorICAgICAgICAiZW5jb2RpbmctcGFyYW1zIiwgR19UWVBFX1NUUklORywgcGFyYW1zLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULAorICAgICAgICBpbmZvLT5jaGFubmVscywgImNoYW5uZWwtb3JkZXIiLCBHX1RZUEVfU1RSSU5HLCBvcmRlci0+bmFtZSwgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLAorICAgICAgICAiZW5jb2RpbmctcGFyYW1zIiwgR19UWVBFX1NUUklORywgcGFyYW1zLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULAorICAgICAgICBpbmZvLT5jaGFubmVscywgTlVMTCk7CisgIH0KKworICBnX2ZyZWUgKHBhcmFtcyk7CisKKyAgLyogb2N0ZXQtcGVyLXNhbXBsZSBpcyAyICogY2hhbm5lbHMgZm9yIEwxNiAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfc2FtcGxlX29wdGlvbnMgKHJ0cGJhc2VhdWRpb3BheWxvYWQsCisgICAgICAyICogaW5mby0+Y2hhbm5lbHMpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX2NhcHM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBMMTZwYXksICJpbnZhbGlkIGNhcHMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3J0cF9MMTZfcGF5X2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcnRwcGF5bG9hZCwgR3N0UGFkICogcGFkLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKm90aGVycGFkY2FwczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisKKyAgb3RoZXJwYWRjYXBzID0gZ3N0X3BhZF9nZXRfYWxsb3dlZF9jYXBzIChydHBwYXlsb2FkLT5zcmNwYWQpOworICBpZiAob3RoZXJwYWRjYXBzKSB7CisgICAgaWYgKCFnc3RfY2Fwc19pc19lbXB0eSAob3RoZXJwYWRjYXBzKSkgeworICAgICAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgICAgICBnaW50IGNoYW5uZWxzOworICAgICAgZ2ludCBwdDsKKyAgICAgIGdpbnQgcmF0ZTsKKworICAgICAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAob3RoZXJwYWRjYXBzLCAwKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2hhbm5lbHMiLCAmY2hhbm5lbHMpKSB7CisgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGNoYW5uZWxzLCBOVUxMKTsKKyAgICAgIH0gZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJwYXlsb2FkIiwgJnB0KSkgeworICAgICAgICBpZiAocHQgPT0gR1NUX1JUUF9QQVlMT0FEX0wxNl9TVEVSRU8pCisgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMiwgTlVMTCk7CisgICAgICAgIGVsc2UgaWYgKHB0ID09IEdTVF9SVFBfUEFZTE9BRF9MMTZfTU9OTykKKyAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZyYXRlKSkgeworICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAicmF0ZSIsIEdfVFlQRV9JTlQsIHJhdGUsIE5VTEwpOworICAgICAgfSBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgInBheWxvYWQiLCAmcHQpKSB7CisgICAgICAgIGlmIChwdCA9PSBHU1RfUlRQX1BBWUxPQURfTDE2X1NURVJFTyB8fCBwdCA9PSBHU1RfUlRQX1BBWUxPQURfTDE2X01PTk8pCisgICAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgInJhdGUiLCBHX1RZUEVfSU5ULCA0NDEwMCwgTlVMTCk7CisgICAgICB9CisKKyAgICB9CisgICAgZ3N0X2NhcHNfdW5yZWYgKG90aGVycGFkY2Fwcyk7CisgIH0KKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqdGNhcHMgPSBjYXBzOworCisgICAgY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHRjYXBzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmICh0Y2Fwcyk7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfTDE2X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UnRwTDE2UGF5ICpydHBMMTZwYXk7CisKKyAgcnRwTDE2cGF5ID0gR1NUX1JUUF9MMTZfUEFZIChiYXNlcGF5bG9hZCk7CisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoYnVmZmVyKTsKKworICBpZiAocnRwTDE2cGF5LT5vcmRlciAmJgorICAgICAgIWdzdF9hdWRpb19idWZmZXJfcmVvcmRlcl9jaGFubmVscyAoYnVmZmVyLCBydHBMMTZwYXktPmluZm8uZmluZm8tPmZvcm1hdCwKKyAgICAgICAgICBydHBMMTZwYXktPmluZm8uY2hhbm5lbHMsIHJ0cEwxNnBheS0+aW5mby5wb3NpdGlvbiwKKyAgICAgICAgICBydHBMMTZwYXktPm9yZGVyLT5wb3MpKSB7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgcmV0dXJuIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5oYW5kbGVfYnVmZmVyIChiYXNlcGF5bG9hZCwKKyAgICAgIGJ1ZmZlcik7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX0wxNl9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBMMTZwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfTDE2X1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cEwxNnBheS5oIGIvZ3N0L3J0cC9nc3RydHBMMTZwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGYzNzAyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBMMTZwYXkuaApAQCAtMCwwICsxLDYzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfTDE2X1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0wxNl9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlYXVkaW9wYXlsb2FkLmg+CisKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0wxNl9QQVkgXAorICAoZ3N0X3J0cF9MMTZfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfTDE2X1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9MMTZfUEFZLEdzdFJ0cEwxNlBheSkpCisjZGVmaW5lIEdTVF9SVFBfTDE2X1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTDE2X1BBWSxHc3RSdHBMMTZQYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfTDE2X1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9MMTZfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9MMTZfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9MMTZfUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEwxNlBheSBHc3RSdHBMMTZQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTDE2UGF5Q2xhc3MgR3N0UnRwTDE2UGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTDE2UGF5Cit7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgcGF5bG9hZDsKKworICBHc3RBdWRpb0luZm8gaW5mbzsKKyAgY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICpvcmRlcjsKK307CisKK3N0cnVjdCBfR3N0UnRwTDE2UGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfTDE2X3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfTDE2X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9MMTZfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBMMjRkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBMMjRkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMjhlZTgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cEwyNGRlcGF5LmMKQEAgLTAsMCArMSwyNjQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHBMMjRkZXBheQorICogQHNlZV9hbHNvOiBydHBMMjRwYXkKKyAqCisgKiBFeHRyYWN0IHJhdyBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIGFjY29yZGluZyB0byBSRkMgMzE5MCwgc2VjdGlvbiA0LgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzE5MC50eHQKKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdWRwc3JjIGNhcHM9J2FwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpNDQxMDAsIGVuY29kaW5nLW5hbWU9KHN0cmluZylMMjQsIGVuY29kaW5nLXBhcmFtcz0oc3RyaW5nKTEsIGNoYW5uZWxzPShpbnQpMSwgcGF5bG9hZD0oaW50KTk2JyAhIHJ0cEwyNGRlcGF5ICEgcHVsc2VzaW5rCisgKiBdfCBUaGlzIGV4YW1wbGUgcGlwZWxpbmUgd2lsbCBkZXBheWxvYWQgYW4gUlRQIHJhdyBhdWRpbyBzdHJlYW0uIFJlZmVyIHRvCisgKiB0aGUgcnRwTDI0cGF5IGV4YW1wbGUgdG8gY3JlYXRlIHRoZSBSVFAgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSAiZ3N0cnRwTDI0ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cEwyNGRlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBMMjRkZXBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfTDI0X2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIFMyNEJFLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIgImNoYW5uZWxzID0gKGludCkgWyAxLCBNQVggXSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfTDI0X2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiICJjbG9jay1yYXRlID0gKGludCkgWyAxLCBNQVggXSwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTDI0XCIiKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF9MMjRfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwTDI0RGVwYXksIGdzdF9ydHBfTDI0X2RlcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9MMjRfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX0wyNF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX0wyNF9kZXBheV9jbGFzc19pbml0IChHc3RSdHBMMjREZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfTDI0X2RlcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfTDI0X2RlcGF5X3Byb2Nlc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9MMjRfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9MMjRfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgYXVkaW8gZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIHJhdyAyNC1iaXQgYXVkaW8gZnJvbSBSVFAgcGFja2V0cyIsCisgICAgICAiWmVlc2hhbiBBbGkgPHphazE0N0B5YWhvby5jb20+LCIgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+LCIKKyAgICAgICJEYXZpZCBIb2xyb3lkIDxkYXZlQGJhZGdlcnMtaW4tZm9pbC5jby51az4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwTDI0ZGVwYXlfZGVidWcsICJydHBMMjRkZXBheSIsIDAsCisgICAgICAiUmF3IEF1ZGlvIFJUUCBEZXBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9MMjRfZGVwYXlfaW5pdCAoR3N0UnRwTDI0RGVwYXkgKiBydHBMMjRkZXBheSkKK3sKK30KKworc3RhdGljIGdpbnQKK2dzdF9ydHBfTDI0X2RlcGF5X3BhcnNlX2ludCAoR3N0U3RydWN0dXJlICogc3RydWN0dXJlLCBjb25zdCBnY2hhciAqIGZpZWxkLAorICAgIGdpbnQgZGVmKQoreworICBjb25zdCBnY2hhciAqc3RyOworICBnaW50IHJlczsKKworICBpZiAoKHN0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCBmaWVsZCkpKQorICAgIHJldHVybiBhdG9pIChzdHIpOworCisgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgZmllbGQsICZyZXMpKQorICAgIHJldHVybiByZXM7CisKKyAgcmV0dXJuIGRlZjsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX0wyNF9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdFJ0cEwyNERlcGF5ICpydHBMMjRkZXBheTsKKyAgZ2ludCBjbG9ja19yYXRlLCBwYXlsb2FkOworICBnaW50IGNoYW5uZWxzOworICBHc3RDYXBzICpzcmNjYXBzOworICBnYm9vbGVhbiByZXM7CisgIGNvbnN0IGdjaGFyICpjaGFubmVsX29yZGVyOworICBjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgKm9yZGVyOworICBHc3RBdWRpb0luZm8gKmluZm87CisKKyAgcnRwTDI0ZGVwYXkgPSBHU1RfUlRQX0wyNF9ERVBBWSAoZGVwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBwYXlsb2FkID0gOTY7CisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAicGF5bG9hZCIsICZwYXlsb2FkKTsKKyAgLyogbm8gZml4ZWQgbWFwcGluZywgd2UgbmVlZCBjbG9jay1yYXRlICovCisgIGNoYW5uZWxzID0gMDsKKyAgY2xvY2tfcmF0ZSA9IDA7CisKKyAgLyogY2FwcyBjYW4gb3ZlcndyaXRlIGRlZmF1bHRzICovCisgIGNsb2NrX3JhdGUgPQorICAgICAgZ3N0X3J0cF9MMjRfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgY2xvY2tfcmF0ZSk7CisgIGlmIChjbG9ja19yYXRlID09IDApCisgICAgZ290byBub19jbG9ja3JhdGU7CisKKyAgY2hhbm5lbHMgPQorICAgICAgZ3N0X3J0cF9MMjRfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJlbmNvZGluZy1wYXJhbXMiLCBjaGFubmVscyk7CisgIGlmIChjaGFubmVscyA9PSAwKSB7CisgICAgY2hhbm5lbHMgPSBnc3RfcnRwX0wyNF9kZXBheV9wYXJzZV9pbnQgKHN0cnVjdHVyZSwgImNoYW5uZWxzIiwgY2hhbm5lbHMpOworICAgIGlmIChjaGFubmVscyA9PSAwKSB7CisgICAgICAvKiBjaGFubmVscyBkZWZhdWx0cyB0byAxIG90aGVyd2lzZSAqLworICAgICAgY2hhbm5lbHMgPSAxOworICAgIH0KKyAgfQorCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgaW5mbyA9ICZydHBMMjRkZXBheS0+aW5mbzsKKyAgZ3N0X2F1ZGlvX2luZm9faW5pdCAoaW5mbyk7CisgIGluZm8tPmZpbmZvID0gZ3N0X2F1ZGlvX2Zvcm1hdF9nZXRfaW5mbyAoR1NUX0FVRElPX0ZPUk1BVF9TMjRCRSk7CisgIGluZm8tPnJhdGUgPSBjbG9ja19yYXRlOworICBpbmZvLT5jaGFubmVscyA9IGNoYW5uZWxzOworICBpbmZvLT5icGYgPSAoaW5mby0+ZmluZm8tPndpZHRoIC8gOCkgKiBjaGFubmVsczsKKworICAvKiBhZGQgY2hhbm5lbCBwb3NpdGlvbnMgKi8KKyAgY2hhbm5lbF9vcmRlciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiY2hhbm5lbC1vcmRlciIpOworCisgIG9yZGVyID0gZ3N0X3J0cF9jaGFubmVsc19nZXRfYnlfb3JkZXIgKGNoYW5uZWxzLCBjaGFubmVsX29yZGVyKTsKKyAgcnRwTDI0ZGVwYXktPm9yZGVyID0gb3JkZXI7CisgIGlmIChvcmRlcikgeworICAgIG1lbWNweSAoaW5mby0+cG9zaXRpb24sIG9yZGVyLT5wb3MsCisgICAgICAgIHNpemVvZiAoR3N0QXVkaW9DaGFubmVsUG9zaXRpb24pICogY2hhbm5lbHMpOworICAgIGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b192YWxpZF9vcmRlciAoaW5mby0+cG9zaXRpb24sIGluZm8tPmNoYW5uZWxzKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBMMjRkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJVbmtub3duIGNoYW5uZWwgb3JkZXIgJyVzJyBmb3IgJWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgR1NUX1NUUl9OVUxMIChjaGFubmVsX29yZGVyKSwgY2hhbm5lbHMpKTsKKyAgICAvKiBjcmVhdGUgZGVmYXVsdCBOT05FIGxheW91dCAqLworICAgIGdzdF9ydHBfY2hhbm5lbHNfY3JlYXRlX2RlZmF1bHQgKGNoYW5uZWxzLCBpbmZvLT5wb3NpdGlvbik7CisgIH0KKworICBzcmNjYXBzID0gZ3N0X2F1ZGlvX2luZm9fdG9fY2FwcyAoaW5mbyk7CisgIHJlcyA9IGdzdF9wYWRfc2V0X2NhcHMgKGRlcGF5bG9hZC0+c3JjcGFkLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitub19jbG9ja3JhdGU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZXBheWxvYWQsICJubyBjbG9jay1yYXRlIHNwZWNpZmllZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfTDI0X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0UnRwTDI0RGVwYXkgKnJ0cEwyNGRlcGF5OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ2ludCBwYXlsb2FkX2xlbjsKKyAgZ2Jvb2xlYW4gbWFya2VyOworCisgIHJ0cEwyNGRlcGF5ID0gR1NUX1JUUF9MMjRfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisKKyAgaWYgKHBheWxvYWRfbGVuIDw9IDApCisgICAgZ290byBlbXB0eV9wYWNrZXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwTDI0ZGVwYXksICJnb3QgcGF5bG9hZCBvZiAlZCBieXRlcyIsIHBheWxvYWRfbGVuKTsKKworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9idWZmZXIgKHJ0cCk7CisgIG1hcmtlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgaWYgKG1hcmtlcikgeworICAgIC8qIG1hcmsgdGFsayBzcHVydCB3aXRoIFJFU1lOQyAqLworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1JFU1lOQyk7CisgIH0KKworICBvdXRidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKG91dGJ1Zik7CisgIGlmIChvdXRidWYpIHsKKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKHJ0cEwyNGRlcGF5LCBvdXRidWYpOworICB9CisgIGlmIChydHBMMjRkZXBheS0+b3JkZXIgJiYKKyAgICAgICFnc3RfYXVkaW9fYnVmZmVyX3Jlb3JkZXJfY2hhbm5lbHMgKG91dGJ1ZiwKKyAgICAgICAgICBydHBMMjRkZXBheS0+aW5mby5maW5mby0+Zm9ybWF0LCBydHBMMjRkZXBheS0+aW5mby5jaGFubmVscywKKyAgICAgICAgICBydHBMMjRkZXBheS0+aW5mby5wb3NpdGlvbiwgcnRwTDI0ZGVwYXktPm9yZGVyLT5wb3MpKSB7CisgICAgZ290byByZW9yZGVyX2ZhaWxlZDsKKyAgfQorCisgIHJldHVybiBvdXRidWY7CisKKyAgLyogRVJST1JTICovCitlbXB0eV9wYWNrZXQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBMMjRkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgICgiRW1wdHkgUGF5bG9hZC4iKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorcmVvcmRlcl9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocnRwTDI0ZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIkNoYW5uZWwgcmVvcmRlcmluZyBmYWlsZWQuIiksIChOVUxMKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfTDI0X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwTDI0ZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfTDI0X0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwTDI0ZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwTDI0ZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGUwMGU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBMMjRkZXBheS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9MMjRfREVQQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9MMjRfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorCitHX0JFR0lOX0RFQ0xTCisKKy8qIFN0YW5kYXJkIG1hY3JvcyBmb3IgZGVmaW5pbmcgdHlwZXMgZm9yIHRoaXMgZWxlbWVudC4gICovCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9MMjRfREVQQVkgXAorICAoZ3N0X3J0cF9MMjRfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9MMjRfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfTDI0X0RFUEFZLEdzdFJ0cEwyNERlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9MMjRfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0wyNF9ERVBBWSxHc3RSdHBMMjREZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9MMjRfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfTDI0X0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9MMjRfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0wyNF9ERVBBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBMMjREZXBheSBHc3RSdHBMMjREZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBMMjREZXBheUNsYXNzIEdzdFJ0cEwyNERlcGF5Q2xhc3M7CisKKy8qIERlZmluaXRpb24gb2Ygc3RydWN0dXJlIHN0b3JpbmcgZGF0YSBmb3IgdGhpcyBlbGVtZW50LiAqLworc3RydWN0IF9Hc3RSdHBMMjREZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKKworICBHc3RBdWRpb0luZm8gaW5mbzsKKyAgY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICpvcmRlcjsKK307CisKKy8qIFN0YW5kYXJkIGRlZmluaXRpb24gZGVmaW5pbmcgYSBjbGFzcyBmb3IgdGhpcyBlbGVtZW50LiAqLworc3RydWN0IF9Hc3RSdHBMMjREZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX0wyNF9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfTDI0X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0wyNF9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwTDI0cGF5LmMgYi9nc3QvcnRwL2dzdHJ0cEwyNHBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNmJkNDQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cEwyNHBheS5jCkBAIC0wLDAgKzEsMjQ0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwTDI0cGF5CisgKiBAc2VlX2Fsc286IHJ0cEwyNGRlcGF5CisgKgorICogUGF5bG9hZCByYXcgMjQtYml0IGF1ZGlvIGludG8gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyAzMTkwLCBzZWN0aW9uIDQuCisgKiBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gc2VlOiBodHRwOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmMzMTkwLnR4dAorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBhdWRpb3Rlc3RzcmMgISBhdWRpb2NvbnZlcnQgISBydHBMMjRwYXkgISB1ZHBzaW5rCisgKiBdfCBUaGlzIGV4YW1wbGUgcGlwZWxpbmUgd2lsbCBwYXlsb2FkIHJhdyBhdWRpby4gUmVmZXIgdG8KKyAqIHRoZSBydHBMMjRkZXBheSBleGFtcGxlIHRvIGRlcGF5bG9hZCBhbmQgcGxheSB0aGUgUlRQIHN0cmVhbS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKyNpbmNsdWRlICJnc3RydHBMMjRwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBMMjRwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cEwyNHBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfTDI0X3BheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSBTMjRCRSwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgTUFYIF0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX0wyNF9wYXlfc3JjX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgWyA5NiwgMTI3IF0sICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJMMjRcIiwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdOyIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfTDI0X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfcnRwX0wyNF9wYXlfZ2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBydHBwYXlsb2FkLAorICAgIEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9MMjRfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworI2RlZmluZSBnc3RfcnRwX0wyNF9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwTDI0UGF5LCBnc3RfcnRwX0wyNF9wYXksIEdTVF9UWVBFX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9MMjRfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEwyNFBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9MMjRfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5nZXRfY2FwcyA9IGdzdF9ydHBfTDI0X3BheV9nZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9IGdzdF9ydHBfTDI0X3BheV9oYW5kbGVfYnVmZmVyOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfTDI0X3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX0wyNF9wYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgYXVkaW8gcGF5bG9hZGVyIiwgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZC1lbmNvZGUgUmF3IDI0LWJpdCBhdWRpbyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgMzE5MCkiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+LCIKKyAgICAgICJEYXZpZCBIb2xyb3lkIDxkYXZlQGJhZGdlcnMtaW4tZm9pbC5jby51az4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwTDI0cGF5X2RlYnVnLCAicnRwTDI0cGF5IiwgMCwKKyAgICAgICJMMjQgUlRQIFBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9MMjRfcGF5X2luaXQgKEdzdFJ0cEwyNFBheSAqIHJ0cEwyNHBheSkKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZCAqcnRwYmFzZWF1ZGlvcGF5bG9hZDsKKworICBydHBiYXNlYXVkaW9wYXlsb2FkID0gR1NUX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQgKHJ0cEwyNHBheSk7CisKKyAgLyogdGVsbCBydHBiYXNlYXVkaW9wYXlsb2FkIHRoYXQgdGhpcyBpcyBhIHNhbXBsZSBiYXNlZCBjb2RlYyAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfc2FtcGxlX2Jhc2VkIChydHBiYXNlYXVkaW9wYXlsb2FkKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX0wyNF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFJ0cEwyNFBheSAqcnRwTDI0cGF5OworICBnYm9vbGVhbiByZXM7CisgIGdjaGFyICpwYXJhbXM7CisgIEdzdEF1ZGlvSW5mbyAqaW5mbzsKKyAgY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICpvcmRlcjsKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZCAqcnRwYmFzZWF1ZGlvcGF5bG9hZDsKKworICBydHBiYXNlYXVkaW9wYXlsb2FkID0gR1NUX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQgKGJhc2VwYXlsb2FkKTsKKyAgcnRwTDI0cGF5ID0gR1NUX1JUUF9MMjRfUEFZIChiYXNlcGF5bG9hZCk7CisKKyAgaW5mbyA9ICZydHBMMjRwYXktPmluZm87CisgIGdzdF9hdWRpb19pbmZvX2luaXQgKGluZm8pOworICBpZiAoIWdzdF9hdWRpb19pbmZvX2Zyb21fY2FwcyAoaW5mbywgY2FwcykpCisgICAgZ290byBpbnZhbGlkX2NhcHM7CisKKyAgb3JkZXIgPSBnc3RfcnRwX2NoYW5uZWxzX2dldF9ieV9wb3MgKGluZm8tPmNoYW5uZWxzLCBpbmZvLT5wb3NpdGlvbik7CisgIHJ0cEwyNHBheS0+b3JkZXIgPSBvcmRlcjsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAoYmFzZXBheWxvYWQsICJhdWRpbyIsIFRSVUUsICJMMjQiLAorICAgICAgaW5mby0+cmF0ZSk7CisgIHBhcmFtcyA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgaW5mby0+Y2hhbm5lbHMpOworCisgIGlmICghb3JkZXIgJiYgaW5mby0+Y2hhbm5lbHMgPiAyKSB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwTDI0cGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIlVua25vd24gY2hhbm5lbCBvcmRlciBmb3IgJWQgY2hhbm5lbHMiLCBpbmZvLT5jaGFubmVscykpOworICB9CisKKyAgaWYgKG9yZGVyICYmIG9yZGVyLT5uYW1lKSB7CisgICAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLAorICAgICAgICAiZW5jb2RpbmctcGFyYW1zIiwgR19UWVBFX1NUUklORywgcGFyYW1zLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULAorICAgICAgICBpbmZvLT5jaGFubmVscywgImNoYW5uZWwtb3JkZXIiLCBHX1RZUEVfU1RSSU5HLCBvcmRlci0+bmFtZSwgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLAorICAgICAgICAiZW5jb2RpbmctcGFyYW1zIiwgR19UWVBFX1NUUklORywgcGFyYW1zLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULAorICAgICAgICBpbmZvLT5jaGFubmVscywgTlVMTCk7CisgIH0KKworICBnX2ZyZWUgKHBhcmFtcyk7CisKKyAgLyogb2N0ZXQtcGVyLXNhbXBsZSBpcyAzICogY2hhbm5lbHMgZm9yIEwyNCAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfc2FtcGxlX29wdGlvbnMgKHJ0cGJhc2VhdWRpb3BheWxvYWQsCisgICAgICAzICogaW5mby0+Y2hhbm5lbHMpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX2NhcHM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBMMjRwYXksICJpbnZhbGlkIGNhcHMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3J0cF9MMjRfcGF5X2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcnRwcGF5bG9hZCwgR3N0UGFkICogcGFkLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKm90aGVycGFkY2FwczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisKKyAgb3RoZXJwYWRjYXBzID0gZ3N0X3BhZF9nZXRfYWxsb3dlZF9jYXBzIChydHBwYXlsb2FkLT5zcmNwYWQpOworICBpZiAob3RoZXJwYWRjYXBzKSB7CisgICAgaWYgKCFnc3RfY2Fwc19pc19lbXB0eSAob3RoZXJwYWRjYXBzKSkgeworICAgICAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgICAgICBnaW50IGNoYW5uZWxzOworICAgICAgZ2ludCByYXRlOworCisgICAgICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChvdGhlcnBhZGNhcHMsIDApOworICAgICAgY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGNhcHMpOworCisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsICZjaGFubmVscykpIHsKKyAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgY2hhbm5lbHMsIE5VTEwpOworICAgICAgfQorCisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJnJhdGUpKSB7CisgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJyYXRlIiwgR19UWVBFX0lOVCwgcmF0ZSwgTlVMTCk7CisgICAgICB9CisKKyAgICB9CisgICAgZ3N0X2NhcHNfdW5yZWYgKG90aGVycGFkY2Fwcyk7CisgIH0KKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqdGNhcHMgPSBjYXBzOworCisgICAgY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHRjYXBzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmICh0Y2Fwcyk7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfTDI0X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UnRwTDI0UGF5ICpydHBMMjRwYXk7CisKKyAgcnRwTDI0cGF5ID0gR1NUX1JUUF9MMjRfUEFZIChiYXNlcGF5bG9hZCk7CisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoYnVmZmVyKTsKKworICBpZiAocnRwTDI0cGF5LT5vcmRlciAmJgorICAgICAgIWdzdF9hdWRpb19idWZmZXJfcmVvcmRlcl9jaGFubmVscyAoYnVmZmVyLCBydHBMMjRwYXktPmluZm8uZmluZm8tPmZvcm1hdCwKKyAgICAgICAgICBydHBMMjRwYXktPmluZm8uY2hhbm5lbHMsIHJ0cEwyNHBheS0+aW5mby5wb3NpdGlvbiwKKyAgICAgICAgICBydHBMMjRwYXktPm9yZGVyLT5wb3MpKSB7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgcmV0dXJuIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5oYW5kbGVfYnVmZmVyIChiYXNlcGF5bG9hZCwKKyAgICAgIGJ1ZmZlcik7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX0wyNF9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBMMjRwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfTDI0X1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cEwyNHBheS5oIGIvZ3N0L3J0cC9nc3RydHBMMjRwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzM5NWFkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBMMjRwYXkuaApAQCAtMCwwICsxLDYzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfTDI0X1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0wyNF9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlYXVkaW9wYXlsb2FkLmg+CisKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0wyNF9QQVkgXAorICAoZ3N0X3J0cF9MMjRfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfTDI0X1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9MMjRfUEFZLEdzdFJ0cEwyNFBheSkpCisjZGVmaW5lIEdTVF9SVFBfTDI0X1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTDI0X1BBWSxHc3RSdHBMMjRQYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfTDI0X1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9MMjRfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9MMjRfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9MMjRfUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEwyNFBheSBHc3RSdHBMMjRQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTDI0UGF5Q2xhc3MgR3N0UnRwTDI0UGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTDI0UGF5Cit7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgcGF5bG9hZDsKKworICBHc3RBdWRpb0luZm8gaW5mbzsKKyAgY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICpvcmRlcjsKK307CisKK3N0cnVjdCBfR3N0UnRwTDI0UGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfTDI0X3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfTDI0X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9MMjRfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBMOGRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cEw4ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjk1MjBhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBMOGRlcGF5LmMKQEAgLTAsMCArMSwyNjcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMTU+IEdFIEludGVsbGlnZW50IFBsYXRmb3JtcyBFbWJlZGRlZCBTeXN0ZW1zLCBJbmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwTDhkZXBheQorICogQHNlZV9hbHNvOiBydHBMOHBheQorICoKKyAqIEV4dHJhY3QgcmF3IGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyAzNTUxLgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzU1MS50eHQKKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaCB1ZHBzcmMgY2Fwcz0nYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXVkaW8sIGNsb2NrLXJhdGU9KGludCk0NDEwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUw4LCBlbmNvZGluZy1wYXJhbXM9KHN0cmluZykxLCBjaGFubmVscz0oaW50KTEsIHBheWxvYWQ9KGludCk5NicgISBydHBMOGRlcGF5ICEgcHVsc2VzaW5rCisgKiBdfCBUaGlzIGV4YW1wbGUgcGlwZWxpbmUgd2lsbCBkZXBheWxvYWQgYW4gUlRQIHJhdyBhdWRpbyBzdHJlYW0uIFJlZmVyIHRvCisgKiB0aGUgcnRwTDhwYXkgZXhhbXBsZSB0byBjcmVhdGUgdGhlIFJUUCBzdHJlYW0uCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RydHBMOGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwY2hhbm5lbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwTDhkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwTDhkZXBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfTDhfZGVwYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgVTgsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9MOF9kZXBheV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBhdWRpbywgY2xvY2stcmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIKKyAgICAgICAgLyogImNoYW5uZWxzID0gKGludCkgWzEsIE1BWF0iICAqLworICAgICAgICAvKiAiZW1waGFzaXMgPSAoc3RyaW5nKSBBTlkiICovCisgICAgICAgIC8qICJjaGFubmVsLW9yZGVyID0gKHN0cmluZykgQU5ZIiAqLworICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIEw4OyIpCisgICAgKTsKKworI2RlZmluZSBnc3RfcnRwX0w4X2RlcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEw4RGVwYXksIGdzdF9ydHBfTDhfZGVwYXksIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX0w4X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9MOF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX0w4X2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEw4RGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX0w4X2RlcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3MgPSBnc3RfcnRwX0w4X2RlcGF5X3Byb2Nlc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgIGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCAoJmdzdF9ydHBfTDhfZGVwYXlfc3JjX3RlbXBsYXRlKSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXQgKCZnc3RfcnRwX0w4X2RlcGF5X3NpbmtfdGVtcGxhdGUpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBhdWRpbyBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgcmF3IGF1ZGlvIGZyb20gUlRQIHBhY2tldHMiLAorICAgICAgIlplZXNoYW4gQWxpIDx6YWsxNDdAeWFob28uY29tPiwiICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiwgIgorICAgICAgIkdFIEludGVsbGlnZW50IFBsYXRmb3JtcyBFbWJlZGRlZCBTeXN0ZW1zLCBJbmMuIik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cEw4ZGVwYXlfZGVidWcsICJydHBMOGRlcGF5IiwgMCwKKyAgICAgICJSYXcgQXVkaW8gUlRQIERlcGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX0w4X2RlcGF5X2luaXQgKEdzdFJ0cEw4RGVwYXkgKiBydHBMOGRlcGF5KQoreworfQorCitzdGF0aWMgZ2ludAorZ3N0X3J0cF9MOF9kZXBheV9wYXJzZV9pbnQgKEdzdFN0cnVjdHVyZSAqIHN0cnVjdHVyZSwgY29uc3QgZ2NoYXIgKiBmaWVsZCwKKyAgICBnaW50IGRlZikKK3sKKyAgY29uc3QgZ2NoYXIgKnN0cjsKKyAgZ2ludCByZXM7CisKKyAgaWYgKChzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgZmllbGQpKSkKKyAgICByZXR1cm4gYXRvaSAoc3RyKTsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsIGZpZWxkLCAmcmVzKSkKKyAgICByZXR1cm4gcmVzOworCisgIHJldHVybiBkZWY7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9MOF9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdFJ0cEw4RGVwYXkgKnJ0cEw4ZGVwYXk7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgZ2ludCBjaGFubmVsczsKKyAgR3N0Q2FwcyAqc3JjY2FwczsKKyAgZ2Jvb2xlYW4gcmVzOworICBjb25zdCBnY2hhciAqY2hhbm5lbF9vcmRlcjsKKyAgY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICpvcmRlcjsKKyAgR3N0QXVkaW9JbmZvICppbmZvOworCisgIHJ0cEw4ZGVwYXkgPSBHU1RfUlRQX0w4X0RFUEFZIChkZXBheWxvYWQpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIC8qIG5vIGZpeGVkIG1hcHBpbmcsIHdlIG5lZWQgY2xvY2stcmF0ZSAqLworICBjaGFubmVscyA9IDA7CisgIGNsb2NrX3JhdGUgPSAwOworCisgIC8qIGNhcHMgY2FuIG92ZXJ3cml0ZSBkZWZhdWx0cyAqLworICBjbG9ja19yYXRlID0gZ3N0X3J0cF9MOF9kZXBheV9wYXJzZV9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCBjbG9ja19yYXRlKTsKKyAgaWYgKGNsb2NrX3JhdGUgPT0gMCkKKyAgICBnb3RvIG5vX2Nsb2NrcmF0ZTsKKworICBjaGFubmVscyA9CisgICAgICBnc3RfcnRwX0w4X2RlcGF5X3BhcnNlX2ludCAoc3RydWN0dXJlLCAiZW5jb2RpbmctcGFyYW1zIiwgY2hhbm5lbHMpOworICBpZiAoY2hhbm5lbHMgPT0gMCkgeworICAgIGNoYW5uZWxzID0gZ3N0X3J0cF9MOF9kZXBheV9wYXJzZV9pbnQgKHN0cnVjdHVyZSwgImNoYW5uZWxzIiwgY2hhbm5lbHMpOworICAgIGlmIChjaGFubmVscyA9PSAwKSB7CisgICAgICAvKiBjaGFubmVscyBkZWZhdWx0cyB0byAxIG90aGVyd2lzZSAqLworICAgICAgY2hhbm5lbHMgPSAxOworICAgIH0KKyAgfQorCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgaW5mbyA9ICZydHBMOGRlcGF5LT5pbmZvOworICBnc3RfYXVkaW9faW5mb19pbml0IChpbmZvKTsKKyAgaW5mby0+ZmluZm8gPSBnc3RfYXVkaW9fZm9ybWF0X2dldF9pbmZvIChHU1RfQVVESU9fRk9STUFUX1U4KTsKKyAgaW5mby0+cmF0ZSA9IGNsb2NrX3JhdGU7CisgIGluZm8tPmNoYW5uZWxzID0gY2hhbm5lbHM7CisgIGluZm8tPmJwZiA9IChpbmZvLT5maW5mby0+d2lkdGggLyA4KSAqIGNoYW5uZWxzOworCisgIC8qIGFkZCBjaGFubmVsIHBvc2l0aW9ucyAqLworICBjaGFubmVsX29yZGVyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJjaGFubmVsLW9yZGVyIik7CisKKyAgb3JkZXIgPSBnc3RfcnRwX2NoYW5uZWxzX2dldF9ieV9vcmRlciAoY2hhbm5lbHMsIGNoYW5uZWxfb3JkZXIpOworICBydHBMOGRlcGF5LT5vcmRlciA9IG9yZGVyOworICBpZiAob3JkZXIpIHsKKyAgICBtZW1jcHkgKGluZm8tPnBvc2l0aW9uLCBvcmRlci0+cG9zLAorICAgICAgICBzaXplb2YgKEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uKSAqIGNoYW5uZWxzKTsKKyAgICBnc3RfYXVkaW9fY2hhbm5lbF9wb3NpdGlvbnNfdG9fdmFsaWRfb3JkZXIgKGluZm8tPnBvc2l0aW9uLCBpbmZvLT5jaGFubmVscyk7CisgIH0gZWxzZSB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwTDhkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJVbmtub3duIGNoYW5uZWwgb3JkZXIgJyVzJyBmb3IgJWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgR1NUX1NUUl9OVUxMIChjaGFubmVsX29yZGVyKSwgY2hhbm5lbHMpKTsKKyAgICAvKiBjcmVhdGUgZGVmYXVsdCBOT05FIGxheW91dCAqLworICAgIGdzdF9ydHBfY2hhbm5lbHNfY3JlYXRlX2RlZmF1bHQgKGNoYW5uZWxzLCBpbmZvLT5wb3NpdGlvbik7CisgIH0KKworICBzcmNjYXBzID0gZ3N0X2F1ZGlvX2luZm9fdG9fY2FwcyAoaW5mbyk7CisgIHJlcyA9IGdzdF9wYWRfc2V0X2NhcHMgKGRlcGF5bG9hZC0+c3JjcGFkLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitub19jbG9ja3JhdGU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZXBheWxvYWQsICJubyBjbG9jay1yYXRlIHNwZWNpZmllZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfTDhfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RSdHBMOERlcGF5ICpydHBMOGRlcGF5OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ2ludCBwYXlsb2FkX2xlbjsKKyAgZ2Jvb2xlYW4gbWFya2VyOworICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisKKyAgcnRwTDhkZXBheSA9IEdTVF9SVFBfTDhfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChidWYsIEdTVF9NQVBfUkVBRCwgJnJ0cCk7CisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuICgmcnRwKTsKKworICBpZiAocGF5bG9hZF9sZW4gPD0gMCkKKyAgICBnb3RvIGVtcHR5X3BhY2tldDsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBMOGRlcGF5LCAiZ290IHBheWxvYWQgb2YgJWQgYnl0ZXMiLCBwYXlsb2FkX2xlbik7CisKKyAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfYnVmZmVyICgmcnRwKTsKKyAgbWFya2VyID0gZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAoJnJ0cCk7CisKKyAgaWYgKG1hcmtlcikgeworICAgIC8qIG1hcmsgdGFsayBzcHVydCB3aXRoIFJFU1lOQyAqLworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1JFU1lOQyk7CisgIH0KKworICBvdXRidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKG91dGJ1Zik7CisgIGlmIChydHBMOGRlcGF5LT5vcmRlciAmJgorICAgICAgIWdzdF9hdWRpb19idWZmZXJfcmVvcmRlcl9jaGFubmVscyAob3V0YnVmLAorICAgICAgICAgIHJ0cEw4ZGVwYXktPmluZm8uZmluZm8tPmZvcm1hdCwgcnRwTDhkZXBheS0+aW5mby5jaGFubmVscywKKyAgICAgICAgICBydHBMOGRlcGF5LT5pbmZvLnBvc2l0aW9uLCBydHBMOGRlcGF5LT5vcmRlci0+cG9zKSkgeworICAgIGdvdG8gcmVvcmRlcl9mYWlsZWQ7CisgIH0KKworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgcmV0dXJuIG91dGJ1ZjsKKworICAvKiBFUlJPUlMgKi8KK2VtcHR5X3BhY2tldDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cEw4ZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIkVtcHR5IFBheWxvYWQuIiksIChOVUxMKSk7CisgICAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworICAgIHJldHVybiBOVUxMOworICB9CityZW9yZGVyX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChydHBMOGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJDaGFubmVsIHJlb3JkZXJpbmcgZmFpbGVkLiIpLCAoTlVMTCkpOworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF9MOF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cEw4ZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfTDhfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBMOGRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cEw4ZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmQ5YmVjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBMOGRlcGF5LmgKQEAgLTAsMCArMSw2NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAxNT4gR0UgSW50ZWxsaWdlbnQgUGxhdGZvcm1zIEVtYmVkZGVkIFN5c3RlbXMsIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9MOF9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0w4X0RFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSAiZ3N0cnRwY2hhbm5lbHMuaCIKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9MOF9ERVBBWSBcCisgIChnc3RfcnRwX0w4X2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfTDhfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfTDhfREVQQVksR3N0UnRwTDhEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfTDhfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0w4X0RFUEFZLEdzdFJ0cEw4RGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfTDhfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfTDhfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0w4X0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9MOF9ERVBBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBMOERlcGF5IEdzdFJ0cEw4RGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTDhEZXBheUNsYXNzIEdzdFJ0cEw4RGVwYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBMOERlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCisgIEdzdEF1ZGlvSW5mbyBpbmZvOworICBjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgKm9yZGVyOworfTsKKworc3RydWN0IF9Hc3RSdHBMOERlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfTDhfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX0w4X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0w4X0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBMOHBheS5jIGIvZ3N0L3J0cC9nc3RydHBMOHBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZTdiMjIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cEw4cGF5LmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMTU+IEdFIEludGVsbGlnZW50IFBsYXRmb3JtcyBFbWJlZGRlZCBTeXN0ZW1zLCBJbmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwTDhwYXkKKyAqIEBzZWVfYWxzbzogcnRwTDhkZXBheQorICoKKyAqIFBheWxvYWQgcmF3IGF1ZGlvIGludG8gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyAzNTUxLgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzU1MS50eHQKKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaCAtdiBhdWRpb3Rlc3RzcmMgISBhdWRpb2NvbnZlcnQgISBydHBMOHBheSAhIHVkcHNpbmsKKyAqIF18IFRoaXMgZXhhbXBsZSBwaXBlbGluZSB3aWxsIHBheWxvYWQgcmF3IGF1ZGlvLiBSZWZlciB0bworICogdGhlIHJ0cEw4ZGVwYXkgZXhhbXBsZSB0byBkZXBheWxvYWQgYW5kIHBsYXkgdGhlIFJUUCBzdHJlYW0uCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCisjaW5jbHVkZSAiZ3N0cnRwTDhwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBMOHBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwTDhwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX0w4X3BheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSBVOCwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiICJjaGFubmVscyA9IChpbnQpIFsgMSwgTUFYIF0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX0w4X3BheV9zcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBhdWRpbywgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgTDgsICIgImNoYW5uZWxzID0gKGludCkgWyAxLCBNQVggXTsiKQorICAgICk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX0w4X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfcnRwX0w4X3BheV9nZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHJ0cHBheWxvYWQsCisgICAgR3N0UGFkICogcGFkLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX0w4X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKKyNkZWZpbmUgZ3N0X3J0cF9MOF9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwTDhQYXksIGdzdF9ydHBfTDhfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9BVURJT19QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfTDhfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEw4UGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzICpnc3RydHBiYXNlcGF5bG9hZF9jbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX0w4X3BheV9zZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+Z2V0X2NhcHMgPSBnc3RfcnRwX0w4X3BheV9nZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9IGdzdF9ydHBfTDhfcGF5X2hhbmRsZV9idWZmZXI7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgIGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCAoJmdzdF9ydHBfTDhfcGF5X3NyY190ZW1wbGF0ZSkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgZ3N0X3N0YXRpY19wYWRfdGVtcGxhdGVfZ2V0ICgmZ3N0X3J0cF9MOF9wYXlfc2lua190ZW1wbGF0ZSkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIGF1ZGlvIHBheWxvYWRlciIsICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQtZW5jb2RlIFJhdyBhdWRpbyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgMzU1MSkiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+LCAiCisgICAgICAiR0UgSW50ZWxsaWdlbnQgUGxhdGZvcm1zIEVtYmVkZGVkIFN5c3RlbXMsIEluYy4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwTDhwYXlfZGVidWcsICJydHBMOHBheSIsIDAsICJMOCBSVFAgUGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX0w4X3BheV9pbml0IChHc3RSdHBMOFBheSAqIHJ0cEw4cGF5KQoreworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkICpydHBiYXNlYXVkaW9wYXlsb2FkOworCisgIHJ0cGJhc2VhdWRpb3BheWxvYWQgPSBHU1RfUlRQX0JBU0VfQVVESU9fUEFZTE9BRCAocnRwTDhwYXkpOworCisgIC8qIHRlbGwgcnRwYmFzZWF1ZGlvcGF5bG9hZCB0aGF0IHRoaXMgaXMgYSBzYW1wbGUgYmFzZWQgY29kZWMgKi8KKyAgZ3N0X3J0cF9iYXNlX2F1ZGlvX3BheWxvYWRfc2V0X3NhbXBsZV9iYXNlZCAocnRwYmFzZWF1ZGlvcGF5bG9hZCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9MOF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFJ0cEw4UGF5ICpydHBMOHBheTsKKyAgZ2Jvb2xlYW4gcmVzOworICBnY2hhciAqcGFyYW1zOworICBHc3RBdWRpb0luZm8gKmluZm87CisgIGNvbnN0IEdzdFJUUENoYW5uZWxPcmRlciAqb3JkZXI7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgKnJ0cGJhc2VhdWRpb3BheWxvYWQ7CisKKyAgcnRwYmFzZWF1ZGlvcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9BVURJT19QQVlMT0FEIChiYXNlcGF5bG9hZCk7CisgIHJ0cEw4cGF5ID0gR1NUX1JUUF9MOF9QQVkgKGJhc2VwYXlsb2FkKTsKKworICBpbmZvID0gJnJ0cEw4cGF5LT5pbmZvOworICBnc3RfYXVkaW9faW5mb19pbml0IChpbmZvKTsKKyAgaWYgKCFnc3RfYXVkaW9faW5mb19mcm9tX2NhcHMgKGluZm8sIGNhcHMpKQorICAgIGdvdG8gaW52YWxpZF9jYXBzOworCisgIG9yZGVyID0gZ3N0X3J0cF9jaGFubmVsc19nZXRfYnlfcG9zIChpbmZvLT5jaGFubmVscywgaW5mby0+cG9zaXRpb24pOworICBydHBMOHBheS0+b3JkZXIgPSBvcmRlcjsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAoYmFzZXBheWxvYWQsICJhdWRpbyIsIFRSVUUsICJMOCIsCisgICAgICBpbmZvLT5yYXRlKTsKKyAgcGFyYW1zID0gZ19zdHJkdXBfcHJpbnRmICgiJWQiLCBpbmZvLT5jaGFubmVscyk7CisKKyAgaWYgKCFvcmRlciAmJiBpbmZvLT5jaGFubmVscyA+IDIpIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBMOHBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJVbmtub3duIGNoYW5uZWwgb3JkZXIgZm9yICVkIGNoYW5uZWxzIiwgaW5mby0+Y2hhbm5lbHMpKTsKKyAgfQorCisgIGlmIChvcmRlciAmJiBvcmRlci0+bmFtZSkgeworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChiYXNlcGF5bG9hZCwKKyAgICAgICAgImVuY29kaW5nLXBhcmFtcyIsIEdfVFlQRV9TVFJJTkcsIHBhcmFtcywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwKKyAgICAgICAgaW5mby0+Y2hhbm5lbHMsICJjaGFubmVsLW9yZGVyIiwgR19UWVBFX1NUUklORywgb3JkZXItPm5hbWUsIE5VTEwpOworICB9IGVsc2UgeworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChiYXNlcGF5bG9hZCwKKyAgICAgICAgImVuY29kaW5nLXBhcmFtcyIsIEdfVFlQRV9TVFJJTkcsIHBhcmFtcywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwKKyAgICAgICAgaW5mby0+Y2hhbm5lbHMsIE5VTEwpOworICB9CisKKyAgZ19mcmVlIChwYXJhbXMpOworCisgIC8qIG9jdGV0LXBlci1zYW1wbGUgaXMgIyBjaGFubmVscyBmb3IgTDggKi8KKyAgZ3N0X3J0cF9iYXNlX2F1ZGlvX3BheWxvYWRfc2V0X3NhbXBsZV9vcHRpb25zIChydHBiYXNlYXVkaW9wYXlsb2FkLAorICAgICAgaW5mby0+Y2hhbm5lbHMpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX2NhcHM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBMOHBheSwgImludmFsaWQgY2FwcyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfcnRwX0w4X3BheV9nZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHJ0cHBheWxvYWQsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICpvdGhlcnBhZGNhcHM7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgY2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChwYWQpOworCisgIG90aGVycGFkY2FwcyA9IGdzdF9wYWRfZ2V0X2FsbG93ZWRfY2FwcyAocnRwcGF5bG9hZC0+c3JjcGFkKTsKKyAgaWYgKG90aGVycGFkY2FwcykgeworICAgIGlmICghZ3N0X2NhcHNfaXNfZW1wdHkgKG90aGVycGFkY2FwcykpIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICAgICAgZ2ludCBjaGFubmVsczsKKyAgICAgIGdpbnQgcmF0ZTsKKworICAgICAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAob3RoZXJwYWRjYXBzLCAwKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2hhbm5lbHMiLCAmY2hhbm5lbHMpKSB7CisgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGNoYW5uZWxzLCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFN1cHBvcnQgYW55IG51bWJlciBvZiBjaGFubmVscywgaWYgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkICovCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzdHJ1Y3R1cmUsICJjaGFubmVscyIpOworICAgICAgfQorCisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJnJhdGUpKSB7CisgICAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJyYXRlIiwgR19UWVBFX0lOVCwgcmF0ZSwgTlVMTCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBTdXBwb3J0IGFueSByYXRlLCBpZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQgKi8KKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHN0cnVjdHVyZSwgInJhdGUiKTsKKyAgICAgIH0KKworICAgIH0KKyAgICBnc3RfY2Fwc191bnJlZiAob3RoZXJwYWRjYXBzKTsKKyAgfQorCisgIGlmIChmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICp0Y2FwcyA9IGNhcHM7CisKKyAgICBjYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgdGNhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRjYXBzKTsKKyAgfQorCisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9MOF9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJ0cEw4UGF5ICpydHBMOHBheTsKKworICBydHBMOHBheSA9IEdTVF9SVFBfTDhfUEFZIChiYXNlcGF5bG9hZCk7CisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoYnVmZmVyKTsKKworICBpZiAocnRwTDhwYXktPm9yZGVyICYmCisgICAgICAhZ3N0X2F1ZGlvX2J1ZmZlcl9yZW9yZGVyX2NoYW5uZWxzIChidWZmZXIsIHJ0cEw4cGF5LT5pbmZvLmZpbmZvLT5mb3JtYXQsCisgICAgICAgICAgcnRwTDhwYXktPmluZm8uY2hhbm5lbHMsIHJ0cEw4cGF5LT5pbmZvLnBvc2l0aW9uLAorICAgICAgICAgIHJ0cEw4cGF5LT5vcmRlci0+cG9zKSkgeworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIHJldHVybiBHU1RfUlRQX0JBU0VfUEFZTE9BRF9DTEFTUyAocGFyZW50X2NsYXNzKS0+aGFuZGxlX2J1ZmZlciAoYmFzZXBheWxvYWQsCisgICAgICBidWZmZXIpOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9MOF9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBMOHBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9MOF9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBMOHBheS5oIGIvZ3N0L3J0cC9nc3RydHBMOHBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4M2ViMmYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cEw4cGF5LmgKQEAgLTAsMCArMSw2NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAxNT4gR0UgSW50ZWxsaWdlbnQgUGxhdGZvcm1zIEVtYmVkZGVkIFN5c3RlbXMsIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9MOF9QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9MOF9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlYXVkaW9wYXlsb2FkLmg+CisKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0w4X1BBWSBcCisgIChnc3RfcnRwX0w4X3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0w4X1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9MOF9QQVksR3N0UnRwTDhQYXkpKQorI2RlZmluZSBHU1RfUlRQX0w4X1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTDhfUEFZLEdzdFJ0cEw4UGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0w4X1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9MOF9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0w4X1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTDhfUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEw4UGF5IEdzdFJ0cEw4UGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEw4UGF5Q2xhc3MgR3N0UnRwTDhQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBMOFBheQoreworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkIHBheWxvYWQ7CisKKyAgR3N0QXVkaW9JbmZvIGluZm87CisgIGNvbnN0IEdzdFJUUENoYW5uZWxPcmRlciAqb3JkZXI7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cEw4UGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfTDhfcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9MOF9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfTDhfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMmIzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmMKQEAgLTAsMCArMSwxODAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHBhYzNkZXBheQorICogQHNlZV9hbHNvOiBydHBhYzNwYXkKKyAqCisgKiBFeHRyYWN0IEFDMyBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIGFjY29yZGluZyB0byBSRkMgNDE4NC4KKyAqIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBzZWU6IGh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzQxODQudHh0CisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHVkcHNyYyBjYXBzPSdhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9KHN0cmluZylhdWRpbywgY2xvY2stcmF0ZT0oaW50KTQ0MTAwLCBlbmNvZGluZy1uYW1lPShzdHJpbmcpQUMzLCBwYXlsb2FkPShpbnQpOTYnICEgcnRwYWMzZGVwYXkgISBhNTJkZWMgISBwdWxzZXNpbmsKKyAqIF18IFRoaXMgZXhhbXBsZSBwaXBlbGluZSB3aWxsIGRlcGF5bG9hZCBhbmQgZGVjb2RlIGFuIFJUUCBBQzMgc3RyZWFtLiBSZWZlciB0bworICogdGhlIHJ0cGFjM3BheSBleGFtcGxlIHRvIGNyZWF0ZSB0aGUgUlRQIHN0cmVhbS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0cnRwYWMzZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBhYzNkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwYWMzZGVwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2FjM19kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL2FjMyIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfYWMzX2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgeyAzMjAwMCwgNDQxMDAsIDQ4MDAwIH0sICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkFDM1wiIikKKyAgICApOworCitHX0RFRklORV9UWVBFIChHc3RSdHBBQzNEZXBheSwgZ3N0X3J0cF9hYzNfZGVwYXksIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2FjM19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfYWMzX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYWMzX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEFDM0RlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfYWMzX2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfYWMzX2RlcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIEFDMyBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgQUMzIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKFJGQyA0MTg0KSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfYWMzX2RlcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfYWMzX2RlcGF5X3Byb2Nlc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGFjM2RlcGF5X2RlYnVnLCAicnRwYWMzZGVwYXkiLCAwLAorICAgICAgIkFDMyBBdWRpbyBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYWMzX2RlcGF5X2luaXQgKEdzdFJ0cEFDM0RlcGF5ICogcnRwYWMzZGVwYXkpCit7CisgIC8qIG5lZWRlZCBiZWNhdXNlIG9mIEdfREVGSU5FX1RZUEUgKi8KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2FjM19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgR3N0Q2FwcyAqc3JjY2FwczsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA5MDAwMDsgICAgICAgICAvKiBkZWZhdWx0ICovCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby9hYzMiKTsKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoZGVwYXlsb2FkLT5zcmNwYWQsIHNyY2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX2FjM19kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cEFDM0RlcGF5ICpydHBhYzNkZXBheTsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgZ3VpbnQxNiBGVCwgTkY7CisKKyAgcnRwYWMzZGVwYXkgPSBHU1RfUlRQX0FDM19ERVBBWSAoZGVwYXlsb2FkKTsKKworICBpZiAoZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApIDwgMikKKyAgICBnb3RvIGVtcHR5X3BhY2tldDsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisKKyAgLyogc3RyaXAgb2ZmIGhlYWRlcgorICAgKgorICAgKiAgMCAgICAgICAgICAgICAgICAgICAxCisgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgIE1CWiAgICB8IEZUfCAgICAgICBORiAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqLworICBGVCA9IHBheWxvYWRbMF0gJiAweDM7CisgIE5GID0gcGF5bG9hZFsxXTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBhYzNkZXBheSwgIkZUOiAlZCwgTkY6ICVkIiwgRlQsIE5GKTsKKworICAvKiBXZSBkb24ndCBib3RoZXIgd2l0aCBmcmFnbWVudGVkIHBhY2tldHMgeWV0ICovCisgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3N1YmJ1ZmZlciAocnRwLCAyLCAtMSk7CisKKyAgaWYgKG91dGJ1ZikgeworICAgIGdzdF9ydHBfZHJvcF9ub25fYXVkaW9fbWV0YSAocnRwYWMzZGVwYXksIG91dGJ1Zik7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwYWMzZGVwYXksICJwdXNoaW5nIGJ1ZmZlciBvZiBzaXplICUiIEdfR1NJWkVfRk9STUFULAorICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWYpKTsKKyAgfQorCisgIHJldHVybiBvdXRidWY7CisKKyAgLyogRVJST1JTICovCitlbXB0eV9wYWNrZXQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBhYzNkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgICgiRW1wdHkgUGF5bG9hZC4iKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF9hYzNfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBhYzNkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9BQzNfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBhYzNkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NGJiMTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGFjM2RlcGF5LmgKQEAgLTAsMCArMSw1OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0FDM19ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0FDM19ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9BQzNfREVQQVkgXAorICAoZ3N0X3J0cF9hYzNfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9BQzNfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfQUMzX0RFUEFZLEdzdFJ0cEFDM0RlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9BQzNfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0FDM19ERVBBWSxHc3RSdHBBQzNEZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9BQzNfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfQUMzX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9BQzNfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0FDM19ERVBBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBBQzNEZXBheSBHc3RSdHBBQzNEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBBQzNEZXBheUNsYXNzIEdzdFJ0cEFDM0RlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwQUMzRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cEFDM0RlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfYWMzX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9hYzNfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfQUMzX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBhYzNwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwYWMzcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwMjBkYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwYWMzcGF5LmMKQEAgLTAsMCArMSw0NzcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAxMD4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHBhYzNwYXkKKyAqIEBzZWVfYWxzbzogcnRwYWMzZGVwYXkKKyAqCisgKiBQYXlsb2FkIEFDMyBhdWRpbyBpbnRvIFJUUCBwYWNrZXRzIGFjY29yZGluZyB0byBSRkMgNDE4NC4KKyAqIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBzZWU6IGh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzQxODQudHh0CisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyAhIGF2ZW5jX2FjMyAhIHJ0cGFjM3BheSAhIHVkcHNpbmsKKyAqIF18IFRoaXMgZXhhbXBsZSBwaXBlbGluZSB3aWxsIGVuY29kZSBhbmQgcGF5bG9hZCBBQzMgc3RyZWFtLiBSZWZlciB0bworICogdGhlIHJ0cGFjM2RlcGF5IGV4YW1wbGUgdG8gZGVwYXlsb2FkIGFuZCBkZWNvZGUgdGhlIFJUUCBzdHJlYW0uCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSAiZ3N0cnRwYWMzcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwYWMzcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBhYzNwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2FjM19wYXlfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8vYWMzOyAiICJhdWRpby94LWFjMzsgIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9hYzNfcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIHsgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJBQzNcIiIpCisgICAgKTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9hYzNfcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfYWMzX3BheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9hYzNfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9hYzNfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfYWMzX3BheV9mbHVzaCAoR3N0UnRwQUMzUGF5ICogcnRwYWMzcGF5KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfYWMzX3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworI2RlZmluZSBnc3RfcnRwX2FjM19wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwQUMzUGF5LCBnc3RfcnRwX2FjM19wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9hYzNfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEFDM1BheUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzICpnc3RydHBiYXNlcGF5bG9hZF9jbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwYWMzcGF5X2RlYnVnLCAicnRwYWMzcGF5IiwgMCwKKyAgICAgICJBQzMgQXVkaW8gUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9hYzNfcGF5X2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfYWMzX3BheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9hYzNfcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfYWMzX3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBBQzMgYXVkaW8gcGF5bG9hZGVyIiwgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZCBBQzMgYXVkaW8gYXMgUlRQIHBhY2tldHMgKFJGQyA0MTg0KSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2FjM19wYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNpbmtfZXZlbnQgPSBnc3RfcnRwX2FjM19wYXlfc2lua19ldmVudDsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX2FjM19wYXlfaGFuZGxlX2J1ZmZlcjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYWMzX3BheV9pbml0IChHc3RSdHBBQzNQYXkgKiBydHBhYzNwYXkpCit7CisgIHJ0cGFjM3BheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYWMzX3BheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwQUMzUGF5ICpydHBhYzNwYXk7CisKKyAgcnRwYWMzcGF5ID0gR1NUX1JUUF9BQzNfUEFZIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChydHBhYzNwYXktPmFkYXB0ZXIpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYWMzX3BheV9yZXNldCAoR3N0UnRwQUMzUGF5ICogcGF5KQoreworICBwYXktPmZpcnN0X3RzID0gLTE7CisgIHBheS0+ZHVyYXRpb24gPSAwOworICBnc3RfYWRhcHRlcl9jbGVhciAocGF5LT5hZGFwdGVyKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocGF5LCAicmVzZXQgZGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2FjM19wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBnaW50IHJhdGU7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJyYXRlIiwgJnJhdGUpKQorICAgIHJhdGUgPSA5MDAwMDsgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHBheWxvYWQsICJhdWRpbyIsIFRSVUUsICJBQzMiLCByYXRlKTsKKyAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsIE5VTEwpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9hYzNfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RSdHBBQzNQYXkgKnJ0cGFjM3BheTsKKworICBydHBhYzNwYXkgPSBHU1RfUlRQX0FDM19QQVkgKHBheWxvYWQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIC8qIG1ha2Ugc3VyZSB3ZSBwdXNoIHRoZSBsYXN0IHBhY2tldHMgaW4gdGhlIGFkYXB0ZXIgb24gRU9TICovCisgICAgICBnc3RfcnRwX2FjM19wYXlfZmx1c2ggKHJ0cGFjM3BheSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X3J0cF9hYzNfcGF5X3Jlc2V0IChydHBhYzNwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmVzID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKHBheWxvYWQsIGV2ZW50KTsKKworICByZXR1cm4gcmVzOworfQorCitzdHJ1Y3QgZnJtc2l6ZV9zCit7CisgIGd1aW50MTYgYml0X3JhdGU7CisgIGd1aW50MTYgZnJtX3NpemVbM107Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZybXNpemVfcyBmcm1zaXplY29kX3RibFtdID0geworICB7MzIsIHs2NCwgNjksIDk2fX0sCisgIHszMiwgezY0LCA3MCwgOTZ9fSwKKyAgezQwLCB7ODAsIDg3LCAxMjB9fSwKKyAgezQwLCB7ODAsIDg4LCAxMjB9fSwKKyAgezQ4LCB7OTYsIDEwNCwgMTQ0fX0sCisgIHs0OCwgezk2LCAxMDUsIDE0NH19LAorICB7NTYsIHsxMTIsIDEyMSwgMTY4fX0sCisgIHs1NiwgezExMiwgMTIyLCAxNjh9fSwKKyAgezY0LCB7MTI4LCAxMzksIDE5Mn19LAorICB7NjQsIHsxMjgsIDE0MCwgMTkyfX0sCisgIHs4MCwgezE2MCwgMTc0LCAyNDB9fSwKKyAgezgwLCB7MTYwLCAxNzUsIDI0MH19LAorICB7OTYsIHsxOTIsIDIwOCwgMjg4fX0sCisgIHs5NiwgezE5MiwgMjA5LCAyODh9fSwKKyAgezExMiwgezIyNCwgMjQzLCAzMzZ9fSwKKyAgezExMiwgezIyNCwgMjQ0LCAzMzZ9fSwKKyAgezEyOCwgezI1NiwgMjc4LCAzODR9fSwKKyAgezEyOCwgezI1NiwgMjc5LCAzODR9fSwKKyAgezE2MCwgezMyMCwgMzQ4LCA0ODB9fSwKKyAgezE2MCwgezMyMCwgMzQ5LCA0ODB9fSwKKyAgezE5MiwgezM4NCwgNDE3LCA1NzZ9fSwKKyAgezE5MiwgezM4NCwgNDE4LCA1NzZ9fSwKKyAgezIyNCwgezQ0OCwgNDg3LCA2NzJ9fSwKKyAgezIyNCwgezQ0OCwgNDg4LCA2NzJ9fSwKKyAgezI1NiwgezUxMiwgNTU3LCA3Njh9fSwKKyAgezI1NiwgezUxMiwgNTU4LCA3Njh9fSwKKyAgezMyMCwgezY0MCwgNjk2LCA5NjB9fSwKKyAgezMyMCwgezY0MCwgNjk3LCA5NjB9fSwKKyAgezM4NCwgezc2OCwgODM1LCAxMTUyfX0sCisgIHszODQsIHs3NjgsIDgzNiwgMTE1Mn19LAorICB7NDQ4LCB7ODk2LCA5NzUsIDEzNDR9fSwKKyAgezQ0OCwgezg5NiwgOTc2LCAxMzQ0fX0sCisgIHs1MTIsIHsxMDI0LCAxMTE0LCAxNTM2fX0sCisgIHs1MTIsIHsxMDI0LCAxMTE1LCAxNTM2fX0sCisgIHs1NzYsIHsxMTUyLCAxMjUzLCAxNzI4fX0sCisgIHs1NzYsIHsxMTUyLCAxMjU0LCAxNzI4fX0sCisgIHs2NDAsIHsxMjgwLCAxMzkzLCAxOTIwfX0sCisgIHs2NDAsIHsxMjgwLCAxMzk0LCAxOTIwfX0KK307CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2FjM19wYXlfZmx1c2ggKEdzdFJ0cEFDM1BheSAqIHJ0cGFjM3BheSkKK3sKKyAgZ3VpbnQgYXZhaWwsIEZULCBORiwgbXR1OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgLyogdGhlIGRhdGEgYXZhaWxhYmxlIGluIHRoZSBhZGFwdGVyIGlzIGVpdGhlciBzbWFsbGVyCisgICAqIHRoYW4gdGhlIE1UVSBvciBiaWdnZXIuIEluIHRoZSBjYXNlIGl0IGlzIHNtYWxsZXIsIHRoZSBjb21wbGV0ZQorICAgKiBhZGFwdGVyIGNvbnRlbnRzIGNhbiBiZSBwdXQgaW4gb25lIHBhY2tldC4gSW4gdGhlIGNhc2UgdGhlCisgICAqIGFkYXB0ZXIgaGFzIG1vcmUgdGhhbiBvbmUgTVRVLCB3ZSBuZWVkIHRvIHNwbGl0IHRoZSBBQzMgZGF0YQorICAgKiBvdmVyIG11bHRpcGxlIHBhY2tldHMuICovCisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBhYzNwYXktPmFkYXB0ZXIpOworCisgIHJldCA9IEdTVF9GTE9XX09LOworCisgIEZUID0gMDsKKyAgLyogbnVtYmVyIG9mIGZyYW1lcyAqLworICBORiA9IHJ0cGFjM3BheS0+TkY7CisKKyAgbXR1ID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChydHBhYzNwYXkpOworCisgIEdTVF9MT0dfT0JKRUNUIChydHBhYzNwYXksICJmbHVzaGluZyAldSBieXRlcyIsIGF2YWlsKTsKKworICB3aGlsZSAoYXZhaWwgPiAwKSB7CisgICAgZ3VpbnQgdG93cml0ZTsKKyAgICBndWludDggKnBheWxvYWQ7CisgICAgZ3VpbnQgcGF5bG9hZF9sZW47CisgICAgZ3VpbnQgcGFja2V0X2xlbjsKKyAgICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMLCB9OworICAgIEdzdEJ1ZmZlciAqcGF5bG9hZF9idWZmZXI7CisKKyAgICAvKiB0aGlzIHdpbGwgYmUgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgcGFja2V0ICovCisgICAgcGFja2V0X2xlbiA9IGdzdF9ydHBfYnVmZmVyX2NhbGNfcGFja2V0X2xlbiAoMiArIGF2YWlsLCAwLCAwKTsKKworICAgIC8qIGZpbGwgb25lIE1UVSBvciBhbGwgYXZhaWxhYmxlIGJ5dGVzICovCisgICAgdG93cml0ZSA9IE1JTiAocGFja2V0X2xlbiwgbXR1KTsKKworICAgIC8qIHRoaXMgaXMgdGhlIHBheWxvYWQgbGVuZ3RoICovCisgICAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BheWxvYWRfbGVuICh0b3dyaXRlLCAwLCAwKTsKKworICAgIC8qIGNyZWF0ZSBidWZmZXIgdG8gaG9sZCB0aGUgcGF5bG9hZCAqLworICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMiwgMCwgMCk7CisKKyAgICBpZiAoRlQgPT0gMCkgeworICAgICAgLyogY2hlY2sgaWYgaXQgYWxsIGZpdHMgKi8KKyAgICAgIGlmICh0b3dyaXRlIDwgcGFja2V0X2xlbikgeworICAgICAgICBndWludCBtYXhsZW47CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGFjM3BheSwgIndlIG5lZWQgdG8gZnJhZ21lbnQiKTsKKyAgICAgICAgLyogY2hlY2sgaWYgd2Ugd2lsbCBiZSBhYmxlIHRvIHB1dCBhdCBsZWFzdCA1Lzh0aCBvZiB0aGUgdG90YWwKKyAgICAgICAgICogZnJhbWUgaW4gdGhpcyBmaXJzdCBmcmFtZS4gKi8KKyAgICAgICAgaWYgKChhdmFpbCAqIDUpIC8gOCA+PSAocGF5bG9hZF9sZW4gLSAyKSkKKyAgICAgICAgICBGVCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBGVCA9IDI7CisgICAgICAgIC8qIGNoZWNrIGhvdyBtYW55IGZyYWdtZW50cyB3ZSB3aWxsIG5lZWQgKi8KKyAgICAgICAgbWF4bGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYXlsb2FkX2xlbiAobXR1IC0gMiwgMCwgMCk7CisgICAgICAgIE5GID0gKGF2YWlsICsgbWF4bGVuIC0gMSkgLyBtYXhsZW47CisgICAgICB9CisgICAgfSBlbHNlIGlmIChGVCAhPSAzKSB7CisgICAgICAvKiByZW1haW5pbmcgZnJhZ21lbnQgKi8KKyAgICAgIEZUID0gMzsKKyAgICB9CisKKyAgICAvKgorICAgICAqICAwICAgICAgICAgICAgICAgICAgIDEKKyAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNQorICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqIHwgICAgTUJaICAgIHwgRlR8ICAgICAgIE5GICAgICAgfAorICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqCisgICAgICogRlQ6IDA6IG9uZSBvciBtb3JlIGNvbXBsZXRlIGZyYW1lcworICAgICAqICAgICAxOiBpbml0aWFsIDUvOCBmcmFnbWVudAorICAgICAqICAgICAyOiBpbml0aWFsIGZyYWdtZW50IG5vdCA1LzgKKyAgICAgKiAgICAgMzogb3RoZXIgZnJhZ21lbnQKKyAgICAgKiBORjogYW1vdW50IG9mIGZyYW1lcyBpZiBGVCA9IDAsIGVsc2UgbnVtYmVyIG9mIGZyYWdtZW50cy4KKyAgICAgKi8KKyAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKG91dGJ1ZiwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGFjM3BheSwgIkZUICV1LCBORiAldSIsIEZULCBORik7CisgICAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKyAgICBwYXlsb2FkWzBdID0gKEZUICYgMyk7CisgICAgcGF5bG9hZFsxXSA9IE5GOworICAgIHBheWxvYWRfbGVuIC09IDI7CisKKyAgICBpZiAoYXZhaWwgPT0gcGF5bG9hZF9sZW4pCisgICAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBUUlVFKTsKKyAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgICBwYXlsb2FkX2J1ZmZlciA9CisgICAgICAgIGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyX2Zhc3QgKHJ0cGFjM3BheS0+YWRhcHRlciwgcGF5bG9hZF9sZW4pOworCisgICAgZ3N0X3J0cF9jb3B5X2F1ZGlvX21ldGEgKHJ0cGFjM3BheSwgb3V0YnVmLCBwYXlsb2FkX2J1ZmZlcik7CisKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAob3V0YnVmLCBwYXlsb2FkX2J1ZmZlcik7CisKKyAgICBhdmFpbCAtPSBwYXlsb2FkX2xlbjsKKworICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gcnRwYWMzcGF5LT5maXJzdF90czsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gcnRwYWMzcGF5LT5kdXJhdGlvbjsKKworICAgIHJldCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBhYzNwYXkpLCBvdXRidWYpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfYWMzX3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UnRwQUMzUGF5ICpydHBhYzNwYXk7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBnc2l6ZSBhdmFpbCwgbGVmdCwgTkY7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKnA7CisgIGd1aW50IHBhY2tldF9sZW47CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbiwgdGltZXN0YW1wOworCisgIHJ0cGFjM3BheSA9IEdTVF9SVFBfQUMzX1BBWSAoYmFzZXBheWxvYWQpOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGR1cmF0aW9uID0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKTsKKyAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcik7CisKKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAoYnVmZmVyKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGFjM3BheSwgIkRJU0NPTlQiKTsKKyAgICBnc3RfcnRwX2FjM19wYXlfcmVzZXQgKHJ0cGFjM3BheSk7CisgIH0KKworICAvKiBjb3VudCB0aGUgYW1vdW50IG9mIGluY29tbWluZyBwYWNrZXRzICovCisgIE5GID0gMDsKKyAgbGVmdCA9IG1hcC5zaXplOworICBwID0gbWFwLmRhdGE7CisgIHdoaWxlIChUUlVFKSB7CisgICAgZ3VpbnQgYnNpZCwgZnNjb2QsIGZybXNpemVjb2QsIGZyYW1lX3NpemU7CisKKyAgICBpZiAobGVmdCA8IDYpCisgICAgICBicmVhazsKKworICAgIGlmIChwWzBdICE9IDB4MGIgfHwgcFsxXSAhPSAweDc3KQorICAgICAgYnJlYWs7CisKKyAgICBic2lkID0gcFs1XSA+PiAzOworICAgIGlmIChic2lkID4gOCkKKyAgICAgIGJyZWFrOworCisgICAgZnJtc2l6ZWNvZCA9IHBbNF0gJiAweDNmOworICAgIGZzY29kID0gcFs0XSA+PiA2OworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwYWMzcGF5LCAiZnNjb2QgJXUsICV1IiwgZnNjb2QsIGZybXNpemVjb2QpOworCisgICAgaWYgKGZzY29kID49IDMgfHwgZnJtc2l6ZWNvZCA+PSAzOCkKKyAgICAgIGJyZWFrOworCisgICAgZnJhbWVfc2l6ZSA9IGZybXNpemVjb2RfdGJsW2ZybXNpemVjb2RdLmZybV9zaXplW2ZzY29kXSAqIDI7CisgICAgaWYgKGZyYW1lX3NpemUgPiBsZWZ0KQorICAgICAgYnJlYWs7CisKKyAgICBORisrOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGFjM3BheSwgImZvdW5kIGZyYW1lICUiIEdfR1NJWkVfRk9STUFUICIgb2Ygc2l6ZSAldSIsCisgICAgICAgIE5GLCBmcmFtZV9zaXplKTsKKworICAgIHAgKz0gZnJhbWVfc2l6ZTsKKyAgICBsZWZ0IC09IGZyYW1lX3NpemU7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgaWYgKE5GID09IDApCisgICAgZ290byBub19mcmFtZXM7CisKKyAgYXZhaWwgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cGFjM3BheS0+YWRhcHRlcik7CisKKyAgLyogZ2V0IHBhY2tldCBsZW5ndGggb2YgcHJldmlvdXMgZGF0YSBhbmQgdGhpcyBuZXcgZGF0YSwKKyAgICogcGF5bG9hZCBsZW5ndGggaW5jbHVkZXMgYSA0IGJ5dGUgaGVhZGVyICovCisgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKDIgKyBhdmFpbCArIG1hcC5zaXplLCAwLCAwKTsKKworICAvKiBpZiB0aGlzIGJ1ZmZlciBpcyBnb2luZyB0byBvdmVyZmxvdyB0aGUgcGFja2V0LCBmbHVzaCB3aGF0IHdlCisgICAqIGhhdmUuICovCisgIGlmIChnc3RfcnRwX2Jhc2VfcGF5bG9hZF9pc19maWxsZWQgKGJhc2VwYXlsb2FkLAorICAgICAgICAgIHBhY2tldF9sZW4sIHJ0cGFjM3BheS0+ZHVyYXRpb24gKyBkdXJhdGlvbikpIHsKKyAgICByZXQgPSBnc3RfcnRwX2FjM19wYXlfZmx1c2ggKHJ0cGFjM3BheSk7CisgICAgYXZhaWwgPSAwOworICB9IGVsc2UgeworICAgIHJldCA9IEdTVF9GTE9XX09LOworICB9CisKKyAgaWYgKGF2YWlsID09IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBhYzNwYXksCisgICAgICAgICJmaXJzdCBwYWNrZXQsIHNhdmUgdGltZXN0YW1wICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisgICAgcnRwYWMzcGF5LT5maXJzdF90cyA9IHRpbWVzdGFtcDsKKyAgICBydHBhYzNwYXktPmR1cmF0aW9uID0gMDsKKyAgICBydHBhYzNwYXktPk5GID0gMDsKKyAgfQorCisgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGFjM3BheS0+YWRhcHRlciwgYnVmZmVyKTsKKyAgcnRwYWMzcGF5LT5kdXJhdGlvbiArPSBkdXJhdGlvbjsKKyAgcnRwYWMzcGF5LT5ORiArPSBORjsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworbm9fZnJhbWVzOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChydHBhYzNwYXksICJubyB2YWxpZCBBQzMgZnJhbWVzIGZvdW5kIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9hYzNfcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cEFDM1BheSAqcnRwYWMzcGF5OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwYWMzcGF5ID0gR1NUX1JUUF9BQzNfUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X3J0cF9hYzNfcGF5X3Jlc2V0IChydHBhYzNwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfYWMzX3BheV9yZXNldCAocnRwYWMzcGF5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9hYzNfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwYWMzcGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX0FDM19QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBhYzNwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwYWMzcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzMWVhYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwYWMzcGF5LmgKQEAgLTAsMCArMSw2NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDEwPiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0FDM19QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9BQzNfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZXBheWxvYWQuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfQUMzX1BBWSBcCisgIChnc3RfcnRwX2FjM19wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9BQzNfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0FDM19QQVksR3N0UnRwQUMzUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9BQzNfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9BQzNfUEFZLEdzdFJ0cEFDM1BheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9BQzNfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0FDM19QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0FDM19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0FDM19QQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwQUMzUGF5IEdzdFJ0cEFDM1BheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBBQzNQYXlDbGFzcyBHc3RSdHBBQzNQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBBQzNQYXkKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWQgcGF5bG9hZDsKKworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBHc3RDbG9ja1RpbWUgZmlyc3RfdHM7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKKyAgZ3VpbnQgTkY7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cEFDM1BheUNsYXNzCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9hYzNfcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9hYzNfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0FDM19QQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E3Yzc5NwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwYW1yZGVwYXkuYwpAQCAtMCwwICsxLDQ3OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cGFtcmRlcGF5CisgKiBAc2VlX2Fsc286IHJ0cGFtcnBheQorICoKKyAqIEV4dHJhY3QgQU1SIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyAzMjY3LgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzI2Ny50eHQKKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdWRwc3JjIGNhcHM9J2FwcGxpY2F0aW9uL3gtcnRwLCBtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpODAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKUFNUiwgZW5jb2RpbmctcGFyYW1zPShzdHJpbmcpMSwgb2N0ZXQtYWxpZ249KHN0cmluZykxLCBwYXlsb2FkPShpbnQpOTYnICEgcnRwYW1yZGVwYXkgISBhbXJuYmRlYyAhIHB1bHNlc2luaworICogXXwgVGhpcyBleGFtcGxlIHBpcGVsaW5lIHdpbGwgZGVwYXlsb2FkIGFuZCBkZWNvZGUgYW4gUlRQIEFNUiBzdHJlYW0uIFJlZmVyIHRvCisgKiB0aGUgcnRwYW1ycGF5IGV4YW1wbGUgdG8gY3JlYXRlIHRoZSBSVFAgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisvKgorICogUkZDIDMyNjcgLSBSZWFsLVRpbWUgVHJhbnNwb3J0IFByb3RvY29sIChSVFApIFBheWxvYWQgRm9ybWF0IGFuZCBGaWxlCisgKiBTdG9yYWdlIEZvcm1hdCBmb3IgdGhlIEFkYXB0aXZlIE11bHRpLVJhdGUgKEFNUikgYW5kIEFkYXB0aXZlIE11bHRpLVJhdGUKKyAqIFdpZGViYW5kIChBTVItV0IpIEF1ZGlvIENvZGVjcy4KKyAqCisgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdzdHJ0cGFtcmRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwYW1yZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cGFtcmRlcGF5X2RlYnVnKQorCisvKiBSdHBBTVJEZXBheSBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgUFJPUF8wCit9OworCisvKiBpbnB1dCBpcyBhbiBSVFAgcGFja2V0CisgKgorICogcGFyYW1zIHNlZSBSRkMgMzI2Nywgc2VjdGlvbiA4LjEKKyAqLworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfYW1yX2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkFNUlwiLCAiCisgICAgICAgIC8qIFRoaXMgaXMgdGhlIGRlZmF1bHQsIHNvIHRoZSBwZWVyIGRvZXNuJ3QgaGF2ZSB0byBzcGVjaWZ5IGl0CisgICAgICAgICAqICJlbmNvZGluZy1wYXJhbXMgPSAoc3RyaW5nKSBcIjFcIiwgIiAqLworICAgICAgICAvKiBOT1RFIHRoYXQgYWxsIHZhbHVlcyBtdXN0IGJlIHN0cmluZ3MgaW4gb3JkZSB0byBiZSBhYmxlIHRvIGRvIFNEUCA8LT4KKyAgICAgICAgICogR3N0Q2FwcyBtYXBwaW5nLiAqLworICAgICAgICAib2N0ZXQtYWxpZ24gPSAoc3RyaW5nKSBcIjFcIjsiCisgICAgICAgIC8qIGZvbGxvd2luZyBvcHRpb25zIGFyZSBub3QgbmVlZGVkIGZvciBhIGRlY29kZXIKKyAgICAgICAgICoKKyAgICAgICAgICJjcmMgPSAoc3RyaW5nKSB7IFwiMFwiLCBcIjFcIiB9LCAiCisgICAgICAgICAicm9idXN0LXNvcnRpbmcgPSAoc3RyaW5nKSBcIjBcIiwgIgorICAgICAgICAgImludGVybGVhdmluZyA9IChzdHJpbmcpIFwiMFwiOyIKKyAgICAgICAgICJtb2RlLXNldCA9IChpbnQpIFsgMCwgNyBdLCAiCisgICAgICAgICAibW9kZS1jaGFuZ2UtcGVyaW9kID0gKGludCkgWyAxLCBNQVggXSwgIgorICAgICAgICAgIm1vZGUtY2hhbmdlLW5laWdoYm9yID0gKGJvb2xlYW4pIHsgVFJVRSwgRkFMU0UgfSwgIgorICAgICAgICAgIm1heHB0aW1lID0gKGludCkgWyAyMCwgTUFYIF0sICIKKyAgICAgICAgICJwdGltZSA9IChpbnQpIFsgMjAsIE1BWCBdIgorICAgICAgICAgKi8KKyAgICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDE2MDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJBTVItV0JcIiwgIgorICAgICAgICAvKiBUaGlzIGlzIHRoZSBkZWZhdWx0LCBzbyB0aGUgcGVlciBkb2Vzbid0IGhhdmUgdG8gc3BlY2lmeSBpdAorICAgICAgICAgKiAiZW5jb2RpbmctcGFyYW1zID0gKHN0cmluZykgXCIxXCIsICIgKi8KKyAgICAgICAgLyogTk9URSB0aGF0IGFsbCB2YWx1ZXMgbXVzdCBiZSBzdHJpbmdzIGluIG9yZGUgdG8gYmUgYWJsZSB0byBkbyBTRFAgPC0+CisgICAgICAgICAqIEdzdENhcHMgbWFwcGluZy4gKi8KKyAgICAgICAgIm9jdGV0LWFsaWduID0gKHN0cmluZykgXCIxXCI7IgorICAgICAgICAvKiBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgbm90IG5lZWRlZCBmb3IgYSBkZWNvZGVyCisgICAgICAgICAqCisgICAgICAgICAiY3JjID0gKHN0cmluZykgeyBcIjBcIiwgXCIxXCIgfSwgIgorICAgICAgICAgInJvYnVzdC1zb3J0aW5nID0gKHN0cmluZykgXCIwXCIsICIKKyAgICAgICAgICJpbnRlcmxlYXZpbmcgPSAoc3RyaW5nKSBcIjBcIiIKKyAgICAgICAgICJtb2RlLXNldCA9IChpbnQpIFsgMCwgNyBdLCAiCisgICAgICAgICAibW9kZS1jaGFuZ2UtcGVyaW9kID0gKGludCkgWyAxLCBNQVggXSwgIgorICAgICAgICAgIm1vZGUtY2hhbmdlLW5laWdoYm9yID0gKGJvb2xlYW4pIHsgVFJVRSwgRkFMU0UgfSwgIgorICAgICAgICAgIm1heHB0aW1lID0gKGludCkgWyAyMCwgTUFYIF0sICIKKyAgICAgICAgICJwdGltZSA9IChpbnQpIFsgMjAsIE1BWCBdIgorICAgICAgICAgKi8KKyAgICApCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfYW1yX2RlcGF5X3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL0FNUiwgIiAiY2hhbm5lbHMgPSAoaW50KSAxLCIgInJhdGUgPSAoaW50KSA4MDAwOyIKKyAgICAgICAgImF1ZGlvL0FNUi1XQiwgIiAiY2hhbm5lbHMgPSAoaW50KSAxLCIgInJhdGUgPSAoaW50KSAxNjAwMCIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfYW1yX2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9hbXJfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworCisjZGVmaW5lIGdzdF9ydHBfYW1yX2RlcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEFNUkRlcGF5LCBnc3RfcnRwX2Ftcl9kZXBheSwgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYW1yX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEFNUkRlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfYW1yX2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfYW1yX2RlcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIEFNUiBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgQU1SIG9yIEFNUi1XQiBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMzI2NykiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+cHJvY2Vzc19ydHBfcGFja2V0ID0gZ3N0X3J0cF9hbXJfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2Ftcl9kZXBheV9zZXRjYXBzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBhbXJkZXBheV9kZWJ1ZywgInJ0cGFtcmRlcGF5IiwgMCwKKyAgICAgICJBTVIvQU1SLVdCIFJUUCBEZXBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9hbXJfZGVwYXlfaW5pdCAoR3N0UnRwQU1SRGVwYXkgKiBydHBhbXJkZXBheSkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCAqZGVwYXlsb2FkOworCisgIGRlcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9ERVBBWUxPQUQgKHJ0cGFtcmRlcGF5KTsKKworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAoZGVwYXlsb2FkKSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9hbXJfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBHc3RDYXBzICpzcmNjYXBzOworICBHc3RSdHBBTVJEZXBheSAqcnRwYW1yZGVwYXk7CisgIGNvbnN0IGdjaGFyICpwYXJhbXM7CisgIGNvbnN0IGdjaGFyICpzdHIsICp0eXBlOworICBnaW50IGNsb2NrX3JhdGUsIG5lZWRfY2xvY2tfcmF0ZTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHJ0cGFtcmRlcGF5ID0gR1NUX1JUUF9BTVJfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgLyogZmlndXJlIG91dCB0aGUgbW9kZSBmaXJzdCBhbmQgc2V0IHRoZSBjbG9jayByYXRlcyAqLworICBpZiAoKHN0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZW5jb2RpbmctbmFtZSIpKSkgeworICAgIGlmIChzdHJjbXAgKHN0ciwgIkFNUiIpID09IDApIHsKKyAgICAgIHJ0cGFtcmRlcGF5LT5tb2RlID0gR1NUX1JUUF9BTVJfRFBfTU9ERV9OQjsKKyAgICAgIG5lZWRfY2xvY2tfcmF0ZSA9IDgwMDA7CisgICAgICB0eXBlID0gImF1ZGlvL0FNUiI7CisgICAgfSBlbHNlIGlmIChzdHJjbXAgKHN0ciwgIkFNUi1XQiIpID09IDApIHsKKyAgICAgIHJ0cGFtcmRlcGF5LT5tb2RlID0gR1NUX1JUUF9BTVJfRFBfTU9ERV9XQjsKKyAgICAgIG5lZWRfY2xvY2tfcmF0ZSA9IDE2MDAwOworICAgICAgdHlwZSA9ICJhdWRpby9BTVItV0IiOworICAgIH0gZWxzZQorICAgICAgZ290byBpbnZhbGlkX21vZGU7CisgIH0gZWxzZQorICAgIGdvdG8gaW52YWxpZF9tb2RlOworCisgIGlmICghKHN0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAib2N0ZXQtYWxpZ24iKSkpCisgICAgcnRwYW1yZGVwYXktPm9jdGV0X2FsaWduID0gRkFMU0U7CisgIGVsc2UKKyAgICBydHBhbXJkZXBheS0+b2N0ZXRfYWxpZ24gPSAoYXRvaSAoc3RyKSA9PSAxKTsKKworICBpZiAoIShzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImNyYyIpKSkKKyAgICBydHBhbXJkZXBheS0+Y3JjID0gRkFMU0U7CisgIGVsc2UKKyAgICBydHBhbXJkZXBheS0+Y3JjID0gKGF0b2kgKHN0cikgPT0gMSk7CisKKyAgaWYgKHJ0cGFtcmRlcGF5LT5jcmMpIHsKKyAgICAvKiBjcmMgbW9kZSBpbXBsaWVzIG9jdGV0IGFsaWduZWQgbW9kZSAqLworICAgIHJ0cGFtcmRlcGF5LT5vY3RldF9hbGlnbiA9IFRSVUU7CisgIH0KKworICBpZiAoIShzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgInJvYnVzdC1zb3J0aW5nIikpKQorICAgIHJ0cGFtcmRlcGF5LT5yb2J1c3Rfc29ydGluZyA9IEZBTFNFOworICBlbHNlCisgICAgcnRwYW1yZGVwYXktPnJvYnVzdF9zb3J0aW5nID0gKGF0b2kgKHN0cikgPT0gMSk7CisKKyAgaWYgKHJ0cGFtcmRlcGF5LT5yb2J1c3Rfc29ydGluZykgeworICAgIC8qIHJvYnVzdF9zb3J0aW5nIG1vZGUgaW1wbGllcyBvY3RldCBhbGlnbmVkIG1vZGUgKi8KKyAgICBydHBhbXJkZXBheS0+b2N0ZXRfYWxpZ24gPSBUUlVFOworICB9CisKKyAgaWYgKCEoc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJpbnRlcmxlYXZpbmciKSkpCisgICAgcnRwYW1yZGVwYXktPmludGVybGVhdmluZyA9IEZBTFNFOworICBlbHNlCisgICAgcnRwYW1yZGVwYXktPmludGVybGVhdmluZyA9IChhdG9pIChzdHIpID09IDEpOworCisgIGlmIChydHBhbXJkZXBheS0+aW50ZXJsZWF2aW5nKSB7CisgICAgLyogaW50ZXJsZWF2aW5nIG1vZGUgaW1wbGllcyBvY3RldCBhbGlnbmVkIG1vZGUgKi8KKyAgICBydHBhbXJkZXBheS0+b2N0ZXRfYWxpZ24gPSBUUlVFOworICB9CisKKyAgaWYgKCEocGFyYW1zID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJlbmNvZGluZy1wYXJhbXMiKSkpCisgICAgcnRwYW1yZGVwYXktPmNoYW5uZWxzID0gMTsKKyAgZWxzZSB7CisgICAgcnRwYW1yZGVwYXktPmNoYW5uZWxzID0gYXRvaSAocGFyYW1zKTsKKyAgfQorCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSBuZWVkX2Nsb2NrX3JhdGU7CisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgLyogd2UgcmVxdWlyZSAxIGNoYW5uZWwsIDgwMDAgSHosIG9jdGV0IGFsaWduZWQsIG5vIENSQywKKyAgICogbm8gcm9idXN0IHNvcnRpbmcsIG5vIGludGVybGVhdmluZyBmb3Igbm93ICovCisgIGlmIChydHBhbXJkZXBheS0+Y2hhbm5lbHMgIT0gMSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChjbG9ja19yYXRlICE9IG5lZWRfY2xvY2tfcmF0ZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChydHBhbXJkZXBheS0+b2N0ZXRfYWxpZ24gIT0gVFJVRSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChydHBhbXJkZXBheS0+cm9idXN0X3NvcnRpbmcgIT0gRkFMU0UpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAocnRwYW1yZGVwYXktPmludGVybGVhdmluZyAhPSBGQUxTRSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKHR5cGUsCisgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBydHBhbXJkZXBheS0+Y2hhbm5lbHMsCisgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIGNsb2NrX3JhdGUsIE5VTEwpOworICByZXMgPSBnc3RfcGFkX3NldF9jYXBzIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAoZGVwYXlsb2FkKSwgc3JjY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworaW52YWxpZF9tb2RlOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwYW1yZGVwYXksICJpbnZhbGlkIGVuY29kaW5nLW5hbWUiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogLTEgaXMgaW52YWxpZCAqLworc3RhdGljIGNvbnN0IGdpbnQgbmJfZnJhbWVfc2l6ZVsxNl0gPSB7CisgIDEyLCAxMywgMTUsIDE3LCAxOSwgMjAsIDI2LCAzMSwKKyAgNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgd2JfZnJhbWVfc2l6ZVsxNl0gPSB7CisgIDE3LCAyMywgMzIsIDM2LCA0MCwgNDYsIDUwLCA1OCwKKyAgNjAsIDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMAorfTsKKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX2Ftcl9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cEFNUkRlcGF5ICpydHBhbXJkZXBheTsKKyAgY29uc3QgZ2ludCAqZnJhbWVfc2l6ZTsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBnaW50IHBheWxvYWRfbGVuOworICBHc3RNYXBJbmZvIG1hcDsKKworICBydHBhbXJkZXBheSA9IEdTVF9SVFBfQU1SX0RFUEFZIChkZXBheWxvYWQpOworCisgIC8qIHNldHVwIGZyYW1lIHNpemUgcG9pbnRlciAqLworICBpZiAocnRwYW1yZGVwYXktPm1vZGUgPT0gR1NUX1JUUF9BTVJfRFBfTU9ERV9OQikKKyAgICBmcmFtZV9zaXplID0gbmJfZnJhbWVfc2l6ZTsKKyAgZWxzZQorICAgIGZyYW1lX3NpemUgPSB3Yl9mcmFtZV9zaXplOworCisgIC8qIHdoZW4gd2UgZ2V0IGhlcmUsIDEgY2hhbm5lbCwgODAwMC8xNjAwMCBIeiwgb2N0ZXQgYWxpZ25lZCwgbm8gQ1JDLAorICAgKiBubyByb2J1c3Qgc29ydGluZywgbm8gaW50ZXJsZWF2aW5nIGRhdGEgaXMgdG8gYmUgZGVwYXlsb2FkZWQgKi8KKyAgeworICAgIGd1aW50OCAqcGF5bG9hZCwgKnAsICpkcDsKKyAgICBnaW50IGksIG51bV9wYWNrZXRzLCBudW1fbm9uZW1wdHlfcGFja2V0czsKKyAgICBnaW50IGFtcl9sZW47CisgICAgZ2ludCBJTEwsIElMUDsKKworICAgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgICAgLyogbmVlZCBhdCBsZWFzdCAyIGJ5dGVzIGZvciB0aGUgaGVhZGVyICovCisgICAgaWYgKHBheWxvYWRfbGVuIDwgMikKKyAgICAgIGdvdG8gdG9vX3NtYWxsOworCisgICAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkIChydHApOworCisgICAgLyogZGVwYXkgQ01SLiBUaGUgQ01SIGlzIHVzZWQgYnkgdGhlIHNlbmRlciB0byByZXF1ZXN0CisgICAgICogYSBuZXcgZW5jb2RpbmcgbW9kZS4KKyAgICAgKgorICAgICAqICAwIDEgMiAzIDQgNSA2IDcKKyAgICAgKiArLSstKy0rLSstKy0rLSstKworICAgICAqIHwgQ01SICAgfFJ8UnxSfFJ8CisgICAgICogKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKi8KKyAgICAvKiBDTVIgPSAocGF5bG9hZFswXSAmIDB4ZjApID4+IDQ7ICovCisKKyAgICAvKiBzdHJpcCBDTVIgaGVhZGVyIG5vdywgcGFjayBGVCBhbmQgdGhlIGRhdGEgZm9yIHRoZSBkZWNvZGVyICovCisgICAgcGF5bG9hZF9sZW4gLT0gMTsKKyAgICBwYXlsb2FkICs9IDE7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBhbXJkZXBheSwgInBheWxvYWQgbGVuICVkIiwgcGF5bG9hZF9sZW4pOworCisgICAgaWYgKHJ0cGFtcmRlcGF5LT5pbnRlcmxlYXZpbmcpIHsKKyAgICAgIElMTCA9IChwYXlsb2FkWzBdICYgMHhmMCkgPj4gNDsKKyAgICAgIElMUCA9IChwYXlsb2FkWzBdICYgMHgwZik7CisKKyAgICAgIHBheWxvYWRfbGVuIC09IDE7CisgICAgICBwYXlsb2FkICs9IDE7CisKKyAgICAgIGlmIChJTFAgPiBJTEwpCisgICAgICAgIGdvdG8gd3JvbmdfaW50ZXJsZWF2aW5nOworICAgIH0KKworICAgIC8qCisgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNgorICAgICAqICstKy0rLSstKy0rLSstKy0rLi4KKyAgICAgKiB8RnwgIEZUICAgfFF8UHxQfCBtb3JlIEZULi4KKyAgICAgKiArLSstKy0rLSstKy0rLSstKy4uCisgICAgICovCisgICAgLyogY291bnQgbnVtYmVyIG9mIHBhY2tldHMgYnkgY291bnRpbmcgdGhlIEZUcy4gQWxzbworICAgICAqIGNvdW50IG51bWJlciBvZiBhbXIgZGF0YSBieXRlcyBhbmQgbnVtYmVyIG9mIG5vbi1lbXB0eQorICAgICAqIHBhY2tldHMgKHRoaXMgaXMgYWxzbyB0aGUgbnVtYmVyIG9mIENSQ3MgaWYgcHJlc2VudCkuICovCisgICAgYW1yX2xlbiA9IDA7CisgICAgbnVtX25vbmVtcHR5X3BhY2tldHMgPSAwOworICAgIG51bV9wYWNrZXRzID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGF5bG9hZF9sZW47IGkrKykgeworICAgICAgZ2ludCBmcl9zaXplOworICAgICAgZ3VpbnQ4IEZUOworCisgICAgICBGVCA9IChwYXlsb2FkW2ldICYgMHg3OCkgPj4gMzsKKworICAgICAgZnJfc2l6ZSA9IGZyYW1lX3NpemVbRlRdOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwYW1yZGVwYXksICJmcmFtZSBzaXplICVkIiwgZnJfc2l6ZSk7CisgICAgICBpZiAoZnJfc2l6ZSA9PSAtMSkKKyAgICAgICAgZ290byB3cm9uZ19mcmFtZXNpemU7CisKKyAgICAgIGlmIChmcl9zaXplID4gMCkgeworICAgICAgICBhbXJfbGVuICs9IGZyX3NpemU7CisgICAgICAgIG51bV9ub25lbXB0eV9wYWNrZXRzKys7CisgICAgICB9CisgICAgICBudW1fcGFja2V0cysrOworCisgICAgICBpZiAoKHBheWxvYWRbaV0gJiAweDgwKSA9PSAwKQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocnRwYW1yZGVwYXktPmNyYykgeworICAgICAgLyogZGF0YSBsZW4gKyBDUkMgbGVuICsgaGVhZGVyIGJ5dGVzIHNob3VsZCBiZSBzbWFsbGVyIHRoYW4gcGF5bG9hZF9sZW4gKi8KKyAgICAgIGlmIChudW1fcGFja2V0cyArIG51bV9ub25lbXB0eV9wYWNrZXRzICsgYW1yX2xlbiA+IHBheWxvYWRfbGVuKQorICAgICAgICBnb3RvIHdyb25nX2xlbmd0aF8xOworICAgIH0gZWxzZSB7CisgICAgICAvKiBkYXRhIGxlbiArIGhlYWRlciBieXRlcyBzaG91bGQgYmUgc21hbGxlciB0aGFuIHBheWxvYWRfbGVuICovCisgICAgICBpZiAobnVtX3BhY2tldHMgKyBhbXJfbGVuID4gcGF5bG9hZF9sZW4pCisgICAgICAgIGdvdG8gd3JvbmdfbGVuZ3RoXzI7CisgICAgfQorCisgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChwYXlsb2FkX2xlbik7CisKKyAgICAvKiBwb2ludCB0byBkZXN0aW5hdGlvbiAqLworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworCisgICAgLyogcG9pbnQgdG8gZmlyc3QgZGF0YSBwYWNrZXQgKi8KKyAgICBwID0gbWFwLmRhdGE7CisgICAgZHAgPSBwYXlsb2FkICsgbnVtX3BhY2tldHM7CisgICAgaWYgKHJ0cGFtcmRlcGF5LT5jcmMpIHsKKyAgICAgIC8qIHNraXAgQ1JDIGlmIHByZXNlbnQgKi8KKyAgICAgIGRwICs9IG51bV9ub25lbXB0eV9wYWNrZXRzOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFja2V0czsgaSsrKSB7CisgICAgICBnaW50IGZyX3NpemU7CisKKyAgICAgIC8qIGNvcHkgRlQsIGNsZWFyIEYgYml0ICovCisgICAgICAqcCsrID0gcGF5bG9hZFtpXSAmIDB4N2Y7CisKKyAgICAgIGZyX3NpemUgPSBmcmFtZV9zaXplWyhwYXlsb2FkW2ldICYgMHg3OCkgPj4gM107CisgICAgICBpZiAoZnJfc2l6ZSA+IDApIHsKKyAgICAgICAgLyogY29weSBkYXRhIHBhY2tldCwgRklYTUUsIGNhbGMgQ1JDIGhlcmUuICovCisgICAgICAgIG1lbWNweSAocCwgZHAsIGZyX3NpemUpOworCisgICAgICAgIHAgKz0gZnJfc2l6ZTsKKyAgICAgICAgZHAgKz0gZnJfc2l6ZTsKKyAgICAgIH0KKyAgICB9CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgIC8qIHdlIGNhbiBzZXQgdGhlIGR1cmF0aW9uIGJlY2F1c2UgZWFjaCBwYWNrZXQgaXMgMjAgbWlsbGlzZWNvbmRzICovCisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9IG51bV9wYWNrZXRzICogMjAgKiBHU1RfTVNFQ09ORDsKKworICAgIGlmIChnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApKSB7CisgICAgICAvKiBtYXJrZXIgYml0IG1hcmtzIGEgYnVmZmVyIGFmdGVyIGEgdGFsa3NwdXJ0LiAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAibWFya2VyIGJpdCB3YXMgc2V0Iik7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19SRVNZTkMpOworICAgIH0KKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgInB1c2hpbmcgYnVmZmVyIG9mIHNpemUgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZikpOworCisgICAgZ3N0X3J0cF9jb3B5X2F1ZGlvX21ldGEgKHJ0cGFtcmRlcGF5LCBvdXRidWYsIHJ0cC0+YnVmZmVyKTsKKyAgfQorCisgIHJldHVybiBvdXRidWY7CisKKyAgLyogRVJST1JTICovCit0b29fc21hbGw6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBhbXJkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJBTVIgUlRQIHBheWxvYWQgdG9vIHNtYWxsICglZCkiLCBwYXlsb2FkX2xlbikpOworICAgIGdvdG8gYmFkX3BhY2tldDsKKyAgfQord3JvbmdfaW50ZXJsZWF2aW5nOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwYW1yZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiQU1SIFJUUCB3cm9uZyBpbnRlcmxlYXZpbmciKSk7CisgICAgZ290byBiYWRfcGFja2V0OworICB9Cit3cm9uZ19mcmFtZXNpemU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBhbXJkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJBTVIgUlRQIGZyYW1lIHNpemUgPT0gLTEiKSk7CisgICAgZ290byBiYWRfcGFja2V0OworICB9Cit3cm9uZ19sZW5ndGhfMToKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cGFtcmRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkFNUiBSVFAgd3JvbmcgbGVuZ3RoIDEiKSk7CisgICAgZ290byBiYWRfcGFja2V0OworICB9Cit3cm9uZ19sZW5ndGhfMjoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cGFtcmRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkFNUiBSVFAgd3JvbmcgbGVuZ3RoIDIiKSk7CisgICAgZ290byBiYWRfcGFja2V0OworICB9CitiYWRfcGFja2V0OgorICB7CisgICAgLyogbm8gZmF0YWwgZXJyb3IgKi8KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF9hbXJfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBhbXJkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9BTVJfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBhbXJkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiODA2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGFtcmRlcGF5LmgKQEAgLTAsMCArMSw3NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0FNUl9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0FNUl9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9BTVJfREVQQVkgXAorICAoZ3N0X3J0cF9hbXJfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9BTVJfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfQU1SX0RFUEFZLEdzdFJ0cEFNUkRlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9BTVJfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0FNUl9ERVBBWSxHc3RSdHBBTVJEZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9BTVJfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfQU1SX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9BTVJfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0FNUl9ERVBBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBBTVJEZXBheSBHc3RSdHBBTVJEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBBTVJEZXBheUNsYXNzIEdzdFJ0cEFNUkRlcGF5Q2xhc3M7CisKK3R5cGVkZWYgZW51bSB7CisgIEdTVF9SVFBfQU1SX0RQX01PREVfSU5WQUxJRCA9IDAsCisgIEdTVF9SVFBfQU1SX0RQX01PREVfTkIgICAgICA9IDEsCisgIEdTVF9SVFBfQU1SX0RQX01PREVfV0IgICAgICA9IDIKK30gR3N0UnRwQU1SRGVwYXlNb2RlOworCitzdHJ1Y3QgX0dzdFJ0cEFNUkRlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCisgIEdzdFJ0cEFNUkRlcGF5TW9kZSBtb2RlOworCisgIGdib29sZWFuIG9jdGV0X2FsaWduOworICBndWludDggICBtb2RlX3NldDsKKyAgZ2ludCAgICAgbW9kZV9jaGFuZ2VfcGVyaW9kOworICBnYm9vbGVhbiBtb2RlX2NoYW5nZV9uZWlnaGJvcjsKKyAgZ2ludCAgICAgbWF4cHRpbWU7CisgIGdib29sZWFuIGNyYzsKKyAgZ2Jvb2xlYW4gcm9idXN0X3NvcnRpbmc7CisgIGdib29sZWFuIGludGVybGVhdmluZzsKKyAgZ2ludCAgICAgcHRpbWU7CisgIGdpbnQgICAgIGNoYW5uZWxzOworfTsKKworc3RydWN0IF9Hc3RSdHBBTVJEZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX2Ftcl9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfYW1yX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0FNUl9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwYW1ycGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGFtcnBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNzBmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGFtcnBheS5jCkBAIC0wLDAgKzEsNDYzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwYW1ycGF5CisgKiBAc2VlX2Fsc286IHJ0cGFtcmRlcGF5CisgKgorICogUGF5bG9hZCBBTVIgYXVkaW8gaW50byBSVFAgcGFja2V0cyBhY2NvcmRpbmcgdG8gUkZDIDMyNjcuCisgKiBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gc2VlOiBodHRwOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmMzMjY3LnR4dAorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBhdWRpb3Rlc3RzcmMgISBhbXJuYmVuYyAhIHJ0cGFtcnBheSAhIHVkcHNpbmsKKyAqIF18IFRoaXMgZXhhbXBsZSBwaXBlbGluZSB3aWxsIGVuY29kZSBhbmQgcGF5bG9hZCBhbiBBTVIgc3RyZWFtLiBSZWZlciB0bworICogdGhlIHJ0cGFtcmRlcGF5IGV4YW1wbGUgdG8gZGVwYXlsb2FkIGFuZCBkZWNvZGUgdGhlIFJUUCBzdHJlYW0uCisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qIHJlZmVyZW5jZXM6CisgKgorICogUkZDIDMyNjcgLSBSZWFsLVRpbWUgVHJhbnNwb3J0IFByb3RvY29sIChSVFApIFBheWxvYWQgRm9ybWF0IGFuZCBGaWxlCisgKiAgICBTdG9yYWdlIEZvcm1hdCBmb3IgdGhlIEFkYXB0aXZlIE11bHRpLVJhdGUgKEFNUikgYW5kIEFkYXB0aXZlCisgKiAgICBNdWx0aS1SYXRlIFdpZGViYW5kIChBTVItV0IpIEF1ZGlvIENvZGVjcy4KKyAqCisgKiBFVFNJIFRTIDEyNiAyMDEgVjYuMC4wICgyMDA0LTEyKSAtIERpZ2l0YWwgY2VsbHVsYXIgdGVsZWNvbW11bmljYXRpb25zIHN5c3RlbSAoUGhhc2UgMispOworICogICAgICAgICAgICAgICAgIFVuaXZlcnNhbCBNb2JpbGUgVGVsZWNvbW11bmljYXRpb25zIFN5c3RlbSAoVU1UUyk7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQU1SIHNwZWVjaCBjb2RlYywgd2lkZWJhbmQ7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lIHN0cnVjdHVyZQorICogICAgICAgICAgICAgICAgICAgICgzR1BQIFRTIDI2LjIwMSB2ZXJzaW9uIDYuMC4wIFJlbGVhc2UgNikKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgImdzdHJ0cGFtcnBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cGFtcnBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwYW1ycGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9hbXJfcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL0FNUiwgY2hhbm5lbHM9KGludCkxLCByYXRlPShpbnQpODAwMDsgIgorICAgICAgICAiYXVkaW8vQU1SLVdCLCBjaGFubmVscz0oaW50KTEsIHJhdGU9KGludCkxNjAwMCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfYW1yX3BheV9zcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiQU1SXCIsICIKKyAgICAgICAgImVuY29kaW5nLXBhcmFtcyA9IChzdHJpbmcpIFwiMVwiLCAiCisgICAgICAgICJvY3RldC1hbGlnbiA9IChzdHJpbmcpIFwiMVwiLCAiCisgICAgICAgICJjcmMgPSAoc3RyaW5nKSBcIjBcIiwgIgorICAgICAgICAicm9idXN0LXNvcnRpbmcgPSAoc3RyaW5nKSBcIjBcIiwgIgorICAgICAgICAiaW50ZXJsZWF2aW5nID0gKHN0cmluZykgXCIwXCIsICIKKyAgICAgICAgIm1vZGUtc2V0ID0gKGludCkgWyAwLCA3IF0sICIKKyAgICAgICAgIm1vZGUtY2hhbmdlLXBlcmlvZCA9IChpbnQpIFsgMSwgTUFYIF0sICIKKyAgICAgICAgIm1vZGUtY2hhbmdlLW5laWdoYm9yID0gKHN0cmluZykgeyBcIjBcIiwgXCIxXCIgfSwgIgorICAgICAgICAibWF4cHRpbWUgPSAoaW50KSBbIDIwLCBNQVggXSwgIiAicHRpbWUgPSAoaW50KSBbIDIwLCBNQVggXTsiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgMTYwMDAsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkFNUi1XQlwiLCAiCisgICAgICAgICJlbmNvZGluZy1wYXJhbXMgPSAoc3RyaW5nKSBcIjFcIiwgIgorICAgICAgICAib2N0ZXQtYWxpZ24gPSAoc3RyaW5nKSBcIjFcIiwgIgorICAgICAgICAiY3JjID0gKHN0cmluZykgXCIwXCIsICIKKyAgICAgICAgInJvYnVzdC1zb3J0aW5nID0gKHN0cmluZykgXCIwXCIsICIKKyAgICAgICAgImludGVybGVhdmluZyA9IChzdHJpbmcpIFwiMFwiLCAiCisgICAgICAgICJtb2RlLXNldCA9IChpbnQpIFsgMCwgNyBdLCAiCisgICAgICAgICJtb2RlLWNoYW5nZS1wZXJpb2QgPSAoaW50KSBbIDEsIE1BWCBdLCAiCisgICAgICAgICJtb2RlLWNoYW5nZS1uZWlnaGJvciA9IChzdHJpbmcpIHsgXCIwXCIsIFwiMVwiIH0sICIKKyAgICAgICAgIm1heHB0aW1lID0gKGludCkgWyAyMCwgTUFYIF0sICIgInB0aW1lID0gKGludCkgWyAyMCwgTUFYIF0iKQorICAgICk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2Ftcl9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX2Ftcl9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2Ftcl9wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKKyNkZWZpbmUgZ3N0X3J0cF9hbXJfcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEFNUlBheSwgZ3N0X3J0cF9hbXJfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYW1yX3BheV9jbGFzc19pbml0IChHc3RSdHBBTVJQYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfYW1yX3BheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9hbXJfcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfYW1yX3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUlRQIEFNUiBwYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZC1lbmNvZGUgQU1SIG9yIEFNUi1XQiBhdWRpbyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgMzI2NykiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9hbXJfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9hbXJfcGF5X2hhbmRsZV9idWZmZXI7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGFtcnBheV9kZWJ1ZywgInJ0cGFtcnBheSIsIDAsCisgICAgICAiQU1SL0FNUi1XQiBSVFAgUGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Ftcl9wYXlfaW5pdCAoR3N0UnRwQU1SUGF5ICogcnRwYW1ycGF5KQoreworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9hbXJfcGF5X3Jlc2V0IChHc3RSdHBBTVJQYXkgKiBwYXkpCit7CisgIHBheS0+bmV4dF9ydHBfdGltZSA9IDA7CisgIHBheS0+Zmlyc3RfdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBwYXktPmZpcnN0X3J0cF90aW1lID0gMDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2Ftcl9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFJ0cEFNUlBheSAqcnRwYW1ycGF5OworICBnYm9vbGVhbiByZXM7CisgIGNvbnN0IEdzdFN0cnVjdHVyZSAqczsKKyAgY29uc3QgZ2NoYXIgKnN0cjsKKworICBydHBhbXJwYXkgPSBHU1RfUlRQX0FNUl9QQVkgKGJhc2VwYXlsb2FkKTsKKworICAvKiBmaWd1cmUgb3V0IHRoZSBtb2RlIE5hcnJvdyBvciBXaWRlYmFuZCAqLworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGlmICgoc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocykpKSB7CisgICAgaWYgKHN0cmNtcCAoc3RyLCAiYXVkaW8vQU1SIikgPT0gMCkKKyAgICAgIHJ0cGFtcnBheS0+bW9kZSA9IEdTVF9SVFBfQU1SX1BfTU9ERV9OQjsKKyAgICBlbHNlIGlmIChzdHJjbXAgKHN0ciwgImF1ZGlvL0FNUi1XQiIpID09IDApCisgICAgICBydHBhbXJwYXktPm1vZGUgPSBHU1RfUlRQX0FNUl9QX01PREVfV0I7CisgICAgZWxzZQorICAgICAgZ290byB3cm9uZ190eXBlOworICB9IGVsc2UKKyAgICBnb3RvIHdyb25nX3R5cGU7CisKKyAgaWYgKHJ0cGFtcnBheS0+bW9kZSA9PSBHU1RfUlRQX0FNUl9QX01PREVfTkIpCisgICAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKGJhc2VwYXlsb2FkLCAiYXVkaW8iLCBUUlVFLCAiQU1SIiwgODAwMCk7CisgIGVsc2UKKyAgICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAoYmFzZXBheWxvYWQsICJhdWRpbyIsIFRSVUUsICJBTVItV0IiLAorICAgICAgICAxNjAwMCk7CisKKyAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLAorICAgICAgImVuY29kaW5nLXBhcmFtcyIsIEdfVFlQRV9TVFJJTkcsICIxIiwgIm9jdGV0LWFsaWduIiwgR19UWVBFX1NUUklORywgIjEiLAorICAgICAgLyogZG9uJ3Qgc2V0IHRoZSBkZWZhdWx0cworICAgICAgICoKKyAgICAgICAqICJjcmMiLCBHX1RZUEVfU1RSSU5HLCAiMCIsCisgICAgICAgKiAicm9idXN0LXNvcnRpbmciLCBHX1RZUEVfU1RSSU5HLCAiMCIsCisgICAgICAgKiAiaW50ZXJsZWF2aW5nIiwgR19UWVBFX1NUUklORywgIjAiLAorICAgICAgICovCisgICAgICBOVUxMKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLword3JvbmdfdHlwZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGFtcnBheSwgInVuc3VwcG9ydGVkIG1lZGlhIHR5cGUgJyVzJyIsCisgICAgICAgIEdTVF9TVFJfTlVMTCAoc3RyKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Ftcl9wYXlfcmVjYWxjX3J0cF90aW1lIChHc3RSdHBBTVJQYXkgKiBydHBhbXJwYXksCisgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCkKK3sKKyAgLyogcmUtc3luYyBydHAgdGltZSAqLworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHJ0cGFtcnBheS0+Zmlyc3RfdHMpICYmCisgICAgICBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAodGltZXN0YW1wKSAmJiB0aW1lc3RhbXAgPj0gcnRwYW1ycGF5LT5maXJzdF90cykgeworICAgIEdzdENsb2NrVGltZSBkaWZmOworICAgIGd1aW50MzIgcnRwZGlmZjsKKworICAgIC8qIGludGVycG9sYXRlIHRvIHJlcHJvZHVjZSBnYXAgZnJvbSBzdGFydCwgcmF0aGVyIHRoYW4gaW50ZXJtZWRpYXRlCisgICAgICogaW50ZXJ2YWxzIHRvIGF2b2lkIHJvdW5kdXAgYWNjdW11bGF0aW9uIGVycm9ycyAqLworICAgIGRpZmYgPSB0aW1lc3RhbXAgLSBydHBhbXJwYXktPmZpcnN0X3RzOworICAgIHJ0cGRpZmYgPSAoKGRpZmYgLyBHU1RfTVNFQ09ORCkgKiA4KSA8PAorICAgICAgICAocnRwYW1ycGF5LT5tb2RlID09IEdTVF9SVFBfQU1SX1BfTU9ERV9XQik7CisgICAgcnRwYW1ycGF5LT5uZXh0X3J0cF90aW1lID0gcnRwYW1ycGF5LT5maXJzdF9ydHBfdGltZSArIHJ0cGRpZmY7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwYW1ycGF5LAorICAgICAgICAiZWxhcHNlZCB0aW1lICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBydHAgJSIgR19HVUlOVDMyX0ZPUk1BVCAiLCAiCisgICAgICAgICJuZXcgb2Zmc2V0ICUiIEdfR1VJTlQzMl9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGRpZmYpLCBydHBkaWZmLAorICAgICAgICBydHBhbXJwYXktPm5leHRfcnRwX3RpbWUpOworICB9Cit9CisKKy8qIC0xIGlzIGludmFsaWQgKi8KK3N0YXRpYyBjb25zdCBnaW50IG5iX2ZyYW1lX3NpemVbMTZdID0geworICAxMiwgMTMsIDE1LCAxNywgMTksIDIwLCAyNiwgMzEsCisgIDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAKK307CisKK3N0YXRpYyBjb25zdCBnaW50IHdiX2ZyYW1lX3NpemVbMTZdID0geworICAxNywgMjMsIDMyLCAzNiwgNDAsIDQ2LCA1MCwgNTgsCisgIDYwLCA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAKK307CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2Ftcl9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJ0cEFNUlBheSAqcnRwYW1ycGF5OworICBjb25zdCBnaW50ICpmcmFtZV9zaXplOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ3VpbnQgcGF5bG9hZF9sZW47CisgIEdzdE1hcEluZm8gbWFwOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ3VpbnQ4ICpwYXlsb2FkLCAqcHRyLCAqcGF5bG9hZF9hbXI7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIGR1cmF0aW9uOworICBndWludCBwYWNrZXRfbGVuLCBtdHU7CisgIGdpbnQgaSwgbnVtX3BhY2tldHMsIG51bV9ub25lbXB0eV9wYWNrZXRzOworICBnaW50IGFtcl9sZW47CisgIGdib29sZWFuIHNpZCA9IEZBTFNFOworICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisKKyAgcnRwYW1ycGF5ID0gR1NUX1JUUF9BTVJfUEFZIChiYXNlcGF5bG9hZCk7CisgIG10dSA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX01UVSAocnRwYW1ycGF5KTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisKKyAgLyogc2V0dXAgZnJhbWUgc2l6ZSBwb2ludGVyICovCisgIGlmIChydHBhbXJwYXktPm1vZGUgPT0gR1NUX1JUUF9BTVJfUF9NT0RFX05CKQorICAgIGZyYW1lX3NpemUgPSBuYl9mcmFtZV9zaXplOworICBlbHNlCisgICAgZnJhbWVfc2l6ZSA9IHdiX2ZyYW1lX3NpemU7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXBheWxvYWQsICJnb3QgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyIsIG1hcC5zaXplKTsKKworICAvKiBGSVhNRSwgb25seQorICAgKiBvY3RldCBhbGlnbmVkLCBubyBpbnRlcmxlYXZpbmcsIHNpbmdsZSBjaGFubmVsLCBubyBDUkMsCisgICAqIG5vIHJvYnVzdC1zb3J0aW5nLiBUbyBmaXggdGhpcyB5b3UgbmVlZCB0byBpbXBsZW1lbnQgdGhlIGRvd25zdHJlYW0KKyAgICogbmVnb3RpYXRpb24gZnVuY3Rpb24uICovCisKKyAgLyogZmlyc3QgY291bnQgbnVtYmVyIG9mIHBhY2tldHMgYW5kIHRvdGFsIGFtciBmcmFtZSBzaXplICovCisgIGFtcl9sZW4gPSBudW1fcGFja2V0cyA9IG51bV9ub25lbXB0eV9wYWNrZXRzID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IG1hcC5zaXplOyBpKyspIHsKKyAgICBndWludDggRlQ7CisgICAgZ2ludCBmcl9zaXplOworCisgICAgRlQgPSAobWFwLmRhdGFbaV0gJiAweDc4KSA+PiAzOworCisgICAgZnJfc2l6ZSA9IGZyYW1lX3NpemVbRlRdOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLCAiZnJhbWUgdHlwZSAlZCwgZnJhbWUgc2l6ZSAlZCIsIEZULCBmcl9zaXplKTsKKyAgICAvKiBGSVhNRSwgd2UgZG9uJ3QgaGFuZGxlIHRoaXMgeWV0Li4gKi8KKyAgICBpZiAoZnJfc2l6ZSA8PSAwKQorICAgICAgZ290byB3cm9uZ19zaXplOworCisgICAgaWYgKGZyX3NpemUgPT0gNSkKKyAgICAgIHNpZCA9IFRSVUU7CisKKyAgICBhbXJfbGVuICs9IGZyX3NpemU7CisgICAgbnVtX25vbmVtcHR5X3BhY2tldHMrKzsKKyAgICBudW1fcGFja2V0cysrOworICAgIGkgKz0gZnJfc2l6ZTsKKyAgfQorICBpZiAoYW1yX2xlbiA+IG1hcC5zaXplKQorICAgIGdvdG8gaW5jb21wbGV0ZV9mcmFtZTsKKworICAvKiB3ZSBuZWVkIG9uZSBleHRyYSBieXRlIGZvciB0aGUgQ01SLCB0aGUgVG9DIGlzIGluIHRoZSBpbnB1dAorICAgKiBkYXRhICovCisgIHBheWxvYWRfbGVuID0gbWFwLnNpemUgKyAxOworCisgIC8qIGdldCBwYWNrZXQgbGVuIHRvIGNoZWNrIGFnYWluc3QgTVRVICovCisgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKHBheWxvYWRfbGVuLCAwLCAwKTsKKyAgaWYgKHBhY2tldF9sZW4gPiBtdHUpCisgICAgZ290byB0b29fYmlnOworCisgIC8qIG5vdyBhbGxvYyBvdXRwdXQgYnVmZmVyICovCisgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAocGF5bG9hZF9sZW4sIDAsIDApOworCisgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0YnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKworICAvKiBjb3B5IHRpbWVzdGFtcCAqLworICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA9IHRpbWVzdGFtcDsKKworICBpZiAoZHVyYXRpb24gIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gZHVyYXRpb247CisgIGVsc2UgeworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPSBudW1fcGFja2V0cyAqIDIwICogR1NUX01TRUNPTkQ7CisgIH0KKworICBpZiAoR1NUX0JVRkZFUl9JU19ESVNDT05UIChidWZmZXIpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXBheWxvYWQsICJkaXNjb250LCBzZXR0aW5nIG1hcmtlciBiaXQiKTsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBUUlVFKTsKKyAgICBnc3RfcnRwX2Ftcl9wYXlfcmVjYWxjX3J0cF90aW1lIChydHBhbXJwYXksIHRpbWVzdGFtcCk7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoc2lkKSkgeworICAgIGdzdF9ydHBfYW1yX3BheV9yZWNhbGNfcnRwX3RpbWUgKHJ0cGFtcnBheSwgdGltZXN0YW1wKTsKKyAgfQorCisgIC8qIHBlcmZlY3QgcnRwdGltZSAqLworICBpZiAoR19VTkxJS0VMWSAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChydHBhbXJwYXktPmZpcnN0X3RzKSkpIHsKKyAgICBydHBhbXJwYXktPmZpcnN0X3RzID0gdGltZXN0YW1wOworICAgIHJ0cGFtcnBheS0+Zmlyc3RfcnRwX3RpbWUgPSBydHBhbXJwYXktPm5leHRfcnRwX3RpbWU7CisgIH0KKyAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBydHBhbXJwYXktPm5leHRfcnRwX3RpbWU7CisgIHJ0cGFtcnBheS0+bmV4dF9ydHBfdGltZSArPQorICAgICAgKG51bV9wYWNrZXRzICogMTYwKSA8PCAocnRwYW1ycGF5LT5tb2RlID09IEdTVF9SVFBfQU1SX1BfTU9ERV9XQik7CisKKyAgLyogZ2V0IHBheWxvYWQsIHRoaXMgaXMgbm93IHdyaXRhYmxlICovCisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisKKyAgLyogICAwIDEgMiAzIDQgNSA2IDcKKyAgICogICstKy0rLSstKy0rLSstKy0rCisgICAqICB8ICBDTVIgIHxSfFJ8UnxSfAorICAgKiAgKy0rLSstKy0rLSstKy0rLSsKKyAgICovCisgIHBheWxvYWRbMF0gPSAweEYwOyAgICAgICAgICAgIC8qIENNUiwgbm8gc3BlY2lmaWMgbW9kZSByZXF1ZXN0ZWQgKi8KKworICAvKiB0aGlzIGlzIHdoZXJlIHdlIGNvcHkgdGhlIEFNUiBkYXRhLCBhZnRlciBudW1fcGFja2V0cyBGVHMgYW5kIHRoZQorICAgKiBDTVIuICovCisgIHBheWxvYWRfYW1yID0gcGF5bG9hZCArIG51bV9wYWNrZXRzICsgMTsKKworICAvKiBjb3B5IGRhdGEgaW4gcGF5bG9hZCwgZmlyc3Qgd2UgY29weSBhbGwgdGhlIEZUcyB0aGVuIGFsbAorICAgKiB0aGUgQU1SIGRhdGEuIFRoZSBsYXN0IEZUIGhhcyB0byBoYXZlIHRoZSBGIGZsYWcgY2xlYXJlZC4gKi8KKyAgcHRyID0gbWFwLmRhdGE7CisgIGZvciAoaSA9IDE7IGkgPD0gbnVtX3BhY2tldHM7IGkrKykgeworICAgIGd1aW50OCBGVDsKKyAgICBnaW50IGZyX3NpemU7CisKKyAgICAvKiAgIDAgMSAyIDMgNCA1IDYgNworICAgICAqICArLSstKy0rLSstKy0rLSstKworICAgICAqICB8RnwgIEZUICAgfFF8UHxQfCBtb3JlIEZULi4uCisgICAgICogICstKy0rLSstKy0rLSstKy0rCisgICAgICovCisgICAgRlQgPSAoKnB0ciAmIDB4NzgpID4+IDM7CisKKyAgICBmcl9zaXplID0gZnJhbWVfc2l6ZVtGVF07CisKKyAgICBpZiAoaSA9PSBudW1fcGFja2V0cykKKyAgICAgIC8qIGxhc3QgcGFja2V0LCBjbGVhciBGIGZsYWcgKi8KKyAgICAgIHBheWxvYWRbaV0gPSAqcHRyICYgMHg3ZjsKKyAgICBlbHNlCisgICAgICAvKiBzZXQgRiBmbGFnICovCisgICAgICBwYXlsb2FkW2ldID0gKnB0ciB8IDB4ODA7CisKKyAgICBtZW1jcHkgKHBheWxvYWRfYW1yLCAmcHRyWzFdLCBmcl9zaXplKTsKKworICAgIC8qIGFsbCBzaXplcyBhcmUgPiAwIHNpbmNlIHdlIGNoZWNrZWQgZm9yIHRoYXQgYWJvdmUgKi8KKyAgICBwdHIgKz0gZnJfc2l6ZSArIDE7CisgICAgcGF5bG9hZF9hbXIgKz0gZnJfc2l6ZTsKKyAgfQorCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICBnc3RfcnRwX2NvcHlfYXVkaW9fbWV0YSAocnRwYW1ycGF5LCBvdXRidWYsIGJ1ZmZlcik7CisKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoIChiYXNlcGF5bG9hZCwgb3V0YnVmKTsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLword3Jvbmdfc2l6ZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChiYXNlcGF5bG9hZCwgU1RSRUFNLCBGT1JNQVQsCisgICAgICAgIChOVUxMKSwgKCJyZWNlaXZlZCBBTVIgZnJhbWUgd2l0aCBzaXplIDw9IDAiKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CitpbmNvbXBsZXRlX2ZyYW1lOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGJhc2VwYXlsb2FkLCBTVFJFQU0sIEZPUk1BVCwKKyAgICAgICAgKE5VTEwpLCAoInJlY2VpdmVkIGluY29tcGxldGUgQU1SIGZyYW1lcyIpKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3Rvb19iaWc6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYmFzZXBheWxvYWQsIFNUUkVBTSwgRk9STUFULAorICAgICAgICAoTlVMTCksICgicmVjZWl2ZWQgdG9vIG1hbnkgQU1SIGZyYW1lcyBmb3IgTVRVIikpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfYW1yX3BheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1M7CisKKyAgLyogaGFuZGxlIHVwd2FyZHMgc3RhdGUgY2hhbmdlcyBoZXJlICovCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIC8qIGhhbmRsZSBkb3dud2FyZHMgc3RhdGUgY2hhbmdlcyAqLworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3J0cF9hbXJfcGF5X3Jlc2V0IChHU1RfUlRQX0FNUl9QQVkgKGVsZW1lbnQpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2Ftcl9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBhbXJwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfQU1SX1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGFtcnBheS5oIGIvZ3N0L3J0cC9nc3RydHBhbXJwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2RmMWNlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBhbXJwYXkuaApAQCAtMCwwICsxLDcwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfQU1SX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0FNUl9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9BTVJfUEFZIFwKKyAgKGdzdF9ydHBfYW1yX3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0FNUl9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfQU1SX1BBWSxHc3RSdHBBTVJQYXkpKQorI2RlZmluZSBHU1RfUlRQX0FNUl9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0FNUl9QQVksR3N0UnRwQU1SUGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0FNUl9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfQU1SX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfQU1SX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfQU1SX1BBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBBTVJQYXkgR3N0UnRwQU1SUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEFNUlBheUNsYXNzIEdzdFJ0cEFNUlBheUNsYXNzOworCit0eXBlZGVmIGVudW0geworICBHU1RfUlRQX0FNUl9QX01PREVfSU5WQUxJRCA9IDAsCisgIEdTVF9SVFBfQU1SX1BfTU9ERV9OQiAgICAgID0gMSwKKyAgR1NUX1JUUF9BTVJfUF9NT0RFX1dCICAgICAgPSAyCit9IEdzdFJ0cEFNUlBheU1vZGU7CisKK3N0cnVjdCBfR3N0UnRwQU1SUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisKKyAgR3N0UnRwQU1SUGF5TW9kZSBtb2RlOworICBHc3RDbG9ja1RpbWUgZmlyc3RfdHM7CisgIGd1aW50MzIgZmlyc3RfcnRwX3RpbWU7CisgIGd1aW50MzIgbmV4dF9ydHBfdGltZTsKK307CisKK3N0cnVjdCBfR3N0UnRwQU1SUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX2Ftcl9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2Ftcl9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfQU1SX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwYnZkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBidmRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmYWY4MwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwYnZkZXBheS5jCkBAIC0wLDAgKzEsMTkwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwYnZkZXBheQorICogQHNlZV9hbHNvOiBydHBidnBheQorICoKKyAqIEV4dHJhY3QgQnJvYWRjb21Wb2ljZSBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIGFjY29yZGluZyB0byBSRkMgNDI5OC4KKyAqIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBzZWU6IGh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzQyOTgudHh0CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSAiZ3N0cnRwYnZkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2J2X2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkJWMTZcIjsgIgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgMTYwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkJWMzJcIiIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfYnZfZGVwYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWJ2LCAiICJtb2RlID0gKGludCkgeyAxNiwgMzIgfSIpCisgICAgKTsKKworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9idl9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9idl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworI2RlZmluZSBnc3RfcnRwX2J2X2RlcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJUUEJWRGVwYXksIGdzdF9ydHBfYnZfZGVwYXksIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2J2X2RlcGF5X2NsYXNzX2luaXQgKEdzdFJUUEJWRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9idl9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2J2X2RlcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIEJyb2FkY29tVm9pY2UgZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIEJyb2FkY29tVm9pY2UgYXVkaW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDQyOTgpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY29sbGFib3JhLmNvLnVrPiIpOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfYnZfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2J2X2RlcGF5X3NldGNhcHM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2J2X2RlcGF5X2luaXQgKEdzdFJUUEJWRGVwYXkgKiBydHBidmRlcGF5KQoreworICBydHBidmRlcGF5LT5tb2RlID0gLTE7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9idl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UlRQQlZEZXBheSAqcnRwYnZkZXBheSA9IEdTVF9SVFBfQlZfREVQQVkgKGRlcGF5bG9hZCk7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBnY2hhciAqbW9kZV9zdHIgPSBOVUxMOworICBnaW50IG1vZGUsIGNsb2NrX3JhdGUsIGV4cGVjdGVkX3JhdGU7CisgIGdib29sZWFuIHJldDsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBtb2RlX3N0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZW5jb2RpbmctbmFtZSIpOworICBpZiAoIW1vZGVfc3RyKQorICAgIGdvdG8gbm9fbW9kZTsKKworICBpZiAoIXN0cmNtcCAobW9kZV9zdHIsICJCVjE2IikpIHsKKyAgICBtb2RlID0gMTY7CisgICAgZXhwZWN0ZWRfcmF0ZSA9IDgwMDA7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAobW9kZV9zdHIsICJCVjMyIikpIHsKKyAgICBtb2RlID0gMzI7CisgICAgZXhwZWN0ZWRfcmF0ZSA9IDE2MDAwOworICB9IGVsc2UKKyAgICBnb3RvIGludmFsaWRfbW9kZTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBjbG9ja19yYXRlID0gZXhwZWN0ZWRfcmF0ZTsKKyAgZWxzZSBpZiAoY2xvY2tfcmF0ZSAhPSBleHBlY3RlZF9yYXRlKQorICAgIGdvdG8gd3JvbmdfcmF0ZTsKKworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworICBydHBidmRlcGF5LT5tb2RlID0gbW9kZTsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtYnYiLAorICAgICAgIm1vZGUiLCBHX1RZUEVfSU5ULCBydHBidmRlcGF5LT5tb2RlLCBOVUxMKTsKKyAgcmV0ID0gZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKGRlcGF5bG9hZCksIHNyY2NhcHMpOworCisgIEdTVF9ERUJVRyAoInNldCBjYXBzIG9uIHNvdXJjZTogJSIgR1NUX1BUUl9GT1JNQVQgIiAocmV0PSVkKSIsIHNyY2NhcHMsIHJldCk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworbm9fbW9kZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGJ2ZGVwYXksICJkaWQgbm90IHJlY2VpdmUgYW4gZW5jb2RpbmctbmFtZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQoraW52YWxpZF9tb2RlOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwYnZkZXBheSwKKyAgICAgICAgImludmFsaWQgZW5jb2RpbmctbmFtZSwgZXhwZWN0ZWQgQlYxNiBvciBCVjMyLCBnb3QgJXMiLCBtb2RlX3N0cik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ19yYXRlOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwYnZkZXBheSwgImludmFsaWQgY2xvY2stcmF0ZSwgZXhwZWN0ZWQgJWQsIGdvdCAlZCIsCisgICAgICAgIGV4cGVjdGVkX3JhdGUsIGNsb2NrX3JhdGUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfYnZfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ2Jvb2xlYW4gbWFya2VyOworCisgIG1hcmtlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgR1NUX0RFQlVHICgicHJvY2VzcyA6IGdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzLCBtYXJrICVkIHRzICV1IHNlcW4gJWQiLAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAocnRwLT5idWZmZXIpLCBtYXJrZXIsCisgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wIChydHApLCBnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxIChydHApKTsKKworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9idWZmZXIgKHJ0cCk7CisKKyAgaWYgKG1hcmtlciAmJiBvdXRidWYpIHsKKyAgICAvKiBtYXJrIHN0YXJ0IG9mIHRhbGtzcHVydCB3aXRoIFJFU1lOQyAqLworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1JFU1lOQyk7CisgIH0KKworICBpZiAob3V0YnVmKSB7CisgICAgZ3N0X3J0cF9kcm9wX25vbl9hdWRpb19tZXRhIChkZXBheWxvYWQsIG91dGJ1Zik7CisgIH0KKworICByZXR1cm4gb3V0YnVmOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9idl9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGJ2ZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfQlZfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBidmRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cGJ2ZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTMwNjgyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBidmRlcGF5LmgKQEAgLTAsMCArMSw2MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0JWX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfQlZfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUEJWRGVwYXkgR3N0UlRQQlZEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBCVkRlcGF5Q2xhc3MgR3N0UlRQQlZEZXBheUNsYXNzOworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9CVl9ERVBBWSBcCisgIChnc3RfcnRwX2J2X2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfQlZfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfQlZfREVQQVksR3N0UlRQQlZEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfQlZfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0JWX0RFUEFZLEdzdFJUUEJWRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfQlZfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfQlZfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0JWX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9CVl9ERVBBWSkpCisKK3N0cnVjdCBfR3N0UlRQQlZEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKKworICBnaW50IG1vZGU7Cit9OworCitzdHJ1Y3QgX0dzdFJUUEJWRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9idl9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfYnZfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfQlZfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGJ2cGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGJ2cGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwMjAxNQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwYnZwYXkuYwpAQCAtMCwwICsxLDIzOSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cGJ2cGF5CisgKiBAc2VlX2Fsc286IHJ0cGJ2ZGVwYXkKKyAqCisgKiBQYXlsb2FkIEJyb2FkY29tVm9pY2UgYXVkaW8gaW50byBSVFAgcGFja2V0cyBhY2NvcmRpbmcgdG8gUkZDIDQyOTguCisgKiBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gc2VlOiBodHRwOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM0Mjk4LnR4dAorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgImdzdHJ0cGJ2cGF5LmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cGJ2cGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBidnBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfYnZfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1idiwgIiAibW9kZSA9IChpbnQpIHsxNiwgMzJ9IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9idl9wYXlfc3JjX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkJWMTZcIjsiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgMTYwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkJWMzJcIiIpCisgICAgKTsKKworCitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3J0cF9idl9wYXlfc2lua19nZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0UGFkICogcGFkLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2J2X3BheV9zaW5rX3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CisKKyNkZWZpbmUgZ3N0X3J0cF9idl9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UlRQQlZQYXksIGdzdF9ydHBfYnZfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9BVURJT19QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYnZfcGF5X2NsYXNzX2luaXQgKEdzdFJUUEJWUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzICpnc3RydHBiYXNlcGF5bG9hZF9jbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwYnZwYXlfZGVidWcsICJydHBidnBheSIsIDAsCisgICAgICAiQnJvYWRjb21Wb2ljZSBhdWRpbyBSVFAgcGF5bG9hZGVyIik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9idl9wYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfYnZfcGF5X3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlJUUCBCViBQYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGFja2V0aXplIEJyb2FkY29tVm9pY2UgYXVkaW8gc3RyZWFtcyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgNDI5OCkiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0Bjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9idl9wYXlfc2lua19zZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+Z2V0X2NhcHMgPSBnc3RfcnRwX2J2X3BheV9zaW5rX2dldGNhcHM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2J2X3BheV9pbml0IChHc3RSVFBCVlBheSAqIHJ0cGJ2cGF5KQoreworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkICpydHBiYXNlYXVkaW9wYXlsb2FkOworCisgIHJ0cGJhc2VhdWRpb3BheWxvYWQgPSBHU1RfUlRQX0JBU0VfQVVESU9fUEFZTE9BRCAocnRwYnZwYXkpOworCisgIHJ0cGJ2cGF5LT5tb2RlID0gLTE7CisKKyAgLyogdGVsbCBydHBiYXNlYXVkaW9wYXlsb2FkIHRoYXQgdGhpcyBpcyBhIGZyYW1lIGJhc2VkIGNvZGVjICovCisgIGdzdF9ydHBfYmFzZV9hdWRpb19wYXlsb2FkX3NldF9mcmFtZV9iYXNlZCAocnRwYmFzZWF1ZGlvcGF5bG9hZCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9idl9wYXlfc2lua19zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHJ0cGJhc2VwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UlRQQlZQYXkgKnJ0cGJ2cGF5OworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkICpydHBiYXNlYXVkaW9wYXlsb2FkOworICBnaW50IG1vZGU7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBjaGFyICpwYXlsb2FkX25hbWU7CisKKyAgcnRwYnZwYXkgPSBHU1RfUlRQX0JWX1BBWSAocnRwYmFzZXBheWxvYWQpOworICBydHBiYXNlYXVkaW9wYXlsb2FkID0gR1NUX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQgKHJ0cGJhc2VwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBwYXlsb2FkX25hbWUgPSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzdHJ1Y3R1cmUpOworICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wICgiYXVkaW8veC1idiIsIHBheWxvYWRfbmFtZSkpCisgICAgZ290byB3cm9uZ19jYXBzOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJtb2RlIiwgJm1vZGUpKQorICAgIGdvdG8gbm9fbW9kZTsKKworICBpZiAobW9kZSAhPSAxNiAmJiBtb2RlICE9IDMyKQorICAgIGdvdG8gd3JvbmdfbW9kZTsKKworICBpZiAobW9kZSA9PSAxNikgeworICAgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChydHBiYXNlcGF5bG9hZCwgImF1ZGlvIiwgVFJVRSwgIkJWMTYiLAorICAgICAgICA4MDAwKTsKKyAgICBydHBiYXNlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IDgwMDA7CisgIH0gZWxzZSB7CisgICAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHJ0cGJhc2VwYXlsb2FkLCAiYXVkaW8iLCBUUlVFLCAiQlYzMiIsCisgICAgICAgIDE2MDAwKTsKKyAgICBydHBiYXNlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IDE2MDAwOworICB9CisKKyAgLyogc2V0IG9wdGlvbnMgZm9yIHRoaXMgZnJhbWUgYmFzZWQgYXVkaW8gY29kZWMgKi8KKyAgZ3N0X3J0cF9iYXNlX2F1ZGlvX3BheWxvYWRfc2V0X2ZyYW1lX29wdGlvbnMgKHJ0cGJhc2VhdWRpb3BheWxvYWQsCisgICAgICBtb2RlLCBtb2RlID09IDE2ID8gMTAgOiAyMCk7CisKKyAgaWYgKG1vZGUgIT0gcnRwYnZwYXktPm1vZGUgJiYgcnRwYnZwYXktPm1vZGUgIT0gLTEpCisgICAgZ290byBtb2RlX2NoYW5nZWQ7CisKKyAgcnRwYnZwYXktPm1vZGUgPSBtb2RlOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLword3JvbmdfY2FwczoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGJ2cGF5LCAiZXhwZWN0ZWQgYXVkaW8veC1idiwgcmVjZWl2ZWQgJXMiLAorICAgICAgICBwYXlsb2FkX25hbWUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fbW9kZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGJ2cGF5LCAiZGlkIG5vdCByZWNlaXZlIGEgbW9kZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQord3JvbmdfbW9kZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGJ2cGF5LCAibW9kZSBtdXN0IGJlIDE2IG9yIDMyLCByZWNlaXZlZCAlZCIsIG1vZGUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbW9kZV9jaGFuZ2VkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwYnZwYXksICJNb2RlIGhhcyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQhICIKKyAgICAgICAgIk1vZGUgY2Fubm90IGNoYW5nZSB3aGlsZSBzdHJlYW1pbmciLCBydHBidnBheS0+bW9kZSwgbW9kZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIHdlIHJldHVybiB0aGUgcGFkdGVtcGxhdGUgY2FwcyB3aXRoIHRoZSBtb2RlIGZpZWxkIGZpeGF0ZWQgdG8gYSB2YWx1ZSBpZiB3ZQorICogY2FuICovCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfcnRwX2J2X3BheV9zaW5rX2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcnRwcGF5bG9hZCwgR3N0UGFkICogcGFkLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKm90aGVycGFkY2FwczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisKKyAgb3RoZXJwYWRjYXBzID0gZ3N0X3BhZF9nZXRfYWxsb3dlZF9jYXBzIChydHBwYXlsb2FkLT5zcmNwYWQpOworICBpZiAob3RoZXJwYWRjYXBzKSB7CisgICAgaWYgKCFnc3RfY2Fwc19pc19lbXB0eSAob3RoZXJwYWRjYXBzKSkgeworICAgICAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgICAgICBjb25zdCBnY2hhciAqbW9kZV9zdHI7CisgICAgICBnaW50IG1vZGU7CisKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKG90aGVycGFkY2FwcywgMCk7CisKKyAgICAgIC8qIGNvbnN0cnVjdCBtb2RlLCBpZiB3ZSBjYW4gKi8KKyAgICAgIG1vZGVfc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJlbmNvZGluZy1uYW1lIik7CisgICAgICBpZiAobW9kZV9zdHIpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAgKG1vZGVfc3RyLCAiQlYxNiIpKQorICAgICAgICAgIG1vZGUgPSAxNjsKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCAobW9kZV9zdHIsICJCVjMyIikpCisgICAgICAgICAgbW9kZSA9IDMyOworICAgICAgICBlbHNlCisgICAgICAgICAgbW9kZSA9IC0xOworCisgICAgICAgIGlmIChtb2RlID09IDE2IHx8IG1vZGUgPT0gMzIpIHsKKyAgICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoY2Fwcyk7CisgICAgICAgICAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cnVjdHVyZSwgIm1vZGUiLCBHX1RZUEVfSU5ULCBtb2RlLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBnc3RfY2Fwc191bnJlZiAob3RoZXJwYWRjYXBzKTsKKyAgfQorCisgIGlmIChmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICp0bXA7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBwYXlsb2FkLCAiSW50ZXJzZWN0ICUiIEdTVF9QVFJfRk9STUFUICIgYW5kIGZpbHRlciAlIgorICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgY2FwcywgZmlsdGVyKTsKKyAgICB0bXAgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCBjYXBzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICBjYXBzID0gdG1wOworICB9CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2J2X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGJ2cGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX0JWX1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGJ2cGF5LmggYi9nc3QvcnRwL2dzdHJ0cGJ2cGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3NjZjYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwYnZwYXkuaApAQCAtMCwwICsxLDYwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfQlZfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfQlZfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWF1ZGlvcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0JWX1BBWSBcCisgIChnc3RfcnRwX2J2X3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0JWX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9CVl9QQVksR3N0UlRQQlZQYXkpKQorI2RlZmluZSBHU1RfUlRQX0JWX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfQlZfUEFZLEdzdFJUUEJWUGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0JWX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9CVl9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0JWX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfQlZfUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUEJWUGF5IEdzdFJUUEJWUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUEJWUGF5Q2xhc3MgR3N0UlRQQlZQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSVFBCVlBheQoreworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkIGF1ZGlvcGF5bG9hZDsKKworICBnaW50IG1vZGU7Cit9OworCitzdHJ1Y3QgX0dzdFJUUEJWUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfYnZfcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9idl9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfQlZfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBjZWx0ZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdjMTdmMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RydHBjZWx0ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBjZWx0ZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cGNlbHRkZXBheV9kZWJ1ZykKKworLyogUnRwQ0VMVERlcGF5IHNpZ25hbHMgYW5kIGFyZ3MgKi8KKworI2RlZmluZSBERUZBVUxUX0ZSQU1FU0laRSAgICAgICA0ODAKKyNkZWZpbmUgREVGQVVMVF9DSEFOTkVMUyAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX0NMT0NLUkFURSAgICAgICAzMjAwMAorCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgUFJPUF8wCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9jZWx0X2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gIChpbnQpIFszMjAwMCwgNDgwMDBdLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJDRUxUXCIiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2NlbHRfZGVwYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWNlbHQiKQorICAgICk7CisKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfY2VsdF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9jZWx0X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworCisjZGVmaW5lIGdzdF9ydHBfY2VsdF9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBDRUxURGVwYXksIGdzdF9ydHBfY2VsdF9kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9jZWx0X2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cENFTFREZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBjZWx0ZGVwYXlfZGVidWcsICJydHBjZWx0ZGVwYXkiLCAwLAorICAgICAgIkNFTFQgUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfY2VsdF9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2NlbHRfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgQ0VMVCBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgQ0VMVCBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfY2VsdF9kZXBheV9wcm9jZXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfY2VsdF9kZXBheV9zZXRjYXBzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9jZWx0X2RlcGF5X2luaXQgKEdzdFJ0cENFTFREZXBheSAqIHJ0cGNlbHRkZXBheSkKK3sKK30KKworLyogbGVuIDQgYnl0ZXMgTEUsCisgKiB2ZW5kb3Igc3RyaW5nIChsZW4gYnl0ZXMpLAorICogdXNlcl9sZW4gNCAoMCkgYnl0ZXMgTEUKKyAqLworc3RhdGljIGNvbnN0IGdjaGFyIGdzdF9ydHBfY2VsdF9jb21tZW50W10gPQorICAgICJcMDQ1XDBcMFwwRGVwYXlsb2FkZWQgd2l0aCBHU3RyZWFtZXIgY2VsdGRlcGF5XDBcMFwwXDAiOworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfY2VsdF9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdFJ0cENFTFREZXBheSAqcnRwY2VsdGRlcGF5OworICBnaW50IGNsb2NrX3JhdGUsIG5iX2NoYW5uZWxzID0gMCwgZnJhbWVfc2l6ZSA9IDA7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4ICpwdHI7CisgIGNvbnN0IGdjaGFyICpwYXJhbXM7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIGdib29sZWFuIHJlczsKKworICBydHBjZWx0ZGVwYXkgPSBHU1RfUlRQX0NFTFRfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgZ290byBub19jbG9ja3JhdGU7CisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgaWYgKChwYXJhbXMgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImVuY29kaW5nLXBhcmFtcyIpKSkKKyAgICBuYl9jaGFubmVscyA9IGF0b2kgKHBhcmFtcyk7CisgIGlmICghbmJfY2hhbm5lbHMpCisgICAgbmJfY2hhbm5lbHMgPSBERUZBVUxUX0NIQU5ORUxTOworCisgIGlmICgocGFyYW1zID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJmcmFtZS1zaXplIikpKQorICAgIGZyYW1lX3NpemUgPSBhdG9pIChwYXJhbXMpOworICBpZiAoIWZyYW1lX3NpemUpCisgICAgZnJhbWVfc2l6ZSA9IERFRkFVTFRfRlJBTUVTSVpFOworICBydHBjZWx0ZGVwYXktPmZyYW1lX3NpemUgPSBmcmFtZV9zaXplOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgImNsb2NrLXJhdGU9JWQgY2hhbm5lbHM9JWQgZnJhbWUtc2l6ZT0lZCIsCisgICAgICBjbG9ja19yYXRlLCBuYl9jaGFubmVscywgZnJhbWVfc2l6ZSk7CisKKyAgLyogY29uc3RydWN0IG1pbmltYWwgaGVhZGVyIGFuZCBjb21tZW50IHBhY2tldCBmb3IgdGhlIGRlY29kZXIgKi8KKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg2MCk7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBwdHIgPSBtYXAuZGF0YTsKKyAgbWVtY3B5IChwdHIsICJDRUxUICAgICIsIDgpOworICBwdHIgKz0gODsKKyAgbWVtY3B5IChwdHIsICIxLjEuMTIiLCA3KTsKKyAgcHRyICs9IDIwOworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChwdHIsIDB4ODAwMDAwMDYpOyAgICAgICAgLyogdmVyc2lvbiAqLworICBwdHIgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAocHRyLCA1Nik7ICAgICAgICAvKiBoZWFkZXJfc2l6ZSAqLworICBwdHIgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAocHRyLCBjbG9ja19yYXRlKTsgICAgICAgIC8qIHJhdGUgKi8KKyAgcHRyICs9IDQ7CisgIEdTVF9XUklURV9VSU5UMzJfTEUgKHB0ciwgbmJfY2hhbm5lbHMpOyAgICAgICAvKiBjaGFubmVscyAqLworICBwdHIgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAocHRyLCBmcmFtZV9zaXplKTsgICAgICAgIC8qIGZyYW1lLXNpemUgKi8KKyAgcHRyICs9IDQ7CisgIEdTVF9XUklURV9VSU5UMzJfTEUgKHB0ciwgLTEpOyAgICAgICAgLyogb3ZlcmxhcCAqLworICBwdHIgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAocHRyLCAtMSk7ICAgICAgICAvKiBieXRlc19wZXJfcGFja2V0ICovCisgIHB0ciArPSA0OworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChwdHIsIDApOyAvKiBleHRyYSBoZWFkZXJzICovCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby94LWNlbHQiKTsKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoZGVwYXlsb2FkLT5zcmNwYWQsIHNyY2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgZ3N0X3J0cF9iYXNlX2RlcGF5bG9hZF9wdXNoIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEIChydHBjZWx0ZGVwYXkpLCBidWYpOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZW9mIChnc3RfcnRwX2NlbHRfY29tbWVudCkpOworICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgZ3N0X3J0cF9jZWx0X2NvbW1lbnQsIHNpemVvZiAoZ3N0X3J0cF9jZWx0X2NvbW1lbnQpKTsKKworICBnc3RfcnRwX2Jhc2VfZGVwYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9ERVBBWUxPQUQgKHJ0cGNlbHRkZXBheSksIGJ1Zik7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK25vX2Nsb2NrcmF0ZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlcGF5bG9hZCwgIm5vIGNsb2NrLXJhdGUgc3BlY2lmaWVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9jZWx0X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBndWludDggKnBheWxvYWQ7CisgIGd1aW50IG9mZnNldCwgcG9zLCBwYXlsb2FkX2xlbiwgdG90YWxfc2l6ZSwgc2l6ZTsKKyAgZ3VpbnQ4IHM7CisgIGdpbnQgY2xvY2tfcmF0ZSA9IDAsIGZyYW1lX3NpemUgPSAwOworICBHc3RDbG9ja1RpbWUgZnJhbWVzaXplX25zID0gMCwgdGltZXN0YW1wOworICBndWludCBuID0gMDsKKyAgR3N0UnRwQ0VMVERlcGF5ICpydHBjZWx0ZGVwYXk7CisKKyAgcnRwY2VsdGRlcGF5ID0gR1NUX1JUUF9DRUxUX0RFUEFZIChkZXBheWxvYWQpOworICBjbG9ja19yYXRlID0gZGVwYXlsb2FkLT5jbG9ja19yYXRlOworICBmcmFtZV9zaXplID0gcnRwY2VsdGRlcGF5LT5mcmFtZV9zaXplOworICBmcmFtZXNpemVfbnMgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChmcmFtZV9zaXplLCBHU1RfU0VDT05ELCBjbG9ja19yYXRlKTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAocnRwLT5idWZmZXIpOworCisgIEdTVF9MT0dfT0JKRUNUIChkZXBheWxvYWQsCisgICAgICAiZ290ICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMsIG1hcmsgJWQgdHMgJXUgc2VxbiAlZCIsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChydHAtPmJ1ZmZlciksIGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCksCisgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wIChydHApLCBnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxIChydHApKTsKKworICBHU1RfTE9HX09CSkVDVCAoZGVwYXlsb2FkLCAiZ290IGNsb2NrLXJhdGU9JWQsIGZyYW1lX3NpemU9JWQsICIKKyAgICAgICJfbnM9JSIgR1NUX1RJTUVfRk9STUFUICIsIHRpbWVzdGFtcD0lIiBHU1RfVElNRV9GT1JNQVQsIGNsb2NrX3JhdGUsCisgICAgICBmcmFtZV9zaXplLCBHU1RfVElNRV9BUkdTIChmcmFtZXNpemVfbnMpLCBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgIC8qIGZpcnN0IGNvdW50IGhvdyBtYW55IGJ5dGVzIGFyZSBjb25zdW1lZCBieSB0aGUgc2l6ZSBoZWFkZXJzIGFuZCBtYWtlIG9mZnNldAorICAgKiBwb2ludCB0byB0aGUgZmlyc3QgZGF0YSBieXRlICovCisgIHRvdGFsX3NpemUgPSAwOworICBvZmZzZXQgPSAwOworICB3aGlsZSAodG90YWxfc2l6ZSA8IHBheWxvYWRfbGVuKSB7CisgICAgZG8geworICAgICAgcyA9IHBheWxvYWRbb2Zmc2V0KytdOworICAgICAgdG90YWxfc2l6ZSArPSBzICsgMTsKKyAgICB9IHdoaWxlIChzID09IDB4ZmYpOworICB9CisKKyAgLyogb2Zmc2V0IGlzIG5vdyBwb2ludGluZyB0byB0aGUgcGF5bG9hZCAqLworICB0b3RhbF9zaXplID0gMDsKKyAgcG9zID0gMDsKKyAgd2hpbGUgKHRvdGFsX3NpemUgPCBwYXlsb2FkX2xlbikgeworICAgIG4rKzsKKyAgICBzaXplID0gMDsKKyAgICBkbyB7CisgICAgICBzID0gcGF5bG9hZFtwb3MrK107CisgICAgICBzaXplICs9IHM7CisgICAgICB0b3RhbF9zaXplICs9IHMgKyAxOworICAgIH0gd2hpbGUgKHMgPT0gMHhmZik7CisKKyAgICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwgb2Zmc2V0LCBzaXplKTsKKyAgICBvZmZzZXQgKz0gc2l6ZTsKKworICAgIGlmIChmcmFtZV9zaXplICE9IC0xICYmIGNsb2NrX3JhdGUgIT0gLTEpIHsKKyAgICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gdGltZXN0YW1wICsgZnJhbWVzaXplX25zICogbjsKKyAgICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPSBmcmFtZXNpemVfbnM7CisgICAgfQorICAgIEdTVF9MT0dfT0JKRUNUIChkZXBheWxvYWQsICJwdXNoIHRpbWVzdGFtcD0lIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiwgZHVyYXRpb249JSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikpKTsKKworICAgIGdzdF9ydHBfZHJvcF9ub25fYXVkaW9fbWV0YSAoZGVwYXlsb2FkLCBvdXRidWYpOworCisgICAgZ3N0X3J0cF9iYXNlX2RlcGF5bG9hZF9wdXNoIChkZXBheWxvYWQsIG91dGJ1Zik7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfY2VsdF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGNlbHRkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9DRUxUX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwY2VsdGRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MDVjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGNlbHRkZXBheS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSAKKyAqLworIAorI2lmbmRlZiBfX0dTVF9SVFBfQ0VMVF9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0NFTFRfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cENFTFREZXBheSBHc3RSdHBDRUxURGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwQ0VMVERlcGF5Q2xhc3MgR3N0UnRwQ0VMVERlcGF5Q2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0NFTFRfREVQQVkgXAorICAoZ3N0X3J0cF9jZWx0X2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfQ0VMVF9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9DRUxUX0RFUEFZLEdzdFJ0cENFTFREZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfQ0VMVF9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfQ0VMVF9ERVBBWSxHc3RSdHBDRUxURGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfQ0VMVF9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9DRUxUX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9DRUxUX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9DRUxUX0RFUEFZKSkKKworc3RydWN0IF9Hc3RSdHBDRUxURGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisgIGdpbnQgZnJhbWVfc2l6ZTsKK307CisKK3N0cnVjdCBfR3N0UnRwQ0VMVERlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfY2VsdF9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfY2VsdF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9DRUxUX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGNlbHRwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDk4ODk3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBjZWx0cGF5LmMKQEAgLTAsMCArMSw1MDIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RydHBjZWx0cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwY2VsdHBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwY2VsdHBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfY2VsdF9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWNlbHQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDMyMDAwLCA2NDAwMCBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIFsxLCAyXSwgIiAiZnJhbWUtc2l6ZSA9IChpbnQpIFsgNjQsIDUxMiBdIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9jZWx0X3BheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAgKGludCkgWyAzMjAwMCwgNDgwMDAgXSwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiQ0VMVFwiIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2NlbHRfcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfY2VsdF9wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfY2VsdF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfcnRwX2NlbHRfcGF5X2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9jZWx0X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqCisgICAgcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmZmVyKTsKKworI2RlZmluZSBnc3RfcnRwX2NlbHRfcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cENFTFRQYXksIGdzdF9ydHBfY2VsdF9wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9jZWx0X3BheV9jbGFzc19pbml0IChHc3RSdHBDRUxUUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBjZWx0cGF5X2RlYnVnLCAicnRwY2VsdHBheSIsIDAsCisgICAgICAiQ0VMVCBSVFAgUGF5bG9hZGVyIik7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9jZWx0X3BheV9maW5hbGl6ZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX2NlbHRfcGF5X2NoYW5nZV9zdGF0ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2NlbHRfcGF5X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2NlbHRfcGF5X3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlJUUCBDRUxUIHBheWxvYWRlciIsCisgICAgICAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkLWVuY29kZXMgQ0VMVCBhdWRpbyBpbnRvIGEgUlRQIHBhY2tldCIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2NlbHRfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5nZXRfY2FwcyA9IGdzdF9ydHBfY2VsdF9wYXlfZ2V0Y2FwczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX2NlbHRfcGF5X2hhbmRsZV9idWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2NlbHRfcGF5X2luaXQgKEdzdFJ0cENFTFRQYXkgKiBydHBjZWx0cGF5KQoreworICBydHBjZWx0cGF5LT5xdWV1ZSA9IGdfcXVldWVfbmV3ICgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9jZWx0X3BheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwQ0VMVFBheSAqcnRwY2VsdHBheTsKKworICBydHBjZWx0cGF5ID0gR1NUX1JUUF9DRUxUX1BBWSAob2JqZWN0KTsKKworICBnX3F1ZXVlX2ZyZWUgKHJ0cGNlbHRwYXktPnF1ZXVlKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2NlbHRfcGF5X2NsZWFyX3F1ZXVlZCAoR3N0UnRwQ0VMVFBheSAqIHJ0cGNlbHRwYXkpCit7CisgIEdzdEJ1ZmZlciAqYnVmOworCisgIHdoaWxlICgoYnVmID0gZ19xdWV1ZV9wb3BfaGVhZCAocnRwY2VsdHBheS0+cXVldWUpKSkKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIHJ0cGNlbHRwYXktPmJ5dGVzID0gMDsKKyAgcnRwY2VsdHBheS0+c2J5dGVzID0gMDsKKyAgcnRwY2VsdHBheS0+cWR1cmF0aW9uID0gMDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfY2VsdF9wYXlfYWRkX3F1ZXVlZCAoR3N0UnRwQ0VMVFBheSAqIHJ0cGNlbHRwYXksIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBndWludCBzc2l6ZSwgZ3VpbnQgc2l6ZSwgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uKQoreworICBnX3F1ZXVlX3B1c2hfdGFpbCAocnRwY2VsdHBheS0+cXVldWUsIGJ1ZmZlcik7CisgIHJ0cGNlbHRwYXktPnNieXRlcyArPSBzc2l6ZTsKKyAgcnRwY2VsdHBheS0+Ynl0ZXMgKz0gc2l6ZTsKKyAgLyogb25seSBhZGQgZHVyYXRpb25zIHdoZW4gd2UgaGF2ZSBhIHZhbGlkIHByZXZpb3VzIGR1cmF0aW9uICovCisgIGlmIChydHBjZWx0cGF5LT5xZHVyYXRpb24gIT0gLTEpIHsKKyAgICBpZiAoZHVyYXRpb24gIT0gLTEpCisgICAgICAvKiBvbmx5IGFkZCB2YWxpZCBkdXJhdGlvbnMgKi8KKyAgICAgIHJ0cGNlbHRwYXktPnFkdXJhdGlvbiArPSBkdXJhdGlvbjsKKyAgICBlbHNlCisgICAgICAvKiBpZiB3ZSBhZGQgYSBidWZmZXIgd2l0aG91dCB2YWxpZCBkdXJhdGlvbiwgb3VyIHRvdGFsIHF1ZXVlZCBkdXJhdGlvbgorICAgICAgICogYmVjb21lcyB1bmtub3duICovCisgICAgICBydHBjZWx0cGF5LT5xZHVyYXRpb24gPSAtMTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfY2VsdF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgLyogZG9uJ3QgY29uZmlndXJlIHlldCwgd2Ugd2FpdCBmb3IgdGhlIGlkZW50IHBhY2tldCAqLworICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfcnRwX2NlbHRfcGF5X2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0UGFkICogcGFkLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKm90aGVycGFkY2FwczsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgY29uc3QgZ2NoYXIgKnBhcmFtczsKKworICBjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisKKyAgb3RoZXJwYWRjYXBzID0gZ3N0X3BhZF9nZXRfYWxsb3dlZF9jYXBzIChwYXlsb2FkLT5zcmNwYWQpOworICBpZiAob3RoZXJwYWRjYXBzKSB7CisgICAgaWYgKCFnc3RfY2Fwc19pc19lbXB0eSAob3RoZXJwYWRjYXBzKSkgeworICAgICAgR3N0U3RydWN0dXJlICpwczsKKyAgICAgIEdzdFN0cnVjdHVyZSAqczsKKyAgICAgIGdpbnQgY2xvY2tfcmF0ZSA9IDAsIGZyYW1lX3NpemUgPSAwLCBjaGFubmVscyA9IDE7CisKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKworICAgICAgcHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChvdGhlcnBhZGNhcHMsIDApOworICAgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChwcywgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpIHsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9pbnQgKHMsICJyYXRlIiwgY2xvY2tfcmF0ZSk7CisgICAgICB9CisKKyAgICAgIGlmICgocGFyYW1zID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChwcywgImZyYW1lLXNpemUiKSkpCisgICAgICAgIGZyYW1lX3NpemUgPSBhdG9pIChwYXJhbXMpOworICAgICAgaWYgKGZyYW1lX3NpemUpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiZnJhbWUtc2l6ZSIsIEdfVFlQRV9JTlQsIGZyYW1lX3NpemUsIE5VTEwpOworCisgICAgICBpZiAoKHBhcmFtcyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocHMsICJlbmNvZGluZy1wYXJhbXMiKSkpIHsKKyAgICAgICAgY2hhbm5lbHMgPSBhdG9pIChwYXJhbXMpOworICAgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAocywgImNoYW5uZWxzIiwgY2hhbm5lbHMpOworICAgICAgfQorCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXlsb2FkLCAiY2xvY2stcmF0ZT0lZCBmcmFtZS1zaXplPSVkIGNoYW5uZWxzPSVkIiwKKyAgICAgICAgICBjbG9ja19yYXRlLCBmcmFtZV9zaXplLCBjaGFubmVscyk7CisgICAgfQorICAgIGdzdF9jYXBzX3VucmVmIChvdGhlcnBhZGNhcHMpOworICB9CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKnRtcDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJJbnRlcnNlY3QgJSIgR1NUX1BUUl9GT1JNQVQgIiBhbmQgZmlsdGVyICUiCisgICAgICAgIEdTVF9QVFJfRk9STUFULCBjYXBzLCBmaWx0ZXIpOworICAgIHRtcCA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIGNhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIGNhcHMgPSB0bXA7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2NlbHRfcGF5X3BhcnNlX2lkZW50IChHc3RSdHBDRUxUUGF5ICogcnRwY2VsdHBheSwKKyAgICBjb25zdCBndWludDggKiBkYXRhLCBndWludCBzaXplKQoreworICBndWludDMyIHZlcnNpb24sIGhlYWRlcl9zaXplLCByYXRlLCBuYl9jaGFubmVscywgZnJhbWVfc2l6ZSwgb3ZlcmxhcDsKKyAgZ3VpbnQzMiBieXRlc19wZXJfcGFja2V0OworICBHc3RSVFBCYXNlUGF5bG9hZCAqcGF5bG9hZDsKKyAgZ2NoYXIgKmNzdHIsICpmc3N0cjsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIC8qIHdlIG5lZWQgdGhlIGhlYWRlciBzdHJpbmcgKDgpLCB0aGUgdmVyc2lvbiBzdHJpbmcgKDIwKSwgdGhlIHZlcnNpb24KKyAgICogYW5kIHRoZSBoZWFkZXIgbGVuZ3RoLiAqLworICBpZiAoc2l6ZSA8IDM2KQorICAgIGdvdG8gdG9vX3NtYWxsOworCisgIGlmICghZ19zdHJfaGFzX3ByZWZpeCAoKGNvbnN0IGdjaGFyICopIGRhdGEsICJDRUxUICAgICIpKQorICAgIGdvdG8gd3JvbmdfaGVhZGVyOworCisgIC8qIHNraXAgaGVhZGVyIGFuZCB2ZXJzaW9uIHN0cmluZyAqLworICBkYXRhICs9IDI4OworCisgIHZlcnNpb24gPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEpOworICBHU1RfREVCVUdfT0JKRUNUIChydHBjZWx0cGF5LCAidmVyc2lvbiAlMDh4IiwgdmVyc2lvbik7CisjaWYgMAorICBpZiAodmVyc2lvbiAhPSAxKQorICAgIGdvdG8gd3JvbmdfdmVyc2lvbjsKKyNlbmRpZgorCisgIGRhdGEgKz0gNDsKKyAgLyogZW5zdXJlIHNpemVzICovCisgIGhlYWRlcl9zaXplID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKyAgaWYgKGhlYWRlcl9zaXplIDwgNTYpCisgICAgZ290byBoZWFkZXJfdG9vX3NtYWxsOworCisgIGlmIChzaXplIDwgaGVhZGVyX3NpemUpCisgICAgZ290byBwYXlsb2FkX3Rvb19zbWFsbDsKKworICBkYXRhICs9IDQ7CisgIHJhdGUgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEpOworICBkYXRhICs9IDQ7CisgIG5iX2NoYW5uZWxzID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKyAgZGF0YSArPSA0OworICBmcmFtZV9zaXplID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKyAgZGF0YSArPSA0OworICBvdmVybGFwID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKyAgZGF0YSArPSA0OworICBieXRlc19wZXJfcGFja2V0ID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBjZWx0cGF5LCAicmF0ZSAlZCwgbmJfY2hhbm5lbHMgJWQsIGZyYW1lX3NpemUgJWQiLAorICAgICAgcmF0ZSwgbmJfY2hhbm5lbHMsIGZyYW1lX3NpemUpOworICBHU1RfREVCVUdfT0JKRUNUIChydHBjZWx0cGF5LCAib3ZlcmxhcCAlZCwgYnl0ZXNfcGVyX3BhY2tldCAlZCIsCisgICAgICBvdmVybGFwLCBieXRlc19wZXJfcGFja2V0KTsKKworICBwYXlsb2FkID0gR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cGNlbHRwYXkpOworCisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChwYXlsb2FkLCAiYXVkaW8iLCBGQUxTRSwgIkNFTFQiLCByYXRlKTsKKyAgY3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgbmJfY2hhbm5lbHMpOworICBmc3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgZnJhbWVfc2l6ZSk7CisgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXlsb2FkLCAiZW5jb2RpbmctcGFyYW1zIiwKKyAgICAgIEdfVFlQRV9TVFJJTkcsIGNzdHIsICJmcmFtZS1zaXplIiwgR19UWVBFX1NUUklORywgZnNzdHIsIE5VTEwpOworICBnX2ZyZWUgKGNzdHIpOworICBnX2ZyZWUgKGZzc3RyKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLwordG9vX3NtYWxsOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwY2VsdHBheSwKKyAgICAgICAgImlkZW50IHBhY2tldCB0b28gc21hbGwsIG5lZWQgYXQgbGVhc3QgMzIgYnl0ZXMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3dyb25nX2hlYWRlcjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGNlbHRwYXksCisgICAgICAgICJpZGVudCBwYWNrZXQgZG9lcyBub3Qgc3RhcnQgd2l0aCBcIkNFTFQgICAgXCIiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyNpZiAwCit3cm9uZ192ZXJzaW9uOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwY2VsdHBheSwgImNhbiBvbmx5IGhhbmRsZSB2ZXJzaW9uIDEsIGhhdmUgdmVyc2lvbiAlZCIsCisgICAgICAgIHZlcnNpb24pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorI2VuZGlmCitoZWFkZXJfdG9vX3NtYWxsOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwY2VsdHBheSwKKyAgICAgICAgImhlYWRlciBzaXplIHRvbyBzbWFsbCwgbmVlZCBhdCBsZWFzdCA4MCBieXRlcywgIiAiZ290IG9ubHkgJWQiLAorICAgICAgICBoZWFkZXJfc2l6ZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitwYXlsb2FkX3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGNlbHRwYXksCisgICAgICAgICJwYXlsb2FkIHRvbyBzbWFsbCwgbmVlZCBhdCBsZWFzdCAlZCBieXRlcywgZ290IG9ubHkgJWQiLCBoZWFkZXJfc2l6ZSwKKyAgICAgICAgc2l6ZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2NlbHRfcGF5X2ZsdXNoX3F1ZXVlZCAoR3N0UnRwQ0VMVFBheSAqIHJ0cGNlbHRwYXkpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RCdWZmZXIgKmJ1ZiwgKm91dGJ1ZjsKKyAgZ3VpbnQ4ICpwYXlsb2FkLCAqc3BheWxvYWQ7CisgIGd1aW50IHBheWxvYWRfbGVuOworICBHc3RDbG9ja1RpbWUgZHVyYXRpb247CisgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwsIH07CisKKyAgcGF5bG9hZF9sZW4gPSBydHBjZWx0cGF5LT5ieXRlcyArIHJ0cGNlbHRwYXktPnNieXRlczsKKyAgZHVyYXRpb24gPSBydHBjZWx0cGF5LT5xZHVyYXRpb247CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwY2VsdHBheSwgImZsdXNoaW5nIG91dCAldSwgZHVyYXRpb24gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgcGF5bG9hZF9sZW4sIEdTVF9USU1FX0FSR1MgKHJ0cGNlbHRwYXktPnFkdXJhdGlvbikpOworCisgIC8qIGdldCBhIGJpZyBlbm91Z2ggcGFja2V0IGZvciB0aGUgc2l6ZXMgKyBwYXlsb2FkcyAqLworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKHBheWxvYWRfbGVuLCAwLCAwKTsKKworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gZHVyYXRpb247CisKKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChvdXRidWYsIEdTVF9NQVBfV1JJVEUsICZydHApOworCisgIC8qIHBvaW50IHRvIHRoZSBwYXlsb2FkIGZvciBzaXplIGhlYWRlcnMgYW5kIGRhdGEgKi8KKyAgc3BheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisgIHBheWxvYWQgPSBzcGF5bG9hZCArIHJ0cGNlbHRwYXktPnNieXRlczsKKworICB3aGlsZSAoKGJ1ZiA9IGdfcXVldWVfcG9wX2hlYWQgKHJ0cGNlbHRwYXktPnF1ZXVlKSkpIHsKKyAgICBndWludCBzaXplOworCisgICAgLyogY29weSBmaXJzdCB0aW1lc3RhbXAgdG8gb3V0cHV0ICovCisgICAgaWYgKEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID09IC0xKQorICAgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBHU1RfQlVGRkVSX1BUUyAoYnVmKTsKKworICAgIC8qIHdyaXRlIHRoZSBzaXplIHRvIHRoZSBoZWFkZXIgKi8KKyAgICBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKyAgICB3aGlsZSAoc2l6ZSA+IDB4ZmYpIHsKKyAgICAgICpzcGF5bG9hZCsrID0gMHhmZjsKKyAgICAgIHNpemUgLT0gMHhmZjsKKyAgICB9CisgICAgKnNwYXlsb2FkKysgPSBzaXplOworCisgICAgLyogY29weSBwYXlsb2FkICovCisgICAgc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChidWYsIDAsIHBheWxvYWQsIHNpemUpOworICAgIHBheWxvYWQgKz0gc2l6ZTsKKworICAgIGdzdF9ydHBfY29weV9hdWRpb19tZXRhIChydHBjZWx0cGF5LCBvdXRidWYsIGJ1Zik7CisKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICB9CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAvKiB3ZSBjb25zdW1lZCBpdCBhbGwgKi8KKyAgcnRwY2VsdHBheS0+Ynl0ZXMgPSAwOworICBydHBjZWx0cGF5LT5zYnl0ZXMgPSAwOworICBydHBjZWx0cGF5LT5xZHVyYXRpb24gPSAwOworCisgIHJldCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBjZWx0cGF5KSwgb3V0YnVmKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9jZWx0X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdFJ0cENFTFRQYXkgKnJ0cGNlbHRwYXk7CisgIGdzaXplIHBheWxvYWRfbGVuOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uLCBwYWNrZXRfZHVyOworICBndWludCBpLCBzc2l6ZSwgcGFja2V0X2xlbjsKKworICBydHBjZWx0cGF5ID0gR1NUX1JUUF9DRUxUX1BBWSAoYmFzZXBheWxvYWQpOworCisgIHJldCA9IEdTVF9GTE9XX09LOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgc3dpdGNoIChydHBjZWx0cGF5LT5wYWNrZXQpIHsKKyAgICBjYXNlIDA6CisgICAgICAvKiBpZGVudCBwYWNrZXQuIFdlIG5lZWQgdG8gcGFyc2UgdGhlIGhlYWRlcnMgdG8gY29uc3RydWN0IHRoZSBSVFAKKyAgICAgICAqIHByb3BlcnRpZXMuICovCisgICAgICBpZiAoIWdzdF9ydHBfY2VsdF9wYXlfcGFyc2VfaWRlbnQgKHJ0cGNlbHRwYXksIG1hcC5kYXRhLCBtYXAuc2l6ZSkpCisgICAgICAgIGdvdG8gcGFyc2VfZXJyb3I7CisKKyAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBjYXNlIDE6CisgICAgICAvKiBjb21tZW50IHBhY2tldCwgd2UgaWdub3JlIGl0ICovCisgICAgICBnb3RvIGNsZWFudXA7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIG90aGVyIHBhY2tldHMgZ28gaW4gdGhlIHBheWxvYWQgKi8KKyAgICAgIGJyZWFrOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgZHVyYXRpb24gPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpOworCisgIEdTVF9MT0dfT0JKRUNUIChydHBjZWx0cGF5LAorICAgICAgImdvdCBidWZmZXIgb2YgZHVyYXRpb24gJSIgR1NUX1RJTUVfRk9STUFUICIsIHNpemUgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChkdXJhdGlvbiksIG1hcC5zaXplKTsKKworICAvKiBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHNpemUgZmllbGQgYW5kIHRoZSBwYXlsb2FkICovCisgIHNzaXplID0gMTsKKyAgZm9yIChpID0gbWFwLnNpemU7IGkgPiAweGZmOyBpIC09IDB4ZmYpCisgICAgc3NpemUrKzsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBjZWx0cGF5LCAiYnl0ZXMgZm9yIHNpemUgJXUiLCBzc2l6ZSk7CisKKyAgLyogY2FsY3VsYXRlIHdoYXQgdGhlIG5ldyBzaXplIGFuZCBkdXJhdGlvbiB3b3VsZCBiZSBvZiB0aGUgcGFja2V0ICovCisgIHBheWxvYWRfbGVuID0gc3NpemUgKyBtYXAuc2l6ZSArIHJ0cGNlbHRwYXktPmJ5dGVzICsgcnRwY2VsdHBheS0+c2J5dGVzOworICBpZiAocnRwY2VsdHBheS0+cWR1cmF0aW9uICE9IC0xICYmIGR1cmF0aW9uICE9IC0xKQorICAgIHBhY2tldF9kdXIgPSBydHBjZWx0cGF5LT5xZHVyYXRpb24gKyBkdXJhdGlvbjsKKyAgZWxzZQorICAgIHBhY2tldF9kdXIgPSAwOworCisgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKHBheWxvYWRfbGVuLCAwLCAwKTsKKworICBpZiAoZ3N0X3J0cF9iYXNlX3BheWxvYWRfaXNfZmlsbGVkIChiYXNlcGF5bG9hZCwgcGFja2V0X2xlbiwgcGFja2V0X2R1cikpIHsKKyAgICAvKiBzaXplIG9yIGR1cmF0aW9uIHdvdWxkIG92ZXJmbG93IHRoZSBwYWNrZXQsIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YSAqLworICAgIHJldCA9IGdzdF9ydHBfY2VsdF9wYXlfZmx1c2hfcXVldWVkIChydHBjZWx0cGF5KTsKKyAgfQorCisgIC8qIHF1ZXVlIHRoZSBwYWNrZXQgKi8KKyAgZ3N0X3J0cF9jZWx0X3BheV9hZGRfcXVldWVkIChydHBjZWx0cGF5LCBidWZmZXIsIHNzaXplLCBtYXAuc2l6ZSwgZHVyYXRpb24pOworCitkb25lOgorICBydHBjZWx0cGF5LT5wYWNrZXQrKzsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworY2xlYW51cDoKKyAgeworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgZ290byBkb25lOworICB9CitwYXJzZV9lcnJvcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChydHBjZWx0cGF5LCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAoIkVycm9yIHBhcnNpbmcgZmlyc3QgaWRlbnRpZmljYXRpb24gcGFja2V0LiIpKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfY2VsdF9wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UnRwQ0VMVFBheSAqcnRwY2VsdHBheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJ0cGNlbHRwYXkgPSBHU1RfUlRQX0NFTFRfUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBydHBjZWx0cGF5LT5wYWNrZXQgPSAwOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfY2VsdF9wYXlfY2xlYXJfcXVldWVkIChydHBjZWx0cGF5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2NlbHRfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwY2VsdHBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9DRUxUX1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGNlbHRwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwY2VsdHBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZGQwZWMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGNlbHRwYXkuaApAQCAtMCwwICsxLDYyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1JUUF9DRUxUX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0NFTFRfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwQ0VMVFBheSBHc3RSdHBDRUxUUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cENFTFRQYXlDbGFzcyBHc3RSdHBDRUxUUGF5Q2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0NFTFRfUEFZIFwKKyAgKGdzdF9ydHBfY2VsdF9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9DRUxUX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9DRUxUX1BBWSxHc3RSdHBDRUxUUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9DRUxUX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfQ0VMVF9QQVksR3N0UnRwQ0VMVFBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9DRUxUX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9DRUxUX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfQ0VMVF9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0NFTFRfUEFZKSkKKworc3RydWN0IF9Hc3RSdHBDRUxUUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisKKyAgZ3VpbnQ2NCBwYWNrZXQ7CisKKyAgLyogcXVldWUgdG8gaG9sZCBwYWNrZXRzICovCisgIEdRdWV1ZSAgICAgICpxdWV1ZTsKKyAgZ3VpbnQgICAgICAgIHNieXRlczsgICAgLyogYnl0ZXMgcXVldWVkIGZvciBzaXplcyAqLworICBndWludCAgICAgICAgYnl0ZXM7ICAgICAvKiBieXRlcyBxdWV1ZWQgZm9yIGRhdGEgKi8KKyAgR3N0Q2xvY2tUaW1lIHFkdXJhdGlvbjsgLyogcXVldWVkIGR1cmF0aW9uICovCit9OworCitzdHJ1Y3QgX0dzdFJ0cENFTFRQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfY2VsdF9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2NlbHRfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0NFTFRfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBjaGFubmVscy5jIGIvZ3N0L3J0cC9nc3RydHBjaGFubmVscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MjEyOTMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGNoYW5uZWxzLmMKQEAgLTAsMCArMSwzMTAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOD4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorCisvKiAKKyAqIFJUUCBjaGFubmVsIHBvc2l0aW9ucyBhcyBkaXNjdXNzZWQgaW4gUkZDIDM1NTEgYW5kIGFsc28gUkZDIDM1NTUKKyAqCisgKiBXZSBjYW4ndCByZWFsbHkgcmVwcmVzZW50IHRoZSBkZXNjcmliZWQgY2hhbm5lbCBwb3NpdGlvbnMgaW4gR1N0cmVhbWVyIGJ1dCB3ZQorICogaW1wbGVtZW50IGEgKHZlcnkgcm91Z2gpIGFwcHJveGltYXRpb24gaGVyZS4KKyAqLworCitzdGF0aWMgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zXzRfMVtdID0geworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hUCit9OworCitzdGF0aWMgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zXzRfMltdID0geworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSLAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxCit9OworCitzdGF0aWMgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zXzRfM1tdID0geworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSLAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxCit9OworCitzdGF0aWMgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zXzVfMVtdID0geworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIKK307CisKK3N0YXRpYyBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBwb3NfNl8xW10gPSB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfUklHSFQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMQorfTsKKworc3RhdGljIGNvbnN0IEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHBvc182XzJbXSA9IHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMSwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hUCit9OworCitzdGF0aWMgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zXzhfMVtdID0geworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSLAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxLAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfUklHSFQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVAorfTsKKworc3RhdGljIGNvbnN0IEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHBvc184XzJbXSA9IHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMSwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0xFRlQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFQKK307CisKK3N0YXRpYyBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBwb3NfOF8zW10gPSB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0xGRTEsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfTEVGVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9SSUdIVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hUCit9OworCitzdGF0aWMgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zX2RlZl8xW10gPSB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX01PTk8KK307CisKK3N0YXRpYyBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBwb3NfZGVmXzJbXSA9IHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQKK307CisKK3N0YXRpYyBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBwb3NfZGVmXzNbXSA9IHsKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUgorfTsKKworc3RhdGljIGNvbnN0IEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHBvc19kZWZfNFtdID0geworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxCit9OworCitzdGF0aWMgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zX2RlZl81W10gPSB7CisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVIsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1NJREVfTEVGVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9SSUdIVAorfTsKKworc3RhdGljIGNvbnN0IEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHBvc19kZWZfNltdID0geworICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9SSUdIVCwKKyAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQsCisgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0xGRTEKK307CisKK2NvbnN0IEdzdFJUUENoYW5uZWxPcmRlciBnc3RfcnRwX2NoYW5uZWxfb3JkZXJzW10gPSB7CisgIC8qIDQgY2hhbm5lbHMgKi8KKyAgeyJEVi5MUkxzUnMiLCA0LCBwb3NfNF8xfSwKKyAgeyJEVi5MUkNTIiwgNCwgcG9zXzRfMn0sCisgIHsiRFYuTFJDV28iLCA0LCBwb3NfNF8zfSwKKyAgLyogNSBjaGFubmVscyAqLworICB7IkRWLkxSTHNSc0MiLCA1LCBwb3NfNV8xfSwKKyAgLyogNiBjaGFubmVscyAqLworICB7IkRWLkxSTHNSc0NTIiwgNiwgcG9zXzZfMX0sCisgIHsiRFYuTG1peFJtaXhUV29RMVEyIiwgNiwgcG9zXzZfMn0sCisgIC8qIDggY2hhbm5lbHMgKi8KKyAgeyJEVi5MUkNXb0xzUnNMbWl4Um1peCIsIDgsIHBvc184XzF9LAorICB7IkRWLkxSQ1dvTHMxUnMxTHMyUnMyIiwgOCwgcG9zXzhfMn0sCisgIHsiRFYuTFJDV29Mc1JzTGNSYyIsIDgsIHBvc184XzN9LAorCisgIC8qIGRlZmF1bHQgbGF5b3V0cyAqLworICB7TlVMTCwgMSwgcG9zX2RlZl8xfSwKKyAge05VTEwsIDIsIHBvc19kZWZfMn0sCisgIHtOVUxMLCAzLCBwb3NfZGVmXzN9LAorICB7TlVMTCwgNCwgcG9zX2RlZl80fSwKKyAge05VTEwsIDUsIHBvc19kZWZfNX0sCisgIHtOVUxMLCA2LCBwb3NfZGVmXzZ9LAorCisgIC8qIHRlcm1pbmF0b3IsIGludmFsaWQgZW50cnkgKi8KKyAge05VTEwsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGdib29sZWFuCitjaGVja19jaGFubmVscyAoY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICogb3JkZXIsCisgICAgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gKiBwb3MpCit7CisgIGdpbnQgaSwgajsKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKworICBmb3IgKGkgPSAwOyBpIDwgb3JkZXItPmNoYW5uZWxzOyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgb3JkZXItPmNoYW5uZWxzOyBqKyspIHsKKyAgICAgIGlmIChvcmRlci0+cG9zW2pdID09IHBvc1tpXSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChqID09IG9yZGVyLT5jaGFubmVscykKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIGdzdF9ydHBfY2hhbm5lbHNfZ2V0X2J5X3BvczoKKyAqIEBjaGFubmVsczogdGhlIGFtb3VudCBvZiBjaGFubmVscworICogQHBvczogYSBjaGFubmVsIGxheW91dAorICoKKyAqIFJldHVybiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjaGFubmVsIGxheW91dC4KKyAqCisgKiBSZXR1cm5zOiBhICNHc3RSVFBDaGFubmVsT3JkZXIgd2l0aCB0aGUgY2hhbm5lbCBpbmZvcm1hdGlvbiBvciBOVUxMIHdoZW4gQHBvcworICogaXMgbm90IGEgdmFsaWQgbGF5b3V0LgorICovCitjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgKgorZ3N0X3J0cF9jaGFubmVsc19nZXRfYnlfcG9zIChnaW50IGNoYW5uZWxzLCBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqIHBvcykKK3sKKyAgZ2ludCBpOworICBjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgKnJlcyA9IE5VTEw7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHBvcyAhPSBOVUxMLCBOVUxMKTsKKworICBmb3IgKGkgPSAwOyBjaGFubmVsX29yZGVyc1tpXS5wb3M7IGkrKykgeworICAgIGlmIChjaGFubmVsX29yZGVyc1tpXS5jaGFubmVscyAhPSBjaGFubmVscykKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKGNoZWNrX2NoYW5uZWxzICgmY2hhbm5lbF9vcmRlcnNbaV0sIHBvcykpIHsKKyAgICAgIHJlcyA9ICZjaGFubmVsX29yZGVyc1tpXTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIGdzdF9ydHBfY2hhbm5lbHNfY3JlYXRlX2RlZmF1bHQ6CisgKiBAY2hhbm5lbHM6IHRoZSBhbW91bnQgb2YgY2hhbm5lbHMKKyAqIEBvcmRlcjogYSBjaGFubmVsIG9yZGVyCisgKgorICogR2V0IHRoZSBjaGFubmVsIG9yZGVyIGluZm8gdGhlIEBvcmRlciBhbmQgQGNoYW5uZWxzLgorICoKKyAqIFJldHVybnM6IGEgI0dzdFJUUENoYW5uZWxPcmRlciB3aXRoIHRoZSBjaGFubmVsIGluZm9ybWF0aW9uIG9yIE5VTEwgd2hlbgorICogQG9yZGVyIGlzIG5vdCBhIGtub3cgbGF5b3V0IGZvciBAY2hhbm5lbHMuCisgKi8KK2NvbnN0IEdzdFJUUENoYW5uZWxPcmRlciAqCitnc3RfcnRwX2NoYW5uZWxzX2dldF9ieV9vcmRlciAoZ2ludCBjaGFubmVscywgY29uc3QgZ2NoYXIgKiBvcmRlcikKK3sKKyAgZ2ludCBpOworICBjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgKnJlcyA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgY2hhbm5lbF9vcmRlcnNbaV0ucG9zOyBpKyspIHsKKyAgICBpZiAoY2hhbm5lbF9vcmRlcnNbaV0uY2hhbm5lbHMgIT0gY2hhbm5lbHMpCisgICAgICBjb250aW51ZTsKKworICAgIC8qIG5vIG5hbWUgYnV0IGNoYW5uZWxzIG1hdGNoLCBjb250aW51ZSAqLworICAgIGlmICghY2hhbm5lbF9vcmRlcnNbaV0ubmFtZSB8fCAhb3JkZXIpIHsKKyAgICAgIHJlcyA9ICZjaGFubmVsX29yZGVyc1tpXTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIGNvbXBhcmUgbmFtZXMgKi8KKyAgICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wIChjaGFubmVsX29yZGVyc1tpXS5uYW1lLCBvcmRlcikpIHsKKyAgICAgIHJlcyA9ICZjaGFubmVsX29yZGVyc1tpXTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzOworfQorCisvKioKKyAqIGdzdF9ydHBfY2hhbm5lbHNfZ2V0X2J5X2luZGV4OgorICogQGNoYW5uZWxzOiB0aGUgYW1vdW50IG9mIGNoYW5uZWxzCisgKiBAaWR4OiB0aGUgY2hhbm5lbCBpbmRleCB0byByZXRyaWV2ZQorICoKKyAqIEdldCB0aGUgYWxsb3dlZCBjaGFubmVsIG9yZGVyIGRlc2NyaXB0aW9ucyBmb3IgQGNoYW5uZWxzLiBAaWR4IGNhbiBiZSB1c2VkIHRvCisgKiByZXRyaWV2ZSB0aGUgZGVzaXJlZCBpbmRleC4KKyAqCisgKiBSZXR1cm5zOiBhICNHc3RSVFBDaGFubmVsT3JkZXIgYXQgQGlkeCwgTlVMTCB3aGVuIHRoZXJlIGFyZSBubyB2YWxpZCBjaGFubmVsCisgKiBvcmRlcnMuCisgKi8KK2NvbnN0IEdzdFJUUENoYW5uZWxPcmRlciAqCitnc3RfcnRwX2NoYW5uZWxzX2dldF9ieV9pbmRleCAoZ2ludCBjaGFubmVscywgZ3VpbnQgaWR4KQoreworICBnaW50IGk7CisgIGNvbnN0IEdzdFJUUENoYW5uZWxPcmRlciAqcmVzID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBjaGFubmVsX29yZGVyc1tpXS5wb3M7IGkrKykgeworICAgIGlmIChjaGFubmVsX29yZGVyc1tpXS5jaGFubmVscyAhPSBjaGFubmVscykKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKGlkeCA9PSAwKSB7CisgICAgICByZXMgPSAmY2hhbm5lbF9vcmRlcnNbaV07CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWR4LS07CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworCisvKioKKyAqIGdzdF9ydHBfY2hhbm5lbHNfY3JlYXRlX2RlZmF1bHQ6CisgKiBAY2hhbm5lbHM6IHRoZSBhbW91bnQgb2YgY2hhbm5lbHMKKyAqCisgKiBDcmVhdGUgYSBkZWZhdWx0IG5vbmUgY2hhbm5lbCBtYXBwaW5nIGZvciBAY2hhbm5lbHMuCisgKgorICogUmV0dXJuczogYSAjR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gd2l0aCBhbGwgdGhlIGNoYW5uZWwgcG9zaXRpb24gaW5mbyBzZXQgdG8KKyAqICNHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FLgorICovCit2b2lkCitnc3RfcnRwX2NoYW5uZWxzX2NyZWF0ZV9kZWZhdWx0IChnaW50IGNoYW5uZWxzLCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqIHBvc24pCit7CisgIGdpbnQgaTsKKworICBnX3JldHVybl9pZl9mYWlsIChjaGFubmVscyA+IDApOworCisgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKQorICAgIHBvc25baV0gPSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBjaGFubmVscy5oIGIvZ3N0L3J0cC9nc3RydHBjaGFubmVscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkM2Y1MzAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGNoYW5uZWxzLmgKQEAgLTAsMCArMSw0NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA4PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaWZuZGVmIF9fR1NUX1JUUF9DSEFOTkVMU19IX18KKyNkZWZpbmUgX19HU1RfUlRQX0NIQU5ORUxTX0hfXworCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBnY2hhciAgICAgICAgICAgICAgICAgICAqbmFtZTsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzOworICBjb25zdCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqcG9zOworfSBHc3RSVFBDaGFubmVsT3JkZXI7CisKKyNkZWZpbmUgY2hhbm5lbF9vcmRlcnMgZ3N0X3J0cF9jaGFubmVsX29yZGVycworR19HTlVDX0lOVEVSTkFMIGV4dGVybiBjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgZ3N0X3J0cF9jaGFubmVsX29yZGVyc1tdOworCitjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgKiAgIGdzdF9ydHBfY2hhbm5lbHNfZ2V0X2J5X3BvcyAgICAgKGdpbnQgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICpwb3MpOworY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICogICBnc3RfcnRwX2NoYW5uZWxzX2dldF9ieV9vcmRlciAgIChnaW50IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqb3JkZXIpOworY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICogICBnc3RfcnRwX2NoYW5uZWxzX2dldF9ieV9pbmRleCAgIChnaW50IGNoYW5uZWxzLCBndWludCBpZHgpOworCit2b2lkICAgICAgICAgICAgICAgICAgICAgICAgIGdzdF9ydHBfY2hhbm5lbHNfY3JlYXRlX2RlZmF1bHQgKGdpbnQgY2hhbm5lbHMsIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICpwb3MpOworCisjZW5kaWYgLyogX19HU1RfUlRQX0NIQU5ORUxTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBkdmRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjM1YjcxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBkdmRlcGF5LmMKQEAgLTAsMCArMSw0MjUgQEAKKy8qIEZhcnNpZ2h0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWFyY2VsIE1vcmVhdXggPG1hcmNlbG1Ac3BhY2VsYWJzLm5sPgorICogICAgICAgICAgIChDKSAyMDA4IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIFJUUCBEViBkZXBheWxvYWRlci4KKyAqCisgKiBJbXBvcnRhbnQgbm90ZSBmb3IgTlRTQy11c2VyczoKKyAqCisgKiBCZWNhdXNlIHRoZSBhdXRob3IgdXNlcyBQQUwgdmlkZW8sIGFuZCBoZSBkb2VzIG5vdCBoYXZlIHByb3BlciBEVgorICogZG9jdW1lbnRhdGlvbiAodGhlIERWIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGlzIG5vdCBmcmVlbHkgYXZhaWxhYmxlKSwKKyAqIHRoaXMgY29kZSBtYXkgdmVyeSB3ZWxsIGNvbnRhaW4gUEFMLXNwZWNpZmljIGFzc3VtcHRpb25zLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnc3RydHBkdmRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZIChydHBkdmRlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBkdmRlcGF5X2RlYnVnKQorLyogRmlsdGVyIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1kdiIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIHsgXCJ2aWRlb1wiLCBcImF1ZGlvXCIgfSwiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJEVlwiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsIgorICAgICAgICAiZW5jb2RlID0gKHN0cmluZykgeyBcIlNELVZDUi81MjUtNjBcIiwgXCJTRC1WQ1IvNjI1LTUwXCIsIFwiSEQtVkNSLzExMjUtNjBcIiwiCisgICAgICAgICJcIkhELVZDUi8xMjUwLTUwXCIsIFwiU0RMLVZDUi81MjUtNjBcIiwgXCJTREwtVkNSLzYyNS01MFwiLCIKKyAgICAgICAgIlwiMzA2TS81MjUtNjBcIiwgXCIzMDZNLzYyNS01MFwiLCBcIjMxNE0tMjUvNTI1LTYwXCIsIgorICAgICAgICAiXCIzMTRNLTI1LzYyNS01MFwiLCBcIjMxNE0tNTAvNTI1LTYwXCIsIFwiMzE0TS01MC82MjUtNTBcIiB9IgorICAgICAgICAvKiBvcHRpb25hbCBwYXJhbWV0ZXJzIGNhbid0IGdvIGluIHRoZSB0ZW1wbGF0ZQorICAgICAgICAgKiAiYXVkaW8gPSAoc3RyaW5nKSB7IFwiYnVuZGxlZFwiLCBcIm5vbmVcIiB9IgorICAgICAgICAgKi8KKyAgICApCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2R2X2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX2R2X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBiYXNlLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9kdl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworI2RlZmluZSBnc3RfcnRwX2R2X2RlcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJUUERWRGVwYXksIGdzdF9ydHBfZHZfZGVwYXksIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHZfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UlRQRFZEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9CisgICAgICAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBkdmRlcGF5X2RlYnVnLCAicnRwZHZkZXBheSIsIDAsCisgICAgICAiRFYgUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2R2X2RlcGF5X2NoYW5nZV9zdGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua19mYWN0b3J5KTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUlRQIERWIERlcGF5bG9hZGVyIiwKKyAgICAgICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRGVwYXlsb2FkcyBEViBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMzE4OSkiLAorICAgICAgIk1hcmNlbCBNb3JlYXV4IDxtYXJjZWxtQHNwYWNlbGFicy5ubD4sIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+cHJvY2Vzc19ydHBfcGFja2V0ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2R2X2RlcGF5X3Byb2Nlc3MpOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdl9kZXBheV9zZXRjYXBzKTsKK30KKworLyogaW5pdGlhbGl6ZSB0aGUgbmV3IGVsZW1lbnQKKyAqIGluc3RhbnRpYXRlIHBhZHMgYW5kIGFkZCB0aGVtIHRvIGVsZW1lbnQKKyAqIHNldCBmdW5jdGlvbnMKKyAqIGluaXRpYWxpemUgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfcnRwX2R2X2RlcGF5X2luaXQgKEdzdFJUUERWRGVwYXkgKiBmaWx0ZXIpCit7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcGFyc2VfZW5jb2RlIChHc3RSVFBEVkRlcGF5ICogcnRwZHZkZXBheSwgY29uc3QgZ2NoYXIgKiBlbmNvZGUpCit7CisgIHJ0cGR2ZGVwYXktPndpZHRoID0gNzIwOworICBpZiAoIXN0cmNtcCAoZW5jb2RlLCAiMzE0TS0yNS81MjUtNjAiKSkgeworICAgIHJ0cGR2ZGVwYXktPmZyYW1lX3NpemUgPSAyNDAwMDA7CisgICAgcnRwZHZkZXBheS0+aGVpZ2h0ID0gNDgwOworICAgIHJ0cGR2ZGVwYXktPnJhdGVfbnVtID0gMzAwMDA7CisgICAgcnRwZHZkZXBheS0+cmF0ZV9kZW5vbSA9IDEwMDE7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoZW5jb2RlLCAiU0QtVkNSLzUyNS02MCIpKSB7CisgICAgcnRwZHZkZXBheS0+ZnJhbWVfc2l6ZSA9IDEyMDAwMDsKKyAgICBydHBkdmRlcGF5LT5oZWlnaHQgPSA0ODA7CisgICAgcnRwZHZkZXBheS0+cmF0ZV9udW0gPSAzMDAwMDsKKyAgICBydHBkdmRlcGF5LT5yYXRlX2Rlbm9tID0gMTAwMTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChlbmNvZGUsICIzMTRNLTUwLzYyNS01MCIpKSB7CisgICAgcnRwZHZkZXBheS0+ZnJhbWVfc2l6ZSA9IDI4ODAwMDsKKyAgICBydHBkdmRlcGF5LT5oZWlnaHQgPSA1NzY7CisgICAgcnRwZHZkZXBheS0+cmF0ZV9udW0gPSAyNTsKKyAgICBydHBkdmRlcGF5LT5yYXRlX2Rlbm9tID0gMTsKKyAgfSBlbHNlIGlmICghc3RyY21wIChlbmNvZGUsICJTRC1WQ1IvNjI1LTUwIikpIHsKKyAgICBydHBkdmRlcGF5LT5mcmFtZV9zaXplID0gMTQ0MDAwOworICAgIHJ0cGR2ZGVwYXktPmhlaWdodCA9IDU3NjsKKyAgICBydHBkdmRlcGF5LT5yYXRlX251bSA9IDI1OworICAgIHJ0cGR2ZGVwYXktPnJhdGVfZGVub20gPSAxOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKGVuY29kZSwgIjMxNE0tMjUvNjI1LTUwIikpIHsKKyAgICBydHBkdmRlcGF5LT5mcmFtZV9zaXplID0gMTQ0MDAwOworICAgIHJ0cGR2ZGVwYXktPmhlaWdodCA9IDU3NjsKKyAgICBydHBkdmRlcGF5LT5yYXRlX251bSA9IDI1OworICAgIHJ0cGR2ZGVwYXktPnJhdGVfZGVub20gPSAxOworICB9IGVsc2UKKyAgICBydHBkdmRlcGF5LT5mcmFtZV9zaXplID0gLTE7CisKKyAgcmV0dXJuIHJ0cGR2ZGVwYXktPmZyYW1lX3NpemUgIT0gLTE7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9kdl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdFJUUERWRGVwYXkgKnJ0cGR2ZGVwYXk7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgZ2Jvb2xlYW4gc3lzdGVtc3RyZWFtLCByZXQ7CisgIGNvbnN0IGdjaGFyICplbmNvZGUsICptZWRpYTsKKworICBydHBkdmRlcGF5ID0gR1NUX1JUUF9EVl9ERVBBWSAoZGVwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBjbG9ja19yYXRlID0gOTAwMDA7ICAgICAgICAgLyogZGVmYXVsdCAqLworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIC8qIHdlIHJlYWxseSBuZWVkIHRoZSBlbmNvZGUgcHJvcGVydHkgdG8gZmlndXJlIG91dCB0aGUgZnJhbWUgc2l6ZSwgaXQncyBhbHNvCisgICAqIHJlcXVpcmVkIGJ5IHRoZSBzcGVjICovCisgIGlmICghKGVuY29kZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZW5jb2RlIikpKQorICAgIGdvdG8gbm9fZW5jb2RlOworCisgIC8qIGZpZ3VyZSBvdXQgdGhlIHNpemUgb2Ygb25lIGZyYW1lICovCisgIGlmICghcGFyc2VfZW5jb2RlIChydHBkdmRlcGF5LCBlbmNvZGUpKQorICAgIGdvdG8gdW5rbm93bl9lbmNvZGU7CisKKyAgLyogY2hlY2sgdGhlIG1lZGlhLCB0aGlzIHRlbGxzIHVzIHRoYXQgdGhlIHN0cmVhbSBoYXMgdmlkZW8gb3Igbm90ICovCisgIGlmICghKG1lZGlhID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJtZWRpYSIpKSkKKyAgICBnb3RvIG5vX21lZGlhOworCisgIHN5c3RlbXN0cmVhbSA9IEZBTFNFOworCisgIGlmICghc3RyY21wIChtZWRpYSwgImF1ZGlvIikpIHsKKyAgICAvKiB3ZSBuZWVkIGEgZGVtdXhlciBmb3IgYXVkaW8gb25seSAqLworICAgIHN5c3RlbXN0cmVhbSA9IFRSVUU7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAobWVkaWEsICJ2aWRlbyIpKSB7CisgICAgY29uc3QgZ2NoYXIgKmF1ZGlvOworCisgICAgLyogY2hlY2sgdGhlIG9wdGlvbmFsIGF1ZGlvIGZpZWxkLCBpZiBpdCdzIHByZXNlbnQgYW5kIHNldCB0byBidW5kbGVkLCB3ZQorICAgICAqIGFyZSBkZWFsaW5nIHdpdGggYSBzeXN0ZW0gc3RyZWFtLiAqLworICAgIGlmICgoYXVkaW8gPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImF1ZGlvIikpKSB7CisgICAgICBpZiAoIXN0cmNtcCAoYXVkaW8sICJidW5kbGVkIikpCisgICAgICAgIHN5c3RlbXN0cmVhbSA9IFRSVUU7CisgICAgfQorICB9CisKKyAgLyogYWxsb2NhdGUgYWNjdW11bGF0b3IgKi8KKyAgcnRwZHZkZXBheS0+YWNjID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChydHBkdmRlcGF5LT5mcmFtZV9zaXplKTsKKworICAvKiBJbml0aWFsaXplIHRoZSBuZXcgYWNjdW11bGF0b3IgZnJhbWUuCisgICAqIElmIHRoZSBwcmV2aW91cyBmcmFtZSBleGlzdHMsIGNvcHkgdGhhdCBpbnRvIHRoZSBhY2N1bXVsYXRvciBmcmFtZS4KKyAgICogVGhpcyB3YXksIG1pc3NpbmcgcGFja2V0cyBpbiB0aGUgc3RyZWFtIHdvbid0IHNob3cgdXAgYmFkbHkuICovCisgIGdzdF9idWZmZXJfbWVtc2V0IChydHBkdmRlcGF5LT5hY2MsIDAsIDAsIHJ0cGR2ZGVwYXktPmZyYW1lX3NpemUpOworCisgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1kdiIsCisgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIHN5c3RlbXN0cmVhbSwKKyAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHJ0cGR2ZGVwYXktPndpZHRoLAorICAgICAgImhlaWdodCIsIEdfVFlQRV9JTlQsIHJ0cGR2ZGVwYXktPmhlaWdodCwKKyAgICAgICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwgcnRwZHZkZXBheS0+cmF0ZV9udW0sCisgICAgICBydHBkdmRlcGF5LT5yYXRlX2Rlbm9tLCBOVUxMKTsKKyAgcmV0ID0gZ3N0X3BhZF9zZXRfY2FwcyAoZGVwYXlsb2FkLT5zcmNwYWQsIHNyY2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK25vX2VuY29kZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGR2ZGVwYXksICJyZXF1aXJlZCBlbmNvZGUgcHJvcGVydHkgbm90IGZvdW5kIGluIGNhcHMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3Vua25vd25fZW5jb2RlOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwZHZkZXBheSwgInVua25vd24gZW5jb2RlIHByb3BlcnR5ICVzIGZvdW5kIiwgZW5jb2RlKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX21lZGlhOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwZHZkZXBheSwgInJlcXVpcmVkIG1lZGlhIHByb3BlcnR5IG5vdCBmb3VuZCBpbiBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIEEgRFYgZnJhbWUgY29uc2lzdHMgb2YgYSBidW5jaCBvZiA4MC1ieXRlIERJRiBibG9ja3MuCisgKiBFYWNoIERJRiBibG9jayBjb250YWlucyBhIDMtYnl0ZSBoZWFkZXIgdGVsbGluZyB3aGVyZSBpbiB0aGUgRFYgZnJhbWUgdGhlCisgKiBESUYgYmxvY2sgc2hvdWxkIGdvLiBXZSB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBjYWxjdWxhdGUgaXRzIHBvc2l0aW9uLgorICovCitzdGF0aWMgZ3VpbnQKK2NhbGN1bGF0ZV9kaWZibG9ja19sb2NhdGlvbiAoZ3VpbnQ4ICogYmxvY2spCit7CisgIGdpbnQgYmxvY2tfdHlwZSwgZGlmX3NlcXVlbmNlLCBkaWZfYmxvY2s7CisgIGd1aW50IGxvY2F0aW9uOworCisgIGJsb2NrX3R5cGUgPSBibG9ja1swXSA+PiA1OworICBkaWZfc2VxdWVuY2UgPSBibG9ja1sxXSA+PiA0OworICBkaWZfYmxvY2sgPSBibG9ja1syXTsKKworICBsb2NhdGlvbiA9IGRpZl9zZXF1ZW5jZSAqIDE1MDsKKworICBzd2l0Y2ggKGJsb2NrX3R5cGUpIHsKKyAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAvKiBIZWFkZXIgYmxvY2ssIG5vIG9mZnNldCAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgLyogU3ViY29kZSBibG9jayAqLworICAgICAgbG9jYXRpb24gKz0gKDEgKyBkaWZfYmxvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgLyogVkFVWCBibG9jayAqLworICAgICAgbG9jYXRpb24gKz0gKDMgKyBkaWZfYmxvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgLyogQXVkaW8gYmxvY2sgKi8KKyAgICAgIGxvY2F0aW9uICs9ICg2ICsgZGlmX2Jsb2NrICogMTYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OiAgICAgICAgICAgICAgICAgICAgLyogVmlkZW8gYmxvY2sgKi8KKyAgICAgIGxvY2F0aW9uICs9ICg3ICsgKGRpZl9ibG9jayAvIDE1KSArIGRpZl9ibG9jayk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAvKiBTb21ldGhpbmcgYm9ndXMgKi8KKyAgICAgIEdTVF9ERUJVRyAoIlVOS05PV04gQkxPQ0siKTsKKyAgICAgIGxvY2F0aW9uID0gLTE7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gbG9jYXRpb247Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZm9yZWFjaF9tZXRhZGF0YV9kcm9wIChHc3RCdWZmZXIgKiBpbmJ1ZiwgR3N0TWV0YSAqKiBtZXRhLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgICptZXRhID0gTlVMTDsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFByb2Nlc3Mgb25lIFJUUCBwYWNrZXQuIEFjY3VtdWxhdGUgUlRQIHBheWxvYWQgaW4gdGhlIHByb3BlciBwbGFjZSBpbiBhIERWCisgKiBmcmFtZSwgYW5kIHJldHVybiB0aGF0IGZyYW1lIGlmIHdlIGRldGVjdCBhIG5ldyBmcmFtZSwgb3IgTlVMTCBvdGhlcndpc2UuCisgKiBXZSBhc3N1bWUgYSBEViBmcmFtZSBpcyAxNDQwMDAgYnl0ZXMuIFRoYXQgc2hvdWxkIGFjY29tb2RhdGUgUEFMIGFzIHdlbGwgYXMKKyAqIE5UU0MuCisgKi8KK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9kdl9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogYmFzZSwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RCdWZmZXIgKm91dCA9IE5VTEw7CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgZ3VpbnQzMiBydHBfdHM7CisgIGd1aW50IHBheWxvYWRfbGVuLCBsb2NhdGlvbjsKKyAgR3N0UlRQRFZEZXBheSAqZHZkZXBheSA9IEdTVF9SVFBfRFZfREVQQVkgKGJhc2UpOworICBnYm9vbGVhbiBtYXJrZXI7CisgIEdzdE1hcEluZm8gbWFwOworCisgIG1hcmtlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgLyogQ2hlY2sgaWYgdGhlIHJlY2VpdmVkIHBhY2tldCBjb250YWlucyAodGhlIHN0YXJ0IG9mKSBhIG5ldyBmcmFtZSwgd2UgZG8KKyAgICogdGhpcyBieSBjaGVja2luZyB0aGUgUlRQIHRpbWVzdGFtcC4gKi8KKyAgcnRwX3RzID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3RpbWVzdGFtcCAocnRwKTsKKworICAvKiB3ZSBjYW5ub3QgY29weSB0aGUgcGFja2V0IHlldCBpZiB0aGUgbWFya2VyIGlzIHNldCwgd2Ugd2lsbCBkbyB0aGF0IGJlbG93CisgICAqIGFmdGVyIHRha2luZyBvdXQgdGhlIGRhdGEgKi8KKyAgaWYgKGR2ZGVwYXktPnByZXZfdHMgIT0gLTEgJiYgcnRwX3RzICE9IGR2ZGVwYXktPnByZXZfdHMgJiYgIW1hcmtlcikgeworICAgIC8qIHRoZSB0aW1lc3RhbXAgY2hhbmdlZCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGR2ZGVwYXksICJuZXcgZnJhbWUgd2l0aCB0cyAldSwgb2xkIHRzICV1IiwgcnRwX3RzLAorICAgICAgICBkdmRlcGF5LT5wcmV2X3RzKTsKKworICAgIC8qIHJldHVybiBjb3B5IG9mIGFjY3VtdWxhdG9yLiAqLworICAgIG91dCA9IGdzdF9idWZmZXJfY29weSAoZHZkZXBheS0+YWNjKTsKKyAgICBnc3RfYnVmZmVyX2ZvcmVhY2hfbWV0YSAoZHZkZXBheS0+YWNjLCBmb3JlYWNoX21ldGFkYXRhX2Ryb3AsIE5VTEwpOworICB9CisKKyAgLyogRXh0cmFjdCB0aGUgcGF5bG9hZCAqLworICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKyAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkIChydHApOworCisgIC8qIGNvcHkgYWxsIERJRiBjaHVua3MgaW4gdGhlaXIgcGxhY2UuICovCisgIGdzdF9idWZmZXJfbWFwIChkdmRlcGF5LT5hY2MsICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgd2hpbGUgKHBheWxvYWRfbGVuID49IDgwKSB7CisgICAgZ3VpbnQgb2Zmc2V0OworCisgICAgLyogQ2FsY3VsYXRlIHdoZXJlIGluIHRoZSBmcmFtZSB0aGUgcGF5bG9hZCBzaG91bGQgZ28gKi8KKyAgICBsb2NhdGlvbiA9IGNhbGN1bGF0ZV9kaWZibG9ja19sb2NhdGlvbiAocGF5bG9hZCk7CisKKyAgICBpZiAobG9jYXRpb24gPCA2KSB7CisgICAgICAvKiBwYXJ0IG9mIGEgaGVhZGVyLCBzZXQgdGhlIGZsYWcgdG8gbWFyayB0aGF0IHdlIGhhdmUgdGhlIGhlYWRlci4gKi8KKyAgICAgIGR2ZGVwYXktPmhlYWRlcl9tYXNrIHw9ICgxIDw8IGxvY2F0aW9uKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkdmRlcGF5LCAiZ290IGhlYWRlciBhdCBsb2NhdGlvbiAlZCwgbm93ICUwMngiLCBsb2NhdGlvbiwKKyAgICAgICAgICBkdmRlcGF5LT5oZWFkZXJfbWFzayk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChkdmRlcGF5LCAiZ290IGJsb2NrIGF0IGxvY2F0aW9uICVkIiwgbG9jYXRpb24pOworICAgIH0KKworICAgIGlmIChsb2NhdGlvbiAhPSAtMSkgeworICAgICAgLyogZ2V0IHRoZSBieXRlIG9mZnNldCBvZiB0aGUgZGlmIGJsb2NrICovCisgICAgICBvZmZzZXQgPSBsb2NhdGlvbiAqIDgwOworCisgICAgICAvKiBBbmQgY29weSBpdCBpbiwgcHJvdmlkZWQgdGhlIGxvY2F0aW9uIGlzIHNhbmUuICovCisgICAgICBpZiAob2Zmc2V0IDw9IGR2ZGVwYXktPmZyYW1lX3NpemUgLSA4MCkgeworICAgICAgICBtZW1jcHkgKG1hcC5kYXRhICsgb2Zmc2V0LCBwYXlsb2FkLCA4MCk7CisgICAgICAgIGdzdF9ydHBfY29weV9tZXRhIChHU1RfRUxFTUVOVF9DQVNUIChkdmRlcGF5KSwgZHZkZXBheS0+YWNjLAorICAgICAgICAgICAgcnRwLT5idWZmZXIsIDApOworICAgICAgfQorICAgIH0KKworICAgIHBheWxvYWQgKz0gODA7CisgICAgcGF5bG9hZF9sZW4gLT0gODA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoZHZkZXBheS0+YWNjLCAmbWFwKTsKKworICBpZiAobWFya2VyKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZHZkZXBheSwgIm1hcmtlciBiaXQgY29tcGxldGUgZnJhbWUgJXUiLCBydHBfdHMpOworICAgIC8qIG9ubHkgY29weSB0aGUgZnJhbWUgd2hlbiB3ZSBoYXZlIGEgY29tcGxldGUgaGVhZGVyICovCisgICAgaWYgKGR2ZGVwYXktPmhlYWRlcl9tYXNrID09IDB4M2YpIHsKKyAgICAgIC8qIFRoZSBtYXJrZXIgbWFya3MgdGhlIGVuZCBvZiBhIGZyYW1lIHRoYXQgd2UgbmVlZCB0byBwdXNoLiBUaGUgbmV4dCBmcmFtZQorICAgICAgICogd2lsbCBjaGFuZ2UgdGhlIHRpbWVzdGFtcCBidXQgd2Ugd29uJ3QgY29weSB0aGUgYWNjdW11bGF0b3IgYWdhaW4gYmVjYXVzZQorICAgICAgICogd2Ugc2V0IHRoZSBwcmV2X3RzIHRvIC0xLiAqLworICAgICAgb3V0ID0gZ3N0X2J1ZmZlcl9jb3B5IChkdmRlcGF5LT5hY2MpOworICAgICAgZ3N0X2J1ZmZlcl9mb3JlYWNoX21ldGEgKGR2ZGVwYXktPmFjYywgZm9yZWFjaF9tZXRhZGF0YV9kcm9wLCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkdmRlcGF5LCAid2FpdGluZyBmb3IgZnJhbWUgaGVhZGVycyAlMDJ4IiwKKyAgICAgICAgICBkdmRlcGF5LT5oZWFkZXJfbWFzayk7CisgICAgfQorICAgIGR2ZGVwYXktPnByZXZfdHMgPSAtMTsKKyAgfSBlbHNlIHsKKyAgICAvKiBzYXZlIGxhc3QgdGltZXN0YW1wICovCisgICAgZHZkZXBheS0+cHJldl90cyA9IHJ0cF90czsKKyAgfQorICByZXR1cm4gb3V0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9kdl9kZXBheV9yZXNldCAoR3N0UlRQRFZEZXBheSAqIGRlcGF5KQoreworICBpZiAoZGVwYXktPmFjYykKKyAgICBnc3RfYnVmZmVyX3VucmVmIChkZXBheS0+YWNjKTsKKyAgZGVwYXktPmFjYyA9IE5VTEw7CisKKyAgZGVwYXktPnByZXZfdHMgPSAtMTsKKyAgZGVwYXktPmhlYWRlcl9tYXNrID0gMDsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2R2X2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0UlRQRFZEZXBheSAqZGVwYXkgPSBHU1RfUlRQX0RWX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X3J0cF9kdl9kZXBheV9yZXNldCAoZGVwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0NBTExfUEFSRU5UX1dJVEhfREVGQVVMVCAoR1NUX0VMRU1FTlRfQ0xBU1MsIGNoYW5nZV9zdGF0ZSwKKyAgICAgIChlbGVtZW50LCB0cmFuc2l0aW9uKSwgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3J0cF9kdl9kZXBheV9yZXNldCAoZGVwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2R2X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwZHZkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9EVl9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwZHZkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZTViOTcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGR2ZGVwYXkuaApAQCAtMCwwICsxLDY2IEBACisvKiBGYXJzaWdodAorICogQ29weXJpZ2h0IChDKSAyMDA2IE1hcmNlbCBNb3JlYXV4IDxtYXJjZWxtQHNwYWNlbGFicy5ubD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUUlRQRFZERVBBWV9IX18KKyNkZWZpbmUgX19HU1RSVFBEVkRFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qICNkZWZpbmUncyBkb24ndCBsaWtlIHdoaXRlc3BhY2V5IGJpdHMgKi8KKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0RWX0RFUEFZIChnc3RfcnRwX2R2X2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfRFZfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfRFZfREVQQVksR3N0UlRQRFZEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfRFZfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0RWX0RFUEFZLEdzdFJUUERWRGVwYXkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0RWX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0RWX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9EVl9ERVBBWV9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0RWX0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUERWRGVwYXkgICAgICBHc3RSVFBEVkRlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUERWRGVwYXlDbGFzcyBHc3RSVFBEVkRlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UlRQRFZEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIHBhcmVudDsKKworICBHc3RCdWZmZXIgKmFjYzsKKyAgZ3VpbnQgZnJhbWVfc2l6ZTsKKyAgZ3VpbnQzMiBwcmV2X3RzOworICBndWludDggaGVhZGVyX21hc2s7CisKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IHJhdGVfbnVtLCByYXRlX2Rlbm9tOworfTsKKworc3RydWN0IF9Hc3RSVFBEVkRlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfZHZfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2R2X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RSVFBEVkRFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBkdnBheS5jIGIvZ3N0L3J0cC9nc3RydHBkdnBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MDg4MDYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGR2cGF5LmMKQEAgLTAsMCArMSwzOTcgQEAKKy8qIEZhcnNpZ2h0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWFyY2VsIE1vcmVhdXggPG1hcmNlbG1Ac3BhY2VsYWJzLm5sPgorICogICAgICAgICAgIChDKSAyMDA4IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCisjaW5jbHVkZSAiZ3N0cnRwZHZwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUlkgKHJ0cGR2cGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBkdnBheV9kZWJ1ZykKKworI2RlZmluZSBERUZBVUxUX01PREUgR1NUX0RWX1BBWV9NT0RFX1ZJREVPCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9NT0RFCit9OworCisvKiB0YWtlcyBib3RoIHN5c3RlbSBhbmQgbm9uLXN5c3RlbSBzdHJlYW1zICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9kdl9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWR2IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9kdl9wYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSB7IFwidmlkZW9cIiwgXCJhdWRpb1wiIH0gLCIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJEVlwiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsIgorICAgICAgICAiZW5jb2RlID0gKHN0cmluZykgeyBcIlNELVZDUi81MjUtNjBcIiwgXCJTRC1WQ1IvNjI1LTUwXCIsIFwiSEQtVkNSLzExMjUtNjBcIiwiCisgICAgICAgICJcIkhELVZDUi8xMjUwLTUwXCIsIFwiU0RMLVZDUi81MjUtNjBcIiwgXCJTREwtVkNSLzYyNS01MFwiLCIKKyAgICAgICAgIlwiMzA2TS81MjUtNjBcIiwgXCIzMDZNLzYyNS01MFwiLCBcIjMxNE0tMjUvNTI1LTYwXCIsIgorICAgICAgICAiXCIzMTRNLTI1LzYyNS01MFwiLCBcIjMxNE0tNTAvNTI1LTYwXCIsIFwiMzE0TS01MC82MjUtNTBcIiB9IgorICAgICAgICAvKiBvcHRpb25hbCBwYXJhbWV0ZXJzIGNhbid0IGdvIGluIHRoZSB0ZW1wbGF0ZQorICAgICAgICAgKiAiYXVkaW8gPSAoc3RyaW5nKSB7IFwiYnVuZGxlZFwiLCBcIm5vbmVcIiB9IgorICAgICAgICAgKi8KKyAgICApCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfZHZfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX2R2X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworI2RlZmluZSBHU1RfVFlQRV9EVl9QQVlfTU9ERSAoZ3N0X2R2X3BheV9tb2RlX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9kdl9wYXlfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGR2X3BheV9tb2RlX3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBkdl9wYXlfbW9kZXNbXSA9IHsKKyAgICB7R1NUX0RWX1BBWV9NT0RFX1ZJREVPLCAiVmlkZW8gb25seSIsICJ2aWRlbyJ9LAorICAgIHtHU1RfRFZfUEFZX01PREVfQlVORExFRCwgIlZpZGVvIGFuZCBBdWRpbyBidW5kbGVkIiwgImJ1bmRsZWQifSwKKyAgICB7R1NUX0RWX1BBWV9NT0RFX0FVRElPLCAiQXVkaW8gb25seSIsICJhdWRpbyJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIWR2X3BheV9tb2RlX3R5cGUpIHsKKyAgICBkdl9wYXlfbW9kZV90eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdERWUGF5TW9kZSIsIGR2X3BheV9tb2Rlcyk7CisgIH0KKyAgcmV0dXJuIGR2X3BheV9tb2RlX3R5cGU7Cit9CisKKworc3RhdGljIHZvaWQgZ3N0X2R2X3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfZHZfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworI2RlZmluZSBnc3RfcnRwX2R2X3BheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSVFBEVlBheSwgZ3N0X3J0cF9kdl9wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9kdl9wYXlfY2xhc3NfaW5pdCAoR3N0UlRQRFZQYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGR2cGF5X2RlYnVnLCAicnRwZHZwYXkiLCAwLCAiRFYgUlRQIFBheWxvYWRlciIpOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfZHZfcGF5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2R2X3BheV9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJtb2RlIiwgIk1vZGUiLAorICAgICAgICAgICJUaGUgcGF5bG9hZCBtb2RlIG9mIHBheWxvYWRpbmciLAorICAgICAgICAgIEdTVF9UWVBFX0RWX1BBWV9NT0RFLCBERUZBVUxUX01PREUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9kdl9wYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZHZfcGF5X3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlJUUCBEViBQYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZHMgRFYgaW50byBSVFAgcGFja2V0cyAoUkZDIDMxODkpIiwKKyAgICAgICJNYXJjZWwgTW9yZWF1eCA8bWFyY2VsbUBzcGFjZWxhYnMubmw+LCBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfZHZfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9kdl9wYXlfaGFuZGxlX2J1ZmZlcjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHZfcGF5X2luaXQgKEdzdFJUUERWUGF5ICogcnRwZHZwYXkpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZHZfcGF5X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSVFBEVlBheSAqcnRwZHZwYXkgPSBHU1RfUlRQX0RWX1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTU9ERToKKyAgICAgIHJ0cGR2cGF5LT5tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2R2X3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UlRQRFZQYXkgKnJ0cGR2cGF5ID0gR1NUX1JUUF9EVl9QQVkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgcnRwZHZwYXktPm1vZGUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfZHZfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIC8qIFdlIGRvbid0IGRvIGFueXRoaW5nIGhlcmUsIGJ1dCB3ZSBjb3VsZCBjaGVjayBpZiBpdCdzIGEgc3lzdGVtIHN0cmVhbSBhbmQgaWYKKyAgICogaXQncyBub3QsIGRlZmF1bHQgdG8gc2VuZGluZyB0aGUgdmlkZW8gb25seS4gV2Ugd2lsbCBuZWdvdGlhdGUgZG93bnN0cmVhbQorICAgKiBjYXBzIHdoZW4gd2UgZ2V0IHRvIHNlZSB0aGUgZmlyc3QgZnJhbWUuICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R2X3BheV9uZWdvdGlhdGUgKEdzdFJUUERWUGF5ICogcnRwZHZwYXksIGd1aW50OCAqIGRhdGEsIGdzaXplIHNpemUpCit7CisgIGNvbnN0IGdjaGFyICplbmNvZGUsICptZWRpYTsKKyAgZ2Jvb2xlYW4gYXVkaW9fYnVuZGxlZCwgcmVzOworCisgIGlmICgoZGF0YVszXSAmIDB4ODApID09IDApIHsgIC8qIERTRiBmbGFnICovCisgICAgLyogaXQncyBhbiBOVFNDIGZvcm1hdCAqLworICAgIGlmICgoZGF0YVs4MCAqIDUgKyA0OCArIDNdICYgMHg0KSAmJiAoZGF0YVs4MCAqIDUgKyA0OF0gPT0gMHg2MCkpIHsgLyogNDoyOjIgc2FtcGxpbmcgKi8KKyAgICAgIC8qIE5UU0MgNTBNYnBzICovCisgICAgICBlbmNvZGUgPSAiMzE0TS0yNS81MjUtNjAiOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiA0OjE6MSBzYW1wbGluZyAqLworICAgICAgLyogTlRTQyAyNU1icHMgKi8KKyAgICAgIGVuY29kZSA9ICJTRC1WQ1IvNTI1LTYwIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogaXQncyBhIFBBTCBmb3JtYXQgKi8KKyAgICBpZiAoKGRhdGFbODAgKiA1ICsgNDggKyAzXSAmIDB4NCkgJiYgKGRhdGFbODAgKiA1ICsgNDhdID09IDB4NjApKSB7IC8qIDQ6MjoyIHNhbXBsaW5nICovCisgICAgICAvKiBQQUwgNTBNYnBzICovCisgICAgICBlbmNvZGUgPSAiMzE0TS01MC82MjUtNTAiOworICAgIH0gZWxzZSBpZiAoKGRhdGFbNV0gJiAweDA3KSA9PSAwKSB7IC8qIEFQVCBmbGFnICovCisgICAgICAvKiBQQUwgMjVNYnBzIDQ6MjowICovCisgICAgICBlbmNvZGUgPSAiU0QtVkNSLzYyNS01MCI7CisgICAgfSBlbHNlCisgICAgICAvKiBQQUwgMjVNYnBzIDQ6MToxICovCisgICAgICBlbmNvZGUgPSAiMzE0TS0yNS82MjUtNTAiOworICB9CisKKyAgbWVkaWEgPSAidmlkZW8iOworICBhdWRpb19idW5kbGVkID0gRkFMU0U7CisKKyAgc3dpdGNoIChydHBkdnBheS0+bW9kZSkgeworICAgIGNhc2UgR1NUX0RWX1BBWV9NT0RFX0FVRElPOgorICAgICAgbWVkaWEgPSAiYXVkaW8iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRFZfUEFZX01PREVfQlVORExFRDoKKyAgICAgIGF1ZGlvX2J1bmRsZWQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwZHZwYXkpLCBtZWRpYSwKKyAgICAgIFRSVUUsICJEViIsIDkwMDAwKTsKKworICBpZiAoYXVkaW9fYnVuZGxlZCkgeworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwZHZwYXkpLAorICAgICAgICAiZW5jb2RlIiwgR19UWVBFX1NUUklORywgZW5jb2RlLAorICAgICAgICAiYXVkaW8iLCBHX1RZUEVfU1RSSU5HLCAiYnVuZGxlZCIsIE5VTEwpOworICB9IGVsc2UgeworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwZHZwYXkpLAorICAgICAgICAiZW5jb2RlIiwgR19UWVBFX1NUUklORywgZW5jb2RlLCBOVUxMKTsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2luY2x1ZGVfZGlmIChHc3RSVFBEVlBheSAqIHJ0cGR2cGF5LCBndWludDggKiBkYXRhKQoreworICBnaW50IGJsb2NrX3R5cGU7CisgIGdib29sZWFuIHJlczsKKworICBibG9ja190eXBlID0gZGF0YVswXSA+PiA1OworCisgIHN3aXRjaCAoYmxvY2tfdHlwZSkgeworICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgIC8qIEhlYWRlciBibG9jayAqLworICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgIC8qIFN1YmNvZGUgYmxvY2sgKi8KKyAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAvKiBWQVVYIGJsb2NrICovCisgICAgICAvKiBhbHdheXMgaW5jbHVkZSB0aGVzZSBibG9ja3MgKi8KKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAvKiBBdWRpbyBibG9jayAqLworICAgICAgLyogbmV2ZXIgaW5jbHVkZSBhdWRpbyBpZiB3ZSBhcmUgZG9pbmcgdmlkZW8gb25seSAqLworICAgICAgaWYgKHJ0cGR2cGF5LT5tb2RlID09IEdTVF9EVl9QQVlfTU9ERV9WSURFTykKKyAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICBlbHNlCisgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6ICAgICAgICAgICAgICAgICAgICAvKiBWaWRlbyBibG9jayAqLworICAgICAgLyogbmV2ZXIgaW5jbHVkZSB2aWRlbyBpZiB3ZSBhcmUgZG9pbmcgYXVkaW8gb25seSAqLworICAgICAgaWYgKHJ0cGR2cGF5LT5tb2RlID09IEdTVF9EVl9QQVlfTU9ERV9BVURJTykKKyAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICBlbHNlCisgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAvKiBTb21ldGhpbmcgYm9ndXMsIGp1c3QgaWdub3JlICovCisgICAgICByZXMgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKKy8qIEdldCBhIERWIGZyYW1lLCBjaG9wIGl0IHVwIGluIHBpZWNlcywgYW5kIHB1c2ggdGhlIHBpZWNlcyB0byB0aGUgUlRQIGxheWVyLgorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9kdl9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJUUERWUGF5ICpydHBkdnBheTsKKyAgZ3VpbnQgbWF4X3BheWxvYWRfc2l6ZTsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGdpbnQgaGRybGVuOworICBnc2l6ZSBzaXplOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4ICpkYXRhOworICBndWludDggKmRlc3Q7CisgIGd1aW50IGZpbGxlZDsKKyAgR3N0UlRQQnVmZmVyIHJ0cCA9IHsgTlVMTCwgfTsKKworICBydHBkdnBheSA9IEdTVF9SVFBfRFZfUEFZIChiYXNlcGF5bG9hZCk7CisKKyAgaGRybGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19oZWFkZXJfbGVuICgwKTsKKyAgLyogRFYgZnJhbWVzIGFyZSBtYWRlIHVwIGZyb20gYSBidW5jaCBvZiBESUYgYmxvY2tzLiBESUYgYmxvY2tzIGFyZSA4MCBieXRlcworICAgKiBlYWNoLCBhbmQgd2Ugc2hvdWxkIHB1dCBhbiBpbnRlZ3JhbCBudW1iZXIgb2YgdGhlbSBpbiBlYWNoIFJUUCBwYWNrZXQuCisgICAqIFRoZXJlZm9yZSwgd2Ugcm91bmQgdGhlIGF2YWlsYWJsZSByb29tIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgODAuCisgICAqCisgICAqIFRoZSBhdmFpbGFibGUgcm9vbSBpcyBqdXN0IHRoZSBwYWNrZXQgTVRVLCBtaW51cyB0aGUgUlRQIGhlYWRlciBsZW5ndGguICovCisgIG1heF9wYXlsb2FkX3NpemUgPSAoKEdTVF9SVFBfQkFTRV9QQVlMT0FEX01UVSAocnRwZHZwYXkpIC0gaGRybGVuKSAvIDgwKSAqIDgwOworCisgIC8qIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciB0byB0cmFuc21pdC4gKi8KKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpKSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHJ0cGR2cGF5LCBDT1JFLCBGQUlMRUQsCisgICAgICAgIChOVUxMKSwgKCJGYWlsZWQgdG8gbWFwIGJ1ZmZlciIpKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorICBkYXRhID0gbWFwLmRhdGE7CisgIHNpemUgPSBtYXAuc2l6ZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBkdnBheSwKKyAgICAgICJEViBSVFAgcGF5bG9hZGVyIGdvdCBidWZmZXIgb2YgJSIgR19HU0laRV9GT1JNQVQKKyAgICAgICIgYnl0ZXMsIHNwbGl0dGluZyBpbiAldSBieXRlICIgInBheWxvYWQgZnJhZ21lbnRzLCBhdCB0aW1lICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQsIHNpemUsIG1heF9wYXlsb2FkX3NpemUsCisgICAgICBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKSkpOworCisgIGlmICghcnRwZHZwYXktPm5lZ290aWF0ZWQpIHsKKyAgICBnc3RfZHZfcGF5X25lZ290aWF0ZSAocnRwZHZwYXksIGRhdGEsIHNpemUpOworICAgIC8qIGlmIHdlIGhhdmUgbm90IHlldCBzY2FubmVkIHRoZSBzdHJlYW0gZm9yIGl0cyB0eXBlLCBkbyBzbyBub3cgKi8KKyAgICBydHBkdnBheS0+bmVnb3RpYXRlZCA9IFRSVUU7CisgIH0KKworICBvdXRidWYgPSBOVUxMOworICBkZXN0ID0gTlVMTDsKKyAgZmlsbGVkID0gMDsKKworICAvKiB3aGlsZSB3ZSBoYXZlIGEgY29tcGxldGUgRElGIGNodW5rcyBsZWZ0ICovCisgIHdoaWxlIChzaXplID49IDgwKSB7CisgICAgLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyLCBzZXQgdGhlIHRpbWVzdGFtcCAqLworICAgIGlmIChvdXRidWYgPT0gTlVMTCkgeworICAgICAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChtYXhfcGF5bG9hZF9zaXplLCAwLCAwKTsKKyAgICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcik7CisKKyAgICAgIGlmICghZ3N0X3J0cF9idWZmZXJfbWFwIChvdXRidWYsIEdTVF9NQVBfV1JJVEUsICZydHApKSB7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1Zik7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChydHBkdnBheSwgQ09SRSwgRkFJTEVELAorICAgICAgICAgICAgKE5VTEwpLCAoIkZhaWxlZCB0byBtYXAgUlRQIGJ1ZmZlciIpKTsKKyAgICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICB9CisgICAgICBkZXN0ID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApOworICAgICAgZmlsbGVkID0gMDsKKyAgICB9CisKKyAgICAvKiBpbnNwZWN0IHRoZSBESUYgY2h1bmssIGlmIHdlIGRvbid0IG5lZWQgdG8gaW5jbHVkZSBpdCwgc2tpcCB0byB0aGUgbmV4dCBvbmUuICovCisgICAgaWYgKGluY2x1ZGVfZGlmIChydHBkdnBheSwgZGF0YSkpIHsKKyAgICAgIC8qIGNvcHkgZGF0YSBpbiBwYWNrZXQgKi8KKyAgICAgIG1lbWNweSAoZGVzdCwgZGF0YSwgODApOworCisgICAgICBkZXN0ICs9IDgwOworICAgICAgZmlsbGVkICs9IDgwOworICAgIH0KKworICAgIC8qIGdvIHRvIG5leHQgZGlmIGNodW5rICovCisgICAgc2l6ZSAtPSA4MDsKKyAgICBkYXRhICs9IDgwOworCisgICAgLyogcHVzaCBvdXQgdGhlIGJ1ZmZlciBpZiB0aGUgbmV4dCBvbmUgd291bGQgZXhjZWVkIHRoZSBtYXggcGFja2V0IHNpemUgb3IKKyAgICAgKiB3aGVuIHdlIGFyZSBwdXNoaW5nIHRoZSBsYXN0IHBhY2tldCAqLworICAgIGlmIChmaWxsZWQgKyA4MCA+IG1heF9wYXlsb2FkX3NpemUgfHwgc2l6ZSA8IDgwKSB7CisgICAgICBpZiAoc2l6ZSA8IDE2MCkgeworICAgICAgICBndWludCBobGVuOworCisgICAgICAgIC8qIHNldCBtYXJrZXIgKi8KKyAgICAgICAgZ3N0X3J0cF9idWZmZXJfc2V0X21hcmtlciAoJnJ0cCwgVFJVRSk7CisKKyAgICAgICAgLyogc2hyaW5rIGJ1ZmZlciB0byBsYXN0IHBhY2tldCAqLworICAgICAgICBobGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X2hlYWRlcl9sZW4gKCZydHApOworICAgICAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfcGFja2V0X2xlbiAoJnJ0cCwgaGxlbiArIGZpbGxlZCk7CisgICAgICB9CisKKyAgICAgIC8qIFB1c2ggb3V0IHRoZSBjcmVhdGVkIHBpZWNlLCBhbmQgY2hlY2sgZm9yIGVycm9ycy4gKi8KKyAgICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgICAgIGdzdF9ydHBfY29weV9tZXRhIChHU1RfRUxFTUVOVF9DQVNUIChiYXNlcGF5bG9hZCksIG91dGJ1ZiwgYnVmZmVyLCAwKTsKKyAgICAgIHJldCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKGJhc2VwYXlsb2FkLCBvdXRidWYpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIG91dGJ1ZiA9IE5VTEw7CisgICAgfQorICB9CisKK2JlYWNoOgorICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2R2X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGR2cGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX0RWX1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGR2cGF5LmggYi9nc3QvcnRwL2dzdHJ0cGR2cGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMyNTBhOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwZHZwYXkuaApAQCAtMCwwICsxLDY5IEBACisvKiBGYXJzaWdodAorICogQ29weXJpZ2h0IChDKSAyMDA2IE1hcmNlbCBNb3JlYXV4IDxtYXJjZWxtQHNwYWNlbGFicy5ubD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RSVFBEVlBBWV9IX18KKyNkZWZpbmUgX19HU1RSVFBEVlBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUERWUGF5IEdzdFJUUERWUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUERWUGF5Q2xhc3MgR3N0UlRQRFZQYXlDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfRFZfUEFZIFwKKyAgKGdzdF9ydHBfZHZfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfRFZfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0RWX1BBWSxHc3RSVFBEVlBheSkpCisjZGVmaW5lIEdTVF9SVFBfRFZfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9EVl9QQVksR3N0UlRQRFZQYXkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0RWX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9EVl9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0RWX1BBWV9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0RWX1BBWSkpCisKK3R5cGVkZWYgZW51bQoreworICBHU1RfRFZfUEFZX01PREVfVklERU8sCisgIEdTVF9EVl9QQVlfTU9ERV9CVU5ETEVELAorICBHU1RfRFZfUEFZX01PREVfQVVESU8KK30gR3N0RFZQYXlNb2RlOworCitzdHJ1Y3QgX0dzdFJUUERWUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisKKyAgZ2Jvb2xlYW4gbmVnb3RpYXRlZDsKKyAgR3N0RFZQYXlNb2RlIG1vZGU7Cit9OworCitzdHJ1Y3QgX0dzdFJUUERWUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX2R2X3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfZHZfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RSVFBEVlBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwZzcyMmRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGc3MjJkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMjVlZWYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGc3MjJkZXBheS5jCkBAIC0wLDAgKzEsMjYyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgImdzdHJ0cGc3MjJkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cGNoYW5uZWxzLmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwZzcyMmRlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBnNzIyZGVwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2c3MjJfZGVwYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby9HNzIyLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9nNzIyX2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIiAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAsICIKKyAgICAgICAgLyogImNoYW5uZWxzID0gKGludCkgWzEsIE1BWF0iICAqLworICAgICAgICAvKiAiY2hhbm5lbC1vcmRlciA9IChzdHJpbmcpIEFOWSIgKi8KKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkc3MjJcIjsiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9HNzIyX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgWyAxLCBNQVggXSIKKyAgICAgICAgLyogImNoYW5uZWxzID0gKGludCkgWzEsIE1BWF0iICovCisgICAgICAgIC8qICJlbXBoYXNpcyA9IChzdHJpbmcpIEFOWSIgKi8KKyAgICAgICAgLyogImNoYW5uZWwtb3JkZXIgPSAoc3RyaW5nKSBBTlkiICovCisgICAgKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF9nNzIyX2RlcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEc3MjJEZXBheSwgZ3N0X3J0cF9nNzIyX2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2c3MjJfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX2c3MjJfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nNzIyX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEc3MjJEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBnNzIyZGVwYXlfZGVidWcsICJydHBnNzIyZGVwYXkiLCAwLAorICAgICAgIkc3MjIgUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZzcyMl9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2c3MjJfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgYXVkaW8gZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIEc3MjIgYXVkaW8gZnJvbSBSVFAgcGFja2V0cyIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfZzcyMl9kZXBheV9zZXRjYXBzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX2c3MjJfZGVwYXlfcHJvY2VzczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZzcyMl9kZXBheV9pbml0IChHc3RSdHBHNzIyRGVwYXkgKiBydHBnNzIyZGVwYXkpCit7Cit9CisKK3N0YXRpYyBnaW50Citnc3RfcnRwX2c3MjJfZGVwYXlfcGFyc2VfaW50IChHc3RTdHJ1Y3R1cmUgKiBzdHJ1Y3R1cmUsIGNvbnN0IGdjaGFyICogZmllbGQsCisgICAgZ2ludCBkZWYpCit7CisgIGNvbnN0IGdjaGFyICpzdHI7CisgIGdpbnQgcmVzOworCisgIGlmICgoc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsIGZpZWxkKSkpCisgICAgcmV0dXJuIGF0b2kgKHN0cik7CisKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCBmaWVsZCwgJnJlcykpCisgICAgcmV0dXJuIHJlczsKKworICByZXR1cm4gZGVmOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfZzcyMl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdFJ0cEc3MjJEZXBheSAqcnRwZzcyMmRlcGF5OworICBnaW50IGNsb2NrX3JhdGUsIHBheWxvYWQsIHNhbXBsZXJhdGU7CisgIGdpbnQgY2hhbm5lbHM7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIGdib29sZWFuIHJlczsKKyNpZiAwCisgIGNvbnN0IGdjaGFyICpjaGFubmVsX29yZGVyOworICBjb25zdCBHc3RSVFBDaGFubmVsT3JkZXIgKm9yZGVyOworI2VuZGlmCisKKyAgcnRwZzcyMmRlcGF5ID0gR1NUX1JUUF9HNzIyX0RFUEFZIChkZXBheWxvYWQpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIHBheWxvYWQgPSA5NjsKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJwYXlsb2FkIiwgJnBheWxvYWQpOworICBzd2l0Y2ggKHBheWxvYWQpIHsKKyAgICBjYXNlIEdTVF9SVFBfUEFZTE9BRF9HNzIyOgorICAgICAgY2hhbm5lbHMgPSAxOworICAgICAgY2xvY2tfcmF0ZSA9IDgwMDA7CisgICAgICBzYW1wbGVyYXRlID0gMTYwMDA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogbm8gZml4ZWQgbWFwcGluZywgd2UgbmVlZCBjbG9jay1yYXRlICovCisgICAgICBjaGFubmVscyA9IDA7CisgICAgICBjbG9ja19yYXRlID0gMDsKKyAgICAgIHNhbXBsZXJhdGUgPSAwOworICAgICAgYnJlYWs7CisgIH0KKworICAvKiBjYXBzIGNhbiBvdmVyd3JpdGUgZGVmYXVsdHMgKi8KKyAgY2xvY2tfcmF0ZSA9CisgICAgICBnc3RfcnRwX2c3MjJfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgY2xvY2tfcmF0ZSk7CisgIGlmIChjbG9ja19yYXRlID09IDApCisgICAgZ290byBub19jbG9ja3JhdGU7CisKKyAgaWYgKGNsb2NrX3JhdGUgPT0gODAwMCkKKyAgICBzYW1wbGVyYXRlID0gMTYwMDA7CisKKyAgaWYgKHNhbXBsZXJhdGUgPT0gMCkKKyAgICBzYW1wbGVyYXRlID0gY2xvY2tfcmF0ZTsKKworICBjaGFubmVscyA9CisgICAgICBnc3RfcnRwX2c3MjJfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJlbmNvZGluZy1wYXJhbXMiLCBjaGFubmVscyk7CisgIGlmIChjaGFubmVscyA9PSAwKSB7CisgICAgY2hhbm5lbHMgPSBnc3RfcnRwX2c3MjJfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsIGNoYW5uZWxzKTsKKyAgICBpZiAoY2hhbm5lbHMgPT0gMCkgeworICAgICAgLyogY2hhbm5lbHMgZGVmYXVsdHMgdG8gMSBvdGhlcndpc2UgKi8KKyAgICAgIGNoYW5uZWxzID0gMTsKKyAgICB9CisgIH0KKworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworICBydHBnNzIyZGVwYXktPnJhdGUgPSBzYW1wbGVyYXRlOworICBydHBnNzIyZGVwYXktPmNoYW5uZWxzID0gY2hhbm5lbHM7CisKKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9HNzIyIiwKKyAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgc2FtcGxlcmF0ZSwgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgY2hhbm5lbHMsIE5VTEwpOworCisgIC8qIEZJWE1FOiBEbyBzb21ldGhpbmcgd2l0aCB0aGUgY2hhbm5lbCBvcmRlciAqLworI2lmIDAKKyAgLyogYWRkIGNoYW5uZWwgcG9zaXRpb25zICovCisgIGNoYW5uZWxfb3JkZXIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImNoYW5uZWwtb3JkZXIiKTsKKworICBvcmRlciA9IGdzdF9ydHBfY2hhbm5lbHNfZ2V0X2J5X29yZGVyIChjaGFubmVscywgY2hhbm5lbF9vcmRlcik7CisgIGlmIChvcmRlcikgeworICAgIGdzdF9hdWRpb19zZXRfY2hhbm5lbF9wb3NpdGlvbnMgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHNyY2NhcHMsIDApLAorICAgICAgICBvcmRlci0+cG9zKTsKKyAgfSBlbHNlIHsKKyAgICBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqcG9zOworCisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwZzcyMmRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIlVua25vd24gY2hhbm5lbCBvcmRlciAnJXMnIGZvciAlZCBjaGFubmVscyIsCisgICAgICAgICAgICBHU1RfU1RSX05VTEwgKGNoYW5uZWxfb3JkZXIpLCBjaGFubmVscykpOworICAgIC8qIGNyZWF0ZSBkZWZhdWx0IE5PTkUgbGF5b3V0ICovCisgICAgcG9zID0gZ3N0X3J0cF9jaGFubmVsc19jcmVhdGVfZGVmYXVsdCAoY2hhbm5lbHMpOworICAgIGdzdF9hdWRpb19zZXRfY2hhbm5lbF9wb3NpdGlvbnMgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHNyY2NhcHMsIDApLCBwb3MpOworICAgIGdfZnJlZSAocG9zKTsKKyAgfQorI2VuZGlmCisKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoZGVwYXlsb2FkLT5zcmNwYWQsIHNyY2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK25vX2Nsb2NrcmF0ZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlcGF5bG9hZCwgIm5vIGNsb2NrLXJhdGUgc3BlY2lmaWVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9nNzIyX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0UnRwRzcyMkRlcGF5ICpydHBnNzIyZGVwYXk7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBnaW50IHBheWxvYWRfbGVuOworICBnYm9vbGVhbiBtYXJrZXI7CisKKyAgcnRwZzcyMmRlcGF5ID0gR1NUX1JUUF9HNzIyX0RFUEFZIChkZXBheWxvYWQpOworCisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgIGlmIChwYXlsb2FkX2xlbiA8PSAwKQorICAgIGdvdG8gZW1wdHlfcGFja2V0OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGc3MjJkZXBheSwgImdvdCBwYXlsb2FkIG9mICVkIGJ5dGVzIiwgcGF5bG9hZF9sZW4pOworCisgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2J1ZmZlciAocnRwKTsKKyAgbWFya2VyID0gZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAocnRwKTsKKworICBpZiAobWFya2VyICYmIG91dGJ1ZikgeworICAgIC8qIG1hcmsgdGFsayBzcHVydCB3aXRoIFJFU1lOQyAqLworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1JFU1lOQyk7CisgIH0KKworICBpZiAob3V0YnVmKSB7CisgICAgZ3N0X3J0cF9kcm9wX25vbl9hdWRpb19tZXRhIChydHBnNzIyZGVwYXksIG91dGJ1Zik7CisgIH0KKworICByZXR1cm4gb3V0YnVmOworCisgIC8qIEVSUk9SUyAqLworZW1wdHlfcGFja2V0OgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwZzcyMmRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJFbXB0eSBQYXlsb2FkLiIpLCAoTlVMTCkpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2c3MjJfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBnNzIyZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfRzcyMl9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGc3MjJkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjZmZmEwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnNzIyZGVwYXkuaApAQCAtMCwwICsxLDY0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMTA+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfRzcyMl9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0c3MjJfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworLyogU3RhbmRhcmQgbWFjcm9zIGZvciBkZWZpbmluZyB0eXBlcyBmb3IgdGhpcyBlbGVtZW50LiAgKi8KKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0c3MjJfREVQQVkgXAorICAoZ3N0X3J0cF9nNzIyX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfRzcyMl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9HNzIyX0RFUEFZLEdzdFJ0cEc3MjJEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfRzcyMl9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfRzcyMl9ERVBBWSxHc3RSdHBHNzIyRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfRzcyMl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9HNzIyX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HNzIyX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HNzIyX0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEc3MjJEZXBheSBHc3RSdHBHNzIyRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwRzcyMkRlcGF5Q2xhc3MgR3N0UnRwRzcyMkRlcGF5Q2xhc3M7CisKKy8qIERlZmluaXRpb24gb2Ygc3RydWN0dXJlIHN0b3JpbmcgZGF0YSBmb3IgdGhpcyBlbGVtZW50LiAqLworc3RydWN0IF9Hc3RSdHBHNzIyRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisKKyAgZ3VpbnQgcmF0ZTsKKyAgZ3VpbnQgY2hhbm5lbHM7Cit9OworCisvKiBTdGFuZGFyZCBkZWZpbml0aW9uIGRlZmluaW5nIGEgY2xhc3MgZm9yIHRoaXMgZWxlbWVudC4gKi8KK3N0cnVjdCBfR3N0UnRwRzcyMkRlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfZzcyMl9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfZzcyMl9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9HNzIyX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBnNzIycGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGc3MjJwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGI3ZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnNzIycGF5LmMKQEAgLTAsMCArMSwyMzcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAxMD4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworI2luY2x1ZGUgImdzdHJ0cGc3MjJwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBjaGFubmVscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBnNzIycGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBnNzIycGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9nNzIyX3BheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL0c3MjIsICIgInJhdGUgPSAoaW50KSAxNjAwMCwgIiAiY2hhbm5lbHMgPSAoaW50KSAxIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9nNzIyX3BheV9zcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkc3MjJcIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0c3MjJfU1RSSU5HICIsICIKKyAgICAgICAgImVuY29kaW5nLXBhcmFtcyA9IChzdHJpbmcpIDEsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA4MDAwOyAiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkc3MjJcIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImVuY29kaW5nLXBhcmFtcyA9IChzdHJpbmcpIDEsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA4MDAwIikKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9nNzIyX3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfcnRwX2c3MjJfcGF5X2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcnRwcGF5bG9hZCwKKyAgICBHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBmaWx0ZXIpOworCisjZGVmaW5lIGdzdF9ydHBfZzcyMl9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwRzcyMlBheSwgZ3N0X3J0cF9nNzIyX3BheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9BVURJT19QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZzcyMl9wYXlfY2xhc3NfaW5pdCAoR3N0UnRwRzcyMlBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGc3MjJwYXlfZGVidWcsICJydHBnNzIycGF5IiwgMCwKKyAgICAgICJHNzIyIFJUUCBQYXlsb2FkZXIiKTsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2c3MjJfcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZzcyMl9wYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgYXVkaW8gcGF5bG9hZGVyIiwgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZC1lbmNvZGUgUmF3IGF1ZGlvIGludG8gUlRQIHBhY2tldHMgKFJGQyAzNTUxKSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2c3MjJfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5nZXRfY2FwcyA9IGdzdF9ydHBfZzcyMl9wYXlfZ2V0Y2FwczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZzcyMl9wYXlfaW5pdCAoR3N0UnRwRzcyMlBheSAqIHJ0cGc3MjJwYXkpCit7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgKnJ0cGJhc2VhdWRpb3BheWxvYWQ7CisKKyAgcnRwYmFzZWF1ZGlvcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9BVURJT19QQVlMT0FEIChydHBnNzIycGF5KTsKKworICBHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwZzcyMnBheSktPnB0ID0gR1NUX1JUUF9QQVlMT0FEX0c3MjI7CisKKyAgLyogdGVsbCBydHBiYXNlYXVkaW9wYXlsb2FkIHRoYXQgdGhpcyBpcyBhIHNhbXBsZSBiYXNlZCBjb2RlYyAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfc2FtcGxlX2Jhc2VkIChydHBiYXNlYXVkaW9wYXlsb2FkKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2c3MjJfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSdHBHNzIyUGF5ICpydHBnNzIycGF5OworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2ludCByYXRlLCBjaGFubmVscywgY2xvY2tfcmF0ZTsKKyAgZ2Jvb2xlYW4gcmVzOworICBnY2hhciAqcGFyYW1zOworI2lmIDAKKyAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gKnBvczsKKyAgY29uc3QgR3N0UlRQQ2hhbm5lbE9yZGVyICpvcmRlcjsKKyNlbmRpZgorICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkICpydHBiYXNlYXVkaW9wYXlsb2FkOworCisgIHJ0cGJhc2VhdWRpb3BheWxvYWQgPSBHU1RfUlRQX0JBU0VfQVVESU9fUEFZTE9BRCAoYmFzZXBheWxvYWQpOworICBydHBnNzIycGF5ID0gR1NUX1JUUF9HNzIyX1BBWSAoYmFzZXBheWxvYWQpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIC8qIGZpcnN0IHBhcnNlIGlucHV0IGNhcHMgKi8KKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgInJhdGUiLCAmcmF0ZSkpCisgICAgZ290byBub19yYXRlOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsICZjaGFubmVscykpCisgICAgZ290byBub19jaGFubmVsczsKKworICAvKiBGSVhNRTogRG8gc29tZXRoaW5nIHdpdGggdGhlIGNoYW5uZWwgcG9zaXRpb25zICovCisjaWYgMAorICAvKiBnZXQgdGhlIGNoYW5uZWwgb3JkZXIgKi8KKyAgcG9zID0gZ3N0X2F1ZGlvX2dldF9jaGFubmVsX3Bvc2l0aW9ucyAoc3RydWN0dXJlKTsKKyAgaWYgKHBvcykKKyAgICBvcmRlciA9IGdzdF9ydHBfY2hhbm5lbHNfZ2V0X2J5X3BvcyAoY2hhbm5lbHMsIHBvcyk7CisgIGVsc2UKKyAgICBvcmRlciA9IE5VTEw7CisjZW5kaWYKKworICAvKiBDbG9jayByYXRlIGlzIGFsd2F5cyA4MDAwIEh6IGZvciBHNzIyIGFjY29yZGluZyB0bworICAgKiBSRkMgMzU1MSBhbHRob3VnaCB0aGUgc2FtcGxpbmcgcmF0ZSBpcyAxNjAwMCBIeiAqLworICBjbG9ja19yYXRlID0gODAwMDsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAoYmFzZXBheWxvYWQsICJhdWRpbyIsCisgICAgICBiYXNlcGF5bG9hZC0+cHQgIT0gR1NUX1JUUF9QQVlMT0FEX0c3MjIsICJHNzIyIiwgY2xvY2tfcmF0ZSk7CisgIHBhcmFtcyA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgY2hhbm5lbHMpOworCisjaWYgMAorICBpZiAoIW9yZGVyICYmIGNoYW5uZWxzID4gMikgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cGc3MjJwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiVW5rbm93biBjaGFubmVsIG9yZGVyIGZvciAlZCBjaGFubmVscyIsIGNoYW5uZWxzKSk7CisgIH0KKworICBpZiAob3JkZXIgJiYgb3JkZXItPm5hbWUpIHsKKyAgICByZXMgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAoYmFzZXBheWxvYWQsCisgICAgICAgICJlbmNvZGluZy1wYXJhbXMiLCBHX1RZUEVfU1RSSU5HLCBwYXJhbXMsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsCisgICAgICAgIGNoYW5uZWxzLCAiY2hhbm5lbC1vcmRlciIsIEdfVFlQRV9TVFJJTkcsIG9yZGVyLT5uYW1lLCBOVUxMKTsKKyAgfSBlbHNlIHsKKyNlbmRpZgorICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChiYXNlcGF5bG9hZCwKKyAgICAgICAgImVuY29kaW5nLXBhcmFtcyIsIEdfVFlQRV9TVFJJTkcsIHBhcmFtcywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwKKyAgICAgICAgY2hhbm5lbHMsIE5VTEwpOworI2lmIDAKKyAgfQorI2VuZGlmCisKKyAgZ19mcmVlIChwYXJhbXMpOworI2lmIDAKKyAgZ19mcmVlIChwb3MpOworI2VuZGlmCisKKyAgcnRwZzcyMnBheS0+cmF0ZSA9IHJhdGU7CisgIHJ0cGc3MjJwYXktPmNoYW5uZWxzID0gY2hhbm5lbHM7CisKKyAgLyogYml0cy1wZXItc2FtcGxlIGlzIDQgKiBjaGFubmVscyBmb3IgRzcyMiwgYnV0IGFzIHRoZSBSVFAgY2xvY2sgcnVucyBhdAorICAgKiBoYWxmIHNwZWVkICg4IGluc3RlYWQgb2YgMTYga2h6KSwgcHJldGVuZCBpdCdzIDggYml0cyBwZXIgc2FtcGxlCisgICAqIGNoYW5uZWxzLiAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfc2FtcGxlYml0c19vcHRpb25zIChydHBiYXNlYXVkaW9wYXlsb2FkLAorICAgICAgOCAqIHJ0cGc3MjJwYXktPmNoYW5uZWxzKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworbm9fcmF0ZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGc3MjJwYXksICJubyByYXRlIGdpdmVuIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19jaGFubmVsczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGc3MjJwYXksICJubyBjaGFubmVscyBnaXZlbiIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfcnRwX2c3MjJfcGF5X2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcnRwcGF5bG9hZCwgR3N0UGFkICogcGFkLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKm90aGVycGFkY2FwczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBvdGhlcnBhZGNhcHMgPSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKHJ0cHBheWxvYWQtPnNyY3BhZCk7CisgIGNhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAocGFkKTsKKworICBpZiAob3RoZXJwYWRjYXBzKSB7CisgICAgaWYgKCFnc3RfY2Fwc19pc19lbXB0eSAob3RoZXJwYWRjYXBzKSkgeworICAgICAgY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGNhcHMpOworICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMSwgTlVMTCk7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAicmF0ZSIsIEdfVFlQRV9JTlQsIDE2MDAwLCBOVUxMKTsKKyAgICB9CisgICAgZ3N0X2NhcHNfdW5yZWYgKG90aGVycGFkY2Fwcyk7CisgIH0KKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqdG1wOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwcGF5bG9hZCwgIkludGVyc2VjdCAlIiBHU1RfUFRSX0ZPUk1BVCAiIGFuZCBmaWx0ZXIgJSIKKyAgICAgICAgR1NUX1BUUl9GT1JNQVQsIGNhcHMsIGZpbHRlcik7CisgICAgdG1wID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgY2FwcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgY2FwcyA9IHRtcDsKKyAgfQorCisgIHJldHVybiBjYXBzOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9nNzIyX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGc3MjJwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfRzcyMl9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBnNzIycGF5LmggYi9nc3QvcnRwL2dzdHJ0cGc3MjJwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjM4Mjg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnNzIycGF5LmgKQEAgLTAsMCArMSw2MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDEwPiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0c3MjJfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfRzcyMl9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlYXVkaW9wYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfRzcyMl9QQVkgXAorICAoZ3N0X3J0cF9nNzIyX3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0c3MjJfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjJfUEFZLEdzdFJ0cEc3MjJQYXkpKQorI2RlZmluZSBHU1RfUlRQX0c3MjJfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HNzIyX1BBWSxHc3RSdHBHNzIyUGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0c3MjJfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjJfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HNzIyX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfRzcyMl9QQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwRzcyMlBheSBHc3RSdHBHNzIyUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEc3MjJQYXlDbGFzcyBHc3RSdHBHNzIyUGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwRzcyMlBheQoreworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkIHBheWxvYWQ7CisKKyAgZ2ludCByYXRlOworICBnaW50IGNoYW5uZWxzOworfTsKKworc3RydWN0IF9Hc3RSdHBHNzIyUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfZzcyMl9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2c3MjJfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0c3MjJfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBnNzIzZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwZzcyM2RlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxZDlhZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwZzcyM2RlcGF5LmMKQEAgLTAsMCArMSwyMjMgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMTA+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0cnRwZzcyM2RlcGF5LmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cGc3MjNkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwZzcyM2RlcGF5X2RlYnVnKQorCisKKy8qIHJlZmVyZW5jZXM6CisgKgorICogUkZDIDM1NTEgKDQuNS4zKQorICovCisKK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAKK307CisKKy8qIGlucHV0IGlzIGFuIFJUUCBwYWNrZXQKKyAqCisgKi8KK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2c3MjNfZGVwYXlfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiRzcyM1wiOyAiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9HNzIzX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfZzcyM19kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL0c3MjMsICIgImNoYW5uZWxzID0gKGludCkgMSwiICJyYXRlID0gKGludCkgODAwMCIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfZzcyM19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfZzcyM19kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CisKKyNkZWZpbmUgZ3N0X3J0cF9nNzIzX2RlcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEc3MjNEZXBheSwgZ3N0X3J0cF9nNzIzX2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2c3MjNfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UnRwRzcyM0RlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGc3MjNkZXBheV9kZWJ1ZywgInJ0cGc3MjNkZXBheSIsIDAsCisgICAgICAiRy43MjMgUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZzcyM19kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2c3MjNfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgRy43MjMgZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIEcuNzIzIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAzNTUxKSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX2c3MjNfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2c3MjNfZGVwYXlfc2V0Y2FwczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZzcyM19kZXBheV9pbml0IChHc3RSdHBHNzIzRGVwYXkgKiBydHBnNzIzZGVwYXkpCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgKmRlcGF5bG9hZDsKKworICBkZXBheWxvYWQgPSBHU1RfUlRQX0JBU0VfREVQQVlMT0FEIChydHBnNzIzZGVwYXkpOworCisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2c3MjNfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBHc3RDYXBzICpzcmNjYXBzOworICBHc3RSdHBHNzIzRGVwYXkgKnJ0cGc3MjNkZXBheTsKKyAgY29uc3QgZ2NoYXIgKnBhcmFtczsKKyAgZ2ludCBjbG9ja19yYXRlLCBjaGFubmVsczsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIHJ0cGc3MjNkZXBheSA9IEdTVF9SVFBfRzcyM19ERVBBWSAoZGVwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoIShwYXJhbXMgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImVuY29kaW5nLXBhcmFtcyIpKSkKKyAgICBjaGFubmVscyA9IDE7CisgIGVsc2UgeworICAgIGNoYW5uZWxzID0gYXRvaSAocGFyYW1zKTsKKyAgfQorCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA4MDAwOworCisgIGlmIChjaGFubmVscyAhPSAxKQorICAgIGdvdG8gd3JvbmdfY2hhbm5lbHM7CisKKyAgaWYgKGNsb2NrX3JhdGUgIT0gODAwMCkKKyAgICBnb3RvIHdyb25nX2Nsb2NrX3JhdGU7CisKKyAgZGVwYXlsb2FkLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL0c3MjMiLAorICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgY2hhbm5lbHMsICJyYXRlIiwgR19UWVBFX0lOVCwgY2xvY2tfcmF0ZSwgTlVMTCk7CisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCit3cm9uZ19jaGFubmVsczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGc3MjNkZXBheSwgImV4cGVjdGVkIDEgY2hhbm5lbCwgZ290ICVkIiwgY2hhbm5lbHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQord3JvbmdfY2xvY2tfcmF0ZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGc3MjNkZXBheSwgImV4cGVjdGVkIDgwMDAgY2xvY2stcmF0ZSwgZ290ICVkIiwKKyAgICAgICAgY2xvY2tfcmF0ZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX2c3MjNfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBHNzIzRGVwYXkgKnJ0cGc3MjNkZXBheTsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBnaW50IHBheWxvYWRfbGVuOworICBnYm9vbGVhbiBtYXJrZXI7CisKKyAgcnRwZzcyM2RlcGF5ID0gR1NUX1JUUF9HNzIzX0RFUEFZIChkZXBheWxvYWQpOworCisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgIC8qIEF0IGxlYXN0IDQgYnl0ZXMgKi8KKyAgaWYgKHBheWxvYWRfbGVuIDwgNCkKKyAgICBnb3RvIHRvb19zbWFsbDsKKworICBHU1RfTE9HX09CSkVDVCAocnRwZzcyM2RlcGF5LCAicGF5bG9hZCBsZW4gJWQiLCBwYXlsb2FkX2xlbik7CisKKyAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfYnVmZmVyIChydHApOworICBtYXJrZXIgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApOworCisgIGlmIChtYXJrZXIpIHsKKyAgICAvKiBtYXJrZXIgYml0IHN0YXJ0cyB0YWxrc3B1cnQgKi8KKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19SRVNZTkMpOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlcGF5bG9hZCwgInB1c2hpbmcgYnVmZmVyIG9mIHNpemUgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWYpKTsKKworICByZXR1cm4gb3V0YnVmOworCisgIC8qIEVSUk9SUyAqLwordG9vX3NtYWxsOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwZzcyM2RlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkc3MjMgUlRQIHBheWxvYWQgdG9vIHNtYWxsICglZCkiLCBwYXlsb2FkX2xlbikpOworICAgIGdvdG8gYmFkX3BhY2tldDsKKyAgfQorYmFkX3BhY2tldDoKKyAgeworICAgIC8qIG5vIGZhdGFsIGVycm9yICovCisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfZzcyM19kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGc3MjNkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9HNzIzX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwZzcyM2RlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cGc3MjNkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOTQyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGc3MjNkZXBheS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMTA+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfRzcyM19ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0c3MjNfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfRzcyM19ERVBBWSBcCisgIChnc3RfcnRwX2c3MjNfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9HNzIzX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjNfREVQQVksR3N0UnRwRzcyM0RlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9HNzIzX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HNzIzX0RFUEFZLEdzdFJ0cEc3MjNEZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HNzIzX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjNfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0c3MjNfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0c3MjNfREVQQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwRzcyM0RlcGF5IEdzdFJ0cEc3MjNEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBHNzIzRGVwYXlDbGFzcyBHc3RSdHBHNzIzRGVwYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBHNzIzRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cEc3MjNEZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX2c3MjNfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2c3MjNfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfRzcyM19ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwZzcyM3BheS5jIGIvZ3N0L3J0cC9nc3RydHBnNzIzcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I2ZGZmNQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwZzcyM3BheS5jCkBAIC0wLDAgKzEsMzA3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBDb2xsYWJvcmEgTHRkCisgKiAgQGF1dGhvcjogT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RydHBnNzIzcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworI2RlZmluZSBHNzIzX0ZSQU1FX0RVUkFUSU9OICgzMCAqIEdTVF9NU0VDT05EKQorCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9nNzIzX3BheV9zZXRfY2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfZzcyM19wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKgorICAgIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2c3MjNfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8vRzcyMywgIiAgICAgLyogYWNjb3JkaW5nIHRvIFJGQyAzNTUxICovCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgInJhdGUgPSAoaW50KSA4MDAwIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9nNzIzX3BheV9zcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9HNzIzX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiRzcyM1wiOyAiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiRzcyM1wiIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2c3MjNfcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfZzcyM19wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworI2RlZmluZSBnc3RfcnRwX2c3MjNfcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJUUEc3MjNQYXksIGdzdF9ydHBfZzcyM19wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nNzIzX3BheV9jbGFzc19pbml0IChHc3RSVFBHNzIzUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKnBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX2c3MjNfcGF5X2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfZzcyM19wYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZzcyM19wYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZzcyM19wYXlfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBHLjcyMyBwYXlsb2FkZXIiLCAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYWNrZXRpemUgRy43MjMgYXVkaW8gaW50byBSVFAgcGFja2V0cyIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfZzcyM19wYXlfc2V0X2NhcHM7CisgIHBheWxvYWRfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX2c3MjNfcGF5X2hhbmRsZV9idWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2c3MjNfcGF5X2luaXQgKEdzdFJUUEc3MjNQYXkgKiBwYXkpCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkICpwYXlsb2FkID0gR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHBheSk7CisKKyAgcGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworCisgIHBheWxvYWQtPnB0ID0gR1NUX1JUUF9QQVlMT0FEX0c3MjM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2c3MjNfcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSVFBHNzIzUGF5ICpwYXk7CisKKyAgcGF5ID0gR1NUX1JUUF9HNzIzX1BBWSAob2JqZWN0KTsKKworICBnX29iamVjdF91bnJlZiAocGF5LT5hZGFwdGVyKTsKKyAgcGF5LT5hZGFwdGVyID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2c3MjNfcGF5X3NldF9jYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBnYm9vbGVhbiByZXM7CisKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHBheWxvYWQsICJhdWRpbyIsCisgICAgICBwYXlsb2FkLT5wdCAhPSBHU1RfUlRQX1BBWUxPQURfRzcyMywgIkc3MjMiLCA4MDAwKTsKKyAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsIE5VTEwpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2c3MjNfcGF5X2ZsdXNoIChHc3RSVFBHNzIzUGF5ICogcGF5KQoreworICBHc3RCdWZmZXIgKm91dGJ1ZiwgKnBheWxvYWRfYnVmOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ3VpbnQgYXZhaWw7CisgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwgfTsKKworICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocGF5LT5hZGFwdGVyKTsKKworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKDAsIDAsIDApOworCisgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0YnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKworICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA9IHBheS0+dGltZXN0YW1wOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gcGF5LT5kdXJhdGlvbjsKKworICAvKiBjb3B5IEc3MjMgZGF0YSBhcyBwYXlsb2FkICovCisgIHBheWxvYWRfYnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXJfZmFzdCAocGF5LT5hZGFwdGVyLCBhdmFpbCk7CisKKyAgcGF5LT50aW1lc3RhbXAgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBwYXktPmR1cmF0aW9uID0gMDsKKworICAvKiBzZXQgZGlzY29udCBhbmQgbWFya2VyICovCisgIGlmIChwYXktPmRpc2NvbnQpIHsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBUUlVFKTsKKyAgICBwYXktPmRpc2NvbnQgPSBGQUxTRTsKKyAgfQorICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisgIGdzdF9ydHBfY29weV9hdWRpb19tZXRhIChwYXksIG91dGJ1ZiwgcGF5bG9hZF9idWYpOworCisgIG91dGJ1ZiA9IGdzdF9idWZmZXJfYXBwZW5kIChvdXRidWYsIHBheWxvYWRfYnVmKTsKKworICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoIChHU1RfUlRQX0JBU0VfUEFZTE9BRCAocGF5KSwgb3V0YnVmKTsKKworICByZXR1cm4gcmV0OworfQorCisvKiAwMCAgICBoaWdoLXJhdGUgc3BlZWNoICg2LjMga2IvcykgICAgICAgICAgICAyNAorICogMDEgICAgbG93LXJhdGUgc3BlZWNoICAoNS4zIGtiL3MpICAgICAgICAgICAgMjAKKyAqIDEwICAgIFNJRCBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisgKiAxMSAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgKi8KK3N0YXRpYyBjb25zdCBndWludCBzaXplX3RhYls0XSA9IHsKKyAgMjQsIDIwLCA0LCAwCit9OworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9nNzIzX3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCBIRFI7CisgIEdzdFJUUEc3MjNQYXkgKnBheTsKKyAgR3N0Q2xvY2tUaW1lIHBhY2tldF9kdXIsIHRpbWVzdGFtcDsKKyAgZ3VpbnQgcGF5bG9hZF9sZW4sIHBhY2tldF9sZW47CisKKyAgcGF5ID0gR1NUX1JUUF9HNzIzX1BBWSAocGF5bG9hZCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9QVFMgKGJ1Zik7CisKKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAoYnVmKSkgeworICAgIC8qIGZsdXNoIGV2ZXJ5dGhpbmcgb24gZGlzY29udCAqLworICAgIGdzdF9hZGFwdGVyX2NsZWFyIChwYXktPmFkYXB0ZXIpOworICAgIHBheS0+dGltZXN0YW1wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICBwYXktPmR1cmF0aW9uID0gMDsKKyAgICBwYXktPmRpc2NvbnQgPSBUUlVFOworICB9CisKKyAgLyogc2hvdWxkIGJlIG9uZSBvZiB0aGVzZSBzaXplcyAqLworICBpZiAobWFwLnNpemUgIT0gNCAmJiBtYXAuc2l6ZSAhPSAyMCAmJiBtYXAuc2l6ZSAhPSAyNCkKKyAgICBnb3RvIGludmFsaWRfc2l6ZTsKKworICAvKiBjaGVjayBzaXplIGJ5IGxvb2tpbmcgYXQgdGhlIGhlYWRlciBiaXRzICovCisgIEhEUiA9IG1hcC5kYXRhWzBdICYgMHgzOworICBpZiAoc2l6ZV90YWJbSERSXSAhPSBtYXAuc2l6ZSkKKyAgICBnb3RvIHdyb25nX3NpemU7CisKKyAgLyogY2FsY3VsYXRlIHBhY2tldCBzaXplIGFuZCBkdXJhdGlvbiAqLworICBwYXlsb2FkX2xlbiA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocGF5LT5hZGFwdGVyKSArIG1hcC5zaXplOworICBwYWNrZXRfZHVyID0gcGF5LT5kdXJhdGlvbiArIEc3MjNfRlJBTUVfRFVSQVRJT047CisgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKHBheWxvYWRfbGVuLCAwLCAwKTsKKworICBpZiAoZ3N0X3J0cF9iYXNlX3BheWxvYWRfaXNfZmlsbGVkIChwYXlsb2FkLCBwYWNrZXRfbGVuLCBwYWNrZXRfZHVyKSkgeworICAgIC8qIHNpemUgb3IgZHVyYXRpb24gd291bGQgb3ZlcmZsb3cgdGhlIHBhY2tldCwgZmx1c2ggdGhlIHF1ZXVlZCBkYXRhICovCisgICAgcmV0ID0gZ3N0X3J0cF9nNzIzX3BheV9mbHVzaCAocGF5KTsKKyAgfQorCisgIC8qIHVwZGF0ZSB0aW1lc3RhbXAsIHdlIGtlZXAgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIGZpcnN0IHBhY2tldCBpbiB0aGUgYWRhcHRlcgorICAgKiBidXQgYXJlIGFibGUgdG8gY2FsY3VsYXRlIGl0IGZyb20gbmV4dCBwYWNrZXRzLiAqLworICBpZiAodGltZXN0YW1wICE9IEdTVF9DTE9DS19USU1FX05PTkUgJiYgcGF5LT50aW1lc3RhbXAgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgIGlmICh0aW1lc3RhbXAgPiBwYXktPmR1cmF0aW9uKQorICAgICAgcGF5LT50aW1lc3RhbXAgPSB0aW1lc3RhbXAgLSBwYXktPmR1cmF0aW9uOworICAgIGVsc2UKKyAgICAgIHBheS0+dGltZXN0YW1wID0gMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIC8qIGFkZCBwYWNrZXQgdG8gdGhlIHF1ZXVlICovCisgIGdzdF9hZGFwdGVyX3B1c2ggKHBheS0+YWRhcHRlciwgYnVmKTsKKyAgcGF5LT5kdXJhdGlvbiA9IHBhY2tldF9kdXI7CisKKyAgLyogY2hlY2sgaWYgd2UgY2FuIGZsdXNoIG5vdyAqLworICBpZiAocGF5LT5kdXJhdGlvbiA+PSBwYXlsb2FkLT5taW5fcHRpbWUpIHsKKyAgICByZXQgPSBnc3RfcnRwX2c3MjNfcGF5X2ZsdXNoIChwYXkpOworICB9CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBXQVJOSU5HUyAqLworaW52YWxpZF9zaXplOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocGF5LCBTVFJFQU0sIFdST05HX1RZUEUsCisgICAgICAgICgiSW52YWxpZCBpbnB1dCBidWZmZXIgc2l6ZSIpLAorICAgICAgICAoIklucHV0IHNpemUgc2hvdWxkIGJlIDQsIDIwIG9yIDI0LCBnb3QgJSIgR19HU0laRV9GT1JNQVQsIG1hcC5zaXplKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQord3Jvbmdfc2l6ZToKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHBheSwgU1RSRUFNLCBXUk9OR19UWVBFLAorICAgICAgICAoIldyb25nIGlucHV0IGJ1ZmZlciBzaXplIiksCisgICAgICAgICgiRXhwZWN0ZWQgaW5wdXQgYnVmZmVyIHNpemUgJXUgYnV0IGdvdCAlIiBHX0dTSVpFX0ZPUk1BVCwKKyAgICAgICAgICAgIHNpemVfdGFiW0hEUl0sIG1hcC5zaXplKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfZzcyM19wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RSVFBHNzIzUGF5ICpwYXk7CisKKyAgcGF5ID0gR1NUX1JUUF9HNzIzX1BBWSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChwYXktPmFkYXB0ZXIpOworICAgICAgcGF5LT50aW1lc3RhbXAgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgcGF5LT5kdXJhdGlvbiA9IDA7CisgICAgICBwYXktPmRpc2NvbnQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChwYXktPmFkYXB0ZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLypQbHVnaW4gaW5pdCBmdW5jdGlvbnMqLworZ2Jvb2xlYW4KK2dzdF9ydHBfZzcyM19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBnNzIzcGF5IiwgR1NUX1JBTktfU0VDT05EQVJZLAorICAgICAgZ3N0X3J0cF9nNzIzX3BheV9nZXRfdHlwZSAoKSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGc3MjNwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwZzcyM3BheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ODA3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGc3MjNwYXkuaApAQCAtMCwwICsxLDY0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBDb2xsYWJvcmEgTHRkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfRzcyM19QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9HNzIzX1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VhdWRpb3BheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9HNzIzX1BBWSBcCisgIChnc3RfcnRwX2c3MjNfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfRzcyM19QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfRzcyM19QQVksR3N0UlRQRzcyM1BheSkpCisjZGVmaW5lIEdTVF9SVFBfRzcyM19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0c3MjNfUEFZLEdzdFJUUEc3MjNQYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfRzcyM19QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfRzcyM19QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0c3MjNfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HNzIzX1BBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBHNzIzUGF5IEdzdFJUUEc3MjNQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQRzcyM1BheUNsYXNzIEdzdFJUUEc3MjNQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSVFBHNzIzUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisKKyAgR3N0QWRhcHRlciAgKmFkYXB0ZXI7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKyAgZ2Jvb2xlYW4gZGlzY29udDsKK307CisKK3N0cnVjdCBfR3N0UlRQRzcyM1BheUNsYXNzCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9nNzIzX3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfZzcyM19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfRzcyM19QQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWYxOTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuYwpAQCAtMCwwICsxLDM5MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA1IFplZXNoYW4gQWxpIDx6ZWVuaXhAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA4IEF4aXMgQ29tbXVuaWNhdGlvbnMgPGRldi1nc3RyZWFtZXJAYXhpcy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RydHBnNzI2ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBnNzI2ZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cGc3MjZkZXBheV9kZWJ1ZykKKworI2RlZmluZSBERUZBVUxUX0JJVF9SQVRFIDMyMDAwCisjZGVmaW5lIERFRkFVTFRfQkxPQ0tfQUxJR04gNAorI2RlZmluZSBTQU1QTEVfUkFURSA4MDAwCisjZGVmaW5lIExBWU9VVF9HNzI2ICJnNzI2IgorCisvKiBSdHBHNzI2RGVwYXkgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCisjZGVmaW5lIERFRkFVTFRfRk9SQ0VfQUFMMglUUlVFCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0ZPUkNFX0FBTDIKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2c3MjZfZGVwYXlfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgeyBcIkc3MjZcIiwgXCJHNzI2LTE2XCIsIFwiRzcyNi0yNFwiLCBcIkc3MjYtMzJcIiwgXCJHNzI2LTQwXCIsICIKKyAgICAgICAgIlwiQUFMMi1HNzI2LTE2XCIsIFwiQUFMMi1HNzI2LTI0XCIsIFwiQUFMMi1HNzI2LTMyXCIsIFwiQUFMMi1HNzI2LTQwXCIgfSwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDA7IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9nNzI2X2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1hZHBjbSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiCisgICAgICAgICJyYXRlID0gKGludCkgODAwMCwgIgorICAgICAgICAiYml0cmF0ZSA9IChpbnQpIHsgMTYwMDAsIDI0MDAwLCAzMjAwMCwgNDAwMDAgfSwgIgorICAgICAgICAiYmxvY2tfYWxpZ24gPSAoaW50KSB7IDIsIDMsIDQsIDUgfSwgIiAibGF5b3V0ID0gKHN0cmluZykgXCJnNzI2XCIiKQorICAgICk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfZzcyNl9kZXBheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2c3MjZfZGVwYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX2c3MjZfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfZzcyNl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworI2RlZmluZSBnc3RfcnRwX2c3MjZfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwRzcyNkRlcGF5LCBnc3RfcnRwX2c3MjZfZGVwYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZzcyNl9kZXBheV9jbGFzc19pbml0IChHc3RSdHBHNzI2RGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBnNzI2ZGVwYXlfZGVidWcsICJydHBnNzI2ZGVwYXkiLCAwLAorICAgICAgIkcuNzI2IFJUUCBEZXBheWxvYWRlciIpOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9nNzI2X2RlcGF5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9nNzI2X2RlcGF5X2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0ZPUkNFX0FBTDIsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImZvcmNlLWFhbDIiLCAiRm9yY2UgQUFMMiIsCisgICAgICAgICAgIkZvcmNlIEFBTDIgZGVjb2RpbmcgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBiYWQgcGF5bG9hZGVycyIsCisgICAgICAgICAgREVGQVVMVF9GT1JDRV9BQUwyLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2c3MjZfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9nNzI2X2RlcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIEcuNzI2IGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBHLjcyNiBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIiwKKyAgICAgICJBeGlzIENvbW11bmljYXRpb25zIDxkZXYtZ3N0cmVhbWVyQGF4aXMuY29tPiIpOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfZzcyNl9kZXBheV9wcm9jZXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfZzcyNl9kZXBheV9zZXRjYXBzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nNzI2X2RlcGF5X2luaXQgKEdzdFJ0cEc3MjZEZXBheSAqIHJ0cEc3MjZkZXBheSkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCAqZGVwYXlsb2FkOworCisgIGRlcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9ERVBBWUxPQUQgKHJ0cEc3MjZkZXBheSk7CisKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKGRlcGF5bG9hZCkpOworCisgIHJ0cEc3MjZkZXBheS0+Zm9yY2VfYWFsMiA9IERFRkFVTFRfRk9SQ0VfQUFMMjsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2c3MjZfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnYm9vbGVhbiByZXQ7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgY29uc3QgZ2NoYXIgKmVuY29kaW5nX25hbWU7CisgIEdzdFJ0cEc3MjZEZXBheSAqZGVwYXk7CisKKyAgZGVwYXkgPSBHU1RfUlRQX0c3MjZfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDgwMDA7ICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgZGVwYXlsb2FkLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICBkZXBheS0+YWFsMiA9IEZBTFNFOworICBlbmNvZGluZ19uYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJlbmNvZGluZy1uYW1lIik7CisgIGlmIChlbmNvZGluZ19uYW1lID09IE5VTEwgfHwgZ19hc2NpaV9zdHJjYXNlY21wIChlbmNvZGluZ19uYW1lLCAiRzcyNiIpID09IDApIHsKKyAgICBkZXBheS0+Yml0cmF0ZSA9IERFRkFVTFRfQklUX1JBVEU7CisgICAgZGVwYXktPmJsb2NrX2FsaWduID0gREVGQVVMVF9CTE9DS19BTElHTjsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZ19zdHJfaGFzX3ByZWZpeCAoZW5jb2RpbmdfbmFtZSwgIkFBTDItIikpIHsKKyAgICAgIGRlcGF5LT5hYWwyID0gVFJVRTsKKyAgICAgIGVuY29kaW5nX25hbWUgKz0gNTsKKyAgICB9CisgICAgaWYgKGdfYXNjaWlfc3RyY2FzZWNtcCAoZW5jb2RpbmdfbmFtZSwgIkc3MjYtMTYiKSA9PSAwKSB7CisgICAgICBkZXBheS0+Yml0cmF0ZSA9IDE2MDAwOworICAgICAgZGVwYXktPmJsb2NrX2FsaWduID0gMjsKKyAgICB9IGVsc2UgaWYgKGdfYXNjaWlfc3RyY2FzZWNtcCAoZW5jb2RpbmdfbmFtZSwgIkc3MjYtMjQiKSA9PSAwKSB7CisgICAgICBkZXBheS0+Yml0cmF0ZSA9IDI0MDAwOworICAgICAgZGVwYXktPmJsb2NrX2FsaWduID0gMzsKKyAgICB9IGVsc2UgaWYgKGdfYXNjaWlfc3RyY2FzZWNtcCAoZW5jb2RpbmdfbmFtZSwgIkc3MjYtMzIiKSA9PSAwKSB7CisgICAgICBkZXBheS0+Yml0cmF0ZSA9IDMyMDAwOworICAgICAgZGVwYXktPmJsb2NrX2FsaWduID0gNDsKKyAgICB9IGVsc2UgaWYgKGdfYXNjaWlfc3RyY2FzZWNtcCAoZW5jb2RpbmdfbmFtZSwgIkc3MjYtNDAiKSA9PSAwKSB7CisgICAgICBkZXBheS0+Yml0cmF0ZSA9IDQwMDAwOworICAgICAgZGVwYXktPmJsb2NrX2FsaWduID0gNTsKKyAgICB9IGVsc2UKKyAgICAgIGdvdG8gdW5rbm93bl9lbmNvZGluZzsKKyAgfQorCisgIEdTVF9ERUJVRyAoIlJUUCBHLjcyNiBkZXBheWxvYWRlciwgYml0cmF0ZSBzZXQgdG8gJWRcbiIsIGRlcGF5LT5iaXRyYXRlKTsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtYWRwY20iLAorICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMSwKKyAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgY2xvY2tfcmF0ZSwKKyAgICAgICJiaXRyYXRlIiwgR19UWVBFX0lOVCwgZGVwYXktPmJpdHJhdGUsCisgICAgICAiYmxvY2tfYWxpZ24iLCBHX1RZUEVfSU5ULCBkZXBheS0+YmxvY2tfYWxpZ24sCisgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgTEFZT1VUX0c3MjYsIE5VTEwpOworCisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCit1bmtub3duX2VuY29kaW5nOgorICB7CisgICAgR1NUX1dBUk5JTkcgKCJDb3VsZCBub3QgZGV0ZXJtaW5lIGJpdHJhdGUgZnJvbSBlbmNvZGluZy1uYW1lICglcykiLAorICAgICAgICBlbmNvZGluZ19uYW1lKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfZzcyNl9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cEc3MjZEZXBheSAqZGVwYXk7CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgZ2Jvb2xlYW4gbWFya2VyOworCisgIGRlcGF5ID0gR1NUX1JUUF9HNzI2X0RFUEFZIChkZXBheWxvYWQpOworCisgIG1hcmtlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgR1NUX0RFQlVHICgicHJvY2VzcyA6IGdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzLCBtYXJrICVkIHRzICV1IHNlcW4gJWQiLAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAocnRwLT5idWZmZXIpLCBtYXJrZXIsCisgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wIChydHApLCBnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxIChydHApKTsKKworICBpZiAoZGVwYXktPmFhbDIgfHwgZGVwYXktPmZvcmNlX2FhbDIpIHsKKyAgICAvKiBBQUwyLCB3ZSBjYW4ganVzdCBjb3B5IHRoZSBieXRlcyAqLworICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2J1ZmZlciAocnRwKTsKKyAgICBpZiAoIW91dGJ1ZikKKyAgICAgIGdvdG8gYmFkX2xlbjsKKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKGRlcGF5LCBvdXRidWYpOworICB9IGVsc2UgeworICAgIGd1aW50OCAqaW4sICpvdXQsIHRtcDsKKyAgICBndWludCBsZW47CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICBpbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkIChydHApOworICAgIGxlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKworICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2J1ZmZlciAocnRwKTsKKyAgICBpZiAoIW91dGJ1ZikKKyAgICAgIGdvdG8gYmFkX2xlbjsKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKG91dGJ1Zik7CisKKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKGRlcGF5LCBvdXRidWYpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgICAgb3V0ID0gbWFwLmRhdGE7CisKKyAgICAvKiB3ZSBuZWVkIHRvIHJlc2h1ZmZsZSB0aGUgYnl0ZXMsIGlucHV0IGlzIGFsd2F5cyBvZiB0aGUgZm9ybQorICAgICAqIEEgQiBDIEQgLi4uIHdpdGggdGhlIG51bWJlciBvZiBiaXRzIGRlcGVuZGluZyBvbiB0aGUgYml0cmF0ZS4gKi8KKyAgICBzd2l0Y2ggKGRlcGF5LT5iaXRyYXRlKSB7CisgICAgICBjYXNlIDE2MDAwOgorICAgICAgeworICAgICAgICAvKiAgMCAgICAgICAgICAgICAgIAorICAgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0KKyAgICAgICAgICogfEQgRHxDIEN8QiBCfEEgQXwgLi4uCisgICAgICAgICAqIHwwIDF8MCAxfDAgMXwwIDF8CisgICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLQorICAgICAgICAgKi8KKyAgICAgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgICB0bXAgPSAqaW4rKzsKKyAgICAgICAgICAqb3V0KysgPSAoKHRtcCAmIDB4YzApID4+IDYpIHwKKyAgICAgICAgICAgICAgKCh0bXAgJiAweDMwKSA+PiAyKSB8ICgodG1wICYgMHgwYykgPDwgMikgfCAoKHRtcCAmIDB4MDMpIDw8IDYpOworICAgICAgICAgIGxlbi0tOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAyNDAwMDoKKyAgICAgIHsKKyAgICAgICAgLyogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyCisgICAgICAgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMworICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLQorICAgICAgICAgKiB8QyBDfEIgQiBCfEEgQSBBfEZ8RSBFIEV8RCBEIER8Q3xIIEggSHxHIEcgR3xGIEZ8IC4uLgorICAgICAgICAgKiB8MSAyfDAgMSAyfDAgMSAyfDJ8MCAxIDJ8MCAxIDJ8MHwwIDEgMnwwIDEgMnwwIDF8CisgICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstCisgICAgICAgICAqLworICAgICAgICB3aGlsZSAobGVuID4gMikgeworICAgICAgICAgIHRtcCA9ICppbisrOworICAgICAgICAgICpvdXQrKyA9ICgodG1wICYgMHhlMCkgPj4gNSkgfAorICAgICAgICAgICAgICAoKHRtcCAmIDB4MWMpIDw8IDEpIHwgKCh0bXAgJiAweDAzKSA8PCA2KTsKKyAgICAgICAgICB0bXAgPSAqaW4rKzsKKyAgICAgICAgICAqb3V0KysgPSAoKHRtcCAmIDB4ODApID4+IDcpIHwKKyAgICAgICAgICAgICAgKCh0bXAgJiAweDcwKSA+PiAzKSB8ICgodG1wICYgMHgwZSkgPDwgNCkgfCAoKHRtcCAmIDB4MDEpIDw8IDcpOworICAgICAgICAgIHRtcCA9ICppbisrOworICAgICAgICAgICpvdXQrKyA9ICgodG1wICYgMHhjMCkgPj4gNikgfAorICAgICAgICAgICAgICAoKHRtcCAmIDB4MzgpID4+IDEpIHwgKCh0bXAgJiAweDA3KSA8PCA1KTsKKyAgICAgICAgICBsZW4gLT0gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgMzIwMDA6CisgICAgICB7CisgICAgICAgIC8qICAwICAgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUKKyAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLQorICAgICAgICAgKiB8QiBCIEIgQnxBIEEgQSBBfEQgRCBEIER8QyBDIEMgQ3wgLi4uCisgICAgICAgICAqIHwwIDEgMiAzfDAgMSAyIDN8MCAxIDIgM3wwIDEgMiAzfAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstCisgICAgICAgICAqLworICAgICAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICAgIHRtcCA9ICppbisrOworICAgICAgICAgICpvdXQrKyA9ICgodG1wICYgMHhmMCkgPj4gNCkgfCAoKHRtcCAmIDB4MGYpIDw8IDQpOworICAgICAgICAgIGxlbi0tOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSA0MDAwMDoKKyAgICAgIHsKKyAgICAgICAgLyogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgICAgNAorICAgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwCisgICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0KKyAgICAgICAgICogfEIgQiBCfEEgQSBBIEEgQXxEfEMgQyBDIEMgQ3xCIEJ8RSBFIEUgRXxEIEQgRCBEfEcgR3xGIEYgRiBGIEZ8RXxIIEggSCBIIEh8RyBHIEd8CisgICAgICAgICAqIHwyIDMgNHwwIDEgMiAzIDR8NHwwIDEgMiAzIDR8MCAxfDEgMiAzIDR8MCAxIDIgM3wzIDR8MCAxIDIgMyA0fDB8MCAxIDIgMyA0fDAgMSAyfCAgIAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstCisgICAgICAgICAqLworICAgICAgICB3aGlsZSAobGVuID4gNCkgeworICAgICAgICAgIHRtcCA9ICppbisrOworICAgICAgICAgICpvdXQrKyA9ICgodG1wICYgMHhmOCkgPj4gMykgfCAoKHRtcCAmIDB4MDcpIDw8IDUpOworICAgICAgICAgIHRtcCA9ICppbisrOworICAgICAgICAgICpvdXQrKyA9ICgodG1wICYgMHhjMCkgPj4gNikgfAorICAgICAgICAgICAgICAoKHRtcCAmIDB4M2UpIDw8IDEpIHwgKCh0bXAgJiAweDAxKSA8PCA3KTsKKyAgICAgICAgICB0bXAgPSAqaW4rKzsKKyAgICAgICAgICAqb3V0KysgPSAoKHRtcCAmIDB4ZjApID4+IDQpIHwgKCh0bXAgJiAweDBmKSA8PCA0KTsKKyAgICAgICAgICB0bXAgPSAqaW4rKzsKKyAgICAgICAgICAqb3V0KysgPSAoKHRtcCAmIDB4ODApID4+IDcpIHwKKyAgICAgICAgICAgICAgKCh0bXAgJiAweDdjKSA+PiAxKSB8ICgodG1wICYgMHgwMykgPDwgNik7CisgICAgICAgICAgdG1wID0gKmluKys7CisgICAgICAgICAgKm91dCsrID0gKCh0bXAgJiAweGUwKSA+PiA1KSB8ICgodG1wICYgMHgxZikgPDwgMyk7CisgICAgICAgICAgbGVuIC09IDU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm1hcCk7CisgIH0KKworICBpZiAobWFya2VyKSB7CisgICAgLyogbWFyayBzdGFydCBvZiB0YWxrc3B1cnQgd2l0aCBSRVNZTkMgKi8KKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19SRVNZTkMpOworICB9CisKKyAgcmV0dXJuIG91dGJ1ZjsKKworYmFkX2xlbjoKKyAgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2c3MjZfZGVwYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cEc3MjZEZXBheSAqcnRwZzcyNmRlcGF5OworCisgIHJ0cGc3MjZkZXBheSA9IEdTVF9SVFBfRzcyNl9ERVBBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfRk9SQ0VfQUFMMjoKKyAgICAgIHJ0cGc3MjZkZXBheS0+Zm9yY2VfYWFsMiA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZzcyNl9kZXBheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwRzcyNkRlcGF5ICpydHBnNzI2ZGVwYXk7CisKKyAgcnRwZzcyNmRlcGF5ID0gR1NUX1JUUF9HNzI2X0RFUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9GT1JDRV9BQUwyOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHJ0cGc3MjZkZXBheS0+Zm9yY2VfYWFsMik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2c3MjZfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBnNzI2ZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfRzcyNl9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGc3MjZkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWZkMmVkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnNzI2ZGVwYXkuaApAQCAtMCwwICsxLDU4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNSBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA4IEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIgPGRldi1nc3RyZWFtZXJAYXhpcy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9HNzI2X0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfRzcyNl9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwRzcyNkRlcGF5IEdzdFJ0cEc3MjZEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBHNzI2RGVwYXlDbGFzcyBHc3RSdHBHNzI2RGVwYXlDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfRzcyNl9ERVBBWSBcCisgIChnc3RfcnRwX2c3MjZfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9HNzI2X0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjZfREVQQVksR3N0UnRwRzcyNkRlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9HNzI2X0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HNzI2X0RFUEFZLEdzdFJ0cEc3MjZEZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HNzI2X0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjZfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0c3MjZfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0c3MjZfREVQQVkpKQorCitzdHJ1Y3QgX0dzdFJ0cEc3MjZEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKKworICBnYm9vbGVhbiBhYWwyOworICBnYm9vbGVhbiBmb3JjZV9hYWwyOworICBnaW50IGJpdHJhdGU7CisgIGd1aW50IGJsb2NrX2FsaWduOworfTsKKworc3RydWN0IF9Hc3RSdHBHNzI2RGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9nNzI2X2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9nNzI2X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1JUUF9HNzI2X0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGc3MjZwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzE2ZTUxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmMKQEAgLTAsMCArMSw0MjIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAxOTk5IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbiA8a2FpLnZlaG1hbmVuQG5va2lhLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNywyMDA4IEF4aXMgQ29tbXVuaWNhdGlvbnMgPGRldi1nc3RyZWFtZXJAYXhpcy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCisjaW5jbHVkZSAiZ3N0cnRwZzcyNnBheS5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBnNzI2cGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBnNzI2cGF5X2RlYnVnKQorCisjZGVmaW5lIERFRkFVTFRfRk9SQ0VfQUFMMiAgICAgIFRSVUUKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfRk9SQ0VfQUFMMgorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfZzcyNl9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWFkcGNtLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSA4MDAwLCAiCisgICAgICAgICJiaXRyYXRlID0gKGludCkgeyAxNjAwMCwgMjQwMDAsIDMyMDAwLCA0MDAwMCB9LCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBcImc3MjZcIiIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfZzcyNl9wYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIHsgXCJHNzI2LTE2XCIsIFwiRzcyNi0yNFwiLCBcIkc3MjYtMzJcIiwgXCJHNzI2LTQwXCIsICIKKyAgICAgICAgIiAgICBcIkFBTDItRzcyNi0xNlwiLCBcIkFBTDItRzcyNi0yNFwiLCBcIkFBTDItRzcyNi0zMlwiLCBcIkFBTDItRzcyNi00MFwiIH0gIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2c3MjZfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfZzcyNl9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9nNzI2X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9nNzI2X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqCisgICAgcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmZmVyKTsKKworI2RlZmluZSBnc3RfcnRwX2c3MjZfcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEc3MjZQYXksIGdzdF9ydHBfZzcyNl9wYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfQVVESU9fUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2c3MjZfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEc3MjZQYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9ydHBfZzcyNl9wYXlfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX2c3MjZfcGF5X2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0ZPUkNFX0FBTDIsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImZvcmNlLWFhbDIiLCAiRm9yY2UgQUFMMiIsCisgICAgICAgICAgIkZvcmNlIEFBTDIgZW5jb2RpbmcgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBiYWQgZGVwYXlsb2FkZXJzIiwKKyAgICAgICAgICBERUZBVUxUX0ZPUkNFX0FBTDIsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZzcyNl9wYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZzcyNl9wYXlfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBHLjcyNiBwYXlsb2FkZXIiLCAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkLWVuY29kZXMgRy43MjYgYXVkaW8gaW50byBhIFJUUCBwYWNrZXQiLAorICAgICAgIkF4aXMgQ29tbXVuaWNhdGlvbnMgPGRldi1nc3RyZWFtZXJAYXhpcy5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9nNzI2X3BheV9zZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9IGdzdF9ydHBfZzcyNl9wYXlfaGFuZGxlX2J1ZmZlcjsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwZzcyNnBheV9kZWJ1ZywgInJ0cGc3MjZwYXkiLCAwLAorICAgICAgIkcuNzI2IFJUUCBQYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZzcyNl9wYXlfaW5pdCAoR3N0UnRwRzcyNlBheSAqIHJ0cGc3MjZwYXkpCit7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgKnJ0cGJhc2VhdWRpb3BheWxvYWQ7CisKKyAgcnRwYmFzZWF1ZGlvcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9BVURJT19QQVlMT0FEIChydHBnNzI2cGF5KTsKKworICBHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwZzcyNnBheSktPmNsb2NrX3JhdGUgPSA4MDAwOworCisgIHJ0cGc3MjZwYXktPmZvcmNlX2FhbDIgPSBERUZBVUxUX0ZPUkNFX0FBTDI7CisKKyAgLyogc2FtcGxlIGJhc2VkIGNvZGVjICovCisgIGdzdF9ydHBfYmFzZV9hdWRpb19wYXlsb2FkX3NldF9zYW1wbGVfYmFzZWQgKHJ0cGJhc2VhdWRpb3BheWxvYWQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfZzcyNl9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2NoYXIgKmVuY29kaW5nX25hbWU7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkICpydHBiYXNlYXVkaW9wYXlsb2FkOworICBHc3RSdHBHNzI2UGF5ICpwYXk7CisgIEdzdENhcHMgKnBlZXJjYXBzOworICBnYm9vbGVhbiByZXM7CisKKyAgcnRwYmFzZWF1ZGlvcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9BVURJT19QQVlMT0FEIChwYXlsb2FkKTsKKyAgcGF5ID0gR1NUX1JUUF9HNzI2X1BBWSAocGF5bG9hZCk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImJpdHJhdGUiLCAmcGF5LT5iaXRyYXRlKSkKKyAgICBwYXktPmJpdHJhdGUgPSAzMjAwMDsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYXlsb2FkLCAidXNpbmcgYml0cmF0ZSAlZCIsIHBheS0+Yml0cmF0ZSk7CisKKyAgcGF5LT5hYWwyID0gRkFMU0U7CisKKyAgLyogZmlyc3Qgc2VlIHdoYXQgd2UgY2FuIGRvIHdpdGggdGhlIGJpdHJhdGUgKi8KKyAgc3dpdGNoIChwYXktPmJpdHJhdGUpIHsKKyAgICBjYXNlIDE2MDAwOgorICAgICAgZW5jb2RpbmdfbmFtZSA9IGdfc3RyZHVwICgiRzcyNi0xNiIpOworICAgICAgZ3N0X3J0cF9iYXNlX2F1ZGlvX3BheWxvYWRfc2V0X3NhbXBsZWJpdHNfb3B0aW9ucyAocnRwYmFzZWF1ZGlvcGF5bG9hZCwKKyAgICAgICAgICAyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjQwMDA6CisgICAgICBlbmNvZGluZ19uYW1lID0gZ19zdHJkdXAgKCJHNzI2LTI0Iik7CisgICAgICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfc2FtcGxlYml0c19vcHRpb25zIChydHBiYXNlYXVkaW9wYXlsb2FkLAorICAgICAgICAgIDMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjAwMDoKKyAgICAgIGVuY29kaW5nX25hbWUgPSBnX3N0cmR1cCAoIkc3MjYtMzIiKTsKKyAgICAgIGdzdF9ydHBfYmFzZV9hdWRpb19wYXlsb2FkX3NldF9zYW1wbGViaXRzX29wdGlvbnMgKHJ0cGJhc2VhdWRpb3BheWxvYWQsCisgICAgICAgICAgNCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQwMDAwOgorICAgICAgZW5jb2RpbmdfbmFtZSA9IGdfc3RyZHVwICgiRzcyNi00MCIpOworICAgICAgZ3N0X3J0cF9iYXNlX2F1ZGlvX3BheWxvYWRfc2V0X3NhbXBsZWJpdHNfb3B0aW9ucyAocnRwYmFzZWF1ZGlvcGF5bG9hZCwKKyAgICAgICAgICA1KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIGludmFsaWRfYml0cmF0ZTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJzZWxlY3RlZCBiYXNlIGVuY29kaW5nICVzIiwgZW5jb2RpbmdfbmFtZSk7CisKKyAgLyogbm93IHNlZSBpZiB3ZSBuZWVkIHRvIHByb2R1Y2UgQUFMMiBvciBub3QgKi8KKyAgcGVlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAocGF5bG9hZC0+c3JjcGFkLCBOVUxMKTsKKyAgaWYgKHBlZXJjYXBzKSB7CisgICAgR3N0Q2FwcyAqZmlsdGVyLCAqaW50ZXJzZWN0OworICAgIGdjaGFyICpjYXBzc3RyOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocGF5bG9hZCwgImhhdmUgcGVlcmNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIHBlZXJjYXBzKTsKKworICAgIGNhcHNzdHIgPSBnX3N0cmR1cF9wcmludGYgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA4MDAwLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgJXM7ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBBQUwyLSVzIiwgZW5jb2RpbmdfbmFtZSwgZW5jb2RpbmdfbmFtZSk7CisgICAgZmlsdGVyID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKGNhcHNzdHIpOworICAgIGdfZnJlZSAoY2Fwc3N0cik7CisgICAgZ19mcmVlIChlbmNvZGluZ19uYW1lKTsKKworICAgIC8qIGludGVyc2VjdCB0byBmaWx0ZXIgKi8KKyAgICBpbnRlcnNlY3QgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHBlZXJjYXBzLCBmaWx0ZXIpOworICAgIGdzdF9jYXBzX3VucmVmIChwZWVyY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGZpbHRlcik7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXlsb2FkLCAiaW50ZXJzZWN0ZWQgdG8gJSIgR1NUX1BUUl9GT1JNQVQsIGludGVyc2VjdCk7CisKKyAgICBpZiAoIWludGVyc2VjdCkKKyAgICAgIGdvdG8gbm9fZm9ybWF0OworICAgIGlmIChnc3RfY2Fwc19pc19lbXB0eSAoaW50ZXJzZWN0KSkgeworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGludGVyc2VjdCk7CisgICAgICBnb3RvIG5vX2Zvcm1hdDsKKyAgICB9CisKKyAgICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChpbnRlcnNlY3QsIDApOworCisgICAgLyogbm93IHNlZSB3aGF0IGVuY29kaW5nIG5hbWUgd2Ugc2V0dGxlZCBvbiwgd2UgbmVlZCB0byBkdXAgYmVjYXVzZSB0aGUKKyAgICAgKiBzdHJpbmcgZ29lcyBhd2F5IHdoZW4gd2UgdW5yZWYgdGhlIGludGVyc2VjdGlvbiBiZWxvdy4gKi8KKyAgICBlbmNvZGluZ19uYW1lID0KKyAgICAgICAgZ19zdHJkdXAgKGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZW5jb2RpbmctbmFtZSIpKTsKKworICAgIC8qIGlmIHdlIG1hbmFnZWQgdG8gbmVnb3RpYXRlIHRvIEFBTDIsIHdlIGRlZmluYXRseSBhcmUgZ29pbmcgdG8gZG8gQUFMMgorICAgICAqIGVuY29kaW5nLiBFbHNlIHdlIG9ubHkgZW5jb2RlIEFBTDIgd2hlbiBleHBsaWNpdGx5IHNldCBieSB0aGUKKyAgICAgKiBwcm9wZXJ0eS4gKi8KKyAgICBpZiAoZ19zdHJfaGFzX3ByZWZpeCAoZW5jb2RpbmdfbmFtZSwgIkFBTDItIikpCisgICAgICBwYXktPmFhbDIgPSBUUlVFOworICAgIGVsc2UKKyAgICAgIHBheS0+YWFsMiA9IHBheS0+Zm9yY2VfYWFsMjsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJmaW5hbCBlbmNvZGluZyAlcywgQUFMMiAlZCIsIGVuY29kaW5nX25hbWUsCisgICAgICAgIHBheS0+YWFsMik7CisKKyAgICBnc3RfY2Fwc191bnJlZiAoaW50ZXJzZWN0KTsKKyAgfSBlbHNlIHsKKyAgICAvKiBkb3duc3RyZWFtIGNhbiBkbyBhbnl0aGluZyBidXQgd2UgcHJlZmVyIHRoZSBiZXR0ZXIgc3VwcG9ydGVkIG5vbi1BQUwyICovCisgICAgcGF5LT5hYWwyID0gcGF5LT5mb3JjZV9hYWwyOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJubyBwZWVyIGNhcHMsIEFBTDIgJWQiLCBwYXktPmFhbDIpOworICB9CisKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHBheWxvYWQsICJhdWRpbyIsIFRSVUUsIGVuY29kaW5nX25hbWUsCisgICAgICA4MDAwKTsKKyAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsIE5VTEwpOworCisgIGdfZnJlZSAoZW5jb2RpbmdfbmFtZSk7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfYml0cmF0ZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBheWxvYWQsICJpbnZhbGlkIGJpdHJhdGUgJWQgc3BlY2lmaWVkIiwgcGF5LT5iaXRyYXRlKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX2Zvcm1hdDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBheWxvYWQsICJjb3VsZCBub3QgbmVnb3RpYXRlIGZvcm1hdCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9nNzI2X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIEdzdFJ0cEc3MjZQYXkgKnBheTsKKworICBwYXkgPSBHU1RfUlRQX0c3MjZfUEFZIChwYXlsb2FkKTsKKworICBpZiAoIXBheS0+YWFsMikgeworICAgIEdzdE1hcEluZm8gbWFwOworICAgIGd1aW50OCAqZGF0YSwgdG1wOworICAgIGdzaXplIHNpemU7CisKKyAgICAvKiBmb3Igbm9uIEFBTDIsIHdlIG5lZWQgdG8gcmVzaHVmZmxlIHRoZSBieXRlcywgd2UgY2FuIGRvIHRoaXMgaW4tcGxhY2UKKyAgICAgKiB3aGVuIHRoZSBidWZmZXIgaXMgd3JpdGFibGUuICovCisgICAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChidWZmZXIpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEV1JJVEUpOworICAgIGRhdGEgPSBtYXAuZGF0YTsKKyAgICBzaXplID0gbWFwLnNpemU7CisKKyAgICBHU1RfTE9HX09CSkVDVCAocGF5LCAicGFja2luZyAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIG9mIGRhdGEiLCBtYXAuc2l6ZSk7CisKKyAgICAvKiB3ZSBuZWVkIHRvIHJlc2h1ZmZsZSB0aGUgYnl0ZXMsIG91dHB1dCBpcyBvZiB0aGUgZm9ybToKKyAgICAgKiBBIEIgQyBEIC4uIHdpdGggdGhlIG51bWJlciBvZiBiaXRzIGRlcGVuZGluZyBvbiB0aGUgYml0cmF0ZS4gKi8KKyAgICBzd2l0Y2ggKHBheS0+Yml0cmF0ZSkgeworICAgICAgY2FzZSAxNjAwMDoKKyAgICAgIHsKKyAgICAgICAgLyogIDAgICAgICAgICAgICAgICAKKyAgICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyAKKyAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstCisgICAgICAgICAqIHxEIER8QyBDfEIgQnxBIEF8IC4uLgorICAgICAgICAgKiB8MCAxfDAgMXwwIDF8MCAxfAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0KKyAgICAgICAgICovCisgICAgICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICAgIHRtcCA9ICpkYXRhOworICAgICAgICAgICpkYXRhKysgPSAoKHRtcCAmIDB4YzApID4+IDYpIHwKKyAgICAgICAgICAgICAgKCh0bXAgJiAweDMwKSA+PiAyKSB8ICgodG1wICYgMHgwYykgPDwgMikgfCAoKHRtcCAmIDB4MDMpIDw8IDYpOworICAgICAgICAgIHNpemUtLTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgMjQwMDA6CisgICAgICB7CisgICAgICAgIC8qICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMgorICAgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMKKyAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0KKyAgICAgICAgICogfEMgQ3xCIEIgQnxBIEEgQXxGfEUgRSBFfEQgRCBEfEN8SCBIIEh8RyBHIEd8RiBGfCAuLi4KKyAgICAgICAgICogfDEgMnwwIDEgMnwwIDEgMnwyfDAgMSAyfDAgMSAyfDB8MCAxIDJ8MCAxIDJ8MCAxfAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLQorICAgICAgICAgKi8KKyAgICAgICAgd2hpbGUgKHNpemUgPiAyKSB7CisgICAgICAgICAgdG1wID0gKmRhdGE7CisgICAgICAgICAgKmRhdGErKyA9ICgodG1wICYgMHhjMCkgPj4gNikgfAorICAgICAgICAgICAgICAoKHRtcCAmIDB4MzgpID4+IDEpIHwgKCh0bXAgJiAweDA3KSA8PCA1KTsKKyAgICAgICAgICB0bXAgPSAqZGF0YTsKKyAgICAgICAgICAqZGF0YSsrID0gKCh0bXAgJiAweDgwKSA+PiA3KSB8CisgICAgICAgICAgICAgICgodG1wICYgMHg3MCkgPj4gMykgfCAoKHRtcCAmIDB4MGUpIDw8IDQpIHwgKCh0bXAgJiAweDAxKSA8PCA3KTsKKyAgICAgICAgICB0bXAgPSAqZGF0YTsKKyAgICAgICAgICAqZGF0YSsrID0gKCh0bXAgJiAweGUwKSA+PiA1KSB8CisgICAgICAgICAgICAgICgodG1wICYgMHgxYykgPj4gMikgfCAoKHRtcCAmIDB4MDMpIDw8IDYpOworICAgICAgICAgIHNpemUgLT0gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgMzIwMDA6CisgICAgICB7CisgICAgICAgIC8qICAwICAgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUKKyAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLQorICAgICAgICAgKiB8QiBCIEIgQnxBIEEgQSBBfEQgRCBEIER8QyBDIEMgQ3wgLi4uCisgICAgICAgICAqIHwwIDEgMiAzfDAgMSAyIDN8MCAxIDIgM3wwIDEgMiAzfAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstCisgICAgICAgICAqLworICAgICAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgICB0bXAgPSAqZGF0YTsKKyAgICAgICAgICAqZGF0YSsrID0gKCh0bXAgJiAweGYwKSA+PiA0KSB8ICgodG1wICYgMHgwZikgPDwgNCk7CisgICAgICAgICAgc2l6ZS0tOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSA0MDAwMDoKKyAgICAgIHsKKyAgICAgICAgLyogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgICAgNAorICAgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwCisgICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0KKyAgICAgICAgICogfEIgQiBCfEEgQSBBIEEgQXxEfEMgQyBDIEMgQ3xCIEJ8RSBFIEUgRXxEIEQgRCBEfEcgR3xGIEYgRiBGIEZ8RXxIIEggSCBIIEh8RyBHIEd8CisgICAgICAgICAqIHwyIDMgNHwwIDEgMiAzIDR8NHwwIDEgMiAzIDR8MCAxfDEgMiAzIDR8MCAxIDIgM3wzIDR8MCAxIDIgMyA0fDB8MCAxIDIgMyA0fDAgMSAyfCAgIAorICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstCisgICAgICAgICAqLworICAgICAgICB3aGlsZSAoc2l6ZSA+IDQpIHsKKyAgICAgICAgICB0bXAgPSAqZGF0YTsKKyAgICAgICAgICAqZGF0YSsrID0gKCh0bXAgJiAweGUwKSA+PiA1KSB8ICgodG1wICYgMHgxZikgPDwgMyk7CisgICAgICAgICAgdG1wID0gKmRhdGE7CisgICAgICAgICAgKmRhdGErKyA9ICgodG1wICYgMHg4MCkgPj4gNykgfAorICAgICAgICAgICAgICAoKHRtcCAmIDB4N2MpID4+IDIpIHwgKCh0bXAgJiAweDAzKSA8PCA2KTsKKyAgICAgICAgICB0bXAgPSAqZGF0YTsKKyAgICAgICAgICAqZGF0YSsrID0gKCh0bXAgJiAweGYwKSA+PiA0KSB8ICgodG1wICYgMHgwZikgPDwgNCk7CisgICAgICAgICAgdG1wID0gKmRhdGE7CisgICAgICAgICAgKmRhdGErKyA9ICgodG1wICYgMHhjMCkgPj4gNikgfAorICAgICAgICAgICAgICAoKHRtcCAmIDB4M2UpIDw8IDIpIHwgKCh0bXAgJiAweDAxKSA8PCA3KTsKKyAgICAgICAgICB0bXAgPSAqZGF0YTsKKyAgICAgICAgICAqZGF0YSsrID0gKCh0bXAgJiAweGY4KSA+PiAzKSB8ICgodG1wICYgMHgwNykgPDwgNSk7CisgICAgICAgICAgc2l6ZSAtPSA1OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICB9CisKKyAgcmVzID0KKyAgICAgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5oYW5kbGVfYnVmZmVyIChwYXlsb2FkLAorICAgICAgYnVmZmVyKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nNzI2X3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwRzcyNlBheSAqcnRwZzcyNnBheTsKKworICBydHBnNzI2cGF5ID0gR1NUX1JUUF9HNzI2X1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfRk9SQ0VfQUFMMjoKKyAgICAgIHJ0cGc3MjZwYXktPmZvcmNlX2FhbDIgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2c3MjZfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBHNzI2UGF5ICpydHBnNzI2cGF5OworCisgIHJ0cGc3MjZwYXkgPSBHU1RfUlRQX0c3MjZfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9GT1JDRV9BQUwyOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHJ0cGc3MjZwYXktPmZvcmNlX2FhbDIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF9nNzI2X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGc3MjZwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfRzcyNl9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmggYi9nc3QvcnRwL2dzdHJ0cGc3MjZwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWRiZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnNzI2cGF5LmgKQEAgLTAsMCArMSw1NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNywyMDA4IEF4aXMgQ29tbXVuaWNhdGlvbnMgPGRldi1nc3RyZWFtZXJAYXhpcy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9HNzI2X1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0c3MjZfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWF1ZGlvcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTIHR5cGVkZWYgc3RydWN0IF9Hc3RSdHBHNzI2UGF5IEdzdFJ0cEc3MjZQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwRzcyNlBheUNsYXNzIEdzdFJ0cEc3MjZQYXlDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfRzcyNl9QQVkgXAorICAoZ3N0X3J0cF9nNzI2X3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0c3MjZfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjZfUEFZLEdzdFJ0cEc3MjZQYXkpKQorI2RlZmluZSBHU1RfUlRQX0c3MjZfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HNzI2X1BBWSxHc3RSdHBHNzI2UGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0c3MjZfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjZfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HNzI2X1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfRzcyNl9QQVkpKQorCitzdHJ1Y3QgX0dzdFJ0cEc3MjZQYXkKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZCBhdWRpb3BheWxvYWQ7CisKKyAgZ2Jvb2xlYW4gYWFsMjsKKyAgZ2Jvb2xlYW4gZm9yY2VfYWFsMjsKKyAgZ2ludCBiaXRyYXRlOworfTsKKworc3RydWN0IF9Hc3RSdHBHNzI2UGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfZzcyNl9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2c3MjZfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1JUUF9HNzI2X1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YzFjNGQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGc3MjlkZXBheS5jCkBAIC0wLDAgKzEsMjI1IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnc3RydHBnNzI5ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBnNzI5ZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cGc3MjlkZXBheV9kZWJ1ZykKKworCisvKiByZWZlcmVuY2VzOgorICoKKyAqIFJGQyAzNTUxICg0LjUuNikKKyAqLworCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgUFJPUF8wCit9OworCisvKiBpbnB1dCBpcyBhbiBSVFAgcGFja2V0CisgKgorICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9nNzI5X2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkc3MjlcIjsgIgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRzcyOV9TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2c3MjlfZGVwYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby9HNzI5LCAiICJjaGFubmVscyA9IChpbnQpIDEsIiAicmF0ZSA9IChpbnQpIDgwMDAiKQorICAgICk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2c3MjlfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX2c3MjlfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworCisjZGVmaW5lIGdzdF9ydHBfZzcyOV9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBHNzI5RGVwYXksIGdzdF9ydHBfZzcyOV9kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nNzI5X2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEc3MjlEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBnNzI5ZGVwYXlfZGVidWcsICJydHBnNzI5ZGVwYXkiLCAwLAorICAgICAgIkcuNzI5IFJUUCBEZXBheWxvYWRlciIpOworCisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2c3MjlfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9nNzI5X2RlcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIEcuNzI5IGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBHLjcyOSBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMzU1MSkiLAorICAgICAgIkxhdXJlbnQgR2xheWFsIDxzcGdsZWdsZUB5YWhvby5mcj4iKTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX2c3MjlfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2c3MjlfZGVwYXlfc2V0Y2FwczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZzcyOV9kZXBheV9pbml0IChHc3RSdHBHNzI5RGVwYXkgKiBydHBnNzI5ZGVwYXkpCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgKmRlcGF5bG9hZDsKKworICBkZXBheWxvYWQgPSBHU1RfUlRQX0JBU0VfREVQQVlMT0FEIChydHBnNzI5ZGVwYXkpOworCisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2c3MjlfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBHc3RDYXBzICpzcmNjYXBzOworICBHc3RSdHBHNzI5RGVwYXkgKnJ0cGc3MjlkZXBheTsKKyAgY29uc3QgZ2NoYXIgKnBhcmFtczsKKyAgZ2ludCBjbG9ja19yYXRlLCBjaGFubmVsczsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIHJ0cGc3MjlkZXBheSA9IEdTVF9SVFBfRzcyOV9ERVBBWSAoZGVwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoIShwYXJhbXMgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImVuY29kaW5nLXBhcmFtcyIpKSkKKyAgICBjaGFubmVscyA9IDE7CisgIGVsc2UgeworICAgIGNoYW5uZWxzID0gYXRvaSAocGFyYW1zKTsKKyAgfQorCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA4MDAwOworCisgIGlmIChjaGFubmVscyAhPSAxKQorICAgIGdvdG8gd3JvbmdfY2hhbm5lbHM7CisKKyAgaWYgKGNsb2NrX3JhdGUgIT0gODAwMCkKKyAgICBnb3RvIHdyb25nX2Nsb2NrX3JhdGU7CisKKyAgZGVwYXlsb2FkLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL0c3MjkiLAorICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgY2hhbm5lbHMsICJyYXRlIiwgR19UWVBFX0lOVCwgY2xvY2tfcmF0ZSwgTlVMTCk7CisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCit3cm9uZ19jaGFubmVsczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGc3MjlkZXBheSwgImV4cGVjdGVkIDEgY2hhbm5lbCwgZ290ICVkIiwgY2hhbm5lbHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQord3JvbmdfY2xvY2tfcmF0ZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGc3MjlkZXBheSwgImV4cGVjdGVkIDgwMDAgY2xvY2stcmF0ZSwgZ290ICVkIiwKKyAgICAgICAgY2xvY2tfcmF0ZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9nNzI5X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0UnRwRzcyOURlcGF5ICpydHBnNzI5ZGVwYXk7CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgZ2ludCBwYXlsb2FkX2xlbjsKKyAgZ2Jvb2xlYW4gbWFya2VyOworCisgIHJ0cGc3MjlkZXBheSA9IEdTVF9SVFBfRzcyOV9ERVBBWSAoZGVwYXlsb2FkKTsKKworICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKworICAvKiBBdCBsZWFzdCAyIGJ5dGVzIChDTkcgZnJvbSBHNzI5IEFubmV4IEIpICovCisgIGlmIChwYXlsb2FkX2xlbiA8IDIpIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBnNzI5ZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiRzcyOSBSVFAgcGF5bG9hZCB0b28gc21hbGwgKCVkKSIsIHBheWxvYWRfbGVuKSk7CisgICAgZ290byBiYWRfcGFja2V0OworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHJ0cGc3MjlkZXBheSwgInBheWxvYWQgbGVuICVkIiwgcGF5bG9hZF9sZW4pOworCisgIGlmICgocGF5bG9hZF9sZW4gJSAxMCkgPT0gMikgeworICAgIEdTVF9MT0dfT0JKRUNUIChydHBnNzI5ZGVwYXksICJHNzI5IHBheWxvYWQgY29udGFpbnMgQ05HIGZyYW1lIik7CisgIH0KKworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9idWZmZXIgKHJ0cCk7CisgIG1hcmtlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgaWYgKG1hcmtlcikgeworICAgIC8qIG1hcmtlciBiaXQgc3RhcnRzIHRhbGtzcHVydCAqLworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1JFU1lOQyk7CisgIH0KKworICBnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKGRlcGF5bG9hZCwgb3V0YnVmKTsKKworICBHU1RfTE9HX09CSkVDVCAoZGVwYXlsb2FkLCAicHVzaGluZyBidWZmZXIgb2Ygc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZikpOworCisgIHJldHVybiBvdXRidWY7CisKKyAgLyogRVJST1JTICovCitiYWRfcGFja2V0OgorICB7CisgICAgLyogbm8gZmF0YWwgZXJyb3IgKi8KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF9nNzI5X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwZzcyOWRlcGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX0c3MjlfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBnNzI5ZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzNTYyZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwZzcyOWRlcGF5LmgKQEAgLTAsMCArMSw2MSBAQAorLyogR1N0cmVhbWVyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfRzcyOV9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0c3MjlfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfRzcyOV9ERVBBWSBcCisgIChnc3RfcnRwX2c3MjlfZGVwYXlfZ2V0X3R5cGUoKSkKKyAgCisjZGVmaW5lIEdTVF9SVFBfRzcyOV9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9HNzI5X0RFUEFZLEdzdFJ0cEc3MjlEZXBheSkpCisgIAorI2RlZmluZSBHU1RfUlRQX0c3MjlfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0c3MjlfREVQQVksR3N0UnRwRzcyOURlcGF5Q2xhc3MpKQorICAKKyNkZWZpbmUgR1NUX0lTX1JUUF9HNzI5X0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjlfREVQQVkpKQorICAKKyNkZWZpbmUgR1NUX0lTX1JUUF9HNzI5X0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HNzI5X0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEc3MjlEZXBheSBHc3RSdHBHNzI5RGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwRzcyOURlcGF5Q2xhc3MgR3N0UnRwRzcyOURlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwRzcyOURlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworfTsKKworc3RydWN0IF9Hc3RSdHBHNzI5RGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9nNzI5X2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9nNzI5X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0c3MjlfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwZzcyOXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OGZhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGc3MjlwYXkuYwpAQCAtMCwwICsxLDM5NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gQ29sbGFib3JhIEx0ZAorICogIEBhdXRob3I6IE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBUaGlzIHBheWxvYWRlciBhc3N1bWVzIHRoYXQgdGhlIGRhdGEgd2lsbCBBTFdBWVMgY29tZSBhcyB6ZXJvIG9yIG1vcmUKKyAqIDEwIGJ5dGVzIGZyYW1lIG9mIGF1ZGlvIGZvbGxvd2VkIGJ5IDAgb3IgMSAyIGJ5dGUgZnJhbWUgb2Ygc2lsZW5jZS4KKyAqIEFueSBvdGhlciBidWZmZXIgZm9ybWF0IHdvbid0IHdvcmsKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgImdzdHJ0cGc3MjlwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBnNzI5cGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBnNzI5cGF5X2RlYnVnKQorCisjZGVmaW5lIEc3MjlfRlJBTUVfU0laRSAxMAorI2RlZmluZSBHNzI5Ql9DTl9GUkFNRV9TSVpFIDIKKyNkZWZpbmUgRzcyOV9GUkFNRV9EVVJBVElPTiAoMTAgKiBHU1RfTVNFQ09ORCkKKyNkZWZpbmUgRzcyOV9GUkFNRV9EVVJBVElPTl9NUyAoMTApCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9nNzI5X3BheV9zZXRfY2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9nNzI5X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9nNzI5X3BheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfZzcyOV9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby9HNzI5LCAiICAgICAvKiBhY2NvcmRpbmcgdG8gUkZDIDM1NTUgKi8KKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAicmF0ZSA9IChpbnQpIDgwMDAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2c3MjlfcGF5X3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0c3MjlfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA4MDAwLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJHNzI5XCI7ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA4MDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJHNzI5XCIiKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF9nNzI5X3BheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSVFBHNzI5UGF5LCBnc3RfcnRwX2c3MjlfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZzcyOV9wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJUUEc3MjlQYXkgKnBheSA9IEdTVF9SVFBfRzcyOV9QQVkgKG9iamVjdCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHBheS0+YWRhcHRlcik7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nNzI5X3BheV9jbGFzc19pbml0IChHc3RSVFBHNzI5UGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqcGF5bG9hZF9jbGFzcyA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChrbGFzcyk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGc3MjlwYXlfZGVidWcsICJydHBnNzI5cGF5IiwgMCwKKyAgICAgICJHLjcyOSBSVFAgUGF5bG9hZGVyIik7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX2c3MjlfcGF5X2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfZzcyOV9wYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZzcyOV9wYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZzcyOV9wYXlfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBHLjcyOSBwYXlsb2FkZXIiLCAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYWNrZXRpemUgRy43MjkgYXVkaW8gaW50byBSVFAgcGFja2V0cyIsCisgICAgICAiT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2c3MjlfcGF5X3NldF9jYXBzOworICBwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9nNzI5X3BheV9oYW5kbGVfYnVmZmVyOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nNzI5X3BheV9pbml0IChHc3RSVFBHNzI5UGF5ICogcGF5KQoreworICBHc3RSVFBCYXNlUGF5bG9hZCAqcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEIChwYXkpOworCisgIHBheWxvYWQtPnB0ID0gR1NUX1JUUF9QQVlMT0FEX0c3Mjk7CisKKyAgcGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nNzI5X3BheV9yZXNldCAoR3N0UlRQRzcyOVBheSAqIHBheSkKK3sKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHBheS0+YWRhcHRlcik7CisgIHBheS0+ZGlzY29udCA9IEZBTFNFOworICBwYXktPm5leHRfcnRwX3RpbWUgPSAwOworICBwYXktPmZpcnN0X3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgcGF5LT5maXJzdF9ydHBfdGltZSA9IDA7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9nNzI5X3BheV9zZXRfY2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2Jvb2xlYW4gcmVzOworCisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChwYXlsb2FkLCAiYXVkaW8iLAorICAgICAgcGF5bG9hZC0+cHQgIT0gR1NUX1JUUF9QQVlMT0FEX0c3MjksICJHNzI5IiwgODAwMCk7CisKKyAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsIE5VTEwpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2c3MjlfcGF5X3B1c2ggKEdzdFJUUEc3MjlQYXkgKiBydHBnNzI5cGF5LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkICpiYXNlcGF5bG9hZDsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uOworICBndWludCBmcmFtZXM7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0UlRQQnVmZmVyIHJ0cCA9IHsgTlVMTCB9OworICBndWludCBwYXlsb2FkX2xlbiA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisKKyAgYmFzZXBheWxvYWQgPSBHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwZzcyOXBheSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwZzcyOXBheSwgIlB1c2hpbmcgJWQgYnl0ZXMgdHMgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgcGF5bG9hZF9sZW4sIEdTVF9USU1FX0FSR1MgKHJ0cGc3MjlwYXktPm5leHRfdHMpKTsKKworICAvKiBjcmVhdGUgYnVmZmVyIHRvIGhvbGQgdGhlIHBheWxvYWQgKi8KKyAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlICgwLCAwLCAwKTsKKworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKG91dGJ1ZiwgR1NUX01BUF9SRUFEV1JJVEUsICZydHApOworCisgIC8qIHNldCBtZXRhZGF0YSAqLworICBmcmFtZXMgPQorICAgICAgKHBheWxvYWRfbGVuIC8gRzcyOV9GUkFNRV9TSVpFKSArICgocGF5bG9hZF9sZW4gJSBHNzI5X0ZSQU1FX1NJWkUpID4+IDEpOworICBkdXJhdGlvbiA9IGZyYW1lcyAqIEc3MjlfRlJBTUVfRFVSQVRJT047CisgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gcnRwZzcyOXBheS0+bmV4dF90czsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9IGR1cmF0aW9uOworICBHU1RfQlVGRkVSX09GRlNFVCAob3V0YnVmKSA9IHJ0cGc3MjlwYXktPm5leHRfcnRwX3RpbWU7CisgIHJ0cGc3MjlwYXktPm5leHRfdHMgKz0gZHVyYXRpb247CisgIHJ0cGc3MjlwYXktPm5leHRfcnRwX3RpbWUgKz0gZnJhbWVzICogODA7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHJ0cGc3MjlwYXktPmRpc2NvbnQpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXBheWxvYWQsICJkaXNjb250LCBzZXR0aW5nIG1hcmtlciBiaXQiKTsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBUUlVFKTsKKyAgICBydHBnNzI5cGF5LT5kaXNjb250ID0gRkFMU0U7CisgIH0KKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIC8qIGFwcGVuZCBwYXlsb2FkICovCisgIGdzdF9ydHBfY29weV9hdWRpb19tZXRhIChiYXNlcGF5bG9hZCwgb3V0YnVmLCBidWYpOworICBvdXRidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAob3V0YnVmLCBidWYpOworCisgIHJldCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKGJhc2VwYXlsb2FkLCBvdXRidWYpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2c3MjlfcGF5X3JlY2FsY19ydHBfdGltZSAoR3N0UlRQRzcyOVBheSAqIHJ0cGc3MjlwYXksIEdzdENsb2NrVGltZSB0aW1lKQoreworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHJ0cGc3MjlwYXktPmZpcnN0X3RzKQorICAgICAgJiYgR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHRpbWUpICYmIHRpbWUgPj0gcnRwZzcyOXBheS0+Zmlyc3RfdHMpIHsKKyAgICBHc3RDbG9ja1RpbWUgZGlmZjsKKyAgICBndWludDMyIHJ0cGRpZmY7CisKKyAgICBkaWZmID0gdGltZSAtIHJ0cGc3MjlwYXktPmZpcnN0X3RzOworICAgIHJ0cGRpZmYgPSAoZGlmZiAvIEdTVF9NU0VDT05EKSAqIDg7CisgICAgcnRwZzcyOXBheS0+bmV4dF9ydHBfdGltZSA9IHJ0cGc3MjlwYXktPmZpcnN0X3J0cF90aW1lICsgcnRwZGlmZjsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBnNzI5cGF5LAorICAgICAgICAiZWxhcHNlZCB0aW1lICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBydHAgJSIgR19HVUlOVDMyX0ZPUk1BVCAiLCAiCisgICAgICAgICJuZXcgb2Zmc2V0ICUiIEdfR1VJTlQzMl9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGRpZmYpLCBydHBkaWZmLAorICAgICAgICBydHBnNzI5cGF5LT5uZXh0X3J0cF90aW1lKTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9nNzI5X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0UlRQRzcyOVBheSAqcnRwZzcyOXBheSA9IEdTVF9SVFBfRzcyOV9QQVkgKHBheWxvYWQpOworICBHc3RBZGFwdGVyICphZGFwdGVyID0gTlVMTDsKKyAgZ3VpbnQgcGF5bG9hZF9sZW47CisgIGd1aW50IGF2YWlsYWJsZTsKKyAgZ3VpbnQgbWF4cHRpbWVfb2N0ZXRzID0gR19NQVhVSU5UOworICBndWludCBtaW5wdGltZV9vY3RldHMgPSAwOworICBndWludCBtaW5fcGF5bG9hZF9sZW47CisgIGd1aW50IG1heF9wYXlsb2FkX2xlbjsKKyAgZ3NpemUgc2l6ZTsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKworICBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKworICBpZiAoc2l6ZSAlIEc3MjlfRlJBTUVfU0laRSAhPSAwICYmCisgICAgICBzaXplICUgRzcyOV9GUkFNRV9TSVpFICE9IEc3MjlCX0NOX0ZSQU1FX1NJWkUpCisgICAgZ290byBpbnZhbGlkX3NpemU7CisKKyAgLyogbWF4IG51bWJlciBvZiBieXRlcyBiYXNlZCBvbiBnaXZlbiBwdGltZSwgaGFzIHRvIGJlIG11bHRpcGxlIG9mCisgICAqIGZyYW1lX2R1cmF0aW9uICovCisgIGlmIChwYXlsb2FkLT5tYXhfcHRpbWUgIT0gLTEpIHsKKyAgICBndWludCBwdGltZV9tcyA9IHBheWxvYWQtPm1heF9wdGltZSAvIEdTVF9NU0VDT05EOworCisgICAgbWF4cHRpbWVfb2N0ZXRzID0gRzcyOV9GUkFNRV9TSVpFICoKKyAgICAgICAgKGludCkgKHB0aW1lX21zIC8gRzcyOV9GUkFNRV9EVVJBVElPTl9NUyk7CisKKyAgICBpZiAobWF4cHRpbWVfb2N0ZXRzIDwgRzcyOV9GUkFNRV9TSVpFKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBheWxvYWQsICJHaXZlbiBwdGltZSAlIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAiIGlzIHNtYWxsZXIgdGhhbiBtaW5pbXVtICVkIG5zLCBvdmVyd3JpdGluZyB0byBtaW5pbXVtIiwKKyAgICAgICAgICBwYXlsb2FkLT5tYXhfcHRpbWUsIEc3MjlfRlJBTUVfRFVSQVRJT05fTVMpOworICAgICAgbWF4cHRpbWVfb2N0ZXRzID0gRzcyOV9GUkFNRV9TSVpFOworICAgIH0KKyAgfQorCisgIG1heF9wYXlsb2FkX2xlbiA9IE1JTiAoCisgICAgICAvKiBNVFUgbWF4ICovCisgICAgICAoaW50KSAoZ3N0X3J0cF9idWZmZXJfY2FsY19wYXlsb2FkX2xlbiAoR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVCisgICAgICAgICAgICAgIChwYXlsb2FkKSwgMCwgMCkgLyBHNzI5X0ZSQU1FX1NJWkUpCisgICAgICAqIEc3MjlfRlJBTUVfU0laRSwKKyAgICAgIC8qIHB0aW1lIG1heCAqLworICAgICAgbWF4cHRpbWVfb2N0ZXRzKTsKKworICAvKiBtaW4gbnVtYmVyIG9mIGJ5dGVzIGJhc2VkIG9uIGEgZ2l2ZW4gcHRpbWUsIGhhcyB0byBiZSBhIG11bHRpcGxlCisgICAgIG9mIGZyYW1lIGR1cmF0aW9uICovCisgIHsKKyAgICBndWludDY0IG1pbl9wdGltZSA9IHBheWxvYWQtPm1pbl9wdGltZTsKKworICAgIG1pbl9wdGltZSA9IG1pbl9wdGltZSAvIEdTVF9NU0VDT05EOworICAgIG1pbnB0aW1lX29jdGV0cyA9IEc3MjlfRlJBTUVfU0laRSAqCisgICAgICAgIChpbnQpIChtaW5fcHRpbWUgLyBHNzI5X0ZSQU1FX0RVUkFUSU9OX01TKTsKKyAgfQorCisgIG1pbl9wYXlsb2FkX2xlbiA9IE1BWCAobWlucHRpbWVfb2N0ZXRzLCBHNzI5X0ZSQU1FX1NJWkUpOworCisgIGlmIChtaW5fcGF5bG9hZF9sZW4gPiBtYXhfcGF5bG9hZF9sZW4pIHsKKyAgICBtaW5fcGF5bG9hZF9sZW4gPSBtYXhfcGF5bG9hZF9sZW47CisgIH0KKworICAvKiBJZiB0aGUgcHRpbWUgaXMgc3BlY2lmaWVkIGluIHRoZSBjYXBzLCB0cmllZCB0byBhZGhlcmUgdG8gaXQgZXhhY3RseSAqLworICBpZiAocGF5bG9hZC0+cHRpbWUpIHsKKyAgICBndWludDY0IHB0aW1lID0gcGF5bG9hZC0+cHRpbWUgLyBHU1RfTVNFQ09ORDsKKyAgICBndWludCBwdGltZV9pbl9ieXRlcyA9IEc3MjlfRlJBTUVfU0laRSAqCisgICAgICAgIChndWludCkgKHB0aW1lIC8gRzcyOV9GUkFNRV9EVVJBVElPTl9NUyk7CisKKyAgICAvKiBjbGlwIHRvIGNvbXB1dGVkIG1pbiBhbmQgbWF4IGxlbmd0aHMgKi8KKyAgICBwdGltZV9pbl9ieXRlcyA9IE1BWCAobWluX3BheWxvYWRfbGVuLCBwdGltZV9pbl9ieXRlcyk7CisgICAgcHRpbWVfaW5fYnl0ZXMgPSBNSU4gKG1heF9wYXlsb2FkX2xlbiwgcHRpbWVfaW5fYnl0ZXMpOworCisgICAgbWluX3BheWxvYWRfbGVuID0gbWF4X3BheWxvYWRfbGVuID0gcHRpbWVfaW5fYnl0ZXM7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocGF5bG9hZCwKKyAgICAgICJDYWxjdWxhdGVkIG1pbl9wYXlsb2FkX2xlbiAldSBhbmQgbWF4X3BheWxvYWRfbGVuICV1IiwKKyAgICAgIG1pbl9wYXlsb2FkX2xlbiwgbWF4X3BheWxvYWRfbGVuKTsKKworICBhZGFwdGVyID0gcnRwZzcyOXBheS0+YWRhcHRlcjsKKyAgYXZhaWxhYmxlID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChhZGFwdGVyKTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAoYnVmKTsKKworICAvKiByZXN5bmMgcnRwIHRpbWUgb24gZGlzY29udCBvciBhIGRpc2NvbnRpbnVvdXMgY24gcGFja2V0ICovCisgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKGJ1ZikpIHsKKyAgICAvKiBmbHVzaCByZW1haW5kZXIgKi8KKyAgICBpZiAoYXZhaWxhYmxlID4gMCkgeworICAgICAgZ3N0X3J0cF9nNzI5X3BheV9wdXNoIChydHBnNzI5cGF5LAorICAgICAgICAgIGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyX2Zhc3QgKGFkYXB0ZXIsIGF2YWlsYWJsZSkpOworICAgICAgYXZhaWxhYmxlID0gMDsKKyAgICB9CisgICAgcnRwZzcyOXBheS0+ZGlzY29udCA9IFRSVUU7CisgICAgZ3N0X3J0cF9nNzI5X3BheV9yZWNhbGNfcnRwX3RpbWUgKHJ0cGc3MjlwYXksIHRpbWVzdGFtcCk7CisgIH0KKworICBpZiAoc2l6ZSA8IEc3MjlfRlJBTUVfU0laRSkKKyAgICBnc3RfcnRwX2c3MjlfcGF5X3JlY2FsY19ydHBfdGltZSAocnRwZzcyOXBheSwgdGltZXN0YW1wKTsKKworICBpZiAoR19VTkxJS0VMWSAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChydHBnNzI5cGF5LT5maXJzdF90cykpKSB7CisgICAgcnRwZzcyOXBheS0+Zmlyc3RfdHMgPSB0aW1lc3RhbXA7CisgICAgcnRwZzcyOXBheS0+Zmlyc3RfcnRwX3RpbWUgPSBydHBnNzI5cGF5LT5uZXh0X3J0cF90aW1lOworICB9CisKKyAgLyogbGV0J3MgcmVzZXQgdGhlIGJhc2UgdGltZXN0YW1wIHdoZW4gdGhlIGFkYXB0ZXIgaXMgZW1wdHkgKi8KKyAgaWYgKGF2YWlsYWJsZSA9PSAwKQorICAgIHJ0cGc3MjlwYXktPm5leHRfdHMgPSB0aW1lc3RhbXA7CisKKyAgaWYgKGF2YWlsYWJsZSA9PSAwICYmIHNpemUgPj0gbWluX3BheWxvYWRfbGVuICYmIHNpemUgPD0gbWF4X3BheWxvYWRfbGVuKSB7CisgICAgcmV0ID0gZ3N0X3J0cF9nNzI5X3BheV9wdXNoIChydHBnNzI5cGF5LCBidWYpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICBnc3RfYWRhcHRlcl9wdXNoIChhZGFwdGVyLCBidWYpOworICBhdmFpbGFibGUgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKGFkYXB0ZXIpOworCisgIC8qIGFzIGxvbmcgYXMgd2UgaGF2ZSBmdWxsIGZyYW1lcyAqLworICAvKiB0aGlzIGxvb3Agd2lsbCBwdXNoIGFsbCBhdmFpbGFibGUgYnVmZmVycyB0aWxsIHRoZSBsYXN0IGZyYW1lICovCisgIHdoaWxlIChhdmFpbGFibGUgPj0gbWluX3BheWxvYWRfbGVuIHx8CisgICAgICBhdmFpbGFibGUgJSBHNzI5X0ZSQU1FX1NJWkUgPT0gRzcyOUJfQ05fRlJBTUVfU0laRSkgeworICAgIC8qIFdlIHNlbmQgYXMgbXVjaCBhcyB3ZSBjYW4gKi8KKyAgICBpZiAoYXZhaWxhYmxlIDw9IG1heF9wYXlsb2FkX2xlbikgeworICAgICAgcGF5bG9hZF9sZW4gPSBhdmFpbGFibGU7CisgICAgfSBlbHNlIHsKKyAgICAgIHBheWxvYWRfbGVuID0gTUlOIChtYXhfcGF5bG9hZF9sZW4sCisgICAgICAgICAgKGF2YWlsYWJsZSAvIEc3MjlfRlJBTUVfU0laRSkgKiBHNzI5X0ZSQU1FX1NJWkUpOworICAgIH0KKworICAgIHJldCA9IGdzdF9ydHBfZzcyOV9wYXlfcHVzaCAocnRwZzcyOXBheSwKKyAgICAgICAgZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXJfZmFzdCAoYWRhcHRlciwgcGF5bG9hZF9sZW4pKTsKKyAgICBhdmFpbGFibGUgLT0gcGF5bG9hZF9sZW47CisgIH0KKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworaW52YWxpZF9zaXplOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBheWxvYWQsIFNUUkVBTSwgV1JPTkdfVFlQRSwKKyAgICAgICAgKCJJbnZhbGlkIGlucHV0IGJ1ZmZlciBzaXplIiksCisgICAgICAgICgiSW52YWxpZCBidWZmZXIgc2l6ZSwgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YiCisgICAgICAgICAgICAiIEc3MjlfRlJBTUVfU0laRSgxMCkgd2l0aCBhbiBvcHRpb25hbCBHNzI5Ql9DTl9GUkFNRV9TSVpFKDIpIgorICAgICAgICAgICAgIiBhZGRlZCB0byBpdCwgYnV0IGl0IGlzICUiIEdfR1NJWkVfRk9STUFULCBzaXplKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2c3MjlfcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUzsKKworICAvKiBoYW5kbGUgdXB3YXJkcyBzdGF0ZSBjaGFuZ2VzIGhlcmUgKi8KKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgLyogaGFuZGxlIGRvd253YXJkcyBzdGF0ZSBjaGFuZ2VzICovCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfcnRwX2c3MjlfcGF5X3Jlc2V0IChHU1RfUlRQX0c3MjlfUEFZIChlbGVtZW50KSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9nNzI5X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGc3MjlwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfRzcyOV9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmggYi9nc3QvcnRwL2dzdHJ0cGc3MjlwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjkyNDYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnNzI5cGF5LmgKQEAgLTAsMCArMSw2NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gQ29sbGFib3JhIEx0ZAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0c3MjlfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfRzcyOV9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlYXVkaW9wYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfRzcyOV9QQVkgXAorICAoZ3N0X3J0cF9nNzI5X3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0c3MjlfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjlfUEFZLEdzdFJUUEc3MjlQYXkpKQorI2RlZmluZSBHU1RfUlRQX0c3MjlfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HNzI5X1BBWSxHc3RSVFBHNzI5UGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0c3MjlfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0c3MjlfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HNzI5X1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfRzcyOV9QQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQRzcyOVBheSBHc3RSVFBHNzI5UGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUEc3MjlQYXlDbGFzcyBHc3RSVFBHNzI5UGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UlRQRzcyOVBheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCBwYXlsb2FkOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisgIEdzdENsb2NrVGltZSBuZXh0X3RzOworICBndWludDMyIG5leHRfcnRwX3RpbWU7CisgIEdzdENsb2NrVGltZSBmaXJzdF90czsKKyAgZ3VpbnQzMiBmaXJzdF9ydHBfdGltZTsKKyAgZ2Jvb2xlYW4gZGlzY29udDsKK307CisKK3N0cnVjdCBfR3N0UlRQRzcyOVBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9nNzI5X3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfZzcyOV9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfRzcyOV9QQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGdzbWRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3YzYxOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuYwpAQCAtMCwwICsxLDE1MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gWmVlc2hhbiBBbGkgPHplZW5peEBnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgImdzdHJ0cGdzbWRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwZ3NtZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cGdzbWRlcGF5X2RlYnVnKQorCisvKiBSVFBHU01EZXBheSBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2dzbV9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtZ3NtLCAiICJyYXRlID0gKGludCkgODAwMCwgIiAiY2hhbm5lbHMgPSAxIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9nc21fZGVwYXlfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiR1NNXCI7IgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfR1NNX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCIpCisgICAgKTsKKworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9nc21fZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIF9kZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2dzbV9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogX2RlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CisKKyNkZWZpbmUgZ3N0X3J0cF9nc21fZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UlRQR1NNRGVwYXksIGdzdF9ydHBfZ3NtX2RlcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nc21fZGVwYXlfY2xhc3NfaW5pdCAoR3N0UlRQR1NNRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZV9kZXBheWxvYWRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VfZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2dzbV9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2dzbV9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBHU00gZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIEdTTSBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIiwgIlplZXNoYW4gQWxpIDx6ZWVuaXhAZ21haWwuY29tPiIpOworCisgIGdzdHJ0cGJhc2VfZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX2dzbV9kZXBheV9wcm9jZXNzOworICBnc3RydHBiYXNlX2RlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2dzbV9kZXBheV9zZXRjYXBzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBnc21kZXBheV9kZWJ1ZywgInJ0cGdzbWRlcGF5IiwgMCwKKyAgICAgICJHU00gQXVkaW8gUlRQIERlcGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2dzbV9kZXBheV9pbml0IChHc3RSVFBHU01EZXBheSAqIHJ0cGdzbWRlcGF5KQoreworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfZ3NtX2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RDYXBzICpzcmNjYXBzOworICBnYm9vbGVhbiByZXQ7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnaW50IGNsb2NrX3JhdGU7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDgwMDA7ICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgZGVwYXlsb2FkLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtZ3NtIiwKKyAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDEsICJyYXRlIiwgR19UWVBFX0lOVCwgY2xvY2tfcmF0ZSwgTlVMTCk7CisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9nc21fZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RCdWZmZXIgKm91dGJ1ZiA9IE5VTEw7CisgIGdib29sZWFuIG1hcmtlcjsKKworICBtYXJrZXIgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApOworCisgIEdTVF9ERUJVRyAoInByb2Nlc3MgOiBnb3QgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcywgbWFyayAlZCB0cyAldSBzZXFuICVkIiwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKHJ0cC0+YnVmZmVyKSwgbWFya2VyLAorICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X3RpbWVzdGFtcCAocnRwKSwgZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAocnRwKSk7CisKKyAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfYnVmZmVyIChydHApOworCisgIGlmIChtYXJrZXIgJiYgb3V0YnVmKSB7CisgICAgLyogbWFyayBzdGFydCBvZiB0YWxrc3B1cnQgd2l0aCBSRVNZTkMgKi8KKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19SRVNZTkMpOworICB9CisKKyAgaWYgKG91dGJ1ZikgeworICAgIGdzdF9ydHBfZHJvcF9ub25fYXVkaW9fbWV0YSAoZGVwYXlsb2FkLCBvdXRidWYpOworICB9CisKKyAgcmV0dXJuIG91dGJ1ZjsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfZ3NtX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwZ3NtZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfR1NNX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwZ3NtZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDI4YWEwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnc21kZXBheS5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9HU01fREVQQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9HU01fREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUEdTTURlcGF5IEdzdFJUUEdTTURlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUEdTTURlcGF5Q2xhc3MgR3N0UlRQR1NNRGVwYXlDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfR1NNX0RFUEFZIFwKKyAgKGdzdF9ydHBfZ3NtX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfR1NNX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0dTTV9ERVBBWSxHc3RSVFBHU01EZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfR1NNX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HU01fREVQQVksR3N0UlRQR1NNRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfR1NNX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0dTTV9ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfR1NNX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HU01fREVQQVkpKQorCitzdHJ1Y3QgX0dzdFJUUEdTTURlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgX2RlcGF5bG9hZDsKK307CisKK3N0cnVjdCBfR3N0UlRQR1NNRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9nc21fZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2dzbV9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9HU01fREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGdzbXBheS5jIGIvZ3N0L3J0cC9nc3RydHBnc21wYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTIzOWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnc21wYXkuYwpAQCAtMCwwICsxLDE4MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gWmVlc2hhbiBBbGkgPHplZW5peEBnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSAiZ3N0cnRwZ3NtcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwZ3NtcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBnc21wYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2dzbV9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWdzbSwgIiAicmF0ZSA9IChpbnQpIDgwMDAsICIgImNoYW5uZWxzID0gKGludCkgMSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfZ3NtX3BheV9zcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9HU01fU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA4MDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJHU01cIjsgIgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkdTTVwiIikKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9nc21fcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX2dzbV9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKKyNkZWZpbmUgZ3N0X3J0cF9nc21fcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJUUEdTTVBheSwgZ3N0X3J0cF9nc21fcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZ3NtX3BheV9jbGFzc19pbml0IChHc3RSVFBHU01QYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBnc21wYXlfZGVidWcsICJydHBnc21wYXkiLCAwLAorICAgICAgIkdTTSBBdWRpbyBSVFAgUGF5bG9hZGVyIik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9nc21fcGF5X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2dzbV9wYXlfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUlRQIEdTTSBwYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZC1lbmNvZGVzIEdTTSBhdWRpbyBpbnRvIGEgUlRQIHBhY2tldCIsCisgICAgICAiWmVlc2hhbiBBbGkgPHplZW5peEBnbWFpbC5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9nc21fcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9nc21fcGF5X2hhbmRsZV9idWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2dzbV9wYXlfaW5pdCAoR3N0UlRQR1NNUGF5ICogcnRwZ3NtcGF5KQoreworICBHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwZ3NtcGF5KS0+Y2xvY2tfcmF0ZSA9IDgwMDA7CisgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX1BUIChydHBnc21wYXkpID0gR1NUX1JUUF9QQVlMT0FEX0dTTTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2dzbV9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgY29uc3QgY2hhciAqc3RuYW1lOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIHN0bmFtZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSk7CisKKyAgaWYgKHN0cmNtcCAoImF1ZGlvL3gtZ3NtIiwgc3RuYW1lKSkKKyAgICBnb3RvIGludmFsaWRfdHlwZTsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocGF5bG9hZCwgImF1ZGlvIiwKKyAgICAgIHBheWxvYWQtPnB0ICE9IEdTVF9SVFBfUEFZTE9BRF9HU00sICJHU00iLCA4MDAwKTsKKyAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsIE5VTEwpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX3R5cGU6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBheWxvYWQsICJpbnZhbGlkIG1lZGlhIHR5cGUgcmVjZWl2ZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfZ3NtX3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UlRQR1NNUGF5ICpydHBnc21wYXk7CisgIGd1aW50IHBheWxvYWRfbGVuOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwgZHVyYXRpb247CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIHJ0cGdzbXBheSA9IEdTVF9SVFBfR1NNX1BBWSAoYmFzZXBheWxvYWQpOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisKKyAgLyogRklYTUUsIG9ubHkgb25lIEdTTSBmcmFtZSBwZXIgUlRQIHBhY2tldCBmb3Igbm93ICovCisgIHBheWxvYWRfbGVuID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKTsKKworICAvKiBGSVhNRSwganVzdCBlcnJvciBvdXQgZm9yIG5vdyAqLworICBpZiAocGF5bG9hZF9sZW4gPiBHU1RfUlRQX0JBU0VfUEFZTE9BRF9NVFUgKHJ0cGdzbXBheSkpCisgICAgZ290byB0b29fYmlnOworCisgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMCwgMCwgMCk7CisKKyAgLyogY29weSB0aW1lc3RhbXAgYW5kIGR1cmF0aW9uICovCisgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gdGltZXN0YW1wOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gZHVyYXRpb247CisKKyAgZ3N0X3J0cF9jb3B5X2F1ZGlvX21ldGEgKHJ0cGdzbXBheSwgb3V0YnVmLCBidWZmZXIpOworCisgIC8qIGFwcGVuZCBwYXlsb2FkICovCisgIG91dGJ1ZiA9IGdzdF9idWZmZXJfYXBwZW5kIChvdXRidWYsIGJ1ZmZlcik7CisKKyAgR1NUX0RFQlVHICgiZ3N0X3J0cF9nc21fcGF5X2NoYWluOiBwdXNoaW5nIGJ1ZmZlciBvZiBzaXplICUiIEdfR1NJWkVfRk9STUFULAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0YnVmKSk7CisKKyAgcmV0ID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfcHVzaCAoYmFzZXBheWxvYWQsIG91dGJ1Zik7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK3Rvb19iaWc6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocnRwZ3NtcGF5LCBTVFJFQU0sIEVOQ09ERSwgKE5VTEwpLAorICAgICAgICAoInBheWxvYWRfbGVuICV1ID4gbXR1ICV1IiwgcGF5bG9hZF9sZW4sCisgICAgICAgICAgICBHU1RfUlRQX0JBU0VfUEFZTE9BRF9NVFUgKHJ0cGdzbXBheSkpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfZ3NtX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGdzbXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9HU01fUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwZ3NtcGF5LmggYi9nc3QvcnRwL2dzdHJ0cGdzbXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NDM3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGdzbXBheS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfUlRQX0dTTV9QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9HU01fUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQR1NNUGF5IEdzdFJUUEdTTVBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBHU01QYXlDbGFzcyBHc3RSVFBHU01QYXlDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfR1NNX1BBWSBcCisgIChnc3RfcnRwX2dzbV9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9HU01fUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0dTTV9QQVksR3N0UlRQR1NNUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9HU01fUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HU01fUEFZLEdzdFJUUEdTTVBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HU01fUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0dTTV9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0dTTV9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0dTTV9QQVkpKQorCitzdHJ1Y3QgX0dzdFJUUEdTTVBheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCBwYXlsb2FkOworfTsKKworc3RydWN0IF9Hc3RSVFBHU01QYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfZ3NtX3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfZ3NtX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9HU01fUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBnc3RkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMDU3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmMKQEAgLTAsMCArMSw2MjAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAxMD4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ3N0cnRwZ3N0ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBnc3RkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwZ3N0ZGVwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2dzdF9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9nc3RfZGVwYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImFwcGxpY2F0aW9uXCIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiWC1HU1RcIiIpCisgICAgKTsKKworI2RlZmluZSBnc3RfcnRwX2dzdF9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBHU1REZXBheSwgZ3N0X3J0cF9nc3RfZGVwYXksIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfZ3N0X2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfZ3N0X2RlcGF5X2hhbmRsZV9ldmVudCAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfZ3N0X2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfZ3N0X2RlcGF5X3Jlc2V0IChHc3RSdHBHU1REZXBheSAqIHJ0cGdzdGRlcGF5LCBnYm9vbGVhbgorICAgIGZ1bGwpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfZ3N0X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9nc3RfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nc3RfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UnRwR1NURGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBnc3RkZXBheV9kZWJ1ZywgInJ0cGdzdGRlcGF5IiwgMCwKKyAgICAgICJHc3RyZWFtZXIgUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfZ3N0X2RlcGF5X2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfZ3N0X2RlcGF5X2NoYW5nZV9zdGF0ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2dzdF9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2dzdF9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIkdTdHJlYW1lciBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrIiwKKyAgICAgICJFeHRyYWN0cyBHU3RyZWFtZXIgYnVmZmVycyBmcm9tIFJUUCBwYWNrZXRzIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9ldmVudCA9IGdzdF9ydHBfZ3N0X2RlcGF5X2hhbmRsZV9ldmVudDsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2dzdF9kZXBheV9zZXRjYXBzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX2dzdF9kZXBheV9wcm9jZXNzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nc3RfZGVwYXlfaW5pdCAoR3N0UnRwR1NURGVwYXkgKiBydHBnc3RkZXBheSkKK3sKKyAgcnRwZ3N0ZGVwYXktPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2dzdF9kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwR1NURGVwYXkgKnJ0cGdzdGRlcGF5OworCisgIHJ0cGdzdGRlcGF5ID0gR1NUX1JUUF9HU1RfREVQQVkgKG9iamVjdCk7CisKKyAgZ3N0X3J0cF9nc3RfZGVwYXlfcmVzZXQgKHJ0cGdzdGRlcGF5LCBUUlVFKTsKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cGdzdGRlcGF5LT5hZGFwdGVyKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitzdG9yZV9jYWNoZSAoR3N0UnRwR1NURGVwYXkgKiBydHBnc3RkZXBheSwgZ3VpbnQgQ1YsIEdzdENhcHMgKiBjYXBzKQoreworICBpZiAocnRwZ3N0ZGVwYXktPkNWX2NhY2hlW0NWXSkKKyAgICBnc3RfY2Fwc191bnJlZiAocnRwZ3N0ZGVwYXktPkNWX2NhY2hlW0NWXSk7CisgIHJ0cGdzdGRlcGF5LT5DVl9jYWNoZVtDVl0gPSBjYXBzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nc3RfZGVwYXlfcmVzZXQgKEdzdFJ0cEdTVERlcGF5ICogcnRwZ3N0ZGVwYXksIGdib29sZWFuIGZ1bGwpCit7CisgIGd1aW50IGk7CisKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGdzdGRlcGF5LT5hZGFwdGVyKTsKKyAgaWYgKGZ1bGwpIHsKKyAgICBydHBnc3RkZXBheS0+Y3VycmVudF9DViA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgIHN0b3JlX2NhY2hlIChydHBnc3RkZXBheSwgaSwgTlVMTCk7CisgICAgZ19mcmVlIChydHBnc3RkZXBheS0+c3RyZWFtX2lkKTsKKyAgICBydHBnc3RkZXBheS0+c3RyZWFtX2lkID0gTlVMTDsKKyAgICBpZiAocnRwZ3N0ZGVwYXktPnRhZ3MpCisgICAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHJ0cGdzdGRlcGF5LT50YWdzKTsKKyAgICBydHBnc3RkZXBheS0+dGFncyA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2dzdF9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UnRwR1NURGVwYXkgKnJ0cGdzdGRlcGF5OworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2ludCBjbG9ja19yYXRlOworICBnYm9vbGVhbiByZXM7CisgIGNvbnN0IGdjaGFyICpjYXBzZW5jOworCisgIHJ0cGdzdGRlcGF5ID0gR1NUX1JUUF9HU1RfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDkwMDAwOworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIGNhcHNlbmMgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImNhcHMiKTsKKyAgaWYgKGNhcHNlbmMpIHsKKyAgICBHc3RDYXBzICpvdXRjYXBzOworICAgIGdzaXplIG91dF9sZW47CisgICAgZ2NoYXIgKmNhcHNzdHI7CisgICAgY29uc3QgZ2NoYXIgKmNhcHN2ZXI7CisgICAgZ3VpbnQgQ1Y7CisKKyAgICAvKiBkZWNvZGUgY2FwcyAqLworICAgIGNhcHNzdHIgPSAoZ2NoYXIgKikgZ19iYXNlNjRfZGVjb2RlIChjYXBzZW5jLCAmb3V0X2xlbik7CisgICAgb3V0Y2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChjYXBzc3RyKTsKKyAgICBnX2ZyZWUgKGNhcHNzdHIpOworCisgICAgLyogcGFyc2UgdmVyc2lvbiAqLworICAgIGNhcHN2ZXIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImNhcHN2ZXJzaW9uIik7CisgICAgaWYgKGNhcHN2ZXIpIHsKKyAgICAgIENWID0gYXRvaSAoY2Fwc3Zlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIG5vIHZlcnNpb24sIGFzc3VtZSAwICovCisgICAgICBDViA9IDA7CisgICAgfQorICAgIC8qIHN0b3JlIGluIGNhY2hlICovCisgICAgcnRwZ3N0ZGVwYXktPmN1cnJlbnRfQ1YgPSBDVjsKKyAgICBnc3RfY2Fwc19yZWYgKG91dGNhcHMpOworICAgIHN0b3JlX2NhY2hlIChydHBnc3RkZXBheSwgQ1YsIG91dGNhcHMpOworCisgICAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoZGVwYXlsb2FkLT5zcmNwYWQsIG91dGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChvdXRjYXBzKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgIm5vIGNhcHMgZ2l2ZW4iKTsKKyAgICBydHBnc3RkZXBheS0+Y3VycmVudF9DViA9IC0xOworICAgIHJlcyA9IFRSVUU7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3JlYWRfbGVuZ3RoIChHc3RSdHBHU1REZXBheSAqIHJ0cGdzdGRlcGF5LCBndWludDggKiBkYXRhLCBndWludCBzaXplLAorICAgIGd1aW50ICogbGVuZ3RoLCBndWludCAqIHNraXApCit7CisgIGd1aW50IGIsIGxlbiwgb2Zmc2V0OworCisgIC8qIHN0YXJ0IHJlYWRpbmcgdGhlIGxlbmd0aCwgd2UgbmVlZCB0aGlzIHRvIHNraXAgdG8gdGhlIGRhdGEgbGF0ZXIgKi8KKyAgbGVuID0gb2Zmc2V0ID0gMDsKKyAgZG8geworICAgIGlmIChvZmZzZXQgPj0gc2l6ZSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBiID0gZGF0YVtvZmZzZXQrK107CisgICAgbGVuID0gKGxlbiA8PCA3KSB8IChiICYgMHg3Zik7CisgIH0gd2hpbGUgKGIgJiAweDgwKTsKKworICAvKiBjaGVjayByZW1haW5pbmcgYnVmZmVyIHNpemUgKi8KKyAgaWYgKHNpemUgLSBvZmZzZXQgPCBsZW4pCisgICAgcmV0dXJuIEZBTFNFOworCisgICpsZW5ndGggPSBsZW47CisgICpza2lwID0gb2Zmc2V0OworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCityZWFkX2NhcHMgKEdzdFJ0cEdTVERlcGF5ICogcnRwZ3N0ZGVwYXksIEdzdEJ1ZmZlciAqIGJ1ZiwgZ3VpbnQgKiBza2lwKQoreworICBndWludCBvZmZzZXQsIGxlbmd0aDsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBnc3RkZXBheSwgImJ1ZmZlciBzaXplICUiIEdfR1NJWkVfRk9STUFULCBtYXAuc2l6ZSk7CisKKyAgaWYgKCFyZWFkX2xlbmd0aCAocnRwZ3N0ZGVwYXksIG1hcC5kYXRhLCBtYXAuc2l6ZSwgJmxlbmd0aCwgJm9mZnNldCkpCisgICAgZ290byB0b29fc21hbGw7CisKKyAgaWYgKGxlbmd0aCA9PSAwIHx8IG1hcC5kYXRhW29mZnNldCArIGxlbmd0aCAtIDFdICE9ICdcMCcpCisgICAgZ290byBpbnZhbGlkX2J1ZmZlcjsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBnc3RkZXBheSwgInBhcnNpbmcgY2FwcyAlcyIsICZtYXAuZGF0YVtvZmZzZXRdKTsKKworICAvKiBwYXJzZSBhbmQgc3RvcmUgaW4gY2FjaGUgKi8KKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgoZ2NoYXIgKikgJiBtYXAuZGF0YVtvZmZzZXRdKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICAqc2tpcCA9IGxlbmd0aCArIG9mZnNldDsKKworICByZXR1cm4gY2FwczsKKwordG9vX3NtYWxsOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwZ3N0ZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIkJ1ZmZlciB0b28gc21hbGwuIiksIChOVUxMKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQoraW52YWxpZF9idWZmZXI6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBnc3RkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgICgiY2FwcyBzdHJpbmcgbm90IDAtdGVybWluYXRlZC4iKSwgKE5VTEwpKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBHc3RFdmVudCAqCityZWFkX2V2ZW50IChHc3RSdHBHU1REZXBheSAqIHJ0cGdzdGRlcGF5LCBndWludCB0eXBlLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZiwgZ3VpbnQgKiBza2lwKQoreworICBndWludCBvZmZzZXQsIGxlbmd0aDsKKyAgR3N0U3RydWN0dXJlICpzOworICBHc3RFdmVudCAqZXZlbnQ7CisgIEdzdEV2ZW50VHlwZSBldHlwZTsKKyAgZ2NoYXIgKmVuZDsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBnc3RkZXBheSwgImJ1ZmZlciBzaXplICUiIEdfR1NJWkVfRk9STUFULCBtYXAuc2l6ZSk7CisKKyAgaWYgKCFyZWFkX2xlbmd0aCAocnRwZ3N0ZGVwYXksIG1hcC5kYXRhLCBtYXAuc2l6ZSwgJmxlbmd0aCwgJm9mZnNldCkpCisgICAgZ290byB0b29fc21hbGw7CisKKyAgaWYgKGxlbmd0aCA9PSAwKQorICAgIGdvdG8gaW52YWxpZF9idWZmZXI7CisgIC8qIGJhY2t3YXJkIGNvbXBhdCwgb2xkIHBheWxvYWRlciBkaWQgbm90IHB1dCAwLWJ5dGUgYXQgdGhlIGVuZCAqLworICBpZiAobWFwLmRhdGFbb2Zmc2V0ICsgbGVuZ3RoIC0gMV0gIT0gJ1wwJworICAgICAgJiYgbWFwLmRhdGFbb2Zmc2V0ICsgbGVuZ3RoIC0gMV0gIT0gJzsnKQorICAgIGdvdG8gaW52YWxpZF9idWZmZXI7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwZ3N0ZGVwYXksICJwYXJzaW5nIGV2ZW50ICVzIiwgJm1hcC5kYXRhW29mZnNldF0pOworCisgIC8qIHBhcnNlICovCisgIHMgPSBnc3Rfc3RydWN0dXJlX2Zyb21fc3RyaW5nICgoZ2NoYXIgKikgJiBtYXAuZGF0YVtvZmZzZXRdLCAmZW5kKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICBpZiAocyA9PSBOVUxMKQorICAgIGdvdG8gcGFyc2VfZmFpbGVkOworCisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgMToKKyAgICAgIGV0eXBlID0gR1NUX0VWRU5UX1RBRzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGV0eXBlID0gR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgZXR5cGUgPSBHU1RfRVZFTlRfQ1VTVE9NX0JPVEg7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBldHlwZSA9IEdTVF9FVkVOVF9TVFJFQU1fU1RBUlQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ290byB1bmtub3duX2V2ZW50OworICB9CisgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19jdXN0b20gKGV0eXBlLCBzKTsKKworICAqc2tpcCA9IGxlbmd0aCArIG9mZnNldDsKKworICByZXR1cm4gZXZlbnQ7CisKK3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cGdzdGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJCdWZmZXIgdG9vIHNtYWxsLiIpLCAoTlVMTCkpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2ludmFsaWRfYnVmZmVyOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwZ3N0ZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoImV2ZW50IHN0cmluZyBub3QgMC10ZXJtaW5hdGVkLiIpLCAoTlVMTCkpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK3BhcnNlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwZ3N0ZGVwYXksICJjb3VsZCBub3QgcGFyc2UgZXZlbnQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQordW5rbm93bl9ldmVudDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGdzdGRlcGF5LCAidW5rbm93biBldmVudCB0eXBlIik7CisgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChzKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorc3RvcmVfZXZlbnQgKEdzdFJ0cEdTVERlcGF5ICogcnRwZ3N0ZGVwYXksIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIGRvX3B1c2ggPSBGQUxTRTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9UQUc6CisgICAgeworICAgICAgR3N0VGFnTGlzdCAqb2xkLCAqdGFnczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAoZXZlbnQsICZ0YWdzKTsKKworICAgICAgb2xkID0gcnRwZ3N0ZGVwYXktPnRhZ3M7CisgICAgICBpZiAoIW9sZCB8fCAhZ3N0X3RhZ19saXN0X2lzX2VxdWFsIChvbGQsIHRhZ3MpKSB7CisgICAgICAgIGRvX3B1c2ggPSBUUlVFOworICAgICAgICBpZiAob2xkKQorICAgICAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAob2xkKTsKKyAgICAgICAgcnRwZ3N0ZGVwYXktPnRhZ3MgPSBnc3RfdGFnX2xpc3RfcmVmICh0YWdzKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9DVVNUT01fRE9XTlNUUkVBTToKKyAgICBjYXNlIEdTVF9FVkVOVF9DVVNUT01fQk9USDoKKyAgICAgIC8qIGFsd2F5cyBwdXNoIGN1c3RvbSBldmVudHMgKi8KKyAgICAgIGRvX3B1c2ggPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfU1RSRUFNX1NUQVJUOgorICAgIHsKKyAgICAgIGdjaGFyICpvbGQ7CisgICAgICBjb25zdCBnY2hhciAqc3RyZWFtX2lkID0gTlVMTDsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3N0cmVhbV9zdGFydCAoZXZlbnQsICZzdHJlYW1faWQpOworCisgICAgICBvbGQgPSBydHBnc3RkZXBheS0+c3RyZWFtX2lkOworICAgICAgaWYgKCFvbGQgfHwgZ19zdHJjbXAwIChvbGQsIHN0cmVhbV9pZCkpIHsKKyAgICAgICAgZG9fcHVzaCA9IFRSVUU7CisgICAgICAgIGdfZnJlZSAob2xkKTsKKyAgICAgICAgcnRwZ3N0ZGVwYXktPnN0cmVhbV9pZCA9IGdfc3RyZHVwIChzdHJlYW1faWQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAvKiB1bmtub3duIGV2ZW50LCBkb24ndCBwdXNoICovCisgICAgICBicmVhazsKKyAgfQorICBpZiAoZG9fcHVzaCkKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQUQgKHJ0cGdzdGRlcGF5KS0+c3JjcGFkLCBldmVudCk7CisgIGVsc2UKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX2dzdF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cEdTVERlcGF5ICpydHBnc3RkZXBheTsKKyAgR3N0QnVmZmVyICpzdWJidWYsICpvdXRidWYgPSBOVUxMOworICBnaW50IHBheWxvYWRfbGVuOworICBndWludDggKnBheWxvYWQ7CisgIGd1aW50IENWLCBmcmFnX29mZnNldCwgYXZhaWwsIG9mZnNldDsKKworICBydHBnc3RkZXBheSA9IEdTVF9SVFBfR1NUX0RFUEFZIChkZXBheWxvYWQpOworCisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgIGlmIChwYXlsb2FkX2xlbiA8PSA4KQorICAgIGdvdG8gZW1wdHlfcGFja2V0OworCisgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKHJ0cC0+YnVmZmVyKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwZ3N0ZGVwYXksICJESVNDT05ULCBjbGVhciBhZGFwdGVyIik7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGdzdGRlcGF5LT5hZGFwdGVyKTsKKyAgfQorCisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAocnRwKTsKKworICAvKiBzdHJpcCBvZmYgaGVhZGVyCisgICAqCisgICAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfEN8IENWICB8RHwwfDB8MHwgICAgIEVUWVBFICAgICB8ICBNQlogICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ19vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICovCisgIGZyYWdfb2Zmc2V0ID0KKyAgICAgIChwYXlsb2FkWzRdIDw8IDI0KSB8IChwYXlsb2FkWzVdIDw8IDE2KSB8IChwYXlsb2FkWzZdIDw8IDgpIHwgcGF5bG9hZFs3XTsKKworICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwZ3N0ZGVwYXktPmFkYXB0ZXIpOworICBpZiAoYXZhaWwgIT0gZnJhZ19vZmZzZXQpCisgICAgZ290byB3cm9uZ19mcmFnOworCisgIC8qIHN1YmJ1ZmZlciBza2lwcGluZyB0aGUgOCBoZWFkZXIgYnl0ZXMgKi8KKyAgc3ViYnVmID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfc3ViYnVmZmVyIChydHAsIDgsIC0xKTsKKyAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwZ3N0ZGVwYXktPmFkYXB0ZXIsIHN1YmJ1Zik7CisKKyAgb2Zmc2V0ID0gMDsKKyAgaWYgKGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCkpIHsKKyAgICBndWludCBhdmFpbDsKKyAgICBHc3RDYXBzICpvdXRjYXBzOworCisgICAgLyogdGFrZSB0aGUgYnVmZmVyICovCisgICAgYXZhaWwgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cGdzdGRlcGF5LT5hZGFwdGVyKTsKKyAgICBvdXRidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwZ3N0ZGVwYXktPmFkYXB0ZXIsIGF2YWlsKTsKKworICAgIENWID0gKHBheWxvYWRbMF0gPj4gNCkgJiAweDc7CisKKyAgICBpZiAocGF5bG9hZFswXSAmIDB4ODApIHsKKyAgICAgIGd1aW50IHNpemU7CisKKyAgICAgIC8qIEMgYml0LCB3ZSBoYXZlIGlubGluZSBjYXBzICovCisgICAgICBvdXRjYXBzID0gcmVhZF9jYXBzIChydHBnc3RkZXBheSwgb3V0YnVmLCAmc2l6ZSk7CisgICAgICBpZiAob3V0Y2FwcyA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vX2NhcHM7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGdzdGRlcGF5LAorICAgICAgICAgICJpbmxpbmUgY2FwcyAldSwgbGVuZ3RoICV1LCAlIiBHU1RfUFRSX0ZPUk1BVCwgQ1YsIHNpemUsIG91dGNhcHMpOworCisgICAgICBzdG9yZV9jYWNoZSAocnRwZ3N0ZGVwYXksIENWLCBvdXRjYXBzKTsKKworICAgICAgLyogc2tpcCBjYXBzICovCisgICAgICBvZmZzZXQgKz0gc2l6ZTsKKyAgICAgIGF2YWlsIC09IHNpemU7CisgICAgfQorICAgIGlmIChwYXlsb2FkWzFdKSB7CisgICAgICBndWludCBzaXplOworICAgICAgR3N0RXZlbnQgKmV2ZW50OworCisgICAgICAvKiB3ZSBoYXZlIGFuIGV2ZW50ICovCisgICAgICBldmVudCA9IHJlYWRfZXZlbnQgKHJ0cGdzdGRlcGF5LCBwYXlsb2FkWzFdLCBvdXRidWYsICZzaXplKTsKKyAgICAgIGlmIChldmVudCA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vX2V2ZW50OworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBnc3RkZXBheSwKKyAgICAgICAgICAiaW5saW5lIGV2ZW50LCBsZW5ndGggJXUsICUiIEdTVF9QVFJfRk9STUFULCBzaXplLCBldmVudCk7CisKKyAgICAgIHN0b3JlX2V2ZW50IChydHBnc3RkZXBheSwgZXZlbnQpOworCisgICAgICAvKiBubyBidWZmZXIgYWZ0ZXIgZXZlbnQgKi8KKyAgICAgIGF2YWlsID0gMDsKKyAgICB9CisKKyAgICBpZiAoYXZhaWwpIHsKKyAgICAgIGlmIChvZmZzZXQgIT0gMCkgeworICAgICAgICBHc3RCdWZmZXIgKnRlbXA7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwZ3N0ZGVwYXksICJzdWIgYnVmZmVyOiBvZmZzZXQgJXUsIHNpemUgJXUiLCBvZmZzZXQsCisgICAgICAgICAgICBhdmFpbCk7CisKKyAgICAgICAgdGVtcCA9CisgICAgICAgICAgICBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChvdXRidWYsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIG9mZnNldCwgYXZhaWwpOworCisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1Zik7CisgICAgICAgIG91dGJ1ZiA9IHRlbXA7CisgICAgICB9CisKKyAgICAgIC8qIHNlZSB3aGF0IGNhcHMgd2UgbmVlZCAqLworICAgICAgaWYgKENWICE9IHJ0cGdzdGRlcGF5LT5jdXJyZW50X0NWKSB7CisgICAgICAgIC8qIHdlIG5lZWQgdG8gc3dpdGNoIGNhcHMsIGNoZWNrIGlmIHdlIGhhdmUgdGhlIGNhcHMgKi8KKyAgICAgICAgaWYgKChvdXRjYXBzID0gcnRwZ3N0ZGVwYXktPkNWX2NhY2hlW0NWXSkgPT0gTlVMTCkKKyAgICAgICAgICBnb3RvIG1pc3NpbmdfY2FwczsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBnc3RkZXBheSwKKyAgICAgICAgICAgICJuZWVkIGNhcHMgc3dpdGNoIGZyb20gJXUgdG8gJXUsICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICAgICAgcnRwZ3N0ZGVwYXktPmN1cnJlbnRfQ1YsIENWLCBvdXRjYXBzKTsKKworICAgICAgICAvKiBhbmQgc2V0IGNhcHMgKi8KKyAgICAgICAgaWYgKGdzdF9wYWRfc2V0X2NhcHMgKGRlcGF5bG9hZC0+c3JjcGFkLCBvdXRjYXBzKSkKKyAgICAgICAgICBydHBnc3RkZXBheS0+Y3VycmVudF9DViA9IENWOworICAgICAgfQorCisgICAgICBpZiAocGF5bG9hZFswXSAmIDB4OCkKKyAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1Zik7CisgICAgICBvdXRidWYgPSBOVUxMOworICAgIH0KKyAgfQorCisgIGlmIChvdXRidWYpIHsKKyAgICBnc3RfcnRwX2Ryb3BfbWV0YSAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwZ3N0ZGVwYXkpLCBvdXRidWYsIDApOworICB9CisKKyAgcmV0dXJuIG91dGJ1ZjsKKworICAvKiBFUlJPUlMgKi8KK2VtcHR5X3BhY2tldDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cGdzdGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJFbXB0eSBQYXlsb2FkLiIpLCAoTlVMTCkpOworICAgIHJldHVybiBOVUxMOworICB9Cit3cm9uZ19mcmFnOgorICB7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGdzdGRlcGF5LT5hZGFwdGVyKTsKKyAgICBHU1RfTE9HX09CSkVDVCAocnRwZ3N0ZGVwYXksICJ3cm9uZyBmcmFnbWVudCwgc2tpcHBpbmciKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorbm9fY2FwczoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwZ3N0ZGVwYXksICJmYWlsZWQgdG8gcGFyc2UgY2FwcyIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1Zik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK25vX2V2ZW50OgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChydHBnc3RkZXBheSwgImZhaWxlZCB0byBwYXJzZSBldmVudCIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1Zik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK21pc3NpbmdfY2FwczoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cGdzdGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJNaXNzaW5nIGNhcHMgJXUuIiwgQ1YpLCAoTlVMTCkpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1Zik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2dzdF9kZXBheV9oYW5kbGVfZXZlbnQgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheSwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwR1NURGVwYXkgKnJ0cGdzdGRlcGF5OworCisgIHJ0cGdzdGRlcGF5ID0gR1NUX1JUUF9HU1RfREVQQVkgKGRlcGF5KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X3J0cF9nc3RfZGVwYXlfcmVzZXQgKHJ0cGdzdGRlcGF5LCBGQUxTRSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4KKyAgICAgIEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmhhbmRsZV9ldmVudCAoZGVwYXksIGV2ZW50KTsKK30KKworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfZ3N0X2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cEdTVERlcGF5ICpydHBnc3RkZXBheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJ0cGdzdGRlcGF5ID0gR1NUX1JUUF9HU1RfREVQQVkgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfcnRwX2dzdF9kZXBheV9yZXNldCAocnRwZ3N0ZGVwYXksIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfZ3N0X2RlcGF5X3Jlc2V0IChydHBnc3RkZXBheSwgVFJVRSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworCitnYm9vbGVhbgorZ3N0X3J0cF9nc3RfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBnc3RkZXBheSIsCisgICAgICBHU1RfUkFOS19NQVJHSU5BTCwgR1NUX1RZUEVfUlRQX0dTVF9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cGdzdGRlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4ZjJjNgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwZ3N0ZGVwYXkuaApAQCAtMCwwICsxLDY2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMTA+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfR1NUX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfR1NUX0RFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9HU1RfREVQQVkgXAorICAoZ3N0X3J0cF9nc3RfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9HU1RfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfR1NUX0RFUEFZLEdzdFJ0cEdTVERlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9HU1RfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0dTVF9ERVBBWSxHc3RSdHBHU1REZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HU1RfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfR1NUX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HU1RfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0dTVF9ERVBBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBHU1REZXBheSBHc3RSdHBHU1REZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBHU1REZXBheUNsYXNzIEdzdFJ0cEdTVERlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwR1NURGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKyAgZ3VpbnQgY3VycmVudF9DVjsKKyAgR3N0Q2FwcyAqQ1ZfY2FjaGVbOF07CisKKyAgR3N0VGFnTGlzdCAqdGFnczsKKyAgZ2NoYXIgKnN0cmVhbV9pZDsKK307CisKK3N0cnVjdCBfR3N0UnRwR1NURGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9nc3RfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2dzdF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9HU1RfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGdzdHBheS5jIGIvZ3N0L3J0cC9nc3RydHBnc3RwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTUxMWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBnc3RwYXkuYwpAQCAtMCwwICsxLDY2MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDEwPiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCisjaW5jbHVkZSAiZ3N0cnRwZ3N0cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF9wYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3J0cF9wYXlfZGVidWcKKworLyoKKyAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfEN8IENWICB8RHwwfDB8MHwgICAgIEVUWVBFICAgICB8ICBNQlogICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnX29mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqCisgKiBDOiBjYXBzIGlubGluZWQgZmxhZworICogICBXaGVuIEMgc2V0LCBmaXJzdCBwYXJ0IG9mIHBheWxvYWQgY29udGFpbnMgY2FwcyBkZWZpbml0aW9uLiBDYXBzIGRlZmluaXRpb24KKyAqICAgc3RhcnRzIHdpdGggdmFyaWFibGUtbGVuZ3RoIGxlbmd0aCBwcmVmaXggYW5kIHRoZW4gYSBzdHJpbmcgb2YgdGhhdCBsZW5ndGguCisgKiAgIHRoZSBsZW5ndGggaXMgZW5jb2RlZCBpbiBiaWcgZW5kaWFuIDcgYml0IGNodW5rcywgdGhlIHRvcCAxIGJpdCBvZiBhIGJ5dGUKKyAqICAgaXMgdGhlIGNvbnRpbnVhdGlvbiBtYXJrZXIgYW5kIHRoZSA3IG5leHQgYml0cyB0aGUgZGF0YS4gQSBjb250aW51YXRpb24KKyAqICAgbWFya2VyIG9mIDEgbWVhbnMgdGhhdCB0aGUgbmV4dCBieXRlIGNvbnRhaW5zIG1vcmUgZGF0YS4KKyAqCisgKiBDVjogY2FwcyB2ZXJzaW9uLCAwID0gY2FwcyBmcm9tIFNEUCwgMSAtIDcgaW5saW5lZCBjYXBzCisgKiBEOiBkZWx0YSB1bml0IGJ1ZmZlcgorICogRVRZUEU6IHR5cGUgb2YgZXZlbnQuIFBheWxvYWQgY29udGFpbnMgdGhlIGV2ZW50LCBwcmVmaXhlZCB3aXRoIGEKKyAqICAgICAgICB2YXJpYWJsZSBsZW5ndGggZmllbGQuCisgKiAgIDAgPSBOTyBldmVudAorICogICAxID0gR1NUX0VWRU5UX1RBRworICogICAyID0gR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNCisgKiAgIDMgPSBHU1RfRVZFTlRfQ1VTVE9NX0JPVEgKKyAqICAgNCA9IEdTVF9FVkVOVF9TVFJFQU1fU1RBUlQKKyAqLworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9nc3RfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2dzdF9wYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImFwcGxpY2F0aW9uXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIlgtR1NUXCIiKQorICAgICk7CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0NPTkZJR19JTlRFUlZBTAorfTsKKworI2RlZmluZSBERUZBVUxUX0NPTkZJR19JTlRFUlZBTAkJICAgICAgMAorCitzdGF0aWMgdm9pZCBnc3RfcnRwX2dzdF9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9nc3RfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfZ3N0X3BheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iaik7CitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9nc3RfcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2dzdF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfZ3N0X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2dzdF9wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCisjZGVmaW5lIGdzdF9ydHBfZ3N0X3BheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBHU1RQYXksIGdzdF9ydHBfZ3N0X3BheSwgR1NUX1RZUEVfUlRQX0JBU0VfUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2dzdF9wYXlfY2xhc3NfaW5pdCAoR3N0UnRwR1NUUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX2dzdF9wYXlfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX2dzdF9wYXlfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfZ3N0X3BheV9maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgUFJPUF9DT05GSUdfSU5URVJWQUwsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoImNvbmZpZy1pbnRlcnZhbCIsCisgICAgICAgICAgIkNhcHMvVGFncyBTZW5kIEludGVydmFsIiwKKyAgICAgICAgICAiSW50ZXJ2YWwgZm9yIHNlbmRpbmcgY2FwcyBhbmQgVEFHIGV2ZW50cyBpbiBzZWNvbmRzICgwID0gZGlzYWJsZWQpIiwKKyAgICAgICAgICAwLCAzNjAwLCBERUZBVUxUX0NPTkZJR19JTlRFUlZBTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpCisgICAgICApOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfZ3N0X3BheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9nc3RfcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfZ3N0X3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBHU3RyZWFtZXIgcGF5bG9hZGVyIiwgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZCBHU3RyZWFtZXIgYnVmZmVycyBhcyBSVFAgcGFja2V0cyIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2dzdF9wYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX2dzdF9wYXlfaGFuZGxlX2J1ZmZlcjsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNpbmtfZXZlbnQgPSBnc3RfcnRwX2dzdF9wYXlfc2lua19ldmVudDsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3J0cF9wYXlfZGVidWcsICJydHBnc3RwYXkiLCAwLAorICAgICAgInJ0cGdzdHBheSBlbGVtZW50Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2dzdF9wYXlfaW5pdCAoR3N0UnRwR1NUUGF5ICogcnRwZ3N0cGF5KQoreworICBydHBnc3RwYXktPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIHJ0cGdzdHBheS0+cGVuZGluZ19idWZmZXJzID0gTlVMTDsKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBnc3RwYXkpLAorICAgICAgImFwcGxpY2F0aW9uIiwgVFJVRSwgIlgtR1NUIiwgOTAwMDApOworICBydHBnc3RwYXktPmxhc3RfY29uZmlnID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgcnRwZ3N0cGF5LT50YWdsaXN0ID0gTlVMTDsKKyAgcnRwZ3N0cGF5LT5jb25maWdfaW50ZXJ2YWwgPSBERUZBVUxUX0NPTkZJR19JTlRFUlZBTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZ3N0X3BheV9yZXNldCAoR3N0UnRwR1NUUGF5ICogcnRwZ3N0cGF5LCBnYm9vbGVhbiBmdWxsKQoreworICBydHBnc3RwYXktPmxhc3RfY29uZmlnID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGdzdHBheS0+YWRhcHRlcik7CisgIHJ0cGdzdHBheS0+ZmxhZ3MgJj0gMHg3MDsKKyAgcnRwZ3N0cGF5LT5ldHlwZSA9IDA7CisgIGlmIChydHBnc3RwYXktPnBlbmRpbmdfYnVmZmVycykKKyAgICBnX2xpc3RfZnJlZV9mdWxsIChydHBnc3RwYXktPnBlbmRpbmdfYnVmZmVycywKKyAgICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX2xpc3RfdW5yZWYpOworICBydHBnc3RwYXktPnBlbmRpbmdfYnVmZmVycyA9IE5VTEw7CisgIGlmIChmdWxsKSB7CisgICAgaWYgKHJ0cGdzdHBheS0+dGFnbGlzdCkKKyAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAocnRwZ3N0cGF5LT50YWdsaXN0KTsKKyAgICBydHBnc3RwYXktPnRhZ2xpc3QgPSBOVUxMOworICAgIGdfZnJlZSAocnRwZ3N0cGF5LT5zdHJlYW1faWQpOworICAgIHJ0cGdzdHBheS0+c3RyZWFtX2lkID0gTlVMTDsKKyAgICBydHBnc3RwYXktPmN1cnJlbnRfQ1YgPSAwOworICAgIHJ0cGdzdHBheS0+bmV4dF9DViA9IDA7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZ3N0X3BheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iaikKK3sKKyAgR3N0UnRwR1NUUGF5ICpydHBnc3RwYXk7CisKKyAgcnRwZ3N0cGF5ID0gR1NUX1JUUF9HU1RfUEFZIChvYmopOworCisgIGdzdF9ydHBfZ3N0X3BheV9yZXNldCAocnRwZ3N0cGF5LCBUUlVFKTsKKworICBnX29iamVjdF91bnJlZiAocnRwZ3N0cGF5LT5hZGFwdGVyKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iaik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2dzdF9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cEdTVFBheSAqcnRwZ3N0cGF5OworCisgIHJ0cGdzdHBheSA9IEdTVF9SVFBfR1NUX1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ09ORklHX0lOVEVSVkFMOgorICAgICAgcnRwZ3N0cGF5LT5jb25maWdfaW50ZXJ2YWwgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2dzdF9wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cEdTVFBheSAqcnRwZ3N0cGF5OworCisgIHJ0cGdzdHBheSA9IEdTVF9SVFBfR1NUX1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ09ORklHX0lOVEVSVkFMOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0cGdzdHBheS0+Y29uZmlnX2ludGVydmFsKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2dzdF9wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UnRwR1NUUGF5ICpydHBnc3RwYXk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBydHBnc3RwYXkgPSBHU1RfUlRQX0dTVF9QQVkgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfcnRwX2dzdF9wYXlfcmVzZXQgKHJ0cGdzdHBheSwgVFJVRSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3J0cF9nc3RfcGF5X3Jlc2V0IChydHBnc3RwYXksIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgUlRQX0hFQURFUl9MRU4gMTIKKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2dzdF9wYXlfY3JlYXRlX2Zyb21fYWRhcHRlciAoR3N0UnRwR1NUUGF5ICogcnRwZ3N0cGF5LAorICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXApCit7CisgIGd1aW50IGF2YWlsLCBtdHU7CisgIGd1aW50IGZyYWdfb2Zmc2V0OworICBHc3RCdWZmZXJMaXN0ICpsaXN0OworCisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBnc3RwYXktPmFkYXB0ZXIpOworICBpZiAoYXZhaWwgPT0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbXR1ID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChydHBnc3RwYXkpOworCisgIGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3X3NpemVkICgoYXZhaWwgLyAobXR1IC0gKFJUUF9IRUFERVJfTEVOICsgOCkpKSArIDEpOworICBmcmFnX29mZnNldCA9IDA7CisKKyAgd2hpbGUgKGF2YWlsKSB7CisgICAgZ3VpbnQgdG93cml0ZTsKKyAgICBndWludDggKnBheWxvYWQ7CisgICAgZ3VpbnQgcGF5bG9hZF9sZW47CisgICAgZ3VpbnQgcGFja2V0X2xlbjsKKyAgICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisgICAgR3N0QnVmZmVyICpwYXlidWY7CisKKworICAgIC8qIHRoaXMgd2lsbCBiZSB0aGUgdG90YWwgbGVuZ2h0IG9mIHRoZSBwYWNrZXQgKi8KKyAgICBwYWNrZXRfbGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYWNrZXRfbGVuICg4ICsgYXZhaWwsIDAsIDApOworCisgICAgLyogZmlsbCBvbmUgTVRVIG9yIGFsbCBhdmFpbGFibGUgYnl0ZXMgKi8KKyAgICB0b3dyaXRlID0gTUlOIChwYWNrZXRfbGVuLCBtdHUpOworCisgICAgLyogdGhpcyBpcyB0aGUgcGF5bG9hZCBsZW5ndGggKi8KKyAgICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2NhbGNfcGF5bG9hZF9sZW4gKHRvd3JpdGUsIDAsIDApOworCisgICAgLyogY3JlYXRlIGJ1ZmZlciB0byBob2xkIHRoZSBoZWFkZXIgKi8KKyAgICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKDgsIDAsIDApOworCisgICAgZ3N0X3J0cF9idWZmZXJfbWFwIChvdXRidWYsIEdTVF9NQVBfV1JJVEUsICZydHApOworICAgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBnc3RwYXksICJuZXcgcGFja2V0IGxlbiAldSwgZnJhZyAldSIsIHBhY2tldF9sZW4sCisgICAgICAgIGZyYWdfb2Zmc2V0KTsKKworICAgIC8qCisgICAgICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKiB8Q3wgQ1YgIHxEfDB8MHwwfCAgICAgRVRZUEUgICAgIHwgIE1CWiAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ19vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqLworICAgIHBheWxvYWRbMF0gPSBydHBnc3RwYXktPmZsYWdzOworICAgIHBheWxvYWRbMV0gPSBydHBnc3RwYXktPmV0eXBlOworICAgIHBheWxvYWRbMl0gPSBwYXlsb2FkWzNdID0gMDsKKyAgICBwYXlsb2FkWzRdID0gZnJhZ19vZmZzZXQgPj4gMjQ7CisgICAgcGF5bG9hZFs1XSA9IGZyYWdfb2Zmc2V0ID4+IDE2OworICAgIHBheWxvYWRbNl0gPSBmcmFnX29mZnNldCA+PiA4OworICAgIHBheWxvYWRbN10gPSBmcmFnX29mZnNldCAmIDB4ZmY7CisKKyAgICBwYXlsb2FkICs9IDg7CisgICAgcGF5bG9hZF9sZW4gLT0gODsKKworICAgIGZyYWdfb2Zmc2V0ICs9IHBheWxvYWRfbGVuOworICAgIGF2YWlsIC09IHBheWxvYWRfbGVuOworCisgICAgaWYgKGF2YWlsID09IDApCisgICAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBUUlVFKTsKKworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAgIC8qIGNyZWF0ZSBhIG5ldyBidWYgdG8gaG9sZCB0aGUgcGF5bG9hZCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGdzdHBheSwgInRha2UgJXUgYnl0ZXMgZnJvbSBhZGFwdGVyIiwgcGF5bG9hZF9sZW4pOworICAgIHBheWJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyX2Zhc3QgKHJ0cGdzdHBheS0+YWRhcHRlciwgcGF5bG9hZF9sZW4pOworCisgICAgLyogY3JlYXRlIGEgbmV3IGdyb3VwIHRvIGhvbGQgdGhlIHJ0cCBoZWFkZXIgYW5kIHRoZSBwYXlsb2FkICovCisgICAgZ3N0X3J0cF9jb3B5X21ldGEgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cGdzdHBheSksIG91dGJ1ZiwgcGF5YnVmLCAwKTsKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAob3V0YnVmLCBwYXlidWYpOworCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSB0aW1lc3RhbXA7CisKKyAgICAvKiBhbmQgYWRkIHRvIGxpc3QgKi8KKyAgICBnc3RfYnVmZmVyX2xpc3RfaW5zZXJ0IChsaXN0LCAtMSwgb3V0YnVmKTsKKyAgfQorCisgIHJ0cGdzdHBheS0+ZmxhZ3MgJj0gMHg3MDsKKyAgcnRwZ3N0cGF5LT5ldHlwZSA9IDA7CisgIHJ0cGdzdHBheS0+cGVuZGluZ19idWZmZXJzID0gZ19saXN0X2FwcGVuZCAocnRwZ3N0cGF5LT5wZW5kaW5nX2J1ZmZlcnMsIGxpc3QpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9nc3RfcGF5X2ZsdXNoIChHc3RSdHBHU1RQYXkgKiBydHBnc3RwYXksIEdzdENsb2NrVGltZSB0aW1lc3RhbXApCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdMaXN0ICppdGVyOworCisgIGdzdF9ydHBfZ3N0X3BheV9jcmVhdGVfZnJvbV9hZGFwdGVyIChydHBnc3RwYXksIHRpbWVzdGFtcCk7CisKKyAgaXRlciA9IHJ0cGdzdHBheS0+cGVuZGluZ19idWZmZXJzOworICB3aGlsZSAoaXRlcikgeworICAgIEdzdEJ1ZmZlckxpc3QgKmxpc3QgPSBpdGVyLT5kYXRhOworCisgICAgcnRwZ3N0cGF5LT5wZW5kaW5nX2J1ZmZlcnMgPSBpdGVyID0KKyAgICAgICAgZ19saXN0X2RlbGV0ZV9saW5rIChydHBnc3RwYXktPnBlbmRpbmdfYnVmZmVycywgaXRlcik7CisKKyAgICAvKiBwdXNoIHRoZSB3aG9sZSBidWZmZXIgbGlzdCBhdCBvbmNlICovCisgICAgcmV0ID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfcHVzaF9saXN0IChHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwZ3N0cGF5KSwKKyAgICAgICAgbGlzdCk7CisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCittYWtlX2RhdGFfYnVmZmVyIChHc3RSdHBHU1RQYXkgKiBydHBnc3RwYXksIGdjaGFyICogZGF0YSwgZ3VpbnQgc2l6ZSkKK3sKKyAgZ3VpbnQgcGxlbjsKKyAgZ3VpbnQ4ICpwdHI7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RNYXBJbmZvIG1hcDsKKworICAvKiBjYWxjdWxhdGUgbGVuZ3RoICovCisgIHBsZW4gPSAxOworICB3aGlsZSAoc2l6ZSA+PiAoNyAqIHBsZW4pKQorICAgIHBsZW4rKzsKKworICBvdXRidWYgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgcGxlbiArIHNpemUsIE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBwdHIgPSBtYXAuZGF0YTsKKworICAvKiB3cml0ZSBsZW5ndGggKi8KKyAgd2hpbGUgKHBsZW4pIHsKKyAgICBwbGVuLS07CisgICAgKnB0cisrID0gKChwbGVuID4gMCkgPyAweDgwIDogMCkgfCAoKHNpemUgPj4gKDcgKiBwbGVuKSkgJiAweDdmKTsKKyAgfQorICAvKiBjb3B5IGRhdGEgKi8KKyAgbWVtY3B5IChwdHIsIGRhdGEsIHNpemUpOworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWYsICZtYXApOworCisgIHJldHVybiBvdXRidWY7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2dzdF9wYXlfc2VuZF9jYXBzIChHc3RSdHBHU1RQYXkgKiBydHBnc3RwYXksIGd1aW50OCBjdiwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIGdjaGFyICpjYXBzc3RyOworICBndWludCBjYXBzbGVuOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKworICBpZiAocnRwZ3N0cGF5LT5mbGFncyAmICgxIDw8IDcpKQorICAgIHJldHVybjsKKworICBjYXBzc3RyID0gZ3N0X2NhcHNfdG9fc3RyaW5nIChjYXBzKTsKKyAgY2Fwc2xlbiA9IHN0cmxlbiAoY2Fwc3N0cik7CisgIC8qIGZvciAwIGJ5dGUgKi8KKyAgY2Fwc2xlbisrOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGdzdHBheSwgInNlbmRpbmcgY2Fwcz0lcyIsIGNhcHNzdHIpOworCisgIC8qIG1ha2UgYSBkYXRhIGJ1ZmZlciBvZiBpdCAqLworICBvdXRidWYgPSBtYWtlX2RhdGFfYnVmZmVyIChydHBnc3RwYXksIGNhcHNzdHIsIGNhcHNsZW4pOworICBnX2ZyZWUgKGNhcHNzdHIpOworCisgIC8qIHN0b3JlIGluIGFkYXB0ZXIsIHdlIGRvbid0IGZsdXNoIHlldCwgYnVmZmVyIG1pZ2h0IGZvbGxvdyAqLworICBydHBnc3RwYXktPmZsYWdzID0gKDEgPDwgNykgfCAoY3YgPDwgNCk7CisgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGdzdHBheS0+YWRhcHRlciwgb3V0YnVmKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2dzdF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UnRwR1NUUGF5ICpydHBnc3RwYXk7CisgIGdib29sZWFuIHJlczsKKyAgZ2NoYXIgKmNhcHNzdHIsICpjYXBzZW5jLCAqY2Fwc3ZlcjsKKyAgZ3VpbnQgY2Fwc2xlbjsKKworICBydHBnc3RwYXkgPSBHU1RfUlRQX0dTVF9QQVkgKHBheWxvYWQpOworCisgIGNhcHNzdHIgPSBnc3RfY2Fwc190b19zdHJpbmcgKGNhcHMpOworICBjYXBzbGVuID0gc3RybGVuIChjYXBzc3RyKTsKKworICAvKiBlbmNvZGUgd2l0aG91dCAwIGJ5dGUgKi8KKyAgY2Fwc2VuYyA9IGdfYmFzZTY0X2VuY29kZSAoKGd1Y2hhciAqKSBjYXBzc3RyLCBjYXBzbGVuKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocGF5bG9hZCwgImNhcHM9JXMsIGNhcHMoYmFzZTY0KT0lcyIsIGNhcHNzdHIsIGNhcHNlbmMpOworICBnX2ZyZWUgKGNhcHNzdHIpOworCisgIC8qIFNlbmQgdGhlIG5ldyBjYXBzICovCisgIHJ0cGdzdHBheS0+Y3VycmVudF9DViA9IHJ0cGdzdHBheS0+bmV4dF9DVjsKKyAgcnRwZ3N0cGF5LT5uZXh0X0NWID0gKHJ0cGdzdHBheS0+bmV4dF9DViArIDEpICYgMHg3OworICBnc3RfcnRwX2dzdF9wYXlfc2VuZF9jYXBzIChydHBnc3RwYXksIHJ0cGdzdHBheS0+Y3VycmVudF9DViwgY2Fwcyk7CisKKyAgLyogbWFrZSBjYXBzIGZvciBTRFAgKi8KKyAgY2Fwc3ZlciA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgcnRwZ3N0cGF5LT5jdXJyZW50X0NWKTsKKyAgcmVzID0KKyAgICAgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXlsb2FkLCAiY2FwcyIsIEdfVFlQRV9TVFJJTkcsIGNhcHNlbmMsCisgICAgICAiY2Fwc3ZlcnNpb24iLCBHX1RZUEVfU1RSSU5HLCBjYXBzdmVyLCBOVUxMKTsKKyAgZ19mcmVlIChjYXBzZW5jKTsKKyAgZ19mcmVlIChjYXBzdmVyKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9nc3RfcGF5X3NlbmRfZXZlbnQgKEdzdFJ0cEdTVFBheSAqIHJ0cGdzdHBheSwgZ3VpbnQgZXR5cGUsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzOworICBnY2hhciAqZXN0cjsKKyAgZ3VpbnQgZWxlbjsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisKKyAgLyogQ3JlYXRlIHRoZSBzdGFuZGFsb25lIGNhcHMgcGFja2V0IGlmIGFuIGlubGluZWQgY2FwcyB3YXMgcGVuZGluZyAqLworICBnc3RfcnRwX2dzdF9wYXlfY3JlYXRlX2Zyb21fYWRhcHRlciAocnRwZ3N0cGF5LCBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKworICBzID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKworICBlc3RyID0gZ3N0X3N0cnVjdHVyZV90b19zdHJpbmcgKHMpOworICBlbGVuID0gc3RybGVuIChlc3RyKTsKKyAgLyogZm9yIDAgYnl0ZSAqLworICBlbGVuKys7CisgIG91dGJ1ZiA9IG1ha2VfZGF0YV9idWZmZXIgKHJ0cGdzdHBheSwgZXN0ciwgZWxlbik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGdzdHBheSwgInNlbmRpbmcgZXZlbnQ9JXMiLCBlc3RyKTsKKyAgZ19mcmVlIChlc3RyKTsKKworICBydHBnc3RwYXktPmV0eXBlID0gZXR5cGU7CisgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGdzdHBheS0+YWRhcHRlciwgb3V0YnVmKTsKKyAgLyogQ3JlYXRlIHRoZSBldmVudCBwYWNrZXQgbm93IHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggZGF0YS9jYXBzIHBhY2tldHMgKi8KKyAgZ3N0X3J0cF9nc3RfcGF5X2NyZWF0ZV9mcm9tX2FkYXB0ZXIgKHJ0cGdzdHBheSwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9nc3RfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmV0OworICBHc3RSdHBHU1RQYXkgKnJ0cGdzdHBheTsKKyAgZ3VpbnQgZXR5cGUgPSAwOworCisgIHJ0cGdzdHBheSA9IEdTVF9SVFBfR1NUX1BBWSAocGF5bG9hZCk7CisKKyAgcmV0ID0KKyAgICAgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChwYXlsb2FkLAorICAgICAgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X3J0cF9nc3RfcGF5X3Jlc2V0IChydHBnc3RwYXksIEZBTFNFKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX1RBRzp7CisgICAgICBHc3RUYWdMaXN0ICp0YWdzOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfdGFnIChldmVudCwgJnRhZ3MpOworCisgICAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF9zY29wZSAodGFncykgPT0gR1NUX1RBR19TQ09QRV9TVFJFQU0pIHsKKyAgICAgICAgR3N0VGFnTGlzdCAqb2xkOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGdzdHBheSwgInN0b3Jpbmcgc3RyZWFtIHRhZ3MgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgICB0YWdzKTsKKyAgICAgICAgaWYgKChvbGQgPSBydHBnc3RwYXktPnRhZ2xpc3QpKQorICAgICAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAob2xkKTsKKyAgICAgICAgcnRwZ3N0cGF5LT50YWdsaXN0ID0gZ3N0X3RhZ19saXN0X3JlZiAodGFncyk7CisgICAgICB9CisgICAgICBldHlwZSA9IDE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU06CisgICAgICBldHlwZSA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9DVVNUT01fQk9USDoKKyAgICAgIGV0eXBlID0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX1NUUkVBTV9TVEFSVDp7CisgICAgICBjb25zdCBnY2hhciAqc3RyZWFtX2lkID0gTlVMTDsKKworICAgICAgaWYgKHJ0cGdzdHBheS0+dGFnbGlzdCkKKyAgICAgICAgZ3N0X3RhZ19saXN0X3VucmVmIChydHBnc3RwYXktPnRhZ2xpc3QpOworICAgICAgcnRwZ3N0cGF5LT50YWdsaXN0ID0gTlVMTDsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3N0cmVhbV9zdGFydCAoZXZlbnQsICZzdHJlYW1faWQpOworICAgICAgaWYgKHN0cmVhbV9pZCkgeworICAgICAgICBnX2ZyZWUgKHJ0cGdzdHBheS0+c3RyZWFtX2lkKTsKKyAgICAgICAgcnRwZ3N0cGF5LT5zdHJlYW1faWQgPSBnX3N0cmR1cCAoc3RyZWFtX2lkKTsKKyAgICAgIH0KKyAgICAgIGV0eXBlID0gNDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGdzdHBheSwgIm5vIGV2ZW50IGZvciAlcyIsCisgICAgICAgICAgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChldHlwZSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGdzdHBheSwgIm1ha2UgZXZlbnQgdHlwZSAlZCBmb3IgJXMiLAorICAgICAgICBldHlwZSwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKyAgICBnc3RfcnRwX2dzdF9wYXlfc2VuZF9ldmVudCAocnRwZ3N0cGF5LCBldHlwZSwgZXZlbnQpOworICAgIC8qIERvIG5vdCBzZW5kIHN0cmVhbS1zdGFydCByaWdodCBhd2F5IHNpbmNlIGNhcHMvbmV3LXNlZ21lbnQgd2VyZSBub3QgeWV0CisgICAgICAgc2VudCwgc28gb3VyIGRhdGEgd291bGQgYmUgY29uc2lkZXJlZCBpbnZhbGlkICovCisgICAgaWYgKGV0eXBlICE9IDQpIHsKKyAgICAgIC8qIGZsdXNoIHRoZSBhZGFwdGVyIGltbWVkaWF0ZWx5ICovCisgICAgICBnc3RfcnRwX2dzdF9wYXlfZmx1c2ggKHJ0cGdzdHBheSwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgICAgfQorICB9CisKKyAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZ3N0X3BheV9zZW5kX2NvbmZpZyAoR3N0UnRwR1NUUGF5ICogcnRwZ3N0cGF5LCBHc3RDbG9ja1RpbWUgdGltZXN0YW1wKQoreworICBHc3RQYWQgKnBhZCA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NJTktQQUQgKHJ0cGdzdHBheSk7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworICBHc3RFdmVudCAqdGFnID0gTlVMTDsKKyAgR3N0RXZlbnQgKnN0cmVhbV9zdGFydCA9IE5VTEw7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwZ3N0cGF5LCAidGltZSB0byBzZW5kIGNvbmZpZyIpOworICAvKiBTZW5kIHRhZ3MgKi8KKyAgaWYgKHJ0cGdzdHBheS0+dGFnbGlzdCAmJiAhZ3N0X3RhZ19saXN0X2lzX2VtcHR5IChydHBnc3RwYXktPnRhZ2xpc3QpKQorICAgIHRhZyA9IGdzdF9ldmVudF9uZXdfdGFnIChnc3RfdGFnX2xpc3RfcmVmIChydHBnc3RwYXktPnRhZ2xpc3QpKTsKKyAgaWYgKHRhZykgeworICAgIC8qIFNlbmQgc3RhcnQtc3RyZWFtIHRvIGNsZWFyIHRhZ3MgKi8KKyAgICBpZiAocnRwZ3N0cGF5LT5zdHJlYW1faWQpCisgICAgICBzdHJlYW1fc3RhcnQgPSBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAocnRwZ3N0cGF5LT5zdHJlYW1faWQpOworICAgIGlmIChzdHJlYW1fc3RhcnQpIHsKKyAgICAgIGdzdF9ydHBfZ3N0X3BheV9zZW5kX2V2ZW50IChydHBnc3RwYXksIDQsIHN0cmVhbV9zdGFydCk7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKHN0cmVhbV9zdGFydCk7CisgICAgfQorICAgIGdzdF9ydHBfZ3N0X3BheV9zZW5kX2V2ZW50IChydHBnc3RwYXksIDEsIHRhZyk7CisgICAgZ3N0X2V2ZW50X3VucmVmICh0YWcpOworICB9CisgIC8qIHNlbmQgY2FwcyAqLworICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChwYWQpOworICBpZiAoY2FwcykgeworICAgIGdzdF9ydHBfZ3N0X3BheV9zZW5kX2NhcHMgKHJ0cGdzdHBheSwgcnRwZ3N0cGF5LT5jdXJyZW50X0NWLCBjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIH0KKyAgcnRwZ3N0cGF5LT5sYXN0X2NvbmZpZyA9IHRpbWVzdGFtcDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfZ3N0X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdFJ0cEdTVFBheSAqcnRwZ3N0cGF5OworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworCisgIHJ0cGdzdHBheSA9IEdTVF9SVFBfR1NUX1BBWSAoYmFzZXBheWxvYWQpOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworCisgIC8qIGNoZWNrIGlmIHdlIG5lZWQgdG8gc2VuZCB0aGUgY2FwcyBhbmQgdGFnbGlzdCBub3cgKi8KKyAgaWYgKHJ0cGdzdHBheS0+Y29uZmlnX2ludGVydmFsID4gMCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGdzdHBheSwKKyAgICAgICAgInRpbWVzdGFtcCAlIiBHU1RfVElNRV9GT1JNQVQgIiwgbGFzdCBjb25maWcgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApLCBHU1RfVElNRV9BUkdTIChydHBnc3RwYXktPmxhc3RfY29uZmlnKSk7CisKKyAgICBpZiAodGltZXN0YW1wICE9IEdTVF9DTE9DS19USU1FX05PTkUgJiYKKyAgICAgICAgcnRwZ3N0cGF5LT5sYXN0X2NvbmZpZyAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgICBndWludDY0IGRpZmY7CisKKyAgICAgIC8qIGNhbGN1bGF0ZSBkaWZmIGJldHdlZW4gbGFzdCBTUFMvUFBTIGluIG1pbGxpc2Vjb25kcyAqLworICAgICAgaWYgKHRpbWVzdGFtcCA+IHJ0cGdzdHBheS0+bGFzdF9jb25maWcpCisgICAgICAgIGRpZmYgPSB0aW1lc3RhbXAgLSBydHBnc3RwYXktPmxhc3RfY29uZmlnOworICAgICAgZWxzZQorICAgICAgICBkaWZmID0gMDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwZ3N0cGF5LAorICAgICAgICAgICJpbnRlcnZhbCBzaW5jZSBsYXN0IGNvbmZpZyAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGRpZmYpKTsKKworICAgICAgLyogYmlnZ2VyIHRoYW4gaW50ZXJ2YWwsIHF1ZXVlIFNQUy9QUFMgKi8KKyAgICAgIGlmIChHU1RfVElNRV9BU19TRUNPTkRTIChkaWZmKSA+PSBydHBnc3RwYXktPmNvbmZpZ19pbnRlcnZhbCkKKyAgICAgICAgZ3N0X3J0cF9nc3RfcGF5X3NlbmRfY29uZmlnIChydHBnc3RwYXksIHRpbWVzdGFtcCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdzdF9ydHBfZ3N0X3BheV9zZW5kX2NvbmZpZyAocnRwZ3N0cGF5LCB0aW1lc3RhbXApOworICAgIH0KKyAgfQorCisgIC8qIGNhcHMgYWx3YXlzIGZyb20gU0RQIGZvciBub3cgKi8KKyAgaWYgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpKQorICAgIHJ0cGdzdHBheS0+ZmxhZ3MgfD0gKDEgPDwgMyk7CisKKyAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwZ3N0cGF5LT5hZGFwdGVyLCBidWZmZXIpOworICByZXQgPSBnc3RfcnRwX2dzdF9wYXlfZmx1c2ggKHJ0cGdzdHBheSwgdGltZXN0YW1wKTsKKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9nc3RfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwZ3N0cGF5IiwKKyAgICAgIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX1JUUF9HU1RfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwZ3N0cGF5LmggYi9nc3QvcnRwL2dzdHJ0cGdzdHBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMjcyYjIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGdzdHBheS5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAxMD4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9HU1RfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfR1NUX1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VwYXlsb2FkLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0dTVF9QQVkgXAorICAoZ3N0X3J0cF9nc3RfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfR1NUX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9HU1RfUEFZLEdzdFJ0cEdTVFBheSkpCisjZGVmaW5lIEdTVF9SVFBfR1NUX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfR1NUX1BBWSxHc3RSdHBHU1RQYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfR1NUX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9HU1RfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9HU1RfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9HU1RfUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEdTVFBheSBHc3RSdHBHU1RQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwR1NUUGF5Q2xhc3MgR3N0UnRwR1NUUGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwR1NUUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisKKyAgR0xpc3QgKnBlbmRpbmdfYnVmZmVyczsgLyogR3N0QnVmZmVyTGlzdCAqLworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBndWludDggZmxhZ3M7CisgIGd1aW50OCBldHlwZTsKKworICBndWludDggY3VycmVudF9DVjsgLyogQ1YgZmllbGQgb2YgaW5jb21pbmcgY2FwcyovCisgIGd1aW50OCBuZXh0X0NWOworCisgIGdjaGFyICpzdHJlYW1faWQ7CisgIEdzdFRhZ0xpc3QgKnRhZ2xpc3Q7CisgIGd1aW50IGNvbmZpZ19pbnRlcnZhbDsKKyAgR3N0Q2xvY2tUaW1lIGxhc3RfY29uZmlnOworfTsKKworc3RydWN0IF9Hc3RSdHBHU1RQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfZ3N0X3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfZ3N0X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9HU1RfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBoMjYxZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwaDI2MWRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzNzIyOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaDI2MWRlcGF5LmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMTQ+IFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cGgyNjFkZXBheQorICogQHNlZV9hbHNvOiBydHBoMjYxcGF5CisgKgorICogRXh0cmFjdCBlbmNvZGVkIEguMjYxIHZpZGVvIGZyYW1lcyBmcm9tIFJUUCBwYWNrZXRzIGFjY29yZGluZyB0byBSRkMgNDU4Ny4KKyAqIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBzZWU6IGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM0NTg3LnR4dAorICoKKyAqIFRoZSBkZXBheWxvYWRlciB0YWtlcyBhbiBSVFAgcGFja2V0IGFuZCBleHRyYWN0cyBpdHMgSC4yNjEgc3RyZWFtLiBJdAorICogYWdncmVnYXRlcyB0aGUgZXh0cmFjdGVkIHN0cmVhbSB1bnRpbCBhIGNvbXBsZXRlIGZyYW1lIGlzIHJlY2VpdmVkIGJlZm9yZQorICogaXQgcHVzaGVzIGl0IGRvd25zdHJlYW0uCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHVkcHNyYyBjYXBzPSdhcHBsaWNhdGlvbi94LXJ0cCwgcGF5bG9hZD0zMScgISBydHBoMjYxZGVwYXkgISBhdmRlY19oMjYxICEgYXV0b3ZpZGVvc2luaworICogXXwgVGhpcyBleGFtcGxlIHBpcGVsaW5lIHdpbGwgZGVwYXlsb2FkIGFuZCBkZWNvZGUgYW4gUlRQIEguMjYxIHZpZGVvIHN0cmVhbS4KKyAqIFJlZmVyIHRvIHRoZSBydHBoMjYxcGF5IGV4YW1wbGUgdG8gY3JlYXRlIHRoZSBSVFAgc3RyZWFtLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlICJnc3RydHBoMjYxZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHBoMjYxcGF5LmgiICAgICAgLyogR3N0UnRwSDI2MVBheUhlYWRlciAqLworI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cGgyNjFkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwaDI2MWRlcGF5X2RlYnVnKQorCitzdGF0aWMgY29uc3QgZ3VpbnQ4IE5PX0xFRlRPVkVSID0gMHhGRjsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2MV9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtaDI2MSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2MV9kZXBheV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9IMjYxX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkgyNjFcIjsgIgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJIMjYxXCIiKQorICAgICk7CisKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEgyNjFEZXBheSwgZ3N0X3J0cF9oMjYxX2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfcnRwX2gyNjFfZGVwYXlfcGFyZW50X2NsYXNzCisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9oMjYxX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0UnRwSDI2MURlcGF5ICpkZXBheTsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBnaW50IHBheWxvYWRfbGVuOworICBndWludDggKnBheWxvYWQ7CisgIGNvbnN0IGd1aW50IGhlYWRlcl9sZW4gPSBHU1RfUlRQX0gyNjFfUEFZTE9BRF9IRUFERVJfTEVOOworICBnYm9vbGVhbiBtYXJrZXI7CisgIEdzdFJ0cEgyNjFQYXlIZWFkZXIgKmhlYWRlcjsKKworICBkZXBheSA9IEdTVF9SVFBfSDI2MV9ERVBBWSAoZGVwYXlsb2FkKTsKKworICBpZiAoR1NUX0JVRkZFUl9JU19ESVNDT05UIChydHAtPmJ1ZmZlcikpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheSwgIkRpc2NvbnQgYnVmZmVyLCBmbHVzaGluZyBhZGFwdGVyIik7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGRlcGF5LT5hZGFwdGVyKTsKKyAgICBkZXBheS0+bGVmdG92ZXIgPSBOT19MRUZUT1ZFUjsKKyAgICBkZXBheS0+c3RhcnQgPSBGQUxTRTsKKyAgfQorCisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisKKyAgbWFya2VyID0gZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAocnRwKTsKKworICBpZiAocGF5bG9hZF9sZW4gPCBoZWFkZXJfbGVuICsgMSkgeworICAgIC8qIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgYnl0ZSBwYXlsb2FkICovCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZXBheSwgIkRyb3BwaW5nIHBhY2tldCB3aXRoIGludmFsaWQgcGF5bG9hZCBsZW5ndGgiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGhlYWRlciA9IChHc3RSdHBIMjYxUGF5SGVhZGVyICopIHBheWxvYWQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXksCisgICAgICAicGF5bG9hZF9sZW46ICVkLCBoZWFkZXJfbGVuOiAlZCwgc2JpdDogJWQsIGViaXQ6ICVkLCBtYXJrZXIgJWQiLAorICAgICAgcGF5bG9hZF9sZW4sIGhlYWRlcl9sZW4sIGhlYWRlci0+c2JpdCwgaGVhZGVyLT5lYml0LCBtYXJrZXIpOworCisgIHBheWxvYWQgKz0gaGVhZGVyX2xlbjsKKyAgcGF5bG9hZF9sZW4gLT0gaGVhZGVyX2xlbjsKKworICBpZiAoIWRlcGF5LT5zdGFydCkgeworICAgIC8qIENoZWNrIGZvciBwaWN0dXJlIHN0YXJ0IGNvZGUgKi8KKyAgICBndWludDMyIGJpdHMgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKHBheWxvYWQpIDw8IGhlYWRlci0+c2JpdDsKKyAgICBpZiAocGF5bG9hZF9sZW4gPiA0ICYmIGJpdHMgPj4gMTIgPT0gMHgxMCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXksICJGb3VuZCBwaWN0dXJlIHN0YXJ0IGNvZGUiKTsKKyAgICAgIGRlcGF5LT5zdGFydCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5LCAiTm8gcGljdHVyZSBzdGFydCBjb2RlIHlldCwgc2tpcHBpbmcgcGF5bG9hZCIpOworICAgICAgZ290byBza2lwOworICAgIH0KKyAgfQorCisgIGlmIChoZWFkZXItPnNiaXQgIT0gMCkgeworICAgIC8qIFRha2UgdGhlIGxlZnRvdmVyIGZyb20gcHJldmlvdXMgcGFja2V0IGFuZCBtZXJnZSBpdCBhdCB0aGUgYmVnaW5uaW5nICovCisgICAgcGF5bG9hZFswXSAmPSAweEZGID4+IGhlYWRlci0+c2JpdDsKKyAgICBpZiAoZGVwYXktPmxlZnRvdmVyICE9IE5PX0xFRlRPVkVSKSB7CisgICAgICAvKiBIYXBwZW5zIGlmIHNiaXQgaXMgc2V0IGZvciBmaXJzdCBwYWNrZXQgaW4gZnJhbWUuIFRoZW4gcHJldmlvdXMgYnl0ZQorICAgICAgICogaGFzIGFscmVhZHkgYmVlbiBmbHVzaGVkLiAqLworICAgICAgcGF5bG9hZFswXSB8PSBkZXBheS0+bGVmdG92ZXI7CisgICAgfQorICAgIGRlcGF5LT5sZWZ0b3ZlciA9IE5PX0xFRlRPVkVSOworICB9CisKKyAgaWYgKGhlYWRlci0+ZWJpdCA9PSAwKSB7CisgICAgLyogSC4yNjEgc3RyZWFtIGVuZHMgb24gYnl0ZSBib3VuZGFyeSwgdGFrZSBlbnRpcmUgcGFja2V0ICovCisgICAgZ3N0X2FkYXB0ZXJfcHVzaCAoZGVwYXktPmFkYXB0ZXIsCisgICAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3N1YmJ1ZmZlciAocnRwLCBoZWFkZXJfbGVuLCBwYXlsb2FkX2xlbikpOworICB9IGVsc2UgeworICAgIC8qIFRha2UgdGhlIGVudGlyZSBidWZmZXIgZXhjZXB0IGZvciB0aGUgbGFzdCBieXRlLCB3aGljaCB3aWxsIGJlIGtlcHQgdG8KKyAgICAgKiBtZXJnZSB3aXRoIG5leHQgcGFja2V0ICovCisgICAgZ3N0X2FkYXB0ZXJfcHVzaCAoZGVwYXktPmFkYXB0ZXIsCisgICAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3N1YmJ1ZmZlciAocnRwLCBoZWFkZXJfbGVuLAorICAgICAgICAgICAgcGF5bG9hZF9sZW4gLSAxKSk7CisgICAgZGVwYXktPmxlZnRvdmVyID0gcGF5bG9hZFtwYXlsb2FkX2xlbiAtIDFdICYgKDB4RkYgPDwgaGVhZGVyLT5lYml0KTsKKyAgfQorCitza2lwOgorICBpZiAobWFya2VyKSB7CisgICAgaWYgKGRlcGF5LT5zdGFydCkgeworICAgICAgZ3VpbnQgYXZhaWw7CisKKyAgICAgIGlmIChkZXBheS0+bGVmdG92ZXIgIT0gTk9fTEVGVE9WRVIpIHsKKyAgICAgICAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEpOworICAgICAgICBnc3RfYnVmZmVyX21lbXNldCAoYnVmLCAwLCBkZXBheS0+bGVmdG92ZXIsIDEpOworICAgICAgICBnc3RfYWRhcHRlcl9wdXNoIChkZXBheS0+YWRhcHRlciwgYnVmKTsKKyAgICAgICAgZGVwYXktPmxlZnRvdmVyID0gTk9fTEVGVE9WRVI7CisgICAgICB9CisKKyAgICAgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZXBheS0+YWRhcHRlcik7CisgICAgICBvdXRidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoZGVwYXktPmFkYXB0ZXIsIGF2YWlsKTsKKyAgICAgIGdzdF9ydHBfZHJvcF9ub25fdmlkZW9fbWV0YSAoZGVwYXksIG91dGJ1Zik7CisKKyAgICAgIC8qIE5vdGUgdGhhdCB0aGUgSSBmbGFnIGRvZXMgbm90IG1lYW4gaW50cmEgZnJhbWUsIGJ1dCB0aGF0IHRoZSBlbnRpcmUKKyAgICAgICAqIHN0cmVhbSBpcyBpbnRyYSBjb2RlZC4gKi8KKyAgICAgIGlmIChoZWFkZXItPmkpCisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgICBlbHNlCisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheSwgIlB1c2hpbmcgb3V0IGEgYnVmZmVyIG9mICV1IGJ5dGVzIiwgYXZhaWwpOworICAgICAgZGVwYXktPnN0YXJ0ID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlcGF5LT5zdGFydCA9IFRSVUU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG91dGJ1ZjsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2gyNjFfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGZpbHRlciwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY2NhcHM7CisKKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJ2aWRlby94LWgyNjEiKTsKKyAgZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKGZpbHRlciksIHNyY2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9oMjYxX2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UnRwSDI2MURlcGF5ICpkZXBheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIGRlcGF5ID0gR1NUX1JUUF9IMjYxX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAoZGVwYXktPmFkYXB0ZXIpOworICAgICAgZGVwYXktPnN0YXJ0ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYxX2RlcGF5X2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cEgyNjFEZXBheSAqZGVwYXk7CisKKyAgZGVwYXkgPSBHU1RfUlRQX0gyNjFfREVQQVkgKG9iamVjdCk7CisKKyAgaWYgKGRlcGF5LT5hZGFwdGVyKSB7CisgICAgZ3N0X29iamVjdF91bnJlZiAoZGVwYXktPmFkYXB0ZXIpOworICAgIGRlcGF5LT5hZGFwdGVyID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYxX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEgyNjFEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9DTEFTUyAoa2xhc3MpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaDI2MV9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2gyNjFfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgSDI2MSBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgSDI2MSB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgNDU4NykiLAorICAgICAgIlN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPiIpOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfaDI2MV9kZXBheV9wcm9jZXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfaDI2MV9kZXBheV9zZXRjYXBzOworCisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3RfcnRwX2gyNjFfZGVwYXlfZGlzcG9zZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX2gyNjFfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBoMjYxZGVwYXlfZGVidWcsICJydHBoMjYxZGVwYXkiLCAwLAorICAgICAgIkgyNjEgVmlkZW8gUlRQIERlcGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjFfZGVwYXlfaW5pdCAoR3N0UnRwSDI2MURlcGF5ICogZGVwYXkpCit7CisgIGRlcGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICBkZXBheS0+bGVmdG92ZXIgPSBOT19MRUZUT1ZFUjsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2MV9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGgyNjFkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9IMjYxX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwaDI2MWRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cGgyNjFkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4N2Y4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGgyNjFkZXBheS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAxND4gU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfSDI2MV9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0gyNjFfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9IMjYxX0RFUEFZIFwKKyAgKGdzdF9ydHBfaDI2MV9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0gyNjFfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfSDI2MV9ERVBBWSxHc3RSdHBIMjYxRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX0gyNjFfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0gyNjFfREVQQVksR3N0UnRwSDI2MURlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0gyNjFfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfSDI2MV9ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfSDI2MV9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSDI2MV9ERVBBWSkpCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2MURlcGF5IEdzdFJ0cEgyNjFEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBIMjYxRGVwYXlDbGFzcyBHc3RSdHBIMjYxRGVwYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBIMjYxRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKyAgZ2Jvb2xlYW4gc3RhcnQ7CisgIGd1aW50OCBsZWZ0b3ZlcjsKK307CisKK3N0cnVjdCBfR3N0UnRwSDI2MURlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfaDI2MV9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfaDI2MV9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9SVFBfSDI2MV9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwaDI2MXBheS5jIGIvZ3N0L3J0cC9nc3RydHBoMjYxcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU5MmQxMQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaDI2MXBheS5jCkBAIC0wLDAgKzEsMTA3MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDE0PiBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwaDI2MXBheQorICogQHNlZV9hbHNvOiBydHBoMjYxZGVwYXkKKyAqCisgKiBQYXlsb2FkIGVuY29kZWQgSC4yNjEgdmlkZW8gZnJhbWVzIGludG8gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyA0NTg3LgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzQ1ODcudHh0CisgKgorICogVGhlIHBheWxvYWRlciB0YWtlcyBhIEguMjYxIGZyYW1lLCBwYXJzZXMgaXQgYW5kIHNwbGl0cyBpdCBpbnRvIGZyYWdtZW50cworICogb24gTUIgYm91bmRhcmllcyBpbiBvcmRlciB0byBtYXRjaCBjb25maWd1cmVkIE1UVSBzaXplLiBGb3IgZWFjaCBmcmFnbWVudAorICogYW4gUlRQIHBhY2tldCBpcyBjb25zdHJ1Y3RlZCB3aXRoIGFuIFJUUCBwYWNrZXQgaGVhZGVyIGZvbGxvd2VkIGJ5IHRoZQorICogZnJhZ21lbnQuIEluIGFkZGl0aW9uIHRoZSBwYXlsb2FkZXIgd2lsbCBtYWtlIHN1cmUgdGhlIHBhY2tldGl6ZWQgSC4yNjEKKyAqIHN0cmVhbSBhcHBlYXJzIGFzIGEgY29udGludW91cyBiaXQtc3RyZWFtIGFmdGVyIGRlcGFja2V0aXphdGlvbiBieSBzaGlmdGluZworICogdGhlIGVuY29kZWQgYml0LXN0cmVhbSBvZiBhIGZyYW1lIHRvIGFsaWduIHdpdGggdGhlIGxhc3Qgc2lnbmlmaWNhbnQgYml0IG9mCisgKiB0aGUgcHJldmlvdXMgZnJhbWUuIFRoaXMgaGVscHMgaW50ZXJvcGVyYWJpbGl0eSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUKKyAqIGVuY29kZXIgZG9lcyBub3QgcHJvZHVjZSBhIGNvbnRpbnVvdXMgYml0LXN0cmVhbSBidXQgdGhlIGRlY29kZXIgcmVxdWlyZXMKKyAqIGl0LgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB2aWRlb3Rlc3RzcmMgISBhdmVuY19oMjYxICEgcnRwaDI2MXBheSAhIHVkcHNpbmsKKyAqIF18IFRoaXMgd2lsbCBlbmNvZGUgYSB0ZXN0IHZpZGVvIGFuZCBwYXlsb2FkIGl0LiBSZWZlciB0byB0aGUgcnRwaDI2MWRlcGF5CisgKiBleGFtcGxlIHRvIGRlcGF5bG9hZCBhbmQgcGxheSB0aGUgUlRQIHN0cmVhbS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RydHBoMjYxcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJpdHJlYWRlci5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBoMjYxcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBoMjYxcGF5X2RlYnVnKQorCisjZGVmaW5lIEdTVF9SVFBfSEVBREVSX0xFTiAxMgorI2RlZmluZSBHU1RfUlRQX0gyNjFfUEFZTE9BRF9IRUFERVJfTEVOIDQKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2MV9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWgyNjEiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2gyNjFfcGF5X3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0gyNjFfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiSDI2MVwiOyAiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkgyNjFcIiIpCisgICAgKTsKKworR19ERUZJTkVfVFlQRSAoR3N0UnRwSDI2MVBheSwgZ3N0X3J0cF9oMjYxX3BheSwgR1NUX1RZUEVfUlRQX0JBU0VfUEFZTE9BRCk7CisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfcnRwX2gyNjFfcGF5X3BhcmVudF9jbGFzcworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludDMyIG1iYTsKKyAgZ3VpbnQzMiBtdHlwZTsKKyAgZ3VpbnQzMiBxdWFudDsKKyAgZ2ludCBtdng7CisgIGdpbnQgbXZ5OworICBndWludCBlbmRwb3M7CisgIGdpbnQgZ29ibjsKK30gTWFjcm9ibG9jazsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgTWFjcm9ibG9jayBsYXN0OworICBndWludCBzdGFydHBvczsKKyAgZ3VpbnQgZW5kcG9zOworICBndWludDMyIGduOworICBndWludDMyIGdxdWFudDsKK30gR29iOworCisjZGVmaW5lIFBTQ19MRU4gMjAKKyNkZWZpbmUgVFJfTEVOIDUKKyNkZWZpbmUgUFRZUEVfTEVOIDYKKyNkZWZpbmUgR0JTQ19MRU4gMTYKKyNkZWZpbmUgR05fTEVOIDQKKyNkZWZpbmUgR1FVQU5UX0xFTiA1CisjZGVmaW5lIEdFSV9MRU4gMQorI2RlZmluZSBHU1BBUkVfTEVOIDgKKyNkZWZpbmUgTVFVQU5UX0xFTiA1CisjZGVmaW5lIE1BWF9OVU1fR09CIDEyCisKK3R5cGVkZWYgZW51bQoreworICBQQVJTRV9FTkRfT0ZfQlVGRkVSID0gLTIsCisgIFBBUlNFX0VSUk9SID0gLTEsCisgIFBBUlNFX09LID0gMCwKKyAgUEFSU0VfRU5EX09GX0ZSQU1FLAorICBQQVJTRV9FTkRfT0ZfR09CLAorfSBQYXJzZVJldHVybjsKKworCisjZGVmaW5lIFNLSVBfQklUUyhicixuYml0cykgR19TVE1UX1NUQVJUIHsgICAgICBcCisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9za2lwIChiciwgbmJpdHMpKSAgICAgICBcCisgICAgICByZXR1cm4gUEFSU0VfRU5EX09GX0JVRkZFUjsgICAgICAgICAgICAgICBcCisgIH0gR19TVE1UX0VORAorCisjZGVmaW5lIEdFVF9CSVRTKGJyLHZhbCxuYml0cykgR19TVE1UX1NUQVJUIHsgICAgICAgICAgICAgXAorICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDMyIChiciwgdmFsLCBuYml0cykpIFwKKyAgICAgIHJldHVybiBQQVJTRV9FTkRfT0ZfQlVGRkVSOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gR19TVE1UX0VORAorCisvKiBVbmNoZWNrZWQgc2luY2Ugd2UgcGVlayBvdXRzaWRlIHRoZSBidWZmZXIuIE9rIGJlY2F1c2Ugb2YgcGFkZGluZy4gKi8KKyNkZWZpbmUgUEVFS19CSVRTKGJyLHZhbCxuYml0cykgR19TVE1UX1NUQVJUIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqdmFsID0gZ3N0X2JpdF9yZWFkZXJfcGVla19iaXRzX3VpbnQxNl91bmNoZWNrZWQgKGJyLCBuYml0cyk7IFwKKyAgfSBHX1NUTVRfRU5ECisKKworI2RlZmluZSBNQkFfU1RVRkZJTkcgMzQKKyNkZWZpbmUgTUJBX1NUQVJUX0NPREUgMzUKKyNkZWZpbmUgTUJBX0xFTiAzNQorI2RlZmluZSBNQkFfV0lEIDQKKy8qIFtjb2RlLCBtYXNrLCBuYml0cywgbWJhXSAqLworc3RhdGljIGNvbnN0IGd1aW50MTYgbWJhX3RhYmxlW01CQV9MRU5dW01CQV9XSURdID0geworICB7MHg4MDAwLCAweDgwMDAsIDEsIDF9LAorICB7MHg2MDAwLCAweGUwMDAsIDMsIDJ9LAorICB7MHg0MDAwLCAweGUwMDAsIDMsIDN9LAorICB7MHgzMDAwLCAweGYwMDAsIDQsIDR9LAorICB7MHgyMDAwLCAweGYwMDAsIDQsIDV9LAorICB7MHgxODAwLCAweGY4MDAsIDUsIDZ9LAorICB7MHgxMDAwLCAweGY4MDAsIDUsIDd9LAorICB7MHgwZTAwLCAweGZlMDAsIDcsIDh9LAorICB7MHgwYzAwLCAweGZlMDAsIDcsIDl9LAorICB7MHgwYjAwLCAweGZmMDAsIDgsIDEwfSwKKyAgezB4MGEwMCwgMHhmZjAwLCA4LCAxMX0sCisgIHsweDA5MDAsIDB4ZmYwMCwgOCwgMTJ9LAorICB7MHgwODAwLCAweGZmMDAsIDgsIDEzfSwKKyAgezB4MDcwMCwgMHhmZjAwLCA4LCAxNH0sCisgIHsweDA2MDAsIDB4ZmYwMCwgOCwgMTV9LAorICB7MHgwNWMwLCAweGZmYzAsIDEwLCAxNn0sCisgIHsweDA1ODAsIDB4ZmZjMCwgMTAsIDE3fSwKKyAgezB4MDU0MCwgMHhmZmMwLCAxMCwgMTh9LAorICB7MHgwNTAwLCAweGZmYzAsIDEwLCAxOX0sCisgIHsweDA0YzAsIDB4ZmZjMCwgMTAsIDIwfSwKKyAgezB4MDQ4MCwgMHhmZmMwLCAxMCwgMjF9LAorICB7MHgwNDYwLCAweGZmZTAsIDExLCAyMn0sCisgIHsweDA0NDAsIDB4ZmZlMCwgMTEsIDIzfSwKKyAgezB4MDQyMCwgMHhmZmUwLCAxMSwgMjR9LAorICB7MHgwNDAwLCAweGZmZTAsIDExLCAyNX0sCisgIHsweDAzZTAsIDB4ZmZlMCwgMTEsIDI2fSwKKyAgezB4MDNjMCwgMHhmZmUwLCAxMSwgMjd9LAorICB7MHgwM2EwLCAweGZmZTAsIDExLCAyOH0sCisgIHsweDAzODAsIDB4ZmZlMCwgMTEsIDI5fSwKKyAgezB4MDM2MCwgMHhmZmUwLCAxMSwgMzB9LAorICB7MHgwMzQwLCAweGZmZTAsIDExLCAzMX0sCisgIHsweDAzMjAsIDB4ZmZlMCwgMTEsIDMyfSwKKyAgezB4MDMwMCwgMHhmZmUwLCAxMSwgMzN9LAorICB7MHgwMWUwLCAweGZmZTAsIDExLCBNQkFfU1RVRkZJTkd9LAorICB7MHgwMDAxLCAweGZmZmYsIDE2LCBNQkFfU1RBUlRfQ09ERX0sCit9OworCisjZGVmaW5lIE1UWVBFX0lOVFJBICAgICgxIDw8IDApCisjZGVmaW5lIE1UWVBFX0lOVEVSICAgICgxIDw8IDEpCisjZGVmaW5lIE1UWVBFX01DICAgICAgICgxIDw8IDIpCisjZGVmaW5lIE1UWVBFX0ZJTCAgICAgICgxIDw8IDMpCisjZGVmaW5lIE1UWVBFX01RVUFOVCAgICgxIDw8IDQpCisjZGVmaW5lIE1UWVBFX01WRCAgICAgICgxIDw8IDUpCisjZGVmaW5lIE1UWVBFX0NCUCAgICAgICgxIDw8IDYpCisjZGVmaW5lIE1UWVBFX1RDT0VGRiAgICgxIDw8IDcpCisjZGVmaW5lIE1UWVBFX0xFTiAxMAorI2RlZmluZSBNVFlQRV9XSUQgNAorLyogW2NvZGUsIG1hc2ssIG5iaXRzLCBmbGFnc10gKi8KK3N0YXRpYyBjb25zdCBndWludDE2IG10eXBlX3RhYmxlW01UWVBFX0xFTl1bTVRZUEVfV0lEXSA9IHsKKyAgezB4ODAwMCwgMHg4MDAwLCAxLCBNVFlQRV9JTlRFUiB8IE1UWVBFX0NCUCB8IE1UWVBFX1RDT0VGRn0sCisgIHsweDQwMDAsIDB4YzAwMCwgMiwKKyAgICAgIE1UWVBFX0lOVEVSIHwgTVRZUEVfTUMgfCBNVFlQRV9GSUwgfCBNVFlQRV9NVkQgfCBNVFlQRV9DQlAgfAorICAgICAgICBNVFlQRV9UQ09FRkZ9LAorICB7MHgyMDAwLCAweGUwMDAsIDMsIE1UWVBFX0lOVEVSIHwgTVRZUEVfTUMgfCBNVFlQRV9GSUwgfCBNVFlQRV9NVkR9LAorICB7MHgxMDAwLCAweGYwMDAsIDQsIE1UWVBFX0lOVFJBIHwgTVRZUEVfVENPRUZGfSwKKyAgezB4MDgwMCwgMHhmODAwLCA1LCBNVFlQRV9JTlRFUiB8IE1UWVBFX01RVUFOVCB8IE1UWVBFX0NCUCB8IE1UWVBFX1RDT0VGRn0sCisgIHsweDA0MDAsIDB4ZmMwMCwgNiwKKyAgICAgIE1UWVBFX0lOVEVSIHwgTVRZUEVfTUMgfCBNVFlQRV9GSUwgfCBNVFlQRV9NUVVBTlQgfCBNVFlQRV9NVkQgfAorICAgICAgICBNVFlQRV9DQlAgfCBNVFlQRV9UQ09FRkZ9LAorICB7MHgwMjAwLCAweGZlMDAsIDcsIE1UWVBFX0lOVFJBIHwgTVRZUEVfTVFVQU5UIHwgTVRZUEVfVENPRUZGfSwKKyAgezB4MDEwMCwgMHhmZjAwLCA4LAorICAgICAgTVRZUEVfSU5URVIgfCBNVFlQRV9NQyB8IE1UWVBFX01WRCB8IE1UWVBFX0NCUCB8IE1UWVBFX1RDT0VGRn0sCisgIHsweDAwODAsIDB4ZmY4MCwgOSwgTVRZUEVfSU5URVIgfCBNVFlQRV9NQyB8IE1UWVBFX01WRH0sCisgIHsweDAwNDAsIDB4ZmZjMCwgMTAsCisgICAgICBNVFlQRV9JTlRFUiB8IE1UWVBFX01DIHwgTVRZUEVfTVFVQU5UIHwgTVRZUEVfTVZEIHwgTVRZUEVfQ0JQIHwKKyAgICAgICAgTVRZUEVfVENPRUZGfSwKK307CisKKyNkZWZpbmUgTVZEX0xFTiAzMgorI2RlZmluZSBNVkRfV0lEIDUKKy8qIFtjb2RlLCBtYXNrLCBuYml0cywgbXZkMSwgbXZkMl0gKi8KK3N0YXRpYyBjb25zdCBndWludDE2IG12ZF90YWJsZVtNVkRfTEVOXVtNVkRfV0lEXSA9IHsKKyAgezB4ODAwMCwgMHg4MDAwLCAxLCAwLCAwfSwKKyAgezB4NjAwMCwgMHhlMDAwLCAzLCAtMSwgLTF9LAorICB7MHg0MDAwLCAweGUwMDAsIDMsIDEsIDF9LAorICB7MHgzMDAwLCAweGYwMDAsIDQsIC0yLCAzMH0sCisgIHsweDIwMDAsIDB4ZjAwMCwgNCwgMiwgLTMwfSwKKyAgezB4MTgwMCwgMHhmODAwLCA1LCAtMywgMjl9LAorICB7MHgxMDAwLCAweGY4MDAsIDUsIDMsIC0yOX0sCisgIHsweDBlMDAsIDB4ZmUwMCwgNywgLTQsIDI4fSwKKyAgezB4MGMwMCwgMHhmZTAwLCA3LCA0LCAtMjh9LAorICB7MHgwNzAwLCAweGZmMDAsIDgsIC03LCAyNX0sCisgIHsweDA5MDAsIDB4ZmYwMCwgOCwgLTYsIDI2fSwKKyAgezB4MGIwMCwgMHhmZjAwLCA4LCAtNSwgMjd9LAorICB7MHgwYTAwLCAweGZmMDAsIDgsIDUsIC0yN30sCisgIHsweDA4MDAsIDB4ZmYwMCwgOCwgNiwgLTI2fSwKKyAgezB4MDYwMCwgMHhmZjAwLCA4LCA3LCAtMjV9LAorICB7MHgwNGMwLCAweGZmYzAsIDEwLCAtMTAsIDIyfSwKKyAgezB4MDU0MCwgMHhmZmMwLCAxMCwgLTksIDIzfSwKKyAgezB4MDVjMCwgMHhmZmMwLCAxMCwgLTgsIDI0fSwKKyAgezB4MDU4MCwgMHhmZmMwLCAxMCwgOCwgLTI0fSwKKyAgezB4MDUwMCwgMHhmZmMwLCAxMCwgOSwgLTIzfSwKKyAgezB4MDQ4MCwgMHhmZmMwLCAxMCwgMTAsIC0yMn0sCisgIHsweDAzMjAsIDB4ZmZlMCwgMTEsIC0xNiwgMTZ9LAorICB7MHgwMzYwLCAweGZmZTAsIDExLCAtMTUsIDE3fSwKKyAgezB4MDNhMCwgMHhmZmUwLCAxMSwgLTE0LCAxOH0sCisgIHsweDAzZTAsIDB4ZmZlMCwgMTEsIC0xMywgMTl9LAorICB7MHgwNDIwLCAweGZmZTAsIDExLCAtMTIsIDIwfSwKKyAgezB4MDQ2MCwgMHhmZmUwLCAxMSwgLTExLCAyMX0sCisgIHsweDA0NDAsIDB4ZmZlMCwgMTEsIDExLCAtMjF9LAorICB7MHgwNDAwLCAweGZmZTAsIDExLCAxMiwgLTIwfSwKKyAgezB4MDNjMCwgMHhmZmUwLCAxMSwgMTMsIC0xOX0sCisgIHsweDAzODAsIDB4ZmZlMCwgMTEsIDE0LCAtMTh9LAorICB7MHgwMzQwLCAweGZmZTAsIDExLCAxNSwgLTE3fSwKK307CisKKyNkZWZpbmUgQ0JQX0xFTiA2MworLyogW2NvZGUsIG1hc2ssIG5iaXRzLCBjYnBdICovCitzdGF0aWMgY29uc3QgZ3VpbnQxNiBjYnBfdGFibGVbQ0JQX0xFTl1bNF0gPSB7CisgIHsweGUwMDAsIDB4ZTAwMCwgMywgNjB9LAorICB7MHhkMDAwLCAweGYwMDAsIDQsIDR9LAorICB7MHhjMDAwLCAweGYwMDAsIDQsIDh9LAorICB7MHhiMDAwLCAweGYwMDAsIDQsIDE2fSwKKyAgezB4YTAwMCwgMHhmMDAwLCA0LCAzMn0sCisgIHsweDk4MDAsIDB4ZjgwMCwgNSwgMTJ9LAorICB7MHg5MDAwLCAweGY4MDAsIDUsIDQ4fSwKKyAgezB4ODgwMCwgMHhmODAwLCA1LCAyMH0sCisgIHsweDgwMDAsIDB4ZjgwMCwgNSwgNDB9LAorICB7MHg3ODAwLCAweGY4MDAsIDUsIDI4fSwKKyAgezB4NzAwMCwgMHhmODAwLCA1LCA0NH0sCisgIHsweDY4MDAsIDB4ZjgwMCwgNSwgNTJ9LAorICB7MHg2MDAwLCAweGY4MDAsIDUsIDU2fSwKKyAgezB4NTgwMCwgMHhmODAwLCA1LCAxfSwKKyAgezB4NTAwMCwgMHhmODAwLCA1LCA2MX0sCisgIHsweDQ4MDAsIDB4ZjgwMCwgNSwgMn0sCisgIHsweDQwMDAsIDB4ZjgwMCwgNSwgNjJ9LAorICB7MHgzYzAwLCAweGZjMDAsIDYsIDI0fSwKKyAgezB4MzgwMCwgMHhmYzAwLCA2LCAzNn0sCisgIHsweDM0MDAsIDB4ZmMwMCwgNiwgM30sCisgIHsweDMwMDAsIDB4ZmMwMCwgNiwgNjN9LAorICB7MHgyZTAwLCAweGZlMDAsIDcsIDV9LAorICB7MHgyYzAwLCAweGZlMDAsIDcsIDl9LAorICB7MHgyYTAwLCAweGZlMDAsIDcsIDE3fSwKKyAgezB4MjgwMCwgMHhmZTAwLCA3LCAzM30sCisgIHsweDI2MDAsIDB4ZmUwMCwgNywgNn0sCisgIHsweDI0MDAsIDB4ZmUwMCwgNywgMTB9LAorICB7MHgyMjAwLCAweGZlMDAsIDcsIDE4fSwKKyAgezB4MjAwMCwgMHhmZTAwLCA3LCAzNH0sCisgIHsweDFmMDAsIDB4ZmYwMCwgOCwgN30sCisgIHsweDFlMDAsIDB4ZmYwMCwgOCwgMTF9LAorICB7MHgxZDAwLCAweGZmMDAsIDgsIDE5fSwKKyAgezB4MWMwMCwgMHhmZjAwLCA4LCAzNX0sCisgIHsweDFiMDAsIDB4ZmYwMCwgOCwgMTN9LAorICB7MHgxYTAwLCAweGZmMDAsIDgsIDQ5fSwKKyAgezB4MTkwMCwgMHhmZjAwLCA4LCAyMX0sCisgIHsweDE4MDAsIDB4ZmYwMCwgOCwgNDF9LAorICB7MHgxNzAwLCAweGZmMDAsIDgsIDE0fSwKKyAgezB4MTYwMCwgMHhmZjAwLCA4LCA1MH0sCisgIHsweDE1MDAsIDB4ZmYwMCwgOCwgMjJ9LAorICB7MHgxNDAwLCAweGZmMDAsIDgsIDQyfSwKKyAgezB4MTMwMCwgMHhmZjAwLCA4LCAxNX0sCisgIHsweDEyMDAsIDB4ZmYwMCwgOCwgNTF9LAorICB7MHgxMTAwLCAweGZmMDAsIDgsIDIzfSwKKyAgezB4MTAwMCwgMHhmZjAwLCA4LCA0M30sCisgIHsweDBmMDAsIDB4ZmYwMCwgOCwgMjV9LAorICB7MHgwZTAwLCAweGZmMDAsIDgsIDM3fSwKKyAgezB4MGQwMCwgMHhmZjAwLCA4LCAyNn0sCisgIHsweDBjMDAsIDB4ZmYwMCwgOCwgMzh9LAorICB7MHgwYjAwLCAweGZmMDAsIDgsIDI5fSwKKyAgezB4MGEwMCwgMHhmZjAwLCA4LCA0NX0sCisgIHsweDA5MDAsIDB4ZmYwMCwgOCwgNTN9LAorICB7MHgwODAwLCAweGZmMDAsIDgsIDU3fSwKKyAgezB4MDcwMCwgMHhmZjAwLCA4LCAzMH0sCisgIHsweDA2MDAsIDB4ZmYwMCwgOCwgNDZ9LAorICB7MHgwNTAwLCAweGZmMDAsIDgsIDU0fSwKKyAgezB4MDQwMCwgMHhmZjAwLCA4LCA1OH0sCisgIHsweDAzODAsIDB4ZmY4MCwgOSwgMzF9LAorICB7MHgwMzAwLCAweGZmODAsIDksIDQ3fSwKKyAgezB4MDI4MCwgMHhmZjgwLCA5LCA1NX0sCisgIHsweDAyMDAsIDB4ZmY4MCwgOSwgNTl9LAorICB7MHgwMTgwLCAweGZmODAsIDksIDI3fSwKKyAgezB4MDEwMCwgMHhmZjgwLCA5LCAzOX0sCit9OworCisjZGVmaW5lIFRDT0VGRl9FT0IgMHhmZmZmCisjZGVmaW5lIFRDT0VGRl9FU0MgMHhmZmZlCisjZGVmaW5lIFRDT0VGRl9MRU4gNjUKKy8qIFtjb2RlLCBtYXNrLCBuYml0cywgcnVuLCBsZXZlbF0gKi8KK3N0YXRpYyBjb25zdCBndWludDE2IHRjb2VmZl90YWJsZVtUQ09FRkZfTEVOXVs1XSA9IHsKKyAgezB4ODAwMCwgMHhjMDAwLCAyLCBUQ09FRkZfRU9CLCAwfSwgICAvKiBOb3QgYXZhaWxhYmxlIGZvciBmaXJzdCBjb2VmZiAqLworICAvKiB7MHg4MDAwLCAweDgwMDAsICAyLCAgMCwgIDF9LCAqLy8qIEF2YWlsYWJsZSBvbmx5IGZvciBmaXJzdCBJbnRlciBjb2VmZiAqLworICB7MHhjMDAwLCAweGMwMDAsIDMsIDAsIDF9LCAgICAvKiBOb3QgYXZhaWxhYmxlIGZvciBmaXJzdCBjb2VmZiAqLworICB7MHg2MDAwLCAweGUwMDAsIDQsIDEsIDF9LAorICB7MHg0MDAwLCAweGYwMDAsIDUsIDAsIDJ9LAorICB7MHg1MDAwLCAweGYwMDAsIDUsIDIsIDF9LAorICB7MHgyODAwLCAweGY4MDAsIDYsIDAsIDN9LAorICB7MHgzODAwLCAweGY4MDAsIDYsIDMsIDF9LAorICB7MHgzMDAwLCAweGY4MDAsIDYsIDQsIDF9LAorICB7MHgwNDAwLCAweGZjMDAsIDYsIFRDT0VGRl9FU0MsIDB9LAorICB7MHgxODAwLCAweGZjMDAsIDcsIDEsIDJ9LAorICB7MHgxYzAwLCAweGZjMDAsIDcsIDUsIDF9LAorICB7MHgxNDAwLCAweGZjMDAsIDcsIDYsIDF9LAorICB7MHgxMDAwLCAweGZjMDAsIDcsIDcsIDF9LAorICB7MHgwYzAwLCAweGZlMDAsIDgsIDAsIDR9LAorICB7MHgwODAwLCAweGZlMDAsIDgsIDIsIDJ9LAorICB7MHgwZTAwLCAweGZlMDAsIDgsIDgsIDF9LAorICB7MHgwYTAwLCAweGZlMDAsIDgsIDksIDF9LAorICB7MHgyNjAwLCAweGZmMDAsIDksIDAsIDV9LAorICB7MHgyMTAwLCAweGZmMDAsIDksIDAsIDZ9LAorICB7MHgyNTAwLCAweGZmMDAsIDksIDEsIDN9LAorICB7MHgyNDAwLCAweGZmMDAsIDksIDMsIDJ9LAorICB7MHgyNzAwLCAweGZmMDAsIDksIDEwLCAxfSwKKyAgezB4MjMwMCwgMHhmZjAwLCA5LCAxMSwgMX0sCisgIHsweDIyMDAsIDB4ZmYwMCwgOSwgMTIsIDF9LAorICB7MHgyMDAwLCAweGZmMDAsIDksIDEzLCAxfSwKKyAgezB4MDI4MCwgMHhmZmMwLCAxMSwgMCwgN30sCisgIHsweDAzMDAsIDB4ZmZjMCwgMTEsIDEsIDR9LAorICB7MHgwMmMwLCAweGZmYzAsIDExLCAyLCAzfSwKKyAgezB4MDNjMCwgMHhmZmMwLCAxMSwgNCwgMn0sCisgIHsweDAyNDAsIDB4ZmZjMCwgMTEsIDUsIDJ9LAorICB7MHgwMzgwLCAweGZmYzAsIDExLCAxNCwgMX0sCisgIHsweDAzNDAsIDB4ZmZjMCwgMTEsIDE1LCAxfSwKKyAgezB4MDIwMCwgMHhmZmMwLCAxMSwgMTYsIDF9LAorICB7MHgwMWQwLCAweGZmZjAsIDEzLCAwLCA4fSwKKyAgezB4MDE4MCwgMHhmZmYwLCAxMywgMCwgOX0sCisgIHsweDAxMzAsIDB4ZmZmMCwgMTMsIDAsIDEwfSwKKyAgezB4MDEwMCwgMHhmZmYwLCAxMywgMCwgMTF9LAorICB7MHgwMWIwLCAweGZmZjAsIDEzLCAxLCA1fSwKKyAgezB4MDE0MCwgMHhmZmYwLCAxMywgMiwgNH0sCisgIHsweDAxYzAsIDB4ZmZmMCwgMTMsIDMsIDN9LAorICB7MHgwMTIwLCAweGZmZjAsIDEzLCA0LCAzfSwKKyAgezB4MDFlMCwgMHhmZmYwLCAxMywgNiwgMn0sCisgIHsweDAxNTAsIDB4ZmZmMCwgMTMsIDcsIDJ9LAorICB7MHgwMTEwLCAweGZmZjAsIDEzLCA4LCAyfSwKKyAgezB4MDFmMCwgMHhmZmYwLCAxMywgMTcsIDF9LAorICB7MHgwMWEwLCAweGZmZjAsIDEzLCAxOCwgMX0sCisgIHsweDAxOTAsIDB4ZmZmMCwgMTMsIDE5LCAxfSwKKyAgezB4MDE3MCwgMHhmZmYwLCAxMywgMjAsIDF9LAorICB7MHgwMTYwLCAweGZmZjAsIDEzLCAyMSwgMX0sCisgIHsweDAwZDAsIDB4ZmZmOCwgMTQsIDAsIDEyfSwKKyAgezB4MDBjOCwgMHhmZmY4LCAxNCwgMCwgMTN9LAorICB7MHgwMGMwLCAweGZmZjgsIDE0LCAwLCAxNH0sCisgIHsweDAwYjgsIDB4ZmZmOCwgMTQsIDAsIDE1fSwKKyAgezB4MDBiMCwgMHhmZmY4LCAxNCwgMSwgNn0sCisgIHsweDAwYTgsIDB4ZmZmOCwgMTQsIDEsIDd9LAorICB7MHgwMGEwLCAweGZmZjgsIDE0LCAyLCA1fSwKKyAgezB4MDA5OCwgMHhmZmY4LCAxNCwgMywgNH0sCisgIHsweDAwOTAsIDB4ZmZmOCwgMTQsIDUsIDN9LAorICB7MHgwMDg4LCAweGZmZjgsIDE0LCA5LCAyfSwKKyAgezB4MDA4MCwgMHhmZmY4LCAxNCwgMTAsIDJ9LAorICB7MHgwMGY4LCAweGZmZjgsIDE0LCAyMiwgMX0sCisgIHsweDAwZjAsIDB4ZmZmOCwgMTQsIDIzLCAxfSwKKyAgezB4MDBlOCwgMHhmZmY4LCAxNCwgMjQsIDF9LAorICB7MHgwMGUwLCAweGZmZjgsIDE0LCAyNSwgMX0sCisgIHsweDAwZDgsIDB4ZmZmOCwgMTQsIDI2LCAxfSwKK307CisKK3N0YXRpYyBQYXJzZVJldHVybgorZGVjb2RlX21iYSAoR3N0Qml0UmVhZGVyICogYnIsIGdpbnQgKiBtYmEpCit7CisgIGdpbnQgaTsKKyAgZ3VpbnQxNiBjb2RlOworCisgICptYmEgPSAtMTsKKyAgZG8geworICAgIFBFRUtfQklUUyAoYnIsICZjb2RlLCAxNik7CisgICAgZm9yIChpID0gMDsgaSA8IE1CQV9MRU47IGkrKykgeworICAgICAgaWYgKChjb2RlICYgbWJhX3RhYmxlW2ldWzFdKSA9PSBtYmFfdGFibGVbaV1bMF0pIHsKKyAgICAgICAgKm1iYSA9IG1iYV90YWJsZVtpXVszXTsKKworICAgICAgICBpZiAoKm1iYSA9PSBNQkFfU1RBUlRfQ09ERSkKKyAgICAgICAgICByZXR1cm4gUEFSU0VfRU5EX09GX0dPQjsKKyAgICAgICAgU0tJUF9CSVRTIChiciwgbWJhX3RhYmxlW2ldWzJdKTsKKyAgICAgICAgaWYgKCptYmEgIT0gTUJBX1NUVUZGSU5HKQorICAgICAgICAgIHJldHVybiBQQVJTRV9PSzsKKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUgKCptYmEgPT0gTUJBX1NUVUZGSU5HKTsKKworICAvKiAweDAgaW5kaWNhdGVzIGVuZCBvZiBmcmFtZSBzaW5jZSB3ZSBhcHBlbmRlZCAwLWJ5dGVzICovCisgIGlmIChjb2RlID09IDB4MCkKKyAgICByZXR1cm4gUEFSU0VfRU5EX09GX0ZSQU1FOworCisgIHJldHVybiBQQVJTRV9FUlJPUjsKK30KKworc3RhdGljIFBhcnNlUmV0dXJuCitkZWNvZGVfbXR5cGUgKEdzdEJpdFJlYWRlciAqIGJyLCBndWludCAqIG10eXBlKQoreworICBnaW50IGk7CisgIGd1aW50MTYgY29kZTsKKworICBQRUVLX0JJVFMgKGJyLCAmY29kZSwgMTYpOworICBmb3IgKGkgPSAwOyBpIDwgTVRZUEVfTEVOOyBpKyspIHsKKyAgICBpZiAoKGNvZGUgJiBtdHlwZV90YWJsZVtpXVsxXSkgPT0gbXR5cGVfdGFibGVbaV1bMF0pIHsKKyAgICAgIFNLSVBfQklUUyAoYnIsIG10eXBlX3RhYmxlW2ldWzJdKTsKKyAgICAgICptdHlwZSA9IG10eXBlX3RhYmxlW2ldWzNdOworICAgICAgcmV0dXJuIFBBUlNFX09LOworICAgIH0KKyAgfQorCisgIHJldHVybiBQQVJTRV9FUlJPUjsKK30KKworc3RhdGljIFBhcnNlUmV0dXJuCitkZWNvZGVfbXZkIChHc3RCaXRSZWFkZXIgKiBiciwgZ2ludCAqIG12ZDEsIGdpbnQgKiBtdmQyKQoreworICBnaW50IGk7CisgIGd1aW50MTYgY29kZTsKKworICBQRUVLX0JJVFMgKGJyLCAmY29kZSwgMTYpOworICBmb3IgKGkgPSAwOyBpIDwgTVZEX0xFTjsgaSsrKSB7CisgICAgaWYgKChjb2RlICYgbXZkX3RhYmxlW2ldWzFdKSA9PSBtdmRfdGFibGVbaV1bMF0pIHsKKyAgICAgIFNLSVBfQklUUyAoYnIsIG12ZF90YWJsZVtpXVsyXSk7CisgICAgICAqbXZkMSA9IChnaW50MTYpIG12ZF90YWJsZVtpXVszXTsKKyAgICAgICptdmQyID0gKGdpbnQxNikgbXZkX3RhYmxlW2ldWzRdOworICAgICAgcmV0dXJuIFBBUlNFX09LOworICAgIH0KKyAgfQorCisgIHJldHVybiBQQVJTRV9FUlJPUjsKK30KKworc3RhdGljIFBhcnNlUmV0dXJuCitkZWNvZGVfY2JwIChHc3RCaXRSZWFkZXIgKiBiciwgZ3VpbnQgKiBjYnApCit7CisgIGdpbnQgaTsKKyAgZ3VpbnQxNiBjb2RlOworCisgIFBFRUtfQklUUyAoYnIsICZjb2RlLCAxNik7CisgIGZvciAoaSA9IDA7IGkgPCBDQlBfTEVOOyBpKyspIHsKKyAgICBpZiAoKGNvZGUgJiBjYnBfdGFibGVbaV1bMV0pID09IGNicF90YWJsZVtpXVswXSkgeworICAgICAgU0tJUF9CSVRTIChiciwgY2JwX3RhYmxlW2ldWzJdKTsKKyAgICAgICpjYnAgPSBjYnBfdGFibGVbaV1bM107CisgICAgICByZXR1cm4gUEFSU0VfT0s7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFBBUlNFX0VSUk9SOworfQorCitzdGF0aWMgUGFyc2VSZXR1cm4KK2RlY29kZV90Y29lZmYgKEdzdEJpdFJlYWRlciAqIGJyLCBndWludCBtdHlwZSkKK3sKKyAgZ2ludCBpOworICBndWludDE2IGNvZGU7CisgIGdib29sZWFuIGVvYjsKKworICAvKiBTcGVjaWFsIGhhbmRsaW5nIG9mIGZpcnN0IGNvZWZmICovCisgIGlmIChtdHlwZSAmIE1UWVBFX0lOVEVSKSB7CisgICAgLyogSW50ZXIsIGRpZmZlcmVudCB2bGMgc2luY2UgRU9CIGlzIG5vdCBhbGxvd2VkICovCisgICAgUEVFS19CSVRTIChiciwgJmNvZGUsIDE2KTsKKyAgICBpZiAoY29kZSAmIDB4ODAwMCkgeworICAgICAgU0tJUF9CSVRTIChiciwgMik7CisgICAgICBHU1RfVFJBQ0UgKCJ0Y29lZmYgZmlyc3QgaW50ZXIgc3BlY2lhbCIpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBGYWxsdGhyb3VnaC4gTGV0IHRoZSBmaXJzdCBjb2VmZiBiZSBoYW5kbGVkIGxpa2Ugb3RoZXIgY29lZmZzIHNpbmNlCisgICAgICAgKiB0aGUgdmxjIGlzIHRoZSBzYW1lIGFzIGxvbmcgYXMgdGhlIGZpcnN0IGJpdCBpcyBub3Qgc2V0LiAqLworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBJbnRyYSwgZmlyc3QgY29lZmYgaXMgZml4ZWQgOC1iaXQgKi8KKyAgICBHU1RfVFJBQ0UgKCJ0Y29lZmYgZmlyc3QgaW50cmEgc3BlY2lhbCIpOworICAgIFNLSVBfQklUUyAoYnIsIDgpOworICB9CisKKyAgLyogQmxvY2sgbXVzdCBlbmQgd2l0aCBFT0IuICovCisgIGVvYiA9IEZBTFNFOworICB3aGlsZSAoIWVvYikgeworICAgIFBFRUtfQklUUyAoYnIsICZjb2RlLCAxNik7CisgICAgZm9yIChpID0gMDsgaSA8IFRDT0VGRl9MRU47IGkrKykgeworICAgICAgaWYgKChjb2RlICYgdGNvZWZmX3RhYmxlW2ldWzFdKSA9PSB0Y29lZmZfdGFibGVbaV1bMF0pIHsKKyAgICAgICAgR1NUX1RSQUNFICgidGNvZWZmIHZsY1slZF0sIHJ1bj0lZCwgbGV2ZWw9JWQiLCBpLCB0Y29lZmZfdGFibGVbaV1bM10sCisgICAgICAgICAgICB0Y29lZmZfdGFibGVbaV1bNF0pOworICAgICAgICBTS0lQX0JJVFMgKGJyLCB0Y29lZmZfdGFibGVbaV1bMl0pOworICAgICAgICBpZiAodGNvZWZmX3RhYmxlW2ldWzNdID09IFRDT0VGRl9FT0IpIHsKKyAgICAgICAgICBlb2IgPSBUUlVFOworICAgICAgICB9IGVsc2UgaWYgKHRjb2VmZl90YWJsZVtpXVszXSA9PSBUQ09FRkZfRVNDKSB7CisjaWYgMAorICAgICAgICAgIGd1aW50MTYgdmFsOworICAgICAgICAgIHZhbCA9IGdzdF9iaXRfcmVhZGVyX3BlZWtfYml0c191aW50MTZfdW5jaGVja2VkIChiciwgNiArIDgpOworICAgICAgICAgIEdTVF9UUkFDRSAoImVzYyBydW49JWQsIGxldmVsPSVkIiwgdmFsID4+IDgsIChnaW50OCkgKHZhbCAmIDB4ZmYpKTsKKyNlbmRpZgorICAgICAgICAgIFNLSVBfQklUUyAoYnIsIDYgKyA4KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGkgPT0gVENPRUZGX0xFTikKKyAgICAgIC8qIE5vIG1hdGNoaW5nIFZMQyAqLworICAgICAgcmV0dXJuIFBBUlNFX0VSUk9SOworICB9CisKKyAgcmV0dXJuIFBBUlNFX09LOworfQorCitzdGF0aWMgZ2ludAorZmluZF9waWN0dXJlX2hlYWRlcl9vZmZzZXQgKGNvbnN0IGd1aW50OCAqIGRhdGEsIGdzaXplIHNpemUpCit7CisgIGdpbnQgaTsKKyAgZ3VpbnQzMiB2YWw7CisKKyAgaWYgKHNpemUgPCA0KQorICAgIHJldHVybiAtMTsKKworICB2YWwgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKGRhdGEpOworICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgaWYgKCh2YWwgPj4gKDEyIC0gaSkpID09IDB4MTApCisgICAgICByZXR1cm4gaTsKKyAgfQorCisgIHJldHVybiAtMTsKK30KKworc3RhdGljIFBhcnNlUmV0dXJuCitwYXJzZV9waWN0dXJlX2hlYWRlciAoR3N0UnRwSDI2MVBheSAqIHBheSwgR3N0Qml0UmVhZGVyICogYnIsIGdpbnQgKiBudW1fZ29iKQoreworICBndWludDMyIHZhbDsKKworICBHRVRfQklUUyAoYnIsICZ2YWwsIFBTQ19MRU4pOworICBpZiAodmFsICE9IDB4MTApCisgICAgcmV0dXJuIFBBUlNFX0VSUk9SOworICBTS0lQX0JJVFMgKGJyLCBUUl9MRU4pOworICBHRVRfQklUUyAoYnIsICZ2YWwsIFBUWVBFX0xFTik7CisgICpudW1fZ29iID0gKHZhbCAmIDB4MDQpID09IDAgPyAzIDogMTI7CisKKyAgcmV0dXJuIFBBUlNFX09LOworfQorCitzdGF0aWMgUGFyc2VSZXR1cm4KK3BhcnNlX2dvYl9oZWFkZXIgKEdzdFJ0cEgyNjFQYXkgKiBwYXksIEdzdEJpdFJlYWRlciAqIGJyLCBHb2IgKiBnb2IpCit7CisgIGd1aW50MzIgdmFsOworCisgIEdFVF9CSVRTIChiciwgJnZhbCwgR0JTQ19MRU4pOworICBpZiAodmFsICE9IDB4MDEpCisgICAgcmV0dXJuIFBBUlNFX0VSUk9SOworICBHRVRfQklUUyAoYnIsICZnb2ItPmduLCBHTl9MRU4pOworICBHU1RfVFJBQ0VfT0JKRUNUIChwYXksICJQYXJzaW5nIEdPQiAlZCIsIGdvYi0+Z24pOworCisgIEdFVF9CSVRTIChiciwgJmdvYi0+Z3F1YW50LCBHUVVBTlRfTEVOKTsKKyAgR1NUX1RSQUNFX09CSkVDVCAocGF5LCAiR1FVQU5UICVkIiwgZ29iLT5ncXVhbnQpOworICBHRVRfQklUUyAoYnIsICZ2YWwsIEdFSV9MRU4pOworICB3aGlsZSAodmFsICE9IDApIHsKKyAgICBTS0lQX0JJVFMgKGJyLCBHU1BBUkVfTEVOKTsKKyAgICBHRVRfQklUUyAoYnIsICZ2YWwsIEdFSV9MRU4pOworICB9CisKKyAgcmV0dXJuIFBBUlNFX09LOworfQorCitzdGF0aWMgUGFyc2VSZXR1cm4KK3BhcnNlX21iIChHc3RSdHBIMjYxUGF5ICogcGF5LCBHc3RCaXRSZWFkZXIgKiBiciwgY29uc3QgTWFjcm9ibG9jayAqIHByZXYsCisgICAgTWFjcm9ibG9jayAqIG1iKQoreworICBnaW50IG1iYV9kaWZmOworICBndWludCBjYnA7CisgIFBhcnNlUmV0dXJuIHJldDsKKworICBjYnAgPSAweDNmOworICBtYi0+cXVhbnQgPSBwcmV2LT5xdWFudDsKKworICBpZiAoKHJldCA9IGRlY29kZV9tYmEgKGJyLCAmbWJhX2RpZmYpKSAhPSBQQVJTRV9PSykKKyAgICByZXR1cm4gcmV0OworICBtYi0+bWJhID0gcHJldi0+bWJhID09IDAgPyBtYmFfZGlmZiA6IHByZXYtPm1iYSArIG1iYV9kaWZmOworICBHU1RfVFJBQ0VfT0JKRUNUIChwYXksICJQYXJzZSBNQkEgJWQgKG1iYV9kaWZmICVkKSIsIG1iLT5tYmEsIG1iYV9kaWZmKTsKKworICBpZiAoKHJldCA9IGRlY29kZV9tdHlwZSAoYnIsICZtYi0+bXR5cGUpKSAhPSBQQVJTRV9PSykKKyAgICByZXR1cm4gcmV0OworICBHU1RfVFJBQ0VfT0JKRUNUIChwYXksCisgICAgICAiTVRZUEU6IGludGVyICVkLCBtYyAlZCwgZmlsICVkLCBtcXVhbnQgJWQsIG12ZCAlZCwgY2JwICVkLCB0Y29lZmYgJWQiLAorICAgICAgKG1iLT5tdHlwZSAmIE1UWVBFX0lOVEVSKSAhPSAwLCAobWItPm10eXBlICYgTVRZUEVfTUMpICE9IDAsCisgICAgICAobWItPm10eXBlICYgTVRZUEVfRklMKSAhPSAwLCAobWItPm10eXBlICYgTVRZUEVfTVFVQU5UKSAhPSAwLAorICAgICAgKG1iLT5tdHlwZSAmIE1UWVBFX01WRCkgIT0gMCwgKG1iLT5tdHlwZSAmIE1UWVBFX0NCUCkgIT0gMCwKKyAgICAgIChtYi0+bXR5cGUgJiBNVFlQRV9UQ09FRkYpICE9IDApOworCisgIGlmIChtYi0+bXR5cGUgJiBNVFlQRV9NUVVBTlQpIHsKKyAgICBHRVRfQklUUyAoYnIsICZtYi0+cXVhbnQsIE1RVUFOVF9MRU4pOworICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHBheSwgIk1RVUFOVDogJWQiLCBtYi0+cXVhbnQpOworICB9CisKKyAgaWYgKG1iLT5tdHlwZSAmIE1UWVBFX01WRCkgeworICAgIGdpbnQgaSwgcG12WzJdLCBtdlsyXTsKKworICAgIGlmIChtYi0+bWJhID09IDEgfHwgbWItPm1iYSA9PSAxMiB8fCBtYi0+bWJhID09IDIzIHx8IG1iYV9kaWZmICE9IDEgfHwKKyAgICAgICAgKHByZXYtPm10eXBlICYgTVRZUEVfSU5URVIpID09IDApIHsKKyAgICAgIHBtdlswXSA9IDA7CisgICAgICBwbXZbMV0gPSAwOworICAgIH0gZWxzZSB7CisgICAgICBwbXZbMF0gPSBwcmV2LT5tdng7CisgICAgICBwbXZbMV0gPSBwcmV2LT5tdnk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgIGdpbnQgbXZkMSwgbXZkMjsKKyAgICAgIGlmICgocmV0ID0gZGVjb2RlX212ZCAoYnIsICZtdmQxLCAmbXZkMikpICE9IFBBUlNFX09LKQorICAgICAgICByZXR1cm4gcmV0OworICAgICAgaWYgKEFCUyAocG12W2ldICsgbXZkMSkgPD0gMTUpCisgICAgICAgIG12W2ldID0gcG12W2ldICsgbXZkMTsKKyAgICAgIGVsc2UKKyAgICAgICAgbXZbaV0gPSBwbXZbaV0gKyBtdmQyOworICAgIH0KKyAgICBtYi0+bXZ4ID0gbXZbMF07CisgICAgbWItPm12eSA9IG12WzFdOworICB9IGVsc2UgeworICAgIG1iLT5tdnggPSAwOworICAgIG1iLT5tdnkgPSAwOworICB9CisKKyAgaWYgKG1iLT5tdHlwZSAmIE1UWVBFX0NCUCkgeworICAgIGlmICgocmV0ID0gZGVjb2RlX2NicCAoYnIsICZjYnApKSAhPSBQQVJTRV9PSykKKyAgICAgIHJldHVybiByZXQ7CisgIH0KKworICAvKiBCbG9jayBsYXllciAqLworICBpZiAobWItPm10eXBlICYgTVRZUEVfVENPRUZGKSB7CisgICAgZ2ludCBibG9jazsKKyAgICBmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCA2OyBibG9jaysrKSB7CisgICAgICBpZiAoY2JwICYgKDEgPDwgKDUgLSBibG9jaykpKSB7CisgICAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHBheSwgIkRlY29kZSBUQ09FRkYgZm9yIGJsb2NrICVkIiwgYmxvY2spOworICAgICAgICBpZiAoKHJldCA9IGRlY29kZV90Y29lZmYgKGJyLCBtYi0+bXR5cGUpKSAhPSBQQVJTRV9PSykKKyAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgfQorICAgIH0KKyAgfQorCisgIG1iLT5lbmRwb3MgPSBnc3RfYml0X3JlYWRlcl9nZXRfcG9zIChicik7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogUGFyc2UgbWFjcm9ibG9ja3MgdW50aWwgdGhlIG5leHQgTUIgdGhhdCBleGNlZWRzIG1heHBvcy4gQXQgbGVhc3Qgb25lIE1CIGlzCisgKiBpbmNsdWRlZCBldmVuIGlmIGl0IGV4Y2VlZHMgbWF4cG9zLiBSZXR1cm5zIGVuZHBvcyBvZiBsYXN0IGluY2x1ZGVkIE1CLiAqLworc3RhdGljIFBhcnNlUmV0dXJuCitwYXJzZV9tYl91bnRpbF9wb3MgKEdzdFJ0cEgyNjFQYXkgKiBwYXksIEdzdEJpdFJlYWRlciAqIGJyLCBHb2IgKiBnb2IsCisgICAgZ3VpbnQgKiBlbmRwb3MpCit7CisgIFBhcnNlUmV0dXJuIHJldDsKKyAgZ2ludCBjb3VudCA9IDA7CisgIGdib29sZWFuIHN0b3AgPSBGQUxTRTsKKyAgZ3VpbnQgbWF4cG9zID0gKmVuZHBvczsKKyAgTWFjcm9ibG9jayBtYjsKKworICBHU1RfTE9HX09CSkVDVCAocGF5LCAiUGFyc2UgdW50aWwgcG9zICV1LCBzdGFydCBhdCBwb3MgJXUsIGdvYm4gJWQsIG1iYSAlZCIsCisgICAgICBtYXhwb3MsIGdzdF9iaXRfcmVhZGVyX2dldF9wb3MgKGJyKSwgZ29iLT5nbiwgZ29iLT5sYXN0Lm1iYSk7CisKKyAgd2hpbGUgKCFzdG9wKSB7CisgICAgcmV0ID0gcGFyc2VfbWIgKHBheSwgYnIsICZnb2ItPmxhc3QsICZtYik7CisKKyAgICBzd2l0Y2ggKHJldCkgeworICAgICAgY2FzZSBQQVJTRV9PSzoKKyAgICAgICAgaWYgKG1iLmVuZHBvcyA+IG1heHBvcyAmJiBjb3VudCA+IDApIHsKKyAgICAgICAgICAvKiBEb24ndCBpbmNsdWRlIGN1cnJlbnQgTUIgKi8KKyAgICAgICAgICBzdG9wID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBVcGRhdGUgdG8gaW5jbHVkZSBjdXJyZW50IE1CICovCisgICAgICAgICAgKmVuZHBvcyA9IG1iLmVuZHBvczsKKyAgICAgICAgICBnb2ItPmxhc3QgPSBtYjsKKyAgICAgICAgICBjb3VudCsrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBBUlNFX0VORF9PRl9GUkFNRToKKyAgICAgICAgKmVuZHBvcyA9IGdzdF9iaXRfcmVhZGVyX2dldF9wb3MgKGJyKTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGF5LCAiRW5kIG9mIGZyYW1lIGF0IHBvcyAldSAobGFzdCBHT0JOICVkIE1CQSAlZCkiLAorICAgICAgICAgICAgKmVuZHBvcywgZ29iLT5nbiwgZ29iLT5sYXN0Lm1iYSk7CisgICAgICAgIHN0b3AgPSBUUlVFOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQQVJTRV9FTkRfT0ZfR09COgorICAgICAgICAvKiBOb3RlIHRoYXQgYSBHT0IgY2FuIGNvbnRhaW4gbm90aGluZywgc28gd2UgbWF5IGdldCBoZXJlIG9uIHRoZSBmaXJzdAorICAgICAgICAgKiBpdGVyYXRpb24uICovCisgICAgICAgICplbmRwb3MgPSBnb2ItPmxhc3QubWJhID09IDAgPworICAgICAgICAgICAgZ29iLT5zdGFydHBvcyA6IGdzdF9iaXRfcmVhZGVyX2dldF9wb3MgKGJyKTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGF5LCAiRW5kIG9mIGdvYiBhdCBwb3MgJXUgKGxhc3QgR09CTiAlZCBNQkEgJWQpIiwKKyAgICAgICAgICAgICplbmRwb3MsIGdvYi0+Z24sIGdvYi0+bGFzdC5tYmEpOworICAgICAgICBzdG9wID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUEFSU0VfRU5EX09GX0JVRkZFUjoKKyAgICAgIGNhc2UgUEFSU0VfRVJST1I6CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGF5LCAiRmFpbGVkIHRvIHBhcnNlIHN0cmVhbSAocmVhc29uICVkKSIsIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGdvYi0+bGFzdC5nb2JuID0gZ29iLT5nbjsKKworICBpZiAocmV0ID09IFBBUlNFX09LKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocGF5LAorICAgICAgICAiU3BsaXQgR09CTiAlZCBhZnRlciBNQkEgJWQgKGVuZHBvcyAldSwgbWF4cG9zICV1LCBuZXh0cG9zICV1KSIsCisgICAgICAgIGdvYi0+Z24sIGdvYi0+bGFzdC5tYmEsICplbmRwb3MsIG1heHBvcywgbWIuZW5kcG9zKTsKKyAgICBnc3RfYml0X3JlYWRlcl9zZXRfcG9zIChiciwgKmVuZHBvcyk7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ3VpbnQKK2JpdHJhbmdlX3RvX2J5dGVzIChndWludCBmaXJzdCwgZ3VpbnQgbGFzdCkKK3sKKyAgcmV0dXJuIChHU1RfUk9VTkRfVVBfOCAobGFzdCkgLSBHU1RfUk9VTkRfRE9XTl84IChmaXJzdCkpIC8gODsKK30KKworLyogRmluZCBuZXh0IDE2LWJpdCBHT0Igc3RhcnQgY29kZSAoMHgwMDAxKSwgd2hpY2ggbWF5IG5vdCBiZSBieXRlIGFsaWduZWQuCisgKiBSZXR1cm5zIHRoZSBiaXQgb2Zmc2V0IG9mIHRoZSBmaXJzdCBiaXQgb2YgR0JTQy4gKi8KK3N0YXRpYyBnc3NpemUKK2ZpbmRfZ29iIChHc3RSdHBIMjYxUGF5ICogcGF5LCBjb25zdCBndWludDggKiBkYXRhLCBndWludCBzaXplLCBndWludCBwb3MpCit7CisgIGdzc2l6ZSByZXQgPSAtMTsKKyAgZ3VpbnQgb2Zmc2V0OworCisgIEdTVF9MT0dfT0JKRUNUIChwYXksICJTZWFyY2ggZm9yIEdPQiBmcm9tIHBvcyAldSIsIHBvcyk7CisKKyAgZm9yIChvZmZzZXQgPSBwb3MgLyA4OyBvZmZzZXQgPCBzaXplIC0gMTsgb2Zmc2V0KyspIHsKKyAgICBpZiAoZGF0YVtvZmZzZXRdID09IDB4MCkgeworICAgICAgZ2ludCBtc2IgPSBnX2JpdF9udGhfbXNmIChkYXRhW29mZnNldCArIDFdLCA4KTsKKyAgICAgIGdpbnQgbHNiID0gb2Zmc2V0ID4gMCA/IGdfYml0X250aF9sc2YgKGRhdGFbb2Zmc2V0IC0gMV0sIC0xKSA6IDA7CisgICAgICBpZiAobHNiID09IC0xKQorICAgICAgICBsc2IgPSA4OworICAgICAgaWYgKG1zYiA+PSAwICYmIGxzYiA+PSBtc2IpIHsKKyAgICAgICAgcmV0ID0gb2Zmc2V0ICogOCAtIG1zYjsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgIkZvdW5kIEdPQiBzdGFydCBjb2RlIGF0IGJpdHBvcyAlIgorICAgICAgICAgICAgR19HU1NJWkVfRk9STUFUICIgKCUwMnggJTAyeCAlMDJ4KSIsIHJldCwKKyAgICAgICAgICAgIG9mZnNldCA+IDAgPyBkYXRhW29mZnNldCAtIDFdIDogMCwgZGF0YVtvZmZzZXRdLCBkYXRhW29mZnNldCArIDFdKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogU2NhbnMgYWZ0ZXIgYWxsIEdPQiBzdGFydCBjb2RlcyBhbmQgaW5pdGFsaXplcyB0aGUgR09CIHN0cnVjdHVyZSB3aXRoIHN0YXJ0CisgKiBhbmQgZW5kIHBvc2l0aW9ucy4gKi8KK3N0YXRpYyBQYXJzZVJldHVybgorZ3N0X3J0cF9oMjYxX3BheV9pbml0X2dvYnMgKEdzdFJ0cEgyNjFQYXkgKiBwYXksIEdvYiAqIGdvYnMsIGdpbnQgbnVtX2dvYnMsCisgICAgY29uc3QgZ3VpbnQ4ICogYml0cywgZ2ludCBsZW4sIGd1aW50IHBvcykKK3sKKyAgZ2ludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fZ29iczsgaSsrKSB7CisgICAgZ3NzaXplIGdvYnBvcyA9IGZpbmRfZ29iIChwYXksIGJpdHMsIGxlbiwgcG9zKTsKKyAgICBpZiAoZ29icG9zID09IC0xKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBheSwgIkZvdW5kIG9ubHkgJWQgb2YgJWQgR09CcyIsIGksIG51bV9nb2JzKTsKKyAgICAgIHJldHVybiBQQVJTRV9FUlJPUjsKKyAgICB9CisgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgIkZvdW5kIEdPQiAlZCBhdCBwb3MgJSIgR19HU1NJWkVfRk9STUFULCBpLCBnb2Jwb3MpOworICAgIHBvcyA9IGdvYnBvcyArIEdCU0NfTEVOOworCisgICAgZ29ic1tpXS5zdGFydHBvcyA9IGdvYnBvczsKKyAgICBpZiAoaSA+IDApCisgICAgICBnb2JzW2kgLSAxXS5lbmRwb3MgPSBnb2Jwb3M7CisgIH0KKyAgZ29ic1tudW1fZ29icyAtIDFdLmVuZHBvcyA9IGxlbiAqIDg7CisKKyAgcmV0dXJuIFBBUlNFX09LOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9oMjYxX3BheV9mcmFnbWVudF9wdXNoIChHc3RSdHBIMjYxUGF5ICogcGF5LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgY29uc3QgZ3VpbnQ4ICogYml0cywgZ3VpbnQgc3RhcnQsIGd1aW50IGVuZCwKKyAgICBjb25zdCBNYWNyb2Jsb2NrICogbGFzdF9tYl9pbl9wcmV2aW91c19wYWNrZXQsIGdib29sZWFuIG1hcmtlcikKK3sKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgR3N0UnRwSDI2MVBheUhlYWRlciAqaGVhZGVyOworICBnaW50IG5ieXRlczsKKyAgY29uc3QgTWFjcm9ibG9jayAqbGFzdCA9IGxhc3RfbWJfaW5fcHJldmlvdXNfcGFja2V0OworICBHc3RSVFBCdWZmZXIgcnRwID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKworICBuYnl0ZXMgPSBiaXRyYW5nZV90b19ieXRlcyAoc3RhcnQsIGVuZCk7CisKKyAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChuYnl0ZXMgKworICAgICAgR1NUX1JUUF9IMjYxX1BBWUxPQURfSEVBREVSX0xFTiwgMCwgMCk7CisgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0YnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKyAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKyAgaGVhZGVyID0gKEdzdFJ0cEgyNjFQYXlIZWFkZXIgKikgcGF5bG9hZDsKKworICBtZW1zZXQgKGhlYWRlciwgMCwgR1NUX1JUUF9IMjYxX1BBWUxPQURfSEVBREVSX0xFTik7CisgIGhlYWRlci0+diA9IDE7CisgIGhlYWRlci0+c2JpdCA9IHN0YXJ0ICYgNzsKKyAgaGVhZGVyLT5lYml0ID0gKDggLSAoZW5kICYgNykpICYgNzsKKworICBpZiAobGFzdCAhPSBOVUxMICYmIGxhc3QtPm1iYSAhPSAwICYmIGxhc3QtPm1iYSAhPSAzMykgeworICAgIC8qIE5PVEU6IE1WRCBhc3N1bWVzIHRoYXQgd2UncmUgcnVubmluZyBvbiAyJ3MgY29tcGxlbWVudCBhcmNoaXRlY3R1cmUgKi8KKyAgICBndWludCBtYmFwID0gbGFzdC0+bWJhIC0gMTsKKyAgICBoZWFkZXItPmdvYm4gPSBsYXN0LT5nb2JuOworICAgIGhlYWRlci0+bWJhcDEgPSBtYmFwID4+IDE7CisgICAgaGVhZGVyLT5tYmFwMiA9IG1iYXAgJiAxOworICAgIGhlYWRlci0+cXVhbnQgPSBsYXN0LT5xdWFudDsKKyAgICBoZWFkZXItPmhtdmQxID0gbGFzdC0+bXZ4ID4+IDM7CisgICAgaGVhZGVyLT5obXZkMiA9IGxhc3QtPm12eCAmIDc7CisgICAgaGVhZGVyLT52bXZkID0gbGFzdC0+bXZ5OworICB9CisKKyAgbWVtY3B5IChwYXlsb2FkICsgR1NUX1JUUF9IMjYxX1BBWUxPQURfSEVBREVSX0xFTiwKKyAgICAgIGJpdHMgKyBHU1RfUk9VTkRfRE9XTl84IChzdGFydCkgLyA4LCBuYnl0ZXMpOworCisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpID0gcGF5LT50aW1lc3RhbXA7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKCZydHAsIG1hcmtlcik7CisgIHBheS0+b2Zmc2V0ID0gZW5kICYgNzsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYXksCisgICAgICAiUHVzaCBmcmFnbWVudCwgYnl0ZXMgJWQsIHNiaXQgJWQsIGViaXQgJWQsIGdvYm4gJWQsIG1iYXAgJWQsIG1hcmtlciAlZCIsCisgICAgICBuYnl0ZXMsIGhlYWRlci0+c2JpdCwgaGVhZGVyLT5lYml0LCBsYXN0ICE9IE5VTEwgPyBsYXN0LT5nb2JuIDogMCwKKyAgICAgIGxhc3QgIT0gTlVMTCA/IE1BWCAobGFzdC0+bWJhIC0gMSwgMCkgOiAwLCBtYXJrZXIpOworCisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocGF5LCBvdXRidWYsIGJ1ZmZlcik7CisKKyAgcmV0dXJuIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NBU1QgKHBheSksIG91dGJ1Zik7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2gyNjFfcGFja2V0aXplX2FuZF9wdXNoIChHc3RSdHBIMjYxUGF5ICogcGF5LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgY29uc3QgZ3VpbnQ4ICogYml0cywgZ3NpemUgbGVuKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RCaXRSZWFkZXIgYnJfOworICBHc3RCaXRSZWFkZXIgKmJyID0gJmJyXzsKKyAgZ3VpbnQgbWF4X3BheWxvYWRfc2l6ZSA9CisgICAgICBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BheWxvYWRfbGVuIChHU1RfUlRQX0JBU0VfUEFZTE9BRF9NVFUgKHBheSkgLQorICAgICAgR1NUX1JUUF9IMjYxX1BBWUxPQURfSEVBREVSX0xFTiwgMCwgMCk7CisgIGd1aW50IHN0YXJ0cG9zOworICBnaW50IG51bV9nb2JzID0gMDsKKyAgR29iIGdvYnNbTUFYX05VTV9HT0JdOworICBHb2IgKmdvYjsKKyAgTWFjcm9ibG9jayBsYXN0X21iX2luX3ByZXZpb3VzX3BhY2tldCA9IHsgMCB9OworICBnYm9vbGVhbiBtYXJrZXI7CisgIFBhcnNlUmV0dXJuIHJlc3VsdDsKKworICBnc3RfYml0X3JlYWRlcl9pbml0IChiciwgYml0cywgbGVuKTsKKyAgZ3N0X2JpdF9yZWFkZXJfc2V0X3BvcyAoYnIsIHBheS0+b2Zmc2V0KTsKKyAgc3RhcnRwb3MgPSBwYXktPm9mZnNldDsKKworICBpZiAocGFyc2VfcGljdHVyZV9oZWFkZXIgKHBheSwgYnIsICZudW1fZ29icykgPCBQQVJTRV9PSykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGF5LCAiRmFpbGVkIHRvIHBhcnNlIHBpY3R1cmUgaGVhZGVyIik7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIGlmIChnc3RfcnRwX2gyNjFfcGF5X2luaXRfZ29icyAocGF5LCBnb2JzLCBudW1fZ29icywgYml0cywgbGVuLAorICAgICAgICAgIGdzdF9iaXRfcmVhZGVyX2dldF9wb3MgKGJyKSkgPCBQQVJTRV9PSykKKyAgICBnb3RvIGJlYWNoOworCisgIC8qIFNwbGl0LCBjcmVhdGUgYW5kIHB1c2ggcGFja2V0cyAqLworICBnb2IgPSBnb2JzOworICBtYXJrZXIgPSBGQUxTRTsKKyAgd2hpbGUgKG1hcmtlciA9PSBGQUxTRSAmJiByZXQgPT0gR1NUX0ZMT1dfT0spIHsKKyAgICBndWludCBlbmRwb3M7CisKKyAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyB3cmFwIGFyb3VuZCBiZWNhdXNlIG9mIGV4dHJlbWVseSBoaWdoIE1UVSAqLworICAgIGVuZHBvcyA9IEdTVF9ST1VORF9ET1dOXzggKHN0YXJ0cG9zKSArIG1heF9wYXlsb2FkX3NpemUgKiA4OworICAgIGlmIChlbmRwb3MgPCBzdGFydHBvcykKKyAgICAgIGVuZHBvcyA9IEdfTUFYVUlOVDsKKworICAgIEdTVF9MT0dfT0JKRUNUIChwYXksICJOZXh0IHBhY2tldCBzdGFydHBvcyAldSBtYXhwb3MgJXUiLCBzdGFydHBvcywgZW5kcG9zKTsKKworICAgIC8qIEZpbmQgdGhlIGxhc3QgR09CIHRoYXQgZG9lcyBub3QgY29tcGxldGVseSBmaXQgaW4gcGFja2V0ICovCisgICAgZm9yICg7IGdvYiA8ICZnb2JzW251bV9nb2JzIC0gMV07IGdvYisrKSB7CisgICAgICBpZiAoYml0cmFuZ2VfdG9fYnl0ZXMgKHN0YXJ0cG9zLCBnb2ItPmVuZHBvcykgPiBtYXhfcGF5bG9hZF9zaXplKSB7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXksICJTcGxpdCBnb2IgKHN0YXJ0ICV1LCBlbmQgJXUpIiwKKyAgICAgICAgICAgIGdvYi0+c3RhcnRwb3MsIGdvYi0+ZW5kcG9zKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0YXJ0cG9zIDw9IGdvYi0+c3RhcnRwb3MpIHsKKyAgICAgIC8qIEZhc3QtZm9yd2FyZCB1bnRpbCBzdGFydCBvZiBHT0IgKi8KKyAgICAgIGdzdF9iaXRfcmVhZGVyX3NldF9wb3MgKGJyLCBnb2ItPnN0YXJ0cG9zKTsKKyAgICAgIGlmIChwYXJzZV9nb2JfaGVhZGVyIChwYXksIGJyLCBnb2IpIDwgUEFSU0VfT0spIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXksICJGYWlsZWQgdG8gcGFyc2UgR09CIGhlYWRlciIpOworICAgICAgICBnb3RvIGJlYWNoOworICAgICAgfQorICAgICAgZ29iLT5sYXN0Lm1iYSA9IDA7CisgICAgICBnb2ItPmxhc3QuZ29ibiA9IGdvYi0+Z247CisgICAgICBnb2ItPmxhc3QucXVhbnQgPSBnb2ItPmdxdWFudDsKKyAgICB9CisKKyAgICAvKiBQYXJzZSBNQnMgdG8gZmluZCBwb3NpdGlvbiB3aGVyZSB0byBzcGxpdC4gQ2FuIG9ubHkgYmUgZG9uZSBvbiBhZnRlciBNQgorICAgICAqIG9yIGF0IEdPQiBib3VuZGFyeS4gKi8KKyAgICByZXN1bHQgPSBwYXJzZV9tYl91bnRpbF9wb3MgKHBheSwgYnIsIGdvYiwgJmVuZHBvcyk7CisgICAgaWYgKHJlc3VsdCA8IFBBUlNFX09LKQorICAgICAgZ290byBiZWFjaDsKKworICAgIG1hcmtlciA9IHJlc3VsdCA9PSBQQVJTRV9FTkRfT0ZfRlJBTUU7CisgICAgcmV0ID0gZ3N0X3J0cF9oMjYxX3BheV9mcmFnbWVudF9wdXNoIChwYXksIGJ1ZmZlciwgYml0cywgc3RhcnRwb3MsIGVuZHBvcywKKyAgICAgICAgJmxhc3RfbWJfaW5fcHJldmlvdXNfcGFja2V0LCBtYXJrZXIpOworCisgICAgbGFzdF9tYl9pbl9wcmV2aW91c19wYWNrZXQgPSBnb2ItPmxhc3Q7CisgICAgaWYgKGVuZHBvcyA9PSBnb2ItPmVuZHBvcykKKyAgICAgIGdvYisrOworICAgIHN0YXJ0cG9zID0gZW5kcG9zOworICB9CisKK2JlYWNoOgorICByZXR1cm4gcmV0OworfQorCisvKiBTaGlmdCBidWZmZXIgdG8gcGFja2V0aXplIGEgY29udGludW91cyBzdHJlYW0gb2YgYml0cyAobm90IGJ5dGVzKS4gU29tZQorICogcGF5bG9hZGVycy9kZWNvZGVycyBhcmUgdmVyeSBwaWNreSBhYm91dCBjb3JyZWN0IHNiaXQvZWJpdCBmb3IgZnJhbWVzLiAqLworc3RhdGljIGd1aW50OCAqCitnc3RfcnRwX2gyNjFfcGF5X3NoaWZ0X2J1ZmZlciAoR3N0UnRwSDI2MVBheSAqIHBheSwgY29uc3QgZ3VpbnQ4ICogZGF0YSwKKyAgICBnc2l6ZSBzaXplLCBnaW50IG9mZnNldCwgZ3NpemUgKiBuZXdzaXplKQoreworICAvKiBJbiBvcmRlciB0byByZWFkIHZhcmlhYmxlIGxlbmd0aCBjb2RlcyBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGJ1ZmZlcgorICAgKiB3aWhvdXQgcGVla2luZyBpbnRvIHBvc3NpYmx5IHVuYWxsb2NhdGVkIGRhdGEsIHdlIHBhZCB3aXRoIGV4dHJhIDAncworICAgKiB3aGljaCB3aWxsIGdlbmVyYXRlIGFuIGludmFsaWQgY29kZSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICovCisgIGd1aW50IHBhZCA9IDQ7CisgIGdzaXplIGFsbG9jc2l6ZSA9IHNpemUgKyBwYWQ7CisgIGd1aW50OCAqYml0cyA9IGdfbWFsbG9jIChhbGxvY3NpemUpOworICBnaW50IGk7CisKKyAgaWYgKG9mZnNldCA9PSAwKSB7CisgICAgbWVtY3B5IChiaXRzLCBkYXRhLCBzaXplKTsKKyAgICAqbmV3c2l6ZSA9IHNpemU7CisgIH0gZWxzZSBpZiAob2Zmc2V0ID4gMCkgeworICAgIGJpdHNbMF0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgIGJpdHNbaV0gfD0gZGF0YVtpXSA+PiBvZmZzZXQ7CisgICAgICBiaXRzW2kgKyAxXSA9IGRhdGFbaV0gPDwgKDggLSBvZmZzZXQpOworICAgIH0KKyAgICAqbmV3c2l6ZSA9IHNpemUgKyAxOworICB9IGVsc2UgeworICAgIGdpbnQgc2hpZnQgPSAtb2Zmc2V0OworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKQorICAgICAgYml0c1tpXSA9IChkYXRhW2ldIDw8IHNoaWZ0KSB8IChkYXRhW2kgKyAxXSA+PiAoOCAtIHNoaWZ0KSk7CisgICAgYml0c1tpXSA9IGRhdGFbaV0gPDwgc2hpZnQ7CisgICAgKm5ld3NpemUgPSBzaXplOworICB9CisgIGZvciAoaSA9ICpuZXdzaXplOyBpIDwgYWxsb2NzaXplOyBpKyspCisgICAgYml0c1tpXSA9IDA7CisKKyAgcmV0dXJuIGJpdHM7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2gyNjFfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RSdHBIMjYxUGF5ICpwYXkgPSBHU1RfUlRQX0gyNjFfUEFZIChwYXlsb2FkKTsKKyAgZ3NpemUgbGVuOworICBndWludDggKmJpdHM7CisgIGdpbnQgcHNjX29mZnNldCwgc2hpZnQ7CisgIEdzdE1hcEluZm8gbWFwOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBheSwgIkhhbmRsZSBidWZmZXIgb2Ygc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikpOworCisgIHBheS0+dGltZXN0YW1wID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcik7CisKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpIHx8ICFtYXAuZGF0YSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGF5LCAiRmFpbGVkIHRvIG1hcCBidWZmZXIiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICBwc2Nfb2Zmc2V0ID0gZmluZF9waWN0dXJlX2hlYWRlcl9vZmZzZXQgKG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIGlmIChwc2Nfb2Zmc2V0IDwgMCkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGF5LCAiRmFpbGVkIHRvIGZpbmQgcGljdHVyZSBoZWFkZXIgb2Zmc2V0Iik7CisgICAgZ290byBiZWFjaDsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXksICJQaWN0dXJlIGhlYWRlciBvZmZzZXQ6ICVkIiwgcHNjX29mZnNldCk7CisgIH0KKworICBzaGlmdCA9IHBheS0+b2Zmc2V0IC0gcHNjX29mZnNldDsKKyAgYml0cyA9IGdzdF9ydHBfaDI2MV9wYXlfc2hpZnRfYnVmZmVyIChwYXksIG1hcC5kYXRhLCBtYXAuc2l6ZSwgc2hpZnQsICZsZW4pOworICByZXQgPSBnc3RfcnRwX2gyNjFfcGFja2V0aXplX2FuZF9wdXNoIChwYXksIGJ1ZmZlciwgYml0cywgbGVuKTsKKyAgZ19mcmVlIChiaXRzKTsKKworYmVhY2g6CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2gyNjFfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIGdib29sZWFuIHJlczsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocGF5bG9hZCwgInZpZGVvIiwKKyAgICAgIHBheWxvYWQtPnB0ICE9IEdTVF9SVFBfUEFZTE9BRF9IMjYxLCAiSDI2MSIsIDkwMDAwKTsKKyAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsIE5VTEwpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjFfcGF5X2luaXQgKEdzdFJ0cEgyNjFQYXkgKiBwYXkpCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkICpwYXlsb2FkID0gR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHBheSk7CisgIHBheWxvYWQtPnB0ID0gR1NUX1JUUF9QQVlMT0FEX0gyNjE7CisgIHBheS0+b2Zmc2V0ID0gMDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2MV9wYXlfY2xhc3NfaW5pdCAoR3N0UnRwSDI2MVBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfQ0xBU1MgKGtsYXNzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2gyNjFfcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaDI2MV9wYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgSDI2MSBwYWNrZXQgcGF5bG9hZGVyIiwgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZC1lbmNvZGVzIEgyNjEgdmlkZW8gaW4gUlRQIHBhY2tldHMgKFJGQyA0NTg3KSIsCisgICAgICAiU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9oMjYxX3BheV9zZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9IGdzdF9ydHBfaDI2MV9wYXlfaGFuZGxlX2J1ZmZlcjsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwaDI2MXBheV9kZWJ1ZywgInJ0cGgyNjFwYXkiLCAwLAorICAgICAgIkgyNjEgUlRQIFBheWxvYWRlciIpOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9oMjYxX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGgyNjFwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfSDI2MV9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBoMjYxcGF5LmggYi9nc3QvcnRwL2dzdHJ0cGgyNjFwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWU0YmYyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBoMjYxcGF5LmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAxND4gU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQXV0aG9yOiBEZWphbiBTYWtlbHNhayBzYWhlbEBraWJlcnBpcGEub3JnCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfSDI2MV9QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9IMjYxX1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VwYXlsb2FkLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9IMjYxX1BBWSAgICAgICAgICAgICAgICAgICBcCisgIChnc3RfcnRwX2gyNjFfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfSDI2MV9QQVkob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfSDI2MV9QQVksR3N0UnRwSDI2MVBheSkpCisjZGVmaW5lIEdTVF9SVFBfSDI2MV9QQVlfQ0xBU1Moa2xhc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9IMjYxX1BBWSxHc3RSdHBIMjYxUGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0gyNjFfUEFZKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0gyNjFfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9IMjYxX1BBWV9DTEFTUyhrbGFzcykgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0gyNjFfUEFZKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBIMjYxUGF5Q2xhc3MgR3N0UnRwSDI2MVBheUNsYXNzOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjFQYXkgR3N0UnRwSDI2MVBheTsKKworc3RydWN0IF9Hc3RSdHBIMjYxUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKyAgZ2ludCBvZmZzZXQ7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cEgyNjFQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBIMjYxUGF5SGVhZGVyCit7CisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorICB1bnNpZ25lZCBpbnQgdjoxOyAgICAgICAgICAgICAvKiBNb3Rpb24gdmVjdG9yIGZsYWcgKi8KKyAgdW5zaWduZWQgaW50IGk6MTsgICAgICAgICAgICAgLyogSW50cmEgZW5jb2RlZCBkYXRhICovCisgIHVuc2lnbmVkIGludCBlYml0OjM7ICAgICAgICAgIC8qIEVuZCBwb3NpdGlvbiAqLworICB1bnNpZ25lZCBpbnQgc2JpdDozOyAgICAgICAgICAvKiBTdGFydCBwb3NpdGlvbiAqLworCisgIHVuc2lnbmVkIGludCBtYmFwMTo0OyAgICAgICAgIC8qIE1CIGFkZHJlc3MgcHJlZGljdG9yIC0gcGFydDEgKi8KKyAgdW5zaWduZWQgaW50IGdvYm46NDsgICAgICAgICAgLyogR09CIG51bWJlciAqLworCisgIHVuc2lnbmVkIGludCBobXZkMToyOyAgICAgICAgIC8qIEhvcml6b250YWwgbW90aW9uIHZlY3RvciBkYXRhIC0gcGFydDEgKi8KKyAgdW5zaWduZWQgaW50IHF1YW50OjU7ICAgICAgICAgLyogUXVhbnRpemVyICovCisgIHVuc2lnbmVkIGludCBtYmFwMjoxOyAgICAgICAgIC8qIE1CIGFkZHJlc3MgcHJlZGljdG9yIC0gcGFydDIgKi8KKworICB1bnNpZ25lZCBpbnQgdm12ZDo1OyAgICAgICAgICAvKiBIb3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgZGF0YSAtIHBhcnQxICovCisgIHVuc2lnbmVkIGludCBobXZkMjozOyAgICAgICAgIC8qIFZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgZGF0YSAqLworI2VsaWYgR19CWVRFX09SREVSID09IEdfQklHX0VORElBTgorICB1bnNpZ25lZCBpbnQgc2JpdDozOyAgICAgICAgICAvKiBTdGFydCBwb3NpdGlvbiAqLworICB1bnNpZ25lZCBpbnQgZWJpdDozOyAgICAgICAgICAvKiBFbmQgcG9zaXRpb24gKi8KKyAgdW5zaWduZWQgaW50IGk6MTsgICAgICAgICAgICAgLyogSW50cmEgZW5jb2RlZCBkYXRhICovCisgIHVuc2lnbmVkIGludCB2OjE7ICAgICAgICAgICAgIC8qIE1vdGlvbiB2ZWN0b3IgZmxhZyAqLworCisgIHVuc2lnbmVkIGludCBnb2JuOjQ7ICAgICAgICAgIC8qIEdPQiBudW1iZXIgKi8KKyAgdW5zaWduZWQgaW50IG1iYXAxOjQ7ICAgICAgICAgLyogTUIgYWRkcmVzcyBwcmVkaWN0b3IgLSBwYXJ0MSAqLworCisgIHVuc2lnbmVkIGludCBtYmFwMjoxOyAgICAgICAgIC8qIE1CIGFkZHJlc3MgcHJlZGljdG9yIC0gcGFydDIgKi8KKyAgdW5zaWduZWQgaW50IHF1YW50OjU7ICAgICAgICAgLyogUXVhbnRpemVyICovCisgIHVuc2lnbmVkIGludCBobXZkMToyOyAgICAgICAgIC8qIEhvcml6b250YWwgbW90aW9uIHZlY3RvciBkYXRhIC0gcGFydDEgKi8KKworICB1bnNpZ25lZCBpbnQgaG12ZDI6MzsgICAgICAgICAvKiBWZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGRhdGEgKi8KKyAgdW5zaWduZWQgaW50IHZtdmQ6NTsgICAgICAgICAgLyogSG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGRhdGEgLSBwYXJ0MSAqLworI2Vsc2UKKyNlcnJvciAiR19CWVRFX09SREVSIHNob3VsZCBiZSBiaWcgb3IgbGl0dGxlIGVuZGlhbi4iCisjZW5kaWYKK30gR3N0UnRwSDI2MVBheUhlYWRlcjsKKyNkZWZpbmUgR1NUX1JUUF9IMjYxX1BBWUxPQURfSEVBREVSX0xFTiA0CisKK0dUeXBlIGdzdF9ydHBfaDI2MV9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2gyNjFfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1JUUF9IMjYxX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwaDI2M2RlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NmY5MTcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5jCkBAIC0wLDAgKzEsNDQ3IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IDIwMDcgQ29sbGFib3JhIEx0ZCwKKyAqICBAYXV0aG9yOiBQaGlsaXBwZSBLYWxhZiA8cGhpbGlwcGUua2FsYWZAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKiAgICAgICAgICAgICAgIDwyMDA3PiBFZHdhcmQgSGVydmV5IDxiaWxib2VkQGJpbGJvZWQuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgImdzdHJ0cGgyNjNkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cGgyNjNkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwaDI2M2RlcGF5X2RlYnVnKQorCisjZGVmaW5lIEdTVF9SRkMyMTkwQV9IRUFERVJfTEVOIDQKKyNkZWZpbmUgR1NUX1JGQzIxOTBCX0hFQURFUl9MRU4gOAorI2RlZmluZSBHU1RfUkZDMjE5MENfSEVBREVSX0xFTiAxMgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9oMjYzX2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1oMjYzLCAiCisgICAgICAgICJ2YXJpYW50ID0gKHN0cmluZykgXCJpdHVcIiwgIiAiaDI2M3ZlcnNpb24gPSAoc3RyaW5nKSBcImgyNjNcIiIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2M19kZXBheV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9IMjYzX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDA7ICIKKyAgICAgICAgLyogb3B0aW9uYWwgU0RQIGF0dHJpYnV0ZToKKyAgICAgICAgICogImEtZnJhbWVzaXplID0gKHN0cmluZykgXCIxMjM0LTEyMzRcIiwgIgorICAgICAgICAgKi8KKyAgICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJIMjYzXCIiCisgICAgICAgIC8qIG9wdGlvbmFsIFNEUCBhdHRyaWJ1dGU6CisgICAgICAgICAqICJhLWZyYW1lc2l6ZSA9IChzdHJpbmcpIFwiMTIzNC0xMjM0XCIsICIKKyAgICAgICAgICovCisgICAgKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF9oMjYzX2RlcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEgyNjNEZXBheSwgZ3N0X3J0cF9oMjYzX2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2M19kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX2gyNjNfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9oMjYzX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKK2dib29sZWFuIGdzdF9ydHBfaDI2M19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZmlsdGVyLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2M19kZXBheV9jbGFzc19pbml0IChHc3RSdHBIMjYzRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBoMjYzZGVwYXlfZGVidWcsICJydHBoMjYzZGVwYXkiLCAwLAorICAgICAgIkgyNjMgVmlkZW8gUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfaDI2M19kZXBheV9maW5hbGl6ZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX2gyNjNfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaDI2M19kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2gyNjNfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgSDI2MyBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgSDI2MyB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMjE5MCkiLAorICAgICAgIlBoaWxpcHBlIEthbGFmIDxwaGlsaXBwZS5rYWxhZkBjb2xsYWJvcmEuY28udWs+LCAiCisgICAgICAiRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBiaWxib2VkLmNvbT4iKTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX2gyNjNfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2gyNjNfZGVwYXlfc2V0Y2FwczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2M19kZXBheV9pbml0IChHc3RSdHBIMjYzRGVwYXkgKiBydHBoMjYzZGVwYXkpCit7CisgIHJ0cGgyNjNkZXBheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKworICBydHBoMjYzZGVwYXktPm9mZnNldCA9IDA7CisgIHJ0cGgyNjNkZXBheS0+bGVmdG92ZXIgPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYzX2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSdHBIMjYzRGVwYXkgKnJ0cGgyNjNkZXBheTsKKworICBydHBoMjYzZGVwYXkgPSBHU1RfUlRQX0gyNjNfREVQQVkgKG9iamVjdCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cGgyNjNkZXBheS0+YWRhcHRlcik7CisgIHJ0cGgyNjNkZXBheS0+YWRhcHRlciA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2M19wYXJzZV9mcmFtZXNpemUgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBmaWx0ZXIsCisgICAgY29uc3QgZ2NoYXIgKiBtZWRpYV9hdHRyLCBHc3RDYXBzICogc3JjY2FwcykKK3sKKyAgZ2NoYXIgKmRpbWVuc2lvbiwgKmVuZHB0cjsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBHc3RTdHJ1Y3R1cmUgKmQ7CisKKyAgd2lkdGggPSBnX2FzY2lpX3N0cnRvdWxsIChtZWRpYV9hdHRyLCAmZW5kcHRyLCAxMCk7CisgIGlmICh3aWR0aCA8PSAwKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZmlsdGVyLAorICAgICAgICAiRnJhbWVzaXplIG1lZGlhIGF0dHJpYnV0ZSB3aWR0aCBvdXQgb2YgdmFsaWQgcmFuZ2UiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0gZWxzZSBpZiAoKmVuZHB0ciAhPSAnLScpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChmaWx0ZXIsCisgICAgICAgICJGcmFtZXNpemUgbWVkaWEgYXR0cmlidXRlIGhhcyBpbnZhbGlkIGRpbWVuc2lvbiBzZXBhcmF0b3IiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBkaW1lbnNpb24gPSBlbmRwdHIgKyAxOworICBoZWlnaHQgPSBnX2FzY2lpX3N0cnRvdWxsIChkaW1lbnNpb24sICZlbmRwdHIsIDEwKTsKKyAgaWYgKGhlaWdodCA8PSAwKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZmlsdGVyLAorICAgICAgICAiRnJhbWVzaXplIG1lZGlhIGF0dHJpYnV0ZSBoZWlnaHQgb3V0IG9mIHZhbGlkIHJhbmdlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9IGVsc2UgaWYgKCplbmRwdHIgIT0gJ1wwJykgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGZpbHRlciwKKyAgICAgICAgIkZyYW1lc2l6ZSBtZWRpYSBhdHRyaWJ1dGUgdW5leHBlY3RlZGx5IGhhcyB0cmFpbGluZyBjaGFyYWN0ZXJzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgZCA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHNyY2NhcHMsIDApOworICBnc3Rfc3RydWN0dXJlX3NldCAoZCwgIndpZHRoIiwgR19UWVBFX0lOVCwgd2lkdGgsICJoZWlnaHQiLCBHX1RZUEVfSU5ULAorICAgICAgaGVpZ2h0LCBOVUxMKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2M19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZmlsdGVyLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0Q2FwcyAqc3JjY2FwczsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgZ2ludCBjbG9ja19yYXRlOworICBjb25zdCBnY2hhciAqZnJhbWVzaXplOworCisgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1oMjYzIiwKKyAgICAgICJ2YXJpYW50IiwgR19UWVBFX1NUUklORywgIml0dSIsCisgICAgICAiaDI2M3ZlcnNpb24iLCBHX1RZUEVfU1RSSU5HLCAiaDI2MyIsIE5VTEwpOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA5MDAwMDsgICAgICAgICAvKiBkZWZhdWx0ICovCisgIGZpbHRlci0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgZnJhbWVzaXplID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJhLWZyYW1lc2l6ZSIpOworICBpZiAoZnJhbWVzaXplICE9IE5VTEwpIHsKKyAgICBpZiAoIWdzdF9ydHBfaDI2M19wYXJzZV9mcmFtZXNpemUgKGZpbHRlciwgZnJhbWVzaXplLCBzcmNjYXBzKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorCisgIGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChmaWx0ZXIpLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfaDI2M19kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cEgyNjNEZXBheSAqcnRwaDI2M2RlcGF5OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ2ludCBwYXlsb2FkX2xlbjsKKyAgZ3VpbnQ4ICpwYXlsb2FkOworICBndWludCBoZWFkZXJfbGVuOworICBndWludCBTQklULCBFQklUOworICBnYm9vbGVhbiBGLCBQLCBNOworICBnYm9vbGVhbiBJOworCisgIHJ0cGgyNjNkZXBheSA9IEdTVF9SVFBfSDI2M19ERVBBWSAoZGVwYXlsb2FkKTsKKworICAvKiBmbHVzaCByZW1haW5pbmcgZGF0YSBvbiBkaXNjb250ICovCisgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKHJ0cC0+YnVmZmVyKSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChkZXBheWxvYWQsICJEaXNjb250IGJ1ZmZlciwgZmx1c2hpbmcgYWRhcHRlciIpOworICAgIGdzdF9hZGFwdGVyX2NsZWFyIChydHBoMjYzZGVwYXktPmFkYXB0ZXIpOworICAgIHJ0cGgyNjNkZXBheS0+b2Zmc2V0ID0gMDsKKyAgICBydHBoMjYzZGVwYXktPmxlZnRvdmVyID0gMDsKKyAgICBydHBoMjYzZGVwYXktPnN0YXJ0ID0gRkFMU0U7CisgIH0KKworICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKyAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkIChydHApOworCisgIE0gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApOworCisgIGlmIChwYXlsb2FkX2xlbiA8IDEpCisgICAgZ290byB0b29fc21hbGw7CisKKyAgLyogTGV0J3Mgc2VlIHdoYXQgbW9kZSB3ZSBhcmUgdXNpbmcgKi8KKyAgRiA9IChwYXlsb2FkWzBdICYgMHg4MCkgPT0gMHg4MDsKKyAgUCA9IChwYXlsb2FkWzBdICYgMHg0MCkgPT0gMHg0MDsKKworICAvKiBCaXQgc2hpZnRpbmcgKi8KKyAgU0JJVCA9IChwYXlsb2FkWzBdICYgMHgzOCkgPj4gMzsKKyAgRUJJVCA9IChwYXlsb2FkWzBdICYgMHgwNyk7CisKKyAgLyogRmlndXJlIG91dCBoZWFkZXIgbGVuZ3RoIGFuZCBJLWZsYWcgKi8KKyAgaWYgKEYgPT0gMCkgeworICAgIC8qIEYgPT0gMCBhbmQgUCA9PSAwIG9yIDEKKyAgICAgKiBtb2RlIEEgKi8KKyAgICBoZWFkZXJfbGVuID0gR1NUX1JGQzIxOTBBX0hFQURFUl9MRU47CisgICAgR1NUX0xPRyAoIk1vZGUgQSIpOworCisgICAgLyogMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAqIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICogfEZ8UHxTQklUIHxFQklUIHwgU1JDIHxJfFV8U3xBfFIgICAgICB8REJRfCBUUkIgfCAgICBUUiAgICAgICAgIHwKKyAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqLworICAgIGlmIChwYXlsb2FkX2xlbiA8PSBoZWFkZXJfbGVuKQorICAgICAgZ290byB0b29fc21hbGw7CisgICAgSSA9IChwYXlsb2FkWzFdICYgMHgxMCkgPT0gMHgxMDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoUCA9PSAwKSB7CisgICAgICAvKiBGID09IDEgYW5kIFAgPT0gMAorICAgICAgICogbW9kZSBCICovCisgICAgICBoZWFkZXJfbGVuID0gR1NUX1JGQzIxOTBCX0hFQURFUl9MRU47CisgICAgICBHU1RfTE9HICgiTW9kZSBCIik7CisKKyAgICAgIC8qIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgICAqIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAqIHxGfFB8U0JJVCB8RUJJVCB8IFNSQyB8IFFVQU5UICAgfCAgR09CTiAgIHwgICBNQkEgICAgICAgICAgIHxSICB8CisgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICogfEl8VXxTfEF8IEhNVjEgICAgICAgIHwgVk1WMSAgICAgICAgfCBITVYyICAgICAgICB8IFZNVjIgICAgICAgIHwKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKi8KKyAgICAgIGlmIChwYXlsb2FkX2xlbiA8PSBoZWFkZXJfbGVuKQorICAgICAgICBnb3RvIHRvb19zbWFsbDsKKyAgICAgIEkgPSAocGF5bG9hZFs0XSAmIDB4ODApID09IDB4ODA7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEYgPT0gMSBhbmQgUCA9PSAxCisgICAgICAgKiBtb2RlIEMgKi8KKyAgICAgIGhlYWRlcl9sZW4gPSBHU1RfUkZDMjE5MENfSEVBREVSX0xFTjsKKyAgICAgIEdTVF9MT0cgKCJNb2RlIEMiKTsKKworICAgICAgLyogMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAgICogMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICogfEZ8UHxTQklUIHxFQklUIHwgU1JDIHwgUVVBTlQgICB8ICBHT0JOICAgfCAgIE1CQSAgICAgICAgICAgfFIgIHwKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKiB8SXxVfFN8QXwgSE1WMSAgICAgICAgfCBWTVYxICAgICAgICB8IEhNVjIgICAgICAgIHwgVk1WMiAgICAgICAgfAorICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAqIHwgUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfERCUXwgVFJCIHwgICAgVFIgICAgICAgICB8CisgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICovCisgICAgICBpZiAocGF5bG9hZF9sZW4gPD0gaGVhZGVyX2xlbikKKyAgICAgICAgZ290byB0b29fc21hbGw7CisgICAgICBJID0gKHBheWxvYWRbNF0gJiAweDgwKSA9PSAweDgwOworICAgIH0KKyAgfQorCisgIEdTVF9MT0cgKCJGL1AvTS9JIDogJWQvJWQvJWQvJWQiLCBGLCBQLCBNLCBJKTsKKyAgR1NUX0xPRyAoIlNCSVQgOiAlZCAsIEVCSVQgOiAlZCIsIFNCSVQsIEVCSVQpOworICBHU1RfTE9HICgicGF5bG9hZF9sZW4gOiAlZCwgaGVhZGVyX2xlbiA6ICVkICwgbGVmdG92ZXIgOiAweCV4IiwKKyAgICAgIHBheWxvYWRfbGVuLCBoZWFkZXJfbGVuLCBydHBoMjYzZGVwYXktPmxlZnRvdmVyKTsKKworICAvKiBza2lwIGhlYWRlciAqLworICBwYXlsb2FkICs9IGhlYWRlcl9sZW47CisgIHBheWxvYWRfbGVuIC09IGhlYWRlcl9sZW47CisKKyAgaWYgKCFydHBoMjYzZGVwYXktPnN0YXJ0KSB7CisgICAgLyogb25seSBtb2RlIEEgc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGVyZSBpcyBhIHBpY3R1cmUgc3RhcnQgY29kZSwgYnV0CisgICAgICogYnVnZ3kgcGF5bG9hZGVycyBtYXkgc2VuZCBtb2RlIEIvQyBpbiBzdGFydCBvZiBmcmFtZSAqLworICAgIGlmIChwYXlsb2FkX2xlbiA+IDQgJiYgKEdTVF9SRUFEX1VJTlQzMl9CRSAocGF5bG9hZCkgPj4gMTAgPT0gMHgyMCkpIHsKKyAgICAgIEdTVF9ERUJVRyAoIk1vZGUgJWMgd2l0aCBQU0MgPT4gZnJhbWUgc3RhcnQiLCAiQUJDIltGICsgUF0pOworICAgICAgcnRwaDI2M2RlcGF5LT5zdGFydCA9IFRSVUU7CisgICAgICBpZiAoKCEgIShwYXlsb2FkWzRdICYgMHgwMikpICE9IEkpIHsKKyAgICAgICAgR1NUX0RFQlVHICgiV3JvbmcgUGljdHVyZSBDb2RpbmcgVHlwZSBGbGFnIGluIHJ0cCBoZWFkZXIiKTsKKyAgICAgICAgSSA9ICFJOworICAgICAgfQorICAgICAgcnRwaDI2M2RlcGF5LT5wc2NfSSA9IEk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVRyAoIm5vIGZyYW1lIHN0YXJ0IHlldCwgc2tpcHBpbmcgcGF5bG9hZCIpOworICAgICAgZ290byBza2lwOworICAgIH0KKyAgfQorCisgIC8qIG9ubHkgdHJ1c3QgSSBpbmZvIGZyb20gTW9kZSBBIHN0YXJ0aW5nIHBhY2tldAorICAgKiBmcm9tIGJ1Z2d5IHBheWxvYWRlcnMgb3IgaHcgKi8KKyAgSSA9IHJ0cGgyNjNkZXBheS0+cHNjX0k7CisKKyAgaWYgKFNCSVQpIHsKKyAgICAvKiB0YWtlIHRoZSBsZWZ0b3ZlciBhbmQgbWVyZ2UgaXQgYXQgdGhlIGJlZ2lubmluZywgRklYTUUgbWFrZSB0aGUgYnVmZmVyCisgICAgICogZGF0YSB3cml0YWJsZS4gKi8KKyAgICBHU1RfTE9HICgicGF5bG9hZFswXSA6IDB4JXgiLCBwYXlsb2FkWzBdKTsKKyAgICBwYXlsb2FkWzBdICY9IDB4RkYgPj4gU0JJVDsKKyAgICBHU1RfTE9HICgicGF5bG9hZFswXSA6IDB4JXgiLCBwYXlsb2FkWzBdKTsKKyAgICBwYXlsb2FkWzBdIHw9IHJ0cGgyNjNkZXBheS0+bGVmdG92ZXI7CisgICAgR1NUX0xPRyAoInBheWxvYWRbMF0gOiAweCV4IiwgcGF5bG9hZFswXSk7CisgICAgcnRwaDI2M2RlcGF5LT5sZWZ0b3ZlciA9IDA7CisgICAgcnRwaDI2M2RlcGF5LT5vZmZzZXQgPSAwOworICB9CisKKyAgaWYgKCFFQklUKSB7CisgICAgR3N0QnVmZmVyICp0bXA7CisKKyAgICAvKiBUYWtlIHRoZSBlbnRpcmUgYnVmZmVyICovCisgICAgdG1wID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfc3ViYnVmZmVyIChydHAsIGhlYWRlcl9sZW4sIHBheWxvYWRfbGVuKTsKKyAgICBnc3RfYWRhcHRlcl9wdXNoIChydHBoMjYzZGVwYXktPmFkYXB0ZXIsIHRtcCk7CisgIH0gZWxzZSB7CisgICAgR3N0QnVmZmVyICp0bXA7CisKKyAgICAvKiBUYWtlIHRoZSBlbnRpcmUgYnVmZmVyIGV4Y2VwdCBmb3IgdGhlIGxhc3QgYnl0ZSAqLworICAgIHRtcCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3N1YmJ1ZmZlciAocnRwLCBoZWFkZXJfbGVuLAorICAgICAgICBwYXlsb2FkX2xlbiAtIDEpOworICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGgyNjNkZXBheS0+YWRhcHRlciwgdG1wKTsKKworICAgIC8qIFB1dCB0aGUgbGFzdCBieXRlIGludG8gdGhlIGxlZnRvdmVyICovCisgICAgR1NUX0RFQlVHICgicGF5bG9hZFtwYXlsb2FkX2xlbiAtIDFdIDogMHgleCIsIHBheWxvYWRbcGF5bG9hZF9sZW4gLSAxXSk7CisgICAgR1NUX0RFQlVHICgibWFzayA6IDB4JXgiLCAweEZGIDw8IEVCSVQpOworICAgIHJ0cGgyNjNkZXBheS0+bGVmdG92ZXIgPSAocGF5bG9hZFtwYXlsb2FkX2xlbiAtIDFdID4+IEVCSVQpIDw8IEVCSVQ7CisgICAgcnRwaDI2M2RlcGF5LT5vZmZzZXQgPSAxOworICAgIEdTVF9ERUJVRyAoImxlZnRvdmVyIDogMHgleCIsIHJ0cGgyNjNkZXBheS0+bGVmdG92ZXIpOworICB9CisKK3NraXA6CisgIGlmIChNKSB7CisgICAgaWYgKHJ0cGgyNjNkZXBheS0+c3RhcnQpIHsKKyAgICAgIC8qIGZyYW1lIGlzIGNvbXBsZXRlZCAqLworICAgICAgZ3VpbnQgYXZhaWw7CisKKyAgICAgIGlmIChydHBoMjYzZGVwYXktPm9mZnNldCkgeworICAgICAgICAvKiBwdXNoIGluIHRoZSBsZWZ0b3ZlciAqLworICAgICAgICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMSk7CisKKyAgICAgICAgR1NUX0RFQlVHICgiUHVzaGluZyBsZWZ0b3ZlciBpbiBhZGFwdGVyIik7CisgICAgICAgIGdzdF9idWZmZXJfZmlsbCAoYnVmLCAwLCAmcnRwaDI2M2RlcGF5LT5sZWZ0b3ZlciwgMSk7CisgICAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGgyNjNkZXBheS0+YWRhcHRlciwgYnVmKTsKKyAgICAgIH0KKworICAgICAgYXZhaWwgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cGgyNjNkZXBheS0+YWRhcHRlcik7CisgICAgICBvdXRidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwaDI2M2RlcGF5LT5hZGFwdGVyLCBhdmFpbCk7CisKKyAgICAgIGlmIChJKQorICAgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKTsKKworICAgICAgR1NUX0RFQlVHICgiUHVzaGluZyBvdXQgYSBidWZmZXIgb2YgJWQgYnl0ZXMiLCBhdmFpbCk7CisKKyAgICAgIGdzdF9ydHBfZHJvcF9ub25fdmlkZW9fbWV0YSAocnRwaDI2M2RlcGF5LCBvdXRidWYpOworCisgICAgICBnc3RfcnRwX2Jhc2VfZGVwYXlsb2FkX3B1c2ggKGRlcGF5bG9hZCwgb3V0YnVmKTsKKyAgICAgIHJ0cGgyNjNkZXBheS0+b2Zmc2V0ID0gMDsKKyAgICAgIHJ0cGgyNjNkZXBheS0+bGVmdG92ZXIgPSAwOworICAgICAgcnRwaDI2M2RlcGF5LT5zdGFydCA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICBydHBoMjYzZGVwYXktPnN0YXJ0ID0gVFJVRTsKKyAgICB9CisgIH0KKworICByZXR1cm4gTlVMTDsKKwordG9vX3NtYWxsOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwaDI2M2RlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJQYWNrZXQgcGF5bG9hZCB3YXMgdG9vIHNtYWxsIiksIChOVUxMKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2gyNjNfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSdHBIMjYzRGVwYXkgKnJ0cGgyNjNkZXBheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJ0cGgyNjNkZXBheSA9IEdTVF9SVFBfSDI2M19ERVBBWSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGgyNjNkZXBheS0+YWRhcHRlcik7CisgICAgICBydHBoMjYzZGVwYXktPnN0YXJ0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2gyNjNfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBoMjYzZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfSDI2M19ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGgyNjNkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDljYTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBoMjYzZGVwYXkuaApAQCAtMCwwICsxLDY2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfSDI2M19ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0gyNjNfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0gyNjNfREVQQVkgXAorICAoZ3N0X3J0cF9oMjYzX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfSDI2M19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9IMjYzX0RFUEFZLEdzdFJ0cEgyNjNEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfSDI2M19ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSDI2M19ERVBBWSxHc3RSdHBIMjYzRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfSDI2M19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9IMjYzX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9IMjYzX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9IMjYzX0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjNEZXBheSBHc3RSdHBIMjYzRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2M0RlcGF5Q2xhc3MgR3N0UnRwSDI2M0RlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwSDI2M0RlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCisgIGd1aW50OCBvZmZzZXQ7CS8qIG9mZnNldCB0byBhcHBseSB0byBuZXh0IHBheWxvYWQgKi8KKyAgZ3VpbnQ4IGxlZnRvdmVyOwkvKiBsZWZ0b3ZlciBmcm9tIHByZXZpb3VzIHBheWxvYWQgKGlmIG9mZnNldCAhPSAwKSAqLworICBnYm9vbGVhbiBwc2NfSTsgICAgICAgLyogUGljdHVyZS1Db2RpbmctVHlwZSA9PSBJIGZyb20gUGljdHVyZSBTdGFydCBDb2RlIHBhY2tldCAqLworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBnYm9vbGVhbiBzdGFydDsKK307CisKK3N0cnVjdCBfR3N0UnRwSDI2M0RlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfaDI2M19kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfaDI2M19kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9IMjYzX0RFUEFZX0hfXyAqLworCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwaDI2M3BheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNjNiY2QKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGgyNjNwYXkuYwpAQCAtMCwwICsxLDE4NjkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDg+IERlamFuIFNha2Vsc2FrIDxkZWphbi5zYWtlbHNha0BtYXJhbmQuc2k+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBKYW5pbiBLb2xlbmMgIDxqYW5pbi5rb2xlbmNAbWFyYW5kLnNpPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSAiZ3N0cnRwaDI2M3BheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK3R5cGVkZWYgZW51bQoreworICBHU1RfSDI2M19GUkFNRV9UWVBFX0kgPSAwLAorICBHU1RfSDI2M19GUkFNRV9UWVBFX1AgPSAxLAorICBHU1RfSDI2M19GUkFNRV9UWVBFX1BCID0gMgorfSBHc3RSdHBIMjYzUGF5RnJhbWVUeXBlOworCit0eXBlZGVmIGVudW0KK3sKKyAgR1NUX1JUUF9IMjYzX1BBWUxPQURfUElDVFVSRV9GT1JNQVRfUkVTMSA9IDAsCisgIEdTVF9SVFBfSDI2M19QQVlMT0FEX1BJQ1RVUkVfRk9STUFUX1NRQ0lGID0gMSwKKyAgR1NUX1JUUF9IMjYzX1BBWUxPQURfUElDVFVSRV9GT1JNQVRfUUNJRiA9IDIsCisgIEdTVF9SVFBfSDI2M19QQVlMT0FEX1BJQ1RVUkVfRk9STUFUX0NJRiA9IDMsCisgIEdTVF9SVFBfSDI2M19QQVlMT0FEX1BJQ1RVUkVfRk9STUFUXzRDSUYgPSA0LAorICBHU1RfUlRQX0gyNjNfUEFZTE9BRF9QSUNUVVJFX0ZPUk1BVF8xNkNJRiA9IDUsCisgIEdTVF9SVFBfSDI2M19QQVlMT0FEX1BJQ1RVUkVfRk9STUFUX1JFUzIgPSA2LAorICBHU1RfSDI2M19QQVlMT0FEX1BJQ1RVUkVfRk9STUFUX1BMVVMgPSA3Cit9IEdzdFJ0cEgyNjNQYXlQaWN0dXJlRm9ybWF0OworCitzdGF0aWMgY29uc3QgZ3VpbnQgZm9ybWF0X3Byb3BzWzhdWzJdID0geyB7MjU0LCAyNTR9LAorezYsIDh9LAorezksIDExfSwKK3sxOCwgMjJ9LAorezE4LCA4OH0sCit7MTgsIDM1Mn0sCit7MjU0LCAyNTR9LAorezI1NSwgMjU1fQorfTsKKworLyoKKyAqIEktZnJhbWUgTUNCUEMgdGFibGU6IGNvZGUsIG1hc2ssIG5iaXRzLCBjYiwgY3IsIG1iIHR5cGUgLT4gMTAgPSB1bmRlZmluZWQgKGJlY2F1c2Ugd2UgaGF2ZSBndWludCkKKyAqLworI2RlZmluZSBNQ0JQQ19JX0xFTiA5CisjZGVmaW5lIE1DQlBDX0lfV0lEIDYKK3N0YXRpYyBjb25zdCBndWludDMyIG1jYnBjX0lbOV1bNl0gPSB7CisgIHsweDgwMDAsIDB4ODAwMCwgMSwgMCwgMCwgM30sCisgIHsweDIwMDAsIDB4ZTAwMCwgMywgMCwgMSwgM30sCisgIHsweDQwMDAsIDB4ZTAwMCwgMywgMSwgMCwgM30sCisgIHsweDYwMDAsIDB4ZTAwMCwgMywgMSwgMSwgM30sCisgIHsweDEwMDAsIDB4ZjAwMCwgNCwgMCwgMCwgNH0sCisgIHsweDA0MDAsIDB4ZmMwMCwgNiwgMCwgMSwgNH0sCisgIHsweDA4MDAsIDB4ZmMwMCwgNiwgMSwgMCwgNH0sCisgIHsweDBjMDAsIDB4ZmMwMCwgNiwgMSwgMSwgNH0sCisgIHsweDAwODAsIDB4ZmY4MCwgOSwgMTAsIDEwLCAxMH0KK307CisKKy8qCisgKiBQLWZyYW1lIE1DQlBDIHRhYmxlOiBjb2RlLCBtYXNrLCBuYml0cywgY2IsIGNyLCBtYiB0eXBlIC0+IDEwID0gdW5kZWZpbmVkIChiZWNhdXNlIHdlIGhhdmUgZ3VpbnQpCisgKi8KKyNkZWZpbmUgTUNCUENfUF9MRU4gMjEKKyNkZWZpbmUgTUNCUENfUF9XSUQgNgorc3RhdGljIGNvbnN0IGd1aW50MTYgbWNicGNfUFsyMV1bNl0gPSB7CisgIHsweDgwMDAsIDB4ODAwMCwgMSwgMCwgMCwgMH0sCisgIHsweDMwMDAsIDB4ZjAwMCwgNCwgMCwgMSwgMH0sCisgIHsweDIwMDAsIDB4ZjAwMCwgNCwgMSwgMCwgMH0sCisgIHsweDE0MDAsIDB4ZmMwMCwgNiwgMSwgMSwgMH0sCisgIHsweDYwMDAsIDB4ZTAwMCwgMywgMCwgMCwgMX0sCisgIHsweDBlMDAsIDB4ZmUwMCwgNywgMCwgMSwgMX0sCisgIHsweDBjMDAsIDB4ZmUwMCwgNywgMSwgMCwgMX0sCisgIHsweDAyODAsIDB4ZmY4MCwgOSwgMSwgMSwgMX0sCisgIHsweDQwMDAsIDB4ZTAwMCwgMywgMCwgMCwgMn0sCisgIHsweDBhMDAsIDB4ZmUwMCwgNywgMCwgMSwgMn0sCisgIHsweDA4MDAsIDB4ZmUwMCwgNywgMSwgMCwgMn0sCisgIHsweDA1MDAsIDB4ZmYwMCwgOCwgMSwgMSwgMn0sCisgIHsweDE4MDAsIDB4ZjgwMCwgNSwgMCwgMCwgM30sCisgIHsweDA0MDAsIDB4ZmYwMCwgOCwgMCwgMSwgM30sCisgIHsweDAzMDAsIDB4ZmYwMCwgOCwgMSwgMCwgM30sCisgIHsweDA2MDAsIDB4ZmUwMCwgNywgMSwgMSwgM30sCisgIHsweDEwMDAsIDB4ZmMwMCwgNiwgMCwgMCwgNH0sCisgIHsweDAyMDAsIDB4ZmY4MCwgOSwgMCwgMSwgNH0sCisgIHsweDAxODAsIDB4ZmY4MCwgOSwgMSwgMCwgNH0sCisgIHsweDAxMDAsIDB4ZmY4MCwgOSwgMSwgMSwgNH0sCisgIHsweDAwODAsIDB4ZmY4MCwgOSwgMTAsIDEwLCAxMH0KK307CisKKy8qCisgKiBJLWZyYW1lIENCUFkgKGNvZGUsIG1hc2ssIG5iaXRzLCBZMCwgWTEsIFkyLCBZMykKKyAqLworI2RlZmluZSBDQlBZX0xFTiAxNgorI2RlZmluZSBDQlBZX1dJRCA3CitzdGF0aWMgY29uc3QgZ3VpbnQ4IGNicHlfSVsxNl1bN10gPSB7CisgIHsweDMwLCAweGYwLCA0LCAwLCAwLCAwLCAwfSwKKyAgezB4MjgsIDB4ZjgsIDUsIDAsIDAsIDAsIDF9LAorICB7MHgyMCwgMHhmOCwgNSwgMCwgMCwgMSwgMH0sCisgIHsweDkwLCAweGYwLCA0LCAwLCAwLCAxLCAxfSwKKyAgezB4MTgsIDB4ZjgsIDUsIDAsIDEsIDAsIDB9LAorICB7MHg3MCwgMHhmMCwgNCwgMCwgMSwgMCwgMX0sCisgIHsweDA4LCAweGZjLCA2LCAwLCAxLCAxLCAwfSwKKyAgezB4YjAsIDB4ZjAsIDQsIDAsIDEsIDEsIDF9LAorICB7MHgxMCwgMHhmOCwgNSwgMSwgMCwgMCwgMH0sCisgIHsweDBjLCAweGZjLCA2LCAxLCAwLCAwLCAxfSwKKyAgezB4NTAsIDB4ZjAsIDQsIDEsIDAsIDEsIDB9LAorICB7MHhhMCwgMHhmMCwgNCwgMSwgMCwgMSwgMX0sCisgIHsweDQwLCAweGYwLCA0LCAxLCAxLCAwLCAwfSwKKyAgezB4ODAsIDB4ZjAsIDQsIDEsIDEsIDAsIDF9LAorICB7MHg2MCwgMHhmMCwgNCwgMSwgMSwgMSwgMH0sCisgIHsweGMwLCAweGMwLCAyLCAxLCAxLCAxLCAxfQorfTsKKworLyoKKyAqIFAtZnJhbWUgQ0JQWSAoY29kZSwgbWFzaywgbmJpdHMsIFkwLCBZMSwgWTIsIFkzKQorICovCitzdGF0aWMgY29uc3QgZ3VpbnQ4IGNicHlfUFsxNl1bN10gPSB7CisgIHsweDMwLCAweGYwLCA0LCAxLCAxLCAxLCAxfSwKKyAgezB4MjgsIDB4ZjgsIDUsIDEsIDEsIDEsIDB9LAorICB7MHgyMCwgMHhmOCwgNSwgMSwgMSwgMCwgMX0sCisgIHsweDkwLCAweGYwLCA0LCAxLCAxLCAwLCAwfSwKKyAgezB4MTgsIDB4ZjgsIDUsIDEsIDAsIDEsIDF9LAorICB7MHg3MCwgMHhmMCwgNCwgMSwgMCwgMSwgMH0sCisgIHsweDA4LCAweGZjLCA2LCAxLCAwLCAwLCAxfSwKKyAgezB4YjAsIDB4ZjAsIDQsIDEsIDAsIDAsIDB9LAorICB7MHgxMCwgMHhmOCwgNSwgMCwgMSwgMSwgMX0sCisgIHsweDBjLCAweGZjLCA2LCAwLCAxLCAxLCAwfSwKKyAgezB4NTAsIDB4ZjAsIDQsIDAsIDEsIDAsIDF9LAorICB7MHhhMCwgMHhmMCwgNCwgMCwgMSwgMCwgMH0sCisgIHsweDQwLCAweGYwLCA0LCAwLCAwLCAxLCAxfSwKKyAgezB4ODAsIDB4ZjAsIDQsIDAsIDAsIDEsIDB9LAorICB7MHg2MCwgMHhmMCwgNCwgMCwgMCwgMCwgMX0sCisgIHsweGMwLCAweGMwLCAyLCAwLCAwLCAwLCAwfQorfTsKKworLyoKKyAqIEJsb2NrIFRDT0VGIHRhYmxlIChjb2RlLCBtYXNrLCBuYml0cywgTEFTVCwgUlVOLCBMRVZFTCkKKyAqLworI2RlZmluZSBUQ09FRl9MRU4gMTAzCisjZGVmaW5lIFRDT0VGX1dJRCA2CitzdGF0aWMgY29uc3QgZ3VpbnQxNiB0Y29lZlsxMDNdWzZdID0geworICB7MHg4MDAwLCAweGMwMDAsIDMsIDAsIDAsIDF9LAorICB7MHhmMDAwLCAweGYwMDAsIDUsIDAsIDAsIDJ9LAorICB7MHg1NDAwLCAweGZjMDAsIDcsIDAsIDAsIDN9LAorICB7MHgyZTAwLCAweGZlMDAsIDgsIDAsIDAsIDR9LAorICB7MHgxZjAwLCAweGZmMDAsIDksIDAsIDAsIDV9LAorICB7MHgxMjgwLCAweGZmODAsIDEwLCAwLCAwLCA2fSwKKyAgezB4MTIwMCwgMHhmZjgwLCAxMCwgMCwgMCwgN30sCisgIHsweDA4NDAsIDB4ZmZjMCwgMTEsIDAsIDAsIDh9LAorICB7MHgwODAwLCAweGZmYzAsIDExLCAwLCAwLCA5fSwKKyAgezB4MDBlMCwgMHhmZmUwLCAxMiwgMCwgMCwgMTB9LCAgICAgICAvLzEwCisgIHsweDAwYzAsIDB4ZmZlMCwgMTIsIDAsIDAsIDExfSwKKyAgezB4MDQwMCwgMHhmZmUwLCAxMiwgMCwgMCwgMTJ9LAorICB7MHhjMDAwLCAweGUwMDAsIDQsIDAsIDEsIDF9LAorICB7MHg1MDAwLCAweGZjMDAsIDcsIDAsIDEsIDJ9LAorICB7MHgxZTAwLCAweGZmMDAsIDksIDAsIDEsIDN9LAorICB7MHgwM2MwLCAweGZmYzAsIDExLCAwLCAxLCA0fSwKKyAgezB4MDQyMCwgMHhmZmUwLCAxMiwgMCwgMSwgNX0sCisgIHsweDA1MDAsIDB4ZmZmMCwgMTMsIDAsIDEsIDZ9LAorICB7MHhlMDAwLCAweGYwMDAsIDUsIDAsIDIsIDF9LAorICB7MHgxZDAwLCAweGZmMDAsIDksIDAsIDIsIDJ9LCAvLzIwCisgIHsweDAzODAsIDB4ZmZjMCwgMTEsIDAsIDIsIDN9LAorICB7MHgwNTEwLCAweGZmZjAsIDEzLCAwLCAyLCA0fSwKKyAgezB4NjgwMCwgMHhmODAwLCA2LCAwLCAzLCAxfSwKKyAgezB4MTE4MCwgMHhmZjgwLCAxMCwgMCwgMywgMn0sCisgIHsweDAzNDAsIDB4ZmZjMCwgMTEsIDAsIDMsIDN9LAorICB7MHg2MDAwLCAweGY4MDAsIDYsIDAsIDQsIDF9LAorICB7MHgxMTAwLCAweGZmODAsIDEwLCAwLCA0LCAyfSwKKyAgezB4MDUyMCwgMHhmZmYwLCAxMywgMCwgNCwgM30sCisgIHsweDU4MDAsIDB4ZjgwMCwgNiwgMCwgNSwgMX0sCisgIHsweDAzMDAsIDB4ZmZjMCwgMTEsIDAsIDUsIDJ9LCAgICAgICAgLy8gMzAKKyAgezB4MDUzMCwgMHhmZmYwLCAxMywgMCwgNSwgM30sCisgIHsweDRjMDAsIDB4ZmMwMCwgNywgMCwgNiwgMX0sCisgIHsweDAyYzAsIDB4ZmZjMCwgMTEsIDAsIDYsIDJ9LAorICB7MHgwNTQwLCAweGZmZjAsIDEzLCAwLCA2LCAzfSwKKyAgezB4NDgwMCwgMHhmYzAwLCA3LCAwLCA3LCAxfSwKKyAgezB4MDI4MCwgMHhmZmMwLCAxMSwgMCwgNywgMn0sCisgIHsweDQ0MDAsIDB4ZmMwMCwgNywgMCwgOCwgMX0sCisgIHsweDAyNDAsIDB4ZmZjMCwgMTEsIDAsIDgsIDJ9LAorICB7MHg0MDAwLCAweGZjMDAsIDcsIDAsIDksIDF9LAorICB7MHgwMjAwLCAweGZmYzAsIDExLCAwLCA5LCAyfSwgICAgICAgIC8vIDQwCisgIHsweDJjMDAsIDB4ZmUwMCwgOCwgMCwgMTAsIDF9LAorICB7MHgwNTUwLCAweGZmZjAsIDEzLCAwLCAxMCwgMn0sCisgIHsweDJhMDAsIDB4ZmUwMCwgOCwgMCwgMTEsIDF9LAorICB7MHgyODAwLCAweGZlMDAsIDgsIDAsIDEyLCAxfSwKKyAgezB4MWMwMCwgMHhmZjAwLCA5LCAwLCAxMywgMX0sCisgIHsweDFiMDAsIDB4ZmYwMCwgOSwgMCwgMTQsIDF9LAorICB7MHgxMDgwLCAweGZmODAsIDEwLCAwLCAxNSwgMX0sCisgIHsweDEwMDAsIDB4ZmY4MCwgMTAsIDAsIDE2LCAxfSwKKyAgezB4MGY4MCwgMHhmZjgwLCAxMCwgMCwgMTcsIDF9LAorICB7MHgwZjAwLCAweGZmODAsIDEwLCAwLCAxOCwgMX0sICAgICAgIC8vIDUwCisgIHsweDBlODAsIDB4ZmY4MCwgMTAsIDAsIDE5LCAxfSwKKyAgezB4MGUwMCwgMHhmZjgwLCAxMCwgMCwgMjAsIDF9LAorICB7MHgwZDgwLCAweGZmODAsIDEwLCAwLCAyMSwgMX0sCisgIHsweDBkMDAsIDB4ZmY4MCwgMTAsIDAsIDIyLCAxfSwKKyAgezB4MDQ0MCwgMHhmZmUwLCAxMiwgMCwgMjMsIDF9LAorICB7MHgwNDYwLCAweGZmZTAsIDEyLCAwLCAyNCwgMX0sCisgIHsweDA1NjAsIDB4ZmZmMCwgMTMsIDAsIDI1LCAxfSwKKyAgezB4MDU3MCwgMHhmZmYwLCAxMywgMCwgMjYsIDF9LAorICB7MHg3MDAwLCAweGYwMDAsIDUsIDEsIDAsIDF9LAorICB7MHgwYzgwLCAweGZmODAsIDEwLCAxLCAwLCAyfSwgICAgICAgIC8vIDYwCisgIHsweDAwYTAsIDB4ZmZlMCwgMTIsIDEsIDAsIDN9LAorICB7MHgzYzAwLCAweGZjMDAsIDcsIDEsIDEsIDF9LAorICB7MHgwMDgwLCAweGZmZTAsIDEyLCAxLCAxLCAyfSwKKyAgezB4MzgwMCwgMHhmYzAwLCA3LCAxLCAyLCAxfSwKKyAgezB4MzQwMCwgMHhmYzAwLCA3LCAxLCAzLCAxfSwKKyAgezB4MzAwMCwgMHhmYzAwLCA3LCAxLCA0LCAxfSwKKyAgezB4MjYwMCwgMHhmZTAwLCA4LCAxLCA1LCAxfSwKKyAgezB4MjQwMCwgMHhmZTAwLCA4LCAxLCA2LCAxfSwKKyAgezB4MjIwMCwgMHhmZTAwLCA4LCAxLCA3LCAxfSwKKyAgezB4MjAwMCwgMHhmZTAwLCA4LCAxLCA4LCAxfSwgLy8gNzAKKyAgezB4MWEwMCwgMHhmZjAwLCA5LCAxLCA5LCAxfSwKKyAgezB4MTkwMCwgMHhmZjAwLCA5LCAxLCAxMCwgMX0sCisgIHsweDE4MDAsIDB4ZmYwMCwgOSwgMSwgMTEsIDF9LAorICB7MHgxNzAwLCAweGZmMDAsIDksIDEsIDEyLCAxfSwKKyAgezB4MTYwMCwgMHhmZjAwLCA5LCAxLCAxMywgMX0sCisgIHsweDE1MDAsIDB4ZmYwMCwgOSwgMSwgMTQsIDF9LAorICB7MHgxNDAwLCAweGZmMDAsIDksIDEsIDE1LCAxfSwKKyAgezB4MTMwMCwgMHhmZjAwLCA5LCAxLCAxNiwgMX0sCisgIHsweDBjMDAsIDB4ZmY4MCwgMTAsIDEsIDE3LCAxfSwKKyAgezB4MGI4MCwgMHhmZjgwLCAxMCwgMSwgMTgsIDF9LCAgICAgICAvLyA4MAorICB7MHgwYjAwLCAweGZmODAsIDEwLCAxLCAxOSwgMX0sCisgIHsweDBhODAsIDB4ZmY4MCwgMTAsIDEsIDIwLCAxfSwKKyAgezB4MGEwMCwgMHhmZjgwLCAxMCwgMSwgMjEsIDF9LAorICB7MHgwOTgwLCAweGZmODAsIDEwLCAxLCAyMiwgMX0sCisgIHsweDA5MDAsIDB4ZmY4MCwgMTAsIDEsIDIzLCAxfSwKKyAgezB4MDg4MCwgMHhmZjgwLCAxMCwgMSwgMjQsIDF9LAorICB7MHgwMWMwLCAweGZmYzAsIDExLCAxLCAyNSwgMX0sCisgIHsweDAxODAsIDB4ZmZjMCwgMTEsIDEsIDI2LCAxfSwKKyAgezB4MDE0MCwgMHhmZmMwLCAxMSwgMSwgMjcsIDF9LAorICB7MHgwMTAwLCAweGZmYzAsIDExLCAxLCAyOCwgMX0sICAgICAgIC8vIDkwCisgIHsweDA0ODAsIDB4ZmZlMCwgMTIsIDEsIDI5LCAxfSwKKyAgezB4MDRhMCwgMHhmZmUwLCAxMiwgMSwgMzAsIDF9LAorICB7MHgwNGMwLCAweGZmZTAsIDEyLCAxLCAzMSwgMX0sCisgIHsweDA0ZTAsIDB4ZmZlMCwgMTIsIDEsIDMyLCAxfSwKKyAgezB4MDU4MCwgMHhmZmYwLCAxMywgMSwgMzMsIDF9LAorICB7MHgwNTkwLCAweGZmZjAsIDEzLCAxLCAzNCwgMX0sCisgIHsweDA1YTAsIDB4ZmZmMCwgMTMsIDEsIDM1LCAxfSwKKyAgezB4MDViMCwgMHhmZmYwLCAxMywgMSwgMzYsIDF9LAorICB7MHgwNWMwLCAweGZmZjAsIDEzLCAxLCAzNywgMX0sCisgIHsweDA1ZDAsIDB4ZmZmMCwgMTMsIDEsIDM4LCAxfSwgICAgICAgLy8gMTAwCisgIHsweDA1ZTAsIDB4ZmZmMCwgMTMsIDEsIDM5LCAxfSwKKyAgezB4MDVmMCwgMHhmZmYwLCAxMywgMSwgNDAsIDF9LAorICB7MHgwNjAwLCAweGZlMDAsIDcsIDAsIDB4ZmZmZiwgMHhmZmZmfQorfTsKKworLyoKKyAqIE1vdGlvbiB2ZWN0b3IgY29kZSB0YWJsZSAoQ29kZSwgbWFzaywgbmJpdHMsIHZlY3RvciAoaGFsZnBpeGVsLCB0d28ncyBjb21wbGVtZW50KSwgZGlmZiAoaGFsZnBpeGVsLCB0d28ncyBjb21wbGVtZW50KSkKKyAqLworI2RlZmluZSBNVkRfTEVOIDY0CisjZGVmaW5lIE1WRF9XSUQgNQorc3RhdGljIGNvbnN0IGd1aW50MTYgbXZkWzY0XVs1XSA9IHsKKyAgezB4MDAyOCwgMHhmZmY4LCAxMywgMHgwMDYwLCAweDAwMjB9LAorICB7MHgwMDM4LCAweGZmZjgsIDEzLCAweDAwNjEsIDB4MDAyMX0sCisgIHsweDAwNTAsIDB4ZmZmMCwgMTIsIDB4MDA2MiwgMHgwMDIyfSwKKyAgezB4MDA3MCwgMHhmZmYwLCAxMiwgMHgwMDYzLCAweDAwMjN9LAorICB7MHgwMDkwLCAweGZmZjAsIDEyLCAweDAwNjQsIDB4MDAyNH0sCisgIHsweDAwYjAsIDB4ZmZmMCwgMTIsIDB4MDA2NSwgMHgwMDI1fSwKKyAgezB4MDBkMCwgMHhmZmYwLCAxMiwgMHgwMDY2LCAweDAwMjZ9LAorICB7MHgwMGYwLCAweGZmZjAsIDEyLCAweDAwNjcsIDB4MDAyN30sCisgIHsweDAxMjAsIDB4ZmZlMCwgMTEsIDB4MDA2OCwgMHgwMDI4fSwKKyAgezB4MDE2MCwgMHhmZmUwLCAxMSwgMHgwMDY5LCAweDAwMjl9LAorICB7MHgwMWEwLCAweGZmZTAsIDExLCAweDAwNmEsIDB4MDAyYX0sCisgIHsweDAxZTAsIDB4ZmZlMCwgMTEsIDB4MDA2YiwgMHgwMDJifSwKKyAgezB4MDIyMCwgMHhmZmUwLCAxMSwgMHgwMDZjLCAweDAwMmN9LAorICB7MHgwMjYwLCAweGZmZTAsIDExLCAweDAwNmQsIDB4MDAyZH0sCisgIHsweDAyYTAsIDB4ZmZlMCwgMTEsIDB4MDA2ZSwgMHgwMDJlfSwKKyAgezB4MDJlMCwgMHhmZmUwLCAxMSwgMHgwMDZmLCAweDAwMmZ9LAorICB7MHgwMzIwLCAweGZmZTAsIDExLCAweDAwNzAsIDB4MDAzMH0sCisgIHsweDAzNjAsIDB4ZmZlMCwgMTEsIDB4MDA3MSwgMHgwMDMxfSwKKyAgezB4MDNhMCwgMHhmZmUwLCAxMSwgMHgwMDcyLCAweDAwMzJ9LAorICB7MHgwM2UwLCAweGZmZTAsIDExLCAweDAwNzMsIDB4MDAzM30sCisgIHsweDA0MjAsIDB4ZmZlMCwgMTEsIDB4MDA3NCwgMHgwMDM0fSwKKyAgezB4MDQ2MCwgMHhmZmUwLCAxMSwgMHgwMDc1LCAweDAwMzV9LAorICB7MHgwNGMwLCAweGZmYzAsIDEwLCAweDAwNzYsIDB4MDAzNn0sCisgIHsweDA1NDAsIDB4ZmZjMCwgMTAsIDB4MDA3NywgMHgwMDM3fSwKKyAgezB4MDVjMCwgMHhmZmMwLCAxMCwgMHgwMDc4LCAweDAwMzh9LAorICB7MHgwNzAwLCAweGZmMDAsIDgsIDB4MDA3OSwgMHgwMDM5fSwKKyAgezB4MDkwMCwgMHhmZjAwLCA4LCAweDAwN2EsIDB4MDAzYX0sCisgIHsweDBiMDAsIDB4ZmYwMCwgOCwgMHgwMDdiLCAweDAwM2J9LAorICB7MHgwZTAwLCAweGZlMDAsIDcsIDB4MDA3YywgMHgwMDNjfSwKKyAgezB4MTgwMCwgMHhmODAwLCA1LCAweDAwN2QsIDB4MDAzZH0sCisgIHsweDMwMDAsIDB4ZjAwMCwgNCwgMHgwMDdlLCAweDAwM2V9LAorICB7MHg2MDAwLCAweGUwMDAsIDMsIDB4MDA3ZiwgMHgwMDNmfSwKKyAgezB4ODAwMCwgMHg4MDAwLCAxLCAweDAwMDAsIDB4MDAwMH0sCisgIHsweDQwMDAsIDB4ZTAwMCwgMywgMHgwMDAxLCAweDAwNDF9LAorICB7MHgyMDAwLCAweGYwMDAsIDQsIDB4MDAwMiwgMHgwMDQyfSwKKyAgezB4MTAwMCwgMHhmODAwLCA1LCAweDAwMDMsIDB4MDA0M30sCisgIHsweDBjMDAsIDB4ZmUwMCwgNywgMHgwMDA0LCAweDAwNDR9LAorICB7MHgwYTAwLCAweGZmMDAsIDgsIDB4MDAwNSwgMHgwMDQ1fSwKKyAgezB4MDgwMCwgMHhmZjAwLCA4LCAweDAwMDYsIDB4MDA0Nn0sCisgIHsweDA2MDAsIDB4ZmYwMCwgOCwgMHgwMDA3LCAweDAwNDd9LAorICB7MHgwNTgwLCAweGZmYzAsIDEwLCAweDAwMDgsIDB4MDA0OH0sCisgIHsweDA1MDAsIDB4ZmZjMCwgMTAsIDB4MDAwOSwgMHgwMDQ5fSwKKyAgezB4MDQ4MCwgMHhmZmMwLCAxMCwgMHgwMDBhLCAweDAwNGF9LAorICB7MHgwNDQwLCAweGZmZTAsIDExLCAweDAwMGIsIDB4MDA0Yn0sCisgIHsweDA0MDAsIDB4ZmZlMCwgMTEsIDB4MDAwYywgMHgwMDRjfSwKKyAgezB4MDNjMCwgMHhmZmUwLCAxMSwgMHgwMDBkLCAweDAwNGR9LAorICB7MHgwMzgwLCAweGZmZTAsIDExLCAweDAwMGUsIDB4MDA0ZX0sCisgIHsweDAzNDAsIDB4ZmZlMCwgMTEsIDB4MDAwZiwgMHgwMDRmfSwKKyAgezB4MDMwMCwgMHhmZmUwLCAxMSwgMHgwMDEwLCAweDAwNTB9LAorICB7MHgwMmMwLCAweGZmZTAsIDExLCAweDAwMTEsIDB4MDA1MX0sCisgIHsweDAyODAsIDB4ZmZlMCwgMTEsIDB4MDAxMiwgMHgwMDUyfSwKKyAgezB4MDI0MCwgMHhmZmUwLCAxMSwgMHgwMDEzLCAweDAwNTN9LAorICB7MHgwMjAwLCAweGZmZTAsIDExLCAweDAwMTQsIDB4MDA1NH0sCisgIHsweDAxYzAsIDB4ZmZlMCwgMTEsIDB4MDAxNSwgMHgwMDU1fSwKKyAgezB4MDE4MCwgMHhmZmUwLCAxMSwgMHgwMDE2LCAweDAwNTZ9LAorICB7MHgwMTQwLCAweGZmZTAsIDExLCAweDAwMTcsIDB4MDA1N30sCisgIHsweDAxMDAsIDB4ZmZlMCwgMTEsIDB4MDAxOCwgMHgwMDU4fSwKKyAgezB4MDBlMCwgMHhmZmYwLCAxMiwgMHgwMDE5LCAweDAwNTl9LAorICB7MHgwMGMwLCAweGZmZjAsIDEyLCAweDAwMWEsIDB4MDA1YX0sCisgIHsweDAwYTAsIDB4ZmZmMCwgMTIsIDB4MDAxYiwgMHgwMDVifSwKKyAgezB4MDA4MCwgMHhmZmYwLCAxMiwgMHgwMDFjLCAweDAwNWN9LAorICB7MHgwMDYwLCAweGZmZjAsIDEyLCAweDAwMWQsIDB4MDA1ZH0sCisgIHsweDAwNDAsIDB4ZmZmMCwgMTIsIDB4MDAxZSwgMHgwMDVlfSwKKyAgezB4MDAzMCwgMHhmZmY4LCAxMywgMHgwMDFmLCAweDAwNWZ9Cit9OworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBoMjYzcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBoMjYzcGF5X2RlYnVnKQorCisjZGVmaW5lIEdTVF9SVFBfSEVBREVSX0xFTiAxMgorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9NT0RFX0FfT05MWQorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2M19wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWgyNjMsICIKKyAgICAgICAgInZhcmlhbnQgPSAoc3RyaW5nKSBcIml0dVwiLCAiICJoMjYzdmVyc2lvbiA9IChzdHJpbmcpIFwiaDI2M1wiIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9oMjYzX3BheV9zcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9IMjYzX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkgyNjNcIjsgIgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJIMjYzXCIiKQorICAgICk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2M19wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9oMjYzX3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9oMjYzX3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2gyNjNfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfaDI2M19wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKgorICAgIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2M19wYXlfYm91bmRyeV9pbml0IChHc3RSdHBIMjYzUGF5Qm91bmRyeSAqIGJvdW5kcnksCisgICAgZ3VpbnQ4ICogc3RhcnQsIGd1aW50OCAqIGVuZCwgZ3VpbnQ4IHNiaXQsIGd1aW50OCBlYml0KTsKK3N0YXRpYyBHc3RSdHBIMjYzUGF5R29iICpnc3RfcnRwX2gyNjNfcGF5X2dvYl9uZXcgKEdzdFJ0cEgyNjNQYXlCb3VuZHJ5ICoKKyAgICBib3VuZHJ5LCBndWludCBnb2JuKTsKK3N0YXRpYyBHc3RSdHBIMjYzUGF5TUIgKmdzdF9ydHBfaDI2M19wYXlfbWJfbmV3IChHc3RSdHBIMjYzUGF5Qm91bmRyeSAqIGJvdW5kcnksCisgICAgZ3VpbnQgbWJhKTsKK3N0YXRpYyBHc3RSdHBIMjYzUGF5UGFja2FnZSAqZ3N0X3J0cF9oMjYzX3BheV9wYWNrYWdlX25ld19lbXB0eSAoKTsKK3N0YXRpYyBHc3RSdHBIMjYzUGF5UGFja2FnZSAqZ3N0X3J0cF9oMjYzX3BheV9wYWNrYWdlX25ldyAoZ3VpbnQ4ICogc3RhcnQsCisgICAgZ3VpbnQ4ICogZW5kLCBndWludCBsZW5ndGgsIGd1aW50OCBzYml0LCBndWludDggZWJpdCwgR3N0QnVmZmVyICogb3V0YnVmLAorICAgIGdib29sZWFuIG1hcmtlcik7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2M19wYXlfbWJfZGVzdHJveSAoR3N0UnRwSDI2M1BheU1CICogbWIpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9oMjYzX3BheV9nb2JfZGVzdHJveSAoR3N0UnRwSDI2M1BheUdvYiAqIGdvYiwgZ3VpbnQgaW5kKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2M19wYXlfY29udGV4dF9kZXN0cm95IChHc3RSdHBIMjYzUGF5Q29udGV4dCAqIGNvbnRleHQsCisgICAgZ3VpbnQgaW5kKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2M19wYXlfcGFja2FnZV9kZXN0cm95IChHc3RSdHBIMjYzUGF5UGFja2FnZSAqIHBhY2spOworCisjZGVmaW5lIGdzdF9ydHBfaDI2M19wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwSDI2M1BheSwgZ3N0X3J0cF9oMjYzX3BheSwgR1NUX1RZUEVfUlRQX0JBU0VfUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjNfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEgyNjNQYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9oMjYzX3BheV9maW5hbGl6ZTsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2gyNjNfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9oMjYzX3BheV9oYW5kbGVfYnVmZmVyOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX2gyNjNfcGF5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9oMjYzX3BheV9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfTU9ERV9BX09OTFksIGdfcGFyYW1fc3BlY19ib29sZWFuICgibW9kZWEtb25seSIsCisgICAgICAgICAgIkZyYWdtZW50IHBhY2tldHMgaW4gbW9kZSBBIE9ubHkiLAorICAgICAgICAgICJEaXNhYmxlIHBhY2tldGl6YXRpb24gbW9kZXMgQiBhbmQgQyIsIERFRkFVTFRfTU9ERV9BLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaDI2M19wYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9oMjYzX3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBIMjYzIHBhY2tldCBwYXlsb2FkZXIiLCAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkLWVuY29kZXMgSDI2MyB2aWRlbyBpbiBSVFAgcGFja2V0cyAoUkZDIDIxOTApIiwKKyAgICAgICJOZWlsIFN0cmF0Zm9yZCA8bmVpbHNAdmlwYWRpYS5jb20+IgorICAgICAgIkRlamFuIFNha2Vsc2FrIDxkZWphbi5zYWtlbHNha0BtYXJhbmQuc2k+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGgyNjNwYXlfZGVidWcsICJydHBoMjYzcGF5IiwgMCwKKyAgICAgICJIMjYzIFJUUCBQYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2M19wYXlfaW5pdCAoR3N0UnRwSDI2M1BheSAqIHJ0cGgyNjNwYXkpCit7CisgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX1BUIChydHBoMjYzcGF5KSA9IEdTVF9SVFBfUEFZTE9BRF9IMjYzOworICBydHBoMjYzcGF5LT5wcm9wX3BheWxvYWRfbW9kZSA9IERFRkFVTFRfTU9ERV9BOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYzX3BheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwSDI2M1BheSAqcnRwaDI2M3BheTsKKworICBydHBoMjYzcGF5ID0gR1NUX1JUUF9IMjYzX1BBWSAob2JqZWN0KTsKKworICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZydHBoMjYzcGF5LT5jdXJyZW50X2J1ZmZlciwgTlVMTCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2M19wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2NoYXIgKmZyYW1lc2l6ZSA9IE5VTEw7CisgIGdib29sZWFuIHJlczsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHMsICJ3aWR0aCIpICYmCisgICAgICBnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgImhlaWdodCIpKSB7CisgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJ3aWR0aCIsICZ3aWR0aCkgfHwgd2lkdGggPD0gMCkgeworICAgICAgZ290byBpbnZhbGlkX2RpbWVuc2lvbjsKKyAgICB9CisKKyAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImhlaWdodCIsICZoZWlnaHQpIHx8IGhlaWdodCA8PSAwKSB7CisgICAgICBnb3RvIGludmFsaWRfZGltZW5zaW9uOworICAgIH0KKworICAgIGZyYW1lc2l6ZSA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkLSVkIiwgd2lkdGgsIGhlaWdodCk7CisgIH0KKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocGF5bG9hZCwgInZpZGVvIiwKKyAgICAgIHBheWxvYWQtPnB0ICE9IEdTVF9SVFBfUEFZTE9BRF9IMjYzLCAiSDI2MyIsIDkwMDAwKTsKKworICBpZiAoZnJhbWVzaXplICE9IE5VTEwpIHsKKyAgICByZXMgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAocGF5bG9hZCwKKyAgICAgICAgImEtZnJhbWVzaXplIiwgR19UWVBFX1NUUklORywgZnJhbWVzaXplLCBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICByZXMgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAocGF5bG9hZCwgTlVMTCk7CisgIH0KKyAgZ19mcmVlIChmcmFtZXNpemUpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX2RpbWVuc2lvbjoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBheWxvYWQsICJJbnZhbGlkIHdpZHRoL2hlaWdodCBmcm9tIGNhcHMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2M19wYXlfY29udGV4dF9kZXN0cm95IChHc3RSdHBIMjYzUGF5Q29udGV4dCAqIGNvbnRleHQsIGd1aW50IGluZCkKK3sKKyAgaWYgKCFjb250ZXh0KQorICAgIHJldHVybjsKKworICBpZiAoY29udGV4dC0+Z29icykgeworICAgIGd1aW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZm9ybWF0X3Byb3BzW2luZF1bMF07IGkrKykgeworICAgICAgaWYgKGNvbnRleHQtPmdvYnNbaV0pIHsKKyAgICAgICAgZ3N0X3J0cF9oMjYzX3BheV9nb2JfZGVzdHJveSAoY29udGV4dC0+Z29ic1tpXSwgaW5kKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnX2ZyZWUgKGNvbnRleHQtPmdvYnMpOworICB9CisKKyAgZ19mcmVlIChjb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2M19wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cEgyNjNQYXkgKnJ0cGgyNjNwYXk7CisKKyAgcnRwaDI2M3BheSA9IEdTVF9SVFBfSDI2M19QQVkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01PREVfQV9PTkxZOgorICAgICAgcnRwaDI2M3BheS0+cHJvcF9wYXlsb2FkX21vZGUgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjNfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBIMjYzUGF5ICpydHBoMjYzcGF5OworCisgIHJ0cGgyNjNwYXkgPSBHU1RfUlRQX0gyNjNfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFX0FfT05MWToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBydHBoMjYzcGF5LT5wcm9wX3BheWxvYWRfbW9kZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RSdHBIMjYzUGF5UGFja2FnZSAqCitnc3RfcnRwX2gyNjNfcGF5X3BhY2thZ2VfbmV3X2VtcHR5ICh2b2lkKQoreworICByZXR1cm4gKEdzdFJ0cEgyNjNQYXlQYWNrYWdlICopIGdfbWFsbG9jMCAoc2l6ZW9mIChHc3RSdHBIMjYzUGF5UGFja2FnZSkpOworfQorCitzdGF0aWMgR3N0UnRwSDI2M1BheVBhY2thZ2UgKgorZ3N0X3J0cF9oMjYzX3BheV9wYWNrYWdlX25ldyAoZ3VpbnQ4ICogc3RhcnQsIGd1aW50OCAqIGVuZCwgZ3VpbnQgbGVuZ3RoLAorICAgIGd1aW50OCBzYml0LCBndWludDggZWJpdCwgR3N0QnVmZmVyICogb3V0YnVmLCBnYm9vbGVhbiBtYXJrZXIpCit7CisKKyAgR3N0UnRwSDI2M1BheVBhY2thZ2UgKnBhY2thZ2U7CisKKyAgcGFja2FnZSA9IGdzdF9ydHBfaDI2M19wYXlfcGFja2FnZV9uZXdfZW1wdHkgKCk7CisKKyAgcGFja2FnZS0+cGF5bG9hZF9zdGFydCA9IHN0YXJ0OworICBwYWNrYWdlLT5wYXlsb2FkX2VuZCA9IGVuZDsKKyAgcGFja2FnZS0+cGF5bG9hZF9sZW4gPSBsZW5ndGg7CisgIHBhY2thZ2UtPnNiaXQgPSBzYml0OworICBwYWNrYWdlLT5lYml0ID0gZWJpdDsKKyAgcGFja2FnZS0+b3V0YnVmID0gb3V0YnVmOworICBwYWNrYWdlLT5tYXJrZXIgPSBtYXJrZXI7CisKKyAgcmV0dXJuIHBhY2thZ2U7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjNfcGF5X3BhY2thZ2VfZGVzdHJveSAoR3N0UnRwSDI2M1BheVBhY2thZ2UgKiBwYWNrKQoreworICBpZiAocGFjaykKKyAgICBnX2ZyZWUgKHBhY2spOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYzX3BheV9ib3VuZHJ5X2luaXQgKEdzdFJ0cEgyNjNQYXlCb3VuZHJ5ICogYm91bmRyeSwKKyAgICBndWludDggKiBzdGFydCwgZ3VpbnQ4ICogZW5kLCBndWludDggc2JpdCwgZ3VpbnQ4IGViaXQpCit7CisgIGJvdW5kcnktPnN0YXJ0ID0gc3RhcnQ7CisgIGJvdW5kcnktPmVuZCA9IGVuZDsKKyAgYm91bmRyeS0+c2JpdCA9IHNiaXQ7CisgIGJvdW5kcnktPmViaXQgPSBlYml0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYzX3BheV9zcGxhdF9oZWFkZXJfQSAoZ3VpbnQ4ICogaGVhZGVyLAorICAgIEdzdFJ0cEgyNjNQYXlQYWNrYWdlICogcGFja2FnZSwgR3N0UnRwSDI2M1BheVBpYyAqIHBpY2xheWVyKQoreworCisgIEdzdFJ0cEgyNjNQYXlBSGVhZGVyICphX2hlYWRlcjsKKworICBhX2hlYWRlciA9IChHc3RSdHBIMjYzUGF5QUhlYWRlciAqKSBoZWFkZXI7CisKKyAgYV9oZWFkZXItPmYgPSAwOworICBhX2hlYWRlci0+cCA9IDA7CisgIGFfaGVhZGVyLT5zYml0ID0gcGFja2FnZS0+c2JpdDsKKyAgYV9oZWFkZXItPmViaXQgPSBwYWNrYWdlLT5lYml0OworICBhX2hlYWRlci0+c3JjID0gR1NUX0gyNjNfUElDVFVSRUxBWUVSX1BMU1JDIChwaWNsYXllcik7CisgIGFfaGVhZGVyLT5pID0gR1NUX0gyNjNfUElDVFVSRUxBWUVSX1BMVFlQRSAocGljbGF5ZXIpOworICBhX2hlYWRlci0+dSA9IEdTVF9IMjYzX1BJQ1RVUkVMQVlFUl9QTFVNViAocGljbGF5ZXIpOworICBhX2hlYWRlci0+cyA9IEdTVF9IMjYzX1BJQ1RVUkVMQVlFUl9QTFNBQyAocGljbGF5ZXIpOworICBhX2hlYWRlci0+YSA9IEdTVF9IMjYzX1BJQ1RVUkVMQVlFUl9QTEFQIChwaWNsYXllcik7CisgIGFfaGVhZGVyLT5yMSA9IDA7CisgIGFfaGVhZGVyLT5yMiA9IDA7CisgIGFfaGVhZGVyLT5kYnEgPSAwOworICBhX2hlYWRlci0+dHJiID0gMDsKKyAgYV9oZWFkZXItPnRyID0gMDsKKworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYzX3BheV9zcGxhdF9oZWFkZXJfQiAoZ3VpbnQ4ICogaGVhZGVyLAorICAgIEdzdFJ0cEgyNjNQYXlQYWNrYWdlICogcGFja2FnZSwgR3N0UnRwSDI2M1BheVBpYyAqIHBpY2xheWVyKQoreworCisgIEdzdFJ0cEgyNjNQYXlCSGVhZGVyICpiX2hlYWRlcjsKKworICBiX2hlYWRlciA9IChHc3RSdHBIMjYzUGF5QkhlYWRlciAqKSBoZWFkZXI7CisKKyAgYl9oZWFkZXItPmYgPSAxOworICBiX2hlYWRlci0+cCA9IDA7CisgIGJfaGVhZGVyLT5zYml0ID0gcGFja2FnZS0+c2JpdDsKKyAgYl9oZWFkZXItPmViaXQgPSBwYWNrYWdlLT5lYml0OworICBiX2hlYWRlci0+c3JjID0gR1NUX0gyNjNfUElDVFVSRUxBWUVSX1BMU1JDIChwaWNsYXllcik7CisgIGJfaGVhZGVyLT5xdWFudCA9IHBhY2thZ2UtPnF1YW50OworICBiX2hlYWRlci0+Z29ibiA9IHBhY2thZ2UtPmdvYm47CisgIGJfaGVhZGVyLT5tYmExID0gcGFja2FnZS0+bWJhID4+IDY7CisgIGJfaGVhZGVyLT5tYmEyID0gcGFja2FnZS0+bWJhICYgMHgwMDNmOworICBiX2hlYWRlci0+ciA9IDA7CisgIGJfaGVhZGVyLT5pID0gR1NUX0gyNjNfUElDVFVSRUxBWUVSX1BMVFlQRSAocGljbGF5ZXIpOworICBiX2hlYWRlci0+dSA9IEdTVF9IMjYzX1BJQ1RVUkVMQVlFUl9QTFVNViAocGljbGF5ZXIpOworICBiX2hlYWRlci0+cyA9IEdTVF9IMjYzX1BJQ1RVUkVMQVlFUl9QTFNBQyAocGljbGF5ZXIpOworICBiX2hlYWRlci0+YSA9IEdTVF9IMjYzX1BJQ1RVUkVMQVlFUl9QTEFQIChwaWNsYXllcik7CisKKyAgYl9oZWFkZXItPmhtdjExID0gMDsKKyAgYl9oZWFkZXItPmhtdjEyID0gMDsKKyAgYl9oZWFkZXItPnZtdjExID0gMDsKKyAgYl9oZWFkZXItPnZtdjEyID0gMDsKKyAgYl9oZWFkZXItPmhtdjIxID0gMDsKKyAgYl9oZWFkZXItPmhtdjIyID0gMDsKKyAgYl9oZWFkZXItPnZtdjIxID0gMDsKKworICBpZiAocGFja2FnZS0+bm12ZCA+IDApIHsKKyAgICAvL212ZFswXQorICAgIGJfaGVhZGVyLT5obXYxMSA9IChwYWNrYWdlLT5tdmRbMF0gJiAweDdmKSA+PiAzOworICAgIGJfaGVhZGVyLT5obXYxMiA9IChwYWNrYWdlLT5tdmRbMF0gJiAweDA3KTsKKyAgICAvL212ZFsxXQorICAgIGJfaGVhZGVyLT52bXYxMSA9IChwYWNrYWdlLT5tdmRbMV0gJiAweDA3ZikgPj4gMjsKKyAgICBiX2hlYWRlci0+dm12MTIgPSAocGFja2FnZS0+bXZkWzFdICYgMHgwMyk7CisKKyAgICBpZiAocGFja2FnZS0+bm12ZCA9PSA4KSB7CisgICAgICAvL212ZFs0XQorICAgICAgYl9oZWFkZXItPmhtdjIxID0gKHBhY2thZ2UtPm12ZFs0XSAmIDB4N2YpID4+IDE7CisgICAgICBiX2hlYWRlci0+aG12MjIgPSAocGFja2FnZS0+bXZkWzRdICYgMHgwMSk7CisgICAgICAvL212ZFs1XQorICAgICAgYl9oZWFkZXItPnZtdjIxID0gKHBhY2thZ2UtPm12ZFs1XSAmIDB4N2YpOworICAgIH0KKyAgfQorCit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjYzX3BheV9nb2JmaW5kZXIgKEdzdFJ0cEgyNjNQYXkgKiBydHBoMjYzcGF5LAorICAgIEdzdFJ0cEgyNjNQYXlCb3VuZHJ5ICogYm91bmRyeSkKK3sKKyAgZ3VpbnQ4ICpjdXJyZW50OworICBndWludCByYW5nZTsKKyAgZ3VpbnQgaTsKKworICBjdXJyZW50ID0gYm91bmRyeS0+ZW5kICsgMTsKKyAgcmFuZ2UgPSAocnRwaDI2M3BheS0+ZGF0YSAtIGN1cnJlbnQpICsgcnRwaDI2M3BheS0+YXZhaWxhYmxlX2RhdGE7CisKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgIlNlYXJjaGluZyBmb3IgbmV4dCBHT0IsIGRhdGE6JXAsIGxlbjoldSwgcGF5bG9hZF9sZW46JXAsIgorICAgICAgIiBjdXJyZW50OiVwLCByYW5nZToldSIsIHJ0cGgyNjNwYXktPmRhdGEsIHJ0cGgyNjNwYXktPmF2YWlsYWJsZV9kYXRhLAorICAgICAgYm91bmRyeS0+ZW5kICsgMSwgY3VycmVudCwgcmFuZ2UpOworCisgIC8qIElmIHdlIGFyZSBwYXN0IHRoZSBlbmQsIHN0b3AgKi8KKyAgaWYgKGN1cnJlbnQgPj0gcnRwaDI2M3BheS0+ZGF0YSArIHJ0cGgyNjNwYXktPmF2YWlsYWJsZV9kYXRhKQorICAgIHJldHVybiBGQUxTRTsKKworICBmb3IgKGkgPSAzOyBpIDwgcmFuZ2UgLSAzOyBpKyspIHsKKyAgICBpZiAoKGN1cnJlbnRbaV0gPT0gMHgwKSAmJgorICAgICAgICAoY3VycmVudFtpICsgMV0gPT0gMHgwKSAmJiAoY3VycmVudFtpICsgMl0gPj4gNyA9PSAweDEpKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2M3BheSwgIkdPQiBlbmQgZm91bmQgYXQ6ICVwIHN0YXJ0OiAlcCBsZW46ICV1IiwKKyAgICAgICAgICBjdXJyZW50ICsgaSAtIDEsIGJvdW5kcnktPmVuZCArIDEsCisgICAgICAgICAgKGd1aW50KSAoY3VycmVudCArIGkgLSBib3VuZHJ5LT5lbmQgKyAyKSk7CisgICAgICBnc3RfcnRwX2gyNjNfcGF5X2JvdW5kcnlfaW5pdCAoYm91bmRyeSwgYm91bmRyeS0+ZW5kICsgMSwgY3VycmVudCArIGkgLSAxLAorICAgICAgICAgIDAsIDApOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgIkNvdWxkbid0IGZpbmQgYW55IG5ldyBHQlNDIGluIHRoaXMgZnJhbWUsIHJhbmdlOiV1IiwgcmFuZ2UpOworCisgIGdzdF9ydHBfaDI2M19wYXlfYm91bmRyeV9pbml0IChib3VuZHJ5LCBib3VuZHJ5LT5lbmQgKyAxLAorICAgICAgKGd1aW50OCAqKSAocnRwaDI2M3BheS0+ZGF0YSArIHJ0cGgyNjNwYXktPmF2YWlsYWJsZV9kYXRhIC0gMSksIDAsIDApOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0UnRwSDI2M1BheUdvYiAqCitnc3RfcnRwX2gyNjNfcGF5X2dvYl9uZXcgKEdzdFJ0cEgyNjNQYXlCb3VuZHJ5ICogYm91bmRyeSwgZ3VpbnQgZ29ibikKK3sKKyAgR3N0UnRwSDI2M1BheUdvYiAqZ29iOworCisgIGdvYiA9IChHc3RSdHBIMjYzUGF5R29iICopIGdfbWFsbG9jMCAoc2l6ZW9mIChHc3RSdHBIMjYzUGF5R29iKSk7CisKKyAgZ29iLT5zdGFydCA9IGJvdW5kcnktPnN0YXJ0OworICBnb2ItPmVuZCA9IGJvdW5kcnktPmVuZDsKKyAgZ29iLT5sZW5ndGggPSBib3VuZHJ5LT5lbmQgLSBib3VuZHJ5LT5zdGFydCArIDE7CisgIGdvYi0+ZWJpdCA9IGJvdW5kcnktPmViaXQ7CisgIGdvYi0+c2JpdCA9IGJvdW5kcnktPnNiaXQ7CisgIGdvYi0+Z29ibiA9IGdvYm47CisgIGdvYi0+cXVhbnQgPSAwOworICBnb2ItPm1hY3JvYmxvY2tzID0gTlVMTDsKKyAgZ29iLT5ubWFjcm9ibG9jcyA9IDA7CisKKyAgcmV0dXJuIGdvYjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2M19wYXlfZ29iX2Rlc3Ryb3kgKEdzdFJ0cEgyNjNQYXlHb2IgKiBnb2IsIGd1aW50IGluZCkKK3sKKworICBpZiAoIWdvYikKKyAgICByZXR1cm47CisKKyAgaWYgKGdvYi0+bWFjcm9ibG9ja3MpIHsKKworICAgIGd1aW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ29iLT5ubWFjcm9ibG9jczsgaSsrKSB7CisgICAgICBnc3RfcnRwX2gyNjNfcGF5X21iX2Rlc3Ryb3kgKGdvYi0+bWFjcm9ibG9ja3NbaV0pOworICAgIH0KKworICAgIGdfZnJlZSAoZ29iLT5tYWNyb2Jsb2Nrcyk7CisgIH0KKworICBnX2ZyZWUgKGdvYik7Cit9CisKKy8qCisgKiBkZWNvZGUgTUNCUEMgZm9yIEkgZnJhbWVzIGFuZCByZXR1cm4gaW5kZXggaW4gdGFibGUgb3IgLTEgaWYgbm90IGZvdW5kCisgKi8KK3N0YXRpYyBnaW50Citnc3RfcnRwX2gyNjNfcGF5X2RlY29kZV9tY2JwY19JIChHc3RSdHBIMjYzUGF5ICogcnRwaDI2M3BheSwgZ3VpbnQzMiB2YWx1ZSkKK3sKKworICBnaW50IGk7CisgIGd1aW50MTYgY29kZTsKKworICBjb2RlID0gdmFsdWUgPj4gMTY7CisKKyAgR1NUX1RSQUNFX09CSkVDVCAocnRwaDI2M3BheSwgInZhbHVlOjB4JTA4eCwgY29kZToweCUwNHgiLCB2YWx1ZSwgY29kZSk7CisKKyAgZm9yIChpID0gMDsgaSA8IE1DQlBDX0lfTEVOOyBpKyspIHsKKyAgICBpZiAoKGNvZGUgJiBtY2JwY19JW2ldWzFdKSA9PSBtY2JwY19JW2ldWzBdKSB7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KKworICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJDb3VsZG4ndCBmaW5kIGNvZGUsIHJldHVybmluZyAtMSIpOworCisgIHJldHVybiAtMTsKK30KKworLyoKKyAqIGRlY29kZSBNQ0JQQyBmb3IgUCBmcmFtZXMgYW5kIHJldHVybiBpbmRleCBpbiB0YWJsZSBvciAtMSBpZiBub3QgZm91bmQKKyAqLworc3RhdGljIGdpbnQKK2dzdF9ydHBfaDI2M19wYXlfZGVjb2RlX21jYnBjX1AgKEdzdFJ0cEgyNjNQYXkgKiBydHBoMjYzcGF5LCBndWludDMyIHZhbHVlKQoreworCisgIGdpbnQgaTsKKyAgZ3VpbnQxNiBjb2RlOworCisgIGNvZGUgPSB2YWx1ZSA+PiAxNjsKKworICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAidmFsdWU6MHglMDh4LCBjb2RlOjB4JTA0eCIsIHZhbHVlLCBjb2RlKTsKKworICBmb3IgKGkgPSAwOyBpIDwgTUNCUENfUF9MRU47IGkrKykgeworICAgIGlmICgoY29kZSAmIG1jYnBjX1BbaV1bMV0pID09IG1jYnBjX1BbaV1bMF0pIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgfQorCisgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwaDI2M3BheSwgIkNvdWxkbid0IGZpbmQgY29kZSwgcmV0dXJuaW5nIC0xIik7CisKKyAgcmV0dXJuIC0xOworfQorCisvKgorICogZGVjb2RlIENCUFkgYW5kIHJldHVybiBpbmRleCBpbiB0YWJsZSBvciAtMSBpZiBub3QgZm91bmQKKyAqLworc3RhdGljIGdpbnQKK2dzdF9ydHBfaDI2M19wYXlfZGVjb2RlX2NicHkgKEdzdFJ0cEgyNjNQYXkgKiBydHBoMjYzcGF5LCBndWludDMyIHZhbHVlLAorICAgIGNvbnN0IGd1aW50OCBjYnB5X3RhYmxlWzE2XVs3XSkKK3sKKworICBnaW50IGk7CisgIGd1aW50OCBjb2RlOworCisgIGNvZGUgPSB2YWx1ZSA+PiAyNDsKKworICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAidmFsdWU6MHglMDh4LCBjb2RlOjB4JTA0eCIsIHZhbHVlLCBjb2RlKTsKKworICBmb3IgKGkgPSAwOyBpIDwgQ0JQWV9MRU47IGkrKykgeworICAgIGlmICgoY29kZSAmIGNicHlfdGFibGVbaV1bMV0pID09IGNicHlfdGFibGVbaV1bMF0pIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgfQorCisgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwaDI2M3BheSwgIkNvdWxkbid0IGZpbmQgY29kZSwgcmV0dXJuaW5nIC0xIik7CisKKyAgcmV0dXJuIC0xOworfQorCisvKgorICogZGVjb2RlIE1WRCBhbmQgcmV0dXJuIGluZGV4IGluIHRhYmxlIG9yIC0xIGlmIG5vdCBmb3VuZAorICovCitzdGF0aWMgZ2ludAorZ3N0X3J0cF9oMjYzX3BheV9kZWNvZGVfbXZkIChHc3RSdHBIMjYzUGF5ICogcnRwaDI2M3BheSwgZ3VpbnQzMiB2YWx1ZSkKK3sKKworICBnaW50IGk7CisgIGd1aW50MTYgY29kZTsKKworICBjb2RlID0gdmFsdWUgPj4gMTY7CisKKyAgR1NUX1RSQUNFX09CSkVDVCAocnRwaDI2M3BheSwgInZhbHVlOjB4JTA4eCwgY29kZToweCUwNHgiLCB2YWx1ZSwgY29kZSk7CisKKyAgZm9yIChpID0gMDsgaSA8IE1WRF9MRU47IGkrKykgeworICAgIGlmICgoY29kZSAmIG12ZFtpXVsxXSkgPT0gbXZkW2ldWzBdKSB7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KKworICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJDb3VsZG4ndCBmaW5kIGNvZGUsIHJldHVybmluZyAtMSIpOworCisgIHJldHVybiAtMTsKK30KKworLyoKKyAqIGRlY29kZSBUQ09FRiBhbmQgcmV0dXJuIGluZGV4IGluIHRhYmxlIG9yIC0xIGlmIG5vdCBmb3VuZAorICovCitzdGF0aWMgZ2ludAorZ3N0X3J0cF9oMjYzX3BheV9kZWNvZGVfdGNvZWYgKEdzdFJ0cEgyNjNQYXkgKiBydHBoMjYzcGF5LCBndWludDMyIHZhbHVlKQoreworCisgIGdpbnQgaTsKKyAgZ3VpbnQxNiBjb2RlOworCisgIGNvZGUgPSB2YWx1ZSA+PiAxNjsKKworICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAidmFsdWU6MHglMDh4LCBjb2RlOjB4JTA0eCIsIHZhbHVlLCBjb2RlKTsKKworICBmb3IgKGkgPSAwOyBpIDwgVENPRUZfTEVOOyBpKyspIHsKKyAgICBpZiAoKGNvZGUgJiB0Y29lZltpXVsxXSkgPT0gdGNvZWZbaV1bMF0pIHsKKyAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJ0Y29lZiBpcyAlZCIsIGkpOworICAgICAgcmV0dXJuIGk7CisgICAgfQorICB9CisKKyAgR1NUX1dBUk5JTkdfT0JKRUNUIChydHBoMjYzcGF5LCAiQ291bGRuJ3QgZmluZCBjb2RlLCByZXR1cm5pbmcgLTEiKTsKKworICByZXR1cm4gLTE7Cit9CisKKy8qCisgKiB0aGUgMzItYml0IHJlZ2lzdGVyIGlzIGxpa2UgYSB3aW5kb3cgdGhhdCB3ZSBtb3ZlIHJpZ2h0IGZvciAibW92ZV9iaXRzIiB0byBnZXQgdGhlIG5leHQgdiAiZGF0YSIgaDI2MyBmaWVsZAorICogInJlc3RfYml0cyIgdGVsbHMgaG93IG1hbnkgYml0cyBpbiB0aGUgImRhdGEiIGJ5dGUgYWRkcmVzcyBhcmUgc3RpbGwgbm90IHVzZWQKKyAqLworCitzdGF0aWMgZ2ludAorZ3N0X3J0cF9oMjYzX3BheV9tb3ZlX3dpbmRvd19yaWdodCAoR3N0UnRwSDI2M1BheSAqIHJ0cGgyNjNwYXksCisgICAgR3N0UnRwSDI2M1BheUNvbnRleHQgKiBjb250ZXh0LCBndWludCBuLCBndWludCByZXN0X2JpdHMsCisgICAgZ3VpbnQ4ICoqIG9yaWdfZGF0YSwgZ3VpbnQ4ICoqIGRhdGFfZW5kKQoreworCisgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksCisgICAgICAiTW92aW5nIHdpbmRvdzogMHglMDh4IGZyb206ICVwIGZvciAlZCBiaXRzLCByZXN0X2JpdHM6ICVkLCBkYXRhX2VuZCAlcCIsCisgICAgICBjb250ZXh0LT53aW5kb3csIGNvbnRleHQtPndpbl9lbmQsIG4sIHJlc3RfYml0cywgKmRhdGFfZW5kKTsKKworICBpZiAobiA9PSAwKQorICAgIHJldHVybiByZXN0X2JpdHM7CisKKyAgd2hpbGUgKG4gIT0gMCB8fCBjb250ZXh0LT53aW5fZW5kID09ICgoKmRhdGFfZW5kKSArIDEpKSB7CisgICAgZ3VpbnQ4IGIgPSBjb250ZXh0LT53aW5fZW5kIDw9ICpkYXRhX2VuZCA/ICpjb250ZXh0LT53aW5fZW5kIDogMDsKKyAgICBpZiAocmVzdF9iaXRzID09IDApIHsKKyAgICAgIGlmIChuID4gOCkgeworICAgICAgICBjb250ZXh0LT53aW5kb3cgPSAoY29udGV4dC0+d2luZG93IDw8IDgpIHwgYjsKKyAgICAgICAgbiAtPSA4OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29udGV4dC0+d2luZG93ID0gKGNvbnRleHQtPndpbmRvdyA8PCBuKSB8IChiID4+ICg4IC0gbikpOworICAgICAgICByZXN0X2JpdHMgPSA4IC0gbjsKKyAgICAgICAgaWYgKHJlc3RfYml0cyA9PSAwKQorICAgICAgICAgIGNvbnRleHQtPndpbl9lbmQrKzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChuID4gcmVzdF9iaXRzKSB7CisgICAgICAgIGNvbnRleHQtPndpbmRvdyA9IChjb250ZXh0LT53aW5kb3cgPDwgcmVzdF9iaXRzKSB8CisgICAgICAgICAgICAoYiAmICgoKGd1aW50KSBwb3cgKDIuMCwgKGRvdWJsZSkgcmVzdF9iaXRzKSkgLSAxKSk7CisgICAgICAgIG4gLT0gcmVzdF9iaXRzOworICAgICAgICByZXN0X2JpdHMgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29udGV4dC0+d2luZG93ID0gKGNvbnRleHQtPndpbmRvdyA8PCBuKSB8CisgICAgICAgICAgICAoKGIgJiAoKChndWludCkgcG93ICgyLjAsIChkb3VibGUpIHJlc3RfYml0cykpIC0gMSkpID4+CisgICAgICAgICAgICAocmVzdF9iaXRzIC0gbikpOworICAgICAgICByZXN0X2JpdHMgLT0gbjsKKyAgICAgICAgaWYgKHJlc3RfYml0cyA9PSAwKQorICAgICAgICAgIGNvbnRleHQtPndpbl9lbmQrKzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgY29udGV4dC0+d2luX2VuZCsrOworICB9CisKKyAgKm9yaWdfZGF0YSA9IGNvbnRleHQtPndpbl9lbmQgLSA0OworCisgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksCisgICAgICAiV2luZG93IG1vdmVkIHRvICVwIHdpdGggdmFsdWU6IDB4JTA4eCBhbmQgb3JpZ19kYXRhOiAlcCByZXN0X2JpdHM6ICVkIiwKKyAgICAgIGNvbnRleHQtPndpbl9lbmQsIGNvbnRleHQtPndpbmRvdywgKm9yaWdfZGF0YSwgcmVzdF9iaXRzKTsKKyAgcmV0dXJuIHJlc3RfYml0czsKK30KKworLyoKKyAqIEZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IE1CIChlbmQgb2YgdGhlIGN1cnJlbnQgTUIpCisgKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgZXhjZXNzIGJpdHMgYW5kIHN0b3JlcyB0aGUgZW5kIG9mIHRoZSBNQiBpbiBlbmQKKyAqIGRhdGEgbXVzdCBiZSBwbGFjZWQgb24gZmlyc3QgTUIgYnl0ZQorICovCitzdGF0aWMgR3N0UnRwSDI2M1BheU1CICoKK2dzdF9ydHBfaDI2M19wYXlfQl9tYmZpbmRlciAoR3N0UnRwSDI2M1BheSAqIHJ0cGgyNjNwYXksCisgICAgR3N0UnRwSDI2M1BheUNvbnRleHQgKiBjb250ZXh0LCBHc3RSdHBIMjYzUGF5R29iICogZ29iLAorICAgIEdzdFJ0cEgyNjNQYXlNQiAqIG1hY3JvYmxvY2ssIGd1aW50IG1iYSkKK3sKKyAgZ3VpbnQgbWJfdHlwZV9pbmRleDsKKyAgZ3VpbnQgY2JweV90eXBlX2luZGV4OworICBndWludCB0Y29lZl90eXBlX2luZGV4OworICBHc3RSdHBIMjYzUGF5TUIgKm1hYzsKKyAgR3N0UnRwSDI2M1BheUJvdW5kcnkgYm91bmRyeTsKKworICBnc3RfcnRwX2gyNjNfcGF5X2JvdW5kcnlfaW5pdCAoJmJvdW5kcnksIG1hY3JvYmxvY2stPmVuZCwKKyAgICAgIG1hY3JvYmxvY2stPmVuZCwgOCAtIG1hY3JvYmxvY2stPmViaXQsIG1hY3JvYmxvY2stPmViaXQpOworICBtYWMgPSBnc3RfcnRwX2gyNjNfcGF5X21iX25ldyAoJmJvdW5kcnksIG1iYSk7CisKKyAgaWYgKG1hYy0+c2JpdCA9PSA4KSB7CisgICAgbWFjLT5zdGFydCsrOworLy8gICAgIG1hYy0+ZW5kKys7CisgICAgbWFjLT5zYml0ID0gMDsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgImN1cnJlbnRfcG9zOiVwLCBlbmQ6JXAsIHJlc3RfYml0czolZCwgd2luZG93OjB4JTA4eCIsIG1hYy0+c3RhcnQsCisgICAgICBtYWMtPmVuZCwgbWFjcm9ibG9jay0+ZWJpdCwgY29udGV4dC0+d2luZG93KTsKKworICBpZiAoY29udGV4dC0+cGljbGF5ZXItPnB0eXBlX3BpY3R5cGUgPT0gMCkgeworICAgIC8vV2UgaGF2ZSBhbiBJIGZyYW1lCisgICAgZ2ludCBpOworICAgIGd1aW50IGxhc3Q7CisgICAgZ3VpbnQgaW5kOworCisgICAgLy9TdGVwIDIgZGVjb2RlIE1DQlBDIEkKKyAgICBtYl90eXBlX2luZGV4ID0KKyAgICAgICAgZ3N0X3J0cF9oMjYzX3BheV9kZWNvZGVfbWNicGNfSSAocnRwaDI2M3BheSwgY29udGV4dC0+d2luZG93KTsKKworICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJNQ0JQQyBpbmRleDogJWQiLCBtYl90eXBlX2luZGV4KTsKKyAgICBpZiAobWJfdHlwZV9pbmRleCA9PSAtMSkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwaDI2M3BheSwgIk1CIGluZGV4IHNob3VsZG4ndCBiZSAtMSBpbiB3aW5kb3c6ICUwOHgiLAorICAgICAgICAgIGNvbnRleHQtPndpbmRvdyk7CisgICAgICBnb3RvIGJlYWNoOworICAgIH0KKworICAgIG1hYy0+ZWJpdCA9CisgICAgICAgIGdzdF9ydHBfaDI2M19wYXlfbW92ZV93aW5kb3dfcmlnaHQgKHJ0cGgyNjNwYXksIGNvbnRleHQsCisgICAgICAgIG1jYnBjX0lbbWJfdHlwZV9pbmRleF1bMl0sIG1hYy0+ZWJpdCwgJm1hYy0+ZW5kLCAmZ29iLT5lbmQpOworCisgICAgbWFjLT5tYl90eXBlID0gbWNicGNfSVttYl90eXBlX2luZGV4XVs1XTsKKworICAgIGlmIChtYl90eXBlX2luZGV4ID09IDgpIHsKKyAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJTdHVmZmluZyBza2lwcGluZyByZXN0IG9mIE1CIGhlYWRlciIpOworICAgICAgcmV0dXJuIG1hYzsKKyAgICB9CisgICAgLy9TdGVwIDMgZGVjb2RlIENCUFkgSQorICAgIGNicHlfdHlwZV9pbmRleCA9CisgICAgICAgIGdzdF9ydHBfaDI2M19wYXlfZGVjb2RlX2NicHkgKHJ0cGgyNjNwYXksIGNvbnRleHQtPndpbmRvdywgY2JweV9JKTsKKworICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJDQlBZIGluZGV4OiAlZCIsIGNicHlfdHlwZV9pbmRleCk7CisgICAgaWYgKGNicHlfdHlwZV9pbmRleCA9PSAtMSkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwaDI2M3BheSwKKyAgICAgICAgICAiQ0JQWSBpbmRleCBzaG91bGRuJ3QgYmUgLTEgaW4gd2luZG93OiAlMDh4IiwgY29udGV4dC0+d2luZG93KTsKKyAgICAgIGdvdG8gYmVhY2g7CisgICAgfQorCisgICAgbWFjLT5lYml0ID0KKyAgICAgICAgZ3N0X3J0cF9oMjYzX3BheV9tb3ZlX3dpbmRvd19yaWdodCAocnRwaDI2M3BheSwgY29udGV4dCwKKyAgICAgICAgY2JweV9JW2NicHlfdHlwZV9pbmRleF1bMl0sIG1hYy0+ZWJpdCwgJm1hYy0+ZW5kLCAmZ29iLT5lbmQpOworCisgICAgLy9TdGVwIDQgZGVjb2RlIHJlc3Qgb2YgTUIKKyAgICAvL01CIHR5cGUgMSBhbmQgNCBoYXZlIERRVUFOVCAtIHdlIHN0b3JlIGl0IGZvciBwYWNrYWdpbmcgcHVycG9zZXMKKyAgICBpZiAobWNicGNfSVttYl90eXBlX2luZGV4XVs1XSA9PSA0KSB7CisgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAiU2hpZnRpbmcgRFFVQU5UIik7CisKKyAgICAgIG1hYy0+cXVhbnQgPSAoY29udGV4dC0+d2luZG93ID4+IDMwKTsKKworICAgICAgbWFjLT5lYml0ID0KKyAgICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X21vdmVfd2luZG93X3JpZ2h0IChydHBoMjYzcGF5LCBjb250ZXh0LCAyLCBtYWMtPmViaXQsCisgICAgICAgICAgJm1hYy0+ZW5kLCAmZ29iLT5lbmQpOworICAgIH0KKyAgICAvL1N0ZXAgNSBnbyB0cm91Z2ggdGhlIGJsb2NrcyAtIGRlY29kZSBEQyBhbmQgVENPRUYKKyAgICBsYXN0ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTl9CTE9DS1M7IGkrKykgeworCisgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAiRGVjb2RpbmcgSU5UUkFEQyBhbmQgVENPRUYsIGk6JWQiLCBpKTsKKyAgICAgIG1hYy0+ZWJpdCA9CisgICAgICAgICAgZ3N0X3J0cF9oMjYzX3BheV9tb3ZlX3dpbmRvd19yaWdodCAocnRwaDI2M3BheSwgY29udGV4dCwgOCwgbWFjLT5lYml0LAorICAgICAgICAgICZtYWMtPmVuZCwgJmdvYi0+ZW5kKTsKKworICAgICAgaWYgKGkgPiAzKSB7CisgICAgICAgIGluZCA9IG1jYnBjX0lbbWJfdHlwZV9pbmRleF1baSAtIDFdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kID0gY2JweV9JW2NicHlfdHlwZV9pbmRleF1baSArIDNdOworICAgICAgfQorCisgICAgICBpZiAoaW5kID09IDEpIHsKKyAgICAgICAgd2hpbGUgKGxhc3QgPT0gMCkgeworICAgICAgICAgIHRjb2VmX3R5cGVfaW5kZXggPQorICAgICAgICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X2RlY29kZV90Y29lZiAocnRwaDI2M3BheSwgY29udGV4dC0+d2luZG93KTsKKworICAgICAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJUQ09FRiBpbmRleDogJWQiLCB0Y29lZl90eXBlX2luZGV4KTsKKyAgICAgICAgICBpZiAodGNvZWZfdHlwZV9pbmRleCA9PSAtMSkgeworICAgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwaDI2M3BheSwKKyAgICAgICAgICAgICAgICAiVENPRUYgaW5kZXggc2hvdWxkbid0IGJlIC0xIGluIHdpbmRvdzogJTA4eCIsIGNvbnRleHQtPndpbmRvdyk7CisgICAgICAgICAgICBnb3RvIGJlYWNoOworICAgICAgICAgIH0KKyAgICAgICAgICBtYWMtPmViaXQgPQorICAgICAgICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X21vdmVfd2luZG93X3JpZ2h0IChydHBoMjYzcGF5LCBjb250ZXh0LAorICAgICAgICAgICAgICB0Y29lZlt0Y29lZl90eXBlX2luZGV4XVsyXSwgbWFjLT5lYml0LCAmbWFjLT5lbmQsICZnb2ItPmVuZCk7CisKKyAgICAgICAgICBsYXN0ID0gdGNvZWZbdGNvZWZfdHlwZV9pbmRleF1bM107CisgICAgICAgICAgaWYgKHRjb2VmX3R5cGVfaW5kZXggPT0gMTAyKSB7CisgICAgICAgICAgICBpZiAoKGNvbnRleHQtPndpbmRvdyAmIDB4ODAwMDAwMDApID09IDB4ODAwMDAwMDApCisgICAgICAgICAgICAgIGxhc3QgPSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBsYXN0ID0gMDsKKworICAgICAgICAgICAgbWFjLT5lYml0ID0KKyAgICAgICAgICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X21vdmVfd2luZG93X3JpZ2h0IChydHBoMjYzcGF5LCBjb250ZXh0LCAxNSwKKyAgICAgICAgICAgICAgICBtYWMtPmViaXQsICZtYWMtPmVuZCwgJmdvYi0+ZW5kKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbGFzdCA9IDA7CisgICAgICB9CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgLy9XZSBoYXZlIGEgUCBmcmFtZQorICAgIGd1aW50IGk7CisgICAgZ3VpbnQgbGFzdDsKKyAgICBndWludCBpbmQ7CisKKyAgICAvL1N0ZXAgMSBjaGVjayBDT0QKKyAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAiQ2hlY2tpbmcgZm9yIENPRCIpOworICAgIGlmICgoY29udGV4dC0+d2luZG93ICYgMHg4MDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkgeworICAgICAgLy9UaGUgTUIgaXMgbm90IGNvZGVkCisgICAgICBtYWMtPmViaXQgPQorICAgICAgICAgIGdzdF9ydHBfaDI2M19wYXlfbW92ZV93aW5kb3dfcmlnaHQgKHJ0cGgyNjNwYXksIGNvbnRleHQsIDEsIG1hYy0+ZWJpdCwKKyAgICAgICAgICAmbWFjLT5lbmQsICZnb2ItPmVuZCk7CisgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAiQ09PT09PT09PT09PRCA9IDEiKTsKKworICAgICAgcmV0dXJuIG1hYzsKKyAgICB9IGVsc2UgeworICAgICAgLy9UaGUgTUIgaXMgY29kZWQKKyAgICAgIG1hYy0+ZWJpdCA9CisgICAgICAgICAgZ3N0X3J0cF9oMjYzX3BheV9tb3ZlX3dpbmRvd19yaWdodCAocnRwaDI2M3BheSwgY29udGV4dCwgMSwgbWFjLT5lYml0LAorICAgICAgICAgICZtYWMtPmVuZCwgJmdvYi0+ZW5kKTsKKyAgICB9CisKKyAgICAvL1N0ZXAgMiBkZWNvZGUgTUNCUEMgUAorICAgIG1iX3R5cGVfaW5kZXggPQorICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X2RlY29kZV9tY2JwY19QIChydHBoMjYzcGF5LCBjb250ZXh0LT53aW5kb3cpOworCisgICAgR1NUX1RSQUNFX09CSkVDVCAocnRwaDI2M3BheSwgIk1DQlBDIGluZGV4OiAlZCIsIG1iX3R5cGVfaW5kZXgpOworICAgIGlmIChtYl90eXBlX2luZGV4ID09IC0xKSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChydHBoMjYzcGF5LCAiTUIgaW5kZXggc2hvdWxkbid0IGJlIC0xIGluIHdpbmRvdzogJTA4eCIsCisgICAgICAgICAgY29udGV4dC0+d2luZG93KTsKKyAgICAgIGdvdG8gYmVhY2g7CisgICAgfQorICAgIG1hYy0+ZWJpdCA9CisgICAgICAgIGdzdF9ydHBfaDI2M19wYXlfbW92ZV93aW5kb3dfcmlnaHQgKHJ0cGgyNjNwYXksIGNvbnRleHQsCisgICAgICAgIG1jYnBjX1BbbWJfdHlwZV9pbmRleF1bMl0sIG1hYy0+ZWJpdCwgJm1hYy0+ZW5kLCAmZ29iLT5lbmQpOworCisgICAgbWFjLT5tYl90eXBlID0gbWNicGNfUFttYl90eXBlX2luZGV4XVs1XTsKKworICAgIGlmIChtYl90eXBlX2luZGV4ID09IDIwKSB7CisgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAiU3R1ZmZpbmcgc2tpcHBpbmcgcmVzdCBvZiBNQiBoZWFkZXIiKTsKKyAgICAgIHJldHVybiBtYWM7CisgICAgfQorICAgIC8vU3RlcCAzIGRlY29kZSBDQlBZIFAKKyAgICBjYnB5X3R5cGVfaW5kZXggPQorICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X2RlY29kZV9jYnB5IChydHBoMjYzcGF5LCBjb250ZXh0LT53aW5kb3csIGNicHlfUCk7CisKKyAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAiQ0JQWSBpbmRleDogJWQiLCBjYnB5X3R5cGVfaW5kZXgpOworICAgIGlmIChjYnB5X3R5cGVfaW5kZXggPT0gLTEpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGgyNjNwYXksCisgICAgICAgICAgIkNCUFkgaW5kZXggc2hvdWxkbid0IGJlIC0xIGluIHdpbmRvdzogJTA4eCIsIGNvbnRleHQtPndpbmRvdyk7CisgICAgICBnb3RvIGJlYWNoOworICAgIH0KKyAgICBtYWMtPmViaXQgPQorICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X21vdmVfd2luZG93X3JpZ2h0IChydHBoMjYzcGF5LCBjb250ZXh0LAorICAgICAgICBjYnB5X1BbY2JweV90eXBlX2luZGV4XVsyXSwgbWFjLT5lYml0LCAmbWFjLT5lbmQsICZnb2ItPmVuZCk7CisKKyAgICAvL01CIHR5cGUgMSBhbmQgNCBoYXZlIERRVUFOVCAtIHdlIGFkZCBpdCB0byBNQiBvYmplY3QgYW5kIGp1bXAgb3ZlcgorICAgIGlmIChtY2JwY19QW21iX3R5cGVfaW5kZXhdWzVdID09IDQgfHwgbWNicGNfUFttYl90eXBlX2luZGV4XVs1XSA9PSAxKSB7CisgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAiU2hpZnRpbmcgRFFVQU5UIik7CisKKyAgICAgIG1hYy0+cXVhbnQgPSBjb250ZXh0LT53aW5kb3cgPj4gMzA7CisKKyAgICAgIG1hYy0+ZWJpdCA9CisgICAgICAgICAgZ3N0X3J0cF9oMjYzX3BheV9tb3ZlX3dpbmRvd19yaWdodCAocnRwaDI2M3BheSwgY29udGV4dCwgMiwgbWFjLT5lYml0LAorICAgICAgICAgICZtYWMtPmVuZCwgJmdvYi0+ZW5kKTsKKyAgICB9CisgICAgLy9NQiB0eXBlcyA8IDMgaGF2ZSBNVkQxLTQKKyAgICBpZiAobWNicGNfUFttYl90eXBlX2luZGV4XVs1XSA8IDMpIHsKKworICAgICAgZ3VpbnQgbm12ZDsKKyAgICAgIGdpbnQgajsKKworICAgICAgbm12ZCA9IDI7CisgICAgICBpZiAobWNicGNfUFttYl90eXBlX2luZGV4XVs1XSA9PSAyKQorICAgICAgICBubXZkID0gODsKKworICAgICAgZm9yIChqID0gMDsgaiA8IG5tdmQ7IGorKykgeworICAgICAgICBndWludCBtdmRfdHlwZTsKKworICAgICAgICBtdmRfdHlwZSA9IGdzdF9ydHBfaDI2M19wYXlfZGVjb2RlX212ZCAocnRwaDI2M3BheSwgY29udGV4dC0+d2luZG93KTsKKworICAgICAgICBpZiAobXZkX3R5cGUgPT0gLTEpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgICAgICAgICAiTVZEMS00IGluZGV4IHNob3VsZG4ndCBiZSAtMSBpbiB3aW5kb3c6ICUwOHgiLCBjb250ZXh0LT53aW5kb3cpOworICAgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICAgIH0KKyAgICAgICAgLy9zZXQgdGhlIE1CIG12ZCB2YWx1ZXMKKyAgICAgICAgbWFjLT5tdmRbal0gPSBtdmRbbXZkX3R5cGVdWzNdOworCisgICAgICAgIG1hYy0+ZWJpdCA9CisgICAgICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X21vdmVfd2luZG93X3JpZ2h0IChydHBoMjYzcGF5LCBjb250ZXh0LAorICAgICAgICAgICAgbXZkW212ZF90eXBlXVsyXSwgbWFjLT5lYml0LCAmbWFjLT5lbmQsICZnb2ItPmVuZCk7CisgICAgICB9CisKKworICAgIH0KKyAgICAvL1N0ZXAgNSBnbyB0cm91Z2ggdGhlIGJsb2NrcyAtIGRlY29kZSBEQyBhbmQgVENPRUYKKyAgICBsYXN0ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTl9CTE9DS1M7IGkrKykgeworCisgICAgICAvL2lmIE1CIHR5cGUgMyBvciA0IHRoZW4gSU5UUkFEQyBjb2VmIGFyZSBwcmVzZW50IGluIGJsb2NrcworICAgICAgaWYgKG1jYnBjX1BbbWJfdHlwZV9pbmRleF1bNV0gPiAyKSB7CisgICAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJJTlRSQURDIGNvZWY6ICVkIiwgaSk7CisgICAgICAgIG1hYy0+ZWJpdCA9CisgICAgICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X21vdmVfd2luZG93X3JpZ2h0IChydHBoMjYzcGF5LCBjb250ZXh0LCA4LAorICAgICAgICAgICAgbWFjLT5lYml0LCAmbWFjLT5lbmQsICZnb2ItPmVuZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAiSU5UUkFEQyBjb2VmIGlzIG5vdCBwcmVzZW50Iik7CisgICAgICB9CisKKyAgICAgIC8vY2hlY2sgaWYgdGhlIGJsb2NrIGhhcyBUQ09FRgorICAgICAgaWYgKGkgPiAzKSB7CisgICAgICAgIGluZCA9IG1jYnBjX1BbbWJfdHlwZV9pbmRleF1baSAtIDFdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1jYnBjX1BbbWJfdHlwZV9pbmRleF1bNV0gPiAyKSB7CisgICAgICAgICAgaW5kID0gY2JweV9JW2NicHlfdHlwZV9pbmRleF1baSArIDNdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZCA9IGNicHlfUFtjYnB5X3R5cGVfaW5kZXhdW2kgKyAzXTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoaW5kID09IDEpIHsKKyAgICAgICAgd2hpbGUgKGxhc3QgPT0gMCkgeworICAgICAgICAgIHRjb2VmX3R5cGVfaW5kZXggPQorICAgICAgICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X2RlY29kZV90Y29lZiAocnRwaDI2M3BheSwgY29udGV4dC0+d2luZG93KTsKKworICAgICAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJUQ09FRiBpbmRleDogJWQiLCB0Y29lZl90eXBlX2luZGV4KTsKKyAgICAgICAgICBpZiAodGNvZWZfdHlwZV9pbmRleCA9PSAtMSkgeworICAgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwaDI2M3BheSwKKyAgICAgICAgICAgICAgICAiVENPRUYgaW5kZXggc2hvdWxkbid0IGJlIC0xIGluIHdpbmRvdzogJTA4eCIsIGNvbnRleHQtPndpbmRvdyk7CisgICAgICAgICAgICBnb3RvIGJlYWNoOworICAgICAgICAgIH0KKworICAgICAgICAgIG1hYy0+ZWJpdCA9CisgICAgICAgICAgICAgIGdzdF9ydHBfaDI2M19wYXlfbW92ZV93aW5kb3dfcmlnaHQgKHJ0cGgyNjNwYXksIGNvbnRleHQsCisgICAgICAgICAgICAgIHRjb2VmW3Rjb2VmX3R5cGVfaW5kZXhdWzJdLCBtYWMtPmViaXQsICZtYWMtPmVuZCwgJmdvYi0+ZW5kKTsKKworICAgICAgICAgIGxhc3QgPSB0Y29lZlt0Y29lZl90eXBlX2luZGV4XVszXTsKKyAgICAgICAgICBpZiAodGNvZWZfdHlwZV9pbmRleCA9PSAxMDIpIHsKKyAgICAgICAgICAgIGlmICgoY29udGV4dC0+d2luZG93ICYgMHg4MDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgbGFzdCA9IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGxhc3QgPSAwOworCisgICAgICAgICAgICBtYWMtPmViaXQgPQorICAgICAgICAgICAgICAgIGdzdF9ydHBfaDI2M19wYXlfbW92ZV93aW5kb3dfcmlnaHQgKHJ0cGgyNjNwYXksIGNvbnRleHQsIDE1LAorICAgICAgICAgICAgICAgIG1hYy0+ZWJpdCwgJm1hYy0+ZW5kLCAmZ29iLT5lbmQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsYXN0ID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBtYWMtPmxlbmd0aCA9IG1hYy0+ZW5kIC0gbWFjLT5zdGFydCArIDE7CisKKyAgcmV0dXJuIG1hYzsKKworYmVhY2g6CisgIGdzdF9ydHBfaDI2M19wYXlfbWJfZGVzdHJveSAobWFjKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBHc3RSdHBIMjYzUGF5TUIgKgorZ3N0X3J0cF9oMjYzX3BheV9tYl9uZXcgKEdzdFJ0cEgyNjNQYXlCb3VuZHJ5ICogYm91bmRyeSwgZ3VpbnQgbWJhKQoreworICBHc3RSdHBIMjYzUGF5TUIgKm1iOworICBnaW50IGk7CisKKyAgbWIgPSAoR3N0UnRwSDI2M1BheU1CICopIGdfbWFsbG9jMCAoc2l6ZW9mIChHc3RSdHBIMjYzUGF5TUIpKTsKKworICBtYi0+c3RhcnQgPSBib3VuZHJ5LT5zdGFydDsKKyAgbWItPmVuZCA9IGJvdW5kcnktPmVuZDsKKyAgbWItPmxlbmd0aCA9IGJvdW5kcnktPmVuZCAtIGJvdW5kcnktPnN0YXJ0ICsgMTsKKyAgbWItPnNiaXQgPSBib3VuZHJ5LT5zYml0OworICBtYi0+ZWJpdCA9IGJvdW5kcnktPmViaXQ7CisgIG1iLT5tYmEgPSBtYmE7CisKKyAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICBtYi0+bXZkW2ldID0gMDsKKworICByZXR1cm4gbWI7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjNfcGF5X21iX2Rlc3Ryb3kgKEdzdFJ0cEgyNjNQYXlNQiAqIG1iKQoreworICBpZiAoIW1iKQorICAgIHJldHVybjsKKworICBnX2ZyZWUgKG1iKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfaDI2M19wYXlfcHVzaCAoR3N0UnRwSDI2M1BheSAqIHJ0cGgyNjNwYXksCisgICAgR3N0UnRwSDI2M1BheUNvbnRleHQgKiBjb250ZXh0LCBHc3RSdHBIMjYzUGF5UGFja2FnZSAqIHBhY2thZ2UpCit7CisKKyAgLyoKKyAgICogU3BsYXQgdGhlIHBheWxvYWQgaGVhZGVyIHZhbHVlcworICAgKi8KKyAgZ3VpbnQ4ICpoZWFkZXI7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisKKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChwYWNrYWdlLT5vdXRidWYsIEdTVF9NQVBfV1JJVEUsICZydHApOworCisgIGhlYWRlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKworICBzd2l0Y2ggKHBhY2thZ2UtPm1vZGUpIHsKKyAgICBjYXNlIEdTVF9SVFBfSDI2M19QQVlMT0FEX0hFQURFUl9NT0RFX0E6CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2M3BheSwgIlB1c2hpbmcgQSBwYWNrZXQiKTsKKyAgICAgIGdzdF9ydHBfaDI2M19wYXlfc3BsYXRfaGVhZGVyX0EgKGhlYWRlciwgcGFja2FnZSwgY29udGV4dC0+cGljbGF5ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUlRQX0gyNjNfUEFZTE9BRF9IRUFERVJfTU9ERV9COgorICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJQdXNoaW5nIEIgcGFja2V0Iik7CisgICAgICBnc3RfcnRwX2gyNjNfcGF5X3NwbGF0X2hlYWRlcl9CIChoZWFkZXIsIHBhY2thZ2UsIGNvbnRleHQtPnBpY2xheWVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1JUUF9IMjYzX1BBWUxPQURfSEVBREVSX01PREVfQzoKKyAgICAgIC8vZ3N0X3J0cF9oMjYzX3BheV9zcGxhdF9oZWFkZXJfQyhoZWFkZXIsIHBhY2thZ2UsIGNvbnRleHQtPnBpY2xheWVyKTsKKyAgICAgIC8vYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIC8qCisgICAqIHRpbWVzdGFtcCB0aGUgYnVmZmVyCisgICAqLworICBHU1RfQlVGRkVSX1BUUyAocGFja2FnZS0+b3V0YnVmKSA9IHJ0cGgyNjNwYXktPmZpcnN0X3RzOworCisgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKCZydHAsIHBhY2thZ2UtPm1hcmtlcik7CisgIGlmIChwYWNrYWdlLT5tYXJrZXIpCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwgIk1hcmtlciBzZXQhIik7CisKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIC8qCisgICAqIENvcHkgdGhlIHBheWxvYWQgZGF0YSBpbiB0aGUgYnVmZmVyCisgICAqLworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LCAiQ29weWluZyBtZW1vcnkiKTsKKyAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKHBhY2thZ2UtPm91dGJ1ZiwgcnRwaDI2M3BheS0+Y3VycmVudF9idWZmZXIsCisgICAgICBHU1RfQlVGRkVSX0NPUFlfTUVNT1JZLCBwYWNrYWdlLT5wYXlsb2FkX3N0YXJ0IC0gcnRwaDI2M3BheS0+bWFwLmRhdGEsCisgICAgICBwYWNrYWdlLT5wYXlsb2FkX2xlbik7CisgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHBoMjYzcGF5LCBwYWNrYWdlLT5vdXRidWYsCisgICAgICBydHBoMjYzcGF5LT5jdXJyZW50X2J1ZmZlcik7CisKKyAgcmV0ID0KKyAgICAgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBoMjYzcGF5KSwKKyAgICAgIHBhY2thZ2UtPm91dGJ1Zik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJQYWNrYWdlIHB1c2hlZCwgcmV0dXJuaW5nIik7CisKKyAgZ3N0X3J0cF9oMjYzX3BheV9wYWNrYWdlX2Rlc3Ryb3kgKHBhY2thZ2UpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2gyNjNfcGF5X0FfZnJhZ21lbnRfcHVzaCAoR3N0UnRwSDI2M1BheSAqIHJ0cGgyNjNwYXksCisgICAgR3N0UnRwSDI2M1BheUNvbnRleHQgKiBjb250ZXh0LCBndWludCBmaXJzdCwgZ3VpbnQgbGFzdCkKK3sKKworICBHc3RSdHBIMjYzUGF5UGFja2FnZSAqcGFjazsKKworICBwYWNrID0gZ3N0X3J0cF9oMjYzX3BheV9wYWNrYWdlX25ld19lbXB0eSAoKTsKKworICBwYWNrLT5wYXlsb2FkX3N0YXJ0ID0gY29udGV4dC0+Z29ic1tmaXJzdF0tPnN0YXJ0OworICBwYWNrLT5zYml0ID0gY29udGV4dC0+Z29ic1tmaXJzdF0tPnNiaXQ7CisgIHBhY2stPmViaXQgPSBjb250ZXh0LT5nb2JzW2xhc3RdLT5lYml0OworICBwYWNrLT5wYXlsb2FkX2xlbiA9CisgICAgICAoY29udGV4dC0+Z29ic1tsYXN0XS0+ZW5kIC0gY29udGV4dC0+Z29ic1tmaXJzdF0tPnN0YXJ0KSArIDE7CisgIHBhY2stPm1hcmtlciA9IEZBTFNFOworCisgIGlmIChsYXN0ID09IGNvbnRleHQtPm5vX2dvYnMgLSAxKSB7CisgICAgcGFjay0+bWFya2VyID0gVFJVRTsKKyAgfQorCisgIHBhY2stPmdvYm4gPSBjb250ZXh0LT5nb2JzW2ZpcnN0XS0+Z29ibjsKKyAgcGFjay0+bW9kZSA9IEdTVF9SVFBfSDI2M19QQVlMT0FEX0hFQURFUl9NT0RFX0E7CisgIHBhY2stPm91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAocGFjay0+bW9kZSwgMCwgMCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwgIlNlbmRpbmcgbGVuOiVkIGRhdGEgdG8gcHVzaCBmdW5jdGlvbiIsCisgICAgICBwYWNrLT5wYXlsb2FkX2xlbik7CisKKyAgcmV0dXJuIGdzdF9ydHBfaDI2M19wYXlfcHVzaCAocnRwaDI2M3BheSwgY29udGV4dCwgcGFjayk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2gyNjNfcGF5X0JfZnJhZ21lbnRfcHVzaCAoR3N0UnRwSDI2M1BheSAqIHJ0cGgyNjNwYXksCisgICAgR3N0UnRwSDI2M1BheUNvbnRleHQgKiBjb250ZXh0LCBHc3RSdHBIMjYzUGF5R29iICogZ29iLCBndWludCBmaXJzdCwKKyAgICBndWludCBsYXN0LCBHc3RSdHBIMjYzUGF5Qm91bmRyeSAqIGJvdW5kcnkpCit7CisKKyAgR3N0UnRwSDI2M1BheVBhY2thZ2UgKnBhY2s7CisgIGd1aW50IG12OworCisgIHBhY2sgPSBnc3RfcnRwX2gyNjNfcGF5X3BhY2thZ2VfbmV3X2VtcHR5ICgpOworCisgIHBhY2stPnBheWxvYWRfc3RhcnQgPSBnb2ItPm1hY3JvYmxvY2tzW2ZpcnN0XS0+c3RhcnQ7CisgIHBhY2stPnNiaXQgPSBnb2ItPm1hY3JvYmxvY2tzW2ZpcnN0XS0+c2JpdDsKKyAgaWYgKGZpcnN0ID09IDApIHsKKyAgICBwYWNrLT5wYXlsb2FkX3N0YXJ0ID0gYm91bmRyeS0+c3RhcnQ7CisgICAgcGFjay0+c2JpdCA9IGJvdW5kcnktPnNiaXQ7CisgICAgcGFjay0+cXVhbnQgPSBnb2ItPnF1YW50OworICB9IGVsc2UgeworICAgIHBhY2stPnF1YW50ID0gZ29iLT5tYWNyb2Jsb2Nrc1tmaXJzdF0tPnF1YW50OworICB9CisgIHBhY2stPnBheWxvYWRfZW5kID0gZ29iLT5tYWNyb2Jsb2Nrc1tsYXN0XS0+ZW5kOworCisgIHBhY2stPmViaXQgPSBnb2ItPm1hY3JvYmxvY2tzW2xhc3RdLT5lYml0OworICBwYWNrLT5tYmEgPSBnb2ItPm1hY3JvYmxvY2tzW2ZpcnN0XS0+bWJhOworICBwYWNrLT5nb2JuID0gZ29iLT5nb2JuOworICBwYWNrLT5tb2RlID0gR1NUX1JUUF9IMjYzX1BBWUxPQURfSEVBREVSX01PREVfQjsKKyAgcGFjay0+bm12ZCA9IDA7CisKKyAgaWYgKGdvYi0+bWFjcm9ibG9ja3NbZmlyc3RdLT5tYl90eXBlIDwgMykgeworICAgIGlmIChnb2ItPm1hY3JvYmxvY2tzW2ZpcnN0XS0+bWJfdHlwZSA9PSAyKQorICAgICAgcGFjay0+bm12ZCA9IDg7CisgICAgZWxzZSBpZiAoZ29iLT5tYWNyb2Jsb2Nrc1tmaXJzdF0tPm1iX3R5cGUgPCAyKQorICAgICAgcGFjay0+bm12ZCA9IDI7CisKKyAgICBmb3IgKG12ID0gMDsgbXYgPCBwYWNrLT5ubXZkOyBtdisrKQorICAgICAgcGFjay0+bXZkW212XSA9IGdvYi0+bWFjcm9ibG9ja3NbZmlyc3RdLT5tdmRbbXZdOworICB9CisKKyAgcGFjay0+bWFya2VyID0gRkFMU0U7CisgIGlmIChsYXN0ID09IGdvYi0+bm1hY3JvYmxvY3MgLSAxKSB7CisgICAgcGFjay0+ZWJpdCA9IDA7CisgIH0KKworICBpZiAoKGZvcm1hdF9wcm9wc1tjb250ZXh0LT5waWNsYXllci0+cHR5cGVfc3JjZm9ybWF0XVswXSAtIDEgPT0gZ29iLT5nb2JuKQorICAgICAgJiYgKGxhc3QgPT0gZ29iLT5ubWFjcm9ibG9jcyAtIDEpKSB7CisgICAgcGFjay0+bWFya2VyID0gVFJVRTsKKyAgfQorCisgIHBhY2stPnBheWxvYWRfbGVuID0gcGFjay0+cGF5bG9hZF9lbmQgLSBwYWNrLT5wYXlsb2FkX3N0YXJ0ICsgMTsKKyAgcGFjay0+b3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChwYWNrLT5tb2RlLCAwLCAwKTsKKworICByZXR1cm4gZ3N0X3J0cF9oMjYzX3BheV9wdXNoIChydHBoMjYzcGF5LCBjb250ZXh0LCBwYWNrKTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2M19wYXlfbW9kZV9CX2ZyYWdtZW50IChHc3RSdHBIMjYzUGF5ICogcnRwaDI2M3BheSwKKyAgICBHc3RSdHBIMjYzUGF5Q29udGV4dCAqIGNvbnRleHQsIEdzdFJ0cEgyNjNQYXlHb2IgKiBnb2IpCit7CisKKworICAgIC8qLS0tLS0tLS0tLSBNT0RFIEIgTU9ERSBGUkFHTUVOVEFUSU9OIC0tLS0tLS0tLS0qLworICBHc3RSdHBIMjYzUGF5TUIgKm1hYywgKm1hYzA7CisgIGd1aW50IG1heF9wYXlsb2FkX3NpemU7CisgIEdzdFJ0cEgyNjNQYXlCb3VuZHJ5IGJvdW5kcnk7CisgIGd1aW50IG1iOworICBndWludDggZWJpdDsKKworICBndWludCBmaXJzdCA9IDA7CisgIGd1aW50IHBheWxvYWRfbGVuOworCisgIG1heF9wYXlsb2FkX3NpemUgPQorICAgICAgY29udGV4dC0+bXR1IC0gR1NUX1JUUF9IMjYzX1BBWUxPQURfSEVBREVSX01PREVfQiAtIEdTVF9SVFBfSEVBREVSX0xFTjsKKworICBnc3RfcnRwX2gyNjNfcGF5X2JvdW5kcnlfaW5pdCAoJmJvdW5kcnksIGdvYi0+c3RhcnQsIGdvYi0+c3RhcnQsIGdvYi0+c2JpdCwKKyAgICAgIDApOworCisgIGdvYi0+bWFjcm9ibG9ja3MgPQorICAgICAgKEdzdFJ0cEgyNjNQYXlNQiAqKikgZ19tYWxsb2MwIChzaXplb2YgKEdzdFJ0cEgyNjNQYXlNQiAqKSAqCisgICAgICBmb3JtYXRfcHJvcHNbY29udGV4dC0+cGljbGF5ZXItPnB0eXBlX3NyY2Zvcm1hdF1bMV0pOworCisgIEdTVF9MT0dfT0JKRUNUIChydHBoMjYzcGF5LCAiR09CIGlzbid0IFBCIGZyYW1lLCBhcHBseWluZyBtb2RlIEIiKTsKKworICAvL2luaXRpYWxpemluZyB3aW5kb3cKKyAgY29udGV4dC0+d2luX2VuZCA9IGJvdW5kcnkuZW5kOworICBpZiAoZ3N0X3J0cF9oMjYzX3BheV9tb3ZlX3dpbmRvd19yaWdodCAocnRwaDI2M3BheSwgY29udGV4dCwgMzIsIGJvdW5kcnkuZWJpdCwKKyAgICAgICAgICAmYm91bmRyeS5lbmQsICZnb2ItPmVuZCkgIT0gMCkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGgyNjNwYXksCisgICAgICAgICJUaGUgcmVzdCBvZiB0aGUgYml0cyBzaG91bGQgYmUgMCwgZXhpdGluZywgYmVjYXVzZSBzb21ldGhpbmcgYmFkIGhhcHBlbmQiKTsKKyAgICBnb3RvIGRlY29kZV9lcnJvcjsKKyAgfQorICAvL1RoZSBmaXJzdCBHT0Igb2YgYSBmcmFtZSAiaGFzIG5vIiBhY3R1YWwgaGVhZGVyIC0gUElDVFVSRSBoZWFkZXIgaXMgaGlzIGhlYWRlcgorICBpZiAoZ29iLT5nb2JuID09IDApIHsKKyAgICBndWludCBzaGlmdDsKKyAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2M3BheSwgIkluaXRpYWwgR09CIik7CisgICAgc2hpZnQgPSA0MzsKKworICAgIGJvdW5kcnkuZWJpdCA9CisgICAgICAgIGdzdF9ydHBfaDI2M19wYXlfbW92ZV93aW5kb3dfcmlnaHQgKHJ0cGgyNjNwYXksIGNvbnRleHQsIHNoaWZ0LAorICAgICAgICBib3VuZHJ5LmViaXQsICZib3VuZHJ5LmVuZCwgJmdvYi0+ZW5kKTsKKworICAgIC8vV2UgbmVlZCBQUVVBTlQgZm9yIG1vZGUgQiBwYWNrYWdlcyAtIHNvIHdlIHN0b3JlIGl0CisgICAgZ29iLT5xdWFudCA9IGNvbnRleHQtPndpbmRvdyA+PiAyNzsKKworICAgIC8vaWYgUENNID09IDEsIHRoZW4gUFNCSSBpcyBwcmVzZW50IC0gaGVhZGVyIGhhcyA1MSBiaXRzCisgICAgLy9zaGlmdCBmb3IgUFFVQU5UICg1KSBhbmQgUENNICgxKSA9IDYgYml0cworICAgIHNoaWZ0ID0gNjsKKyAgICBpZiAoY29udGV4dC0+Y3BtID09IDEpCisgICAgICBzaGlmdCArPSAyOworICAgIGJvdW5kcnkuZWJpdCA9CisgICAgICAgIGdzdF9ydHBfaDI2M19wYXlfbW92ZV93aW5kb3dfcmlnaHQgKHJ0cGgyNjNwYXksIGNvbnRleHQsIHNoaWZ0LAorICAgICAgICBib3VuZHJ5LmViaXQsICZib3VuZHJ5LmVuZCwgJmdvYi0+ZW5kKTsKKworICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJ3aW5kb3c6IDB4JTA4eCIsIGNvbnRleHQtPndpbmRvdyk7CisKKyAgICAvL1NoaWZ0aW5nIHRoZSBQRUkgYW5kIFBTUEFSRSBmaWVsZHMKKyAgICB3aGlsZSAoKGNvbnRleHQtPndpbmRvdyAmIDB4ODAwMDAwMDApID09IDB4ODAwMDAwMDApIHsKKyAgICAgIGJvdW5kcnkuZWJpdCA9CisgICAgICAgICAgZ3N0X3J0cF9oMjYzX3BheV9tb3ZlX3dpbmRvd19yaWdodCAocnRwaDI2M3BheSwgY29udGV4dCwgOSwKKyAgICAgICAgICBib3VuZHJ5LmViaXQsICZib3VuZHJ5LmVuZCwgJmdvYi0+ZW5kKTsKKyAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJ3aW5kb3c6IDB4JTA4eCIsIGNvbnRleHQtPndpbmRvdyk7CisgICAgfQorCisgICAgLy9zaGlmdCB0aGUgbGFzdCBQRUkgZmllbGQKKyAgICBib3VuZHJ5LmViaXQgPQorICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X21vdmVfd2luZG93X3JpZ2h0IChydHBoMjYzcGF5LCBjb250ZXh0LCAxLAorICAgICAgICBib3VuZHJ5LmViaXQsICZib3VuZHJ5LmVuZCwgJmdvYi0+ZW5kKTsKKworICB9IGVsc2UgeworICAgIC8vc2tpcHBpbmcgR09CcyAyNCBoZWFkZXIgYml0cyArIDUgR1FVQU5UCisgICAgZ3VpbnQgc2hpZnQgPSAyNDsKKworICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJJTlRFUiBHT0IiKTsKKworICAgIC8vaWYgQ1BNID09IDEsIHRoZXJlIGFyZSAyIG1vcmUgYml0cyBpbiB0aGUgaGVhZGVyIC0gR1NCSSBoZWFkZXIgaXMgMzEgYml0cyBsb25nCisgICAgaWYgKGNvbnRleHQtPmNwbSA9PSAxKQorICAgICAgc2hpZnQgKz0gMjsKKworICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJ3aW5kb3c6IDB4JTA4eCIsIGNvbnRleHQtPndpbmRvdyk7CisgICAgYm91bmRyeS5lYml0ID0KKyAgICAgICAgZ3N0X3J0cF9oMjYzX3BheV9tb3ZlX3dpbmRvd19yaWdodCAocnRwaDI2M3BheSwgY29udGV4dCwgc2hpZnQsCisgICAgICAgIGJvdW5kcnkuZWJpdCwgJmJvdW5kcnkuZW5kLCAmZ29iLT5lbmQpOworCisgICAgLy9XZSBuZWVkIEdRVUFOVCBmb3IgbW9kZSBCIHBhY2thZ2VzIC0gc28gd2Ugc3RvcmUgaXQKKyAgICBnb2ItPnF1YW50ID0gY29udGV4dC0+d2luZG93ID4+IDI3OworCisgICAgc2hpZnQgPSA1OworICAgIGJvdW5kcnkuZWJpdCA9CisgICAgICAgIGdzdF9ydHBfaDI2M19wYXlfbW92ZV93aW5kb3dfcmlnaHQgKHJ0cGgyNjNwYXksIGNvbnRleHQsIHNoaWZ0LAorICAgICAgICBib3VuZHJ5LmViaXQsICZib3VuZHJ5LmVuZCwgJmdvYi0+ZW5kKTsKKworICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0cGgyNjNwYXksICJ3aW5kb3c6IDB4JTA4eCIsIGNvbnRleHQtPndpbmRvdyk7CisgIH0KKworICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LCAiR1FVQU5UIElTOiAlMDh4IiwgZ29iLT5xdWFudCk7CisKKyAgLy8gV2UgYXJlIG9uIE1CIGxheWVyCisKKyAgbWFjID0gbWFjMCA9IGdzdF9ydHBfaDI2M19wYXlfbWJfbmV3ICgmYm91bmRyeSwgMCk7CisgIGZvciAobWIgPSAwOyBtYiA8IGZvcm1hdF9wcm9wc1tjb250ZXh0LT5waWNsYXllci0+cHR5cGVfc3JjZm9ybWF0XVsxXTsgbWIrKykgeworCisgICAgR1NUX1RSQUNFX09CSkVDVCAocnRwaDI2M3BheSwKKyAgICAgICAgIj09PT09PT09PT09PT09PT0gU1RBUlQgTUIgJWQgPT09PT09PT09PT09PT09PT0iLCBtYik7CisKKyAgICAvL0ZpbmQgbmV4dCBtYWNyb2Jsb2NrIGJvdW5kYXJpZXMKKyAgICBlYml0ID0gbWFjLT5lYml0OworICAgIGlmICghKG1hYyA9CisgICAgICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X0JfbWJmaW5kZXIgKHJ0cGgyNjNwYXksIGNvbnRleHQsIGdvYiwgbWFjLCBtYikpKSB7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBoMjYzcGF5LCAiRXJyb3IgZGVjb2RpbmcgTUIgLSBzYml0OiAlZCIsIDggLSBlYml0KTsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGgyNjNwYXksICJFcnJvciBkZWNvZGluZyBpbiBHT0IiKTsKKworICAgICAgZ3N0X3J0cF9oMjYzX3BheV9tYl9kZXN0cm95IChtYWMwKTsKKyAgICAgIGdvdG8gZGVjb2RlX2Vycm9yOworICAgIH0KKworICAgIC8qIFN0b3JlIG1hY3JvYmxvY2sgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBhbmQgZGVsZXRlIG9sZCBNQiBpZiBhbnkgKi8KKyAgICBnc3RfcnRwX2gyNjNfcGF5X21iX2Rlc3Ryb3kgKGdvYi0+bWFjcm9ibG9ja3NbbWJdKTsKKyAgICBnb2ItPm1hY3JvYmxvY2tzW21iXSA9IG1hYzsKKworICAgIC8vSWYgbWJfdHlwZSA9PSBzdHVmZmluZywgZG9uJ3QgaW5jcmVtZW50IHRoZSBtYiBhZGRyZXNzCisgICAgaWYgKG1hYy0+bWJfdHlwZSA9PSAxMCkgeworICAgICAgbWItLTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0gZWxzZSB7CisgICAgICBnb2ItPm5tYWNyb2Jsb2NzKys7CisgICAgfQorCisgICAgaWYgKG1hYy0+ZW5kID49IGdvYi0+ZW5kKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2M3BheSwgIk5vIG1vcmUgTUJzIGluIHRoaXMgR09CIik7CisgICAgICBpZiAoIW1hYy0+ZWJpdCkgeworICAgICAgICBtYWMtPmVuZC0tOworICAgICAgfQorICAgICAgZ29iLT5lbmQgPSBtYWMtPmVuZDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgICAiRm91bmQgTUI6IG1iYTogJWQgc3RhcnQ6ICVwIGVuZDogJXAgbGVuOiAlZCBzYml0OiAlZCBlYml0OiAlZCIsCisgICAgICAgIG1hYy0+bWJhLCBtYWMtPnN0YXJ0LCBtYWMtPmVuZCwgbWFjLT5sZW5ndGgsIG1hYy0+c2JpdCwgbWFjLT5lYml0KTsKKyAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgICAiPT09PT09PT09PT09PT09PSBFTkQgTUIgJWQgPT09PT09PT09PT09PT09PT0iLCBtYik7CisgIH0KKyAgZ3N0X3J0cF9oMjYzX3BheV9tYl9kZXN0cm95IChtYWMwKTsKKworICBtYiA9IDA7CisgIGZpcnN0ID0gMDsKKyAgcGF5bG9hZF9sZW4gPSBib3VuZHJ5LmVuZCAtIGJvdW5kcnkuc3RhcnQgKyAxOworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTkVXIFBBQ0tBR0UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICB3aGlsZSAobWIgPCBnb2ItPm5tYWNyb2Jsb2NzKSB7CisgICAgaWYgKHBheWxvYWRfbGVuICsgZ29iLT5tYWNyb2Jsb2Nrc1ttYl0tPmxlbmd0aCA8IG1heF9wYXlsb2FkX3NpemUpIHsKKworICAgICAgLy9GSVhNRTogcGF5bG9hZF9sZW4gaXMgbm90IHRoZSByZWFsIGxlbmd0aCAtPiBpZ25vcmluZyBzYml0L2ViaXQKKyAgICAgIHBheWxvYWRfbGVuICs9IGdvYi0+bWFjcm9ibG9ja3NbbWJdLT5sZW5ndGg7CisgICAgICBtYisrOworCisgICAgfSBlbHNlIHsKKyAgICAgIC8vRklYTUU6IHdlIHNob3VsZCBpbmNsdWRlIHRoZSBsYXN0IGZldyBiaXRzIG9mIHRoZSBHT0IgaW4gdGhlIHBhY2thZ2UgLSBkbyB3ZSBkbyB0aGF0IG5vdz8KKyAgICAgIC8vR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwgIlB1c2hpbmcgR09CUyAlZCB0byAlZCBiZWNhdXNlIHBheWxvYWQgc2l6ZSBpcyAlZCIsIGZpcnN0LAorICAgICAgLy8gICAgZmlyc3QgPT0gbWIgLSAxLCBwYXlsb2FkX2xlbik7CisKKyAgICAgIC8vIEZJWE1FOiBzZWdmYXVsdCBpZiBtYiA9PSAwIChmaXJzdCBNQiBpcyBsYXJnZXIgdGhhbiBtYXhfcGF5bG9hZF9zaXplKQorICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwgIlB1c2ggQiBtb2RlIGZyYWdtZW50IGZyb20gbWIgJWQgdG8gJWQiLAorICAgICAgICAgIGZpcnN0LCBtYiAtIDEpOworICAgICAgaWYgKGdzdF9ydHBfaDI2M19wYXlfQl9mcmFnbWVudF9wdXNoIChydHBoMjYzcGF5LCBjb250ZXh0LCBnb2IsIGZpcnN0LAorICAgICAgICAgICAgICBtYiAtIDEsICZib3VuZHJ5KSkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChydHBoMjYzcGF5LCAiT29vb3BzLCB0aGVyZSB3YXMgYW4gZXJyb3Igc2VuZGluZyIpOworICAgICAgICBnb3RvIGRlY29kZV9lcnJvcjsKKyAgICAgIH0KKworICAgICAgcGF5bG9hZF9sZW4gPSAwOworICAgICAgZmlyc3QgPSBtYjsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwYXksCisgICAgICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5EIFBBQ0tBR0UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwKKyAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBORVcgUEFDS0FHRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgfQorICB9CisKKyAgLyogUHVzaCByZXN0ICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJSZW1haW5kZXIgZmlyc3Q6ICVkLCBNQjogJWQiLCBmaXJzdCwgbWIpOworICBpZiAocGF5bG9hZF9sZW4gIT0gMCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJQdXNoIEIgbW9kZSBmcmFnbWVudCBmcm9tIG1iICVkIHRvICVkIiwKKyAgICAgICAgZmlyc3QsIG1iIC0gMSk7CisgICAgaWYgKGdzdF9ydHBfaDI2M19wYXlfQl9mcmFnbWVudF9wdXNoIChydHBoMjYzcGF5LCBjb250ZXh0LCBnb2IsIGZpcnN0LAorICAgICAgICAgICAgbWIgLSAxLCAmYm91bmRyeSkpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGgyNjNwYXksICJPb29vcHMsIHRoZXJlIHdhcyBhbiBlcnJvciBzZW5kaW5nISIpOworICAgICAgZ290byBkZWNvZGVfZXJyb3I7CisgICAgfQorICB9CisKKyAgICAvKi0tLS0tLS0tLS0gRU5EIE9GIE1PREUgQiBGUkFHTUVOVEFUSU9OIC0tLS0tLS0tLS0qLworCisgIHJldHVybiBUUlVFOworCitkZWNvZGVfZXJyb3I6CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfaDI2M19zZW5kX2VudGlyZV9mcmFtZSAoR3N0UnRwSDI2M1BheSAqIHJ0cGgyNjNwYXksCisgICAgR3N0UnRwSDI2M1BheUNvbnRleHQgKiBjb250ZXh0KQoreworICBHc3RSdHBIMjYzUGF5UGFja2FnZSAqcGFjazsKKyAgcGFjayA9CisgICAgICBnc3RfcnRwX2gyNjNfcGF5X3BhY2thZ2VfbmV3IChydHBoMjYzcGF5LT5kYXRhLAorICAgICAgcnRwaDI2M3BheS0+ZGF0YSArIHJ0cGgyNjNwYXktPmF2YWlsYWJsZV9kYXRhLAorICAgICAgcnRwaDI2M3BheS0+YXZhaWxhYmxlX2RhdGEsIDAsIDAsIE5VTEwsIFRSVUUpOworICBwYWNrLT5tb2RlID0gR1NUX1JUUF9IMjYzX1BBWUxPQURfSEVBREVSX01PREVfQTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LCAiQXZhaWxhYmxlIGRhdGE6ICVkIiwKKyAgICAgIHJ0cGgyNjNwYXktPmF2YWlsYWJsZV9kYXRhKTsKKworICBwYWNrLT5vdXRidWYgPQorICAgICAgZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChHU1RfUlRQX0gyNjNfUEFZTE9BRF9IRUFERVJfTU9ERV9BLCAwLCAwKTsKKworICByZXR1cm4gZ3N0X3J0cF9oMjYzX3BheV9wdXNoIChydHBoMjYzcGF5LCBjb250ZXh0LCBwYWNrKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfaDI2M19wYXlfZmx1c2ggKEdzdFJ0cEgyNjNQYXkgKiBydHBoMjYzcGF5KQoreworCisgIC8qCisgICAqIEZJWE1FOiBHU1RVRiBiaXRzIGFyZSBpZ25vcmVkIHJpZ2h0IG5vdywKKyAgICogIC0gbm90IHVzaW5nIEVCSVQvU0JJVCBwYXlsb2FkIGhlYWRlciBmaWVsZHMgaW4gbW9kZSBBIGZyYWdtZW50YXRpb24gLSBmZm1wZWcgZG9lc24ndCBuZWVkIHRoZW0sIGJ1dCBvdGhlcnM/CisgICAqLworCisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RSdHBIMjYzUGF5Q29udGV4dCAqY29udGV4dDsKKyAgZ2ludCBpOworCisgIHJldCA9IDA7CisgIGNvbnRleHQgPSAoR3N0UnRwSDI2M1BheUNvbnRleHQgKikgZ19tYWxsb2MwIChzaXplb2YgKEdzdFJ0cEgyNjNQYXlDb250ZXh0KSk7CisgIGNvbnRleHQtPm10dSA9CisgICAgICBydHBoMjYzcGF5LT5wYXlsb2FkLm10dSAtIChNVFVfU0VDVVJJVFlfT0ZGU0VUICsgR1NUX1JUUF9IRUFERVJfTEVOICsKKyAgICAgIEdTVF9SVFBfSDI2M19QQVlMT0FEX0hFQURFUl9NT0RFX0MpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJNVFU6ICVkIiwgY29udGV4dC0+bXR1KTsKKyAgcnRwaDI2M3BheS0+YXZhaWxhYmxlX2RhdGEgPSBnc3RfYnVmZmVyX2dldF9zaXplIChydHBoMjYzcGF5LT5jdXJyZW50X2J1ZmZlcik7CisgIGlmIChydHBoMjYzcGF5LT5hdmFpbGFibGVfZGF0YSA9PSAwKSB7CisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBlbmQ7CisgIH0KKworICAvKiBHZXQgYSBwb2ludGVyIHRvIGFsbCB0aGUgZGF0YSBmb3IgdGhlIGZyYW1lICovCisgIGdzdF9idWZmZXJfbWFwIChydHBoMjYzcGF5LT5jdXJyZW50X2J1ZmZlciwgJnJ0cGgyNjNwYXktPm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcnRwaDI2M3BheS0+ZGF0YSA9IChndWludDggKikgcnRwaDI2M3BheS0+bWFwLmRhdGE7CisKKyAgLyogUGljdHVyZSBoZWFkZXIgKi8KKyAgY29udGV4dC0+cGljbGF5ZXIgPSAoR3N0UnRwSDI2M1BheVBpYyAqKSBydHBoMjYzcGF5LT5kYXRhOworCisgIGlmIChjb250ZXh0LT5waWNsYXllci0+cHR5cGVfcGljdHlwZSA9PSAwKQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJXZSBnb3QgYW4gSS1mcmFtZSIpOworICBlbHNlCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwgIldlIGdvdCBhIFAtZnJhbWUiKTsKKworICBjb250ZXh0LT5jcG0gPSBydHBoMjYzcGF5LT5kYXRhWzZdID4+IDc7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwgIkNQTTogJWQiLCBjb250ZXh0LT5jcG0pOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJQYXlsb2FkIGxlbmd0aCBpczogJWQiLAorICAgICAgcnRwaDI2M3BheS0+YXZhaWxhYmxlX2RhdGEpOworCisgIC8qCisgICAqIC0gTU9ERSBBIC0gSWYgbm9ybWFsLCBJIGFuZCBQIGZyYW1lcywgIC0+IG1vZGUgQQorICAgKiAgIC0gR09CIGxheWVyIGZyYWdtZW50YXRpb24KKyAgICogLSBNT0RFIEIgLSBJZiBub3JtYWwsIEkgYW5kIFAgZnJhbWVzLCBidXQgR09CcyA+IG10dQorICAgKiAgIC0gTUIgbGF5ZXIgZnJhZ21lbnRhdGlvbgorICAgKiAtIE1PREUgQyAtIEZvciBQIGZyYW1lcyB3aXRoIFBCIG9wdGlvbiwgYnV0IEdPQnMgPiBtdHUKKyAgICogICAtIE1CIGxheWVyIGZyYWdtZW50YXRpb24KKyAgICovCisgIGlmIChydHBoMjYzcGF5LT5hdmFpbGFibGVfZGF0YSArIEdTVF9SVFBfSDI2M19QQVlMT0FEX0hFQURFUl9NT0RFX0EgKworICAgICAgR1NUX1JUUF9IRUFERVJfTEVOIDwgY29udGV4dC0+bXR1KSB7CisgICAgcmV0ID0gZ3N0X3J0cF9oMjYzX3NlbmRfZW50aXJlX2ZyYW1lIChydHBoMjYzcGF5LCBjb250ZXh0KTsKKyAgfSBlbHNlIHsKKworICAgICAgLyotLS0tLS0tLS0tIEZSQUdNRU5USU5HIFRIRSBGUkFNRSBCRUNBVVNFIFRPTyBMQVJHRSBUTyBGSVQgSU4gTVRVIC0tLS0tLS0tLS0qLworICAgIEdzdFJ0cEgyNjNQYXlCb3VuZHJ5IGJvdW5kOworICAgIGdpbnQgZmlyc3Q7CisgICAgZ3VpbnQgcGF5bG9hZF9sZW47CisgICAgZ2Jvb2xlYW4gZm9yY2VhID0gRkFMU0U7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LCAiRnJhbWUgdG9vIGxhcmdlIGZvciBNVFUiKTsKKyAgICAvKgorICAgICAqIExldCdzIGdvIHRyb3VnaCBhbGwgdGhlIGRhdGEgYW5kIGZyYWdtZW50IGl0IHVudGlsbCBlbmQgaXMgcmVhY2hlZAorICAgICAqLworCisgICAgZ3N0X3J0cF9oMjYzX3BheV9ib3VuZHJ5X2luaXQgKCZib3VuZCwgTlVMTCwgcnRwaDI2M3BheS0+ZGF0YSAtIDEsIDAsIDApOworICAgIGNvbnRleHQtPmdvYnMgPQorICAgICAgICAoR3N0UnRwSDI2M1BheUdvYiAqKikgZ19tYWxsb2MwIChmb3JtYXRfcHJvcHNbY29udGV4dC0+cGljbGF5ZXItPgorICAgICAgICAgICAgcHR5cGVfc3JjZm9ybWF0XVswXSAqIHNpemVvZiAoR3N0UnRwSDI2M1BheUdvYiAqKSk7CisKKworICAgIGZvciAoaSA9IDA7IGkgPCBmb3JtYXRfcHJvcHNbY29udGV4dC0+cGljbGF5ZXItPnB0eXBlX3NyY2Zvcm1hdF1bMF07IGkrKykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwgIlNlYXJjaGluZyBmb3IgZ29iICVkIiwgaSk7CisgICAgICBpZiAoIWdzdF9ydHBfaDI2M19wYXlfZ29iZmluZGVyIChydHBoMjYzcGF5LCAmYm91bmQpKSB7CisgICAgICAgIGlmIChpIDw9IDEpIHsKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cGgyNjNwYXksCisgICAgICAgICAgICAgICJObyBHT0IncyB3ZXJlIGZvdW5kIGluIGRhdGEgc3RyZWFtISBQbGVhc2UgZW5hYmxlIFJUUCBtb2RlIGluIGVuY29kZXIuIEZvcmNpbmcgbW9kZSBBIGZvciBub3cuIik7CisgICAgICAgICAgcmV0ID0gZ3N0X3J0cF9oMjYzX3NlbmRfZW50aXJlX2ZyYW1lIChydHBoMjYzcGF5LCBjb250ZXh0KTsKKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiB0cnkgdG8gc2VuZCBmcmFnbWVudHMgY29ycmVzcG9uZGluZyB0byBmb3VuZCBHT0JzICovCisgICAgICAgICAgZm9yY2VhID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBjb250ZXh0LT5nb2JzW2ldID0gZ3N0X3J0cF9oMjYzX3BheV9nb2JfbmV3ICgmYm91bmQsIGkpOworICAgICAgLy9GSVhNRSAtIGVuY29kZXJzIG1heSBnZW5lcmF0ZSBhbiBFT1MgZ29iIHRoYXQgaGFzIHRvIGJlIHByb2Nlc3NlZAorICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwKKyAgICAgICAgICAiR29iIHZhbHVlcyBhcmU6IGdvYm46ICVkLCBzdGFydDogJXAgbGVuOiAlZCBlYml0OiAlZCBzYml0OiAlZCIsIGksCisgICAgICAgICAgY29udGV4dC0+Z29ic1tpXS0+c3RhcnQsIGNvbnRleHQtPmdvYnNbaV0tPmxlbmd0aCwKKyAgICAgICAgICBjb250ZXh0LT5nb2JzW2ldLT5lYml0LCBjb250ZXh0LT5nb2JzW2ldLT5zYml0KTsKKyAgICB9CisgICAgLyogTk9URSBzb21lIHBsYWNlcyBtYXkgc3RpbGwgYXNzdW1lIHRoaXMgdG8gYmUgdGhlIG1heCBwb3NzaWJsZSAqLworICAgIGNvbnRleHQtPm5vX2dvYnMgPSBpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJGb3VuZCAlZCBHT0JTIG9mIG1heGltdW0gJWQiLAorICAgICAgICBjb250ZXh0LT5ub19nb2JzLCBmb3JtYXRfcHJvcHNbY29udGV4dC0+cGljbGF5ZXItPnB0eXBlX3NyY2Zvcm1hdF1bMF0pOworCisgICAgLy8gTWFrZSBwYWNrYWdlcyBzbWFsbGVyIHRoYW4gTVRVCisgICAgLy8gICBBIG1vZGUKKyAgICAvLyAtIGlmICggR09CID4gTVRVKSAtPiBCIG1vZGUgfHwgQyBtb2RlCisgICAgLy8gICBQdXNoIHBhY2thZ2VzCisKKyAgICBmaXJzdCA9IDA7CisgICAgcGF5bG9hZF9sZW4gPSAwOworICAgIGkgPSAwOworICAgIHdoaWxlIChpIDwgY29udGV4dC0+bm9fZ29icykgeworCisgICAgICBpZiAoY29udGV4dC0+Z29ic1tpXS0+bGVuZ3RoID49IGNvbnRleHQtPm10dSkgeworICAgICAgICBpZiAocGF5bG9hZF9sZW4gPT0gMCkgeworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BheSwgIkdPQiBsZW4gPiBNVFUiKTsKKyAgICAgICAgICBpZiAocnRwaDI2M3BheS0+cHJvcF9wYXlsb2FkX21vZGUgfHwgZm9yY2VhKSB7CisgICAgICAgICAgICBwYXlsb2FkX2xlbiA9IGNvbnRleHQtPmdvYnNbaV0tPmxlbmd0aDsKKyAgICAgICAgICAgIGdvdG8gZm9yY2VfYTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFjb250ZXh0LT5waWNsYXllci0+cHR5cGVfcGJtb2RlKSB7CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LCAiTU9ERSBCIG9uIEdPQiAlZCBuZWVkZWQiLCBpKTsKKyAgICAgICAgICAgIGlmICghZ3N0X3J0cF9oMjYzX3BheV9tb2RlX0JfZnJhZ21lbnQgKHJ0cGgyNjNwYXksIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmdvYnNbaV0pKSB7CisgICAgICAgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGgyNjNwYXksCisgICAgICAgICAgICAgICAgICAiVGhlcmUgd2FzIGFuIGVycm9yIGZyYWdtZW50aW5nIGluIG1vZGUgQiIpOworICAgICAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vSU1QTEVNRU5UIEMgbW9kZQorICAgICAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwaDI2M3BheSwKKyAgICAgICAgICAgICAgICAiTU9ERSBDIG9uIEdPQiAlZCBuZWVkZWQsIGJ1dCBub3Qgc3VwcG9ydGVkIHlldCIsIGkpOworICAgICAgICAgICAgLyppZighZ3N0X3J0cF9oMjYzX3BheV9tb2RlX0NfZnJhZ21lbnQocnRwaDI2M3BheSwgY29udGV4dCwgY29udGV4dC0+Z29ic1tpXSkpIHsKKyAgICAgICAgICAgICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgICAgICAgICAgICAgR1NUX0VSUk9SKCJUaGVyZSB3YXMgYW4gZXJyb3IgZnJhZ21lbnRpbmcgaW4gbW9kZSBDIik7CisgICAgICAgICAgICAgICBnb3RvIGRlY29kZV9lcnJvcjsKKyAgICAgICAgICAgICAgIH0gKi8KKyAgICAgICAgICAgIGdvdG8gZGVjb2RlX2Vycm9yOworICAgICAgICAgIH0KKyAgICAgICAgZGVjb2RlX2Vycm9yOgorICAgICAgICAgIGkrKzsKKyAgICAgICAgICBmaXJzdCA9IGk7CisgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIHBheWxvYWRfYV9wdXNoOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChwYXlsb2FkX2xlbiArIGNvbnRleHQtPmdvYnNbaV0tPmxlbmd0aCA8IGNvbnRleHQtPm10dSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LCAiR09CICVkIGZpbGxzIG10dSIsIGkpOworICAgICAgICBwYXlsb2FkX2xlbiArPSBjb250ZXh0LT5nb2JzW2ldLT5sZW5ndGg7CisgICAgICAgIGkrKzsKKyAgICAgICAgaWYgKGkgPT0gY29udGV4dC0+bm9fZ29icykgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwYXksICJMQVNUIEdPQiAlZCIsIGkpOworICAgICAgICAgIGdvdG8gcGF5bG9hZF9hX3B1c2g7CisgICAgICAgIH0KKworICAgICAgfSBlbHNlIHsKKyAgICAgIHBheWxvYWRfYV9wdXNoOgorICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgICAgICAgIlB1c2hpbmcgR09CUyAlZCB0byAlZCBiZWNhdXNlIHBheWxvYWQgc2l6ZSBpcyAlZCIsIGZpcnN0LAorICAgICAgICAgICAgZmlyc3QgPT0gaSA/IGkgOiBpIC0gMSwgcGF5bG9hZF9sZW4pOworICAgICAgICBnc3RfcnRwX2gyNjNfcGF5X0FfZnJhZ21lbnRfcHVzaCAocnRwaDI2M3BheSwgY29udGV4dCwgZmlyc3QsCisgICAgICAgICAgICBmaXJzdCA9PSBpID8gaSA6IGkgLSAxKTsKKyAgICAgICAgcGF5bG9hZF9sZW4gPSAwOworICAgICAgICBmaXJzdCA9IGk7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKworICAgIGZvcmNlX2E6CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgICAgICJQdXNoaW5nIEdPQlMgJWQgdG8gJWQgYmVjYXVzZSBwYXlsb2FkIHNpemUgaXMgJWQiLCBmaXJzdCwgaSwKKyAgICAgICAgICBwYXlsb2FkX2xlbik7CisgICAgICBnc3RfcnRwX2gyNjNfcGF5X0FfZnJhZ21lbnRfcHVzaCAocnRwaDI2M3BheSwgY29udGV4dCwgZmlyc3QsIGkpOworICAgICAgcGF5bG9hZF9sZW4gPSAwOworICAgICAgaSsrOworICAgICAgZmlyc3QgPSBpOworICAgIH0KKworCisgIH0vKi0tLS0tLS0tLS0gRU5EIE9GIEZSQUdNRU5UQVRJT04gLS0tLS0tLS0tLSovCisKKyAgLyogRmx1c2ggdGhlIGlucHV0IGJ1ZmZlciBkYXRhICovCisKK2VuZDoKKyAgZ3N0X3J0cF9oMjYzX3BheV9jb250ZXh0X2Rlc3Ryb3kgKGNvbnRleHQsCisgICAgICBjb250ZXh0LT5waWNsYXllci0+cHR5cGVfc3JjZm9ybWF0KTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAocnRwaDI2M3BheS0+Y3VycmVudF9idWZmZXIsICZydHBoMjYzcGF5LT5tYXApOworICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZydHBoMjYzcGF5LT5jdXJyZW50X2J1ZmZlciwgTlVMTCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfaDI2M19wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisKKyAgR3N0UnRwSDI2M1BheSAqcnRwaDI2M3BheTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgcnRwaDI2M3BheSA9IEdTVF9SVFBfSDI2M19QQVkgKHBheWxvYWQpOworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tIE5FVyBGUkFNRSAtLS0tLS0tLS0tLS0tLS0iKTsKKworICBydHBoMjYzcGF5LT5maXJzdF90cyA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworCisgIGdzdF9idWZmZXJfcmVwbGFjZSAoJnJ0cGgyNjNwYXktPmN1cnJlbnRfYnVmZmVyLCBidWZmZXIpOworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIC8qIHdlIGFsd2F5cyBlbmNvZGUgYW5kIGZsdXNoIGEgZnVsbCBwaWN0dXJlICovCisgIHJldCA9IGdzdF9ydHBfaDI2M19wYXlfZmx1c2ggKHJ0cGgyNjNwYXkpOworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcGF5LAorICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tIEVORCBGUkFNRSAtLS0tLS0tLS0tLS0tLS0iKTsKKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9oMjYzX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGgyNjNwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfSDI2M19QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmggYi9nc3QvcnRwL2dzdHJ0cGgyNjNwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWJmYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBoMjYzcGF5LmgKQEAgLTAsMCArMSw0MTUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBBdXRob3I6IERlamFuIFNha2Vsc2FrIHNhaGVsQGtpYmVycGlwYS5vcmcKKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9IMjYzX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0gyNjNfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9SVFBfSDI2M19QQVkgXAorICAoZ3N0X3J0cF9oMjYzX3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0gyNjNfUEFZKG9iaikgXAorIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfSDI2M19QQVksR3N0UnRwSDI2M1BheSkpCisjZGVmaW5lIEdTVF9SVFBfSDI2M19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSDI2M19QQVksR3N0UnRwSDI2M1BheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9IMjYzX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9IMjYzX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfSDI2M19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0gyNjNfUEFZKSkKKy8vIGJsb2NrcyBwZXIgbWFjcm9ibG9jaworI2RlZmluZSBOX0JMT0NLUyA2CisjZGVmaW5lIERFRkFVTFRfTU9ERV9BIEZBTFNFCisjZGVmaW5lIE1UVV9TRUNVUklUWV9PRkZTRVQgNTAKKyAgICB0eXBlZGVmIGVudW0gX0dzdFJ0cEgyNjNQYXlIZWFkZXJNb2RlCit7CisgIEdTVF9SVFBfSDI2M19QQVlMT0FEX0hFQURFUl9NT0RFX0EgPSA0LAorICBHU1RfUlRQX0gyNjNfUEFZTE9BRF9IRUFERVJfTU9ERV9CID0gOCwKKyAgR1NUX1JUUF9IMjYzX1BBWUxPQURfSEVBREVSX01PREVfQyA9IDEyCit9IEdzdFJ0cEgyNjNQYXlIZWFkZXJNb2RlOworCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2M1BheUNvbnRleHQgR3N0UnRwSDI2M1BheUNvbnRleHQ7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2M1BheVBpYyBHc3RSdHBIMjYzUGF5UGljOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjNQYXlDbGFzcyBHc3RSdHBIMjYzUGF5Q2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2M1BheSBHc3RSdHBIMjYzUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjNQYXlCb3VuZHJ5IEdzdFJ0cEgyNjNQYXlCb3VuZHJ5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjNQYXlNQiBHc3RSdHBIMjYzUGF5TUI7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2M1BheUdvYiBHc3RSdHBIMjYzUGF5R29iOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjNQYXlQYWNrYWdlIEdzdFJ0cEgyNjNQYXlQYWNrYWdlOworCisvL3R5cGVkZWYgZW51bSBfR3N0UnRwSDI2M1BheUhlYWRlck1vZGUgR3N0UnRwSDI2M1BheUhlYWRlck1vZGU7CisKK3N0cnVjdCBfR3N0UnRwSDI2M1BheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCBwYXlsb2FkOworCisgIEdzdEJ1ZmZlciAqY3VycmVudF9idWZmZXI7CisgIEdzdE1hcEluZm8gbWFwOworCisgIEdzdENsb2NrVGltZSBmaXJzdF90czsKKyAgZ2Jvb2xlYW4gcHJvcF9wYXlsb2FkX21vZGU7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQgYXZhaWxhYmxlX2RhdGE7CisKK307CisKK3N0cnVjdCBfR3N0UnRwSDI2M1BheUNvbnRleHQKK3sKKyAgR3N0UnRwSDI2M1BheVBpYyAqcGljbGF5ZXI7CisKKyAgZ3VpbnQgbXR1OworICBndWludCB3aW5kb3c7CisgIGd1aW50OCAqd2luX2VuZDsKKyAgZ3VpbnQ4IGNwbTsKKworICBndWludCBub19nb2JzOworICBHc3RSdHBIMjYzUGF5R29iICoqZ29iczsKKworfTsKKworc3RydWN0IF9Hc3RSdHBIMjYzUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2M1BheUFIZWFkZXIKK3sKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisgIHVuc2lnbmVkIGludCBlYml0OjM7ICAgICAgICAgIC8qIEVuZCBwb3NpdGlvbiAqLworICB1bnNpZ25lZCBpbnQgc2JpdDozOyAgICAgICAgICAvKiBTdGFydCBwb3NpdGlvbiAqLworICB1bnNpZ25lZCBpbnQgcDoxOyAgICAgICAgICAgICAvKiBQQi1mcmFtZXMgbW9kZSAqLworICB1bnNpZ25lZCBpbnQgZjoxOyAgICAgICAgICAgICAvKiBmbGFnIGJpdCAqLworCisgIHVuc2lnbmVkIGludCByMToxOyAgICAgICAgICAgIC8qIFJlc2VydmVkICovCisgIHVuc2lnbmVkIGludCBhOjE7ICAgICAgICAgICAgIC8qIEFkdmFuY2VkIFByZWRpY3Rpb24gKi8KKyAgdW5zaWduZWQgaW50IHM6MTsgICAgICAgICAgICAgLyogc3ludGF4IGJhc2VkIGFyaXRobWV0aWMgY29kaW5nICovCisgIHVuc2lnbmVkIGludCB1OjE7ICAgICAgICAgICAgIC8qIFVucmVzdHJpY3RlZCBtb3Rpb24gdmVjdG9yICovCisgIHVuc2lnbmVkIGludCBpOjE7ICAgICAgICAgICAgIC8qIFBpY3R1cmUgY29kaW5nIHR5cGUgKi8KKyAgdW5zaWduZWQgaW50IHNyYzozOyAgICAgICAgICAgLyogU291cmNlIGZvcm1hdCAqLworCisgIHVuc2lnbmVkIGludCB0cmI6MzsgICAgICAgICAgIC8qIFRlbXBvcmFsIHJlZiBmb3IgQiBmcmFtZSAqLworICB1bnNpZ25lZCBpbnQgZGJxOjI7ICAgICAgICAgICAvKiBEaWZmZXJlbnRpYWwgUXVhbnRpc2F0aW9uIHBhcmFtZXRlciAqLworICB1bnNpZ25lZCBpbnQgcjI6MzsgICAgICAgICAgICAvKiBSZXNlcnZlZCAqLworI2VsaWYgR19CWVRFX09SREVSID09IEdfQklHX0VORElBTgorICB1bnNpZ25lZCBpbnQgZjoxOyAgICAgICAgICAgICAvKiBmbGFnIGJpdCAqLworICB1bnNpZ25lZCBpbnQgcDoxOyAgICAgICAgICAgICAvKiBQQi1mcmFtZXMgbW9kZSAqLworICB1bnNpZ25lZCBpbnQgc2JpdDozOyAgICAgICAgICAvKiBTdGFydCBwb3NpdGlvbiAqLworICB1bnNpZ25lZCBpbnQgZWJpdDozOyAgICAgICAgICAvKiBFbmQgcG9zaXRpb24gKi8KKworICB1bnNpZ25lZCBpbnQgc3JjOjM7ICAgICAgICAgICAvKiBTb3VyY2UgZm9ybWF0ICovCisgIHVuc2lnbmVkIGludCBpOjE7ICAgICAgICAgICAgIC8qIFBpY3R1cmUgY29kaW5nIHR5cGUgKi8KKyAgdW5zaWduZWQgaW50IHU6MTsgICAgICAgICAgICAgLyogVW5yZXN0cmljdGVkIG1vdGlvbiB2ZWN0b3IgKi8KKyAgdW5zaWduZWQgaW50IHM6MTsgICAgICAgICAgICAgLyogc3ludGF4IGJhc2VkIGFyaXRobWV0aWMgY29kaW5nICovCisgIHVuc2lnbmVkIGludCBhOjE7ICAgICAgICAgICAgIC8qIEFkdmFuY2VkIFByZWRpY3Rpb24gKi8KKyAgdW5zaWduZWQgaW50IHIxOjE7ICAgICAgICAgICAgLyogUmVzZXJ2ZWQgKi8KKworICB1bnNpZ25lZCBpbnQgcjI6MzsgICAgICAgICAgICAvKiBSZXNlcnZlZCAqLworICB1bnNpZ25lZCBpbnQgZGJxOjI7ICAgICAgICAgICAvKiBEaWZmZXJlbnRpYWwgUXVhbnRpc2F0aW9uIHBhcmFtZXRlciAqLworICB1bnNpZ25lZCBpbnQgdHJiOjM7ICAgICAgICAgICAvKiBUZW1wb3JhbCByZWYgZm9yIEIgZnJhbWUgKi8KKyNlbHNlCisjZXJyb3IgIkdfQllURV9PUkRFUiBzaG91bGQgYmUgYmlnIG9yIGxpdHRsZSBlbmRpYW4uIgorI2VuZGlmCisgIHVuc2lnbmVkIGludCB0cjo4OyAgICAgICAgICAgIC8qIFRlbXBvcmFsIHJlZiBmb3IgUCBmcmFtZSAqLworfSBHc3RSdHBIMjYzUGF5QUhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjNQYXlCSGVhZGVyCit7CisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorICB1bnNpZ25lZCBpbnQgZWJpdDozOyAgICAgICAgICAvKiBFbmQgcG9zaXRpb24gKi8KKyAgdW5zaWduZWQgaW50IHNiaXQ6MzsgICAgICAgICAgLyogU3RhcnQgcG9zaXRpb24gKi8KKyAgdW5zaWduZWQgaW50IHA6MTsgICAgICAgICAgICAgLyogUEItZnJhbWVzIG1vZGUgKi8KKyAgdW5zaWduZWQgaW50IGY6MTsgICAgICAgICAgICAgLyogZmxhZyBiaXQgKi8KKworICB1bnNpZ25lZCBpbnQgcXVhbnQ6NTsgICAgICAgICAvKiBRdWFudGl6YXRpb24gdmFsdWUgZm9yIGZpcnN0IE1CICovCisgIHVuc2lnbmVkIGludCBzcmM6MzsgICAgICAgICAgIC8qIFNvdXJjZSBmb3JtYXQgKi8KKworICB1bnNpZ25lZCBpbnQgbWJhMTozOyAgICAgICAgICAvKiBBZGRyZXNzIG9mIGZpcnN0IE1CIHN0YXJ0aW5nIGNvdW50IGZyb20gMCAtIHBhcnQxICovCisgIHVuc2lnbmVkIGludCBnb2JuOjU7ICAgICAgICAgIC8qIEdPQiBudW1iZXIgaW4gZWZmZWN0IGF0IHN0YXJ0IG9mIHBhY2tldCAqLworCisgIHVuc2lnbmVkIGludCByOjI7ICAgICAgICAgICAgIC8qIFJlc2VydmVkICovCisgIHVuc2lnbmVkIGludCBtYmEyOjY7ICAgICAgICAgIC8qIEFkZHJlc3Mgb2YgZmlyc3QgTUIgc3RhcnRpbmcgY291bnQgZnJvbSAwIC0gcGFydDIgKi8KKworICB1bnNpZ25lZCBpbnQgaG12MTE6NDsgICAgICAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAxIC0gcGFydCAxICovCisgIHVuc2lnbmVkIGludCBhOjE7ICAgICAgICAgICAgIC8qIEFkdmFuY2VkIFByZWRpY3Rpb24gKi8KKyAgdW5zaWduZWQgaW50IHM6MTsgICAgICAgICAgICAgLyogc3ludGF4IGJhc2VkIGFyaXRobWV0aWMgY29kaW5nICovCisgIHVuc2lnbmVkIGludCB1OjE7ICAgICAgICAgICAgIC8qIFVucmVzdHJpY3RlZCBtb3Rpb24gdmVjdG9yICovCisgIHVuc2lnbmVkIGludCBpOjE7ICAgICAgICAgICAgIC8qIFBpY3R1cmUgY29kaW5nIHR5cGUgKi8KKworICB1bnNpZ25lZCBpbnQgdm12MTE6NTsgICAgICAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBmb3IgTUIgMSAtIHBhcnQgMSAqLworICB1bnNpZ25lZCBpbnQgaG12MTI6MzsgICAgICAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAxIC0gcGFydCAyICovCisKKyAgdW5zaWduZWQgaW50IGhtdjIxOjY7ICAgICAgICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBmb3IgTUIgMyAtIHBhcnQgMSAqLworICB1bnNpZ25lZCBpbnQgdm12MTI6MjsgICAgICAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBmb3IgTUIgMSAtIHBhcnQgMiAqLworCisgIHVuc2lnbmVkIGludCB2bXYyMTo3OyAgICAgICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAzICovCisgIHVuc2lnbmVkIGludCBobXYyMjoxOyAgICAgICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IgZm9yIE1CIDMgLSBwYXJ0IDIgKi8KKworI2VsaWYgR19CWVRFX09SREVSID09IEdfQklHX0VORElBTgorICB1bnNpZ25lZCBpbnQgZjoxOyAgICAgICAgICAgICAvKiBmbGFnIGJpdCAqLworICB1bnNpZ25lZCBpbnQgcDoxOyAgICAgICAgICAgICAvKiBQQi1mcmFtZXMgbW9kZSAqLworICB1bnNpZ25lZCBpbnQgc2JpdDozOyAgICAgICAgICAvKiBTdGFydCBwb3NpdGlvbiAqLworICB1bnNpZ25lZCBpbnQgZWJpdDozOyAgICAgICAgICAvKiBFbmQgcG9zaXRpb24gKi8KKworICB1bnNpZ25lZCBpbnQgc3JjOjM7ICAgICAgICAgICAvKiBTb3VyY2UgZm9ybWF0ICovCisgIHVuc2lnbmVkIGludCBxdWFudDo1OyAgICAgICAgIC8qIFF1YW50aXphdGlvbiB2YWx1ZSBmb3IgZmlyc3QgTUIgKi8KKworICB1bnNpZ25lZCBpbnQgZ29ibjo1OyAgICAgICAgICAvKiBHT0IgbnVtYmVyIGluIGVmZmVjdCBhdCBzdGFydCBvZiBwYWNrZXQgKi8KKyAgdW5zaWduZWQgaW50IG1iYTE6MzsgICAgICAgICAgLyogQWRkcmVzcyBvZiBmaXJzdCBNQiBzdGFydGluZyBjb3VudCBmcm9tIDAgLSBwYXJ0MSAqLworCisgIHVuc2lnbmVkIGludCBtYmEyOjY7ICAgICAgICAgIC8qIEFkZHJlc3Mgb2YgZmlyc3QgTUIgc3RhcnRpbmcgY291bnQgZnJvbSAwIC0gcGFydDIgKi8KKyAgdW5zaWduZWQgaW50IHI6MjsgICAgICAgICAgICAgLyogUmVzZXJ2ZWQgKi8KKworICB1bnNpZ25lZCBpbnQgaToxOyAgICAgICAgICAgICAvKiBQaWN0dXJlIGNvZGluZyB0eXBlICovCisgIHVuc2lnbmVkIGludCB1OjE7ICAgICAgICAgICAgIC8qIFVucmVzdHJpY3RlZCBtb3Rpb24gdmVjdG9yICovCisgIHVuc2lnbmVkIGludCBzOjE7ICAgICAgICAgICAgIC8qIHN5bnRheCBiYXNlZCBhcml0aG1ldGljIGNvZGluZyAqLworICB1bnNpZ25lZCBpbnQgYToxOyAgICAgICAgICAgICAvKiBBZHZhbmNlZCBQcmVkaWN0aW9uICovCisgIHVuc2lnbmVkIGludCBobXYxMTo0OyAgICAgICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IgZm9yIE1CIDEgLSBwYXJ0IDEgKi8KKworICB1bnNpZ25lZCBpbnQgaG12MTI6MzsgICAgICAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAxIC0gcGFydCAyICovCisgIHVuc2lnbmVkIGludCB2bXYxMTo1OyAgICAgICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAxIC0gcGFydCAxICovCisKKyAgdW5zaWduZWQgaW50IHZtdjEyOjI7ICAgICAgICAgLyogdmVydGljYWwgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IgZm9yIE1CIDEgLSBwYXJ0IDIgKi8KKyAgdW5zaWduZWQgaW50IGhtdjIxOjY7ICAgICAgICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBmb3IgTUIgMyAtIHBhcnQgMSAqLworCisgIHVuc2lnbmVkIGludCBobXYyMjoxOyAgICAgICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IgZm9yIE1CIDMgLSBwYXJ0IDIgKi8KKyAgdW5zaWduZWQgaW50IHZtdjIxOjc7ICAgICAgICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAzICovCisjZWxzZQorI2Vycm9yICJHX0JZVEVfT1JERVIgc2hvdWxkIGJlIGJpZyBvciBsaXR0bGUgZW5kaWFuLiIKKyNlbmRpZgorfSBHc3RSdHBIMjYzUGF5QkhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjNQYXlDSGVhZGVyCit7CisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorICB1bnNpZ25lZCBpbnQgZWJpdDozOyAgICAgICAgICAvKiBFbmQgcG9zaXRpb24gKi8KKyAgdW5zaWduZWQgaW50IHNiaXQ6MzsgICAgICAgICAgLyogU3RhcnQgcG9zaXRpb24gKi8KKyAgdW5zaWduZWQgaW50IHA6MTsgICAgICAgICAgICAgLyogUEItZnJhbWVzIG1vZGUgKi8KKyAgdW5zaWduZWQgaW50IGY6MTsgICAgICAgICAgICAgLyogZmxhZyBiaXQgKi8KKworICB1bnNpZ25lZCBpbnQgcXVhbnQ6NTsgICAgICAgICAvKiBRdWFudGl6YXRpb24gdmFsdWUgZm9yIGZpcnN0IE1CICovCisgIHVuc2lnbmVkIGludCBzcmM6MzsgICAgICAgICAgIC8qIFNvdXJjZSBmb3JtYXQgKi8KKworICB1bnNpZ25lZCBpbnQgbWJhMTozOyAgICAgICAgICAvKiBBZGRyZXNzIG9mIGZpcnN0IE1CIHN0YXJ0aW5nIGNvdW50IGZyb20gMCAtIHBhcnQxICovCisgIHVuc2lnbmVkIGludCBnb2JuOjU7ICAgICAgICAgIC8qIEdPQiBudW1iZXIgaW4gZWZmZWN0IGF0IHN0YXJ0IG9mIHBhY2tldCAqLworCisgIHVuc2lnbmVkIGludCByOjI7ICAgICAgICAgICAgIC8qIFJlc2VydmVkICovCisgIHVuc2lnbmVkIGludCBtYmEyOjY7ICAgICAgICAgIC8qIEFkZHJlc3Mgb2YgZmlyc3QgTUIgc3RhcnRpbmcgY291bnQgZnJvbSAwIC0gcGFydDIgKi8KKworICB1bnNpZ25lZCBpbnQgaG12MTE6NDsgICAgICAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAxIC0gcGFydCAxICovCisgIHVuc2lnbmVkIGludCBhOjE7ICAgICAgICAgICAgIC8qIEFkdmFuY2VkIFByZWRpY3Rpb24gKi8KKyAgdW5zaWduZWQgaW50IHM6MTsgICAgICAgICAgICAgLyogc3ludGF4IGJhc2VkIGFyaXRobWV0aWMgY29kaW5nICovCisgIHVuc2lnbmVkIGludCB1OjE7ICAgICAgICAgICAgIC8qIFVucmVzdHJpY3RlZCBtb3Rpb24gdmVjdG9yICovCisgIHVuc2lnbmVkIGludCBpOjE7ICAgICAgICAgICAgIC8qIFBpY3R1cmUgY29kaW5nIHR5cGUgKi8KKworICB1bnNpZ25lZCBpbnQgdm12MTE6NTsgICAgICAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBmb3IgTUIgMSAtIHBhcnQgMSAqLworICB1bnNpZ25lZCBpbnQgaG12MTI6MzsgICAgICAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAxIC0gcGFydCAyICovCisKKyAgdW5zaWduZWQgaW50IGhtdjIxOjY7ICAgICAgICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBmb3IgTUIgMyAtIHBhcnQgMSAqLworICB1bnNpZ25lZCBpbnQgdm12MTI6MjsgICAgICAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBmb3IgTUIgMSAtIHBhcnQgMiAqLworCisgIHVuc2lnbmVkIGludCB2bXYyMTo3OyAgICAgICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAzICovCisgIHVuc2lnbmVkIGludCBobXYyMjoxOyAgICAgICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IgZm9yIE1CIDMgLSBwYXJ0IDIgKi8KKworICB1bnNpZ25lZCBpbnQgcnIxOjg7ICAgICAgICAgICAvKiByZXNlcnZlZCAqLworCisgIHVuc2lnbmVkIGludCBycjI6ODsgICAgICAgICAgIC8qIHJlc2VydmVkICovCisKKyAgdW5zaWduZWQgaW50IHRyYjozOyAgICAgICAgICAgLyogVGVtcG9yYWwgUmVmZXJlbmNlIGZvciB0aGUgQiAqLworICB1bnNpZ25lZCBpbnQgZGJxOjI7ICAgICAgICAgICAvKiBEaWZmZXJlbnRpYWwgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAqLworICB1bnNpZ25lZCBpbnQgcnIzOjM7ICAgICAgICAgICAvKiByZXNlcnZlZCAqLworCisgIHVuc2lnbmVkIGludCB0cjo4OyAgICAgICAgICAgIC8qIFRlbXBvcmFsIFJlZmVyZW5jZSBmb3IgdGhlIFAgZnJhbWUgKi8KKworI2VsaWYgR19CWVRFX09SREVSID09IEdfQklHX0VORElBTgorICB1bnNpZ25lZCBpbnQgZjoxOyAgICAgICAgICAgICAvKiBmbGFnIGJpdCAqLworICB1bnNpZ25lZCBpbnQgcDoxOyAgICAgICAgICAgICAvKiBQQi1mcmFtZXMgbW9kZSAqLworICB1bnNpZ25lZCBpbnQgc2JpdDozOyAgICAgICAgICAvKiBTdGFydCBwb3NpdGlvbiAqLworICB1bnNpZ25lZCBpbnQgZWJpdDozOyAgICAgICAgICAvKiBFbmQgcG9zaXRpb24gKi8KKworICB1bnNpZ25lZCBpbnQgc3JjOjM7ICAgICAgICAgICAvKiBTb3VyY2UgZm9ybWF0ICovCisgIHVuc2lnbmVkIGludCBxdWFudDo1OyAgICAgICAgIC8qIFF1YW50aXphdGlvbiB2YWx1ZSBmb3IgZmlyc3QgTUIgKi8KKworICB1bnNpZ25lZCBpbnQgZ29ibjo1OyAgICAgICAgICAvKiBHT0IgbnVtYmVyIGluIGVmZmVjdCBhdCBzdGFydCBvZiBwYWNrZXQgKi8KKyAgdW5zaWduZWQgaW50IG1iYTE6MzsgICAgICAgICAgLyogQWRkcmVzcyBvZiBmaXJzdCBNQiBzdGFydGluZyBjb3VudCBmcm9tIDAgLSBwYXJ0MSAqLworCisgIHVuc2lnbmVkIGludCBtYmEyOjY7ICAgICAgICAgIC8qIEFkZHJlc3Mgb2YgZmlyc3QgTUIgc3RhcnRpbmcgY291bnQgZnJvbSAwIC0gcGFydDIgKi8KKyAgdW5zaWduZWQgaW50IHI6MjsgICAgICAgICAgICAgLyogUmVzZXJ2ZWQgKi8KKworICB1bnNpZ25lZCBpbnQgaToxOyAgICAgICAgICAgICAvKiBQaWN0dXJlIGNvZGluZyB0eXBlICovCisgIHVuc2lnbmVkIGludCB1OjE7ICAgICAgICAgICAgIC8qIFVucmVzdHJpY3RlZCBtb3Rpb24gdmVjdG9yICovCisgIHVuc2lnbmVkIGludCBzOjE7ICAgICAgICAgICAgIC8qIHN5bnRheCBiYXNlZCBhcml0aG1ldGljIGNvZGluZyAqLworICB1bnNpZ25lZCBpbnQgYToxOyAgICAgICAgICAgICAvKiBBZHZhbmNlZCBQcmVkaWN0aW9uICovCisgIHVuc2lnbmVkIGludCBobXYxMTo0OyAgICAgICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IgZm9yIE1CIDEgLSBwYXJ0IDEgKi8KKworICB1bnNpZ25lZCBpbnQgaG12MTI6MzsgICAgICAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAxIC0gcGFydCAyICovCisgIHVuc2lnbmVkIGludCB2bXYxMTo1OyAgICAgICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAxIC0gcGFydCAxICovCisKKyAgdW5zaWduZWQgaW50IHZtdjEyOjI7ICAgICAgICAgLyogdmVydGljYWwgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IgZm9yIE1CIDEgLSBwYXJ0IDIgKi8KKyAgdW5zaWduZWQgaW50IGhtdjIxOjY7ICAgICAgICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHByZWRpY3RvciBmb3IgTUIgMyAtIHBhcnQgMSAqLworCisgIHVuc2lnbmVkIGludCBobXYyMjoxOyAgICAgICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IgZm9yIE1CIDMgLSBwYXJ0IDIgKi8KKyAgdW5zaWduZWQgaW50IHZtdjIxOjc7ICAgICAgICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGZvciBNQiAzICovCisgIHVuc2lnbmVkIGludCBycjE6ODsgICAgICAgICAgIC8qIHJlc2VydmVkICovCisgIHVuc2lnbmVkIGludCBycjI6ODsgICAgICAgICAgIC8qIHJlc2VydmVkICovCisKKyAgdW5zaWduZWQgaW50IHJyMzozOyAgICAgICAgICAgLyogcmVzZXJ2ZWQgKi8KKyAgdW5zaWduZWQgaW50IGRicToyOyAgICAgICAgICAgLyogRGlmZmVyZW50aWFsIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKi8KKyAgdW5zaWduZWQgaW50IHRyYjozOyAgICAgICAgICAgLyogVGVtcG9yYWwgUmVmZXJlbmNlIGZvciB0aGUgQiAqLworCisgIHVuc2lnbmVkIGludCB0cjo4OyAgICAgICAgICAgIC8qIFRlbXBvcmFsIFJlZmVyZW5jZSBmb3IgdGhlIFAgZnJhbWUgKi8KKyNlbHNlCisjZXJyb3IgIkdfQllURV9PUkRFUiBzaG91bGQgYmUgYmlnIG9yIGxpdHRsZSBlbmRpYW4uIgorI2VuZGlmCit9IEdzdFJ0cEgyNjNQYXlDSGVhZGVyOworCitzdHJ1Y3QgX0dzdFJ0cEgyNjNQYXlQaWMKK3sKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisgIHVuc2lnbmVkIGludCBwc2MxOjE2OworCisgIHVuc2lnbmVkIGludCB0cjE6MjsKKyAgdW5zaWduZWQgaW50IHBzYzI6NjsKKworICB1bnNpZ25lZCBpbnQgcHR5cGVfMjYzOjE7CisgIHVuc2lnbmVkIGludCBwdHlwZV9zdGFydDoxOworICB1bnNpZ25lZCBpbnQgdHIyOjY7CisKKyAgdW5zaWduZWQgaW50IHB0eXBlX3Vtdm1vZGU6MTsKKyAgdW5zaWduZWQgaW50IHB0eXBlX3BpY3R5cGU6MTsKKyAgdW5zaWduZWQgaW50IHB0eXBlX3NyY2Zvcm1hdDozOworICB1bnNpZ25lZCBpbnQgcHR5cGVfZnJlZXplOjE7CisgIHVuc2lnbmVkIGludCBwdHlwZV9jYW1lcmE6MTsKKyAgdW5zaWduZWQgaW50IHB0eXBlX3NwbGl0OjE7CisKKyAgdW5zaWduZWQgaW50IHBxdWFudDo1OworICB1bnNpZ25lZCBpbnQgcHR5cGVfcGJtb2RlOjE7CisgIHVuc2lnbmVkIGludCBwdHlwZV9hcG1vZGU6MTsKKyAgdW5zaWduZWQgaW50IHB0eXBlX3NhY21vZGU6MTsKKworI2VsaWYgR19CWVRFX09SREVSID09IEdfQklHX0VORElBTgorICB1bnNpZ25lZCBpbnQgcHNjMToxNjsKKworICB1bnNpZ25lZCBpbnQgcHNjMjo2OworICB1bnNpZ25lZCBpbnQgdHIxOjI7CisKKyAgdW5zaWduZWQgaW50IHRyMjo2OworICB1bnNpZ25lZCBpbnQgcHR5cGVfc3RhcnQ6MjsKKworICB1bnNpZ25lZCBpbnQgcHR5cGVfc3BsaXQ6MTsKKyAgdW5zaWduZWQgaW50IHB0eXBlX2NhbWVyYToxOworICB1bnNpZ25lZCBpbnQgcHR5cGVfZnJlZXplOjE7CisgIHVuc2lnbmVkIGludCBwdHlwZV9zcmNmb3JtYXQ6MzsKKyAgdW5zaWduZWQgaW50IHB0eXBlX3BpY3R5cGU6MTsKKyAgdW5zaWduZWQgaW50IHB0eXBlX3Vtdm1vZGU6MTsKKworICB1bnNpZ25lZCBpbnQgcHR5cGVfc2FjbW9kZToxOworICB1bnNpZ25lZCBpbnQgcHR5cGVfYXBtb2RlOjE7CisgIHVuc2lnbmVkIGludCBwdHlwZV9wYm1vZGU6MTsKKyAgdW5zaWduZWQgaW50IHBxdWFudDo1OworCisjZWxzZQorI2Vycm9yICJHX0JZVEVfT1JERVIgc2hvdWxkIGJlIGJpZyBvciBsaXR0bGUgZW5kaWFuLiIKKyNlbmRpZgorfTsKKworc3RydWN0IF9Hc3RSdHBIMjYzUGF5Qm91bmRyeQoreworCisgIGd1aW50OCAqc3RhcnQ7CisgIGd1aW50OCAqZW5kOworICBndWludDggc2JpdDsKKyAgZ3VpbnQ4IGViaXQ7CisKK307CisKK3N0cnVjdCBfR3N0UnRwSDI2M1BheU1CCit7CisgIGd1aW50OCAqc3RhcnQ7CisgIGd1aW50OCAqZW5kOworICBndWludDggc2JpdDsKKyAgZ3VpbnQ4IGViaXQ7CisgIGd1aW50IGxlbmd0aDsKKworICBndWludDggbWJfdHlwZTsKKyAgZ3VpbnQgcXVhbnQ7CisKKyAgZ3VpbnQgbWJhOworICBndWludDggbXZkWzEwXTsKK307CisKK3N0cnVjdCBfR3N0UnRwSDI2M1BheUdvYgoreworICBndWludDggKnN0YXJ0OworICBndWludDggKmVuZDsKKyAgZ3VpbnQgbGVuZ3RoOworICBndWludDggc2JpdDsKKyAgZ3VpbnQ4IGViaXQ7CisKKyAgZ3VpbnQgZ29ibjsKKyAgZ3VpbnQgcXVhbnQ7CisKKyAgR3N0UnRwSDI2M1BheU1CICoqbWFjcm9ibG9ja3M7CisgIGd1aW50IG5tYWNyb2Jsb2NzOworfTsKKworc3RydWN0IF9Hc3RSdHBIMjYzUGF5UGFja2FnZQoreworICBndWludDggKnBheWxvYWRfc3RhcnQ7CisgIGd1aW50OCAqcGF5bG9hZF9lbmQ7CisgIGd1aW50IHBheWxvYWRfbGVuOworICBndWludDggc2JpdDsKKyAgZ3VpbnQ4IGViaXQ7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBnYm9vbGVhbiBtYXJrZXI7CisKKyAgR3N0UnRwSDI2M1BheUhlYWRlck1vZGUgbW9kZTsKKworICAvKgorICAgKiAgbW9kZSBCLEMgZGF0YQorICAgKi8KKworICBndWludDE2IG1iYTsKKyAgZ3VpbnQgbm12ZDsKKyAgZ3VpbnQ4IG12ZFsxMF07CisgIGd1aW50IGdvYm47CisgIGd1aW50IHF1YW50OworfTsKKworI2RlZmluZSBHU1RfSDI2M19QSUNUVVJFTEFZRVJfUExTUkMoYnVmKSAoKChHc3RSdHBIMjYzUGF5UGljICopKGJ1ZikpLT5wdHlwZV9zcmNmb3JtYXQpCisjZGVmaW5lIEdTVF9IMjYzX1BJQ1RVUkVMQVlFUl9QTFRZUEUoYnVmKSAoKChHc3RSdHBIMjYzUGF5UGljICopKGJ1ZikpLT5wdHlwZV9waWN0eXBlKQorI2RlZmluZSBHU1RfSDI2M19QSUNUVVJFTEFZRVJfUExVTVYoYnVmKSAoKChHc3RSdHBIMjYzUGF5UGljICopKGJ1ZikpLT5wdHlwZV91bXZtb2RlKQorI2RlZmluZSBHU1RfSDI2M19QSUNUVVJFTEFZRVJfUExTQUMoYnVmKSAoKChHc3RSdHBIMjYzUGF5UGljICopKGJ1ZikpLT5wdHlwZV9zYWNtb2RlKQorI2RlZmluZSBHU1RfSDI2M19QSUNUVVJFTEFZRVJfUExBUChidWYpICgoKEdzdFJ0cEgyNjNQYXlQaWMgKikoYnVmKSktPnB0eXBlX2FwbW9kZSkKKworLyoKKyAqIFRPRE86IFBCIGZyYW1lIHJlbGV2YW50IHRhYmxlcworICovCisKKyNkZWZpbmUgR1NUX1JUUF9IMjYzX1BBWV9FTkQoc3RhcnQsIGxlbikgKCgoZ3VpbnQ4ICopc3RhcnQpICsgKChndWludClsZW4pKQorI2RlZmluZSBHU1RfUlRQX0gyNjNfUEFZX0dPQk4oZ29iKSAoKCgoKGd1aW50OCAqKSBnb2IpWzJdID4+IDIpICYgMHgxZikKKworR1R5cGUgZ3N0X3J0cF9oMjYzX3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfaDI2M19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19HU1RfUlRQX0gyNjNfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWZjNDBjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBoMjYzcGRlcGF5LmMKQEAgLTAsMCArMSw0MDMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlICJnc3RydHBoMjYzcGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwaDI2M3BkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwaDI2M3BkZXBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2M3BfZGVwYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWgyNjMsICIgInZhcmlhbnQgPSAoc3RyaW5nKSBcIml0dVwiICIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2M3BfZGVwYXlfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWF0sICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkgyNjMtMTk5OFwiOyAiCisgICAgICAgIC8qIG9wdGlvbmFsIHBhcmFtcyAqLworICAgICAgICAvKiBOT1RFIGFsbCBvcHRpb25hbCBTRFAgcGFyYW1zIG11c3QgYmUgc3RyaW5ncyBpbiB0aGUgY2FwcyAqLworICAgICAgICAvKgorICAgICAgICAgICAic3FjaWYgPSAoc3RyaW5nKSBbMSwgMzJdLCAiCisgICAgICAgICAgICJxY2lmID0gKHN0cmluZykgWzEsIDMyXSwgIgorICAgICAgICAgICAiY2lmID0gKHN0cmluZykgWzEsIDMyXSwgIgorICAgICAgICAgICAiY2lmNCA9IChzdHJpbmcpIFsxLCAzMl0sICIKKyAgICAgICAgICAgImNpZjE2ID0gKHN0cmluZykgWzEsIDMyXSwgIgorICAgICAgICAgICAiY3VzdG9tID0gKHN0cmluZykgQU5ZLCAiCisgICAgICAgICAgICJmID0gKHN0cmluZykgezAsIDF9LCIKKyAgICAgICAgICAgImkgPSAoc3RyaW5nKSB7MCwgMX0sIgorICAgICAgICAgICAiaiA9IChzdHJpbmcpIHswLCAxfSwiCisgICAgICAgICAgICJ0ID0gKHN0cmluZykgezAsIDF9LCIKKyAgICAgICAgICAgImsgPSAoc3RyaW5nKSB7MSwgMiwgMywgNH0sIgorICAgICAgICAgICAibiA9IChzdHJpbmcpIHsxLCAyLCAzLCA0fSwiCisgICAgICAgICAgICJwID0gKHN0cmluZykgQU5ZLCIKKyAgICAgICAgICAgInBhciA9IChzdHJpbmcpIEFOWSwgIgorICAgICAgICAgICAiY3BjZiA9IChzdHJpbmcpIEFOWSwgIgorICAgICAgICAgICAiYnBwID0gKHN0cmluZykgWzAsIDY1NTM2XSwgIgorICAgICAgICAgICAiaHJkID0gKHN0cmluZykgezAsIDF9OyAiCisgICAgICAgICAqLworICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWF0sICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkgyNjMtMjAwMFwiICIKKyAgICAgICAgLyogb3B0aW9uYWwgcGFyYW1zICovCisgICAgICAgIC8qIE5PVEUgYWxsIG9wdGlvbmFsIFNEUCBwYXJhbXMgbXVzdCBiZSBzdHJpbmdzIGluIHRoZSBjYXBzICovCisgICAgICAgIC8qCisgICAgICAgICAgICJwcm9maWxlID0gKHN0cmluZykgWzAsIDEwXSwgIgorICAgICAgICAgICAibGV2ZWwgPSAoc3RyaW5nKSB7MTAsIDIwLCAzMCwgNDAsIDQ1LCA1MCwgNjAsIDcwfSwgIgorICAgICAgICAgICAiaW50ZXJsYWNlID0gKHN0cmluZykgezAsIDF9OyIKKyAgICAgICAgICovCisgICAgKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF9oMjYzcF9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBIMjYzUERlcGF5LCBnc3RfcnRwX2gyNjNwX2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2M3BfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9oMjYzcF9kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKgorICAgIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX2gyNjNwX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKK2dib29sZWFuIGdzdF9ydHBfaDI2M3BfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGZpbHRlciwKKyAgICBHc3RDYXBzICogY2Fwcyk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjNwX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEgyNjNQRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX2gyNjNwX2RlcGF5X2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfaDI2M3BfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaDI2M3BfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9oMjYzcF9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBIMjYzIGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBIMjYzLysvKysgdmlkZW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDQ2MjkpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfaDI2M3BfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2gyNjNwX2RlcGF5X3NldGNhcHM7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGgyNjNwZGVwYXlfZGVidWcsICJydHBoMjYzcGRlcGF5IiwgMCwKKyAgICAgICJIMjYzKyBWaWRlbyBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2M3BfZGVwYXlfaW5pdCAoR3N0UnRwSDI2M1BEZXBheSAqIHJ0cGgyNjNwZGVwYXkpCit7CisgIHJ0cGgyNjNwZGVwYXktPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjNwX2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSdHBIMjYzUERlcGF5ICpydHBoMjYzcGRlcGF5OworCisgIHJ0cGgyNjNwZGVwYXkgPSBHU1RfUlRQX0gyNjNQX0RFUEFZIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChydHBoMjYzcGRlcGF5LT5hZGFwdGVyKTsKKyAgcnRwaDI2M3BkZXBheS0+YWRhcHRlciA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9oMjYzcF9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZmlsdGVyLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0Q2FwcyAqc3JjY2FwcyA9IE5VTEw7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgY29uc3QgZ2NoYXIgKmVuY29kaW5nX25hbWUgPSBOVUxMOworICBnYm9vbGVhbiByZXM7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDkwMDAwOyAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgZmlsdGVyLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICBlbmNvZGluZ19uYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJlbmNvZGluZy1uYW1lIik7CisgIGlmIChlbmNvZGluZ19uYW1lID09IE5VTEwpCisgICAgZ290byBub19lbmNvZGluZ19uYW1lOworCisgIGlmIChnX2FzY2lpX3N0cmNhc2VjbXAgKGVuY29kaW5nX25hbWUsICJIMjYzLTIwMDAiKSA9PSAwKSB7CisgICAgLyogYWx3YXlzIGgyNjMrKyAqLworICAgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1oMjYzIiwKKyAgICAgICAgInZhcmlhbnQiLCBHX1RZUEVfU1RSSU5HLCAiaXR1IiwKKyAgICAgICAgImgyNjN2ZXJzaW9uIiwgR19UWVBFX1NUUklORywgImgyNjNwcCIsIE5VTEwpOworICB9IGVsc2UgaWYgKGdfYXNjaWlfc3RyY2FzZWNtcCAoZW5jb2RpbmdfbmFtZSwgIkgyNjMtMTk5OCIpID09IDApIHsKKyAgICAvKiB0aGlzIGNhbiBiZSBIMjYzIG9yIEgyNjMrIGRlcGVuZGluZyBvbiBkZWZpbmVkIGFwcGVuZGl4ZXMgaW4gdGhlIG9wdGlvbmFsCisgICAgICogU0RQIHBhcmFtcyAqLworICAgIGNvbnN0IGdjaGFyICpGLCAqSSwgKkosICpULCAqSywgKk4sICpQOworICAgIGdib29sZWFuIGlzX2gyNjNwID0gRkFMU0U7CisKKyAgICBGID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJmIik7CisgICAgaWYgKEYpCisgICAgICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wIChGLCAiMSIpID09IDApCisgICAgICAgIGlzX2gyNjNwID0gVFJVRTsKKyAgICBJID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJpIik7CisgICAgaWYgKEkpCisgICAgICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wIChJLCAiMSIpID09IDApCisgICAgICAgIGlzX2gyNjNwID0gVFJVRTsKKyAgICBKID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJqIik7CisgICAgaWYgKEopCisgICAgICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wIChKLCAiMSIpID09IDApCisgICAgICAgIGlzX2gyNjNwID0gVFJVRTsKKyAgICBUID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJ0Iik7CisgICAgaWYgKFQpCisgICAgICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wIChULCAiMSIpID09IDApCisgICAgICAgIGlzX2gyNjNwID0gVFJVRTsKKyAgICBLID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJrIik7CisgICAgaWYgKEspCisgICAgICBpc19oMjYzcCA9IFRSVUU7CisgICAgTiA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAibiIpOworICAgIGlmIChOKQorICAgICAgaXNfaDI2M3AgPSBUUlVFOworICAgIFAgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgInAiKTsKKyAgICBpZiAoUCkKKyAgICAgIGlzX2gyNjNwID0gVFJVRTsKKworICAgIGlmIChpc19oMjYzcCkgeworICAgICAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWgyNjMiLAorICAgICAgICAgICJ2YXJpYW50IiwgR19UWVBFX1NUUklORywgIml0dSIsCisgICAgICAgICAgImgyNjN2ZXJzaW9uIiwgR19UWVBFX1NUUklORywgImgyNjNwIiwgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1oMjYzIiwKKyAgICAgICAgICAidmFyaWFudCIsIEdfVFlQRV9TVFJJTkcsICJpdHUiLAorICAgICAgICAgICJoMjYzdmVyc2lvbiIsIEdfVFlQRV9TVFJJTkcsICJoMjYzIiwgTlVMTCk7CisgICAgfQorICB9CisgIGlmICghc3JjY2FwcykKKyAgICBnb3RvIG5vX2NhcHM7CisKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKGZpbHRlciksIHNyY2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK25vX2VuY29kaW5nX25hbWU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChmaWx0ZXIsICJubyBlbmNvZGluZy1uYW1lIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19jYXBzOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZmlsdGVyLCAiaW52YWxpZCBlbmNvZGluZy1uYW1lIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9oMjYzcF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0UnRwSDI2M1BEZXBheSAqcnRwaDI2M3BkZXBheTsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIGdpbnQgcGF5bG9hZF9sZW47CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgZ2Jvb2xlYW4gUCwgViwgTTsKKyAgZ3VpbnQgaGVhZGVyX2xlbjsKKyAgZ3VpbnQ4IFBMRU4sIFBFQklUOworCisgIHJ0cGgyNjNwZGVwYXkgPSBHU1RfUlRQX0gyNjNQX0RFUEFZIChkZXBheWxvYWQpOworCisgIC8qIGZsdXNoIHJlbWFpbmluZyBkYXRhIG9uIGRpc2NvbnQgKi8KKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAocnRwLT5idWZmZXIpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlcGF5bG9hZCwgIkRJU0NPTlQsIGZsdXNoaW5nIGFkYXB0ZXIiKTsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRwaDI2M3BkZXBheS0+YWRhcHRlcik7CisgICAgcnRwaDI2M3BkZXBheS0+d2FpdF9zdGFydCA9IFRSVUU7CisgIH0KKworICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKyAgaGVhZGVyX2xlbiA9IDI7CisKKyAgaWYgKHBheWxvYWRfbGVuIDwgaGVhZGVyX2xlbikKKyAgICBnb3RvIHRvb19zbWFsbDsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisKKyAgTSA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgLyogIDAgICAgICAgICAgICAgICAgICAgMQorICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNQorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgIFJSICAgIHxQfFZ8ICAgUExFTiAgICB8UEVCSVR8CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKi8KKyAgUCA9IChwYXlsb2FkWzBdICYgMHgwNCkgPT0gMHgwNDsKKyAgViA9IChwYXlsb2FkWzBdICYgMHgwMikgPT0gMHgwMjsKKyAgUExFTiA9ICgocGF5bG9hZFswXSAmIDB4MSkgPDwgNSkgfCAocGF5bG9hZFsxXSA+PiAzKTsKKyAgUEVCSVQgPSBwYXlsb2FkWzFdICYgMHg3OworCisgIEdTVF9MT0dfT0JKRUNUIChkZXBheWxvYWQsICJQICVkLCBWICVkLCBQTEVOICVkLCBQRUJJVCAlZCIsIFAsIFYsIFBMRU4sCisgICAgICBQRUJJVCk7CisKKyAgaWYgKFYpIHsKKyAgICBoZWFkZXJfbGVuKys7CisgIH0KKyAgaWYgKFBMRU4pIHsKKyAgICBoZWFkZXJfbGVuICs9IFBMRU47CisgIH0KKworICBpZiAoKCFQICYmIHBheWxvYWRfbGVuIDwgaGVhZGVyX2xlbikgfHwgKFAgJiYgcGF5bG9hZF9sZW4gPCBoZWFkZXJfbGVuIC0gMikpCisgICAgZ290byB0b29fc21hbGw7CisKKyAgaWYgKFApIHsKKyAgICBydHBoMjYzcGRlcGF5LT53YWl0X3N0YXJ0ID0gRkFMU0U7CisgICAgaGVhZGVyX2xlbiAtPSAyOworICB9CisKKyAgaWYgKHJ0cGgyNjNwZGVwYXktPndhaXRfc3RhcnQpCisgICAgZ290byB3YWl0aW5nX3N0YXJ0OworCisgIGlmIChwYXlsb2FkX2xlbiA8IGhlYWRlcl9sZW4pCisgICAgZ290byB0b29fc21hbGw7CisKKyAgLyogRklYTUUgZG8gbm90IGlnbm9yZSB0aGUgVlJDIGhlYWRlciAoU2VlIFJGQyAyNDI5IHNlY3Rpb24gNC4yKSAqLworICAvKiBGSVhNRSBhY3R1YWxseSB1c2UgdGhlIFJUUCBwaWN0dXJlIGhlYWRlciB3aGVuIGl0IGlzIGxvc3QgaW4gdGhlIG5ldHdvcmsgKi8KKyAgLyogZm9yIG5vdyBzdHJpcCBvZmYgaGVhZGVyICovCisgIHBheWxvYWRfbGVuIC09IGhlYWRlcl9sZW47CisKKyAgaWYgKE0pIHsKKyAgICAvKiBmcmFtZSBpcyBjb21wbGV0ZWQ6IGFwcGVuZCB0byBwcmV2aW91cywgcHVzaCBpdCBvdXQgKi8KKyAgICBndWludCBsZW4sIHBhZGxlbjsKKyAgICBndWludCBhdmFpbDsKKyAgICBHc3RCdWZmZXIgKnBhZGJ1ZjsKKworICAgIEdTVF9MT0dfT0JKRUNUIChkZXBheWxvYWQsICJGcmFtZSBjb21wbGV0ZSIpOworCisgICAgb3V0YnVmID0KKyAgICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfc3ViYnVmZmVyIChydHAsIGhlYWRlcl9sZW4sIHBheWxvYWRfbGVuKTsKKyAgICBpZiAoUCkKKyAgICAgIGdzdF9idWZmZXJfbWVtc2V0IChvdXRidWYsIDAsIDAsIDIpOworICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGgyNjNwZGVwYXktPmFkYXB0ZXIsIG91dGJ1Zik7CisgICAgb3V0YnVmID0gTlVMTDsKKworICAgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBoMjYzcGRlcGF5LT5hZGFwdGVyKTsKKyAgICBsZW4gPSBhdmFpbCArIHBheWxvYWRfbGVuOworICAgIHBhZGxlbiA9IChsZW4gJSA0KSArIDQ7CisKKyAgICBpZiAoYXZhaWwgPT0gMCkKKyAgICAgIGdvdG8gZW1wdHlfZnJhbWU7CisKKyAgICBvdXRidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwaDI2M3BkZXBheS0+YWRhcHRlciwgYXZhaWwpOworICAgIGlmIChwYWRsZW4pIHsKKyAgICAgIHBhZGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAocGFkbGVuKTsKKyAgICAgIGdzdF9idWZmZXJfbWVtc2V0IChwYWRidWYsIDAsIDAsIHBhZGxlbik7CisgICAgICBvdXRidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAob3V0YnVmLCBwYWRidWYpOworICAgIH0KKworICAgIGdzdF9ydHBfZHJvcF9ub25fdmlkZW9fbWV0YSAocnRwaDI2M3BkZXBheSwgb3V0YnVmKTsKKworICAgIHJldHVybiBvdXRidWY7CisgIH0gZWxzZSB7CisgICAgLyogZnJhbWUgbm90IGNvbXBsZXRlZDogc3RvcmUgaW4gYWRhcHRlciAqLworICAgIEdTVF9MT0dfT0JKRUNUIChkZXBheWxvYWQsICJGcmFtZSBpbmNvbXBsZXRlLCBzdG9yaW5nICVkIiwgcGF5bG9hZF9sZW4pOworCisgICAgb3V0YnVmID0KKyAgICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfc3ViYnVmZmVyIChydHAsIGhlYWRlcl9sZW4sIHBheWxvYWRfbGVuKTsKKyAgICBpZiAoUCkKKyAgICAgIGdzdF9idWZmZXJfbWVtc2V0IChvdXRidWYsIDAsIDAsIDIpOworICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGgyNjNwZGVwYXktPmFkYXB0ZXIsIG91dGJ1Zik7CisgIH0KKyAgcmV0dXJuIE5VTEw7CisKK3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cGgyNjNwZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIlBhY2tldCBwYXlsb2FkIHdhcyB0b28gc21hbGwiKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQord2FpdGluZ19zdGFydDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwZGVwYXksICJ3YWl0aW5nIGZvciBwaWN0dXJlIHN0YXJ0Iik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2VtcHR5X2ZyYW1lOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChydHBoMjYzcGRlcGF5LCAiRGVwYXlsb2FkZWQgZnJhbWUgaXMgZW1wdHksIGRyb3BwaW5nIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2gyNjNwX2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UnRwSDI2M1BEZXBheSAqcnRwaDI2M3BkZXBheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJ0cGgyNjNwZGVwYXkgPSBHU1RfUlRQX0gyNjNQX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRwaDI2M3BkZXBheS0+YWRhcHRlcik7CisgICAgICBydHBoMjYzcGRlcGF5LT53YWl0X3N0YXJ0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2gyNjNwX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwaDI2M3BkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9IMjYzUF9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwaDI2M3BkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZGIyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGgyNjNwZGVwYXkuaApAQCAtMCwwICsxLDYyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfSDI2M1BfREVQQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9IMjYzUF9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfSDI2M1BfREVQQVkgXAorICAoZ3N0X3J0cF9oMjYzcF9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0gyNjNQX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0gyNjNQX0RFUEFZLEdzdFJ0cEgyNjNQRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX0gyNjNQX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9IMjYzUF9ERVBBWSxHc3RSdHBIMjYzUERlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0gyNjNQX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0gyNjNQX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9IMjYzUF9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSDI2M1BfREVQQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2M1BEZXBheSBHc3RSdHBIMjYzUERlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjNQRGVwYXlDbGFzcyBHc3RSdHBIMjYzUERlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwSDI2M1BEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKKworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBnYm9vbGVhbiAgICB3YWl0X3N0YXJ0OworfTsKKworc3RydWN0IF9Hc3RSdHBIMjYzUERlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfaDI2M3BfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2gyNjNwX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0gyNjNQX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jIGIvZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3M2YwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGgyNjNwcGF5LmMKQEAgLTAsMCArMSw4MTQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSAiZ3N0cnRwaDI2M3BwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCisjZGVmaW5lIERFRkFVTFRfRlJBR01FTlRBVElPTl9NT0RFICAgR1NUX0ZSQUdNRU5UQVRJT05fTU9ERV9OT1JNQUwKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfRlJBR01FTlRBVElPTl9NT0RFCit9OworCisjZGVmaW5lIEdTVF9UWVBFX0ZSQUdNRU5UQVRJT05fTU9ERSAoZ3N0X2ZyYWdtZW50YXRpb25fbW9kZV9nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3RfZnJhZ21lbnRhdGlvbl9tb2RlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZnJhZ21lbnRhdGlvbl9tb2RlX3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBmcmFnbWVudGF0aW9uX21vZGVbXSA9IHsKKyAgICB7R1NUX0ZSQUdNRU5UQVRJT05fTU9ERV9OT1JNQUwsICJOb3JtYWwiLCAibm9ybWFsIn0sCisgICAge0dTVF9GUkFHTUVOVEFUSU9OX01PREVfU1lOQywgIkZyYWdtZW50IGF0IHN5bmMgcG9pbnRzIiwgInN5bmMifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0sCisgIH07CisKKyAgaWYgKCFmcmFnbWVudGF0aW9uX21vZGVfdHlwZSkgeworICAgIGZyYWdtZW50YXRpb25fbW9kZV90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdEZyYWdtZW50YXRpb25Nb2RlIiwgZnJhZ21lbnRhdGlvbl9tb2RlKTsKKyAgfQorICByZXR1cm4gZnJhZ21lbnRhdGlvbl9tb2RlX3R5cGU7Cit9CisKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwaDI2M3BwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgcnRwaDI2M3BwYXlfZGVidWcKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2M3BfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1oMjYzLCB2YXJpYW50ID0gKHN0cmluZykgaXR1IikKKyAgICApOworCisvKgorICogV2UgYWxzbyByZXR1cm4gdGhlc2UgaW4gZ2V0Y2FwcygpIGFzIHJlcXVpcmVkIGJ5IHRoZSBTRFAgY2FwcworICoKKyAqIHdpZHRoID0gKGludCkgWzE2LCA0MDk2XQorICogaGVpZ2h0ID0gKGludCkgWzE2LCA0MDk2XQorICogImFubmV4LWYgPSAoYm9vbGVhbikge3RydWUsIGZhbHNlfSwiCisgKiAiYW5uZXgtaSA9IChib29sZWFuKSB7dHJ1ZSwgZmFsc2V9LCIKKyAqICJhbm5leC1qID0gKGJvb2xlYW4pIHt0cnVlLCBmYWxzZX0sIgorICogImFubmV4LWwgPSAoYm9vbGVhbikge3RydWUsIGZhbHNlfSwiCisgKiAiYW5uZXgtdCA9IChib29sZWFuKSB7dHJ1ZSwgZmFsc2V9LCIKKyAqICJhbm5leC12ID0gKGJvb2xlYW4pIHt0cnVlLCBmYWxzZX0iKQorICovCisKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2M3BfcGF5X3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiSDI2My0xOTk4XCI7ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiSDI2My0yMDAwXCIiKQorICAgICk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2M3BfcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9oMjYzcF9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9oMjYzcF9wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9oMjYzcF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfcnRwX2gyNjNwX3BheV9zaW5rX2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9oMjYzcF9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKgorICAgIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKKyNkZWZpbmUgZ3N0X3J0cF9oMjYzcF9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwSDI2M1BQYXksIGdzdF9ydHBfaDI2M3BfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2M3BfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEgyNjNQUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfaDI2M3BfcGF5X2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX2gyNjNwX3BheV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9ydHBfaDI2M3BfcGF5X2dldF9wcm9wZXJ0eTsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2gyNjNwX3BheV9zZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+Z2V0X2NhcHMgPSBnc3RfcnRwX2gyNjNwX3BheV9zaW5rX2dldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9oMjYzcF9wYXlfaGFuZGxlX2J1ZmZlcjsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgUFJPUF9GUkFHTUVOVEFUSU9OX01PREUsIGdfcGFyYW1fc3BlY19lbnVtICgiZnJhZ21lbnRhdGlvbi1tb2RlIiwKKyAgICAgICAgICAiRnJhZ21lbnRhdGlvbiBNb2RlIiwKKyAgICAgICAgICAiUGFja2V0IEZyYWdtZW50YXRpb24gTW9kZSIsIEdTVF9UWVBFX0ZSQUdNRU5UQVRJT05fTU9ERSwKKyAgICAgICAgICBERUZBVUxUX0ZSQUdNRU5UQVRJT05fTU9ERSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2gyNjNwX3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2gyNjNwX3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUlRQIEgyNjMgcGF5bG9hZGVyIiwKKyAgICAgICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQtZW5jb2RlcyBIMjYzLysvKysgdmlkZW8gaW4gUlRQIHBhY2tldHMgKFJGQyA0NjI5KSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwaDI2M3BwYXlfZGVidWcsICJydHBoMjYzcHBheSIsCisgICAgICAwLCAicnRwaDI2M3BwYXkgKFJGQyA0NjI5KSIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYzcF9wYXlfaW5pdCAoR3N0UnRwSDI2M1BQYXkgKiBydHBoMjYzcHBheSkKK3sKKyAgcnRwaDI2M3BwYXktPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisKKyAgcnRwaDI2M3BwYXktPmZyYWdtZW50YXRpb25fbW9kZSA9IERFRkFVTFRfRlJBR01FTlRBVElPTl9NT0RFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYzcF9wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cEgyNjNQUGF5ICpydHBoMjYzcHBheTsKKworICBydHBoMjYzcHBheSA9IEdTVF9SVFBfSDI2M1BfUEFZIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChydHBoMjYzcHBheS0+YWRhcHRlcik7CisgIHJ0cGgyNjNwcGF5LT5hZGFwdGVyID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjYzcF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RDYXBzICpwZWVyY2FwczsKKyAgZ2NoYXIgKmVuY29kaW5nX25hbWUgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChnc3RfY2Fwc19pc19maXhlZCAoY2FwcyksIEZBTFNFKTsKKworICBwZWVyY2FwcyA9CisgICAgICBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAoR1NUX1JUUF9CQVNFX1BBWUxPQURfU1JDUEFEIChwYXlsb2FkKSwgTlVMTCk7CisgIGlmIChwZWVyY2FwcykgeworICAgIEdzdENhcHMgKnRjYXBzID0KKyAgICAgICAgZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRCAocGF5bG9hZCkpOworICAgIEdzdENhcHMgKmludGVyc2VjdCA9IGdzdF9jYXBzX2ludGVyc2VjdCAocGVlcmNhcHMsIHRjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGNhcHMpOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICBpZiAoIWdzdF9jYXBzX2lzX2VtcHR5IChpbnRlcnNlY3QpKSB7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChpbnRlcnNlY3QsIDApOworICAgICAgZW5jb2RpbmdfbmFtZSA9IGdfc3RyZHVwIChnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJlbmNvZGluZy1uYW1lIikpOworICAgIH0KKyAgICBnc3RfY2Fwc191bnJlZiAoaW50ZXJzZWN0KTsKKyAgfQorCisgIGlmICghZW5jb2RpbmdfbmFtZSkKKyAgICBlbmNvZGluZ19uYW1lID0gZ19zdHJkdXAgKCJIMjYzLTE5OTgiKTsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocGF5bG9hZCwgInZpZGVvIiwgVFJVRSwKKyAgICAgIChnY2hhciAqKSBlbmNvZGluZ19uYW1lLCA5MDAwMCk7CisgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXlsb2FkLCBOVUxMKTsKKyAgZ19mcmVlIChlbmNvZGluZ19uYW1lKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitjYXBzX2FwcGVuZCAoR3N0Q2FwcyAqIGNhcHMsIEdzdFN0cnVjdHVyZSAqIGluX3MsIGd1aW50IHgsIGd1aW50IHksIGd1aW50IG1waSkKK3sKKyAgR3N0U3RydWN0dXJlICpzOworCisgIGlmICghaW5fcykKKyAgICByZXR1cm4gY2FwczsKKworICBpZiAobXBpIDwgMSB8fCBtcGkgPiAzMikKKyAgICByZXR1cm4gY2FwczsKKworICBzID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChpbl9zKTsKKworICBnc3Rfc3RydWN0dXJlX3NldCAocywKKyAgICAgICJ3aWR0aCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgeCwKKyAgICAgICJoZWlnaHQiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIHksCisgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT05fUkFOR0UsIDAsIDEsIDMwMDAwLCAxMDAxICogbXBpLCBOVUxMKTsKKworICBjYXBzID0gZ3N0X2NhcHNfbWVyZ2Vfc3RydWN0dXJlIChjYXBzLCBzKTsKKworICByZXR1cm4gY2FwczsKK30KKworCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfcnRwX2gyNjNwX3BheV9zaW5rX2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0UGFkICogcGFkLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdFJ0cEgyNjNQUGF5ICpydHBoMjYzcHBheTsKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEwsICp0ZW1wbDsKKyAgR3N0Q2FwcyAqcGVlcmNhcHMgPSBOVUxMOworICBHc3RDYXBzICppbnRlcnNlY3QgPSBOVUxMOworICBndWludCBpOworCisgIHJ0cGgyNjNwcGF5ID0gR1NUX1JUUF9IMjYzUF9QQVkgKHBheWxvYWQpOworCisgIHBlZXJjYXBzID0KKyAgICAgIGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChHU1RfUlRQX0JBU0VfUEFZTE9BRF9TUkNQQUQgKHBheWxvYWQpLCBOVUxMKTsKKworICAvKiBpZiB3ZSdyZSBqdXN0IG91dHB1dHRpbmcgdG8gdWRwc2luayBvciBmYWtlc2luayBvciBzbywgd2Ugc2hvdWxkIGFsc28KKyAgICogYWNjZXB0IGFueSBpbnB1dCBjb21wYXRpYmxlIHdpdGggb3VyIHNpbmsgdGVtcGxhdGUgY2FwcyAqLworICBpZiAoIXBlZXJjYXBzIHx8IGdzdF9jYXBzX2lzX2FueSAocGVlcmNhcHMpKSB7CisgICAgaWYgKHBlZXJjYXBzKQorICAgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICBjYXBzID0KKyAgICAgICAgZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NJTktQQUQgKHBheWxvYWQpKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiBXZSBiYXNpY2FsbHkgbmVlZCB0byBkaWZmZXJlbnRpYXRlIHR3byB1c2UtY2FzZXMgaGVyZTogT25lIHdoZXJlIHRoZXJlJ3MKKyAgICogYSBjYXBzZmlsdGVyIGFmdGVyIHRoZSBwYXlsb2FkZXIgd2l0aCBjYXBzIGNyZWF0ZWQgZnJvbSBhbiBTRFA7IGluIHRoaXMKKyAgICogY2FzZSB0aGUgZmlsdGVyIGNhcHMgYXJlIGZpeGVkIGFuZCB3ZSB3YW50IHRvIHNpZ25hbCB0byBhbiBlbmNvZGVyIHdoYXQKKyAgICogd2Ugd2FudCBpdCB0byBwcm9kdWNlLiBUaGUgc2Vjb25kIGNhc2UgaXMgc2ltcGx5IHBheWxvYWRlciAhIGRlcGF5bG9hZGVyCisgICAqIHdoZXJlIHdlIGFyZSBkZWFsaW5nIHdpdGggdGhlIGRlcGF5bG9hZGVyJ3MgdGVtcGxhdGUgY2Fwcy4gSW4gdGhpcyBjYXNlCisgICAqIHdlIHNob3VsZCBhY2NlcHQgYW55IGlucHV0IGNvbXBhdGlibGUgd2l0aCBvdXIgc2luayB0ZW1wbGF0ZSBjYXBzLiAqLworICBpZiAoIWdzdF9jYXBzX2lzX2ZpeGVkIChwZWVyY2FwcykpIHsKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworICAgIGNhcHMgPQorICAgICAgICBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX1JUUF9CQVNFX1BBWUxPQURfU0lOS1BBRCAocGF5bG9hZCkpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIHRlbXBsID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRCAocGF5bG9hZCkpOworICBpbnRlcnNlY3QgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHBlZXJjYXBzLCB0ZW1wbCk7CisgIGdzdF9jYXBzX3VucmVmIChwZWVyY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmICh0ZW1wbCk7CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChpbnRlcnNlY3QpKQorICAgIHJldHVybiBpbnRlcnNlY3Q7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKyAgZm9yIChpID0gMDsgaSA8IGdzdF9jYXBzX2dldF9zaXplIChpbnRlcnNlY3QpOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChpbnRlcnNlY3QsIGkpOworICAgIGNvbnN0IGdjaGFyICplbmNvZGluZ19uYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAiZW5jb2RpbmctbmFtZSIpOworCisgICAgaWYgKCFzdHJjbXAgKGVuY29kaW5nX25hbWUsICJIMjYzLTIwMDAiKSkgeworICAgICAgY29uc3QgZ2NoYXIgKnByb2ZpbGVfc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAicHJvZmlsZSIpOworICAgICAgY29uc3QgZ2NoYXIgKmxldmVsX3N0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgImxldmVsIik7CisgICAgICBpbnQgcHJvZmlsZSA9IDA7CisgICAgICBpbnQgbGV2ZWwgPSAwOworCisgICAgICBpZiAocHJvZmlsZV9zdHIgJiYgbGV2ZWxfc3RyKSB7CisgICAgICAgIGdib29sZWFuIGkgPSBGQUxTRSwgaiA9IEZBTFNFLCBsID0gRkFMU0UsIHQgPSBGQUxTRSwgZiA9IEZBTFNFLAorICAgICAgICAgICAgdiA9IEZBTFNFOworICAgICAgICBHc3RTdHJ1Y3R1cmUgKm5ld19zID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2aWRlby94LWgyNjMiLAorICAgICAgICAgICAgInZhcmlhbnQiLCBHX1RZUEVfU1RSSU5HLCAiaXR1IiwKKyAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgIHByb2ZpbGUgPSBhdG9pIChwcm9maWxlX3N0cik7CisgICAgICAgIGxldmVsID0gYXRvaSAobGV2ZWxfc3RyKTsKKworICAgICAgICAvKiBUaGVzZSBwcm9maWxlcyBhcmUgZGVmaW5lZCBpbiB0aGUgSC4yNjMgQW5uZXggWCAqLworICAgICAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAvKiBUaGUgQmFzZWxpbmUgUHJvZmlsZSAoUHJvZmlsZSAwKSAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgLyogSC4zMjAgQ29kaW5nIEVmZmljaWVuY3kgVmVyc2lvbiAyIEJhY2t3YXJkLUNvbXBhdGliaWxpdHkgUHJvZmlsZQorICAgICAgICAgICAgICogKFByb2ZpbGUgMSkKKyAgICAgICAgICAgICAqIEJhc2VsaW5lICsgQW5uZXhlcyBJLCBKLCBMLjQgYW5kIFQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaSA9IGogPSBsID0gdCA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAvKiBWZXJzaW9uIDEgQmFja3dhcmQtQ29tcGF0aWJpbGl0eSBQcm9maWxlIChQcm9maWxlIDIpCisgICAgICAgICAgICAgKiBCYXNlbGluZSArIEFubmV4IEYKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaSA9IGogPSBsID0gdCA9IGYgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgLyogVmVyc2lvbiAyIEludGVyYWN0aXZlIGFuZCBTdHJlYW1pbmcgV2lyZWxlc3MgUHJvZmlsZQorICAgICAgICAgICAgICogQmFzZWxpbmUgKyBBbm5leGVzIEksIEosIFQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaSA9IGogPSB0ID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIC8qIFZlcnNpb24gMyBJbnRlcmFjdGl2ZSBhbmQgU3RyZWFtaW5nIFdpcmVsZXNzIFByb2ZpbGUgKFByb2ZpbGUgNCkKKyAgICAgICAgICAgICAqIEJhc2VsaW5lICsgQW5uZXhlcyBJLCBKLCBULCBWLCBXLjYuMy44LAorICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiBNaXNzaW5nIFcuNi4zLjggKi8KKyAgICAgICAgICAgIGkgPSBqID0gdCA9IHYgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgLyogQ29udmVyc2F0aW9uYWwgSGlnaCBDb21wcmVzc2lvbiBQcm9maWxlIChQcm9maWxlIDUpCisgICAgICAgICAgICAgKiBCYXNlbGluZSArIEFubmV4ZXMgRiwgSSwgSiwgTC40LCBULCBELCBVCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qIE1pc3NpbmcgRCwgVSAqLworICAgICAgICAgICAgZiA9IGkgPSBqID0gbCA9IHQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgLyogQ29udmVyc2F0aW9uYWwgSW50ZXJuZXQgUHJvZmlsZSAoUHJvZmlsZSA2KQorICAgICAgICAgICAgICogQmFzZWxpbmUgKyBBbm5leGVzIEYsIEksIEosIEwuNCwgVCwgRCwgVSBhbmQKKyAgICAgICAgICAgICAqIEsgd2l0aCBhcmJpdHJhdHJ5IHNsaWNlIG9yZGVyaW5nCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qIE1pc3NpbmcgRCwgVSwgSyB3aXRoIGFyYml0cmF0cnkgc2xpY2Ugb3JkZXJpbmcgKi8KKyAgICAgICAgICAgIGYgPSBpID0gaiA9IGwgPSB0ID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIC8qIENvbnZlcnNhdGlvbmFsIEludGVybGFjZSBQcm9maWxlIChQcm9maWxlIDcpCisgICAgICAgICAgICAgKiBCYXNlbGluZSArIEFubmV4ZXMgRiwgSSwgSiwgTC40LCBULCBELCBVLCAgVy42LjMuMTEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogTWlzc2luZyBELCBVLCBXLjYuMy4xMSAqLworICAgICAgICAgICAgZiA9IGkgPSBqID0gbCA9IHQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgLyogSGlnaCBMYXRlbmN5IFByb2ZpbGUgKFByb2ZpbGUgOCkKKyAgICAgICAgICAgICAqIEJhc2VsaW5lICsgQW5uZXhlcyBGLCBJLCBKLCBMLjQsIFQsIEQsIFUsIFAuNSwgTy4xLjEgYW5kCisgICAgICAgICAgICAgKiBLIHdpdGggYXJiaXRyYXRyeSBzbGljZSBvcmRlcmluZworICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiBNaXNzaW5nIEQsIFUsIFAuNSwgTy4xLjEgKi8KKyAgICAgICAgICAgIGYgPSBpID0gaiA9IGwgPSB0ID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKworICAgICAgICBpZiAoZiB8fCBpIHx8IGogfHwgdCB8fCBsIHx8IHYpIHsKKyAgICAgICAgICBHVmFsdWUgbGlzdCA9IHsgMCB9OworICAgICAgICAgIEdWYWx1ZSB2c3RyID0geyAwIH07CisKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZsaXN0LCBHU1RfVFlQRV9MSVNUKTsKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZ2c3RyLCBHX1RZUEVfU1RSSU5HKTsKKworICAgICAgICAgIGdfdmFsdWVfc2V0X3N0YXRpY19zdHJpbmcgKCZ2c3RyLCAiaDI2MyIpOworICAgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJmxpc3QsICZ2c3RyKTsKKyAgICAgICAgICBnX3ZhbHVlX3NldF9zdGF0aWNfc3RyaW5nICgmdnN0ciwgImgyNjNwIik7CisgICAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJnZzdHIpOworCisgICAgICAgICAgaWYgKGwgfHwgdikgeworICAgICAgICAgICAgZ192YWx1ZV9zZXRfc3RhdGljX3N0cmluZyAoJnZzdHIsICJoMjYzcHAiKTsKKyAgICAgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJmxpc3QsICZ2c3RyKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ192YWx1ZV91bnNldCAoJnZzdHIpOworCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKG5ld19zLCAiaDI2M3ZlcnNpb24iLCAmbGlzdCk7CisgICAgICAgICAgZ192YWx1ZV91bnNldCAoJmxpc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfcywgImgyNjN2ZXJzaW9uIiwgR19UWVBFX1NUUklORywgImgyNjMiLCBOVUxMKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKCFmKQorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfcywgImFubmV4LWYiLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICAgICAgICBpZiAoIWkpCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG5ld19zLCAiYW5uZXgtaSIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwgTlVMTCk7CisgICAgICAgIGlmICghaikKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3MsICJhbm5leC1qIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICAgICAgaWYgKCF0KQorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfcywgImFubmV4LXQiLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICAgICAgICBpZiAoIWwpCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG5ld19zLCAiYW5uZXgtbCIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwgTlVMTCk7CisgICAgICAgIGlmICghdikKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3MsICJhbm5leC12IiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKworCisgICAgICAgIGlmIChsZXZlbCA8PSAxMCB8fCBsZXZlbCA9PSA0NSkgeworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfcywKKyAgICAgICAgICAgICAgIndpZHRoIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCAxNzYsCisgICAgICAgICAgICAgICJoZWlnaHQiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIDE0NCwKKyAgICAgICAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFLCAwLCAxLCAzMDAwMCwgMjAwMiwgTlVMTCk7CisgICAgICAgICAgY2FwcyA9IGdzdF9jYXBzX21lcmdlX3N0cnVjdHVyZSAoY2FwcywgbmV3X3MpOworICAgICAgICB9IGVsc2UgaWYgKGxldmVsIDw9IDIwKSB7CisgICAgICAgICAgR3N0U3RydWN0dXJlICpzX2NvcHkgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKG5ld19zKTsKKworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfcywKKyAgICAgICAgICAgICAgIndpZHRoIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCAzNTIsCisgICAgICAgICAgICAgICJoZWlnaHQiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIDI4OCwKKyAgICAgICAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFLCAwLCAxLCAzMDAwMCwgMjAwMiwgTlVMTCk7CisgICAgICAgICAgY2FwcyA9IGdzdF9jYXBzX21lcmdlX3N0cnVjdHVyZSAoY2FwcywgbmV3X3MpOworCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHNfY29weSwKKyAgICAgICAgICAgICAgIndpZHRoIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCAxNzYsCisgICAgICAgICAgICAgICJoZWlnaHQiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIDE0NCwKKyAgICAgICAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFLCAwLCAxLCAzMDAwMCwgMTAwMSwgTlVMTCk7CisgICAgICAgICAgY2FwcyA9IGdzdF9jYXBzX21lcmdlX3N0cnVjdHVyZSAoY2Fwcywgc19jb3B5KTsKKyAgICAgICAgfSBlbHNlIGlmIChsZXZlbCA8PSA0MCkgeworCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG5ld19zLAorICAgICAgICAgICAgICAid2lkdGgiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIDM1MiwKKyAgICAgICAgICAgICAgImhlaWdodCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgMjg4LAorICAgICAgICAgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT05fUkFOR0UsIDAsIDEsIDMwMDAwLCAxMDAxLCBOVUxMKTsKKyAgICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbWVyZ2Vfc3RydWN0dXJlIChjYXBzLCBuZXdfcyk7CisgICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPD0gNTApIHsKKyAgICAgICAgICBHc3RTdHJ1Y3R1cmUgKnNfY29weSA9IGdzdF9zdHJ1Y3R1cmVfY29weSAobmV3X3MpOworCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG5ld19zLAorICAgICAgICAgICAgICAid2lkdGgiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIDM1MiwKKyAgICAgICAgICAgICAgImhlaWdodCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgMjg4LAorICAgICAgICAgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT05fUkFOR0UsIDAsIDEsIDUwLCAxLCBOVUxMKTsKKyAgICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbWVyZ2Vfc3RydWN0dXJlIChjYXBzLCBuZXdfcyk7CisKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoc19jb3B5LAorICAgICAgICAgICAgICAid2lkdGgiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIDM1MiwKKyAgICAgICAgICAgICAgImhlaWdodCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgMjQwLAorICAgICAgICAgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT05fUkFOR0UsIDAsIDEsIDYwMDAwLCAxMDAxLCBOVUxMKTsKKyAgICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbWVyZ2Vfc3RydWN0dXJlIChjYXBzLCBzX2NvcHkpOworICAgICAgICB9IGVsc2UgaWYgKGxldmVsIDw9IDYwKSB7CisgICAgICAgICAgR3N0U3RydWN0dXJlICpzX2NvcHkgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKG5ld19zKTsKKworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfcywKKyAgICAgICAgICAgICAgIndpZHRoIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCA3MjAsCisgICAgICAgICAgICAgICJoZWlnaHQiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIDI4OCwKKyAgICAgICAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFLCAwLCAxLCA1MCwgMSwgTlVMTCk7CisgICAgICAgICAgY2FwcyA9IGdzdF9jYXBzX21lcmdlX3N0cnVjdHVyZSAoY2FwcywgbmV3X3MpOworCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHNfY29weSwKKyAgICAgICAgICAgICAgIndpZHRoIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCA3MjAsCisgICAgICAgICAgICAgICJoZWlnaHQiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIDI0MCwKKyAgICAgICAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFLCAwLCAxLCA2MDAwMCwgMTAwMSwgTlVMTCk7CisgICAgICAgICAgY2FwcyA9IGdzdF9jYXBzX21lcmdlX3N0cnVjdHVyZSAoY2Fwcywgc19jb3B5KTsKKyAgICAgICAgfSBlbHNlIGlmIChsZXZlbCA8PSA3MCkgeworICAgICAgICAgIEdzdFN0cnVjdHVyZSAqc19jb3B5ID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChuZXdfcyk7CisKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3MsCisgICAgICAgICAgICAgICJ3aWR0aCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgNzIwLAorICAgICAgICAgICAgICAiaGVpZ2h0IiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCA1NzYsCisgICAgICAgICAgICAgICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTl9SQU5HRSwgMCwgMSwgNTAsIDEsIE5VTEwpOworICAgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19tZXJnZV9zdHJ1Y3R1cmUgKGNhcHMsIG5ld19zKTsKKworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzX2NvcHksCisgICAgICAgICAgICAgICJ3aWR0aCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgNzIwLAorICAgICAgICAgICAgICAiaGVpZ2h0IiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCA0ODAsCisgICAgICAgICAgICAgICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTl9SQU5HRSwgMCwgMSwgNjAwMDAsIDEwMDEsIE5VTEwpOworICAgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19tZXJnZV9zdHJ1Y3R1cmUgKGNhcHMsIHNfY29weSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY2FwcyA9IGdzdF9jYXBzX21lcmdlX3N0cnVjdHVyZSAoY2FwcywgbmV3X3MpOworICAgICAgICB9CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdzdFN0cnVjdHVyZSAqbmV3X3MgPSBnc3Rfc3RydWN0dXJlX25ldyAoInZpZGVvL3gtaDI2MyIsCisgICAgICAgICAgICAidmFyaWFudCIsIEdfVFlQRV9TVFJJTkcsICJpdHUiLAorICAgICAgICAgICAgImgyNjN2ZXJzaW9uIiwgR19UWVBFX1NUUklORywgImgyNjMiLAorICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2M3BwYXksICJObyBwcm9maWxlIG9yIGxldmVsIHNwZWNpZmllZCIKKyAgICAgICAgICAgICIgZm9yIEgyNjMtMjAwMCwgZGVmYXVsdGluZyB0byBiYXNlbGluZSBIMjYzIik7CisKKyAgICAgICAgY2FwcyA9IGdzdF9jYXBzX21lcmdlX3N0cnVjdHVyZSAoY2FwcywgbmV3X3MpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBnYm9vbGVhbiBmID0gRkFMU0UsIGkgPSBGQUxTRSwgaiA9IEZBTFNFLCB0ID0gRkFMU0U7CisgICAgICAvKiBGSVhNRTogZmZtcGVnIHN1cHBvcnQgdGhlIEFwcGVuZGl4IEsgdG9vLCBob3cgZG8gd2UgZXhwcmVzcyBpdCA/CisgICAgICAgKiAgIGd1aW50IGs7CisgICAgICAgKi8KKyAgICAgIGNvbnN0IGdjaGFyICpzdHI7CisgICAgICBHc3RTdHJ1Y3R1cmUgKm5ld19zID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2aWRlby94LWgyNjMiLAorICAgICAgICAgICJ2YXJpYW50IiwgR19UWVBFX1NUUklORywgIml0dSIsCisgICAgICAgICAgTlVMTCk7CisgICAgICBnYm9vbGVhbiBhZGRlZCA9IEZBTFNFOworCisgICAgICBzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJmIik7CisgICAgICBpZiAoc3RyICYmICFzdHJjbXAgKHN0ciwgIjEiKSkKKyAgICAgICAgZiA9IFRSVUU7CisKKyAgICAgIHN0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgImkiKTsKKyAgICAgIGlmIChzdHIgJiYgIXN0cmNtcCAoc3RyLCAiMSIpKQorICAgICAgICBpID0gVFJVRTsKKworICAgICAgc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAiaiIpOworICAgICAgaWYgKHN0ciAmJiAhc3RyY21wIChzdHIsICIxIikpCisgICAgICAgIGogPSBUUlVFOworCisgICAgICBzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJ0Iik7CisgICAgICBpZiAoc3RyICYmICFzdHJjbXAgKHN0ciwgIjEiKSkKKyAgICAgICAgdCA9IFRSVUU7CisKKyAgICAgIGlmIChmIHx8IGkgfHwgaiB8fCB0KSB7CisgICAgICAgIEdWYWx1ZSBsaXN0ID0geyAwIH07CisgICAgICAgIEdWYWx1ZSB2c3RyID0geyAwIH07CisKKyAgICAgICAgZ192YWx1ZV9pbml0ICgmbGlzdCwgR1NUX1RZUEVfTElTVCk7CisgICAgICAgIGdfdmFsdWVfaW5pdCAoJnZzdHIsIEdfVFlQRV9TVFJJTkcpOworCisgICAgICAgIGdfdmFsdWVfc2V0X3N0YXRpY19zdHJpbmcgKCZ2c3RyLCAiaDI2MyIpOworICAgICAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZsaXN0LCAmdnN0cik7CisgICAgICAgIGdfdmFsdWVfc2V0X3N0YXRpY19zdHJpbmcgKCZ2c3RyLCAiaDI2M3AiKTsKKyAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJnZzdHIpOworICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdnN0cik7CisKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKG5ld19zLCAiaDI2M3ZlcnNpb24iLCAmbGlzdCk7CisgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZsaXN0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfcywgImgyNjN2ZXJzaW9uIiwgR19UWVBFX1NUUklORywgImgyNjMiLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFmKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3MsICJhbm5leC1mIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICAgIGlmICghaSkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG5ld19zLCAiYW5uZXgtaSIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwgTlVMTCk7CisgICAgICBpZiAoIWopCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfcywgImFubmV4LWoiLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICAgICAgaWYgKCF0KQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3MsICJhbm5leC10IiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKworCisgICAgICBzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJjdXN0b20iKTsKKyAgICAgIGlmIChzdHIpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHhtYXgsIHltYXgsIG1waTsKKyAgICAgICAgaWYgKHNzY2FuZiAoc3RyLCAiJXUsJXUsJXUiLCAmeG1heCwgJnltYXgsICZtcGkpID09IDMpIHsKKyAgICAgICAgICBpZiAoeG1heCAlIDQgJiYgeW1heCAlIDQgJiYgbXBpID49IDEgJiYgbXBpIDw9IDMyKSB7CisgICAgICAgICAgICBjYXBzID0gY2Fwc19hcHBlbmQgKGNhcHMsIG5ld19zLCB4bWF4LCB5bWF4LCBtcGkpOworICAgICAgICAgICAgYWRkZWQgPSBUUlVFOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cGgyNjNwcGF5LCAiSW52YWxpZCBjdXN0b20gZnJhbWVzaXplL01QSSIKKyAgICAgICAgICAgICAgICAiICV1IHggJXUgYXQgJXUsIGlnbm9yaW5nIiwgeG1heCwgeW1heCwgbXBpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChydHBoMjYzcHBheSwgIkludmFsaWQgY3VzdG9tIGZyYW1lc2l6ZS9NUEk6ICVzLCIKKyAgICAgICAgICAgICAgIiBpZ25vcmluZyIsIHN0cik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAiMTZjaWYiKTsKKyAgICAgIGlmIChzdHIpIHsKKyAgICAgICAgaW50IG1waSA9IGF0b2kgKHN0cik7CisgICAgICAgIGNhcHMgPSBjYXBzX2FwcGVuZCAoY2FwcywgbmV3X3MsIDE0MDgsIDExNTIsIG1waSk7CisgICAgICAgIGFkZGVkID0gVFJVRTsKKyAgICAgIH0KKworICAgICAgc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAiNGNpZiIpOworICAgICAgaWYgKHN0cikgeworICAgICAgICBpbnQgbXBpID0gYXRvaSAoc3RyKTsKKyAgICAgICAgY2FwcyA9IGNhcHNfYXBwZW5kIChjYXBzLCBuZXdfcywgNzA0LCA1NzYsIG1waSk7CisgICAgICAgIGFkZGVkID0gVFJVRTsKKyAgICAgIH0KKworICAgICAgc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAiY2lmIik7CisgICAgICBpZiAoc3RyKSB7CisgICAgICAgIGludCBtcGkgPSBhdG9pIChzdHIpOworICAgICAgICBjYXBzID0gY2Fwc19hcHBlbmQgKGNhcHMsIG5ld19zLCAzNTIsIDI4OCwgbXBpKTsKKyAgICAgICAgYWRkZWQgPSBUUlVFOworICAgICAgfQorCisgICAgICBzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJxY2lmIik7CisgICAgICBpZiAoc3RyKSB7CisgICAgICAgIGludCBtcGkgPSBhdG9pIChzdHIpOworICAgICAgICBjYXBzID0gY2Fwc19hcHBlbmQgKGNhcHMsIG5ld19zLCAxNzYsIDE0NCwgbXBpKTsKKyAgICAgICAgYWRkZWQgPSBUUlVFOworICAgICAgfQorCisgICAgICBzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJzcWNpZiIpOworICAgICAgaWYgKHN0cikgeworICAgICAgICBpbnQgbXBpID0gYXRvaSAoc3RyKTsKKyAgICAgICAgY2FwcyA9IGNhcHNfYXBwZW5kIChjYXBzLCBuZXdfcywgMTI4LCA5NiwgbXBpKTsKKyAgICAgICAgYWRkZWQgPSBUUlVFOworICAgICAgfQorCisgICAgICBpZiAoYWRkZWQpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAobmV3X3MpOworICAgICAgZWxzZQorICAgICAgICBjYXBzID0gZ3N0X2NhcHNfbWVyZ2Vfc3RydWN0dXJlIChjYXBzLCBuZXdfcyk7CisgICAgfQorICB9CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGludGVyc2VjdCk7CisKK2RvbmU6CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKnRtcDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJJbnRlcnNlY3QgJSIgR1NUX1BUUl9GT1JNQVQgIiBhbmQgZmlsdGVyICUiCisgICAgICAgIEdTVF9QVFJfRk9STUFULCBjYXBzLCBmaWx0ZXIpOworICAgIHRtcCA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIGNhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIGNhcHMgPSB0bXA7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYzcF9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cEgyNjNQUGF5ICpydHBoMjYzcHBheTsKKworICBydHBoMjYzcHBheSA9IEdTVF9SVFBfSDI2M1BfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9GUkFHTUVOVEFUSU9OX01PREU6CisgICAgICBydHBoMjYzcHBheS0+ZnJhZ21lbnRhdGlvbl9tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjYzcF9wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cEgyNjNQUGF5ICpydHBoMjYzcHBheTsKKworICBydHBoMjYzcHBheSA9IEdTVF9SVFBfSDI2M1BfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9GUkFHTUVOVEFUSU9OX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgcnRwaDI2M3BwYXktPmZyYWdtZW50YXRpb25fbW9kZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2gyNjNwX3BheV9mbHVzaCAoR3N0UnRwSDI2M1BQYXkgKiBydHBoMjYzcHBheSkKK3sKKyAgZ3VpbnQgYXZhaWw7CisgIEdzdEJ1ZmZlckxpc3QgKmxpc3QgPSBOVUxMOworICBHc3RCdWZmZXIgKm91dGJ1ZiA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBnYm9vbGVhbiBmcmFnbWVudGVkID0gRkFMU0U7CisKKyAgYXZhaWwgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cGgyNjNwcGF5LT5hZGFwdGVyKTsKKyAgaWYgKGF2YWlsID09IDApCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIGZyYWdtZW50ZWQgPSBGQUxTRTsKKyAgLyogVGhpcyBhbGdvcml0aG0gYXNzdW1lcyB0aGUgSDI2My8rLysrIGVuY29kZXIgc2VuZHMgY29tcGxldGUgZnJhbWVzIGluIGVhY2gKKyAgICogYnVmZmVyICovCisgIC8qIFdpdGggRnJhZ21lbnRhdGlvbiBNb2RlIGF0IEdTVF9GUkFHTUVOVEFUSU9OX01PREVfTk9STUFMOgorICAgKiAgVGhpcyBhbGdvcml0aG0gaW1wbGVtZW50cyB0aGUgRm9sbG93LW9uIHBhY2tldHMgbWV0aG9kIGZvciBwYWNrZXRpemF0aW9uLgorICAgKiAgVGhpcyBhc3N1bWVzIGxvdyBwYWNrZXQgbG9zcyBuZXR3b3JrLiAKKyAgICogV2l0aCBGcmFnbWVudGF0aW9uIE1vZGUgYXQgR1NUX0ZSQUdNRU5UQVRJT05fTU9ERV9TWU5DOgorICAgKiAgVGhpcyBhbGdvcml0aG0gc2VwYXJhdGVzIGxhcmdlIGZyYW1lcyBhdCBzeW5jaHJvbmlzYXRpb24gcG9pbnRzIChTZWdtZW50cykKKyAgICogIChTZWUgUkZDIDQ2Mjkgc2VjdGlvbiA2KS4gSXQgd291bGQgYmUgaW50ZXJlc3RpbmcgdG8gaGF2ZSBhIHByb3BlcnR5IHN1Y2ggYXMgbmV0d29yaworICAgKiAgcXVhbGl0eSB0byBzZWxlY3QgYmV0d2VlbiBib3RoIHBhY2tldGl6YXRpb24gbWV0aG9kcyAqLworICAvKiBUT0RPIEFkZCBWUkMgc3VwcHJ0IChTZWUgUkZDIDQ2Mjkgc2VjdGlvbiA1LjIpICovCisKKyAgd2hpbGUgKGF2YWlsID4gMCkgeworICAgIGd1aW50IHRvd3JpdGU7CisgICAgZ3VpbnQ4ICpwYXlsb2FkOworICAgIGdpbnQgaGVhZGVyX2xlbjsKKyAgICBndWludCBuZXh0X2dvcCA9IDA7CisgICAgZ2Jvb2xlYW4gZm91bmRfZ29iID0gRkFMU0U7CisgICAgR3N0UlRQQnVmZmVyIHJ0cCA9IHsgTlVMTCB9OworICAgIEdzdEJ1ZmZlciAqcGF5bG9hZF9idWY7CisKKyAgICBpZiAocnRwaDI2M3BwYXktPmZyYWdtZW50YXRpb25fbW9kZSA9PSBHU1RfRlJBR01FTlRBVElPTl9NT0RFX1NZTkMpIHsKKyAgICAgIC8qIHN0YXJ0IGFmdGVyIDFzdCBnb3AgcG9zc2libGUgKi8KKworICAgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhIGdvYiBvciBlb3MgLCBlb3NzYnMgKi8KKyAgICAgIC8qIEZJWE1FIEVPUyBhbmQgRU9TU0JTIHBhY2tldHMgc2hvdWxkIG5ldmVyIGNvbnRhaW4gYW55IGdvYnMgYW5kIHZpY2UtdmVyc2EgKi8KKyAgICAgIG5leHRfZ29wID0KKyAgICAgICAgICBnc3RfYWRhcHRlcl9tYXNrZWRfc2Nhbl91aW50MzIgKHJ0cGgyNjNwcGF5LT5hZGFwdGVyLCAweGZmZmY4MDAwLAorICAgICAgICAgIDB4MDAwMDgwMDAsIDAsIGF2YWlsKTsKKyAgICAgIGlmIChuZXh0X2dvcCA9PSAwKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjNwcGF5LCAiIEZvdW5kIEdPQiBoZWFkZXIiKTsKKyAgICAgICAgZm91bmRfZ29iID0gVFJVRTsKKyAgICAgIH0KKworICAgICAgLyogRmluZCBuZXh0IGFuZCBjdXQgdGhlIHBhY2tldCBhY2NvcmRpbmdseSAqLworICAgICAgLyogVE9ETyB3ZSBzaG91bGQgZ2V0IGFzIG1hbnkgZ29icyBhcyBwb3NzaWJsZSB1bnRpbCBNVFUgaXMgcmVhY2hlZCwgdGhpcworICAgICAgICogY29kZSBzZWVtcyB0byBqdXN0IGdldCBvbmUgR09CIHBlciBwYWNrZXQgKi8KKyAgICAgIGlmIChuZXh0X2dvcCA9PSAwICYmIGF2YWlsID4gMykKKyAgICAgICAgbmV4dF9nb3AgPQorICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfbWFza2VkX3NjYW5fdWludDMyIChydHBoMjYzcHBheS0+YWRhcHRlciwgMHhmZmZmODAwMCwKKyAgICAgICAgICAgIDB4MDAwMDgwMDAsIDMsIGF2YWlsIC0gMyk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjYzcHBheSwgIiBOZXh0IEdPQiBEZXRlY3RlZCBhdCA6ICAlZCIsIG5leHRfZ29wKTsKKyAgICAgIGlmIChuZXh0X2dvcCA9PSAtMSkKKyAgICAgICAgbmV4dF9nb3AgPSAwOworICAgIH0KKworICAgIC8qIGZvciBwaWN0dXJlIHN0YXJ0IGZyYW1lcyAobm9uLWZyYWdtZW50ZWQpLCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgZmlyc3QKKyAgICAgKiB0d28gMHgwMCBieXRlcyBhbmQgc2V0IFA9MSAqLworICAgIGlmICghZnJhZ21lbnRlZCB8fCBmb3VuZF9nb2IpIHsKKyAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChydHBoMjYzcHBheS0+YWRhcHRlciwgMik7CisgICAgICBhdmFpbCAtPSAyOworICAgIH0KKyAgICBoZWFkZXJfbGVuID0gMjsKKworICAgIHRvd3JpdGUgPSBNSU4gKGF2YWlsLCBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BheWxvYWRfbGVuCisgICAgICAgIChHU1RfUlRQX0JBU0VfUEFZTE9BRF9NVFUgKHJ0cGgyNjNwcGF5KSAtIGhlYWRlcl9sZW4sIDAsIDApKTsKKworICAgIGlmIChuZXh0X2dvcCA+IDApCisgICAgICB0b3dyaXRlID0gTUlOIChuZXh0X2dvcCwgdG93cml0ZSk7CisKKyAgICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKGhlYWRlcl9sZW4sIDAsIDApOworCisgICAgZ3N0X3J0cF9idWZmZXJfbWFwIChvdXRidWYsIEdTVF9NQVBfV1JJVEUsICZydHApOworICAgIC8qIGxhc3QgZnJhZ21lbnQgZ2V0cyB0aGUgbWFya2VyIGJpdCBzZXQgKi8KKyAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBhdmFpbCA+IHRvd3JpdGUgPyAwIDogMSk7CisKKyAgICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApOworCisgICAgLyogIDAgICAgICAgICAgICAgICAgICAgMQorICAgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1CisgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICogfCAgIFJSICAgIHxQfFZ8ICAgUExFTiAgICB8UEVCSVR8CisgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICovCisgICAgLyogaWYgZnJhZ21lbnRlZCBvciBnb3AgaGVhZGVyICwgd3JpdGUgcCBiaXQgPTEgKi8KKyAgICBwYXlsb2FkWzBdID0gKGZyYWdtZW50ZWQgJiYgIWZvdW5kX2dvYikgPyAweDAwIDogMHgwNDsKKyAgICBwYXlsb2FkWzFdID0gMDsKKworICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gcnRwaDI2M3BwYXktPmZpcnN0X3RpbWVzdGFtcDsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gcnRwaDI2M3BwYXktPmZpcnN0X2R1cmF0aW9uOworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAgIHBheWxvYWRfYnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXJfZmFzdCAocnRwaDI2M3BwYXktPmFkYXB0ZXIsIHRvd3JpdGUpOworICAgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHBoMjYzcHBheSwgb3V0YnVmLCBwYXlsb2FkX2J1Zik7CisgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKG91dGJ1ZiwgcGF5bG9hZF9idWYpOworICAgIGF2YWlsIC09IHRvd3JpdGU7CisKKyAgICAvKiBJZiBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCB0aGlzIGlzIG91ciBmaXJzdCBpdGVyYXRpb24sCisgICAgICogd2UgY3JlYXRlIGEgYnVmZmVyIGxpc3QgYW5kIHJlbWVtYmVyIHRoYXQgd2UncmUgZnJhZ21lbnRlZC4KKyAgICAgKgorICAgICAqIElmIHdlJ3JlIGZyYWdtZW50ZWQgYWxyZWFkeSwgYWRkIGJ1ZmZlcnMgdG8gdGhlIHByZXZpb3VzbHkKKyAgICAgKiBjcmVhdGVkIGJ1ZmZlciBsaXN0LgorICAgICAqCisgICAgICogT3RoZXJ3aXNlIGZyYWdtZW50ZWQgd2lsbCBiZSBGQUxTRSBhbmQgd2UganVzdCBwdXNoIHRoZSBzaW5nbGUgb3V0cHV0CisgICAgICogYnVmZmVyLCBhbmQgbm8gbGlzdCBpcyBhbGxvY2F0ZWQuCisgICAgICovCisgICAgaWYgKGF2YWlsICYmICFmcmFnbWVudGVkKSB7CisgICAgICBmcmFnbWVudGVkID0gVFJVRTsKKyAgICAgIGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3ICgpOworICAgICAgZ3N0X2J1ZmZlcl9saXN0X2FkZCAobGlzdCwgb3V0YnVmKTsKKyAgICB9IGVsc2UgaWYgKGZyYWdtZW50ZWQpIHsKKyAgICAgIGdzdF9idWZmZXJfbGlzdF9hZGQgKGxpc3QsIG91dGJ1Zik7CisgICAgfQorICB9CisKKyAgaWYgKGZyYWdtZW50ZWQpIHsKKyAgICByZXQgPQorICAgICAgICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoX2xpc3QgKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBoMjYzcHBheSksCisgICAgICAgIGxpc3QpOworICB9IGVsc2UgeworICAgIHJldCA9CisgICAgICAgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBoMjYzcHBheSksIG91dGJ1Zik7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9oMjYzcF9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UnRwSDI2M1BQYXkgKnJ0cGgyNjNwcGF5OworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBydHBoMjYzcHBheSA9IEdTVF9SVFBfSDI2M1BfUEFZIChwYXlsb2FkKTsKKworICBydHBoMjYzcHBheS0+Zmlyc3RfdGltZXN0YW1wID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcik7CisgIHJ0cGgyNjNwcGF5LT5maXJzdF9kdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisKKyAgLyogd2UgYWx3YXlzIGVuY29kZSBhbmQgZmx1c2ggYSBmdWxsIHBpY3R1cmUgKi8KKyAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwaDI2M3BwYXktPmFkYXB0ZXIsIGJ1ZmZlcik7CisgIHJldCA9IGdzdF9ydHBfaDI2M3BfcGF5X2ZsdXNoIChydHBoMjYzcHBheSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2M3BfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwaDI2M3BwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfSDI2M1BfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwaDI2M3BwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2VjOGI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBoMjYzcHBheS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9IMjYzUF9QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9IMjYzUF9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9IMjYzUF9QQVkgXAorICAoZ3N0X3J0cF9oMjYzcF9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9IMjYzUF9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfSDI2M1BfUEFZLEdzdFJ0cEgyNjNQUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9IMjYzUF9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0gyNjNQX1BBWSxHc3RSdHBIMjYzUFBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9IMjYzUF9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfSDI2M1BfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9IMjYzUF9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0gyNjNQX1BBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBIMjYzUFBheSBHc3RSdHBIMjYzUFBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBIMjYzUFBheUNsYXNzIEdzdFJ0cEgyNjNQUGF5Q2xhc3M7CisKK3R5cGVkZWYgZW51bQoreworICBHU1RfRlJBR01FTlRBVElPTl9NT0RFX05PUk1BTCA9IDAsCisgIEdTVF9GUkFHTUVOVEFUSU9OX01PREVfU1lOQyAgID0gMQorfSBHc3RGcmFnbWVudGF0aW9uTW9kZTsKKworc3RydWN0IF9Hc3RSdHBIMjYzUFBheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCAgICBwYXlsb2FkOworCisgIEdzdEFkYXB0ZXIgICAgICAgICAgKmFkYXB0ZXI7CisgIEdzdENsb2NrVGltZSAgICAgICAgIGZpcnN0X3RpbWVzdGFtcDsKKyAgR3N0Q2xvY2tUaW1lICAgICAgICAgZmlyc3RfZHVyYXRpb247CisgIEdzdEZyYWdtZW50YXRpb25Nb2RlIGZyYWdtZW50YXRpb25fbW9kZTsKK307CisKK3N0cnVjdCBfR3N0UnRwSDI2M1BQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfaDI2M3BfcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9oMjYzcF9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfSDI2M1BfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlMzgyMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmMKQEAgLTAsMCArMSwxMzI5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Yml0cmVhZGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvcGJ1dGlscy9wYnV0aWxzLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSAiZ3N0cnRwaDI2NGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwaDI2NGRlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBoMjY0ZGVwYXlfZGVidWcpCisKKy8qIFRoaXMgaXMgd2hhdCB3ZSdsbCBkZWZhdWx0IHRvIHdoZW4gZG93bnN0cmVhbSBoYXNuJ3QKKyAqIGV4cHJlc3NlZCBhIHJlc3RyaWN0aW9uIG9yIHByZWZlcmVuY2UgdmlhIGNhcHMgKi8KKyNkZWZpbmUgREVGQVVMVF9CWVRFX1NUUkVBTSAgIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9BQ0NFU1NfVU5JVCAgIEZBTFNFCisKKy8qIDMgemVybyBieXRlcyBzeW5jd29yZCAqLworc3RhdGljIGNvbnN0IGd1aW50OCBzeW5jX2J5dGVzW10gPSB7IDAsIDAsIDAsIDEgfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2NF9kZXBheV9zcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWgyNjQsICIKKyAgICAgICAgInN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSBhdmMsIGFsaWdubWVudCA9IChzdHJpbmcpIGF1OyAiCisgICAgICAgICJ2aWRlby94LWgyNjQsICIKKyAgICAgICAgInN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSBieXRlLXN0cmVhbSwgYWxpZ25tZW50ID0gKHN0cmluZykgeyBuYWwsIGF1IH0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2gyNjRfZGVwYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiSDI2NFwiIikKKyAgICAgICAgLyoqIG9wdGlvbmFsIHBhcmFtZXRlcnMgKiovCisgICAgLyogInByb2ZpbGUtbGV2ZWwtaWQgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAibWF4LW1icHMgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAibWF4LWZzID0gKHN0cmluZykgQU5ZLCAiICovCisgICAgLyogIm1heC1jcGIgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAibWF4LWRwYiA9IChzdHJpbmcpIEFOWSwgIiAqLworICAgIC8qICJtYXgtYnIgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAicmVkdW5kYW50LXBpYy1jYXAgPSAoc3RyaW5nKSB7IFwiMFwiLCBcIjFcIiB9LCAiICovCisgICAgLyogInNwcm9wLXBhcmFtZXRlci1zZXRzID0gKHN0cmluZykgQU5ZLCAiICovCisgICAgLyogInBhcmFtZXRlci1hZGQgPSAoc3RyaW5nKSB7IFwiMFwiLCBcIjFcIiB9LCAiICovCisgICAgLyogInBhY2tldGl6YXRpb24tbW9kZSA9IChzdHJpbmcpIHsgXCIwXCIsIFwiMVwiLCBcIjJcIiB9LCAiICovCisgICAgLyogInNwcm9wLWludGVybGVhdmluZy1kZXB0aCA9IChzdHJpbmcpIEFOWSwgIiAqLworICAgIC8qICJzcHJvcC1kZWludC1idWYtcmVxID0gKHN0cmluZykgQU5ZLCAiICovCisgICAgLyogImRlaW50LWJ1Zi1jYXAgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAic3Byb3AtaW5pdC1idWYtdGltZSA9IChzdHJpbmcpIEFOWSwgIiAqLworICAgIC8qICJzcHJvcC1tYXgtZG9uLWRpZmYgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAibWF4LXJjbWQtbmFsdS1zaXplID0gKHN0cmluZykgQU5ZICIgKi8KKyAgICApOworCisjZGVmaW5lIGdzdF9ydHBfaDI2NF9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBIMjY0RGVwYXksIGdzdF9ydHBfaDI2NF9kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2gyNjRfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9oMjY0X2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfaDI2NF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9oMjY0X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBmaWx0ZXIsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaDI2NF9kZXBheV9oYW5kbGVfZXZlbnQgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheSwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NF9kZXBheV9jbGFzc19pbml0IChHc3RSdHBIMjY0RGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX2gyNjRfZGVwYXlfZmluYWxpemU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9oMjY0X2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaDI2NF9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBIMjY0IGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBIMjY0IHZpZGVvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAzOTg0KSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF9oMjY0X2RlcGF5X2NoYW5nZV9zdGF0ZTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX2gyNjRfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2gyNjRfZGVwYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2V2ZW50ID0gZ3N0X3J0cF9oMjY0X2RlcGF5X2hhbmRsZV9ldmVudDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NF9kZXBheV9pbml0IChHc3RSdHBIMjY0RGVwYXkgKiBydHBoMjY0ZGVwYXkpCit7CisgIHJ0cGgyNjRkZXBheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKyAgcnRwaDI2NGRlcGF5LT5waWN0dXJlX2FkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIHJ0cGgyNjRkZXBheS0+Ynl0ZV9zdHJlYW0gPSBERUZBVUxUX0JZVEVfU1RSRUFNOworICBydHBoMjY0ZGVwYXktPm1lcmdlID0gREVGQVVMVF9BQ0NFU1NfVU5JVDsKKyAgcnRwaDI2NGRlcGF5LT5zcHMgPSBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX3VucmVmKTsKKyAgcnRwaDI2NGRlcGF5LT5wcHMgPSBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX3VucmVmKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NF9kZXBheV9yZXNldCAoR3N0UnRwSDI2NERlcGF5ICogcnRwaDI2NGRlcGF5LCBnYm9vbGVhbiBoYXJkKQoreworICBnc3RfYWRhcHRlcl9jbGVhciAocnRwaDI2NGRlcGF5LT5hZGFwdGVyKTsKKyAgcnRwaDI2NGRlcGF5LT53YWl0X3N0YXJ0ID0gVFJVRTsKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGgyNjRkZXBheS0+cGljdHVyZV9hZGFwdGVyKTsKKyAgcnRwaDI2NGRlcGF5LT5waWN0dXJlX3N0YXJ0ID0gRkFMU0U7CisgIHJ0cGgyNjRkZXBheS0+bGFzdF9rZXlmcmFtZSA9IEZBTFNFOworICBydHBoMjY0ZGVwYXktPmxhc3RfdHMgPSAwOworICBydHBoMjY0ZGVwYXktPmN1cnJlbnRfZnVfdHlwZSA9IDA7CisgIHJ0cGgyNjRkZXBheS0+bmV3X2NvZGVjX2RhdGEgPSBGQUxTRTsKKyAgZ19wdHJfYXJyYXlfc2V0X3NpemUgKHJ0cGgyNjRkZXBheS0+c3BzLCAwKTsKKyAgZ19wdHJfYXJyYXlfc2V0X3NpemUgKHJ0cGgyNjRkZXBheS0+cHBzLCAwKTsKKworICBpZiAoaGFyZCkgeworICAgIGlmIChydHBoMjY0ZGVwYXktPmFsbG9jYXRvciAhPSBOVUxMKSB7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChydHBoMjY0ZGVwYXktPmFsbG9jYXRvcik7CisgICAgICBydHBoMjY0ZGVwYXktPmFsbG9jYXRvciA9IE5VTEw7CisgICAgfQorICAgIGdzdF9hbGxvY2F0aW9uX3BhcmFtc19pbml0ICgmcnRwaDI2NGRlcGF5LT5wYXJhbXMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjRfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cEgyNjREZXBheSAqcnRwaDI2NGRlcGF5OworCisgIHJ0cGgyNjRkZXBheSA9IEdTVF9SVFBfSDI2NF9ERVBBWSAob2JqZWN0KTsKKworICBpZiAocnRwaDI2NGRlcGF5LT5jb2RlY19kYXRhKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKHJ0cGgyNjRkZXBheS0+Y29kZWNfZGF0YSk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cGgyNjRkZXBheS0+YWRhcHRlcik7CisgIGdfb2JqZWN0X3VucmVmIChydHBoMjY0ZGVwYXktPnBpY3R1cmVfYWRhcHRlcik7CisKKyAgZ19wdHJfYXJyYXlfZnJlZSAocnRwaDI2NGRlcGF5LT5zcHMsIFRSVUUpOworICBnX3B0cl9hcnJheV9mcmVlIChydHBoMjY0ZGVwYXktPnBwcywgVFJVRSk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY0X2RlcGF5X25lZ290aWF0ZSAoR3N0UnRwSDI2NERlcGF5ICogcnRwaDI2NGRlcGF5KQoreworICBHc3RDYXBzICpjYXBzOworICBnaW50IGJ5dGVfc3RyZWFtID0gLTE7CisgIGdpbnQgbWVyZ2UgPSAtMTsKKworICBjYXBzID0KKyAgICAgIGdzdF9wYWRfZ2V0X2FsbG93ZWRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKHJ0cGgyNjRkZXBheSkpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRkZXBheSwgImFsbG93ZWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIGlmIChjYXBzKSB7CisgICAgaWYgKGdzdF9jYXBzX2dldF9zaXplIChjYXBzKSA+IDApIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICAgICAgY29uc3QgZ2NoYXIgKnN0ciA9IE5VTEw7CisKKyAgICAgIGlmICgoc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAic3RyZWFtLWZvcm1hdCIpKSkgeworICAgICAgICBpZiAoc3RyY21wIChzdHIsICJhdmMiKSA9PSAwKSB7CisgICAgICAgICAgYnl0ZV9zdHJlYW0gPSBGQUxTRTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAgKHN0ciwgImJ5dGUtc3RyZWFtIikgPT0gMCkgeworICAgICAgICAgIGJ5dGVfc3RyZWFtID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0ZGVwYXksICJ1bmtub3duIHN0cmVhbS1mb3JtYXQ6ICVzIiwgc3RyKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoKHN0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgImFsaWdubWVudCIpKSkgeworICAgICAgICBpZiAoc3RyY21wIChzdHIsICJhdSIpID09IDApIHsKKyAgICAgICAgICBtZXJnZSA9IFRSVUU7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wIChzdHIsICJuYWwiKSA9PSAwKSB7CisgICAgICAgICAgbWVyZ2UgPSBGQUxTRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0ZGVwYXksICJ1bmtub3duIGFsaWdubWVudDogJXMiLCBzdHIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgfQorCisgIGlmIChieXRlX3N0cmVhbSAhPSAtMSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRkZXBheSwgImRvd25zdHJlYW0gcmVxdWlyZXMgYnl0ZS1zdHJlYW0gJWQiLAorICAgICAgICBieXRlX3N0cmVhbSk7CisgICAgcnRwaDI2NGRlcGF5LT5ieXRlX3N0cmVhbSA9IGJ5dGVfc3RyZWFtOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRkZXBheSwgImRlZmF1bHRpbmcgdG8gYnl0ZS1zdHJlYW0gJWQiLAorICAgICAgICBERUZBVUxUX0JZVEVfU1RSRUFNKTsKKyAgICBydHBoMjY0ZGVwYXktPmJ5dGVfc3RyZWFtID0gREVGQVVMVF9CWVRFX1NUUkVBTTsKKyAgfQorICBpZiAobWVyZ2UgIT0gLTEpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0ZGVwYXksICJkb3duc3RyZWFtIHJlcXVpcmVzIG1lcmdlICVkIiwgbWVyZ2UpOworICAgIHJ0cGgyNjRkZXBheS0+bWVyZ2UgPSBtZXJnZTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0ZGVwYXksICJkZWZhdWx0aW5nIHRvIG1lcmdlICVkIiwKKyAgICAgICAgREVGQVVMVF9BQ0NFU1NfVU5JVCk7CisgICAgcnRwaDI2NGRlcGF5LT5tZXJnZSA9IERFRkFVTFRfQUNDRVNTX1VOSVQ7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitwYXJzZV9zcHMgKEdzdE1hcEluZm8gKiBtYXAsIGd1aW50MzIgKiBzcHNfaWQpCit7CisgIEdzdEJpdFJlYWRlciBiciA9IEdTVF9CSVRfUkVBREVSX0lOSVQgKG1hcC0+ZGF0YSArIDQsCisgICAgICBtYXAtPnNpemUgLSA0KTsKKworICBpZiAobWFwLT5zaXplIDwgNSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfcnRwX3JlYWRfZ29sb21iICgmYnIsIHNwc19pZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BhcnNlX3BwcyAoR3N0TWFwSW5mbyAqIG1hcCwgZ3VpbnQzMiAqIHNwc19pZCwgZ3VpbnQzMiAqIHBwc19pZCkKK3sKKyAgR3N0Qml0UmVhZGVyIGJyID0gR1NUX0JJVF9SRUFERVJfSU5JVCAobWFwLT5kYXRhICsgMSwKKyAgICAgIG1hcC0+c2l6ZSAtIDEpOworCisgIGlmIChtYXAtPnNpemUgPCAyKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfcmVhZF9nb2xvbWIgKCZiciwgcHBzX2lkKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghZ3N0X3J0cF9yZWFkX2dvbG9tYiAoJmJyLCBzcHNfaWQpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2gyNjRfZGVwYXlfc2V0X291dHB1dF9jYXBzIChHc3RSdHBIMjY0RGVwYXkgKiBydHBoMjY0ZGVwYXksCisgICAgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdEFsbG9jYXRpb25QYXJhbXMgcGFyYW1zOworICBHc3RBbGxvY2F0b3IgKmFsbG9jYXRvciA9IE5VTEw7CisgIEdzdFBhZCAqc3JjcGFkOworICBnYm9vbGVhbiByZXM7CisKKyAgZ3N0X2FsbG9jYXRpb25fcGFyYW1zX2luaXQgKCZwYXJhbXMpOworCisgIHNyY3BhZCA9IEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChydHBoMjY0ZGVwYXkpOworCisgIHJlcyA9IGdzdF9wYWRfc2V0X2NhcHMgKHNyY3BhZCwgY2Fwcyk7CisKKyAgaWYgKHJlcykgeworICAgIEdzdFF1ZXJ5ICpxdWVyeTsKKworICAgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19hbGxvY2F0aW9uIChjYXBzLCBUUlVFKTsKKyAgICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeSAoc3JjcGFkLCBxdWVyeSkpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRkZXBheSwgImRvd25zdHJlYW0gQUxMT0NBVElPTiBxdWVyeSBmYWlsZWQiKTsKKyAgICB9CisKKyAgICBpZiAoZ3N0X3F1ZXJ5X2dldF9uX2FsbG9jYXRpb25fcGFyYW1zIChxdWVyeSkgPiAwKSB7CisgICAgICBnc3RfcXVlcnlfcGFyc2VfbnRoX2FsbG9jYXRpb25fcGFyYW0gKHF1ZXJ5LCAwLCAmYWxsb2NhdG9yLCAmcGFyYW1zKTsKKyAgICB9CisKKyAgICBnc3RfcXVlcnlfdW5yZWYgKHF1ZXJ5KTsKKyAgfQorCisgIGlmIChydHBoMjY0ZGVwYXktPmFsbG9jYXRvcikKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChydHBoMjY0ZGVwYXktPmFsbG9jYXRvcik7CisKKyAgcnRwaDI2NGRlcGF5LT5hbGxvY2F0b3IgPSBhbGxvY2F0b3I7CisgIHJ0cGgyNjRkZXBheS0+cGFyYW1zID0gcGFyYW1zOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjY0X3NldF9zcmNfY2FwcyAoR3N0UnRwSDI2NERlcGF5ICogcnRwaDI2NGRlcGF5KQoreworICBnYm9vbGVhbiByZXMgPSBUUlVFOworICBHc3RDYXBzICpzcmNjYXBzOworICBHc3RDYXBzICpvbGRfY2FwczsKKyAgR3N0UGFkICpzcmNwYWQ7CisKKyAgaWYgKCFydHBoMjY0ZGVwYXktPmJ5dGVfc3RyZWFtICYmCisgICAgICAoIXJ0cGgyNjRkZXBheS0+bmV3X2NvZGVjX2RhdGEgfHwKKyAgICAgICAgICBydHBoMjY0ZGVwYXktPnNwcy0+bGVuID09IDAgfHwgcnRwaDI2NGRlcGF5LT5wcHMtPmxlbiA9PSAwKSkKKyAgICByZXR1cm4gVFJVRTsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtaDI2NCIsCisgICAgICAic3RyZWFtLWZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICBydHBoMjY0ZGVwYXktPmJ5dGVfc3RyZWFtID8gImJ5dGUtc3RyZWFtIiA6ICJhdmMiLAorICAgICAgImFsaWdubWVudCIsIEdfVFlQRV9TVFJJTkcsIHJ0cGgyNjRkZXBheS0+bWVyZ2UgPyAiYXUiIDogIm5hbCIsIE5VTEwpOworCisgIGlmICghcnRwaDI2NGRlcGF5LT5ieXRlX3N0cmVhbSkgeworICAgIEdzdEJ1ZmZlciAqY29kZWNfZGF0YTsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBHc3RNYXBJbmZvIG5hbG1hcDsKKyAgICBndWludDggKmRhdGE7CisgICAgZ3VpbnQgbGVuOworICAgIGd1aW50IG5ld19zaXplOworICAgIGd1aW50IGk7CisgICAgZ3VjaGFyIGxldmVsID0gMDsKKyAgICBndWNoYXIgcHJvZmlsZV9jb21wYXQgPSBHX01BWFVJTlQ4OworCisgICAgLyogc3RhcnQgd2l0aCA3IGJ5dGVzIGhlYWRlciAqLworICAgIGxlbiA9IDc7CisgICAgLyogY291bnQgc3BzICYgcHBzICovCisgICAgZm9yIChpID0gMDsgaSA8IHJ0cGgyNjRkZXBheS0+c3BzLT5sZW47IGkrKykKKyAgICAgIGxlbiArPSAyICsgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjRkZXBheS0+c3BzLCBpKSk7CisgICAgZm9yIChpID0gMDsgaSA8IHJ0cGgyNjRkZXBheS0+cHBzLT5sZW47IGkrKykKKyAgICAgIGxlbiArPSAyICsgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjRkZXBheS0+cHBzLCBpKSk7CisKKyAgICBjb2RlY19kYXRhID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChsZW4pOworICAgIGdzdF9idWZmZXJfbWFwIChjb2RlY19kYXRhLCAmbWFwLCBHU1RfTUFQX1JFQURXUklURSk7CisgICAgZGF0YSA9IG1hcC5kYXRhOworCisgICAgLyogOCBiaXRzIHZlcnNpb24gPT0gMSAqLworICAgICpkYXRhKysgPSAxOworCisgICAgLyogQWNjb3JkaW5nIHRvOiBJU08vSUVDIDE0NDk2LTE1OjIwMDQoRSkgc2VjdGlvbiA1LjIuNC4xCisgICAgICogVGhlIGxldmVsIGlzIHRoZSBtYXggbGV2ZWwgb2YgYWxsIFNQU2VzCisgICAgICogQSBwcm9maWxlIGNvbXBhdCBiaXQgY2FuIG9ubHkgYmUgc2V0IGlmIGFsbCBTUFNlcyBpbmNsdWRlIHRoYXQgYml0CisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IHJ0cGgyNjRkZXBheS0+c3BzLT5sZW47IGkrKykgeworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGdfcHRyX2FycmF5X2luZGV4IChydHBoMjY0ZGVwYXktPnNwcywgaSksICZuYWxtYXAsCisgICAgICAgICAgR1NUX01BUF9SRUFEKTsKKyAgICAgIHByb2ZpbGVfY29tcGF0ICY9IG5hbG1hcC5kYXRhWzJdOworICAgICAgbGV2ZWwgPSBNQVggKGxldmVsLCBuYWxtYXAuZGF0YVszXSk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NGRlcGF5LT5zcHMsIGkpLCAmbmFsbWFwKTsKKyAgICB9CisKKyAgICAvKiBBc3N1bWUgYWxsIFNQU2VzIHVzZSB0aGUgc2FtZSBwcm9maWxlLCBzbyBleHRyYWN0IGZyb20gdGhlIGZpcnN0IFNQUyAqLworICAgIGdzdF9idWZmZXJfbWFwIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NGRlcGF5LT5zcHMsIDApLCAmbmFsbWFwLAorICAgICAgICBHU1RfTUFQX1JFQUQpOworICAgICpkYXRhKysgPSBuYWxtYXAuZGF0YVsxXTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NGRlcGF5LT5zcHMsIDApLCAmbmFsbWFwKTsKKyAgICAqZGF0YSsrID0gcHJvZmlsZV9jb21wYXQ7CisgICAgKmRhdGErKyA9IGxldmVsOworCisgICAgLyogNiBiaXRzIHJlc2VydmVkIHwgMiBiaXRzIGxlbmd0aFNpemVNaW51c09uICovCisgICAgKmRhdGErKyA9IDB4ZmY7CisgICAgLyogMyBiaXRzIHJlc2VydmVkIHwgNSBiaXRzIG51bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzICovCisgICAgKmRhdGErKyA9IDB4ZTAgfCAocnRwaDI2NGRlcGF5LT5zcHMtPmxlbiAmIDB4MWYpOworCisgICAgLyogY29weSBhbGwgU1BTICovCisgICAgZm9yIChpID0gMDsgaSA8IHJ0cGgyNjRkZXBheS0+c3BzLT5sZW47IGkrKykgeworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGdfcHRyX2FycmF5X2luZGV4IChydHBoMjY0ZGVwYXktPnNwcywgaSksICZuYWxtYXAsCisgICAgICAgICAgR1NUX01BUF9SRUFEKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NGRlcGF5LCAiY29weSBTUFMgJWQgb2YgbGVuZ3RoICV1IiwgaSwKKyAgICAgICAgICAoZ3VpbnQpIG5hbG1hcC5zaXplKTsKKyAgICAgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEsIG5hbG1hcC5zaXplKTsKKyAgICAgIGRhdGEgKz0gMjsKKyAgICAgIG1lbWNweSAoZGF0YSwgbmFsbWFwLmRhdGEsIG5hbG1hcC5zaXplKTsKKyAgICAgIGRhdGEgKz0gbmFsbWFwLnNpemU7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NGRlcGF5LT5zcHMsIGkpLCAmbmFsbWFwKTsKKyAgICB9CisKKyAgICAvKiA4IGJpdHMgbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0cyAqLworICAgICpkYXRhKysgPSBydHBoMjY0ZGVwYXktPnBwcy0+bGVuOworICAgIC8qIGNvcHkgYWxsIFBQUyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBydHBoMjY0ZGVwYXktPnBwcy0+bGVuOyBpKyspIHsKKyAgICAgIGdzdF9idWZmZXJfbWFwIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NGRlcGF5LT5wcHMsIGkpLCAmbmFsbWFwLAorICAgICAgICAgIEdTVF9NQVBfUkVBRCk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRkZXBheSwgImNvcHkgUFBTICVkIG9mIGxlbmd0aCAldSIsIGksCisgICAgICAgICAgKGd1aW50KSBuYWxtYXAuc2l6ZSk7CisgICAgICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhLCBuYWxtYXAuc2l6ZSk7CisgICAgICBkYXRhICs9IDI7CisgICAgICBtZW1jcHkgKGRhdGEsIG5hbG1hcC5kYXRhLCBuYWxtYXAuc2l6ZSk7CisgICAgICBkYXRhICs9IG5hbG1hcC5zaXplOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjRkZXBheS0+cHBzLCBpKSwgJm5hbG1hcCk7CisgICAgfQorCisgICAgbmV3X3NpemUgPSBkYXRhIC0gbWFwLmRhdGE7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoY29kZWNfZGF0YSwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl9zZXRfc2l6ZSAoY29kZWNfZGF0YSwgbmV3X3NpemUpOworCisgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoc3JjY2FwcywKKyAgICAgICAgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGNvZGVjX2RhdGEsIE5VTEwpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGNvZGVjX2RhdGEpOworICB9CisKKyAgLyogU2V0IHByb2ZpbGUgYSBsZXZlbCBmcm9tIFNQUyAqLworICB7CisgICAgZ2ludCBpOworICAgIEdzdEJ1ZmZlciAqbWF4X2xldmVsX3NwcyA9IE5VTEw7CisgICAgZ2ludCBsZXZlbCA9IDA7CisgICAgR3N0TWFwSW5mbyBuYWxtYXA7CisKKyAgICAvKiBHZXQgdGhlIFNQUyB3aXRoIHRoZSBoaWdoZXN0IGxldmVsLiBXZSBhc3N1bWUKKyAgICAgKiBhbGwgU1BTIGhhdmUgdGhlIHNhbWUgcHJvZmlsZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBydHBoMjY0ZGVwYXktPnNwcy0+bGVuOyBpKyspIHsKKyAgICAgIGdzdF9idWZmZXJfbWFwIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NGRlcGF5LT5zcHMsIGkpLCAmbmFsbWFwLAorICAgICAgICAgIEdTVF9NQVBfUkVBRCk7CisgICAgICBpZiAobGV2ZWwgPT0gMCB8fCBsZXZlbCA8IG5hbG1hcC5kYXRhWzNdKSB7CisgICAgICAgIG1heF9sZXZlbF9zcHMgPSBnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NGRlcGF5LT5zcHMsIGkpOworICAgICAgICBsZXZlbCA9IG5hbG1hcC5kYXRhWzNdOworICAgICAgfQorICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjRkZXBheS0+c3BzLCBpKSwgJm5hbG1hcCk7CisgICAgfQorCisgICAgaWYgKG1heF9sZXZlbF9zcHMpIHsKKyAgICAgIGdzdF9idWZmZXJfbWFwIChtYXhfbGV2ZWxfc3BzLCAmbmFsbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgZ3N0X2NvZGVjX3V0aWxzX2gyNjRfY2Fwc19zZXRfbGV2ZWxfYW5kX3Byb2ZpbGUgKHNyY2NhcHMsIG5hbG1hcC5kYXRhICsgMSwKKyAgICAgICAgICBuYWxtYXAuc2l6ZSAtIDEpOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAobWF4X2xldmVsX3NwcywgJm5hbG1hcCk7CisgICAgfQorICB9CisKKyAgc3JjcGFkID0gR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKHJ0cGgyNjRkZXBheSk7CisKKyAgb2xkX2NhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHNyY3BhZCk7CisKKyAgaWYgKG9sZF9jYXBzID09IE5VTEwgfHwgIWdzdF9jYXBzX2lzX2VxdWFsIChzcmNjYXBzLCBvbGRfY2FwcykpIHsKKyAgICByZXMgPSBnc3RfcnRwX2gyNjRfZGVwYXlfc2V0X291dHB1dF9jYXBzIChydHBoMjY0ZGVwYXksIHNyY2NhcHMpOworICB9CisKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIC8qIEluc2VydCBTUFMgYW5kIFBQUyBpbnRvIHRoZSBzdHJlYW0gb24gbmV4dCBvcHBvcnR1bml0eSAoaWYgYnl0ZXN0cmVhbSkgKi8KKyAgaWYgKHJ0cGgyNjRkZXBheS0+Ynl0ZV9zdHJlYW0KKyAgICAgICYmIChydHBoMjY0ZGVwYXktPnNwcy0+bGVuID4gMCB8fCBydHBoMjY0ZGVwYXktPnBwcy0+bGVuID4gMCkpIHsKKyAgICBnaW50IGk7CisgICAgR3N0QnVmZmVyICpjb2RlY19kYXRhOworICAgIEdzdE1hcEluZm8gbWFwOworICAgIGd1aW50OCAqZGF0YTsKKyAgICBndWludCBsZW4gPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IHJ0cGgyNjRkZXBheS0+c3BzLT5sZW47IGkrKykgeworICAgICAgbGVuICs9IDQgKyBnc3RfYnVmZmVyX2dldF9zaXplIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NGRlcGF5LT5zcHMsIGkpKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcnRwaDI2NGRlcGF5LT5wcHMtPmxlbjsgaSsrKSB7CisgICAgICBsZW4gKz0gNCArIGdzdF9idWZmZXJfZ2V0X3NpemUgKGdfcHRyX2FycmF5X2luZGV4IChydHBoMjY0ZGVwYXktPnBwcywgaSkpOworICAgIH0KKworICAgIGNvZGVjX2RhdGEgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGxlbik7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKGNvZGVjX2RhdGEsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgIGRhdGEgPSBtYXAuZGF0YTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBydHBoMjY0ZGVwYXktPnNwcy0+bGVuOyBpKyspIHsKKyAgICAgIEdzdEJ1ZmZlciAqc3BzX2J1ZiA9IGdfcHRyX2FycmF5X2luZGV4IChydHBoMjY0ZGVwYXktPnNwcywgaSk7CisgICAgICBndWludCBzcHNfc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKHNwc19idWYpOworCisgICAgICBpZiAocnRwaDI2NGRlcGF5LT5ieXRlX3N0cmVhbSkKKyAgICAgICAgbWVtY3B5IChkYXRhLCBzeW5jX2J5dGVzLCBzaXplb2YgKHN5bmNfYnl0ZXMpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSwgc3BzX3NpemUpOworICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChzcHNfYnVmLCAwLCBkYXRhICsgNCwgLTEpOworICAgICAgZGF0YSArPSA0ICsgc3BzX3NpemU7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHJ0cGgyNjRkZXBheS0+cHBzLT5sZW47IGkrKykgeworICAgICAgR3N0QnVmZmVyICpwcHNfYnVmID0gZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjRkZXBheS0+cHBzLCBpKTsKKyAgICAgIGd1aW50IHBwc19zaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAocHBzX2J1Zik7CisKKyAgICAgIGlmIChydHBoMjY0ZGVwYXktPmJ5dGVfc3RyZWFtKQorICAgICAgICBtZW1jcHkgKGRhdGEsIHN5bmNfYnl0ZXMsIHNpemVvZiAoc3luY19ieXRlcykpOworICAgICAgZWxzZQorICAgICAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChkYXRhLCBwcHNfc2l6ZSk7CisgICAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKHBwc19idWYsIDAsIGRhdGEgKyA0LCAtMSk7CisgICAgICBkYXRhICs9IDQgKyBwcHNfc2l6ZTsKKyAgICB9CisKKyAgICBnc3RfYnVmZmVyX3VubWFwIChjb2RlY19kYXRhLCAmbWFwKTsKKyAgICBpZiAocnRwaDI2NGRlcGF5LT5jb2RlY19kYXRhKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocnRwaDI2NGRlcGF5LT5jb2RlY19kYXRhKTsKKyAgICBydHBoMjY0ZGVwYXktPmNvZGVjX2RhdGEgPSBjb2RlY19kYXRhOworICB9CisKKyAgaWYgKHJlcykKKyAgICBydHBoMjY0ZGVwYXktPm5ld19jb2RlY19kYXRhID0gRkFMU0U7CisKKyAgcmV0dXJuIHJlczsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2NF9hZGRfc3BzX3BwcyAoR3N0RWxlbWVudCAqIHJ0cGgyNjQsIEdQdHJBcnJheSAqIHNwc19hcnJheSwKKyAgICBHUHRyQXJyYXkgKiBwcHNfYXJyYXksIEdzdEJ1ZmZlciAqIG5hbCkKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1Y2hhciB0eXBlOworICBndWludCBpOworCisgIGdzdF9idWZmZXJfbWFwIChuYWwsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgdHlwZSA9IG1hcC5kYXRhWzBdICYgMHgxZjsKKworICBpZiAodHlwZSA9PSA3KSB7CisgICAgZ3VpbnQzMiBzcHNfaWQ7CisKKyAgICBpZiAoIXBhcnNlX3NwcyAoJm1hcCwgJnNwc19pZCkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwaDI2NCwgIkludmFsaWQgU1BTLCIKKyAgICAgICAgICAiIGNhbid0IHBhcnNlIHNlcV9wYXJhbWV0ZXJfc2V0X2lkIik7CisgICAgICBnb3RvIGRyb3A7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHNwc19hcnJheS0+bGVuOyBpKyspIHsKKyAgICAgIEdzdEJ1ZmZlciAqc3BzID0gZ19wdHJfYXJyYXlfaW5kZXggKHNwc19hcnJheSwgaSk7CisgICAgICBHc3RNYXBJbmZvIHNwc21hcDsKKyAgICAgIGd1aW50MzIgdG1wX3Nwc19pZDsKKworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKHNwcywgJnNwc21hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIHBhcnNlX3NwcyAoJnNwc21hcCwgJnRtcF9zcHNfaWQpOworCisgICAgICBpZiAoc3BzX2lkID09IHRtcF9zcHNfaWQpIHsKKyAgICAgICAgaWYgKG1hcC5zaXplID09IHNwc21hcC5zaXplICYmCisgICAgICAgICAgICBtZW1jbXAgKG1hcC5kYXRhLCBzcHNtYXAuZGF0YSwgc3BzbWFwLnNpemUpID09IDApIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2NCwgIlVuY2hhbmdlZCBTUFMgJXUsIG5vdCB1cGRhdGluZyIsIHNwc19pZCk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc3BzLCAmc3BzbWFwKTsKKyAgICAgICAgICBnb3RvIGRyb3A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc3BzLCAmc3BzbWFwKTsKKyAgICAgICAgICBnX3B0cl9hcnJheV9yZW1vdmVfaW5kZXhfZmFzdCAoc3BzX2FycmF5LCBpKTsKKyAgICAgICAgICBnX3B0cl9hcnJheV9hZGQgKHNwc19hcnJheSwgbmFsKTsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2NCwgIk1vZGlmaWVkIFNQUyAldSwgcmVwbGFjaW5nIiwgc3BzX2lkKTsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHNwcywgJnNwc21hcCk7CisgICAgfQorICAgIEdTVF9MT0dfT0JKRUNUIChydHBoMjY0LCAiQWRkaW5nIG5ldyBTUFMgJXUiLCBzcHNfaWQpOworICAgIGdfcHRyX2FycmF5X2FkZCAoc3BzX2FycmF5LCBuYWwpOworICB9IGVsc2UgaWYgKHR5cGUgPT0gOCkgeworICAgIGd1aW50MzIgc3BzX2lkOworICAgIGd1aW50MzIgcHBzX2lkOworCisgICAgaWYgKCFwYXJzZV9wcHMgKCZtYXAsICZzcHNfaWQsICZwcHNfaWQpKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cGgyNjQsICJJbnZhbGlkIFBQUywiCisgICAgICAgICAgIiBjYW4ndCBwYXJzZSBzZXFfcGFyYW1ldGVyX3NldF9pZCBvciBwaWNfcGFyYW1ldGVyX3NldF9pZCIpOworICAgICAgZ290byBkcm9wOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBwcHNfYXJyYXktPmxlbjsgaSsrKSB7CisgICAgICBHc3RCdWZmZXIgKnBwcyA9IGdfcHRyX2FycmF5X2luZGV4IChwcHNfYXJyYXksIGkpOworICAgICAgR3N0TWFwSW5mbyBwcHNtYXA7CisgICAgICBndWludDMyIHRtcF9zcHNfaWQ7CisgICAgICBndWludDMyIHRtcF9wcHNfaWQ7CisKKworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKHBwcywgJnBwc21hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIHBhcnNlX3BwcyAoJnBwc21hcCwgJnRtcF9zcHNfaWQsICZ0bXBfcHBzX2lkKTsKKworICAgICAgaWYgKHBwc19pZCA9PSB0bXBfcHBzX2lkKSB7CisgICAgICAgIGlmIChtYXAuc2l6ZSA9PSBwcHNtYXAuc2l6ZSAmJgorICAgICAgICAgICAgbWVtY21wIChtYXAuZGF0YSwgcHBzbWFwLmRhdGEsIHBwc21hcC5zaXplKSA9PSAwKSB7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGgyNjQsICJVbmNoYW5nZWQgUFBTICV1OiV1LCBub3QgdXBkYXRpbmciLCBzcHNfaWQsCisgICAgICAgICAgICAgIHBwc19pZCk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAocHBzLCAmcHBzbWFwKTsKKyAgICAgICAgICBnb3RvIGRyb3A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAocHBzLCAmcHBzbWFwKTsKKyAgICAgICAgICBnX3B0cl9hcnJheV9yZW1vdmVfaW5kZXhfZmFzdCAocHBzX2FycmF5LCBpKTsKKyAgICAgICAgICBnX3B0cl9hcnJheV9hZGQgKHBwc19hcnJheSwgbmFsKTsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2NCwgIk1vZGlmaWVkIFBQUyAldToldSwgcmVwbGFjaW5nIiwKKyAgICAgICAgICAgICAgc3BzX2lkLCBwcHNfaWQpOworICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAocHBzLCAmcHBzbWFwKTsKKyAgICB9CisgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGgyNjQsICJBZGRpbmcgbmV3IFBQUyAldTolaSIsIHNwc19pZCwgcHBzX2lkKTsKKyAgICBnX3B0cl9hcnJheV9hZGQgKHBwc19hcnJheSwgbmFsKTsKKyAgfSBlbHNlIHsKKyAgICBnb3RvIGRyb3A7CisgIH0KKworZG9uZToKKyAgZ3N0X2J1ZmZlcl91bm1hcCAobmFsLCAmbWFwKTsKKworICByZXR1cm4gVFJVRTsKKworZHJvcDoKKyAgZ3N0X2J1ZmZlcl91bm1hcCAobmFsLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAobmFsKTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NF9kZXBheV9hZGRfc3BzX3BwcyAoR3N0UnRwSDI2NERlcGF5ICogcnRwaDI2NGRlcGF5LCBHc3RCdWZmZXIgKiBuYWwpCit7CisgIGlmIChnc3RfcnRwX2gyNjRfYWRkX3Nwc19wcHMgKEdTVF9FTEVNRU5UIChydHBoMjY0ZGVwYXkpLAorICAgICAgICAgIHJ0cGgyNjRkZXBheS0+c3BzLCBydHBoMjY0ZGVwYXktPnBwcywgbmFsKSkKKyAgICBydHBoMjY0ZGVwYXktPm5ld19jb2RlY19kYXRhID0gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2gyNjRfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgR3N0UnRwSDI2NERlcGF5ICpydHBoMjY0ZGVwYXk7CisgIGNvbnN0IGdjaGFyICpwczsKKyAgR3N0QnVmZmVyICpjb2RlY19kYXRhOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4ICpwdHI7CisKKyAgcnRwaDI2NGRlcGF5ID0gR1NUX1JUUF9IMjY0X0RFUEFZIChkZXBheWxvYWQpOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA5MDAwMDsKKyAgZGVwYXlsb2FkLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICAvKiBCYXNlNjQgZW5jb2RlZCwgY29tbWEgc2VwYXJhdGVkIGNvbmZpZyBOQUxzICovCisgIHBzID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJzcHJvcC1wYXJhbWV0ZXItc2V0cyIpOworCisgIC8qIG5lZ290aWF0ZSB3aXRoIGRvd25zdHJlYW0gdy5yLnQuIG91dHB1dCBmb3JtYXQgYW5kIGFsaWdubWVudCAqLworICBnc3RfcnRwX2gyNjRfZGVwYXlfbmVnb3RpYXRlIChydHBoMjY0ZGVwYXkpOworCisgIGlmIChydHBoMjY0ZGVwYXktPmJ5dGVfc3RyZWFtICYmIHBzICE9IE5VTEwpIHsKKyAgICAvKiBmb3IgYnl0ZXN0cmVhbSB3ZSBvbmx5IG5lZWQgdGhlIHBhcmFtZXRlciBzZXRzIGJ1dCB3ZSBkb24ndCBlcnJvciBvdXQKKyAgICAgKiB3aGVuIHRoZXkgYXJlIG5vdCB0aGVyZSwgd2UgYXNzdW1lIHRoZXkgYXJlIGluIHRoZSBzdHJlYW0uICovCisgICAgZ2NoYXIgKipwYXJhbXM7CisgICAgZ3VpbnQgbGVuLCB0b3RhbDsKKyAgICBnaW50IGk7CisKKyAgICBwYXJhbXMgPSBnX3N0cnNwbGl0IChwcywgIiwiLCAwKTsKKworICAgIC8qIGNvdW50IHRvdGFsIG51bWJlciBvZiBieXRlcyBpbiBiYXNlNjQuIEFsc28gaW5jbHVkZSB0aGUgc3luYyBieXRlcyBpbgorICAgICAqIGZyb250IG9mIHRoZSBwYXJhbXMuICovCisgICAgbGVuID0gMDsKKyAgICBmb3IgKGkgPSAwOyBwYXJhbXNbaV07IGkrKykgeworICAgICAgbGVuICs9IHN0cmxlbiAocGFyYW1zW2ldKTsKKyAgICAgIGxlbiArPSBzaXplb2YgKHN5bmNfYnl0ZXMpOworICAgIH0KKyAgICAvKiB3ZSBzZXJpb3VzbHkgb3ZlcnNob290IHRoZSBsZW5ndGgsIGJ1dCBpdCdzIGZpbmUuICovCisgICAgY29kZWNfZGF0YSA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobGVuKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChjb2RlY19kYXRhLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBwdHIgPSBtYXAuZGF0YTsKKyAgICB0b3RhbCA9IDA7CisgICAgZm9yIChpID0gMDsgcGFyYW1zW2ldOyBpKyspIHsKKyAgICAgIGd1aW50IHNhdmUgPSAwOworICAgICAgZ2ludCBzdGF0ZSA9IDA7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgImRlY29kaW5nIHBhcmFtICVkICglcykiLCBpLCBwYXJhbXNbaV0pOworICAgICAgbWVtY3B5IChwdHIsIHN5bmNfYnl0ZXMsIHNpemVvZiAoc3luY19ieXRlcykpOworICAgICAgcHRyICs9IHNpemVvZiAoc3luY19ieXRlcyk7CisgICAgICBsZW4gPQorICAgICAgICAgIGdfYmFzZTY0X2RlY29kZV9zdGVwIChwYXJhbXNbaV0sIHN0cmxlbiAocGFyYW1zW2ldKSwgcHRyLCAmc3RhdGUsCisgICAgICAgICAgJnNhdmUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAiZGVjb2RlZCAlZCBieXRlcyIsIGxlbik7CisgICAgICB0b3RhbCArPSBsZW4gKyBzaXplb2YgKHN5bmNfYnl0ZXMpOworICAgICAgcHRyICs9IGxlbjsKKyAgICB9CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoY29kZWNfZGF0YSwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKGNvZGVjX2RhdGEsIDAsIHRvdGFsKTsKKyAgICBnX3N0cmZyZWV2IChwYXJhbXMpOworCisgICAgLyoga2VlcCB0aGUgY29kZWNfZGF0YSwgd2UgbmVlZCB0byBzZW5kIGl0IGFzIHRoZSBmaXJzdCBidWZmZXIuIFdlIGNhbm5vdAorICAgICAqIHB1c2ggaXQgaW4gdGhlIGFkYXB0ZXIgYmVjYXVzZSB0aGUgYWRhcHRlciBtaWdodCBiZSBmbHVzaGVkIG9uIGRpc2NvbnQuCisgICAgICovCisgICAgaWYgKHJ0cGgyNjRkZXBheS0+Y29kZWNfZGF0YSkKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHJ0cGgyNjRkZXBheS0+Y29kZWNfZGF0YSk7CisgICAgcnRwaDI2NGRlcGF5LT5jb2RlY19kYXRhID0gY29kZWNfZGF0YTsKKyAgfSBlbHNlIGlmICghcnRwaDI2NGRlcGF5LT5ieXRlX3N0cmVhbSkgeworICAgIGdjaGFyICoqcGFyYW1zOworICAgIGdpbnQgaTsKKworICAgIGlmIChwcyA9PSBOVUxMKQorICAgICAgZ290byBpbmNvbXBsZXRlX2NhcHM7CisKKyAgICBwYXJhbXMgPSBnX3N0cnNwbGl0IChwcywgIiwiLCAwKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgIndlIGhhdmUgJWQgcGFyYW1zIiwgZ19zdHJ2X2xlbmd0aCAocGFyYW1zKSk7CisKKyAgICAvKiBzdGFydCB3aXRoIDcgYnl0ZXMgaGVhZGVyICovCisgICAgZm9yIChpID0gMDsgcGFyYW1zW2ldOyBpKyspIHsKKyAgICAgIEdzdEJ1ZmZlciAqbmFsOworICAgICAgR3N0TWFwSW5mbyBuYWxtYXA7CisgICAgICBnc2l6ZSBuYWxfbGVuOworICAgICAgZ3VpbnQgc2F2ZSA9IDA7CisgICAgICBnaW50IHN0YXRlID0gMDsKKworICAgICAgbmFsX2xlbiA9IHN0cmxlbiAocGFyYW1zW2ldKTsKKyAgICAgIGlmIChuYWxfbGVuID09IDApIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZXBheWxvYWQsICJlbXB0eSBwYXJhbSAnJXMnICgjJWQpIiwgcGFyYW1zW2ldLCBpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBuYWwgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG5hbF9sZW4pOworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKG5hbCwgJm5hbG1hcCwgR1NUX01BUF9SRUFEV1JJVEUpOworCisgICAgICBuYWxfbGVuID0KKyAgICAgICAgICBnX2Jhc2U2NF9kZWNvZGVfc3RlcCAocGFyYW1zW2ldLCBuYWxfbGVuLCBuYWxtYXAuZGF0YSwgJnN0YXRlLCAmc2F2ZSk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgImFkZGluZyBwYXJhbSAlZCBhcyAlcyIsIGksCisgICAgICAgICAgKChuYWxtYXAuZGF0YVswXSAmIDB4MWYpID09IDcpID8gIlNQUyIgOiAiUFBTIik7CisKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG5hbCwgJm5hbG1hcCk7CisgICAgICBnc3RfYnVmZmVyX3NldF9zaXplIChuYWwsIG5hbF9sZW4pOworCisgICAgICBnc3RfcnRwX2gyNjRfZGVwYXlfYWRkX3Nwc19wcHMgKHJ0cGgyNjRkZXBheSwgbmFsKTsKKyAgICB9CisgICAgZ19zdHJmcmVldiAocGFyYW1zKTsKKworICAgIGlmIChydHBoMjY0ZGVwYXktPnNwcy0+bGVuID09IDAgfHwgcnRwaDI2NGRlcGF5LT5wcHMtPmxlbiA9PSAwKQorICAgICAgZ290byBpbmNvbXBsZXRlX2NhcHM7CisgIH0KKworICByZXR1cm4gZ3N0X3J0cF9oMjY0X3NldF9zcmNfY2FwcyAocnRwaDI2NGRlcGF5KTsKKworICAvKiBFUlJPUlMgKi8KK2luY29tcGxldGVfY2FwczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgIndlIGhhdmUgaW5jb21wbGV0ZSBjYXBzLCIKKyAgICAgICAgIiBkb2luZyBzZXRjYXBzIGxhdGVyIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX2gyNjRfZGVwYXlfYWxsb2NhdGVfb3V0cHV0X2J1ZmZlciAoR3N0UnRwSDI2NERlcGF5ICogZGVwYXksIGdzaXplIHNpemUpCit7CisgIEdzdEJ1ZmZlciAqYnVmZmVyID0gTlVMTDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc2l6ZSA+IDAsIE5VTEwpOworCisgIEdTVF9MT0dfT0JKRUNUIChkZXBheSwgIndhbnQgb3V0cHV0IGJ1ZmZlciBvZiAldSBieXRlcyIsIChndWludCkgc2l6ZSk7CisKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKGRlcGF5LT5hbGxvY2F0b3IsIHNpemUsICZkZXBheS0+cGFyYW1zKTsKKyAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChkZXBheSwgImNvdWxkbid0IGFsbG9jYXRlIG91dHB1dCBidWZmZXIiKTsKKyAgICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgc2l6ZSwgTlVMTCk7CisgIH0KKworICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfaDI2NF9jb21wbGV0ZV9hdSAoR3N0UnRwSDI2NERlcGF5ICogcnRwaDI2NGRlcGF5LAorICAgIEdzdENsb2NrVGltZSAqIG91dF90aW1lc3RhbXAsIGdib29sZWFuICogb3V0X2tleWZyYW1lKQoreworICBHc3RCdWZmZXJMaXN0ICpsaXN0OworICBHc3RNYXBJbmZvIG91dG1hcDsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIGd1aW50IG91dHNpemUsIG9mZnNldCA9IDA7CisgIGdpbnQgYiwgbl9idWZzLCBtLCBuX21lbTsKKworICAvKiB3ZSBoYWQgYSBwaWN0dXJlIGluIHRoZSBhZGFwdGVyIGFuZCB3ZSBjb21wbGV0ZWQgaXQgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NGRlcGF5LCAidGFraW5nIGNvbXBsZXRlZCBBVSIpOworICBvdXRzaXplID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBoMjY0ZGVwYXktPnBpY3R1cmVfYWRhcHRlcik7CisKKyAgb3V0YnVmID0gZ3N0X3J0cF9oMjY0X2RlcGF5X2FsbG9jYXRlX291dHB1dF9idWZmZXIgKHJ0cGgyNjRkZXBheSwgb3V0c2l6ZSk7CisKKyAgaWYgKG91dGJ1ZiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZiwgJm91dG1hcCwgR1NUX01BUF9XUklURSkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbGlzdCA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyX2xpc3QgKHJ0cGgyNjRkZXBheS0+cGljdHVyZV9hZGFwdGVyLCBvdXRzaXplKTsKKworICBuX2J1ZnMgPSBnc3RfYnVmZmVyX2xpc3RfbGVuZ3RoIChsaXN0KTsKKyAgZm9yIChiID0gMDsgYiA8IG5fYnVmczsgKytiKSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX2xpc3RfZ2V0IChsaXN0LCBiKTsKKworICAgIG5fbWVtID0gZ3N0X2J1ZmZlcl9uX21lbW9yeSAoYnVmKTsKKyAgICBmb3IgKG0gPSAwOyBtIDwgbl9tZW07ICsrbSkgeworICAgICAgR3N0TWVtb3J5ICptZW0gPSBnc3RfYnVmZmVyX3BlZWtfbWVtb3J5IChidWYsIG0pOworICAgICAgZ3NpemUgbWVtX3NpemUgPSBnc3RfbWVtb3J5X2dldF9zaXplcyAobWVtLCBOVUxMLCBOVUxMKTsKKyAgICAgIEdzdE1hcEluZm8gbWVtX21hcDsKKworICAgICAgaWYgKGdzdF9tZW1vcnlfbWFwIChtZW0sICZtZW1fbWFwLCBHU1RfTUFQX1JFQUQpKSB7CisgICAgICAgIG1lbWNweSAob3V0bWFwLmRhdGEgKyBvZmZzZXQsIG1lbV9tYXAuZGF0YSwgbWVtX3NpemUpOworICAgICAgICBnc3RfbWVtb3J5X3VubWFwIChtZW0sICZtZW1fbWFwKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1lbXNldCAob3V0bWFwLmRhdGEgKyBvZmZzZXQsIDAsIG1lbV9zaXplKTsKKyAgICAgIH0KKyAgICAgIG9mZnNldCArPSBtZW1fc2l6ZTsKKyAgICB9CisKKyAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwaDI2NGRlcGF5LCBvdXRidWYsIGJ1Zik7CisgIH0KKyAgZ3N0X2J1ZmZlcl9saXN0X3VucmVmIChsaXN0KTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmb3V0bWFwKTsKKworICAqb3V0X3RpbWVzdGFtcCA9IHJ0cGgyNjRkZXBheS0+bGFzdF90czsKKyAgKm91dF9rZXlmcmFtZSA9IHJ0cGgyNjRkZXBheS0+bGFzdF9rZXlmcmFtZTsKKworICBydHBoMjY0ZGVwYXktPmxhc3Rfa2V5ZnJhbWUgPSBGQUxTRTsKKyAgcnRwaDI2NGRlcGF5LT5waWN0dXJlX3N0YXJ0ID0gRkFMU0U7CisKKyAgcmV0dXJuIG91dGJ1ZjsKK30KKworLyogU1BTL1BQUy9JRFIgY29uc2lkZXJlZCBrZXksIGFsbCBvdGhlcnMgREVMVEE7CisgKiBzbyBkb3duc3RyZWFtIHdhaXRpbmcgZm9yIGtleWZyYW1lIGNhbiBwaWNrIHVwIGF0IFNQUy9QUFMvSURSICovCisjZGVmaW5lIE5BTF9UWVBFX0lTX0tFWShudCkgKCgobnQpID09IDUpIHx8ICgobnQpID09IDcpIHx8ICgobnQpID09IDgpKQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY0X2RlcGF5X2hhbmRsZV9uYWwgKEdzdFJ0cEgyNjREZXBheSAqIHJ0cGgyNjRkZXBheSwgR3N0QnVmZmVyICogbmFsLAorICAgIEdzdENsb2NrVGltZSBpbl90aW1lc3RhbXAsIGdib29sZWFuIG1hcmtlcikKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCAqZGVwYXlsb2FkID0gR1NUX1JUUF9CQVNFX0RFUEFZTE9BRCAocnRwaDI2NGRlcGF5KTsKKyAgZ2ludCBuYWxfdHlwZTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgR3N0Q2xvY2tUaW1lIG91dF90aW1lc3RhbXA7CisgIGdib29sZWFuIGtleWZyYW1lLCBvdXRfa2V5ZnJhbWU7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG5hbCwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgaWYgKEdfVU5MSUtFTFkgKG1hcC5zaXplIDwgNSkpCisgICAgZ290byBzaG9ydF9uYWw7CisKKyAgbmFsX3R5cGUgPSBtYXAuZGF0YVs0XSAmIDB4MWY7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRkZXBheSwgImhhbmRsZSBOQUwgdHlwZSAlZCIsIG5hbF90eXBlKTsKKworICBrZXlmcmFtZSA9IE5BTF9UWVBFX0lTX0tFWSAobmFsX3R5cGUpOworCisgIG91dF9rZXlmcmFtZSA9IGtleWZyYW1lOworICBvdXRfdGltZXN0YW1wID0gaW5fdGltZXN0YW1wOworCisgIGlmICghcnRwaDI2NGRlcGF5LT5ieXRlX3N0cmVhbSkgeworICAgIGlmIChuYWxfdHlwZSA9PSA3IHx8IG5hbF90eXBlID09IDgpIHsKKyAgICAgIGdzdF9ydHBfaDI2NF9kZXBheV9hZGRfc3BzX3BwcyAocnRwaDI2NGRlcGF5LAorICAgICAgICAgIGdzdF9idWZmZXJfY29weV9yZWdpb24gKG5hbCwgR1NUX0JVRkZFUl9DT1BZX0FMTCwKKyAgICAgICAgICAgICAgNCwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAobmFsKSAtIDQpKTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG5hbCwgJm1hcCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChuYWwpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAocnRwaDI2NGRlcGF5LT5zcHMtPmxlbiA9PSAwIHx8IHJ0cGgyNjRkZXBheS0+cHBzLT5sZW4gPT0gMCkgeworICAgICAgLyogRG93biBwdXNoIGRvd24gYW55IGJ1ZmZlciBpbiBub24tYnl0ZXN0cmVhbSBtb2RlIGlmIHRoZSBTUFMvUFBTIGhhdmVuJ3QKKyAgICAgICAqIGdvIHRocm91Z2ggeWV0CisgICAgICAgKi8KKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TSU5LUEFEIChkZXBheWxvYWQpLAorICAgICAgICAgIGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNLAorICAgICAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoIkdzdEZvcmNlS2V5VW5pdCIsCisgICAgICAgICAgICAgICAgICAiYWxsLWhlYWRlcnMiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCkpKTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG5hbCwgJm1hcCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChuYWwpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChydHBoMjY0ZGVwYXktPm5ld19jb2RlY19kYXRhICYmCisgICAgICAgIHJ0cGgyNjRkZXBheS0+c3BzLT5sZW4gPiAwICYmIHJ0cGgyNjRkZXBheS0+cHBzLT5sZW4gPiAwKQorICAgICAgZ3N0X3J0cF9oMjY0X3NldF9zcmNfY2FwcyAocnRwaDI2NGRlcGF5KTsKKyAgfQorCisKKyAgaWYgKHJ0cGgyNjRkZXBheS0+bWVyZ2UpIHsKKyAgICBnYm9vbGVhbiBzdGFydCA9IEZBTFNFLCBjb21wbGV0ZSA9IEZBTFNFOworCisgICAgLyogbWFya2VyIGJpdCBpc24ndCBtYW5kYXRvcnkgc28gaW4gdGhlIGZvbGxvd2luZyBjb2RlIHdlIHRyeSB0byBndWVzcworICAgICAqIGFuIEFVIGJvdW5kYXJ5IGJ5IGRldGVjdGluZyBhIG5ldyBwaWN0dXJlIHN0YXJ0ICovCisgICAgaWYgKCFtYXJrZXIpIHsKKyAgICAgIC8qIGNvbnNpZGVyIGEgY29kZWQgc2xpY2VzIChJRFIgb3Igbm90KSB0byBzdGFydCBhIHBpY3R1cmUsCisgICAgICAgKiAoc28gZW5kaW5nIHRoZSBwcmV2aW91cyBvbmUpIGlmIGZpcnN0X21iX2luX3NsaWNlID09IDAKKyAgICAgICAqIChub24tMCBpcyBwYXJ0IG9mIHByZXZpb3VzIG9uZSkgKi8KKyAgICAgIC8qIE5PVEUgdGhpcyBpcyBub3QgZW50aXJlbHkgYWNjb3JkaW5nIHRvIEFjY2VzcyBVbml0IHNwZWNzIGluIDcuNC4xLjIuNCwKKyAgICAgICAqIGJ1dCBpbiBwcmFjdGljZSBpdCB3b3JrcyBpbiBzYW5lIGNhc2VzLCBuZWVkcyBub3QgbXVjaCBwYXJzaW5nLAorICAgICAgICogYW5kIGFsc28gd29ya3Mgd2l0aCBicm9rZW4gZnJhbWVfbnVtIGluIE5BTCAod2hlcmUgc3BlYy13aXNlIHdvdWxkIGZhaWwpICovCisgICAgICAvKiBGSVhNRTogdGhpcyBjb2RlIGlzbid0IGNvcnJlY3QgZm9yIGludGVybGFjZWQgY29udGVudCBhcyBBVXMgc2hvdWxkIGJlCisgICAgICAgKiBjb25zdHJ1Y3RlZCB3aXRoIHBhaXJzIG9mIGZpZWxkcyBhbmQgdGhlIGd1ZXNzIGhlcmUgd2lsbCBqdXN0IHB1c2ggb3V0CisgICAgICAgKiBBVXMgd2l0aCBhIHNpbmdsZSBmaWVsZCBpbiBpdCAqLworICAgICAgaWYgKG5hbF90eXBlID09IDEgfHwgbmFsX3R5cGUgPT0gMiB8fCBuYWxfdHlwZSA9PSA1KSB7CisgICAgICAgIC8qIHdlIGhhdmUgYSBwaWN0dXJlIHN0YXJ0ICovCisgICAgICAgIHN0YXJ0ID0gVFJVRTsKKyAgICAgICAgaWYgKG1hcC5kYXRhWzVdICYgMHg4MCkgeworICAgICAgICAgIC8qIGZpcnN0X21iX2luX3NsaWNlID09IDAgY29tcGxldGVzIGEgcGljdHVyZSAqLworICAgICAgICAgIGNvbXBsZXRlID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChuYWxfdHlwZSA+PSA2ICYmIG5hbF90eXBlIDw9IDkpIHsKKyAgICAgICAgLyogU0VJLCBTUFMsIFBQUywgQVUgdGVybWluYXRlIHBpY3R1cmUgKi8KKyAgICAgICAgY29tcGxldGUgPSBUUlVFOworICAgICAgfQorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAic3RhcnQgJWQsIGNvbXBsZXRlICVkIiwgc3RhcnQsIGNvbXBsZXRlKTsKKworICAgICAgaWYgKGNvbXBsZXRlICYmIHJ0cGgyNjRkZXBheS0+cGljdHVyZV9zdGFydCkKKyAgICAgICAgb3V0YnVmID0gZ3N0X3J0cF9oMjY0X2NvbXBsZXRlX2F1IChydHBoMjY0ZGVwYXksICZvdXRfdGltZXN0YW1wLAorICAgICAgICAgICAgJm91dF9rZXlmcmFtZSk7CisgICAgfQorICAgIC8qIGFkZCB0byBhZGFwdGVyICovCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAobmFsLCAmbWFwKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgImFkZGluZyBOQUwgdG8gcGljdHVyZSBhZGFwdGVyIik7CisgICAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwaDI2NGRlcGF5LT5waWN0dXJlX2FkYXB0ZXIsIG5hbCk7CisgICAgcnRwaDI2NGRlcGF5LT5sYXN0X3RzID0gaW5fdGltZXN0YW1wOworICAgIHJ0cGgyNjRkZXBheS0+bGFzdF9rZXlmcmFtZSB8PSBrZXlmcmFtZTsKKyAgICBydHBoMjY0ZGVwYXktPnBpY3R1cmVfc3RhcnQgfD0gc3RhcnQ7CisKKyAgICBpZiAobWFya2VyKQorICAgICAgb3V0YnVmID0gZ3N0X3J0cF9oMjY0X2NvbXBsZXRlX2F1IChydHBoMjY0ZGVwYXksICZvdXRfdGltZXN0YW1wLAorICAgICAgICAgICZvdXRfa2V5ZnJhbWUpOworICB9IGVsc2UgeworICAgIC8qIG5vIG1lcmdlLCBvdXRwdXQgaXMgaW5wdXQgbmFsICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAidXNpbmcgTkFMIGFzIG91dHB1dCIpOworICAgIG91dGJ1ZiA9IG5hbDsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChuYWwsICZtYXApOworICB9CisKKyAgaWYgKG91dGJ1ZikgeworICAgIC8qIHByZXBlbmQgY29kZWNfZGF0YSAqLworICAgIGlmIChydHBoMjY0ZGVwYXktPmNvZGVjX2RhdGEpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgInByZXBlbmRpbmcgY29kZWNfZGF0YSIpOworICAgICAgZ3N0X3J0cF9jb3B5X3ZpZGVvX21ldGEgKHJ0cGgyNjRkZXBheSwgcnRwaDI2NGRlcGF5LT5jb2RlY19kYXRhLCBvdXRidWYpOworICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHJ0cGgyNjRkZXBheS0+Y29kZWNfZGF0YSwgb3V0YnVmKTsKKyAgICAgIHJ0cGgyNjRkZXBheS0+Y29kZWNfZGF0YSA9IE5VTEw7CisgICAgICBvdXRfa2V5ZnJhbWUgPSBUUlVFOworICAgIH0KKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKG91dGJ1Zik7CisKKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX3ZpZGVvX21ldGEgKHJ0cGgyNjRkZXBheSwgb3V0YnVmKTsKKworICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gb3V0X3RpbWVzdGFtcDsKKworICAgIGlmIChvdXRfa2V5ZnJhbWUpCisgICAgICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworICAgIGVsc2UKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgICAgZ3N0X3J0cF9iYXNlX2RlcGF5bG9hZF9wdXNoIChkZXBheWxvYWQsIG91dGJ1Zik7CisgIH0KKworICByZXR1cm47CisKKyAgLyogRVJST1JTICovCitzaG9ydF9uYWw6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgImRyb3BwaW5nIHNob3J0IE5BTCIpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG5hbCwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAobmFsKTsKKyAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NF9maW5pc2hfZnJhZ21lbnRhdGlvbl91bml0IChHc3RSdHBIMjY0RGVwYXkgKiBydHBoMjY0ZGVwYXkpCit7CisgIGd1aW50IG91dHNpemU7CisgIEdzdE1hcEluZm8gbWFwOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKworICBvdXRzaXplID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBoMjY0ZGVwYXktPmFkYXB0ZXIpOworICBvdXRidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwaDI2NGRlcGF5LT5hZGFwdGVyLCBvdXRzaXplKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NGRlcGF5LCAib3V0cHV0ICVkIGJ5dGVzIiwgb3V0c2l6ZSk7CisKKyAgaWYgKHJ0cGgyNjRkZXBheS0+Ynl0ZV9zdHJlYW0pIHsKKyAgICBtZW1jcHkgKG1hcC5kYXRhLCBzeW5jX2J5dGVzLCBzaXplb2YgKHN5bmNfYnl0ZXMpKTsKKyAgfSBlbHNlIHsKKyAgICBvdXRzaXplIC09IDQ7CisgICAgbWFwLmRhdGFbMF0gPSAob3V0c2l6ZSA+PiAyNCk7CisgICAgbWFwLmRhdGFbMV0gPSAob3V0c2l6ZSA+PiAxNik7CisgICAgbWFwLmRhdGFbMl0gPSAob3V0c2l6ZSA+PiA4KTsKKyAgICBtYXAuZGF0YVszXSA9IChvdXRzaXplKTsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWYsICZtYXApOworCisgIHJ0cGgyNjRkZXBheS0+Y3VycmVudF9mdV90eXBlID0gMDsKKworICBnc3RfcnRwX2gyNjRfZGVwYXlfaGFuZGxlX25hbCAocnRwaDI2NGRlcGF5LCBvdXRidWYsCisgICAgICBydHBoMjY0ZGVwYXktPmZ1X3RpbWVzdGFtcCwgcnRwaDI2NGRlcGF5LT5mdV9tYXJrZXIpOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfaDI2NF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cEgyNjREZXBheSAqcnRwaDI2NGRlcGF5OworICBHc3RCdWZmZXIgKm91dGJ1ZiA9IE5VTEw7CisgIGd1aW50OCBuYWxfdW5pdF90eXBlOworCisgIHJ0cGgyNjRkZXBheSA9IEdTVF9SVFBfSDI2NF9ERVBBWSAoZGVwYXlsb2FkKTsKKworICAvKiBmbHVzaCByZW1haW5pbmcgZGF0YSBvbiBkaXNjb250ICovCisgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKHJ0cC0+YnVmZmVyKSkgeworICAgIGdzdF9hZGFwdGVyX2NsZWFyIChydHBoMjY0ZGVwYXktPmFkYXB0ZXIpOworICAgIHJ0cGgyNjRkZXBheS0+d2FpdF9zdGFydCA9IFRSVUU7CisgICAgcnRwaDI2NGRlcGF5LT5jdXJyZW50X2Z1X3R5cGUgPSAwOworICB9CisKKyAgeworICAgIGdpbnQgcGF5bG9hZF9sZW47CisgICAgZ3VpbnQ4ICpwYXlsb2FkOworICAgIGd1aW50IGhlYWRlcl9sZW47CisgICAgZ3VpbnQ4IG5hbF9yZWZfaWRjOworICAgIEdzdE1hcEluZm8gbWFwOworICAgIGd1aW50IG91dHNpemUsIG5hbHVfc2l6ZTsKKyAgICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworICAgIGdib29sZWFuIG1hcmtlcjsKKworICAgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChydHAtPmJ1ZmZlcik7CisKKyAgICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKyAgICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisgICAgbWFya2VyID0gZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAocnRwKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRkZXBheSwgInJlY2VpdmluZyAlZCBieXRlcyIsIHBheWxvYWRfbGVuKTsKKworICAgIGlmIChwYXlsb2FkX2xlbiA9PSAwKQorICAgICAgZ290byBlbXB0eV9wYWNrZXQ7CisKKyAgICAvKiArLS0tLS0tLS0tLS0tLS0tKworICAgICAqIHwwfDF8MnwzfDR8NXw2fDd8CisgICAgICogKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKiB8RnxOUkl8ICBUeXBlICAgfAorICAgICAqICstLS0tLS0tLS0tLS0tLS0rCisgICAgICoKKyAgICAgKiBGIG11c3QgYmUgMC4KKyAgICAgKi8KKyAgICBuYWxfcmVmX2lkYyA9IChwYXlsb2FkWzBdICYgMHg2MCkgPj4gNTsKKyAgICBuYWxfdW5pdF90eXBlID0gcGF5bG9hZFswXSAmIDB4MWY7CisKKyAgICAvKiBhdCBsZWFzdCBvbmUgYnl0ZSBoZWFkZXIgd2l0aCB0eXBlICovCisgICAgaGVhZGVyX2xlbiA9IDE7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0ZGVwYXksICJOUkkgJWQsIFR5cGUgJWQiLCBuYWxfcmVmX2lkYywKKyAgICAgICAgbmFsX3VuaXRfdHlwZSk7CisKKyAgICAvKiBJZiBGVSB1bml0IHdhcyBiZWluZyBwcm9jZXNzZWQsIGJ1dCB0aGUgY3VycmVudCBuYWwgaXMgb2YgYSBkaWZmZXJlbnQKKyAgICAgKiB0eXBlLiAgQXNzdW1lIHRoYXQgdGhlIHJlbW90ZSBwYXlsb2FkZXIgaXMgYnVnZ3kgKGRpZG4ndCBzZXQgdGhlIGVuZCBiaXQKKyAgICAgKiB3aGVuIHRoZSBGVSBlbmRlZCkgYW5kIHNlbmQgb3V0IHdoYXQgd2UgZ2F0aGVyZWQgdGh1c2ZhciAqLworICAgIGlmIChHX1VOTElLRUxZIChydHBoMjY0ZGVwYXktPmN1cnJlbnRfZnVfdHlwZSAhPSAwICYmCisgICAgICAgICAgICBuYWxfdW5pdF90eXBlICE9IHJ0cGgyNjRkZXBheS0+Y3VycmVudF9mdV90eXBlKSkKKyAgICAgIGdzdF9ydHBfaDI2NF9maW5pc2hfZnJhZ21lbnRhdGlvbl91bml0IChydHBoMjY0ZGVwYXkpOworCisgICAgc3dpdGNoIChuYWxfdW5pdF90eXBlKSB7CisgICAgICBjYXNlIDA6CisgICAgICBjYXNlIDMwOgorICAgICAgY2FzZSAzMToKKyAgICAgICAgLyogdW5kZWZpbmVkICovCisgICAgICAgIGdvdG8gdW5kZWZpbmVkX3R5cGU7CisgICAgICBjYXNlIDI1OgorICAgICAgICAvKiBTVEFQLUIgICAgU2luZ2xlLXRpbWUgYWdncmVnYXRpb24gcGFja2V0ICAgICA1LjcuMSAqLworICAgICAgICAvKiAyIGJ5dGUgZXh0cmEgaGVhZGVyIGZvciBET04gKi8KKyAgICAgICAgaGVhZGVyX2xlbiArPSAyOworICAgICAgICAvKiBmYWxsdGhyb3VnaCAqLworICAgICAgY2FzZSAyNDoKKyAgICAgIHsKKyAgICAgICAgLyogc3RyaXAgaGVhZGVycyAqLworICAgICAgICBwYXlsb2FkICs9IGhlYWRlcl9sZW47CisgICAgICAgIHBheWxvYWRfbGVuIC09IGhlYWRlcl9sZW47CisKKyAgICAgICAgcnRwaDI2NGRlcGF5LT53YWl0X3N0YXJ0ID0gRkFMU0U7CisKKworICAgICAgICAvKiBTVEFQLUEgICAgU2luZ2xlLXRpbWUgYWdncmVnYXRpb24gcGFja2V0ICAgICA1LjcuMSAqLworICAgICAgICB3aGlsZSAocGF5bG9hZF9sZW4gPiAyKSB7CisgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgMQorICAgICAgICAgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1CisgICAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICogfCAgICAgICAgIE5BTFUgU2l6ZSAgICAgICAgICAgICB8CisgICAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICovCisgICAgICAgICAgbmFsdV9zaXplID0gKHBheWxvYWRbMF0gPDwgOCkgfCBwYXlsb2FkWzFdOworCisgICAgICAgICAgLyogZG9udCBpbmNsdWRlIG5hbHVfc2l6ZSAqLworICAgICAgICAgIGlmIChuYWx1X3NpemUgPiAocGF5bG9hZF9sZW4gLSAyKSkKKyAgICAgICAgICAgIG5hbHVfc2l6ZSA9IHBheWxvYWRfbGVuIC0gMjsKKworICAgICAgICAgIG91dHNpemUgPSBuYWx1X3NpemUgKyBzaXplb2YgKHN5bmNfYnl0ZXMpOworICAgICAgICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAob3V0c2l6ZSk7CisKKyAgICAgICAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICAgICAgICBpZiAocnRwaDI2NGRlcGF5LT5ieXRlX3N0cmVhbSkgeworICAgICAgICAgICAgbWVtY3B5IChtYXAuZGF0YSwgc3luY19ieXRlcywgc2l6ZW9mIChzeW5jX2J5dGVzKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1hcC5kYXRhWzBdID0gbWFwLmRhdGFbMV0gPSAwOworICAgICAgICAgICAgbWFwLmRhdGFbMl0gPSBwYXlsb2FkWzBdOworICAgICAgICAgICAgbWFwLmRhdGFbM10gPSBwYXlsb2FkWzFdOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIHN0cmlwIE5BTFUgc2l6ZSAqLworICAgICAgICAgIHBheWxvYWQgKz0gMjsKKyAgICAgICAgICBwYXlsb2FkX2xlbiAtPSAyOworCisgICAgICAgICAgbWVtY3B5IChtYXAuZGF0YSArIHNpemVvZiAoc3luY19ieXRlcyksIHBheWxvYWQsIG5hbHVfc2l6ZSk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgICAgICAgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHBoMjY0ZGVwYXksIG91dGJ1ZiwgcnRwLT5idWZmZXIpOworCisgICAgICAgICAgZ3N0X3J0cF9oMjY0X2RlcGF5X2hhbmRsZV9uYWwgKHJ0cGgyNjRkZXBheSwgb3V0YnVmLCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgIG1hcmtlcik7CisKKyAgICAgICAgICBwYXlsb2FkICs9IG5hbHVfc2l6ZTsKKyAgICAgICAgICBwYXlsb2FkX2xlbiAtPSBuYWx1X3NpemU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDI2OgorICAgICAgICAvKiBNVEFQMTYgICAgTXVsdGktdGltZSBhZ2dyZWdhdGlvbiBwYWNrZXQgICAgICA1LjcuMiAqLworICAgICAgICAvLyBoZWFkZXJfbGVuID0gNTsKKyAgICAgICAgLyogZmFsbHRocm91Z2gsIG5vdCBpbXBsZW1lbnRlZCAqLworICAgICAgY2FzZSAyNzoKKyAgICAgICAgLyogTVRBUDI0ICAgIE11bHRpLXRpbWUgYWdncmVnYXRpb24gcGFja2V0ICAgICAgNS43LjIgKi8KKyAgICAgICAgLy8gaGVhZGVyX2xlbiA9IDY7CisgICAgICAgIGdvdG8gbm90X2ltcGxlbWVudGVkOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjg6CisgICAgICBjYXNlIDI5OgorICAgICAgeworICAgICAgICAvKiBGVS1BICAgICAgRnJhZ21lbnRhdGlvbiB1bml0ICAgICAgICAgICAgICAgICA1LjggKi8KKyAgICAgICAgLyogRlUtQiAgICAgIEZyYWdtZW50YXRpb24gdW5pdCAgICAgICAgICAgICAgICAgNS44ICovCisgICAgICAgIGdib29sZWFuIFMsIEU7CisKKyAgICAgICAgLyogKy0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICogfDB8MXwyfDN8NHw1fDZ8N3wKKyAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICogfFN8RXxSfCAgVHlwZSAgIHwKKyAgICAgICAgICogKy0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICoKKyAgICAgICAgICogUiBpcyByZXNlcnZlZCBhbmQgYWx3YXlzIDAKKyAgICAgICAgICovCisgICAgICAgIFMgPSAocGF5bG9hZFsxXSAmIDB4ODApID09IDB4ODA7CisgICAgICAgIEUgPSAocGF5bG9hZFsxXSAmIDB4NDApID09IDB4NDA7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NGRlcGF5LCAiUyAlZCwgRSAlZCIsIFMsIEUpOworCisgICAgICAgIGlmIChydHBoMjY0ZGVwYXktPndhaXRfc3RhcnQgJiYgIVMpCisgICAgICAgICAgZ290byB3YWl0aW5nX3N0YXJ0OworCisgICAgICAgIGlmIChTKSB7CisgICAgICAgICAgLyogTkFMIHVuaXQgc3RhcnRzIGhlcmUgKi8KKyAgICAgICAgICBndWludDggbmFsX2hlYWRlcjsKKworICAgICAgICAgIC8qIElmIGEgbmV3IEZVIHVuaXQgc3RhcnRlZCwgd2hpbGUgc3RpbGwgcHJvY2Vzc2luZyBhbiBvbGRlciBvbmUuCisgICAgICAgICAgICogQXNzdW1lIHRoYXQgdGhlIHJlbW90ZSBwYXlsb2FkZXIgaXMgYnVnZ3kgKGRvZXNuJ3Qgc2V0IHRoZSBlbmQKKyAgICAgICAgICAgKiBiaXQpIGFuZCBzZW5kIG91dCB3aGF0IHdlJ3ZlIGdhdGhlcmVkIHRodXNmYXIgKi8KKyAgICAgICAgICBpZiAoR19VTkxJS0VMWSAocnRwaDI2NGRlcGF5LT5jdXJyZW50X2Z1X3R5cGUgIT0gMCkpCisgICAgICAgICAgICBnc3RfcnRwX2gyNjRfZmluaXNoX2ZyYWdtZW50YXRpb25fdW5pdCAocnRwaDI2NGRlcGF5KTsKKworICAgICAgICAgIHJ0cGgyNjRkZXBheS0+Y3VycmVudF9mdV90eXBlID0gbmFsX3VuaXRfdHlwZTsKKyAgICAgICAgICBydHBoMjY0ZGVwYXktPmZ1X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKworICAgICAgICAgIHJ0cGgyNjRkZXBheS0+d2FpdF9zdGFydCA9IEZBTFNFOworCisgICAgICAgICAgLyogcmVjb25zdHJ1Y3QgTkFMIGhlYWRlciAqLworICAgICAgICAgIG5hbF9oZWFkZXIgPSAocGF5bG9hZFswXSAmIDB4ZTApIHwgKHBheWxvYWRbMV0gJiAweDFmKTsKKworICAgICAgICAgIC8qIHN0cmlwIHR5cGUgaGVhZGVyLCBrZWVwIEZVIGhlYWRlciwgd2UnbGwgcmV1c2UgaXQgdG8gcmVjb25zdHJ1Y3QKKyAgICAgICAgICAgKiB0aGUgTkFMIGhlYWRlci4gKi8KKyAgICAgICAgICBwYXlsb2FkICs9IDE7CisgICAgICAgICAgcGF5bG9hZF9sZW4gLT0gMTsKKworICAgICAgICAgIG5hbHVfc2l6ZSA9IHBheWxvYWRfbGVuOworICAgICAgICAgIG91dHNpemUgPSBuYWx1X3NpemUgKyBzaXplb2YgKHN5bmNfYnl0ZXMpOworICAgICAgICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAob3V0c2l6ZSk7CisKKyAgICAgICAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICAgICAgICBtZW1jcHkgKG1hcC5kYXRhICsgc2l6ZW9mIChzeW5jX2J5dGVzKSwgcGF5bG9hZCwgbmFsdV9zaXplKTsKKyAgICAgICAgICBtYXAuZGF0YVtzaXplb2YgKHN5bmNfYnl0ZXMpXSA9IG5hbF9oZWFkZXI7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgICAgICAgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHBoMjY0ZGVwYXksIG91dGJ1ZiwgcnRwLT5idWZmZXIpOworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NGRlcGF5LCAicXVldWVpbmcgJWQgYnl0ZXMiLCBvdXRzaXplKTsKKworICAgICAgICAgIC8qIGFuZCBhc3NlbWJsZSBpbiB0aGUgYWRhcHRlciAqLworICAgICAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGgyNjRkZXBheS0+YWRhcHRlciwgb3V0YnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBzdHJpcCBvZmYgRlUgaW5kaWNhdG9yIGFuZCBGVSBoZWFkZXIgYnl0ZXMgKi8KKyAgICAgICAgICBwYXlsb2FkICs9IDI7CisgICAgICAgICAgcGF5bG9hZF9sZW4gLT0gMjsKKworICAgICAgICAgIG91dHNpemUgPSBwYXlsb2FkX2xlbjsKKyAgICAgICAgICBvdXRidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG91dHNpemUpOworICAgICAgICAgIGdzdF9idWZmZXJfZmlsbCAob3V0YnVmLCAwLCBwYXlsb2FkLCBvdXRzaXplKTsKKworICAgICAgICAgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHBoMjY0ZGVwYXksIG91dGJ1ZiwgcnRwLT5idWZmZXIpOworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NGRlcGF5LCAicXVldWVpbmcgJWQgYnl0ZXMiLCBvdXRzaXplKTsKKworICAgICAgICAgIC8qIGFuZCBhc3NlbWJsZSBpbiB0aGUgYWRhcHRlciAqLworICAgICAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGgyNjRkZXBheS0+YWRhcHRlciwgb3V0YnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dGJ1ZiA9IE5VTEw7CisgICAgICAgIHJ0cGgyNjRkZXBheS0+ZnVfbWFya2VyID0gbWFya2VyOworCisgICAgICAgIC8qIGlmIE5BTCB1bml0IGVuZHMsIGZsdXNoIHRoZSBhZGFwdGVyICovCisgICAgICAgIGlmIChFKQorICAgICAgICAgIGdzdF9ydHBfaDI2NF9maW5pc2hfZnJhZ21lbnRhdGlvbl91bml0IChydHBoMjY0ZGVwYXkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICB7CisgICAgICAgIHJ0cGgyNjRkZXBheS0+d2FpdF9zdGFydCA9IEZBTFNFOworCisgICAgICAgIC8qIDEtMjMgICBOQUwgdW5pdCAgU2luZ2xlIE5BTCB1bml0IHBhY2tldCBwZXIgSC4yNjQgICA1LjYgKi8KKyAgICAgICAgLyogdGhlIGVudGlyZSBwYXlsb2FkIGlzIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIG5hbHVfc2l6ZSA9IHBheWxvYWRfbGVuOworICAgICAgICBvdXRzaXplID0gbmFsdV9zaXplICsgc2l6ZW9mIChzeW5jX2J5dGVzKTsKKyAgICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChvdXRzaXplKTsKKworICAgICAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICAgICAgaWYgKHJ0cGgyNjRkZXBheS0+Ynl0ZV9zdHJlYW0pIHsKKyAgICAgICAgICBtZW1jcHkgKG1hcC5kYXRhLCBzeW5jX2J5dGVzLCBzaXplb2YgKHN5bmNfYnl0ZXMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtYXAuZGF0YVswXSA9IG1hcC5kYXRhWzFdID0gMDsKKyAgICAgICAgICBtYXAuZGF0YVsyXSA9IG5hbHVfc2l6ZSA+PiA4OworICAgICAgICAgIG1hcC5kYXRhWzNdID0gbmFsdV9zaXplICYgMHhmZjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkgKG1hcC5kYXRhICsgc2l6ZW9mIChzeW5jX2J5dGVzKSwgcGF5bG9hZCwgbmFsdV9zaXplKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgICAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwaDI2NGRlcGF5LCBvdXRidWYsIHJ0cC0+YnVmZmVyKTsKKworICAgICAgICBnc3RfcnRwX2gyNjRfZGVwYXlfaGFuZGxlX25hbCAocnRwaDI2NGRlcGF5LCBvdXRidWYsIHRpbWVzdGFtcCwgbWFya2VyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIE5VTEw7CisKKyAgLyogRVJST1JTICovCitlbXB0eV9wYWNrZXQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0ZGVwYXksICJlbXB0eSBwYWNrZXQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQordW5kZWZpbmVkX3R5cGU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBoMjY0ZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiVW5kZWZpbmVkIHBhY2tldCB0eXBlIikpOworICAgIHJldHVybiBOVUxMOworICB9Cit3YWl0aW5nX3N0YXJ0OgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NGRlcGF5LCAid2FpdGluZyBmb3Igc3RhcnQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorbm90X2ltcGxlbWVudGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHJ0cGgyNjRkZXBheSwgU1RSRUFNLCBGT1JNQVQsCisgICAgICAgIChOVUxMKSwgKCJOQUwgdW5pdCB0eXBlICVkIG5vdCBzdXBwb3J0ZWQgeWV0IiwgbmFsX3VuaXRfdHlwZSkpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjY0X2RlcGF5X2hhbmRsZV9ldmVudCAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBIMjY0RGVwYXkgKnJ0cGgyNjRkZXBheTsKKworICBydHBoMjY0ZGVwYXkgPSBHU1RfUlRQX0gyNjRfREVQQVkgKGRlcGF5KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X3J0cF9oMjY0X2RlcGF5X3Jlc2V0IChydHBoMjY0ZGVwYXksIEZBTFNFKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybgorICAgICAgR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9DTEFTUyAocGFyZW50X2NsYXNzKS0+aGFuZGxlX2V2ZW50IChkZXBheSwgZXZlbnQpOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfaDI2NF9kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cEgyNjREZXBheSAqcnRwaDI2NGRlcGF5OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwaDI2NGRlcGF5ID0gR1NUX1JUUF9IMjY0X0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfcnRwX2gyNjRfZGVwYXlfcmVzZXQgKHJ0cGgyNjRkZXBheSwgVFJVRSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3J0cF9oMjY0X2RlcGF5X3Jlc2V0IChydHBoMjY0ZGVwYXksIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2NF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwaDI2NGRlcGF5X2RlYnVnLCAicnRwaDI2NGRlcGF5IiwgMCwKKyAgICAgICJIMjY0IFZpZGVvIFJUUCBEZXBheWxvYWRlciIpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwaDI2NGRlcGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX0gyNjRfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBoMjY0ZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0MTMxMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaDI2NGRlcGF5LmgKQEAgLTAsMCArMSw4OSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0gyNjRfREVQQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9IMjY0X0RFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9IMjY0X0RFUEFZIFwKKyAgKGdzdF9ydHBfaDI2NF9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0gyNjRfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfSDI2NF9ERVBBWSxHc3RSdHBIMjY0RGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX0gyNjRfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0gyNjRfREVQQVksR3N0UnRwSDI2NERlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0gyNjRfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfSDI2NF9ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfSDI2NF9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSDI2NF9ERVBBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBIMjY0RGVwYXkgR3N0UnRwSDI2NERlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjREZXBheUNsYXNzIEdzdFJ0cEgyNjREZXBheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cEgyNjREZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKKworICBnYm9vbGVhbiAgICBieXRlX3N0cmVhbTsKKworICBHc3RCdWZmZXIgICpjb2RlY19kYXRhOworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBnYm9vbGVhbiAgICB3YWl0X3N0YXJ0OworCisgIC8qIG5hbCBtZXJnaW5nICovCisgIGdib29sZWFuICAgIG1lcmdlOworICBHc3RBZGFwdGVyICpwaWN0dXJlX2FkYXB0ZXI7CisgIGdib29sZWFuICAgIHBpY3R1cmVfc3RhcnQ7CisgIEdzdENsb2NrVGltZSBsYXN0X3RzOworICBnYm9vbGVhbiAgICBsYXN0X2tleWZyYW1lOworCisgIC8qIFdvcmsgYXJvdW5kIGJyb2tlbiBwYXlsb2FkZXJzIHdydC4gRlUtQSAmIEZVLUIgKi8KKyAgZ3VpbnQ4IGN1cnJlbnRfZnVfdHlwZTsKKyAgR3N0Q2xvY2tUaW1lIGZ1X3RpbWVzdGFtcDsKKyAgZ2Jvb2xlYW4gZnVfbWFya2VyOworCisgIC8qIG1pc2MgKi8KKyAgR1B0ckFycmF5ICpzcHM7CisgIEdQdHJBcnJheSAqcHBzOworICBnYm9vbGVhbiBuZXdfY29kZWNfZGF0YTsKKworICAvKiBkb3duc3RyZWFtIGFsbG9jYXRvciAqLworICBHc3RBbGxvY2F0b3IgKmFsbG9jYXRvcjsKKyAgR3N0QWxsb2NhdGlvblBhcmFtcyBwYXJhbXM7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cEgyNjREZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX2gyNjRfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2gyNjRfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK2dib29sZWFuIGdzdF9ydHBfaDI2NF9hZGRfc3BzX3BwcyAoR3N0RWxlbWVudCAqIHJ0cGgyNjQsIEdQdHJBcnJheSAqIHNwcywKKyAgICBHUHRyQXJyYXkgKiBwcHMsIEdzdEJ1ZmZlciAqIG5hbCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfSDI2NF9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwaDI2NHBheS5jIGIvZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmMDgwYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaDI2NHBheS5jCkBAIC0wLDAgKzEsMTQyNCBAQAorLyogZXg6IHNldCB0YWJzdG9wPTIgc2hpZnR3aWR0aD0yIGV4cGFuZHRhYjogKi8KKy8qIEdTdHJlYW1lcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL3BidXRpbHMuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworLyogSW5jbHVkZWQgdG8gbm90IGR1cGxpY2F0ZSBnc3RfcnRwX2gyNjRfYWRkX3Nwc19wcHMgKCkgKi8KKyNpbmNsdWRlICJnc3RydHBoMjY0ZGVwYXkuaCIKKworI2luY2x1ZGUgImdzdHJ0cGgyNjRwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCisKKyNkZWZpbmUgSURSX1RZUEVfSUQgIDUKKyNkZWZpbmUgU1BTX1RZUEVfSUQgIDcKKyNkZWZpbmUgUFBTX1RZUEVfSUQgIDgKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwaDI2NHBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwaDI2NHBheV9kZWJ1ZykKKworLyogcmVmZXJlbmNlczoKKyAqCisgKiBSRkMgMzk4NAorICovCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2gyNjRfcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtaDI2NCwgIgorICAgICAgICAic3RyZWFtLWZvcm1hdCA9IChzdHJpbmcpIGF2YywgYWxpZ25tZW50ID0gKHN0cmluZykgYXU7IgorICAgICAgICAidmlkZW8veC1oMjY0LCAiCisgICAgICAgICJzdHJlYW0tZm9ybWF0ID0gKHN0cmluZykgYnl0ZS1zdHJlYW0sIGFsaWdubWVudCA9IChzdHJpbmcpIHsgbmFsLCBhdSB9IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9oMjY0X3BheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiSDI2NFwiIikKKyAgICApOworCisjZGVmaW5lIERFRkFVTFRfU1BST1BfUEFSQU1FVEVSX1NFVFMgICAgTlVMTAorI2RlZmluZSBERUZBVUxUX0NPTkZJR19JTlRFUlZBTAkJICAgICAgMAorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9TUFJPUF9QQVJBTUVURVJfU0VUUywKKyAgUFJPUF9DT05GSUdfSU5URVJWQUwKK307CisKKyNkZWZpbmUgSVNfQUNDRVNTX1VOSVQoeCkgKCgoeCkgPiAweDAwKSAmJiAoKHgpIDwgMHgwNikpCisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2NF9wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2gyNjRfcGF5X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2NF9wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3J0cF9oMjY0X3BheV9nZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0UGFkICogcGFkLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2gyNjRfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9oMjY0X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBhZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaDI2NF9wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfaDI2NF9wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworI2RlZmluZSBnc3RfcnRwX2gyNjRfcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEgyNjRQYXksIGdzdF9ydHBfaDI2NF9wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY0X3BheV9jbGFzc19pbml0IChHc3RSdHBIMjY0UGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX2gyNjRfcGF5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9oMjY0X3BheV9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfU1BST1BfUEFSQU1FVEVSX1NFVFMsIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJzcHJvcC1wYXJhbWV0ZXItc2V0cyIsCisgICAgICAgICAgInNwcm9wLXBhcmFtZXRlci1zZXRzIiwKKyAgICAgICAgICAiVGhlIGJhc2U2NCBzcHJvcC1wYXJhbWV0ZXItc2V0cyB0byBzZXQgaW4gb3V0IGNhcHMgKHNldCB0byBOVUxMIHRvICIKKyAgICAgICAgICAiZXh0cmFjdCBmcm9tIHN0cmVhbSkiLAorICAgICAgICAgIERFRkFVTFRfU1BST1BfUEFSQU1FVEVSX1NFVFMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR19QQVJBTV9ERVBSRUNBVEVEKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfQ09ORklHX0lOVEVSVkFMLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImNvbmZpZy1pbnRlcnZhbCIsCisgICAgICAgICAgIlNQUyBQUFMgU2VuZCBJbnRlcnZhbCIsCisgICAgICAgICAgIlNlbmQgU1BTIGFuZCBQUFMgSW5zZXJ0aW9uIEludGVydmFsIGluIHNlY29uZHMgKHNwcm9wIHBhcmFtZXRlciBzZXRzICIKKyAgICAgICAgICAid2lsbCBiZSBtdWx0aXBsZXhlZCBpbiB0aGUgZGF0YSBzdHJlYW0gd2hlbiBkZXRlY3RlZC4pICIKKyAgICAgICAgICAiKDAgPSBkaXNhYmxlZCwgLTEgPSBzZW5kIHdpdGggZXZlcnkgSURSIGZyYW1lKSIsCisgICAgICAgICAgLTEsIDM2MDAsIERFRkFVTFRfQ09ORklHX0lOVEVSVkFMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykKKyAgICAgICk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX2gyNjRfcGF5X2ZpbmFsaXplOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaDI2NF9wYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9oMjY0X3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUlRQIEgyNjQgcGF5bG9hZGVyIiwKKyAgICAgICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQtZW5jb2RlIEgyNjQgdmlkZW8gaW50byBSVFAgcGFja2V0cyAoUkZDIDM5ODQpIiwKKyAgICAgICJMYXVyZW50IEdsYXlhbCA8c3BnbGVnbGVAeWFob28uZnI+Iik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2gyNjRfcGF5X2NoYW5nZV9zdGF0ZSk7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmdldF9jYXBzID0gZ3N0X3J0cF9oMjY0X3BheV9nZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2gyNjRfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9oMjY0X3BheV9oYW5kbGVfYnVmZmVyOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2lua19ldmVudCA9IGdzdF9ydHBfaDI2NF9wYXlfc2lua19ldmVudDsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwaDI2NHBheV9kZWJ1ZywgInJ0cGgyNjRwYXkiLCAwLAorICAgICAgIkgyNjQgUlRQIFBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY0X3BheV9pbml0IChHc3RSdHBIMjY0UGF5ICogcnRwaDI2NHBheSkKK3sKKyAgcnRwaDI2NHBheS0+cXVldWUgPSBnX2FycmF5X25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKGd1aW50KSk7CisgIHJ0cGgyNjRwYXktPnByb2ZpbGUgPSAwOworICBydHBoMjY0cGF5LT5zcHMgPSBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX3VucmVmKTsKKyAgcnRwaDI2NHBheS0+cHBzID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgIHJ0cGgyNjRwYXktPmxhc3Rfc3BzcHBzID0gLTE7CisgIHJ0cGgyNjRwYXktPnNwc3Bwc19pbnRlcnZhbCA9IERFRkFVTFRfQ09ORklHX0lOVEVSVkFMOworICBydHBoMjY0cGF5LT5kZWx0YV91bml0ID0gRkFMU0U7CisgIHJ0cGgyNjRwYXktPmRpc2NvbnQgPSBGQUxTRTsKKworICBydHBoMjY0cGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY0X3BheV9jbGVhcl9zcHNfcHBzIChHc3RSdHBIMjY0UGF5ICogcnRwaDI2NHBheSkKK3sKKyAgZ19wdHJfYXJyYXlfc2V0X3NpemUgKHJ0cGgyNjRwYXktPnNwcywgMCk7CisgIGdfcHRyX2FycmF5X3NldF9zaXplIChydHBoMjY0cGF5LT5wcHMsIDApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY0X3BheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwSDI2NFBheSAqcnRwaDI2NHBheTsKKworICBydHBoMjY0cGF5ID0gR1NUX1JUUF9IMjY0X1BBWSAob2JqZWN0KTsKKworICBnX2FycmF5X2ZyZWUgKHJ0cGgyNjRwYXktPnF1ZXVlLCBUUlVFKTsKKworICBnX3B0cl9hcnJheV9mcmVlIChydHBoMjY0cGF5LT5zcHMsIFRSVUUpOworICBnX3B0cl9hcnJheV9mcmVlIChydHBoMjY0cGF5LT5wcHMsIFRSVUUpOworCisgIGdfZnJlZSAocnRwaDI2NHBheS0+c3Byb3BfcGFyYW1ldGVyX3NldHMpOworCisgIGdfb2JqZWN0X3VucmVmIChydHBoMjY0cGF5LT5hZGFwdGVyKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciBhbGxfbGV2ZWxzW11bNF0gPSB7CisgICIxIiwKKyAgIjFiIiwKKyAgIjEuMSIsCisgICIxLjIiLAorICAiMS4zIiwKKyAgIjIiLAorICAiMi4xIiwKKyAgIjIuMiIsCisgICIzIiwKKyAgIjMuMSIsCisgICIzLjIiLAorICAiNCIsCisgICI0LjEiLAorICAiNC4yIiwKKyAgIjUiLAorICAiNS4xIgorfTsKKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3J0cF9oMjY0X3BheV9nZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICp0ZW1wbGF0ZV9jYXBzOworICBHc3RDYXBzICphbGxvd2VkX2NhcHM7CisgIEdzdENhcHMgKmNhcHMsICppY2FwczsKKyAgZ2Jvb2xlYW4gYXBwZW5kX3VucmVzdHJpY3RlZDsKKyAgZ3VpbnQgaTsKKworICBhbGxvd2VkX2NhcHMgPQorICAgICAgZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRCAocGF5bG9hZCksIE5VTEwpOworCisgIGlmIChhbGxvd2VkX2NhcHMgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICB0ZW1wbGF0ZV9jYXBzID0KKyAgICAgIGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldF9jYXBzICgmZ3N0X3J0cF9oMjY0X3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBpZiAoZ3N0X2NhcHNfaXNfYW55IChhbGxvd2VkX2NhcHMpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX3JlZiAodGVtcGxhdGVfY2Fwcyk7CisgICAgZ290byBkb25lOworICB9CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChhbGxvd2VkX2NhcHMpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX3JlZiAoYWxsb3dlZF9jYXBzKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIGFwcGVuZF91bnJlc3RyaWN0ZWQgPSBGQUxTRTsKKyAgZm9yIChpID0gMDsgaSA8IGdzdF9jYXBzX2dldF9zaXplIChhbGxvd2VkX2NhcHMpOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhbGxvd2VkX2NhcHMsIGkpOworICAgIEdzdFN0cnVjdHVyZSAqbmV3X3MgPSBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoInZpZGVvL3gtaDI2NCIpOworICAgIGNvbnN0IGdjaGFyICpwcm9maWxlX2xldmVsX2lkOworCisgICAgcHJvZmlsZV9sZXZlbF9pZCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgInByb2ZpbGUtbGV2ZWwtaWQiKTsKKworICAgIGlmIChwcm9maWxlX2xldmVsX2lkICYmIHN0cmxlbiAocHJvZmlsZV9sZXZlbF9pZCkgPT0gNikgeworICAgICAgY29uc3QgZ2NoYXIgKnByb2ZpbGU7CisgICAgICBjb25zdCBnY2hhciAqbGV2ZWw7CisgICAgICBsb25nIGludCBzcHNpbnQ7CisgICAgICBndWludDggc3BzWzNdOworCisgICAgICBzcHNpbnQgPSBzdHJ0b2wgKHByb2ZpbGVfbGV2ZWxfaWQsIE5VTEwsIDE2KTsKKyAgICAgIHNwc1swXSA9IHNwc2ludCA+PiAxNjsKKyAgICAgIHNwc1sxXSA9IHNwc2ludCA+PiA4OworICAgICAgc3BzWzJdID0gc3BzaW50OworCisgICAgICBwcm9maWxlID0gZ3N0X2NvZGVjX3V0aWxzX2gyNjRfZ2V0X3Byb2ZpbGUgKHNwcywgMyk7CisgICAgICBsZXZlbCA9IGdzdF9jb2RlY191dGlsc19oMjY0X2dldF9sZXZlbCAoc3BzLCAzKTsKKworICAgICAgaWYgKHByb2ZpbGUgJiYgbGV2ZWwpIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBheWxvYWQsICJJbiBjYXBzLCBoYXZlIHByb2ZpbGUgJXMgYW5kIGxldmVsICVzIiwKKyAgICAgICAgICAgIHByb2ZpbGUsIGxldmVsKTsKKworICAgICAgICBpZiAoIXN0cmNtcCAocHJvZmlsZSwgImNvbnN0cmFpbmVkLWJhc2VsaW5lIikpCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG5ld19zLCAicHJvZmlsZSIsIEdfVFlQRV9TVFJJTkcsIHByb2ZpbGUsIE5VTEwpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBHVmFsdWUgdmFsID0geyAwLCB9OworICAgICAgICAgIEdWYWx1ZSBwcm9maWxlcyA9IHsgMCwgfTsKKworICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnByb2ZpbGVzLCBHU1RfVFlQRV9MSVNUKTsKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZ2YWwsIEdfVFlQRV9TVFJJTkcpOworCisgICAgICAgICAgZ192YWx1ZV9zZXRfc3RhdGljX3N0cmluZyAoJnZhbCwgcHJvZmlsZSk7CisgICAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmcHJvZmlsZXMsICZ2YWwpOworCisgICAgICAgICAgZ192YWx1ZV9zZXRfc3RhdGljX3N0cmluZyAoJnZhbCwgImNvbnN0cmFpbmVkLWJhc2VsaW5lIik7CisgICAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmcHJvZmlsZXMsICZ2YWwpOworCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV90YWtlX3ZhbHVlIChuZXdfcywgInByb2ZpbGUiLCAmcHJvZmlsZXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdHJjbXAgKGxldmVsLCAiMSIpKQorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfcywgImxldmVsIiwgR19UWVBFX1NUUklORywgbGV2ZWwsIE5VTEwpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBHVmFsdWUgbGV2ZWxzID0geyAwLCB9OworICAgICAgICAgIEdWYWx1ZSB2YWwgPSB7IDAsIH07CisgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZsZXZlbHMsIEdTVF9UWVBFX0xJU1QpOworICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR19UWVBFX1NUUklORyk7CisKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgR19OX0VMRU1FTlRTIChhbGxfbGV2ZWxzKTsgaisrKSB7CisgICAgICAgICAgICBnX3ZhbHVlX3NldF9zdGF0aWNfc3RyaW5nICgmdmFsLCBhbGxfbGV2ZWxzW2pdKTsKKyAgICAgICAgICAgIGdzdF92YWx1ZV9saXN0X3ByZXBlbmRfdmFsdWUgKCZsZXZlbHMsICZ2YWwpOworICAgICAgICAgICAgaWYgKCFzdHJjbXAgKGxldmVsLCBhbGxfbGV2ZWxzW2pdKSkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfdGFrZV92YWx1ZSAobmV3X3MsICJsZXZlbCIsICZsZXZlbHMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBJbnZhbGlkIHByb2ZpbGUtbGV2ZWwtaWQgbWVhbnMgYmFzZWxpbmUgKi8KKworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3MsCisgICAgICAgICAgICAicHJvZmlsZSIsIEdfVFlQRV9TVFJJTkcsICJjb25zdHJhaW5lZC1iYXNlbGluZSIsIE5VTEwpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBObyBwcm9maWxlLWxldmVsLWlkIG1lYW5zIGJhc2VsaW5lIG9yIHVucmVzdHJpY3RlZCAqLworCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3MsCisgICAgICAgICAgInByb2ZpbGUiLCBHX1RZUEVfU1RSSU5HLCAiY29uc3RyYWluZWQtYmFzZWxpbmUiLCBOVUxMKTsKKyAgICAgIGFwcGVuZF91bnJlc3RyaWN0ZWQgPSBUUlVFOworICAgIH0KKworICAgIGNhcHMgPSBnc3RfY2Fwc19tZXJnZV9zdHJ1Y3R1cmUgKGNhcHMsIG5ld19zKTsKKyAgfQorCisgIGlmIChhcHBlbmRfdW5yZXN0cmljdGVkKSB7CisgICAgY2FwcyA9CisgICAgICAgIGdzdF9jYXBzX21lcmdlX3N0cnVjdHVyZSAoY2FwcywgZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2aWRlby94LWgyNjQiLCBOVUxMLAorICAgICAgICAgICAgTlVMTCkpOworICB9CisKKyAgaWNhcHMgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKGNhcHMsIHRlbXBsYXRlX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGNhcHMgPSBpY2FwczsKKworZG9uZToKKyAgaWYgKGZpbHRlcikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJJbnRlcnNlY3QgJSIgR1NUX1BUUl9GT1JNQVQgIiBhbmQgZmlsdGVyICUiCisgICAgICAgIEdTVF9QVFJfRk9STUFULCBjYXBzLCBmaWx0ZXIpOworICAgIGljYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgY2FwcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgY2FwcyA9IGljYXBzOworICB9CisKKyAgZ3N0X2NhcHNfdW5yZWYgKHRlbXBsYXRlX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoYWxsb3dlZF9jYXBzKTsKKworICBHU1RfTE9HX09CSkVDVCAocGF5bG9hZCwgInJldHVybmluZyBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKyAgcmV0dXJuIGNhcHM7Cit9CisKKy8qIHRha2UgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIFNQUyBhbmQgUFBTIGxpc3RzIGFuZCBzZXQgdGhlbSBvbiB0aGUgY2FwcyBhcworICogc3Byb3AtcGFyYW1ldGVyLXNldHMgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjY0X3BheV9zZXRfc3BzX3BwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCkKK3sKKyAgR3N0UnRwSDI2NFBheSAqcGF5bG9hZGVyID0gR1NUX1JUUF9IMjY0X1BBWSAoYmFzZXBheWxvYWQpOworICBnY2hhciAqcHJvZmlsZTsKKyAgZ2NoYXIgKnNldDsKKyAgR1N0cmluZyAqc3Byb3BzOworICBndWludCBjb3VudDsKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQgaTsKKworICBzcHJvcHMgPSBnX3N0cmluZ19uZXcgKCIiKTsKKyAgY291bnQgPSAwOworCisgIC8qIGJ1aWxkIHRoZSBzcHJvcC1wYXJhbWV0ZXItc2V0cyAqLworICBmb3IgKGkgPSAwOyBpIDwgcGF5bG9hZGVyLT5zcHMtPmxlbjsgaSsrKSB7CisgICAgR3N0QnVmZmVyICpzcHNfYnVmID0KKyAgICAgICAgR1NUX0JVRkZFUl9DQVNUIChnX3B0cl9hcnJheV9pbmRleCAocGF5bG9hZGVyLT5zcHMsIGkpKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChzcHNfYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHNldCA9IGdfYmFzZTY0X2VuY29kZSAobWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChzcHNfYnVmLCAmbWFwKTsKKworICAgIGdfc3RyaW5nX2FwcGVuZF9wcmludGYgKHNwcm9wcywgIiVzJXMiLCBjb3VudCA/ICIsIiA6ICIiLCBzZXQpOworICAgIGdfZnJlZSAoc2V0KTsKKyAgICBjb3VudCsrOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBwYXlsb2FkZXItPnBwcy0+bGVuOyBpKyspIHsKKyAgICBHc3RCdWZmZXIgKnBwc19idWYgPQorICAgICAgICBHU1RfQlVGRkVSX0NBU1QgKGdfcHRyX2FycmF5X2luZGV4IChwYXlsb2FkZXItPnBwcywgaSkpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKHBwc19idWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgc2V0ID0gZ19iYXNlNjRfZW5jb2RlIChtYXAuZGF0YSwgbWFwLnNpemUpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKHBwc19idWYsICZtYXApOworCisgICAgZ19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3Byb3BzLCAiJXMlcyIsIGNvdW50ID8gIiwiIDogIiIsIHNldCk7CisgICAgZ19mcmVlIChzZXQpOworICAgIGNvdW50Kys7CisgIH0KKworICBpZiAoR19MSUtFTFkgKGNvdW50KSkgeworICAgIGlmIChwYXlsb2FkZXItPnByb2ZpbGUgIT0gMCkgeworICAgICAgLyogcHJvZmlsZSBpcyAyNCBiaXQuIEZvcmNlIGl0IHRvIHJlc3BlY3QgdGhlIGxpbWl0ICovCisgICAgICBwcm9maWxlID0gZ19zdHJkdXBfcHJpbnRmICgiJTA2eCIsIHBheWxvYWRlci0+cHJvZmlsZSAmIDB4ZmZmZmZmKTsKKyAgICAgIC8qIGNvbWJpbmUgaW50byBvdXRwdXQgY2FwcyAqLworICAgICAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLAorICAgICAgICAgICJwYWNrZXRpemF0aW9uLW1vZGUiLCBHX1RZUEVfU1RSSU5HLCAiMSIsCisgICAgICAgICAgInByb2ZpbGUtbGV2ZWwtaWQiLCBHX1RZUEVfU1RSSU5HLCBwcm9maWxlLAorICAgICAgICAgICJzcHJvcC1wYXJhbWV0ZXItc2V0cyIsIEdfVFlQRV9TVFJJTkcsIHNwcm9wcy0+c3RyLCBOVUxMKTsKKyAgICAgIGdfZnJlZSAocHJvZmlsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChiYXNlcGF5bG9hZCwKKyAgICAgICAgICAicGFja2V0aXphdGlvbi1tb2RlIiwgR19UWVBFX1NUUklORywgIjEiLAorICAgICAgICAgICJzcHJvcC1wYXJhbWV0ZXItc2V0cyIsIEdfVFlQRV9TVFJJTkcsIHNwcm9wcy0+c3RyLCBOVUxMKTsKKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICByZXMgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAoYmFzZXBheWxvYWQsIE5VTEwpOworICB9CisgIGdfc3RyaW5nX2ZyZWUgKHNwcm9wcywgVFJVRSk7CisKKyAgcmV0dXJuIHJlczsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2NF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFJ0cEgyNjRQYXkgKnJ0cGgyNjRwYXk7CisgIEdzdFN0cnVjdHVyZSAqc3RyOworICBjb25zdCBHVmFsdWUgKnZhbHVlOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4ICpkYXRhOworICBnc2l6ZSBzaXplOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgY29uc3QgZ2NoYXIgKmFsaWdubWVudCwgKnN0cmVhbV9mb3JtYXQ7CisKKyAgcnRwaDI2NHBheSA9IEdTVF9SVFBfSDI2NF9QQVkgKGJhc2VwYXlsb2FkKTsKKworICBzdHIgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICAvKiB3ZSBjYW4gb25seSBzZXQgdGhlIG91dHB1dCBjYXBzIHdoZW4gd2UgZm91bmQgdGhlIHNwcm9wcyBhbmQgcHJvZmlsZQorICAgKiBOQUxzICovCisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChiYXNlcGF5bG9hZCwgInZpZGVvIiwgVFJVRSwgIkgyNjQiLCA5MDAwMCk7CisKKyAgcnRwaDI2NHBheS0+YWxpZ25tZW50ID0gR1NUX0gyNjRfQUxJR05NRU5UX1VOS05PV047CisgIGFsaWdubWVudCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RyLCAiYWxpZ25tZW50Iik7CisgIGlmIChhbGlnbm1lbnQpIHsKKyAgICBpZiAoZ19zdHJfZXF1YWwgKGFsaWdubWVudCwgImF1IikpCisgICAgICBydHBoMjY0cGF5LT5hbGlnbm1lbnQgPSBHU1RfSDI2NF9BTElHTk1FTlRfQVU7CisgICAgaWYgKGdfc3RyX2VxdWFsIChhbGlnbm1lbnQsICJuYWwiKSkKKyAgICAgIHJ0cGgyNjRwYXktPmFsaWdubWVudCA9IEdTVF9IMjY0X0FMSUdOTUVOVF9OQUw7CisgIH0KKworICBydHBoMjY0cGF5LT5zdHJlYW1fZm9ybWF0ID0gR1NUX0gyNjRfU1RSRUFNX0ZPUk1BVF9VTktOT1dOOworICBzdHJlYW1fZm9ybWF0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHIsICJzdHJlYW0tZm9ybWF0Iik7CisgIGlmIChzdHJlYW1fZm9ybWF0KSB7CisgICAgaWYgKGdfc3RyX2VxdWFsIChzdHJlYW1fZm9ybWF0LCAiYXZjIikpCisgICAgICBydHBoMjY0cGF5LT5zdHJlYW1fZm9ybWF0ID0gR1NUX0gyNjRfU1RSRUFNX0ZPUk1BVF9BVkM7CisgICAgaWYgKGdfc3RyX2VxdWFsIChzdHJlYW1fZm9ybWF0LCAiYnl0ZS1zdHJlYW0iKSkKKyAgICAgIHJ0cGgyNjRwYXktPnN0cmVhbV9mb3JtYXQgPSBHU1RfSDI2NF9TVFJFQU1fRk9STUFUX0JZVEVTVFJFQU07CisgIH0KKworICAvKiBwYWNrZXRpemVkIEFWQyB2aWRlbyBoYXMgYSBjb2RlY19kYXRhICovCisgIGlmICgodmFsdWUgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RyLCAiY29kZWNfZGF0YSIpKSkgeworICAgIGd1aW50IG51bV9zcHMsIG51bV9wcHM7CisgICAgZ2ludCBpLCBuYWxfc2l6ZTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRwYXksICJoYXZlIHBhY2tldGl6ZWQgaDI2NCIpOworCisgICAgYnVmZmVyID0gZ3N0X3ZhbHVlX2dldF9idWZmZXIgKHZhbHVlKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgZGF0YSA9IG1hcC5kYXRhOworICAgIHNpemUgPSBtYXAuc2l6ZTsKKworICAgIC8qIHBhcnNlIHRoZSBhdmNDIGRhdGEgKi8KKyAgICBpZiAoc2l6ZSA8IDcpCisgICAgICBnb3RvIGF2Y2NfdG9vX3NtYWxsOworICAgIC8qIHBhcnNlIHRoZSB2ZXJzaW9uLCB0aGlzIG11c3QgYmUgMSAqLworICAgIGlmIChkYXRhWzBdICE9IDEpCisgICAgICBnb3RvIHdyb25nX3ZlcnNpb247CisKKyAgICAvKiBBVkNQcm9maWxlSW5kaWNhdGlvbiAqLworICAgIC8qIHByb2ZpbGVfY29tcGF0ICovCisgICAgLyogQVZDTGV2ZWxJbmRpY2F0aW9uICovCisgICAgcnRwaDI2NHBheS0+cHJvZmlsZSA9IChkYXRhWzFdIDw8IDE2KSB8IChkYXRhWzJdIDw8IDgpIHwgZGF0YVszXTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0cGF5LCAicHJvZmlsZSAlMDZ4IiwgcnRwaDI2NHBheS0+cHJvZmlsZSk7CisKKyAgICAvKiA2IGJpdHMgcmVzZXJ2ZWQgfCAyIGJpdHMgbGVuZ3RoU2l6ZU1pbnVzT25lICovCisgICAgLyogdGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGZyb250IG9mIHRoZSBOQUwgdW5pdHMgdG8gbWFyayB0aGVpcgorICAgICAqIGxlbmd0aCAqLworICAgIHJ0cGgyNjRwYXktPm5hbF9sZW5ndGhfc2l6ZSA9IChkYXRhWzRdICYgMHgwMykgKyAxOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRwYXksICJuYWwgbGVuZ3RoICV1IiwgcnRwaDI2NHBheS0+bmFsX2xlbmd0aF9zaXplKTsKKyAgICAvKiAzIGJpdHMgcmVzZXJ2ZWQgfCA1IGJpdHMgbnVtT2ZTZXF1ZW5jZVBhcmFtZXRlclNldHMgKi8KKyAgICBudW1fc3BzID0gZGF0YVs1XSAmIDB4MWY7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NHBheSwgIm51bSBTUFMgJXUiLCBudW1fc3BzKTsKKworICAgIGRhdGEgKz0gNjsKKyAgICBzaXplIC09IDY7CisKKyAgICAvKiBjcmVhdGUgdGhlIHNwcm9wLXBhcmFtZXRlci1zZXRzICovCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9zcHM7IGkrKykgeworICAgICAgR3N0QnVmZmVyICpzcHNfYnVmOworCisgICAgICBpZiAoc2l6ZSA8IDIpCisgICAgICAgIGdvdG8gYXZjY19lcnJvcjsKKworICAgICAgbmFsX3NpemUgPSAoZGF0YVswXSA8PCA4KSB8IGRhdGFbMV07CisgICAgICBkYXRhICs9IDI7CisgICAgICBzaXplIC09IDI7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBoMjY0cGF5LCAiU1BTICVkIHNpemUgJWQiLCBpLCBuYWxfc2l6ZSk7CisKKyAgICAgIGlmIChzaXplIDwgbmFsX3NpemUpCisgICAgICAgIGdvdG8gYXZjY19lcnJvcjsKKworICAgICAgLyogbWFrZSBhIGJ1ZmZlciBvdXQgb2YgaXQgYW5kIGFkZCB0byBTUFMgbGlzdCAqLworICAgICAgc3BzX2J1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobmFsX3NpemUpOworICAgICAgZ3N0X2J1ZmZlcl9maWxsIChzcHNfYnVmLCAwLCBkYXRhLCBuYWxfc2l6ZSk7CisgICAgICBnc3RfcnRwX2gyNjRfYWRkX3Nwc19wcHMgKEdTVF9FTEVNRU5UIChydHBoMjY0cGF5KSwgcnRwaDI2NHBheS0+c3BzLAorICAgICAgICAgIHJ0cGgyNjRwYXktPnBwcywgc3BzX2J1Zik7CisgICAgICBkYXRhICs9IG5hbF9zaXplOworICAgICAgc2l6ZSAtPSBuYWxfc2l6ZTsKKyAgICB9CisgICAgaWYgKHNpemUgPCAxKQorICAgICAgZ290byBhdmNjX2Vycm9yOworCisgICAgLyogOCBiaXRzIG51bU9mUGljdHVyZVBhcmFtZXRlclNldHMgKi8KKyAgICBudW1fcHBzID0gZGF0YVswXTsKKyAgICBkYXRhICs9IDE7CisgICAgc2l6ZSAtPSAxOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NHBheSwgIm51bSBQUFMgJXUiLCBudW1fcHBzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BwczsgaSsrKSB7CisgICAgICBHc3RCdWZmZXIgKnBwc19idWY7CisKKyAgICAgIGlmIChzaXplIDwgMikKKyAgICAgICAgZ290byBhdmNjX2Vycm9yOworCisgICAgICBuYWxfc2l6ZSA9IChkYXRhWzBdIDw8IDgpIHwgZGF0YVsxXTsKKyAgICAgIGRhdGEgKz0gMjsKKyAgICAgIHNpemUgLT0gMjsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGgyNjRwYXksICJQUFMgJWQgc2l6ZSAlZCIsIGksIG5hbF9zaXplKTsKKworICAgICAgaWYgKHNpemUgPCBuYWxfc2l6ZSkKKyAgICAgICAgZ290byBhdmNjX2Vycm9yOworCisgICAgICAvKiBtYWtlIGEgYnVmZmVyIG91dCBvZiBpdCBhbmQgYWRkIHRvIFBQUyBsaXN0ICovCisgICAgICBwcHNfYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChuYWxfc2l6ZSk7CisgICAgICBnc3RfYnVmZmVyX2ZpbGwgKHBwc19idWYsIDAsIGRhdGEsIG5hbF9zaXplKTsKKyAgICAgIGdzdF9ydHBfaDI2NF9hZGRfc3BzX3BwcyAoR1NUX0VMRU1FTlQgKHJ0cGgyNjRwYXkpLCBydHBoMjY0cGF5LT5zcHMsCisgICAgICAgICAgcnRwaDI2NHBheS0+cHBzLCBwcHNfYnVmKTsKKworICAgICAgZGF0YSArPSBuYWxfc2l6ZTsKKyAgICAgIHNpemUgLT0gbmFsX3NpemU7CisgICAgfQorCisgICAgLyogYW5kIHVwZGF0ZSB0aGUgY2FwcyB3aXRoIHRoZSBjb2xsZWN0ZWQgZGF0YSAqLworICAgIGlmICghZ3N0X3J0cF9oMjY0X3BheV9zZXRfc3BzX3BwcyAoYmFzZXBheWxvYWQpKQorICAgICAgZ290byBzZXRfc3BzX3Bwc19mYWlsZWQ7CisKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRwYXksICJoYXZlIGJ5dGVzdHJlYW0gaDI2NCIpOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKK2F2Y2NfdG9vX3NtYWxsOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwaDI2NHBheSwgImF2Y0Mgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCAiIDwgNyIsIHNpemUpOworICAgIGdvdG8gZXJyb3I7CisgIH0KK3dyb25nX3ZlcnNpb246CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChydHBoMjY0cGF5LCAid3JvbmcgYXZjQyB2ZXJzaW9uIik7CisgICAgZ290byBlcnJvcjsKKyAgfQorYXZjY19lcnJvcjoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGgyNjRwYXksICJhdmNDIHRvbyBzbWFsbCAiKTsKKyAgICBnb3RvIGVycm9yOworICB9CitzZXRfc3BzX3Bwc19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChydHBoMjY0cGF5LCAiZmFpbGVkIHRvIHNldCBzcHMvcHBzIik7CisgICAgZ290byBlcnJvcjsKKyAgfQorZXJyb3I6CisgIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY0X3BheV9wYXJzZV9zcHJvcF9wYXJhbWV0ZXJfc2V0cyAoR3N0UnRwSDI2NFBheSAqIHJ0cGgyNjRwYXkpCit7CisgIGNvbnN0IGdjaGFyICpwczsKKyAgZ2NoYXIgKipwYXJhbXM7CisgIGd1aW50IGxlbjsKKyAgZ2ludCBpOworICBHc3RCdWZmZXIgKmJ1ZjsKKworICBwcyA9IHJ0cGgyNjRwYXktPnNwcm9wX3BhcmFtZXRlcl9zZXRzOworICBpZiAocHMgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgZ3N0X3J0cF9oMjY0X3BheV9jbGVhcl9zcHNfcHBzIChydHBoMjY0cGF5KTsKKworICBwYXJhbXMgPSBnX3N0cnNwbGl0IChwcywgIiwiLCAwKTsKKyAgbGVuID0gZ19zdHJ2X2xlbmd0aCAocGFyYW1zKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0cGF5LCAid2UgaGF2ZSAlZCBwYXJhbXMiLCBsZW4pOworCisgIGZvciAoaSA9IDA7IHBhcmFtc1tpXTsgaSsrKSB7CisgICAgZ3NpemUgbmFsX2xlbjsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBndWludDggKm5hbHA7CisgICAgZ3VpbnQgc2F2ZSA9IDA7CisgICAgZ2ludCBzdGF0ZSA9IDA7CisKKyAgICBuYWxfbGVuID0gc3RybGVuIChwYXJhbXNbaV0pOworICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobmFsX2xlbik7CisKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBuYWxwID0gbWFwLmRhdGE7CisgICAgbmFsX2xlbiA9IGdfYmFzZTY0X2RlY29kZV9zdGVwIChwYXJhbXNbaV0sIG5hbF9sZW4sIG5hbHAsICZzdGF0ZSwgJnNhdmUpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKGJ1ZiwgMCwgbmFsX2xlbik7CisKKyAgICBpZiAoIW5hbF9sZW4pIHsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBnc3RfcnRwX2gyNjRfYWRkX3Nwc19wcHMgKEdTVF9FTEVNRU5UIChydHBoMjY0cGF5KSwgcnRwaDI2NHBheS0+c3BzLAorICAgICAgICBydHBoMjY0cGF5LT5wcHMsIGJ1Zik7CisgIH0KKyAgZ19zdHJmcmVldiAocGFyYW1zKTsKK30KKworc3RhdGljIGd1aW50CituZXh0X3N0YXJ0X2NvZGUgKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUpCit7CisgIC8qIEJveWVyLU1vb3JlIHN0cmluZyBtYXRjaGluZyBhbGdvcml0aG0sIGluIGEgZGVnZW5lcmF0aXZlCisgICAqIHNlbnNlIGJlY2F1c2Ugb3VyIHNlYXJjaCAnYWxwaGFiZXQnIGlzIGJpbmFyeSAtIDAgJiAxIG9ubHkuCisgICAqIFRoaXMgYWxsb3cgdXMgdG8gc2ltcGxpZnkgdGhlIGdlbmVyYWwgQk0gYWxnb3JpdGhtIHRvIGEgdmVyeQorICAgKiBzaW1wbGUgZm9ybS4gKi8KKyAgLyogYXNzdW1lIDEgaXMgaW4gdGhlIDN0aCBieXRlICovCisgIGd1aW50IG9mZnNldCA9IDI7CisKKyAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKKyAgICBpZiAoMSA9PSBkYXRhW29mZnNldF0pIHsKKyAgICAgIHVuc2lnbmVkIGludCBzaGlmdCA9IG9mZnNldDsKKworICAgICAgaWYgKDAgPT0gZGF0YVstLXNoaWZ0XSkgeworICAgICAgICBpZiAoMCA9PSBkYXRhWy0tc2hpZnRdKSB7CisgICAgICAgICAgcmV0dXJuIHNoaWZ0OworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBUaGUganVtcCBpcyBhbHdheXMgMyBiZWNhdXNlIG9mIHRoZSAxIHByZXZpb3VzbHkgbWF0Y2hlZC4KKyAgICAgICAqIEFsbCB0aGUgMCdzIG11c3QgYmUgYWZ0ZXIgdGhpcyAnMScgbWF0Y2hlZCBhdCBvZmZzZXQgKi8KKyAgICAgIG9mZnNldCArPSAzOworICAgIH0gZWxzZSBpZiAoMCA9PSBkYXRhW29mZnNldF0pIHsKKyAgICAgIC8qIG1heWJlIG5leHQgYnl0ZSBpcyAxPyAqLworICAgICAgb2Zmc2V0Kys7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGNhbiBqdW1wIDMgYnl0ZXMgZm9yd2FyZCAqLworICAgICAgb2Zmc2V0ICs9IDM7CisgICAgfQorICAgIC8qIGF0IGVhY2ggaXRlcmF0aW9uLCB3ZSByZXNjYW4gaW4gYSBiYWNrd2FyZCBtYW5uZXIgdW50aWwKKyAgICAgKiB3ZSBtYXRjaCAwLjAuMSBpbiByZXZlcnNlIG9yZGVyLiBTaW5jZSBvdXIgc2VhcmNoIHN0cmluZworICAgICAqIGhhcyBvbmx5IDIgJ2FscGFiZXRzJyAoaS5lLiAwICYgMSksIHdlIGtub3cgdGhhdCBhbnkKKyAgICAgKiBtaXNtYXRjaCB3aWxsIGZvcmNlIHVzIHRvIHNoaWZ0IGEgZml4ZWQgbnVtYmVyIG9mIHN0ZXBzICovCisgIH0KKyAgR1NUX0RFQlVHICgiQ2Fubm90IGZpbmQgbmV4dCBOQUwgc3RhcnQgY29kZS4gcmV0dXJuaW5nICV1Iiwgc2l6ZSk7CisKKyAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjY0X3BheV9kZWNvZGVfbmFsIChHc3RSdHBIMjY0UGF5ICogcGF5bG9hZGVyLAorICAgIGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIEdzdENsb2NrVGltZSBkdHMsIEdzdENsb2NrVGltZSBwdHMpCit7CisgIGd1aW50OCBoZWFkZXIsIHR5cGU7CisgIGdib29sZWFuIHVwZGF0ZWQ7CisKKyAgLyogZGVmYXVsdCBpcyBubyB1cGRhdGUgKi8KKyAgdXBkYXRlZCA9IEZBTFNFOworCisgIEdTVF9ERUJVRyAoIk5BTCBwYXlsb2FkIGxlbj0ldSIsIHNpemUpOworCisgIGhlYWRlciA9IGRhdGFbMF07CisgIHR5cGUgPSBoZWFkZXIgJiAweDFmOworCisgIC8qIFdlIHJlY29yZCB0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXN0IFNQUy9QUFMgc28KKyAgICogdGhhdCB3ZSBjYW4gaW5zZXJ0IHRoZW0gYXQgcmVndWxhciBpbnRlcnZhbHMgYW5kIHdoZW4gbmVlZGVkLiAqLworICBpZiAoU1BTX1RZUEVfSUQgPT0gdHlwZSB8fCBQUFNfVFlQRV9JRCA9PSB0eXBlKSB7CisgICAgR3N0QnVmZmVyICpuYWw7CisKKyAgICAvKiB0cmFpbGluZyAweDAgYXJlIG5vdCBwYXJ0IG9mIHRoZSBTUFMvUFBTICovCisgICAgd2hpbGUgKHNpemUgPiAwICYmIGRhdGFbc2l6ZSAtIDFdID09IDB4MCkKKyAgICAgIHNpemUtLTsKKworICAgIC8qIGVuY29kZSB0aGUgZW50aXJlIFNQUyBOQUwgaW4gYmFzZTY0ICovCisgICAgR1NUX0RFQlVHICgiRm91bmQgJXMgJXggJXggJXggTGVuPSV1IiwgdHlwZSA9PSBTUFNfVFlQRV9JRCA/ICJTUFMiIDogIlBQUyIsCisgICAgICAgIChoZWFkZXIgPj4gNyksIChoZWFkZXIgPj4gNSkgJiAzLCB0eXBlLCBzaXplKTsKKworICAgIG5hbCA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBzaXplLCBOVUxMKTsKKyAgICBnc3RfYnVmZmVyX2ZpbGwgKG5hbCwgMCwgZGF0YSwgc2l6ZSk7CisKKyAgICB1cGRhdGVkID0gZ3N0X3J0cF9oMjY0X2FkZF9zcHNfcHBzIChHU1RfRUxFTUVOVCAocGF5bG9hZGVyKSwKKyAgICAgICAgcGF5bG9hZGVyLT5zcHMsIHBheWxvYWRlci0+cHBzLCBuYWwpOworCisgICAgLyogcmVtZW1iZXIgd2hlbiB3ZSBsYXN0IHNhdyBTUFMgKi8KKyAgICBpZiAodXBkYXRlZCAmJiBwdHMgIT0gLTEpCisgICAgICBwYXlsb2FkZXItPmxhc3Rfc3BzcHBzID0gcHRzOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVRyAoIk5BTDogJXggJXggJXggTGVuID0gJXUiLCAoaGVhZGVyID4+IDcpLAorICAgICAgICAoaGVhZGVyID4+IDUpICYgMywgdHlwZSwgc2l6ZSk7CisgIH0KKworICByZXR1cm4gdXBkYXRlZDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfaDI2NF9wYXlfcGF5bG9hZF9uYWwgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogcGF5YnVmLCBHc3RDbG9ja1RpbWUgZHRzLCBHc3RDbG9ja1RpbWUgcHRzLCBnYm9vbGVhbiBlbmRfb2ZfYXUsCisgICAgZ2Jvb2xlYW4gZGVsdGFfdW5pdCwgZ2Jvb2xlYW4gZGlzY29udCk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2gyNjRfcGF5X3NlbmRfc3BzX3BwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RSdHBIMjY0UGF5ICogcnRwaDI2NHBheSwgR3N0Q2xvY2tUaW1lIGR0cywgR3N0Q2xvY2tUaW1lIHB0cykKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ2Jvb2xlYW4gc2VudF9hbGxfc3BzX3BwcyA9IFRSVUU7CisgIGd1aW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHJ0cGgyNjRwYXktPnNwcy0+bGVuOyBpKyspIHsKKyAgICBHc3RCdWZmZXIgKnNwc19idWYgPQorICAgICAgICBHU1RfQlVGRkVSX0NBU1QgKGdfcHRyX2FycmF5X2luZGV4IChydHBoMjY0cGF5LT5zcHMsIGkpKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRwYXksICJpbnNlcnRpbmcgU1BTIGluIHRoZSBzdHJlYW0iKTsKKyAgICAvKiByZXNlbmQgU1BTICovCisgICAgcmV0ID0gZ3N0X3J0cF9oMjY0X3BheV9wYXlsb2FkX25hbCAoYmFzZXBheWxvYWQsIGdzdF9idWZmZXJfcmVmIChzcHNfYnVmKSwKKyAgICAgICAgZHRzLCBwdHMsIEZBTFNFLCBGQUxTRSwgRkFMU0UpOworICAgIC8qIE5vdCBjcml0aWNhbCBoZXJlOyBidXQgdGhyb3cgYSB3YXJuaW5nICovCisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgc2VudF9hbGxfc3BzX3BwcyA9IEZBTFNFOworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChiYXNlcGF5bG9hZCwgIlByb2JsZW0gcHVzaGluZyBTUFMiKTsKKyAgICB9CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IHJ0cGgyNjRwYXktPnBwcy0+bGVuOyBpKyspIHsKKyAgICBHc3RCdWZmZXIgKnBwc19idWYgPQorICAgICAgICBHU1RfQlVGRkVSX0NBU1QgKGdfcHRyX2FycmF5X2luZGV4IChydHBoMjY0cGF5LT5wcHMsIGkpKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRwYXksICJpbnNlcnRpbmcgUFBTIGluIHRoZSBzdHJlYW0iKTsKKyAgICAvKiByZXNlbmQgUFBTICovCisgICAgcmV0ID0gZ3N0X3J0cF9oMjY0X3BheV9wYXlsb2FkX25hbCAoYmFzZXBheWxvYWQsIGdzdF9idWZmZXJfcmVmIChwcHNfYnVmKSwKKyAgICAgICAgZHRzLCBwdHMsIEZBTFNFLCBGQUxTRSwgRkFMU0UpOworICAgIC8qIE5vdCBjcml0aWNhbCBoZXJlOyBidXQgdGhyb3cgYSB3YXJuaW5nICovCisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgc2VudF9hbGxfc3BzX3BwcyA9IEZBTFNFOworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChiYXNlcGF5bG9hZCwgIlByb2JsZW0gcHVzaGluZyBQUFMiKTsKKyAgICB9CisgIH0KKworICBpZiAocHRzICE9IC0xICYmIHNlbnRfYWxsX3Nwc19wcHMpCisgICAgcnRwaDI2NHBheS0+bGFzdF9zcHNwcHMgPSBwdHM7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogQGRlbHRhX3VuaXQ6IGlmICVGQUxTRSB0aGUgZmlyc3QgcGFja2V0IHNlbnQgd29uJ3QgaGF2ZSB0aGUKKyAqIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUIGZsYWcuCisgKiBAZGlzY29udDogaWYgJVRSVUUgdGhlIGZpcnN0IHBhY2tldCBzZW50IHdpbGwgaGF2ZSB0aGUKKyAqIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UIGZsYWcuCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2gyNjRfcGF5X3BheWxvYWRfbmFsIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIHBheWJ1ZiwgR3N0Q2xvY2tUaW1lIGR0cywgR3N0Q2xvY2tUaW1lIHB0cywgZ2Jvb2xlYW4gZW5kX29mX2F1LAorICAgIGdib29sZWFuIGRlbHRhX3VuaXQsIGdib29sZWFuIGRpc2NvbnQpCit7CisgIEdzdFJ0cEgyNjRQYXkgKnJ0cGgyNjRwYXk7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludDggbmFsSGVhZGVyOworICBndWludDggbmFsVHlwZTsKKyAgZ3VpbnQgcGFja2V0X2xlbiwgcGF5bG9hZF9sZW4sIG10dTsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdCA9IE5VTEw7CisgIGdib29sZWFuIHNlbmRfc3BzcHBzOworICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisgIGd1aW50IHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChwYXlidWYpOworCisgIHJ0cGgyNjRwYXkgPSBHU1RfUlRQX0gyNjRfUEFZIChiYXNlcGF5bG9hZCk7CisgIG10dSA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX01UVSAocnRwaDI2NHBheSk7CisKKyAgZ3N0X2J1ZmZlcl9leHRyYWN0IChwYXlidWYsIDAsICZuYWxIZWFkZXIsIDEpOworICBuYWxUeXBlID0gbmFsSGVhZGVyICYgMHgxZjsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0cGF5LCAiUHJvY2Vzc2luZyBCdWZmZXIgd2l0aCBOQUwgVFlQRT0lZCIsIG5hbFR5cGUpOworCisgIC8qIHNob3VsZCBzZXQgc3JjIGNhcHMgYmVmb3JlIHB1c2hpbmcgc3R1ZmYsCisgICAqIGFuZCBpZiB3ZSBkaWQgbm90IHNlZSBlbm91Z2ggU1BTL1BQUywgdGhhdCBtYXkgbm90IGJlIHRoZSBjYXNlICovCisgIGlmIChHX1VOTElLRUxZICghZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChHU1RfUlRQX0JBU0VfUEFZTE9BRF9TUkNQQUQKKyAgICAgICAgICAgICAgKGJhc2VwYXlsb2FkKSkpKQorICAgIGdzdF9ydHBfaDI2NF9wYXlfc2V0X3Nwc19wcHMgKGJhc2VwYXlsb2FkKTsKKworICBzZW5kX3Nwc3BwcyA9IEZBTFNFOworCisgIC8qIGNoZWNrIGlmIHdlIG5lZWQgdG8gZW1pdCBhbiBTUFMvUFBTIG5vdyAqLworICBpZiAobmFsVHlwZSA9PSBJRFJfVFlQRV9JRCAmJiBydHBoMjY0cGF5LT5zcHNwcHNfaW50ZXJ2YWwgPiAwKSB7CisgICAgaWYgKHJ0cGgyNjRwYXktPmxhc3Rfc3BzcHBzICE9IC0xKSB7CisgICAgICBndWludDY0IGRpZmY7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBoMjY0cGF5LAorICAgICAgICAgICJub3cgJSIgR1NUX1RJTUVfRk9STUFUICIsIGxhc3QgU1BTL1BQUyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocHRzKSwgR1NUX1RJTUVfQVJHUyAocnRwaDI2NHBheS0+bGFzdF9zcHNwcHMpKTsKKworICAgICAgLyogY2FsY3VsYXRlIGRpZmYgYmV0d2VlbiBsYXN0IFNQUy9QUFMgaW4gbWlsbGlzZWNvbmRzICovCisgICAgICBpZiAocHRzID4gcnRwaDI2NHBheS0+bGFzdF9zcHNwcHMpCisgICAgICAgIGRpZmYgPSBwdHMgLSBydHBoMjY0cGF5LT5sYXN0X3Nwc3BwczsKKyAgICAgIGVsc2UKKyAgICAgICAgZGlmZiA9IDA7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRwYXksCisgICAgICAgICAgImludGVydmFsIHNpbmNlIGxhc3QgU1BTL1BQUyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZGlmZikpOworCisgICAgICAvKiBiaWdnZXIgdGhhbiBpbnRlcnZhbCwgcXVldWUgU1BTL1BQUyAqLworICAgICAgaWYgKEdTVF9USU1FX0FTX1NFQ09ORFMgKGRpZmYpID49IHJ0cGgyNjRwYXktPnNwc3Bwc19pbnRlcnZhbCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0cGF5LCAidGltZSB0byBzZW5kIFNQUy9QUFMiKTsKKyAgICAgICAgc2VuZF9zcHNwcHMgPSBUUlVFOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBubyBrbm93IHByZXZpb3VzIFNQUy9QUFMgdGltZSwgc2VuZCBub3cgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjRwYXksICJubyBwcmV2aW91cyBTUFMvUFBTIHRpbWUsIHNlbmQgbm93Iik7CisgICAgICBzZW5kX3Nwc3BwcyA9IFRSVUU7CisgICAgfQorICB9IGVsc2UgaWYgKG5hbFR5cGUgPT0gSURSX1RZUEVfSUQgJiYgcnRwaDI2NHBheS0+c3BzcHBzX2ludGVydmFsID09IC0xKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NHBheSwgInNlbmRpbmcgU1BTL1BQUyBiZWZvcmUgY3VycmVudCBJRFIgZnJhbWUiKTsKKyAgICAvKiBzZW5kIFNQUy9QUFMgYmVmb3JlIGV2ZXJ5IElEUiBmcmFtZSAqLworICAgIHNlbmRfc3BzcHBzID0gVFJVRTsKKyAgfQorCisgIGlmIChzZW5kX3Nwc3BwcyB8fCBydHBoMjY0cGF5LT5zZW5kX3Nwc3BwcykgeworICAgIC8qIHdlIG5lZWQgdG8gc2VuZCBTUFMvUFBTIG5vdyBmaXJzdC4gRklYTUUsIGRvbid0IHVzZSB0aGUgcHRzIGZvcgorICAgICAqIGNoZWNraW5nIHdoZW4gd2UgbmVlZCB0byBzZW5kIFNQUy9QUFMgYnV0IGNvbnZlcnQgdG8gcnVubmluZ190aW1lIGZpcnN0LiAqLworICAgIHJ0cGgyNjRwYXktPnNlbmRfc3BzcHBzID0gRkFMU0U7CisgICAgcmV0ID0gZ3N0X3J0cF9oMjY0X3BheV9zZW5kX3Nwc19wcHMgKGJhc2VwYXlsb2FkLCBydHBoMjY0cGF5LCBkdHMsIHB0cyk7CisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocGF5YnVmKTsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICB9CisKKyAgcGFja2V0X2xlbiA9IGdzdF9ydHBfYnVmZmVyX2NhbGNfcGFja2V0X2xlbiAoc2l6ZSwgMCwgMCk7CisKKyAgaWYgKHBhY2tldF9sZW4gPCBtdHUpIHsKKyAgICAvKiB3aWxsIGZpdCBpbiBvbmUgcGFja2V0ICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXBheWxvYWQsCisgICAgICAgICJOQUwgVW5pdCBmaXQgaW4gb25lIHBhY2tldCBkYXRhc2l6ZT0lZCBtdHU9JWQiLCBzaXplLCBtdHUpOworCisgICAgLyogY3JlYXRlIGJ1ZmZlciB3aXRob3V0IHBheWxvYWQgY29udGFpbmluZyBvbmx5IHRoZSBSVFAgaGVhZGVyCisgICAgICogKG1lbW9yeSBibG9jayBhdCBpbmRleCAwKSAqLworICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMCwgMCwgMCk7CisKKyAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKG91dGJ1ZiwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisKKyAgICAvKiBvbmx5IHNldCB0aGUgbWFya2VyIGJpdCBvbiBwYWNrZXRzIGNvbnRhaW5pbmcgYWNjZXNzIHVuaXRzICovCisgICAgaWYgKElTX0FDQ0VTU19VTklUIChuYWxUeXBlKSAmJiBlbmRfb2ZfYXUpIHsKKyAgICAgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKCZydHAsIDEpOworICAgIH0KKworICAgIC8qIHRpbWVzdGFtcCB0aGUgb3V0YnVmZmVyICovCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBwdHM7CisgICAgR1NUX0JVRkZFUl9EVFMgKG91dGJ1ZikgPSBkdHM7CisKKyAgICBpZiAoIWRlbHRhX3VuaXQpCisgICAgICAvKiBPbmx5IHRoZSBmaXJzdCBwYWNrZXQgc2VudCBzaG91bGQgbm90IGhhdmUgdGhlIGZsYWcgKi8KKyAgICAgIGRlbHRhX3VuaXQgPSBUUlVFOworICAgIGVsc2UKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgICAgaWYgKGRpc2NvbnQpIHsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgICAgLyogT25seSB0aGUgZmlyc3QgcGFja2V0IHNlbnQgc2hvdWxkIGhhdmUgdGhlIGZsYWcgKi8KKyAgICAgIGRpc2NvbnQgPSBGQUxTRTsKKyAgICB9CisKKyAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgICAvKiBpbnNlcnQgcGF5bG9hZCBtZW1vcnkgYmxvY2sgKi8KKyAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwaDI2NHBheSwgb3V0YnVmLCBwYXlidWYpOworICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfYXBwZW5kIChvdXRidWYsIHBheWJ1Zik7CisKKyAgICAvKiBwdXNoIHRoZSBidWZmZXIgdG8gdGhlIG5leHQgZWxlbWVudCAqLworICAgIHJldCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKGJhc2VwYXlsb2FkLCBvdXRidWYpOworICB9IGVsc2UgeworICAgIC8qIGZyYWdtZW50YXRpb24gVW5pdHMgRlUtQSAqLworICAgIGd1aW50IGxpbWl0ZWRTaXplOworICAgIGludCBpaSA9IDAsIHN0YXJ0ID0gMSwgZW5kID0gMCwgcG9zID0gMDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLAorICAgICAgICAiTkFMIFVuaXQgRE9FUyBOT1QgZml0IGluIG9uZSBwYWNrZXQgZGF0YXNpemU9JWQgbXR1PSVkIiwgc2l6ZSwgbXR1KTsKKworICAgIHBvcysrOworICAgIHNpemUtLTsKKworICAgIHJldCA9IEdTVF9GTE9XX09LOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXBheWxvYWQsICJVc2luZyBGVS1BIGZyYWdtZW50YXRpb24gZm9yIGRhdGEgc2l6ZT0lZCIsCisgICAgICAgIHNpemUpOworCisgICAgLyogV2Uga2VlcCAyIGJ5dGVzIGZvciBGVSBpbmRpY2F0b3IgYW5kIEZVIEhlYWRlciAqLworICAgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYXlsb2FkX2xlbiAobXR1IC0gMiwgMCwgMCk7CisKKyAgICBsaXN0ID0gZ3N0X2J1ZmZlcl9saXN0X25ld19zaXplZCAoKHNpemUgLyBwYXlsb2FkX2xlbikgKyAxKTsKKworICAgIHdoaWxlIChlbmQgPT0gMCkgeworICAgICAgbGltaXRlZFNpemUgPSBzaXplIDwgcGF5bG9hZF9sZW4gPyBzaXplIDogcGF5bG9hZF9sZW47CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChiYXNlcGF5bG9hZCwKKyAgICAgICAgICAiSW5zaWRlICBGVS1BIGZyYWdtZW50YXRpb24gbGltaXRlZFNpemU9JWQgaXRlcmF0aW9uPSVkIiwgbGltaXRlZFNpemUsCisgICAgICAgICAgaWkpOworCisgICAgICAvKiB1c2UgYnVmZmVyIGxpc3RzCisgICAgICAgKiBjcmVhdGUgYnVmZmVyIHdpdGhvdXQgcGF5bG9hZCBjb250YWluaW5nIG9ubHkgdGhlIFJUUCBoZWFkZXIKKyAgICAgICAqIChtZW1vcnkgYmxvY2sgYXQgaW5kZXggMCkgKi8KKyAgICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMiwgMCwgMCk7CisKKyAgICAgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0YnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKworICAgICAgR1NUX0JVRkZFUl9EVFMgKG91dGJ1ZikgPSBkdHM7CisgICAgICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA9IHB0czsKKyAgICAgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisKKyAgICAgIGlmIChsaW1pdGVkU2l6ZSA9PSBzaXplKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLCAiZW5kIHNpemU9JWQgaXRlcmF0aW9uPSVkIiwgc2l6ZSwgaWkpOworICAgICAgICBlbmQgPSAxOworICAgICAgfQorICAgICAgaWYgKElTX0FDQ0VTU19VTklUIChuYWxUeXBlKSkgeworICAgICAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBlbmQgJiYgZW5kX29mX2F1KTsKKyAgICAgIH0KKworICAgICAgLyogRlUgaW5kaWNhdG9yICovCisgICAgICBwYXlsb2FkWzBdID0gKG5hbEhlYWRlciAmIDB4NjApIHwgMjg7CisKKyAgICAgIC8qIEZVIEhlYWRlciAqLworICAgICAgcGF5bG9hZFsxXSA9IChzdGFydCA8PCA3KSB8IChlbmQgPDwgNikgfCAobmFsSGVhZGVyICYgMHgxZik7CisKKyAgICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAgICAgLyogaW5zZXJ0IHBheWxvYWQgbWVtb3J5IGJsb2NrICovCisgICAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwaDI2NHBheSwgb3V0YnVmLCBwYXlidWYpOworICAgICAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKG91dGJ1ZiwgcGF5YnVmLCBHU1RfQlVGRkVSX0NPUFlfTUVNT1JZLCBwb3MsCisgICAgICAgICAgbGltaXRlZFNpemUpOworCisgICAgICBpZiAoIWRlbHRhX3VuaXQpCisgICAgICAgIC8qIE9ubHkgdGhlIGZpcnN0IHBhY2tldCBzZW50IHNob3VsZCBub3QgaGF2ZSB0aGUgZmxhZyAqLworICAgICAgICBkZWx0YV91bml0ID0gVFJVRTsKKyAgICAgIGVsc2UKKyAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisKKyAgICAgIGlmIChkaXNjb250KSB7CisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgICAgICAvKiBPbmx5IHRoZSBmaXJzdCBwYWNrZXQgc2VudCBzaG91bGQgaGF2ZSB0aGUgZmxhZyAqLworICAgICAgICBkaXNjb250ID0gRkFMU0U7CisgICAgICB9CisKKyAgICAgIC8qIGFkZCB0aGUgYnVmZmVyIHRvIHRoZSBidWZmZXIgbGlzdCAqLworICAgICAgZ3N0X2J1ZmZlcl9saXN0X2FkZCAobGlzdCwgb3V0YnVmKTsKKworCisgICAgICBzaXplIC09IGxpbWl0ZWRTaXplOworICAgICAgcG9zICs9IGxpbWl0ZWRTaXplOworICAgICAgaWkrKzsKKyAgICAgIHN0YXJ0ID0gMDsKKyAgICB9CisKKyAgICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoX2xpc3QgKGJhc2VwYXlsb2FkLCBsaXN0KTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChwYXlidWYpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2gyNjRfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBIMjY0UGF5ICpydHBoMjY0cGF5OworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ3NpemUgc2l6ZTsKKyAgZ3VpbnQgbmFsX2xlbiwgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgR3N0Q2xvY2tUaW1lIGR0cywgcHRzOworICBHQXJyYXkgKm5hbF9xdWV1ZTsKKyAgZ2Jvb2xlYW4gYXZjOworICBHc3RCdWZmZXIgKnBheWJ1ZiA9IE5VTEw7CisgIGdzaXplIHNraXA7CisgIGdib29sZWFuIGRlbGF5ZWRfbm90X2RlbHRhX3VuaXQgPSBGQUxTRTsKKyAgZ2Jvb2xlYW4gZGVsYXllZF9kaXNjb250ID0gRkFMU0U7CisKKyAgcnRwaDI2NHBheSA9IEdTVF9SVFBfSDI2NF9QQVkgKGJhc2VwYXlsb2FkKTsKKworICAvKiB0aGUgaW5wdXQgYnVmZmVyIGNvbnRhaW5zIG9uZSBvciBtb3JlIE5BTCB1bml0cyAqLworCisgIGF2YyA9IHJ0cGgyNjRwYXktPnN0cmVhbV9mb3JtYXQgPT0gR1NUX0gyNjRfU1RSRUFNX0ZPUk1BVF9BVkM7CisKKyAgaWYgKGF2YykgeworICAgIC8qIEluIEFWQyBtb2RlLCB0aGVyZSBpcyBubyBhZGFwdGVyLCBzbyBub3RoaWduIHRvIGZsdXNoICovCisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgZGF0YSA9IG1hcC5kYXRhOworICAgIHNpemUgPSBtYXAuc2l6ZTsKKyAgICBwdHMgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKyAgICBkdHMgPSBHU1RfQlVGRkVSX0RUUyAoYnVmZmVyKTsKKyAgICBydHBoMjY0cGF5LT5kZWx0YV91bml0ID0gR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmZmVyLAorICAgICAgICBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgcnRwaDI2NHBheS0+ZGlzY29udCA9IEdTVF9CVUZGRVJfSVNfRElTQ09OVCAoYnVmZmVyKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChiYXNlcGF5bG9hZCwgImdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgZHRzID0gZ3N0X2FkYXB0ZXJfcHJldl9kdHMgKHJ0cGgyNjRwYXktPmFkYXB0ZXIsIE5VTEwpOworICAgIHB0cyA9IGdzdF9hZGFwdGVyX3ByZXZfcHRzIChydHBoMjY0cGF5LT5hZGFwdGVyLCBOVUxMKTsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICBpZiAoIUdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpKSB7CisgICAgICAgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cGgyNjRwYXktPmFkYXB0ZXIpID09IDApCisgICAgICAgICAgcnRwaDI2NHBheS0+ZGVsdGFfdW5pdCA9IEZBTFNFOworICAgICAgICBlbHNlCisgICAgICAgICAgLyogVGhpcyBidWZmZXIgY29udGFpbnMgYSBrZXkgZnJhbWUgYnV0IHRoZSBhZGFwdGVyIGlzbid0IGVtcHR5LiBTbworICAgICAgICAgICAqIHdlJ2xsIHB1cmdlIGl0IGZpcnN0IGJ5IHNlbmRpbmcgYSBmaXJzdCBwYWNrZXQgYW5kIHRoZW4gdGhlIHNlY29uZAorICAgICAgICAgICAqIG9uZSB3b24ndCBoYXZlIHRoZSBERUxUQV9VTklUIGZsYWcuICovCisgICAgICAgICAgZGVsYXllZF9ub3RfZGVsdGFfdW5pdCA9IFRSVUU7CisgICAgICB9CisKKyAgICAgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKGJ1ZmZlcikpIHsKKyAgICAgICAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwaDI2NHBheS0+YWRhcHRlcikgPT0gMCkKKyAgICAgICAgICBydHBoMjY0cGF5LT5kaXNjb250ID0gVFJVRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIC8qIFRoaXMgYnVmZmVyIGhhcyB0aGUgRElTQ09OVCBmbGFnIGJ1dCB0aGUgYWRhcHRlciBpc24ndCBlbXB0eS4gU28KKyAgICAgICAgICAgKiB3ZSdsbCBwdXJnZSBpdCBmaXJzdCBieSBzZW5kaW5nIGEgZmlyc3QgcGFja2V0IGFuZCB0aGVuIHRoZSBzZWNvbmQKKyAgICAgICAgICAgKiBvbmUgd2lsbCBoYXZlIHRoZSBESVNDT05UIGZsYWcgc2V0LiAqLworICAgICAgICAgIGRlbGF5ZWRfZGlzY29udCA9IFRSVUU7CisgICAgICB9CisKKyAgICAgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGR0cykpCisgICAgICAgIGR0cyA9IEdTVF9CVUZGRVJfRFRTIChidWZmZXIpOworICAgICAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAocHRzKSkKKyAgICAgICAgcHRzID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcik7CisKKyAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGgyNjRwYXktPmFkYXB0ZXIsIGJ1ZmZlcik7CisgICAgfQorICAgIHNpemUgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cGgyNjRwYXktPmFkYXB0ZXIpOworICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZSBpZiB0aGUgYWRhcHRlciBpcyBlbXB0eSwgZS5nLiBvbiBFT1MgKi8KKyAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgIGRhdGEgPSBnc3RfYWRhcHRlcl9tYXAgKHJ0cGgyNjRwYXktPmFkYXB0ZXIsIHNpemUpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLAorICAgICAgICAiZ290ICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgKCUiIEdfR1NJWkVfRk9STUFUICIpIiwgc2l6ZSwKKyAgICAgICAgYnVmZmVyID8gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSA6IDApOworICB9CisKKyAgcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgLyogbm93IGxvb3Agb3ZlciBhbGwgTkFMIHVuaXRzIGFuZCBwdXQgdGhlbSBpbiBhIHBhY2tldAorICAgKiBGSVhNRSwgd2Ugc2hvdWxkIHJlYWxseSB0cnkgdG8gcGFjayBtdWx0aXBsZSBOQUwgdW5pdHMgaW50byBvbmUgUlRQIHBhY2tldAorICAgKiBpZiB3ZSBjYW4sIGVzcGVjaWFsbHkgZm9yIHRoZSBjb25maWcgcGFja2V0cyB0aGF0IHdvbnQndCBjYXVzZSBkZWNvZGVyIAorICAgKiBsYXRlbmN5LiAqLworICBpZiAoYXZjKSB7CisgICAgZ3VpbnQgbmFsX2xlbmd0aF9zaXplOworICAgIGdzaXplIG9mZnNldCA9IDA7CisKKyAgICBuYWxfbGVuZ3RoX3NpemUgPSBydHBoMjY0cGF5LT5uYWxfbGVuZ3RoX3NpemU7CisKKyAgICB3aGlsZSAoc2l6ZSA+IG5hbF9sZW5ndGhfc2l6ZSkgeworICAgICAgZ2ludCBpOworICAgICAgZ2Jvb2xlYW4gZW5kX29mX2F1ID0gRkFMU0U7CisKKyAgICAgIG5hbF9sZW4gPSAwOworICAgICAgZm9yIChpID0gMDsgaSA8IG5hbF9sZW5ndGhfc2l6ZTsgaSsrKSB7CisgICAgICAgIG5hbF9sZW4gPSAoKG5hbF9sZW4gPDwgOCkgKyBkYXRhW2ldKTsKKyAgICAgIH0KKworICAgICAgLyogc2tpcCB0aGUgbGVuZ3RoIGJ5dGVzLCBtYWtlIHN1cmUgd2UgZG9uJ3QgcnVuIHBhc3QgdGhlIGJ1ZmZlciBzaXplICovCisgICAgICBkYXRhICs9IG5hbF9sZW5ndGhfc2l6ZTsKKyAgICAgIG9mZnNldCArPSBuYWxfbGVuZ3RoX3NpemU7CisgICAgICBzaXplIC09IG5hbF9sZW5ndGhfc2l6ZTsKKworICAgICAgaWYgKHNpemUgPj0gbmFsX2xlbikgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChiYXNlcGF5bG9hZCwgImdvdCBOQUwgb2Ygc2l6ZSAldSIsIG5hbF9sZW4pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmFsX2xlbiA9IHNpemU7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLCAiZ290IGluY29tcGxldGUgTkFMIG9mIHNpemUgJXUiLAorICAgICAgICAgICAgbmFsX2xlbik7CisgICAgICB9CisKKyAgICAgIC8qIElmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgdGhlbiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZQorICAgICAgICogYWNjZXNzIHVuaXQKKyAgICAgICAqLworICAgICAgaWYgKHJ0cGgyNjRwYXktPmFsaWdubWVudCA9PSBHU1RfSDI2NF9BTElHTk1FTlRfQVUKKyAgICAgICAgICAmJiBzaXplIC0gbmFsX2xlbiA8PSBuYWxfbGVuZ3RoX3NpemUpIHsKKyAgICAgICAgZW5kX29mX2F1ID0gVFJVRTsKKyAgICAgIH0KKworICAgICAgcGF5YnVmID0gZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAoYnVmZmVyLCBHU1RfQlVGRkVSX0NPUFlfQUxMLCBvZmZzZXQsCisgICAgICAgICAgbmFsX2xlbik7CisgICAgICByZXQgPQorICAgICAgICAgIGdzdF9ydHBfaDI2NF9wYXlfcGF5bG9hZF9uYWwgKGJhc2VwYXlsb2FkLCBwYXlidWYsIGR0cywgcHRzLAorICAgICAgICAgIGVuZF9vZl9hdSwgcnRwaDI2NHBheS0+ZGVsdGFfdW5pdCwgcnRwaDI2NHBheS0+ZGlzY29udCk7CisKKyAgICAgIGlmICghcnRwaDI2NHBheS0+ZGVsdGFfdW5pdCkKKyAgICAgICAgLyogT25seSB0aGUgZmlyc3Qgb3V0Z29pbmcgcGFja2V0IGRvZXNuJ3QgaGF2ZSB0aGUgREVMVEFfVU5JVCBmbGFnICovCisgICAgICAgIHJ0cGgyNjRwYXktPmRlbHRhX3VuaXQgPSBUUlVFOworCisgICAgICBpZiAocnRwaDI2NHBheS0+ZGlzY29udCkKKyAgICAgICAgLyogT25seSB0aGUgZmlyc3Qgb3V0Z29pbmcgcGFja2V0IGhhdmUgdGhlIERJU0NPTlQgZmxhZyAqLworICAgICAgICBydHBoMjY0cGF5LT5kaXNjb250ID0gRkFMU0U7CisKKyAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGJyZWFrOworCisgICAgICBkYXRhICs9IG5hbF9sZW47CisgICAgICBvZmZzZXQgKz0gbmFsX2xlbjsKKyAgICAgIHNpemUgLT0gbmFsX2xlbjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ3VpbnQgbmV4dDsKKyAgICBnYm9vbGVhbiB1cGRhdGUgPSBGQUxTRTsKKworICAgIC8qIGdldCBvZmZzZXQgb2YgZmlyc3Qgc3RhcnQgY29kZSAqLworICAgIG5leHQgPSBuZXh0X3N0YXJ0X2NvZGUgKGRhdGEsIHNpemUpOworCisgICAgLyogc2tpcCB0byBzdGFydCBjb2RlLCBpZiBubyBzdGFydCBjb2RlIGlzIGZvdW5kLCBuZXh0IHdpbGwgYmUgc2l6ZSBhbmQgd2UKKyAgICAgKiB3aWxsIG5vdCBjb2xsZWN0IGRhdGEuICovCisgICAgZGF0YSArPSBuZXh0OworICAgIHNpemUgLT0gbmV4dDsKKyAgICBuYWxfcXVldWUgPSBydHBoMjY0cGF5LT5xdWV1ZTsKKyAgICBza2lwID0gbmV4dDsKKworICAgIC8qIGFycmF5IG11c3QgYmUgZW1wdHkgd2hlbiB3ZSBnZXQgaGVyZSAqLworICAgIGdfYXNzZXJ0IChuYWxfcXVldWUtPmxlbiA9PSAwKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLAorICAgICAgICAiZm91bmQgZmlyc3Qgc3RhcnQgYXQgJXUsIGJ5dGVzIGxlZnQgJSIgR19HU0laRV9GT1JNQVQsIG5leHQsIHNpemUpOworCisgICAgLyogZmlyc3QgcGFzcyB0byBsb2NhdGUgTkFMcyBhbmQgcGFyc2UgU1BTL1BQUyAqLworICAgIHdoaWxlIChzaXplID4gNCkgeworICAgICAgLyogc2tpcCBzdGFydCBjb2RlICovCisgICAgICBkYXRhICs9IDM7CisgICAgICBzaXplIC09IDM7CisKKyAgICAgIC8qIHVzZSBuZXh0X3N0YXJ0X2NvZGUoKSB0byBzY2FuIGJ1ZmZlci4KKyAgICAgICAqIG5leHRfc3RhcnRfY29kZSgpIHJldHVybnMgdGhlIG9mZnNldCBpbiBkYXRhLCAKKyAgICAgICAqIHN0YXJ0aW5nIGZyb20gemVybyB0byB0aGUgZmlyc3QgYnl0ZSBvZiAwLjAuMC4xCisgICAgICAgKiBJZiBubyBzdGFydCBjb2RlIGlzIGZvdW5kLCBpdCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgCisgICAgICAgKiAnc2l6ZScgcGFyYW1ldGVyLiAKKyAgICAgICAqIGRhdGEgaXMgdW5jaGFuZ2VkIGJ5IHRoZSBjYWxsIHRvIG5leHRfc3RhcnRfY29kZSgpCisgICAgICAgKi8KKyAgICAgIG5leHQgPSBuZXh0X3N0YXJ0X2NvZGUgKGRhdGEsIHNpemUpOworCisgICAgICAvKiBuYWwgb3IgYXUgYWxpZ25lZCBpbnB1dCBuZWVkcyBubyBkZWxheWluZyB1bnRpbCBuZXh0IHRpbWUgKi8KKyAgICAgIGlmIChuZXh0ID09IHNpemUgJiYgYnVmZmVyICE9IE5VTEwgJiYKKyAgICAgICAgICBydHBoMjY0cGF5LT5hbGlnbm1lbnQgPT0gR1NUX0gyNjRfQUxJR05NRU5UX1VOS05PV04pIHsKKyAgICAgICAgLyogRGlkbid0IGZpbmQgdGhlIHN0YXJ0IG9mIG5leHQgTkFMIGFuZCBpdCdzIG5vdCBFT1MsCisgICAgICAgICAqIGhhbmRsZSBpdCBuZXh0IHRpbWUgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qIG5hbCBsZW5ndGggaXMgZGlzdGFuY2UgdG8gbmV4dCBzdGFydCBjb2RlICovCisgICAgICBuYWxfbGVuID0gbmV4dDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXBheWxvYWQsICJmb3VuZCBuZXh0IHN0YXJ0IGF0ICV1IG9mIHNpemUgJXUiLCBuZXh0LAorICAgICAgICAgIG5hbF9sZW4pOworCisgICAgICBpZiAocnRwaDI2NHBheS0+c3Byb3BfcGFyYW1ldGVyX3NldHMgIT0gTlVMTCkgeworICAgICAgICAvKiBleHBsaWNpdGx5IHNldCBwcm9maWxlIGFuZCBzcHJvcCwgdXNlIHRob3NlICovCisgICAgICAgIGlmIChydHBoMjY0cGF5LT51cGRhdGVfY2FwcykgeworICAgICAgICAgIGlmICghZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLAorICAgICAgICAgICAgICAgICAgInNwcm9wLXBhcmFtZXRlci1zZXRzIiwgR19UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgIHJ0cGgyNjRwYXktPnNwcm9wX3BhcmFtZXRlcl9zZXRzLCBOVUxMKSkKKyAgICAgICAgICAgIGdvdG8gY2Fwc19yZWplY3RlZDsKKworICAgICAgICAgIC8qIHBhcnNlIFNQUyBhbmQgUFBTIGZyb20gcHJvdmlkZWQgcGFyYW1ldGVyIHNldCAoZm9yIGluc2VydGlvbikgKi8KKyAgICAgICAgICBnc3RfcnRwX2gyNjRfcGF5X3BhcnNlX3Nwcm9wX3BhcmFtZXRlcl9zZXRzIChydHBoMjY0cGF5KTsKKworICAgICAgICAgIHJ0cGgyNjRwYXktPnVwZGF0ZV9jYXBzID0gRkFMU0U7CisKKyAgICAgICAgICBHU1RfREVCVUcgKCJvdXRjYXBzIHVwZGF0ZTogc3Byb3AtcGFyYW1ldGVyLXNldHM9JXMiLAorICAgICAgICAgICAgICBydHBoMjY0cGF5LT5zcHJvcF9wYXJhbWV0ZXJfc2V0cyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFdlIGtub3cgb3VyIHN0cmVhbSBpcyBhIHZhbGlkIEgyNjQgTkFMIHBhY2tldCwKKyAgICAgICAgICogZ28gcGFyc2UgaXQgZm9yIFNQUy9QUFMgdG8gZW5yaWNoIHRoZSBjYXBzICovCisgICAgICAgIC8qIG9yZGVyOiBtYWtlIHN1cmUgdG8gY2hlY2sgbmFsICovCisgICAgICAgIHVwZGF0ZSA9CisgICAgICAgICAgICBnc3RfcnRwX2gyNjRfcGF5X2RlY29kZV9uYWwgKHJ0cGgyNjRwYXksIGRhdGEsIG5hbF9sZW4sIGR0cywgcHRzKQorICAgICAgICAgICAgfHwgdXBkYXRlOworICAgICAgfQorICAgICAgLyogbW92ZSB0byBuZXh0IE5BTCBwYWNrZXQgKi8KKyAgICAgIGRhdGEgKz0gbmFsX2xlbjsKKyAgICAgIHNpemUgLT0gbmFsX2xlbjsKKworICAgICAgZ19hcnJheV9hcHBlbmRfdmFsIChuYWxfcXVldWUsIG5hbF9sZW4pOworICAgIH0KKworICAgIC8qIGlmIGhhcyBuZXcgU1BTICYgUFBTLCB1cGRhdGUgdGhlIG91dHB1dCBjYXBzICovCisgICAgaWYgKEdfVU5MSUtFTFkgKHVwZGF0ZSkpCisgICAgICBpZiAoIWdzdF9ydHBfaDI2NF9wYXlfc2V0X3Nwc19wcHMgKGJhc2VwYXlsb2FkKSkKKyAgICAgICAgZ290byBjYXBzX3JlamVjdGVkOworCisgICAgLyogc2Vjb25kIHBhc3MgdG8gcGF5bG9hZCBhbmQgcHVzaCAqLworCisgICAgaWYgKG5hbF9xdWV1ZS0+bGVuICE9IDApCisgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAocnRwaDI2NHBheS0+YWRhcHRlciwgc2tpcCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmFsX3F1ZXVlLT5sZW47IGkrKykgeworICAgICAgZ3VpbnQgc2l6ZTsKKyAgICAgIGdib29sZWFuIGVuZF9vZl9hdSA9IEZBTFNFOworCisgICAgICBuYWxfbGVuID0gZ19hcnJheV9pbmRleCAobmFsX3F1ZXVlLCBndWludCwgaSk7CisgICAgICAvKiBza2lwIHN0YXJ0IGNvZGUgKi8KKyAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChydHBoMjY0cGF5LT5hZGFwdGVyLCAzKTsKKworICAgICAgLyogVHJpbSB0aGUgZW5kIHVubGVzcyB3ZSdyZSB0aGUgbGFzdCBOQUwgaW4gdGhlIHN0cmVhbS4KKyAgICAgICAqIEluIGNhc2Ugd2UncmUgbm90IGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3ZSBrbm93IHRoZSBuZXh0IGJsb2NrCisgICAgICAgKiBzdGFydHMgd2l0aCAweDAwMDAwMSBzbyBhbGwgdGhlIDB4MDAgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGlzIG9uZSBhcmUKKyAgICAgICAqIHRyYWlsaW5nIDB4MCB0aGF0IGNhbiBiZSBkaXNjYXJkZWQgKi8KKyAgICAgIHNpemUgPSBuYWxfbGVuOworICAgICAgZGF0YSA9IGdzdF9hZGFwdGVyX21hcCAocnRwaDI2NHBheS0+YWRhcHRlciwgc2l6ZSk7CisgICAgICBpZiAoaSArIDEgIT0gbmFsX3F1ZXVlLT5sZW4gfHwgYnVmZmVyICE9IE5VTEwpCisgICAgICAgIGZvciAoOyBzaXplID4gMSAmJiBkYXRhW3NpemUgLSAxXSA9PSAweDA7IHNpemUtLSkKKyAgICAgICAgICAvKiBza2lwICovIDsKKworCisgICAgICAvKiBJZiBpdCdzIHRoZSBsYXN0IG5hbCB1bml0IHdlIGhhdmUgaW4gbm9uLWJ5dGVzdHJlYW0gbW9kZSwgd2UgY2FuCisgICAgICAgKiBhc3N1bWUgaXQncyB0aGUgZW5kIG9mIGFuIGFjY2Vzcy11bml0CisgICAgICAgKgorICAgICAgICogRklYTUU6IFdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgbmV4dCBwYWNrZXQgb3IgRU9TIHRvCisgICAgICAgKiBhY3R1YWxseSBwYXlsb2FkIHRoZSBOQUwgc28gd2UgY2FuIGtub3cgaWYgdGhlIGN1cnJlbnQgTkFMIGlzCisgICAgICAgKiB0aGUgbGFzdCBvbmUgb2YgYW4gYWNjZXNzIHVuaXQgb3Igbm90IGlmIHdlIGFyZSBpbiBieXRlc3RyZWFtIG1vZGUKKyAgICAgICAqLworICAgICAgaWYgKChydHBoMjY0cGF5LT5hbGlnbm1lbnQgPT0gR1NUX0gyNjRfQUxJR05NRU5UX0FVIHx8IGJ1ZmZlciA9PSBOVUxMKSAmJgorICAgICAgICAgIGkgPT0gbmFsX3F1ZXVlLT5sZW4gLSAxKQorICAgICAgICBlbmRfb2ZfYXUgPSBUUlVFOworICAgICAgcGF5YnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHJ0cGgyNjRwYXktPmFkYXB0ZXIsIHNpemUpOworICAgICAgZ19hc3NlcnQgKHBheWJ1Zik7CisKKyAgICAgIC8qIHB1dCB0aGUgZGF0YSBpbiBvbmUgb3IgbW9yZSBSVFAgcGFja2V0cyAqLworICAgICAgcmV0ID0KKyAgICAgICAgICBnc3RfcnRwX2gyNjRfcGF5X3BheWxvYWRfbmFsIChiYXNlcGF5bG9hZCwgcGF5YnVmLCBkdHMsIHB0cywKKyAgICAgICAgICBlbmRfb2ZfYXUsIHJ0cGgyNjRwYXktPmRlbHRhX3VuaXQsIHJ0cGgyNjRwYXktPmRpc2NvbnQpOworCisgICAgICBpZiAoZGVsYXllZF9ub3RfZGVsdGFfdW5pdCkgeworICAgICAgICBydHBoMjY0cGF5LT5kZWx0YV91bml0ID0gRkFMU0U7CisgICAgICAgIGRlbGF5ZWRfbm90X2RlbHRhX3VuaXQgPSBGQUxTRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIE9ubHkgdGhlIGZpcnN0IG91dGdvaW5nIHBhY2tldCBkb2Vzbid0IGhhdmUgdGhlIERFTFRBX1VOSVQgZmxhZyAqLworICAgICAgICBydHBoMjY0cGF5LT5kZWx0YV91bml0ID0gVFJVRTsKKyAgICAgIH0KKworICAgICAgaWYgKGRlbGF5ZWRfZGlzY29udCkgeworICAgICAgICBydHBoMjY0cGF5LT5kaXNjb250ID0gVFJVRTsKKyAgICAgICAgZGVsYXllZF9kaXNjb250ID0gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBPbmx5IHRoZSBmaXJzdCBvdXRnb2luZyBwYWNrZXQgaGF2ZSB0aGUgRElTQ09OVCBmbGFnICovCisgICAgICAgIHJ0cGgyNjRwYXktPmRpc2NvbnQgPSBGQUxTRTsKKyAgICAgIH0KKworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogbW92ZSB0byBuZXh0IE5BTCBwYWNrZXQgKi8KKyAgICAgIC8qIFNraXBzIHRoZSB0cmFpbGluZyB6ZXJvcyAqLworICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHJ0cGgyNjRwYXktPmFkYXB0ZXIsIG5hbF9sZW4gLSBzaXplKTsKKyAgICB9CisgICAgZ19hcnJheV9zZXRfc2l6ZSAobmFsX3F1ZXVlLCAwKTsKKyAgfQorCitkb25lOgorICBpZiAoYXZjKSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICB9IGVsc2UgeworICAgIGdzdF9hZGFwdGVyX3VubWFwIChydHBoMjY0cGF5LT5hZGFwdGVyKTsKKyAgfQorCisgIHJldHVybiByZXQ7CisKK2NhcHNfcmVqZWN0ZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGJhc2VwYXlsb2FkLCAiQ291bGQgbm90IHNldCBvdXRjYXBzIik7CisgICAgZ19hcnJheV9zZXRfc2l6ZSAobmFsX3F1ZXVlLCAwKTsKKyAgICByZXQgPSBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2gyNjRfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdzdFJ0cEgyNjRQYXkgKnJ0cGgyNjRwYXkgPSBHU1RfUlRQX0gyNjRfUEFZIChwYXlsb2FkKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGgyNjRwYXktPmFkYXB0ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU06CisgICAgICBzID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiR3N0Rm9yY2VLZXlVbml0IikpIHsKKyAgICAgICAgZ2Jvb2xlYW4gcmVzZW5kX2NvZGVjX2RhdGE7CisKKyAgICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2Jvb2xlYW4gKHMsICJhbGwtaGVhZGVycyIsCisgICAgICAgICAgICAgICAgJnJlc2VuZF9jb2RlY19kYXRhKSAmJiByZXNlbmRfY29kZWNfZGF0YSkKKyAgICAgICAgICBydHBoMjY0cGF5LT5zZW5kX3Nwc3BwcyA9IFRSVUU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgeworICAgICAgLyogY2FsbCBoYW5kbGVfYnVmZmVyIHdpdGggTlVMTCB0byBmbHVzaCBsYXN0IE5BTCBmcm9tIGFkYXB0ZXIKKyAgICAgICAqIGluIGJ5dGUtc3RyZWFtIG1vZGUKKyAgICAgICAqLworICAgICAgZ3N0X3J0cF9oMjY0X3BheV9oYW5kbGVfYnVmZmVyIChwYXlsb2FkLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9TVFJFQU1fU1RBUlQ6CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY0cGF5LCAiTmV3IHN0cmVhbSBkZXRlY3RlZCA9PiBDbGVhciBTUFMgYW5kIFBQUyIpOworICAgICAgZ3N0X3J0cF9oMjY0X3BheV9jbGVhcl9zcHNfcHBzIChydHBoMjY0cGF5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJlcyA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChwYXlsb2FkLCBldmVudCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2gyNjRfcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0UnRwSDI2NFBheSAqcnRwaDI2NHBheSA9IEdTVF9SVFBfSDI2NF9QQVkgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBydHBoMjY0cGF5LT5zZW5kX3Nwc3BwcyA9IEZBTFNFOworICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGgyNjRwYXktPmFkYXB0ZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIHJ0cGgyNjRwYXktPmxhc3Rfc3BzcHBzID0gLTE7CisgICAgICBnc3RfcnRwX2gyNjRfcGF5X2NsZWFyX3Nwc19wcHMgKHJ0cGgyNjRwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NF9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cEgyNjRQYXkgKnJ0cGgyNjRwYXk7CisKKyAgcnRwaDI2NHBheSA9IEdTVF9SVFBfSDI2NF9QQVkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1NQUk9QX1BBUkFNRVRFUl9TRVRTOgorICAgICAgZ19mcmVlIChydHBoMjY0cGF5LT5zcHJvcF9wYXJhbWV0ZXJfc2V0cyk7CisgICAgICBydHBoMjY0cGF5LT5zcHJvcF9wYXJhbWV0ZXJfc2V0cyA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgcnRwaDI2NHBheS0+dXBkYXRlX2NhcHMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NPTkZJR19JTlRFUlZBTDoKKyAgICAgIHJ0cGgyNjRwYXktPnNwc3Bwc19pbnRlcnZhbCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY0X3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwSDI2NFBheSAqcnRwaDI2NHBheTsKKworICBydHBoMjY0cGF5ID0gR1NUX1JUUF9IMjY0X1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU1BST1BfUEFSQU1FVEVSX1NFVFM6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBydHBoMjY0cGF5LT5zcHJvcF9wYXJhbWV0ZXJfc2V0cyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ09ORklHX0lOVEVSVkFMOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgcnRwaDI2NHBheS0+c3BzcHBzX2ludGVydmFsKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2NF9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBoMjY0cGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX0gyNjRfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwaDI2NHBheS5oIGIvZ3N0L3J0cC9nc3RydHBoMjY0cGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhNWU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaDI2NHBheS5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9IMjY0X1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0gyNjRfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfSDI2NF9QQVkgXAorICAoZ3N0X3J0cF9oMjY0X3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0gyNjRfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0gyNjRfUEFZLEdzdFJ0cEgyNjRQYXkpKQorI2RlZmluZSBHU1RfUlRQX0gyNjRfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9IMjY0X1BBWSxHc3RSdHBIMjY0UGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0gyNjRfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0gyNjRfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9IMjY0X1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSDI2NF9QQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2NFBheSBHc3RSdHBIMjY0UGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjRQYXlDbGFzcyBHc3RSdHBIMjY0UGF5Q2xhc3M7CisKK3R5cGVkZWYgZW51bQoreworICBHU1RfSDI2NF9TVFJFQU1fRk9STUFUX1VOS05PV04sCisgIEdTVF9IMjY0X1NUUkVBTV9GT1JNQVRfQllURVNUUkVBTSwKKyAgR1NUX0gyNjRfU1RSRUFNX0ZPUk1BVF9BVkMKK30gR3N0SDI2NFN0cmVhbUZvcm1hdDsKKwordHlwZWRlZiBlbnVtCit7CisgIEdTVF9IMjY0X0FMSUdOTUVOVF9VTktOT1dOLAorICBHU1RfSDI2NF9BTElHTk1FTlRfTkFMLAorICBHU1RfSDI2NF9BTElHTk1FTlRfQVUKK30gR3N0SDI2NEFsaWdubWVudDsKKworc3RydWN0IF9Hc3RSdHBIMjY0UGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisKKyAgZ3VpbnQgcHJvZmlsZTsKKyAgR1B0ckFycmF5ICpzcHMsICpwcHM7CisKKyAgR3N0SDI2NFN0cmVhbUZvcm1hdCBzdHJlYW1fZm9ybWF0OworICBHc3RIMjY0QWxpZ25tZW50IGFsaWdubWVudDsKKyAgZ3VpbnQgbmFsX2xlbmd0aF9zaXplOworICBHQXJyYXkgKnF1ZXVlOworCisgIGdjaGFyICpzcHJvcF9wYXJhbWV0ZXJfc2V0czsKKyAgZ2Jvb2xlYW4gdXBkYXRlX2NhcHM7CisKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKworICBnaW50IHNwc3Bwc19pbnRlcnZhbDsKKyAgZ2Jvb2xlYW4gc2VuZF9zcHNwcHM7CisgIEdzdENsb2NrVGltZSBsYXN0X3Nwc3BwczsKKworICAvKiBUUlVFIGlmIHRoZSBuZXh0IE5BTFUgcHJvY2Vzc2VkIHNob3VsZCBoYXZlIHRoZSBERUxUQV9VTklUIGZsYWcgKi8KKyAgZ2Jvb2xlYW4gZGVsdGFfdW5pdDsKKyAgLyogVFJVRSBpZiB0aGUgbmV4dCBOQUxVIHByb2Nlc3NlZCBzaG91bGQgaGF2ZSB0aGUgRElTQ09OVCBmbGFnICovCisgIGdib29sZWFuIGRpc2NvbnQ7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cEgyNjRQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfaDI2NF9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX2gyNjRfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0gyNjRfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1M2RmZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmMKQEAgLTAsMCArMSwxNjE0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDE0PiBKdXJnZW4gU2xvd2FjayA8anVyZ2Vuc2xvd2Fja0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Yml0cmVhZGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlICJnc3RydHBoMjY1ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBoMjY1ZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cGgyNjVkZXBheV9kZWJ1ZykKKworLyogVGhpcyBpcyB3aGF0IHdlJ2xsIGRlZmF1bHQgdG8gd2hlbiBkb3duc3RyZWFtIGhhc24ndAorICogZXhwcmVzc2VkIGEgcmVzdHJpY3Rpb24gb3IgcHJlZmVyZW5jZSB2aWEgY2FwcyAqLworI2RlZmluZSBERUZBVUxUX1NUUkVBTV9GT1JNQVQgR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9CWVRFU1RSRUFNCisjZGVmaW5lIERFRkFVTFRfQUNDRVNTX1VOSVQgICBGQUxTRQorCisvKiAzIHplcm8gYnl0ZXMgc3luY3dvcmQgKi8KK3N0YXRpYyBjb25zdCBndWludDggc3luY19ieXRlc1tdID0geyAwLCAwLCAwLCAxIH07CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2gyNjVfZGVwYXlfc3JjX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTCisgICAgKCJ2aWRlby94LWgyNjUsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylodmMxLCBhbGlnbm1lbnQ9KHN0cmluZylhdTsgIgorICAgICAgICAvKiBGSVhNRTogaGV2MSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCB5ZXQgKi8KKyAgICAgICAgLyogInZpZGVvL3gtaDI2NSwgIgorICAgICAgICAgICAic3RyZWFtLWZvcm1hdCA9IChzdHJpbmcpIGhldjEsIGFsaWdubWVudCA9IChzdHJpbmcpIGF1OyAiICovCisgICAgICAgICJ2aWRlby94LWgyNjUsICIKKyAgICAgICAgInN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSBieXRlLXN0cmVhbSwgYWxpZ25tZW50ID0gKHN0cmluZykgeyBuYWwsIGF1IH0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2gyNjVfZGVwYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiSDI2NVwiIikKKyAgICAgICAgLyoqIG9wdGlvbmFsIHBhcmFtZXRlcnMgKiovCisgICAgLyogInByb2ZpbGUtc3BhY2UgPSAoaW50KSBbIDAsIDMgXSwgIiAqLworICAgIC8qICJwcm9maWxlLWlkID0gKGludCkgWyAwLCAzMSBdLCAiICovCisgICAgLyogInRpZXItZmxhZyA9IChpbnQpIFsgMCwgMSBdLCAiICovCisgICAgLyogImxldmVsLWlkID0gKGludCkgWyAwLCAyNTUgXSwgIiAqLworICAgIC8qICJpbnRlcm9wLWNvbnN0cmFpbnRzID0gKHN0cmluZykgQU5ZLCAiICovCisgICAgLyogInByb2ZpbGUtY29tcGF0aWJpbGl0eS1pbmRpY2F0b3IgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAic3Byb3Atc3ViLWxheWVyLWlkID0gKGludCkgWyAwLCA2IF0sICIgKi8KKyAgICAvKiAicmVjdi1zdWItbGF5ZXItaWQgPSAoaW50KSBbIDAsIDYgXSwgIiAqLworICAgIC8qICJtYXgtcmVjdi1sZXZlbC1pZCA9IChpbnQpIFsgMCwgMjU1IF0sICIgKi8KKyAgICAvKiAidHgtbW9kZSA9IChzdHJpbmcpIHtNU1QgLCBTU1R9LCAiICovCisgICAgLyogInNwcm9wLXZwcyA9IChzdHJpbmcpIEFOWSwgIiAqLworICAgIC8qICJzcHJvcC1zcHMgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAic3Byb3AtcHBzID0gKHN0cmluZykgQU5ZLCAiICovCisgICAgLyogInNwcm9wLXNlaSA9IChzdHJpbmcpIEFOWSwgIiAqLworICAgIC8qICJtYXgtbHNyID0gKGludCkgQU5ZLCAiICovLyogTVVTVCBiZSBpbiB0aGUgcmFuZ2Ugb2YgTWF4THVtYVNSIHRvIDE2ICogTWF4THVtYVNSLCBpbmNsdXNpdmUgKi8KKyAgICAvKiAibWF4LWxwcyA9IChpbnQpIEFOWSwgIiAqLy8qIE1VU1QgYmUgaW4gdGhlIHJhbmdlIG9mIE1heEx1bWFQUyB0byAxNiAqIE1heEx1bWFQUywgaW5jbHVzaXZlICovCisgICAgLyogIm1heC1jcGIgPSAoaW50KSBBTlksICIgKi8vKiBNVVNUIGJlIGluIHRoZSByYW5nZSBvZiBNYXhDUEIgdG8gMTYgKiBNYXhDUEIsIGluY2x1c2l2ZSAqLworICAgIC8qICJtYXgtZHBiID0gKGludCkgWzEsIDE2XSwgIiAqLworICAgIC8qICJtYXgtYnIgPSAoaW50KSBBTlksICIgKi8vKiBNVVNUIGJlIGluIHRoZSByYW5nZSBvZiBNYXhCUiB0byAxNiAqIE1heEJSLCBpbmNsdXNpdmUsIGZvciB0aGUgaGlnaGVzdCBsZXZlbCAqLworICAgIC8qICJtYXgtdHIgPSAoaW50KSBBTlksICIgKi8vKiBNVVNUIGJlIGluIHRoZSByYW5nZSBvZiBNYXhUaWxlUm93cyB0byAxNiAqIE1heFRpbGVSb3dzLCBpbmNsdXNpdmUsIGZvciB0aGUgaGlnaGVzdCBsZXZlbCAqLworICAgIC8qICJtYXgtdGMgPSAoaW50KSBBTlksICIgKi8vKiBNVVNUIGJlIGluIHRoZSByYW5nZSBvZiBNYXhUaWxlQ29scyB0byAxNiAqIE1heFRpbGVDb2xzLCBpbmNsdXNpdmUsIGZvciB0aGUgaGlnaGVzdCBsZXZlbCAqLworICAgIC8qICJtYXgtZnBzID0gKGludCkgQU5ZLCAiICovCisgICAgLyogInNwcm9wLW1heC1kb24tZGlmZiA9IChpbnQpIFswLCAzMjc2N10sICIgKi8KKyAgICAvKiAic3Byb3AtZGVwYWNrLWJ1Zi1uYWx1cyA9IChpbnQpIFswLCAzMjc2N10sICIgKi8KKyAgICAvKiAic3Byb3AtZGVwYWNrLWJ1Zi1uYWx1cyA9IChpbnQpIFswLCA0Mjk0OTY3Mjk1XSwgIiAqLworICAgIC8qICJkZXBhY2stYnVmLWNhcCA9IChpbnQpIFsxLCA0Mjk0OTY3Mjk1XSwgIiAqLworICAgIC8qICJzcHJvcC1zZWdtZW50YXRpb24taWQgPSAoaW50KSBbMCwgM10sICIgKi8KKyAgICAvKiAic3Byb3Atc3BhdGlhbC1zZWdtZW50YXRpb24taWRjID0gKHN0cmluZykgQU5ZLCAiICovCisgICAgLyogImRlYy1wYXJhbGxlbC1jYXAgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICApOworCisjZGVmaW5lIGdzdF9ydHBfaDI2NV9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBIMjY1RGVwYXksIGdzdF9ydHBfaDI2NV9kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2gyNjVfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9oMjY1X2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfaDI2NV9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9oMjY1X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBmaWx0ZXIsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaDI2NV9kZXBheV9oYW5kbGVfZXZlbnQgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheSwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NV9kZXBheV9jbGFzc19pbml0IChHc3RSdHBIMjY1RGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX2gyNjVfZGVwYXlfZmluYWxpemU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9oMjY1X2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaDI2NV9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBIMjY1IGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBIMjY1IHZpZGVvIGZyb20gUlRQIHBhY2tldHMgKFJGQyA3Nzk4KSIsCisgICAgICAiSnVyZ2VuIFNsb3dhY2sgPGp1cmdlbnNsb3dhY2tAZ21haWwuY29tPiIpOworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX2gyNjVfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfaDI2NV9kZXBheV9wcm9jZXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfaDI2NV9kZXBheV9zZXRjYXBzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5oYW5kbGVfZXZlbnQgPSBnc3RfcnRwX2gyNjVfZGVwYXlfaGFuZGxlX2V2ZW50OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY1X2RlcGF5X2luaXQgKEdzdFJ0cEgyNjVEZXBheSAqIHJ0cGgyNjVkZXBheSkKK3sKKyAgcnRwaDI2NWRlcGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICBydHBoMjY1ZGVwYXktPnBpY3R1cmVfYWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKyAgcnRwaDI2NWRlcGF5LT5vdXRwdXRfZm9ybWF0ID0gREVGQVVMVF9TVFJFQU1fRk9STUFUOworICBydHBoMjY1ZGVwYXktPmJ5dGVfc3RyZWFtID0KKyAgICAgIChERUZBVUxUX1NUUkVBTV9GT1JNQVQgPT0gR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9CWVRFU1RSRUFNKTsKKyAgcnRwaDI2NWRlcGF5LT5zdHJlYW1fZm9ybWF0ID0gTlVMTDsKKyAgcnRwaDI2NWRlcGF5LT5tZXJnZSA9IERFRkFVTFRfQUNDRVNTX1VOSVQ7CisgIHJ0cGgyNjVkZXBheS0+dnBzID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgIHJ0cGgyNjVkZXBheS0+c3BzID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgIHJ0cGgyNjVkZXBheS0+cHBzID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjVfZGVwYXlfcmVzZXQgKEdzdFJ0cEgyNjVEZXBheSAqIHJ0cGgyNjVkZXBheSwgZ2Jvb2xlYW4gaGFyZCkKK3sKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGgyNjVkZXBheS0+YWRhcHRlcik7CisgIHJ0cGgyNjVkZXBheS0+d2FpdF9zdGFydCA9IFRSVUU7CisgIGdzdF9hZGFwdGVyX2NsZWFyIChydHBoMjY1ZGVwYXktPnBpY3R1cmVfYWRhcHRlcik7CisgIHJ0cGgyNjVkZXBheS0+cGljdHVyZV9zdGFydCA9IEZBTFNFOworICBydHBoMjY1ZGVwYXktPmxhc3Rfa2V5ZnJhbWUgPSBGQUxTRTsKKyAgcnRwaDI2NWRlcGF5LT5sYXN0X3RzID0gMDsKKyAgcnRwaDI2NWRlcGF5LT5jdXJyZW50X2Z1X3R5cGUgPSAwOworICBydHBoMjY1ZGVwYXktPm5ld19jb2RlY19kYXRhID0gRkFMU0U7CisgIGdfcHRyX2FycmF5X3NldF9zaXplIChydHBoMjY1ZGVwYXktPnZwcywgMCk7CisgIGdfcHRyX2FycmF5X3NldF9zaXplIChydHBoMjY1ZGVwYXktPnNwcywgMCk7CisgIGdfcHRyX2FycmF5X3NldF9zaXplIChydHBoMjY1ZGVwYXktPnBwcywgMCk7CisKKyAgaWYgKGhhcmQpIHsKKyAgICBpZiAocnRwaDI2NWRlcGF5LT5hbGxvY2F0b3IgIT0gTlVMTCkgeworICAgICAgZ3N0X29iamVjdF91bnJlZiAocnRwaDI2NWRlcGF5LT5hbGxvY2F0b3IpOworICAgICAgcnRwaDI2NWRlcGF5LT5hbGxvY2F0b3IgPSBOVUxMOworICAgIH0KKyAgICBnc3RfYWxsb2NhdGlvbl9wYXJhbXNfaW5pdCAoJnJ0cGgyNjVkZXBheS0+cGFyYW1zKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY1X2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSdHBIMjY1RGVwYXkgKnJ0cGgyNjVkZXBheTsKKworICBydHBoMjY1ZGVwYXkgPSBHU1RfUlRQX0gyNjVfREVQQVkgKG9iamVjdCk7CisKKyAgaWYgKHJ0cGgyNjVkZXBheS0+Y29kZWNfZGF0YSkKKyAgICBnc3RfYnVmZmVyX3VucmVmIChydHBoMjY1ZGVwYXktPmNvZGVjX2RhdGEpOworCisgIGdfb2JqZWN0X3VucmVmIChydHBoMjY1ZGVwYXktPmFkYXB0ZXIpOworICBnX29iamVjdF91bnJlZiAocnRwaDI2NWRlcGF5LT5waWN0dXJlX2FkYXB0ZXIpOworCisgIGdfcHRyX2FycmF5X2ZyZWUgKHJ0cGgyNjVkZXBheS0+dnBzLCBUUlVFKTsKKyAgZ19wdHJfYXJyYXlfZnJlZSAocnRwaDI2NWRlcGF5LT5zcHMsIFRSVUUpOworICBnX3B0cl9hcnJheV9mcmVlIChydHBoMjY1ZGVwYXktPnBwcywgVFJVRSk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGdjaGFyICoKK3N0cmVhbV9mb3JtYXRfZ2V0X25pY2sgKEdzdEgyNjVTdHJlYW1Gb3JtYXQgZm10KQoreworICBzd2l0Y2ggKGZtdCkgeworICAgIGNhc2UgR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9CWVRFU1RSRUFNOgorICAgICAgcmV0dXJuICJieXRlLXN0cmVhbSI7CisgICAgY2FzZSBHU1RfSDI2NV9TVFJFQU1fRk9STUFUX0hWQzE6CisgICAgICByZXR1cm4gImh2YzEiOworICAgIGNhc2UgR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9IRVYxOgorICAgICAgcmV0dXJuICJoZXYxIjsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuICJ1bmtub3duIjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NV9kZXBheV9uZWdvdGlhdGUgKEdzdFJ0cEgyNjVEZXBheSAqIHJ0cGgyNjVkZXBheSkKK3sKKyAgR3N0SDI2NVN0cmVhbUZvcm1hdCBzdHJlYW1fZm9ybWF0ID0gR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9VTktOT1dOOworICBHc3RDYXBzICpjYXBzOworICBnaW50IG1lcmdlID0gLTE7CisKKyAgY2FwcyA9CisgICAgICBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChydHBoMjY1ZGVwYXkpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1ZGVwYXksICJhbGxvd2VkIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICBpZiAoY2FwcykgeworICAgIGlmIChnc3RfY2Fwc19nZXRfc2l6ZSAoY2FwcykgPiAwKSB7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgICAgIGNvbnN0IGdjaGFyICpzdHIgPSBOVUxMOworCisgICAgICBpZiAoKHN0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgInN0cmVhbS1mb3JtYXQiKSkpIHsKKyAgICAgICAgcnRwaDI2NWRlcGF5LT5zdHJlYW1fZm9ybWF0ID0gZ19pbnRlcm5fc3RyaW5nIChzdHIpOworCisgICAgICAgIGlmIChzdHJjbXAgKHN0ciwgImhldjEiKSA9PSAwKSB7CisgICAgICAgICAgc3RyZWFtX2Zvcm1hdCA9IEdTVF9IMjY1X1NUUkVBTV9GT1JNQVRfSEVWMTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAgKHN0ciwgImh2YzEiKSA9PSAwKSB7CisgICAgICAgICAgc3RyZWFtX2Zvcm1hdCA9IEdTVF9IMjY1X1NUUkVBTV9GT1JNQVRfSFZDMTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAgKHN0ciwgImJ5dGUtc3RyZWFtIikgPT0gMCkgeworICAgICAgICAgIHN0cmVhbV9mb3JtYXQgPSBHU1RfSDI2NV9TVFJFQU1fRk9STUFUX0JZVEVTVFJFQU07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAidW5rbm93biBzdHJlYW0tZm9ybWF0OiAlcyIsIHN0cik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKChzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJhbGlnbm1lbnQiKSkpIHsKKyAgICAgICAgaWYgKHN0cmNtcCAoc3RyLCAiYXUiKSA9PSAwKSB7CisgICAgICAgICAgbWVyZ2UgPSBUUlVFOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCAoc3RyLCAibmFsIikgPT0gMCkgeworICAgICAgICAgIG1lcmdlID0gRkFMU0U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAidW5rbm93biBhbGlnbm1lbnQ6ICVzIiwgc3RyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIH0KKworICBpZiAoc3RyZWFtX2Zvcm1hdCAhPSBHU1RfSDI2NV9TVFJFQU1fRk9STUFUX1VOS05PV04pIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1ZGVwYXksICJkb3duc3RyZWFtIHdhbnRzIHN0cmVhbS1mb3JtYXQgJXMiLAorICAgICAgICBzdHJlYW1fZm9ybWF0X2dldF9uaWNrIChzdHJlYW1fZm9ybWF0KSk7CisgICAgcnRwaDI2NWRlcGF5LT5vdXRwdXRfZm9ybWF0ID0gc3RyZWFtX2Zvcm1hdDsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1ZGVwYXksICJkZWZhdWx0aW5nIHRvIG91dHB1dCBzdHJlYW0tZm9ybWF0ICVzIiwKKyAgICAgICAgc3RyZWFtX2Zvcm1hdF9nZXRfbmljayAoREVGQVVMVF9TVFJFQU1fRk9STUFUKSk7CisgICAgcnRwaDI2NWRlcGF5LT5zdHJlYW1fZm9ybWF0ID0KKyAgICAgICAgc3RyZWFtX2Zvcm1hdF9nZXRfbmljayAoREVGQVVMVF9TVFJFQU1fRk9STUFUKTsKKyAgICBydHBoMjY1ZGVwYXktPm91dHB1dF9mb3JtYXQgPSBERUZBVUxUX1NUUkVBTV9GT1JNQVQ7CisgIH0KKyAgcnRwaDI2NWRlcGF5LT5ieXRlX3N0cmVhbSA9CisgICAgICAocnRwaDI2NWRlcGF5LT5vdXRwdXRfZm9ybWF0ID09IEdTVF9IMjY1X1NUUkVBTV9GT1JNQVRfQllURVNUUkVBTSk7CisKKyAgaWYgKG1lcmdlICE9IC0xKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAiZG93bnN0cmVhbSByZXF1aXJlcyBtZXJnZSAlZCIsIG1lcmdlKTsKKyAgICBydHBoMjY1ZGVwYXktPm1lcmdlID0gbWVyZ2U7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAiZGVmYXVsdGluZyB0byBtZXJnZSAlZCIsCisgICAgICAgIERFRkFVTFRfQUNDRVNTX1VOSVQpOworICAgIHJ0cGgyNjVkZXBheS0+bWVyZ2UgPSBERUZBVUxUX0FDQ0VTU19VTklUOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcGFyc2Vfc3BzIChHc3RNYXBJbmZvICogbWFwLCBndWludDMyICogc3BzX2lkKQoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUbyBwYXJzZSBzZXFfcGFyYW1ldGVyX3NldF9pZCAqLworICBHc3RCaXRSZWFkZXIgYnIgPSBHU1RfQklUX1JFQURFUl9JTklUIChtYXAtPmRhdGEgKyAxNSwKKyAgICAgIG1hcC0+c2l6ZSAtIDE1KTsKKworICBHU1RfTUVNRFVNUCAoIlNQUyIsIG1hcC0+ZGF0YSwgbWFwLT5zaXplKTsKKworICBpZiAobWFwLT5zaXplIDwgMTYpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9yZWFkX2dvbG9tYiAoJmJyLCBzcHNfaWQpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitwYXJzZV9wcHMgKEdzdE1hcEluZm8gKiBtYXAsIGd1aW50MzIgKiBzcHNfaWQsIGd1aW50MzIgKiBwcHNfaWQpCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRvIHBhcnNlIHBpY3R1cmVfcGFyYW1ldGVyX3NldF9pZCAqLworICBHc3RCaXRSZWFkZXIgYnIgPSBHU1RfQklUX1JFQURFUl9JTklUIChtYXAtPmRhdGEgKyAyLAorICAgICAgbWFwLT5zaXplIC0gMik7CisKKyAgR1NUX01FTURVTVAgKCJQUFMiLCBtYXAtPmRhdGEsIG1hcC0+c2l6ZSk7CisKKyAgaWYgKG1hcC0+c2l6ZSA8IDMpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9yZWFkX2dvbG9tYiAoJmJyLCBwcHNfaWQpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKCFnc3RfcnRwX3JlYWRfZ29sb21iICgmYnIsIHNwc19pZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2NV9kZXBheV9zZXRfb3V0cHV0X2NhcHMgKEdzdFJ0cEgyNjVEZXBheSAqIHJ0cGgyNjVkZXBheSwKKyAgICBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0QWxsb2NhdGlvblBhcmFtcyBwYXJhbXM7CisgIEdzdEFsbG9jYXRvciAqYWxsb2NhdG9yID0gTlVMTDsKKyAgR3N0UGFkICpzcmNwYWQ7CisgIGdib29sZWFuIHJlczsKKworICBnc3RfYWxsb2NhdGlvbl9wYXJhbXNfaW5pdCAoJnBhcmFtcyk7CisKKyAgc3JjcGFkID0gR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKHJ0cGgyNjVkZXBheSk7CisKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoc3JjcGFkLCBjYXBzKTsKKworICBpZiAocmVzKSB7CisgICAgR3N0UXVlcnkgKnF1ZXJ5OworCisgICAgcXVlcnkgPSBnc3RfcXVlcnlfbmV3X2FsbG9jYXRpb24gKGNhcHMsIFRSVUUpOworICAgIGlmICghZ3N0X3BhZF9wZWVyX3F1ZXJ5IChzcmNwYWQsIHF1ZXJ5KSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAiZG93bnN0cmVhbSBBTExPQ0FUSU9OIHF1ZXJ5IGZhaWxlZCIpOworICAgIH0KKworICAgIGlmIChnc3RfcXVlcnlfZ2V0X25fYWxsb2NhdGlvbl9wYXJhbXMgKHF1ZXJ5KSA+IDApIHsKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9udGhfYWxsb2NhdGlvbl9wYXJhbSAocXVlcnksIDAsICZhbGxvY2F0b3IsICZwYXJhbXMpOworICAgIH0KKworICAgIGdzdF9xdWVyeV91bnJlZiAocXVlcnkpOworICB9CisKKyAgaWYgKHJ0cGgyNjVkZXBheS0+YWxsb2NhdG9yKQorICAgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cGgyNjVkZXBheS0+YWxsb2NhdG9yKTsKKworICBydHBoMjY1ZGVwYXktPmFsbG9jYXRvciA9IGFsbG9jYXRvcjsKKyAgcnRwaDI2NWRlcGF5LT5wYXJhbXMgPSBwYXJhbXM7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2gyNjVfc2V0X3NyY19jYXBzIChHc3RSdHBIMjY1RGVwYXkgKiBydHBoMjY1ZGVwYXkpCit7CisgIGdib29sZWFuIHJlcywgdXBkYXRlX2NhcHM7CisgIEdzdENhcHMgKm9sZF9jYXBzOworICBHc3RDYXBzICpzcmNjYXBzOworICBHc3RQYWQgKnNyY3BhZDsKKworICBpZiAoIXJ0cGgyNjVkZXBheS0+Ynl0ZV9zdHJlYW0gJiYKKyAgICAgICghcnRwaDI2NWRlcGF5LT5uZXdfY29kZWNfZGF0YSB8fAorICAgICAgICAgIHJ0cGgyNjVkZXBheS0+dnBzLT5sZW4gPT0gMCB8fCBydHBoMjY1ZGVwYXktPnNwcy0+bGVuID09IDAKKyAgICAgICAgICB8fCBydHBoMjY1ZGVwYXktPnBwcy0+bGVuID09IDApKQorICAgIHJldHVybiBUUlVFOworCisgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1oMjY1IiwKKyAgICAgICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgcnRwaDI2NWRlcGF5LT5zdHJlYW1fZm9ybWF0LAorICAgICAgImFsaWdubWVudCIsIEdfVFlQRV9TVFJJTkcsIHJ0cGgyNjVkZXBheS0+bWVyZ2UgPyAiYXUiIDogIm5hbCIsIE5VTEwpOworCisgIGlmICghcnRwaDI2NWRlcGF5LT5ieXRlX3N0cmVhbSkgeworICAgIEdzdEJ1ZmZlciAqY29kZWNfZGF0YTsKKyAgICBnaW50IGkgPSAwOworICAgIGdpbnQgbGVuOworICAgIGd1aW50IG51bV92cHMgPSBydHBoMjY1ZGVwYXktPnZwcy0+bGVuOworICAgIGd1aW50IG51bV9zcHMgPSBydHBoMjY1ZGVwYXktPnNwcy0+bGVuOworICAgIGd1aW50IG51bV9wcHMgPSBydHBoMjY1ZGVwYXktPnBwcy0+bGVuOworICAgIEdzdE1hcEluZm8gbWFwLCBuYWxtYXA7CisgICAgZ3VpbnQ4ICpkYXRhOworICAgIGd1aW50OCBudW1fYXJyYXlzID0gMDsKKyAgICBndWludCBuZXdfc2l6ZTsKKyAgICBHc3RCaXRSZWFkZXIgYnI7CisgICAgZ3VpbnQzMiB0bXA7CisgICAgZ3VpbnQ4IHRtcDggPSAwOworICAgIGd1aW50MzIgbWF4X3N1Yl9sYXllcnNfbWludXMxLCB0ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWcsIGNocm9tYV9mb3JtYXRfaWRjLAorICAgICAgICBiaXRfZGVwdGhfbHVtYV9taW51czgsIGJpdF9kZXB0aF9jaHJvbWFfbWludXM4LAorICAgICAgICBtaW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjOworCisgICAgLyogRml4bWU6IEN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgbm90IGVtYmVkZGluZyBTRUkgaW4gY29kZWNfZGF0YSAqLworCisgICAgaWYgKG51bV9zcHMgPT0gMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8qIHN0YXJ0IHdpdGggMjMgYnl0ZXMgaGVhZGVyICovCisgICAgbGVuID0gMjM7CisKKyAgICBudW1fYXJyYXlzID0gKG51bV92cHMgPiAwKSArIChudW1fc3BzID4gMCkgKyAobnVtX3BwcyA+IDApOworICAgIGxlbiArPSAzICogbnVtX2FycmF5czsKKworICAgIC8qIGFkZCBzaXplIG9mIHZwcywgc3BzICYgcHBzICovCisgICAgZm9yIChpID0gMDsgaSA8IG51bV92cHM7IGkrKykKKyAgICAgIGxlbiArPSAyICsgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjVkZXBheS0+dnBzLCBpKSk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9zcHM7IGkrKykKKyAgICAgIGxlbiArPSAyICsgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjVkZXBheS0+c3BzLCBpKSk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9wcHM7IGkrKykKKyAgICAgIGxlbiArPSAyICsgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjVkZXBheS0+cHBzLCBpKSk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1ZGVwYXksCisgICAgICAgICJjb25zdHJ1Y3RpbmcgY29kZWNfZGF0YTogbnVtX3ZwcyA9JWQgbnVtX3Nwcz0lZCwgbnVtX3Bwcz0lZCIsIG51bV92cHMsCisgICAgICAgIG51bV9zcHMsIG51bV9wcHMpOworCisgICAgY29kZWNfZGF0YSA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobGVuKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoY29kZWNfZGF0YSwgJm1hcCwgR1NUX01BUF9SRUFEV1JJVEUpOworICAgIGRhdGEgPSBtYXAuZGF0YTsKKworICAgIG1lbXNldCAoZGF0YSwgMCwgbWFwLnNpemUpOworCisgICAgLyogUGFyc2luZyBzcHMgdG8gZ2V0IHRoZSBpbmZvIHJlcXVpcmVkIGZ1cnRoZXIgb24gKi8KKworICAgIGdzdF9idWZmZXJfbWFwIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NWRlcGF5LT5zcHMsIDApLCAmbmFsbWFwLAorICAgICAgICBHU1RfTUFQX1JFQUQpOworCisgICAgbWF4X3N1Yl9sYXllcnNfbWludXMxID0gKChuYWxtYXAuZGF0YVsyXSkgPj4gMSkgJiAweDA3OworICAgIHRlbXBvcmFsX2lkX25lc3RpbmdfZmxhZyA9IG5hbG1hcC5kYXRhWzJdICYgMHgwMTsKKworICAgIGdzdF9iaXRfcmVhZGVyX2luaXQgKCZiciwgbmFsbWFwLmRhdGEgKyAxNSwgbmFsbWFwLnNpemUgLSAxNSk7CisKKyAgICBnc3RfcnRwX3JlYWRfZ29sb21iICgmYnIsICZ0bXApOyAgICAvKiBzcHNfc2VxX3BhcmFtZXRlcl9zZXRfaWQgKi8KKyAgICBnc3RfcnRwX3JlYWRfZ29sb21iICgmYnIsICZjaHJvbWFfZm9ybWF0X2lkYyk7ICAgICAgLyogY2hyb21hX2Zvcm1hdF9pZGMgKi8KKworICAgIGlmIChjaHJvbWFfZm9ybWF0X2lkYyA9PSAzKQorCisgICAgICBnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoJmJyLCAmdG1wOCwgMSk7ICAgIC8qIHNlcGFyYXRlX2NvbG91cl9wbGFuZV9mbGFnICovCisKKyAgICBnc3RfcnRwX3JlYWRfZ29sb21iICgmYnIsICZ0bXApOyAgICAvKiBwaWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzICovCisgICAgZ3N0X3J0cF9yZWFkX2dvbG9tYiAoJmJyLCAmdG1wKTsgICAgLyogcGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXMgKi8KKworICAgIGdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmYnIsICZ0bXA4LCAxKTsgICAgICAvKiBjb25mb3JtYW5jZV93aW5kb3dfZmxhZyAqLworICAgIGlmICh0bXA4KSB7CisgICAgICBnc3RfcnRwX3JlYWRfZ29sb21iICgmYnIsICZ0bXApOyAgLyogY29uZl93aW5fbGVmdF9vZmZzZXQgKi8KKyAgICAgIGdzdF9ydHBfcmVhZF9nb2xvbWIgKCZiciwgJnRtcCk7ICAvKiBjb25mX3dpbl9yaWdodF9vZmZzZXQgKi8KKyAgICAgIGdzdF9ydHBfcmVhZF9nb2xvbWIgKCZiciwgJnRtcCk7ICAvKiBjb25mX3dpbl90b3Bfb2Zmc2V0ICovCisgICAgICBnc3RfcnRwX3JlYWRfZ29sb21iICgmYnIsICZ0bXApOyAgLyogY29uZl93aW5fYm90dG9tX29mZnNldCAqLworICAgIH0KKworICAgIGdzdF9ydHBfcmVhZF9nb2xvbWIgKCZiciwgJmJpdF9kZXB0aF9sdW1hX21pbnVzOCk7ICAvKiBiaXRfZGVwdGhfbHVtYV9taW51czggKi8KKyAgICBnc3RfcnRwX3JlYWRfZ29sb21iICgmYnIsICZiaXRfZGVwdGhfY2hyb21hX21pbnVzOCk7ICAgICAgICAvKiBiaXRfZGVwdGhfY2hyb21hX21pbnVzOCAqLworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LAorICAgICAgICAiSWdub3JpbmcgbWluX3NwYXRpYWxfc2VnbWVudGF0aW9uIGZvciBub3cgKGFzc3VtaW5nIHplcm8pIik7CisKKyAgICBtaW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjID0gMDsgICAvKiBOT1RFIC0gd2UgaWdub3JlIHRoaXMgZm9yIG5vdywgYnV0IGluIGEgcGVyZmVjdCB3b3JsZCwgd2Ugc2hvdWxkIGNvbnRpbnVlIHBhcnNpbmcgdG8gb2J0YWluIHRoZSByZWFsIHZhbHVlICovCisKKyAgICBnc3RfYnVmZmVyX3VubWFwIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NWRlcGF5LT5zcHMsIDApLCAmbmFsbWFwKTsKKworICAgIC8qIEhFVkNEZWNvZGVyQ29uZmlndXJhdGlvblZlcnNpb24gPSAxICovCisgICAgZGF0YVswXSA9IDE7CisKKyAgICAvKiBDb3B5IGZyb20gcHJvZmlsZV90aWVyX2xldmVsIChSZWMuIElUVS1UIEguMjY1ICgwNC8yMDEzKSBzZWN0aW9uIDcuMy4zCisgICAgICoKKyAgICAgKiBwcm9maWxlX3NwYWNlIHwgdGllcl9mbGF0IHwgcHJvZmlsZV9pZGMgfAorICAgICAqIHByb2ZpbGVfY29tcGF0aWJpbGl0eV9mbGFncyB8IGNvbnN0cmFpbnRfaW5kaWNhdG9yX2ZsYWdzIHwKKyAgICAgKiBsZXZlbF9pZGMgfCBwcm9ncmVzc2l2ZV9zb3VyY2VfZmxhZyB8IGludGVybGFjZWRfc291cmNlX2ZsYWcKKyAgICAgKiBub25fcGFja2VkX2NvbnN0cmFpbnRfZmxhZyB8IGZyYW1lX29ubHlfY29uc3RyYWludF9mbGFnCisgICAgICogcmVzZXJ2ZWRfemVyb180NGJpdHMgfCBsZXZlbF9pZGMgKi8KKyAgICBnc3RfYnVmZmVyX21hcCAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjVkZXBheS0+c3BzLCAwKSwgJm5hbG1hcCwKKyAgICAgICAgR1NUX01BUF9SRUFEKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKKyAgICAgIGRhdGFbaSArIDFdID0gbmFsbWFwLmRhdGFbaV07CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjVkZXBheS0+c3BzLCAwKSwgJm5hbG1hcCk7CisKKyAgICAvKiBtaW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjICovCisgICAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSArIDEzLCBtaW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjKTsKKyAgICBkYXRhWzEzXSB8PSAweGYwOworICAgIGRhdGFbMTVdID0gMHhmYzsgICAgICAgICAgICAvKiBrZWVwaW5nIHBhcnJhbGxlbGlzbVR5cGUgYXMgemVybyAodW5rbm93bikgKi8KKyAgICBkYXRhWzE2XSA9IDB4ZmMgfCBjaHJvbWFfZm9ybWF0X2lkYzsKKyAgICBkYXRhWzE3XSA9IDB4ZjggfCBiaXRfZGVwdGhfbHVtYV9taW51czg7CisgICAgZGF0YVsxOF0gPSAweGY4IHwgYml0X2RlcHRoX2Nocm9tYV9taW51czg7CisgICAgZGF0YVsxOV0gPSAweDAwOyAgICAgICAgICAgIC8qIGtlZXAgYXZnRnJhbWVSYXRlIGFzIHVuc3BlY2lmaWVkICovCisgICAgZGF0YVsyMF0gPSAweDAwOyAgICAgICAgICAgIC8qIGtlZXAgYXZnRnJhbWVSYXRlIGFzIHVuc3BlY2lmaWVkICovCisgICAgLyogY29uc3RGcmFtZVJhdGUoMiBiaXRzKTogMCwgc3RyZWFtIG1heSBvciBtYXkgbm90IGJlIG9mIGNvbnN0YW50IGZyYW1lcmF0ZQorICAgICAqIG51bVRlbXBvcmFsTGF5ZXJzICgzIGJpdHMpOiBudW1iZXIgb2YgdGVtcG9yYWwgbGF5ZXJzLCB2YWx1ZSBmcm9tIFNQUworICAgICAqIFRlbXBvcmFsSWROZXN0ZWQgKDEgYml0KTogc3BzX3RlbXBvcmFsX2lkX25lc3RpbmdfZmxhZyBmcm9tIFNQUworICAgICAqIGxlbmd0aFNpemVNaW51c09uZSAoMiBiaXRzKTogcGx1cyAxIGluZGljYXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBOQUxVbml0TGVuZ3RoICovCisgICAgLyogd2UgYWx3YXlzIG91dHB1dCBOQUxzIHdpdGggNC1ieXRlIG5hbCB1bml0IGxlbmd0aCBtYXJrZXJzIChvciBzeW5jIGNvZGUpICovCisgICAgZGF0YVsyMV0gPSBydHBoMjY1ZGVwYXktPmJ5dGVfc3RyZWFtID8gMHgwMCA6IDB4MDM7CisgICAgZGF0YVsyMV0gfD0gKChtYXhfc3ViX2xheWVyc19taW51czEgKyAxKSA8PCAzKTsKKyAgICBkYXRhWzIxXSB8PSAodGVtcG9yYWxfaWRfbmVzdGluZ19mbGFnIDw8IDIpOworICAgIEdTVF9XUklURV9VSU5UOCAoZGF0YSArIDIyLCBudW1fYXJyYXlzKTsgICAgLyogbnVtT2ZBcnJheXMgKi8KKworICAgIGRhdGEgKz0gMjM7CisKKyAgICAvKiBjb3B5IGFsbCBWUFMgKi8KKyAgICBpZiAobnVtX3ZwcyA+IDApIHsKKyAgICAgIC8qIGFycmF5X2NvbXBsZXRlbmVzcyB8IHJlc2VydmVkX3plcm8gYml0IHwgbmFsX3VuaXRfdHlwZSAqLworICAgICAgZGF0YVswXSA9IDB4MDAgfCAweDIwOworICAgICAgZGF0YSsrOworCisgICAgICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhLCBudW1fdnBzKTsKKyAgICAgIGRhdGEgKz0gMjsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG51bV92cHM7IGkrKykgeworICAgICAgICBnc2l6ZSBuYWxfc2l6ZSA9CisgICAgICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NWRlcGF5LT52cHMsIGkpKTsKKyAgICAgICAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSwgbmFsX3NpemUpOworICAgICAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKGdfcHRyX2FycmF5X2luZGV4IChydHBoMjY1ZGVwYXktPnZwcywgaSksIDAsCisgICAgICAgICAgICBkYXRhICsgMiwgbmFsX3NpemUpOworICAgICAgICBkYXRhICs9IDIgKyBuYWxfc2l6ZTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAiQ29waWVkIFZQUyAlZCBvZiBsZW5ndGggJXUiLCBpLAorICAgICAgICAgICAgKGd1aW50KSBuYWxfc2l6ZSk7CisgICAgICB9CisgICAgfQorCisgICAgLyogY29weSBhbGwgU1BTICovCisgICAgaWYgKG51bV9zcHMgPiAwKSB7CisgICAgICAvKiBhcnJheV9jb21wbGV0ZW5lc3MgfCByZXNlcnZlZF96ZXJvIGJpdCB8IG5hbF91bml0X3R5cGUgKi8KKyAgICAgIGRhdGFbMF0gPSAweDAwIHwgMHgyMTsKKyAgICAgIGRhdGErKzsKKworICAgICAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSwgbnVtX3Nwcyk7CisgICAgICBkYXRhICs9IDI7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3BzOyBpKyspIHsKKyAgICAgICAgZ3NpemUgbmFsX3NpemUgPQorICAgICAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjVkZXBheS0+c3BzLCBpKSk7CisgICAgICAgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEsIG5hbF9zaXplKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NWRlcGF5LT5zcHMsIGkpLCAwLAorICAgICAgICAgICAgZGF0YSArIDIsIG5hbF9zaXplKTsKKyAgICAgICAgZGF0YSArPSAyICsgbmFsX3NpemU7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVkZXBheSwgIkNvcGllZCBTUFMgJWQgb2YgbGVuZ3RoICV1IiwgaSwKKyAgICAgICAgICAgIChndWludCkgbmFsX3NpemUpOworICAgICAgfQorICAgIH0KKworICAgIC8qIGNvcHkgYWxsIFBQUyAqLworICAgIGlmIChudW1fcHBzID4gMCkgeworICAgICAgLyogYXJyYXlfY29tcGxldGVuZXNzIHwgcmVzZXJ2ZWRfemVybyBiaXQgfCBuYWxfdW5pdF90eXBlICovCisgICAgICBkYXRhWzBdID0gMHgwMCB8IDB4MjI7CisgICAgICBkYXRhKys7CisKKyAgICAgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRhdGEsIG51bV9wcHMpOworICAgICAgZGF0YSArPSAyOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BwczsgaSsrKSB7CisgICAgICAgIGdzaXplIG5hbF9zaXplID0KKyAgICAgICAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGdfcHRyX2FycmF5X2luZGV4IChydHBoMjY1ZGVwYXktPnBwcywgaSkpOworICAgICAgICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhLCBuYWxfc2l6ZSk7CisgICAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjVkZXBheS0+cHBzLCBpKSwgMCwKKyAgICAgICAgICAgIGRhdGEgKyAyLCBuYWxfc2l6ZSk7CisgICAgICAgIGRhdGEgKz0gMiArIG5hbF9zaXplOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1ZGVwYXksICJDb3BpZWQgUFBTICVkIG9mIGxlbmd0aCAldSIsIGksCisgICAgICAgICAgICAoZ3VpbnQpIG5hbF9zaXplKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBuZXdfc2l6ZSA9IGRhdGEgLSBtYXAuZGF0YTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChjb2RlY19kYXRhLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3NldF9zaXplIChjb2RlY19kYXRhLCBuZXdfc2l6ZSk7CisKKyAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChzcmNjYXBzLAorICAgICAgICAiY29kZWNfZGF0YSIsIEdTVF9UWVBFX0JVRkZFUiwgY29kZWNfZGF0YSwgTlVMTCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoY29kZWNfZGF0YSk7CisgIH0KKworICBzcmNwYWQgPSBHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAocnRwaDI2NWRlcGF5KTsKKworICBvbGRfY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoc3JjcGFkKTsKKyAgaWYgKG9sZF9jYXBzICE9IE5VTEwpIHsKKworICAgIC8qIE9ubHkgdXBkYXRlIHRoZSBjYXBzIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4gRm9yCisgICAgICogQVZDIHdlIGRvbid0IHVwZGF0ZSBjYXBzIGlmIG9ubHkgdGhlIGNvZGVjX2RhdGEKKyAgICAgKiBjaGFuZ2VzLiBUaGlzIGlzIHRoZSBzYW1lIGJlaGF2aW91ciBhcyBpbiBoMjY0cGFyc2UKKyAgICAgKiBhbmQgZ3N0cnRwaDI2NGRlcGF5CisgICAgICovCisgICAgaWYgKHJ0cGgyNjVkZXBheS0+Ynl0ZV9zdHJlYW0pIHsKKyAgICAgIHVwZGF0ZV9jYXBzID0gIWdzdF9jYXBzX2lzX2VxdWFsIChzcmNjYXBzLCBvbGRfY2Fwcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdzdENhcHMgKnRtcF9jYXBzID0gZ3N0X2NhcHNfY29weSAoc3JjY2Fwcyk7CisgICAgICBHc3RTdHJ1Y3R1cmUgKm9sZF9zLCAqdG1wX3M7CisKKyAgICAgIG9sZF9zID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAob2xkX2NhcHMsIDApOworICAgICAgdG1wX3MgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlICh0bXBfY2FwcywgMCk7CisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKG9sZF9zLCAiY29kZWNfZGF0YSIpKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAodG1wX3MsICJjb2RlY19kYXRhIiwKKyAgICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChvbGRfcywgImNvZGVjX2RhdGEiKSk7CisKKyAgICAgIHVwZGF0ZV9jYXBzID0gIWdzdF9jYXBzX2lzX2VxdWFsIChvbGRfY2FwcywgdG1wX2NhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcF9jYXBzKTsKKyAgICB9CisgICAgZ3N0X2NhcHNfdW5yZWYgKG9sZF9jYXBzKTsKKyAgfSBlbHNlIHsKKyAgICB1cGRhdGVfY2FwcyA9IFRSVUU7CisgIH0KKworICBpZiAodXBkYXRlX2NhcHMpIHsKKyAgICByZXMgPSBnc3RfcnRwX2gyNjVfZGVwYXlfc2V0X291dHB1dF9jYXBzIChydHBoMjY1ZGVwYXksIHNyY2NhcHMpOworICB9IGVsc2UgeworICAgIHJlcyA9IFRSVUU7CisgIH0KKworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgLyogSW5zZXJ0IFNQUyBhbmQgUFBTIGludG8gdGhlIHN0cmVhbSBvbiBuZXh0IG9wcG9ydHVuaXR5ICovCisgIGlmIChydHBoMjY1ZGVwYXktPm91dHB1dF9mb3JtYXQgIT0gR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9IVkMxCisgICAgICAmJiAocnRwaDI2NWRlcGF5LT5zcHMtPmxlbiA+IDAgfHwgcnRwaDI2NWRlcGF5LT5wcHMtPmxlbiA+IDApKSB7CisgICAgZ2ludCBpOworICAgIEdzdEJ1ZmZlciAqY29kZWNfZGF0YTsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBndWludDggKmRhdGE7CisgICAgZ3VpbnQgbGVuID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBydHBoMjY1ZGVwYXktPnNwcy0+bGVuOyBpKyspIHsKKyAgICAgIGxlbiArPSA0ICsgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZ19wdHJfYXJyYXlfaW5kZXggKHJ0cGgyNjVkZXBheS0+c3BzLCBpKSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHJ0cGgyNjVkZXBheS0+cHBzLT5sZW47IGkrKykgeworICAgICAgbGVuICs9IDQgKyBnc3RfYnVmZmVyX2dldF9zaXplIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NWRlcGF5LT5wcHMsIGkpKTsKKyAgICB9CisKKyAgICBjb2RlY19kYXRhID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChsZW4pOworICAgIGdzdF9idWZmZXJfbWFwIChjb2RlY19kYXRhLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBkYXRhID0gbWFwLmRhdGE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcnRwaDI2NWRlcGF5LT5zcHMtPmxlbjsgaSsrKSB7CisgICAgICBHc3RCdWZmZXIgKnNwc19idWYgPSBnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NWRlcGF5LT5zcHMsIGkpOworICAgICAgZ3VpbnQgc3BzX3NpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChzcHNfYnVmKTsKKworICAgICAgaWYgKHJ0cGgyNjVkZXBheS0+Ynl0ZV9zdHJlYW0pCisgICAgICAgIG1lbWNweSAoZGF0YSwgc3luY19ieXRlcywgc2l6ZW9mIChzeW5jX2J5dGVzKSk7CisgICAgICBlbHNlCisgICAgICAgIEdTVF9XUklURV9VSU5UMzJfQkUgKGRhdGEsIHNwc19zaXplKTsKKyAgICAgIGdzdF9idWZmZXJfZXh0cmFjdCAoc3BzX2J1ZiwgMCwgZGF0YSArIDQsIC0xKTsKKyAgICAgIGRhdGEgKz0gNCArIHNwc19zaXplOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBydHBoMjY1ZGVwYXktPnBwcy0+bGVuOyBpKyspIHsKKyAgICAgIEdzdEJ1ZmZlciAqcHBzX2J1ZiA9IGdfcHRyX2FycmF5X2luZGV4IChydHBoMjY1ZGVwYXktPnBwcywgaSk7CisgICAgICBndWludCBwcHNfc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKHBwc19idWYpOworCisgICAgICBpZiAocnRwaDI2NWRlcGF5LT5ieXRlX3N0cmVhbSkKKyAgICAgICAgbWVtY3B5IChkYXRhLCBzeW5jX2J5dGVzLCBzaXplb2YgKHN5bmNfYnl0ZXMpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZGF0YSwgcHBzX3NpemUpOworICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChwcHNfYnVmLCAwLCBkYXRhICsgNCwgLTEpOworICAgICAgZGF0YSArPSA0ICsgcHBzX3NpemU7CisgICAgfQorCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoY29kZWNfZGF0YSwgJm1hcCk7CisgICAgaWYgKHJ0cGgyNjVkZXBheS0+Y29kZWNfZGF0YSkKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHJ0cGgyNjVkZXBheS0+Y29kZWNfZGF0YSk7CisgICAgcnRwaDI2NWRlcGF5LT5jb2RlY19kYXRhID0gY29kZWNfZGF0YTsKKyAgfQorCisgIGlmIChyZXMpCisgICAgcnRwaDI2NWRlcGF5LT5uZXdfY29kZWNfZGF0YSA9IEZBTFNFOworCisgIHJldHVybiByZXM7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2gyNjVfYWRkX3Zwc19zcHNfcHBzIChHc3RFbGVtZW50ICogcnRwaDI2NSwgR1B0ckFycmF5ICogdnBzX2FycmF5LAorICAgIEdQdHJBcnJheSAqIHNwc19hcnJheSwgR1B0ckFycmF5ICogcHBzX2FycmF5LCBHc3RCdWZmZXIgKiBuYWwpCit7CisgIEdzdE1hcEluZm8gbWFwOworICBndWNoYXIgdHlwZTsKKyAgZ3VpbnQgaTsKKworICBnc3RfYnVmZmVyX21hcCAobmFsLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIHR5cGUgPSAobWFwLmRhdGFbMF0gPj4gMSkgJiAweDNmOworCisgIGlmICh0eXBlID09IEdTVF9IMjY1X1ZQU19OVVQpIHsKKyAgICBndWludDMyIHZwc19pZCA9IChtYXAuZGF0YVsyXSA+PiA0KSAmIDB4MGY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdnBzX2FycmF5LT5sZW47IGkrKykgeworICAgICAgR3N0QnVmZmVyICp2cHMgPSBnX3B0cl9hcnJheV9pbmRleCAodnBzX2FycmF5LCBpKTsKKyAgICAgIEdzdE1hcEluZm8gdnBzbWFwOworICAgICAgZ3VpbnQzMiB0bXBfdnBzX2lkOworCisgICAgICBnc3RfYnVmZmVyX21hcCAodnBzLCAmdnBzbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgdG1wX3Zwc19pZCA9ICh2cHNtYXAuZGF0YVsyXSA+PiA0KSAmIDB4MGY7CisKKyAgICAgIGlmICh2cHNfaWQgPT0gdG1wX3Zwc19pZCkgeworICAgICAgICBpZiAobWFwLnNpemUgPT0gdnBzbWFwLnNpemUgJiYKKyAgICAgICAgICAgIG1lbWNtcCAobWFwLmRhdGEsIHZwc21hcC5kYXRhLCB2cHNtYXAuc2l6ZSkgPT0gMCkgeworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBoMjY1LCAiVW5jaGFuZ2VkIFZQUyAldSwgbm90IHVwZGF0aW5nIiwgdnBzX2lkKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwICh2cHMsICZ2cHNtYXApOworICAgICAgICAgIGdvdG8gZHJvcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwICh2cHMsICZ2cHNtYXApOworICAgICAgICAgIGdfcHRyX2FycmF5X3JlbW92ZV9pbmRleF9mYXN0ICh2cHNfYXJyYXksIGkpOworICAgICAgICAgIGdfcHRyX2FycmF5X2FkZCAodnBzX2FycmF5LCBuYWwpOworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBoMjY1LCAiTW9kaWZpZWQgVlBTICV1LCByZXBsYWNpbmciLCB2cHNfaWQpOworICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAodnBzLCAmdnBzbWFwKTsKKyAgICB9CisgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGgyNjUsICJBZGRpbmcgbmV3IFZQUyAldSIsIHZwc19pZCk7CisgICAgZ19wdHJfYXJyYXlfYWRkICh2cHNfYXJyYXksIG5hbCk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSBHU1RfSDI2NV9TUFNfTlVUKSB7CisgICAgZ3VpbnQzMiBzcHNfaWQ7CisKKyAgICBpZiAoIXBhcnNlX3NwcyAoJm1hcCwgJnNwc19pZCkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwaDI2NSwgIkludmFsaWQgU1BTLCIKKyAgICAgICAgICAiIGNhbid0IHBhcnNlIHNlcV9wYXJhbWV0ZXJfc2V0X2lkIik7CisgICAgICBnb3RvIGRyb3A7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHNwc19hcnJheS0+bGVuOyBpKyspIHsKKyAgICAgIEdzdEJ1ZmZlciAqc3BzID0gZ19wdHJfYXJyYXlfaW5kZXggKHNwc19hcnJheSwgaSk7CisgICAgICBHc3RNYXBJbmZvIHNwc21hcDsKKyAgICAgIGd1aW50MzIgdG1wX3Nwc19pZDsKKworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKHNwcywgJnNwc21hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIHBhcnNlX3NwcyAoJnNwc21hcCwgJnRtcF9zcHNfaWQpOworCisgICAgICBpZiAoc3BzX2lkID09IHRtcF9zcHNfaWQpIHsKKyAgICAgICAgaWYgKG1hcC5zaXplID09IHNwc21hcC5zaXplICYmCisgICAgICAgICAgICBtZW1jbXAgKG1hcC5kYXRhLCBzcHNtYXAuZGF0YSwgc3BzbWFwLnNpemUpID09IDApIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2NSwgIlVuY2hhbmdlZCBTUFMgJXUsIG5vdCB1cGRhdGluZyIsIHNwc19pZCk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc3BzLCAmc3BzbWFwKTsKKyAgICAgICAgICBnb3RvIGRyb3A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoc3BzLCAmc3BzbWFwKTsKKyAgICAgICAgICBnX3B0cl9hcnJheV9yZW1vdmVfaW5kZXhfZmFzdCAoc3BzX2FycmF5LCBpKTsKKyAgICAgICAgICBnX3B0cl9hcnJheV9hZGQgKHNwc19hcnJheSwgbmFsKTsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2NSwgIk1vZGlmaWVkIFNQUyAldSwgcmVwbGFjaW5nIiwgc3BzX2lkKTsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKHNwcywgJnNwc21hcCk7CisgICAgfQorICAgIEdTVF9MT0dfT0JKRUNUIChydHBoMjY1LCAiQWRkaW5nIG5ldyBTUFMgJXUiLCBzcHNfaWQpOworICAgIGdfcHRyX2FycmF5X2FkZCAoc3BzX2FycmF5LCBuYWwpOworICB9IGVsc2UgaWYgKHR5cGUgPT0gR1NUX0gyNjVfUFBTX05VVCkgeworICAgIGd1aW50MzIgc3BzX2lkOworICAgIGd1aW50MzIgcHBzX2lkOworCisgICAgaWYgKCFwYXJzZV9wcHMgKCZtYXAsICZzcHNfaWQsICZwcHNfaWQpKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cGgyNjUsICJJbnZhbGlkIFBQUywiCisgICAgICAgICAgIiBjYW4ndCBwYXJzZSBzZXFfcGFyYW1ldGVyX3NldF9pZCBvciBwaWNfcGFyYW1ldGVyX3NldF9pZCIpOworICAgICAgZ290byBkcm9wOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBwcHNfYXJyYXktPmxlbjsgaSsrKSB7CisgICAgICBHc3RCdWZmZXIgKnBwcyA9IGdfcHRyX2FycmF5X2luZGV4IChwcHNfYXJyYXksIGkpOworICAgICAgR3N0TWFwSW5mbyBwcHNtYXA7CisgICAgICBndWludDMyIHRtcF9zcHNfaWQ7CisgICAgICBndWludDMyIHRtcF9wcHNfaWQ7CisKKworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKHBwcywgJnBwc21hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIHBhcnNlX3BwcyAoJnBwc21hcCwgJnRtcF9zcHNfaWQsICZ0bXBfcHBzX2lkKTsKKworICAgICAgaWYgKHBwc19pZCA9PSB0bXBfcHBzX2lkKSB7CisgICAgICAgIGlmIChtYXAuc2l6ZSA9PSBwcHNtYXAuc2l6ZSAmJgorICAgICAgICAgICAgbWVtY21wIChtYXAuZGF0YSwgcHBzbWFwLmRhdGEsIHBwc21hcC5zaXplKSA9PSAwKSB7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGgyNjUsICJVbmNoYW5nZWQgUFBTICV1OiV1LCBub3QgdXBkYXRpbmciLCBzcHNfaWQsCisgICAgICAgICAgICAgIHBwc19pZCk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAocHBzLCAmcHBzbWFwKTsKKyAgICAgICAgICBnb3RvIGRyb3A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAocHBzLCAmcHBzbWFwKTsKKyAgICAgICAgICBnX3B0cl9hcnJheV9yZW1vdmVfaW5kZXhfZmFzdCAocHBzX2FycmF5LCBpKTsKKyAgICAgICAgICBnX3B0cl9hcnJheV9hZGQgKHBwc19hcnJheSwgbmFsKTsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2NSwgIk1vZGlmaWVkIFBQUyAldToldSwgcmVwbGFjaW5nIiwKKyAgICAgICAgICAgICAgc3BzX2lkLCBwcHNfaWQpOworICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAocHBzLCAmcHBzbWFwKTsKKyAgICB9CisgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGgyNjUsICJBZGRpbmcgbmV3IFBQUyAldTolaSIsIHNwc19pZCwgcHBzX2lkKTsKKyAgICBnX3B0cl9hcnJheV9hZGQgKHBwc19hcnJheSwgbmFsKTsKKyAgfSBlbHNlIHsKKyAgICBnb3RvIGRyb3A7CisgIH0KKworZG9uZToKKyAgZ3N0X2J1ZmZlcl91bm1hcCAobmFsLCAmbWFwKTsKKworICByZXR1cm4gVFJVRTsKKworZHJvcDoKKyAgZ3N0X2J1ZmZlcl91bm1hcCAobmFsLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAobmFsKTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NV9kZXBheV9hZGRfdnBzX3Nwc19wcHMgKEdzdFJ0cEgyNjVEZXBheSAqIHJ0cGgyNjVkZXBheSwKKyAgICBHc3RCdWZmZXIgKiBuYWwpCit7CisgIGlmIChnc3RfcnRwX2gyNjVfYWRkX3Zwc19zcHNfcHBzIChHU1RfRUxFTUVOVCAocnRwaDI2NWRlcGF5KSwKKyAgICAgICAgICBydHBoMjY1ZGVwYXktPnZwcywgcnRwaDI2NWRlcGF5LT5zcHMsIHJ0cGgyNjVkZXBheS0+cHBzLCBuYWwpKQorICAgIHJ0cGgyNjVkZXBheS0+bmV3X2NvZGVjX2RhdGEgPSBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2NV9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2ludCBjbG9ja19yYXRlOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBHc3RSdHBIMjY1RGVwYXkgKnJ0cGgyNjVkZXBheTsKKyAgY29uc3QgZ2NoYXIgKnZwczsKKyAgY29uc3QgZ2NoYXIgKnNwczsKKyAgY29uc3QgZ2NoYXIgKnBwczsKKyAgZ2NoYXIgKnBzOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4ICpwdHI7CisKKyAgcnRwaDI2NWRlcGF5ID0gR1NUX1JUUF9IMjY1X0RFUEFZIChkZXBheWxvYWQpOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA5MDAwMDsKKyAgZGVwYXlsb2FkLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICAvKiBCYXNlNjQgZW5jb2RlZCwgY29tbWEgc2VwYXJhdGVkIGNvbmZpZyBOQUxzICovCisgIHZwcyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAic3Byb3AtdnBzIik7CisgIHNwcyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAic3Byb3Atc3BzIik7CisgIHBwcyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAic3Byb3AtcHBzIik7CisgIGlmICh2cHMgPT0gTlVMTCB8fCBzcHMgPT0gTlVMTCB8fCBwcHMgPT0gTlVMTCkgeworICAgIHBzID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBwcyA9IGdfc3RyZHVwX3ByaW50ZiAoIiVzLCVzLCVzIiwgdnBzLCBzcHMsIHBwcyk7CisgIH0KKworICAvKiBuZWdvdGlhdGUgd2l0aCBkb3duc3RyZWFtIHcuci50LiBvdXRwdXQgZm9ybWF0IGFuZCBhbGlnbm1lbnQgKi8KKyAgZ3N0X3J0cF9oMjY1X2RlcGF5X25lZ290aWF0ZSAocnRwaDI2NWRlcGF5KTsKKworICBpZiAocnRwaDI2NWRlcGF5LT5ieXRlX3N0cmVhbSAmJiBwcyAhPSBOVUxMKSB7CisgICAgLyogZm9yIGJ5dGVzdHJlYW0gd2Ugb25seSBuZWVkIHRoZSBwYXJhbWV0ZXIgc2V0cyBidXQgd2UgZG9uJ3QgZXJyb3Igb3V0CisgICAgICogd2hlbiB0aGV5IGFyZSBub3QgdGhlcmUsIHdlIGFzc3VtZSB0aGV5IGFyZSBpbiB0aGUgc3RyZWFtLiAqLworICAgIGdjaGFyICoqcGFyYW1zOworICAgIEdzdEJ1ZmZlciAqY29kZWNfZGF0YTsKKyAgICBndWludCBsZW4sIHRvdGFsOworICAgIGdpbnQgaTsKKworICAgIHBhcmFtcyA9IGdfc3Ryc3BsaXQgKHBzLCAiLCIsIDApOworCisgICAgLyogY291bnQgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGluIGJhc2U2NC4gQWxzbyBpbmNsdWRlIHRoZSBzeW5jIGJ5dGVzIGluCisgICAgICogZnJvbnQgb2YgdGhlIHBhcmFtcy4gKi8KKyAgICBsZW4gPSAwOworICAgIGZvciAoaSA9IDA7IHBhcmFtc1tpXTsgaSsrKSB7CisgICAgICBsZW4gKz0gc3RybGVuIChwYXJhbXNbaV0pOworICAgICAgbGVuICs9IHNpemVvZiAoc3luY19ieXRlcyk7CisgICAgfQorICAgIC8qIHdlIHNlcmlvdXNseSBvdmVyc2hvb3QgdGhlIGxlbmd0aCwgYnV0IGl0J3MgZmluZS4gKi8KKyAgICBjb2RlY19kYXRhID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChsZW4pOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKGNvZGVjX2RhdGEsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgIHB0ciA9IG1hcC5kYXRhOworICAgIHRvdGFsID0gMDsKKyAgICBmb3IgKGkgPSAwOyBwYXJhbXNbaV07IGkrKykgeworICAgICAgZ3VpbnQgc2F2ZSA9IDA7CisgICAgICBnaW50IHN0YXRlID0gMDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAiZGVjb2RpbmcgcGFyYW0gJWQgKCVzKSIsIGksIHBhcmFtc1tpXSk7CisgICAgICBtZW1jcHkgKHB0ciwgc3luY19ieXRlcywgc2l6ZW9mIChzeW5jX2J5dGVzKSk7CisgICAgICBwdHIgKz0gc2l6ZW9mIChzeW5jX2J5dGVzKTsKKyAgICAgIGxlbiA9CisgICAgICAgICAgZ19iYXNlNjRfZGVjb2RlX3N0ZXAgKHBhcmFtc1tpXSwgc3RybGVuIChwYXJhbXNbaV0pLCBwdHIsICZzdGF0ZSwKKyAgICAgICAgICAmc2F2ZSk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJkZWNvZGVkICVkIGJ5dGVzIiwgbGVuKTsKKyAgICAgIHRvdGFsICs9IGxlbiArIHNpemVvZiAoc3luY19ieXRlcyk7CisgICAgICBwdHIgKz0gbGVuOworICAgIH0KKyAgICBnc3RfYnVmZmVyX3VubWFwIChjb2RlY19kYXRhLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3Jlc2l6ZSAoY29kZWNfZGF0YSwgMCwgdG90YWwpOworICAgIGdfc3RyZnJlZXYgKHBhcmFtcyk7CisKKyAgICAvKiBrZWVwIHRoZSBjb2RlY19kYXRhLCB3ZSBuZWVkIHRvIHNlbmQgaXQgYXMgdGhlIGZpcnN0IGJ1ZmZlci4gV2UgY2Fubm90CisgICAgICogcHVzaCBpdCBpbiB0aGUgYWRhcHRlciBiZWNhdXNlIHRoZSBhZGFwdGVyIG1pZ2h0IGJlIGZsdXNoZWQgb24gZGlzY29udC4KKyAgICAgKi8KKyAgICBpZiAocnRwaDI2NWRlcGF5LT5jb2RlY19kYXRhKQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocnRwaDI2NWRlcGF5LT5jb2RlY19kYXRhKTsKKyAgICBydHBoMjY1ZGVwYXktPmNvZGVjX2RhdGEgPSBjb2RlY19kYXRhOworICB9IGVsc2UgaWYgKCFydHBoMjY1ZGVwYXktPmJ5dGVfc3RyZWFtKSB7CisgICAgZ2NoYXIgKipwYXJhbXM7CisgICAgZ2ludCBpOworCisgICAgaWYgKHBzID09IE5VTEwpCisgICAgICBnb3RvIGluY29tcGxldGVfY2FwczsKKworICAgIHBhcmFtcyA9IGdfc3Ryc3BsaXQgKHBzLCAiLCIsIDApOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAid2UgaGF2ZSAlZCBwYXJhbXMiLCBnX3N0cnZfbGVuZ3RoIChwYXJhbXMpKTsKKworICAgIC8qIHN0YXJ0IHdpdGggMjMgYnl0ZXMgaGVhZGVyICovCisgICAgZm9yIChpID0gMDsgcGFyYW1zW2ldOyBpKyspIHsKKyAgICAgIEdzdEJ1ZmZlciAqbmFsOworICAgICAgR3N0TWFwSW5mbyBuYWxtYXA7CisgICAgICBnc2l6ZSBuYWxfbGVuOworICAgICAgZ3VpbnQgc2F2ZSA9IDA7CisgICAgICBnaW50IHN0YXRlID0gMDsKKworICAgICAgbmFsX2xlbiA9IHN0cmxlbiAocGFyYW1zW2ldKTsKKyAgICAgIGlmIChuYWxfbGVuID09IDApIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZXBheWxvYWQsICJlbXB0eSBwYXJhbSAnJXMnICgjJWQpIiwgcGFyYW1zW2ldLCBpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBuYWwgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG5hbF9sZW4pOworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKG5hbCwgJm5hbG1hcCwgR1NUX01BUF9SRUFEV1JJVEUpOworCisgICAgICBuYWxfbGVuID0KKyAgICAgICAgICBnX2Jhc2U2NF9kZWNvZGVfc3RlcCAocGFyYW1zW2ldLCBuYWxfbGVuLCBuYWxtYXAuZGF0YSwgJnN0YXRlLCAmc2F2ZSk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgImFkZGluZyBwYXJhbSAlZCBhcyAlcyIsIGksCisgICAgICAgICAgKCgobmFsbWFwLmRhdGFbMF0gPj4gMSkgJiAweDNmKSA9PQorICAgICAgICAgICAgICAzMikgPyAiVlBTIiA6ICgoKG5hbG1hcC5kYXRhWzBdID4+IDEpICYgMHgzZikgPT0KKyAgICAgICAgICAgICAgMzMpID8gIlNQUyIgOiAiUFBTIik7CisKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG5hbCwgJm5hbG1hcCk7CisgICAgICBnc3RfYnVmZmVyX3NldF9zaXplIChuYWwsIG5hbF9sZW4pOworCisgICAgICBnc3RfcnRwX2gyNjVfZGVwYXlfYWRkX3Zwc19zcHNfcHBzIChydHBoMjY1ZGVwYXksIG5hbCk7CisgICAgfQorICAgIGdfc3RyZnJlZXYgKHBhcmFtcyk7CisKKyAgICBpZiAocnRwaDI2NWRlcGF5LT52cHMtPmxlbiA9PSAwIHx8IHJ0cGgyNjVkZXBheS0+c3BzLT5sZW4gPT0gMCB8fAorICAgICAgICBydHBoMjY1ZGVwYXktPnBwcy0+bGVuID09IDApIHsKKyAgICAgIGdvdG8gaW5jb21wbGV0ZV9jYXBzOworICAgIH0KKyAgfQorCisgIGdfZnJlZSAocHMpOworCisgIHJldHVybiBnc3RfcnRwX2gyNjVfc2V0X3NyY19jYXBzIChydHBoMjY1ZGVwYXkpOworCisgIC8qIEVSUk9SUyAqLworaW5jb21wbGV0ZV9jYXBzOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAid2UgaGF2ZSBpbmNvbXBsZXRlIGNhcHMsIgorICAgICAgICAiIGRvaW5nIHNldGNhcHMgbGF0ZXIiKTsKKyAgICBnX2ZyZWUgKHBzKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfaDI2NV9kZXBheV9hbGxvY2F0ZV9vdXRwdXRfYnVmZmVyIChHc3RSdHBIMjY1RGVwYXkgKiBkZXBheSwgZ3NpemUgc2l6ZSkKK3sKKyAgR3N0QnVmZmVyICpidWZmZXIgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzaXplID4gMCwgTlVMTCk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGRlcGF5LCAid2FudCBvdXRwdXQgYnVmZmVyIG9mICV1IGJ5dGVzIiwgKGd1aW50KSBzaXplKTsKKworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoZGVwYXktPmFsbG9jYXRvciwgc2l6ZSwgJmRlcGF5LT5wYXJhbXMpOworICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGRlcGF5LCAiY291bGRuJ3QgYWxsb2NhdGUgb3V0cHV0IGJ1ZmZlciIpOworICAgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBzaXplLCBOVUxMKTsKKyAgfQorCisgIHJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9oMjY1X2NvbXBsZXRlX2F1IChHc3RSdHBIMjY1RGVwYXkgKiBydHBoMjY1ZGVwYXksCisgICAgR3N0Q2xvY2tUaW1lICogb3V0X3RpbWVzdGFtcCwgZ2Jvb2xlYW4gKiBvdXRfa2V5ZnJhbWUpCit7CisgIEdzdEJ1ZmZlckxpc3QgKmxpc3Q7CisgIEdzdE1hcEluZm8gb3V0bWFwOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ3VpbnQgb3V0c2l6ZSwgb2Zmc2V0ID0gMDsKKyAgZ2ludCBiLCBuX2J1ZnMsIG0sIG5fbWVtOworCisgIC8qIHdlIGhhZCBhIHBpY3R1cmUgaW4gdGhlIGFkYXB0ZXIgYW5kIHdlIGNvbXBsZXRlZCBpdCAqLworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1ZGVwYXksICJ0YWtpbmcgY29tcGxldGVkIEFVIik7CisgIG91dHNpemUgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cGgyNjVkZXBheS0+cGljdHVyZV9hZGFwdGVyKTsKKworICBvdXRidWYgPSBnc3RfcnRwX2gyNjVfZGVwYXlfYWxsb2NhdGVfb3V0cHV0X2J1ZmZlciAocnRwaDI2NWRlcGF5LCBvdXRzaXplKTsKKworICBpZiAob3V0YnVmID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmb3V0bWFwLCBHU1RfTUFQX1dSSVRFKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBsaXN0ID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXJfbGlzdCAocnRwaDI2NWRlcGF5LT5waWN0dXJlX2FkYXB0ZXIsIG91dHNpemUpOworCisgIG5fYnVmcyA9IGdzdF9idWZmZXJfbGlzdF9sZW5ndGggKGxpc3QpOworICBmb3IgKGIgPSAwOyBiIDwgbl9idWZzOyArK2IpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9idWZmZXJfbGlzdF9nZXQgKGxpc3QsIGIpOworCisgICAgbl9tZW0gPSBnc3RfYnVmZmVyX25fbWVtb3J5IChidWYpOworICAgIGZvciAobSA9IDA7IG0gPCBuX21lbTsgKyttKSB7CisgICAgICBHc3RNZW1vcnkgKm1lbSA9IGdzdF9idWZmZXJfcGVla19tZW1vcnkgKGJ1ZiwgbSk7CisgICAgICBnc2l6ZSBtZW1fc2l6ZSA9IGdzdF9tZW1vcnlfZ2V0X3NpemVzIChtZW0sIE5VTEwsIE5VTEwpOworICAgICAgR3N0TWFwSW5mbyBtZW1fbWFwOworCisgICAgICBpZiAoZ3N0X21lbW9yeV9tYXAgKG1lbSwgJm1lbV9tYXAsIEdTVF9NQVBfUkVBRCkpIHsKKyAgICAgICAgbWVtY3B5IChvdXRtYXAuZGF0YSArIG9mZnNldCwgbWVtX21hcC5kYXRhLCBtZW1fc2l6ZSk7CisgICAgICAgIGdzdF9tZW1vcnlfdW5tYXAgKG1lbSwgJm1lbV9tYXApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtc2V0IChvdXRtYXAuZGF0YSArIG9mZnNldCwgMCwgbWVtX3NpemUpOworICAgICAgfQorICAgICAgb2Zmc2V0ICs9IG1lbV9zaXplOworICAgIH0KKworICAgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHBoMjY1ZGVwYXksIG91dGJ1ZiwgYnVmKTsKKyAgfQorICBnc3RfYnVmZmVyX2xpc3RfdW5yZWYgKGxpc3QpOworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWYsICZvdXRtYXApOworCisgICpvdXRfdGltZXN0YW1wID0gcnRwaDI2NWRlcGF5LT5sYXN0X3RzOworICAqb3V0X2tleWZyYW1lID0gcnRwaDI2NWRlcGF5LT5sYXN0X2tleWZyYW1lOworCisgIHJ0cGgyNjVkZXBheS0+bGFzdF9rZXlmcmFtZSA9IEZBTFNFOworICBydHBoMjY1ZGVwYXktPnBpY3R1cmVfc3RhcnQgPSBGQUxTRTsKKworICByZXR1cm4gb3V0YnVmOworfQorCisvKiBWUFMvU1BTL1BQUy9SQURML1RTQS9SQVNML0lEUi9DUkEgaXMgY29uc2lkZXJlZCBrZXksIGFsbCBvdGhlcnMgREVMVEE7CisgKiBzbyBkb3duc3RyZWFtIHdhaXRpbmcgZm9yIGtleWZyYW1lIGNhbiBwaWNrIHVwIGF0IFZQUy9TUFMvUFBTL0lEUiAqLworCisjZGVmaW5lIE5BTF9UWVBFX0lTX1BBUkFNRVRFUl9TRVQobnQpICgJCSgobnQpID09IEdTVF9IMjY1X1ZQU19OVVQpXAorCQkJCQkJCQkJCXx8ICAoKG50KSA9PSBHU1RfSDI2NV9TUFNfTlVUKVwKKwkJCQkJCQkJCQl8fCAgKChudCkgPT0gR1NUX0gyNjVfUFBTX05VVCkJCQkJKQorCisjZGVmaW5lIE5BTF9UWVBFX0lTX0NPREVEX1NMSUNFX1NFR01FTlQobnQpICgJCSgobnQpID09IEdTVF9IMjY1X05BTF9TTElDRV9UUkFJTF9OKVwKKwkJCQkJCQkJCQkJCXx8IAkoKG50KSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfVFJBSUxfUilcCisJCQkJCQkJCQkJCQl8fCAgKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX1RTQV9OKVwKKwkJCQkJCQkJCQkJCXx8ICAoKG50KSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfVFNBX1IpXAorCQkJCQkJCQkJCQkJfHwgICgobnQpID09IEdTVF9IMjY1X05BTF9TTElDRV9TVFNBX04pXAorCQkJCQkJCQkJCQkJfHwgICgobnQpID09IEdTVF9IMjY1X05BTF9TTElDRV9TVFNBX1IpXAorCQkJCQkJCQkJCQkJfHwgICgobnQpID09IEdTVF9IMjY1X05BTF9TTElDRV9SQVNMX04pXAorCQkJCQkJCQkJCQkJfHwgICgobnQpID09IEdTVF9IMjY1X05BTF9TTElDRV9SQVNMX1IpXAorCQkJCQkJCQkJCQkJfHwgICgobnQpID09IEdTVF9IMjY1X05BTF9TTElDRV9CTEFfV19MUClcCisJCQkJCQkJCQkJCQl8fCAgKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX0JMQV9XX1JBREwpXAorCQkJCQkJCQkJCQkJfHwgICgobnQpID09IEdTVF9IMjY1X05BTF9TTElDRV9CTEFfTl9MUClcCisJCQkJCQkJCQkJCQl8fCAgKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX0lEUl9XX1JBREwpXAorCQkJCQkJCQkJCQkJfHwgICgobnQpID09IEdTVF9IMjY1X05BTF9TTElDRV9JRFJfTl9MUClcCisJCQkJCQkJCQkJCQl8fCAgKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX0NSQV9OVVQpCQkpCisKKy8qIEludHJhIHJhbmRvbSBhY2Nlc3MgcG9pbnQgKi8KKyNkZWZpbmUgTkFMX1RZUEVfSVNfSVJBUChudCkgICAoKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX0JMQV9XX0xQKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX0JMQV9XX1JBREwpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX0JMQV9OX0xQKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX0lEUl9XX1JBREwpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX0lEUl9OX0xQKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChudCkgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX0NSQV9OVVQpKQorCisjZGVmaW5lIE5BTF9UWVBFX0lTX0tFWShudCkgKE5BTF9UWVBFX0lTX1BBUkFNRVRFUl9TRVQobnQpIHx8IE5BTF9UWVBFX0lTX0lSQVAobnQpKQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY1X2RlcGF5X2hhbmRsZV9uYWwgKEdzdFJ0cEgyNjVEZXBheSAqIHJ0cGgyNjVkZXBheSwgR3N0QnVmZmVyICogbmFsLAorICAgIEdzdENsb2NrVGltZSBpbl90aW1lc3RhbXAsIGdib29sZWFuIG1hcmtlcikKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCAqZGVwYXlsb2FkID0gR1NUX1JUUF9CQVNFX0RFUEFZTE9BRCAocnRwaDI2NWRlcGF5KTsKKyAgZ2ludCBuYWxfdHlwZTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgR3N0Q2xvY2tUaW1lIG91dF90aW1lc3RhbXA7CisgIGdib29sZWFuIGtleWZyYW1lLCBvdXRfa2V5ZnJhbWU7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG5hbCwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgaWYgKEdfVU5MSUtFTFkgKG1hcC5zaXplIDwgNSkpCisgICAgZ290byBzaG9ydF9uYWw7CisKKyAgbmFsX3R5cGUgPSAobWFwLmRhdGFbNF0gPj4gMSkgJiAweDNmOworICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1ZGVwYXksICJoYW5kbGUgTkFMIHR5cGUgJWQgKFJUUCBtYXJrZXIgYml0ICVkKSIsCisgICAgICBuYWxfdHlwZSwgbWFya2VyKTsKKworICBrZXlmcmFtZSA9IE5BTF9UWVBFX0lTX0tFWSAobmFsX3R5cGUpOworCisgIG91dF9rZXlmcmFtZSA9IGtleWZyYW1lOworICBvdXRfdGltZXN0YW1wID0gaW5fdGltZXN0YW1wOworCisgIGlmICghcnRwaDI2NWRlcGF5LT5ieXRlX3N0cmVhbSkgeworICAgIGlmIChOQUxfVFlQRV9JU19QQVJBTUVURVJfU0VUIChuYWxfdHlwZSkpIHsKKyAgICAgIGdzdF9ydHBfaDI2NV9kZXBheV9hZGRfdnBzX3Nwc19wcHMgKHJ0cGgyNjVkZXBheSwKKyAgICAgICAgICBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChuYWwsIEdTVF9CVUZGRVJfQ09QWV9BTEwsCisgICAgICAgICAgICAgIDQsIGdzdF9idWZmZXJfZ2V0X3NpemUgKG5hbCkgLSA0KSk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChuYWwsICZtYXApOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAobmFsKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKHJ0cGgyNjVkZXBheS0+c3BzLT5sZW4gPT0gMCB8fCBydHBoMjY1ZGVwYXktPnBwcy0+bGVuID09IDApIHsKKyAgICAgIC8qIERvd24gcHVzaCBkb3duIGFueSBidWZmZXIgaW4gbm9uLWJ5dGVzdHJlYW0gbW9kZSBpZiB0aGUgU1BTL1BQUyBoYXZlbid0CisgICAgICAgKiBnbyB0aHJvdWdoIHlldAorICAgICAgICovCisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU0lOS1BBRCAoZGVwYXlsb2FkKSwKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwKKyAgICAgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJHc3RGb3JjZUtleVVuaXQiLAorICAgICAgICAgICAgICAgICAgImFsbC1oZWFkZXJzIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpKSk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChuYWwsICZtYXApOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAobmFsKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocnRwaDI2NWRlcGF5LT5uZXdfY29kZWNfZGF0YSAmJgorICAgICAgICBydHBoMjY1ZGVwYXktPnNwcy0+bGVuID4gMCAmJiBydHBoMjY1ZGVwYXktPnBwcy0+bGVuID4gMCkKKyAgICAgIGdzdF9ydHBfaDI2NV9zZXRfc3JjX2NhcHMgKHJ0cGgyNjVkZXBheSk7CisgIH0KKworICBpZiAocnRwaDI2NWRlcGF5LT5tZXJnZSkgeworICAgIGdib29sZWFuIHN0YXJ0ID0gRkFMU0UsIGNvbXBsZXRlID0gRkFMU0U7CisKKyAgICAvKiBtYXJrZXIgYml0IGlzbid0IG1hbmRhdG9yeSBzbyBpbiB0aGUgZm9sbG93aW5nIGNvZGUgd2UgdHJ5IHRvIGRldGVjdAorICAgICAqIGFuIEFVIGJvdW5kYXJ5IChzZWUgSC4yNjUgc3BlYyBzZWN0aW9uIDcuNC4yLjQuNCkgKi8KKyAgICBpZiAoIW1hcmtlcikgeworICAgICAgaWYgKE5BTF9UWVBFX0lTX0NPREVEX1NMSUNFX1NFR01FTlQgKG5hbF90eXBlKSkgeworICAgICAgICAvKiBBIE5BTCB1bml0IChYKSBlbmRzIGFuIGFjY2VzcyB1bml0IGlmIHRoZSBuZXh0LW9jY3VycmluZyBWQ0wgTkFMIHVuaXQgKFkpIGhhcyB0aGUgaGlnaC1vcmRlciBiaXQgb2YgdGhlIGZpcnN0IGJ5dGUgYWZ0ZXIgaXRzIE5BTCB1bml0IGhlYWRlciBlcXVhbCB0byAxICovCisgICAgICAgIHN0YXJ0ID0gVFJVRTsKKyAgICAgICAgaWYgKCgobWFwLmRhdGFbNl0gPj4gNykgJiAweDAxKSA9PSAxKSB7CisgICAgICAgICAgY29tcGxldGUgPSBUUlVFOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKChuYWxfdHlwZSA+PSAzMiAmJiBuYWxfdHlwZSA8PSAzNSkKKyAgICAgICAgICB8fCBuYWxfdHlwZSA9PSAzOSB8fCAobmFsX3R5cGUgPj0gNDEgJiYgbmFsX3R5cGUgPD0gNDQpCisgICAgICAgICAgfHwgKG5hbF90eXBlID49IDQ4ICYmIG5hbF90eXBlIDw9IDU1KSkgeworICAgICAgICAvKiBWUFMsIFNQUywgUFBTLCBTRUksIC4uLiB0ZXJtaW5hdGUgYW4gYWNjZXNzIHVuaXQgKi8KKyAgICAgICAgY29tcGxldGUgPSBUUlVFOworICAgICAgfQorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAic3RhcnQgJWQsIGNvbXBsZXRlICVkIiwgc3RhcnQsIGNvbXBsZXRlKTsKKworICAgICAgaWYgKGNvbXBsZXRlICYmIHJ0cGgyNjVkZXBheS0+cGljdHVyZV9zdGFydCkKKyAgICAgICAgb3V0YnVmID0gZ3N0X3J0cF9oMjY1X2NvbXBsZXRlX2F1IChydHBoMjY1ZGVwYXksICZvdXRfdGltZXN0YW1wLAorICAgICAgICAgICAgJm91dF9rZXlmcmFtZSk7CisgICAgfQorICAgIC8qIGFkZCB0byBhZGFwdGVyICovCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAobmFsLCAmbWFwKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgImFkZGluZyBOQUwgdG8gcGljdHVyZSBhZGFwdGVyIik7CisgICAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwaDI2NWRlcGF5LT5waWN0dXJlX2FkYXB0ZXIsIG5hbCk7CisgICAgcnRwaDI2NWRlcGF5LT5sYXN0X3RzID0gaW5fdGltZXN0YW1wOworICAgIHJ0cGgyNjVkZXBheS0+bGFzdF9rZXlmcmFtZSB8PSBrZXlmcmFtZTsKKyAgICBydHBoMjY1ZGVwYXktPnBpY3R1cmVfc3RhcnQgfD0gc3RhcnQ7CisKKyAgICBpZiAobWFya2VyKQorICAgICAgb3V0YnVmID0gZ3N0X3J0cF9oMjY1X2NvbXBsZXRlX2F1IChydHBoMjY1ZGVwYXksICZvdXRfdGltZXN0YW1wLAorICAgICAgICAgICZvdXRfa2V5ZnJhbWUpOworICB9IGVsc2UgeworICAgIC8qIG5vIG1lcmdlLCBvdXRwdXQgaXMgaW5wdXQgbmFsICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAidXNpbmcgTkFMIGFzIG91dHB1dCIpOworICAgIG91dGJ1ZiA9IG5hbDsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChuYWwsICZtYXApOworICB9CisKKyAgaWYgKG91dGJ1ZikgeworICAgIC8qIHByZXBlbmQgY29kZWNfZGF0YSAqLworICAgIGlmIChydHBoMjY1ZGVwYXktPmNvZGVjX2RhdGEpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgInByZXBlbmRpbmcgY29kZWNfZGF0YSIpOworICAgICAgZ3N0X3J0cF9jb3B5X3ZpZGVvX21ldGEgKHJ0cGgyNjVkZXBheSwgcnRwaDI2NWRlcGF5LT5jb2RlY19kYXRhLCBvdXRidWYpOworICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKHJ0cGgyNjVkZXBheS0+Y29kZWNfZGF0YSwgb3V0YnVmKTsKKyAgICAgIHJ0cGgyNjVkZXBheS0+Y29kZWNfZGF0YSA9IE5VTEw7CisgICAgICBvdXRfa2V5ZnJhbWUgPSBUUlVFOworICAgIH0KKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKG91dGJ1Zik7CisKKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX3ZpZGVvX21ldGEgKHJ0cGgyNjVkZXBheSwgb3V0YnVmKTsKKworICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gb3V0X3RpbWVzdGFtcDsKKworICAgIGlmIChvdXRfa2V5ZnJhbWUpCisgICAgICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworICAgIGVsc2UKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgICAgZ3N0X3J0cF9iYXNlX2RlcGF5bG9hZF9wdXNoIChkZXBheWxvYWQsIG91dGJ1Zik7CisgIH0KKworICByZXR1cm47CisKKyAgLyogRVJST1JTICovCitzaG9ydF9uYWw6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgImRyb3BwaW5nIHNob3J0IE5BTCIpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG5hbCwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAobmFsKTsKKyAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NV9maW5pc2hfZnJhZ21lbnRhdGlvbl91bml0IChHc3RSdHBIMjY1RGVwYXkgKiBydHBoMjY1ZGVwYXkpCit7CisgIGd1aW50IG91dHNpemU7CisgIEdzdE1hcEluZm8gbWFwOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKworICBvdXRzaXplID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBoMjY1ZGVwYXktPmFkYXB0ZXIpOworICBnX2Fzc2VydCAob3V0c2l6ZSA+PSA0KTsKKworICBvdXRidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwaDI2NWRlcGF5LT5hZGFwdGVyLCBvdXRzaXplKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAib3V0cHV0ICVkIGJ5dGVzIiwgb3V0c2l6ZSk7CisKKyAgaWYgKHJ0cGgyNjVkZXBheS0+Ynl0ZV9zdHJlYW0pIHsKKyAgICBtZW1jcHkgKG1hcC5kYXRhLCBzeW5jX2J5dGVzLCBzaXplb2YgKHN5bmNfYnl0ZXMpKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChtYXAuZGF0YSwgb3V0c2l6ZSAtIDQpOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm1hcCk7CisKKyAgcnRwaDI2NWRlcGF5LT5jdXJyZW50X2Z1X3R5cGUgPSAwOworCisgIGdzdF9ydHBfaDI2NV9kZXBheV9oYW5kbGVfbmFsIChydHBoMjY1ZGVwYXksIG91dGJ1ZiwKKyAgICAgIHJ0cGgyNjVkZXBheS0+ZnVfdGltZXN0YW1wLCBydHBoMjY1ZGVwYXktPmZ1X21hcmtlcik7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9oMjY1X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0UnRwSDI2NURlcGF5ICpydHBoMjY1ZGVwYXk7CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgZ3VpbnQ4IG5hbF91bml0X3R5cGU7CisKKyAgcnRwaDI2NWRlcGF5ID0gR1NUX1JUUF9IMjY1X0RFUEFZIChkZXBheWxvYWQpOworCisgIC8qIGZsdXNoIHJlbWFpbmluZyBkYXRhIG9uIGRpc2NvbnQgKi8KKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAocnRwLT5idWZmZXIpKSB7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGgyNjVkZXBheS0+YWRhcHRlcik7CisgICAgcnRwaDI2NWRlcGF5LT53YWl0X3N0YXJ0ID0gVFJVRTsKKyAgICBydHBoMjY1ZGVwYXktPmN1cnJlbnRfZnVfdHlwZSA9IDA7CisgIH0KKworICB7CisgICAgZ2ludCBwYXlsb2FkX2xlbjsKKyAgICBndWludDggKnBheWxvYWQ7CisgICAgZ3VpbnQgaGVhZGVyX2xlbjsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBndWludCBvdXRzaXplLCBuYWx1X3NpemU7CisgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKyAgICBnYm9vbGVhbiBtYXJrZXI7CisgICAgZ3VpbnQ4IG51aF9sYXllcl9pZCwgbnVoX3RlbXBvcmFsX2lkX3BsdXMxOworICAgIGd1aW50OCBTLCBFOworICAgIGd1aW50MTYgbmFsX2hlYWRlcjsKKyNpZiAwCisgICAgZ2Jvb2xlYW4gZG9ubF9wcmVzZW50ID0gRkFMU0U7CisjZW5kaWYKKworICAgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChydHAtPmJ1ZmZlcik7CisKKyAgICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKyAgICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisgICAgbWFya2VyID0gZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAocnRwKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVkZXBheSwgInJlY2VpdmluZyAlZCBieXRlcyIsIHBheWxvYWRfbGVuKTsKKworICAgIGlmIChwYXlsb2FkX2xlbiA9PSAwKQorICAgICAgZ290byBlbXB0eV9wYWNrZXQ7CisKKyAgICAvKiArLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKKyAgICAgKiB8MHwxfDJ8M3w0fDV8Nnw3fDB8MXwyfDN8NHw1fDZ8N3wKKyAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKiB8RnwgICBUeXBlICAgIHwgIExheWVySWQgIHwgVElEIHwKKyAgICAgKiArLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgKgorICAgICAqIEYgbXVzdCBiZSAwLgorICAgICAqCisgICAgICovCisgICAgbmFsX3VuaXRfdHlwZSA9IChwYXlsb2FkWzBdID4+IDEpICYgMHgzZjsKKyAgICBudWhfbGF5ZXJfaWQgPSAoKHBheWxvYWRbMF0gJiAweDAxKSA8PCA1KSB8IChwYXlsb2FkWzFdID4+IDMpOyAgICAgIC8qIHNob3VsZCBiZSB6ZXJvIGZvciBub3cgYnV0IHRoaXMgY291bGQgY2hhbmdlIGluIGZ1dHVyZSBIRVZDIGV4dGVuc2lvbnMgKi8KKyAgICBudWhfdGVtcG9yYWxfaWRfcGx1czEgPSBwYXlsb2FkWzFdICYgMHgwMzsKKworICAgIC8qIEF0IGxlYXN0IHR3byBieXRlIGhlYWRlciB3aXRoIHR5cGUgKi8KKyAgICBoZWFkZXJfbGVuID0gMjsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVkZXBheSwKKyAgICAgICAgIk5BTCBoZWFkZXIgbmFsX3VuaXRfdHlwZSAlZCwgbnVoX3RlbXBvcmFsX2lkX3BsdXMxICVkIiwgbmFsX3VuaXRfdHlwZSwKKyAgICAgICAgbnVoX3RlbXBvcmFsX2lkX3BsdXMxKTsKKworICAgIEdTVF9GSVhNRV9PQkpFQ1QgKHJ0cGgyNjVkZXBheSwgIkFzc3VtaW5nIERPTkwgZmllbGQgaXMgbm90IHByZXNlbnQiKTsKKworICAgIC8qIEZJWE1FIC0gYXNzdW1pbmcgRE9OTCBmaWVsZCBpcyBub3QgcHJlc2VudCBmb3Igbm93ICovCisgICAgLypkb25sX3ByZXNlbnQgPSAodHgtbW9kZSA9PSAiTVNUIikgfHwgKHNwcm9wLW1heC1kb24tZGlmZiA+IDApOyAqLworCisgICAgLyogSWYgRlUgdW5pdCB3YXMgYmVpbmcgcHJvY2Vzc2VkLCBidXQgdGhlIGN1cnJlbnQgbmFsIGlzIG9mIGEgZGlmZmVyZW50CisgICAgICogdHlwZS4gIEFzc3VtZSB0aGF0IHRoZSByZW1vdGUgcGF5bG9hZGVyIGlzIGJ1Z2d5IChkaWRuJ3Qgc2V0IHRoZSBlbmQgYml0CisgICAgICogd2hlbiB0aGUgRlUgZW5kZWQpIGFuZCBzZW5kIG91dCB3aGF0IHdlIGdhdGhlcmVkIHRodXNmYXIgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAocnRwaDI2NWRlcGF5LT5jdXJyZW50X2Z1X3R5cGUgIT0gMCAmJgorICAgICAgICAgICAgbmFsX3VuaXRfdHlwZSAhPSBydHBoMjY1ZGVwYXktPmN1cnJlbnRfZnVfdHlwZSkpCisgICAgICBnc3RfcnRwX2gyNjVfZmluaXNoX2ZyYWdtZW50YXRpb25fdW5pdCAocnRwaDI2NWRlcGF5KTsKKworICAgIHN3aXRjaCAobmFsX3VuaXRfdHlwZSkgeworICAgICAgY2FzZSA0ODoKKyAgICAgIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAiUHJvY2Vzc2luZyBhZ2dyZWdhdGlvbiBwYWNrZXQiKTsKKworICAgICAgICAvKiBBZ2dyZWdhdGlvbiBwYWNrZXQgKHNlY3Rpb24gNC43KSAqLworCisgICAgICAgIC8qICBBbiBleGFtcGxlIG9mIGFuIEFQIHBhY2tldCBjb250YWluaW5nIHR3byBhZ2dyZWdhdGlvbiB1bml0cworICAgICAgICAgICB3aXRob3V0IHRoZSBET05MIGFuZCBET05EIGZpZWxkcworCisgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIFJUUCBIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgIHwgICBQYXlsb2FkSGRyIChUeXBlPTQ4KSAgICAgICAgfCAgICAgICAgIE5BTFUgMSBTaXplICAgICAgICAgICB8CisgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgIHwgICAgICAgICAgTkFMVSAxIEhEUiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyAgICAgICAgIE5BTFUgMSBEYXRhICAgICAgICAgICB8CisgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgLiAuIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICsgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgIHwgIC4gLiAuICAgICAgICB8IE5BTFUgMiBTaXplICAgICAgICAgICAgICAgICAgIHwgTkFMVSAyIEhEUiAgICB8CisgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgIHwgTkFMVSAyIEhEUiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rICAgICAgICAgICAgICBOQUxVIDIgRGF0YSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgLiAuIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOi4uLk9QVElPTkFMIFJUUCBwYWRkaW5nICAgICAgICB8CisgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAqLworCisgICAgICAgIC8qIHN0cmlwIGhlYWRlcnMgKi8KKyAgICAgICAgcGF5bG9hZCArPSBoZWFkZXJfbGVuOworICAgICAgICBwYXlsb2FkX2xlbiAtPSBoZWFkZXJfbGVuOworCisgICAgICAgIHJ0cGgyNjVkZXBheS0+d2FpdF9zdGFydCA9IEZBTFNFOworCisjaWYgMAorICAgICAgICBpZiAoZG9ubF9wcmVzZW50KQorICAgICAgICAgIGdvdG8gbm90X2ltcGxlbWVudGVkX2RvbmxfcHJlc2VudDsKKyNlbmRpZgorCisgICAgICAgIHdoaWxlIChwYXlsb2FkX2xlbiA+IDIpIHsKKworICAgICAgICAgIG5hbHVfc2l6ZSA9IChwYXlsb2FkWzBdIDw8IDgpIHwgcGF5bG9hZFsxXTsKKworICAgICAgICAgIC8qIGRvbnQgaW5jbHVkZSBuYWx1X3NpemUgKi8KKyAgICAgICAgICBpZiAobmFsdV9zaXplID4gKHBheWxvYWRfbGVuIC0gMikpCisgICAgICAgICAgICBuYWx1X3NpemUgPSBwYXlsb2FkX2xlbiAtIDI7CisKKyAgICAgICAgICBvdXRzaXplID0gbmFsdV9zaXplICsgc2l6ZW9mIChzeW5jX2J5dGVzKTsKKyAgICAgICAgICBvdXRidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG91dHNpemUpOworCisgICAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgICAgICAgICAgaWYgKHJ0cGgyNjVkZXBheS0+Ynl0ZV9zdHJlYW0pIHsKKyAgICAgICAgICAgIG1lbWNweSAobWFwLmRhdGEsIHN5bmNfYnl0ZXMsIHNpemVvZiAoc3luY19ieXRlcykpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChtYXAuZGF0YSwgbmFsdV9zaXplKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBzdHJpcCBOQUxVIHNpemUgKi8KKyAgICAgICAgICBwYXlsb2FkICs9IDI7CisgICAgICAgICAgcGF5bG9hZF9sZW4gLT0gMjsKKworICAgICAgICAgIG1lbWNweSAobWFwLmRhdGEgKyBzaXplb2YgKHN5bmNfYnl0ZXMpLCBwYXlsb2FkLCBuYWx1X3NpemUpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm1hcCk7CisKKyAgICAgICAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwaDI2NWRlcGF5LCBvdXRidWYsIHJ0cC0+YnVmZmVyKTsKKworICAgICAgICAgIGdzdF9ydHBfaDI2NV9kZXBheV9oYW5kbGVfbmFsIChydHBoMjY1ZGVwYXksIG91dGJ1ZiwgdGltZXN0YW1wLAorICAgICAgICAgICAgICBtYXJrZXIpOworCisgICAgICAgICAgcGF5bG9hZCArPSBuYWx1X3NpemU7CisgICAgICAgICAgcGF5bG9hZF9sZW4gLT0gbmFsdV9zaXplOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSA0OToKKyAgICAgIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAiUHJvY2Vzc2luZyBGcmFnbWVudGF0aW9uIFVuaXQiKTsKKworICAgICAgICAvKiBGcmFnbWVudGF0aW9uIHVuaXRzIChGVXMpICBTZWN0aW9uIDQuOCAqLworCisgICAgICAgIC8qICAgIFRoZSBzdHJ1Y3R1cmUgb2YgYSBGcmFnbWVudGF0aW9uIFVuaXQgKEZVKQorICAgICAgICAgKgorICAgICAgICAgKiAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICB8ICAgIFBheWxvYWRIZHIgKFR5cGU9NDkpICAgICAgIHwgICBGVSBoZWFkZXIgICB8IERPTkwgKGNvbmQpICAgfAorICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLXwKKyAgICAgICAgIHwgRE9OTCAoY29uZCkgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICB8LSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBGVSBwYXlsb2FkICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Li4uT1BUSU9OQUwgUlRQIHBhZGRpbmcgICAgICAgIHwKKyAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAqCisgICAgICAgICAqCisgICAgICAgICAqLworCisgICAgICAgIC8qIHN0cmlwIGhlYWRlcnMgKi8KKyAgICAgICAgcGF5bG9hZCArPSBoZWFkZXJfbGVuOworICAgICAgICBwYXlsb2FkX2xlbiAtPSBoZWFkZXJfbGVuOworCisgICAgICAgIC8qIHByb2Nlc3NpbmcgRlUgaGVhZGVyICovCisgICAgICAgIFMgPSAocGF5bG9hZFswXSAmIDB4ODApID09IDB4ODA7CisgICAgICAgIEUgPSAocGF5bG9hZFswXSAmIDB4NDApID09IDB4NDA7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LAorICAgICAgICAgICAgIkZVIGhlYWRlciB3aXRoIFMgJWQsIEUgJWQsIG5hbF91bml0X3R5cGUgJWQiLCBTLCBFLAorICAgICAgICAgICAgcGF5bG9hZFswXSAmIDB4M2YpOworCisgICAgICAgIGlmIChydHBoMjY1ZGVwYXktPndhaXRfc3RhcnQgJiYgIVMpCisgICAgICAgICAgZ290byB3YWl0aW5nX3N0YXJ0OworCisjaWYgMAorICAgICAgICBpZiAoZG9ubF9wcmVzZW50KQorICAgICAgICAgIGdvdG8gbm90X2ltcGxlbWVudGVkX2RvbmxfcHJlc2VudDsKKyNlbmRpZgorCisgICAgICAgIGlmIChTKSB7CisKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1ZGVwYXksICJTdGFydCBvZiBGcmFnbWVudGF0aW9uIFVuaXQiKTsKKworICAgICAgICAgIC8qIElmIGEgbmV3IEZVIHVuaXQgc3RhcnRlZCwgd2hpbGUgc3RpbGwgcHJvY2Vzc2luZyBhbiBvbGRlciBvbmUuCisgICAgICAgICAgICogQXNzdW1lIHRoYXQgdGhlIHJlbW90ZSBwYXlsb2FkZXIgaXMgYnVnZ3kgKGRvZXNuJ3Qgc2V0IHRoZSBlbmQKKyAgICAgICAgICAgKiBiaXQpIGFuZCBzZW5kIG91dCB3aGF0IHdlJ3ZlIGdhdGhlcmVkIHRodXNmYXIgKi8KKyAgICAgICAgICBpZiAoR19VTkxJS0VMWSAocnRwaDI2NWRlcGF5LT5jdXJyZW50X2Z1X3R5cGUgIT0gMCkpCisgICAgICAgICAgICBnc3RfcnRwX2gyNjVfZmluaXNoX2ZyYWdtZW50YXRpb25fdW5pdCAocnRwaDI2NWRlcGF5KTsKKworICAgICAgICAgIHJ0cGgyNjVkZXBheS0+Y3VycmVudF9mdV90eXBlID0gbmFsX3VuaXRfdHlwZTsKKyAgICAgICAgICBydHBoMjY1ZGVwYXktPmZ1X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKworICAgICAgICAgIHJ0cGgyNjVkZXBheS0+d2FpdF9zdGFydCA9IEZBTFNFOworCisgICAgICAgICAgLyogcmVjb25zdHJ1Y3QgTkFMIGhlYWRlciAqLworICAgICAgICAgIG5hbF9oZWFkZXIgPQorICAgICAgICAgICAgICAoKHBheWxvYWRbMF0gJiAweDNmKSA8PCA5KSB8IChudWhfbGF5ZXJfaWQgPDwgMykgfAorICAgICAgICAgICAgICBudWhfdGVtcG9yYWxfaWRfcGx1czE7CisKKyAgICAgICAgICAvKiBnbyBiYWNrIG9uZSBieXRlIHNvIHdlIGNhbiBjb3B5IHRoZSBwYXlsb2FkICsgdHdvIGJ5dGVzIG1vcmUgaW4gdGhlIGZyb250IHdoaWNoCisgICAgICAgICAgICogd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgbmFsX2hlYWRlcgorICAgICAgICAgICAqLworICAgICAgICAgIHBheWxvYWQgLT0gMTsKKyAgICAgICAgICBwYXlsb2FkX2xlbiArPSAxOworCisgICAgICAgICAgbmFsdV9zaXplID0gcGF5bG9hZF9sZW47CisgICAgICAgICAgb3V0c2l6ZSA9IG5hbHVfc2l6ZSArIHNpemVvZiAoc3luY19ieXRlcyk7CisgICAgICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChvdXRzaXplKTsKKworICAgICAgICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgICAgICAgIGlmIChydHBoMjY1ZGVwYXktPmJ5dGVfc3RyZWFtKSB7CisgICAgICAgICAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChtYXAuZGF0YSwgMHgwMDAwMDAwMSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHdpbGwgYmUgZml4ZWQgdXAgaW4gZmluaXNoX2ZyYWdtZW50YXRpb25fdW5pdCgpICovCisgICAgICAgICAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChtYXAuZGF0YSwgMHhmZmZmZmZmZik7CisgICAgICAgICAgfQorICAgICAgICAgIG1lbWNweSAobWFwLmRhdGEgKyBzaXplb2YgKHN5bmNfYnl0ZXMpLCBwYXlsb2FkLCBuYWx1X3NpemUpOworICAgICAgICAgIG1hcC5kYXRhWzRdID0gbmFsX2hlYWRlciA+PiA4OworICAgICAgICAgIG1hcC5kYXRhWzVdID0gbmFsX2hlYWRlciAmIDB4ZmY7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgICAgICAgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHBoMjY1ZGVwYXksIG91dGJ1ZiwgcnRwLT5idWZmZXIpOworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NWRlcGF5LCAicXVldWVpbmcgJWQgYnl0ZXMiLCBvdXRzaXplKTsKKworICAgICAgICAgIC8qIGFuZCBhc3NlbWJsZSBpbiB0aGUgYWRhcHRlciAqLworICAgICAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGgyNjVkZXBheS0+YWRhcHRlciwgb3V0YnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVkZXBheSwKKyAgICAgICAgICAgICAgIkZvbGxvd2luZyBwYXJ0IG9mIEZyYWdtZW50YXRpb24gVW5pdCIpOworCisgICAgICAgICAgLyogc3RyaXAgb2ZmIEZVIGhlYWRlciBieXRlICovCisgICAgICAgICAgcGF5bG9hZCArPSAxOworICAgICAgICAgIHBheWxvYWRfbGVuIC09IDE7CisKKyAgICAgICAgICBvdXRzaXplID0gcGF5bG9hZF9sZW47CisgICAgICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChvdXRzaXplKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKG91dGJ1ZiwgMCwgcGF5bG9hZCwgb3V0c2l6ZSk7CisKKyAgICAgICAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwaDI2NWRlcGF5LCBvdXRidWYsIHJ0cC0+YnVmZmVyKTsKKworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVkZXBheSwgInF1ZXVlaW5nICVkIGJ5dGVzIiwgb3V0c2l6ZSk7CisKKyAgICAgICAgICAvKiBhbmQgYXNzZW1ibGUgaW4gdGhlIGFkYXB0ZXIgKi8KKyAgICAgICAgICBnc3RfYWRhcHRlcl9wdXNoIChydHBoMjY1ZGVwYXktPmFkYXB0ZXIsIG91dGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBvdXRidWYgPSBOVUxMOworICAgICAgICBydHBoMjY1ZGVwYXktPmZ1X21hcmtlciA9IG1hcmtlcjsKKworICAgICAgICAvKiBpZiBOQUwgdW5pdCBlbmRzLCBmbHVzaCB0aGUgYWRhcHRlciAqLworICAgICAgICBpZiAoRSkgeworICAgICAgICAgIGdzdF9ydHBfaDI2NV9maW5pc2hfZnJhZ21lbnRhdGlvbl91bml0IChydHBoMjY1ZGVwYXkpOworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVkZXBheSwgIkVuZCBvZiBGcmFnbWVudGF0aW9uIFVuaXQiKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgNTA6CisgICAgICAgIGdvdG8gbm90X2ltcGxlbWVudGVkOyAgIC8qIFBBQ0kgcGFja2V0cyAgU2VjdGlvbiA0LjkgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICB7CisgICAgICAgIHJ0cGgyNjVkZXBheS0+d2FpdF9zdGFydCA9IEZBTFNFOworCisgICAgICAgIC8qIEFsbCBvdGhlciBjYXNlczogU2luZ2xlIE5BTCB1bml0IHBhY2tldCAgIFNlY3Rpb24gNC42ICovCisgICAgICAgIC8qIHRoZSBlbnRpcmUgcGF5bG9hZCBpcyB0aGUgb3V0cHV0IGJ1ZmZlciAqLworCisjaWYgMAorICAgICAgICBpZiAoZG9ubF9wcmVzZW50KQorICAgICAgICAgIGdvdG8gbm90X2ltcGxlbWVudGVkX2RvbmxfcHJlc2VudDsKKyNlbmRpZgorCisgICAgICAgIG5hbHVfc2l6ZSA9IHBheWxvYWRfbGVuOworICAgICAgICBvdXRzaXplID0gbmFsdV9zaXplICsgc2l6ZW9mIChzeW5jX2J5dGVzKTsKKyAgICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChvdXRzaXplKTsKKworICAgICAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICAgICAgaWYgKHJ0cGgyNjVkZXBheS0+Ynl0ZV9zdHJlYW0pIHsKKyAgICAgICAgICBtZW1jcHkgKG1hcC5kYXRhLCBzeW5jX2J5dGVzLCBzaXplb2YgKHN5bmNfYnl0ZXMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChtYXAuZGF0YSwgbmFsdV9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkgKG1hcC5kYXRhICsgNCwgcGF5bG9hZCwgbmFsdV9zaXplKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgICAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwaDI2NWRlcGF5LCBvdXRidWYsIHJ0cC0+YnVmZmVyKTsKKworICAgICAgICBnc3RfcnRwX2gyNjVfZGVwYXlfaGFuZGxlX25hbCAocnRwaDI2NWRlcGF5LCBvdXRidWYsIHRpbWVzdGFtcCwgbWFya2VyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIE5VTEw7CisKKyAgLyogRVJST1JTICovCitlbXB0eV9wYWNrZXQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1ZGVwYXksICJlbXB0eSBwYWNrZXQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQord2FpdGluZ19zdGFydDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVkZXBheSwgIndhaXRpbmcgZm9yIHN0YXJ0Iik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNpZiAwCitub3RfaW1wbGVtZW50ZWRfZG9ubF9wcmVzZW50OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHJ0cGgyNjVkZXBheSwgU1RSRUFNLCBGT1JNQVQsCisgICAgICAgIChOVUxMKSwgKCJET05MIGZpZWxkIHByZXNlbnQgbm90IHN1cHBvcnRlZCB5ZXQiKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNlbmRpZgorbm90X2ltcGxlbWVudGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHJ0cGgyNjVkZXBheSwgU1RSRUFNLCBGT1JNQVQsCisgICAgICAgIChOVUxMKSwgKCJOQUwgdW5pdCB0eXBlICVkIG5vdCBzdXBwb3J0ZWQgeWV0IiwgbmFsX3VuaXRfdHlwZSkpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjY1X2RlcGF5X2hhbmRsZV9ldmVudCAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBIMjY1RGVwYXkgKnJ0cGgyNjVkZXBheTsKKworICBydHBoMjY1ZGVwYXkgPSBHU1RfUlRQX0gyNjVfREVQQVkgKGRlcGF5KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X3J0cF9oMjY1X2RlcGF5X3Jlc2V0IChydHBoMjY1ZGVwYXksIEZBTFNFKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybgorICAgICAgR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9DTEFTUyAocGFyZW50X2NsYXNzKS0+aGFuZGxlX2V2ZW50IChkZXBheSwgZXZlbnQpOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfaDI2NV9kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cEgyNjVEZXBheSAqcnRwaDI2NWRlcGF5OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwaDI2NWRlcGF5ID0gR1NUX1JUUF9IMjY1X0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfcnRwX2gyNjVfZGVwYXlfcmVzZXQgKHJ0cGgyNjVkZXBheSwgVFJVRSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3J0cF9oMjY1X2RlcGF5X3Jlc2V0IChydHBoMjY1ZGVwYXksIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfaDI2NV9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwaDI2NWRlcGF5X2RlYnVnLCAicnRwaDI2NWRlcGF5IiwgMCwKKyAgICAgICJIMjY1IFZpZGVvIFJUUCBEZXBheWxvYWRlciIpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwaDI2NWRlcGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX0gyNjVfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBoMjY1ZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YxNzY5NAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaDI2NWRlcGF5LmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMTQ+IEp1cmdlbiBTbG93YWNrIDxqdXJnZW5zbG93YWNrQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9IMjY1X0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfSDI2NV9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisjaW5jbHVkZSAiZ3N0cnRwaDI2NXR5cGVzLmgiCisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0gyNjVfREVQQVkgXAorICAoZ3N0X3J0cF9oMjY1X2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfSDI2NV9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9IMjY1X0RFUEFZLEdzdFJ0cEgyNjVEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfSDI2NV9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSDI2NV9ERVBBWSxHc3RSdHBIMjY1RGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfSDI2NV9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9IMjY1X0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9IMjY1X0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9IMjY1X0RFUEFZKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBIMjY1RGVwYXkgR3N0UnRwSDI2NURlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjVEZXBheUNsYXNzIEdzdFJ0cEgyNjVEZXBheUNsYXNzOworCisjZGVmaW5lIEdTVF9IMjY1X1ZQU19OVVQgMzIKKyNkZWZpbmUgR1NUX0gyNjVfU1BTX05VVCAzMworI2RlZmluZSBHU1RfSDI2NV9QUFNfTlVUIDM0CisKK3R5cGVkZWYgZW51bQoreworICBHU1RfSDI2NV9TVFJFQU1fRk9STUFUX1VOS05PV04sCisgIEdTVF9IMjY1X1NUUkVBTV9GT1JNQVRfQllURVNUUkVBTSwKKyAgR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9IVkMxLAorICBHU1RfSDI2NV9TVFJFQU1fRk9STUFUX0hFVjEKK30gR3N0SDI2NVN0cmVhbUZvcm1hdDsKKworc3RydWN0IF9Hc3RSdHBIMjY1RGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisKKyAgY29uc3QgZ2NoYXIgKnN0cmVhbV9mb3JtYXQ7CisgIEdzdEgyNjVTdHJlYW1Gb3JtYXQgb3V0cHV0X2Zvcm1hdDsgIC8qIGJ5dGVzdHJlYW0sIGh2YzEgb3IgaGV2MSAqLworICBnYm9vbGVhbiBieXRlX3N0cmVhbTsKKworICBHc3RCdWZmZXIgKmNvZGVjX2RhdGE7CisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisgIGdib29sZWFuIHdhaXRfc3RhcnQ7CisKKyAgLyogbmFsIG1lcmdpbmcgKi8KKyAgZ2Jvb2xlYW4gbWVyZ2U7CisgIEdzdEFkYXB0ZXIgKnBpY3R1cmVfYWRhcHRlcjsKKyAgZ2Jvb2xlYW4gcGljdHVyZV9zdGFydDsKKyAgR3N0Q2xvY2tUaW1lIGxhc3RfdHM7CisgIGdib29sZWFuIGxhc3Rfa2V5ZnJhbWU7CisKKyAgLyogV29yayBhcm91bmQgYnJva2VuIHBheWxvYWRlcnMgd3J0LiBGcmFnbWVudGF0aW9uIFVuaXRzICovCisgIGd1aW50OCBjdXJyZW50X2Z1X3R5cGU7CisgIEdzdENsb2NrVGltZSBmdV90aW1lc3RhbXA7CisgIGdib29sZWFuIGZ1X21hcmtlcjsKKworICAvKiBtaXNjICovCisgIEdQdHJBcnJheSAqdnBzOworICBHUHRyQXJyYXkgKnNwczsKKyAgR1B0ckFycmF5ICpwcHM7CisgIGdib29sZWFuIG5ld19jb2RlY19kYXRhOworCisgIC8qIGRvd25zdHJlYW0gYWxsb2NhdG9yICovCisgIEdzdEFsbG9jYXRvciAqYWxsb2NhdG9yOworICBHc3RBbGxvY2F0aW9uUGFyYW1zIHBhcmFtczsKK307CisKK3N0cnVjdCBfR3N0UnRwSDI2NURlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHUXVhcmsgY29weV90YWc7Cit9IENvcHlNZXRhRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudDsKKyAgR1F1YXJrIGtlZXBfdGFnOworfSBEcm9wTWV0YURhdGE7CisKK0dUeXBlIGdzdF9ydHBfaDI2NV9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfaDI2NV9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9oMjY1X2FkZF92cHNfc3BzX3BwcyAoR3N0RWxlbWVudCAqIHJ0cGgyNjUsIEdQdHJBcnJheSAqIHZwcywKKyAgICBHUHRyQXJyYXkgKiBzcHMsIEdQdHJBcnJheSAqIHBwcywgR3N0QnVmZmVyICogbmFsKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9SVFBfSDI2NV9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwaDI2NXBheS5jIGIvZ3N0L3J0cC9nc3RydHBoMjY1cGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE1OTdlMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaDI2NXBheS5jCkBAIC0wLDAgKzEsMTQzOCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAxND4gSnVyZ2VuIFNsb3dhY2sgPGp1cmdlbnNsb3dhY2tAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL3BidXRpbHMuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworLyogSW5jbHVkZWQgdG8gbm90IGR1cGxpY2F0ZSBnc3RfcnRwX2gyNjVfYWRkX3Zwc19zcHNfcHBzICgpICovCisjaW5jbHVkZSAiZ3N0cnRwaDI2NWRlcGF5LmgiCisKKyNpbmNsdWRlICJnc3RydHBoMjY1cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwaDI2NXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwaDI2NXBheV9kZWJ1ZykKKworLyogcmVmZXJlbmNlczoKKyAqCisgKiBJbnRlcm5ldCBEcmFmdCBSVFAgUGF5bG9hZCBGb3JtYXQgZm9yIEhpZ2ggRWZmaWNpZW5jeSBWaWRlbyBDb2RpbmcKKyAqCisgKiAgICAgICAgICAgICAgICAgICBkcmFmdC1pZXRmLXBheWxvYWQtcnRwLWgyNjUtMDMudHh0CisgKgorICogVGhpcyBkcmFmdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYW4gUkZDLCBzbyBzb21lIGRldGFpbHMgbWF5IGNoYW5nZS4KKyAqCisgKi8KKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2NV9wYXlfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgKKyAgICAgICAgLyogb25seSBodmMxIGFuZCBieXRlLXN0cmVhbSBmb3JtYXRzIHN1cHBvcnRlZCBmb3Igbm93ICovCisgICAgICAgICJ2aWRlby94LWgyNjUsIHN0cmVhbS1mb3JtYXQgPSAoc3RyaW5nKSBodmMxLCBhbGlnbm1lbnQgPSAoc3RyaW5nKSBhdTsgIgorICAgICAgICAvKiAidmlkZW8veC1oMjY1LCAiCisgICAgICAgICAgICJzdHJlYW0tZm9ybWF0ID0gKHN0cmluZykgaGV2MSwgYWxpZ25tZW50ID0gKHN0cmluZykgYXU7ICIgKi8KKyAgICAgICAgInZpZGVvL3gtaDI2NSwgc3RyZWFtLWZvcm1hdCA9IChzdHJpbmcpIGJ5dGUtc3RyZWFtLCAiCisgICAgICAgICJhbGlnbm1lbnQgPSAoc3RyaW5nKSB7IG5hbCwgYXUgfSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfaDI2NV9wYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkgyNjVcIiIpCisgICAgICAgICAgICAgICAgLyoqIG9wdGlvbmFsIHBhcmFtZXRlcnMgKiovCisgICAgLyogInByb2ZpbGUtc3BhY2UgPSAoaW50KSBbIDAsIDMgXSwgIiAqLworICAgIC8qICJwcm9maWxlLWlkID0gKGludCkgWyAwLCAzMSBdLCAiICovCisgICAgLyogInRpZXItZmxhZyA9IChpbnQpIFsgMCwgMSBdLCAiICovCisgICAgLyogImxldmVsLWlkID0gKGludCkgWyAwLCAyNTUgXSwgIiAqLworICAgIC8qICJpbnRlcm9wLWNvbnN0cmFpbnRzID0gKHN0cmluZykgQU5ZLCAiICovCisgICAgLyogInByb2ZpbGUtY29tcGF0aWJpbGl0eS1pbmRpY2F0b3IgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAic3Byb3Atc3ViLWxheWVyLWlkID0gKGludCkgWyAwLCA2IF0sICIgKi8KKyAgICAvKiAicmVjdi1zdWItbGF5ZXItaWQgPSAoaW50KSBbIDAsIDYgXSwgIiAqLworICAgIC8qICJtYXgtcmVjdi1sZXZlbC1pZCA9IChpbnQpIFsgMCwgMjU1IF0sICIgKi8KKyAgICAvKiAidHgtbW9kZSA9IChzdHJpbmcpIHtNU1QgLCBTU1R9LCAiICovCisgICAgLyogInNwcm9wLXZwcyA9IChzdHJpbmcpIEFOWSwgIiAqLworICAgIC8qICJzcHJvcC1zcHMgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICAvKiAic3Byb3AtcHBzID0gKHN0cmluZykgQU5ZLCAiICovCisgICAgLyogInNwcm9wLXNlaSA9IChzdHJpbmcpIEFOWSwgIiAqLworICAgIC8qICJtYXgtbHNyID0gKGludCkgQU5ZLCAiICovLyogTVVTVCBiZSBpbiB0aGUgcmFuZ2Ugb2YgTWF4THVtYVNSIHRvIDE2ICogTWF4THVtYVNSLCBpbmNsdXNpdmUgKi8KKyAgICAvKiAibWF4LWxwcyA9IChpbnQpIEFOWSwgIiAqLy8qIE1VU1QgYmUgaW4gdGhlIHJhbmdlIG9mIE1heEx1bWFQUyB0byAxNiAqIE1heEx1bWFQUywgaW5jbHVzaXZlICovCisgICAgLyogIm1heC1jcGIgPSAoaW50KSBBTlksICIgKi8vKiBNVVNUIGJlIGluIHRoZSByYW5nZSBvZiBNYXhDUEIgdG8gMTYgKiBNYXhDUEIsIGluY2x1c2l2ZSAqLworICAgIC8qICJtYXgtZHBiID0gKGludCkgWzEsIDE2XSwgIiAqLworICAgIC8qICJtYXgtYnIgPSAoaW50KSBBTlksICIgKi8vKiBNVVNUIGJlIGluIHRoZSByYW5nZSBvZiBNYXhCUiB0byAxNiAqIE1heEJSLCBpbmNsdXNpdmUsIGZvciB0aGUgaGlnaGVzdCBsZXZlbCAqLworICAgIC8qICJtYXgtdHIgPSAoaW50KSBBTlksICIgKi8vKiBNVVNUIGJlIGluIHRoZSByYW5nZSBvZiBNYXhUaWxlUm93cyB0byAxNiAqIE1heFRpbGVSb3dzLCBpbmNsdXNpdmUsIGZvciB0aGUgaGlnaGVzdCBsZXZlbCAqLworICAgIC8qICJtYXgtdGMgPSAoaW50KSBBTlksICIgKi8vKiBNVVNUIGJlIGluIHRoZSByYW5nZSBvZiBNYXhUaWxlQ29scyB0byAxNiAqIE1heFRpbGVDb2xzLCBpbmNsdXNpdmUsIGZvciB0aGUgaGlnaGVzdCBsZXZlbCAqLworICAgIC8qICJtYXgtZnBzID0gKGludCkgQU5ZLCAiICovCisgICAgLyogInNwcm9wLW1heC1kb24tZGlmZiA9IChpbnQpIFswLCAzMjc2N10sICIgKi8KKyAgICAvKiAic3Byb3AtZGVwYWNrLWJ1Zi1uYWx1cyA9IChpbnQpIFswLCAzMjc2N10sICIgKi8KKyAgICAvKiAic3Byb3AtZGVwYWNrLWJ1Zi1uYWx1cyA9IChpbnQpIFswLCA0Mjk0OTY3Mjk1XSwgIiAqLworICAgIC8qICJkZXBhY2stYnVmLWNhcCA9IChpbnQpIFsxLCA0Mjk0OTY3Mjk1XSwgIiAqLworICAgIC8qICJzcHJvcC1zZWdtZW50YXRpb24taWQgPSAoaW50KSBbMCwgM10sICIgKi8KKyAgICAvKiAic3Byb3Atc3BhdGlhbC1zZWdtZW50YXRpb24taWRjID0gKHN0cmluZykgQU5ZLCAiICovCisgICAgLyogImRlYy1wYXJhbGxlbC1jYXAgPSAoc3RyaW5nKSBBTlksICIgKi8KKyAgICApOworCisjZGVmaW5lIERFRkFVTFRfQ09ORklHX0lOVEVSVkFMCQkgICAgICAwCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0NPTkZJR19JTlRFUlZBTAorfTsKKworI2RlZmluZSBJU19BQ0NFU1NfVU5JVCh4KSAoKCh4KSA+PSAweDAwKSAmJiAoKHgpIDwgMHgyMCkpCisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2NV9wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2gyNjVfcGF5X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfaDI2NV9wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3J0cF9oMjY1X3BheV9nZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0UGFkICogcGFkLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2gyNjVfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9oMjY1X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBhZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaDI2NV9wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfaDI2NV9wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworI2RlZmluZSBnc3RfcnRwX2gyNjVfcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cEgyNjVQYXksIGdzdF9ydHBfaDI2NV9wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY1X3BheV9jbGFzc19pbml0IChHc3RSdHBIMjY1UGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX2gyNjVfcGF5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9oMjY1X3BheV9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfQ09ORklHX0lOVEVSVkFMLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImNvbmZpZy1pbnRlcnZhbCIsCisgICAgICAgICAgIlZQUyBTUFMgUFBTIFNlbmQgSW50ZXJ2YWwiLAorICAgICAgICAgICJTZW5kIFZQUywgU1BTIGFuZCBQUFMgSW5zZXJ0aW9uIEludGVydmFsIGluIHNlY29uZHMgKHNwcm9wIHBhcmFtZXRlciBzZXRzICIKKyAgICAgICAgICAid2lsbCBiZSBtdWx0aXBsZXhlZCBpbiB0aGUgZGF0YSBzdHJlYW0gd2hlbiBkZXRlY3RlZC4pICIKKyAgICAgICAgICAiKDAgPSBkaXNhYmxlZCwgLTEgPSBzZW5kIHdpdGggZXZlcnkgSURSIGZyYW1lKSIsCisgICAgICAgICAgLTEsIDM2MDAsIERFRkFVTFRfQ09ORklHX0lOVEVSVkFMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykKKyAgICAgICk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX2gyNjVfcGF5X2ZpbmFsaXplOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaDI2NV9wYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9oMjY1X3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUlRQIEgyNjUgcGF5bG9hZGVyIiwKKyAgICAgICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQtZW5jb2RlIEgyNjUgdmlkZW8gaW50byBSVFAgcGFja2V0cyAoUkZDIDc3OTgpIiwKKyAgICAgICJKdXJnZW4gU2xvd2FjayA8anVyZ2Vuc2xvd2Fja0BnbWFpbC5jb20+Iik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2gyNjVfcGF5X2NoYW5nZV9zdGF0ZSk7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmdldF9jYXBzID0gZ3N0X3J0cF9oMjY1X3BheV9nZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2gyNjVfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9oMjY1X3BheV9oYW5kbGVfYnVmZmVyOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2lua19ldmVudCA9IGdzdF9ydHBfaDI2NV9wYXlfc2lua19ldmVudDsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwaDI2NXBheV9kZWJ1ZywgInJ0cGgyNjVwYXkiLCAwLAorICAgICAgIkgyNjUgUlRQIFBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY1X3BheV9pbml0IChHc3RSdHBIMjY1UGF5ICogcnRwaDI2NXBheSkKK3sKKyAgcnRwaDI2NXBheS0+cXVldWUgPSBnX2FycmF5X25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKGd1aW50KSk7CisgIHJ0cGgyNjVwYXktPnNwcyA9IGdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoCisgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9idWZmZXJfdW5yZWYpOworICBydHBoMjY1cGF5LT5wcHMgPSBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX3VucmVmKTsKKyAgcnRwaDI2NXBheS0+dnBzID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgIHJ0cGgyNjVwYXktPmxhc3RfdnBzX3Nwc19wcHMgPSAtMTsKKyAgcnRwaDI2NXBheS0+dnBzX3Nwc19wcHNfaW50ZXJ2YWwgPSBERUZBVUxUX0NPTkZJR19JTlRFUlZBTDsKKworICBydHBoMjY1cGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9oMjY1X3BheV9jbGVhcl92cHNfc3BzX3BwcyAoR3N0UnRwSDI2NVBheSAqIHJ0cGgyNjVwYXkpCit7CisgIGdfcHRyX2FycmF5X3NldF9zaXplIChydHBoMjY1cGF5LT52cHMsIDApOworICBnX3B0cl9hcnJheV9zZXRfc2l6ZSAocnRwaDI2NXBheS0+c3BzLCAwKTsKKyAgZ19wdHJfYXJyYXlfc2V0X3NpemUgKHJ0cGgyNjVwYXktPnBwcywgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjVfcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSdHBIMjY1UGF5ICpydHBoMjY1cGF5OworCisgIHJ0cGgyNjVwYXkgPSBHU1RfUlRQX0gyNjVfUEFZIChvYmplY3QpOworCisgIGdfYXJyYXlfZnJlZSAocnRwaDI2NXBheS0+cXVldWUsIFRSVUUpOworCisgIGdfcHRyX2FycmF5X2ZyZWUgKHJ0cGgyNjVwYXktPnNwcywgVFJVRSk7CisgIGdfcHRyX2FycmF5X2ZyZWUgKHJ0cGgyNjVwYXktPnBwcywgVFJVRSk7CisgIGdfcHRyX2FycmF5X2ZyZWUgKHJ0cGgyNjVwYXktPnZwcywgVFJVRSk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cGgyNjVwYXktPmFkYXB0ZXIpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyIGFsbF9sZXZlbHNbXVs0XSA9IHsKKyAgIjEiLAorICAiMiIsCisgICIyLjEiLAorICAiMyIsCisgICIzLjEiLAorICAiNCIsCisgICI0LjEiLAorICAiNSIsCisgICI1LjEiLAorICAiNS4yIiwKKyAgIjYiLAorICAiNi4xIiwKKyAgIjYuMiIKK307CisKK3N0YXRpYyBnYm9vbGVhbgorcGFyc2VfZmllbGQgKEdzdFN0cnVjdHVyZSAqIHMsIGNvbnN0IGdjaGFyICogZmllbGQsIGd1bG9uZyBtaW4sIGd1bG9uZyBtYXgsCisgICAgZ3VpbnQ4ICogcmVzdWx0KQoreworICBjb25zdCBnY2hhciAqc3RyOworCisgIGdfYXNzZXJ0IChyZXN1bHQgIT0gTlVMTCk7CisKKyAgc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCBmaWVsZCk7CisgIGlmIChzdHIgIT0gTlVMTCAmJiAqc3RyICE9ICdcMCcpIHsKKyAgICBndWxvbmcgdmFsdWU7CisgICAgZ2NoYXIgKmVuZDsKKworICAgIHZhbHVlID0gc3RydG91bCAoc3RyLCAmZW5kLCAxMCk7CisgICAgaWYgKCplbmQgPT0gJ1wwJyAmJiB2YWx1ZSA+PSBtaW4gJiYgdmFsdWUgPD0gbWF4KSB7CisgICAgICAqcmVzdWx0ID0gKGd1aW50OCkgdmFsdWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9ydHBfaDI2NV9wYXlfZ2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RQYWQgKiBwYWQsCisgICAgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqdGVtcGxhdGVfY2FwczsKKyAgR3N0Q2FwcyAqYWxsb3dlZF9jYXBzOworICBHc3RDYXBzICpjYXBzOworICBHc3RDYXBzICppY2FwczsKKyAgZ3VpbnQgaTsKKworICBhbGxvd2VkX2NhcHMgPQorICAgICAgZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRCAocGF5bG9hZCksIE5VTEwpOworCisgIGlmIChhbGxvd2VkX2NhcHMgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICB0ZW1wbGF0ZV9jYXBzID0KKyAgICAgIGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldF9jYXBzICgmZ3N0X3J0cF9oMjY1X3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBpZiAoZ3N0X2NhcHNfaXNfYW55IChhbGxvd2VkX2NhcHMpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX3JlZiAodGVtcGxhdGVfY2Fwcyk7CisgICAgZ290byBkb25lOworICB9CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChhbGxvd2VkX2NhcHMpKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX3JlZiAoYWxsb3dlZF9jYXBzKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworICBmb3IgKGkgPSAwOyBpIDwgZ3N0X2NhcHNfZ2V0X3NpemUgKGFsbG93ZWRfY2Fwcyk7IGkrKykgeworICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFsbG93ZWRfY2FwcywgaSk7CisgICAgR3N0U3RydWN0dXJlICpuZXdfcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgidmlkZW8veC1oMjY1Iik7CisgICAgZ3VpbnQ4IHB0bFsxMl0gPSB7IDAsIH07CisgICAgZ3VpbnQ4IHZhbHVlOworCisgICAgaWYgKHBhcnNlX2ZpZWxkIChzLCAicHJvZmlsZS1pZCIsIDAsIDMxLCAmdmFsdWUpKSB7CisgICAgICBjb25zdCBnY2hhciAqcHJvZmlsZTsKKworICAgICAgcHRsWzBdID0gdmFsdWU7CisgICAgICBwcm9maWxlID0gZ3N0X2NvZGVjX3V0aWxzX2gyNjVfZ2V0X3Byb2ZpbGUgKHB0bCwgc2l6ZW9mIChwdGwpKTsKKyAgICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGF5bG9hZCwgInByb2ZpbGUgJXMiLCBwcm9maWxlKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG5ld19zLCAicHJvZmlsZSIsIEdfVFlQRV9TVFJJTkcsIHByb2ZpbGUsIE5VTEwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXlsb2FkLCAiaW52YWxpZCBwcm9maWxlLWlkICVkIGluIGNhcHMiLCB2YWx1ZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJubyB2YWxpZCBwcm9maWxlLWlkIGluIGNhcHMiKTsKKyAgICB9CisKKyAgICBpZiAocGFyc2VfZmllbGQgKHMsICJ0aWVyLWZsYWciLCAwLCAxLCAmdmFsdWUpKSB7CisgICAgICBjb25zdCBnY2hhciAqdGllcjsKKworICAgICAgcHRsWzBdIHw9IHZhbHVlIDw8IDU7CisgICAgICB0aWVyID0gZ3N0X2NvZGVjX3V0aWxzX2gyNjVfZ2V0X3RpZXIgKHB0bCwgc2l6ZW9mIChwdGwpKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJ0aWVyICVzIiwgdGllcik7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3MsICJ0aWVyIiwgR19UWVBFX1NUUklORywgdGllciwgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJubyB2YWxpZCB0aWVyLWZsYWcgaW4gY2FwcyIpOworICAgIH0KKworICAgIGlmIChwYXJzZV9maWVsZCAocywgImxldmVsLWlkIiwgMCwgMjU1LCAmdmFsdWUpKSB7CisgICAgICBjb25zdCBnY2hhciAqbGV2ZWw7CisKKyAgICAgIHB0bFsxMV0gPSB2YWx1ZTsKKyAgICAgIGxldmVsID0gZ3N0X2NvZGVjX3V0aWxzX2gyNjVfZ2V0X2xldmVsIChwdGwsIHNpemVvZiAocHRsKSk7CisgICAgICBpZiAobGV2ZWwgIT0gTlVMTCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXlsb2FkLCAibGV2ZWwgJXMiLCBsZXZlbCk7CisgICAgICAgIGlmIChzdHJjbXAgKGxldmVsLCAiMSIpID09IDApIHsKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAobmV3X3MsICJsZXZlbCIsIEdfVFlQRV9TVFJJTkcsIGxldmVsLCBOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHVmFsdWUgbGV2ZWxzID0geyAwLCB9OworICAgICAgICAgIEdWYWx1ZSB2YWwgPSB7IDAsIH07CisgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKCZsZXZlbHMsIEdTVF9UWVBFX0xJU1QpOworICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR19UWVBFX1NUUklORyk7CisKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgR19OX0VMRU1FTlRTIChhbGxfbGV2ZWxzKTsgaisrKSB7CisgICAgICAgICAgICBnX3ZhbHVlX3NldF9zdGF0aWNfc3RyaW5nICgmdmFsLCBhbGxfbGV2ZWxzW2pdKTsKKyAgICAgICAgICAgIGdzdF92YWx1ZV9saXN0X3ByZXBlbmRfdmFsdWUgKCZsZXZlbHMsICZ2YWwpOworICAgICAgICAgICAgaWYgKCFzdHJjbXAgKGxldmVsLCBhbGxfbGV2ZWxzW2pdKSkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfdGFrZV92YWx1ZSAobmV3X3MsICJsZXZlbCIsICZsZXZlbHMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBheWxvYWQsICJpbnZhbGlkIGxldmVsLWlkICVkIGluIGNhcHMiLCB2YWx1ZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJubyB2YWxpZCBsZXZlbC1pZCBpbiBjYXBzIik7CisgICAgfQorCisgICAgY2FwcyA9IGdzdF9jYXBzX21lcmdlX3N0cnVjdHVyZSAoY2FwcywgbmV3X3MpOworICB9CisKKyAgaWNhcHMgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKGNhcHMsIHRlbXBsYXRlX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGNhcHMgPSBpY2FwczsKKworZG9uZToKKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqdG1wOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocGF5bG9hZCwgIkludGVyc2VjdCAlIiBHU1RfUFRSX0ZPUk1BVCAiIGFuZCBmaWx0ZXIgJSIKKyAgICAgICAgR1NUX1BUUl9GT1JNQVQsIGNhcHMsIGZpbHRlcik7CisgICAgdG1wID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgY2FwcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgY2FwcyA9IHRtcDsKKyAgfQorCisgIGdzdF9jYXBzX3VucmVmICh0ZW1wbGF0ZV9jYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGFsbG93ZWRfY2Fwcyk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBheWxvYWQsICJyZXR1cm5pbmcgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgIHJldHVybiBjYXBzOworfQorCisvKiB0YWtlIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBWUFMsIFNQUyBhbmQgUFBTIGxpc3RzIGFuZCBzZXQgdGhlbSBvbiB0aGUKKyAqIGNhcHMgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjY1X3BheV9zZXRfdnBzX3Nwc19wcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQpCit7CisgIEdzdFJ0cEgyNjVQYXkgKnBheWxvYWRlciA9IEdTVF9SVFBfSDI2NV9QQVkgKGJhc2VwYXlsb2FkKTsKKyAgZ2NoYXIgKnNldDsKKyAgR1N0cmluZyAqdnBzOworICBHU3RyaW5nICpzcHM7CisgIEdTdHJpbmcgKnBwczsKKyAgZ3VpbnQgY291bnQ7CisgIGdib29sZWFuIHJlczsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50IGk7CisKKyAgdnBzID0gZ19zdHJpbmdfbmV3ICgiIik7CisgIHNwcyA9IGdfc3RyaW5nX25ldyAoIiIpOworICBwcHMgPSBnX3N0cmluZ19uZXcgKCIiKTsKKyAgY291bnQgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBwYXlsb2FkZXItPnZwcy0+bGVuOyBpKyspIHsKKyAgICBHc3RCdWZmZXIgKnZwc19idWYgPQorICAgICAgICBHU1RfQlVGRkVSX0NBU1QgKGdfcHRyX2FycmF5X2luZGV4IChwYXlsb2FkZXItPnZwcywgaSkpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKHZwc19idWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgc2V0ID0gZ19iYXNlNjRfZW5jb2RlIChtYXAuZGF0YSwgbWFwLnNpemUpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKHZwc19idWYsICZtYXApOworCisgICAgZ19zdHJpbmdfYXBwZW5kX3ByaW50ZiAodnBzLCAiJXMlcyIsIGkgPyAiLCIgOiAiIiwgc2V0KTsKKyAgICBnX2ZyZWUgKHNldCk7CisgICAgY291bnQrKzsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgcGF5bG9hZGVyLT5zcHMtPmxlbjsgaSsrKSB7CisgICAgR3N0QnVmZmVyICpzcHNfYnVmID0KKyAgICAgICAgR1NUX0JVRkZFUl9DQVNUIChnX3B0cl9hcnJheV9pbmRleCAocGF5bG9hZGVyLT5zcHMsIGkpKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChzcHNfYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHNldCA9IGdfYmFzZTY0X2VuY29kZSAobWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChzcHNfYnVmLCAmbWFwKTsKKworICAgIGdfc3RyaW5nX2FwcGVuZF9wcmludGYgKHNwcywgIiVzJXMiLCBpID8gIiwiIDogIiIsIHNldCk7CisgICAgZ19mcmVlIChzZXQpOworICAgIGNvdW50Kys7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IHBheWxvYWRlci0+cHBzLT5sZW47IGkrKykgeworICAgIEdzdEJ1ZmZlciAqcHBzX2J1ZiA9CisgICAgICAgIEdTVF9CVUZGRVJfQ0FTVCAoZ19wdHJfYXJyYXlfaW5kZXggKHBheWxvYWRlci0+cHBzLCBpKSk7CisKKyAgICBnc3RfYnVmZmVyX21hcCAocHBzX2J1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBzZXQgPSBnX2Jhc2U2NF9lbmNvZGUgKG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAocHBzX2J1ZiwgJm1hcCk7CisKKyAgICBnX3N0cmluZ19hcHBlbmRfcHJpbnRmIChwcHMsICIlcyVzIiwgaSA/ICIsIiA6ICIiLCBzZXQpOworICAgIGdfZnJlZSAoc2V0KTsKKyAgICBjb3VudCsrOworICB9CisKKyAgaWYgKEdfTElLRUxZIChjb3VudCkpIHsKKyAgICAvKiBjb21iaW5lIGludG8gb3V0cHV0IGNhcHMgKi8KKyAgICByZXMgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAoYmFzZXBheWxvYWQsCisgICAgICAgICJzcHJvcC12cHMiLCBHX1RZUEVfU1RSSU5HLCB2cHMtPnN0ciwKKyAgICAgICAgInNwcm9wLXNwcyIsIEdfVFlQRV9TVFJJTkcsIHNwcy0+c3RyLAorICAgICAgICAic3Byb3AtcHBzIiwgR19UWVBFX1NUUklORywgcHBzLT5zdHIsIE5VTEwpOworICB9IGVsc2UgeworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChiYXNlcGF5bG9hZCwgTlVMTCk7CisgIH0KKyAgZ19zdHJpbmdfZnJlZSAodnBzLCBUUlVFKTsKKyAgZ19zdHJpbmdfZnJlZSAoc3BzLCBUUlVFKTsKKyAgZ19zdHJpbmdfZnJlZSAocHBzLCBUUlVFKTsKKworICByZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjY1X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UnRwSDI2NVBheSAqcnRwaDI2NXBheTsKKyAgR3N0U3RydWN0dXJlICpzdHI7CisgIGNvbnN0IEdWYWx1ZSAqdmFsdWU7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmRhdGE7CisgIGdzaXplIHNpemU7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBjb25zdCBnY2hhciAqYWxpZ25tZW50LCAqc3RyZWFtX2Zvcm1hdDsKKyAgZ3VpbnQ4IG51bV9hcnJheXM7CisKKyAgcnRwaDI2NXBheSA9IEdTVF9SVFBfSDI2NV9QQVkgKGJhc2VwYXlsb2FkKTsKKworICBzdHIgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICAvKiB3ZSBjYW4gb25seSBzZXQgdGhlIG91dHB1dCBjYXBzIHdoZW4gd2UgZm91bmQgdGhlIHNwcm9wcyBhbmQgcHJvZmlsZQorICAgKiBOQUxzICovCisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChiYXNlcGF5bG9hZCwgInZpZGVvIiwgVFJVRSwgIkgyNjUiLCA5MDAwMCk7CisKKyAgcnRwaDI2NXBheS0+YWxpZ25tZW50ID0gR1NUX0gyNjVfQUxJR05NRU5UX1VOS05PV047CisgIGFsaWdubWVudCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RyLCAiYWxpZ25tZW50Iik7CisgIGlmIChhbGlnbm1lbnQpIHsKKyAgICBpZiAoZ19zdHJfZXF1YWwgKGFsaWdubWVudCwgImF1IikpCisgICAgICBydHBoMjY1cGF5LT5hbGlnbm1lbnQgPSBHU1RfSDI2NV9BTElHTk1FTlRfQVU7CisgICAgaWYgKGdfc3RyX2VxdWFsIChhbGlnbm1lbnQsICJuYWwiKSkKKyAgICAgIHJ0cGgyNjVwYXktPmFsaWdubWVudCA9IEdTVF9IMjY1X0FMSUdOTUVOVF9OQUw7CisgIH0KKworICBydHBoMjY1cGF5LT5zdHJlYW1fZm9ybWF0ID0gR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9VTktOT1dOOworICBzdHJlYW1fZm9ybWF0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHIsICJzdHJlYW0tZm9ybWF0Iik7CisgIGlmIChzdHJlYW1fZm9ybWF0KSB7CisgICAgaWYgKGdfc3RyX2VxdWFsIChzdHJlYW1fZm9ybWF0LCAiaHZjMSIpKQorICAgICAgcnRwaDI2NXBheS0+c3RyZWFtX2Zvcm1hdCA9IEdTVF9IMjY1X1NUUkVBTV9GT1JNQVRfSFZDMTsKKyAgICBpZiAoZ19zdHJfZXF1YWwgKHN0cmVhbV9mb3JtYXQsICJoZXYxIikpCisgICAgICBydHBoMjY1cGF5LT5zdHJlYW1fZm9ybWF0ID0gR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9IRVYxOworICAgIGlmIChnX3N0cl9lcXVhbCAoc3RyZWFtX2Zvcm1hdCwgImJ5dGUtc3RyZWFtIikpCisgICAgICBydHBoMjY1cGF5LT5zdHJlYW1fZm9ybWF0ID0gR1NUX0gyNjVfU1RSRUFNX0ZPUk1BVF9CWVRFU1RSRUFNOworICB9CisKKyAgLyogcGFja2V0aXplZCBIRVZDIHZpZGVvIGhhcyBhIGNvZGVjX2RhdGEgKi8KKyAgaWYgKCh2YWx1ZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHIsICJjb2RlY19kYXRhIikpKSB7CisgICAgZ3VpbnQgbnVtX3ZwcywgbnVtX3NwcywgbnVtX3BwczsKKyAgICBnaW50IGksIGosIG5hbF9zaXplOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NXBheSwgImhhdmUgcGFja2V0aXplZCBoMjY1Iik7CisKKyAgICBidWZmZXIgPSBnc3RfdmFsdWVfZ2V0X2J1ZmZlciAodmFsdWUpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBkYXRhID0gbWFwLmRhdGE7CisgICAgc2l6ZSA9IG1hcC5zaXplOworCisgICAgLyogcGFyc2UgdGhlIGhldmNDIGRhdGEgKi8KKyAgICBpZiAoc2l6ZSA8IDIzKQorICAgICAgZ290byBoZXZjY190b29fc21hbGw7CisgICAgLyogSEVWQ0RlY29kZXJDb25maWd1cmF0aW9uVmVyc2lvbiAobXVzdCBiZSAxKSAqLworICAgIGlmIChkYXRhWzBdICE9IDEpCisgICAgICBnb3RvIHdyb25nX3ZlcnNpb247CisKKyAgICAvKiBwcm9maWxlX3NwYWNlIHwgdGllcl9mbGFnIHwgcHJvZmlsZV9pZGMgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAicHJvZmlsZSAlMDZ4IiwgZGF0YVsxXSk7CisKKyAgICAvKiBwcm9maWxlX2NvbXBhdGliaWxpdHlfZmxhZ3MgKi8KKyAgICBmb3IgKGkgPSAyOyBpIDwgNjsgaSsrKSB7CisgICAgICBmb3IgKGogPSA3OyBqID49IDA7IGotLSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAicHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWcgJTA2eCIsCisgICAgICAgICAgICAoZGF0YVtpXSA+PiBqKSAmIDEpOworICAgICAgfQorICAgIH0KKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVwYXksICJwcm9ncmVzc2l2ZV9zb3VyY2VfZmxhZyAlMDZ4IiwKKyAgICAgICAgKGRhdGFbNl0gPj4gNykgJiAxKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAiaW50ZXJsYWNlZF9zb3VyY2VfZmxhZyAlMDZ4IiwKKyAgICAgICAgKGRhdGFbNl0gPj4gNikgJiAxKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAibm9uX3BhY2tlZF9jb25zdHJhaW50X2ZsYWcgJTA2eCIsCisgICAgICAgIChkYXRhWzZdID4+IDUpICYgMSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NXBheSwgImZyYW1lX29ubHlfY29uc3RyYWludF9mbGFnICUwNngiLAorICAgICAgICAoZGF0YVs2XSA+PiA0KSAmIDEpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NXBheSwgImxldmVsX2lkYyAlMDZ4IiwgZGF0YVsxMl0pOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NXBheSwgIm1pbl9zcGF0aWFsX3NlZ21lbnRhdGlvbl9pZGMgJTA2eCIsCisgICAgICAgICgoZGF0YVsxM10gXiAweGYwKSA8PCA4KSArIGRhdGFbMTRdKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAicGFycmFsbGVsaXNtVHlwZSAlMDZ4IChpZ25vcmVkIGJ5IHBhbG9hZGVyKSIsCisgICAgICAgIGRhdGFbMTVdKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVwYXksICJzcHNfY2hyb21hX2Zvcm1hdF9pZGMgJTA2eCIsCisgICAgICAgIGRhdGFbMTZdIF4gMHhmYyk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NXBheSwgImJpdF9kZXB0aF9sdW1hX21pbnVzOCAlMDZ4IiwKKyAgICAgICAgZGF0YVsxN10gXiAweGY4KTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAiYml0X2RlcHRoX2Nocm9tYV9taW51czggJTA2eCIsCisgICAgICAgIGRhdGFbMThdIF4gMHhmOCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NXBheSwgImF2Z0ZyYW1lUmF0ZSAlMDZ4IiwgZGF0YVsxOV0pOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVwYXksICJhdmdGcmFtZVJhdGUgJTA2eCIsIGRhdGFbMjBdKTsKKworICAgIC8qIGNvbnN0RnJhbWVSYXRlKDIgYml0cyk6IDAsIHN0cmVhbSBtYXkgb3IgbWF5IG5vdCBiZSBvZiBjb25zdGFudCBmcmFtZXJhdGUKKyAgICAgKiBudW1UZW1wb3JhbExheWVycyAoMyBiaXRzKTogbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycywgdmFsdWUgZnJvbSBTUFMKKyAgICAgKiBUZW1wb3JhbElkTmVzdGVkICgxIGJpdCk6IHNwc190ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWcgZnJvbSBTUFMKKyAgICAgKiBsZW5ndGhTaXplTWludXNPbmUgKDIgYml0cyk6IHBsdXMgMSBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiB0aGUgTkFMVW5pdExlbmd0aCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVwYXksICJjb25zdEZyYW1lUmF0ZSAlMDZ4IiwKKyAgICAgICAgKGRhdGFbMjFdID4+IDYpICYgMHgwMyk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NXBheSwgIm51bVRlbXBvcmFsTGF5ZXJzICUwNngiLAorICAgICAgICAoZGF0YVsyMV0gPj4gMykgJiAweDA3KTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAidGVtcG9yYWxfaWRfbmVzdGluZ19mbGFnICUwNngiLAorICAgICAgICAoZGF0YVsyMV0gPj4gMikgJiAweDAxKTsKKworICAgIHJ0cGgyNjVwYXktPm5hbF9sZW5ndGhfc2l6ZSA9IChkYXRhWzIxXSAmIDB4MykgKyAxOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVwYXksICJuYWwgbGVuZ3RoICV1IiwgcnRwaDI2NXBheS0+bmFsX2xlbmd0aF9zaXplKTsKKworICAgIG51bV9hcnJheXMgPSBHU1RfUkVBRF9VSU5UOCAoZGF0YSArIDIyKTsKKworICAgIGRhdGEgKz0gMjM7CisgICAgc2l6ZSAtPSAyMzsKKworICAgIGlmIChudW1fYXJyYXlzID4gMCkgeworICAgICAgaWYgKChkYXRhWzBdICYgMHgzZikgPT0gMHgyMCkgeyAgIC8qIFZQUyAqLworCisgICAgICAgIGRhdGErKzsKKyAgICAgICAgbnVtX3ZwcyA9IGRhdGFbMF0gPDwgOCB8IGRhdGFbMV07CisgICAgICAgIGRhdGEgKz0gMjsKKyAgICAgICAgc2l6ZSAtPSAyOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdnBzOyBpKyspIHsKKworICAgICAgICAgIEdzdEJ1ZmZlciAqdnBzX2J1ZjsKKworICAgICAgICAgIGlmIChzaXplIDwgMikKKyAgICAgICAgICAgIGdvdG8gaGV2Y2NfZXJyb3I7CisKKyAgICAgICAgICBuYWxfc2l6ZSA9IChkYXRhWzBdIDw8IDgpIHwgZGF0YVsxXTsKKyAgICAgICAgICBkYXRhICs9IDI7CisgICAgICAgICAgc2l6ZSAtPSAyOworCisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGgyNjVwYXksICJWUFMgJWQgc2l6ZSAlZCIsIGksIG5hbF9zaXplKTsKKworICAgICAgICAgIGlmIChzaXplIDwgbmFsX3NpemUpCisgICAgICAgICAgICBnb3RvIGhldmNjX2Vycm9yOworCisgICAgICAgICAgLyogbWFrZSBhIGJ1ZmZlciBvdXQgb2YgaXQgYW5kIGFkZCB0byBWUFMgbGlzdCAqLworICAgICAgICAgIHZwc19idWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG5hbF9zaXplKTsKKyAgICAgICAgICBnc3RfYnVmZmVyX2ZpbGwgKHZwc19idWYsIDAsIGRhdGEsIG5hbF9zaXplKTsKKyAgICAgICAgICBnc3RfcnRwX2gyNjVfYWRkX3Zwc19zcHNfcHBzIChHU1RfRUxFTUVOVCAocnRwaDI2NXBheSksCisgICAgICAgICAgICAgIHJ0cGgyNjVwYXktPnZwcywgcnRwaDI2NXBheS0+c3BzLCBydHBoMjY1cGF5LT5wcHMsIHZwc19idWYpOworICAgICAgICAgIGRhdGEgKz0gbmFsX3NpemU7CisgICAgICAgICAgc2l6ZSAtPSBuYWxfc2l6ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAtLW51bV9hcnJheXM7CisgICAgfQorCisgICAgaWYgKG51bV9hcnJheXMgPiAwKSB7CisgICAgICBpZiAoKGRhdGFbMF0gJiAweDNmKSA9PSAweDIxKSB7ICAgLyogU1BTICovCisKKyAgICAgICAgZGF0YSsrOworICAgICAgICBudW1fc3BzID0gZGF0YVswXSA8PCA4IHwgZGF0YVsxXTsKKyAgICAgICAgZGF0YSArPSAyOworICAgICAgICBzaXplIC09IDI7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9zcHM7IGkrKykgeworCisgICAgICAgICAgR3N0QnVmZmVyICpzcHNfYnVmOworCisgICAgICAgICAgaWYgKHNpemUgPCAyKQorICAgICAgICAgICAgZ290byBoZXZjY19lcnJvcjsKKworICAgICAgICAgIG5hbF9zaXplID0gKGRhdGFbMF0gPDwgOCkgfCBkYXRhWzFdOworICAgICAgICAgIGRhdGEgKz0gMjsKKyAgICAgICAgICBzaXplIC09IDI7CisKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwaDI2NXBheSwgIlNQUyAlZCBzaXplICVkIiwgaSwgbmFsX3NpemUpOworCisgICAgICAgICAgaWYgKHNpemUgPCBuYWxfc2l6ZSkKKyAgICAgICAgICAgIGdvdG8gaGV2Y2NfZXJyb3I7CisKKyAgICAgICAgICAvKiBtYWtlIGEgYnVmZmVyIG91dCBvZiBpdCBhbmQgYWRkIHRvIFNQUyBsaXN0ICovCisgICAgICAgICAgc3BzX2J1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobmFsX3NpemUpOworICAgICAgICAgIGdzdF9idWZmZXJfZmlsbCAoc3BzX2J1ZiwgMCwgZGF0YSwgbmFsX3NpemUpOworICAgICAgICAgIGdzdF9ydHBfaDI2NV9hZGRfdnBzX3Nwc19wcHMgKEdTVF9FTEVNRU5UIChydHBoMjY1cGF5KSwKKyAgICAgICAgICAgICAgcnRwaDI2NXBheS0+dnBzLCBydHBoMjY1cGF5LT5zcHMsIHJ0cGgyNjVwYXktPnBwcywgc3BzX2J1Zik7CisgICAgICAgICAgZGF0YSArPSBuYWxfc2l6ZTsKKyAgICAgICAgICBzaXplIC09IG5hbF9zaXplOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC0tbnVtX2FycmF5czsKKyAgICB9CisKKyAgICBpZiAobnVtX2FycmF5cyA+IDApIHsKKyAgICAgIGlmICgoZGF0YVswXSAmIDB4M2YpID09IDB4MjIpIHsgICAvKiBQUFMgKi8KKworICAgICAgICBkYXRhKys7CisgICAgICAgIG51bV9wcHMgPSBkYXRhWzBdIDw8IDggfCBkYXRhWzFdOworICAgICAgICBkYXRhICs9IDI7CisgICAgICAgIHNpemUgLT0gMjsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BwczsgaSsrKSB7CisKKyAgICAgICAgICBHc3RCdWZmZXIgKnBwc19idWY7CisKKyAgICAgICAgICBpZiAoc2l6ZSA8IDIpCisgICAgICAgICAgICBnb3RvIGhldmNjX2Vycm9yOworCisgICAgICAgICAgbmFsX3NpemUgPSAoZGF0YVswXSA8PCA4KSB8IGRhdGFbMV07CisgICAgICAgICAgZGF0YSArPSAyOworICAgICAgICAgIHNpemUgLT0gMjsKKworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBoMjY1cGF5LCAiUFBTICVkIHNpemUgJWQiLCBpLCBuYWxfc2l6ZSk7CisKKyAgICAgICAgICBpZiAoc2l6ZSA8IG5hbF9zaXplKQorICAgICAgICAgICAgZ290byBoZXZjY19lcnJvcjsKKworICAgICAgICAgIC8qIG1ha2UgYSBidWZmZXIgb3V0IG9mIGl0IGFuZCBhZGQgdG8gUFBTIGxpc3QgKi8KKyAgICAgICAgICBwcHNfYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChuYWxfc2l6ZSk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl9maWxsIChwcHNfYnVmLCAwLCBkYXRhLCBuYWxfc2l6ZSk7CisgICAgICAgICAgZ3N0X3J0cF9oMjY1X2FkZF92cHNfc3BzX3BwcyAoR1NUX0VMRU1FTlQgKHJ0cGgyNjVwYXkpLAorICAgICAgICAgICAgICBydHBoMjY1cGF5LT52cHMsIHJ0cGgyNjVwYXktPnNwcywgcnRwaDI2NXBheS0+cHBzLCBwcHNfYnVmKTsKKyAgICAgICAgICBkYXRhICs9IG5hbF9zaXplOworICAgICAgICAgIHNpemUgLT0gbmFsX3NpemU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLS1udW1fYXJyYXlzOworICAgIH0KKworICAgIC8qIGFuZCB1cGRhdGUgdGhlIGNhcHMgd2l0aCB0aGUgY29sbGVjdGVkIGRhdGEgKi8KKyAgICBpZiAoIWdzdF9ydHBfaDI2NV9wYXlfc2V0X3Zwc19zcHNfcHBzIChiYXNlcGF5bG9hZCkpCisgICAgICBnb3RvIHNldF92cHNfc3BzX3Bwc19mYWlsZWQ7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAiQ2FwcyBoYXZlIGJlZW4gc2V0Iik7CisKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVwYXksICJoYXZlIGJ5dGVzdHJlYW0gaDI2NSIpOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKK2hldmNjX3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGgyNjVwYXksICJoZXZjQyBzaXplICUiIEdfR1NJWkVfRk9STUFUICIgPCA3Iiwgc2l6ZSk7CisgICAgZ290byBlcnJvcjsKKyAgfQord3JvbmdfdmVyc2lvbjoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGgyNjVwYXksICJ3cm9uZyBoZXZjQyB2ZXJzaW9uIik7CisgICAgZ290byBlcnJvcjsKKyAgfQoraGV2Y2NfZXJyb3I6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChydHBoMjY1cGF5LCAiaGV2Y0MgdG9vIHNtYWxsICIpOworICAgIGdvdG8gZXJyb3I7CisgIH0KK3NldF92cHNfc3BzX3Bwc19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChydHBoMjY1cGF5LCAiZmFpbGVkIHRvIHNldCB2cHMvc3BzL3BwcyIpOworICAgIGdvdG8gZXJyb3I7CisgIH0KK2Vycm9yOgorICB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGd1aW50CituZXh0X3N0YXJ0X2NvZGUgKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUpCit7CisgIC8qIEJveWVyLU1vb3JlIHN0cmluZyBtYXRjaGluZyBhbGdvcml0aG0sIGluIGEgZGVnZW5lcmF0aXZlCisgICAqIHNlbnNlIGJlY2F1c2Ugb3VyIHNlYXJjaCAnYWxwaGFiZXQnIGlzIGJpbmFyeSAtIDAgJiAxIG9ubHkuCisgICAqIFRoaXMgYWxsb3cgdXMgdG8gc2ltcGxpZnkgdGhlIGdlbmVyYWwgQk0gYWxnb3JpdGhtIHRvIGEgdmVyeQorICAgKiBzaW1wbGUgZm9ybS4gKi8KKyAgLyogYXNzdW1lIDEgaXMgaW4gdGhlIDNyZCBieXRlICovCisgIGd1aW50IG9mZnNldCA9IDI7CisKKyAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKKyAgICBpZiAoMSA9PSBkYXRhW29mZnNldF0pIHsKKyAgICAgIHVuc2lnbmVkIGludCBzaGlmdCA9IG9mZnNldDsKKworICAgICAgaWYgKDAgPT0gZGF0YVstLXNoaWZ0XSkgeworICAgICAgICBpZiAoMCA9PSBkYXRhWy0tc2hpZnRdKSB7CisgICAgICAgICAgcmV0dXJuIHNoaWZ0OworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBUaGUganVtcCBpcyBhbHdheXMgMyBiZWNhdXNlIG9mIHRoZSAxIHByZXZpb3VzbHkgbWF0Y2hlZC4KKyAgICAgICAqIEFsbCB0aGUgMCdzIG11c3QgYmUgYWZ0ZXIgdGhpcyAnMScgbWF0Y2hlZCBhdCBvZmZzZXQgKi8KKyAgICAgIG9mZnNldCArPSAzOworICAgIH0gZWxzZSBpZiAoMCA9PSBkYXRhW29mZnNldF0pIHsKKyAgICAgIC8qIG1heWJlIG5leHQgYnl0ZSBpcyAxPyAqLworICAgICAgb2Zmc2V0Kys7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGNhbiBqdW1wIDMgYnl0ZXMgZm9yd2FyZCAqLworICAgICAgb2Zmc2V0ICs9IDM7CisgICAgfQorICAgIC8qIGF0IGVhY2ggaXRlcmF0aW9uLCB3ZSByZXNjYW4gaW4gYSBiYWNrd2FyZCBtYW5uZXIgdW50aWwKKyAgICAgKiB3ZSBtYXRjaCAwLjAuMSBpbiByZXZlcnNlIG9yZGVyLiBTaW5jZSBvdXIgc2VhcmNoIHN0cmluZworICAgICAqIGhhcyBvbmx5IDIgJ2FscGFiZXRzJyAoaS5lLiAwICYgMSksIHdlIGtub3cgdGhhdCBhbnkKKyAgICAgKiBtaXNtYXRjaCB3aWxsIGZvcmNlIHVzIHRvIHNoaWZ0IGEgZml4ZWQgbnVtYmVyIG9mIHN0ZXBzICovCisgIH0KKyAgR1NUX0RFQlVHICgiQ2Fubm90IGZpbmQgbmV4dCBOQUwgc3RhcnQgY29kZS4gcmV0dXJuaW5nICV1Iiwgc2l6ZSk7CisKKyAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9oMjY1X3BheV9kZWNvZGVfbmFsIChHc3RSdHBIMjY1UGF5ICogcGF5bG9hZGVyLAorICAgIGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIEdzdENsb2NrVGltZSBkdHMsIEdzdENsb2NrVGltZSBwdHMpCit7CisgIGd1aW50OCB0eXBlOworICBnYm9vbGVhbiB1cGRhdGVkOworCisgIC8qIGRlZmF1bHQgaXMgbm8gdXBkYXRlICovCisgIHVwZGF0ZWQgPSBGQUxTRTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYXlsb2FkZXIsICJOQUwgcGF5bG9hZCBzaXplICV1Iiwgc2l6ZSk7CisKKyAgdHlwZSA9IChkYXRhWzBdID4+IDEpICYgMHgzZjsKKworICAvKiBXZSByZWNvcmQgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBTUFMvUFBTIHNvCisgICAqIHRoYXQgd2UgY2FuIGluc2VydCB0aGVtIGF0IHJlZ3VsYXIgaW50ZXJ2YWxzIGFuZCB3aGVuIG5lZWRlZC4gKi8KKyAgaWYgKEdTVF9IMjY1X05BTF9WUFMgPT0gdHlwZSB8fCBHU1RfSDI2NV9OQUxfU1BTID09IHR5cGUKKyAgICAgIHx8IEdTVF9IMjY1X05BTF9QUFMgPT0gdHlwZSkgeworICAgIEdzdEJ1ZmZlciAqbmFsOworCisgICAgLyogdHJhaWxpbmcgMHgwIGFyZSBub3QgcGFydCBvZiB0aGUgVlBTL1NQUy9QUFMgKi8KKyAgICB3aGlsZSAoc2l6ZSA+IDAgJiYgZGF0YVtzaXplIC0gMV0gPT0gMHgwKQorICAgICAgc2l6ZS0tOworCisgICAgLyogZW5jb2RlIHRoZSBlbnRpcmUgTkFMIGluIGJhc2U2NCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWRlciwgImZvdW5kICVzICh0eXBlIDB4JXgpLCBzaXplICV1IiwKKyAgICAgICAgdHlwZSA9PSBHU1RfSDI2NV9OQUxfVlBTID8gIlZQUyIgOiB0eXBlID09IEdTVF9IMjY1X05BTF9TUFMgPworICAgICAgICAiU1BTIiA6ICJQUFMiLCB0eXBlLCBzaXplKTsKKworICAgIG5hbCA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBzaXplLCBOVUxMKTsKKyAgICBnc3RfYnVmZmVyX2ZpbGwgKG5hbCwgMCwgZGF0YSwgc2l6ZSk7CisKKyAgICB1cGRhdGVkID0gZ3N0X3J0cF9oMjY1X2FkZF92cHNfc3BzX3BwcyAoR1NUX0VMRU1FTlQgKHBheWxvYWRlciksCisgICAgICAgIHBheWxvYWRlci0+dnBzLCBwYXlsb2FkZXItPnNwcywgcGF5bG9hZGVyLT5wcHMsIG5hbCk7CisKKyAgICAvKiByZW1lbWJlciB3aGVuIHdlIGxhc3Qgc2F3IFZQUyAqLworICAgIGlmICh1cGRhdGVkICYmIHB0cyAhPSAtMSkKKyAgICAgIHBheWxvYWRlci0+bGFzdF92cHNfc3BzX3BwcyA9IHB0czsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXlsb2FkZXIsICJOQUxVIHR5cGUgMHgleCwgc2l6ZSAldSIsIHR5cGUsIHNpemUpOworICB9CisKKyAgcmV0dXJuIHVwZGF0ZWQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2gyNjVfcGF5X3BheWxvYWRfbmFsIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdQdHJBcnJheSAqIHBheWJ1ZnMsIEdzdENsb2NrVGltZSBkdHMsIEdzdENsb2NrVGltZSBwdHMpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9oMjY1X3BheV9zZW5kX3Zwc19zcHNfcHBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdFJ0cEgyNjVQYXkgKiBydHBoMjY1cGF5LCBHc3RDbG9ja1RpbWUgZHRzLCBHc3RDbG9ja1RpbWUgcHRzKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBnYm9vbGVhbiBzZW50X2FsbF92cHNfc3BzX3BwcyA9IFRSVUU7CisgIGd1aW50IGk7CisgIEdQdHJBcnJheSAqYnVmczsKKworICBidWZzID0gZ19wdHJfYXJyYXlfbmV3ICgpOworCisgIGZvciAoaSA9IDA7IGkgPCBydHBoMjY1cGF5LT52cHMtPmxlbjsgaSsrKSB7CisgICAgR3N0QnVmZmVyICp2cHNfYnVmID0KKyAgICAgICAgR1NUX0JVRkZFUl9DQVNUIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NXBheS0+dnBzLCBpKSk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAiaW5zZXJ0aW5nIFZQUyBpbiB0aGUgc3RyZWFtIik7CisgICAgZ19wdHJfYXJyYXlfYWRkIChidWZzLCBnc3RfYnVmZmVyX3JlZiAodnBzX2J1ZikpOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBydHBoMjY1cGF5LT5zcHMtPmxlbjsgaSsrKSB7CisgICAgR3N0QnVmZmVyICpzcHNfYnVmID0KKyAgICAgICAgR1NUX0JVRkZFUl9DQVNUIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NXBheS0+c3BzLCBpKSk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAiaW5zZXJ0aW5nIFNQUyBpbiB0aGUgc3RyZWFtIik7CisgICAgZ19wdHJfYXJyYXlfYWRkIChidWZzLCBnc3RfYnVmZmVyX3JlZiAoc3BzX2J1ZikpOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBydHBoMjY1cGF5LT5wcHMtPmxlbjsgaSsrKSB7CisgICAgR3N0QnVmZmVyICpwcHNfYnVmID0KKyAgICAgICAgR1NUX0JVRkZFUl9DQVNUIChnX3B0cl9hcnJheV9pbmRleCAocnRwaDI2NXBheS0+cHBzLCBpKSk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAiaW5zZXJ0aW5nIFBQUyBpbiB0aGUgc3RyZWFtIik7CisgICAgZ19wdHJfYXJyYXlfYWRkIChidWZzLCBnc3RfYnVmZmVyX3JlZiAocHBzX2J1ZikpOworICB9CisKKyAgcmV0ID0gZ3N0X3J0cF9oMjY1X3BheV9wYXlsb2FkX25hbCAoYmFzZXBheWxvYWQsIGJ1ZnMsIGR0cywgcHRzKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgIC8qIG5vdCBjcml0aWNhbCBidXQgd2FybiAqLworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYmFzZXBheWxvYWQsICJmYWlsZWQgcHVzaGluZyBWUFMvU1BTL1BQUyIpOworCisgICAgc2VudF9hbGxfdnBzX3Nwc19wcHMgPSBGQUxTRTsKKyAgfQorCisgIGlmIChwdHMgIT0gLTEgJiYgc2VudF9hbGxfdnBzX3Nwc19wcHMpCisgICAgcnRwaDI2NXBheS0+bGFzdF92cHNfc3BzX3BwcyA9IHB0czsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9oMjY1X3BheV9wYXlsb2FkX25hbCAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHUHRyQXJyYXkgKiBwYXlidWZzLCBHc3RDbG9ja1RpbWUgZHRzLCBHc3RDbG9ja1RpbWUgcHRzKQoreworICBHc3RSdHBIMjY1UGF5ICpydHBoMjY1cGF5OworICBndWludCBtdHU7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBnaW50IGk7CisgIGdib29sZWFuIHNlbnRfcHM7CisKKyAgcnRwaDI2NXBheSA9IEdTVF9SVFBfSDI2NV9QQVkgKGJhc2VwYXlsb2FkKTsKKyAgbXR1ID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChydHBoMjY1cGF5KTsKKworICAvKiBzaG91bGQgc2V0IHNyYyBjYXBzIGJlZm9yZSBwdXNoaW5nIHN0dWZmLAorICAgKiBhbmQgaWYgd2UgZGlkIG5vdCBzZWUgZW5vdWdoIFZQUy9TUFMvUFBTLCB0aGF0IG1heSBub3QgYmUgdGhlIGNhc2UgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKCFnc3RfcGFkX2hhc19jdXJyZW50X2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRAorICAgICAgICAgICAgICAoYmFzZXBheWxvYWQpKSkpCisgICAgZ3N0X3J0cF9oMjY1X3BheV9zZXRfdnBzX3Nwc19wcHMgKGJhc2VwYXlsb2FkKTsKKworICByZXQgPSBHU1RfRkxPV19PSzsKKyAgc2VudF9wcyA9IEZBTFNFOworICBmb3IgKGkgPSAwOyBpIDwgcGF5YnVmcy0+bGVuOyBpKyspIHsKKyAgICBndWludDggbmFsSGVhZGVyWzJdOworICAgIGd1aW50OCBuYWxUeXBlOworICAgIGd1aW50IHBhY2tldF9sZW4sIHBheWxvYWRfbGVuOworICAgIEdzdEJ1ZmZlciAqcGF5YnVmOworICAgIEdzdEJ1ZmZlciAqb3V0YnVmOworICAgIGd1aW50OCAqcGF5bG9hZDsKKyAgICBHc3RCdWZmZXJMaXN0ICpvdXRsaXN0ID0gTlVMTDsKKyAgICBnYm9vbGVhbiBzZW5kX3BzOworICAgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwgfTsKKyAgICBndWludCBzaXplOworCisgICAgcGF5YnVmID0gZ19wdHJfYXJyYXlfaW5kZXggKHBheWJ1ZnMsIGkpOworCisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgLyogdW5yZWYgYnVmZmVycyB0aGF0IHdpbGwgbm90IGJlIHBheWxvYWRlZCBhZnRlciBhIGZsb3cgZXJyb3IgKi8KKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHBheWJ1Zik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAocGF5YnVmKTsKKyAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKHBheWJ1ZiwgMCwgbmFsSGVhZGVyLCAyKTsKKyAgICBuYWxUeXBlID0gKG5hbEhlYWRlclswXSA+PiAxKSAmIDB4M2Y7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LCAiUHJvY2Vzc2luZyBCdWZmZXIgd2l0aCBOQUwgVFlQRT0lZCIsCisgICAgICAgIG5hbFR5cGUpOworCisgICAgc2VuZF9wcyA9IEZBTFNFOworCisgICAgLyogY2hlY2sgaWYgd2UgbmVlZCB0byBlbWl0IGFuIFZQUy9TUFMvUFBTIG5vdyAqLworICAgIGlmICgobmFsVHlwZSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfVFJBSUxfTikKKyAgICAgICAgfHwgKG5hbFR5cGUgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX1RSQUlMX1IpCisgICAgICAgIHx8IChuYWxUeXBlID09IEdTVF9IMjY1X05BTF9TTElDRV9UU0FfTikKKyAgICAgICAgfHwgKG5hbFR5cGUgPT0gR1NUX0gyNjVfTkFMX1NMSUNFX1RTQV9SKQorICAgICAgICB8fCAobmFsVHlwZSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfU1RTQV9OKQorICAgICAgICB8fCAobmFsVHlwZSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfU1RTQV9SKQorICAgICAgICB8fCAobmFsVHlwZSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfUkFTTF9OKQorICAgICAgICB8fCAobmFsVHlwZSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfUkFTTF9SKQorICAgICAgICB8fCAobmFsVHlwZSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfQkxBX1dfTFApCisgICAgICAgIHx8IChuYWxUeXBlID09IEdTVF9IMjY1X05BTF9TTElDRV9CTEFfV19SQURMKQorICAgICAgICB8fCAobmFsVHlwZSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfQkxBX05fTFApCisgICAgICAgIHx8IChuYWxUeXBlID09IEdTVF9IMjY1X05BTF9TTElDRV9JRFJfV19SQURMKQorICAgICAgICB8fCAobmFsVHlwZSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfSURSX05fTFApCisgICAgICAgIHx8IChuYWxUeXBlID09IEdTVF9IMjY1X05BTF9TTElDRV9DUkFfTlVUKSkgeworICAgICAgaWYgKHJ0cGgyNjVwYXktPnZwc19zcHNfcHBzX2ludGVydmFsID4gMCkgeworICAgICAgICBpZiAocnRwaDI2NXBheS0+bGFzdF92cHNfc3BzX3BwcyAhPSAtMSkgeworICAgICAgICAgIGd1aW50NjQgZGlmZjsKKworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBoMjY1cGF5LAorICAgICAgICAgICAgICAibm93ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBsYXN0IFZQUy9TUFMvUFBTICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocHRzKSwKKyAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocnRwaDI2NXBheS0+bGFzdF92cHNfc3BzX3BwcykpOworCisgICAgICAgICAgLyogY2FsY3VsYXRlIGRpZmYgYmV0d2VlbiBsYXN0IFNQUy9QUFMgaW4gbWlsbGlzZWNvbmRzICovCisgICAgICAgICAgaWYgKHB0cyA+IHJ0cGgyNjVwYXktPmxhc3RfdnBzX3Nwc19wcHMpCisgICAgICAgICAgICBkaWZmID0gcHRzIC0gcnRwaDI2NXBheS0+bGFzdF92cHNfc3BzX3BwczsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBkaWZmID0gMDsKKworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVwYXksCisgICAgICAgICAgICAgICJpbnRlcnZhbCBzaW5jZSBsYXN0IFZQUy9TUFMvUFBTICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZGlmZikpOworCisgICAgICAgICAgLyogYmlnZ2VyIHRoYW4gaW50ZXJ2YWwsIHF1ZXVlIFNQUy9QUFMgKi8KKyAgICAgICAgICBpZiAoR1NUX1RJTUVfQVNfU0VDT05EUyAoZGlmZikgPj0gcnRwaDI2NXBheS0+dnBzX3Nwc19wcHNfaW50ZXJ2YWwpIHsKKyAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVwYXksICJ0aW1lIHRvIHNlbmQgVlBTL1NQUy9QUFMiKTsKKyAgICAgICAgICAgIHNlbmRfcHMgPSBUUlVFOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBubyBrbm93biBwcmV2aW91cyBTUFMvUFBTIHRpbWUsIHNlbmQgbm93ICovCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NXBheSwKKyAgICAgICAgICAgICAgIm5vIHByZXZpb3VzIFZQUy9TUFMvUFBTIHRpbWUsIHNlbmQgbm93Iik7CisgICAgICAgICAgc2VuZF9wcyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAocnRwaDI2NXBheS0+dnBzX3Nwc19wcHNfaW50ZXJ2YWwgPT0gLTEKKyAgICAgICAgICAmJiAobmFsVHlwZSA9PSBHU1RfSDI2NV9OQUxfU0xJQ0VfSURSX1dfUkFETAorICAgICAgICAgICAgICB8fCBuYWxUeXBlID09IEdTVF9IMjY1X05BTF9TTElDRV9JRFJfTl9MUCkpIHsKKyAgICAgICAgLyogc2VuZCBWUFMvU1BTL1BQUyBiZWZvcmUgZXZlcnkgSURSIGZyYW1lICovCisgICAgICAgIHNlbmRfcHMgPSBUUlVFOworICAgICAgfQorICAgIH0KKworICAgIGlmICghc2VudF9wcyAmJiAoc2VuZF9wcyB8fCBydHBoMjY1cGF5LT5zZW5kX3Zwc19zcHNfcHBzKSkgeworICAgICAgLyogd2UgbmVlZCB0byBzZW5kIFNQUy9QUFMgbm93IGZpcnN0LiBGSVhNRSwgZG9uJ3QgdXNlIHRoZSBwdHMgZm9yCisgICAgICAgKiBjaGVja2luZyB3aGVuIHdlIG5lZWQgdG8gc2VuZCBTUFMvUFBTIGJ1dCBjb252ZXJ0IHRvIHJ1bm5pbmdfdGltZQorICAgICAgICogZmlyc3QgKi8KKyAgICAgIHJ0cGgyNjVwYXktPnNlbmRfdnBzX3Nwc19wcHMgPSBGQUxTRTsKKyAgICAgIHNlbnRfcHMgPSBUUlVFOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwaDI2NXBheSwgInNlbmRpbmcgVlBTL1NQUy9QUFMgYmVmb3JlIGN1cnJlbnQgZnJhbWUiKTsKKyAgICAgIHJldCA9CisgICAgICAgICAgZ3N0X3J0cF9oMjY1X3BheV9zZW5kX3Zwc19zcHNfcHBzIChiYXNlcGF5bG9hZCwgcnRwaDI2NXBheSwgZHRzLCBwdHMpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChwYXlidWYpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwYWNrZXRfbGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYWNrZXRfbGVuIChzaXplLCAwLCAwKTsKKworICAgIGlmIChwYWNrZXRfbGVuIDwgbXR1KSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBoMjY1cGF5LAorICAgICAgICAgICJOQUwgVW5pdCBmaXQgaW4gb25lIHBhY2tldCBkYXRhc2l6ZT0lZCBtdHU9JWQiLCBzaXplLCBtdHUpOworICAgICAgLyogd2lsbCBmaXQgaW4gb25lIHBhY2tldCAqLworCisgICAgICAvKiB1c2UgYnVmZmVyIGxpc3RzCisgICAgICAgKiBjcmVhdGUgYnVmZmVyIHdpdGhvdXQgcGF5bG9hZCBjb250YWluaW5nIG9ubHkgdGhlIFJUUCBoZWFkZXIKKyAgICAgICAqIChtZW1vcnkgYmxvY2sgYXQgaW5kZXggMCkgKi8KKyAgICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMCwgMCwgMCk7CisKKyAgICAgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0YnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKworICAgICAgLyogb25seSBzZXQgdGhlIG1hcmtlciBiaXQgb24gcGFja2V0cyBjb250YWluaW5nIGFjY2VzcyB1bml0cyAqLworICAgICAgaWYgKGkgPT0gcGF5YnVmcy0+bGVuIC0gMQorICAgICAgICAgICYmIHJ0cGgyNjVwYXktPmFsaWdubWVudCA9PSBHU1RfSDI2NV9BTElHTk1FTlRfQVUKKyAgICAgICAgICAmJiBJU19BQ0NFU1NfVU5JVCAobmFsVHlwZSkpIHsKKyAgICAgICAgZ3N0X3J0cF9idWZmZXJfc2V0X21hcmtlciAoJnJ0cCwgMSk7CisgICAgICB9CisKKyAgICAgIC8qIHRpbWVzdGFtcCB0aGUgb3V0YnVmZmVyICovCisgICAgICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA9IHB0czsKKyAgICAgIEdTVF9CVUZGRVJfRFRTIChvdXRidWYpID0gZHRzOworCisgICAgICAvKiBpbnNlcnQgcGF5bG9hZCBtZW1vcnkgYmxvY2sgKi8KKyAgICAgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHBoMjY1cGF5LCBvdXRidWYsIHBheWJ1Zik7CisgICAgICBvdXRidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAob3V0YnVmLCBwYXlidWYpOworCisgICAgICBvdXRsaXN0ID0gZ3N0X2J1ZmZlcl9saXN0X25ldyAoKTsKKworICAgICAgLyogYWRkIHRoZSBidWZmZXIgdG8gdGhlIGJ1ZmZlciBsaXN0ICovCisgICAgICBnc3RfYnVmZmVyX2xpc3RfYWRkIChvdXRsaXN0LCBvdXRidWYpOworCisgICAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgICAgIC8qIHB1c2ggdGhlIGxpc3QgdG8gdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgcGlwZSAqLworICAgICAgcmV0ID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfcHVzaF9saXN0IChiYXNlcGF5bG9hZCwgb3V0bGlzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGZyYWdtZW50YXRpb24gVW5pdHMgKi8KKyAgICAgIGd1aW50IGxpbWl0ZWRTaXplOworICAgICAgaW50IGlpID0gMCwgc3RhcnQgPSAxLCBlbmQgPSAwLCBwb3MgPSAwOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChiYXNlcGF5bG9hZCwKKyAgICAgICAgICAiTkFMIFVuaXQgRE9FUyBOT1QgZml0IGluIG9uZSBwYWNrZXQgZGF0YXNpemU9JWQgbXR1PSVkIiwgc2l6ZSwgbXR1KTsKKworICAgICAgcG9zICs9IDI7CisgICAgICBzaXplIC09IDI7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLCAiVXNpbmcgRlUgZnJhZ21lbnRhdGlvbiBmb3IgZGF0YSBzaXplPSVkIiwKKyAgICAgICAgICBzaXplKTsKKworICAgICAgLyogV2Uga2VlcCAzIGJ5dGVzIGZvciBQYXlsb2FkSGRyIGFuZCBGVSBIZWFkZXIgKi8KKyAgICAgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYXlsb2FkX2xlbiAobXR1IC0gMywgMCwgMCk7CisKKyAgICAgIG91dGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3ICgpOworCisgICAgICB3aGlsZSAoZW5kID09IDApIHsKKyAgICAgICAgbGltaXRlZFNpemUgPSBzaXplIDwgcGF5bG9hZF9sZW4gPyBzaXplIDogcGF5bG9hZF9sZW47CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLAorICAgICAgICAgICAgIkluc2lkZSAgRlUgZnJhZ21lbnRhdGlvbiBsaW1pdGVkU2l6ZT0lZCBpdGVyYXRpb249JWQiLCBsaW1pdGVkU2l6ZSwKKyAgICAgICAgICAgIGlpKTsKKworICAgICAgICAvKiB1c2UgYnVmZmVyIGxpc3RzCisgICAgICAgICAqIGNyZWF0ZSBidWZmZXIgd2l0aG91dCBwYXlsb2FkIGNvbnRhaW5pbmcgb25seSB0aGUgUlRQIGhlYWRlcgorICAgICAgICAgKiAobWVtb3J5IGJsb2NrIGF0IGluZGV4IDApLCBhbmQgd2l0aCBzcGFjZSBmb3IgUGF5bG9hZEhkciBhbmQgRlUgaGVhZGVyICovCisgICAgICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMywgMCwgMCk7CisKKyAgICAgICAgZ3N0X3J0cF9idWZmZXJfbWFwIChvdXRidWYsIEdTVF9NQVBfV1JJVEUsICZydHApOworCisgICAgICAgIEdTVF9CVUZGRVJfRFRTIChvdXRidWYpID0gZHRzOworICAgICAgICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA9IHB0czsKKyAgICAgICAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKworICAgICAgICBpZiAobGltaXRlZFNpemUgPT0gc2l6ZSkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLCAiZW5kIHNpemU9JWQgaXRlcmF0aW9uPSVkIiwgc2l6ZSwgaWkpOworICAgICAgICAgIGVuZCA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvKiBQYXlsb2FkSGRyICh0eXBlID0gNDkpICovCisgICAgICAgIHBheWxvYWRbMF0gPSAobmFsSGVhZGVyWzBdICYgMHg4MSkgfCAoNDkgPDwgMSk7CisgICAgICAgIHBheWxvYWRbMV0gPSBuYWxIZWFkZXJbMV07CisKKyAgICAgICAgLyogc2V0IHRoZSBtYXJrZXIgYml0IG9uIHRoZSBsYXN0IHBhY2tldCBvZiBhbiBhY2Nlc3MgdW5pdCAqLworICAgICAgICBpZiAoSVNfQUNDRVNTX1VOSVQgKG5hbFR5cGUpKSB7CisgICAgICAgICAgZ3N0X3J0cF9idWZmZXJfc2V0X21hcmtlciAoJnJ0cCwKKyAgICAgICAgICAgICAgZW5kICYmIGkgPT0gcGF5YnVmcy0+bGVuIC0gMQorICAgICAgICAgICAgICAmJiBydHBoMjY1cGF5LT5hbGlnbm1lbnQgPT0gR1NUX0gyNjVfQUxJR05NRU5UX0FVKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZVIEhlYWRlciAqLworICAgICAgICBwYXlsb2FkWzJdID0gKHN0YXJ0IDw8IDcpIHwgKGVuZCA8PCA2KSB8IChuYWxUeXBlICYgMHgzZik7CisKKyAgICAgICAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgICAgICAgIC8qIGluc2VydCBwYXlsb2FkIG1lbW9yeSBibG9jayAqLworICAgICAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwaDI2NXBheSwgb3V0YnVmLCBwYXlidWYpOworICAgICAgICBnc3RfYnVmZmVyX2NvcHlfaW50byAob3V0YnVmLCBwYXlidWYsIEdTVF9CVUZGRVJfQ09QWV9NRU1PUlksIHBvcywKKyAgICAgICAgICAgIGxpbWl0ZWRTaXplKTsKKyAgICAgICAgLyogYWRkIHRoZSBidWZmZXIgdG8gdGhlIGJ1ZmZlciBsaXN0ICovCisgICAgICAgIGdzdF9idWZmZXJfbGlzdF9hZGQgKG91dGxpc3QsIG91dGJ1Zik7CisKKyAgICAgICAgc2l6ZSAtPSBsaW1pdGVkU2l6ZTsKKyAgICAgICAgcG9zICs9IGxpbWl0ZWRTaXplOworICAgICAgICBpaSsrOworICAgICAgICBzdGFydCA9IDA7CisgICAgICB9CisKKyAgICAgIHJldCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2hfbGlzdCAoYmFzZXBheWxvYWQsIG91dGxpc3QpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocGF5YnVmKTsKKyAgICB9CisgIH0KKworICBnX3B0cl9hcnJheV9mcmVlIChwYXlidWZzLCBUUlVFKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9oMjY1X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UnRwSDI2NVBheSAqcnRwaDI2NXBheTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIGdzaXplIHNpemU7CisgIGd1aW50IG5hbF9sZW4sIGk7CisgIEdzdE1hcEluZm8gbWFwOworICBjb25zdCBndWludDggKmRhdGE7CisgIEdzdENsb2NrVGltZSBkdHMsIHB0czsKKyAgR0FycmF5ICpuYWxfcXVldWU7CisgIGdib29sZWFuIGhldmM7CisgIEdzdEJ1ZmZlciAqcGF5YnVmID0gTlVMTDsKKyAgZ3NpemUgc2tpcDsKKworICBydHBoMjY1cGF5ID0gR1NUX1JUUF9IMjY1X1BBWSAoYmFzZXBheWxvYWQpOworCisgIC8qIHRoZSBpbnB1dCBidWZmZXIgY29udGFpbnMgb25lIG9yIG1vcmUgTkFMIHVuaXRzICovCisKKyAgaGV2YyA9IChydHBoMjY1cGF5LT5zdHJlYW1fZm9ybWF0ID09IEdTVF9IMjY1X1NUUkVBTV9GT1JNQVRfSEVWMSkKKyAgICAgIHx8IChydHBoMjY1cGF5LT5zdHJlYW1fZm9ybWF0ID09IEdTVF9IMjY1X1NUUkVBTV9GT1JNQVRfSFZDMSk7CisKKyAgaWYgKGhldmMpIHsKKyAgICAvKiBJbiBoZXZjIG1vZGUsIHRoZXJlIGlzIG5vIGFkYXB0ZXIsIHNvIG5vdGhpbmcgdG8gZmx1c2ggKi8KKyAgICBpZiAoYnVmZmVyID09IE5VTEwpCisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBkYXRhID0gbWFwLmRhdGE7CisgICAgc2l6ZSA9IG1hcC5zaXplOworICAgIHB0cyA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICAgIGR0cyA9IEdTVF9CVUZGRVJfRFRTIChidWZmZXIpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLCAiZ290ICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMiLCBzaXplKTsKKyAgfSBlbHNlIHsKKyAgICBkdHMgPSBnc3RfYWRhcHRlcl9wcmV2X2R0cyAocnRwaDI2NXBheS0+YWRhcHRlciwgTlVMTCk7CisgICAgcHRzID0gZ3N0X2FkYXB0ZXJfcHJldl9wdHMgKHJ0cGgyNjVwYXktPmFkYXB0ZXIsIE5VTEwpOworICAgIGlmIChidWZmZXIpIHsKKyAgICAgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGR0cykpCisgICAgICAgIGR0cyA9IEdTVF9CVUZGRVJfRFRTIChidWZmZXIpOworICAgICAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAocHRzKSkKKyAgICAgICAgcHRzID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcik7CisKKyAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGgyNjVwYXktPmFkYXB0ZXIsIGJ1ZmZlcik7CisgICAgfQorICAgIHNpemUgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cGgyNjVwYXktPmFkYXB0ZXIpOworICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZSBpZiB0aGUgYWRhcHRlciBpcyBlbXB0eSwgZS5nLiBvbiBFT1MgKi8KKyAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgIGRhdGEgPSBnc3RfYWRhcHRlcl9tYXAgKHJ0cGgyNjVwYXktPmFkYXB0ZXIsIHNpemUpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLAorICAgICAgICAiZ290ICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgKCUiIEdfR1NJWkVfRk9STUFUICIpIiwgc2l6ZSwKKyAgICAgICAgYnVmZmVyID8gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSA6IDApOworICB9CisKKyAgcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgLyogbm93IGxvb3Agb3ZlciBhbGwgTkFMIHVuaXRzIGFuZCBwdXQgdGhlbSBpbiBhIHBhY2tldAorICAgKiBGSVhNRSwgd2Ugc2hvdWxkIHJlYWxseSB0cnkgdG8gcGFjayBtdWx0aXBsZSBOQUwgdW5pdHMgaW50byBvbmUgUlRQIHBhY2tldAorICAgKiBpZiB3ZSBjYW4sIGVzcGVjaWFsbHkgZm9yIHRoZSBjb25maWcgcGFja2V0cyB0aGF0IHdvbnQndCBjYXVzZSBkZWNvZGVyCisgICAqIGxhdGVuY3kuICovCisgIGlmIChoZXZjKSB7CisgICAgZ3VpbnQgbmFsX2xlbmd0aF9zaXplOworICAgIGdzaXplIG9mZnNldCA9IDA7CisgICAgR1B0ckFycmF5ICpwYXlidWZzOworCisgICAgcGF5YnVmcyA9IGdfcHRyX2FycmF5X25ldyAoKTsKKyAgICBuYWxfbGVuZ3RoX3NpemUgPSBydHBoMjY1cGF5LT5uYWxfbGVuZ3RoX3NpemU7CisKKyAgICB3aGlsZSAoc2l6ZSA+IG5hbF9sZW5ndGhfc2l6ZSkgeworICAgICAgZ2ludCBpOworCisgICAgICBuYWxfbGVuID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuYWxfbGVuZ3RoX3NpemU7IGkrKykgeworICAgICAgICBuYWxfbGVuID0gKChuYWxfbGVuIDw8IDgpICsgZGF0YVtpXSk7CisgICAgICB9CisKKyAgICAgIC8qIHNraXAgdGhlIGxlbmd0aCBieXRlcywgbWFrZSBzdXJlIHdlIGRvbid0IHJ1biBwYXN0IHRoZSBidWZmZXIgc2l6ZSAqLworICAgICAgZGF0YSArPSBuYWxfbGVuZ3RoX3NpemU7CisgICAgICBvZmZzZXQgKz0gbmFsX2xlbmd0aF9zaXplOworICAgICAgc2l6ZSAtPSBuYWxfbGVuZ3RoX3NpemU7CisKKyAgICAgIGlmIChzaXplID49IG5hbF9sZW4pIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXBheWxvYWQsICJnb3QgTkFMIG9mIHNpemUgJXUiLCBuYWxfbGVuKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5hbF9sZW4gPSBzaXplOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChiYXNlcGF5bG9hZCwgImdvdCBpbmNvbXBsZXRlIE5BTCBvZiBzaXplICV1IiwKKyAgICAgICAgICAgIG5hbF9sZW4pOworICAgICAgfQorCisgICAgICBwYXlidWYgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIG9mZnNldCwKKyAgICAgICAgICBuYWxfbGVuKTsKKyAgICAgIGdfcHRyX2FycmF5X2FkZCAocGF5YnVmcywgcGF5YnVmKTsKKworICAgICAgZGF0YSArPSBuYWxfbGVuOworICAgICAgb2Zmc2V0ICs9IG5hbF9sZW47CisgICAgICBzaXplIC09IG5hbF9sZW47CisgICAgfQorICAgIHJldCA9IGdzdF9ydHBfaDI2NV9wYXlfcGF5bG9hZF9uYWwgKGJhc2VwYXlsb2FkLCBwYXlidWZzLCBkdHMsIHB0cyk7CisgIH0gZWxzZSB7CisgICAgZ3VpbnQgbmV4dDsKKyAgICBnYm9vbGVhbiB1cGRhdGUgPSBGQUxTRTsKKyAgICBHUHRyQXJyYXkgKnBheWJ1ZnM7CisKKyAgICAvKiBnZXQgb2Zmc2V0IG9mIGZpcnN0IHN0YXJ0IGNvZGUgKi8KKyAgICBuZXh0ID0gbmV4dF9zdGFydF9jb2RlIChkYXRhLCBzaXplKTsKKworICAgIC8qIHNraXAgdG8gc3RhcnQgY29kZSwgaWYgbm8gc3RhcnQgY29kZSBpcyBmb3VuZCwgbmV4dCB3aWxsIGJlIHNpemUgYW5kIHdlCisgICAgICogd2lsbCBub3QgY29sbGVjdCBkYXRhLiAqLworICAgIGRhdGEgKz0gbmV4dDsKKyAgICBzaXplIC09IG5leHQ7CisgICAgbmFsX3F1ZXVlID0gcnRwaDI2NXBheS0+cXVldWU7CisgICAgc2tpcCA9IG5leHQ7CisKKyAgICAvKiBhcnJheSBtdXN0IGJlIGVtcHR5IHdoZW4gd2UgZ2V0IGhlcmUgKi8KKyAgICBnX2Fzc2VydCAobmFsX3F1ZXVlLT5sZW4gPT0gMCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChiYXNlcGF5bG9hZCwKKyAgICAgICAgImZvdW5kIGZpcnN0IHN0YXJ0IGF0ICV1LCBieXRlcyBsZWZ0ICUiIEdfR1NJWkVfRk9STUFULCBuZXh0LCBzaXplKTsKKworICAgIHBheWJ1ZnMgPSBnX3B0cl9hcnJheV9uZXcgKCk7CisKKyAgICAvKiBmaXJzdCBwYXNzIHRvIGxvY2F0ZSBOQUxzIGFuZCBwYXJzZSBWUFMvU1BTL1BQUyAqLworICAgIHdoaWxlIChzaXplID4gNCkgeworICAgICAgLyogc2tpcCBzdGFydCBjb2RlICovCisgICAgICBkYXRhICs9IDM7CisgICAgICBzaXplIC09IDM7CisKKyAgICAgIC8qIHVzZSBuZXh0X3N0YXJ0X2NvZGUoKSB0byBzY2FuIGJ1ZmZlci4KKyAgICAgICAqIG5leHRfc3RhcnRfY29kZSgpIHJldHVybnMgdGhlIG9mZnNldCBpbiBkYXRhLAorICAgICAgICogc3RhcnRpbmcgZnJvbSB6ZXJvIHRvIHRoZSBmaXJzdCBieXRlIG9mIDAuMC4wLjEKKyAgICAgICAqIElmIG5vIHN0YXJ0IGNvZGUgaXMgZm91bmQsIGl0IHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZQorICAgICAgICogJ3NpemUnIHBhcmFtZXRlci4KKyAgICAgICAqIGRhdGEgaXMgdW5jaGFuZ2VkIGJ5IHRoZSBjYWxsIHRvIG5leHRfc3RhcnRfY29kZSgpCisgICAgICAgKi8KKyAgICAgIG5leHQgPSBuZXh0X3N0YXJ0X2NvZGUgKGRhdGEsIHNpemUpOworCisgICAgICBpZiAobmV4dCA9PSBzaXplICYmIGJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIC8qIERpZG4ndCBmaW5kIHRoZSBzdGFydCBvZiBuZXh0IE5BTCBhbmQgaXQncyBub3QgRU9TLAorICAgICAgICAgKiBoYW5kbGUgaXQgbmV4dCB0aW1lICovCisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvKiBuYWwgbGVuZ3RoIGlzIGRpc3RhbmNlIHRvIG5leHQgc3RhcnQgY29kZSAqLworICAgICAgbmFsX2xlbiA9IG5leHQ7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VwYXlsb2FkLCAiZm91bmQgbmV4dCBzdGFydCBhdCAldSBvZiBzaXplICV1IiwgbmV4dCwKKyAgICAgICAgICBuYWxfbGVuKTsKKworICAgICAgLyogV2Uga25vdyBvdXIgc3RyZWFtIGlzIGEgdmFsaWQgSDI2NSBOQUwgcGFja2V0LAorICAgICAgICogZ28gcGFyc2UgaXQgZm9yIFZQUy9TUFMvUFBTIHRvIGVucmljaCB0aGUgY2FwcyAqLworICAgICAgLyogb3JkZXI6IG1ha2Ugc3VyZSB0byBjaGVjayBuYWwgKi8KKyAgICAgIHVwZGF0ZSA9IGdzdF9ydHBfaDI2NV9wYXlfZGVjb2RlX25hbCAocnRwaDI2NXBheSwgZGF0YSwgbmFsX2xlbiwgZHRzLCBwdHMpCisgICAgICAgICAgfHwgdXBkYXRlOworCisgICAgICAvKiBtb3ZlIHRvIG5leHQgTkFMIHBhY2tldCAqLworICAgICAgZGF0YSArPSBuYWxfbGVuOworICAgICAgc2l6ZSAtPSBuYWxfbGVuOworCisgICAgICBnX2FycmF5X2FwcGVuZF92YWwgKG5hbF9xdWV1ZSwgbmFsX2xlbik7CisgICAgfQorCisgICAgLyogaWYgaGFzIG5ldyBWUFMsIFNQUyAmIFBQUywgdXBkYXRlIHRoZSBvdXRwdXQgY2FwcyAqLworICAgIGlmIChHX1VOTElLRUxZICh1cGRhdGUpKQorICAgICAgaWYgKCFnc3RfcnRwX2gyNjVfcGF5X3NldF92cHNfc3BzX3BwcyAoYmFzZXBheWxvYWQpKQorICAgICAgICBnb3RvIGNhcHNfcmVqZWN0ZWQ7CisKKyAgICAvKiBzZWNvbmQgcGFzcyB0byBwYXlsb2FkIGFuZCBwdXNoICovCisKKyAgICBpZiAobmFsX3F1ZXVlLT5sZW4gIT0gMCkKKyAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChydHBoMjY1cGF5LT5hZGFwdGVyLCBza2lwKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYWxfcXVldWUtPmxlbjsgaSsrKSB7CisgICAgICBndWludCBzaXplOworCisgICAgICBuYWxfbGVuID0gZ19hcnJheV9pbmRleCAobmFsX3F1ZXVlLCBndWludCwgaSk7CisgICAgICAvKiBza2lwIHN0YXJ0IGNvZGUgKi8KKyAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChydHBoMjY1cGF5LT5hZGFwdGVyLCAzKTsKKworICAgICAgLyogVHJpbSB0aGUgZW5kIHVubGVzcyB3ZSdyZSB0aGUgbGFzdCBOQUwgaW4gdGhlIHN0cmVhbS4KKyAgICAgICAqIEluIGNhc2Ugd2UncmUgbm90IGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3ZSBrbm93IHRoZSBuZXh0IGJsb2NrCisgICAgICAgKiBzdGFydHMgd2l0aCAweDAwMDAwMSBzbyBhbGwgdGhlIDB4MDAgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGlzIG9uZSBhcmUKKyAgICAgICAqIHRyYWlsaW5nIDB4MCB0aGF0IGNhbiBiZSBkaXNjYXJkZWQgKi8KKyAgICAgIHNpemUgPSBuYWxfbGVuOworICAgICAgZGF0YSA9IGdzdF9hZGFwdGVyX21hcCAocnRwaDI2NXBheS0+YWRhcHRlciwgc2l6ZSk7CisgICAgICBpZiAoaSArIDEgIT0gbmFsX3F1ZXVlLT5sZW4gfHwgYnVmZmVyICE9IE5VTEwpCisgICAgICAgIGZvciAoOyBzaXplID4gMSAmJiBkYXRhW3NpemUgLSAxXSA9PSAweDA7IHNpemUtLSkKKyAgICAgICAgICAvKiBza2lwICovIDsKKworICAgICAgLyogRklYTUU6IFdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgbmV4dCBwYWNrZXQgb3IgRU9TIHRvCisgICAgICAgKiBhY3R1YWxseSBwYXlsb2FkIHRoZSBOQUwgc28gd2UgY2FuIGtub3cgaWYgdGhlIGN1cnJlbnQgTkFMIGlzCisgICAgICAgKiB0aGUgbGFzdCBvbmUgb2YgYW4gYWNjZXNzIHVuaXQgb3Igbm90IGlmIHdlIGFyZSBpbiBieXRlc3RyZWFtIG1vZGUKKyAgICAgICAqLworCisgICAgICBwYXlidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwaDI2NXBheS0+YWRhcHRlciwgc2l6ZSk7CisgICAgICBnX2Fzc2VydCAocGF5YnVmKTsKKyAgICAgIGdfcHRyX2FycmF5X2FkZCAocGF5YnVmcywgcGF5YnVmKTsKKworICAgICAgLyogbW92ZSB0byBuZXh0IE5BTCBwYWNrZXQgKi8KKyAgICAgIC8qIFNraXBzIHRoZSB0cmFpbGluZyB6ZXJvcyAqLworICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHJ0cGgyNjVwYXktPmFkYXB0ZXIsIG5hbF9sZW4gLSBzaXplKTsKKyAgICB9CisgICAgLyogcHV0IHRoZSBkYXRhIGluIG9uZSBvciBtb3JlIFJUUCBwYWNrZXRzICovCisgICAgcmV0ID0gZ3N0X3J0cF9oMjY1X3BheV9wYXlsb2FkX25hbCAoYmFzZXBheWxvYWQsIHBheWJ1ZnMsIGR0cywgcHRzKTsKKyAgICBnX2FycmF5X3NldF9zaXplIChuYWxfcXVldWUsIDApOworICB9CisKK2RvbmU6CisgIGlmIChoZXZjKSB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICB9IGVsc2UgeworICAgIGdzdF9hZGFwdGVyX3VubWFwIChydHBoMjY1cGF5LT5hZGFwdGVyKTsKKyAgfQorCisgIHJldHVybiByZXQ7CisKK2NhcHNfcmVqZWN0ZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGJhc2VwYXlsb2FkLCAiQ291bGQgbm90IHNldCBvdXRjYXBzIik7CisgICAgZ19hcnJheV9zZXRfc2l6ZSAobmFsX3F1ZXVlLCAwKTsKKyAgICByZXQgPSBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2gyNjVfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdzdFJ0cEgyNjVQYXkgKnJ0cGgyNjVwYXkgPSBHU1RfUlRQX0gyNjVfUEFZIChwYXlsb2FkKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGgyNjVwYXktPmFkYXB0ZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU06CisgICAgICBzID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiR3N0Rm9yY2VLZXlVbml0IikpIHsKKyAgICAgICAgZ2Jvb2xlYW4gcmVzZW5kX2NvZGVjX2RhdGE7CisKKyAgICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2Jvb2xlYW4gKHMsICJhbGwtaGVhZGVycyIsCisgICAgICAgICAgICAgICAgJnJlc2VuZF9jb2RlY19kYXRhKSAmJiByZXNlbmRfY29kZWNfZGF0YSkKKyAgICAgICAgICBydHBoMjY1cGF5LT5zZW5kX3Zwc19zcHNfcHBzID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICB7CisgICAgICAvKiBjYWxsIGhhbmRsZV9idWZmZXIgd2l0aCBOVUxMIHRvIGZsdXNoIGxhc3QgTkFMIGZyb20gYWRhcHRlcgorICAgICAgICogaW4gYnl0ZS1zdHJlYW0gbW9kZQorICAgICAgICovCisgICAgICBnc3RfcnRwX2gyNjVfcGF5X2hhbmRsZV9idWZmZXIgKHBheWxvYWQsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX1NUUkVBTV9TVEFSVDoKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGgyNjVwYXksCisgICAgICAgICAgIk5ldyBzdHJlYW0gZGV0ZWN0ZWQgPT4gQ2xlYXIgVlBTLCBTUFMgYW5kIFBQUyIpOworICAgICAgZ3N0X3J0cF9oMjY1X3BheV9jbGVhcl92cHNfc3BzX3BwcyAocnRwaDI2NXBheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXMgPSBHU1RfUlRQX0JBU0VfUEFZTE9BRF9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAocGF5bG9hZCwgZXZlbnQpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9oMjY1X3BheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdFJ0cEgyNjVQYXkgKnJ0cGgyNjVwYXkgPSBHU1RfUlRQX0gyNjVfUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgcnRwaDI2NXBheS0+c2VuZF92cHNfc3BzX3BwcyA9IEZBTFNFOworICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGgyNjVwYXktPmFkYXB0ZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIHJ0cGgyNjVwYXktPmxhc3RfdnBzX3Nwc19wcHMgPSAtMTsKKyAgICAgIGdzdF9ydHBfaDI2NV9wYXlfY2xlYXJfdnBzX3Nwc19wcHMgKHJ0cGgyNjVwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaDI2NV9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cEgyNjVQYXkgKnJ0cGgyNjVwYXk7CisKKyAgcnRwaDI2NXBheSA9IEdTVF9SVFBfSDI2NV9QQVkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0NPTkZJR19JTlRFUlZBTDoKKyAgICAgIHJ0cGgyNjVwYXktPnZwc19zcHNfcHBzX2ludGVydmFsID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2gyNjVfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBIMjY1UGF5ICpydHBoMjY1cGF5OworCisgIHJ0cGgyNjVwYXkgPSBHU1RfUlRQX0gyNjVfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DT05GSUdfSU5URVJWQUw6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBydHBoMjY1cGF5LT52cHNfc3BzX3Bwc19pbnRlcnZhbCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2gyNjVfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwaDI2NXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9IMjY1X1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGgyNjVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwaDI2NXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNDJmYmEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGgyNjVwYXkuaApAQCAtMCwwICsxLDc4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDE0PiBKdXJnZW4gU2xvd2FjayA8anVyZ2Vuc2xvd2Fja0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfSDI2NV9QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9IMjY1X1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorI2luY2x1ZGUgImdzdHJ0cGgyNjV0eXBlcy5oIgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9IMjY1X1BBWSBcCisgIChnc3RfcnRwX2gyNjVfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfSDI2NV9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfSDI2NV9QQVksR3N0UnRwSDI2NVBheSkpCisjZGVmaW5lIEdTVF9SVFBfSDI2NV9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0gyNjVfUEFZLEdzdFJ0cEgyNjVQYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfSDI2NV9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfSDI2NV9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0gyNjVfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9IMjY1X1BBWSkpCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2NVBheSBHc3RSdHBIMjY1UGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEgyNjVQYXlDbGFzcyBHc3RSdHBIMjY1UGF5Q2xhc3M7CisKK3R5cGVkZWYgZW51bQoreworICBHU1RfSDI2NV9BTElHTk1FTlRfVU5LTk9XTiwKKyAgR1NUX0gyNjVfQUxJR05NRU5UX05BTCwKKyAgR1NUX0gyNjVfQUxJR05NRU5UX0FVCit9IEdzdEgyNjVBbGlnbm1lbnQ7CisKK3N0cnVjdCBfR3N0UnRwSDI2NVBheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCBwYXlsb2FkOworCisgIEdQdHJBcnJheSAqc3BzLCAqcHBzLCAqdnBzOworCisgIEdzdEgyNjVTdHJlYW1Gb3JtYXQgc3RyZWFtX2Zvcm1hdDsKKyAgR3N0SDI2NUFsaWdubWVudCBhbGlnbm1lbnQ7CisgIGd1aW50IG5hbF9sZW5ndGhfc2l6ZTsKKyAgR0FycmF5ICpxdWV1ZTsKKworICBHc3RBZGFwdGVyICphZGFwdGVyOworCisgIGdpbnQgdnBzX3Nwc19wcHNfaW50ZXJ2YWw7CisgIGdib29sZWFuIHNlbmRfdnBzX3Nwc19wcHM7CisgIEdzdENsb2NrVGltZSBsYXN0X3Zwc19zcHNfcHBzOworfTsKKworc3RydWN0IF9Hc3RSdHBIMjY1UGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX2gyNjVfcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9oMjY1X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9SVFBfSDI2NV9QQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGgyNjV0eXBlcy5oIGIvZ3N0L3J0cC9nc3RydHBoMjY1dHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjY5MmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBoMjY1dHlwZXMuaApAQCAtMCwwICsxLDc2IEBACisvKiBHU3RyZWFtZXIgSC4yNjUgcGFyc2VyIHR5cGVzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxMyBTcmVlcmVuaiBCYWxhY2hhbmRyYW4gPHNyZWVyZW5qLmJhbGFjaGFuZHJhbkBpbnRlbC5jb20+CisgKgorICogIENvbnRhY3Q6IFNyZWVyZW5qIEJhbGFjaGFuZHJhbiA8c3JlZXJlbmouYmFsYWNoYW5kcmFuQGludGVsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9IMjY1X1RZUEVTX0hfXworI2RlZmluZSBfX0dTVF9SVFBfSDI2NV9UWVBFU19IX18KKworI2luY2x1ZGUgPGdsaWIuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIGVudW0KK3sKKyAgR1NUX0gyNjVfTkFMX1NMSUNFX1RSQUlMX04gICAgPSAwLAorICBHU1RfSDI2NV9OQUxfU0xJQ0VfVFJBSUxfUiAgICA9IDEsCisgIEdTVF9IMjY1X05BTF9TTElDRV9UU0FfTiAgICAgID0gMiwKKyAgR1NUX0gyNjVfTkFMX1NMSUNFX1RTQV9SICAgICAgPSAzLAorICBHU1RfSDI2NV9OQUxfU0xJQ0VfU1RTQV9OICAgICA9IDQsCisgIEdTVF9IMjY1X05BTF9TTElDRV9TVFNBX1IgICAgID0gNSwKKyAgR1NUX0gyNjVfTkFMX1NMSUNFX1JBRExfTiAgICAgPSA2LAorICBHU1RfSDI2NV9OQUxfU0xJQ0VfUkFETF9SICAgICA9IDcsCisgIEdTVF9IMjY1X05BTF9TTElDRV9SQVNMX04gICAgID0gOCwKKyAgR1NUX0gyNjVfTkFMX1NMSUNFX1JBU0xfUiAgICAgPSA5LAorICBHU1RfSDI2NV9OQUxfU0xJQ0VfQkxBX1dfTFAgICA9IDE2LAorICBHU1RfSDI2NV9OQUxfU0xJQ0VfQkxBX1dfUkFETCA9IDE3LAorICBHU1RfSDI2NV9OQUxfU0xJQ0VfQkxBX05fTFAgICA9IDE4LAorICBHU1RfSDI2NV9OQUxfU0xJQ0VfSURSX1dfUkFETCA9IDE5LAorICBHU1RfSDI2NV9OQUxfU0xJQ0VfSURSX05fTFAgICA9IDIwLAorICBHU1RfSDI2NV9OQUxfU0xJQ0VfQ1JBX05VVCAgICA9IDIxLAorICBHU1RfSDI2NV9OQUxfVlBTICAgICAgICAgICAgICA9IDMyLAorICBHU1RfSDI2NV9OQUxfU1BTICAgICAgICAgICAgICA9IDMzLAorICBHU1RfSDI2NV9OQUxfUFBTICAgICAgICAgICAgICA9IDM0LAorICBHU1RfSDI2NV9OQUxfQVVEICAgICAgICAgICAgICA9IDM1LAorICBHU1RfSDI2NV9OQUxfRU9TICAgICAgICAgICAgICA9IDM2LAorICBHU1RfSDI2NV9OQUxfRU9CICAgICAgICAgICAgICA9IDM3LAorICBHU1RfSDI2NV9OQUxfRkQgICAgICAgICAgICAgICA9IDM4LAorICBHU1RfSDI2NV9OQUxfUFJFRklYX1NFSSAgICAgICA9IDM5LAorICBHU1RfSDI2NV9OQUxfU1VGRklYX1NFSSAgICAgICA9IDQwCit9IEdzdEgyNjVOYWxVbml0VHlwZTsKKworI2RlZmluZSBSRVNFUlZFRF9OT05fSVJBUF9TVUJMQVlFUl9OQUxfVFlQRV9NSU4gMTAKKyNkZWZpbmUgUkVTRVJWRURfTk9OX0lSQVBfU1VCTEFZRVJfTkFMX1RZUEVfTUFYIDE1CisKKyNkZWZpbmUgUkVTRVJWRURfSVJBUF9OQUxfVFlQRV9NSU4gMjIKKyNkZWZpbmUgUkVTRVJWRURfSVJBUF9OQUxfVFlQRV9NQVggMjMKKworI2RlZmluZSBSRVNFUlZFRF9OT05fSVJBUF9OQUxfVFlQRV9NSU4gMjQKKyNkZWZpbmUgUkVTRVJWRURfTk9OX0lSQVBfTkFMX1RZUEVfTUFYIDMxCisKKyNkZWZpbmUgUkVTRVJWRURfTk9OX1ZDTF9OQUxfVFlQRV9NSU4gNDEKKyNkZWZpbmUgUkVTRVJWRURfTk9OX1ZDTF9OQUxfVFlQRV9NQVggNDcKKworI2RlZmluZSBVTlNQRUNJRklFRF9OT05fVkNMX05BTF9UWVBFX01JTiA0OAorI2RlZmluZSBVTlNQRUNJRklFRF9OT05fVkNMX05BTF9UWVBFX01BWCA2MworCitHX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwaWxiY2RlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZGU0ODMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5jCkBAIC0wLDAgKzEsMjM3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFBoaWxpcHBlIEtoYWxhZiA8YnVyZ2VyQHNwZWVkeS5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgImdzdHJ0cGlsYmNkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKKy8qIFJ0cGlMQkNEZXBheSBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKKyNkZWZpbmUgREVGQVVMVF9NT0RFIEdTVF9JTEJDX01PREVfMzAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTU9ERQorfTsKKworLyogRklYTUUsIG1vZGUgc2hvdWxkIGJlIHN0cmluZyBiZWNhdXNlIGl0IGlzIGEgcGFyYW1ldGVyIGluIFNEUCBmbXRwICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9pbGJjX2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiSUxCQ1wiIikKKyAgICAvKiAibW9kZSA9IChzdHJpbmcpIHsgXCIyMFwiLCBcIjMwXCIgfSIgKi8KKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9pbGJjX2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1pTEJDLCAiICJtb2RlID0gKGludCkgeyAyMCwgMzAgfSIpCisgICAgKTsKKworc3RhdGljIHZvaWQgZ3N0X2lsYmNfZGVwYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2lsYmNfZGVwYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX2lsYmNfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaWxiY19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworI2RlZmluZSBnc3RfcnRwX2lsYmNfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UlRQaUxCQ0RlcGF5LCBnc3RfcnRwX2lsYmNfZGVwYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworI2RlZmluZSBHU1RfVFlQRV9JTEJDX01PREUgKGdzdF9pbGJjX21vZGVfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X2lsYmNfbW9kZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIGlsYmNfbW9kZV90eXBlID0gMDsKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgaWxiY19tb2Rlc1tdID0geworICAgIHtHU1RfSUxCQ19NT0RFXzIwLCAiMjBtcyBmcmFtZXMiLCAiMjBtcyJ9LAorICAgIHtHU1RfSUxCQ19NT0RFXzMwLCAiMzBtcyBmcmFtZXMiLCAiMzBtcyJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIWlsYmNfbW9kZV90eXBlKSB7CisgICAgaWxiY19tb2RlX3R5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiaUxCQ01vZGUiLCBpbGJjX21vZGVzKTsKKyAgfQorICByZXR1cm4gaWxiY19tb2RlX3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2lsYmNfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UlRQaUxCQ0RlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9pbGJjX2RlcGF5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2lsYmNfZGVwYXlfZ2V0X3Byb3BlcnR5OworCisgIC8qIEZJWE1FLCBtb2RlIGlzIGluIHRoZSBjYXBzICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgibW9kZSIsICJNb2RlIiwgImlMQkMgZnJhbWUgbW9kZSIsCisgICAgICAgICAgR1NUX1RZUEVfSUxCQ19NT0RFLCBERUZBVUxUX01PREUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9pbGJjX2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfaWxiY19kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBpTEJDIGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBpTEJDIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAzOTUyKSIsCisgICAgICAiUGhpbGlwcGUgS2FsYWYgPHBoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51az4iKTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX2lsYmNfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2lsYmNfZGVwYXlfc2V0Y2FwczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaWxiY19kZXBheV9pbml0IChHc3RSVFBpTEJDRGVwYXkgKiBydHBpbGJjZGVwYXkpCit7CisgIC8qIFNldCBkZWZhdWx0IG1vZGUgKi8KKyAgcnRwaWxiY2RlcGF5LT5tb2RlID0gREVGQVVMVF9NT0RFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfaWxiY19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UlRQaUxCQ0RlcGF5ICpydHBpbGJjZGVwYXkgPSBHU1RfUlRQX0lMQkNfREVQQVkgKGRlcGF5bG9hZCk7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBnY2hhciAqbW9kZV9zdHIgPSBOVUxMOworICBnaW50IG1vZGUsIGNsb2NrX3JhdGU7CisgIGdib29sZWFuIHJldDsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBtb2RlID0gcnRwaWxiY2RlcGF5LT5tb2RlOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA4MDAwOworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIC8qIHBhcnNlIG1vZGUsIGlmIHdlIGNhbiAqLworICBtb2RlX3N0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAibW9kZSIpOworICBpZiAobW9kZV9zdHIpIHsKKyAgICBtb2RlID0gc3RydG9sIChtb2RlX3N0ciwgTlVMTCwgMTApOworICAgIGlmIChtb2RlICE9IDIwICYmIG1vZGUgIT0gMzApCisgICAgICBtb2RlID0gcnRwaWxiY2RlcGF5LT5tb2RlOworICB9CisKKyAgcnRwaWxiY2RlcGF5LT5tb2RlID0gbW9kZTsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtaUxCQyIsCisgICAgICAibW9kZSIsIEdfVFlQRV9JTlQsIHJ0cGlsYmNkZXBheS0+bW9kZSwgTlVMTCk7CisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNjYXBzKTsKKworICBHU1RfREVCVUcgKCJzZXQgY2FwcyBvbiBzb3VyY2U6ICUiIEdTVF9QVFJfRk9STUFUICIgKHJldD0lZCkiLCBzcmNjYXBzLCByZXQpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX2lsYmNfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ2Jvb2xlYW4gbWFya2VyOworCisgIG1hcmtlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgR1NUX0RFQlVHICgicHJvY2VzcyA6IGdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzLCBtYXJrICVkIHRzICV1IHNlcW4gJWQiLAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAocnRwLT5idWZmZXIpLCBtYXJrZXIsCisgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wIChydHApLCBnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxIChydHApKTsKKworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9idWZmZXIgKHJ0cCk7CisKKyAgaWYgKG1hcmtlciAmJiBvdXRidWYpIHsKKyAgICAvKiBtYXJrIHN0YXJ0IG9mIHRhbGtzcHVydCB3aXRoIFJFU1lOQyAqLworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1JFU1lOQyk7CisgIH0KKworICBpZiAob3V0YnVmKSB7CisgICAgZ3N0X3J0cF9kcm9wX25vbl9hdWRpb19tZXRhIChkZXBheWxvYWQsIG91dGJ1Zik7CisgIH0KKworICByZXR1cm4gb3V0YnVmOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2lsYmNfZGVwYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJUUGlMQkNEZXBheSAqcnRwaWxiY2RlcGF5ID0gR1NUX1JUUF9JTEJDX0RFUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgcnRwaWxiY2RlcGF5LT5tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2lsYmNfZGVwYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJUUGlMQkNEZXBheSAqcnRwaWxiY2RlcGF5ID0gR1NUX1JUUF9JTEJDX0RFUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHJ0cGlsYmNkZXBheS0+bW9kZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2lsYmNfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBpbGJjZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfSUxCQ19ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGlsYmNkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWZkMjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBpbGJjZGVwYXkuaApAQCAtMCwwICsxLDY1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFBoaWxpcHBlIEtoYWxhZiA8YnVyZ2VyQHNwZWVkeS5vcmc+IAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0lMQkNfREVQQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9JTEJDX0RFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBpTEJDRGVwYXkgR3N0UlRQaUxCQ0RlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUGlMQkNEZXBheUNsYXNzIEdzdFJUUGlMQkNEZXBheUNsYXNzOworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9JTEJDX0RFUEFZIFwKKyAgKGdzdF9ydHBfaWxiY19kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0lMQkNfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfSUxCQ19ERVBBWSxHc3RSVFBpTEJDRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX0lMQkNfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0lMQkNfREVQQVksR3N0UlRQaUxCQ0RlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0lMQkNfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfSUxCQ19ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfSUxCQ19ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSUxCQ19ERVBBWSkpCisgIAordHlwZWRlZiBlbnVtIHsKKyAgR1NUX0lMQkNfTU9ERV8yMCA9IDIwLAorICBHU1RfSUxCQ19NT0RFXzMwID0gMzAKK30gR3N0aUxCQ01vZGU7IAorCitzdHJ1Y3QgX0dzdFJUUGlMQkNEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKKworICBHc3RpTEJDTW9kZSBtb2RlOworfTsKKworc3RydWN0IF9Hc3RSVFBpTEJDRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9pbGJjX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9pbGJjX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0lMQkNfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwaWxiY3BheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYzdkOTMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGlsYmNwYXkuYwpAQCAtMCwwICsxLDIyOCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBQaGlsaXBwZSBLaGFsYWYgPGJ1cmdlckBzcGVlZHkub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlICJnc3RydHBpbGJjcGF5LmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cGlsYmNwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cGlsYmNwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2lsYmNfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1pTEJDLCAiICJtb2RlID0gKGludCkgezIwLCAzMH0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2lsYmNfcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIklMQkNcIiwgIgorICAgICAgICAibW9kZSA9IChzdHJpbmcpIHsgXCIyMFwiLCBcIjMwXCIgfSIpCisgICAgKTsKKworCitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3J0cF9pbGJjX3BheV9zaW5rX2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaWxiY19wYXlfc2lua19zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworCisjZGVmaW5lIGdzdF9ydHBfaWxiY19wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UlRQSUxCQ1BheSwgZ3N0X3J0cF9pbGJjX3BheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9BVURJT19QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaWxiY19wYXlfY2xhc3NfaW5pdCAoR3N0UlRQSUxCQ1BheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGlsYmNwYXlfZGVidWcsICJydHBpbGJjcGF5IiwgMCwKKyAgICAgICJpTEJDIGF1ZGlvIFJUUCBwYXlsb2FkZXIiKTsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2lsYmNfcGF5X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2lsYmNfcGF5X3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlJUUCBpTEJDIFBheWxvYWRlciIsCisgICAgICAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYWNrZXRpemUgaUxCQyBhdWRpbyBzdHJlYW1zIGludG8gUlRQIHBhY2tldHMiLAorICAgICAgIlBoaWxpcHBlIEthbGFmIDxwaGlsaXBwZS5rYWxhZkBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9pbGJjX3BheV9zaW5rX3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5nZXRfY2FwcyA9IGdzdF9ydHBfaWxiY19wYXlfc2lua19nZXRjYXBzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9pbGJjX3BheV9pbml0IChHc3RSVFBJTEJDUGF5ICogcnRwaWxiY3BheSkKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWQgKnJ0cGJhc2VwYXlsb2FkOworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkICpydHBiYXNlYXVkaW9wYXlsb2FkOworCisgIHJ0cGJhc2VwYXlsb2FkID0gR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cGlsYmNwYXkpOworICBydHBiYXNlYXVkaW9wYXlsb2FkID0gR1NUX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQgKHJ0cGlsYmNwYXkpOworCisgIC8qIHdlIGRvbid0IHNldCB0aGUgcGF5bG9hZCB0eXBlLCBpdCBzaG91bGQgYmUgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiB1c2luZworICAgKiB0aGUgcHQgcHJvcGVydHkgb3IgdGhlIGRlZmF1bHQgOTYgd2lsbCBiZSB1c2VkICovCisgIHJ0cGJhc2VwYXlsb2FkLT5jbG9ja19yYXRlID0gODAwMDsKKworICBydHBpbGJjcGF5LT5tb2RlID0gLTE7CisKKyAgLyogdGVsbCBydHBiYXNlYXVkaW9wYXlsb2FkIHRoYXQgdGhpcyBpcyBhIGZyYW1lIGJhc2VkIGNvZGVjICovCisgIGdzdF9ydHBfYmFzZV9hdWRpb19wYXlsb2FkX3NldF9mcmFtZV9iYXNlZCAocnRwYmFzZWF1ZGlvcGF5bG9hZCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9pbGJjX3BheV9zaW5rX3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcnRwYmFzZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFJUUElMQkNQYXkgKnJ0cGlsYmNwYXk7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgKnJ0cGJhc2VhdWRpb3BheWxvYWQ7CisgIGdib29sZWFuIHJldDsKKyAgZ2ludCBtb2RlOworICBnY2hhciAqbW9kZV9zdHI7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBjaGFyICpwYXlsb2FkX25hbWU7CisKKyAgcnRwaWxiY3BheSA9IEdTVF9SVFBfSUxCQ19QQVkgKHJ0cGJhc2VwYXlsb2FkKTsKKyAgcnRwYmFzZWF1ZGlvcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9BVURJT19QQVlMT0FEIChydHBiYXNlcGF5bG9hZCk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgcGF5bG9hZF9uYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3RydWN0dXJlKTsKKyAgaWYgKGdfYXNjaWlfc3RyY2FzZWNtcCAoImF1ZGlvL3gtaUxCQyIsIHBheWxvYWRfbmFtZSkpCisgICAgZ290byB3cm9uZ19jYXBzOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJtb2RlIiwgJm1vZGUpKQorICAgIGdvdG8gbm9fbW9kZTsKKworICBpZiAobW9kZSAhPSAyMCAmJiBtb2RlICE9IDMwKQorICAgIGdvdG8gd3JvbmdfbW9kZTsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocnRwYmFzZXBheWxvYWQsICJhdWRpbyIsIFRSVUUsICJJTEJDIiwKKyAgICAgIDgwMDApOworICAvKiBzZXQgb3B0aW9ucyBmb3IgdGhpcyBmcmFtZSBiYXNlZCBhdWRpbyBjb2RlYyAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfZnJhbWVfb3B0aW9ucyAocnRwYmFzZWF1ZGlvcGF5bG9hZCwKKyAgICAgIG1vZGUsIG1vZGUgPT0gMzAgPyA1MCA6IDM4KTsKKworICBtb2RlX3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgbW9kZSk7CisgIHJldCA9CisgICAgICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAocnRwYmFzZXBheWxvYWQsICJtb2RlIiwgR19UWVBFX1NUUklORywKKyAgICAgIG1vZGVfc3RyLCBOVUxMKTsKKyAgZ19mcmVlIChtb2RlX3N0cik7CisKKyAgaWYgKG1vZGUgIT0gcnRwaWxiY3BheS0+bW9kZSAmJiBydHBpbGJjcGF5LT5tb2RlICE9IC0xKQorICAgIGdvdG8gbW9kZV9jaGFuZ2VkOworCisgIHJ0cGlsYmNwYXktPm1vZGUgPSBtb2RlOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCit3cm9uZ19jYXBzOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwaWxiY3BheSwgImV4cGVjdGVkIGF1ZGlvL3gtaUxCQywgcmVjZWl2ZWQgJXMiLAorICAgICAgICBwYXlsb2FkX25hbWUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fbW9kZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGlsYmNwYXksICJkaWQgbm90IHJlY2VpdmUgYSBtb2RlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ19tb2RlOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwaWxiY3BheSwgIm1vZGUgbXVzdCBiZSAyMCBvciAzMCwgcmVjZWl2ZWQgJWQiLCBtb2RlKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK21vZGVfY2hhbmdlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cGlsYmNwYXksICJNb2RlIGhhcyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQhICIKKyAgICAgICAgIk1vZGUgY2Fubm90IGNoYW5nZSB3aGlsZSBzdHJlYW1pbmciLCBydHBpbGJjcGF5LT5tb2RlLCBtb2RlKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogd2UgcmV0dXJuIHRoZSBwYWR0ZW1wbGF0ZSBjYXBzIHdpdGggdGhlIG1vZGUgZmllbGQgZml4YXRlZCB0byBhIHZhbHVlIGlmIHdlCisgKiBjYW4gKi8KK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9ydHBfaWxiY19wYXlfc2lua19nZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHJ0cHBheWxvYWQsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICpvdGhlcnBhZGNhcHM7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgb3RoZXJwYWRjYXBzID0gZ3N0X3BhZF9nZXRfYWxsb3dlZF9jYXBzIChydHBwYXlsb2FkLT5zcmNwYWQpOworICBjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisKKyAgaWYgKG90aGVycGFkY2FwcykgeworICAgIGlmICghZ3N0X2NhcHNfaXNfZW1wdHkgKG90aGVycGFkY2FwcykpIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICAgICAgY29uc3QgZ2NoYXIgKm1vZGVfc3RyOworICAgICAgZ2ludCBtb2RlOworCisgICAgICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChvdGhlcnBhZGNhcHMsIDApOworCisgICAgICAvKiBwYXJzZSBtb2RlLCBpZiB3ZSBjYW4gKi8KKyAgICAgIG1vZGVfc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJtb2RlIik7CisgICAgICBpZiAobW9kZV9zdHIpIHsKKyAgICAgICAgbW9kZSA9IHN0cnRvbCAobW9kZV9zdHIsIE5VTEwsIDEwKTsKKyAgICAgICAgaWYgKG1vZGUgPT0gMjAgfHwgbW9kZSA9PSAzMCkgeworICAgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKyAgICAgICAgICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLCAibW9kZSIsIEdfVFlQRV9JTlQsIG1vZGUsIE5VTEwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGdzdF9jYXBzX3VucmVmIChvdGhlcnBhZGNhcHMpOworICB9CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKnRtcDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHBheWxvYWQsICJJbnRlcnNlY3QgJSIgR1NUX1BUUl9GT1JNQVQgIiBhbmQgZmlsdGVyICUiCisgICAgICAgIEdTVF9QVFJfRk9STUFULCBjYXBzLCBmaWx0ZXIpOworICAgIHRtcCA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIGNhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIGNhcHMgPSB0bXA7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfaWxiY19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBpbGJjcGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX0lMQkNfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwaWxiY3BheS5oIGIvZ3N0L3J0cC9nc3RydHBpbGJjcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzNjNjMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwaWxiY3BheS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gUGhpbGlwcGUgS2hhbGFmIDxidXJnZXJAc3BlZWR5Lm9yZz4gCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfSUxCQ19QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9JTEJDX1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VhdWRpb3BheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9JTEJDX1BBWSBcCisgIChnc3RfcnRwX2lsYmNfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfSUxCQ19QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfSUxCQ19QQVksR3N0UlRQSUxCQ1BheSkpCisjZGVmaW5lIEdTVF9SVFBfSUxCQ19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0lMQkNfUEFZLEdzdFJUUElMQkNQYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfSUxCQ19QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfSUxCQ19QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0lMQkNfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9JTEJDX1BBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBJTEJDUGF5IEdzdFJUUElMQkNQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQSUxCQ1BheUNsYXNzIEdzdFJUUElMQkNQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSVFBJTEJDUGF5Cit7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgYXVkaW9wYXlsb2FkOworCisgIGdpbnQgbW9kZTsKK307CisKK3N0cnVjdCBfR3N0UlRQSUxCQ1BheUNsYXNzCit7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX2lsYmNfcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9pbGJjX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9JTEJDX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwajJrY29tbW9uLmggYi9nc3QvcnRwL2dzdHJ0cGoya2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZjFiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGoya2NvbW1vbi5oCkBAIC0wLDAgKzEsMTAyIEBACisvKiBHU3RyZWFtZXIKKyogQ29weXJpZ2h0IChDKSAyMDA5IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisqCisqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisqLworCisKKyNpZm5kZWYgX19HU1RfUlRQX0oyS19DT01NT05fSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9KMktfQ09NTU9OX0hfXworCisKKworLyogU2FtcGxpbmcgdmFsdWVzIGZyb20gUkZDIDUzNzEgZm9yIEpQRUcgMjAwMCBvdmVyIFJUUCA6IGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL3JmYzUzNzEvQworCitSR0I6ICBzdGFuZGFyZCBSZWQsIEdyZWVuLCBCbHVlIGNvbG9yIHNwYWNlLgorCitCR1I6ICBzdGFuZGFyZCBCbHVlLCBHcmVlbiwgUmVkIGNvbG9yIHNwYWNlLgorCitSR0JBOiAgc3RhbmRhcmQgUmVkLCBHcmVlbiwgQmx1ZSwgQWxwaGEgY29sb3Igc3BhY2UuCisKK0JHUkE6ICBzdGFuZGFyZCBCbHVlLCBHcmVlbiwgUmVkLCBBbHBoYSBjb2xvciBzcGFjZS4KKworWUNiQ3ItNDo0OjQ6ICBzdGFuZGFyZCBZQ2JDciBjb2xvciBzcGFjZTsgbm8gc3Vic2FtcGxpbmcuCisKK1lDYkNyLTQ6MjoyOiAgc3RhbmRhcmQgWUNiQ3IgY29sb3Igc3BhY2U7IENiIGFuZCBDciBhcmUgc3Vic2FtcGxlZCBob3Jpem9udGFsbHkgYnkgMS8yLgorCitZQ2JDci00OjI6MDogIHN0YW5kYXJkIFlDYkNyIGNvbG9yIHNwYWNlOyBDYiBhbmQgQ3IgYXJlIHN1YnNhbXBsZWQgaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5IGJ5IDEvMi4KKworWUNiQ3ItNDoxOjE6ICBzdGFuZGFyZCBZQ2JDciBjb2xvciBzcGFjZTsgQ2IgYW5kIENyIGFyZSBzdWJzYW1wbGVkIHZlcnRpY2FsbHkgYnkgMS80LgorCitHUkFZU0NBTEU6ICBiYXNpY2FsbHksIGEgc2luZ2xlIGNvbXBvbmVudCBpbWFnZSBvZiBqdXN0IG11bHRpbGV2ZWxzIG9mIGdyZXkuCisqLworCisKKyNkZWZpbmUgR1NUX1JUUF9KMktfUkdCICAgICAgICJSR0IiCisjZGVmaW5lIEdTVF9SVFBfSjJLX0JHUiAgICAgICAiQkdSIgorI2RlZmluZSBHU1RfUlRQX0oyS19SR0JBICAgICAgIlJHQkEiCisjZGVmaW5lIEdTVF9SVFBfSjJLX0JHUkEgICAgICAiQkdSQSIKKyNkZWZpbmUgR1NUX1JUUF9KMktfWUJSQSAgIAkgICJZQ2JDckEiCisjZGVmaW5lIEdTVF9SVFBfSjJLX1lCUjQ0NCAgICAiWUNiQ3ItNDo0OjQiCisjZGVmaW5lIEdTVF9SVFBfSjJLX1lCUjQyMiAgICAiWUNiQ3ItNDoyOjIiCisjZGVmaW5lIEdTVF9SVFBfSjJLX1lCUjQyMCAgICAiWUNiQ3ItNDoyOjAiCisjZGVmaW5lIEdTVF9SVFBfSjJLX1lCUjQxMCAgICAiWUNiQ3ItNDoxOjAiCisjZGVmaW5lIEdTVF9SVFBfSjJLX0dSQVlTQ0FMRSAiR1JBWVNDQUxFIgorCisjZGVmaW5lIEdTVF9SVFBfSjJLX1NBTVBMSU5HX0xJU1QgInNhbXBsaW5nID0gKHN0cmluZykge1wiUkdCXCIsIFwiQkdSXCIsIFwiUkdCQVwiLCBcIkJHUkFcIiwgXCJZQ2JDckFcIiwgXCJZQ2JDci00OjQ6NFwiLCBcIllDYkNyLTQ6MjoyXCIsIFwiWUNiQ3ItNDoyOjBcIiwgXCJZQ2JDci00OjE6MVwiLCBcIkdSQVlTQ0FMRVwifSIKKwordHlwZWRlZiBlbnVtCit7CisKKyAgR1NUX1JUUF9TQU1QTElOR19OT05FLAorICBHU1RfUlRQX1NBTVBMSU5HX1JHQiwKKyAgR1NUX1JUUF9TQU1QTElOR19CR1IsCisgIEdTVF9SVFBfU0FNUExJTkdfUkdCQSwKKyAgR1NUX1JUUF9TQU1QTElOR19CR1JBLAorICBHU1RfUlRQX1NBTVBMSU5HX1lCUkEsCisgIEdTVF9SVFBfU0FNUExJTkdfWUJSNDQ0LAorICBHU1RfUlRQX1NBTVBMSU5HX1lCUjQyMiwKKyAgR1NUX1JUUF9TQU1QTElOR19ZQlI0MjAsCisgIEdTVF9SVFBfU0FNUExJTkdfWUJSNDEwLAorICBHU1RfUlRQX1NBTVBMSU5HX0dSQVlTQ0FMRQorfSBHc3RSdHBTYW1wbGluZzsKKworCisvKgorKiBHc3RSdHBKMktNYXJrZXI6CisqIEBHU1RfSjJLX01BUktFUjogUHJlZml4IGZvciBKUEVHIDIwMDAgbWFya2VyCisqIEBHU1RfSjJLX01BUktFUl9TT0M6IFN0YXJ0IG9mIENvZGVzdHJlYW0KKyogQEdTVF9KMktfTUFSS0VSX1NPVDogU3RhcnQgb2YgdGlsZQorKiBAR1NUX0oyS19NQVJLRVJfRU9DOiBFbmQgb2YgQ29kZXN0cmVhbQorKgorKiBJZGVudGlmaWVycyBmb3IgbWFya2VycyBpbiBKUEVHIDIwMDAgY29kZSBzdHJlYW1zCisqLwordHlwZWRlZiBlbnVtCit7CisgIEdTVF9KMktfTUFSS0VSID0gMHhGRiwKKyAgR1NUX0oyS19NQVJLRVJfU09DID0gMHg0RiwKKyAgR1NUX0oyS19NQVJLRVJfU09UID0gMHg5MCwKKyAgR1NUX0oyS19NQVJLRVJfU09QID0gMHg5MSwKKyAgR1NUX0oyS19NQVJLRVJfRVBIID0gMHg5MiwKKyAgR1NUX0oyS19NQVJLRVJfU09EID0gMHg5MywKKyAgR1NUX0oyS19NQVJLRVJfRU9DID0gMHhEOQorfSBHc3RSdHBKMktNYXJrZXI7CisKKworI2RlZmluZSBHU1RfUlRQX0oyS19IRUFERVJfU0laRSA4CisKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9KMktfQ09NTU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMGRkMzQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGoya2RlcGF5LmMKQEAgLTAsMCArMSw2NjcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyAvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHBqMmtkZXBheQorICoKKyAqIERlcGF5bG9hZCBhbiBSVFAtcGF5bG9hZGVkIEpQRUcgMjAwMCBpbWFnZSBpbnRvIFJUUCBwYWNrZXRzIGFjY29yZGluZyB0byBSRkMgNTM3MQorICogYW5kIFJGQyA1MzcyLgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvcmZjNTM3MS8KKyAqIGFuZCBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9yZmM1MzcyLworICovCisKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0cnRwajJrY29tbW9uLmgiCisjaW5jbHVkZSAiZ3N0cnRwajJrZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBqMmtkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwajJrZGVwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2oya19kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImltYWdlL3gtanBjLCAiCisgICAgICAgICJjb2xvcnNwYWNlID0gKHN0cmluZykgeyBzUkdCLCBzWVVWLCBHUkFZIH0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2oya19kZXBheV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIgorICAgICAgICBHU1RfUlRQX0oyS19TQU1QTElOR19MSVNUICIsIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiSlBFRzIwMDBcIjsiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIgorICAgICAgICAiY29sb3JzcGFjZSA9IChzdHJpbmcpIHsgc1JHQiwgc1lVViwgR1JBWSB9LCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJKUEVHMjAwMFwiOyIpCisgICAgKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTEFTVAorfTsKKworI2RlZmluZSBnc3RfcnRwX2oya19kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBKMktEZXBheSwgZ3N0X3J0cF9qMmtfZGVwYXksIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfajJrX2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9qMmtfZGVwYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9qMmtfZGVwYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfajJrX2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2oya19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfajJrX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfajJrX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEoyS0RlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9qMmtfZGVwYXlfZmluYWxpemU7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9qMmtfZGVwYXlfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX2oya19kZXBheV9nZXRfcHJvcGVydHk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9qMmtfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9qMmtfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgSlBFRyAyMDAwIGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBKUEVHIDIwMDAgdmlkZW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDUzNzEpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfajJrX2RlcGF5X2NoYW5nZV9zdGF0ZTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfajJrX2RlcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfajJrX2RlcGF5X3Byb2Nlc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGoya2RlcGF5X2RlYnVnLCAicnRwajJrZGVwYXkiLCAwLAorICAgICAgIkoySyBWaWRlbyBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfajJrX2RlcGF5X2luaXQgKEdzdFJ0cEoyS0RlcGF5ICogcnRwajJrZGVwYXkpCit7CisgIHJ0cGoya2RlcGF5LT5wdV9hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICBydHBqMmtkZXBheS0+dF9hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICBydHBqMmtkZXBheS0+Zl9hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworfQorCitzdGF0aWMgdm9pZAorc3RvcmVfbWhlYWRlciAoR3N0UnRwSjJLRGVwYXkgKiBydHBqMmtkZXBheSwgZ3VpbnQgaWR4LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdEJ1ZmZlciAqb2xkOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGoya2RlcGF5LCAic3RvcmluZyBtYWluIGhlYWRlciAlcCBhdCBpbmRleCAldSIsIGJ1ZiwKKyAgICAgIGlkeCk7CisgIGlmICgob2xkID0gcnRwajJrZGVwYXktPk1IW2lkeF0pKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKG9sZCk7CisgIHJ0cGoya2RlcGF5LT5NSFtpZHhdID0gYnVmOworfQorCitzdGF0aWMgdm9pZAorY2xlYXJfbWhlYWRlcnMgKEdzdFJ0cEoyS0RlcGF5ICogcnRwajJrZGVwYXkpCit7CisgIGd1aW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICBzdG9yZV9taGVhZGVyIChydHBqMmtkZXBheSwgaSwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2oya19kZXBheV9yZXNldCAoR3N0UnRwSjJLRGVwYXkgKiBydHBqMmtkZXBheSkKK3sKKyAgY2xlYXJfbWhlYWRlcnMgKHJ0cGoya2RlcGF5KTsKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGoya2RlcGF5LT5wdV9hZGFwdGVyKTsKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGoya2RlcGF5LT50X2FkYXB0ZXIpOworICBnc3RfYWRhcHRlcl9jbGVhciAocnRwajJrZGVwYXktPmZfYWRhcHRlcik7CisgIHJ0cGoya2RlcGF5LT5uZXh0X2ZyYWcgPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qMmtfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cEoyS0RlcGF5ICpydHBqMmtkZXBheTsKKworICBydHBqMmtkZXBheSA9IEdTVF9SVFBfSjJLX0RFUEFZIChvYmplY3QpOworCisgIGNsZWFyX21oZWFkZXJzIChydHBqMmtkZXBheSk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cGoya2RlcGF5LT5wdV9hZGFwdGVyKTsKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cGoya2RlcGF5LT50X2FkYXB0ZXIpOworICBnX29iamVjdF91bnJlZiAocnRwajJrZGVwYXktPmZfYWRhcHRlcik7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfajJrX2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSA9IE5VTEw7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgR3N0Q2FwcyAqb3V0Y2FwcyA9IE5VTEw7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworICBjb25zdCBnY2hhciAqY29sb3JzcGFjZSA9IE5VTEw7CisgIGNvbnN0IGdjaGFyICpzYW1wbGluZyA9IE5VTEw7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDkwMDAwOworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIHNhbXBsaW5nID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJzYW1wbGluZyIpOworICBpZiAoc2FtcGxpbmcpIHsKKyAgICBpZiAoIXN0cmNtcCAoc2FtcGxpbmcsIEdTVF9SVFBfSjJLX1JHQikgfHwKKyAgICAgICAgIXN0cmNtcCAoc2FtcGxpbmcsIEdTVF9SVFBfSjJLX1JHQkEpIHx8CisgICAgICAgICFzdHJjbXAgKHNhbXBsaW5nLCBHU1RfUlRQX0oyS19CR1IpIHx8CisgICAgICAgICFzdHJjbXAgKHNhbXBsaW5nLCBHU1RfUlRQX0oyS19CR1JBKSkKKyAgICAgIGNvbG9yc3BhY2UgPSAic1JHQiI7CisgICAgZWxzZSBpZiAoIXN0cmNtcCAoc2FtcGxpbmcsIEdTVF9SVFBfSjJLX0dSQVlTQ0FMRSkpCisgICAgICBjb2xvcnNwYWNlID0gIkdSQVkiOworICAgIGVsc2UKKyAgICAgIGNvbG9yc3BhY2UgPSAic1lVViI7CisgIH0gZWxzZSB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoZGVwYXlsb2FkLCBTVFJFQU0sIERFTVVYLCBOVUxMLAorICAgICAgICAoIk5vbi1jb21wbGlhbnQgc3RyZWFtOiBzYW1wbGluZyBmaWVsZCBtaXNzaW5nLiBGcmFtZXMgbXkgYXBwZWFyIGluY29ycmVjdCIpKTsKKyAgICBjb2xvcnNwYWNlID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJjb2xvcnNwYWNlIik7CisgICAgaWYgKCFzdHJjbXAgKGNvbG9yc3BhY2UsICJHUkFZIikpIHsKKyAgICAgIHNhbXBsaW5nID0gR1NUX1JUUF9KMktfR1JBWVNDQUxFOworICAgIH0KKyAgfQorCisgIG91dGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiaW1hZ2UveC1qcGMiLAorICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLCAwLCAxLAorICAgICAgImZpZWxkcyIsIEdfVFlQRV9JTlQsIDEsICJjb2xvcnNwYWNlIiwgR19UWVBFX1NUUklORywgY29sb3JzcGFjZSwgTlVMTCk7CisKKyAgaWYgKHNhbXBsaW5nKQorICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKG91dGNhcHMsICJzYW1wbGluZyIsIEdfVFlQRV9TVFJJTkcsIHNhbXBsaW5nLCBOVUxMKTsKKworICByZXMgPSBnc3RfcGFkX3NldF9jYXBzIChkZXBheWxvYWQtPnNyY3BhZCwgb3V0Y2Fwcyk7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKG91dGNhcHMpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2oya19kZXBheV9jbGVhcl9wdSAoR3N0UnRwSjJLRGVwYXkgKiBydHBqMmtkZXBheSkKK3sKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGoya2RlcGF5LT5wdV9hZGFwdGVyKTsKKyAgcnRwajJrZGVwYXktPmhhdmVfc3luYyA9IEZBTFNFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9qMmtfZGVwYXlfZmx1c2hfcHUgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQpCit7CisgIEdzdFJ0cEoyS0RlcGF5ICpydHBqMmtkZXBheTsKKyAgR3N0QnVmZmVyICptaGVhZGVyOworICBndWludCBhdmFpbCwgTUhGLCBtaF9pZDsKKworICBydHBqMmtkZXBheSA9IEdTVF9SVFBfSjJLX0RFUEFZIChkZXBheWxvYWQpOworCisgIC8qIHRha2UgYWxsIGF2YWlsYWJsZSBidWZmZXJzICovCisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBqMmtkZXBheS0+cHVfYWRhcHRlcik7CisgIGlmIChhdmFpbCA9PSAwKQorICAgIGdvdG8gZG9uZTsKKworICBNSEYgPSBydHBqMmtkZXBheS0+cHVfTUhGOworICBtaF9pZCA9IHJ0cGoya2RlcGF5LT5sYXN0X21oX2lkOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGoya2RlcGF5LCAiZmx1c2hpbmcgUFUgb2Ygc2l6ZSAldSIsIGF2YWlsKTsKKworICBpZiAoTUhGID09IDApIHsKKyAgICBHTGlzdCAqcGFja2V0cywgKndhbGs7CisKKyAgICBwYWNrZXRzID0gZ3N0X2FkYXB0ZXJfdGFrZV9saXN0IChydHBqMmtkZXBheS0+cHVfYWRhcHRlciwgYXZhaWwpOworICAgIC8qIGFwcGVuZCBwYWNrZXRzICovCisgICAgZm9yICh3YWxrID0gcGFja2V0czsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgICAgR3N0QnVmZmVyICpidWYgPSBHU1RfQlVGRkVSX0NBU1QgKHdhbGstPmRhdGEpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksCisgICAgICAgICAgImFwcGVuZCBwdSBwYWNrZXQgb2Ygc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCwKKyAgICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpKTsKKyAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGoya2RlcGF5LT50X2FkYXB0ZXIsIGJ1Zik7CisgICAgfQorICAgIGdfbGlzdF9mcmVlIChwYWNrZXRzKTsKKyAgfSBlbHNlIHsKKyAgICAvKiB3ZSBoYXZlIGEgaGVhZGVyICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksICJrZWVwaW5nIGhlYWRlciAldSIsIG1oX2lkKTsKKyAgICAvKiB3ZSBtYW5hZ2VkIHRvIHNlZSB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgaGVhZGVyLCB0YWtlIGFsbCBmcm9tCisgICAgICogYWRhcHRlciBhbmQga2VlcCBpbiBoZWFkZXIgICovCisgICAgbWhlYWRlciA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChydHBqMmtkZXBheS0+cHVfYWRhcHRlciwgYXZhaWwpOworCisgICAgc3RvcmVfbWhlYWRlciAocnRwajJrZGVwYXksIG1oX2lkLCBtaGVhZGVyKTsKKyAgfQorCitkb25lOgorICBydHBqMmtkZXBheS0+aGF2ZV9zeW5jID0gRkFMU0U7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9qMmtfZGVwYXlfZmx1c2hfdGlsZSAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCkKK3sKKyAgR3N0UnRwSjJLRGVwYXkgKnJ0cGoya2RlcGF5OworICBndWludCBhdmFpbCwgbWhfaWQ7CisgIEdMaXN0ICpwYWNrZXRzLCAqd2FsazsKKyAgZ3VpbnQ4IGVuZFsyXTsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdEJ1ZmZlciAqYnVmOworCisgIHJ0cGoya2RlcGF5ID0gR1NUX1JUUF9KMktfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgLyogZmx1c2ggcGVuZGluZyBQVSAqLworICBnc3RfcnRwX2oya19kZXBheV9mbHVzaF9wdSAoZGVwYXlsb2FkKTsKKworICAvKiB0YWtlIGFsbCBhdmFpbGFibGUgYnVmZmVycyAqLworICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwajJrZGVwYXktPnRfYWRhcHRlcik7CisgIGlmIChhdmFpbCA9PSAwKQorICAgIGdvdG8gZG9uZTsKKworICBtaF9pZCA9IHJ0cGoya2RlcGF5LT5sYXN0X21oX2lkOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGoya2RlcGF5LCAiZmx1c2hpbmcgdGlsZSBvZiBzaXplICV1IiwgYXZhaWwpOworCisgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cGoya2RlcGF5LT5mX2FkYXB0ZXIpID09IDApIHsKKyAgICBHc3RCdWZmZXIgKm1oZWFkZXI7CisKKyAgICAvKiB3ZSBuZWVkIGEgaGVhZGVyIG5vdyAqLworICAgIGlmICgobWhlYWRlciA9IHJ0cGoya2RlcGF5LT5NSFttaF9pZF0pID09IE5VTEwpCisgICAgICBnb3RvIHdhaXRpbmdfaGVhZGVyOworCisgICAgLyogcHVzaCBoZWFkZXIgaW4gdGhlIGFkYXB0ZXIgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBqMmtkZXBheSwgInB1c2hpbmcgaGVhZGVyICV1IiwgbWhfaWQpOworICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGoya2RlcGF5LT5mX2FkYXB0ZXIsIGdzdF9idWZmZXJfcmVmIChtaGVhZGVyKSk7CisgIH0KKworICAvKiBjaGVjayBmb3IgbGFzdCBieXRlcyAqLworICBnc3RfYWRhcHRlcl9jb3B5IChydHBqMmtkZXBheS0+dF9hZGFwdGVyLCBlbmQsIGF2YWlsIC0gMiwgMik7CisKKyAgLyogbm93IGFwcGVuZCB0aGUgdGlsZSBwYWNrZXRzIHRvIHRoZSBmcmFtZSAqLworICBwYWNrZXRzID0gZ3N0X2FkYXB0ZXJfdGFrZV9saXN0IChydHBqMmtkZXBheS0+dF9hZGFwdGVyLCBhdmFpbCk7CisgIGZvciAod2FsayA9IHBhY2tldHM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBidWYgPSBHU1RfQlVGRkVSX0NBU1QgKHdhbGstPmRhdGEpOworCisgICAgaWYgKHdhbGsgPT0gcGFja2V0cykgeworICAgICAgLyogZmlyc3QgYnVmZmVyIHNob3VsZCBjb250YWluIHRoZSBTT1QgKi8KKyAgICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgICAgIGlmIChtYXAuc2l6ZSA8IDEyKQorICAgICAgICBnb3RvIGludmFsaWRfdGlsZTsKKworICAgICAgaWYgKG1hcC5kYXRhWzBdID09IEdTVF9KMktfTUFSS0VSICYmIG1hcC5kYXRhWzFdID09IEdTVF9KMktfTUFSS0VSX1NPVCkgeworICAgICAgICBndWludCBQc290LCBuUHNvdDsKKworICAgICAgICBpZiAoZW5kWzBdID09IEdTVF9KMktfTUFSS0VSICYmIGVuZFsxXSA9PSBHU1RfSjJLX01BUktFUl9FT0MpCisgICAgICAgICAgblBzb3QgPSBhdmFpbCAtIDI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBuUHNvdCA9IGF2YWlsOworCisgICAgICAgIFBzb3QgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKCZtYXAuZGF0YVs2XSk7CisgICAgICAgIGlmIChQc290ICE9IG5Qc290ICYmIFBzb3QgIT0gMCkgeworICAgICAgICAgIC8qIFBzb3QgbXVzdCBtYXRjaCB0aGUgc2l6ZSBvZiB0aGUgdGlsZSAqLworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGoya2RlcGF5LCAic2V0IFBzb3QgZnJvbSAldSB0byAldSIsIFBzb3QsIG5Qc290KTsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgICAgICAgICAgYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChidWYpOworCisgICAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgICAgICAgICAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoJm1hcC5kYXRhWzZdLCBuUHNvdCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksICJhcHBlbmQgcHUgcGFja2V0IG9mIHNpemUgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikpOworICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGoya2RlcGF5LT5mX2FkYXB0ZXIsIGJ1Zik7CisgIH0KKyAgZ19saXN0X2ZyZWUgKHBhY2tldHMpOworCitkb25lOgorICBydHBqMmtkZXBheS0+bGFzdF90aWxlID0gLTE7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBlcnJvcnMgKi8KK3dhaXRpbmdfaGVhZGVyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksICJ3YWl0aW5nIGZvciBoZWFkZXIgJXUiLCBtaF9pZCk7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cGoya2RlcGF5LT50X2FkYXB0ZXIpOworICAgIHJ0cGoya2RlcGF5LT5sYXN0X3RpbGUgPSAtMTsKKyAgICByZXR1cm4gcmV0OworICB9CitpbnZhbGlkX3RpbGU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBqMmtkZXBheSwgU1RSRUFNLCBERUNPREUsICgiSW52YWxpZCB0aWxlIiksIChOVUxMKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRwajJrZGVwYXktPnRfYWRhcHRlcik7CisgICAgcnRwajJrZGVwYXktPmxhc3RfdGlsZSA9IC0xOworICAgIHJldHVybiByZXQ7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfajJrX2RlcGF5X2ZsdXNoX2ZyYW1lIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkKQoreworICBHc3RSdHBKMktEZXBheSAqcnRwajJrZGVwYXk7CisgIGd1aW50OCBlbmRbMl07CisgIGd1aW50IGF2YWlsOworCisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgcnRwajJrZGVwYXkgPSBHU1RfUlRQX0oyS19ERVBBWSAoZGVwYXlsb2FkKTsKKworICAvKiBmbHVzaCBwZW5kaW5nIHRpbGUgKi8KKyAgZ3N0X3J0cF9qMmtfZGVwYXlfZmx1c2hfdGlsZSAoZGVwYXlsb2FkKTsKKworICAvKiBsYXN0IGJ1ZmZlciB0YWtlIGFsbCBkYXRhIG91dCBvZiB0aGUgYWRhcHRlciAqLworICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwajJrZGVwYXktPmZfYWRhcHRlcik7CisgIGlmIChhdmFpbCA9PSAwKQorICAgIGdvdG8gZG9uZTsKKworICBpZiAoYXZhaWwgPiAyKSB7CisgICAgR3N0QnVmZmVyICpvdXRidWY7CisKKyAgICAvKiB0YWtlIHRoZSBsYXN0IGJ5dGVzIG9mIHRoZSBKUEVHIDIwMDAgZGF0YSB0byBzZWUgaWYgdGhlcmUgaXMgYW4gRU9DCisgICAgICogbWFya2VyICovCisgICAgZ3N0X2FkYXB0ZXJfY29weSAocnRwajJrZGVwYXktPmZfYWRhcHRlciwgZW5kLCBhdmFpbCAtIDIsIDIpOworCisgICAgaWYgKGVuZFswXSAhPSBHU1RfSjJLX01BUktFUiAmJiBlbmRbMV0gIT0gR1NUX0oyS19NQVJLRVJfRU9DKSB7CisgICAgICBlbmRbMF0gPSBHU1RfSjJLX01BUktFUjsKKyAgICAgIGVuZFsxXSA9IEdTVF9KMktfTUFSS0VSX0VPQzsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksICJubyBFT0MgbWFya2VyLCBhZGRpbmcgb25lIik7CisKKyAgICAgIC8qIG5vIEVPSSBtYXJrZXIsIGFkZCBvbmUgKi8KKyAgICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMik7CisgICAgICBnc3RfYnVmZmVyX2ZpbGwgKG91dGJ1ZiwgMCwgZW5kLCAyKTsKKworICAgICAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwajJrZGVwYXktPmZfYWRhcHRlciwgb3V0YnVmKTsKKyAgICAgIGF2YWlsICs9IDI7CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksICJwdXNoaW5nIGJ1ZmZlciBvZiAldSBieXRlcyIsIGF2YWlsKTsKKyAgICBvdXRidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwajJrZGVwYXktPmZfYWRhcHRlciwgYXZhaWwpOworICAgIGdzdF9ydHBfZHJvcF9ub25fdmlkZW9fbWV0YSAoZGVwYXlsb2FkLCBvdXRidWYpOworICAgIHJldCA9IGdzdF9ydHBfYmFzZV9kZXBheWxvYWRfcHVzaCAoZGVwYXlsb2FkLCBvdXRidWYpOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwajJrZGVwYXksICJlbXB0eSBwYWNrZXQiKTsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRwajJrZGVwYXktPmZfYWRhcHRlcik7CisgIH0KKworICAvKiB3ZSBhY2NlcHQgYW55IG1oX2lkIG5vdyAqLworICBydHBqMmtkZXBheS0+bGFzdF9taF9pZCA9IC0xOworCisgIC8qIHJlc2V0IHN0YXRlICovCisgIHJ0cGoya2RlcGF5LT5uZXh0X2ZyYWcgPSAwOworICBydHBqMmtkZXBheS0+aGF2ZV9zeW5jID0gRkFMU0U7CisKK2RvbmU6CisgIC8qIHdlIGNhbid0IGtlZXAgaGVhZGVycyB3aXRoIG1oX2lkIG9mIDAgKi8KKyAgc3RvcmVfbWhlYWRlciAocnRwajJrZGVwYXksIDAsIE5VTEwpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9qMmtfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBKMktEZXBheSAqcnRwajJrZGVwYXk7CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgZ3VpbnQgTUhGLCBtaF9pZCwgZnJhZ19vZmZzZXQsIHRpbGUsIHBheWxvYWRfbGVuLCBqMmtsZW47CisgIGdpbnQgZ2FwOworICBndWludDMyIHJ0cHRpbWU7CisKKyAgcnRwajJrZGVwYXkgPSBHU1RfUlRQX0oyS19ERVBBWSAoZGVwYXlsb2FkKTsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgIC8qIHdlIG5lZWQgYXQgbGVhc3QgYSBoZWFkZXIgKi8KKyAgaWYgKHBheWxvYWRfbGVuIDwgR1NUX1JUUF9KMktfSEVBREVSX1NJWkUpCisgICAgZ290byBlbXB0eV9wYWNrZXQ7CisKKyAgcnRwdGltZSA9IGdzdF9ydHBfYnVmZmVyX2dldF90aW1lc3RhbXAgKHJ0cCk7CisKKyAgLyogbmV3IHRpbWVzdGFtcCBtYXJrcyBuZXcgZnJhbWUgKi8KKyAgaWYgKHJ0cGoya2RlcGF5LT5sYXN0X3J0cHRpbWUgIT0gcnRwdGltZSkgeworICAgIHJ0cGoya2RlcGF5LT5sYXN0X3J0cHRpbWUgPSBydHB0aW1lOworICAgIC8qIGZsdXNoIHBlbmRpbmcgZnJhbWUgKi8KKyAgICBnc3RfcnRwX2oya19kZXBheV9mbHVzaF9mcmFtZSAoZGVwYXlsb2FkKTsKKyAgfQorCisgIC8qCisgICAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfHRwIHxNSEZ8bWhfaWR8VHwgICAgIHByaW9yaXR5ICB8ICAgICAgICAgICB0aWxlIG51bWJlciAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfHJlc2VydmVkICAgICAgIHwgICAgICAgICAgICAgZnJhZ21lbnQgb2Zmc2V0ICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICovCisgIE1IRiA9IChwYXlsb2FkWzBdICYgMHgzMCkgPj4gNDsKKyAgbWhfaWQgPSAocGF5bG9hZFswXSAmIDB4ZSkgPj4gMTsKKworICBpZiAocnRwajJrZGVwYXktPmxhc3RfbWhfaWQgPT0gLTEpCisgICAgcnRwajJrZGVwYXktPmxhc3RfbWhfaWQgPSBtaF9pZDsKKyAgZWxzZSBpZiAocnRwajJrZGVwYXktPmxhc3RfbWhfaWQgIT0gbWhfaWQpCisgICAgZ290byB3cm9uZ19taF9pZDsKKworICB0aWxlID0gKHBheWxvYWRbMl0gPDwgOCkgfCBwYXlsb2FkWzNdOworICBmcmFnX29mZnNldCA9IChwYXlsb2FkWzVdIDw8IDE2KSB8IChwYXlsb2FkWzZdIDw8IDgpIHwgcGF5bG9hZFs3XTsKKyAgajJrbGVuID0gcGF5bG9hZF9sZW4gLSBHU1RfUlRQX0oyS19IRUFERVJfU0laRTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBqMmtkZXBheSwgIk1IRiAldSwgdGlsZSAldSwgZnJhZyAldSwgZXhwZWN0ZWQgJXUiLCBNSEYsCisgICAgICB0aWxlLCBmcmFnX29mZnNldCwgcnRwajJrZGVwYXktPm5leHRfZnJhZyk7CisKKyAgLyogY2FsY3VsYXRlIHRoZSBnYXAgYmV0d2VlbiBleHBlY3RlZCBmcmFnICovCisgIGdhcCA9IGZyYWdfb2Zmc2V0IC0gcnRwajJrZGVwYXktPm5leHRfZnJhZzsKKyAgLyogY2FsY3VsYXRlIG5leHQgZnJhZyAqLworICBydHBqMmtkZXBheS0+bmV4dF9mcmFnID0gZnJhZ19vZmZzZXQgKyBqMmtsZW47CisKKyAgaWYgKGdhcCAhPSAwKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksICJkaXNjb250IG9mICVkLCBjbGVhciBQVSIsIGdhcCk7CisgICAgLyogZGlzY29udCwgY2xlYXIgcHUgYWRhcHRlciBhbmQgcmVzeW5jICovCisgICAgZ3N0X3J0cF9qMmtfZGVwYXlfY2xlYXJfcHUgKHJ0cGoya2RlcGF5KTsKKyAgfQorCisgIC8qIGNoZWNrIGZvciBzeW5jIGNvZGUgKi8KKyAgaWYgKGoya2xlbiA+IDIgJiYgcGF5bG9hZFtHU1RfUlRQX0oyS19IRUFERVJfU0laRV0gPT0gR1NUX0oyS19NQVJLRVIpIHsKKyAgICBndWludCBtYXJrZXIgPSBwYXlsb2FkW0dTVF9SVFBfSjJLX0hFQURFUl9TSVpFICsgMV07CisKKyAgICAvKiBwYWNrZXRzIG11c3Qgc3RhcnQgd2l0aCBTT0MsIFNPVCBvciBTT1AgKi8KKyAgICBzd2l0Y2ggKG1hcmtlcikgeworICAgICAgY2FzZSBHU1RfSjJLX01BUktFUl9TT0M6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGoya2RlcGF5LCAiZm91bmQgU09DIHBhY2tldCIpOworICAgICAgICAvKiBmbHVzaCB0aGUgcHJldmlvdXMgZnJhbWUsIHNob3VsZCBoYXZlIGhhcHBlbmVkIHdoZW4gdGhlIHRpbWVzdGFtcAorICAgICAgICAgKiBjaGFuZ2VkIGFib3ZlLiAqLworICAgICAgICBnc3RfcnRwX2oya19kZXBheV9mbHVzaF9mcmFtZSAoZGVwYXlsb2FkKTsKKyAgICAgICAgcnRwajJrZGVwYXktPmhhdmVfc3luYyA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfSjJLX01BUktFUl9TT1Q6CisgICAgICAgIC8qIGZsdXNoIHRoZSBwcmV2aW91cyB0aWxlICovCisgICAgICAgIGdzdF9ydHBfajJrX2RlcGF5X2ZsdXNoX3RpbGUgKGRlcGF5bG9hZCk7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGoya2RlcGF5LCAiZm91bmQgU09UIHBhY2tldCIpOworICAgICAgICBydHBqMmtkZXBheS0+aGF2ZV9zeW5jID0gVFJVRTsKKyAgICAgICAgLyogd2Ugc3luYyBvbiB0aGUgdGlsZSBub3cgKi8KKyAgICAgICAgcnRwajJrZGVwYXktPmxhc3RfdGlsZSA9IHRpbGU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfSjJLX01BUktFUl9TT1A6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGoya2RlcGF5LCAiZm91bmQgU09QIHBhY2tldCIpOworICAgICAgICAvKiBmbHVzaCB0aGUgcHJldmlvdXMgUFUgKi8KKyAgICAgICAgZ3N0X3J0cF9qMmtfZGVwYXlfZmx1c2hfcHUgKGRlcGF5bG9hZCk7CisgICAgICAgIGlmIChydHBqMmtkZXBheS0+bGFzdF90aWxlICE9IHRpbGUpIHsKKyAgICAgICAgICAvKiB3cm9uZyB0aWxlLCB3ZSBsb3NlIHN5bmMgYW5kIHdlIG5lZWQgYSBuZXcgU09UIG9yIFNPQyB0byByZWdhaW4KKyAgICAgICAgICAgKiBzeW5jLiBGaXJzdCBmbHVzaCBvdXQgdGhlIHByZXZpb3VzIHRpbGUgaWYgd2UgaGF2ZSBvbmUuICovCisgICAgICAgICAgaWYgKHJ0cGoya2RlcGF5LT5sYXN0X3RpbGUgIT0gLTEpCisgICAgICAgICAgICBnc3RfcnRwX2oya19kZXBheV9mbHVzaF90aWxlIChkZXBheWxvYWQpOworICAgICAgICAgIC8qIG5vdyB3ZSBoYXZlIG5vIG1vcmUgdmFsaWQgdGlsZSBhbmQgbm8gc3luYyAqLworICAgICAgICAgIHJ0cGoya2RlcGF5LT5sYXN0X3RpbGUgPSAtMTsKKyAgICAgICAgICBydHBqMmtkZXBheS0+aGF2ZV9zeW5jID0gRkFMU0U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcnRwajJrZGVwYXktPmhhdmVfc3luYyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBqMmtkZXBheSwgIm5vIHN5bmMgcGFja2V0IDB4JTAyZCIsIG1hcmtlcik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChydHBqMmtkZXBheS0+aGF2ZV9zeW5jKSB7CisgICAgR3N0QnVmZmVyICpwdV9mcmFnOworCisgICAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwajJrZGVwYXktPnB1X2FkYXB0ZXIpID09IDApIHsKKyAgICAgIC8qIGZpcnN0IHBhcnQgb2YgcHUsIHJlY29yZCBzdGF0ZSAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksICJmaXJzdCBQVSIpOworICAgICAgcnRwajJrZGVwYXktPnB1X01IRiA9IE1IRjsKKyAgICB9CisgICAgLyogYW5kIHB1c2ggaW4gcHUgYWRhcHRlciAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGoya2RlcGF5LCAicHVzaCBwdSBvZiBzaXplICV1IGluIGFkYXB0ZXIiLCBqMmtsZW4pOworICAgIHB1X2ZyYWcgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwgOCwgLTEpOworICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGoya2RlcGF5LT5wdV9hZGFwdGVyLCBwdV9mcmFnKTsKKworICAgIGlmIChNSEYgJiAyKSB7CisgICAgICAvKiBsYXN0IHBhcnQgb2YgbWFpbiBoZWFkZXIgcmVjZWl2ZWQsIHdlIGNhbiBmbHVzaCBpdCAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksICJoZWFkZXIgZW5kLCBmbHVzaCBwdSIpOworICAgICAgZ3N0X3J0cF9qMmtfZGVwYXlfZmx1c2hfcHUgKGRlcGF5bG9hZCk7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGoya2RlcGF5LCAiZGlzY2FyZCBwYWNrZXQsIG5vIHN5bmMiKTsKKyAgfQorCisgIC8qIG1hcmtlciBiaXQgZmluaXNoZXMgdGhlIGZyYW1lICovCisgIGlmIChnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwajJrZGVwYXksICJtYXJrZXIgc2V0LCBsYXN0IGJ1ZmZlciIpOworICAgIC8qIHRoZW4gZmx1c2ggZnJhbWUgKi8KKyAgICBnc3RfcnRwX2oya19kZXBheV9mbHVzaF9mcmFtZSAoZGVwYXlsb2FkKTsKKyAgfQorCisgIHJldHVybiBOVUxMOworCisgIC8qIEVSUk9SUyAqLworZW1wdHlfcGFja2V0OgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwajJrZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIkVtcHR5IFBheWxvYWQuIiksIChOVUxMKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK3dyb25nX21oX2lkOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwajJrZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIkludmFsaWQgbWhfaWQgJXUsIGV4cGVjdGVkICV1IiwgbWhfaWQsIHJ0cGoya2RlcGF5LT5sYXN0X21oX2lkKSwKKyAgICAgICAgKE5VTEwpKTsKKyAgICBnc3RfcnRwX2oya19kZXBheV9jbGVhcl9wdSAocnRwajJrZGVwYXkpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2oya19kZXBheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qMmtfZGVwYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2oya19kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSdHBKMktEZXBheSAqcnRwajJrZGVwYXk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBydHBqMmtkZXBheSA9IEdTVF9SVFBfSjJLX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfcnRwX2oya19kZXBheV9yZXNldCAocnRwajJrZGVwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfajJrX2RlcGF5X3Jlc2V0IChydHBqMmtkZXBheSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9qMmtfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBqMmtkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9KMktfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBqMmtkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYzc0MzMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGoya2RlcGF5LmgKQEAgLTAsMCArMSw3MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0oyS19ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0oyS19ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0oyS19ERVBBWSBcCisgIChnc3RfcnRwX2oya19kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0oyS19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9KMktfREVQQVksR3N0UnRwSjJLRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX0oyS19ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSjJLX0RFUEFZLEdzdFJ0cEoyS0RlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0oyS19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9KMktfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0oyS19ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSjJLX0RFUEFZKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBKMktEZXBheSBHc3RSdHBKMktEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBKMktEZXBheUNsYXNzIEdzdFJ0cEoyS0RlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwSjJLRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisKKyAgZ3VpbnQ2NCBsYXN0X3J0cHRpbWU7CisgIGd1aW50IGxhc3RfbWhfaWQ7CisgIGd1aW50IGxhc3RfdGlsZTsKKworICBHc3RCdWZmZXIgKk1IWzhdOworCisgIGd1aW50IHB1X01IRjsKKyAgR3N0QWRhcHRlciAqcHVfYWRhcHRlcjsKKyAgR3N0QWRhcHRlciAqdF9hZGFwdGVyOworICBHc3RBZGFwdGVyICpmX2FkYXB0ZXI7CisKKyAgZ3VpbnQgbmV4dF9mcmFnOworICBnYm9vbGVhbiBoYXZlX3N5bmM7CisKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworfTsKKworc3RydWN0IF9Hc3RSdHBKMktEZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX2oya19kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfajJrX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1JUUF9KMktfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGoya3BheS5jIGIvZ3N0L3J0cC9nc3RydHBqMmtwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWM2YzAzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBqMmtwYXkuYwpAQCAtMCwwICsxLDU2OSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisgLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwajJrcGF5CisgKgorICogUGF5bG9hZCBlbmNvZGUgSlBFRyAyMDAwIGltYWdlcyBpbnRvIFJUUCBwYWNrZXRzIGFjY29yZGluZyB0byBSRkMgNTM3MQorICogYW5kIFJGQyA1MzcyLgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvcmZjNTM3MS8KKyAqIGFuZCBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9yZmM1MzcyLworICoKKyAqIFRoZSBwYXlsb2FkZXIgdGFrZXMgYSBKUEVHIDIwMDAgaW1hZ2UsIHNjYW5zIGl0IGZvciAicGFja2V0aXphdGlvbgorICogdW5pdHMiIGFuZCBjb25zdHJ1Y3RzIHRoZSBSVFAgcGFja2V0IGhlYWRlciBmb2xsb3dlZCBieSB0aGUgSlBFRyAyMDAwCisgKiBjb2Rlc3RyZWFtLiBBICJwYWNrZXRpemF0aW9uIHVuaXQiIGlzIGRlZmluZWQgYXMgZWl0aGVyIGEgSlBFRyAyMDAwIG1haW4gaGVhZGVyLAorICogYSBKUEVHIDIwMDAgdGlsZS1wYXJ0IGhlYWRlciwgb3IgYSBKUEVHIDIwMDAgcGFja2V0LgorICoKKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgImdzdHJ0cGoya2NvbW1vbi5oIgorI2luY2x1ZGUgImdzdHJ0cGoya3BheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2oya19wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJpbWFnZS94LWpwYywgIiBHU1RfUlRQX0oyS19TQU1QTElOR19MSVNUKQorICAgICk7CisKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfajJrX3BheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICIgIG1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICIgIHBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICIgIGNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIgorICAgICAgICBHU1RfUlRQX0oyS19TQU1QTElOR19MSVNUICIsIiAiICBlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJKUEVHMjAwMFwiIikKKyAgICApOworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBqMmtwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cGoya3BheV9kZWJ1ZykKKworCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MQVNUCit9OworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludCB0cDoyOworICBndWludCBNSEY6MjsKKyAgZ3VpbnQgbWhfaWQ6MzsKKyAgZ3VpbnQgVDoxOworICBndWludCBwcmlvcml0eTo4OworICBndWludCB0aWxlOjE2OworICBndWludCBvZmZzZXQ6MjQ7Cit9IFJ0cEoyS0hlYWRlcjsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9qMmtfcGF5X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfajJrX3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2oya19wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfajJrX3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBhZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworCisjZGVmaW5lIGdzdF9ydHBfajJrX3BheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBKMktQYXksIGdzdF9ydHBfajJrX3BheSwgR1NUX1RZUEVfUlRQX0JBU0VfUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2oya19wYXlfY2xhc3NfaW5pdCAoR3N0UnRwSjJLUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX2oya19wYXlfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX2oya19wYXlfZ2V0X3Byb3BlcnR5OworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfajJrX3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2oya19wYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgSlBFRyAyMDAwIHBheWxvYWRlciIsICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQtZW5jb2RlcyBKUEVHIDIwMDAgcGljdHVyZXMgaW50byBSVFAgcGFja2V0cyAoUkZDIDUzNzEpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfajJrX3BheV9zZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9IGdzdF9ydHBfajJrX3BheV9oYW5kbGVfYnVmZmVyOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBqMmtwYXlfZGVidWcsICJydHBqMmtwYXkiLCAwLAorICAgICAgIkpQRUcgMjAwMCBSVFAgUGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2oya19wYXlfaW5pdCAoR3N0UnRwSjJLUGF5ICogcGF5KQoreworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfajJrX3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpjYXBzX3N0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBnYm9vbGVhbiByZXM7CisgIGdpbnQgd2lkdGggPSAwLCBoZWlnaHQgPSAwOworICBjb25zdCBnY2hhciAqc2FtcGxpbmcgPSBOVUxMOworCisgIGdib29sZWFuIGhhc193aWR0aCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoY2Fwc19zdHJ1Y3R1cmUsICJ3aWR0aCIsICZ3aWR0aCk7CisgIGdib29sZWFuIGhhc19oZWlnaHQgPQorICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChjYXBzX3N0cnVjdHVyZSwgImhlaWdodCIsICZoZWlnaHQpOworCisKKyAgLyogc2FtcGxpbmcgaXMgYSByZXF1aXJlZCBmaWVsZCAqLworICBzYW1wbGluZyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoY2Fwc19zdHJ1Y3R1cmUsICJzYW1wbGluZyIpOworCisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChiYXNlcGF5bG9hZCwgInZpZGVvIiwgVFJVRSwgIkpQRUcyMDAwIiwKKyAgICAgIDkwMDAwKTsKKworICBpZiAoaGFzX3dpZHRoICYmIGhhc19oZWlnaHQpCisgICAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLAorICAgICAgICAic2FtcGxpbmciLCBHX1RZUEVfU1RSSU5HLCBzYW1wbGluZywgIndpZHRoIiwgR19UWVBFX0lOVCwgd2lkdGgsCisgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBoZWlnaHQsIE5VTEwpOworICBlbHNlCisgICAgcmVzID0KKyAgICAgICAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLCAic2FtcGxpbmciLAorICAgICAgICBHX1RZUEVfU1RSSU5HLCBzYW1wbGluZywgTlVMTCk7CisgIHJldHVybiByZXM7Cit9CisKKworc3RhdGljIGd1aW50Citnc3RfcnRwX2oya19wYXlfaGVhZGVyX3NpemUgKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IG9mZnNldCkKK3sKKyAgcmV0dXJuIGRhdGFbb2Zmc2V0XSA8PCA4IHwgZGF0YVtvZmZzZXQgKyAxXTsKK30KKworCitzdGF0aWMgR3N0UnRwSjJLTWFya2VyCitnc3RfcnRwX2oya19wYXlfc2Nhbl9tYXJrZXIgKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIGd1aW50ICogb2Zmc2V0KQoreworICB3aGlsZSAoKGRhdGFbKCpvZmZzZXQpKytdICE9IEdTVF9KMktfTUFSS0VSKSAmJiAoKCpvZmZzZXQpIDwgc2l6ZSkpOworCisgIGlmIChHX1VOTElLRUxZICgoKm9mZnNldCkgPj0gc2l6ZSkpIHsKKyAgICByZXR1cm4gR1NUX0oyS19NQVJLRVJfRU9DOworICB9IGVsc2UgeworICAgIGd1aW50OCBtYXJrZXIgPSBkYXRhWygqb2Zmc2V0KSsrXTsKKyAgICByZXR1cm4gKEdzdFJ0cEoyS01hcmtlcikgbWFya2VyOworICB9Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIFJ0cEoyS0hlYWRlciBoZWFkZXI7CisgIGdib29sZWFuIG11bHRpX3RpbGU7CisgIGdib29sZWFuIGJpdHN0cmVhbTsKKyAgZ3VpbnQgbmV4dF9zb3Q7CisgIGdib29sZWFuIGZvcmNlX3BhY2tldDsKK30gUnRwSjJLU3RhdGU7CisKKworLyogTm90ZTogVGhlIHN0YW5kYXJkIHJlY29tbWVuZHMgdGhhdCBoZWFkZXJzIGJlIHB1dCBpbiB0aGVpciBvd24gUlRQIHBhY2tldHMsIHNvIHdlIGZvbGxvdworICogdGhpcyByZWNvbW1lbmRhdGlvbiBpbiB0aGUgY29kZS4gQWxzbywgdGhpcyBtZXRob2QgZ3JvdXBzIHRvZ2V0aGVyIGFsbCBKMksgcGFja2V0cworICogZm9yIGEgdGlsZSBwYXJ0IGFuZCB0cmVhdHMgdGhpcyBncm91cCBhcyBhIHBhY2tldGl6YXRpb24gdW5pdC4gQWNjb3JkaW5nIHRvIHRoZSBSRkMsCisgKiBvbmx5IGFuIGluZGl2aWR1YWwgSjJLIHBhY2tldCBpcyBjb25zaWRlcmVkIGEgcGFja2V0aXphdGlvbiB1bml0LgorICovCisKK3N0YXRpYyBndWludAorZmluZF9wdV9lbmQgKEdzdFJ0cEoyS1BheSAqIHBheSwgY29uc3QgZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSwKKyAgICBndWludCBvZmZzZXQsIFJ0cEoyS1N0YXRlICogc3RhdGUpCit7CisgIGdib29sZWFuIGN1dF9zb3AgPSBGQUxTRTsKKyAgR3N0UnRwSjJLTWFya2VyIG1hcmtlcjsKKworICAvKiBwYXJzZSB0aGUgajJrIGhlYWRlciBmb3IgJ3N0YXJ0IG9mIGNvZGVzdHJlYW0nICovCisgIEdTVF9MT0dfT0JKRUNUIChwYXksICJjaGVja2luZyBmcm9tIG9mZnNldCAldSIsIG9mZnNldCk7CisgIHdoaWxlIChvZmZzZXQgPCBzaXplKSB7CisgICAgbWFya2VyID0gZ3N0X3J0cF9qMmtfcGF5X3NjYW5fbWFya2VyIChkYXRhLCBzaXplLCAmb2Zmc2V0KTsKKworICAgIGlmIChzdGF0ZS0+Yml0c3RyZWFtKSB7CisgICAgICAvKiBwYXJzaW5nIGJpdHN0cmVhbSwgb25seSBsb29rIGZvciBTT1AgKi8KKyAgICAgIHN3aXRjaCAobWFya2VyKSB7CisgICAgICAgIGNhc2UgR1NUX0oyS19NQVJLRVJfU09QOgorICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXksICJmb3VuZCBTT1AgYXQgJXUiLCBvZmZzZXQpOworICAgICAgICAgIGlmIChjdXRfc29wKQorICAgICAgICAgICAgcmV0dXJuIG9mZnNldCAtIDI7CisgICAgICAgICAgY3V0X3NvcCA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0oyS19NQVJLRVJfRVBIOgorICAgICAgICAgIC8qIGp1c3Qgc2tpcCBvdmVyIEVQSCAqLworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXksICJmb3VuZCBFUEggYXQgJXUiLCBvZmZzZXQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGlmIChvZmZzZXQgPj0gc3RhdGUtPm5leHRfc290KSB7CisgICAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocGF5LCAicmVhY2hlZCBuZXh0IFNPVCBhdCAldSIsIG9mZnNldCk7CisgICAgICAgICAgICBzdGF0ZS0+Yml0c3RyZWFtID0gRkFMU0U7CisgICAgICAgICAgICBzdGF0ZS0+Zm9yY2VfcGFja2V0ID0gVFJVRTsKKyAgICAgICAgICAgIGlmIChtYXJrZXIgPT0gR1NUX0oyS19NQVJLRVJfRU9DICYmIHN0YXRlLT5uZXh0X3NvdCArIDIgPD0gc2l6ZSkKKyAgICAgICAgICAgICAgLyogaW5jbHVkZSBFT0MgYnV0IG5ldmVyIGdvIHBhc3QgdGhlIG1heCBzaXplICovCisgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS0+bmV4dF9zb3QgKyAyOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICByZXR1cm4gc3RhdGUtPm5leHRfc290OworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChtYXJrZXIpIHsKKyAgICAgICAgY2FzZSBHU1RfSjJLX01BUktFUl9TT0M6CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgImZvdW5kIFNPQyBhdCAldSIsIG9mZnNldCk7CisgICAgICAgICAgLyogc3RhcnQgb2ZmIGJ5IGFzc3VtaW5nIHRoYXQgd2Ugd2lsbCBmaXQgdGhlIGVudGlyZSBoZWFkZXIKKyAgICAgICAgICAgICBpbnRvIHRoZSBSVFAgcGF5bG9hZCAqLworICAgICAgICAgIHN0YXRlLT5oZWFkZXIuTUhGID0gMzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfSjJLX01BUktFUl9TT1Q6CisgICAgICAgIHsKKyAgICAgICAgICBndWludCBsZW4sIFBzb3QsIHRpbGU7CisKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocGF5LCAiZm91bmQgU09UIGF0ICV1Iiwgb2Zmc2V0KTsKKyAgICAgICAgICAvKiBTT1QgZm9yIGZpcnN0IHRpbGUgcGFydCBpbiBjb2RlIHN0cmVhbToKKyAgICAgICAgICAgICBmb3JjZSBjbG9zZSBvZiBjdXJyZW50IFJUUCBwYWNrZXQsIHNvIHRoYXQgaXQKKyAgICAgICAgICAgICBvbmx5IGNvbnRhaW5zIG1haW4gaGVhZGVyICAqLworICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZGVyLk1IRikgeworICAgICAgICAgICAgc3RhdGUtPmZvcmNlX3BhY2tldCA9IFRSVUU7CisgICAgICAgICAgICByZXR1cm4gb2Zmc2V0IC0gMjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBwYXJzZSBTT1QgYnV0IGRvIHNvbWUgc2FuaXR5IGNoZWNrcyBmaXJzdCAqLworICAgICAgICAgIGxlbiA9IGdzdF9ydHBfajJrX3BheV9oZWFkZXJfc2l6ZSAoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocGF5LCAiU09UIGxlbmd0aCAldSIsIGxlbik7CisgICAgICAgICAgaWYgKGxlbiA8IDgpCisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgICBpZiAob2Zmc2V0ICsgbGVuID49IHNpemUpCisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKworICAgICAgICAgIC8qIElzb3QgKi8KKyAgICAgICAgICB0aWxlID0gR1NUX1JFQURfVUlOVDE2X0JFICgmZGF0YVtvZmZzZXQgKyAyXSk7CisKKyAgICAgICAgICBpZiAoIXN0YXRlLT5tdWx0aV90aWxlKSB7CisgICAgICAgICAgICAvKiB3ZSBoYXZlIGRldGVjdGVkIG11bHRpcGxlIHRpbGVzIGluIHRoaXMgcnRwIHBhY2tldCA6IHRpbGUgYml0IGlzIG5vdyBpbnZhbGlkICovCisgICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWRlci5UID09IDAgJiYgc3RhdGUtPmhlYWRlci50aWxlICE9IHRpbGUpIHsKKyAgICAgICAgICAgICAgc3RhdGUtPmhlYWRlci5UID0gMTsKKyAgICAgICAgICAgICAgc3RhdGUtPm11bHRpX3RpbGUgPSBUUlVFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3RhdGUtPmhlYWRlci5UID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgc3RhdGUtPmhlYWRlci50aWxlID0gdGlsZTsKKworICAgICAgICAgIC8qIE5vdGU6IFRpbGUgcGFydHMgZnJvbSBtdWx0aXBsZSB0aWxlcyBpbiBzaW5nbGUgUlRQIHBhY2tldCAKKyAgICAgICAgICAgICB3aWxsIG1ha2UgVCBpbnZhbGlkLgorICAgICAgICAgICAgIFRoaXMgY2Fubm90IGhhcHBlbiBpbiBvdXIgY2FzZSBzaW5jZSB3ZSBhbHdheXMKKyAgICAgICAgICAgICBzZW5kIHRpbGUgaGVhZGVycyBpbiB0aGVpciBvd24gUlRQIHBhY2tldHMsIHNvIHdlIGNhbm5vdCBtaXgKKyAgICAgICAgICAgICB0aWxlIHBhcnRzIGluIGEgc2luZ2xlIFJUUCBwYWNrZXQgICovCisKKyAgICAgICAgICAvKiBQc290OiBvZmZzZXQgb2YgbmV4dCB0aWxlLiBJZiBpdCdzIDAsIG5leHQgdGlsZSBnb2VzIGFsbCB0aGUgd2F5CisgICAgICAgICAgICAgdG8gdGhlIGVuZCBvZiB0aGUgZGF0YSAqLworICAgICAgICAgIFBzb3QgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKCZkYXRhW29mZnNldCArIDRdKTsKKyAgICAgICAgICBpZiAoUHNvdCA9PSAwKQorICAgICAgICAgICAgc3RhdGUtPm5leHRfc290ID0gc2l6ZTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzdGF0ZS0+bmV4dF9zb3QgPSBvZmZzZXQgLSAyICsgUHNvdDsKKworICAgICAgICAgIG9mZnNldCArPSBsZW47CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgIklzb3QgJXUsIFBzb3QgJXUsIG5leHQgJXUiLCBzdGF0ZS0+aGVhZGVyLnRpbGUsCisgICAgICAgICAgICAgIFBzb3QsIHN0YXRlLT5uZXh0X3NvdCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHU1RfSjJLX01BUktFUl9TT0Q6CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgImZvdW5kIFNPRCBhdCAldSIsIG9mZnNldCk7CisgICAgICAgICAgLyogZ28gdG8gYml0c3RyZWFtIHBhcnNpbmcgKi8KKyAgICAgICAgICBzdGF0ZS0+Yml0c3RyZWFtID0gVFJVRTsKKyAgICAgICAgICAvKiBjdXQgYXQgdGhlIG5leHQgU09QIG9yIGVsc2UgaW5jbHVkZSBhbGwgZGF0YSAqLworICAgICAgICAgIGN1dF9zb3AgPSBUUlVFOworICAgICAgICAgIC8qIGZvcmNlIGEgbmV3IHBhY2tldCB3aGVuIHdlIHNlZSBTT1AsIHRoaXMgY2FuIGJlIG9wdGlvbmFsIGJ1dCB0aGUKKyAgICAgICAgICAgKiBzcGVjIHJlY29tbWVuZHMgcGFja2luZyBoZWFkZXJzIHNlcGFyYXRlbHkgKi8KKyAgICAgICAgICBzdGF0ZS0+Zm9yY2VfcGFja2V0ID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfSjJLX01BUktFUl9FT0M6CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgImZvdW5kIEVPQyBhdCAldSIsIG9mZnNldCk7CisgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgIGd1aW50IGxlbiA9IGdzdF9ydHBfajJrX3BheV9oZWFkZXJfc2l6ZSAoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocGF5LCAic2tpcCAweCUwMnggbGVuICV1IiwgbWFya2VyLCBsZW4pOworICAgICAgICAgIG9mZnNldCArPSBsZW47CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgR1NUX0RFQlVHX09CSkVDVCAocGF5LCAicmVhY2hlZCBlbmQgb2YgZGF0YSIpOworICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfajJrX3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UnRwSjJLUGF5ICpwYXk7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgIFJ0cEoyS1N0YXRlIHN0YXRlOworICBHc3RCdWZmZXJMaXN0ICpsaXN0ID0gTlVMTDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50IG10dSwgbWF4X3NpemU7CisgIGd1aW50IG9mZnNldDsKKyAgZ3VpbnQgZW5kLCBwb3M7CisKKyAgcGF5ID0gR1NUX1JUUF9KMktfUEFZIChiYXNlcGF5bG9hZCk7CisgIG10dSA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX01UVSAocGF5KTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKyAgb2Zmc2V0ID0gcG9zID0gZW5kID0gMDsKKworICBHU1RfTE9HX09CSkVDVCAocGF5LAorICAgICAgImdvdCBidWZmZXIgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCAiLCB0aW1lc3RhbXAgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgbWFwLnNpemUsIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIC8qIGRvIHNvbWUgaGVhZGVyIGRlZmF1bHRzIGZpcnN0ICovCisgIHN0YXRlLmhlYWRlci50cCA9IDA7ICAgICAgICAgIC8qIG9ubHkgcHJvZ3Jlc3NpdmUgc2NhbiAqLworICBzdGF0ZS5oZWFkZXIuTUhGID0gMDsgICAgICAgICAvKiBubyBoZWFkZXIgKi8KKyAgc3RhdGUuaGVhZGVyLm1oX2lkID0gMDsgICAgICAgLyogYWx3YXlzIDAgZm9yIG5vdyAqLworICBzdGF0ZS5oZWFkZXIuVCA9IDE7ICAgICAgICAgICAvKiBpbnZhbGlkIHRpbGUsIGJlY2F1c2Ugd2UgYWx3YXlzIGJlZ2luIHdpdGggdGhlIG1haW4gaGVhZGVyICovCisgIHN0YXRlLmhlYWRlci5wcmlvcml0eSA9IDI1NTsgIC8qIGFsd2F5cyAyNTUgZm9yIG5vdyAqLworICBzdGF0ZS5oZWFkZXIudGlsZSA9IDB4ZmZmZjsgICAvKiBubyB0aWxlIG51bWJlciAqLworICBzdGF0ZS5oZWFkZXIub2Zmc2V0ID0gMDsgICAgICAvKiBvZmZzZXQgb2YgMCAqLworICBzdGF0ZS5tdWx0aV90aWxlID0gRkFMU0U7CisgIHN0YXRlLmJpdHN0cmVhbSA9IEZBTFNFOworICBzdGF0ZS5uZXh0X3NvdCA9IDA7CisgIHN0YXRlLmZvcmNlX3BhY2tldCA9IEZBTFNFOworCisgIC8qIGdldCBtYXggcGFja2V0IGxlbmd0aCAqLworICBtYXhfc2l6ZSA9CisgICAgICBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BheWxvYWRfbGVuIChtdHUgLSBHU1RfUlRQX0oyS19IRUFERVJfU0laRSwgMCwgMCk7CisKKyAgbGlzdCA9IGdzdF9idWZmZXJfbGlzdF9uZXdfc2l6ZWQgKChtdHUgLyBtYXhfc2l6ZSkgKyAxKTsKKworICBkbyB7CisgICAgR3N0QnVmZmVyICpvdXRidWY7CisgICAgZ3VpbnQ4ICpoZWFkZXI7CisgICAgZ3VpbnQgcGF5bG9hZF9zaXplOworICAgIGd1aW50IHB1X3NpemU7CisgICAgR3N0UlRQQnVmZmVyIHJ0cCA9IHsgTlVMTCB9OworCisgICAgLyogdHJ5IHRvIHBhY2sgYXMgbXVjaCBhcyB3ZSBjYW4gKi8KKyAgICBkbyB7CisgICAgICAvKiBzZWUgaG93IG11Y2ggd2UgaGF2ZSBzY2FubmVkIGFscmVhZHkgKi8KKyAgICAgIHB1X3NpemUgPSBlbmQgLSBvZmZzZXQ7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXksICJzY2FubmVkIHB1IHNpemUgJXUiLCBwdV9zaXplKTsKKworICAgICAgLyogd2UgbmVlZCB0byBtYWtlIGEgbmV3IHBhY2tldCAqLworICAgICAgaWYgKHN0YXRlLmZvcmNlX3BhY2tldCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXksICJuZWVkIHRvIGZvcmNlIGEgbmV3IHBhY2tldCIpOworICAgICAgICBzdGF0ZS5mb3JjZV9wYWNrZXQgPSBGQUxTRTsKKyAgICAgICAgcG9zID0gZW5kOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogZWxzZSBzZWUgaWYgd2UgaGF2ZSBlbm91Z2ggKi8KKyAgICAgIGlmIChwdV9zaXplID4gbWF4X3NpemUpIHsKKyAgICAgICAgaWYgKHBvcyAhPSBvZmZzZXQpCisgICAgICAgICAgLyogdGhlIHBhY2tldCBiZWNhbWUgdG9vIGxhcmdlLCB1c2UgcHJldmlvdXMgc2NhbnBvcyAqLworICAgICAgICAgIHB1X3NpemUgPSBwb3MgLSBvZmZzZXQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAvKiB0aGUgYWxyZWFkeSBzY2FubmVkIGRhdGEgd2FzIGFscmVhZHkgdG9vIGJpZywgbWFrZSBzdXJlIHdlIHN0YXJ0CisgICAgICAgICAgICogc2Nhbm5pbmcgZnJvbSB0aGUgbGFzdCBzZWFyY2hlZCBwb3NpdGlvbiAqLworICAgICAgICAgIHBvcyA9IGVuZDsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYXksICJtYXggc2l6ZSBleGNlZWRlZCBwdV9zaXplICV1IiwgcHVfc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBwb3MgPSBlbmQ7CisKKyAgICAgIC8qIGV4aXQgd2hlbiBmaW5pc2hlZCAqLworICAgICAgaWYgKHBvcyA9PSBtYXAuc2l6ZSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIHNjYW4gbmV4dCBwYWNrZXRpemF0aW9uIHVuaXQgYW5kIGZpbGwgaW4gdGhlIGhlYWRlciAqLworICAgICAgZW5kID0gZmluZF9wdV9lbmQgKHBheSwgbWFwLmRhdGEsIG1hcC5zaXplLCBwb3MsICZzdGF0ZSk7CisgICAgfSB3aGlsZSAoVFJVRSk7CisKKyAgICB3aGlsZSAocHVfc2l6ZSA+IDApIHsKKyAgICAgIGd1aW50IHBhY2tldF9zaXplLCBkYXRhX3NpemU7CisgICAgICBHc3RCdWZmZXIgKnBheWJ1ZjsKKworICAgICAgLyogY2FsY3VsYXRlIHRoZSBwYWNrZXQgc2l6ZSAqLworICAgICAgcGFja2V0X3NpemUgPQorICAgICAgICAgIGdzdF9ydHBfYnVmZmVyX2NhbGNfcGFja2V0X2xlbiAocHVfc2l6ZSArIEdTVF9SVFBfSjJLX0hFQURFUl9TSVpFLCAwLAorICAgICAgICAgIDApOworCisgICAgICBpZiAocGFja2V0X3NpemUgPiBtdHUpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGF5LCAibmVlZGVkIHBhY2tldCBzaXplICV1IGNsYW1wZWQgdG8gTVRVICV1IiwKKyAgICAgICAgICAgIHBhY2tldF9zaXplLCBtdHUpOworICAgICAgICBwYWNrZXRfc2l6ZSA9IG10dTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBheSwgIm5lZWRlZCBwYWNrZXQgc2l6ZSAldSBmaXRzIGluIE1UVSAldSIsCisgICAgICAgICAgICBwYWNrZXRfc2l6ZSwgbXR1KTsKKyAgICAgIH0KKworICAgICAgLyogZ2V0IHRvdGFsIHBheWxvYWQgc2l6ZSBhbmQgZGF0YSBzaXplICovCisgICAgICBwYXlsb2FkX3NpemUgPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BheWxvYWRfbGVuIChwYWNrZXRfc2l6ZSwgMCwgMCk7CisgICAgICBkYXRhX3NpemUgPSBwYXlsb2FkX3NpemUgLSBHU1RfUlRQX0oyS19IRUFERVJfU0laRTsKKworICAgICAgLyogbWFrZSBidWZmZXIgZm9yIGhlYWRlciAqLworICAgICAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChHU1RfUlRQX0oyS19IRUFERVJfU0laRSwgMCwgMCk7CisKKyAgICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gdGltZXN0YW1wOworCisgICAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKG91dGJ1ZiwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisKKyAgICAgIC8qIGdldCBwb2ludGVyIHRvIGhlYWRlciAqLworICAgICAgaGVhZGVyID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApOworCisgICAgICBwdV9zaXplIC09IGRhdGFfc2l6ZTsKKworICAgICAgLyogcmVhY2hlZCB0aGUgZW5kIG9mIGEgcGFja2V0aXphdGlvbiB1bml0ICovCisgICAgICBpZiAocHVfc2l6ZSA9PSAwICYmIGVuZCA+PSBtYXAuc2l6ZSkgeworICAgICAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBUUlVFKTsKKyAgICAgIH0KKyAgICAgIC8qIElmIHdlIHdlcmUgcHJvY2Vzc2luZyBhIGhlYWRlciwgc2VlIGlmIGFsbCBmaXRzIGluIG9uZSBSVFAgcGFja2V0CisgICAgICAgICBvciBpZiB3ZSBoYXZlIHRvIGZyYWdtZW50IGl0ICovCisgICAgICBpZiAoc3RhdGUuaGVhZGVyLk1IRikgeworICAgICAgICBzd2l0Y2ggKHN0YXRlLmhlYWRlci5NSEYpIHsKKyAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBpZiAocHVfc2l6ZSA+IDApCisgICAgICAgICAgICAgIHN0YXRlLmhlYWRlci5NSEYgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYgKHB1X3NpemUgPT0gMCkKKyAgICAgICAgICAgICAgc3RhdGUuaGVhZGVyLk1IRiA9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyoKKyAgICAgICAqIFJ0cEoyS0hlYWRlcjoKKyAgICAgICAqIEB0cDogdHlwZSAoMCBwcm9ncmVzc2l2ZSwgMSBvZGQgZmllbGQsIDIgZXZlbiBmaWVsZCkKKyAgICAgICAqIEBNSEY6IE1haW4gSGVhZGVyIEZsYWcKKyAgICAgICAqIEBtaF9pZDogTWFpbiBIZWFkZXIgSWRlbnRpZmljYXRpb24KKyAgICAgICAqIEBUOiBUaWxlIGZpZWxkIGludmFsaWRhdGlvbiBmbGFnCisgICAgICAgKiBAcHJpb3JpdHk6IHByaW9yaXR5CisgICAgICAgKiBAdGlsZSBudW1iZXI6IHRoZSB0aWxlIG51bWJlciBvZiB0aGUgcGF5bG9hZAorICAgICAgICogQHJlc2VydmVkOiBzZXQgdG8gMAorICAgICAgICogQGZyYWdtZW50IG9mZnNldDogdGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IHBheWxvYWQKKyAgICAgICAqCisgICAgICAgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAqIHx0cCB8TUhGfG1oX2lkfFR8ICAgICBwcmlvcml0eSAgfCAgICAgICAgICAgdGlsZSBudW1iZXIgICAgICAgICB8CisgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICogfHJlc2VydmVkICAgICAgIHwgICAgICAgICAgICAgZnJhZ21lbnQgb2Zmc2V0ICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKi8KKyAgICAgIGhlYWRlclswXSA9IChzdGF0ZS5oZWFkZXIudHAgPDwgNikgfCAoc3RhdGUuaGVhZGVyLk1IRiA8PCA0KSB8CisgICAgICAgICAgKHN0YXRlLmhlYWRlci5taF9pZCA8PCAxKSB8IHN0YXRlLmhlYWRlci5UOworICAgICAgaGVhZGVyWzFdID0gc3RhdGUuaGVhZGVyLnByaW9yaXR5OworICAgICAgaGVhZGVyWzJdID0gc3RhdGUuaGVhZGVyLnRpbGUgPj4gODsKKyAgICAgIGhlYWRlclszXSA9IHN0YXRlLmhlYWRlci50aWxlICYgMHhmZjsKKyAgICAgIGhlYWRlcls0XSA9IDA7CisgICAgICBoZWFkZXJbNV0gPSBzdGF0ZS5oZWFkZXIub2Zmc2V0ID4+IDE2OworICAgICAgaGVhZGVyWzZdID0gKHN0YXRlLmhlYWRlci5vZmZzZXQgPj4gOCkgJiAweGZmOworICAgICAgaGVhZGVyWzddID0gc3RhdGUuaGVhZGVyLm9mZnNldCAmIDB4ZmY7CisKKyAgICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAgICAgLyogbWFrZSBzdWJidWZmZXIgb2YgajJrIGRhdGEgKi8KKyAgICAgIHBheWJ1ZiA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKGJ1ZmZlciwgR1NUX0JVRkZFUl9DT1BZX0FMTCwKKyAgICAgICAgICBvZmZzZXQsIGRhdGFfc2l6ZSk7CisgICAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAoYmFzZXBheWxvYWQsIG91dGJ1ZiwgcGF5YnVmKTsKKyAgICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfYXBwZW5kIChvdXRidWYsIHBheWJ1Zik7CisKKyAgICAgIGdzdF9idWZmZXJfbGlzdF9hZGQgKGxpc3QsIG91dGJ1Zik7CisKKyAgICAgIC8qIHJlc2V0IG11bHRpX3RpbGUgKi8KKyAgICAgIHN0YXRlLm11bHRpX3RpbGUgPSBGQUxTRTsKKworCisgICAgICAvKiBzZXQgTUhGIHRvIHplcm8gaWYgdGhlcmUgaXMgbm8gbW9yZSBtYWluIGhlYWRlciB0byBwcm9jZXNzICovCisgICAgICBpZiAoc3RhdGUuaGVhZGVyLk1IRiAmIDIpCisgICAgICAgIHN0YXRlLmhlYWRlci5NSEYgPSAwOworCisgICAgICAvKiB0aWxlIGlzIHZhbGlkLCBpZiB0aGVyZSBpcyBubyBtb3JlIGhlYWRlciB0byBwcm9jZXNzICovCisgICAgICBpZiAoIXN0YXRlLmhlYWRlci5NSEYpCisgICAgICAgIHN0YXRlLmhlYWRlci5UID0gMDsKKworCisgICAgICBvZmZzZXQgKz0gZGF0YV9zaXplOworICAgICAgc3RhdGUuaGVhZGVyLm9mZnNldCA9IG9mZnNldDsKKyAgICB9CisgICAgb2Zmc2V0ID0gcG9zOworICB9IHdoaWxlIChvZmZzZXQgPCBtYXAuc2l6ZSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICAvKiBwdXNoIHRoZSB3aG9sZSBidWZmZXIgbGlzdCBhdCBvbmNlICovCisgIHJldCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2hfbGlzdCAoYmFzZXBheWxvYWQsIGxpc3QpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2oya19wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfajJrX3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF9qMmtfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwajJrcGF5IiwgR1NUX1JBTktfU0VDT05EQVJZLAorICAgICAgR1NUX1RZUEVfUlRQX0oyS19QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBqMmtwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwajJrcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRmNTI5NQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwajJrcGF5LmgKQEAgLTAsMCArMSw1OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9KMktfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfSjJLX1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0oyS19QQVkgXAorICAoZ3N0X3J0cF9qMmtfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfSjJLX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9KMktfUEFZLEdzdFJ0cEoyS1BheSkpCisjZGVmaW5lIEdTVF9SVFBfSjJLX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSjJLX1BBWSxHc3RSdHBKMktQYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfSjJLX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9KMktfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9KMktfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9KMktfUEFZKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBKMktQYXkgR3N0UnRwSjJLUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEoyS1BheUNsYXNzIEdzdFJ0cEoyS1BheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cEoyS1BheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCBwYXlsb2FkOworCisgIGdpbnQgaGVpZ2h0OworICBnaW50IHdpZHRoOworfTsKKworc3RydWN0IF9Hc3RSdHBKMktQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfajJrX3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfajJrX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9SVFBfSjJLX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Mjc0ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGpwZWdkZXBheS5jCkBAIC0wLDAgKzEsNzk5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDg+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0cnRwanBlZ2RlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwanBlZ2RlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBqcGVnZGVwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2pwZWdfZGVwYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJpbWFnZS9qcGVnIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9qcGVnX2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJKUEVHXCI7ICIKKyAgICAgICAgLyogb3B0aW9uYWwgU0RQIGF0dHJpYnV0ZXMgKi8KKyAgICAgICAgLyoKKyAgICAgICAgICogImEtZnJhbWVyYXRlID0gKHN0cmluZykgMC4wMCwgIgorICAgICAgICAgKiAieC1mcmFtZXJhdGUgPSAoc3RyaW5nKSAwLjAwLCAiCisgICAgICAgICAqICJ4LWRpbWVuc2lvbnMgPSAoc3RyaW5nKSBcIjEyMzQsMTIzNFwiLCAiCisgICAgICAgICAqLworICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfSlBFR19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwIgorICAgICAgICAvKiBvcHRpb25hbCBTRFAgYXR0cmlidXRlcyAqLworICAgICAgICAvKgorICAgICAgICAgKiAiYS1mcmFtZXJhdGUgPSAoc3RyaW5nKSAwLjAwLCAiCisgICAgICAgICAqICJ4LWZyYW1lcmF0ZSA9IChzdHJpbmcpIDAuMDAsICIKKyAgICAgICAgICogIngtZGltZW5zaW9ucyA9IChzdHJpbmcpIFwiMTIzNCwxMjM0XCIiCisgICAgICAgICAqLworICAgICkKKyAgICApOworCisjZGVmaW5lIGdzdF9ydHBfanBlZ19kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBKUEVHRGVwYXksIGdzdF9ydHBfanBlZ19kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2pwZWdfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9qcGVnX2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2pwZWdfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX2pwZWdfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qcGVnX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEpQRUdEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfanBlZ19kZXBheV9maW5hbGl6ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2pwZWdfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9qcGVnX2RlcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIEpQRUcgZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIEpQRUcgdmlkZW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDI0MzUpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfanBlZ19kZXBheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX2pwZWdfZGVwYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+cHJvY2Vzc19ydHBfcGFja2V0ID0gZ3N0X3J0cF9qcGVnX2RlcGF5X3Byb2Nlc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGpwZWdkZXBheV9kZWJ1ZywgInJ0cGpwZWdkZXBheSIsIDAsCisgICAgICAiSlBFRyBWaWRlbyBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfanBlZ19kZXBheV9pbml0IChHc3RSdHBKUEVHRGVwYXkgKiBydHBqcGVnZGVwYXkpCit7CisgIHJ0cGpwZWdkZXBheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfanBlZ19kZXBheV9yZXNldCAoR3N0UnRwSlBFR0RlcGF5ICogZGVwYXkpCit7CisgIGdpbnQgaTsKKworICBkZXBheS0+d2lkdGggPSAwOworICBkZXBheS0+aGVpZ2h0ID0gMDsKKyAgZGVwYXktPm1lZGlhX3dpZHRoID0gMDsKKyAgZGVwYXktPm1lZGlhX2hlaWdodCA9IDA7CisgIGRlcGF5LT5mcmF0ZV9udW0gPSAwOworICBkZXBheS0+ZnJhdGVfZGVub20gPSAxOworICBkZXBheS0+ZGlzY29udCA9IFRSVUU7CisKKyAgZm9yIChpID0gMDsgaSA8IDI1NTsgaSsrKSB7CisgICAgZ19mcmVlIChkZXBheS0+cXRhYmxlc1tpXSk7CisgICAgZGVwYXktPnF0YWJsZXNbaV0gPSBOVUxMOworICB9CisKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGRlcGF5LT5hZGFwdGVyKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfanBlZ19kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwSlBFR0RlcGF5ICpydHBqcGVnZGVwYXk7CisKKyAgcnRwanBlZ2RlcGF5ID0gR1NUX1JUUF9KUEVHX0RFUEFZIChvYmplY3QpOworCisgIGdzdF9ydHBfanBlZ19kZXBheV9yZXNldCAocnRwanBlZ2RlcGF5KTsKKworICBnX29iamVjdF91bnJlZiAocnRwanBlZ2RlcGF5LT5hZGFwdGVyKTsKKyAgcnRwanBlZ2RlcGF5LT5hZGFwdGVyID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQgemlnemFnW10gPSB7CisgIDAsIDEsIDgsIDE2LCA5LCAyLCAzLCAxMCwKKyAgMTcsIDI0LCAzMiwgMjUsIDE4LCAxMSwgNCwgNSwKKyAgMTIsIDE5LCAyNiwgMzMsIDQwLCA0OCwgNDEsIDM0LAorICAyNywgMjAsIDEzLCA2LCA3LCAxNCwgMjEsIDI4LAorICAzNSwgNDIsIDQ5LCA1NiwgNTcsIDUwLCA0MywgMzYsCisgIDI5LCAyMiwgMTUsIDIzLCAzMCwgMzcsIDQ0LCA1MSwKKyAgNTgsIDU5LCA1MiwgNDUsIDM4LCAzMSwgMzksIDQ2LAorICA1MywgNjAsIDYxLCA1NCwgNDcsIDU1LCA2MiwgNjMKK307CisKKy8qCisgKiBUYWJsZSBLLjEgZnJvbSBKUEVHIHNwZWMuCisgKi8KK3N0YXRpYyBjb25zdCBpbnQganBlZ19sdW1hX3F1YW50aXplcls2NF0gPSB7CisgIDE2LCAxMSwgMTAsIDE2LCAyNCwgNDAsIDUxLCA2MSwKKyAgMTIsIDEyLCAxNCwgMTksIDI2LCA1OCwgNjAsIDU1LAorICAxNCwgMTMsIDE2LCAyNCwgNDAsIDU3LCA2OSwgNTYsCisgIDE0LCAxNywgMjIsIDI5LCA1MSwgODcsIDgwLCA2MiwKKyAgMTgsIDIyLCAzNywgNTYsIDY4LCAxMDksIDEwMywgNzcsCisgIDI0LCAzNSwgNTUsIDY0LCA4MSwgMTA0LCAxMTMsIDkyLAorICA0OSwgNjQsIDc4LCA4NywgMTAzLCAxMjEsIDEyMCwgMTAxLAorICA3MiwgOTIsIDk1LCA5OCwgMTEyLCAxMDAsIDEwMywgOTkKK307CisKKy8qCisgKiBUYWJsZSBLLjIgZnJvbSBKUEVHIHNwZWMuCisgKi8KK3N0YXRpYyBjb25zdCBpbnQganBlZ19jaHJvbWFfcXVhbnRpemVyWzY0XSA9IHsKKyAgMTcsIDE4LCAyNCwgNDcsIDk5LCA5OSwgOTksIDk5LAorICAxOCwgMjEsIDI2LCA2NiwgOTksIDk5LCA5OSwgOTksCisgIDI0LCAyNiwgNTYsIDk5LCA5OSwgOTksIDk5LCA5OSwKKyAgNDcsIDY2LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LAorICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksCisgIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwKKyAgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LAorICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTkKK307CisKKy8qIENhbGwgTWFrZVRhYmxlcyB3aXRoIHRoZSBRIGZhY3RvciBhbmQgYSBndWludDhbMTI4XSByZXR1cm4gYXJyYXkKKyAqLworc3RhdGljIHZvaWQKK01ha2VUYWJsZXMgKEdzdFJ0cEpQRUdEZXBheSAqIHJ0cGpwZWdkZXBheSwgZ2ludCBRLCBndWludDggcXRhYmxlWzEyOF0pCit7CisgIGdpbnQgaTsKKyAgZ3VpbnQgZmFjdG9yOworCisgIGZhY3RvciA9IENMQU1QIChRLCAxLCA5OSk7CisKKyAgaWYgKFEgPCA1MCkKKyAgICBRID0gNTAwMCAvIGZhY3RvcjsKKyAgZWxzZQorICAgIFEgPSAyMDAgLSBmYWN0b3IgKiAyOworCisgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgZ2ludCBscSA9IChqcGVnX2x1bWFfcXVhbnRpemVyW3ppZ3phZ1tpXV0gKiBRICsgNTApIC8gMTAwOworICAgIGdpbnQgY3EgPSAoanBlZ19jaHJvbWFfcXVhbnRpemVyW3ppZ3phZ1tpXV0gKiBRICsgNTApIC8gMTAwOworCisgICAgLyogTGltaXQgdGhlIHF1YW50aXplcnMgdG8gMSA8PSBxIDw9IDI1NSAqLworICAgIHF0YWJsZVtpXSA9IENMQU1QIChscSwgMSwgMjU1KTsKKyAgICBxdGFibGVbaSArIDY0XSA9IENMQU1QIChjcSwgMSwgMjU1KTsKKyAgfQorfQorCitzdGF0aWMgY29uc3QgZ3VpbnQ4IGx1bV9kY19jb2RlbGVuc1tdID0geworICAwLCAxLCA1LCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwCit9OworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IGx1bV9kY19zeW1ib2xzW10gPSB7CisgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMQorfTsKKworc3RhdGljIGNvbnN0IGd1aW50OCBsdW1fYWNfY29kZWxlbnNbXSA9IHsKKyAgMCwgMiwgMSwgMywgMywgMiwgNCwgMywgNSwgNSwgNCwgNCwgMCwgMCwgMSwgMHg3ZAorfTsKKworc3RhdGljIGNvbnN0IGd1aW50OCBsdW1fYWNfc3ltYm9sc1tdID0geworICAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLAorICAweDIxLCAweDMxLCAweDQxLCAweDA2LCAweDEzLCAweDUxLCAweDYxLCAweDA3LAorICAweDIyLCAweDcxLCAweDE0LCAweDMyLCAweDgxLCAweDkxLCAweGExLCAweDA4LAorICAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLAorICAweDI0LCAweDMzLCAweDYyLCAweDcyLCAweDgyLCAweDA5LCAweDBhLCAweDE2LAorICAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDI1LCAweDI2LCAweDI3LCAweDI4LAorICAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAorICAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LAorICAweDRhLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LAorICAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LAorICAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LAorICAweDdhLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LAorICAweDhhLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LAorICAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LAorICAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LAorICAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LAorICAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGQyLCAweGQzLCAweGQ0LAorICAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGUxLCAweGUyLAorICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLAorICAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LAorICAweGY5LCAweGZhCit9OworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IGNobV9kY19jb2RlbGVuc1tdID0geworICAwLCAzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwCit9OworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IGNobV9kY19zeW1ib2xzW10gPSB7CisgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMQorfTsKKworc3RhdGljIGNvbnN0IGd1aW50OCBjaG1fYWNfY29kZWxlbnNbXSA9IHsKKyAgMCwgMiwgMSwgMiwgNCwgNCwgMywgNCwgNywgNSwgNCwgNCwgMCwgMSwgMiwgMHg3NworfTsKKworc3RhdGljIGNvbnN0IGd1aW50OCBjaG1fYWNfc3ltYm9sc1tdID0geworICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDExLCAweDA0LCAweDA1LCAweDIxLAorICAweDMxLCAweDA2LCAweDEyLCAweDQxLCAweDUxLCAweDA3LCAweDYxLCAweDcxLAorICAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LCAweDQyLCAweDkxLAorICAweGExLCAweGIxLCAweGMxLCAweDA5LCAweDIzLCAweDMzLCAweDUyLCAweGYwLAorICAweDE1LCAweDYyLCAweDcyLCAweGQxLCAweDBhLCAweDE2LCAweDI0LCAweDM0LAorICAweGUxLCAweDI1LCAweGYxLCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDI2LAorICAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM1LCAweDM2LCAweDM3LCAweDM4LAorICAweDM5LCAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LAorICAweDQ5LCAweDRhLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LAorICAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LAorICAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LAorICAweDc5LCAweDdhLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAorICAweDg4LCAweDg5LCAweDhhLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LAorICAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LAorICAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LAorICAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLAorICAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGQyLAorICAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLAorICAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LAorICAweGVhLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LAorICAweGY5LCAweGZhCit9OworCitzdGF0aWMgZ3VpbnQ4ICoKK01ha2VRdWFudEhlYWRlciAoZ3VpbnQ4ICogcCwgZ3VpbnQ4ICogcXQsIGdpbnQgc2l6ZSwgZ2ludCB0YWJsZU5vKQoreworICAqcCsrID0gMHhmZjsKKyAgKnArKyA9IDB4ZGI7ICAgICAgICAgICAgICAgICAgLyogRFFUICovCisgICpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBtc2IgKi8KKyAgKnArKyA9IHNpemUgKyAzOyAgICAgICAgICAgICAgLyogbGVuZ3RoIGxzYiAqLworICAqcCsrID0gdGFibGVObzsKKyAgbWVtY3B5IChwLCBxdCwgc2l6ZSk7CisKKyAgcmV0dXJuIChwICsgc2l6ZSk7Cit9CisKK3N0YXRpYyBndWludDggKgorTWFrZUh1ZmZtYW5IZWFkZXIgKGd1aW50OCAqIHAsIGNvbnN0IGd1aW50OCAqIGNvZGVsZW5zLCBpbnQgbmNvZGVzLAorICAgIGNvbnN0IGd1aW50OCAqIHN5bWJvbHMsIGludCBuc3ltYm9scywgaW50IHRhYmxlTm8sIGludCB0YWJsZUNsYXNzKQoreworICAqcCsrID0gMHhmZjsKKyAgKnArKyA9IDB4YzQ7ICAgICAgICAgICAgICAgICAgLyogREhUICovCisgICpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBtc2IgKi8KKyAgKnArKyA9IDMgKyBuY29kZXMgKyBuc3ltYm9sczsgLyogbGVuZ3RoIGxzYiAqLworICAqcCsrID0gKHRhYmxlQ2xhc3MgPDwgNCkgfCB0YWJsZU5vOworICBtZW1jcHkgKHAsIGNvZGVsZW5zLCBuY29kZXMpOworICBwICs9IG5jb2RlczsKKyAgbWVtY3B5IChwLCBzeW1ib2xzLCBuc3ltYm9scyk7CisgIHAgKz0gbnN5bWJvbHM7CisKKyAgcmV0dXJuIChwKTsKK30KKworc3RhdGljIGd1aW50OCAqCitNYWtlRFJJSGVhZGVyIChndWludDggKiBwLCBndWludDE2IGRyaSkKK3sKKyAgKnArKyA9IDB4ZmY7CisgICpwKysgPSAweGRkOyAgICAgICAgICAgICAgICAgIC8qIERSSSAqLworICAqcCsrID0gMHgwOyAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggbXNiICovCisgICpwKysgPSA0OyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBsc2IgKi8KKyAgKnArKyA9IGRyaSA+PiA4OyAgICAgICAgICAgICAgLyogZHJpIG1zYiAqLworICAqcCsrID0gZHJpICYgMHhmZjsgICAgICAgICAgICAvKiBkcmkgbHNiICovCisKKyAgcmV0dXJuIChwKTsKK30KKworLyoKKyAqICBBcmd1bWVudHM6CisgKiAgICB0eXBlLCB3aWR0aCwgaGVpZ2h0OiBhcyBzdXBwbGllZCBpbiBSVFAvSlBFRyBoZWFkZXIKKyAqICAgIHF0OiBxdWFudGl6YXRpb24gdGFibGVzIGFzIGVpdGhlciBkZXJpdmVkIGZyb20KKyAqICAgICAgICB0aGUgUSBmaWVsZCB1c2luZyBNYWtlVGFibGVzKCkgb3IgYXMgc3BlY2lmaWVkCisgKiAgICAgICAgaW4gc2VjdGlvbiA0LjIuCisgKiAgICBkcmk6IHJlc3RhcnQgaW50ZXJ2YWwgaW4gTUNVcywgb3IgMCBpZiBubyByZXN0YXJ0cy4KKyAqCisgKiAgICBwOiBwb2ludGVyIHRvIHJldHVybiBhcmVhCisgKgorICogIFJldHVybiB2YWx1ZToKKyAqICAgIFRoZSBsZW5ndGggb2YgdGhlIGdlbmVyYXRlZCBoZWFkZXJzLgorICoKKyAqICAgIEdlbmVyYXRlIGEgZnJhbWUgYW5kIHNjYW4gaGVhZGVycyB0aGF0IGNhbiBiZSBwcmVwZW5kZWQgdG8gdGhlCisgKiAgICBSVFAvSlBFRyBkYXRhIHBheWxvYWQgdG8gcHJvZHVjZSBhIEpQRUcgY29tcHJlc3NlZCBpbWFnZSBpbgorICogICAgaW50ZXJjaGFuZ2UgZm9ybWF0IChleGNlcHQgZm9yIHBvc3NpYmxlIHRyYWlsaW5nIGdhcmJhZ2UgYW5kCisgKiAgICBhYnNlbmNlIG9mIGFuIEVPSSBtYXJrZXIgdG8gdGVybWluYXRlIHRoZSBzY2FuKS4KKyAqLworc3RhdGljIGd1aW50CitNYWtlSGVhZGVycyAoZ3VpbnQ4ICogcCwgaW50IHR5cGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgZ3VpbnQ4ICogcXQsCisgICAgZ3VpbnQgcHJlY2lzaW9uLCBndWludDE2IGRyaSkKK3sKKyAgZ3VpbnQ4ICpzdGFydCA9IHA7CisgIGdpbnQgc2l6ZTsKKworICAqcCsrID0gMHhmZjsKKyAgKnArKyA9IDB4ZDg7ICAgICAgICAgICAgICAgICAgLyogU09JICovCisKKyAgc2l6ZSA9ICgocHJlY2lzaW9uICYgMSkgPyAxMjggOiA2NCk7CisgIHAgPSBNYWtlUXVhbnRIZWFkZXIgKHAsIHF0LCBzaXplLCAwKTsKKyAgcXQgKz0gc2l6ZTsKKworICBzaXplID0gKChwcmVjaXNpb24gJiAyKSA/IDEyOCA6IDY0KTsKKyAgcCA9IE1ha2VRdWFudEhlYWRlciAocCwgcXQsIHNpemUsIDEpOworICBxdCArPSBzaXplOworCisgIGlmIChkcmkgIT0gMCkKKyAgICBwID0gTWFrZURSSUhlYWRlciAocCwgZHJpKTsKKworICAqcCsrID0gMHhmZjsKKyAgKnArKyA9IDB4YzA7ICAgICAgICAgICAgICAgICAgLyogU09GICovCisgICpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBtc2IgKi8KKyAgKnArKyA9IDE3OyAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGxzYiAqLworICAqcCsrID0gODsgICAgICAgICAgICAgICAgICAgICAvKiA4LWJpdCBwcmVjaXNpb24gKi8KKyAgKnArKyA9IGhlaWdodCA+PiA4OyAgICAgICAgICAgLyogaGVpZ2h0IG1zYiAqLworICAqcCsrID0gaGVpZ2h0OyAgICAgICAgICAgICAgICAvKiBoZWlnaHQgbHNiICovCisgICpwKysgPSB3aWR0aCA+PiA4OyAgICAgICAgICAgIC8qIHdpZHRoIG1zYiAqLworICAqcCsrID0gd2lkdGg7ICAgICAgICAgICAgICAgICAvKiB3aWR0aCBsc2IgKi8KKyAgKnArKyA9IDM7ICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvbXBvbmVudHMgKi8KKyAgKnArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogY29tcCAwICovCisgIGlmICgodHlwZSAmIDB4M2YpID09IDApCisgICAgKnArKyA9IDB4MjE7ICAgICAgICAgICAgICAgIC8qIGhzYW1wID0gMiwgdnNhbXAgPSAxICovCisgIGVsc2UKKyAgICAqcCsrID0gMHgyMjsgICAgICAgICAgICAgICAgLyogaHNhbXAgPSAyLCB2c2FtcCA9IDIgKi8KKyAgKnArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnQgdGFibGUgMCAqLworICAqcCsrID0gMTsgICAgICAgICAgICAgICAgICAgICAvKiBjb21wIDEgKi8KKyAgKnArKyA9IDB4MTE7ICAgICAgICAgICAgICAgICAgLyogaHNhbXAgPSAxLCB2c2FtcCA9IDEgKi8KKyAgKnArKyA9IDE7ICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnQgdGFibGUgMSAqLworICAqcCsrID0gMjsgICAgICAgICAgICAgICAgICAgICAvKiBjb21wIDIgKi8KKyAgKnArKyA9IDB4MTE7ICAgICAgICAgICAgICAgICAgLyogaHNhbXAgPSAxLCB2c2FtcCA9IDEgKi8KKyAgKnArKyA9IDE7ICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnQgdGFibGUgMSAqLworCisgIHAgPSBNYWtlSHVmZm1hbkhlYWRlciAocCwgbHVtX2RjX2NvZGVsZW5zLAorICAgICAgc2l6ZW9mIChsdW1fZGNfY29kZWxlbnMpLCBsdW1fZGNfc3ltYm9scywgc2l6ZW9mIChsdW1fZGNfc3ltYm9scyksIDAsIDApOworICBwID0gTWFrZUh1ZmZtYW5IZWFkZXIgKHAsIGx1bV9hY19jb2RlbGVucywKKyAgICAgIHNpemVvZiAobHVtX2FjX2NvZGVsZW5zKSwgbHVtX2FjX3N5bWJvbHMsIHNpemVvZiAobHVtX2FjX3N5bWJvbHMpLCAwLCAxKTsKKyAgcCA9IE1ha2VIdWZmbWFuSGVhZGVyIChwLCBjaG1fZGNfY29kZWxlbnMsCisgICAgICBzaXplb2YgKGNobV9kY19jb2RlbGVucyksIGNobV9kY19zeW1ib2xzLCBzaXplb2YgKGNobV9kY19zeW1ib2xzKSwgMSwgMCk7CisgIHAgPSBNYWtlSHVmZm1hbkhlYWRlciAocCwgY2htX2FjX2NvZGVsZW5zLAorICAgICAgc2l6ZW9mIChjaG1fYWNfY29kZWxlbnMpLCBjaG1fYWNfc3ltYm9scywgc2l6ZW9mIChjaG1fYWNfc3ltYm9scyksIDEsIDEpOworCisgICpwKysgPSAweGZmOworICAqcCsrID0gMHhkYTsgICAgICAgICAgICAgICAgICAvKiBTT1MgKi8KKyAgKnArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG1zYiAqLworICAqcCsrID0gMTI7ICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggbHNiICovCisgICpwKysgPSAzOyAgICAgICAgICAgICAgICAgICAgIC8qIDMgY29tcG9uZW50cyAqLworICAqcCsrID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBjb21wIDAgKi8KKyAgKnArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogaHVmZm1hbiB0YWJsZSAwICovCisgICpwKysgPSAxOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXAgMSAqLworICAqcCsrID0gMHgxMTsgICAgICAgICAgICAgICAgICAvKiBodWZmbWFuIHRhYmxlIDEgKi8KKyAgKnArKyA9IDI7ICAgICAgICAgICAgICAgICAgICAgLyogY29tcCAyICovCisgICpwKysgPSAweDExOyAgICAgICAgICAgICAgICAgIC8qIGh1ZmZtYW4gdGFibGUgMSAqLworICAqcCsrID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBEQ1QgY29lZmYgKi8KKyAgKnArKyA9IDYzOyAgICAgICAgICAgICAgICAgICAgLyogbGFzdCBEQ1QgY29lZmYgKi8KKyAgKnArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogc3VjZXNzaXZlIGFwcHJveC4gKi8KKworICByZXR1cm4gKHAgLSBzdGFydCk7Cit9OworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfanBlZ19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UnRwSlBFR0RlcGF5ICpydHBqcGVnZGVwYXk7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnaW50IGNsb2NrX3JhdGU7CisgIGNvbnN0IGdjaGFyICptZWRpYV9hdHRyOworCisgIHJ0cGpwZWdkZXBheSA9IEdTVF9SVFBfSlBFR19ERVBBWSAoZGVwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwanBlZ2RlcGF5LCAiQ2FwcyBzZXQ6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBjbG9ja19yYXRlID0gOTAwMDA7CisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgLyogcmVzZXQgZGVmYXVsdHMgKi8KKyAgcnRwanBlZ2RlcGF5LT53aWR0aCA9IDA7CisgIHJ0cGpwZWdkZXBheS0+aGVpZ2h0ID0gMDsKKyAgcnRwanBlZ2RlcGF5LT5tZWRpYV93aWR0aCA9IDA7CisgIHJ0cGpwZWdkZXBheS0+bWVkaWFfaGVpZ2h0ID0gMDsKKyAgcnRwanBlZ2RlcGF5LT5mcmF0ZV9udW0gPSAwOworICBydHBqcGVnZGVwYXktPmZyYXRlX2Rlbm9tID0gMTsKKworICAvKiBjaGVjayBmb3Igb3B0aW9uYWwgU0RQIGF0dHJpYnV0ZXMgKi8KKyAgaWYgKChtZWRpYV9hdHRyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJ4LWRpbWVuc2lvbnMiKSkpIHsKKyAgICBnaW50IHcsIGg7CisKKyAgICBpZiAoc3NjYW5mIChtZWRpYV9hdHRyLCAiJWQsJWQiLCAmdywgJmgpID09IDIpIHsKKyAgICAgIHJ0cGpwZWdkZXBheS0+bWVkaWFfd2lkdGggPSB3OworICAgICAgcnRwanBlZ2RlcGF5LT5tZWRpYV9oZWlnaHQgPSBoOworICAgIH0KKyAgfQorCisgIC8qIHRyeSB0byBnZXQgYSBmcmFtZXJhdGUgKi8KKyAgbWVkaWFfYXR0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiYS1mcmFtZXJhdGUiKTsKKyAgaWYgKCFtZWRpYV9hdHRyKQorICAgIG1lZGlhX2F0dHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgIngtZnJhbWVyYXRlIik7CisKKyAgaWYgKG1lZGlhX2F0dHIpIHsKKyAgICBHVmFsdWUgc3JjID0geyAwIH07CisgICAgR1ZhbHVlIGRlc3QgPSB7IDAgfTsKKyAgICBnY2hhciAqczsKKworICAgIC8qIGNhbm9uaWNhbGlzZSBmbG9hdGluZyBwb2ludCBzdHJpbmcgc28gd2UgY2FuIGhhbmRsZSBmcmFtZXJhdGUgc3RyaW5ncworICAgICAqIGluIHRoZSBmb3JtICIyNC45MzAiIG9yICIyNCw5MzAiIGlycmVzcGVjdGl2ZSBvZiB0aGUgY3VycmVudCBsb2NhbGUgKi8KKyAgICBzID0gZ19zdHJkdXAgKG1lZGlhX2F0dHIpOworICAgIGdfc3RyZGVsaW1pdCAocywgIiwiLCAnLicpOworCisgICAgLyogY29udmVydCB0aGUgZmxvYXQgdG8gYSBmcmFjdGlvbiAqLworICAgIGdfdmFsdWVfaW5pdCAoJnNyYywgR19UWVBFX0RPVUJMRSk7CisgICAgZ192YWx1ZV9zZXRfZG91YmxlICgmc3JjLCBnX2FzY2lpX3N0cnRvZCAocywgTlVMTCkpOworICAgIGdfdmFsdWVfaW5pdCAoJmRlc3QsIEdTVF9UWVBFX0ZSQUNUSU9OKTsKKyAgICBnX3ZhbHVlX3RyYW5zZm9ybSAoJnNyYywgJmRlc3QpOworCisgICAgcnRwanBlZ2RlcGF5LT5mcmF0ZV9udW0gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAoJmRlc3QpOworICAgIHJ0cGpwZWdkZXBheS0+ZnJhdGVfZGVub20gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yICgmZGVzdCk7CisKKyAgICBnX2ZyZWUgKHMpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9qcGVnX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0UnRwSlBFR0RlcGF5ICpydHBqcGVnZGVwYXk7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBnaW50IHBheWxvYWRfbGVuLCBoZWFkZXJfbGVuOworICBndWludDggKnBheWxvYWQ7CisgIGd1aW50IGZyYWdfb2Zmc2V0OworICBnaW50IFE7CisgIGd1aW50IHR5cGUsIHdpZHRoLCBoZWlnaHQ7CisgIGd1aW50MTYgZHJpLCBwcmVjaXNpb24sIGxlbmd0aDsKKyAgZ3VpbnQ4ICpxdGFibGU7CisKKyAgcnRwanBlZ2RlcGF5ID0gR1NUX1JUUF9KUEVHX0RFUEFZIChkZXBheWxvYWQpOworCisgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKHJ0cC0+YnVmZmVyKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgIkRJU0NPTlQsIHJlc2V0IGFkYXB0ZXIiKTsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRwanBlZ2RlcGF5LT5hZGFwdGVyKTsKKyAgICBydHBqcGVnZGVwYXktPmRpc2NvbnQgPSBUUlVFOworICB9CisKKyAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisKKyAgaWYgKHBheWxvYWRfbGVuIDwgOCkKKyAgICBnb3RvIGVtcHR5X3BhY2tldDsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisgIGhlYWRlcl9sZW4gPSAwOworCisgIC8qICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCBUeXBlLXNwZWNpZmljIHwgICAgICAgICAgICAgIEZyYWdtZW50IE9mZnNldCAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgIFR5cGUgICAgIHwgICAgICAgUSAgICAgICB8ICAgICBXaWR0aCAgICAgfCAgICAgSGVpZ2h0ICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICovCisgIGZyYWdfb2Zmc2V0ID0gKHBheWxvYWRbMV0gPDwgMTYpIHwgKHBheWxvYWRbMl0gPDwgOCkgfCBwYXlsb2FkWzNdOworICB0eXBlID0gcGF5bG9hZFs0XTsKKyAgUSA9IHBheWxvYWRbNV07CisgIHdpZHRoID0gcGF5bG9hZFs2XSAqIDg7CisgIGhlaWdodCA9IHBheWxvYWRbN10gKiA4OworCisgIC8qIHNhdyBhIHBhY2tldCB3aXRoIGZyYWdtZW50IG9mZnNldCA+IDAgYW5kIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBkYXRhIHF1ZXVlZAorICAgKiB1cCAobW9zdCBpbXBvcnRhbnRseSwgd2UgZG9uJ3QgaGF2ZSBhIGhlYWRlciBmb3IgdGhpcyBkYXRhKSAtLSBkcm9wIGl0CisgICAqIFhYWDogbWF5YmUgd2UgY2FuIGNoZWNrIGlmIHRoZSBqcGVnIGlzIHByb2dyZXNzaXZlIGFuZCBzYWx2YWdlIHRoZSBkYXRhPworICAgKiBYWFg6IG5vdCBpbXBsZW1lbnRlZCB5ZXQgYmVjYXVzZSBqcGVnZW5jIGNhbid0IGNyZWF0ZSBwcm9ncmVzc2l2ZSBqcGVncyAqLworICBpZiAoZnJhZ19vZmZzZXQgPiAwICYmIGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwanBlZ2RlcGF5LT5hZGFwdGVyKSA9PSAwKQorICAgIGdvdG8gbm9faGVhZGVyX3BhY2tldDsKKworICAvKiBhbGxvdyBmcmFtZSBkaW1lbnNpb25zID4gMjA0MCwgcGFzc2VkIGluIFNEUCBzZXNzaW9uIG9yIG1lZGlhIGF0dHJpYnV0ZXMKKyAgICogZnJvbSBnc3RydHNwc3JjLmMgKGdzdF9ydHNwc3JjX3NkcF9hdHRyaWJ1dGVzX3RvX2NhcHMpLCBvciBpbiBjYXBzICovCisgIGlmICghd2lkdGgpCisgICAgd2lkdGggPSBydHBqcGVnZGVwYXktPm1lZGlhX3dpZHRoOworCisgIGlmICghaGVpZ2h0KQorICAgIGhlaWdodCA9IHJ0cGpwZWdkZXBheS0+bWVkaWFfaGVpZ2h0OworCisgIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKQorICAgIGdvdG8gaW52YWxpZF9kaW1lbnNpb247CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwanBlZ2RlcGF5LCAiZnJhZyAldSwgdHlwZSAldSwgUSAlZCwgd2lkdGggJXUsIGhlaWdodCAldSIsCisgICAgICBmcmFnX29mZnNldCwgdHlwZSwgUSwgd2lkdGgsIGhlaWdodCk7CisKKyAgaGVhZGVyX2xlbiArPSA4OworICBwYXlsb2FkICs9IDg7CisgIHBheWxvYWRfbGVuIC09IDg7CisKKyAgZHJpID0gMDsKKyAgaWYgKHR5cGUgPiA2MykgeworICAgIGlmIChwYXlsb2FkX2xlbiA8IDQpCisgICAgICBnb3RvIGVtcHR5X3BhY2tldDsKKworICAgIC8qICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICogfCAgICAgICBSZXN0YXJ0IEludGVydmFsICAgICAgICB8RnxMfCAgICAgICBSZXN0YXJ0IENvdW50ICAgICAgIHwKKyAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqLworICAgIGRyaSA9IChwYXlsb2FkWzBdIDw8IDgpIHwgcGF5bG9hZFsxXTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGpwZWdkZXBheSwgIkRSSSAlIiBHX0dVSU5UMTZfRk9STUFULCBkcmkpOworCisgICAgcGF5bG9hZCArPSA0OworICAgIGhlYWRlcl9sZW4gKz0gNDsKKyAgICBwYXlsb2FkX2xlbiAtPSA0OworICB9CisKKyAgaWYgKFEgPj0gMTI4ICYmIGZyYWdfb2Zmc2V0ID09IDApIHsKKyAgICBpZiAocGF5bG9hZF9sZW4gPCA0KQorICAgICAgZ290byBlbXB0eV9wYWNrZXQ7CisKKyAgICAvKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqIHwgICAgICBNQlogICAgICB8ICAgUHJlY2lzaW9uICAgfCAgICAgICAgICAgICBMZW5ndGggICAgICAgICAgICB8CisgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICBRdWFudGl6YXRpb24gVGFibGUgRGF0YSAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKi8KKyAgICBwcmVjaXNpb24gPSBwYXlsb2FkWzFdOworICAgIGxlbmd0aCA9IChwYXlsb2FkWzJdIDw8IDgpIHwgcGF5bG9hZFszXTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGpwZWdkZXBheSwgInByZWNpc2lvbiAlMDR4LCBsZW5ndGggJSIgR19HVUlOVDE2X0ZPUk1BVCwKKyAgICAgICAgcHJlY2lzaW9uLCBsZW5ndGgpOworCisgICAgaWYgKFEgPT0gMjU1ICYmIGxlbmd0aCA9PSAwKQorICAgICAgZ290byBlbXB0eV9wYWNrZXQ7CisKKyAgICBwYXlsb2FkICs9IDQ7CisgICAgaGVhZGVyX2xlbiArPSA0OworICAgIHBheWxvYWRfbGVuIC09IDQ7CisKKyAgICBpZiAobGVuZ3RoID4gcGF5bG9hZF9sZW4pCisgICAgICBnb3RvIGVtcHR5X3BhY2tldDsKKworICAgIGlmIChsZW5ndGggPiAwKQorICAgICAgcXRhYmxlID0gcGF5bG9hZDsKKyAgICBlbHNlCisgICAgICBxdGFibGUgPSBydHBqcGVnZGVwYXktPnF0YWJsZXNbUV07CisKKyAgICBwYXlsb2FkICs9IGxlbmd0aDsKKyAgICBoZWFkZXJfbGVuICs9IGxlbmd0aDsKKyAgICBwYXlsb2FkX2xlbiAtPSBsZW5ndGg7CisgIH0gZWxzZSB7CisgICAgbGVuZ3RoID0gMDsKKyAgICBxdGFibGUgPSBOVUxMOworICAgIHByZWNpc2lvbiA9IDA7CisgIH0KKworICBpZiAoZnJhZ19vZmZzZXQgPT0gMCkgeworICAgIEdzdE1hcEluZm8gbWFwOworICAgIGd1aW50IHNpemU7CisKKyAgICBpZiAocnRwanBlZ2RlcGF5LT53aWR0aCAhPSB3aWR0aCB8fCBydHBqcGVnZGVwYXktPmhlaWdodCAhPSBoZWlnaHQpIHsKKyAgICAgIEdzdENhcHMgKm91dGNhcHM7CisKKyAgICAgIG91dGNhcHMgPQorICAgICAgICAgIGdzdF9jYXBzX25ld19zaW1wbGUgKCJpbWFnZS9qcGVnIiwgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLAorICAgICAgICAgIHJ0cGpwZWdkZXBheS0+ZnJhdGVfbnVtLCBydHBqcGVnZGVwYXktPmZyYXRlX2Rlbm9tLCAid2lkdGgiLAorICAgICAgICAgIEdfVFlQRV9JTlQsIHdpZHRoLCAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgaGVpZ2h0LCBOVUxMKTsKKyAgICAgIGdzdF9wYWRfc2V0X2NhcHMgKGRlcGF5bG9hZC0+c3JjcGFkLCBvdXRjYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChvdXRjYXBzKTsKKworICAgICAgcnRwanBlZ2RlcGF5LT53aWR0aCA9IHdpZHRoOworICAgICAgcnRwanBlZ2RlcGF5LT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgfQorCisgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGpwZWdkZXBheSwgImZpcnN0IHBhY2tldCwgbGVuZ3RoICUiIEdfR1VJTlQxNl9GT1JNQVQsCisgICAgICAgIGxlbmd0aCk7CisKKyAgICAvKiBmaXJzdCBwYWNrZXQgKi8KKyAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgIGlmIChRIDwgMTI4KSB7CisgICAgICAgIC8qIG5vIHF1YW50IHRhYmxlLCBzZWUgaWYgd2UgaGF2ZSBvbmUgY2FjaGVkICovCisgICAgICAgIHF0YWJsZSA9IHJ0cGpwZWdkZXBheS0+cXRhYmxlc1tRXTsKKyAgICAgICAgaWYgKCFxdGFibGUpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBqcGVnZGVwYXksICJtYWtpbmcgUSAlZCB0YWJsZSIsIFEpOworICAgICAgICAgIC8qIG1ha2UgYW5kIGNhY2hlIHRoZSB0YWJsZSAqLworICAgICAgICAgIHF0YWJsZSA9IGdfbmV3IChndWludDgsIDEyOCk7CisgICAgICAgICAgTWFrZVRhYmxlcyAocnRwanBlZ2RlcGF5LCBRLCBxdGFibGUpOworICAgICAgICAgIHJ0cGpwZWdkZXBheS0+cXRhYmxlc1tRXSA9IHF0YWJsZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBqcGVnZGVwYXksICJ1c2luZyBjYWNoZWQgdGFibGUgZm9yIFEgJWQiLCBRKTsKKyAgICAgICAgfQorICAgICAgICAvKiBhbGwgOCBiaXQgcXVhbnRpemVycyAqLworICAgICAgICBwcmVjaXNpb24gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFxdGFibGUpCisgICAgICAgICAgZ290byBub19xdGFibGU7CisgICAgICB9CisgICAgfQorCisgICAgLyogSSB0aGluayB3ZSBjYW4gZ2V0IGhlcmUgd2l0aCBhIE5VTEwgcXRhYmxlLCBzbyBtYWtlIHN1cmUgd2UgZG9uJ3QKKyAgICAgICBnbyBkZXJlZmVyZW5jaW5nIGl0IGluIE1ha2VIZWFkZXJzIGlmIHdlIGRvICovCisgICAgaWYgKCFxdGFibGUpCisgICAgICBnb3RvIG5vX3F0YWJsZTsKKworICAgIC8qIG1heCBoZWFkZXIgbGVuZ3RoLCBzaG91bGQgYmUgYmlnIGVub3VnaCAqLworICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAwMCk7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgICAgc2l6ZSA9IE1ha2VIZWFkZXJzIChtYXAuZGF0YSwgdHlwZSwgd2lkdGgsIGhlaWdodCwgcXRhYmxlLCBwcmVjaXNpb24sIGRyaSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3Jlc2l6ZSAob3V0YnVmLCAwLCBzaXplKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGpwZWdkZXBheSwgInB1c2hpbmcgJXUgYnl0ZXMgb2YgaGVhZGVyIiwgc2l6ZSk7CisKKyAgICBnc3RfYWRhcHRlcl9wdXNoIChydHBqcGVnZGVwYXktPmFkYXB0ZXIsIG91dGJ1Zik7CisgIH0KKworICAvKiB0YWtlIEpQRUcgZGF0YSwgcHVzaCBpbiB0aGUgYWRhcHRlciAqLworICBHU1RfREVCVUdfT0JKRUNUIChydHBqcGVnZGVwYXksICJwdXNoaW5nIGRhdGEgYXQgb2Zmc2V0ICVkIiwgaGVhZGVyX2xlbik7CisgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3N1YmJ1ZmZlciAocnRwLCBoZWFkZXJfbGVuLCAtMSk7CisgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cGpwZWdkZXBheS0+YWRhcHRlciwgb3V0YnVmKTsKKyAgb3V0YnVmID0gTlVMTDsKKworICBpZiAoZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAocnRwKSkgeworICAgIGd1aW50IGF2YWlsOworICAgIGd1aW50OCBlbmRbMl07CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICAvKiBsYXN0IGJ1ZmZlciB0YWtlIGFsbCBkYXRhIG91dCBvZiB0aGUgYWRhcHRlciAqLworICAgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBqcGVnZGVwYXktPmFkYXB0ZXIpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGpwZWdkZXBheSwgIm1hcmtlciBzZXQsIGxhc3QgYnVmZmVyIik7CisKKyAgICBpZiAoYXZhaWwgPCAyKQorICAgICAgZ290byBpbnZhbGlkX3BhY2tldDsKKworICAgIC8qIHRha2UgdGhlIGxhc3QgYnl0ZXMgb2YgdGhlIGpwZWcgZGF0YSB0byBzZWUgaWYgdGhlcmUgaXMgYW4gRU9JCisgICAgICogbWFya2VyICovCisgICAgZ3N0X2FkYXB0ZXJfY29weSAocnRwanBlZ2RlcGF5LT5hZGFwdGVyLCBlbmQsIGF2YWlsIC0gMiwgMik7CisKKyAgICBpZiAoZW5kWzBdICE9IDB4ZmYgJiYgZW5kWzFdICE9IDB4ZDkpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGpwZWdkZXBheSwgIm5vIEVPSSBtYXJrZXIsIGFkZGluZyBvbmUiKTsKKworICAgICAgLyogbm8gRU9JIG1hcmtlciwgYWRkIG9uZSAqLworICAgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgyKTsKKyAgICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgICAgbWFwLmRhdGFbMF0gPSAweGZmOworICAgICAgbWFwLmRhdGFbMV0gPSAweGQ5OworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICAgICAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwanBlZ2RlcGF5LT5hZGFwdGVyLCBvdXRidWYpOworICAgICAgYXZhaWwgKz0gMjsKKyAgICB9CisgICAgb3V0YnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHJ0cGpwZWdkZXBheS0+YWRhcHRlciwgYXZhaWwpOworCisgICAgaWYgKHJ0cGpwZWdkZXBheS0+ZGlzY29udCkgeworICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgICBydHBqcGVnZGVwYXktPmRpc2NvbnQgPSBGQUxTRTsKKyAgICB9CisKKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX3ZpZGVvX21ldGEgKHJ0cGpwZWdkZXBheSwgb3V0YnVmKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGpwZWdkZXBheSwgInJldHVybmluZyAldSBieXRlcyIsIGF2YWlsKTsKKyAgfQorCisgIHJldHVybiBvdXRidWY7CisKKyAgLyogRVJST1JTICovCitlbXB0eV9wYWNrZXQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBqcGVnZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIkVtcHR5IFBheWxvYWQuIiksIChOVUxMKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2ludmFsaWRfZGltZW5zaW9uOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwanBlZ2RlcGF5LCBTVFJFQU0sIEZPUk1BVCwKKyAgICAgICAgKCJJbnZhbGlkIERpbWVuc2lvbiAlZHglZC4iLCB3aWR0aCwgaGVpZ2h0KSwgKE5VTEwpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorbm9fcXRhYmxlOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChydHBqcGVnZGVwYXksICJubyBxdGFibGUiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQoraW52YWxpZF9wYWNrZXQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cGpwZWdkZXBheSwgImludmFsaWQgcGFja2V0Iik7CisgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHJ0cGpwZWdkZXBheS0+YWRhcHRlciwKKyAgICAgICAgZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBqcGVnZGVwYXktPmFkYXB0ZXIpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorbm9faGVhZGVyX3BhY2tldDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwanBlZ2RlcGF5LAorICAgICAgICAiZGlzY2FyZGluZyBkYXRhIHBhY2tldHMgcmVjZWl2ZWQgd2hlbiB3ZSBoYXZlIG5vIGhlYWRlciIpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2pwZWdfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSdHBKUEVHRGVwYXkgKnJ0cGpwZWdkZXBheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJ0cGpwZWdkZXBheSA9IEdTVF9SVFBfSlBFR19ERVBBWSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGdzdF9ydHBfanBlZ19kZXBheV9yZXNldCAocnRwanBlZ2RlcGF5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworCitnYm9vbGVhbgorZ3N0X3J0cF9qcGVnX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwanBlZ2RlcGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX0pQRUdfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBqcGVnZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3NGYxMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwanBlZ2RlcGF5LmgKQEAgLTAsMCArMSw3MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0pQRUdfREVQQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9KUEVHX0RFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9KUEVHX0RFUEFZIFwKKyAgKGdzdF9ydHBfanBlZ19kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0pQRUdfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfSlBFR19ERVBBWSxHc3RSdHBKUEVHRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX0pQRUdfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0pQRUdfREVQQVksR3N0UnRwSlBFR0RlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0pQRUdfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfSlBFR19ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfSlBFR19ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSlBFR19ERVBBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBKUEVHRGVwYXkgR3N0UnRwSlBFR0RlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEpQRUdEZXBheUNsYXNzIEdzdFJ0cEpQRUdEZXBheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cEpQRUdEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKKworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBnYm9vbGVhbiAgICBkaXNjb250OworCisgIC8qIGNhY2hlZCBxdWFudCB0YWJsZXMgKi8KKyAgZ3VpbnQ4ICogcXRhYmxlc1syNTVdOworICBnaW50IGZyYXRlX251bTsKKyAgZ2ludCBmcmF0ZV9kZW5vbTsKKyAgZ2ludCBtZWRpYV93aWR0aDsKKyAgZ2ludCBtZWRpYV9oZWlnaHQ7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKK307CisKK3N0cnVjdCBfR3N0UnRwSlBFR0RlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfanBlZ19kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfanBlZ19kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9KUEVHX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBqcGVncGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGpwZWdwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTkzMDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBqcGVncGF5LmMKQEAgLTAsMCArMSwxMDA2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBeGlzIENvbW11bmljYXRpb25zIDxkZXYtZ3N0cmVhbWVyQGF4aXMuY29tPgorICogQGF1dGhvciBCam9ybiBPc3RieSA8Ympvcm4ub3N0YnlAYXhpcy5jb20+CisgKiBAYXV0aG9yIFBldGVyIEtqZWxsZXJzdGVkdCA8cGV0ZXIua2plbGxlcnN0ZWR0QGF4aXMuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cGpwZWdwYXkKKyAqCisgKiBQYXlsb2FkIGVuY29kZSBKUEVHIHBpY3R1cmVzIGludG8gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyAyNDM1LgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMjQzNS50eHQKKyAqCisgKiBUaGUgcGF5bG9hZGVyIHRha2VzIGEgSlBFRyBwaWN0dXJlLCBzY2FucyB0aGUgaGVhZGVyIGZvciBxdWFudGl6YXRpb24KKyAqIHRhYmxlcyAoaWYgbmVlZGVkKSBhbmQgY29uc3RydWN0cyB0aGUgUlRQIHBhY2tldCBoZWFkZXIgZm9sbG93ZWQgYnkKKyAqIHRoZSBhY3R1YWwgSlBFRyBlbnRyb3B5IHNjYW4uCisgKgorICogVGhlIHBheWxvYWRlciBhc3N1bWVzIHRoYXQgY29ycmVjdCB3aWR0aCBhbmQgaGVpZ2h0IGlzIGZvdW5kIGluIHRoZSBjYXBzLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworI2luY2x1ZGUgImdzdHJ0cGpwZWdwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9qcGVnX3BheV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJpbWFnZS9qcGVnOyAiICJ2aWRlby94LWpwZWciKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2pwZWdfcGF5X3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICIgIG1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICIgIHBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9KUEVHX1NUUklORyAiLCAiCisgICAgICAgICIgIGNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgICAiCisgICAgICAgICIgIGVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIkpQRUdcIiwgIgorICAgICAgICAiICB3aWR0aCA9IChpbnQpIFsgMSwgNjU1MzYgXSwgIiAiICBoZWlnaHQgPSAoaW50KSBbIDEsIDY1NTM2IF07ICIKKyAgICAgICAgIiBhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAiICBtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAiICBwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiICBjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICAgIgorICAgICAgICAiICBlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJKUEVHXCIsICIKKyAgICAgICAgIiAgd2lkdGggPSAoaW50KSBbIDEsIDY1NTM2IF0sICIgIiAgaGVpZ2h0ID0gKGludCkgWyAxLCA2NTUzNiBdIikKKyAgICApOworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBqcGVncGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBqcGVncGF5X2RlYnVnKQorCisvKgorICogUVVBTlRfUFJFRklYX0xFTjoKKyAqCisgKiBQcmVmaXggbGVuZ3RoIGluIHRoZSBoZWFkZXIgYmVmb3JlIHRoZSBxdWFudGl6YXRpb24gdGFibGVzOgorICogVHdvIHNpemUgYnl0ZXMgYW5kIG9uZSBieXRlIGZvciBwcmVjaXNpb24KKyAqLworI2RlZmluZSBRVUFOVF9QUkVGSVhfTEVOICAgICAzCisKKwordHlwZWRlZiBlbnVtIF9SdHBKcGVnTWFya2VyIFJ0cEpwZWdNYXJrZXI7CisKKy8qCisgKiBSdHBKcGVnTWFya2VyOgorICogQEpQRUdfTUFSS0VSOiBQcmVmaXggZm9yIEpQRUcgbWFya2VyCisgKiBASlBFR19NQVJLRVJfU09JOiBTdGFydCBvZiBJbWFnZSBtYXJrZXIKKyAqIEBKUEVHX01BUktFUl9KRklGOiBKRklGIG1hcmtlcgorICogQEpQRUdfTUFSS0VSX0NNVDogQ29tbWVudCBtYXJrZXIKKyAqIEBKUEVHX01BUktFUl9EUVQ6IERlZmluZSBRdWFudGl6YXRpb24gVGFibGUgbWFya2VyCisgKiBASlBFR19NQVJLRVJfU09GOiBTdGFydCBvZiBGcmFtZSBtYXJrZXIKKyAqIEBKUEVHX01BUktFUl9ESFQ6IERlZmluZSBIdWZmbWFuIFRhYmxlIG1hcmtlcgorICogQEpQRUdfTUFSS0VSX1NPUzogU3RhcnQgb2YgU2NhbiBtYXJrZXIKKyAqIEBKUEVHX01BUktFUl9FT0k6IEVuZCBvZiBJbWFnZSBtYXJrZXIKKyAqIEBKUEVHX01BUktFUl9EUkk6IERlZmluZSBSZXN0YXJ0IEludGVydmFsIG1hcmtlcgorICogQEpQRUdfTUFSS0VSX0gyNjQ6IEgyNjQgbWFya2VyCisgKgorICogSWRlbnRpZmVycyBmb3IgbWFya2VycyBpbiBKUEVHIGhlYWRlcgorICovCitlbnVtIF9SdHBKcGVnTWFya2VyCit7CisgIEpQRUdfTUFSS0VSID0gMHhGRiwKKyAgSlBFR19NQVJLRVJfU09JID0gMHhEOCwKKyAgSlBFR19NQVJLRVJfSkZJRiA9IDB4RTAsCisgIEpQRUdfTUFSS0VSX0NNVCA9IDB4RkUsCisgIEpQRUdfTUFSS0VSX0RRVCA9IDB4REIsCisgIEpQRUdfTUFSS0VSX1NPRiA9IDB4QzAsCisgIEpQRUdfTUFSS0VSX0RIVCA9IDB4QzQsCisgIEpQRUdfTUFSS0VSX0pQRyA9IDB4QzgsCisgIEpQRUdfTUFSS0VSX1NPUyA9IDB4REEsCisgIEpQRUdfTUFSS0VSX0VPSSA9IDB4RDksCisgIEpQRUdfTUFSS0VSX0RSSSA9IDB4REQsCisgIEpQRUdfTUFSS0VSX0FQUDAgPSAweEUwLAorICBKUEVHX01BUktFUl9IMjY0ID0gMHhFNCwgICAgICAvKiBBUFA0ICovCisgIEpQRUdfTUFSS0VSX0FQUDE1ID0gMHhFRiwKKyAgSlBFR19NQVJLRVJfSlBHMCA9IDB4RjAsCisgIEpQRUdfTUFSS0VSX0pQRzEzID0gMHhGRAorfTsKKworI2RlZmluZSBERUZBVUxUX0pQRUdfUVVBTlQgICAgMjU1CisKKyNkZWZpbmUgREVGQVVMVF9KUEVHX1FVQUxJVFkgIDI1NQorI2RlZmluZSBERUZBVUxUX0pQRUdfVFlQRSAgICAgMQorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9KUEVHX1FVQUxJVFksCisgIFBST1BfSlBFR19UWVBFCit9OworCitlbnVtCit7CisgIFFfVEFCTEVfMCA9IDAsCisgIFFfVEFCTEVfMSwKKyAgUV9UQUJMRV9NQVggICAgICAgICAgICAgICAgICAgLyogb25seSBzdXBwb3J0IGZvciB0d28gdGFibGVzIGF0IHRoZSBtb21lbnQgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IF9SdHBKcGVnSGVhZGVyIFJ0cEpwZWdIZWFkZXI7CisKKy8qCisgKiBSdHBKcGVnSGVhZGVyOgorICogQHR5cGVfc3BlYzogdHlwZSBzcGVjaWZpYworICogQG9mZnNldDogZnJhZ21lbnQgb2Zmc2V0CisgKiBAdHlwZTogdHlwZSBmaWVsZAorICogQHE6IHF1YW50aXphdGlvbiB0YWJsZSBmb3IgdGhpcyBmcmFtZQorICogQHdpZHRoOiB3aWR0aCBvZiBpbWFnZSBpbiA4LXBpeGVsIG11bHRpcGxlcworICogQGhlaWdodDogaGVpZ2h0IG9mIGltYWdlIGluIDgtcGl4ZWwgbXVsdGlwbGVzCisgKgorICogMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICogMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCBUeXBlLXNwZWNpZmljIHwgICAgICAgICAgICAgIEZyYWdtZW50IE9mZnNldCAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgVHlwZSAgICAgfCAgICAgICBRICAgICAgIHwgICAgIFdpZHRoICAgICB8ICAgICBIZWlnaHQgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqLworc3RydWN0IF9SdHBKcGVnSGVhZGVyCit7CisgIGd1aW50IHR5cGVfc3BlYzo4OworICBndWludCBvZmZzZXQ6MjQ7CisgIGd1aW50OCB0eXBlOworICBndWludDggcTsKKyAgZ3VpbnQ4IHdpZHRoOworICBndWludDggaGVpZ2h0OworfTsKKworLyoKKyAqIFJ0cFF1YW50SGVhZGVyCisgKiBAbWJ6OiBtdXN0IGJlIHplcm8KKyAqIEBwcmVjaXNpb246IHNwZWNpZnkgc2l6ZSBvZiBxdWFudGl6YXRpb24gdGFibGVzCisgKiBAbGVuZ3RoOiBsZW5ndGggb2YgcXVhbnRpemF0aW9uIGRhdGEKKyAqCisgKiAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgTUJaICAgICAgfCAgIFByZWNpc2lvbiAgIHwgICAgICAgICAgICAgTGVuZ3RoICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgIFF1YW50aXphdGlvbiBUYWJsZSBEYXRhICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ3VpbnQ4IG1iejsKKyAgZ3VpbnQ4IHByZWNpc2lvbjsKKyAgZ3VpbnQxNiBsZW5ndGg7Cit9IFJ0cFF1YW50SGVhZGVyOworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludDggc2l6ZTsKKyAgY29uc3QgZ3VpbnQ4ICpkYXRhOworfSBSdHBRdWFudFRhYmxlOworCisvKgorICogUnRwUmVzdGFydE1hcmtlckhlYWRlcjoKKyAqIEByZXN0YXJ0SW50ZXJ2YWw6IG51bWJlciBvZiBNQ1VzIHRoYXQgYXBwZWFyIGJldHdlZW4gcmVzdGFydCBtYXJrZXJzCisgKiBAcmVzdGFydEZpcnN0TGFzdENvdW50OiBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmaXJzdCBwYWNrZXQgbWFyayBpbiB0aGUgY2h1bmsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgcGFja2V0IG1hcmsgaW4gdGhlIGNodW5rIGFuZCB0aGUgcG9zaXRpb24gb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCByZXN0YXJ0IGludGVydmFsIGluIHRoZSBjdXJyZW50ICJjaHVuayIKKyAqCisgKiAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgfCAgICAgICBSZXN0YXJ0IEludGVydmFsICAgICAgICB8RnxMfCAgICAgICBSZXN0YXJ0IENvdW50ICAgICAgIHwKKyAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICoKKyAqICBUaGUgcmVzdGFydCBtYXJrZXIgaGVhZGVyIGlzIGltcGxlbWVudGVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nCisgKiAgbWV0aG9kb2xvZ3kgc3BlY2lmaWVkIGluIHNlY3Rpb24gMy4xLjcgb2YgcmZjMjQzNS50eHQuCisgKgorICogICJJZiB0aGUgcmVzdGFydCBpbnRlcnZhbHMgaW4gYSBmcmFtZSBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgYWxpZ25lZAorICogIHdpdGggcGFja2V0IGJvdW5kYXJpZXMsIHRoZSBGIChmaXJzdCkgYW5kIEwgKGxhc3QpIGJpdHMgTVVTVCBiZSBzZXQKKyAqICB0byAxIGFuZCB0aGUgUmVzdGFydCBDb3VudCBNVVNUIGJlIHNldCB0byAweDNGRkYuICBUaGlzIGluZGljYXRlcworICogIHRoYXQgYSByZWNlaXZlciBNVVNUIHJlYXNzZW1ibGUgdGhlIGVudGlyZSBmcmFtZSBiZWZvcmUgZGVjb2RpbmcgaXQuIgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludDE2IHJlc3RhcnRfaW50ZXJ2YWw7CisgIGd1aW50MTYgcmVzdGFydF9jb3VudDsKK30gUnRwUmVzdGFydE1hcmtlckhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ3VpbnQ4IGlkOworICBndWludDggc2FtcDsKKyAgZ3VpbnQ4IHF0OworfSBDb21wSW5mbzsKKworLyogRklYTUU6IHJlc3RhcnQgbWFya2VyIGhlYWRlciBjdXJyZW50bHkgdW5zdXBwb3J0ZWQgKi8KKworc3RhdGljIHZvaWQgZ3N0X3J0cF9qcGVnX3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfanBlZ19wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9qcGVnX3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9qcGVnX3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBhZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworCisjZGVmaW5lIGdzdF9ydHBfanBlZ19wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwSlBFR1BheSwgZ3N0X3J0cF9qcGVnX3BheSwgR1NUX1RZUEVfUlRQX0JBU0VfUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2pwZWdfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cEpQRUdQYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9ydHBfanBlZ19wYXlfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX2pwZWdfcGF5X2dldF9wcm9wZXJ0eTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2pwZWdfcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfanBlZ19wYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlJUUCBKUEVHIHBheWxvYWRlciIsCisgICAgICAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkLWVuY29kZXMgSlBFRyBwaWN0dXJlcyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgMjQzNSkiLAorICAgICAgIkF4aXMgQ29tbXVuaWNhdGlvbnMgPGRldi1nc3RyZWFtZXJAYXhpcy5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9qcGVnX3BheV9zZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9IGdzdF9ydHBfanBlZ19wYXlfaGFuZGxlX2J1ZmZlcjsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0pQRUdfUVVBTElUWSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJxdWFsaXR5IiwgIlF1YWxpdHkiLAorICAgICAgICAgICJRdWFsaXR5IGZhY3RvciBvbiBKUEVHIGRhdGEgKHVudXNlZCkiLCAwLCAyNTUsIDI1NSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0pQRUdfVFlQRSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0eXBlIiwgIlR5cGUiLAorICAgICAgICAgICJEZWZhdWx0IEpQRUcgVHlwZSwgb3ZlcndyaXR0ZW4gYnkgU09GIHdoZW4gcHJlc2VudCIsIDAsIDI1NSwKKyAgICAgICAgICBERUZBVUxUX0pQRUdfVFlQRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cGpwZWdwYXlfZGVidWcsICJydHBqcGVncGF5IiwgMCwKKyAgICAgICJNb3Rpb24gSlBFRyBSVFAgUGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2pwZWdfcGF5X2luaXQgKEdzdFJ0cEpQRUdQYXkgKiBwYXkpCit7CisgIHBheS0+cXVhbGl0eSA9IERFRkFVTFRfSlBFR19RVUFMSVRZOworICBwYXktPnF1YW50ID0gREVGQVVMVF9KUEVHX1FVQU5UOworICBwYXktPnR5cGUgPSBERUZBVUxUX0pQRUdfVFlQRTsKKyAgcGF5LT53aWR0aCA9IC0xOworICBwYXktPmhlaWdodCA9IC0xOworCisgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX1BUIChwYXkpID0gR1NUX1JUUF9QQVlMT0FEX0pQRUc7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9qcGVnX3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpjYXBzX3N0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBHc3RSdHBKUEVHUGF5ICpwYXk7CisgIGdib29sZWFuIHJlczsKKyAgZ2ludCB3aWR0aCA9IC0xLCBoZWlnaHQgPSAtMTsKKyAgZ2ludCBudW0gPSAwLCBkZW5vbTsKKyAgZ2NoYXIgKnJhdGUgPSBOVUxMOworICBnY2hhciAqZGltID0gTlVMTDsKKworICBwYXkgPSBHU1RfUlRQX0pQRUdfUEFZIChiYXNlcGF5bG9hZCk7CisKKyAgLyogdGhlc2UgcHJvcGVydGllcyBhcmUgbWFuZGF0b3J5LCBidXQgdGhleSBtaWdodCBiZSBhZGp1c3RlZCBieSB0aGUgU09GLCBpZiB0aGVyZQorICAgKiBpcyBvbmUuICovCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChjYXBzX3N0cnVjdHVyZSwgImhlaWdodCIsICZoZWlnaHQpIHx8IGhlaWdodCA8PSAwKSB7CisgICAgZ290byBpbnZhbGlkX2RpbWVuc2lvbjsKKyAgfQorCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChjYXBzX3N0cnVjdHVyZSwgIndpZHRoIiwgJndpZHRoKSB8fCB3aWR0aCA8PSAwKSB7CisgICAgZ290byBpbnZhbGlkX2RpbWVuc2lvbjsKKyAgfQorCisgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9mcmFjdGlvbiAoY2Fwc19zdHJ1Y3R1cmUsICJmcmFtZXJhdGUiLCAmbnVtLCAmZGVub20pICYmCisgICAgICAobnVtIDwgMCB8fCBkZW5vbSA8PSAwKSkgeworICAgIGdvdG8gaW52YWxpZF9mcmFtZXJhdGU7CisgIH0KKworICBpZiAoaGVpZ2h0ID4gMjA0MCB8fCB3aWR0aCA+IDIwNDApIHsKKyAgICBwYXktPmhlaWdodCA9IDA7CisgICAgcGF5LT53aWR0aCA9IDA7CisgIH0gZWxzZSB7CisgICAgcGF5LT5oZWlnaHQgPSBHU1RfUk9VTkRfVVBfOCAoaGVpZ2h0KSAvIDg7CisgICAgcGF5LT53aWR0aCA9IEdTVF9ST1VORF9VUF84ICh3aWR0aCkgLyA4OworICB9CisKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKGJhc2VwYXlsb2FkLCAidmlkZW8iLAorICAgICAgYmFzZXBheWxvYWQtPnB0ICE9IEdTVF9SVFBfUEFZTE9BRF9KUEVHLCAiSlBFRyIsIDkwMDAwKTsKKworICBpZiAobnVtID4gMCkgeworICAgIGdkb3VibGUgZnJhbWVyYXRlOworICAgIGdzdF91dGlsX2ZyYWN0aW9uX3RvX2RvdWJsZSAobnVtLCBkZW5vbSwgJmZyYW1lcmF0ZSk7CisgICAgcmF0ZSA9IGdfc3RyZHVwX3ByaW50ZiAoIiVmIiwgZnJhbWVyYXRlKTsKKyAgfQorCisgIGlmIChwYXktPndpZHRoID09IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwYXksCisgICAgICAgICJ3aWR0aCBvciBoZWlnaHQgYXJlIGdyZWF0ZXIgdGhhbiAyMDQwLCBhZGRpbmcgeC1kaW1lbnNpb25zIHRvIGNhcHMiKTsKKyAgICBkaW0gPSBnX3N0cmR1cF9wcmludGYgKCIlZCwlZCIsIHdpZHRoLCBoZWlnaHQpOworICB9CisKKyAgaWYgKHJhdGUgIT0gTlVMTCAmJiBkaW0gIT0gTlVMTCkgeworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChiYXNlcGF5bG9hZCwgImEtZnJhbWVyYXRlIiwKKyAgICAgICAgR19UWVBFX1NUUklORywgcmF0ZSwgIngtZGltZW5zaW9ucyIsIEdfVFlQRV9TVFJJTkcsIGRpbSwgTlVMTCk7CisgIH0gZWxzZSBpZiAocmF0ZSAhPSBOVUxMICYmIGRpbSA9PSBOVUxMKSB7CisgICAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLCAiYS1mcmFtZXJhdGUiLAorICAgICAgICBHX1RZUEVfU1RSSU5HLCByYXRlLCBOVUxMKTsKKyAgfSBlbHNlIGlmIChyYXRlID09IE5VTEwgJiYgZGltICE9IE5VTEwpIHsKKyAgICByZXMgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAoYmFzZXBheWxvYWQsICJ4LWRpbWVuc2lvbnMiLAorICAgICAgICBHX1RZUEVfU1RSSU5HLCBkaW0sIE5VTEwpOworICB9IGVsc2UgeworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChiYXNlcGF5bG9hZCwgTlVMTCk7CisgIH0KKworICBnX2ZyZWUgKGRpbSk7CisgIGdfZnJlZSAocmF0ZSk7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfZGltZW5zaW9uOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocGF5LCAiSW52YWxpZCB3aWR0aC9oZWlnaHQgZnJvbSBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbnZhbGlkX2ZyYW1lcmF0ZToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBheSwgIkludmFsaWQgZnJhbWVyYXRlIGZyb20gY2FwcyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ3VpbnQKK2dzdF9ydHBfanBlZ19wYXlfaGVhZGVyX3NpemUgKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IG9mZnNldCkKK3sKKyAgcmV0dXJuIGRhdGFbb2Zmc2V0XSA8PCA4IHwgZGF0YVtvZmZzZXQgKyAxXTsKK30KKworc3RhdGljIGd1aW50Citnc3RfcnRwX2pwZWdfcGF5X3JlYWRfcXVhbnRfdGFibGUgKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsCisgICAgZ3VpbnQgb2Zmc2V0LCBSdHBRdWFudFRhYmxlIHRhYmxlc1tdKQoreworICBndWludCBxdWFudF9zaXplLCB0YWJfc2l6ZTsKKyAgZ3VpbnQ4IHByZWM7CisgIGd1aW50OCBpZDsKKworICBpZiAob2Zmc2V0ICsgMiA+IHNpemUpCisgICAgZ290byB0b29fc21hbGw7CisKKyAgcXVhbnRfc2l6ZSA9IGdzdF9ydHBfanBlZ19wYXlfaGVhZGVyX3NpemUgKGRhdGEsIG9mZnNldCk7CisgIGlmIChxdWFudF9zaXplIDwgMikKKyAgICBnb3RvIHNtYWxsX3F1YW50X3NpemU7CisKKyAgLyogY2xhbXAgdG8gYXZhaWxhYmxlIGRhdGEgKi8KKyAgaWYgKG9mZnNldCArIHF1YW50X3NpemUgPiBzaXplKQorICAgIHF1YW50X3NpemUgPSBzaXplIC0gb2Zmc2V0OworCisgIG9mZnNldCArPSAyOworICBxdWFudF9zaXplIC09IDI7CisKKyAgd2hpbGUgKHF1YW50X3NpemUgPiAwKSB7CisgICAgLyogbm90IGVub3VnaCB0byByZWFkIHRoZSBpZCAqLworICAgIGlmIChvZmZzZXQgKyAxID4gc2l6ZSkKKyAgICAgIGJyZWFrOworCisgICAgaWQgPSBkYXRhW29mZnNldF0gJiAweDBmOworICAgIGlmIChpZCA9PSAxNSkKKyAgICAgIC8qIGludmFsaWQgaWQgcmVjZWl2ZWQgLSBjb3JydXB0IGRhdGEgKi8KKyAgICAgIGdvdG8gaW52YWxpZF9pZDsKKworICAgIHByZWMgPSAoZGF0YVtvZmZzZXRdICYgMHhmMCkgPj4gNDsKKyAgICBpZiAocHJlYykKKyAgICAgIHRhYl9zaXplID0gMTI4OworICAgIGVsc2UKKyAgICAgIHRhYl9zaXplID0gNjQ7CisKKyAgICAvKiB0aGVyZSBpcyBub3QgZW5vdWdoIGZvciB0aGUgdGFibGUgKi8KKyAgICBpZiAocXVhbnRfc2l6ZSA8IHRhYl9zaXplICsgMSkKKyAgICAgIGdvdG8gbm9fdGFibGU7CisKKyAgICBHU1RfTE9HICgicmVhZCBxdWFudCB0YWJsZSAlZCwgdGFiX3NpemUgJWQsIHByZWMgJTAyeCIsIGlkLCB0YWJfc2l6ZSwgcHJlYyk7CisKKyAgICB0YWJsZXNbaWRdLnNpemUgPSB0YWJfc2l6ZTsKKyAgICB0YWJsZXNbaWRdLmRhdGEgPSAmZGF0YVtvZmZzZXQgKyAxXTsKKworICAgIHRhYl9zaXplICs9IDE7CisgICAgcXVhbnRfc2l6ZSAtPSB0YWJfc2l6ZTsKKyAgICBvZmZzZXQgKz0gdGFiX3NpemU7CisgIH0KK2RvbmU6CisgIHJldHVybiBvZmZzZXQgKyBxdWFudF9zaXplOworCisgIC8qIEVSUk9SUyAqLwordG9vX3NtYWxsOgorICB7CisgICAgR1NUX1dBUk5JTkcgKCJub3QgZW5vdWdoIGRhdGEiKTsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorc21hbGxfcXVhbnRfc2l6ZToKKyAgeworICAgIEdTVF9XQVJOSU5HICgicXVhbnRfc2l6ZSB0b28gc21hbGwgKCV1IDwgMikiLCBxdWFudF9zaXplKTsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQoraW52YWxpZF9pZDoKKyAgeworICAgIEdTVF9XQVJOSU5HICgiaW52YWxpZCBpZCIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorbm9fdGFibGU6CisgIHsKKyAgICBHU1RfV0FSTklORyAoIm5vdCBlbm91Z2ggZGF0YSBmb3IgdGFibGUgKCV1IDwgJXUpIiwgcXVhbnRfc2l6ZSwKKyAgICAgICAgdGFiX3NpemUgKyAxKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2pwZWdfcGF5X3JlYWRfc29mIChHc3RSdHBKUEVHUGF5ICogcGF5LCBjb25zdCBndWludDggKiBkYXRhLAorICAgIGd1aW50IHNpemUsIGd1aW50ICogb2Zmc2V0LCBDb21wSW5mbyBpbmZvW10sIFJ0cFF1YW50VGFibGUgdGFibGVzW10sCisgICAgZ3Vsb25nIHRhYmxlc19lbGVtZW50cykKK3sKKyAgZ3VpbnQgc29mX3NpemUsIG9mZjsKKyAgZ3VpbnQgd2lkdGgsIGhlaWdodCwgaW5mb2xlbjsKKyAgQ29tcEluZm8gZWxlbTsKKyAgZ2ludCBpLCBqOworCisgIG9mZiA9ICpvZmZzZXQ7CisKKyAgLyogd2UgbmVlZCBhdCBsZWFzdCAxNyBieXRlcyBmb3IgdGhlIFNPRiAqLworICBpZiAob2ZmICsgMTcgPiBzaXplKQorICAgIGdvdG8gd3Jvbmdfc2l6ZTsKKworICBzb2Zfc2l6ZSA9IGdzdF9ydHBfanBlZ19wYXlfaGVhZGVyX3NpemUgKGRhdGEsIG9mZik7CisgIGlmIChzb2Zfc2l6ZSA8IDE3KQorICAgIGdvdG8gd3JvbmdfbGVuZ3RoOworCisgICpvZmZzZXQgKz0gc29mX3NpemU7CisKKyAgLyogc2tpcCBzaXplICovCisgIG9mZiArPSAyOworCisgIC8qIHByZWNpc2lvbiBzaG91bGQgYmUgOCAqLworICBpZiAoZGF0YVtvZmYrK10gIT0gOCkKKyAgICBnb3RvIGJhZF9wcmVjaXNpb247CisKKyAgLyogcmVhZCBkaW1lbnNpb25zICovCisgIGhlaWdodCA9IGRhdGFbb2ZmXSA8PCA4IHwgZGF0YVtvZmYgKyAxXTsKKyAgd2lkdGggPSBkYXRhW29mZiArIDJdIDw8IDggfCBkYXRhW29mZiArIDNdOworICBvZmYgKz0gNDsKKworICBHU1RfTE9HX09CSkVDVCAocGF5LCAiZ290IGRpbWVuc2lvbnMgJXV4JXUiLCBoZWlnaHQsIHdpZHRoKTsKKworICBpZiAoaGVpZ2h0ID09IDApIHsKKyAgICBnb3RvIGludmFsaWRfZGltZW5zaW9uOworICB9CisgIGlmIChoZWlnaHQgPiAyMDQwKSB7CisgICAgaGVpZ2h0ID0gMDsKKyAgfQorICBpZiAod2lkdGggPT0gMCkgeworICAgIGdvdG8gaW52YWxpZF9kaW1lbnNpb247CisgIH0KKyAgaWYgKHdpZHRoID4gMjA0MCkgeworICAgIHdpZHRoID0gMDsKKyAgfQorCisgIGlmIChoZWlnaHQgPT0gMCB8fCB3aWR0aCA9PSAwKSB7CisgICAgcGF5LT5oZWlnaHQgPSAwOworICAgIHBheS0+d2lkdGggPSAwOworICB9IGVsc2UgeworICAgIHBheS0+aGVpZ2h0ID0gR1NUX1JPVU5EX1VQXzggKGhlaWdodCkgLyA4OworICAgIHBheS0+d2lkdGggPSBHU1RfUk9VTkRfVVBfOCAod2lkdGgpIC8gODsKKyAgfQorCisgIC8qIHdlIG9ubHkgc3VwcG9ydCAzIGNvbXBvbmVudHMgKi8KKyAgaWYgKGRhdGFbb2ZmKytdICE9IDMpCisgICAgZ290byBiYWRfY29tcG9uZW50czsKKworICBpbmZvbGVuID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgIGVsZW0uaWQgPSBkYXRhW29mZisrXTsKKyAgICBlbGVtLnNhbXAgPSBkYXRhW29mZisrXTsKKyAgICBlbGVtLnF0ID0gZGF0YVtvZmYrK107CisgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgImdvdCBjb21wICVkLCBzYW1wICUwMngsIHF0ICVkIiwgZWxlbS5pZCwgZWxlbS5zYW1wLAorICAgICAgICBlbGVtLnF0KTsKKyAgICAvKiBpbnNlcnRpb24gc29ydCBmcm9tIHRoZSBsYXN0IGVsZW1lbnQgdG8gdGhlIGZpcnN0ICovCisgICAgZm9yIChqID0gaW5mb2xlbjsgaiA+IDE7IGotLSkgeworICAgICAgaWYgKEdfTElLRUxZIChpbmZvW2ogLSAxXS5pZCA8IGVsZW0uaWQpKQorICAgICAgICBicmVhazsKKyAgICAgIGluZm9bal0gPSBpbmZvW2ogLSAxXTsKKyAgICB9CisgICAgaW5mb1tqXSA9IGVsZW07CisgICAgaW5mb2xlbisrOworICB9CisKKyAgLyogc2VlIHRoYXQgdGhlIGNvbXBvbmVudHMgYXJlIHN1cHBvcnRlZCAqLworICBpZiAoaW5mb1swXS5zYW1wID09IDB4MjEpCisgICAgcGF5LT50eXBlID0gMDsKKyAgZWxzZSBpZiAoaW5mb1swXS5zYW1wID09IDB4MjIpCisgICAgcGF5LT50eXBlID0gMTsKKyAgZWxzZQorICAgIGdvdG8gaW52YWxpZF9jb21wOworCisgIGlmICghKGluZm9bMV0uc2FtcCA9PSAweDExKSkKKyAgICBnb3RvIGludmFsaWRfY29tcDsKKworICBpZiAoIShpbmZvWzJdLnNhbXAgPT0gMHgxMSkpCisgICAgZ290byBpbnZhbGlkX2NvbXA7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCit3cm9uZ19zaXplOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocGF5LCBTVFJFQU0sIEZPUk1BVCwKKyAgICAgICAgKCJXcm9uZyBzaXplICV1IChuZWVkZWQgJXUpLiIsIHNpemUsIG9mZiArIDE3KSwgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3dyb25nX2xlbmd0aDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHBheSwgU1RSRUFNLCBGT1JNQVQsCisgICAgICAgICgiV3JvbmcgU09GIGxlbmd0aCAldS4iLCBzb2Zfc2l6ZSksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitiYWRfcHJlY2lzaW9uOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocGF5LCBTVFJFQU0sIEZPUk1BVCwKKyAgICAgICAgKCJXcm9uZyBwcmVjaXNpb24sIGV4cGVjdGluZyA4LiIpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQoraW52YWxpZF9kaW1lbnNpb246CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChwYXksIFNUUkVBTSwgRk9STUFULAorICAgICAgICAoIldyb25nIGRpbWVuc2lvbiwgc2l6ZSAldXgldSIsIHdpZHRoLCBoZWlnaHQpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorYmFkX2NvbXBvbmVudHM6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChwYXksIFNUUkVBTSwgRk9STUFULAorICAgICAgICAoIldyb25nIG51bWJlciBvZiBjb21wb25lbnRzIiksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbnZhbGlkX2NvbXA6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChwYXksIFNUUkVBTSwgRk9STUFULCAoIkludmFsaWQgY29tcG9uZW50IiksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9qcGVnX3BheV9yZWFkX2RyaSAoR3N0UnRwSlBFR1BheSAqIHBheSwgY29uc3QgZ3VpbnQ4ICogZGF0YSwKKyAgICBndWludCBzaXplLCBndWludCAqIG9mZnNldCwgUnRwUmVzdGFydE1hcmtlckhlYWRlciAqIGRyaSkKK3sKKyAgZ3VpbnQgZHJpX3NpemUsIG9mZjsKKworICBvZmYgPSAqb2Zmc2V0OworCisgIC8qIHdlIG5lZWQgYXQgbGVhc3QgNCBieXRlcyBmb3IgdGhlIERSSSAqLworICBpZiAob2ZmICsgNCA+IHNpemUpCisgICAgZ290byB3cm9uZ19zaXplOworCisgIGRyaV9zaXplID0gZ3N0X3J0cF9qcGVnX3BheV9oZWFkZXJfc2l6ZSAoZGF0YSwgb2ZmKTsKKyAgaWYgKGRyaV9zaXplIDwgNCkKKyAgICBnb3RvIHdyb25nX2xlbmd0aDsKKworICAqb2Zmc2V0ICs9IGRyaV9zaXplOworICBvZmYgKz0gMjsKKworICBkcmktPnJlc3RhcnRfaW50ZXJ2YWwgPSBnX2h0b25zICgoZGF0YVtvZmZdIDw8IDgpIHwgKGRhdGFbb2ZmICsgMV0pKTsKKyAgZHJpLT5yZXN0YXJ0X2NvdW50ID0gZ19odG9ucyAoMHhGRkZGKTsKKworICByZXR1cm4gZHJpLT5yZXN0YXJ0X2ludGVydmFsID4gMDsKKword3Jvbmdfc2l6ZToKKyAgeworICAgIEdTVF9XQVJOSU5HICgibm90IGVub3VnaCBkYXRhIGZvciBEUkkiKTsKKyAgICAqb2Zmc2V0ID0gc2l6ZTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3dyb25nX2xlbmd0aDoKKyAgeworICAgIEdTVF9XQVJOSU5HICgiRFJJIHNpemUgdG9vIHNtYWxsICgldSkiLCBkcmlfc2l6ZSk7CisgICAgKm9mZnNldCArPSBkcmlfc2l6ZTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIFJ0cEpwZWdNYXJrZXIKK2dzdF9ydHBfanBlZ19wYXlfc2Nhbl9tYXJrZXIgKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIGd1aW50ICogb2Zmc2V0KQoreworICB3aGlsZSAoKGRhdGFbKCpvZmZzZXQpKytdICE9IEpQRUdfTUFSS0VSKSAmJiAoKCpvZmZzZXQpIDwgc2l6ZSkpOworCisgIGlmIChHX1VOTElLRUxZICgoKm9mZnNldCkgPj0gc2l6ZSkpIHsKKyAgICBHU1RfTE9HICgiZm91bmQgRU9JIG1hcmtlciIpOworICAgIHJldHVybiBKUEVHX01BUktFUl9FT0k7CisgIH0gZWxzZSB7CisgICAgZ3VpbnQ4IG1hcmtlcjsKKworICAgIG1hcmtlciA9IGRhdGFbKm9mZnNldF07CisgICAgR1NUX0xPRyAoImZvdW5kIDB4JTAyeCBtYXJrZXIgYXQgb2Zmc2V0ICV1IiwgbWFya2VyLCAqb2Zmc2V0KTsKKyAgICAoKm9mZnNldCkrKzsKKyAgICByZXR1cm4gbWFya2VyOworICB9Cit9CisKKyNkZWZpbmUgUlRQX0hFQURFUl9MRU4gMTIKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfanBlZ19wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJ0cEpQRUdQYXkgKnBheTsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgUnRwSnBlZ0hlYWRlciBqcGVnX2hlYWRlcjsKKyAgUnRwUXVhbnRIZWFkZXIgcXVhbnRfaGVhZGVyOworICBSdHBSZXN0YXJ0TWFya2VySGVhZGVyIHJlc3RhcnRfbWFya2VyX2hlYWRlcjsKKyAgUnRwUXVhbnRUYWJsZSB0YWJsZXNbMTVdID0geyB7MCwgTlVMTH0sIH07CisgIENvbXBJbmZvIGluZm9bM10gPSB7IHswLH0sIH07CisgIGd1aW50IHF1YW50X2RhdGFfc2l6ZTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgc2l6ZTsKKyAgZ3VpbnQgbXR1LCBtYXhfcGF5bG9hZF9zaXplOworICBndWludCBieXRlc19sZWZ0OworICBndWludCBqcGVnX2hlYWRlcl9zaXplID0gMDsKKyAgZ3VpbnQgb2Zmc2V0OworICBnYm9vbGVhbiBmcmFtZV9kb25lOworICBnYm9vbGVhbiBzb3NfZm91bmQsIHNvZl9mb3VuZCwgZHF0X2ZvdW5kLCBkcmlfZm91bmQ7CisgIGdpbnQgaTsKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdCA9IE5VTEw7CisgIGdib29sZWFuIGRpc2NvbnQ7CisKKyAgcGF5ID0gR1NUX1JUUF9KUEVHX1BBWSAoYmFzZXBheWxvYWQpOworICBtdHUgPSBHU1RfUlRQX0JBU0VfUEFZTE9BRF9NVFUgKHBheSk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBzaXplID0gbWFwLnNpemU7CisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICBvZmZzZXQgPSAwOworICBkaXNjb250ID0gR1NUX0JVRkZFUl9JU19ESVNDT05UIChidWZmZXIpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYXksICJnb3QgYnVmZmVyIHNpemUgJSIgR19HU0laRV9GT1JNQVQKKyAgICAgICIgLCB0aW1lc3RhbXAgJSIgR1NUX1RJTUVfRk9STUFULCBzaXplLCBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICAvKiBwYXJzZSB0aGUganBlZyBoZWFkZXIgZm9yICdzdGFydCBvZiBzY2FuJyBhbmQgcmVhZCBxdWFudCB0YWJsZXMgaWYgbmVlZGVkICovCisgIHNvc19mb3VuZCA9IEZBTFNFOworICBkcXRfZm91bmQgPSBGQUxTRTsKKyAgc29mX2ZvdW5kID0gRkFMU0U7CisgIGRyaV9mb3VuZCA9IEZBTFNFOworCisgIHdoaWxlICghc29zX2ZvdW5kICYmIChvZmZzZXQgPCBzaXplKSkgeworICAgIGdpbnQgbWFya2VyOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgImNoZWNraW5nIGZyb20gb2Zmc2V0ICV1Iiwgb2Zmc2V0KTsKKyAgICBzd2l0Y2ggKChtYXJrZXIgPSBnc3RfcnRwX2pwZWdfcGF5X3NjYW5fbWFya2VyIChkYXRhLCBzaXplLCAmb2Zmc2V0KSkpIHsKKyAgICAgIGNhc2UgSlBFR19NQVJLRVJfSkZJRjoKKyAgICAgIGNhc2UgSlBFR19NQVJLRVJfQ01UOgorICAgICAgY2FzZSBKUEVHX01BUktFUl9ESFQ6CisgICAgICBjYXNlIEpQRUdfTUFSS0VSX0gyNjQ6CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXksICJza2lwcGluZyBtYXJrZXIiKTsKKyAgICAgICAgb2Zmc2V0ICs9IGdzdF9ydHBfanBlZ19wYXlfaGVhZGVyX3NpemUgKGRhdGEsIG9mZnNldCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKUEVHX01BUktFUl9TT0Y6CisgICAgICAgIGlmICghZ3N0X3J0cF9qcGVnX3BheV9yZWFkX3NvZiAocGF5LCBkYXRhLCBzaXplLCAmb2Zmc2V0LCBpbmZvLCB0YWJsZXMsCisgICAgICAgICAgICAgICAgR19OX0VMRU1FTlRTICh0YWJsZXMpKSkKKyAgICAgICAgICBnb3RvIGludmFsaWRfZm9ybWF0OworICAgICAgICBzb2ZfZm91bmQgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSlBFR19NQVJLRVJfRFFUOgorICAgICAgICBHU1RfTE9HICgiRFFUIGZvdW5kIik7CisgICAgICAgIG9mZnNldCA9IGdzdF9ydHBfanBlZ19wYXlfcmVhZF9xdWFudF90YWJsZSAoZGF0YSwgc2l6ZSwgb2Zmc2V0LCB0YWJsZXMpOworICAgICAgICBkcXRfZm91bmQgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSlBFR19NQVJLRVJfU09TOgorICAgICAgICBzb3NfZm91bmQgPSBUUlVFOworICAgICAgICBHU1RfTE9HX09CSkVDVCAocGF5LCAiU09TIGZvdW5kIik7CisgICAgICAgIGpwZWdfaGVhZGVyX3NpemUgPSBvZmZzZXQgKyBnc3RfcnRwX2pwZWdfcGF5X2hlYWRlcl9zaXplIChkYXRhLCBvZmZzZXQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSlBFR19NQVJLRVJfRU9JOgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBheSwgIkVPSSByZWFjaGVkIGJlZm9yZSBTT1MhIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKUEVHX01BUktFUl9TT0k6CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXksICJTT0kgZm91bmQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEpQRUdfTUFSS0VSX0RSSToKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgIkRSSSBmb3VuZCIpOworICAgICAgICBpZiAoZ3N0X3J0cF9qcGVnX3BheV9yZWFkX2RyaSAocGF5LCBkYXRhLCBzaXplLCAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICZyZXN0YXJ0X21hcmtlcl9oZWFkZXIpKQorICAgICAgICAgIGRyaV9mb3VuZCA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKG1hcmtlciA9PSBKUEVHX01BUktFUl9KUEcgfHwKKyAgICAgICAgICAgIChtYXJrZXIgPj0gSlBFR19NQVJLRVJfSlBHMCAmJiBtYXJrZXIgPD0gSlBFR19NQVJLRVJfSlBHMTMpIHx8CisgICAgICAgICAgICAobWFya2VyID49IEpQRUdfTUFSS0VSX0FQUDAgJiYgbWFya2VyIDw9IEpQRUdfTUFSS0VSX0FQUDE1KSkgeworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXksICJza2lwcGluZyBtYXJrZXIiKTsKKyAgICAgICAgICBvZmZzZXQgKz0gZ3N0X3J0cF9qcGVnX3BheV9oZWFkZXJfc2l6ZSAoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfRklYTUVfT0JKRUNUIChwYXksICJ1bmhhbmRsZWQgbWFya2VyIDB4JTAyeCIsIG1hcmtlcik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmICghZHF0X2ZvdW5kIHx8ICFzb2ZfZm91bmQpCisgICAgZ290byB1bnN1cHBvcnRlZF9qcGVnOworCisgIC8qIGJ5IG5vdyB3ZSBzaG91bGQgZWl0aGVyIGhhdmUgbmVnb3RpYXRlZCB0aGUgd2lkdGgvaGVpZ2h0IG9yIHRoZSBTT0YgaGVhZGVyCisgICAqIHNob3VsZCBoYXZlIGZpbGxlZCB1cyBpbiAqLworICBpZiAocGF5LT53aWR0aCA8IDAgfHwgcGF5LT5oZWlnaHQgPCAwKSB7CisgICAgZ290byBub19kaW1lbnNpb247CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocGF5LCAiaGVhZGVyIHNpemUgJXUiLCBqcGVnX2hlYWRlcl9zaXplKTsKKworICBzaXplIC09IGpwZWdfaGVhZGVyX3NpemU7CisgIGRhdGEgKz0ganBlZ19oZWFkZXJfc2l6ZTsKKyAgb2Zmc2V0ID0gMDsKKworICBpZiAoZHJpX2ZvdW5kKQorICAgIHBheS0+dHlwZSArPSA2NDsKKworICAvKiBwcmVwYXJlIHN0dWZmIGZvciB0aGUganBlZyBoZWFkZXIgKi8KKyAganBlZ19oZWFkZXIudHlwZV9zcGVjID0gMDsKKyAganBlZ19oZWFkZXIudHlwZSA9IHBheS0+dHlwZTsKKyAganBlZ19oZWFkZXIucSA9IHBheS0+cXVhbnQ7CisgIGpwZWdfaGVhZGVyLndpZHRoID0gcGF5LT53aWR0aDsKKyAganBlZ19oZWFkZXIuaGVpZ2h0ID0gcGF5LT5oZWlnaHQ7CisKKyAgLyogY29sbGVjdCB0aGUgcXVhbnQgaGVhZGVycyBzaXplcyAqLworICBxdWFudF9oZWFkZXIubWJ6ID0gMDsKKyAgcXVhbnRfaGVhZGVyLnByZWNpc2lvbiA9IDA7CisgIHF1YW50X2hlYWRlci5sZW5ndGggPSAwOworICBxdWFudF9kYXRhX3NpemUgPSAwOworCisgIGlmIChwYXktPnF1YW50ID4gMTI3KSB7CisgICAgLyogZm9yIHRoZSBZIGFuZCBVIGNvbXBvbmVudCwgbG9vayB1cCB0aGUgcXVhbnQgdGFibGUgYW5kIGl0cyBzaXplLiBxdWFudAorICAgICAqIHRhYmxlcyBmb3IgVSBhbmQgViBzaG91bGQgYmUgdGhlIHNhbWUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICBndWludCBxc2l6ZTsKKyAgICAgIGd1aW50IHF0OworCisgICAgICBxdCA9IGluZm9baV0ucXQ7CisgICAgICBpZiAocXQgPj0gR19OX0VMRU1FTlRTICh0YWJsZXMpKQorICAgICAgICBnb3RvIGludmFsaWRfcXVhbnQ7CisKKyAgICAgIHFzaXplID0gdGFibGVzW3F0XS5zaXplOworICAgICAgaWYgKHFzaXplID09IDApCisgICAgICAgIGdvdG8gaW52YWxpZF9xdWFudDsKKworICAgICAgcXVhbnRfaGVhZGVyLnByZWNpc2lvbiB8PSAocXNpemUgPT0gNjQgPyAwIDogKDEgPDwgaSkpOworICAgICAgcXVhbnRfZGF0YV9zaXplICs9IHFzaXplOworICAgIH0KKyAgICBxdWFudF9oZWFkZXIubGVuZ3RoID0gZ19odG9ucyAocXVhbnRfZGF0YV9zaXplKTsKKyAgICBxdWFudF9kYXRhX3NpemUgKz0gc2l6ZW9mIChxdWFudF9oZWFkZXIpOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBheSwgInF1YW50X2RhdGEgc2l6ZSAldSIsIHF1YW50X2RhdGFfc2l6ZSk7CisKKyAgYnl0ZXNfbGVmdCA9IHNpemVvZiAoanBlZ19oZWFkZXIpICsgcXVhbnRfZGF0YV9zaXplICsgc2l6ZTsKKworICBpZiAoZHJpX2ZvdW5kKQorICAgIGJ5dGVzX2xlZnQgKz0gc2l6ZW9mIChyZXN0YXJ0X21hcmtlcl9oZWFkZXIpOworCisgIG1heF9wYXlsb2FkX3NpemUgPSBtdHUgLSAoUlRQX0hFQURFUl9MRU4gKyBzaXplb2YgKGpwZWdfaGVhZGVyKSk7CisgIGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3X3NpemVkICgoYnl0ZXNfbGVmdCAvIG1heF9wYXlsb2FkX3NpemUpICsgMSk7CisKKyAgZnJhbWVfZG9uZSA9IEZBTFNFOworICBkbyB7CisgICAgR3N0QnVmZmVyICpvdXRidWY7CisgICAgZ3VpbnQ4ICpwYXlsb2FkOworICAgIGd1aW50IHBheWxvYWRfc2l6ZTsKKyAgICBndWludCBoZWFkZXJfc2l6ZTsKKyAgICBHc3RCdWZmZXIgKnBheWJ1ZjsKKyAgICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisgICAgZ3VpbnQgcnRwX2hlYWRlcl9zaXplID0gZ3N0X3J0cF9idWZmZXJfY2FsY19oZWFkZXJfbGVuICgwKTsKKworICAgIC8qIFRoZSBhdmFpbGFibGUgcm9vbSBpcyB0aGUgcGFja2V0IE1UVSwgbWludXMgdGhlIFJUUCBoZWFkZXIgbGVuZ3RoLiAqLworICAgIHBheWxvYWRfc2l6ZSA9CisgICAgICAgIChieXRlc19sZWZ0IDwgKG10dSAtIHJ0cF9oZWFkZXJfc2l6ZSkgPyBieXRlc19sZWZ0IDoKKyAgICAgICAgKG10dSAtIHJ0cF9oZWFkZXJfc2l6ZSkpOworCisgICAgaGVhZGVyX3NpemUgPSBzaXplb2YgKGpwZWdfaGVhZGVyKSArIHF1YW50X2RhdGFfc2l6ZTsKKyAgICBpZiAoZHJpX2ZvdW5kKQorICAgICAgaGVhZGVyX3NpemUgKz0gc2l6ZW9mIChyZXN0YXJ0X21hcmtlcl9oZWFkZXIpOworCisgICAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChoZWFkZXJfc2l6ZSwgMCwgMCk7CisKKyAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKG91dGJ1ZiwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisKKyAgICBpZiAocGF5bG9hZF9zaXplID09IGJ5dGVzX2xlZnQpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChwYXksICJsYXN0IHBhY2tldCBvZiBmcmFtZSIpOworICAgICAgZnJhbWVfZG9uZSA9IFRSVUU7CisgICAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCAxKTsKKyAgICB9CisKKyAgICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApOworCisgICAgLyogdXBkYXRlIG9mZnNldCAqLworI2lmIChHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOKQorICAgIGpwZWdfaGVhZGVyLm9mZnNldCA9ICgob2Zmc2V0ICYgMHgwMDAwRkYpIDw8IDE2KSB8CisgICAgICAgICgob2Zmc2V0ICYgMHhGRjAwMDApID4+IDE2KSB8IChvZmZzZXQgJiAweDAwRkYwMCk7CisjZWxzZQorICAgIGpwZWdfaGVhZGVyLm9mZnNldCA9IG9mZnNldDsKKyNlbmRpZgorICAgIG1lbWNweSAocGF5bG9hZCwgJmpwZWdfaGVhZGVyLCBzaXplb2YgKGpwZWdfaGVhZGVyKSk7CisgICAgcGF5bG9hZCArPSBzaXplb2YgKGpwZWdfaGVhZGVyKTsKKyAgICBwYXlsb2FkX3NpemUgLT0gc2l6ZW9mIChqcGVnX2hlYWRlcik7CisKKyAgICBpZiAoZHJpX2ZvdW5kKSB7CisgICAgICBtZW1jcHkgKHBheWxvYWQsICZyZXN0YXJ0X21hcmtlcl9oZWFkZXIsIHNpemVvZiAocmVzdGFydF9tYXJrZXJfaGVhZGVyKSk7CisgICAgICBwYXlsb2FkICs9IHNpemVvZiAocmVzdGFydF9tYXJrZXJfaGVhZGVyKTsKKyAgICAgIHBheWxvYWRfc2l6ZSAtPSBzaXplb2YgKHJlc3RhcnRfbWFya2VyX2hlYWRlcik7CisgICAgfQorCisgICAgLyogb25seSBzZW5kIHF1YW50IHRhYmxlIHdpdGggZmlyc3QgcGFja2V0ICovCisgICAgaWYgKEdfVU5MSUtFTFkgKHF1YW50X2RhdGFfc2l6ZSA+IDApKSB7CisgICAgICBtZW1jcHkgKHBheWxvYWQsICZxdWFudF9oZWFkZXIsIHNpemVvZiAocXVhbnRfaGVhZGVyKSk7CisgICAgICBwYXlsb2FkICs9IHNpemVvZiAocXVhbnRfaGVhZGVyKTsKKworICAgICAgLyogY29weSB0aGUgcXVhbnQgdGFibGVzIGZvciBsdW1hIGFuZCBjaHJvbWluYW5jZSAqLworICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBndWludCBxc2l6ZTsKKyAgICAgICAgZ3VpbnQgcXQ7CisKKyAgICAgICAgcXQgPSBpbmZvW2ldLnF0OworICAgICAgICBxc2l6ZSA9IHRhYmxlc1txdF0uc2l6ZTsKKyAgICAgICAgbWVtY3B5IChwYXlsb2FkLCB0YWJsZXNbcXRdLmRhdGEsIHFzaXplKTsKKworICAgICAgICBHU1RfTE9HX09CSkVDVCAocGF5LCAiY29tcG9uZW50ICVkIHVzaW5nIHF1YW50ICVkLCBzaXplICVkIiwgaSwgcXQsCisgICAgICAgICAgICBxc2l6ZSk7CisKKyAgICAgICAgcGF5bG9hZCArPSBxc2l6ZTsKKyAgICAgIH0KKyAgICAgIHBheWxvYWRfc2l6ZSAtPSBxdWFudF9kYXRhX3NpemU7CisgICAgICBieXRlc19sZWZ0IC09IHF1YW50X2RhdGFfc2l6ZTsKKyAgICAgIHF1YW50X2RhdGFfc2l6ZSA9IDA7CisgICAgfQorICAgIEdTVF9MT0dfT0JKRUNUIChwYXksICJzZW5kaW5nIHBheWxvYWQgc2l6ZSAlZCIsIHBheWxvYWRfc2l6ZSk7CisgICAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgICAgLyogY3JlYXRlIGEgbmV3IGJ1ZiB0byBob2xkIHRoZSBwYXlsb2FkICovCisgICAgcGF5YnVmID0gZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAoYnVmZmVyLCBHU1RfQlVGRkVSX0NPUFlfQUxMLAorICAgICAgICBqcGVnX2hlYWRlcl9zaXplICsgb2Zmc2V0LCBwYXlsb2FkX3NpemUpOworCisgICAgLyogam9pbiBtZW1vcnkgcGFydHMgKi8KKyAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocGF5LCBvdXRidWYsIHBheWJ1Zik7CisgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKG91dGJ1ZiwgcGF5YnVmKTsKKworICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gdGltZXN0YW1wOworCisgICAgaWYgKGRpc2NvbnQpIHsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgICAgLyogT25seSB0aGUgZmlyc3Qgb3V0cHV0dGVkIGJ1ZmZlciBoYXMgdGhlIERJU0NPTlQgZmxhZyAqLworICAgICAgZGlzY29udCA9IEZBTFNFOworICAgIH0KKworICAgIC8qIGFuZCBhZGQgdG8gbGlzdCAqLworICAgIGdzdF9idWZmZXJfbGlzdF9pbnNlcnQgKGxpc3QsIC0xLCBvdXRidWYpOworCisgICAgYnl0ZXNfbGVmdCAtPSBwYXlsb2FkX3NpemU7CisgICAgb2Zmc2V0ICs9IHBheWxvYWRfc2l6ZTsKKyAgICBkYXRhICs9IHBheWxvYWRfc2l6ZTsKKyAgfQorICB3aGlsZSAoIWZyYW1lX2RvbmUpOworCisgIC8qIHB1c2ggdGhlIHdob2xlIGJ1ZmZlciBsaXN0IGF0IG9uY2UgKi8KKyAgcmV0ID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfcHVzaF9saXN0IChiYXNlcGF5bG9hZCwgbGlzdCk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLwordW5zdXBwb3J0ZWRfanBlZzoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHBheSwgU1RSRUFNLCBGT1JNQVQsICgiVW5zdXBwb3J0ZWQgSlBFRyIpLCAoTlVMTCkpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK25vX2RpbWVuc2lvbjoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHBheSwgU1RSRUFNLCBGT1JNQVQsICgiTm8gc2l6ZSBnaXZlbiIpLCAoTlVMTCkpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK2ludmFsaWRfZm9ybWF0OgorICB7CisgICAgLyogZXJyb3Igd2FzIHBvc3RlZCAqLworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK2ludmFsaWRfcXVhbnQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChwYXksIFNUUkVBTSwgRk9STUFULCAoIkludmFsaWQgcXVhbnQgdGFibGVzIiksIChOVUxMKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qcGVnX3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwSlBFR1BheSAqcnRwanBlZ3BheTsKKworICBydHBqcGVncGF5ID0gR1NUX1JUUF9KUEVHX1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfSlBFR19RVUFMSVRZOgorICAgICAgcnRwanBlZ3BheS0+cXVhbGl0eSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqZWN0LCAicXVhbGl0eSA9ICVkIiwgcnRwanBlZ3BheS0+cXVhbGl0eSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSlBFR19UWVBFOgorICAgICAgcnRwanBlZ3BheS0+dHlwZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqZWN0LCAidHlwZSA9ICVkIiwgcnRwanBlZ3BheS0+dHlwZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2pwZWdfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBKUEVHUGF5ICpydHBqcGVncGF5OworCisgIHJ0cGpwZWdwYXkgPSBHU1RfUlRQX0pQRUdfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9KUEVHX1FVQUxJVFk6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBydHBqcGVncGF5LT5xdWFsaXR5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9KUEVHX1RZUEU6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBydHBqcGVncGF5LT50eXBlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfanBlZ19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBqcGVncGF5IiwgR1NUX1JBTktfU0VDT05EQVJZLAorICAgICAgR1NUX1RZUEVfUlRQX0pQRUdfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwanBlZ3BheS5oIGIvZ3N0L3J0cC9nc3RydHBqcGVncGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2NWVhNwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwanBlZ3BheS5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA4IEF4aXMgQ29tbXVuaWNhdGlvbnMgPGRldi1nc3RyZWFtZXJAYXhpcy5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfSlBFR19QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9KUEVHX1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX0pQRUdfUEFZIFwKKyAgKGdzdF9ydHBfanBlZ19wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9KUEVHX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9KUEVHX1BBWSxHc3RSdHBKUEVHUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9KUEVHX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfSlBFR19QQVksR3N0UnRwSlBFR1BheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9KUEVHX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9KUEVHX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfSlBFR19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0pQRUdfUEFZKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBKUEVHUGF5IEdzdFJ0cEpQRUdQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSlBFR1BheUNsYXNzIEdzdFJ0cEpQRUdQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBKUEVHUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisKKyAgZ3VpbnQ4IHF1YWxpdHk7CisgIGd1aW50OCB0eXBlOworCisgIGdpbnQgaGVpZ2h0OworICBnaW50IHdpZHRoOworCisgIGd1aW50OCBxdWFudDsKK307CisKK3N0cnVjdCBfR3N0UnRwSlBFR1BheUNsYXNzCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9qcGVnX3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfanBlZ19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19HU1RfUlRQX0pQRUdfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBrbHZkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBrbHZkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNGY2YWEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGtsdmRlcGF5LmMKQEAgLTAsMCArMSwzOTcgQEAKKy8qIEdTdHJlYW1lciBSVFAgS0xWIERlcGF5bG9hZGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPj4KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IENlbnRyaWN1bGFyIEx0ZAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cGtsdmRlcGF5CisgKiBAc2VlX2Fsc286IHJ0cGtsdnBheQorICoKKyAqIEV4dHJhY3QgS0xWIG1ldGFkYXRhIGZyb20gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyA2NTk3LgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjU5NworICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB1ZHBzcmMgY2Fwcz0nYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPShzdHJpbmcpYXBwbGljYXRpb24sIGNsb2NrLXJhdGU9KGludCk5MDAwMCwgZW5jb2RpbmctbmFtZT0oc3RyaW5nKVNNUFRFMzM2TScgISBydHBrbHZkZXBheSAhIGZha2VzaW5rIGR1bXA9dHJ1ZQorICogXXwgVGhpcyBleGFtcGxlIHBpcGVsaW5lIHdpbGwgZGVwYXlsb2FkIGFuIFJUUCBLTFYgc3RyZWFtIGFuZCBkaXNwbGF5CisgKiBhIGhleGR1bXAgb2YgdGhlIEtMViBkYXRhIG9uIHN0ZG91dC4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdHJ0cGtsdmRlcGF5LmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoa2x2ZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKGtsdmRlcGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoIm1ldGEveC1rbHYsIHBhcnNlZCA9IChib29sKSB0cnVlIikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIGFwcGxpY2F0aW9uLCBjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWF0sICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBTTVBURTMzNk0iKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF9rbHZfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwS2x2RGVwYXksIGdzdF9ydHBfa2x2X2RlcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2tsdl9kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX2tsdl9kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKgorICAgIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfa2x2X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9rbHZfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfa2x2X2RlcGF5X2hhbmRsZV9ldmVudCAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5LAorICAgIEdzdEV2ZW50ICogZXYpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2tsdl9kZXBheV9yZXNldCAoR3N0UnRwS2x2RGVwYXkgKiBrbHZkZXBheSk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2tsdl9kZXBheV9jbGFzc19pbml0IChHc3RSdHBLbHZEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqcnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoa2x2ZGVwYXlfZGVidWcsICJrbHZkZXBheSIsIDAsCisgICAgICAiUlRQIEtMViBEZXBheWxvYWRlciIpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9rbHZfZGVwYXlfZmluYWxpemU7CisKKyAgZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF9rbHZfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBLTFYgRGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIEtMViAoU01QVEUgU1QgMzM2KSBtZXRhZGF0YSBmcm9tIFJUUCBwYWNrZXRzIiwKKyAgICAgICJUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPiIpOworCisgIHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9rbHZfZGVwYXlfc2V0Y2FwczsKKyAgcnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+cHJvY2Vzc19ydHBfcGFja2V0ID0gZ3N0X3J0cF9rbHZfZGVwYXlfcHJvY2VzczsKKyAgcnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2V2ZW50ID0gZ3N0X3J0cF9rbHZfZGVwYXlfaGFuZGxlX2V2ZW50OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9rbHZfZGVwYXlfaW5pdCAoR3N0UnRwS2x2RGVwYXkgKiBrbHZkZXBheSkKK3sKKyAga2x2ZGVwYXktPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2tsdl9kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwS2x2RGVwYXkgKmtsdmRlcGF5OworCisgIGtsdmRlcGF5ID0gR1NUX1JUUF9LTFZfREVQQVkgKG9iamVjdCk7CisKKyAgZ3N0X3J0cF9rbHZfZGVwYXlfcmVzZXQgKGtsdmRlcGF5KTsKKyAgZ19vYmplY3RfdW5yZWYgKGtsdmRlcGF5LT5hZGFwdGVyKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2tsdl9kZXBheV9yZXNldCAoR3N0UnRwS2x2RGVwYXkgKiBrbHZkZXBheSkKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAoa2x2ZGVwYXksICJyZXNldHRpbmciKTsKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKGtsdmRlcGF5LT5hZGFwdGVyKTsKKyAga2x2ZGVwYXktPnJlc3luYyA9IFRSVUU7CisgIGtsdmRlcGF5LT5sYXN0X3J0cF90cyA9IC0xOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfa2x2X2RlcGF5X2hhbmRsZV9ldmVudCAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5LCBHc3RFdmVudCAqIGV2KQoreworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldikpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TVFJFQU1fU1RBUlQ6eworICAgICAgR3N0U3RyZWFtRmxhZ3MgZmxhZ3M7CisKKyAgICAgIGV2ID0gZ3N0X2V2ZW50X21ha2Vfd3JpdGFibGUgKGV2KTsKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9zdHJlYW1fZmxhZ3MgKGV2LCAmZmxhZ3MpOworICAgICAgZ3N0X2V2ZW50X3NldF9zdHJlYW1fZmxhZ3MgKGV2LCBmbGFncyB8IEdTVF9TVFJFQU1fRkxBR19TUEFSU0UpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBHU1RfUlRQX0JBU0VfREVQQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5oYW5kbGVfZXZlbnQgKGRlcGF5LCBldik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9rbHZfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgR3N0Q2FwcyAqc3JjX2NhcHM7CisgIGdib29sZWFuIHJlczsKKyAgZ2ludCBjbG9ja19yYXRlOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgc3JjX2NhcHMgPSBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXRfY2FwcyAoJnNyY190ZW1wbGF0ZSk7CisgIHJlcyA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNfY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNfY2Fwcyk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitrbHZfZ2V0X3ZsZW4gKGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50IGRhdGFfbGVuLCBndWludDY0ICogdl9sZW4sCisgICAgZ3NpemUgKiBsZW5fc2l6ZSkKK3sKKyAgZ3VpbnQ4IGZpcnN0X2J5dGUsIGxlbl9sZW47CisgIGd1aW50NjQgbGVuOworCisgIGdfYXNzZXJ0IChkYXRhX2xlbiA+IDApOworCisgIGZpcnN0X2J5dGUgPSAqZGF0YSsrOworCisgIGlmICgoZmlyc3RfYnl0ZSAmIDB4ODApID09IDApIHsKKyAgICAqdl9sZW4gPSBmaXJzdF9ieXRlICYgMHg3ZjsKKyAgICAqbGVuX3NpemUgPSAxOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgbGVuX2xlbiA9IGZpcnN0X2J5dGUgJiAweDdmOworCisgIGlmIChsZW5fbGVuID09IDAgfHwgbGVuX2xlbiA+IDgpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICgoMSArIGxlbl9sZW4pID4gZGF0YV9sZW4pCisgICAgcmV0dXJuIEZBTFNFOworCisgICpsZW5fc2l6ZSA9IDEgKyBsZW5fbGVuOworCisgIGxlbiA9IDA7CisgIHdoaWxlIChsZW5fbGVuID4gMCkgeworICAgIGxlbiA9IGxlbiA8PCA4IHwgKmRhdGErKzsKKyAgICAtLWxlbl9sZW47CisgIH0KKworICAqdl9sZW4gPSBsZW47CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9rbHZfZGVwYXlfcHJvY2Vzc19kYXRhIChHc3RSdHBLbHZEZXBheSAqIGtsdmRlcGF5KQoreworICBnc2l6ZSBhdmFpbCwgZGF0YV9sZW4sIGxlbl9zaXplOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ3VpbnQ4IGRhdGFbMSArIDhdOworICBndWludDY0IHZfbGVuOworCisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChrbHZkZXBheS0+YWRhcHRlcik7CisKKyAgR1NUX1RSQUNFX09CSkVDVCAoa2x2ZGVwYXksICIlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIGluIGFkYXB0ZXIiLCBhdmFpbCk7CisKKyAgaWYgKGF2YWlsID09IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogbmVlZCBhdCBsZWFzdCAxNiBieXRlcyBvZiBVTCBrZXkgcGx1cyAxIGJ5dGUgb2YgbGVuZ3RoICovCisgIGlmIChhdmFpbCA8IDE2ICsgMSkKKyAgICBnb3RvIGJhZF9rbHZfcGFja2V0OworCisgIC8qIGNoZWNrIGlmIHRoZSBkZWNsYXJlZCBLTFYgdW5pdCBzaXplIG1hdGNoZXMgYWN0dWFsIGJ5dGVzIGF2YWlsYWJsZSAqLworICBkYXRhX2xlbiA9IE1JTiAoYXZhaWwgLSAxNiwgMSArIDgpOworICBnc3RfYWRhcHRlcl9jb3B5IChrbHZkZXBheS0+YWRhcHRlciwgZGF0YSwgMTYsIGRhdGFfbGVuKTsKKyAgaWYgKCFrbHZfZ2V0X3ZsZW4gKGRhdGEsIGRhdGFfbGVuLCAmdl9sZW4sICZsZW5fc2l6ZSkpCisgICAgZ290byBiYWRfa2x2X3BhY2tldDsKKworICBHU1RfTE9HX09CSkVDVCAoa2x2ZGVwYXksICJ3YW50ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBieXRlcywgIgorICAgICAgImhhdmUgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyIsIDE2ICsgbGVuX3NpemUgKyB2X2xlbiwgYXZhaWwpOworCisgIGlmIChhdmFpbCA8IDE2ICsgbGVuX3NpemUgKyB2X2xlbikKKyAgICBnb3RvIGluY29tcGxldGVfa2x2X3BhY2tldDsKKworICAvKiBzb21ldGhpbmcgaXMgd3JvbmcsIHRoaXMgc2hvdWxkbid0IGV2ZXIgaGFwcGVuICovCisgIGlmIChhdmFpbCA+IDE2ICsgbGVuX3NpemUgKyB2X2xlbikKKyAgICBnb3RvIGJhZF9rbHZfcGFja2V0OworCisgIG91dGJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChrbHZkZXBheS0+YWRhcHRlciwgYXZhaWwpOworCisgIC8qIE1hcmsgYnVmZmVycyBhcyBrZXkgdW5pdCB0byBzaWduYWwgdGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBLTFYgdW5pdAorICAgKiAoZm9yIG5vdyBhbGwgYnVmZmVycyB3aWxsIGJlIGZsYWdnZWQgbGlrZSB0aGlzLCBzaW5jZSBhbGwgYnVmZmVycyBhcmUKKyAgICogc2VsZi1jb250YWluZWQgS0xWIHVuaXRzLCBidXQgaW4gZnV0dXJlIHRoYXQgbWlnaHQgY2hhbmdlKSAqLworICBvdXRidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKG91dGJ1Zik7CisgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisKKyAgcmV0dXJuIG91dGJ1ZjsKKworLyogRVJST1JTICovCitiYWRfa2x2X3BhY2tldDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoa2x2ZGVwYXksICJiYWQgS0xWIHBhY2tldCwgZHJvcHBpbmciKTsKKyAgICBnc3RfcnRwX2tsdl9kZXBheV9yZXNldCAoa2x2ZGVwYXkpOworICAgIHJldHVybiBOVUxMOworICB9CitpbmNvbXBsZXRlX2tsdl9wYWNrZXQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChrbHZkZXBheSwgInBhcnRpYWwgS0xWIHBhY2tldDogaGF2ZSAldSBieXRlcywgd2FudCAldSIsCisgICAgICAgIChndWludCkgYXZhaWwsIChndWludCkgKDE2ICsgbGVuX3NpemUgKyB2X2xlbikpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKKy8qIFdlJ3JlIHRyeWluZyB0byBiZSBwcmFnbWF0aWMgaGVyZSwgbm90IHF1aXRlIGFzIHN0cmljdCBhcyB0aGUgc3BlYyB3YW50cworICogdXMgdG8gYmUgd2l0aCByZWdhcmQgdG8gbWFya2VyIGJpdHMgYW5kIHJlc3luY2luZyBhZnRlciBwYWNrZXQgbG9zcyAqLworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX2tsdl9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cEtsdkRlcGF5ICprbHZkZXBheSA9IEdTVF9SVFBfS0xWX0RFUEFZIChkZXBheWxvYWQpOworICBHc3RCdWZmZXIgKnBheWxvYWQsICpvdXRidWYgPSBOVUxMOworICBnYm9vbGVhbiBtYXJrZXIsIHN0YXJ0ID0gRkFMU0UsIG1heWJlX3N0YXJ0OworICBndWludDMyIHJ0cF90czsKKyAgZ3VpbnQxNiBzZXE7CisgIGd1aW50IHBheWxvYWRfbGVuOworCisgIC8qIElnbm9yZSBESVNDT05UIG9uIGZpcnN0IGJ1ZmZlciBhbmQgb24gYnVmZmVycyBmb2xsb3dpbmcgYSBkaXNjb250ICovCisgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKHJ0cC0+YnVmZmVyKSAmJiBrbHZkZXBheS0+bGFzdF9ydHBfdHMgIT0gLTEpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGtsdmRlcGF5LCAiRElTQ09OVCwgbmVlZCB0byByZXN5bmMiKTsKKyAgICBnc3RfcnRwX2tsdl9kZXBheV9yZXNldCAoa2x2ZGVwYXkpOworICB9CisKKyAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisKKyAgLyogbWFya2VyIGJpdCBzaWduYWxzIGxhc3QgZnJhZ21lbnQgb2YgYSBLTFYgdW5pdCAqLworICBtYXJrZXIgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApOworCisgIHNlcSA9IGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKHJ0cCk7CisKKyAgLyogcGFja2V0IGRpcmVjdGx5IGFmdGVyIG9uZSB3aXRoIG1hcmtlciBiaXQgc2V0ID0+IHN0YXJ0ICovCisgIHN0YXJ0ID0ga2x2ZGVwYXktPmxhc3RfbWFya2VyX3NlcSAhPSAtMQorICAgICAgJiYgZ3N0X3J0cF9idWZmZXJfY29tcGFyZV9zZXFudW0gKGtsdmRlcGF5LT5sYXN0X21hcmtlcl9zZXEsIHNlcSkgPT0gMTsKKworICAvKiBkZWR1Y2Ugc3RhcnQgb2YgbmV3IEtMViB1bml0IGluIGNhc2Ugc2VuZGVyIGRvZXNuJ3Qgc2V0IG1hcmtlciBiaXRzCisgICAqIChpdCdzIG5vdCBsaWtlIHRoZSBzcGVjIGlzIGFtYmlndW91cyBhYm91dCB0aGF0LCBidXQgd2hhdCBjYW4geW91IGRvKSAqLworICBydHBfdHMgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wIChydHApOworCisgIG1heWJlX3N0YXJ0ID0ga2x2ZGVwYXktPmxhc3RfcnRwX3RzID09IC0xIHx8IGtsdmRlcGF5LT5sYXN0X3J0cF90cyAhPSBydHBfdHM7CisKKyAga2x2ZGVwYXktPmxhc3RfcnRwX3RzID0gcnRwX3RzOworCisgIC8qIGZhbGxiYWNrIHRvIGRldGVjdCBzZWxmLWNvbnRhaW5lZCBzaW5nbGUgS0xWIHVuaXQgKHVzdWFsIGNhc2UpICovCisgIGlmICgoIXN0YXJ0IHx8ICFtYXJrZXIgfHwgbWF5YmVfc3RhcnQpICYmIHBheWxvYWRfbGVuID4gMTYpIHsKKyAgICBjb25zdCBndWludDggKmRhdGE7CisgICAgZ3VpbnQ2NCB2X2xlbjsKKyAgICBnc2l6ZSBsZW5fc2l6ZTsKKworICAgIGRhdGEgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAocnRwKTsKKyAgICBpZiAoR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhKSA9PSAweDA2MGUyYjM0ICYmCisgICAgICAgIGtsdl9nZXRfdmxlbiAoZGF0YSArIDE2LCBwYXlsb2FkX2xlbiAtIDE2LCAmdl9sZW4sICZsZW5fc2l6ZSkpIHsKKyAgICAgIGlmICgxNiArIGxlbl9zaXplICsgdl9sZW4gPT0gcGF5bG9hZF9sZW4pIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGtsdmRlcGF5LCAiTG9va3MgbGlrZSBhIHNlbGYtY29udGFpbmVkIEtMViB1bml0Iik7CisgICAgICAgIG1hcmtlciA9IFRSVUU7CisgICAgICAgIHN0YXJ0ID0gVFJVRTsKKyAgICAgIH0gZWxzZSBpZiAoMTYgKyBsZW5fc2l6ZSArIHZfbGVuID4gcGF5bG9hZF9sZW4pIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKGtsdmRlcGF5LAorICAgICAgICAgICAgIkxvb2tzIGxpa2UgdGhlIHN0YXJ0IG9mIGEgZnJhZ21lbnRlZCBLTFYgdW5pdCIpOworICAgICAgICBzdGFydCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgcGFja2V0IGFuZCBsb29rcyBsaWtlIGEgc3RhcnQsIGNsZWFyIHJlc3luYyBmbGFnICovCisgIGlmIChrbHZkZXBheS0+cmVzeW5jICYmIGtsdmRlcGF5LT5sYXN0X21hcmtlcl9zZXEgPT0gLTEgJiYgc3RhcnQpCisgICAga2x2ZGVwYXktPnJlc3luYyA9IEZBTFNFOworCisgIGlmIChtYXJrZXIpCisgICAga2x2ZGVwYXktPmxhc3RfbWFya2VyX3NlcSA9IHNlcTsKKworICBHU1RfTE9HX09CSkVDVCAoa2x2ZGVwYXksICJwYXlsb2FkIG9mICV1IGJ5dGVzLCBtYXJrZXI9JWQsIHN0YXJ0PSVkIiwKKyAgICAgIHBheWxvYWRfbGVuLCBtYXJrZXIsIHN0YXJ0KTsKKworICBpZiAoa2x2ZGVwYXktPnJlc3luYyAmJiAhc3RhcnQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChrbHZkZXBheSwgIkRyb3BwaW5nIGJ1ZmZlciwgd2FpdGluZyB0byByZXN5bmMiKTsKKworICAgIGlmIChtYXJrZXIpCisgICAgICBrbHZkZXBheS0+cmVzeW5jID0gRkFMU0U7CisKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBpZiAoc3RhcnQgJiYgIW1hcmtlcikKKyAgICBvdXRidWYgPSBnc3RfcnRwX2tsdl9kZXBheV9wcm9jZXNzX2RhdGEgKGtsdmRlcGF5KTsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfYnVmZmVyIChydHApOworICBnc3RfYWRhcHRlcl9wdXNoIChrbHZkZXBheS0+YWRhcHRlciwgcGF5bG9hZCk7CisKKyAgaWYgKG1hcmtlcikKKyAgICBvdXRidWYgPSBnc3RfcnRwX2tsdl9kZXBheV9wcm9jZXNzX2RhdGEgKGtsdmRlcGF5KTsKKworZG9uZToKKworICByZXR1cm4gb3V0YnVmOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfa2x2X2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cEtsdkRlcGF5ICprbHZkZXBheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIGtsdmRlcGF5ID0gR1NUX1JUUF9LTFZfREVQQVkgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfcnRwX2tsdl9kZXBheV9yZXNldCAoa2x2ZGVwYXkpOworICAgICAga2x2ZGVwYXktPmxhc3RfbWFya2VyX3NlcSA9IC0xOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfa2x2X2RlcGF5X3Jlc2V0IChrbHZkZXBheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfa2x2X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwa2x2ZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfS0xWX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwa2x2ZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwa2x2ZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWEyNTZkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBrbHZkZXBheS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIEdTdHJlYW1lciBSVFAgS0xWIERlcGF5bG9hZGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW1AY2VudHJpY3VsYXIuY29tPj4KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IENlbnRyaWN1bGFyIEx0ZAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0tMVl9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0tMVl9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfS0xWX0RFUEFZIFwKKyAgKGdzdF9ydHBfa2x2X2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfS0xWX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0tMVl9ERVBBWSxHc3RSdHBLbHZEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfS0xWX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9LTFZfREVQQVksR3N0UnRwS2x2RGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfS0xWX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0tMVl9ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfS0xWX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9LTFZfREVQQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwS2x2RGVwYXkgR3N0UnRwS2x2RGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwS2x2RGVwYXlDbGFzcyBHc3RSdHBLbHZEZXBheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cEtsdkRlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisgIGdib29sZWFuICAgIHJlc3luYzsKKyAgZ2ludCAgICAgICAgbGFzdF9tYXJrZXJfc2VxOyAgIC8qIC0xIGlmIHVuc2V0LCBvdGhlcndpc2UgMC1HX01BWFVJTlQxNiAqLworICBnaW50NjQgICAgICBsYXN0X3J0cF90czsgICAgICAgLyogLTEgaWYgdW5zZXQsIG90aGVyd2lzZSAwLUdfTUFYVUlOVDMyICovCit9OworCitzdHJ1Y3QgX0dzdFJ0cEtsdkRlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dfR05VQ19JTlRFUk5BTCBHVHlwZSAgICAgZ3N0X3J0cF9rbHZfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitHX0dOVUNfSU5URVJOQUwgZ2Jvb2xlYW4gIGdzdF9ydHBfa2x2X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0tMVl9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwa2x2cGF5LmMgYi9nc3QvcnRwL2dzdHJ0cGtsdnBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMDdkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cGtsdnBheS5jCkBAIC0wLDAgKzEsMjA0IEBACisvKiBHU3RyZWFtZXIgUlRQIEtMViBQYXlsb2FkZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+PgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgQ2VudHJpY3VsYXIgTHRkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwa2x2cGF5CisgKiBAc2VlX2Fsc286IHJ0cGtsdmRlcGF5CisgKgorICogUGF5bG9hZHMgS0xWIG1ldGFkYXRhIGludG8gUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQyA2NTk3LgorICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZTogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjU5NworICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBmaWxlc3JjIGxvY2F0aW9uPXZpZGVvLXdpdGgta2x2LnRzICEgdHNkZW11eCAhIHJ0cGtsdnBheSAhIHVkcHNpbmsKKyAqIF18IFRoaXMgZXhhbXBsZSBwaXBlbGluZSB3aWxsIHBheWxvYWQgYW4gUlRQIEtMViBzdHJlYW0gZXh0cmFjdGVkIGZyb20gYW4KKyAqIE1QRUctVFMgc3RyZWFtIGFuZCBzZW5kIGl0IHZpYSBVRFAgdG8gYW4gUlRQIHJlY2VpdmVyLgorICogPC9yZWZzZWN0Mj4KKyAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0cnRwa2x2cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChrbHZwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKGtsdnBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBhcHBsaWNhdGlvbiwgY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVhdLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgU01QVEUzMzZNIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoIm1ldGEveC1rbHYsIHBhcnNlZCA9IChib29sKSB0cnVlIikpOworCisjZGVmaW5lIGdzdF9ydHBfa2x2X3BheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBLbHZQYXksIGdzdF9ydHBfa2x2X3BheSwgR1NUX1RZUEVfUlRQX0JBU0VfUEFZTE9BRCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2tsdl9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXksCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9rbHZfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5LAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2tsdl9wYXlfY2xhc3NfaW5pdCAoR3N0UnRwS2x2UGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqcnRwYmFzZXBheV9jbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoa2x2cGF5X2RlYnVnLCAia2x2cGF5IiwgMCwgIlJUUCBLTFYgUGF5bG9hZGVyIik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIEtMViBQYXlsb2FkZXIiLCAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkcyBLTFYgKFNNUFRFIFNUIDMzNikgbWV0YWRhdGEgYXMgUlRQIHBhY2tldHMiLAorICAgICAgIlRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+Iik7CisKKyAgcnRwYmFzZXBheV9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIHJ0cGJhc2VwYXlfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9rbHZfcGF5X3NldGNhcHM7CisgIHJ0cGJhc2VwYXlfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX2tsdl9wYXlfaGFuZGxlX2J1ZmZlcjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfa2x2X3BheV9pbml0IChHc3RSdHBLbHZQYXkgKiBrbHZwYXkpCit7CisgIC8qIG5vdGhpbmcgdG8gZG8gaGVyZSB5ZXQgKi8KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2tsdl9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXksIEdzdENhcHMgKiBjYXBzKQoreworICAvKiBGSVhNRTogYWxsb3cgb3RoZXIgY2xvY2sgcmF0ZXMgKi8KKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHBheSwgImFwcGxpY2F0aW9uIiwgVFJVRSwgIlNNUFRFMzM2TSIsCisgICAgICA5MDAwMCk7CisKKyAgcmV0dXJuIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXksIE5VTEwpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9rbHZfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdCA9IE5VTEw7CisgIEdzdFJ0cEtsdlBheSAqcGF5OworICBHc3RNYXBJbmZvIG1hcDsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBnc2l6ZSBvZmZzZXQ7CisgIGd1aW50IG10dSwgcnRwX2hlYWRlcl9zaXplLCBtYXhfcGF5bG9hZF9zaXplOworCisgIHBheSA9IEdTVF9SVFBfS0xWX1BBWSAoYmFzZXBheWxvYWQpOworICBtdHUgPSBHU1RfUlRQX0JBU0VfUEFZTE9BRF9NVFUgKGJhc2VwYXlsb2FkKTsKKworICBydHBfaGVhZGVyX3NpemUgPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX2hlYWRlcl9sZW4gKDApOworICBtYXhfcGF5bG9hZF9zaXplID0gbXR1IC0gcnRwX2hlYWRlcl9zaXplOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgaWYgKG1hcC5zaXplID09IDApCisgICAgZ290byBkb25lOworCisgIC8qIEtMViBjb2Rpbmcgc2hhbGwgdXNlIGFuZCBvbmx5IHVzZSBhIGZpeGVkIDE2LWJ5dGUgU01QVEUtYWRtaW5pc3RlcmVkCisgICAqIFVuaXZlcnNhbCBMYWJlbCwgYWNjb3JkaW5nIHRvIFNNUFRFIDI5OE0gYXMgS2V5IChSZWMuIElUVSBSLUJULjE2NTMtMSkgKi8KKyAgaWYgKG1hcC5zaXplIDwgMTYgfHwgR1NUX1JFQURfVUlOVDMyX0JFIChtYXAuZGF0YSkgIT0gMHgwNjBFMkIzNCkKKyAgICBnb3RvIGJhZF9pbnB1dDsKKworICBpZiAobWFwLnNpemUgPiBtYXhfcGF5bG9hZF9zaXplKQorICAgIGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3ICgpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYXksICIlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIG9mIGRhdGEgdG8gcGF5bG9hZCIsCisgICAgICBtYXAuc2l6ZSk7CisKKyAgb2Zmc2V0ID0gMDsKKyAgd2hpbGUgKG9mZnNldCA8IG1hcC5zaXplKSB7CisgICAgR3N0QnVmZmVyICpwYXlsb2FkYnVmOworICAgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwgfTsKKyAgICBndWludCBwYXlsb2FkX3NpemU7CisgICAgZ3VpbnQgYnl0ZXNfbGVmdDsKKworICAgIGJ5dGVzX2xlZnQgPSBtYXAuc2l6ZSAtIG9mZnNldDsKKyAgICBwYXlsb2FkX3NpemUgPSBNSU4gKGJ5dGVzX2xlZnQsIG1heF9wYXlsb2FkX3NpemUpOworCisgICAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlICgwLCAwLCAwKTsKKworICAgIGlmIChwYXlsb2FkX3NpemUgPT0gYnl0ZXNfbGVmdCkgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKHBheSwgImxhc3QgcGFja2V0IG9mIEtMViB1bml0Iik7CisgICAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKG91dGJ1ZiwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisgICAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCAxKTsKKyAgICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgICB9CisKKyAgICBHU1RfTE9HX09CSkVDVCAocGF5LCAicGFja2V0IHdpdGggcGF5bG9hZCBzaXplICV1IiwgcGF5bG9hZF9zaXplKTsKKworICAgIGdzdF9ydHBfY29weV9tZXRhIChHU1RfRUxFTUVOVF9DQVNUIChwYXkpLCBvdXRidWYsIGJ1ZiwgMCk7CisKKyAgICBwYXlsb2FkYnVmID0gZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAoYnVmLCBHU1RfQlVGRkVSX0NPUFlfTUVNT1JZLAorICAgICAgICBvZmZzZXQsIHBheWxvYWRfc2l6ZSk7CisKKyAgICAvKiBqb2luIHJ0cCBoZWFkZXIgKyBwYXlsb2FkIG1lbW9yeSBwYXJ0cyAqLworICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfYXBwZW5kIChvdXRidWYsIHBheWxvYWRidWYpOworCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBHU1RfQlVGRkVSX1BUUyAoYnVmKTsKKyAgICBHU1RfQlVGRkVSX0RUUyAob3V0YnVmKSA9IEdTVF9CVUZGRVJfRFRTIChidWYpOworCisgICAgLyogYW5kIGFkZCB0byBsaXN0ICovCisgICAgaWYgKGxpc3QgIT0gTlVMTCkKKyAgICAgIGdzdF9idWZmZXJfbGlzdF9pbnNlcnQgKGxpc3QsIC0xLCBvdXRidWYpOworCisgICAgb2Zmc2V0ICs9IHBheWxvYWRfc2l6ZTsKKyAgfQorCitkb25lOgorCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgaWYgKGxpc3QgIT0gTlVMTCkKKyAgICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoX2xpc3QgKGJhc2VwYXlsb2FkLCBsaXN0KTsKKyAgZWxzZSBpZiAob3V0YnVmICE9IE5VTEwpCisgICAgcmV0ID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfcHVzaCAoYmFzZXBheWxvYWQsIG91dGJ1Zik7CisKKyAgcmV0dXJuIHJldDsKKworLyogRVJST1JTICovCitiYWRfaW5wdXQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwYXksICJJbnB1dCBkb2Vzbid0IGxvb2sgbGlrZSBhIEtMViBwYWNrZXQsIGlnbm9yaW5nIik7CisgICAgZ290byBkb25lOworICB9Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2tsdl9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBrbHZwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfS0xWX1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cGtsdnBheS5oIGIvZ3N0L3J0cC9nc3RydHBrbHZwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU4MTM0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBrbHZwYXkuaApAQCAtMCwwICsxLDYwIEBACisvKiBHU3RyZWFtZXIgUlRQIEtMViBQYXlsb2FkZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+PgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgQ2VudHJpY3VsYXIgTHRkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfS0xWX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0tMVl9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvcnRwLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfS0xWX1BBWSBcCisgIChnc3RfcnRwX2tsdl9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9LTFZfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0tMVl9QQVksR3N0UnRwS2x2UGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9LTFZfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9LTFZfUEFZLEdzdFJ0cEtsdlBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9LTFZfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0tMVl9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX0tMVl9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX0tMVl9QQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwS2x2UGF5IEdzdFJ0cEtsdlBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBLbHZQYXlDbGFzcyBHc3RSdHBLbHZQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBLbHZQYXkKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWQgcnRwYmFzZXBheWxvYWQ7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cEtsdlBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgcnRwYmFzZXBheWxvYWRfY2xhc3M7Cit9OworCitHX0dOVUNfSU5URVJOQUwgIEdUeXBlICAgICBnc3RfcnRwX2tsdl9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitHX0dOVUNfSU5URVJOQUwgIGdib29sZWFuICBnc3RfcnRwX2tsdl9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfS0xWX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cG1wMXNkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYTMxMDgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG1wMXNkZXBheS5jCkBAIC0wLDAgKzEsMTQzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDg+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0cnRwbXAxc2RlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworLyogUnRwTVAxU0RlcGF5IHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTEFTVAorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXAxc19kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL21wZWcsc3lzdGVtc3RyZWFtPShib29sZWFuKXRydWUiKQorICAgICk7CisKKy8qIFRoZSBzcGVjIHNheXMgdmlkZW8vTVAxUyBidXQgSSBoYXZlIHNlZW4gc3RyZWFtcyB3aXRoIG90aGVyL01QMVMgc28gd2Ugd2lsbAorICogYWxsb3cgdGhlbSBib3RoICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9tcDFzX2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwib3RoZXJcIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVggXSwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTVAxU1wiOyIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVggXSwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTVAxU1wiIikKKyAgICApOworCitHX0RFRklORV9UWVBFIChHc3RSdHBNUDFTRGVwYXksIGdzdF9ydHBfbXAxc19kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tcDFzX2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9tcDFzX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXAxc19kZXBheV9jbGFzc19pbml0IChHc3RSdHBNUDFTRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+cHJvY2Vzc19ydHBfcGFja2V0ID0gZ3N0X3J0cF9tcDFzX2RlcGF5X3Byb2Nlc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9tcDFzX2RlcGF5X3NldGNhcHM7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcDFzX2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXAxc19kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBNUEVHMSBTeXN0ZW0gU3RyZWFtIGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBNUEVHMSBTeXN0ZW0gU3RyZWFtcyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMzU1NSkiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wMXNfZGVwYXlfaW5pdCAoR3N0UnRwTVAxU0RlcGF5ICogcnRwbXAxc2RlcGF5KQoreworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXAxc19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0Q2FwcyAqc3JjY2FwczsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBjbG9ja19yYXRlID0gOTAwMDA7ICAgICAgICAgLyogZGVmYXVsdCAqLworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8vbXBlZyIsCisgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICByZXMgPSBnc3RfcGFkX3NldF9jYXBzIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAoZGVwYXlsb2FkKSwgc3JjY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfbXAxc19kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworCisgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2J1ZmZlciAocnRwKTsKKworICBpZiAob3V0YnVmKSB7CisgICAgR1NUX0RFQlVHICgiZ3N0X3J0cF9tcDFzX2RlcGF5X2NoYWluOiBwdXNoaW5nIGJ1ZmZlciBvZiBzaXplICUiCisgICAgICAgIEdfR1NJWkVfRk9STUFULCBnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWYpKTsKKworICAgIGdzdF9ydHBfZHJvcF9tZXRhIChHU1RfRUxFTUVOVF9DQVNUIChkZXBheWxvYWQpLCBvdXRidWYsIDApOworICB9CisKKyAgcmV0dXJuIG91dGJ1ZjsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfbXAxc19kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cG1wMXNkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9NUDFTX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXAxc2RlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cG1wMXNkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MjkzM2IKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG1wMXNkZXBheS5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9NUDFTX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfTVAxU19ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfTVAxU19ERVBBWSBcCisgIChnc3RfcnRwX21wMXNfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9NUDFTX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX01QMVNfREVQQVksR3N0UnRwTVAxU0RlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9NUDFTX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUDFTX0RFUEFZLEdzdFJ0cE1QMVNEZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUDFTX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX01QMVNfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QMVNfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX01QMVNfREVQQVkpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cE1QMVNEZXBheSBHc3RSdHBNUDFTRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTVAxU0RlcGF5Q2xhc3MgR3N0UnRwTVAxU0RlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTVAxU0RlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworfTsKKworc3RydWN0IF9Hc3RSdHBNUDFTRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9tcDFzX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9tcDFzX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX01QMVNfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGUwZDBjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBtcDJ0ZGVwYXkuYwpAQCAtMCwwICsxLDI0MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdzdHJ0cG1wMnRkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKKy8qIFJ0cE1QMlREZXBheSBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKKyNkZWZpbmUgREVGQVVMVF9TS0lQX0ZJUlNUX0JZVEVTCTAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfU0tJUF9GSVJTVF9CWVRFUworfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXAydF9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL21wZWd0cywiCisgICAgICAgICJwYWNrZXRzaXplPShpbnQpMTg4LCIgInN5c3RlbXN0cmVhbT0oYm9vbGVhbil0cnVlIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9tcDJ0X2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVggXSwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIHsgTVAyVCwgTVAyVC1FUyB9IDsiCisgICAgICAgIC8qIEFsbCBvcHRpb25hbCBwYXJhbWV0ZXJzCisgICAgICAgICAqCisgICAgICAgICAqICJwcm9maWxlLWxldmVsLWlkPVsxLE1BWF0iCisgICAgICAgICAqICJjb25maWc9IiAKKyAgICAgICAgICovCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9NUDJUX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWCBdIikKKyAgICApOworCitHX0RFRklORV9UWVBFIChHc3RSdHBNUDJURGVwYXksIGdzdF9ydHBfbXAydF9kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tcDJ0X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9tcDJ0X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9tcDJ0X2RlcGF5X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfbXAydF9kZXBheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wMnRfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UnRwTVAyVERlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfbXAydF9kZXBheV9wcm9jZXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfbXAydF9kZXBheV9zZXRjYXBzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9ydHBfbXAydF9kZXBheV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9ydHBfbXAydF9kZXBheV9nZXRfcHJvcGVydHk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcDJ0X2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXAydF9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBNUEVHIFRyYW5zcG9ydCBTdHJlYW0gZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIE1QRUcyIFRTIGZyb20gUlRQIHBhY2tldHMgKFJGQyAyMjUwKSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4sICIKKyAgICAgICJUaGlqcyBWZXJtZWlyIDx0aGlqcy52ZXJtZWlyQGJhcmNvLmNvbT4iKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NLSVBfRklSU1RfQllURVMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInNraXAtZmlyc3QtYnl0ZXMiLAorICAgICAgICAgICJTa2lwIGZpcnN0IGJ5dGVzIiwKKyAgICAgICAgICAiVGhlIGFtb3VudCBvZiBieXRlcyB0aGF0IG5lZWQgdG8gYmUgc2tpcHBlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXlsb2FkIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIDAsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wMnRfZGVwYXlfaW5pdCAoR3N0UnRwTVAyVERlcGF5ICogcnRwbXAydGRlcGF5KQoreworICBydHBtcDJ0ZGVwYXktPnNraXBfZmlyc3RfYnl0ZXMgPSBERUZBVUxUX1NLSVBfRklSU1RfQllURVM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcDJ0X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RDYXBzICpzcmNjYXBzOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2ludCBjbG9ja19yYXRlOworICBnYm9vbGVhbiByZXM7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA5MDAwMDsgICAgICAgICAvKiBkZWZhdWx0ICovCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby9tcGVndHMiLAorICAgICAgInBhY2tldHNpemUiLCBHX1RZUEVfSU5ULCAxODgsCisgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICByZXMgPSBnc3RfcGFkX3NldF9jYXBzIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAoZGVwYXlsb2FkKSwgc3JjY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfbXAydF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cE1QMlREZXBheSAqcnRwbXAydGRlcGF5OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ2ludCBwYXlsb2FkX2xlbiwgbGVmdG92ZXI7CisKKyAgcnRwbXAydGRlcGF5ID0gR1NUX1JUUF9NUDJUX0RFUEFZIChkZXBheWxvYWQpOworCisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgIGlmIChHX1VOTElLRUxZIChwYXlsb2FkX2xlbiA8PSBydHBtcDJ0ZGVwYXktPnNraXBfZmlyc3RfYnl0ZXMpKQorICAgIGdvdG8gZW1wdHlfcGFja2V0OworCisgIHBheWxvYWRfbGVuIC09IHJ0cG1wMnRkZXBheS0+c2tpcF9maXJzdF9ieXRlczsKKworICAvKiBSRkMgMjI1MAorICAgKgorICAgKiAyLiBFbmNhcHN1bGF0aW9uIG9mIE1QRUcgU3lzdGVtIGFuZCBUcmFuc3BvcnQgU3RyZWFtcworICAgKgorICAgKiBGb3IgTVBFRzIgVHJhbnNwb3J0IFN0cmVhbXMgdGhlIFJUUCBwYXlsb2FkIHdpbGwgY29udGFpbiBhbiBpbnRlZ3JhbAorICAgKiBudW1iZXIgb2YgTVBFRyB0cmFuc3BvcnQgcGFja2V0cy4KKyAgICovCisgIGxlZnRvdmVyID0gcGF5bG9hZF9sZW4gJSAxODg7CisgIGlmIChHX1VOTElLRUxZIChsZWZ0b3ZlcikpIHsKKyAgICBHU1RfV0FSTklORyAoIldlIGRvbid0IGhhdmUgYW4gaW50ZWdyYWwgbnVtYmVyIG9mIGJ1ZmZlcnMgKGxlZnRvdmVyOiAlZCkiLAorICAgICAgICBsZWZ0b3Zlcik7CisKKyAgICBwYXlsb2FkX2xlbiAtPSBsZWZ0b3ZlcjsKKyAgfQorCisgIG91dGJ1ZiA9CisgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwKKyAgICAgIHJ0cG1wMnRkZXBheS0+c2tpcF9maXJzdF9ieXRlcywgcGF5bG9hZF9sZW4pOworCisgIGlmIChvdXRidWYpIHsKKyAgICBHU1RfREVCVUcgKCJnc3RfcnRwX21wMnRfZGVwYXlfY2hhaW46IHB1c2hpbmcgYnVmZmVyIG9mIHNpemUgJSIKKyAgICAgICAgR19HU0laRV9GT1JNQVQsIGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZikpOworCisgICAgZ3N0X3J0cF9kcm9wX21ldGEgKEdTVF9FTEVNRU5UX0NBU1QgKGRlcGF5bG9hZCksIG91dGJ1ZiwgMCk7CisgIH0KKworICByZXR1cm4gb3V0YnVmOworCisgIC8qIEVSUk9SUyAqLworZW1wdHlfcGFja2V0OgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwbXAydGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIlBhY2tldCB3YXMgZW1wdHkiKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXAydF9kZXBheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwTVAyVERlcGF5ICpydHBtcDJ0ZGVwYXk7CisKKyAgcnRwbXAydGRlcGF5ID0gR1NUX1JUUF9NUDJUX0RFUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TS0lQX0ZJUlNUX0JZVEVTOgorICAgICAgcnRwbXAydGRlcGF5LT5za2lwX2ZpcnN0X2J5dGVzID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcDJ0X2RlcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBNUDJURGVwYXkgKnJ0cG1wMnRkZXBheTsKKworICBydHBtcDJ0ZGVwYXkgPSBHU1RfUlRQX01QMlRfREVQQVkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1NLSVBfRklSU1RfQllURVM6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnRwbXAydGRlcGF5LT5za2lwX2ZpcnN0X2J5dGVzKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfbXAydF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cG1wMnRkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9NUDJUX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXAydGRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOTM2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG1wMnRkZXBheS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9NUDJUX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfTVAyVF9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfTVAyVF9ERVBBWSBcCisgIChnc3RfcnRwX21wMnRfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9NUDJUX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX01QMlRfREVQQVksR3N0UnRwTVAyVERlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9NUDJUX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUDJUX0RFUEFZLEdzdFJ0cE1QMlREZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUDJUX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX01QMlRfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QMlRfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX01QMlRfREVQQVkpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cE1QMlREZXBheSBHc3RSdHBNUDJURGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTVAyVERlcGF5Q2xhc3MgR3N0UnRwTVAyVERlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTVAyVERlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCisgIGd1aW50OCBza2lwX2ZpcnN0X2J5dGVzOworfTsKKworc3RydWN0IF9Hc3RSdHBNUDJURGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9tcDJ0X2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9tcDJ0X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX01QMlRfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwbXAydHBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZjk0OGUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG1wMnRwYXkuYwpAQCAtMCwwICsxLDIzNyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworI2luY2x1ZGUgImdzdHJ0cG1wMnRwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9tcDJ0X3BheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL21wZWd0cywiCisgICAgICAgICJwYWNrZXRzaXplPShpbnQpMTg4LCIgInN5c3RlbXN0cmVhbT0oYm9vbGVhbil0cnVlIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9tcDJ0X3BheV9zcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9NUDJUX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIk1QMlRcIiA7ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTVAyVFwiIikKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tcDJ0X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9tcDJ0X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqCisgICAgcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfbXAydF9wYXlfZmx1c2ggKEdzdFJUUE1QMlRQYXkgKiBydHBtcDJ0cGF5KTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfbXAydF9wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCisjZGVmaW5lIGdzdF9ydHBfbXAydF9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UlRQTVAyVFBheSwgZ3N0X3J0cF9tcDJ0X3BheSwgR1NUX1RZUEVfUlRQX0JBU0VfUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wMnRfcGF5X2NsYXNzX2luaXQgKEdzdFJUUE1QMlRQYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9tcDJ0X3BheV9maW5hbGl6ZTsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX21wMnRfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9tcDJ0X3BheV9oYW5kbGVfYnVmZmVyOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXAydF9wYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXAydF9wYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgTVBFRzIgVHJhbnNwb3J0IFN0cmVhbSBwYXlsb2FkZXIiLCAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkLWVuY29kZXMgTVBFRzIgVFMgaW50byBSVFAgcGFja2V0cyAoUkZDIDIyNTApIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcDJ0X3BheV9pbml0IChHc3RSVFBNUDJUUGF5ICogcnRwbXAydHBheSkKK3sKKyAgR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cG1wMnRwYXkpLT5jbG9ja19yYXRlID0gOTAwMDA7CisgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX1BUIChydHBtcDJ0cGF5KSA9IEdTVF9SVFBfUEFZTE9BRF9NUDJUOworCisgIHJ0cG1wMnRwYXktPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wMnRfcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSVFBNUDJUUGF5ICpydHBtcDJ0cGF5OworCisgIHJ0cG1wMnRwYXkgPSBHU1RfUlRQX01QMlRfUEFZIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChydHBtcDJ0cGF5LT5hZGFwdGVyKTsKKyAgcnRwbXAydHBheS0+YWRhcHRlciA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXAydF9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2Jvb2xlYW4gcmVzOworCisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChwYXlsb2FkLCAidmlkZW8iLAorICAgICAgcGF5bG9hZC0+cHQgIT0gR1NUX1JUUF9QQVlMT0FEX01QMlQsICJNUDJUIiwgOTAwMDApOworICByZXMgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAocGF5bG9hZCwgTlVMTCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfbXAydF9wYXlfZmx1c2ggKEdzdFJUUE1QMlRQYXkgKiBydHBtcDJ0cGF5KQoreworICBndWludCBhdmFpbCwgbXR1OworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKworICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwbXAydHBheS0+YWRhcHRlcik7CisKKyAgbXR1ID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChydHBtcDJ0cGF5KTsKKworICB3aGlsZSAoYXZhaWwgPiAwICYmIChyZXQgPT0gR1NUX0ZMT1dfT0spKSB7CisgICAgZ3VpbnQgdG93cml0ZTsKKyAgICBndWludCBwYXlsb2FkX2xlbjsKKyAgICBndWludCBwYWNrZXRfbGVuOworICAgIEdzdEJ1ZmZlciAqcGF5YnVmOworCisgICAgLyogdGhpcyB3aWxsIGJlIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIHBhY2tldCAqLworICAgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKGF2YWlsLCAwLCAwKTsKKworICAgIC8qIGZpbGwgb25lIE1UVSBvciBhbGwgYXZhaWxhYmxlIGJ5dGVzICovCisgICAgdG93cml0ZSA9IE1JTiAocGFja2V0X2xlbiwgbXR1KTsKKworICAgIC8qIHRoaXMgaXMgdGhlIHBheWxvYWQgbGVuZ3RoICovCisgICAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BheWxvYWRfbGVuICh0b3dyaXRlLCAwLCAwKTsKKyAgICBwYXlsb2FkX2xlbiAtPSBwYXlsb2FkX2xlbiAlIDE4ODsKKworICAgIC8qIG5lZWQgd2hvbGUgcGFja2V0cyAqLworICAgIGlmICghcGF5bG9hZF9sZW4pCisgICAgICBicmVhazsKKworICAgIC8qIGNyZWF0ZSBidWZmZXIgdG8gaG9sZCB0aGUgcGF5bG9hZCAqLworICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMCwgMCwgMCk7CisKKyAgICAvKiBnZXQgcGF5bG9hZCAqLworICAgIHBheWJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyX2Zhc3QgKHJ0cG1wMnRwYXktPmFkYXB0ZXIsIHBheWxvYWRfbGVuKTsKKyAgICBnc3RfcnRwX2NvcHlfbWV0YSAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwbXAydHBheSksIG91dGJ1ZiwgcGF5YnVmLCAwKTsKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAob3V0YnVmLCBwYXlidWYpOworICAgIGF2YWlsIC09IHBheWxvYWRfbGVuOworCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBydHBtcDJ0cGF5LT5maXJzdF90czsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gcnRwbXAydHBheS0+ZHVyYXRpb247CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDJ0cGF5LCAicHVzaGluZyBidWZmZXIgb2Ygc2l6ZSAldSIsCisgICAgICAgIChndWludCkgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0YnVmKSk7CisKKyAgICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoIChHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwbXAydHBheSksIG91dGJ1Zik7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9tcDJ0X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UlRQTVAyVFBheSAqcnRwbXAydHBheTsKKyAgZ3VpbnQgc2l6ZSwgYXZhaWwsIHBhY2tldF9sZW47CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIGR1cmF0aW9uOworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBydHBtcDJ0cGF5ID0gR1NUX1JUUF9NUDJUX1BBWSAoYmFzZXBheWxvYWQpOworCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKyAgZHVyYXRpb24gPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpOworCithZ2FpbjoKKyAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBtcDJ0cGF5LT5hZGFwdGVyKTsKKworICAvKiBJbml0aWFsaXplIG5ldyBSVFAgcGF5bG9hZCAqLworICBpZiAoYXZhaWwgPT0gMCkgeworICAgIHJ0cG1wMnRwYXktPmZpcnN0X3RzID0gdGltZXN0YW1wOworICAgIHJ0cG1wMnRwYXktPmR1cmF0aW9uID0gZHVyYXRpb247CisgIH0KKworICAvKiBnZXQgcGFja2V0IGxlbmd0aCBvZiBwcmV2aW91cyBkYXRhIGFuZCB0aGlzIG5ldyBkYXRhICovCisgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKGF2YWlsICsgc2l6ZSwgMCwgMCk7CisKKyAgLyogaWYgdGhpcyBidWZmZXIgaXMgZ29pbmcgdG8gb3ZlcmZsb3cgdGhlIHBhY2tldCwgZmx1c2ggd2hhdCB3ZSBoYXZlLAorICAgKiBvciBpZiB1cHN0cmVhbSBpcyBoYW5kaW5nIHVzIHNldmVyYWwgcGFja2V0cywgdG8ga2VlcCBsYXRlbmN5IGxvdyAqLworICBpZiAoIXNpemUgfHwgZ3N0X3J0cF9iYXNlX3BheWxvYWRfaXNfZmlsbGVkIChiYXNlcGF5bG9hZCwKKyAgICAgICAgICBwYWNrZXRfbGVuLCBydHBtcDJ0cGF5LT5kdXJhdGlvbiArIGR1cmF0aW9uKSkgeworICAgIHJldCA9IGdzdF9ydHBfbXAydF9wYXlfZmx1c2ggKHJ0cG1wMnRwYXkpOworICAgIHJ0cG1wMnRwYXktPmZpcnN0X3RzID0gdGltZXN0YW1wOworICAgIHJ0cG1wMnRwYXktPmR1cmF0aW9uID0gZHVyYXRpb247CisKKyAgICAvKiBrZWVwIGZpbGxpbmcgdGhlIHBheWxvYWQgKi8KKyAgfSBlbHNlIHsKKyAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGR1cmF0aW9uKSkKKyAgICAgIHJ0cG1wMnRwYXktPmR1cmF0aW9uICs9IGR1cmF0aW9uOworICB9CisKKyAgLyogY29weSBidWZmZXIgdG8gYWRhcHRlciAqLworICBpZiAoYnVmZmVyKSB7CisgICAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwbXAydHBheS0+YWRhcHRlciwgYnVmZmVyKTsKKyAgICBidWZmZXIgPSBOVUxMOworICB9CisKKyAgaWYgKHNpemUgPj0gKDE4OCAqIDIpKSB7CisgICAgc2l6ZSA9IDA7CisgICAgZ290byBhZ2FpbjsKKyAgfQorCisgIHJldHVybiByZXQ7CisKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfbXAydF9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBtcDJ0cGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX01QMlRfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXAydHBheS5oIGIvZ3N0L3J0cC9nc3RydHBtcDJ0cGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmNDk1OQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXAydHBheS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfUlRQX01QMlRfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfTVAyVF9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQTVAyVFBheSBHc3RSVFBNUDJUUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUE1QMlRQYXlDbGFzcyBHc3RSVFBNUDJUUGF5Q2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX01QMlRfUEFZIFwKKyAgKGdzdF9ydHBfbXAydF9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9NUDJUX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9NUDJUX1BBWSxHc3RSVFBNUDJUUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9NUDJUX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTVAyVF9QQVksR3N0UlRQTVAyVFBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUDJUX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9NUDJUX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfTVAyVF9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX01QMlRfUEFZKSkKKworc3RydWN0IF9Hc3RSVFBNUDJUUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisgIAorICBHc3RBZGFwdGVyICAqYWRhcHRlcjsKKyAgR3N0Q2xvY2tUaW1lIGZpcnN0X3RzOworICBHc3RDbG9ja1RpbWUgZHVyYXRpb247Cit9OworCitzdHJ1Y3QgX0dzdFJUUE1QMlRQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfbXAydF9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX21wMnRfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX01QMlRfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBtcDRhZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzN2QyNQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmMKQEAgLTAsMCArMSw0NjYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gTm9raWEgQ29ycG9yYXRpb24gKGNvbnRhY3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4pCisgKiAgICAgICAgICAgICAgIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Yml0cmVhZGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdzdHJ0cG1wNGFkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cG1wNGFkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwbXA0YWRlcGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9tcDRhX2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8vbXBlZywiCisgICAgICAgICJtcGVndmVyc2lvbiA9IChpbnQpIDQsIiAiZnJhbWVkID0gKGJvb2xlYW4pIHsgZmFsc2UsIHRydWUgfSwgIgorICAgICAgICAic3RyZWFtLWZvcm1hdCA9IChzdHJpbmcpIHJhdyIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXA0YV9kZXBheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVggXSwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTVA0QS1MQVRNXCIiCisgICAgICAgIC8qIEFsbCBvcHRpb25hbCBwYXJhbWV0ZXJzCisgICAgICAgICAqCisgICAgICAgICAqICJwcm9maWxlLWxldmVsLWlkPVsxLE1BWF0iCisgICAgICAgICAqICJjb25maWc9IgorICAgICAgICAgKi8KKyAgICApCisgICAgKTsKKworI2RlZmluZSBnc3RfcnRwX21wNGFfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwTVA0QURlcGF5LCBnc3RfcnRwX21wNGFfZGVwYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9tcDRhX2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfbXA0YV9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfbXA0YV9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX21wNGFfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcDRhX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cE1QNEFEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfbXA0YV9kZXBheV9maW5hbGl6ZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX21wNGFfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfbXA0YV9kZXBheV9wcm9jZXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfbXA0YV9kZXBheV9zZXRjYXBzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXA0YV9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX21wNGFfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgTVBFRzQgYXVkaW8gZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIE1QRUc0IGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAzMDE2KSIsCisgICAgICAiTm9raWEgQ29ycG9yYXRpb24gKGNvbnRhY3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4pLCAiCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwbXA0YWRlcGF5X2RlYnVnLCAicnRwbXA0YWRlcGF5IiwgMCwKKyAgICAgICJNUEVHNCBhdWRpbyBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0YV9kZXBheV9pbml0IChHc3RSdHBNUDRBRGVwYXkgKiBydHBtcDRhZGVwYXkpCit7CisgIHJ0cG1wNGFkZXBheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKyAgcnRwbXA0YWRlcGF5LT5mcmFtZWQgPSBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0YV9kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwTVA0QURlcGF5ICpydHBtcDRhZGVwYXk7CisKKyAgcnRwbXA0YWRlcGF5ID0gR1NUX1JUUF9NUDRBX0RFUEFZIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChydHBtcDRhZGVwYXktPmFkYXB0ZXIpOworICBydHBtcDRhZGVwYXktPmFkYXB0ZXIgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGNvbnN0IGd1aW50IGFhY19zYW1wbGVfcmF0ZXNbXSA9IHsgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsCisgIDQ0MTAwLCAzMjAwMCwgMjQwMDAsIDIyMDUwLCAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwLCA3MzUwCit9OworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXA0YV9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdFJ0cE1QNEFEZXBheSAqcnRwbXA0YWRlcGF5OworICBHc3RDYXBzICpzcmNjYXBzOworICBjb25zdCBnY2hhciAqc3RyOworICBnaW50IGNsb2NrX3JhdGU7CisgIGdpbnQgb2JqZWN0X3R5cGU7CisgIGdpbnQgY2hhbm5lbHMgPSAyOyAgICAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgZ2Jvb2xlYW4gcmVzOworCisgIHJ0cG1wNGFkZXBheSA9IEdTVF9SVFBfTVA0QV9ERVBBWSAoZGVwYXlsb2FkKTsKKworICBydHBtcDRhZGVwYXktPmZyYW1lZCA9IEZBTFNFOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA5MDAwMDsgICAgICAgICAvKiBkZWZhdWx0ICovCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIm9iamVjdCIsICZvYmplY3RfdHlwZSkpCisgICAgb2JqZWN0X3R5cGUgPSAyOyAgICAgICAgICAgIC8qIEFBQyBMQyBkZWZhdWx0ICovCisKKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9tcGVnIiwKKyAgICAgICJtcGVndmVyc2lvbiIsIEdfVFlQRV9JTlQsIDQsCisgICAgICAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBjaGFubmVscywKKyAgICAgICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgInJhdyIsIE5VTEwpOworCisgIGlmICgoc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJjb25maWciKSkpIHsKKyAgICBHVmFsdWUgdiA9IHsgMCB9OworCisgICAgZ192YWx1ZV9pbml0ICgmdiwgR1NUX1RZUEVfQlVGRkVSKTsKKyAgICBpZiAoZ3N0X3ZhbHVlX2Rlc2VyaWFsaXplICgmdiwgc3RyKSkgeworICAgICAgR3N0QnVmZmVyICpidWZmZXI7CisgICAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICAgIGd1aW50OCAqZGF0YTsKKyAgICAgIGdzaXplIHNpemU7CisgICAgICBnaW50IGk7CisgICAgICBndWludDMyIHJhdGUgPSAwOworICAgICAgZ3VpbnQ4IG9ial90eXBlID0gMCwgc3JfaWR4ID0gMCwgY2hhbm5lbHMgPSAwOworICAgICAgR3N0Qml0UmVhZGVyIGJyOworCisgICAgICBidWZmZXIgPSBnc3RfdmFsdWVfZ2V0X2J1ZmZlciAoJnYpOworICAgICAgZ3N0X2J1ZmZlcl9yZWYgKGJ1ZmZlcik7CisgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisKKyAgICAgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICBkYXRhID0gbWFwLmRhdGE7CisgICAgICBzaXplID0gbWFwLnNpemU7CisKKyAgICAgIGlmIChzaXplIDwgMikgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgImNvbmZpZyB0b28gc2hvcnQgKCVkIDwgMikiLAorICAgICAgICAgICAgKGdpbnQpIHNpemUpOworICAgICAgICBnb3RvIGJhZF9jb25maWc7CisgICAgICB9CisKKyAgICAgIC8qIFBhcnNlIFN0cmVhbU11eENvbmZpZyBhY2NvcmRpbmcgdG8gSVNPL0lFQyAxNDQ5Ni0zOgorICAgICAgICoKKyAgICAgICAqIGF1ZGlvTXV4VmVyc2lvbiAgICAgICAgICAgPT0gMCAoMSBiaXQpCisgICAgICAgKiBhbGxTdHJlYW1zU2FtZVRpbWVGcmFtaW5nID09IDEgKDEgYml0KQorICAgICAgICogbnVtU3ViRnJhbWVzICAgICAgICAgICAgICA9PSBydHBtcDRhZGVwYXktPm51bVN1YkZyYW1lcyAoNiBiaXRzKQorICAgICAgICogbnVtUHJvZ3JhbSAgICAgICAgICAgICAgICA9PSAwICg0IGJpdHMpCisgICAgICAgKiBudW1MYXllciAgICAgICAgICAgICAgICAgID09IDAgKDMgYml0cykKKyAgICAgICAqCisgICAgICAgKiBXZSBvbmx5IHJlcXVpcmUgYXVkaW9NdXhWZXJzaW9uID09IDA7CisgICAgICAgKgorICAgICAgICogVGhlIHJlbWFpbmluZyBiaXQgb2YgdGhlIHNlY29uZCBieXRlIGFuZCB0aGUgcmVzdCBvZiB0aGUgYml0cyBhcmUgdXNlZAorICAgICAgICogZm9yIGF1ZGlvU3BlY2lmaWNDb25maWcgd2hpY2ggd2UgbmVlZCB0byBzZXQgaW4gY29kZWNfaW5mby4KKyAgICAgICAqLworICAgICAgaWYgKChkYXRhWzBdICYgMHg4MCkgIT0gMHgwMCkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgInVua25vd24gYXVkaW9NdXhWZXJzaW9uIDEiKTsKKyAgICAgICAgZ290byBiYWRfY29uZmlnOworICAgICAgfQorCisgICAgICBydHBtcDRhZGVwYXktPm51bVN1YkZyYW1lcyA9IChkYXRhWzBdICYgMHgzRik7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcDRhZGVwYXksICJudW1TdWJGcmFtZXMgJWQiLAorICAgICAgICAgIHJ0cG1wNGFkZXBheS0+bnVtU3ViRnJhbWVzKTsKKworICAgICAgLyogc2hpZnQgcmVzdCBvZiBzdHJpbmcgMTUgYml0cyBkb3duICovCisgICAgICBzaXplIC09IDI7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGRhdGFbaV0gPSAoKGRhdGFbaSArIDFdICYgMSkgPDwgNykgfCAoKGRhdGFbaSArIDJdICYgMHhmZSkgPj4gMSk7CisgICAgICB9CisKKyAgICAgIGdzdF9iaXRfcmVhZGVyX2luaXQgKCZiciwgZGF0YSwgc2l6ZSk7CisKKyAgICAgIC8qIGFueSBvYmplY3QgdHlwZSBpcyBmaW5lLCB3ZSBuZWVkIHRvIGNvcHkgaXQgdG8gdGhlIHByb2ZpbGUtbGV2ZWwtaWQgZmllbGQuICovCisgICAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmYnIsICZvYmpfdHlwZSwgNSkpCisgICAgICAgIGdvdG8gYmFkX2NvbmZpZzsKKyAgICAgIGlmIChvYmpfdHlwZSA9PSAwKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVwYXlsb2FkLCAiaW52YWxpZCBvYmplY3QgdHlwZSAwIik7CisgICAgICAgIGdvdG8gYmFkX2NvbmZpZzsKKyAgICAgIH0KKworICAgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoJmJyLCAmc3JfaWR4LCA0KSkKKyAgICAgICAgZ290byBiYWRfY29uZmlnOworICAgICAgaWYgKHNyX2lkeCA+PSBHX05fRUxFTUVOVFMgKGFhY19zYW1wbGVfcmF0ZXMpICYmIHNyX2lkeCAhPSAxNSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgImludmFsaWQgc2FtcGxlIHJhdGUgaW5kZXggJWQiLCBzcl9pZHgpOworICAgICAgICBnb3RvIGJhZF9jb25maWc7CisgICAgICB9CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwbXA0YWRlcGF5LCAic2FtcGxlIHJhdGUgaW5kZXggJXUiLCBzcl9pZHgpOworCisgICAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmYnIsICZjaGFubmVscywgNCkpCisgICAgICAgIGdvdG8gYmFkX2NvbmZpZzsKKyAgICAgIGlmIChjaGFubmVscyA+IDcpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZXBheWxvYWQsICJpbnZhbGlkIGNoYW5uZWxzICV1IiwgKGd1aW50KSBjaGFubmVscyk7CisgICAgICAgIGdvdG8gYmFkX2NvbmZpZzsKKyAgICAgIH0KKworICAgICAgLyogcnRwIHJhdGUgZGVwZW5kcyBvbiBzYW1wbGluZyByYXRlIG9mIHRoZSBhdWRpbyAqLworICAgICAgaWYgKHNyX2lkeCA9PSAxNSkgeworICAgICAgICAvKiBpbmRleCBvZiAxNSBtZWFucyB3ZSBnZXQgdGhlIHJhdGUgaW4gdGhlIG5leHQgMjQgYml0cyAqLworICAgICAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQzMiAoJmJyLCAmcmF0ZSwgMjQpKQorICAgICAgICAgIGdvdG8gYmFkX2NvbmZpZzsKKyAgICAgIH0gZWxzZSBpZiAoc3JfaWR4ID49IEdfTl9FTEVNRU5UUyAoYWFjX3NhbXBsZV9yYXRlcykpIHsKKyAgICAgICAgZ290byBiYWRfY29uZmlnOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZWxzZSB1c2UgdGhlIHJhdGUgZnJvbSB0aGUgdGFibGUgKi8KKyAgICAgICAgcmF0ZSA9IGFhY19zYW1wbGVfcmF0ZXNbc3JfaWR4XTsKKyAgICAgIH0KKworICAgICAgcnRwbXA0YWRlcGF5LT5mcmFtZV9sZW4gPSAxMDI0OworCisgICAgICBzd2l0Y2ggKG9ial90eXBlKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAyOgorICAgICAgICBjYXNlIDM6CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSA2OgorICAgICAgICBjYXNlIDc6CisgICAgICAgIHsKKyAgICAgICAgICBndWludDggZnJhbWVMZW5GbGFnID0gMDsKKworICAgICAgICAgIGlmIChnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoJmJyLCAmZnJhbWVMZW5GbGFnLCAxKSkKKyAgICAgICAgICAgIGlmIChmcmFtZUxlbkZsYWcpCisgICAgICAgICAgICAgIHJ0cG1wNGFkZXBheS0+ZnJhbWVfbGVuID0gOTYwOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8qIGlnbm9yZSByZW1haW5pbmcgYml0LCB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gZnVsbCBieXRlcyAqLworICAgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKGJ1ZmZlciwgMCwgc2l6ZSk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgICAgZGF0YSA9IE5VTEw7CisKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKHNyY2NhcHMsCisgICAgICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgKGdpbnQpIGNoYW5uZWxzLAorICAgICAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgKGdpbnQpIHJhdGUsCisgICAgICAgICAgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZmZlciwgTlVMTCk7CisgICAgYmFkX2NvbmZpZzoKKyAgICAgIGlmIChkYXRhKQorICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgZ193YXJuaW5nICgiY2Fubm90IGNvbnZlcnQgY29uZmlnIHRvIGJ1ZmZlciIpOworICAgIH0KKyAgfQorICByZXMgPSBnc3RfcGFkX3NldF9jYXBzIChkZXBheWxvYWQtPnNyY3BhZCwgc3JjY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfbXA0YV9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cE1QNEFEZXBheSAqcnRwbXA0YWRlcGF5OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgcnRwbXA0YWRlcGF5ID0gR1NUX1JUUF9NUDRBX0RFUEFZIChkZXBheWxvYWQpOworCisgIC8qIGZsdXNoIHJlbWFpbmluZyBkYXRhIG9uIGRpc2NvbnQgKi8KKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAocnRwLT5idWZmZXIpKSB7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cG1wNGFkZXBheS0+YWRhcHRlcik7CisgIH0KKworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9idWZmZXIgKHJ0cCk7CisKKyAgaWYgKCFydHBtcDRhZGVwYXktPmZyYW1lZCkgeworICAgIGlmIChnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApKSB7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICBydHBtcDRhZGVwYXktPmZyYW1lZCA9IFRSVUU7CisKKyAgICAgIGdzdF9ydHBfYmFzZV9kZXBheWxvYWRfcHVzaCAoZGVwYXlsb2FkLCBvdXRidWYpOworCisgICAgICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChkZXBheWxvYWQtPnNyY3BhZCk7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoY2Fwcyk7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiZnJhbWVkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAoZGVwYXlsb2FkLT5zcmNwYWQsIGNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBvdXRidWY7CisgICAgfQorICB9CisKKyAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChvdXRidWYpOworICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA9IEdTVF9CVUZGRVJfUFRTIChydHAtPmJ1ZmZlcik7CisgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cG1wNGFkZXBheS0+YWRhcHRlciwgb3V0YnVmKTsKKworICAvKiBSVFAgbWFya2VyIGJpdCBpbmRpY2F0ZXMgdGhlIGxhc3QgcGFja2V0IG9mIHRoZSBBdWRpb011eEVsZW1lbnQgPT4gY3JlYXRlCisgICAqIGFuZCBwdXNoIGEgYnVmZmVyICovCisgIGlmIChnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApKSB7CisgICAgZ3VpbnQgYXZhaWw7CisgICAgZ3VpbnQgaTsKKyAgICBndWludDggKmRhdGE7CisgICAgZ3VpbnQgcG9zOworICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisKKyAgICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwbXA0YWRlcGF5LT5hZGFwdGVyKTsKKyAgICB0aW1lc3RhbXAgPSBnc3RfYWRhcHRlcl9wcmV2X3B0cyAocnRwbXA0YWRlcGF5LT5hZGFwdGVyLCBOVUxMKTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcDRhZGVwYXksICJoYXZlIG1hcmtlciBhbmQgJXUgYXZhaWxhYmxlIiwgYXZhaWwpOworCisgICAgb3V0YnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHJ0cG1wNGFkZXBheS0+YWRhcHRlciwgYXZhaWwpOworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgZGF0YSA9IG1hcC5kYXRhOworICAgIC8qIHBvc2l0aW9uIGluIGRhdGEgd2UgYXJlIGF0ICovCisgICAgcG9zID0gMDsKKworICAgIC8qIGxvb3BpbmcgdGhyb3VnaCB0aGUgbnVtYmVyIG9mIHN1Yi1mcmFtZXMgaW4gdGhlIGF1ZGlvIHBheWxvYWQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDw9IHJ0cG1wNGFkZXBheS0+bnVtU3ViRnJhbWVzOyBpKyspIHsKKyAgICAgIC8qIGRldGVybWluZSBwYXlsb2FkIGxlbmd0aCBhbmQgc2V0IGJ1ZmZlciBkYXRhIHBvaW50ZXIgYWNjb3JkaW5nbHkgKi8KKyAgICAgIGd1aW50IHNraXA7CisgICAgICBndWludCBkYXRhX2xlbjsKKyAgICAgIEdzdEJ1ZmZlciAqdG1wID0gTlVMTDsKKworICAgICAgLyogZWFjaCBzdWJmcmFtZSBzdGFydHMgd2l0aCBhIHZhcmlhYmxlIGxlbmd0aCBlbmNvZGluZyAqLworICAgICAgZGF0YV9sZW4gPSAwOworICAgICAgZm9yIChza2lwID0gMDsgc2tpcCA8IGF2YWlsOyBza2lwKyspIHsKKyAgICAgICAgZGF0YV9sZW4gKz0gZGF0YVtza2lwXTsKKyAgICAgICAgaWYgKGRhdGFbc2tpcF0gIT0gMHhmZikKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHNraXArKzsKKworICAgICAgLyogdGhpcyBjYW4gbm90IGJlIHBvc3NpYmxlLCB3ZSBoYXZlIG5vdCBlbm91Z2ggZGF0YSBvciB0aGUgbGVuZ3RoCisgICAgICAgKiBkZWNvZGluZyBmYWlsZWQgYmVjYXVzZSB3ZSByYW4gb3V0IG9mIGRhdGEuICovCisgICAgICBpZiAoc2tpcCArIGRhdGFfbGVuID4gYXZhaWwpCisgICAgICAgIGdvdG8gd3Jvbmdfc2l6ZTsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cG1wNGFkZXBheSwKKyAgICAgICAgICAic3ViZnJhbWUgJXUsIGhlYWRlciBsZW4gJXUsIGRhdGEgbGVuICV1LCBsZWZ0ICV1IiwgaSwgc2tpcCwgZGF0YV9sZW4sCisgICAgICAgICAgYXZhaWwpOworCisgICAgICAvKiB0YWtlIGRhdGEgb3V0LCBza2lwIHRoZSBoZWFkZXIgKi8KKyAgICAgIHBvcyArPSBza2lwOworICAgICAgdG1wID0gZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAob3V0YnVmLCBHU1RfQlVGRkVSX0NPUFlfQUxMLCBwb3MsIGRhdGFfbGVuKTsKKworICAgICAgLyogc2tpcCBkYXRhIHRvbyAqLworICAgICAgc2tpcCArPSBkYXRhX2xlbjsKKyAgICAgIHBvcyArPSBkYXRhX2xlbjsKKworICAgICAgLyogdXBkYXRlIG91ciBwb2ludGVycyB3aGl0aCB3aGF0IHdlIGNvbnN1bWVkICovCisgICAgICBkYXRhICs9IHNraXA7CisgICAgICBhdmFpbCAtPSBza2lwOworCisgICAgICBHU1RfQlVGRkVSX1BUUyAodG1wKSA9IHRpbWVzdGFtcDsKKyAgICAgIGdzdF9ydHBfZHJvcF9ub25fYXVkaW9fbWV0YSAoZGVwYXlsb2FkLCB0bXApOworICAgICAgZ3N0X3J0cF9iYXNlX2RlcGF5bG9hZF9wdXNoIChkZXBheWxvYWQsIHRtcCk7CisKKyAgICAgIC8qIHNoaWZ0IHRzIGZvciBuZXh0IGJ1ZmZlcnMgKi8KKyAgICAgIGlmIChydHBtcDRhZGVwYXktPmZyYW1lX2xlbiAmJiB0aW1lc3RhbXAgIT0gLTEKKyAgICAgICAgICAmJiBkZXBheWxvYWQtPmNsb2NrX3JhdGUgIT0gMCkgeworICAgICAgICB0aW1lc3RhbXAgKz0KKyAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHJ0cG1wNGFkZXBheS0+ZnJhbWVfbGVuLCBHU1RfU0VDT05ELAorICAgICAgICAgICAgZGVwYXlsb2FkLT5jbG9ja19yYXRlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBqdXN0IGEgY2hlY2sgdGhhdCBsZW5ndGhzIG1hdGNoICovCisgICAgaWYgKGF2YWlsKSB7CisgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChkZXBheWxvYWQsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAgICgiUGFja2V0IGludmFsaWQiKSwgKCJOb3QgYWxsIHBheWxvYWQgY29uc3VtZWQ6ICIKKyAgICAgICAgICAgICAgInBvc3NpYmxlIHdyb25nbHkgZW5jb2RlZCBwYWNrZXQuIikpOworICAgIH0KKworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmKTsKKyAgfQorICByZXR1cm4gTlVMTDsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX3NpemU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBtcDRhZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIlBhY2tldCBkaWQgbm90IHZhbGlkYXRlIiksICgid3JvbmcgcGFja2V0IHNpemUiKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWYpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9tcDRhX2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UnRwTVA0QURlcGF5ICpydHBtcDRhZGVwYXk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBydHBtcDRhZGVwYXkgPSBHU1RfUlRQX01QNEFfREVQQVkgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRwbXA0YWRlcGF5LT5hZGFwdGVyKTsKKyAgICAgIHJ0cG1wNGFkZXBheS0+ZnJhbWVfbGVuID0gMDsKKyAgICAgIHJ0cG1wNGFkZXBheS0+bnVtU3ViRnJhbWVzID0gMDsKKyAgICAgIHJ0cG1wNGFkZXBheS0+ZnJhbWVkID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfbXA0YV9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cG1wNGFkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9NUDRBX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXA0YWRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZWFmNTYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG1wNGFkZXBheS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gTm9raWEgQ29ycG9yYXRpb24gKGNvbnRhY3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4pCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfTVA0QV9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX01QNEFfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX01QNEFfREVQQVkgXAorICAoZ3N0X3J0cF9tcDRhX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfTVA0QV9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9NUDRBX0RFUEFZLEdzdFJ0cE1QNEFEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfTVA0QV9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTVA0QV9ERVBBWSxHc3RSdHBNUDRBRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfTVA0QV9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9NUDRBX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUDRBX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUDRBX0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cE1QNEFEZXBheSBHc3RSdHBNUDRBRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTVA0QURlcGF5Q2xhc3MgR3N0UnRwTVA0QURlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTVA0QURlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBndWludDggbnVtU3ViRnJhbWVzOworICBndWludCBmcmFtZV9sZW47CisKKyAgZ2Jvb2xlYW4gZnJhbWVkOworfTsKKworc3RydWN0IF9Hc3RSdHBNUDRBRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9tcDRhX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9tcDRhX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX01QNEFfREVQQVlfSF9fICovCisKZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXA0YXBheS5jIGIvZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyMmRkZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXA0YXBheS5jCkBAIC0wLDAgKzEsNDYzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDg+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RydHBtcDRhcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwbXA0YXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwbXA0YXBheV9kZWJ1ZykKKworLyogRklYTUU6IGFkZCBmcmFtZWQ9KGJvb2xlYW4pdHJ1ZSBvbmNlIG91ciBlbmNvZGVycyBoYXZlIHRoaXMgZmllbGQgc2V0CisgKiBvbiB0aGVpciBvdXRwdXQgY2FwcyAqLworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXA0YV9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsICIKKyAgICAgICAgInN0cmVhbS1mb3JtYXQ9KHN0cmluZylyYXciKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX21wNGFfcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVggXSwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTVA0QS1MQVRNXCIiCisgICAgICAgIC8qIEFsbCBvcHRpb25hbCBwYXJhbWV0ZXJzCisgICAgICAgICAqCisgICAgICAgICAqICJjcHJlc2VudCA9IChzdHJpbmcpIFwiMFwiIgorICAgICAgICAgKiAiY29uZmlnPSIgCisgICAgICAgICAqLworICAgICkKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX21wNGFfcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfbXA0YV9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfbXA0YV9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKgorICAgIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKKyNkZWZpbmUgZ3N0X3J0cF9tcDRhX3BheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBNUDRBUGF5LCBnc3RfcnRwX21wNGFfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKQorCisgICAgIHN0YXRpYyB2b2lkIGdzdF9ydHBfbXA0YV9wYXlfY2xhc3NfaW5pdCAoR3N0UnRwTVA0QVBheUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzICpnc3RydHBiYXNlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX21wNGFfcGF5X2ZpbmFsaXplOworCisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfbXA0YV9wYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX21wNGFfcGF5X2hhbmRsZV9idWZmZXI7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcDRhX3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX21wNGFfcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIE1QRUc0IGF1ZGlvIHBheWxvYWRlciIsICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQgTVBFRzQgYXVkaW8gYXMgUlRQIHBhY2tldHMgKFJGQyAzMDE2KSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwbXA0YXBheV9kZWJ1ZywgInJ0cG1wNGFwYXkiLCAwLAorICAgICAgIk1QNEEtTEFUTSBSVFAgUGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wNGFfcGF5X2luaXQgKEdzdFJ0cE1QNEFQYXkgKiBydHBtcDRhcGF5KQoreworICBydHBtcDRhcGF5LT5yYXRlID0gOTAwMDA7CisgIHJ0cG1wNGFwYXktPnByb2ZpbGUgPSBnX3N0cmR1cCAoIjEiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0YV9wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cE1QNEFQYXkgKnJ0cG1wNGFwYXk7CisKKyAgcnRwbXA0YXBheSA9IEdTVF9SVFBfTVA0QV9QQVkgKG9iamVjdCk7CisKKyAgZ19mcmVlIChydHBtcDRhcGF5LT5wYXJhbXMpOworICBydHBtcDRhcGF5LT5wYXJhbXMgPSBOVUxMOworCisgIGlmIChydHBtcDRhcGF5LT5jb25maWcpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAocnRwbXA0YXBheS0+Y29uZmlnKTsKKyAgcnRwbXA0YXBheS0+Y29uZmlnID0gTlVMTDsKKworICBnX2ZyZWUgKHJ0cG1wNGFwYXktPnByb2ZpbGUpOworICBydHBtcDRhcGF5LT5wcm9maWxlID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2FtcGxpbmdfdGFibGVbMTZdID0geworICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsCisgIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAsIDczNTAsIDAsIDAsIDAKK307CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcDRhX3BheV9wYXJzZV9hdWRpb19jb25maWcgKEdzdFJ0cE1QNEFQYXkgKiBydHBtcDRhcGF5LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgc2l6ZTsKKyAgZ3VpbnQ4IG9iamVjdFR5cGU7CisgIGd1aW50OCBzYW1wbGluZ0lkeDsKKyAgZ3VpbnQ4IGNoYW5uZWxDZmc7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBzaXplID0gbWFwLnNpemU7CisKKyAgaWYgKHNpemUgPCAyKQorICAgIGdvdG8gdG9vX3Nob3J0OworCisgIC8qIGFueSBvYmplY3QgdHlwZSBpcyBmaW5lLCB3ZSBuZWVkIHRvIGNvcHkgaXQgdG8gdGhlIHByb2ZpbGUtbGV2ZWwtaWQgZmllbGQuICovCisgIG9iamVjdFR5cGUgPSAoZGF0YVswXSAmIDB4ZjgpID4+IDM7CisgIGlmIChvYmplY3RUeXBlID09IDApCisgICAgZ290byBpbnZhbGlkX29iamVjdDsKKworICBzYW1wbGluZ0lkeCA9ICgoZGF0YVswXSAmIDB4MDcpIDw8IDEpIHwgKChkYXRhWzFdICYgMHg4MCkgPj4gNyk7CisgIC8qIG9ubHkgZml4ZWQgdmFsdWVzIGZvciBub3cgKi8KKyAgaWYgKHNhbXBsaW5nSWR4ID4gMTIgJiYgc2FtcGxpbmdJZHggIT0gMTUpCisgICAgZ290byB3cm9uZ19mcmVxOworCisgIGNoYW5uZWxDZmcgPSAoKGRhdGFbMV0gJiAweDc4KSA+PiAzKTsKKyAgaWYgKGNoYW5uZWxDZmcgPiA3KQorICAgIGdvdG8gd3JvbmdfY2hhbm5lbHM7CisKKyAgLyogcnRwIHJhdGUgZGVwZW5kcyBvbiBzYW1wbGluZyByYXRlIG9mIHRoZSBhdWRpbyAqLworICBpZiAoc2FtcGxpbmdJZHggPT0gMTUpIHsKKyAgICBpZiAoc2l6ZSA8IDUpCisgICAgICBnb3RvIHRvb19zaG9ydDsKKworICAgIC8qIGluZGV4IG9mIDE1IG1lYW5zIHdlIGdldCB0aGUgcmF0ZSBpbiB0aGUgbmV4dCAyNCBiaXRzICovCisgICAgcnRwbXA0YXBheS0+cmF0ZSA9ICgoZGF0YVsxXSAmIDB4N2YpIDw8IDE3KSB8CisgICAgICAgICgoZGF0YVsyXSkgPDwgOSkgfCAoKGRhdGFbM10pIDw8IDEpIHwgKChkYXRhWzRdICYgMHg4MCkgPj4gNyk7CisgIH0gZWxzZSB7CisgICAgLyogZWxzZSB1c2UgdGhlIHJhdGUgZnJvbSB0aGUgdGFibGUgKi8KKyAgICBydHBtcDRhcGF5LT5yYXRlID0gc2FtcGxpbmdfdGFibGVbc2FtcGxpbmdJZHhdOworICB9CisgIC8qIGV4dHJhIHJ0cCBwYXJhbXMgY29udGFpbiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzICovCisgIGdfZnJlZSAocnRwbXA0YXBheS0+cGFyYW1zKTsKKyAgcnRwbXA0YXBheS0+cGFyYW1zID0gZ19zdHJkdXBfcHJpbnRmICgiJWQiLCBjaGFubmVsQ2ZnKTsKKyAgLyogYXVkaW8gc3RyZWFtIHR5cGUgKi8KKyAgcnRwbXA0YXBheS0+c3RyZWFtdHlwZSA9ICI1IjsKKyAgLyogcHJvZmlsZSAqLworICBnX2ZyZWUgKHJ0cG1wNGFwYXktPnByb2ZpbGUpOworICBydHBtcDRhcGF5LT5wcm9maWxlID0gZ19zdHJkdXBfcHJpbnRmICgiJWQiLCBvYmplY3RUeXBlKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRhcGF5LAorICAgICAgIm9iamVjdFR5cGU6ICVkLCBzYW1wbGluZ0lkeDogJWQgKCVkKSwgY2hhbm5lbENmZzogJWQiLCBvYmplY3RUeXBlLAorICAgICAgc2FtcGxpbmdJZHgsIHJ0cG1wNGFwYXktPnJhdGUsIGNoYW5uZWxDZmcpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1IgKi8KK3Rvb19zaG9ydDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChydHBtcDRhcGF5LCBTVFJFQU0sIEZPUk1BVCwKKyAgICAgICAgKE5VTEwpLAorICAgICAgICAoImNvbmZpZyBzdHJpbmcgdG9vIHNob3J0LCBleHBlY3RlZCAyIGJ5dGVzLCBnb3QgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICAgICAgICBzaXplKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfb2JqZWN0OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHJ0cG1wNGFwYXksIFNUUkVBTSwgRk9STUFULAorICAgICAgICAoTlVMTCksICgiaW52YWxpZCBvYmplY3QgdHlwZSAwIikpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ19mcmVxOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHJ0cG1wNGFwYXksIFNUUkVBTSwgTk9UX0lNUExFTUVOVEVELAorICAgICAgICAoTlVMTCksICgidW5zdXBwb3J0ZWQgZnJlcXVlbmN5IGluZGV4ICVkIiwgc2FtcGxpbmdJZHgpKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIHJldHVybiBGQUxTRTsKKyAgfQord3JvbmdfY2hhbm5lbHM6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocnRwbXA0YXBheSwgU1RSRUFNLCBOT1RfSU1QTEVNRU5URUQsCisgICAgICAgIChOVUxMKSwgKCJ1bnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHMgJWQsIG11c3QgPCA4IiwgY2hhbm5lbENmZykpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcDRhX3BheV9uZXdfY2FwcyAoR3N0UnRwTVA0QVBheSAqIHJ0cG1wNGFwYXkpCit7CisgIGdjaGFyICpjb25maWc7CisgIEdWYWx1ZSB2ID0geyAwIH07CisgIGdib29sZWFuIHJlczsKKworICBnX3ZhbHVlX2luaXQgKCZ2LCBHU1RfVFlQRV9CVUZGRVIpOworICBnc3RfdmFsdWVfc2V0X2J1ZmZlciAoJnYsIHJ0cG1wNGFwYXktPmNvbmZpZyk7CisgIGNvbmZpZyA9IGdzdF92YWx1ZV9zZXJpYWxpemUgKCZ2KTsKKworICByZXMgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAoR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cG1wNGFwYXkpLAorICAgICAgImNwcmVzZW50IiwgR19UWVBFX1NUUklORywgIjAiLCAiY29uZmlnIiwgR19UWVBFX1NUUklORywgY29uZmlnLCBOVUxMKTsKKworICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisgIGdfZnJlZSAoY29uZmlnKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXA0YV9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UnRwTVA0QVBheSAqcnRwbXA0YXBheTsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IEdWYWx1ZSAqY29kZWNfZGF0YTsKKyAgZ2Jvb2xlYW4gcmVzLCBmcmFtZWQgPSBUUlVFOworICBjb25zdCBnY2hhciAqc3RyZWFtX2Zvcm1hdDsKKworICBydHBtcDRhcGF5ID0gR1NUX1JUUF9NUDRBX1BBWSAocGF5bG9hZCk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgLyogdGhpcyBpcyBhbHJlYWR5IGhhbmRsZWQgYnkgdGhlIHRlbXBsYXRlIGNhcHMsIGJ1dCBpdCBpcyBiZXR0ZXIKKyAgICogdG8gbGVhdmUgaGVyZSB0byBoYXZlIG1lYW5pbmdmdWwgd2FybmluZyBtZXNzYWdlcyB3aGVuIGxpbmtpbmcKKyAgICogZmFpbHMgKi8KKyAgc3RyZWFtX2Zvcm1hdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAic3RyZWFtLWZvcm1hdCIpOworICBpZiAoc3RyZWFtX2Zvcm1hdCkgeworICAgIGlmIChzdHJjbXAgKHN0cmVhbV9mb3JtYXQsICJyYXciKSAhPSAwKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cG1wNGFwYXksICJBQUMncyBzdHJlYW0tZm9ybWF0IG11c3QgYmUgJ3JhdycsICIKKyAgICAgICAgICAiJXMgaXMgbm90IHN1cHBvcnRlZCIsIHN0cmVhbV9mb3JtYXQpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cG1wNGFwYXksICJBQUMncyBzdHJlYW0tZm9ybWF0IG5vdCBzcGVjaWZpZWQsICIKKyAgICAgICAgImFzc3VtaW5nICdyYXcnIik7CisgIH0KKworICBjb2RlY19kYXRhID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImNvZGVjX2RhdGEiKTsKKyAgaWYgKGNvZGVjX2RhdGEpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocnRwbXA0YXBheSwgImdvdCBjb2RlY19kYXRhIik7CisgICAgaWYgKEdfVkFMVUVfVFlQRSAoY29kZWNfZGF0YSkgPT0gR1NUX1RZUEVfQlVGRkVSKSB7CisgICAgICBHc3RCdWZmZXIgKmJ1ZmZlciwgKmNidWZmZXI7CisgICAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICAgIEdzdE1hcEluZm8gY21hcDsKKyAgICAgIGd1aW50IGk7CisKKyAgICAgIGJ1ZmZlciA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyIChjb2RlY19kYXRhKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcDRhcGF5LCAiY29uZmlndXJpbmcgY29kZWNfZGF0YSIpOworCisgICAgICAvKiBwYXJzZSBidWZmZXIgKi8KKyAgICAgIHJlcyA9IGdzdF9ydHBfbXA0YV9wYXlfcGFyc2VfYXVkaW9fY29uZmlnIChydHBtcDRhcGF5LCBidWZmZXIpOworCisgICAgICBpZiAoIXJlcykKKyAgICAgICAgZ290byBjb25maWdfZmFpbGVkOworCisgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgICAgICAvKiBtYWtlIHRoZSBTdHJlYW1NdXhDb25maWcsIHdlIG5lZWQgMTUgYml0cyBmb3IgdGhlIGhlYWRlciAqLworICAgICAgY2J1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobWFwLnNpemUgKyAyKTsKKyAgICAgIGdzdF9idWZmZXJfbWFwIChjYnVmZmVyLCAmY21hcCwgR1NUX01BUF9XUklURSk7CisKKyAgICAgIG1lbXNldCAoY21hcC5kYXRhLCAwLCBtYXAuc2l6ZSArIDIpOworCisgICAgICAvKiBDcmVhdGUgU3RyZWFtTXV4Q29uZmlnIGFjY29yZGluZyB0byBJU08vSUVDIDE0NDk2LTM6CisgICAgICAgKgorICAgICAgICogYXVkaW9NdXhWZXJzaW9uICAgICAgICAgICA9PSAwICgxIGJpdCkKKyAgICAgICAqIGFsbFN0cmVhbXNTYW1lVGltZUZyYW1pbmcgPT0gMSAoMSBiaXQpCisgICAgICAgKiBudW1TdWJGcmFtZXMgICAgICAgICAgICAgID09IG51bVN1YkZyYW1lcyAoNiBiaXRzKQorICAgICAgICogbnVtUHJvZ3JhbSAgICAgICAgICAgICAgICA9PSAwICg0IGJpdHMpCisgICAgICAgKiBudW1MYXllciAgICAgICAgICAgICAgICAgID09IDAgKDMgYml0cykKKyAgICAgICAqLworICAgICAgY21hcC5kYXRhWzBdID0gMHg0MDsKKyAgICAgIGNtYXAuZGF0YVsxXSA9IDB4MDA7CisKKyAgICAgIC8qIGFwcGVuZCB0aGUgY29uZmlnIGJpdHMsIHNoaWZ0aW5nIHRoZW0gMSBiaXQgbGVmdCAqLworICAgICAgZm9yIChpID0gMDsgaSA8IG1hcC5zaXplOyBpKyspIHsKKyAgICAgICAgY21hcC5kYXRhW2kgKyAxXSB8PSAoKG1hcC5kYXRhW2ldICYgMHg4MCkgPj4gNyk7CisgICAgICAgIGNtYXAuZGF0YVtpICsgMl0gfD0gKChtYXAuZGF0YVtpXSAmIDB4N2YpIDw8IDEpOworICAgICAgfQorCisgICAgICBnc3RfYnVmZmVyX3VubWFwIChjYnVmZmVyLCAmY21hcCk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgICAgICAvKiBub3cgd2UgY2FuIGNvbmZpZ3VyZSB0aGUgYnVmZmVyICovCisgICAgICBpZiAocnRwbXA0YXBheS0+Y29uZmlnKQorICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChydHBtcDRhcGF5LT5jb25maWcpOworICAgICAgcnRwbXA0YXBheS0+Y29uZmlnID0gY2J1ZmZlcjsKKyAgICB9CisgIH0KKworICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfYm9vbGVhbiAoc3RydWN0dXJlLCAiZnJhbWVkIiwgJmZyYW1lZCkgJiYgIWZyYW1lZCkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocGF5bG9hZCwgIk5lZWQgZnJhbWVkIEFBQyBkYXRhIGFzIGlucHV0ISIpOworICB9CisKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHBheWxvYWQsICJhdWRpbyIsIFRSVUUsICJNUDRBLUxBVE0iLAorICAgICAgcnRwbXA0YXBheS0+cmF0ZSk7CisKKyAgcmVzID0gZ3N0X3J0cF9tcDRhX3BheV9uZXdfY2FwcyAocnRwbXA0YXBheSk7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK2NvbmZpZ19mYWlsZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRhcGF5LCAiZmFpbGVkIHRvIHBhcnNlIGNvbmZpZyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisjZGVmaW5lIFJUUF9IRUFERVJfTEVOIDEyCisKKy8qIHdlIGV4cGVjdCBidWZmZXJzIGFzIGV4YWN0bHkgb25lIGNvbXBsZXRlIEFVCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX21wNGFfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBNUDRBUGF5ICpydHBtcDRhcGF5OworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdDsKKyAgZ3VpbnQgbXR1OworICBndWludCBvZmZzZXQ7CisgIGdzaXplIHNpemU7CisgIGdib29sZWFuIGZyYWdtZW50ZWQ7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisKKyAgcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgcnRwbXA0YXBheSA9IEdTVF9SVFBfTVA0QV9QQVkgKGJhc2VwYXlsb2FkKTsKKworICBvZmZzZXQgPSAwOworICBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKworICBmcmFnbWVudGVkID0gRkFMU0U7CisgIG10dSA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX01UVSAocnRwbXA0YXBheSk7CisKKyAgbGlzdCA9IGdzdF9idWZmZXJfbGlzdF9uZXdfc2l6ZWQgKHNpemUgLyAobXR1IC0gUlRQX0hFQURFUl9MRU4pICsgMSk7CisKKyAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgZ3VpbnQgdG93cml0ZTsKKyAgICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgICBndWludCBwYXlsb2FkX2xlbjsKKyAgICBndWludCBwYWNrZXRfbGVuOworICAgIGd1aW50IGhlYWRlcl9sZW47CisgICAgR3N0QnVmZmVyICpwYXlidWY7CisgICAgR3N0UlRQQnVmZmVyIHJ0cCA9IHsgTlVMTCB9OworCisgICAgaGVhZGVyX2xlbiA9IDA7CisgICAgaWYgKCFmcmFnbWVudGVkKSB7CisgICAgICBndWludCBjb3VudDsKKyAgICAgIC8qIGZpcnN0IHBhY2tldCBjYWxjdWxhdGUgc3BhY2UgZm9yIHRoZSBwYWNrZXQgaW5jbHVkaW5nIHRoZSBoZWFkZXIgKi8KKyAgICAgIGNvdW50ID0gc2l6ZTsKKyAgICAgIHdoaWxlIChjb3VudCA+PSAweGZmKSB7CisgICAgICAgIGhlYWRlcl9sZW4rKzsKKyAgICAgICAgY291bnQgLT0gMHhmZjsKKyAgICAgIH0KKyAgICAgIGhlYWRlcl9sZW4rKzsKKyAgICB9CisKKyAgICBwYWNrZXRfbGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYWNrZXRfbGVuIChoZWFkZXJfbGVuICsgc2l6ZSwgMCwgMCk7CisgICAgdG93cml0ZSA9IE1JTiAocGFja2V0X2xlbiwgbXR1KTsKKyAgICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2NhbGNfcGF5bG9hZF9sZW4gKHRvd3JpdGUsIDAsIDApOworICAgIHBheWxvYWRfbGVuIC09IGhlYWRlcl9sZW47CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRhcGF5LAorICAgICAgICAiYXZhaWwgJSIgR19HU0laRV9GT1JNQVQKKyAgICAgICAgIiwgaGVhZGVyX2xlbiAlZCwgcGFja2V0X2xlbiAlZCwgcGF5bG9hZF9sZW4gJWQiLCBzaXplLCBoZWFkZXJfbGVuLAorICAgICAgICBwYWNrZXRfbGVuLCBwYXlsb2FkX2xlbik7CisKKyAgICAvKiBjcmVhdGUgYnVmZmVyIHRvIGhvbGQgdGhlIHBheWxvYWQuICovCisgICAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChoZWFkZXJfbGVuLCAwLCAwKTsKKworICAgIC8qIGNvcHkgcGF5bG9hZCAqLworICAgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0YnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKworICAgIGlmICghZnJhZ21lbnRlZCkgeworICAgICAgZ3VpbnQ4ICpwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApOworICAgICAgZ3VpbnQgY291bnQ7CisKKyAgICAgIC8qIGZpcnN0IHBhY2tldCB3cml0ZSB0aGUgaGVhZGVyICovCisgICAgICBjb3VudCA9IHNpemU7CisgICAgICB3aGlsZSAoY291bnQgPj0gMHhmZikgeworICAgICAgICAqcGF5bG9hZCsrID0gMHhmZjsKKyAgICAgICAgY291bnQgLT0gMHhmZjsKKyAgICAgIH0KKyAgICAgICpwYXlsb2FkKysgPSBjb3VudDsKKyAgICB9CisKKyAgICAvKiBtYXJrZXIgb25seSBpZiB0aGUgcGFja2V0IGlzIGNvbXBsZXRlICovCisgICAgZ3N0X3J0cF9idWZmZXJfc2V0X21hcmtlciAoJnJ0cCwgc2l6ZSA9PSBwYXlsb2FkX2xlbik7CisKKyAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgICAvKiBjcmVhdGUgYSBuZXcgYnVmIHRvIGhvbGQgdGhlIHBheWxvYWQgKi8KKyAgICBwYXlidWYgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsCisgICAgICAgIG9mZnNldCwgcGF5bG9hZF9sZW4pOworCisgICAgLyogam9pbiBtZW1vcnkgcGFydHMgKi8KKyAgICBnc3RfcnRwX2NvcHlfYXVkaW9fbWV0YSAocnRwbXA0YXBheSwgb3V0YnVmLCBwYXlidWYpOworICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfYXBwZW5kIChvdXRidWYsIHBheWJ1Zik7CisgICAgZ3N0X2J1ZmZlcl9saXN0X2FkZCAobGlzdCwgb3V0YnVmKTsKKyAgICBvZmZzZXQgKz0gcGF5bG9hZF9sZW47CisgICAgc2l6ZSAtPSBwYXlsb2FkX2xlbjsKKworICAgIC8qIGNvcHkgaW5jb21taW5nIHRpbWVzdGFtcCAoaWYgYW55KSB0byBvdXRnb2luZyBidWZmZXJzICovCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSB0aW1lc3RhbXA7CisKKyAgICBmcmFnbWVudGVkID0gVFJVRTsKKyAgfQorCisgIHJldCA9CisgICAgICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoX2xpc3QgKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBtcDRhcGF5KSwgbGlzdCk7CisKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9tcDRhX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cG1wNGFwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfTVA0QV9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmggYi9nc3QvcnRwL2dzdHJ0cG1wNGFwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWQ5YjY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBtcDRhcGF5LmgKQEAgLTAsMCArMSw2NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX01QNEFfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfTVA0QV9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9NUDRBX1BBWSBcCisgIChnc3RfcnRwX21wNGFfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfTVA0QV9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfTVA0QV9QQVksR3N0UnRwTVA0QVBheSkpCisjZGVmaW5lIEdTVF9SVFBfTVA0QV9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX01QNEFfUEFZLEdzdFJ0cE1QNEFQYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfTVA0QV9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfTVA0QV9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QNEFfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUDRBX1BBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBNUDRBUGF5IEdzdFJ0cE1QNEFQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTVA0QVBheUNsYXNzIEdzdFJ0cE1QNEFQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBNUDRBUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkICAgIHBheWxvYWQ7CisKKyAgZ2ludCAgICAgICAgICByYXRlOworICBnY2hhciAgICAgICAgKnBhcmFtczsKKyAgZ2NoYXIgICAgICAgICpwcm9maWxlOworICBjb25zdCBnY2hhciAgKnN0cmVhbXR5cGU7CisgIEdzdEJ1ZmZlciAgICAqY29uZmlnOworfTsKKworc3RydWN0IF9Hc3RSdHBNUDRBUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX21wNGFfcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9tcDRhX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9NUDRBX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXA0Z2RlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZDkxYzQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5jCkBAIC0wLDAgKzEsNzg5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCisjaW5jbHVkZSAiZ3N0cnRwbXA0Z2RlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwbXA0Z2RlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBtcDRnZGVwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX21wNGdfZGVwYXlfc3JjX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8vbXBlZywiCisgICAgICAgICJtcGVndmVyc2lvbj0oaW50KSA0LCIKKyAgICAgICAgInN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZTsiCisgICAgICAgICJhdWRpby9tcGVnLCIgIm1wZWd2ZXJzaW9uPShpbnQpIDQsICIgInN0cmVhbS1mb3JtYXQ9KHN0cmluZylyYXciKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX21wNGdfZGVwYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSB7IFwidmlkZW9cIiwgXCJhdWRpb1wiLCBcImFwcGxpY2F0aW9uXCIgfSwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVggXSwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTVBFRzQtR0VORVJJQ1wiLCAiCisgICAgICAgIC8qIHJlcXVpcmVkIHN0cmluZyBwYXJhbXMgKi8KKyAgICAgICAgLyogInN0cmVhbXR5cGUgPSAoc3RyaW5nKSB7IFwiNFwiLCBcIjVcIiB9LCAiICBOb3Qgc2V0IGJ5IFdvd3phICAgIDQgPSB2aWRlbywgNSA9IGF1ZGlvICovCisgICAgICAgIC8qICJwcm9maWxlLWxldmVsLWlkID0gKHN0cmluZykgWzEsTUFYXSwgIiAqLworICAgICAgICAvKiAiY29uZmlnID0gKHN0cmluZykgWzEsTUFYXSIgKi8KKyAgICAgICAgIm1vZGUgPSAoc3RyaW5nKSB7IFwiZ2VuZXJpY1wiLCBcIkNFTFAtY2JyXCIsIFwiQ0VMUC12YnJcIiwgXCJBQUMtbGJyXCIsIFwiQUFDLWhiclwiIH0gIgorICAgICAgICAvKiBPcHRpb25hbCBnZW5lcmFsIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgLyogIm9iamVjdHR5cGUgPSAoc3RyaW5nKSBbMSxNQVhdLCAiICovCisgICAgICAgIC8qICJjb25zdGFudHNpemUgPSAoc3RyaW5nKSBbMSxNQVhdLCAiICovLyogY29uc3RhbnQgc2l6ZSBvZiBlYWNoIEFVICovCisgICAgICAgIC8qICJjb25zdGFudGR1cmF0aW9uID0gKHN0cmluZykgWzEsTUFYXSwgIiAqLy8qIGNvbnN0YW50IGR1cmF0aW9uIG9mIGVhY2ggQVUgKi8KKyAgICAgICAgLyogIm1heGRpc3BsYWNlbWVudCA9IChzdHJpbmcpIFsxLE1BWF0sICIgKi8KKyAgICAgICAgLyogImRlLWludGVybGVhdmVidWZmZXJzaXplID0gKHN0cmluZykgWzEsTUFYXSwgIiAqLworICAgICAgICAvKiBPcHRpb25hbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgLyogInNpemVsZW5ndGggPSAoc3RyaW5nKSBbMSwgMzJdLCAiICovCisgICAgICAgIC8qICJpbmRleGxlbmd0aCA9IChzdHJpbmcpIFsxLCAzMl0sICIgKi8KKyAgICAgICAgLyogImluZGV4ZGVsdGFsZW5ndGggPSAoc3RyaW5nKSBbMSwgMzJdLCAiICovCisgICAgICAgIC8qICJjdHNkZWx0YWxlbmd0aCA9IChzdHJpbmcpIFsxLCAzMl0sICIgKi8KKyAgICAgICAgLyogImR0c2RlbHRhbGVuZ3RoID0gKHN0cmluZykgWzEsIDMyXSwgIiAqLworICAgICAgICAvKiAicmFuZG9tYWNjZXNzaW5kaWNhdGlvbiA9IChzdHJpbmcpIHswLCAxfSwgIiAqLworICAgICAgICAvKiAic3RyZWFtc3RhdGVpbmRpY2F0aW9uID0gKHN0cmluZykgWzAsIDMyXSwgIiAqLworICAgICAgICAvKiAiYXV4aWxpYXJ5ZGF0YXNpemVsZW5ndGggPSAoc3RyaW5nKSBbMCwgMzJdIiAqLyApCisgICAgKTsKKworLyogc2ltcGxlIGJpdHN0cmVhbSBwYXJzZXIgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGd1aW50OCAqZGF0YTsKKyAgY29uc3QgZ3VpbnQ4ICplbmQ7CisgIGdpbnQgaGVhZDsgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyBpbiB0aGUgY2FjaGUgb2YgbmV4dCBiaXQgKi8KKyAgZ3VpbnQ2NCBjYWNoZTsgICAgICAgICAgICAgICAgLyogY2FjaGVkIGJ5dGVzICovCit9IEdzdEJzUGFyc2U7CisKK3N0YXRpYyB2b2lkCitnc3RfYnNfcGFyc2VfaW5pdCAoR3N0QnNQYXJzZSAqIGJzLCBjb25zdCBndWludDggKiBkYXRhLCBndWludCBzaXplKQoreworICBicy0+ZGF0YSA9IGRhdGE7CisgIGJzLT5lbmQgPSBkYXRhICsgc2l6ZTsKKyAgYnMtPmhlYWQgPSAwOworICBicy0+Y2FjaGUgPSAweGZmZmZmZmZmOworfQorCitzdGF0aWMgZ3VpbnQzMgorZ3N0X2JzX3BhcnNlX3JlYWQgKEdzdEJzUGFyc2UgKiBicywgZ3VpbnQgbikKK3sKKyAgZ3VpbnQzMiByZXMgPSAwOworICBnaW50IHNoaWZ0OworCisgIGlmIChuID09IDApCisgICAgcmV0dXJuIHJlczsKKworICAvKiBmaWxsIHVwIHRoZSBjYWNoZSBpZiB3ZSBuZWVkIHRvICovCisgIHdoaWxlIChicy0+aGVhZCA8IG4pIHsKKyAgICBpZiAoYnMtPmRhdGEgPj0gYnMtPmVuZCkgeworICAgICAgLyogd2UncmUgYXQgdGhlIGVuZCwgY2FuJ3QgcHJvZHVjZSBtb3JlIHRoYW4gaGVhZCBudW1iZXIgb2YgYml0cyAqLworICAgICAgbiA9IGJzLT5oZWFkOworICAgICAgYnJlYWs7CisgICAgfQorICAgIC8qIHNoaWZ0IGJ5dGVzIGluIGNhY2hlLCBtb3ZpbmcgdGhlIGhlYWQgYml0cyBvZiB0aGUgY2FjaGUgbGVmdCAqLworICAgIGJzLT5jYWNoZSA9IChicy0+Y2FjaGUgPDwgOCkgfCAqYnMtPmRhdGErKzsKKyAgICBicy0+aGVhZCArPSA4OworICB9CisKKyAgLyogYnJpbmcgdGhlIHJlcXVpcmVkIGJpdHMgZG93biBhbmQgdHJ1bmNhdGUgKi8KKyAgaWYgKChzaGlmdCA9IGJzLT5oZWFkIC0gbikgPiAwKQorICAgIHJlcyA9IGJzLT5jYWNoZSA+PiBzaGlmdDsKKyAgZWxzZQorICAgIHJlcyA9IGJzLT5jYWNoZTsKKworICAvKiBtYXNrIG91dCByZXF1aXJlZCBiaXRzICovCisgIGlmIChuIDwgMzIpCisgICAgcmVzICY9ICgxIDw8IG4pIC0gMTsKKworICBicy0+aGVhZCA9IHNoaWZ0OworCisgIHJldHVybiByZXM7Cit9CisKKworI2RlZmluZSBnc3RfcnRwX21wNGdfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwTVA0R0RlcGF5LCBnc3RfcnRwX21wNGdfZGVwYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9tcDRnX2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfbXA0Z19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfbXA0Z19kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tcDRnX2RlcGF5X2hhbmRsZV9ldmVudCAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGZpbHRlciwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfbXA0Z19kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKgorICAgIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wNGdfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UnRwTVA0R0RlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9tcDRnX2RlcGF5X2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfbXA0Z19kZXBheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+cHJvY2Vzc19ydHBfcGFja2V0ID0gZ3N0X3J0cF9tcDRnX2RlcGF5X3Byb2Nlc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9tcDRnX2RlcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9ldmVudCA9IGdzdF9ydHBfbXA0Z19kZXBheV9oYW5kbGVfZXZlbnQ7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcDRnX2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXA0Z19kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBNUEVHNCBFUyBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgTVBFRzQgZWxlbWVudGFyeSBzdHJlYW1zIGZyb20gUlRQIHBhY2tldHMgKFJGQyAzNjQwKSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwbXA0Z2RlcGF5X2RlYnVnLCAicnRwbXA0Z2RlcGF5IiwgMCwKKyAgICAgICJNUDQtZ2VuZXJpYyBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0Z19kZXBheV9pbml0IChHc3RSdHBNUDRHRGVwYXkgKiBydHBtcDRnZGVwYXkpCit7CisgIHJ0cG1wNGdkZXBheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKyAgcnRwbXA0Z2RlcGF5LT5wYWNrZXRzID0gZ19xdWV1ZV9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wNGdfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cE1QNEdEZXBheSAqcnRwbXA0Z2RlcGF5OworCisgIHJ0cG1wNGdkZXBheSA9IEdTVF9SVFBfTVA0R19ERVBBWSAob2JqZWN0KTsKKworICBnX29iamVjdF91bnJlZiAocnRwbXA0Z2RlcGF5LT5hZGFwdGVyKTsKKyAgcnRwbXA0Z2RlcGF5LT5hZGFwdGVyID0gTlVMTDsKKyAgZ19xdWV1ZV9mcmVlIChydHBtcDRnZGVwYXktPnBhY2tldHMpOworICBydHBtcDRnZGVwYXktPnBhY2tldHMgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIGdpbnQKK2dzdF9ydHBfbXA0Z19kZXBheV9wYXJzZV9pbnQgKEdzdFN0cnVjdHVyZSAqIHN0cnVjdHVyZSwgY29uc3QgZ2NoYXIgKiBmaWVsZCwKKyAgICBnaW50IGRlZikKK3sKKyAgY29uc3QgZ2NoYXIgKnN0cjsKKyAgZ2ludCByZXM7CisKKyAgaWYgKChzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgZmllbGQpKSkKKyAgICByZXR1cm4gYXRvaSAoc3RyKTsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsIGZpZWxkLCAmcmVzKSkKKyAgICByZXR1cm4gcmVzOworCisgIHJldHVybiBkZWY7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcDRnX2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR3N0UnRwTVA0R0RlcGF5ICpydHBtcDRnZGVwYXk7CisgIEdzdENhcHMgKnNyY2NhcHMgPSBOVUxMOworICBjb25zdCBnY2hhciAqc3RyOworICBnaW50IGNsb2NrX3JhdGU7CisgIGdpbnQgc29tZWludDsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHJ0cG1wNGdkZXBheSA9IEdTVF9SVFBfTVA0R19ERVBBWSAoZGVwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBjbG9ja19yYXRlID0gOTAwMDA7ICAgICAgICAgLyogZGVmYXVsdCAqLworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIGlmICgoc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJtZWRpYSIpKSkgeworICAgIGlmIChzdHJjbXAgKHN0ciwgImF1ZGlvIikgPT0gMCkgeworICAgICAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9tcGVnIiwKKyAgICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCA0LCAic3RyZWFtLWZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJyYXciLAorICAgICAgICAgIE5VTEwpOworICAgIH0gZWxzZSBpZiAoc3RyY21wIChzdHIsICJ2aWRlbyIpID09IDApIHsKKyAgICAgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8vbXBlZyIsCisgICAgICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgNCwKKyAgICAgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICB9CisgIH0KKyAgaWYgKHNyY2NhcHMgPT0gTlVMTCkKKyAgICBnb3RvIHVua25vd25fbWVkaWE7CisKKyAgLyogdGhlc2UgdmFsdWVzIGFyZSBvcHRpb25hbCBhbmQgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgb2YgMCAobm8gaGVhZGVyKSAqLworICBydHBtcDRnZGVwYXktPnNpemVsZW5ndGggPQorICAgICAgZ3N0X3J0cF9tcDRnX2RlcGF5X3BhcnNlX2ludCAoc3RydWN0dXJlLCAic2l6ZWxlbmd0aCIsIDApOworICBydHBtcDRnZGVwYXktPmluZGV4bGVuZ3RoID0KKyAgICAgIGdzdF9ydHBfbXA0Z19kZXBheV9wYXJzZV9pbnQgKHN0cnVjdHVyZSwgImluZGV4bGVuZ3RoIiwgMCk7CisgIHJ0cG1wNGdkZXBheS0+aW5kZXhkZWx0YWxlbmd0aCA9CisgICAgICBnc3RfcnRwX21wNGdfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJpbmRleGRlbHRhbGVuZ3RoIiwgMCk7CisgIHJ0cG1wNGdkZXBheS0+Y3RzZGVsdGFsZW5ndGggPQorICAgICAgZ3N0X3J0cF9tcDRnX2RlcGF5X3BhcnNlX2ludCAoc3RydWN0dXJlLCAiY3RzZGVsdGFsZW5ndGgiLCAwKTsKKyAgcnRwbXA0Z2RlcGF5LT5kdHNkZWx0YWxlbmd0aCA9CisgICAgICBnc3RfcnRwX21wNGdfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJkdHNkZWx0YWxlbmd0aCIsIDApOworICBzb21laW50ID0KKyAgICAgIGdzdF9ydHBfbXA0Z19kZXBheV9wYXJzZV9pbnQgKHN0cnVjdHVyZSwgInJhbmRvbWFjY2Vzc2luZGljYXRpb24iLCAwKTsKKyAgcnRwbXA0Z2RlcGF5LT5yYW5kb21hY2Nlc3NpbmRpY2F0aW9uID0gc29tZWludCA+IDAgPyAxIDogMDsKKyAgcnRwbXA0Z2RlcGF5LT5zdHJlYW1zdGF0ZWluZGljYXRpb24gPQorICAgICAgZ3N0X3J0cF9tcDRnX2RlcGF5X3BhcnNlX2ludCAoc3RydWN0dXJlLCAic3RyZWFtc3RhdGVpbmRpY2F0aW9uIiwgMCk7CisgIHJ0cG1wNGdkZXBheS0+YXV4aWxpYXJ5ZGF0YXNpemVsZW5ndGggPQorICAgICAgZ3N0X3J0cF9tcDRnX2RlcGF5X3BhcnNlX2ludCAoc3RydWN0dXJlLCAiYXV4aWxpYXJ5ZGF0YXNpemVsZW5ndGgiLCAwKTsKKyAgcnRwbXA0Z2RlcGF5LT5jb25zdGFudFNpemUgPQorICAgICAgZ3N0X3J0cF9tcDRnX2RlcGF5X3BhcnNlX2ludCAoc3RydWN0dXJlLCAiY29uc3RhbnRzaXplIiwgMCk7CisgIHJ0cG1wNGdkZXBheS0+Y29uc3RhbnREdXJhdGlvbiA9CisgICAgICBnc3RfcnRwX21wNGdfZGVwYXlfcGFyc2VfaW50IChzdHJ1Y3R1cmUsICJjb25zdGFudGR1cmF0aW9uIiwgMCk7CisgIHJ0cG1wNGdkZXBheS0+bWF4RGlzcGxhY2VtZW50ID0KKyAgICAgIGdzdF9ydHBfbXA0Z19kZXBheV9wYXJzZV9pbnQgKHN0cnVjdHVyZSwgIm1heGRpc3BsYWNlbWVudCIsIDApOworCisKKyAgLyogZ2V0IGNvbmZpZyBzdHJpbmcgKi8KKyAgaWYgKChzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImNvbmZpZyIpKSkgeworICAgIEdWYWx1ZSB2ID0geyAwIH07CisKKyAgICBnX3ZhbHVlX2luaXQgKCZ2LCBHU1RfVFlQRV9CVUZGRVIpOworICAgIGlmIChnc3RfdmFsdWVfZGVzZXJpYWxpemUgKCZ2LCBzdHIpKSB7CisgICAgICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKworICAgICAgYnVmZmVyID0gZ3N0X3ZhbHVlX2dldF9idWZmZXIgKCZ2KTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKHNyY2NhcHMsCisgICAgICAgICAgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZmZlciwgTlVMTCk7CisgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdfd2FybmluZyAoImNhbm5vdCBjb252ZXJ0IGNvbmZpZyB0byBidWZmZXIiKTsKKyAgICB9CisgIH0KKworICByZXMgPSBnc3RfcGFkX3NldF9jYXBzIChkZXBheWxvYWQtPnNyY3BhZCwgc3JjY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLwordW5rbm93bl9tZWRpYToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cG1wNGdkZXBheSwgIlVua25vd24gbWVkaWEgdHlwZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcDRnX2RlcGF5X2NsZWFyX3F1ZXVlIChHc3RSdHBNUDRHRGVwYXkgKiBydHBtcDRnZGVwYXkpCit7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworCisgIHdoaWxlICgob3V0YnVmID0gZ19xdWV1ZV9wb3BfaGVhZCAocnRwbXA0Z2RlcGF5LT5wYWNrZXRzKSkpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0Z19kZXBheV9yZXNldCAoR3N0UnRwTVA0R0RlcGF5ICogcnRwbXA0Z2RlcGF5KQoreworICBnc3RfYWRhcHRlcl9jbGVhciAocnRwbXA0Z2RlcGF5LT5hZGFwdGVyKTsKKyAgcnRwbXA0Z2RlcGF5LT5tYXhfQVVfaW5kZXggPSAtMTsKKyAgcnRwbXA0Z2RlcGF5LT5uZXh0X0FVX2luZGV4ID0gLTE7CisgIHJ0cG1wNGdkZXBheS0+cHJldl9BVV9pbmRleCA9IC0xOworICBydHBtcDRnZGVwYXktPnByZXZfcnRwdGltZSA9IC0xOworICBydHBtcDRnZGVwYXktPmxhc3RfQVVfaW5kZXggPSAtMTsKKyAgZ3N0X3J0cF9tcDRnX2RlcGF5X2NsZWFyX3F1ZXVlIChydHBtcDRnZGVwYXkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcDRnX2RlcGF5X2ZsdXNoX3F1ZXVlIChHc3RSdHBNUDRHRGVwYXkgKiBydHBtcDRnZGVwYXkpCit7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBnYm9vbGVhbiBkaXNjb250ID0gRkFMU0U7CisgIGd1aW50IEFVX2luZGV4OworCisgIHdoaWxlICgob3V0YnVmID0gZ19xdWV1ZV9wb3BfaGVhZCAocnRwbXA0Z2RlcGF5LT5wYWNrZXRzKSkpIHsKKyAgICBBVV9pbmRleCA9IEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXA0Z2RlcGF5LCAibmV4dCBhdmFpbGFibGUgQVVfaW5kZXggJXUiLCBBVV9pbmRleCk7CisKKyAgICBpZiAocnRwbXA0Z2RlcGF5LT5uZXh0X0FVX2luZGV4ICE9IEFVX2luZGV4KSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRnZGVwYXksICJkaXNjb250LCBleHBlY3RlZCBBVV9pbmRleCAldSIsCisgICAgICAgICAgcnRwbXA0Z2RlcGF5LT5uZXh0X0FVX2luZGV4KTsKKyAgICAgIGRpc2NvbnQgPSBUUlVFOworICAgIH0KKworICAgIGlmIChkaXNjb250KSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICAgIGRpc2NvbnQgPSBGQUxTRTsKKyAgICB9CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRnZGVwYXksICJwdXNoaW5nIEFVX2luZGV4ICV1IiwgQVVfaW5kZXgpOworICAgIGdzdF9ydHBfZHJvcF9tZXRhIChHU1RfRUxFTUVOVF9DQVNUIChydHBtcDRnZGVwYXkpLCBvdXRidWYsIDApOworICAgIGdzdF9ydHBfYmFzZV9kZXBheWxvYWRfcHVzaCAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRCAocnRwbXA0Z2RlcGF5KSwgb3V0YnVmKTsKKyAgICBydHBtcDRnZGVwYXktPm5leHRfQVVfaW5kZXggPSBBVV9pbmRleCArIDE7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0Z19kZXBheV9xdWV1ZSAoR3N0UnRwTVA0R0RlcGF5ICogcnRwbXA0Z2RlcGF5LCBHc3RCdWZmZXIgKiBvdXRidWYpCit7CisgIGd1aW50IEFVX2luZGV4ID0gR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1Zik7CisKKyAgaWYgKHJ0cG1wNGdkZXBheS0+bmV4dF9BVV9pbmRleCA9PSAtMSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cG1wNGdkZXBheSwgIkluaXQgQVUgY291bnRlciAldSIsIEFVX2luZGV4KTsKKyAgICBydHBtcDRnZGVwYXktPm5leHRfQVVfaW5kZXggPSBBVV9pbmRleDsKKyAgfQorCisgIGlmIChydHBtcDRnZGVwYXktPm5leHRfQVVfaW5kZXggPT0gQVVfaW5kZXgpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRnZGVwYXksICJwdXNoaW5nIGV4cGVjdGVkIEFVX2luZGV4ICV1IiwgQVVfaW5kZXgpOworCisgICAgLyogd2UgcmVjZWl2ZWQgdGhlIGV4cGVjdGVkIHBhY2tldCwgcHVzaCBpdCBhbmQgZmx1c2ggYXMgbXVjaCBhcyB3ZSBjYW4gZnJvbQorICAgICAqIHRoZSBxdWV1ZSAqLworICAgIGdzdF9ydHBfZHJvcF9tZXRhIChHU1RfRUxFTUVOVF9DQVNUIChydHBtcDRnZGVwYXkpLCBvdXRidWYsIDApOworICAgIGdzdF9ydHBfYmFzZV9kZXBheWxvYWRfcHVzaCAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRCAocnRwbXA0Z2RlcGF5KSwgb3V0YnVmKTsKKyAgICBydHBtcDRnZGVwYXktPm5leHRfQVVfaW5kZXgrKzsKKworICAgIHdoaWxlICgob3V0YnVmID0gZ19xdWV1ZV9wZWVrX2hlYWQgKHJ0cG1wNGdkZXBheS0+cGFja2V0cykpKSB7CisgICAgICBBVV9pbmRleCA9IEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRnZGVwYXksICJuZXh0IGF2YWlsYWJsZSBBVV9pbmRleCAldSIsIEFVX2luZGV4KTsKKworICAgICAgaWYgKHJ0cG1wNGdkZXBheS0+bmV4dF9BVV9pbmRleCA9PSBBVV9pbmRleCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRnZGVwYXksICJwdXNoaW5nIGV4cGVjdGVkIEFVX2luZGV4ICV1IiwKKyAgICAgICAgICAgIEFVX2luZGV4KTsKKyAgICAgICAgb3V0YnVmID0gZ19xdWV1ZV9wb3BfaGVhZCAocnRwbXA0Z2RlcGF5LT5wYWNrZXRzKTsKKyAgICAgICAgZ3N0X3J0cF9kcm9wX21ldGEgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cG1wNGdkZXBheSksIG91dGJ1ZiwgMCk7CisgICAgICAgIGdzdF9ydHBfYmFzZV9kZXBheWxvYWRfcHVzaCAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRCAocnRwbXA0Z2RlcGF5KSwKKyAgICAgICAgICAgIG91dGJ1Zik7CisgICAgICAgIHJ0cG1wNGdkZXBheS0+bmV4dF9BVV9pbmRleCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXA0Z2RlcGF5LCAid2FpdGluZyBmb3IgbmV4dCBBVV9pbmRleCAldSIsCisgICAgICAgICAgICBydHBtcDRnZGVwYXktPm5leHRfQVVfaW5kZXgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgR0xpc3QgKmxpc3Q7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRnZGVwYXksICJxdWV1ZWluZyBBVV9pbmRleCAldSIsIEFVX2luZGV4KTsKKworICAgIC8qIGxvb3AgdGhlIGxpc3QgdG8gc2tpcCBzdHJpY3RseSBzbWFsbGVyIEFVX2luZGV4IGJ1ZmZlcnMgKi8KKyAgICBmb3IgKGxpc3QgPSBydHBtcDRnZGVwYXktPnBhY2tldHMtPmhlYWQ7IGxpc3Q7IGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCkpIHsKKyAgICAgIGd1aW50IGlkeDsKKyAgICAgIGdpbnQgZ2FwOworCisgICAgICBpZHggPSBHU1RfQlVGRkVSX09GRlNFVCAoR1NUX0JVRkZFUl9DQVNUIChsaXN0LT5kYXRhKSk7CisKKyAgICAgIC8qIGNvbXBhcmUgdGhlIG5ldyBzZXFudW0gdG8gdGhlIG9uZSBpbiB0aGUgYnVmZmVyICovCisgICAgICBnYXAgPSAoZ2ludCkgKGlkeCAtIEFVX2luZGV4KTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXA0Z2RlcGF5LCAiY29tcGFyZSB3aXRoIEFVX2luZGV4ICV1LCBnYXAgJWQiLCBpZHgsCisgICAgICAgICAgZ2FwKTsKKworICAgICAgLyogQVVfaW5kZXggPD0gaWR4LCB3ZSBjYW4gc3RvcCBsb29raW5nICovCisgICAgICBpZiAoR19MSUtFTFkgKGdhcCA+IDApKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKEdfTElLRUxZIChsaXN0KSkKKyAgICAgIGdfcXVldWVfaW5zZXJ0X2JlZm9yZSAocnRwbXA0Z2RlcGF5LT5wYWNrZXRzLCBsaXN0LCBvdXRidWYpOworICAgIGVsc2UKKyAgICAgIGdfcXVldWVfcHVzaF90YWlsIChydHBtcDRnZGVwYXktPnBhY2tldHMsIG91dGJ1Zik7CisgIH0KK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX21wNGdfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBNUDRHRGVwYXkgKnJ0cG1wNGdkZXBheTsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworCisgIHJ0cG1wNGdkZXBheSA9IEdTVF9SVFBfTVA0R19ERVBBWSAoZGVwYXlsb2FkKTsKKworICAvKiBmbHVzaCByZW1haW5pbmcgZGF0YSBvbiBkaXNjb250ICovCisgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKHJ0cC0+YnVmZmVyKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cG1wNGdkZXBheSwgInJlY2VpdmVkIERJU0NPTlQiKTsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRwbXA0Z2RlcGF5LT5hZGFwdGVyKTsKKyAgfQorCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChydHAtPmJ1ZmZlcik7CisKKyAgeworICAgIGdpbnQgcGF5bG9hZF9sZW4sIHBheWxvYWRfQVU7CisgICAgZ3VpbnQ4ICpwYXlsb2FkOworICAgIGd1aW50MzIgcnRwdGltZTsKKyAgICBndWludCBBVV9oZWFkZXJzX2xlbjsKKyAgICBndWludCBBVV9zaXplLCBBVV9pbmRleCwgQVVfaW5kZXhfZGVsdGEsIHBheWxvYWRfQVVfc2l6ZTsKKyAgICBnYm9vbGVhbiBNOworCisgICAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisgICAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkIChydHApOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXA0Z2RlcGF5LCAicmVjZWl2ZWQgcGF5bG9hZCBvZiAlZCIsIHBheWxvYWRfbGVuKTsKKworICAgIHJ0cHRpbWUgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wIChydHApOworICAgIE0gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApOworCisgICAgaWYgKHJ0cG1wNGdkZXBheS0+c2l6ZWxlbmd0aCA+IDApIHsKKyAgICAgIGdpbnQgbnVtX0FVX2hlYWRlcnMsIEFVX2hlYWRlcnNfYnl0ZXMsIGk7CisgICAgICBHc3RCc1BhcnNlIGJzOworCisgICAgICBpZiAocGF5bG9hZF9sZW4gPCAyKQorICAgICAgICBnb3RvIHNob3J0X3BheWxvYWQ7CisKKyAgICAgIC8qICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0gLi4gLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAqIHxBVS1oZWFkZXJzLWxlbmd0aHxBVS1oZWFkZXJ8QVUtaGVhZGVyfCAgICAgIHxBVS1oZWFkZXJ8cGFkZGluZ3wKKyAgICAgICAqIHwgICAgICAgICAgICAgICAgIHwgICAoMSkgICB8ICAgKDIpICAgfCAgICAgIHwgICAobikgKiB8IGJpdHMgIHwKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0gLi4gLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAqCisgICAgICAgKiBUaGUgbGVuZ3RoIGlzIDIgYnl0ZXMgYW5kIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgdGhlIGZvbGxvd2luZworICAgICAgICogQVUtaGVhZGVycyBpbiBiaXRzLgorICAgICAgICovCisgICAgICBBVV9oZWFkZXJzX2xlbiA9IChwYXlsb2FkWzBdIDw8IDgpIHwgcGF5bG9hZFsxXTsKKyAgICAgIEFVX2hlYWRlcnNfYnl0ZXMgPSAoQVVfaGVhZGVyc19sZW4gKyA3KSAvIDg7CisgICAgICBudW1fQVVfaGVhZGVycyA9IEFVX2hlYWRlcnNfbGVuIC8gMTY7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cG1wNGdkZXBheSwgIkFVIGhlYWRlcnMgbGVuICVkLCBieXRlcyAlZCwgbnVtICVkIiwKKyAgICAgICAgICBBVV9oZWFkZXJzX2xlbiwgQVVfaGVhZGVyc19ieXRlcywgbnVtX0FVX2hlYWRlcnMpOworCisgICAgICAvKiBza2lwIGhlYWRlciAqLworICAgICAgcGF5bG9hZCArPSAyOworICAgICAgcGF5bG9hZF9sZW4gLT0gMjsKKworICAgICAgaWYgKHBheWxvYWRfbGVuIDwgQVVfaGVhZGVyc19ieXRlcykKKyAgICAgICAgZ290byBzaG9ydF9wYXlsb2FkOworCisgICAgICAvKiBza2lwIHNwZWNpYWwgaGVhZGVycywgcG9pbnQgdG8gZmlyc3QgcGF5bG9hZCBBVSAqLworICAgICAgcGF5bG9hZF9BVSA9IDIgKyBBVV9oZWFkZXJzX2J5dGVzOworICAgICAgcGF5bG9hZF9BVV9zaXplID0gcGF5bG9hZF9sZW4gLSBBVV9oZWFkZXJzX2J5dGVzOworCisgICAgICBpZiAoR19VTkxJS0VMWSAocnRwbXA0Z2RlcGF5LT5hdXhpbGlhcnlkYXRhc2l6ZWxlbmd0aCkpIHsKKyAgICAgICAgZ2ludCBhdXhfc2l6ZTsKKworICAgICAgICAvKiBwb2ludCB0aGUgYml0c3RyZWFtIHBhcnNlciB0byB0aGUgZmlyc3QgYXV4aWxpYXJ5IGRhdGEgYml0ICovCisgICAgICAgIGdzdF9ic19wYXJzZV9pbml0ICgmYnMsIHBheWxvYWQgKyBBVV9oZWFkZXJzX2J5dGVzLAorICAgICAgICAgICAgcGF5bG9hZF9sZW4gLSBBVV9oZWFkZXJzX2J5dGVzKTsKKyAgICAgICAgYXV4X3NpemUgPQorICAgICAgICAgICAgZ3N0X2JzX3BhcnNlX3JlYWQgKCZicywgcnRwbXA0Z2RlcGF5LT5hdXhpbGlhcnlkYXRhc2l6ZWxlbmd0aCk7CisgICAgICAgIC8qIGNvbnZlcnQgdG8gYnl0ZXMgKi8KKyAgICAgICAgYXV4X3NpemUgPSAoYXV4X3NpemUgKyA3KSAvIDg7CisgICAgICAgIC8qIEFVIGRhdGEgdGhlbiBmb2xsb3dzIGF1eGlsaWFyeSBkYXRhICovCisgICAgICAgIGlmIChwYXlsb2FkX0FVX3NpemUgPCBhdXhfc2l6ZSkKKyAgICAgICAgICBnb3RvIHNob3J0X3BheWxvYWQ7CisgICAgICAgIHBheWxvYWRfQVUgKz0gYXV4X3NpemU7CisgICAgICAgIHBheWxvYWRfQVVfc2l6ZSAtPSBhdXhfc2l6ZTsKKyAgICAgIH0KKworICAgICAgLyogcG9pbnQgdGhlIGJpdHN0cmVhbSBwYXJzZXIgdG8gdGhlIGZpcnN0IEFVIGhlYWRlciBiaXQgKi8KKyAgICAgIGdzdF9ic19wYXJzZV9pbml0ICgmYnMsIHBheWxvYWQsIHBheWxvYWRfbGVuKTsKKyAgICAgIEFVX2luZGV4ID0gQVVfaW5kZXhfZGVsdGEgPSAwOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX0FVX2hlYWRlcnMgJiYgcGF5bG9hZF9BVV9zaXplID4gMDsgaSsrKSB7CisgICAgICAgIC8qIHBhcnNlIEFVIGhlYWRlcgorICAgICAgICAgKiAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICogIHwgICAgIEFVLXNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAqICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgKiAgfCAgICAgQVUtSW5kZXggLyBBVS1JbmRleC1kZWx0YSAgICAgICAgIHwKKyAgICAgICAgICogICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAqICB8ICAgICBDVFMtZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgKiAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICogIHwgICAgIENUUy1kZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAqICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgKiAgfCAgICAgRFRTLWZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICogICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAqICB8ICAgICBEVFMtZGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgKiAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICogIHwgICAgIFJBUC1mbGFnICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAqICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgKiAgfCAgICAgU3RyZWFtLXN0YXRlICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICogICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAqLworICAgICAgICBBVV9zaXplID0gZ3N0X2JzX3BhcnNlX3JlYWQgKCZicywgcnRwbXA0Z2RlcGF5LT5zaXplbGVuZ3RoKTsKKworICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIEFVX2luZGV4LCB3aGljaCBpcyBvbmx5IG9uIHRoZSBmaXJzdCBBVSBvZiB0aGUgcGFja2V0CisgICAgICAgICAqIGFuZCB0aGUgQVVfaW5kZXhfZGVsdGEgb24gdGhlIG90aGVyIEFVcy4gVGhpcyB3aWxsIGJlIHVzZWQgdG8KKyAgICAgICAgICogcmVjb25zdHJ1Y3QgdGhlIEFVIG9yZGVyaW5nIHdoZW4gaW50ZXJsZWF2aW5nLiAqLworICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgQVVfaW5kZXggPSBnc3RfYnNfcGFyc2VfcmVhZCAoJmJzLCBydHBtcDRnZGVwYXktPmluZGV4bGVuZ3RoKTsKKworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cG1wNGdkZXBheSwgIkFVIGluZGV4ICV1IiwgQVVfaW5kZXgpOworCisgICAgICAgICAgaWYgKEFVX2luZGV4ID09IDAgJiYgcnRwbXA0Z2RlcGF5LT5wcmV2X0FVX2luZGV4ID09IDApIHsKKyAgICAgICAgICAgIGdpbnQgZGlmZjsKKyAgICAgICAgICAgIGdpbnQgY2Q7CisKKyAgICAgICAgICAgIC8qIGlmIHdlIHNlZSB0d28gY29uc2VjdXRpdmUgcGFja2V0cyB3aXRoIEFVX2luZGV4IG9mIDAsIHdlIGNhbgorICAgICAgICAgICAgICogYXNzdW1lIHdlIGhhdmUgY29uc3RhbnREdXJhdGlvbiBwYWNrZXRzLiBTaW5jZSB3ZSBkb24ndCBoYXZlCisgICAgICAgICAgICAgKiB0aGUgaW5kZXggd2UgbXVzdCB1c2UgdGhlIEFVIGR1cmF0aW9uIHRvIGNhbGN1bGF0ZSB0aGUKKyAgICAgICAgICAgICAqIGluZGV4LiBHZXQgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdGltZXN0YW1wcyBmaXJzdCwgdGhpcyBjYW4gYmUKKyAgICAgICAgICAgICAqIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLiAqLworICAgICAgICAgICAgaWYgKHJ0cG1wNGdkZXBheS0+cHJldl9ydHB0aW1lIDw9IHJ0cHRpbWUpCisgICAgICAgICAgICAgIGRpZmYgPSBydHB0aW1lIC0gcnRwbXA0Z2RlcGF5LT5wcmV2X3J0cHRpbWU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGRpZmYgPSAtKHJ0cG1wNGdkZXBheS0+cHJldl9ydHB0aW1lIC0gcnRwdGltZSk7CisKKyAgICAgICAgICAgIC8qIGlmIG5vIGNvbnN0YW50RHVyYXRpb24gd2FzIGdpdmVuLCBtYWtlIG9uZSAqLworICAgICAgICAgICAgaWYgKHJ0cG1wNGdkZXBheS0+Y29uc3RhbnREdXJhdGlvbiAhPSAwKSB7CisgICAgICAgICAgICAgIGNkID0gcnRwbXA0Z2RlcGF5LT5jb25zdGFudER1cmF0aW9uOworICAgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJ1c2luZyBjb25zdGFudER1cmF0aW9uICVkIiwgY2QpOworICAgICAgICAgICAgfSBlbHNlIGlmIChydHBtcDRnZGVwYXktPnByZXZfQVVfbnVtID4gMCkgeworICAgICAgICAgICAgICAvKiB1c2UgbnVtYmVyIG9mIHBhY2tldHMgYW5kIG9mIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICAgIGNkID0gZGlmZiAvIHJ0cG1wNGdkZXBheS0+cHJldl9BVV9udW07CisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgImd1ZXNzaW5nIGNvbnN0YW50RHVyYXRpb24gJWQiLCBjZCk7CisgICAgICAgICAgICAgIGlmICghR1NUX0JVRkZFUl9JU19ESVNDT05UIChydHAtPmJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICAvKiByZmMzNjQwIC0gMy4yLjMuMgorICAgICAgICAgICAgICAgICAqIGlmIHdlIHNlZSB0d28gY29uc2VjdXRpdmUgcGFja2V0cyB3aXRoIEFVX2luZGV4IG9mIDAgYW5kCisgICAgICAgICAgICAgICAgICogdGhlcmUgaGFzIGJlZW4gbm8gZGlzY29udGludWl0eSwgd2UgbXVzdCBjb25jbHVkZSB0aGF0IHRoaXMKKyAgICAgICAgICAgICAgICAgKiB2YWx1ZSBvZiBjb25zdGFudER1cmF0aW9uIGlzIGNvcnJlY3QgZnJvbSBub3cgb24uICovCisgICAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLAorICAgICAgICAgICAgICAgICAgICAiY29uc3RhbnREdXJhdGlvbiBvZiAlZCBkZXRlY3RlZCIsIGNkKTsKKyAgICAgICAgICAgICAgICBydHBtcDRnZGVwYXktPmNvbnN0YW50RHVyYXRpb24gPSBjZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLyogYXNzdW1lIHRoaXMgZnJhbWUgaGFzIHRoZSBzYW1lIG51bWJlciBvZiBwYWNrZXRzIGFzIHRoZQorICAgICAgICAgICAgICAgKiBwcmV2aW91cyBvbmUgKi8KKyAgICAgICAgICAgICAgY2QgPSBkaWZmIC8gbnVtX0FVX2hlYWRlcnM7CisgICAgICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgImd1ZXNzaW5nIGNvbnN0YW50RHVyYXRpb24gJWQiLCBjZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjZCA+IDApIHsKKyAgICAgICAgICAgICAgLyogZ2V0IHRoZSBudW1iZXIgb2YgcGFja2V0cyBieSBkaXZpZGluZyB3aXRoIHRoZSBkdXJhdGlvbiAqLworICAgICAgICAgICAgICBkaWZmIC89IGNkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZGlmZiA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJ0cG1wNGdkZXBheS0+bGFzdF9BVV9pbmRleCArPSBkaWZmOworICAgICAgICAgICAgcnRwbXA0Z2RlcGF5LT5wcmV2X0FVX2luZGV4ID0gQVVfaW5kZXg7CisKKyAgICAgICAgICAgIEFVX2luZGV4ID0gcnRwbXA0Z2RlcGF5LT5sYXN0X0FVX2luZGV4OworCisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRnZGVwYXksICJkaWZmICVkLCBBVSBpbmRleCAldSIsIGRpZmYsCisgICAgICAgICAgICAgICAgQVVfaW5kZXgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydHBtcDRnZGVwYXktPnByZXZfQVVfaW5kZXggPSBBVV9pbmRleDsKKyAgICAgICAgICAgIHJ0cG1wNGdkZXBheS0+bGFzdF9BVV9pbmRleCA9IEFVX2luZGV4OworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIGtlZXAgdHJhY2sgb2YgdGhlIGhpZ2VzdCBBVV9pbmRleCAqLworICAgICAgICAgIGlmIChydHBtcDRnZGVwYXktPm1heF9BVV9pbmRleCAhPSAtMQorICAgICAgICAgICAgICAmJiBydHBtcDRnZGVwYXktPm1heF9BVV9pbmRleCA8PSBBVV9pbmRleCkgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXA0Z2RlcGF5LCAibmV3IGludGVybGVhdmUgZ3JvdXAsIGZsdXNoaW5nIik7CisgICAgICAgICAgICAvKiBhIG5ldyBpbnRlcmxlYXZlIGdyb3VwIHN0YXJ0ZWQsIGZsdXNoICovCisgICAgICAgICAgICBnc3RfcnRwX21wNGdfZGVwYXlfZmx1c2hfcXVldWUgKHJ0cG1wNGdkZXBheSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChHX1VOTElLRUxZICghcnRwbXA0Z2RlcGF5LT5tYXhEaXNwbGFjZW1lbnQgJiYKKyAgICAgICAgICAgICAgICAgIHJ0cG1wNGdkZXBheS0+bWF4X0FVX2luZGV4ICE9IC0xCisgICAgICAgICAgICAgICAgICAmJiBydHBtcDRnZGVwYXktPm1heF9BVV9pbmRleCA+PSBBVV9pbmRleCkpIHsKKyAgICAgICAgICAgIEdzdEJ1ZmZlciAqb3V0YnVmOworCisgICAgICAgICAgICAvKiBzb21lIGJyb2tlbiBub24taW50ZXJsZWF2ZWQgc3RyZWFtcyBoYXZlIEFVLWluZGV4IGp1bXBpbmcgYXJvdW5kCisgICAgICAgICAgICAgKiBhbGwgb3ZlciB0aGUgcGxhY2UsIGFwcGFyZW50bHkgYXNzdW1pbmcgcmVjZWl2ZXIgZGlzcmVnYXJkcyAqLworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXA0Z2RlcGF5LCAibm9uLWludGVybGVhdmVkIGJyb2tlbiBBVSBpbmRpY2VzOyIKKyAgICAgICAgICAgICAgICAiIGZvcmNpbmcgY29udGludW91cyBmbHVzaCIpOworICAgICAgICAgICAgLyogcmVzZXQgQVUgdG8gYXZvaWQgcmVwZWF0ZWQgRElTQ09OVCBpbiBzdWNoIGNhc2UgKi8KKyAgICAgICAgICAgIG91dGJ1ZiA9IGdfcXVldWVfcGVla19oZWFkIChydHBtcDRnZGVwYXktPnBhY2tldHMpOworICAgICAgICAgICAgaWYgKEdfTElLRUxZIChvdXRidWYpKSB7CisgICAgICAgICAgICAgIHJ0cG1wNGdkZXBheS0+bmV4dF9BVV9pbmRleCA9IEdTVF9CVUZGRVJfT0ZGU0VUIChvdXRidWYpOworICAgICAgICAgICAgICBnc3RfcnRwX21wNGdfZGVwYXlfZmx1c2hfcXVldWUgKHJ0cG1wNGdkZXBheSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiByZWJhc2UgbmV4dF9BVV9pbmRleCB0byBjdXJyZW50IHJ0cCdzIGZpcnN0IEFVX2luZGV4ICovCisgICAgICAgICAgICBydHBtcDRnZGVwYXktPm5leHRfQVVfaW5kZXggPSBBVV9pbmRleDsKKyAgICAgICAgICB9CisgICAgICAgICAgcnRwbXA0Z2RlcGF5LT5wcmV2X3J0cHRpbWUgPSBydHB0aW1lOworICAgICAgICAgIHJ0cG1wNGdkZXBheS0+cHJldl9BVV9udW0gPSBudW1fQVVfaGVhZGVyczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBBVV9pbmRleF9kZWx0YSA9CisgICAgICAgICAgICAgIGdzdF9ic19wYXJzZV9yZWFkICgmYnMsIHJ0cG1wNGdkZXBheS0+aW5kZXhkZWx0YWxlbmd0aCk7CisgICAgICAgICAgQVVfaW5kZXggKz0gQVVfaW5kZXhfZGVsdGEgKyAxOworICAgICAgICB9CisgICAgICAgIC8qIGtlZXAgdHJhY2sgb2YgaGlnaGVzdCBBVV9pbmRleCAqLworICAgICAgICBpZiAocnRwbXA0Z2RlcGF5LT5tYXhfQVVfaW5kZXggPT0gLTEKKyAgICAgICAgICAgIHx8IEFVX2luZGV4ID4gcnRwbXA0Z2RlcGF5LT5tYXhfQVVfaW5kZXgpCisgICAgICAgICAgcnRwbXA0Z2RlcGF5LT5tYXhfQVVfaW5kZXggPSBBVV9pbmRleDsKKworICAgICAgICAvKiB0aGUgcHJlc2VudGF0aW9uIHRpbWUgb2Zmc2V0LCBhIDJzLWNvbXBsZW1lbnQgdmFsdWUsIHdlIG5lZWQgdGhpcyB0bworICAgICAgICAgKiBjYWxjdWxhdGUgdGhlIHRpbWVzdGFtcCBvbiB0aGUgb3V0cHV0IHBhY2tldC4gKi8KKyAgICAgICAgaWYgKHJ0cG1wNGdkZXBheS0+Y3RzZGVsdGFsZW5ndGggPiAwKSB7CisgICAgICAgICAgaWYgKGdzdF9ic19wYXJzZV9yZWFkICgmYnMsIDEpKQorICAgICAgICAgICAgZ3N0X2JzX3BhcnNlX3JlYWQgKCZicywgcnRwbXA0Z2RlcGF5LT5jdHNkZWx0YWxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgLyogdGhlIGRlY29kaW5nIHRpbWUgb2Zmc2V0LCBhIDJzLWNvbXBsZW1lbnQgdmFsdWUgKi8KKyAgICAgICAgaWYgKHJ0cG1wNGdkZXBheS0+ZHRzZGVsdGFsZW5ndGggPiAwKSB7CisgICAgICAgICAgaWYgKGdzdF9ic19wYXJzZV9yZWFkICgmYnMsIDEpKQorICAgICAgICAgICAgZ3N0X2JzX3BhcnNlX3JlYWQgKCZicywgcnRwbXA0Z2RlcGF5LT5kdHNkZWx0YWxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgLyogUkFQLWZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgQVUgY29udGFpbnMgYSBrZXlmcmFtZSAqLworICAgICAgICBpZiAocnRwbXA0Z2RlcGF5LT5yYW5kb21hY2Nlc3NpbmRpY2F0aW9uKQorICAgICAgICAgIGdzdF9ic19wYXJzZV9yZWFkICgmYnMsIDEpOworICAgICAgICAvKiBzdHJlYW0tc3RhdGUgKi8KKyAgICAgICAgaWYgKHJ0cG1wNGdkZXBheS0+c3RyZWFtc3RhdGVpbmRpY2F0aW9uID4gMCkKKyAgICAgICAgICBnc3RfYnNfcGFyc2VfcmVhZCAoJmJzLCBydHBtcDRnZGVwYXktPnN0cmVhbXN0YXRlaW5kaWNhdGlvbik7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXA0Z2RlcGF5LCAic2l6ZSAlZCwgaW5kZXggJWQsIGRlbHRhICVkIiwgQVVfc2l6ZSwKKyAgICAgICAgICAgIEFVX2luZGV4LCBBVV9pbmRleF9kZWx0YSk7CisKKyAgICAgICAgLyogZnJhZ21lbnRlZCBwYWtldHMgaGF2ZSB0aGUgQVVfc2l6ZSBzZXQgdG8gdGhlIHNpemUgb2YgdGhlCisgICAgICAgICAqIHVuZnJhZ21lbnRlZCBBVS4gKi8KKyAgICAgICAgaWYgKEFVX3NpemUgPiBwYXlsb2FkX0FVX3NpemUpCisgICAgICAgICAgQVVfc2l6ZSA9IHBheWxvYWRfQVVfc2l6ZTsKKworICAgICAgICAvKiBjb2xsZWN0IHN0dWZmIGluIHRoZSBhZGFwdGVyLCBzdHJpcCBoZWFkZXIgZnJvbSBwYXlsb2FkIGFuZCBwdXNoIGluCisgICAgICAgICAqIHRoZSBhZGFwdGVyICovCisgICAgICAgIG91dGJ1ZiA9CisgICAgICAgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwgcGF5bG9hZF9BVSwgQVVfc2l6ZSk7CisgICAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cG1wNGdkZXBheS0+YWRhcHRlciwgb3V0YnVmKTsKKworICAgICAgICBpZiAoTSkgeworICAgICAgICAgIGd1aW50IGF2YWlsOworCisgICAgICAgICAgLyogcGFja2V0IGlzIGNvbXBsZXRlLCBmbHVzaCAqLworICAgICAgICAgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBtcDRnZGVwYXktPmFkYXB0ZXIpOworCisgICAgICAgICAgb3V0YnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHJ0cG1wNGdkZXBheS0+YWRhcHRlciwgYXZhaWwpOworCisgICAgICAgICAgLyogY29weSBzb21lIG9mIHRoZSBmaWVsZHMgd2UgY2FsY3VsYXRlZCBhYm92ZSBvbiB0aGUgYnVmZmVyLiBXZSBhbHNvCisgICAgICAgICAgICogY29weSB0aGUgQVVfaW5kZXggc28gdGhhdCB3ZSBjYW4gc29ydCB0aGUgcGFja2V0cyBpbiBvdXIgcXVldWUuICovCisgICAgICAgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSB0aW1lc3RhbXA7CisgICAgICAgICAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBBVV9pbmRleDsKKworICAgICAgICAgIGlmIChydHBtcDRnZGVwYXktPmNvbnN0YW50RHVyYXRpb24gIT0gMCkgeworICAgICAgICAgICAgLyogaWYgd2UgaGF2ZSBjb25zdGFudER1cmF0aW9uLCBjYWxjdWxhdGUgdGltZXN0YW1wIGZvciBuZXh0IEFVCisgICAgICAgICAgICAgKiBpbiB0aGlzIFJUUCBwYWNrZXQuICovCisgICAgICAgICAgICB0aW1lc3RhbXAgKz0gKHJ0cG1wNGdkZXBheS0+Y29uc3RhbnREdXJhdGlvbiAqIEdTVF9TRUNPTkQpIC8KKyAgICAgICAgICAgICAgICBkZXBheWxvYWQtPmNsb2NrX3JhdGU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIG90aGVyd2lzZSwgbWFrZSBzdXJlIHdlIGRvbid0IHVzZSB0aGUgdGltZXN0YW1wIGFnYWluIGZvciBvdGhlcgorICAgICAgICAgICAgICogQVVzLiAqLworICAgICAgICAgICAgdGltZXN0YW1wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsCisgICAgICAgICAgICAgICJwdXNoaW5nIGJ1ZmZlciBvZiBzaXplICUiIEdfR1NJWkVfRk9STUFULAorICAgICAgICAgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWYpKTsKKworICAgICAgICAgIGdzdF9ydHBfbXA0Z19kZXBheV9xdWV1ZSAocnRwbXA0Z2RlcGF5LCBvdXRidWYpOworCisgICAgICAgIH0KKyAgICAgICAgcGF5bG9hZF9BVSArPSBBVV9zaXplOworICAgICAgICBwYXlsb2FkX0FVX3NpemUgLT0gQVVfc2l6ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogcHVzaCBjb21wbGV0ZSBidWZmZXIgaW4gYWRhcHRlciAqLworICAgICAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfc3ViYnVmZmVyIChydHAsIDAsIHBheWxvYWRfbGVuKTsKKyAgICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cG1wNGdkZXBheS0+YWRhcHRlciwgb3V0YnVmKTsKKworICAgICAgLyogaWYgdGhpcyB3YXMgdGhlIGxhc3QgcGFja2V0IG9mIHRoZSBWT1AsIGNyZWF0ZSBhbmQgcHVzaCBhIGJ1ZmZlciAqLworICAgICAgaWYgKE0pIHsKKyAgICAgICAgZ3VpbnQgYXZhaWw7CisKKyAgICAgICAgYXZhaWwgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHJ0cG1wNGdkZXBheS0+YWRhcHRlcik7CisKKyAgICAgICAgb3V0YnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHJ0cG1wNGdkZXBheS0+YWRhcHRlciwgYXZhaWwpOworCisgICAgICAgIEdTVF9ERUJVRyAoImdzdF9ydHBfbXA0Z19kZXBheV9jaGFpbjogcHVzaGluZyBidWZmZXIgb2Ygc2l6ZSAlIgorICAgICAgICAgICAgR19HU0laRV9GT1JNQVQsIGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZikpOworCisgICAgICAgIHJldHVybiBvdXRidWY7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIE5VTEw7CisKKyAgLyogRVJST1JTICovCitzaG9ydF9wYXlsb2FkOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwbXA0Z2RlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJQYWNrZXQgcGF5bG9hZCB3YXMgdG9vIHNob3J0LiIpLCAoTlVMTCkpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcDRnX2RlcGF5X2hhbmRsZV9ldmVudCAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGZpbHRlciwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmV0OworICBHc3RSdHBNUDRHRGVwYXkgKnJ0cG1wNGdkZXBheTsKKworICBydHBtcDRnZGVwYXkgPSBHU1RfUlRQX01QNEdfREVQQVkgKGZpbHRlcik7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9ydHBfbXA0Z19kZXBheV9yZXNldCAocnRwbXA0Z2RlcGF5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9CisgICAgICBHU1RfUlRQX0JBU0VfREVQQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5oYW5kbGVfZXZlbnQgKGZpbHRlciwgZXZlbnQpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9tcDRnX2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UnRwTVA0R0RlcGF5ICpydHBtcDRnZGVwYXk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBydHBtcDRnZGVwYXkgPSBHU1RfUlRQX01QNEdfREVQQVkgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfcnRwX21wNGdfZGVwYXlfcmVzZXQgKHJ0cG1wNGdkZXBheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3J0cF9tcDRnX2RlcGF5X3Jlc2V0IChydHBtcDRnZGVwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX21wNGdfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBtcDRnZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfTVA0R19ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cG1wNGdkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDU5OTdhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBtcDRnZGVwYXkuaApAQCAtMCwwICsxLDg2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfTVA0R19ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX01QNEdfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX01QNEdfREVQQVkgXAorICAoZ3N0X3J0cF9tcDRnX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfTVA0R19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9NUDRHX0RFUEFZLEdzdFJ0cE1QNEdEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfTVA0R19ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTVA0R19ERVBBWSxHc3RSdHBNUDRHRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfTVA0R19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9NUDRHX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUDRHX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUDRHX0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cE1QNEdEZXBheSBHc3RSdHBNUDRHRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTVA0R0RlcGF5Q2xhc3MgR3N0UnRwTVA0R0RlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTVA0R0RlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCisgIGdpbnQgcHJvZmlsZV9sZXZlbF9pZDsKKyAgZ2ludCBzdHJlYW10eXBlOworCisgIGdpbnQgY29uc3RhbnRTaXplOworICBnaW50IGNvbnN0YW50RHVyYXRpb247CisgIGdpbnQgbWF4RGlzcGxhY2VtZW50OworCisgIGdpbnQgc2l6ZWxlbmd0aDsKKyAgZ2ludCBpbmRleGxlbmd0aDsKKyAgZ2ludCBpbmRleGRlbHRhbGVuZ3RoOworICBnaW50IGN0c2RlbHRhbGVuZ3RoOworICBnaW50IGR0c2RlbHRhbGVuZ3RoOworICBnaW50IHJhbmRvbWFjY2Vzc2luZGljYXRpb247CisgIGdpbnQgc3RyZWFtc3RhdGVpbmRpY2F0aW9uOworICBnaW50IGF1eGlsaWFyeWRhdGFzaXplbGVuZ3RoOworCisgIGd1aW50IG1heF9BVV9pbmRleDsKKyAgZ3VpbnQgcHJldl9BVV9pbmRleDsKKyAgZ3VpbnQgbGFzdF9BVV9pbmRleDsKKyAgZ3VpbnQgbmV4dF9BVV9pbmRleDsKKyAgZ3VpbnQzMiBwcmV2X3J0cHRpbWU7CisgIGd1aW50IHByZXZfQVVfbnVtOworCisgIEdRdWV1ZSAqcGFja2V0czsKKyAgCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cE1QNEdEZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX21wNGdfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX21wNGdfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfTVA0R19ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jIGIvZ3N0L3J0cC9nc3RydHBtcDRncGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzM2I0OQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXA0Z3BheS5jCkBAIC0wLDAgKzEsNjM5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJpdHJlYWRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKyNpbmNsdWRlICJnc3RydHBtcDRncGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwbXA0Z3BheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwbXA0Z3BheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXA0Z19wYXlfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8vbXBlZywiCisgICAgICAgICJtcGVndmVyc2lvbj0oaW50KSA0LCIKKyAgICAgICAgInN5c3RlbXN0cmVhbT0oYm9vbGVhbilmYWxzZTsiCisgICAgICAgICJhdWRpby9tcGVnLCIgIm1wZWd2ZXJzaW9uPShpbnQpIDQsICIgInN0cmVhbS1mb3JtYXQ9KHN0cmluZykgcmF3IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9tcDRnX3BheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIHsgXCJ2aWRlb1wiLCBcImF1ZGlvXCIsIFwiYXBwbGljYXRpb25cIiB9LCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVggXSwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTVBFRzQtR0VORVJJQ1wiLCAiCisgICAgICAgIC8qIHJlcXVpcmVkIHN0cmluZyBwYXJhbXMgKi8KKyAgICAgICAgInN0cmVhbXR5cGUgPSAoc3RyaW5nKSB7IFwiNFwiLCBcIjVcIiB9LCAiICAgICAgLyogNCA9IHZpZGVvLCA1ID0gYXVkaW8gKi8KKyAgICAgICAgLyogInByb2ZpbGUtbGV2ZWwtaWQgPSAoc3RyaW5nKSBbMSxNQVhdLCAiICovCisgICAgICAgIC8qICJjb25maWcgPSAoc3RyaW5nKSBbMSxNQVhdIiAqLworICAgICAgICAibW9kZSA9IChzdHJpbmcpIHsgXCJnZW5lcmljXCIsIFwiQ0VMUC1jYnJcIiwgXCJDRUxQLXZiclwiLCBcIkFBQy1sYnJcIiwgXCJBQUMtaGJyXCIgfSAiCisgICAgICAgIC8qIE9wdGlvbmFsIGdlbmVyYWwgcGFyYW1ldGVycyAqLworICAgICAgICAvKiAib2JqZWN0dHlwZSA9IChzdHJpbmcpIFsxLE1BWF0sICIgKi8KKyAgICAgICAgLyogImNvbnN0YW50c2l6ZSA9IChzdHJpbmcpIFsxLE1BWF0sICIgKi8vKiBjb25zdGFudCBzaXplIG9mIGVhY2ggQVUgKi8KKyAgICAgICAgLyogImNvbnN0YW50ZHVyYXRpb24gPSAoc3RyaW5nKSBbMSxNQVhdLCAiICovLyogY29uc3RhbnQgZHVyYXRpb24gb2YgZWFjaCBBVSAqLworICAgICAgICAvKiAibWF4ZGlzcGxhY2VtZW50ID0gKHN0cmluZykgWzEsTUFYXSwgIiAqLworICAgICAgICAvKiAiZGUtaW50ZXJsZWF2ZWJ1ZmZlcnNpemUgPSAoc3RyaW5nKSBbMSxNQVhdLCAiICovCisgICAgICAgIC8qIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworICAgICAgICAvKiAic2l6ZWxlbmd0aCA9IChzdHJpbmcpIFsxLCAxNl0sICIgKi8vKiBtYXggMTYgYml0cywgc2hvdWxkIGJlIGVub3VnaC4uLiAqLworICAgICAgICAvKiAiaW5kZXhsZW5ndGggPSAoc3RyaW5nKSBbMSwgOF0sICIgKi8KKyAgICAgICAgLyogImluZGV4ZGVsdGFsZW5ndGggPSAoc3RyaW5nKSBbMSwgOF0sICIgKi8KKyAgICAgICAgLyogImN0c2RlbHRhbGVuZ3RoID0gKHN0cmluZykgWzEsIDY0XSwgIiAqLworICAgICAgICAvKiAiZHRzZGVsdGFsZW5ndGggPSAoc3RyaW5nKSBbMSwgNjRdLCAiICovCisgICAgICAgIC8qICJyYW5kb21hY2Nlc3NpbmRpY2F0aW9uID0gKHN0cmluZykgezAsIDF9LCAiICovCisgICAgICAgIC8qICJzdHJlYW1zdGF0ZWluZGljYXRpb24gPSAoc3RyaW5nKSBbMCwgNjRdLCAiICovCisgICAgICAgIC8qICJhdXhpbGlhcnlkYXRhc2l6ZWxlbmd0aCA9IChzdHJpbmcpIFswLCA2NF0iICovICkKKyAgICApOworCisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfbXA0Z19wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9tcDRnX3BheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tcDRnX3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9tcDRnX3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqCisgICAgcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX21wNGdfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworI2RlZmluZSBnc3RfcnRwX21wNGdfcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cE1QNEdQYXksIGdzdF9ydHBfbXA0Z19wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpCisKKyAgICAgc3RhdGljIHZvaWQgZ3N0X3J0cF9tcDRnX3BheV9jbGFzc19pbml0IChHc3RSdHBNUDRHUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfbXA0Z19wYXlfZmluYWxpemU7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF9tcDRnX3BheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9tcDRnX3BheV9zZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9IGdzdF9ydHBfbXA0Z19wYXlfaGFuZGxlX2J1ZmZlcjsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNpbmtfZXZlbnQgPSBnc3RfcnRwX21wNGdfcGF5X3NpbmtfZXZlbnQ7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcDRnX3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX21wNGdfcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIE1QRUc0IEVTIHBheWxvYWRlciIsCisgICAgICAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkIE1QRUc0IGVsZW1lbnRhcnkgc3RyZWFtcyBhcyBSVFAgcGFja2V0cyAoUkZDIDM2NDApIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBtcDRncGF5X2RlYnVnLCAicnRwbXA0Z3BheSIsIDAsCisgICAgICAiTVA0LWdlbmVyaWMgUlRQIFBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcDRnX3BheV9pbml0IChHc3RSdHBNUDRHUGF5ICogcnRwbXA0Z3BheSkKK3sKKyAgcnRwbXA0Z3BheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0Z19wYXlfcmVzZXQgKEdzdFJ0cE1QNEdQYXkgKiBydHBtcDRncGF5KQoreworICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRncGF5LCAicmVzZXQiKTsKKworICBnc3RfYWRhcHRlcl9jbGVhciAocnRwbXA0Z3BheS0+YWRhcHRlcik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wNGdfcGF5X2NsZWFudXAgKEdzdFJ0cE1QNEdQYXkgKiBydHBtcDRncGF5KQoreworICBnc3RfcnRwX21wNGdfcGF5X3Jlc2V0IChydHBtcDRncGF5KTsKKworICBnX2ZyZWUgKHJ0cG1wNGdwYXktPnBhcmFtcyk7CisgIHJ0cG1wNGdwYXktPnBhcmFtcyA9IE5VTEw7CisKKyAgaWYgKHJ0cG1wNGdwYXktPmNvbmZpZykKKyAgICBnc3RfYnVmZmVyX3VucmVmIChydHBtcDRncGF5LT5jb25maWcpOworICBydHBtcDRncGF5LT5jb25maWcgPSBOVUxMOworCisgIGdfZnJlZSAocnRwbXA0Z3BheS0+cHJvZmlsZSk7CisgIHJ0cG1wNGdwYXktPnByb2ZpbGUgPSBOVUxMOworCisgIHJ0cG1wNGdwYXktPnN0cmVhbXR5cGUgPSBOVUxMOworICBydHBtcDRncGF5LT5tb2RlID0gTlVMTDsKKworICBydHBtcDRncGF5LT5mcmFtZV9sZW4gPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcDRnX3BheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwTVA0R1BheSAqcnRwbXA0Z3BheTsKKworICBydHBtcDRncGF5ID0gR1NUX1JUUF9NUDRHX1BBWSAob2JqZWN0KTsKKworICBnc3RfcnRwX21wNGdfcGF5X2NsZWFudXAgKHJ0cG1wNGdwYXkpOworCisgIGdfb2JqZWN0X3VucmVmIChydHBtcDRncGF5LT5hZGFwdGVyKTsKKyAgcnRwbXA0Z3BheS0+YWRhcHRlciA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNhbXBsaW5nX3RhYmxlWzE2XSA9IHsKKyAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMjQwMDAsIDIyMDUwLAorICAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwLCA3MzUwLCAwLCAwLCAwCit9OworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXA0Z19wYXlfcGFyc2VfYXVkaW9fY29uZmlnIChHc3RSdHBNUDRHUGF5ICogcnRwbXA0Z3BheSwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggb2JqZWN0VHlwZSA9IDA7CisgIGd1aW50OCBzYW1wbGluZ0lkeCA9IDA7CisgIGd1aW50OCBjaGFubmVsQ2ZnID0gMDsKKyAgR3N0Qml0UmVhZGVyIGJyOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgZ3N0X2JpdF9yZWFkZXJfaW5pdCAoJmJyLCBtYXAuZGF0YSwgbWFwLnNpemUpOworCisgIC8qIGFueSBvYmplY3QgdHlwZSBpcyBmaW5lLCB3ZSBuZWVkIHRvIGNvcHkgaXQgdG8gdGhlIHByb2ZpbGUtbGV2ZWwtaWQgZmllbGQuICovCisgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKCZiciwgJm9iamVjdFR5cGUsIDUpKQorICAgIGdvdG8gdG9vX3Nob3J0OworICBpZiAob2JqZWN0VHlwZSA9PSAwKQorICAgIGdvdG8gaW52YWxpZF9vYmplY3Q7CisKKyAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoJmJyLCAmc2FtcGxpbmdJZHgsIDQpKQorICAgIGdvdG8gdG9vX3Nob3J0OworICAvKiBvbmx5IGZpeGVkIHZhbHVlcyBmb3Igbm93ICovCisgIGlmIChzYW1wbGluZ0lkeCA+IDEyICYmIHNhbXBsaW5nSWR4ICE9IDE1KQorICAgIGdvdG8gd3JvbmdfZnJlcTsKKworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmYnIsICZjaGFubmVsQ2ZnLCA0KSkKKyAgICBnb3RvIHRvb19zaG9ydDsKKyAgaWYgKGNoYW5uZWxDZmcgPiA3KQorICAgIGdvdG8gd3JvbmdfY2hhbm5lbHM7CisKKyAgLyogcnRwIHJhdGUgZGVwZW5kcyBvbiBzYW1wbGluZyByYXRlIG9mIHRoZSBhdWRpbyAqLworICBpZiAoc2FtcGxpbmdJZHggPT0gMTUpIHsKKyAgICBndWludDMyIHJhdGUgPSAwOworCisgICAgLyogaW5kZXggb2YgMTUgbWVhbnMgd2UgZ2V0IHRoZSByYXRlIGluIHRoZSBuZXh0IDI0IGJpdHMgKi8KKyAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQzMiAoJmJyLCAmcmF0ZSwgMjQpKQorICAgICAgZ290byB0b29fc2hvcnQ7CisKKyAgICBydHBtcDRncGF5LT5yYXRlID0gcmF0ZTsKKyAgfSBlbHNlIHsKKyAgICAvKiBlbHNlIHVzZSB0aGUgcmF0ZSBmcm9tIHRoZSB0YWJsZSAqLworICAgIHJ0cG1wNGdwYXktPnJhdGUgPSBzYW1wbGluZ190YWJsZVtzYW1wbGluZ0lkeF07CisgIH0KKworICBydHBtcDRncGF5LT5mcmFtZV9sZW4gPSAxMDI0OworCisgIHN3aXRjaCAob2JqZWN0VHlwZSkgeworICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgY2FzZSAzOgorICAgIGNhc2UgNDoKKyAgICBjYXNlIDY6CisgICAgY2FzZSA3OgorICAgIHsKKyAgICAgIGd1aW50OCBmcmFtZUxlbkZsYWcgPSAwOworCisgICAgICBpZiAoZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKCZiciwgJmZyYW1lTGVuRmxhZywgMSkpCisgICAgICAgIGlmIChmcmFtZUxlbkZsYWcpCisgICAgICAgICAgcnRwbXA0Z3BheS0+ZnJhbWVfbGVuID0gOTYwOworCisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogZXh0cmEgcnRwIHBhcmFtcyBjb250YWluIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgZ19mcmVlIChydHBtcDRncGF5LT5wYXJhbXMpOworICBydHBtcDRncGF5LT5wYXJhbXMgPSBnX3N0cmR1cF9wcmludGYgKCIlZCIsIGNoYW5uZWxDZmcpOworICAvKiBhdWRpbyBzdHJlYW0gdHlwZSAqLworICBydHBtcDRncGF5LT5zdHJlYW10eXBlID0gIjUiOworICAvKiBtb2RlIG9ubHkgaGlnaCBiaXRyYXRlIGZvciBub3cgKi8KKyAgcnRwbXA0Z3BheS0+bW9kZSA9ICJBQUMtaGJyIjsKKyAgLyogcHJvZmlsZSAqLworICBnX2ZyZWUgKHJ0cG1wNGdwYXktPnByb2ZpbGUpOworICBydHBtcDRncGF5LT5wcm9maWxlID0gZ19zdHJkdXBfcHJpbnRmICgiJWQiLCBvYmplY3RUeXBlKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRncGF5LAorICAgICAgIm9iamVjdFR5cGU6ICVkLCBzYW1wbGluZ0lkeDogJWQgKCVkKSwgY2hhbm5lbENmZzogJWQsIGZyYW1lX2xlbiAlZCIsCisgICAgICBvYmplY3RUeXBlLCBzYW1wbGluZ0lkeCwgcnRwbXA0Z3BheS0+cmF0ZSwgY2hhbm5lbENmZywKKyAgICAgIHJ0cG1wNGdwYXktPmZyYW1lX2xlbik7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1IgKi8KK3Rvb19zaG9ydDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChydHBtcDRncGF5LCBTVFJFQU0sIEZPUk1BVCwKKyAgICAgICAgKE5VTEwpLCAoImNvbmZpZyBzdHJpbmcgdG9vIHNob3J0IikpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbnZhbGlkX29iamVjdDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChydHBtcDRncGF5LCBTVFJFQU0sIEZPUk1BVCwKKyAgICAgICAgKE5VTEwpLCAoImludmFsaWQgb2JqZWN0IHR5cGUiKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3dyb25nX2ZyZXE6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocnRwbXA0Z3BheSwgU1RSRUFNLCBOT1RfSU1QTEVNRU5URUQsCisgICAgICAgIChOVUxMKSwgKCJ1bnN1cHBvcnRlZCBmcmVxdWVuY3kgaW5kZXggJWQiLCBzYW1wbGluZ0lkeCkpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ19jaGFubmVsczoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChydHBtcDRncGF5LCBTVFJFQU0sIE5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgKE5VTEwpLCAoInVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyAlZCwgbXVzdCA8IDgiLCBjaGFubmVsQ2ZnKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworI2RlZmluZSBWT1NfU1RBUlRDT0RFICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxQjAKKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX21wNGdfcGF5X3BhcnNlX3ZpZGVvX2NvbmZpZyAoR3N0UnRwTVA0R1BheSAqIHJ0cG1wNGdwYXksCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQzMiBjb2RlOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgaWYgKG1hcC5zaXplIDwgNSkKKyAgICBnb3RvIHRvb19zaG9ydDsKKworICBjb2RlID0gR1NUX1JFQURfVUlOVDMyX0JFIChtYXAuZGF0YSk7CisKKyAgZ19mcmVlIChydHBtcDRncGF5LT5wcm9maWxlKTsKKyAgaWYgKGNvZGUgPT0gVk9TX1NUQVJUQ09ERSkgeworICAgIC8qIGdldCBwcm9maWxlICovCisgICAgcnRwbXA0Z3BheS0+cHJvZmlsZSA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgKGdpbnQpIG1hcC5kYXRhWzRdKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBtcDRncGF5LCBTVFJFQU0sIEZPUk1BVCwKKyAgICAgICAgKE5VTEwpLCAoInByb2ZpbGUgbm90IGZvdW5kIGluIGNvbmZpZyBzdHJpbmcsIGFzc3VtaW5nIFwnMVwnIikpOworICAgIHJ0cG1wNGdwYXktPnByb2ZpbGUgPSBnX3N0cmR1cCAoIjEiKTsKKyAgfQorCisgIC8qIGZpeGVkIHJhdGUgKi8KKyAgcnRwbXA0Z3BheS0+cmF0ZSA9IDkwMDAwOworICAvKiB2aWRlbyBzdHJlYW0gdHlwZSAqLworICBydHBtcDRncGF5LT5zdHJlYW10eXBlID0gIjQiOworICAvKiBubyBwYXJhbXMgZm9yIHZpZGVvICovCisgIHJ0cG1wNGdwYXktPnBhcmFtcyA9IE5VTEw7CisgIC8qIG1vZGUgKi8KKyAgcnRwbXA0Z3BheS0+bW9kZSA9ICJnZW5lcmljIjsKKworICBHU1RfTE9HX09CSkVDVCAocnRwbXA0Z3BheSwgInByb2ZpbGUgJXMiLCBydHBtcDRncGF5LT5wcm9maWxlKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SICovCit0b29fc2hvcnQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocnRwbXA0Z3BheSwgU1RSRUFNLCBGT1JNQVQsCisgICAgICAgIChOVUxMKSwgKCJjb25maWcgc3RyaW5nIHRvbyBzaG9ydCIpKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXA0Z19wYXlfbmV3X2NhcHMgKEdzdFJ0cE1QNEdQYXkgKiBydHBtcDRncGF5KQoreworICBnY2hhciAqY29uZmlnOworICBHVmFsdWUgdiA9IHsgMCB9OworICBnYm9vbGVhbiByZXM7CisKKyNkZWZpbmUgTVA0R0NBUFMJCQkJCQlcCisgICJzdHJlYW10eXBlIiwgR19UWVBFX1NUUklORywgcnRwbXA0Z3BheS0+c3RyZWFtdHlwZSwgCQlcCisgICJwcm9maWxlLWxldmVsLWlkIiwgR19UWVBFX1NUUklORywgcnRwbXA0Z3BheS0+cHJvZmlsZSwJXAorICAibW9kZSIsIEdfVFlQRV9TVFJJTkcsIHJ0cG1wNGdwYXktPm1vZGUsCQkJXAorICAiY29uZmlnIiwgR19UWVBFX1NUUklORywgY29uZmlnLAkJCQlcCisgICJzaXplbGVuZ3RoIiwgR19UWVBFX1NUUklORywgIjEzIiwJCQkJXAorICAiaW5kZXhsZW5ndGgiLCBHX1RZUEVfU1RSSU5HLCAiMyIsCQkJCVwKKyAgImluZGV4ZGVsdGFsZW5ndGgiLCBHX1RZUEVfU1RSSU5HLCAiMyIsCQkJXAorICBOVUxMCisKKyAgZ192YWx1ZV9pbml0ICgmdiwgR1NUX1RZUEVfQlVGRkVSKTsKKyAgZ3N0X3ZhbHVlX3NldF9idWZmZXIgKCZ2LCBydHBtcDRncGF5LT5jb25maWcpOworICBjb25maWcgPSBnc3RfdmFsdWVfc2VyaWFsaXplICgmdik7CisKKyAgLyogaG1tLCBzaWxseSAqLworICBpZiAocnRwbXA0Z3BheS0+cGFyYW1zKSB7CisgICAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBtcDRncGF5KSwKKyAgICAgICAgImVuY29kaW5nLXBhcmFtcyIsIEdfVFlQRV9TVFJJTkcsIHJ0cG1wNGdwYXktPnBhcmFtcywgTVA0R0NBUFMpOworICB9IGVsc2UgeworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwbXA0Z3BheSksCisgICAgICAgIE1QNEdDQVBTKTsKKyAgfQorCisgIGdfdmFsdWVfdW5zZXQgKCZ2KTsKKyAgZ19mcmVlIChjb25maWcpOworCisjdW5kZWYgTVA0R0NBUFMKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX21wNGdfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFJ0cE1QNEdQYXkgKnJ0cG1wNGdwYXk7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBHVmFsdWUgKmNvZGVjX2RhdGE7CisgIGNvbnN0IGdjaGFyICptZWRpYV90eXBlID0gTlVMTDsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHJ0cG1wNGdwYXkgPSBHU1RfUlRQX01QNEdfUEFZIChwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBjb2RlY19kYXRhID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImNvZGVjX2RhdGEiKTsKKyAgaWYgKGNvZGVjX2RhdGEpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocnRwbXA0Z3BheSwgImdvdCBjb2RlY19kYXRhIik7CisgICAgaWYgKEdfVkFMVUVfVFlQRSAoY29kZWNfZGF0YSkgPT0gR1NUX1RZUEVfQlVGRkVSKSB7CisgICAgICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgICAgIGNvbnN0IGdjaGFyICpuYW1lOworCisgICAgICBidWZmZXIgPSBnc3RfdmFsdWVfZ2V0X2J1ZmZlciAoY29kZWNfZGF0YSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwbXA0Z3BheSwgImNvbmZpZ3VyaW5nIGNvZGVjX2RhdGEiKTsKKworICAgICAgbmFtZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSk7CisKKyAgICAgIC8qIHBhcnNlIGJ1ZmZlciAqLworICAgICAgaWYgKCFzdHJjbXAgKG5hbWUsICJhdWRpby9tcGVnIikpIHsKKyAgICAgICAgcmVzID0gZ3N0X3J0cF9tcDRnX3BheV9wYXJzZV9hdWRpb19jb25maWcgKHJ0cG1wNGdwYXksIGJ1ZmZlcik7CisgICAgICAgIG1lZGlhX3R5cGUgPSAiYXVkaW8iOworICAgICAgfSBlbHNlIGlmICghc3RyY21wIChuYW1lLCAidmlkZW8vbXBlZyIpKSB7CisgICAgICAgIHJlcyA9IGdzdF9ydHBfbXA0Z19wYXlfcGFyc2VfdmlkZW9fY29uZmlnIChydHBtcDRncGF5LCBidWZmZXIpOworICAgICAgICBtZWRpYV90eXBlID0gInZpZGVvIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgfQorICAgICAgaWYgKCFyZXMpCisgICAgICAgIGdvdG8gY29uZmlnX2ZhaWxlZDsKKworICAgICAgLyogbm93IHdlIGNhbiBjb25maWd1cmUgdGhlIGJ1ZmZlciAqLworICAgICAgaWYgKHJ0cG1wNGdwYXktPmNvbmZpZykKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocnRwbXA0Z3BheS0+Y29uZmlnKTsKKworICAgICAgcnRwbXA0Z3BheS0+Y29uZmlnID0gZ3N0X2J1ZmZlcl9jb3B5IChidWZmZXIpOworICAgIH0KKyAgfQorICBpZiAobWVkaWFfdHlwZSA9PSBOVUxMKQorICAgIGdvdG8gY29uZmlnX2ZhaWxlZDsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocGF5bG9hZCwgbWVkaWFfdHlwZSwgVFJVRSwgIk1QRUc0LUdFTkVSSUMiLAorICAgICAgcnRwbXA0Z3BheS0+cmF0ZSk7CisKKyAgcmVzID0gZ3N0X3J0cF9tcDRnX3BheV9uZXdfY2FwcyAocnRwbXA0Z3BheSk7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK2NvbmZpZ19mYWlsZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDRncGF5LCAiZmFpbGVkIHRvIHBhcnNlIGNvbmZpZyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9tcDRnX3BheV9mbHVzaCAoR3N0UnRwTVA0R1BheSAqIHJ0cG1wNGdwYXkpCit7CisgIGd1aW50IGF2YWlsLCB0b3RhbDsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludCBtdHU7CisKKyAgLyogdGhlIGRhdGEgYXZhaWxhYmxlIGluIHRoZSBhZGFwdGVyIGlzIGVpdGhlciBzbWFsbGVyCisgICAqIHRoYW4gdGhlIE1UVSBvciBiaWdnZXIuIEluIHRoZSBjYXNlIGl0IGlzIHNtYWxsZXIsIHRoZSBjb21wbGV0ZQorICAgKiBhZGFwdGVyIGNvbnRlbnRzIGNhbiBiZSBwdXQgaW4gb25lIHBhY2tldC4gSW4gdGhlIGNhc2UgdGhlCisgICAqIGFkYXB0ZXIgaGFzIG1vcmUgdGhhbiBvbmUgTVRVLCB3ZSBuZWVkIHRvIGZyYWdtZW50IHRoZSBNUEVHIGRhdGEKKyAgICogb3ZlciBtdWx0aXBsZSBwYWNrZXRzLiAqLworICB0b3RhbCA9IGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBtcDRncGF5LT5hZGFwdGVyKTsKKworICByZXQgPSBHU1RfRkxPV19PSzsKKyAgbXR1ID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChydHBtcDRncGF5KTsKKworICB3aGlsZSAoYXZhaWwgPiAwKSB7CisgICAgZ3VpbnQgdG93cml0ZTsKKyAgICBndWludDggKnBheWxvYWQ7CisgICAgZ3VpbnQgcGF5bG9hZF9sZW47CisgICAgZ3VpbnQgcGFja2V0X2xlbjsKKyAgICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisgICAgR3N0QnVmZmVyICpwYXlidWY7CisKKyAgICAvKiB0aGlzIHdpbGwgYmUgdGhlIHRvdGFsIGxlbmdodCBvZiB0aGUgcGFja2V0ICovCisgICAgcGFja2V0X2xlbiA9IGdzdF9ydHBfYnVmZmVyX2NhbGNfcGFja2V0X2xlbiAoYXZhaWwsIDAsIDApOworCisgICAgLyogZmlsbCBvbmUgTVRVIG9yIGFsbCBhdmFpbGFibGUgYnl0ZXMsIHdlIG5lZWQgNCBzcGFyZSBieXRlcyBmb3IKKyAgICAgKiB0aGUgQVUgaGVhZGVyLiAqLworICAgIHRvd3JpdGUgPSBNSU4gKHBhY2tldF9sZW4sIG10dSAtIDQpOworCisgICAgLyogdGhpcyBpcyB0aGUgcGF5bG9hZCBsZW5ndGggKi8KKyAgICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2NhbGNfcGF5bG9hZF9sZW4gKHRvd3JpdGUsIDAsIDApOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXA0Z3BheSwKKyAgICAgICAgImF2YWlsICVkLCB0b3dyaXRlICVkLCBwYWNrZXRfbGVuICVkLCBwYXlsb2FkX2xlbiAlZCIsIGF2YWlsLCB0b3dyaXRlLAorICAgICAgICBwYWNrZXRfbGVuLCBwYXlsb2FkX2xlbik7CisKKyAgICAvKiBjcmVhdGUgYnVmZmVyIHRvIGhvbGQgdGhlIHBheWxvYWQsIGFsc28gbWFrZSByb29tIGZvciB0aGUgNCBoZWFkZXIgYnl0ZXMuICovCisgICAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlICg0LCAwLCAwKTsKKworICAgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0YnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKworICAgIC8qIGNvcHkgcGF5bG9hZCAqLworICAgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisKKyAgICAvKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstIC4uIC0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICogfEFVLWhlYWRlcnMtbGVuZ3RofEFVLWhlYWRlcnxBVS1oZWFkZXJ8ICAgICAgfEFVLWhlYWRlcnxwYWRkaW5nfAorICAgICAqIHwgICAgICAgICAgICAgICAgIHwgICAoMSkgICB8ICAgKDIpICAgfCAgICAgIHwgICAobikgICB8IGJpdHMgIHwKKyAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstIC4uIC0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICovCisgICAgLyogQVUtaGVhZGVycy1sZW5ndGgsIHdlIG9ubHkgaGF2ZSAxIEFVLWhlYWRlciAqLworICAgIHBheWxvYWRbMF0gPSAweDAwOworICAgIHBheWxvYWRbMV0gPSAweDEwOyAgICAgICAgICAvKiB3ZSB1c2UgMTYgYml0cyBmb3IgdGhlIGhlYWRlciAqLworCisgICAgLyogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgKiB8ICAgICBBVS1zaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICogfCAgICAgQVUtSW5kZXggLyBBVS1JbmRleC1kZWx0YSAgICAgICAgIHwKKyAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAqIHwgICAgIENUUy1mbGFnICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgKiB8ICAgICBDVFMtZGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICogfCAgICAgRFRTLWZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAqIHwgICAgIERUUy1kZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgKiB8ICAgICBSQVAtZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICogfCAgICAgU3RyZWFtLXN0YXRlICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAqLworICAgIC8qIFRoZSBBVS1oZWFkZXIsIG5vIENUUywgRFRTLCBSQVAsIFN0cmVhbS1zdGF0ZSAKKyAgICAgKgorICAgICAqIEFVLXNpemUgaXMgYWx3YXlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBBVSwgbm90IHRoZSBmcmFnbWVudGVkIHNpemUgCisgICAgICovCisgICAgcGF5bG9hZFsyXSA9ICh0b3RhbCAmIDB4MWZlMCkgPj4gNTsKKyAgICBwYXlsb2FkWzNdID0gKHRvdGFsICYgMHgxZikgPDwgMzsgICAvKiB3ZSB1c2UgMTMgYml0cyBmb3IgdGhlIHNpemUsIDMgYml0cyBpbmRleCAqLworCisgICAgLyogbWFya2VyIG9ubHkgaWYgdGhlIHBhY2tldCBpcyBjb21wbGV0ZSAqLworICAgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKCZydHAsIGF2YWlsIDw9IHBheWxvYWRfbGVuKTsKKworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAgIHBheWJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyX2Zhc3QgKHJ0cG1wNGdwYXktPmFkYXB0ZXIsIHBheWxvYWRfbGVuKTsKKyAgICBnc3RfcnRwX2NvcHlfbWV0YSAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwbXA0Z3BheSksIG91dGJ1ZiwgcGF5YnVmLCAwKTsKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAob3V0YnVmLCBwYXlidWYpOworCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBydHBtcDRncGF5LT5maXJzdF90aW1lc3RhbXA7CisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9IHJ0cG1wNGdwYXktPmZpcnN0X2R1cmF0aW9uOworCisgICAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FOworCisgICAgaWYgKHJ0cG1wNGdwYXktPmRpc2NvbnQpIHsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgICAgLyogT25seSB0aGUgZmlyc3Qgb3V0cHV0dGVkIGJ1ZmZlciBoYXMgdGhlIERJU0NPTlQgZmxhZyAqLworICAgICAgcnRwbXA0Z3BheS0+ZGlzY29udCA9IEZBTFNFOworICAgIH0KKworICAgIHJldCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBtcDRncGF5KSwgb3V0YnVmKTsKKworICAgIGF2YWlsIC09IHBheWxvYWRfbGVuOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogd2UgZXhwZWN0IGJ1ZmZlcnMgYXMgZXhhY3RseSBvbmUgY29tcGxldGUgQVUKKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfbXA0Z19wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJ0cE1QNEdQYXkgKnJ0cG1wNGdwYXk7CisKKyAgcnRwbXA0Z3BheSA9IEdTVF9SVFBfTVA0R19QQVkgKGJhc2VwYXlsb2FkKTsKKworICBydHBtcDRncGF5LT5maXJzdF90aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKyAgcnRwbXA0Z3BheS0+Zmlyc3RfZHVyYXRpb24gPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpOworICBydHBtcDRncGF5LT5kaXNjb250ID0gR1NUX0JVRkZFUl9JU19ESVNDT05UIChidWZmZXIpOworCisgIC8qIHdlIGFsd2F5cyBlbmNvZGUgYW5kIGZsdXNoIGEgZnVsbCBBVSAqLworICBnc3RfYWRhcHRlcl9wdXNoIChydHBtcDRncGF5LT5hZGFwdGVyLCBidWZmZXIpOworCisgIHJldHVybiBnc3RfcnRwX21wNGdfcGF5X2ZsdXNoIChydHBtcDRncGF5KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX21wNGdfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwTVA0R1BheSAqcnRwbXA0Z3BheTsKKworICBydHBtcDRncGF5ID0gR1NUX1JUUF9NUDRHX1BBWSAocGF5bG9hZCk7CisKKyAgR1NUX0RFQlVHICgiR290IGV2ZW50OiAlcyIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDoKKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgICAvKiBUaGlzIGZsdXNoIGNhbGwgbWFrZXMgc3VyZSB0aGF0IHRoZSBsYXN0IGJ1ZmZlciBpcyBhbHdheXMgcHVzaGVkCisgICAgICAgKiB0byB0aGUgYmFzZSBwYXlsb2FkZXIgKi8KKyAgICAgIGdzdF9ydHBfbXA0Z19wYXlfZmx1c2ggKHJ0cG1wNGdwYXkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9ydHBfbXA0Z19wYXlfcmVzZXQgKHJ0cG1wNGdwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogbGV0IHBhcmVudCBoYW5kbGUgZXZlbnQgdG9vICovCisgIHJldHVybiBHU1RfUlRQX0JBU0VfUEFZTE9BRF9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAocGF5bG9hZCwgZXZlbnQpOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfbXA0Z19wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RSdHBNUDRHUGF5ICpydHBtcDRncGF5OworCisgIHJ0cG1wNGdwYXkgPSBHU1RfUlRQX01QNEdfUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X3J0cF9tcDRnX3BheV9jbGVhbnVwIChydHBtcDRncGF5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfcnRwX21wNGdfcGF5X2NsZWFudXAgKHJ0cG1wNGdwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfbXA0Z19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBtcDRncGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX01QNEdfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXA0Z3BheS5oIGIvZ3N0L3J0cC9nc3RydHBtcDRncGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRmZDY4YQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXA0Z3BheS5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9NUDRHX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX01QNEdfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZXBheWxvYWQuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfTVA0R19QQVkgXAorICAoZ3N0X3J0cF9tcDRnX3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX01QNEdfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX01QNEdfUEFZLEdzdFJ0cE1QNEdQYXkpKQorI2RlZmluZSBHU1RfUlRQX01QNEdfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUDRHX1BBWSxHc3RSdHBNUDRHUGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QNEdfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX01QNEdfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUDRHX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTVA0R19QQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTVA0R1BheSBHc3RSdHBNUDRHUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cE1QNEdQYXlDbGFzcyBHc3RSdHBNUDRHUGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTVA0R1BheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCAgICBwYXlsb2FkOworCisgIEdzdEFkYXB0ZXIgICAqYWRhcHRlcjsKKyAgR3N0Q2xvY2tUaW1lICBmaXJzdF90aW1lc3RhbXA7CisgIEdzdENsb2NrVGltZSAgZmlyc3RfZHVyYXRpb247CisgIGdib29sZWFuICAgICAgZGlzY29udDsKKworICBnaW50ICAgICAgICAgIHJhdGU7CisgIGdjaGFyICAgICAgICAqcGFyYW1zOworICBnY2hhciAgICAgICAgKnByb2ZpbGU7CisgIGNvbnN0IGdjaGFyICAqc3RyZWFtdHlwZTsKKyAgY29uc3QgZ2NoYXIgICptb2RlOworICBHc3RCdWZmZXIgICAgKmNvbmZpZzsKKyAgZ3VpbnQgICAgICAgICBmcmFtZV9sZW47Cit9OworCitzdHJ1Y3QgX0dzdFJ0cE1QNEdQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfbXA0Z19wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX21wNGdfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX01QNEdfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBtcDR2ZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2MGY4OAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnc3RydHBtcDR2ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBtcDR2ZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cG1wNHZkZXBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXA0dl9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL21wZWcsIgorICAgICAgICAibXBlZ3ZlcnNpb249KGludCkgNCwiICJzeXN0ZW1zdHJlYW09KGJvb2xlYW4pZmFsc2UiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX21wNHZfZGVwYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSBbMSwgTUFYIF0sICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIk1QNFYtRVNcIiIKKyAgICAgICAgLyogQWxsIG9wdGlvbmFsIHBhcmFtZXRlcnMKKyAgICAgICAgICoKKyAgICAgICAgICogInByb2ZpbGUtbGV2ZWwtaWQ9WzEsTUFYXSIKKyAgICAgICAgICogImNvbmZpZz0iIAorICAgICAgICAgKi8KKyAgICApCisgICAgKTsKKworI2RlZmluZSBnc3RfcnRwX21wNHZfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwTVA0VkRlcGF5LCBnc3RfcnRwX21wNHZfZGVwYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9tcDR2X2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfbXA0dl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfbXA0dl9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX21wNHZfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0dl9kZXBheV9jbGFzc19pbml0IChHc3RSdHBNUDRWRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX21wNHZfZGVwYXlfZmluYWxpemU7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF9tcDR2X2RlcGF5X2NoYW5nZV9zdGF0ZTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX21wNHZfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX21wNHZfZGVwYXlfc2V0Y2FwczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX21wNHZfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcDR2X2RlcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIE1QRUc0IHZpZGVvIGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBNUEVHNCB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMzAxNikiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cG1wNHZkZXBheV9kZWJ1ZywgInJ0cG1wNHZkZXBheSIsIDAsCisgICAgICAiTVBFRzQgdmlkZW8gUlRQIERlcGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wNHZfZGVwYXlfaW5pdCAoR3N0UnRwTVA0VkRlcGF5ICogcnRwbXA0dmRlcGF5KQoreworICBydHBtcDR2ZGVwYXktPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wNHZfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cE1QNFZEZXBheSAqcnRwbXA0dmRlcGF5OworCisgIHJ0cG1wNHZkZXBheSA9IEdTVF9SVFBfTVA0Vl9ERVBBWSAob2JqZWN0KTsKKworICBnX29iamVjdF91bnJlZiAocnRwbXA0dmRlcGF5LT5hZGFwdGVyKTsKKyAgcnRwbXA0dmRlcGF5LT5hZGFwdGVyID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcDR2X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR3N0Q2FwcyAqc3JjY2FwczsKKyAgY29uc3QgZ2NoYXIgKnN0cjsKKyAgZ2ludCBjbG9ja19yYXRlOworICBnYm9vbGVhbiByZXM7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDkwMDAwOyAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgZGVwYXlsb2FkLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL21wZWciLAorICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgNCwKKyAgICAgICJzeXN0ZW1zdHJlYW0iLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworCisgIGlmICgoc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJjb25maWciKSkpIHsKKyAgICBHVmFsdWUgdiA9IHsgMCB9OworCisgICAgZ192YWx1ZV9pbml0ICgmdiwgR1NUX1RZUEVfQlVGRkVSKTsKKyAgICBpZiAoZ3N0X3ZhbHVlX2Rlc2VyaWFsaXplICgmdiwgc3RyKSkgeworICAgICAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgICAgIGJ1ZmZlciA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyICgmdik7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChzcmNjYXBzLAorICAgICAgICAgICJjb2RlY19kYXRhIiwgR1NUX1RZUEVfQlVGRkVSLCBidWZmZXIsIE5VTEwpOworICAgICAgLyogY2FwcyB0YWtlcyByZWYgKi8KKyAgICAgIGdfdmFsdWVfdW5zZXQgKCZ2KTsKKyAgICB9IGVsc2UgeworICAgICAgZ193YXJuaW5nICgiY2Fubm90IGNvbnZlcnQgY29uZmlnIHRvIGJ1ZmZlciIpOworICAgIH0KKyAgfQorICByZXMgPSBnc3RfcGFkX3NldF9jYXBzIChkZXBheWxvYWQtPnNyY3BhZCwgc3JjY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfbXA0dl9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cE1QNFZEZXBheSAqcnRwbXA0dmRlcGF5OworICBHc3RCdWZmZXIgKnBidWYsICpvdXRidWYgPSBOVUxMOworICBnYm9vbGVhbiBtYXJrZXI7CisKKyAgcnRwbXA0dmRlcGF5ID0gR1NUX1JUUF9NUDRWX0RFUEFZIChkZXBheWxvYWQpOworCisgIC8qIGZsdXNoIHJlbWFpbmluZyBkYXRhIG9uIGRpc2NvbnQgKi8KKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAocnRwLT5idWZmZXIpKQorICAgIGdzdF9hZGFwdGVyX2NsZWFyIChydHBtcDR2ZGVwYXktPmFkYXB0ZXIpOworCisgIHBidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9idWZmZXIgKHJ0cCk7CisgIG1hcmtlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwbXA0dmRlcGF5LT5hZGFwdGVyLCBwYnVmKTsKKworICAvKiBpZiB0aGlzIHdhcyB0aGUgbGFzdCBwYWNrZXQgb2YgdGhlIFZPUCwgY3JlYXRlIGFuZCBwdXNoIGEgYnVmZmVyICovCisgIGlmIChtYXJrZXIpIHsKKyAgICBndWludCBhdmFpbDsKKworICAgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBtcDR2ZGVwYXktPmFkYXB0ZXIpOworICAgIG91dGJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChydHBtcDR2ZGVwYXktPmFkYXB0ZXIsIGF2YWlsKTsKKworICAgIEdTVF9ERUJVRyAoImdzdF9ydHBfbXA0dl9kZXBheV9jaGFpbjogcHVzaGluZyBidWZmZXIgb2Ygc2l6ZSAlIgorICAgICAgICBHX0dTSVpFX0ZPUk1BVCwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0YnVmKSk7CisgICAgZ3N0X3J0cF9kcm9wX25vbl92aWRlb19tZXRhIChydHBtcDR2ZGVwYXksIG91dGJ1Zik7CisgIH0KKworICByZXR1cm4gb3V0YnVmOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfbXA0dl9kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cE1QNFZEZXBheSAqcnRwbXA0dmRlcGF5OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwbXA0dmRlcGF5ID0gR1NUX1JUUF9NUDRWX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cG1wNHZkZXBheS0+YWRhcHRlcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfbXA0dl9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cG1wNHZkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9NUDRWX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXA0dmRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNmUwZGIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG1wNHZkZXBheS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9NUDRWX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfTVA0Vl9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfTVA0Vl9ERVBBWSBcCisgIChnc3RfcnRwX21wNHZfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9NUDRWX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX01QNFZfREVQQVksR3N0UnRwTVA0VkRlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9NUDRWX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUDRWX0RFUEFZLEdzdFJ0cE1QNFZEZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUDRWX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX01QNFZfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QNFZfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX01QNFZfREVQQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTVA0VkRlcGF5IEdzdFJ0cE1QNFZEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBNUDRWRGVwYXlDbGFzcyBHc3RSdHBNUDRWRGVwYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBNUDRWRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisgIAorICBHc3RBZGFwdGVyICphZGFwdGVyOworfTsKKworc3RydWN0IF9Hc3RSdHBNUDRWRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9tcDR2X2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9tcDR2X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX01QNFZfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwbXA0dnBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlODlmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG1wNHZwYXkuYwpAQCAtMCwwICsxLDYxOSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSAiZ3N0cnRwbXA0dnBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cG1wNHZwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cG1wNHZwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX21wNHZfcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL21wZWcsIgorICAgICAgICAibXBlZ3ZlcnNpb249KGludCkgNCwgc3lzdGVtc3RyZWFtPShib29sZWFuKWZhbHNlOyIgInZpZGVvL3gtZGl2eCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXA0dl9wYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWCBdLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJNUDRWLUVTXCIiCisgICAgICAgIC8qIHR3byBzdHJpbmcgcGFyYW1zCisgICAgICAgICAqCisgICAgICAgICAicHJvZmlsZS1sZXZlbC1pZCA9IChzdHJpbmcpIFsxLE1BWF0iCisgICAgICAgICAiY29uZmlnID0gKHN0cmluZykgWzEsTUFYXSIKKyAgICAgICAgICovCisgICAgKQorICAgICk7CisKKyNkZWZpbmUgREVGQVVMVF9DT05GSUdfSU5URVJWQUwgMAorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9DT05GSUdfSU5URVJWQUwKK307CisKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9tcDR2X3BheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfbXA0dl9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9tcDR2X3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX21wNHZfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX21wNHZfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICoKKyAgICBwYXlsb2FkLCBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfbXA0dl9wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXksCisgICAgR3N0RXZlbnQgKiBldmVudCk7CisKKyNkZWZpbmUgZ3N0X3J0cF9tcDR2X3BheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBNUDRWUGF5LCBnc3RfcnRwX21wNHZfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKQorCisgICAgIHN0YXRpYyB2b2lkIGdzdF9ydHBfbXA0dl9wYXlfY2xhc3NfaW5pdCAoR3N0UnRwTVA0VlBheUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzICpnc3RydHBiYXNlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9tcDR2X3BheV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9ydHBfbXA0dl9wYXlfZ2V0X3Byb3BlcnR5OworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXA0dl9wYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcDR2X3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBNUEVHNCBWaWRlbyBwYXlsb2FkZXIiLCAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkIE1QRUctNCB2aWRlbyBhcyBSVFAgcGFja2V0cyAoUkZDIDMwMTYpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQ09ORklHX0lOVEVSVkFMLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJjb25maWctaW50ZXJ2YWwiLCAiQ29uZmlnIFNlbmQgSW50ZXJ2YWwiLAorICAgICAgICAgICJTZW5kIENvbmZpZyBJbnNlcnRpb24gSW50ZXJ2YWwgaW4gc2Vjb25kcyAoY29uZmlndXJhdGlvbiBoZWFkZXJzICIKKyAgICAgICAgICAid2lsbCBiZSBtdWx0aXBsZXhlZCBpbiB0aGUgZGF0YSBzdHJlYW0gd2hlbiBkZXRlY3RlZC4pICgwID0gZGlzYWJsZWQpIiwKKyAgICAgICAgICAwLCAzNjAwLCBERUZBVUxUX0NPTkZJR19JTlRFUlZBTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpCisgICAgICApOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9tcDR2X3BheV9maW5hbGl6ZTsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX21wNHZfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9tcDR2X3BheV9oYW5kbGVfYnVmZmVyOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2lua19ldmVudCA9IGdzdF9ydHBfbXA0dl9wYXlfc2lua19ldmVudDsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwbXA0dnBheV9kZWJ1ZywgInJ0cG1wNHZwYXkiLCAwLAorICAgICAgIk1QNCB2aWRlbyBSVFAgUGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wNHZfcGF5X2luaXQgKEdzdFJ0cE1QNFZQYXkgKiBydHBtcDR2cGF5KQoreworICBydHBtcDR2cGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICBydHBtcDR2cGF5LT5yYXRlID0gOTAwMDA7CisgIHJ0cG1wNHZwYXktPnByb2ZpbGUgPSAxOworICBydHBtcDR2cGF5LT5uZWVkX2NvbmZpZyA9IFRSVUU7CisgIHJ0cG1wNHZwYXktPmNvbmZpZ19pbnRlcnZhbCA9IERFRkFVTFRfQ09ORklHX0lOVEVSVkFMOworICBydHBtcDR2cGF5LT5sYXN0X2NvbmZpZyA9IC0xOworCisgIHJ0cG1wNHZwYXktPmNvbmZpZyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wNHZfcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSdHBNUDRWUGF5ICpydHBtcDR2cGF5OworCisgIHJ0cG1wNHZwYXkgPSBHU1RfUlRQX01QNFZfUEFZIChvYmplY3QpOworCisgIGlmIChydHBtcDR2cGF5LT5jb25maWcpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChydHBtcDR2cGF5LT5jb25maWcpOworICAgIHJ0cG1wNHZwYXktPmNvbmZpZyA9IE5VTEw7CisgIH0KKyAgZ19vYmplY3RfdW5yZWYgKHJ0cG1wNHZwYXktPmFkYXB0ZXIpOworICBydHBtcDR2cGF5LT5hZGFwdGVyID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcDR2X3BheV9uZXdfY2FwcyAoR3N0UnRwTVA0VlBheSAqIHJ0cG1wNHZwYXkpCit7CisgIGdjaGFyICpwcm9maWxlLCAqY29uZmlnOworICBHVmFsdWUgdiA9IHsgMCB9OworICBnYm9vbGVhbiByZXM7CisKKyAgcHJvZmlsZSA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgcnRwbXA0dnBheS0+cHJvZmlsZSk7CisgIGdfdmFsdWVfaW5pdCAoJnYsIEdTVF9UWVBFX0JVRkZFUik7CisgIGdzdF92YWx1ZV9zZXRfYnVmZmVyICgmdiwgcnRwbXA0dnBheS0+Y29uZmlnKTsKKyAgY29uZmlnID0gZ3N0X3ZhbHVlX3NlcmlhbGl6ZSAoJnYpOworCisgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwbXA0dnBheSksCisgICAgICAicHJvZmlsZS1sZXZlbC1pZCIsIEdfVFlQRV9TVFJJTkcsIHByb2ZpbGUsCisgICAgICAiY29uZmlnIiwgR19UWVBFX1NUUklORywgY29uZmlnLCBOVUxMKTsKKworICBnX3ZhbHVlX3Vuc2V0ICgmdik7CisKKyAgZ19mcmVlIChwcm9maWxlKTsKKyAgZ19mcmVlIChjb25maWcpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcDR2X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSdHBNUDRWUGF5ICpydHBtcDR2cGF5OworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgY29uc3QgR1ZhbHVlICpjb2RlY19kYXRhOworICBnYm9vbGVhbiByZXM7CisKKyAgcnRwbXA0dnBheSA9IEdTVF9SVFBfTVA0Vl9QQVkgKHBheWxvYWQpOworCisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChwYXlsb2FkLCAidmlkZW8iLCBUUlVFLCAiTVA0Vi1FUyIsCisgICAgICBydHBtcDR2cGF5LT5yYXRlKTsKKworICByZXMgPSBUUlVFOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBjb2RlY19kYXRhID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImNvZGVjX2RhdGEiKTsKKyAgaWYgKGNvZGVjX2RhdGEpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocnRwbXA0dnBheSwgImdvdCBjb2RlY19kYXRhIik7CisgICAgaWYgKEdfVkFMVUVfVFlQRSAoY29kZWNfZGF0YSkgPT0gR1NUX1RZUEVfQlVGRkVSKSB7CisgICAgICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKworICAgICAgYnVmZmVyID0gZ3N0X3ZhbHVlX2dldF9idWZmZXIgKGNvZGVjX2RhdGEpOworCisgICAgICBpZiAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSA8IDUpCisgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChidWZmZXIsIDQsICZydHBtcDR2cGF5LT5wcm9maWxlLCAxKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcDR2cGF5LCAiY29uZmlndXJpbmcgY29kZWNfZGF0YSwgcHJvZmlsZSAlZCIsCisgICAgICAgICAgcnRwbXA0dnBheS0+cHJvZmlsZSk7CisKKyAgICAgIGlmIChydHBtcDR2cGF5LT5jb25maWcpCisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHJ0cG1wNHZwYXktPmNvbmZpZyk7CisgICAgICBydHBtcDR2cGF5LT5jb25maWcgPSBnc3RfYnVmZmVyX2NvcHkgKGJ1ZmZlcik7CisgICAgICByZXMgPSBnc3RfcnRwX21wNHZfcGF5X25ld19jYXBzIChydHBtcDR2cGF5KTsKKyAgICB9CisgIH0KKworZG9uZToKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0dl9wYXlfZW1wdHkgKEdzdFJ0cE1QNFZQYXkgKiBydHBtcDR2cGF5KQoreworICBnc3RfYWRhcHRlcl9jbGVhciAocnRwbXA0dnBheS0+YWRhcHRlcik7Cit9CisKKyNkZWZpbmUgUlRQX0hFQURFUl9MRU4gMTIKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfbXA0dl9wYXlfZmx1c2ggKEdzdFJ0cE1QNFZQYXkgKiBydHBtcDR2cGF5KQoreworICBndWludCBhdmFpbCwgbXR1OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0QnVmZmVyICpvdXRidWZfZGF0YSA9IE5VTEw7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RCdWZmZXJMaXN0ICpsaXN0ID0gTlVMTDsKKworICAvKiB0aGUgZGF0YSBhdmFpbGFibGUgaW4gdGhlIGFkYXB0ZXIgaXMgZWl0aGVyIHNtYWxsZXIKKyAgICogdGhhbiB0aGUgTVRVIG9yIGJpZ2dlci4gSW4gdGhlIGNhc2UgaXQgaXMgc21hbGxlciwgdGhlIGNvbXBsZXRlCisgICAqIGFkYXB0ZXIgY29udGVudHMgY2FuIGJlIHB1dCBpbiBvbmUgcGFja2V0LiBJbiB0aGUgY2FzZSB0aGUKKyAgICogYWRhcHRlciBoYXMgbW9yZSB0aGFuIG9uZSBNVFUsIHdlIG5lZWQgdG8gc3BsaXQgdGhlIE1QNFYgZGF0YQorICAgKiBvdmVyIG11bHRpcGxlIHBhY2tldHMuICovCisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBtcDR2cGF5LT5hZGFwdGVyKTsKKworICBpZiAocnRwbXA0dnBheS0+Y29uZmlnID09IE5VTEwgJiYgcnRwbXA0dnBheS0+bmVlZF9jb25maWcpIHsKKyAgICAvKiB3aGVuIHdlIGRvbid0IGhhdmUgYSBjb25maWcgeWV0LCBmbHVzaCB0aGluZ3Mgb3V0ICovCisgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHJ0cG1wNHZwYXktPmFkYXB0ZXIsIGF2YWlsKTsKKyAgICBhdmFpbCA9IDA7CisgIH0KKworICBpZiAoIWF2YWlsKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICBtdHUgPSBHU1RfUlRQX0JBU0VfUEFZTE9BRF9NVFUgKHJ0cG1wNHZwYXkpOworCisgIC8qIFVzZSBidWZmZXIgbGlzdHMuIEVhY2ggZnJhbWUgd2lsbCBiZSBwdXQgaW50byBhIGxpc3QKKyAgICogb2YgYnVmZmVycyBhbmQgdGhlIHdob2xlIGxpc3Qgd2lsbCBiZSBwdXNoZWQgZG93bnN0cmVhbQorICAgKiBhdCBvbmNlICovCisgIGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3X3NpemVkICgoYXZhaWwgLyAobXR1IC0gUlRQX0hFQURFUl9MRU4pKSArIDEpOworCisgIHdoaWxlIChhdmFpbCA+IDApIHsKKyAgICBndWludCB0b3dyaXRlOworICAgIGd1aW50IHBheWxvYWRfbGVuOworICAgIGd1aW50IHBhY2tldF9sZW47CisgICAgR3N0UlRQQnVmZmVyIHJ0cCA9IHsgTlVMTCB9OworCisgICAgLyogdGhpcyB3aWxsIGJlIHRoZSB0b3RhbCBsZW5naHQgb2YgdGhlIHBhY2tldCAqLworICAgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKGF2YWlsLCAwLCAwKTsKKworICAgIC8qIGZpbGwgb25lIE1UVSBvciBhbGwgYXZhaWxhYmxlIGJ5dGVzICovCisgICAgdG93cml0ZSA9IE1JTiAocGFja2V0X2xlbiwgbXR1KTsKKworICAgIC8qIHRoaXMgaXMgdGhlIHBheWxvYWQgbGVuZ3RoICovCisgICAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BheWxvYWRfbGVuICh0b3dyaXRlLCAwLCAwKTsKKworICAgIC8qIGNyZWF0ZSBidWZmZXIgd2l0aG91dCBwYXlsb2FkLiBUaGUgcGF5bG9hZCB3aWxsIGJlIHB1dAorICAgICAqIGluIG5leHQgYnVmZmVyIGluc3RlYWQuIEJvdGggYnVmZmVycyB3aWxsIGJlIG1lcmdlZCAqLworICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMCwgMCwgMCk7CisKKyAgICAvKiBUYWtlIGJ1ZmZlciB3aXRoIHRoZSBwYXlsb2FkIGZyb20gdGhlIGFkYXB0ZXIgKi8KKyAgICBvdXRidWZfZGF0YSA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyX2Zhc3QgKHJ0cG1wNHZwYXktPmFkYXB0ZXIsCisgICAgICAgIHBheWxvYWRfbGVuKTsKKworICAgIGF2YWlsIC09IHBheWxvYWRfbGVuOworCisgICAgZ3N0X3J0cF9idWZmZXJfbWFwIChvdXRidWYsIEdTVF9NQVBfV1JJVEUsICZydHApOworICAgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKCZydHAsIGF2YWlsID09IDApOworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwbXA0dnBheSwgb3V0YnVmLCBvdXRidWZfZGF0YSk7CisgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKG91dGJ1Ziwgb3V0YnVmX2RhdGEpOworCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBydHBtcDR2cGF5LT5maXJzdF90aW1lc3RhbXA7CisKKyAgICAvKiBhZGQgdG8gbGlzdCAqLworICAgIGdzdF9idWZmZXJfbGlzdF9pbnNlcnQgKGxpc3QsIC0xLCBvdXRidWYpOworICB9CisKKyAgLyogcHVzaCB0aGUgd2hvbGUgYnVmZmVyIGxpc3QgYXQgb25jZSAqLworICByZXQgPQorICAgICAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfcHVzaF9saXN0IChHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwbXA0dnBheSksIGxpc3QpOworCisgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgVk9TX1NUQVJUQ09ERSAgICAgICAgICAgICAgICAgICAweDAwMDAwMUIwCisjZGVmaW5lIFZPU19FTkRDT0RFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDFCMQorI2RlZmluZSBVU0VSX0RBVEFfU1RBUlRDT0RFICAgICAgICAgICAgIDB4MDAwMDAxQjIKKyNkZWZpbmUgR09QX1NUQVJUQ09ERSAgICAgICAgICAgICAgICAgICAweDAwMDAwMUIzCisjZGVmaW5lIFZJU1VBTF9PQkpFQ1RfU1RBUlRDT0RFICAgICAgICAgMHgwMDAwMDFCNQorI2RlZmluZSBWT1BfU1RBUlRDT0RFICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxQjYKKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX21wNHZfcGF5X2RlcGF5X2RhdGEgKEdzdFJ0cE1QNFZQYXkgKiBlbmMsIGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsCisgICAgZ2ludCAqIHN0cmlwLCBnYm9vbGVhbiAqIHZvcGkpCit7CisgIGd1aW50MzIgY29kZTsKKyAgZ2Jvb2xlYW4gcmVzdWx0OworICAqdm9waSA9IEZBTFNFOworCisgICpzdHJpcCA9IDA7CisKKyAgaWYgKHNpemUgPCA1KQorICAgIHJldHVybiBGQUxTRTsKKworICBjb2RlID0gR1NUX1JFQURfVUlOVDMyX0JFIChkYXRhKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAic3RhcnQgY29kZSAweCUwOHgiLCBjb2RlKTsKKworICBzd2l0Y2ggKGNvZGUpIHsKKyAgICBjYXNlIFZPU19TVEFSVENPREU6CisgICAgY2FzZSAweDAwMDAwMTAxOgorICAgIHsKKyAgICAgIGdpbnQgaTsKKyAgICAgIGd1aW50OCBwcm9maWxlOworICAgICAgZ2Jvb2xlYW4gbmV3cHJvZmlsZSA9IEZBTFNFOworICAgICAgZ2Jvb2xlYW4gZXF1YWw7CisKKyAgICAgIGlmIChjb2RlID09IFZPU19TVEFSVENPREUpIHsKKyAgICAgICAgLyogcHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiAqLworICAgICAgICBwcm9maWxlID0gZGF0YVs0XTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJWT1MgcHJvZmlsZSAweCUwOHgiLCBwcm9maWxlKTsKKworICAgICAgICBpZiAocHJvZmlsZSAhPSBlbmMtPnByb2ZpbGUpIHsKKyAgICAgICAgICBuZXdwcm9maWxlID0gVFJVRTsKKyAgICAgICAgICBlbmMtPnByb2ZpbGUgPSBwcm9maWxlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIHVwIHRvIHRoZSBuZXh0IEdPUF9TVEFSVENPREUgb3IgVk9QX1NUQVJUQ09ERSBpcworICAgICAgICogdGhlIGNvbmZpZyBpbmZvcm1hdGlvbiAqLworICAgICAgY29kZSA9IDB4ZmZmZmZmZmY7CisgICAgICBmb3IgKGkgPSA1OyBpIDwgc2l6ZSAtIDQ7IGkrKykgeworICAgICAgICBjb2RlID0gKGNvZGUgPDwgOCkgfCBkYXRhW2ldOworICAgICAgICBpZiAoY29kZSA9PSBHT1BfU1RBUlRDT0RFIHx8IGNvZGUgPT0gVk9QX1NUQVJUQ09ERSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGkgLT0gMzsKKyAgICAgIC8qIHNlZSBpZiBjb25maWcgY2hhbmdlZCAqLworICAgICAgZXF1YWwgPSBGQUxTRTsKKyAgICAgIGlmIChlbmMtPmNvbmZpZykgeworICAgICAgICBpZiAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZW5jLT5jb25maWcpID09IGkpIHsKKyAgICAgICAgICBlcXVhbCA9IGdzdF9idWZmZXJfbWVtY21wIChlbmMtPmNvbmZpZywgMCwgZGF0YSwgaSkgPT0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogaWYgY29uZmlnIHN0cmluZyBjaGFuZ2VkIG9yIG5ldyBwcm9maWxlLCBtYWtlIG5ldyBjYXBzICovCisgICAgICBpZiAoIWVxdWFsIHx8IG5ld3Byb2ZpbGUpIHsKKyAgICAgICAgaWYgKGVuYy0+Y29uZmlnKQorICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGVuYy0+Y29uZmlnKTsKKyAgICAgICAgZW5jLT5jb25maWcgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGkpOworCisgICAgICAgIGdzdF9idWZmZXJfZmlsbCAoZW5jLT5jb25maWcsIDAsIGRhdGEsIGkpOworCisgICAgICAgIGdzdF9ydHBfbXA0dl9wYXlfbmV3X2NhcHMgKGVuYyk7CisgICAgICB9CisgICAgICAqc3RyaXAgPSBpOworICAgICAgLyogd2UgbmVlZCB0byBmbHVzaCBvdXQgdGhlIGN1cnJlbnQgcGFja2V0LiAqLworICAgICAgcmVzdWx0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFZPUF9TVEFSVENPREU6CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJWT1AiKTsKKyAgICAgIC8qIFZPUCBzdGFydGNvZGUsIHdlIGRvbid0IGhhdmUgdG8gZmx1c2ggdGhlIHBhY2tldCAqLworICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAvKiB2b3AtY29kaW5nLXR5cGUgPT0gSS1mcmFtZSAqLworICAgICAgaWYgKHNpemUgPiA0ICYmIChkYXRhWzRdID4+IDYgPT0gMCkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAiVk9QLUkiKTsKKyAgICAgICAgKnZvcGkgPSBUUlVFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHT1BfU1RBUlRDT0RFOgorICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZW5jLCAiR09QIik7CisgICAgICAqdm9waSA9IFRSVUU7CisgICAgICByZXN1bHQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDAwMDAwMTAwOgorICAgICAgZW5jLT5uZWVkX2NvbmZpZyA9IEZBTFNFOworICAgICAgcmVzdWx0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoY29kZSA+PSAweDIwICYmIGNvZGUgPD0gMHgyZikgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJzaG9ydCBoZWFkZXIiKTsKKyAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChlbmMsICJvdGhlciBzdGFydGNvZGUiKTsKKyAgICAgICAgLyogYWxsIG90aGVyIHN0YXJ0Y29kZXMgbmVlZCBhIGZsdXNoICovCisgICAgICAgIHJlc3VsdCA9IFRSVUU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKiB3ZSBleHBlY3QgYnVmZmVycyBzdGFydGluZyBvbiBzdGFydGNvZGVzLiAKKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfbXA0dl9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJ0cE1QNFZQYXkgKnJ0cG1wNHZwYXk7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludCBhdmFpbDsKKyAgZ3VpbnQgcGFja2V0X2xlbjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdzaXplIHNpemU7CisgIGdib29sZWFuIGZsdXNoOworICBnaW50IHN0cmlwOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBkdXJhdGlvbjsKKyAgZ2Jvb2xlYW4gdm9waTsKKyAgZ2Jvb2xlYW4gc2VuZF9jb25maWc7CisKKyAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgIHNlbmRfY29uZmlnID0gRkFMU0U7CisKKyAgcnRwbXA0dnBheSA9IEdTVF9SVFBfTVA0Vl9QQVkgKGJhc2VwYXlsb2FkKTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBzaXplID0gbWFwLnNpemU7CisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBtcDR2cGF5LT5hZGFwdGVyKTsKKworICBpZiAoZHVyYXRpb24gPT0gLTEpCisgICAgZHVyYXRpb24gPSAwOworCisgIC8qIGVtcHR5IGJ1ZmZlciwgdGFrZSB0aW1lc3RhbXAgKi8KKyAgaWYgKGF2YWlsID09IDApIHsKKyAgICBydHBtcDR2cGF5LT5maXJzdF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgcnRwbXA0dnBheS0+ZHVyYXRpb24gPSAwOworICB9CisKKyAgLyogZGVwYXkgaW5jb21taW5nIGRhdGEgYW5kIHNlZSBpZiB3ZSBuZWVkIHRvIHN0YXJ0IGEgbmV3IFJUUAorICAgKiBwYWNrZXQgKi8KKyAgZmx1c2ggPQorICAgICAgZ3N0X3J0cF9tcDR2X3BheV9kZXBheV9kYXRhIChydHBtcDR2cGF5LCBtYXAuZGF0YSwgc2l6ZSwgJnN0cmlwLCAmdm9waSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgaWYgKHN0cmlwKSB7CisgICAgLyogc3RyaXAgb2ZmIGNvbmZpZyBpZiByZXF1ZXN0ZWQgKi8KKyAgICBpZiAoIShydHBtcDR2cGF5LT5jb25maWdfaW50ZXJ2YWwgPiAwKSkgeworICAgICAgR3N0QnVmZmVyICpzdWJidWY7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcDR2cGF5LCAic3RyaXBwaW5nIGNvbmZpZyBhdCAlZCwgc2l6ZSAlZCIsIHN0cmlwLAorICAgICAgICAgIChnaW50KSBzaXplIC0gc3RyaXApOworCisgICAgICAvKiBzdHJpcCBvZmYgaGVhZGVyICovCisgICAgICBzdWJidWYgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIHN0cmlwLAorICAgICAgICAgIHNpemUgLSBzdHJpcCk7CisgICAgICBHU1RfQlVGRkVSX1BUUyAoc3ViYnVmKSA9IHRpbWVzdGFtcDsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgICBidWZmZXIgPSBzdWJidWY7CisKKyAgICAgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwbXA0dnBheSwgImZvdW5kIGNvbmZpZyBpbiBzdHJlYW0iKTsKKyAgICAgIHJ0cG1wNHZwYXktPmxhc3RfY29uZmlnID0gdGltZXN0YW1wOworICAgIH0KKyAgfQorCisgIC8qIHRoZXJlIGlzIGEgY29uZmlnIHJlcXVlc3QsIHNlZSBpZiB3ZSBuZWVkIHRvIGluc2VydCBpdCAqLworICBpZiAodm9waSAmJiAocnRwbXA0dnBheS0+Y29uZmlnX2ludGVydmFsID4gMCkgJiYgcnRwbXA0dnBheS0+Y29uZmlnKSB7CisgICAgaWYgKHJ0cG1wNHZwYXktPmxhc3RfY29uZmlnICE9IC0xKSB7CisgICAgICBndWludDY0IGRpZmY7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcDR2cGF5LAorICAgICAgICAgICJub3cgJSIgR1NUX1RJTUVfRk9STUFUICIsIGxhc3QgVk9QLUkgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCksIEdTVF9USU1FX0FSR1MgKHJ0cG1wNHZwYXktPmxhc3RfY29uZmlnKSk7CisKKyAgICAgIC8qIGNhbGN1bGF0ZSBkaWZmIGJldHdlZW4gbGFzdCBjb25maWcgaW4gbWlsbGlzZWNvbmRzICovCisgICAgICBpZiAodGltZXN0YW1wID4gcnRwbXA0dnBheS0+bGFzdF9jb25maWcpIHsKKyAgICAgICAgZGlmZiA9IHRpbWVzdGFtcCAtIHJ0cG1wNHZwYXktPmxhc3RfY29uZmlnOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGlmZiA9IDA7CisgICAgICB9CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cG1wNHZwYXksCisgICAgICAgICAgImludGVydmFsIHNpbmNlIGxhc3QgY29uZmlnICUiIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAoZGlmZikpOworCisgICAgICAvKiBiaWdnZXIgdGhhbiBpbnRlcnZhbCwgcXVldWUgY29uZmlnICovCisgICAgICAvKiBGSVhNRSBzaG91bGQgY29udmVydCB0aW1lc3RhbXBzIHRvIHJ1bm5pbmcgdGltZSAqLworICAgICAgaWYgKEdTVF9USU1FX0FTX1NFQ09ORFMgKGRpZmYpID49IHJ0cG1wNHZwYXktPmNvbmZpZ19pbnRlcnZhbCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcDR2cGF5LCAidGltZSB0byBzZW5kIGNvbmZpZyIpOworICAgICAgICBzZW5kX2NvbmZpZyA9IFRSVUU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIG5vIGtub3duIHByZXZpb3VzIGNvbmZpZyB0aW1lLCBzZW5kIG5vdyAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXA0dnBheSwgIm5vIHByZXZpb3VzIGNvbmZpZyB0aW1lLCBzZW5kIG5vdyIpOworICAgICAgc2VuZF9jb25maWcgPSBUUlVFOworICAgIH0KKworICAgIGlmIChzZW5kX2NvbmZpZykgeworICAgICAgLyogd2UgbmVlZCB0byBzZW5kIGNvbmZpZyBub3cgZmlyc3QgKi8KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcDR2cGF5LCAiaW5zZXJ0aW5nIGNvbmZpZyBpbiBzdHJlYW0iKTsKKworICAgICAgLyogaW5zZXJ0IGhlYWRlciAqLworICAgICAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKGdzdF9idWZmZXJfcmVmIChydHBtcDR2cGF5LT5jb25maWcpLCBidWZmZXIpOworCisgICAgICBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKSA9IHRpbWVzdGFtcDsKKyAgICAgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworCisgICAgICBpZiAodGltZXN0YW1wICE9IC0xKSB7CisgICAgICAgIHJ0cG1wNHZwYXktPmxhc3RfY29uZmlnID0gdGltZXN0YW1wOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGlmIHdlIG5lZWQgdG8gZmx1c2gsIGRvIHNvIG5vdyAqLworICBpZiAoZmx1c2gpIHsKKyAgICByZXQgPSBnc3RfcnRwX21wNHZfcGF5X2ZsdXNoIChydHBtcDR2cGF5KTsKKyAgICBydHBtcDR2cGF5LT5maXJzdF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgcnRwbXA0dnBheS0+ZHVyYXRpb24gPSAwOworICAgIGF2YWlsID0gMDsKKyAgfQorCisgIC8qIGdldCBwYWNrZXQgbGVuZ3RoIG9mIGRhdGEgYW5kIHNlZSBpZiB3ZSBleGNlZWRlZCBNVFUuICovCisgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKGF2YWlsICsgc2l6ZSwgMCwgMCk7CisKKyAgaWYgKGdzdF9ydHBfYmFzZV9wYXlsb2FkX2lzX2ZpbGxlZCAoYmFzZXBheWxvYWQsCisgICAgICAgICAgcGFja2V0X2xlbiwgcnRwbXA0dnBheS0+ZHVyYXRpb24gKyBkdXJhdGlvbikpIHsKKyAgICByZXQgPSBnc3RfcnRwX21wNHZfcGF5X2ZsdXNoIChydHBtcDR2cGF5KTsKKyAgICBydHBtcDR2cGF5LT5maXJzdF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgcnRwbXA0dnBheS0+ZHVyYXRpb24gPSAwOworICB9CisKKyAgLyogcHVzaCBuZXcgZGF0YSAqLworICBnc3RfYWRhcHRlcl9wdXNoIChydHBtcDR2cGF5LT5hZGFwdGVyLCBidWZmZXIpOworCisgIHJ0cG1wNHZwYXktPmR1cmF0aW9uICs9IGR1cmF0aW9uOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcDR2X3BheV9zaW5rX2V2ZW50IChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheSwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwTVA0VlBheSAqcnRwbXA0dnBheTsKKworICBydHBtcDR2cGF5ID0gR1NUX1JUUF9NUDRWX1BBWSAocGF5KTsKKworICBHU1RfREVCVUcgKCJHb3QgZXZlbnQ6ICVzIiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIC8qIFRoaXMgZmx1c2ggY2FsbCBtYWtlcyBzdXJlIHRoYXQgdGhlIGxhc3QgYnVmZmVyIGlzIGFsd2F5cyBwdXNoZWQKKyAgICAgICAqIHRvIHRoZSBiYXNlIHBheWxvYWRlciAqLworICAgICAgZ3N0X3J0cF9tcDR2X3BheV9mbHVzaCAocnRwbXA0dnBheSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X3J0cF9tcDR2X3BheV9lbXB0eSAocnRwbXA0dnBheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBsZXQgcGFyZW50IGhhbmRsZSBldmVudCB0b28gKi8KKyAgcmV0dXJuIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChwYXksIGV2ZW50KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXA0dl9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cE1QNFZQYXkgKnJ0cG1wNHZwYXk7CisKKyAgcnRwbXA0dnBheSA9IEdTVF9SVFBfTVA0Vl9QQVkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0NPTkZJR19JTlRFUlZBTDoKKyAgICAgIHJ0cG1wNHZwYXktPmNvbmZpZ19pbnRlcnZhbCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcDR2X3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwTVA0VlBheSAqcnRwbXA0dnBheTsKKworICBydHBtcDR2cGF5ID0gR1NUX1JUUF9NUDRWX1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ09ORklHX0lOVEVSVkFMOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0cG1wNHZwYXktPmNvbmZpZ19pbnRlcnZhbCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfbXA0dl9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBtcDR2cGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX01QNFZfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXA0dnBheS5oIGIvZ3N0L3J0cC9nc3RydHBtcDR2cGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3NGE5MQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXA0dnBheS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9NUDRWX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX01QNFZfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZXBheWxvYWQuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfTVA0Vl9QQVkgXAorICAoZ3N0X3J0cF9tcDR2X3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX01QNFZfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX01QNFZfUEFZLEdzdFJ0cE1QNFZQYXkpKQorI2RlZmluZSBHU1RfUlRQX01QNFZfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUDRWX1BBWSxHc3RSdHBNUDRWUGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QNFZfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX01QNFZfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUDRWX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTVA0Vl9QQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTVA0VlBheSBHc3RSdHBNUDRWUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cE1QNFZQYXlDbGFzcyBHc3RSdHBNUDRWUGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTVA0VlBheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCAgICBwYXlsb2FkOworCisgIEdzdEFkYXB0ZXIgICAqYWRhcHRlcjsKKyAgR3N0Q2xvY2tUaW1lICBmaXJzdF90aW1lc3RhbXA7CisgIEdzdENsb2NrVGltZSAgZHVyYXRpb247CisKKyAgZ2ludCAgICAgICAgICByYXRlOworICBnaW50ICAgICAgICAgIHByb2ZpbGU7CisgIEdzdEJ1ZmZlciAgICAqY29uZmlnOworICBnYm9vbGVhbiAgICAgIHNlbmRfY29uZmlnOworICBnYm9vbGVhbiAgICAgIG5lZWRfY29uZmlnOworCisgIC8qIG5hbWluZyBtaWdodCBiZSBjb25mdXNpbmcgd2l0aCBzZW5kX2NvbmZpZzsgYnV0IG5hbWluZyBtYXRjaGVzIGgyNjQKKyAgICogcGF5bG9hZGVyICovCisgIGd1aW50ICAgICAgICAgY29uZmlnX2ludGVydmFsOworICBHc3RDbG9ja1RpbWUgIGxhc3RfY29uZmlnOworfTsKKworc3RydWN0IF9Hc3RSdHBNUDRWUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX21wNHZfcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9tcDR2X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9NUDRWX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwbXBhZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODUwNmRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5jCkBAIC0wLDAgKzEsMTgxIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0cnRwbXBhZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBtcGFkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwbXBhZGVwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX21wYV9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL21wZWcsICIgIm1wZWd2ZXJzaW9uID0gKGludCkgMSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXBhX2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX01QQV9TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwIDsiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIk1QQVwiLCBjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWF0iKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF9tcGFfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwTVBBRGVwYXksIGdzdF9ydHBfbXBhX2RlcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tcGFfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX21wYV9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wYV9kZXBheV9jbGFzc19pbml0IChHc3RSdHBNUEFEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBtcGFkZXBheV9kZWJ1ZywgInJ0cG1wYWRlcGF5IiwgMCwKKyAgICAgICJNUEVHIEF1ZGlvIFJUUCBEZXBheWxvYWRlciIpOworCisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX21wYV9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX21wYV9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBNUEVHIGF1ZGlvIGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBNUEVHIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKFJGQyAyMDM4KSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfbXBhX2RlcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfbXBhX2RlcGF5X3Byb2Nlc3M7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wYV9kZXBheV9pbml0IChHc3RSdHBNUEFEZXBheSAqIHJ0cG1wYWRlcGF5KQoreworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXBhX2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR3N0Q2FwcyAqb3V0Y2FwczsKKyAgZ2ludCBjbG9ja19yYXRlOworICBnYm9vbGVhbiByZXM7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDkwMDAwOworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIG91dGNhcHMgPQorICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL21wZWciLCAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoZGVwYXlsb2FkLT5zcmNwYWQsIG91dGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAob3V0Y2Fwcyk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX21wYV9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cE1QQURlcGF5ICpydHBtcGFkZXBheTsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIGdpbnQgcGF5bG9hZF9sZW47CisjaWYgMAorICBndWludDggKnBheWxvYWQ7CisgIGd1aW50MTYgZnJhZ19vZmZzZXQ7CisjZW5kaWYKKyAgZ2Jvb2xlYW4gbWFya2VyOworCisgIHJ0cG1wYWRlcGF5ID0gR1NUX1JUUF9NUEFfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisKKyAgaWYgKHBheWxvYWRfbGVuIDw9IDQpCisgICAgZ290byBlbXB0eV9wYWNrZXQ7CisKKyNpZiAwCisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisgIC8qIHN0cmlwIG9mZiBoZWFkZXIKKyAgICoKKyAgICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgIE1CWiAgICAgICAgICAgICAgIHwgICAgICAgICAgRnJhZ19vZmZzZXQgICAgICAgICAgfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKi8KKyAgZnJhZ19vZmZzZXQgPSAocGF5bG9hZFsyXSA8PCA4KSB8IHBheWxvYWRbM107CisjZW5kaWYKKworICAvKiBzdWJidWZmZXIgc2tpcHBpbmcgdGhlIDQgaGVhZGVyIGJ5dGVzICovCisgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3N1YmJ1ZmZlciAocnRwLCA0LCAtMSk7CisgIG1hcmtlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCk7CisKKyAgaWYgKG1hcmtlcikgeworICAgIC8qIG1hcmsgc3RhcnQgb2YgdGFsa3NwdXJ0IHdpdGggUkVTWU5DICovCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfUkVTWU5DKTsKKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChydHBtcGFkZXBheSwKKyAgICAgICJnc3RfcnRwX21wYV9kZXBheV9jaGFpbjogcHVzaGluZyBidWZmZXIgb2Ygc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCAiIiwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZikpOworCisgIGlmIChvdXRidWYpIHsKKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKHJ0cG1wYWRlcGF5LCBvdXRidWYpOworICB9CisKKyAgLyogRklYTUUsIHdlIGNhbiBwdXNoIGhhbGYgbXBlZyBmcmFtZXMgd2hlbiB0aGV5IGFyZSBzcGxpdCBvdmVyIG11bHRpcGxlCisgICAqIFJUUCBwYWNrZXRzICovCisgIHJldHVybiBvdXRidWY7CisKKyAgLyogRVJST1JTICovCitlbXB0eV9wYWNrZXQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBtcGFkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgICgiRW1wdHkgUGF5bG9hZC4iKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF9tcGFfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBtcGFkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9NUEFfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBtcGFkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNzBkNzcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG1wYWRlcGF5LmgKQEAgLTAsMCArMSw1OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX01QQV9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX01QQV9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9NUEFfREVQQVkgXAorICAoZ3N0X3J0cF9tcGFfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9NUEFfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfTVBBX0RFUEFZLEdzdFJ0cE1QQURlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9NUEFfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX01QQV9ERVBBWSxHc3RSdHBNUEFEZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUEFfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfTVBBX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUEFfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX01QQV9ERVBBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBNUEFEZXBheSBHc3RSdHBNUEFEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBNUEFEZXBheUNsYXNzIEdzdFJ0cE1QQURlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTVBBRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cE1QQURlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfbXBhX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9tcGFfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfTVBBX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBtcGFwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwbXBhcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlmYThhOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXBhcGF5LmMKQEAgLTAsMCArMSwzNDMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgImdzdHJ0cG1wYXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cG1wYXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwbXBhcGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9tcGFfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8vbXBlZywgIiAibXBlZ3ZlcnNpb24gPSAoaW50KSAxIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9tcGFfcGF5X3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX01QQV9TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwOyAiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIk1QQVwiIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX21wYV9wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9tcGFfcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX21wYV9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX21wYV9wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9tcGFfcGF5X2ZsdXNoIChHc3RSdHBNUEFQYXkgKiBydHBtcGFwYXkpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9tcGFfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworCisjZGVmaW5lIGdzdF9ydHBfbXBhX3BheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBNUEFQYXksIGdzdF9ydHBfbXBhX3BheSwgR1NUX1RZUEVfUlRQX0JBU0VfUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wYV9wYXlfY2xhc3NfaW5pdCAoR3N0UnRwTVBBUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBtcGFwYXlfZGVidWcsICJydHBtcGFwYXkiLCAwLAorICAgICAgIk1QRUcgQXVkaW8gUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9tcGFfcGF5X2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfbXBhX3BheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcGFfcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXBhX3BheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBNUEVHIGF1ZGlvIHBheWxvYWRlciIsICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQgTVBFRyBhdWRpbyBhcyBSVFAgcGFja2V0cyAoUkZDIDIwMzgpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfbXBhX3BheV9zZXRjYXBzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2lua19ldmVudCA9IGdzdF9ydHBfbXBhX3BheV9zaW5rX2V2ZW50OworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9IGdzdF9ydHBfbXBhX3BheV9oYW5kbGVfYnVmZmVyOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcGFfcGF5X2luaXQgKEdzdFJ0cE1QQVBheSAqIHJ0cG1wYXBheSkKK3sKKyAgcnRwbXBhcGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworCisgIEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBtcGFwYXkpLT5wdCA9IEdTVF9SVFBfUEFZTE9BRF9NUEE7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wYV9wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cE1QQVBheSAqcnRwbXBhcGF5OworCisgIHJ0cG1wYXBheSA9IEdTVF9SVFBfTVBBX1BBWSAob2JqZWN0KTsKKworICBnX29iamVjdF91bnJlZiAocnRwbXBhcGF5LT5hZGFwdGVyKTsKKyAgcnRwbXBhcGF5LT5hZGFwdGVyID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wYV9wYXlfcmVzZXQgKEdzdFJ0cE1QQVBheSAqIHBheSkKK3sKKyAgcGF5LT5maXJzdF90cyA9IC0xOworICBwYXktPmR1cmF0aW9uID0gMDsKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHBheS0+YWRhcHRlcik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBheSwgInJlc2V0IGRlcGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcGFfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIGdib29sZWFuIHJlczsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocGF5bG9hZCwgImF1ZGlvIiwKKyAgICAgIHBheWxvYWQtPnB0ICE9IEdTVF9SVFBfUEFZTE9BRF9NUEEsICJNUEEiLCA5MDAwMCk7CisgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXlsb2FkLCBOVUxMKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXBhX3BheV9zaW5rX2V2ZW50IChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJldDsKKyAgR3N0UnRwTVBBUGF5ICpydHBtcGFwYXk7CisKKyAgcnRwbXBhcGF5ID0gR1NUX1JUUF9NUEFfUEFZIChwYXlsb2FkKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgICAvKiBtYWtlIHN1cmUgd2UgcHVzaCB0aGUgbGFzdCBwYWNrZXRzIGluIHRoZSBhZGFwdGVyIG9uIEVPUyAqLworICAgICAgZ3N0X3J0cF9tcGFfcGF5X2ZsdXNoIChydHBtcGFwYXkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9ydHBfbXBhX3BheV9yZXNldCAocnRwbXBhcGF5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChwYXlsb2FkLCBldmVudCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBSVFBfSEVBREVSX0xFTiAxMgorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9tcGFfcGF5X2ZsdXNoIChHc3RSdHBNUEFQYXkgKiBydHBtcGFwYXkpCit7CisgIGd1aW50IGF2YWlsOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIGd1aW50MTYgZnJhZ19vZmZzZXQ7CisgIEdzdEJ1ZmZlckxpc3QgKmxpc3Q7CisKKyAgLyogdGhlIGRhdGEgYXZhaWxhYmxlIGluIHRoZSBhZGFwdGVyIGlzIGVpdGhlciBzbWFsbGVyCisgICAqIHRoYW4gdGhlIE1UVSBvciBiaWdnZXIuIEluIHRoZSBjYXNlIGl0IGlzIHNtYWxsZXIsIHRoZSBjb21wbGV0ZQorICAgKiBhZGFwdGVyIGNvbnRlbnRzIGNhbiBiZSBwdXQgaW4gb25lIHBhY2tldC4gSW4gdGhlIGNhc2UgdGhlCisgICAqIGFkYXB0ZXIgaGFzIG1vcmUgdGhhbiBvbmUgTVRVLCB3ZSBuZWVkIHRvIHNwbGl0IHRoZSBNUEEgZGF0YQorICAgKiBvdmVyIG11bHRpcGxlIHBhY2tldHMuIFRoZSBmcmFnX29mZnNldCBpbiBlYWNoIHBhY2tldCBoZWFkZXIKKyAgICogbmVlZHMgdG8gYmUgdXBkYXRlZCB3aXRoIHRoZSBwb3NpdGlvbiBpbiB0aGUgTVBBIGZyYW1lLiAqLworICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwbXBhcGF5LT5hZGFwdGVyKTsKKworICByZXQgPSBHU1RfRkxPV19PSzsKKworICBsaXN0ID0KKyAgICAgIGdzdF9idWZmZXJfbGlzdF9uZXdfc2l6ZWQgKGF2YWlsIC8gKEdTVF9SVFBfQkFTRV9QQVlMT0FEX01UVSAocnRwbXBhcGF5KSAtCisgICAgICAgICAgUlRQX0hFQURFUl9MRU4pICsgMSk7CisKKyAgZnJhZ19vZmZzZXQgPSAwOworICB3aGlsZSAoYXZhaWwgPiAwKSB7CisgICAgZ3VpbnQgdG93cml0ZTsKKyAgICBndWludDggKnBheWxvYWQ7CisgICAgZ3VpbnQgcGF5bG9hZF9sZW47CisgICAgZ3VpbnQgcGFja2V0X2xlbjsKKyAgICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisgICAgR3N0QnVmZmVyICpwYXlidWY7CisKKyAgICAvKiB0aGlzIHdpbGwgYmUgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgcGFja2V0ICovCisgICAgcGFja2V0X2xlbiA9IGdzdF9ydHBfYnVmZmVyX2NhbGNfcGFja2V0X2xlbiAoNCArIGF2YWlsLCAwLCAwKTsKKworICAgIC8qIGZpbGwgb25lIE1UVSBvciBhbGwgYXZhaWxhYmxlIGJ5dGVzICovCisgICAgdG93cml0ZSA9IE1JTiAocGFja2V0X2xlbiwgR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChydHBtcGFwYXkpKTsKKworICAgIC8qIHRoaXMgaXMgdGhlIHBheWxvYWQgbGVuZ3RoICovCisgICAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BheWxvYWRfbGVuICh0b3dyaXRlLCAwLCAwKTsKKworICAgIC8qIGNyZWF0ZSBidWZmZXIgdG8gaG9sZCB0aGUgcGF5bG9hZCAqLworICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoNCwgMCwgMCk7CisKKyAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKG91dGJ1ZiwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisKKyAgICBwYXlsb2FkX2xlbiAtPSA0OworCisgICAgZ3N0X3J0cF9idWZmZXJfc2V0X3BheWxvYWRfdHlwZSAoJnJ0cCwgR1NUX1JUUF9QQVlMT0FEX01QQSk7CisKKyAgICAvKgorICAgICAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICogfCAgICAgICAgICAgICBNQlogICAgICAgICAgICAgICB8ICAgICAgICAgIEZyYWdfb2Zmc2V0ICAgICAgICAgIHwKKyAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqLworICAgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisgICAgcGF5bG9hZFswXSA9IDA7CisgICAgcGF5bG9hZFsxXSA9IDA7CisgICAgcGF5bG9hZFsyXSA9IGZyYWdfb2Zmc2V0ID4+IDg7CisgICAgcGF5bG9hZFszXSA9IGZyYWdfb2Zmc2V0ICYgMHhmZjsKKworICAgIGF2YWlsIC09IHBheWxvYWRfbGVuOworICAgIGZyYWdfb2Zmc2V0ICs9IHBheWxvYWRfbGVuOworCisgICAgaWYgKGF2YWlsID09IDApCisgICAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBUUlVFKTsKKworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAgIHBheWJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyX2Zhc3QgKHJ0cG1wYXBheS0+YWRhcHRlciwgcGF5bG9hZF9sZW4pOworICAgIGdzdF9ydHBfY29weV9hdWRpb19tZXRhIChydHBtcGFwYXksIG91dGJ1ZiwgcGF5YnVmKTsKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAob3V0YnVmLCBwYXlidWYpOworCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBydHBtcGFwYXktPmZpcnN0X3RzOworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPSBydHBtcGFwYXktPmR1cmF0aW9uOworICAgIGdzdF9idWZmZXJfbGlzdF9hZGQgKGxpc3QsIG91dGJ1Zik7CisgIH0KKworICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoX2xpc3QgKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBtcGFwYXkpLCBsaXN0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9tcGFfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBNUEFQYXkgKnJ0cG1wYXBheTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIGd1aW50IHNpemUsIGF2YWlsOworICBndWludCBwYWNrZXRfbGVuOworICBHc3RDbG9ja1RpbWUgZHVyYXRpb24sIHRpbWVzdGFtcDsKKworICBydHBtcGFwYXkgPSBHU1RfUlRQX01QQV9QQVkgKGJhc2VwYXlsb2FkKTsKKworICBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKTsKKyAgZHVyYXRpb24gPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpOworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKworICBpZiAoR1NUX0JVRkZFUl9JU19ESVNDT05UIChidWZmZXIpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXBhcGF5LCAiRElTQ09OVCIpOworICAgIGdzdF9ydHBfbXBhX3BheV9yZXNldCAocnRwbXBhcGF5KTsKKyAgfQorCisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBtcGFwYXktPmFkYXB0ZXIpOworCisgIC8qIGdldCBwYWNrZXQgbGVuZ3RoIG9mIHByZXZpb3VzIGRhdGEgYW5kIHRoaXMgbmV3IGRhdGEsCisgICAqIHBheWxvYWQgbGVuZ3RoIGluY2x1ZGVzIGEgNCBieXRlIGhlYWRlciAqLworICBwYWNrZXRfbGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYWNrZXRfbGVuICg0ICsgYXZhaWwgKyBzaXplLCAwLCAwKTsKKworICAvKiBpZiB0aGlzIGJ1ZmZlciBpcyBnb2luZyB0byBvdmVyZmxvdyB0aGUgcGFja2V0LCBmbHVzaCB3aGF0IHdlCisgICAqIGhhdmUuICovCisgIGlmIChnc3RfcnRwX2Jhc2VfcGF5bG9hZF9pc19maWxsZWQgKGJhc2VwYXlsb2FkLAorICAgICAgICAgIHBhY2tldF9sZW4sIHJ0cG1wYXBheS0+ZHVyYXRpb24gKyBkdXJhdGlvbikpIHsKKyAgICByZXQgPSBnc3RfcnRwX21wYV9wYXlfZmx1c2ggKHJ0cG1wYXBheSk7CisgICAgYXZhaWwgPSAwOworICB9IGVsc2UgeworICAgIHJldCA9IEdTVF9GTE9XX09LOworICB9CisKKyAgaWYgKGF2YWlsID09IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcGFwYXksCisgICAgICAgICJmaXJzdCBwYWNrZXQsIHNhdmUgdGltZXN0YW1wICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisgICAgcnRwbXBhcGF5LT5maXJzdF90cyA9IHRpbWVzdGFtcDsKKyAgICBydHBtcGFwYXktPmR1cmF0aW9uID0gMDsKKyAgfQorCisgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cG1wYXBheS0+YWRhcHRlciwgYnVmZmVyKTsKKyAgcnRwbXBhcGF5LT5kdXJhdGlvbiA9IGR1cmF0aW9uOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9tcGFfcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cE1QQVBheSAqcnRwbXBhcGF5OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwbXBhcGF5ID0gR1NUX1JUUF9NUEFfUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X3J0cF9tcGFfcGF5X3Jlc2V0IChydHBtcGFwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfbXBhX3BheV9yZXNldCAocnRwbXBhcGF5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9tcGFfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwbXBhcGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX01QQV9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBtcGFwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwbXBhcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyOTg1MgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXBhcGF5LmgKQEAgLTAsMCArMSw2MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX01QQV9QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9NUEFfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZXBheWxvYWQuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfTVBBX1BBWSBcCisgIChnc3RfcnRwX21wYV9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9NUEFfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX01QQV9QQVksR3N0UnRwTVBBUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9NUEFfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUEFfUEFZLEdzdFJ0cE1QQVBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUEFfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX01QQV9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QQV9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX01QQV9QQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwTVBBUGF5IEdzdFJ0cE1QQVBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBNUEFQYXlDbGFzcyBHc3RSdHBNUEFQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBNUEFQYXkKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWQgcGF5bG9hZDsKKworICBHc3RBZGFwdGVyICphZGFwdGVyOworICBHc3RDbG9ja1RpbWUgZmlyc3RfdHM7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKK307CisKK3N0cnVjdCBfR3N0UnRwTVBBUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX21wYV9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX21wYV9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfTVBBX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDJkMmIwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBtcGFyb2J1c3RkZXBheS5jCkBAIC0wLDAgKzEsODExIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMTA+IE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSA8MjAxMD4gTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdzdHJ0cG1wYXJvYnVzdGRlcGF5LmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cG1wYXJvYnVzdGRlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBtcGFyb2J1c3RkZXBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL21wZWcsICIgIm1wZWd2ZXJzaW9uID0gKGludCkgMSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTVBBLVJPQlVTVFwiICIgIjsgIgorICAgICAgICAvKiBkcmFmdCB2ZXJzaW9ucyBhcHBlYXIgc3RpbGwgaW4gdXNlIG91dCB0aGVyZSAqLworICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWF0sICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSB7IFwiWC1NUDMtRFJBRlQtMDBcIiwgXCJYLU1QMy1EUkFGVC0wMVwiLCAiCisgICAgICAgICIgXCJYLU1QMy1EUkFGVC0wMlwiLCBcIlgtTVAzLURSQUZULTAzXCIsIFwiWC1NUDMtRFJBRlQtMDRcIiwgIgorICAgICAgICAiIFwiWC1NUDMtRFJBRlQtMDVcIiwgXCJYLU1QMy1EUkFGVC0wNlwiIH0iKQorICAgICk7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBRFVGcmFtZQoreworICBndWludDMyIGhlYWRlcjsKKyAgZ2ludCBzaXplOworICBnaW50IHNpZGVfaW5mbzsKKyAgZ2ludCBkYXRhX3NpemU7CisgIGdpbnQgbGF5ZXI7CisgIGdpbnQgYmFja3BvaW50ZXI7CisKKyAgR3N0QnVmZmVyICpidWZmZXI7Cit9IEdzdEFEVUZyYW1lOworCisjZGVmaW5lIGdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBNUEFSb2J1c3REZXBheSwgZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX21wYV9yb2J1c3RfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICoKKyAgICBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICoKKyAgICBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cE1QQVJvYnVzdERlcGF5ICpydHBtcGFkZXBheTsKKworICBydHBtcGFkZXBheSA9IChHc3RSdHBNUEFSb2J1c3REZXBheSAqKSBvYmplY3Q7CisKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cG1wYWRlcGF5LT5hZGFwdGVyKTsKKyAgZ19xdWV1ZV9mcmVlIChydHBtcGFkZXBheS0+YWR1X2ZyYW1lcyk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cE1QQVJvYnVzdERlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwbXBhcm9idXN0ZGVwYXlfZGVidWcsICJydHBtcGFyb2J1c3RkZXBheSIsIDAsCisgICAgICAiUm9idXN0IE1QRUcgQXVkaW8gUlRQIERlcGF5bG9hZGVyIik7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9maW5hbGl6ZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfbXBhX3JvYnVzdF9jaGFuZ2Vfc3RhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgTVBFRyBhdWRpbyBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgTVBFRyBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgNTIxOSkiLAorICAgICAgIk1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPiIpOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9CisgICAgICBnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfcHJvY2VzczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9pbml0IChHc3RSdHBNUEFSb2J1c3REZXBheSAqIHJ0cG1wYWRlcGF5KQoreworICBydHBtcGFkZXBheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKyAgcnRwbXBhZGVwYXktPmFkdV9mcmFtZXMgPSBnX3F1ZXVlX25ldyAoKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UnRwTVBBUm9idXN0RGVwYXkgKnJ0cG1wYWRlcGF5OworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR3N0Q2FwcyAqb3V0Y2FwczsKKyAgZ2ludCBjbG9ja19yYXRlLCBkcmFmdDsKKyAgZ2Jvb2xlYW4gcmVzOworICBjb25zdCBnY2hhciAqZW5jb2Rpbmc7CisKKyAgcnRwbXBhZGVwYXkgPSBHU1RfUlRQX01QQV9ST0JVU1RfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDkwMDAwOworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIHJ0cG1wYWRlcGF5LT5oYXNfZGVzY3JpcHRvciA9IFRSVUU7CisgIGlmICgoZW5jb2RpbmcgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImVuY29kaW5nLW5hbWUiKSkpIHsKKyAgICBpZiAoc3NjYW5mIChlbmNvZGluZywgIlgtTVAzLURSQUZULSVkIiwgJmRyYWZ0KSAmJiAoZHJhZnQgPT0gMCkpCisgICAgICBydHBtcGFkZXBheS0+aGFzX2Rlc2NyaXB0b3IgPSBGQUxTRTsKKyAgfQorCisgIG91dGNhcHMgPQorICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL21wZWciLCAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoZGVwYXlsb2FkLT5zcmNwYWQsIG91dGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAob3V0Y2Fwcyk7CisKKyAgcmV0dXJuIHJlczsKK30KKworLyogdGhhbmtzIGFnYWluIGdvIHRvIG1wM3BhcnNlIC4uLiAqLworCitzdGF0aWMgY29uc3QgZ3VpbnQgbXAzdHlwZXNfYml0cmF0ZXNbMl1bM11bMTZdID0geworICB7CisgICAgICAgIHswLCAzMiwgNjQsIDk2LCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OCx9LAorICAgICAgICB7MCwgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAzODQsfSwKKyAgICAgICAgezAsIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAsfQorICAgICAgfSwKKyAgeworICAgICAgICB7MCwgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwLCAxNzYsIDE5MiwgMjI0LCAyNTYsfSwKKyAgICAgICAgezAsIDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MCx9LAorICAgICAgICB7MCwgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwLH0KKyAgICAgIH0sCit9OworCitzdGF0aWMgY29uc3QgZ3VpbnQgbXAzdHlwZXNfZnJlcXNbM11bM10gPSB7IHs0NDEwMCwgNDgwMDAsIDMyMDAwfSwKK3syMjA1MCwgMjQwMDAsIDE2MDAwfSwKK3sxMTAyNSwgMTIwMDAsIDgwMDB9Cit9OworCitzdGF0aWMgaW5saW5lIGd1aW50CittcDNfdHlwZV9mcmFtZV9sZW5ndGhfZnJvbV9oZWFkZXIgKEdzdEVsZW1lbnQgKiBtcDNwYXJzZSwgZ3VpbnQzMiBoZWFkZXIsCisgICAgZ3VpbnQgKiBwdXRfdmVyc2lvbiwgZ3VpbnQgKiBwdXRfbGF5ZXIsIGd1aW50ICogcHV0X2NoYW5uZWxzLAorICAgIGd1aW50ICogcHV0X2JpdHJhdGUsIGd1aW50ICogcHV0X3NhbXBsZXJhdGUsIGd1aW50ICogcHV0X21vZGUsCisgICAgZ3VpbnQgKiBwdXRfY3JjKQoreworICBndWludCBsZW5ndGg7CisgIGd1bG9uZyBtb2RlLCBzYW1wbGVyYXRlLCBiaXRyYXRlLCBsYXllciwgY2hhbm5lbHMsIHBhZGRpbmcsIGNyYzsKKyAgZ3Vsb25nIHZlcnNpb247CisgIGdpbnQgbHNmLCBtcGcyNTsKKworICBpZiAoaGVhZGVyICYgKDEgPDwgMjApKSB7CisgICAgbHNmID0gKGhlYWRlciAmICgxIDw8IDE5KSkgPyAwIDogMTsKKyAgICBtcGcyNSA9IDA7CisgIH0gZWxzZSB7CisgICAgbHNmID0gMTsKKyAgICBtcGcyNSA9IDE7CisgIH0KKworICB2ZXJzaW9uID0gMSArIGxzZiArIG1wZzI1OworCisgIGxheWVyID0gNCAtICgoaGVhZGVyID4+IDE3KSAmIDB4Myk7CisKKyAgY3JjID0gKGhlYWRlciA+PiAxNikgJiAweDE7CisKKyAgYml0cmF0ZSA9IChoZWFkZXIgPj4gMTIpICYgMHhGOworICBiaXRyYXRlID0gbXAzdHlwZXNfYml0cmF0ZXNbbHNmXVtsYXllciAtIDFdW2JpdHJhdGVdICogMTAwMDsKKyAgLyogVGhlIGNhbGxlciBoYXMgZW5zdXJlZCB3ZSBoYXZlIGEgdmFsaWQgaGVhZGVyLCBzbyBiaXRyYXRlIGNhbid0IGJlCisgICAgIHplcm8gaGVyZS4gKi8KKyAgaWYgKGJpdHJhdGUgPT0gMCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1wM3BhcnNlLCAiaW52YWxpZCBiaXRyYXRlIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzYW1wbGVyYXRlID0gKGhlYWRlciA+PiAxMCkgJiAweDM7CisgIHNhbXBsZXJhdGUgPSBtcDN0eXBlc19mcmVxc1tsc2YgKyBtcGcyNV1bc2FtcGxlcmF0ZV07CisKKyAgcGFkZGluZyA9IChoZWFkZXIgPj4gOSkgJiAweDE7CisKKyAgbW9kZSA9IChoZWFkZXIgPj4gNikgJiAweDM7CisgIGNoYW5uZWxzID0gKG1vZGUgPT0gMykgPyAxIDogMjsKKworICBzd2l0Y2ggKGxheWVyKSB7CisgICAgY2FzZSAxOgorICAgICAgbGVuZ3RoID0gNCAqICgoYml0cmF0ZSAqIDEyKSAvIHNhbXBsZXJhdGUgKyBwYWRkaW5nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGxlbmd0aCA9IChiaXRyYXRlICogMTQ0KSAvIHNhbXBsZXJhdGUgKyBwYWRkaW5nOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIDM6CisgICAgICBsZW5ndGggPSAoYml0cmF0ZSAqIDE0NCkgLyAoc2FtcGxlcmF0ZSA8PCBsc2YpICsgcGFkZGluZzsKKyAgICAgIGJyZWFrOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKG1wM3BhcnNlLCAiQ2FsY3VsYXRlZCBtcDMgZnJhbWUgbGVuZ3RoIG9mICV1IGJ5dGVzIiwgbGVuZ3RoKTsKKyAgR1NUX0xPR19PQkpFQ1QgKG1wM3BhcnNlLCAic2FtcGxlcmF0ZSA9ICVsdSwgYml0cmF0ZSA9ICVsdSwgdmVyc2lvbiA9ICVsdSwgIgorICAgICAgImxheWVyID0gJWx1LCBjaGFubmVscyA9ICVsdSwgbW9kZSA9ICVsdSIsIHNhbXBsZXJhdGUsIGJpdHJhdGUsIHZlcnNpb24sCisgICAgICBsYXllciwgY2hhbm5lbHMsIG1vZGUpOworCisgIGlmIChwdXRfdmVyc2lvbikKKyAgICAqcHV0X3ZlcnNpb24gPSB2ZXJzaW9uOworICBpZiAocHV0X2xheWVyKQorICAgICpwdXRfbGF5ZXIgPSBsYXllcjsKKyAgaWYgKHB1dF9jaGFubmVscykKKyAgICAqcHV0X2NoYW5uZWxzID0gY2hhbm5lbHM7CisgIGlmIChwdXRfYml0cmF0ZSkKKyAgICAqcHV0X2JpdHJhdGUgPSBiaXRyYXRlOworICBpZiAocHV0X3NhbXBsZXJhdGUpCisgICAgKnB1dF9zYW1wbGVyYXRlID0gc2FtcGxlcmF0ZTsKKyAgaWYgKHB1dF9tb2RlKQorICAgICpwdXRfbW9kZSA9IG1vZGU7CisgIGlmIChwdXRfY3JjKQorICAgICpwdXRfY3JjID0gY3JjOworCisgIEdTVF9MT0dfT0JKRUNUIChtcDNwYXJzZSwgInNpemUgPSAldSIsIGxlbmd0aCk7CisgIHJldHVybiBsZW5ndGg7Cit9CisKKy8qIGdlbmVyYXRlIGVtcHR5L3NpbGVudC9kdW1teSBmcmFtZSB0aGF0IG1pbWljcyBAZnJhbWUsCisgKiBleGNlcHQgZm9yIHJhdGUsIHdoZXJlIG1heGltdW0gcG9zc2libGUgaXMgc2VsZWN0ZWQgKi8KK3N0YXRpYyBHc3RBRFVGcmFtZSAqCitnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfZ2VuZXJhdGVfZHVtbXlfZnJhbWUgKEdzdFJ0cE1QQVJvYnVzdERlcGF5ICoKKyAgICBydHBtcGFkZXBheSwgR3N0QURVRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0QURVRnJhbWUgKmR1bW15OworICBHc3RNYXBJbmZvIG1hcDsKKworICBkdW1teSA9IGdfc2xpY2VfZHVwIChHc3RBRFVGcmFtZSwgZnJhbWUpOworCisgIC8qIGdvIGZvciBtYXhpbXVtIGJpdHJhdGUgKi8KKyAgZHVtbXktPmhlYWRlciA9IChmcmFtZS0+aGVhZGVyICYgfigweGYgPDwgMTIpKSB8ICgweGUgPDwgMTIpOworICBkdW1teS0+c2l6ZSA9CisgICAgICBtcDNfdHlwZV9mcmFtZV9sZW5ndGhfZnJvbV9oZWFkZXIgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cG1wYWRlcGF5KSwKKyAgICAgIGR1bW15LT5oZWFkZXIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICBkdW1teS0+ZGF0YV9zaXplID0gZHVtbXktPnNpemUgLSA0IC0gZHVtbXktPnNpZGVfaW5mbzsKKyAgZHVtbXktPmJhY2twb2ludGVyID0gMDsKKworICBkdW1teS0+YnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChkdW1teS0+c2lkZV9pbmZvICsgNCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGR1bW15LT5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBtZW1zZXQgKG1hcC5kYXRhLCAwLCBtYXAuc2l6ZSk7CisgIEdTVF9XUklURV9VSU5UMzJfQkUgKG1hcC5kYXRhLCBkdW1teS0+aGVhZGVyKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoZHVtbXktPmJ1ZmZlciwgJm1hcCk7CisKKyAgR1NUX0JVRkZFUl9QVFMgKGR1bW15LT5idWZmZXIpID0gR1NUX0JVRkZFUl9QVFMgKGZyYW1lLT5idWZmZXIpOworCisgIHJldHVybiBkdW1teTsKK30KKworLyogdmFsaWRhdGVzIGFuZCBwYXJzZXMgQGJ1ZiwgYW5kIHF1ZXVlcyBmb3IgZnVydGhlciB0cmFuc2Zvcm1hdGlvbiBpZiB2YWxpZCwKKyAqIG90aGVyd2lzZSBkaXNjYXJkcyBAYnVmCisgKiBUYWtlcyBvd25lcnNoaXAgb2YgQGJ1Zi4gKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X3F1ZXVlX2ZyYW1lIChHc3RSdHBNUEFSb2J1c3REZXBheSAqIHJ0cG1wYWRlcGF5LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0QURVRnJhbWUgKmZyYW1lID0gTlVMTDsKKyAgZ3VpbnQgdmVyc2lvbiwgbGF5ZXIsIGNoYW5uZWxzLCBzaXplOworICBndWludCBjcmM7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChidWYgIT0gTlVMTCwgRkFMU0UpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgaWYgKG1hcC5zaXplIDwgNikKKyAgICBnb3RvIGNvcnJ1cHRfZnJhbWU7CisKKyAgZnJhbWUgPSBnX3NsaWNlX25ldzAgKEdzdEFEVUZyYW1lKTsKKyAgZnJhbWUtPmhlYWRlciA9IEdTVF9SRUFEX1VJTlQzMl9CRSAobWFwLmRhdGEpOworCisgIHNpemUgPSBtcDNfdHlwZV9mcmFtZV9sZW5ndGhfZnJvbV9oZWFkZXIgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cG1wYWRlcGF5KSwKKyAgICAgIGZyYW1lLT5oZWFkZXIsICZ2ZXJzaW9uLCAmbGF5ZXIsICZjaGFubmVscywgTlVMTCwgTlVMTCwgTlVMTCwgJmNyYyk7CisgIGlmICghc2l6ZSkKKyAgICBnb3RvIGNvcnJ1cHRfZnJhbWU7CisKKyAgZnJhbWUtPnNpemUgPSBzaXplOworICBmcmFtZS0+bGF5ZXIgPSBsYXllcjsKKyAgaWYgKHZlcnNpb24gPT0gMSAmJiBjaGFubmVscyA9PSAyKQorICAgIGZyYW1lLT5zaWRlX2luZm8gPSAzMjsKKyAgZWxzZSBpZiAoKHZlcnNpb24gPT0gMSAmJiBjaGFubmVscyA9PSAxKSB8fCAodmVyc2lvbiA+PSAyICYmIGNoYW5uZWxzID09IDIpKQorICAgIGZyYW1lLT5zaWRlX2luZm8gPSAxNzsKKyAgZWxzZSBpZiAodmVyc2lvbiA+PSAyICYmIGNoYW5uZWxzID09IDEpCisgICAgZnJhbWUtPnNpZGVfaW5mbyA9IDk7CisgIGVsc2UgeworICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgIGdvdG8gY29ycnVwdF9mcmFtZTsKKyAgfQorCisgIC8qIGJhY2twb2ludGVyICovCisgIGlmIChsYXllciA9PSAzKSB7CisgICAgZnJhbWUtPmJhY2twb2ludGVyID0gR1NUX1JFQURfVUlOVDE2X0JFIChtYXAuZGF0YSArIDQpOworICAgIGZyYW1lLT5iYWNrcG9pbnRlciA+Pj0gNzsKKyAgICBHU1RfTE9HX09CSkVDVCAocnRwbXBhZGVwYXksICJiYWNrcG9pbnRlcjogJWQiLCBmcmFtZS0+YmFja3BvaW50ZXIpOworICB9CisKKyAgaWYgKCFjcmMpCisgICAgZnJhbWUtPnNpZGVfaW5mbyArPSAyOworCisgIEdTVF9MT0dfT0JKRUNUIChydHBtcGFkZXBheSwgInNpZGUgaW5mbzogJWQiLCBmcmFtZS0+c2lkZV9pbmZvKTsKKyAgZnJhbWUtPmRhdGFfc2l6ZSA9IGZyYW1lLT5zaXplIC0gNCAtIGZyYW1lLT5zaWRlX2luZm87CisKKyAgLyogc29tZSBzaXplIHZhbGlkYXRpb24gY2hlY2tzICovCisgIGlmICg0ICsgZnJhbWUtPnNpZGVfaW5mbyA+IG1hcC5zaXplKQorICAgIGdvdG8gY29ycnVwdF9mcmFtZTsKKworICAvKiBBRFUgZGF0YSB3b3VsZCB0aGVuIGV4dGVuZCBwYXN0IE1QMyBmcmFtZSwKKyAgICogZXZlbiB1c2luZyBwYXN0IGJ5dGUgcmVzZXJ2b2lyICovCisgIGlmICgtZnJhbWUtPmJhY2twb2ludGVyICsgKGdpbnQpIChtYXAuc2l6ZSkgPiBmcmFtZS0+c2l6ZSkKKyAgICBnb3RvIGNvcnJ1cHRfZnJhbWU7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICAvKiBvaywgdGFrZSBidWZmZXIgYW5kIHF1ZXVlICovCisgIGZyYW1lLT5idWZmZXIgPSBidWY7CisgIGdfcXVldWVfcHVzaF90YWlsIChydHBtcGFkZXBheS0+YWR1X2ZyYW1lcywgZnJhbWUpOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworY29ycnVwdF9mcmFtZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cG1wYWRlcGF5LCAiZnJhbWUgaXMgY29ycnVwdCIpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICBpZiAoZnJhbWUpCisgICAgICBnX3NsaWNlX2ZyZWUgKEdzdEFEVUZyYW1lLCBmcmFtZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X2ZyZWVfZnJhbWUgKEdzdEFEVUZyYW1lICogZnJhbWUpCit7CisgIGlmIChmcmFtZS0+YnVmZmVyKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKGZyYW1lLT5idWZmZXIpOworICBnX3NsaWNlX2ZyZWUgKEdzdEFEVUZyYW1lLCBmcmFtZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X2RlcXVldWVfZnJhbWUgKEdzdFJ0cE1QQVJvYnVzdERlcGF5ICogcnRwbXBhZGVwYXkpCit7CisgIEdzdEFEVUZyYW1lICpoZWFkOworCisgIEdTVF9MT0dfT0JKRUNUIChydHBtcGFkZXBheSwgImRlcXVldWVpbmcgQURVIGZyYW1lIik7CisKKyAgaWYgKHJ0cG1wYWRlcGF5LT5hZHVfZnJhbWVzLT5oZWFkID09IHJ0cG1wYWRlcGF5LT5jdXJfYWR1X2ZyYW1lKQorICAgIHJ0cG1wYWRlcGF5LT5jdXJfYWR1X2ZyYW1lID0gTlVMTDsKKworICBoZWFkID0gZ19xdWV1ZV9wb3BfaGVhZCAocnRwbXBhZGVwYXktPmFkdV9mcmFtZXMpOworICBnX2Fzc2VydCAoaGVhZC0+YnVmZmVyKTsKKyAgZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X2ZyZWVfZnJhbWUgKGhlYWQpOworCisgIHJldHVybjsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIGF0IGxlYXN0IG9uZSBuZXcgQURVIGZyYW1lIHdhcyBlbnF1ZXVlZCBmb3IgTVAzIGNvbnZlcnNpb24uCisgKiBUYWtlcyBvd25lcnNoaXAgb2YgQGJ1Zi4gKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X2RlaW50ZXJsZWF2ZSAoR3N0UnRwTVBBUm9idXN0RGVwYXkgKiBydHBtcGFkZXBheSwKKyAgICBHc3RCdWZmZXIgKiBidWYpCit7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQgdmFsLCBpaW5kZXgsIGljYzsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICB2YWwgPSBHU1RfUkVBRF9VSU5UMTZfQkUgKG1hcC5kYXRhKSA+PiA1OworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIGlpbmRleCA9IHZhbCA+PiAzOworICBpY2MgPSB2YWwgJiAweDc7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHJ0cG1wYWRlcGF5LCAic3luYzogMHgleCwgaW5kZXg6ICV1LCBjeWNsZSBjb3VudDogJXUiLAorICAgICAgdmFsLCBpaW5kZXgsIGljYyk7CisKKyAgLyogYmFzaWMgY2FzZTsgbm8gaW50ZXJsZWF2aW5nIGV2ZXIgc2VlbiAqLworICBpZiAodmFsID09IDB4N2ZmICYmIHJ0cG1wYWRlcGF5LT5sYXN0X2ljYyA8IDApIHsKKyAgICByZXQgPSBnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfcXVldWVfZnJhbWUgKHJ0cG1wYWRlcGF5LCBidWYpOworICB9IGVsc2UgeworICAgIGlmIChHX1VOTElLRUxZIChydHBtcGFkZXBheS0+bGFzdF9pY2MgPCAwKSkgeworICAgICAgcnRwbXBhZGVwYXktPmxhc3RfaWNjID0gaWNjOworICAgICAgcnRwbXBhZGVwYXktPmxhc3RfaWkgPSBpaW5kZXg7CisgICAgfQorICAgIGlmIChpY2MgIT0gcnRwbXBhZGVwYXktPmxhc3RfaWNjIHx8IGlpbmRleCA9PSBydHBtcGFkZXBheS0+bGFzdF9paSkgeworICAgICAgZ2ludCBpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgaWYgKHJ0cG1wYWRlcGF5LT5kZWludGVyW2ldICE9IE5VTEwpIHsKKyAgICAgICAgICByZXQgfD0gZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X3F1ZXVlX2ZyYW1lIChydHBtcGFkZXBheSwKKyAgICAgICAgICAgICAgcnRwbXBhZGVwYXktPmRlaW50ZXJbaV0pOworICAgICAgICAgIHJ0cG1wYWRlcGF5LT5kZWludGVyW2ldID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvKiByZXdyaXRlIGJ1ZmZlciBzeW5jIGhlYWRlciAqLworICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgICB2YWwgPSBHU1RfUkVBRF9VSU5UMTZfQkUgKG1hcC5kYXRhKTsKKyAgICB2YWwgPSAoMHg3ZmYgPDwgNSkgfCB2YWw7CisgICAgR1NUX1dSSVRFX1VJTlQxNl9CRSAobWFwLmRhdGEsIHZhbCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICAvKiBzdG9yZSBhbmQga2VlcCB0cmFjayBvZiBsYXN0IGluZGljZXMgKi8KKyAgICBydHBtcGFkZXBheS0+bGFzdF9pY2MgPSBpY2M7CisgICAgcnRwbXBhZGVwYXktPmxhc3RfaWkgPSBpaW5kZXg7CisgICAgcnRwbXBhZGVwYXktPmRlaW50ZXJbaWluZGV4XSA9IGJ1ZjsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qIEhlYWQgQURVIGZyYW1lIGNvcnJlc3BvbmRzIHRvIG1wM19mcmFtZSAoaS5lLiBpbiBoZWFkZXIgaW4gc2lkZS1pbmZvKSB0aGF0CisgKiBpcyBjdXJyZW50bHkgYmVpbmcgd3JpdHRlbgorICogY3VyX2FkdV9mcmFtZSByZWZlcnMgdG8gQURVIGZyYW1lIHdob3NlIGRhdGEgc2hvdWxkIGJlIGJ5dGV3cml0dGVuIG5leHQKKyAqIChwb3NzaWJseSBzdGFydGluZyBmcm9tIG9mZnNldCByYXRoZXIgdGhhbiBzdGFydCAwKSAoYW5kIGlzIHR5cGljYWxsIHRhaWwKKyAqIGF0IHRpbWUgb2YgbGFzdCBwdXNoIHJvdW5kKS4KKyAqIElmIGF0IHN0YXJ0LCBwb3NpdGlvbiB3aGVyZSBpdCBzaG91bGQgc3RhcnQgd3JpdGluZyBkZXBlbmRzIG9uIChkYXRhKSBzaXplcworICogb2YgcHJldmlvdXMgbXAzIGZyYW1lcyAoY29ycmVzcG9uZGluZyB0byBmb3JlZ29pbmcgQURVIGZyYW1lcykga2VwdCBpbiBzaXplLAorICogYW5kIGl0cyBiYWNrcG9pbnRlciAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9wdXNoX21wM19mcmFtZXMgKEdzdFJ0cE1QQVJvYnVzdERlcGF5ICogcnRwbXBhZGVwYXkpCit7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RBRFVGcmFtZSAqZnJhbWUsICpoZWFkOworICBnaW50IGF2OworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIHdoaWxlICgxKSB7CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICBpZiAoR19VTkxJS0VMWSAoIXJ0cG1wYWRlcGF5LT5jdXJfYWR1X2ZyYW1lKSkgeworICAgICAgcnRwbXBhZGVwYXktPmN1cl9hZHVfZnJhbWUgPSBydHBtcGFkZXBheS0+YWR1X2ZyYW1lcy0+aGVhZDsKKyAgICAgIHJ0cG1wYWRlcGF5LT5vZmZzZXQgPSAwOworICAgICAgcnRwbXBhZGVwYXktPnNpemUgPSAwOworICAgIH0KKworICAgIGlmIChHX1VOTElLRUxZICghcnRwbXBhZGVwYXktPmN1cl9hZHVfZnJhbWUpKQorICAgICAgYnJlYWs7CisKKyAgICBmcmFtZSA9IChHc3RBRFVGcmFtZSAqKSBydHBtcGFkZXBheS0+Y3VyX2FkdV9mcmFtZS0+ZGF0YTsKKyAgICBoZWFkID0gKEdzdEFEVUZyYW1lICopIHJ0cG1wYWRlcGF5LT5hZHVfZnJhbWVzLT5oZWFkLT5kYXRhOworCisgICAgLyogc3BlY2lhbCBjYXNlOiBub24tbGF5ZXIgSUlJIGFyZSBzZW50IHN0cmFpZ2h0IHRocm91Z2ggKi8KKyAgICBpZiAoR19VTkxJS0VMWSAoZnJhbWUtPmxheWVyICE9IDMpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcGFkZXBheSwgImxheWVyICVkIGZyYW1lLCBzZW5kaW5nIGFzLWlzIiwKKyAgICAgICAgICBmcmFtZS0+bGF5ZXIpOworICAgICAgZ3N0X3J0cF9iYXNlX2RlcGF5bG9hZF9wdXNoIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEIChydHBtcGFkZXBheSksCisgICAgICAgICAgZnJhbWUtPmJ1ZmZlcik7CisgICAgICBmcmFtZS0+YnVmZmVyID0gTlVMTDsKKyAgICAgIC8qIGFuZCByZW1vdmUgaXQgZnJvbSBhbnkgZnVydGhlciBjb25zaWRlcmF0aW9uICovCisgICAgICBnX3NsaWNlX2ZyZWUgKEdzdEFEVUZyYW1lLCBmcmFtZSk7CisgICAgICBnX3F1ZXVlX2RlbGV0ZV9saW5rIChydHBtcGFkZXBheS0+YWR1X2ZyYW1lcywgcnRwbXBhZGVwYXktPmN1cl9hZHVfZnJhbWUpOworICAgICAgcnRwbXBhZGVwYXktPmN1cl9hZHVfZnJhbWUgPSBOVUxMOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKHJ0cG1wYWRlcGF5LT5vZmZzZXQgPT0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZnJhbWUtPmJ1ZmZlcikpIHsKKyAgICAgIGlmIChnX2xpc3RfbmV4dCAocnRwbXBhZGVwYXktPmN1cl9hZHVfZnJhbWUpKSB7CisgICAgICAgIHJ0cG1wYWRlcGF5LT5zaXplICs9IGZyYW1lLT5kYXRhX3NpemU7CisgICAgICAgIHJ0cG1wYWRlcGF5LT5jdXJfYWR1X2ZyYW1lID0gZ19saXN0X25leHQgKHJ0cG1wYWRlcGF5LT5jdXJfYWR1X2ZyYW1lKTsKKyAgICAgICAgZnJhbWUgPSAoR3N0QURVRnJhbWUgKikgcnRwbXBhZGVwYXktPmN1cl9hZHVfZnJhbWUtPmRhdGE7CisgICAgICAgIHJ0cG1wYWRlcGF5LT5vZmZzZXQgPSAwOworICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwbXBhZGVwYXksCisgICAgICAgICAgICAibW92aW5nIHRvIG5leHQgQURVIGZyYW1lLCBzaXplICVkLCBzaWRlX2luZm8gJWQsIGJhY2twb2ludGVyICVkIiwKKyAgICAgICAgICAgIGZyYW1lLT5zaXplLCBmcmFtZS0+c2lkZV9pbmZvLCBmcmFtZS0+YmFja3BvaW50ZXIpOworICAgICAgICAvKiBsYXllciBJIGFuZCBJSSBwYWNrZXRzIGhhdmUgbm8gYml0cmVzZXJ2b2lyIGFuZCBtdXN0IGJlIHNlbnQgYXMtaXM7CisgICAgICAgICAqIHNvIGZsdXNoIGFueSBwZW5kaW5nIGZyYW1lICovCisgICAgICAgIGlmIChHX1VOTElLRUxZIChmcmFtZS0+bGF5ZXIgIT0gMyAmJiBydHBtcGFkZXBheS0+bXAzX2ZyYW1lKSkKKyAgICAgICAgICBnb3RvIGZsdXNoOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKEdfVU5MSUtFTFkgKCFydHBtcGFkZXBheS0+bXAzX2ZyYW1lKSkgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cG1wYWRlcGF5LAorICAgICAgICAgICJzZXR0aW5nIHVwIG5ldyBNUDMgZnJhbWUgb2Ygc2l6ZSAlZCwgc2lkZV9pbmZvICVkIiwKKyAgICAgICAgICBoZWFkLT5zaXplLCBoZWFkLT5zaWRlX2luZm8pOworICAgICAgcnRwbXBhZGVwYXktPm1wM19mcmFtZSA9IGdzdF9ieXRlX3dyaXRlcl9uZXdfd2l0aF9zaXplIChoZWFkLT5zaXplLCBUUlVFKTsKKyAgICAgIC8qIDAtZmlsbCBwb3NzaWJsZSBnYXBzICovCisgICAgICBnc3RfYnl0ZV93cml0ZXJfZmlsbF91bmNoZWNrZWQgKHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUsIDAsIGhlYWQtPnNpemUpOworICAgICAgZ3N0X2J5dGVfd3JpdGVyX3NldF9wb3MgKHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUsIDApOworICAgICAgLyogYnl0ZXdyaXRlciBjb3JyZXNwb25kcyB0byBoZWFkIGZyYW1lLAorICAgICAgICogaS5lLiB0aGUgaGVhZGVyIGFuZCB0aGUgc2lkZSBpbmZvIG11c3QgbWF0Y2ggKi8KKyAgICAgIGdfYXNzZXJ0ICg0ICsgaGVhZC0+c2lkZV9pbmZvIDw9IGhlYWQtPnNpemUpOworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGhlYWQtPmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfZGF0YV91bmNoZWNrZWQgKHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUsCisgICAgICAgICAgbWFwLmRhdGEsIDQgKyBoZWFkLT5zaWRlX2luZm8pOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoaGVhZC0+YnVmZmVyLCAmbWFwKTsKKyAgICB9CisKKyAgICBidWYgPSBmcmFtZS0+YnVmZmVyOworICAgIGF2ID0gZ3N0X2J5dGVfd3JpdGVyX2dldF9yZW1haW5pbmcgKHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUpOworICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcGFkZXBheSwgImN1cnJlbnQgbXAzIGZyYW1lIHJlbWFpbmluZzogJWQiLCBhdik7CisgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cG1wYWRlcGF5LCAiYWNjdW11bGF0ZWQgQURVIGZyYW1lIGRhdGFfc2l6ZTogJWQiLAorICAgICAgICBydHBtcGFkZXBheS0+c2l6ZSk7CisKKyAgICBpZiAocnRwbXBhZGVwYXktPm9mZnNldCkgeworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIC8qIG5vIG5lZWQgdG8gcG9zaXRpb24sIHNpbXBseSBhcHBlbmQgKi8KKyAgICAgIGdfYXNzZXJ0IChtYXAuc2l6ZSA+IHJ0cG1wYWRlcGF5LT5vZmZzZXQpOworICAgICAgYXYgPSBNSU4gKGF2LCBtYXAuc2l6ZSAtIHJ0cG1wYWRlcGF5LT5vZmZzZXQpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cG1wYWRlcGF5LAorICAgICAgICAgICJhcHBlbmRpbmcgJWQgYnl0ZXMgZnJvbSBBRFUgZnJhbWUgYXQgb2Zmc2V0ICVkIiwgYXYsCisgICAgICAgICAgcnRwbXBhZGVwYXktPm9mZnNldCk7CisgICAgICBnc3RfYnl0ZV93cml0ZXJfcHV0X2RhdGFfdW5jaGVja2VkIChydHBtcGFkZXBheS0+bXAzX2ZyYW1lLAorICAgICAgICAgIG1hcC5kYXRhICsgcnRwbXBhZGVwYXktPm9mZnNldCwgYXYpOworICAgICAgcnRwbXBhZGVwYXktPm9mZnNldCArPSBhdjsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdpbnQgcG9zLCB0cG9zOworCisgICAgICAvKiBwb3NpdGlvbiB3cml0aW5nIGFjY29yZGluZyB0byBBRFUgZnJhbWUgYmFja3BvaW50ZXIgKi8KKyAgICAgIHBvcyA9IGdzdF9ieXRlX3dyaXRlcl9nZXRfcG9zIChydHBtcGFkZXBheS0+bXAzX2ZyYW1lKTsKKyAgICAgIHRwb3MgPSBydHBtcGFkZXBheS0+c2l6ZSAtIGZyYW1lLT5iYWNrcG9pbnRlciArIDQgKyBoZWFkLT5zaWRlX2luZm87CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwbXBhZGVwYXksICJjdXJyZW50IE1QMyBmcmFtZSBhdCBwb3NpdGlvbiAlZCwgIgorICAgICAgICAgICJzdGFydGluZyBuZXcgQURVIGZyYW1lIGRhdGEgYXQgb2Zmc2V0ICVkIiwgcG9zLCB0cG9zKTsKKyAgICAgIGlmICh0cG9zIDwgcG9zKSB7CisgICAgICAgIEdzdEFEVUZyYW1lICpkdW1teTsKKworICAgICAgICAvKiB0cnkgdG8gaW5zZXJ0IGFzIGZldyBmcmFtZXMgYXMgcG9zc2libGUsCisgICAgICAgICAqIHNvIGdvIGZvciBhIHJlYXNvbmFibHkgbGFyZ2UgZHVtbXkgZnJhbWUgc2l6ZSAqLworICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwbXBhZGVwYXksCisgICAgICAgICAgICAib3ZlcmxhcHBpbmcgcHJldmlvdXMgZGF0YTsgaW5zZXJ0aW5nIGR1bW15IGZyYW1lIik7CisgICAgICAgIGR1bW15ID0KKyAgICAgICAgICAgIGdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9nZW5lcmF0ZV9kdW1teV9mcmFtZSAocnRwbXBhZGVwYXksIGZyYW1lKTsKKyAgICAgICAgZ19xdWV1ZV9pbnNlcnRfYmVmb3JlIChydHBtcGFkZXBheS0+YWR1X2ZyYW1lcywKKyAgICAgICAgICAgIHJ0cG1wYWRlcGF5LT5jdXJfYWR1X2ZyYW1lLCBkdW1teSk7CisgICAgICAgIC8qIG9mZnNldCBpcyBrbm93biB0byBiZSB6ZXJvLCBzbyB3ZSBjYW4gc2hpZnQgY3VycmVudCBvbmUgKi8KKyAgICAgICAgcnRwbXBhZGVwYXktPmN1cl9hZHVfZnJhbWUgPSBydHBtcGFkZXBheS0+Y3VyX2FkdV9mcmFtZS0+cHJldjsKKyAgICAgICAgaWYgKCFydHBtcGFkZXBheS0+c2l6ZSkgeworICAgICAgICAgIGdfYXNzZXJ0IChydHBtcGFkZXBheS0+Y3VyX2FkdV9mcmFtZSA9PQorICAgICAgICAgICAgICBydHBtcGFkZXBheS0+YWR1X2ZyYW1lcy0+aGVhZCk7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cG1wYWRlcGF5LCAiLi4uIHdoaWNoIGlzIG5ldyBoZWFkIGZyYW1lIik7CisgICAgICAgICAgZ3N0X2J5dGVfd3JpdGVyX2ZyZWUgKHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUpOworICAgICAgICAgIHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIC4uLiBhbmQgY29udGludWUgYWRkaW5nIHRoYXQgZW1wdHkgb25lIGltbWVkaWF0ZWx5LAorICAgICAgICAgKiBhbmQgdGhlbiBzZWUgaWYgdGhhdCBwcm92aWRlZCBlbm91Z2ggZXh0cmEgc3BhY2UgKi8KKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgaWYgKHRwb3MgPj0gcG9zICsgYXYpIHsKKyAgICAgICAgLyogQURVIGZyYW1lIG5vIGxvbmdlciBuZWVkcyBjdXJyZW50IE1QMyBmcmFtZTsgbW92ZSB0byBpdHMgZW5kICovCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcGFkZXBheSwgInBhc3NlZCBjdXJyZW50IE1QMyBmcmFtZSIpOworICAgICAgICBnc3RfYnl0ZV93cml0ZXJfc2V0X3BvcyAocnRwbXBhZGVwYXktPm1wM19mcmFtZSwgcG9zICsgYXYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogcG9zaXRpb24gYW5kIGFwcGVuZCAqLworICAgICAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwbXBhZGVwYXksICJhZGRpbmcgdG8gY3VycmVudCBNUDMgZnJhbWUiKTsKKyAgICAgICAgZ3N0X2J5dGVfd3JpdGVyX3NldF9wb3MgKHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUsIHRwb3MpOworICAgICAgICBhdiAtPSAodHBvcyAtIHBvcyk7CisgICAgICAgIGdfYXNzZXJ0IChtYXAuc2l6ZSA+PSA0ICsgZnJhbWUtPnNpZGVfaW5mbyk7CisgICAgICAgIGF2ID0gTUlOIChhdiwgbWFwLnNpemUgLSA0IC0gZnJhbWUtPnNpZGVfaW5mbyk7CisgICAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfZGF0YV91bmNoZWNrZWQgKHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUsCisgICAgICAgICAgICBtYXAuZGF0YSArIDQgKyBmcmFtZS0+c2lkZV9pbmZvLCBhdik7CisgICAgICAgIHJ0cG1wYWRlcGF5LT5vZmZzZXQgKz0gYXYgKyA0ICsgZnJhbWUtPnNpZGVfaW5mbzsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBtcDMgZnJhbWUgZmlsbGVkLCBzZW5kIG9uIGl0cyB3YXkgKi8KKyAgICBpZiAoZ3N0X2J5dGVfd3JpdGVyX2dldF9yZW1haW5pbmcgKHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUpID09IDApIHsKKyAgICBmbHVzaDoKKyAgICAgIGJ1ZiA9IGdzdF9ieXRlX3dyaXRlcl9mcmVlX2FuZF9nZXRfYnVmZmVyIChydHBtcGFkZXBheS0+bXAzX2ZyYW1lKTsKKyAgICAgIHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUgPSBOVUxMOworICAgICAgR1NUX0JVRkZFUl9QVFMgKGJ1ZikgPSBHU1RfQlVGRkVSX1BUUyAoaGVhZC0+YnVmZmVyKTsKKyAgICAgIC8qIG5vIGxvbmdlciBuZWVkIGhlYWQgQURVIGZyYW1lIGhlYWRlciBhbmQgc2lkZSBpbmZvICovCisgICAgICAvKiBOT1RFIG1heWJlIGhlYWQgPT0gY3VycmVudCwgdGhlbiBzaXplIGFuZCBvZmZzZXQgZ28gb2ZmIGEgYml0LAorICAgICAgICogYnV0IGN1cnJlbnQgZ2V0cyByZXNldCB0byBOVUxMLCBhbmQgdGhlbiBhbHNvIG9mZnNldCBhbmQgc2l6ZSAqLworICAgICAgcnRwbXBhZGVwYXktPnNpemUgLT0gaGVhZC0+ZGF0YV9zaXplOworICAgICAgZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X2RlcXVldWVfZnJhbWUgKHJ0cG1wYWRlcGF5KTsKKyAgICAgIC8qIHNlbmQgKi8KKyAgICAgIHJldCA9IGdzdF9ydHBfYmFzZV9kZXBheWxvYWRfcHVzaCAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRCAocnRwbXBhZGVwYXkpLAorICAgICAgICAgIGJ1Zik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogcHJvY2VzcyBBRFUgZnJhbWUgQGJ1ZiB0aHJvdWdoOgorICogLSBkZWludGVybGVhdmluZworICogLSBjb252ZXJ0aW5nIHRvIE1QMyBmcmFtZXMKKyAqIFRha2VzIG93bmVyc2hpcCBvZiBAYnVmLgorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X3N1Ym1pdF9hZHUgKEdzdFJ0cE1QQVJvYnVzdERlcGF5ICogcnRwbXBhZGVwYXksCisgICAgR3N0QnVmZmVyICogYnVmKQoreworICBpZiAoZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X2RlaW50ZXJsZWF2ZSAocnRwbXBhZGVwYXksIGJ1ZikpCisgICAgcmV0dXJuIGdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9wdXNoX21wM19mcmFtZXMgKHJ0cG1wYWRlcGF5KTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBNUEFSb2J1c3REZXBheSAqcnRwbXBhZGVwYXk7CisgIGdpbnQgcGF5bG9hZF9sZW4sIG9mZnNldDsKKyAgZ3VpbnQ4ICpwYXlsb2FkOworICBnYm9vbGVhbiBjb250LCBkdHlwZTsKKyAgZ3VpbnQgYXYsIHNpemU7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisgIEdzdEJ1ZmZlciAqYnVmOworCisgIHJ0cG1wYWRlcGF5ID0gR1NUX1JUUF9NUEFfUk9CVVNUX0RFUEFZIChkZXBheWxvYWQpOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChydHAtPmJ1ZmZlcik7CisKKyAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisgIGlmIChwYXlsb2FkX2xlbiA8PSAxKQorICAgIGdvdG8gc2hvcnRfcmVhZDsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisgIG9mZnNldCA9IDA7CisgIEdTVF9MT0dfT0JKRUNUIChydHBtcGFkZXBheSwgInBheWxvYWRfbGVuOiAlZCIsIHBheWxvYWRfbGVuKTsKKworICAvKiBzdHJpcCBvZmYgZGVzY3JpcHRvcgorICAgKgorICAgKiAgMCAgICAgICAgICAgICAgICAgICAxCisgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfEN8VHwgICAgICAgICAgICBBRFUgc2l6ZSAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICoKKyAgICogQzogaWYgMSwgZGF0YSBpcyBjb250aW51YXRpb24KKyAgICogVDogaWYgMSwgc2l6ZSBpcyAxNCBiaXRzLCBvdGhlcndpc2UgNiBiaXRzCisgICAqIEFEVSBzaXplOiBzaXplIG9mIGZvbGxvd2luZyBwYWNrZXQgKG5vdCBpbmNsdWRpbmcgZGVzY3JpcHRvcikKKyAgICovCisgIHdoaWxlIChwYXlsb2FkX2xlbikgeworICAgIGlmIChHX0xJS0VMWSAocnRwbXBhZGVwYXktPmhhc19kZXNjcmlwdG9yKSkgeworICAgICAgY29udCA9ICEgIShwYXlsb2FkW29mZnNldF0gJiAweDgwKTsKKyAgICAgIGR0eXBlID0gISAhKHBheWxvYWRbb2Zmc2V0XSAmIDB4NDApOworICAgICAgaWYgKGR0eXBlKSB7CisgICAgICAgIHNpemUgPSAocGF5bG9hZFtvZmZzZXRdICYgMHgzZikgPDwgOCB8IHBheWxvYWRbb2Zmc2V0ICsgMV07CisgICAgICAgIHBheWxvYWRfbGVuLS07CisgICAgICAgIG9mZnNldCsrOworICAgICAgfSBlbHNlIGlmIChwYXlsb2FkX2xlbiA+PSAyKSB7CisgICAgICAgIHNpemUgPSAocGF5bG9hZFtvZmZzZXRdICYgMHgzZik7CisgICAgICAgIHBheWxvYWRfbGVuIC09IDI7CisgICAgICAgIG9mZnNldCArPSAyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ290byBzaG9ydF9yZWFkOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjb250ID0gRkFMU0U7CisgICAgICBkdHlwZSA9IC0xOworICAgICAgc2l6ZSA9IHBheWxvYWRfbGVuOworICAgIH0KKworICAgIEdTVF9MT0dfT0JKRUNUIChydHBtcGFkZXBheSwgIm9mZnNldCAlZCBoYXMgY29udDogJWQsIGR0eXBlOiAlZCwgc2l6ZTogJWQiLAorICAgICAgICBvZmZzZXQsIGNvbnQsIGR0eXBlLCBzaXplKTsKKworICAgIGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3N1YmJ1ZmZlciAocnRwLCBvZmZzZXQsCisgICAgICAgIE1JTiAoc2l6ZSwgcGF5bG9hZF9sZW4pKTsKKworICAgIGlmIChjb250KSB7CisgICAgICBhdiA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwbXBhZGVwYXktPmFkYXB0ZXIpOworICAgICAgaWYgKEdfVU5MSUtFTFkgKCFhdikpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXBhZGVwYXksCisgICAgICAgICAgICAiZGlzY2FyZGluZyBjb250aW51YXRpb24gZnJhZ21lbnQgd2l0aG91dCBwcmlvciBmcmFnbWVudCIpOworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXYgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKyAgICAgICAgZ3N0X2FkYXB0ZXJfcHVzaCAocnRwbXBhZGVwYXktPmFkYXB0ZXIsIGJ1Zik7CisgICAgICAgIGlmIChhdiA9PSBzaXplKSB7CisgICAgICAgICAgdGltZXN0YW1wID0gZ3N0X2FkYXB0ZXJfcHJldl9wdHMgKHJ0cG1wYWRlcGF5LT5hZGFwdGVyLCBOVUxMKTsKKyAgICAgICAgICBidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwbXBhZGVwYXktPmFkYXB0ZXIsIHNpemUpOworICAgICAgICAgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gdGltZXN0YW1wOworICAgICAgICAgIGdzdF9ydHBfbXBhX3JvYnVzdF9kZXBheV9zdWJtaXRfYWR1IChydHBtcGFkZXBheSwgYnVmKTsKKyAgICAgICAgfSBlbHNlIGlmIChhdiA+IHNpemUpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcGFkZXBheSwKKyAgICAgICAgICAgICAgImFzc2VtYmxlZCBBRFUgc2l6ZSAlZCBsYXJnZXIgdGhhbiBleHBlY3RlZCAlZDsgZGlzY2FyZGluZyIsCisgICAgICAgICAgICAgIGF2LCBzaXplKTsKKyAgICAgICAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRwbXBhZGVwYXktPmFkYXB0ZXIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBzaXplID0gcGF5bG9hZF9sZW47CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIG5vdCBjb250aW51YXRpb24sIGZpcnN0IGZyYWdtZW50IG9yIHdob2xlIEFEVSAqLworICAgICAgaWYgKHBheWxvYWRfbGVuID09IHNpemUpIHsKKyAgICAgICAgLyogd2hvbGUgQURVICovCisgICAgICAgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gdGltZXN0YW1wOworICAgICAgICBnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfc3VibWl0X2FkdSAocnRwbXBhZGVwYXksIGJ1Zik7CisgICAgICB9IGVsc2UgaWYgKHBheWxvYWRfbGVuIDwgc2l6ZSkgeworICAgICAgICAvKiBmaXJzdCBmcmFnbWVudCAqLworICAgICAgICBnc3RfYWRhcHRlcl9wdXNoIChydHBtcGFkZXBheS0+YWRhcHRlciwgYnVmKTsKKyAgICAgICAgc2l6ZSA9IHBheWxvYWRfbGVuOworICAgICAgfQorICAgIH0KKworICAgIG9mZnNldCArPSBzaXplOworICAgIHBheWxvYWRfbGVuIC09IHNpemU7CisKKyAgICAvKiB0aW1lc3RhbXAgYXBwbGllcyB0byBmaXJzdCBwYXlsb2FkLCBubyBpZGVhIGZvciBzdWJzZXF1ZW50IG9uZXMgKi8KKyAgICB0aW1lc3RhbXAgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9CisKKyAgcmV0dXJuIE5VTEw7CisKKyAgLyogRVJST1JTICovCitzaG9ydF9yZWFkOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwbXBhZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiUGFja2V0IGNvbnRhaW5zIGludmFsaWQgZGF0YSIpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfbXBhX3JvYnVzdF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0UnRwTVBBUm9idXN0RGVwYXkgKnJ0cG1wYWRlcGF5OworCisgIHJ0cG1wYWRlcGF5ID0gR1NUX1JUUF9NUEFfUk9CVVNUX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgcnRwbXBhZGVwYXktPmxhc3RfaWkgPSAtMTsKKyAgICAgIHJ0cG1wYWRlcGF5LT5sYXN0X2ljYyA9IC0xOworICAgICAgcnRwbXBhZGVwYXktPnNpemUgPSAwOworICAgICAgcnRwbXBhZGVwYXktPm9mZnNldCA9IDA7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisgIGlmIChyZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKQorICAgIHJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICB7CisgICAgICBnaW50IGk7CisKKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChydHBtcGFkZXBheS0+YWRhcHRlcik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChydHBtcGFkZXBheS0+ZGVpbnRlcik7IGkrKykgeworICAgICAgICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZydHBtcGFkZXBheS0+ZGVpbnRlcltpXSwgTlVMTCk7CisgICAgICB9CisgICAgICBydHBtcGFkZXBheS0+Y3VyX2FkdV9mcmFtZSA9IE5VTEw7CisgICAgICBnX3F1ZXVlX2ZvcmVhY2ggKHJ0cG1wYWRlcGF5LT5hZHVfZnJhbWVzLAorICAgICAgICAgIChHRnVuYykgZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X2ZyZWVfZnJhbWUsIE5VTEwpOworICAgICAgZ19xdWV1ZV9jbGVhciAocnRwbXBhZGVwYXktPmFkdV9mcmFtZXMpOworICAgICAgaWYgKHJ0cG1wYWRlcGF5LT5tcDNfZnJhbWUpCisgICAgICAgIGdzdF9ieXRlX3dyaXRlcl9mcmVlIChydHBtcGFkZXBheS0+bXAzX2ZyYW1lKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwbXBhcm9idXN0ZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfTVBBX1JPQlVTVF9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cG1wYXJvYnVzdGRlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5ZWMwYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXBhcm9idXN0ZGVwYXkuaApAQCAtMCwwICsxLDc4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMTA+IE1hcmsgTmF1d2VsYWVydHMgPG1hcmsubmF1d2VsYWVydHNAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSA8MjAxMD4gTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9NUEFfUk9CVVNUX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfTVBBX1JPQlVTVF9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Ynl0ZXdyaXRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX01QQV9ST0JVU1RfREVQQVkgXAorICAoZ3N0X3J0cF9tcGFfcm9idXN0X2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfTVBBX1JPQlVTVF9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9NUEFfUk9CVVNUX0RFUEFZLEdzdFJ0cE1QQVJvYnVzdERlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9NUEFfUk9CVVNUX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUEFfUk9CVVNUX0RFUEFZLEdzdFJ0cE1QQVJvYnVzdERlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QQV9ST0JVU1RfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfTVBBX1JPQlVTVF9ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfTVBBX1JPQlVTVF9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTVBBX1JPQlVTVF9ERVBBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBNUEFSb2J1c3REZXBheSBHc3RSdHBNUEFSb2J1c3REZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBNUEFSb2J1c3REZXBheUNsYXNzIEdzdFJ0cE1QQVJvYnVzdERlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwTVBBUm9idXN0RGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKyAgZ2Jvb2xlYW4gICAgaGFzX2Rlc2NyaXB0b3I7CisKKyAgLyogbGFzdCBpbnRlcmxlYXZlIGluZGV4ICovCisgIGdpbnQgICAgICAgIGxhc3RfaWk7CisgIC8qIGxhc3QgaW50ZXJsZWF2ZSBjeWNsZSBjb3VudCAqLworICBnaW50ICAgICAgICBsYXN0X2ljYzsKKyAgLyogYnVmZmVycyBwZW5kaW5nIGRlaW50ZXJsZWF2aW5nICovCisgIEdzdEJ1ZmZlciAgICpkZWludGVyWzI1Nl07CisKKyAgLyogQURVIGJ1ZmZlcnMgcGVuZGluZyBNUDMgdHJhbnNmb3JtYXRpb24gKi8KKyAgR1F1ZXVlICAgICAgKmFkdV9mcmFtZXM7CisgIEdMaXN0ICAgICAgICpjdXJfYWR1X2ZyYW1lOworICBnaW50ICAgICAgICAgb2Zmc2V0OworICBnaW50ICAgICAgICAgc2l6ZTsKKyAgR3N0Qnl0ZVdyaXRlciAqbXAzX2ZyYW1lOworfTsKKworc3RydWN0IF9Hc3RSdHBNUEFSb2J1c3REZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX21wYV9yb2J1c3RfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfTVBBX1JPQlVTVF9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzMxOTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBtcHZkZXBheS5jCkBAIC0wLDAgKzEsMTk4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0cnRwbXB2ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBtcHZkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwbXB2ZGVwYXlfZGVidWcpCisKKy8qIEZJWE1FLCB3ZSBzZXQgdGhlIG1wZWcgdmVyc2lvbiB0byAyLCB3ZSBzaG91bGQgaWRlYWxseSBiZSBsb29raW5nIGF0IGNvbnRlbnRzCisgKiBvZiB0aGUgc3RyZWFtIHRvIGZpZ3VyZSBvdXQgdGhlIHZlcnNpb24gKi8KK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX21wdl9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUworICAgICgidmlkZW8vbXBlZywgbXBlZ3ZlcnNpb24gPSAoaW50KSAyLCBzeXN0ZW1zdHJlYW0gPSAoYm9vbGVhbikgRkFMU0UiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX21wdl9kZXBheV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiTVBWXCI7IgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfTVBWX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAiKQorICAgICk7CisKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cE1QVkRlcGF5LCBnc3RfcnRwX21wdl9kZXBheSwgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfbXB2X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9tcHZfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcHZfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UnRwTVBWRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcHZfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9tcHZfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgTVBFRyB2aWRlbyBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgTVBFRyB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgMjI1MCkiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX21wdl9kZXBheV9zZXRjYXBzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX21wdl9kZXBheV9wcm9jZXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBtcHZkZXBheV9kZWJ1ZywgInJ0cG1wdmRlcGF5IiwgMCwKKyAgICAgICJNUEVHIFZpZGVvIFJUUCBEZXBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcHZfZGVwYXlfaW5pdCAoR3N0UnRwTVBWRGVwYXkgKiBydHBtcHZkZXBheSkKK3sKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX21wdl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgR3N0Q2FwcyAqb3V0Y2FwczsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjbG9jay1yYXRlIiwgJmNsb2NrX3JhdGUpKQorICAgIGNsb2NrX3JhdGUgPSA5MDAwMDsgICAgICAgICAvKiBkZWZhdWx0ICovCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgb3V0Y2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby9tcGVnIiwKKyAgICAgICJtcGVndmVyc2lvbiIsIEdfVFlQRV9JTlQsIDIsCisgICAgICAic3lzdGVtc3RyZWFtIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgcmVzID0gZ3N0X3BhZF9zZXRfY2FwcyAoZGVwYXlsb2FkLT5zcmNwYWQsIG91dGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAob3V0Y2Fwcyk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX21wdl9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cE1QVkRlcGF5ICpydHBtcHZkZXBheTsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworCisgIHJ0cG1wdmRlcGF5ID0gR1NUX1JUUF9NUFZfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgeworICAgIGdpbnQgcGF5bG9hZF9sZW4sIHBheWxvYWRfaGVhZGVyOworICAgIGd1aW50OCAqcGF5bG9hZDsKKyAgICBndWludDggVDsKKworICAgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworICAgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAocnRwKTsKKyAgICBwYXlsb2FkX2hlYWRlciA9IDA7CisKKyAgICBpZiAocGF5bG9hZF9sZW4gPD0gNCkKKyAgICAgIGdvdG8gZW1wdHlfcGFja2V0OworCisgICAgLyogMy40IE1QRUcgVmlkZW8tc3BlY2lmaWMgaGVhZGVyCisgICAgICoKKyAgICAgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqIHwgICAgTUJaICB8VHwgICAgICAgICBUUiAgICAgICAgfCB8TnxTfEJ8RXwgIFAgIHwgfCBCRkMgfCB8IEZGQyB8CisgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTiAgICAgICAgICAgICAgRkJWICAgICBGRlYKKyAgICAgKi8KKyAgICBUID0gKHBheWxvYWRbMF0gJiAweDA0KTsKKworICAgIHBheWxvYWRfbGVuIC09IDQ7CisgICAgcGF5bG9hZF9oZWFkZXIgKz0gNDsKKyAgICBwYXlsb2FkICs9IDQ7CisKKyAgICBpZiAoVCkgeworICAgICAgLyogCisgICAgICAgKiAzLjQuMSBNUEVHLTIgVmlkZW8tc3BlY2lmaWMgaGVhZGVyIGV4dGVuc2lvbgorICAgICAgICoKKyAgICAgICAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICogfFh8RXxmX1swLDBdfGZfWzAsMV18Zl9bMSwwXXxmX1sxLDFdfCBEQ3wgUFN8VHxQfEN8UXxWfEF8UnxIfEd8RHwKKyAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKi8KKyAgICAgIGlmIChwYXlsb2FkX2xlbiA8PSA0KQorICAgICAgICBnb3RvIGVtcHR5X3BhY2tldDsKKworICAgICAgcGF5bG9hZF9sZW4gLT0gNDsKKyAgICAgIHBheWxvYWRfaGVhZGVyICs9IDQ7CisgICAgICBwYXlsb2FkICs9IDQ7CisgICAgfQorCisgICAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfc3ViYnVmZmVyIChydHAsIHBheWxvYWRfaGVhZGVyLCAtMSk7CisKKyAgICBpZiAob3V0YnVmKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBtcHZkZXBheSwKKyAgICAgICAgICAiZ3N0X3J0cF9tcHZfZGVwYXlfY2hhaW46IHB1c2hpbmcgYnVmZmVyIG9mIHNpemUgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0YnVmKSk7CisgICAgICBnc3RfcnRwX2Ryb3Bfbm9uX3ZpZGVvX21ldGEgKHJ0cG1wdmRlcGF5LCBvdXRidWYpOworCisgICAgfQorICB9CisKKyAgcmV0dXJuIG91dGJ1ZjsKKworICAvKiBFUlJPUlMgKi8KK2VtcHR5X3BhY2tldDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cG1wdmRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkVtcHR5IHBheWxvYWQuIikpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK2dib29sZWFuCitnc3RfcnRwX21wdl9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cG1wdmRlcGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX01QVl9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cG1wdmRlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBmNmM0MwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXB2ZGVwYXkuaApAQCAtMCwwICsxLDU4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfTVBWX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfTVBWX0RFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX01QVl9ERVBBWSBcCisgIChnc3RfcnRwX21wdl9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX01QVl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9NUFZfREVQQVksR3N0UnRwTVBWRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX01QVl9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTVBWX0RFUEFZLEdzdFJ0cE1QVkRlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QVl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9NUFZfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QVl9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfTVBWX0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cE1QVkRlcGF5IEdzdFJ0cE1QVkRlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cE1QVkRlcGF5Q2xhc3MgR3N0UnRwTVBWRGVwYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBNUFZEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKK307CisKK3N0cnVjdCBfR3N0UnRwTVBWRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9tcHZfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX21wdl9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9NUFZfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cG1wdnBheS5jIGIvZ3N0L3J0cC9nc3RydHBtcHZwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjczYWYyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBtcHZwYXkuYwpAQCAtMCwwICsxLDMzNSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlICJnc3RydHBtcHZwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBtcHZwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cG1wdnBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfbXB2X3BheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL21wZWcsICIKKyAgICAgICAgIm1wZWd2ZXJzaW9uID0gKGludCkgMiwgc3lzdGVtc3RyZWFtID0gKGJvb2xlYW4pIEZBTFNFIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9tcHZfcGF5X3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX01QVl9TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJNUFZcIjsgIgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJNUFZcIiIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfbXB2X3BheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX21wdl9wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX21wdl9wYXlfZmx1c2ggKEdzdFJUUE1QVlBheSAqIHJ0cG1wdnBheSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tcHZfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX21wdl9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKgorICAgIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tcHZfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworI2RlZmluZSBnc3RfcnRwX21wdl9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UlRQTVBWUGF5LCBnc3RfcnRwX21wdl9wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcHZfcGF5X2NsYXNzX2luaXQgKEdzdFJUUE1QVlBheUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzICpnc3RydHBiYXNlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX21wdl9wYXlfZmluYWxpemU7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF9tcHZfcGF5X2NoYW5nZV9zdGF0ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX21wdl9wYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfbXB2X3BheV9zcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIE1QRUcyIEVTIHZpZGVvIHBheWxvYWRlciIsICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQtZW5jb2RlcyBNUEVHMiBFUyBpbnRvIFJUUCBwYWNrZXRzIChSRkMgMjI1MCkiLAorICAgICAgIlRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9tcHZfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF9tcHZfcGF5X2hhbmRsZV9idWZmZXI7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5zaW5rX2V2ZW50ID0gZ3N0X3J0cF9tcHZfcGF5X3NpbmtfZXZlbnQ7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cG1wdnBheV9kZWJ1ZywgInJ0cG1wdnBheSIsIDAsCisgICAgICAiTVBFRzIgRVMgVmlkZW8gUlRQIFBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tcHZfcGF5X2luaXQgKEdzdFJUUE1QVlBheSAqIHJ0cG1wdnBheSkKK3sKKyAgR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cG1wdnBheSktPmNsb2NrX3JhdGUgPSA5MDAwMDsKKyAgR1NUX1JUUF9CQVNFX1BBWUxPQURfUFQgKHJ0cG1wdnBheSkgPSBHU1RfUlRQX1BBWUxPQURfTVBWOworCisgIHJ0cG1wdnBheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXB2X3BheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UlRQTVBWUGF5ICpydHBtcHZwYXk7CisKKyAgcnRwbXB2cGF5ID0gR1NUX1JUUF9NUFZfUEFZIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChydHBtcHZwYXktPmFkYXB0ZXIpOworICBydHBtcHZwYXktPmFkYXB0ZXIgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXB2X3BheV9yZXNldCAoR3N0UlRQTVBWUGF5ICogcGF5KQoreworICBwYXktPmZpcnN0X3RzID0gLTE7CisgIHBheS0+ZHVyYXRpb24gPSAwOworICBnc3RfYWRhcHRlcl9jbGVhciAocGF5LT5hZGFwdGVyKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocGF5LCAicmVzZXQgZGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX21wdl9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHBheWxvYWQsICJ2aWRlbyIsCisgICAgICBwYXlsb2FkLT5wdCAhPSBHU1RfUlRQX1BBWUxPQURfTVBWLCAiTVBWIiwgOTAwMDApOworICByZXR1cm4gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsIE5VTEwpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXB2X3BheV9zaW5rX2V2ZW50IChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJldDsKKyAgR3N0UlRQTVBWUGF5ICpydHBtcHZwYXk7CisKKyAgcnRwbXB2cGF5ID0gR1NUX1JUUF9NUFZfUEFZIChwYXlsb2FkKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgICAvKiBtYWtlIHN1cmUgd2UgcHVzaCB0aGUgbGFzdCBwYWNrZXRzIGluIHRoZSBhZGFwdGVyIG9uIEVPUyAqLworICAgICAgZ3N0X3J0cF9tcHZfcGF5X2ZsdXNoIChydHBtcHZwYXkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9ydHBfbXB2X3BheV9yZXNldCAocnRwbXB2cGF5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChwYXlsb2FkLCBldmVudCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBSVFBfSEVBREVSX0xFTiAxMgorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9tcHZfcGF5X2ZsdXNoIChHc3RSVFBNUFZQYXkgKiBydHBtcHZwYXkpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludCBhdmFpbDsKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdDsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisKKyAgZ3VpbnQ4ICpwYXlsb2FkOworCisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBtcHZwYXktPmFkYXB0ZXIpOworCisgIHJldCA9IEdTVF9GTE9XX09LOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cG1wdnBheSwgImF2YWlsYWJsZSAldSIsIGF2YWlsKTsKKyAgaWYgKGF2YWlsID09IDApCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIGxpc3QgPQorICAgICAgZ3N0X2J1ZmZlcl9saXN0X25ld19zaXplZCAoYXZhaWwgLyAoR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChydHBtcHZwYXkpIC0KKyAgICAgICAgICBSVFBfSEVBREVSX0xFTikgKyAxKTsKKworICB3aGlsZSAoYXZhaWwgPiAwKSB7CisgICAgZ3VpbnQgdG93cml0ZTsKKyAgICBndWludCBwYWNrZXRfbGVuOworICAgIGd1aW50IHBheWxvYWRfbGVuOworICAgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwgfTsKKyAgICBHc3RCdWZmZXIgKnBheWJ1ZjsKKworICAgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKGF2YWlsICsgNCwgMCwgMCk7CisKKyAgICB0b3dyaXRlID0gTUlOIChwYWNrZXRfbGVuLCBHU1RfUlRQX0JBU0VfUEFZTE9BRF9NVFUgKHJ0cG1wdnBheSkpOworCisgICAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BheWxvYWRfbGVuICh0b3dyaXRlLCAwLCAwKTsKKworICAgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoNCwgMCwgMCk7CisKKyAgICBwYXlsb2FkX2xlbiAtPSA0OworCisgICAgZ3N0X3J0cF9idWZmZXJfbWFwIChvdXRidWYsIEdTVF9NQVBfV1JJVEUsICZydHApOworCisgICAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKyAgICAvKiBlbmFibGUgTVBFRyBWaWRlby1zcGVjaWZpYyBoZWFkZXIKKyAgICAgKgorICAgICAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICogfCAgICBNQlogIHxUfCAgICAgICAgIFRSICAgICAgICB8IHxOfFN8QnxFfCAgUCAgfCB8IEJGQyB8IHwgRkZDIHwKKyAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOICAgICAgICAgICAgICBGQlYgICAgIEZGVgorICAgICAqLworCisgICAgLyogZmlsbCBpbiB0aGUgTVBFRyBWaWRlby1zcGVjaWZpYyBoZWFkZXIgCisgICAgICogZGF0YSBpcyBzZXQgdG8gMHgwIGhlcmUKKyAgICAgKi8KKyAgICBtZW1zZXQgKHBheWxvYWQsIDB4MCwgNCk7CisKKyAgICBhdmFpbCAtPSBwYXlsb2FkX2xlbjsKKworICAgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKCZydHAsIGF2YWlsID09IDApOworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAgIHBheWJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyX2Zhc3QgKHJ0cG1wdnBheS0+YWRhcHRlciwgcGF5bG9hZF9sZW4pOworICAgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHBtcHZwYXksIG91dGJ1ZiwgcGF5YnVmKTsKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX2FwcGVuZCAob3V0YnVmLCBwYXlidWYpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwbXB2cGF5LCAiQWRkaW5nIGJ1ZmZlciIpOworCisgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBydHBtcHZwYXktPmZpcnN0X3RzOworICAgIGdzdF9idWZmZXJfbGlzdF9hZGQgKGxpc3QsIG91dGJ1Zik7CisgIH0KKworICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoX2xpc3QgKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBtcHZwYXkpLCBsaXN0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9tcHZfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSVFBNUFZQYXkgKnJ0cG1wdnBheTsKKyAgZ3VpbnQgYXZhaWwsIHBhY2tldF9sZW47CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIGR1cmF0aW9uOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIHJ0cG1wdnBheSA9IEdTVF9SVFBfTVBWX1BBWSAoYmFzZXBheWxvYWQpOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisKKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAoYnVmZmVyKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cG1wdnBheSwgIkRJU0NPTlQiKTsKKyAgICBnc3RfcnRwX21wdl9wYXlfcmVzZXQgKHJ0cG1wdnBheSk7CisgIH0KKworICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwbXB2cGF5LT5hZGFwdGVyKTsKKworICBpZiAoZHVyYXRpb24gPT0gLTEpCisgICAgZHVyYXRpb24gPSAwOworCisgIGlmIChydHBtcHZwYXktPmZpcnN0X3RzID09IEdTVF9DTE9DS19USU1FX05PTkUgfHwgYXZhaWwgPT0gMCkKKyAgICBydHBtcHZwYXktPmZpcnN0X3RzID0gdGltZXN0YW1wOworCisgIGlmIChhdmFpbCA9PSAwKSB7CisgICAgcnRwbXB2cGF5LT5kdXJhdGlvbiA9IGR1cmF0aW9uOworICB9IGVsc2UgeworICAgIHJ0cG1wdnBheS0+ZHVyYXRpb24gKz0gZHVyYXRpb247CisgIH0KKworICBnc3RfYWRhcHRlcl9wdXNoIChydHBtcHZwYXktPmFkYXB0ZXIsIGJ1ZmZlcik7CisgIGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHBtcHZwYXktPmFkYXB0ZXIpOworCisgIC8qIGdldCBwYWNrZXQgbGVuZ3RoIG9mIHByZXZpb3VzIGRhdGEgYW5kIHRoaXMgbmV3IGRhdGEsCisgICAqIHBheWxvYWQgbGVuZ3RoIGluY2x1ZGVzIGEgNCBieXRlIE1QRUcgdmlkZW8tc3BlY2lmaWMgaGVhZGVyICovCisgIHBhY2tldF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9jYWxjX3BhY2tldF9sZW4gKGF2YWlsLCA0LCAwKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHJ0cG1wdnBheSwgImF2YWlsYWJsZSAlZCwgcnRwIHBhY2tldCBsZW5ndGggJWQiLCBhdmFpbCwKKyAgICAgIHBhY2tldF9sZW4pOworCisgIGlmIChnc3RfcnRwX2Jhc2VfcGF5bG9hZF9pc19maWxsZWQgKGJhc2VwYXlsb2FkLAorICAgICAgICAgIHBhY2tldF9sZW4sIHJ0cG1wdnBheS0+ZHVyYXRpb24pKSB7CisgICAgcmV0ID0gZ3N0X3J0cF9tcHZfcGF5X2ZsdXNoIChydHBtcHZwYXkpOworICB9IGVsc2UgeworICAgIHJ0cG1wdnBheS0+Zmlyc3RfdHMgPSB0aW1lc3RhbXA7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfbXB2X3BheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSVFBNUFZQYXkgKnJ0cG1wdnBheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJ0cG1wdnBheSA9IEdTVF9SVFBfTVBWX1BBWSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGdzdF9ydHBfbXB2X3BheV9yZXNldCAocnRwbXB2cGF5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfcnRwX21wdl9wYXlfcmVzZXQgKHJ0cG1wdnBheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworCitnYm9vbGVhbgorZ3N0X3J0cF9tcHZfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwbXB2cGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX01QVl9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBtcHZwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwbXB2cGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNlYmFkOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwbXB2cGF5LmgKQEAgLTAsMCArMSw2NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBUaGlqcyBWZXJtZWlyIDx0aGlqc3Zlcm1laXJAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9SVFBfTVBWX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX01QVl9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQTVBWUGF5IEdzdFJUUE1QVlBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBNUFZQYXlDbGFzcyBHc3RSVFBNUFZQYXlDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfTVBWX1BBWSBcCisgIChnc3RfcnRwX21wdl9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9NUFZfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX01QVl9QQVksR3N0UlRQTVBWUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9NUFZfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NUFZfUEFZLEdzdFJUUE1QVlBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9NUFZfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX01QVl9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX01QVl9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX01QVl9QQVkpKQorCitzdHJ1Y3QgX0dzdFJUUE1QVlBheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCBwYXlsb2FkOworCisgIEdzdEFkYXB0ZXIgICphZGFwdGVyOworICBHc3RDbG9ja1RpbWUgZmlyc3RfdHM7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbjsKK307CisKK3N0cnVjdCBfR3N0UlRQTVBWUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX21wdl9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX21wdl9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfTVBWX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwb3B1c2RlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cG9wdXNkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NzIzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG9wdXNkZXBheS5jCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogT3B1cyBEZXBheWxvYWRlciBHc3QgRWxlbWVudAorICoKKyAqICAgQGF1dGhvcjogRGFuaWxvIENlc2FyIExlbWVzIGRlIFBhdWxhIDxkYW5pbG8uY2VzYXJAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlICJnc3RydHBvcHVzZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBvcHVzZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cG9wdXNkZXBheV9kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfb3B1c19kZXBheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDQ4MDAwLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgeyBcIk9QVVNcIiwgXCJYLUdTVC1PUFVTLURSQUZULVNQSVRUS0EtMDBcIiB9IikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9vcHVzX2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1vcHVzLCBjaGFubmVsLW1hcHBpbmctZmFtaWx5ID0gKGludCkgMCIpCisgICAgKTsKKworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9vcHVzX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwX2J1ZmZlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9vcHVzX2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworCitHX0RFRklORV9UWVBFIChHc3RSVFBPcHVzRGVwYXksIGdzdF9ydHBfb3B1c19kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9vcHVzX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJUUE9wdXNEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0YmFzZXJ0cGRlcGF5bG9hZF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworCisgIGVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBnc3RiYXNlcnRwZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX29wdXNfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9vcHVzX2RlcGF5X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBPcHVzIHBhY2tldCBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgT3B1cyBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIiwKKyAgICAgICJEYW5pbG8gQ2VzYXIgTGVtZXMgZGUgUGF1bGEgPGRhbmlsby5jZXNhckBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZ3N0YmFzZXJ0cGRlcGF5bG9hZF9jbGFzcy0+cHJvY2Vzc19ydHBfcGFja2V0ID0gZ3N0X3J0cF9vcHVzX2RlcGF5X3Byb2Nlc3M7CisgIGdzdGJhc2VydHBkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9vcHVzX2RlcGF5X3NldGNhcHM7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cG9wdXNkZXBheV9kZWJ1ZywgInJ0cG9wdXNkZXBheSIsIDAsCisgICAgICAiT3B1cyBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfb3B1c19kZXBheV9pbml0IChHc3RSVFBPcHVzRGVwYXkgKiBydHBvcHVzZGVwYXkpCit7CisKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX29wdXNfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgZ2Jvb2xlYW4gcmV0OworICBjb25zdCBnY2hhciAqc3Byb3Bfc3RlcmVvLCAqc3Byb3BfbWF4Y2FwdHVyZXJhdGU7CisKKyAgc3JjY2FwcyA9CisgICAgICBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1vcHVzIiwgImNoYW5uZWwtbWFwcGluZy1mYW1pbHkiLCBHX1RZUEVfSU5ULAorICAgICAgMCwgTlVMTCk7CisKKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBpZiAoKHNwcm9wX3N0ZXJlbyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgInNwcm9wLXN0ZXJlbyIpKSkgeworICAgIGlmIChzdHJjbXAgKHNwcm9wX3N0ZXJlbywgIjAiKSA9PSAwKQorICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoc3JjY2FwcywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMSwgTlVMTCk7CisgICAgZWxzZSBpZiAoc3RyY21wIChzcHJvcF9zdGVyZW8sICIxIikgPT0gMCkKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKHNyY2NhcHMsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDIsIE5VTEwpOworICAgIGVsc2UKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVwYXlsb2FkLCAiVW5rbm93biBzcHJvcC1zdGVyZW8gdmFsdWUgJyVzJyIsCisgICAgICAgICAgc3Byb3Bfc3RlcmVvKTsKKyAgfQorCisgIGlmICgoc3Byb3BfbWF4Y2FwdHVyZXJhdGUgPQorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgInNwcm9wLW1heGNhcHR1cmVyYXRlIikpKSB7CisgICAgZ3Vsb25nIHJhdGU7CisgICAgZ2NoYXIgKnRhaWxwdHI7CisKKyAgICByYXRlID0gc3RydG91bCAoc3Byb3BfbWF4Y2FwdHVyZXJhdGUsICZ0YWlscHRyLCAxMCk7CisgICAgaWYgKHJhdGUgPiBJTlRfTUFYIHx8ICp0YWlscHRyICE9ICdcMCcpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVwYXlsb2FkLAorICAgICAgICAgICJGYWlsZWQgdG8gcGFyc2Ugc3Byb3AtbWF4Y2FwdHVyZXJhdGUgdmFsdWUgJyVzJyIsCisgICAgICAgICAgc3Byb3BfbWF4Y2FwdHVyZXJhdGUpOworICAgIH0gZWxzZSB7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChzcmNjYXBzLCAicmF0ZSIsIEdfVFlQRV9JTlQsIHJhdGUsIE5VTEwpOworICAgIH0KKyAgfQorCisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNjYXBzKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsCisgICAgICAic2V0IGNhcHMgb24gc291cmNlOiAlIiBHU1RfUFRSX0ZPUk1BVCAiIChyZXQ9JWQpIiwgc3JjY2FwcywgcmV0KTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IDQ4MDAwOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9vcHVzX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwX2J1ZmZlcikKK3sKKyAgR3N0QnVmZmVyICpvdXRidWY7CisKKyAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfYnVmZmVyIChydHBfYnVmZmVyKTsKKworICBnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKGRlcGF5bG9hZCwgb3V0YnVmKTsKKworICByZXR1cm4gb3V0YnVmOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9vcHVzX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwb3B1c2RlcGF5IiwKKyAgICAgIEdTVF9SQU5LX1BSSU1BUlksIEdTVF9UWVBFX1JUUF9PUFVTX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwb3B1c2RlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cG9wdXNkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4Y2M4NTEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cG9wdXNkZXBheS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBPcHVzIERlcGF5bG9hZGVyIEdzdCBFbGVtZW50CisgKgorICogICBAYXV0aG9yOiBEYW5pbG8gQ2VzYXIgTGVtZXMgZGUgUGF1bGEgPGRhbmlsby5ldUBnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfT1BVU19ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX09QVVNfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMgdHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUE9wdXNEZXBheSBHc3RSVFBPcHVzRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQT3B1c0RlcGF5Q2xhc3MgR3N0UlRQT3B1c0RlcGF5Q2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX09QVVNfREVQQVkgXAorICAoZ3N0X3J0cF9vcHVzX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfT1BVU19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9PUFVTX0RFUEFZLEdzdFJUUE9wdXNEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfT1BVU19ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfT1BVU19ERVBBWSxHc3RSVFBPcHVzRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfT1BVU19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9PUFVTX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9PUFVTX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9PUFVTX0RFUEFZKSkKKworCitzdHJ1Y3QgX0dzdFJUUE9wdXNEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKKworfTsKKworc3RydWN0IF9Hc3RSVFBPcHVzRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9vcHVzX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9vcHVzX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1JUUF9PUFVTX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cG9wdXNwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjEwODg1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmMKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiBPcHVzIFBheWxvYWRlciBHc3QgRWxlbWVudAorICoKKyAqICAgQGF1dGhvcjogRGFuaWxvIENlc2FyIExlbWVzIGRlIFBhdWxhIDxkYW5pbG8uY2VzYXJAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSAiZ3N0cnRwb3B1c3BheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cG9wdXNwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cG9wdXNwYXlfZGVidWcpCisKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfb3B1c19wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMKKyAgICAoImF1ZGlvL3gtb3B1cywgY2hhbm5lbHMgPSAoaW50KSBbMSwgMl0sIGNoYW5uZWwtbWFwcGluZy1mYW1pbHkgPSAoaW50KSAwIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9vcHVzX3BheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA0ODAwMCwgIgorICAgICAgICAiZW5jb2RpbmctcGFyYW1zID0gKHN0cmluZykgXCIyXCIsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSB7IFwiT1BVU1wiLCBcIlgtR1NULU9QVVMtRFJBRlQtU1BJVFRLQS0wMFwiIH0iKQorICAgICk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX29wdXNfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3J0cF9vcHVzX3BheV9nZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0UGFkICogcGFkLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfb3B1c19wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKgorICAgIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cE9QVVNQYXksIGdzdF9ydHBfb3B1c19wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9vcHVzX3BheV9jbGFzc19pbml0IChHc3RSdHBPUFVTUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0YmFzZXJ0cHBheWxvYWRfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKworICBnc3RiYXNlcnRwcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworICBlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKworICBnc3RiYXNlcnRwcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX29wdXNfcGF5X3NldGNhcHM7CisgIGdzdGJhc2VydHBwYXlsb2FkX2NsYXNzLT5nZXRfY2FwcyA9IGdzdF9ydHBfb3B1c19wYXlfZ2V0Y2FwczsKKyAgZ3N0YmFzZXJ0cHBheWxvYWRfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX29wdXNfcGF5X2hhbmRsZV9idWZmZXI7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9vcHVzX3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX29wdXNfcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIE9wdXMgcGF5bG9hZGVyIiwKKyAgICAgICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlB1dHMgT3B1cyBhdWRpbyBpbiBSVFAgcGFja2V0cyIsCisgICAgICAiRGFuaWxvIENlc2FyIExlbWVzIGRlIFBhdWxhIDxkYW5pbG8uY2VzYXJAY29sbGFib3JhLmNvLnVrPiIpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBvcHVzcGF5X2RlYnVnLCAicnRwb3B1c3BheSIsIDAsCisgICAgICAiT3B1cyBSVFAgUGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX29wdXNfcGF5X2luaXQgKEdzdFJ0cE9QVVNQYXkgKiBydHBvcHVzcGF5KQoreworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfb3B1c19wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RDYXBzICpzcmNfY2FwczsKKyAgR3N0U3RydWN0dXJlICpzOworICBjaGFyICplbmNvZGluZ19uYW1lOworICBnaW50IGNoYW5uZWxzLCByYXRlOworICBjb25zdCBjaGFyICpzcHJvcF9zdGVyZW8gPSBOVUxMOworICBjaGFyICpzcHJvcF9tYXhjYXB0dXJlcmF0ZSA9IE5VTEw7CisKKyAgc3JjX2NhcHMgPSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRCAocGF5bG9hZCkpOworICBpZiAoc3JjX2NhcHMpIHsKKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKHNyY19jYXBzKTsKKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX3RydW5jYXRlIChzcmNfY2Fwcyk7CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHNyY19jYXBzLCAwKTsKKyAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9zdHJpbmcgKHMsICJlbmNvZGluZy1uYW1lIiwgIk9QVVMiKTsKKyAgICBlbmNvZGluZ19uYW1lID0gZ19zdHJkdXAgKGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgImVuY29kaW5nLW5hbWUiKSk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHNyY19jYXBzKTsKKyAgfSBlbHNlIHsKKyAgICBlbmNvZGluZ19uYW1lID0gZ19zdHJkdXAgKCJYLUdTVC1PUFVTLURSQUZULVNQSVRUS0EtMDAiKTsKKyAgfQorCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImNoYW5uZWxzIiwgJmNoYW5uZWxzKSkgeworICAgIGlmIChjaGFubmVscyA+IDIpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBheWxvYWQsCisgICAgICAgICAgIk1vcmUgdGhhbiAyIGNoYW5uZWxzIHdpdGggY2hhbm5lbC1tYXBwaW5nLWZhbWlseT0wIGlzIGludmFsaWQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9IGVsc2UgaWYgKGNoYW5uZWxzID09IDIpIHsKKyAgICAgIHNwcm9wX3N0ZXJlbyA9ICIxIjsKKyAgICB9IGVsc2UgeworICAgICAgc3Byb3Bfc3RlcmVvID0gIjAiOworICAgIH0KKyAgfQorCisgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJyYXRlIiwgJnJhdGUpKSB7CisgICAgc3Byb3BfbWF4Y2FwdHVyZXJhdGUgPSBnX3N0cmR1cF9wcmludGYgKCIlZCIsIHJhdGUpOworICB9CisKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHBheWxvYWQsICJhdWRpbyIsIEZBTFNFLAorICAgICAgZW5jb2RpbmdfbmFtZSwgNDgwMDApOworICBnX2ZyZWUgKGVuY29kaW5nX25hbWUpOworCisgIGlmIChzcHJvcF9tYXhjYXB0dXJlcmF0ZSAmJiBzcHJvcF9zdGVyZW8pIHsKKyAgICByZXMgPQorICAgICAgICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAocGF5bG9hZCwgInNwcm9wLW1heGNhcHR1cmVyYXRlIiwKKyAgICAgICAgR19UWVBFX1NUUklORywgc3Byb3BfbWF4Y2FwdHVyZXJhdGUsICJzcHJvcC1zdGVyZW8iLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICBzcHJvcF9zdGVyZW8sIE5VTEwpOworICB9IGVsc2UgaWYgKHNwcm9wX21heGNhcHR1cmVyYXRlKSB7CisgICAgcmVzID0KKyAgICAgICAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsICJzcHJvcC1tYXhjYXB0dXJlcmF0ZSIsCisgICAgICAgIEdfVFlQRV9TVFJJTkcsIHNwcm9wX21heGNhcHR1cmVyYXRlLCBOVUxMKTsKKyAgfSBlbHNlIGlmIChzcHJvcF9zdGVyZW8pIHsKKyAgICByZXMgPQorICAgICAgICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAocGF5bG9hZCwgInNwcm9wLXN0ZXJlbyIsCisgICAgICAgIEdfVFlQRV9TVFJJTkcsIHNwcm9wX3N0ZXJlbywgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsIE5VTEwpOworICB9CisKKyAgZ19mcmVlIChzcHJvcF9tYXhjYXB0dXJlcmF0ZSk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfb3B1c19wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RDbG9ja1RpbWUgcHRzLCBkdHMsIGR1cmF0aW9uOworCisgIHB0cyA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICBkdHMgPSBHU1RfQlVGRkVSX0RUUyAoYnVmZmVyKTsKKyAgZHVyYXRpb24gPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpOworCisgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMCwgMCwgMCk7CisKKyAgZ3N0X3J0cF9jb3B5X2F1ZGlvX21ldGEgKGJhc2VwYXlsb2FkLCBvdXRidWYsIGJ1ZmZlcik7CisKKyAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKG91dGJ1ZiwgYnVmZmVyKTsKKworICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA9IHB0czsKKyAgR1NUX0JVRkZFUl9EVFMgKG91dGJ1ZikgPSBkdHM7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPSBkdXJhdGlvbjsKKworICAvKiBQdXNoIG91dCAqLworICByZXR1cm4gZ3N0X3J0cF9iYXNlX3BheWxvYWRfcHVzaCAoYmFzZXBheWxvYWQsIG91dGJ1Zik7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9ydHBfb3B1c19wYXlfZ2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqY2FwcywgKnBlZXJjYXBzLCAqdGNhcHM7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgY29uc3QgZ2NoYXIgKnN0ZXJlbzsKKworICBpZiAocGFkID09IEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRCAocGF5bG9hZCkpCisgICAgcmV0dXJuCisgICAgICAgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChnc3RfcnRwX29wdXNfcGF5X3BhcmVudF9jbGFzcyktPmdldF9jYXBzCisgICAgICAgIChwYXlsb2FkLCBwYWQsIGZpbHRlcik7CisKKyAgdGNhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX1JUUF9CQVNFX1BBWUxPQURfU1JDUEFEIChwYXlsb2FkKSk7CisgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRCAocGF5bG9hZCksCisgICAgICB0Y2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmICh0Y2Fwcyk7CisgIGlmICghcGVlcmNhcHMpCisgICAgcmV0dXJuCisgICAgICAgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChnc3RfcnRwX29wdXNfcGF5X3BhcmVudF9jbGFzcyktPmdldF9jYXBzCisgICAgICAgIChwYXlsb2FkLCBwYWQsIGZpbHRlcik7CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChwZWVyY2FwcykpCisgICAgcmV0dXJuIHBlZXJjYXBzOworCisgIGNhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX1JUUF9CQVNFX1BBWUxPQURfU0lOS1BBRCAocGF5bG9hZCkpOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChwZWVyY2FwcywgMCk7CisgIHN0ZXJlbyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgInN0ZXJlbyIpOworICBpZiAoc3RlcmVvICE9IE5VTEwpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoY2Fwcyk7CisKKyAgICBpZiAoIXN0cmNtcCAoc3RlcmVvLCAiMSIpKSB7CisgICAgICBHc3RDYXBzICpjYXBzMiA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworCisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAyLCBOVUxMKTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMyLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19tZXJnZSAoY2FwcywgY2FwczIpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcCAoc3RlcmVvLCAiMCIpKSB7CisgICAgICBHc3RDYXBzICpjYXBzMiA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworCisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMyLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAyLCBOVUxMKTsKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19tZXJnZSAoY2FwcywgY2FwczIpOworICAgIH0KKyAgfQorICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworCisgIGlmIChmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICp0bXAgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoY2FwcywgZmlsdGVyLAorICAgICAgICBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICBjYXBzID0gdG1wOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGF5bG9hZCwgIlJldHVybmluZyBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgIHJldHVybiBjYXBzOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9vcHVzX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cG9wdXNwYXkiLAorICAgICAgR1NUX1JBTktfUFJJTUFSWSwgR1NUX1RZUEVfUlRQX09QVVNfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwb3B1c3BheS5oIGIvZ3N0L3J0cC9nc3RydHBvcHVzcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmNDBkOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwb3B1c3BheS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBPcHVzIFBheWxvYWRlciBHc3QgRWxlbWVudAorICoKKyAqICAgQGF1dGhvcjogRGFuaWxvIENlc2FyIExlbWVzIGRlIFBhdWxhIDxkYW5pbG8uZXVAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX09QVVNfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfT1BVU19QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX09QVVNfUEFZIFwKKyAgKGdzdF9ydHBfb3B1c19wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9PUFVTX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9PUFVTX1BBWSxHc3RSdHBPUFVTUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9PUFVTX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfT1BVU19QQVksR3N0UnRwT1BVU1BheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9PUFVTX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9PUFVTX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfT1BVU19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX09QVVNfUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cE9QVVNQYXkgR3N0UnRwT1BVU1BheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBPUFVTUGF5Q2xhc3MgR3N0UnRwT1BVU1BheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cE9QVVNQYXkKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWQgcGF5bG9hZDsKK307CisKK3N0cnVjdCBfR3N0UnRwT1BVU1BheUNsYXNzCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9vcHVzX3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfb3B1c19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfT1BVU19QQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzZhMjBhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuYwpAQCAtMCwwICsxLDE2NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFplZXNoYW4gQWxpIDx6ZWVuaXhAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlICJnc3RydHBwY21hZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCisvKiBSdHBQY21hRGVwYXkgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCitlbnVtCit7CisgIFBST1BfMAorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfcGNtYV9kZXBheV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9QQ01BX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMDsiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSBbMSwgTUFYIF0sIGVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIlBDTUFcIiIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfcGNtYV9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtYWxhdywgY2hhbm5lbHMgPSAoaW50KSAxLCByYXRlID0gKGludCkgWzEsIE1BWCBdIikKKyAgICApOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX3BjbWFfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfcGNtYV9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworI2RlZmluZSBnc3RfcnRwX3BjbWFfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwUGNtYURlcGF5LCBnc3RfcnRwX3BjbWFfZGVwYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcGNtYV9kZXBheV9jbGFzc19pbml0IChHc3RSdHBQY21hRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9wY21hX2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfcGNtYV9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBQQ01BIGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBQQ01BIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMiLAorICAgICAgIkVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+LCBaZWVzaGFuIEFsaSA8emVlbml4QGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX3BjbWFfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX3BjbWFfZGVwYXlfc2V0Y2FwczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcGNtYV9kZXBheV9pbml0IChHc3RSdHBQY21hRGVwYXkgKiBydHBwY21hZGVwYXkpCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgKmRlcGF5bG9hZDsKKworICBkZXBheWxvYWQgPSBHU1RfUlRQX0JBU0VfREVQQVlMT0FEIChydHBwY21hZGVwYXkpOworCisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3BjbWFfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnYm9vbGVhbiByZXQ7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBjbG9ja19yYXRlID0gODAwMDsgICAgICAgICAgLyogZGVmYXVsdCAqLworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1hbGF3IiwKKyAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDEsICJyYXRlIiwgR19UWVBFX0lOVCwgY2xvY2tfcmF0ZSwgTlVMTCk7CisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9wY21hX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBnYm9vbGVhbiBtYXJrZXI7CisgIGd1aW50IGxlbjsKKworICBtYXJrZXIgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApOworCisgIEdTVF9ERUJVRyAoInByb2Nlc3MgOiBnb3QgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcywgbWFyayAlZCB0cyAldSBzZXFuICVkIiwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKHJ0cC0+YnVmZmVyKSwgbWFya2VyLAorICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X3RpbWVzdGFtcCAocnRwKSwgZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAocnRwKSk7CisKKyAgbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9idWZmZXIgKHJ0cCk7CisKKyAgaWYgKG91dGJ1ZikgeworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChsZW4sIEdTVF9TRUNPTkQsIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSk7CisKKyAgICBpZiAobWFya2VyKSB7CisgICAgICAvKiBtYXJrIHN0YXJ0IG9mIHRhbGtzcHVydCB3aXRoIFJFU1lOQyAqLworICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfUkVTWU5DKTsKKyAgICB9CisKKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKGRlcGF5bG9hZCwgb3V0YnVmKTsKKyAgfQorCisgIHJldHVybiBvdXRidWY7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3BjbWFfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBwY21hZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfUENNQV9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHBjbWFkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjY0YTJkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBwY21hZGVwYXkuaApAQCAtMCwwICsxLDUzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgCisgKi8KKyAKKyNpZm5kZWYgX19HU1RfUlRQX1BDTUFfREVQQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9QQ01BX0RFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBQY21hRGVwYXkgR3N0UnRwUGNtYURlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFBjbWFEZXBheUNsYXNzIEdzdFJ0cFBjbWFEZXBheUNsYXNzOworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9QQ01BX0RFUEFZIFwKKyAgKGdzdF9ydHBfcGNtYV9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX1BDTUFfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfUENNQV9ERVBBWSxHc3RSdHBQY21hRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX1BDTUFfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX1BDTUFfREVQQVksR3N0UnRwUGNtYURlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1BDTUFfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfUENNQV9ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfUENNQV9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfUENNQV9ERVBBWSkpCisKK3N0cnVjdCBfR3N0UnRwUGNtYURlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworfTsKKworc3RydWN0IF9Hc3RSdHBQY21hRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9wY21hX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9wY21hX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX1BDTUFfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwcGNtYXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTFiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHBjbWFwYXkuYwpAQCAtMCwwICsxLDExNiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IE5va2lhIENvcnBvcmF0aW9uIDxrYWkudmVobWFuZW5Abm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworI2luY2x1ZGUgImdzdHJ0cHBjbWFwYXkuaCIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfcGNtYV9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LWFsYXcsIGNoYW5uZWxzPShpbnQpMSwgcmF0ZT0oaW50KTgwMDAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3BjbWFfcGF5X3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX1BDTUFfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA4MDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJQQ01BXCI7ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSBbMSwgTUFYIF0sICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIlBDTUFcIiIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfcGNtYV9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworI2RlZmluZSBnc3RfcnRwX3BjbWFfcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cFBjbWFQYXksIGdzdF9ydHBfcGNtYV9wYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfQVVESU9fUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3BjbWFfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cFBjbWFQYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworCisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfcGNtYV9wYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfcGNtYV9wYXlfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUlRQIFBDTUEgcGF5bG9hZGVyIiwKKyAgICAgICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQtZW5jb2RlcyBQQ01BIGF1ZGlvIGludG8gYSBSVFAgcGFja2V0IiwKKyAgICAgICJFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPiIpOworCisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfcGNtYV9wYXlfc2V0Y2FwczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcGNtYV9wYXlfaW5pdCAoR3N0UnRwUGNtYVBheSAqIHJ0cHBjbWFwYXkpCit7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgKnJ0cGJhc2VhdWRpb3BheWxvYWQ7CisKKyAgcnRwYmFzZWF1ZGlvcGF5bG9hZCA9IEdTVF9SVFBfQkFTRV9BVURJT19QQVlMT0FEIChydHBwY21hcGF5KTsKKworICBHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwcGNtYXBheSktPnB0ID0gR1NUX1JUUF9QQVlMT0FEX1BDTUE7CisgIEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBwY21hcGF5KS0+Y2xvY2tfcmF0ZSA9IDgwMDA7CisKKyAgLyogdGVsbCBydHBiYXNlYXVkaW9wYXlsb2FkIHRoYXQgdGhpcyBpcyBhIHNhbXBsZSBiYXNlZCBjb2RlYyAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfc2FtcGxlX2Jhc2VkIChydHBiYXNlYXVkaW9wYXlsb2FkKTsKKworICAvKiBvY3RldC1wZXItc2FtcGxlIGlzIDEgZm9yIFBDTSAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfc2FtcGxlX29wdGlvbnMgKHJ0cGJhc2VhdWRpb3BheWxvYWQsIDEpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfcGNtYV9wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2Jvb2xlYW4gcmVzOworCisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChwYXlsb2FkLCAiYXVkaW8iLAorICAgICAgcGF5bG9hZC0+cHQgIT0gR1NUX1JUUF9QQVlMT0FEX1BDTUEsICJQQ01BIiwgODAwMCk7CisgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXlsb2FkLCBOVUxMKTsKKworICByZXR1cm4gcmVzOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9wY21hX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHBjbWFwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfUENNQV9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBwY21hcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHBjbWFwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTA4NGFkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBwY21hcGF5LmgKQEAgLTAsMCArMSw1NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIAorICovCisKKworI2lmbmRlZiBfX0dTVF9SVFBfUENNQV9QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9QQ01BX1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VhdWRpb3BheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwUGNtYVBheSBHc3RSdHBQY21hUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFBjbWFQYXlDbGFzcyBHc3RSdHBQY21hUGF5Q2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1BDTUFfUEFZIFwKKyAgKGdzdF9ydHBfcGNtYV9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9QQ01BX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9QQ01BX1BBWSxHc3RSdHBQY21hUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9QQ01BX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfUENNQV9QQVksR3N0UnRwUGNtYVBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9QQ01BX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9QQ01BX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfUENNQV9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX1BDTUFfUEFZKSkKKworc3RydWN0IF9Hc3RSdHBQY21hUGF5Cit7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgYXVkaW9wYXlsb2FkOworfTsKKworc3RydWN0IF9Hc3RSdHBQY21hUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfcGNtYV9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX3BjbWFfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX1BDTUFfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwNmQxOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBaZWVzaGFuIEFsaSA8emVlbml4QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSAiZ3N0cnRwcGNtdWRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworLyogUnRwUGNtdURlcGF5IHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3BjbXVfZGVwYXlfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfUENNVV9TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDA7ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiUENNVVwiLCBjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWCBdIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9wY211X2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1tdWxhdywgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCByYXRlID0gKGludCkgWzEsIE1BWCBdIikKKyAgICApOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX3BjbXVfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfcGNtdV9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworI2RlZmluZSBnc3RfcnRwX3BjbXVfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwUGNtdURlcGF5LCBnc3RfcnRwX3BjbXVfZGVwYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcGNtdV9kZXBheV9jbGFzc19pbml0IChHc3RSdHBQY211RGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9wY211X2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfcGNtdV9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBQQ01VIGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBQQ01VIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMiLAorICAgICAgIkVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+LCBaZWVzaGFuIEFsaSA8emVlbml4QGdtYWlsLmNvbT4iKTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX3BjbXVfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX3BjbXVfZGVwYXlfc2V0Y2FwczsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcGNtdV9kZXBheV9pbml0IChHc3RSdHBQY211RGVwYXkgKiBydHBwY211ZGVwYXkpCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgKmRlcGF5bG9hZDsKKworICBkZXBheWxvYWQgPSBHU1RfUlRQX0JBU0VfREVQQVlMT0FEIChydHBwY211ZGVwYXkpOworCisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3BjbXVfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnYm9vbGVhbiByZXQ7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBjbG9ja19yYXRlID0gODAwMDsgICAgICAgICAgLyogZGVmYXVsdCAqLworICBkZXBheWxvYWQtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1tdWxhdyIsCisgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLCAicmF0ZSIsIEdfVFlQRV9JTlQsIGNsb2NrX3JhdGUsIE5VTEwpOworICByZXQgPSBnc3RfcGFkX3NldF9jYXBzIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAoZGVwYXlsb2FkKSwgc3JjY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfcGNtdV9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgZ3VpbnQgbGVuOworICBnYm9vbGVhbiBtYXJrZXI7CisKKyAgbWFya2VyID0gZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAocnRwKTsKKworICBHU1RfREVCVUcgKCJwcm9jZXNzIDogZ290ICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMsIG1hcmsgJWQgdHMgJXUgc2VxbiAlZCIsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChydHAtPmJ1ZmZlciksIG1hcmtlciwKKyAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF90aW1lc3RhbXAgKHJ0cCksIGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKHJ0cCkpOworCisgIGxlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKyAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfYnVmZmVyIChydHApOworCisgIGlmIChvdXRidWYpIHsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAobGVuLCBHU1RfU0VDT05ELCBkZXBheWxvYWQtPmNsb2NrX3JhdGUpOworCisgICAgaWYgKG1hcmtlcikgeworICAgICAgLyogbWFyayBzdGFydCBvZiB0YWxrc3B1cnQgd2l0aCBSRVNZTkMgKi8KKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1JFU1lOQyk7CisgICAgfQorCisgICAgZ3N0X3J0cF9kcm9wX25vbl9hdWRpb19tZXRhIChkZXBheWxvYWQsIG91dGJ1Zik7CisgIH0KKworICByZXR1cm4gb3V0YnVmOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9wY211X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwcGNtdWRlcGF5IiwKKyAgICAgIEdTVF9SQU5LX1NFQ09OREFSWSwgR1NUX1RZUEVfUlRQX1BDTVVfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBwY211ZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5NzU1OQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwcGNtdWRlcGF5LmgKQEAgLTAsMCArMSw1MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIAorICovCisgCisjaWZuZGVmIF9fR1NUX1JUUF9QQ01VX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfUENNVV9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwUGNtdURlcGF5IEdzdFJ0cFBjbXVEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBQY211RGVwYXlDbGFzcyBHc3RSdHBQY211RGVwYXlDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfUENNVV9ERVBBWSBcCisgIChnc3RfcnRwX3BjbXVfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9QQ01VX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1BDTVVfREVQQVksR3N0UnRwUGNtdURlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9QQ01VX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9QQ01VX0RFUEFZLEdzdFJ0cFBjbXVEZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9QQ01VX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1BDTVVfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX1BDTVVfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX1BDTVVfREVQQVkpKQorCitzdHJ1Y3QgX0dzdFJ0cFBjbXVEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKK307CisKK3N0cnVjdCBfR3N0UnRwUGNtdURlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfcGNtdV9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfcGNtdV9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9QQ01VX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBwY211cGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHBjbXVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTMxZjg1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBwY211cGF5LmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBOb2tpYSBDb3Jwb3JhdGlvbiA8a2FpLnZlaG1hbmVuQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKyNpbmNsdWRlICJnc3RydHBwY211cGF5LmgiCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3BjbXVfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1tdWxhdywgY2hhbm5lbHM9KGludCkxLCByYXRlPShpbnQpODAwMCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfcGNtdV9wYXlfc3JjX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfUENNVV9TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDgwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIlBDTVVcIjsgIgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVggXSwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiUENNVVwiIikKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9wY211X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworCisjZGVmaW5lIGdzdF9ydHBfcGNtdV9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwUGNtdVBheSwgZ3N0X3J0cF9wY211X3BheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9BVURJT19QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcGNtdV9wYXlfY2xhc3NfaW5pdCAoR3N0UnRwUGNtdVBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9wY211X3BheV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9wY211X3BheV9zcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJSVFAgUENNVSBwYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZC1lbmNvZGVzIFBDTVUgYXVkaW8gaW50byBhIFJUUCBwYWNrZXQiLAorICAgICAgIkVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+Iik7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9wY211X3BheV9zZXRjYXBzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9wY211X3BheV9pbml0IChHc3RSdHBQY211UGF5ICogcnRwcGNtdXBheSkKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZCAqcnRwYmFzZWF1ZGlvcGF5bG9hZDsKKworICBydHBiYXNlYXVkaW9wYXlsb2FkID0gR1NUX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQgKHJ0cHBjbXVwYXkpOworCisgIEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBwY211cGF5KS0+cHQgPSBHU1RfUlRQX1BBWUxPQURfUENNVTsKKyAgR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cHBjbXVwYXkpLT5jbG9ja19yYXRlID0gODAwMDsKKworICAvKiB0ZWxsIHJ0cGJhc2VhdWRpb3BheWxvYWQgdGhhdCB0aGlzIGlzIGEgc2FtcGxlIGJhc2VkIGNvZGVjICovCisgIGdzdF9ydHBfYmFzZV9hdWRpb19wYXlsb2FkX3NldF9zYW1wbGVfYmFzZWQgKHJ0cGJhc2VhdWRpb3BheWxvYWQpOworCisgIC8qIG9jdGV0LXBlci1zYW1wbGUgaXMgMSBmb3IgUENNICovCisgIGdzdF9ydHBfYmFzZV9hdWRpb19wYXlsb2FkX3NldF9zYW1wbGVfb3B0aW9ucyAocnRwYmFzZWF1ZGlvcGF5bG9hZCwgMSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9wY211X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBnYm9vbGVhbiByZXM7CisKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHBheWxvYWQsICJhdWRpbyIsCisgICAgICBwYXlsb2FkLT5wdCAhPSBHU1RfUlRQX1BBWUxPQURfUENNVSwgIlBDTVUiLCA4MDAwKTsKKyAgcmVzID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHBheWxvYWQsIE5VTEwpOworCisgIHJldHVybiByZXM7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3BjbXVfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwcGNtdXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9QQ01VX1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHBjbXVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwcGNtdXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MjlkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHBjbXVwYXkuaApAQCAtMCwwICsxLDU0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1JUUF9QQ01VX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1BDTVVfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWF1ZGlvcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBQY211UGF5IEdzdFJ0cFBjbXVQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwUGNtdVBheUNsYXNzIEdzdFJ0cFBjbXVQYXlDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfUENNVV9QQVkgXAorICAoZ3N0X3J0cF9wY211X3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX1BDTVVfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1BDTVVfUEFZLEdzdFJ0cFBjbXVQYXkpKQorI2RlZmluZSBHU1RfUlRQX1BDTVVfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9QQ01VX1BBWSxHc3RSdHBQY211UGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1BDTVVfUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1BDTVVfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9QQ01VX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfUENNVV9QQVkpKQorCitzdHJ1Y3QgX0dzdFJ0cFBjbXVQYXkKK3sKKyAgR3N0UlRQQmFzZUF1ZGlvUGF5bG9hZCBhdWRpb3BheWxvYWQ7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cFBjbXVQYXlDbGFzcworeworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9wY211X3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfcGNtdV9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfUENNVV9QQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHFjZWxwZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwcWNlbHBkZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNWQ5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHFjZWxwZGVwYXkuYwpAQCAtMCwwICsxLDQzMiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDEwPiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdzdHJ0cHFjZWxwZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBxY2VscGRlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBxY2VscGRlcGF5X2RlYnVnKQorCisvKiByZWZlcmVuY2VzOgorICoKKyAqIFJGQyAyNjU4IC0gUlRQIFBheWxvYWQgRm9ybWF0IGZvciBQdXJlVm9pY2UodG0pIEF1ZGlvCisgKi8KKyNkZWZpbmUgRlJBTUVfRFVSQVRJT04gKDIwICogR1NUX01TRUNPTkQpCisKKy8qIFJ0cFFDRUxQRGVwYXkgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCitlbnVtCit7CisgIFBST1BfMAorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfcWNlbHBfZGVwYXlfc2lua190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiUUNFTFBcIjsgIgorICAgICAgICAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfUUNFTFBfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA4MDAwIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9xY2VscF9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3FjZWxwLCAiICJjaGFubmVscyA9IChpbnQpIDEsIiAicmF0ZSA9IChpbnQpIDgwMDAiKQorICAgICk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfcWNlbHBfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9xY2VscF9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfcWNlbHBfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworCisjZGVmaW5lIGdzdF9ydHBfcWNlbHBfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwUUNFTFBEZXBheSwgZ3N0X3J0cF9xY2VscF9kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9xY2VscF9kZXBheV9jbGFzc19pbml0IChHc3RSdHBRQ0VMUERlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9xY2VscF9kZXBheV9maW5hbGl6ZTsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX3FjZWxwX2RlcGF5X3Byb2Nlc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9xY2VscF9kZXBheV9zZXRjYXBzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfcWNlbHBfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9xY2VscF9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBRQ0VMUCBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgUUNFTFAgKFB1cmVWb2ljZSkgYXVkaW8gZnJvbSBSVFAgcGFja2V0cyAoUkZDIDI2NTgpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBxY2VscGRlcGF5X2RlYnVnLCAicnRwcWNlbHBkZXBheSIsIDAsCisgICAgICAiUUNFTFAgUlRQIERlcGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3FjZWxwX2RlcGF5X2luaXQgKEdzdFJ0cFFDRUxQRGVwYXkgKiBydHBxY2VscGRlcGF5KQoreworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9xY2VscF9kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwUUNFTFBEZXBheSAqZGVwYXk7CisKKyAgZGVwYXkgPSBHU1RfUlRQX1FDRUxQX0RFUEFZIChvYmplY3QpOworCisgIGlmIChkZXBheS0+cGFja2V0cyAhPSBOVUxMKSB7CisgICAgZ19wdHJfYXJyYXlfZm9yZWFjaCAoZGVwYXktPnBhY2tldHMsIChHRnVuYykgZ3N0X2J1ZmZlcl91bnJlZiwgTlVMTCk7CisgICAgZ19wdHJfYXJyYXlfZnJlZSAoZGVwYXktPnBhY2tldHMsIFRSVUUpOworICAgIGRlcGF5LT5wYWNrZXRzID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfcWNlbHBfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIGdib29sZWFuIHJlczsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3FjZWxwIiwKKyAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDEsICJyYXRlIiwgR19UWVBFX0lOVCwgODAwMCwgTlVMTCk7CisgIHJlcyA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBjb25zdCBnaW50IGZyYW1lX3NpemVbMTZdID0geworICAxLCA0LCA4LCAxNywgMzUsIC04LCAwLCAwLAorICAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwCit9OworCisvKiBnZXQgdGhlIGZyYW1lIGxlbmd0aCwgMCBpcyBpbnZhbGlkLCBuZWdhdGl2ZSB2YWx1ZXMgYXJlIGludmFsaWQgYnV0IGNhbiBiZQorICogcmVjb3ZlcmVkIGZyb20uICovCitzdGF0aWMgZ2ludAorZ2V0X2ZyYW1lX2xlbiAoR3N0UnRwUUNFTFBEZXBheSAqIGRlcGF5LCBndWludDggZnJhbWVfdHlwZSkKK3sKKyAgaWYgKGZyYW1lX3R5cGUgPj0gR19OX0VMRU1FTlRTIChmcmFtZV9zaXplKSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gZnJhbWVfc2l6ZVtmcmFtZV90eXBlXTsKK30KKworc3RhdGljIGd1aW50Citjb3VudF9wYWNrZXRzIChHc3RSdHBRQ0VMUERlcGF5ICogZGVwYXksIGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUpCit7CisgIGd1aW50IGNvdW50ID0gMDsKKworICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICBnaW50IGZyYW1lX2xlbjsKKworICAgIGZyYW1lX2xlbiA9IGdldF9mcmFtZV9sZW4gKGRlcGF5LCBkYXRhWzBdKTsKKworICAgIC8qIDAgaXMgaW52YWxpZCBhbmQgd2UgdGhyb3cgYXdheSB0aGUgcmVtYWluZGVyIG9mIHRoZSBmcmFtZXMgKi8KKyAgICBpZiAoZnJhbWVfbGVuID09IDApCisgICAgICBicmVhazsKKworICAgIGlmIChmcmFtZV9sZW4gPCAwKQorICAgICAgZnJhbWVfbGVuID0gLWZyYW1lX2xlbjsKKworICAgIGlmIChmcmFtZV9sZW4gPiBzaXplKQorICAgICAgYnJlYWs7CisKKyAgICBzaXplIC09IGZyYW1lX2xlbjsKKyAgICBkYXRhICs9IGZyYW1lX2xlbjsKKyAgICBjb3VudCsrOworICB9CisgIHJldHVybiBjb3VudDsKK30KKworc3RhdGljIHZvaWQKK2ZsdXNoX3BhY2tldHMgKEdzdFJ0cFFDRUxQRGVwYXkgKiBkZXBheSkKK3sKKyAgZ3VpbnQgaSwgc2l6ZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZXBheSwgImZsdXNoaW5nIHBhY2tldHMiKTsKKworICBzaXplID0gZGVwYXktPnBhY2tldHMtPmxlbjsKKworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgR3N0QnVmZmVyICpvdXRidWY7CisKKyAgICBvdXRidWYgPSBnX3B0cl9hcnJheV9pbmRleCAoZGVwYXktPnBhY2tldHMsIGkpOworICAgIGdfcHRyX2FycmF5X2luZGV4IChkZXBheS0+cGFja2V0cywgaSkgPSBOVUxMOworCisgICAgZ3N0X3J0cF9iYXNlX2RlcGF5bG9hZF9wdXNoIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEIChkZXBheSksIG91dGJ1Zik7CisgIH0KKworICAvKiBhbmQgcmVzZXQgaW50ZXJsZWF2aW5nIHN0YXRlICovCisgIGRlcGF5LT5pbnRlcmxlYXZlZCA9IEZBTFNFOworICBkZXBheS0+YnVuZGxpbmcgPSAwOworfQorCitzdGF0aWMgdm9pZAorYWRkX3BhY2tldCAoR3N0UnRwUUNFTFBEZXBheSAqIGRlcGF5LCBndWludCBMTEwsIGd1aW50IE5OTiwgZ3VpbnQgaW5kZXgsCisgICAgR3N0QnVmZmVyICogb3V0YnVmKQoreworICBndWludCBpZHg7CisgIEdzdEJ1ZmZlciAqb2xkOworCisgIC8qIGZpZ3VyZSBvdXQgdGhlIHBvc2l0aW9uIGluIHRoZSBhcnJheSwgbm90ZSB0aGF0IGluZGV4IGlzIG5ldmVyIDAgYmVjYXVzZSB3ZQorICAgKiBwdXNoIHRob3NlIHBhY2tldHMgaW1tZWRpYXRlbHkuICovCisgIGlkeCA9IE5OTiArICgoTExMICsgMSkgKiAoaW5kZXggLSAxKSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXksICJhZGRpbmcgcGFja2V0IGF0IGluZGV4ICV1IiwgaWR4KTsKKyAgLyogZnJlZSBvbGQgYnVmZmVyIChzaG91bGQgbm90IGhhcHBlbikgKi8KKyAgb2xkID0gZ19wdHJfYXJyYXlfaW5kZXggKGRlcGF5LT5wYWNrZXRzLCBpZHgpOworICBpZiAob2xkKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKG9sZCk7CisKKyAgLyogc3RvcmUgbmV3IGJ1ZmZlciAqLworICBnX3B0cl9hcnJheV9pbmRleCAoZGVwYXktPnBhY2tldHMsIGlkeCkgPSBvdXRidWY7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorY3JlYXRlX2VyYXN1cmVfYnVmZmVyIChHc3RSdHBRQ0VMUERlcGF5ICogZGVwYXkpCit7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RNYXBJbmZvIG1hcDsKKworICBvdXRidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEpOworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgbWFwLmRhdGFbMF0gPSAxNDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmLCAmbWFwKTsKKworICByZXR1cm4gb3V0YnVmOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfcWNlbHBfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cFFDRUxQRGVwYXkgKmRlcGF5OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKyAgZ3VpbnQgcGF5bG9hZF9sZW4sIG9mZnNldCwgaW5kZXg7CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgZ3VpbnQgTExMLCBOTk47CisKKyAgZGVwYXkgPSBHU1RfUlRQX1FDRUxQX0RFUEFZIChkZXBheWxvYWQpOworCisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgIGlmIChwYXlsb2FkX2xlbiA8IDIpCisgICAgZ290byB0b29fc21hbGw7CisKKyAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9QVFMgKHJ0cC0+YnVmZmVyKTsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisKKyAgLyogIDAgMSAyIDMgNCA1IDYgNworICAgKiArLSstKy0rLSstKy0rLSstKworICAgKiB8UlIgfCBMTEwgfCBOTk4gfAorICAgKiArLSstKy0rLSstKy0rLSstKworICAgKi8KKyAgLyogUlIgPSBwYXlsb2FkWzBdID4+IDY7ICovCisgIExMTCA9IChwYXlsb2FkWzBdICYgMHgzOCkgPj4gMzsKKyAgTk5OID0gKHBheWxvYWRbMF0gJiAweDA3KTsKKworICBwYXlsb2FkX2xlbi0tOworICBwYXlsb2FkKys7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXksICJMTEwgJXUsIE5OTiAldSIsIExMTCwgTk5OKTsKKworICBpZiAoTExMID4gNSkKKyAgICBnb3RvIGludmFsaWRfbGxsOworCisgIGlmIChOTk4gPiBMTEwpCisgICAgZ290byBpbnZhbGlkX25ubjsKKworICBpZiAoTExMICE9IDApIHsKKyAgICAvKiB3ZSBhcmUgaW50ZXJsZWF2ZWQgKi8KKyAgICBpZiAoIWRlcGF5LT5pbnRlcmxlYXZlZCkgeworICAgICAgZ3VpbnQgc2l6ZTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXksICJzdGFydGluZyBpbnRlcmxlYXZpbmcgZ3JvdXAiKTsKKyAgICAgIC8qIGJ1bmRsaW5nIGlzIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSBpbiBvbmUgaW50ZXJsZWF2ZSBncm91cCAqLworICAgICAgZGVwYXktPmJ1bmRsaW5nID0gY291bnRfcGFja2V0cyAoZGVwYXksIHBheWxvYWQsIHBheWxvYWRfbGVuKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5LCAiZ290IGJ1bmRsaW5nIG9mICV1IiwgZGVwYXktPmJ1bmRsaW5nKTsKKyAgICAgIC8qIHdlIGhhdmUgb25lIGJ1bmRsZSB3aGVyZSBOTk4gZ29lcyBmcm9tIDAgdG8gTCwgd2UgZG9uJ3Qgc3RvcmUgdGhlIGluZGV4CisgICAgICAgKiAwIGZyYW1lcywgc28gTCsxIHBhY2tldHMuIEVhY2ggcGFja2V0IGhhcyAnYnVuZGxpbmcgLSAxJyBwYWNrZXRzICovCisgICAgICBzaXplID0gKGRlcGF5LT5idW5kbGluZyAtIDEpICogKExMTCArIDEpOworICAgICAgLyogY3JlYXRlIHRoZSBhcnJheSB0byBob2xkIHRoZSBwYWNrZXRzICovCisgICAgICBpZiAoZGVwYXktPnBhY2tldHMgPT0gTlVMTCkKKyAgICAgICAgZGVwYXktPnBhY2tldHMgPSBnX3B0cl9hcnJheV9zaXplZF9uZXcgKHNpemUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXksICJjcmVhdGVkIHBhY2tldCBhcnJheSBvZiBzaXplICV1Iiwgc2l6ZSk7CisgICAgICBnX3B0cl9hcnJheV9zZXRfc2l6ZSAoZGVwYXktPnBhY2tldHMsIHNpemUpOworICAgICAgLyogd2Ugd2VyZSBwcmV2aW91c2x5IG5vdCBpbnRlcmxlYXZlZCwgZmlndXJlIG91dCBob3cgbXVjaCBzcGFjZSB3ZQorICAgICAgICogbmVlZCB0byBkZWludGVybGVhdmUgKi8KKyAgICAgIGRlcGF5LT5pbnRlcmxlYXZlZCA9IFRSVUU7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIHdlIGFyZSBub3QgaW50ZXJsZWF2ZWQgKi8KKyAgICBpZiAoZGVwYXktPmludGVybGVhdmVkKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheSwgInN0b3BwaW5nIGludGVybGVhdmluZyIpOworICAgICAgLyogZmx1c2ggcGFja2V0cyBpZiB3ZSB3ZXJlIHByZXZpb3VzbHkgaW50ZXJsZWF2ZWQgKi8KKyAgICAgIGZsdXNoX3BhY2tldHMgKGRlcGF5KTsKKyAgICB9CisgICAgZGVwYXktPmJ1bmRsaW5nID0gMDsKKyAgfQorCisgIGluZGV4ID0gMDsKKyAgb2Zmc2V0ID0gMTsKKworICB3aGlsZSAocGF5bG9hZF9sZW4gPiAwKSB7CisgICAgZ2ludCBmcmFtZV9sZW47CisgICAgZ2Jvb2xlYW4gZG9fZXJhc3VyZTsKKworICAgIGZyYW1lX2xlbiA9IGdldF9mcmFtZV9sZW4gKGRlcGF5LCBwYXlsb2FkWzBdKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheSwgImdvdCBmcmFtZSBsZW4gJWQiLCBmcmFtZV9sZW4pOworCisgICAgaWYgKGZyYW1lX2xlbiA9PSAwKQorICAgICAgZ290byBpbnZhbGlkX2ZyYW1lOworCisgICAgaWYgKGZyYW1lX2xlbiA8IDApIHsKKyAgICAgIC8qIG5lZWQgdG8gYWRkIGFuIGVyYXN1cmUgZnJhbWUgYnV0IHdlIGNhbiByZWNvdmVyICovCisgICAgICBmcmFtZV9sZW4gPSAtZnJhbWVfbGVuOworICAgICAgZG9fZXJhc3VyZSA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIGRvX2VyYXN1cmUgPSBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoZnJhbWVfbGVuID4gcGF5bG9hZF9sZW4pCisgICAgICBnb3RvIGludmFsaWRfZnJhbWU7CisKKyAgICBpZiAoZG9fZXJhc3VyZSkgeworICAgICAgLyogY3JlYXRlIGVyYXN1cmUgZnJhbWUgKi8KKyAgICAgIG91dGJ1ZiA9IGNyZWF0ZV9lcmFzdXJlX2J1ZmZlciAoZGVwYXkpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBlYWNoIGZyYW1lIGdvZXMgaW50byBpdHMgYnVmZmVyICovCisgICAgICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwgb2Zmc2V0LCBmcmFtZV9sZW4pOworICAgIH0KKworICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gdGltZXN0YW1wOworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPSBGUkFNRV9EVVJBVElPTjsKKworICAgIGdzdF9ydHBfZHJvcF9ub25fYXVkaW9fbWV0YSAoZGVwYXlsb2FkLCBvdXRidWYpOworCisgICAgaWYgKCFkZXBheS0+aW50ZXJsZWF2ZWQgfHwgaW5kZXggPT0gMCkgeworICAgICAgLyogbm90IGludGVybGVhdmVkIG9yIGZpcnN0IGZyYW1lIGluIHBhY2tldCwganVzdCBwdXNoICovCisgICAgICBnc3RfcnRwX2Jhc2VfZGVwYXlsb2FkX3B1c2ggKGRlcGF5bG9hZCwgb3V0YnVmKTsKKworICAgICAgaWYgKHRpbWVzdGFtcCAhPSAtMSkKKyAgICAgICAgdGltZXN0YW1wICs9IEZSQU1FX0RVUkFUSU9OOworICAgIH0gZWxzZSB7CisgICAgICAvKiBwdXQgaW4gaW50ZXJsZWF2ZSBidWZmZXIgKi8KKyAgICAgIGFkZF9wYWNrZXQgKGRlcGF5LCBMTEwsIE5OTiwgaW5kZXgsIG91dGJ1Zik7CisKKyAgICAgIGlmICh0aW1lc3RhbXAgIT0gLTEpCisgICAgICAgIHRpbWVzdGFtcCArPSAoRlJBTUVfRFVSQVRJT04gKiAoTExMICsgMSkpOworICAgIH0KKworICAgIHBheWxvYWRfbGVuIC09IGZyYW1lX2xlbjsKKyAgICBwYXlsb2FkICs9IGZyYW1lX2xlbjsKKyAgICBvZmZzZXQgKz0gZnJhbWVfbGVuOworICAgIGluZGV4Kys7CisKKyAgICAvKiBkaXNjYXJkIGV4Y2VzcyBwYWNrZXRzICovCisgICAgaWYgKGRlcGF5LT5idW5kbGluZyA+IDAgJiYgZGVwYXktPmJ1bmRsaW5nIDw9IGluZGV4KQorICAgICAgYnJlYWs7CisgIH0KKyAgd2hpbGUgKGluZGV4IDwgZGVwYXktPmJ1bmRsaW5nKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXksICJmaWxsaW5nIHdpdGggZXJhc3VyZSBidWZmZXIiKTsKKyAgICAvKiBmaWxsIHJlbWFpbmRlciB3aXRoIGVyYXN1cmUgcGFja2V0cyAqLworICAgIG91dGJ1ZiA9IGNyZWF0ZV9lcmFzdXJlX2J1ZmZlciAoZGVwYXkpOworICAgIGFkZF9wYWNrZXQgKGRlcGF5LCBMTEwsIE5OTiwgaW5kZXgsIG91dGJ1Zik7CisgICAgaW5kZXgrKzsKKyAgfQorICBpZiAoZGVwYXktPmludGVybGVhdmVkICYmIExMTCA9PSBOTk4pIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheSwgImludGVybGVhdmUgZ3JvdXAgZW5kZWQsIGZsdXNoaW5nIik7CisgICAgLyogd2UgaGF2ZSB0aGUgY29tcGxldGUgaW50ZXJsZWF2ZSBncm91cCwgZmx1c2ggKi8KKyAgICBmbHVzaF9wYWNrZXRzIChkZXBheSk7CisgIH0KKworICByZXR1cm4gTlVMTDsKKworICAvKiBFUlJPUlMgKi8KK3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIlFDRUxQIFJUUCBwYXlsb2FkIHRvbyBzbWFsbCAoJWQpIiwgcGF5bG9hZF9sZW4pKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQoraW52YWxpZF9sbGw6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJRQ0VMUCBSVFAgaW52YWxpZCBMTEwgcmVjZWl2ZWQgKCVkKSIsIExMTCkpOworICAgIHJldHVybiBOVUxMOworICB9CitpbnZhbGlkX25ubjoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIlFDRUxQIFJUUCBpbnZhbGlkIE5OTiByZWNlaXZlZCAoJWQpIiwgTk5OKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2ludmFsaWRfZnJhbWU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJRQ0VMUCBSVFAgaW52YWxpZCBmcmFtZSByZWNlaXZlZCIpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF9xY2VscF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHFjZWxwZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfUUNFTFBfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHFjZWxwZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGUyNzRkCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBxY2VscGRlcGF5LmgKQEAgLTAsMCArMSw2MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDEwPiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1FDRUxQX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfUUNFTFBfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfUUNFTFBfREVQQVkgXAorICAoZ3N0X3J0cF9xY2VscF9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX1FDRUxQX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1FDRUxQX0RFUEFZLEdzdFJ0cFFDRUxQRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX1FDRUxQX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9RQ0VMUF9ERVBBWSxHc3RSdHBRQ0VMUERlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1FDRUxQX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1FDRUxQX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9RQ0VMUF9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfUUNFTFBfREVQQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwUUNFTFBEZXBheSBHc3RSdHBRQ0VMUERlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFFDRUxQRGVwYXlDbGFzcyBHc3RSdHBRQ0VMUERlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwUUNFTFBEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIGRlcGF5bG9hZDsKKworICBnYm9vbGVhbiBpbnRlcmxlYXZlZDsKKyAgZ3VpbnQgYnVuZGxpbmc7CisgIEdQdHJBcnJheSAqcGFja2V0czsKK307CisKK3N0cnVjdCBfR3N0UnRwUUNFTFBEZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX3FjZWxwX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9xY2VscF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9RQ0VMUF9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwcWRtZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwcWRtZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTg2NjNhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBxZG1kZXBheS5jCkBAIC0wLDAgKzEsNDE0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSAiZ3N0cnRwcWRtZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUlkgKHJ0cHFkbTJkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBydHBxZG0yZGVwYXlfZGVidWcKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfcWRtMl9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcWRtMiIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfcWRtMl9kZXBheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpXCJYLVFETVwiIikKKyAgICApOworCisjZGVmaW5lIGdzdF9ydHBfcWRtMl9kZXBheV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBRRE0yRGVwYXksIGdzdF9ydHBfcWRtMl9kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IGhlYWRoZWFkZXJbMjBdID0geworICAweDAsIDB4MCwgMHgwLCAweGMsIDB4NjYsIDB4NzIsIDB4NmQsIDB4NjEsCisgIDB4NTEsIDB4NDQsIDB4NGQsIDB4MzIsIDB4MCwgMHgwLCAweDAsIDB4MjQsCisgIDB4NTEsIDB4NDQsIDB4NDMsIDB4NDEKK307CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfcWRtMl9kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX3FkbTJfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9xZG0yX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKK2dib29sZWFuIGdzdF9ydHBfcWRtMl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZmlsdGVyLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcWRtMl9kZXBheV9jbGFzc19pbml0IChHc3RSdHBRRE0yRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+cHJvY2Vzc19ydHBfcGFja2V0ID0gZ3N0X3J0cF9xZG0yX2RlcGF5X3Byb2Nlc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9xZG0yX2RlcGF5X3NldGNhcHM7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX3FkbTJfZGVwYXlfZmluYWxpemU7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF9xZG0yX2RlcGF5X2NoYW5nZV9zdGF0ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3FkbTJfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9xZG0yX2RlcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIFFETTIgZGVwYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBRRE0yIGF1ZGlvIGZyb20gUlRQIHBhY2tldHMgKG5vIFJGQykiLAorICAgICAgIkVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3FkbTJfZGVwYXlfaW5pdCAoR3N0UnRwUURNMkRlcGF5ICogcnRwcWRtMmRlcGF5KQoreworICBydHBxZG0yZGVwYXktPmFkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3FkbTJfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cFFETTJEZXBheSAqcnRwcWRtMmRlcGF5OworCisgIHJ0cHFkbTJkZXBheSA9IEdTVF9SVFBfUURNMl9ERVBBWSAob2JqZWN0KTsKKworICBnX29iamVjdF91bnJlZiAocnRwcWRtMmRlcGF5LT5hZGFwdGVyKTsKKyAgcnRwcWRtMmRlcGF5LT5hZGFwdGVyID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKKy8qIG9ubHkgb24gdGhlIHNpbmsgKi8KK2dib29sZWFuCitnc3RfcnRwX3FkbTJfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGZpbHRlciwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGdpbnQgY2xvY2tfcmF0ZTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBjbG9ja19yYXRlID0gNDQxMDA7ICAgICAgICAgLyogZGVmYXVsdCAqLworICBmaWx0ZXItPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworCisgIC8qIHdpbGwgc2V0IGNhcHMgbGF0ZXIgKi8KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2ZsdXNoX2RhdGEgKEdzdFJ0cFFETTJEZXBheSAqIGRlcGF5KQoreworICBndWludCBpOworICBndWludCBhdmFpbDsKKworICBpZiAoKGF2YWlsID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZXBheS0+YWRhcHRlcikpKQorICAgIGdzdF9hZGFwdGVyX2ZsdXNoIChkZXBheS0+YWRhcHRlciwgYXZhaWwpOworCisgIEdTVF9ERUJVRyAoIkZsdXNoaW5nICVkIHBhY2tldHMiLCBkZXBheS0+bmJwYWNrZXRzKTsKKworICBmb3IgKGkgPSAwOyBkZXBheS0+cGFja2V0c1tpXTsgaSsrKSB7CisgICAgUURNMlBhY2tldCAqcGFjayA9IGRlcGF5LT5wYWNrZXRzW2ldOworICAgIGd1aW50MzIgY3JjID0gMDsKKyAgICBpbnQgaSA9IDA7CisgICAgR3N0QnVmZmVyICpidWY7CisgICAgZ3VpbnQ4ICpkYXRhOworCisgICAgLyogQ1JDIGlzIHRoZSBzdW0gb2YgZXZlcnl0aGluZyAoaW5jbHVkaW5nIGZpcnN0IGJ5dGVzKSAqLworCisgICAgZGF0YSA9IHBhY2stPmRhdGE7CisKKyAgICBpZiAoR19VTkxJS0VMWSAoZGF0YSA9PSBOVUxMKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogSWYgdGhlIHBhY2tldCBzaXplIGlzIGJpZ2dlciB0aGFuIDB4ZmYsIHdlIG5lZWQgMiBieXRlcyB0byBzdG9yZSB0aGUgc2l6ZSAqLworICAgIGlmIChkZXBheS0+cGFja2V0c2l6ZSA+IDB4ZmYpIHsKKyAgICAgIC8qIEV4cGFuZGVkIHNpemUgMHgwMiB8IDB4ODAgKi8KKyAgICAgIGRhdGFbMF0gPSAweDgyOworICAgICAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoZGF0YSArIDEsIGRlcGF5LT5wYWNrZXRzaXplIC0gMyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRhdGFbMF0gPSAweDI7CisgICAgICBkYXRhWzFdID0gZGVwYXktPnBhY2tldHNpemUgLSAyOworICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSBDUkMgKi8KKyAgICBmb3IgKDsgaSA8IGRlcGF5LT5wYWNrZXRzaXplOyBpKyspCisgICAgICBjcmMgKz0gZGF0YVtpXTsKKworICAgIEdTVF9ERUJVRyAoIkNSQyBpcyAweCV4IiwgY3JjKTsKKworICAgIC8qIFdyaXRlIENSQyAqLworICAgIGlmIChkZXBheS0+cGFja2V0c2l6ZSA+IDB4ZmYpCisgICAgICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhICsgMywgY3JjKTsKKyAgICBlbHNlCisgICAgICBHU1RfV1JJVEVfVUlOVDE2X0JFIChkYXRhICsgMiwgY3JjKTsKKworICAgIEdTVF9NRU1EVU1QICgiRXh0cmFjdGVkIHBhY2tldCIsIGRhdGEsIGRlcGF5LT5wYWNrZXRzaXplKTsKKworICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3ICgpOworICAgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAoYnVmLAorICAgICAgICBnc3RfbWVtb3J5X25ld193cmFwcGVkICgwLCBkYXRhLCBkZXBheS0+cGFja2V0c2l6ZSwgMCwKKyAgICAgICAgICAgIGRlcGF5LT5wYWNrZXRzaXplLCBkYXRhLCBnX2ZyZWUpKTsKKworICAgIGdzdF9hZGFwdGVyX3B1c2ggKGRlcGF5LT5hZGFwdGVyLCBidWYpOworCisgICAgcGFjay0+ZGF0YSA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2FkZF9wYWNrZXQgKEdzdFJ0cFFETTJEZXBheSAqIGRlcGF5LCBndWludDMyIHBpZCwgZ3VpbnQzMiBsZW4sIGd1aW50OCAqIGRhdGEpCit7CisgIFFETTJQYWNrZXQgKnBhY2tldDsKKworICBpZiAoR19VTkxJS0VMWSAoIWRlcGF5LT5jb25maWd1cmVkKSkKKyAgICByZXR1cm47CisKKyAgR1NUX0RFQlVHICgicGlkOiVkLCBsZW46JWQsIGRhdGE6JXAiLCBwaWQsIGxlbiwgZGF0YSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGRlcGF5LT5wYWNrZXRzW3BpZF0gPT0gTlVMTCkpIHsKKyAgICBkZXBheS0+cGFja2V0c1twaWRdID0gZ19tYWxsb2MwIChzaXplb2YgKFFETTJQYWNrZXQpKTsKKyAgICBkZXBheS0+bmJwYWNrZXRzID0gTUFYIChkZXBheS0+bmJwYWNrZXRzLCBwaWQgKyAxKTsKKyAgfQorICBwYWNrZXQgPSBkZXBheS0+cGFja2V0c1twaWRdOworCisgIEdTVF9ERUJVRyAoInBhY2tldDolcCIsIHBhY2tldCk7CisgIEdTVF9ERUJVRyAoInBhY2tldC0+ZGF0YTolcCIsIHBhY2tldC0+ZGF0YSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHBhY2tldC0+ZGF0YSA9PSBOVUxMKSkgeworICAgIHBhY2tldC0+ZGF0YSA9IGdfbWFsbG9jMCAoZGVwYXktPnBhY2tldHNpemUpOworICAgIC8qIFdlIGxlYXZlIHNwYWNlIGZvciB0aGUgaGVhZGVyL2NyYyAqLworICAgIGlmIChkZXBheS0+cGFja2V0c2l6ZSA+IDB4ZmYpCisgICAgICBwYWNrZXQtPm9mZnMgPSA1OworICAgIGVsc2UKKyAgICAgIHBhY2tldC0+b2ZmcyA9IDQ7CisgIH0KKworICAvKiBGaW5hbGx5IGNvcHkgdGhlIGRhdGEgb3ZlciAqLworICBtZW1jcHkgKHBhY2tldC0+ZGF0YSArIHBhY2tldC0+b2ZmcywgZGF0YSwgbGVuKTsKKyAgcGFja2V0LT5vZmZzICs9IGxlbjsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX3FkbTJfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBRRE0yRGVwYXkgKnJ0cHFkbTJkZXBheTsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBndWludDE2IHNlcTsKKworICBydHBxZG0yZGVwYXkgPSBHU1RfUlRQX1FETTJfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgeworICAgIGdpbnQgcGF5bG9hZF9sZW47CisgICAgZ3VpbnQ4ICpwYXlsb2FkOworICAgIGd1aW50IGF2YWlsOworICAgIGd1aW50IHBvcyA9IDA7CisKKyAgICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKyAgICBpZiAocGF5bG9hZF9sZW4gPCAzKQorICAgICAgZ290byBiYWRfcGFja2V0OworCisgICAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkIChydHApOworICAgIHNlcSA9IGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKHJ0cCk7CisgICAgaWYgKEdfVU5MSUtFTFkgKHNlcSAhPSBydHBxZG0yZGVwYXktPm5leHRzZXEpKSB7CisgICAgICBHU1RfREVCVUcgKCJHQVAgaW4gc2VxdWVuY2UgbnVtYmVyLCBSZXNldHRpbmcgZGF0YSAhIik7CisgICAgICAvKiBGbHVzaCBwcmV2aW91cyBkYXRhICovCisgICAgICBmbHVzaF9kYXRhIChydHBxZG0yZGVwYXkpOworICAgICAgLyogQW5kIHN0b3JlIG5ldyB0aW1lc3RhbXAgKi8KKyAgICAgIHJ0cHFkbTJkZXBheS0+cHRpbWVzdGFtcCA9IHJ0cHFkbTJkZXBheS0+dGltZXN0YW1wOworICAgICAgcnRwcWRtMmRlcGF5LT50aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAocnRwLT5idWZmZXIpOworICAgICAgLyogQW5kIHRoYXQgcHJldmlvdXMgZGF0YSB3aWxsIGJlIHB1c2hlZCBhdCB0aGUgYm90dG9tICovCisgICAgfQorICAgIHJ0cHFkbTJkZXBheS0+bmV4dHNlcSA9IHNlcSArIDE7CisKKyAgICBHU1RfREVCVUcgKCJQYXlsb2FkIHNpemUgJWQgMHgleCBzZXF1ZW5jZTolZCIsIHBheWxvYWRfbGVuLCBwYXlsb2FkX2xlbiwKKyAgICAgICAgc2VxKTsKKworICAgIEdTVF9NRU1EVU1QICgiSW5jb21pbmcgcGF5bG9hZCIsIHBheWxvYWQsIHBheWxvYWRfbGVuKTsKKworICAgIHdoaWxlIChwb3MgPCBwYXlsb2FkX2xlbikgeworICAgICAgc3dpdGNoIChwYXlsb2FkW3Bvc10pIHsKKyAgICAgICAgY2FzZSAweDgwOnsKKyAgICAgICAgICBHU1RfREVCVUcgKCJVbnJlY29nbml6ZWQgMHg4MCBtYXJrZXIsIHNraXBwaW5nIDEyIGJ5dGVzIik7CisgICAgICAgICAgcG9zICs9IDEyOworICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhmZjoKKyAgICAgICAgICAvKiBIRUFERVJTICovCisgICAgICAgICAgR1NUX0RFQlVHICgiSGVhZGVycyIpOworICAgICAgICAgIC8qIFN0b3JlIHRoZSBpbmNvbWluZyB0aW1lc3RhbXAgKi8KKyAgICAgICAgICBydHBxZG0yZGVwYXktPnB0aW1lc3RhbXAgPSBydHBxZG0yZGVwYXktPnRpbWVzdGFtcDsKKyAgICAgICAgICBydHBxZG0yZGVwYXktPnRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChydHAtPmJ1ZmZlcik7CisgICAgICAgICAgLyogZmx1c2ggdGhlIGludGVybmFsIGRhdGEgaWYgbmVlZGVkICovCisgICAgICAgICAgZmx1c2hfZGF0YSAocnRwcWRtMmRlcGF5KTsKKyAgICAgICAgICBpZiAoR19VTkxJS0VMWSAoIXJ0cHFkbTJkZXBheS0+Y29uZmlndXJlZCkpIHsKKyAgICAgICAgICAgIGd1aW50OCAqb3VyZGF0YTsKKyAgICAgICAgICAgIEdzdEJ1ZmZlciAqY29kZWNkYXRhOworICAgICAgICAgICAgR3N0TWFwSW5mbyBjbWFwOworICAgICAgICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgICAgICAgLyogRmlyc3QgYnl0ZXMgYXJlIHVua25vd24gKi8KKyAgICAgICAgICAgIEdTVF9NRU1EVU1QICgiSGVhZGVyIiwgcGF5bG9hZCArIHBvcywgMzIpOworICAgICAgICAgICAgb3VyZGF0YSA9IHBheWxvYWQgKyBwb3MgKyAxMDsKKyAgICAgICAgICAgIHBvcyArPSAxMDsKKyAgICAgICAgICAgIHJ0cHFkbTJkZXBheS0+Y2hhbm5zID0gR1NUX1JFQURfVUlOVDMyX0JFIChwYXlsb2FkICsgcG9zICsgNCk7CisgICAgICAgICAgICBydHBxZG0yZGVwYXktPnNhbXBsZXJhdGUgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKHBheWxvYWQgKyBwb3MgKyA4KTsKKyAgICAgICAgICAgIHJ0cHFkbTJkZXBheS0+Yml0cmF0ZSA9IEdTVF9SRUFEX1VJTlQzMl9CRSAocGF5bG9hZCArIHBvcyArIDEyKTsKKyAgICAgICAgICAgIHJ0cHFkbTJkZXBheS0+YmxvY2tzaXplID0gR1NUX1JFQURfVUlOVDMyX0JFIChwYXlsb2FkICsgcG9zICsgMTYpOworICAgICAgICAgICAgcnRwcWRtMmRlcGF5LT5mcmFtZXNpemUgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKHBheWxvYWQgKyBwb3MgKyAyMCk7CisgICAgICAgICAgICBydHBxZG0yZGVwYXktPnBhY2tldHNpemUgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKHBheWxvYWQgKyBwb3MgKyAyNCk7CisgICAgICAgICAgICAvKiAxNiBiaXQgZW1wdHkgYmxvY2sgKDB4MDIgMHgwMCkgKi8KKyAgICAgICAgICAgIHBvcyArPSAzMDsKKyAgICAgICAgICAgIEdTVF9ERUJVRworICAgICAgICAgICAgICAgICgiY2hhbm5zOiVkLCBzYW1wbGVyYXRlOiVkLCBiaXRyYXRlOiVkLCBibG9ja3NpemU6JWQsIGZyYW1lc2l6ZTolZCwgcGFja2V0c2l6ZTolZCIsCisgICAgICAgICAgICAgICAgcnRwcWRtMmRlcGF5LT5jaGFubnMsIHJ0cHFkbTJkZXBheS0+c2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICBydHBxZG0yZGVwYXktPmJpdHJhdGUsIHJ0cHFkbTJkZXBheS0+YmxvY2tzaXplLAorICAgICAgICAgICAgICAgIHJ0cHFkbTJkZXBheS0+ZnJhbWVzaXplLCBydHBxZG0yZGVwYXktPnBhY2tldHNpemUpOworCisgICAgICAgICAgICAvKiBDYXBzICovCisgICAgICAgICAgICBjb2RlY2RhdGEgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDQ4KTsKKyAgICAgICAgICAgIGdzdF9idWZmZXJfbWFwIChjb2RlY2RhdGEsICZjbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICAgICAgICAgIG1lbWNweSAoY21hcC5kYXRhLCBoZWFkaGVhZGVyLCAyMCk7CisgICAgICAgICAgICBtZW1jcHkgKGNtYXAuZGF0YSArIDIwLCBvdXJkYXRhLCAyOCk7CisgICAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChjb2RlY2RhdGEsICZjbWFwKTsKKworICAgICAgICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXFkbTIiLAorICAgICAgICAgICAgICAgICJzYW1wbGVzaXplIiwgR19UWVBFX0lOVCwgMTYsCisgICAgICAgICAgICAgICAgInJhdGUiLCBHX1RZUEVfSU5ULCBydHBxZG0yZGVwYXktPnNhbXBsZXJhdGUsCisgICAgICAgICAgICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgcnRwcWRtMmRlcGF5LT5jaGFubnMsCisgICAgICAgICAgICAgICAgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGNvZGVjZGF0YSwgTlVMTCk7CisgICAgICAgICAgICBnc3RfcGFkX3NldF9jYXBzIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAoZGVwYXlsb2FkKSwgY2Fwcyk7CisgICAgICAgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICAgICAgICBydHBxZG0yZGVwYXktPmNvbmZpZ3VyZWQgPSBUUlVFOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfREVCVUcgKCJBbHJlYWR5IGNvbmZpZ3VyZWQsIHNraXBwaW5nIGhlYWRlcnMiKTsKKyAgICAgICAgICAgIHBvcyArPSA0MDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6eworICAgICAgICAgIC8qIFNodWZmbGVkIHBhY2tldCBjb250ZW50cyAqLworICAgICAgICAgIGd1aW50IHBhY2tldGlkID0gcGF5bG9hZFtwb3MrK107CisgICAgICAgICAgZ3VpbnQgcGFja2V0dHlwZSA9IHBheWxvYWRbcG9zKytdOworICAgICAgICAgIGd1aW50IHBhY2tsZW4gPSBwYXlsb2FkW3BvcysrXTsKKyAgICAgICAgICBndWludCBoc2l6ZSA9IDI7CisKKyAgICAgICAgICBHU1RfREVCVUcgKCJQYWNrZXQgaWQ6JWQsIHR5cGU6MHgleCwgbGVuOiVkIiwKKyAgICAgICAgICAgICAgcGFja2V0aWQsIHBhY2tldHR5cGUsIHBhY2tsZW4pOworCisgICAgICAgICAgLyogUGFja2V0cyBiaWdnZXIgdGhhbiAweGZmIGJ5dGVzIGhhdmUgYSB0eXBlIHdpdGggdGhlIGhpZ2ggYml0IHNldCAqLworICAgICAgICAgIGlmIChHX1VOTElLRUxZIChwYWNrZXR0eXBlICYgMHg4MCkpIHsKKyAgICAgICAgICAgIHBhY2tldHR5cGUgJj0gMHg3ZjsKKyAgICAgICAgICAgIHBhY2tsZW4gPDw9IDg7CisgICAgICAgICAgICBwYWNrbGVuIHw9IHBheWxvYWRbcG9zKytdOworICAgICAgICAgICAgaHNpemUgPSAzOworICAgICAgICAgICAgR1NUX0RFQlVHICgiUGFja2V0IGlkOiVkLCB0eXBlOjB4JXgsIGxlbjolZCIsCisgICAgICAgICAgICAgICAgcGFja2V0aWQsIHBhY2tldHR5cGUsIHBhY2tsZW4pOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChwYWNrZXR0eXBlID4gMHg3ZikgeworICAgICAgICAgICAgR1NUX0VSUk9SICgiSE9VU1RPTiBXRSBIQVZFIEEgUFJPQkxFTSAhISEhIik7CisgICAgICAgICAgfQorICAgICAgICAgIGFkZF9wYWNrZXQgKHJ0cHFkbTJkZXBheSwgcGFja2V0aWQsIHBhY2tsZW4gKyBoc2l6ZSwKKyAgICAgICAgICAgICAgcGF5bG9hZCArIHBvcyAtIGhzaXplKTsKKyAgICAgICAgICBwb3MgKz0gcGFja2xlbjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIEdTVF9ERUJVRyAoImZpbmFsIHBvcyAlZCIsIHBvcyk7CisKKyAgICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwcWRtMmRlcGF5LT5hZGFwdGVyKTsKKyAgICBpZiAoR19VTkxJS0VMWSAoYXZhaWwpKSB7CisgICAgICBHU1RfREVCVUcgKCJQdXNoaW5nIG91dCAlZCBieXRlcyBvZiBjb2xsZWN0ZWQgZGF0YSIsIGF2YWlsKTsKKyAgICAgIG91dGJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChydHBxZG0yZGVwYXktPmFkYXB0ZXIsIGF2YWlsKTsKKyAgICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gcnRwcWRtMmRlcGF5LT5wdGltZXN0YW1wOworICAgICAgR1NUX0RFQlVHICgiT3V0Z29pbmcgYnVmZmVyIHRpbWVzdGFtcCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocnRwcWRtMmRlcGF5LT5wdGltZXN0YW1wKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG91dGJ1ZjsKKworICAvKiBFUlJPUlMgKi8KK2JhZF9wYWNrZXQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBxZG0yZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiUGFja2V0IHdhcyB0b28gc2hvcnQiKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX3FkbTJfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSdHBRRE0yRGVwYXkgKnJ0cHFkbTJkZXBheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJ0cHFkbTJkZXBheSA9IEdTVF9SVFBfUURNMl9ERVBBWSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cHFkbTJkZXBheS0+YWRhcHRlcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9xZG0yX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBxZG0yZGVwYXlfZGVidWcsICJydHBxZG0yZGVwYXkiLCAwLAorICAgICAgIlJUUCBRRE0yIGRlcGF5bG9hZGVyIik7CisKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBxZG0yZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfUURNMl9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHFkbWRlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2YjJiMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwcWRtZGVwYXkuaApAQCAtMCwwICsxLDg1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAYmlsYm9lZC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfUURNMl9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1FETTJfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1FETTJfREVQQVkgXAorICAoZ3N0X3J0cF9xZG0yX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfUURNMl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9RRE0yX0RFUEFZLEdzdFJ0cFFETTJEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfUURNMl9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfUURNMl9ERVBBWSxHc3RSdHBRRE0yRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfUURNMl9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9RRE0yX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9RRE0yX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9RRE0yX0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFFETTJEZXBheSBHc3RSdHBRRE0yRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwUURNMkRlcGF5Q2xhc3MgR3N0UnRwUURNMkRlcGF5Q2xhc3M7CisKK3R5cGVkZWYgc3RydWN0IF9RRE0yUGFja2V0IHsKKyAgZ3VpbnQ4KiBkYXRhOworICBndWludCBvZmZzOwkJLyogU3RhcnRzIGF0IDQgdG8gZ2l2ZSByb29tIGZvciB0aGUgcHJlZml4ICovCit9IFFETTJQYWNrZXQ7CisKKyNkZWZpbmUgTUFYX1NDUkFNQkxFRF9QQUNLRVRTIDY0CisKK3N0cnVjdCBfR3N0UnRwUURNMkRlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisKKyAgZ3VpbnQxNiBuZXh0c2VxOworICBnYm9vbGVhbiBjb25maWd1cmVkOworCisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7IC8qIFRpbWVzdGFtcCBvZiBjdXJyZW50IGluY29taW5nIGRhdGEgKi8KKyAgR3N0Q2xvY2tUaW1lIHB0aW1lc3RhbXA7IC8qIFRpbWVzdGFtcCBvZiBkYXRhIHN0b3JlZCBpbiB0aGUgYWRhcHRlciAqLworCisgIGd1aW50MzIgY2hhbm5zOworICBndWludDMyIHNhbXBsZXJhdGU7CisgIGd1aW50MzIgYml0cmF0ZTsKKyAgZ3VpbnQzMiBibG9ja3NpemU7CisgIGd1aW50MzIgZnJhbWVzaXplOworICBndWludDMyIHBhY2tldHNpemU7CisKKyAgZ3VpbnQgbmJwYWNrZXRzOwkvKiBOdW1iZXIgb2YgcGFja2V0cyB0byB1bnNjcmFtYmxlICovCisKKyAgUURNMlBhY2tldCAqcGFja2V0c1tNQVhfU0NSQU1CTEVEX1BBQ0tFVFNdOworfTsKKworc3RydWN0IF9Hc3RSdHBRRE0yRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9xZG0yX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9xZG0yX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX1FETTJfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHNiY2RlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHNiY2RlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0OWJiMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwc2JjZGVwYXkuYwpAQCAtMCwwICsxLDM5NSBAQAorLyoKKyAqIEdTdHJlYW1lciBSVFAgU0JDIGRlcGF5bG9hZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyICBDb2xsYWJvcmEgTHRkLgorICogICBAYXV0aG9yOiBBcnVuIFJhZ2hhdmFuIDxhcnVuLnJhZ2hhdmFuQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgImdzdHJ0cHNiY2RlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwc2JjZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cHNiY2RlcGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9zYmNfZGVwYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwgR1NUX1BBRF9TUkMsIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtc2JjLCAiCisgICAgICAgICJyYXRlID0gKGludCkgeyAxNjAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdLCAiCisgICAgICAgICJtb2RlID0gKHN0cmluZykgeyBtb25vLCBkdWFsLCBzdGVyZW8sIGpvaW50IH0sICIKKyAgICAgICAgImJsb2NrcyA9IChpbnQpIHsgNCwgOCwgMTIsIDE2IH0sICIKKyAgICAgICAgInN1YmJhbmRzID0gKGludCkgeyA0LCA4IH0sICIKKyAgICAgICAgImFsbG9jYXRpb24tbWV0aG9kID0gKHN0cmluZykgeyBzbnIsIGxvdWRuZXNzIH0sICIKKyAgICAgICAgImJpdHBvb2wgPSAoaW50KSBbIDIsIDY0IF0iKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3NiY19kZXBheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsIEdTVF9QQURfU0lOSywgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgYXVkaW8sIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSB7IDE2MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH0sIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFNCQyIpCisgICAgKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfSUdOT1JFX1RJTUVTVEFNUFMsCisgIFBST1BfTEFTVAorfTsKKworI2RlZmluZSBERUZBVUxUX0lHTk9SRV9USU1FU1RBTVBTIEZBTFNFCisKKyNkZWZpbmUgZ3N0X3J0cF9zYmNfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwU2JjRGVwYXksIGdzdF9ydHBfc2JjX2RlcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX3NiY19kZXBheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX3NiY19kZXBheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX3NiY19kZXBheV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3NiY19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogYmFzZSwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX3NiY19kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogYmFzZSwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zYmNfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UnRwU2JjRGVwYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdGJhc2VydHBkZXBheWxvYWRfY2xhc3MgPQorICAgICAgR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9DTEFTUyAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoa2xhc3MpOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9zYmNfZGVwYXlfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9ydHBfc2JjX2RlcGF5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9zYmNfZGVwYXlfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSUdOT1JFX1RJTUVTVEFNUFMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImlnbm9yZS10aW1lc3RhbXBzIiwgIklnbm9yZSBUaW1lc3RhbXBzIiwKKyAgICAgICAgICAiVmFyaW91cyBzdGF0aXN0aWNzIiwgREVGQVVMVF9JR05PUkVfVElNRVNUQU1QUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RiYXNlcnRwZGVwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfc2JjX2RlcGF5X3NldGNhcHM7CisgIGdzdGJhc2VydHBkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfc2JjX2RlcGF5X3Byb2Nlc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9zYmNfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9zYmNfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cHNiY2RlcGF5X2RlYnVnLCAicnRwc2JjZGVwYXkiLCAwLAorICAgICAgIlNCQyBBdWRpbyBSVFAgRGVwYXlsb2FkZXIiKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBTQkMgYXVkaW8gZGVwYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBTQkMgYXVkaW8gZnJvbSBSVFAgcGFja2V0cyIsCisgICAgICAiQXJ1biBSYWdoYXZhbiA8YXJ1bi5yYWdoYXZhbkBjb2xsYWJvcmEuY28udWs+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3NiY19kZXBheV9pbml0IChHc3RSdHBTYmNEZXBheSAqIHJ0cHNiY2RlcGF5KQoreworICBydHBzYmNkZXBheS0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKyAgcnRwc2JjZGVwYXktPnN0cmVhbV9hbGlnbiA9CisgICAgICBnc3RfYXVkaW9fc3RyZWFtX2FsaWduX25ldyAoNDgwMDAsIDQwICogR1NUX01TRUNPTkQsIDEgKiBHU1RfU0VDT05EKTsKKyAgcnRwc2JjZGVwYXktPmlnbm9yZV90aW1lc3RhbXBzID0gREVGQVVMVF9JR05PUkVfVElNRVNUQU1QUzsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc2JjX2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSdHBTYmNEZXBheSAqZGVwYXkgPSBHU1RfUlRQX1NCQ19ERVBBWSAob2JqZWN0KTsKKworICBnc3RfYXVkaW9fc3RyZWFtX2FsaWduX2ZyZWUgKGRlcGF5LT5zdHJlYW1fYWxpZ24pOworICBnc3Rfb2JqZWN0X3VucmVmIChkZXBheS0+YWRhcHRlcik7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zYmNfZGVwYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cFNiY0RlcGF5ICpkZXBheSA9IEdTVF9SVFBfU0JDX0RFUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9JR05PUkVfVElNRVNUQU1QUzoKKyAgICAgIGRlcGF5LT5pZ25vcmVfdGltZXN0YW1wcyA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc2JjX2RlcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBTYmNEZXBheSAqZGVwYXkgPSBHU1RfUlRQX1NCQ19ERVBBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfSUdOT1JFX1RJTUVTVEFNUFM6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZGVwYXktPmlnbm9yZV90aW1lc3RhbXBzKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogRklYTUU6IFRoaXMgZHVwbGljYXRlcyBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgcnRwc2JjcGF5LCBidXQgdGhlcmUgaXNuJ3QgYQorICogc2ltcGxlIHdheSB0byBjb25zb2xpZGF0ZSB0aGUgdHdvLiBUaGlzIGlzIGJlc3QgZG9uZSBieSBtb3ZpbmcgdGhlIGZ1bmN0aW9uCisgKiB0byB0aGUgY29kZWMtdXRpbHMgbGlicmFyeSBpbiBnc3QtcGx1Z2lucy1iYXNlIHdoZW4gdGhlc2UgZWxlbWVudHMgbW92ZSB0bworICogR1N0cmVhbWVyLiAqLworc3RhdGljIGludAorZ3N0X3J0cF9zYmNfZGVwYXlfZ2V0X3BhcmFtcyAoR3N0UnRwU2JjRGVwYXkgKiBkZXBheSwgY29uc3QgZ3VpbnQ4ICogZGF0YSwKKyAgICBnaW50IHNpemUsIGludCAqZnJhbWVsZW4sIGludCAqc2FtcGxlcykKK3sKKyAgaW50IGJsb2NrcywgY2hhbm5lbF9tb2RlLCBjaGFubmVscywgc3ViYmFuZHMsIGJpdHBvb2w7CisgIGludCBsZW5ndGg7CisKKyAgaWYgKHNpemUgPCAzKSB7CisgICAgLyogTm90IGVub3VnaCBkYXRhIGZvciB0aGUgaGVhZGVyICovCisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogU2FuaXR5IGNoZWNrICovCisgIGlmIChkYXRhWzBdICE9IDB4OWMpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5LCAiQmFkIHBhY2tldDogY291bGRuJ3QgZmluZCBzeW5jd29yZCIpOworICAgIHJldHVybiAtMjsKKyAgfQorCisgIGJsb2NrcyA9IChkYXRhWzFdID4+IDQpICYgMHgzOworICBibG9ja3MgPSAoYmxvY2tzICsgMSkgKiA0OworICBjaGFubmVsX21vZGUgPSAoZGF0YVsxXSA+PiAyKSAmIDB4MzsKKyAgY2hhbm5lbHMgPSBjaGFubmVsX21vZGUgPyAyIDogMTsKKyAgc3ViYmFuZHMgPSAoZGF0YVsxXSAmIDB4MSk7CisgIHN1YmJhbmRzID0gKHN1YmJhbmRzICsgMSkgKiA0OworICBiaXRwb29sID0gZGF0YVsyXTsKKworICBsZW5ndGggPSA0ICsgKCg0ICogc3ViYmFuZHMgKiBjaGFubmVscykgLyA4KTsKKworICBpZiAoY2hhbm5lbF9tb2RlID09IDAgfHwgY2hhbm5lbF9tb2RlID09IDEpIHsKKyAgICAvKiBNb25vIHx8IER1YWwgY2hhbm5lbCAqLworICAgIGxlbmd0aCArPSAoKGJsb2NrcyAqIGNoYW5uZWxzICogYml0cG9vbCkKKyAgICAgICAgKyA0IC8qIHJvdW5kIHVwICovICkgLyA4OworICB9IGVsc2UgeworICAgIC8qIFN0ZXJlbyB8fCBKb2ludCBzdGVyZW8gKi8KKyAgICBnYm9vbGVhbiBqb2ludCA9IChjaGFubmVsX21vZGUgPT0gMyk7CisKKyAgICBsZW5ndGggKz0gKChqb2ludCAqIHN1YmJhbmRzKSArIChibG9ja3MgKiBiaXRwb29sKQorICAgICAgICArIDQgLyogcm91bmQgdXAgKi8gKSAvIDg7CisgIH0KKworICAqZnJhbWVsZW4gPSBsZW5ndGg7CisgICpzYW1wbGVzID0gYmxvY2tzICogc3ViYmFuZHM7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9zYmNfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGJhc2UsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSdHBTYmNEZXBheSAqZGVwYXkgPSBHU1RfUlRQX1NCQ19ERVBBWSAoYmFzZSk7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBHc3RDYXBzICpvdXRjYXBzLCAqb2xkY2FwczsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZkZXBheS0+cmF0ZSkpCisgICAgZ290byBiYWRfY2FwczsKKworICBvdXRjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtc2JjIiwgInJhdGUiLCBHX1RZUEVfSU5ULAorICAgICAgZGVwYXktPnJhdGUsIE5VTEwpOworCisgIGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChiYXNlKSwgb3V0Y2Fwcyk7CisKKyAgb2xkY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TSU5LUEFEIChiYXNlKSk7CisgIGlmIChvbGRjYXBzICYmICFnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChvbGRjYXBzLCBjYXBzKSkgeworICAgIC8qIENhcHMgaGF2ZSBjaGFuZ2VkLCBmbHVzaCBvbGQgZGF0YSAqLworICAgIGdzdF9hZGFwdGVyX2NsZWFyIChkZXBheS0+YWRhcHRlcik7CisgIH0KKworICBnc3RfY2Fwc191bnJlZiAob3V0Y2Fwcyk7CisgIGlmIChvbGRjYXBzKQorICAgIGdzdF9jYXBzX3VucmVmIChvbGRjYXBzKTsKKworICAvKiBSZXNldCB3aGVuIHRoZSBjYXBzIGFyZSBjaGFuZ2luZyAqLworICBnc3RfYXVkaW9fc3RyZWFtX2FsaWduX3NldF9yYXRlIChkZXBheS0+c3RyZWFtX2FsaWduLCBkZXBheS0+cmF0ZSk7CisKKyAgcmV0dXJuIFRSVUU7CisKK2JhZF9jYXBzOgorICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5LCAiQ2FuJ3Qgc3VwcG9ydCB0aGUgY2FwcyB3ZSBnb3Q6ICUiCisgICAgICBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX3NiY19kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogYmFzZSwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBTYmNEZXBheSAqZGVwYXkgPSBHU1RfUlRQX1NCQ19ERVBBWSAoYmFzZSk7CisgIEdzdEJ1ZmZlciAqZGF0YSA9IE5VTEw7CisKKyAgZ2Jvb2xlYW4gZnJhZ21lbnQsIHN0YXJ0LCBsYXN0OworICBndWludDggbmZyYW1lczsKKyAgZ3VpbnQ4ICpwYXlsb2FkOworICBndWludCBwYXlsb2FkX2xlbjsKKyAgZ2ludCBzYW1wbGVzID0gMDsKKworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworCisgIEdTVF9MT0dfT0JKRUNUIChkZXBheSwgIkdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKHJ0cC0+YnVmZmVyKSk7CisKKyAgaWYgKGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKHJ0cCkpIHsKKyAgICAvKiBNYXJrZXIgaXNuJ3Qgc3VwcG9zZWQgdG8gYmUgc2V0ICovCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZXBheSwgIk1hcmtlciBiaXQgd2FzIHNldCIpOworICAgIGdvdG8gYmFkX3BhY2tldDsKKyAgfQorCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfRFRTX09SX1BUUyAocnRwLT5idWZmZXIpOworICBpZiAoZGVwYXktPmlnbm9yZV90aW1lc3RhbXBzICYmIHRpbWVzdGFtcCA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgR3N0Q2xvY2tUaW1lIGluaXRpYWxfdGltZXN0YW1wOworICAgIGd1aW50NjQgbl9zYW1wbGVzOworCisgICAgaW5pdGlhbF90aW1lc3RhbXAgPQorICAgICAgICBnc3RfYXVkaW9fc3RyZWFtX2FsaWduX2dldF90aW1lc3RhbXBfYXRfZGlzY29udCAoZGVwYXktPnN0cmVhbV9hbGlnbik7CisgICAgbl9zYW1wbGVzID0KKyAgICAgICAgZ3N0X2F1ZGlvX3N0cmVhbV9hbGlnbl9nZXRfc2FtcGxlc19zaW5jZV9kaXNjb250IChkZXBheS0+c3RyZWFtX2FsaWduKTsKKworICAgIGlmIChpbml0aWFsX3RpbWVzdGFtcCA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChkZXBheSwKKyAgICAgICAgICAiQ2FuIG9ubHkgaWdub3JlIHRpbWVzdGFtcHMgb24gc3RyZWFtcyB3aXRob3V0IHZhbGlkIGluaXRpYWwgdGltZXN0YW1wIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB0aW1lc3RhbXAgPQorICAgICAgICBpbml0aWFsX3RpbWVzdGFtcCArIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAobl9zYW1wbGVzLCBHU1RfU0VDT05ELAorICAgICAgICBkZXBheS0+cmF0ZSk7CisgIH0KKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgIGZyYWdtZW50ID0gcGF5bG9hZFswXSAmIDB4ODA7CisgIHN0YXJ0ID0gcGF5bG9hZFswXSAmIDB4NDA7CisgIGxhc3QgPSBwYXlsb2FkWzBdICYgMHgyMDsKKyAgbmZyYW1lcyA9IHBheWxvYWRbMF0gJiAweDBmOworCisgIHBheWxvYWQgKz0gMTsKKyAgcGF5bG9hZF9sZW4gLT0gMTsKKworICBkYXRhID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfc3ViYnVmZmVyIChydHAsIDEsIC0xKTsKKworICBpZiAoZnJhZ21lbnQpIHsKKyAgICAvKiBHb3QgYSBwYWNrZXQgd2l0aCBhIGZyYWdtZW50ICovCisgICAgR1NUX0xPR19PQkpFQ1QgKGRlcGF5LCAiR290IGZyYWdtZW50Iik7CisKKyAgICBpZiAoc3RhcnQgJiYgZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZXBheS0+YWRhcHRlcikpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVwYXksICJNaXNzaW5nIGxhc3QgZnJhZ21lbnQiKTsKKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChkZXBheS0+YWRhcHRlcik7CisKKyAgICB9IGVsc2UgaWYgKCFzdGFydCAmJiAhZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChkZXBheS0+YWRhcHRlcikpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVwYXksICJNaXNzaW5nIHN0YXJ0IGZyYWdtZW50Iik7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChkYXRhKTsKKyAgICAgIGRhdGEgPSBOVUxMOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgZ3N0X2FkYXB0ZXJfcHVzaCAoZGVwYXktPmFkYXB0ZXIsIGRhdGEpOworCisgICAgaWYgKGxhc3QpIHsKKyAgICAgIGdpbnQgZnJhbWVsZW4sIHNhbXBsZXM7CisgICAgICBndWludDggaGVhZGVyWzRdOworCisgICAgICBkYXRhID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKGRlcGF5LT5hZGFwdGVyLAorICAgICAgICAgIGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoZGVwYXktPmFkYXB0ZXIpKTsKKyAgICAgIGdzdF9ydHBfZHJvcF9ub25fYXVkaW9fbWV0YSAoZGVwYXksIGRhdGEpOworCisgICAgICBpZiAoZ3N0X2J1ZmZlcl9leHRyYWN0IChkYXRhLCAwLCAmaGVhZGVyLCA0KSAhPSA0IHx8CisgICAgICAgICAgZ3N0X3J0cF9zYmNfZGVwYXlfZ2V0X3BhcmFtcyAoZGVwYXksIGhlYWRlciwKKyAgICAgICAgICAgICAgcGF5bG9hZF9sZW4sICZmcmFtZWxlbiwgJnNhbXBsZXMpIDwgMCkgeworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChkYXRhKTsKKyAgICAgICAgZ290byBiYWRfcGFja2V0OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBkYXRhID0gTlVMTDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogIWZyYWdtZW50ICovCisgICAgZ2ludCBmcmFtZWxlbjsKKworICAgIEdTVF9MT0dfT0JKRUNUIChkZXBheSwgIkdvdCAlZCBmcmFtZXMiLCBuZnJhbWVzKTsKKworICAgIGlmIChnc3RfcnRwX3NiY19kZXBheV9nZXRfcGFyYW1zIChkZXBheSwgcGF5bG9hZCwKKyAgICAgICAgICAgIHBheWxvYWRfbGVuLCAmZnJhbWVsZW4sICZzYW1wbGVzKSA8IDApIHsKKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChkZXBheS0+YWRhcHRlcik7CisgICAgICBnb3RvIGJhZF9wYWNrZXQ7CisgICAgfQorCisgICAgc2FtcGxlcyAqPSBuZnJhbWVzOworCisgICAgR1NUX0xPR19PQkpFQ1QgKGRlcGF5LCAiR290IHBheWxvYWQgb2YgJWQiLCBwYXlsb2FkX2xlbik7CisKKyAgICBpZiAobmZyYW1lcyAqIGZyYW1lbGVuID4gKGdpbnQpIHBheWxvYWRfbGVuKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5LCAiU2hvcnQgcGFja2V0Iik7CisgICAgICBnb3RvIGJhZF9wYWNrZXQ7CisgICAgfSBlbHNlIGlmIChuZnJhbWVzICogZnJhbWVsZW4gPCAoZ2ludCkgcGF5bG9hZF9sZW4pIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVwYXksICJKdW5rIGF0IGVuZCBvZiBwYWNrZXQiKTsKKyAgICB9CisgIH0KKworICBpZiAoZGVwYXktPmlnbm9yZV90aW1lc3RhbXBzICYmIGRhdGEpIHsKKyAgICBHc3RDbG9ja1RpbWUgZHVyYXRpb247CisKKyAgICBnc3RfYXVkaW9fc3RyZWFtX2FsaWduX3Byb2Nlc3MgKGRlcGF5LT5zdHJlYW1fYWxpZ24sCisgICAgICAgIEdTVF9CVUZGRVJfSVNfRElTQ09OVCAocnRwLT5idWZmZXIpLCB0aW1lc3RhbXAsIHNhbXBsZXMsICZ0aW1lc3RhbXAsCisgICAgICAgICZkdXJhdGlvbiwgTlVMTCk7CisKKyAgICBHU1RfQlVGRkVSX1BUUyAoZGF0YSkgPSB0aW1lc3RhbXA7CisgICAgR1NUX0JVRkZFUl9EVFMgKGRhdGEpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChkYXRhKSA9IGR1cmF0aW9uOworICB9CisKK291dDoKKyAgcmV0dXJuIGRhdGE7CisKK2JhZF9wYWNrZXQ6CisgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKGRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICgiUmVjZWl2ZWQgaW52YWxpZCBSVFAgcGF5bG9hZCwgZHJvcHBpbmciKSwgKE5VTEwpKTsKKyAgZ290byBvdXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3NiY19kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHNiY2RlcGF5IiwgR1NUX1JBTktfU0VDT05EQVJZLAorICAgICAgR1NUX1RZUEVfUlRQX1NCQ19ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHNiY2RlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHNiY2RlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhYzNhZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwc2JjZGVwYXkuaApAQCAtMCwwICsxLDcwIEBACisvKgorICoKKyAqICBCbHVlWiAtIEJsdWV0b290aCBwcm90b2NvbCBzdGFjayBmb3IgTGludXgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEyICBDb2xsYWJvcmEgTHRkLgorICoKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfU0JDX0RFUEFZX0gKKyNkZWZpbmUgX19HU1RfUlRQX1NCQ19ERVBBWV9ICisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9TQkNfREVQQVkgXAorCShnc3RfcnRwX3NiY19kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX1NCQ19ERVBBWShvYmopIFwKKwkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1NCQ19ERVBBWSxcCisJCUdzdFJ0cFNiY0RlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9TQkNfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKwkoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfU0JDX0RFUEFZLFwKKwkJR3N0UnRwU2JjRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfU0JDX0RFUEFZKG9iaikgXAorCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfU0JDX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9TQkNfREVQQVlfQ0xBU1Mob2JqKSBcCisJKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX1NCQ19ERVBBWSkpCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU2JjRGVwYXkgR3N0UnRwU2JjRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU2JjRGVwYXlDbGFzcyBHc3RSdHBTYmNEZXBheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cFNiY0RlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgYmFzZTsKKworICBpbnQgcmF0ZTsKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKyAgZ2Jvb2xlYW4gaWdub3JlX3RpbWVzdGFtcHM7CisKKyAgLyogVGltZXN0YW1wIHRyYWNraW5nIHdoZW4gaWdub3JpbmcgaW5wdXQgdGltZXN0YW1wcyAqLworICBHc3RBdWRpb1N0cmVhbUFsaWduICpzdHJlYW1fYWxpZ247Cit9OworCitzdHJ1Y3QgX0dzdFJ0cFNiY0RlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfc2JjX2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9zYmNfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwc2JjcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHNiY3BheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMmNiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHNiY3BheS5jCkBAIC0wLDAgKzEsMzgzIEBACisvKiAgR1N0cmVhbWVyIFJUUCBTQkMgcGF5bG9hZGVyCisgKiAgQmx1ZVogLSBCbHVldG9vdGggcHJvdG9jb2wgc3RhY2sgZm9yIExpbnV4CisgKgorICogIENvcHlyaWdodCAoQykgMjAwNC0yMDEwICBNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+CisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgImdzdHJ0cHNiY3BheS5oIgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCisjZGVmaW5lIFJUUF9TQkNfUEFZTE9BRF9IRUFERVJfU0laRSAxCisjZGVmaW5lIERFRkFVTFRfTUlOX0ZSQU1FUyAwCisjZGVmaW5lIFJUUF9TQkNfSEVBREVSX1RPVEFMICgxMiArIFJUUF9TQkNfUEFZTE9BRF9IRUFERVJfU0laRSkKKworLyogQkVHSU46IFBhY2tpbmcgZm9yIHJ0cF9wYXlsb2FkICovCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgcGFjayhwdXNoLCAxKQorI2VuZGlmCisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisvKiBGSVhNRTogdGhpcyBzZWVtcyBhbGwgYSBiaXQgb3ZlciB0aGUgdG9wIGZvciBhIHNpbmdsZSBieXRlLi4gKi8KK3N0cnVjdCBydHBfcGF5bG9hZAoreworICBndWludDggZnJhbWVfY291bnQ6NDsKKyAgZ3VpbnQ4IHJmYTA6MTsKKyAgZ3VpbnQ4IGlzX2xhc3RfZnJhZ21lbnQ6MTsKKyAgZ3VpbnQ4IGlzX2ZpcnN0X2ZyYWdtZW50OjE7CisgIGd1aW50OCBpc19mcmFnbWVudGVkOjE7Cit9CisjZWxpZiBHX0JZVEVfT1JERVIgPT0gR19CSUdfRU5ESUFOCitzdHJ1Y3QgcnRwX3BheWxvYWQKK3sKKyAgZ3VpbnQ4IGlzX2ZyYWdtZW50ZWQ6MTsKKyAgZ3VpbnQ4IGlzX2ZpcnN0X2ZyYWdtZW50OjE7CisgIGd1aW50OCBpc19sYXN0X2ZyYWdtZW50OjE7CisgIGd1aW50OCByZmEwOjE7CisgIGd1aW50OCBmcmFtZV9jb3VudDo0OworfQorI2Vsc2UKKyNlcnJvciAiVW5rbm93biBieXRlIG9yZGVyIgorI2VuZGlmCisKKyNpZmRlZiBfTVNDX1ZFUgorOworI3ByYWdtYSBwYWNrKHBvcCkKKyNlbHNlCitfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisjZW5kaWYKKy8qIEVORDogUGFja2luZyBmb3IgcnRwX3BheWxvYWQgKi8KKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTUlOX0ZSQU1FUworfTsKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF9zYmNfcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9ydHBfc2JjX3BheV9kZWJ1ZworCisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfcnRwX3NiY19wYXlfcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBTQkNQYXksIGdzdF9ydHBfc2JjX3BheSwgR1NUX1RZUEVfUlRQX0JBU0VfUEFZTE9BRCk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3NiY19wYXlfc2lua19mYWN0b3J5ID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsIEdTVF9QQURfU0lOSywgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1zYmMsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSB7IDE2MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH0sICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgWyAxLCAyIF0sICIKKyAgICAgICAgImNoYW5uZWwtbW9kZSA9IChzdHJpbmcpIHsgbW9ubywgZHVhbCwgc3RlcmVvLCBqb2ludCB9LCAiCisgICAgICAgICJibG9ja3MgPSAoaW50KSB7IDQsIDgsIDEyLCAxNiB9LCAiCisgICAgICAgICJzdWJiYW5kcyA9IChpbnQpIHsgNCwgOCB9LCAiCisgICAgICAgICJhbGxvY2F0aW9uLW1ldGhvZCA9IChzdHJpbmcpIHsgc25yLCBsb3VkbmVzcyB9LCAiCisgICAgICAgICJiaXRwb29sID0gKGludCkgWyAyLCA2NCBdIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9zYmNfcGF5X3NyY19mYWN0b3J5ID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwgR1NUX1BBRF9TUkMsIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIGF1ZGlvLCIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgeyAxNjAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9LCIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBTQkMiKQorICAgICk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfc2JjX3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX3NiY19wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgZ2ludAorZ3N0X3J0cF9zYmNfcGF5X2dldF9mcmFtZV9sZW4gKGdpbnQgc3ViYmFuZHMsIGdpbnQgY2hhbm5lbHMsCisgICAgZ2ludCBibG9ja3MsIGdpbnQgYml0cG9vbCwgY29uc3QgZ2NoYXIgKiBjaGFubmVsX21vZGUpCit7CisgIGdpbnQgbGVuOworICBnaW50IGpvaW47CisKKyAgbGVuID0gNCArICg0ICogc3ViYmFuZHMgKiBjaGFubmVscykgLyA4OworCisgIGlmIChzdHJjbXAgKGNoYW5uZWxfbW9kZSwgIm1vbm8iKSA9PSAwIHx8IHN0cmNtcCAoY2hhbm5lbF9tb2RlLCAiZHVhbCIpID09IDApCisgICAgbGVuICs9ICgoYmxvY2tzICogY2hhbm5lbHMgKiBiaXRwb29sKSArIDcpIC8gODsKKyAgZWxzZSB7CisgICAgam9pbiA9IHN0cmNtcCAoY2hhbm5lbF9tb2RlLCAiam9pbnQiKSA9PSAwID8gMSA6IDA7CisgICAgbGVuICs9ICgoam9pbiAqIHN1YmJhbmRzICsgYmxvY2tzICogYml0cG9vbCkgKyA3KSAvIDg7CisgIH0KKworICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfc2JjX3BheV9zZXRfY2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UnRwU0JDUGF5ICpzYmNwYXk7CisgIGdpbnQgcmF0ZSwgc3ViYmFuZHMsIGNoYW5uZWxzLCBibG9ja3MsIGJpdHBvb2w7CisgIGdpbnQgZnJhbWVfbGVuOworICBjb25zdCBnY2hhciAqY2hhbm5lbF9tb2RlOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKworICBzYmNwYXkgPSBHU1RfUlRQX1NCQ19QQVkgKHBheWxvYWQpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAicmF0ZSIsICZyYXRlKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsICZjaGFubmVscykpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiYmxvY2tzIiwgJmJsb2NrcykpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiYml0cG9vbCIsICZiaXRwb29sKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJzdWJiYW5kcyIsICZzdWJiYW5kcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGNoYW5uZWxfbW9kZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiY2hhbm5lbC1tb2RlIik7CisgIGlmICghY2hhbm5lbF9tb2RlKQorICAgIHJldHVybiBGQUxTRTsKKworICBmcmFtZV9sZW4gPSBnc3RfcnRwX3NiY19wYXlfZ2V0X2ZyYW1lX2xlbiAoc3ViYmFuZHMsIGNoYW5uZWxzLCBibG9ja3MsCisgICAgICBiaXRwb29sLCBjaGFubmVsX21vZGUpOworCisgIHNiY3BheS0+ZnJhbWVfbGVuZ3RoID0gZnJhbWVfbGVuOworICBzYmNwYXktPmZyYW1lX2R1cmF0aW9uID0gKChibG9ja3MgKiBzdWJiYW5kcykgKiBHU1RfU0VDT05EKSAvIHJhdGU7CisgIHNiY3BheS0+bGFzdF90aW1lc3RhbXAgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChwYXlsb2FkLCAiYXVkaW8iLCBUUlVFLCAiU0JDIiwgcmF0ZSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGF5bG9hZCwgImNhbGN1bGF0ZWQgZnJhbWUgbGVuZ3RoOiAlZCAiLCBmcmFtZV9sZW4pOworCisgIHJldHVybiBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAocGF5bG9hZCwgTlVMTCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3NiY19wYXlfZmx1c2hfYnVmZmVycyAoR3N0UnRwU0JDUGF5ICogc2JjcGF5KQoreworICBHc3RSVFBCdWZmZXIgcnRwID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKyAgZ3VpbnQgYXZhaWxhYmxlOworICBndWludCBtYXhfcGF5bG9hZDsKKyAgR3N0QnVmZmVyICpvdXRidWYsICpwYXlidWY7CisgIGd1aW50OCAqcGF5bG9hZF9kYXRhOworICBndWludCBmcmFtZV9jb3VudDsKKyAgZ3VpbnQgcGF5bG9hZF9sZW5ndGg7CisgIHN0cnVjdCBydHBfcGF5bG9hZCAqcGF5bG9hZDsKKyAgR3N0Rmxvd1JldHVybiByZXM7CisKKyAgaWYgKHNiY3BheS0+ZnJhbWVfbGVuZ3RoID09IDApIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzYmNwYXksICJGcmFtZSBsZW5ndGggaXMgMCIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIGRvIHsKKyAgICBhdmFpbGFibGUgPSBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHNiY3BheS0+YWRhcHRlcik7CisKKyAgICBtYXhfcGF5bG9hZCA9CisgICAgICAgIGdzdF9ydHBfYnVmZmVyX2NhbGNfcGF5bG9hZF9sZW4gKEdTVF9SVFBfQkFTRV9QQVlMT0FEX01UVSAoc2JjcGF5KSAtCisgICAgICAgIFJUUF9TQkNfUEFZTE9BRF9IRUFERVJfU0laRSwgMCwgMCk7CisKKyAgICBtYXhfcGF5bG9hZCA9IE1JTiAobWF4X3BheWxvYWQsIGF2YWlsYWJsZSk7CisgICAgZnJhbWVfY291bnQgPSBtYXhfcGF5bG9hZCAvIHNiY3BheS0+ZnJhbWVfbGVuZ3RoOworICAgIHBheWxvYWRfbGVuZ3RoID0gZnJhbWVfY291bnQgKiBzYmNwYXktPmZyYW1lX2xlbmd0aDsKKyAgICBpZiAocGF5bG9hZF9sZW5ndGggPT0gMCkgICAgLyogTm90aGluZyB0byBzZW5kICovCisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKFJUUF9TQkNfUEFZTE9BRF9IRUFERVJfU0laRSwgMCwgMCk7CisKKyAgICAvKiBnZXQgcGF5bG9hZCAqLworICAgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0YnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKworICAgIGdzdF9ydHBfYnVmZmVyX3NldF9wYXlsb2FkX3R5cGUgKCZydHAsIEdTVF9SVFBfQkFTRV9QQVlMT0FEX1BUIChzYmNwYXkpKTsKKworICAgIC8qIHdyaXRlIGhlYWRlciBhbmQgY29weSBkYXRhIGludG8gcGF5bG9hZCAqLworICAgIHBheWxvYWRfZGF0YSA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKyAgICBwYXlsb2FkID0gKHN0cnVjdCBydHBfcGF5bG9hZCAqKSBwYXlsb2FkX2RhdGE7CisgICAgbWVtc2V0IChwYXlsb2FkLCAwLCBzaXplb2YgKHN0cnVjdCBydHBfcGF5bG9hZCkpOworICAgIHBheWxvYWQtPmZyYW1lX2NvdW50ID0gZnJhbWVfY291bnQ7CisKKyAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgICBwYXlidWYgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlcl9mYXN0IChzYmNwYXktPmFkYXB0ZXIsIHBheWxvYWRfbGVuZ3RoKTsKKyAgICBnc3RfcnRwX2NvcHlfYXVkaW9fbWV0YSAoc2JjcGF5LCBvdXRidWYsIHBheWJ1Zik7CisgICAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKG91dGJ1ZiwgcGF5YnVmKTsKKworICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gc2JjcGF5LT5sYXN0X3RpbWVzdGFtcDsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWYpID0gZnJhbWVfY291bnQgKiBzYmNwYXktPmZyYW1lX2R1cmF0aW9uOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNiY3BheSwgIlB1c2hpbmcgJWQgYnl0ZXM6ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgcGF5bG9hZF9sZW5ndGgsIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfUFRTIChvdXRidWYpKSk7CisKKyAgICBzYmNwYXktPmxhc3RfdGltZXN0YW1wICs9IGZyYW1lX2NvdW50ICogc2JjcGF5LT5mcmFtZV9kdXJhdGlvbjsKKworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChzYmNwYXkpLCBvdXRidWYpOworCisgICAgLyogdHJ5IHRvIHNlbmQgYW5vdGhlciBSVFAgYnVmZmVyIGlmIGF2YWlsYWJsZSBkYXRhIGV4Y2VlZHMgTVRVIHNpemUgKi8KKyAgfSB3aGlsZSAocmVzID09IEdTVF9GTE9XX09LKTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9zYmNfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBTQkNQYXkgKnNiY3BheTsKKyAgZ3VpbnQgYXZhaWxhYmxlOworCisgIC8qIEZJWE1FIGNoZWNrIGZvciBuZWdvdGlhdGlvbiAqLworCisgIHNiY3BheSA9IEdTVF9SVFBfU0JDX1BBWSAocGF5bG9hZCk7CisKKyAgaWYgKEdTVF9CVUZGRVJfSVNfRElTQ09OVCAoYnVmZmVyKSkgeworICAgIC8qIFRyeSB0byBmbHVzaCB3aGF0ZXZlcidzIGxlZnQgKi8KKyAgICBnc3RfcnRwX3NiY19wYXlfZmx1c2hfYnVmZmVycyAoc2JjcGF5KTsKKyAgICAvKiBEcm9wIHRoZSByZXN0ICovCisgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHNiY3BheS0+YWRhcHRlciwKKyAgICAgICAgZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzYmNwYXktPmFkYXB0ZXIpKTsKKyAgICAvKiBSZXNldCB0aW1lc3RhbXBzICovCisgICAgc2JjcGF5LT5sYXN0X3RpbWVzdGFtcCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIH0KKworICBpZiAoc2JjcGF5LT5sYXN0X3RpbWVzdGFtcCA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgIHNiY3BheS0+bGFzdF90aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKworICBnc3RfYWRhcHRlcl9wdXNoIChzYmNwYXktPmFkYXB0ZXIsIGJ1ZmZlcik7CisKKyAgYXZhaWxhYmxlID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzYmNwYXktPmFkYXB0ZXIpOworICBpZiAoYXZhaWxhYmxlICsgUlRQX1NCQ19IRUFERVJfVE9UQUwgPj0KKyAgICAgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX01UVSAoc2JjcGF5KSB8fAorICAgICAgKGF2YWlsYWJsZSA+IChzYmNwYXktPm1pbl9mcmFtZXMgKiBzYmNwYXktPmZyYW1lX2xlbmd0aCkpKQorICAgIHJldHVybiBnc3RfcnRwX3NiY19wYXlfZmx1c2hfYnVmZmVycyAoc2JjcGF5KTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9zYmNfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwU0JDUGF5ICpzYmNwYXkgPSBHU1RfUlRQX1NCQ19QQVkgKHBheWxvYWQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIGdzdF9ydHBfc2JjX3BheV9mbHVzaF9idWZmZXJzIChzYmNwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX2V2ZW50IChwYXlsb2FkLCBldmVudCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3NiY19wYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cFNCQ1BheSAqc2JjcGF5ID0gR1NUX1JUUF9TQkNfUEFZIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChzYmNwYXktPmFkYXB0ZXIpOworCisgIEdTVF9DQUxMX1BBUkVOVCAoR19PQkpFQ1RfQ0xBU1MsIGZpbmFsaXplLCAob2JqZWN0KSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3NiY19wYXlfY2xhc3NfaW5pdCAoR3N0UnRwU0JDUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqcGF5bG9hZF9jbGFzcyA9IEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX3NiY19wYXlfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9ydHBfc2JjX3BheV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9ydHBfc2JjX3BheV9nZXRfcHJvcGVydHk7CisKKyAgcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9zYmNfcGF5X3NldF9jYXBzKTsKKyAgcGF5bG9hZF9jbGFzcy0+aGFuZGxlX2J1ZmZlciA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9zYmNfcGF5X2hhbmRsZV9idWZmZXIpOworICBwYXlsb2FkX2NsYXNzLT5zaW5rX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfc2JjX3BheV9zaW5rX2V2ZW50KTsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksCisgICAgICBQUk9QX01JTl9GUkFNRVMsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgibWluLWZyYW1lcyIsICJtaW5pbXVtIGZyYW1lIG51bWJlciIsCisgICAgICAgICAgIk1pbmltdW0gcXVhbnRpdHkgb2YgZnJhbWVzIHRvIHNlbmQgaW4gb25lIHBhY2tldCAiCisgICAgICAgICAgIigtMSBmb3IgbWF4aW11bSBhbGxvd2VkIGJ5IHRoZSBtdHUpIiwKKyAgICAgICAgICAtMSwgR19NQVhJTlQsIERFRkFVTFRfTUlOX0ZSQU1FUywgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3NiY19wYXlfc2lua19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9zYmNfcGF5X3NyY19mYWN0b3J5KTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiUlRQIHBhY2tldCBwYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrIiwgIlBheWxvYWQgU0JDIGF1ZGlvIGFzIFJUUCBwYWNrZXRzIiwKKyAgICAgICJUaGlhZ28gU291c2EgU2FudG9zIDx0aGlhZ29zc0BsY2MudWZjZy5lZHUuYnI+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9ydHBfc2JjX3BheV9kZWJ1ZywgInJ0cHNiY3BheSIsIDAsCisgICAgICAiUlRQIFNCQyBwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc2JjX3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwU0JDUGF5ICpzYmNwYXk7CisKKyAgc2JjcGF5ID0gR1NUX1JUUF9TQkNfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NSU5fRlJBTUVTOgorICAgICAgc2JjcGF5LT5taW5fZnJhbWVzID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3NiY19wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cFNCQ1BheSAqc2JjcGF5OworCisgIHNiY3BheSA9IEdTVF9SVFBfU0JDX1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTUlOX0ZSQU1FUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHNiY3BheS0+bWluX2ZyYW1lcyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3NiY19wYXlfaW5pdCAoR3N0UnRwU0JDUGF5ICogc2VsZikKK3sKKyAgc2VsZi0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKyAgc2VsZi0+ZnJhbWVfbGVuZ3RoID0gMDsKKyAgc2VsZi0+bGFzdF90aW1lc3RhbXAgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIHNlbGYtPm1pbl9mcmFtZXMgPSBERUZBVUxUX01JTl9GUkFNRVM7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3NiY19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBzYmNwYXkiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfUlRQX1NCQ19QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBzYmNwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwc2JjcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3MDIyOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwc2JjcGF5LmgKQEAgLTAsMCArMSw2NSBAQAorLyogIEdTdHJlYW1lciBSVFAgU0JDIHBheWxvYWRlcgorICogIEJsdWVaIC0gQmx1ZXRvb3RoIHByb3RvY29sIHN0YWNrIGZvciBMaW51eAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCAgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VwYXlsb2FkLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9TQkNfUEFZIFwKKyAgKGdzdF9ydHBfc2JjX3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX1NCQ19QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfU0JDX1BBWSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RSdHBTQkNQYXkpKQorI2RlZmluZSBHU1RfUlRQX1NCQ19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX1NCQ19QQVksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0UnRwU0JDUGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1NCQ19QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfU0JDX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfU0JDX1BBWV9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX1NCQ19QQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU0JDUGF5IEdzdFJ0cFNCQ1BheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBTQkNQYXlDbGFzcyBHc3RSdHBTQkNQYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBTQkNQYXkgeworICBHc3RSVFBCYXNlUGF5bG9hZCBiYXNlOworCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisgIEdzdENsb2NrVGltZSBsYXN0X3RpbWVzdGFtcDsKKworICBndWludCBmcmFtZV9sZW5ndGg7CisgIEdzdENsb2NrVGltZSBmcmFtZV9kdXJhdGlvbjsKKworICBndWludCBtaW5fZnJhbWVzOworfTsKKworc3RydWN0IF9Hc3RSdHBTQkNQYXlDbGFzcyB7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9zYmNfcGF5X2dldF90eXBlKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX3NiY19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHNpcmVuZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwc2lyZW5kZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMjcyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHNpcmVuZGVwYXkuYwpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIFNpcmVuIERlcGF5bG9hZGVyIEdzdCBFbGVtZW50CisgKgorICogICBAYXV0aG9yOiBZb3VuZXNzIEFsYW91aSA8a2FrYXJvdG9Aa2FrYXJvdG8uaG9tZWxpbnV4Lm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSAiZ3N0cnRwc2lyZW5kZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3NpcmVuX2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgMTYwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIlNJUkVOXCIiKQorICAgIC8qIFRoaXMgaXMgdGhlIGRlZmF1bHQsIHNvIHRoZSBwZWVyIGRvZXNuJ3QgaGF2ZSB0byBzcGVjaWZ5IGl0ICovCisgICAgLyogICIgImRjdC1sZW5ndGggPSAoaW50KSAzMjAiKSAqLworICAgICk7CisKKyAgICAgc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfc2lyZW5fZGVwYXlfc3JjX3RlbXBsYXRlID0KKyAgICAgICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXNpcmVuLCAiICJkY3QtbGVuZ3RoID0gKGludCkgMzIwIikKKyAgICApOworCisgICAgIHN0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfc2lyZW5fZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqCisgICAgZGVwYXlsb2FkLCBHc3RSVFBCdWZmZXIgKiBydHApOworICAgICBzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9zaXJlbl9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICoKKyAgICBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKTsKKworR19ERUZJTkVfVFlQRSAoR3N0UlRQU2lyZW5EZXBheSwgZ3N0X3J0cF9zaXJlbl9kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCisgICAgIHN0YXRpYyB2b2lkIGdzdF9ydHBfc2lyZW5fZGVwYXlfY2xhc3NfaW5pdCAoR3N0UlRQU2lyZW5EZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX3NpcmVuX2RlcGF5X3Byb2Nlc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9zaXJlbl9kZXBheV9zZXRjYXBzOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfc2lyZW5fZGVwYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9zaXJlbl9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgU2lyZW4gcGFja2V0IGRlcGF5bG9hZGVyIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBTaXJlbiBhdWRpbyBmcm9tIFJUUCBwYWNrZXRzIiwKKyAgICAgICJQaGlsaXBwZSBLYWxhZiA8cGhpbGlwcGUua2FsYWZAY29sbGFib3JhLmNvLnVrPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zaXJlbl9kZXBheV9pbml0IChHc3RSVFBTaXJlbkRlcGF5ICogcnRwc2lyZW5kZXBheSkKK3sKKworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfc2lyZW5fZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIGdib29sZWFuIHJldDsKKworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtc2lyZW4iLAorICAgICAgImRjdC1sZW5ndGgiLCBHX1RZUEVfSU5ULCAzMjAsIE5VTEwpOworICByZXQgPSBnc3RfcGFkX3NldF9jYXBzIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAoZGVwYXlsb2FkKSwgc3JjY2Fwcyk7CisKKyAgR1NUX0RFQlVHICgic2V0IGNhcHMgb24gc291cmNlOiAlIiBHU1RfUFRSX0ZPUk1BVCAiIChyZXQ9JWQpIiwgc3JjY2FwcywgcmV0KTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIC8qIGFsd2F5cyBmaXhlZCBjbG9jayByYXRlIG9mIDE2MDAwICovCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IDE2MDAwOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9zaXJlbl9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0QnVmZmVyICpvdXRidWY7CisKKyAgb3V0YnVmID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfYnVmZmVyIChydHApOworCisgIGlmIChvdXRidWYpIHsKKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKGRlcGF5bG9hZCwgb3V0YnVmKTsKKyAgfQorCisgIHJldHVybiBvdXRidWY7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3NpcmVuX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwc2lyZW5kZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9TSVJFTl9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHNpcmVuZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwc2lyZW5kZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZmZiMTEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHNpcmVuZGVwYXkuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogU2lyZW4gRGVwYXlsb2FkZXIgR3N0IEVsZW1lbnQKKyAqCisgKiAgIEBhdXRob3I6IFlvdW5lc3MgQWxhb3VpIDxrYWthcm90b0BrYWthcm90by5ob21lbGludXgubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1NJUkVOX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfU0lSRU5fREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMgdHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUFNpcmVuRGVwYXkgR3N0UlRQU2lyZW5EZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBTaXJlbkRlcGF5Q2xhc3MgR3N0UlRQU2lyZW5EZXBheUNsYXNzOworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9TSVJFTl9ERVBBWSBcCisgIChnc3RfcnRwX3NpcmVuX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfU0lSRU5fREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfU0lSRU5fREVQQVksR3N0UlRQU2lyZW5EZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfU0lSRU5fREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX1NJUkVOX0RFUEFZLEdzdFJUUFNpcmVuRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfU0lSRU5fREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfU0lSRU5fREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX1NJUkVOX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9TSVJFTl9ERVBBWSkpCisKKworc3RydWN0IF9Hc3RSVFBTaXJlbkRlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgZGVwYXlsb2FkOworCit9OworCitzdHJ1Y3QgX0dzdFJUUFNpcmVuRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9zaXJlbl9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfc2lyZW5fZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19HU1RfUlRQX1NJUkVOX0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBzaXJlbnBheS5jIGIvZ3N0L3J0cC9nc3RydHBzaXJlbnBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZjlhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHNpcmVucGF5LmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBTaXJlbiBQYXlsb2FkZXIgR3N0IEVsZW1lbnQKKyAqCisgKiAgIEBhdXRob3I6IFlvdW5lc3MgQWxhb3VpIDxrYWthcm90b0BrYWthcm90by5ob21lbGludXgubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdHJ0cHNpcmVucGF5LmgiCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwc2lyZW5wYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cHNpcmVucGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9zaXJlbl9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXNpcmVuLCAiICJkY3QtbGVuZ3RoID0gKGludCkgMzIwIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9zaXJlbl9wYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcImF1ZGlvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgMTYwMDAsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIlNJUkVOXCIsICIKKyAgICAgICAgImJpdHJhdGUgPSAoc3RyaW5nKSBcIjE2MDAwXCIsICIgImRjdC1sZW5ndGggPSAoaW50KSAzMjAiKQorICAgICk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3NpcmVuX3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworCitHX0RFRklORV9UWVBFIChHc3RSVFBTaXJlblBheSwgZ3N0X3J0cF9zaXJlbl9wYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfQVVESU9fUEFZTE9BRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3NpcmVuX3BheV9jbGFzc19pbml0IChHc3RSVFBTaXJlblBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9zaXJlbl9wYXlfc2V0Y2FwczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3NpcmVuX3BheV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9zaXJlbl9wYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgUGF5bG9hZGVyIGZvciBTaXJlbiBBdWRpbyIsICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBhY2tldGl6ZSBTaXJlbiBhdWRpbyBzdHJlYW1zIGludG8gUlRQIHBhY2tldHMiLAorICAgICAgIllvdW5lc3MgQWxhb3VpIDxrYWthcm90b0BrYWthcm90by5ob21lbGludXgubmV0PiIpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHBzaXJlbnBheV9kZWJ1ZywgInJ0cHNpcmVucGF5IiwgMCwKKyAgICAgICJzaXJlbiBhdWRpbyBSVFAgcGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3NpcmVuX3BheV9pbml0IChHc3RSVFBTaXJlblBheSAqIHJ0cHNpcmVucGF5KQoreworICBHc3RSVFBCYXNlUGF5bG9hZCAqcnRwYmFzZXBheWxvYWQ7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgKnJ0cGJhc2VhdWRpb3BheWxvYWQ7CisKKyAgcnRwYmFzZXBheWxvYWQgPSBHU1RfUlRQX0JBU0VfUEFZTE9BRCAocnRwc2lyZW5wYXkpOworICBydHBiYXNlYXVkaW9wYXlsb2FkID0gR1NUX1JUUF9CQVNFX0FVRElPX1BBWUxPQUQgKHJ0cHNpcmVucGF5KTsKKworICAvKiB3ZSBkb24ndCBzZXQgdGhlIHBheWxvYWQgdHlwZSwgaXQgc2hvdWxkIGJlIHNldCBieSB0aGUgYXBwbGljYXRpb24gdXNpbmcKKyAgICogdGhlIHB0IHByb3BlcnR5IG9yIHRoZSBkZWZhdWx0IDk2IHdpbGwgYmUgdXNlZCAqLworICBydHBiYXNlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IDE2MDAwOworCisgIC8qIHRlbGwgcnRwYmFzZWF1ZGlvcGF5bG9hZCB0aGF0IHRoaXMgaXMgYSBmcmFtZSBiYXNlZCBjb2RlYyAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfZnJhbWVfYmFzZWQgKHJ0cGJhc2VhdWRpb3BheWxvYWQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfc2lyZW5fcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcnRwYmFzZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSVFBTaXJlblBheSAqcnRwc2lyZW5wYXk7CisgIEdzdFJUUEJhc2VBdWRpb1BheWxvYWQgKnJ0cGJhc2VhdWRpb3BheWxvYWQ7CisgIGdpbnQgZGN0X2xlbmd0aDsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IGNoYXIgKnBheWxvYWRfbmFtZTsKKworICBydHBzaXJlbnBheSA9IEdTVF9SVFBfU0lSRU5fUEFZIChydHBiYXNlcGF5bG9hZCk7CisgIHJ0cGJhc2VhdWRpb3BheWxvYWQgPSBHU1RfUlRQX0JBU0VfQVVESU9fUEFZTE9BRCAocnRwYmFzZXBheWxvYWQpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiZGN0LWxlbmd0aCIsICZkY3RfbGVuZ3RoKTsKKyAgaWYgKGRjdF9sZW5ndGggIT0gMzIwKQorICAgIGdvdG8gd3JvbmdfZGN0OworCisgIHBheWxvYWRfbmFtZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSk7CisgIGlmIChnX2FzY2lpX3N0cmNhc2VjbXAgKCJhdWRpby94LXNpcmVuIiwgcGF5bG9hZF9uYW1lKSkKKyAgICBnb3RvIHdyb25nX2NhcHM7CisKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHJ0cGJhc2VwYXlsb2FkLCAiYXVkaW8iLCBUUlVFLCAiU0lSRU4iLAorICAgICAgMTYwMDApOworICAvKiBzZXQgb3B0aW9ucyBmb3IgdGhpcyBmcmFtZSBiYXNlZCBhdWRpbyBjb2RlYyAqLworICBnc3RfcnRwX2Jhc2VfYXVkaW9fcGF5bG9hZF9zZXRfZnJhbWVfb3B0aW9ucyAocnRwYmFzZWF1ZGlvcGF5bG9hZCwgMjAsIDQwKTsKKworICByZXR1cm4gZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKHJ0cGJhc2VwYXlsb2FkLCBOVUxMKTsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX2RjdDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHJ0cHNpcmVucGF5LCAiZGN0LWxlbmd0aCBtdXN0IGJlIDMyMCwgcmVjZWl2ZWQgJWQiLAorICAgICAgICBkY3RfbGVuZ3RoKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3dyb25nX2NhcHM6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChydHBzaXJlbnBheSwgImV4cGVjdGVkIGF1ZGlvL3gtc2lyZW4sIHJlY2VpdmVkICVzIiwKKyAgICAgICAgcGF5bG9hZF9uYW1lKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfc2lyZW5fcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwc2lyZW5wYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfU0lSRU5fUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwc2lyZW5wYXkuaCBiL2dzdC9ydHAvZ3N0cnRwc2lyZW5wYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJhNWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBzaXJlbnBheS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBTaXJlbiBQYXlsb2FkZXIgR3N0IEVsZW1lbnQKKyAqCisgKiAgIEBhdXRob3I6IFlvdW5lc3MgQWxhb3VpIDxrYWthcm90b0BrYWthcm90by5ob21lbGludXgubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1NJUkVOX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1NJUkVOX1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VhdWRpb3BheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9SVFBfU0lSRU5fUEFZIFwKKyAgKGdzdF9ydHBfc2lyZW5fcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfU0lSRU5fUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1NJUkVOX1BBWSxHc3RSVFBTaXJlblBheSkpCisjZGVmaW5lIEdTVF9SVFBfU0lSRU5fUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9TSVJFTl9QQVksR3N0UlRQU2lyZW5QYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfU0lSRU5fUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1NJUkVOX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfU0lSRU5fUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9TSVJFTl9QQVkpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUFNpcmVuUGF5IEdzdFJUUFNpcmVuUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUFNpcmVuUGF5Q2xhc3MgR3N0UlRQU2lyZW5QYXlDbGFzczsKKworc3RydWN0IF9Hc3RSVFBTaXJlblBheQoreworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkIGF1ZGlvcGF5bG9hZDsKK307CisKK3N0cnVjdCBfR3N0UlRQU2lyZW5QYXlDbGFzcworeworICBHc3RSVFBCYXNlQXVkaW9QYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9zaXJlbl9wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX3NpcmVuX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9SVFBfU0lSRU5fUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmM5ODdiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJnc3RydHBzcGVleGRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworLyogUnRwU1BFRVhEZXBheSBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgUFJPUF8wCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9zcGVleF9kZXBheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9ICAoaW50KSBbNjAwMCwgNDgwMDBdLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJTUEVFWFwiIikKKyAgICAvKiAgImVuY29kaW5nLXBhcmFtcyA9IChzdHJpbmcpIFwiMVwiIiAqLworICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3NwZWV4X2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1zcGVleCIpCisgICAgKTsKKworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X3J0cF9zcGVleF9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9zcGVleF9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworR19ERUZJTkVfVFlQRSAoR3N0UnRwU1BFRVhEZXBheSwgZ3N0X3J0cF9zcGVleF9kZXBheSwKKyAgICBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zcGVleF9kZXBheV9jbGFzc19pbml0IChHc3RSdHBTUEVFWERlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfc3BlZXhfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX3NwZWV4X2RlcGF5X3NldGNhcHM7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9zcGVleF9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3NwZWV4X2RlcGF5X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBTcGVleCBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgU3BlZXggYXVkaW8gZnJvbSBSVFAgcGFja2V0cyIsCisgICAgICAiRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc3BlZXhfZGVwYXlfaW5pdCAoR3N0UnRwU1BFRVhEZXBheSAqIHJ0cHNwZWV4ZGVwYXkpCit7Cit9CisKK3N0YXRpYyBnaW50Citnc3RfcnRwX3NwZWV4X2RlcGF5X2dldF9tb2RlIChnaW50IHJhdGUpCit7CisgIGlmIChyYXRlID4gMjUwMDApCisgICAgcmV0dXJuIDI7CisgIGVsc2UgaWYgKHJhdGUgPiAxMjUwMCkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBsZW4gNCBieXRlcyBMRSwKKyAqIHZlbmRvciBzdHJpbmcgKGxlbiBieXRlcyksCisgKiB1c2VyX2xlbiA0ICgwKSBieXRlcyBMRQorICovCitzdGF0aWMgY29uc3QgZ2NoYXIgZ3N0X3J0cF9zcGVleF9jb21tZW50W10gPQorICAgICJcMDQ1XDBcMFwwRGVwYXlsb2FkZWQgd2l0aCBHU3RyZWFtZXIgc3BlZXhkZXBheVwwXDBcMFwwIjsKKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3NwZWV4X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR3N0UnRwU1BFRVhEZXBheSAqcnRwc3BlZXhkZXBheTsKKyAgZ2ludCBjbG9ja19yYXRlLCBuYl9jaGFubmVsczsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmRhdGE7CisgIGNvbnN0IGdjaGFyICpwYXJhbXM7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIGdib29sZWFuIHJlczsKKworICBydHBzcGVleGRlcGF5ID0gR1NUX1JUUF9TUEVFWF9ERVBBWSAoZGVwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBnb3RvIG5vX2Nsb2NrcmF0ZTsKKyAgZGVwYXlsb2FkLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICBpZiAoIShwYXJhbXMgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImVuY29kaW5nLXBhcmFtcyIpKSkKKyAgICBuYl9jaGFubmVscyA9IDE7CisgIGVsc2UgeworICAgIG5iX2NoYW5uZWxzID0gYXRvaSAocGFyYW1zKTsKKyAgfQorCisgIC8qIGNvbnN0cnVjdCBtaW5pbWFsIGhlYWRlciBhbmQgY29tbWVudCBwYWNrZXQgZm9yIHRoZSBkZWNvZGVyICovCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoODApOworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBtZW1jcHkgKGRhdGEsICJTcGVleCAgICIsIDgpOworICBkYXRhICs9IDg7CisgIG1lbWNweSAoZGF0YSwgIjEuMS4xMiIsIDcpOworICBkYXRhICs9IDIwOworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhLCAxKTsgICAgICAgIC8qIHZlcnNpb24gKi8KKyAgZGF0YSArPSA0OworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhLCA4MCk7ICAgICAgIC8qIGhlYWRlcl9zaXplICovCisgIGRhdGEgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSwgY2xvY2tfcmF0ZSk7ICAgICAgIC8qIHJhdGUgKi8KKyAgZGF0YSArPSA0OworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhLCBnc3RfcnRwX3NwZWV4X2RlcGF5X2dldF9tb2RlIChjbG9ja19yYXRlKSk7ICAgICAgICAvKiBtb2RlICovCisgIGRhdGEgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSwgNCk7ICAgICAgICAvKiBtb2RlX2JpdHN0cmVhbV92ZXJzaW9uICovCisgIGRhdGEgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSwgbmJfY2hhbm5lbHMpOyAgICAgIC8qIG5iX2NoYW5uZWxzICovCisgIGRhdGEgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSwgLTEpOyAgICAgICAvKiBiaXRyYXRlICovCisgIGRhdGEgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSwgMHhhMCk7ICAgICAvKiBmcmFtZV9zaXplICovCisgIGRhdGEgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSwgMCk7ICAgICAgICAvKiBWQlIgKi8KKyAgZGF0YSArPSA0OworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhLCAxKTsgICAgICAgIC8qIGZyYW1lc19wZXJfcGFja2V0ICovCisgIGRhdGEgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSwgMCk7ICAgICAgICAvKiBleHRyYV9oZWFkZXJzICovCisgIGRhdGEgKz0gNDsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoZGF0YSwgMCk7ICAgICAgICAvKiByZXNlcnZlZDEgKi8KKyAgZGF0YSArPSA0OworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhLCAwKTsgICAgICAgIC8qIHJlc2VydmVkMiAqLworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXVkaW8veC1zcGVleCIpOworICByZXMgPSBnc3RfcGFkX3NldF9jYXBzIChkZXBheWxvYWQtPnNyY3BhZCwgc3JjY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICBnc3RfcnRwX2Jhc2VfZGVwYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9ERVBBWUxPQUQgKHJ0cHNwZWV4ZGVwYXkpLCBidWYpOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZW9mIChnc3RfcnRwX3NwZWV4X2NvbW1lbnQpKTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIGdzdF9ydHBfc3BlZXhfY29tbWVudCwKKyAgICAgIHNpemVvZiAoZ3N0X3J0cF9zcGVleF9jb21tZW50KSk7CisKKyAgZ3N0X3J0cF9iYXNlX2RlcGF5bG9hZF9wdXNoIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEIChydHBzcGVleGRlcGF5KSwgYnVmKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworbm9fY2xvY2tyYXRlOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAibm8gY2xvY2stcmF0ZSBzcGVjaWZpZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX3NwZWV4X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RCdWZmZXIgKm91dGJ1ZiA9IE5VTEw7CisKKyAgR1NUX0RFQlVHICgicHJvY2VzcyA6IGdvdCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzLCBtYXJrICVkIHRzICV1IHNlcW4gJWQiLAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAocnRwLT5idWZmZXIpLAorICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAocnRwKSwKKyAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF90aW1lc3RhbXAgKHJ0cCksIGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKHJ0cCkpOworCisgIC8qIG5vdGhpbmcgc3BlY2lhbCB0byBiZSBkb25lICovCisgIG91dGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2J1ZmZlciAocnRwKTsKKworICBpZiAob3V0YnVmKSB7CisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSA9IDIwICogR1NUX01TRUNPTkQ7CisgICAgZ3N0X3J0cF9kcm9wX25vbl9hdWRpb19tZXRhIChkZXBheWxvYWQsIG91dGJ1Zik7CisgIH0KKworICByZXR1cm4gb3V0YnVmOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9zcGVleF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHNwZWV4ZGVwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfU1BFRVhfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHNwZWV4ZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWZmZWQwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBzcGVleGRlcGF5LmgKQEAgLTAsMCArMSw1MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIAorICovCisgCisjaWZuZGVmIF9fR1NUX1JUUF9TUEVFWF9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1NQRUVYX0RFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBTUEVFWERlcGF5IEdzdFJ0cFNQRUVYRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU1BFRVhEZXBheUNsYXNzIEdzdFJ0cFNQRUVYRGVwYXlDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfU1BFRVhfREVQQVkgXAorICAoZ3N0X3J0cF9zcGVleF9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX1NQRUVYX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1NQRUVYX0RFUEFZLEdzdFJ0cFNQRUVYRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX1NQRUVYX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9TUEVFWF9ERVBBWSxHc3RSdHBTUEVFWERlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1NQRUVYX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1NQRUVYX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9TUEVFWF9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfU1BFRVhfREVQQVkpKQorCitzdHJ1Y3QgX0dzdFJ0cFNQRUVYRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cFNQRUVYRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9zcGVleF9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfc3BlZXhfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfU1BFRVhfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxNmJkNgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwc3BlZXhwYXkuYwpAQCAtMCwwICsxLDM1MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgImdzdHJ0cHNwZWV4cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwc3BlZXhwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cHNwZWV4cGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9zcGVleF9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXNwZWV4LCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyA2MDAwLCA0ODAwMCBdLCAiICJjaGFubmVscyA9IChpbnQpIDEiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3NwZWV4X3BheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpICIgR1NUX1JUUF9QQVlMT0FEX0RZTkFNSUNfU1RSSU5HICIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAgKGludCkgWyA2MDAwLCA0ODAwMCBdLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJTUEVFWFwiLCAiCisgICAgICAgICJlbmNvZGluZy1wYXJhbXMgPSAoc3RyaW5nKSBcIjFcIiIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfc3BlZXhfcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3NwZWV4X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdENhcHMgKmdzdF9ydHBfc3BlZXhfcGF5X2dldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9zcGVleF9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKgorICAgIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKKyNkZWZpbmUgZ3N0X3J0cF9zcGVleF9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwU1BFRVhQYXksIGdzdF9ydHBfc3BlZXhfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc3BlZXhfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cFNQRUVYUGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzICpnc3RydHBiYXNlcGF5bG9hZF9jbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX3NwZWV4X3BheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF9zcGVleF9wYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmdldF9jYXBzID0gZ3N0X3J0cF9zcGVleF9wYXlfZ2V0Y2FwczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX3NwZWV4X3BheV9oYW5kbGVfYnVmZmVyOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfc3BlZXhfcGF5X3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3NwZWV4X3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBTcGVleCBwYXlsb2FkZXIiLCAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkLWVuY29kZXMgU3BlZXggYXVkaW8gaW50byBhIFJUUCBwYWNrZXQiLAorICAgICAgIkVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cHNwZWV4cGF5X2RlYnVnLCAicnRwc3BlZXhwYXkiLCAwLAorICAgICAgIlNwZWV4IFJUUCBQYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc3BlZXhfcGF5X2luaXQgKEdzdFJ0cFNQRUVYUGF5ICogcnRwc3BlZXhwYXkpCit7CisgIEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHBzcGVleHBheSktPmNsb2NrX3JhdGUgPSA4MDAwOworICBHU1RfUlRQX0JBU0VfUEFZTE9BRF9QVCAocnRwc3BlZXhwYXkpID0gMTEwOyAgLyogQ3JlYXRlIFN0cmluZyAqLworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfc3BlZXhfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIC8qIGRvbid0IGNvbmZpZ3VyZSB5ZXQsIHdlIHdhaXQgZm9yIHRoZSBpZGVudCBwYWNrZXQgKi8KKyAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3J0cF9zcGVleF9wYXlfZ2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RQYWQgKiBwYWQsCisgICAgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqb3RoZXJwYWRjYXBzOworICBHc3RDYXBzICpjYXBzOworCisgIG90aGVycGFkY2FwcyA9IGdzdF9wYWRfZ2V0X2FsbG93ZWRfY2FwcyAocGF5bG9hZC0+c3JjcGFkKTsKKyAgY2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChwYWQpOworCisgIGlmIChvdGhlcnBhZGNhcHMpIHsKKyAgICBpZiAoIWdzdF9jYXBzX2lzX2VtcHR5IChvdGhlcnBhZGNhcHMpKSB7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnBzOworICAgICAgR3N0U3RydWN0dXJlICpzOworICAgICAgZ2ludCBjbG9ja19yYXRlOworCisgICAgICBwcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKG90aGVycGFkY2FwcywgMCk7CisgICAgICBjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoY2Fwcyk7CisgICAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHBzLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkgeworICAgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAocywgInJhdGUiLCBjbG9ja19yYXRlKTsKKyAgICAgIH0KKyAgICB9CisgICAgZ3N0X2NhcHNfdW5yZWYgKG90aGVycGFkY2Fwcyk7CisgIH0KKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqdGNhcHMgPSBjYXBzOworCisgICAgY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHRjYXBzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmICh0Y2Fwcyk7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3NwZWV4X3BheV9wYXJzZV9pZGVudCAoR3N0UnRwU1BFRVhQYXkgKiBydHBzcGVleHBheSwKKyAgICBjb25zdCBndWludDggKiBkYXRhLCBndWludCBzaXplKQoreworICBndWludDMyIHZlcnNpb24sIGhlYWRlcl9zaXplLCByYXRlLCBtb2RlLCBuYl9jaGFubmVsczsKKyAgR3N0UlRQQmFzZVBheWxvYWQgKnBheWxvYWQ7CisgIGdjaGFyICpjc3RyOworICBnYm9vbGVhbiByZXM7CisKKyAgLyogd2UgbmVlZCB0aGUgaGVhZGVyIHN0cmluZyAoOCksIHRoZSB2ZXJzaW9uIHN0cmluZyAoMjApLCB0aGUgdmVyc2lvbgorICAgKiBhbmQgdGhlIGhlYWRlciBsZW5ndGguICovCisgIGlmIChzaXplIDwgMzYpCisgICAgZ290byB0b29fc21hbGw7CisKKyAgaWYgKCFnX3N0cl9oYXNfcHJlZml4ICgoY29uc3QgZ2NoYXIgKikgZGF0YSwgIlNwZWV4ICAgIikpCisgICAgZ290byB3cm9uZ19oZWFkZXI7CisKKyAgLyogc2tpcCBoZWFkZXIgYW5kIHZlcnNpb24gc3RyaW5nICovCisgIGRhdGEgKz0gMjg7CisKKyAgdmVyc2lvbiA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSk7CisgIGlmICh2ZXJzaW9uICE9IDEpCisgICAgZ290byB3cm9uZ192ZXJzaW9uOworCisgIGRhdGEgKz0gNDsKKyAgLyogZW5zdXJlIHNpemVzICovCisgIGhlYWRlcl9zaXplID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKyAgaWYgKGhlYWRlcl9zaXplIDwgODApCisgICAgZ290byBoZWFkZXJfdG9vX3NtYWxsOworCisgIGlmIChzaXplIDwgaGVhZGVyX3NpemUpCisgICAgZ290byBwYXlsb2FkX3Rvb19zbWFsbDsKKworICBkYXRhICs9IDQ7CisgIHJhdGUgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEpOworICBkYXRhICs9IDQ7CisgIG1vZGUgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEpOworICBkYXRhICs9IDg7CisgIG5iX2NoYW5uZWxzID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBzcGVleHBheSwgInJhdGUgJWQsIG1vZGUgJWQsIG5iX2NoYW5uZWxzICVkIiwKKyAgICAgIHJhdGUsIG1vZGUsIG5iX2NoYW5uZWxzKTsKKworICBwYXlsb2FkID0gR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cHNwZWV4cGF5KTsKKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocGF5bG9hZCwgImF1ZGlvIiwgRkFMU0UsICJTUEVFWCIsIHJhdGUpOworICBjc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiJWQiLCBuYl9jaGFubmVscyk7CisgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXlsb2FkLCAiZW5jb2RpbmctcGFyYW1zIiwKKyAgICAgIEdfVFlQRV9TVFJJTkcsIGNzdHIsIE5VTEwpOworICBnX2ZyZWUgKGNzdHIpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCit0b29fc21hbGw6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBzcGVleHBheSwKKyAgICAgICAgImlkZW50IHBhY2tldCB0b28gc21hbGwsIG5lZWQgYXQgbGVhc3QgMzIgYnl0ZXMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3dyb25nX2hlYWRlcjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNwZWV4cGF5LAorICAgICAgICAiaWRlbnQgcGFja2V0IGRvZXMgbm90IHN0YXJ0IHdpdGggXCJTcGVleCAgIFwiIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ192ZXJzaW9uOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwc3BlZXhwYXksICJjYW4gb25seSBoYW5kbGUgdmVyc2lvbiAxLCBoYXZlIHZlcnNpb24gJWQiLAorICAgICAgICB2ZXJzaW9uKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2hlYWRlcl90b29fc21hbGw6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBzcGVleHBheSwKKyAgICAgICAgImhlYWRlciBzaXplIHRvbyBzbWFsbCwgbmVlZCBhdCBsZWFzdCA4MCBieXRlcywgIiAiZ290IG9ubHkgJWQiLAorICAgICAgICBoZWFkZXJfc2l6ZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitwYXlsb2FkX3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNwZWV4cGF5LAorICAgICAgICAicGF5bG9hZCB0b28gc21hbGwsIG5lZWQgYXQgbGVhc3QgJWQgYnl0ZXMsIGdvdCBvbmx5ICVkIiwgaGVhZGVyX3NpemUsCisgICAgICAgIHNpemUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9zcGVleF9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJ0cFNQRUVYUGF5ICpydHBzcGVleHBheTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBkdXJhdGlvbjsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgcnRwc3BlZXhwYXkgPSBHU1RfUlRQX1NQRUVYX1BBWSAoYmFzZXBheWxvYWQpOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgc3dpdGNoIChydHBzcGVleHBheS0+cGFja2V0KSB7CisgICAgY2FzZSAwOgorICAgICAgLyogaWRlbnQgcGFja2V0LiBXZSBuZWVkIHRvIHBhcnNlIHRoZSBoZWFkZXJzIHRvIGNvbnN0cnVjdCB0aGUgUlRQCisgICAgICAgKiBwcm9wZXJ0aWVzLiAqLworICAgICAgaWYgKCFnc3RfcnRwX3NwZWV4X3BheV9wYXJzZV9pZGVudCAocnRwc3BlZXhwYXksIG1hcC5kYXRhLCBtYXAuc2l6ZSkpIHsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICAgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgICAgIH0KKworICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICAgICAgZ290byBkb25lOworICAgIGNhc2UgMToKKyAgICAgIC8qIGNvbW1lbnQgcGFja2V0LCB3ZSBpZ25vcmUgaXQgKi8KKyAgICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICAgIGdvdG8gZG9uZTsKKyAgICBkZWZhdWx0OgorICAgICAgLyogb3RoZXIgcGFja2V0cyBnbyBpbiB0aGUgcGF5bG9hZCAqLworICAgICAgYnJlYWs7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKworICBpZiAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmZmVyLCBHU1RfQlVGRkVSX0ZMQUdfR0FQKSkgeworICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisKKyAgLyogRklYTUUsIG9ubHkgb25lIFNQRUVYIGZyYW1lIHBlciBSVFAgcGFja2V0IGZvciBub3cgKi8KKworICBvdXRidWYgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKDAsIDAsIDApOworICAvKiBGSVhNRSwgYXNzZXJ0IGZvciBub3cgKi8KKyAgZ19hc3NlcnQgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikgPD0KKyAgICAgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX01UVSAocnRwc3BlZXhwYXkpKTsKKworICAvKiBjb3B5IHRpbWVzdGFtcCBhbmQgZHVyYXRpb24gKi8KKyAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSB0aW1lc3RhbXA7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZikgPSBkdXJhdGlvbjsKKworICBnc3RfcnRwX2NvcHlfYXVkaW9fbWV0YSAoYmFzZXBheWxvYWQsIG91dGJ1ZiwgYnVmZmVyKTsKKyAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKG91dGJ1ZiwgYnVmZmVyKTsKKyAgYnVmZmVyID0gTlVMTDsKKworICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoIChiYXNlcGF5bG9hZCwgb3V0YnVmKTsKKworZG9uZToKKyAgaWYgKGJ1ZmZlcikKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIHJ0cHNwZWV4cGF5LT5wYWNrZXQrKzsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworcGFyc2VfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocnRwc3BlZXhwYXksIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksCisgICAgICAgICgiRXJyb3IgcGFyc2luZyBmaXJzdCBpZGVudGlmaWNhdGlvbiBwYWNrZXQuIikpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9zcGVleF9wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UnRwU1BFRVhQYXkgKnJ0cHNwZWV4cGF5OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwc3BlZXhwYXkgPSBHU1RfUlRQX1NQRUVYX1BBWSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgcnRwc3BlZXhwYXktPnBhY2tldCA9IDA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9zcGVleF9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBzcGVleHBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9TUEVFWF9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBzcGVleHBheS5oIGIvZ3N0L3J0cC9nc3RydHBzcGVleHBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjY2FlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHNwZWV4cGF5LmgKQEAgLTAsMCArMSw1NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIAorICovCisKKworI2lmbmRlZiBfX0dTVF9SVFBfU1BFRVhfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfU1BFRVhfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU1BFRVhQYXkgR3N0UnRwU1BFRVhQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU1BFRVhQYXlDbGFzcyBHc3RSdHBTUEVFWFBheUNsYXNzOworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9TUEVFWF9QQVkgXAorICAoZ3N0X3J0cF9zcGVleF9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9TUEVFWF9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfU1BFRVhfUEFZLEdzdFJ0cFNQRUVYUGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9TUEVFWF9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX1NQRUVYX1BBWSxHc3RSdHBTUEVFWFBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9TUEVFWF9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfU1BFRVhfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9TUEVFWF9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX1NQRUVYX1BBWSkpCisKK3N0cnVjdCBfR3N0UnRwU1BFRVhQYXkKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWQgcGF5bG9hZDsKKworICBndWludDY0IHBhY2tldDsKK307CisKK3N0cnVjdCBfR3N0UnRwU1BFRVhQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfc3BlZXhfcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9zcGVleF9wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfU1BFRVhfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBzdHJlYW1kZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBzdHJlYW1kZXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NTAwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHN0cmVhbWRlcGF5LmMKQEAgLTAsMCArMSwyMzEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDEzIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwc3RyZWFtZGVwYXkKKyAqCisgKiBJbXBsZW1lbnRzIHN0cmVhbSBkZXBheWxvYWRpbmcgb2YgUlRQIGFuZCBSVENQIHBhY2tldHMgZm9yIGNvbm5lY3Rpb24tb3JpZW50ZWQKKyAqIHRyYW5zcG9ydCBwcm90b2NvbHMgYWNjb3JkaW5nIHRvIFJGQzQ1NzEuCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjICEgImF1ZGlvL3gtcmF3LHJhdGU9NDgwMDAiICEgdm9yYmlzZW5jICEgcnRwdm9yYmlzcGF5IGNvbmZpZy1pbnRlcnZhbD0xICEgcnRwc3RyZWFtcGF5ICEgdGNwc2VydmVyc2luayBwb3J0PTU2NzgKKyAqIGdzdC1sYXVuY2gtMS4wIHRjcGNsaWVudHNyYyBwb3J0PTU2NzggaG9zdD0xMjcuMC4wLjEgZG8tdGltZXN0YW1wPXRydWUgISAiYXBwbGljYXRpb24veC1ydHAtc3RyZWFtLG1lZGlhPWF1ZGlvLGNsb2NrLXJhdGU9NDgwMDAsZW5jb2RpbmctbmFtZT1WT1JCSVMiICEgcnRwc3RyZWFtZGVwYXkgISBydHB2b3JiaXNkZXBheSAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RydHBzdHJlYW1kZXBheS5oIgorCitHU1RfREVCVUdfQ0FURUdPUlkgKGdzdF9ydHBfc3RyZWFtX2RlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9ydHBfc3RyZWFtX2RlcGF5X2RlYnVnCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHA7IGFwcGxpY2F0aW9uL3gtcnRjcDsiCisgICAgICAgICJhcHBsaWNhdGlvbi94LXNydHA7IGFwcGxpY2F0aW9uL3gtc3J0Y3AiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLCBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAtc3RyZWFtOyBhcHBsaWNhdGlvbi94LXJ0Y3Atc3RyZWFtOyIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtc3J0cC1zdHJlYW07IGFwcGxpY2F0aW9uL3gtc3J0Y3Atc3RyZWFtIikKKyAgICApOworCisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfcnRwX3N0cmVhbV9kZXBheV9wYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cFN0cmVhbURlcGF5LCBnc3RfcnRwX3N0cmVhbV9kZXBheSwgR1NUX1RZUEVfQkFTRV9QQVJTRSk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3N0cmVhbV9kZXBheV9zZXRfc2lua19jYXBzIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3J0cF9zdHJlYW1fZGVwYXlfZ2V0X3NpbmtfY2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsCisgICAgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX3N0cmVhbV9kZXBheV9oYW5kbGVfZnJhbWUgKEdzdEJhc2VQYXJzZSAqIHBhcnNlLAorICAgIEdzdEJhc2VQYXJzZUZyYW1lICogZnJhbWUsIGdpbnQgKiBza2lwc2l6ZSk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3N0cmVhbV9kZXBheV9zaW5rX2FjdGl2YXRlIChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50KTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc3RyZWFtX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cFN0cmVhbURlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QmFzZVBhcnNlQ2xhc3MgKnBhcnNlX2NsYXNzID0gR1NUX0JBU0VfUEFSU0VfQ0xBU1MgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3J0cF9zdHJlYW1fZGVwYXlfZGVidWcsICJydHBzdHJlYW1kZXBheSIsIDAsCisgICAgICAiUlRQIHN0cmVhbSBkZXBheWxvYWRlciIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBTdHJlYW0gRGVwYXlsb2FkaW5nIiwgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsiLAorICAgICAgIkRlcGF5bG9hZHMgUlRQL1JUQ1AgcGFja2V0cyBmb3Igc3RyZWFtaW5nIHByb3RvY29scyBhY2NvcmRpbmcgdG8gUkZDNDU3MSIsCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4iKTsKKworICBwYXJzZV9jbGFzcy0+c2V0X3NpbmtfY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9zdHJlYW1fZGVwYXlfc2V0X3NpbmtfY2Fwcyk7CisgIHBhcnNlX2NsYXNzLT5nZXRfc2lua19jYXBzID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX3N0cmVhbV9kZXBheV9nZXRfc2lua19jYXBzKTsKKyAgcGFyc2VfY2xhc3MtPmhhbmRsZV9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9zdHJlYW1fZGVwYXlfaGFuZGxlX2ZyYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc3RyZWFtX2RlcGF5X2luaXQgKEdzdFJ0cFN0cmVhbURlcGF5ICogc2VsZikKK3sKKyAgZ3N0X2Jhc2VfcGFyc2Vfc2V0X21pbl9mcmFtZV9zaXplIChHU1RfQkFTRV9QQVJTRSAoc2VsZiksIDIpOworCisgIC8qIEZvcmNlIGFjdGl2YXRpb24gaW4gcHVzaCBtb2RlLiBXZSBuZWVkIHRvIGdldCBhIGNhcHMgZXZlbnQgZnJvbSB1cHN0cmVhbQorICAgKiB0byBrbm93IHRoZSBmdWxsIFJUUCBjYXBzLiAqLworICBnc3RfcGFkX3NldF9hY3RpdmF0ZV9mdW5jdGlvbiAoR1NUX0JBU0VfUEFSU0VfU0lOS19QQUQgKHNlbGYpLAorICAgICAgZ3N0X3J0cF9zdHJlYW1fZGVwYXlfc2lua19hY3RpdmF0ZSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9zdHJlYW1fZGVwYXlfc2V0X3NpbmtfY2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RDYXBzICpvdGhlcmNhcHM7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnYm9vbGVhbiByZXQ7CisKKyAgb3RoZXJjYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKG90aGVyY2FwcywgMCk7CisKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRwLXN0cmVhbSIpKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRwIik7CisgIGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRjcC1zdHJlYW0iKSkKKyAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0Y3AiKTsKKyAgZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAoc3RydWN0dXJlLCAiYXBwbGljYXRpb24veC1zcnRwLXN0cmVhbSIpKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtc3J0cCIpOworICBlbHNlCisgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAoc3RydWN0dXJlLCAiYXBwbGljYXRpb24veC1zcnRjcCIpOworCisgIHJldCA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgb3RoZXJjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKG90aGVyY2Fwcyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3J0cF9zdHJlYW1fZGVwYXlfZ2V0X3NpbmtfY2FwcyAoR3N0QmFzZVBhcnNlICogcGFyc2UsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnBlZXJmaWx0ZXIgPSBOVUxMLCAqcGVlcmNhcHMsICp0ZW1wbDsKKyAgR3N0Q2FwcyAqcmVzOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ3VpbnQgaSwgbjsKKworICBpZiAoZmlsdGVyKSB7CisgICAgcGVlcmZpbHRlciA9IGdzdF9jYXBzX2NvcHkgKGZpbHRlcik7CisgICAgbiA9IGdzdF9jYXBzX2dldF9zaXplIChwZWVyZmlsdGVyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChwZWVyZmlsdGVyLCBpKTsKKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRwLXN0cmVhbSIpKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0cCIpOworICAgICAgZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAoc3RydWN0dXJlLCAiYXBwbGljYXRpb24veC1ydGNwLXN0cmVhbSIpKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0Y3AiKTsKKyAgICAgIGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtc3J0cC1zdHJlYW0iKSkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAoc3RydWN0dXJlLCAiYXBwbGljYXRpb24veC1zcnRwIik7CisgICAgICBlbHNlCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtc3J0Y3AiKTsKKyAgICB9CisgIH0KKworICB0ZW1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChHU1RfQkFTRV9QQVJTRV9TSU5LX1BBRCAocGFyc2UpKTsKKyAgcGVlcmNhcHMgPQorICAgICAgZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKEdTVF9CQVNFX1BBUlNFX1NSQ19QQUQgKHBhcnNlKSwgcGVlcmZpbHRlcik7CisKKyAgaWYgKHBlZXJjYXBzKSB7CisgICAgLyogUmVuYW1lIHN0cnVjdHVyZSBuYW1lcyAqLworICAgIHBlZXJjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocGVlcmNhcHMpOworICAgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAocGVlcmNhcHMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHBlZXJjYXBzLCBpKTsKKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRwIikpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRwLXN0cmVhbSIpOworICAgICAgZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAoc3RydWN0dXJlLCAiYXBwbGljYXRpb24veC1ydGNwIikpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRjcC1zdHJlYW0iKTsKKyAgICAgIGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtc3J0cCIpKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXNydHAtc3RyZWFtIik7CisgICAgICBlbHNlCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtc3J0Y3Atc3RyZWFtIik7CisgICAgfQorCisgICAgcmVzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKHBlZXJjYXBzLCB0ZW1wbCwgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworICB9IGVsc2UgeworICAgIHJlcyA9IHRlbXBsOworICB9CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmludGVyc2VjdGlvbjsKKworICAgIGludGVyc2VjdGlvbiA9CisgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHJlcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmVzKTsKKyAgICByZXMgPSBpbnRlcnNlY3Rpb247CisKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmZpbHRlcik7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9zdHJlYW1fZGVwYXlfaGFuZGxlX2ZyYW1lIChHc3RCYXNlUGFyc2UgKiBwYXJzZSwKKyAgICBHc3RCYXNlUGFyc2VGcmFtZSAqIGZyYW1lLCBnaW50ICogc2tpcHNpemUpCit7CisgIGdzaXplIGJ1Zl9zaXplOworICBndWludDE2IHNpemU7CisKKyAgaWYgKGdzdF9idWZmZXJfZXh0cmFjdCAoZnJhbWUtPmJ1ZmZlciwgMCwgJnNpemUsIDIpICE9IDIpCisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworCisgIHNpemUgPSBHVUlOVDE2X0ZST01fQkUgKHNpemUpOworICBidWZfc2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGZyYW1lLT5idWZmZXIpOworCisgIC8qIE5lZWQgbW9yZSBkYXRhICovCisgIGlmIChzaXplICsgMiA+IGJ1Zl9zaXplKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICBmcmFtZS0+b3V0X2J1ZmZlciA9CisgICAgICBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChmcmFtZS0+YnVmZmVyLCBHU1RfQlVGRkVSX0NPUFlfQUxMLCAyLCBzaXplKTsKKworICByZXR1cm4gZ3N0X2Jhc2VfcGFyc2VfZmluaXNoX2ZyYW1lIChwYXJzZSwgZnJhbWUsIHNpemUgKyAyKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3N0cmVhbV9kZXBheV9zaW5rX2FjdGl2YXRlIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCkKK3sKKyAgcmV0dXJuIGdzdF9wYWRfYWN0aXZhdGVfbW9kZSAocGFkLCBHU1RfUEFEX01PREVfUFVTSCwgVFJVRSk7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3N0cmVhbV9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHN0cmVhbWRlcGF5IiwKKyAgICAgIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX1JUUF9TVFJFQU1fREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBzdHJlYW1kZXBheS5oIGIvZ3N0L3J0cC9nc3RydHBzdHJlYW1kZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MDExY2IKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHN0cmVhbWRlcGF5LmgKQEAgLTAsMCArMSw1NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9TVFJFQU1fREVQQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9TVFJFQU1fREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXBhcnNlLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfU1RSRUFNX0RFUEFZIFwKKyAgKGdzdF9ydHBfc3RyZWFtX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfU1RSRUFNX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1NUUkVBTV9ERVBBWSxHc3RSdHBTdHJlYW1EZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfU1RSRUFNX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9TVFJFQU1fREVQQVksR3N0UnRwU3RyZWFtRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfU1RSRUFNX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1NUUkVBTV9ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfU1RSRUFNX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9TVFJFQU1fREVQQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU3RyZWFtRGVwYXkgR3N0UnRwU3RyZWFtRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU3RyZWFtRGVwYXlDbGFzcyBHc3RSdHBTdHJlYW1EZXBheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cFN0cmVhbURlcGF5Cit7CisgIEdzdEJhc2VQYXJzZSBwYXJlbnQ7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cFN0cmVhbURlcGF5Q2xhc3MKK3sKKyAgR3N0QmFzZVBhcnNlQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9zdHJlYW1fZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworZ2Jvb2xlYW4gZ3N0X3J0cF9zdHJlYW1fZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHBzdHJlYW1wYXkuYyBiL2dzdC9ydHAvZ3N0cnRwc3RyZWFtcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4NDhjNAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwc3RyZWFtcGF5LmMKQEAgLTAsMCArMSwyODUgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMyBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cHN0cmVhbXBheQorICoKKyAqIEltcGxlbWVudHMgc3RyZWFtIHBheWxvYWRpbmcgb2YgUlRQIGFuZCBSVENQIHBhY2tldHMgZm9yIGNvbm5lY3Rpb24tb3JpZW50ZWQKKyAqIHRyYW5zcG9ydCBwcm90b2NvbHMgYWNjb3JkaW5nIHRvIFJGQzQ1NzEuCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgYXVkaW90ZXN0c3JjICEgImF1ZGlvL3gtcmF3LHJhdGU9NDgwMDAiICEgdm9yYmlzZW5jICEgcnRwdm9yYmlzcGF5IGNvbmZpZy1pbnRlcnZhbD0xICEgcnRwc3RyZWFtcGF5ICEgdGNwc2VydmVyc2luayBwb3J0PTU2NzgKKyAqIGdzdC1sYXVuY2gtMS4wIHRjcGNsaWVudHNyYyBwb3J0PTU2NzggaG9zdD0xMjcuMC4wLjEgZG8tdGltZXN0YW1wPXRydWUgISAiYXBwbGljYXRpb24veC1ydHAtc3RyZWFtLG1lZGlhPWF1ZGlvLGNsb2NrLXJhdGU9NDgwMDAsZW5jb2RpbmctbmFtZT1WT1JCSVMiICEgcnRwc3RyZWFtZGVwYXkgISBydHB2b3JiaXNkZXBheSAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RydHBzdHJlYW1wYXkuaCIKKworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3J0cF9zdHJlYW1fcGF5X2RlYnVnCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChHU1RfQ0FUX0RFRkFVTFQpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwOyBhcHBsaWNhdGlvbi94LXJ0Y3A7ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtc3J0cDsgYXBwbGljYXRpb24veC1zcnRjcCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cC1zdHJlYW07IGFwcGxpY2F0aW9uL3gtcnRjcC1zdHJlYW07ICIKKyAgICAgICAgImFwcGxpY2F0aW9uL3gtc3J0cC1zdHJlYW07IGFwcGxpY2F0aW9uL3gtc3J0Y3Atc3RyZWFtIikKKyAgICApOworCisjZGVmaW5lIHBhcmVudF9jbGFzcyBnc3RfcnRwX3N0cmVhbV9wYXlfcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBTdHJlYW1QYXksIGdzdF9ydHBfc3RyZWFtX3BheSwgR1NUX1RZUEVfRUxFTUVOVCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3N0cmVhbV9wYXlfc2lua19xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UXVlcnkgKiBxdWVyeSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX3N0cmVhbV9wYXlfc2lua19jaGFpbiAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogaW5idWYpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfc3RyZWFtX3BheV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc3RyZWFtX3BheV9jbGFzc19pbml0IChHc3RSdHBTdHJlYW1QYXlDbGFzcyAqIGtsYXNzKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9ydHBfc3RyZWFtX3BheV9kZWJ1ZywgInJ0cHN0cmVhbXBheSIsIDAsCisgICAgICAiUlRQIHN0cmVhbSBwYXlsb2FkZXIiKTsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBTdHJlYW0gUGF5bG9hZGluZyIsICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yayIsCisgICAgICAiUGF5bG9hZHMgUlRQL1JUQ1AgcGFja2V0cyBmb3Igc3RyZWFtaW5nIHByb3RvY29scyBhY2NvcmRpbmcgdG8gUkZDNDU3MSIsCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3N0cmVhbV9wYXlfaW5pdCAoR3N0UnRwU3RyZWFtUGF5ICogc2VsZikKK3sKKyAgc2VsZi0+c2lua3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua190ZW1wbGF0ZSwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHNlbGYtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9zdHJlYW1fcGF5X3NpbmtfY2hhaW4pKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHNlbGYtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9zdHJlYW1fcGF5X3NpbmtfZXZlbnQpKTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHNlbGYtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9zdHJlYW1fcGF5X3NpbmtfcXVlcnkpKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHNlbGYpLCBzZWxmLT5zaW5rcGFkKTsKKworICBzZWxmLT5zcmNwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNyY190ZW1wbGF0ZSwgInNyYyIpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChzZWxmLT5zcmNwYWQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoc2VsZiksIHNlbGYtPnNyY3BhZCk7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9ydHBfc3RyZWFtX3BheV9zaW5rX2dldF9jYXBzIChHc3RSdHBTdHJlYW1QYXkgKiBzZWxmLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RDYXBzICpwZWVyZmlsdGVyID0gTlVMTCwgKnBlZXJjYXBzLCAqdGVtcGw7CisgIEdzdENhcHMgKnJlczsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGd1aW50IGksIG47CisKKyAgaWYgKGZpbHRlcikgeworICAgIHBlZXJmaWx0ZXIgPSBnc3RfY2Fwc19jb3B5IChmaWx0ZXIpOworICAgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAocGVlcmZpbHRlcik7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAocGVlcmZpbHRlciwgaSk7CisKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0cCIpKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0cC1zdHJlYW0iKTsKKyAgICAgIGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRjcCIpKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0Y3Atc3RyZWFtIik7CisgICAgICBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXNydHAiKSkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAoc3RydWN0dXJlLCAiYXBwbGljYXRpb24veC1zcnRwLXN0cmVhbSIpOworICAgICAgZWxzZQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXNydGNwLXN0cmVhbSIpOworICAgIH0KKyAgfQorCisgIHRlbXBsID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHNlbGYtPnNpbmtwYWQpOworICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChzZWxmLT5zcmNwYWQsIHBlZXJmaWx0ZXIpOworCisgIGlmIChwZWVyY2FwcykgeworICAgIC8qIFJlbmFtZSBzdHJ1Y3R1cmUgbmFtZXMgKi8KKyAgICBwZWVyY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKHBlZXJjYXBzKTsKKyAgICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKHBlZXJjYXBzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChwZWVyY2FwcywgaSk7CisKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0cC1zdHJlYW0iKSkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAoc3RydWN0dXJlLCAiYXBwbGljYXRpb24veC1ydHAiKTsKKyAgICAgIGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRjcC1zdHJlYW0iKSkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAoc3RydWN0dXJlLCAiYXBwbGljYXRpb24veC1ydGNwIik7CisgICAgICBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXNydHAtc3RyZWFtIikpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtc3J0cCIpOworICAgICAgZWxzZQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXNydGNwIik7CisgICAgfQorCisgICAgcmVzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKHBlZXJjYXBzLCB0ZW1wbCwgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworICB9IGVsc2UgeworICAgIHJlcyA9IHRlbXBsOworICB9CisKKyAgaWYgKGZpbHRlcikgeworICAgIEdzdENhcHMgKmludGVyc2VjdGlvbjsKKworICAgIGludGVyc2VjdGlvbiA9CisgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHJlcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmVzKTsKKyAgICByZXMgPSBpbnRlcnNlY3Rpb247CisKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmZpbHRlcik7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfc3RyZWFtX3BheV9zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RSdHBTdHJlYW1QYXkgKnNlbGYgPSBHU1RfUlRQX1NUUkVBTV9QQVkgKHBhcmVudCk7CisgIGdib29sZWFuIHJldDsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiSGFuZGxpbmcgcXVlcnkgb2YgdHlwZSAnJXMnIiwKKyAgICAgIGdzdF9xdWVyeV90eXBlX2dldF9uYW1lIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZjYXBzKTsKKyAgICAgIGNhcHMgPSBnc3RfcnRwX3N0cmVhbV9wYXlfc2lua19nZXRfY2FwcyAoc2VsZiwgY2Fwcyk7CisgICAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfc3RyZWFtX3BheV9zaW5rX3NldF9jYXBzIChHc3RSdHBTdHJlYW1QYXkgKiBzZWxmLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0Q2FwcyAqb3RoZXJjYXBzOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIG90aGVyY2FwcyA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChvdGhlcmNhcHMsIDApOworCisgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0cCIpKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtcnRwLXN0cmVhbSIpOworICBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0Y3AiKSkKKyAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzdHJ1Y3R1cmUsICJhcHBsaWNhdGlvbi94LXJ0Y3Atc3RyZWFtIik7CisgIGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtc3J0cCIpKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtc3J0cC1zdHJlYW0iKTsKKyAgZWxzZQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHN0cnVjdHVyZSwgImFwcGxpY2F0aW9uL3gtc3J0Y3Atc3RyZWFtIik7CisKKyAgcmV0ID0gZ3N0X3BhZF9zZXRfY2FwcyAoc2VsZi0+c3JjcGFkLCBvdGhlcmNhcHMpOworICBnc3RfY2Fwc191bnJlZiAob3RoZXJjYXBzKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfc3RyZWFtX3BheV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBTdHJlYW1QYXkgKnNlbGYgPSBHU1RfUlRQX1NUUkVBTV9QQVkgKHBhcmVudCk7CisgIGdib29sZWFuIHJldDsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiR290ICVzIGV2ZW50IiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChldmVudCwgJmNhcHMpOworICAgICAgcmV0ID0gZ3N0X3J0cF9zdHJlYW1fcGF5X3Npbmtfc2V0X2NhcHMgKHNlbGYsIGNhcHMpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfc3RyZWFtX3BheV9zaW5rX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBpbmJ1ZikKK3sKKyAgR3N0UnRwU3RyZWFtUGF5ICpzZWxmID0gR1NUX1JUUF9TVFJFQU1fUEFZIChwYXJlbnQpOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgZ3NpemUgc2l6ZTsKKyAgZ3VpbnQ4IHNpemUxNlsyXTsKKworICBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoaW5idWYpOworICBpZiAoc2l6ZSA+IEdfTUFYVUlOVDE2KSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNlbGYsIENPUkUsIEZBSUxFRCwgKE5VTEwpLAorICAgICAgICAoIk9ubHkgYnVmZmVycyB1cCB0byAlZCBieXRlcyBzdXBwb3J0ZWQsIGdvdCAlIiBHX0dTSVpFX0ZPUk1BVCwKKyAgICAgICAgICAgIEdfTUFYVUlOVDE2LCBzaXplKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoaW5idWYpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMik7CisKKyAgR1NUX1dSSVRFX1VJTlQxNl9CRSAoc2l6ZTE2LCBzaXplKTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChvdXRidWYsIDAsIHNpemUxNiwgMik7CisKKyAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKG91dGJ1ZiwgaW5idWYsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIDAsIC0xKTsKKworICBnc3RfYnVmZmVyX3VucmVmIChpbmJ1Zik7CisKKyAgcmV0dXJuIGdzdF9wYWRfcHVzaCAoc2VsZi0+c3JjcGFkLCBvdXRidWYpOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9zdHJlYW1fcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwc3RyZWFtcGF5IiwKKyAgICAgIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX1JUUF9TVFJFQU1fUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwc3RyZWFtcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHN0cmVhbXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NDM2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHN0cmVhbXBheS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIAorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworIAorI2lmbmRlZiBfX0dTVF9SVFBfU1RSRUFNX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1NUUkVBTV9QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfU1RSRUFNX1BBWSAgICAgICAgICAgIChnc3RfcnRwX3N0cmVhbV9wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9TVFJFQU1fUEFZKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1NUUkVBTV9QQVksR3N0UnRwU3RyZWFtUGF5KSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9TVFJFQU1fUEFZKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1NUUkVBTV9QQVkpKQorI2RlZmluZSBHU1RfUlRQX1NUUkVBTV9QQVlfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpICxHU1RfVFlQRV9SVFBfU1RSRUFNX1BBWSxHc3RSdHBTdHJlYW1QYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfU1RSRUFNX1BBWV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcykgLEdTVF9UWVBFX1JUUF9TVFJFQU1fUEFZKSkKKyNkZWZpbmUgR1NUX1JUUF9TVFJFQU1fUEFZX0dFVF9DTEFTUyhvYmopICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUygob2JqKSAsR1NUX1RZUEVfUlRQX1NUUkVBTV9QQVksR3N0UnRwU3RyZWFtUGF5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU3RyZWFtUGF5ICAgICAgR3N0UnRwU3RyZWFtUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFN0cmVhbVBheUNsYXNzIEdzdFJ0cFN0cmVhbVBheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cFN0cmVhbVBheSB7CisgIEdzdEVsZW1lbnQgcGFyZW50OworCisgIEdzdFBhZCAqc3JjcGFkLCAqc2lua3BhZDsKK307CisKK3N0cnVjdCBfR3N0UnRwU3RyZWFtUGF5Q2xhc3MgeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9zdHJlYW1fcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9zdHJlYW1fcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX1NUUkVBTV9QQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDA5MWMyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHBzdjN2ZGVwYXkuYwpAQCAtMCwwICsxLDMyMiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgImdzdHJ0cHN2M3ZkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWSAocnRwc3YzdmRlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHJ0cHN2M3ZkZXBheV9kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9zdjN2X2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1zdnEsICIgInN2cXZlcnNpb24gPSAoaW50KSAzIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9zdjN2X2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSB7IFwiWC1TVjNWLUVTXCIsIFwiWC1TT1JFTlNPTi1WSURFT1wiICwgXCJYLVNPUkVOU09OVklERU9cIiAsIFwiWC1Tb3JlbnNvblZpZGVvXCIgfSIpCisgICAgKTsKKworI2RlZmluZSBnc3RfcnRwX3N2M3ZfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwU1YzVkRlcGF5LCBnc3RfcnRwX3N2M3ZfZGVwYXksCisgICAgR1NUX1RZUEVfUlRQX0JBU0VfREVQQVlMT0FEKTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9zdjN2X2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfc3Yzdl9kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKgorICAgIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX3N2M3ZfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHApOworZ2Jvb2xlYW4gZ3N0X3J0cF9zdjN2X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBmaWx0ZXIsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zdjN2X2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cFNWM1ZEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX3N2M3ZfZGVwYXlfcHJvY2VzczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX3N2M3ZfZGVwYXlfc2V0Y2FwczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfc3Yzdl9kZXBheV9maW5hbGl6ZTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX3N2M3ZfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfc3Yzdl9kZXBheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3N2M3ZfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgU1ZRMyBkZXBheWxvYWRlciIsICJDb2RlYy9EZXBheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiRXh0cmFjdHMgU1ZRMyB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChubyBSRkMpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zdjN2X2RlcGF5X2luaXQgKEdzdFJ0cFNWM1ZEZXBheSAqIHJ0cHN2M3ZkZXBheSkKK3sKKyAgcnRwc3YzdmRlcGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zdjN2X2RlcGF5X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSdHBTVjNWRGVwYXkgKnJ0cHN2M3ZkZXBheTsKKworICBydHBzdjN2ZGVwYXkgPSBHU1RfUlRQX1NWM1ZfREVQQVkgKG9iamVjdCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cHN2M3ZkZXBheS0+YWRhcHRlcik7CisgIHJ0cHN2M3ZkZXBheS0+YWRhcHRlciA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCisvKiBvbmx5IG9uIHRoZSBzaW5rICovCitnYm9vbGVhbgorZ3N0X3J0cF9zdjN2X2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBmaWx0ZXIsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBnaW50IGNsb2NrX3JhdGU7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDkwMDAwOyAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgZmlsdGVyLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICAvKiB3aWxsIHNldCBjYXBzIGxhdGVyICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF9zdjN2X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdFJUUEJ1ZmZlciAqIHJ0cCkKK3sKKyAgR3N0UnRwU1YzVkRlcGF5ICpydHBzdjN2ZGVwYXk7CisgIHN0YXRpYyBzdHJ1Y3QKKyAgeworICAgIGd1aW50IHdpZHRoLCBoZWlnaHQ7CisgIH0gcmVzb2x1dGlvbnNbN10gPSB7CisgICAgeworICAgIDE2MCwgMTI4fSwgeworICAgIDEyOCwgOTZ9LCB7CisgICAgMTc2LCAxNDR9LCB7CisgICAgMzUyLCAyODh9LCB7CisgICAgNzA0LCA1NzZ9LCB7CisgICAgMjQwLCAxODB9LCB7CisgICAgMzIwLCAyNDB9CisgIH07CisgIGdpbnQgcGF5bG9hZF9sZW47CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgZ2Jvb2xlYW4gTTsKKyAgZ2Jvb2xlYW4gQywgUywgRTsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBndWludDE2IHNlcTsKKworICBydHBzdjN2ZGVwYXkgPSBHU1RfUlRQX1NWM1ZfREVQQVkgKGRlcGF5bG9hZCk7CisKKworICAvKiBmbHVzaCBvbiBzZXF1ZW5jZSBudW1iZXIgZ2FwcyAqLworICBzZXEgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxIChydHApOworCisgIEdTVF9ERUJVRyAoInRpbWVzdGFtcCAlIiBHU1RfVElNRV9GT1JNQVQgIiwgc2VxdWVuY2UgbnVtYmVyOiVkIiwKKyAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfUFRTIChydHAtPmJ1ZmZlcikpLCBzZXEpOworCisgIGlmIChzZXEgIT0gcnRwc3YzdmRlcGF5LT5uZXh0c2VxKSB7CisgICAgR1NUX0RFQlVHICgiU2VxdWVuY2UgZGlzY29udGludWl0eSwgY2xlYXJpbmcgYWRhcHRlciIpOworICAgIGdzdF9hZGFwdGVyX2NsZWFyIChydHBzdjN2ZGVwYXktPmFkYXB0ZXIpOworICB9CisgIHJ0cHN2M3ZkZXBheS0+bmV4dHNlcSA9IHNlcSArIDE7CisKKyAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisgIGlmIChwYXlsb2FkX2xlbiA8IDMpCisgICAgZ290byBiYWRfcGFja2V0OworCisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAocnRwKTsKKworICBNID0gZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAocnRwKTsKKworICAvKiBUaGlzIGlzIGFsbCBhIGd1ZXNzOgorICAgKiAgICAgICAgICAgICAgICAgICAgICAxIDEgMSAxIDEgMQorICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSAKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIHwwfEN8U3xFfDB8MHwwfDB8MHwwfDB8MHwwfDB8MHwwfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICoKKyAgICogQzogY29uZmlnLCBwYWNrZXQgY29udGFpbnMgY29uZmlnIGluZm8KKyAgICogUzogc3RhcnQsIHBhY2tldCBjb250YWlucyBzdGFydCBvZiBmcmFtZQorICAgKiBFOiBlbmQsIHBhY2tldCBjb250YWlucyBlbmQgb2YgZnJhbWUKKyAgICovCisgIC8qIHRoaXMgc2VlbXMgdG8gaW5kaWNhdGUgYSBwYWNrZXQgd2l0aCBhIGNvbmZpZyBzdHJpbmcgc2VudCBiZWZvcmUgZWFjaAorICAgKiBrZXlmcmFtZSAqLworICBDID0gKHBheWxvYWRbMF0gJiAweDQwKSA9PSAweDQwOworCisgIC8qIHJlZHVuZGFudCB3aXRoIHRoZSBSVFAgbWFya2VyIGJpdCAqLworICBTID0gKHBheWxvYWRbMF0gJiAweDIwKSA9PSAweDIwOworICBFID0gKHBheWxvYWRbMF0gJiAweDEwKSA9PSAweDEwOworCisgIEdTVF9ERUJVRyAoIk06JWQsIEM6JWQsIFM6JWQsIEU6JWQiLCBNLCBDLCBTLCBFKTsKKworICBHU1RfTUVNRFVNUCAoImluY29taW5nIGJ1ZmZlciIsIHBheWxvYWQsIHBheWxvYWRfbGVuKTsKKworICBpZiAoR19VTkxJS0VMWSAoQykpIHsKKyAgICBHc3RDYXBzICpjYXBzOworICAgIEdzdEJ1ZmZlciAqY29kZWNfZGF0YTsKKyAgICBHc3RNYXBJbmZvIGNtYXA7CisgICAgZ3VpbnQ4IHJlczsKKworICAgIEdTVF9ERUJVRyAoIkNvbmZpZ3VyYXRpb24gcGFja2V0Iik7CisKKyAgICAvKiBpZiB3ZSBhbHJlYWR5IGhhdmUgY2Fwcywgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gRklYTUUsIGNoZWNrIGlmCisgICAgICogc29tZXRoaW5nIGNoYW5nZWQuICovCisgICAgaWYgKEdfVU5MSUtFTFkgKGdzdF9wYWRfaGFzX2N1cnJlbnRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQKKyAgICAgICAgICAgICAgICAoZGVwYXlsb2FkKSkpKSB7CisgICAgICBHU1RfREVCVUcgKCJBbHJlYWR5IGNvbmZpZ3VyZWQsIHNraXBwaW5nIGNvbmZpZyBwYXJzaW5nIik7CisgICAgICBnb3RvIGJlYWNoOworICAgIH0KKworICAgIHJlcyA9IHBheWxvYWRbMl0gPj4gNTsKKworICAgIC8qIHdpZHRoIGFuZCBoZWlnaHQsIGFjY29yZGluZyB0byBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1Tb3JlbnNvbl9WaWRlb18xI1N0cmVhbV9Gb3JtYXRfQW5kX0hlYWRlciAqLworICAgIGlmIChHX0xJS0VMWSAocmVzIDwgNykpIHsKKyAgICAgIHJ0cHN2M3ZkZXBheS0+d2lkdGggPSByZXNvbHV0aW9uc1tyZXNdLndpZHRoOworICAgICAgcnRwc3YzdmRlcGF5LT5oZWlnaHQgPSByZXNvbHV0aW9uc1tyZXNdLmhlaWdodDsKKyAgICB9IGVsc2UgeworICAgICAgLyogZXh0ZW5kZWQgd2lkdGgvaGVpZ2h0LCB0aGV5J3JlIGNvbnRhaW5lZCBpbiB0aGUgZm9sbG93aW5nIDI0Yml0ICovCisgICAgICBydHBzdjN2ZGVwYXktPndpZHRoID0gKChwYXlsb2FkWzJdICYgMHgxZikgPDwgNykgfCAocGF5bG9hZFszXSA+PiAxKTsKKyAgICAgIHJ0cHN2M3ZkZXBheS0+aGVpZ2h0ID0KKyAgICAgICAgICAocGF5bG9hZFszXSAmIDB4MSkgPDwgMTEgfCBwYXlsb2FkWzRdIDw8IDMgfCAocGF5bG9hZFs1XSA+PiA1KTsKKyAgICB9CisKKyAgICAvKiBDb2RlY0RhdGEgbmVlZHMgdG8gYmUgJ1NFUUgnICsgbGVuICgzMmJpdCkgKyBkYXRhIGFjY29yZGluZyB0bworICAgICAqIGZmbXBlZydzIGxpYmF2Y29kZWMvc3ZxMy5jOnN2cTNfZGVjb2RlX2luaXQgKi8KKyAgICBjb2RlY19kYXRhID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChwYXlsb2FkX2xlbiArIDYpOworICAgIGdzdF9idWZmZXJfbWFwIChjb2RlY19kYXRhLCAmY21hcCwgR1NUX01BUF9XUklURSk7CisgICAgbWVtY3B5IChjbWFwLmRhdGEsICJTRVFIIiwgNCk7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoY21hcC5kYXRhICsgNCwgcGF5bG9hZF9sZW4gLSAyKTsKKyAgICBtZW1jcHkgKGNtYXAuZGF0YSArIDgsIHBheWxvYWQgKyAyLCBwYXlsb2FkX2xlbiAtIDIpOworICAgIEdTVF9NRU1EVU1QICgiY29kZWNfZGF0YSIsIGNtYXAuZGF0YSwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoY29kZWNfZGF0YSkpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGNvZGVjX2RhdGEsICZjbWFwKTsKKworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1zdnEiLAorICAgICAgICAic3ZxdmVyc2lvbiIsIEdfVFlQRV9JTlQsIDMsCisgICAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHJ0cHN2M3ZkZXBheS0+d2lkdGgsCisgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBydHBzdjN2ZGVwYXktPmhlaWdodCwKKyAgICAgICAgImNvZGVjX2RhdGEiLCBHU1RfVFlQRV9CVUZGRVIsIGNvZGVjX2RhdGEsIE5VTEwpOworICAgIGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICBHU1RfREVCVUcgKCJEZXBheWxvYWRlciBub3cgY29uZmlndXJlZCIpOworCisgICAgcnRwc3YzdmRlcGF5LT5jb25maWd1cmVkID0gVFJVRTsKKworICAgIGdvdG8gYmVhY2g7CisgIH0KKworICBpZiAoR19MSUtFTFkgKHJ0cHN2M3ZkZXBheS0+Y29uZmlndXJlZCkpIHsKKyAgICBHc3RCdWZmZXIgKnRtcGJ1ZjsKKworICAgIEdTVF9ERUJVRyAoIlN0b3JpbmcgaW5jb21pbmcgcGF5bG9hZCIpOworICAgIC8qIHN0b3JlIGRhdGEgaW4gYWRhcHRlciwgc3RpcCBvZmYgMiBieXRlcyBoZWFkZXIgKi8KKyAgICB0bXBidWYgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwgMiwgLTEpOworICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cHN2M3ZkZXBheS0+YWRhcHRlciwgdG1wYnVmKTsKKworICAgIGlmIChHX1VOTElLRUxZIChNKSkgeworICAgICAgLyogZnJhbWUgaXMgY29tcGxldGVkOiBwdXNoIGNvbnRlbnRzIG9mIGFkYXB0ZXIgKi8KKyAgICAgIGd1aW50IGF2YWlsOworCisgICAgICBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAocnRwc3YzdmRlcGF5LT5hZGFwdGVyKTsKKyAgICAgIEdTVF9ERUJVRyAoIlJldHVybmluZyBjb21wbGV0ZWQgb3V0cHV0IGJ1ZmZlciBbJWQgYnl0ZXNdIiwgYXZhaWwpOworICAgICAgb3V0YnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHJ0cHN2M3ZkZXBheS0+YWRhcHRlciwgYXZhaWwpOworICAgICAgZ3N0X3J0cF9kcm9wX25vbl92aWRlb19tZXRhIChydHBzdjN2ZGVwYXksIG91dGJ1Zik7CisgICAgfQorICB9CisKK2JlYWNoOgorICByZXR1cm4gb3V0YnVmOworCisgIC8qIEVSUk9SUyAqLworYmFkX3BhY2tldDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cHN2M3ZkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJQYWNrZXQgd2FzIHRvbyBzaG9ydCIpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfc3Yzdl9kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cFNWM1ZEZXBheSAqcnRwc3YzdmRlcGF5OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwc3YzdmRlcGF5ID0gR1NUX1JUUF9TVjNWX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfYWRhcHRlcl9jbGVhciAocnRwc3YzdmRlcGF5LT5hZGFwdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3N2M3ZfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cHN2M3ZkZXBheV9kZWJ1ZywgInJ0cHN2M3ZkZXBheSIsIDAsCisgICAgICAiUlRQIFNWM1YgZGVwYXlsb2FkZXIiKTsKKworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHN2M3ZkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9TVjNWX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwc3YzdmRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyODY4NGEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHN2M3ZkZXBheS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9TVjNWX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfU1YzVl9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfU1YzVl9ERVBBWSBcCisgIChnc3RfcnRwX3N2M3ZfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9TVjNWX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1NWM1ZfREVQQVksR3N0UnRwU1YzVkRlcGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9TVjNWX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9TVjNWX0RFUEFZLEdzdFJ0cFNWM1ZEZXBheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9TVjNWX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1NWM1ZfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX1NWM1ZfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX1NWM1ZfREVQQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU1YzVkRlcGF5IEdzdFJ0cFNWM1ZEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBTVjNWRGVwYXlDbGFzcyBHc3RSdHBTVjNWRGVwYXlDbGFzczsKKworc3RydWN0IF9Hc3RSdHBTVjNWRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBkZXBheWxvYWQ7CisKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKworICBnYm9vbGVhbiBjb25maWd1cmVkOworICAKKyAgZ3VpbnQxNiBuZXh0c2VxOworICBndWludCB3aWR0aDsKKyAgZ3VpbnQgaGVpZ2h0OworfTsKKworc3RydWN0IF9Hc3RSdHBTVjNWRGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3J0cF9zdjN2X2RlcGF5X2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3J0cF9zdjN2X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX1NWM1ZfREVQQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHRoZW9yYWRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRjNTBjZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuYwpAQCAtMCwwICsxLDcwNyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L3RhZy90YWcuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0cnRwdGhlb3JhZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHB0aGVvcmFkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwdGhlb3JhZGVwYXlfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3RoZW9yYV9kZXBheV9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJUSEVPUkFcIiIKKyAgICAgICAgLyogQWxsIHJlcXVpcmVkIHBhcmFtZXRlcnMgCisgICAgICAgICAqCisgICAgICAgICAqICJzYW1wbGluZyA9IChzdHJpbmcpIHsgIllDYkNyLTQ6MjowIiwgIllDYkNyLTQ6MjoyIiwgIllDYkNyLTQ6NDo0IiB9ICIKKyAgICAgICAgICogIndpZHRoID0gKHN0cmluZykgWzEsIDEwNDg1NjFdIChtdWx0aXBsZXMgb2YgMTYpICIKKyAgICAgICAgICogImhlaWdodCA9IChzdHJpbmcpIFsxLCAxMDQ4NTYxXSAobXVsdGlwbGVzIG9mIDE2KSAiCisgICAgICAgICAqICJkZWxpdmVyeS1tZXRob2QgPSAoc3RyaW5nKSB7IGlubGluZSwgaW5fYmFuZCwgb3V0X2JhbmQvPHNwZWNpZmljX25hbWU+IH0gIiAKKyAgICAgICAgICogImNvbmZpZ3VyYXRpb24gPSAoc3RyaW5nKSBBTlkiIAorICAgICAgICAgKi8KKyAgICAgICAgLyogQWxsIG9wdGlvbmFsIHBhcmFtZXRlcnMKKyAgICAgICAgICoKKyAgICAgICAgICogImNvbmZpZ3VyYXRpb24tdXJpID0iIAorICAgICAgICAgKi8KKyAgICApCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfdGhlb3JhX2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC10aGVvcmEiKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF90aGVvcmFfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwVGhlb3JhRGVwYXksIGdzdF9ydHBfdGhlb3JhX2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3RoZW9yYV9kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfdGhlb3JhX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3RoZW9yYV9kZXBheV9wYWNrZXRfbG9zdCAoR3N0UlRQQmFzZURlcGF5bG9hZCAqCisgICAgZGVwYXlsb2FkLCBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF90aGVvcmFfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF90aGVvcmFfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdGhlb3JhX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cFRoZW9yYURlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF90aGVvcmFfZGVwYXlfZmluYWxpemU7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF90aGVvcmFfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfdGhlb3JhX2RlcGF5X3Byb2Nlc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF90aGVvcmFfZGVwYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzcy0+cGFja2V0X2xvc3QgPSBnc3RfcnRwX3RoZW9yYV9kZXBheV9wYWNrZXRfbG9zdDsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3RoZW9yYV9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF90aGVvcmFfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBUaGVvcmEgZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIFRoZW9yYSB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChkcmFmdC0wMSBvZiBSRkMgWFhYWCkiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cHRoZW9yYWRlcGF5X2RlYnVnLCAicnRwdGhlb3JhZGVwYXkiLCAwLAorICAgICAgIlRoZW9yYSBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdGhlb3JhX2RlcGF5X2luaXQgKEdzdFJ0cFRoZW9yYURlcGF5ICogcnRwdGhlb3JhZGVwYXkpCit7CisgIHJ0cHRoZW9yYWRlcGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9jb25maWcgKEdzdFJ0cFRoZW9yYUNvbmZpZyAqIGNvbmZpZykKK3sKKyAgZ19saXN0X2ZyZWVfZnVsbCAoY29uZmlnLT5oZWFkZXJzLCAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9idWZmZXJfdW5yZWYpOworICBnX2ZyZWUgKGNvbmZpZyk7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2luZGVudHMgKEdzdFJ0cFRoZW9yYURlcGF5ICogcnRwdGhlb3JhZGVwYXkpCit7CisgIGdfbGlzdF9mcmVlX2Z1bGwgKHJ0cHRoZW9yYWRlcGF5LT5jb25maWdzLCAoR0Rlc3Ryb3lOb3RpZnkpIGZyZWVfY29uZmlnKTsKKyAgcnRwdGhlb3JhZGVwYXktPmNvbmZpZ3MgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF90aGVvcmFfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cFRoZW9yYURlcGF5ICpydHB0aGVvcmFkZXBheSA9IEdTVF9SVFBfVEhFT1JBX0RFUEFZIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChydHB0aGVvcmFkZXBheS0+YWRhcHRlcik7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdGhlb3JhX2RlcGF5X3BhcnNlX2NvbmZpZ3VyYXRpb24gKEdzdFJ0cFRoZW9yYURlcGF5ICogcnRwdGhlb3JhZGVwYXksCisgICAgR3N0QnVmZmVyICogY29uZmJ1ZikKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIGd1aW50MzIgbnVtX2hlYWRlcnM7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmRhdGE7CisgIGdzaXplIHNpemU7CisgIGdpbnQgaSwgajsKKworICBnc3RfYnVmZmVyX21hcCAoY29uZmJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBzaXplID0gbWFwLnNpemU7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwdGhlb3JhZGVwYXksICJjb25maWcgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCwgc2l6ZSk7CisKKyAgLyogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBwYWNrZWQgaGVhZGVycyAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2VkIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2VkIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICovCisgIGlmIChzaXplIDwgNCkKKyAgICBnb3RvIHRvb19zbWFsbDsKKworICBudW1faGVhZGVycyA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoZGF0YSk7CisgIHNpemUgLT0gNDsKKyAgZGF0YSArPSA0OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHRoZW9yYWRlcGF5LCAiaGF2ZSAldSBoZWFkZXJzIiwgbnVtX2hlYWRlcnMpOworCisgIC8qICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICBJZGVudCAgICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgIHwgbi4gb2YgaGVhZGVycyB8ICAgIGxlbmd0aDEgICAgfCAgICBsZW5ndGgyICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgIHwgICAgICAgICAgICAgSWRlbnRpZmljYXRpb24gSGVhZGVyICAgICAgICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgIHwgICAgICAgICBDb21tZW50IEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50IEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dXAgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgICAgICAgICAgICAgU2V0dXAgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1faGVhZGVyczsgaSsrKSB7CisgICAgZ3VpbnQzMiBpZGVudDsKKyAgICBndWludDE2IGxlbmd0aDsKKyAgICBndWludDggbl9oZWFkZXJzLCBiOworICAgIEdzdFJ0cFRoZW9yYUNvbmZpZyAqY29uZjsKKyAgICBndWludCAqaF9zaXplczsKKyAgICBndWludCBleHRyYSA9IDE7CisKKyAgICBpZiAoc2l6ZSA8IDYpCisgICAgICBnb3RvIHRvb19zbWFsbDsKKworICAgIGlkZW50ID0gKGRhdGFbMF0gPDwgMTYpIHwgKGRhdGFbMV0gPDwgOCkgfCBkYXRhWzJdOworICAgIGxlbmd0aCA9IChkYXRhWzNdIDw8IDgpIHwgZGF0YVs0XTsKKyAgICBuX2hlYWRlcnMgPSBkYXRhWzVdOworICAgIHNpemUgLT0gNjsKKyAgICBkYXRhICs9IDY7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHB0aGVvcmFkZXBheSwKKyAgICAgICAgImhlYWRlciAlZCwgaWRlbnQgMHglMDh4LCBsZW5ndGggJXUsIGxlZnQgJSIgR19HU0laRV9GT1JNQVQsIGksIGlkZW50LAorICAgICAgICBsZW5ndGgsIHNpemUpOworCisgICAgLyogRklYTUUgY2hlY2sgaWYgd2UgYWxyZWFkeSBnb3QgdGhpcyBpZGVudCAqLworCisgICAgLyogbGVuZ3RoIG1pZ2h0IGFsc28gaW5jbHVkZSBjb3VudCBvZiBmb2xsb3dpbmcgc2l6ZSBmaWVsZHMgKi8KKyAgICBpZiAoc2l6ZSA8IGxlbmd0aCAmJiBzaXplICsgMSAhPSBsZW5ndGgpCisgICAgICBnb3RvIHRvb19zbWFsbDsKKworICAgIC8qIHJlYWQgaGVhZGVyIHNpemVzIHdlIHJlYWQgMiBzaXplcywgdGhlIHRoaXJkIHNpemUgKGZvciB3aGljaCB3ZSBhbGxvY2F0ZQorICAgICAqIHNwYWNlKSBtdXN0IGJlIGRlcml2ZWQgZnJvbSB0aGUgdG90YWwgcGFja2VkIGhlYWRlciBsZW5ndGguICovCisgICAgaF9zaXplcyA9IGdfbmV3YSAoZ3VpbnQsIG5faGVhZGVycyArIDEpOworICAgIGZvciAoaiA9IDA7IGogPCBuX2hlYWRlcnM7IGorKykgeworICAgICAgZ3VpbnQgaF9zaXplOworCisgICAgICBoX3NpemUgPSAwOworICAgICAgZG8geworICAgICAgICBpZiAoc2l6ZSA8IDEpCisgICAgICAgICAgZ290byB0b29fc21hbGw7CisgICAgICAgIGIgPSAqZGF0YSsrOworICAgICAgICBzaXplLS07CisgICAgICAgIGV4dHJhKys7CisgICAgICAgIGhfc2l6ZSA9IChoX3NpemUgPDwgNykgfCAoYiAmIDB4N2YpOworICAgICAgfSB3aGlsZSAoYiAmIDB4ODApOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwdGhlb3JhZGVwYXksICJoZWFkZXJzICVkOiBzaXplOiAldSIsIGosIGhfc2l6ZSk7CisgICAgICBoX3NpemVzW2pdID0gaF9zaXplOworICAgICAgbGVuZ3RoIC09IGhfc2l6ZTsKKyAgICB9CisgICAgLyogbGFzdCBoZWFkZXIgbGVuZ3RoIGlzIHRoZSByZW1haW5pbmcgc3BhY2UgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHB0aGVvcmFkZXBheSwgImxhc3QgaGVhZGVyIHNpemU6ICV1IiwgbGVuZ3RoKTsKKyAgICBoX3NpemVzW2pdID0gbGVuZ3RoOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwdGhlb3JhZGVwYXksICJwcmVwYXJpbmcgaGVhZGVycyIpOworICAgIGNvbmYgPSBnX25ldzAgKEdzdFJ0cFRoZW9yYUNvbmZpZywgMSk7CisgICAgY29uZi0+aWRlbnQgPSBpZGVudDsKKworICAgIGZvciAoaiA9IDA7IGogPD0gbl9oZWFkZXJzOyBqKyspIHsKKyAgICAgIGd1aW50IGhfc2l6ZTsKKworICAgICAgaF9zaXplID0gaF9zaXplc1tqXTsKKyAgICAgIGlmIChzaXplIDwgaF9zaXplKSB7CisgICAgICAgIGlmIChqICE9IG5faGVhZGVycyB8fCBzaXplICsgZXh0cmEgIT0gaF9zaXplKSB7CisgICAgICAgICAgZnJlZV9jb25maWcgKGNvbmYpOworICAgICAgICAgIGdvdG8gdG9vX3NtYWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIG90aGVyd2lzZSBtZWFucyB0aGF0IG92ZXJhbGwgbGVuZ3RoIGZpZWxkIGNvbnRhaW5lZCB0b3RhbCBsZW5ndGgsCisgICAgICAgICAgICogaW5jbHVkaW5nIGV4dHJhIGZpZWxkcyAqLworICAgICAgICAgIGhfc2l6ZSAtPSBleHRyYTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHB0aGVvcmFkZXBheSwgInJlYWRpbmcgaGVhZGVyICVkLCBzaXplICV1IiwgaiwKKyAgICAgICAgICBoX3NpemUpOworCisgICAgICBidWYgPQorICAgICAgICAgIGdzdF9idWZmZXJfY29weV9yZWdpb24gKGNvbmZidWYsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIGRhdGEgLSBtYXAuZGF0YSwKKyAgICAgICAgICBoX3NpemUpOworICAgICAgY29uZi0+aGVhZGVycyA9IGdfbGlzdF9hcHBlbmQgKGNvbmYtPmhlYWRlcnMsIGJ1Zik7CisgICAgICBkYXRhICs9IGhfc2l6ZTsKKyAgICAgIHNpemUgLT0gaF9zaXplOworICAgIH0KKyAgICBydHB0aGVvcmFkZXBheS0+Y29uZmlncyA9IGdfbGlzdF9hcHBlbmQgKHJ0cHRoZW9yYWRlcGF5LT5jb25maWdzLCBjb25mKTsKKyAgfQorCisgIGdzdF9idWZmZXJfdW5tYXAgKGNvbmZidWYsICZtYXApOworICBnc3RfYnVmZmVyX3VucmVmIChjb25mYnVmKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3Rvb19zbWFsbDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHRoZW9yYWRlcGF5LCAiY29uZmlndXJhdGlvbiB0b28gc21hbGwiKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChjb25mYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChjb25mYnVmKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3RoZW9yYV9kZXBheV9wYXJzZV9pbmJhbmRfY29uZmlndXJhdGlvbiAoR3N0UnRwVGhlb3JhRGVwYXkgKgorICAgIHJ0cHRoZW9yYWRlcGF5LCBndWludCBpZGVudCwgZ3VpbnQ4ICogY29uZmlndXJhdGlvbiwgZ3VpbnQgc2l6ZSwKKyAgICBndWludCBsZW5ndGgpCit7CisgIEdzdEJ1ZmZlciAqY29uZmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHNpemUgPCA0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogdHJhbnNmb3JtIGlubGluZSB0byBvdXQtb2YtYmFuZCBhbmQgcGFyc2UgdGhhdCBvbmUgKi8KKyAgY29uZmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZSArIDkpOworICBnc3RfYnVmZmVyX21hcCAoY29uZmJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIC8qIDEgaGVhZGVyICovCisgIEdTVF9XUklURV9VSU5UMzJfQkUgKG1hcC5kYXRhLCAxKTsKKyAgLyogd3JpdGUgSWRlbnQgKi8KKyAgR1NUX1dSSVRFX1VJTlQyNF9CRSAobWFwLmRhdGEgKyA0LCBpZGVudCk7CisgIC8qIHdyaXRlIHNvcnQtb2YtbGVuZ3RoICovCisgIEdTVF9XUklURV9VSU5UMTZfQkUgKG1hcC5kYXRhICsgNywgbGVuZ3RoKTsKKyAgLyogY29weSByZW1haW5kZXIgKi8KKyAgbWVtY3B5IChtYXAuZGF0YSArIDksIGNvbmZpZ3VyYXRpb24sIHNpemUpOworICBnc3RfYnVmZmVyX3VubWFwIChjb25mYnVmLCAmbWFwKTsKKworICByZXR1cm4gZ3N0X3J0cF90aGVvcmFfZGVwYXlfcGFyc2VfY29uZmlndXJhdGlvbiAocnRwdGhlb3JhZGVwYXksIGNvbmZidWYpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdGhlb3JhX2RlcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgR3N0UnRwVGhlb3JhRGVwYXkgKnJ0cHRoZW9yYWRlcGF5OworICBHc3RDYXBzICpzcmNjYXBzOworICBjb25zdCBnY2hhciAqY29uZmlndXJhdGlvbjsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHJ0cHRoZW9yYWRlcGF5ID0gR1NUX1JUUF9USEVPUkFfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgcnRwdGhlb3JhZGVwYXktPm5lZWRzX2tleWZyYW1lID0gRkFMU0U7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgLyogcmVhZCBhbmQgcGFyc2UgY29uZmlndXJhdGlvbiBzdHJpbmcgKi8KKyAgY29uZmlndXJhdGlvbiA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiY29uZmlndXJhdGlvbiIpOworICBpZiAoY29uZmlndXJhdGlvbikgeworICAgIEdzdEJ1ZmZlciAqY29uZmJ1ZjsKKyAgICBndWludDggKmRhdGE7CisgICAgZ3NpemUgc2l6ZTsKKworICAgIC8qIGRlc2VyaWFsaXplIGJhc2U2NCB0byBidWZmZXIgKi8KKyAgICBkYXRhID0gZ19iYXNlNjRfZGVjb2RlIChjb25maWd1cmF0aW9uLCAmc2l6ZSk7CisKKyAgICBjb25mYnVmID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgICAgZ3N0X2J1ZmZlcl9hcHBlbmRfbWVtb3J5IChjb25mYnVmLAorICAgICAgICBnc3RfbWVtb3J5X25ld193cmFwcGVkICgwLCBkYXRhLCBzaXplLCAwLCBzaXplLCBkYXRhLCBnX2ZyZWUpKTsKKworICAgIGlmICghZ3N0X3J0cF90aGVvcmFfZGVwYXlfcGFyc2VfY29uZmlndXJhdGlvbiAocnRwdGhlb3JhZGVwYXksIGNvbmZidWYpKQorICAgICAgZ290byBpbnZhbGlkX2NvbmZpZ3VyYXRpb247CisgIH0KKworICAvKiBzZXQgY2FwcyBvbiBwYWQgYW5kIG9uIGhlYWRlciAqLworICBzcmNjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3gtdGhlb3JhIik7CisgIHJlcyA9IGdzdF9wYWRfc2V0X2NhcHMgKGRlcGF5bG9hZC0+c3JjcGFkLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIC8qIENsb2NrIHJhdGUgaXMgYWx3YXlzIDkwMDAwIGFjY29yZGluZyB0byBkcmFmdC1iYXJiYXRvLWF2dC1ydHAtdGhlb3JhLTAxICovCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IDkwMDAwOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX2NvbmZpZ3VyYXRpb246CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChydHB0aGVvcmFkZXBheSwgImludmFsaWQgY29uZmlndXJhdGlvbiBzcGVjaWZpZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3RoZW9yYV9kZXBheV9zd2l0Y2hfY29kZWJvb2sgKEdzdFJ0cFRoZW9yYURlcGF5ICogcnRwdGhlb3JhZGVwYXksCisgICAgZ3VpbnQzMiBpZGVudCkKK3sKKyAgR0xpc3QgKndhbGs7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIGZvciAod2FsayA9IHJ0cHRoZW9yYWRlcGF5LT5jb25maWdzOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UnRwVGhlb3JhQ29uZmlnICpjb25mID0gKEdzdFJ0cFRoZW9yYUNvbmZpZyAqKSB3YWxrLT5kYXRhOworCisgICAgaWYgKGNvbmYtPmlkZW50ID09IGlkZW50KSB7CisgICAgICBHTGlzdCAqaGVhZGVyczsKKworICAgICAgLyogRklYTUUsIHJlbW92ZSBwYWRzLCBjcmVhdGUgbmV3IHBhZC4uICovCisKKyAgICAgIC8qIHB1c2ggb3V0IGFsbCB0aGUgaGVhZGVycyAqLworICAgICAgZm9yIChoZWFkZXJzID0gY29uZi0+aGVhZGVyczsgaGVhZGVyczsgaGVhZGVycyA9IGdfbGlzdF9uZXh0IChoZWFkZXJzKSkgeworICAgICAgICBHc3RCdWZmZXIgKmhlYWRlciA9IEdTVF9CVUZGRVJfQ0FTVCAoaGVhZGVycy0+ZGF0YSk7CisKKyAgICAgICAgZ3N0X2J1ZmZlcl9yZWYgKGhlYWRlcik7CisgICAgICAgIGdzdF9ydHBfYmFzZV9kZXBheWxvYWRfcHVzaCAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRCAocnRwdGhlb3JhZGVwYXkpLAorICAgICAgICAgICAgaGVhZGVyKTsKKyAgICAgIH0KKyAgICAgIC8qIHJlbWVtYmVyIHRoZSBjdXJyZW50IGNvbmZpZyAqLworICAgICAgcnRwdGhlb3JhZGVwYXktPmNvbmZpZyA9IGNvbmY7CisgICAgICByZXMgPSBUUlVFOworICAgIH0KKyAgfQorICBpZiAoIXJlcykgeworICAgIC8qIHdlIGRvbid0IGtub3cgYWJvdXQgdGhlIGhlYWRlcnMsIGZpZ3VyZSBvdXQgYW4gYWx0ZXJuYXRpdmUgbWV0aG9kIGZvcgorICAgICAqIGdldHRpbmcgdGhlIGNvZGVib29rcy4gRklYTUUsIGZhaWwgZm9yIG5vdy4gKi8KKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfdGhlb3JhX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBUaGVvcmFEZXBheSAqcnRwdGhlb3JhZGVwYXk7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ2ludCBwYXlsb2FkX2xlbjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdEJ1ZmZlciAqcGF5bG9hZF9idWZmZXIgPSBOVUxMOworICBndWludDggKnBheWxvYWQ7CisgIGd1aW50MzIgaGVhZGVyLCBpZGVudDsKKyAgZ3VpbnQ4IEYsIFREVCwgcGFja2V0czsKKyAgZ3VpbnQgbGVuZ3RoOworCisgIHJ0cHRoZW9yYWRlcGF5ID0gR1NUX1JUUF9USEVPUkFfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAiZ290IFJUUCBwYWNrZXQgb2Ygc2l6ZSAlZCIsIHBheWxvYWRfbGVuKTsKKworICAvKiB3ZSBuZWVkIGF0IGxlYXN0IDQgYnl0ZXMgZm9yIHRoZSBwYWNrZXQgaGVhZGVyICovCisgIGlmIChHX1VOTElLRUxZIChwYXlsb2FkX2xlbiA8IDQpKQorICAgIGdvdG8gcGFja2V0X3Nob3J0OworCisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAocnRwKTsKKworICBoZWFkZXIgPSBHU1RfUkVBRF9VSU5UMzJfQkUgKHBheWxvYWQpOworICAvKgorICAgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIHwgICAgICAgICAgICAgICAgICAgICBJZGVudCAgICAgICAgICAgICAgICAgICAgIHwgRiB8VERUfCMgcGt0cy58CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqCisgICAqIEY6IEZyYWdtZW50IHR5cGUgKDA9bm9uZSwgMT1zdGFydCwgMj1jb250LCAzPWVuZCkKKyAgICogVERUOiBUaGVvcmEgZGF0YSB0eXBlICgwPXRoZW9yYSwgMT1jb25maWcsIDI9Y29tbWVudCwgMz1yZXNlcnZlZCkKKyAgICogcGt0czogbnVtYmVyIG9mIHBhY2tldHMuCisgICAqLworICBURFQgPSAoaGVhZGVyICYgMHgzMCkgPj4gNDsKKyAgaWYgKEdfVU5MSUtFTFkgKFREVCA9PSAzKSkKKyAgICBnb3RvIGlnbm9yZV9yZXNlcnZlZDsKKworICBpZGVudCA9IChoZWFkZXIgPj4gOCkgJiAweGZmZmZmZjsKKyAgRiA9IChoZWFkZXIgJiAweGMwKSA+PiA2OworICBwYWNrZXRzID0gKGhlYWRlciAmIDB4Zik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAiaWRlbnQ6IDB4JTA4eCwgRjogJWQsIFREVDogJWQsIHBhY2tldHM6ICVkIiwKKyAgICAgIGlkZW50LCBGLCBURFQsIHBhY2tldHMpOworCisgIGlmIChURFQgPT0gMCkgeworICAgIGdib29sZWFuIGRvX3N3aXRjaCA9IEZBTFNFOworCisgICAgLyogd2UgaGF2ZSBhIHJhdyBwYXlsb2FkLCBmaW5kIHRoZSBjb2RlYm9vayBmb3IgdGhlIGlkZW50ICovCisgICAgaWYgKCFydHB0aGVvcmFkZXBheS0+Y29uZmlnKSB7CisgICAgICAvKiB3ZSBkb24ndCBoYXZlIGFuIGFjdGl2ZSBjb2RlYm9vaywgZmluZCB0aGUgY29kZWJvb2sgYW5kCisgICAgICAgKiBhY3RpdmF0ZSBpdCAqLworICAgICAgZG9fc3dpdGNoID0gVFJVRTsKKyAgICB9IGVsc2UgaWYgKHJ0cHRoZW9yYWRlcGF5LT5jb25maWctPmlkZW50ICE9IGlkZW50KSB7CisgICAgICAvKiBjb2RlYm9vayBjaGFuZ2VkICovCisgICAgICBkb19zd2l0Y2ggPSBUUlVFOworICAgIH0KKyAgICBpZiAoZG9fc3dpdGNoKSB7CisgICAgICBpZiAoIWdzdF9ydHBfdGhlb3JhX2RlcGF5X3N3aXRjaF9jb2RlYm9vayAocnRwdGhlb3JhZGVwYXksIGlkZW50KSkKKyAgICAgICAgZ290byBzd2l0Y2hfZmFpbGVkOworICAgIH0KKyAgfQorCisgIC8qIGZyYWdtZW50ZWQgcGFja2V0cywgYXNzZW1ibGUgKi8KKyAgaWYgKEYgIT0gMCkgeworICAgIEdzdEJ1ZmZlciAqdmRhdGE7CisKKyAgICBpZiAoRiA9PSAxKSB7CisgICAgICAvKiBpZiB3ZSBzdGFydCBhIHBhY2tldCwgY2xlYXIgYWRhcHRlciBhbmQgc3RhcnQgYXNzZW1ibGluZy4gKi8KKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChydHB0aGVvcmFkZXBheS0+YWRhcHRlcik7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJzdGFydCBhc3NlbWJsZSIpOworICAgICAgcnRwdGhlb3JhZGVwYXktPmFzc2VtYmxpbmcgPSBUUlVFOworICAgIH0KKworICAgIGlmICghcnRwdGhlb3JhZGVwYXktPmFzc2VtYmxpbmcpCisgICAgICBnb3RvIG5vX291dHB1dDsKKworICAgIC8qIHNraXAgaGVhZGVyIGFuZCBsZW5ndGguICovCisgICAgdmRhdGEgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwgNiwgLTEpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAiYXNzZW1ibGUgdGhlb3JhIHBhY2tldCIpOworICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cHRoZW9yYWRlcGF5LT5hZGFwdGVyLCB2ZGF0YSk7CisKKyAgICAvKiBwYWNrZXQgaXMgbm90IGNvbXBsZXRlLCB3ZSBhcmUgZG9uZSAqLworICAgIGlmIChGICE9IDMpCisgICAgICBnb3RvIG5vX291dHB1dDsKKworICAgIC8qIGNvbnN0cnVjdCBhc3NlbWJsZWQgYnVmZmVyICovCisgICAgbGVuZ3RoID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHB0aGVvcmFkZXBheS0+YWRhcHRlcik7CisgICAgcGF5bG9hZF9idWZmZXIgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwdGhlb3JhZGVwYXktPmFkYXB0ZXIsIGxlbmd0aCk7CisgIH0gZWxzZSB7CisgICAgbGVuZ3RoID0gMDsKKyAgICBwYXlsb2FkX2J1ZmZlciA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3N1YmJ1ZmZlciAocnRwLCA0LCAtMSk7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJhc3NlbWJsZSBkb25lLCBwYXlsb2FkX2xlbiAlZCIsIHBheWxvYWRfbGVuKTsKKworICBnc3RfYnVmZmVyX21hcCAocGF5bG9hZF9idWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHBheWxvYWQgPSBtYXAuZGF0YTsKKyAgcGF5bG9hZF9sZW4gPSBtYXAuc2l6ZTsKKworICAvKiB3ZSBub3QgYXNzZW1ibGluZyBhbnltb3JlIG5vdyAqLworICBydHB0aGVvcmFkZXBheS0+YXNzZW1ibGluZyA9IEZBTFNFOworICBnc3RfYWRhcHRlcl9jbGVhciAocnRwdGhlb3JhZGVwYXktPmFkYXB0ZXIpOworCisgIC8qIHBheWxvYWQgbm93IHBvaW50cyB0byBhIGxlbmd0aCB3aXRoIHRoYXQgbWFueSB0aGVvcmEgZGF0YSBieXRlcy4KKyAgICogSXRlcmF0ZSBvdmVyIHRoZSBwYWNrZXRzIGFuZCBzZW5kIHRoZW0gb3V0LgorICAgKgorICAgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIHwgICAgICAgICAgICAgbGVuZ3RoICAgICAgICAgICAgfCAgICAgICAgICB0aGVvcmEgZGF0YSAgICAgICAgIC4uCisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIC4uICAgICAgICAgICAgICAgICAgICAgICAgdGhlb3JhIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIHwgICAgICAgICAgICBsZW5ndGggICAgICAgICAgICAgfCAgIG5leHQgdGhlb3JhIHBhY2tldCBkYXRhICAgIC4uCisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIC4uICAgICAgICAgICAgICAgICAgICAgICAgdGhlb3JhIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rKgorICAgKi8KKyAgd2hpbGUgKHBheWxvYWRfbGVuID49IDIpIHsKKyAgICAvKiBJZiBsZW5ndGggaXMgbm90IDAsIHdlIGhhdmUgYSByZWFzc2VtYmxlZCBwYWNrZXQgZm9yIHdoaWNoIHdlCisgICAgICogY2FsY3VsYXRlZCB0aGUgbGVuZ3RoIGFscmVhZHkgYW5kIGRvbid0IGhhdmUgdG8gc2tpcCBvdmVyIHRoZQorICAgICAqIGxlbmd0aCBmaWVsZCBhbnltb3JlCisgICAgICovCisgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICBsZW5ndGggPSBHU1RfUkVBRF9VSU5UMTZfQkUgKHBheWxvYWQpOworICAgICAgcGF5bG9hZCArPSAyOworICAgICAgcGF5bG9hZF9sZW4gLT0gMjsKKyAgICB9CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJyZWFkIGxlbmd0aCAldSwgYXZhaWw6ICVkIiwgbGVuZ3RoLAorICAgICAgICBwYXlsb2FkX2xlbik7CisKKyAgICAvKiBza2lwIHBhY2tldCBpZiBzb21ldGhpbmcgb2RkIGhhcHBlbnMgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAobGVuZ3RoID4gcGF5bG9hZF9sZW4pKQorICAgICAgZ290byBsZW5ndGhfc2hvcnQ7CisKKyAgICAvKiBoYW5kbGUgaW4tYmFuZCBjb25maWd1cmF0aW9uICovCisgICAgaWYgKEdfVU5MSUtFTFkgKFREVCA9PSAxKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwdGhlb3JhZGVwYXksICJpbi1iYW5kIGNvbmZpZ3VyYXRpb24iKTsKKyAgICAgIGlmICghZ3N0X3J0cF90aGVvcmFfZGVwYXlfcGFyc2VfaW5iYW5kX2NvbmZpZ3VyYXRpb24gKHJ0cHRoZW9yYWRlcGF5LAorICAgICAgICAgICAgICBpZGVudCwgcGF5bG9hZCwgcGF5bG9hZF9sZW4sIGxlbmd0aCkpCisgICAgICAgIGdvdG8gaW52YWxpZF9jb25maWd1cmF0aW9uOworICAgICAgZ290byBub19vdXRwdXQ7CisgICAgfQorCisgICAgLyogY3JlYXRlIGJ1ZmZlciBmb3IgcGFja2V0ICovCisgICAgb3V0YnVmID0KKyAgICAgICAgZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAocGF5bG9hZF9idWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsCisgICAgICAgIHBheWxvYWQgLSBtYXAuZGF0YSwgbGVuZ3RoKTsKKworICAgIGlmIChwYXlsb2FkX2xlbiA+IDAgJiYgKHBheWxvYWRbMF0gJiAweEMwKSA9PSAweDApIHsKKyAgICAgIHJ0cHRoZW9yYWRlcGF5LT5uZWVkc19rZXlmcmFtZSA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKTsKKyAgICB9CisKKyAgICBwYXlsb2FkICs9IGxlbmd0aDsKKyAgICBwYXlsb2FkX2xlbiAtPSBsZW5ndGg7CisgICAgLyogbWFrZSBzdXJlIHRvIHJlYWQgbmV4dCBsZW5ndGggKi8KKyAgICBsZW5ndGggPSAwOworCisgICAgcmV0ID0gZ3N0X3J0cF9iYXNlX2RlcGF5bG9hZF9wdXNoIChkZXBheWxvYWQsIG91dGJ1Zik7CisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKHJ0cHRoZW9yYWRlcGF5LT5uZWVkc19rZXlmcmFtZSkKKyAgICBnb3RvIHJlcXVlc3Rfa2V5ZnJhbWU7CisKK291dDoKK25vX291dHB1dDoKKworICBpZiAocGF5bG9hZF9idWZmZXIpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChwYXlsb2FkX2J1ZmZlciwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAocGF5bG9hZF9idWZmZXIpOworICB9CisKKyAgcmV0dXJuIE5VTEw7CisKKyAgLyogRVJPUlJTICovCitzd2l0Y2hfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwdGhlb3JhZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiQ291bGQgbm90IHN3aXRjaCBjb2RlYm9va3MiKSk7CisgICAgZ290byByZXF1ZXN0X2NvbmZpZzsKKyAgfQorcGFja2V0X3Nob3J0OgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwdGhlb3JhZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiUGFja2V0IHdhcyB0b28gc2hvcnQgKCVkIDwgNCkiLCBwYXlsb2FkX2xlbikpOworICAgIGdvdG8gcmVxdWVzdF9rZXlmcmFtZTsKKyAgfQoraWdub3JlX3Jlc2VydmVkOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChydHB0aGVvcmFkZXBheSwgInJlc2VydmVkIFREVCBpZ25vcmVkIik7CisgICAgZ290byBvdXQ7CisgIH0KK2xlbmd0aF9zaG9ydDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cHRoZW9yYWRlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIlBhY2tldCBjb250YWlucyBpbnZhbGlkIGRhdGEiKSk7CisgICAgZ290byByZXF1ZXN0X2tleWZyYW1lOworICB9CitpbnZhbGlkX2NvbmZpZ3VyYXRpb246CisgIHsKKyAgICAvKiBmYXRhbCwgYXMgd2Ugb3RoZXJ3aXNlIHJpc2sgY2Fycnlpbmcgb24gd2l0aG91dCBvdXRwdXQgKi8KKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocnRwdGhlb3JhZGVwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiUGFja2V0IGNvbnRhaW5zIGludmFsaWQgY29uZmlndXJhdGlvbiIpKTsKKyAgICBnb3RvIHJlcXVlc3RfY29uZmlnOworICB9CityZXF1ZXN0X2NvbmZpZzoKKyAgeworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TSU5LUEFEIChkZXBheWxvYWQpLAorICAgICAgICBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwKKyAgICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiR3N0Rm9yY2VLZXlVbml0IiwKKyAgICAgICAgICAgICAgICAiYWxsLWhlYWRlcnMiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCkpKTsKKyAgICBnb3RvIG91dDsKKyAgfQorcmVxdWVzdF9rZXlmcmFtZToKKyAgeworICAgIHJ0cHRoZW9yYWRlcGF5LT5uZWVkc19rZXlmcmFtZSA9IFRSVUU7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NJTktQQUQgKGRlcGF5bG9hZCksCisgICAgICAgIGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNLAorICAgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCJHc3RGb3JjZUtleVVuaXQiKSkpOworICAgIGdvdG8gb3V0OworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF90aGVvcmFfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSdHBUaGVvcmFEZXBheSAqcnRwdGhlb3JhZGVwYXk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBydHB0aGVvcmFkZXBheSA9IEdTVF9SVFBfVEhFT1JBX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZnJlZV9pbmRlbnRzIChydHB0aGVvcmFkZXBheSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF90aGVvcmFfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHB0aGVvcmFkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9USEVPUkFfREVQQVkpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdGhlb3JhX2RlcGF5X3BhY2tldF9sb3N0IChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFJ0cFRoZW9yYURlcGF5ICpydHB0aGVvcmFkZXBheSA9IEdTVF9SVFBfVEhFT1JBX0RFUEFZIChkZXBheWxvYWQpOworICBndWludCBzZXFudW0gPSAwOworCisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCksICJzZXFudW0iLCAmc2VxbnVtKTsKKyAgR1NUX0xPR19PQkpFQ1QgKGRlcGF5bG9hZCwgIlJlcXVlc3RlZCBrZXlmcmFtZSBiZWNhdXNlIGZyYW1lIHdpdGggc2VxbnVtICV1IgorICAgICAgIiBpcyBtaXNzaW5nIiwgc2VxbnVtKTsKKyAgcnRwdGhlb3JhZGVwYXktPm5lZWRzX2tleWZyYW1lID0gVFJVRTsKKworICBnc3RfcGFkX3B1c2hfZXZlbnQgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU0lOS1BBRCAoZGVwYXlsb2FkKSwKKyAgICAgIGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNLAorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgiR3N0Rm9yY2VLZXlVbml0IikpKTsKKworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwdGhlb3JhZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjBiMjYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHB0aGVvcmFkZXBheS5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9USEVPUkFfREVQQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9USEVPUkFfREVQQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1RIRU9SQV9ERVBBWSBcCisgIChnc3RfcnRwX3RoZW9yYV9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX1RIRU9SQV9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9USEVPUkFfREVQQVksR3N0UnRwVGhlb3JhRGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX1RIRU9SQV9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfVEhFT1JBX0RFUEFZLEdzdFJ0cFRoZW9yYURlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1RIRU9SQV9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9USEVPUkFfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX1RIRU9SQV9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfVEhFT1JBX0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFRoZW9yYURlcGF5IEdzdFJ0cFRoZW9yYURlcGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFRoZW9yYURlcGF5Q2xhc3MgR3N0UnRwVGhlb3JhRGVwYXlDbGFzczsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFRoZW9yYUNvbmZpZyB7CisgIGd1aW50MzIgIGlkZW50OworICBHTGlzdCAgICpoZWFkZXJzOworfSBHc3RSdHBUaGVvcmFDb25maWc7CisKK3N0cnVjdCBfR3N0UnRwVGhlb3JhRGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBwYXJlbnQ7CisKKyAgR0xpc3QgICAgICAgICAgICAgICpjb25maWdzOworICBHc3RSdHBUaGVvcmFDb25maWcgKmNvbmZpZzsKKworICBHc3RBZGFwdGVyICAgICAgICAgKmFkYXB0ZXI7CisgIGdib29sZWFuICAgICAgICAgICAgYXNzZW1ibGluZzsKKworICBnYm9vbGVhbiAgICAgICAgICAgIG5lZWRzX2tleWZyYW1lOworfTsKKworc3RydWN0IF9Hc3RSdHBUaGVvcmFEZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX3RoZW9yYV9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfdGhlb3JhX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX1RIRU9SQV9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ODM5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5jCkBAIC0wLDAgKzEsOTgyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlICJmbnYxaGFzaC5oIgorI2luY2x1ZGUgImdzdHJ0cHRoZW9yYXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKKyNkZWZpbmUgVEhFT1JBX0lEX0xFTgk0MgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHB0aGVvcmFwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHJ0cHRoZW9yYXBheV9kZWJ1ZykKKworLyogcmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9zdm4ueGlwaC5vcmcvdHJ1bmsvdGhlb3JhL2RvYy9kcmFmdC1pZXRmLWF2dC1ydHAtdGhlb3JhLTAxLnR4dAorICovCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3RoZW9yYV9wYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsICIgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIlRIRU9SQVwiIgorICAgICAgICAvKiBBbGwgcmVxdWlyZWQgcGFyYW1ldGVycworICAgICAgICAgKgorICAgICAgICAgKiAic2FtcGxpbmcgPSAoc3RyaW5nKSB7ICJZQ2JDci00OjI6MCIsICJZQ2JDci00OjI6MiIsICJZQ2JDci00OjQ6NCIgfSAiCisgICAgICAgICAqICJ3aWR0aCA9IChzdHJpbmcpIFsxLCAxMDQ4NTYxXSAobXVsdGlwbGVzIG9mIDE2KSAiCisgICAgICAgICAqICJoZWlnaHQgPSAoc3RyaW5nKSBbMSwgMTA0ODU2MV0gKG11bHRpcGxlcyBvZiAxNikgIgorICAgICAgICAgKiAiY29uZmlndXJhdGlvbiA9IChzdHJpbmcpIEFOWSIKKyAgICAgICAgICovCisgICAgICAgIC8qIEFsbCBvcHRpb25hbCBwYXJhbWV0ZXJzCisgICAgICAgICAqCisgICAgICAgICAqICJjb25maWd1cmF0aW9uLXVyaSA9IgorICAgICAgICAgKiAiZGVsaXZlcnktbWV0aG9kID0gKHN0cmluZykgeyBpbmxpbmUsIGluX2JhbmQsIG91dF9iYW5kLzxzcGVjaWZpY19uYW1lPiB9ICIKKyAgICAgICAgICovCisgICAgKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3RoZW9yYV9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXRoZW9yYSIpCisgICAgKTsKKworI2RlZmluZSBERUZBVUxUX0NPTkZJR19JTlRFUlZBTCAwCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0NPTkZJR19JTlRFUlZBTAorfTsKKworI2RlZmluZSBnc3RfcnRwX3RoZW9yYV9wYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwVGhlb3JhUGF5LCBnc3RfcnRwX3RoZW9yYV9wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF90aGVvcmFfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfdGhlb3JhX3BheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKgorICAgIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF90aGVvcmFfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogcGFkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF90aGVvcmFfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfdGhlb3JhX3BheV9wYXJzZV9pZCAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwKKyAgICBndWludDggKiBkYXRhLCBndWludCBzaXplKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3RoZW9yYV9wYXlfZmluaXNoX2hlYWRlcnMgKEdzdFJUUEJhc2VQYXlsb2FkICoKKyAgICBiYXNlcGF5bG9hZCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfdGhlb3JhX3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX3RoZW9yYV9wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF90aGVvcmFfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cFRoZW9yYVBheUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzICpnc3RydHBiYXNlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF90aGVvcmFfcGF5X2NoYW5nZV9zdGF0ZTsKKworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX3RoZW9yYV9wYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX3RoZW9yYV9wYXlfaGFuZGxlX2J1ZmZlcjsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNpbmtfZXZlbnQgPSBnc3RfcnRwX3RoZW9yYV9wYXlfc2lua19ldmVudDsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX3RoZW9yYV9wYXlfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX3RoZW9yYV9wYXlfZ2V0X3Byb3BlcnR5OworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfdGhlb3JhX3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3RoZW9yYV9wYXlfc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgVGhlb3JhIHBheWxvYWRlciIsICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlBheWxvYWQtZW5jb2RlIFRoZW9yYSB2aWRlbyBpbnRvIFJUUCBwYWNrZXRzIChkcmFmdC0wMSBSRkMgWFhYWCkiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cHRoZW9yYXBheV9kZWJ1ZywgInJ0cHRoZW9yYXBheSIsIDAsCisgICAgICAiVGhlb3JhIFJUUCBQYXlsb2FkZXIiKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0NPTkZJR19JTlRFUlZBTCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiY29uZmlnLWludGVydmFsIiwgIkNvbmZpZyBTZW5kIEludGVydmFsIiwKKyAgICAgICAgICAiU2VuZCBDb25maWcgSW5zZXJ0aW9uIEludGVydmFsIGluIHNlY29uZHMgKGNvbmZpZ3VyYXRpb24gaGVhZGVycyAiCisgICAgICAgICAgIndpbGwgYmUgbXVsdGlwbGV4ZWQgaW4gdGhlIGRhdGEgc3RyZWFtIHdoZW4gZGV0ZWN0ZWQuKSAoMCA9IGRpc2FibGVkKSIsCisgICAgICAgICAgMCwgMzYwMCwgREVGQVVMVF9DT05GSUdfSU5URVJWQUwsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKQorICAgICAgKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdGhlb3JhX3BheV9pbml0IChHc3RSdHBUaGVvcmFQYXkgKiBydHB0aGVvcmFwYXkpCit7CisgIHJ0cHRoZW9yYXBheS0+bGFzdF9jb25maWcgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF90aGVvcmFfcGF5X2NsZWFyX3BhY2tldCAoR3N0UnRwVGhlb3JhUGF5ICogcnRwdGhlb3JhcGF5KQoreworICBpZiAocnRwdGhlb3JhcGF5LT5wYWNrZXQpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAocnRwdGhlb3JhcGF5LT5wYWNrZXQpOworICBydHB0aGVvcmFwYXktPnBhY2tldCA9IE5VTEw7CisgIGdfbGlzdF9mcmVlX2Z1bGwgKHJ0cHRoZW9yYXBheS0+cGFja2V0X2J1ZmZlcnMsCisgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9idWZmZXJfdW5yZWYpOworICBydHB0aGVvcmFwYXktPnBhY2tldF9idWZmZXJzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdGhlb3JhX3BheV9jbGVhbnVwIChHc3RSdHBUaGVvcmFQYXkgKiBydHB0aGVvcmFwYXkpCit7CisgIGdzdF9ydHBfdGhlb3JhX3BheV9jbGVhcl9wYWNrZXQgKHJ0cHRoZW9yYXBheSk7CisgIGdfbGlzdF9mcmVlX2Z1bGwgKHJ0cHRoZW9yYXBheS0+aGVhZGVycywgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX3VucmVmKTsKKyAgcnRwdGhlb3JhcGF5LT5oZWFkZXJzID0gTlVMTDsKKyAgZ19mcmVlIChydHB0aGVvcmFwYXktPmNvbmZpZ19kYXRhKTsKKyAgcnRwdGhlb3JhcGF5LT5jb25maWdfZGF0YSA9IE5VTEw7CisgIHJ0cHRoZW9yYXBheS0+bGFzdF9jb25maWcgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdGhlb3JhX3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UnRwVGhlb3JhUGF5ICpydHB0aGVvcmFwYXk7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgY29uc3QgR1ZhbHVlICphcnJheTsKKyAgZ2ludCBhc2l6ZSwgaTsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdE1hcEluZm8gbWFwOworCisgIHJ0cHRoZW9yYXBheSA9IEdTVF9SVFBfVEhFT1JBX1BBWSAoYmFzZXBheWxvYWQpOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBydHB0aGVvcmFwYXktPm5lZWRfaGVhZGVycyA9IFRSVUU7CisKKyAgaWYgKChhcnJheSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAic3RyZWFtaGVhZGVyIikpID09IE5VTEwpCisgICAgZ290byBkb25lOworCisgIGlmIChHX1ZBTFVFX1RZUEUgKGFycmF5KSAhPSBHU1RfVFlQRV9BUlJBWSkKKyAgICBnb3RvIGRvbmU7CisKKyAgaWYgKChhc2l6ZSA9IGdzdF92YWx1ZV9hcnJheV9nZXRfc2l6ZSAoYXJyYXkpKSA8IDMpCisgICAgZ290byBkb25lOworCisgIGZvciAoaSA9IDA7IGkgPCBhc2l6ZTsgaSsrKSB7CisgICAgY29uc3QgR1ZhbHVlICp2YWx1ZTsKKworICAgIHZhbHVlID0gZ3N0X3ZhbHVlX2FycmF5X2dldF92YWx1ZSAoYXJyYXksIGkpOworICAgIGlmICgoYnVmID0gZ3N0X3ZhbHVlX2dldF9idWZmZXIgKHZhbHVlKSkgPT0gTlVMTCkKKyAgICAgIGdvdG8gbnVsbF9idWZmZXI7CisKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIC8qIG5vIGRhdGEgcGFja2V0cyBhbGxvd2VkICovCisgICAgaWYgKG1hcC5zaXplIDwgMSkKKyAgICAgIGdvdG8gaW52YWxpZF9zdHJlYW1oZWFkZXI7CisKKyAgICAvKiB3ZSBuZWVkIHBhY2tldHMgd2l0aCBpZCAweDgwLCAweDgxLCAweDgyICovCisgICAgaWYgKG1hcC5kYXRhWzBdICE9IDB4ODAgKyBpKQorICAgICAgZ290byBpbnZhbGlkX3N0cmVhbWhlYWRlcjsKKworICAgIGlmIChpID09IDApIHsKKyAgICAgIC8qIGlkZW50aWZpY2F0aW9uLCB3ZSBuZWVkIHRvIHBhcnNlIHRoaXMgaW4gb3JkZXIgdG8gZ2V0IHRoZSBjbG9jayByYXRlLiAqLworICAgICAgaWYgKEdfVU5MSUtFTFkgKCFnc3RfcnRwX3RoZW9yYV9wYXlfcGFyc2VfaWQgKGJhc2VwYXlsb2FkLCBtYXAuZGF0YSwKKyAgICAgICAgICAgICAgICAgIG1hcC5zaXplKSkpCisgICAgICAgIGdvdG8gcGFyc2VfaWRfZmFpbGVkOworICAgIH0KKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHB0aGVvcmFwYXksICJjb2xsZWN0aW5nIGhlYWRlciAlZCIsIGkpOworICAgIHJ0cHRoZW9yYXBheS0+aGVhZGVycyA9CisgICAgICAgIGdfbGlzdF9hcHBlbmQgKHJ0cHRoZW9yYXBheS0+aGVhZGVycywgZ3N0X2J1ZmZlcl9yZWYgKGJ1ZikpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIH0KKyAgaWYgKCFnc3RfcnRwX3RoZW9yYV9wYXlfZmluaXNoX2hlYWRlcnMgKGJhc2VwYXlsb2FkKSkKKyAgICBnb3RvIGZpbmlzaF9mYWlsZWQ7CisKK2RvbmU6CisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworbnVsbF9idWZmZXI6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cHRoZW9yYXBheSwgInN0cmVhbWhlYWRlciB3aXRoIG51bGwgYnVmZmVyIHJlY2VpdmVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbnZhbGlkX3N0cmVhbWhlYWRlcjoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwdGhlb3JhcGF5LCAidW5hYmxlIHRvIHBhcnNlIGluaXRpYWwgaGVhZGVyIik7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3BhcnNlX2lkX2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwdGhlb3JhcGF5LCAidW5hYmxlIHRvIHBhcnNlIGluaXRpYWwgaGVhZGVyIik7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ZpbmlzaF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cHRoZW9yYXBheSwgInVuYWJsZSB0byBmaW5pc2ggaGVhZGVycyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF90aGVvcmFfcGF5X3Jlc2V0X3BhY2tldCAoR3N0UnRwVGhlb3JhUGF5ICogcnRwdGhlb3JhcGF5LCBndWludDggVERUKQoreworICBndWludCBwYXlsb2FkX2xlbjsKKyAgR3N0UlRQQnVmZmVyIHJ0cCA9IHsgTlVMTCB9OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHRoZW9yYXBheSwgInJlc2V0IHBhY2tldCIpOworCisgIHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9wb3MgPSA0OworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKHJ0cHRoZW9yYXBheS0+cGFja2V0LCBHU1RfTUFQX1JFQUQsICZydHApOworICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAoJnJ0cCk7CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgcnRwdGhlb3JhcGF5LT5wYXlsb2FkX2xlZnQgPSBwYXlsb2FkX2xlbiAtIDQ7CisgIHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9kdXJhdGlvbiA9IDA7CisgIHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9GID0gMDsKKyAgcnRwdGhlb3JhcGF5LT5wYXlsb2FkX1REVCA9IFREVDsKKyAgcnRwdGhlb3JhcGF5LT5wYXlsb2FkX3BrdHMgPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF90aGVvcmFfcGF5X2luaXRfcGFja2V0IChHc3RSdHBUaGVvcmFQYXkgKiBydHB0aGVvcmFwYXksIGd1aW50OCBURFQsCisgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCkKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwdGhlb3JhcGF5LCAic3RhcnRpbmcgbmV3IHBhY2tldCwgVERUOiAlZCIsIFREVCk7CisKKyAgZ3N0X3J0cF90aGVvcmFfcGF5X2NsZWFyX3BhY2tldCAocnRwdGhlb3JhcGF5KTsKKworICAvKiBuZXcgcGFja2V0IGFsbG9jYXRlIG1heCBwYWNrZXQgc2l6ZSAqLworICBydHB0aGVvcmFwYXktPnBhY2tldCA9CisgICAgICBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGVfbGVuIChHU1RfUlRQX0JBU0VfUEFZTE9BRF9NVFUKKyAgICAgIChydHB0aGVvcmFwYXkpLCAwLCAwKTsKKyAgZ3N0X3J0cF90aGVvcmFfcGF5X3Jlc2V0X3BhY2tldCAocnRwdGhlb3JhcGF5LCBURFQpOworCisgIEdTVF9CVUZGRVJfUFRTIChydHB0aGVvcmFwYXktPnBhY2tldCkgPSB0aW1lc3RhbXA7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3RoZW9yYV9wYXlfZmx1c2hfcGFja2V0IChHc3RSdHBUaGVvcmFQYXkgKiBydHB0aGVvcmFwYXkpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBndWludDggKnBheWxvYWQ7CisgIGd1aW50IGhsZW47CisgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwgfTsKKyAgR0xpc3QgKmw7CisKKyAgLyogY2hlY2sgZm9yIGVtcHR5IHBhY2tldCAqLworICBpZiAoIXJ0cHRoZW9yYXBheS0+cGFja2V0IHx8IHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9wb3MgPD0gNCkKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwdGhlb3JhcGF5LCAiZmx1c2hpbmcgcGFja2V0Iik7CisKKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChydHB0aGVvcmFwYXktPnBhY2tldCwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisKKyAgLyogZml4IGhlYWRlciAqLworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApOworICAvKgorICAgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIHwgICAgICAgICAgICAgICAgICAgICBJZGVudCAgICAgICAgICAgICAgICAgICAgIHwgRiB8VERUfCMgcGt0cy58CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqCisgICAqIEY6IEZyYWdtZW50IHR5cGUgKDA9bm9uZSwgMT1zdGFydCwgMj1jb250LCAzPWVuZCkKKyAgICogVERUOiBUaGVvcmEgZGF0YSB0eXBlICgwPXRoZW9yYSwgMT1jb25maWcsIDI9Y29tbWVudCwgMz1yZXNlcnZlZCkKKyAgICogcGt0czogbnVtYmVyIG9mIHBhY2tldHMuCisgICAqLworICBwYXlsb2FkWzBdID0gKHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9pZGVudCA+PiAxNikgJiAweGZmOworICBwYXlsb2FkWzFdID0gKHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9pZGVudCA+PiA4KSAmIDB4ZmY7CisgIHBheWxvYWRbMl0gPSAocnRwdGhlb3JhcGF5LT5wYXlsb2FkX2lkZW50KSAmIDB4ZmY7CisgIHBheWxvYWRbM10gPSAocnRwdGhlb3JhcGF5LT5wYXlsb2FkX0YgJiAweDMpIDw8IDYgfAorICAgICAgKHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9URFQgJiAweDMpIDw8IDQgfAorICAgICAgKHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9wa3RzICYgMHhmKTsKKworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgLyogc2hyaW5rIHRoZSBidWZmZXIgc2l6ZSB0byB0aGUgbGFzdCB3cml0dGVuIGJ5dGUgKi8KKyAgaGxlbiA9IGdzdF9ydHBfYnVmZmVyX2NhbGNfaGVhZGVyX2xlbiAoMCk7CisgIGdzdF9idWZmZXJfcmVzaXplIChydHB0aGVvcmFwYXktPnBhY2tldCwgMCwgaGxlbiArIHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9wb3MpOworCisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKHJ0cHRoZW9yYXBheS0+cGFja2V0KSA9IHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9kdXJhdGlvbjsKKworICBmb3IgKGwgPSBnX2xpc3RfbGFzdCAocnRwdGhlb3JhcGF5LT5wYWNrZXRfYnVmZmVycyk7IGw7IGwgPSBsLT5wcmV2KSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBHU1RfQlVGRkVSX0NBU1QgKGwtPmRhdGEpOworICAgIGdzdF9ydHBfY29weV92aWRlb19tZXRhIChydHB0aGVvcmFwYXksIHJ0cHRoZW9yYXBheS0+cGFja2V0LCBidWYpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIH0KKyAgZ19saXN0X2ZyZWUgKHJ0cHRoZW9yYXBheS0+cGFja2V0X2J1ZmZlcnMpOworICBydHB0aGVvcmFwYXktPnBhY2tldF9idWZmZXJzID0gTlVMTDsKKworICAvKiBwdXNoLCB0aGlzIGdpdmVzIGF3YXkgb3VyIHJlZiB0byB0aGUgcGFja2V0LCBzbyBjbGVhciBpdC4gKi8KKyAgcmV0ID0KKyAgICAgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3B1c2ggKEdTVF9SVFBfQkFTRV9QQVlMT0FEIChydHB0aGVvcmFwYXkpLAorICAgICAgcnRwdGhlb3JhcGF5LT5wYWNrZXQpOworICBydHB0aGVvcmFwYXktPnBhY2tldCA9IE5VTEw7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3RoZW9yYV9wYXlfZmluaXNoX2hlYWRlcnMgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQpCit7CisgIEdzdFJ0cFRoZW9yYVBheSAqcnRwdGhlb3JhcGF5ID0gR1NUX1JUUF9USEVPUkFfUEFZIChiYXNlcGF5bG9hZCk7CisgIEdMaXN0ICp3YWxrOworICBndWludCBsZW5ndGgsIHNpemUsIG5faGVhZGVycywgY29uZmlnbGVuLCBleHRyYWxlbjsKKyAgZ2NoYXIgKndzdHIsICpoc3RyLCAqY29uZmlndXJhdGlvbjsKKyAgZ3VpbnQ4ICpkYXRhLCAqY29uZmlnOworICBndWludDMyIGlkZW50OworICBnYm9vbGVhbiByZXM7CisgIGNvbnN0IGdjaGFyICpzYW1wbGluZyA9IE5VTEw7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwdGhlb3JhcGF5LCAiZmluaXNoIGhlYWRlcnMiKTsKKworICBpZiAoIXJ0cHRoZW9yYXBheS0+aGVhZGVycykgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHRoZW9yYXBheSwgIldlIG5lZWQgMiBoZWFkZXJzIGJ1dCBoYXZlIG5vbmUiKTsKKyAgICBnb3RvIG5vX2hlYWRlcnM7CisgIH0KKworICAvKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHBhY2tlZCBoZWFkZXJzICAgICAgICAgICAgICAgICAgfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZWQgaGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZWQgaGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKgorICAgKiBXZSBvbmx5IGNvbnN0cnVjdCBhIGNvbmZpZyBjb250YWluaW5nIDEgcGFja2VkIGhlYWRlciBsaWtlIHRoaXM6CisgICAqCisgICAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICBJZGVudCAgICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgIHwgbi4gb2YgaGVhZGVycyB8ICAgIGxlbmd0aDEgICAgfCAgICBsZW5ndGgyICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgIHwgICAgICAgICAgICAgSWRlbnRpZmljYXRpb24gSGVhZGVyICAgICAgICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgIHwgICAgICAgICBDb21tZW50IEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50IEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dXAgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgICAgICAgICAgICAgU2V0dXAgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICovCisKKyAgLyogd2UgbmVlZCA0IGJ5dGVzIGZvciB0aGUgbnVtYmVyIG9mIGhlYWRlcnMgKHdoaWNoIGlzIGFsd2F5cyAxKSwgMyBieXRlcyBmb3IKKyAgICogdGhlIGlkZW50LCAyIGJ5dGVzIGZvciBsZW5ndGgsIDEgYnl0ZSBmb3Igbi4gb2YgaGVhZGVycy4gKi8KKyAgc2l6ZSA9IDQgKyAzICsgMiArIDE7CisKKyAgLyogY291bnQgdGhlIHNpemUgb2YgdGhlIGhlYWRlcnMgZmlyc3QgYW5kIHVwZGF0ZSB0aGUgaGFzaCAqLworICBsZW5ndGggPSAwOworICBuX2hlYWRlcnMgPSAwOworICBpZGVudCA9IGZudjFfaGFzaF8zMl9uZXcgKCk7CisgIGV4dHJhbGVuID0gMTsKKyAgZm9yICh3YWxrID0gcnRwdGhlb3JhcGF5LT5oZWFkZXJzOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBHU1RfQlVGRkVSX0NBU1QgKHdhbGstPmRhdGEpOworICAgIEdzdE1hcEluZm8gbWFwOworICAgIGd1aW50IGJzaXplOworCisgICAgYnNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworICAgIGxlbmd0aCArPSBic2l6ZTsKKyAgICBuX2hlYWRlcnMrKzsKKworICAgIC8qIGNvdW50IG51bWJlciBvZiBieXRlcyBuZWVkZWQgZm9yIGxlbmd0aCBmaWVsZHMsIHdlIGRvbid0IG5lZWQgdGhpcyBmb3IKKyAgICAgKiB0aGUgbGFzdCBoZWFkZXIuICovCisgICAgaWYgKGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgICAgZG8geworICAgICAgICBzaXplKys7CisgICAgICAgIGV4dHJhbGVuKys7CisgICAgICAgIGJzaXplID4+PSA3OworICAgICAgfSB3aGlsZSAoYnNpemUpOworICAgIH0KKyAgICAvKiB1cGRhdGUgaGFzaCAqLworICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgaWRlbnQgPSBmbnYxX2hhc2hfMzJfdXBkYXRlIChpZGVudCwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICB9CisKKyAgLyogcGFja2V0IGxlbmd0aCBpcyBoZWFkZXIgc2l6ZSArIHBhY2tldCBsZW5ndGggKi8KKyAgY29uZmlnbGVuID0gc2l6ZSArIGxlbmd0aDsKKyAgY29uZmlnID0gZGF0YSA9IGdfbWFsbG9jIChjb25maWdsZW4pOworCisgIC8qIG51bWJlciBvZiBwYWNrZWQgaGVhZGVycywgd2Ugb25seSBwYWNrIDEgaGVhZGVyICovCisgIGRhdGFbMF0gPSAwOworICBkYXRhWzFdID0gMDsKKyAgZGF0YVsyXSA9IDA7CisgIGRhdGFbM10gPSAxOworCisgIGlkZW50ID0gZm52MV9oYXNoXzMyX3RvXzI0IChpZGVudCk7CisgIHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9pZGVudCA9IGlkZW50OworICBHU1RfREVCVUdfT0JKRUNUIChydHB0aGVvcmFwYXksICJpZGVudCAweCUwOHgiLCBpZGVudCk7CisKKyAgLyogdGFrZSBsb3dlciAzIGJ5dGVzICovCisgIGRhdGFbNF0gPSAoaWRlbnQgPj4gMTYpICYgMHhmZjsKKyAgZGF0YVs1XSA9IChpZGVudCA+PiA4KSAmIDB4ZmY7CisgIGRhdGFbNl0gPSBpZGVudCAmIDB4ZmY7CisKKyAgLyogc3RvcmUgbGVuZ3RoIG9mIGFsbCB0aGVvcmEgaGVhZGVycyAqLworICBkYXRhWzddID0gKChsZW5ndGgpID4+IDgpICYgMHhmZjsKKyAgZGF0YVs4XSA9IChsZW5ndGgpICYgMHhmZjsKKworICAvKiBzdG9yZSBudW1iZXIgb2YgaGVhZGVycyBtaW51cyBvbmUuICovCisgIGRhdGFbOV0gPSBuX2hlYWRlcnMgLSAxOworICBkYXRhICs9IDEwOworCisgIC8qIHN0b3JlIGxlbmd0aCBmb3IgZWFjaCBoZWFkZXIgKi8KKyAgZm9yICh3YWxrID0gcnRwdGhlb3JhcGF5LT5oZWFkZXJzOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBHU1RfQlVGRkVSX0NBU1QgKHdhbGstPmRhdGEpOworICAgIGd1aW50IGJzaXplLCBzaXplLCB0ZW1wOworICAgIGd1aW50IGZsYWc7CisKKyAgICAvKiBvbmx5IG5lZWQgdG8gc3RvcmUgdGhlIGxlbmd0aCB3aGVuIGl0J3Mgbm90IHRoZSBsYXN0IGhlYWRlciAqLworICAgIGlmICghZ19saXN0X25leHQgKHdhbGspKQorICAgICAgYnJlYWs7CisKKyAgICBic2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisKKyAgICAvKiBjYWxjIHNpemUgKi8KKyAgICBzaXplID0gMDsKKyAgICBkbyB7CisgICAgICBzaXplKys7CisgICAgICBic2l6ZSA+Pj0gNzsKKyAgICB9IHdoaWxlIChic2l6ZSk7CisgICAgdGVtcCA9IHNpemU7CisKKyAgICBic2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisgICAgLyogd3JpdGUgdGhlIHNpemUgYmFja3dhcmRzICovCisgICAgZmxhZyA9IDA7CisgICAgd2hpbGUgKHNpemUpIHsKKyAgICAgIHNpemUtLTsKKyAgICAgIGRhdGFbc2l6ZV0gPSAoYnNpemUgJiAweDdmKSB8IGZsYWc7CisgICAgICBic2l6ZSA+Pj0gNzsKKyAgICAgIGZsYWcgPSAweDgwOyAgICAgICAgICAgICAgLyogRmxhZyBiaXQgb24gYWxsIGJ5dGVzIG9mIHRoZSBsZW5ndGggZXhjZXB0IHRoZSBsYXN0ICovCisgICAgfQorICAgIGRhdGEgKz0gdGVtcDsKKyAgfQorCisgIC8qIGNvcHkgaGVhZGVyIGRhdGEgKi8KKyAgZm9yICh3YWxrID0gcnRwdGhlb3JhcGF5LT5oZWFkZXJzOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBHU1RfQlVGRkVSX0NBU1QgKHdhbGstPmRhdGEpOworCisgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChidWYsIDAsIGRhdGEsIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikpOworICAgIGRhdGEgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKyAgfQorICBydHB0aGVvcmFwYXktPm5lZWRfaGVhZGVycyA9IEZBTFNFOworCisgIC8qIHNlcmlhbGl6ZSB0byBiYXNlNjQgKi8KKyAgY29uZmlndXJhdGlvbiA9IGdfYmFzZTY0X2VuY29kZSAoY29uZmlnLCBjb25maWdsZW4pOworCisgIC8qIHN0b3JlIGZvciBsYXRlciByZS1zZW5kaW5nICovCisgIGdfZnJlZSAocnRwdGhlb3JhcGF5LT5jb25maWdfZGF0YSk7CisgIHJ0cHRoZW9yYXBheS0+Y29uZmlnX3NpemUgPSBjb25maWdsZW4gLSA0IC0gMyAtIDI7CisgIHJ0cHRoZW9yYXBheS0+Y29uZmlnX2RhdGEgPSBnX21hbGxvYyAocnRwdGhlb3JhcGF5LT5jb25maWdfc2l6ZSk7CisgIHJ0cHRoZW9yYXBheS0+Y29uZmlnX2V4dHJhX2xlbiA9IGV4dHJhbGVuOworICBtZW1jcHkgKHJ0cHRoZW9yYXBheS0+Y29uZmlnX2RhdGEsIGNvbmZpZyArIDQgKyAzICsgMiwKKyAgICAgIHJ0cHRoZW9yYXBheS0+Y29uZmlnX3NpemUpOworCisgIGdfZnJlZSAoY29uZmlnKTsKKworICAvKiBjb25maWd1cmUgcGF5bG9hZGVyIHNldHRpbmdzICovCisgIHN3aXRjaCAocnRwdGhlb3JhcGF5LT5waXhlbF9mb3JtYXQpIHsKKyAgICBjYXNlIDI6CisgICAgICBzYW1wbGluZyA9ICJZQ2JDci00OjI6MiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBzYW1wbGluZyA9ICJZQ2JDci00OjQ6NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDA6CisgICAgZGVmYXVsdDoKKyAgICAgIHNhbXBsaW5nID0gIllDYkNyLTQ6MjowIjsKKyAgICAgIGJyZWFrOworICB9CisKKworICB3c3RyID0gZ19zdHJkdXBfcHJpbnRmICgiJWQiLCBydHB0aGVvcmFwYXktPndpZHRoKTsKKyAgaHN0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgcnRwdGhlb3JhcGF5LT5oZWlnaHQpOworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAoYmFzZXBheWxvYWQsICJ2aWRlbyIsIFRSVUUsICJUSEVPUkEiLAorICAgICAgOTAwMDApOworICByZXMgPQorICAgICAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLCAic2FtcGxpbmciLCBHX1RZUEVfU1RSSU5HLAorICAgICAgc2FtcGxpbmcsICJ3aWR0aCIsIEdfVFlQRV9TVFJJTkcsIHdzdHIsICJoZWlnaHQiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgaHN0ciwgImNvbmZpZ3VyYXRpb24iLCBHX1RZUEVfU1RSSU5HLCBjb25maWd1cmF0aW9uLCAiZGVsaXZlcnktbWV0aG9kIiwKKyAgICAgIEdfVFlQRV9TVFJJTkcsICJpbmxpbmUiLAorICAgICAgLyogZG9uJ3Qgc2V0IHRoZSBvdGhlciBkZWZhdWx0cyAKKyAgICAgICAqLworICAgICAgTlVMTCk7CisgIGdfZnJlZSAod3N0cik7CisgIGdfZnJlZSAoaHN0cik7CisgIGdfZnJlZSAoY29uZmlndXJhdGlvbik7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK25vX2hlYWRlcnM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHB0aGVvcmFwYXksICJmaW5pc2ggaGVhZGVycyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdGhlb3JhX3BheV9wYXJzZV9pZCAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwgZ3VpbnQ4ICogZGF0YSwKKyAgICBndWludCBzaXplKQoreworICBHc3RSdHBUaGVvcmFQYXkgKnJ0cHRoZW9yYXBheTsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0LCBwaXhlbF9mb3JtYXQ7CisKKyAgcnRwdGhlb3JhcGF5ID0gR1NUX1JUUF9USEVPUkFfUEFZIChiYXNlcGF5bG9hZCk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHNpemUgPCA0MikpCisgICAgZ290byB0b29fc2hvcnQ7CisKKyAgaWYgKEdfVU5MSUtFTFkgKG1lbWNtcCAoZGF0YSwgIlwyMDB0aGVvcmEiLCA3KSkpCisgICAgZ290byBpbnZhbGlkX3N0YXJ0OworICBkYXRhICs9IDc7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGRhdGFbMF0gIT0gMykpCisgICAgZ290byBpbnZhbGlkX3ZlcnNpb247CisgIGlmIChHX1VOTElLRUxZIChkYXRhWzFdICE9IDIpKQorICAgIGdvdG8gaW52YWxpZF92ZXJzaW9uOworICBkYXRhICs9IDM7CisKKyAgd2lkdGggPSBHU1RfUkVBRF9VSU5UMTZfQkUgKGRhdGEpIDw8IDQ7CisgIGRhdGEgKz0gMjsKKyAgaGVpZ2h0ID0gR1NUX1JFQURfVUlOVDE2X0JFIChkYXRhKSA8PCA0OworICBkYXRhICs9IDI5OworCisgIHBpeGVsX2Zvcm1hdCA9IChHU1RfUkVBRF9VSU5UOCAoZGF0YSkgPj4gMykgJiAweDAzOworCisgIC8qIHN0b3JlIHZhbHVlcyAqLworICBydHB0aGVvcmFwYXktPnBpeGVsX2Zvcm1hdCA9IHBpeGVsX2Zvcm1hdDsKKyAgcnRwdGhlb3JhcGF5LT53aWR0aCA9IHdpZHRoOworICBydHB0aGVvcmFwYXktPmhlaWdodCA9IGhlaWdodDsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3Rvb19zaG9ydDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChiYXNlcGF5bG9hZCwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwKKyAgICAgICAgKCJJZGVudGlmaWNhdGlvbiBwYWNrZXQgaXMgdG9vIHNob3J0LCBuZWVkIGF0IGxlYXN0IDQyLCBnb3QgJWQiLCBzaXplKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbnZhbGlkX3N0YXJ0OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGJhc2VwYXlsb2FkLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkludmFsaWQgaGVhZGVyIHN0YXJ0IGluIGlkZW50aWZpY2F0aW9uIHBhY2tldCIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfdmVyc2lvbjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChiYXNlcGF5bG9hZCwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJJbnZhbGlkIHZlcnNpb24iKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3RoZW9yYV9wYXlfcGF5bG9hZF9idWZmZXIgKEdzdFJ0cFRoZW9yYVBheSAqIHJ0cHRoZW9yYXBheSwgZ3VpbnQ4IFREVCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIsIGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsCisgICAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uLCBndWludCBub3RfaW5fbGVuZ3RoKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludCBuZXdzaXplOworICBndWludCBwYWNrZXRfbGVuOworICBHc3RDbG9ja1RpbWUgbmV3ZHVyYXRpb247CisgIGdib29sZWFuIGZsdXNoOworICBndWludCBwbGVuOworICBndWludDggKnBwb3MsICpwYXlsb2FkOworICBnYm9vbGVhbiBmcmFnbWVudGVkOworICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisKKyAgLyogc2l6ZSBpbmNyZWFzZXMgd2l0aCBwYWNrZXQgbGVuZ3RoIGFuZCAyIGJ5dGVzIHNpemUgZWFkZXIuICovCisgIG5ld2R1cmF0aW9uID0gcnRwdGhlb3JhcGF5LT5wYXlsb2FkX2R1cmF0aW9uOworICBpZiAoZHVyYXRpb24gIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICBuZXdkdXJhdGlvbiArPSBkdXJhdGlvbjsKKworICBuZXdzaXplID0gcnRwdGhlb3JhcGF5LT5wYXlsb2FkX3BvcyArIDIgKyBzaXplOworICBwYWNrZXRfbGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYWNrZXRfbGVuIChuZXdzaXplLCAwLCAwKTsKKworICAvKiBjaGVjayBidWZmZXIgZmlsbGVkIGFnYWluc3QgbGVuZ3RoIGFuZCBtYXggbGF0ZW5jeSAqLworICBmbHVzaCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX2lzX2ZpbGxlZCAoR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cHRoZW9yYXBheSksCisgICAgICBwYWNrZXRfbGVuLCBuZXdkdXJhdGlvbik7CisgIC8qIHdlIGNhbiBzdG9yZSB1cCB0byAxNSB0aGVvcmEgcGFja2V0cyBpbiBvbmUgUlRQIHBhY2tldC4gKi8KKyAgZmx1c2ggfD0gKHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9wa3RzID09IDE1KTsKKyAgLyogZmx1c2ggaWYgd2UgaGF2ZSBhIG5ldyBURFQgKi8KKyAgaWYgKHJ0cHRoZW9yYXBheS0+cGFja2V0KQorICAgIGZsdXNoIHw9IChydHB0aGVvcmFwYXktPnBheWxvYWRfVERUICE9IFREVCk7CisgIGlmIChmbHVzaCkKKyAgICByZXQgPSBnc3RfcnRwX3RoZW9yYV9wYXlfZmx1c2hfcGFja2V0IChydHB0aGVvcmFwYXkpOworCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBkb25lOworCisgIC8qIGNyZWF0ZSBuZXcgcGFja2V0IGlmIHdlIG11c3QgKi8KKyAgaWYgKCFydHB0aGVvcmFwYXktPnBhY2tldCkgeworICAgIGdzdF9ydHBfdGhlb3JhX3BheV9pbml0X3BhY2tldCAocnRwdGhlb3JhcGF5LCBURFQsIHRpbWVzdGFtcCk7CisgIH0KKworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKHJ0cHRoZW9yYXBheS0+cGFja2V0LCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKyAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKyAgcHBvcyA9IHBheWxvYWQgKyBydHB0aGVvcmFwYXktPnBheWxvYWRfcG9zOworICBmcmFnbWVudGVkID0gRkFMU0U7CisKKyAgLyogcHV0IGJ1ZmZlciBpbiBwYWNrZXQsIGl0IGVpdGhlciBmaXRzIGNvbXBsZXRlbHkgb3IgbmVlZHMgdG8gYmUgZnJhZ21lbnRlZAorICAgKiBvdmVyIG11bHRpcGxlIFJUUCBwYWNrZXRzLiAqLworICBkbyB7CisgICAgcGxlbiA9IE1JTiAocnRwdGhlb3JhcGF5LT5wYXlsb2FkX2xlZnQgLSAyLCBzaXplKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHRoZW9yYXBheSwgImFwcGVuZCAldSBieXRlcyIsIHBsZW4pOworCisgICAgLyogZGF0YSBpcyBjb3BpZWQgaW4gdGhlIHBheWxvYWQgd2l0aCBhIDIgYnl0ZSBsZW5ndGggaGVhZGVyICovCisgICAgcHBvc1swXSA9ICgocGxlbiAtIG5vdF9pbl9sZW5ndGgpID4+IDgpICYgMHhmZjsKKyAgICBwcG9zWzFdID0gKChwbGVuIC0gbm90X2luX2xlbmd0aCkgJiAweGZmKTsKKyAgICBpZiAocGxlbikKKyAgICAgIG1lbWNweSAoJnBwb3NbMl0sIGRhdGEsIHBsZW4pOworCisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgaWYgKCFydHB0aGVvcmFwYXktPnBhY2tldF9idWZmZXJzCisgICAgICAgICAgfHwgcnRwdGhlb3JhcGF5LT5wYWNrZXRfYnVmZmVycy0+ZGF0YSAhPSAoZ3BvaW50ZXIpIGJ1ZmZlcikKKyAgICAgICAgcnRwdGhlb3JhcGF5LT5wYWNrZXRfYnVmZmVycyA9CisgICAgICAgICAgICBnX2xpc3RfcHJlcGVuZCAocnRwdGhlb3JhcGF5LT5wYWNrZXRfYnVmZmVycywKKyAgICAgICAgICAgIGdzdF9idWZmZXJfcmVmIChidWZmZXIpKTsKKyAgICB9IGVsc2UgeworICAgICAgR0xpc3QgKmw7CisKKyAgICAgIGZvciAobCA9IHJ0cHRoZW9yYXBheS0+aGVhZGVyczsgbDsgbCA9IGwtPm5leHQpCisgICAgICAgIHJ0cHRoZW9yYXBheS0+cGFja2V0X2J1ZmZlcnMgPQorICAgICAgICAgICAgZ19saXN0X3ByZXBlbmQgKHJ0cHRoZW9yYXBheS0+cGFja2V0X2J1ZmZlcnMsCisgICAgICAgICAgICBnc3RfYnVmZmVyX3JlZiAobC0+ZGF0YSkpOworICAgIH0KKworICAgIC8qIG9ubHkgZmlyc3QgKG9ubHkpIGNvbmZpZ3VyYXRpb24gY3V0cyBsZW5ndGggZmllbGQgKi8KKyAgICAvKiBOT1RFOiBzcGVjIChpZiBhbnkpIGlzIG5vdCBjbGVhciBvbiB0aGlzIC4uLiAqLworICAgIG5vdF9pbl9sZW5ndGggPSAwOworCisgICAgc2l6ZSAtPSBwbGVuOworICAgIGRhdGEgKz0gcGxlbjsKKworICAgIHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9wb3MgKz0gcGxlbiArIDI7CisgICAgcnRwdGhlb3JhcGF5LT5wYXlsb2FkX2xlZnQgLT0gcGxlbiArIDI7CisKKyAgICBpZiAoZnJhZ21lbnRlZCkgeworICAgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgLyogbGFzdCBmcmFnbWVudCwgc2V0IEYgdG8gMHgzLiAqLworICAgICAgICBydHB0aGVvcmFwYXktPnBheWxvYWRfRiA9IDB4MzsKKyAgICAgIGVsc2UKKyAgICAgICAgLyogZnJhZ21lbnQgY29udGludWVzLCBzZXQgRiB0byAweDIuICovCisgICAgICAgIHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9GID0gMHgyOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgLyogZnJhZ21lbnRlZCBwYWNrZXQgc3RhcnRzLCBzZXQgRiB0byAweDEsIG1hcmsgb3Vyc2VsdmVzIGFzCisgICAgICAgICAqIGZyYWdtZW50ZWQuICovCisgICAgICAgIHJ0cHRoZW9yYXBheS0+cGF5bG9hZF9GID0gMHgxOworICAgICAgICBmcmFnbWVudGVkID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGZyYWdtZW50ZWQpIHsKKyAgICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgICAgIC8qIGZyYWdtZW50ZWQgcGFja2V0cyBhcmUgYWx3YXlzIGZsdXNoZWQgYW5kIGhhdmUgcHRrcyBvZiAwICovCisgICAgICBydHB0aGVvcmFwYXktPnBheWxvYWRfcGt0cyA9IDA7CisgICAgICByZXQgPSBnc3RfcnRwX3RoZW9yYV9wYXlfZmx1c2hfcGFja2V0IChydHB0aGVvcmFwYXkpOworCisgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgLyogc3RhcnQgbmV3IHBhY2tldCBhbmQgZ2V0IHBvaW50ZXJzLiBURFQgc3RheXMgdGhlIHNhbWUuICovCisgICAgICAgIGdzdF9ydHBfdGhlb3JhX3BheV9pbml0X3BhY2tldCAocnRwdGhlb3JhcGF5LAorICAgICAgICAgICAgcnRwdGhlb3JhcGF5LT5wYXlsb2FkX1REVCwgdGltZXN0YW1wKTsKKyAgICAgICAgZ3N0X3J0cF9idWZmZXJfbWFwIChydHB0aGVvcmFwYXktPnBhY2tldCwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisgICAgICAgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisgICAgICAgIHBwb3MgPSBwYXlsb2FkICsgcnRwdGhlb3JhcGF5LT5wYXlsb2FkX3BvczsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogdW5mcmFnbWVudGVkIHBhY2tldCwgdXBkYXRlIHN0YXRzIGZvciBuZXh0IHBhY2tldCwgc2l6ZSA9PSAwIGFuZCB3ZQorICAgICAgICogZXhpdCB0aGUgd2hpbGUgbG9vcCAqLworICAgICAgcnRwdGhlb3JhcGF5LT5wYXlsb2FkX3BrdHMrKzsKKyAgICAgIGlmIChkdXJhdGlvbiAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgICAgICBydHB0aGVvcmFwYXktPnBheWxvYWRfZHVyYXRpb24gKz0gZHVyYXRpb247CisgICAgfQorICB9IHdoaWxlIChzaXplICYmIHJldCA9PSBHU1RfRkxPV19PSyk7CisKKyAgaWYgKHJ0cC5idWZmZXIpCisgICAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworZG9uZToKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF90aGVvcmFfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBUaGVvcmFQYXkgKnJ0cHRoZW9yYXBheTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdE1hcEluZm8gbWFwOworICBnc2l6ZSBzaXplOworICBndWludDggKmRhdGE7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbiwgdGltZXN0YW1wOworICBndWludDggVERUOworICBnYm9vbGVhbiBrZXlmcmFtZSA9IEZBTFNFOworCisgIHJ0cHRoZW9yYXBheSA9IEdTVF9SVFBfVEhFT1JBX1BBWSAoYmFzZXBheWxvYWQpOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgc2l6ZSA9IG1hcC5zaXplOworICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHRoZW9yYXBheSwgInNpemUgJSIgR19HU0laRV9GT1JNQVQKKyAgICAgICIsIGR1cmF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVCwgc2l6ZSwgR1NUX1RJTUVfQVJHUyAoZHVyYXRpb24pKTsKKworICAvKiBmaW5kIHBhY2tldCB0eXBlICovCisgIGlmIChzaXplID09IDApIHsKKyAgICBURFQgPSAwOworICAgIGtleWZyYW1lID0gRkFMU0U7CisgIH0gZWxzZSBpZiAoZGF0YVswXSAmIDB4ODApIHsKKyAgICAvKiBoZWFkZXIgKi8KKyAgICBpZiAoZGF0YVswXSA9PSAweDgwKSB7CisgICAgICAvKiBpZGVudGlmaWNhdGlvbiwgd2UgbmVlZCB0byBwYXJzZSB0aGlzIGluIG9yZGVyIHRvIGdldCB0aGUgY2xvY2sgcmF0ZS4KKyAgICAgICAqLworICAgICAgaWYgKEdfVU5MSUtFTFkgKCFnc3RfcnRwX3RoZW9yYV9wYXlfcGFyc2VfaWQgKGJhc2VwYXlsb2FkLCBkYXRhLCBzaXplKSkpCisgICAgICAgIGdvdG8gcGFyc2VfaWRfZmFpbGVkOworICAgICAgVERUID0gMTsKKyAgICB9IGVsc2UgaWYgKGRhdGFbMF0gPT0gMHg4MSkgeworICAgICAgLyogY29tbWVudCAqLworICAgICAgVERUID0gMjsKKyAgICB9IGVsc2UgaWYgKGRhdGFbMF0gPT0gMHg4MikgeworICAgICAgLyogc2V0dXAgKi8KKyAgICAgIFREVCA9IDE7CisgICAgfSBlbHNlCisgICAgICBnb3RvIHVua25vd25faGVhZGVyOworICB9IGVsc2UgeworICAgIC8qIGRhdGEgKi8KKyAgICBURFQgPSAwOworICAgIGtleWZyYW1lID0gKChkYXRhWzBdICYgMHg0MCkgPT0gMCk7CisgIH0KKworICAvKiB3ZSBuZWVkIHRvIGNvbGxlY3QgdGhlIGhlYWRlcnMgYW5kIGNvbnN0cnVjdCBhIGNvbmZpZyBzdHJpbmcgZnJvbSB0aGVtICovCisgIGlmIChURFQgIT0gMCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHRoZW9yYXBheSwgImNvbGxlY3RpbmcgaGVhZGVyLCBidWZmZXIgJXAiLCBidWZmZXIpOworICAgIC8qIGFwcGVuZCBoZWFkZXIgdG8gdGhlIGxpc3Qgb2YgaGVhZGVycyAqLworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgcnRwdGhlb3JhcGF5LT5oZWFkZXJzID0gZ19saXN0X2FwcGVuZCAocnRwdGhlb3JhcGF5LT5oZWFkZXJzLCBidWZmZXIpOworICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIGdvdG8gZG9uZTsKKyAgfSBlbHNlIGlmIChydHB0aGVvcmFwYXktPmhlYWRlcnMgJiYgcnRwdGhlb3JhcGF5LT5uZWVkX2hlYWRlcnMpIHsKKyAgICBpZiAoIWdzdF9ydHBfdGhlb3JhX3BheV9maW5pc2hfaGVhZGVycyAoYmFzZXBheWxvYWQpKQorICAgICAgZ290byBoZWFkZXJfZXJyb3I7CisgIH0KKworICAvKiB0aGVyZSBpcyBhIGNvbmZpZyByZXF1ZXN0LCBzZWUgaWYgd2UgbmVlZCB0byBpbnNlcnQgaXQgKi8KKyAgaWYgKGtleWZyYW1lICYmIChydHB0aGVvcmFwYXktPmNvbmZpZ19pbnRlcnZhbCA+IDApICYmCisgICAgICBydHB0aGVvcmFwYXktPmNvbmZpZ19kYXRhKSB7CisgICAgZ2Jvb2xlYW4gc2VuZF9jb25maWcgPSBGQUxTRTsKKworICAgIGlmIChydHB0aGVvcmFwYXktPmxhc3RfY29uZmlnICE9IC0xKSB7CisgICAgICBndWludDY0IGRpZmY7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHB0aGVvcmFwYXksCisgICAgICAgICAgIm5vdyAlIiBHU1RfVElNRV9GT1JNQVQgIiwgbGFzdCBWT1AtSSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSwgR1NUX1RJTUVfQVJHUyAocnRwdGhlb3JhcGF5LT5sYXN0X2NvbmZpZykpOworCisgICAgICAvKiBjYWxjdWxhdGUgZGlmZiBiZXR3ZWVuIGxhc3QgY29uZmlnIGluIG1pbGxpc2Vjb25kcyAqLworICAgICAgaWYgKHRpbWVzdGFtcCA+IHJ0cHRoZW9yYXBheS0+bGFzdF9jb25maWcpIHsKKyAgICAgICAgZGlmZiA9IHRpbWVzdGFtcCAtIHJ0cHRoZW9yYXBheS0+bGFzdF9jb25maWc7CisgICAgICB9IGVsc2UgeworICAgICAgICBkaWZmID0gMDsKKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwdGhlb3JhcGF5LAorICAgICAgICAgICJpbnRlcnZhbCBzaW5jZSBsYXN0IGNvbmZpZyAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGRpZmYpKTsKKworICAgICAgLyogYmlnZ2VyIHRoYW4gaW50ZXJ2YWwsIHF1ZXVlIGNvbmZpZyAqLworICAgICAgLyogRklYTUUgc2hvdWxkIGNvbnZlcnQgdGltZXN0YW1wcyB0byBydW5uaW5nIHRpbWUgKi8KKyAgICAgIGlmIChHU1RfVElNRV9BU19TRUNPTkRTIChkaWZmKSA+PSBydHB0aGVvcmFwYXktPmNvbmZpZ19pbnRlcnZhbCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHB0aGVvcmFwYXksICJ0aW1lIHRvIHNlbmQgY29uZmlnIik7CisgICAgICAgIHNlbmRfY29uZmlnID0gVFJVRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogbm8ga25vd24gcHJldmlvdXMgY29uZmlnIHRpbWUsIHNlbmQgbm93ICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHB0aGVvcmFwYXksICJubyBwcmV2aW91cyBjb25maWcgdGltZSwgc2VuZCBub3ciKTsKKyAgICAgIHNlbmRfY29uZmlnID0gVFJVRTsKKyAgICB9CisKKyAgICBpZiAoc2VuZF9jb25maWcpIHsKKyAgICAgIC8qIHdlIG5lZWQgdG8gc2VuZCBjb25maWcgbm93IGZpcnN0ICovCisgICAgICAvKiBkaWZmZXJlbnQgVERUIHR5cGUgZm9yY2VzIGZsdXNoICovCisgICAgICBnc3RfcnRwX3RoZW9yYV9wYXlfcGF5bG9hZF9idWZmZXIgKHJ0cHRoZW9yYXBheSwgMSwKKyAgICAgICAgICBOVUxMLCBydHB0aGVvcmFwYXktPmNvbmZpZ19kYXRhLCBydHB0aGVvcmFwYXktPmNvbmZpZ19zaXplLAorICAgICAgICAgIHRpbWVzdGFtcCwgR1NUX0NMT0NLX1RJTUVfTk9ORSwgcnRwdGhlb3JhcGF5LT5jb25maWdfZXh0cmFfbGVuKTsKKworICAgICAgaWYgKHRpbWVzdGFtcCAhPSAtMSkgeworICAgICAgICBydHB0aGVvcmFwYXktPmxhc3RfY29uZmlnID0gdGltZXN0YW1wOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldCA9CisgICAgICBnc3RfcnRwX3RoZW9yYV9wYXlfcGF5bG9hZF9idWZmZXIgKHJ0cHRoZW9yYXBheSwgVERULCBidWZmZXIsIGRhdGEsIHNpemUsCisgICAgICB0aW1lc3RhbXAsIGR1cmF0aW9uLCAwKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCitkb25lOgorICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworcGFyc2VfaWRfZmFpbGVkOgorICB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQordW5rbm93bl9oZWFkZXI6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHB0aGVvcmFwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiSWdub3JpbmcgdW5rbm93biBoZWFkZXIgcmVjZWl2ZWQiKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQoraGVhZGVyX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwdGhlb3JhcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkVycm9yIGluaXRpYWxpemluZyBoZWFkZXIgY29uZmlnIikpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3RoZW9yYV9wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBUaGVvcmFQYXkgKnJ0cHRoZW9yYXBheSA9IEdTVF9SVFBfVEhFT1JBX1BBWSAocGF5bG9hZCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9ydHBfdGhlb3JhX3BheV9jbGVhcl9wYWNrZXQgKHJ0cHRoZW9yYXBheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgLyogZmFsc2UgdG8gbGV0IHBhcmVudCBoYW5kbGUgZXZlbnQgYXMgd2VsbCAqLworICByZXR1cm4gR1NUX1JUUF9CQVNFX1BBWUxPQURfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKHBheWxvYWQsIGV2ZW50KTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX3RoZW9yYV9wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSdHBUaGVvcmFQYXkgKnJ0cHRoZW9yYXBheTsKKworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwdGhlb3JhcGF5ID0gR1NUX1JUUF9USEVPUkFfUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3J0cF90aGVvcmFfcGF5X2NsZWFudXAgKHJ0cHRoZW9yYXBheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdGhlb3JhX3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwVGhlb3JhUGF5ICpydHB0aGVvcmFwYXk7CisKKyAgcnRwdGhlb3JhcGF5ID0gR1NUX1JUUF9USEVPUkFfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DT05GSUdfSU5URVJWQUw6CisgICAgICBydHB0aGVvcmFwYXktPmNvbmZpZ19pbnRlcnZhbCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF90aGVvcmFfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBUaGVvcmFQYXkgKnJ0cHRoZW9yYXBheTsKKworICBydHB0aGVvcmFwYXkgPSBHU1RfUlRQX1RIRU9SQV9QQVkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0NPTkZJR19JTlRFUlZBTDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHB0aGVvcmFwYXktPmNvbmZpZ19pbnRlcnZhbCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfdGhlb3JhX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHRoZW9yYXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9USEVPUkFfUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdGhlb3JhcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYmMwMWQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHRoZW9yYXBheS5oCkBAIC0wLDAgKzEsODYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9USEVPUkFfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfVEhFT1JBX1BBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VwYXlsb2FkLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1RIRU9SQV9QQVkgXAorICAoZ3N0X3J0cF90aGVvcmFfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfVEhFT1JBX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9USEVPUkFfUEFZLEdzdFJ0cFRoZW9yYVBheSkpCisjZGVmaW5lIEdTVF9SVFBfVEhFT1JBX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfVEhFT1JBX1BBWSxHc3RSdHBUaGVvcmFQYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfVEhFT1JBX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9USEVPUkFfUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9USEVPUkFfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9USEVPUkFfUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFRoZW9yYVBheSBHc3RSdHBUaGVvcmFQYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwVGhlb3JhUGF5Q2xhc3MgR3N0UnRwVGhlb3JhUGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwVGhlb3JhUGF5Cit7CisgIEdzdFJUUEJhc2VQYXlsb2FkIHBheWxvYWQ7CisKKyAgLyogdGhlIGhlYWRlcnMgKi8KKyAgZ2Jvb2xlYW4gICAgICBuZWVkX2hlYWRlcnM7CisgIEdMaXN0ICAgICAgICAqaGVhZGVyczsKKworICAvKiBxdWV1ZXMgb2YgYnVmZmVycyBhbG9uZyB3aXRoIHNvbWUgc3RhdHMuICovCisgIEdzdEJ1ZmZlciAgICAqcGFja2V0OworICBHTGlzdCAgICAgICAgKnBhY2tldF9idWZmZXJzOworICBndWludCAgICAgICAgIHBheWxvYWRfcG9zOworICBndWludCAgICAgICAgIHBheWxvYWRfbGVmdDsKKyAgZ3VpbnQzMiAgICAgICBwYXlsb2FkX2lkZW50OworICBndWludDggICAgICAgIHBheWxvYWRfRjsKKyAgZ3VpbnQ4ICAgICAgICBwYXlsb2FkX1REVDsKKyAgZ3VpbnQgICAgICAgICBwYXlsb2FkX3BrdHM7CisgIEdzdENsb2NrVGltZSAgcGF5bG9hZF90aW1lc3RhbXA7CisgIEdzdENsb2NrVGltZSAgcGF5bG9hZF9kdXJhdGlvbjsKKworICAvKiBjb25maWcgKHJlLXNlbmRpbmcpICovCisgIGd1aW50OCAgICAgICAqY29uZmlnX2RhdGE7CisgIGd1aW50ICAgICAgICAgY29uZmlnX3NpemU7CisgIGd1aW50ICAgICAgICAgY29uZmlnX2V4dHJhX2xlbjsKKyAgZ3VpbnQgICAgICAgICBjb25maWdfaW50ZXJ2YWw7CisgIEdzdENsb2NrVGltZSAgbGFzdF9jb25maWc7CisKKyAgZ2ludCAgICAgICAgICBwaXhlbF9mb3JtYXQ7CisgIGdpbnQgICAgICAgICAgd2lkdGg7CisgIGdpbnQgICAgICAgICAgaGVpZ2h0OworfTsKKworc3RydWN0IF9Hc3RSdHBUaGVvcmFQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfdGhlb3JhX3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfdGhlb3JhX3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9USEVPUkFfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHB1dGlscy5jIGIvZ3N0L3J0cC9nc3RydHB1dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NGQxYjMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHV0aWxzLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDE1IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHUXVhcmsgY29weV90YWc7Cit9IENvcHlNZXRhRGF0YTsKKworR1F1YXJrIHJ0cF9xdWFya19tZXRhX3RhZ192aWRlbzsKK0dRdWFyayBydHBfcXVhcmtfbWV0YV90YWdfYXVkaW87CisKK3N0YXRpYyBnYm9vbGVhbgorZm9yZWFjaF9tZXRhZGF0YV9jb3B5IChHc3RCdWZmZXIgKiBpbmJ1ZiwgR3N0TWV0YSAqKiBtZXRhLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIENvcHlNZXRhRGF0YSAqZGF0YSA9IHVzZXJfZGF0YTsKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IGRhdGEtPmVsZW1lbnQ7CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gZGF0YS0+b3V0YnVmOworICBHUXVhcmsgY29weV90YWcgPSBkYXRhLT5jb3B5X3RhZzsKKyAgY29uc3QgR3N0TWV0YUluZm8gKmluZm8gPSAoKm1ldGEpLT5pbmZvOworICBjb25zdCBnY2hhciAqY29uc3QgKnRhZ3MgPSBnc3RfbWV0YV9hcGlfdHlwZV9nZXRfdGFncyAoaW5mby0+YXBpKTsKKworICBpZiAoIXRhZ3MgfHwgKGNvcHlfdGFnICE9IDAgJiYgZ19zdHJ2X2xlbmd0aCAoKGdjaGFyICoqKSB0YWdzKSA9PSAxCisgICAgICAgICAgJiYgZ3N0X21ldGFfYXBpX3R5cGVfaGFzX3RhZyAoaW5mby0+YXBpLCBjb3B5X3RhZykpKSB7CisgICAgR3N0TWV0YVRyYW5zZm9ybUNvcHkgY29weV9kYXRhID0geyBGQUxTRSwgMCwgLTEgfTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChlbGVtZW50LCAiY29weSBtZXRhZGF0YSAlcyIsIGdfdHlwZV9uYW1lIChpbmZvLT5hcGkpKTsKKyAgICAvKiBzaW1wbHkgY29weSB0aGVuICovCisgICAgaW5mby0+dHJhbnNmb3JtX2Z1bmMgKG91dGJ1ZiwgKm1ldGEsIGluYnVmLAorICAgICAgICBfZ3N0X21ldGFfdHJhbnNmb3JtX2NvcHksICZjb3B5X2RhdGEpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGVsZW1lbnQsICJub3QgY29weWluZyBtZXRhZGF0YSAlcyIsCisgICAgICAgIGdfdHlwZV9uYW1lIChpbmZvLT5hcGkpKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBUT0RPOiBTaG91bGQgcHJvYmFibHkgbWFrZSBjb3B5X3RhZyBhbiBhcnJheSBhdCBzb21lIHBvaW50ICovCit2b2lkCitnc3RfcnRwX2NvcHlfbWV0YSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEJ1ZmZlciAqIG91dGJ1ZiwgR3N0QnVmZmVyICogaW5idWYsCisgICAgR1F1YXJrIGNvcHlfdGFnKQoreworICBDb3B5TWV0YURhdGEgZGF0YSA9IHsgZWxlbWVudCwgb3V0YnVmLCBjb3B5X3RhZyB9OworCisgIGdzdF9idWZmZXJfZm9yZWFjaF9tZXRhIChpbmJ1ZiwgZm9yZWFjaF9tZXRhZGF0YV9jb3B5LCAmZGF0YSk7Cit9CisKK3ZvaWQKK2dzdF9ydHBfY29weV92aWRlb19tZXRhIChncG9pbnRlciBlbGVtZW50LCBHc3RCdWZmZXIgKiBvdXRidWYsCisgICAgR3N0QnVmZmVyICogaW5idWYpCit7CisgIGdzdF9ydHBfY29weV9tZXRhIChlbGVtZW50LCBvdXRidWYsIGluYnVmLCBydHBfcXVhcmtfbWV0YV90YWdfdmlkZW8pOworfQorCit2b2lkCitnc3RfcnRwX2NvcHlfYXVkaW9fbWV0YSAoZ3BvaW50ZXIgZWxlbWVudCwgR3N0QnVmZmVyICogb3V0YnVmLAorICAgIEdzdEJ1ZmZlciAqIGluYnVmKQoreworICBnc3RfcnRwX2NvcHlfbWV0YSAoZWxlbWVudCwgb3V0YnVmLCBpbmJ1ZiwgcnRwX3F1YXJrX21ldGFfdGFnX2F1ZGlvKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudDsKKyAgR1F1YXJrIGtlZXBfdGFnOworfSBEcm9wTWV0YURhdGE7CisKK3N0YXRpYyBnYm9vbGVhbgorZm9yZWFjaF9tZXRhZGF0YV9kcm9wIChHc3RCdWZmZXIgKiBpbmJ1ZiwgR3N0TWV0YSAqKiBtZXRhLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIERyb3BNZXRhRGF0YSAqZGF0YSA9IHVzZXJfZGF0YTsKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IGRhdGEtPmVsZW1lbnQ7CisgIEdRdWFyayBrZWVwX3RhZyA9IGRhdGEtPmtlZXBfdGFnOworICBjb25zdCBHc3RNZXRhSW5mbyAqaW5mbyA9ICgqbWV0YSktPmluZm87CisgIGNvbnN0IGdjaGFyICpjb25zdCAqdGFncyA9IGdzdF9tZXRhX2FwaV90eXBlX2dldF90YWdzIChpbmZvLT5hcGkpOworCisgIGlmICghdGFncyB8fCAoa2VlcF90YWcgIT0gMCAmJiBnX3N0cnZfbGVuZ3RoICgoZ2NoYXIgKiopIHRhZ3MpID09IDEKKyAgICAgICAgICAmJiBnc3RfbWV0YV9hcGlfdHlwZV9oYXNfdGFnIChpbmZvLT5hcGksIGtlZXBfdGFnKSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChlbGVtZW50LCAia2VlcGluZyBtZXRhZGF0YSAlcyIsIGdfdHlwZV9uYW1lIChpbmZvLT5hcGkpKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChlbGVtZW50LCAiZHJvcHBpbmcgbWV0YWRhdGEgJXMiLCBnX3R5cGVfbmFtZSAoaW5mby0+YXBpKSk7CisgICAgKm1ldGEgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFRPRE86IFNob3VsZCBwcm9iYWJseSBtYWtlIGtlZXBfdGFnIGFuIGFycmF5IGF0IHNvbWUgcG9pbnQgKi8KK3ZvaWQKK2dzdF9ydHBfZHJvcF9tZXRhIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0QnVmZmVyICogYnVmLCBHUXVhcmsga2VlcF90YWcpCit7CisgIERyb3BNZXRhRGF0YSBkYXRhID0geyBlbGVtZW50LCBrZWVwX3RhZyB9OworCisgIGdzdF9idWZmZXJfZm9yZWFjaF9tZXRhIChidWYsIGZvcmVhY2hfbWV0YWRhdGFfZHJvcCwgJmRhdGEpOworfQorCit2b2lkCitnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKGdwb2ludGVyIGVsZW1lbnQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgZ3N0X3J0cF9kcm9wX21ldGEgKGVsZW1lbnQsIGJ1ZiwgcnRwX3F1YXJrX21ldGFfdGFnX2F1ZGlvKTsKK30KKwordm9pZAorZ3N0X3J0cF9kcm9wX25vbl92aWRlb19tZXRhIChncG9pbnRlciBlbGVtZW50LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIGdzdF9ydHBfZHJvcF9tZXRhIChlbGVtZW50LCBidWYsIHJ0cF9xdWFya19tZXRhX3RhZ192aWRlbyk7Cit9CisKKy8qIFN0b2xlbiBmcm9tIGJhZC9nc3QvbXBlZ3RzZGVtdXgvcGF5bG9hZGVyX3BhcnNlcnMuYyAqLworLyogdmFyaWFibGUgbGVuZ3RoIEV4cC1Hb2xvbWIgcGFyc2luZyBhY2NvcmRpbmcgdG8gSC4yNjUgc3BlYyBzZWN0aW9uIDkuMiovCitnYm9vbGVhbgorZ3N0X3J0cF9yZWFkX2dvbG9tYiAoR3N0Qml0UmVhZGVyICogYnIsIGd1aW50MzIgKiB2YWx1ZSkKK3sKKyAgZ3VpbnQ4IGIsIGxlYWRpbmdfemVyb3MgPSAtMTsKKyAgKnZhbHVlID0gMTsKKworICBmb3IgKGIgPSAwOyAhYjsgbGVhZGluZ196ZXJvcysrKSB7CisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoYnIsICZiLCAxKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAqdmFsdWUgKj0gMjsKKyAgfQorCisgICp2YWx1ZSA9ICgqdmFsdWUgPj4gMSkgLSAxOworICBpZiAobGVhZGluZ196ZXJvcyA+IDApIHsKKyAgICBndWludDMyIHRtcCA9IDA7CisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzIgKGJyLCAmdG1wLCBsZWFkaW5nX3plcm9zKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAqdmFsdWUgKz0gdG1wOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHV0aWxzLmggYi9nc3QvcnRwL2dzdHJ0cHV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxOTVmMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwdXRpbHMuaApAQCAtMCwwICsxLDU0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1VUSUxTX0hfXworI2RlZmluZSBfX0dTVF9SVFBfVVRJTFNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Yml0cmVhZGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworR19HTlVDX0lOVEVSTkFMCit2b2lkIGdzdF9ydHBfY29weV9tZXRhIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0QnVmZmVyICpvdXRidWYsIEdzdEJ1ZmZlciAqaW5idWYsIEdRdWFyayBjb3B5X3RhZyk7CisKK0dfR05VQ19JTlRFUk5BTAordm9pZCBnc3RfcnRwX2NvcHlfYXVkaW9fbWV0YSAoZ3BvaW50ZXIgZWxlbWVudCwgR3N0QnVmZmVyICpvdXRidWYsIEdzdEJ1ZmZlciAqaW5idWYpOworCitHX0dOVUNfSU5URVJOQUwKK3ZvaWQgZ3N0X3J0cF9jb3B5X3ZpZGVvX21ldGEgKGdwb2ludGVyIGVsZW1lbnQsIEdzdEJ1ZmZlciAqb3V0YnVmLCBHc3RCdWZmZXIgKmluYnVmKTsKKworR19HTlVDX0lOVEVSTkFMCit2b2lkIGdzdF9ydHBfZHJvcF9tZXRhIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0QnVmZmVyICpidWYsIEdRdWFyayBrZWVwX3RhZyk7CisKK0dfR05VQ19JTlRFUk5BTAordm9pZCBnc3RfcnRwX2Ryb3Bfbm9uX2F1ZGlvX21ldGEgKGdwb2ludGVyIGVsZW1lbnQsIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK0dfR05VQ19JTlRFUk5BTAordm9pZCBnc3RfcnRwX2Ryb3Bfbm9uX3ZpZGVvX21ldGEgKGdwb2ludGVyIGVsZW1lbnQsIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK0dfR05VQ19JTlRFUk5BTAorZ2Jvb2xlYW4gZ3N0X3J0cF9yZWFkX2dvbG9tYiAoR3N0Qml0UmVhZGVyICogYnIsIGd1aW50MzIgKiB2YWx1ZSk7CisKK0dfR05VQ19JTlRFUk5BTCBleHRlcm4gR1F1YXJrIHJ0cF9xdWFya19tZXRhX3RhZ192aWRlbzsKK0dfR05VQ19JTlRFUk5BTCBleHRlcm4gR1F1YXJrIHJ0cF9xdWFya19tZXRhX3RhZ19hdWRpbzsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUUF9VVElMU19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwdm9yYmlzZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjI3NTBhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5jCkBAIC0wLDAgKzEsNjg4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvdGFnL3RhZy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnc3RydHB2b3JiaXNkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cHZvcmJpc2RlcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHB2b3JiaXNkZXBheV9kZWJ1ZykKKworLyogcmVmZXJlbmNlczoKKyAqIGh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzUyMTUudHh0CisgKi8KKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfdm9yYmlzX2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgWzEsIE1BWCBdLCAiICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJWT1JCSVNcIiIKKyAgICAgICAgLyogQWxsIHJlcXVpcmVkIHBhcmFtZXRlcnMgCisgICAgICAgICAqCisgICAgICAgICAqICJlbmNvZGluZy1wYXJhbXMgPSAoc3RyaW5nKSA8bnVtIGNoYW5uZWxzPiIKKyAgICAgICAgICogImNvbmZpZ3VyYXRpb24gPSAoc3RyaW5nKSBBTlkiIAorICAgICAgICAgKi8KKyAgICApCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfdm9yYmlzX2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC12b3JiaXMiKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF92b3JiaXNfZGVwYXlfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwVm9yYmlzRGVwYXksIGdzdF9ydHBfdm9yYmlzX2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3ZvcmJpc19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfdm9yYmlzX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF92b3JiaXNfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF92b3JiaXNfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdm9yYmlzX2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cFZvcmJpc0RlcGF5Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZWRlcGF5bG9hZF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MgPSAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF92b3JiaXNfZGVwYXlfZmluYWxpemU7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF92b3JiaXNfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfdm9yYmlzX2RlcGF5X3Byb2Nlc3M7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF92b3JiaXNfZGVwYXlfc2V0Y2FwczsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3ZvcmJpc19kZXBheV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF92b3JiaXNfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBWb3JiaXMgZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIFZvcmJpcyBBdWRpbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgNTIxNSkiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cHZvcmJpc2RlcGF5X2RlYnVnLCAicnRwdm9yYmlzZGVwYXkiLCAwLAorICAgICAgIlZvcmJpcyBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdm9yYmlzX2RlcGF5X2luaXQgKEdzdFJ0cFZvcmJpc0RlcGF5ICogcnRwdm9yYmlzZGVwYXkpCit7CisgIHJ0cHZvcmJpc2RlcGF5LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9jb25maWcgKEdzdFJ0cFZvcmJpc0NvbmZpZyAqIGNvbmYpCit7CisgIGdfbGlzdF9mcmVlX2Z1bGwgKGNvbmYtPmhlYWRlcnMsIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgIGdfZnJlZSAoY29uZik7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2luZGVudHMgKEdzdFJ0cFZvcmJpc0RlcGF5ICogcnRwdm9yYmlzZGVwYXkpCit7CisgIGdfbGlzdF9mcmVlX2Z1bGwgKHJ0cHZvcmJpc2RlcGF5LT5jb25maWdzLCAoR0Rlc3Ryb3lOb3RpZnkpIGZyZWVfY29uZmlnKTsKKyAgcnRwdm9yYmlzZGVwYXktPmNvbmZpZ3MgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92b3JiaXNfZGVwYXlfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cFZvcmJpc0RlcGF5ICpydHB2b3JiaXNkZXBheSA9IEdTVF9SVFBfVk9SQklTX0RFUEFZIChvYmplY3QpOworCisgIGdfb2JqZWN0X3VucmVmIChydHB2b3JiaXNkZXBheS0+YWRhcHRlcik7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCisvKiB0YWtlcyBvd25lcnNoaXAgb2YgY29uZmJ1ZiAqLworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3ZvcmJpc19kZXBheV9wYXJzZV9jb25maWd1cmF0aW9uIChHc3RSdHBWb3JiaXNEZXBheSAqIHJ0cHZvcmJpc2RlcGF5LAorICAgIEdzdEJ1ZmZlciAqIGNvbmZidWYpCit7CisgIEdzdEJ1ZmZlciAqYnVmOworICBndWludDMyIG51bV9oZWFkZXJzOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQ4ICpkYXRhOworICBnc2l6ZSBzaXplOworICBndWludCBvZmZzZXQ7CisgIGdpbnQgaSwgajsKKworICBnc3RfYnVmZmVyX21hcCAoY29uZmJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBzaXplID0gbWFwLnNpemU7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwdm9yYmlzZGVwYXksICJjb25maWcgc2l6ZSAlIiBHX0dTSVpFX0ZPUk1BVCwgc2l6ZSk7CisKKyAgLyogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBwYWNrZWQgaGVhZGVycyAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2VkIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2VkIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICovCisgIGlmIChzaXplIDwgNCkKKyAgICBnb3RvIHRvb19zbWFsbDsKKworICBudW1faGVhZGVycyA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoZGF0YSk7CisgIHNpemUgLT0gNDsKKyAgZGF0YSArPSA0OworICBvZmZzZXQgPSA0OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHZvcmJpc2RlcGF5LCAiaGF2ZSAldSBoZWFkZXJzIiwgbnVtX2hlYWRlcnMpOworCisgIC8qICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICBJZGVudCAgICAgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgIHwgbi4gb2YgaGVhZGVycyB8ICAgIGxlbmd0aDEgICAgfCAgICBsZW5ndGgyICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgIHwgICAgICAgICAgICAgSWRlbnRpZmljYXRpb24gSGVhZGVyICAgICAgICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgIHwgICAgICAgICBDb21tZW50IEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50IEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dXAgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogLi4gICAgICAgICAgICAgICAgICAgICAgICAgU2V0dXAgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1faGVhZGVyczsgaSsrKSB7CisgICAgZ3VpbnQzMiBpZGVudDsKKyAgICBndWludDE2IGxlbmd0aDsKKyAgICBndWludDggbl9oZWFkZXJzLCBiOworICAgIEdzdFJ0cFZvcmJpc0NvbmZpZyAqY29uZjsKKyAgICBndWludCAqaF9zaXplczsKKyAgICBndWludCBleHRyYSA9IDE7CisKKyAgICBpZiAoc2l6ZSA8IDYpCisgICAgICBnb3RvIHRvb19zbWFsbDsKKworICAgIGlkZW50ID0gKGRhdGFbMF0gPDwgMTYpIHwgKGRhdGFbMV0gPDwgOCkgfCBkYXRhWzJdOworICAgIGxlbmd0aCA9IChkYXRhWzNdIDw8IDgpIHwgZGF0YVs0XTsKKyAgICBuX2hlYWRlcnMgPSBkYXRhWzVdOworICAgIHNpemUgLT0gNjsKKyAgICBkYXRhICs9IDY7CisgICAgb2Zmc2V0ICs9IDY7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHB2b3JiaXNkZXBheSwKKyAgICAgICAgImhlYWRlciAlZCwgaWRlbnQgMHglMDh4LCBsZW5ndGggJXUsIGxlZnQgJSIgR19HU0laRV9GT1JNQVQsIGksIGlkZW50LAorICAgICAgICBsZW5ndGgsIHNpemUpOworCisgICAgLyogRklYTUUgY2hlY2sgaWYgd2UgYWxyZWFkeSBnb3QgdGhpcyBpZGVudCAqLworCisgICAgLyogbGVuZ3RoIG1pZ2h0IGFsc28gaW5jbHVkZSBjb3VudCBvZiBmb2xsb3dpbmcgc2l6ZSBmaWVsZHMgKi8KKyAgICBpZiAoc2l6ZSA8IGxlbmd0aCAmJiBzaXplICsgMSAhPSBsZW5ndGgpCisgICAgICBnb3RvIHRvb19zbWFsbDsKKworICAgIC8qIHJlYWQgaGVhZGVyIHNpemVzIHdlIHJlYWQgMiBzaXplcywgdGhlIHRoaXJkIHNpemUgKGZvciB3aGljaCB3ZSBhbGxvY2F0ZQorICAgICAqIHNwYWNlKSBtdXN0IGJlIGRlcml2ZWQgZnJvbSB0aGUgdG90YWwgcGFja2VkIGhlYWRlciBsZW5ndGguICovCisgICAgaF9zaXplcyA9IGdfbmV3YSAoZ3VpbnQsIG5faGVhZGVycyArIDEpOworICAgIGZvciAoaiA9IDA7IGogPCBuX2hlYWRlcnM7IGorKykgeworICAgICAgZ3VpbnQgaF9zaXplOworCisgICAgICBoX3NpemUgPSAwOworICAgICAgZG8geworICAgICAgICBpZiAoc2l6ZSA8IDEpCisgICAgICAgICAgZ290byB0b29fc21hbGw7CisgICAgICAgIGIgPSAqZGF0YSsrOworICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgZXh0cmErKzsKKyAgICAgICAgc2l6ZS0tOworICAgICAgICBoX3NpemUgPSAoaF9zaXplIDw8IDcpIHwgKGIgJiAweDdmKTsKKyAgICAgIH0gd2hpbGUgKGIgJiAweDgwKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHZvcmJpc2RlcGF5LCAiaGVhZGVycyAlZDogc2l6ZTogJXUiLCBqLCBoX3NpemUpOworCisgICAgICBpZiAobGVuZ3RoIDwgaF9zaXplKQorICAgICAgICBnb3RvIHRvb19zbWFsbDsKKworICAgICAgaF9zaXplc1tqXSA9IGhfc2l6ZTsKKyAgICAgIGxlbmd0aCAtPSBoX3NpemU7CisgICAgfQorICAgIC8qIGxhc3QgaGVhZGVyIGxlbmd0aCBpcyB0aGUgcmVtYWluaW5nIHNwYWNlICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwdm9yYmlzZGVwYXksICJsYXN0IGhlYWRlciBzaXplOiAldSIsIGxlbmd0aCk7CisgICAgaF9zaXplc1tqXSA9IGxlbmd0aDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHZvcmJpc2RlcGF5LCAicHJlcGFyaW5nIGhlYWRlcnMiKTsKKyAgICBjb25mID0gZ19uZXcwIChHc3RSdHBWb3JiaXNDb25maWcsIDEpOworICAgIGNvbmYtPmlkZW50ID0gaWRlbnQ7CisKKyAgICBmb3IgKGogPSAwOyBqIDw9IG5faGVhZGVyczsgaisrKSB7CisgICAgICBndWludCBoX3NpemU7CisKKyAgICAgIGhfc2l6ZSA9IGhfc2l6ZXNbal07CisgICAgICBpZiAoc2l6ZSA8IGhfc2l6ZSkgeworICAgICAgICBpZiAoaiAhPSBuX2hlYWRlcnMgfHwgc2l6ZSArIGV4dHJhICE9IGhfc2l6ZSkgeworICAgICAgICAgIGZyZWVfY29uZmlnIChjb25mKTsKKyAgICAgICAgICBnb3RvIHRvb19zbWFsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBvdGhlcndpc2UgbWVhbnMgdGhhdCBvdmVyYWxsIGxlbmd0aCBmaWVsZCBjb250YWluZWQgdG90YWwgbGVuZ3RoLAorICAgICAgICAgICAqIGluY2x1ZGluZyBleHRyYSBmaWVsZHMgKi8KKyAgICAgICAgICBoX3NpemUgLT0gZXh0cmE7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwdm9yYmlzZGVwYXksICJyZWFkaW5nIGhlYWRlciAlZCwgc2l6ZSAldSIsIGosCisgICAgICAgICAgaF9zaXplKTsKKworICAgICAgYnVmID0gZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAoY29uZmJ1ZiwgR1NUX0JVRkZFUl9DT1BZX0FMTCwgb2Zmc2V0LAorICAgICAgICAgIGhfc2l6ZSk7CisgICAgICBjb25mLT5oZWFkZXJzID0gZ19saXN0X2FwcGVuZCAoY29uZi0+aGVhZGVycywgYnVmKTsKKyAgICAgIG9mZnNldCArPSBoX3NpemU7CisgICAgICBzaXplIC09IGhfc2l6ZTsKKyAgICB9CisgICAgcnRwdm9yYmlzZGVwYXktPmNvbmZpZ3MgPSBnX2xpc3RfYXBwZW5kIChydHB2b3JiaXNkZXBheS0+Y29uZmlncywgY29uZik7CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChjb25mYnVmLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoY29uZmJ1Zik7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCit0b29fc21hbGw6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHB2b3JiaXNkZXBheSwgImNvbmZpZ3VyYXRpb24gdG9vIHNtYWxsIik7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoY29uZmJ1ZiwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoY29uZmJ1Zik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF92b3JiaXNfZGVwYXlfcGFyc2VfaW5iYW5kX2NvbmZpZ3VyYXRpb24gKEdzdFJ0cFZvcmJpc0RlcGF5ICoKKyAgICBydHB2b3JiaXNkZXBheSwgZ3VpbnQgaWRlbnQsIGd1aW50OCAqIGNvbmZpZ3VyYXRpb24sIGd1aW50IHNpemUsCisgICAgZ3VpbnQgbGVuZ3RoKQoreworICBHc3RCdWZmZXIgKmNvbmZidWY7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGlmIChHX1VOTElLRUxZIChzaXplIDwgNCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIHRyYW5zZm9ybSBpbmxpbmUgdG8gb3V0LW9mLWJhbmQgYW5kIHBhcnNlIHRoYXQgb25lICovCisgIGNvbmZidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHNpemUgKyA5KTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGNvbmZidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAvKiAxIGhlYWRlciAqLworICBHU1RfV1JJVEVfVUlOVDMyX0JFIChtYXAuZGF0YSwgMSk7CisgIC8qIHdyaXRlIElkZW50ICovCisgIEdTVF9XUklURV9VSU5UMjRfQkUgKG1hcC5kYXRhICsgNCwgaWRlbnQpOworICAvKiB3cml0ZSBzb3J0LW9mLWxlbmd0aCAqLworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChtYXAuZGF0YSArIDcsIGxlbmd0aCk7CisgIC8qIGNvcHkgcmVtYWluZGVyICovCisgIG1lbWNweSAobWFwLmRhdGEgKyA5LCBjb25maWd1cmF0aW9uLCBzaXplKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoY29uZmJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIGdzdF9ydHBfdm9yYmlzX2RlcGF5X3BhcnNlX2NvbmZpZ3VyYXRpb24gKHJ0cHZvcmJpc2RlcGF5LCBjb25mYnVmKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3ZvcmJpc19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdFJ0cFZvcmJpc0RlcGF5ICpydHB2b3JiaXNkZXBheTsKKyAgR3N0Q2FwcyAqc3JjY2FwczsKKyAgY29uc3QgZ2NoYXIgKmNvbmZpZ3VyYXRpb247CisgIGdpbnQgY2xvY2tfcmF0ZTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHJ0cHZvcmJpc2RlcGF5ID0gR1NUX1JUUF9WT1JCSVNfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgLyogZ2V0IGNsb2NrcmF0ZSAqLworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2xvY2stcmF0ZSIsICZjbG9ja19yYXRlKSkKKyAgICBnb3RvIG5vX3JhdGU7CisKKyAgLyogcmVhZCBhbmQgcGFyc2UgY29uZmlndXJhdGlvbiBzdHJpbmcgKi8KKyAgY29uZmlndXJhdGlvbiA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiY29uZmlndXJhdGlvbiIpOworICBpZiAoY29uZmlndXJhdGlvbikgeworICAgIEdzdEJ1ZmZlciAqY29uZmJ1ZjsKKyAgICBndWludDggKmRhdGE7CisgICAgZ3NpemUgc2l6ZTsKKworICAgIC8qIGRlc2VyaWFsaXplIGJhc2U2NCB0byBidWZmZXIgKi8KKyAgICBkYXRhID0gZ19iYXNlNjRfZGVjb2RlIChjb25maWd1cmF0aW9uLCAmc2l6ZSk7CisKKyAgICBjb25mYnVmID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgICAgZ3N0X2J1ZmZlcl9hcHBlbmRfbWVtb3J5IChjb25mYnVmLAorICAgICAgICBnc3RfbWVtb3J5X25ld193cmFwcGVkICgwLCBkYXRhLCBzaXplLCAwLCBzaXplLCBkYXRhLCBnX2ZyZWUpKTsKKyAgICBpZiAoIWdzdF9ydHBfdm9yYmlzX2RlcGF5X3BhcnNlX2NvbmZpZ3VyYXRpb24gKHJ0cHZvcmJpc2RlcGF5LCBjb25mYnVmKSkKKyAgICAgIGdvdG8gaW52YWxpZF9jb25maWd1cmF0aW9uOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwdm9yYmlzZGVwYXksICJubyBjb25maWd1cmF0aW9uIHNwZWNpZmllZCIpOworICB9CisKKyAgLyogY2FwcyBzZWVtIGdvb2QsIGNvbmZpZ3VyZSBlbGVtZW50ICovCisgIGRlcGF5bG9hZC0+Y2xvY2tfcmF0ZSA9IGNsb2NrX3JhdGU7CisKKyAgLyogc2V0IGNhcHMgb24gcGFkIGFuZCBvbiBoZWFkZXIgKi8KKyAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby94LXZvcmJpcyIpOworICByZXMgPSBnc3RfcGFkX3NldF9jYXBzIChkZXBheWxvYWQtPnNyY3BhZCwgc3JjY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworaW52YWxpZF9jb25maWd1cmF0aW9uOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwdm9yYmlzZGVwYXksICJpbnZhbGlkIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19yYXRlOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocnRwdm9yYmlzZGVwYXksICJubyBjbG9jay1yYXRlIHNwZWNpZmllZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdm9yYmlzX2RlcGF5X3N3aXRjaF9jb2RlYm9vayAoR3N0UnRwVm9yYmlzRGVwYXkgKiBydHB2b3JiaXNkZXBheSwKKyAgICBndWludDMyIGlkZW50KQoreworICBHTGlzdCAqd2FsazsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwdm9yYmlzZGVwYXksICJMb29raW5nIHVwIGNvZGUgYm9vayBpZGVudCAweCUwOHgiLCBpZGVudCk7CisgIGZvciAod2FsayA9IHJ0cHZvcmJpc2RlcGF5LT5jb25maWdzOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UnRwVm9yYmlzQ29uZmlnICpjb25mID0gKEdzdFJ0cFZvcmJpc0NvbmZpZyAqKSB3YWxrLT5kYXRhOworCisgICAgaWYgKGNvbmYtPmlkZW50ID09IGlkZW50KSB7CisgICAgICBHTGlzdCAqaGVhZGVyczsKKworICAgICAgLyogRklYTUUsIHJlbW92ZSBwYWRzLCBjcmVhdGUgbmV3IHBhZC4uICovCisKKyAgICAgIC8qIHB1c2ggb3V0IGFsbCB0aGUgaGVhZGVycyAqLworICAgICAgZm9yIChoZWFkZXJzID0gY29uZi0+aGVhZGVyczsgaGVhZGVyczsgaGVhZGVycyA9IGdfbGlzdF9uZXh0IChoZWFkZXJzKSkgeworICAgICAgICBHc3RCdWZmZXIgKmhlYWRlciA9IEdTVF9CVUZGRVJfQ0FTVCAoaGVhZGVycy0+ZGF0YSk7CisKKyAgICAgICAgZ3N0X2J1ZmZlcl9yZWYgKGhlYWRlcik7CisgICAgICAgIGdzdF9ydHBfYmFzZV9kZXBheWxvYWRfcHVzaCAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRCAocnRwdm9yYmlzZGVwYXkpLAorICAgICAgICAgICAgaGVhZGVyKTsKKyAgICAgIH0KKyAgICAgIC8qIHJlbWVtYmVyIHRoZSBjdXJyZW50IGNvbmZpZyAqLworICAgICAgcnRwdm9yYmlzZGVwYXktPmNvbmZpZyA9IGNvbmY7CisgICAgICByZXMgPSBUUlVFOworICAgIH0KKyAgfQorICBpZiAoIXJlcykgeworICAgIC8qIHdlIGRvbid0IGtub3cgYWJvdXQgdGhlIGhlYWRlcnMsIGZpZ3VyZSBvdXQgYW4gYWx0ZXJuYXRpdmUgbWV0aG9kIGZvcgorICAgICAqIGdldHRpbmcgdGhlIGNvZGVib29rcy4gRklYTUUsIGZhaWwgZm9yIG5vdy4gKi8KKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfdm9yYmlzX2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBWb3JiaXNEZXBheSAqcnRwdm9yYmlzZGVwYXk7CisgIEdzdEJ1ZmZlciAqb3V0YnVmOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ2ludCBwYXlsb2FkX2xlbjsKKyAgR3N0QnVmZmVyICpwYXlsb2FkX2J1ZmZlciA9IE5VTEw7CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50MzIgaGVhZGVyLCBpZGVudDsKKyAgZ3VpbnQ4IEYsIFZEVCwgcGFja2V0czsKKyAgZ3VpbnQgbGVuZ3RoOworCisgIHJ0cHZvcmJpc2RlcGF5ID0gR1NUX1JUUF9WT1JCSVNfREVQQVkgKGRlcGF5bG9hZCk7CisKKyAgcGF5bG9hZF9sZW4gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAiZ290IFJUUCBwYWNrZXQgb2Ygc2l6ZSAlZCIsIHBheWxvYWRfbGVuKTsKKworICAvKiB3ZSBuZWVkIGF0IGxlYXN0IDQgYnl0ZXMgZm9yIHRoZSBwYWNrZXQgaGVhZGVyICovCisgIGlmIChHX1VOTElLRUxZIChwYXlsb2FkX2xlbiA8IDQpKQorICAgIGdvdG8gcGFja2V0X3Nob3J0OworCisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAocnRwKTsKKyAgaGVhZGVyID0gR1NUX1JFQURfVUlOVDMyX0JFIChwYXlsb2FkKTsKKyAgLyoKKyAgICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgICAgICAgICAgSWRlbnQgICAgICAgICAgICAgICAgICAgICB8IEYgfFZEVHwjIHBrdHMufAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKgorICAgKiBGOiBGcmFnbWVudCB0eXBlICgwPW5vbmUsIDE9c3RhcnQsIDI9Y29udCwgMz1lbmQpCisgICAqIFZEVDogVm9yYmlzIGRhdGEgdHlwZSAoMD12b3JiaXMsIDE9Y29uZmlnLCAyPWNvbW1lbnQsIDM9cmVzZXJ2ZWQpCisgICAqIHBrdHM6IG51bWJlciBvZiBwYWNrZXRzLgorICAgKi8KKyAgVkRUID0gKGhlYWRlciAmIDB4MzApID4+IDQ7CisgIGlmIChHX1VOTElLRUxZIChWRFQgPT0gMykpCisgICAgZ290byBpZ25vcmVfcmVzZXJ2ZWQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAiaGVhZGVyOiAweCUwOHgiLCBoZWFkZXIpOworICBpZGVudCA9IChoZWFkZXIgPj4gOCkgJiAweGZmZmZmZjsKKyAgRiA9IChoZWFkZXIgJiAweGMwKSA+PiA2OworICBwYWNrZXRzID0gKGhlYWRlciAmIDB4Zik7CisKKyAgaWYgKFZEVCA9PSAwKSB7CisgICAgZ2Jvb2xlYW4gZG9fc3dpdGNoID0gRkFMU0U7CisKKyAgICAvKiB3ZSBoYXZlIGEgcmF3IHBheWxvYWQsIGZpbmQgdGhlIGNvZGVib29rIGZvciB0aGUgaWRlbnQgKi8KKyAgICBpZiAoIXJ0cHZvcmJpc2RlcGF5LT5jb25maWcpIHsKKyAgICAgIC8qIHdlIGRvbid0IGhhdmUgYW4gYWN0aXZlIGNvZGVib29rLCBmaW5kIHRoZSBjb2RlYm9vayBhbmQKKyAgICAgICAqIGFjdGl2YXRlIGl0ICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHB2b3JiaXNkZXBheSwgIk5vIGFjdGl2ZSBjb2RlYm9vaywgc3dpdGNoaW5nIik7CisgICAgICBkb19zd2l0Y2ggPSBUUlVFOworICAgIH0gZWxzZSBpZiAocnRwdm9yYmlzZGVwYXktPmNvbmZpZy0+aWRlbnQgIT0gaWRlbnQpIHsKKyAgICAgIC8qIGNvZGVib29rIGNoYW5nZWQgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHZvcmJpc2RlcGF5LCAiY29kZWJvb2sgY2hhbmdlZCwgc3dpdGNoaW5nIik7CisgICAgICBkb19zd2l0Y2ggPSBUUlVFOworICAgIH0KKyAgICBpZiAoZG9fc3dpdGNoKSB7CisgICAgICBpZiAoIWdzdF9ydHBfdm9yYmlzX2RlcGF5X3N3aXRjaF9jb2RlYm9vayAocnRwdm9yYmlzZGVwYXksIGlkZW50KSkKKyAgICAgICAgZ290byBzd2l0Y2hfZmFpbGVkOworICAgIH0KKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgImlkZW50OiAldSwgRjogJWQsIFZEVDogJWQsIHBhY2tldHM6ICVkIiwgaWRlbnQsCisgICAgICBGLCBWRFQsIHBhY2tldHMpOworCisgIC8qIGZyYWdtZW50ZWQgcGFja2V0cywgYXNzZW1ibGUgKi8KKyAgaWYgKEYgIT0gMCkgeworICAgIEdzdEJ1ZmZlciAqdmRhdGE7CisKKyAgICBpZiAoRiA9PSAxKSB7CisgICAgICAvKiBpZiB3ZSBzdGFydCBhIHBhY2tldCwgY2xlYXIgYWRhcHRlciBhbmQgc3RhcnQgYXNzZW1ibGluZy4gKi8KKyAgICAgIGdzdF9hZGFwdGVyX2NsZWFyIChydHB2b3JiaXNkZXBheS0+YWRhcHRlcik7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJzdGFydCBhc3NlbWJsZSIpOworICAgICAgcnRwdm9yYmlzZGVwYXktPmFzc2VtYmxpbmcgPSBUUlVFOworICAgIH0KKworICAgIGlmICghcnRwdm9yYmlzZGVwYXktPmFzc2VtYmxpbmcpCisgICAgICBnb3RvIG5vX291dHB1dDsKKworICAgIC8qIHNraXAgaGVhZGVyIGFuZCBsZW5ndGguICovCisgICAgdmRhdGEgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwgNiwgLTEpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXlsb2FkLCAiYXNzZW1ibGUgdm9yYmlzIHBhY2tldCIpOworICAgIGdzdF9hZGFwdGVyX3B1c2ggKHJ0cHZvcmJpc2RlcGF5LT5hZGFwdGVyLCB2ZGF0YSk7CisKKyAgICAvKiBwYWNrZXQgaXMgbm90IGNvbXBsZXRlLCB3ZSBhcmUgZG9uZSAqLworICAgIGlmIChGICE9IDMpCisgICAgICBnb3RvIG5vX291dHB1dDsKKworICAgIC8qIGNvbnN0cnVjdCBhc3NlbWJsZWQgYnVmZmVyICovCisgICAgbGVuZ3RoID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChydHB2b3JiaXNkZXBheS0+YWRhcHRlcik7CisgICAgcGF5bG9hZF9idWZmZXIgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAocnRwdm9yYmlzZGVwYXktPmFkYXB0ZXIsIGxlbmd0aCk7CisgIH0gZWxzZSB7CisgICAgcGF5bG9hZF9idWZmZXIgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwgNCwgLTEpOworICAgIGxlbmd0aCA9IDA7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJhc3NlbWJsZSBkb25lIik7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKHBheWxvYWRfYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBwYXlsb2FkID0gbWFwLmRhdGE7CisgIHBheWxvYWRfbGVuID0gbWFwLnNpemU7CisKKyAgLyogd2Ugbm90IGFzc2VtYmxpbmcgYW55bW9yZSBub3cgKi8KKyAgcnRwdm9yYmlzZGVwYXktPmFzc2VtYmxpbmcgPSBGQUxTRTsKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHJ0cHZvcmJpc2RlcGF5LT5hZGFwdGVyKTsKKworICAvKiBwYXlsb2FkIG5vdyBwb2ludHMgdG8gYSBsZW5ndGggd2l0aCB0aGF0IG1hbnkgdm9yYmlzIGRhdGEgYnl0ZXMuCisgICAqIEl0ZXJhdGUgb3ZlciB0aGUgcGFja2V0cyBhbmQgc2VuZCB0aGVtIG91dC4KKyAgICoKKyAgICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgIGxlbmd0aCAgICAgICAgICAgIHwgICAgICAgICAgdm9yYmlzIGRhdGEgICAgICAgICAuLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLiAgICAgICAgICAgICAgICAgICAgICAgIHZvcmJpcyBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgbGVuZ3RoICAgICAgICAgICAgIHwgICBuZXh0IHZvcmJpcyBwYWNrZXQgZGF0YSAgICAuLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLiAgICAgICAgICAgICAgICAgICAgICAgIHZvcmJpcyBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyoKKyAgICovCisgIHdoaWxlIChwYXlsb2FkX2xlbiA+IDIpIHsKKyAgICAvKiBJZiBsZW5ndGggaXMgbm90IDAsIHdlIGhhdmUgYSByZWFzc2VtYmxlZCBwYWNrZXQgZm9yIHdoaWNoIHdlCisgICAgICogY2FsY3VsYXRlZCB0aGUgbGVuZ3RoIGFscmVhZHkgYW5kIGRvbid0IGhhdmUgdG8gc2tpcCBvdmVyIHRoZQorICAgICAqIGxlbmd0aCBmaWVsZCBhbnltb3JlCisgICAgICovCisgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICBsZW5ndGggPSBHU1RfUkVBRF9VSU5UMTZfQkUgKHBheWxvYWQpOworICAgICAgcGF5bG9hZCArPSAyOworICAgICAgcGF5bG9hZF9sZW4gLT0gMjsKKyAgICB9CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJyZWFkIGxlbmd0aCAldSwgYXZhaWw6ICVkIiwgbGVuZ3RoLAorICAgICAgICBwYXlsb2FkX2xlbik7CisKKyAgICAvKiBza2lwIHBhY2tldCBpZiBzb21ldGhpbmcgb2RkIGhhcHBlbnMgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAobGVuZ3RoID4gcGF5bG9hZF9sZW4pKQorICAgICAgZ290byBsZW5ndGhfc2hvcnQ7CisKKyAgICAvKiBoYW5kbGUgaW4tYmFuZCBjb25maWd1cmF0aW9uICovCisgICAgaWYgKEdfVU5MSUtFTFkgKFZEVCA9PSAxKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwdm9yYmlzZGVwYXksICJpbi1iYW5kIGNvbmZpZ3VyYXRpb24iKTsKKyAgICAgIGlmICghZ3N0X3J0cF92b3JiaXNfZGVwYXlfcGFyc2VfaW5iYW5kX2NvbmZpZ3VyYXRpb24gKHJ0cHZvcmJpc2RlcGF5LAorICAgICAgICAgICAgICBpZGVudCwgcGF5bG9hZCwgcGF5bG9hZF9sZW4sIGxlbmd0aCkpCisgICAgICAgIGdvdG8gaW52YWxpZF9jb25maWd1cmF0aW9uOworICAgICAgZ290byBub19vdXRwdXQ7CisgICAgfQorCisgICAgLyogY3JlYXRlIGJ1ZmZlciBmb3IgcGFja2V0ICovCisgICAgb3V0YnVmID0KKyAgICAgICAgZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAocGF5bG9hZF9idWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsCisgICAgICAgIHBheWxvYWQgLSBtYXAuZGF0YSwgbGVuZ3RoKTsKKworICAgIHBheWxvYWQgKz0gbGVuZ3RoOworICAgIHBheWxvYWRfbGVuIC09IGxlbmd0aDsKKyAgICAvKiBtYWtlIHN1cmUgdG8gcmVhZCBuZXh0IGxlbmd0aCAqLworICAgIGxlbmd0aCA9IDA7CisKKyAgICByZXQgPSBnc3RfcnRwX2Jhc2VfZGVwYXlsb2FkX3B1c2ggKGRlcGF5bG9hZCwgb3V0YnVmKTsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgYnJlYWs7CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChwYXlsb2FkX2J1ZmZlciwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKHBheWxvYWRfYnVmZmVyKTsKKworICByZXR1cm4gTlVMTDsKKworbm9fb3V0cHV0OgorICB7CisgICAgaWYgKHBheWxvYWRfYnVmZmVyKSB7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChwYXlsb2FkX2J1ZmZlciwgJm1hcCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChwYXlsb2FkX2J1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisgIC8qIEVST1JSUyAqLworc3dpdGNoX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cHZvcmJpc2RlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkNvdWxkIG5vdCBzd2l0Y2ggY29kZWJvb2tzIikpOworICAgIHJldHVybiBOVUxMOworICB9CitwYWNrZXRfc2hvcnQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHB2b3JiaXNkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJQYWNrZXQgd2FzIHRvbyBzaG9ydCAoJWQgPCA0KSIsIHBheWxvYWRfbGVuKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2lnbm9yZV9yZXNlcnZlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwdm9yYmlzZGVwYXksICJyZXNlcnZlZCBWRFQgaWdub3JlZCIpOworICAgIHJldHVybiBOVUxMOworICB9CitsZW5ndGhfc2hvcnQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHB2b3JiaXNkZXBheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgIChOVUxMKSwgKCJQYWNrZXQgY29udGFpbnMgaW52YWxpZCBkYXRhIikpOworICAgIGlmIChwYXlsb2FkX2J1ZmZlcikgeworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAocGF5bG9hZF9idWZmZXIsICZtYXApOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocGF5bG9hZF9idWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQoraW52YWxpZF9jb25maWd1cmF0aW9uOgorICB7CisgICAgLyogZmF0YWwsIGFzIHdlIG90aGVyd2lzZSByaXNrIGNhcnJ5aW5nIG9uIHdpdGhvdXQgb3V0cHV0ICovCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHJ0cHZvcmJpc2RlcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIlBhY2tldCBjb250YWlucyBpbnZhbGlkIGNvbmZpZ3VyYXRpb24iKSk7CisgICAgaWYgKHBheWxvYWRfYnVmZmVyKSB7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChwYXlsb2FkX2J1ZmZlciwgJm1hcCk7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChwYXlsb2FkX2J1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF92b3JiaXNfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSdHBWb3JiaXNEZXBheSAqcnRwdm9yYmlzZGVwYXk7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBydHB2b3JiaXNkZXBheSA9IEdTVF9SVFBfVk9SQklTX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZnJlZV9pbmRlbnRzIChydHB2b3JiaXNkZXBheSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF92b3JiaXNfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHB2b3JiaXNkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9WT1JCSVNfREVQQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5oIGIvZ3N0L3J0cC9nc3RydHB2b3JiaXNkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNDNkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHZvcmJpc2RlcGF5LmgKQEAgLTAsMCArMSw3MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1ZPUkJJU19ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1ZPUkJJU19ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlZGVwYXlsb2FkLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfVk9SQklTX0RFUEFZIFwKKyAgKGdzdF9ydHBfdm9yYmlzX2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfVk9SQklTX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1ZPUkJJU19ERVBBWSxHc3RSdHBWb3JiaXNEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfVk9SQklTX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9WT1JCSVNfREVQQVksR3N0UnRwVm9yYmlzRGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfVk9SQklTX0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1ZPUkJJU19ERVBBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfVk9SQklTX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9WT1JCSVNfREVQQVkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwVm9yYmlzRGVwYXkgR3N0UnRwVm9yYmlzRGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwVm9yYmlzRGVwYXlDbGFzcyBHc3RSdHBWb3JiaXNEZXBheUNsYXNzOworCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwVm9yYmlzQ29uZmlnIHsKKyAgZ3VpbnQzMiAgaWRlbnQ7CisgIEdMaXN0ICAgKmhlYWRlcnM7Cit9IEdzdFJ0cFZvcmJpc0NvbmZpZzsKKworc3RydWN0IF9Hc3RSdHBWb3JiaXNEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIHBhcmVudDsKKworICBHTGlzdCAgICAgICAgICAgICAgKmNvbmZpZ3M7CisgIEdzdFJ0cFZvcmJpc0NvbmZpZyAqY29uZmlnOworCisgIEdzdEFkYXB0ZXIgICAgICAgICAqYWRhcHRlcjsKKyAgZ2Jvb2xlYW4gICAgICAgICAgICBhc3NlbWJsaW5nOworfTsKKworc3RydWN0IF9Hc3RSdHBWb3JiaXNEZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX3ZvcmJpc19kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfdm9yYmlzX2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX1ZPUkJJU19ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdm9yYmlzcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YmI1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5jCkBAIC0wLDAgKzEsOTk5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJmbnYxaGFzaC5oIgorI2luY2x1ZGUgImdzdHJ0cHZvcmJpc3BheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cHZvcmJpc3BheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwdm9yYmlzcGF5X2RlYnVnKQorCisvKiByZWZlcmVuY2VzOgorICogaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNTIxNS50eHQKKyAqLworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF92b3JiaXNfcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVggXSwgIiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiVk9SQklTXCIiCisgICAgICAgIC8qIEFsbCByZXF1aXJlZCBwYXJhbWV0ZXJzCisgICAgICAgICAqCisgICAgICAgICAqICJlbmNvZGluZy1wYXJhbXMgPSAoc3RyaW5nKSA8bnVtIGNoYW5uZWxzPiIKKyAgICAgICAgICogImNvbmZpZ3VyYXRpb24gPSAoc3RyaW5nKSBBTlkiCisgICAgICAgICAqLworICAgICkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF92b3JiaXNfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC12b3JiaXMiKQorICAgICk7CisKKyNkZWZpbmUgREVGQVVMVF9DT05GSUdfSU5URVJWQUwgMAorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9DT05GSUdfSU5URVJWQUwKK307CisKKyNkZWZpbmUgZ3N0X3J0cF92b3JiaXNfcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cFZvcmJpc1BheSwgZ3N0X3J0cF92b3JiaXNfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfdm9yYmlzX3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIGJhc2VwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX3ZvcmJpc19wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfdm9yYmlzX3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBhZCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfdm9yYmlzX3BheV9zaW5rX2V2ZW50IChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3ZvcmJpc19wYXlfcGFyc2VfaWQgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF92b3JiaXNfcGF5X2ZpbmlzaF9oZWFkZXJzIChHc3RSVFBCYXNlUGF5bG9hZCAqCisgICAgYmFzZXBheWxvYWQpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX3ZvcmJpc19wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF92b3JiaXNfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdm9yYmlzX3BheV9jbGFzc19pbml0IChHc3RSdHBWb3JiaXNQYXlDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlcGF5bG9hZF9jbGFzcyA9IChHc3RSVFBCYXNlUGF5bG9hZENsYXNzICopIGtsYXNzOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHBfdm9yYmlzX3BheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF92b3JiaXNfcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF92b3JiaXNfcGF5X2hhbmRsZV9idWZmZXI7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5zaW5rX2V2ZW50ID0gZ3N0X3J0cF92b3JiaXNfcGF5X3NpbmtfZXZlbnQ7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF92b3JiaXNfcGF5X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF92b3JiaXNfcGF5X2dldF9wcm9wZXJ0eTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3ZvcmJpc19wYXlfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF92b3JiaXNfcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIFZvcmJpcyBwYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL1BheWxvYWRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUGF5bG9hZC1lbmNvZGUgVm9yYmlzIGF1ZGlvIGludG8gUlRQIHBhY2tldHMgKFJGQyA1MjE1KSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwdm9yYmlzcGF5X2RlYnVnLCAicnRwdm9yYmlzcGF5IiwgMCwKKyAgICAgICJWb3JiaXMgUlRQIFBheWxvYWRlciIpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQ09ORklHX0lOVEVSVkFMLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJjb25maWctaW50ZXJ2YWwiLCAiQ29uZmlnIFNlbmQgSW50ZXJ2YWwiLAorICAgICAgICAgICJTZW5kIENvbmZpZyBJbnNlcnRpb24gSW50ZXJ2YWwgaW4gc2Vjb25kcyAoY29uZmlndXJhdGlvbiBoZWFkZXJzICIKKyAgICAgICAgICAid2lsbCBiZSBtdWx0aXBsZXhlZCBpbiB0aGUgZGF0YSBzdHJlYW0gd2hlbiBkZXRlY3RlZC4pICgwID0gZGlzYWJsZWQpIiwKKyAgICAgICAgICAwLCAzNjAwLCBERUZBVUxUX0NPTkZJR19JTlRFUlZBTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpCisgICAgICApOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92b3JiaXNfcGF5X2luaXQgKEdzdFJ0cFZvcmJpc1BheSAqIHJ0cHZvcmJpc3BheSkKK3sKKyAgcnRwdm9yYmlzcGF5LT5sYXN0X2NvbmZpZyA9IEdTVF9DTE9DS19USU1FX05PTkU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZvcmJpc19wYXlfY2xlYXJfcGFja2V0IChHc3RSdHBWb3JiaXNQYXkgKiBydHB2b3JiaXNwYXkpCit7CisgIGlmIChydHB2b3JiaXNwYXktPnBhY2tldCkKKyAgICBnc3RfYnVmZmVyX3VucmVmIChydHB2b3JiaXNwYXktPnBhY2tldCk7CisgIHJ0cHZvcmJpc3BheS0+cGFja2V0ID0gTlVMTDsKKyAgZ19saXN0X2ZyZWVfZnVsbCAocnRwdm9yYmlzcGF5LT5wYWNrZXRfYnVmZmVycywKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgIHJ0cHZvcmJpc3BheS0+cGFja2V0X2J1ZmZlcnMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92b3JiaXNfcGF5X2NsZWFudXAgKEdzdFJ0cFZvcmJpc1BheSAqIHJ0cHZvcmJpc3BheSkKK3sKKyAgZ3N0X3J0cF92b3JiaXNfcGF5X2NsZWFyX3BhY2tldCAocnRwdm9yYmlzcGF5KTsKKyAgZ19saXN0X2ZyZWVfZnVsbCAocnRwdm9yYmlzcGF5LT5oZWFkZXJzLCAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9idWZmZXJfdW5yZWYpOworICBydHB2b3JiaXNwYXktPmhlYWRlcnMgPSBOVUxMOworICBnX2ZyZWUgKHJ0cHZvcmJpc3BheS0+Y29uZmlnX2RhdGEpOworICBydHB2b3JiaXNwYXktPmNvbmZpZ19kYXRhID0gTlVMTDsKKyAgcnRwdm9yYmlzcGF5LT5sYXN0X2NvbmZpZyA9IEdTVF9DTE9DS19USU1FX05PTkU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF92b3JiaXNfcGF5X3NldGNhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSdHBWb3JiaXNQYXkgKnJ0cHZvcmJpc3BheTsKKyAgR3N0U3RydWN0dXJlICpzOworICBjb25zdCBHVmFsdWUgKmFycmF5OworICBnaW50IGFzaXplLCBpOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgcnRwdm9yYmlzcGF5ID0gR1NUX1JUUF9WT1JCSVNfUEFZIChiYXNlcGF5bG9hZCk7CisKKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIHJ0cHZvcmJpc3BheS0+bmVlZF9oZWFkZXJzID0gVFJVRTsKKworICBpZiAoKGFycmF5ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJzdHJlYW1oZWFkZXIiKSkgPT0gTlVMTCkKKyAgICBnb3RvIGRvbmU7CisKKyAgaWYgKEdfVkFMVUVfVFlQRSAoYXJyYXkpICE9IEdTVF9UWVBFX0FSUkFZKQorICAgIGdvdG8gZG9uZTsKKworICBpZiAoKGFzaXplID0gZ3N0X3ZhbHVlX2FycmF5X2dldF9zaXplIChhcnJheSkpIDwgMykKKyAgICBnb3RvIGRvbmU7CisKKyAgZm9yIChpID0gMDsgaSA8IGFzaXplOyBpKyspIHsKKyAgICBjb25zdCBHVmFsdWUgKnZhbHVlOworCisgICAgdmFsdWUgPSBnc3RfdmFsdWVfYXJyYXlfZ2V0X3ZhbHVlIChhcnJheSwgaSk7CisgICAgaWYgKChidWYgPSBnc3RfdmFsdWVfZ2V0X2J1ZmZlciAodmFsdWUpKSA9PSBOVUxMKQorICAgICAgZ290byBudWxsX2J1ZmZlcjsKKworICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgaWYgKG1hcC5zaXplIDwgMSkKKyAgICAgIGdvdG8gaW52YWxpZF9zdHJlYW1oZWFkZXI7CisKKyAgICAvKiBubyBkYXRhIHBhY2tldHMgYWxsb3dlZCAqLworICAgIGlmICgobWFwLmRhdGFbMF0gJiAxKSA9PSAwKQorICAgICAgZ290byBpbnZhbGlkX3N0cmVhbWhlYWRlcjsKKworICAgIC8qIHdlIG5lZWQgcGFja2V0cyB3aXRoIGlkIDEsIDMsIDUgKi8KKyAgICBpZiAobWFwLmRhdGFbMF0gIT0gKGkgKiAyKSArIDEpCisgICAgICBnb3RvIGludmFsaWRfc3RyZWFtaGVhZGVyOworCisgICAgaWYgKGkgPT0gMCkgeworICAgICAgLyogaWRlbnRpZmljYXRpb24sIHdlIG5lZWQgdG8gcGFyc2UgdGhpcyBpbiBvcmRlciB0byBnZXQgdGhlIGNsb2NrIHJhdGUuICovCisgICAgICBpZiAoR19VTkxJS0VMWSAoIWdzdF9ydHBfdm9yYmlzX3BheV9wYXJzZV9pZCAoYmFzZXBheWxvYWQsIG1hcC5kYXRhLAorICAgICAgICAgICAgICAgICAgbWFwLnNpemUpKSkKKyAgICAgICAgZ290byBwYXJzZV9pZF9mYWlsZWQ7CisgICAgfQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHZvcmJpc3BheSwgImNvbGxlY3RpbmcgaGVhZGVyICVkIiwgaSk7CisgICAgcnRwdm9yYmlzcGF5LT5oZWFkZXJzID0KKyAgICAgICAgZ19saXN0X2FwcGVuZCAocnRwdm9yYmlzcGF5LT5oZWFkZXJzLCBnc3RfYnVmZmVyX3JlZiAoYnVmKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgfQorICBpZiAoIWdzdF9ydHBfdm9yYmlzX3BheV9maW5pc2hfaGVhZGVycyAoYmFzZXBheWxvYWQpKQorICAgIGdvdG8gZmluaXNoX2ZhaWxlZDsKKworZG9uZToKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitudWxsX2J1ZmZlcjoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwdm9yYmlzcGF5LCAic3RyZWFtaGVhZGVyIHdpdGggbnVsbCBidWZmZXIgcmVjZWl2ZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfc3RyZWFtaGVhZGVyOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChydHB2b3JiaXNwYXksICJ1bmFibGUgdG8gcGFyc2UgaW5pdGlhbCBoZWFkZXIiKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorcGFyc2VfaWRfZmFpbGVkOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChydHB2b3JiaXNwYXksICJ1bmFibGUgdG8gcGFyc2UgaW5pdGlhbCBoZWFkZXIiKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorZmluaXNoX2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwdm9yYmlzcGF5LCAidW5hYmxlIHRvIGZpbmlzaCBoZWFkZXJzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZvcmJpc19wYXlfcmVzZXRfcGFja2V0IChHc3RSdHBWb3JiaXNQYXkgKiBydHB2b3JiaXNwYXksIGd1aW50OCBWRFQpCit7CisgIGd1aW50IHBheWxvYWRfbGVuOworICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisKKyAgR1NUX0xPR19PQkpFQ1QgKHJ0cHZvcmJpc3BheSwgInJlc2V0IHBhY2tldCIpOworCisgIHJ0cHZvcmJpc3BheS0+cGF5bG9hZF9wb3MgPSA0OworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKHJ0cHZvcmJpc3BheS0+cGFja2V0LCBHU1RfTUFQX1JFQUQsICZydHApOworICBwYXlsb2FkX2xlbiA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAoJnJ0cCk7CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgcnRwdm9yYmlzcGF5LT5wYXlsb2FkX2xlZnQgPSBwYXlsb2FkX2xlbiAtIDQ7CisgIHJ0cHZvcmJpc3BheS0+cGF5bG9hZF9kdXJhdGlvbiA9IDA7CisgIHJ0cHZvcmJpc3BheS0+cGF5bG9hZF9GID0gMDsKKyAgcnRwdm9yYmlzcGF5LT5wYXlsb2FkX1ZEVCA9IFZEVDsKKyAgcnRwdm9yYmlzcGF5LT5wYXlsb2FkX3BrdHMgPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92b3JiaXNfcGF5X2luaXRfcGFja2V0IChHc3RSdHBWb3JiaXNQYXkgKiBydHB2b3JiaXNwYXksIGd1aW50OCBWRFQsCisgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCkKK3sKKyAgR1NUX0xPR19PQkpFQ1QgKHJ0cHZvcmJpc3BheSwgInN0YXJ0aW5nIG5ldyBwYWNrZXQsIFZEVDogJWQiLCBWRFQpOworCisgIGdzdF9ydHBfdm9yYmlzX3BheV9jbGVhcl9wYWNrZXQgKHJ0cHZvcmJpc3BheSk7CisKKyAgLyogbmV3IHBhY2tldCBhbGxvY2F0ZSBtYXggcGFja2V0IHNpemUgKi8KKyAgcnRwdm9yYmlzcGF5LT5wYWNrZXQgPQorICAgICAgZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlX2xlbiAoR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVCisgICAgICAocnRwdm9yYmlzcGF5KSwgMCwgMCk7CisgIGdzdF9ydHBfdm9yYmlzX3BheV9yZXNldF9wYWNrZXQgKHJ0cHZvcmJpc3BheSwgVkRUKTsKKworICBHU1RfQlVGRkVSX1BUUyAocnRwdm9yYmlzcGF5LT5wYWNrZXQpID0gdGltZXN0YW1wOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF92b3JiaXNfcGF5X2ZsdXNoX3BhY2tldCAoR3N0UnRwVm9yYmlzUGF5ICogcnRwdm9yYmlzcGF5KQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgZ3VpbnQ4ICpwYXlsb2FkOworICBndWludCBobGVuOworICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisgIEdMaXN0ICpsOworCisgIC8qIGNoZWNrIGZvciBlbXB0eSBwYWNrZXQgKi8KKyAgaWYgKCFydHB2b3JiaXNwYXktPnBhY2tldCB8fCBydHB2b3JiaXNwYXktPnBheWxvYWRfcG9zIDw9IDQpCisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIEdTVF9MT0dfT0JKRUNUIChydHB2b3JiaXNwYXksICJmbHVzaGluZyBwYWNrZXQiKTsKKworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKHJ0cHZvcmJpc3BheS0+cGFja2V0LCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKworICAvKiBmaXggaGVhZGVyICovCisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisgIC8qCisgICAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICogfCAgICAgICAgICAgICAgICAgICAgIElkZW50ICAgICAgICAgICAgICAgICAgICAgfCBGIHxWRFR8IyBwa3RzLnwKKyAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICoKKyAgICogRjogRnJhZ21lbnQgdHlwZSAoMD1ub25lLCAxPXN0YXJ0LCAyPWNvbnQsIDM9ZW5kKQorICAgKiBWRFQ6IFZvcmJpcyBkYXRhIHR5cGUgKDA9dm9yYmlzLCAxPWNvbmZpZywgMj1jb21tZW50LCAzPXJlc2VydmVkKQorICAgKiBwa3RzOiBudW1iZXIgb2YgcGFja2V0cy4KKyAgICovCisgIHBheWxvYWRbMF0gPSAocnRwdm9yYmlzcGF5LT5wYXlsb2FkX2lkZW50ID4+IDE2KSAmIDB4ZmY7CisgIHBheWxvYWRbMV0gPSAocnRwdm9yYmlzcGF5LT5wYXlsb2FkX2lkZW50ID4+IDgpICYgMHhmZjsKKyAgcGF5bG9hZFsyXSA9IChydHB2b3JiaXNwYXktPnBheWxvYWRfaWRlbnQpICYgMHhmZjsKKyAgcGF5bG9hZFszXSA9IChydHB2b3JiaXNwYXktPnBheWxvYWRfRiAmIDB4MykgPDwgNiB8CisgICAgICAocnRwdm9yYmlzcGF5LT5wYXlsb2FkX1ZEVCAmIDB4MykgPDwgNCB8CisgICAgICAocnRwdm9yYmlzcGF5LT5wYXlsb2FkX3BrdHMgJiAweGYpOworCisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAvKiBzaHJpbmsgdGhlIGJ1ZmZlciBzaXplIHRvIHRoZSBsYXN0IHdyaXR0ZW4gYnl0ZSAqLworICBobGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19oZWFkZXJfbGVuICgwKTsKKyAgZ3N0X2J1ZmZlcl9yZXNpemUgKHJ0cHZvcmJpc3BheS0+cGFja2V0LCAwLCBobGVuICsgcnRwdm9yYmlzcGF5LT5wYXlsb2FkX3Bvcyk7CisKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAocnRwdm9yYmlzcGF5LT5wYWNrZXQpID0gcnRwdm9yYmlzcGF5LT5wYXlsb2FkX2R1cmF0aW9uOworCisgIGZvciAobCA9IGdfbGlzdF9sYXN0IChydHB2b3JiaXNwYXktPnBhY2tldF9idWZmZXJzKTsgbDsgbCA9IGwtPnByZXYpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZiA9IEdTVF9CVUZGRVJfQ0FTVCAobC0+ZGF0YSk7CisgICAgZ3N0X3J0cF9jb3B5X2F1ZGlvX21ldGEgKHJ0cHZvcmJpc3BheSwgcnRwdm9yYmlzcGF5LT5wYWNrZXQsIGJ1Zik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgfQorICBnX2xpc3RfZnJlZSAocnRwdm9yYmlzcGF5LT5wYWNrZXRfYnVmZmVycyk7CisgIHJ0cHZvcmJpc3BheS0+cGFja2V0X2J1ZmZlcnMgPSBOVUxMOworCisgIC8qIHB1c2gsIHRoaXMgZ2l2ZXMgYXdheSBvdXIgcmVmIHRvIHRoZSBwYWNrZXQsIHNvIGNsZWFyIGl0LiAqLworICByZXQgPQorICAgICAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfcHVzaCAoR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cHZvcmJpc3BheSksCisgICAgICBydHB2b3JiaXNwYXktPnBhY2tldCk7CisgIHJ0cHZvcmJpc3BheS0+cGFja2V0ID0gTlVMTDsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdm9yYmlzX3BheV9maW5pc2hfaGVhZGVycyAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCkKK3sKKyAgR3N0UnRwVm9yYmlzUGF5ICpydHB2b3JiaXNwYXkgPSBHU1RfUlRQX1ZPUkJJU19QQVkgKGJhc2VwYXlsb2FkKTsKKyAgR0xpc3QgKndhbGs7CisgIGd1aW50IGxlbmd0aCwgc2l6ZSwgbl9oZWFkZXJzLCBjb25maWdsZW4sIGV4dHJhbGVuOworICBnY2hhciAqY3N0ciwgKmNvbmZpZ3VyYXRpb247CisgIGd1aW50OCAqZGF0YSwgKmNvbmZpZzsKKyAgZ3VpbnQzMiBpZGVudDsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHZvcmJpc3BheSwgImZpbmlzaCBoZWFkZXJzIik7CisKKyAgaWYgKCFydHB2b3JiaXNwYXktPmhlYWRlcnMpCisgICAgZ290byBub19oZWFkZXJzOworCisgIC8qICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIHwgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgcGFja2VkIGhlYWRlcnMgICAgICAgICAgICAgICAgICB8CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tlZCBoZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tlZCBoZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAqCisgICAqIFdlIG9ubHkgY29uc3RydWN0IGEgY29uZmlnIGNvbnRhaW5pbmcgMSBwYWNrZWQgaGVhZGVyIGxpa2UgdGhpczoKKyAgICoKKyAgICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgICAgICAgIElkZW50ICAgICAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCAgICAgICAuLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLiAgICAgICAgICAgICAgfCBuLiBvZiBoZWFkZXJzIHwgICAgbGVuZ3RoMSAgICB8ICAgIGxlbmd0aDIgICAuLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLiAgICAgICAgICAgICAgfCAgICAgICAgICAgICBJZGVudGlmaWNhdGlvbiBIZWFkZXIgICAgICAgICAgICAuLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLiAgICAgICAgICAgICAgfCAgICAgICAgIENvbW1lbnQgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAuLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR1cCBIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAuLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKiAuLiAgICAgICAgICAgICAgICAgICAgICAgICBTZXR1cCBIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgKi8KKworICAvKiB3ZSBuZWVkIDQgYnl0ZXMgZm9yIHRoZSBudW1iZXIgb2YgaGVhZGVycyAod2hpY2ggaXMgYWx3YXlzIDEpLCAzIGJ5dGVzIGZvcgorICAgKiB0aGUgaWRlbnQsIDIgYnl0ZXMgZm9yIGxlbmd0aCwgMSBieXRlIGZvciBuLiBvZiBoZWFkZXJzLiAqLworICBzaXplID0gNCArIDMgKyAyICsgMTsKKworICAvKiBjb3VudCB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVycyBmaXJzdCBhbmQgdXBkYXRlIHRoZSBoYXNoICovCisgIGxlbmd0aCA9IDA7CisgIG5faGVhZGVycyA9IDA7CisgIGlkZW50ID0gZm52MV9oYXNoXzMyX25ldyAoKTsKKyAgZXh0cmFsZW4gPSAxOworICBmb3IgKHdhbGsgPSBydHB2b3JiaXNwYXktPmhlYWRlcnM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZiA9IEdTVF9CVUZGRVJfQ0FTVCAod2Fsay0+ZGF0YSk7CisgICAgR3N0TWFwSW5mbyBtYXA7CisgICAgZ3VpbnQgYnNpemU7CisKKyAgICBic2l6ZSA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisgICAgbGVuZ3RoICs9IGJzaXplOworICAgIG5faGVhZGVycysrOworCisgICAgLyogY291bnQgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCBmb3IgbGVuZ3RoIGZpZWxkcywgd2UgZG9uJ3QgbmVlZCB0aGlzIGZvcgorICAgICAqIHRoZSBsYXN0IGhlYWRlci4gKi8KKyAgICBpZiAoZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgICBkbyB7CisgICAgICAgIHNpemUrKzsKKyAgICAgICAgZXh0cmFsZW4rKzsKKyAgICAgICAgYnNpemUgPj49IDc7CisgICAgICB9IHdoaWxlIChic2l6ZSk7CisgICAgfQorICAgIC8qIHVwZGF0ZSBoYXNoICovCisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICBpZGVudCA9IGZudjFfaGFzaF8zMl91cGRhdGUgKGlkZW50LCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIH0KKworICAvKiBwYWNrZXQgbGVuZ3RoIGlzIGhlYWRlciBzaXplICsgcGFja2V0IGxlbmd0aCAqLworICBjb25maWdsZW4gPSBzaXplICsgbGVuZ3RoOworICBjb25maWcgPSBkYXRhID0gZ19tYWxsb2MgKGNvbmZpZ2xlbik7CisKKyAgLyogbnVtYmVyIG9mIHBhY2tlZCBoZWFkZXJzLCB3ZSBvbmx5IHBhY2sgMSBoZWFkZXIgKi8KKyAgZGF0YVswXSA9IDA7CisgIGRhdGFbMV0gPSAwOworICBkYXRhWzJdID0gMDsKKyAgZGF0YVszXSA9IDE7CisKKyAgaWRlbnQgPSBmbnYxX2hhc2hfMzJfdG9fMjQgKGlkZW50KTsKKyAgcnRwdm9yYmlzcGF5LT5wYXlsb2FkX2lkZW50ID0gaWRlbnQ7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHZvcmJpc3BheSwgImlkZW50IDB4JTA4eCIsIGlkZW50KTsKKworICAvKiB0YWtlIGxvd2VyIDMgYnl0ZXMgKi8KKyAgZGF0YVs0XSA9IChpZGVudCA+PiAxNikgJiAweGZmOworICBkYXRhWzVdID0gKGlkZW50ID4+IDgpICYgMHhmZjsKKyAgZGF0YVs2XSA9IGlkZW50ICYgMHhmZjsKKworICAvKiBzdG9yZSBsZW5ndGggb2YgYWxsIHZvcmJpcyBoZWFkZXJzICovCisgIGRhdGFbN10gPSAoKGxlbmd0aCkgPj4gOCkgJiAweGZmOworICBkYXRhWzhdID0gKGxlbmd0aCkgJiAweGZmOworCisgIC8qIHN0b3JlIG51bWJlciBvZiBoZWFkZXJzIG1pbnVzIG9uZS4gKi8KKyAgZGF0YVs5XSA9IG5faGVhZGVycyAtIDE7CisgIGRhdGEgKz0gMTA7CisKKyAgLyogc3RvcmUgbGVuZ3RoIGZvciBlYWNoIGhlYWRlciAqLworICBmb3IgKHdhbGsgPSBydHB2b3JiaXNwYXktPmhlYWRlcnM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZiA9IEdTVF9CVUZGRVJfQ0FTVCAod2Fsay0+ZGF0YSk7CisgICAgZ3VpbnQgYnNpemUsIHNpemUsIHRlbXA7CisgICAgZ3VpbnQgZmxhZzsKKworICAgIC8qIG9ubHkgbmVlZCB0byBzdG9yZSB0aGUgbGVuZ3RoIHdoZW4gaXQncyBub3QgdGhlIGxhc3QgaGVhZGVyICovCisgICAgaWYgKCFnX2xpc3RfbmV4dCAod2FsaykpCisgICAgICBicmVhazsKKworICAgIGJzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKworICAgIC8qIGNhbGMgc2l6ZSAqLworICAgIHNpemUgPSAwOworICAgIGRvIHsKKyAgICAgIHNpemUrKzsKKyAgICAgIGJzaXplID4+PSA3OworICAgIH0gd2hpbGUgKGJzaXplKTsKKyAgICB0ZW1wID0gc2l6ZTsKKworICAgIGJzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKyAgICAvKiB3cml0ZSB0aGUgc2l6ZSBiYWNrd2FyZHMgKi8KKyAgICBmbGFnID0gMDsKKyAgICB3aGlsZSAoc2l6ZSkgeworICAgICAgc2l6ZS0tOworICAgICAgZGF0YVtzaXplXSA9IChic2l6ZSAmIDB4N2YpIHwgZmxhZzsKKyAgICAgIGJzaXplID4+PSA3OworICAgICAgZmxhZyA9IDB4ODA7ICAgICAgICAgICAgICAvKiBGbGFnIGJpdCBvbiBhbGwgYnl0ZXMgb2YgdGhlIGxlbmd0aCBleGNlcHQgdGhlIGxhc3QgKi8KKyAgICB9CisgICAgZGF0YSArPSB0ZW1wOworICB9CisKKyAgLyogY29weSBoZWFkZXIgZGF0YSAqLworICBmb3IgKHdhbGsgPSBydHB2b3JiaXNwYXktPmhlYWRlcnM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZiA9IEdTVF9CVUZGRVJfQ0FTVCAod2Fsay0+ZGF0YSk7CisKKyAgICBnc3RfYnVmZmVyX2V4dHJhY3QgKGJ1ZiwgMCwgZGF0YSwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSk7CisgICAgZGF0YSArPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworICB9CisgIHJ0cHZvcmJpc3BheS0+bmVlZF9oZWFkZXJzID0gRkFMU0U7CisKKyAgLyogc2VyaWFsaXplIHRvIGJhc2U2NCAqLworICBjb25maWd1cmF0aW9uID0gZ19iYXNlNjRfZW5jb2RlIChjb25maWcsIGNvbmZpZ2xlbik7CisKKyAgLyogc3RvcmUgZm9yIGxhdGVyIHJlLXNlbmRpbmcgKi8KKyAgZ19mcmVlIChydHB2b3JiaXNwYXktPmNvbmZpZ19kYXRhKTsKKyAgcnRwdm9yYmlzcGF5LT5jb25maWdfc2l6ZSA9IGNvbmZpZ2xlbiAtIDQgLSAzIC0gMjsKKyAgcnRwdm9yYmlzcGF5LT5jb25maWdfZGF0YSA9IGdfbWFsbG9jIChydHB2b3JiaXNwYXktPmNvbmZpZ19zaXplKTsKKyAgcnRwdm9yYmlzcGF5LT5jb25maWdfZXh0cmFfbGVuID0gZXh0cmFsZW47CisgIG1lbWNweSAocnRwdm9yYmlzcGF5LT5jb25maWdfZGF0YSwgY29uZmlnICsgNCArIDMgKyAyLAorICAgICAgcnRwdm9yYmlzcGF5LT5jb25maWdfc2l6ZSk7CisKKyAgZ19mcmVlIChjb25maWcpOworCisgIC8qIGNvbmZpZ3VyZSBwYXlsb2FkZXIgc2V0dGluZ3MgKi8KKyAgY3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIiVkIiwgcnRwdm9yYmlzcGF5LT5jaGFubmVscyk7CisgIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vcHRpb25zIChiYXNlcGF5bG9hZCwgImF1ZGlvIiwgVFJVRSwgIlZPUkJJUyIsCisgICAgICBydHB2b3JiaXNwYXktPnJhdGUpOworICByZXMgPQorICAgICAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X291dGNhcHMgKGJhc2VwYXlsb2FkLCAiZW5jb2RpbmctcGFyYW1zIiwKKyAgICAgIEdfVFlQRV9TVFJJTkcsIGNzdHIsICJjb25maWd1cmF0aW9uIiwgR19UWVBFX1NUUklORywgY29uZmlndXJhdGlvbiwgTlVMTCk7CisgIGdfZnJlZSAoY3N0cik7CisgIGdfZnJlZSAoY29uZmlndXJhdGlvbik7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK25vX2hlYWRlcnM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHB2b3JiaXNwYXksICJmaW5pc2ggaGVhZGVycyIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdm9yYmlzX3BheV9wYXJzZV9pZCAoR3N0UlRQQmFzZVBheWxvYWQgKiBiYXNlcGF5bG9hZCwgZ3VpbnQ4ICogZGF0YSwKKyAgICBndWludCBzaXplKQoreworICBHc3RSdHBWb3JiaXNQYXkgKnJ0cHZvcmJpc3BheSA9IEdTVF9SVFBfVk9SQklTX1BBWSAoYmFzZXBheWxvYWQpOworICBndWludDggY2hhbm5lbHM7CisgIGdpbnQzMiByYXRlLCB2ZXJzaW9uOworCisgIGlmIChHX1VOTElLRUxZIChzaXplIDwgMTYpKQorICAgIGdvdG8gdG9vX3Nob3J0OworCisgIGlmIChHX1VOTElLRUxZIChtZW1jbXAgKGRhdGEsICJcMDAxdm9yYmlzIiwgNykpKQorICAgIGdvdG8gaW52YWxpZF9zdGFydDsKKyAgZGF0YSArPSA3OworCisgIGlmIChHX1VOTElLRUxZICgodmVyc2lvbiA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSkpICE9IDApKQorICAgIGdvdG8gaW52YWxpZF92ZXJzaW9uOworICBkYXRhICs9IDQ7CisKKyAgaWYgKEdfVU5MSUtFTFkgKChjaGFubmVscyA9ICpkYXRhKyspIDwgMSkpCisgICAgZ290byBpbnZhbGlkX2NoYW5uZWxzOworCisgIGlmIChHX1VOTElLRUxZICgocmF0ZSA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSkpIDwgMSkpCisgICAgZ290byBpbnZhbGlkX3JhdGU7CisKKyAgLyogYWxsIGZpbmUsIHN0b3JlIHRoZSB2YWx1ZXMgKi8KKyAgcnRwdm9yYmlzcGF5LT5jaGFubmVscyA9IGNoYW5uZWxzOworICBydHB2b3JiaXNwYXktPnJhdGUgPSByYXRlOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLwordG9vX3Nob3J0OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGJhc2VwYXlsb2FkLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJJZGVudGlmaWNhdGlvbiBwYWNrZXQgaXMgdG9vIHNob3J0LCBuZWVkIGF0IGxlYXN0IDE2LCBnb3QgJWQiLCBzaXplKSwKKyAgICAgICAgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfc3RhcnQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYmFzZXBheWxvYWQsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIkludmFsaWQgaGVhZGVyIHN0YXJ0IGluIGlkZW50aWZpY2F0aW9uIHBhY2tldCIpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQoraW52YWxpZF92ZXJzaW9uOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGJhc2VwYXlsb2FkLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJJbnZhbGlkIHZlcnNpb24sIGV4cGVjdGVkIDAsIGdvdCAlZCIsIHZlcnNpb24pLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQoraW52YWxpZF9yYXRlOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGJhc2VwYXlsb2FkLCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKCJJbnZhbGlkIHJhdGUgJWQiLCByYXRlKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfY2hhbm5lbHM6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYmFzZXBheWxvYWQsIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoIkludmFsaWQgY2hhbm5lbHMgJWQiLCBjaGFubmVscyksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3ZvcmJpc19wYXlfcGF5bG9hZF9idWZmZXIgKEdzdFJ0cFZvcmJpc1BheSAqIHJ0cHZvcmJpc3BheSwgZ3VpbnQ4IFZEVCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIsIGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsCisgICAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uLCBndWludCBub3RfaW5fbGVuZ3RoKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludCBuZXdzaXplOworICBndWludCBwYWNrZXRfbGVuOworICBHc3RDbG9ja1RpbWUgbmV3ZHVyYXRpb247CisgIGdib29sZWFuIGZsdXNoOworICBndWludCBwbGVuOworICBndWludDggKnBwb3MsICpwYXlsb2FkOworICBnYm9vbGVhbiBmcmFnbWVudGVkOworICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisKKyAgLyogc2l6ZSBpbmNyZWFzZXMgd2l0aCBwYWNrZXQgbGVuZ3RoIGFuZCAyIGJ5dGVzIHNpemUgZWFkZXIuICovCisgIG5ld2R1cmF0aW9uID0gcnRwdm9yYmlzcGF5LT5wYXlsb2FkX2R1cmF0aW9uOworICBpZiAoZHVyYXRpb24gIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICBuZXdkdXJhdGlvbiArPSBkdXJhdGlvbjsKKworICBuZXdzaXplID0gcnRwdm9yYmlzcGF5LT5wYXlsb2FkX3BvcyArIDIgKyBzaXplOworICBwYWNrZXRfbGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYWNrZXRfbGVuIChuZXdzaXplLCAwLCAwKTsKKworICAvKiBjaGVjayBidWZmZXIgZmlsbGVkIGFnYWluc3QgbGVuZ3RoIGFuZCBtYXggbGF0ZW5jeSAqLworICBmbHVzaCA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX2lzX2ZpbGxlZCAoR1NUX1JUUF9CQVNFX1BBWUxPQUQgKHJ0cHZvcmJpc3BheSksCisgICAgICBwYWNrZXRfbGVuLCBuZXdkdXJhdGlvbik7CisgIC8qIHdlIGNhbiBzdG9yZSB1cCB0byAxNSB2b3JiaXMgcGFja2V0cyBpbiBvbmUgUlRQIHBhY2tldC4gKi8KKyAgZmx1c2ggfD0gKHJ0cHZvcmJpc3BheS0+cGF5bG9hZF9wa3RzID09IDE1KTsKKyAgLyogZmx1c2ggaWYgd2UgaGF2ZSBhIG5ldyBWRFQgKi8KKyAgaWYgKHJ0cHZvcmJpc3BheS0+cGFja2V0KQorICAgIGZsdXNoIHw9IChydHB2b3JiaXNwYXktPnBheWxvYWRfVkRUICE9IFZEVCk7CisgIGlmIChmbHVzaCkKKyAgICByZXQgPSBnc3RfcnRwX3ZvcmJpc19wYXlfZmx1c2hfcGFja2V0IChydHB2b3JiaXNwYXkpOworCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBkb25lOworCisgIC8qIGNyZWF0ZSBuZXcgcGFja2V0IGlmIHdlIG11c3QgKi8KKyAgaWYgKCFydHB2b3JiaXNwYXktPnBhY2tldCkgeworICAgIGdzdF9ydHBfdm9yYmlzX3BheV9pbml0X3BhY2tldCAocnRwdm9yYmlzcGF5LCBWRFQsIHRpbWVzdGFtcCk7CisgIH0KKworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKHJ0cHZvcmJpc3BheS0+cGFja2V0LCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKyAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKyAgcHBvcyA9IHBheWxvYWQgKyBydHB2b3JiaXNwYXktPnBheWxvYWRfcG9zOworICBmcmFnbWVudGVkID0gRkFMU0U7CisKKyAgLyogcHV0IGJ1ZmZlciBpbiBwYWNrZXQsIGl0IGVpdGhlciBmaXRzIGNvbXBsZXRlbHkgb3IgbmVlZHMgdG8gYmUgZnJhZ21lbnRlZAorICAgKiBvdmVyIG11bHRpcGxlIFJUUCBwYWNrZXRzLiAqLworICBkbyB7CisgICAgcGxlbiA9IE1JTiAocnRwdm9yYmlzcGF5LT5wYXlsb2FkX2xlZnQgLSAyLCBzaXplKTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChydHB2b3JiaXNwYXksICJhcHBlbmQgJXUgYnl0ZXMiLCBwbGVuKTsKKworICAgIC8qIGRhdGEgaXMgY29waWVkIGluIHRoZSBwYXlsb2FkIHdpdGggYSAyIGJ5dGUgbGVuZ3RoIGhlYWRlciAqLworICAgIHBwb3NbMF0gPSAoKHBsZW4gLSBub3RfaW5fbGVuZ3RoKSA+PiA4KSAmIDB4ZmY7CisgICAgcHBvc1sxXSA9ICgocGxlbiAtIG5vdF9pbl9sZW5ndGgpICYgMHhmZik7CisgICAgaWYgKHBsZW4pCisgICAgICBtZW1jcHkgKCZwcG9zWzJdLCBkYXRhLCBwbGVuKTsKKworICAgIGlmIChidWZmZXIpIHsKKyAgICAgIGlmICghcnRwdm9yYmlzcGF5LT5wYWNrZXRfYnVmZmVycworICAgICAgICAgIHx8IHJ0cHZvcmJpc3BheS0+cGFja2V0X2J1ZmZlcnMtPmRhdGEgIT0gKGdwb2ludGVyKSBidWZmZXIpCisgICAgICAgIHJ0cHZvcmJpc3BheS0+cGFja2V0X2J1ZmZlcnMgPQorICAgICAgICAgICAgZ19saXN0X3ByZXBlbmQgKHJ0cHZvcmJpc3BheS0+cGFja2V0X2J1ZmZlcnMsCisgICAgICAgICAgICBnc3RfYnVmZmVyX3JlZiAoYnVmZmVyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdMaXN0ICpsOworCisgICAgICBmb3IgKGwgPSBydHB2b3JiaXNwYXktPmhlYWRlcnM7IGw7IGwgPSBsLT5uZXh0KQorICAgICAgICBydHB2b3JiaXNwYXktPnBhY2tldF9idWZmZXJzID0KKyAgICAgICAgICAgIGdfbGlzdF9wcmVwZW5kIChydHB2b3JiaXNwYXktPnBhY2tldF9idWZmZXJzLAorICAgICAgICAgICAgZ3N0X2J1ZmZlcl9yZWYgKGwtPmRhdGEpKTsKKyAgICB9CisKKyAgICAvKiBvbmx5IGZpcnN0IChvbmx5KSBjb25maWd1cmF0aW9uIGN1dHMgbGVuZ3RoIGZpZWxkICovCisgICAgLyogTk9URTogc3BlYyAoaWYgYW55KSBpcyBub3QgY2xlYXIgb24gdGhpcyAuLi4gKi8KKyAgICBub3RfaW5fbGVuZ3RoID0gMDsKKworICAgIHNpemUgLT0gcGxlbjsKKyAgICBkYXRhICs9IHBsZW47CisKKyAgICBydHB2b3JiaXNwYXktPnBheWxvYWRfcG9zICs9IHBsZW4gKyAyOworICAgIHJ0cHZvcmJpc3BheS0+cGF5bG9hZF9sZWZ0IC09IHBsZW4gKyAyOworCisgICAgaWYgKGZyYWdtZW50ZWQpIHsKKyAgICAgIGlmIChzaXplID09IDApCisgICAgICAgIC8qIGxhc3QgZnJhZ21lbnQsIHNldCBGIHRvIDB4My4gKi8KKyAgICAgICAgcnRwdm9yYmlzcGF5LT5wYXlsb2FkX0YgPSAweDM7CisgICAgICBlbHNlCisgICAgICAgIC8qIGZyYWdtZW50IGNvbnRpbnVlcywgc2V0IEYgdG8gMHgyLiAqLworICAgICAgICBydHB2b3JiaXNwYXktPnBheWxvYWRfRiA9IDB4MjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIC8qIGZyYWdtZW50ZWQgcGFja2V0IHN0YXJ0cywgc2V0IEYgdG8gMHgxLCBtYXJrIG91cnNlbHZlcyBhcworICAgICAgICAgKiBmcmFnbWVudGVkLiAqLworICAgICAgICBydHB2b3JiaXNwYXktPnBheWxvYWRfRiA9IDB4MTsKKyAgICAgICAgZnJhZ21lbnRlZCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICAgIGlmIChmcmFnbWVudGVkKSB7CisgICAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisgICAgICAvKiBmcmFnbWVudGVkIHBhY2tldHMgYXJlIGFsd2F5cyBmbHVzaGVkIGFuZCBoYXZlIHB0a3Mgb2YgMCAqLworICAgICAgcnRwdm9yYmlzcGF5LT5wYXlsb2FkX3BrdHMgPSAwOworICAgICAgcmV0ID0gZ3N0X3J0cF92b3JiaXNfcGF5X2ZsdXNoX3BhY2tldCAocnRwdm9yYmlzcGF5KTsKKworICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIC8qIHN0YXJ0IG5ldyBwYWNrZXQgYW5kIGdldCBwb2ludGVycy4gVkRUIHN0YXlzIHRoZSBzYW1lLiAqLworICAgICAgICBnc3RfcnRwX3ZvcmJpc19wYXlfaW5pdF9wYWNrZXQgKHJ0cHZvcmJpc3BheSwKKyAgICAgICAgICAgIHJ0cHZvcmJpc3BheS0+cGF5bG9hZF9WRFQsIHRpbWVzdGFtcCk7CisgICAgICAgIGdzdF9ydHBfYnVmZmVyX21hcCAocnRwdm9yYmlzcGF5LT5wYWNrZXQsIEdTVF9NQVBfV1JJVEUsICZydHApOworICAgICAgICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApOworICAgICAgICBwcG9zID0gcGF5bG9hZCArIHJ0cHZvcmJpc3BheS0+cGF5bG9hZF9wb3M7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHVuZnJhZ21lbnRlZCBwYWNrZXQsIHVwZGF0ZSBzdGF0cyBmb3IgbmV4dCBwYWNrZXQsIHNpemUgPT0gMCBhbmQgd2UKKyAgICAgICAqIGV4aXQgdGhlIHdoaWxlIGxvb3AgKi8KKyAgICAgIHJ0cHZvcmJpc3BheS0+cGF5bG9hZF9wa3RzKys7CisgICAgICBpZiAoZHVyYXRpb24gIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICAgICAgcnRwdm9yYmlzcGF5LT5wYXlsb2FkX2R1cmF0aW9uICs9IGR1cmF0aW9uOworICAgIH0KKyAgfSB3aGlsZSAoc2l6ZSAmJiByZXQgPT0gR1NUX0ZMT1dfT0spOworCisgIGlmIChydHAuYnVmZmVyKQorICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworZG9uZToKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF92b3JiaXNfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogYmFzZXBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBWb3JiaXNQYXkgKnJ0cHZvcmJpc3BheTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdE1hcEluZm8gbWFwOworICBnc2l6ZSBzaXplOworICBndWludDggKmRhdGE7CisgIEdzdENsb2NrVGltZSBkdXJhdGlvbiwgdGltZXN0YW1wOworICBndWludDggVkRUOworCisgIHJ0cHZvcmJpc3BheSA9IEdTVF9SVFBfVk9SQklTX1BBWSAoYmFzZXBheWxvYWQpOworCisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgc2l6ZSA9IG1hcC5zaXplOworICBkdXJhdGlvbiA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworCisgIEdTVF9MT0dfT0JKRUNUIChydHB2b3JiaXNwYXksICJzaXplICUiIEdfR1NJWkVfRk9STUFUCisgICAgICAiLCBkdXJhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQsIHNpemUsIEdTVF9USU1FX0FSR1MgKGR1cmF0aW9uKSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHNpemUgPCAxKSkKKyAgICBnb3RvIHdyb25nX3NpemU7CisKKyAgLyogZmluZCBwYWNrZXQgdHlwZSAqLworICBpZiAoZGF0YVswXSAmIDEpIHsKKyAgICAvKiBoZWFkZXIgKi8KKyAgICBpZiAoZGF0YVswXSA9PSAxKSB7CisgICAgICAvKiBpZGVudGlmaWNhdGlvbiwgd2UgbmVlZCB0byBwYXJzZSB0aGlzIGluIG9yZGVyIHRvIGdldCB0aGUgY2xvY2sgcmF0ZS4gKi8KKyAgICAgIGlmIChHX1VOTElLRUxZICghZ3N0X3J0cF92b3JiaXNfcGF5X3BhcnNlX2lkIChiYXNlcGF5bG9hZCwgZGF0YSwgc2l6ZSkpKQorICAgICAgICBnb3RvIHBhcnNlX2lkX2ZhaWxlZDsKKyAgICAgIFZEVCA9IDE7CisgICAgfSBlbHNlIGlmIChkYXRhWzBdID09IDMpIHsKKyAgICAgIC8qIGNvbW1lbnQgKi8KKyAgICAgIFZEVCA9IDI7CisgICAgfSBlbHNlIGlmIChkYXRhWzBdID09IDUpIHsKKyAgICAgIC8qIHNldHVwICovCisgICAgICBWRFQgPSAxOworICAgIH0gZWxzZQorICAgICAgZ290byB1bmtub3duX2hlYWRlcjsKKyAgfSBlbHNlCisgICAgLyogZGF0YSAqLworICAgIFZEVCA9IDA7CisKKyAgLyogd2UgbmVlZCB0byBjb2xsZWN0IHRoZSBoZWFkZXJzIGFuZCBjb25zdHJ1Y3QgYSBjb25maWcgc3RyaW5nIGZyb20gdGhlbSAqLworICBpZiAoVkRUICE9IDApIHsKKyAgICBydHB2b3JiaXNwYXktPm5lZWRfaGVhZGVycyA9IFRSVUU7CisgICAgaWYgKCFydHB2b3JiaXNwYXktPm5lZWRfaGVhZGVycyAmJiBWRFQgPT0gMSkgeworICAgICAgR1NUX0lORk9fT0JKRUNUIChydHB2b3JiaXNwYXksICJnZXR0aW5nIG5ldyBoZWFkZXJzLCByZXBsYWNlIGV4aXN0aW5nIik7CisgICAgICBnX2xpc3RfZnJlZV9mdWxsIChydHB2b3JiaXNwYXktPmhlYWRlcnMsCisgICAgICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfYnVmZmVyX3VucmVmKTsKKyAgICAgIHJ0cHZvcmJpc3BheS0+aGVhZGVycyA9IE5VTEw7CisgICAgfQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHZvcmJpc3BheSwgImNvbGxlY3RpbmcgaGVhZGVyIik7CisgICAgLyogYXBwZW5kIGhlYWRlciB0byB0aGUgbGlzdCBvZiBoZWFkZXJzLCBvciByZXBsYWNlCisgICAgICogaWYgdGhlIHNhbWUgdHlwZSBvZiBoZWFkZXIgd2FzIGFscmVhZHkgaW4gdGhlcmUuCisgICAgICoKKyAgICAgKiBUaGlzIHByZXZlbnRzIHN0b3JpbmcgYW4gaW5maW5pdGUgYW1vdW50IG9mIGUuZy4gY29tbWVudCBoZWFkZXJzLCB0aGVyZQorICAgICAqIG11c3Qgb25seSBiZSBvbmUgKi8KKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgICAgaWYgKHJ0cHZvcmJpc3BheS0+aGVhZGVycykgeworICAgICAgZ2Jvb2xlYW4gZm91bmQgPSBGQUxTRTsKKyAgICAgIEdMaXN0ICpsOworICAgICAgZ3VpbnQ4IG5ld19oZWFkZXJfdHlwZTsKKworICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChidWZmZXIsIDAsICZuZXdfaGVhZGVyX3R5cGUsIDEpOworCisgICAgICBmb3IgKGwgPSBydHB2b3JiaXNwYXktPmhlYWRlcnM7IGw7IGwgPSBsLT5uZXh0KSB7CisgICAgICAgIEdzdEJ1ZmZlciAqaGVhZGVyID0gbC0+ZGF0YTsKKyAgICAgICAgZ3VpbnQ4IGhlYWRlcl90eXBlOworCisgICAgICAgIGlmIChnc3RfYnVmZmVyX2V4dHJhY3QgKGhlYWRlciwgMCwgJmhlYWRlcl90eXBlLCAxKQorICAgICAgICAgICAgJiYgaGVhZGVyX3R5cGUgPT0gbmV3X2hlYWRlcl90eXBlKSB7CisgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGhlYWRlcik7CisgICAgICAgICAgbC0+ZGF0YSA9IGJ1ZmZlcjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgcnRwdm9yYmlzcGF5LT5oZWFkZXJzID0gZ19saXN0X2FwcGVuZCAocnRwdm9yYmlzcGF5LT5oZWFkZXJzLCBidWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICBydHB2b3JiaXNwYXktPmhlYWRlcnMgPSBnX2xpc3RfYXBwZW5kIChydHB2b3JiaXNwYXktPmhlYWRlcnMsIGJ1ZmZlcik7CisgICAgfQorCisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBkb25lOworICB9IGVsc2UgaWYgKHJ0cHZvcmJpc3BheS0+aGVhZGVycyAmJiBydHB2b3JiaXNwYXktPm5lZWRfaGVhZGVycykgeworICAgIGlmICghZ3N0X3J0cF92b3JiaXNfcGF5X2ZpbmlzaF9oZWFkZXJzIChiYXNlcGF5bG9hZCkpCisgICAgICBnb3RvIGhlYWRlcl9lcnJvcjsKKyAgfQorCisgIC8qIHRoZXJlIGlzIGEgY29uZmlnIHJlcXVlc3QsIHNlZSBpZiB3ZSBuZWVkIHRvIGluc2VydCBpdCAqLworICBpZiAocnRwdm9yYmlzcGF5LT5jb25maWdfaW50ZXJ2YWwgPiAwICYmIHJ0cHZvcmJpc3BheS0+Y29uZmlnX2RhdGEpIHsKKyAgICBnYm9vbGVhbiBzZW5kX2NvbmZpZyA9IEZBTFNFOworCisgICAgaWYgKHJ0cHZvcmJpc3BheS0+bGFzdF9jb25maWcgIT0gLTEpIHsKKyAgICAgIGd1aW50NjQgZGlmZjsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cHZvcmJpc3BheSwKKyAgICAgICAgICAibm93ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBsYXN0IGNvbmZpZyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSwgR1NUX1RJTUVfQVJHUyAocnRwdm9yYmlzcGF5LT5sYXN0X2NvbmZpZykpOworCisgICAgICAvKiBjYWxjdWxhdGUgZGlmZiBiZXR3ZWVuIGxhc3QgY29uZmlnIGluIG1pbGxpc2Vjb25kcyAqLworICAgICAgaWYgKHRpbWVzdGFtcCA+IHJ0cHZvcmJpc3BheS0+bGFzdF9jb25maWcpIHsKKyAgICAgICAgZGlmZiA9IHRpbWVzdGFtcCAtIHJ0cHZvcmJpc3BheS0+bGFzdF9jb25maWc7CisgICAgICB9IGVsc2UgeworICAgICAgICBkaWZmID0gMDsKKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwdm9yYmlzcGF5LAorICAgICAgICAgICJpbnRlcnZhbCBzaW5jZSBsYXN0IGNvbmZpZyAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGRpZmYpKTsKKworICAgICAgLyogYmlnZ2VyIHRoYW4gaW50ZXJ2YWwsIHF1ZXVlIGNvbmZpZyAqLworICAgICAgLyogRklYTUUgc2hvdWxkIGNvbnZlcnQgdGltZXN0YW1wcyB0byBydW5uaW5nIHRpbWUgKi8KKyAgICAgIGlmIChHU1RfVElNRV9BU19TRUNPTkRTIChkaWZmKSA+PSBydHB2b3JiaXNwYXktPmNvbmZpZ19pbnRlcnZhbCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHB2b3JiaXNwYXksICJ0aW1lIHRvIHNlbmQgY29uZmlnIik7CisgICAgICAgIHNlbmRfY29uZmlnID0gVFJVRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogbm8ga25vd24gcHJldmlvdXMgY29uZmlnIHRpbWUsIHNlbmQgbm93ICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHB2b3JiaXNwYXksICJubyBwcmV2aW91cyBjb25maWcgdGltZSwgc2VuZCBub3ciKTsKKyAgICAgIHNlbmRfY29uZmlnID0gVFJVRTsKKyAgICB9CisKKyAgICBpZiAoc2VuZF9jb25maWcpIHsKKyAgICAgIC8qIHdlIG5lZWQgdG8gc2VuZCBjb25maWcgbm93IGZpcnN0ICovCisgICAgICAvKiBkaWZmZXJlbnQgVERUIHR5cGUgZm9yY2VzIGZsdXNoICovCisgICAgICBnc3RfcnRwX3ZvcmJpc19wYXlfcGF5bG9hZF9idWZmZXIgKHJ0cHZvcmJpc3BheSwgMSwKKyAgICAgICAgICBOVUxMLCBydHB2b3JiaXNwYXktPmNvbmZpZ19kYXRhLCBydHB2b3JiaXNwYXktPmNvbmZpZ19zaXplLAorICAgICAgICAgIHRpbWVzdGFtcCwgR1NUX0NMT0NLX1RJTUVfTk9ORSwgcnRwdm9yYmlzcGF5LT5jb25maWdfZXh0cmFfbGVuKTsKKworICAgICAgaWYgKHRpbWVzdGFtcCAhPSAtMSkgeworICAgICAgICBydHB2b3JiaXNwYXktPmxhc3RfY29uZmlnID0gdGltZXN0YW1wOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldCA9CisgICAgICBnc3RfcnRwX3ZvcmJpc19wYXlfcGF5bG9hZF9idWZmZXIgKHJ0cHZvcmJpc3BheSwgVkRULCBidWZmZXIsIGRhdGEsIHNpemUsCisgICAgICB0aW1lc3RhbXAsIGR1cmF0aW9uLCAwKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCitkb25lOgorICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLword3Jvbmdfc2l6ZToKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJ0cHZvcmJpc3BheSwgU1RSRUFNLCBERUNPREUsCisgICAgICAgICgiSW52YWxpZCBwYWNrZXQgc2l6ZSAoMSA8ICUiIEdfR1NJWkVfRk9STUFUICIpIiwgc2l6ZSksIChOVUxMKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorcGFyc2VfaWRfZmFpbGVkOgorICB7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQordW5rbm93bl9oZWFkZXI6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHB2b3JiaXNwYXksIFNUUkVBTSwgREVDT0RFLAorICAgICAgICAoTlVMTCksICgiSWdub3JpbmcgdW5rbm93biBoZWFkZXIgcmVjZWl2ZWQiKSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQoraGVhZGVyX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwdm9yYmlzcGF5LCBTVFJFQU0sIERFQ09ERSwKKyAgICAgICAgKE5VTEwpLCAoIkVycm9yIGluaXRpYWxpemluZyBoZWFkZXIgY29uZmlnIikpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3ZvcmJpc19wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBWb3JiaXNQYXkgKnJ0cHZvcmJpc3BheSA9IEdTVF9SVFBfVk9SQklTX1BBWSAocGF5bG9hZCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9ydHBfdm9yYmlzX3BheV9jbGVhcl9wYWNrZXQgKHJ0cHZvcmJpc3BheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgLyogZmFsc2UgdG8gbGV0IHBhcmVudCBoYW5kbGUgZXZlbnQgYXMgd2VsbCAqLworICByZXR1cm4gR1NUX1JUUF9CQVNFX1BBWUxPQURfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKHBheWxvYWQsIGV2ZW50KTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX3ZvcmJpc19wYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSdHBWb3JiaXNQYXkgKnJ0cHZvcmJpc3BheTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJ0cHZvcmJpc3BheSA9IEdTVF9SVFBfVk9SQklTX1BBWSAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfdm9yYmlzX3BheV9jbGVhbnVwIChydHB2b3JiaXNwYXkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZvcmJpc19wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cFZvcmJpc1BheSAqcnRwdm9yYmlzcGF5OworCisgIHJ0cHZvcmJpc3BheSA9IEdTVF9SVFBfVk9SQklTX1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ09ORklHX0lOVEVSVkFMOgorICAgICAgcnRwdm9yYmlzcGF5LT5jb25maWdfaW50ZXJ2YWwgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdm9yYmlzX3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwVm9yYmlzUGF5ICpydHB2b3JiaXNwYXk7CisKKyAgcnRwdm9yYmlzcGF5ID0gR1NUX1JUUF9WT1JCSVNfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DT05GSUdfSU5URVJWQUw6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnRwdm9yYmlzcGF5LT5jb25maWdfaW50ZXJ2YWwpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3ZvcmJpc19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHB2b3JiaXNwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfVk9SQklTX1BBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHZvcmJpc3BheS5oIGIvZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQ2OTNhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHB2b3JiaXNwYXkuaApAQCAtMCwwICsxLDg1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfVk9SQklTX1BBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1ZPUkJJU19QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9WT1JCSVNfUEFZIFwKKyAgKGdzdF9ydHBfdm9yYmlzX3BheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX1ZPUkJJU19QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfVk9SQklTX1BBWSxHc3RSdHBWb3JiaXNQYXkpKQorI2RlZmluZSBHU1RfUlRQX1ZPUkJJU19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX1ZPUkJJU19QQVksR3N0UnRwVm9yYmlzUGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1ZPUkJJU19QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfVk9SQklTX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfVk9SQklTX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfVk9SQklTX1BBWSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBWb3JiaXNQYXkgR3N0UnRwVm9yYmlzUGF5OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFZvcmJpc1BheUNsYXNzIEdzdFJ0cFZvcmJpc1BheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cFZvcmJpc1BheQoreworICBHc3RSVFBCYXNlUGF5bG9hZCBwYXlsb2FkOworCisgIC8qIHRoZSBoZWFkZXJzICovCisgIGdib29sZWFuICAgICAgbmVlZF9oZWFkZXJzOworICBHTGlzdCAgICAgICAgKmhlYWRlcnM7CisKKyAgLyogcXVldWVzIG9mIGJ1ZmZlcnMgYWxvbmcgd2l0aCBzb21lIHN0YXRzLiAqLworICBHc3RCdWZmZXIgICAgKnBhY2tldDsKKyAgR0xpc3QgICAgICAgICpwYWNrZXRfYnVmZmVyczsKKyAgZ3VpbnQgICAgICAgICBwYXlsb2FkX3BvczsKKyAgZ3VpbnQgICAgICAgICBwYXlsb2FkX2xlZnQ7CisgIGd1aW50MzIgICAgICAgcGF5bG9hZF9pZGVudDsKKyAgZ3VpbnQ4ICAgICAgICBwYXlsb2FkX0Y7CisgIGd1aW50OCAgICAgICAgcGF5bG9hZF9WRFQ7CisgIGd1aW50ICAgICAgICAgcGF5bG9hZF9wa3RzOworICBHc3RDbG9ja1RpbWUgIHBheWxvYWRfdGltZXN0YW1wOworICBHc3RDbG9ja1RpbWUgIHBheWxvYWRfZHVyYXRpb247CisKKyAgLyogY29uZmlnIChyZS1zZW5kaW5nKSAqLworICBndWludDggICAgICAgKmNvbmZpZ19kYXRhOworICBndWludCAgICAgICAgIGNvbmZpZ19zaXplOworICBndWludCAgICAgICAgIGNvbmZpZ19leHRyYV9sZW47CisgIGd1aW50ICAgICAgICAgY29uZmlnX2ludGVydmFsOworICBHc3RDbG9ja1RpbWUgIGxhc3RfY29uZmlnOworCisgIGdpbnQgICAgICAgICAgcmF0ZTsKKyAgZ2ludCAgICAgICAgICBjaGFubmVsczsKK307CisKK3N0cnVjdCBfR3N0UnRwVm9yYmlzUGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX3ZvcmJpc19wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX3ZvcmJpc19wYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfVk9SQklTX1BBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdnA4ZGVwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwdnA4ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzBkNzA3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5jCkBAIC0wLDAgKzEsMjkyIEBACisvKiBnc3RydHB2cDhkZXBheS5jIC0gU291cmNlIGZvciBHc3RSdHBWUDhEZXBheQorICogQ29weXJpZ2h0IChDKSAyMDExIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBDb2xsYWJvcmEgTHRkLgorICogICBDb250YWN0OiBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0cnRwdnA4ZGVwYXkuaCIKKyNpbmNsdWRlICJnc3RydHB1dGlscy5oIgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfcnRwX3ZwOF9kZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfcnRwX3ZwOF9kZXBheV9kZWJ1ZworCitzdGF0aWMgdm9pZCBnc3RfcnRwX3ZwOF9kZXBheV9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyBHc3RCdWZmZXIgKmdzdF9ydHBfdnA4X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX3ZwOF9kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKgorICAgIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfdnA4X2RlcGF5X2hhbmRsZV9ldmVudCAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitHX0RFRklORV9UWVBFIChHc3RSdHBWUDhEZXBheSwgZ3N0X3J0cF92cDhfZGVwYXksIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3ZwOF9kZXBheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoInZpZGVvL3gtdnA4IikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF92cDhfZGVwYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSB7IFwiVlA4XCIsIFwiVlA4LURSQUZULUlFVEYtMDFcIiB9IikpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92cDhfZGVwYXlfaW5pdCAoR3N0UnRwVlA4RGVwYXkgKiBzZWxmKQoreworICBzZWxmLT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICBzZWxmLT5zdGFydGVkID0gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZwOF9kZXBheV9jbGFzc19pbml0IChHc3RSdHBWUDhEZXBheUNsYXNzICogZ3N0X3J0cF92cDhfZGVwYXlfY2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGdzdF9ydHBfdnA4X2RlcGF5X2NsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGdzdF9ydHBfdnA4X2RlcGF5X2NsYXNzKTsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpkZXBheV9jbGFzcyA9CisgICAgICAoR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICopIChnc3RfcnRwX3ZwOF9kZXBheV9jbGFzcyk7CisKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3ZwOF9kZXBheV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF92cDhfZGVwYXlfc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiUlRQIFZQOCBkZXBheWxvYWRlciIsCisgICAgICAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIFZQOCB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzKSIsCisgICAgICAiU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PiIpOworCisgIG9iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9ydHBfdnA4X2RlcGF5X2Rpc3Bvc2U7CisKKyAgZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3J0cF92cDhfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGRlcGF5X2NsYXNzLT5wcm9jZXNzX3J0cF9wYWNrZXQgPSBnc3RfcnRwX3ZwOF9kZXBheV9wcm9jZXNzOworICBkZXBheV9jbGFzcy0+aGFuZGxlX2V2ZW50ID0gZ3N0X3J0cF92cDhfZGVwYXlfaGFuZGxlX2V2ZW50OworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfcnRwX3ZwOF9kZXBheV9kZWJ1ZywgInJ0cHZwOGRlcGF5IiwgMCwKKyAgICAgICJWUDggVmlkZW8gUlRQIERlcGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZwOF9kZXBheV9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSdHBWUDhEZXBheSAqc2VsZiA9IEdTVF9SVFBfVlA4X0RFUEFZIChvYmplY3QpOworCisgIGlmIChzZWxmLT5hZGFwdGVyICE9IE5VTEwpCisgICAgZ19vYmplY3RfdW5yZWYgKHNlbGYtPmFkYXB0ZXIpOworICBzZWxmLT5hZGFwdGVyID0gTlVMTDsKKworICAvKiByZWxlYXNlIGFueSByZWZlcmVuY2VzIGhlbGQgYnkgdGhlIG9iamVjdCBoZXJlICovCisKKyAgaWYgKEdfT0JKRUNUX0NMQVNTIChnc3RfcnRwX3ZwOF9kZXBheV9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlKQorICAgIEdfT0JKRUNUX0NMQVNTIChnc3RfcnRwX3ZwOF9kZXBheV9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF9ydHBfdnA4X2RlcGF5X3Byb2Nlc3MgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheSwgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBWUDhEZXBheSAqc2VsZiA9IEdTVF9SVFBfVlA4X0RFUEFZIChkZXBheSk7CisgIEdzdEJ1ZmZlciAqcGF5bG9hZDsKKyAgZ3VpbnQ4ICpkYXRhOworICBndWludCBoZHJzaXplOworICBndWludCBzaXplOworCisgIGlmIChHX1VOTElLRUxZIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKHJ0cC0+YnVmZmVyKSkpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoc2VsZiwgIkRpc2NvbnRpbnVpdHksIGZsdXNoaW5nIGFkYXB0ZXIiKTsKKyAgICBnc3RfYWRhcHRlcl9jbGVhciAoc2VsZi0+YWRhcHRlcik7CisgICAgc2VsZi0+c3RhcnRlZCA9IEZBTFNFOworICB9CisKKyAgc2l6ZSA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAocnRwKTsKKworICAvKiBBdCBsZWFzdCBvbmUgaGVhZGVyIGFuZCBvbmUgdnA4IGJ5dGUgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHNpemUgPCAyKSkKKyAgICBnb3RvIHRvb19zbWFsbDsKKworICBkYXRhID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFzZWxmLT5zdGFydGVkKSkgeworICAgIC8qIENoZWNrIGlmIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgVlA4IGZyYW1lLCBvdGhlcndpc2UgYmFpbCAqLworICAgIC8qIFM9MSBhbmQgUGFydElEPSAwICovCisgICAgaWYgKChkYXRhWzBdICYgMHgxNykgIT0gMHgxMCkKKyAgICAgIGdvdG8gZG9uZTsKKworICAgIHNlbGYtPnN0YXJ0ZWQgPSBUUlVFOworICB9CisKKyAgaGRyc2l6ZSA9IDE7CisgIC8qIENoZWNrIFggb3B0aW9uYWwgaGVhZGVyICovCisgIGlmICgoZGF0YVswXSAmIDB4ODApICE9IDApIHsKKyAgICBoZHJzaXplKys7CisgICAgLyogQ2hlY2sgSSBvcHRpb25hbCBoZWFkZXIgKi8KKyAgICBpZiAoKGRhdGFbMV0gJiAweDgwKSAhPSAwKSB7CisgICAgICBpZiAoR19VTkxJS0VMWSAoc2l6ZSA8IDMpKQorICAgICAgICBnb3RvIHRvb19zbWFsbDsKKyAgICAgIGhkcnNpemUrKzsKKyAgICAgIC8qIENoZWNrIGZvciAxNiBiaXRzIFBpY3R1cmVJRCAqLworICAgICAgaWYgKChkYXRhWzJdICYgMHg4MCkgIT0gMCkKKyAgICAgICAgaGRyc2l6ZSsrOworICAgIH0KKyAgICAvKiBDaGVjayBMIG9wdGlvbmFsIGhlYWRlciAqLworICAgIGlmICgoZGF0YVsxXSAmIDB4NDApICE9IDApCisgICAgICBoZHJzaXplKys7CisgICAgLyogQ2hlY2sgVCBvciBLIG9wdGlvbmFsIGhlYWRlcnMgKi8KKyAgICBpZiAoKGRhdGFbMV0gJiAweDIwKSAhPSAwIHx8IChkYXRhWzFdICYgMHgxMCkgIT0gMCkKKyAgICAgIGhkcnNpemUrKzsKKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChkZXBheSwgImhkcnNpemUgJXUsIHNpemUgJXUiLCBoZHJzaXplLCBzaXplKTsKKworICBpZiAoR19VTkxJS0VMWSAoaGRyc2l6ZSA+PSBzaXplKSkKKyAgICBnb3RvIHRvb19zbWFsbDsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfc3ViYnVmZmVyIChydHAsIGhkcnNpemUsIC0xKTsKKyAgZ3N0X2FkYXB0ZXJfcHVzaCAoc2VsZi0+YWRhcHRlciwgcGF5bG9hZCk7CisKKyAgLyogTWFya2VyIGluZGljYXRlcyB0aGF0IGl0IHdhcyB0aGUgbGFzdCBydHAgcGFja2V0IGZvciB0aGlzIGZyYW1lICovCisgIGlmIChnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApKSB7CisgICAgR3N0QnVmZmVyICpvdXQ7CisgICAgZ3VpbnQ4IGhlYWRlclsxMF07CisKKyAgICBpZiAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzZWxmLT5hZGFwdGVyKSA8IDEwKQorICAgICAgZ290byB0b29fc21hbGw7CisgICAgZ3N0X2FkYXB0ZXJfY29weSAoc2VsZi0+YWRhcHRlciwgJmhlYWRlciwgMCwgMTApOworCisgICAgb3V0ID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHNlbGYtPmFkYXB0ZXIsCisgICAgICAgIGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoc2VsZi0+YWRhcHRlcikpOworCisgICAgc2VsZi0+c3RhcnRlZCA9IEZBTFNFOworCisgICAgLyogbWFyayBrZXlmcmFtZXMgKi8KKyAgICBvdXQgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKG91dCk7CisgICAgLyogRmlsdGVyIGF3YXkgYWxsIG1ldGFzIHRoYXQgYXJlIG5vdCBzZW5zaWJsZSB0byBjb3B5ICovCisgICAgZ3N0X3J0cF9kcm9wX25vbl92aWRlb19tZXRhIChzZWxmLCBvdXQpOworICAgIGlmICgoaGVhZGVyWzBdICYgMHgwMSkpIHsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dCwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgICAgICBpZiAoIXNlbGYtPmNhcHNfc2VudCkgeworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChvdXQpOworICAgICAgICBvdXQgPSBOVUxMOworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHNlbGYsICJEcm9wcGluZyBpbnRlci1mcmFtZSBiZWZvcmUgaW50cmEtZnJhbWUiKTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NJTktQQUQgKGRlcGF5KSwKKyAgICAgICAgICAgIGdzdF92aWRlb19ldmVudF9uZXdfdXBzdHJlYW1fZm9yY2Vfa2V5X3VuaXQgKEdTVF9DTE9DS19USU1FX05PTkUsCisgICAgICAgICAgICAgICAgVFJVRSwgMCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBndWludCBwcm9maWxlLCB3aWR0aCwgaGVpZ2h0OworCisgICAgICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKG91dCwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgICAgICBwcm9maWxlID0gKGhlYWRlclswXSAmIDB4MGUpID4+IDE7CisgICAgICB3aWR0aCA9IEdTVF9SRUFEX1VJTlQxNl9MRSAoaGVhZGVyICsgNikgJiAweDNmZmY7CisgICAgICBoZWlnaHQgPSBHU1RfUkVBRF9VSU5UMTZfTEUgKGhlYWRlciArIDgpICYgMHgzZmZmOworCisgICAgICBpZiAoR19VTkxJS0VMWSAoc2VsZi0+bGFzdF93aWR0aCAhPSB3aWR0aCB8fAorICAgICAgICAgICAgICBzZWxmLT5sYXN0X2hlaWdodCAhPSBoZWlnaHQgfHwgc2VsZi0+bGFzdF9wcm9maWxlICE9IHByb2ZpbGUpKSB7CisgICAgICAgIGdjaGFyIHByb2ZpbGVfc3RyWzNdOworICAgICAgICBHc3RDYXBzICpzcmNjYXBzOworCisgICAgICAgIHNucHJpbnRmIChwcm9maWxlX3N0ciwgMywgIiV1IiwgcHJvZmlsZSk7CisgICAgICAgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC12cDgiLAorICAgICAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLCAwLCAxLAorICAgICAgICAgICAgImhlaWdodCIsIEdfVFlQRV9JTlQsIGhlaWdodCwKKyAgICAgICAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHdpZHRoLAorICAgICAgICAgICAgInByb2ZpbGUiLCBHX1RZUEVfU1RSSU5HLCBwcm9maWxlX3N0ciwgTlVMTCk7CisKKyAgICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKGRlcGF5KSwgc3JjY2Fwcyk7CisgICAgICAgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICAgICAgICBzZWxmLT5jYXBzX3NlbnQgPSBUUlVFOworICAgICAgICBzZWxmLT5sYXN0X3dpZHRoID0gd2lkdGg7CisgICAgICAgIHNlbGYtPmxhc3RfaGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBzZWxmLT5sYXN0X3Byb2ZpbGUgPSBwcm9maWxlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvdXQ7CisgIH0KKworZG9uZToKKyAgcmV0dXJuIE5VTEw7CisKK3Rvb19zbWFsbDoKKyAgR1NUX0xPR19PQkpFQ1QgKHNlbGYsICJJbnZhbGlkIHJ0cCBwYWNrZXQgKHRvbyBzbWFsbCksIGlnbm9yaW5nIik7CisgIGdzdF9hZGFwdGVyX2NsZWFyIChzZWxmLT5hZGFwdGVyKTsKKyAgc2VsZi0+c3RhcnRlZCA9IEZBTFNFOworCisgIGdvdG8gZG9uZTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX3ZwOF9kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RSdHBWUDhEZXBheSAqc2VsZiA9IEdTVF9SVFBfVlA4X0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgc2VsZi0+bGFzdF9wcm9maWxlID0gLTE7CisgICAgICBzZWxmLT5sYXN0X2hlaWdodCA9IC0xOworICAgICAgc2VsZi0+bGFzdF93aWR0aCA9IC0xOworICAgICAgc2VsZi0+Y2Fwc19zZW50ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4KKyAgICAgIEdTVF9FTEVNRU5UX0NMQVNTIChnc3RfcnRwX3ZwOF9kZXBheV9wYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsCisgICAgICB0cmFuc2l0aW9uKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3ZwOF9kZXBheV9oYW5kbGVfZXZlbnQgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheSwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwVlA4RGVwYXkgKnNlbGYgPSBHU1RfUlRQX1ZQOF9ERVBBWSAoZGVwYXkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgICBzZWxmLT5sYXN0X3Byb2ZpbGUgPSAtMTsKKyAgICAgIHNlbGYtPmxhc3RfaGVpZ2h0ID0gLTE7CisgICAgICBzZWxmLT5sYXN0X3dpZHRoID0gLTE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4KKyAgICAgIEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfQ0xBU1MKKyAgICAgIChnc3RfcnRwX3ZwOF9kZXBheV9wYXJlbnRfY2xhc3MpLT5oYW5kbGVfZXZlbnQgKGRlcGF5LCBldmVudCk7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3ZwOF9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHZwOGRlcGF5IiwKKyAgICAgIEdTVF9SQU5LX01BUkdJTkFMLCBHU1RfVFlQRV9SVFBfVlA4X0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdnA4ZGVwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwdnA4ZGVwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTg1NDZhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHB2cDhkZXBheS5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBnc3RydHB2cDhkZXBheS5oIC0gSGVhZGVyIGZvciBHc3RSdHBWUDhEZXBheQorICogQ29weXJpZ2h0IChDKSAyMDExIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfVlA4X0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfVlA4X0RFUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1ZQOF9ERVBBWSBcCisgIChnc3RfcnRwX3ZwOF9kZXBheV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX1ZQOF9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLCBHU1RfVFlQRV9SVFBfVlA4X0RFUEFZLCBHc3RSdHBWUDhEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfVlA4X0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLCBHU1RfVFlQRV9SVFBfVlA4X0RFUEFZLCBcCisgICAgR3N0UnRwVlA4RGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfVlA4X0RFUEFZKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksIEdTVF9UWVBFX1JUUF9WUDhfREVQQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX1ZQOF9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSwgR1NUX1RZUEVfUlRQX1ZQOF9ERVBBWSkpCisjZGVmaW5lIEdTVF9SVFBfVlA4X0RFUEFZX0dFVF9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9SVFBfVlA4X0RFUEFZLCBcCisgICAgR3N0UnRwVlA4RGVwYXlDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBWUDhEZXBheSBHc3RSdHBWUDhEZXBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBWUDhEZXBheUNsYXNzIEdzdFJ0cFZQOERlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwVlA4RGVwYXlDbGFzcworeworICBHc3RSVFBCYXNlRGVwYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworc3RydWN0IF9Hc3RSdHBWUDhEZXBheQoreworICBHc3RSVFBCYXNlRGVwYXlsb2FkIHBhcmVudDsKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKyAgZ2Jvb2xlYW4gc3RhcnRlZDsKKworICBnYm9vbGVhbiBjYXBzX3NlbnQ7CisgIGdpbnQgbGFzdF9wcm9maWxlOworICBnaW50IGxhc3Rfd2lkdGg7CisgIGdpbnQgbGFzdF9oZWlnaHQ7Cit9OworCitHVHlwZSBnc3RfcnRwX3ZwOF9kZXBheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfdnA4X2RlcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogI2lmbmRlZiBfX0dTVF9SVFBfVlA4X0RFUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHB2cDhwYXkuYyBiL2dzdC9ydHAvZ3N0cnRwdnA4cGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0OTUwMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwdnA4cGF5LmMKQEAgLTAsMCArMSw1NDEgQEAKKy8qCisgKiBnc3RydHB2cDhwYXkuYyAtIFNvdXJjZSBmb3IgR3N0UnRwVlA4UGF5CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2pvZXJkIFNpbW9ucyA8c2pvZXJkQGx1b24ubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDExIENvbGxhYm9yYSBMdGQuCisgKiAgIENvbnRhY3Q6IFlvdW5lc3MgQWxhb3VpIDx5b3VuZXNzLmFsYW91aUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Yml0cmVhZGVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBwYXlsb2Fkcy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSAiZGJvb2xodWZmLmgiCisjaW5jbHVkZSAiZ3N0cnRwdnA4cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF92cDhfcGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9ydHBfdnA4X3BheV9kZWJ1ZworCisjZGVmaW5lIERFRkFVTFRfUElDVFVSRV9JRF9NT0RFIFZQOF9QQVlfTk9fUElDVFVSRV9JRAorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9QSUNUVVJFX0lEX01PREUKK307CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1ZQOF9QQVlfUElDVFVSRV9JRF9NT0RFIChnc3RfcnRwX3ZwOF9wYXlfcGljdHVyZV9pZF9tb2RlX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9ydHBfdnA4X3BheV9waWN0dXJlX2lkX21vZGVfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBtb2RlX3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBtb2Rlc1tdID0geworICAgIHtWUDhfUEFZX05PX1BJQ1RVUkVfSUQsICJObyBQaWN0dXJlIElEIiwgIm5vbmUifSwKKyAgICB7VlA4X1BBWV9QSUNUVVJFX0lEXzdCSVRTLCAiNy1iaXQgUGljdHVyZSBJRCIsICI3LWJpdCJ9LAorICAgIHtWUDhfUEFZX1BJQ1RVUkVfSURfMTVCSVRTLCAiMTUtYml0IFBpY3R1cmUgSUQiLCAiMTUtYml0In0sCisgICAgezAsIE5VTEwsIE5VTEx9LAorICB9OworCisgIGlmICghbW9kZV90eXBlKSB7CisgICAgbW9kZV90eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFZQOFJUUFBheU1vZGUiLCBtb2Rlcyk7CisgIH0KKyAgcmV0dXJuIG1vZGVfdHlwZTsKK30KKworc3RhdGljIHZvaWQgZ3N0X3J0cF92cDhfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfdnA4X3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfdnA4X3BheV9oYW5kbGVfYnVmZmVyIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3ZwOF9wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfdnA4X3BheV9zZXRfY2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworR19ERUZJTkVfVFlQRSAoR3N0UnRwVlA4UGF5LCBnc3RfcnRwX3ZwOF9wYXksIEdTVF9UWVBFX1JUUF9CQVNFX1BBWUxPQUQpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF92cDhfcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgInBheWxvYWQgPSAoaW50KSAiIEdTVF9SVFBfUEFZTE9BRF9EWU5BTUlDX1NUUklORyAiLCIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIHsgXCJWUDhcIiwgXCJWUDgtRFJBRlQtSUVURi0wMVwiIH0iKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3ZwOF9wYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXZwOCIpKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdnA4X3BheV9pbml0IChHc3RSdHBWUDhQYXkgKiBvYmopCit7CisgIG9iai0+cGljdHVyZV9pZF9tb2RlID0gREVGQVVMVF9QSUNUVVJFX0lEX01PREU7CisgIGlmIChvYmotPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDhfUEFZX1BJQ1RVUkVfSURfN0JJVFMpCisgICAgb2JqLT5waWN0dXJlX2lkID0gZ19yYW5kb21faW50X3JhbmdlICgwLCBHX01BWFVJTlQ4KSAmIDB4N0Y7CisgIGVsc2UgaWYgKG9iai0+cGljdHVyZV9pZF9tb2RlID09IFZQOF9QQVlfUElDVFVSRV9JRF8xNUJJVFMpCisgICAgb2JqLT5waWN0dXJlX2lkID0gZ19yYW5kb21faW50X3JhbmdlICgwLCBHX01BWFVJTlQxNikgJiAweDdGRkY7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZwOF9wYXlfY2xhc3NfaW5pdCAoR3N0UnRwVlA4UGF5Q2xhc3MgKiBnc3RfcnRwX3ZwOF9wYXlfY2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChnc3RfcnRwX3ZwOF9wYXlfY2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoZ3N0X3J0cF92cDhfcGF5X2NsYXNzKTsKKyAgR3N0UlRQQmFzZVBheWxvYWRDbGFzcyAqcGF5X2NsYXNzID0KKyAgICAgIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChnc3RfcnRwX3ZwOF9wYXlfY2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9ydHBfdnA4X3BheV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9ydHBfdnA4X3BheV9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QSUNUVVJFX0lEX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoInBpY3R1cmUtaWQtbW9kZSIsICJQaWN0dXJlIElEIE1vZGUiLAorICAgICAgICAgICJUaGUgcGljdHVyZSBJRCBtb2RlIGZvciBwYXlsb2FkaW5nIiwKKyAgICAgICAgICBHU1RfVFlQRV9SVFBfVlA4X1BBWV9QSUNUVVJFX0lEX01PREUsIERFRkFVTFRfUElDVFVSRV9JRF9NT0RFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfdnA4X3BheV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF92cDhfcGF5X3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIlJUUCBWUDggcGF5bG9hZGVyIiwKKyAgICAgICJDb2RlYy9QYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIlB1dHMgVlA4IHZpZGVvIGluIFJUUCBwYWNrZXRzIiwgIlNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4iKTsKKworICBwYXlfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX3ZwOF9wYXlfaGFuZGxlX2J1ZmZlcjsKKyAgcGF5X2NsYXNzLT5zaW5rX2V2ZW50ID0gZ3N0X3J0cF92cDhfcGF5X3NpbmtfZXZlbnQ7CisgIHBheV9jbGFzcy0+c2V0X2NhcHMgPSBnc3RfcnRwX3ZwOF9wYXlfc2V0X2NhcHM7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9ydHBfdnA4X3BheV9kZWJ1ZywgInJ0cHZwOHBheSIsIDAsCisgICAgICAiVlA4IFZpZGVvIFJUUCBQYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdnA4X3BheV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwVlA4UGF5ICpydHB2cDhwYXkgPSBHU1RfUlRQX1ZQOF9QQVkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BJQ1RVUkVfSURfTU9ERToKKyAgICAgIHJ0cHZwOHBheS0+cGljdHVyZV9pZF9tb2RlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgaWYgKHJ0cHZwOHBheS0+cGljdHVyZV9pZF9tb2RlID09IFZQOF9QQVlfUElDVFVSRV9JRF83QklUUykKKyAgICAgICAgcnRwdnA4cGF5LT5waWN0dXJlX2lkID0gZ19yYW5kb21faW50X3JhbmdlICgwLCBHX01BWFVJTlQ4KSAmIDB4N0Y7CisgICAgICBlbHNlIGlmIChydHB2cDhwYXktPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDhfUEFZX1BJQ1RVUkVfSURfMTVCSVRTKQorICAgICAgICBydHB2cDhwYXktPnBpY3R1cmVfaWQgPSBnX3JhbmRvbV9pbnRfcmFuZ2UgKDAsIEdfTUFYVUlOVDE2KSAmIDB4N0ZGRjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdnA4X3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwVlA4UGF5ICpydHB2cDhwYXkgPSBHU1RfUlRQX1ZQOF9QQVkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BJQ1RVUkVfSURfTU9ERToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBydHB2cDhwYXktPnBpY3R1cmVfaWRfbW9kZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF92cDhfcGF5X3BhcnNlX2ZyYW1lIChHc3RSdHBWUDhQYXkgKiBzZWxmLCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgZ3NpemUgYnVmZmVyX3NpemUpCit7CisgIEdzdE1hcEluZm8gbWFwID0gR1NUX01BUF9JTkZPX0lOSVQ7CisgIEdzdEJpdFJlYWRlciByZWFkZXI7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgc2l6ZTsKKyAgaW50IGk7CisgIGdib29sZWFuIGtleWZyYW1lOworICBndWludDMyIHBhcnRpdGlvbjBfc2l6ZTsKKyAgZ3VpbnQ4IHZlcnNpb247CisgIGd1aW50OCB0bXA4ID0gMDsKKyAgZ3VpbnQ4IHBhcnRpdGlvbnM7CisgIGd1aW50IG9mZnNldDsKKyAgQk9PTF9ERUNPREVSIGJjOworICBndWludDggKnBkYXRhOworCisgIGlmIChHX1VOTElLRUxZIChidWZmZXJfc2l6ZSA8IDMpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpIHx8ICFtYXAuZGF0YSkKKyAgICBnb3RvIGVycm9yOworCisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgc2l6ZSA9IG1hcC5zaXplOworCisgIGdzdF9iaXRfcmVhZGVyX2luaXQgKCZyZWFkZXIsIGRhdGEsIHNpemUpOworCisgIHNlbGYtPmlzX2tleWZyYW1lID0ga2V5ZnJhbWUgPSAoKGRhdGFbMF0gJiAweDEpID09IDApOworICB2ZXJzaW9uID0gKGRhdGFbMF0gPj4gMSkgJiAweDc7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHZlcnNpb24gPiAzKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJVbmtub3duIFZQOCB2ZXJzaW9uICV1IiwgdmVyc2lvbik7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8qIGtleWZyYW1lLCB2ZXJzaW9uIGFuZCBzaG93X2ZyYW1lIHVzZSA1IGJpdHMgKi8KKyAgcGFydGl0aW9uMF9zaXplID0gZGF0YVsyXSA8PCAxMSB8IGRhdGFbMV0gPDwgMyB8IChkYXRhWzBdID4+IDUpOworCisgIC8qIEluY2x1ZGUgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGJsb2IgaW4gdGhlIGZpcnN0IHBhcnRpdGlvbiAqLworICBvZmZzZXQgPSBrZXlmcmFtZSA/IDEwIDogMzsKKyAgcGFydGl0aW9uMF9zaXplICs9IG9mZnNldDsKKworICBpZiAoIWdzdF9iaXRfcmVhZGVyX3NraXAgKCZyZWFkZXIsIDI0KSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmIChrZXlmcmFtZSkgeworICAgIC8qIGNoZWNrIHN0YXJ0IHRhZzogMHg5ZCAweDAxIDB4MmEgKi8KKyAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQ4ICgmcmVhZGVyLCAmdG1wOCwgOCkgfHwgdG1wOCAhPSAweDlkKQorICAgICAgZ290byBlcnJvcjsKKworICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDggKCZyZWFkZXIsICZ0bXA4LCA4KSB8fCB0bXA4ICE9IDB4MDEpCisgICAgICBnb3RvIGVycm9yOworCisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50OCAoJnJlYWRlciwgJnRtcDgsIDgpIHx8IHRtcDggIT0gMHgyYSkKKyAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAvKiBTa2lwIGhvcml6b250YWwgc2l6ZSBjb2RlICgxNiBiaXRzKSB2ZXJ0aWNhbCBzaXplIGNvZGUgKDE2IGJpdHMpICovCisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9za2lwICgmcmVhZGVyLCAzMikpCisgICAgICBnb3RvIGVycm9yOworICB9CisKKyAgb2Zmc2V0ID0ga2V5ZnJhbWUgPyAxMCA6IDM7CisgIHZwOGR4X3N0YXJ0X2RlY29kZSAoJmJjLCBkYXRhICsgb2Zmc2V0LCBzaXplIC0gb2Zmc2V0KTsKKworICBpZiAoa2V5ZnJhbWUpIHsKKyAgICAvKiBjb2xvciBzcGFjZSAoMSBiaXQpIGFuZCBjbGFtcGluZyB0eXBlICgxIGJpdCkgKi8KKyAgICB2cDhkeF9kZWNvZGVfYm9vbCAoJmJjLCAweDgwKTsKKyAgICB2cDhkeF9kZWNvZGVfYm9vbCAoJmJjLCAweDgwKTsKKyAgfQorCisgIC8qIHNlZ21lbnRhdGlvbl9lbmFibGVkICovCisgIGlmICh2cDhkeF9kZWNvZGVfYm9vbCAoJmJjLCAweDgwKSkgeworICAgIGd1aW50OCB1cGRhdGVfbWJfc2VnbWVudGF0aW9uX21hcCA9IHZwOGR4X2RlY29kZV9ib29sICgmYmMsIDB4ODApOworICAgIGd1aW50OCB1cGRhdGVfc2VnbWVudF9mZWF0dXJlX2RhdGEgPSB2cDhkeF9kZWNvZGVfYm9vbCAoJmJjLCAweDgwKTsKKworICAgIGlmICh1cGRhdGVfc2VnbWVudF9mZWF0dXJlX2RhdGEpIHsKKyAgICAgIC8qIHNraXAgc2VnbWVudCBmZWF0dXJlIG1vZGUgKi8KKyAgICAgIHZwOGR4X2RlY29kZV9ib29sICgmYmMsIDB4ODApOworCisgICAgICAvKiBxdWFudGl6ZXIgdXBkYXRlICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIC8qIHNraXAgZmxhZ2dlZCBxdWFudGl6ZXIgdmFsdWUgKDcgYml0cykgYW5kIHNpZ24gKDEgYml0KSAqLworICAgICAgICBpZiAodnA4ZHhfZGVjb2RlX2Jvb2wgKCZiYywgMHg4MCkpCisgICAgICAgICAgdnA4X2RlY29kZV92YWx1ZSAoJmJjLCA4KTsKKyAgICAgIH0KKworICAgICAgLyogbG9vcCBmaWx0ZXIgdXBkYXRlICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIC8qIHNraXAgZmxhZ2dlZCBsZiB1cGRhdGUgdmFsdWUgKDYgYml0cykgYW5kIHNpZ24gKDEgYml0KSAqLworICAgICAgICBpZiAodnA4ZHhfZGVjb2RlX2Jvb2wgKCZiYywgMHg4MCkpCisgICAgICAgICAgdnA4X2RlY29kZV92YWx1ZSAoJmJjLCA3KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodXBkYXRlX21iX3NlZ21lbnRhdGlvbl9tYXApIHsKKyAgICAgIC8qIHNlZ21lbnQgcHJvYiB1cGRhdGUgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgLyogc2tpcCBmbGFnZ2VkIHNlZ21lbnQgcHJvYiAqLworICAgICAgICBpZiAodnA4ZHhfZGVjb2RlX2Jvb2wgKCZiYywgMHg4MCkpCisgICAgICAgICAgdnA4X2RlY29kZV92YWx1ZSAoJmJjLCA4KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBza2lwIGZpbHRlciB0eXBlICgxIGJpdCksIGxvb3AgZmlsdGVyIGxldmVsICg2IGJpdHMpIGFuZAorICAgKiBzaGFycG5lc3MgbGV2ZWwgKDMgYml0cykgKi8KKyAgdnA4X2RlY29kZV92YWx1ZSAoJmJjLCAxKTsKKyAgdnA4X2RlY29kZV92YWx1ZSAoJmJjLCA2KTsKKyAgdnA4X2RlY29kZV92YWx1ZSAoJmJjLCAzKTsKKworICAvKiBsb29wX2ZpbHRlcl9hZGpfZW5hYmxlZCAqLworICBpZiAodnA4ZHhfZGVjb2RlX2Jvb2wgKCZiYywgMHg4MCkpIHsKKworICAgIC8qIGRlbHRhIHVwZGF0ZSAqLworICAgIGlmICh2cDhkeF9kZWNvZGVfYm9vbCAoJmJjLCAweDgwKSkgeworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIC8qIDggdXBkYXRlcywgMSBiaXQgaW5kaWNhdGUgd2hldGhlciB0aGVyZSBpcyBvbmUgYW5kIGlmIGZvbGxvdyBieSBhCisgICAgICAgICAqIDcgYml0IHVwZGF0ZSAqLworICAgICAgICBpZiAodnA4ZHhfZGVjb2RlX2Jvb2wgKCZiYywgMHg4MCkpCisgICAgICAgICAgdnA4X2RlY29kZV92YWx1ZSAoJmJjLCA3KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAodnA4ZHhfYm9vbF9lcnJvciAoJmJjKSkKKyAgICBnb3RvIGVycm9yOworCisgIHRtcDggPSB2cDhfZGVjb2RlX3ZhbHVlICgmYmMsIDIpOworCisgIHBhcnRpdGlvbnMgPSAxIDw8IHRtcDg7CisKKyAgLyogQ2hlY2sgaWYgdGhpbmdzIGFyZSBzdGlsbCBzZW5zaWJsZSAqLworICBpZiAocGFydGl0aW9uMF9zaXplICsgKHBhcnRpdGlvbnMgLSAxKSAqIDMgPj0gc2l6ZSkKKyAgICBnb3RvIGVycm9yOworCisgIC8qIHBhcnRpdGlvbiBkYXRhIGlzIHJpZ2h0IGFmdGVyIHRoZSBtb2RlIHBhcnRpdGlvbiAqLworICBwZGF0YSA9IGRhdGEgKyBwYXJ0aXRpb24wX3NpemU7CisKKyAgLyogU2V0IHVwIG1hcHBpbmcgKi8KKyAgc2VsZi0+bl9wYXJ0aXRpb25zID0gcGFydGl0aW9ucyArIDE7CisgIHNlbGYtPnBhcnRpdGlvbl9vZmZzZXRbMF0gPSAwOworICBzZWxmLT5wYXJ0aXRpb25fc2l6ZVswXSA9IHBhcnRpdGlvbjBfc2l6ZSArIChwYXJ0aXRpb25zIC0gMSkgKiAzOworCisgIHNlbGYtPnBhcnRpdGlvbl9vZmZzZXRbMV0gPSBzZWxmLT5wYXJ0aXRpb25fc2l6ZVswXTsKKyAgZm9yIChpID0gMTsgaSA8IHBhcnRpdGlvbnM7IGkrKykgeworICAgIGd1aW50IHBzaXplID0gKHBkYXRhWzJdIDw8IDE2IHwgcGRhdGFbMV0gPDwgOCB8IHBkYXRhWzBdKTsKKworICAgIHBkYXRhICs9IDM7CisgICAgc2VsZi0+cGFydGl0aW9uX3NpemVbaV0gPSBwc2l6ZTsKKyAgICBzZWxmLT5wYXJ0aXRpb25fb2Zmc2V0W2kgKyAxXSA9IHNlbGYtPnBhcnRpdGlvbl9vZmZzZXRbaV0gKyBwc2l6ZTsKKyAgfQorCisgIC8qIENoZWNrIHRoYXQgb3VyIHBhcnRpdGlvbiBvZmZzZXRzIGFuZCBzaXplcyBkb24ndCBnbyBvdXRzaXplIHRoZSBidWZmZXIKKyAgICogc2l6ZS4gKi8KKyAgaWYgKHNlbGYtPnBhcnRpdGlvbl9vZmZzZXRbaV0gPj0gc2l6ZSkKKyAgICBnb3RvIGVycm9yOworCisgIHNlbGYtPnBhcnRpdGlvbl9zaXplW2ldID0gc2l6ZSAtIHNlbGYtPnBhcnRpdGlvbl9vZmZzZXRbaV07CisKKyAgc2VsZi0+cGFydGl0aW9uX29mZnNldFtpICsgMV0gPSBzaXplOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIHJldHVybiBUUlVFOworCitlcnJvcjoKKyAgR1NUX0RFQlVHICgiRmFpbGVkIHRvIHBhcnNlIGZyYW1lIik7CisgIGlmIChtYXAubWVtb3J5ICE9IE5VTEwpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGd1aW50Citnc3RfcnRwX3ZwOF9vZmZzZXRfdG9fcGFydGl0aW9uIChHc3RSdHBWUDhQYXkgKiBzZWxmLCBndWludCBvZmZzZXQpCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDE7IGkgPCBzZWxmLT5uX3BhcnRpdGlvbnM7IGkrKykgeworICAgIGlmIChvZmZzZXQgPCBzZWxmLT5wYXJ0aXRpb25fb2Zmc2V0W2ldKQorICAgICAgcmV0dXJuIGkgLSAxOworICB9CisKKyAgcmV0dXJuIGkgLSAxOworfQorCitzdGF0aWMgZ3NpemUKK2dzdF9ydHBfdnA4X2NhbGNfaGVhZGVyX2xlbiAoR3N0UnRwVlA4UGF5ICogc2VsZikKK3sKKyAgc3dpdGNoIChzZWxmLT5waWN0dXJlX2lkX21vZGUpIHsKKyAgICBjYXNlIFZQOF9QQVlfUElDVFVSRV9JRF83QklUUzoKKyAgICAgIHJldHVybiAzOworICAgIGNhc2UgVlA4X1BBWV9QSUNUVVJFX0lEXzE1QklUUzoKKyAgICAgIHJldHVybiA0OworICAgIGNhc2UgVlA4X1BBWV9OT19QSUNUVVJFX0lEOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMTsKKyAgfQorfQorCisvKiBXaGVuIGdyb3dpbmcgdGhlIHZwOCBoZWFkZXIga2VlcCBtYXggcGF5bG9hZCBsZW4gY2FsY3VsYXRpb24gaW4gc3luYyAqLworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX3ZwOF9jcmVhdGVfaGVhZGVyX2J1ZmZlciAoR3N0UnRwVlA4UGF5ICogc2VsZiwgZ3VpbnQ4IHBhcnRpZCwKKyAgICBnYm9vbGVhbiBzdGFydCwgZ2Jvb2xlYW4gbWFyaywgR3N0QnVmZmVyICogaW4pCit7CisgIEdzdEJ1ZmZlciAqb3V0OworICBndWludDggKnA7CisgIEdzdFJUUEJ1ZmZlciBydHBidWZmZXIgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworCisgIG91dCA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoZ3N0X3J0cF92cDhfY2FsY19oZWFkZXJfbGVuIChzZWxmKSwgMCwgMCk7CisgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0LCBHU1RfTUFQX1JFQURXUklURSwgJnJ0cGJ1ZmZlcik7CisgIHAgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cGJ1ZmZlcik7CisgIC8qIFg9MCxSPTAsTj0wLFM9c3RhcnQsUGFydElEPXBhcnRpZCAqLworICBwWzBdID0gKHN0YXJ0IDw8IDQpIHwgcGFydGlkOworICBpZiAoc2VsZi0+cGljdHVyZV9pZF9tb2RlICE9IFZQOF9QQVlfTk9fUElDVFVSRV9JRCkgeworICAgIC8qIEVuYWJsZSBYPTEgKi8KKyAgICBwWzBdIHw9IDB4ODA7CisgICAgLyogWDogST0xLEw9MCxUPTAsSz0wLFJTVj0wICovCisgICAgcFsxXSA9IDB4ODA7CisgICAgaWYgKHNlbGYtPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDhfUEFZX1BJQ1RVUkVfSURfN0JJVFMpIHsKKyAgICAgIC8qIEk6IDcgYml0IHBpY3R1cmVfaWQgKi8KKyAgICAgIHBbMl0gPSBzZWxmLT5waWN0dXJlX2lkICYgMHg3RjsKKyAgICB9IGVsc2UgeworICAgICAgLyogSTogMTUgYml0IHBpY3R1cmVfaWQgKi8KKyAgICAgIHBbMl0gPSAweDgwIHwgKChzZWxmLT5waWN0dXJlX2lkICYgMHg3RkZGKSA+PiA4KTsKKyAgICAgIHBbM10gPSBzZWxmLT5waWN0dXJlX2lkICYgMHhGRjsKKyAgICB9CisgIH0KKworICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwYnVmZmVyLCBtYXJrKTsKKworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cGJ1ZmZlcik7CisKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0KSA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGluKTsKKyAgR1NUX0JVRkZFUl9QVFMgKG91dCkgPSBHU1RfQlVGRkVSX1BUUyAoaW4pOworCisgIHJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyBndWludAorZ3N0X3J0cF92cDhfcGF5bG9hZF9uZXh0IChHc3RSdHBWUDhQYXkgKiBzZWxmLCBHc3RCdWZmZXJMaXN0ICogbGlzdCwKKyAgICBndWludCBvZmZzZXQsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwgZ3NpemUgYnVmZmVyX3NpemUsIGdzaXplIG1heF9wYXlsb2FkX2xlbikKK3sKKyAgZ3VpbnQgcGFydGl0aW9uOworICBHc3RCdWZmZXIgKmhlYWRlcjsKKyAgR3N0QnVmZmVyICpzdWI7CisgIEdzdEJ1ZmZlciAqb3V0OworICBnYm9vbGVhbiBtYXJrOworICBnc2l6ZSByZW1haW5pbmc7CisgIGdzaXplIGF2YWlsYWJsZTsKKworICByZW1haW5pbmcgPSBidWZmZXJfc2l6ZSAtIG9mZnNldDsKKyAgYXZhaWxhYmxlID0gbWF4X3BheWxvYWRfbGVuOworICBpZiAoYXZhaWxhYmxlID4gcmVtYWluaW5nKQorICAgIGF2YWlsYWJsZSA9IHJlbWFpbmluZzsKKworICBwYXJ0aXRpb24gPSBnc3RfcnRwX3ZwOF9vZmZzZXRfdG9fcGFydGl0aW9uIChzZWxmLCBvZmZzZXQpOworICBnX2Fzc2VydCAocGFydGl0aW9uIDwgc2VsZi0+bl9wYXJ0aXRpb25zKTsKKworICBtYXJrID0gKHJlbWFpbmluZyA9PSBhdmFpbGFibGUpOworICAvKiB3aG9sZSBzZXQgb2YgcGFydGl0aW9ucywgcGF5bG9hZCB0aGVtIGFuZCBkb25lICovCisgIGhlYWRlciA9IGdzdF9ydHBfdnA4X2NyZWF0ZV9oZWFkZXJfYnVmZmVyIChzZWxmLCBwYXJ0aXRpb24sCisgICAgICBvZmZzZXQgPT0gc2VsZi0+cGFydGl0aW9uX29mZnNldFtwYXJ0aXRpb25dLCBtYXJrLCBidWZmZXIpOworICBzdWIgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIG9mZnNldCwgYXZhaWxhYmxlKTsKKworICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAoc2VsZiwgaGVhZGVyLCBidWZmZXIpOworCisgIG91dCA9IGdzdF9idWZmZXJfYXBwZW5kIChoZWFkZXIsIHN1Yik7CisKKyAgZ3N0X2J1ZmZlcl9saXN0X2luc2VydCAobGlzdCwgLTEsIG91dCk7CisKKyAgcmV0dXJuIGF2YWlsYWJsZTsKK30KKworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF92cDhfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBWUDhQYXkgKnNlbGYgPSBHU1RfUlRQX1ZQOF9QQVkgKHBheWxvYWQpOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdDsKKyAgZ3NpemUgc2l6ZSwgbWF4X3BheWxlbjsKKyAgZ3VpbnQgb2Zmc2V0LCBtdHUsIHZwOF9oZHJfbGVuOworCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworCisgIGlmIChHX1VOTElLRUxZICghZ3N0X3J0cF92cDhfcGF5X3BhcnNlX2ZyYW1lIChzZWxmLCBidWZmZXIsIHNpemUpKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzZWxmLCBTVFJFQU0sIEVOQ09ERSwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBwYXJzZSBWUDggZnJhbWUiKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgbXR1ID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChwYXlsb2FkKTsKKyAgdnA4X2hkcl9sZW4gPSBnc3RfcnRwX3ZwOF9jYWxjX2hlYWRlcl9sZW4gKHNlbGYpOworICBtYXhfcGF5bGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYXlsb2FkX2xlbiAobXR1IC0gdnA4X2hkcl9sZW4sIDAsIDApOworCisgIGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3X3NpemVkICgoc2l6ZSAvIG1heF9wYXlsZW4pICsgMSk7CisKKyAgb2Zmc2V0ID0gMDsKKyAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKKyAgICBvZmZzZXQgKz0KKyAgICAgICAgZ3N0X3J0cF92cDhfcGF5bG9hZF9uZXh0IChzZWxmLCBsaXN0LCBvZmZzZXQsIGJ1ZmZlciwgc2l6ZSwgbWF4X3BheWxlbik7CisgIH0KKworICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoX2xpc3QgKHBheWxvYWQsIGxpc3QpOworCisgIC8qIEluY3JlbWVuZW50IGFuZCB3cmFwIHRoZSBwaWN0dXJlIGlkIGlmIGl0IG92ZXJmbG93cyAqLworICBpZiAoKHNlbGYtPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDhfUEFZX1BJQ1RVUkVfSURfN0JJVFMgJiYKKyAgICAgICAgICArK3NlbGYtPnBpY3R1cmVfaWQgPj0gMHg4MCkgfHwKKyAgICAgIChzZWxmLT5waWN0dXJlX2lkX21vZGUgPT0gVlA4X1BBWV9QSUNUVVJFX0lEXzE1QklUUyAmJgorICAgICAgICAgICsrc2VsZi0+cGljdHVyZV9pZCA+PSAweDgwMDApKQorICAgIHNlbGYtPnBpY3R1cmVfaWQgPSAwOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3ZwOF9wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBWUDhQYXkgKnNlbGYgPSBHU1RfUlRQX1ZQOF9QQVkgKHBheWxvYWQpOworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9GTFVTSF9TVEFSVCkgeworICAgIGlmIChzZWxmLT5waWN0dXJlX2lkX21vZGUgPT0gVlA4X1BBWV9QSUNUVVJFX0lEXzdCSVRTKQorICAgICAgc2VsZi0+cGljdHVyZV9pZCA9IGdfcmFuZG9tX2ludF9yYW5nZSAoMCwgR19NQVhVSU5UOCkgJiAweDdGOworICAgIGVsc2UgaWYgKHNlbGYtPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDhfUEFZX1BJQ1RVUkVfSURfMTVCSVRTKQorICAgICAgc2VsZi0+cGljdHVyZV9pZCA9IGdfcmFuZG9tX2ludF9yYW5nZSAoMCwgR19NQVhVSU5UMTYpICYgMHg3RkZGOworICB9CisKKyAgcmV0dXJuIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChnc3RfcnRwX3ZwOF9wYXlfcGFyZW50X2NsYXNzKS0+c2lua19ldmVudAorICAgICAgKHBheWxvYWQsIGV2ZW50KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3ZwOF9wYXlfc2V0X2NhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY19jYXBzOworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIGNoYXIgKmVuY29kaW5nX25hbWU7CisKKyAgc3JjX2NhcHMgPSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRCAocGF5bG9hZCkpOworICBpZiAoc3JjX2NhcHMpIHsKKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKHNyY19jYXBzKTsKKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX3RydW5jYXRlIChzcmNfY2Fwcyk7CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHNyY19jYXBzLCAwKTsKKyAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9zdHJpbmcgKHMsICJlbmNvZGluZy1uYW1lIiwgIlZQOCIpOworICAgIGVuY29kaW5nX25hbWUgPSBnX3N0cmR1cCAoZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAiZW5jb2RpbmctbmFtZSIpKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjX2NhcHMpOworICB9IGVsc2UgeworICAgIGVuY29kaW5nX25hbWUgPSBnX3N0cmR1cCAoIlZQOC1EUkFGVC1JRVRGLTAxIik7CisgIH0KKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocGF5bG9hZCwgInZpZGVvIiwgVFJVRSwKKyAgICAgIGVuY29kaW5nX25hbWUsIDkwMDAwKTsKKyAgZ19mcmVlIChlbmNvZGluZ19uYW1lKTsKKyAgcmV0dXJuIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXlsb2FkLCBOVUxMKTsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfdnA4X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHZwOHBheSIsCisgICAgICBHU1RfUkFOS19NQVJHSU5BTCwgR1NUX1RZUEVfUlRQX1ZQOF9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHB2cDhwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwdnA4cGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3MjA2MAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwdnA4cGF5LmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIGdzdHJ0cHZwOHBheS5oIC0gSGVhZGVyIGZvciBHc3RSdHBWUDhQYXkKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1ZQOF9QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9WUDhfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1ZQOF9QQVkgXAorICAoZ3N0X3J0cF92cDhfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfVlA4X1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLCBHU1RfVFlQRV9SVFBfVlA4X1BBWSwgR3N0UnRwVlA4UGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9WUDhfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLCBHU1RfVFlQRV9SVFBfVlA4X1BBWSwgR3N0UnRwVlA4UGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1ZQOF9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSwgR1NUX1RZUEVfUlRQX1ZQOF9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX1ZQOF9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksIEdTVF9UWVBFX1JUUF9WUDhfUEFZKSkKKyNkZWZpbmUgR1NUX1JUUF9WUDhfUEFZX0dFVF9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9SVFBfVlA4X1BBWSwgR3N0UnRwVlA4UGF5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwVlA4UGF5IEdzdFJ0cFZQOFBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBWUDhQYXlDbGFzcyBHc3RSdHBWUDhQYXlDbGFzczsKK3R5cGVkZWYgZW51bSBfUGljdHVyZUlETW9kZSBQaWN0dXJlSURNb2RlOworCitlbnVtIF9QaWN0dXJlSURNb2RlIHsKKyAgVlA4X1BBWV9OT19QSUNUVVJFX0lELAorICBWUDhfUEFZX1BJQ1RVUkVfSURfN0JJVFMsCisgIFZQOF9QQVlfUElDVFVSRV9JRF8xNUJJVFMsCit9OworCitzdHJ1Y3QgX0dzdFJ0cFZQOFBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworc3RydWN0IF9Hc3RSdHBWUDhQYXkKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWQgcGFyZW50OworICBnYm9vbGVhbiBpc19rZXlmcmFtZTsKKyAgZ2ludCBuX3BhcnRpdGlvbnM7CisgIC8qIFRyZWF0IGZyYW1lIGhlYWRlciAmIHRhZyAmIHBhcnRpdGlvbiBzaXplIGJsb2NrIGFzIHRoZSBmaXJzdCBwYXJ0aXRpb24sCisgICAqIGZvbG93ZWQgYnkgbWF4LiA4IGRhdGEgcGFydGl0aW9ucy4gbGFzdCBvZmZzZXQgaXMgdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCisgIGd1aW50IHBhcnRpdGlvbl9vZmZzZXRbMTBdOworICBndWludCBwYXJ0aXRpb25fc2l6ZVs5XTsKKyAgUGljdHVyZUlETW9kZSBwaWN0dXJlX2lkX21vZGU7CisgIGd1aW50MTYgcGljdHVyZV9pZDsKK307CisKK0dUeXBlIGdzdF9ydHBfdnA4X3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfdnA4X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qICNpZm5kZWYgX19HU1RfUlRQX1ZQOF9QQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHZwOWRlcGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHZwOWRlcGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxYWZmYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwdnA5ZGVwYXkuYwpAQCAtMCwwICsxLDM3OCBAQAorLyogZ3N0cnRwdnA5ZGVwYXkuYyAtIFNvdXJjZSBmb3IgR3N0UnRwVlA5RGVwYXkKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQ29sbGFib3JhIEx0ZC4KKyAqICAgQ29udGFjdDogWW91bmVzcyBBbGFvdWkgPHlvdW5lc3MuYWxhb3VpQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCAoQykgMjAxNSBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdHJ0cHZwOWRlcGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF92cDlfZGVwYXlfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3J0cF92cDlfZGVwYXlfZGVidWcKKworc3RhdGljIHZvaWQgZ3N0X3J0cF92cDlfZGVwYXlfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX3ZwOV9kZXBheV9wcm9jZXNzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLAorICAgIEdzdFJUUEJ1ZmZlciAqIHJ0cCk7CitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF92cDlfZGVwYXlfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3ZwOV9kZXBheV9oYW5kbGVfZXZlbnQgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheSwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKKworR19ERUZJTkVfVFlQRSAoR3N0UnRwVlA5RGVwYXksIGdzdF9ydHBfdnA5X2RlcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9ERVBBWUxPQUQpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF92cDlfZGVwYXlfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXZwOSIpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfdnA5X2RlcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwidmlkZW9cIiwiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgeyBcIlZQOVwiLCBcIlZQOS1EUkFGVC1JRVRGLTAxXCIgfSIpKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdnA5X2RlcGF5X2luaXQgKEdzdFJ0cFZQOURlcGF5ICogc2VsZikKK3sKKyAgc2VsZi0+YWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKyAgc2VsZi0+c3RhcnRlZCA9IEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92cDlfZGVwYXlfY2xhc3NfaW5pdCAoR3N0UnRwVlA5RGVwYXlDbGFzcyAqIGdzdF9ydHBfdnA5X2RlcGF5X2NsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChnc3RfcnRwX3ZwOV9kZXBheV9jbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChnc3RfcnRwX3ZwOV9kZXBheV9jbGFzcyk7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqZGVwYXlfY2xhc3MgPQorICAgICAgKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSAoZ3N0X3J0cF92cDlfZGVwYXlfY2xhc3MpOworCisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF92cDlfZGVwYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfdnA5X2RlcGF5X3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIlJUUCBWUDkgZGVwYXlsb2FkZXIiLAorICAgICAgIkNvZGVjL0RlcGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJFeHRyYWN0cyBWUDkgdmlkZW8gZnJvbSBSVFAgcGFja2V0cykiLCAiU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+Iik7CisKKyAgb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X3J0cF92cDlfZGVwYXlfZGlzcG9zZTsKKworICBlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX3ZwOV9kZXBheV9jaGFuZ2Vfc3RhdGU7CisKKyAgZGVwYXlfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9IGdzdF9ydHBfdnA5X2RlcGF5X3Byb2Nlc3M7CisgIGRlcGF5X2NsYXNzLT5oYW5kbGVfZXZlbnQgPSBnc3RfcnRwX3ZwOV9kZXBheV9oYW5kbGVfZXZlbnQ7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9ydHBfdnA5X2RlcGF5X2RlYnVnLCAicnRwdnA5ZGVwYXkiLCAwLAorICAgICAgIlZQOSBWaWRlbyBSVFAgRGVwYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdnA5X2RlcGF5X2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cFZQOURlcGF5ICpzZWxmID0gR1NUX1JUUF9WUDlfREVQQVkgKG9iamVjdCk7CisKKyAgaWYgKHNlbGYtPmFkYXB0ZXIgIT0gTlVMTCkKKyAgICBnX29iamVjdF91bnJlZiAoc2VsZi0+YWRhcHRlcik7CisgIHNlbGYtPmFkYXB0ZXIgPSBOVUxMOworCisgIC8qIHJlbGVhc2UgYW55IHJlZmVyZW5jZXMgaGVsZCBieSB0aGUgb2JqZWN0IGhlcmUgKi8KKworICBpZiAoR19PQkpFQ1RfQ0xBU1MgKGdzdF9ydHBfdnA5X2RlcGF5X3BhcmVudF9jbGFzcyktPmRpc3Bvc2UpCisgICAgR19PQkpFQ1RfQ0xBU1MgKGdzdF9ydHBfdnA5X2RlcGF5X3BhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3J0cF92cDlfZGVwYXlfcHJvY2VzcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5LCBHc3RSVFBCdWZmZXIgKiBydHApCit7CisgIEdzdFJ0cFZQOURlcGF5ICpzZWxmID0gR1NUX1JUUF9WUDlfREVQQVkgKGRlcGF5KTsKKyAgR3N0QnVmZmVyICpwYXlsb2FkOworICBndWludDggKmRhdGE7CisgIGd1aW50IGhkcnNpemUgPSAxOworICBndWludCBzaXplOworICBnaW50IHNwYXRpYWxfbGF5ZXIgPSAwOworICBnYm9vbGVhbiBpX2JpdCwgcF9iaXQsIGxfYml0LCBmX2JpdCwgYl9iaXQsIGVfYml0LCB2X2JpdDsKKworICBpZiAoR19VTkxJS0VMWSAoR1NUX0JVRkZFUl9JU19ESVNDT05UIChydHAtPmJ1ZmZlcikpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNlbGYsICJEaXNjb250aW51aXR5LCBmbHVzaGluZyBhZGFwdGVyIik7CisgICAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHNlbGYtPmFkYXB0ZXIpOworICAgIHNlbGYtPnN0YXJ0ZWQgPSBGQUxTRTsKKyAgfQorCisgIHNpemUgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKHJ0cCk7CisKKyAgLyogTWFuZGF0b3J5IHdpdGggYXQgbGVhc3Qgb25lIGhlYWRlciBhbmQgb25lIHZwOSBieXRlICovCisgIGlmIChHX1VOTElLRUxZIChzaXplIDwgaGRyc2l6ZSArIDEpKQorICAgIGdvdG8gdG9vX3NtYWxsOworCisgIGRhdGEgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAocnRwKTsKKyAgaV9iaXQgPSAoZGF0YVswXSAmIDB4ODApICE9IDA7CisgIHBfYml0ID0gKGRhdGFbMF0gJiAweDQwKSAhPSAwOworICBsX2JpdCA9IChkYXRhWzBdICYgMHgyMCkgIT0gMDsKKyAgZl9iaXQgPSAoZGF0YVswXSAmIDB4MTApICE9IDA7CisgIGJfYml0ID0gKGRhdGFbMF0gJiAweDA4KSAhPSAwOworICBlX2JpdCA9IChkYXRhWzBdICYgMHgwNCkgIT0gMDsKKyAgdl9iaXQgPSAoZGF0YVswXSAmIDB4MDIpICE9IDA7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFzZWxmLT5zdGFydGVkKSkgeworICAgIC8qIENoZWNrIGlmIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgVlA5IGxheWVyIGZyYW1lLCBvdGhlcndpc2UgYmFpbCAqLworICAgIGlmICghYl9iaXQpCisgICAgICBnb3RvIGRvbmU7CisKKyAgICBzZWxmLT5zdGFydGVkID0gVFJVRTsKKyAgfQorCisgIEdTVF9UUkFDRV9PQkpFQ1QgKHNlbGYsICJJUExGQkVWIDogJWQlZCVkJWQlZCVkJWQiLCBpX2JpdCwgcF9iaXQsIGxfYml0LAorICAgICAgZl9iaXQsIGJfYml0LCBlX2JpdCwgdl9iaXQpOworCisgIC8qIENoZWNrIEkgb3B0aW9uYWwgaGVhZGVyIFBpY3R1cmUgSUQgKi8KKyAgaWYgKGlfYml0KSB7CisgICAgaGRyc2l6ZSsrOworICAgIGlmIChHX1VOTElLRUxZIChzaXplIDwgaGRyc2l6ZSArIDEpKQorICAgICAgZ290byB0b29fc21hbGw7CisgICAgLyogQ2hlY2sgTSBmb3IgMTUgYml0cyBQaWN0dXJlSUQgKi8KKyAgICBpZiAoKGRhdGFbMV0gJiAweDgwKSAhPSAwKSB7CisgICAgICBoZHJzaXplKys7CisgICAgICBpZiAoR19VTkxJS0VMWSAoc2l6ZSA8IGhkcnNpemUgKyAxKSkKKyAgICAgICAgZ290byB0b29fc21hbGw7CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgTCBvcHRpb25hbCBoZWFkZXIgbGF5ZXIgaW5kaWNlcyAqLworICBpZiAobF9iaXQpIHsKKyAgICBoZHJzaXplKys7CisgICAgLyogQ2hlY2sgVEwwUElDSURYIHRlbXBvcmFsIGxheWVyIHplcm8gaW5kZXggKG5vbi1mbGV4aWJsZSBtb2RlKSAqLworICAgIGlmICghZl9iaXQpCisgICAgICBoZHJzaXplKys7CisgIH0KKworICBpZiAocF9iaXQgJiYgZl9iaXQpIHsKKyAgICBnaW50IGk7CisKKyAgICAvKiBBdCBsZWFzdCBvbmUgUF9ESUZGfE4sIHVwIHRvIHRocmVlIHRpbWVzICovCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgZ3VpbnQgcF9kaWZmLCBuX2JpdDsKKworICAgICAgaWYgKEdfVU5MSUtFTFkgKHNpemUgPCBoZHJzaXplICsgMSkpCisgICAgICAgIGdvdG8gdG9vX3NtYWxsOworCisgICAgICBwX2RpZmYgPSBkYXRhW2hkcnNpemVdID4+IDE7CisgICAgICBuX2JpdCA9IGRhdGFbaGRyc2l6ZV0gJiAweDE7CisgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChzZWxmLCAiUF9ESUZGWyVkXT0lZCIsIGksIHBfZGlmZik7CisgICAgICBoZHJzaXplKys7CisKKyAgICAgIGlmICghbl9iaXQpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qIENoZWNrIFYgb3B0aW9uYWwgU2NhbGFiaWxpdHkgU3RydWN0dXJlICovCisgIGlmICh2X2JpdCkgeworICAgIGd1aW50IG5fcywgeV9iaXQsIGdfYml0OworICAgIGd1aW50OCAqc3MgPSAmZGF0YVtoZHJzaXplXTsKKyAgICBndWludCBzc3NpemUgPSAxOworCisgICAgaWYgKEdfVU5MSUtFTFkgKHNpemUgPCBoZHJzaXplICsgc3NzaXplICsgMSkpCisgICAgICBnb3RvIHRvb19zbWFsbDsKKworICAgIG5fcyA9IChzc1swXSAmIDB4ZTApID4+IDU7CisgICAgeV9iaXQgPSAoc3NbMF0gJiAweDEwKSAhPSAwOworICAgIGdfYml0ID0gKHNzWzBdICYgMHgwOCkgIT0gMDsKKworICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHNlbGYsICJTUyBoZWFkZXI6IE5fUz0ldSwgWT0ldSwgRz0ldSIsIG5fcywgeV9iaXQsIGdfYml0KTsKKworICAgIHNzc2l6ZSArPSB5X2JpdCA/IChuX3MgKyAxKSAqIDQgOiAwOworICAgIGlmIChHX1VOTElLRUxZIChzaXplIDwgaGRyc2l6ZSArIHNzc2l6ZSArIDEpKQorICAgICAgZ290byB0b29fc21hbGw7CisKKyAgICBpZiAoeV9iaXQpIHsKKyAgICAgIGd1aW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDw9IG5fczsgaSsrKSB7CisgICAgICAgIC8qIEZvciBub3csIHNpbXBseSB1c2UgdGhlIGxhc3QgbGF5ZXIgc3BlY2lmaWVkIGZvciB3aWR0aCBhbmQgaGVpZ2h0ICovCisgICAgICAgIHNlbGYtPnNzX3dpZHRoID0gc3NbMSArIGkgKiA0XSAqIDI1NiArIHNzWzIgKyBpICogNF07CisgICAgICAgIHNlbGYtPnNzX2hlaWdodCA9IHNzWzMgKyBpICogNF0gKiAyNTYgKyBzc1s0ICsgaSAqIDRdOworICAgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChzZWxmLCAiTl9TWyVkXTogV0lEVEg9JXUsIEhFSUdIVD0ldSIsIGksCisgICAgICAgICAgICBzZWxmLT5zc193aWR0aCwgc2VsZi0+c3NfaGVpZ2h0KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ19iaXQpIHsKKyAgICAgIGd1aW50IGksIGo7CisgICAgICBndWludCBuX2cgPSBzc1tzc3NpemVdOworICAgICAgc3NzaXplKys7CisgICAgICBpZiAoR19VTkxJS0VMWSAoc2l6ZSA8IGhkcnNpemUgKyBzc3NpemUgKyAxKSkKKyAgICAgICAgZ290byB0b29fc21hbGw7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbl9nOyBpKyspIHsKKyAgICAgICAgZ3VpbnQgdCA9IChzc1tzc3NpemVdICYgMHhlMCkgPj4gNTsKKyAgICAgICAgZ3VpbnQgdSA9IChzc1tzc3NpemVdICYgMHgxMCkgPj4gNDsKKyAgICAgICAgZ3VpbnQgciA9IChzc1tzc3NpemVdICYgMHgwYykgPj4gMjsKKyAgICAgICAgR1NUX1RSQUNFX09CSkVDVCAoc2VsZiwgIk5fR1sldV06IDB4JTAyeCAtPiBUPSV1LCBVPSV1LCBSPSV1IiwgaSwKKyAgICAgICAgICAgIHNzW3Nzc2l6ZV0sIHQsIHUsIHIpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcjsgaisrKQorICAgICAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHNlbGYsICIgIFJbJXVdOiBQX0RJRkY9JXUiLCBqLCBzc1tzc3NpemUgKyAxICsgal0pOworICAgICAgICBzc3NpemUgKz0gMSArIHI7CisgICAgICAgIGlmIChHX1VOTElLRUxZIChzaXplIDwgaGRyc2l6ZSArIHNzc2l6ZSArIDEpKQorICAgICAgICAgIGdvdG8gdG9vX3NtYWxsOworICAgICAgfQorICAgIH0KKyAgICBoZHJzaXplICs9IHNzc2l6ZTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5LCAiaGRyc2l6ZSAldSwgc2l6ZSAldSIsIGhkcnNpemUsIHNpemUpOworCisgIGlmIChHX1VOTElLRUxZIChoZHJzaXplID49IHNpemUpKQorICAgIGdvdG8gdG9vX3NtYWxsOworCisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9zdWJidWZmZXIgKHJ0cCwgaGRyc2l6ZSwgLTEpOworICB7CisgICAgR3N0TWFwSW5mbyBtYXA7CisgICAgZ3N0X2J1ZmZlcl9tYXAgKHBheWxvYWQsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgR1NUX01FTURVTVBfT0JKRUNUIChzZWxmLCAidnA5IHBheWxvYWQiLCBtYXAuZGF0YSwgMTYpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKHBheWxvYWQsICZtYXApOworICB9CisgIGdzdF9hZGFwdGVyX3B1c2ggKHNlbGYtPmFkYXB0ZXIsIHBheWxvYWQpOworCisgIC8qIE1hcmtlciBpbmRpY2F0ZXMgdGhhdCBpdCB3YXMgdGhlIGxhc3QgcnRwIHBhY2tldCBmb3IgdGhpcyBmcmFtZSAqLworICBpZiAoZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAocnRwKSkgeworICAgIEdzdEJ1ZmZlciAqb3V0OworICAgIGdib29sZWFuIGtleV9mcmFtZV9maXJzdF9sYXllciA9ICFwX2JpdCAmJiBzcGF0aWFsX2xheWVyID09IDA7CisKKyAgICBpZiAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzZWxmLT5hZGFwdGVyKSA8IDEwKQorICAgICAgZ290byB0b29fc21hbGw7CisKKyAgICBvdXQgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoc2VsZi0+YWRhcHRlciwKKyAgICAgICAgZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzZWxmLT5hZGFwdGVyKSk7CisKKyAgICBzZWxmLT5zdGFydGVkID0gRkFMU0U7CisKKyAgICAvKiBtYXJrIGtleWZyYW1lcyAqLworICAgIG91dCA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAob3V0KTsKKyAgICAvKiBGaWx0ZXIgYXdheSBhbGwgbWV0YXMgdGhhdCBhcmUgbm90IHNlbnNpYmxlIHRvIGNvcHkgKi8KKyAgICBnc3RfcnRwX2Ryb3Bfbm9uX3ZpZGVvX21ldGEgKHNlbGYsIG91dCk7CisgICAgaWYgKCFrZXlfZnJhbWVfZmlyc3RfbGF5ZXIpIHsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dCwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgICAgICBpZiAoIXNlbGYtPmNhcHNfc2VudCkgeworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChvdXQpOworICAgICAgICBvdXQgPSBOVUxMOworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHNlbGYsICJEcm9wcGluZyBpbnRlci1mcmFtZSBiZWZvcmUgaW50cmEtZnJhbWUiKTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NJTktQQUQgKGRlcGF5KSwKKyAgICAgICAgICAgIGdzdF92aWRlb19ldmVudF9uZXdfdXBzdHJlYW1fZm9yY2Vfa2V5X3VuaXQgKEdTVF9DTE9DS19USU1FX05PTkUsCisgICAgICAgICAgICAgICAgVFJVRSwgMCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfVU5TRVQgKG91dCwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpOworCisgICAgICBpZiAoc2VsZi0+bGFzdF93aWR0aCAhPSBzZWxmLT5zc193aWR0aCB8fAorICAgICAgICAgIHNlbGYtPmxhc3RfaGVpZ2h0ICE9IHNlbGYtPnNzX2hlaWdodCkgeworICAgICAgICBHc3RDYXBzICpzcmNjYXBzOworCisgICAgICAgIC8qIFdpZHRoIGFuZCBoZWlnaHQgYXJlIG9wdGlvbmFsIGluIHRoZSBSVFAgaGVhZGVyLiBDb25zaWRlciB0byBwYXJzZQorICAgICAgICAgKiB0aGUgZnJhbWUgaGVhZGVyIGluIGFkZGl0aW9uIGlmIG1pc3NpbmcgZnJvbSBSVFAgaGVhZGVyICovCisgICAgICAgIGlmIChzZWxmLT5zc193aWR0aCAhPSAwICYmIHNlbGYtPnNzX2hlaWdodCAhPSAwKSB7CisgICAgICAgICAgc3JjY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LXZwOSIsCisgICAgICAgICAgICAgICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwgMCwgMSwKKyAgICAgICAgICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgc2VsZi0+c3Nfd2lkdGgsCisgICAgICAgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBzZWxmLT5zc19oZWlnaHQsIE5VTEwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC12cDkiLAorICAgICAgICAgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sIDAsIDEsIE5VTEwpOworICAgICAgICB9CisKKyAgICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKGRlcGF5KSwgc3JjY2Fwcyk7CisgICAgICAgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICAgICAgICBzZWxmLT5jYXBzX3NlbnQgPSBUUlVFOworICAgICAgICBzZWxmLT5sYXN0X3dpZHRoID0gc2VsZi0+c3Nfd2lkdGg7CisgICAgICAgIHNlbGYtPmxhc3RfaGVpZ2h0ID0gc2VsZi0+c3NfaGVpZ2h0OworICAgICAgICBzZWxmLT5zc193aWR0aCA9IDA7CisgICAgICAgIHNlbGYtPnNzX2hlaWdodCA9IDA7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG91dDsKKyAgfQorCitkb25lOgorICByZXR1cm4gTlVMTDsKKwordG9vX3NtYWxsOgorICBHU1RfTE9HX09CSkVDVCAoc2VsZiwgIkludmFsaWQgcnRwIHBhY2tldCAodG9vIHNtYWxsKSwgaWdub3JpbmciKTsKKyAgZ3N0X2FkYXB0ZXJfY2xlYXIgKHNlbGYtPmFkYXB0ZXIpOworICBzZWxmLT5zdGFydGVkID0gRkFMU0U7CisKKyAgZ290byBkb25lOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfdnA5X2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cFZQOURlcGF5ICpzZWxmID0gR1NUX1JUUF9WUDlfREVQQVkgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBzZWxmLT5sYXN0X3dpZHRoID0gLTE7CisgICAgICBzZWxmLT5sYXN0X2hlaWdodCA9IC0xOworICAgICAgc2VsZi0+Y2Fwc19zZW50ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4KKyAgICAgIEdTVF9FTEVNRU5UX0NMQVNTIChnc3RfcnRwX3ZwOV9kZXBheV9wYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsCisgICAgICB0cmFuc2l0aW9uKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3ZwOV9kZXBheV9oYW5kbGVfZXZlbnQgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheSwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwVlA5RGVwYXkgKnNlbGYgPSBHU1RfUlRQX1ZQOV9ERVBBWSAoZGVwYXkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgICBzZWxmLT5sYXN0X3dpZHRoID0gLTE7CisgICAgICBzZWxmLT5sYXN0X2hlaWdodCA9IC0xOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuCisgICAgICBHU1RfUlRQX0JBU0VfREVQQVlMT0FEX0NMQVNTCisgICAgICAoZ3N0X3J0cF92cDlfZGVwYXlfcGFyZW50X2NsYXNzKS0+aGFuZGxlX2V2ZW50IChkZXBheSwgZXZlbnQpOworfQorCitnYm9vbGVhbgorZ3N0X3J0cF92cDlfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHB2cDlkZXBheSIsCisgICAgICBHU1RfUkFOS19NQVJHSU5BTCwgR1NUX1RZUEVfUlRQX1ZQOV9ERVBBWSk7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHZwOWRlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHZwOWRlcGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3ODNhYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwdnA5ZGVwYXkuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogZ3N0cnRwdnA5ZGVwYXkuaCAtIEhlYWRlciBmb3IgR3N0UnRwVlA5RGVwYXkKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1ZQOV9ERVBBWV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1ZQOV9ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJhc2VkZXBheWxvYWQuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9WUDlfREVQQVkgXAorICAoZ3N0X3J0cF92cDlfZGVwYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9WUDlfREVQQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSwgR1NUX1RZUEVfUlRQX1ZQOV9ERVBBWSwgR3N0UnRwVlA5RGVwYXkpKQorI2RlZmluZSBHU1RfUlRQX1ZQOV9ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSwgR1NUX1RZUEVfUlRQX1ZQOV9ERVBBWSwgXAorICAgIEdzdFJ0cFZQOURlcGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1ZQOV9ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLCBHU1RfVFlQRV9SVFBfVlA5X0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9WUDlfREVQQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksIEdTVF9UWVBFX1JUUF9WUDlfREVQQVkpKQorI2RlZmluZSBHU1RfUlRQX1ZQOV9ERVBBWV9HRVRfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfUlRQX1ZQOV9ERVBBWSwgXAorICAgIEdzdFJ0cFZQOURlcGF5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwVlA5RGVwYXkgR3N0UnRwVlA5RGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwVlA5RGVwYXlDbGFzcyBHc3RSdHBWUDlEZXBheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cFZQOURlcGF5Q2xhc3MKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK3N0cnVjdCBfR3N0UnRwVlA5RGVwYXkKK3sKKyAgR3N0UlRQQmFzZURlcGF5bG9hZCBwYXJlbnQ7CisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisgIGdib29sZWFuIHN0YXJ0ZWQ7CisKKyAgZ2ludCBzc193aWR0aDsKKyAgZ2ludCBzc19oZWlnaHQ7CisgIGdpbnQgbGFzdF93aWR0aDsKKyAgZ2ludCBsYXN0X2hlaWdodDsKKyAgZ2Jvb2xlYW4gY2Fwc19zZW50OworfTsKKworR1R5cGUgZ3N0X3J0cF92cDlfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX3ZwOV9kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qICNpZm5kZWYgX19HU1RfUlRQX1ZQOV9ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdnA5cGF5LmMgYi9nc3QvcnRwL2dzdHJ0cHZwOXBheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYjAxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHZwOXBheS5jCkBAIC0wLDAgKzEsNTU2IEBACisvKgorICogZ3N0cnRwdnA5cGF5LmMgLSBTb3VyY2UgZm9yIEdzdFJ0cFZQOVBheQorICogQ29weXJpZ2h0IChDKSAyMDExIFNqb2VyZCBTaW1vbnMgPHNqb2VyZEBsdW9uLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBDb2xsYWJvcmEgTHRkLgorICogICBDb250YWN0OiBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSAyMDE1IFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJpdHJlYWRlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwcGF5bG9hZHMuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgImRib29saHVmZi5oIgorI2luY2x1ZGUgImdzdHJ0cHZwOXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9ydHBfdnA5X3BheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfcnRwX3ZwOV9wYXlfZGVidWcKKworI2RlZmluZSBERUZBVUxUX1BJQ1RVUkVfSURfTU9ERSBWUDlfUEFZX05PX1BJQ1RVUkVfSUQKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUElDVFVSRV9JRF9NT0RFCit9OworCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9WUDlfUEFZX1BJQ1RVUkVfSURfTU9ERSAoZ3N0X3J0cF92cDlfcGF5X3BpY3R1cmVfaWRfbW9kZV9nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3RfcnRwX3ZwOV9wYXlfcGljdHVyZV9pZF9tb2RlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgbW9kZV90eXBlID0gMDsKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgbW9kZXNbXSA9IHsKKyAgICB7VlA5X1BBWV9OT19QSUNUVVJFX0lELCAiTm8gUGljdHVyZSBJRCIsICJub25lIn0sCisgICAge1ZQOV9QQVlfUElDVFVSRV9JRF83QklUUywgIjctYml0IFBpY3R1cmUgSUQiLCAiNy1iaXQifSwKKyAgICB7VlA5X1BBWV9QSUNUVVJFX0lEXzE1QklUUywgIjE1LWJpdCBQaWN0dXJlIElEIiwgIjE1LWJpdCJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIW1vZGVfdHlwZSkgeworICAgIG1vZGVfdHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RWUDlSVFBQYXlNb2RlIiwgbW9kZXMpOworICB9CisgIHJldHVybiBtb2RlX3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfdnA5X3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX3ZwOV9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX3ZwOV9wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF92cDlfcGF5X3NpbmtfZXZlbnQgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3ZwOV9wYXlfc2V0X2NhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CisKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cFZQOVBheSwgZ3N0X3J0cF92cDlfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfdnA5X3BheV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgOTAwMDAsIGVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSB7IFwiVlA5XCIsIFwiVlA5LURSQUZULUlFVEYtMDFcIiB9IikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF92cDlfcGF5X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC12cDkiKSk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZwOV9wYXlfaW5pdCAoR3N0UnRwVlA5UGF5ICogb2JqKQoreworICBvYmotPnBpY3R1cmVfaWRfbW9kZSA9IERFRkFVTFRfUElDVFVSRV9JRF9NT0RFOworICBpZiAob2JqLT5waWN0dXJlX2lkX21vZGUgPT0gVlA5X1BBWV9QSUNUVVJFX0lEXzdCSVRTKQorICAgIG9iai0+cGljdHVyZV9pZCA9IGdfcmFuZG9tX2ludF9yYW5nZSAoMCwgR19NQVhVSU5UOCkgJiAweDdGOworICBlbHNlIGlmIChvYmotPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDlfUEFZX1BJQ1RVUkVfSURfMTVCSVRTKQorICAgIG9iai0+cGljdHVyZV9pZCA9IGdfcmFuZG9tX2ludF9yYW5nZSAoMCwgR19NQVhVSU5UMTYpICYgMHg3RkZGOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92cDlfcGF5X2NsYXNzX2luaXQgKEdzdFJ0cFZQOVBheUNsYXNzICogZ3N0X3J0cF92cDlfcGF5X2NsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoZ3N0X3J0cF92cDlfcGF5X2NsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGdzdF9ydHBfdnA5X3BheV9jbGFzcyk7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKnBheV9jbGFzcyA9CisgICAgICBHU1RfUlRQX0JBU0VfUEFZTE9BRF9DTEFTUyAoZ3N0X3J0cF92cDlfcGF5X2NsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX3ZwOV9wYXlfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX3ZwOV9wYXlfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUElDVFVSRV9JRF9NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJwaWN0dXJlLWlkLW1vZGUiLCAiUGljdHVyZSBJRCBNb2RlIiwKKyAgICAgICAgICAiVGhlIHBpY3R1cmUgSUQgbW9kZSBmb3IgcGF5bG9hZGluZyIsCisgICAgICAgICAgR1NUX1RZUEVfUlRQX1ZQOV9QQVlfUElDVFVSRV9JRF9NT0RFLCBERUZBVUxUX1BJQ1RVUkVfSURfTU9ERSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3ZwOV9wYXlfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfdnA5X3BheV9zcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJSVFAgVlA5IHBheWxvYWRlciIsCisgICAgICAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQdXRzIFZQOSB2aWRlbyBpbiBSVFAgcGFja2V0cykiLCAiU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+Iik7CisKKyAgcGF5X2NsYXNzLT5oYW5kbGVfYnVmZmVyID0gZ3N0X3J0cF92cDlfcGF5X2hhbmRsZV9idWZmZXI7CisgIHBheV9jbGFzcy0+c2lua19ldmVudCA9IGdzdF9ydHBfdnA5X3BheV9zaW5rX2V2ZW50OworICBwYXlfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF92cDlfcGF5X3NldF9jYXBzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfcnRwX3ZwOV9wYXlfZGVidWcsICJydHB2cDlwYXkiLCAwLAorICAgICAgIlZQOSBWaWRlbyBSVFAgUGF5bG9hZGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZwOV9wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cFZQOVBheSAqcnRwdnA5cGF5ID0gR1NUX1JUUF9WUDlfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QSUNUVVJFX0lEX01PREU6CisgICAgICBydHB2cDlwYXktPnBpY3R1cmVfaWRfbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGlmIChydHB2cDlwYXktPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDlfUEFZX1BJQ1RVUkVfSURfN0JJVFMpCisgICAgICAgIHJ0cHZwOXBheS0+cGljdHVyZV9pZCA9IGdfcmFuZG9tX2ludF9yYW5nZSAoMCwgR19NQVhVSU5UOCkgJiAweDdGOworICAgICAgZWxzZSBpZiAocnRwdnA5cGF5LT5waWN0dXJlX2lkX21vZGUgPT0gVlA5X1BBWV9QSUNUVVJFX0lEXzE1QklUUykKKyAgICAgICAgcnRwdnA5cGF5LT5waWN0dXJlX2lkID0gZ19yYW5kb21faW50X3JhbmdlICgwLCBHX01BWFVJTlQxNikgJiAweDdGRkY7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZwOV9wYXlfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cFZQOVBheSAqcnRwdnA5cGF5ID0gR1NUX1JUUF9WUDlfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QSUNUVVJFX0lEX01PREU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgcnRwdnA5cGF5LT5waWN0dXJlX2lkX21vZGUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisjZGVmaW5lIFZQOV9QUk9GSUxFXzAgMAorI2RlZmluZSBWUDlfUFJPRklMRV8xIDEKKyNkZWZpbmUgVlA5X1BST0ZJTEVfMiAyCisjZGVmaW5lIFZQOV9QUk9GSUxFXzMgMworI2RlZmluZSBWUDlfRlJBTUVfTUFSS0VSIDB4MgorI2RlZmluZSBWUFhfQ1NfU1JHQiA3CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF92cDlfcGF5X3BhcnNlX2ZyYW1lIChHc3RSdHBWUDlQYXkgKiBzZWxmLCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgZ3NpemUgYnVmZmVyX3NpemUpCit7CisgIEdzdE1hcEluZm8gbWFwID0gR1NUX01BUF9JTkZPX0lOSVQ7CisgIEdzdEJpdFJlYWRlciByZWFkZXI7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3NpemUgc2l6ZTsKKyAgZ2Jvb2xlYW4ga2V5ZnJhbWU7CisgIGd1aW50MzIgdG1wLCBwcm9maWxlOworCisgIGlmIChHX1VOTElLRUxZIChidWZmZXJfc2l6ZSA8IDMpKQorICAgIGdvdG8gZXJyb3I7CisKKyAgaWYgKCFnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpIHx8ICFtYXAuZGF0YSkKKyAgICBnb3RvIGVycm9yOworCisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgc2l6ZSA9IG1hcC5zaXplOworCisgIGdzdF9iaXRfcmVhZGVyX2luaXQgKCZyZWFkZXIsIGRhdGEsIHNpemUpOworCisKKyAgLyogZnJhbWUgbWFya2VyICovCisgIGlmICghZ3N0X2JpdF9yZWFkZXJfZ2V0X2JpdHNfdWludDMyICgmcmVhZGVyLCAmdG1wLCAyKQorICAgICAgfHwgdG1wICE9IFZQOV9GUkFNRV9NQVJLRVIpCisgICAgZ290byBlcnJvcjsKKworICAvKiBwcm9maWxlLCB2YXJpYWJsZSBsZW5ndGggKi8KKyAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzIgKCZyZWFkZXIsICZwcm9maWxlLCAyKSkKKyAgICBnb3RvIGVycm9yOworICBpZiAocHJvZmlsZSA+IDIpIHsKKyAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQzMiAoJnJlYWRlciwgJnRtcCwgMSkpCisgICAgICBnb3RvIGVycm9yOworICAgIHByb2ZpbGUgKz0gdG1wOworICB9CisKKyAgLyogc2hvdyBleGlzdGluZyBmcmFtZSAqLworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQzMiAoJnJlYWRlciwgJnRtcCwgMSkpCisgICAgZ290byBlcnJvcjsKKyAgaWYgKHRtcCkgeworICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfc2tpcCAoJnJlYWRlciwgMykpCisgICAgICBnb3RvIGVycm9yOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgLyogZnJhbWUgdHlwZSAqLworICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQzMiAoJnJlYWRlciwgJnRtcCwgMSkpCisgICAgZ290byBlcnJvcjsKKyAgc2VsZi0+aXNfa2V5ZnJhbWUgPSBrZXlmcmFtZSA9ICh0bXAgPT0gMCk7CisKKyAgLyogc2hvdyBmcmFtZSBhbmQgcmVzaWxpZW50IG1vZGUgKi8KKyAgaWYgKCFnc3RfYml0X3JlYWRlcl9za2lwICgmcmVhZGVyLCAyKSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmIChrZXlmcmFtZSkgeworICAgIC8qIHN5bmMgY29kZSAqLworICAgIGNvbnN0IGd1aW50MzIgc3luY19jb2RlID0gMHg0OTgzNDI7CisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzIgKCZyZWFkZXIsICZ0bXAsIDI0KSkKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKHRtcCAhPSBzeW5jX2NvZGUpCisgICAgICBnb3RvIGVycm9yOworCisgICAgaWYgKHByb2ZpbGUgPj0gVlA5X1BST0ZJTEVfMikgeworICAgICAgLyogYml0IGRlcHRoICovCisgICAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX3NraXAgKCZyZWFkZXIsIDEpKQorICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIGNvbG9yIHNwYWNlICovCisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzIgKCZyZWFkZXIsICZ0bXAsIDMpKQorICAgICAgZ290byBlcnJvcjsKKyAgICBpZiAodG1wICE9IFZQWF9DU19TUkdCKSB7CisgICAgICAvKiBjb2xvciByYW5nZSAqLworICAgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9za2lwICgmcmVhZGVyLCAxKSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIGlmIChwcm9maWxlID09IFZQOV9QUk9GSUxFXzEgfHwgcHJvZmlsZSA9PSBWUDlfUFJPRklMRV8zKSB7CisgICAgICAgIC8qIHN1YnNhbXBsaW5nICsgcmVzZXJ2ZWQgYml0ICovCisgICAgICAgIGlmICghZ3N0X2JpdF9yZWFkZXJfc2tpcCAoJnJlYWRlciwgMiArIDEpKQorICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChwcm9maWxlID09IFZQOV9QUk9GSUxFXzEgfHwgcHJvZmlsZSA9PSBWUDlfUFJPRklMRV8zKQorICAgICAgICAvKiByZXNlcnZlZCBiaXQgKi8KKyAgICAgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9za2lwICgmcmVhZGVyLCAxKSkKKyAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIGZyYW1lIHNpemUgKi8KKyAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX2dldF9iaXRzX3VpbnQzMiAoJnJlYWRlciwgJnRtcCwgMTYpKQorICAgICAgZ290byBlcnJvcjsKKyAgICBzZWxmLT53aWR0aCA9IHRtcCArIDE7CisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzIgKCZyZWFkZXIsICZ0bXAsIDE2KSkKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgc2VsZi0+aGVpZ2h0ID0gdG1wICsgMTsKKworICAgIC8qIHJlbmRlciBzaXplICovCisgICAgaWYgKCFnc3RfYml0X3JlYWRlcl9nZXRfYml0c191aW50MzIgKCZyZWFkZXIsICZ0bXAsIDEpKQorICAgICAgZ290byBlcnJvcjsKKyAgICBpZiAodG1wKSB7CisgICAgICBpZiAoIWdzdF9iaXRfcmVhZGVyX3NraXAgKCZyZWFkZXIsIDMyKSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHNlbGYsICJwYXJzZWQgd2lkdGg9JWQgaGVpZ2h0PSVkIiwgc2VsZi0+d2lkdGgsCisgICAgICAgIHNlbGYtPmhlaWdodCk7CisgIH0KKworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIHJldHVybiBUUlVFOworCitlcnJvcjoKKyAgR1NUX0RFQlVHICgiRmFpbGVkIHRvIHBhcnNlIGZyYW1lIik7CisgIGlmIChtYXAubWVtb3J5ICE9IE5VTEwpIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdzaXplCitnc3RfcnRwX3ZwOV9jYWxjX2hlYWRlcl9sZW4gKEdzdFJ0cFZQOVBheSAqIHNlbGYsIGdib29sZWFuIHN0YXJ0KQoreworICBnc2l6ZSBsZW4gPSAxOworCisgIHN3aXRjaCAoc2VsZi0+cGljdHVyZV9pZF9tb2RlKSB7CisgICAgY2FzZSBWUDlfUEFZX1BJQ1RVUkVfSURfN0JJVFM6CisgICAgICBsZW4gKz0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVlA5X1BBWV9QSUNUVVJFX0lEXzE1QklUUzoKKyAgICAgIGxlbiArPSAyOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIEFzc3VtZSBub24tZmxleGlibGUgbW9kZSAqLworICAvKiBBc3N1bWUgTC1iaXQgbm90IHNldCwgbm8gTCBoZWFkZXIgKi8KKworICBpZiAoc2VsZi0+aXNfa2V5ZnJhbWUgJiYgc3RhcnQpIHsKKyAgICAvKiBBc3N1bWUgVi1iaXQgc2V0ICovCisgICAgLyogRklYTUU6IFNTIGRlcGVuZHMgb24gbGF5ZXJzIGFuZCBwcmVkaWN0aW9uIHN0cnVjdHVyZSAqLworICAgIC8qIEZvciBub3cgYXNzdW1lIDEgc3BhdGlhbCBhbmQgMSB0ZW1wb3JhbCBsYXllci4gKi8KKyAgICAvKiBGSVhNRTogT25seSBmb3IgdGhlIGZpcnN0IHBhY2tldCBpbiB0aGUga2V5IGZyYW1lICovCisgICAgbGVuICs9IDg7CisgIH0KKworICByZXR1cm4gbGVuOworfQorCisvKiBWUDkgUlRQIGhlYWRlciwgbm9uLWZsZXhpYmxlIG1vZGU6CisKKyAgICAgICAgIDAgMSAyIDMgNCA1IDYgNworICAgICAgICArLSstKy0rLSstKy0rLSstKworICAgICAgICB8SXxQfEx8RnxCfEV8VnwtfCAoUkVRVUlSRUQpCisgICAgICAgICstKy0rLSstKy0rLSstKy0rCisgICBJOiAgIHxNfCBQSUNUVVJFIElEICB8IChSRUNPTU1FTkRFRCkKKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSsKKyAgIE06ICAgfCBFWFRFTkRFRCBQSUQgIHwgKFJFQ09NTUVOREVEKQorICAgICAgICArLSstKy0rLSstKy0rLSstKworICAgTDogICB8ICBUICB8VXwgIFMgIHxEfCAoQ09ORElUSU9OQUxMWSBSRUNPTU1FTkRFRCkKKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1cCisgICBQLEY6IHwgUF9ESUZGICAgIHxYfE58IChDT05ESVRJT05BTExZIFJFQ09NTUVOREVEKSAgLgorICAgICAgICArLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gLSB1cCB0byAzIHRpbWVzCisgICBYOiAgIHxFWFRFTkRFRCBQX0RJRkZ8IChPUFRJT05BTCkgICAgICAgICAgICAgICAgICAgLgorICAgICAgICArLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS8KKyAgIFY6ICAgfCBTUyAgICAgICAgICAgIHwKKyAgICAgICAgfCAuLiAgICAgICAgICAgIHwKKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSsKKworICAgU2NhbGFiaWxpdHkgc3RydWN0dXJlIChTUykKKyAgICAgKGZyb20gaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2V4dGVybmFsL3dlYnJ0Yy8rL0hFQUQvd2VicnRjL21vZHVsZXMvcnRwX3J0Y3Avc291cmNlL3J0cF9mb3JtYXRfdnA5LmNjCisgICAgIHNpbmNlIGxhdGVzdCBkcmFmdCBpcyBub3QgdXAgdG8gZGF0ZSB3aXRoIGNocm9taXVtKQorCisgICAgICAgICstKy0rLSstKy0rLSstKy0rCisgICBWOiAgIHwgTl9TIHxZfEd8LXwtfC18CisgICAgICAgICstKy0rLSstKy0rLSstKy0rICAgICAgICAgICAgICAtfAorICAgWTogICB8ICAgICBXSURUSCAgICAgfCAoT1BUSU9OQUwpICAgIC4KKyAgICAgICAgKyAgICAgICAgICAgICAgICsgICAgICAgICAgICAgICAuCisgICAgICAgIHwgICAgICAgICAgICAgICB8IChPUFRJT05BTCkgICAgLgorICAgICAgICArLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgIC4gTl9TICsgMSB0aW1lcworICAgICAgICB8ICAgICBIRUlHSFQgICAgfCAoT1BUSU9OQUwpICAgIC4KKyAgICAgICAgKyAgICAgICAgICAgICAgICsgICAgICAgICAgICAgICAuCisgICAgICAgIHwgICAgICAgICAgICAgICB8IChPUFRJT05BTCkgICAgLgorICAgICAgICArLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgLXwKKyAgIEc6ICAgfCAgICAgIE5fRyAgICAgIHwgKE9QVElPTkFMKQorICAgICAgICArLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC18CisgICBOX0c6IHwgIFQgIHxVfCBSIHwtfC18IChPUFRJT05BTCkgICAgICAgICAgICAgICAgIC4KKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSsgICAgICAgICAgICAgIC18ICAgICAgICAgICAgLiBOX0cgdGltZXMKKyAgICAgICAgfCAgICBQX0RJRkYgICAgIHwgKE9QVElPTkFMKSAgICAuIFIgdGltZXMgICAgLgorICAgICAgICArLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgLXwgICAgICAgICAgIC18CisKKyoqLworCisvKiBXaGVuIGdyb3dpbmcgdGhlIHZwOSBoZWFkZXIga2VlcCBtYXggcGF5bG9hZCBsZW4gY2FsY3VsYXRpb24gaW4gc3luYyAqLworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX3ZwOV9jcmVhdGVfaGVhZGVyX2J1ZmZlciAoR3N0UnRwVlA5UGF5ICogc2VsZiwKKyAgICBnYm9vbGVhbiBzdGFydCwgZ2Jvb2xlYW4gbWFyaywgR3N0QnVmZmVyICogaW4pCit7CisgIEdzdEJ1ZmZlciAqb3V0OworICBndWludDggKnA7CisgIEdzdFJUUEJ1ZmZlciBydHBidWZmZXIgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworICBndWludCBvZmYgPSAxOworICBndWludCBoZHJsZW4gPSBnc3RfcnRwX3ZwOV9jYWxjX2hlYWRlcl9sZW4gKHNlbGYsIHN0YXJ0KTsKKworICBvdXQgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKGhkcmxlbiwgMCwgMCk7CisgIGdzdF9ydHBfYnVmZmVyX21hcCAob3V0LCBHU1RfTUFQX1JFQURXUklURSwgJnJ0cGJ1ZmZlcik7CisgIHAgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cGJ1ZmZlcik7CisgIHBbMF0gPSAweDA7CisKKyAgaWYgKHNlbGYtPnBpY3R1cmVfaWRfbW9kZSAhPSBWUDlfUEFZX05PX1BJQ1RVUkVfSUQpIHsKKyAgICBwWzBdIHw9IDB4ODA7CisgICAgaWYgKHNlbGYtPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDlfUEFZX1BJQ1RVUkVfSURfN0JJVFMpIHsKKyAgICAgIC8qIE09MCAqLworICAgICAgcFtvZmYrK10gPSBzZWxmLT5waWN0dXJlX2lkICYgMHg3RjsKKyAgICB9IGVsc2UgeworICAgICAgLyogTT0xICovCisgICAgICBwW29mZisrXSA9IDB4ODAgfCAoKHNlbGYtPnBpY3R1cmVfaWQgJiAweDdGRkYpID4+IDgpOworICAgICAgcFtvZmYrK10gPSBzZWxmLT5waWN0dXJlX2lkICYgMHhGRjsKKyAgICB9CisgIH0KKworICBpZiAoIXNlbGYtPmlzX2tleWZyYW1lKQorICAgIHBbMF0gfD0gMHg0MDsKKyAgaWYgKHN0YXJ0KQorICAgIHBbMF0gfD0gMHgwODsKKyAgaWYgKG1hcmspCisgICAgcFswXSB8PSAweDA0OworCisgIGlmIChzZWxmLT5pc19rZXlmcmFtZSAmJiBzdGFydCkgeworICAgIHBbMF0gfD0gMHgwMjsKKyAgICAvKiBzY2FsYWJpbGl0eSBzdHJ1Y3R1cmUsIGhhcmQgY29kZWQgZm9yIG5vdyB0byBiZSBzaW1pbGFyIHRvIGNocm9taXVtIGZvcgorICAgICAqIHF1aWNrIGFuZCBkaXJ0eSBpbnRlcm9wICovCisgICAgcFtvZmYrK10gPSAweDE4OyAgICAgICAgICAgIC8qIE5fUz0wIFk9MSBHPTEgKi8KKyAgICBwW29mZisrXSA9IHNlbGYtPndpZHRoID4+IDg7CisgICAgcFtvZmYrK10gPSBzZWxmLT53aWR0aCAmIDB4RkY7CisgICAgcFtvZmYrK10gPSBzZWxmLT5oZWlnaHQgPj4gODsKKyAgICBwW29mZisrXSA9IHNlbGYtPmhlaWdodCAmIDB4RkY7CisgICAgcFtvZmYrK10gPSAweDAxOyAgICAgICAgICAgIC8qIE5fRz0xICovCisgICAgcFtvZmYrK10gPSAweDA0OyAgICAgICAgICAgIC8qIFQ9MCwgVT0wLCBSPTEgKi8KKyAgICBwW29mZisrXSA9IDB4MDE7ICAgICAgICAgICAgLyogUF9ESUZGPTEgKi8KKyAgfQorCisgIGdfYXNzZXJ0X2NtcGludCAob2ZmLCA9PSwgaGRybGVuKTsKKworICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwYnVmZmVyLCBtYXJrKTsKKworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cGJ1ZmZlcik7CisKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0KSA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGluKTsKKyAgR1NUX0JVRkZFUl9QVFMgKG91dCkgPSBHU1RfQlVGRkVSX1BUUyAoaW4pOworCisgIHJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyBndWludAorZ3N0X3J0cF92cDlfcGF5bG9hZF9uZXh0IChHc3RSdHBWUDlQYXkgKiBzZWxmLCBHc3RCdWZmZXJMaXN0ICogbGlzdCwKKyAgICBndWludCBvZmZzZXQsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwgZ3NpemUgYnVmZmVyX3NpemUsIGdzaXplIG1heF9wYXlsb2FkX2xlbikKK3sKKyAgR3N0QnVmZmVyICpoZWFkZXI7CisgIEdzdEJ1ZmZlciAqc3ViOworICBHc3RCdWZmZXIgKm91dDsKKyAgZ2Jvb2xlYW4gbWFyazsKKyAgZ3NpemUgcmVtYWluaW5nOworICBnc2l6ZSBhdmFpbGFibGU7CisKKyAgcmVtYWluaW5nID0gYnVmZmVyX3NpemUgLSBvZmZzZXQ7CisgIGF2YWlsYWJsZSA9IG1heF9wYXlsb2FkX2xlbjsKKyAgaWYgKGF2YWlsYWJsZSA+IHJlbWFpbmluZykKKyAgICBhdmFpbGFibGUgPSByZW1haW5pbmc7CisKKyAgbWFyayA9IChyZW1haW5pbmcgPT0gYXZhaWxhYmxlKTsKKyAgaGVhZGVyID0gZ3N0X3J0cF92cDlfY3JlYXRlX2hlYWRlcl9idWZmZXIgKHNlbGYsIG9mZnNldCA9PSAwLCBtYXJrLCBidWZmZXIpOworICBzdWIgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uIChidWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIG9mZnNldCwgYXZhaWxhYmxlKTsKKworICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAoc2VsZiwgaGVhZGVyLCBidWZmZXIpOworCisgIG91dCA9IGdzdF9idWZmZXJfYXBwZW5kIChoZWFkZXIsIHN1Yik7CisKKyAgZ3N0X2J1ZmZlcl9saXN0X2luc2VydCAobGlzdCwgLTEsIG91dCk7CisKKyAgcmV0dXJuIGF2YWlsYWJsZTsKK30KKworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF92cDlfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBWUDlQYXkgKnNlbGYgPSBHU1RfUlRQX1ZQOV9QQVkgKHBheWxvYWQpOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdDsKKyAgZ3NpemUgc2l6ZSwgbWF4X3BheWxlbjsKKyAgZ3VpbnQgb2Zmc2V0LCBtdHUsIHZwOV9oZHJfbGVuOworCisgIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpOworCisgIGlmIChHX1VOTElLRUxZICghZ3N0X3J0cF92cDlfcGF5X3BhcnNlX2ZyYW1lIChzZWxmLCBidWZmZXIsIHNpemUpKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzZWxmLCBTVFJFQU0sIEVOQ09ERSwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBwYXJzZSBWUDkgZnJhbWUiKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgbXR1ID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChwYXlsb2FkKTsKKyAgdnA5X2hkcl9sZW4gPSBnc3RfcnRwX3ZwOV9jYWxjX2hlYWRlcl9sZW4gKHNlbGYsIFRSVUUpOworICBtYXhfcGF5bGVuID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYXlsb2FkX2xlbiAobXR1IC0gdnA5X2hkcl9sZW4sIDAsIDApOworCisgIGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3X3NpemVkICgoc2l6ZSAvIG1heF9wYXlsZW4pICsgMSk7CisKKyAgb2Zmc2V0ID0gMDsKKyAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKKyAgICBvZmZzZXQgKz0KKyAgICAgICAgZ3N0X3J0cF92cDlfcGF5bG9hZF9uZXh0IChzZWxmLCBsaXN0LCBvZmZzZXQsIGJ1ZmZlciwgc2l6ZSwgbWF4X3BheWxlbik7CisgIH0KKworICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoX2xpc3QgKHBheWxvYWQsIGxpc3QpOworCisgIC8qIEluY3JlbWVuZW50IGFuZCB3cmFwIHRoZSBwaWN0dXJlIGlkIGlmIGl0IG92ZXJmbG93cyAqLworICBpZiAoKHNlbGYtPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDlfUEFZX1BJQ1RVUkVfSURfN0JJVFMgJiYKKyAgICAgICAgICArK3NlbGYtPnBpY3R1cmVfaWQgPj0gMHg4MCkgfHwKKyAgICAgIChzZWxmLT5waWN0dXJlX2lkX21vZGUgPT0gVlA5X1BBWV9QSUNUVVJFX0lEXzE1QklUUyAmJgorICAgICAgICAgICsrc2VsZi0+cGljdHVyZV9pZCA+PSAweDgwMDApKQorICAgIHNlbGYtPnBpY3R1cmVfaWQgPSAwOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3ZwOV9wYXlfc2lua19ldmVudCAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBWUDlQYXkgKnNlbGYgPSBHU1RfUlRQX1ZQOV9QQVkgKHBheWxvYWQpOworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9GTFVTSF9TVEFSVCkgeworICAgIGlmIChzZWxmLT5waWN0dXJlX2lkX21vZGUgPT0gVlA5X1BBWV9QSUNUVVJFX0lEXzdCSVRTKQorICAgICAgc2VsZi0+cGljdHVyZV9pZCA9IGdfcmFuZG9tX2ludF9yYW5nZSAoMCwgR19NQVhVSU5UOCkgJiAweDdGOworICAgIGVsc2UgaWYgKHNlbGYtPnBpY3R1cmVfaWRfbW9kZSA9PSBWUDlfUEFZX1BJQ1RVUkVfSURfMTVCSVRTKQorICAgICAgc2VsZi0+cGljdHVyZV9pZCA9IGdfcmFuZG9tX2ludF9yYW5nZSAoMCwgR19NQVhVSU5UMTYpICYgMHg3RkZGOworICB9CisKKyAgcmV0dXJuIEdTVF9SVFBfQkFTRV9QQVlMT0FEX0NMQVNTIChnc3RfcnRwX3ZwOV9wYXlfcGFyZW50X2NsYXNzKS0+c2lua19ldmVudAorICAgICAgKHBheWxvYWQsIGV2ZW50KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3ZwOV9wYXlfc2V0X2NhcHMgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdENhcHMgKnNyY19jYXBzOworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIGNoYXIgKmVuY29kaW5nX25hbWU7CisKKyAgc3JjX2NhcHMgPSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKEdTVF9SVFBfQkFTRV9QQVlMT0FEX1NSQ1BBRCAocGF5bG9hZCkpOworICBpZiAoc3JjX2NhcHMpIHsKKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKHNyY19jYXBzKTsKKyAgICBzcmNfY2FwcyA9IGdzdF9jYXBzX3RydW5jYXRlIChzcmNfY2Fwcyk7CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHNyY19jYXBzLCAwKTsKKyAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9zdHJpbmcgKHMsICJlbmNvZGluZy1uYW1lIiwgIlZQOSIpOworICAgIGVuY29kaW5nX25hbWUgPSBnX3N0cmR1cCAoZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAiZW5jb2RpbmctbmFtZSIpKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjX2NhcHMpOworICB9IGVsc2UgeworICAgIGVuY29kaW5nX25hbWUgPSBnX3N0cmR1cCAoIlZQOS1EUkFGVC1JRVRGLTAxIik7CisgIH0KKworICBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3B0aW9ucyAocGF5bG9hZCwgInZpZGVvIiwgVFJVRSwKKyAgICAgIGVuY29kaW5nX25hbWUsIDkwMDAwKTsKKyAgZ19mcmVlIChlbmNvZGluZ19uYW1lKTsKKyAgcmV0dXJuIGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXlsb2FkLCBOVUxMKTsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfdnA5X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHZwOXBheSIsCisgICAgICBHU1RfUkFOS19NQVJHSU5BTCwgR1NUX1RZUEVfUlRQX1ZQOV9QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHB2cDlwYXkuaCBiL2dzdC9ydHAvZ3N0cnRwdnA5cGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyYWE4ZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwdnA5cGF5LmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIGdzdHJ0cHZwOXBheS5oIC0gSGVhZGVyIGZvciBHc3RSdHBWUDlQYXkKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1ZQOV9QQVlfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9WUDlfUEFZX0hfXworCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1ZQOV9QQVkgXAorICAoZ3N0X3J0cF92cDlfcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfVlA5X1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLCBHU1RfVFlQRV9SVFBfVlA5X1BBWSwgR3N0UnRwVlA5UGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9WUDlfUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLCBHU1RfVFlQRV9SVFBfVlA5X1BBWSwgR3N0UnRwVlA5UGF5Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1ZQOV9QQVkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSwgR1NUX1RZUEVfUlRQX1ZQOV9QQVkpKQorI2RlZmluZSBHU1RfSVNfUlRQX1ZQOV9QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksIEdTVF9UWVBFX1JUUF9WUDlfUEFZKSkKKyNkZWZpbmUgR1NUX1JUUF9WUDlfUEFZX0dFVF9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9SVFBfVlA5X1BBWSwgR3N0UnRwVlA5UGF5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwVlA5UGF5IEdzdFJ0cFZQOVBheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBWUDlQYXlDbGFzcyBHc3RSdHBWUDlQYXlDbGFzczsKK3R5cGVkZWYgZW51bSBfVlA5UGljdHVyZUlETW9kZSBWUDlQaWN0dXJlSURNb2RlOworCitlbnVtIF9WUDlQaWN0dXJlSURNb2RlIHsKKyAgVlA5X1BBWV9OT19QSUNUVVJFX0lELAorICBWUDlfUEFZX1BJQ1RVUkVfSURfN0JJVFMsCisgIFZQOV9QQVlfUElDVFVSRV9JRF8xNUJJVFMsCit9OworCitzdHJ1Y3QgX0dzdFJ0cFZQOVBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworc3RydWN0IF9Hc3RSdHBWUDlQYXkKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWQgcGFyZW50OworICBnYm9vbGVhbiBpc19rZXlmcmFtZTsKKyAgZ3VpbnQgd2lkdGg7CisgIGd1aW50IGhlaWdodDsKKyAgVlA5UGljdHVyZUlETW9kZSBwaWN0dXJlX2lkX21vZGU7CisgIGd1aW50MTYgcGljdHVyZV9pZDsKK307CisKK0dUeXBlIGdzdF9ydHBfdnA5X3BheV9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF9ydHBfdnA5X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qICNpZm5kZWYgX19HU1RfUlRQX1ZQOV9QQVlfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5jIGIvZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDJiYjUxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHB2cmF3ZGVwYXkuYwpAQCAtMCwwICsxLDY2NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA4PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImdzdHJ0cHZyYXdkZXBheS5oIgorI2luY2x1ZGUgImdzdHJ0cHV0aWxzLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cHZyYXdkZXBheV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwdnJhd2RlcGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF92cmF3X2RlcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1yYXciKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3ZyYXdfZGVwYXlfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgICAibWVkaWEgPSAoc3RyaW5nKSBcInZpZGVvXCIsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSA5MDAwMCwgIgorICAgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpIFwiUkFXXCIsICIKKyAgICAgICAgInNhbXBsaW5nID0gKHN0cmluZykgeyBcIlJHQlwiLCBcIlJHQkFcIiwgXCJCR1JcIiwgXCJCR1JBXCIsICIKKyAgICAgICAgIlwiWUNiQ3ItNDo0OjRcIiwgXCJZQ2JDci00OjI6MlwiLCBcIllDYkNyLTQ6MjowXCIsICIKKyAgICAgICAgIlwiWUNiQ3ItNDoxOjFcIiB9LCIKKyAgICAgICAgLyogd2UgY2Fubm90IGV4cHJlc3MgdGhlc2UgYXMgc3RyaW5ncyAKKyAgICAgICAgICogIndpZHRoID0gKHN0cmluZykgWzEgMzI3NjddLCIKKyAgICAgICAgICogImhlaWdodCA9IChzdHJpbmcpIFsxIDMyNzY3XSwiCisgICAgICAgICAqLworICAgICAgICAiZGVwdGggPSAoc3RyaW5nKSB7IFwiOFwiLCBcIjEwXCIsIFwiMTJcIiwgXCIxNlwiIH0iKQorICAgICk7CisKKyNkZWZpbmUgZ3N0X3J0cF92cmF3X2RlcGF5X3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cFZSYXdEZXBheSwgZ3N0X3J0cF92cmF3X2RlcGF5LAorICAgIEdTVF9UWVBFX1JUUF9CQVNFX0RFUEFZTE9BRCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3ZyYXdfZGVwYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZURlcGF5bG9hZCAqIGRlcGF5bG9hZCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0QnVmZmVyICpnc3RfcnRwX3ZyYXdfZGVwYXlfcHJvY2Vzc19wYWNrZXQgKEdzdFJUUEJhc2VEZXBheWxvYWQgKgorICAgIGRlcGF5LCBHc3RSVFBCdWZmZXIgKiBydHApOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF92cmF3X2RlcGF5X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3ZyYXdfZGVwYXlfaGFuZGxlX2V2ZW50IChHc3RSVFBCYXNlRGVwYXlsb2FkICogZmlsdGVyLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92cmF3X2RlcGF5X2NsYXNzX2luaXQgKEdzdFJ0cFZSYXdEZXBheUNsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQQmFzZURlcGF5bG9hZENsYXNzICpnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzOworCisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBiYXNlZGVwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyAqKSBrbGFzczsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfcnRwX3ZyYXdfZGVwYXlfY2hhbmdlX3N0YXRlOworCisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnNldF9jYXBzID0gZ3N0X3J0cF92cmF3X2RlcGF5X3NldGNhcHM7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPnByb2Nlc3NfcnRwX3BhY2tldCA9CisgICAgICBnc3RfcnRwX3ZyYXdfZGVwYXlfcHJvY2Vzc19wYWNrZXQ7CisgIGdzdHJ0cGJhc2VkZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9ldmVudCA9IGdzdF9ydHBfdnJhd19kZXBheV9oYW5kbGVfZXZlbnQ7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF92cmF3X2RlcGF5X3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9ydHBfdnJhd19kZXBheV9zaW5rX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBSYXcgVmlkZW8gZGVwYXlsb2FkZXIiLCAiQ29kZWMvRGVwYXlsb2FkZXIvTmV0d29yay9SVFAiLAorICAgICAgIkV4dHJhY3RzIHJhdyB2aWRlbyBmcm9tIFJUUCBwYWNrZXRzIChSRkMgNDE3NSkiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cHZyYXdkZXBheV9kZWJ1ZywgInJ0cHZyYXdkZXBheSIsIDAsCisgICAgICAicmF3IHZpZGVvIFJUUCBEZXBheWxvYWRlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92cmF3X2RlcGF5X2luaXQgKEdzdFJ0cFZSYXdEZXBheSAqIHJ0cHZyYXdkZXBheSkKK3sKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdnJhd19kZXBheV9yZXNldCAoR3N0UnRwVlJhd0RlcGF5ICogcnRwdnJhd2RlcGF5KQoreworICBpZiAocnRwdnJhd2RlcGF5LT5vdXRidWYpIHsKKyAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZydHB2cmF3ZGVwYXktPmZyYW1lKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChydHB2cmF3ZGVwYXktPm91dGJ1Zik7CisgICAgcnRwdnJhd2RlcGF5LT5vdXRidWYgPSBOVUxMOworICB9CisgIHJ0cHZyYXdkZXBheS0+dGltZXN0YW1wID0gLTE7CisgIGlmIChydHB2cmF3ZGVwYXktPnBvb2wpIHsKKyAgICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAocnRwdnJhd2RlcGF5LT5wb29sLCBGQUxTRSk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocnRwdnJhd2RlcGF5LT5wb29sKTsKKyAgICBydHB2cmF3ZGVwYXktPnBvb2wgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3ZyYXdfZGVwYXlfbmVnb3RpYXRlX3Bvb2wgKEdzdFJ0cFZSYXdEZXBheSAqIGRlcGF5LCBHc3RDYXBzICogY2FwcywKKyAgICBHc3RWaWRlb0luZm8gKiBpbmZvKQoreworICBHc3RRdWVyeSAqcXVlcnk7CisgIEdzdEJ1ZmZlclBvb2wgKnBvb2wgPSBOVUxMOworICBndWludCBzaXplLCBtaW4sIG1heDsKKyAgR3N0U3RydWN0dXJlICpjb25maWc7CisKKyAgLyogZmluZCBhIHBvb2wgZm9yIHRoZSBuZWdvdGlhdGVkIGNhcHMgbm93ICovCisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19hbGxvY2F0aW9uIChjYXBzLCBUUlVFKTsKKworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeSAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKGRlcGF5KSwgcXVlcnkpKSB7CisgICAgLyogbm90IGEgcHJvYmxlbSwgd2UgdXNlIHRoZSBkZWZhdWx0cyBvZiBxdWVyeSAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5LCAiY291bGQgbm90IGdldCBkb3duc3RyZWFtIEFMTE9DQVRJT04gaGludHMiKTsKKyAgfQorCisgIGlmIChnc3RfcXVlcnlfZ2V0X25fYWxsb2NhdGlvbl9wb29scyAocXVlcnkpID4gMCkgeworICAgIC8qIHdlIGdvdCBjb25maWd1cmF0aW9uIGZyb20gb3VyIHBlZXIsIHBhcnNlIHRoZW0gKi8KKyAgICBnc3RfcXVlcnlfcGFyc2VfbnRoX2FsbG9jYXRpb25fcG9vbCAocXVlcnksIDAsICZwb29sLCAmc2l6ZSwgJm1pbiwgJm1heCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVwYXksICJkaWRuJ3QgZ2V0IGRvd25zdHJlYW0gcG9vbCBoaW50cyIpOworICAgIHNpemUgPSBpbmZvLT5zaXplOworICAgIG1pbiA9IG1heCA9IDA7CisgIH0KKworICBpZiAocG9vbCA9PSBOVUxMKSB7CisgICAgLyogd2UgZGlkIG5vdCBnZXQgYSBwb29sLCBtYWtlIG9uZSBvdXJzZWx2ZXMgdGhlbiAqLworICAgIHBvb2wgPSBnc3RfdmlkZW9fYnVmZmVyX3Bvb2xfbmV3ICgpOworICB9CisKKyAgaWYgKGRlcGF5LT5wb29sKQorICAgIGdzdF9vYmplY3RfdW5yZWYgKGRlcGF5LT5wb29sKTsKKyAgZGVwYXktPnBvb2wgPSBwb29sOworCisgIGNvbmZpZyA9IGdzdF9idWZmZXJfcG9vbF9nZXRfY29uZmlnIChwb29sKTsKKyAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19zZXRfcGFyYW1zIChjb25maWcsIGNhcHMsIHNpemUsIG1pbiwgbWF4KTsKKyAgaWYgKGdzdF9xdWVyeV9maW5kX2FsbG9jYXRpb25fbWV0YSAocXVlcnksIEdTVF9WSURFT19NRVRBX0FQSV9UWVBFLCBOVUxMKSkgeworICAgIC8qIGp1c3Qgc2V0IHRoZSBtZXRhZGF0YSwgaWYgdGhlIHBvb2wgY2FuIHN1cHBvcnQgaXQgd2Ugd2lsbCB0cmFuc3BhcmVudGx5IHVzZQorICAgICAqIGl0IHRocm91Z2ggdGhlIHZpZGVvIGluZm8gQVBJLiBXZSBjb3VsZCBhbHNvIHNlZSBpZiB0aGUgcG9vbCBzdXBwb3J0IHRoaXMKKyAgICAgKiBtZXRhZGF0YSBhbmQgb25seSBhY3RpdmF0ZSBpdCB0aGVuLiAqLworICAgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfYWRkX29wdGlvbiAoY29uZmlnLAorICAgICAgICBHU1RfQlVGRkVSX1BPT0xfT1BUSU9OX1ZJREVPX01FVEEpOworICB9CisKKyAgZ3N0X2J1ZmZlcl9wb29sX3NldF9jb25maWcgKHBvb2wsIGNvbmZpZyk7CisgIC8qIGFuZCBhY3RpdmF0ZSAqLworICBnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAocG9vbCwgVFJVRSk7CisKKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdnJhd19kZXBheV9zZXRjYXBzIChHc3RSVFBCYXNlRGVwYXlsb2FkICogZGVwYXlsb2FkLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdFJ0cFZSYXdEZXBheSAqcnRwdnJhd2RlcGF5OworICBnaW50IGNsb2NrX3JhdGU7CisgIGNvbnN0IGdjaGFyICpzdHI7CisgIGdpbnQgZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgcGdyb3VwLCB4aW5jLCB5aW5jOworICBHc3RDYXBzICpzcmNjYXBzOworICBnYm9vbGVhbiByZXM7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIHJ0cHZyYXdkZXBheSA9IEdTVF9SVFBfVlJBV19ERVBBWSAoZGVwYXlsb2FkKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICB4aW5jID0geWluYyA9IDE7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImNsb2NrLXJhdGUiLCAmY2xvY2tfcmF0ZSkpCisgICAgY2xvY2tfcmF0ZSA9IDkwMDAwOyAgICAgICAgIC8qIGRlZmF1bHQgKi8KKyAgZGVwYXlsb2FkLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKworICBpZiAoIShzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgIndpZHRoIikpKQorICAgIGdvdG8gbm9fd2lkdGg7CisgIHdpZHRoID0gYXRvaSAoc3RyKTsKKworICBpZiAoIShzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImhlaWdodCIpKSkKKyAgICBnb3RvIG5vX2hlaWdodDsKKyAgaGVpZ2h0ID0gYXRvaSAoc3RyKTsKKworICBpZiAoIShzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImRlcHRoIikpKQorICAgIGdvdG8gbm9fZGVwdGg7CisgIGRlcHRoID0gYXRvaSAoc3RyKTsKKworICAvKiBvcHRpb25hbCBpbnRlcmxhY2UgdmFsdWUgYnV0IHdlIGRvbid0IGhhbmRsZSBpbnRlcmxhY2VkCisgICAqIGZvcm1hdHMgeWV0ICovCisgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImludGVybGFjZSIpKQorICAgIGdvdG8gaW50ZXJsYWNlZDsKKworICBpZiAoIShzdHIgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgInNhbXBsaW5nIikpKQorICAgIGdvdG8gbm9fc2FtcGxpbmc7CisKKyAgaWYgKCFzdHJjbXAgKHN0ciwgIlJHQiIpKSB7CisgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9SR0I7CisgICAgcGdyb3VwID0gMzsKKyAgfSBlbHNlIGlmICghc3RyY21wIChzdHIsICJSR0JBIikpIHsKKyAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1JHQkE7CisgICAgcGdyb3VwID0gNDsKKyAgfSBlbHNlIGlmICghc3RyY21wIChzdHIsICJCR1IiKSkgeworICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfQkdSOworICAgIHBncm91cCA9IDM7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoc3RyLCAiQkdSQSIpKSB7CisgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9CR1JBOworICAgIHBncm91cCA9IDQ7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoc3RyLCAiWUNiQ3ItNDo0OjQiKSkgeworICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfQVlVVjsKKyAgICBwZ3JvdXAgPSAzOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKHN0ciwgIllDYkNyLTQ6MjoyIikpIHsKKyAgICBpZiAoZGVwdGggPT0gOCkgeworICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9VWVZZOworICAgICAgcGdyb3VwID0gNDsKKyAgICB9IGVsc2UgaWYgKGRlcHRoID09IDEwKSB7CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1VZVlA7CisgICAgICBwZ3JvdXAgPSA1OworICAgIH0gZWxzZQorICAgICAgZ290byB1bmtub3duX2Zvcm1hdDsKKyAgICB4aW5jID0gMjsKKyAgfSBlbHNlIGlmICghc3RyY21wIChzdHIsICJZQ2JDci00OjI6MCIpKSB7CisgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOworICAgIHBncm91cCA9IDY7CisgICAgeGluYyA9IHlpbmMgPSAyOworICB9IGVsc2UgaWYgKCFzdHJjbXAgKHN0ciwgIllDYkNyLTQ6MToxIikpIHsKKyAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1k0MUI7CisgICAgcGdyb3VwID0gNjsKKyAgICB4aW5jID0gNDsKKyAgfSBlbHNlIHsKKyAgICBnb3RvIHVua25vd25fZm9ybWF0OworICB9CisKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJnJ0cHZyYXdkZXBheS0+dmluZm8pOworICBnc3RfdmlkZW9faW5mb19zZXRfZm9ybWF0ICgmcnRwdnJhd2RlcGF5LT52aW5mbywgZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgR1NUX1ZJREVPX0lORk9fRlBTX04gKCZydHB2cmF3ZGVwYXktPnZpbmZvKSA9IDA7CisgIEdTVF9WSURFT19JTkZPX0ZQU19EICgmcnRwdnJhd2RlcGF5LT52aW5mbykgPSAxOworCisgIHJ0cHZyYXdkZXBheS0+cGdyb3VwID0gcGdyb3VwOworICBydHB2cmF3ZGVwYXktPnhpbmMgPSB4aW5jOworICBydHB2cmF3ZGVwYXktPnlpbmMgPSB5aW5jOworCisgIHNyY2NhcHMgPSBnc3RfdmlkZW9faW5mb190b19jYXBzICgmcnRwdnJhd2RlcGF5LT52aW5mbyk7CisgIHJlcyA9IGdzdF9wYWRfc2V0X2NhcHMgKEdTVF9SVFBfQkFTRV9ERVBBWUxPQURfU1JDUEFEIChkZXBheWxvYWQpLCBzcmNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgIndpZHRoICVkLCBoZWlnaHQgJWQsIGZvcm1hdCAlZCIsIHdpZHRoLCBoZWlnaHQsCisgICAgICBmb3JtYXQpOworICBHU1RfREVCVUdfT0JKRUNUIChkZXBheWxvYWQsICJ4aW5jICVkLCB5aW5jICVkLCBwZ3JvdXAgJWQiLAorICAgICAgeGluYywgeWluYywgcGdyb3VwKTsKKworICAvKiBuZWdvdGlhdGUgYSBidWZmZXJwb29sICovCisgIGlmICgocmV0ID0gZ3N0X3J0cF92cmF3X2RlcGF5X25lZ290aWF0ZV9wb29sIChydHB2cmF3ZGVwYXksIHNyY2NhcHMsCisgICAgICAgICAgICAgICZydHB2cmF3ZGVwYXktPnZpbmZvKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBub19idWZmZXJwb29sOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitub193aWR0aDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlcGF5bG9hZCwgIm5vIHdpZHRoIHNwZWNpZmllZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9faGVpZ2h0OgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZGVwYXlsb2FkLCAibm8gaGVpZ2h0IHNwZWNpZmllZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fZGVwdGg6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZXBheWxvYWQsICJubyBkZXB0aCBzcGVjaWZpZWQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludGVybGFjZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZXBheWxvYWQsICJpbnRlcmxhY2VkIGZvcm1hdHMgbm90IHN1cHBvcnRlZCB5ZXQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX3NhbXBsaW5nOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoZGVwYXlsb2FkLCAibm8gc2FtcGxpbmcgc3BlY2lmaWVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit1bmtub3duX2Zvcm1hdDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGRlcGF5bG9hZCwgInVua25vd24gc2FtcGxpbmcgZm9ybWF0ICclcyciLCBzdHIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fYnVmZmVycG9vbDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlcGF5bG9hZCwgIm5vIGJ1ZmZlcnBvb2wiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX3ZyYXdfZGVwYXlfcHJvY2Vzc19wYWNrZXQgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBkZXBheWxvYWQsCisgICAgR3N0UlRQQnVmZmVyICogcnRwKQoreworICBHc3RSdHBWUmF3RGVwYXkgKnJ0cHZyYXdkZXBheTsKKyAgZ3VpbnQ4ICpwYXlsb2FkLCAqcDAsICp5cCwgKnVwLCAqdnAsICpoZWFkZXJzOworICBndWludDMyIHRpbWVzdGFtcDsKKyAgZ3VpbnQgY29udCwgeXN0cmlkZSwgdXZzdHJpZGUsIHBncm91cCwgcGF5bG9hZF9sZW47CisgIGdpbnQgd2lkdGgsIGhlaWdodCwgeGluYywgeWluYzsKKyAgR3N0VmlkZW9GcmFtZSAqZnJhbWU7CisgIGdib29sZWFuIG1hcmtlcjsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworCisgIHJ0cHZyYXdkZXBheSA9IEdTVF9SVFBfVlJBV19ERVBBWSAoZGVwYXlsb2FkKTsKKworICB0aW1lc3RhbXAgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wIChydHApOworCisgIGlmICh0aW1lc3RhbXAgIT0gcnRwdnJhd2RlcGF5LT50aW1lc3RhbXAgfHwgcnRwdnJhd2RlcGF5LT5vdXRidWYgPT0gTlVMTCkgeworICAgIEdzdEJ1ZmZlciAqbmV3X2J1ZmZlcjsKKyAgICBHc3RGbG93UmV0dXJuIHJldDsKKworICAgIEdTVF9MT0dfT0JKRUNUIChkZXBheWxvYWQsICJuZXcgZnJhbWUgd2l0aCB0aW1lc3RhbXAgJXUiLCB0aW1lc3RhbXApOworICAgIC8qIG5ldyB0aW1lc3RhbXAsIGZsdXNoIG9sZCBidWZmZXIgYW5kIGNyZWF0ZSBuZXcgb3V0cHV0IGJ1ZmZlciAqLworICAgIGlmIChydHB2cmF3ZGVwYXktPm91dGJ1ZikgeworICAgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmcnRwdnJhd2RlcGF5LT5mcmFtZSk7CisgICAgICBnc3RfcnRwX2Jhc2VfZGVwYXlsb2FkX3B1c2ggKGRlcGF5bG9hZCwgcnRwdnJhd2RlcGF5LT5vdXRidWYpOworICAgICAgcnRwdnJhd2RlcGF5LT5vdXRidWYgPSBOVUxMOworICAgIH0KKworICAgIGlmIChnc3RfcGFkX2NoZWNrX3JlY29uZmlndXJlIChHU1RfUlRQX0JBU0VfREVQQVlMT0FEX1NSQ1BBRCAoZGVwYXlsb2FkKSkpIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIGNhcHMgPQorICAgICAgICAgIGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9TUkNQQUQgKGRlcGF5bG9hZCkpOworICAgICAgZ3N0X3J0cF92cmF3X2RlcGF5X25lZ290aWF0ZV9wb29sIChydHB2cmF3ZGVwYXksIGNhcHMsCisgICAgICAgICAgJnJ0cHZyYXdkZXBheS0+dmluZm8pOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIH0KKworICAgIHJldCA9CisgICAgICAgIGdzdF9idWZmZXJfcG9vbF9hY3F1aXJlX2J1ZmZlciAocnRwdnJhd2RlcGF5LT5wb29sLCAmbmV3X2J1ZmZlciwgTlVMTCk7CisKKyAgICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkKKyAgICAgIGdvdG8gYWxsb2NfZmFpbGVkOworCisgICAgLyogY2xlYXIgdGltZXN0YW1wIGZyb20gYWxsb2MuLi4gKi8KKyAgICBHU1RfQlVGRkVSX1BUUyAobmV3X2J1ZmZlcikgPSAtMTsKKworICAgIGlmICghZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJnJ0cHZyYXdkZXBheS0+ZnJhbWUsICZydHB2cmF3ZGVwYXktPnZpbmZvLAorICAgICAgICAgICAgbmV3X2J1ZmZlciwgR1NUX01BUF9XUklURSB8IEdTVF9WSURFT19GUkFNRV9NQVBfRkxBR19OT19SRUYpKSB7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChuZXdfYnVmZmVyKTsKKyAgICAgIGdvdG8gaW52YWxpZF9mcmFtZTsKKyAgICB9CisKKyAgICBydHB2cmF3ZGVwYXktPm91dGJ1ZiA9IG5ld19idWZmZXI7CisgICAgcnRwdnJhd2RlcGF5LT50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgIH0KKworICBmcmFtZSA9ICZydHB2cmF3ZGVwYXktPmZyYW1lOworCisgIGdfYXNzZXJ0IChmcmFtZS0+YnVmZmVyICE9IE5VTEwpOworCisgIC8qIGdldCBwb2ludGVyIGFuZCBzdHJpZGVzIG9mIHRoZSBwbGFuZXMgKi8KKyAgcDAgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZnJhbWUsIDApOworICB5cCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAwKTsKKyAgdXAgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgMSk7CisgIHZwID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZnJhbWUsIDIpOworCisgIHlzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKTsKKyAgdXZzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAxKTsKKworICBwZ3JvdXAgPSBydHB2cmF3ZGVwYXktPnBncm91cDsKKyAgd2lkdGggPSBHU1RfVklERU9fSU5GT19XSURUSCAoJnJ0cHZyYXdkZXBheS0+dmluZm8pOworICBoZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZydHB2cmF3ZGVwYXktPnZpbmZvKTsKKyAgeGluYyA9IHJ0cHZyYXdkZXBheS0+eGluYzsKKyAgeWluYyA9IHJ0cHZyYXdkZXBheS0+eWluYzsKKworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKHJ0cCk7CisgIHBheWxvYWRfbGVuID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuIChydHApOworCisgIGlmIChwYXlsb2FkX2xlbiA8IDMpCisgICAgZ290byBzaG9ydF9wYWNrZXQ7CisKKyAgLyogc2tpcCBleHRlbmRlZCBzZXFudW0gKi8KKyAgcGF5bG9hZCArPSAyOworICBwYXlsb2FkX2xlbiAtPSAyOworCisgIC8qIHJlbWVtYmVyIGhlYWRlciBwb3NpdGlvbiAqLworICBoZWFkZXJzID0gcGF5bG9hZDsKKworICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwdnJhd2RlcGF5LCBmcmFtZS0+YnVmZmVyLCBydHAtPmJ1ZmZlcik7CisKKyAgLyogZmluZCBkYXRhIHN0YXJ0ICovCisgIGRvIHsKKyAgICBpZiAocGF5bG9hZF9sZW4gPCA2KQorICAgICAgZ290byBzaG9ydF9wYWNrZXQ7CisKKyAgICBjb250ID0gcGF5bG9hZFs0XSAmIDB4ODA7CisKKyAgICBwYXlsb2FkICs9IDY7CisgICAgcGF5bG9hZF9sZW4gLT0gNjsKKyAgfSB3aGlsZSAoY29udCk7CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBndWludCBsZW5ndGgsIGxpbmUsIG9mZnMsIHBsZW47CisgICAgZ3VpbnQ4ICpkYXRhcDsKKworICAgIC8qIHN0b3Agd2hlbiB3ZSBydW4gb3V0IG9mIGRhdGEgKi8KKyAgICBpZiAocGF5bG9hZF9sZW4gPT0gMCkKKyAgICAgIGJyZWFrOworCisgICAgLyogcmVhZCBsZW5ndGggYW5kIGNvbnQuIFRoaXMgc2hvdWxkIHdvcmsgYmVjYXVzZSB3ZSBpdGVyYXRlZCB0aGUgaGVhZGVycworICAgICAqIGFib3ZlLiAqLworICAgIGxlbmd0aCA9IChoZWFkZXJzWzBdIDw8IDgpIHwgaGVhZGVyc1sxXTsKKyAgICBsaW5lID0gKChoZWFkZXJzWzJdICYgMHg3ZikgPDwgOCkgfCBoZWFkZXJzWzNdOworICAgIG9mZnMgPSAoKGhlYWRlcnNbNF0gJiAweDdmKSA8PCA4KSB8IGhlYWRlcnNbNV07CisgICAgY29udCA9IGhlYWRlcnNbNF0gJiAweDgwOworICAgIGhlYWRlcnMgKz0gNjsKKworICAgIC8qIGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgcGdyb3VwICovCisgICAgaWYgKGxlbmd0aCAlIHBncm91cCAhPSAwKQorICAgICAgZ290byB3cm9uZ19sZW5ndGg7CisKKyAgICBpZiAobGVuZ3RoID4gcGF5bG9hZF9sZW4pCisgICAgICBsZW5ndGggPSBwYXlsb2FkX2xlbjsKKworICAgIC8qIHNhbml0eSBjaGVjayAqLworICAgIGlmIChsaW5lID4gKGhlaWdodCAtIHlpbmMpKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgInNraXBwaW5nIGxpbmUgJWQ6IG91dCBvZiByYW5nZSIsIGxpbmUpOworICAgICAgZ290byBuZXh0OworICAgIH0KKyAgICBpZiAob2ZmcyA+ICh3aWR0aCAtIHhpbmMpKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgInNraXBwaW5nIG9mZnNldCAlZDogb3V0IG9mIHJhbmdlIiwgb2Zmcyk7CisgICAgICBnb3RvIG5leHQ7CisgICAgfQorCisgICAgLyogY2FsY3VsYXRlIHRoZSBtYXhpbWltIGFtb3VudCBvZiBieXRlcyB3ZSBjYW4gdXNlIHBlciBsaW5lICovCisgICAgaWYgKG9mZnMgKyAoKGxlbmd0aCAvIHBncm91cCkgKiB4aW5jKSA+IHdpZHRoKSB7CisgICAgICBwbGVuID0gKCh3aWR0aCAtIG9mZnMpICogcGdyb3VwKSAvIHhpbmM7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgImNsaXBwaW5nIGxlbmd0aCAlZCwgb2Zmc2V0ICVkLCBwbGVuICVkIiwKKyAgICAgICAgICBsZW5ndGgsIG9mZnMsIHBsZW4pOworICAgIH0gZWxzZQorICAgICAgcGxlbiA9IGxlbmd0aDsKKworICAgIEdTVF9MT0dfT0JKRUNUIChkZXBheWxvYWQsCisgICAgICAgICJ3cml0aW5nIGxlbmd0aCAldS8ldSwgbGluZSAldSwgb2Zmc2V0ICV1LCByZW1haW5pbmcgJXUiLCBwbGVuLCBsZW5ndGgsCisgICAgICAgIGxpbmUsIG9mZnMsIHBheWxvYWRfbGVuKTsKKworICAgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUICgmcnRwdnJhd2RlcGF5LT52aW5mbykpIHsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1I6CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9VWVZZOgorICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlA6CisgICAgICAgIC8qIHNhbXBsZXMgYXJlIHBhY2tlZCBqdXN0IGxpa2UgZ3N0cmVhbWVyIHBhY2tzIHRoZW0gKi8KKyAgICAgICAgb2ZmcyAvPSB4aW5jOworICAgICAgICBkYXRhcCA9IHAwICsgKGxpbmUgKiB5c3RyaWRlKSArIChvZmZzICogcGdyb3VwKTsKKworICAgICAgICBtZW1jcHkgKGRhdGFwLCBwYXlsb2FkLCBwbGVuKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICAgIHsKKyAgICAgICAgZ2ludCBpOworICAgICAgICBndWludDggKnA7CisKKyAgICAgICAgZGF0YXAgPSBwMCArIChsaW5lICogeXN0cmlkZSkgKyAob2ZmcyAqIDQpOworICAgICAgICBwID0gcGF5bG9hZDsKKworICAgICAgICAvKiBzYW1wbGVzIGFyZSBwYWNrZWQgaW4gb3JkZXIgQ2ItWS1DciBmb3IgYm90aCBpbnRlcmxhY2VkIGFuZAorICAgICAgICAgKiBwcm9ncmVzc2l2ZSBmcmFtZXMgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsZW47IGkgKz0gcGdyb3VwKSB7CisgICAgICAgICAgKmRhdGFwKysgPSAwOworICAgICAgICAgICpkYXRhcCsrID0gcFsxXTsKKyAgICAgICAgICAqZGF0YXArKyA9IHBbMF07CisgICAgICAgICAgKmRhdGFwKysgPSBwWzJdOworICAgICAgICAgIHAgKz0gcGdyb3VwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICB7CisgICAgICAgIGdpbnQgaTsKKyAgICAgICAgZ3VpbnQgdXZvZmY7CisgICAgICAgIGd1aW50OCAqeWQxcCwgKnlkMnAsICp1ZHAsICp2ZHAsICpwOworCisgICAgICAgIHlkMXAgPSB5cCArIChsaW5lICogeXN0cmlkZSkgKyAob2Zmcyk7CisgICAgICAgIHlkMnAgPSB5ZDFwICsgeXN0cmlkZTsKKyAgICAgICAgdXZvZmYgPSAobGluZSAvIHlpbmMgKiB1dnN0cmlkZSkgKyAob2ZmcyAvIHhpbmMpOworCisgICAgICAgIHVkcCA9IHVwICsgdXZvZmY7CisgICAgICAgIHZkcCA9IHZwICsgdXZvZmY7CisgICAgICAgIHAgPSBwYXlsb2FkOworCisgICAgICAgIC8qIGxpbmUgMC8xOiBZMDAtWTAxLVkxMC1ZMTEtQ2IwMC1DcjAwIFkwMi1ZMDMtWTEyLVkxMy1DYjAxLUNyMDEgLi4uICAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGxlbjsgaSArPSBwZ3JvdXApIHsKKyAgICAgICAgICAqeWQxcCsrID0gcFswXTsKKyAgICAgICAgICAqeWQxcCsrID0gcFsxXTsKKyAgICAgICAgICAqeWQycCsrID0gcFsyXTsKKyAgICAgICAgICAqeWQycCsrID0gcFszXTsKKyAgICAgICAgICAqdWRwKysgPSBwWzRdOworICAgICAgICAgICp2ZHArKyA9IHBbNV07CisgICAgICAgICAgcCArPSBwZ3JvdXA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQxQjoKKyAgICAgIHsKKyAgICAgICAgZ2ludCBpOworICAgICAgICBndWludCB1dm9mZjsKKyAgICAgICAgZ3VpbnQ4ICp5ZHAsICp1ZHAsICp2ZHAsICpwOworCisgICAgICAgIHlkcCA9IHlwICsgKGxpbmUgKiB5c3RyaWRlKSArIChvZmZzKTsKKyAgICAgICAgdXZvZmYgPSAobGluZSAvIHlpbmMgKiB1dnN0cmlkZSkgKyAob2ZmcyAvIHhpbmMpOworCisgICAgICAgIHVkcCA9IHVwICsgdXZvZmY7CisgICAgICAgIHZkcCA9IHZwICsgdXZvZmY7CisgICAgICAgIHAgPSBwYXlsb2FkOworCisgICAgICAgIC8qIFNhbXBsZXMgYXJlIHBhY2tlZCBpbiBvcmRlciBDYjAtWTAtWTEtQ3IwLVkyLVkzIGZvciBib3RoIGludGVybGFjZWQKKyAgICAgICAgICogYW5kIHByb2dyZXNzaXZlIHNjYW4gbGluZXMgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsZW47IGkgKz0gcGdyb3VwKSB7CisgICAgICAgICAgKnVkcCsrID0gcFswXTsKKyAgICAgICAgICAqeWRwKysgPSBwWzFdOworICAgICAgICAgICp5ZHArKyA9IHBbMl07CisgICAgICAgICAgKnZkcCsrID0gcFszXTsKKyAgICAgICAgICAqeWRwKysgPSBwWzRdOworICAgICAgICAgICp5ZHArKyA9IHBbNV07CisgICAgICAgICAgcCArPSBwZ3JvdXA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIHVua25vd25fc2FtcGxpbmc7CisgICAgfQorCisgIG5leHQ6CisgICAgaWYgKCFjb250KQorICAgICAgYnJlYWs7CisKKyAgICBwYXlsb2FkICs9IGxlbmd0aDsKKyAgICBwYXlsb2FkX2xlbiAtPSBsZW5ndGg7CisgIH0KKworICBtYXJrZXIgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyIChydHApOworCisgIGlmIChtYXJrZXIpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoZGVwYXlsb2FkLCAibWFya2VyLCBmbHVzaGluZyBmcmFtZSIpOworICAgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJnJ0cHZyYXdkZXBheS0+ZnJhbWUpOworICAgIG91dGJ1ZiA9IHJ0cHZyYXdkZXBheS0+b3V0YnVmOworICAgIHJ0cHZyYXdkZXBheS0+b3V0YnVmID0gTlVMTDsKKyAgICBydHB2cmF3ZGVwYXktPnRpbWVzdGFtcCA9IC0xOworICB9CisgIHJldHVybiBvdXRidWY7CisKKyAgLyogRVJST1JTICovCit1bmtub3duX3NhbXBsaW5nOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlcGF5bG9hZCwgU1RSRUFNLCBGT1JNQVQsCisgICAgICAgIChOVUxMKSwgKCJ1bmltcGxlbWVudGVkIHNhbXBsaW5nIikpOworICAgIHJldHVybiBOVUxMOworICB9CithbGxvY19mYWlsZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGRlcGF5bG9hZCwgImZhaWxlZCB0byBhbGxvYyBvdXRwdXQgYnVmZmVyIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2ludmFsaWRfZnJhbWU6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChkZXBheWxvYWQsICJjb3VsZCBub3QgbWFwIHZpZGVvIGZyYW1lIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK3dyb25nX2xlbmd0aDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVwYXlsb2FkLCAibGVuZ3RoIG5vdCBtdWx0aXBsZSBvZiBwZ3JvdXAiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorc2hvcnRfcGFja2V0OgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZXBheWxvYWQsICJzaG9ydCBwYWNrZXQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfdnJhd19kZXBheV9oYW5kbGVfZXZlbnQgKEdzdFJUUEJhc2VEZXBheWxvYWQgKiBmaWx0ZXIsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJldDsKKyAgR3N0UnRwVlJhd0RlcGF5ICpydHB2cmF3ZGVwYXk7CisKKyAgcnRwdnJhd2RlcGF5ID0gR1NUX1JUUF9WUkFXX0RFUEFZIChmaWx0ZXIpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgICBnc3RfcnRwX3ZyYXdfZGVwYXlfcmVzZXQgKHJ0cHZyYXdkZXBheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPQorICAgICAgR1NUX1JUUF9CQVNFX0RFUEFZTE9BRF9DTEFTUyAocGFyZW50X2NsYXNzKS0+aGFuZGxlX2V2ZW50IChmaWx0ZXIsIGV2ZW50KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfdnJhd19kZXBheV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cFZSYXdEZXBheSAqcnRwdnJhd2RlcGF5OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwdnJhd2RlcGF5ID0gR1NUX1JUUF9WUkFXX0RFUEFZIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBnc3RfcnRwX3ZyYXdfZGVwYXlfcmVzZXQgKHJ0cHZyYXdkZXBheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3J0cF92cmF3X2RlcGF5X3Jlc2V0IChydHB2cmF3ZGVwYXkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHBfdnJhd19kZXBheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHZyYXdkZXBheSIsCisgICAgICBHU1RfUkFOS19TRUNPTkRBUlksIEdTVF9UWVBFX1JUUF9WUkFXX0RFUEFZKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdnJhd2RlcGF5LmggYi9nc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Y2E3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwL2dzdHJ0cHZyYXdkZXBheS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOD4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9WUkFXX0RFUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfVlJBV19ERVBBWV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9tZXRhLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvcG9vbC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYmFzZWRlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1ZSQVdfREVQQVkgXAorICAoZ3N0X3J0cF92cmF3X2RlcGF5X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfVlJBV19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9WUkFXX0RFUEFZLEdzdFJ0cFZSYXdEZXBheSkpCisjZGVmaW5lIEdTVF9SVFBfVlJBV19ERVBBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfVlJBV19ERVBBWSxHc3RSdHBWUmF3RGVwYXlDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfVlJBV19ERVBBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9WUkFXX0RFUEFZKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9WUkFXX0RFUEFZX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9WUkFXX0RFUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFZSYXdEZXBheSBHc3RSdHBWUmF3RGVwYXk7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwVlJhd0RlcGF5Q2xhc3MgR3N0UnRwVlJhd0RlcGF5Q2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwVlJhd0RlcGF5Cit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWQgcGF5bG9hZDsKKworICBHc3RCdWZmZXJQb29sICpwb29sOworICBHc3RWaWRlb0luZm8gdmluZm87CisKKyAgR3N0VmlkZW9GcmFtZSBmcmFtZTsKKyAgR3N0QnVmZmVyICpvdXRidWY7CisgIGd1aW50MzIgdGltZXN0YW1wOworCisgIGdpbnQgcGdyb3VwOworICBnaW50IHhpbmMsIHlpbmM7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cFZSYXdEZXBheUNsYXNzCit7CisgIEdzdFJUUEJhc2VEZXBheWxvYWRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRwX3ZyYXdfZGVwYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX3ZyYXdfZGVwYXlfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfVlJBV19ERVBBWV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHAvZ3N0cnRwdnJhd3BheS5jIGIvZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhNDgyMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvZ3N0cnRwdnJhd3BheS5jCkBAIC0wLDAgKzEsNjU0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDg+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlICJnc3RydHB2cmF3cGF5LmgiCisjaW5jbHVkZSAiZ3N0cnRwdXRpbHMuaCIKKworZW51bQoreworICBQUk9QX0NIVU5LU19QRVJfRlJBTUUgPSAxCit9OworCisjZGVmaW5lIERFRkFVTFRfQ0hVTktTX1BFUl9GUkFNRSAxMAorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHB2cmF3cGF5X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHB2cmF3cGF5X2RlYnVnKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF92cmF3X3BheV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgeyBSR0IsIFJHQkEsIEJHUiwgQkdSQSwgQVlVViwgVVlWWSwgSTQyMCwgWTQxQiwgVVlWUCB9LCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsgMSwgMzI3NjcgXSwgIiAiaGVpZ2h0ID0gKGludCkgWyAxLCAzMjc2NyBdOyAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX3ZyYXdfcGF5X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJ2aWRlb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIDkwMDAwLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZykgXCJSQVdcIiwiCisgICAgICAgICJzYW1wbGluZyA9IChzdHJpbmcpIHsgXCJSR0JcIiwgXCJSR0JBXCIsIFwiQkdSXCIsIFwiQkdSQVwiLCAiCisgICAgICAgICJcIllDYkNyLTQ6NDo0XCIsIFwiWUNiQ3ItNDoyOjJcIiwgXCJZQ2JDci00OjI6MFwiLCAiCisgICAgICAgICJcIllDYkNyLTQ6MToxXCIgfSwiCisgICAgICAgIC8qIHdlIGNhbm5vdCBleHByZXNzIHRoZXNlIGFzIHN0cmluZ3MgCisgICAgICAgICAqICJ3aWR0aCA9IChzdHJpbmcpIFsxIDMyNzY3XSwiCisgICAgICAgICAqICJoZWlnaHQgPSAoc3RyaW5nKSBbMSAzMjc2N10sIgorICAgICAgICAgKi8KKyAgICAgICAgImRlcHRoID0gKHN0cmluZykgeyBcIjhcIiwgXCIxMFwiLCBcIjEyXCIsIFwiMTZcIiB9LCIKKyAgICAgICAgImNvbG9yaW1ldHJ5ID0gKHN0cmluZykgeyBcIkJUNjAxLTVcIiwgXCJCVDcwOS0yXCIsIFwiU01QVEUyNDBNXCIgfSIKKyAgICAgICAgLyogb3B0aW9uYWwgCisgICAgICAgICAqIGludGVybGFjZSA9IAorICAgICAgICAgKiB0b3AtZmllbGQtZmlyc3QgPSAKKyAgICAgICAgICogY2hyb21hLXBvc2l0aW9uID0gKHN0cmluZykgCisgICAgICAgICAqIGdhbW1hID0gKGZsb2F0KQorICAgICAgICAgKi8KKyAgICApCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfdnJhd19wYXlfc2V0Y2FwcyAoR3N0UlRQQmFzZVBheWxvYWQgKiBwYXlsb2FkLAorICAgIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfdnJhd19wYXlfaGFuZGxlX2J1ZmZlciAoR3N0UlRQQmFzZVBheWxvYWQgKgorICAgIHBheWxvYWQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CitzdGF0aWMgdm9pZCBnc3RfcnRwX3ZyYXdfcGF5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfdnJhd19wYXlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitHX0RFRklORV9UWVBFIChHc3RSdHBWUmF3UGF5LCBnc3RfcnRwX3ZyYXdfcGF5LCBHU1RfVFlQRV9SVFBfQkFTRV9QQVlMT0FEKQorCisgICAgIHN0YXRpYyB2b2lkIGdzdF9ydHBfdnJhd19wYXlfY2xhc3NfaW5pdCAoR3N0UnRwVlJhd1BheUNsYXNzICoga2xhc3MpCit7CisgIEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKmdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzID0gKEdzdFJUUEJhc2VQYXlsb2FkQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF92cmF3X3BheV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9ydHBfdnJhd19wYXlfZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0NIVU5LU19QRVJfRlJBTUUsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiY2h1bmtzLXBlci1mcmFtZSIsICJDaHVua3MgcGVyIEZyYW1lIiwKKyAgICAgICAgICAiU3BsaXQgYW5kIHNlbmQgb3V0IGVhY2ggZnJhbWUgaW4gbXVsdGlwbGUgY2h1bmtzIHRvIHJlZHVjZSBvdmVyaGVhZCIsCisgICAgICAgICAgMSwgR19NQVhJTlQsIERFRkFVTFRfQ0hVTktTX1BFUl9GUkFNRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpCisgICAgICApOworCisgIGdzdHJ0cGJhc2VwYXlsb2FkX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9ydHBfdnJhd19wYXlfc2V0Y2FwczsKKyAgZ3N0cnRwYmFzZXBheWxvYWRfY2xhc3MtPmhhbmRsZV9idWZmZXIgPSBnc3RfcnRwX3ZyYXdfcGF5X2hhbmRsZV9idWZmZXI7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF92cmF3X3BheV9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX3ZyYXdfcGF5X3NpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIFJhdyBWaWRlbyBwYXlsb2FkZXIiLCAiQ29kZWMvUGF5bG9hZGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJQYXlsb2FkIHJhdyB2aWRlbyBhcyBSVFAgcGFja2V0cyAoUkZDIDQxNzUpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHB2cmF3cGF5X2RlYnVnLCAicnRwdnJhd3BheSIsIDAsCisgICAgICAiUmF3IHZpZGVvIFJUUCBQYXlsb2FkZXIiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfdnJhd19wYXlfaW5pdCAoR3N0UnRwVlJhd1BheSAqIHJ0cHZyYXdwYXkpCit7CisgIHJ0cHZyYXdwYXktPmNodW5rc19wZXJfZnJhbWUgPSBERUZBVUxUX0NIVU5LU19QRVJfRlJBTUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF92cmF3X3BheV9zZXRjYXBzIChHc3RSVFBCYXNlUGF5bG9hZCAqIHBheWxvYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSdHBWUmF3UGF5ICpydHB2cmF3cGF5OworICBnYm9vbGVhbiByZXM7CisgIGdpbnQgcGdyb3VwLCB4aW5jLCB5aW5jOworICBjb25zdCBnY2hhciAqZGVwdGhzdHIsICpzYW1wbGluZ3N0ciwgKmNvbG9yaW1ldHJ5c3RyOworICBnY2hhciAqd3N0ciwgKmhzdHI7CisgIEdzdFZpZGVvSW5mbyBpbmZvOworCisgIHJ0cHZyYXdwYXkgPSBHU1RfUlRQX1ZSQVdfUEFZIChwYXlsb2FkKTsKKworICBpZiAoIWdzdF92aWRlb19pbmZvX2Zyb21fY2FwcyAoJmluZm8sIGNhcHMpKQorICAgIGdvdG8gaW52YWxpZF9jYXBzOworCisgIHJ0cHZyYXdwYXktPnZpbmZvID0gaW5mbzsKKworICBpZiAoZ3N0X3ZpZGVvX2NvbG9yaW1ldHJ5X21hdGNoZXMgKCZpbmZvLmNvbG9yaW1ldHJ5LAorICAgICAgICAgIEdTVF9WSURFT19DT0xPUklNRVRSWV9CVDYwMSkpIHsKKyAgICBjb2xvcmltZXRyeXN0ciA9ICJCVDYwMS01IjsKKyAgfSBlbHNlIGlmIChnc3RfdmlkZW9fY29sb3JpbWV0cnlfbWF0Y2hlcyAoJmluZm8uY29sb3JpbWV0cnksCisgICAgICAgICAgR1NUX1ZJREVPX0NPTE9SSU1FVFJZX0JUNzA5KSkgeworICAgIGNvbG9yaW1ldHJ5c3RyID0gIkJUNzA5LTIiOworICB9IGVsc2UgaWYgKGdzdF92aWRlb19jb2xvcmltZXRyeV9tYXRjaGVzICgmaW5mby5jb2xvcmltZXRyeSwKKyAgICAgICAgICBHU1RfVklERU9fQ09MT1JJTUVUUllfU01QVEUyNDBNKSkgeworICAgIGNvbG9yaW1ldHJ5c3RyID0gIlNNUFRFMjQwTSI7CisgIH0gZWxzZSB7CisgICAgY29sb3JpbWV0cnlzdHIgPSAiU01QVEUyNDBNIjsKKyAgfQorCisgIHhpbmMgPSB5aW5jID0gMTsKKworICAvKiB0aGVzZSB2YWx1ZXMgYXJlIHRoZSBvbmx5IHRoaW5nIHdlIGNhbiBkbyAqLworICBkZXB0aHN0ciA9ICI4IjsKKworICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJmluZm8pKSB7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQkE6CisgICAgICBzYW1wbGluZ3N0ciA9ICJSR0JBIjsKKyAgICAgIHBncm91cCA9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgIHNhbXBsaW5nc3RyID0gIkJHUkEiOworICAgICAgcGdyb3VwID0gNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgICBzYW1wbGluZ3N0ciA9ICJSR0IiOworICAgICAgcGdyb3VwID0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1I6CisgICAgICBzYW1wbGluZ3N0ciA9ICJCR1IiOworICAgICAgcGdyb3VwID0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgc2FtcGxpbmdzdHIgPSAiWUNiQ3ItNDo0OjQiOworICAgICAgcGdyb3VwID0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9VWVZZOgorICAgICAgc2FtcGxpbmdzdHIgPSAiWUNiQ3ItNDoyOjIiOworICAgICAgcGdyb3VwID0gNDsKKyAgICAgIHhpbmMgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MUI6CisgICAgICBzYW1wbGluZ3N0ciA9ICJZQ2JDci00OjE6MSI7CisgICAgICBwZ3JvdXAgPSA2OworICAgICAgeGluYyA9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfSTQyMDoKKyAgICAgIHNhbXBsaW5nc3RyID0gIllDYkNyLTQ6MjowIjsKKyAgICAgIHBncm91cCA9IDY7CisgICAgICB4aW5jID0geWluYyA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfVVlWUDoKKyAgICAgIHNhbXBsaW5nc3RyID0gIllDYkNyLTQ6MjoyIjsKKyAgICAgIHBncm91cCA9IDU7CisgICAgICB4aW5jID0gMjsKKyAgICAgIGRlcHRoc3RyID0gIjEwIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIHVua25vd25fZm9ybWF0OworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoR1NUX1ZJREVPX0lORk9fSVNfSU5URVJMQUNFRCAoJmluZm8pKSB7CisgICAgeWluYyAqPSAyOworICB9CisKKyAgcnRwdnJhd3BheS0+cGdyb3VwID0gcGdyb3VwOworICBydHB2cmF3cGF5LT54aW5jID0geGluYzsKKyAgcnRwdnJhd3BheS0+eWluYyA9IHlpbmM7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGF5bG9hZCwgIndpZHRoICVkLCBoZWlnaHQgJWQsIHNhbXBsaW5nICVzIiwKKyAgICAgIEdTVF9WSURFT19JTkZPX1dJRFRIICgmaW5mbyksIEdTVF9WSURFT19JTkZPX0hFSUdIVCAoJmluZm8pLCBzYW1wbGluZ3N0cik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBheWxvYWQsICJ4aW5jICVkLCB5aW5jICVkLCBwZ3JvdXAgJWQiLCB4aW5jLCB5aW5jLCBwZ3JvdXApOworCisgIHdzdHIgPSBnX3N0cmR1cF9wcmludGYgKCIlZCIsIEdTVF9WSURFT19JTkZPX1dJRFRIICgmaW5mbykpOworICBoc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiJWQiLCBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZpbmZvKSk7CisKKyAgZ3N0X3J0cF9iYXNlX3BheWxvYWRfc2V0X29wdGlvbnMgKHBheWxvYWQsICJ2aWRlbyIsIFRSVUUsICJSQVciLCA5MDAwMCk7CisgIGlmIChHU1RfVklERU9fSU5GT19JU19JTlRFUkxBQ0VEICgmaW5mbykpIHsKKyAgICByZXMgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9zZXRfb3V0Y2FwcyAocGF5bG9hZCwgInNhbXBsaW5nIiwgR19UWVBFX1NUUklORywKKyAgICAgICAgc2FtcGxpbmdzdHIsICJkZXB0aCIsIEdfVFlQRV9TVFJJTkcsIGRlcHRoc3RyLCAid2lkdGgiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICB3c3RyLCAiaGVpZ2h0IiwgR19UWVBFX1NUUklORywgaHN0ciwgImNvbG9yaW1ldHJ5IiwgR19UWVBFX1NUUklORywKKyAgICAgICAgY29sb3JpbWV0cnlzdHIsICJpbnRlcmxhY2UiLCBHX1RZUEVfU1RSSU5HLCAidHJ1ZSIsIE5VTEwpOworICB9IGVsc2UgeworICAgIHJlcyA9IGdzdF9ydHBfYmFzZV9wYXlsb2FkX3NldF9vdXRjYXBzIChwYXlsb2FkLCAic2FtcGxpbmciLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICBzYW1wbGluZ3N0ciwgImRlcHRoIiwgR19UWVBFX1NUUklORywgZGVwdGhzdHIsICJ3aWR0aCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgIHdzdHIsICJoZWlnaHQiLCBHX1RZUEVfU1RSSU5HLCBoc3RyLCAiY29sb3JpbWV0cnkiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICBjb2xvcmltZXRyeXN0ciwgTlVMTCk7CisgIH0KKyAgZ19mcmVlICh3c3RyKTsKKyAgZ19mcmVlIChoc3RyKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworaW52YWxpZF9jYXBzOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocGF5bG9hZCwgImNvdWxkIG5vdCBwYXJzZSBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit1bmtub3duX2Zvcm1hdDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBheWxvYWQsICJ1bmtub3duIGNhcHMgZm9ybWF0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3ZyYXdfcGF5X2hhbmRsZV9idWZmZXIgKEdzdFJUUEJhc2VQYXlsb2FkICogcGF5bG9hZCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBWUmF3UGF5ICpydHB2cmF3cGF5OworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBnZmxvYXQgcGFja2V0c19wZXJfcGFja2xpbmU7CisgIGd1aW50IHBncm91cHNfcGVyX3BhY2tldDsKKyAgZ3VpbnQgcGFja2xpbmVzX3Blcl9saXN0LCBidWZmZXJzX3Blcl9saXN0OworICBndWludCBsaW5lc19kZWxheTsgICAgICAgICAgICAvKiBhZnRlciBob3cgbWFueSBwYWNrZWQgbGluZXMgd2UgcHVzaCBvdXQgYSBidWZmZXIgbGlzdCAqLworICBndWludCBsYXN0X2xpbmU7ICAgICAgICAgICAgICAvKiBsYXN0IHBhY2sgbGluZSBudW1iZXIgd2UgcHVzaGVkIG91dCBhIGJ1ZmZlciBsaXN0ICAgICAqLworICBndWludCBsaW5lLCBvZmZzZXQ7CisgIGd1aW50OCAqcDAsICp5cCwgKnVwLCAqdnA7CisgIGd1aW50IHlzdHJpZGUsIHV2c3RyaWRlOworICBndWludCB4aW5jLCB5aW5jOworICBndWludCBwZ3JvdXA7CisgIGd1aW50IG10dTsKKyAgZ3VpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBmaWVsZCwgZmllbGRzOworICBHc3RWaWRlb0Zvcm1hdCBmb3JtYXQ7CisgIEdzdFZpZGVvRnJhbWUgZnJhbWU7CisgIGdpbnQgaW50ZXJsYWNlZDsKKyAgZ2Jvb2xlYW4gdXNlX2J1ZmZlcl9saXN0czsKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdCA9IE5VTEw7CisgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwsIH07CisKKyAgcnRwdnJhd3BheSA9IEdTVF9SVFBfVlJBV19QQVkgKHBheWxvYWQpOworCisgIGlmICghZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJmZyYW1lLCAmcnRwdnJhd3BheS0+dmluZm8sIGJ1ZmZlciwgR1NUX01BUF9SRUFEKSkgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHJ0cHZyYXdwYXksICJuZXcgZnJhbWUgb2YgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyIsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpKTsKKworICAvKiBnZXQgcG9pbnRlciBhbmQgc3RyaWRlcyBvZiB0aGUgcGxhbmVzICovCisgIHAwID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKCZmcmFtZSwgMCk7CisgIHlwID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoJmZyYW1lLCAwKTsKKyAgdXAgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBICgmZnJhbWUsIDEpOworICB2cCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKCZmcmFtZSwgMik7CisKKyAgeXN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoJmZyYW1lLCAwKTsKKyAgdXZzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKCZmcmFtZSwgMSk7CisKKyAgbXR1ID0gR1NUX1JUUF9CQVNFX1BBWUxPQURfTVRVIChwYXlsb2FkKTsKKworICAvKiBhbW91bnQgb2YgYnl0ZXMgZm9yIG9uZSBwaXhlbCAqLworICBwZ3JvdXAgPSBydHB2cmF3cGF5LT5wZ3JvdXA7CisgIHdpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKCZydHB2cmF3cGF5LT52aW5mbyk7CisgIGhlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoJnJ0cHZyYXdwYXktPnZpbmZvKTsKKworICBpbnRlcmxhY2VkID0gR1NUX1ZJREVPX0lORk9fSVNfSU5URVJMQUNFRCAoJnJ0cHZyYXdwYXktPnZpbmZvKTsKKworICBmb3JtYXQgPSBHU1RfVklERU9fSU5GT19GT1JNQVQgKCZydHB2cmF3cGF5LT52aW5mbyk7CisKKyAgeWluYyA9IHJ0cHZyYXdwYXktPnlpbmM7CisgIHhpbmMgPSBydHB2cmF3cGF5LT54aW5jOworCisgIC8qIGFmdGVyIGhvdyBtYW55IHBhY2tlZCBsaW5lcyB3ZSBwdXNoIG91dCBhIGJ1ZmZlciBsaXN0ICovCisgIGxpbmVzX2RlbGF5ID0gR1NUX1JPVU5EX1VQXzQgKGhlaWdodCAvIHJ0cHZyYXdwYXktPmNodW5rc19wZXJfZnJhbWUpOworCisgIC8qIGNhbGN1bGF0ZSBob3cgbWFueSBidWZmZXJzIHdlIGV4cGVjdCB0byBzdG9yZSBpbiBhIHNpbmdsZSBidWZmZXIgbGlzdCAqLworICBwZ3JvdXBzX3Blcl9wYWNrZXQgPSAobXR1IC0gKDEyICsgMTQpKSAvIHBncm91cDsKKyAgcGFja2V0c19wZXJfcGFja2xpbmUgPSB3aWR0aCAvICh4aW5jICogcGdyb3Vwc19wZXJfcGFja2V0ICogMS4wKTsKKyAgcGFja2xpbmVzX3Blcl9saXN0ID0gaGVpZ2h0IC8gKHlpbmMgKiBydHB2cmF3cGF5LT5jaHVua3NfcGVyX2ZyYW1lKTsKKyAgYnVmZmVyc19wZXJfbGlzdCA9IHBhY2tsaW5lc19wZXJfbGlzdCAqIHBhY2tldHNfcGVyX3BhY2tsaW5lOworICBidWZmZXJzX3Blcl9saXN0ID0gR1NUX1JPVU5EX1VQXzggKGJ1ZmZlcnNfcGVyX2xpc3QpOworCisgIHVzZV9idWZmZXJfbGlzdHMgPSAocnRwdnJhd3BheS0+Y2h1bmtzX3Blcl9mcmFtZSA8IChoZWlnaHQgLyB5aW5jKSk7CisKKyAgZmllbGRzID0gMSArIGludGVybGFjZWQ7CisKKyAgLyogc3RhcnQgd2l0aCBsaW5lIDAsIG9mZnNldCAwICovCisgIGZvciAoZmllbGQgPSAwOyBmaWVsZCA8IGZpZWxkczsgZmllbGQrKykgeworICAgIGxpbmUgPSBmaWVsZDsKKyAgICBvZmZzZXQgPSAwOworICAgIGxhc3RfbGluZSA9IDA7CisKKyAgICBpZiAodXNlX2J1ZmZlcl9saXN0cykKKyAgICAgIGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3X3NpemVkIChidWZmZXJzX3Blcl9saXN0KTsKKworICAgIC8qIHdyaXRlIGFsbCBsaW5lcyAqLworICAgIHdoaWxlIChsaW5lIDwgaGVpZ2h0KSB7CisgICAgICBndWludCBsZWZ0LCBwYWNrX2xpbmU7CisgICAgICBHc3RCdWZmZXIgKm91dDsKKyAgICAgIGd1aW50OCAqb3V0ZGF0YSwgKmhlYWRlcnM7CisgICAgICBnYm9vbGVhbiBuZXh0X2xpbmUsIGNvbXBsZXRlID0gRkFMU0U7CisgICAgICBndWludCBsZW5ndGgsIGNvbnQsIHBpeGVsczsKKworICAgICAgLyogZ2V0IHRoZSBtYXggYWxsb3dlZCBwYXlsb2FkIGxlbmd0aCBzaXplLCB3ZSB0cnkgdG8gZmlsbCB0aGUgY29tcGxldGUgTVRVICovCisgICAgICBsZWZ0ID0gZ3N0X3J0cF9idWZmZXJfY2FsY19wYXlsb2FkX2xlbiAobXR1LCAwLCAwKTsKKyAgICAgIG91dCA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAobGVmdCwgMCwgMCk7CisKKyAgICAgIGlmIChmaWVsZCA9PSAwKSB7CisgICAgICAgIEdTVF9CVUZGRVJfUFRTIChvdXQpID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfQlVGRkVSX1BUUyAob3V0KSA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpICsKKyAgICAgICAgICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcikgLyAyOworICAgICAgfQorCisgICAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKG91dCwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisgICAgICBvdXRkYXRhID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApOworCisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwdnJhd3BheSwgImNyZWF0ZWQgYnVmZmVyIG9mIHNpemUgJXUgZm9yIE1UVSAldSIsIGxlZnQsCisgICAgICAgICAgbXR1KTsKKworICAgICAgLyoKKyAgICAgICAqICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAgICogICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICogIHwgICBFeHRlbmRlZCBTZXF1ZW5jZSBOdW1iZXIgICAgfCAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICB8CisgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAqICB8RnwgICAgICAgICAgTGluZSBObyAgICAgICAgICAgIHxDfCAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgfAorICAgICAgICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgKiAgfCAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICB8RnwgICAgICAgICAgTGluZSBObyAgICAgICAgICAgIHwKKyAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICogIHxDfCAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCisgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAgICAgICAqICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICAgICAgICogIC4gICAgICAgICAgICAgICAgIFR3byAocGFydGlhbCkgbGluZXMgb2YgdmlkZW8gZGF0YSAgICAgICAgICAgICAuCisgICAgICAgKiAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAgICAgICAqICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICovCisKKyAgICAgIC8qIG5lZWQgMiBieXRlcyBmb3IgdGhlIGV4dGVuZGVkIHNlcXVlbmNlIG51bWJlciAqLworICAgICAgKm91dGRhdGErKyA9IDA7CisgICAgICAqb3V0ZGF0YSsrID0gMDsKKyAgICAgIGxlZnQgLT0gMjsKKworICAgICAgLyogdGhlIGhlYWRlcnMgc3RhcnQgaGVyZSAqLworICAgICAgaGVhZGVycyA9IG91dGRhdGE7CisKKyAgICAgIC8qIG1ha2Ugc3VyZSB3ZSBjYW4gZml0IGF0IGxlYXN0ICpvbmUqIGhlYWRlciBhbmQgcGl4ZWwgKi8KKyAgICAgIGlmICghKGxlZnQgPiAoNiArIHBncm91cCkpKSB7CisgICAgICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0KTsKKyAgICAgICAgZ290byB0b29fc21hbGw7CisgICAgICB9CisKKyAgICAgIC8qIHdoaWxlIHdlIGNhbiBmaXQgYXQgbGVhc3Qgb25lIGhlYWRlciBhbmQgb25lIHBpeGVsICovCisgICAgICB3aGlsZSAobGVmdCA+ICg2ICsgcGdyb3VwKSkgeworICAgICAgICAvKiB3ZSBuZWVkIGEgNiBieXRlcyBoZWFkZXIgKi8KKyAgICAgICAgbGVmdCAtPSA2OworCisgICAgICAgIC8qIGdldCBob3cgbWF5IGJ5dGVzIHdlIG5lZWQgZm9yIHRoZSByZW1haW5pbmcgcGl4ZWxzICovCisgICAgICAgIHBpeGVscyA9IHdpZHRoIC0gb2Zmc2V0OworICAgICAgICBsZW5ndGggPSAocGl4ZWxzICogcGdyb3VwKSAvIHhpbmM7CisKKyAgICAgICAgaWYgKGxlZnQgPj0gbGVuZ3RoKSB7CisgICAgICAgICAgLyogcGl4ZWxzIGFuZCBoZWFkZXIgZml0IGNvbXBsZXRlbHksIHdlIHdpbGwgd3JpdGUgdGhlbSBhbmQgc2tpcCB0byB0aGUKKyAgICAgICAgICAgKiBuZXh0IGxpbmUuICovCisgICAgICAgICAgbmV4dF9saW5lID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBsaW5lIGRvZXMgbm90IGZpdCBjb21wbGV0ZWx5LCBzZWUgaG93IG1hbnkgcGl4ZWxzIGZpdCAqLworICAgICAgICAgIHBpeGVscyA9IChsZWZ0IC8gcGdyb3VwKSAqIHhpbmM7CisgICAgICAgICAgbGVuZ3RoID0gKHBpeGVscyAqIHBncm91cCkgLyB4aW5jOworICAgICAgICAgIG5leHRfbGluZSA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChydHB2cmF3cGF5LCAiZmlsbGluZyAldSBieXRlcyBpbiAldSBwaXhlbHMiLCBsZW5ndGgsCisgICAgICAgICAgICBwaXhlbHMpOworICAgICAgICBsZWZ0IC09IGxlbmd0aDsKKworICAgICAgICAvKiB3cml0ZSBsZW5ndGggKi8KKyAgICAgICAgKm91dGRhdGErKyA9IChsZW5ndGggPj4gOCkgJiAweGZmOworICAgICAgICAqb3V0ZGF0YSsrID0gbGVuZ3RoICYgMHhmZjsKKworICAgICAgICAvKiB3cml0ZSBsaW5lIG5vICovCisgICAgICAgICpvdXRkYXRhKysgPSAoKGxpbmUgPj4gOCkgJiAweDdmKSB8ICgoZmllbGQgPDwgNykgJiAweDgwKTsKKyAgICAgICAgKm91dGRhdGErKyA9IGxpbmUgJiAweGZmOworCisgICAgICAgIGlmIChuZXh0X2xpbmUpIHsKKyAgICAgICAgICAvKiBnbyB0byBuZXh0IGxpbmUgd2UgZG8gdGhpcyBoZXJlIHRvIG1ha2UgdGhlIGNoZWNrIGJlbG93IGVhc2llciAqLworICAgICAgICAgIGxpbmUgKz0geWluYzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNhbGN1bGF0ZSBjb250aW51YXRpb24gbWFya2VyICovCisgICAgICAgIGNvbnQgPSAobGVmdCA+ICg2ICsgcGdyb3VwKSAmJiBsaW5lIDwgaGVpZ2h0KSA/IDB4ODAgOiAweDAwOworCisgICAgICAgIC8qIHdyaXRlIG9mZnNldCBhbmQgY29udGludWF0aW9uIG1hcmtlciAqLworICAgICAgICAqb3V0ZGF0YSsrID0gKChvZmZzZXQgPj4gOCkgJiAweDdmKSB8IGNvbnQ7CisgICAgICAgICpvdXRkYXRhKysgPSBvZmZzZXQgJiAweGZmOworCisgICAgICAgIGlmIChuZXh0X2xpbmUpIHsKKyAgICAgICAgICAvKiByZXNldCBvZmZzZXQgKi8KKyAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChydHB2cmF3cGF5LCAiZ28gdG8gbmV4dCBsaW5lICV1IiwgbGluZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb2Zmc2V0ICs9IHBpeGVsczsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwdnJhd3BheSwgIm5leHQgb2Zmc2V0ICV1Iiwgb2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY29udCkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHB2cmF3cGF5LCAiY29uc3VtZWQgJXUgYnl0ZXMiLAorICAgICAgICAgIChndWludCkgKG91dGRhdGEgLSBoZWFkZXJzKSk7CisKKyAgICAgIC8qIHNlY29uZCBwYXNzLCByZWFkIGhlYWRlcnMgYW5kIHdyaXRlIHRoZSBkYXRhICovCisgICAgICB3aGlsZSAoVFJVRSkgeworICAgICAgICBndWludCBvZmZzLCBsaW47CisKKyAgICAgICAgLyogcmVhZCBsZW5ndGggYW5kIGNvbnQgKi8KKyAgICAgICAgbGVuZ3RoID0gKGhlYWRlcnNbMF0gPDwgOCkgfCBoZWFkZXJzWzFdOworICAgICAgICBsaW4gPSAoKGhlYWRlcnNbMl0gJiAweDdmKSA8PCA4KSB8IGhlYWRlcnNbM107CisgICAgICAgIG9mZnMgPSAoKGhlYWRlcnNbNF0gJiAweDdmKSA8PCA4KSB8IGhlYWRlcnNbNV07CisgICAgICAgIGNvbnQgPSBoZWFkZXJzWzRdICYgMHg4MDsKKyAgICAgICAgcGl4ZWxzID0gbGVuZ3RoIC8gcGdyb3VwOworICAgICAgICBoZWFkZXJzICs9IDY7CisKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBheWxvYWQsCisgICAgICAgICAgICAid3JpdGluZyBsZW5ndGggJXUsIGxpbmUgJXUsIG9mZnNldCAldSwgY29udCAlZCIsIGxlbmd0aCwgbGluLCBvZmZzLAorICAgICAgICAgICAgY29udCk7CisKKyAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCOgorICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1I6CisgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlA6CisgICAgICAgICAgICBvZmZzIC89IHhpbmM7CisgICAgICAgICAgICBtZW1jcHkgKG91dGRhdGEsIHAwICsgKGxpbiAqIHlzdHJpZGUpICsgKG9mZnMgKiBwZ3JvdXApLCBsZW5ndGgpOworICAgICAgICAgICAgb3V0ZGF0YSArPSBsZW5ndGg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICAgICAgICB7CisgICAgICAgICAgICBnaW50IGk7CisgICAgICAgICAgICBndWludDggKmRhdGFwOworCisgICAgICAgICAgICBkYXRhcCA9IHAwICsgKGxpbiAqIHlzdHJpZGUpICsgKG9mZnMgKiA0KTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSBkYXRhcFsyXTsKKyAgICAgICAgICAgICAgKm91dGRhdGErKyA9IGRhdGFwWzFdOworICAgICAgICAgICAgICAqb3V0ZGF0YSsrID0gZGF0YXBbM107CisgICAgICAgICAgICAgIGRhdGFwICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICAgICAgeworICAgICAgICAgICAgZ2ludCBpOworICAgICAgICAgICAgZ3VpbnQgdXZvZmY7CisgICAgICAgICAgICBndWludDggKnlkMXAsICp5ZDJwLCAqdWRwLCAqdmRwOworCisgICAgICAgICAgICB5ZDFwID0geXAgKyAobGluICogeXN0cmlkZSkgKyAob2Zmcyk7CisgICAgICAgICAgICB5ZDJwID0geWQxcCArIHlzdHJpZGU7CisgICAgICAgICAgICB1dm9mZiA9IChsaW4gLyB5aW5jICogdXZzdHJpZGUpICsgKG9mZnMgLyB4aW5jKTsKKyAgICAgICAgICAgIHVkcCA9IHVwICsgdXZvZmY7CisgICAgICAgICAgICB2ZHAgPSB2cCArIHV2b2ZmOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGl4ZWxzOyBpKyspIHsKKyAgICAgICAgICAgICAgKm91dGRhdGErKyA9ICp5ZDFwKys7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSAqeWQxcCsrOworICAgICAgICAgICAgICAqb3V0ZGF0YSsrID0gKnlkMnArKzsKKyAgICAgICAgICAgICAgKm91dGRhdGErKyA9ICp5ZDJwKys7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSAqdWRwKys7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSAqdmRwKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MUI6CisgICAgICAgICAgeworICAgICAgICAgICAgZ2ludCBpOworICAgICAgICAgICAgZ3VpbnQgdXZvZmY7CisgICAgICAgICAgICBndWludDggKnlkcCwgKnVkcCwgKnZkcDsKKworICAgICAgICAgICAgeWRwID0geXAgKyAobGluICogeXN0cmlkZSkgKyBvZmZzOworICAgICAgICAgICAgdXZvZmYgPSAobGluIC8geWluYyAqIHV2c3RyaWRlKSArIChvZmZzIC8geGluYyk7CisgICAgICAgICAgICB1ZHAgPSB1cCArIHV2b2ZmOworICAgICAgICAgICAgdmRwID0gdnAgKyB1dm9mZjsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSAqdWRwKys7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSAqeWRwKys7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSAqeWRwKys7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSAqdmRwKys7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSAqeWRwKys7CisgICAgICAgICAgICAgICpvdXRkYXRhKysgPSAqeWRwKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dCk7CisgICAgICAgICAgICBnb3RvIHVua25vd25fc2FtcGxpbmc7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWNvbnQpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChsaW5lID49IGhlaWdodCkgeworICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwdnJhd3BheSwgImZpZWxkL2ZyYW1lIGNvbXBsZXRlLCBzZXQgbWFya2VyIik7CisgICAgICAgIGdzdF9ydHBfYnVmZmVyX3NldF9tYXJrZXIgKCZydHAsIFRSVUUpOworICAgICAgICBjb21wbGV0ZSA9IFRSVUU7CisgICAgICB9CisgICAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisgICAgICBpZiAobGVmdCA+IDApIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cHZyYXdwYXksICJ3ZSBoYXZlICV1IGJ5dGVzIGxlZnQiLCBsZWZ0KTsKKyAgICAgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKG91dCwgMCwgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0KSAtIGxlZnQpOworICAgICAgfQorCisgICAgICBnc3RfcnRwX2NvcHlfdmlkZW9fbWV0YSAocnRwdnJhd3BheSwgb3V0LCBidWZmZXIpOworCisgICAgICAvKiBOb3cgZWl0aGVyIHB1c2ggb3V0IHRoZSBidWZmZXIgZGlyZWN0bHkgKi8KKyAgICAgIGlmICghdXNlX2J1ZmZlcl9saXN0cykgeworICAgICAgICByZXQgPSBnc3RfcnRwX2Jhc2VfcGF5bG9hZF9wdXNoIChwYXlsb2FkLCBvdXQpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLyogb3IgYWRkIHRoZSBidWZmZXIgdG8gYnVmZmVyIGxpc3QgLi4uICovCisgICAgICBnc3RfYnVmZmVyX2xpc3RfYWRkIChsaXN0LCBvdXQpOworCisgICAgICAvKiAuLiBhbmQgY2hlY2sgaWYgd2UgbmVlZCB0byBwdXNoIG91dCB0aGUgbGlzdCAqLworICAgICAgcGFja19saW5lID0gKGxpbmUgLSBmaWVsZCkgLyBmaWVsZHM7CisgICAgICBpZiAoY29tcGxldGUgfHwgKHBhY2tfbGluZSA+IGxhc3RfbGluZSAmJiBwYWNrX2xpbmUgJSBsaW5lc19kZWxheSA9PSAwKSkgeworICAgICAgICBHU1RfTE9HX09CSkVDVCAocnRwdnJhd3BheSwgInB1c2hpbmcgbGlzdCBvZiAldSBidWZmZXJzIHVwIHRvIHBhY2sgIgorICAgICAgICAgICAgImxpbmUgJXUiLCBnc3RfYnVmZmVyX2xpc3RfbGVuZ3RoIChsaXN0KSwgcGFja19saW5lKTsKKyAgICAgICAgcmV0ID0gZ3N0X3J0cF9iYXNlX3BheWxvYWRfcHVzaF9saXN0IChwYXlsb2FkLCBsaXN0KTsKKyAgICAgICAgbGlzdCA9IE5VTEw7CisgICAgICAgIGlmICghY29tcGxldGUpCisgICAgICAgICAgbGlzdCA9IGdzdF9idWZmZXJfbGlzdF9uZXdfc2l6ZWQgKGJ1ZmZlcnNfcGVyX2xpc3QpOworICAgICAgICBsYXN0X2xpbmUgPSBwYWNrX2xpbmU7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZmcmFtZSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK3Vua25vd25fc2FtcGxpbmc6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocGF5bG9hZCwgU1RSRUFNLCBGT1JNQVQsCisgICAgICAgIChOVUxMKSwgKCJ1bmltcGxlbWVudGVkIHNhbXBsaW5nIikpOworICAgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJmZyYW1lKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19OT1RfU1VQUE9SVEVEOworICB9Cit0b29fc21hbGw6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocGF5bG9hZCwgUkVTT1VSQ0UsIE5PX1NQQUNFX0xFRlQsCisgICAgICAgIChOVUxMKSwgKCJub3QgZW5vdWdoIHNwYWNlIHRvIHNlbmQgYXQgbGVhc3Qgb25lIHBpeGVsIikpOworICAgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJmZyYW1lKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19OT1RfU1VQUE9SVEVEOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3ZyYXdfcGF5X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBWUmF3UGF5ICpydHB2cmF3cGF5OworCisgIHJ0cHZyYXdwYXkgPSBHU1RfUlRQX1ZSQVdfUEFZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DSFVOS1NfUEVSX0ZSQU1FOgorICAgICAgcnRwdnJhd3BheS0+Y2h1bmtzX3Blcl9mcmFtZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF92cmF3X3BheV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwVlJhd1BheSAqcnRwdnJhd3BheTsKKworICBydHB2cmF3cGF5ID0gR1NUX1JUUF9WUkFXX1BBWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ0hVTktTX1BFUl9GUkFNRToKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHJ0cHZyYXdwYXktPmNodW5rc19wZXJfZnJhbWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3J0cF92cmF3X3BheV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHZyYXdwYXkiLAorICAgICAgR1NUX1JBTktfU0VDT05EQVJZLCBHU1RfVFlQRV9SVFBfVlJBV19QQVkpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmggYi9nc3QvcnRwL2dzdHJ0cHZyYXdwYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmQyNDQyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cC9nc3RydHB2cmF3cGF5LmgKQEAgLTAsMCArMSw2NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA4PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1ZSQVdfUEFZX0hfXworI2RlZmluZSBfX0dTVF9SVFBfVlJBV19QQVlfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBiYXNlcGF5bG9hZC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1ZSQVdfUEFZIFwKKyAgKGdzdF9ydHBfdnJhd19wYXlfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9WUkFXX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9WUkFXX1BBWSxHc3RSdHBWUmF3UGF5KSkKKyNkZWZpbmUgR1NUX1JUUF9WUkFXX1BBWV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfVlJBV19QQVksR3N0UnRwVlJhd1BheUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9WUkFXX1BBWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9WUkFXX1BBWSkpCisjZGVmaW5lIEdTVF9JU19SVFBfVlJBV19QQVlfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX1ZSQVdfUEFZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFZSYXdQYXkgR3N0UnRwVlJhd1BheTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBWUmF3UGF5Q2xhc3MgR3N0UnRwVlJhd1BheUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cFZSYXdQYXkKK3sKKyAgR3N0UlRQQmFzZVBheWxvYWQgcGF5bG9hZDsKKworICBHc3RWaWRlb0luZm8gdmluZm87CisKKyAgZ2ludCBwZ3JvdXA7CisgIGdpbnQgeGluYywgeWluYzsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIGd1aW50IGNodW5rc19wZXJfZnJhbWU7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cFZSYXdQYXlDbGFzcworeworICBHc3RSVFBCYXNlUGF5bG9hZENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9ydHBfdnJhd19wYXlfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfcnRwX3ZyYXdfcGF5X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX1ZSQVdfUEFZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cC9tZXNvbi5idWlsZCBiL2dzdC9ydHAvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYyNDE1MgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHAvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxMTEgQEAKK3J0cF9zb3VyY2VzID0gWworICAnZGJvb2xodWZmLmMnLAorICAnZm52MWhhc2guYycsCisgICdnc3RydHAuYycsCisgICdnc3RydHBjaGFubmVscy5jJywKKyAgJ2dzdHJ0cGFjM2RlcGF5LmMnLAorICAnZ3N0cnRwYWMzcGF5LmMnLAorICAnZ3N0cnRwYnZkZXBheS5jJywKKyAgJ2dzdHJ0cGJ2cGF5LmMnLAorICAnZ3N0cnRwY2VsdGRlcGF5LmMnLAorICAnZ3N0cnRwY2VsdHBheS5jJywKKyAgJ2dzdHJ0cGR2ZGVwYXkuYycsCisgICdnc3RydHBkdnBheS5jJywKKyAgJ2dzdHJ0cGdzdGRlcGF5LmMnLAorICAnZ3N0cnRwZ3N0cGF5LmMnLAorICAnZ3N0cnRwaWxiY2RlcGF5LmMnLAorICAnZ3N0cnRwaWxiY3BheS5jJywKKyAgJ2dzdHJ0cGtsdmRlcGF5LmMnLAorICAnZ3N0cnRwa2x2cGF5LmMnLAorICAnZ3N0cnRwbXBhZGVwYXkuYycsCisgICdnc3RydHBtcGFwYXkuYycsCisgICdnc3RydHBtcGFyb2J1c3RkZXBheS5jJywKKyAgJ2dzdHJ0cG1wdmRlcGF5LmMnLAorICAnZ3N0cnRwbXB2cGF5LmMnLAorICAnZ3N0cnRwb3B1c3BheS5jJywKKyAgJ2dzdHJ0cG9wdXNkZXBheS5jJywKKyAgJ2dzdHJ0cHBjbWFkZXBheS5jJywKKyAgJ2dzdHJ0cHBjbXVkZXBheS5jJywKKyAgJ2dzdHJ0cHBjbXVwYXkuYycsCisgICdnc3RydHBwY21hcGF5LmMnLAorICAnZ3N0cnRwZzcyMmRlcGF5LmMnLAorICAnZ3N0cnRwZzcyMnBheS5jJywKKyAgJ2dzdHJ0cGc3MjNkZXBheS5jJywKKyAgJ2dzdHJ0cGc3MjNwYXkuYycsCisgICdnc3RydHBnNzI2cGF5LmMnLAorICAnZ3N0cnRwZzcyNmRlcGF5LmMnLAorICAnZ3N0cnRwZzcyOXBheS5jJywKKyAgJ2dzdHJ0cGc3MjlkZXBheS5jJywKKyAgJ2dzdHJ0cGdzbWRlcGF5LmMnLAorICAnZ3N0cnRwZ3NtcGF5LmMnLAorICAnZ3N0cnRwYW1yZGVwYXkuYycsCisgICdnc3RydHBhbXJwYXkuYycsCisgICdnc3RydHBoMjYxZGVwYXkuYycsCisgICdnc3RydHBoMjYxcGF5LmMnLAorICAnZ3N0cnRwaDI2M3BkZXBheS5jJywKKyAgJ2dzdHJ0cGgyNjNwcGF5LmMnLAorICAnZ3N0cnRwaDI2M2RlcGF5LmMnLAorICAnZ3N0cnRwaDI2M3BheS5jJywKKyAgJ2dzdHJ0cGgyNjRkZXBheS5jJywKKyAgJ2dzdHJ0cGgyNjRwYXkuYycsCisgICdnc3RydHBoMjY1ZGVwYXkuYycsCisgICdnc3RydHBoMjY1cGF5LmMnLAorICAnZ3N0cnRwajJrZGVwYXkuYycsCisgICdnc3RydHBqMmtwYXkuYycsCisgICdnc3RydHBqcGVnZGVwYXkuYycsCisgICdnc3RydHBqcGVncGF5LmMnLAorICAnZ3N0cnRwTDhkZXBheS5jJywKKyAgJ2dzdHJ0cEw4cGF5LmMnLAorICAnZ3N0cnRwTDE2ZGVwYXkuYycsCisgICdnc3RydHBMMTZwYXkuYycsCisgICdnc3RydHBMMjRkZXBheS5jJywKKyAgJ2dzdHJ0cEwyNHBheS5jJywKKyAgJ2dzdGFzdGVyaXNraDI2My5jJywKKyAgJ2dzdHJ0cG1wMXNkZXBheS5jJywKKyAgJ2dzdHJ0cG1wMnRkZXBheS5jJywKKyAgJ2dzdHJ0cG1wMnRwYXkuYycsCisgICdnc3RydHBtcDR2ZGVwYXkuYycsCisgICdnc3RydHBtcDR2cGF5LmMnLAorICAnZ3N0cnRwbXA0Z2RlcGF5LmMnLAorICAnZ3N0cnRwbXA0Z3BheS5jJywKKyAgJ2dzdHJ0cG1wNGFkZXBheS5jJywKKyAgJ2dzdHJ0cG1wNGFwYXkuYycsCisgICdnc3RydHBxY2VscGRlcGF5LmMnLAorICAnZ3N0cnRwcWRtZGVwYXkuYycsCisgICdnc3RydHBzYmNkZXBheS5jJywKKyAgJ2dzdHJ0cHNiY3BheS5jJywKKyAgJ2dzdHJ0cHNpcmVucGF5LmMnLAorICAnZ3N0cnRwc2lyZW5kZXBheS5jJywKKyAgJ2dzdHJ0cHNwZWV4ZGVwYXkuYycsCisgICdnc3RydHBzcGVleHBheS5jJywKKyAgJ2dzdHJ0cHN2M3ZkZXBheS5jJywKKyAgJ2dzdHJ0cHRoZW9yYWRlcGF5LmMnLAorICAnZ3N0cnRwdGhlb3JhcGF5LmMnLAorICAnZ3N0cnRwdm9yYmlzZGVwYXkuYycsCisgICdnc3RydHB2b3JiaXNwYXkuYycsCisgICdnc3RydHB2cDhkZXBheS5jJywKKyAgJ2dzdHJ0cHZwOHBheS5jJywKKyAgJ2dzdHJ0cHZwOWRlcGF5LmMnLAorICAnZ3N0cnRwdnA5cGF5LmMnLAorICAnZ3N0cnRwdnJhd2RlcGF5LmMnLAorICAnZ3N0cnRwdnJhd3BheS5jJywKKyAgJ2dzdHJ0cHN0cmVhbXBheS5jJywKKyAgJ2dzdHJ0cHN0cmVhbWRlcGF5LmMnLAorICAnZ3N0cnRwdXRpbHMuYycsCitdCisKK3J0cF9hcmdzID0gWworICAnLUR2cDhfbm9ybT1nc3RfcnRwdnA4X3ZwOF9ub3JtJywKKyAgJy1EdnA4ZHhfc3RhcnRfZGVjb2RlPWdzdF9ydHB2cDhfdnA4ZHhfc3RhcnRfZGVjb2RlJywKKyAgJy1EdnA4ZHhfYm9vbF9kZWNvZGVyX2ZpbGw9Z3N0X3J0cHZwOF92cDhkeF9ib29sX2RlY29kZXJfZmlsbCcsCitdCisKK2dzdHJ0cCA9IGxpYnJhcnkoJ2dzdHJ0cCcsCisgIHJ0cF9zb3VyY2VzLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MgKyBydHBfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0YmFzZV9kZXAsIGdzdGF1ZGlvX2RlcCwgZ3N0dmlkZW9fZGVwLCBnc3R0YWdfZGVwLAorICAgICAgICAgICAgICAgICAgZ3N0cnRwX2RlcCwgZ3N0cGJ1dGlsc19kZXAsIGxpYm1dLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW0gYi9nc3QvcnRwbWFuYWdlci9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OThlNjFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzOSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0cnRwbWFuYWdlci5sYQorCitsaWJnc3RydHBtYW5hZ2VyX2xhX1NPVVJDRVMgPSBnc3RydHBtYW5hZ2VyLmMgXAorCQkJICAgICAgZ3N0cnRwYmluLmMgXAorCQkJICAgICAgZ3N0cnRwZHRtZm11eC5jIFwKKwkJCSAgICAgIGdzdHJ0cGppdHRlcmJ1ZmZlci5jIFwKKwkJCSAgICAgIGdzdHJ0cG11eC5jIFwKKwkJCSAgICAgIGdzdHJ0cHB0ZGVtdXguYyBcCisJCQkgICAgICBnc3RydHBydHhxdWV1ZS5jIFwKKwkJCSAgICAgIGdzdHJ0cHJ0eHJlY2VpdmUuYyBcCisJCQkgICAgICBnc3RydHBydHhzZW5kLmMgXAorCQkJICAgICAgZ3N0cnRwc3NyY2RlbXV4LmMgXAorCQkJICAgICAgcnRwaml0dGVyYnVmZmVyLmMgICAgICBcCisJCQkgICAgICBydHBzZXNzaW9uLmMgICAgICBcCisJCQkgICAgICBydHBzb3VyY2UuYyAgICAgIFwKKwkJCSAgICAgIHJ0cHN0YXRzLmMgICAgICBcCisJCQkgICAgICBnc3RydHBzZXNzaW9uLmMKKworbm9pbnN0X0hFQURFUlMgPSBnc3RydHBiaW4uaCBcCisJCSBnc3RydHBkdG1mbXV4LmggXAorCQkgZ3N0cnRwaml0dGVyYnVmZmVyLmggXAorCQkgZ3N0cnRwbXV4LmggXAorICAgICAgICAgICAgICAgICBnc3RydHBwdGRlbXV4LmggXAorICAgICAgICAgICAgICAgICBnc3RydHBzc3JjZGVtdXguaCBcCisgICAgICAgICAgICAgICAgIGdzdHJ0cHJ0eHF1ZXVlLmggXAorICAgICAgICAgICAgICAgICBnc3RydHBydHhyZWNlaXZlLmggXAorICAgICAgICAgICAgICAgICBnc3RydHBydHhzZW5kLmggXAorICAgICAgICAgICAgICAgICBydHBqaXR0ZXJidWZmZXIuaCBcCisJCSBydHBzZXNzaW9uLmggIFwKKwkJIHJ0cHNvdXJjZS5oICBcCisJCSBydHBzdGF0cy5oICBcCisJCSBnc3RydHBzZXNzaW9uLmgKKworbGliZ3N0cnRwbWFuYWdlcl9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpIFwKKwkkKEdTVF9ORVRfQ0ZMQUdTKSAkKFdBUk5JTkdfQ0ZMQUdTKSAkKEVSUk9SX0NGTEFHUykKK2xpYmdzdHJ0cG1hbmFnZXJfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwkkKEdTVF9ORVRfTElCUykgLWxnc3RydHAtQEdTVF9BUElfVkVSU0lPTkAgXAorCSQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykKK2xpYmdzdHJ0cG1hbmFnZXJfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmMgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODQ4NzExCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmMKQEAgLTAsMCArMSw0NTcyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwYmluCisgKiBAc2VlX2Fsc286IHJ0cGppdHRlcmJ1ZmZlciwgcnRwc2Vzc2lvbiwgcnRwcHRkZW11eCwgcnRwc3NyY2RlbXV4CisgKgorICogUlRQIGJpbiBjb21iaW5lcyB0aGUgZnVuY3Rpb25zIG9mICNHc3RSdHBTZXNzaW9uLCAjR3N0UnRwU3NyY0RlbXV4LAorICogI0dzdFJ0cEppdHRlckJ1ZmZlciBhbmQgI0dzdFJ0cFB0RGVtdXggaW4gb25lIGVsZW1lbnQuIEl0IGFsbG93cyBmb3IgbXVsdGlwbGUKKyAqIFJUUCBzZXNzaW9ucyB0aGF0IHdpbGwgYmUgc3luY2hyb25pemVkIHRvZ2V0aGVyIHVzaW5nIFJUQ1AgU1IgcGFja2V0cy4KKyAqCisgKiAjR3N0UnRwQmluIGlzIGNvbmZpZ3VyZWQgd2l0aCBhIG51bWJlciBvZiByZXF1ZXN0IHBhZHMgdGhhdCBkZWZpbmUgdGhlCisgKiBmdW5jdGlvbmFsaXR5IHRoYXQgaXMgYWN0aXZhdGVkLCBzaW1pbGFyIHRvIHRoZSAjR3N0UnRwU2Vzc2lvbiBlbGVtZW50LgorICoKKyAqIFRvIHVzZSAjR3N0UnRwQmluIGFzIGFuIFJUUCByZWNlaXZlciwgcmVxdWVzdCBhIHJlY3ZfcnRwX3NpbmtfXCV1IHBhZC4gVGhlIHNlc3Npb24KKyAqIG51bWJlciBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgcGFkIG5hbWUuCisgKiBEYXRhIHJlY2VpdmVkIG9uIHRoZSByZWN2X3J0cF9zaW5rX1wldSBwYWQgd2lsbCBiZSBwcm9jZXNzZWQgaW4gdGhlICNHc3RSdHBTZXNzaW9uCisgKiBtYW5hZ2VyIGFuZCBhZnRlciBiZWluZyB2YWxpZGF0ZWQgZm9yd2FyZGVkIG9uICNHc3RSdHBTc3JjRGVtdXggZWxlbWVudC4gRWFjaAorICogUlRQIHN0cmVhbSBpcyBkZW11eGVkIGJhc2VkIG9uIHRoZSBTU1JDIGFuZCBzZW5kIHRvIGEgI0dzdFJ0cEppdHRlckJ1ZmZlci4gQWZ0ZXIKKyAqIHRoZSBwYWNrZXRzIGFyZSByZWxlYXNlZCBmcm9tIHRoZSBqaXR0ZXJidWZmZXIsIHRoZXkgd2lsbCBiZSBmb3J3YXJkZWQgdG8gYQorICogI0dzdFJ0cFB0RGVtdXggZWxlbWVudC4gVGhlICNHc3RSdHBQdERlbXV4IGVsZW1lbnQgd2lsbCBkZW11eCB0aGUgcGFja2V0cyBiYXNlZAorICogb24gdGhlIHBheWxvYWQgdHlwZSBhbmQgd2lsbCBjcmVhdGUgYSB1bmlxdWUgcGFkIHJlY3ZfcnRwX3NyY19cJXVfXCV1X1wldSBvbgorICogcnRwYmluIHdpdGggdGhlIHNlc3Npb24gbnVtYmVyLCBTU1JDIGFuZCBwYXlsb2FkIHR5cGUgcmVzcGVjdGl2ZWx5IGFzIHRoZSBwYWQKKyAqIG5hbWUuCisgKgorICogVG8gYWxzbyB1c2UgI0dzdFJ0cEJpbiBhcyBhbiBSVENQIHJlY2VpdmVyLCByZXF1ZXN0IGEgcmVjdl9ydGNwX3NpbmtfXCV1IHBhZC4gVGhlCisgKiBzZXNzaW9uIG51bWJlciBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgcGFkIG5hbWUuCisgKgorICogSWYgeW91IHdhbnQgdGhlIHNlc3Npb24gbWFuYWdlciB0byBnZW5lcmF0ZSBhbmQgc2VuZCBSVENQIHBhY2tldHMsIHJlcXVlc3QKKyAqIHRoZSBzZW5kX3J0Y3Bfc3JjX1wldSBwYWQgd2l0aCB0aGUgc2Vzc2lvbiBudW1iZXIgaW4gdGhlIHBhZCBuYW1lLiBQYWNrZXQgcHVzaGVkCisgKiBvbiB0aGlzIHBhZCBjb250YWluIFNSL1JSIFJUQ1AgcmVwb3J0cyB0aGF0IHNob3VsZCBiZSBzZW50IHRvIGFsbCBwYXJ0aWNpcGFudHMKKyAqIGluIHRoZSBzZXNzaW9uLgorICoKKyAqIFRvIHVzZSAjR3N0UnRwQmluIGFzIGEgc2VuZGVyLCByZXF1ZXN0IGEgc2VuZF9ydHBfc2lua19cJXUgcGFkLCB3aGljaCB3aWxsCisgKiBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIHNlbmRfcnRwX3NyY19cJXUgcGFkLiBJZiB0aGUgc2Vzc2lvbiBudW1iZXIgaXMgbm90IHByb3ZpZGVkLAorICogdGhlIHBhZCBmcm9tIHRoZSBsb3dlc3QgYXZhaWxhYmxlIHNlc3Npb24gd2lsbCBiZSByZXR1cm5lZC4gVGhlIHNlc3Npb24gbWFuYWdlciB3aWxsIG1vZGlmeSB0aGUKKyAqIFNTUkMgaW4gdGhlIFJUUCBwYWNrZXRzIHRvIGl0cyBvd24gU1NSQyBhbmQgd2lsIGZvcndhcmQgdGhlIHBhY2tldHMgb24gdGhlCisgKiBzZW5kX3J0cF9zcmNfXCV1IHBhZCBhZnRlciB1cGRhdGluZyBpdHMgaW50ZXJuYWwgc3RhdGUuCisgKgorICogI0dzdFJ0cEJpbiBjYW4gYWxzbyBkZW11bHRpcGxleCBpbmNvbWluZyBidW5kbGVkIHN0cmVhbXMuIFRoZSBmaXJzdAorICogI0dzdFJ0cFNlc3Npb24gd2lsbCBoYXZlIGEgI0dzdFJ0cFNzcmNEZW11eCBlbGVtZW50IHNwbGl0dGluZyB0aGUgc3RyZWFtcworICogYmFzZWQgb24gdGhlaXIgU1NSQyBhbmQgcG90ZW50aWFsbHkgZGlzcGF0Y2hlZCB0byBhIGRpZmZlcmVudCAjR3N0UnRwU2Vzc2lvbi4KKyAqIEJlY2F1c2UgcmV0cmFuc21pc3Npb24gU1NSQ3MgbmVlZCB0byBiZSBtZXJnZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBtZWRpYQorICogc3RyZWFtIHRoZSAjR3N0UnRwQmluOjpvbi1idW5kbGVkLXNzcmMgc2lnbmFsIGlzIGVtaXR0ZWQgc28gdGhhdCB0aGUKKyAqIGFwcGxpY2F0aW9uIGNhbiBmaW5kIG91dCB0byB3aGljaCBzZXNzaW9uIHRoZSBTU1JDIGJlbG9uZ3MuCisgKgorICogVGhlIHNlc3Npb24gbWFuYWdlciBuZWVkcyB0aGUgY2xvY2stcmF0ZSBvZiB0aGUgcGF5bG9hZCB0eXBlcyBpdCBpcyBoYW5kbGluZworICogYW5kIHdpbGwgc2lnbmFsIHRoZSAjR3N0UnRwU2Vzc2lvbjo6cmVxdWVzdC1wdC1tYXAgc2lnbmFsIHdoZW4gaXQgbmVlZHMgc3VjaCBhCisgKiBtYXBwaW5nLiBPbmUgY2FuIGNsZWFyIHRoZSBjYWNoZWQgdmFsdWVzIHdpdGggdGhlICNHc3RSdHBTZXNzaW9uOjpjbGVhci1wdC1tYXAKKyAqIHNpZ25hbC4KKyAqCisgKiBBY2Nlc3MgdG8gdGhlIGludGVybmFsIHN0YXRpc3RpY3Mgb2YgcnRwYmluIGlzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBnZXQtaW50ZXJuYWwtc2Vzc2lvbiBwcm9wZXJ0eS4gVGhpcyBhY3Rpb24gc2lnbmFsIGdpdmVzIGFjY2VzcyB0byB0aGUKKyAqIFJUUFNlc3Npb24gb2JqZWN0IHdoaWNoIGZ1cnRoZXIgcHJvdmlkZXMgYWN0aW9uIHNpZ25hbHMgdG8gcmV0cmlldmUgdGhlCisgKiBpbnRlcm5hbCBzb3VyY2UgYW5kIG90aGVyIHNvdXJjZXMuCisgKgorICogI0dzdFJ0cEJpbiBhbHNvIGhhcyBzaWduYWxzICgjR3N0UnRwQmluOjpyZXF1ZXN0LXJ0cC1lbmNvZGVyLAorICogI0dzdFJ0cEJpbjo6cmVxdWVzdC1ydHAtZGVjb2RlciwgI0dzdFJ0cEJpbjo6cmVxdWVzdC1ydGNwLWVuY29kZXIgYW5kCisgKiAjR3N0UnRwQmluOjpyZXF1ZXN0LXJ0cC1kZWNvZGVyKSB0byBkeW5hbWljYWxseSByZXF1ZXN0IGZvciBSVFAgYW5kIFJUQ1AgZW5jb2RlcnMKKyAqIGFuZCBkZWNvZGVycyBpbiBvcmRlciB0byBzdXBwb3J0IFNSVFAuIFRoZSBlbmNvZGVycyBtdXN0IHByb3ZpZGUgdGhlIHBhZHMKKyAqIHJ0cF9zaW5rX1wldSBhbmQgcnRwX3NyY19cJXUgZm9yIFJUUCBhbmQgcnRjcF9zaW5rX1wldSBhbmQgcnRjcF9zcmNfXCV1IGZvcgorICogUlRDUC4gVGhlIHNlc3Npb24gbnVtYmVyIHdpbGwgYmUgdXNlZCBpbiB0aGUgcGFkIG5hbWUuIFRoZSBkZWNvZGVycyBtdXN0IHByb3ZpZGUKKyAqIHJ0cF9zaW5rIGFuZCBydHBfc3JjIGZvciBSVFAgYW5kIHJ0Y3Bfc2luayBhbmQgcnRjcF9zcmMgZm9yIFJUQ1AuIFRoZSBkZWNvZGVycyB3aWxsCisgKiBiZSBwbGFjZWQgYmVmb3JlIHRoZSAjR3N0UnRwU2Vzc2lvbiBlbGVtZW50LCB0aHVzIHRoZXkgbXVzdCBzdXBwb3J0IFNTUkMgZGVtdXhpbmcKKyAqIGludGVybmFsbHkuCisgKgorICogI0dzdFJ0cEJpbiBoYXMgc2lnbmFscyAoI0dzdFJ0cEJpbjo6cmVxdWVzdC1hdXgtc2VuZGVyIGFuZAorICogI0dzdFJ0cEJpbjo6cmVxdWVzdC1hdXgtcmVjZWl2ZXIgdG8gZHluYW1pY2FsbHkgcmVxdWVzdCBhbiBlbGVtZW50IHRoYXQgY2FuIGJlCisgKiB1c2VkIHRvIGNyZWF0ZSBvciBtZXJnZSBhZGRpdGlvbmFsIFJUUCBzdHJlYW1zLiBBVVggZWxlbWVudHMgYXJlIG5lZWRlZCB0bworICogaW1wbGVtZW50IEZFQyBvciByZXRyYW5zbWlzc2lvbiAoc3VjaCBhcyBSRkMgNDU4OCkuIEFuIEFVWCBzZW5kZXIgbXVzdCBoYXZlIG9uZQorICogc2lua19cJXUgcGFkIHRoYXQgbWF0Y2hlcyB0aGUgc2Vzc2lvbmlkIGluIHRoZSBzaWduYWwgYW5kIGl0IHNob3VsZCBoYXZlIDEgb3IKKyAqIG1vcmUgc3JjX1wldSBwYWRzLiBGb3IgZWFjaCBzcmNfJVx1IHBhZCwgYSBzZXNzaW9uIHdpbGwgYmUgbWFkZSAoaWYgbmVlZGVkKQorICogYW5kIHRoZSBwYWQgd2lsbCBiZSBsaW5rZWQgdG8gdGhlIHNlc3Npb24gc2VuZF9ydHBfc2luayBwYWQuIEVhY2ggc2Vzc2lvbiB3aWxsCisgKiB0aGVuIGV4cG9zZSBpdHMgc291cmNlIHBhZCBhcyBzZW5kX3J0cF9zcmNfXCV1IG9uICNHc3RSdHBCaW4uCisgKiBBbiBBVVggcmVjZWl2ZXIgaGFzIDEgc3JjX1wldSBwYWQgdGhhdCBtdWNoIG1hdGNoIHRoZSBzZXNzaW9uaWQgaW4gdGhlIHNpZ25hbAorICogYW5kIDEgb3IgbW9yZSBzaW5rX1wldSBwYWRzLiBBIHNlc3Npb24gd2lsbCBiZSBtYWRlIGZvciBlYWNoIHNpbmtfXCV1IHBhZAorICogd2hlbiB0aGUgY29ycmVzcG9uZGluZyByZWN2X3J0cF9zaW5rX1wldSBwYWQgaXMgcmVxdWVzdGVkIG9uICNHc3RSdHBCaW4uCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB1ZHBzcmMgcG9ydD01MDAwIGNhcHM9ImFwcGxpY2F0aW9uL3gtcnRwLCAuLi4iICEgLnJlY3ZfcnRwX3NpbmtfMCBcCisgKiAgICAgcnRwYmluICEgcnRwdGhlb3JhZGVwYXkgISB0aGVvcmFkZWMgISB4dmltYWdlc2luaworICogXXwgUmVjZWl2ZSBSVFAgZGF0YSBmcm9tIHBvcnQgNTAwMCBhbmQgc2VuZCB0byB0aGUgc2Vzc2lvbiAwIGluIHJ0cGJpbi4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBydHBiaW4gbmFtZT1ydHBiaW4gXAorICogICAgICAgICB2NGwyc3JjICEgdmlkZW9jb252ZXJ0ICEgZmZlbmNfaDI2MyAhIHJ0cGgyNjNwcGF5ICEgcnRwYmluLnNlbmRfcnRwX3NpbmtfMCBcCisgKiAgICAgICAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydHBfc3JjXzAgISB1ZHBzaW5rIHBvcnQ9NTAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgKiAgICAgICAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18wICEgdWRwc2luayBwb3J0PTUwMDEgc3luYz1mYWxzZSBhc3luYz1mYWxzZSAgICBcCisgKiAgICAgICAgICAgICAgICAgICB1ZHBzcmMgcG9ydD01MDA1ICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgKiAgICAgICAgIGF1ZGlvdGVzdHNyYyAhIGFtcm5iZW5jICEgcnRwYW1ycGF5ICEgcnRwYmluLnNlbmRfcnRwX3NpbmtfMSAgICAgICAgICAgICAgICAgICBcCisgKiAgICAgICAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydHBfc3JjXzEgISB1ZHBzaW5rIHBvcnQ9NTAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgKiAgICAgICAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18xICEgdWRwc2luayBwb3J0PTUwMDMgc3luYz1mYWxzZSBhc3luYz1mYWxzZSAgICBcCisgKiAgICAgICAgICAgICAgICAgICB1ZHBzcmMgcG9ydD01MDA3ICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzEKKyAqIF18IEVuY29kZSBhbmQgcGF5bG9hZCBIMjYzIHZpZGVvIGNhcHR1cmVkIGZyb20gYSB2NGwyc3JjLiBFbmNvZGUgYW5kIHBheWxvYWQgQU1SCisgKiBhdWRpbyBnZW5lcmF0ZWQgZnJvbSBhdWRpb3Rlc3RzcmMuIFRoZSB2aWRlbyBpcyBzZW50IHRvIHNlc3Npb24gMCBpbiBydHBiaW4KKyAqIGFuZCB0aGUgYXVkaW8gaXMgc2VudCB0byBzZXNzaW9uIDEuIFZpZGVvIHBhY2tldHMgYXJlIHNlbnQgb24gVURQIHBvcnQgNTAwMAorICogYW5kIGF1ZGlvIHBhY2tldHMgb24gcG9ydCA1MDAyLiBUaGUgdmlkZW8gUlRDUCBwYWNrZXRzIGZvciBzZXNzaW9uIDAgYXJlIHNlbnQKKyAqIG9uIHBvcnQgNTAwMSBhbmQgdGhlIGF1ZGlvIFJUQ1AgcGFja2V0cyBmb3Igc2Vzc2lvbiAwIGFyZSBzZW50IG9uIHBvcnQgNTAwMy4KKyAqIFJUQ1AgcGFja2V0cyBmb3Igc2Vzc2lvbiAwIGFyZSByZWNlaXZlZCBvbiBwb3J0IDUwMDUgYW5kIFJUQ1AgZm9yIHNlc3Npb24gMQorICogaXMgcmVjZWl2ZWQgb24gcG9ydCA1MDA3LiBTaW5jZSBSVENQIHBhY2tldHMgZnJvbSB0aGUgc2VuZGVyIHNob3VsZCBiZSBzZW50CisgKiBhcyBzb29uIGFzIHBvc3NpYmxlIGFuZCBkbyBub3QgcGFydGljaXBhdGUgaW4gcHJlcm9sbCwgc3luYz1mYWxzZSBhbmQKKyAqIGFzeW5jPWZhbHNlIGlzIGNvbmZpZ3VyZWQgb24gdWRwc2luaworICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHJ0cGJpbiBuYW1lPXJ0cGJpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgICB1ZHBzcmMgY2Fwcz0iYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZyl2aWRlbyxjbG9jay1yYXRlPShpbnQpOTAwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjMtMTk5OCIgXAorICogICAgICAgICAgICAgcG9ydD01MDAwICEgcnRwYmluLnJlY3ZfcnRwX3NpbmtfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICogICAgICAgICBydHBiaW4uICEgcnRwaDI2M3BkZXBheSAhIGZmZGVjX2gyNjMgISB4dmltYWdlc2luayAgICAgICAgICAgICAgICAgICAgXAorICogICAgICB1ZHBzcmMgcG9ydD01MDAxICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICogICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18wICEgdWRwc2luayBwb3J0PTUwMDUgc3luYz1mYWxzZSBhc3luYz1mYWxzZSAgICAgICAgXAorICogICAgIHVkcHNyYyBjYXBzPSJhcHBsaWNhdGlvbi94LXJ0cCxtZWRpYT0oc3RyaW5nKWF1ZGlvLGNsb2NrLXJhdGU9KGludCk4MDAwLGVuY29kaW5nLW5hbWU9KHN0cmluZylBTVIsZW5jb2RpbmctcGFyYW1zPShzdHJpbmcpMSxvY3RldC1hbGlnbj0oc3RyaW5nKTEiIFwKKyAqICAgICAgICAgICAgIHBvcnQ9NTAwMiAhIHJ0cGJpbi5yZWN2X3J0cF9zaW5rXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgICAgICAgcnRwYmluLiAhIHJ0cGFtcmRlcGF5ICEgYW1ybmJkZWMgISBhbHNhc2luayAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgICAgdWRwc3JjIHBvcnQ9NTAwMyAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMSAhIHVkcHNpbmsgcG9ydD01MDA3IHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UKKyAqIF18IFJlY2VpdmUgSDI2MyBvbiBwb3J0IDUwMDAsIHNlbmQgaXQgdGhyb3VnaCBydHBiaW4gaW4gc2Vzc2lvbiAwLCBkZXBheWxvYWQsCisgKiBkZWNvZGUgYW5kIGRpc3BsYXkgdGhlIHZpZGVvLgorICogUmVjZWl2ZSBBTVIgb24gcG9ydCA1MDAyLCBzZW5kIGl0IHRocm91Z2ggcnRwYmluIGluIHNlc3Npb24gMSwgZGVwYXlsb2FkLAorICogZGVjb2RlIGFuZCBwbGF5IHRoZSBhdWRpby4KKyAqIFJlY2VpdmUgc2VydmVyIFJUQ1AgcGFja2V0cyBmb3Igc2Vzc2lvbiAwIG9uIHBvcnQgNTAwMSBhbmQgUlRDUCBwYWNrZXRzIGZvcgorICogc2Vzc2lvbiAxIG9uIHBvcnQgNTAwMy4gVGhlc2UgcGFja2V0cyB3aWxsIGJlIHVzZWQgZm9yIHNlc3Npb24gbWFuYWdlbWVudCBhbmQKKyAqIHN5bmNocm9uaXNhdGlvbi4KKyAqIFNlbmQgUlRDUCByZXBvcnRzIGZvciBzZXNzaW9uIDAgb24gcG9ydCA1MDA1IGFuZCBSVENQIHJlcG9ydHMgZm9yIHNlc3Npb24gMQorICogb24gcG9ydCA1MDA3LgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydGNwYnVmZmVyLmg+CisKKyNpbmNsdWRlICJnc3RydHBiaW4uaCIKKyNpbmNsdWRlICJydHBzZXNzaW9uLmgiCisjaW5jbHVkZSAiZ3N0cnRwc2Vzc2lvbi5oIgorI2luY2x1ZGUgImdzdHJ0cGppdHRlcmJ1ZmZlci5oIgorCisjaW5jbHVkZSA8Z3N0L2dsaWItY29tcGF0LXByaXZhdGUuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF9iaW5fZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3J0cF9iaW5fZGVidWcKKworLyogc2luayBwYWRzICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcnRwYmluX3JlY3ZfcnRwX3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgicmVjdl9ydHBfc2lua18ldSIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cDthcHBsaWNhdGlvbi94LXNydHAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBydHBiaW5fcmVjdl9ydGNwX3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgicmVjdl9ydGNwX3NpbmtfJXUiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydGNwO2FwcGxpY2F0aW9uL3gtc3J0Y3AiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBydHBiaW5fc2VuZF9ydHBfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNlbmRfcnRwX3NpbmtfJXUiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKQorICAgICk7CisKKy8qIHNyYyBwYWRzICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcnRwYmluX3JlY3ZfcnRwX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInJlY3ZfcnRwX3NyY18ldV8ldV8ldSIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBydHBiaW5fc2VuZF9ydGNwX3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzZW5kX3J0Y3Bfc3JjXyV1IiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydGNwO2FwcGxpY2F0aW9uL3gtc3J0Y3AiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBydHBiaW5fc2VuZF9ydHBfc3JjX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNlbmRfcnRwX3NyY18ldSIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHA7YXBwbGljYXRpb24veC1zcnRwIikKKyAgICApOworCisjZGVmaW5lIEdTVF9SVFBfQklOX0dFVF9QUklWQVRFKG9iaikgIFwKKyAgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX1BSSVZBVEUgKChvYmopLCBHU1RfVFlQRV9SVFBfQklOLCBHc3RSdHBCaW5Qcml2YXRlKSkKKworI2RlZmluZSBHU1RfUlRQX0JJTl9MT0NLKGJpbikgICBnX211dGV4X2xvY2sgKCYoYmluKS0+cHJpdi0+YmluX2xvY2spCisjZGVmaW5lIEdTVF9SVFBfQklOX1VOTE9DSyhiaW4pIGdfbXV0ZXhfdW5sb2NrICgmKGJpbiktPnByaXYtPmJpbl9sb2NrKQorCisvKiBsb2NrIHRvIHByb3RlY3QgZHluYW1pYyBjYWxsYmFja3MsIGxpa2UgcGFkLWFkZGVkIGFuZCBuZXcgc3NyYy4gKi8KKyNkZWZpbmUgR1NUX1JUUF9CSU5fRFlOX0xPQ0soYmluKSAgICBnX211dGV4X2xvY2sgKCYoYmluKS0+cHJpdi0+ZHluX2xvY2spCisjZGVmaW5lIEdTVF9SVFBfQklOX0RZTl9VTkxPQ0soYmluKSAgZ19tdXRleF91bmxvY2sgKCYoYmluKS0+cHJpdi0+ZHluX2xvY2spCisKKy8qIGxvY2sgZm9yIHNodXRkb3duICovCisjZGVmaW5lIEdTVF9SVFBfQklOX1NIVVRET1dOX0xPQ0soYmluLGxhYmVsKSAgICAgXAorR19TVE1UX1NUQVJUIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCZiaW4tPnByaXYtPnNodXRkb3duKSkgICBcCisgICAgZ290byBsYWJlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHU1RfUlRQX0JJTl9EWU5fTE9DSyAoYmluKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCZiaW4tPnByaXYtPnNodXRkb3duKSkgeyBcCisgICAgR1NUX1JUUF9CSU5fRFlOX1VOTE9DSyAoYmluKTsgICAgICAgICAgICAgICAgXAorICAgIGdvdG8gbGFiZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IEdfU1RNVF9FTkQKKworLyogdW5sb2NrIGZvciBzaHV0ZG93biAqLworI2RlZmluZSBHU1RfUlRQX0JJTl9TSFVURE9XTl9VTkxPQ0soYmluKSAgICAgICAgIFwKKyAgR1NUX1JUUF9CSU5fRFlOX1VOTE9DSyAoYmluKTsgICAgICAgICAgICAgICAgICBcCisKKy8qIE1pbmltdW0gdGltZSBvZmZzZXQgdG8gYXBwbHkuIFRoaXMgY29tcGVuc2F0ZXMgZm9yIHJvdW5kaW5nIGVycm9ycyBpbiBOVFAgdG8KKyAqIFJUUCB0aW1lc3RhbXAgY29udmVyc2lvbnMgKi8KKyNkZWZpbmUgTUlOX1RTX09GRlNFVCAoNCAqIEdTVF9NU0VDT05EKQorCitzdHJ1Y3QgX0dzdFJ0cEJpblByaXZhdGUKK3sKKyAgR011dGV4IGJpbl9sb2NrOworCisgIC8qIGxvY2sgcHJvdGVjdGluZyBkeW5hbWljIGFkZGluZy9yZW1vdmluZyAqLworICBHTXV0ZXggZHluX2xvY2s7CisKKyAgLyogaWYgd2UgYXJlIHNodXR0aW5nIGRvd24gb3Igbm90ICovCisgIGdpbnQgc2h1dGRvd247CisKKyAgZ2Jvb2xlYW4gYXV0b3JlbW92ZTsKKworICAvKiBOVFAgdGltZSBpbiBucyBvZiBsYXN0IFNSIHN5bmMgdXNlZCAqLworICBndWludDY0IGxhc3RfbnRwbnN0aW1lOworCisgIC8qIGxpc3Qgb2YgZXh0cmEgZWxlbWVudHMgKi8KKyAgR0xpc3QgKmVsZW1lbnRzOworfTsKKworLyogc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICBTSUdOQUxfUkVRVUVTVF9QVF9NQVAsCisgIFNJR05BTF9QQVlMT0FEX1RZUEVfQ0hBTkdFLAorICBTSUdOQUxfQ0xFQVJfUFRfTUFQLAorICBTSUdOQUxfUkVTRVRfU1lOQywKKyAgU0lHTkFMX0dFVF9TRVNTSU9OLAorICBTSUdOQUxfR0VUX0lOVEVSTkFMX1NFU1NJT04sCisKKyAgU0lHTkFMX09OX05FV19TU1JDLAorICBTSUdOQUxfT05fU1NSQ19DT0xMSVNJT04sCisgIFNJR05BTF9PTl9TU1JDX1ZBTElEQVRFRCwKKyAgU0lHTkFMX09OX1NTUkNfQUNUSVZFLAorICBTSUdOQUxfT05fU1NSQ19TREVTLAorICBTSUdOQUxfT05fQllFX1NTUkMsCisgIFNJR05BTF9PTl9CWUVfVElNRU9VVCwKKyAgU0lHTkFMX09OX1RJTUVPVVQsCisgIFNJR05BTF9PTl9TRU5ERVJfVElNRU9VVCwKKyAgU0lHTkFMX09OX05QVF9TVE9QLAorCisgIFNJR05BTF9SRVFVRVNUX1JUUF9FTkNPREVSLAorICBTSUdOQUxfUkVRVUVTVF9SVFBfREVDT0RFUiwKKyAgU0lHTkFMX1JFUVVFU1RfUlRDUF9FTkNPREVSLAorICBTSUdOQUxfUkVRVUVTVF9SVENQX0RFQ09ERVIsCisKKyAgU0lHTkFMX05FV19KSVRURVJCVUZGRVIsCisKKyAgU0lHTkFMX1JFUVVFU1RfQVVYX1NFTkRFUiwKKyAgU0lHTkFMX1JFUVVFU1RfQVVYX1JFQ0VJVkVSLAorCisgIFNJR05BTF9PTl9ORVdfU0VOREVSX1NTUkMsCisgIFNJR05BTF9PTl9TRU5ERVJfU1NSQ19BQ1RJVkUsCisKKyAgU0lHTkFMX09OX0JVTkRMRURfU1NSQywKKworICBMQVNUX1NJR05BTAorfTsKKworI2RlZmluZSBERUZBVUxUX0xBVEVOQ1lfTVMgICAgICAgICAgIDIwMAorI2RlZmluZSBERUZBVUxUX0RST1BfT05fTEFURU5DWSAgICAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfU0RFUyAgICAgICAgICAgICAgICAgTlVMTAorI2RlZmluZSBERUZBVUxUX0RPX0xPU1QgICAgICAgICAgICAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfSUdOT1JFX1BUICAgICAgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9OVFBfU1lOQyAgICAgICAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX0FVVE9SRU1PVkUgICAgICAgICAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfQlVGRkVSX01PREUgICAgICAgICAgUlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9TTEFWRQorI2RlZmluZSBERUZBVUxUX1VTRV9QSVBFTElORV9DTE9DSyAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfUlRDUF9TWU5DICAgICAgICAgICAgR1NUX1JUUF9CSU5fUlRDUF9TWU5DX0FMV0FZUworI2RlZmluZSBERUZBVUxUX1JUQ1BfU1lOQ19JTlRFUlZBTCAgIDAKKyNkZWZpbmUgREVGQVVMVF9ET19TWU5DX0VWRU5UICAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX0RPX1JFVFJBTlNNSVNTSU9OICAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfUlRQX1BST0ZJTEUgICAgICAgICAgR1NUX1JUUF9QUk9GSUxFX0FWUAorI2RlZmluZSBERUZBVUxUX05UUF9USU1FX1NPVVJDRSAgICAgIEdTVF9SVFBfTlRQX1RJTUVfU09VUkNFX05UUAorI2RlZmluZSBERUZBVUxUX1JUQ1BfU1lOQ19TRU5EX1RJTUUgIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGIDEwMDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfRFJPUE9VVF9USU1FICAgICA2MDAwMAorI2RlZmluZSBERUZBVUxUX01BWF9NSVNPUkRFUl9USU1FICAgIDIwMDAKKyNkZWZpbmUgREVGQVVMVF9SRkM3MjczX1NZTkMgICAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX01BWF9TVFJFQU1TICAgICAgICAgIEdfTUFYVUlOVAorI2RlZmluZSBERUZBVUxUX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVCBHX0dVSU5UNjRfQ09OU1RBTlQoMCkKKyNkZWZpbmUgREVGQVVMVF9NQVhfVFNfT0ZGU0VUICAgICAgICBHX0dJTlQ2NF9DT05TVEFOVCgzMDAwMDAwMDAwKQorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MQVRFTkNZLAorICBQUk9QX0RST1BfT05fTEFURU5DWSwKKyAgUFJPUF9TREVTLAorICBQUk9QX0RPX0xPU1QsCisgIFBST1BfSUdOT1JFX1BULAorICBQUk9QX05UUF9TWU5DLAorICBQUk9QX1JUQ1BfU1lOQywKKyAgUFJPUF9SVENQX1NZTkNfSU5URVJWQUwsCisgIFBST1BfQVVUT1JFTU9WRSwKKyAgUFJPUF9CVUZGRVJfTU9ERSwKKyAgUFJPUF9VU0VfUElQRUxJTkVfQ0xPQ0ssCisgIFBST1BfRE9fU1lOQ19FVkVOVCwKKyAgUFJPUF9ET19SRVRSQU5TTUlTU0lPTiwKKyAgUFJPUF9SVFBfUFJPRklMRSwKKyAgUFJPUF9OVFBfVElNRV9TT1VSQ0UsCisgIFBST1BfUlRDUF9TWU5DX1NFTkRfVElNRSwKKyAgUFJPUF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGLAorICBQUk9QX01BWF9EUk9QT1VUX1RJTUUsCisgIFBST1BfTUFYX01JU09SREVSX1RJTUUsCisgIFBST1BfUkZDNzI3M19TWU5DLAorICBQUk9QX01BWF9TVFJFQU1TLAorICBQUk9QX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVCwKKyAgUFJPUF9NQVhfVFNfT0ZGU0VUCit9OworCisjZGVmaW5lIEdTVF9SVFBfQklOX1JUQ1BfU1lOQ19UWVBFIChnc3RfcnRwX2Jpbl9ydGNwX3N5bmNfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3J0cF9iaW5fcnRjcF9zeW5jX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgcnRjcF9zeW5jX3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBydGNwX3N5bmNfdHlwZXNbXSA9IHsKKyAgICB7R1NUX1JUUF9CSU5fUlRDUF9TWU5DX0FMV0FZUywgImFsd2F5cyIsICJhbHdheXMifSwKKyAgICB7R1NUX1JUUF9CSU5fUlRDUF9TWU5DX0lOSVRJQUwsICJpbml0aWFsIiwgImluaXRpYWwifSwKKyAgICB7R1NUX1JUUF9CSU5fUlRDUF9TWU5DX1JUUCwgInJ0cC1pbmZvIiwgInJ0cC1pbmZvIn0sCisgICAgezAsIE5VTEwsIE5VTEx9LAorICB9OworCisgIGlmICghcnRjcF9zeW5jX3R5cGUpIHsKKyAgICBydGNwX3N5bmNfdHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RSVENQU3luYyIsIHJ0Y3Bfc3luY190eXBlcyk7CisgIH0KKyAgcmV0dXJuIHJ0Y3Bfc3luY190eXBlOworfQorCisvKiBoZWxwZXIgb2JqZWN0cyAqLwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEJpblNlc3Npb24gR3N0UnRwQmluU2Vzc2lvbjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBCaW5TdHJlYW0gR3N0UnRwQmluU3RyZWFtOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEJpbkNsaWVudCBHc3RSdHBCaW5DbGllbnQ7CisKK3N0YXRpYyBndWludCBnc3RfcnRwX2Jpbl9zaWduYWxzW0xBU1RfU0lHTkFMXSA9IHsgMCB9OworCitzdGF0aWMgR3N0Q2FwcyAqcHRfbWFwX3JlcXVlc3RlZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIGd1aW50IHB0LAorICAgIEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzaW9uKTsKK3N0YXRpYyB2b2lkIHBheWxvYWRfdHlwZV9jaGFuZ2UgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBndWludCBwdCwKKyAgICBHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbik7CitzdGF0aWMgdm9pZCByZW1vdmVfcmVjdl9ydHAgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24pOworc3RhdGljIHZvaWQgcmVtb3ZlX3JlY3ZfcnRjcCAoR3N0UnRwQmluICogcnRwYmluLCBHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbik7CitzdGF0aWMgdm9pZCByZW1vdmVfc2VuZF9ydHAgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24pOworc3RhdGljIHZvaWQgcmVtb3ZlX3J0Y3AgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24pOworc3RhdGljIHZvaWQgZnJlZV9jbGllbnQgKEdzdFJ0cEJpbkNsaWVudCAqIGNsaWVudCwgR3N0UnRwQmluICogYmluKTsKK3N0YXRpYyB2b2lkIGZyZWVfc3RyZWFtIChHc3RSdHBCaW5TdHJlYW0gKiBzdHJlYW0sIEdzdFJ0cEJpbiAqIGJpbik7CitzdGF0aWMgR3N0UnRwQmluU2Vzc2lvbiAqY3JlYXRlX3Nlc3Npb24gKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgZ2ludCBpZCk7CitzdGF0aWMgR3N0UGFkICpjb21wbGV0ZV9zZXNzaW9uX3NpbmsgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwKKyAgICBHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbiwgZ2Jvb2xlYW4gYnVuZGxlX2RlbXV4ZXJfbmVlZGVkKTsKK3N0YXRpYyB2b2lkCitjb21wbGV0ZV9zZXNzaW9uX3JlY2VpdmVyIChHc3RSdHBCaW4gKiBydHBiaW4sIEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzaW9uLAorICAgIGd1aW50IHNlc3NpZCk7CitzdGF0aWMgR3N0UGFkICpjb21wbGV0ZV9zZXNzaW9uX3J0Y3AgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwKKyAgICBHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbiwgZ3VpbnQgc2Vzc2lkLCBnYm9vbGVhbiBidW5kbGVfZGVtdXhlcl9uZWVkZWQpOworCisvKiBNYW5hZ2VzIHRoZSBSVFAgc3RyZWFtIGZvciBvbmUgU1NSQy4KKyAqCisgKiBXZSBwaXBlIHRoZSBzdHJlYW0gKGNvbW1pbmcgZnJvbSB0aGUgU1NSQyBkZW11eGVyKSBpbnRvIGEgaml0dGVyYnVmZmVyLgorICogSWYgd2Ugc2VlIGFuIFNERVMgUlRDUCBwYWNrZXQgdGhhdCBsaW5rcyBtdWx0aXBsZSBTU1JDcyB0b2dldGhlciBiYXNlZCBvbiBhCisgKiBjb21tb24gQ05BTUUsIHdlIGNyZWF0ZSBhIEdzdFJ0cEJpbkNsaWVudCBzdHJ1Y3R1cmUgdG8gZ3JvdXAgdGhlIFNTUkNzCisgKiB0b2dldGhlciAoc2VlIGJlbG93KS4KKyAqLworc3RydWN0IF9Hc3RSdHBCaW5TdHJlYW0KK3sKKyAgLyogdGhlIFNTUkMgb2YgdGhpcyBzdHJlYW0gKi8KKyAgZ3VpbnQzMiBzc3JjOworCisgIC8qIHBhcmVudCBiaW4gKi8KKyAgR3N0UnRwQmluICpiaW47CisKKyAgLyogdGhlIHNlc3Npb24gdGhpcyBTU1JDIGJlbG9uZ3MgdG8gKi8KKyAgR3N0UnRwQmluU2Vzc2lvbiAqc2Vzc2lvbjsKKworICAvKiB0aGUgaml0dGVyYnVmZmVyIG9mIHRoZSBTU1JDICovCisgIEdzdEVsZW1lbnQgKmJ1ZmZlcjsKKyAgZ3Vsb25nIGJ1ZmZlcl9oYW5kbGVzeW5jX3NpZzsKKyAgZ3Vsb25nIGJ1ZmZlcl9wdHJlcV9zaWc7CisgIGd1bG9uZyBidWZmZXJfbnRwc3RvcF9zaWc7CisgIGdpbnQgcGVyY2VudDsKKworICAvKiB0aGUgUFQgZGVtdXhlciBvZiB0aGUgU1NSQyAqLworICBHc3RFbGVtZW50ICpkZW11eDsKKyAgZ3Vsb25nIGRlbXV4X25ld3BhZF9zaWc7CisgIGd1bG9uZyBkZW11eF9wYWRyZW1vdmVkX3NpZzsKKyAgZ3Vsb25nIGRlbXV4X3B0cmVxX3NpZzsKKyAgZ3Vsb25nIGRlbXV4X3B0Y2hhbmdlX3NpZzsKKworICAvKiBpZiB3ZSBoYXZlIGNhbGN1bGF0ZWQgYSB2YWxpZCBydF9kZWx0YSBmb3IgdGhpcyBzdHJlYW0gKi8KKyAgZ2Jvb2xlYW4gaGF2ZV9zeW5jOworICAvKiBtYXBwaW5nIHRvIGxvY2FsIFJUUCBhbmQgTlRQIHRpbWUgKi8KKyAgZ2ludDY0IHJ0X2RlbHRhOworICBnaW50NjQgcnRwX2RlbHRhOworICAvKiBiYXNlIHJ0cHRpbWUgaW4gZ3N0IHRpbWUgKi8KKyAgZ2ludDY0IGNsb2NrX2Jhc2U7Cit9OworCisjZGVmaW5lIEdTVF9SVFBfU0VTU0lPTl9MT0NLKHNlc3MpICAgZ19tdXRleF9sb2NrICgmKHNlc3MpLT5sb2NrKQorI2RlZmluZSBHU1RfUlRQX1NFU1NJT05fVU5MT0NLKHNlc3MpIGdfbXV0ZXhfdW5sb2NrICgmKHNlc3MpLT5sb2NrKQorCisvKiBNYW5hZ2VzIHRoZSByZWNlaXZpbmcgZW5kIG9mIHRoZSBwYWNrZXRzLgorICoKKyAqIFRoZXJlIGlzIG9uZSBzdWNoIHN0cnVjdHVyZSBmb3IgZWFjaCBSVFAgc2Vzc2lvbiAoYXVkaW8vdmlkZW8vLi4uKS4KKyAqIFdlIGdldCB0aGUgUlRQL1JUQ1AgcGFja2V0cyBhbmQgc3R1ZmYgdGhlbSBpbnRvIHRoZSBzZXNzaW9uIG1hbmFnZXIuIEZyb20KKyAqIHRoZXJlIHRoZXkgYXJlIHB1c2hlZCBpbnRvIGFuIFNTUkMgZGVtdXhlciB0aGF0IHNwbGl0cyB0aGUgc3RyZWFtIGJhc2VkIG9uCisgKiBTU1JDLiBFYWNoIG9mIHRoZSBTU1JDIHN0cmVhbXMgZ28gaW50byB0aGVpciBvd24gaml0dGVyYnVmZmVyIChtYW5hZ2VkIHdpdGgKKyAqIHRoZSBHc3RSdHBCaW5TdHJlYW0gYWJvdmUpLgorICovCitzdHJ1Y3QgX0dzdFJ0cEJpblNlc3Npb24KK3sKKyAgLyogc2Vzc2lvbiBpZCAqLworICBnaW50IGlkOworICAvKiB0aGUgcGFyZW50IGJpbiAqLworICBHc3RSdHBCaW4gKmJpbjsKKyAgLyogdGhlIHNlc3Npb24gZWxlbWVudCAqLworICBHc3RFbGVtZW50ICpzZXNzaW9uOworICAvKiB0aGUgU1NSQyBkZW11eGVyICovCisgIEdzdEVsZW1lbnQgKmRlbXV4OworICBndWxvbmcgZGVtdXhfbmV3cGFkX3NpZzsKKyAgZ3Vsb25nIGRlbXV4X3BhZHJlbW92ZWRfc2lnOworCisgIC8qIEJ1bmRsaW5nIHN1cHBvcnQgKi8KKyAgR3N0RWxlbWVudCAqcnRwX2Z1bm5lbDsKKyAgR3N0RWxlbWVudCAqcnRjcF9mdW5uZWw7CisgIEdzdEVsZW1lbnQgKmJ1bmRsZV9kZW11eDsKKyAgZ3Vsb25nIGJ1bmRsZV9kZW11eF9uZXdwYWRfc2lnOworCisgIEdNdXRleCBsb2NrOworCisgIC8qIGxpc3Qgb2YgR3N0UnRwQmluU3RyZWFtICovCisgIEdTTGlzdCAqc3RyZWFtczsKKworICAvKiBsaXN0IG9mIGVsZW1lbnRzICovCisgIEdTTGlzdCAqZWxlbWVudHM7CisKKyAgLyogbWFwcGluZyBvZiBwYXlsb2FkIHR5cGUgdG8gY2FwcyAqLworICBHSGFzaFRhYmxlICpwdG1hcDsKKworICAvKiB0aGUgcGFkcyBvZiB0aGUgc2Vzc2lvbiAqLworICBHc3RQYWQgKnJlY3ZfcnRwX3Npbms7CisgIEdzdFBhZCAqcmVjdl9ydHBfc2lua19naG9zdDsKKyAgR3N0UGFkICpyZWN2X3J0cF9zcmM7CisgIEdzdFBhZCAqcmVjdl9ydGNwX3Npbms7CisgIEdzdFBhZCAqcmVjdl9ydGNwX3NpbmtfZ2hvc3Q7CisgIEdzdFBhZCAqc3luY19zcmM7CisgIEdzdFBhZCAqc2VuZF9ydHBfc2luazsKKyAgR3N0UGFkICpzZW5kX3J0cF9zaW5rX2dob3N0OworICBHc3RQYWQgKnNlbmRfcnRwX3NyYzsKKyAgR3N0UGFkICpzZW5kX3J0cF9zcmNfZ2hvc3Q7CisgIEdzdFBhZCAqc2VuZF9ydGNwX3NyYzsKKyAgR3N0UGFkICpzZW5kX3J0Y3Bfc3JjX2dob3N0OworfTsKKworLyogTWFuYWdlcyB0aGUgUlRQIHN0cmVhbXMgdGhhdCBjb21lIGZyb20gb25lIGNsaWVudCBhbmQgc2hvdWxkIHRoZXJlZm9yZSBiZQorICogc3luY2hyb25pemVkLgorICovCitzdHJ1Y3QgX0dzdFJ0cEJpbkNsaWVudAoreworICAvKiB0aGUgY29tbW9uIENOQU1FIGZvciB0aGUgc3RyZWFtcyAqLworICBnY2hhciAqY25hbWU7CisgIGd1aW50IGNuYW1lX2xlbjsKKworICAvKiB0aGUgc3RyZWFtcyAqLworICBndWludCBuc3RyZWFtczsKKyAgR1NMaXN0ICpzdHJlYW1zOworfTsKKworLyogZmluZCBhIHNlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gaWQuIE11c3QgYmUgY2FsbGVkIHdpdGggUlRQX0JJTl9MT0NLICovCitzdGF0aWMgR3N0UnRwQmluU2Vzc2lvbiAqCitmaW5kX3Nlc3Npb25fYnlfaWQgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgZ2ludCBpZCkKK3sKKyAgR1NMaXN0ICp3YWxrOworCisgIGZvciAod2FsayA9IHJ0cGJpbi0+c2Vzc2lvbnM7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UnRwQmluU2Vzc2lvbiAqc2VzcyA9IChHc3RSdHBCaW5TZXNzaW9uICopIHdhbGstPmRhdGE7CisKKyAgICBpZiAoc2Vzcy0+aWQgPT0gaWQpCisgICAgICByZXR1cm4gc2VzczsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworLyogZmluZCBhIHNlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gcmVxdWVzdCBwYWQuIE11c3QgYmUgY2FsbGVkIHdpdGggUlRQX0JJTl9MT0NLICovCitzdGF0aWMgR3N0UnRwQmluU2Vzc2lvbiAqCitmaW5kX3Nlc3Npb25fYnlfcGFkIChHc3RSdHBCaW4gKiBydHBiaW4sIEdzdFBhZCAqIHBhZCkKK3sKKyAgR1NMaXN0ICp3YWxrOworCisgIGZvciAod2FsayA9IHJ0cGJpbi0+c2Vzc2lvbnM7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UnRwQmluU2Vzc2lvbiAqc2VzcyA9IChHc3RSdHBCaW5TZXNzaW9uICopIHdhbGstPmRhdGE7CisKKyAgICBpZiAoKHNlc3MtPnJlY3ZfcnRwX3NpbmtfZ2hvc3QgPT0gcGFkKSB8fAorICAgICAgICAoc2Vzcy0+cmVjdl9ydGNwX3NpbmtfZ2hvc3QgPT0gcGFkKSB8fAorICAgICAgICAoc2Vzcy0+c2VuZF9ydHBfc2lua19naG9zdCA9PSBwYWQpCisgICAgICAgIHx8IChzZXNzLT5zZW5kX3J0Y3Bfc3JjX2dob3N0ID09IHBhZCkpCisgICAgICByZXR1cm4gc2VzczsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK29uX25ld19zc3JjIChHc3RFbGVtZW50ICogc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjLCBHc3RSdHBCaW5TZXNzaW9uICogc2VzcykKK3sKKyAgZ19zaWduYWxfZW1pdCAoc2Vzcy0+YmluLCBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9ORVdfU1NSQ10sIDAsCisgICAgICBzZXNzLT5pZCwgc3NyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9zc3JjX2NvbGxpc2lvbiAoR3N0RWxlbWVudCAqIHNlc3Npb24sIGd1aW50MzIgc3NyYywgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3MpCit7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MtPmJpbiwgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfT05fU1NSQ19DT0xMSVNJT05dLCAwLAorICAgICAgc2Vzcy0+aWQsIHNzcmMpOworfQorCitzdGF0aWMgdm9pZAorb25fc3NyY192YWxpZGF0ZWQgKEdzdEVsZW1lbnQgKiBzZXNzaW9uLCBndWludDMyIHNzcmMsIEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzKQoreworICBnX3NpZ25hbF9lbWl0IChzZXNzLT5iaW4sIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfVkFMSURBVEVEXSwgMCwKKyAgICAgIHNlc3MtPmlkLCBzc3JjKTsKK30KKworc3RhdGljIHZvaWQKK29uX3NzcmNfYWN0aXZlIChHc3RFbGVtZW50ICogc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjLCBHc3RSdHBCaW5TZXNzaW9uICogc2VzcykKK3sKKyAgZ19zaWduYWxfZW1pdCAoc2Vzcy0+YmluLCBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9TU1JDX0FDVElWRV0sIDAsCisgICAgICBzZXNzLT5pZCwgc3NyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9zc3JjX3NkZXMgKEdzdEVsZW1lbnQgKiBzZXNzaW9uLCBndWludDMyIHNzcmMsIEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzKQoreworICBnX3NpZ25hbF9lbWl0IChzZXNzLT5iaW4sIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfU0RFU10sIDAsCisgICAgICBzZXNzLT5pZCwgc3NyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9ieWVfc3NyYyAoR3N0RWxlbWVudCAqIHNlc3Npb24sIGd1aW50MzIgc3NyYywgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3MpCit7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MtPmJpbiwgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfT05fQllFX1NTUkNdLCAwLAorICAgICAgc2Vzcy0+aWQsIHNzcmMpOworfQorCitzdGF0aWMgdm9pZAorb25fYnllX3RpbWVvdXQgKEdzdEVsZW1lbnQgKiBzZXNzaW9uLCBndWludDMyIHNzcmMsIEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzKQoreworICBnX3NpZ25hbF9lbWl0IChzZXNzLT5iaW4sIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX09OX0JZRV9USU1FT1VUXSwgMCwKKyAgICAgIHNlc3MtPmlkLCBzc3JjKTsKKworICBpZiAoc2Vzcy0+YmluLT5wcml2LT5hdXRvcmVtb3ZlKQorICAgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAoc2Vzcy0+ZGVtdXgsICJjbGVhci1zc3JjIiwgc3NyYywgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl90aW1lb3V0IChHc3RFbGVtZW50ICogc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjLCBHc3RSdHBCaW5TZXNzaW9uICogc2VzcykKK3sKKyAgZ19zaWduYWxfZW1pdCAoc2Vzcy0+YmluLCBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9USU1FT1VUXSwgMCwKKyAgICAgIHNlc3MtPmlkLCBzc3JjKTsKKworICBpZiAoc2Vzcy0+YmluLT5wcml2LT5hdXRvcmVtb3ZlKQorICAgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAoc2Vzcy0+ZGVtdXgsICJjbGVhci1zc3JjIiwgc3NyYywgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9zZW5kZXJfdGltZW91dCAoR3N0RWxlbWVudCAqIHNlc3Npb24sIGd1aW50MzIgc3NyYywgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3MpCit7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MtPmJpbiwgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfT05fU0VOREVSX1RJTUVPVVRdLCAwLAorICAgICAgc2Vzcy0+aWQsIHNzcmMpOworfQorCitzdGF0aWMgdm9pZAorb25fbnB0X3N0b3AgKEdzdEVsZW1lbnQgKiBqYnVmLCBHc3RSdHBCaW5TdHJlYW0gKiBzdHJlYW0pCit7CisgIGdfc2lnbmFsX2VtaXQgKHN0cmVhbS0+YmluLCBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9OUFRfU1RPUF0sIDAsCisgICAgICBzdHJlYW0tPnNlc3Npb24tPmlkLCBzdHJlYW0tPnNzcmMpOworfQorCitzdGF0aWMgdm9pZAorb25fbmV3X3NlbmRlcl9zc3JjIChHc3RFbGVtZW50ICogc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjLCBHc3RSdHBCaW5TZXNzaW9uICogc2VzcykKK3sKKyAgZ19zaWduYWxfZW1pdCAoc2Vzcy0+YmluLCBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9ORVdfU0VOREVSX1NTUkNdLCAwLAorICAgICAgc2Vzcy0+aWQsIHNzcmMpOworfQorCitzdGF0aWMgdm9pZAorb25fc2VuZGVyX3NzcmNfYWN0aXZlIChHc3RFbGVtZW50ICogc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjLAorICAgIEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzKQoreworICBnX3NpZ25hbF9lbWl0IChzZXNzLT5iaW4sIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX09OX1NFTkRFUl9TU1JDX0FDVElWRV0sCisgICAgICAwLCBzZXNzLT5pZCwgc3NyYyk7Cit9CisKKy8qIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIFNFU1NJT04gbG9jayAqLworc3RhdGljIEdzdFJ0cEJpblN0cmVhbSAqCitmaW5kX3N0cmVhbV9ieV9zc3JjIChHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjKQoreworICBHU0xpc3QgKndhbGs7CisKKyAgZm9yICh3YWxrID0gc2Vzc2lvbi0+c3RyZWFtczsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RSdHBCaW5TdHJlYW0gKnN0cmVhbSA9IChHc3RSdHBCaW5TdHJlYW0gKikgd2Fsay0+ZGF0YTsKKworICAgIGlmIChzdHJlYW0tPnNzcmMgPT0gc3NyYykKKyAgICAgIHJldHVybiBzdHJlYW07CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitzc3JjX2RlbXV4X3BhZF9yZW1vdmVkIChHc3RFbGVtZW50ICogZWxlbWVudCwgZ3VpbnQgc3NyYywgR3N0UGFkICogcGFkLAorICAgIEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzaW9uKQoreworICBHc3RSdHBCaW5TdHJlYW0gKnN0cmVhbSA9IE5VTEw7CisgIEdzdFJ0cEJpbiAqcnRwYmluOworCisgIHJ0cGJpbiA9IHNlc3Npb24tPmJpbjsKKworICBHU1RfUlRQX0JJTl9MT0NLIChydHBiaW4pOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChzZXNzaW9uKTsKKyAgaWYgKChzdHJlYW0gPSBmaW5kX3N0cmVhbV9ieV9zc3JjIChzZXNzaW9uLCBzc3JjKSkpCisgICAgc2Vzc2lvbi0+c3RyZWFtcyA9IGdfc2xpc3RfcmVtb3ZlIChzZXNzaW9uLT5zdHJlYW1zLCBzdHJlYW0pOworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzaW9uKTsKKworICBpZiAoc3RyZWFtKQorICAgIGZyZWVfc3RyZWFtIChzdHJlYW0sIHJ0cGJpbik7CisKKyAgR1NUX1JUUF9CSU5fVU5MT0NLIChydHBiaW4pOworfQorCitzdGF0aWMgdm9pZAorbmV3X2J1bmRsZWRfc3NyY19wYWRfZm91bmQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBndWludCBzc3JjLCBHc3RQYWQgKiBwYWQsCisgICAgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24pCit7CisgIEdWYWx1ZSByZXN1bHQgPSBHX1ZBTFVFX0lOSVQ7CisgIEdWYWx1ZSBwYXJhbXNbMl0gPSB7IEdfVkFMVUVfSU5JVCwgR19WQUxVRV9JTklUIH07CisgIGd1aW50IHNlc3Npb25faWQgPSAwOworICBHc3RSdHBCaW5TZXNzaW9uICp0YXJnZXRfc2Vzc2lvbiA9IE5VTEw7CisgIEdzdFJ0cEJpbiAqcnRwYmluID0gc2Vzc2lvbi0+YmluOworICBnY2hhciAqbmFtZTsKKyAgR3N0UGFkICpzcmNfcGFkOworICBHc3RQYWQgKnJlY3ZfcnRwX3NpbmsgPSBOVUxMOworICBHc3RQYWQgKnJlY3ZfcnRjcF9zaW5rID0gTlVMTDsKKyAgR3N0UGFkTGlua1JldHVybiByZXQ7CisKKyAgR1NUX1JUUF9CSU5fRFlOX0xPQ0sgKHJ0cGJpbik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgIm5ldyBidW5kbGVkIFNTUkMgcGFkICUwOHgsICVzOiVzIiwgc3NyYywKKyAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAocGFkKSk7CisKKyAgZ192YWx1ZV9pbml0ICgmcmVzdWx0LCBHX1RZUEVfVUlOVCk7CisgIGdfdmFsdWVfaW5pdCAoJnBhcmFtc1swXSwgR1NUX1RZUEVfRUxFTUVOVCk7CisgIGdfdmFsdWVfc2V0X29iamVjdCAoJnBhcmFtc1swXSwgcnRwYmluKTsKKyAgZ192YWx1ZV9pbml0ICgmcGFyYW1zWzFdLCBHX1RZUEVfVUlOVCk7CisgIGdfdmFsdWVfc2V0X3VpbnQgKCZwYXJhbXNbMV0sIHNzcmMpOworCisgIGdfc2lnbmFsX2VtaXR2IChwYXJhbXMsCisgICAgICBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9CVU5ETEVEX1NTUkNdLCAwLCAmcmVzdWx0KTsKKyAgZ192YWx1ZV91bnNldCAoJnBhcmFtc1swXSk7CisKKyAgc2Vzc2lvbl9pZCA9IGdfdmFsdWVfZ2V0X3VpbnQgKCZyZXN1bHQpOworICBpZiAoc2Vzc2lvbl9pZCA9PSAwKSB7CisgICAgdGFyZ2V0X3Nlc3Npb24gPSBzZXNzaW9uOworICB9IGVsc2UgeworICAgIHRhcmdldF9zZXNzaW9uID0gZmluZF9zZXNzaW9uX2J5X2lkIChydHBiaW4sIChnaW50KSBzZXNzaW9uX2lkKTsKKyAgICBpZiAoIXRhcmdldF9zZXNzaW9uKSB7CisgICAgICB0YXJnZXRfc2Vzc2lvbiA9IGNyZWF0ZV9zZXNzaW9uIChydHBiaW4sIHNlc3Npb25faWQpOworICAgIH0KKyAgICBpZiAoIXRhcmdldF9zZXNzaW9uKSB7CisgICAgICAvKiBjcmVhdGVfc2Vzc2lvbigpIHdhcm5lZCBhbHJlYWR5ICovCisgICAgICBHU1RfUlRQX0JJTl9EWU5fVU5MT0NLIChydHBiaW4pOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghdGFyZ2V0X3Nlc3Npb24tPnJlY3ZfcnRwX3NpbmspIHsKKyAgICAgIHJlY3ZfcnRwX3NpbmsgPSBjb21wbGV0ZV9zZXNzaW9uX3NpbmsgKHJ0cGJpbiwgdGFyZ2V0X3Nlc3Npb24sIEZBTFNFKTsKKyAgICB9CisKKyAgICBpZiAoIXRhcmdldF9zZXNzaW9uLT5yZWN2X3J0cF9zcmMpCisgICAgICBjb21wbGV0ZV9zZXNzaW9uX3JlY2VpdmVyIChydHBiaW4sIHRhcmdldF9zZXNzaW9uLCBzZXNzaW9uX2lkKTsKKworICAgIGlmICghdGFyZ2V0X3Nlc3Npb24tPnJlY3ZfcnRjcF9zaW5rKSB7CisgICAgICByZWN2X3J0Y3Bfc2luayA9CisgICAgICAgICAgY29tcGxldGVfc2Vzc2lvbl9ydGNwIChydHBiaW4sIHRhcmdldF9zZXNzaW9uLCBzZXNzaW9uX2lkLCBGQUxTRSk7CisgICAgfQorICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwYmluLCAiQXNzaWduaW5nIGJ1bmRsZWQgc3NyYyAldSB0byBzZXNzaW9uICV1Iiwgc3NyYywKKyAgICAgIHNlc3Npb25faWQpOworCisgIGlmICghcmVjdl9ydHBfc2luaykgeworICAgIHJlY3ZfcnRwX3NpbmsgPQorICAgICAgICBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHRhcmdldF9zZXNzaW9uLT5ydHBfZnVubmVsLCAic2lua18ldSIpOworICB9CisKKyAgaWYgKCFyZWN2X3J0Y3Bfc2luaykgeworICAgIHJlY3ZfcnRjcF9zaW5rID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkICh0YXJnZXRfc2Vzc2lvbi0+cnRjcF9mdW5uZWwsICJzaW5rXyV1Iik7CisgIH0KKworICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic3JjXyV1Iiwgc3NyYyk7CisgIHNyY19wYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZWxlbWVudCwgbmFtZSk7CisgIHJldCA9IGdzdF9wYWRfbGluayAoc3JjX3BhZCwgcmVjdl9ydHBfc2luayk7CisgIGdfZnJlZSAobmFtZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY19wYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChyZWN2X3J0cF9zaW5rKTsKKyAgaWYgKHJldCAhPSBHU1RfUEFEX0xJTktfT0spIHsKKyAgICBnX3dhcm5pbmcKKyAgICAgICAgKCJydHBiaW46IGZhaWxlZCB0byBsaW5rIGJ1bmRsZSBkZW11eGVyIHRvIHJlY2VpdmUgcnRwIGZ1bm5lbCBmb3Igc2Vzc2lvbiAldSIsCisgICAgICAgIHNlc3Npb25faWQpOworICB9CisKKyAgbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInJ0Y3Bfc3JjXyV1Iiwgc3NyYyk7CisgIHNyY19wYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZWxlbWVudCwgbmFtZSk7CisgIGdzdF9wYWRfbGluayAoc3JjX3BhZCwgcmVjdl9ydGNwX3NpbmspOworICBnX2ZyZWUgKG5hbWUpOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNfcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocmVjdl9ydGNwX3NpbmspOworICBpZiAocmV0ICE9IEdTVF9QQURfTElOS19PSykgeworICAgIGdfd2FybmluZworICAgICAgICAoInJ0cGJpbjogZmFpbGVkIHRvIGxpbmsgYnVuZGxlIGRlbXV4ZXIgdG8gcmVjZWl2ZSBydGNwIHNpbmsgcGFkIGZvciBzZXNzaW9uICV1IiwKKyAgICAgICAgc2Vzc2lvbl9pZCk7CisgIH0KKworICBHU1RfUlRQX0JJTl9EWU5fVU5MT0NLIChydHBiaW4pOworfQorCisvKiBjcmVhdGUgYSBzZXNzaW9uIHdpdGggdGhlIGdpdmVuIGlkLiAgTXVzdCBiZSBjYWxsZWQgd2l0aCBSVFBfQklOX0xPQ0sgKi8KK3N0YXRpYyBHc3RSdHBCaW5TZXNzaW9uICoKK2NyZWF0ZV9zZXNzaW9uIChHc3RSdHBCaW4gKiBydHBiaW4sIGdpbnQgaWQpCit7CisgIEdzdFJ0cEJpblNlc3Npb24gKnNlc3M7CisgIEdzdEVsZW1lbnQgKnNlc3Npb24sICpkZW11eDsKKyAgR3N0U3RhdGUgdGFyZ2V0OworCisgIGlmICghKHNlc3Npb24gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBzZXNzaW9uIiwgTlVMTCkpKQorICAgIGdvdG8gbm9fc2Vzc2lvbjsKKworICBpZiAoIShkZW11eCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cHNzcmNkZW11eCIsIE5VTEwpKSkKKyAgICBnb3RvIG5vX2RlbXV4OworCisgIHNlc3MgPSBnX25ldzAgKEdzdFJ0cEJpblNlc3Npb24sIDEpOworICBnX211dGV4X2luaXQgKCZzZXNzLT5sb2NrKTsKKyAgc2Vzcy0+aWQgPSBpZDsKKyAgc2Vzcy0+YmluID0gcnRwYmluOworICBzZXNzLT5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgc2Vzcy0+ZGVtdXggPSBkZW11eDsKKworICBzZXNzLT5ydHBfZnVubmVsID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZnVubmVsIiwgTlVMTCk7CisgIHNlc3MtPnJ0Y3BfZnVubmVsID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZnVubmVsIiwgTlVMTCk7CisKKyAgc2Vzcy0+cHRtYXAgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9jYXBzX3VucmVmKTsKKyAgcnRwYmluLT5zZXNzaW9ucyA9IGdfc2xpc3RfcHJlcGVuZCAocnRwYmluLT5zZXNzaW9ucywgc2Vzcyk7CisKKyAgLyogY29uZmlndXJlIFNERVMgaXRlbXMgKi8KKyAgR1NUX09CSkVDVF9MT0NLIChydHBiaW4pOworICBnX29iamVjdF9zZXQgKHNlc3Npb24sICJzZGVzIiwgcnRwYmluLT5zZGVzLCAicnRwLXByb2ZpbGUiLAorICAgICAgcnRwYmluLT5ydHBfcHJvZmlsZSwgInJ0Y3Atc3luYy1zZW5kLXRpbWUiLCBydHBiaW4tPnJ0Y3Bfc3luY19zZW5kX3RpbWUsCisgICAgICBOVUxMKTsKKyAgaWYgKHJ0cGJpbi0+dXNlX3BpcGVsaW5lX2Nsb2NrKQorICAgIGdfb2JqZWN0X3NldCAoc2Vzc2lvbiwgInVzZS1waXBlbGluZS1jbG9jayIsIHJ0cGJpbi0+dXNlX3BpcGVsaW5lX2Nsb2NrLAorICAgICAgICBOVUxMKTsKKyAgZWxzZQorICAgIGdfb2JqZWN0X3NldCAoc2Vzc2lvbiwgIm50cC10aW1lLXNvdXJjZSIsIHJ0cGJpbi0+bnRwX3RpbWVfc291cmNlLCBOVUxMKTsKKworICBnX29iamVjdF9zZXQgKHNlc3Npb24sICJtYXgtZHJvcG91dC10aW1lIiwgcnRwYmluLT5tYXhfZHJvcG91dF90aW1lLAorICAgICAgIm1heC1taXNvcmRlci10aW1lIiwgcnRwYmluLT5tYXhfbWlzb3JkZXJfdGltZSwgTlVMTCk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHBiaW4pOworCisgIC8qIHByb3ZpZGUgY2xvY2tfcmF0ZSB0byB0aGUgc2Vzc2lvbiBtYW5hZ2VyIHdoZW4gbmVlZGVkICovCisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNlc3Npb24sICJyZXF1ZXN0LXB0LW1hcCIsCisgICAgICAoR0NhbGxiYWNrKSBwdF9tYXBfcmVxdWVzdGVkLCBzZXNzKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChzZXNzLT5zZXNzaW9uLCAib24tbmV3LXNzcmMiLAorICAgICAgKEdDYWxsYmFjaykgb25fbmV3X3NzcmMsIHNlc3MpOworICBnX3NpZ25hbF9jb25uZWN0IChzZXNzLT5zZXNzaW9uLCAib24tc3NyYy1jb2xsaXNpb24iLAorICAgICAgKEdDYWxsYmFjaykgb25fc3NyY19jb2xsaXNpb24sIHNlc3MpOworICBnX3NpZ25hbF9jb25uZWN0IChzZXNzLT5zZXNzaW9uLCAib24tc3NyYy12YWxpZGF0ZWQiLAorICAgICAgKEdDYWxsYmFjaykgb25fc3NyY192YWxpZGF0ZWQsIHNlc3MpOworICBnX3NpZ25hbF9jb25uZWN0IChzZXNzLT5zZXNzaW9uLCAib24tc3NyYy1hY3RpdmUiLAorICAgICAgKEdDYWxsYmFjaykgb25fc3NyY19hY3RpdmUsIHNlc3MpOworICBnX3NpZ25hbF9jb25uZWN0IChzZXNzLT5zZXNzaW9uLCAib24tc3NyYy1zZGVzIiwKKyAgICAgIChHQ2FsbGJhY2spIG9uX3NzcmNfc2Rlcywgc2Vzcyk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNlc3MtPnNlc3Npb24sICJvbi1ieWUtc3NyYyIsCisgICAgICAoR0NhbGxiYWNrKSBvbl9ieWVfc3NyYywgc2Vzcyk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNlc3MtPnNlc3Npb24sICJvbi1ieWUtdGltZW91dCIsCisgICAgICAoR0NhbGxiYWNrKSBvbl9ieWVfdGltZW91dCwgc2Vzcyk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNlc3MtPnNlc3Npb24sICJvbi10aW1lb3V0IiwgKEdDYWxsYmFjaykgb25fdGltZW91dCwgc2Vzcyk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNlc3MtPnNlc3Npb24sICJvbi1zZW5kZXItdGltZW91dCIsCisgICAgICAoR0NhbGxiYWNrKSBvbl9zZW5kZXJfdGltZW91dCwgc2Vzcyk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNlc3MtPnNlc3Npb24sICJvbi1uZXctc2VuZGVyLXNzcmMiLAorICAgICAgKEdDYWxsYmFjaykgb25fbmV3X3NlbmRlcl9zc3JjLCBzZXNzKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoc2Vzcy0+c2Vzc2lvbiwgIm9uLXNlbmRlci1zc3JjLWFjdGl2ZSIsCisgICAgICAoR0NhbGxiYWNrKSBvbl9zZW5kZXJfc3NyY19hY3RpdmUsIHNlc3MpOworCisgIGdzdF9iaW5fYWRkIChHU1RfQklOX0NBU1QgKHJ0cGJpbiksIHNlc3Npb24pOworICBnc3RfYmluX2FkZCAoR1NUX0JJTl9DQVNUIChydHBiaW4pLCBkZW11eCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOX0NBU1QgKHJ0cGJpbiksIHNlc3MtPnJ0cF9mdW5uZWwpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTl9DQVNUIChydHBiaW4pLCBzZXNzLT5ydGNwX2Z1bm5lbCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChydHBiaW4pOworICB0YXJnZXQgPSBHU1RfU1RBVEVfVEFSR0VUIChydHBiaW4pOworICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwYmluKTsKKworICAvKiBjaGFuZ2Ugc3RhdGUgb25seSB0byB3aGF0J3MgbmVlZGVkICovCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZGVtdXgsIHRhcmdldCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc2Vzc2lvbiwgdGFyZ2V0KTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzZXNzLT5ydHBfZnVubmVsLCB0YXJnZXQpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNlc3MtPnJ0Y3BfZnVubmVsLCB0YXJnZXQpOworCisgIHJldHVybiBzZXNzOworCisgIC8qIEVSUk9SUyAqLworbm9fc2Vzc2lvbjoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogY291bGQgbm90IGNyZWF0ZSBydHBzZXNzaW9uIGVsZW1lbnQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorbm9fZGVtdXg6CisgIHsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzZXNzaW9uKTsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGNvdWxkIG5vdCBjcmVhdGUgcnRwc3NyY2RlbXV4IGVsZW1lbnQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2Jpbl9tYW5hZ2VfZWxlbWVudCAoR3N0UnRwQmluICogYmluLCBHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgR3N0UnRwQmluUHJpdmF0ZSAqcHJpdiA9IGJpbi0+cHJpdjsKKworICBpZiAoZ19saXN0X2ZpbmQgKHByaXYtPmVsZW1lbnRzLCBlbGVtZW50KSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgInJlcXVlc3RlZCBlbGVtZW50ICVwIGFscmVhZHkgaW4gYmluIiwgZWxlbWVudCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAiYWRkaW5nIHJlcXVlc3RlZCBlbGVtZW50ICVwIiwgZWxlbWVudCk7CisKKyAgICBpZiAoZ19vYmplY3RfaXNfZmxvYXRpbmcgKGVsZW1lbnQpKQorICAgICAgZWxlbWVudCA9IGdzdF9vYmplY3RfcmVmX3NpbmsgKGVsZW1lbnQpOworCisgICAgaWYgKCFnc3RfYmluX2FkZCAoR1NUX0JJTl9DQVNUIChiaW4pLCBlbGVtZW50KSkKKyAgICAgIGdvdG8gYWRkX2ZhaWxlZDsKKyAgICBpZiAoIWdzdF9lbGVtZW50X3N5bmNfc3RhdGVfd2l0aF9wYXJlbnQgKGVsZW1lbnQpKQorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChiaW4sICJ1bmFibGUgdG8gc3luYyBlbGVtZW50IHN0YXRlIHdpdGggcnRwYmluIik7CisgIH0KKyAgLyogd2UgYWRkIHRoZSBlbGVtZW50IG11bHRpcGxlIHRpbWVzLCBlYWNoIHdlIG5lZWQgYW4gZXF1YWwgbnVtYmVyIG9mCisgICAqIHJlbW92ZXMgdG8gcmVhbGx5IHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBiaW4gKi8KKyAgcHJpdi0+ZWxlbWVudHMgPSBnX2xpc3RfcHJlcGVuZCAocHJpdi0+ZWxlbWVudHMsIGVsZW1lbnQpOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworYWRkX2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYmluLCAidW5hYmxlIHRvIGFkZCBlbGVtZW50Iik7CisgICAgZ3N0X29iamVjdF91bnJlZiAoZWxlbWVudCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfYmluX2VsZW1lbnQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RSdHBCaW4gKiBiaW4pCit7CisgIEdzdFJ0cEJpblByaXZhdGUgKnByaXYgPSBiaW4tPnByaXY7CisgIEdMaXN0ICpmaW5kOworCisgIGZpbmQgPSBnX2xpc3RfZmluZCAocHJpdi0+ZWxlbWVudHMsIGVsZW1lbnQpOworICBpZiAoZmluZCkgeworICAgIHByaXYtPmVsZW1lbnRzID0gZ19saXN0X2RlbGV0ZV9saW5rIChwcml2LT5lbGVtZW50cywgZmluZCk7CisKKyAgICBpZiAoIWdfbGlzdF9maW5kIChwcml2LT5lbGVtZW50cywgZWxlbWVudCkpIHsKKyAgICAgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKGVsZW1lbnQsIFRSVUUpOworICAgICAgZ3N0X2Jpbl9yZW1vdmUgKEdTVF9CSU5fQ0FTVCAoYmluKSwgZWxlbWVudCk7CisgICAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9OVUxMKTsKKyAgICB9CisKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChlbGVtZW50KTsKKyAgfQorfQorCisvKiBjYWxsZWQgd2l0aCBSVFBfQklOX0xPQ0sgKi8KK3N0YXRpYyB2b2lkCitmcmVlX3Nlc3Npb24gKEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzLCBHc3RSdHBCaW4gKiBiaW4pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgImZyZWVpbmcgc2Vzc2lvbiAlcCIsIHNlc3MpOworCisgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHNlc3MtPmRlbXV4LCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSAoc2Vzcy0+c2Vzc2lvbiwgVFJVRSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzZXNzLT5kZW11eCwgR1NUX1NUQVRFX05VTEwpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNlc3MtPnNlc3Npb24sIEdTVF9TVEFURV9OVUxMKTsKKworICByZW1vdmVfcmVjdl9ydHAgKGJpbiwgc2Vzcyk7CisgIHJlbW92ZV9yZWN2X3J0Y3AgKGJpbiwgc2Vzcyk7CisgIHJlbW92ZV9zZW5kX3J0cCAoYmluLCBzZXNzKTsKKyAgcmVtb3ZlX3J0Y3AgKGJpbiwgc2Vzcyk7CisKKyAgZ3N0X2Jpbl9yZW1vdmUgKEdTVF9CSU5fQ0FTVCAoYmluKSwgc2Vzcy0+c2Vzc2lvbik7CisgIGdzdF9iaW5fcmVtb3ZlIChHU1RfQklOX0NBU1QgKGJpbiksIHNlc3MtPmRlbXV4KTsKKworICBnX3NsaXN0X2ZvcmVhY2ggKHNlc3MtPmVsZW1lbnRzLCAoR0Z1bmMpIHJlbW92ZV9iaW5fZWxlbWVudCwgYmluKTsKKyAgZ19zbGlzdF9mcmVlIChzZXNzLT5lbGVtZW50cyk7CisKKyAgZ19zbGlzdF9mb3JlYWNoIChzZXNzLT5zdHJlYW1zLCAoR0Z1bmMpIGZyZWVfc3RyZWFtLCBiaW4pOworICBnX3NsaXN0X2ZyZWUgKHNlc3MtPnN0cmVhbXMpOworCisgIGdfbXV0ZXhfY2xlYXIgKCZzZXNzLT5sb2NrKTsKKyAgZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKHNlc3MtPnB0bWFwKTsKKworICBnX2ZyZWUgKHNlc3MpOworfQorCisvKiBnZXQgdGhlIHBheWxvYWQgdHlwZSBjYXBzIGZvciB0aGUgc3BlY2lmaWMgcGF5bG9hZCBAcHQgaW4gQHNlc3Npb24gKi8KK3N0YXRpYyBHc3RDYXBzICoKK2dldF9wdF9tYXAgKEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzaW9uLCBndWludCBwdCkKK3sKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisgIEdzdFJ0cEJpbiAqYmluOworICBHVmFsdWUgcmV0ID0geyAwIH07CisgIEdWYWx1ZSBhcmdzWzNdID0geyB7MH0sIHswfSwgezB9IH07CisKKyAgR1NUX0RFQlVHICgic2VhcmNoaW5nIHB0ICV1IGluIGNhY2hlIiwgcHQpOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChzZXNzaW9uKTsKKworICAvKiBmaXJzdCBsb29rIGluIHRoZSBjYWNoZSAqLworICBjYXBzID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAoc2Vzc2lvbi0+cHRtYXAsIEdJTlRfVE9fUE9JTlRFUiAocHQpKTsKKyAgaWYgKGNhcHMpIHsKKyAgICBnc3RfY2Fwc19yZWYgKGNhcHMpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGJpbiA9IHNlc3Npb24tPmJpbjsKKworICBHU1RfREVCVUcgKCJlbWl0aW5nIHNpZ25hbCBmb3IgcHQgJXUgaW4gc2Vzc2lvbiAldSIsIHB0LCBzZXNzaW9uLT5pZCk7CisKKyAgLyogbm90IGluIGNhY2hlLCBzZW5kIHNpZ25hbCB0byByZXF1ZXN0IGNhcHMgKi8KKyAgZ192YWx1ZV9pbml0ICgmYXJnc1swXSwgR1NUX1RZUEVfRUxFTUVOVCk7CisgIGdfdmFsdWVfc2V0X29iamVjdCAoJmFyZ3NbMF0sIGJpbik7CisgIGdfdmFsdWVfaW5pdCAoJmFyZ3NbMV0sIEdfVFlQRV9VSU5UKTsKKyAgZ192YWx1ZV9zZXRfdWludCAoJmFyZ3NbMV0sIHNlc3Npb24tPmlkKTsKKyAgZ192YWx1ZV9pbml0ICgmYXJnc1syXSwgR19UWVBFX1VJTlQpOworICBnX3ZhbHVlX3NldF91aW50ICgmYXJnc1syXSwgcHQpOworCisgIGdfdmFsdWVfaW5pdCAoJnJldCwgR1NUX1RZUEVfQ0FQUyk7CisgIGdfdmFsdWVfc2V0X2JveGVkICgmcmV0LCBOVUxMKTsKKworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzaW9uKTsKKworICBnX3NpZ25hbF9lbWl0diAoYXJncywgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfUkVRVUVTVF9QVF9NQVBdLCAwLCAmcmV0KTsKKworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAoc2Vzc2lvbik7CisKKyAgZ192YWx1ZV91bnNldCAoJmFyZ3NbMF0pOworICBnX3ZhbHVlX3Vuc2V0ICgmYXJnc1sxXSk7CisgIGdfdmFsdWVfdW5zZXQgKCZhcmdzWzJdKTsKKworICAvKiBsb29rIGluIHRoZSBjYWNoZSBhZ2FpbiBiZWNhdXNlIHdlIGxldCB0aGUgbG9jayBnbyAqLworICBjYXBzID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAoc2Vzc2lvbi0+cHRtYXAsIEdJTlRfVE9fUE9JTlRFUiAocHQpKTsKKyAgaWYgKGNhcHMpIHsKKyAgICBnc3RfY2Fwc19yZWYgKGNhcHMpOworICAgIGdfdmFsdWVfdW5zZXQgKCZyZXQpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGNhcHMgPSAoR3N0Q2FwcyAqKSBnX3ZhbHVlX2R1cF9ib3hlZCAoJnJldCk7CisgIGdfdmFsdWVfdW5zZXQgKCZyZXQpOworICBpZiAoIWNhcHMpCisgICAgZ290byBub19jYXBzOworCisgIEdTVF9ERUJVRyAoImNhY2hpbmcgcHQgJXUgYXMgJSIgR1NUX1BUUl9GT1JNQVQsIHB0LCBjYXBzKTsKKworICAvKiBzdG9yZSBpbiBjYWNoZSwgdGFrZSBhZGRpdGlvbmFsIHJlZiAqLworICBnX2hhc2hfdGFibGVfaW5zZXJ0IChzZXNzaW9uLT5wdG1hcCwgR0lOVF9UT19QT0lOVEVSIChwdCksCisgICAgICBnc3RfY2Fwc19yZWYgKGNhcHMpKTsKKworZG9uZToKKyAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzc2lvbik7CisKKyAgcmV0dXJuIGNhcHM7CisKKyAgLyogRVJST1JTICovCitub19jYXBzOgorICB7CisgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzc2lvbik7CisgICAgR1NUX0RFQlVHICgibm8gcHQgbWFwIGNvdWxkIGJlIG9idGFpbmVkIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCityZXR1cm5fdHJ1ZSAoZ3BvaW50ZXIga2V5LCBncG9pbnRlciB2YWx1ZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYmluX3Jlc2V0X3N5bmMgKEdzdFJ0cEJpbiAqIHJ0cGJpbikKK3sKKyAgR1NMaXN0ICpjbGllbnRzLCAqc3RyZWFtczsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJSZXNldCBzeW5jIG9uIGFsbCBjbGllbnRzIik7CisKKyAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKyAgZm9yIChjbGllbnRzID0gcnRwYmluLT5jbGllbnRzOyBjbGllbnRzOyBjbGllbnRzID0gZ19zbGlzdF9uZXh0IChjbGllbnRzKSkgeworICAgIEdzdFJ0cEJpbkNsaWVudCAqY2xpZW50ID0gKEdzdFJ0cEJpbkNsaWVudCAqKSBjbGllbnRzLT5kYXRhOworCisgICAgLyogcmVzZXQgc3luYyBvbiBhbGwgc3RyZWFtcyBmb3IgdGhpcyBjbGllbnQgKi8KKyAgICBmb3IgKHN0cmVhbXMgPSBjbGllbnQtPnN0cmVhbXM7IHN0cmVhbXM7IHN0cmVhbXMgPSBnX3NsaXN0X25leHQgKHN0cmVhbXMpKSB7CisgICAgICBHc3RSdHBCaW5TdHJlYW0gKnN0cmVhbSA9IChHc3RSdHBCaW5TdHJlYW0gKikgc3RyZWFtcy0+ZGF0YTsKKworICAgICAgLyogbWFrZSB1c2UgcmVxdWlyZSBhIG5ldyBTUiBwYWNrZXQgZm9yIHRoaXMgc3RyZWFtIGJlZm9yZSB3ZSBhdHRlbXB0IG5ldworICAgICAgICogbGlwLXN5bmMgKi8KKyAgICAgIHN0cmVhbS0+aGF2ZV9zeW5jID0gRkFMU0U7CisgICAgICBzdHJlYW0tPnJ0X2RlbHRhID0gMDsKKyAgICAgIHN0cmVhbS0+cnRwX2RlbHRhID0gMDsKKyAgICAgIHN0cmVhbS0+Y2xvY2tfYmFzZSA9IC0xMDAgKiBHU1RfU0VDT05EOworICAgIH0KKyAgfQorICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Jpbl9jbGVhcl9wdF9tYXAgKEdzdFJ0cEJpbiAqIGJpbikKK3sKKyAgR1NMaXN0ICpzZXNzaW9ucywgKnN0cmVhbXM7CisKKyAgR1NUX1JUUF9CSU5fTE9DSyAoYmluKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAiY2xlYXJpbmcgcHQgbWFwIik7CisgIGZvciAoc2Vzc2lvbnMgPSBiaW4tPnNlc3Npb25zOyBzZXNzaW9uczsgc2Vzc2lvbnMgPSBnX3NsaXN0X25leHQgKHNlc3Npb25zKSkgeworICAgIEdzdFJ0cEJpblNlc3Npb24gKnNlc3Npb24gPSAoR3N0UnRwQmluU2Vzc2lvbiAqKSBzZXNzaW9ucy0+ZGF0YTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgImNsZWFyaW5nIHNlc3Npb24gJXAiLCBzZXNzaW9uKTsKKyAgICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHNlc3Npb24tPnNlc3Npb24sICJjbGVhci1wdC1tYXAiLCBOVUxMKTsKKworICAgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChzZXNzaW9uKTsKKyAgICBnX2hhc2hfdGFibGVfZm9yZWFjaF9yZW1vdmUgKHNlc3Npb24tPnB0bWFwLCByZXR1cm5fdHJ1ZSwgTlVMTCk7CisKKyAgICBmb3IgKHN0cmVhbXMgPSBzZXNzaW9uLT5zdHJlYW1zOyBzdHJlYW1zOyBzdHJlYW1zID0gZ19zbGlzdF9uZXh0IChzdHJlYW1zKSkgeworICAgICAgR3N0UnRwQmluU3RyZWFtICpzdHJlYW0gPSAoR3N0UnRwQmluU3RyZWFtICopIHN0cmVhbXMtPmRhdGE7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgImNsZWFyaW5nIHN0cmVhbSAlcCIsIHN0cmVhbSk7CisgICAgICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHN0cmVhbS0+YnVmZmVyLCAiY2xlYXItcHQtbWFwIiwgTlVMTCk7CisgICAgICBpZiAoc3RyZWFtLT5kZW11eCkKKyAgICAgICAgZ19zaWduYWxfZW1pdF9ieV9uYW1lIChzdHJlYW0tPmRlbXV4LCAiY2xlYXItcHQtbWFwIiwgTlVMTCk7CisgICAgfQorICAgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3Npb24pOworICB9CisgIEdTVF9SVFBfQklOX1VOTE9DSyAoYmluKTsKKworICAvKiByZXNldCBzeW5jIHRvbyAqLworICBnc3RfcnRwX2Jpbl9yZXNldF9zeW5jIChiaW4pOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitnc3RfcnRwX2Jpbl9nZXRfc2Vzc2lvbiAoR3N0UnRwQmluICogYmluLCBndWludCBzZXNzaW9uX2lkKQoreworICBHc3RSdHBCaW5TZXNzaW9uICpzZXNzaW9uOworICBHc3RFbGVtZW50ICpyZXQgPSBOVUxMOworCisgIEdTVF9SVFBfQklOX0xPQ0sgKGJpbik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgInJldHJpZXZpbmcgR3N0UnRwU2Vzc2lvbiwgaW5kZXg6ICV1Iiwgc2Vzc2lvbl9pZCk7CisgIHNlc3Npb24gPSBmaW5kX3Nlc3Npb25fYnlfaWQgKGJpbiwgKGdpbnQpIHNlc3Npb25faWQpOworICBpZiAoc2Vzc2lvbikgeworICAgIHJldCA9IGdzdF9vYmplY3RfcmVmIChzZXNzaW9uLT5zZXNzaW9uKTsKKyAgfQorICBHU1RfUlRQX0JJTl9VTkxPQ0sgKGJpbik7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIFJUUFNlc3Npb24gKgorZ3N0X3J0cF9iaW5fZ2V0X2ludGVybmFsX3Nlc3Npb24gKEdzdFJ0cEJpbiAqIGJpbiwgZ3VpbnQgc2Vzc2lvbl9pZCkKK3sKKyAgUlRQU2Vzc2lvbiAqaW50ZXJuYWxfc2Vzc2lvbiA9IE5VTEw7CisgIEdzdFJ0cEJpblNlc3Npb24gKnNlc3Npb247CisKKyAgR1NUX1JUUF9CSU5fTE9DSyAoYmluKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAicmV0cmlldmluZyBpbnRlcm5hbCBSVFBTZXNzaW9uIG9iamVjdCwgaW5kZXg6ICV1IiwKKyAgICAgIHNlc3Npb25faWQpOworICBzZXNzaW9uID0gZmluZF9zZXNzaW9uX2J5X2lkIChiaW4sIChnaW50KSBzZXNzaW9uX2lkKTsKKyAgaWYgKHNlc3Npb24pIHsKKyAgICBnX29iamVjdF9nZXQgKHNlc3Npb24tPnNlc3Npb24sICJpbnRlcm5hbC1zZXNzaW9uIiwgJmludGVybmFsX3Nlc3Npb24sCisgICAgICAgIE5VTEwpOworICB9CisgIEdTVF9SVFBfQklOX1VOTE9DSyAoYmluKTsKKworICByZXR1cm4gaW50ZXJuYWxfc2Vzc2lvbjsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorZ3N0X3J0cF9iaW5fcmVxdWVzdF9lbmNvZGVyIChHc3RSdHBCaW4gKiBiaW4sIGd1aW50IHNlc3Npb25faWQpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgInJldHVybiBOVUxMIGVuY29kZXIiKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK2dzdF9ydHBfYmluX3JlcXVlc3RfZGVjb2RlciAoR3N0UnRwQmluICogYmluLCBndWludCBzZXNzaW9uX2lkKQoreworICBHU1RfREVCVUdfT0JKRUNUIChiaW4sICJyZXR1cm4gTlVMTCBkZWNvZGVyIik7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9iaW5fcHJvcGFnYXRlX3Byb3BlcnR5X3RvX2ppdHRlcmJ1ZmZlciAoR3N0UnRwQmluICogYmluLAorICAgIGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgR1ZhbHVlICogdmFsdWUpCit7CisgIEdTTGlzdCAqc2Vzc2lvbnMsICpzdHJlYW1zOworCisgIEdTVF9SVFBfQklOX0xPQ0sgKGJpbik7CisgIGZvciAoc2Vzc2lvbnMgPSBiaW4tPnNlc3Npb25zOyBzZXNzaW9uczsgc2Vzc2lvbnMgPSBnX3NsaXN0X25leHQgKHNlc3Npb25zKSkgeworICAgIEdzdFJ0cEJpblNlc3Npb24gKnNlc3Npb24gPSAoR3N0UnRwQmluU2Vzc2lvbiAqKSBzZXNzaW9ucy0+ZGF0YTsKKworICAgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChzZXNzaW9uKTsKKyAgICBmb3IgKHN0cmVhbXMgPSBzZXNzaW9uLT5zdHJlYW1zOyBzdHJlYW1zOyBzdHJlYW1zID0gZ19zbGlzdF9uZXh0IChzdHJlYW1zKSkgeworICAgICAgR3N0UnRwQmluU3RyZWFtICpzdHJlYW0gPSAoR3N0UnRwQmluU3RyZWFtICopIHN0cmVhbXMtPmRhdGE7CisKKyAgICAgIGdfb2JqZWN0X3NldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKHN0cmVhbS0+YnVmZmVyKSwgbmFtZSwgdmFsdWUpOworICAgIH0KKyAgICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzaW9uKTsKKyAgfQorICBHU1RfUlRQX0JJTl9VTkxPQ0sgKGJpbik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Jpbl9wcm9wYWdhdGVfcHJvcGVydHlfdG9fc2Vzc2lvbiAoR3N0UnRwQmluICogYmluLAorICAgIGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgR1ZhbHVlICogdmFsdWUpCit7CisgIEdTTGlzdCAqc2Vzc2lvbnM7CisKKyAgR1NUX1JUUF9CSU5fTE9DSyAoYmluKTsKKyAgZm9yIChzZXNzaW9ucyA9IGJpbi0+c2Vzc2lvbnM7IHNlc3Npb25zOyBzZXNzaW9ucyA9IGdfc2xpc3RfbmV4dCAoc2Vzc2lvbnMpKSB7CisgICAgR3N0UnRwQmluU2Vzc2lvbiAqc2VzcyA9IChHc3RSdHBCaW5TZXNzaW9uICopIHNlc3Npb25zLT5kYXRhOworCisgICAgZ19vYmplY3Rfc2V0X3Byb3BlcnR5IChHX09CSkVDVCAoc2Vzcy0+c2Vzc2lvbiksIG5hbWUsIHZhbHVlKTsKKyAgfQorICBHU1RfUlRQX0JJTl9VTkxPQ0sgKGJpbik7Cit9CisKKy8qIGdldCBhIGNsaWVudCB3aXRoIHRoZSBnaXZlbiBTREVTIG5hbWUuIE11c3QgYmUgY2FsbGVkIHdpdGggUlRQX0JJTl9MT0NLICovCitzdGF0aWMgR3N0UnRwQmluQ2xpZW50ICoKK2dldF9jbGllbnQgKEdzdFJ0cEJpbiAqIGJpbiwgZ3VpbnQ4IGxlbiwgZ3VpbnQ4ICogZGF0YSwgZ2Jvb2xlYW4gKiBjcmVhdGVkKQoreworICBHc3RSdHBCaW5DbGllbnQgKnJlc3VsdCA9IE5VTEw7CisgIEdTTGlzdCAqd2FsazsKKworICBmb3IgKHdhbGsgPSBiaW4tPmNsaWVudHM7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UnRwQmluQ2xpZW50ICpjbGllbnQgPSAoR3N0UnRwQmluQ2xpZW50ICopIHdhbGstPmRhdGE7CisKKyAgICBpZiAobGVuICE9IGNsaWVudC0+Y25hbWVfbGVuKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoIXN0cm5jbXAgKChnY2hhciAqKSBkYXRhLCBjbGllbnQtPmNuYW1lLCBjbGllbnQtPmNuYW1lX2xlbikpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgImZvdW5kIGV4aXN0aW5nIGNsaWVudCAlcCB3aXRoIENOQU1FICVzIiwgY2xpZW50LAorICAgICAgICAgIGNsaWVudC0+Y25hbWUpOworICAgICAgcmVzdWx0ID0gY2xpZW50OworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyogbm90aGluZyBmb3VuZCwgY3JlYXRlIG9uZSAqLworICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICByZXN1bHQgPSBnX25ldzAgKEdzdFJ0cEJpbkNsaWVudCwgMSk7CisgICAgcmVzdWx0LT5jbmFtZSA9IGdfc3RybmR1cCAoKGdjaGFyICopIGRhdGEsIGxlbik7CisgICAgcmVzdWx0LT5jbmFtZV9sZW4gPSBsZW47CisgICAgYmluLT5jbGllbnRzID0gZ19zbGlzdF9wcmVwZW5kIChiaW4tPmNsaWVudHMsIHJlc3VsdCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAiY3JlYXRlZCBuZXcgY2xpZW50ICVwIHdpdGggQ05BTUUgJXMiLCByZXN1bHQsCisgICAgICAgIHJlc3VsdC0+Y25hbWUpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2NsaWVudCAoR3N0UnRwQmluQ2xpZW50ICogY2xpZW50LCBHc3RSdHBCaW4gKiBiaW4pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgImZyZWVpbmcgY2xpZW50ICVwIiwgY2xpZW50KTsKKyAgZ19zbGlzdF9mcmVlIChjbGllbnQtPnN0cmVhbXMpOworICBnX2ZyZWUgKGNsaWVudC0+Y25hbWUpOworICBnX2ZyZWUgKGNsaWVudCk7Cit9CisKK3N0YXRpYyB2b2lkCitnZXRfY3VycmVudF90aW1lcyAoR3N0UnRwQmluICogYmluLCBHc3RDbG9ja1RpbWUgKiBydW5uaW5nX3RpbWUsCisgICAgZ3VpbnQ2NCAqIG50cG5zdGltZSkKK3sKKyAgZ3VpbnQ2NCBudHBucyA9IC0xOworICBHc3RDbG9jayAqY2xvY2s7CisgIEdzdENsb2NrVGltZSBiYXNlX3RpbWUsIHJ0LCBjbG9ja190aW1lOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoYmluKTsKKyAgaWYgKChjbG9jayA9IEdTVF9FTEVNRU5UX0NMT0NLIChiaW4pKSkgeworICAgIGJhc2VfdGltZSA9IEdTVF9FTEVNRU5UX0NBU1QgKGJpbiktPmJhc2VfdGltZTsKKyAgICBnc3Rfb2JqZWN0X3JlZiAoY2xvY2spOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChiaW4pOworCisgICAgLyogZ2V0IGN1cnJlbnQgY2xvY2sgdGltZSBhbmQgY29udmVydCB0byBydW5uaW5nIHRpbWUgKi8KKyAgICBjbG9ja190aW1lID0gZ3N0X2Nsb2NrX2dldF90aW1lIChjbG9jayk7CisgICAgcnQgPSBjbG9ja190aW1lIC0gYmFzZV90aW1lOworCisgICAgaWYgKGJpbi0+dXNlX3BpcGVsaW5lX2Nsb2NrKSB7CisgICAgICBudHBucyA9IHJ0OworICAgICAgLyogYWRkIGNvbnN0YW50IHRvIGNvbnZlcnQgZnJvbSAxOTcwIGJhc2VkIHRpbWUgdG8gMTkwMCBiYXNlZCB0aW1lICovCisgICAgICBudHBucyArPSAoMjIwODk4ODgwMExMICogR1NUX1NFQ09ORCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAoYmluLT5udHBfdGltZV9zb3VyY2UpIHsKKyAgICAgICAgY2FzZSBHU1RfUlRQX05UUF9USU1FX1NPVVJDRV9OVFA6CisgICAgICAgIGNhc2UgR1NUX1JUUF9OVFBfVElNRV9TT1VSQ0VfVU5JWDp7CisgICAgICAgICAgR1RpbWVWYWwgY3VycmVudDsKKworICAgICAgICAgIC8qIGdldCBjdXJyZW50IE5UUCB0aW1lICovCisgICAgICAgICAgZ19nZXRfY3VycmVudF90aW1lICgmY3VycmVudCk7CisgICAgICAgICAgbnRwbnMgPSBHU1RfVElNRVZBTF9UT19USU1FIChjdXJyZW50KTsKKworICAgICAgICAgIC8qIGFkZCBjb25zdGFudCB0byBjb252ZXJ0IGZyb20gMTk3MCBiYXNlZCB0aW1lIHRvIDE5MDAgYmFzZWQgdGltZSAqLworICAgICAgICAgIGlmIChiaW4tPm50cF90aW1lX3NvdXJjZSA9PSBHU1RfUlRQX05UUF9USU1FX1NPVVJDRV9OVFApCisgICAgICAgICAgICBudHBucyArPSAoMjIwODk4ODgwMExMICogR1NUX1NFQ09ORCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHU1RfUlRQX05UUF9USU1FX1NPVVJDRV9SVU5OSU5HX1RJTUU6CisgICAgICAgICAgbnRwbnMgPSBydDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfUlRQX05UUF9USU1FX1NPVVJDRV9DTE9DS19USU1FOgorICAgICAgICAgIG50cG5zID0gY2xvY2tfdGltZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBudHBucyA9IC0xOyAgICAgICAgICAgLyogRml4IHVuaW5pdGVkIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChjbG9jayk7CisgIH0gZWxzZSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGJpbik7CisgICAgcnQgPSAtMTsKKyAgICBudHBucyA9IC0xOworICB9CisgIGlmIChydW5uaW5nX3RpbWUpCisgICAgKnJ1bm5pbmdfdGltZSA9IHJ0OworICBpZiAobnRwbnN0aW1lKQorICAgICpudHBuc3RpbWUgPSBudHBuczsKK30KKworc3RhdGljIHZvaWQKK3N0cmVhbV9zZXRfdHNfb2Zmc2V0IChHc3RSdHBCaW4gKiBiaW4sIEdzdFJ0cEJpblN0cmVhbSAqIHN0cmVhbSwKKyAgICBnaW50NjQgdHNfb2Zmc2V0LCBnaW50NjQgbWF4X3RzX29mZnNldCwgZ2ludDY0IG1pbl90c19vZmZzZXQsCisgICAgZ2Jvb2xlYW4gYWxsb3dfcG9zaXRpdmVfdHNfb2Zmc2V0KQoreworICBnaW50NjQgcHJldl90c19vZmZzZXQ7CisKKyAgZ19vYmplY3RfZ2V0IChzdHJlYW0tPmJ1ZmZlciwgInRzLW9mZnNldCIsICZwcmV2X3RzX29mZnNldCwgTlVMTCk7CisKKyAgLyogZGVsdGEgY2hhbmdlZCwgc2VlIGhvdyBtdWNoICovCisgIGlmIChwcmV2X3RzX29mZnNldCAhPSB0c19vZmZzZXQpIHsKKyAgICBnaW50NjQgZGlmZjsKKworICAgIGRpZmYgPSBwcmV2X3RzX29mZnNldCAtIHRzX29mZnNldDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwKKyAgICAgICAgInRzLW9mZnNldCAlIiBHX0dJTlQ2NF9GT1JNQVQgIiwgcHJldiAlIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICAgIiwgZGlmZjogJSIgR19HSU5UNjRfRk9STUFULCB0c19vZmZzZXQsIHByZXZfdHNfb2Zmc2V0LCBkaWZmKTsKKworICAgIC8qIGlnbm9yZSBtaW5vciBvZmZzZXRzICovCisgICAgaWYgKEFCUyAoZGlmZikgPCBtaW5fdHNfb2Zmc2V0KSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChiaW4sICJvZmZzZXQgdG9vIHNtYWxsLCBpZ25vcmluZyIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIHNhbml0eSBjaGVjayBvZmZzZXQgKi8KKyAgICBpZiAobWF4X3RzX29mZnNldCA+IDApIHsKKyAgICAgIGlmICh0c19vZmZzZXQgPiAwICYmICFhbGxvd19wb3NpdGl2ZV90c19vZmZzZXQpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLAorICAgICAgICAgICAgIm9mZnNldCBpcyBwb3NpdGl2ZSAoY2xvY2tzIGFyZSBvdXQgb2Ygc3luYyksIGlnbm9yaW5nIik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChBQlMgKHRzX29mZnNldCkgPiBtYXhfdHNfb2Zmc2V0KSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgIm9mZnNldCB0b28gbGFyZ2UsIGlnbm9yaW5nIik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnX29iamVjdF9zZXQgKHN0cmVhbS0+YnVmZmVyLCAidHMtb2Zmc2V0IiwgdHNfb2Zmc2V0LCBOVUxMKTsKKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChiaW4sICJzdHJlYW0gU1NSQyAlMDh4LCBkZWx0YSAlIiBHX0dJTlQ2NF9GT1JNQVQsCisgICAgICBzdHJlYW0tPnNzcmMsIHRzX29mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Jpbl9zZW5kX3N5bmNfZXZlbnQgKEdzdFJ0cEJpblN0cmVhbSAqIHN0cmVhbSkKK3sKKyAgaWYgKHN0cmVhbS0+YmluLT5zZW5kX3N5bmNfZXZlbnQpIHsKKyAgICBHc3RFdmVudCAqZXZlbnQ7CisgICAgR3N0UGFkICpzcmNwYWQ7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzdHJlYW0tPmJpbiwKKyAgICAgICAgInNlbmRpbmcgR3N0UlRDUFNSUmVjZWl2ZWQgZXZlbnQgZG93bnN0cmVhbSIpOworCisgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNLAorICAgICAgICBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoIkdzdFJUQ1BTUlJlY2VpdmVkIikpOworCisgICAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHN0cmVhbS0+YnVmZmVyLCAic3JjIik7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmNwYWQsIGV2ZW50KTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworICB9Cit9CisKKy8qIGFzc29jaWF0ZSBhIHN0cmVhbSB0byB0aGUgZ2l2ZW4gQ05BTUUuIFRoaXMgd2lsbCBtYWtlIHN1cmUgYWxsIHN0cmVhbXMgZm9yCisgKiB0aGF0IENOQU1FIGFyZSBzeW5jaHJvbml6ZWQgdG9nZXRoZXIuCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIEdTVF9SVFBfQklOX0xPQ0sgKi8KK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Jpbl9hc3NvY2lhdGUgKEdzdFJ0cEJpbiAqIGJpbiwgR3N0UnRwQmluU3RyZWFtICogc3RyZWFtLCBndWludDggbGVuLAorICAgIGd1aW50OCAqIGRhdGEsIGd1aW50NjQgbnRwdGltZSwgZ3VpbnQ2NCBsYXN0X2V4dHJ0cHRpbWUsCisgICAgZ3VpbnQ2NCBiYXNlX3J0cHRpbWUsIGd1aW50NjQgYmFzZV90aW1lLCBndWludCBjbG9ja19yYXRlLAorICAgIGdpbnQ2NCBydHBfY2xvY2tfYmFzZSkKK3sKKyAgR3N0UnRwQmluQ2xpZW50ICpjbGllbnQ7CisgIGdib29sZWFuIGNyZWF0ZWQ7CisgIEdTTGlzdCAqd2FsazsKKyAgR3N0Q2xvY2tUaW1lIHJ1bm5pbmdfdGltZSwgcnVubmluZ190aW1lX3J0cDsKKyAgZ3VpbnQ2NCBudHBuc3RpbWU7CisKKyAgLyogZmlyc3QgZmluZCBvciBjcmVhdGUgdGhlIENOQU1FICovCisgIGNsaWVudCA9IGdldF9jbGllbnQgKGJpbiwgbGVuLCBkYXRhLCAmY3JlYXRlZCk7CisKKyAgLyogZmluZCBzdHJlYW0gaW4gdGhlIGNsaWVudCAqLworICBmb3IgKHdhbGsgPSBjbGllbnQtPnN0cmVhbXM7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UnRwQmluU3RyZWFtICpvc3RyZWFtID0gKEdzdFJ0cEJpblN0cmVhbSAqKSB3YWxrLT5kYXRhOworCisgICAgaWYgKG9zdHJlYW0gPT0gc3RyZWFtKQorICAgICAgYnJlYWs7CisgIH0KKyAgLyogbm90IGZvdW5kLCBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKyAgaWYgKHdhbGsgPT0gTlVMTCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwKKyAgICAgICAgIm5ldyBhc3NvY2lhdGlvbiBvZiBTU1JDICUwOHggd2l0aCBjbGllbnQgJXAgd2l0aCBDTkFNRSAlcyIsCisgICAgICAgIHN0cmVhbS0+c3NyYywgY2xpZW50LCBjbGllbnQtPmNuYW1lKTsKKyAgICBjbGllbnQtPnN0cmVhbXMgPSBnX3NsaXN0X3ByZXBlbmQgKGNsaWVudC0+c3RyZWFtcywgc3RyZWFtKTsKKyAgICBjbGllbnQtPm5zdHJlYW1zKys7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLAorICAgICAgICAiZm91bmQgYXNzb2NpYXRpb24gb2YgU1NSQyAlMDh4IHdpdGggY2xpZW50ICVwIHdpdGggQ05BTUUgJXMiLAorICAgICAgICBzdHJlYW0tPnNzcmMsIGNsaWVudCwgY2xpZW50LT5jbmFtZSk7CisgIH0KKworICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChsYXN0X2V4dHJ0cHRpbWUpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAiaW52YWxpZGF0ZWQgc3luYyBkYXRhIik7CisgICAgaWYgKGJpbi0+cnRjcF9zeW5jID09IEdTVF9SVFBfQklOX1JUQ1BfU1lOQ19SVFApIHsKKyAgICAgIC8qIHdlIGRvbid0IG5lZWQgdGhhdCBkYXRhLCBzbyBjYXJyeSBvbiwKKyAgICAgICAqIGJ1dCBtYWtlIHNvbWUgdmFsdWVzIGxvb2sgc2FuZXIgKi8KKyAgICAgIGxhc3RfZXh0cnRwdGltZSA9IGJhc2VfcnRwdGltZTsKKyAgICB9IGVsc2UgeworICAgICAgLyogbm90aGluZyB3ZSBjYW4gZG8gd2l0aCB0aGlzIGRhdGEgaW4gdGhpcyBjYXNlICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChiaW4sICJiYWlsaW5nIG91dCIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8qIFRha2UgdGhlIGV4dGVuZGVkIHJ0cHRpbWUgd2UgZm91bmQgaW4gdGhlIFNSIHBhY2tldCBhbmQgbWFwIGl0IHRvIHRoZQorICAgKiBsb2NhbCBydHB0aW1lLiBUaGUgbG9jYWwgcnRwIHRpbWUgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGltZXN0YW1wcyBvbiB0aGUKKyAgICogYnVmZmVycyBzbyB3ZSB3aWxsIGNhbGN1bGF0ZSB3aGF0IHJ1bm5pbmdfdGltZSBjb3JyZXNwb25kcyB0byB0aGUgUlRQCisgICAqIHRpbWVzdGFtcCBpbiB0aGUgU1IgcGFja2V0LiAqLworICBydW5uaW5nX3RpbWVfcnRwID0gbGFzdF9leHRydHB0aW1lIC0gYmFzZV9ydHB0aW1lOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwKKyAgICAgICJiYXNlICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgZXh0cnRwdGltZSAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAiLCBsb2NhbCBSVFAgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBjbG9jay1yYXRlICVkLCAiCisgICAgICAiY2xvY2stYmFzZSAlIiBHX0dJTlQ2NF9GT1JNQVQsIGJhc2VfcnRwdGltZSwKKyAgICAgIGxhc3RfZXh0cnRwdGltZSwgcnVubmluZ190aW1lX3J0cCwgY2xvY2tfcmF0ZSwgcnRwX2Nsb2NrX2Jhc2UpOworCisgIC8qIGNhbGN1bGF0ZSBsb2NhbCBSVFAgdGltZSBpbiBnc3RyZWFtZXIgdGltZXN0YW1wLCB3ZSBlc3NlbnRpYWxseSBwZXJmb3JtIHRoZQorICAgKiBzYW1lIGNvbnZlcnNpb24gdGhhdCBhIGppdHRlcmJ1ZmZlciB3b3VsZCB1c2UgdG8gY29udmVydCBhbiBydHAgdGltZXN0YW1wCisgICAqIGludG8gYSBjb3JyZXNwb25kaW5nIGdzdHJlYW1lciB0aW1lc3RhbXAuIE5vdGUgdGhhdCB0aGUgYmFzZV90aW1lIGFsc28KKyAgICogY29udGFpbnMgdGhlIGRyaWZ0IGJldHdlZW4gc2VuZGVyIGFuZCByZWNlaXZlci4gKi8KKyAgcnVubmluZ190aW1lID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHJ1bm5pbmdfdGltZV9ydHAsIEdTVF9TRUNPTkQsIGNsb2NrX3JhdGUpOworICBydW5uaW5nX3RpbWUgKz0gYmFzZV90aW1lOworCisgIC8qIGNvbnZlcnQgbnRwdGltZSB0byBuYW5vc2Vjb25kcyAqLworICBudHBuc3RpbWUgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKG50cHRpbWUsIEdTVF9TRUNPTkQsCisgICAgICAoR19HSU5UNjRfQ09OU1RBTlQgKDEpIDw8IDMyKSk7CisKKyAgc3RyZWFtLT5oYXZlX3N5bmMgPSBUUlVFOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwKKyAgICAgICJTUiBSVFAgcnVubmluZyB0aW1lICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgU1IgTlRQICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBydW5uaW5nX3RpbWUsIG50cG5zdGltZSk7CisKKyAgLyogcmVjYWxjIGludGVyIHN0cmVhbSBwbGF5b3V0IG9mZnNldCwgYnV0IG9ubHkgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZQorICAgKiBzdHJlYW0gb3Igd2UncmUgZG9pbmcgTlRQIHN5bmMuICovCisgIGlmIChiaW4tPm50cF9zeW5jKSB7CisgICAgZ2ludDY0IG50cGRpZmYsIHJ0ZGlmZjsKKyAgICBndWludDY0IGxvY2FsX250cG5zdGltZTsKKyAgICBHc3RDbG9ja1RpbWUgbG9jYWxfcnVubmluZ190aW1lOworCisgICAgLyogRm9yIE5UUCBzeW5jIHdlIG5lZWQgdG8gZmlyc3QgZ2V0IGEgc25hcHNob3Qgb2YgcnVubmluZ190aW1lIGFuZCBOVFAKKyAgICAgKiB0aW1lLiBXZSBrbm93IGF0IHdoYXQgcnVubmluZ190aW1lIHdlIHBsYXkgYSBjZXJ0YWluIFJUUCB0aW1lLCB3ZSBhbHNvCisgICAgICogY2FsY3VsYXRlZCB3aGVuIHdlIHdvdWxkIHBsYXkgdGhlIFJUUCB0aW1lIGluIHRoZSBTUiBwYWNrZXQuIE5vdyB3ZSBuZWVkCisgICAgICogdG8ga25vdyBob3cgdGhlIHJ1bm5pbmdfdGltZSBhbmQgdGhlIE5UUCB0aW1lIHJlbGF0ZSB0byBlYWNob3RoZXIuICovCisgICAgZ2V0X2N1cnJlbnRfdGltZXMgKGJpbiwgJmxvY2FsX3J1bm5pbmdfdGltZSwgJmxvY2FsX250cG5zdGltZSk7CisKKyAgICAvKiBzZWUgaG93IGZhciBhd2F5IHRoZSBOVFAgdGltZSBpcy4gVGhpcyBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQorICAgICAqIGN1cnJlbnQgTlRQIHRpbWUgYW5kIHRoZSBOVFAgdGltZSBpbiB0aGUgbGFzdCBTUiBwYWNrZXQuICovCisgICAgbnRwZGlmZiA9IGxvY2FsX250cG5zdGltZSAtIG50cG5zdGltZTsKKyAgICAvKiBzZWUgaG93IGZhciBhd2F5IHRoZSBydW5uaW5nX3RpbWUgaXMuIFRoaXMgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKKyAgICAgKiBjdXJyZW50IHJ1bm5pbmdfdGltZSBhbmQgdGhlIHJ1bm5pbmdfdGltZSBvZiB0aGUgUlRQIHRpbWVzdGFtcCBpbiB0aGUKKyAgICAgKiBsYXN0IFNSIHBhY2tldC4gKi8KKyAgICBydGRpZmYgPSBsb2NhbF9ydW5uaW5nX3RpbWUgLSBydW5uaW5nX3RpbWU7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChiaW4sCisgICAgICAgICJsb2NhbCBOVFAgdGltZSAlIiBHX0dVSU5UNjRfRk9STUFUICIsIFNSIE5UUCB0aW1lICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICAgIGxvY2FsX250cG5zdGltZSwgbnRwbnN0aW1lKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChiaW4sCisgICAgICAgICJsb2NhbCBydW5uaW5nIHRpbWUgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBTUiBSVFAgcnVubmluZyB0aW1lICUiCisgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIGxvY2FsX3J1bm5pbmdfdGltZSwgcnVubmluZ190aW1lKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChiaW4sCisgICAgICAgICJOVFAgZGlmZiAlIiBHX0dJTlQ2NF9GT1JNQVQgIiwgUlQgZGlmZiAlIiBHX0dJTlQ2NF9GT1JNQVQsIG50cGRpZmYsCisgICAgICAgIHJ0ZGlmZik7CisKKyAgICAvKiBjb21iaW5lIHRvIGdldCB0aGUgZmluYWwgZGlmZiB0byBhcHBseSB0byB0aGUgcnVubmluZ190aW1lICovCisgICAgc3RyZWFtLT5ydF9kZWx0YSA9IHJ0ZGlmZiAtIG50cGRpZmY7CisKKyAgICBzdHJlYW1fc2V0X3RzX29mZnNldCAoYmluLCBzdHJlYW0sIHN0cmVhbS0+cnRfZGVsdGEsIGJpbi0+bWF4X3RzX29mZnNldCwKKyAgICAgICAgMCwgRkFMU0UpOworICB9IGVsc2UgeworICAgIGdpbnQ2NCBtaW4sIHJ0cF9taW4sIGNsb2NrX2Jhc2UgPSBzdHJlYW0tPmNsb2NrX2Jhc2U7CisgICAgZ2Jvb2xlYW4gYWxsX3N5bmMsIHVzZV9ydHA7CisgICAgZ2Jvb2xlYW4gcnRjcF9zeW5jID0gZ19hdG9taWNfaW50X2dldCAoJmJpbi0+cnRjcF9zeW5jKTsKKworICAgIC8qIGNhbGN1bGF0ZSBkZWx0YSBiZXR3ZWVuIHNlcnZlciBhbmQgcmVjZWl2ZXIuIG50cG5zdGltZSBpcyBjcmVhdGVkIGJ5CisgICAgICogY29udmVydGluZyB0aGUgbnRwdGltZSBpbiB0aGUgbGFzdCBTUiBwYWNrZXQgdG8gYSBnc3RyZWFtZXIgdGltZXN0YW1wLiBUaGlzCisgICAgICogZGVsdGEgZXhwcmVzc2VzIHRoZSBkaWZmZXJlbmNlIHRvIG91ciB0aW1lbGluZSBhbmQgdGhlIHNlcnZlciB0aW1lbGluZS4gVGhlCisgICAgICogZGlmZmVyZW5jZSBpbiBpdHNlbGYgZG9lc24ndCBtZWFuIG11Y2ggYnV0IHdlIGNhbiBjb21iaW5lIHRoZSBkZWx0YSBvZgorICAgICAqIG11bHRpcGxlIHN0cmVhbXMgdG8gY3JlYXRlIGEgc3RyZWFtIHNwZWNpZmljIG9mZnNldC4gKi8KKyAgICBzdHJlYW0tPnJ0X2RlbHRhID0gbnRwbnN0aW1lIC0gcnVubmluZ190aW1lOworCisgICAgLyogY2FsY3VsYXRlIHRoZSBtaW4gb2YgYWxsIGRlbHRhcywgaWdub3Jpbmcgc3RyZWFtcyB0aGF0IGRpZCBub3QgeWV0IGhhdmUgYQorICAgICAqIHZhbGlkIHJ0X2RlbHRhIGJlY2F1c2Ugd2UgZGlkIG5vdCB5ZXQgcmVjZWl2ZSBhbiBTUiBwYWNrZXQgZm9yIHRob3NlCisgICAgICogc3RyZWFtcy4KKyAgICAgKiBXZSBjYWxjdWxhdGUgdGhlIG1pbmludW0gYmVjYXVzZSB3ZSB3b3VsZCBsaWtlIHRvIG9ubHkgYXBwbHkgcG9zaXRpdmUKKyAgICAgKiBvZmZzZXRzIHRvIHN0cmVhbXMsIGRlbGF5aW5nIHRoZWlyIHBsYXliYWNrIGluc3RlYWQgb2YgdHJ5aW5nIHRvIHNwZWVkIHVwCisgICAgICogb3RoZXIgc3RyZWFtcyAod2hpY2ggbWlnaHQgYmUgaW1wb3NpYmxlIHdoZW4gd2UgaGF2ZSB0byBjcmVhdGUgbmVnYXRpdmUKKyAgICAgKiBsYXRlbmNpZXMpLgorICAgICAqIFRoZSBzdHJlYW0gdGhhdCBoYXMgdGhlIHNtYWxsZXN0IGRpZmYgaXMgc2VsZWN0ZWQgYXMgdGhlIHJlZmVyZW5jZSBzdHJlYW0sCisgICAgICogYWxsIG90aGVyIHN0cmVhbXMgd2lsbCBoYXZlIGEgcG9zaXRpdmUgb2Zmc2V0IHRvIHRoaXMgZGlmZmVyZW5jZS4gKi8KKworICAgIC8qIHNvbWUgYWx0ZXJuYXRpdmUgc2V0dGluZyBhbGxvdyBpZ25vcmluZyBSVENQIGFzIG11Y2ggYXMgcG9zc2libGUsCisgICAgICogZm9yIHNlcnZlcnMgZ2VuZXJhdGluZyBib2d1cyBudHAgdGltZWxpbmUgKi8KKyAgICBtaW4gPSBydHBfbWluID0gR19NQVhJTlQ2NDsKKyAgICB1c2VfcnRwID0gRkFMU0U7CisgICAgaWYgKHJ0Y3Bfc3luYyA9PSBHU1RfUlRQX0JJTl9SVENQX1NZTkNfUlRQKSB7CisgICAgICBndWludDY0IGV4dF9iYXNlOworCisgICAgICB1c2VfcnRwID0gVFJVRTsKKyAgICAgIC8qIHNpZ25lZCB2ZXJzaW9uIGZvciBjb252aWVuaWVuY2UgKi8KKyAgICAgIGNsb2NrX2Jhc2UgPSBiYXNlX3J0cHRpbWU7CisgICAgICAvKiBkZWFsIHdpdGggcG9zc2libGUgd3JhcC1hcm91bmQgKi8KKyAgICAgIGV4dF9iYXNlID0gYmFzZV9ydHB0aW1lOworICAgICAgcnRwX2Nsb2NrX2Jhc2UgPSBnc3RfcnRwX2J1ZmZlcl9leHRfdGltZXN0YW1wICgmZXh0X2Jhc2UsIHJ0cF9jbG9ja19iYXNlKTsKKyAgICAgIC8qIHNhbml0eSBjaGVjazsgYmFzZSBydHAgYW5kIHByb3ZpZGVkIGNsb2NrX2Jhc2Ugc2hvdWxkIGJlIGNsb3NlICovCisgICAgICBpZiAocnRwX2Nsb2NrX2Jhc2UgPj0gY2xvY2tfYmFzZSkgeworICAgICAgICBpZiAocnRwX2Nsb2NrX2Jhc2UgLSBjbG9ja19iYXNlIDwgMTAgKiBjbG9ja19yYXRlKSB7CisgICAgICAgICAgcnRwX2Nsb2NrX2Jhc2UgPSBiYXNlX3RpbWUgKworICAgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChydHBfY2xvY2tfYmFzZSAtIGNsb2NrX2Jhc2UsCisgICAgICAgICAgICAgIEdTVF9TRUNPTkQsIGNsb2NrX3JhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHVzZV9ydHAgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNsb2NrX2Jhc2UgLSBydHBfY2xvY2tfYmFzZSA8IDEwICogY2xvY2tfcmF0ZSkgeworICAgICAgICAgIHJ0cF9jbG9ja19iYXNlID0gYmFzZV90aW1lIC0KKyAgICAgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoY2xvY2tfYmFzZSAtIHJ0cF9jbG9ja19iYXNlLAorICAgICAgICAgICAgICBHU1RfU0VDT05ELCBjbG9ja19yYXRlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB1c2VfcnRwID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIHdhcm4gYW5kIGJhaWwgZm9yIGNsYXJpdHkgb3V0IGlmIG5vIHNhbmUgdmFsdWVzICovCisgICAgICBpZiAoIXVzZV9ydHApIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChiaW4sICJ1bmFibGUgdG8gc3luYyB0byBwcm92aWRlZCBydHB0aW1lIik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIC8qIHN0b3JlIHRvIHRyYWNrIGNoYW5nZXMgKi8KKyAgICAgIGNsb2NrX2Jhc2UgPSBydHBfY2xvY2tfYmFzZTsKKyAgICAgIC8qIGdlbmVyYXRlIGEgZmFrZSBhcyBiZWZvcmUsCisgICAgICAgKiBub3cgZXF1YXRpbmcgcnRwdGltZSBvYnRhaW5lZCBmcm9tIFJUUC1JbmZvLAorICAgICAgICogd2hlcmUgdGhlIGxhcmdlIHRpbWUgcmVwcmVzZW50IHRoZSBvdGhlcndpc2UgaXJyZWxldmFudCBucHQvbnRwIHRpbWUgKi8KKyAgICAgIHN0cmVhbS0+cnRwX2RlbHRhID0gKEdTVF9TRUNPTkQgPDwgMjgpIC0gcnRwX2Nsb2NrX2Jhc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGNsb2NrX2Jhc2UgPSBydHBfY2xvY2tfYmFzZTsKKyAgICB9CisKKyAgICBhbGxfc3luYyA9IFRSVUU7CisgICAgZm9yICh3YWxrID0gY2xpZW50LT5zdHJlYW1zOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgICAgR3N0UnRwQmluU3RyZWFtICpvc3RyZWFtID0gKEdzdFJ0cEJpblN0cmVhbSAqKSB3YWxrLT5kYXRhOworCisgICAgICBpZiAoIW9zdHJlYW0tPmhhdmVfc3luYykgeworICAgICAgICBhbGxfc3luYyA9IEZBTFNFOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLyogY2hhbmdlIGluIGN1cnJlbnQgc3RyZWFtJ3MgYmFzZSBmcm9tIHByZXZpb3VzbHkgaW5pdCdlZCB2YWx1ZQorICAgICAgICogbGVhZHMgdG8gcmVzZXQgb2YgYWxsIHN0cmVhbSdzIGJhc2UgKi8KKyAgICAgIGlmIChzdHJlYW0gIT0gb3N0cmVhbSAmJiBzdHJlYW0tPmNsb2NrX2Jhc2UgPj0gMCAmJgorICAgICAgICAgIChzdHJlYW0tPmNsb2NrX2Jhc2UgIT0gY2xvY2tfYmFzZSkpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAicmVzZXQgdXBvbiBjbG9jayBiYXNlIGNoYW5nZSIpOworICAgICAgICBvc3RyZWFtLT5jbG9ja19iYXNlID0gLTEwMCAqIEdTVF9TRUNPTkQ7CisgICAgICAgIG9zdHJlYW0tPnJ0cF9kZWx0YSA9IDA7CisgICAgICB9CisKKyAgICAgIGlmIChvc3RyZWFtLT5ydF9kZWx0YSA8IG1pbikKKyAgICAgICAgbWluID0gb3N0cmVhbS0+cnRfZGVsdGE7CisgICAgICBpZiAob3N0cmVhbS0+cnRwX2RlbHRhIDwgcnRwX21pbikKKyAgICAgICAgcnRwX21pbiA9IG9zdHJlYW0tPnJ0cF9kZWx0YTsKKyAgICB9CisKKyAgICAvKiBhcnJhbmdlIHRvIHJlLXN5bmMgZm9yIGVhY2ggc3RyZWFtIHVwb24gc2lnbmlmaWNhbnQgY2hhbmdlLAorICAgICAqIGUuZy4gcG9zdC1zZWVrICovCisgICAgYWxsX3N5bmMgPSBhbGxfc3luYyAmJiAoc3RyZWFtLT5jbG9ja19iYXNlID09IGNsb2NrX2Jhc2UpOworICAgIHN0cmVhbS0+Y2xvY2tfYmFzZSA9IGNsb2NrX2Jhc2U7CisKKyAgICAvKiBtYXkgbmVlZCBpbml0IHBlcmZvcm1lZCBhYm92ZSBsYXRlciBvbiwgYnV0IG5vdGhpbmcgbW9yZSB0byBkbyBub3cgKi8KKyAgICBpZiAoY2xpZW50LT5uc3RyZWFtcyA8PSAxKQorICAgICAgcmV0dXJuOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAiY2xpZW50ICVwIG1pbiBkZWx0YSAlIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICAgIiBhbGwgc3luYyAlZCIsIGNsaWVudCwgbWluLCBhbGxfc3luYyk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAicnRjcCBzeW5jIG1vZGUgJWQsIHVzZV9ydHAgJWQiLCBydGNwX3N5bmMsIHVzZV9ydHApOworCisgICAgc3dpdGNoIChydGNwX3N5bmMpIHsKKyAgICAgIGNhc2UgR1NUX1JUUF9CSU5fUlRDUF9TWU5DX1JUUDoKKyAgICAgICAgaWYgKCF1c2VfcnRwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChiaW4sICJ1c2luZyBydHAgZ2VuZXJhdGVkIHJlcG9ydHM7ICIKKyAgICAgICAgICAgICJjbGllbnQgJXAgbWluIHJ0cCBkZWx0YSAlIiBHX0dJTlQ2NF9GT1JNQVQsIGNsaWVudCwgcnRwX21pbik7CisgICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgICAgY2FzZSBHU1RfUlRQX0JJTl9SVENQX1NZTkNfSU5JVElBTDoKKyAgICAgICAgLyogaWYgYWxsIGhhdmUgYmVlbiBzeW5jZWQgYWxyZWFkeSwgZG8gbm90IGJvdGhlciBmdXJ0aGVyICovCisgICAgICAgIGlmIChhbGxfc3luYykgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgImFsbCBzdHJlYW1zIGFscmVhZHkgc3luY2VkOyBkb25lIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogYmFpbCBvdXQgaWYgd2UgYWRqdXN0ZWQgcmVjZW50bHkgZW5vdWdoICovCisgICAgaWYgKGFsbF9zeW5jICYmIChudHBuc3RpbWUgLSBiaW4tPnByaXYtPmxhc3RfbnRwbnN0aW1lKSA8CisgICAgICAgIGJpbi0+cnRjcF9zeW5jX2ludGVydmFsICogR1NUX01TRUNPTkQpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgImRpc2NhcmRpbmcgUlRDUCBzZW5kZXIgcGFja2V0IGZvciBzeW5jOyAiCisgICAgICAgICAgInByZXZpb3VzIHNlbmRlciBpbmZvIHRvbyByZWNlbnQgIgorICAgICAgICAgICIocHJldmlvdXMgTlRQICUiIEdfR1VJTlQ2NF9GT1JNQVQgIikiLCBiaW4tPnByaXYtPmxhc3RfbnRwbnN0aW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYmluLT5wcml2LT5sYXN0X250cG5zdGltZSA9IG50cG5zdGltZTsKKworICAgIC8qIGNhbGN1bGF0ZSBvZmZzZXRzIGZvciBlYWNoIHN0cmVhbSAqLworICAgIGZvciAod2FsayA9IGNsaWVudC0+c3RyZWFtczsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICAgIEdzdFJ0cEJpblN0cmVhbSAqb3N0cmVhbSA9IChHc3RSdHBCaW5TdHJlYW0gKikgd2Fsay0+ZGF0YTsKKyAgICAgIGdpbnQ2NCB0c19vZmZzZXQ7CisKKyAgICAgIC8qIGlnbm9yZSBzdHJlYW1zIGZvciB3aGljaCB3ZSBkaWRuJ3QgcmVjZWl2ZSBhbiBTUiBwYWNrZXQgeWV0LCB3ZQorICAgICAgICogY2FuJ3Qgc3luY2hyb25pemUgdGhlbSB5ZXQuIFdlIGNhbiBob3dldmVyIHN5bmMgb3RoZXIgc3RyZWFtcyBqdXN0CisgICAgICAgKiBmaW5lLiAqLworICAgICAgaWYgKCFvc3RyZWFtLT5oYXZlX3N5bmMpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvKiBjYWxjdWxhdGUgb2Zmc2V0IHRvIG91ciByZWZlcmVuY2Ugc3RyZWFtLCB0aGlzIHNob3VsZCBhbHdheXMgZ2l2ZSBhCisgICAgICAgKiBwb3NpdGl2ZSBudW1iZXIuICovCisgICAgICBpZiAodXNlX3J0cCkKKyAgICAgICAgdHNfb2Zmc2V0ID0gb3N0cmVhbS0+cnRwX2RlbHRhIC0gcnRwX21pbjsKKyAgICAgIGVsc2UKKyAgICAgICAgdHNfb2Zmc2V0ID0gb3N0cmVhbS0+cnRfZGVsdGEgLSBtaW47CisKKyAgICAgIHN0cmVhbV9zZXRfdHNfb2Zmc2V0IChiaW4sIG9zdHJlYW0sIHRzX29mZnNldCwgYmluLT5tYXhfdHNfb2Zmc2V0LAorICAgICAgICAgIE1JTl9UU19PRkZTRVQsIFRSVUUpOworICAgIH0KKyAgfQorICBnc3RfcnRwX2Jpbl9zZW5kX3N5bmNfZXZlbnQgKHN0cmVhbSk7CisKKyAgcmV0dXJuOworfQorCisjZGVmaW5lIEdTVF9SVENQX0JVRkZFUl9GT1JfUEFDS0VUUyhiLGJ1ZmZlcixwYWNrZXQpIFwKKyAgZm9yICgoYikgPSBnc3RfcnRjcF9idWZmZXJfZ2V0X2ZpcnN0X3BhY2tldCAoKGJ1ZmZlciksIChwYWNrZXQpKTsgKGIpOyBcCisgICAgICAgICAgKGIpID0gZ3N0X3J0Y3BfcGFja2V0X21vdmVfdG9fbmV4dCAoKHBhY2tldCkpKQorCisjZGVmaW5lIEdTVF9SVENQX1NERVNfRk9SX0lURU1TKGIscGFja2V0KSBcCisgIGZvciAoKGIpID0gZ3N0X3J0Y3BfcGFja2V0X3NkZXNfZmlyc3RfaXRlbSAoKHBhY2tldCkpOyAoYik7IFwKKyAgICAgICAgICAoYikgPSBnc3RfcnRjcF9wYWNrZXRfc2Rlc19uZXh0X2l0ZW0gKChwYWNrZXQpKSkKKworI2RlZmluZSBHU1RfUlRDUF9TREVTX0ZPUl9FTlRSSUVTKGIscGFja2V0KSBcCisgIGZvciAoKGIpID0gZ3N0X3J0Y3BfcGFja2V0X3NkZXNfZmlyc3RfZW50cnkgKChwYWNrZXQpKTsgKGIpOyBcCisgICAgICAgICAgKGIpID0gZ3N0X3J0Y3BfcGFja2V0X3NkZXNfbmV4dF9lbnRyeSAoKHBhY2tldCkpKQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9iaW5faGFuZGxlX3N5bmMgKEdzdEVsZW1lbnQgKiBqaXR0ZXJidWZmZXIsIEdzdFN0cnVjdHVyZSAqIHMsCisgICAgR3N0UnRwQmluU3RyZWFtICogc3RyZWFtKQoreworICBHc3RSdHBCaW4gKmJpbjsKKyAgR3N0UlRDUFBhY2tldCBwYWNrZXQ7CisgIGd1aW50MzIgc3NyYzsKKyAgZ3VpbnQ2NCBudHB0aW1lOworICBnYm9vbGVhbiBoYXZlX3NyLCBoYXZlX3NkZXM7CisgIGdib29sZWFuIG1vcmU7CisgIGd1aW50NjQgYmFzZV9ydHB0aW1lOworICBndWludDY0IGJhc2VfdGltZTsKKyAgZ3VpbnQgY2xvY2tfcmF0ZTsKKyAgZ3VpbnQ2NCBjbG9ja19iYXNlOworICBndWludDY0IGV4dHJ0cHRpbWU7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBHc3RSVENQQnVmZmVyIHJ0Y3AgPSB7IE5VTEwsIH07CisKKyAgYmluID0gc3RyZWFtLT5iaW47CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAic3luYyBoYW5kbGVyIGNhbGxlZCIpOworCisgIC8qIGdldCB0aGUgbGFzdCByZWxhdGlvbiBiZXR3ZWVuIHRoZSBydHAgdGltZXN0YW1wcyBhbmQgdGhlIGdzdHJlYW1lcgorICAgKiB0aW1lc3RhbXBzLiBXZSBnZXQgdGhpcyBpbmZvIGRpcmVjdGx5IGZyb20gdGhlIGppdHRlcmJ1ZmZlciB3aGljaAorICAgKiBjb25zdHJ1Y3RzIGdzdHJlYW1lciB0aW1lc3RhbXBzIGZyb20gcnRwIHRpbWVzdGFtcHMgYW5kIHNvIGl0IGtub3cgZXhhY3RseQorICAgKiB3aGF0IHRoZSBjdXJyZW50IHNpdHVhdGlvbiBpcy4gKi8KKyAgYmFzZV9ydHB0aW1lID0KKyAgICAgIGdfdmFsdWVfZ2V0X3VpbnQ2NCAoZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJiYXNlLXJ0cHRpbWUiKSk7CisgIGJhc2VfdGltZSA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAoZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJiYXNlLXRpbWUiKSk7CisgIGNsb2NrX3JhdGUgPSBnX3ZhbHVlX2dldF91aW50IChnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgImNsb2NrLXJhdGUiKSk7CisgIGNsb2NrX2Jhc2UgPSBnX3ZhbHVlX2dldF91aW50NjQgKGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAiY2xvY2stYmFzZSIpKTsKKyAgZXh0cnRwdGltZSA9CisgICAgICBnX3ZhbHVlX2dldF91aW50NjQgKGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAic3ItZXh0LXJ0cHRpbWUiKSk7CisgIGJ1ZmZlciA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyIChnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgInNyLWJ1ZmZlciIpKTsKKworICBoYXZlX3NyID0gRkFMU0U7CisgIGhhdmVfc2RlcyA9IEZBTFNFOworCisgIGdzdF9ydGNwX2J1ZmZlcl9tYXAgKGJ1ZmZlciwgR1NUX01BUF9SRUFELCAmcnRjcCk7CisKKyAgR1NUX1JUQ1BfQlVGRkVSX0ZPUl9QQUNLRVRTIChtb3JlLCAmcnRjcCwgJnBhY2tldCkgeworICAgIC8qIGZpcnN0IHBhY2tldCBtdXN0IGJlIFNSIG9yIFJSIG9yIGVsc2UgdGhlIHZhbGlkYXRlIHdvdWxkIGhhdmUgZmFpbGVkICovCisgICAgc3dpdGNoIChnc3RfcnRjcF9wYWNrZXRfZ2V0X3R5cGUgKCZwYWNrZXQpKSB7CisgICAgICBjYXNlIEdTVF9SVENQX1RZUEVfU1I6CisgICAgICAgIC8qIG9ubHkgcGFyc2UgZmlyc3QuIFRoZXJlIGlzIG9ubHkgc3VwcG9zZWQgdG8gYmUgb25lIFNSIGluIHRoZSBwYWNrZXQKKyAgICAgICAgICogYnV0IHdlIHdpbGwgZGVhbCB3aXRoIG1hbGZvcm1lZCBwYWNrZXRzIGdyYWNlZnVsbHkgKi8KKyAgICAgICAgaWYgKGhhdmVfc3IpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIGdldCBOVFAgYW5kIFJUUCB0aW1lcyAqLworICAgICAgICBnc3RfcnRjcF9wYWNrZXRfc3JfZ2V0X3NlbmRlcl9pbmZvICgmcGFja2V0LCAmc3NyYywgJm50cHRpbWUsIE5VTEwsCisgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChiaW4sICJyZWNlaXZlZCBzeW5jIHBhY2tldCBmcm9tIFNTUkMgJTA4eCIsIHNzcmMpOworICAgICAgICAvKiBpZ25vcmUgU1IgdGhhdCBpcyBub3Qgb3VycyAqLworICAgICAgICBpZiAoc3NyYyAhPSBzdHJlYW0tPnNzcmMpCisgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaGF2ZV9zciA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX1NERVM6CisgICAgICB7CisgICAgICAgIGdib29sZWFuIG1vcmVfaXRlbXMsIG1vcmVfZW50cmllczsKKworICAgICAgICAvKiBvbmx5IGRlYWwgd2l0aCBmaXJzdCBTREVTLCB0aGVyZSBpcyBvbmx5IHN1cHBvc2VkIHRvIGJlIG9uZSBTREVTIGluCisgICAgICAgICAqIHRoZSBSVENQIHBhY2tldCBidXQgd2UgZGVhbCB3aXRoIGJhZCBwYWNrZXRzIGdyYWNlZnVsbHkuIEFsc28gYmFpbAorICAgICAgICAgKiBvdXQgaWYgd2UgaGF2ZSBub3Qgc2VlbiBhbiBTUiBpdGVtIHlldC4gKi8KKyAgICAgICAgaWYgKGhhdmVfc2RlcyB8fCAhaGF2ZV9zcikKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBHU1RfUlRDUF9TREVTX0ZPUl9JVEVNUyAobW9yZV9pdGVtcywgJnBhY2tldCkgeworICAgICAgICAgIC8qIHNraXAgaXRlbXMgdGhhdCBhcmUgbm90IGFib3V0IHRoZSBTU1JDIG9mIHRoZSBzZW5kZXIgKi8KKyAgICAgICAgICBpZiAoZ3N0X3J0Y3BfcGFja2V0X3NkZXNfZ2V0X3NzcmMgKCZwYWNrZXQpICE9IHNzcmMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIC8qIGZpbmQgdGhlIENOQU1FIGVudHJ5ICovCisgICAgICAgICAgR1NUX1JUQ1BfU0RFU19GT1JfRU5UUklFUyAobW9yZV9lbnRyaWVzLCAmcGFja2V0KSB7CisgICAgICAgICAgICBHc3RSVENQU0RFU1R5cGUgdHlwZTsKKyAgICAgICAgICAgIGd1aW50OCBsZW47CisgICAgICAgICAgICBndWludDggKmRhdGE7CisKKyAgICAgICAgICAgIGdzdF9ydGNwX3BhY2tldF9zZGVzX2dldF9lbnRyeSAoJnBhY2tldCwgJnR5cGUsICZsZW4sICZkYXRhKTsKKworICAgICAgICAgICAgaWYgKHR5cGUgPT0gR1NUX1JUQ1BfU0RFU19DTkFNRSkgeworICAgICAgICAgICAgICBHU1RfUlRQX0JJTl9MT0NLIChiaW4pOworICAgICAgICAgICAgICAvKiBhc3NvY2lhdGUgdGhlIHN0cmVhbSB0byBDTkFNRSAqLworICAgICAgICAgICAgICBnc3RfcnRwX2Jpbl9hc3NvY2lhdGUgKGJpbiwgc3RyZWFtLCBsZW4sIGRhdGEsCisgICAgICAgICAgICAgICAgICBudHB0aW1lLCBleHRydHB0aW1lLCBiYXNlX3J0cHRpbWUsIGJhc2VfdGltZSwgY2xvY2tfcmF0ZSwKKyAgICAgICAgICAgICAgICAgIGNsb2NrX2Jhc2UpOworICAgICAgICAgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKGJpbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGhhdmVfc2RlcyA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgLyogd2UgY2FuIGlnbm9yZSB0aGVzZSBwYWNrZXRzICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBnc3RfcnRjcF9idWZmZXJfdW5tYXAgKCZydGNwKTsKK30KKworLyogY3JlYXRlIGEgbmV3IHN0cmVhbSB3aXRoIEBzc3JjIGluIEBzZXNzaW9uLiBNdXN0IGJlIGNhbGxlZCB3aXRoCisgKiBSVFBfU0VTU0lPTl9MT0NLLiAqLworc3RhdGljIEdzdFJ0cEJpblN0cmVhbSAqCitjcmVhdGVfc3RyZWFtIChHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjKQoreworICBHc3RFbGVtZW50ICpidWZmZXIsICpkZW11eCA9IE5VTEw7CisgIEdzdFJ0cEJpblN0cmVhbSAqc3RyZWFtOworICBHc3RSdHBCaW4gKnJ0cGJpbjsKKyAgR3N0U3RhdGUgdGFyZ2V0OworCisgIHJ0cGJpbiA9IHNlc3Npb24tPmJpbjsKKworICBpZiAoZ19zbGlzdF9sZW5ndGggKHNlc3Npb24tPnN0cmVhbXMpID49IHJ0cGJpbi0+bWF4X3N0cmVhbXMpCisgICAgZ290byBtYXhfc3RyZWFtczsKKworICBpZiAoIShidWZmZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBqaXR0ZXJidWZmZXIiLCBOVUxMKSkpCisgICAgZ290byBub19qaXR0ZXJidWZmZXI7CisKKyAgaWYgKCFydHBiaW4tPmlnbm9yZV9wdCkKKyAgICBpZiAoIShkZW11eCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cHB0ZGVtdXgiLCBOVUxMKSkpCisgICAgICBnb3RvIG5vX2RlbXV4OworCisgIHN0cmVhbSA9IGdfbmV3MCAoR3N0UnRwQmluU3RyZWFtLCAxKTsKKyAgc3RyZWFtLT5zc3JjID0gc3NyYzsKKyAgc3RyZWFtLT5iaW4gPSBydHBiaW47CisgIHN0cmVhbS0+c2Vzc2lvbiA9IHNlc3Npb247CisgIHN0cmVhbS0+YnVmZmVyID0gYnVmZmVyOworICBzdHJlYW0tPmRlbXV4ID0gZGVtdXg7CisKKyAgc3RyZWFtLT5oYXZlX3N5bmMgPSBGQUxTRTsKKyAgc3RyZWFtLT5ydF9kZWx0YSA9IDA7CisgIHN0cmVhbS0+cnRwX2RlbHRhID0gMDsKKyAgc3RyZWFtLT5wZXJjZW50ID0gMTAwOworICBzdHJlYW0tPmNsb2NrX2Jhc2UgPSAtMTAwICogR1NUX1NFQ09ORDsKKyAgc2Vzc2lvbi0+c3RyZWFtcyA9IGdfc2xpc3RfcHJlcGVuZCAoc2Vzc2lvbi0+c3RyZWFtcywgc3RyZWFtKTsKKworICAvKiBwcm92aWRlIGNsb2NrX3JhdGUgdG8gdGhlIGppdHRlcmJ1ZmZlciB3aGVuIG5lZWRlZCAqLworICBzdHJlYW0tPmJ1ZmZlcl9wdHJlcV9zaWcgPSBnX3NpZ25hbF9jb25uZWN0IChidWZmZXIsICJyZXF1ZXN0LXB0LW1hcCIsCisgICAgICAoR0NhbGxiYWNrKSBwdF9tYXBfcmVxdWVzdGVkLCBzZXNzaW9uKTsKKyAgc3RyZWFtLT5idWZmZXJfbnRwc3RvcF9zaWcgPSBnX3NpZ25hbF9jb25uZWN0IChidWZmZXIsICJvbi1ucHQtc3RvcCIsCisgICAgICAoR0NhbGxiYWNrKSBvbl9ucHRfc3RvcCwgc3RyZWFtKTsKKworICBnX29iamVjdF9zZXRfZGF0YSAoR19PQkpFQ1QgKGJ1ZmZlciksICJHc3RSVFBCaW4uc2Vzc2lvbiIsIHNlc3Npb24pOworICBnX29iamVjdF9zZXRfZGF0YSAoR19PQkpFQ1QgKGJ1ZmZlciksICJHc3RSVFBCaW4uc3RyZWFtIiwgc3RyZWFtKTsKKworICAvKiBjb25maWd1cmUgbGF0ZW5jeSBhbmQgcGFja2V0IGxvc3QgKi8KKyAgZ19vYmplY3Rfc2V0IChidWZmZXIsICJsYXRlbmN5IiwgcnRwYmluLT5sYXRlbmN5X21zLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChidWZmZXIsICJkcm9wLW9uLWxhdGVuY3kiLCBydHBiaW4tPmRyb3Bfb25fbGF0ZW5jeSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoYnVmZmVyLCAiZG8tbG9zdCIsIHJ0cGJpbi0+ZG9fbG9zdCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoYnVmZmVyLCAibW9kZSIsIHJ0cGJpbi0+YnVmZmVyX21vZGUsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGJ1ZmZlciwgImRvLXJldHJhbnNtaXNzaW9uIiwgcnRwYmluLT5kb19yZXRyYW5zbWlzc2lvbiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoYnVmZmVyLCAibWF4LXJ0Y3AtcnRwLXRpbWUtZGlmZiIsCisgICAgICBydHBiaW4tPm1heF9ydGNwX3J0cF90aW1lX2RpZmYsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGJ1ZmZlciwgIm1heC1kcm9wb3V0LXRpbWUiLCBydHBiaW4tPm1heF9kcm9wb3V0X3RpbWUsCisgICAgICAibWF4LW1pc29yZGVyLXRpbWUiLCBydHBiaW4tPm1heF9taXNvcmRlcl90aW1lLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChidWZmZXIsICJyZmM3MjczLXN5bmMiLCBydHBiaW4tPnJmYzcyNzNfc3luYywgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoYnVmZmVyLCAibWF4LXRzLW9mZnNldC1hZGp1c3RtZW50IiwKKyAgICAgIHJ0cGJpbi0+bWF4X3RzX29mZnNldF9hZGp1c3RtZW50LCBOVUxMKTsKKworICBnX3NpZ25hbF9lbWl0IChydHBiaW4sIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX05FV19KSVRURVJCVUZGRVJdLCAwLAorICAgICAgYnVmZmVyLCBzZXNzaW9uLT5pZCwgc3NyYyk7CisKKyAgaWYgKCFydHBiaW4tPmlnbm9yZV9wdCkKKyAgICBnc3RfYmluX2FkZCAoR1NUX0JJTl9DQVNUIChydHBiaW4pLCBkZW11eCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOX0NBU1QgKHJ0cGJpbiksIGJ1ZmZlcik7CisKKyAgLyogbGluayBzdHVmZiAqLworICBpZiAoZGVtdXgpCisgICAgZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKGJ1ZmZlciwgInNyYyIsIGRlbXV4LCAic2luayIsCisgICAgICAgIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKworICBpZiAocnRwYmluLT5idWZmZXJpbmcpIHsKKyAgICBndWludDY0IGxhc3Rfb3V0OworCisgICAgR1NUX0lORk9fT0JKRUNUIChydHBiaW4sCisgICAgICAgICJiaW4gaXMgYnVmZmVyaW5nLCBzZXQgaml0dGVyYnVmZmVyIGFzIG5vdCBhY3RpdmUiKTsKKyAgICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKGJ1ZmZlciwgInNldC1hY3RpdmUiLCBGQUxTRSwgKGdpbnQ2NCkgMCwgJmxhc3Rfb3V0KTsKKyAgfQorCisKKyAgR1NUX09CSkVDVF9MT0NLIChydHBiaW4pOworICB0YXJnZXQgPSBHU1RfU1RBVEVfVEFSR0VUIChydHBiaW4pOworICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwYmluKTsKKworICAvKiBmcm9tIHNpbmsgdG8gc291cmNlICovCisgIGlmIChkZW11eCkKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGRlbXV4LCB0YXJnZXQpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYnVmZmVyLCB0YXJnZXQpOworCisgIHJldHVybiBzdHJlYW07CisKKyAgLyogRVJST1JTICovCittYXhfc3RyZWFtczoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnRwYmluLCAic3RyZWFtIGV4ZWVkcyBtYXhpbXVtICglZCkiLAorICAgICAgICBydHBiaW4tPm1heF9zdHJlYW1zKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorbm9faml0dGVyYnVmZmVyOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBjb3VsZCBub3QgY3JlYXRlIHJ0cGppdHRlcmJ1ZmZlciBlbGVtZW50Iik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK25vX2RlbXV4OgorICB7CisgICAgZ3N0X29iamVjdF91bnJlZiAoYnVmZmVyKTsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGNvdWxkIG5vdCBjcmVhdGUgcnRwcHRkZW11eCBlbGVtZW50Iik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLyogY2FsbGVkIHdpdGggUlRQX0JJTl9MT0NLICovCitzdGF0aWMgdm9pZAorZnJlZV9zdHJlYW0gKEdzdFJ0cEJpblN0cmVhbSAqIHN0cmVhbSwgR3N0UnRwQmluICogYmluKQoreworICBHU0xpc3QgKmNsaWVudHMsICpuZXh0X2NsaWVudDsKKworICBHU1RfREVCVUdfT0JKRUNUIChiaW4sICJmcmVlaW5nIHN0cmVhbSAlcCIsIHN0cmVhbSk7CisKKyAgaWYgKHN0cmVhbS0+ZGVtdXgpIHsKKyAgICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QgKHN0cmVhbS0+ZGVtdXgsIHN0cmVhbS0+ZGVtdXhfbmV3cGFkX3NpZyk7CisgICAgZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0IChzdHJlYW0tPmRlbXV4LCBzdHJlYW0tPmRlbXV4X3B0cmVxX3NpZyk7CisgICAgZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0IChzdHJlYW0tPmRlbXV4LCBzdHJlYW0tPmRlbXV4X3B0Y2hhbmdlX3NpZyk7CisgIH0KKyAgZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0IChzdHJlYW0tPmJ1ZmZlciwgc3RyZWFtLT5idWZmZXJfaGFuZGxlc3luY19zaWcpOworICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QgKHN0cmVhbS0+YnVmZmVyLCBzdHJlYW0tPmJ1ZmZlcl9wdHJlcV9zaWcpOworICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QgKHN0cmVhbS0+YnVmZmVyLCBzdHJlYW0tPmJ1ZmZlcl9udHBzdG9wX3NpZyk7CisKKyAgaWYgKHN0cmVhbS0+ZGVtdXgpCisgICAgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSAoc3RyZWFtLT5kZW11eCwgVFJVRSk7CisgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHN0cmVhbS0+YnVmZmVyLCBUUlVFKTsKKworICBpZiAoc3RyZWFtLT5kZW11eCkKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHN0cmVhbS0+ZGVtdXgsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzdHJlYW0tPmJ1ZmZlciwgR1NUX1NUQVRFX05VTEwpOworCisgIC8qIG5vdyByZW1vdmUgdGhpcyBzaWduYWwsIHdlIG5lZWQgdGhpcyB3aGlsZSBnb2luZyB0byBOVUxMIGJlY2F1c2UgaXQgdG8KKyAgICogZG8gc29tZSBjbGVhbnVwcyAqLworICBpZiAoc3RyZWFtLT5kZW11eCkKKyAgICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QgKHN0cmVhbS0+ZGVtdXgsIHN0cmVhbS0+ZGVtdXhfcGFkcmVtb3ZlZF9zaWcpOworCisgIGdzdF9iaW5fcmVtb3ZlIChHU1RfQklOX0NBU1QgKGJpbiksIHN0cmVhbS0+YnVmZmVyKTsKKyAgaWYgKHN0cmVhbS0+ZGVtdXgpCisgICAgZ3N0X2Jpbl9yZW1vdmUgKEdTVF9CSU5fQ0FTVCAoYmluKSwgc3RyZWFtLT5kZW11eCk7CisKKyAgZm9yIChjbGllbnRzID0gYmluLT5jbGllbnRzOyBjbGllbnRzOyBjbGllbnRzID0gbmV4dF9jbGllbnQpIHsKKyAgICBHc3RSdHBCaW5DbGllbnQgKmNsaWVudCA9IChHc3RSdHBCaW5DbGllbnQgKikgY2xpZW50cy0+ZGF0YTsKKyAgICBHU0xpc3QgKnN0cmVhbXMsICpuZXh0X3N0cmVhbTsKKworICAgIG5leHRfY2xpZW50ID0gZ19zbGlzdF9uZXh0IChjbGllbnRzKTsKKworICAgIGZvciAoc3RyZWFtcyA9IGNsaWVudC0+c3RyZWFtczsgc3RyZWFtczsgc3RyZWFtcyA9IG5leHRfc3RyZWFtKSB7CisgICAgICBHc3RSdHBCaW5TdHJlYW0gKm9zdHJlYW0gPSAoR3N0UnRwQmluU3RyZWFtICopIHN0cmVhbXMtPmRhdGE7CisKKyAgICAgIG5leHRfc3RyZWFtID0gZ19zbGlzdF9uZXh0IChzdHJlYW1zKTsKKworICAgICAgaWYgKG9zdHJlYW0gPT0gc3RyZWFtKSB7CisgICAgICAgIGNsaWVudC0+c3RyZWFtcyA9IGdfc2xpc3RfZGVsZXRlX2xpbmsgKGNsaWVudC0+c3RyZWFtcywgc3RyZWFtcyk7CisgICAgICAgIC8qIElmIHRoaXMgd2FzIHRoZSBsYXN0IHN0cmVhbSBiZWxvbmdpbmcgdG8gdGhpcyBjbGllbnQsCisgICAgICAgICAqIGNsZWFuIHVwIHRoZSBjbGllbnQuICovCisgICAgICAgIGlmICgtLWNsaWVudC0+bnN0cmVhbXMgPT0gMCkgeworICAgICAgICAgIGJpbi0+Y2xpZW50cyA9IGdfc2xpc3RfZGVsZXRlX2xpbmsgKGJpbi0+Y2xpZW50cywgY2xpZW50cyk7CisgICAgICAgICAgZnJlZV9jbGllbnQgKGNsaWVudCwgYmluKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBnX2ZyZWUgKHN0cmVhbSk7Cit9CisKKy8qIEdPYmplY3Qgdm1ldGhvZHMgKi8KK3N0YXRpYyB2b2lkIGdzdF9ydHBfYmluX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9iaW5fZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9iaW5fc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9iaW5fZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCisvKiBHc3RFbGVtZW50IHZtZXRob2RzICovCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9iaW5fY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyBHc3RQYWQgKmdzdF9ydHBfYmluX3JlcXVlc3RfbmV3X3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgY29uc3QgZ2NoYXIgKiBuYW1lLCBjb25zdCBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2Jpbl9yZWxlYXNlX3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIHBhZCk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2Jpbl9oYW5kbGVfbWVzc2FnZSAoR3N0QmluICogYmluLCBHc3RNZXNzYWdlICogbWVzc2FnZSk7CisKKyNkZWZpbmUgZ3N0X3J0cF9iaW5fcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwQmluLCBnc3RfcnRwX2JpbiwgR1NUX1RZUEVfQklOKTsKKworc3RhdGljIGdib29sZWFuCitfZ3N0X2VsZW1lbnRfYWNjdW11bGF0b3IgKEdTaWduYWxJbnZvY2F0aW9uSGludCAqIGloaW50LAorICAgIEdWYWx1ZSAqIHJldHVybl9hY2N1LCBjb25zdCBHVmFsdWUgKiBoYW5kbGVyX3JldHVybiwgZ3BvaW50ZXIgZHVtbXkpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisKKyAgZWxlbWVudCA9IGdfdmFsdWVfZ2V0X29iamVjdCAoaGFuZGxlcl9yZXR1cm4pOworICBHU1RfREVCVUcgKCJnb3QgZWxlbWVudCAlIiBHU1RfUFRSX0ZPUk1BVCwgZWxlbWVudCk7CisKKyAgaWYgKCEoaWhpbnQtPnJ1bl90eXBlICYgR19TSUdOQUxfUlVOX0NMRUFOVVApKQorICAgIGdfdmFsdWVfc2V0X29iamVjdCAocmV0dXJuX2FjY3UsIGVsZW1lbnQpOworCisgIC8qIHN0b3AgZW1pc3Npb24gaWYgd2UgaGF2ZSBhbiBlbGVtZW50ICovCisgIHJldHVybiAoZWxlbWVudCA9PSBOVUxMKTsKK30KKworc3RhdGljIGdib29sZWFuCitfZ3N0X2NhcHNfYWNjdW11bGF0b3IgKEdTaWduYWxJbnZvY2F0aW9uSGludCAqIGloaW50LAorICAgIEdWYWx1ZSAqIHJldHVybl9hY2N1LCBjb25zdCBHVmFsdWUgKiBoYW5kbGVyX3JldHVybiwgZ3BvaW50ZXIgZHVtbXkpCit7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgY2FwcyA9IGdfdmFsdWVfZ2V0X2JveGVkIChoYW5kbGVyX3JldHVybik7CisgIEdTVF9ERUJVRyAoImdvdCBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICBpZiAoIShpaGludC0+cnVuX3R5cGUgJiBHX1NJR05BTF9SVU5fQ0xFQU5VUCkpCisgICAgZ192YWx1ZV9zZXRfYm94ZWQgKHJldHVybl9hY2N1LCBjYXBzKTsKKworICAvKiBzdG9wIGVtaXNzaW9uIGlmIHdlIGhhdmUgYSBjYXBzICovCisgIHJldHVybiAoY2FwcyA9PSBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfYmluX2NsYXNzX2luaXQgKEdzdFJ0cEJpbkNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCaW5DbGFzcyAqZ3N0YmluX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmluX2NsYXNzID0gKEdzdEJpbkNsYXNzICopIGtsYXNzOworCisgIGdfdHlwZV9jbGFzc19hZGRfcHJpdmF0ZSAoa2xhc3MsIHNpemVvZiAoR3N0UnRwQmluUHJpdmF0ZSkpOworCisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3RfcnRwX2Jpbl9kaXNwb3NlOworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfYmluX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX2Jpbl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9ydHBfYmluX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0xBVEVOQ1ksCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoImxhdGVuY3kiLCAiQnVmZmVyIGxhdGVuY3kgaW4gbXMiLAorICAgICAgICAgICJEZWZhdWx0IGFtb3VudCBvZiBtcyB0byBidWZmZXIgaW4gdGhlIGppdHRlcmJ1ZmZlcnMiLCAwLAorICAgICAgICAgIEdfTUFYVUlOVCwgREVGQVVMVF9MQVRFTkNZX01TLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRFJPUF9PTl9MQVRFTkNZLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJkcm9wLW9uLWxhdGVuY3kiLAorICAgICAgICAgICJEcm9wIGJ1ZmZlcnMgd2hlbiBtYXhpbXVtIGxhdGVuY3kgaXMgcmVhY2hlZCIsCisgICAgICAgICAgIlRlbGxzIHRoZSBqaXR0ZXJidWZmZXIgdG8gbmV2ZXIgZXhjZWVkIHRoZSBnaXZlbiBsYXRlbmN5IGluIHNpemUiLAorICAgICAgICAgIERFRkFVTFRfRFJPUF9PTl9MQVRFTkNZLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UnRwQmluOjpyZXF1ZXN0LXB0LW1hcDoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKiBAcHQ6IHRoZSBwdAorICAgKgorICAgKiBSZXF1ZXN0IHRoZSBwYXlsb2FkIHR5cGUgYXMgI0dzdENhcHMgZm9yIEBwdCBpbiBAc2Vzc2lvbi4KKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX1JFUVVFU1RfUFRfTUFQXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJyZXF1ZXN0LXB0LW1hcCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywgcmVxdWVzdF9wdF9tYXApLAorICAgICAgX2dzdF9jYXBzX2FjY3VtdWxhdG9yLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR1NUX1RZUEVfQ0FQUywKKyAgICAgIDIsIEdfVFlQRV9VSU5ULCBHX1RZUEVfVUlOVCk7CisKKyAgICAvKioKKyAgICogR3N0UnRwQmluOjpwYXlsb2FkLXR5cGUtY2hhbmdlOgorICAgKiBAcnRwYmluOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqIEBwdDogdGhlIHB0CisgICAqCisgICAqIFNpZ25hbCB0aGF0IHRoZSBjdXJyZW50IHBheWxvYWQgdHlwZSBjaGFuZ2VkIHRvIEBwdCBpbiBAc2Vzc2lvbi4KKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX1BBWUxPQURfVFlQRV9DSEFOR0VdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoInBheWxvYWQtdHlwZS1jaGFuZ2UiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwQmluQ2xhc3MsIHBheWxvYWRfdHlwZV9jaGFuZ2UpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdfVFlQRV9VSU5UKTsKKworICAvKioKKyAgICogR3N0UnRwQmluOjpjbGVhci1wdC1tYXA6CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKgorICAgKiBDbGVhciBhbGwgcHJldmlvdXNseSBjYWNoZWQgcHQtbWFwcGluZyBvYnRhaW5lZCB3aXRoCisgICAqICNHc3RSdHBCaW46OnJlcXVlc3QtcHQtbWFwLgorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfQ0xFQVJfUFRfTUFQXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJjbGVhci1wdC1tYXAiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QgfCBHX1NJR05BTF9BQ1RJT04sIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwQmluQ2xhc3MsCisgICAgICAgICAgY2xlYXJfcHRfbWFwKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1ZPSUQsIEdfVFlQRV9OT05FLAorICAgICAgMCwgR19UWVBFX05PTkUpOworCisgIC8qKgorICAgKiBHc3RSdHBCaW46OnJlc2V0LXN5bmM6CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKgorICAgKiBSZXNldCBhbGwgY3VycmVudGx5IGNvbmZpZ3VyZWQgbGlwLXN5bmMgcGFyYW1ldGVycyBhbmQgcmVxdWlyZSBuZXcgU1IKKyAgICogcGFja2V0cyBmb3IgYWxsIHN0cmVhbXMgYmVmb3JlIGxpcC1zeW5jIGlzIGF0dGVtcHRlZCBhZ2Fpbi4KKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX1JFU0VUX1NZTkNdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoInJlc2V0LXN5bmMiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QgfCBHX1NJR05BTF9BQ1RJT04sIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwQmluQ2xhc3MsCisgICAgICAgICAgcmVzZXRfc3luYyksIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19WT0lELCBHX1RZUEVfTk9ORSwKKyAgICAgIDAsIEdfVFlQRV9OT05FKTsKKworICAvKioKKyAgICogR3N0UnRwQmluOjpnZXQtc2Vzc2lvbjoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBpZDogdGhlIHNlc3Npb24gaWQKKyAgICoKKyAgICogUmVxdWVzdCB0aGUgcmVsYXRlZCBHc3RSdHBTZXNzaW9uIGFzICNHc3RFbGVtZW50IHJlbGF0ZWQgd2l0aCBzZXNzaW9uIEBpZC4KKyAgICoKKyAgICogU2luY2U6IDEuOAorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfR0VUX1NFU1NJT05dID0KKyAgICAgIGdfc2lnbmFsX25ldyAoImdldC1zZXNzaW9uIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNUIHwgR19TSUdOQUxfQUNUSU9OLCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cEJpbkNsYXNzLAorICAgICAgICAgIGdldF9zZXNzaW9uKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsCisgICAgICBHU1RfVFlQRV9FTEVNRU5ULCAxLCBHX1RZUEVfVUlOVCk7CisKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6Z2V0LWludGVybmFsLXNlc3Npb246CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAaWQ6IHRoZSBzZXNzaW9uIGlkCisgICAqCisgICAqIFJlcXVlc3QgdGhlIGludGVybmFsIFJUUFNlc3Npb24gb2JqZWN0IGFzICNHT2JqZWN0IGluIHNlc3Npb24gQGlkLgorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfR0VUX0lOVEVSTkFMX1NFU1NJT05dID0KKyAgICAgIGdfc2lnbmFsX25ldyAoImdldC1pbnRlcm5hbC1zZXNzaW9uIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNUIHwgR19TSUdOQUxfQUNUSU9OLCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cEJpbkNsYXNzLAorICAgICAgICAgIGdldF9pbnRlcm5hbF9zZXNzaW9uKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsCisgICAgICBSVFBfVFlQRV9TRVNTSU9OLCAxLCBHX1RZUEVfVUlOVCk7CisKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6b24tbmV3LXNzcmM6CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc2Vzc2lvbjogdGhlIHNlc3Npb24KKyAgICogQHNzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhIG5ldyBTU1JDIHRoYXQgZW50ZXJlZCBAc2Vzc2lvbi4KKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX09OX05FV19TU1JDXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1uZXctc3NyYyIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywgb25fbmV3X3NzcmMpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdfVFlQRV9VSU5UKTsKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6b24tc3NyYy1jb2xsaXNpb246CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc2Vzc2lvbjogdGhlIHNlc3Npb24KKyAgICogQHNzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSB3aGVuIHdlIGhhdmUgYW4gU1NSQyBjb2xsaXNpb24KKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfQ09MTElTSU9OXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1zc3JjLWNvbGxpc2lvbiIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywgb25fc3NyY19jb2xsaXNpb24pLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdfVFlQRV9VSU5UKTsKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6b24tc3NyYy12YWxpZGF0ZWQ6CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc2Vzc2lvbjogdGhlIHNlc3Npb24KKyAgICogQHNzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhIG5ldyBTU1JDIHRoYXQgYmVjYW1lIHZhbGlkYXRlZC4KKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfVkFMSURBVEVEXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1zc3JjLXZhbGlkYXRlZCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywgb25fc3NyY192YWxpZGF0ZWQpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdfVFlQRV9VSU5UKTsKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6b24tc3NyYy1hY3RpdmU6CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc2Vzc2lvbjogdGhlIHNlc3Npb24KKyAgICogQHNzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhIFNTUkMgdGhhdCBpcyBhY3RpdmUsIGkuZS4sIHNlbmRpbmcgUlRDUC4KKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfQUNUSVZFXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1zc3JjLWFjdGl2ZSIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywgb25fc3NyY19hY3RpdmUpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdfVFlQRV9VSU5UKTsKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6b24tc3NyYy1zZGVzOgorICAgKiBAcnRwYmluOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqIEBzc3JjOiB0aGUgU1NSQworICAgKgorICAgKiBOb3RpZnkgb2YgYSBTU1JDIHRoYXQgaXMgYWN0aXZlLCBpLmUuLCBzZW5kaW5nIFJUQ1AuCisgICAqLworICBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9TU1JDX1NERVNdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXNzcmMtc2RlcyIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywgb25fc3NyY19zZGVzKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMiwgR19UWVBFX1VJTlQsCisgICAgICBHX1RZUEVfVUlOVCk7CisKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6b24tYnllLXNzcmM6CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc2Vzc2lvbjogdGhlIHNlc3Npb24KKyAgICogQHNzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhbiBTU1JDIHRoYXQgYmVjYW1lIGluYWN0aXZlIGJlY2F1c2Ugb2YgYSBCWUUgcGFja2V0LgorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfT05fQllFX1NTUkNdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLWJ5ZS1zc3JjIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cEJpbkNsYXNzLCBvbl9ieWVfc3NyYyksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDIsIEdfVFlQRV9VSU5ULAorICAgICAgR19UWVBFX1VJTlQpOworICAvKioKKyAgICogR3N0UnRwQmluOjpvbi1ieWUtdGltZW91dDoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKiBAc3NyYzogdGhlIFNTUkMKKyAgICoKKyAgICogTm90aWZ5IG9mIGFuIFNTUkMgdGhhdCBoYXMgdGltZWQgb3V0IGJlY2F1c2Ugb2YgQllFCisgICAqLworICBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9CWUVfVElNRU9VVF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tYnllLXRpbWVvdXQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwQmluQ2xhc3MsIG9uX2J5ZV90aW1lb3V0KSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMiwgR19UWVBFX1VJTlQsCisgICAgICBHX1RZUEVfVUlOVCk7CisgIC8qKgorICAgKiBHc3RSdHBCaW46Om9uLXRpbWVvdXQ6CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc2Vzc2lvbjogdGhlIHNlc3Npb24KKyAgICogQHNzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhbiBTU1JDIHRoYXQgaGFzIHRpbWVkIG91dAorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfT05fVElNRU9VVF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tdGltZW91dCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywgb25fdGltZW91dCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDIsIEdfVFlQRV9VSU5ULAorICAgICAgR19UWVBFX1VJTlQpOworICAvKioKKyAgICogR3N0UnRwQmluOjpvbi1zZW5kZXItdGltZW91dDoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKiBAc3NyYzogdGhlIFNTUkMKKyAgICoKKyAgICogTm90aWZ5IG9mIGEgc2VuZGVyIFNTUkMgdGhhdCBoYXMgdGltZWQgb3V0IGFuZCBiZWNhbWUgYSByZWNlaXZlcgorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfT05fU0VOREVSX1RJTUVPVVRdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXNlbmRlci10aW1lb3V0IiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cEJpbkNsYXNzLCBvbl9zZW5kZXJfdGltZW91dCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDIsIEdfVFlQRV9VSU5ULAorICAgICAgR19UWVBFX1VJTlQpOworCisgIC8qKgorICAgKiBHc3RSdHBCaW46Om9uLW5wdC1zdG9wOgorICAgKiBAcnRwYmluOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqIEBzc3JjOiB0aGUgU1NSQworICAgKgorICAgKiBOb3RpZnkgdGhhdCBTU1JDIHNlbmRlciBoYXMgc2VudCBkYXRhIHVwIHRvIHRoZSBjb25maWd1cmVkIE5QVCBzdG9wIHRpbWUuCisgICAqLworICBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9OUFRfU1RPUF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tbnB0LXN0b3AiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwQmluQ2xhc3MsIG9uX25wdF9zdG9wKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMiwgR19UWVBFX1VJTlQsCisgICAgICBHX1RZUEVfVUlOVCk7CisKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6cmVxdWVzdC1ydHAtZW5jb2RlcjoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKgorICAgKiBSZXF1ZXN0IGFuIFJUUCBlbmNvZGVyIGVsZW1lbnQgZm9yIHRoZSBnaXZlbiBAc2Vzc2lvbi4gVGhlIGVuY29kZXIKKyAgICogZWxlbWVudCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBiaW4gaWYgbm90IHByZXZpb3VzbHkgYWRkZWQuCisgICAqCisgICAqIElmIG5vIGhhbmRsZXIgaXMgY29ubmVjdGVkLCBubyBlbmNvZGVyIHdpbGwgYmUgdXNlZC4KKyAgICoKKyAgICogU2luY2U6IDEuNAorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfUkVRVUVTVF9SVFBfRU5DT0RFUl0gPQorICAgICAgZ19zaWduYWxfbmV3ICgicmVxdWVzdC1ydHAtZW5jb2RlciIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywKKyAgICAgICAgICByZXF1ZXN0X3J0cF9lbmNvZGVyKSwgX2dzdF9lbGVtZW50X2FjY3VtdWxhdG9yLCBOVUxMLAorICAgICAgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdTVF9UWVBFX0VMRU1FTlQsIDEsIEdfVFlQRV9VSU5UKTsKKworICAvKioKKyAgICogR3N0UnRwQmluOjpyZXF1ZXN0LXJ0cC1kZWNvZGVyOgorICAgKiBAcnRwYmluOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqCisgICAqIFJlcXVlc3QgYW4gUlRQIGRlY29kZXIgZWxlbWVudCBmb3IgdGhlIGdpdmVuIEBzZXNzaW9uLiBUaGUgZGVjb2RlcgorICAgKiBlbGVtZW50IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGJpbiBpZiBub3QgcHJldmlvdXNseSBhZGRlZC4KKyAgICoKKyAgICogSWYgbm8gaGFuZGxlciBpcyBjb25uZWN0ZWQsIG5vIGVuY29kZXIgd2lsbCBiZSB1c2VkLgorICAgKgorICAgKiBTaW5jZTogMS40CisgICAqLworICBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9SRVFVRVNUX1JUUF9ERUNPREVSXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJyZXF1ZXN0LXJ0cC1kZWNvZGVyIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cEJpbkNsYXNzLAorICAgICAgICAgIHJlcXVlc3RfcnRwX2RlY29kZXIpLCBfZ3N0X2VsZW1lbnRfYWNjdW11bGF0b3IsIE5VTEwsCisgICAgICBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR1NUX1RZUEVfRUxFTUVOVCwgMSwgR19UWVBFX1VJTlQpOworCisgIC8qKgorICAgKiBHc3RSdHBCaW46OnJlcXVlc3QtcnRjcC1lbmNvZGVyOgorICAgKiBAcnRwYmluOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqCisgICAqIFJlcXVlc3QgYW4gUlRDUCBlbmNvZGVyIGVsZW1lbnQgZm9yIHRoZSBnaXZlbiBAc2Vzc2lvbi4gVGhlIGVuY29kZXIKKyAgICogZWxlbWVudCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBiaW4gaWYgbm90IHByZXZpb3VzbHkgYWRkZWQuCisgICAqCisgICAqIElmIG5vIGhhbmRsZXIgaXMgY29ubmVjdGVkLCBubyBlbmNvZGVyIHdpbGwgYmUgdXNlZC4KKyAgICoKKyAgICogU2luY2U6IDEuNAorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfUkVRVUVTVF9SVENQX0VOQ09ERVJdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoInJlcXVlc3QtcnRjcC1lbmNvZGVyIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cEJpbkNsYXNzLAorICAgICAgICAgIHJlcXVlc3RfcnRjcF9lbmNvZGVyKSwgX2dzdF9lbGVtZW50X2FjY3VtdWxhdG9yLCBOVUxMLAorICAgICAgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdTVF9UWVBFX0VMRU1FTlQsIDEsIEdfVFlQRV9VSU5UKTsKKworICAvKioKKyAgICogR3N0UnRwQmluOjpyZXF1ZXN0LXJ0Y3AtZGVjb2RlcjoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKgorICAgKiBSZXF1ZXN0IGFuIFJUQ1AgZGVjb2RlciBlbGVtZW50IGZvciB0aGUgZ2l2ZW4gQHNlc3Npb24uIFRoZSBkZWNvZGVyCisgICAqIGVsZW1lbnQgd2lsbCBiZSBhZGRlZCB0byB0aGUgYmluIGlmIG5vdCBwcmV2aW91c2x5IGFkZGVkLgorICAgKgorICAgKiBJZiBubyBoYW5kbGVyIGlzIGNvbm5lY3RlZCwgbm8gZW5jb2RlciB3aWxsIGJlIHVzZWQuCisgICAqCisgICAqIFNpbmNlOiAxLjQKKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX1JFUVVFU1RfUlRDUF9ERUNPREVSXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJyZXF1ZXN0LXJ0Y3AtZGVjb2RlciIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywKKyAgICAgICAgICByZXF1ZXN0X3J0Y3BfZGVjb2RlciksIF9nc3RfZWxlbWVudF9hY2N1bXVsYXRvciwgTlVMTCwKKyAgICAgIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHU1RfVFlQRV9FTEVNRU5ULCAxLCBHX1RZUEVfVUlOVCk7CisKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6bmV3LWppdHRlcmJ1ZmZlcjoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBqaXR0ZXJidWZmZXI6IHRoZSBuZXcgaml0dGVyYnVmZmVyCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKiBAc3NyYzogdGhlIFNTUkMKKyAgICoKKyAgICogTm90aWZ5IHRoYXQgYSBuZXcgQGppdHRlcmJ1ZmZlciB3YXMgY3JlYXRlZCBmb3IgQHNlc3Npb24gYW5kIEBzc3JjLgorICAgKiBUaGlzIHNpZ25hbCBjYW4sIGZvciBleGFtcGxlLCBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBAaml0dGVyYnVmZmVyLgorICAgKgorICAgKiBTaW5jZTogMS40CisgICAqLworICBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9ORVdfSklUVEVSQlVGRkVSXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJuZXctaml0dGVyYnVmZmVyIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cEJpbkNsYXNzLAorICAgICAgICAgIG5ld19qaXR0ZXJidWZmZXIpLCBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywKKyAgICAgIEdfVFlQRV9OT05FLCAzLCBHU1RfVFlQRV9FTEVNRU5ULCBHX1RZUEVfVUlOVCwgR19UWVBFX1VJTlQpOworCisgIC8qKgorICAgKiBHc3RSdHBCaW46OnJlcXVlc3QtYXV4LXNlbmRlcjoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKgorICAgKiBSZXF1ZXN0IGFuIEFVWCBzZW5kZXIgZWxlbWVudCBmb3IgdGhlIGdpdmVuIEBzZXNzaW9uLiBUaGUgQVVYCisgICAqIGVsZW1lbnQgd2lsbCBiZSBhZGRlZCB0byB0aGUgYmluLgorICAgKgorICAgKiBJZiBubyBoYW5kbGVyIGlzIGNvbm5lY3RlZCwgbm8gQVVYIGVsZW1lbnQgd2lsbCBiZSB1c2VkLgorICAgKgorICAgKiBTaW5jZTogMS40CisgICAqLworICBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9SRVFVRVNUX0FVWF9TRU5ERVJdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoInJlcXVlc3QtYXV4LXNlbmRlciIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywKKyAgICAgICAgICByZXF1ZXN0X2F1eF9zZW5kZXIpLCBfZ3N0X2VsZW1lbnRfYWNjdW11bGF0b3IsIE5VTEwsCisgICAgICBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR1NUX1RZUEVfRUxFTUVOVCwgMSwgR19UWVBFX1VJTlQpOworICAvKioKKyAgICogR3N0UnRwQmluOjpyZXF1ZXN0LWF1eC1yZWNlaXZlcjoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKgorICAgKiBSZXF1ZXN0IGFuIEFVWCByZWNlaXZlciBlbGVtZW50IGZvciB0aGUgZ2l2ZW4gQHNlc3Npb24uIFRoZSBBVVgKKyAgICogZWxlbWVudCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBiaW4uCisgICAqCisgICAqIElmIG5vIGhhbmRsZXIgaXMgY29ubmVjdGVkLCBubyBBVVggZWxlbWVudCB3aWxsIGJlIHVzZWQuCisgICAqCisgICAqIFNpbmNlOiAxLjQKKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX1JFUVVFU1RfQVVYX1JFQ0VJVkVSXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJyZXF1ZXN0LWF1eC1yZWNlaXZlciIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBCaW5DbGFzcywKKyAgICAgICAgICByZXF1ZXN0X2F1eF9yZWNlaXZlciksIF9nc3RfZWxlbWVudF9hY2N1bXVsYXRvciwgTlVMTCwKKyAgICAgIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHU1RfVFlQRV9FTEVNRU5ULCAxLCBHX1RZUEVfVUlOVCk7CisgIC8qKgorICAgKiBHc3RSdHBCaW46Om9uLW5ldy1zZW5kZXItc3NyYzoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKiBAc3NyYzogdGhlIHNlbmRlciBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhIG5ldyBzZW5kZXIgU1NSQyB0aGF0IGVudGVyZWQgQHNlc3Npb24uCisgICAqCisgICAqIFNpbmNlOiAxLjgKKyAgICovCisgIGdzdF9ydHBfYmluX3NpZ25hbHNbU0lHTkFMX09OX05FV19TRU5ERVJfU1NSQ10gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tbmV3LXNlbmRlci1zc3JjIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cEJpbkNsYXNzLCBvbl9uZXdfc2VuZGVyX3NzcmMpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdfVFlQRV9VSU5UKTsKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjo6b24tc2VuZGVyLXNzcmMtYWN0aXZlOgorICAgKiBAcnRwYmluOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqIEBzc3JjOiB0aGUgc2VuZGVyIFNTUkMKKyAgICoKKyAgICogTm90aWZ5IG9mIGEgc2VuZGVyIFNTUkMgdGhhdCBpcyBhY3RpdmUsIGkuZS4sIHNlbmRpbmcgUlRDUC4KKyAgICoKKyAgICogU2luY2U6IDEuOAorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfT05fU0VOREVSX1NTUkNfQUNUSVZFXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1zZW5kZXItc3NyYy1hY3RpdmUiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwQmluQ2xhc3MsCisgICAgICAgICAgb25fc2VuZGVyX3NzcmNfYWN0aXZlKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsCisgICAgICBHX1RZUEVfTk9ORSwgMiwgR19UWVBFX1VJTlQsIEdfVFlQRV9VSU5UKTsKKworCisgIC8qKgorICAgKiBHc3RSdHBCaW46Om9uLWJ1bmRsZWQtc3NyYzoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzc3JjOiB0aGUgYnVuZGxlZCBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhIG5ldyBpbmNvbWluZyBidW5kbGVkIFNTUkMuIElmIG5vIGhhbmRsZXIgaXMgY29ubmVjdGVkIHRvIHRoZQorICAgKiBzaWduYWwgdGhlbiB0aGUgI0dzdFJ0cFNlc3Npb24gY3JlYXRlZCBmb3IgdGhlIHJlY3ZfcnRwX3NpbmtfXCV1CisgICAqIHJlcXVlc3QgcGFkIHdpbGwgYmUgbWFuYWdpbmcgdGhpcyBuZXcgU1NSQy4gSG93ZXZlciBpZiB0aGVyZSBpcyBhIGhhbmRsZXIKKyAgICogY29ubmVjdGVkIHRoZW4gdGhlIGFwcGxpY2F0aW9uIGNhbiBkZWNpZGVkIHRvIGRpc3BhdGNoIHRoaXMgbmV3IHN0cmVhbSB0bworICAgKiBhbm90aGVyIHNlc3Npb24gYnkgcHJvdmlkaW5nIGl0cyBJRCBhcyByZXR1cm4gdmFsdWUgb2YgdGhlIGhhbmRsZXIuIFRoaXMKKyAgICogY2FuIGJlIHBhcnRpY3VsYXJseSB1c2VmdWwgdG8ga2VlcCByZXRyYW5zbWlzc2lvbiBTU1JDcyBncm91cGVkIHdpdGggdGhlCisgICAqIHNlc3Npb24gZm9yIHdoaWNoIHRoZXkgaGFuZGxlIHJldHJhbnNtaXNzaW9uLgorICAgKgorICAgKiBTaW5jZTogMS4xMgorICAgKi8KKyAgZ3N0X3J0cF9iaW5fc2lnbmFsc1tTSUdOQUxfT05fQlVORExFRF9TU1JDXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1idW5kbGVkLXNzcmMiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwQmluQ2xhc3MsCisgICAgICAgICAgb25fYnVuZGxlZF9zc3JjKSwgTlVMTCwgTlVMTCwKKyAgICAgIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfVUlOVCwgMSwgR19UWVBFX1VJTlQpOworCisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TREVTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgic2RlcyIsICJTREVTIiwKKyAgICAgICAgICAiVGhlIFNERVMgaXRlbXMgb2YgdGhpcyBzZXNzaW9uIiwKKyAgICAgICAgICBHU1RfVFlQRV9TVFJVQ1RVUkUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRE9fTE9TVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZG8tbG9zdCIsICJEbyBMb3N0IiwKKyAgICAgICAgICAiU2VuZCBhbiBldmVudCBkb3duc3RyZWFtIHdoZW4gYSBwYWNrZXQgaXMgbG9zdCIsIERFRkFVTFRfRE9fTE9TVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0FVVE9SRU1PVkUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImF1dG9yZW1vdmUiLCAiQXV0byBSZW1vdmUiLAorICAgICAgICAgICJBdXRvbWF0aWNhbGx5IHJlbW92ZSB0aW1lZCBvdXQgc291cmNlcyIsIERFRkFVTFRfQVVUT1JFTU9WRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lHTk9SRV9QVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiaWdub3JlLXB0IiwgIklnbm9yZSBQVCIsCisgICAgICAgICAgIkRvIG5vdCBkZW11bHRpcGxleCBiYXNlZCBvbiBQVCB2YWx1ZXMiLCBERUZBVUxUX0lHTk9SRV9QVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1VTRV9QSVBFTElORV9DTE9DSywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgidXNlLXBpcGVsaW5lLWNsb2NrIiwgIlVzZSBwaXBlbGluZSBjbG9jayIsCisgICAgICAgICAgIlVzZSB0aGUgcGlwZWxpbmUgcnVubmluZy10aW1lIHRvIHNldCB0aGUgTlRQIHRpbWUgaW4gdGhlIFJUQ1AgU1IgbWVzc2FnZXMgIgorICAgICAgICAgICIoREVQUkVDQVRFRDogVXNlIG50cC10aW1lLXNvdXJjZSBwcm9wZXJ0eSkiLAorICAgICAgICAgIERFRkFVTFRfVVNFX1BJUEVMSU5FX0NMT0NLLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdfUEFSQU1fREVQUkVDQVRFRCkpOworICAvKioKKyAgICogR3N0UnRwQmluOmJ1ZmZlci1tb2RlOgorICAgKgorICAgKiBDb250cm9sIHRoZSBidWZmZXJpbmcgYW5kIHRpbWVzdGFtcGluZyBtb2RlIHVzZWQgYnkgdGhlIGppdHRlcmJ1ZmZlci4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQlVGRkVSX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoImJ1ZmZlci1tb2RlIiwgIkJ1ZmZlciBNb2RlIiwKKyAgICAgICAgICAiQ29udHJvbCB0aGUgYnVmZmVyaW5nIGFsZ29yaXRobSBpbiB1c2UiLCBSVFBfVFlQRV9KSVRURVJfQlVGRkVSX01PREUsCisgICAgICAgICAgREVGQVVMVF9CVUZGRVJfTU9ERSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RSdHBCaW46bnRwLXN5bmM6CisgICAqCisgICAqIFNldCB0aGUgTlRQIHRpbWUgZnJvbSB0aGUgc2VuZGVyIHJlcG9ydHMgYXMgdGhlIHJ1bm5pbmctdGltZSBvbiB0aGUKKyAgICogYnVmZmVycy4gV2hlbiBib3RoIHRoZSBzZW5kZXIgYW5kIHJlY2VpdmVyIGhhdmUgc3ljaHJvbml6ZWQKKyAgICogcnVubmluZy10aW1lLCBpLmUuIHdoZW4gdGhlIGNsb2NrIGFuZCBiYXNlLXRpbWUgaXMgc2hhcmVkCisgICAqIGJldHdlZW4gdGhlIHJlY2VpdmVycyBhbmQgdGhlIGFuZCB0aGUgc2VuZGVycywgdGhpcyBvcHRpb24gY2FuIGJlCisgICAqIHVzZWQgdG8gc3luY2hyb25pemUgcmVjZWl2ZXJzIG9uIG11bHRpcGxlIG1hY2hpbmVzLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9OVFBfU1lOQywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgibnRwLXN5bmMiLCAiU3luYyBvbiBOVFAgY2xvY2siLAorICAgICAgICAgICJTeW5jaHJvbml6ZSByZWNlaXZlZCBzdHJlYW1zIHRvIHRoZSBOVFAgY2xvY2siLCBERUZBVUxUX05UUF9TWU5DLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSdHBCaW46cnRjcC1zeW5jOgorICAgKgorICAgKiBJZiBub3Qgc3luY2hyb25pemluZyAoZGlyZWN0bHkpIHRvIHRoZSBOVFAgY2xvY2ssIGRldGVybWluZXMgaG93IHRvIHN5bmMKKyAgICogdGhlIHZhcmlvdXMgc3RyZWFtcy4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRDUF9TWU5DLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJydGNwLXN5bmMiLCAiUlRDUCBTeW5jIiwKKyAgICAgICAgICAiVXNlIG9mIFJUQ1AgU1IgaW4gc3luY2hyb25pemF0aW9uIiwgR1NUX1JUUF9CSU5fUlRDUF9TWU5DX1RZUEUsCisgICAgICAgICAgREVGQVVMVF9SVENQX1NZTkMsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSdHBCaW46cnRjcC1zeW5jLWludGVydmFsOgorICAgKgorICAgKiBEZXRlcm1pbmVzIGhvdyBvZnRlbiB0byBzeW5jIHN0cmVhbXMgdXNpbmcgUlRDUCBkYXRhLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVENQX1NZTkNfSU5URVJWQUwsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInJ0Y3Atc3luYy1pbnRlcnZhbCIsICJSVENQIFN5bmMgSW50ZXJ2YWwiLAorICAgICAgICAgICJSVENQIFNSIGludGVydmFsIHN5bmNocm9uaXphdGlvbiAobXMpICgwID0gYWx3YXlzKSIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCBERUZBVUxUX1JUQ1BfU1lOQ19JTlRFUlZBTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RPX1NZTkNfRVZFTlQsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImRvLXN5bmMtZXZlbnQiLCAiRG8gU3luYyBFdmVudCIsCisgICAgICAgICAgIlNlbmQgZXZlbnQgZG93bnN0cmVhbSB3aGVuIGEgc3RyZWFtIGlzIHN5bmNocm9uaXplZCB0byB0aGUgc2VuZGVyIiwKKyAgICAgICAgICBERUZBVUxUX0RPX1NZTkNfRVZFTlQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSdHBCaW46ZG8tcmV0cmFuc21pc3Npb246CisgICAqCisgICAqIEVuYWJsZXMgUlRQIHJldHJhbnNtaXNzaW9uIG9uIGFsbCBzdHJlYW1zLiBUbyBjb250cm9sIHJldHJhbnNtaXNzaW9uIG9uCisgICAqIGEgcGVyLVNTUkMgYmFzaXMsIGNvbm5lY3QgdG8gdGhlICNHc3RSdHBCaW46Om5ldy1qaXR0ZXJidWZmZXIgc2lnbmFsIGFuZAorICAgKiBzZXQgdGhlICNHc3RSdHBKaXR0ZXJCdWZmZXI6OmRvLXJldHJhbnNtaXNzaW9uIHByb3BlcnR5IG9uIHRoZQorICAgKiAjR3N0UnRwSml0dGVyQnVmZmVyIG9iamVjdCBpbnN0ZWFkLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ET19SRVRSQU5TTUlTU0lPTiwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZG8tcmV0cmFuc21pc3Npb24iLCAiRG8gcmV0cmFuc21pc3Npb24iLAorICAgICAgICAgICJFbmFibGUgcmV0cmFuc21pc3Npb24gb24gYWxsIHN0cmVhbXMiLAorICAgICAgICAgIERFRkFVTFRfRE9fUkVUUkFOU01JU1NJT04sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjpydHAtcHJvZmlsZToKKyAgICoKKyAgICogU2V0cyB0aGUgZGVmYXVsdCBSVFAgcHJvZmlsZSBvZiBuZXdseSBjcmVhdGVkIFJUUCBzZXNzaW9ucy4gVGhlCisgICAqIHByb2ZpbGUgY2FuIGJlIGNoYW5nZWQgYWZ0ZXJ3YXJkcyBvbiBhIHBlci1zZXNzaW9uIGJhc2lzLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVFBfUFJPRklMRSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgicnRwLXByb2ZpbGUiLCAiUlRQIFByb2ZpbGUiLAorICAgICAgICAgICJEZWZhdWx0IFJUUCBwcm9maWxlIG9mIG5ld2x5IGNyZWF0ZWQgc2Vzc2lvbnMiLAorICAgICAgICAgIEdTVF9UWVBFX1JUUF9QUk9GSUxFLCBERUZBVUxUX1JUUF9QUk9GSUxFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTlRQX1RJTUVfU09VUkNFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJudHAtdGltZS1zb3VyY2UiLCAiTlRQIFRpbWUgU291cmNlIiwKKyAgICAgICAgICAiTlRQIHRpbWUgc291cmNlIGZvciBSVENQIHBhY2tldHMiLAorICAgICAgICAgIGdzdF9ydHBfbnRwX3RpbWVfc291cmNlX2dldF90eXBlICgpLCBERUZBVUxUX05UUF9USU1FX1NPVVJDRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JUQ1BfU1lOQ19TRU5EX1RJTUUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInJ0Y3Atc3luYy1zZW5kLXRpbWUiLCAiUlRDUCBTeW5jIFNlbmQgVGltZSIsCisgICAgICAgICAgIlVzZSBzZW5kIHRpbWUgb3IgY2FwdHVyZSB0aW1lIGZvciBSVENQIHN5bmMgIgorICAgICAgICAgICIoVFJVRSA9IHNlbmQgdGltZSwgRkFMU0UgPSBjYXB0dXJlIHRpbWUpIiwKKyAgICAgICAgICBERUZBVUxUX1JUQ1BfU1lOQ19TRU5EX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoIm1heC1ydGNwLXJ0cC10aW1lLWRpZmYiLCAiTWF4IFJUQ1AgUlRQIFRpbWUgRGlmZiIsCisgICAgICAgICAgIk1heGltdW0gYW1vdW50IG9mIHRpbWUgaW4gbXMgdGhhdCB0aGUgUlRQIHRpbWUgaW4gUlRDUCBTUnMgIgorICAgICAgICAgICJpcyBhbGxvd2VkIHRvIGJlIGFoZWFkICgtMSBkaXNhYmxlZCkiLCAtMSwgR19NQVhJTlQsCisgICAgICAgICAgREVGQVVMVF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX0RST1BPVVRfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LWRyb3BvdXQtdGltZSIsICJNYXggZHJvcG91dCB0aW1lIiwKKyAgICAgICAgICAiVGhlIG1heGltdW0gdGltZSAobWlsbGlzZWNvbmRzKSBvZiBtaXNzaW5nIHBhY2tldHMgdG9sZXJhdGVkLiIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCBERUZBVUxUX01BWF9EUk9QT1VUX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfTUlTT1JERVJfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LW1pc29yZGVyLXRpbWUiLCAiTWF4IG1pc29yZGVyIHRpbWUiLAorICAgICAgICAgICJUaGUgbWF4aW11bSB0aW1lIChtaWxsaXNlY29uZHMpIG9mIG1pc29yZGVyZWQgcGFja2V0cyB0b2xlcmF0ZWQuIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfTUFYX01JU09SREVSX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SRkM3MjczX1NZTkMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInJmYzcyNzMtc3luYyIsICJTeW5jIG9uIFJGQzcyNzMgY2xvY2siLAorICAgICAgICAgICJTeW5jaHJvbml6ZSByZWNlaXZlZCBzdHJlYW1zIHRvIHRoZSBSRkM3MjczIGNsb2NrICIKKyAgICAgICAgICAiKHJlcXVpcmVzIGNsb2NrIGFuZCBvZmZzZXQgdG8gYmUgcHJvdmlkZWQpIiwgREVGQVVMVF9SRkM3MjczX1NZTkMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfU1RSRUFNUywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LXN0cmVhbXMiLCAiTWF4IFN0cmVhbXMiLAorICAgICAgICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RyZWFtcyB0byBjcmVhdGUgZm9yIG9uZSBzZXNzaW9uIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfTUFYX1NUUkVBTVMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjptYXgtdHMtb2Zmc2V0LWFkanVzdG1lbnQ6CisgICAqCisgICAqIFN5bmNpbmcgdGltZSBzdGFtcHMgdG8gTlRQIHRpbWUgYWRkcyBhIHRpbWUgb2Zmc2V0LiBUaGlzIHBhcmFtZXRlcgorICAgKiBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5hbm9zZWNvbmRzIHBlciBmcmFtZSB0aGF0IHRoaXMgdGltZSBvZmZzZXQKKyAgICogbWF5IGJlIGFkanVzdGVkIHdpdGguIFRoaXMgaXMgdXNlZCB0byBhdm9pZCBzdWRkZW4gbGFyZ2UgY2hhbmdlcyB0byB0aW1lCisgICAqIHN0YW1wcy4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX1RTX09GRlNFVF9BREpVU1RNRU5ULAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoIm1heC10cy1vZmZzZXQtYWRqdXN0bWVudCIsCisgICAgICAgICAgIk1heCBUaW1lc3RhbXAgT2Zmc2V0IEFkanVzdG1lbnQiLAorICAgICAgICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2YgbmFub3NlY29uZHMgcGVyIGZyYW1lIHRoYXQgdGltZSBzdGFtcCBvZmZzZXRzICIKKyAgICAgICAgICAibWF5IGJlIGFkanVzdGVkICgwID0gbm8gbGltaXQpLiIsIDAsIEdfTUFYVUlOVDY0LAorICAgICAgICAgIERFRkFVTFRfTUFYX1RTX09GRlNFVF9BREpVU1RNRU5ULCBHX1BBUkFNX1JFQURXUklURSB8CisgICAgICAgICAgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSdHBCaW46bWF4LXRzLW9mZnNldDoKKyAgICoKKyAgICogVXNlZCB0byBzZXQgYW4gdXBwZXIgbGltaXQgb2YgaG93IGxhcmdlIGEgdGltZSBvZmZzZXQgbWF5IGJlLiBUaGlzCisgICAqIGlzIHVzZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IHVucmVhbGlzdGljIHZhbHVlcyBhcyBhIHJlc3VsdCBvZiBlaXRoZXIKKyAgICogY2xpZW50LHNlcnZlciBvciBjbG9jayBpc3N1ZXMuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01BWF9UU19PRkZTRVQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50NjQgKCJtYXgtdHMtb2Zmc2V0IiwgIk1heCBUUyBPZmZzZXQiLAorICAgICAgICAgICJUaGUgbWF4aW11bSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgdGltZSBvZmZzZXQgaW4gKG5hbm9zZWNvbmRzKS4gIgorICAgICAgICAgICJOb3RlLCBpZiB0aGUgbnRwLXN5bmMgcGFyYW1ldGVyIGlzIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAiCisgICAgICAgICAgImNoYW5nZWQgdG8gMCAobm8gbGltaXQpIiwgMCwgR19NQVhJTlQ2NCwgREVGQVVMVF9NQVhfVFNfT0ZGU0VULAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2Jpbl9jaGFuZ2Vfc3RhdGUpOworICBnc3RlbGVtZW50X2NsYXNzLT5yZXF1ZXN0X25ld19wYWQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfYmluX3JlcXVlc3RfbmV3X3BhZCk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPnJlbGVhc2VfcGFkID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfYmluX3JlbGVhc2VfcGFkKTsKKworICAvKiBzaW5rIHBhZHMgKi8KKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmcnRwYmluX3JlY3ZfcnRwX3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZydHBiaW5fcmVjdl9ydGNwX3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZydHBiaW5fc2VuZF9ydHBfc2lua190ZW1wbGF0ZSk7CisKKyAgLyogc3JjIHBhZHMgKi8KKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmcnRwYmluX3JlY3ZfcnRwX3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJnJ0cGJpbl9zZW5kX3J0Y3Bfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmcnRwYmluX3NlbmRfcnRwX3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlJUUCBCaW4iLAorICAgICAgIkZpbHRlci9OZXR3b3JrL1JUUCIsCisgICAgICAiUmVhbC1UaW1lIFRyYW5zcG9ydCBQcm90b2NvbCBiaW4iLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgZ3N0YmluX2NsYXNzLT5oYW5kbGVfbWVzc2FnZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2Jpbl9oYW5kbGVfbWVzc2FnZSk7CisKKyAga2xhc3MtPmNsZWFyX3B0X21hcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2Jpbl9jbGVhcl9wdF9tYXApOworICBrbGFzcy0+cmVzZXRfc3luYyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2Jpbl9yZXNldF9zeW5jKTsKKyAga2xhc3MtPmdldF9zZXNzaW9uID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfYmluX2dldF9zZXNzaW9uKTsKKyAga2xhc3MtPmdldF9pbnRlcm5hbF9zZXNzaW9uID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2Jpbl9nZXRfaW50ZXJuYWxfc2Vzc2lvbik7CisgIGtsYXNzLT5yZXF1ZXN0X3J0cF9lbmNvZGVyID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfYmluX3JlcXVlc3RfZW5jb2Rlcik7CisgIGtsYXNzLT5yZXF1ZXN0X3J0cF9kZWNvZGVyID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfYmluX3JlcXVlc3RfZGVjb2Rlcik7CisgIGtsYXNzLT5yZXF1ZXN0X3J0Y3BfZW5jb2RlciA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2Jpbl9yZXF1ZXN0X2VuY29kZXIpOworICBrbGFzcy0+cmVxdWVzdF9ydGNwX2RlY29kZXIgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9iaW5fcmVxdWVzdF9kZWNvZGVyKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3J0cF9iaW5fZGVidWcsICJydHBiaW4iLCAwLCAiUlRQIGJpbiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9iaW5faW5pdCAoR3N0UnRwQmluICogcnRwYmluKQoreworICBnY2hhciAqY25hbWU7CisKKyAgcnRwYmluLT5wcml2ID0gR1NUX1JUUF9CSU5fR0VUX1BSSVZBVEUgKHJ0cGJpbik7CisgIGdfbXV0ZXhfaW5pdCAoJnJ0cGJpbi0+cHJpdi0+YmluX2xvY2spOworICBnX211dGV4X2luaXQgKCZydHBiaW4tPnByaXYtPmR5bl9sb2NrKTsKKworICBydHBiaW4tPmxhdGVuY3lfbXMgPSBERUZBVUxUX0xBVEVOQ1lfTVM7CisgIHJ0cGJpbi0+bGF0ZW5jeV9ucyA9IERFRkFVTFRfTEFURU5DWV9NUyAqIEdTVF9NU0VDT05EOworICBydHBiaW4tPmRyb3Bfb25fbGF0ZW5jeSA9IERFRkFVTFRfRFJPUF9PTl9MQVRFTkNZOworICBydHBiaW4tPmRvX2xvc3QgPSBERUZBVUxUX0RPX0xPU1Q7CisgIHJ0cGJpbi0+aWdub3JlX3B0ID0gREVGQVVMVF9JR05PUkVfUFQ7CisgIHJ0cGJpbi0+bnRwX3N5bmMgPSBERUZBVUxUX05UUF9TWU5DOworICBydHBiaW4tPnJ0Y3Bfc3luYyA9IERFRkFVTFRfUlRDUF9TWU5DOworICBydHBiaW4tPnJ0Y3Bfc3luY19pbnRlcnZhbCA9IERFRkFVTFRfUlRDUF9TWU5DX0lOVEVSVkFMOworICBydHBiaW4tPnByaXYtPmF1dG9yZW1vdmUgPSBERUZBVUxUX0FVVE9SRU1PVkU7CisgIHJ0cGJpbi0+YnVmZmVyX21vZGUgPSBERUZBVUxUX0JVRkZFUl9NT0RFOworICBydHBiaW4tPnVzZV9waXBlbGluZV9jbG9jayA9IERFRkFVTFRfVVNFX1BJUEVMSU5FX0NMT0NLOworICBydHBiaW4tPnNlbmRfc3luY19ldmVudCA9IERFRkFVTFRfRE9fU1lOQ19FVkVOVDsKKyAgcnRwYmluLT5kb19yZXRyYW5zbWlzc2lvbiA9IERFRkFVTFRfRE9fUkVUUkFOU01JU1NJT047CisgIHJ0cGJpbi0+cnRwX3Byb2ZpbGUgPSBERUZBVUxUX1JUUF9QUk9GSUxFOworICBydHBiaW4tPm50cF90aW1lX3NvdXJjZSA9IERFRkFVTFRfTlRQX1RJTUVfU09VUkNFOworICBydHBiaW4tPnJ0Y3Bfc3luY19zZW5kX3RpbWUgPSBERUZBVUxUX1JUQ1BfU1lOQ19TRU5EX1RJTUU7CisgIHJ0cGJpbi0+bWF4X3J0Y3BfcnRwX3RpbWVfZGlmZiA9IERFRkFVTFRfTUFYX1JUQ1BfUlRQX1RJTUVfRElGRjsKKyAgcnRwYmluLT5tYXhfZHJvcG91dF90aW1lID0gREVGQVVMVF9NQVhfRFJPUE9VVF9USU1FOworICBydHBiaW4tPm1heF9taXNvcmRlcl90aW1lID0gREVGQVVMVF9NQVhfTUlTT1JERVJfVElNRTsKKyAgcnRwYmluLT5yZmM3MjczX3N5bmMgPSBERUZBVUxUX1JGQzcyNzNfU1lOQzsKKyAgcnRwYmluLT5tYXhfc3RyZWFtcyA9IERFRkFVTFRfTUFYX1NUUkVBTVM7CisgIHJ0cGJpbi0+bWF4X3RzX29mZnNldF9hZGp1c3RtZW50ID0gREVGQVVMVF9NQVhfVFNfT0ZGU0VUX0FESlVTVE1FTlQ7CisgIHJ0cGJpbi0+bWF4X3RzX29mZnNldCA9IERFRkFVTFRfTUFYX1RTX09GRlNFVDsKKyAgcnRwYmluLT5tYXhfdHNfb2Zmc2V0X2lzX3NldCA9IEZBTFNFOworCisgIC8qIHNvbWUgZGVmYXVsdCBTREVTIGVudHJpZXMgKi8KKyAgY25hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJ1c2VyJXVAaG9zdC0leCIsIGdfcmFuZG9tX2ludCAoKSwgZ19yYW5kb21faW50ICgpKTsKKyAgcnRwYmluLT5zZGVzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1zb3VyY2Utc2RlcyIsCisgICAgICAiY25hbWUiLCBHX1RZUEVfU1RSSU5HLCBjbmFtZSwgInRvb2wiLCBHX1RZUEVfU1RSSU5HLCAiR1N0cmVhbWVyIiwgTlVMTCk7CisgIGdfZnJlZSAoY25hbWUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9iaW5fZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwQmluICpydHBiaW47CisKKyAgcnRwYmluID0gR1NUX1JUUF9CSU4gKG9iamVjdCk7CisKKyAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAob2JqZWN0LCAiZnJlZWluZyBzZXNzaW9ucyIpOworICBnX3NsaXN0X2ZvcmVhY2ggKHJ0cGJpbi0+c2Vzc2lvbnMsIChHRnVuYykgZnJlZV9zZXNzaW9uLCBydHBiaW4pOworICBnX3NsaXN0X2ZyZWUgKHJ0cGJpbi0+c2Vzc2lvbnMpOworICBydHBiaW4tPnNlc3Npb25zID0gTlVMTDsKKyAgR1NUX1JUUF9CSU5fVU5MT0NLIChydHBiaW4pOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9iaW5fZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cEJpbiAqcnRwYmluOworCisgIHJ0cGJpbiA9IEdTVF9SVFBfQklOIChvYmplY3QpOworCisgIGlmIChydHBiaW4tPnNkZXMpCisgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChydHBiaW4tPnNkZXMpOworCisgIGdfbXV0ZXhfY2xlYXIgKCZydHBiaW4tPnByaXYtPmJpbl9sb2NrKTsKKyAgZ19tdXRleF9jbGVhciAoJnJ0cGJpbi0+cHJpdi0+ZHluX2xvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9iaW5fc2V0X3NkZXNfc3RydWN0IChHc3RSdHBCaW4gKiBiaW4sIGNvbnN0IEdzdFN0cnVjdHVyZSAqIHNkZXMpCit7CisgIEdTTGlzdCAqaXRlbTsKKworICBpZiAoc2RlcyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBHU1RfUlRQX0JJTl9MT0NLIChiaW4pOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoYmluKTsKKyAgaWYgKGJpbi0+c2RlcykKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKGJpbi0+c2Rlcyk7CisgIGJpbi0+c2RlcyA9IGdzdF9zdHJ1Y3R1cmVfY29weSAoc2Rlcyk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChiaW4pOworCisgIC8qIHN0b3JlIGluIGFsbCBzZXNzaW9ucyAqLworICBmb3IgKGl0ZW0gPSBiaW4tPnNlc3Npb25zOyBpdGVtOyBpdGVtID0gZ19zbGlzdF9uZXh0IChpdGVtKSkgeworICAgIEdzdFJ0cEJpblNlc3Npb24gKnNlc3Npb24gPSBpdGVtLT5kYXRhOworICAgIGdfb2JqZWN0X3NldCAoc2Vzc2lvbi0+c2Vzc2lvbiwgInNkZXMiLCBzZGVzLCBOVUxMKTsKKyAgfQorCisgIEdTVF9SVFBfQklOX1VOTE9DSyAoYmluKTsKK30KKworc3RhdGljIEdzdFN0cnVjdHVyZSAqCitnc3RfcnRwX2Jpbl9nZXRfc2Rlc19zdHJ1Y3QgKEdzdFJ0cEJpbiAqIGJpbikKK3sKKyAgR3N0U3RydWN0dXJlICpyZXN1bHQ7CisKKyAgR1NUX09CSkVDVF9MT0NLIChiaW4pOworICByZXN1bHQgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKGJpbi0+c2Rlcyk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChiaW4pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Jpbl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwQmluICpydHBiaW47CisKKyAgcnRwYmluID0gR1NUX1JUUF9CSU4gKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xBVEVOQ1k6CisgICAgICBHU1RfUlRQX0JJTl9MT0NLIChydHBiaW4pOworICAgICAgcnRwYmluLT5sYXRlbmN5X21zID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgcnRwYmluLT5sYXRlbmN5X25zID0gcnRwYmluLT5sYXRlbmN5X21zICogR1NUX01TRUNPTkQ7CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICAvKiBwcm9wYWdhdGUgdGhlIHByb3BlcnR5IGRvd24gdG8gdGhlIGppdHRlcmJ1ZmZlciAqLworICAgICAgZ3N0X3J0cF9iaW5fcHJvcGFnYXRlX3Byb3BlcnR5X3RvX2ppdHRlcmJ1ZmZlciAocnRwYmluLCAibGF0ZW5jeSIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9EUk9QX09OX0xBVEVOQ1k6CisgICAgICBHU1RfUlRQX0JJTl9MT0NLIChydHBiaW4pOworICAgICAgcnRwYmluLT5kcm9wX29uX2xhdGVuY3kgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICAvKiBwcm9wYWdhdGUgdGhlIHByb3BlcnR5IGRvd24gdG8gdGhlIGppdHRlcmJ1ZmZlciAqLworICAgICAgZ3N0X3J0cF9iaW5fcHJvcGFnYXRlX3Byb3BlcnR5X3RvX2ppdHRlcmJ1ZmZlciAocnRwYmluLAorICAgICAgICAgICJkcm9wLW9uLWxhdGVuY3kiLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0RFUzoKKyAgICAgIGdzdF9ydHBfYmluX3NldF9zZGVzX3N0cnVjdCAocnRwYmluLCBnX3ZhbHVlX2dldF9ib3hlZCAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ET19MT1NUOgorICAgICAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKyAgICAgIHJ0cGJpbi0+ZG9fbG9zdCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIEdTVF9SVFBfQklOX1VOTE9DSyAocnRwYmluKTsKKyAgICAgIGdzdF9ydHBfYmluX3Byb3BhZ2F0ZV9wcm9wZXJ0eV90b19qaXR0ZXJidWZmZXIgKHJ0cGJpbiwgImRvLWxvc3QiLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTlRQX1NZTkM6CisgICAgICBydHBiaW4tPm50cF9zeW5jID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgLyogVGhlIGRlZmF1bHQgdmFsdWUgb2YgbWF4X3RzX29mZnNldCBkZXBlbmRzIG9uIG50cF9zeW5jLiBJZiB1c2VyCisgICAgICAgKiBoYXNuJ3Qgc2V0IGl0IHRoZW4gY2hhbmdlIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgIGlmICghcnRwYmluLT5tYXhfdHNfb2Zmc2V0X2lzX3NldCkgeworICAgICAgICBpZiAocnRwYmluLT5udHBfc3luYykgeworICAgICAgICAgIHJ0cGJpbi0+bWF4X3RzX29mZnNldCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcnRwYmluLT5tYXhfdHNfb2Zmc2V0ID0gREVGQVVMVF9NQVhfVFNfT0ZGU0VUOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRDUF9TWU5DOgorICAgICAgZ19hdG9taWNfaW50X3NldCAoJnJ0cGJpbi0+cnRjcF9zeW5jLCBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUQ1BfU1lOQ19JTlRFUlZBTDoKKyAgICAgIHJ0cGJpbi0+cnRjcF9zeW5jX2ludGVydmFsID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lHTk9SRV9QVDoKKyAgICAgIHJ0cGJpbi0+aWdub3JlX3B0ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FVVE9SRU1PVkU6CisgICAgICBydHBiaW4tPnByaXYtPmF1dG9yZW1vdmUgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFX1BJUEVMSU5FX0NMT0NLOgorICAgIHsKKyAgICAgIEdTTGlzdCAqc2Vzc2lvbnM7CisgICAgICBHU1RfUlRQX0JJTl9MT0NLIChydHBiaW4pOworICAgICAgcnRwYmluLT51c2VfcGlwZWxpbmVfY2xvY2sgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBmb3IgKHNlc3Npb25zID0gcnRwYmluLT5zZXNzaW9uczsgc2Vzc2lvbnM7CisgICAgICAgICAgc2Vzc2lvbnMgPSBnX3NsaXN0X25leHQgKHNlc3Npb25zKSkgeworICAgICAgICBHc3RSdHBCaW5TZXNzaW9uICpzZXNzaW9uID0gKEdzdFJ0cEJpblNlc3Npb24gKikgc2Vzc2lvbnMtPmRhdGE7CisKKyAgICAgICAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc2Vzc2lvbi0+c2Vzc2lvbiksCisgICAgICAgICAgICAidXNlLXBpcGVsaW5lLWNsb2NrIiwgcnRwYmluLT51c2VfcGlwZWxpbmVfY2xvY2ssIE5VTEwpOworICAgICAgfQorICAgICAgR1NUX1JUUF9CSU5fVU5MT0NLIChydHBiaW4pOworICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ET19TWU5DX0VWRU5UOgorICAgICAgcnRwYmluLT5zZW5kX3N5bmNfZXZlbnQgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQlVGRkVSX01PREU6CisgICAgICBHU1RfUlRQX0JJTl9MT0NLIChydHBiaW4pOworICAgICAgcnRwYmluLT5idWZmZXJfbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIEdTVF9SVFBfQklOX1VOTE9DSyAocnRwYmluKTsKKyAgICAgIC8qIHByb3BhZ2F0ZSB0aGUgcHJvcGVydHkgZG93biB0byB0aGUgaml0dGVyYnVmZmVyICovCisgICAgICBnc3RfcnRwX2Jpbl9wcm9wYWdhdGVfcHJvcGVydHlfdG9faml0dGVyYnVmZmVyIChydHBiaW4sICJtb2RlIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RPX1JFVFJBTlNNSVNTSU9OOgorICAgICAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKyAgICAgIHJ0cGJpbi0+ZG9fcmV0cmFuc21pc3Npb24gPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICBnc3RfcnRwX2Jpbl9wcm9wYWdhdGVfcHJvcGVydHlfdG9faml0dGVyYnVmZmVyIChydHBiaW4sCisgICAgICAgICAgImRvLXJldHJhbnNtaXNzaW9uIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUUF9QUk9GSUxFOgorICAgICAgcnRwYmluLT5ydHBfcHJvZmlsZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9OVFBfVElNRV9TT1VSQ0U6eworICAgICAgR1NMaXN0ICpzZXNzaW9uczsKKyAgICAgIEdTVF9SVFBfQklOX0xPQ0sgKHJ0cGJpbik7CisgICAgICBydHBiaW4tPm50cF90aW1lX3NvdXJjZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGZvciAoc2Vzc2lvbnMgPSBydHBiaW4tPnNlc3Npb25zOyBzZXNzaW9uczsKKyAgICAgICAgICBzZXNzaW9ucyA9IGdfc2xpc3RfbmV4dCAoc2Vzc2lvbnMpKSB7CisgICAgICAgIEdzdFJ0cEJpblNlc3Npb24gKnNlc3Npb24gPSAoR3N0UnRwQmluU2Vzc2lvbiAqKSBzZXNzaW9ucy0+ZGF0YTsKKworICAgICAgICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzZXNzaW9uLT5zZXNzaW9uKSwKKyAgICAgICAgICAgICJudHAtdGltZS1zb3VyY2UiLCBydHBiaW4tPm50cF90aW1lX3NvdXJjZSwgTlVMTCk7CisgICAgICB9CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX1JUQ1BfU1lOQ19TRU5EX1RJTUU6eworICAgICAgR1NMaXN0ICpzZXNzaW9uczsKKyAgICAgIEdTVF9SVFBfQklOX0xPQ0sgKHJ0cGJpbik7CisgICAgICBydHBiaW4tPnJ0Y3Bfc3luY19zZW5kX3RpbWUgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBmb3IgKHNlc3Npb25zID0gcnRwYmluLT5zZXNzaW9uczsgc2Vzc2lvbnM7CisgICAgICAgICAgc2Vzc2lvbnMgPSBnX3NsaXN0X25leHQgKHNlc3Npb25zKSkgeworICAgICAgICBHc3RSdHBCaW5TZXNzaW9uICpzZXNzaW9uID0gKEdzdFJ0cEJpblNlc3Npb24gKikgc2Vzc2lvbnMtPmRhdGE7CisKKyAgICAgICAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc2Vzc2lvbi0+c2Vzc2lvbiksCisgICAgICAgICAgICAicnRjcC1zeW5jLXNlbmQtdGltZSIsIHJ0cGJpbi0+cnRjcF9zeW5jX3NlbmRfdGltZSwgTlVMTCk7CisgICAgICB9CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX01BWF9SVENQX1JUUF9USU1FX0RJRkY6CisgICAgICBHU1RfUlRQX0JJTl9MT0NLIChydHBiaW4pOworICAgICAgcnRwYmluLT5tYXhfcnRjcF9ydHBfdGltZV9kaWZmID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICBnc3RfcnRwX2Jpbl9wcm9wYWdhdGVfcHJvcGVydHlfdG9faml0dGVyYnVmZmVyIChydHBiaW4sCisgICAgICAgICAgIm1heC1ydGNwLXJ0cC10aW1lLWRpZmYiLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX0RST1BPVVRfVElNRToKKyAgICAgIEdTVF9SVFBfQklOX0xPQ0sgKHJ0cGJpbik7CisgICAgICBydHBiaW4tPm1heF9kcm9wb3V0X3RpbWUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICBnc3RfcnRwX2Jpbl9wcm9wYWdhdGVfcHJvcGVydHlfdG9faml0dGVyYnVmZmVyIChydHBiaW4sCisgICAgICAgICAgIm1heC1kcm9wb3V0LXRpbWUiLCB2YWx1ZSk7CisgICAgICBnc3RfcnRwX2Jpbl9wcm9wYWdhdGVfcHJvcGVydHlfdG9fc2Vzc2lvbiAocnRwYmluLCAibWF4LWRyb3BvdXQtdGltZSIsCisgICAgICAgICAgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9NSVNPUkRFUl9USU1FOgorICAgICAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKyAgICAgIHJ0cGJpbi0+bWF4X21pc29yZGVyX3RpbWUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICBnc3RfcnRwX2Jpbl9wcm9wYWdhdGVfcHJvcGVydHlfdG9faml0dGVyYnVmZmVyIChydHBiaW4sCisgICAgICAgICAgIm1heC1taXNvcmRlci10aW1lIiwgdmFsdWUpOworICAgICAgZ3N0X3J0cF9iaW5fcHJvcGFnYXRlX3Byb3BlcnR5X3RvX3Nlc3Npb24gKHJ0cGJpbiwgIm1heC1taXNvcmRlci10aW1lIiwKKyAgICAgICAgICB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkZDNzI3M19TWU5DOgorICAgICAgcnRwYmluLT5yZmM3MjczX3N5bmMgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBnc3RfcnRwX2Jpbl9wcm9wYWdhdGVfcHJvcGVydHlfdG9faml0dGVyYnVmZmVyIChydHBiaW4sCisgICAgICAgICAgInJmYzcyNzMtc3luYyIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfU1RSRUFNUzoKKyAgICAgIHJ0cGJpbi0+bWF4X3N0cmVhbXMgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX1RTX09GRlNFVF9BREpVU1RNRU5UOgorICAgICAgcnRwYmluLT5tYXhfdHNfb2Zmc2V0X2FkanVzdG1lbnQgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGdzdF9ydHBfYmluX3Byb3BhZ2F0ZV9wcm9wZXJ0eV90b19qaXR0ZXJidWZmZXIgKHJ0cGJpbiwKKyAgICAgICAgICAibWF4LXRzLW9mZnNldC1hZGp1c3RtZW50IiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9UU19PRkZTRVQ6CisgICAgICBydHBiaW4tPm1heF90c19vZmZzZXQgPSBnX3ZhbHVlX2dldF9pbnQ2NCAodmFsdWUpOworICAgICAgcnRwYmluLT5tYXhfdHNfb2Zmc2V0X2lzX3NldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Jpbl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwQmluICpydHBiaW47CisKKyAgcnRwYmluID0gR1NUX1JUUF9CSU4gKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xBVEVOQ1k6CisgICAgICBHU1RfUlRQX0JJTl9MT0NLIChydHBiaW4pOworICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0cGJpbi0+bGF0ZW5jeV9tcyk7CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRFJPUF9PTl9MQVRFTkNZOgorICAgICAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBydHBiaW4tPmRyb3Bfb25fbGF0ZW5jeSk7CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0RFUzoKKyAgICAgIGdfdmFsdWVfdGFrZV9ib3hlZCAodmFsdWUsIGdzdF9ydHBfYmluX2dldF9zZGVzX3N0cnVjdCAocnRwYmluKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRE9fTE9TVDoKKyAgICAgIEdTVF9SVFBfQklOX0xPQ0sgKHJ0cGJpbik7CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcnRwYmluLT5kb19sb3N0KTsKKyAgICAgIEdTVF9SVFBfQklOX1VOTE9DSyAocnRwYmluKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JR05PUkVfUFQ6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcnRwYmluLT5pZ25vcmVfcHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05UUF9TWU5DOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHJ0cGJpbi0+bnRwX3N5bmMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUQ1BfU1lOQzoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBnX2F0b21pY19pbnRfZ2V0ICgmcnRwYmluLT5ydGNwX3N5bmMpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX1NZTkNfSU5URVJWQUw6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnRwYmluLT5ydGNwX3N5bmNfaW50ZXJ2YWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FVVE9SRU1PVkU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcnRwYmluLT5wcml2LT5hdXRvcmVtb3ZlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CVUZGRVJfTU9ERToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBydHBiaW4tPmJ1ZmZlcl9tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VfUElQRUxJTkVfQ0xPQ0s6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcnRwYmluLT51c2VfcGlwZWxpbmVfY2xvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RPX1NZTkNfRVZFTlQ6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcnRwYmluLT5zZW5kX3N5bmNfZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RPX1JFVFJBTlNNSVNTSU9OOgorICAgICAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBydHBiaW4tPmRvX3JldHJhbnNtaXNzaW9uKTsKKyAgICAgIEdTVF9SVFBfQklOX1VOTE9DSyAocnRwYmluKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVFBfUFJPRklMRToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBydHBiaW4tPnJ0cF9wcm9maWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9OVFBfVElNRV9TT1VSQ0U6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgcnRwYmluLT5udHBfdGltZV9zb3VyY2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUQ1BfU1lOQ19TRU5EX1RJTUU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcnRwYmluLT5ydGNwX3N5bmNfc2VuZF90aW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGOgorICAgICAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHJ0cGJpbi0+bWF4X3J0Y3BfcnRwX3RpbWVfZGlmZik7CisgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX0RST1BPVVRfVElNRToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHBiaW4tPm1heF9kcm9wb3V0X3RpbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9NSVNPUkRFUl9USU1FOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0cGJpbi0+bWF4X21pc29yZGVyX3RpbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JGQzcyNzNfU1lOQzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBydHBiaW4tPnJmYzcyNzNfc3luYyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX1NUUkVBTVM6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnRwYmluLT5tYXhfc3RyZWFtcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX1RTX09GRlNFVF9BREpVU1RNRU5UOgorICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgcnRwYmluLT5tYXhfdHNfb2Zmc2V0X2FkanVzdG1lbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9UU19PRkZTRVQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQ2NCAodmFsdWUsIHJ0cGJpbi0+bWF4X3RzX29mZnNldCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Jpbl9oYW5kbGVfbWVzc2FnZSAoR3N0QmluICogYmluLCBHc3RNZXNzYWdlICogbWVzc2FnZSkKK3sKKyAgR3N0UnRwQmluICpydHBiaW47CisKKyAgcnRwYmluID0gR1NUX1JUUF9CSU4gKGJpbik7CisKKyAgc3dpdGNoIChHU1RfTUVTU0FHRV9UWVBFIChtZXNzYWdlKSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRUxFTUVOVDoKKyAgICB7CisgICAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfbWVzc2FnZV9nZXRfc3RydWN0dXJlIChtZXNzYWdlKTsKKworICAgICAgLyogd2UgY2hhbmdlIHRoZSBzdHJ1Y3R1cmUgbmFtZSBhbmQgYWRkIHRoZSBzZXNzaW9uIElEIHRvIGl0ICovCisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgImFwcGxpY2F0aW9uL3gtcnRwLXNvdXJjZS1zZGVzIikpIHsKKyAgICAgICAgR3N0UnRwQmluU2Vzc2lvbiAqc2VzczsKKworICAgICAgICAvKiBmaW5kIHRoZSBzZXNzaW9uIHdlIHNldCBpdCBhcyBvYmplY3QgZGF0YSAqLworICAgICAgICBzZXNzID0gZ19vYmplY3RfZ2V0X2RhdGEgKEdfT0JKRUNUIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpKSwKKyAgICAgICAgICAgICJHc3RSVFBCaW4uc2Vzc2lvbiIpOworCisgICAgICAgIGlmIChHX0xJS0VMWSAoc2VzcykpIHsKKyAgICAgICAgICBtZXNzYWdlID0gZ3N0X21lc3NhZ2VfbWFrZV93cml0YWJsZSAobWVzc2FnZSk7CisgICAgICAgICAgcyA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1lc3NhZ2UpOworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0ICgoR3N0U3RydWN0dXJlICopIHMsICJzZXNzaW9uIiwgR19UWVBFX1VJTlQsCisgICAgICAgICAgICAgIHNlc3MtPmlkLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgR1NUX0JJTl9DTEFTUyAocGFyZW50X2NsYXNzKS0+aGFuZGxlX21lc3NhZ2UgKGJpbiwgbWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfTUVTU0FHRV9CVUZGRVJJTkc6CisgICAgeworICAgICAgZ2ludCBwZXJjZW50OworICAgICAgZ2ludCBtaW5fcGVyY2VudCA9IDEwMDsKKyAgICAgIEdTTGlzdCAqc2Vzc2lvbnMsICpzdHJlYW1zOworICAgICAgR3N0UnRwQmluU3RyZWFtICpzdHJlYW07CisgICAgICBnYm9vbGVhbiBjaGFuZ2UgPSBGQUxTRSwgYWN0aXZlID0gRkFMU0U7CisgICAgICBHc3RDbG9ja1RpbWUgbWluX291dF90aW1lOworICAgICAgR3N0QnVmZmVyaW5nTW9kZSBtb2RlOworICAgICAgZ2ludCBhdmdfaW4sIGF2Z19vdXQ7CisgICAgICBnaW50NjQgYnVmZmVyaW5nX2xlZnQ7CisKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX2J1ZmZlcmluZyAobWVzc2FnZSwgJnBlcmNlbnQpOworICAgICAgZ3N0X21lc3NhZ2VfcGFyc2VfYnVmZmVyaW5nX3N0YXRzIChtZXNzYWdlLCAmbW9kZSwgJmF2Z19pbiwgJmF2Z19vdXQsCisgICAgICAgICAgJmJ1ZmZlcmluZ19sZWZ0KTsKKworICAgICAgc3RyZWFtID0KKyAgICAgICAgICBnX29iamVjdF9nZXRfZGF0YSAoR19PQkpFQ1QgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSkpLAorICAgICAgICAgICJHc3RSVFBCaW4uc3RyZWFtIik7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgImdvdCBwZXJjZW50ICVkIGZyb20gc3RyZWFtICVwIiwgcGVyY2VudCwgc3RyZWFtKTsKKworICAgICAgLyogZ2V0IHRoZSBzdHJlYW0gKi8KKyAgICAgIGlmIChHX0xJS0VMWSAoc3RyZWFtKSkgeworICAgICAgICBHU1RfUlRQX0JJTl9MT0NLIChydHBiaW4pOworICAgICAgICAvKiBmaWxsIGluIHRoZSBwZXJjZW50ICovCisgICAgICAgIHN0cmVhbS0+cGVyY2VudCA9IHBlcmNlbnQ7CisKKyAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBtaW4gdmFsdWUgZm9yIGFsbCBzdHJlYW1zICovCisgICAgICAgIGZvciAoc2Vzc2lvbnMgPSBydHBiaW4tPnNlc3Npb25zOyBzZXNzaW9uczsKKyAgICAgICAgICAgIHNlc3Npb25zID0gZ19zbGlzdF9uZXh0IChzZXNzaW9ucykpIHsKKyAgICAgICAgICBHc3RSdHBCaW5TZXNzaW9uICpzZXNzaW9uID0gKEdzdFJ0cEJpblNlc3Npb24gKikgc2Vzc2lvbnMtPmRhdGE7CisKKyAgICAgICAgICBHU1RfUlRQX1NFU1NJT05fTE9DSyAoc2Vzc2lvbik7CisgICAgICAgICAgaWYgKHNlc3Npb24tPnN0cmVhbXMpIHsKKyAgICAgICAgICAgIGZvciAoc3RyZWFtcyA9IHNlc3Npb24tPnN0cmVhbXM7IHN0cmVhbXM7CisgICAgICAgICAgICAgICAgc3RyZWFtcyA9IGdfc2xpc3RfbmV4dCAoc3RyZWFtcykpIHsKKyAgICAgICAgICAgICAgR3N0UnRwQmluU3RyZWFtICpzdHJlYW0gPSAoR3N0UnRwQmluU3RyZWFtICopIHN0cmVhbXMtPmRhdGE7CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAic3RyZWFtICVwIHBlcmNlbnQgJWQiLCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICBzdHJlYW0tPnBlcmNlbnQpOworCisgICAgICAgICAgICAgIC8qIGZpbmQgbWluIHBlcmNlbnQgKi8KKyAgICAgICAgICAgICAgaWYgKG1pbl9wZXJjZW50ID4gc3RyZWFtLT5wZXJjZW50KQorICAgICAgICAgICAgICAgIG1pbl9wZXJjZW50ID0gc3RyZWFtLT5wZXJjZW50OworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKGJpbiwKKyAgICAgICAgICAgICAgICAic2Vzc2lvbiBoYXMgbm8gc3RyZWFtcywgc2V0dGluZyBtaW5fcGVyY2VudCB0byAwIik7CisgICAgICAgICAgICBtaW5fcGVyY2VudCA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3Npb24pOworICAgICAgICB9CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgIm1pbiBwZXJjZW50ICVkIiwgbWluX3BlcmNlbnQpOworCisgICAgICAgIGlmIChydHBiaW4tPmJ1ZmZlcmluZykgeworICAgICAgICAgIGlmIChtaW5fcGVyY2VudCA9PSAxMDApIHsKKyAgICAgICAgICAgIHJ0cGJpbi0+YnVmZmVyaW5nID0gRkFMU0U7CisgICAgICAgICAgICBhY3RpdmUgPSBUUlVFOworICAgICAgICAgICAgY2hhbmdlID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKG1pbl9wZXJjZW50IDwgMTAwKSB7CisgICAgICAgICAgICAvKiBwYXVzZSB0aGUgc3RyZWFtcyAqLworICAgICAgICAgICAgcnRwYmluLT5idWZmZXJpbmcgPSBUUlVFOworICAgICAgICAgICAgYWN0aXZlID0gRkFMU0U7CisgICAgICAgICAgICBjaGFuZ2UgPSBUUlVFOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisKKyAgICAgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgICAgICAgIC8qIG1ha2UgYSBuZXcgYnVmZmVyaW5nIG1lc3NhZ2Ugd2l0aCB0aGUgbWluIHZhbHVlICovCisgICAgICAgIG1lc3NhZ2UgPQorICAgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2J1ZmZlcmluZyAoR1NUX09CSkVDVF9DQVNUIChiaW4pLCBtaW5fcGVyY2VudCk7CisgICAgICAgIGdzdF9tZXNzYWdlX3NldF9idWZmZXJpbmdfc3RhdHMgKG1lc3NhZ2UsIG1vZGUsIGF2Z19pbiwgYXZnX291dCwKKyAgICAgICAgICAgIGJ1ZmZlcmluZ19sZWZ0KTsKKworICAgICAgICBpZiAoR19VTkxJS0VMWSAoY2hhbmdlKSkgeworICAgICAgICAgIEdzdENsb2NrICpjbG9jazsKKyAgICAgICAgICBndWludDY0IHJ1bm5pbmdfdGltZSA9IDA7CisgICAgICAgICAgZ3VpbnQ2NCBvZmZzZXQgPSAwOworCisgICAgICAgICAgLyogZmlndXJlIG91dCB0aGUgcnVubmluZyB0aW1lIHdoZW4gd2UgaGF2ZSBhIGNsb2NrICovCisgICAgICAgICAgaWYgKEdfTElLRUxZICgoY2xvY2sgPQorICAgICAgICAgICAgICAgICAgICAgIGdzdF9lbGVtZW50X2dldF9jbG9jayAoR1NUX0VMRU1FTlRfQ0FTVCAoYmluKSkpKSkgeworICAgICAgICAgICAgZ3VpbnQ2NCBub3csIGJhc2VfdGltZTsKKworICAgICAgICAgICAgbm93ID0gZ3N0X2Nsb2NrX2dldF90aW1lIChjbG9jayk7CisgICAgICAgICAgICBiYXNlX3RpbWUgPSBnc3RfZWxlbWVudF9nZXRfYmFzZV90aW1lIChHU1RfRUxFTUVOVF9DQVNUIChiaW4pKTsKKyAgICAgICAgICAgIHJ1bm5pbmdfdGltZSA9IG5vdyAtIGJhc2VfdGltZTsKKyAgICAgICAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGNsb2NrKTsKKyAgICAgICAgICB9CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLAorICAgICAgICAgICAgICAicnVubmluZyB0aW1lIG5vdyAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHJ1bm5pbmdfdGltZSkpOworCisgICAgICAgICAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKworICAgICAgICAgIC8qIHdoZW4gd2UgcmVhY3RpdmF0ZSwgY2FsY3VsYXRlIHRoZSBvZmZzZXRzIHNvIHRoYXQgYWxsIHN0cmVhbXMgaGF2ZQorICAgICAgICAgICAqIGFuIG91dHB1dCB0aW1lIHRoYXQgaXMgYXQgbGVhc3QgYXMgYmlnIGFzIHRoZSBydW5uaW5nX3RpbWUgKi8KKyAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgICAgIGlmIChydW5uaW5nX3RpbWUgPiBydHBiaW4tPmJ1ZmZlcl9zdGFydCkgeworICAgICAgICAgICAgICBvZmZzZXQgPSBydW5uaW5nX3RpbWUgLSBydHBiaW4tPmJ1ZmZlcl9zdGFydDsKKyAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBydHBiaW4tPmxhdGVuY3lfbnMpCisgICAgICAgICAgICAgICAgb2Zmc2V0IC09IHJ0cGJpbi0+bGF0ZW5jeV9uczsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogcGF1c2UgYWxsIHN0cmVhbXMgKi8KKyAgICAgICAgICBtaW5fb3V0X3RpbWUgPSAtMTsKKyAgICAgICAgICBmb3IgKHNlc3Npb25zID0gcnRwYmluLT5zZXNzaW9uczsgc2Vzc2lvbnM7CisgICAgICAgICAgICAgIHNlc3Npb25zID0gZ19zbGlzdF9uZXh0IChzZXNzaW9ucykpIHsKKyAgICAgICAgICAgIEdzdFJ0cEJpblNlc3Npb24gKnNlc3Npb24gPSAoR3N0UnRwQmluU2Vzc2lvbiAqKSBzZXNzaW9ucy0+ZGF0YTsKKworICAgICAgICAgICAgR1NUX1JUUF9TRVNTSU9OX0xPQ0sgKHNlc3Npb24pOworICAgICAgICAgICAgZm9yIChzdHJlYW1zID0gc2Vzc2lvbi0+c3RyZWFtczsgc3RyZWFtczsKKyAgICAgICAgICAgICAgICBzdHJlYW1zID0gZ19zbGlzdF9uZXh0IChzdHJlYW1zKSkgeworICAgICAgICAgICAgICBHc3RSdHBCaW5TdHJlYW0gKnN0cmVhbSA9IChHc3RSdHBCaW5TdHJlYW0gKikgc3RyZWFtcy0+ZGF0YTsKKyAgICAgICAgICAgICAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHN0cmVhbS0+YnVmZmVyOworICAgICAgICAgICAgICBndWludDY0IGxhc3Rfb3V0OworCisgICAgICAgICAgICAgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAoZWxlbWVudCwgInNldC1hY3RpdmUiLCBhY3RpdmUsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICZsYXN0X291dCk7CisKKyAgICAgICAgICAgICAgaWYgKCFhY3RpdmUpIHsKKyAgICAgICAgICAgICAgICBnX29iamVjdF9nZXQgKGVsZW1lbnQsICJwZXJjZW50IiwgJnN0cmVhbS0+cGVyY2VudCwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICBpZiAobGFzdF9vdXQgPT0gLTEpCisgICAgICAgICAgICAgICAgICBsYXN0X291dCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG1pbl9vdXRfdGltZSA9PSAtMSB8fCBsYXN0X291dCA8IG1pbl9vdXRfdGltZSkKKyAgICAgICAgICAgICAgICAgIG1pbl9vdXRfdGltZSA9IGxhc3Rfb3V0OworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmluLAorICAgICAgICAgICAgICAgICAgInNldHRpbmcgJXAgdG8gJWQsIG9mZnNldCAlIiBHU1RfVElNRV9GT1JNQVQgIiwgbGFzdCAlIgorICAgICAgICAgICAgICAgICAgR1NUX1RJTUVfRk9STUFUICIsIHBlcmNlbnQgJWQiLCBlbGVtZW50LCBhY3RpdmUsCisgICAgICAgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChvZmZzZXQpLCBHU1RfVElNRV9BUkdTIChsYXN0X291dCksCisgICAgICAgICAgICAgICAgICBzdHJlYW0tPnBlcmNlbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzc2lvbik7CisgICAgICAgICAgfQorICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwKKyAgICAgICAgICAgICAgIm1pbiBvdXQgdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKG1pbl9vdXRfdGltZSkpOworCisgICAgICAgICAgLyogdGhlIGJ1ZmZlcl9zdGFydCBpcyB0aGUgbWluIG91dCB0aW1lIG9mIGFsbCBwYXVzZWQgaml0dGVyYnVmZmVycyAqLworICAgICAgICAgIGlmICghYWN0aXZlKQorICAgICAgICAgICAgcnRwYmluLT5idWZmZXJfc3RhcnQgPSBtaW5fb3V0X3RpbWU7CisKKyAgICAgICAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEdTVF9CSU5fQ0xBU1MgKHBhcmVudF9jbGFzcyktPmhhbmRsZV9tZXNzYWdlIChiaW4sIG1lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgeworICAgICAgR1NUX0JJTl9DTEFTUyAocGFyZW50X2NsYXNzKS0+aGFuZGxlX21lc3NhZ2UgKGJpbiwgbWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX2Jpbl9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXM7CisgIEdzdFJ0cEJpbiAqcnRwYmluOworICBHc3RSdHBCaW5Qcml2YXRlICpwcml2OworCisgIHJ0cGJpbiA9IEdTVF9SVFBfQklOIChlbGVtZW50KTsKKyAgcHJpdiA9IHJ0cGJpbi0+cHJpdjsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBwcml2LT5sYXN0X250cG5zdGltZSA9IDA7CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwYmluLCAiY2xlYXJpbmcgc2h1dGRvd24gZmxhZyIpOworICAgICAgZ19hdG9taWNfaW50X3NldCAoJnByaXYtPnNodXRkb3duLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwYmluLCAic2V0dGluZyBzaHV0ZG93biBmbGFnIik7CisgICAgICBnX2F0b21pY19pbnRfc2V0ICgmcHJpdi0+c2h1dGRvd24sIDEpOworICAgICAgLyogd2FpdCBmb3IgYWxsIGNhbGxiYWNrcyB0byBlbmQgYnkgdGFraW5nIHRoZSBsb2NrLiBObyBuZXcgY2FsbGJhY2tzIHdpbGwKKyAgICAgICAqIGJlIGFibGUgdG8gaGFwcGVuIGFzIHdlIHNldCB0aGUgc2h1dGRvd24gZmxhZy4gKi8KKyAgICAgIEdTVF9SVFBfQklOX0RZTl9MT0NLIChydHBiaW4pOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cGJpbiwgImR5bmFtaWMgbG9jayB0YWtlbiwgd2UgY2FuIGNvbnRpbnVlIHNodXRkb3duIik7CisgICAgICBHU1RfUlRQX0JJTl9EWU5fVU5MT0NLIChydHBiaW4pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmVzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3Nlc3Npb25fcmVxdWVzdF9lbGVtZW50IChHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbiwgZ3VpbnQgc2lnbmFsKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gTlVMTDsKKyAgR3N0UnRwQmluICpiaW4gPSBzZXNzaW9uLT5iaW47CisKKyAgZ19zaWduYWxfZW1pdCAoYmluLCBnc3RfcnRwX2Jpbl9zaWduYWxzW3NpZ25hbF0sIDAsIHNlc3Npb24tPmlkLCAmZWxlbWVudCk7CisKKyAgaWYgKGVsZW1lbnQpIHsKKyAgICBpZiAoIWJpbl9tYW5hZ2VfZWxlbWVudCAoYmluLCBlbGVtZW50KSkKKyAgICAgIGdvdG8gbWFuYWdlX2ZhaWxlZDsKKyAgICBzZXNzaW9uLT5lbGVtZW50cyA9IGdfc2xpc3RfcHJlcGVuZCAoc2Vzc2lvbi0+ZWxlbWVudHMsIGVsZW1lbnQpOworICB9CisgIHJldHVybiBlbGVtZW50OworCisgIC8qIEVSUk9SUyAqLworbWFuYWdlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYmluLCAidW5hYmxlIHRvIG1hbmFnZSBlbGVtZW50Iik7CisgICAgZ3N0X29iamVjdF91bnJlZiAoZWxlbWVudCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitjb3B5X3N0aWNreV9ldmVudHMgKEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0UGFkICpncGFkID0gR1NUX1BBRF9DQVNUICh1c2VyX2RhdGEpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGdwYWQsICJzdG9yZSBzdGlja3kgZXZlbnQgJSIgR1NUX1BUUl9GT1JNQVQsICpldmVudCk7CisgIGdzdF9wYWRfc3RvcmVfc3RpY2t5X2V2ZW50IChncGFkLCAqZXZlbnQpOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBhIG5ldyBwYWQgKFNTUkMpIHdhcyBjcmVhdGVkIGluIEBzZXNzaW9uLiBUaGlzIHNpZ25hbCBpcyBlbWl0ZWQgZnJvbSB0aGUKKyAqIHBheWxvYWQgZGVtdXhlci4gKi8KK3N0YXRpYyB2b2lkCituZXdfcGF5bG9hZF9mb3VuZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIGd1aW50IHB0LCBHc3RQYWQgKiBwYWQsCisgICAgR3N0UnRwQmluU3RyZWFtICogc3RyZWFtKQoreworICBHc3RSdHBCaW4gKnJ0cGJpbjsKKyAgR3N0RWxlbWVudENsYXNzICprbGFzczsKKyAgR3N0UGFkVGVtcGxhdGUgKnRlbXBsOworICBnY2hhciAqcGFkbmFtZTsKKyAgR3N0UGFkICpncGFkOworCisgIHJ0cGJpbiA9IHN0cmVhbS0+YmluOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgIm5ldyBwYXlsb2FkIHBhZCAldSIsIHB0KTsKKworICBHU1RfUlRQX0JJTl9TSFVURE9XTl9MT0NLIChydHBiaW4sIHNodXRkb3duKTsKKworICAvKiBnaG9zdCB0aGUgcGFkIHRvIHRoZSBwYXJlbnQgKi8KKyAga2xhc3MgPSBHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKHJ0cGJpbik7CisgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJyZWN2X3J0cF9zcmNfJXVfJXVfJXUiKTsKKyAgcGFkbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInJlY3ZfcnRwX3NyY18ldV8ldV8ldSIsCisgICAgICBzdHJlYW0tPnNlc3Npb24tPmlkLCBzdHJlYW0tPnNzcmMsIHB0KTsKKyAgZ3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKHBhZG5hbWUsIHBhZCwgdGVtcGwpOworICBnX2ZyZWUgKHBhZG5hbWUpOworICBnX29iamVjdF9zZXRfZGF0YSAoR19PQkpFQ1QgKHBhZCksICJHc3RSVFBCaW4uZ2hvc3RwYWQiLCBncGFkKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKGdwYWQsIFRSVUUpOworICBHU1RfUlRQX0JJTl9TSFVURE9XTl9VTkxPQ0sgKHJ0cGJpbik7CisKKyAgZ3N0X3BhZF9zdGlja3lfZXZlbnRzX2ZvcmVhY2ggKHBhZCwgY29weV9zdGlja3lfZXZlbnRzLCBncGFkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwYmluKSwgZ3BhZCk7CisKKyAgcmV0dXJuOworCitzaHV0ZG93bjoKKyAgeworICAgIEdTVF9ERUJVRyAoImlnbm9yaW5nLCB3ZSBhcmUgc2h1dHRpbmcgZG93biIpOworICAgIHJldHVybjsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorcGF5bG9hZF9wYWRfcmVtb3ZlZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RSdHBCaW5TdHJlYW0gKiBzdHJlYW0pCit7CisgIEdzdFJ0cEJpbiAqcnRwYmluOworICBHc3RQYWQgKmdwYWQ7CisKKyAgcnRwYmluID0gc3RyZWFtLT5iaW47CisKKyAgR1NUX0RFQlVHICgicGF5bG9hZCBwYWQgcmVtb3ZlZCIpOworCisgIEdTVF9SVFBfQklOX0RZTl9MT0NLIChydHBiaW4pOworICBpZiAoKGdwYWQgPSBnX29iamVjdF9nZXRfZGF0YSAoR19PQkpFQ1QgKHBhZCksICJHc3RSVFBCaW4uZ2hvc3RwYWQiKSkpIHsKKyAgICBnX29iamVjdF9zZXRfZGF0YSAoR19PQkpFQ1QgKHBhZCksICJHc3RSVFBCaW4uZ2hvc3RwYWQiLCBOVUxMKTsKKworICAgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoZ3BhZCwgRkFMU0UpOworICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cGJpbiksIGdwYWQpOworICB9CisgIEdTVF9SVFBfQklOX0RZTl9VTkxPQ0sgKHJ0cGJpbik7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK3B0X21hcF9yZXF1ZXN0ZWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBndWludCBwdCwgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24pCit7CisgIEdzdFJ0cEJpbiAqcnRwYmluOworICBHc3RDYXBzICpjYXBzOworCisgIHJ0cGJpbiA9IHNlc3Npb24tPmJpbjsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJwYXlsb2FkIG1hcCByZXF1ZXN0ZWQgZm9yIHB0ICV1IGluIHNlc3Npb24gJXUiLCBwdCwKKyAgICAgIHNlc3Npb24tPmlkKTsKKworICBjYXBzID0gZ2V0X3B0X21hcCAoc2Vzc2lvbiwgcHQpOworICBpZiAoIWNhcHMpCisgICAgZ290byBub19jYXBzOworCisgIHJldHVybiBjYXBzOworCisgIC8qIEVSUk9SUyAqLworbm9fY2FwczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImNvdWxkIG5vdCBnZXQgY2FwcyIpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitwYXlsb2FkX3R5cGVfY2hhbmdlIChHc3RFbGVtZW50ICogZWxlbWVudCwgZ3VpbnQgcHQsIEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzaW9uKQoreworICBHU1RfREVCVUdfT0JKRUNUIChzZXNzaW9uLT5iaW4sCisgICAgICAiZW1pdGluZyBzaWduYWwgZm9yIHB0IHR5cGUgY2hhbmdlZCB0byAldSBpbiBzZXNzaW9uICV1IiwgcHQsCisgICAgICBzZXNzaW9uLT5pZCk7CisKKyAgZ19zaWduYWxfZW1pdCAoc2Vzc2lvbi0+YmluLCBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9QQVlMT0FEX1RZUEVfQ0hBTkdFXSwKKyAgICAgIDAsIHNlc3Npb24tPmlkLCBwdCk7Cit9CisKKy8qIGVtaXRlZCB3aGVuIGNhcHMgY2hhbmdlZCBmb3IgdGhlIHNlc3Npb24gKi8KK3N0YXRpYyB2b2lkCitjYXBzX2NoYW5nZWQgKEdzdFBhZCAqIHBhZCwgR1BhcmFtU3BlYyAqIHBzcGVjLCBHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbikKK3sKKyAgR3N0UnRwQmluICpiaW47CisgIEdzdENhcHMgKmNhcHM7CisgIGdpbnQgcGF5bG9hZDsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzOworCisgIGJpbiA9IHNlc3Npb24tPmJpbjsKKworICBnX29iamVjdF9nZXQgKHBhZCwgImNhcHMiLCAmY2FwcywgTlVMTCk7CisKKyAgaWYgKGNhcHMgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAiZ290IGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICAvKiBnZXQgcGF5bG9hZCwgZmluaXNoIHdoZW4gaXQncyBub3QgdGhlcmUgKi8KKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJwYXlsb2FkIiwgJnBheWxvYWQpKSB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIHJldHVybjsKKyAgfQorCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChzZXNzaW9uKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmluLCAiaW5zZXJ0IGNhcHMgZm9yIHBheWxvYWQgJWQiLCBwYXlsb2FkKTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoc2Vzc2lvbi0+cHRtYXAsIEdJTlRfVE9fUE9JTlRFUiAocGF5bG9hZCksIGNhcHMpOworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzaW9uKTsKK30KKworLyogYSBuZXcgcGFkIChTU1JDKSB3YXMgY3JlYXRlZCBpbiBAc2Vzc2lvbiAqLworc3RhdGljIHZvaWQKK25ld19zc3JjX3BhZF9mb3VuZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIGd1aW50IHNzcmMsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbikKK3sKKyAgR3N0UnRwQmluICpydHBiaW47CisgIEdzdFJ0cEJpblN0cmVhbSAqc3RyZWFtOworICBHc3RQYWQgKnNpbmtwYWQsICpzcmNwYWQ7CisgIGdjaGFyICpwYWRuYW1lOworCisgIHJ0cGJpbiA9IHNlc3Npb24tPmJpbjsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJuZXcgU1NSQyBwYWQgJTA4eCwgJXM6JXMiLCBzc3JjLAorICAgICAgR1NUX0RFQlVHX1BBRF9OQU1FIChwYWQpKTsKKworICBHU1RfUlRQX0JJTl9TSFVURE9XTl9MT0NLIChydHBiaW4sIHNodXRkb3duKTsKKworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAoc2Vzc2lvbik7CisKKyAgLyogY3JlYXRlIG5ldyBzdHJlYW0gKi8KKyAgc3RyZWFtID0gY3JlYXRlX3N0cmVhbSAoc2Vzc2lvbiwgc3NyYyk7CisgIGlmICghc3RyZWFtKQorICAgIGdvdG8gbm9fc3RyZWFtOworCisgIC8qIGdldCBwYWQgYW5kIGxpbmsgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwYmluLCAibGlua2luZyBqaXR0ZXJidWZmZXIgUlRQIik7CisgIHBhZG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzcmNfJXUiLCBzc3JjKTsKKyAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGVsZW1lbnQsIHBhZG5hbWUpOworICBnX2ZyZWUgKHBhZG5hbWUpOworICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHN0cmVhbS0+YnVmZmVyLCAic2luayIpOworICBnc3RfcGFkX2xpbmtfZnVsbCAoc3JjcGFkLCBzaW5rcGFkLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImxpbmtpbmcgaml0dGVyYnVmZmVyIFJUQ1AiKTsKKyAgcGFkbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInJ0Y3Bfc3JjXyV1Iiwgc3NyYyk7CisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChlbGVtZW50LCBwYWRuYW1lKTsKKyAgZ19mcmVlIChwYWRuYW1lKTsKKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoc3RyZWFtLT5idWZmZXIsICJzaW5rX3J0Y3AiKTsKKyAgZ3N0X3BhZF9saW5rX2Z1bGwgKHNyY3BhZCwgc2lua3BhZCwgR1NUX1BBRF9MSU5LX0NIRUNLX05PVEhJTkcpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKworICAvKiBjb25uZWN0IHRvIHRoZSBSVENQIHN5bmMgc2lnbmFsIGZyb20gdGhlIGppdHRlcmJ1ZmZlciAqLworICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJjb25uZWN0aW5nIHN5bmMgc2lnbmFsIik7CisgIHN0cmVhbS0+YnVmZmVyX2hhbmRsZXN5bmNfc2lnID0gZ19zaWduYWxfY29ubmVjdCAoc3RyZWFtLT5idWZmZXIsCisgICAgICAiaGFuZGxlLXN5bmMiLCAoR0NhbGxiYWNrKSBnc3RfcnRwX2Jpbl9oYW5kbGVfc3luYywgc3RyZWFtKTsKKworICBpZiAoc3RyZWFtLT5kZW11eCkgeworICAgIC8qIGNvbm5lY3QgdG8gdGhlIG5ldy1wYWQgc2lnbmFsIG9mIHRoZSBwYXlsb2FkIGRlbXV4ZXIsIHRoaXMgd2lsbCBleHBvc2UgdGhlCisgICAgICogbmV3IHBhZCBieSBnaG9zdGluZyBpdC4gKi8KKyAgICBzdHJlYW0tPmRlbXV4X25ld3BhZF9zaWcgPSBnX3NpZ25hbF9jb25uZWN0IChzdHJlYW0tPmRlbXV4LAorICAgICAgICAibmV3LXBheWxvYWQtdHlwZSIsIChHQ2FsbGJhY2spIG5ld19wYXlsb2FkX2ZvdW5kLCBzdHJlYW0pOworICAgIHN0cmVhbS0+ZGVtdXhfcGFkcmVtb3ZlZF9zaWcgPSBnX3NpZ25hbF9jb25uZWN0IChzdHJlYW0tPmRlbXV4LAorICAgICAgICAicGFkLXJlbW92ZWQiLCAoR0NhbGxiYWNrKSBwYXlsb2FkX3BhZF9yZW1vdmVkLCBzdHJlYW0pOworCisgICAgLyogY29ubmVjdCB0byB0aGUgcmVxdWVzdC1wdC1tYXAgc2lnbmFsLiBUaGlzIHNpZ25hbCB3aWxsIGJlIGVtaXRlZCBieSB0aGUKKyAgICAgKiBkZW11eGVyIHNvIHRoYXQgaXQgY2FuIGFwcGx5IGEgcHJvcGVyIGNhcHMgb24gdGhlIGJ1ZmZlcnMgZm9yIHRoZQorICAgICAqIGRlcGF5bG9hZGVycy4gKi8KKyAgICBzdHJlYW0tPmRlbXV4X3B0cmVxX3NpZyA9IGdfc2lnbmFsX2Nvbm5lY3QgKHN0cmVhbS0+ZGVtdXgsCisgICAgICAgICJyZXF1ZXN0LXB0LW1hcCIsIChHQ2FsbGJhY2spIHB0X21hcF9yZXF1ZXN0ZWQsIHNlc3Npb24pOworICAgIC8qIGNvbm5lY3QgdG8gdGhlICBzaWduYWwgc28gaXQgY2FuIGJlIGZvcndhcmRlZC4gKi8KKyAgICBzdHJlYW0tPmRlbXV4X3B0Y2hhbmdlX3NpZyA9IGdfc2lnbmFsX2Nvbm5lY3QgKHN0cmVhbS0+ZGVtdXgsCisgICAgICAgICJwYXlsb2FkLXR5cGUtY2hhbmdlIiwgKEdDYWxsYmFjaykgcGF5bG9hZF90eXBlX2NoYW5nZSwgc2Vzc2lvbik7CisgIH0gZWxzZSB7CisgICAgLyogYWRkIHJ0cGppdHRlcmJ1ZmZlciBzcmMgcGFkIHRvIHBhZHMgKi8KKyAgICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzOworICAgIEdzdFBhZFRlbXBsYXRlICp0ZW1wbDsKKyAgICBnY2hhciAqcGFkbmFtZTsKKyAgICBHc3RQYWQgKmdwYWQsICpwYWQ7CisKKyAgICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc3RyZWFtLT5idWZmZXIsICJzcmMiKTsKKworICAgIC8qIGdob3N0IHRoZSBwYWQgdG8gdGhlIHBhcmVudCAqLworICAgIGtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChydHBiaW4pOworICAgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJyZWN2X3J0cF9zcmNfJXVfJXVfJXUiKTsKKyAgICBwYWRuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgicmVjdl9ydHBfc3JjXyV1XyV1XyV1IiwKKyAgICAgICAgc3RyZWFtLT5zZXNzaW9uLT5pZCwgc3RyZWFtLT5zc3JjLCAyNTUpOworICAgIGdwYWQgPSBnc3RfZ2hvc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChwYWRuYW1lLCBwYWQsIHRlbXBsKTsKKyAgICBnX2ZyZWUgKHBhZG5hbWUpOworCisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlIChncGFkLCBUUlVFKTsKKyAgICBnc3RfcGFkX3N0aWNreV9ldmVudHNfZm9yZWFjaCAocGFkLCBjb3B5X3N0aWNreV9ldmVudHMsIGdwYWQpOworICAgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cGJpbiksIGdwYWQpOworCisgICAgZ3N0X29iamVjdF91bnJlZiAocGFkKTsKKyAgfQorCisgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3Npb24pOworICBHU1RfUlRQX0JJTl9TSFVURE9XTl9VTkxPQ0sgKHJ0cGJpbik7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworc2h1dGRvd246CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJ3ZSBhcmUgc2h1dHRpbmcgZG93biIpOworICAgIHJldHVybjsKKyAgfQorbm9fc3RyZWFtOgorICB7CisgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzc2lvbik7CisgICAgR1NUX1JUUF9CSU5fU0hVVERPV05fVU5MT0NLIChydHBiaW4pOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImNvdWxkIG5vdCBjcmVhdGUgc3RyZWFtIik7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitzZXNzaW9uX21heWJlX2NyZWF0ZV9idW5kbGVfZGVtdXhlciAoR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24pCit7CisgIEdzdFJ0cEJpbiAqcnRwYmluOworCisgIGlmIChzZXNzaW9uLT5idW5kbGVfZGVtdXgpCisgICAgcmV0dXJuOworCisgIHJ0cGJpbiA9IHNlc3Npb24tPmJpbjsKKyAgaWYgKGdfc2lnbmFsX2hhc19oYW5kbGVyX3BlbmRpbmcgKHJ0cGJpbiwKKyAgICAgICAgICBnc3RfcnRwX2Jpbl9zaWduYWxzW1NJR05BTF9PTl9CVU5ETEVEX1NTUkNdLCAwLCBUUlVFKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgIkFkZGluZyBhIGJ1bmRsZSBTU1JDIGRlbXV4ZXIgdG8gc2Vzc2lvbiAldSIsCisgICAgICAgIHNlc3Npb24tPmlkKTsKKyAgICBzZXNzaW9uLT5idW5kbGVfZGVtdXggPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBzc3JjZGVtdXgiLCBOVUxMKTsKKyAgICBzZXNzaW9uLT5idW5kbGVfZGVtdXhfbmV3cGFkX3NpZyA9IGdfc2lnbmFsX2Nvbm5lY3QgKHNlc3Npb24tPmJ1bmRsZV9kZW11eCwKKyAgICAgICAgIm5ldy1zc3JjLXBhZCIsIChHQ2FsbGJhY2spIG5ld19idW5kbGVkX3NzcmNfcGFkX2ZvdW5kLCBzZXNzaW9uKTsKKworICAgIGdzdF9iaW5fYWRkIChHU1RfQklOX0NBU1QgKHJ0cGJpbiksIHNlc3Npb24tPmJ1bmRsZV9kZW11eCk7CisgICAgZ3N0X2VsZW1lbnRfc3luY19zdGF0ZV93aXRoX3BhcmVudCAoc2Vzc2lvbi0+YnVuZGxlX2RlbXV4KTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sCisgICAgICAgICJObyBoYW5kbGVyIGZvciB0aGUgb24tYnVuZGxlZC1zc3JjIHNpZ25hbCBzbyBubyBuZWVkIGZvciBhIGJ1bmRsZSBTU1JDIGRlbXV4ZXIgaW4gc2Vzc2lvbiAldSIsCisgICAgICAgIHNlc3Npb24tPmlkKTsKKyAgfQorfQorCitzdGF0aWMgR3N0UGFkICoKK2NvbXBsZXRlX3Nlc3Npb25fc2luayAoR3N0UnRwQmluICogcnRwYmluLCBHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbiwKKyAgICBnYm9vbGVhbiBidW5kbGVfZGVtdXhlcl9uZWVkZWQpCit7CisgIGd1aW50IHNlc3NpZCA9IHNlc3Npb24tPmlkOworICBHc3RQYWQgKnJlY3ZfcnRwX3Npbms7CisgIEdzdFBhZCAqZnVubmVsX3NyYzsKKyAgR3N0RWxlbWVudCAqZGVjb2RlcjsKKworICBnX2Fzc2VydCAoIXNlc3Npb24tPnJlY3ZfcnRwX3NpbmspOworCisgIC8qIGdldCByZWN2X3J0cCBwYWQgYW5kIHN0b3JlICovCisgIHNlc3Npb24tPnJlY3ZfcnRwX3NpbmsgPQorICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChzZXNzaW9uLT5zZXNzaW9uLCAicmVjdl9ydHBfc2luayIpOworICBpZiAoc2Vzc2lvbi0+cmVjdl9ydHBfc2luayA9PSBOVUxMKQorICAgIGdvdG8gcGFkX2ZhaWxlZDsKKworICBnX3NpZ25hbF9jb25uZWN0IChzZXNzaW9uLT5yZWN2X3J0cF9zaW5rLCAibm90aWZ5OjpjYXBzIiwKKyAgICAgIChHQ2FsbGJhY2spIGNhcHNfY2hhbmdlZCwgc2Vzc2lvbik7CisKKyAgaWYgKGJ1bmRsZV9kZW11eGVyX25lZWRlZCkKKyAgICBzZXNzaW9uX21heWJlX2NyZWF0ZV9idW5kbGVfZGVtdXhlciAoc2Vzc2lvbik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwYmluLCAicmVxdWVzdGluZyBSVFAgZGVjb2RlciIpOworICBkZWNvZGVyID0gc2Vzc2lvbl9yZXF1ZXN0X2VsZW1lbnQgKHNlc3Npb24sIFNJR05BTF9SRVFVRVNUX1JUUF9ERUNPREVSKTsKKyAgaWYgKGRlY29kZXIpIHsKKyAgICBHc3RQYWQgKmRlY3NyYywgKmRlY3Npbms7CisgICAgR3N0UGFkTGlua1JldHVybiByZXQ7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJsaW5raW5nIFJUUCBkZWNvZGVyIik7CisgICAgZGVjc2luayA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChkZWNvZGVyLCAicnRwX3NpbmsiKTsKKyAgICBpZiAoZGVjc2luayA9PSBOVUxMKQorICAgICAgZ290byBkZWNfc2lua19mYWlsZWQ7CisKKyAgICByZWN2X3J0cF9zaW5rID0gZGVjc2luazsKKworICAgIGRlY3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChkZWNvZGVyLCAicnRwX3NyYyIpOworICAgIGlmIChkZWNzcmMgPT0gTlVMTCkKKyAgICAgIGdvdG8gZGVjX3NyY19mYWlsZWQ7CisKKyAgICBpZiAoc2Vzc2lvbi0+YnVuZGxlX2RlbXV4KSB7CisgICAgICBHc3RQYWQgKmRlbXV4X3Npbms7CisgICAgICBkZW11eF9zaW5rID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNlc3Npb24tPmJ1bmRsZV9kZW11eCwgInNpbmsiKTsKKyAgICAgIHJldCA9IGdzdF9wYWRfbGluayAoZGVjc3JjLCBkZW11eF9zaW5rKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGRlbXV4X3NpbmspOworICAgIH0gZWxzZSB7CisgICAgICByZXQgPSBnc3RfcGFkX2xpbmsgKGRlY3NyYywgc2Vzc2lvbi0+cmVjdl9ydHBfc2luayk7CisgICAgfQorICAgIGdzdF9vYmplY3RfdW5yZWYgKGRlY3NyYyk7CisKKyAgICBpZiAocmV0ICE9IEdTVF9QQURfTElOS19PSykKKyAgICAgIGdvdG8gZGVjX2xpbmtfZmFpbGVkOworCisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwYmluLCAibm8gUlRQIGRlY29kZXIgZ2l2ZW4iKTsKKyAgICBpZiAoc2Vzc2lvbi0+YnVuZGxlX2RlbXV4KSB7CisgICAgICByZWN2X3J0cF9zaW5rID0KKyAgICAgICAgICBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2Vzc2lvbi0+YnVuZGxlX2RlbXV4LCAic2luayIpOworICAgIH0gZWxzZSB7CisgICAgICByZWN2X3J0cF9zaW5rID0KKyAgICAgICAgICBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHNlc3Npb24tPnJ0cF9mdW5uZWwsICJzaW5rXyV1Iik7CisgICAgfQorICB9CisKKyAgZnVubmVsX3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzZXNzaW9uLT5ydHBfZnVubmVsLCAic3JjIik7CisgIGdzdF9wYWRfbGluayAoZnVubmVsX3NyYywgc2Vzc2lvbi0+cmVjdl9ydHBfc2luayk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGZ1bm5lbF9zcmMpOworCisgIHJldHVybiByZWN2X3J0cF9zaW5rOworCisgIC8qIEVSUk9SUyAqLworcGFkX2ZhaWxlZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogZmFpbGVkIHRvIGdldCBzZXNzaW9uIHJlY3ZfcnRwX3NpbmsgcGFkIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2RlY19zaW5rX2ZhaWxlZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogZmFpbGVkIHRvIGdldCBkZWNvZGVyIHNpbmsgcGFkIGZvciBzZXNzaW9uICV1Iiwgc2Vzc2lkKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorZGVjX3NyY19mYWlsZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGZhaWxlZCB0byBnZXQgZGVjb2RlciBzcmMgcGFkIGZvciBzZXNzaW9uICV1Iiwgc2Vzc2lkKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChyZWN2X3J0cF9zaW5rKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorZGVjX2xpbmtfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gbGluayBydHAgZGVjb2RlciBmb3Igc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocmVjdl9ydHBfc2luayk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NvbXBsZXRlX3Nlc3Npb25fcmVjZWl2ZXIgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24sCisgICAgZ3VpbnQgc2Vzc2lkKQoreworICBHc3RFbGVtZW50ICphdXg7CisgIEdzdFBhZCAqcmVjdl9ydHBfc3JjOworCisgIGdfYXNzZXJ0ICghc2Vzc2lvbi0+cmVjdl9ydHBfc3JjKTsKKworICBzZXNzaW9uLT5yZWN2X3J0cF9zcmMgPQorICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNlc3Npb24tPnNlc3Npb24sICJyZWN2X3J0cF9zcmMiKTsKKyAgaWYgKHNlc3Npb24tPnJlY3ZfcnRwX3NyYyA9PSBOVUxMKQorICAgIGdvdG8gcGFkX2ZhaWxlZDsKKworICAvKiBmaW5kIG91dCBpZiB3ZSBuZWVkIEFVWCBlbGVtZW50cyBvciBpZiB3ZSBjYW4gZ28gaW50byB0aGUgU1NSQyBkZW11eGVyCisgICAqIGRpcmVjdGx5ICovCisgIGF1eCA9IHNlc3Npb25fcmVxdWVzdF9lbGVtZW50IChzZXNzaW9uLCBTSUdOQUxfUkVRVUVTVF9BVVhfUkVDRUlWRVIpOworICBpZiAoYXV4KSB7CisgICAgZ2NoYXIgKnBuYW1lOworICAgIEdzdFBhZCAqYXV4c2luazsKKyAgICBHc3RQYWRMaW5rUmV0dXJuIHJldDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImxpbmtpbmcgQVVYIHJlY2VpdmVyIik7CisKKyAgICBwbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNpbmtfJXUiLCBzZXNzaWQpOworICAgIGF1eHNpbmsgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoYXV4LCBwbmFtZSk7CisgICAgZ19mcmVlIChwbmFtZSk7CisgICAgaWYgKGF1eHNpbmsgPT0gTlVMTCkKKyAgICAgIGdvdG8gYXV4X3NpbmtfZmFpbGVkOworCisgICAgcmV0ID0gZ3N0X3BhZF9saW5rIChzZXNzaW9uLT5yZWN2X3J0cF9zcmMsIGF1eHNpbmspOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGF1eHNpbmspOworICAgIGlmIChyZXQgIT0gR1NUX1BBRF9MSU5LX09LKQorICAgICAgZ290byBhdXhfbGlua19mYWlsZWQ7CisKKyAgICAvKiB0aGlzIGNhbiBiZSBOVUxMIHdoZW4gdGhpcyBBVVggZWxlbWVudCBpcyBub3QgdG8gYmUgbGlua2VkIHRvCisgICAgICogYW4gU1NSQyBkZW11eGVyICovCisgICAgcG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzcmNfJXUiLCBzZXNzaWQpOworICAgIHJlY3ZfcnRwX3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChhdXgsIHBuYW1lKTsKKyAgICBnX2ZyZWUgKHBuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICByZWN2X3J0cF9zcmMgPSBnc3Rfb2JqZWN0X3JlZiAoc2Vzc2lvbi0+cmVjdl9ydHBfc3JjKTsKKyAgfQorCisgIGlmIChyZWN2X3J0cF9zcmMpIHsKKyAgICBHc3RQYWQgKnNpbmtkcGFkOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwYmluLCAiZ2V0dGluZyBkZW11eGVyIFJUUCBzaW5rIHBhZCIpOworICAgIHNpbmtkcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNlc3Npb24tPmRlbXV4LCAic2luayIpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImxpbmtpbmcgZGVtdXhlciBSVFAgc2luayBwYWQiKTsKKyAgICBnc3RfcGFkX2xpbmtfZnVsbCAocmVjdl9ydHBfc3JjLCBzaW5rZHBhZCwgR1NUX1BBRF9MSU5LX0NIRUNLX05PVEhJTkcpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtkcGFkKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChyZWN2X3J0cF9zcmMpOworCisgICAgLyogY29ubmVjdCB0byB0aGUgbmV3LXNzcmMtcGFkIHNpZ25hbCBvZiB0aGUgU1NSQyBkZW11eGVyICovCisgICAgc2Vzc2lvbi0+ZGVtdXhfbmV3cGFkX3NpZyA9IGdfc2lnbmFsX2Nvbm5lY3QgKHNlc3Npb24tPmRlbXV4LAorICAgICAgICAibmV3LXNzcmMtcGFkIiwgKEdDYWxsYmFjaykgbmV3X3NzcmNfcGFkX2ZvdW5kLCBzZXNzaW9uKTsKKyAgICBzZXNzaW9uLT5kZW11eF9wYWRyZW1vdmVkX3NpZyA9IGdfc2lnbmFsX2Nvbm5lY3QgKHNlc3Npb24tPmRlbXV4LAorICAgICAgICAicmVtb3ZlZC1zc3JjLXBhZCIsIChHQ2FsbGJhY2spIHNzcmNfZGVtdXhfcGFkX3JlbW92ZWQsIHNlc3Npb24pOworICB9CisKKyAgcmV0dXJuOworCitwYWRfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gZ2V0IHNlc3Npb24gcmVjdl9ydHBfc3JjIHBhZCIpOworICAgIHJldHVybjsKKyAgfQorYXV4X3NpbmtfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gZ2V0IEFVWCBzaW5rIHBhZCBmb3Igc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisgICAgcmV0dXJuOworICB9CithdXhfbGlua19mYWlsZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGZhaWxlZCB0byBsaW5rIEFVWCBwYWQgdG8gc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisgICAgcmV0dXJuOworICB9Cit9CisKKy8qIENyZWF0ZSBhIHBhZCBmb3IgcmVjZWl2aW5nIFJUUCBmb3IgdGhlIHNlc3Npb24gaW4gQG5hbWUuIE11c3QgYmUgY2FsbGVkIHdpdGgKKyAqIFJUUF9CSU5fTE9DSy4KKyAqLworc3RhdGljIEdzdFBhZCAqCitjcmVhdGVfcmVjdl9ydHAgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgY29uc3QgZ2NoYXIgKiBuYW1lKQoreworICBndWludCBzZXNzaWQ7CisgIEdzdFJ0cEJpblNlc3Npb24gKnNlc3Npb247CisgIEdzdFBhZCAqcmVjdl9ydHBfc2luazsKKworICAvKiBmaXJzdCBnZXQgdGhlIHNlc3Npb24gbnVtYmVyICovCisgIGlmIChuYW1lID09IE5VTEwgfHwgc3NjYW5mIChuYW1lLCAicmVjdl9ydHBfc2lua18ldSIsICZzZXNzaWQpICE9IDEpCisgICAgZ290byBub19uYW1lOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImZpbmRpbmcgc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisKKyAgLyogZ2V0IG9yIGNyZWF0ZSBzZXNzaW9uICovCisgIHNlc3Npb24gPSBmaW5kX3Nlc3Npb25fYnlfaWQgKHJ0cGJpbiwgc2Vzc2lkKTsKKyAgaWYgKCFzZXNzaW9uKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwYmluLCAiY3JlYXRpbmcgc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisgICAgLyogY3JlYXRlIHNlc3Npb24gbm93ICovCisgICAgc2Vzc2lvbiA9IGNyZWF0ZV9zZXNzaW9uIChydHBiaW4sIHNlc3NpZCk7CisgICAgaWYgKHNlc3Npb24gPT0gTlVMTCkKKyAgICAgIGdvdG8gY3JlYXRlX2Vycm9yOworICB9CisKKyAgLyogY2hlY2sgaWYgcGFkIHdhcyByZXF1ZXN0ZWQgKi8KKyAgaWYgKHNlc3Npb24tPnJlY3ZfcnRwX3NpbmtfZ2hvc3QgIT0gTlVMTCkKKyAgICByZXR1cm4gc2Vzc2lvbi0+cmVjdl9ydHBfc2lua19naG9zdDsKKworICAvKiBzZXR1cCB0aGUgc2Vzc2lvbiBzaW5rIHBhZCAqLworICByZWN2X3J0cF9zaW5rID0gY29tcGxldGVfc2Vzc2lvbl9zaW5rIChydHBiaW4sIHNlc3Npb24sIFRSVUUpOworICBpZiAoIXJlY3ZfcnRwX3NpbmspCisgICAgZ290byBzZXNzaW9uX3NpbmtfZmFpbGVkOworCisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwYmluLCAiZ2hvc3Rpbmcgc2Vzc2lvbiBzaW5rIHBhZCIpOworICBzZXNzaW9uLT5yZWN2X3J0cF9zaW5rX2dob3N0ID0KKyAgICAgIGdzdF9naG9zdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKG5hbWUsIHJlY3ZfcnRwX3NpbmssIHRlbXBsKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocmVjdl9ydHBfc2luayk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc2Vzc2lvbi0+cmVjdl9ydHBfc2lua19naG9zdCwgVFJVRSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cGJpbiksIHNlc3Npb24tPnJlY3ZfcnRwX3NpbmtfZ2hvc3QpOworCisgIGNvbXBsZXRlX3Nlc3Npb25fcmVjZWl2ZXIgKHJ0cGJpbiwgc2Vzc2lvbiwgc2Vzc2lkKTsKKworICByZXR1cm4gc2Vzc2lvbi0+cmVjdl9ydHBfc2lua19naG9zdDsKKworICAvKiBFUlJPUlMgKi8KK25vX25hbWU6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGludmFsaWQgbmFtZSBnaXZlbiIpOworICAgIHJldHVybiBOVUxMOworICB9CitjcmVhdGVfZXJyb3I6CisgIHsKKyAgICAvKiBjcmVhdGVfc2Vzc2lvbiBhbHJlYWR5IHdhcm5lZCAqLworICAgIHJldHVybiBOVUxMOworICB9CitzZXNzaW9uX3NpbmtfZmFpbGVkOgorICB7CisgICAgLyogd2FybmluZyBhbHJlYWR5IGRvbmUgKi8KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX3JlY3ZfcnRwIChHc3RSdHBCaW4gKiBydHBiaW4sIEdzdFJ0cEJpblNlc3Npb24gKiBzZXNzaW9uKQoreworICBpZiAoc2Vzc2lvbi0+ZGVtdXhfbmV3cGFkX3NpZykgeworICAgIGdfc2lnbmFsX2hhbmRsZXJfZGlzY29ubmVjdCAoc2Vzc2lvbi0+ZGVtdXgsIHNlc3Npb24tPmRlbXV4X25ld3BhZF9zaWcpOworICAgIHNlc3Npb24tPmRlbXV4X25ld3BhZF9zaWcgPSAwOworICB9CisgIGlmIChzZXNzaW9uLT5kZW11eF9wYWRyZW1vdmVkX3NpZykgeworICAgIGdfc2lnbmFsX2hhbmRsZXJfZGlzY29ubmVjdCAoc2Vzc2lvbi0+ZGVtdXgsIHNlc3Npb24tPmRlbXV4X3BhZHJlbW92ZWRfc2lnKTsKKyAgICBzZXNzaW9uLT5kZW11eF9wYWRyZW1vdmVkX3NpZyA9IDA7CisgIH0KKyAgaWYgKHNlc3Npb24tPmJ1bmRsZV9kZW11eF9uZXdwYWRfc2lnKSB7CisgICAgZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0IChzZXNzaW9uLT5idW5kbGVfZGVtdXgsCisgICAgICAgIHNlc3Npb24tPmJ1bmRsZV9kZW11eF9uZXdwYWRfc2lnKTsKKyAgICBzZXNzaW9uLT5idW5kbGVfZGVtdXhfbmV3cGFkX3NpZyA9IDA7CisgIH0KKyAgaWYgKHNlc3Npb24tPnJlY3ZfcnRwX3NyYykgeworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNlc3Npb24tPnJlY3ZfcnRwX3NyYyk7CisgICAgc2Vzc2lvbi0+cmVjdl9ydHBfc3JjID0gTlVMTDsKKyAgfQorICBpZiAoc2Vzc2lvbi0+cmVjdl9ydHBfc2luaykgeworICAgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHNlc3Npb24tPnNlc3Npb24sIHNlc3Npb24tPnJlY3ZfcnRwX3NpbmspOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNlc3Npb24tPnJlY3ZfcnRwX3NpbmspOworICAgIHNlc3Npb24tPnJlY3ZfcnRwX3NpbmsgPSBOVUxMOworICB9CisgIGlmIChzZXNzaW9uLT5yZWN2X3J0cF9zaW5rX2dob3N0KSB7CisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzZXNzaW9uLT5yZWN2X3J0cF9zaW5rX2dob3N0LCBGQUxTRSk7CisgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwYmluKSwKKyAgICAgICAgc2Vzc2lvbi0+cmVjdl9ydHBfc2lua19naG9zdCk7CisgICAgc2Vzc2lvbi0+cmVjdl9ydHBfc2lua19naG9zdCA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIEdzdFBhZCAqCitjb21wbGV0ZV9zZXNzaW9uX3J0Y3AgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24sCisgICAgZ3VpbnQgc2Vzc2lkLCBnYm9vbGVhbiBidW5kbGVfZGVtdXhlcl9uZWVkZWQpCit7CisgIEdzdEVsZW1lbnQgKmRlY29kZXI7CisgIEdzdFBhZCAqc2lua2RwYWQ7CisgIEdzdFBhZCAqZGVjc2luayA9IE5VTEw7CisgIEdzdFBhZCAqZnVubmVsX3NyYzsKKworICAvKiBnZXQgcmVjdl9ydHAgcGFkIGFuZCBzdG9yZSAqLworICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJnZXR0aW5nIFJUQ1Agc2luayBwYWQiKTsKKyAgc2Vzc2lvbi0+cmVjdl9ydGNwX3NpbmsgPQorICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChzZXNzaW9uLT5zZXNzaW9uLCAicmVjdl9ydGNwX3NpbmsiKTsKKyAgaWYgKHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rID09IE5VTEwpCisgICAgZ290byBwYWRfZmFpbGVkOworCisgIGlmIChidW5kbGVfZGVtdXhlcl9uZWVkZWQpCisgICAgc2Vzc2lvbl9tYXliZV9jcmVhdGVfYnVuZGxlX2RlbXV4ZXIgKHNlc3Npb24pOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImdldHRpbmcgUlRDUCBkZWNvZGVyIik7CisgIGRlY29kZXIgPSBzZXNzaW9uX3JlcXVlc3RfZWxlbWVudCAoc2Vzc2lvbiwgU0lHTkFMX1JFUVVFU1RfUlRDUF9ERUNPREVSKTsKKyAgaWYgKGRlY29kZXIpIHsKKyAgICBHc3RQYWQgKmRlY3NyYzsKKyAgICBHc3RQYWRMaW5rUmV0dXJuIHJldDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImxpbmtpbmcgUlRDUCBkZWNvZGVyIik7CisgICAgZGVjc2luayA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChkZWNvZGVyLCAicnRjcF9zaW5rIik7CisgICAgZGVjc3JjID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGRlY29kZXIsICJydGNwX3NyYyIpOworCisgICAgaWYgKGRlY3NpbmsgPT0gTlVMTCkKKyAgICAgIGdvdG8gZGVjX3NpbmtfZmFpbGVkOworCisgICAgaWYgKGRlY3NyYyA9PSBOVUxMKQorICAgICAgZ290byBkZWNfc3JjX2ZhaWxlZDsKKworICAgIGlmIChzZXNzaW9uLT5idW5kbGVfZGVtdXgpIHsKKyAgICAgIEdzdFBhZCAqZGVtdXhfc2luazsKKyAgICAgIGRlbXV4X3NpbmsgPQorICAgICAgICAgIGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzZXNzaW9uLT5idW5kbGVfZGVtdXgsICJydGNwX3NpbmsiKTsKKyAgICAgIHJldCA9IGdzdF9wYWRfbGluayAoZGVjc3JjLCBkZW11eF9zaW5rKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGRlbXV4X3NpbmspOworICAgIH0gZWxzZSB7CisgICAgICByZXQgPSBnc3RfcGFkX2xpbmsgKGRlY3NyYywgc2Vzc2lvbi0+cmVjdl9ydGNwX3NpbmspOworICAgIH0KKyAgICBnc3Rfb2JqZWN0X3VucmVmIChkZWNzcmMpOworCisgICAgaWYgKHJldCAhPSBHU1RfUEFEX0xJTktfT0spCisgICAgICBnb3RvIGRlY19saW5rX2ZhaWxlZDsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJubyBSVENQIGRlY29kZXIgZ2l2ZW4iKTsKKyAgICBpZiAoc2Vzc2lvbi0+YnVuZGxlX2RlbXV4KSB7CisgICAgICBkZWNzaW5rID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNlc3Npb24tPmJ1bmRsZV9kZW11eCwgInJ0Y3Bfc2luayIpOworICAgIH0gZWxzZSB7CisgICAgICBkZWNzaW5rID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChzZXNzaW9uLT5ydGNwX2Z1bm5lbCwgInNpbmtfJXUiKTsKKyAgICB9CisgIH0KKworICAvKiBnZXQgc3JjcGFkLCBsaW5rIHRvIFNTUkNEZW11eCAqLworICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJnZXR0aW5nIHN5bmMgc3JjIHBhZCIpOworICBzZXNzaW9uLT5zeW5jX3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzZXNzaW9uLT5zZXNzaW9uLCAic3luY19zcmMiKTsKKyAgaWYgKHNlc3Npb24tPnN5bmNfc3JjID09IE5VTEwpCisgICAgZ290byBzcmNfcGFkX2ZhaWxlZDsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJnZXR0aW5nIGRlbXV4ZXIgUlRDUCBzaW5rIHBhZCIpOworICBzaW5rZHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzZXNzaW9uLT5kZW11eCwgInJ0Y3Bfc2luayIpOworICBnc3RfcGFkX2xpbmtfZnVsbCAoc2Vzc2lvbi0+c3luY19zcmMsIHNpbmtkcGFkLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtkcGFkKTsKKworICBmdW5uZWxfc3JjID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNlc3Npb24tPnJ0Y3BfZnVubmVsLCAic3JjIik7CisgIGdzdF9wYWRfbGluayAoZnVubmVsX3NyYywgc2Vzc2lvbi0+cmVjdl9ydGNwX3NpbmspOworICBnc3Rfb2JqZWN0X3VucmVmIChmdW5uZWxfc3JjKTsKKworICByZXR1cm4gZGVjc2luazsKKworcGFkX2ZhaWxlZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogZmFpbGVkIHRvIGdldCBzZXNzaW9uIHJ0Y3Bfc2luayBwYWQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorZGVjX3NpbmtfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gZ2V0IGRlY29kZXIgc2luayBwYWQgZm9yIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIHJldHVybiBOVUxMOworICB9CitkZWNfc3JjX2ZhaWxlZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogZmFpbGVkIHRvIGdldCBkZWNvZGVyIHNyYyBwYWQgZm9yIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorZGVjX2xpbmtfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gbGluayBydGNwIGRlY29kZXIgZm9yIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorc3JjX3BhZF9mYWlsZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGZhaWxlZCB0byBnZXQgc2Vzc2lvbiBzeW5jX3NyYyBwYWQiKTsKKyAgfQorCitjbGVhbnVwOgorICBnc3Rfb2JqZWN0X3VucmVmIChkZWNzaW5rKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIENyZWF0ZSBhIHBhZCBmb3IgcmVjZWl2aW5nIFJUQ1AgZm9yIHRoZSBzZXNzaW9uIGluIEBuYW1lLiBNdXN0IGJlIGNhbGxlZCB3aXRoCisgKiBSVFBfQklOX0xPQ0suCisgKi8KK3N0YXRpYyBHc3RQYWQgKgorY3JlYXRlX3JlY3ZfcnRjcCAoR3N0UnRwQmluICogcnRwYmluLCBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLAorICAgIGNvbnN0IGdjaGFyICogbmFtZSkKK3sKKyAgZ3VpbnQgc2Vzc2lkOworICBHc3RSdHBCaW5TZXNzaW9uICpzZXNzaW9uOworICBHc3RQYWQgKmRlY3NpbmsgPSBOVUxMOworCisgIC8qIGZpcnN0IGdldCB0aGUgc2Vzc2lvbiBudW1iZXIgKi8KKyAgaWYgKG5hbWUgPT0gTlVMTCB8fCBzc2NhbmYgKG5hbWUsICJyZWN2X3J0Y3Bfc2lua18ldSIsICZzZXNzaWQpICE9IDEpCisgICAgZ290byBub19uYW1lOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImZpbmRpbmcgc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisKKyAgLyogZ2V0IG9yIGNyZWF0ZSB0aGUgc2Vzc2lvbiAqLworICBzZXNzaW9uID0gZmluZF9zZXNzaW9uX2J5X2lkIChydHBiaW4sIHNlc3NpZCk7CisgIGlmICghc2Vzc2lvbikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImNyZWF0aW5nIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIC8qIGNyZWF0ZSBzZXNzaW9uIG5vdyAqLworICAgIHNlc3Npb24gPSBjcmVhdGVfc2Vzc2lvbiAocnRwYmluLCBzZXNzaWQpOworICAgIGlmIChzZXNzaW9uID09IE5VTEwpCisgICAgICBnb3RvIGNyZWF0ZV9lcnJvcjsKKyAgfQorCisgIC8qIGNoZWNrIGlmIHBhZCB3YXMgcmVxdWVzdGVkICovCisgIGlmIChzZXNzaW9uLT5yZWN2X3J0Y3Bfc2lua19naG9zdCAhPSBOVUxMKQorICAgIHJldHVybiBzZXNzaW9uLT5yZWN2X3J0Y3Bfc2lua19naG9zdDsKKworICBkZWNzaW5rID0gY29tcGxldGVfc2Vzc2lvbl9ydGNwIChydHBiaW4sIHNlc3Npb24sIHNlc3NpZCwgVFJVRSk7CisgIGlmICghZGVjc2luaykKKyAgICBnb3RvIGNyZWF0ZV9lcnJvcjsKKworICBzZXNzaW9uLT5yZWN2X3J0Y3Bfc2lua19naG9zdCA9CisgICAgICBnc3RfZ2hvc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChuYW1lLCBkZWNzaW5rLCB0ZW1wbCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGRlY3NpbmspOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rX2dob3N0LCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwYmluKSwKKyAgICAgIHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rX2dob3N0KTsKKworICByZXR1cm4gc2Vzc2lvbi0+cmVjdl9ydGNwX3NpbmtfZ2hvc3Q7CisKKyAgLyogRVJST1JTICovCitub19uYW1lOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBpbnZhbGlkIG5hbWUgZ2l2ZW4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorY3JlYXRlX2Vycm9yOgorICB7CisgICAgLyogY3JlYXRlX3Nlc3Npb24gYWxyZWFkeSB3YXJuZWQgKi8KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX3JlY3ZfcnRjcCAoR3N0UnRwQmluICogcnRwYmluLCBHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbikKK3sKKyAgaWYgKHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rX2dob3N0KSB7CisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzZXNzaW9uLT5yZWN2X3J0Y3Bfc2lua19naG9zdCwgRkFMU0UpOworICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cGJpbiksCisgICAgICAgIHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rX2dob3N0KTsKKyAgICBzZXNzaW9uLT5yZWN2X3J0Y3Bfc2lua19naG9zdCA9IE5VTEw7CisgIH0KKyAgaWYgKHNlc3Npb24tPnN5bmNfc3JjKSB7CisgICAgLyogcmVsZWFzaW5nIHRoZSByZXF1ZXN0IHBhZCBzaG91bGQgYWxzbyB1bnJlZiB0aGUgc3luYyBwYWQgKi8KKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzZXNzaW9uLT5zeW5jX3NyYyk7CisgICAgc2Vzc2lvbi0+c3luY19zcmMgPSBOVUxMOworICB9CisgIGlmIChzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luaykgeworICAgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHNlc3Npb24tPnNlc3Npb24sIHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luayk7CisgICAgc2Vzc2lvbi0+cmVjdl9ydGNwX3NpbmsgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorY29tcGxldGVfc2Vzc2lvbl9zcmMgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24pCit7CisgIGdjaGFyICpnbmFtZTsKKyAgZ3VpbnQgc2Vzc2lkID0gc2Vzc2lvbi0+aWQ7CisgIEdzdFBhZCAqc2VuZF9ydHBfc3JjOworICBHc3RFbGVtZW50ICplbmNvZGVyOworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzOworICBHc3RQYWRUZW1wbGF0ZSAqdGVtcGw7CisKKyAgLyogZ2V0IHNyY3BhZCAqLworICBzZXNzaW9uLT5zZW5kX3J0cF9zcmMgPQorICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNlc3Npb24tPnNlc3Npb24sICJzZW5kX3J0cF9zcmMiKTsKKyAgaWYgKHNlc3Npb24tPnNlbmRfcnRwX3NyYyA9PSBOVUxMKQorICAgIGdvdG8gbm9fc3JjcGFkOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImdldHRpbmcgUlRQIGVuY29kZXIiKTsKKyAgZW5jb2RlciA9IHNlc3Npb25fcmVxdWVzdF9lbGVtZW50IChzZXNzaW9uLCBTSUdOQUxfUkVRVUVTVF9SVFBfRU5DT0RFUik7CisgIGlmIChlbmNvZGVyKSB7CisgICAgZ2NoYXIgKmVuYW1lOworICAgIEdzdFBhZCAqZW5jc3JjLCAqZW5jc2luazsKKyAgICBHc3RQYWRMaW5rUmV0dXJuIHJldDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImxpbmtpbmcgUlRQIGVuY29kZXIiKTsKKyAgICBlbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInJ0cF9zcmNfJXUiLCBzZXNzaWQpOworICAgIGVuY3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChlbmNvZGVyLCBlbmFtZSk7CisgICAgZ19mcmVlIChlbmFtZSk7CisKKyAgICBpZiAoZW5jc3JjID09IE5VTEwpCisgICAgICBnb3RvIGVuY19zcmNfZmFpbGVkOworCisgICAgc2VuZF9ydHBfc3JjID0gZW5jc3JjOworCisgICAgZW5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJydHBfc2lua18ldSIsIHNlc3NpZCk7CisgICAgZW5jc2luayA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChlbmNvZGVyLCBlbmFtZSk7CisgICAgZ19mcmVlIChlbmFtZSk7CisgICAgaWYgKGVuY3NpbmsgPT0gTlVMTCkKKyAgICAgIGdvdG8gZW5jX3NpbmtfZmFpbGVkOworCisgICAgcmV0ID0gZ3N0X3BhZF9saW5rIChzZXNzaW9uLT5zZW5kX3J0cF9zcmMsIGVuY3NpbmspOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGVuY3NpbmspOworCisgICAgaWYgKHJldCAhPSBHU1RfUEFEX0xJTktfT0spCisgICAgICBnb3RvIGVuY19saW5rX2ZhaWxlZDsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJubyBSVFAgZW5jb2RlciBnaXZlbiIpOworICAgIHNlbmRfcnRwX3NyYyA9IGdzdF9vYmplY3RfcmVmIChzZXNzaW9uLT5zZW5kX3J0cF9zcmMpOworICB9CisKKyAgLyogZ2hvc3QgdGhlIG5ldyBzb3VyY2UgcGFkICovCisgIGtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChydHBiaW4pOworICBnbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNlbmRfcnRwX3NyY18ldSIsIHNlc3NpZCk7CisgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJzZW5kX3J0cF9zcmNfJXUiKTsKKyAgc2Vzc2lvbi0+c2VuZF9ydHBfc3JjX2dob3N0ID0KKyAgICAgIGdzdF9naG9zdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKGduYW1lLCBzZW5kX3J0cF9zcmMsIHRlbXBsKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2VuZF9ydHBfc3JjKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzZXNzaW9uLT5zZW5kX3J0cF9zcmNfZ2hvc3QsIFRSVUUpOworICBnc3RfcGFkX3N0aWNreV9ldmVudHNfZm9yZWFjaCAoc2VuZF9ydHBfc3JjLCBjb3B5X3N0aWNreV9ldmVudHMsCisgICAgICBzZXNzaW9uLT5zZW5kX3J0cF9zcmNfZ2hvc3QpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBiaW4pLCBzZXNzaW9uLT5zZW5kX3J0cF9zcmNfZ2hvc3QpOworICBnX2ZyZWUgKGduYW1lKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK25vX3NyY3BhZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogZmFpbGVkIHRvIGdldCBydHAgc291cmNlIHBhZCBmb3Igc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitlbmNfc3JjX2ZhaWxlZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogZmFpbGVkIHRvIGdldCBlbmNvZGVyIHNyYyBwYWQgZm9yIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorZW5jX3NpbmtfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gZ2V0IGVuY29kZXIgc2luayBwYWQgZm9yIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNlbmRfcnRwX3NyYyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitlbmNfbGlua19mYWlsZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGZhaWxlZCB0byBsaW5rIHJ0cCBlbmNvZGVyIGZvciBzZXNzaW9uICV1Iiwgc2Vzc2lkKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzZW5kX3J0cF9zcmMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3NldHVwX2F1eF9zZW5kZXJfZm9sZCAoY29uc3QgR1ZhbHVlICogaXRlbSwgR1ZhbHVlICogcmVzdWx0LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFBhZCAqcGFkOworICBnY2hhciAqbmFtZTsKKyAgZ3VpbnQgc2Vzc2lkOworICBHc3RSdHBCaW5TZXNzaW9uICpzZXNzaW9uID0gdXNlcl9kYXRhLCAqbmV3c2VzczsKKyAgR3N0UnRwQmluICpydHBiaW4gPSBzZXNzaW9uLT5iaW47CisgIEdzdFBhZExpbmtSZXR1cm4gcmV0OworCisgIHBhZCA9IGdfdmFsdWVfZ2V0X29iamVjdCAoaXRlbSk7CisgIG5hbWUgPSBnc3RfcGFkX2dldF9uYW1lIChwYWQpOworCisgIGlmIChuYW1lID09IE5VTEwgfHwgc3NjYW5mIChuYW1lLCAic3JjXyV1IiwgJnNlc3NpZCkgIT0gMSkKKyAgICBnb3RvIG5vX25hbWU7CisKKyAgZ19mcmVlIChuYW1lKTsKKworICBuZXdzZXNzID0gZmluZF9zZXNzaW9uX2J5X2lkIChydHBiaW4sIHNlc3NpZCk7CisgIGlmIChuZXdzZXNzID09IE5VTEwpIHsKKyAgICAvKiBjcmVhdGUgbmV3IHNlc3Npb24gKi8KKyAgICBuZXdzZXNzID0gY3JlYXRlX3Nlc3Npb24gKHJ0cGJpbiwgc2Vzc2lkKTsKKyAgICBpZiAobmV3c2VzcyA9PSBOVUxMKQorICAgICAgZ290byBjcmVhdGVfZXJyb3I7CisgIH0gZWxzZSBpZiAobmV3c2Vzcy0+c2VuZF9ydHBfc2luayAhPSBOVUxMKQorICAgIGdvdG8gZXhpc3Rpbmdfc2Vzc2lvbjsKKworICAvKiBnZXQgc2VuZF9ydHAgcGFkIGFuZCBzdG9yZSAqLworICBuZXdzZXNzLT5zZW5kX3J0cF9zaW5rID0KKyAgICAgIGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAobmV3c2Vzcy0+c2Vzc2lvbiwgInNlbmRfcnRwX3NpbmsiKTsKKyAgaWYgKG5ld3Nlc3MtPnNlbmRfcnRwX3NpbmsgPT0gTlVMTCkKKyAgICBnb3RvIHBhZF9mYWlsZWQ7CisKKyAgcmV0ID0gZ3N0X3BhZF9saW5rIChwYWQsIG5ld3Nlc3MtPnNlbmRfcnRwX3NpbmspOworICBpZiAocmV0ICE9IEdTVF9QQURfTElOS19PSykKKyAgICBnb3RvIGF1eF9saW5rX2ZhaWxlZDsKKworICBpZiAoIWNvbXBsZXRlX3Nlc3Npb25fc3JjIChydHBiaW4sIG5ld3Nlc3MpKQorICAgIGdvdG8gc2Vzc2lvbl9zcmNfZmFpbGVkOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworbm9fbmFtZToKKyAgeworICAgIEdTVF9XQVJOSU5HICgiaWdub3JpbmcgaW52YWxpZCBwYWQgbmFtZSAlcyIsIEdTVF9TVFJfTlVMTCAobmFtZSkpOworICAgIGdfZnJlZSAobmFtZSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KK2NyZWF0ZV9lcnJvcjoKKyAgeworICAgIC8qIGNyZWF0ZV9zZXNzaW9uIGFscmVhZHkgd2FybmVkICovCisgICAgcmV0dXJuIEZBTFNFOworICB9CitleGlzdGluZ19zZXNzaW9uOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBzZXNzaW9uICV1IGlzIGFscmVhZHkgYSBzZW5kZXIiLCBzZXNzaWQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorcGFkX2ZhaWxlZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogZmFpbGVkIHRvIGdldCBzZXNzaW9uIHBhZCBmb3Igc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CithdXhfbGlua19mYWlsZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGZhaWxlZCB0byBsaW5rIEFVWCBmb3Igc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitzZXNzaW9uX3NyY19mYWlsZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGZhaWxlZCB0byBjb21wbGV0ZSBBVVggZm9yIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3NldHVwX2F1eF9zZW5kZXIgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24sCisgICAgR3N0RWxlbWVudCAqIGF1eCkKK3sKKyAgR3N0SXRlcmF0b3IgKml0OworICBHVmFsdWUgcmVzdWx0ID0geyAwLCB9OworICBHc3RJdGVyYXRvclJlc3VsdCByZXM7CisKKyAgaXQgPSBnc3RfZWxlbWVudF9pdGVyYXRlX3NyY19wYWRzIChhdXgpOworICByZXMgPSBnc3RfaXRlcmF0b3JfZm9sZCAoaXQsIHNldHVwX2F1eF9zZW5kZXJfZm9sZCwgJnJlc3VsdCwgc2Vzc2lvbik7CisgIGdzdF9pdGVyYXRvcl9mcmVlIChpdCk7CisKKyAgcmV0dXJuIHJlcyA9PSBHU1RfSVRFUkFUT1JfRE9ORTsKK30KKworLyogQ3JlYXRlIGEgcGFkIGZvciBzZW5kaW5nIFJUUCBmb3IgdGhlIHNlc3Npb24gaW4gQG5hbWUuIE11c3QgYmUgY2FsbGVkIHdpdGgKKyAqIFJUUF9CSU5fTE9DSy4KKyAqLworc3RhdGljIEdzdFBhZCAqCitjcmVhdGVfc2VuZF9ydHAgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgY29uc3QgZ2NoYXIgKiBuYW1lKQoreworICBnY2hhciAqcG5hbWU7CisgIGd1aW50IHNlc3NpZDsKKyAgR3N0UGFkICpzZW5kX3J0cF9zaW5rOworICBHc3RFbGVtZW50ICphdXg7CisgIEdzdFJ0cEJpblNlc3Npb24gKnNlc3Npb247CisKKyAgLyogZmlyc3QgZ2V0IHRoZSBzZXNzaW9uIG51bWJlciAqLworICBpZiAobmFtZSA9PSBOVUxMIHx8IHNzY2FuZiAobmFtZSwgInNlbmRfcnRwX3NpbmtfJXUiLCAmc2Vzc2lkKSAhPSAxKQorICAgIGdvdG8gbm9fbmFtZTsKKworICAvKiBnZXQgb3IgY3JlYXRlIHNlc3Npb24gKi8KKyAgc2Vzc2lvbiA9IGZpbmRfc2Vzc2lvbl9ieV9pZCAocnRwYmluLCBzZXNzaWQpOworICBpZiAoIXNlc3Npb24pIHsKKyAgICAvKiBjcmVhdGUgc2Vzc2lvbiBub3cgKi8KKyAgICBzZXNzaW9uID0gY3JlYXRlX3Nlc3Npb24gKHJ0cGJpbiwgc2Vzc2lkKTsKKyAgICBpZiAoc2Vzc2lvbiA9PSBOVUxMKQorICAgICAgZ290byBjcmVhdGVfZXJyb3I7CisgIH0KKworICAvKiBjaGVjayBpZiBwYWQgd2FzIHJlcXVlc3RlZCAqLworICBpZiAoc2Vzc2lvbi0+c2VuZF9ydHBfc2lua19naG9zdCAhPSBOVUxMKQorICAgIHJldHVybiBzZXNzaW9uLT5zZW5kX3J0cF9zaW5rX2dob3N0OworCisgIC8qIGNoZWNrIGlmIHdlIGFyZSBhbHJlYWR5IHVzaW5nIHRoaXMgc2Vzc2lvbiBhcyBhIHNlbmRlciAqLworICBpZiAoc2Vzc2lvbi0+c2VuZF9ydHBfc2luayAhPSBOVUxMKQorICAgIGdvdG8gZXhpc3Rpbmdfc2Vzc2lvbjsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJnZXR0aW5nIFJUUCBBVVggc2VuZGVyIik7CisgIGF1eCA9IHNlc3Npb25fcmVxdWVzdF9lbGVtZW50IChzZXNzaW9uLCBTSUdOQUxfUkVRVUVTVF9BVVhfU0VOREVSKTsKKyAgaWYgKGF1eCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImxpbmtpbmcgQVVYIHNlbmRlciIpOworICAgIGlmICghc2V0dXBfYXV4X3NlbmRlciAocnRwYmluLCBzZXNzaW9uLCBhdXgpKQorICAgICAgZ290byBhdXhfc2Vzc2lvbl9mYWlsZWQ7CisKKyAgICBwbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNpbmtfJXUiLCBzZXNzaWQpOworICAgIHNlbmRfcnRwX3NpbmsgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoYXV4LCBwbmFtZSk7CisgICAgZ19mcmVlIChwbmFtZSk7CisKKyAgICBpZiAoc2VuZF9ydHBfc2luayA9PSBOVUxMKQorICAgICAgZ290byBhdXhfc2lua19mYWlsZWQ7CisgIH0gZWxzZSB7CisgICAgLyogZ2V0IHNlbmRfcnRwIHBhZCBhbmQgc3RvcmUgKi8KKyAgICBzZXNzaW9uLT5zZW5kX3J0cF9zaW5rID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChzZXNzaW9uLT5zZXNzaW9uLCAic2VuZF9ydHBfc2luayIpOworICAgIGlmIChzZXNzaW9uLT5zZW5kX3J0cF9zaW5rID09IE5VTEwpCisgICAgICBnb3RvIHBhZF9mYWlsZWQ7CisKKyAgICBpZiAoIWNvbXBsZXRlX3Nlc3Npb25fc3JjIChydHBiaW4sIHNlc3Npb24pKQorICAgICAgZ290byBzZXNzaW9uX3NyY19mYWlsZWQ7CisKKyAgICBzZW5kX3J0cF9zaW5rID0gZ3N0X29iamVjdF9yZWYgKHNlc3Npb24tPnNlbmRfcnRwX3NpbmspOworICB9CisKKyAgc2Vzc2lvbi0+c2VuZF9ydHBfc2lua19naG9zdCA9CisgICAgICBnc3RfZ2hvc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChuYW1lLCBzZW5kX3J0cF9zaW5rLCB0ZW1wbCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNlbmRfcnRwX3NpbmspOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNlc3Npb24tPnNlbmRfcnRwX3NpbmtfZ2hvc3QsIFRSVUUpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBiaW4pLCBzZXNzaW9uLT5zZW5kX3J0cF9zaW5rX2dob3N0KTsKKworICByZXR1cm4gc2Vzc2lvbi0+c2VuZF9ydHBfc2lua19naG9zdDsKKworICAvKiBFUlJPUlMgKi8KK25vX25hbWU6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGludmFsaWQgbmFtZSBnaXZlbiIpOworICAgIHJldHVybiBOVUxMOworICB9CitjcmVhdGVfZXJyb3I6CisgIHsKKyAgICAvKiBjcmVhdGVfc2Vzc2lvbiBhbHJlYWR5IHdhcm5lZCAqLworICAgIHJldHVybiBOVUxMOworICB9CitleGlzdGluZ19zZXNzaW9uOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBzZXNzaW9uICV1IGlzIGFscmVhZHkgaW4gdXNlIiwgc2Vzc2lkKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorYXV4X3Nlc3Npb25fZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gZ2V0IEFVWCBzaW5rIHBhZCBmb3Igc2Vzc2lvbiAldSIsIHNlc3NpZCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2F1eF9zaW5rX2ZhaWxlZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogZmFpbGVkIHRvIGdldCBBVVggc2luayBwYWQgZm9yIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIHJldHVybiBOVUxMOworICB9CitwYWRfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gZ2V0IHNlc3Npb24gcGFkIGZvciBzZXNzaW9uICV1Iiwgc2Vzc2lkKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorc2Vzc2lvbl9zcmNfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gc2V0dXAgc291cmNlIHBhZHMgZm9yIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfc2VuZF9ydHAgKEdzdFJ0cEJpbiAqIHJ0cGJpbiwgR3N0UnRwQmluU2Vzc2lvbiAqIHNlc3Npb24pCit7CisgIGlmIChzZXNzaW9uLT5zZW5kX3J0cF9zcmNfZ2hvc3QpIHsKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKHNlc3Npb24tPnNlbmRfcnRwX3NyY19naG9zdCwgRkFMU0UpOworICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cGJpbiksCisgICAgICAgIHNlc3Npb24tPnNlbmRfcnRwX3NyY19naG9zdCk7CisgICAgc2Vzc2lvbi0+c2VuZF9ydHBfc3JjX2dob3N0ID0gTlVMTDsKKyAgfQorICBpZiAoc2Vzc2lvbi0+c2VuZF9ydHBfc3JjKSB7CisgICAgZ3N0X29iamVjdF91bnJlZiAoc2Vzc2lvbi0+c2VuZF9ydHBfc3JjKTsKKyAgICBzZXNzaW9uLT5zZW5kX3J0cF9zcmMgPSBOVUxMOworICB9CisgIGlmIChzZXNzaW9uLT5zZW5kX3J0cF9zaW5rKSB7CisgICAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoc2Vzc2lvbi0+c2Vzc2lvbiksCisgICAgICAgIHNlc3Npb24tPnNlbmRfcnRwX3NpbmspOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNlc3Npb24tPnNlbmRfcnRwX3NpbmspOworICAgIHNlc3Npb24tPnNlbmRfcnRwX3NpbmsgPSBOVUxMOworICB9CisgIGlmIChzZXNzaW9uLT5zZW5kX3J0cF9zaW5rX2dob3N0KSB7CisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzZXNzaW9uLT5zZW5kX3J0cF9zaW5rX2dob3N0LCBGQUxTRSk7CisgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwYmluKSwKKyAgICAgICAgc2Vzc2lvbi0+c2VuZF9ydHBfc2lua19naG9zdCk7CisgICAgc2Vzc2lvbi0+c2VuZF9ydHBfc2lua19naG9zdCA9IE5VTEw7CisgIH0KK30KKworLyogQ3JlYXRlIGEgcGFkIGZvciBzZW5kaW5nIFJUQ1AgZm9yIHRoZSBzZXNzaW9uIGluIEBuYW1lLiBNdXN0IGJlIGNhbGxlZCB3aXRoCisgKiBSVFBfQklOX0xPQ0suCisgKi8KK3N0YXRpYyBHc3RQYWQgKgorY3JlYXRlX3NlbmRfcnRjcCAoR3N0UnRwQmluICogcnRwYmluLCBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLAorICAgIGNvbnN0IGdjaGFyICogbmFtZSkKK3sKKyAgZ3VpbnQgc2Vzc2lkOworICBHc3RQYWQgKmVuY3NyYzsKKyAgR3N0RWxlbWVudCAqZW5jb2RlcjsKKyAgR3N0UnRwQmluU2Vzc2lvbiAqc2Vzc2lvbjsKKworICAvKiBmaXJzdCBnZXQgdGhlIHNlc3Npb24gbnVtYmVyICovCisgIGlmIChuYW1lID09IE5VTEwgfHwgc3NjYW5mIChuYW1lLCAic2VuZF9ydGNwX3NyY18ldSIsICZzZXNzaWQpICE9IDEpCisgICAgZ290byBub19uYW1lOworCisgIC8qIGdldCBvciBjcmVhdGUgc2Vzc2lvbiAqLworICBzZXNzaW9uID0gZmluZF9zZXNzaW9uX2J5X2lkIChydHBiaW4sIHNlc3NpZCk7CisgIGlmICghc2Vzc2lvbikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImNyZWF0aW5nIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIC8qIGNyZWF0ZSBzZXNzaW9uIG5vdyAqLworICAgIHNlc3Npb24gPSBjcmVhdGVfc2Vzc2lvbiAocnRwYmluLCBzZXNzaWQpOworICAgIGlmIChzZXNzaW9uID09IE5VTEwpCisgICAgICBnb3RvIGNyZWF0ZV9lcnJvcjsKKyAgfQorCisgIC8qIGNoZWNrIGlmIHBhZCB3YXMgcmVxdWVzdGVkICovCisgIGlmIChzZXNzaW9uLT5zZW5kX3J0Y3Bfc3JjX2dob3N0ICE9IE5VTEwpCisgICAgcmV0dXJuIHNlc3Npb24tPnNlbmRfcnRjcF9zcmNfZ2hvc3Q7CisKKyAgLyogZ2V0IHJ0Y3Bfc3JjIHBhZCBhbmQgc3RvcmUgKi8KKyAgc2Vzc2lvbi0+c2VuZF9ydGNwX3NyYyA9CisgICAgICBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHNlc3Npb24tPnNlc3Npb24sICJzZW5kX3J0Y3Bfc3JjIik7CisgIGlmIChzZXNzaW9uLT5zZW5kX3J0Y3Bfc3JjID09IE5VTEwpCisgICAgZ290byBwYWRfZmFpbGVkOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgImdldHRpbmcgUlRDUCBlbmNvZGVyIik7CisgIGVuY29kZXIgPSBzZXNzaW9uX3JlcXVlc3RfZWxlbWVudCAoc2Vzc2lvbiwgU0lHTkFMX1JFUVVFU1RfUlRDUF9FTkNPREVSKTsKKyAgaWYgKGVuY29kZXIpIHsKKyAgICBnY2hhciAqZW5hbWU7CisgICAgR3N0UGFkICplbmNzaW5rOworICAgIEdzdFBhZExpbmtSZXR1cm4gcmV0OworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwYmluLCAibGlua2luZyBSVENQIGVuY29kZXIiKTsKKworICAgIGVuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgicnRjcF9zcmNfJXUiLCBzZXNzaWQpOworICAgIGVuY3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChlbmNvZGVyLCBlbmFtZSk7CisgICAgZ19mcmVlIChlbmFtZSk7CisgICAgaWYgKGVuY3NyYyA9PSBOVUxMKQorICAgICAgZ290byBlbmNfc3JjX2ZhaWxlZDsKKworICAgIGVuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgicnRjcF9zaW5rXyV1Iiwgc2Vzc2lkKTsKKyAgICBlbmNzaW5rID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGVuY29kZXIsIGVuYW1lKTsKKyAgICBnX2ZyZWUgKGVuYW1lKTsKKyAgICBpZiAoZW5jc2luayA9PSBOVUxMKQorICAgICAgZ290byBlbmNfc2lua19mYWlsZWQ7CisKKyAgICByZXQgPSBnc3RfcGFkX2xpbmsgKHNlc3Npb24tPnNlbmRfcnRjcF9zcmMsIGVuY3NpbmspOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGVuY3NpbmspOworCisgICAgaWYgKHJldCAhPSBHU1RfUEFEX0xJTktfT0spCisgICAgICBnb3RvIGVuY19saW5rX2ZhaWxlZDsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBiaW4sICJubyBSVENQIGVuY29kZXIgZ2l2ZW4iKTsKKyAgICBlbmNzcmMgPSBnc3Rfb2JqZWN0X3JlZiAoc2Vzc2lvbi0+c2VuZF9ydGNwX3NyYyk7CisgIH0KKworICBzZXNzaW9uLT5zZW5kX3J0Y3Bfc3JjX2dob3N0ID0KKyAgICAgIGdzdF9naG9zdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKG5hbWUsIGVuY3NyYywgdGVtcGwpOworICBnc3Rfb2JqZWN0X3VucmVmIChlbmNzcmMpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNlc3Npb24tPnNlbmRfcnRjcF9zcmNfZ2hvc3QsIFRSVUUpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBiaW4pLCBzZXNzaW9uLT5zZW5kX3J0Y3Bfc3JjX2dob3N0KTsKKworICByZXR1cm4gc2Vzc2lvbi0+c2VuZF9ydGNwX3NyY19naG9zdDsKKworICAvKiBFUlJPUlMgKi8KK25vX25hbWU6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGludmFsaWQgbmFtZSBnaXZlbiIpOworICAgIHJldHVybiBOVUxMOworICB9CitjcmVhdGVfZXJyb3I6CisgIHsKKyAgICAvKiBjcmVhdGVfc2Vzc2lvbiBhbHJlYWR5IHdhcm5lZCAqLworICAgIHJldHVybiBOVUxMOworICB9CitwYWRfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gZ2V0IHJ0Y3AgcGFkIGZvciBzZXNzaW9uICV1Iiwgc2Vzc2lkKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorZW5jX3NyY19mYWlsZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IGZhaWxlZCB0byBnZXQgZW5jb2RlciBzcmMgcGFkIGZvciBzZXNzaW9uICV1Iiwgc2Vzc2lkKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorZW5jX3NpbmtfZmFpbGVkOgorICB7CisgICAgZ193YXJuaW5nICgicnRwYmluOiBmYWlsZWQgdG8gZ2V0IGVuY29kZXIgc2luayBwYWQgZm9yIHNlc3Npb24gJXUiLCBzZXNzaWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGVuY3NyYyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2VuY19saW5rX2ZhaWxlZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGJpbjogZmFpbGVkIHRvIGxpbmsgcnRjcCBlbmNvZGVyIGZvciBzZXNzaW9uICV1Iiwgc2Vzc2lkKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChlbmNzcmMpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfcnRjcCAoR3N0UnRwQmluICogcnRwYmluLCBHc3RSdHBCaW5TZXNzaW9uICogc2Vzc2lvbikKK3sKKyAgaWYgKHNlc3Npb24tPnNlbmRfcnRjcF9zcmNfZ2hvc3QpIHsKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKHNlc3Npb24tPnNlbmRfcnRjcF9zcmNfZ2hvc3QsIEZBTFNFKTsKKyAgICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBiaW4pLAorICAgICAgICBzZXNzaW9uLT5zZW5kX3J0Y3Bfc3JjX2dob3N0KTsKKyAgICBzZXNzaW9uLT5zZW5kX3J0Y3Bfc3JjX2dob3N0ID0gTlVMTDsKKyAgfQorICBpZiAoc2Vzc2lvbi0+c2VuZF9ydGNwX3NyYykgeworICAgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHNlc3Npb24tPnNlc3Npb24sIHNlc3Npb24tPnNlbmRfcnRjcF9zcmMpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNlc3Npb24tPnNlbmRfcnRjcF9zcmMpOworICAgIHNlc3Npb24tPnNlbmRfcnRjcF9zcmMgPSBOVUxMOworICB9Cit9CisKKy8qIElmIHRoZSByZXF1ZXN0ZWQgbmFtZSBpcyBOVUxMIHdlIHNob3VsZCBjcmVhdGUgYSBuYW1lIHdpdGgKKyAqIHRoZSBzZXNzaW9uIG51bWJlciBhc3N1bWluZyB3ZSB3YW50IHRoZSBsb3dlc3QgcG9zaWJsZSBzZXNzaW9uCisgKiB3aXRoIGEgZnJlZSBwYWQgbGlrZSB0aGUgdGVtcGxhdGUgKi8KK3N0YXRpYyBnY2hhciAqCitnc3RfcnRwX2Jpbl9nZXRfZnJlZV9wYWRfbmFtZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZFRlbXBsYXRlICogdGVtcGwpCit7CisgIGdib29sZWFuIG5hbWVfZm91bmQgPSBGQUxTRTsKKyAgZ2ludCBzZXNzaW9uID0gMDsKKyAgR3N0SXRlcmF0b3IgKnBhZF9pdCA9IE5VTEw7CisgIGdjaGFyICpwYWRfbmFtZSA9IE5VTEw7CisgIEdWYWx1ZSBkYXRhID0geyAwLCB9OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVsZW1lbnQsICJmaW5kIGEgZnJlZSBwYWQgbmFtZSBmb3IgdGVtcGxhdGUiKTsKKyAgd2hpbGUgKCFuYW1lX2ZvdW5kKSB7CisgICAgZ2Jvb2xlYW4gZG9uZSA9IEZBTFNFOworCisgICAgZ19mcmVlIChwYWRfbmFtZSk7CisgICAgcGFkX25hbWUgPSBnX3N0cmR1cF9wcmludGYgKHRlbXBsLT5uYW1lX3RlbXBsYXRlLCBzZXNzaW9uKyspOworICAgIHBhZF9pdCA9IGdzdF9lbGVtZW50X2l0ZXJhdGVfcGFkcyAoR1NUX0VMRU1FTlQgKGVsZW1lbnQpKTsKKyAgICBuYW1lX2ZvdW5kID0gVFJVRTsKKyAgICB3aGlsZSAoIWRvbmUpIHsKKyAgICAgIHN3aXRjaCAoZ3N0X2l0ZXJhdG9yX25leHQgKHBhZF9pdCwgJmRhdGEpKSB7CisgICAgICAgIGNhc2UgR1NUX0lURVJBVE9SX09LOgorICAgICAgICB7CisgICAgICAgICAgR3N0UGFkICpwYWQ7CisgICAgICAgICAgZ2NoYXIgKm5hbWU7CisKKyAgICAgICAgICBwYWQgPSBnX3ZhbHVlX2dldF9vYmplY3QgKCZkYXRhKTsKKyAgICAgICAgICBuYW1lID0gZ3N0X3BhZF9nZXRfbmFtZSAocGFkKTsKKworICAgICAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHBhZF9uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgICAgIG5hbWVfZm91bmQgPSBGQUxTRTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ19mcmVlIChuYW1lKTsKKyAgICAgICAgICBnX3ZhbHVlX3Jlc2V0ICgmZGF0YSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfRVJST1I6CisgICAgICAgIGNhc2UgR1NUX0lURVJBVE9SX1JFU1lOQzoKKyAgICAgICAgICAvKiByZXN0YXJ0IGl0ZXJhdGlvbiAqLworICAgICAgICAgIGRvbmUgPSBUUlVFOworICAgICAgICAgIG5hbWVfZm91bmQgPSBGQUxTRTsKKyAgICAgICAgICBzZXNzaW9uID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfRE9ORToKKyAgICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgZ192YWx1ZV91bnNldCAoJmRhdGEpOworICAgIGdzdF9pdGVyYXRvcl9mcmVlIChwYWRfaXQpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZWxlbWVudCwgImZyZWUgcGFkIG5hbWUgZm91bmQ6ICclcyciLCBwYWRfbmFtZSk7CisgIHJldHVybiBwYWRfbmFtZTsKK30KKworLyoKKyAqLworc3RhdGljIEdzdFBhZCAqCitnc3RfcnRwX2Jpbl9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFJ0cEJpbiAqcnRwYmluOworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzOworICBHc3RQYWQgKnJlc3VsdDsKKworICBnY2hhciAqcGFkX25hbWUgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICh0ZW1wbCAhPSBOVUxMLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19SVFBfQklOIChlbGVtZW50KSwgTlVMTCk7CisKKyAgcnRwYmluID0gR1NUX1JUUF9CSU4gKGVsZW1lbnQpOworICBrbGFzcyA9IEdTVF9FTEVNRU5UX0dFVF9DTEFTUyAoZWxlbWVudCk7CisKKyAgR1NUX1JUUF9CSU5fTE9DSyAocnRwYmluKTsKKworICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgLyogdXNlIGEgZnJlZSBwYWQgbmFtZSAqLworICAgIHBhZF9uYW1lID0gZ3N0X3J0cF9iaW5fZ2V0X2ZyZWVfcGFkX25hbWUgKGVsZW1lbnQsIHRlbXBsKTsKKyAgfSBlbHNlIHsKKyAgICAvKiB1c2UgdGhlIHByb3ZpZGVkIG5hbWUgKi8KKyAgICBwYWRfbmFtZSA9IGdfc3RyZHVwIChuYW1lKTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgIlRyeWluZyB0byByZXF1ZXN0IGEgcGFkIHdpdGggbmFtZSAlcyIsIHBhZF9uYW1lKTsKKworICAvKiBmaWd1cmUgb3V0IHRoZSB0ZW1wbGF0ZSAqLworICBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJyZWN2X3J0cF9zaW5rXyV1IikpIHsKKyAgICByZXN1bHQgPSBjcmVhdGVfcmVjdl9ydHAgKHJ0cGJpbiwgdGVtcGwsIHBhZF9uYW1lKTsKKyAgfSBlbHNlIGlmICh0ZW1wbCA9PSBnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywKKyAgICAgICAgICAicmVjdl9ydGNwX3NpbmtfJXUiKSkgeworICAgIHJlc3VsdCA9IGNyZWF0ZV9yZWN2X3J0Y3AgKHJ0cGJpbiwgdGVtcGwsIHBhZF9uYW1lKTsKKyAgfSBlbHNlIGlmICh0ZW1wbCA9PSBnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywKKyAgICAgICAgICAic2VuZF9ydHBfc2lua18ldSIpKSB7CisgICAgcmVzdWx0ID0gY3JlYXRlX3NlbmRfcnRwIChydHBiaW4sIHRlbXBsLCBwYWRfbmFtZSk7CisgIH0gZWxzZSBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsCisgICAgICAgICAgInNlbmRfcnRjcF9zcmNfJXUiKSkgeworICAgIHJlc3VsdCA9IGNyZWF0ZV9zZW5kX3J0Y3AgKHJ0cGJpbiwgdGVtcGwsIHBhZF9uYW1lKTsKKyAgfSBlbHNlCisgICAgZ290byB3cm9uZ190ZW1wbGF0ZTsKKworICBnX2ZyZWUgKHBhZF9uYW1lKTsKKyAgR1NUX1JUUF9CSU5fVU5MT0NLIChydHBiaW4pOworCisgIHJldHVybiByZXN1bHQ7CisKKyAgLyogRVJST1JTICovCit3cm9uZ190ZW1wbGF0ZToKKyAgeworICAgIGdfZnJlZSAocGFkX25hbWUpOworICAgIEdTVF9SVFBfQklOX1VOTE9DSyAocnRwYmluKTsKKyAgICBnX3dhcm5pbmcgKCJydHBiaW46IHRoaXMgaXMgbm90IG91ciB0ZW1wbGF0ZSIpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2Jpbl9yZWxlYXNlX3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIHBhZCkKK3sKKyAgR3N0UnRwQmluU2Vzc2lvbiAqc2Vzc2lvbjsKKyAgR3N0UnRwQmluICpydHBiaW47CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX0dIT1NUX1BBRCAocGFkKSk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19SVFBfQklOIChlbGVtZW50KSk7CisKKyAgcnRwYmluID0gR1NUX1JUUF9CSU4gKGVsZW1lbnQpOworCisgIEdTVF9SVFBfQklOX0xPQ0sgKHJ0cGJpbik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGJpbiwgIlRyeWluZyB0byByZWxlYXNlIHBhZCAlczolcyIsCisgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKHBhZCkpOworCisgIGlmICghKHNlc3Npb24gPSBmaW5kX3Nlc3Npb25fYnlfcGFkIChydHBiaW4sIHBhZCkpKQorICAgIGdvdG8gdW5rbm93bl9wYWQ7CisKKyAgaWYgKHNlc3Npb24tPnJlY3ZfcnRwX3NpbmtfZ2hvc3QgPT0gcGFkKSB7CisgICAgcmVtb3ZlX3JlY3ZfcnRwIChydHBiaW4sIHNlc3Npb24pOworICB9IGVsc2UgaWYgKHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rX2dob3N0ID09IHBhZCkgeworICAgIHJlbW92ZV9yZWN2X3J0Y3AgKHJ0cGJpbiwgc2Vzc2lvbik7CisgIH0gZWxzZSBpZiAoc2Vzc2lvbi0+c2VuZF9ydHBfc2lua19naG9zdCA9PSBwYWQpIHsKKyAgICByZW1vdmVfc2VuZF9ydHAgKHJ0cGJpbiwgc2Vzc2lvbik7CisgIH0gZWxzZSBpZiAoc2Vzc2lvbi0+c2VuZF9ydGNwX3NyY19naG9zdCA9PSBwYWQpIHsKKyAgICByZW1vdmVfcnRjcCAocnRwYmluLCBzZXNzaW9uKTsKKyAgfQorCisgIC8qIG5vIG1vcmUgcmVxdWVzdCBwYWRzLCBmcmVlIHRoZSBjb21wbGV0ZSBzZXNzaW9uICovCisgIGlmIChzZXNzaW9uLT5yZWN2X3J0cF9zaW5rX2dob3N0ID09IE5VTEwKKyAgICAgICYmIHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rX2dob3N0ID09IE5VTEwKKyAgICAgICYmIHNlc3Npb24tPnNlbmRfcnRwX3NpbmtfZ2hvc3QgPT0gTlVMTAorICAgICAgJiYgc2Vzc2lvbi0+c2VuZF9ydGNwX3NyY19naG9zdCA9PSBOVUxMKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwYmluLCAibm8gbW9yZSBwYWRzIGZvciBzZXNzaW9uICVwIiwgc2Vzc2lvbik7CisgICAgcnRwYmluLT5zZXNzaW9ucyA9IGdfc2xpc3RfcmVtb3ZlIChydHBiaW4tPnNlc3Npb25zLCBzZXNzaW9uKTsKKyAgICBmcmVlX3Nlc3Npb24gKHNlc3Npb24sIHJ0cGJpbik7CisgIH0KKyAgR1NUX1JUUF9CSU5fVU5MT0NLIChydHBiaW4pOworCisgIHJldHVybjsKKworICAvKiBFUlJPUiAqLwordW5rbm93bl9wYWQ6CisgIHsKKyAgICBHU1RfUlRQX0JJTl9VTkxPQ0sgKHJ0cGJpbik7CisgICAgZ193YXJuaW5nICgicnRwYmluOiAlczolcyBpcyBub3Qgb25lIG9mIG91ciByZXF1ZXN0IHBhZHMiLAorICAgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKHBhZCkpOworICAgIHJldHVybjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmggYi9nc3QvcnRwbWFuYWdlci9nc3RydHBiaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzIyYTIxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwYmluLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9CSU5fSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9CSU5fSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJydHBzZXNzaW9uLmgiCisjaW5jbHVkZSAiZ3N0cnRwc2Vzc2lvbi5oIgorI2luY2x1ZGUgInJ0cGppdHRlcmJ1ZmZlci5oIgorCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9CSU4gXAorICAoZ3N0X3J0cF9iaW5fZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9CSU4ob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfQklOLEdzdFJ0cEJpbikpCisjZGVmaW5lIEdTVF9SVFBfQklOX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9CSU4sR3N0UnRwQmluQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX0JJTihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9CSU4pKQorI2RlZmluZSBHU1RfSVNfUlRQX0JJTl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfQklOKSkKKwordHlwZWRlZiBlbnVtCit7CisgIEdTVF9SVFBfQklOX1JUQ1BfU1lOQ19BTFdBWVMsCisgIEdTVF9SVFBfQklOX1JUQ1BfU1lOQ19JTklUSUFMLAorICBHU1RfUlRQX0JJTl9SVENQX1NZTkNfUlRQCit9IEdzdFJUQ1BTeW5jOworCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwQmluIEdzdFJ0cEJpbjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBCaW5DbGFzcyBHc3RSdHBCaW5DbGFzczsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBCaW5Qcml2YXRlIEdzdFJ0cEJpblByaXZhdGU7CisKK3N0cnVjdCBfR3N0UnRwQmluIHsKKyAgR3N0QmluICAgICAgICAgYmluOworCisgIC8qPCBwcml2YXRlID4qLworICAvKiBkZWZhdWx0IGxhdGVuY3kgZm9yIHNlc3Npb25zICovCisgIGd1aW50ICAgICAgICAgICBsYXRlbmN5X21zOworICBndWludDY0ICAgICAgICAgbGF0ZW5jeV9uczsKKyAgZ2Jvb2xlYW4gICAgICAgIGRyb3Bfb25fbGF0ZW5jeTsKKyAgZ2Jvb2xlYW4gICAgICAgIGRvX2xvc3Q7CisgIGdib29sZWFuICAgICAgICBpZ25vcmVfcHQ7CisgIGdib29sZWFuICAgICAgICBudHBfc3luYzsKKyAgZ2ludCAgICAgICAgICAgIHJ0Y3Bfc3luYzsKKyAgZ3VpbnQgICAgICAgICAgIHJ0Y3Bfc3luY19pbnRlcnZhbDsKKyAgUlRQSml0dGVyQnVmZmVyTW9kZSBidWZmZXJfbW9kZTsKKyAgZ2Jvb2xlYW4gICAgICAgIGJ1ZmZlcmluZzsKKyAgZ2Jvb2xlYW4gICAgICAgIHVzZV9waXBlbGluZV9jbG9jazsKKyAgR3N0UnRwTnRwVGltZVNvdXJjZSBudHBfdGltZV9zb3VyY2U7CisgIGdib29sZWFuICAgICAgICBzZW5kX3N5bmNfZXZlbnQ7CisgIEdzdENsb2NrVGltZSAgICBidWZmZXJfc3RhcnQ7CisgIGdib29sZWFuICAgICAgICBkb19yZXRyYW5zbWlzc2lvbjsKKyAgR3N0UlRQUHJvZmlsZSAgIHJ0cF9wcm9maWxlOworICBnYm9vbGVhbiAgICAgICAgcnRjcF9zeW5jX3NlbmRfdGltZTsKKyAgZ2ludCAgICAgICAgICAgIG1heF9ydGNwX3J0cF90aW1lX2RpZmY7CisgIGd1aW50MzIgICAgICAgICBtYXhfZHJvcG91dF90aW1lOworICBndWludDMyICAgICAgICAgbWF4X21pc29yZGVyX3RpbWU7CisgIGdib29sZWFuICAgICAgICByZmM3MjczX3N5bmM7CisgIGd1aW50ICAgICAgICAgICBtYXhfc3RyZWFtczsKKyAgZ3VpbnQ2NCAgICAgICAgIG1heF90c19vZmZzZXRfYWRqdXN0bWVudDsKKyAgZ2ludDY0ICAgICAgICAgIG1heF90c19vZmZzZXQ7CisgIGdib29sZWFuICAgICAgICBtYXhfdHNfb2Zmc2V0X2lzX3NldDsKKworICAvKiBhIGxpc3Qgb2Ygc2Vzc2lvbiAqLworICBHU0xpc3QgICAgICAgICAqc2Vzc2lvbnM7CisKKyAgLyogYSBsaXN0IG9mIGNsaWVudHMsIHRoZXNlIGFyZSBzdHJlYW1zIHdpdGggdGhlIHNhbWUgQ05BTUUgKi8KKyAgR1NMaXN0ICAgICAgICAgKmNsaWVudHM7CisKKyAgLyogdGhlIGRlZmF1bHQgU0RFUyBpdGVtcyBmb3Igc2Vzc2lvbnMgKi8KKyAgR3N0U3RydWN0dXJlICAgKnNkZXM7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIEdzdFJ0cEJpblByaXZhdGUgKnByaXY7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cEJpbkNsYXNzIHsKKyAgR3N0QmluQ2xhc3MgIHBhcmVudF9jbGFzczsKKworICAvKiBnZXQgdGhlIGNhcHMgZm9yIHB0ICovCisgIEdzdENhcHMqICAgICgqcmVxdWVzdF9wdF9tYXApICAgICAgIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQgcHQpOworCisgIHZvaWQgICAgICAgICgqcGF5bG9hZF90eXBlX2NoYW5nZSkgIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQgcHQpOworCisgIHZvaWQgICAgICAgICgqbmV3X2ppdHRlcmJ1ZmZlcikgICAgIChHc3RSdHBCaW4gKnJ0cGJpbiwgR3N0RWxlbWVudCAqaml0dGVyYnVmZmVyLCBndWludCBzZXNzaW9uLCBndWludDMyIHNzcmMpOworCisgIC8qIGFjdGlvbiBzaWduYWxzICovCisgIHZvaWQgICAgICAgICgqY2xlYXJfcHRfbWFwKSAgICAgICAgIChHc3RSdHBCaW4gKnJ0cGJpbik7CisgIHZvaWQgICAgICAgICgqcmVzZXRfc3luYykgICAgICAgICAgIChHc3RSdHBCaW4gKnJ0cGJpbik7CisgIEdzdEVsZW1lbnQqICgqZ2V0X3Nlc3Npb24pICAgICAgICAgIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbik7CisgIFJUUFNlc3Npb24qICgqZ2V0X2ludGVybmFsX3Nlc3Npb24pIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbik7CisKKyAgLyogc2Vzc2lvbiBtYW5hZ2VyIHNpZ25hbHMgKi8KKyAgdm9pZCAgICAgKCpvbl9uZXdfc3NyYykgICAgICAgKEdzdFJ0cEJpbiAqcnRwYmluLCBndWludCBzZXNzaW9uLCBndWludDMyIHNzcmMpOworICB2b2lkICAgICAoKm9uX3NzcmNfY29sbGlzaW9uKSAoR3N0UnRwQmluICpydHBiaW4sIGd1aW50IHNlc3Npb24sIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fc3NyY192YWxpZGF0ZWQpIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjKTsKKyAgdm9pZCAgICAgKCpvbl9zc3JjX2FjdGl2ZSkgICAgKEdzdFJ0cEJpbiAqcnRwYmluLCBndWludCBzZXNzaW9uLCBndWludDMyIHNzcmMpOworICB2b2lkICAgICAoKm9uX3NzcmNfc2RlcykgICAgICAoR3N0UnRwQmluICpydHBiaW4sIGd1aW50IHNlc3Npb24sIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fYnllX3NzcmMpICAgICAgIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjKTsKKyAgdm9pZCAgICAgKCpvbl9ieWVfdGltZW91dCkgICAgKEdzdFJ0cEJpbiAqcnRwYmluLCBndWludCBzZXNzaW9uLCBndWludDMyIHNzcmMpOworICB2b2lkICAgICAoKm9uX3RpbWVvdXQpICAgICAgICAoR3N0UnRwQmluICpydHBiaW4sIGd1aW50IHNlc3Npb24sIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fc2VuZGVyX3RpbWVvdXQpIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjKTsKKyAgdm9pZCAgICAgKCpvbl9ucHRfc3RvcCkgICAgICAgKEdzdFJ0cEJpbiAqcnRwYmluLCBndWludCBzZXNzaW9uLCBndWludDMyIHNzcmMpOworCisgIEdzdEVsZW1lbnQqICgqcmVxdWVzdF9ydHBfZW5jb2RlcikgIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbik7CisgIEdzdEVsZW1lbnQqICgqcmVxdWVzdF9ydHBfZGVjb2RlcikgIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbik7CisgIEdzdEVsZW1lbnQqICgqcmVxdWVzdF9ydGNwX2VuY29kZXIpIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbik7CisgIEdzdEVsZW1lbnQqICgqcmVxdWVzdF9ydGNwX2RlY29kZXIpIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbik7CisKKyAgR3N0RWxlbWVudCogKCpyZXF1ZXN0X2F1eF9zZW5kZXIpICAgKEdzdFJ0cEJpbiAqcnRwYmluLCBndWludCBzZXNzaW9uKTsKKyAgR3N0RWxlbWVudCogKCpyZXF1ZXN0X2F1eF9yZWNlaXZlcikgKEdzdFJ0cEJpbiAqcnRwYmluLCBndWludCBzZXNzaW9uKTsKKworICB2b2lkICAgICAoKm9uX25ld19zZW5kZXJfc3NyYykgICAgICAoR3N0UnRwQmluICpydHBiaW4sIGd1aW50IHNlc3Npb24sIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fc2VuZGVyX3NzcmNfYWN0aXZlKSAgIChHc3RSdHBCaW4gKnJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjKTsKKworICBndWludCAgICAoKm9uX2J1bmRsZWRfc3NyYykgICAgICAgICAoR3N0UnRwQmluICpydHBiaW4sIGd1aW50IHNzcmMpOworfTsKKworR1R5cGUgZ3N0X3J0cF9iaW5fZ2V0X3R5cGUgKHZvaWQpOworCisjZW5kaWYgLyogX19HU1RfUlRQX0JJTl9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzZkNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5jCkBAIC0wLDAgKzEsMjMzIEBACisvKiBSVFAgRFRNRiBtdXhlciBlbGVtZW50IGZvciBHU3RyZWFtZXIKKyAqCisgKiBnc3RydHBkdG1mbXV4LmM6CisgKgorICogQ29weXJpZ2h0IChDKSA8MjAwNy0yMDEwPiBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqICAgQ29udGFjdDogWmVlc2hhbiBBbGkgPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDctMjAxMD4gQ29sbGFib3JhIEx0ZAorICogICBDb250YWN0OiBPbGl2aWVyIENyZXRlIDxvbGl2aWVyLmNyZXRlQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgIDIwMDAsMjAwNSBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cGR0bWZtdXgKKyAqIEBzZWVfYWxzbzogcnRwZHRtZnNyYywgZHRtZnNyYywgcnRwbXV4CisgKgorICogVGhlIFJUUCAiRFRNRiIgTXV4ZXIgbXV4ZXMgbXVsdGlwbGUgUlRQIHN0cmVhbXMgaW50byBhIHZhbGlkIFJUUAorICogc3RyZWFtLiBJdCBkb2VzIGV4YWN0bHkgd2hhdCBpdHMgcGFyZW50ICgjcnRwbXV4KSBkb2VzLCBleGNlcHQKKyAqIHRoYXQgaXQgcHJldmVudCBidWZmZXJzIGNvbWluZyBvdmVyIGEgcmVndWxhciBzaW5rX1wldSBwYWQgZnJvbSBnb2luZyB0aHJvdWdoCisgKiBmb3IgdGhlIGR1cmF0aW9uIG9mIGJ1ZmZlcnMgdGhhdCBjYW1lIGluIGEgcHJpb3JpdHlfc2lua19cJXUgcGFkLgorICoKKyAqIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaWYgYSBkaXNjb250aW51b3VzIHNvdXJjZSBsaWtlIGR0bWZzcmMgb3IKKyAqIHJ0cGR0bWZzcmMgYXJlIGNvbm5lY3RlZCB0byB0aGUgcHJpb3JpdHkgc2luayBwYWRzLiBUaGlzIHdheSwgdGhlIGdlbmVyYXRlZAorICogRFRNRiBzaWduYWwgY2FuIHJlcGxhY2UgdGhlIHJlY29yZGVkIGF1ZGlvIHdoaWxlIHRoZSB0b25lIGlzIGJlaW5nIHNlbnQuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0cnRwZHRtZm11eC5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfcnRwX2R0bWZfbXV4X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9ydHBfZHRtZl9tdXhfZGVidWcKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHByaW9yaXR5X3NpbmtfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInByaW9yaXR5X3NpbmtfJXUiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKSk7CisKK3N0YXRpYyBHc3RQYWQgKmdzdF9ydHBfZHRtZl9tdXhfcmVxdWVzdF9uZXdfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIG5hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX2R0bWZfbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX2R0bWZfbXV4X2FjY2VwdF9idWZmZXJfbG9ja2VkIChHc3RSVFBNdXggKiBydHBfbXV4LAorICAgIEdzdFJUUE11eFBhZFByaXZhdGUgKiBwYWRwcml2LCBHc3RSVFBCdWZmZXIgKiBydHBidWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfZHRtZl9tdXhfc3JjX2V2ZW50IChHc3RSVFBNdXggKiBydHBfbXV4LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitHX0RFRklORV9UWVBFIChHc3RSVFBEVE1GTXV4LCBnc3RfcnRwX2R0bWZfbXV4LCBHU1RfVFlQRV9SVFBfTVVYKTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZHRtZl9tdXhfaW5pdCAoR3N0UlRQRFRNRk11eCAqIG11eCkKK3sKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9kdG1mX211eF9jbGFzc19pbml0IChHc3RSVFBEVE1GTXV4Q2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RSVFBNdXhDbGFzcyAqZ3N0cnRwbXV4X2NsYXNzOworCisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RydHBtdXhfY2xhc3MgPSAoR3N0UlRQTXV4Q2xhc3MgKikga2xhc3M7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmcHJpb3JpdHlfc2lua19mYWN0b3J5KTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUlRQIG11eGVyIiwKKyAgICAgICJDb2RlYy9NdXhlciIsCisgICAgICAibWl4ZXMgUlRQIERUTUYgc3RyZWFtcyBpbnRvIG90aGVyIFJUUCBzdHJlYW1zIiwKKyAgICAgICJaZWVzaGFuIEFsaSA8Zmlyc3QubGFzdEBub2tpYS5jb20+Iik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVxdWVzdF9uZXdfcGFkID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2R0bWZfbXV4X3JlcXVlc3RfbmV3X3BhZCk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kdG1mX211eF9jaGFuZ2Vfc3RhdGUpOworICBnc3RydHBtdXhfY2xhc3MtPmFjY2VwdF9idWZmZXJfbG9ja2VkID0gZ3N0X3J0cF9kdG1mX211eF9hY2NlcHRfYnVmZmVyX2xvY2tlZDsKKyAgZ3N0cnRwbXV4X2NsYXNzLT5zcmNfZXZlbnQgPSBnc3RfcnRwX2R0bWZfbXV4X3NyY19ldmVudDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2R0bWZfbXV4X2FjY2VwdF9idWZmZXJfbG9ja2VkIChHc3RSVFBNdXggKiBydHBfbXV4LAorICAgIEdzdFJUUE11eFBhZFByaXZhdGUgKiBwYWRwcml2LCBHc3RSVFBCdWZmZXIgKiBydHBidWZmZXIpCit7CisgIEdzdFJUUERUTUZNdXggKm11eCA9IEdTVF9SVFBfRFRNRl9NVVggKHJ0cF9tdXgpOworICBHc3RDbG9ja1RpbWUgcnVubmluZ190czsKKworICBydW5uaW5nX3RzID0gR1NUX0JVRkZFUl9QVFMgKHJ0cGJ1ZmZlci0+YnVmZmVyKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHJ1bm5pbmdfdHMpKSB7CisgICAgaWYgKHBhZHByaXYgJiYgcGFkcHJpdi0+c2VnbWVudC5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9USU1FKQorICAgICAgcnVubmluZ190cyA9IGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJnBhZHByaXYtPnNlZ21lbnQsCisgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBHU1RfQlVGRkVSX1BUUyAocnRwYnVmZmVyLT5idWZmZXIpKTsKKworICAgIGlmIChwYWRwcml2ICYmIHBhZHByaXYtPnByaW9yaXR5KSB7CisgICAgICBpZiAoR1NUX0JVRkZFUl9QVFNfSVNfVkFMSUQgKHJ0cGJ1ZmZlci0+YnVmZmVyKSkgeworICAgICAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKG11eC0+bGFzdF9wcmlvcml0eV9lbmQpKQorICAgICAgICAgIG11eC0+bGFzdF9wcmlvcml0eV9lbmQgPQorICAgICAgICAgICAgICBNQVggKHJ1bm5pbmdfdHMgKyBHU1RfQlVGRkVSX0RVUkFUSU9OIChydHBidWZmZXItPmJ1ZmZlciksCisgICAgICAgICAgICAgIG11eC0+bGFzdF9wcmlvcml0eV9lbmQpOworICAgICAgICBlbHNlCisgICAgICAgICAgbXV4LT5sYXN0X3ByaW9yaXR5X2VuZCA9IHJ1bm5pbmdfdHMgKworICAgICAgICAgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChydHBidWZmZXItPmJ1ZmZlcik7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChtdXgsICJHb3QgYnVmZmVyICVwIG9uIHByaW9yaXR5IHBhZCwgIgorICAgICAgICAgICAgIiBibG9ja2luZyByZWd1bGFyIHBhZHMgdW50aWwgJSIgR1NUX1RJTUVfRk9STUFULCBydHBidWZmZXItPmJ1ZmZlciwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKG11eC0+bGFzdF9wcmlvcml0eV9lbmQpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobXV4LCAiQnVmZmVyICVwIGhhcyBhbiBpbnZhbGlkIGR1cmF0aW9uLCIKKyAgICAgICAgICAgICIgbm90IGJsb2NraW5nIG90aGVyIHBhZCIsIHJ0cGJ1ZmZlci0+YnVmZmVyKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChtdXgtPmxhc3RfcHJpb3JpdHlfZW5kKSAmJgorICAgICAgICAgIHJ1bm5pbmdfdHMgPCBtdXgtPmxhc3RfcHJpb3JpdHlfZW5kKSB7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChtdXgsICJEcm9wcGluZyBidWZmZXIgJXAgYmVjYXVzZSBydW5uaW5nIHRpbWUiCisgICAgICAgICAgICAiICUiIEdTVF9USU1FX0ZPUk1BVCAiIDwgJSIgR1NUX1RJTUVfRk9STUFULCBydHBidWZmZXItPmJ1ZmZlciwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHJ1bm5pbmdfdHMpLCBHU1RfVElNRV9BUkdTIChtdXgtPmxhc3RfcHJpb3JpdHlfZW5kKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKG11eCwgIkJ1ZmZlciAlcCBoYXMgYW4gaW52YWxpZCB0aW1lc3RhbXAsIgorICAgICAgICAiIGxldHRpbmcgdGhyb3VnaCIsIHJ0cGJ1ZmZlci0+YnVmZmVyKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBHc3RQYWQgKgorZ3N0X3J0cF9kdG1mX211eF9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLAorICAgIGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFBhZCAqcGFkOworCisgIHBhZCA9CisgICAgICBHU1RfRUxFTUVOVF9DTEFTUyAoZ3N0X3J0cF9kdG1mX211eF9wYXJlbnRfY2xhc3MpLT5yZXF1ZXN0X25ld19wYWQKKyAgICAgIChlbGVtZW50LCB0ZW1wbCwgbmFtZSwgY2Fwcyk7CisKKyAgaWYgKHBhZCkgeworICAgIEdzdFJUUE11eFBhZFByaXZhdGUgKnBhZHByaXY7CisKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKGVsZW1lbnQpOworICAgIHBhZHByaXYgPSBnc3RfcGFkX2dldF9lbGVtZW50X3ByaXZhdGUgKHBhZCk7CisKKyAgICBpZiAoZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChlbGVtZW50KSwKKyAgICAgICAgICAgICJwcmlvcml0eV9zaW5rXyV1IikgPT0gR1NUX1BBRF9QQURfVEVNUExBVEUgKHBhZCkpCisgICAgICBwYWRwcml2LT5wcmlvcml0eSA9IFRSVUU7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGVsZW1lbnQpOworICB9CisKKyAgcmV0dXJuIHBhZDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2R0bWZfbXV4X3NyY19ldmVudCAoR3N0UlRQTXV4ICogcnRwX211eCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSkgeworICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCk7CisKKyAgICBpZiAocyAmJiBnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiZHRtZi1ldmVudCIpKSB7CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHJ0cF9tdXgpOworICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChydHBfbXV4LT5sYXN0X3N0b3ApKSB7CisgICAgICAgIGV2ZW50ID0gKEdzdEV2ZW50ICopCisgICAgICAgICAgICBnc3RfbWluaV9vYmplY3RfbWFrZV93cml0YWJsZSAoR1NUX01JTklfT0JKRUNUX0NBU1QgKGV2ZW50KSk7CisgICAgICAgIHMgPSBnc3RfZXZlbnRfZ2V0X3N0cnVjdHVyZSAoZXZlbnQpOworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoKEdzdFN0cnVjdHVyZSAqKSBzLAorICAgICAgICAgICAgImxhc3Qtc3RvcCIsIEdfVFlQRV9VSU5UNjQsIHJ0cF9tdXgtPmxhc3Rfc3RvcCwgTlVMTCk7CisgICAgICB9CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwX211eCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEdTVF9SVFBfTVVYX0NMQVNTIChnc3RfcnRwX2R0bWZfbXV4X3BhcmVudF9jbGFzcyktPnNyY19ldmVudCAocnRwX211eCwKKyAgICAgIGV2ZW50KTsKK30KKworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfZHRtZl9tdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RSVFBEVE1GTXV4ICptdXggPSBHU1RfUlRQX0RUTUZfTVVYIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgIHsKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAobXV4KTsKKyAgICAgIG11eC0+bGFzdF9wcmlvcml0eV9lbmQgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKG11eCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0KKyAgICAgIEdTVF9FTEVNRU5UX0NMQVNTIChnc3RfcnRwX2R0bWZfbXV4X3BhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwKKyAgICAgIHRyYW5zaXRpb24pOworCisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX2R0bWZfbXV4X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfcnRwX2R0bWZfbXV4X2RlYnVnLCAicnRwZHRtZm11eCIsIDAsCisgICAgICAicnRwIGR0bWYgbXV4ZXIiKTsKKworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGR0bWZtdXgiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfUlRQX0RUTUZfTVVYKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguaCBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cGR0bWZtdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTFlOWVjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwZHRtZm11eC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIFJUUCBtdXhlciBlbGVtZW50IGZvciBHU3RyZWFtZXIKKyAqCisgKiBnc3RydHBkdG1mbXV4Lmg6CisgKgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gTm9raWEgQ29ycG9yYXRpb24uCisgKiAgIENvbnRhY3Q6IFplZXNoYW4gQWxpIDx6ZWVzaGFuLmFsaUBub2tpYS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICAyMDAwLDIwMDUgV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9EVE1GX01VWF9IX18KKyNkZWZpbmUgX19HU1RfUlRQX0RUTUZfTVVYX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgImdzdHJ0cG11eC5oIgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9EVE1GX01VWCAoZ3N0X3J0cF9kdG1mX211eF9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfUlRQX0RUTUZfTVVYKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9EVE1GX01VWCwgR3N0UlRQRFRNRk11eCkpCisjZGVmaW5lIEdTVF9SVFBfRFRNRl9NVVhfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9EVE1GX01VWCwgR3N0UlRQRFRNRk11eCkpCisjZGVmaW5lIEdTVF9JU19SVFBfRFRNRl9NVVgob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0RUTUZfTVVYKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9EVE1GX01VWF9DTEFTUyhvYmopIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9EVE1GX01VWCkpCit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQRFRNRk11eCBHc3RSVFBEVE1GTXV4OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUERUTUZNdXhDbGFzcyBHc3RSVFBEVE1GTXV4Q2xhc3M7CisKKy8qKgorICogR3N0UlRQRFRNRk11eDoKKyAqCisgKiBUaGUgb3BhcXVlICNHc3RSVFBEVE1GTXV4IHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RSVFBEVE1GTXV4Cit7CisgIEdzdFJUUE11eCBtdXg7CisKKyAgLyogUHJvdGVjdGVkIGJ5IG9iamVjdCBsb2NrICovCisgIEdzdENsb2NrVGltZSBsYXN0X3ByaW9yaXR5X2VuZDsKK307CisKK3N0cnVjdCBfR3N0UlRQRFRNRk11eENsYXNzCit7CisgIEdzdFJUUE11eENsYXNzIHBhcmVudF9jbGFzczsKKworICAvKiBzaWduYWxzICovCisgIHZvaWQgKCpsb2NraW5nKSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIHBhZCk7CisgIHZvaWQgKCp1bmxvY2tlZCkgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWQgKiBwYWQpOworfTsKKworR1R5cGUgZ3N0X3J0cF9kdG1mX211eF9nZXRfdHlwZSAodm9pZCk7CitnYm9vbGVhbiBnc3RfcnRwX2R0bWZfbXV4X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1JUUF9EVE1GX01VWF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUyYzg4NwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5jCkBAIC0wLDAgKzEsNDg2MiBAQAorLyoKKyAqIEZhcnNpZ2h0IFZvaWNlK1ZpZGVvIGxpYnJhcnkKKyAqCisgKiAgQ29weXJpZ2h0IDIwMDcgQ29sbGFib3JhIEx0ZCwKKyAqICBDb3B5cmlnaHQgMjAwNyBOb2tpYSBDb3Jwb3JhdGlvbgorICogICBAYXV0aG9yOiBQaGlsaXBwZSBLYWxhZiA8cGhpbGlwcGUua2FsYWZAY29sbGFib3JhLmNvLnVrPi4KKyAqICBDb3B5cmlnaHQgMjAwNyBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICogIENvcHlyaWdodCAyMDE1IEt1cmVudG8gKGh0dHA6Ly9rdXJlbnRvLm9yZy8pCisgKiAgIEBhdXRob3I6IE1pZ3VlbCBQYXLDrXMgPG1wYXJpc2RpYXpAZ21haWwuY29tPgorICogIENvcHlyaWdodCAyMDE2IFBleGlwIEFTCisgKiAgIEBhdXRob3I6IEhhdmFyZCBHcmFmZiA8aGF2YXJkQHBleGlwLmNvbT4KKyAqICAgQGF1dGhvcjogU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cGppdHRlcmJ1ZmZlcgorICoKKyAqIFRoaXMgZWxlbWVudCByZW9yZGVycyBhbmQgcmVtb3ZlcyBkdXBsaWNhdGUgUlRQIHBhY2tldHMgYXMgdGhleSBhcmUgcmVjZWl2ZWQKKyAqIGZyb20gYSBuZXR3b3JrIHNvdXJjZS4KKyAqCisgKiBUaGUgZWxlbWVudCBuZWVkcyB0aGUgY2xvY2stcmF0ZSBvZiB0aGUgUlRQIHBheWxvYWQgaW4gb3JkZXIgdG8gZXN0aW1hdGUgdGhlCisgKiBkZWxheS4gVGhpcyBpbmZvcm1hdGlvbiBpcyBvYnRhaW5lZCBlaXRoZXIgZnJvbSB0aGUgY2FwcyBvbiB0aGUgc2luayBwYWQgb3IsCisgKiB3aGVuIG5vIGNhcHMgYXJlIHByZXNlbnQsIGZyb20gdGhlICNHc3RSdHBKaXR0ZXJCdWZmZXI6OnJlcXVlc3QtcHQtbWFwIHNpZ25hbC4KKyAqIFRvIGNsZWFyIHRoZSBwcmV2aW91cyBwdC1tYXAgdXNlIHRoZSAjR3N0UnRwSml0dGVyQnVmZmVyOjpjbGVhci1wdC1tYXAgc2lnbmFsLgorICoKKyAqIFRoZSBydHBqaXR0ZXJidWZmZXIgd2lsbCB3YWl0IGZvciBtaXNzaW5nIHBhY2tldHMgdXAgdG8gYSBjb25maWd1cmFibGUgdGltZQorICogbGltaXQgdXNpbmcgdGhlICNHc3RSdHBKaXR0ZXJCdWZmZXI6bGF0ZW5jeSBwcm9wZXJ0eS4gUGFja2V0cyBhcnJpdmluZyB0b28KKyAqIGxhdGUgYXJlIGNvbnNpZGVyZWQgdG8gYmUgbG9zdCBwYWNrZXRzLiBJZiB0aGUgI0dzdFJ0cEppdHRlckJ1ZmZlcjpkby1sb3N0CisgKiBwcm9wZXJ0eSBpcyBzZXQsIGxvc3QgcGFja2V0cyB3aWxsIHJlc3VsdCBpbiBhIGN1c3RvbSBzZXJpYWxpemVkIGRvd25zdHJlYW0KKyAqIGV2ZW50IG9mIG5hbWUgR3N0UlRQUGFja2V0TG9zdC4gVGhlIGxvc3QgcGFja2V0IGV2ZW50cyBhcmUgdXN1YWxseSB1c2VkIGJ5IGEKKyAqIGRlcGF5bG9hZGVyIG9yIG90aGVyIGVsZW1lbnQgdG8gY3JlYXRlIGNvbmNlYWxtZW50IGRhdGEgb3Igc29tZSBvdGhlciBsb2dpYworICogdG8gZ3JhY2VmdWxseSBoYW5kbGUgdGhlIG1pc3NpbmcgcGFja2V0cy4KKyAqCisgKiBUaGUgaml0dGVyYnVmZmVyIHdpbGwgdXNlIHRoZSBEVFMgKG9yIFBUUyBpZiBubyBEVFMgaXMgc2V0KSBvZiB0aGUgaW5jb21taW5nCisgKiBidWZmZXIgYW5kIHRoZSBydHB0aW1lIGluc2lkZSB0aGUgUlRQIHBhY2tldCB0byBjcmVhdGUgYSBQVFMgb24gdGhlIG91dGdvaW5nCisgKiBidWZmZXIuCisgKgorICogVGhlIGppdHRlcmJ1ZmZlciBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHRvIHNlbmQgZWFybHkgcmV0cmFuc21pc3Npb24gZXZlbnRzCisgKiB1cHN0cmVhbSBieSBzZXR0aW5nIHRoZSAjR3N0UnRwSml0dGVyQnVmZmVyOmRvLXJldHJhbnNtaXNzaW9uIHByb3BlcnR5LiBJbgorICogdGhpcyBtb2RlLCB0aGUgaml0dGVyYnVmZmVyIHRyaWVzIHRvIGVzdGltYXRlIHdoZW4gYSBwYWNrZXQgc2hvdWxkIGFycml2ZSBhbmQKKyAqIHNlbmRzIGEgY3VzdG9tIHVwc3RyZWFtIGV2ZW50IG5hbWVkIEdzdFJUUFJldHJhbnNtaXNzaW9uUmVxdWVzdCB3aGVuIHRoZQorICogcGFja2V0IGlzIGNvbnNpZGVyZWQgbGF0ZS4gVGhlIGluaXRpYWwgZXhwZWN0ZWQgcGFja2V0IGFycml2YWwgdGltZSBpcworICogY2FsY3VsYXRlZCBhcyBmb2xsb3dzOgorICoKKyAqIC0gSWYgc2VxbnVtIE4gYXJyaXZlZCBhdCB0aW1lIFQsIHNlcW51bSBOKzEgaXMgZXhwZWN0ZWQgdG8gYXJyaXZlIGF0CisgKiAgICAgVCArIHBhY2tldC1zcGFjaW5nICsgI0dzdFJ0cEppdHRlckJ1ZmZlcjpydHgtZGVsYXkuIFRoZSBwYWNrZXQgc3BhY2luZyBpcworICogICAgIGNhbGN1bGF0ZWQgZnJvbSB0aGUgRFRTIChvciBQVFMgaXMgbm8gRFRTKSBvZiB0d28gY29uc2VjdXRpdmUgUlRQCisgKiAgICAgcGFja2V0cyB3aXRoIGRpZmZlcmVudCBydHB0aW1lLgorICoKKyAqIC0gSWYgc2VxbnVtIE4wIGFycml2ZWQgYXQgdGltZSBUMCBhbmQgc2VxbnVtIE5tIGFycml2ZWQgYXQgdGltZSBUbSwKKyAqICAgICBzZXFudW0gTmkgaXMgZXhwZWN0ZWQgYXQgdGltZSBUaSA9IFQwICsgaSooVG0gLSBUMCkvKE5tIC0gTjApLiBBbnkKKyAqICAgICBwcmV2aW91c2x5IHNjaGVkdWxlZCB0aW1lb3V0IGlzIG92ZXJ3cml0dGVuLgorICoKKyAqIC0gSWYgc2VxbnVtIE4gYXJyaXZlZCwgYWxsIHNlcW51bSBvbGRlciB0aGFuCisgKiAgICAgTiAtICNHc3RSdHBKaXR0ZXJCdWZmZXI6cnR4LWRlbGF5LXJlb3JkZXIgYXJlIGNvbnNpZGVyZWQgbGF0ZQorICogICAgIGltbWVkaWF0ZWx5LiBUaGlzIGlzIHRvIHJlcXVlc3QgZmFzdCBmZWVkYmFjayBmb3IgYWJvbm9ybWFsbHkgcmVvcmRlcgorICogICAgIHBhY2tldHMgYmVmb3JlIGFueSBvZiB0aGUgcHJldmlvdXMgdGltZW91dHMgaXMgdHJpZ2dlcmVkLgorICoKKyAqIEEgbGF0ZSBwYWNrZXQgdHJpZ2dlcnMgdGhlIEdzdFJUUFJldHJhbnNtaXNzaW9uUmVxdWVzdCBjdXN0b20gdXBzdHJlYW0KKyAqIGV2ZW50LiBBZnRlciB0aGUgaW5pdGlhbCB0aW1lb3V0IGV4cGlyZXMgYW5kIHRoZSByZXRyYW5zbWlzc2lvbiBldmVudCBpcworICogc2VudCwgdGhlIHRpbWVvdXQgaXMgc2NoZWR1bGVkIGZvcgorICogVCArICNHc3RSdHBKaXR0ZXJCdWZmZXI6cnR4LXJldHJ5LXRpbWVvdXQuIElmIHRoZSBtaXNzaW5nIHBhY2tldCBkaWQgbm90CisgKiBhcnJpdmUgYWZ0ZXIgI0dzdFJ0cEppdHRlckJ1ZmZlcjpydHgtcmV0cnktdGltZW91dCwgYSBuZXcKKyAqIEdzdFJUUFJldHJhbnNtaXNzaW9uUmVxdWVzdCBpcyBzZW50IHVwc3RyZWFtIGFuZCB0aGUgdGltZW91dCBpcyByZXNjaGVkdWxlZAorICogYWdhaW4gZm9yIFQgKyAjR3N0UnRwSml0dGVyQnVmZmVyOnJ0eC1yZXRyeS10aW1lb3V0LiBUaGlzIHJlcGVhdHMgdW50aWwKKyAqICNHc3RSdHBKaXR0ZXJCdWZmZXI6cnR4LXJldHJ5LXBlcmlvZCBlbGFwc2VkLCBhdCB3aGljaCBwb2ludCBubyBmdXJ0aGVyCisgKiByZXRyYW5zbWlzc2lvbiByZXF1ZXN0cyBhcmUgc2VudCBhbmQgdGhlIHJlZ3VsYXIgbG9naWMgaXMgcGVyZm9ybWVkIHRvCisgKiBzY2hlZHVsZSBhIGxvc3QgcGFja2V0IGFzIGRpc2N1c3NlZCBhYm92ZS4KKyAqCisgKiBUaGlzIGVsZW1lbnQgYWN0cyBhcyBhIGxpdmUgZWxlbWVudCBhbmQgc28gYWRkcyAjR3N0UnRwSml0dGVyQnVmZmVyOmxhdGVuY3kKKyAqIHRvIHRoZSBwaXBlbGluZS4KKyAqCisgKiBUaGlzIGVsZW1lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHVzZWQgaW5zaWRlIHJ0cGJpbi4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHJ0c3BzcmMgbG9jYXRpb249cnRzcDovLzE5Mi4xNjguMS4xMzM6ODU1NC9tcGVnMW9yMkF1ZGlvVmlkZW9UZXN0ICEgcnRwaml0dGVyYnVmZmVyICEgcnRwbXB2ZGVwYXkgISBtcGVnMmRlYyAhIHh2aW1hZ2VzaW5rCisgKiBdfCBDb25uZWN0IHRvIGEgc3RyZWFtaW5nIHNlcnZlciBhbmQgZGVjb2RlIHRoZSBNUEVHIHZpZGVvLiBUaGUgaml0dGVyYnVmZmVyIGlzCisgKiBpbnNlcnRlZCBpbnRvIHRoZSBwaXBlbGluZSB0byBzbW9vdGggb3V0IG5ldHdvcmsgaml0dGVyIGFuZCB0byByZW9yZGVyIHRoZQorICogb3V0LW9mLW9yZGVyIFJUUCBwYWNrZXRzLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L25ldC9uZXQuaD4KKworI2luY2x1ZGUgImdzdHJ0cGppdHRlcmJ1ZmZlci5oIgorI2luY2x1ZGUgInJ0cGppdHRlcmJ1ZmZlci5oIgorI2luY2x1ZGUgInJ0cHN0YXRzLmgiCisKKyNpbmNsdWRlIDxnc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oPgorCitHU1RfREVCVUdfQ0FURUdPUlkgKHJ0cGppdHRlcmJ1ZmZlcl9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRwaml0dGVyYnVmZmVyX2RlYnVnKQorCisvKiBSVFBKaXR0ZXJCdWZmZXIgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICBTSUdOQUxfUkVRVUVTVF9QVF9NQVAsCisgIFNJR05BTF9DTEVBUl9QVF9NQVAsCisgIFNJR05BTF9IQU5ETEVfU1lOQywKKyAgU0lHTkFMX09OX05QVF9TVE9QLAorICBTSUdOQUxfU0VUX0FDVElWRSwKKyAgTEFTVF9TSUdOQUwKK307CisKKyNkZWZpbmUgREVGQVVMVF9MQVRFTkNZX01TICAgICAgICAgIDIwMAorI2RlZmluZSBERUZBVUxUX0RST1BfT05fTEFURU5DWSAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9UU19PRkZTRVQgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfVFNfT0ZGU0VUX0FESlVTVE1FTlQgMAorI2RlZmluZSBERUZBVUxUX0RPX0xPU1QgICAgICAgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9NT0RFICAgICAgICAgICAgICAgIFJUUF9KSVRURVJfQlVGRkVSX01PREVfU0xBVkUKKyNkZWZpbmUgREVGQVVMVF9QRVJDRU5UICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9ET19SRVRSQU5TTUlTU0lPTiAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfUlRYX05FWFRfU0VRTlVNICAgICBUUlVFCisjZGVmaW5lIERFRkFVTFRfUlRYX0RFTEFZICAgICAgICAgICAtMQorI2RlZmluZSBERUZBVUxUX1JUWF9NSU5fREVMQVkgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1JUWF9ERUxBWV9SRU9SREVSICAgMworI2RlZmluZSBERUZBVUxUX1JUWF9SRVRSWV9USU1FT1VUICAgLTEKKyNkZWZpbmUgREVGQVVMVF9SVFhfTUlOX1JFVFJZX1RJTUVPVVQgICAtMQorI2RlZmluZSBERUZBVUxUX1JUWF9SRVRSWV9QRVJJT0QgICAgLTEKKyNkZWZpbmUgREVGQVVMVF9SVFhfTUFYX1JFVFJJRVMgICAgLTEKKyNkZWZpbmUgREVGQVVMVF9SVFhfREVBRExJTkUgICAgICAgLTEKKyNkZWZpbmUgREVGQVVMVF9SVFhfU1RBVFNfVElNRU9VVCAgIDEwMDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGIDEwMDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfRFJPUE9VVF9USU1FICAgIDYwMDAwCisjZGVmaW5lIERFRkFVTFRfTUFYX01JU09SREVSX1RJTUUgICAyMDAwCisjZGVmaW5lIERFRkFVTFRfUkZDNzI3M19TWU5DICAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX0ZBU1RTVEFSVF9NSU5fUEFDS0VUUyAwCisKKyNkZWZpbmUgREVGQVVMVF9BVVRPX1JUWF9ERUxBWSAoMjAgKiBHU1RfTVNFQ09ORCkKKyNkZWZpbmUgREVGQVVMVF9BVVRPX1JUWF9USU1FT1VUICg0MCAqIEdTVF9NU0VDT05EKQorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MQVRFTkNZLAorICBQUk9QX0RST1BfT05fTEFURU5DWSwKKyAgUFJPUF9UU19PRkZTRVQsCisgIFBST1BfTUFYX1RTX09GRlNFVF9BREpVU1RNRU5ULAorICBQUk9QX0RPX0xPU1QsCisgIFBST1BfTU9ERSwKKyAgUFJPUF9QRVJDRU5ULAorICBQUk9QX0RPX1JFVFJBTlNNSVNTSU9OLAorICBQUk9QX1JUWF9ORVhUX1NFUU5VTSwKKyAgUFJPUF9SVFhfREVMQVksCisgIFBST1BfUlRYX01JTl9ERUxBWSwKKyAgUFJPUF9SVFhfREVMQVlfUkVPUkRFUiwKKyAgUFJPUF9SVFhfUkVUUllfVElNRU9VVCwKKyAgUFJPUF9SVFhfTUlOX1JFVFJZX1RJTUVPVVQsCisgIFBST1BfUlRYX1JFVFJZX1BFUklPRCwKKyAgUFJPUF9SVFhfTUFYX1JFVFJJRVMsCisgIFBST1BfUlRYX0RFQURMSU5FLAorICBQUk9QX1JUWF9TVEFUU19USU1FT1VULAorICBQUk9QX1NUQVRTLAorICBQUk9QX01BWF9SVENQX1JUUF9USU1FX0RJRkYsCisgIFBST1BfTUFYX0RST1BPVVRfVElNRSwKKyAgUFJPUF9NQVhfTUlTT1JERVJfVElNRSwKKyAgUFJPUF9SRkM3MjczX1NZTkMsCisgIFBST1BfRkFTVFNUQVJUX01JTl9QQUNLRVRTCit9OworCisjZGVmaW5lIEpCVUZfTE9DSyhwcml2KSAgIEdfU1RNVF9TVEFSVCB7CQkJXAorICAgIEdTVF9UUkFDRSgiTG9ja2luZyBmcm9tIHRocmVhZCAlcCIsIGdfdGhyZWFkX3NlbGYoKSk7CVwKKyAgICAoZ19tdXRleF9sb2NrICgmKHByaXYpLT5qYnVmX2xvY2spKTsJCQlcCisgICAgR1NUX1RSQUNFKCJMb2NrZWQgZnJvbSB0aHJlYWQgJXAiLCBnX3RocmVhZF9zZWxmKCkpOwlcCisgIH0gR19TVE1UX0VORAorCisjZGVmaW5lIEpCVUZfTE9DS19DSEVDSyhwcml2LGxhYmVsKSBHX1NUTVRfU1RBUlQgeyAgICBcCisgIEpCVUZfTE9DSyAocHJpdik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChHX1VOTElLRUxZIChwcml2LT5zcmNyZXN1bHQgIT0gR1NUX0ZMT1dfT0spKSAgICBcCisgICAgZ290byBsYWJlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IEdfU1RNVF9FTkQKKyNkZWZpbmUgSkJVRl9VTkxPQ0socHJpdikgR19TVE1UX1NUQVJUIHsJCQlcCisgICAgR1NUX1RSQUNFICgiVW5sb2NraW5nIGZyb20gdGhyZWFkICVwIiwgZ190aHJlYWRfc2VsZiAoKSk7CVwKKyAgICAoZ19tdXRleF91bmxvY2sgKCYocHJpdiktPmpidWZfbG9jaykpOwkJCVwKK30gR19TVE1UX0VORAorCisjZGVmaW5lIEpCVUZfV0FJVF9USU1FUihwcml2KSAgIEdfU1RNVF9TVEFSVCB7ICAgICAgICAgICAgXAorICBHU1RfREVCVUcgKCJ3YWl0aW5nIHRpbWVyIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHByaXYpLT53YWl0aW5nX3RpbWVyID0gVFJVRTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdfY29uZF93YWl0ICgmKHByaXYpLT5qYnVmX3RpbWVyLCAmKHByaXYpLT5qYnVmX2xvY2spOyAgXAorICAocHJpdiktPndhaXRpbmdfdGltZXIgPSBGQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR1NUX0RFQlVHICgid2FpdGluZyB0aW1lciBkb25lIik7ICAgICAgICAgICAgICAgICAgICAgICBcCit9IEdfU1RNVF9FTkQKKyNkZWZpbmUgSkJVRl9TSUdOQUxfVElNRVIocHJpdikgR19TVE1UX1NUQVJUIHsgICAgICAgICAgICBcCisgIGlmIChHX1VOTElLRUxZICgocHJpdiktPndhaXRpbmdfdGltZXIpKSB7ICAgICAgICAgICAgICAgXAorICAgIEdTVF9ERUJVRyAoInNpZ25hbCB0aW1lciIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnX2NvbmRfc2lnbmFsICgmKHByaXYpLT5qYnVmX3RpbWVyKTsgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSBHX1NUTVRfRU5ECisKKyNkZWZpbmUgSkJVRl9XQUlUX0VWRU5UKHByaXYsbGFiZWwpIEdfU1RNVF9TVEFSVCB7ICAgICAgIFwKKyAgR1NUX0RFQlVHICgid2FpdGluZyBldmVudCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHByaXYpLT53YWl0aW5nX2V2ZW50ID0gVFJVRTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ19jb25kX3dhaXQgKCYocHJpdiktPmpidWZfZXZlbnQsICYocHJpdiktPmpidWZfbG9jayk7IFwKKyAgKHByaXYpLT53YWl0aW5nX2V2ZW50ID0gRkFMU0U7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR1NUX0RFQlVHICgid2FpdGluZyBldmVudCBkb25lIik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKEdfVU5MSUtFTFkgKHByaXYtPnNyY3Jlc3VsdCAhPSBHU1RfRkxPV19PSykpICAgICAgIFwKKyAgICBnb3RvIGxhYmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gR19TVE1UX0VORAorI2RlZmluZSBKQlVGX1NJR05BTF9FVkVOVChwcml2KSBHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgXAorICBpZiAoR19VTkxJS0VMWSAoKHByaXYpLT53YWl0aW5nX2V2ZW50KSkgeyAgICAgICAgICAgICAgXAorICAgIEdTVF9ERUJVRyAoInNpZ25hbCBldmVudCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdfY29uZF9zaWduYWwgKCYocHJpdiktPmpidWZfZXZlbnQpOyAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSBHX1NUTVRfRU5ECisKKyNkZWZpbmUgSkJVRl9XQUlUX1FVRVJZKHByaXYsbGFiZWwpIEdfU1RNVF9TVEFSVCB7ICAgICAgIFwKKyAgR1NUX0RFQlVHICgid2FpdGluZyBxdWVyeSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHByaXYpLT53YWl0aW5nX3F1ZXJ5ID0gVFJVRTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ19jb25kX3dhaXQgKCYocHJpdiktPmpidWZfcXVlcnksICYocHJpdiktPmpidWZfbG9jayk7IFwKKyAgKHByaXYpLT53YWl0aW5nX3F1ZXJ5ID0gRkFMU0U7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR1NUX0RFQlVHICgid2FpdGluZyBxdWVyeSBkb25lIik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKEdfVU5MSUtFTFkgKHByaXYtPnNyY3Jlc3VsdCAhPSBHU1RfRkxPV19PSykpICAgICAgIFwKKyAgICBnb3RvIGxhYmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gR19TVE1UX0VORAorI2RlZmluZSBKQlVGX1NJR05BTF9RVUVSWShwcml2LHJlcykgR19TVE1UX1NUQVJUIHsgICAgICAgXAorICAocHJpdiktPmxhc3RfcXVlcnkgPSByZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoR19VTkxJS0VMWSAoKHByaXYpLT53YWl0aW5nX3F1ZXJ5KSkgeyAgICAgICAgICAgICAgXAorICAgIEdTVF9ERUJVRyAoInNpZ25hbCBxdWVyeSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdfY29uZF9zaWduYWwgKCYocHJpdiktPmpidWZfcXVlcnkpOyAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSBHX1NUTVRfRU5ECisKKyNkZWZpbmUgR1NUX0JVRkZFUl9JU19SRVRSQU5TTUlTU0lPTihidWZmZXIpIFwKKyAgR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmZmVyLCBHU1RfUlRQX0JVRkZFUl9GTEFHX1JFVFJBTlNNSVNTSU9OKQorCit0eXBlZGVmIHN0cnVjdCBUaW1lclF1ZXVlCit7CisgIEdRdWV1ZSAqdGltZXJzOworICBHSGFzaFRhYmxlICpoYXNodGFibGU7Cit9IFRpbWVyUXVldWU7CisKK3N0cnVjdCBfR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZQoreworICBHc3RQYWQgKnNpbmtwYWQsICpzcmNwYWQ7CisgIEdzdFBhZCAqcnRjcHNpbmtwYWQ7CisKKyAgUlRQSml0dGVyQnVmZmVyICpqYnVmOworICBHTXV0ZXggamJ1Zl9sb2NrOworICBnYm9vbGVhbiB3YWl0aW5nX3RpbWVyOworICBHQ29uZCBqYnVmX3RpbWVyOworICBnYm9vbGVhbiB3YWl0aW5nX2V2ZW50OworICBHQ29uZCBqYnVmX2V2ZW50OworICBnYm9vbGVhbiB3YWl0aW5nX3F1ZXJ5OworICBHQ29uZCBqYnVmX3F1ZXJ5OworICBnYm9vbGVhbiBsYXN0X3F1ZXJ5OworICBnYm9vbGVhbiBkaXNjb250OworICBnYm9vbGVhbiB0c19kaXNjb250OworICBnYm9vbGVhbiBhY3RpdmU7CisgIGd1aW50NjQgb3V0X29mZnNldDsKKworICBnYm9vbGVhbiB0aW1lcl9ydW5uaW5nOworICBHVGhyZWFkICp0aW1lcl90aHJlYWQ7CisKKyAgLyogcHJvcGVydGllcyAqLworICBndWludCBsYXRlbmN5X21zOworICBndWludDY0IGxhdGVuY3lfbnM7CisgIGdib29sZWFuIGRyb3Bfb25fbGF0ZW5jeTsKKyAgZ2ludDY0IHRzX29mZnNldDsKKyAgZ3VpbnQ2NCBtYXhfdHNfb2Zmc2V0X2FkanVzdG1lbnQ7CisgIGdib29sZWFuIGRvX2xvc3Q7CisgIGdib29sZWFuIGRvX3JldHJhbnNtaXNzaW9uOworICBnYm9vbGVhbiBydHhfbmV4dF9zZXFudW07CisgIGdpbnQgcnR4X2RlbGF5OworICBndWludCBydHhfbWluX2RlbGF5OworICBnaW50IHJ0eF9kZWxheV9yZW9yZGVyOworICBnaW50IHJ0eF9yZXRyeV90aW1lb3V0OworICBnaW50IHJ0eF9taW5fcmV0cnlfdGltZW91dDsKKyAgZ2ludCBydHhfcmV0cnlfcGVyaW9kOworICBnaW50IHJ0eF9tYXhfcmV0cmllczsKKyAgZ3VpbnQgcnR4X3N0YXRzX3RpbWVvdXQ7CisgIGdpbnQgcnR4X2RlYWRsaW5lX21zOworICBnaW50IG1heF9ydGNwX3J0cF90aW1lX2RpZmY7CisgIGd1aW50MzIgbWF4X2Ryb3BvdXRfdGltZTsKKyAgZ3VpbnQzMiBtYXhfbWlzb3JkZXJfdGltZTsKKyAgZ3VpbnQgZmFzdHN0YXJ0X21pbl9wYWNrZXRzOworCisgIC8qIHRoZSBsYXN0IHNlcW51bSB3ZSBwdXNoZWQgb3V0ICovCisgIGd1aW50MzIgbGFzdF9wb3BwZWRfc2VxbnVtOworICAvKiB0aGUgbmV4dCBleHBlY3RlZCBzZXFudW0gd2UgcHVzaCAqLworICBndWludDMyIG5leHRfc2VxbnVtOworICAvKiBzZXFudW0tYmFzZSwgaWYga25vd24gKi8KKyAgZ3VpbnQzMiBzZXFudW1fYmFzZTsKKyAgLyogbGFzdCBvdXRwdXQgdGltZSAqLworICBHc3RDbG9ja1RpbWUgbGFzdF9vdXRfdGltZTsKKyAgLyogbGFzdCB2YWxpZCBpbnB1dCB0aW1lc3RhbXAgYW5kIHJ0cHRpbWUgcGFpciAqLworICBHc3RDbG9ja1RpbWUgaXBzX3B0czsKKyAgZ3VpbnQ2NCBpcHNfcnRwdGltZTsKKyAgR3N0Q2xvY2tUaW1lIHBhY2tldF9zcGFjaW5nOworICBnaW50IGVxdWlkaXN0YW50OworCisgIEdRdWV1ZSBnYXBfcGFja2V0czsKKworICAvKiB0aGUgbmV4dCBleHBlY3RlZCBzZXFudW0gd2UgcmVjZWl2ZSAqLworICBHc3RDbG9ja1RpbWUgbGFzdF9pbl9wdHM7CisgIGd1aW50MzIgbmV4dF9pbl9zZXFudW07CisKKyAgR0FycmF5ICp0aW1lcnM7CisgIFRpbWVyUXVldWUgKnJ0eF9zdGF0c190aW1lcnM7CisKKyAgLyogc3RhcnQgYW5kIHN0b3AgcmFuZ2VzICovCisgIEdzdENsb2NrVGltZSBucHRfc3RhcnQ7CisgIEdzdENsb2NrVGltZSBucHRfc3RvcDsKKyAgZ3VpbnQ2NCBleHRfdGltZXN0YW1wOworICBndWludDY0IGxhc3RfZWxhcHNlZDsKKyAgZ3VpbnQ2NCBlc3RpbWF0ZWRfZW9zOworICBHc3RDbG9ja0lEIGVvc19pZDsKKworICAvKiBzdGF0ZSAqLworICBnYm9vbGVhbiBlb3M7CisgIGd1aW50IGxhc3RfcGVyY2VudDsKKworICAvKiBjbG9jayByYXRlIGFuZCBydHAgdGltZXN0YW1wIG9mZnNldCAqLworICBnaW50IGxhc3RfcHQ7CisgIGdpbnQzMiBjbG9ja19yYXRlOworICBnaW50NjQgY2xvY2tfYmFzZTsKKyAgZ2ludDY0IHRzX29mZnNldF9yZW1haW5kZXI7CisKKyAgLyogd2hlbiB3ZSBhcmUgc2h1dHRpbmcgZG93biAqLworICBHc3RGbG93UmV0dXJuIHNyY3Jlc3VsdDsKKyAgZ2Jvb2xlYW4gYmxvY2tlZDsKKworICAvKiBmb3Igc3luYyAqLworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIEdzdENsb2NrSUQgY2xvY2tfaWQ7CisgIEdzdENsb2NrVGltZSB0aW1lcl90aW1lb3V0OworICBndWludDE2IHRpbWVyX3NlcW51bTsKKyAgLyogdGhlIGxhdGVuY3kgb2YgdGhlIHVwc3RyZWFtIHBlZXIsIHdlIGhhdmUgdG8gdGFrZSB0aGlzIGludG8gYWNjb3VudCB3aGVuCisgICAqIHN5bmNocm9uaXppbmcgdGhlIGJ1ZmZlcnMuICovCisgIEdzdENsb2NrVGltZSBwZWVyX2xhdGVuY3k7CisgIGd1aW50NjQgZXh0X3J0cHRpbWU7CisgIEdzdEJ1ZmZlciAqbGFzdF9zcjsKKworICAvKiBzb21lIGFjY291bnRpbmcgKi8KKyAgZ3VpbnQ2NCBudW1fcHVzaGVkOworICBndWludDY0IG51bV9sb3N0OworICBndWludDY0IG51bV9sYXRlOworICBndWludDY0IG51bV9kdXBsaWNhdGVzOworICBndWludDY0IG51bV9ydHhfcmVxdWVzdHM7CisgIGd1aW50NjQgbnVtX3J0eF9zdWNjZXNzOworICBndWludDY0IG51bV9ydHhfZmFpbGVkOworICBnZG91YmxlIGF2Z19ydHhfbnVtOworICBndWludDY0IGF2Z19ydHhfcnR0OworICBSVFBQYWNrZXRSYXRlQ3R4IHBhY2tldF9yYXRlX2N0eDsKKworICAvKiBmb3IgdGhlIGppdHRlciAqLworICBHc3RDbG9ja1RpbWUgbGFzdF9kdHM7CisgIEdzdENsb2NrVGltZSBsYXN0X3B0czsKKyAgZ3VpbnQ2NCBsYXN0X3J0cHRpbWU7CisgIEdzdENsb2NrVGltZSBhdmdfaml0dGVyOworfTsKKwordHlwZWRlZiBlbnVtCit7CisgIFRJTUVSX1RZUEVfRVhQRUNURUQsCisgIFRJTUVSX1RZUEVfTE9TVCwKKyAgVElNRVJfVFlQRV9ERUFETElORSwKKyAgVElNRVJfVFlQRV9FT1MKK30gVGltZXJUeXBlOworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludCBpZHg7CisgIGd1aW50MTYgc2VxbnVtOworICBndWludCBudW07CisgIFRpbWVyVHlwZSB0eXBlOworICBHc3RDbG9ja1RpbWUgdGltZW91dDsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uOworICBHc3RDbG9ja1RpbWUgcnR4X2Jhc2U7CisgIEdzdENsb2NrVGltZSBydHhfZGVsYXk7CisgIEdzdENsb2NrVGltZSBydHhfcmV0cnk7CisgIEdzdENsb2NrVGltZSBydHhfbGFzdDsKKyAgZ3VpbnQgbnVtX3J0eF9yZXRyeTsKKyAgZ3VpbnQgbnVtX3J0eF9yZWNlaXZlZDsKK30gVGltZXJEYXRhOworCisjZGVmaW5lIEdTVF9SVFBfSklUVEVSX0JVRkZFUl9HRVRfUFJJVkFURShvKSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX1BSSVZBVEUgKChvKSwgR1NUX1RZUEVfUlRQX0pJVFRFUl9CVUZGRVIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSkpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIKKyAgICAgICAgLyogImNsb2NrLXJhdGUgPSAoaW50KSBbIDEsIDIxNDc0ODM2NDcgXSwgIgorICAgICAgICAgKiAicGF5bG9hZCA9IChpbnQpICwgIgorICAgICAgICAgKiAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpICIKKyAgICAgICAgICovICkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpbmtfcnRjcF90ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmtfcnRjcCIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0Y3AiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2ppdHRlcl9idWZmZXJfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIKKyAgICAgICAgLyogInBheWxvYWQgPSAoaW50KSAsICIKKyAgICAgICAgICogImNsb2NrLXJhdGUgPSAoaW50KSAsICIKKyAgICAgICAgICogImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSAiCisgICAgICAgICAqLyApCisgICAgKTsKKworc3RhdGljIGd1aW50IGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaWduYWxzW0xBU1RfU0lHTkFMXSA9IHsgMCB9OworCisjZGVmaW5lIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBKaXR0ZXJCdWZmZXIsIGdzdF9ydHBfaml0dGVyX2J1ZmZlciwgR1NUX1RZUEVfRUxFTUVOVCk7CisKKy8qIG9iamVjdCBvdmVycmlkZXMgKi8KK3N0YXRpYyB2b2lkIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworLyogZWxlbWVudCBvdmVycmlkZXMgKi8KK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50CisgICAgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyBHc3RQYWQgKmdzdF9ydHBfaml0dGVyX2J1ZmZlcl9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2ppdHRlcl9idWZmZXJfcmVsZWFzZV9wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZCAqIHBhZCk7CitzdGF0aWMgR3N0Q2xvY2sgKmdzdF9ydHBfaml0dGVyX2J1ZmZlcl9wcm92aWRlX2Nsb2NrIChHc3RFbGVtZW50ICogZWxlbWVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NldF9jbG9jayAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0Q2xvY2sgKiBjbG9jayk7CisKKy8qIHBhZCBvdmVycmlkZXMgKi8KK3N0YXRpYyBHc3RDYXBzICpnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBHc3RJdGVyYXRvciAqZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2l0ZXJhdGVfaW50ZXJuYWxfbGlua3MgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQpOworCisvKiBzaW5rcGFkIG92ZXJyaWRlcyAqLworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbiAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbl9saXN0IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXJMaXN0ICogYnVmZmVyX2xpc3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpbmtfcnRjcF9ldmVudCAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW5fcnRjcCAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmZmVyKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworLyogc3JjcGFkIG92ZXJyaWRlcyAqLworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zcmNfYWN0aXZhdGVfbW9kZSAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UGFkTW9kZSBtb2RlLCBnYm9vbGVhbiBhY3RpdmUpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3AgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NyY19xdWVyeSAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2xlYXJfcHRfbWFwIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIpOworc3RhdGljIEdzdENsb2NrVGltZQorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NldF9hY3RpdmUgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwKKyAgICBnYm9vbGVhbiBhY3RpdmUsIGd1aW50NjQgYmFzZV90aW1lKTsKK3N0YXRpYyB2b2lkIGRvX2hhbmRsZV9zeW5jIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIpOworCitzdGF0aWMgdm9pZCB1bnNjaGVkdWxlX2N1cnJlbnRfdGltZXIgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlcik7CitzdGF0aWMgdm9pZCByZW1vdmVfYWxsX3RpbWVycyAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyKTsKKworc3RhdGljIHZvaWQgd2FpdF9uZXh0X3RpbWVvdXQgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlcik7CisKK3N0YXRpYyBHc3RTdHJ1Y3R1cmUgKmdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jcmVhdGVfc3RhdHMgKEdzdFJ0cEppdHRlckJ1ZmZlciAqCisgICAgaml0dGVyYnVmZmVyKTsKKworc3RhdGljIHZvaWQgdXBkYXRlX3J0eF9zdGF0cyAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLAorICAgIFRpbWVyRGF0YSAqIHRpbWVyLCBHc3RDbG9ja1RpbWUgZHRzLCBnYm9vbGVhbiBzdWNjZXNzKTsKKworc3RhdGljIFRpbWVyUXVldWUgKnRpbWVyX3F1ZXVlX25ldyAodm9pZCk7CitzdGF0aWMgdm9pZCB0aW1lcl9xdWV1ZV9mcmVlIChUaW1lclF1ZXVlICogcXVldWUpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NsYXNzX2luaXQgKEdzdFJ0cEppdHRlckJ1ZmZlckNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnX3R5cGVfY2xhc3NfYWRkX3ByaXZhdGUgKGtsYXNzLCBzaXplb2YgKEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUpKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9maW5hbGl6ZTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3Byb3BlcnR5OworCisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6bGF0ZW5jeToKKyAgICoKKyAgICogVGhlIG1heGltdW0gbGF0ZW5jeSBvZiB0aGUgaml0dGVyYnVmZmVyLiBQYWNrZXRzIHdpbGwgYmUga2VwdCBpbiB0aGUgYnVmZmVyCisgICAqIGZvciBhdCBtb3N0IHRoaXMgdGltZS4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTEFURU5DWSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibGF0ZW5jeSIsICJCdWZmZXIgbGF0ZW5jeSBpbiBtcyIsCisgICAgICAgICAgIkFtb3VudCBvZiBtcyB0byBidWZmZXIiLCAwLCBHX01BWFVJTlQsIERFRkFVTFRfTEFURU5DWV9NUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgLyoqCisgICAqIEdzdFJ0cEppdHRlckJ1ZmZlcjpkcm9wLW9uLWxhdGVuY3k6CisgICAqCisgICAqIERyb3Agb2xkZXN0IGJ1ZmZlcnMgd2hlbiB0aGUgcXVldWUgaXMgY29tcGxldGVseSBmaWxsZWQuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RST1BfT05fTEFURU5DWSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZHJvcC1vbi1sYXRlbmN5IiwKKyAgICAgICAgICAiRHJvcCBidWZmZXJzIHdoZW4gbWF4aW11bSBsYXRlbmN5IGlzIHJlYWNoZWQiLAorICAgICAgICAgICJUZWxscyB0aGUgaml0dGVyYnVmZmVyIHRvIG5ldmVyIGV4Y2VlZCB0aGUgZ2l2ZW4gbGF0ZW5jeSBpbiBzaXplIiwKKyAgICAgICAgICBERUZBVUxUX0RST1BfT05fTEFURU5DWSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6dHMtb2Zmc2V0OgorICAgKgorICAgKiBBZGp1c3QgR1N0cmVhbWVyIG91dHB1dCBidWZmZXIgdGltZXN0YW1wcyBpbiB0aGUgaml0dGVyYnVmZmVyIHdpdGggb2Zmc2V0LgorICAgKiBUaGlzIGlzIG1haW5seSB1c2VkIHRvIGVuc3VyZSBpbnRlcnN0cmVhbSBzeW5jaHJvbmlzYXRpb24uCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RTX09GRlNFVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQ2NCAoInRzLW9mZnNldCIsICJUaW1lc3RhbXAgT2Zmc2V0IiwKKyAgICAgICAgICAiQWRqdXN0IGJ1ZmZlciB0aW1lc3RhbXBzIHdpdGggb2Zmc2V0IGluIG5hbm9zZWNvbmRzIiwgR19NSU5JTlQ2NCwKKyAgICAgICAgICBHX01BWElOVDY0LCBERUZBVUxUX1RTX09GRlNFVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOm1heC10cy1vZmZzZXQtYWRqdXN0bWVudDoKKyAgICoKKyAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIG5hbm9zZWNvbmRzIHBlciBmcmFtZSB0aGF0IHRpbWUgb2Zmc2V0IG1heSBiZQorICAgKiBhZGp1c3RlZCB3aXRoLiBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgc3VkZGVuIGxhcmdlIGNoYW5nZXMgdG8gdGltZSBzdGFtcHMuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJtYXgtdHMtb2Zmc2V0LWFkanVzdG1lbnQiLAorICAgICAgICAgICJNYXggVGltZXN0YW1wIE9mZnNldCBBZGp1c3RtZW50IiwKKyAgICAgICAgICAiVGhlIG1heGltdW0gbnVtYmVyIG9mIG5hbm9zZWNvbmRzIHBlciBmcmFtZSB0aGF0IHRpbWUgc3RhbXAgIgorICAgICAgICAgICJvZmZzZXRzIG1heSBiZSBhZGp1c3RlZCAoMCA9IG5vIGxpbWl0KS4iLCAwLCBHX01BWFVJTlQ2NCwKKyAgICAgICAgICBERUZBVUxUX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVCwgR19QQVJBTV9SRUFEV1JJVEUgfAorICAgICAgICAgIEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOmRvLWxvc3Q6CisgICAqCisgICAqIFNlbmQgb3V0IGEgR3N0UlRQUGFja2V0TG9zdCBldmVudCBkb3duc3RyZWFtIHdoZW4gYSBwYWNrZXQgaXMgY29uc2lkZXJlZAorICAgKiBsb3N0LgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ET19MT1NULAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJkby1sb3N0IiwgIkRvIExvc3QiLAorICAgICAgICAgICJTZW5kIGFuIGV2ZW50IGRvd25zdHJlYW0gd2hlbiBhIHBhY2tldCBpcyBsb3N0IiwgREVGQVVMVF9ET19MT1NULAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6bW9kZToKKyAgICoKKyAgICogQ29udHJvbCB0aGUgYnVmZmVyaW5nIGFuZCB0aW1lc3RhbXBpbmcgbW9kZSB1c2VkIGJ5IHRoZSBqaXR0ZXJidWZmZXIuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoIm1vZGUiLCAiTW9kZSIsCisgICAgICAgICAgIkNvbnRyb2wgdGhlIGJ1ZmZlcmluZyBhbGdvcml0aG0gaW4gdXNlIiwgUlRQX1RZUEVfSklUVEVSX0JVRkZFUl9NT0RFLAorICAgICAgICAgIERFRkFVTFRfTU9ERSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6cGVyY2VudDoKKyAgICoKKyAgICogVGhlIHBlcmNlbnQgb2YgdGhlIGppdHRlcmJ1ZmZlciB0aGF0IGlzIGZpbGxlZC4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUEVSQ0VOVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJwZXJjZW50IiwgInBlcmNlbnQiLAorICAgICAgICAgICJUaGUgYnVmZmVyIGZpbGxlZCBwZXJjZW50IiwgMCwgMTAwLAorICAgICAgICAgIDAsIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6ZG8tcmV0cmFuc21pc3Npb246CisgICAqCisgICAqIFNlbmQgb3V0IGEgR3N0UlRQUmV0cmFuc21pc3Npb24gZXZlbnQgdXBzdHJlYW0gd2hlbiBhIHBhY2tldCBpcyBjb25zaWRlcmVkCisgICAqIGxhdGUgYW5kIHNob3VsZCBiZSByZXRyYW5zbWl0dGVkLgorICAgKgorICAgKiBTaW5jZTogMS4yCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RPX1JFVFJBTlNNSVNTSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJkby1yZXRyYW5zbWlzc2lvbiIsICJEbyBSZXRyYW5zbWlzc2lvbiIsCisgICAgICAgICAgIlNlbmQgcmV0cmFuc21pc3Npb24gZXZlbnRzIHVwc3RyZWFtIHdoZW4gYSBwYWNrZXQgaXMgbGF0ZSIsCisgICAgICAgICAgREVGQVVMVF9ET19SRVRSQU5TTUlTU0lPTiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOnJ0eC1uZXh0LXNlcW51bQorICAgKgorICAgKiBFc3RpbWF0ZSB3aGVuIHRoZSBuZXh0IHBhY2tldCBzaG91bGQgYXJyaXZlIGFuZCBzY2hlZHVsZSBhIHJldHJhbnNtaXNzaW9uCisgICAqIHJlcXVlc3QgZm9yIGl0LgorICAgKiBUaGlzIGlzLCB3aGVuIHBhY2tldCBOIGFycml2ZXMsIGEgR3N0UlRQUmV0cmFuc21pc3Npb24gZXZlbnQgaXMgc2NoZWR1bGUKKyAgICogZm9yIHBhY2tldCBOKzEuIFNvIGl0IHdpbGwgYmUgcmVxdWVzdGVkIGlmIGl0IGRvZXMgbm90IGFycml2ZSBhdCB0aGUgZXhwZWN0ZWQgdGltZS4KKyAgICogVGhlIGV4cGVjdGVkIHRpbWUgaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgZHRzIG9mIE4gYW5kIHRoZSBwYWNrZXQgc3BhY2luZy4KKyAgICoKKyAgICogU2luY2U6IDEuNgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVFhfTkVYVF9TRVFOVU0sCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInJ0eC1uZXh0LXNlcW51bSIsICJSVFggbmV4dCBzZXFudW0iLAorICAgICAgICAgICJFc3RpbWF0ZSB3aGVuIHRoZSBuZXh0IHBhY2tldCBzaG91bGQgYXJyaXZlIGFuZCBzY2hlZHVsZSBhICIKKyAgICAgICAgICAicmV0cmFuc21pc3Npb24gcmVxdWVzdCBmb3IgaXQuIiwKKyAgICAgICAgICBERUZBVUxUX1JUWF9ORVhUX1NFUU5VTSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFJ0cEppdHRlckJ1ZmZlcjpydHgtZGVsYXk6CisgICAqCisgICAqIFdoZW4gYSBwYWNrZXQgZGlkIG5vdCBhcnJpdmUgYXQgdGhlIGV4cGVjdGVkIHRpbWUsIHdhaXQgdGhpcyBleHRyYSBhbW91bnQKKyAgICogb2YgdGltZSBiZWZvcmUgc2VuZGluZyBhIHJldHJhbnNtaXNzaW9uIGV2ZW50LgorICAgKgorICAgKiBXaGVuIC0xIGlzIHVzZWQsIHRoZSBtYXggaml0dGVyIHdpbGwgYmUgdXNlZCBhcyBleHRyYSBkZWxheS4KKyAgICoKKyAgICogU2luY2U6IDEuMgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVFhfREVMQVksCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicnR4LWRlbGF5IiwgIlJUWCBEZWxheSIsCisgICAgICAgICAgIkV4dHJhIHRpbWUgaW4gbXMgdG8gd2FpdCBiZWZvcmUgc2VuZGluZyByZXRyYW5zbWlzc2lvbiAiCisgICAgICAgICAgImV2ZW50ICgtMSBhdXRvbWF0aWMpIiwgLTEsIEdfTUFYSU5ULCBERUZBVUxUX1JUWF9ERUxBWSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOnJ0eC1taW4tZGVsYXk6CisgICAqCisgICAqIFdoZW4gYSBwYWNrZXQgZGlkIG5vdCBhcnJpdmUgYXQgdGhlIGV4cGVjdGVkIHRpbWUsIHdhaXQgYXQgbGVhc3QgdGhpcyBleHRyYSBhbW91bnQKKyAgICogb2YgdGltZSBiZWZvcmUgc2VuZGluZyBhIHJldHJhbnNtaXNzaW9uIGV2ZW50LgorICAgKgorICAgKiBTaW5jZTogMS42CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JUWF9NSU5fREVMQVksCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInJ0eC1taW4tZGVsYXkiLCAiTWluaW11bSBSVFggRGVsYXkiLAorICAgICAgICAgICJNaW5pbXVtIHRpbWUgaW4gbXMgdG8gd2FpdCBiZWZvcmUgc2VuZGluZyByZXRyYW5zbWlzc2lvbiAiCisgICAgICAgICAgImV2ZW50IiwgMCwgR19NQVhVSU5ULCBERUZBVUxUX1JUWF9NSU5fREVMQVksCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6cnR4LWRlbGF5LXJlb3JkZXI6CisgICAqCisgICAqIEFzc3VtZSB0aGF0IGEgcmV0cmFuc21pc3Npb24gZXZlbnQgc2hvdWxkIGJlIHNlbnQgd2hlbiB3ZSBzZWUKKyAgICogdGhpcyBtdWNoIHBhY2tldCByZW9yZGVyaW5nLgorICAgKgorICAgKiBXaGVuIC0xIGlzIHVzZWQsIHRoZSB2YWx1ZSB3aWxsIGJlIGVzdGltYXRlZCBiYXNlZCBvbiBvYnNlcnZlZCBwYWNrZXQKKyAgICogcmVvcmRlcmluZy4gV2hlbiAwIGlzIHVzZWQgcGFja2V0IHJlb3JkZXJpbmcgYWxvbmUgd2lsbCBub3QgY2F1c2UgYQorICAgKiByZXRyYW5zbWlzc2lvbiBldmVudCAoU2luY2UgMS4xMCkuCisgICAqCisgICAqIFNpbmNlOiAxLjIKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRYX0RFTEFZX1JFT1JERVIsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicnR4LWRlbGF5LXJlb3JkZXIiLCAiUlRYIERlbGF5IFJlb3JkZXIiLAorICAgICAgICAgICJTZW5kaW5nIHJldHJhbnNtaXNzaW9uIGV2ZW50IHdoZW4gdGhpcyBtdWNoIHJlb3JkZXJpbmcgIgorICAgICAgICAgICIoMCBkaXNhYmxlLCAtMSBhdXRvbWF0aWMpIiwKKyAgICAgICAgICAtMSwgR19NQVhJTlQsIERFRkFVTFRfUlRYX0RFTEFZX1JFT1JERVIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6OnJ0eC1yZXRyeS10aW1lb3V0OgorICAgKgorICAgKiBXaGVuIG5vIHBhY2tldCBoYXMgYmVlbiByZWNlaXZlZCBhZnRlciBzZW5kaW5nIGEgcmV0cmFuc21pc3Npb24gZXZlbnQKKyAgICogZm9yIHRoaXMgdGltZSwgcmV0cnkgc2VuZGluZyBhIHJldHJhbnNtaXNzaW9uIGV2ZW50LgorICAgKgorICAgKiBXaGVuIC0xIGlzIHVzZWQsIHRoZSB2YWx1ZSB3aWxsIGJlIGVzdGltYXRlZCBiYXNlZCBvbiBvYnNlcnZlZCByb3VuZAorICAgKiB0cmlwIHRpbWUuCisgICAqCisgICAqIFNpbmNlOiAxLjIKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRYX1JFVFJZX1RJTUVPVVQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicnR4LXJldHJ5LXRpbWVvdXQiLCAiUlRYIFJldHJ5IFRpbWVvdXQiLAorICAgICAgICAgICJSZXRyeSBzZW5kaW5nIGEgdHJhbnNtaXNzaW9uIGV2ZW50IGFmdGVyIHRoaXMgdGltZW91dCBpbiAiCisgICAgICAgICAgIm1zICgtMSBhdXRvbWF0aWMpIiwgLTEsIEdfTUFYSU5ULCBERUZBVUxUX1JUWF9SRVRSWV9USU1FT1VULAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOjpydHgtbWluLXJldHJ5LXRpbWVvdXQ6CisgICAqCisgICAqIFRoZSBtaW5pbXVtIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gcmV0cnkgdGltZW91dHMuIFdoZW4KKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOjpydHgtcmV0cnktdGltZW91dCBpcyAtMSwgdGhpcyB2YWx1ZSBlbnN1cmVzIGEKKyAgICogbWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIHJldHJ5IHRpbWVvdXRzLgorICAgKgorICAgKiBXaGVuIC0xIGlzIHVzZWQsIHRoZSB2YWx1ZSB3aWxsIGJlIGVzdGltYXRlZCBiYXNlZCBvbiB0aGUKKyAgICogcGFja2V0IHNwYWNpbmcuCisgICAqCisgICAqIFNpbmNlOiAxLjYKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRYX01JTl9SRVRSWV9USU1FT1VULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInJ0eC1taW4tcmV0cnktdGltZW91dCIsICJSVFggTWluIFJldHJ5IFRpbWVvdXQiLAorICAgICAgICAgICJNaW5pbXVtIHRpbWVvdXQgYmV0d2VlbiBzZW5kaW5nIGEgdHJhbnNtaXNzaW9uIGV2ZW50IGluICIKKyAgICAgICAgICAibXMgKC0xIGF1dG9tYXRpYykiLCAtMSwgR19NQVhJTlQsIERFRkFVTFRfUlRYX01JTl9SRVRSWV9USU1FT1VULAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOnJ0eC1yZXRyeS1wZXJpb2Q6CisgICAqCisgICAqIFRoZSBhbW91bnQgb2YgdGltZSB0byB0cnkgdG8gZ2V0IGEgcmV0cmFuc21pc3Npb24uCisgICAqCisgICAqIFdoZW4gLTEgaXMgdXNlZCwgdGhlIHZhbHVlIHdpbGwgYmUgZXN0aW1hdGVkIGJhc2VkIG9uIHRoZSBqaXR0ZXJidWZmZXIKKyAgICogbGF0ZW5jeSBhbmQgdGhlIG9ic2VydmVkIHJvdW5kIHRyaXAgdGltZS4KKyAgICoKKyAgICogU2luY2U6IDEuMgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVFhfUkVUUllfUEVSSU9ELAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInJ0eC1yZXRyeS1wZXJpb2QiLCAiUlRYIFJldHJ5IFBlcmlvZCIsCisgICAgICAgICAgIlRyeSB0byBnZXQgYSByZXRyYW5zbWlzc2lvbiBmb3IgdGhpcyBtYW55IG1zICIKKyAgICAgICAgICAiKC0xIGF1dG9tYXRpYykiLCAtMSwgR19NQVhJTlQsIERFRkFVTFRfUlRYX1JFVFJZX1BFUklPRCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgLyoqCisgICAqIEdzdFJ0cEppdHRlckJ1ZmZlcjpydHgtbWF4LXJldHJpZXM6CisgICAqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIHRvIHJlcXVlc3QgYSByZXRyYW5zbWlzc2lvbi4KKyAgICoKKyAgICogVGhpcyBpbXBsaWVzIHRoYXQgYXMgbWF4aW11bSAocnR4LW1heC1yZXRyaWVzICsgMSkgcmV0cmFuc21pc3Npb25zIHdpbGwgYmUgcmVxdWVzdGVkLgorICAgKiBXaGVuIC0xIGlzIHVzZWQsIHRoZSBudW1iZXIgb2YgcmV0cmFuc21pc3Npb24gcmVxdWVzdCB3aWxsIG5vdCBiZSBsaW1pdGVkLgorICAgKgorICAgKiBTaW5jZTogMS42CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JUWF9NQVhfUkVUUklFUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJydHgtbWF4LXJldHJpZXMiLCAiUlRYIE1heCBSZXRyaWVzIiwKKyAgICAgICAgICAiVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgdG8gcmVxdWVzdCBhIHJldHJhbnNtaXNzaW9uLiAiCisgICAgICAgICAgIigtMSBub3QgbGltaXRlZCkiLCAtMSwgR19NQVhJTlQsIERFRkFVTFRfUlRYX01BWF9SRVRSSUVTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOnJ0eC1kZWFkbGluZToKKyAgICoKKyAgICogVGhlIGRlYWRsaW5lIGZvciBhIHZhbGlkIFJUWCByZXF1ZXN0IGluIG1zLgorICAgKgorICAgKiBIb3cgbG9uZyB0aGUgUlRYIFJUQ1Agd2lsbCBiZSB2YWxpZCBmb3IuCisgICAqIFdoZW4gLTEgaXMgdXNlZCwgdGhlIHNpemUgb2YgdGhlIGppdHRlcmJ1ZmZlciB3aWxsIGJlIHVzZWQuCisgICAqCisgICAqIFNpbmNlOiAxLjEwCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JUWF9ERUFETElORSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJydHgtZGVhZGxpbmUiLCAiUlRYIERlYWRsaW5lIChtcykiLAorICAgICAgICAgICJUaGUgZGVhZGxpbmUgZm9yIGEgdmFsaWQgUlRYIHJlcXVlc3QgaW4gbWlsbGlzZWNvbmRzLiAiCisgICAgICAgICAgIigtMSBhdXRvbWF0aWMpIiwgLTEsIEdfTUFYSU5ULCBERUZBVUxUX1JUWF9ERUFETElORSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKy8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6OnJ0eC1zdGF0cy10aW1lb3V0OgorICAgKgorICAgKiBUaGUgdGltZSB0byB3YWl0IGZvciBhIHJldHJhbnNtaXR0ZWQgcGFja2V0IGFmdGVyIGl0IGhhcyBiZWVuCisgICAqIGNvbnNpZGVyZWQgbG9zdCBpbiBvcmRlciB0byBjb2xsZWN0IFJUWCBzdGF0aXN0aWNzLgorICAgKgorICAgKiBTaW5jZTogMS4xMAorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVFhfU1RBVFNfVElNRU9VVCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgicnR4LXN0YXRzLXRpbWVvdXQiLCAiUlRYIFN0YXRpc3RpY3MgVGltZW91dCIsCisgICAgICAgICAgIlRoZSB0aW1lIHRvIHdhaXQgZm9yIGEgcmV0cmFuc21pdHRlZCBwYWNrZXQgYWZ0ZXIgaXQgaGFzIGJlZW4gIgorICAgICAgICAgICJjb25zaWRlcmVkIGxvc3QgaW4gb3JkZXIgdG8gY29sbGVjdCBzdGF0aXN0aWNzIChtcykiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVCwgREVGQVVMVF9SVFhfU1RBVFNfVElNRU9VVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01BWF9EUk9QT1VUX1RJTUUsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm1heC1kcm9wb3V0LXRpbWUiLCAiTWF4IGRyb3BvdXQgdGltZSIsCisgICAgICAgICAgIlRoZSBtYXhpbXVtIHRpbWUgKG1pbGxpc2Vjb25kcykgb2YgbWlzc2luZyBwYWNrZXRzIHRvbGVyYXRlZC4iLAorICAgICAgICAgIDAsIEdfTUFYVUlOVCwgREVGQVVMVF9NQVhfRFJPUE9VVF9USU1FLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX01JU09SREVSX1RJTUUsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm1heC1taXNvcmRlci10aW1lIiwgIk1heCBtaXNvcmRlciB0aW1lIiwKKyAgICAgICAgICAiVGhlIG1heGltdW0gdGltZSAobWlsbGlzZWNvbmRzKSBvZiBtaXNvcmRlcmVkIHBhY2tldHMgdG9sZXJhdGVkLiIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCBERUZBVUxUX01BWF9NSVNPUkRFUl9USU1FLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOnN0YXRzOgorICAgKgorICAgKiBWYXJpb3VzIGppdHRlcmJ1ZmZlciBzdGF0aXN0aWNzLiBUaGlzIHByb3BlcnR5IHJldHVybnMgYSBHc3RTdHJ1Y3R1cmUKKyAgICogd2l0aCBuYW1lIGFwcGxpY2F0aW9uL3gtcnRwLWppdHRlcmJ1ZmZlci1zdGF0cyB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOgorICAgKgorICAgKiA8aXRlbWl6ZWRsaXN0PgorICAgKiA8bGlzdGl0ZW0+CisgICAqICAgPHBhcmE+CisgICAqICAgI2d1aW50NjQKKyAgICogICA8Y2xhc3NuYW1lPiZxdW90O251bS1wdXNoZWQmcXVvdDs8L2NsYXNzbmFtZT46CisgICAqICAgdGhlIG51bWJlciBvZiBwYWNrZXRzIHB1c2hlZCBvdXQuCisgICAqICAgPC9wYXJhPgorICAgKiA8L2xpc3RpdGVtPgorICAgKiA8bGlzdGl0ZW0+CisgICAqICAgPHBhcmE+CisgICAqICAgI2d1aW50NjQKKyAgICogICA8Y2xhc3NuYW1lPiZxdW90O251bS1sb3N0JnF1b3Q7PC9jbGFzc25hbWU+OgorICAgKiAgIHRoZSBudW1iZXIgb2YgcGFja2V0cyBjb25zaWRlcmVkIGxvc3QuCisgICAqICAgPC9wYXJhPgorICAgKiA8L2xpc3RpdGVtPgorICAgKiA8bGlzdGl0ZW0+CisgICAqICAgPHBhcmE+CisgICAqICAgI2d1aW50NjQKKyAgICogICA8Y2xhc3NuYW1lPiZxdW90O251bS1sYXRlJnF1b3Q7PC9jbGFzc25hbWU+OgorICAgKiAgIHRoZSBudW1iZXIgb2YgcGFja2V0cyBhcnJpdmluZyB0b28gbGF0ZS4KKyAgICogICA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDxsaXN0aXRlbT4KKyAgICogICA8cGFyYT4KKyAgICogICAjZ3VpbnQ2NAorICAgKiAgIDxjbGFzc25hbWU+JnF1b3Q7bnVtLWR1cGxpY2F0ZXMmcXVvdDs8L2NsYXNzbmFtZT46CisgICAqICAgdGhlIG51bWJlciBvZiBkdXBsaWNhdGUgcGFja2V0cy4KKyAgICogICA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDxsaXN0aXRlbT4KKyAgICogICA8cGFyYT4KKyAgICogICAjZ3VpbnQ2NAorICAgKiAgIDxjbGFzc25hbWU+JnF1b3Q7cnR4LWNvdW50JnF1b3Q7PC9jbGFzc25hbWU+OgorICAgKiAgIHRoZSBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zIHJlcXVlc3RlZC4KKyAgICogICA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDxsaXN0aXRlbT4KKyAgICogICA8cGFyYT4KKyAgICogICAjZ3VpbnQ2NAorICAgKiAgIDxjbGFzc25hbWU+JnF1b3Q7cnR4LXN1Y2Nlc3MtY291bnQmcXVvdDs8L2NsYXNzbmFtZT46CisgICAqICAgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIHJldHJhbnNtaXNzaW9ucy4KKyAgICogICA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDxsaXN0aXRlbT4KKyAgICogICA8cGFyYT4KKyAgICogICAjZ2RvdWJsZQorICAgKiAgIDxjbGFzc25hbWU+JnF1b3Q7cnR4LXBlci1wYWNrZXQmcXVvdDs8L2NsYXNzbmFtZT46CisgICAqICAgYXZlcmFnZSBudW1iZXIgb2YgUlRYIHBlciBwYWNrZXQuCisgICAqICAgPC9wYXJhPgorICAgKiA8L2xpc3RpdGVtPgorICAgKiA8bGlzdGl0ZW0+CisgICAqICAgPHBhcmE+CisgICAqICAgI2d1aW50NjQKKyAgICogICA8Y2xhc3NuYW1lPiZxdW90O3J0eC1ydHQmcXVvdDs8L2NsYXNzbmFtZT46CisgICAqICAgYXZlcmFnZSByb3VuZCB0cmlwIHRpbWUgcGVyIFJUWC4KKyAgICogICA8L3BhcmE+CisgICAqIDwvbGlzdGl0ZW0+CisgICAqIDwvaXRlbWl6ZWRsaXN0PgorICAgKgorICAgKiBTaW5jZTogMS40CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NUQVRTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgic3RhdHMiLCAiU3RhdGlzdGljcyIsCisgICAgICAgICAgIlZhcmlvdXMgc3RhdGlzdGljcyIsIEdTVF9UWVBFX1NUUlVDVFVSRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6bWF4LXJ0Y3AtcnRwLXRpbWUtZGlmZgorICAgKgorICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSBpbiBtcyB0aGF0IHRoZSBSVFAgdGltZSBpbiB0aGUgUlRDUCBTUnMKKyAgICogaXMgYWxsb3dlZCB0byBiZSBhaGVhZCBvZiB0aGUgbGFzdCBSVFAgcGFja2V0IHdlIHJlY2VpdmVkLiBVc2UKKyAgICogLTEgdG8gZGlzYWJsZSBpZ25vcmluZyBvZiBSVENQIHBhY2tldHMuCisgICAqCisgICAqIFNpbmNlOiAxLjgKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX1JUQ1BfUlRQX1RJTUVfRElGRiwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJtYXgtcnRjcC1ydHAtdGltZS1kaWZmIiwgIk1heCBSVENQIFJUUCBUaW1lIERpZmYiLAorICAgICAgICAgICJNYXhpbXVtIGFtb3VudCBvZiB0aW1lIGluIG1zIHRoYXQgdGhlIFJUUCB0aW1lIGluIFJUQ1AgU1JzICIKKyAgICAgICAgICAiaXMgYWxsb3dlZCB0byBiZSBhaGVhZCAoLTEgZGlzYWJsZWQpIiwgLTEsIEdfTUFYSU5ULAorICAgICAgICAgIERFRkFVTFRfTUFYX1JUQ1BfUlRQX1RJTUVfRElGRiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JGQzcyNzNfU1lOQywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgicmZjNzI3My1zeW5jIiwgIlN5bmMgb24gUkZDNzI3MyBjbG9jayIsCisgICAgICAgICAgIlN5bmNocm9uaXplIHJlY2VpdmVkIHN0cmVhbXMgdG8gdGhlIFJGQzcyNzMgY2xvY2sgIgorICAgICAgICAgICIocmVxdWlyZXMgY2xvY2sgYW5kIG9mZnNldCB0byBiZSBwcm92aWRlZCkiLCBERUZBVUxUX1JGQzcyNzNfU1lOQywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOmZhc3RzdGFydC1taW4tcGFja2V0cworICAgKgorICAgKiBUaGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHBhY2tldHMgbmVlZGVkIHRvIHN0YXJ0IChzZXQgdG8gMCB0bworICAgKiBkaXNhYmxlIGZhc3RzdGFydC4gVGhlIGppdHRlcmJ1ZmZlciB3aWxsIGJ5IGRlZmF1bHQgc3RhcnQgYWZ0ZXIgdGhlCisgICAqIGxhdGVuY3kgaGFzIGVsYXBzZWQpCisgICAqCisgICAqIFNpbmNlOiAxLjE0CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0ZBU1RTVEFSVF9NSU5fUEFDS0VUUywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiZmFzdHN0YXJ0LW1pbi1wYWNrZXRzIiwgIkZhc3RzdGFydCBtaW5pbXVtIHBhY2tldHMiLAorICAgICAgICAgICJUaGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHBhY2tldHMgbmVlZGVkIHRvIHN0YXJ0IChzZXQgdG8gMCB0byAiCisgICAgICAgICAgImRpc2FibGUgZmFzdHN0YXJ0LiBUaGUgaml0dGVyYnVmZmVyIHdpbGwgYnkgZGVmYXVsdCBzdGFydCBhZnRlciAiCisgICAgICAgICAgInRoZSBsYXRlbmN5IGhhcyBlbGFwc2VkKSIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCBERUZBVUxUX0ZBU1RTVEFSVF9NSU5fUEFDS0VUUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOjpyZXF1ZXN0LXB0LW1hcDoKKyAgICogQGJ1ZmZlcjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBwdDogdGhlIHB0CisgICAqCisgICAqIFJlcXVlc3QgdGhlIHBheWxvYWQgdHlwZSBhcyAjR3N0Q2FwcyBmb3IgQHB0LgorICAgKi8KKyAgZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpZ25hbHNbU0lHTkFMX1JFUVVFU1RfUFRfTUFQXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJyZXF1ZXN0LXB0LW1hcCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBKaXR0ZXJCdWZmZXJDbGFzcywKKyAgICAgICAgICByZXF1ZXN0X3B0X21hcCksIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLAorICAgICAgR1NUX1RZUEVfQ0FQUywgMSwgR19UWVBFX1VJTlQpOworICAvKioKKyAgICogR3N0UnRwSml0dGVyQnVmZmVyOjpoYW5kbGUtc3luYzoKKyAgICogQGJ1ZmZlcjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzdHJ1Y3Q6IGEgR3N0U3RydWN0dXJlIGNvbnRhaW5pbmcgc3luYyB2YWx1ZXMuCisgICAqCisgICAqIEJlIG5vdGlmaWVkIG9mIG5ldyBzeW5jIHZhbHVlcy4KKyAgICovCisgIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaWduYWxzW1NJR05BTF9IQU5ETEVfU1lOQ10gPQorICAgICAgZ19zaWduYWxfbmV3ICgiaGFuZGxlLXN5bmMiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwSml0dGVyQnVmZmVyQ2xhc3MsCisgICAgICAgICAgaGFuZGxlX3N5bmMpLCBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fQk9YRUQsCisgICAgICBHX1RZUEVfTk9ORSwgMSwgR1NUX1RZUEVfU1RSVUNUVVJFIHwgR19TSUdOQUxfVFlQRV9TVEFUSUNfU0NPUEUpOworCisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6Om9uLW5wdC1zdG9wOgorICAgKiBAYnVmZmVyOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICoKKyAgICogU2lnbmFsIHRoYXQgdGhlIGppdHRlcmJ1ZmVyIGhhcyBwdXNoZWQgdGhlIFJUUCBwYWNrZXQgdGhhdCBjb3JyZXNwb25kcyB0bworICAgKiB0aGUgbnB0LXN0b3AgcG9zaXRpb24uCisgICAqLworICBnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2lnbmFsc1tTSUdOQUxfT05fTlBUX1NUT1BdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLW5wdC1zdG9wIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cEppdHRlckJ1ZmZlckNsYXNzLAorICAgICAgICAgIG9uX25wdF9zdG9wKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1ZPSUQsCisgICAgICBHX1RZUEVfTk9ORSwgMCwgR19UWVBFX05PTkUpOworCisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6OmNsZWFyLXB0LW1hcDoKKyAgICogQGJ1ZmZlcjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqCisgICAqIEludmFsaWRhdGUgdGhlIGNsb2NrLXJhdGUgYXMgb2J0YWluZWQgd2l0aCB0aGUKKyAgICogI0dzdFJ0cEppdHRlckJ1ZmZlcjo6cmVxdWVzdC1wdC1tYXAgc2lnbmFsLgorICAgKi8KKyAgZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpZ25hbHNbU0lHTkFMX0NMRUFSX1BUX01BUF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgiY2xlYXItcHQtbWFwIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNUIHwgR19TSUdOQUxfQUNUSU9OLAorICAgICAgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBKaXR0ZXJCdWZmZXJDbGFzcywgY2xlYXJfcHRfbWFwKSwgTlVMTCwgTlVMTCwKKyAgICAgIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19WT0lELCBHX1RZUEVfTk9ORSwgMCwgR19UWVBFX05PTkUpOworCisgIC8qKgorICAgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6OnNldC1hY3RpdmU6CisgICAqIEBidWZmZXI6IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKgorICAgKiBTdGFydCBwdXNoaW5nIG91dCBwYWNrZXRzIHdpdGggdGhlIGdpdmVuIGJhc2UgdGltZS4gVGhpcyBzaWduYWwgaXMgb25seQorICAgKiB1c2VmdWwgaW4gYnVmZmVyaW5nIG1vZGUuCisgICAqCisgICAqIFJldHVybnM6IHRoZSB0aW1lIG9mIHRoZSBsYXN0IHB1c2hlZCBwYWNrZXQuCisgICAqLworICBnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2lnbmFsc1tTSUdOQUxfU0VUX0FDVElWRV0gPQorICAgICAgZ19zaWduYWxfbmV3ICgic2V0LWFjdGl2ZSIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCB8IEdfU0lHTkFMX0FDVElPTiwKKyAgICAgIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwSml0dGVyQnVmZmVyQ2xhc3MsIHNldF9hY3RpdmUpLCBOVUxMLCBOVUxMLAorICAgICAgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9VSU5UNjQsIDIsIEdfVFlQRV9CT09MRUFOLAorICAgICAgR19UWVBFX1VJTlQ2NCk7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhbmdlX3N0YXRlKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVxdWVzdF9uZXdfcGFkID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfcmVxdWVzdF9uZXdfcGFkKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVsZWFzZV9wYWQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9yZWxlYXNlX3BhZCk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPnByb3ZpZGVfY2xvY2sgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9wcm92aWRlX2Nsb2NrKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+c2V0X2Nsb2NrID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2V0X2Nsb2NrKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2ppdHRlcl9idWZmZXJfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2lua19ydGNwX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUUCBwYWNrZXQgaml0dGVyLWJ1ZmZlciIsICJGaWx0ZXIvTmV0d29yay9SVFAiLAorICAgICAgIkEgYnVmZmVyIHRoYXQgZGVhbHMgd2l0aCBuZXR3b3JrIGppdHRlciBhbmQgb3RoZXIgdHJhbnNtaXNzaW9uIGZhdWx0cyIsCisgICAgICAiUGhpbGlwcGUgS2FsYWYgPHBoaWxpcHBlLmthbGFmQGNvbGxhYm9yYS5jby51az4sICIKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGtsYXNzLT5jbGVhcl9wdF9tYXAgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2NsZWFyX3B0X21hcCk7CisgIGtsYXNzLT5zZXRfYWN0aXZlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zZXRfYWN0aXZlKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVAorICAgICAgKHJ0cGppdHRlcmJ1ZmZlcl9kZWJ1ZywgInJ0cGppdHRlcmJ1ZmZlciIsIDAsICJSVFAgSml0dGVyIEJ1ZmZlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2luaXQgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKworICBwcml2ID0gR1NUX1JUUF9KSVRURVJfQlVGRkVSX0dFVF9QUklWQVRFIChqaXR0ZXJidWZmZXIpOworICBqaXR0ZXJidWZmZXItPnByaXYgPSBwcml2OworCisgIHByaXYtPmxhdGVuY3lfbXMgPSBERUZBVUxUX0xBVEVOQ1lfTVM7CisgIHByaXYtPmxhdGVuY3lfbnMgPSBwcml2LT5sYXRlbmN5X21zICogR1NUX01TRUNPTkQ7CisgIHByaXYtPmRyb3Bfb25fbGF0ZW5jeSA9IERFRkFVTFRfRFJPUF9PTl9MQVRFTkNZOworICBwcml2LT50c19vZmZzZXQgPSBERUZBVUxUX1RTX09GRlNFVDsKKyAgcHJpdi0+bWF4X3RzX29mZnNldF9hZGp1c3RtZW50ID0gREVGQVVMVF9NQVhfVFNfT0ZGU0VUX0FESlVTVE1FTlQ7CisgIHByaXYtPmRvX2xvc3QgPSBERUZBVUxUX0RPX0xPU1Q7CisgIHByaXYtPmRvX3JldHJhbnNtaXNzaW9uID0gREVGQVVMVF9ET19SRVRSQU5TTUlTU0lPTjsKKyAgcHJpdi0+cnR4X25leHRfc2VxbnVtID0gREVGQVVMVF9SVFhfTkVYVF9TRVFOVU07CisgIHByaXYtPnJ0eF9kZWxheSA9IERFRkFVTFRfUlRYX0RFTEFZOworICBwcml2LT5ydHhfbWluX2RlbGF5ID0gREVGQVVMVF9SVFhfTUlOX0RFTEFZOworICBwcml2LT5ydHhfZGVsYXlfcmVvcmRlciA9IERFRkFVTFRfUlRYX0RFTEFZX1JFT1JERVI7CisgIHByaXYtPnJ0eF9yZXRyeV90aW1lb3V0ID0gREVGQVVMVF9SVFhfUkVUUllfVElNRU9VVDsKKyAgcHJpdi0+cnR4X21pbl9yZXRyeV90aW1lb3V0ID0gREVGQVVMVF9SVFhfTUlOX1JFVFJZX1RJTUVPVVQ7CisgIHByaXYtPnJ0eF9yZXRyeV9wZXJpb2QgPSBERUZBVUxUX1JUWF9SRVRSWV9QRVJJT0Q7CisgIHByaXYtPnJ0eF9tYXhfcmV0cmllcyA9IERFRkFVTFRfUlRYX01BWF9SRVRSSUVTOworICBwcml2LT5ydHhfZGVhZGxpbmVfbXMgPSBERUZBVUxUX1JUWF9ERUFETElORTsKKyAgcHJpdi0+cnR4X3N0YXRzX3RpbWVvdXQgPSBERUZBVUxUX1JUWF9TVEFUU19USU1FT1VUOworICBwcml2LT5tYXhfcnRjcF9ydHBfdGltZV9kaWZmID0gREVGQVVMVF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGOworICBwcml2LT5tYXhfZHJvcG91dF90aW1lID0gREVGQVVMVF9NQVhfRFJPUE9VVF9USU1FOworICBwcml2LT5tYXhfbWlzb3JkZXJfdGltZSA9IERFRkFVTFRfTUFYX01JU09SREVSX1RJTUU7CisgIHByaXYtPmZhc3RzdGFydF9taW5fcGFja2V0cyA9IERFRkFVTFRfRkFTVFNUQVJUX01JTl9QQUNLRVRTOworCisgIHByaXYtPnRzX29mZnNldF9yZW1haW5kZXIgPSAwOworICBwcml2LT5sYXN0X2R0cyA9IC0xOworICBwcml2LT5sYXN0X3B0cyA9IC0xOworICBwcml2LT5sYXN0X3J0cHRpbWUgPSAtMTsKKyAgcHJpdi0+YXZnX2ppdHRlciA9IDA7CisgIHByaXYtPnRpbWVycyA9IGdfYXJyYXlfbmV3IChGQUxTRSwgVFJVRSwgc2l6ZW9mIChUaW1lckRhdGEpKTsKKyAgcHJpdi0+cnR4X3N0YXRzX3RpbWVycyA9IHRpbWVyX3F1ZXVlX25ldyAoKTsKKyAgcHJpdi0+amJ1ZiA9IHJ0cF9qaXR0ZXJfYnVmZmVyX25ldyAoKTsKKyAgZ19tdXRleF9pbml0ICgmcHJpdi0+amJ1Zl9sb2NrKTsKKyAgZ19jb25kX2luaXQgKCZwcml2LT5qYnVmX3RpbWVyKTsKKyAgZ19jb25kX2luaXQgKCZwcml2LT5qYnVmX2V2ZW50KTsKKyAgZ19jb25kX2luaXQgKCZwcml2LT5qYnVmX3F1ZXJ5KTsKKyAgZ19xdWV1ZV9pbml0ICgmcHJpdi0+Z2FwX3BhY2tldHMpOworICBnc3Rfc2VnbWVudF9pbml0ICgmcHJpdi0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKworICAvKiByZXNldCBza2V3IGRldGVjdGlvbiBpbml0aWFseSAqLworICBydHBfaml0dGVyX2J1ZmZlcl9yZXNldF9za2V3IChwcml2LT5qYnVmKTsKKyAgcnRwX2ppdHRlcl9idWZmZXJfc2V0X2RlbGF5IChwcml2LT5qYnVmLCBwcml2LT5sYXRlbmN5X25zKTsKKyAgcnRwX2ppdHRlcl9idWZmZXJfc2V0X2J1ZmZlcmluZyAocHJpdi0+amJ1ZiwgRkFMU0UpOworICBwcml2LT5hY3RpdmUgPSBUUlVFOworCisgIHByaXYtPnNyY3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJmdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zcmNfdGVtcGxhdGUsCisgICAgICAic3JjIik7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZhdGVtb2RlX2Z1bmN0aW9uIChwcml2LT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NyY19hY3RpdmF0ZV9tb2RlKSk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChwcml2LT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NyY19xdWVyeSkpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAocHJpdi0+c3JjcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zcmNfZXZlbnQpKTsKKworICBwcml2LT5zaW5rcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpbmtfdGVtcGxhdGUsCisgICAgICAic2luayIpOworCisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChwcml2LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbikpOworICBnc3RfcGFkX3NldF9jaGFpbl9saXN0X2Z1bmN0aW9uIChwcml2LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbl9saXN0KSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChwcml2LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaW5rX2V2ZW50KSk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChwcml2LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaW5rX3F1ZXJ5KSk7CisKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKGppdHRlcmJ1ZmZlciksIHByaXYtPnNyY3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChqaXR0ZXJidWZmZXIpLCBwcml2LT5zaW5rcGFkKTsKKworICBHU1RfT0JKRUNUX0ZMQUdfU0VUIChqaXR0ZXJidWZmZXIsIEdTVF9FTEVNRU5UX0ZMQUdfUFJPVklERV9DTE9DSyk7Cit9CisKKyNkZWZpbmUgSVNfRFJPUEFCTEUoaXQpICgoKGl0KS0+dHlwZSA9PSBJVEVNX1RZUEVfQlVGRkVSKSB8fCAoKGl0KS0+dHlwZSA9PSBJVEVNX1RZUEVfTE9TVCkpCisKKyNkZWZpbmUgSVRFTV9UWVBFX0JVRkZFUiAgICAgICAgMAorI2RlZmluZSBJVEVNX1RZUEVfTE9TVCAgICAgICAgICAxCisjZGVmaW5lIElURU1fVFlQRV9FVkVOVCAgICAgICAgIDIKKyNkZWZpbmUgSVRFTV9UWVBFX1FVRVJZICAgICAgICAgMworCitzdGF0aWMgUlRQSml0dGVyQnVmZmVySXRlbSAqCithbGxvY19pdGVtIChncG9pbnRlciBkYXRhLCBndWludCB0eXBlLCBHc3RDbG9ja1RpbWUgZHRzLCBHc3RDbG9ja1RpbWUgcHRzLAorICAgIGd1aW50IHNlcW51bSwgZ3VpbnQgY291bnQsIGd1aW50IHJ0cHRpbWUpCit7CisgIFJUUEppdHRlckJ1ZmZlckl0ZW0gKml0ZW07CisKKyAgaXRlbSA9IGdfc2xpY2VfbmV3IChSVFBKaXR0ZXJCdWZmZXJJdGVtKTsKKyAgaXRlbS0+ZGF0YSA9IGRhdGE7CisgIGl0ZW0tPm5leHQgPSBOVUxMOworICBpdGVtLT5wcmV2ID0gTlVMTDsKKyAgaXRlbS0+dHlwZSA9IHR5cGU7CisgIGl0ZW0tPmR0cyA9IGR0czsKKyAgaXRlbS0+cHRzID0gcHRzOworICBpdGVtLT5zZXFudW0gPSBzZXFudW07CisgIGl0ZW0tPmNvdW50ID0gY291bnQ7CisgIGl0ZW0tPnJ0cHRpbWUgPSBydHB0aW1lOworCisgIHJldHVybiBpdGVtOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9pdGVtIChSVFBKaXR0ZXJCdWZmZXJJdGVtICogaXRlbSkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoaXRlbSAhPSBOVUxMKTsKKworICBpZiAoaXRlbS0+ZGF0YSAmJiBpdGVtLT50eXBlICE9IElURU1fVFlQRV9RVUVSWSkKKyAgICBnc3RfbWluaV9vYmplY3RfdW5yZWYgKGl0ZW0tPmRhdGEpOworICBnX3NsaWNlX2ZyZWUgKFJUUEppdHRlckJ1ZmZlckl0ZW0sIGl0ZW0pOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9pdGVtX2FuZF9yZXRhaW5fZXZlbnRzIChSVFBKaXR0ZXJCdWZmZXJJdGVtICogaXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHTGlzdCAqKmwgPSB1c2VyX2RhdGE7CisKKyAgaWYgKGl0ZW0tPmRhdGEgJiYgaXRlbS0+dHlwZSA9PSBJVEVNX1RZUEVfRVZFTlQKKyAgICAgICYmIEdTVF9FVkVOVF9JU19TVElDS1kgKGl0ZW0tPmRhdGEpKSB7CisgICAgKmwgPSBnX2xpc3RfcHJlcGVuZCAoKmwsIGl0ZW0tPmRhdGEpOworICB9IGVsc2UgaWYgKGl0ZW0tPmRhdGEgJiYgaXRlbS0+dHlwZSAhPSBJVEVNX1RZUEVfUVVFUlkpIHsKKyAgICBnc3RfbWluaV9vYmplY3RfdW5yZWYgKGl0ZW0tPmRhdGEpOworICB9CisgIGdfc2xpY2VfZnJlZSAoUlRQSml0dGVyQnVmZmVySXRlbSwgaXRlbSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlciAqaml0dGVyYnVmZmVyOworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OworCisgIGppdHRlcmJ1ZmZlciA9IEdTVF9SVFBfSklUVEVSX0JVRkZFUiAob2JqZWN0KTsKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBnX2FycmF5X2ZyZWUgKHByaXYtPnRpbWVycywgVFJVRSk7CisgIHRpbWVyX3F1ZXVlX2ZyZWUgKHByaXYtPnJ0eF9zdGF0c190aW1lcnMpOworICBnX211dGV4X2NsZWFyICgmcHJpdi0+amJ1Zl9sb2NrKTsKKyAgZ19jb25kX2NsZWFyICgmcHJpdi0+amJ1Zl90aW1lcik7CisgIGdfY29uZF9jbGVhciAoJnByaXYtPmpidWZfZXZlbnQpOworICBnX2NvbmRfY2xlYXIgKCZwcml2LT5qYnVmX3F1ZXJ5KTsKKworICBydHBfaml0dGVyX2J1ZmZlcl9mbHVzaCAocHJpdi0+amJ1ZiwgKEdGdW5jKSBmcmVlX2l0ZW0sIE5VTEwpOworICBnX3F1ZXVlX2ZvcmVhY2ggKCZwcml2LT5nYXBfcGFja2V0cywgKEdGdW5jKSBnc3RfYnVmZmVyX3VucmVmLCBOVUxMKTsKKyAgZ19xdWV1ZV9jbGVhciAoJnByaXYtPmdhcF9wYWNrZXRzKTsKKyAgZ19vYmplY3RfdW5yZWYgKHByaXYtPmpidWYpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdEl0ZXJhdG9yICoKK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9pdGVyYXRlX2ludGVybmFsX2xpbmtzIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCkKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyICpqaXR0ZXJidWZmZXI7CisgIEdzdFBhZCAqb3RoZXJwYWQgPSBOVUxMOworICBHc3RJdGVyYXRvciAqaXQgPSBOVUxMOworICBHVmFsdWUgdmFsID0geyAwLCB9OworCisgIGppdHRlcmJ1ZmZlciA9IEdTVF9SVFBfSklUVEVSX0JVRkZFUl9DQVNUIChwYXJlbnQpOworCisgIGlmIChwYWQgPT0gaml0dGVyYnVmZmVyLT5wcml2LT5zaW5rcGFkKSB7CisgICAgb3RoZXJwYWQgPSBqaXR0ZXJidWZmZXItPnByaXYtPnNyY3BhZDsKKyAgfSBlbHNlIGlmIChwYWQgPT0gaml0dGVyYnVmZmVyLT5wcml2LT5zcmNwYWQpIHsKKyAgICBvdGhlcnBhZCA9IGppdHRlcmJ1ZmZlci0+cHJpdi0+c2lua3BhZDsKKyAgfSBlbHNlIGlmIChwYWQgPT0gaml0dGVyYnVmZmVyLT5wcml2LT5ydGNwc2lua3BhZCkgeworICAgIGl0ID0gZ3N0X2l0ZXJhdG9yX25ld19zaW5nbGUgKEdTVF9UWVBFX1BBRCwgTlVMTCk7CisgIH0KKworICBpZiAoaXQgPT0gTlVMTCkgeworICAgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR1NUX1RZUEVfUEFEKTsKKyAgICBnX3ZhbHVlX3NldF9vYmplY3QgKCZ2YWwsIG90aGVycGFkKTsKKyAgICBpdCA9IGdzdF9pdGVyYXRvcl9uZXdfc2luZ2xlIChHU1RfVFlQRV9QQUQsICZ2YWwpOworICAgIGdfdmFsdWVfdW5zZXQgKCZ2YWwpOworICB9CisKKyAgcmV0dXJuIGl0OworfQorCitzdGF0aWMgR3N0UGFkICoKK2NyZWF0ZV9ydGNwX3NpbmsgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImNyZWF0aW5nIFJUQ1Agc2luayBwYWQiKTsKKworICBwcml2LT5ydGNwc2lua3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZQorICAgICAgKCZnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2lua19ydGNwX3RlbXBsYXRlLCAic2lua19ydGNwIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChwcml2LT5ydGNwc2lua3BhZCwKKyAgICAgIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbl9ydGNwKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHByaXYtPnJ0Y3BzaW5rcGFkLAorICAgICAgKEdzdFBhZEV2ZW50RnVuY3Rpb24pIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaW5rX3J0Y3BfZXZlbnQpOworICBnc3RfcGFkX3NldF9pdGVyYXRlX2ludGVybmFsX2xpbmtzX2Z1bmN0aW9uIChwcml2LT5ydGNwc2lua3BhZCwKKyAgICAgIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9pdGVyYXRlX2ludGVybmFsX2xpbmtzKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChwcml2LT5ydGNwc2lua3BhZCwgVFJVRSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKGppdHRlcmJ1ZmZlciksIHByaXYtPnJ0Y3BzaW5rcGFkKTsKKworICByZXR1cm4gcHJpdi0+cnRjcHNpbmtwYWQ7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfcnRjcF9zaW5rIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXY7CisKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJyZW1vdmluZyBSVENQIHNpbmsgcGFkIik7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChwcml2LT5ydGNwc2lua3BhZCwgRkFMU0UpOworCisgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKGppdHRlcmJ1ZmZlciksIHByaXYtPnJ0Y3BzaW5rcGFkKTsKKyAgcHJpdi0+cnRjcHNpbmtwYWQgPSBOVUxMOworfQorCitzdGF0aWMgR3N0UGFkICoKK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyICpqaXR0ZXJidWZmZXI7CisgIEdzdEVsZW1lbnRDbGFzcyAqa2xhc3M7CisgIEdzdFBhZCAqcmVzdWx0OworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICh0ZW1wbCAhPSBOVUxMLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19SVFBfSklUVEVSX0JVRkZFUiAoZWxlbWVudCksIE5VTEwpOworCisgIGppdHRlcmJ1ZmZlciA9IEdTVF9SVFBfSklUVEVSX0JVRkZFUl9DQVNUIChlbGVtZW50KTsKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKyAga2xhc3MgPSBHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKGVsZW1lbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVsZW1lbnQsICJyZXF1ZXN0aW5nIHBhZCAlcyIsIEdTVF9TVFJfTlVMTCAobmFtZSkpOworCisgIC8qIGZpZ3VyZSBvdXQgdGhlIHRlbXBsYXRlICovCisgIGlmICh0ZW1wbCA9PSBnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywgInNpbmtfcnRjcCIpKSB7CisgICAgaWYgKHByaXYtPnJ0Y3BzaW5rcGFkICE9IE5VTEwpCisgICAgICBnb3RvIGV4aXN0czsKKworICAgIHJlc3VsdCA9IGNyZWF0ZV9ydGNwX3NpbmsgKGppdHRlcmJ1ZmZlcik7CisgIH0gZWxzZQorICAgIGdvdG8gd3JvbmdfdGVtcGxhdGU7CisKKyAgcmV0dXJuIHJlc3VsdDsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX3RlbXBsYXRlOgorICB7CisgICAgZ193YXJuaW5nICgicnRwaml0dGVyYnVmZmVyOiB0aGlzIGlzIG5vdCBvdXIgdGVtcGxhdGUiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorZXhpc3RzOgorICB7CisgICAgZ193YXJuaW5nICgicnRwaml0dGVyYnVmZmVyOiBwYWQgYWxyZWFkeSByZXF1ZXN0ZWQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXIgKmppdHRlcmJ1ZmZlcjsKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfUlRQX0pJVFRFUl9CVUZGRVIgKGVsZW1lbnQpKTsKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1BBRCAocGFkKSk7CisKKyAgaml0dGVyYnVmZmVyID0gR1NUX1JUUF9KSVRURVJfQlVGRkVSX0NBU1QgKGVsZW1lbnQpOworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVsZW1lbnQsICJyZWxlYXNpbmcgcGFkICVzOiVzIiwgR1NUX0RFQlVHX1BBRF9OQU1FIChwYWQpKTsKKworICBpZiAocHJpdi0+cnRjcHNpbmtwYWQgPT0gcGFkKSB7CisgICAgcmVtb3ZlX3J0Y3Bfc2luayAoaml0dGVyYnVmZmVyKTsKKyAgfSBlbHNlCisgICAgZ290byB3cm9uZ19wYWQ7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLword3JvbmdfcGFkOgorICB7CisgICAgZ193YXJuaW5nICgiZ3N0aml0dGVyYnVmZmVyOiBhc2tlZCB0byByZWxlYXNlIGFuIHVua25vd24gcGFkIik7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyBHc3RDbG9jayAqCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfcHJvdmlkZV9jbG9jayAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIHJldHVybiBnc3Rfc3lzdGVtX2Nsb2NrX29idGFpbiAoKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2V0X2Nsb2NrIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0Q2xvY2sgKiBjbG9jaykKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyICpqaXR0ZXJidWZmZXIgPSBHU1RfUlRQX0pJVFRFUl9CVUZGRVIgKGVsZW1lbnQpOworCisgIHJ0cF9qaXR0ZXJfYnVmZmVyX3NldF9waXBlbGluZV9jbG9jayAoaml0dGVyYnVmZmVyLT5wcml2LT5qYnVmLCBjbG9jayk7CisKKyAgcmV0dXJuIEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zZXRfY2xvY2sgKGVsZW1lbnQsIGNsb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9jbGVhcl9wdF9tYXAgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIC8qIHRoaXMgd2lsbCB0cmlnZ2VyIGEgbmV3IHB0LW1hcCByZXF1ZXN0IHNpZ25hbCwgRklYTUUsIGRvIHNvbWV0aGluZyBiZXR0ZXIuICovCisKKyAgSkJVRl9MT0NLIChwcml2KTsKKyAgcHJpdi0+Y2xvY2tfcmF0ZSA9IC0xOworICAvKiBkbyBub3QgY2xlYXIgY3VycmVudCBjb250ZW50LCBidXQgcmVmcmVzaCBzdGF0ZSBmb3IgbmV3IGFycml2YWwgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAicmVzZXQgaml0dGVyYnVmZmVyIik7CisgIHJ0cF9qaXR0ZXJfYnVmZmVyX3Jlc2V0X3NrZXcgKHByaXYtPmpidWYpOworICBKQlVGX1VOTE9DSyAocHJpdik7Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9zZXRfYWN0aXZlIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqYnVmLCBnYm9vbGVhbiBhY3RpdmUsCisgICAgZ3VpbnQ2NCBvZmZzZXQpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXY7CisgIEdzdENsb2NrVGltZSBsYXN0X291dDsKKyAgUlRQSml0dGVyQnVmZmVySXRlbSAqaXRlbTsKKworICBwcml2ID0gamJ1Zi0+cHJpdjsKKworICBKQlVGX0xPQ0sgKHByaXYpOworICBHU1RfREVCVUdfT0JKRUNUIChqYnVmLCAic2V0dGluZyBhY3RpdmUgJWQgd2l0aCBvZmZzZXQgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgYWN0aXZlLCBHU1RfVElNRV9BUkdTIChvZmZzZXQpKTsKKworICBpZiAoYWN0aXZlICE9IHByaXYtPmFjdGl2ZSkgeworICAgIC8qIGFkZCB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gcGF1c2VkIHRvIHRoZSBvdXRwdXQgb2Zmc2V0LiBBbGwKKyAgICAgKiBvdXRnb2luZyBidWZmZXJzIHdpbGwgaGF2ZSB0aGlzIG9mZnNldCBhcHBsaWVkIHRvIHRoZWlyIHRpbWVzdGFtcHMgaW4KKyAgICAgKiBvcmRlciB0byBtYWtlIHRoZW0gYXJyaXZlIGluIHRpbWUgaW4gdGhlIHNpbmsuICovCisgICAgcHJpdi0+b3V0X29mZnNldCA9IG9mZnNldDsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqYnVmLCAib3V0IG9mZnNldCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHByaXYtPm91dF9vZmZzZXQpKTsKKyAgICBwcml2LT5hY3RpdmUgPSBhY3RpdmU7CisgICAgSkJVRl9TSUdOQUxfRVZFTlQgKHByaXYpOworICB9CisgIGlmICghYWN0aXZlKSB7CisgICAgcnRwX2ppdHRlcl9idWZmZXJfc2V0X2J1ZmZlcmluZyAocHJpdi0+amJ1ZiwgVFJVRSk7CisgIH0KKyAgaWYgKChpdGVtID0gcnRwX2ppdHRlcl9idWZmZXJfcGVlayAocHJpdi0+amJ1ZikpKSB7CisgICAgLyogaGVhZCBidWZmZXIgdGltZXN0YW1wIGFuZCBvZmZzZXQgZ2l2ZXMgb3VyIG91dHB1dCB0aW1lICovCisgICAgbGFzdF9vdXQgPSBpdGVtLT5wdHMgKyBwcml2LT50c19vZmZzZXQ7CisgIH0gZWxzZSB7CisgICAgLyogdXNlIGxhc3Qga25vd24gdGltZSB3aGVuIHRoZSBidWZmZXIgaXMgZW1wdHkgKi8KKyAgICBsYXN0X291dCA9IHByaXYtPmxhc3Rfb3V0X3RpbWU7CisgIH0KKyAgSkJVRl9VTkxPQ0sgKHByaXYpOworCisgIHJldHVybiBsYXN0X291dDsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2dldGNhcHMgKEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyICpqaXR0ZXJidWZmZXI7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXY7CisgIEdzdFBhZCAqb3RoZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdENhcHMgKnRlbXBsOworCisgIGppdHRlcmJ1ZmZlciA9IEdTVF9SVFBfSklUVEVSX0JVRkZFUiAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBvdGhlciA9IChwYWQgPT0gcHJpdi0+c3JjcGFkID8gcHJpdi0+c2lua3BhZCA6IHByaXYtPnNyY3BhZCk7CisKKyAgY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChvdGhlciwgZmlsdGVyKTsKKworICB0ZW1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChwYWQpOworICBpZiAoY2FwcyA9PSBOVUxMKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAidXNlIHRlbXBsYXRlIik7CisgICAgY2FwcyA9IHRlbXBsOworICB9IGVsc2UgeworICAgIEdzdENhcHMgKmludGVyc2VjdDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImludGVyc2VjdCB3aXRoIHRlbXBsYXRlIik7CisKKyAgICBpbnRlcnNlY3QgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKGNhcHMsIHRlbXBsKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRlbXBsKTsKKworICAgIGNhcHMgPSBpbnRlcnNlY3Q7CisgIH0KKyAgZ3N0X29iamVjdF91bnJlZiAoaml0dGVyYnVmZmVyKTsKKworICByZXR1cm4gY2FwczsKK30KKworLyoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggSkJVRl9MT0NLIGhlbGQKKyAqLworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9qaXR0ZXJfYnVmZmVyX3NpbmtfcGFyc2VfY2FwcyAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLAorICAgIEdzdENhcHMgKiBjYXBzLCBnaW50IHB0KQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OworICBHc3RTdHJ1Y3R1cmUgKmNhcHNfc3RydWN0OworICBndWludCB2YWw7CisgIGdpbnQgcGF5bG9hZCA9IC0xOworICBHc3RDbG9ja1RpbWUgdHZhbDsKKyAgY29uc3QgZ2NoYXIgKnRzX3JlZmNsaywgKm1lZGlhY2xrOworCisgIHByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisKKyAgLyogZmlyc3QgcGFyc2UgdGhlIGNhcHMgKi8KKyAgY2Fwc19zdHJ1Y3QgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJnb3QgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoY2Fwc19zdHJ1Y3QsICJwYXlsb2FkIiwgJnBheWxvYWQpICYmIHB0ICE9IC0xCisgICAgICAmJiBwYXlsb2FkICE9IHB0KSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgICAiR290IGNhcHMgd2l0aCB3cm9uZyBwYXlsb2FkIHR5cGUgKGdvdCAlZCwgZXhwZWN0ZWQgJWQpIiwgcHQsIHBheWxvYWQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmIChwYXlsb2FkICE9IC0xKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiR290IHBheWxvYWQgdHlwZSAlZCIsIHBheWxvYWQpOworICAgIHByaXYtPmxhc3RfcHQgPSBwYXlsb2FkOworICB9CisKKyAgLyogd2UgbmVlZCBhIGNsb2NrLXJhdGUgdG8gY29udmVydCB0aGUgcnRwIHRpbWVzdGFtcHMgdG8gR1N0cmVhbWVyIHRpbWUgYW5kIHRvCisgICAqIG1lYXN1cmUgdGhlIGFtb3VudCBvZiBkYXRhIGluIHRoZSBidWZmZXIgKi8KKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKGNhcHNfc3RydWN0LCAiY2xvY2stcmF0ZSIsICZwcml2LT5jbG9ja19yYXRlKSkKKyAgICBnb3RvIGVycm9yOworCisgIGlmIChwcml2LT5jbG9ja19yYXRlIDw9IDApCisgICAgZ290byB3cm9uZ19yYXRlOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImdvdCBjbG9jay1yYXRlICVkIiwgcHJpdi0+Y2xvY2tfcmF0ZSk7CisKKyAgcnRwX2ppdHRlcl9idWZmZXJfc2V0X2Nsb2NrX3JhdGUgKHByaXYtPmpidWYsIHByaXYtPmNsb2NrX3JhdGUpOworCisgIGdzdF9ydHBfcGFja2V0X3JhdGVfY3R4X3Jlc2V0ICgmcHJpdi0+cGFja2V0X3JhdGVfY3R4LCBwcml2LT5jbG9ja19yYXRlKTsKKworICAvKiBUaGUgY2xvY2sgYmFzZSBpcyB0aGUgUlRQIHRpbWVzdGFtcCBjb3Jyc3BvbmRpbmcgdG8gdGhlIG5wdC1zdGFydCB2YWx1ZS4gV2UKKyAgICogY2FuIHVzZSB0aGlzIHRvIHRyYWNrIHRoZSBhbW91bnQgb2YgdGltZSBlbGFwc2VkIG9uIHRoZSBzZW5kZXIuICovCisgIGlmIChnc3Rfc3RydWN0dXJlX2dldF91aW50IChjYXBzX3N0cnVjdCwgImNsb2NrLWJhc2UiLCAmdmFsKSkKKyAgICBwcml2LT5jbG9ja19iYXNlID0gdmFsOworICBlbHNlCisgICAgcHJpdi0+Y2xvY2tfYmFzZSA9IC0xOworCisgIHByaXYtPmV4dF90aW1lc3RhbXAgPSBwcml2LT5jbG9ja19iYXNlOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImdvdCBjbG9jay1iYXNlICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgIHByaXYtPmNsb2NrX2Jhc2UpOworCisgIGlmIChnc3Rfc3RydWN0dXJlX2dldF91aW50IChjYXBzX3N0cnVjdCwgInNlcW51bS1iYXNlIiwgJnZhbCkpIHsKKyAgICAvKiBmaXJzdCBleHBlY3RlZCBzZXFudW0sIG9ubHkgdXBkYXRlIHdoZW4gd2UgZGlkbid0IGhhdmUgYSBwcmV2aW91cyBiYXNlLiAqLworICAgIGlmIChwcml2LT5uZXh0X2luX3NlcW51bSA9PSAtMSkKKyAgICAgIHByaXYtPm5leHRfaW5fc2VxbnVtID0gdmFsOworICAgIGlmIChwcml2LT5uZXh0X3NlcW51bSA9PSAtMSkgeworICAgICAgcHJpdi0+bmV4dF9zZXFudW0gPSB2YWw7CisgICAgICBKQlVGX1NJR05BTF9FVkVOVCAocHJpdik7CisgICAgfQorICAgIHByaXYtPnNlcW51bV9iYXNlID0gdmFsOworICB9IGVsc2UgeworICAgIHByaXYtPnNlcW51bV9iYXNlID0gLTE7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJnb3Qgc2VxbnVtLWJhc2UgJWQiLCBwcml2LT5uZXh0X2luX3NlcW51bSk7CisKKyAgLyogdGhlIHN0YXJ0IGFuZCBzdG9wIHRpbWVzLiBUaGUgc2VxbnVtLWJhc2UgY29ycmVzcG9uZHMgdG8gdGhlIHN0YXJ0IHRpbWUuIFdlCisgICAqIHdpbGwga2VlcCB0cmFjayBvZiB0aGUgc2VxbnVtcyBvbiB0aGUgb3V0cHV0IGFuZCB3aGVuIHdlIHJlYWNoIHRoZSBvbmUKKyAgICogY29ycmVzcG9uZGluZyB0byBucHQtc3RvcCwgd2UgZW1pdCB0aGUgbnB0LXN0b3AtcmVhY2hlZCBzaWduYWwgKi8KKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2Nsb2NrX3RpbWUgKGNhcHNfc3RydWN0LCAibnB0LXN0YXJ0IiwgJnR2YWwpKQorICAgIHByaXYtPm5wdF9zdGFydCA9IHR2YWw7CisgIGVsc2UKKyAgICBwcml2LT5ucHRfc3RhcnQgPSAwOworCisgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9jbG9ja190aW1lIChjYXBzX3N0cnVjdCwgIm5wdC1zdG9wIiwgJnR2YWwpKQorICAgIHByaXYtPm5wdF9zdG9wID0gdHZhbDsKKyAgZWxzZQorICAgIHByaXYtPm5wdF9zdG9wID0gLTE7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgIm5wdCBzdGFydC9zdG9wOiAlIiBHU1RfVElNRV9GT1JNQVQgIi0lIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChwcml2LT5ucHRfc3RhcnQpLCBHU1RfVElNRV9BUkdTIChwcml2LT5ucHRfc3RvcCkpOworCisgIGlmICgodHNfcmVmY2xrID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChjYXBzX3N0cnVjdCwgImEtdHMtcmVmY2xrIikpKSB7CisgICAgR3N0Q2xvY2sgKmNsb2NrID0gTlVMTDsKKyAgICBndWludDY0IGNsb2NrX29mZnNldCA9IC0xOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiSGF2ZSB0aW1lc3RhbXAgcmVmZXJlbmNlIGNsb2NrICVzIiwKKyAgICAgICAgdHNfcmVmY2xrKTsKKworICAgIGlmIChnX3N0cl9oYXNfcHJlZml4ICh0c19yZWZjbGssICJudHA9IikpIHsKKyAgICAgIGlmIChnX3N0cl9oYXNfcHJlZml4ICh0c19yZWZjbGssICJudHA9L3RyYWNlYWJsZS8iKSkgeworICAgICAgICBHU1RfRklYTUVfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJDYW4ndCBoYW5kbGUgdHJhY2VhYmxlIE5UUCBjbG9ja3MiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGdjaGFyICpob3N0LCAqcG9ydHN0cjsKKyAgICAgICAgZ2NoYXIgKmhvc3RuYW1lOworICAgICAgICBndWludCBwb3J0OworCisgICAgICAgIGhvc3QgPSB0c19yZWZjbGsgKyBzaXplb2YgKCJudHA9IikgLSAxOworICAgICAgICBpZiAoaG9zdFswXSA9PSAnWycpIHsKKyAgICAgICAgICAvKiBJUHY2ICovCisgICAgICAgICAgcG9ydHN0ciA9IHN0cmNociAoaG9zdCwgJ10nKTsKKyAgICAgICAgICBpZiAocG9ydHN0ciAmJiBwb3J0c3RyWzFdID09ICc6JykKKyAgICAgICAgICAgIHBvcnRzdHIgPSBwb3J0c3RyICsgMTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwb3J0c3RyID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwb3J0c3RyID0gc3RycmNociAoaG9zdCwgJzonKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKCFwb3J0c3RyIHx8IHNzY2FuZiAocG9ydHN0ciwgIjoldSIsICZwb3J0KSAhPSAxKQorICAgICAgICAgIHBvcnQgPSAxMjM7CisKKyAgICAgICAgaWYgKHBvcnRzdHIpCisgICAgICAgICAgaG9zdG5hbWUgPSBnX3N0cm5kdXAgKGhvc3QsIChwb3J0c3RyIC0gaG9zdCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgaG9zdG5hbWUgPSBnX3N0cmR1cCAoaG9zdCk7CisKKyAgICAgICAgY2xvY2sgPSBnc3RfbnRwX2Nsb2NrX25ldyAoTlVMTCwgaG9zdG5hbWUsIHBvcnQsIDApOworICAgICAgICBnX2ZyZWUgKGhvc3RuYW1lKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGdfc3RyX2hhc19wcmVmaXggKHRzX3JlZmNsaywgInB0cD1JRUVFMTU4OC0yMDA4OiIpKSB7CisgICAgICBjb25zdCBnY2hhciAqZG9tYWluc3RyID0KKyAgICAgICAgICB0c19yZWZjbGsgKyBzaXplb2YgKCJwdHA9SUVFRTE1ODgtMjAwODpYWC1YWC1YWC1YWC1YWC1YWC1YWC1YWCIpIC0gMTsKKyAgICAgIGd1aW50IGRvbWFpbjsKKworICAgICAgaWYgKGRvbWFpbnN0clswXSAhPSAnOicgfHwgc3NjYW5mIChkb21haW5zdHIsICI6JXUiLCAmZG9tYWluKSAhPSAxKQorICAgICAgICBkb21haW4gPSAwOworCisgICAgICBjbG9jayA9IGdzdF9wdHBfY2xvY2tfbmV3IChOVUxMLCBkb21haW4pOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfRklYTUVfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJVbnN1cHBvcnRlZCB0aW1lc3RhbXAgcmVmZXJlbmNlIGNsb2NrIik7CisgICAgfQorCisgICAgaWYgKChtZWRpYWNsayA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoY2Fwc19zdHJ1Y3QsICJhLW1lZGlhY2xrIikpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJHb3QgbWVkaWEgY2xvY2sgJXMiLCBtZWRpYWNsayk7CisKKyAgICAgIGlmICghZ19zdHJfaGFzX3ByZWZpeCAobWVkaWFjbGssICJkaXJlY3Q9IikKKyAgICAgICAgICB8fCBzc2NhbmYgKG1lZGlhY2xrLCAiZGlyZWN0PSUiIEdfR1VJTlQ2NF9GT1JNQVQsICZjbG9ja19vZmZzZXQpICE9IDEpCisgICAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIlVuc3VwcG9ydGVkIG1lZGlhIGNsb2NrIik7CisgICAgICBpZiAoc3Ryc3RyIChtZWRpYWNsaywgInJhdGU9IikgIT0gTlVMTCkgeworICAgICAgICBHU1RfRklYTUVfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJSYXRlIHByb3BlcnR5IG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgY2xvY2tfb2Zmc2V0ID0gLTE7CisgICAgICB9CisgICAgfQorCisgICAgcnRwX2ppdHRlcl9idWZmZXJfc2V0X21lZGlhX2Nsb2NrIChwcml2LT5qYnVmLCBjbG9jaywgY2xvY2tfb2Zmc2V0KTsKKyAgfSBlbHNlIHsKKyAgICBydHBfaml0dGVyX2J1ZmZlcl9zZXRfbWVkaWFfY2xvY2sgKHByaXYtPmpidWYsIE5VTEwsIC0xKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworZXJyb3I6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJObyBjbG9jay1yYXRlIGluIGNhcHMhIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ19yYXRlOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiSW52YWxpZCBjbG9jay1yYXRlICVkIiwgcHJpdi0+Y2xvY2tfcmF0ZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfZmx1c2hfc3RhcnQgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIEpCVUZfTE9DSyAocHJpdik7CisgIC8qIG1hcmsgb3Vyc2VsdmVzIGFzIGZsdXNoaW5nICovCisgIHByaXYtPnNyY3Jlc3VsdCA9IEdTVF9GTE9XX0ZMVVNISU5HOworICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJEaXNhYmxpbmcgcG9wIG9uIHF1ZXVlIik7CisgIC8qIHRoaXMgdW5ibG9ja3MgYW55IHdhaXRpbmcgcG9wcyBvbiB0aGUgc3JjIHBhZCB0YXNrICovCisgIEpCVUZfU0lHTkFMX0VWRU5UIChwcml2KTsKKyAgSkJVRl9TSUdOQUxfUVVFUlkgKHByaXYsIEZBTFNFKTsKKyAgSkJVRl9VTkxPQ0sgKHByaXYpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoX3N0b3AgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIEpCVUZfTE9DSyAocHJpdik7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIkVuYWJsaW5nIHBvcCBvbiBxdWV1ZSIpOworICAvKiBNYXJrIGFzIG5vbiBmbHVzaGluZyAqLworICBwcml2LT5zcmNyZXN1bHQgPSBHU1RfRkxPV19PSzsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnByaXYtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIHByaXYtPmxhc3RfcG9wcGVkX3NlcW51bSA9IC0xOworICBwcml2LT5sYXN0X291dF90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgcHJpdi0+bmV4dF9zZXFudW0gPSAtMTsKKyAgcHJpdi0+c2VxbnVtX2Jhc2UgPSAtMTsKKyAgcHJpdi0+aXBzX3J0cHRpbWUgPSAtMTsKKyAgcHJpdi0+aXBzX3B0cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIHByaXYtPnBhY2tldF9zcGFjaW5nID0gMDsKKyAgcHJpdi0+bmV4dF9pbl9zZXFudW0gPSAtMTsKKyAgcHJpdi0+Y2xvY2tfcmF0ZSA9IC0xOworICBwcml2LT5sYXN0X3B0ID0gLTE7CisgIHByaXYtPmVvcyA9IEZBTFNFOworICBwcml2LT5lc3RpbWF0ZWRfZW9zID0gLTE7CisgIHByaXYtPmxhc3RfZWxhcHNlZCA9IDA7CisgIHByaXYtPmV4dF90aW1lc3RhbXAgPSAtMTsKKyAgcHJpdi0+YXZnX2ppdHRlciA9IDA7CisgIHByaXYtPmxhc3RfZHRzID0gLTE7CisgIHByaXYtPmxhc3RfcnRwdGltZSA9IC0xOworICBwcml2LT5sYXN0X2luX3B0cyA9IDA7CisgIHByaXYtPmVxdWlkaXN0YW50ID0gMDsKKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiZmx1c2ggYW5kIHJlc2V0IGppdHRlcmJ1ZmZlciIpOworICBydHBfaml0dGVyX2J1ZmZlcl9mbHVzaCAocHJpdi0+amJ1ZiwgKEdGdW5jKSBmcmVlX2l0ZW0sIE5VTEwpOworICBydHBfaml0dGVyX2J1ZmZlcl9kaXNhYmxlX2J1ZmZlcmluZyAocHJpdi0+amJ1ZiwgRkFMU0UpOworICBydHBfaml0dGVyX2J1ZmZlcl9yZXNldF9za2V3IChwcml2LT5qYnVmKTsKKyAgcmVtb3ZlX2FsbF90aW1lcnMgKGppdHRlcmJ1ZmZlcik7CisgIGdfcXVldWVfZm9yZWFjaCAoJnByaXYtPmdhcF9wYWNrZXRzLCAoR0Z1bmMpIGdzdF9idWZmZXJfdW5yZWYsIE5VTEwpOworICBnX3F1ZXVlX2NsZWFyICgmcHJpdi0+Z2FwX3BhY2tldHMpOworICBKQlVGX1VOTE9DSyAocHJpdik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NyY19hY3RpdmF0ZV9tb2RlIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSkKK3sKKyAgZ2Jvb2xlYW4gcmVzdWx0OworICBHc3RSdHBKaXR0ZXJCdWZmZXIgKmppdHRlcmJ1ZmZlciA9IE5VTEw7CisKKyAgaml0dGVyYnVmZmVyID0gR1NUX1JUUF9KSVRURVJfQlVGRkVSIChwYXJlbnQpOworCisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgR1NUX1BBRF9NT0RFX1BVU0g6CisgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgIC8qIGFsbG93IGRhdGEgcHJvY2Vzc2luZyAqLworICAgICAgICBnc3RfcnRwX2ppdHRlcl9idWZmZXJfZmx1c2hfc3RvcCAoaml0dGVyYnVmZmVyKTsKKworICAgICAgICAvKiBzdGFydCBwdXNoaW5nIG91dCBidWZmZXJzICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIlN0YXJ0aW5nIHRhc2sgb24gc3JjcGFkIik7CisgICAgICAgIHJlc3VsdCA9IGdzdF9wYWRfc3RhcnRfdGFzayAoaml0dGVyYnVmZmVyLT5wcml2LT5zcmNwYWQsCisgICAgICAgICAgICAoR3N0VGFza0Z1bmN0aW9uKSBnc3RfcnRwX2ppdHRlcl9idWZmZXJfbG9vcCwgaml0dGVyYnVmZmVyLCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIG1ha2Ugc3VyZSBhbGwgZGF0YSBwcm9jZXNzaW5nIHN0b3BzIEFTQVAgKi8KKyAgICAgICAgZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoX3N0YXJ0IChqaXR0ZXJidWZmZXIpOworCisgICAgICAgIC8qIE5PVEUgdGhpcyB3aWxsIGhhcmRsb2NrIGlmIHRoZSBzdGF0ZSBjaGFuZ2UgaXMgY2FsbGVkIGZyb20gdGhlIHNyYyBwYWQKKyAgICAgICAgICogdGFzayB0aHJlYWQgYmVjYXVzZSB3ZSB3aWxsIF9qb2luKCkgdGhlIHRocmVhZC4gKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiU3RvcHBpbmcgdGFzayBvbiBzcmNwYWQiKTsKKyAgICAgICAgcmVzdWx0ID0gZ3N0X3BhZF9zdG9wX3Rhc2sgKHBhZCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlciAqaml0dGVyYnVmZmVyOworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1M7CisKKyAgaml0dGVyYnVmZmVyID0gR1NUX1JUUF9KSVRURVJfQlVGRkVSIChlbGVtZW50KTsKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgLyogcmVzZXQgbmVnb3RpYXRlZCB2YWx1ZXMgKi8KKyAgICAgIHByaXYtPmNsb2NrX3JhdGUgPSAtMTsKKyAgICAgIHByaXYtPmNsb2NrX2Jhc2UgPSAtMTsKKyAgICAgIHByaXYtPnBlZXJfbGF0ZW5jeSA9IDA7CisgICAgICBwcml2LT5sYXN0X3B0ID0gLTE7CisgICAgICAvKiBibG9jayB1bnRpbCB3ZSBnbyB0byBQTEFZSU5HICovCisgICAgICBwcml2LT5ibG9ja2VkID0gVFJVRTsKKyAgICAgIHByaXYtPnRpbWVyX3J1bm5pbmcgPSBUUlVFOworICAgICAgcHJpdi0+dGltZXJfdGhyZWFkID0KKyAgICAgICAgICBnX3RocmVhZF9uZXcgKCJ0aW1lciIsIChHVGhyZWFkRnVuYykgd2FpdF9uZXh0X3RpbWVvdXQsIGppdHRlcmJ1ZmZlcik7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgLyogdW5ibG9jayB0byBhbGxvdyBzdHJlYW1pbmcgaW4gUExBWUlORyAqLworICAgICAgcHJpdi0+YmxvY2tlZCA9IEZBTFNFOworICAgICAgSkJVRl9TSUdOQUxfRVZFTlQgKHByaXYpOworICAgICAgSkJVRl9TSUdOQUxfVElNRVIgKHByaXYpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIC8qIHdlIGFyZSBhIGxpdmUgZWxlbWVudCBiZWNhdXNlIHdlIHN5bmMgdG8gdGhlIGNsb2NrLCB3aGljaCB3ZSBjYW4gb25seQorICAgICAgICogZG8gaW4gdGhlIFBMQVlJTkcgc3RhdGUgKi8KKyAgICAgIGlmIChyZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKQorICAgICAgICByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX05PX1BSRVJPTEw7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUExBWUlOR19UT19QQVVTRUQ6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgLyogYmxvY2sgdG8gc3RvcCBzdHJlYW1pbmcgd2hlbiBQQVVTRUQgKi8KKyAgICAgIHByaXYtPmJsb2NrZWQgPSBUUlVFOworICAgICAgdW5zY2hlZHVsZV9jdXJyZW50X3RpbWVyIChqaXR0ZXJidWZmZXIpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgaWYgKHJldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpCisgICAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfTk9fUFJFUk9MTDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmcHJpdi0+bGFzdF9zciwgTlVMTCk7CisgICAgICBwcml2LT50aW1lcl9ydW5uaW5nID0gRkFMU0U7CisgICAgICB1bnNjaGVkdWxlX2N1cnJlbnRfdGltZXIgKGppdHRlcmJ1ZmZlcik7CisgICAgICBKQlVGX1NJR05BTF9USU1FUiAocHJpdik7CisgICAgICBKQlVGX1NJR05BTF9RVUVSWSAocHJpdiwgRkFMU0UpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgZ190aHJlYWRfam9pbiAocHJpdi0+dGltZXJfdGhyZWFkKTsKKyAgICAgIHByaXYtPnRpbWVyX3RocmVhZCA9IE5VTEw7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKyAgR3N0UnRwSml0dGVyQnVmZmVyICpqaXR0ZXJidWZmZXI7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXY7CisKKyAgaml0dGVyYnVmZmVyID0gR1NUX1JUUF9KSVRURVJfQlVGRkVSX0NBU1QgKHBhcmVudCk7CisgIHByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAicmVjZWl2ZWQgJXMiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0xBVEVOQ1k6CisgICAgeworICAgICAgR3N0Q2xvY2tUaW1lIGxhdGVuY3k7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9sYXRlbmN5IChldmVudCwgJmxhdGVuY3kpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAgICAgImNvbmZpZ3VyaW5nIGxhdGVuY3kgb2YgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChsYXRlbmN5KSk7CisKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICAvKiBhZGp1c3QgdGhlIG92ZXJhbGwgYnVmZmVyIGRlbGF5IHRvIHRoZSB0b3RhbCBwaXBlbGluZSBsYXRlbmN5IGluCisgICAgICAgKiBidWZmZXJpbmcgbW9kZSBiZWNhdXNlIGlmIGRvd25zdHJlYW0gY29uc3VtZXMgdG9vIGZhc3QgKGJlY2F1c2Ugb2YKKyAgICAgICAqIGxhcmdlIGxhdGVuY3kgb3IgcXVldWVzLCB3ZSB3b3VsZCBzdGFydCByZWJ1ZmZlcmluZyBhZ2Fpbi4gKi8KKyAgICAgIGlmIChydHBfaml0dGVyX2J1ZmZlcl9nZXRfbW9kZSAocHJpdi0+amJ1ZikgPT0KKyAgICAgICAgICBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX0JVRkZFUikgeworICAgICAgICBydHBfaml0dGVyX2J1ZmZlcl9zZXRfZGVsYXkgKHByaXYtPmpidWYsIGxhdGVuY3kpOworICAgICAgfQorICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworCisgICAgICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHByaXYtPnNpbmtwYWQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChwcml2LT5zaW5rcGFkLCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qIGhhbmRsZXMgYW5kIHN0b3JlcyB0aGUgZXZlbnQgaW4gdGhlIGppdHRlcmJ1ZmZlciwgbXVzdCBiZSBjYWxsZWQgd2l0aAorICogTE9DSyAqLworc3RhdGljIGdib29sZWFuCitxdWV1ZV9ldmVudCAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworICBSVFBKaXR0ZXJCdWZmZXJJdGVtICppdGVtOworICBnYm9vbGVhbiBoZWFkOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICBnc3Rfaml0dGVyX2J1ZmZlcl9zaW5rX3BhcnNlX2NhcHMgKGppdHRlcmJ1ZmZlciwgY2FwcywgLTEpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgeworICAgICAgR3N0U2VnbWVudCBzZWdtZW50OworICAgICAgZ3N0X2V2ZW50X2NvcHlfc2VnbWVudCAoZXZlbnQsICZzZWdtZW50KTsKKworICAgICAgLyogd2UgbmVlZCB0aW1lIGZvciBub3cgKi8KKyAgICAgIGlmIChzZWdtZW50LmZvcm1hdCAhPSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiaWdub3Jpbmcgbm9uLVRJTUUgbmV3c2VnbWVudCIpOworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKworICAgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KTsKKyAgICAgIH0KKworICAgICAgcHJpdi0+c2VnbWVudCA9IHNlZ21lbnQ7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRU9TOgorICAgICAgcHJpdi0+ZW9zID0gVFJVRTsKKyAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2Rpc2FibGVfYnVmZmVyaW5nIChwcml2LT5qYnVmLCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisKKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiYWRkaW5nIGV2ZW50Iik7CisgIGl0ZW0gPSBhbGxvY19pdGVtIChldmVudCwgSVRFTV9UWVBFX0VWRU5ULCAtMSwgLTEsIC0xLCAwLCAtMSk7CisgIHJ0cF9qaXR0ZXJfYnVmZmVyX2luc2VydCAocHJpdi0+amJ1ZiwgaXRlbSwgJmhlYWQsIE5VTEwpOworICBpZiAoaGVhZCkKKyAgICBKQlVGX1NJR05BTF9FVkVOVCAocHJpdik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIEdzdFJ0cEppdHRlckJ1ZmZlciAqaml0dGVyYnVmZmVyOworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OworCisgIGppdHRlcmJ1ZmZlciA9IEdTVF9SVFBfSklUVEVSX0JVRkZFUiAocGFyZW50KTsKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJyZWNlaXZlZCAlcyIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RBUlQ6CisgICAgICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHByaXYtPnNyY3BhZCwgZXZlbnQpOworICAgICAgZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoX3N0YXJ0IChqaXR0ZXJidWZmZXIpOworICAgICAgLyogd2FpdCBmb3IgdGhlIGxvb3AgdG8gZ28gaW50byBQQVVTRUQgKi8KKyAgICAgIGdzdF9wYWRfcGF1c2VfdGFzayAocHJpdi0+c3JjcGFkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUT1A6CisgICAgICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHByaXYtPnNyY3BhZCwgZXZlbnQpOworICAgICAgcmV0ID0KKyAgICAgICAgICBnc3RfcnRwX2ppdHRlcl9idWZmZXJfc3JjX2FjdGl2YXRlX21vZGUgKHByaXYtPnNyY3BhZCwgcGFyZW50LAorICAgICAgICAgIEdTVF9QQURfTU9ERV9QVVNILCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoR1NUX0VWRU5UX0lTX1NFUklBTElaRUQgKGV2ZW50KSkgeworICAgICAgICAvKiBzZXJpYWxpemVkIGV2ZW50cyBnbyBpbiB0aGUgcXVldWUgKi8KKyAgICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgICAgaWYgKHByaXYtPnNyY3Jlc3VsdCAhPSBHU1RfRkxPV19PSykgeworICAgICAgICAgIC8qIEVycm9ycyBpbiBzdGlja3kgZXZlbnQgcHVzaGluZyBhcmUgbm8gcHJvYmxlbSBhbmQgaWdub3JlZCBoZXJlCisgICAgICAgICAgICogYXMgdGhleSB3aWxsIGNhdXNlIG1vcmUgbWVhbmluZ2Z1bCBlcnJvcnMgZHVyaW5nIGRhdGEgZmxvdy4KKyAgICAgICAgICAgKiBGb3IgRU9TIGV2ZW50cywgdGhhdCBhcmUgbm90IGZvbGxvd2VkIGJ5IGRhdGEgZmxvdywgd2Ugc3RpbGwKKyAgICAgICAgICAgKiByZXR1cm4gRkFMU0UgaGVyZSB0aG91Z2guCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKCFHU1RfRVZFTlRfSVNfU1RJQ0tZIChldmVudCkgfHwKKyAgICAgICAgICAgICAgR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSA9PSBHU1RfRVZFTlRfRU9TKQorICAgICAgICAgICAgZ290byBvdXRfZmxvd19lcnJvcjsKKyAgICAgICAgfQorICAgICAgICAvKiByZWZ1c2UgbW9yZSBldmVudHMgb24gRU9TICovCisgICAgICAgIGlmIChwcml2LT5lb3MpCisgICAgICAgICAgZ290byBvdXRfZW9zOworICAgICAgICByZXQgPSBxdWV1ZV9ldmVudCAoaml0dGVyYnVmZmVyLCBldmVudCk7CisgICAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIG5vbi1zZXJpYWxpemVkIGV2ZW50cyBhcmUgZm9yd2FyZGVkIGRvd25zdHJlYW0gaW1tZWRpYXRlbHkgKi8KKyAgICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChwcml2LT5zcmNwYWQsIGV2ZW50KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCitvdXRfZmxvd19lcnJvcjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwKKyAgICAgICAgInJlZnVzaW5nIGV2ZW50LCB3ZSBoYXZlIGEgZG93bnN0cmVhbSBmbG93IGVycm9yOiAlcyIsCisgICAgICAgIGdzdF9mbG93X2dldF9uYW1lIChwcml2LT5zcmNyZXN1bHQpKTsKKyAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitvdXRfZW9zOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAicmVmdXNpbmcgZXZlbnQsIHdlIGFyZSBFT1MiKTsKKyAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpbmtfcnRjcF9ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKyAgR3N0UnRwSml0dGVyQnVmZmVyICpqaXR0ZXJidWZmZXI7CisKKyAgaml0dGVyYnVmZmVyID0gR1NUX1JUUF9KSVRURVJfQlVGRkVSIChwYXJlbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInJlY2VpdmVkICVzIiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVEFSVDoKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggSkJVRl9MT0NLIGhlbGQsIHdpbGwgcmVsZWFzZSB0aGUgTE9DSyB3aGVuIGVtaXRpbmcgdGhlCisgKiBzaWduYWwuIFRoZSBmdW5jdGlvbiByZXR1cm5zIEdTVF9GTE9XX0VSUk9SIHdoZW4gYSBwYXJzaW5nIGVycm9yIGhhcHBlbmVkIGFuZAorICogR1NUX0ZMT1dfRkxVU0hJTkcgd2hlbiB0aGUgZWxlbWVudCBpcyBzaHV0dGluZyBkb3duLiBPbiBzdWNjZXNzCisgKiBHU1RfRkxPV19PSyBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9nZXRfY2xvY2tfcmF0ZSAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLAorICAgIGd1aW50OCBwdCkKK3sKKyAgR1ZhbHVlIHJldCA9IHsgMCB9OworICBHVmFsdWUgYXJnc1syXSA9IHsgezB9LCB7MH0gfTsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIGdfdmFsdWVfaW5pdCAoJmFyZ3NbMF0sIEdTVF9UWVBFX0VMRU1FTlQpOworICBnX3ZhbHVlX3NldF9vYmplY3QgKCZhcmdzWzBdLCBqaXR0ZXJidWZmZXIpOworICBnX3ZhbHVlX2luaXQgKCZhcmdzWzFdLCBHX1RZUEVfVUlOVCk7CisgIGdfdmFsdWVfc2V0X3VpbnQgKCZhcmdzWzFdLCBwdCk7CisKKyAgZ192YWx1ZV9pbml0ICgmcmV0LCBHU1RfVFlQRV9DQVBTKTsKKyAgZ192YWx1ZV9zZXRfYm94ZWQgKCZyZXQsIE5VTEwpOworCisgIEpCVUZfVU5MT0NLIChqaXR0ZXJidWZmZXItPnByaXYpOworICBnX3NpZ25hbF9lbWl0diAoYXJncywgZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpZ25hbHNbU0lHTkFMX1JFUVVFU1RfUFRfTUFQXSwgMCwKKyAgICAgICZyZXQpOworICBKQlVGX0xPQ0tfQ0hFQ0sgKGppdHRlcmJ1ZmZlci0+cHJpdiwgb3V0X2ZsdXNoaW5nKTsKKworICBnX3ZhbHVlX3Vuc2V0ICgmYXJnc1swXSk7CisgIGdfdmFsdWVfdW5zZXQgKCZhcmdzWzFdKTsKKyAgY2FwcyA9IChHc3RDYXBzICopIGdfdmFsdWVfZHVwX2JveGVkICgmcmV0KTsKKyAgZ192YWx1ZV91bnNldCAoJnJldCk7CisgIGlmICghY2FwcykKKyAgICBnb3RvIG5vX2NhcHM7CisKKyAgcmVzID0gZ3N0X2ppdHRlcl9idWZmZXJfc2lua19wYXJzZV9jYXBzIChqaXR0ZXJidWZmZXIsIGNhcHMsIHB0KTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGlmIChHX1VOTElLRUxZICghcmVzKSkKKyAgICBnb3RvIHBhcnNlX2ZhaWxlZDsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCitub19jYXBzOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiY291bGQgbm90IGdldCBjYXBzIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CitvdXRfZmx1c2hpbmc6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJ3ZSBhcmUgZmx1c2hpbmciKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRkxVU0hJTkc7CisgIH0KK3BhcnNlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInBhcnNlIGZhaWxlZCIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCisvKiBjYWxsIHdpdGggamJ1ZiBsb2NrIGhlbGQgKi8KK3N0YXRpYyBHc3RNZXNzYWdlICoKK2NoZWNrX2J1ZmZlcmluZ19wZXJjZW50IChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIsIGdpbnQgcGVyY2VudCkKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZSA9IE5VTEw7CisKKyAgaWYgKHBlcmNlbnQgPT0gLTEpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogUG9zdCBhIGJ1ZmZlcmluZyBtZXNzYWdlICovCisgIGlmIChwcml2LT5sYXN0X3BlcmNlbnQgIT0gcGVyY2VudCkgeworICAgIHByaXYtPmxhc3RfcGVyY2VudCA9IHBlcmNlbnQ7CisgICAgbWVzc2FnZSA9CisgICAgICAgIGdzdF9tZXNzYWdlX25ld19idWZmZXJpbmcgKEdTVF9PQkpFQ1RfQ0FTVCAoaml0dGVyYnVmZmVyKSwgcGVyY2VudCk7CisgICAgZ3N0X21lc3NhZ2Vfc2V0X2J1ZmZlcmluZ19zdGF0cyAobWVzc2FnZSwgR1NUX0JVRkZFUklOR19MSVZFLCAtMSwgLTEsIC0xKTsKKyAgfQorCisgIHJldHVybiBtZXNzYWdlOworfQorCitzdGF0aWMgdm9pZAordXBkYXRlX29mZnNldCAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyKQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OworCisgIHByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisKKyAgaWYgKHByaXYtPnRzX29mZnNldF9yZW1haW5kZXIgIT0gMCkgeworICAgIEdTVF9ERUJVRyAoImFkanVzdG1lbnQgJSIgR19HVUlOVDY0X0ZPUk1BVCAiIHJlbWFpbiAlIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICAgIiBvZmYgJSIgR19HSU5UNjRfRk9STUFULCBwcml2LT5tYXhfdHNfb2Zmc2V0X2FkanVzdG1lbnQsCisgICAgICAgIHByaXYtPnRzX29mZnNldF9yZW1haW5kZXIsIHByaXYtPnRzX29mZnNldCk7CisgICAgaWYgKEFCUyAocHJpdi0+dHNfb2Zmc2V0X3JlbWFpbmRlcikgPiBwcml2LT5tYXhfdHNfb2Zmc2V0X2FkanVzdG1lbnQpIHsKKyAgICAgIGlmIChwcml2LT50c19vZmZzZXRfcmVtYWluZGVyID4gMCkgeworICAgICAgICBwcml2LT50c19vZmZzZXQgKz0gcHJpdi0+bWF4X3RzX29mZnNldF9hZGp1c3RtZW50OworICAgICAgICBwcml2LT50c19vZmZzZXRfcmVtYWluZGVyIC09IHByaXYtPm1heF90c19vZmZzZXRfYWRqdXN0bWVudDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaXYtPnRzX29mZnNldCAtPSBwcml2LT5tYXhfdHNfb2Zmc2V0X2FkanVzdG1lbnQ7CisgICAgICAgIHByaXYtPnRzX29mZnNldF9yZW1haW5kZXIgKz0gcHJpdi0+bWF4X3RzX29mZnNldF9hZGp1c3RtZW50OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBwcml2LT50c19vZmZzZXQgKz0gcHJpdi0+dHNfb2Zmc2V0X3JlbWFpbmRlcjsKKyAgICAgIHByaXYtPnRzX29mZnNldF9yZW1haW5kZXIgPSAwOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgR3N0Q2xvY2tUaW1lCithcHBseV9vZmZzZXQgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCkKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIGlmICh0aW1lc3RhbXAgPT0gLTEpCisgICAgcmV0dXJuIC0xOworCisgIC8qIGFwcGx5IHRoZSB0aW1lc3RhbXAgb2Zmc2V0LCB0aGlzIGlzIHVzZWQgZm9yIGludGVyIHN0cmVhbSBzeW5jICovCisgIHRpbWVzdGFtcCArPSBwcml2LT50c19vZmZzZXQ7CisgIC8qIGFkZCB0aGUgb2Zmc2V0LCB0aGlzIGlzIHVzZWQgd2hlbiBidWZmZXJpbmcgKi8KKyAgdGltZXN0YW1wICs9IHByaXYtPm91dF9vZmZzZXQ7CisKKyAgcmV0dXJuIHRpbWVzdGFtcDsKK30KKworc3RhdGljIFRpbWVyUXVldWUgKgordGltZXJfcXVldWVfbmV3ICh2b2lkKQoreworICBUaW1lclF1ZXVlICpxdWV1ZTsKKworICBxdWV1ZSA9IGdfc2xpY2VfbmV3IChUaW1lclF1ZXVlKTsKKyAgcXVldWUtPnRpbWVycyA9IGdfcXVldWVfbmV3ICgpOworICBxdWV1ZS0+aGFzaHRhYmxlID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7CisKKyAgcmV0dXJuIHF1ZXVlOworfQorCitzdGF0aWMgdm9pZAordGltZXJfcXVldWVfZnJlZSAoVGltZXJRdWV1ZSAqIHF1ZXVlKQoreworICBpZiAoIXF1ZXVlKQorICAgIHJldHVybjsKKworICBnX2hhc2hfdGFibGVfZGVzdHJveSAocXVldWUtPmhhc2h0YWJsZSk7CisgIGdfcXVldWVfZnJlZV9mdWxsIChxdWV1ZS0+dGltZXJzLCBnX2ZyZWUpOworICBnX3NsaWNlX2ZyZWUgKFRpbWVyUXVldWUsIHF1ZXVlKTsKK30KKworc3RhdGljIHZvaWQKK3RpbWVyX3F1ZXVlX2FwcGVuZCAoVGltZXJRdWV1ZSAqIHF1ZXVlLCBjb25zdCBUaW1lckRhdGEgKiB0aW1lciwKKyAgICBHc3RDbG9ja1RpbWUgdGltZW91dCwgZ2Jvb2xlYW4gbG9zdCkKK3sKKyAgVGltZXJEYXRhICpjb3B5OworCisgIGNvcHkgPSBnX21lbWR1cCAodGltZXIsIHNpemVvZiAoKnRpbWVyKSk7CisgIGNvcHktPnRpbWVvdXQgPSB0aW1lb3V0OworICBjb3B5LT50eXBlID0gbG9zdCA/IFRJTUVSX1RZUEVfTE9TVCA6IFRJTUVSX1RZUEVfRVhQRUNURUQ7CisgIGNvcHktPmlkeCA9IC0xOworCisgIEdTVF9MT0cgKCJBcHBlbmQgcnR4LXN0YXRzIHRpbWVyICMlZCwgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgY29weS0+c2VxbnVtLCBHU1RfVElNRV9BUkdTIChjb3B5LT50aW1lb3V0KSk7CisgIGdfcXVldWVfcHVzaF90YWlsIChxdWV1ZS0+dGltZXJzLCBjb3B5KTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAocXVldWUtPmhhc2h0YWJsZSwgR0lOVF9UT19QT0lOVEVSIChjb3B5LT5zZXFudW0pLCBjb3B5KTsKK30KKworc3RhdGljIHZvaWQKK3RpbWVyX3F1ZXVlX2NsZWFyX3VudGlsIChUaW1lclF1ZXVlICogcXVldWUsIEdzdENsb2NrVGltZSB0aW1lb3V0KQoreworICBUaW1lckRhdGEgKnRlc3Q7CisKKyAgdGVzdCA9IGdfcXVldWVfcGVla19oZWFkIChxdWV1ZS0+dGltZXJzKTsKKyAgd2hpbGUgKHRlc3QgJiYgdGVzdC0+dGltZW91dCA8IHRpbWVvdXQpIHsKKyAgICBHU1RfTE9HICgiUG9wIHJ0eC1zdGF0cyB0aW1lciAjJWQsICUiIEdTVF9USU1FX0ZPUk1BVCAiIDwgJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFULCB0ZXN0LT5zZXFudW0sIEdTVF9USU1FX0FSR1MgKHRlc3QtPnRpbWVvdXQpLAorICAgICAgICBHU1RfVElNRV9BUkdTICh0aW1lb3V0KSk7CisgICAgZ19oYXNoX3RhYmxlX3JlbW92ZSAocXVldWUtPmhhc2h0YWJsZSwgR0lOVF9UT19QT0lOVEVSICh0ZXN0LT5zZXFudW0pKTsKKyAgICBnX2ZyZWUgKGdfcXVldWVfcG9wX2hlYWQgKHF1ZXVlLT50aW1lcnMpKTsKKyAgICB0ZXN0ID0gZ19xdWV1ZV9wZWVrX2hlYWQgKHF1ZXVlLT50aW1lcnMpOworICB9Cit9CisKK3N0YXRpYyBUaW1lckRhdGEgKgordGltZXJfcXVldWVfZmluZCAoVGltZXJRdWV1ZSAqIHF1ZXVlLCBndWludDE2IHNlcW51bSkKK3sKKyAgcmV0dXJuIGdfaGFzaF90YWJsZV9sb29rdXAgKHF1ZXVlLT5oYXNodGFibGUsIEdJTlRfVE9fUE9JTlRFUiAoc2VxbnVtKSk7Cit9CisKK3N0YXRpYyBUaW1lckRhdGEgKgorZmluZF90aW1lciAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLCBndWludDE2IHNlcW51bSkKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKyAgVGltZXJEYXRhICp0aW1lciA9IE5VTEw7CisgIGdpbnQgaSwgbGVuOworCisgIGxlbiA9IHByaXYtPnRpbWVycy0+bGVuOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBUaW1lckRhdGEgKnRlc3QgPSAmZ19hcnJheV9pbmRleCAocHJpdi0+dGltZXJzLCBUaW1lckRhdGEsIGkpOworICAgIGlmICh0ZXN0LT5zZXFudW0gPT0gc2VxbnVtKSB7CisgICAgICB0aW1lciA9IHRlc3Q7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRpbWVyOworfQorCitzdGF0aWMgdm9pZAordW5zY2hlZHVsZV9jdXJyZW50X3RpbWVyIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisKKyAgaWYgKHByaXYtPmNsb2NrX2lkKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAidW5zY2hlZHVsZSBjdXJyZW50IHRpbWVyIik7CisgICAgZ3N0X2Nsb2NrX2lkX3Vuc2NoZWR1bGUgKHByaXYtPmNsb2NrX2lkKTsKKyAgICBwcml2LT5jbG9ja19pZCA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIEdzdENsb2NrVGltZQorZ2V0X3RpbWVvdXQgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgVGltZXJEYXRhICogdGltZXIpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisgIEdzdENsb2NrVGltZSB0ZXN0X3RpbWVvdXQ7CisKKyAgaWYgKCh0ZXN0X3RpbWVvdXQgPSB0aW1lci0+dGltZW91dCkgPT0gLTEpCisgICAgcmV0dXJuIC0xOworCisgIGlmICh0aW1lci0+dHlwZSAhPSBUSU1FUl9UWVBFX0VYUEVDVEVEKSB7CisgICAgLyogYWRkIG91ciBsYXRlbmN5IGFuZCBvZmZzZXQgdG8gZ2V0IG91dHB1dCB0aW1lcy4gKi8KKyAgICB0ZXN0X3RpbWVvdXQgPSBhcHBseV9vZmZzZXQgKGppdHRlcmJ1ZmZlciwgdGVzdF90aW1lb3V0KTsKKyAgICB0ZXN0X3RpbWVvdXQgKz0gcHJpdi0+bGF0ZW5jeV9uczsKKyAgfQorICByZXR1cm4gdGVzdF90aW1lb3V0OworfQorCitzdGF0aWMgdm9pZAorcmVjYWxjdWxhdGVfdGltZXIgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgVGltZXJEYXRhICogdGltZXIpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisKKyAgaWYgKHByaXYtPmNsb2NrX2lkKSB7CisgICAgR3N0Q2xvY2tUaW1lIHRpbWVvdXQgPSBnZXRfdGltZW91dCAoaml0dGVyYnVmZmVyLCB0aW1lcik7CisKKyAgICBHU1RfREVCVUcgKCIlIiBHU1RfVElNRV9GT1JNQVQgIiA8PiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVvdXQpLCBHU1RfVElNRV9BUkdTIChwcml2LT50aW1lcl90aW1lb3V0KSk7CisKKyAgICBpZiAodGltZW91dCA9PSAtMSB8fCB0aW1lb3V0IDwgcHJpdi0+dGltZXJfdGltZW91dCkKKyAgICAgIHVuc2NoZWR1bGVfY3VycmVudF90aW1lciAoaml0dGVyYnVmZmVyKTsKKyAgfQorfQorCitzdGF0aWMgVGltZXJEYXRhICoKK2FkZF90aW1lciAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLCBUaW1lclR5cGUgdHlwZSwKKyAgICBndWludDE2IHNlcW51bSwgZ3VpbnQgbnVtLCBHc3RDbG9ja1RpbWUgdGltZW91dCwgR3N0Q2xvY2tUaW1lIGRlbGF5LAorICAgIEdzdENsb2NrVGltZSBkdXJhdGlvbikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKyAgVGltZXJEYXRhICp0aW1lcjsKKyAgZ2ludCBsZW47CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgImFkZCB0aW1lciAlZCBmb3Igc2VxbnVtICVkIHRvICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBkZWxheSAlIgorICAgICAgR1NUX1RJTUVfRk9STUFULCB0eXBlLCBzZXFudW0sIEdTVF9USU1FX0FSR1MgKHRpbWVvdXQpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoZGVsYXkpKTsKKworICBsZW4gPSBwcml2LT50aW1lcnMtPmxlbjsKKyAgZ19hcnJheV9zZXRfc2l6ZSAocHJpdi0+dGltZXJzLCBsZW4gKyAxKTsKKyAgdGltZXIgPSAmZ19hcnJheV9pbmRleCAocHJpdi0+dGltZXJzLCBUaW1lckRhdGEsIGxlbik7CisgIHRpbWVyLT5pZHggPSBsZW47CisgIHRpbWVyLT50eXBlID0gdHlwZTsKKyAgdGltZXItPnNlcW51bSA9IHNlcW51bTsKKyAgdGltZXItPm51bSA9IG51bTsKKyAgdGltZXItPnRpbWVvdXQgPSB0aW1lb3V0ICsgZGVsYXk7CisgIHRpbWVyLT5kdXJhdGlvbiA9IGR1cmF0aW9uOworICBpZiAodHlwZSA9PSBUSU1FUl9UWVBFX0VYUEVDVEVEKSB7CisgICAgdGltZXItPnJ0eF9iYXNlID0gdGltZW91dDsKKyAgICB0aW1lci0+cnR4X2RlbGF5ID0gZGVsYXk7CisgICAgdGltZXItPnJ0eF9yZXRyeSA9IDA7CisgIH0KKyAgdGltZXItPnJ0eF9sYXN0ID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgdGltZXItPm51bV9ydHhfcmV0cnkgPSAwOworICB0aW1lci0+bnVtX3J0eF9yZWNlaXZlZCA9IDA7CisgIHJlY2FsY3VsYXRlX3RpbWVyIChqaXR0ZXJidWZmZXIsIHRpbWVyKTsKKyAgSkJVRl9TSUdOQUxfVElNRVIgKHByaXYpOworCisgIHJldHVybiB0aW1lcjsKK30KKworc3RhdGljIHZvaWQKK3Jlc2NoZWR1bGVfdGltZXIgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgVGltZXJEYXRhICogdGltZXIsCisgICAgZ3VpbnQxNiBzZXFudW0sIEdzdENsb2NrVGltZSB0aW1lb3V0LCBHc3RDbG9ja1RpbWUgZGVsYXksIGdib29sZWFuIHJlc2V0KQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworICBnYm9vbGVhbiBzZXFjaGFuZ2UsIHRpbWVjaGFuZ2U7CisgIGd1aW50MTYgb2xkc2VxOworICBHc3RDbG9ja1RpbWUgbmV3X3RpbWVvdXQ7CisKKyAgb2xkc2VxID0gdGltZXItPnNlcW51bTsKKyAgbmV3X3RpbWVvdXQgPSB0aW1lb3V0ICsgZGVsYXk7CisgIHNlcWNoYW5nZSA9IG9sZHNlcSAhPSBzZXFudW07CisgIHRpbWVjaGFuZ2UgPSB0aW1lci0+dGltZW91dCAhPSBuZXdfdGltZW91dDsKKworICBpZiAoIXNlcWNoYW5nZSAmJiAhdGltZWNoYW5nZSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwKKyAgICAgICAgIk5vIGNoYW5nZXMgaW4gc2VxbnVtICglZCkgYW5kIHRpbWVvdXQgKCUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAiKSwgc2tpcHBpbmciLCBvbGRzZXEsIEdTVF9USU1FX0FSR1MgKHRpbWVyLT50aW1lb3V0KSk7CisgICAgcmV0dXJuOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgInJlcGxhY2UgdGltZXIgJWQgZm9yIHNlcW51bSAlZC0+JWQgdGltZW91dCAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICItPiUiIEdTVF9USU1FX0ZPUk1BVCwgdGltZXItPnR5cGUsIG9sZHNlcSwgc2VxbnVtLAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXItPnRpbWVvdXQpLCBHU1RfVElNRV9BUkdTIChuZXdfdGltZW91dCkpOworCisgIHRpbWVyLT50aW1lb3V0ID0gbmV3X3RpbWVvdXQ7CisgIHRpbWVyLT5zZXFudW0gPSBzZXFudW07CisgIGlmIChyZXNldCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInJlc2V0IHJ0eCBkZWxheSAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgIi0+JSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTICh0aW1lci0+cnR4X2RlbGF5KSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoZGVsYXkpKTsKKyAgICB0aW1lci0+cnR4X2Jhc2UgPSB0aW1lb3V0OworICAgIHRpbWVyLT5ydHhfZGVsYXkgPSBkZWxheTsKKyAgICB0aW1lci0+cnR4X3JldHJ5ID0gMDsKKyAgfQorICBpZiAoc2VxY2hhbmdlKSB7CisgICAgdGltZXItPm51bV9ydHhfcmV0cnkgPSAwOworICAgIHRpbWVyLT5udW1fcnR4X3JlY2VpdmVkID0gMDsKKyAgfQorCisgIGlmIChwcml2LT5jbG9ja19pZCkgeworICAgIC8qIHdlIGNoYW5nZWQgdGhlIHNlcW51bSBhbmQgdGhlcmUgaXMgYSB0aW1lciBjdXJyZW50bHkgd2FpdGluZyB3aXRoIHRoaXMKKyAgICAgKiBzZXFudW0sIHVuc2NoZWR1bGUgaXQgKi8KKyAgICBpZiAoc2VxY2hhbmdlICYmIHByaXYtPnRpbWVyX3NlcW51bSA9PSBvbGRzZXEpCisgICAgICB1bnNjaGVkdWxlX2N1cnJlbnRfdGltZXIgKGppdHRlcmJ1ZmZlcik7CisgICAgLyogd2UgY2hhbmdlZCB0aGUgdGltZSwgY2hlY2sgaWYgaXQgaXMgZWFybGllciB0aGFuIHdoYXQgd2UgYXJlIHdhaXRpbmcKKyAgICAgKiBmb3IgYW5kIHVuc2NoZWR1bGUgaWYgc28gKi8KKyAgICBlbHNlIGlmICh0aW1lY2hhbmdlKQorICAgICAgcmVjYWxjdWxhdGVfdGltZXIgKGppdHRlcmJ1ZmZlciwgdGltZXIpOworICB9Cit9CisKK3N0YXRpYyBUaW1lckRhdGEgKgorc2V0X3RpbWVyIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIsIFRpbWVyVHlwZSB0eXBlLAorICAgIGd1aW50MTYgc2VxbnVtLCBHc3RDbG9ja1RpbWUgdGltZW91dCkKK3sKKyAgVGltZXJEYXRhICp0aW1lcjsKKworICAvKiBmaW5kIHRoZSBzZXFudW0gdGltZXIgKi8KKyAgdGltZXIgPSBmaW5kX3RpbWVyIChqaXR0ZXJidWZmZXIsIHNlcW51bSk7CisgIGlmICh0aW1lciA9PSBOVUxMKSB7CisgICAgdGltZXIgPSBhZGRfdGltZXIgKGppdHRlcmJ1ZmZlciwgdHlwZSwgc2VxbnVtLCAwLCB0aW1lb3V0LCAwLCAtMSk7CisgIH0gZWxzZSB7CisgICAgcmVzY2hlZHVsZV90aW1lciAoaml0dGVyYnVmZmVyLCB0aW1lciwgc2VxbnVtLCB0aW1lb3V0LCAwLCBGQUxTRSk7CisgIH0KKyAgcmV0dXJuIHRpbWVyOworfQorCitzdGF0aWMgdm9pZAorcmVtb3ZlX3RpbWVyIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIsIFRpbWVyRGF0YSAqIHRpbWVyKQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworICBndWludCBpZHg7CisKKyAgaWYgKHRpbWVyLT5pZHggPT0gLTEpCisgICAgcmV0dXJuOworCisgIGlmIChwcml2LT5jbG9ja19pZCAmJiBwcml2LT50aW1lcl9zZXFudW0gPT0gdGltZXItPnNlcW51bSkKKyAgICB1bnNjaGVkdWxlX2N1cnJlbnRfdGltZXIgKGppdHRlcmJ1ZmZlcik7CisKKyAgaWR4ID0gdGltZXItPmlkeDsKKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAicmVtb3ZlZCBpbmRleCAlZCIsIGlkeCk7CisgIGdfYXJyYXlfcmVtb3ZlX2luZGV4X2Zhc3QgKHByaXYtPnRpbWVycywgaWR4KTsKKyAgdGltZXItPmlkeCA9IGlkeDsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9hbGxfdGltZXJzIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInJlbW92ZWQgYWxsIHRpbWVycyIpOworICBnX2FycmF5X3NldF9zaXplIChwcml2LT50aW1lcnMsIDApOworICB1bnNjaGVkdWxlX2N1cnJlbnRfdGltZXIgKGppdHRlcmJ1ZmZlcik7Cit9CisKKy8qIGdldCB0aGUgZXh0cmEgZGVsYXkgdG8gd2FpdCBiZWZvcmUgc2VuZGluZyBSVFggKi8KK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2dldF9ydHhfZGVsYXkgKEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKiBwcml2KQoreworICBHc3RDbG9ja1RpbWUgZGVsYXk7CisKKyAgaWYgKHByaXYtPnJ0eF9kZWxheSA9PSAtMSkgeworICAgIGlmIChwcml2LT5hdmdfaml0dGVyID09IDAgJiYgcHJpdi0+cGFja2V0X3NwYWNpbmcgPT0gMCkgeworICAgICAgZGVsYXkgPSBERUZBVUxUX0FVVE9fUlRYX0RFTEFZOworICAgIH0gZWxzZSB7CisgICAgICAvKiBqaXR0ZXIgaXMgaW4gbmFub3NlY29uZHMsIG1heGltdW0gb2YgMnggaml0dGVyIGFuZCBoYWxmIHRoZQorICAgICAgICogcGFja2V0IHNwYWNpbmcgaXMgYSBnb29kIG1hcmdpbiAqLworICAgICAgZGVsYXkgPSBNQVggKHByaXYtPmF2Z19qaXR0ZXIgKiAyLCBwcml2LT5wYWNrZXRfc3BhY2luZyAvIDIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBkZWxheSA9IHByaXYtPnJ0eF9kZWxheSAqIEdTVF9NU0VDT05EOworICB9CisgIGlmIChwcml2LT5ydHhfbWluX2RlbGF5ID4gMCkKKyAgICBkZWxheSA9IE1BWCAoZGVsYXksIHByaXYtPnJ0eF9taW5fZGVsYXkgKiBHU1RfTVNFQ09ORCk7CisKKyAgcmV0dXJuIGRlbGF5OworfQorCisvKiBDaGVjayBpZiBwYWNrZXQgd2l0aCBzZXFudW0gaXMgYWxyZWFkeSBjb25zaWRlcmVkIGRlZmluaXRlbHkgbG9zdCBieSBiZWluZworICogcGFydCBvZiBhICJsb3N0IHRpbWVyIiBmb3IgbXVsdGlwbGUgcGFja2V0cyAqLworc3RhdGljIGdib29sZWFuCithbHJlYWR5X2xvc3QgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgZ3VpbnQxNiBzZXFudW0pCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisgIGdpbnQgaSwgbGVuOworCisgIGxlbiA9IHByaXYtPnRpbWVycy0+bGVuOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBUaW1lckRhdGEgKnRlc3QgPSAmZ19hcnJheV9pbmRleCAocHJpdi0+dGltZXJzLCBUaW1lckRhdGEsIGkpOworICAgIGdpbnQgZ2FwID0gZ3N0X3J0cF9idWZmZXJfY29tcGFyZV9zZXFudW0gKHRlc3QtPnNlcW51bSwgc2VxbnVtKTsKKworICAgIGlmICh0ZXN0LT5udW0gPiAxICYmIHRlc3QtPnR5cGUgPT0gVElNRVJfVFlQRV9MT1NUICYmIGdhcCA+PSAwICYmCisgICAgICAgIGdhcCA8IHRlc3QtPm51bSkgeworICAgICAgR1NUX0RFQlVHICgic2VxbnVtICMlZCBhbHJlYWR5IGNvbnNpZGVyZWQgZGVmaW5pdGVseSBsb3N0ICgjJWQtPiMlZCkiLAorICAgICAgICAgIHNlcW51bSwgdGVzdC0+c2VxbnVtLCAodGVzdC0+c2VxbnVtICsgdGVzdC0+bnVtIC0gMSkgJiAweGZmZmYpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiB3ZSBqdXN0IHJlY2VpdmVkIGEgcGFja2V0IHdpdGggc2VxbnVtIGFuZCBkdHMuCisgKgorICogRmlyc3QgY2hlY2sgZm9yIG9sZCBzZXFudW0gdGhhdCB3ZSBhcmUgc3RpbGwgZXhwZWN0aW5nLiBJZiB0aGUgZ2FwIHdpdGggdGhlCisgKiBjdXJyZW50IHNlcW51bSBpcyB0b28gYmlnLCB1bnNjaGVkdWxlIHRoZSB0aW1lb3V0cy4KKyAqCisgKiBJZiB3ZSBoYXZlIGEgdmFsaWQgcGFja2V0IHNwYWNpbmcgZXN0aW1hdGUgd2UgY2FuIHNldCBhIHRpbWVyIGZvciB3aGVuIHdlCisgKiBzaG91bGQgcmVjZWl2ZSB0aGUgbmV4dCBwYWNrZXQuCisgKiBJZiB3ZSBkb24ndCBoYXZlIGEgdmFsaWQgZXN0aW1hdGUsIHdlIHJlbW92ZSBhbnkgdGltZXIgd2UgbWlnaHQgaGF2ZQorICogaGFkIGZvciB0aGlzIHBhY2tldC4KKyAqLworc3RhdGljIHZvaWQKK3VwZGF0ZV90aW1lcnMgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgZ3VpbnQxNiBzZXFudW0sCisgICAgR3N0Q2xvY2tUaW1lIGR0cywgR3N0Q2xvY2tUaW1lIHB0cywgZ2Jvb2xlYW4gZG9fbmV4dF9zZXFudW0sCisgICAgZ2Jvb2xlYW4gaXNfcnR4LCBUaW1lckRhdGEgKiB0aW1lcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICAvKiBnbyB0aHJvdWdoIGFsbCB0aW1lcnMgYW5kIHVuc2NoZWR1bGUgdGhlIG9uZXMgd2l0aCBhIGxhcmdlIGdhcCAqLworICBpZiAocHJpdi0+ZG9fcmV0cmFuc21pc3Npb24gJiYgcHJpdi0+cnR4X2RlbGF5X3Jlb3JkZXIgPiAwKSB7CisgICAgZ2ludCBpLCBsZW47CisgICAgbGVuID0gcHJpdi0+dGltZXJzLT5sZW47CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBUaW1lckRhdGEgKnRlc3QgPSAmZ19hcnJheV9pbmRleCAocHJpdi0+dGltZXJzLCBUaW1lckRhdGEsIGkpOworICAgICAgZ2ludCBnYXA7CisKKyAgICAgIGdhcCA9IGdzdF9ydHBfYnVmZmVyX2NvbXBhcmVfc2VxbnVtICh0ZXN0LT5zZXFudW0sIHNlcW51bSk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIiVkLCAjJWQ8LT4jJWQgZ2FwICVkIiwKKyAgICAgICAgICB0ZXN0LT50eXBlLCB0ZXN0LT5zZXFudW0sIHNlcW51bSwgZ2FwKTsKKworICAgICAgaWYgKGdhcCA+IHByaXYtPnJ0eF9kZWxheV9yZW9yZGVyKSB7CisgICAgICAgIC8qIG1heCBnYXAsIHdlIGV4Y2VlZGVkIHRoZSBtYXggcmVvcmRlciBkaXN0YW5jZSBhbmQgd2UgZG9uJ3QgZXhwZWN0IHRoZQorICAgICAgICAgKiBtaXNzaW5nIHBhY2tldCB0byBiZSB0aGlzIHJlb3JkZXJlZCAqLworICAgICAgICBpZiAodGVzdC0+bnVtX3J0eF9yZXRyeSA9PSAwICYmIHRlc3QtPnR5cGUgPT0gVElNRVJfVFlQRV9FWFBFQ1RFRCkKKyAgICAgICAgICByZXNjaGVkdWxlX3RpbWVyIChqaXR0ZXJidWZmZXIsIHRlc3QsIHRlc3QtPnNlcW51bSwgLTEsIDAsIEZBTFNFKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBkb19uZXh0X3NlcW51bSA9IGRvX25leHRfc2VxbnVtICYmIHByaXYtPnBhY2tldF9zcGFjaW5nID4gMAorICAgICAgJiYgcHJpdi0+ZG9fcmV0cmFuc21pc3Npb24gJiYgcHJpdi0+cnR4X25leHRfc2VxbnVtOworCisgIGlmICh0aW1lciAmJiB0aW1lci0+dHlwZSAhPSBUSU1FUl9UWVBFX0RFQURMSU5FKSB7CisgICAgaWYgKHRpbWVyLT5udW1fcnR4X3JldHJ5ID4gMCkgeworICAgICAgaWYgKGlzX3J0eCkgeworICAgICAgICB1cGRhdGVfcnR4X3N0YXRzIChqaXR0ZXJidWZmZXIsIHRpbWVyLCBkdHMsIFRSVUUpOworICAgICAgICAvKiBkb24ndCB0cnkgdG8gZXN0aW1hdGUgdGhlIG5leHQgc2VxbnVtIGJlY2F1c2UgdGhpcyBpcyBhIHJldHJhbnNtaXR0ZWQKKyAgICAgICAgICogcGFja2V0IGFuZCBpdCBwcm9iYWJseSBkaWQgbm90IGFycml2ZSB3aXRoIHRoZSBleHBlY3RlZCBwYWNrZXQKKyAgICAgICAgICogc3BhY2luZy4gKi8KKyAgICAgICAgZG9fbmV4dF9zZXFudW0gPSBGQUxTRTsKKyAgICAgIH0KKworICAgICAgaWYgKCFpc19ydHggfHwgdGltZXItPm51bV9ydHhfcmV0cnkgPiAxKSB7CisgICAgICAgIC8qIFN0b3JlIHRpbWVyIGluIG9yZGVyIHRvIHJlY29yZCBzdGF0cyB3aGVuL2lmIHRoZSByZXRyYW5zbWl0dGVkCisgICAgICAgICAqIHBhY2tldCBhcnJpdmVzLiBXZSBzaG91bGQgYWxzbyBzdG9yZSB0aW1lciBpbmZvcm1hdGlvbiBpZiB3ZSd2ZQorICAgICAgICAgKiByZXF1ZXN0ZWQgcmV0cmFuc21pc3Npb24gbW9yZSB0aGFuIG9uY2Ugc2luY2Ugd2UgbWF5IHJlY2VpdmUKKyAgICAgICAgICogc2V2ZXJhbCByZXRyYW5zbWl0dGVkIHBhY2tldHMuIEZvciBhY2N1cmFjeSB3ZSBzaG91bGQgdXBkYXRlIHRoZQorICAgICAgICAgKiBzdGF0cyBhbHNvIHdoZW4gdGhlIHJlZHVuZGFudCByZXRyYW5zbWl0dGVkIHBhY2tldHMgYXJyaXZlcy4gKi8KKyAgICAgICAgdGltZXJfcXVldWVfYXBwZW5kIChwcml2LT5ydHhfc3RhdHNfdGltZXJzLCB0aW1lciwKKyAgICAgICAgICAgIHB0cyArIHByaXYtPnJ0eF9zdGF0c190aW1lb3V0ICogR1NUX01TRUNPTkQsIEZBTFNFKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoZG9fbmV4dF9zZXFudW0gJiYgcHRzICE9IEdTVF9DTE9DS19USU1FX05PTkUpIHsKKyAgICBHc3RDbG9ja1RpbWUgZXhwZWN0ZWQsIGRlbGF5OworCisgICAgLyogY2FsY3VsYXRlIGV4cGVjdGVkIGFycml2YWwgdGltZSBvZiB0aGUgbmV4dCBzZXFudW0gKi8KKyAgICBleHBlY3RlZCA9IHB0cyArIHByaXYtPnBhY2tldF9zcGFjaW5nOworCisgICAgZGVsYXkgPSBnZXRfcnR4X2RlbGF5IChwcml2KTsKKworICAgIC8qIGFuZCB1cGRhdGUvaW5zdGFsbCB0aW1lciBmb3IgbmV4dCBzZXFudW0gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJBZGQgUlRYIHRpbWVyICMlZCwgZXhwZWN0ZWQgJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFUICIsIGRlbGF5ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBwYWNrZXQtc3BhY2luZyAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiwgaml0dGVyICUiIEdTVF9USU1FX0ZPUk1BVCwgcHJpdi0+bmV4dF9pbl9zZXFudW0sCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGV4cGVjdGVkKSwgR1NUX1RJTUVfQVJHUyAoZGVsYXkpLAorICAgICAgICBHU1RfVElNRV9BUkdTIChwcml2LT5wYWNrZXRfc3BhY2luZyksIEdTVF9USU1FX0FSR1MgKHByaXYtPmF2Z19qaXR0ZXIpKTsKKworICAgIGlmICh0aW1lcikgeworICAgICAgdGltZXItPnR5cGUgPSBUSU1FUl9UWVBFX0VYUEVDVEVEOworICAgICAgcmVzY2hlZHVsZV90aW1lciAoaml0dGVyYnVmZmVyLCB0aW1lciwgcHJpdi0+bmV4dF9pbl9zZXFudW0sIGV4cGVjdGVkLAorICAgICAgICAgIGRlbGF5LCBUUlVFKTsKKyAgICB9IGVsc2UgeworICAgICAgYWRkX3RpbWVyIChqaXR0ZXJidWZmZXIsIFRJTUVSX1RZUEVfRVhQRUNURUQsIHByaXYtPm5leHRfaW5fc2VxbnVtLCAwLAorICAgICAgICAgIGV4cGVjdGVkLCBkZWxheSwgcHJpdi0+cGFja2V0X3NwYWNpbmcpOworICAgIH0KKyAgfSBlbHNlIGlmICh0aW1lciAmJiB0aW1lci0+dHlwZSAhPSBUSU1FUl9UWVBFX0RFQURMSU5FKSB7CisgICAgLyogaWYgd2UgaGFkIGEgdGltZXIsIHJlbW92ZSBpdCwgd2UgZG9uJ3Qga25vdyB3aGVuIHRvIGV4cGVjdCB0aGUgbmV4dAorICAgICAqIHBhY2tldC4gKi8KKyAgICByZW1vdmVfdGltZXIgKGppdHRlcmJ1ZmZlciwgdGltZXIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjYWxjdWxhdGVfcGFja2V0X3NwYWNpbmcgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgZ3VpbnQzMiBydHB0aW1lLAorICAgIEdzdENsb2NrVGltZSBwdHMpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisKKyAgLyogd2UgbmVlZCBjb25zZWN1dGl2ZSBzZXFudW1zIHdpdGggYSBkaWZmZXJlbnQKKyAgICogcnRwdGltZSB0byBlc3RpbWF0ZSB0aGUgcGFja2V0IHNwYWNpbmcuICovCisgIGlmIChwcml2LT5pcHNfcnRwdGltZSAhPSBydHB0aW1lKSB7CisgICAgLyogcnRwdGltZSBjaGFuZ2VkLCBjaGVjayBwdHMgZGlmZiAqLworICAgIGlmIChwcml2LT5pcHNfcHRzICE9IC0xICYmIHB0cyAhPSAtMSAmJiBwdHMgPiBwcml2LT5pcHNfcHRzKSB7CisgICAgICBHc3RDbG9ja1RpbWUgbmV3X3BhY2tldF9zcGFjaW5nID0gcHRzIC0gcHJpdi0+aXBzX3B0czsKKyAgICAgIEdzdENsb2NrVGltZSBvbGRfcGFja2V0X3NwYWNpbmcgPSBwcml2LT5wYWNrZXRfc3BhY2luZzsKKworICAgICAgLyogQmlhc2VkIHRvd2FyZHMgYmlnZ2VyIHBhY2tldCBzcGFjaW5ncyB0byBwcmV2ZW50CisgICAgICAgKiB0b28gbWFueSB1bm5lZWRlZCByZXRyYW5zbWlzc2lvbiByZXF1ZXN0cyBmb3IgbmV4dAorICAgICAgICogcGFja2V0cyB0aGF0IGp1c3QgYXJyaXZlIGEgbGl0dGxlIGxhdGVyIHRoYW4gd2Ugd291bGQKKyAgICAgICAqIGV4cGVjdCAqLworICAgICAgaWYgKG9sZF9wYWNrZXRfc3BhY2luZyA+IG5ld19wYWNrZXRfc3BhY2luZykKKyAgICAgICAgcHJpdi0+cGFja2V0X3NwYWNpbmcgPQorICAgICAgICAgICAgKG5ld19wYWNrZXRfc3BhY2luZyArIDMgKiBvbGRfcGFja2V0X3NwYWNpbmcpIC8gNDsKKyAgICAgIGVsc2UgaWYgKG9sZF9wYWNrZXRfc3BhY2luZyA+IDApCisgICAgICAgIHByaXYtPnBhY2tldF9zcGFjaW5nID0KKyAgICAgICAgICAgICgzICogbmV3X3BhY2tldF9zcGFjaW5nICsgb2xkX3BhY2tldF9zcGFjaW5nKSAvIDQ7CisgICAgICBlbHNlCisgICAgICAgIHByaXYtPnBhY2tldF9zcGFjaW5nID0gbmV3X3BhY2tldF9zcGFjaW5nOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAgICAgIm5ldyBwYWNrZXQgc3BhY2luZyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAiIG9sZCBwYWNrZXQgc3BhY2luZyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAiIGNvbWJpbmVkIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChuZXdfcGFja2V0X3NwYWNpbmcpLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKG9sZF9wYWNrZXRfc3BhY2luZyksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocHJpdi0+cGFja2V0X3NwYWNpbmcpKTsKKyAgICB9CisgICAgcHJpdi0+aXBzX3J0cHRpbWUgPSBydHB0aW1lOworICAgIHByaXYtPmlwc19wdHMgPSBwdHM7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NhbGN1bGF0ZV9leHBlY3RlZCAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLCBndWludDMyIGV4cGVjdGVkLAorICAgIGd1aW50MTYgc2VxbnVtLCBHc3RDbG9ja1RpbWUgcHRzLCBnaW50IGdhcCkKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uLCBleHBlY3RlZF9wdHMsIGRlbGF5OworICBUaW1lclR5cGUgdHlwZTsKKyAgZ2Jvb2xlYW4gZXF1aWRpc3RhbnQgPSBwcml2LT5lcXVpZGlzdGFudCA+IDA7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgInB0cyAlIiBHU1RfVElNRV9GT1JNQVQgIiwgbGFzdCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChwdHMpLCBHU1RfVElNRV9BUkdTIChwcml2LT5sYXN0X2luX3B0cykpOworCisgIGlmIChwdHMgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiSGF2ZSBubyBQVFMiKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoZXF1aWRpc3RhbnQpIHsKKyAgICBHc3RDbG9ja1RpbWUgdG90YWxfZHVyYXRpb247CisgICAgLyogdGhlIHRvdGFsIGR1cmF0aW9uIHNwYW5uZWQgYnkgdGhlIG1pc3NpbmcgcGFja2V0cyAqLworICAgIGlmIChwdHMgPj0gcHJpdi0+bGFzdF9pbl9wdHMpCisgICAgICB0b3RhbF9kdXJhdGlvbiA9IHB0cyAtIHByaXYtPmxhc3RfaW5fcHRzOworICAgIGVsc2UKKyAgICAgIHRvdGFsX2R1cmF0aW9uID0gMDsKKworICAgIC8qIGludGVycG9sYXRlIGJldHdlZW4gdGhlIGN1cnJlbnQgdGltZSBhbmQgdGhlIGxhc3QgdGltZSBiYXNlZCBvbgorICAgICAqIG51bWJlciBvZiBwYWNrZXRzIHdlIGFyZSBtaXNzaW5nLCB0aGlzIGlzIHRoZSBlc3RpbWF0ZWQgZHVyYXRpb24KKyAgICAgKiBmb3IgdGhlIG1pc3NpbmcgcGFja2V0IGJhc2VkIG9uIGVxdWlkaXN0YW50IHBhY2tldCBzcGFjaW5nLiAqLworICAgIGR1cmF0aW9uID0gdG90YWxfZHVyYXRpb24gLyAoZ2FwICsgMSk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJkdXJhdGlvbiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGR1cmF0aW9uKSk7CisKKyAgICBpZiAodG90YWxfZHVyYXRpb24gPiBwcml2LT5sYXRlbmN5X25zKSB7CisgICAgICBHc3RDbG9ja1RpbWUgZ2FwX3RpbWU7CisgICAgICBndWludCBsb3N0X3BhY2tldHM7CisKKyAgICAgIGlmIChkdXJhdGlvbiA+IDApIHsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIGdhcF9kdXIgPSBnYXAgKiBkdXJhdGlvbjsKKyAgICAgICAgaWYgKGdhcF9kdXIgPiBwcml2LT5sYXRlbmN5X25zKQorICAgICAgICAgIGdhcF90aW1lID0gZ2FwX2R1ciAtIHByaXYtPmxhdGVuY3lfbnM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBnYXBfdGltZSA9IDA7CisgICAgICAgIGxvc3RfcGFja2V0cyA9IGdhcF90aW1lIC8gZHVyYXRpb247CisgICAgICB9IGVsc2UgeworICAgICAgICBnYXBfdGltZSA9IHRvdGFsX2R1cmF0aW9uIC0gcHJpdi0+bGF0ZW5jeV9uczsKKyAgICAgICAgbG9zdF9wYWNrZXRzID0gZ2FwOworICAgICAgfQorCisgICAgICAvKiB0b28gbWFueSBsb3N0IHBhY2tldHMsIHNvbWUgb2YgdGhlIG1pc3NpbmcgcGFja2V0cyBhcmUgYWxyZWFkeQorICAgICAgICogdG9vIGxhdGUgYW5kIHdlIGNhbiBnZW5lcmF0ZSBsb3N0IHBhY2tldCBldmVudHMgZm9yIHRoZW0uICovCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwKKyAgICAgICAgICAibG9zdCBwYWNrZXRzICglZCwgIyVkLT4jJWQpIGR1cmF0aW9uIHRvbyBsYXJnZSAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAiID4gJSIgR1NUX1RJTUVfRk9STUFUICIsIGNvbnNpZGVyICV1IGxvc3QgKCUiIEdTVF9USU1FX0ZPUk1BVCAiKSIsCisgICAgICAgICAgZ2FwLCBleHBlY3RlZCwgc2VxbnVtIC0gMSwgR1NUX1RJTUVfQVJHUyAodG90YWxfZHVyYXRpb24pLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHByaXYtPmxhdGVuY3lfbnMpLCBsb3N0X3BhY2tldHMsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZ2FwX3RpbWUpKTsKKworICAgICAgLyogdGhpcyB0aW1lciB3aWxsIGZpcmUgaW1tZWRpYXRlbHkgYW5kIHRoZSBsb3N0IGV2ZW50IHdpbGwgYmUgcHVzaGVkIGZyb20KKyAgICAgICAqIHRoZSB0aW1lciB0aHJlYWQgKi8KKyAgICAgIGlmIChsb3N0X3BhY2tldHMgPiAwKSB7CisgICAgICAgIGFkZF90aW1lciAoaml0dGVyYnVmZmVyLCBUSU1FUl9UWVBFX0xPU1QsIGV4cGVjdGVkLCBsb3N0X3BhY2tldHMsCisgICAgICAgICAgICBwcml2LT5sYXN0X2luX3B0cyArIGR1cmF0aW9uLCAwLCBnYXBfdGltZSk7CisgICAgICAgIGV4cGVjdGVkICs9IGxvc3RfcGFja2V0czsKKyAgICAgICAgcHJpdi0+bGFzdF9pbl9wdHMgKz0gZ2FwX3RpbWU7CisgICAgICB9CisgICAgfQorCisgICAgZXhwZWN0ZWRfcHRzID0gcHJpdi0+bGFzdF9pbl9wdHMgKyBkdXJhdGlvbjsKKyAgfSBlbHNlIHsKKyAgICAvKiBJZiB3ZSBjYW5ub3QgYXNzdW1lIGVxdWlkaXN0YW50IHBhY2tldCBzcGFjaW5nLCB0aGUgb25seSB0aGluZyB3ZSBub3cKKyAgICAgKiBmb3Igc3VyZSBpcyB0aGF0IHRoZSBtaXNzaW5nIHBhY2tldHMgaGF2ZSBleHBlY3RlZCBwdHMgbm90IGxhdGVyIHRoYW4KKyAgICAgKiB0aGUgbGFzdCByZWNlaXZlZCBwdHMuICovCisgICAgZHVyYXRpb24gPSAwOworICAgIGV4cGVjdGVkX3B0cyA9IHB0czsKKyAgfQorCisgIGRlbGF5ID0gMDsKKworICBpZiAocHJpdi0+ZG9fcmV0cmFuc21pc3Npb24pIHsKKyAgICBUaW1lckRhdGEgKnRpbWVyID0gZmluZF90aW1lciAoaml0dGVyYnVmZmVyLCBleHBlY3RlZCk7CisKKyAgICB0eXBlID0gVElNRVJfVFlQRV9FWFBFQ1RFRDsKKyAgICBkZWxheSA9IGdldF9ydHhfZGVsYXkgKHByaXYpOworCisgICAgLyogaWYgd2UgaGFkIGEgdGltZXIgZm9yIHRoZSBmaXJzdCBtaXNzaW5nIHBhY2tldCwgdXBkYXRlIGl0LiAqLworICAgIGlmICh0aW1lciAmJiB0aW1lci0+dHlwZSA9PSBUSU1FUl9UWVBFX0VYUEVDVEVEKSB7CisgICAgICBHc3RDbG9ja1RpbWUgdGltZW91dCA9IHRpbWVyLT50aW1lb3V0OworCisgICAgICB0aW1lci0+ZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgIGlmICh0aW1lb3V0ID4gKGV4cGVjdGVkX3B0cyArIGRlbGF5KSAmJiB0aW1lci0+bnVtX3J0eF9yZXRyeSA9PSAwKSB7CisgICAgICAgIHJlc2NoZWR1bGVfdGltZXIgKGppdHRlcmJ1ZmZlciwgdGltZXIsIHRpbWVyLT5zZXFudW0sIGV4cGVjdGVkX3B0cywKKyAgICAgICAgICAgIGRlbGF5LCBUUlVFKTsKKyAgICAgIH0KKyAgICAgIGV4cGVjdGVkKys7CisgICAgICBleHBlY3RlZF9wdHMgKz0gZHVyYXRpb247CisgICAgfQorICB9IGVsc2UgeworICAgIHR5cGUgPSBUSU1FUl9UWVBFX0xPU1Q7CisgIH0KKworICB3aGlsZSAoZ3N0X3J0cF9idWZmZXJfY29tcGFyZV9zZXFudW0gKGV4cGVjdGVkLCBzZXFudW0pID4gMCkgeworICAgIGFkZF90aW1lciAoaml0dGVyYnVmZmVyLCB0eXBlLCBleHBlY3RlZCwgMCwgZXhwZWN0ZWRfcHRzLCBkZWxheSwgZHVyYXRpb24pOworICAgIGV4cGVjdGVkX3B0cyArPSBkdXJhdGlvbjsKKyAgICBleHBlY3RlZCsrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjYWxjdWxhdGVfaml0dGVyIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIsIEdzdENsb2NrVGltZSBkdHMsCisgICAgZ3VpbnQzMiBydHB0aW1lKQoreworICBnaW50MzIgcnRwZGlmZjsKKyAgR3N0Q2xvY2tUaW1lRGlmZiBkdHNkaWZmLCBydHBkaWZmbnMsIGRpZmY7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXY7CisKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBpZiAoR19VTkxJS0VMWSAoZHRzID09IEdTVF9DTE9DS19USU1FX05PTkUpIHx8IHByaXYtPmNsb2NrX3JhdGUgPD0gMCkKKyAgICBnb3RvIG5vX3RpbWU7CisKKyAgaWYgKHByaXYtPmxhc3RfZHRzICE9IC0xKQorICAgIGR0c2RpZmYgPSBkdHMgLSBwcml2LT5sYXN0X2R0czsKKyAgZWxzZQorICAgIGR0c2RpZmYgPSAwOworCisgIGlmIChwcml2LT5sYXN0X3J0cHRpbWUgIT0gLTEpCisgICAgcnRwZGlmZiA9IHJ0cHRpbWUgLSAoZ3VpbnQzMikgcHJpdi0+bGFzdF9ydHB0aW1lOworICBlbHNlCisgICAgcnRwZGlmZiA9IDA7CisKKyAgLyogR3Vlc3Mgd2hldGhlciBzdHJlYW0gY3VycmVudGx5IHVzZXMgZXF1aWRpc3RhbnQgcGFja2V0IHNwYWNpbmcuIElmIHdlCisgICAqIG9mdGVuIHNlZSBpZGVudGljYWwgdGltZXN0YW1wcyBpdCBtZWFucyB0aGUgcGFja2V0cyBhcmUgbm90CisgICAqIGVxdWlkaXN0YW50LiAqLworICBpZiAocnRwdGltZSA9PSBwcml2LT5sYXN0X3J0cHRpbWUpCisgICAgcHJpdi0+ZXF1aWRpc3RhbnQgLT0gMjsKKyAgZWxzZQorICAgIHByaXYtPmVxdWlkaXN0YW50ICs9IDE7CisgIHByaXYtPmVxdWlkaXN0YW50ID0gQ0xBTVAgKHByaXYtPmVxdWlkaXN0YW50LCAtNywgNyk7CisKKyAgcHJpdi0+bGFzdF9kdHMgPSBkdHM7CisgIHByaXYtPmxhc3RfcnRwdGltZSA9IHJ0cHRpbWU7CisKKyAgaWYgKHJ0cGRpZmYgPiAwKQorICAgIHJ0cGRpZmZucyA9CisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHJ0cGRpZmYsIEdTVF9TRUNPTkQsIHByaXYtPmNsb2NrX3JhdGUpOworICBlbHNlCisgICAgcnRwZGlmZm5zID0KKyAgICAgICAgLWdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKC1ydHBkaWZmLCBHU1RfU0VDT05ELCBwcml2LT5jbG9ja19yYXRlKTsKKworICBkaWZmID0gQUJTIChkdHNkaWZmIC0gcnRwZGlmZm5zKTsKKworICAvKiBqaXR0ZXIgaXMgc3RvcmVkIGluIG5hbm9zZWNvbmRzICovCisgIHByaXYtPmF2Z19qaXR0ZXIgPSAoZGlmZiArICgxNSAqIHByaXYtPmF2Z19qaXR0ZXIpKSA+PiA0OworCisgIEdTVF9MT0dfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAiZHRzZGlmZiAlIiBHU1RfVElNRV9GT1JNQVQgIiBydHB0aW1lICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiwgY2xvY2stcmF0ZSAlZCwgZGlmZiAlIiBHU1RfVElNRV9GT1JNQVQgIiwgaml0dGVyOiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChkdHNkaWZmKSwgR1NUX1RJTUVfQVJHUyAocnRwZGlmZm5zKSwgcHJpdi0+Y2xvY2tfcmF0ZSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKGRpZmYpLCBHU1RfVElNRV9BUkdTIChwcml2LT5hdmdfaml0dGVyKSk7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworbm9fdGltZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwKKyAgICAgICAgIm5vIGR0cyBvciBubyBjbG9jay1yYXRlLCBjYW4ndCBjYWxjdWxhdGUgaml0dGVyIik7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyBnaW50Citjb21wYXJlX2J1ZmZlcl9zZXFudW0gKEdzdEJ1ZmZlciAqIGEsIEdzdEJ1ZmZlciAqIGIsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0UlRQQnVmZmVyIHJ0cF9hID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKyAgR3N0UlRQQnVmZmVyIHJ0cF9iID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKyAgZ3VpbnQgc2VxX2EsIHNlcV9iOworCisgIGdzdF9ydHBfYnVmZmVyX21hcCAoYSwgR1NUX01BUF9SRUFELCAmcnRwX2EpOworICBzZXFfYSA9IGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKCZydHBfYSk7CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwX2EpOworCisgIGdzdF9ydHBfYnVmZmVyX21hcCAoYiwgR1NUX01BUF9SRUFELCAmcnRwX2IpOworICBzZXFfYiA9IGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKCZydHBfYik7CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwX2IpOworCisgIHJldHVybiBnc3RfcnRwX2J1ZmZlcl9jb21wYXJlX3NlcW51bSAoc2VxX2IsIHNlcV9hKTsKK30KKworc3RhdGljIGdib29sZWFuCitoYW5kbGVfYmlnX2dhcF9idWZmZXIgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgR3N0QnVmZmVyICogYnVmZmVyLAorICAgIGd1aW50OCBwdCwgZ3VpbnQxNiBzZXFudW0sIGdpbnQgZ2FwLCBndWludCBtYXhfZHJvcG91dCwgZ3VpbnQgbWF4X21pc29yZGVyKQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OworICBndWludCBnYXBfcGFja2V0c19sZW5ndGg7CisgIGdib29sZWFuIHJlc2V0ID0gRkFMU0U7CisgIGdib29sZWFuIGZ1dHVyZSA9IGdhcCA+IDA7CisKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBpZiAoKGdhcF9wYWNrZXRzX2xlbmd0aCA9IGdfcXVldWVfZ2V0X2xlbmd0aCAoJnByaXYtPmdhcF9wYWNrZXRzKSkgPiAwKSB7CisgICAgR0xpc3QgKmw7CisgICAgZ3VpbnQzMiBwcmV2X2dhcF9zZXEgPSAtMTsKKyAgICBnYm9vbGVhbiBhbGxfY29uc2VjdXRpdmUgPSBUUlVFOworCisgICAgZ19xdWV1ZV9pbnNlcnRfc29ydGVkICgmcHJpdi0+Z2FwX3BhY2tldHMsIGJ1ZmZlciwKKyAgICAgICAgKEdDb21wYXJlRGF0YUZ1bmMpIGNvbXBhcmVfYnVmZmVyX3NlcW51bSwgTlVMTCk7CisKKyAgICBmb3IgKGwgPSBwcml2LT5nYXBfcGFja2V0cy5oZWFkOyBsOyBsID0gbC0+bmV4dCkgeworICAgICAgR3N0QnVmZmVyICpnYXBfYnVmZmVyID0gbC0+ZGF0YTsKKyAgICAgIEdzdFJUUEJ1ZmZlciBnYXBfcnRwID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKyAgICAgIGd1aW50MzIgZ2FwX3NlcTsKKworICAgICAgZ3N0X3J0cF9idWZmZXJfbWFwIChnYXBfYnVmZmVyLCBHU1RfTUFQX1JFQUQsICZnYXBfcnRwKTsKKworICAgICAgYWxsX2NvbnNlY3V0aXZlID0gKGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3R5cGUgKCZnYXBfcnRwKSA9PSBwdCk7CisKKyAgICAgIGdhcF9zZXEgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxICgmZ2FwX3J0cCk7CisgICAgICBpZiAocHJldl9nYXBfc2VxID09IC0xKQorICAgICAgICBwcmV2X2dhcF9zZXEgPSBnYXBfc2VxOworICAgICAgZWxzZSBpZiAoZ3N0X3J0cF9idWZmZXJfY29tcGFyZV9zZXFudW0gKGdhcF9zZXEsIHByZXZfZ2FwX3NlcSkgIT0gLTEpCisgICAgICAgIGFsbF9jb25zZWN1dGl2ZSA9IEZBTFNFOworICAgICAgZWxzZQorICAgICAgICBwcmV2X2dhcF9zZXEgPSBnYXBfc2VxOworCisgICAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJmdhcF9ydHApOworICAgICAgaWYgKCFhbGxfY29uc2VjdXRpdmUpCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChhbGxfY29uc2VjdXRpdmUgJiYgZ2FwX3BhY2tldHNfbGVuZ3RoID4gMykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgICAgICJidWZmZXIgdG9vICVzICVkIDwgJWQsIGdvdCA1IGNvbnNlY3V0aXZlIG9uZXMgLSByZXNldCIsCisgICAgICAgICAgKGZ1dHVyZSA/ICJuZXciIDogIm9sZCIpLCBnYXAsCisgICAgICAgICAgKGZ1dHVyZSA/IG1heF9kcm9wb3V0IDogLW1heF9taXNvcmRlcikpOworICAgICAgcmVzZXQgPSBUUlVFOworICAgIH0gZWxzZSBpZiAoIWFsbF9jb25zZWN1dGl2ZSkgeworICAgICAgZ19xdWV1ZV9mb3JlYWNoICgmcHJpdi0+Z2FwX3BhY2tldHMsIChHRnVuYykgZ3N0X2J1ZmZlcl91bnJlZiwgTlVMTCk7CisgICAgICBnX3F1ZXVlX2NsZWFyICgmcHJpdi0+Z2FwX3BhY2tldHMpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgICAgICJidWZmZXIgdG9vICVzICVkIDwgJWQsIGdvdCBubyA1IGNvbnNlY3V0aXZlIG9uZXMgLSBkcm9wcGluZyIsCisgICAgICAgICAgKGZ1dHVyZSA/ICJuZXciIDogIm9sZCIpLCBnYXAsCisgICAgICAgICAgKGZ1dHVyZSA/IG1heF9kcm9wb3V0IDogLW1heF9taXNvcmRlcikpOworICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgICAgICJidWZmZXIgdG9vICVzICVkIDwgJWQsIGdvdCAldSBjb25zZWN1dGl2ZSBvbmVzIC0gd2FpdGluZyIsCisgICAgICAgICAgKGZ1dHVyZSA/ICJuZXciIDogIm9sZCIpLCBnYXAsCisgICAgICAgICAgKGZ1dHVyZSA/IG1heF9kcm9wb3V0IDogLW1heF9taXNvcmRlciksIGdhcF9wYWNrZXRzX2xlbmd0aCArIDEpOworICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgICAiYnVmZmVyIHRvbyAlcyAlZCA8ICVkLCBmaXJzdCBvbmUgLSB3YWl0aW5nIiwgKGZ1dHVyZSA/ICJuZXciIDogIm9sZCIpLAorICAgICAgICBnYXAsIC1tYXhfbWlzb3JkZXIpOworICAgIGdfcXVldWVfcHVzaF90YWlsICgmcHJpdi0+Z2FwX3BhY2tldHMsIGJ1ZmZlcik7CisgICAgYnVmZmVyID0gTlVMTDsKKyAgfQorCisgIHJldHVybiByZXNldDsKK30KKworc3RhdGljIEdzdENsb2NrVGltZQorZ2V0X2N1cnJlbnRfcnVubmluZ190aW1lIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIpCit7CisgIEdzdENsb2NrICpjbG9jayA9IGdzdF9lbGVtZW50X2dldF9jbG9jayAoR1NUX0VMRU1FTlRfQ0FTVCAoaml0dGVyYnVmZmVyKSk7CisgIEdzdENsb2NrVGltZSBydW5uaW5nX3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIGlmIChjbG9jaykgeworICAgIEdzdENsb2NrVGltZSBiYXNlX3RpbWUgPQorICAgICAgICBnc3RfZWxlbWVudF9nZXRfYmFzZV90aW1lIChHU1RfRUxFTUVOVF9DQVNUIChqaXR0ZXJidWZmZXIpKTsKKyAgICBHc3RDbG9ja1RpbWUgY2xvY2tfdGltZSA9IGdzdF9jbG9ja19nZXRfdGltZSAoY2xvY2spOworCisgICAgaWYgKGNsb2NrX3RpbWUgPiBiYXNlX3RpbWUpCisgICAgICBydW5uaW5nX3RpbWUgPSBjbG9ja190aW1lIC0gYmFzZV90aW1lOworICAgIGVsc2UKKyAgICAgIHJ1bm5pbmdfdGltZSA9IDA7CisKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChjbG9jayk7CisgIH0KKworICByZXR1cm4gcnVubmluZ190aW1lOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3Jlc2V0IChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIsCisgICAgR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIGd1aW50MTYgc2VxbnVtKQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHTGlzdCAqZXZlbnRzID0gTlVMTCwgKmw7CisgIEdMaXN0ICpidWZmZXJzOworICBnYm9vbGVhbiBoZWFkOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImZsdXNoIGFuZCByZXNldCBqaXR0ZXJidWZmZXIiKTsKKyAgcnRwX2ppdHRlcl9idWZmZXJfZmx1c2ggKHByaXYtPmpidWYsCisgICAgICAoR0Z1bmMpIGZyZWVfaXRlbV9hbmRfcmV0YWluX2V2ZW50cywgJmV2ZW50cyk7CisgIHJ0cF9qaXR0ZXJfYnVmZmVyX3Jlc2V0X3NrZXcgKHByaXYtPmpidWYpOworICByZW1vdmVfYWxsX3RpbWVycyAoaml0dGVyYnVmZmVyKTsKKyAgcHJpdi0+ZGlzY29udCA9IFRSVUU7CisgIHByaXYtPmxhc3RfcG9wcGVkX3NlcW51bSA9IC0xOworCisgIGlmIChwcml2LT5nYXBfcGFja2V0cy5oZWFkKSB7CisgICAgR3N0QnVmZmVyICpnYXBfYnVmZmVyID0gcHJpdi0+Z2FwX3BhY2tldHMuaGVhZC0+ZGF0YTsKKyAgICBHc3RSVFBCdWZmZXIgZ2FwX3J0cCA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisKKyAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGdhcF9idWZmZXIsIEdTVF9NQVBfUkVBRCwgJmdhcF9ydHApOworICAgIHByaXYtPm5leHRfc2VxbnVtID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAoJmdhcF9ydHApOworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmZ2FwX3J0cCk7CisgIH0gZWxzZSB7CisgICAgcHJpdi0+bmV4dF9zZXFudW0gPSBzZXFudW07CisgIH0KKworICBwcml2LT5sYXN0X2luX3B0cyA9IC0xOworICBwcml2LT5uZXh0X2luX3NlcW51bSA9IC0xOworCisgIC8qIEluc2VydCBhbGwgc3RpY2t5IGV2ZW50cyBhZ2FpbiBpbiBvcmRlciwgb3RoZXJ3aXNlIHdlIHdvdWxkCisgICAqIHBvdGVudGlhbGx5IGxvb3NlIFNUUkVBTV9TVEFSVCwgQ0FQUyBvciBTRUdNRU5UIGV2ZW50cworICAgKi8KKyAgZXZlbnRzID0gZ19saXN0X3JldmVyc2UgKGV2ZW50cyk7CisgIGZvciAobCA9IGV2ZW50czsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICBSVFBKaXR0ZXJCdWZmZXJJdGVtICppdGVtOworCisgICAgaXRlbSA9IGFsbG9jX2l0ZW0gKGwtPmRhdGEsIElURU1fVFlQRV9FVkVOVCwgLTEsIC0xLCAtMSwgMCwgLTEpOworICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2luc2VydCAocHJpdi0+amJ1ZiwgaXRlbSwgJmhlYWQsIE5VTEwpOworICB9CisgIGdfbGlzdF9mcmVlIChldmVudHMpOworCisgIEpCVUZfU0lHTkFMX0VWRU5UIChwcml2KTsKKworICAvKiByZXNldCBzcGFjaW5nIGVzdGltYXRpb24gd2hlbiBnYXAgKi8KKyAgcHJpdi0+aXBzX3J0cHRpbWUgPSAtMTsKKyAgcHJpdi0+aXBzX3B0cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgYnVmZmVycyA9IGdfbGlzdF9jb3B5IChwcml2LT5nYXBfcGFja2V0cy5oZWFkKTsKKyAgZ19xdWV1ZV9jbGVhciAoJnByaXYtPmdhcF9wYWNrZXRzKTsKKworICBwcml2LT5pcHNfcnRwdGltZSA9IC0xOworICBwcml2LT5pcHNfcHRzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgSkJVRl9VTkxPQ0sgKGppdHRlcmJ1ZmZlci0+cHJpdik7CisKKyAgZm9yIChsID0gYnVmZmVyczsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICByZXQgPSBnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4gKHBhZCwgcGFyZW50LCBsLT5kYXRhKTsKKyAgICBsLT5kYXRhID0gTlVMTDsKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgICBsID0gbC0+bmV4dDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBmb3IgKDsgbDsgbCA9IGwtPm5leHQpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAobC0+ZGF0YSk7CisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9mYXN0X3N0YXJ0IChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXY7CisgIFJUUEppdHRlckJ1ZmZlckl0ZW0gKml0ZW07CisgIFRpbWVyRGF0YSAqdGltZXI7CisKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBpZiAocHJpdi0+ZmFzdHN0YXJ0X21pbl9wYWNrZXRzID09IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIGl0ZW0gPSBydHBfaml0dGVyX2J1ZmZlcl9wZWVrIChwcml2LT5qYnVmKTsKKyAgaWYgKCFpdGVtKQorICAgIHJldHVybiBGQUxTRTsKKworICB0aW1lciA9IGZpbmRfdGltZXIgKGppdHRlcmJ1ZmZlciwgaXRlbS0+c2VxbnVtKTsKKyAgaWYgKCF0aW1lciB8fCB0aW1lci0+dHlwZSAhPSBUSU1FUl9UWVBFX0RFQURMSU5FKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAocnRwX2ppdHRlcl9idWZmZXJfY2FuX2Zhc3Rfc3RhcnQgKHByaXYtPmpidWYsCisgICAgICAgICAgcHJpdi0+ZmFzdHN0YXJ0X21pbl9wYWNrZXRzKSkgeworICAgIEdTVF9JTkZPX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiV2UgZm91bmQgJWkgY29uc2VjdXRpdmUgcGFja2V0LCBzdGFydCBub3ciLAorICAgICAgICBwcml2LT5mYXN0c3RhcnRfbWluX3BhY2tldHMpOworICAgIHRpbWVyLT50aW1lb3V0ID0gLTE7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyICpqaXR0ZXJidWZmZXI7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXY7CisgIGd1aW50MTYgc2VxbnVtOworICBndWludDMyIGV4cGVjdGVkLCBydHB0aW1lOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RDbG9ja1RpbWUgZHRzLCBwdHM7CisgIGd1aW50NjQgbGF0ZW5jeV90czsKKyAgZ2Jvb2xlYW4gaGVhZDsKKyAgZ2ludCBwZXJjZW50ID0gLTE7CisgIGd1aW50OCBwdDsKKyAgR3N0UlRQQnVmZmVyIHJ0cCA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisgIGdib29sZWFuIGRvX25leHRfc2VxbnVtID0gRkFMU0U7CisgIFJUUEppdHRlckJ1ZmZlckl0ZW0gKml0ZW07CisgIEdzdE1lc3NhZ2UgKm1zZyA9IE5VTEw7CisgIGdib29sZWFuIGVzdGltYXRlZF9kdHMgPSBGQUxTRTsKKyAgZ2ludDMyIHBhY2tldF9yYXRlLCBtYXhfZHJvcG91dCwgbWF4X21pc29yZGVyOworICBUaW1lckRhdGEgKnRpbWVyID0gTlVMTDsKKworICBqaXR0ZXJidWZmZXIgPSBHU1RfUlRQX0pJVFRFUl9CVUZGRVJfQ0FTVCAocGFyZW50KTsKKworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIGlmIChHX1VOTElLRUxZICghZ3N0X3J0cF9idWZmZXJfbWFwIChidWZmZXIsIEdTVF9NQVBfUkVBRCwgJnJ0cCkpKQorICAgIGdvdG8gaW52YWxpZF9idWZmZXI7CisKKyAgcHQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF90eXBlICgmcnRwKTsKKyAgc2VxbnVtID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAoJnJ0cCk7CisgIHJ0cHRpbWUgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wICgmcnRwKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIC8qIG1ha2Ugc3VyZSB3ZSBoYXZlIFBUUyBhbmQgRFRTIHNldCAqLworICBwdHMgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKyAgZHRzID0gR1NUX0JVRkZFUl9EVFMgKGJ1ZmZlcik7CisgIGlmIChkdHMgPT0gLTEpCisgICAgZHRzID0gcHRzOworICBlbHNlIGlmIChwdHMgPT0gLTEpCisgICAgcHRzID0gZHRzOworCisgIGlmIChkdHMgPT0gLTEpIHsKKyAgICAvKiBJZiB3ZSBoYXZlIG5vIERUUyBoZXJlLCBpLmUuIG5vIGNhcHR1cmUgdGltZSwgZ2V0IG9uZSBmcm9tIHRoZQorICAgICAqIGNsb2NrIG5vdyB0byBoYXZlIHNvbWV0aGluZyB0byBjYWxjdWxhdGUgd2l0aCBpbiB0aGUgZnV0dXJlLiAqLworICAgIGR0cyA9IGdldF9jdXJyZW50X3J1bm5pbmdfdGltZSAoaml0dGVyYnVmZmVyKTsKKyAgICBwdHMgPSBkdHM7CisKKyAgICAvKiBSZW1lbWJlciB0aGF0IHdlIGVzdGltYXRlZCB0aGUgRFRTIGlmIHdlIGFyZSBydW5uaW5nIGFscmVhZHkKKyAgICAgKiBhbmQgdGhpcyBpcyBub3Qgb3VyIGZpcnN0IHBhY2tldCAob3IgZmlyc3QgcGFja2V0IGFmdGVyIGEgcmVzZXQpLgorICAgICAqIElmIGl0J3MgdGhlIGZpcnN0IHBhY2tldCwgd2Ugc29tZWhvdyBtdXN0IGdlbmVyYXRlIGEgdGltZXN0YW1wIGZvcgorICAgICAqIGV2ZXJ5dGhpbmcsIG90aGVyd2lzZSB3ZSBjYW4ndCBjYWxjdWxhdGUgYW55IHRpbWVzCisgICAgICovCisgICAgZXN0aW1hdGVkX2R0cyA9IChwcml2LT5uZXh0X2luX3NlcW51bSAhPSAtMSk7CisgIH0gZWxzZSB7CisgICAgLyogdGFrZSB0aGUgRFRTIG9mIHRoZSBidWZmZXIuIFRoaXMgaXMgdGhlIHRpbWUgd2hlbiB0aGUgcGFja2V0IHdhcworICAgICAqIHJlY2VpdmVkIGFuZCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSBqaXR0ZXIgYW5kIGNsb2NrIHNrZXcuIFdlIHdpbGwgYWRqdXN0CisgICAgICogdGhpcyBEVFMgd2l0aCB0aGUgc21vb3RoZWQgdmFsdWUgYWZ0ZXIgcHJvY2Vzc2luZyBpdCBpbiB0aGUKKyAgICAgKiBqaXR0ZXJidWZmZXIgYW5kIGFzc2lnbiBpdCBhcyB0aGUgUFRTLiAqLworICAgIC8qIGJyaW5nIHRvIHJ1bm5pbmcgdGltZSAqLworICAgIGR0cyA9IGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJnByaXYtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgZHRzKTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwKKyAgICAgICJSZWNlaXZlZCBwYWNrZXQgIyVkIGF0IHRpbWUgJSIgR1NUX1RJTUVfRk9STUFUICIsIGRpc2NvbnQgJWQsIHJ0eCAlZCIsCisgICAgICBzZXFudW0sIEdTVF9USU1FX0FSR1MgKGR0cyksIEdTVF9CVUZGRVJfSVNfRElTQ09OVCAoYnVmZmVyKSwKKyAgICAgIEdTVF9CVUZGRVJfSVNfUkVUUkFOU01JU1NJT04gKGJ1ZmZlcikpOworCisgIEpCVUZfTE9DS19DSEVDSyAocHJpdiwgb3V0X2ZsdXNoaW5nKTsKKworICBpZiAoR19VTkxJS0VMWSAocHJpdi0+bGFzdF9wdCAhPSBwdCkpIHsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAicHQgY2hhbmdlZCBmcm9tICV1IHRvICV1IiwgcHJpdi0+bGFzdF9wdCwKKyAgICAgICAgcHQpOworCisgICAgcHJpdi0+bGFzdF9wdCA9IHB0OworICAgIC8qIHJlc2V0IGNsb2NrLXJhdGUgc28gdGhhdCB3ZSBnZXQgYSBuZXcgb25lICovCisgICAgcHJpdi0+Y2xvY2tfcmF0ZSA9IC0xOworCisgICAgLyogVHJ5IHRvIGdldCB0aGUgY2xvY2stcmF0ZSBmcm9tIHRoZSBjYXBzIGZpcnN0IGlmIHdlIGNhbi4gSWYgdGhlcmUgYXJlIG5vCisgICAgICogY2FwcyB3ZSBtdXN0IGZpcmUgdGhlIHNpZ25hbCB0byBnZXQgdGhlIGNsb2NrLXJhdGUuICovCisgICAgaWYgKChjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChwYWQpKSkgeworICAgICAgZ3N0X2ppdHRlcl9idWZmZXJfc2lua19wYXJzZV9jYXBzIChqaXR0ZXJidWZmZXIsIGNhcHMsIHB0KTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICB9CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAocHJpdi0+Y2xvY2tfcmF0ZSA9PSAtMSkpIHsKKyAgICAvKiBubyBjbG9jayByYXRlIGdpdmVuIG9uIHRoZSBjYXBzLCB0cnkgdG8gZ2V0IG9uZSB3aXRoIHRoZSBzaWduYWwgKi8KKyAgICBpZiAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2dldF9jbG9ja19yYXRlIChqaXR0ZXJidWZmZXIsCisgICAgICAgICAgICBwdCkgPT0gR1NUX0ZMT1dfRkxVU0hJTkcpCisgICAgICBnb3RvIG91dF9mbHVzaGluZzsKKworICAgIGlmIChHX1VOTElLRUxZIChwcml2LT5jbG9ja19yYXRlID09IC0xKSkKKyAgICAgIGdvdG8gbm9fY2xvY2tfcmF0ZTsKKworICAgIGdzdF9ydHBfcGFja2V0X3JhdGVfY3R4X3Jlc2V0ICgmcHJpdi0+cGFja2V0X3JhdGVfY3R4LCBwcml2LT5jbG9ja19yYXRlKTsKKyAgfQorCisgIC8qIGRvbid0IGFjY2VwdCBtb3JlIGRhdGEgb24gRU9TICovCisgIGlmIChHX1VOTElLRUxZIChwcml2LT5lb3MpKQorICAgIGdvdG8gaGF2ZV9lb3M7CisKKyAgaWYgKCFHU1RfQlVGRkVSX0lTX1JFVFJBTlNNSVNTSU9OIChidWZmZXIpKQorICAgIGNhbGN1bGF0ZV9qaXR0ZXIgKGppdHRlcmJ1ZmZlciwgZHRzLCBydHB0aW1lKTsKKworICBpZiAocHJpdi0+c2VxbnVtX2Jhc2UgIT0gLTEpIHsKKyAgICBnaW50IGdhcDsKKworICAgIGdhcCA9IGdzdF9ydHBfYnVmZmVyX2NvbXBhcmVfc2VxbnVtIChwcml2LT5zZXFudW1fYmFzZSwgc2VxbnVtKTsKKworICAgIGlmIChnYXAgPCAwKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAgICAgInBhY2tldCBzZXFudW0gIyVkIGJlZm9yZSBzZXFudW0tYmFzZSAjJWQiLCBzZXFudW0sCisgICAgICAgICAgcHJpdi0+c2VxbnVtX2Jhc2UpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICAgIGdvdG8gZmluaXNoZWQ7CisgICAgfSBlbHNlIGlmIChnYXAgPiAxNjM4NCkgeworICAgICAgLyogRnJvbSBub3cgb24gZG9uJ3QgY29tcGFyZSBhZ2FpbnN0IHRoZSBzZXFudW0gYmFzZSBhbnltb3JlIGFzCisgICAgICAgKiBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUgd2Ugd2lsbCB3cmFwIGFyb3VuZCBhbmQgYWxzbyB0aGF0CisgICAgICAgKiBtdWNoIHJlb3JkZXJpbmcgaXMgdmVyeSB1bmxpa2VseSAqLworICAgICAgcHJpdi0+c2VxbnVtX2Jhc2UgPSAtMTsKKyAgICB9CisgIH0KKworICBleHBlY3RlZCA9IHByaXYtPm5leHRfaW5fc2VxbnVtOworCisgIHBhY2tldF9yYXRlID0KKyAgICAgIGdzdF9ydHBfcGFja2V0X3JhdGVfY3R4X3VwZGF0ZSAoJnByaXYtPnBhY2tldF9yYXRlX2N0eCwgc2VxbnVtLCBydHB0aW1lKTsKKyAgbWF4X2Ryb3BvdXQgPQorICAgICAgZ3N0X3J0cF9wYWNrZXRfcmF0ZV9jdHhfZ2V0X21heF9kcm9wb3V0ICgmcHJpdi0+cGFja2V0X3JhdGVfY3R4LAorICAgICAgcHJpdi0+bWF4X2Ryb3BvdXRfdGltZSk7CisgIG1heF9taXNvcmRlciA9CisgICAgICBnc3RfcnRwX3BhY2tldF9yYXRlX2N0eF9nZXRfbWF4X21pc29yZGVyICgmcHJpdi0+cGFja2V0X3JhdGVfY3R4LAorICAgICAgcHJpdi0+bWF4X21pc29yZGVyX3RpbWUpOworICBHU1RfVFJBQ0VfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAicGFja2V0X3JhdGU6ICVkLCBtYXhfZHJvcG91dDogJWQsIG1heF9taXNvcmRlcjogJWQiLCBwYWNrZXRfcmF0ZSwKKyAgICAgIG1heF9kcm9wb3V0LCBtYXhfbWlzb3JkZXIpOworCisgIC8qIG5vdyBjaGVjayBhZ2FpbnN0IG91ciBleHBlY3RlZCBzZXFudW0gKi8KKyAgaWYgKEdfVU5MSUtFTFkgKGV4cGVjdGVkID09IC0xKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIkZpcnN0IGJ1ZmZlciAjJWQiLCBzZXFudW0pOworCisgICAgLyogY2FsY3VsYXRlIGEgcHRzIGJhc2VkIG9uIHJ0cHRpbWUgYW5kIGFycml2YWwgdGltZSAoZHRzKSAqLworICAgIHB0cyA9CisgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2NhbGN1bGF0ZV9wdHMgKHByaXYtPmpidWYsIGR0cywgZXN0aW1hdGVkX2R0cywKKyAgICAgICAgcnRwdGltZSwgZ3N0X2VsZW1lbnRfZ2V0X2Jhc2VfdGltZSAoR1NUX0VMRU1FTlRfQ0FTVCAoaml0dGVyYnVmZmVyKSkpOworCisgICAgLyogd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBuZXh0X2luX3NlcW51bSBzaG91bGQgYmUsIHdhaXQgZm9yIHRoZSBsYXN0CisgICAgICogcG9zc2libGUgbW9tZW50IHRvIHB1c2ggdGhpcyBidWZmZXIsIG1heWJlIHdlIGdldCBhbiBlYXJsaWVyIHNlcW51bQorICAgICAqIHdoaWxlIHdlIHdhaXQgKi8KKyAgICBzZXRfdGltZXIgKGppdHRlcmJ1ZmZlciwgVElNRVJfVFlQRV9ERUFETElORSwgc2VxbnVtLCBwdHMpOworCisgICAgZG9fbmV4dF9zZXFudW0gPSBUUlVFOworICAgIC8qIHRha2UgcnRwdGltZSBhbmQgcHRzIHRvIGNhbGN1bGF0ZSBwYWNrZXQgc3BhY2luZyAqLworICAgIHByaXYtPmlwc19ydHB0aW1lID0gcnRwdGltZTsKKyAgICBwcml2LT5pcHNfcHRzID0gcHRzOworCisgIH0gZWxzZSB7CisgICAgZ2ludCBnYXA7CisgICAgLyogbm93IGNhbGN1bGF0ZSBnYXAgKi8KKyAgICBnYXAgPSBnc3RfcnRwX2J1ZmZlcl9jb21wYXJlX3NlcW51bSAoZXhwZWN0ZWQsIHNlcW51bSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiZXhwZWN0ZWQgIyVkLCBnb3QgIyVkLCBnYXAgb2YgJWQiLAorICAgICAgICBleHBlY3RlZCwgc2VxbnVtLCBnYXApOworCisgICAgaWYgKEdfVU5MSUtFTFkgKGdhcCA+IDAgJiYgcHJpdi0+dGltZXJzLT5sZW4gPj0gbWF4X2Ryb3BvdXQpKSB7CisgICAgICAvKiBJZiB3ZSBoYXZlIHRpbWVycyBmb3IgbW9yZSB0aGFuIFJUUF9NQVhfRFJPUE9VVCBwYWNrZXRzCisgICAgICAgKiBwZW5kaW5nIHRoaXMgbWVhbnMgdGhhdCB3ZSBoYXZlIGEgaHVnZSBnYXAgb3ZlcmFsbC4gV2UgY2FuCisgICAgICAgKiByZXNldCB0aGUgaml0dGVyYnVmZmVyIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB0aGVyZSdzCisgICAgICAgKiBqdXN0IHRvbyBtdWNoIGRhdGEgbWlzc2luZyB0byBiZSBhYmxlIHRvIGRvIGFueXRoaW5nCisgICAgICAgKiBzZW5zaWJsZSB3aXRoIHRoZSBwYXN0IGRhdGEuIEp1c3QgdHJ5IGFnYWluIGZyb20gdGhlCisgICAgICAgKiBuZXh0IHBhY2tldCAqLworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICIlZCBwZW5kaW5nIHRpbWVycyA+ICVkIC0gcmVzZXR0aW5nIiwKKyAgICAgICAgICBwcml2LT50aW1lcnMtPmxlbiwgbWF4X2Ryb3BvdXQpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICAgIHJldHVybiBnc3RfcnRwX2ppdHRlcl9idWZmZXJfcmVzZXQgKGppdHRlcmJ1ZmZlciwgcGFkLCBwYXJlbnQsIHNlcW51bSk7CisgICAgfQorCisgICAgLyogU3BlY2lhbCBoYW5kbGluZyBvZiBsYXJnZSBnYXBzICovCisgICAgaWYgKChnYXAgIT0gLTEgJiYgZ2FwIDwgLW1heF9taXNvcmRlcikgfHwgKGdhcCA+PSBtYXhfZHJvcG91dCkpIHsKKyAgICAgIGdib29sZWFuIHJlc2V0ID0gaGFuZGxlX2JpZ19nYXBfYnVmZmVyIChqaXR0ZXJidWZmZXIsIGJ1ZmZlciwgcHQsIHNlcW51bSwKKyAgICAgICAgICBnYXAsIG1heF9kcm9wb3V0LCBtYXhfbWlzb3JkZXIpOworICAgICAgaWYgKHJlc2V0KSB7CisgICAgICAgIHJldHVybiBnc3RfcnRwX2ppdHRlcl9idWZmZXJfcmVzZXQgKGppdHRlcmJ1ZmZlciwgcGFkLCBwYXJlbnQsIHNlcW51bSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAgICAgICAiSGFkIGJpZyBnYXAsIHdhaXRpbmcgZm9yIG1vcmUgY29uc2VjdXRpdmUgcGFja2V0cyIpOworICAgICAgICBnb3RvIGZpbmlzaGVkOworICAgICAgfQorICAgIH0KKworICAgIC8qIFdlIGhhZCBubyBodWdlIGdhcCwgbGV0J3MgZHJvcCBhbGwgdGhlIGdhcCBwYWNrZXRzICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiQ2xlYXJpbmcgZ2FwIHBhY2tldHMiKTsKKyAgICBnX3F1ZXVlX2ZvcmVhY2ggKCZwcml2LT5nYXBfcGFja2V0cywgKEdGdW5jKSBnc3RfYnVmZmVyX3VucmVmLCBOVUxMKTsKKyAgICBnX3F1ZXVlX2NsZWFyICgmcHJpdi0+Z2FwX3BhY2tldHMpOworCisgICAgLyogY2FsY3VsYXRlIGEgcHRzIGJhc2VkIG9uIHJ0cHRpbWUgYW5kIGFycml2YWwgdGltZSAoZHRzKSAqLworICAgIC8qIElmIHdlIGVzdGltYXRlZCB0aGUgRFRTLCBkb24ndCBjb25zaWRlciBpdCBpbiB0aGUgY2xvY2sgc2tldyBjYWxjdWxhdGlvbnMgKi8KKyAgICBwdHMgPQorICAgICAgICBydHBfaml0dGVyX2J1ZmZlcl9jYWxjdWxhdGVfcHRzIChwcml2LT5qYnVmLCBkdHMsIGVzdGltYXRlZF9kdHMsCisgICAgICAgIHJ0cHRpbWUsIGdzdF9lbGVtZW50X2dldF9iYXNlX3RpbWUgKEdTVF9FTEVNRU5UX0NBU1QgKGppdHRlcmJ1ZmZlcikpKTsKKworICAgIGlmIChHX0xJS0VMWSAoZ2FwID09IDApKSB7CisgICAgICAvKiBwYWNrZXQgaXMgZXhwZWN0ZWQgKi8KKyAgICAgIGNhbGN1bGF0ZV9wYWNrZXRfc3BhY2luZyAoaml0dGVyYnVmZmVyLCBydHB0aW1lLCBwdHMpOworICAgICAgZG9fbmV4dF9zZXFudW0gPSBUUlVFOworICAgIH0gZWxzZSB7CisKKyAgICAgIC8qIHdlIGhhdmUgYSBnYXAgKi8KKyAgICAgIGlmIChnYXAgPiAwKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIiVkIG1pc3NpbmcgcGFja2V0cyIsIGdhcCk7CisgICAgICAgIC8qIGZpbGwgaW4gdGhlIGdhcCB3aXRoIEVYUEVDVEVEIHRpbWVycyAqLworICAgICAgICBjYWxjdWxhdGVfZXhwZWN0ZWQgKGppdHRlcmJ1ZmZlciwgZXhwZWN0ZWQsIHNlcW51bSwgcHRzLCBnYXApOworICAgICAgICBkb19uZXh0X3NlcW51bSA9IFRSVUU7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJvbGQgcGFja2V0IHJlY2VpdmVkIik7CisgICAgICAgIGRvX25leHRfc2VxbnVtID0gRkFMU0U7CisgICAgICB9CisKKyAgICAgIC8qIHJlc2V0IHNwYWNpbmcgZXN0aW1hdGlvbiB3aGVuIGdhcCAqLworICAgICAgcHJpdi0+aXBzX3J0cHRpbWUgPSAtMTsKKyAgICAgIHByaXYtPmlwc19wdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgIH0KKyAgfQorCisgIGlmIChkb19uZXh0X3NlcW51bSkgeworICAgIHByaXYtPmxhc3RfaW5fcHRzID0gcHRzOworICAgIHByaXYtPm5leHRfaW5fc2VxbnVtID0gKHNlcW51bSArIDEpICYgMHhmZmZmOworICB9CisKKyAgdGltZXIgPSBmaW5kX3RpbWVyIChqaXR0ZXJidWZmZXIsIHNlcW51bSk7CisgIGlmIChHU1RfQlVGRkVSX0lTX1JFVFJBTlNNSVNTSU9OIChidWZmZXIpKSB7CisgICAgaWYgKCF0aW1lcikKKyAgICAgIHRpbWVyID0gdGltZXJfcXVldWVfZmluZCAocHJpdi0+cnR4X3N0YXRzX3RpbWVycywgc2VxbnVtKTsKKyAgICBpZiAodGltZXIpCisgICAgICB0aW1lci0+bnVtX3J0eF9yZWNlaXZlZCsrOworICB9CisKKyAgLyogbGV0J3MgY2hlY2sgaWYgdGhpcyBidWZmZXIgaXMgdG9vIGxhdGUsIHdlIGNhbiBvbmx5IGFjY2VwdCBwYWNrZXRzIHdpdGgKKyAgICogYmlnZ2VyIHNlcW51bSB0aGFuIHRoZSBvbmUgd2UgbGFzdCBwdXNoZWQuICovCisgIGlmIChHX0xJS0VMWSAocHJpdi0+bGFzdF9wb3BwZWRfc2VxbnVtICE9IC0xKSkgeworICAgIGdpbnQgZ2FwOworCisgICAgZ2FwID0gZ3N0X3J0cF9idWZmZXJfY29tcGFyZV9zZXFudW0gKHByaXYtPmxhc3RfcG9wcGVkX3NlcW51bSwgc2VxbnVtKTsKKworICAgIC8qIHByaXYtPmxhc3RfcG9wcGVkX3NlcW51bSA+PSBzZXFudW0sIHdlJ3JlIHRvbyBsYXRlLiAqLworICAgIGlmIChHX1VOTElLRUxZIChnYXAgPD0gMCkpIHsKKyAgICAgIGlmIChwcml2LT5kb19yZXRyYW5zbWlzc2lvbikgeworICAgICAgICBpZiAoR1NUX0JVRkZFUl9JU19SRVRSQU5TTUlTU0lPTiAoYnVmZmVyKSAmJiB0aW1lcikgeworICAgICAgICAgIHVwZGF0ZV9ydHhfc3RhdHMgKGppdHRlcmJ1ZmZlciwgdGltZXIsIGR0cywgRkFMU0UpOworICAgICAgICAgIC8qIE9ubHkgY291bnQgdGhlIHJldHJhbm1pdHRlZCBwYWNrZXQgdG9vIGxhdGUgaWYgaXQgaGFzIGJlZW4KKyAgICAgICAgICAgKiBjb25zaWRlcmVkIGxvc3QuIElmIHRoZSBvcmlnaW5hbCBwYWNrZXQgYXJyaXZlZCBiZWZvcmUgdGhlCisgICAgICAgICAgICogcmV0cmFuc21pdHRlZCB3ZSBqdXN0IGNvdW50IGl0IGFzIGEgZHVwbGljYXRlLiAqLworICAgICAgICAgIGlmICh0aW1lci0+dHlwZSAhPSBUSU1FUl9UWVBFX0xPU1QpCisgICAgICAgICAgICBnb3RvIHJ0eF9kdXBsaWNhdGU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdvdG8gdG9vX2xhdGU7CisgICAgfQorICB9CisKKyAgaWYgKGFscmVhZHlfbG9zdCAoaml0dGVyYnVmZmVyLCBzZXFudW0pKQorICAgIGdvdG8gYWxyZWFkeV9sb3N0OworCisgIC8qIGxldCdzIGRyb3Agb2xkZXN0IHBhY2tldCBpZiB0aGUgcXVldWUgaXMgYWxyZWFkeSBmdWxsIGFuZCBkcm9wLW9uLWxhdGVuY3kKKyAgICogaXMgc2V0LiBXZSBjYW4gb25seSBkbyB0aGlzIHdoZW4gdGhlcmUgYWN0dWFsbHkgaXMgYSBsYXRlbmN5LiBXaGVuIG5vCisgICAqIGxhdGVuY3kgaXMgc2V0LCB3ZSBqdXN0IHB1bXAgaXQgaW4gdGhlIHF1ZXVlIGFuZCBsZXQgdGhlIG90aGVyIGVuZCBwdXNoIGl0CisgICAqIG91dCBhcyBmYXN0IGFzIHBvc3NpYmxlLiAqLworICBpZiAocHJpdi0+bGF0ZW5jeV9tcyAmJiBwcml2LT5kcm9wX29uX2xhdGVuY3kpIHsKKyAgICBsYXRlbmN5X3RzID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAocHJpdi0+bGF0ZW5jeV9tcywgcHJpdi0+Y2xvY2tfcmF0ZSwgMTAwMCk7CisKKyAgICBpZiAoR19VTkxJS0VMWSAocnRwX2ppdHRlcl9idWZmZXJfZ2V0X3RzX2RpZmYgKHByaXYtPmpidWYpID49IGxhdGVuY3lfdHMpKSB7CisgICAgICBSVFBKaXR0ZXJCdWZmZXJJdGVtICpvbGRfaXRlbTsKKworICAgICAgb2xkX2l0ZW0gPSBydHBfaml0dGVyX2J1ZmZlcl9wZWVrIChwcml2LT5qYnVmKTsKKworICAgICAgaWYgKElTX0RST1BBQkxFIChvbGRfaXRlbSkpIHsKKyAgICAgICAgb2xkX2l0ZW0gPSBydHBfaml0dGVyX2J1ZmZlcl9wb3AgKHByaXYtPmpidWYsICZwZXJjZW50KTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiUXVldWUgZnVsbCwgZHJvcHBpbmcgb2xkIHBhY2tldCAlcCIsCisgICAgICAgICAgICBvbGRfaXRlbSk7CisgICAgICAgIHByaXYtPm5leHRfc2VxbnVtID0gKG9sZF9pdGVtLT5zZXFudW0gKyBvbGRfaXRlbS0+Y291bnQpICYgMHhmZmZmOworICAgICAgICBmcmVlX2l0ZW0gKG9sZF9pdGVtKTsKKyAgICAgIH0KKyAgICAgIC8qIHdlIG1pZ2h0IGhhdmUgcmVtb3ZlZCBzb21lIGhlYWQgYnVmZmVycywgc2lnbmFsIHRoZSBwdXNoaW5nIHRocmVhZCB0bworICAgICAgICogc2VlIGlmIGl0IGNhbiBwdXNoIG5vdyAqLworICAgICAgSkJVRl9TSUdOQUxfRVZFTlQgKHByaXYpOworICAgIH0KKyAgfQorCisgIC8qIElmIHdlIGVzdGltYXRlZCB0aGUgRFRTLCBkb24ndCBjb25zaWRlciBpdCBpbiB0aGUgY2xvY2sgc2tldyBjYWxjdWxhdGlvbnMKKyAgICogbGF0ZXIuIFRoZSBjb2RlIGFib3ZlIGFsd2F5cyBzZXRzIGR0cyB0byBwdHMgb3IgdGhlIG90aGVyIHdheSBhcm91bmQgaWYKKyAgICogYW55IG9mIHRob3NlIGlzIHZhbGlkIGluIHRoZSBidWZmZXIsIHNvIHdlIGtub3cgdGhhdCBpZiB3ZSBlc3RpbWF0ZWQgdGhlCisgICAqIGR0cyB0aGF0IGJvdGggYXJlIHVua25vd24gKi8KKyAgaWYgKGVzdGltYXRlZF9kdHMpCisgICAgaXRlbSA9CisgICAgICAgIGFsbG9jX2l0ZW0gKGJ1ZmZlciwgSVRFTV9UWVBFX0JVRkZFUiwgR1NUX0NMT0NLX1RJTUVfTk9ORSwKKyAgICAgICAgcHRzLCBzZXFudW0sIDEsIHJ0cHRpbWUpOworICBlbHNlCisgICAgaXRlbSA9IGFsbG9jX2l0ZW0gKGJ1ZmZlciwgSVRFTV9UWVBFX0JVRkZFUiwgZHRzLCBwdHMsIHNlcW51bSwgMSwgcnRwdGltZSk7CisKKyAgLyogbm93IGluc2VydCB0aGUgcGFja2V0IGludG8gdGhlIHF1ZXVlIGluIHNvcnRlZCBvcmRlci4gVGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICAqIEZBTFNFIGlmIGEgcGFja2V0IHdpdGggdGhlIHNhbWUgc2VxbnVtIHdhcyBhbHJlYWR5IGluIHRoZSBxdWV1ZSwgbWVhbmluZyB3ZQorICAgKiBoYXZlIGEgZHVwbGljYXRlLiAqLworICBpZiAoR19VTkxJS0VMWSAoIXJ0cF9qaXR0ZXJfYnVmZmVyX2luc2VydCAocHJpdi0+amJ1ZiwgaXRlbSwgJmhlYWQsCisgICAgICAgICAgICAgICZwZXJjZW50KSkpIHsKKyAgICBpZiAoR1NUX0JVRkZFUl9JU19SRVRSQU5TTUlTU0lPTiAoYnVmZmVyKSAmJiB0aW1lcikKKyAgICAgIHVwZGF0ZV9ydHhfc3RhdHMgKGppdHRlcmJ1ZmZlciwgdGltZXIsIGR0cywgRkFMU0UpOworICAgIGdvdG8gZHVwbGljYXRlOworICB9CisKKyAgLyogVHJpZ2dlciBmYXN0IHN0YXJ0IGlmIG5lZWRlZCAqLworICBpZiAoZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2Zhc3Rfc3RhcnQgKGppdHRlcmJ1ZmZlcikpCisgICAgaGVhZCA9IFRSVUU7CisKKyAgLyogdXBkYXRlIHRpbWVycyAqLworICB1cGRhdGVfdGltZXJzIChqaXR0ZXJidWZmZXIsIHNlcW51bSwgZHRzLCBwdHMsIGRvX25leHRfc2VxbnVtLAorICAgICAgR1NUX0JVRkZFUl9JU19SRVRSQU5TTUlTU0lPTiAoYnVmZmVyKSwgdGltZXIpOworCisgIC8qIHdlIGhhZCBhbiB1bmhhbmRsZWQgU1IsIGhhbmRsZSBpdCBub3cgKi8KKyAgaWYgKHByaXYtPmxhc3Rfc3IpCisgICAgZG9faGFuZGxlX3N5bmMgKGppdHRlcmJ1ZmZlcik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKGhlYWQpKSB7CisgICAgLyogc2lnbmFsIGFkZGl0aW9uIG9mIG5ldyBidWZmZXIgd2hlbiB0aGUgX2xvb3AgaXMgd2FpdGluZy4gKi8KKyAgICBpZiAoR19MSUtFTFkgKHByaXYtPmFjdGl2ZSkpCisgICAgICBKQlVGX1NJR05BTF9FVkVOVCAocHJpdik7CisKKyAgICAvKiBsZXQncyB1bnNjaGVkdWxlIGFuZCB1bmJsb2NrIGFueSB3YWl0aW5nIGJ1ZmZlcnMuIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzCisgICAgICogd2hlbiB0aGUgaGVhZCBidWZmZXIgY2hhbmdlZCAqLworICAgIGlmIChHX1VOTElLRUxZIChwcml2LT5jbG9ja19pZCkpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIlVuc2NoZWR1bGluZyB3YWl0aW5nIG5ldyBidWZmZXIiKTsKKyAgICAgIHVuc2NoZWR1bGVfY3VycmVudF90aW1lciAoaml0dGVyYnVmZmVyKTsKKyAgICB9CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAiUHVzaGVkIHBhY2tldCAjJWQsIG5vdyAlZCBwYWNrZXRzLCBoZWFkOiAlZCwgIiAicGVyY2VudCAlZCIsIHNlcW51bSwKKyAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX251bV9wYWNrZXRzIChwcml2LT5qYnVmKSwgaGVhZCwgcGVyY2VudCk7CisKKyAgbXNnID0gY2hlY2tfYnVmZmVyaW5nX3BlcmNlbnQgKGppdHRlcmJ1ZmZlciwgcGVyY2VudCk7CisKK2ZpbmlzaGVkOgorICBKQlVGX1VOTE9DSyAocHJpdik7CisKKyAgaWYgKG1zZykKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKGppdHRlcmJ1ZmZlciksIG1zZyk7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfYnVmZmVyOgorICB7CisgICAgLyogdGhpcyBpcyBub3QgZmF0YWwgYnV0IHNob3VsZCBiZSBmaWx0ZXJlZCBlYXJsaWVyICovCisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoaml0dGVyYnVmZmVyLCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAoIlJlY2VpdmVkIGludmFsaWQgUlRQIHBheWxvYWQsIGRyb3BwaW5nIikpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9Citub19jbG9ja19yYXRlOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAgICJObyBjbG9jay1yYXRlIGluIGNhcHMhLCBkcm9wcGluZyBidWZmZXIiKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIGdvdG8gZmluaXNoZWQ7CisgIH0KK291dF9mbHVzaGluZzoKKyAgeworICAgIHJldCA9IHByaXYtPnNyY3Jlc3VsdDsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJmbHVzaGluZyAlcyIsIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIGdvdG8gZmluaXNoZWQ7CisgIH0KK2hhdmVfZW9zOgorICB7CisgICAgcmV0ID0gR1NUX0ZMT1dfRU9TOworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoaml0dGVyYnVmZmVyLCAid2UgYXJlIEVPUywgcmVmdXNpbmcgYnVmZmVyIik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICBnb3RvIGZpbmlzaGVkOworICB9Cit0b29fbGF0ZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIlBhY2tldCAjJWQgdG9vIGxhdGUgYXMgIyVkIHdhcyBhbHJlYWR5IgorICAgICAgICAiIHBvcHBlZCwgZHJvcHBpbmciLCBzZXFudW0sIHByaXYtPmxhc3RfcG9wcGVkX3NlcW51bSk7CisgICAgcHJpdi0+bnVtX2xhdGUrKzsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIGdvdG8gZmluaXNoZWQ7CisgIH0KK2FscmVhZHlfbG9zdDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIlBhY2tldCAjJWQgdG9vIGxhdGUgYXMgaXQgd2FzIGFscmVhZHkgIgorICAgICAgICAiY29uc2lkZXJlZCBsb3N0Iiwgc2VxbnVtKTsKKyAgICBwcml2LT5udW1fbGF0ZSsrOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgZ290byBmaW5pc2hlZDsKKyAgfQorZHVwbGljYXRlOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiRHVwbGljYXRlIHBhY2tldCAjJWQgZGV0ZWN0ZWQsIGRyb3BwaW5nIiwKKyAgICAgICAgc2VxbnVtKTsKKyAgICBwcml2LT5udW1fZHVwbGljYXRlcysrOworICAgIGZyZWVfaXRlbSAoaXRlbSk7CisgICAgZ290byBmaW5pc2hlZDsKKyAgfQorcnR4X2R1cGxpY2F0ZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwKKyAgICAgICAgIkR1cGxpY2F0ZSBSVFggcGFja2V0ICMlZCBkZXRlY3RlZCwgZHJvcHBpbmciLCBzZXFudW0pOworICAgIHByaXYtPm51bV9kdXBsaWNhdGVzKys7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICBnb3RvIGZpbmlzaGVkOworICB9Cit9CisKKy8qIEZJWE1FOiBob3BlZnVsbHkgd2UgY2FuIGRvIHNvbWV0aGluZyBtb3JlIGVmZmljaWVudCBoZXJlLCBlc3BlY2lhbGx5IHdoZW4KKyAqIGFsbCBwYWNrZXRzIGFyZSBpbiBvcmRlciBhbmQvb3Igb3V0c2lkZSBvZiB0aGUgY3VycmVudGx5IGNhY2hlZCByYW5nZS4KKyAqIFN0aWxsIHdvcnRod2hpbGUgdG8gaGF2ZSBpdCwgYXZvaWRzIHRha2luZy9yZWxlYXNpbmcgb2JqZWN0IGxvY2sgYW5kIHBhZAorICogc3RyZWFtIGxvY2sgZm9yIGV2ZXJ5IHNpbmdsZSBidWZmZXIgaW4gdGhlIGRlZmF1bHQgY2hhaW5fbGlzdCBmYWxsYmFjay4gKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW5fbGlzdCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyTGlzdCAqIGJ1ZmZlcl9saXN0KQoreworICBHc3RGbG93UmV0dXJuIGZsb3dfcmV0ID0gR1NUX0ZMT1dfT0s7CisgIGd1aW50IGksIG47CisKKyAgbiA9IGdzdF9idWZmZXJfbGlzdF9sZW5ndGggKGJ1ZmZlcl9saXN0KTsKKyAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X2J1ZmZlcl9saXN0X2dldCAoYnVmZmVyX2xpc3QsIGkpOworCisgICAgZmxvd19yZXQgPSBnc3RfcnRwX2ppdHRlcl9idWZmZXJfY2hhaW4gKHBhZCwgcGFyZW50LCBnc3RfYnVmZmVyX3JlZiAoYnVmKSk7CisKKyAgICBpZiAoZmxvd19yZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBicmVhazsKKyAgfQorICBnc3RfYnVmZmVyX2xpc3RfdW5yZWYgKGJ1ZmZlcl9saXN0KTsKKworICByZXR1cm4gZmxvd19yZXQ7Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2NvbXB1dGVfZWxhcHNlZCAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLCBSVFBKaXR0ZXJCdWZmZXJJdGVtICogaXRlbSkKK3sKKyAgZ3VpbnQ2NCBleHRfdGltZSwgZWxhcHNlZDsKKyAgZ3VpbnQzMiBydHBfdGltZTsKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworICBydHBfdGltZSA9IGl0ZW0tPnJ0cHRpbWU7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInJ0cCAlIiBHX0dVSU5UMzJfRk9STUFUICIsIGV4dCAlIgorICAgICAgR19HVUlOVDY0X0ZPUk1BVCwgcnRwX3RpbWUsIHByaXYtPmV4dF90aW1lc3RhbXApOworCisgIGV4dF90aW1lID0gcHJpdi0+ZXh0X3RpbWVzdGFtcDsKKyAgZXh0X3RpbWUgPSBnc3RfcnRwX2J1ZmZlcl9leHRfdGltZXN0YW1wICgmZXh0X3RpbWUsIHJ0cF90aW1lKTsKKyAgaWYgKGV4dF90aW1lIDwgcHJpdi0+ZXh0X3RpbWVzdGFtcCkgeworICAgIGV4dF90aW1lID0gcHJpdi0+ZXh0X3RpbWVzdGFtcDsKKyAgfSBlbHNlIHsKKyAgICBwcml2LT5leHRfdGltZXN0YW1wID0gZXh0X3RpbWU7CisgIH0KKworICBpZiAoZXh0X3RpbWUgPiBwcml2LT5jbG9ja19iYXNlKQorICAgIGVsYXBzZWQgPSBleHRfdGltZSAtIHByaXYtPmNsb2NrX2Jhc2U7CisgIGVsc2UKKyAgICBlbGFwc2VkID0gMDsKKworICBlbGFwc2VkID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoZWxhcHNlZCwgR1NUX1NFQ09ORCwgcHJpdi0+Y2xvY2tfcmF0ZSk7CisgIHJldHVybiBlbGFwc2VkOworfQorCitzdGF0aWMgdm9pZAordXBkYXRlX2VzdGltYXRlZF9lb3MgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwKKyAgICBSVFBKaXR0ZXJCdWZmZXJJdGVtICogaXRlbSkKK3sKKyAgZ3VpbnQ2NCB0b3RhbCwgZWxhcHNlZCwgbGVmdCwgZXN0aW1hdGVkOworICBHc3RDbG9ja1RpbWUgb3V0X3RpbWU7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisKKyAgaWYgKHByaXYtPm5wdF9zdG9wID09IC0xIHx8IHByaXYtPmV4dF90aW1lc3RhbXAgPT0gLTEKKyAgICAgIHx8IHByaXYtPmNsb2NrX2Jhc2UgPT0gLTEgfHwgcHJpdi0+Y2xvY2tfcmF0ZSA8PSAwKQorICAgIHJldHVybjsKKworICAvKiBjb21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgKi8KKyAgZWxhcHNlZCA9IGNvbXB1dGVfZWxhcHNlZCAoaml0dGVyYnVmZmVyLCBpdGVtKTsKKworICAvKiBkbyBub3RoaW5nIGlmIGVsYXBzZWQgdGltZSBkb2Vzbid0IGluY3JlbWVudCAqLworICBpZiAocHJpdi0+bGFzdF9lbGFwc2VkICYmIGVsYXBzZWQgPD0gcHJpdi0+bGFzdF9lbGFwc2VkKQorICAgIHJldHVybjsKKworICBwcml2LT5sYXN0X2VsYXBzZWQgPSBlbGFwc2VkOworCisgIC8qIHRoaXMgaXMgdGhlIHRvdGFsIHRpbWUgd2UgbmVlZCB0byBwbGF5ICovCisgIHRvdGFsID0gcHJpdi0+bnB0X3N0b3AgLSBwcml2LT5ucHRfc3RhcnQ7CisgIEdTVF9MT0dfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJ0b3RhbCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0b3RhbCkpOworCisgIC8qIHRoaXMgaXMgaG93IG11Y2ggdGltZSB0aGVyZSBpcyBsZWZ0ICovCisgIGlmICh0b3RhbCA+IGVsYXBzZWQpCisgICAgbGVmdCA9IHRvdGFsIC0gZWxhcHNlZDsKKyAgZWxzZQorICAgIGxlZnQgPSAwOworCisgIC8qIGlmIHdlIGhhdmUgbGVzcyB0aW1lIGxlZnQgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLCB3ZSB3aWxsIG5vdAorICAgKiBiZSBhYmxlIHRvIGtlZXAgaXQgZmlsbGVkLCBkaXNhYmxlZCBidWZmZXJpbmcgdGhlbiAqLworICBpZiAobGVmdCA8IHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF9kZWxheSAocHJpdi0+amJ1ZikpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJsZWZ0ICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAiLCBkaXNhYmxlIGJ1ZmZlcmluZyBjbG9zZSB0byBFT1MiLCBHU1RfVElNRV9BUkdTIChsZWZ0KSk7CisgICAgcnRwX2ppdHRlcl9idWZmZXJfZGlzYWJsZV9idWZmZXJpbmcgKHByaXYtPmpidWYsIFRSVUUpOworICB9CisKKyAgLyogdGhpcyBpcyB0aGUgY3VycmVudCB0aW1lIGFzIHJ1bm5pbmctdGltZSAqLworICBvdXRfdGltZSA9IGl0ZW0tPnB0czsKKworICBpZiAoZWxhcHNlZCA+IDApCisgICAgZXN0aW1hdGVkID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChvdXRfdGltZSwgdG90YWwsIGVsYXBzZWQpOworICBlbHNlIHsKKyAgICAvKiBpZiB0aGVyZSBpcyBhbG1vc3Qgbm90aGluZyBsZWZ0LAorICAgICAqIHdlIG1heSBuZXZlciBhZHZhbmNlIGVub3VnaCB0byBlbmQgdXAgaW4gdGhlIGFib3ZlIGNhc2UgKi8KKyAgICBpZiAodG90YWwgPCBHU1RfU0VDT05EKQorICAgICAgZXN0aW1hdGVkID0gR1NUX1NFQ09ORDsKKyAgICBlbHNlCisgICAgICBlc3RpbWF0ZWQgPSAtMTsKKyAgfQorICBHU1RfTE9HX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiZWxhcHNlZCAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZXN0aW1hdGVkICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGVsYXBzZWQpLCBHU1RfVElNRV9BUkdTIChlc3RpbWF0ZWQpKTsKKworICBpZiAoZXN0aW1hdGVkICE9IC0xICYmIHByaXYtPmVzdGltYXRlZF9lb3MgIT0gZXN0aW1hdGVkKSB7CisgICAgc2V0X3RpbWVyIChqaXR0ZXJidWZmZXIsIFRJTUVSX1RZUEVfRU9TLCAtMSwgZXN0aW1hdGVkKTsKKyAgICBwcml2LT5lc3RpbWF0ZWRfZW9zID0gZXN0aW1hdGVkOworICB9Cit9CisKKy8qIHRha2UgYSBidWZmZXIgZnJvbSB0aGUgcXVldWUgYW5kIHB1c2ggaXQgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitwb3BfYW5kX3B1c2hfbmV4dCAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLCBndWludCBzZXFudW0pCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0ID0gR1NUX0ZMT1dfT0s7CisgIFJUUEppdHRlckJ1ZmZlckl0ZW0gKml0ZW07CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgR3N0RXZlbnQgKm91dGV2ZW50ID0gTlVMTDsKKyAgR3N0UXVlcnkgKm91dHF1ZXJ5ID0gTlVMTDsKKyAgR3N0Q2xvY2tUaW1lIGR0cywgcHRzOworICBnaW50IHBlcmNlbnQgPSAtMTsKKyAgZ2Jvb2xlYW4gZG9fcHVzaCA9IFRSVUU7CisgIGd1aW50IHR5cGU7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKworICAvKiB3aGVuIHdlIGdldCBoZXJlIHdlIGFyZSByZWFkeSB0byBwb3AgYW5kIHB1c2ggdGhlIGJ1ZmZlciAqLworICBpdGVtID0gcnRwX2ppdHRlcl9idWZmZXJfcG9wIChwcml2LT5qYnVmLCAmcGVyY2VudCk7CisgIHR5cGUgPSBpdGVtLT50eXBlOworCisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgSVRFTV9UWVBFX0JVRkZFUjoKKworICAgICAgLyogd2UgbmVlZCB0byBtYWtlIHdyaXRhYmxlIHRvIGNoYW5nZSB0aGUgZmxhZ3MgYW5kIHRpbWVzdGFtcHMgKi8KKyAgICAgIG91dGJ1ZiA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoaXRlbS0+ZGF0YSk7CisKKyAgICAgIGlmIChHX1VOTElLRUxZIChwcml2LT5kaXNjb250KSkgeworICAgICAgICAvKiBzZXQgRElTQ09OVCBmbGFnIHdoZW4gd2UgbWlzc2VkIGEgcGFja2V0LiBXZSBwdXNoZWQgdGhlIGJ1ZmZlciB3cml0YWJsZQorICAgICAgICAgKiBpbnRvIHRoZSBqaXR0ZXJidWZmZXIgc28gd2UgY2FuIG1vZGlmeSBub3cuICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIm1hcmsgb3V0cHV0IGJ1ZmZlciBkaXNjb250Iik7CisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgICAgICBwcml2LT5kaXNjb250ID0gRkFMU0U7CisgICAgICB9CisgICAgICBpZiAoR19VTkxJS0VMWSAocHJpdi0+dHNfZGlzY29udCkpIHsKKyAgICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfUkVTWU5DKTsKKyAgICAgICAgcHJpdi0+dHNfZGlzY29udCA9IEZBTFNFOworICAgICAgfQorCisgICAgICBkdHMgPQorICAgICAgICAgIGdzdF9zZWdtZW50X3Bvc2l0aW9uX2Zyb21fcnVubmluZ190aW1lICgmcHJpdi0+c2VnbWVudCwKKyAgICAgICAgICBHU1RfRk9STUFUX1RJTUUsIGl0ZW0tPmR0cyk7CisgICAgICBwdHMgPQorICAgICAgICAgIGdzdF9zZWdtZW50X3Bvc2l0aW9uX2Zyb21fcnVubmluZ190aW1lICgmcHJpdi0+c2VnbWVudCwKKyAgICAgICAgICBHU1RfRk9STUFUX1RJTUUsIGl0ZW0tPnB0cyk7CisKKyAgICAgIC8qIGlmIHRoaXMgaXMgYSBuZXcgZnJhbWUsIGNoZWNrIGlmIHRzX29mZnNldCBuZWVkcyB0byBiZSB1cGRhdGVkICovCisgICAgICBpZiAocHRzICE9IHByaXYtPmxhc3RfcHRzKSB7CisgICAgICAgIHVwZGF0ZV9vZmZzZXQgKGppdHRlcmJ1ZmZlcik7CisgICAgICB9CisKKyAgICAgIC8qIGFwcGx5IHRpbWVzdGFtcCB3aXRoIG9mZnNldCB0byBidWZmZXIgbm93ICovCisgICAgICBHU1RfQlVGRkVSX0RUUyAob3V0YnVmKSA9IGFwcGx5X29mZnNldCAoaml0dGVyYnVmZmVyLCBkdHMpOworICAgICAgR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikgPSBhcHBseV9vZmZzZXQgKGppdHRlcmJ1ZmZlciwgcHRzKTsKKworICAgICAgLyogdXBkYXRlIHRoZSBlbGFwc2VkIHRpbWUgd2hlbiB3ZSBuZWVkIHRvIGNoZWNrIGFnYWluc3QgdGhlIG5wdCBzdG9wIHRpbWUuICovCisgICAgICB1cGRhdGVfZXN0aW1hdGVkX2VvcyAoaml0dGVyYnVmZmVyLCBpdGVtKTsKKworICAgICAgLyogdmVyaWZ5IHRoYXQgYW4gb2Zmc2V0IGhhcyBub3QgY2F1c2VkIHRpbWUgc3RhbXBzIHRvIGdvIGJhY2t3YXJkcywgaWYgc28KKyAgICAgICAqIGhhbmRsZSBieSByZXVzaW5nIHRoZSBwcmV2aW91cyB0aW1lc3RhbXAgKi8KKyAgICAgIGlmIChwcml2LT5sYXN0X291dF90aW1lICE9IEdTVF9DTE9DS19USU1FX05PTkUgJiYKKyAgICAgICAgICBHU1RfQlVGRkVSX1BUUyAob3V0YnVmKSA8IHByaXYtPmxhc3Rfb3V0X3RpbWUpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiYnVmZmVyIFBUUyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAgICIgb2xkZXIgdGhhbiBwcmVjZWRpbmcgUFRTICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgICAgICAgIiBhZGp1c3RpbmcgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9QVFMgKG91dGJ1ZikpLAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocHJpdi0+bGFzdF9vdXRfdGltZSksCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChwcml2LT5sYXN0X291dF90aW1lKSk7CisgICAgICAgIEdTVF9CVUZGRVJfUFRTIChvdXRidWYpID0gcHJpdi0+bGFzdF9vdXRfdGltZTsKKyAgICAgIH0KKworICAgICAgcHJpdi0+bGFzdF9wdHMgPSBwdHM7CisgICAgICBwcml2LT5sYXN0X291dF90aW1lID0gR1NUX0JVRkZFUl9QVFMgKG91dGJ1Zik7CisgICAgICBicmVhazsKKyAgICBjYXNlIElURU1fVFlQRV9MT1NUOgorICAgICAgcHJpdi0+ZGlzY29udCA9IFRSVUU7CisgICAgICBpZiAoIXByaXYtPmRvX2xvc3QpCisgICAgICAgIGRvX3B1c2ggPSBGQUxTRTsKKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgY2FzZSBJVEVNX1RZUEVfRVZFTlQ6CisgICAgICBvdXRldmVudCA9IGl0ZW0tPmRhdGE7CisgICAgICBicmVhazsKKyAgICBjYXNlIElURU1fVFlQRV9RVUVSWToKKyAgICAgIG91dHF1ZXJ5ID0gaXRlbS0+ZGF0YTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogbm93IHdlIGFyZSByZWFkeSB0byBwdXNoIHRoZSBidWZmZXIuIFNhdmUgdGhlIHNlcW51bSBhbmQgcmVsZWFzZSB0aGUgbG9jaworICAgKiBzbyB0aGUgb3RoZXIgZW5kIGNhbiBwdXNoIHN0dWZmIGluIHRoZSBxdWV1ZSBhZ2Fpbi4gKi8KKyAgaWYgKHNlcW51bSAhPSAtMSkgeworICAgIHByaXYtPmxhc3RfcG9wcGVkX3NlcW51bSA9IHNlcW51bTsKKyAgICBwcml2LT5uZXh0X3NlcW51bSA9IChzZXFudW0gKyBpdGVtLT5jb3VudCkgJiAweGZmZmY7CisgIH0KKyAgbXNnID0gY2hlY2tfYnVmZmVyaW5nX3BlcmNlbnQgKGppdHRlcmJ1ZmZlciwgcGVyY2VudCk7CisgIEpCVUZfVU5MT0NLIChwcml2KTsKKworICBpdGVtLT5kYXRhID0gTlVMTDsKKyAgZnJlZV9pdGVtIChpdGVtKTsKKworICBpZiAobXNnKQorICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAoaml0dGVyYnVmZmVyKSwgbXNnKTsKKworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIElURU1fVFlQRV9CVUZGRVI6CisgICAgICAvKiBwdXNoIGJ1ZmZlciAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLAorICAgICAgICAgICJQdXNoaW5nIGJ1ZmZlciAlZCwgZHRzICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBwdHMgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgIHNlcW51bSwgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVFMgKG91dGJ1ZikpLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfUFRTIChvdXRidWYpKSk7CisgICAgICBwcml2LT5udW1fcHVzaGVkKys7CisgICAgICByZXN1bHQgPSBnc3RfcGFkX3B1c2ggKHByaXYtPnNyY3BhZCwgb3V0YnVmKTsKKworICAgICAgSkJVRl9MT0NLX0NIRUNLIChwcml2LCBvdXRfZmx1c2hpbmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJVEVNX1RZUEVfTE9TVDoKKyAgICBjYXNlIElURU1fVFlQRV9FVkVOVDoKKyAgICAgIC8qIFdlIGdvdCBub3QgZW5vdWdoIGNvbnNlY3V0aXZlIHBhY2tldHMgd2l0aCBhIGh1Z2UgZ2FwLCB3ZSBjYW4KKyAgICAgICAqIGFzIHdlbGwganVzdCBkcm9wIHRoZW0gaGVyZSBub3cgb24gRU9TICovCisgICAgICBpZiAob3V0ZXZlbnQgJiYgR1NUX0VWRU5UX1RZUEUgKG91dGV2ZW50KSA9PSBHU1RfRVZFTlRfRU9TKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIkNsZWFyaW5nIGdhcCBwYWNrZXRzIG9uIEVPUyIpOworICAgICAgICBnX3F1ZXVlX2ZvcmVhY2ggKCZwcml2LT5nYXBfcGFja2V0cywgKEdGdW5jKSBnc3RfYnVmZmVyX3VucmVmLCBOVUxMKTsKKyAgICAgICAgZ19xdWV1ZV9jbGVhciAoJnByaXYtPmdhcF9wYWNrZXRzKTsKKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiJXNQdXNoaW5nIGV2ZW50ICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAgICAgIiwgc2VxbnVtICVkIiwgZG9fcHVzaCA/ICIiIDogIk5PVCAiLCBvdXRldmVudCwgc2VxbnVtKTsKKworICAgICAgaWYgKGRvX3B1c2gpCisgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocHJpdi0+c3JjcGFkLCBvdXRldmVudCk7CisgICAgICBlbHNlIGlmIChvdXRldmVudCkKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChvdXRldmVudCk7CisKKyAgICAgIHJlc3VsdCA9IEdTVF9GTE9XX09LOworCisgICAgICBKQlVGX0xPQ0tfQ0hFQ0sgKHByaXYsIG91dF9mbHVzaGluZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElURU1fVFlQRV9RVUVSWToKKyAgICB7CisgICAgICBnYm9vbGVhbiByZXM7CisKKyAgICAgIHJlcyA9IGdzdF9wYWRfcGVlcl9xdWVyeSAocHJpdi0+c3JjcGFkLCBvdXRxdWVyeSk7CisKKyAgICAgIEpCVUZfTE9DS19DSEVDSyAocHJpdiwgb3V0X2ZsdXNoaW5nKTsKKyAgICAgIHJlc3VsdCA9IEdTVF9GTE9XX09LOworICAgICAgR1NUX0xPR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImRpZCBxdWVyeSAlcCwgcmV0dXJuICVkIiwgb3V0cXVlcnksIHJlcyk7CisgICAgICBKQlVGX1NJR05BTF9RVUVSWSAocHJpdiwgcmVzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworCisgIC8qIEVSUk9SUyAqLworb3V0X2ZsdXNoaW5nOgorICB7CisgICAgcmV0dXJuIHByaXYtPnNyY3Jlc3VsdDsKKyAgfQorfQorCisjZGVmaW5lIEdTVF9GTE9XX1dBSVQgR1NUX0ZMT1dfQ1VTVE9NX1NVQ0NFU1MKKworLyogUGVlayBhIGJ1ZmZlciBhbmQgY29tcGFyZSB0aGUgc2VxbnVtIHRvIHRoZSBleHBlY3RlZCBzZXFudW0uCisgKiBJZiBhbGwgaXMgZmluZSwgdGhlIGJ1ZmZlciBpcyBwdXNoZWQuCisgKiBJZiBzb21ldGhpbmcgaXMgd3JvbmcsIHdlIHdhaXQgZm9yIHNvbWUgZXZlbnQKKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2hhbmRsZV9uZXh0X2J1ZmZlciAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyKQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworICBHc3RGbG93UmV0dXJuIHJlc3VsdDsKKyAgUlRQSml0dGVyQnVmZmVySXRlbSAqaXRlbTsKKyAgZ3VpbnQgc2VxbnVtOworICBndWludDMyIG5leHRfc2VxbnVtOworCisgIC8qIG9ubHkgcHVzaCBidWZmZXJzIHdoZW4gUExBWUlORyBhbmQgYWN0aXZlIGFuZCBub3QgYnVmZmVyaW5nICovCisgIGlmIChwcml2LT5ibG9ja2VkIHx8ICFwcml2LT5hY3RpdmUgfHwKKyAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2lzX2J1ZmZlcmluZyAocHJpdi0+amJ1ZikpIHsKKyAgICByZXR1cm4gR1NUX0ZMT1dfV0FJVDsKKyAgfQorCisgIC8qIHBlZWsgYSBidWZmZXIsIHdlJ3JlIGp1c3QgbG9va2luZyBhdCB0aGUgc2VxdWVuY2UgbnVtYmVyLgorICAgKiBJZiBhbGwgaXMgZmluZSwgd2UnbGwgcG9wIGFuZCBwdXNoIGl0LiBJZiB0aGUgc2VxdWVuY2UgbnVtYmVyIGlzIHdyb25nIHdlCisgICAqIHdhaXQgZm9yIGEgdGltZW91dCBvciBzb21ldGhpbmcgdG8gY2hhbmdlLgorICAgKiBUaGUgcGVla2VkIGJ1ZmZlciBpcyB2YWxpZCBmb3IgYXMgbG9uZyBhcyB3ZSBob2xkIHRoZSBqaXR0ZXJidWZmZXIgbG9jay4gKi8KKyAgaXRlbSA9IHJ0cF9qaXR0ZXJfYnVmZmVyX3BlZWsgKHByaXYtPmpidWYpOworICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgZ290byB3YWl0OworICB9CisKKyAgLyogZ2V0IHRoZSBzZXFudW0gYW5kIHRoZSBuZXh0IGV4cGVjdGVkIHNlcW51bSAqLworICBzZXFudW0gPSBpdGVtLT5zZXFudW07CisgIGlmIChzZXFudW0gPT0gLTEpIHsKKyAgICByZXR1cm4gcG9wX2FuZF9wdXNoX25leHQgKGppdHRlcmJ1ZmZlciwgc2VxbnVtKTsKKyAgfQorCisgIG5leHRfc2VxbnVtID0gcHJpdi0+bmV4dF9zZXFudW07CisKKyAgLyogZ2V0IHRoZSBnYXAgYmV0d2VlbiB0aGlzIGFuZCB0aGUgcHJldmlvdXMgcGFja2V0LiBJZiB3ZSBkb24ndCBrbm93IHRoZQorICAgKiBwcmV2aW91cyBwYWNrZXQgc2VxbnVtIGFzc3VtZSBubyBnYXAuICovCisgIGlmIChHX1VOTElLRUxZIChuZXh0X3NlcW51bSA9PSAtMSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJGaXJzdCBidWZmZXIgIyVkIiwgc2VxbnVtKTsKKyAgICAvKiB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIG5leHRfc2VxbnVtIHNob3VsZCBiZSwgdGhlIGNoYWluIGZ1bmN0aW9uIHNob3VsZAorICAgICAqIGhhdmUgc2NoZWR1bGVkIGEgREVBRExJTkUgdGltZXIgdGhhdCB3aWxsIGluY3JlbWVudCBuZXh0X3NlcW51bSB3aGVuIGl0CisgICAgICogZmlyZXMsIHNvIHdhaXQgZm9yIHRoYXQgKi8KKyAgICByZXN1bHQgPSBHU1RfRkxPV19XQUlUOworICB9IGVsc2UgeworICAgIGdpbnQgZ2FwID0gZ3N0X3J0cF9idWZmZXJfY29tcGFyZV9zZXFudW0gKG5leHRfc2VxbnVtLCBzZXFudW0pOworCisgICAgaWYgKEdfTElLRUxZIChnYXAgPT0gMCkpIHsKKyAgICAgIC8qIG5vIG1pc3NpbmcgcGFja2V0LCBwb3AgYW5kIHB1c2ggKi8KKyAgICAgIHJlc3VsdCA9IHBvcF9hbmRfcHVzaF9uZXh0IChqaXR0ZXJidWZmZXIsIHNlcW51bSk7CisgICAgfSBlbHNlIGlmIChHX1VOTElLRUxZIChnYXAgPCAwKSkgeworICAgICAgLyogaWYgd2UgaGF2ZSBhIHBhY2tldCB0aGF0IHdlIGFscmVhZHkgcHVzaGVkIG9yIGNvbnNpZGVyZWQgZHJvcHBlZCwgcG9wIGl0CisgICAgICAgKiBvZmYgYW5kIGdldCB0aGUgbmV4dCBwYWNrZXQgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIk9sZCBwYWNrZXQgIyVkLCBuZXh0ICMlZCBkcm9wcGluZyIsCisgICAgICAgICAgc2VxbnVtLCBuZXh0X3NlcW51bSk7CisgICAgICBpdGVtID0gcnRwX2ppdHRlcl9idWZmZXJfcG9wIChwcml2LT5qYnVmLCBOVUxMKTsKKyAgICAgIGZyZWVfaXRlbSAoaXRlbSk7CisgICAgICByZXN1bHQgPSBHU1RfRkxPV19PSzsKKyAgICB9IGVsc2UgeworICAgICAgLyogdGhlIGNoYWluIGZ1bmN0aW9uIGhhcyBzY2hlZHVsZWQgdGltZXJzIHRvIHJlcXVlc3QgcmV0cmFuc21pc3Npb24gb3IKKyAgICAgICAqIHdoZW4gdG8gY29uc2lkZXIgdGhlIHBhY2tldCBsb3N0LCB3YWl0IGZvciB0aGF0ICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAgICAgIlNlcXVlbmNlIG51bWJlciBHQVAgZGV0ZWN0ZWQ6IGV4cGVjdGVkICVkIGluc3RlYWQgb2YgJWQgKCVkIG1pc3NpbmcpIiwKKyAgICAgICAgICBuZXh0X3NlcW51bSwgc2VxbnVtLCBnYXApOworICAgICAgcmVzdWx0ID0gR1NUX0ZMT1dfV0FJVDsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworCit3YWl0OgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAibm8gYnVmZmVyLCBnb2luZyB0byB3YWl0Iik7CisgICAgaWYgKHByaXYtPmVvcykgeworICAgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEdTVF9GTE9XX1dBSVQ7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2dldF9ydHhfcmV0cnlfdGltZW91dCAoR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqIHByaXYpCit7CisgIEdzdENsb2NrVGltZSBydHhfcmV0cnlfdGltZW91dDsKKyAgR3N0Q2xvY2tUaW1lIHJ0eF9taW5fcmV0cnlfdGltZW91dDsKKworICBpZiAocHJpdi0+cnR4X3JldHJ5X3RpbWVvdXQgPT0gLTEpIHsKKyAgICBpZiAocHJpdi0+YXZnX3J0eF9ydHQgPT0gMCkKKyAgICAgIHJ0eF9yZXRyeV90aW1lb3V0ID0gREVGQVVMVF9BVVRPX1JUWF9USU1FT1VUOworICAgIGVsc2UKKyAgICAgIC8qIHdlIHdhbnQgdG8gYXNrIGZvciBhIHJldHJhbnNtaXNzaW9uIGFmdGVyIHdlIHdhaXRlZCBmb3IgYQorICAgICAgICogY29tcGxldGUgUlRUIGFuZCB0aGUgYWRkaXRpb25hbCBqaXR0ZXIgKi8KKyAgICAgIHJ0eF9yZXRyeV90aW1lb3V0ID0gcHJpdi0+YXZnX3J0eF9ydHQgKyBwcml2LT5hdmdfaml0dGVyICogMjsKKyAgfSBlbHNlIHsKKyAgICBydHhfcmV0cnlfdGltZW91dCA9IHByaXYtPnJ0eF9yZXRyeV90aW1lb3V0ICogR1NUX01TRUNPTkQ7CisgIH0KKyAgLyogbWFrZSBzdXJlIHdlIGRvbid0IHJldHJ5IHRvbyBvZnRlbi4gT24gdmVyeSBsb3cgbGF0ZW5jeSBuZXR3b3JrcywKKyAgICogdGhlIFJUVCBhbmQgaml0dGVyIGNhbiBiZSB2ZXJ5IGxvdy4gKi8KKyAgaWYgKHByaXYtPnJ0eF9taW5fcmV0cnlfdGltZW91dCA9PSAtMSkgeworICAgIHJ0eF9taW5fcmV0cnlfdGltZW91dCA9IHByaXYtPnBhY2tldF9zcGFjaW5nOworICB9IGVsc2UgeworICAgIHJ0eF9taW5fcmV0cnlfdGltZW91dCA9IHByaXYtPnJ0eF9taW5fcmV0cnlfdGltZW91dCAqIEdTVF9NU0VDT05EOworICB9CisgIHJ0eF9yZXRyeV90aW1lb3V0ID0gTUFYIChydHhfcmV0cnlfdGltZW91dCwgcnR4X21pbl9yZXRyeV90aW1lb3V0KTsKKworICByZXR1cm4gcnR4X3JldHJ5X3RpbWVvdXQ7Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2dldF9ydHhfcmV0cnlfcGVyaW9kIChHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICogcHJpdiwKKyAgICBHc3RDbG9ja1RpbWUgcnR4X3JldHJ5X3RpbWVvdXQpCit7CisgIEdzdENsb2NrVGltZSBydHhfcmV0cnlfcGVyaW9kOworCisgIGlmIChwcml2LT5ydHhfcmV0cnlfcGVyaW9kID09IC0xKSB7CisgICAgLyogd2UgcmV0cnkgdXAgdG8gdGhlIGNvbmZpZ3VyZWQgaml0dGVyYnVmZmVyIHNpemUgYnV0IGxlYXZpbmcgc29tZQorICAgICAqIHJvb20gZm9yIHRoZSByZXRyYW5zbWlzc2lvbiB0byBhcnJpdmUgaW4gdGltZSAqLworICAgIGlmIChydHhfcmV0cnlfdGltZW91dCA+IHByaXYtPmxhdGVuY3lfbnMpIHsKKyAgICAgIHJ0eF9yZXRyeV9wZXJpb2QgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBydHhfcmV0cnlfcGVyaW9kID0gcHJpdi0+bGF0ZW5jeV9ucyAtIHJ0eF9yZXRyeV90aW1lb3V0OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBydHhfcmV0cnlfcGVyaW9kID0gcHJpdi0+cnR4X3JldHJ5X3BlcmlvZCAqIEdTVF9NU0VDT05EOworICB9CisgIHJldHVybiBydHhfcmV0cnlfcGVyaW9kOworfQorCisvKgorICAxLiBGb3IgKmxhcmdlciogcnR4LXJ0dCwgd2VpZ2ggYSBuZXcgbWVhc3VyZW1lbnQgYXMgYmVmb3JlICgxLzh0aCkKKyAgMi4gRm9yICpzbWFsbGVyKiBydHgtcnR0LCBiZSBhIGJpdCBtb3JlIGNvbnNlcnZhdGl2ZSBhbmQgd2VpZ2ggYSBiaXQgbGVzcyAoMS8xNnRoKQorICAzLiBGb3IgdmVyeSBsYXJnZSBtZWFzdXJlbWVudHMgKD4gYXZnICogMiksIGNvbnNpZGVyIHRoZW0gIm91dGxpZXJzIgorICAgICBhbmQgY291bnQgdGhlbSBhIGxvdCBsZXNzICgxLzQ4dGgpCisqLworc3RhdGljIHZvaWQKK3VwZGF0ZV9hdmdfcnR4X3J0dCAoR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqIHByaXYsIEdzdENsb2NrVGltZSBydHQpCit7CisgIGdpbnQgd2VpZ2h0OworCisgIGlmIChwcml2LT5hdmdfcnR4X3J0dCA9PSAwKSB7CisgICAgcHJpdi0+YXZnX3J0eF9ydHQgPSBydHQ7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHJ0dCA+IDIgKiBwcml2LT5hdmdfcnR4X3J0dCkKKyAgICB3ZWlnaHQgPSA0ODsKKyAgZWxzZSBpZiAocnR0ID4gcHJpdi0+YXZnX3J0eF9ydHQpCisgICAgd2VpZ2h0ID0gODsKKyAgZWxzZQorICAgIHdlaWdodCA9IDE2OworCisgIHByaXYtPmF2Z19ydHhfcnR0ID0gKHJ0dCArICh3ZWlnaHQgLSAxKSAqIHByaXYtPmF2Z19ydHhfcnR0KSAvIHdlaWdodDsKK30KKworc3RhdGljIHZvaWQKK3VwZGF0ZV9ydHhfc3RhdHMgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgVGltZXJEYXRhICogdGltZXIsCisgICAgR3N0Q2xvY2tUaW1lIGR0cywgZ2Jvb2xlYW4gc3VjY2VzcykKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKyAgR3N0Q2xvY2tUaW1lIGRlbGF5OworCisgIGlmIChzdWNjZXNzKSB7CisgICAgLyogd2Ugc2NoZWR1bGVkIGEgcmV0cnkgZm9yIHRoaXMgcGFja2V0IGFuZCBub3cgd2UgaGF2ZSBpdCAqLworICAgIHByaXYtPm51bV9ydHhfc3VjY2VzcysrOworICAgIC8qIGFsbCB0aGUgcHJldmlvdXMgcmV0cnkgYXR0ZW1wdHMgZmFpbGVkICovCisgICAgcHJpdi0+bnVtX3J0eF9mYWlsZWQgKz0gdGltZXItPm51bV9ydHhfcmV0cnkgLSAxOworICB9IGVsc2UgeworICAgIC8qIEFsbCByZXRyaWVzIGZhaWxlZCBvciB3YXMgdG9vIGxhdGUgKi8KKyAgICBwcml2LT5udW1fcnR4X2ZhaWxlZCArPSB0aW1lci0+bnVtX3J0eF9yZXRyeTsKKyAgfQorCisgIC8qIG51bWJlciBvZiByZXRyaWVzIGJlZm9yZSAoaG9wZWZ1bGx5KSByZWNlaXZpbmcgdGhlIHBhY2tldCAqLworICBpZiAocHJpdi0+YXZnX3J0eF9udW0gPT0gMC4wKQorICAgIHByaXYtPmF2Z19ydHhfbnVtID0gdGltZXItPm51bV9ydHhfcmV0cnk7CisgIGVsc2UKKyAgICBwcml2LT5hdmdfcnR4X251bSA9ICh0aW1lci0+bnVtX3J0eF9yZXRyeSArIDcgKiBwcml2LT5hdmdfcnR4X251bSkgLyA4OworCisgIC8qIENhbGN1bGF0ZSB0aGUgZGVsYXkgYmV0d2VlbiByZXRyYW5zbWlzc2lvbiByZXF1ZXN0IGFuZCByZWNlaXZpbmcgdGhpcworICAgKiBwYWNrZXQuIFdlIGhhdmUgYSB2YWxpZCBkZWxheSBpZiBhbmQgb25seSBpZiB0aGlzIHBhY2tldCBpcyBhIHJlc3BvbnNlIHRvCisgICAqIG91ciBsYXN0IHJlcXVlc3QuIElmIG5vdCB3ZSBkb24ndCBrbm93IGlmIHRoaXMgaXMgYSByZXNwb25zZSB0byBhbgorICAgKiBlYXJsaWVyIHJlcXVlc3QgYW5kIGRlbGF5IGNvdWxkIGJlIHdheSBvZmYuIEZvciBSVFQgaXMgbW9yZSBpbXBvcnRhbnQKKyAgICogd2l0aCBjb3JyZWN0IHZhbHVlcyB0aGFuIHRvIHVwZGF0ZSBmb3IgZXZlcnkgcGFja2V0LiAqLworICBpZiAodGltZXItPm51bV9ydHhfcmV0cnkgPT0gdGltZXItPm51bV9ydHhfcmVjZWl2ZWQgJiYKKyAgICAgIGR0cyAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmIGR0cyA+IHRpbWVyLT5ydHhfbGFzdCkgeworICAgIGRlbGF5ID0gZHRzIC0gdGltZXItPnJ0eF9sYXN0OworICAgIHVwZGF0ZV9hdmdfcnR4X3J0dCAocHJpdiwgZGVsYXkpOworICB9IGVsc2UgeworICAgIGRlbGF5ID0gMDsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAiUlRYICMlZCwgcmVzdWx0ICVkLCBzdWNjZXNzICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgZmFpbGVkICUiCisgICAgICBHX0dVSU5UNjRfRk9STUFUICIsIHJlcXVlc3RzICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgZHVwcyAlIgorICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiLCBhdmctbnVtICVnLCBkZWxheSAlIiBHU1RfVElNRV9GT1JNQVQgIiwgYXZnLXJ0dCAlIgorICAgICAgR1NUX1RJTUVfRk9STUFULCB0aW1lci0+c2VxbnVtLCBzdWNjZXNzLCBwcml2LT5udW1fcnR4X3N1Y2Nlc3MsCisgICAgICBwcml2LT5udW1fcnR4X2ZhaWxlZCwgcHJpdi0+bnVtX3J0eF9yZXF1ZXN0cywgcHJpdi0+bnVtX2R1cGxpY2F0ZXMsCisgICAgICBwcml2LT5hdmdfcnR4X251bSwgR1NUX1RJTUVfQVJHUyAoZGVsYXkpLAorICAgICAgR1NUX1RJTUVfQVJHUyAocHJpdi0+YXZnX3J0eF9ydHQpKTsKK30KKworLyogdGhlIHRpbWVvdXQgZm9yIHdoZW4gd2UgZXhwZWN0ZWQgYSBwYWNrZXQgZXhwaXJlZCAqLworc3RhdGljIGdib29sZWFuCitkb19leHBlY3RlZF90aW1lb3V0IChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIsIFRpbWVyRGF0YSAqIHRpbWVyLAorICAgIEdzdENsb2NrVGltZSBub3cpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgZ3VpbnQgZGVsYXksIGRlbGF5X21zLCBhdmdfcnR4X3J0dF9tczsKKyAgZ3VpbnQgcnR4X3JldHJ5X3RpbWVvdXRfbXMsIHJ0eF9yZXRyeV9wZXJpb2RfbXM7CisgIGd1aW50IHJ0eF9kZWFkbGluZV9tczsKKyAgR3N0Q2xvY2tUaW1lIHJ0eF9yZXRyeV9wZXJpb2Q7CisgIEdzdENsb2NrVGltZSBydHhfcmV0cnlfdGltZW91dDsKKyAgR3N0Q2xvY2sgKmNsb2NrOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImV4cGVjdGVkICVkIGRpZG4ndCBhcnJpdmUsIG5vdyAlIgorICAgICAgR1NUX1RJTUVfRk9STUFULCB0aW1lci0+c2VxbnVtLCBHU1RfVElNRV9BUkdTIChub3cpKTsKKworICBydHhfcmV0cnlfdGltZW91dCA9IGdldF9ydHhfcmV0cnlfdGltZW91dCAocHJpdik7CisgIHJ0eF9yZXRyeV9wZXJpb2QgPSBnZXRfcnR4X3JldHJ5X3BlcmlvZCAocHJpdiwgcnR4X3JldHJ5X3RpbWVvdXQpOworCisgIGRlbGF5ID0gdGltZXItPnJ0eF9kZWxheSArIHRpbWVyLT5ydHhfcmV0cnk7CisKKyAgZGVsYXlfbXMgPSBHU1RfVElNRV9BU19NU0VDT05EUyAoZGVsYXkpOworICBydHhfcmV0cnlfdGltZW91dF9tcyA9IEdTVF9USU1FX0FTX01TRUNPTkRTIChydHhfcmV0cnlfdGltZW91dCk7CisgIHJ0eF9yZXRyeV9wZXJpb2RfbXMgPSBHU1RfVElNRV9BU19NU0VDT05EUyAocnR4X3JldHJ5X3BlcmlvZCk7CisgIGF2Z19ydHhfcnR0X21zID0gR1NUX1RJTUVfQVNfTVNFQ09ORFMgKHByaXYtPmF2Z19ydHhfcnR0KTsKKyAgcnR4X2RlYWRsaW5lX21zID0KKyAgICAgIHByaXYtPnJ0eF9kZWFkbGluZV9tcyAhPSAtMSA/IHByaXYtPnJ0eF9kZWFkbGluZV9tcyA6IHByaXYtPmxhdGVuY3lfbXM7CisKKyAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiR3N0UlRQUmV0cmFuc21pc3Npb25SZXF1ZXN0IiwKKyAgICAgICAgICAic2VxbnVtIiwgR19UWVBFX1VJTlQsIChndWludCkgdGltZXItPnNlcW51bSwKKyAgICAgICAgICAicnVubmluZy10aW1lIiwgR19UWVBFX1VJTlQ2NCwgdGltZXItPnJ0eF9iYXNlLAorICAgICAgICAgICJkZWxheSIsIEdfVFlQRV9VSU5ULCBkZWxheV9tcywKKyAgICAgICAgICAicmV0cnkiLCBHX1RZUEVfVUlOVCwgdGltZXItPm51bV9ydHhfcmV0cnksCisgICAgICAgICAgImZyZXF1ZW5jeSIsIEdfVFlQRV9VSU5ULCBydHhfcmV0cnlfdGltZW91dF9tcywKKyAgICAgICAgICAicGVyaW9kIiwgR19UWVBFX1VJTlQsIHJ0eF9yZXRyeV9wZXJpb2RfbXMsCisgICAgICAgICAgImRlYWRsaW5lIiwgR19UWVBFX1VJTlQsIHJ0eF9kZWFkbGluZV9tcywKKyAgICAgICAgICAicGFja2V0LXNwYWNpbmciLCBHX1RZUEVfVUlOVDY0LCBwcml2LT5wYWNrZXRfc3BhY2luZywKKyAgICAgICAgICAiYXZnLXJ0dCIsIEdfVFlQRV9VSU5ULCBhdmdfcnR4X3J0dF9tcywgTlVMTCkpOworICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJSZXF1ZXN0IFJUWDogJSIgR1NUX1BUUl9GT1JNQVQsIGV2ZW50KTsKKworICBwcml2LT5udW1fcnR4X3JlcXVlc3RzKys7CisgIHRpbWVyLT5udW1fcnR4X3JldHJ5Kys7CisKKyAgR1NUX09CSkVDVF9MT0NLIChqaXR0ZXJidWZmZXIpOworICBpZiAoKGNsb2NrID0gR1NUX0VMRU1FTlRfQ0xPQ0sgKGppdHRlcmJ1ZmZlcikpKSB7CisgICAgdGltZXItPnJ0eF9sYXN0ID0gZ3N0X2Nsb2NrX2dldF90aW1lIChjbG9jayk7CisgICAgdGltZXItPnJ0eF9sYXN0IC09IEdTVF9FTEVNRU5UX0NBU1QgKGppdHRlcmJ1ZmZlciktPmJhc2VfdGltZTsKKyAgfSBlbHNlIHsKKyAgICB0aW1lci0+cnR4X2xhc3QgPSBub3c7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGppdHRlcmJ1ZmZlcik7CisKKyAgLyogY2FsY3VsYXRlIHRoZSB0aW1lb3V0IGZvciB0aGUgbmV4dCByZXRyYW5zbWlzc2lvbiBhdHRlbXB0ICovCisgIHRpbWVyLT5ydHhfcmV0cnkgKz0gcnR4X3JldHJ5X3RpbWVvdXQ7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImJhc2UgJSIgR1NUX1RJTUVfRk9STUFUICIsIGRlbGF5ICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQgIiwgcmV0cnkgJSIgR1NUX1RJTUVfRk9STUFUICIsIG51bV9yZXRyeSAldSIsCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lci0+cnR4X2Jhc2UpLCBHU1RfVElNRV9BUkdTICh0aW1lci0+cnR4X2RlbGF5KSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVyLT5ydHhfcmV0cnkpLCB0aW1lci0+bnVtX3J0eF9yZXRyeSk7CisgIGlmICgocHJpdi0+cnR4X21heF9yZXRyaWVzICE9IC0xCisgICAgICAgICAgJiYgdGltZXItPm51bV9ydHhfcmV0cnkgPj0gcHJpdi0+cnR4X21heF9yZXRyaWVzKQorICAgICAgfHwgKHRpbWVyLT5ydHhfcmV0cnkgKyB0aW1lci0+cnR4X2RlbGF5ID4gcnR4X3JldHJ5X3BlcmlvZCkKKyAgICAgIHx8ICh0aW1lci0+cnR4X2Jhc2UgKyBydHhfcmV0cnlfcGVyaW9kIDwgbm93KSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInJlc2NoZWR1bGUgYXMgTE9TVCB0aW1lciIpOworICAgIC8qIHRvbyBtYW55IHJldHJhbnNtaXNzaW9uIHJlcXVlc3QsIHdlIG5vdyBjb252ZXJ0IHRoZSB0aW1lcgorICAgICAqIHRvIGEgbG9zdCB0aW1lciwgbGVhdmUgdGhlIG51bV9ydHhfcmV0cnkgYXMgaXQgaXMgZm9yIHN0YXRzICovCisgICAgdGltZXItPnR5cGUgPSBUSU1FUl9UWVBFX0xPU1Q7CisgICAgdGltZXItPnJ0eF9kZWxheSA9IDA7CisgICAgdGltZXItPnJ0eF9yZXRyeSA9IDA7CisgIH0KKyAgcmVzY2hlZHVsZV90aW1lciAoaml0dGVyYnVmZmVyLCB0aW1lciwgdGltZXItPnNlcW51bSwKKyAgICAgIHRpbWVyLT5ydHhfYmFzZSArIHRpbWVyLT5ydHhfcmV0cnksIHRpbWVyLT5ydHhfZGVsYXksIEZBTFNFKTsKKworICBKQlVGX1VOTE9DSyAocHJpdik7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAocHJpdi0+c2lua3BhZCwgZXZlbnQpOworICBKQlVGX0xPQ0sgKHByaXYpOworCisgIHJldHVybiBGQUxTRTsKK30KKworLyogYSBwYWNrZXQgaXMgbG9zdCAqLworc3RhdGljIGdib29sZWFuCitkb19sb3N0X3RpbWVvdXQgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgVGltZXJEYXRhICogdGltZXIsCisgICAgR3N0Q2xvY2tUaW1lIG5vdykKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKyAgZ3VpbnQgc2VxbnVtLCBsb3N0X3BhY2tldHMsIG51bV9ydHhfcmV0cnksIG5leHRfaW5fc2VxbnVtOworICBnYm9vbGVhbiBoZWFkOworICBHc3RFdmVudCAqZXZlbnQgPSBOVUxMOworICBSVFBKaXR0ZXJCdWZmZXJJdGVtICppdGVtOworCisgIHNlcW51bSA9IHRpbWVyLT5zZXFudW07CisgIGxvc3RfcGFja2V0cyA9IE1BWCAodGltZXItPm51bSwgMSk7CisgIG51bV9ydHhfcmV0cnkgPSB0aW1lci0+bnVtX3J0eF9yZXRyeTsKKworICAvKiB3ZSBoYWQgYSBnYXAgYW5kIHRodXMgd2UgbG9zdCBzb21lIHBhY2tldHMuIENyZWF0ZSBhbiBldmVudCBmb3IgdGhpcy4gICovCisgIGlmIChsb3N0X3BhY2tldHMgPiAxKQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIlBhY2tldHMgIyVkIC0+ICMlZCBsb3N0Iiwgc2VxbnVtLAorICAgICAgICBzZXFudW0gKyBsb3N0X3BhY2tldHMgLSAxKTsKKyAgZWxzZQorICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIlBhY2tldCAjJWQgbG9zdCIsIHNlcW51bSk7CisKKyAgcHJpdi0+bnVtX2xvc3QgKz0gbG9zdF9wYWNrZXRzOworICBwcml2LT5udW1fcnR4X2ZhaWxlZCArPSBudW1fcnR4X3JldHJ5OworCisgIG5leHRfaW5fc2VxbnVtID0gKHNlcW51bSArIGxvc3RfcGFja2V0cykgJiAweGZmZmY7CisKKyAgLyogd2Ugbm93IG9ubHkgYWNjZXB0IHNlcW51bSBiaWdnZXIgdGhhbiB0aGlzICovCisgIGlmIChnc3RfcnRwX2J1ZmZlcl9jb21wYXJlX3NlcW51bSAocHJpdi0+bmV4dF9pbl9zZXFudW0sIG5leHRfaW5fc2VxbnVtKSA+IDApIHsKKyAgICBwcml2LT5uZXh0X2luX3NlcW51bSA9IG5leHRfaW5fc2VxbnVtOworICAgIHByaXYtPmxhc3RfaW5fcHRzID0gYXBwbHlfb2Zmc2V0IChqaXR0ZXJidWZmZXIsIHRpbWVyLT50aW1lb3V0KTsKKyAgfQorCisgIC8qIEF2b2lkIGNyZWF0aW5nIGV2ZW50cyBpZiB3ZSBkb24ndCBuZWVkIGl0LiBOb3RlIHRoYXQgd2Ugc3RpbGwgbmVlZCB0byBjcmVhdGUKKyAgICogdGhlIGxvc3QgKklURU0qIHNpbmNlIGl0IHdpbGwgYmUgdXNlZCB0byBub3RpZnkgdGhlIG91dGdvaW5nIHRocmVhZCBvZgorICAgKiBsb3N0IGl0ZW1zIChzbyB0aGF0IHdlIGNhbiBzZXQgZGlzY29udCBmbGFncyBhbmQgc3VjaCkgKi8KKyAgaWYgKHByaXYtPmRvX2xvc3QpIHsKKyAgICBHc3RDbG9ja1RpbWUgZHVyYXRpb24sIHRpbWVzdGFtcDsKKyAgICAvKiBjcmVhdGUgcGFrZXQgbG9zdCBldmVudCAqLworICAgIHRpbWVzdGFtcCA9IGFwcGx5X29mZnNldCAoaml0dGVyYnVmZmVyLCB0aW1lci0+dGltZW91dCk7CisgICAgZHVyYXRpb24gPSB0aW1lci0+ZHVyYXRpb247CisgICAgaWYgKGR1cmF0aW9uID09IEdTVF9DTE9DS19USU1FX05PTkUgJiYgcHJpdi0+cGFja2V0X3NwYWNpbmcgPiAwKQorICAgICAgZHVyYXRpb24gPSBwcml2LT5wYWNrZXRfc3BhY2luZzsKKyAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX0RPV05TVFJFQU0sCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiR3N0UlRQUGFja2V0TG9zdCIsCisgICAgICAgICAgICAic2VxbnVtIiwgR19UWVBFX1VJTlQsIChndWludCkgc2VxbnVtLAorICAgICAgICAgICAgInRpbWVzdGFtcCIsIEdfVFlQRV9VSU5UNjQsIHRpbWVzdGFtcCwKKyAgICAgICAgICAgICJkdXJhdGlvbiIsIEdfVFlQRV9VSU5UNjQsIGR1cmF0aW9uLAorICAgICAgICAgICAgInJldHJ5IiwgR19UWVBFX1VJTlQsIG51bV9ydHhfcmV0cnksIE5VTEwpKTsKKyAgfQorICBpdGVtID0gYWxsb2NfaXRlbSAoZXZlbnQsIElURU1fVFlQRV9MT1NULCAtMSwgLTEsIHNlcW51bSwgbG9zdF9wYWNrZXRzLCAtMSk7CisgIGlmICghcnRwX2ppdHRlcl9idWZmZXJfaW5zZXJ0IChwcml2LT5qYnVmLCBpdGVtLCAmaGVhZCwgTlVMTCkpCisgICAgLyogRHVwbGljYXRlICovCisgICAgZnJlZV9pdGVtIChpdGVtKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHRpbWVyLT5ydHhfbGFzdCkpIHsKKyAgICAvKiBTdG9yZSBpbmZvIHRvIHVwZGF0ZSBzdGF0cyBpZiB0aGUgcGFja2V0IGFycml2ZXMgdG9vIGxhdGUgKi8KKyAgICB0aW1lcl9xdWV1ZV9hcHBlbmQgKHByaXYtPnJ0eF9zdGF0c190aW1lcnMsIHRpbWVyLAorICAgICAgICBub3cgKyBwcml2LT5ydHhfc3RhdHNfdGltZW91dCAqIEdTVF9NU0VDT05ELCBUUlVFKTsKKyAgfQorICByZW1vdmVfdGltZXIgKGppdHRlcmJ1ZmZlciwgdGltZXIpOworCisgIGlmIChoZWFkKQorICAgIEpCVUZfU0lHTkFMX0VWRU5UIChwcml2KTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitkb19lb3NfdGltZW91dCAoR3N0UnRwSml0dGVyQnVmZmVyICogaml0dGVyYnVmZmVyLCBUaW1lckRhdGEgKiB0aW1lciwKKyAgICBHc3RDbG9ja1RpbWUgbm93KQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIEdTVF9JTkZPX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiZ290IHRoZSBOUFQgdGltZW91dCIpOworICByZW1vdmVfdGltZXIgKGppdHRlcmJ1ZmZlciwgdGltZXIpOworICBpZiAoIXByaXYtPmVvcykgeworICAgIC8qIHRoZXJlIHdhcyBubyBFT1MgaW4gdGhlIGJ1ZmZlciwgcHV0IG9uZSBpbiB0aGVyZSBub3cgKi8KKyAgICBxdWV1ZV9ldmVudCAoaml0dGVyYnVmZmVyLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgIH0KKyAgSkJVRl9TSUdOQUxfRVZFTlQgKHByaXYpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2RvX2RlYWRsaW5lX3RpbWVvdXQgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlciwgVGltZXJEYXRhICogdGltZXIsCisgICAgR3N0Q2xvY2tUaW1lIG5vdykKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBHU1RfSU5GT19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImdvdCBkZWFkbGluZSB0aW1lb3V0Iik7CisKKyAgLyogdGltZXIgc2VxbnVtIG1pZ2h0IGhhdmUgYmVlbiBvYnNvbGV0ZWQgYnkgY2FwcyBzZXFudW0tYmFzZSwKKyAgICogb25seSBtZXNzIHdpdGggY3VycmVudCBvbmdvaW5nIHNlcW51bSBpZiBzdGlsbCB1bmtub3duICovCisgIGlmIChwcml2LT5uZXh0X3NlcW51bSA9PSAtMSkKKyAgICBwcml2LT5uZXh0X3NlcW51bSA9IHRpbWVyLT5zZXFudW07CisgIHJlbW92ZV90aW1lciAoaml0dGVyYnVmZmVyLCB0aW1lcik7CisgIEpCVUZfU0lHTkFMX0VWRU5UIChwcml2KTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitkb190aW1lb3V0IChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIsIFRpbWVyRGF0YSAqIHRpbWVyLAorICAgIEdzdENsb2NrVGltZSBub3cpCit7CisgIGdib29sZWFuIHJlbW92ZWQgPSBGQUxTRTsKKworICBzd2l0Y2ggKHRpbWVyLT50eXBlKSB7CisgICAgY2FzZSBUSU1FUl9UWVBFX0VYUEVDVEVEOgorICAgICAgcmVtb3ZlZCA9IGRvX2V4cGVjdGVkX3RpbWVvdXQgKGppdHRlcmJ1ZmZlciwgdGltZXIsIG5vdyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRJTUVSX1RZUEVfTE9TVDoKKyAgICAgIHJlbW92ZWQgPSBkb19sb3N0X3RpbWVvdXQgKGppdHRlcmJ1ZmZlciwgdGltZXIsIG5vdyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRJTUVSX1RZUEVfREVBRExJTkU6CisgICAgICByZW1vdmVkID0gZG9fZGVhZGxpbmVfdGltZW91dCAoaml0dGVyYnVmZmVyLCB0aW1lciwgbm93KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVElNRVJfVFlQRV9FT1M6CisgICAgICByZW1vdmVkID0gZG9fZW9zX3RpbWVvdXQgKGppdHRlcmJ1ZmZlciwgdGltZXIsIG5vdyk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVtb3ZlZDsKK30KKworLyogY2FsbGVkIHdoZW4gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgbmV4dCB0aW1lb3V0LgorICoKKyAqIFdlIGxvb3Agb3ZlciB0aGUgYXJyYXkgb2YgcmVjb3JkZWQgdGltZW91dHMgYW5kIHdhaXQgZm9yIHRoZSBlYXJsaWVzdCBvbmUuCisgKiBXaGVuIGl0IHRpbWVkIG91dCwgZG8gdGhlIGxvZ2ljIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGltZXIuCisgKgorICogSWYgdGhlcmUgYXJlIG5vIHRpbWVycywgd2Ugd2FpdCBvbiBhIGdjb25kIHVudGlsIHNvbWV0aGluZyBuZXcgaGFwcGVucy4KKyAqLworc3RhdGljIHZvaWQKK3dhaXRfbmV4dF90aW1lb3V0IChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisgIEdzdENsb2NrVGltZSBub3cgPSAwOworCisgIEpCVUZfTE9DSyAocHJpdik7CisgIHdoaWxlIChwcml2LT50aW1lcl9ydW5uaW5nKSB7CisgICAgVGltZXJEYXRhICp0aW1lciA9IE5VTEw7CisgICAgR3N0Q2xvY2tUaW1lIHRpbWVyX3RpbWVvdXQgPSAtMTsKKyAgICBnaW50IGksIGxlbjsKKworICAgIC8qIElmIHdlIGhhdmUgYSBjbG9jaywgdXBkYXRlICJub3ciIG5vdyB3aXRoIHRoZSB2ZXJ5CisgICAgICogbGF0ZXN0IHJ1bm5pbmcgdGltZSB3ZSBoYXZlLiBJZiB0aW1lcnMgYXJlIHVuc2NoZWR1bGVkIGJlbG93IHdlCisgICAgICogb3RoZXJ3aXNlIHdvdWxkbid0IHVwZGF0ZSBub3cgKGl0J3Mgb25seSB1cGRhdGVkIHdoZW4gdGltZXJzCisgICAgICogZXhwaXJlKSwgYW5kIGFsc28gZm9yIHRoZSB2ZXJ5IGZpcnN0IGxvb3AgaXRlcmF0aW9uIG5vdyB3b3VsZAorICAgICAqIG90aGVyd2lzZSBhbHdheXMgYmUgMAorICAgICAqLworICAgIEdTVF9PQkpFQ1RfTE9DSyAoaml0dGVyYnVmZmVyKTsKKyAgICBpZiAoR1NUX0VMRU1FTlRfQ0xPQ0sgKGppdHRlcmJ1ZmZlcikpIHsKKyAgICAgIG5vdyA9CisgICAgICAgICAgZ3N0X2Nsb2NrX2dldF90aW1lIChHU1RfRUxFTUVOVF9DTE9DSyAoaml0dGVyYnVmZmVyKSkgLQorICAgICAgICAgIEdTVF9FTEVNRU5UX0NBU1QgKGppdHRlcmJ1ZmZlciktPmJhc2VfdGltZTsKKyAgICB9CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGppdHRlcmJ1ZmZlcik7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJub3cgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICBHU1RfVElNRV9BUkdTIChub3cpKTsKKworICAgIC8qIENsZWFyIGV4cGlyZWQgcnR4LXN0YXRzIHRpbWVycyAqLworICAgIGlmIChwcml2LT5kb19yZXRyYW5zbWlzc2lvbikKKyAgICAgIHRpbWVyX3F1ZXVlX2NsZWFyX3VudGlsIChwcml2LT5ydHhfc3RhdHNfdGltZXJzLCBub3cpOworCisgICAgLyogSXRlcmF0ZSAibm9ybWFsIiB0aW1lcnMgKi8KKyAgICBsZW4gPSBwcml2LT50aW1lcnMtPmxlbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOykgeworICAgICAgVGltZXJEYXRhICp0ZXN0ID0gJmdfYXJyYXlfaW5kZXggKHByaXYtPnRpbWVycywgVGltZXJEYXRhLCBpKTsKKyAgICAgIEdzdENsb2NrVGltZSB0ZXN0X3RpbWVvdXQgPSBnZXRfdGltZW91dCAoaml0dGVyYnVmZmVyLCB0ZXN0KTsKKyAgICAgIGdib29sZWFuIHNhdmVfYmVzdCA9IEZBTFNFOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAgICAgIiVkLCAlZCwgJWQsICUiIEdTVF9USU1FX0ZPUk1BVCAiIGRpZmY6JSIgR1NUX1NUSU1FX0ZPUk1BVCwgaSwKKyAgICAgICAgICB0ZXN0LT50eXBlLCB0ZXN0LT5zZXFudW0sIEdTVF9USU1FX0FSR1MgKHRlc3RfdGltZW91dCksCisgICAgICAgICAgR1NUX1NUSU1FX0FSR1MgKChnaW50NjQpICh0ZXN0X3RpbWVvdXQgLSBub3cpKSk7CisKKyAgICAgIC8qIFdlZWQgb3V0IGFueXRoaW5nIHRvbyBsYXRlICovCisgICAgICBpZiAodGVzdC0+dHlwZSA9PSBUSU1FUl9UWVBFX0xPU1QgJiYKKyAgICAgICAgICAodGVzdF90aW1lb3V0ID09IC0xIHx8IHRlc3RfdGltZW91dCA8PSBub3cpKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIldlZWRpbmcgb3V0IGxhdGUgZW50cnkiKTsKKyAgICAgICAgZG9fbG9zdF90aW1lb3V0IChqaXR0ZXJidWZmZXIsIHRlc3QsIG5vdyk7CisgICAgICAgIGlmICghcHJpdi0+dGltZXJfcnVubmluZykKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogV2UgZG9uJ3QgbW92ZSB0aGUgaXRlcmF0b3IgZm9yd2FyZCBzaW5jZSB3ZSBqdXN0IHJlbW92ZWQgdGhlIGN1cnJlbnQgZW50cnksCisgICAgICAgICAqIGJ1dCB3ZSB1cGRhdGUgdGhlIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiAqLworICAgICAgICBsZW4gPSBwcml2LT50aW1lcnMtPmxlbjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGZpbmQgdGhlIHNtYWxsZXN0IHRpbWVvdXQgKi8KKyAgICAgICAgaWYgKHRpbWVyID09IE5VTEwpIHsKKyAgICAgICAgICBzYXZlX2Jlc3QgPSBUUlVFOworICAgICAgICB9IGVsc2UgaWYgKHRpbWVyX3RpbWVvdXQgPT0gLTEpIHsKKyAgICAgICAgICAvKiB3ZSBhbHJlYWR5IGhhdmUgYW4gaW1tZWRpYXRlIHRpbWVvdXQsIHRoZSBuZXcgdGltZXIgbXVzdCBiZSBhbgorICAgICAgICAgICAqIGltbWVkaWF0ZSB0aW1lciB3aXRoIHNtYWxsZXIgc2VxbnVtIHRvIGJlY29tZSB0aGUgYmVzdCAqLworICAgICAgICAgIGlmICh0ZXN0X3RpbWVvdXQgPT0gLTEKKyAgICAgICAgICAgICAgJiYgKGdzdF9ydHBfYnVmZmVyX2NvbXBhcmVfc2VxbnVtICh0ZXN0LT5zZXFudW0sCisgICAgICAgICAgICAgICAgICAgICAgdGltZXItPnNlcW51bSkgPiAwKSkKKyAgICAgICAgICAgIHNhdmVfYmVzdCA9IFRSVUU7CisgICAgICAgIH0gZWxzZSBpZiAodGVzdF90aW1lb3V0ID09IC0xKSB7CisgICAgICAgICAgLyogZmlyc3QgaW1tZWRpYXRlIHRpbWVyICovCisgICAgICAgICAgc2F2ZV9iZXN0ID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIGlmICh0ZXN0X3RpbWVvdXQgPCB0aW1lcl90aW1lb3V0KSB7CisgICAgICAgICAgLyogZWFybGllciB0aW1lciAqLworICAgICAgICAgIHNhdmVfYmVzdCA9IFRSVUU7CisgICAgICAgIH0gZWxzZSBpZiAodGVzdF90aW1lb3V0ID09IHRpbWVyX3RpbWVvdXQKKyAgICAgICAgICAgICYmIChnc3RfcnRwX2J1ZmZlcl9jb21wYXJlX3NlcW51bSAodGVzdC0+c2VxbnVtLAorICAgICAgICAgICAgICAgICAgICB0aW1lci0+c2VxbnVtKSA+IDApKSB7CisgICAgICAgICAgLyogc2FtZSB0aW1lciwgc21hbGxlciBzZXFudW0gKi8KKyAgICAgICAgICBzYXZlX2Jlc3QgPSBUUlVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNhdmVfYmVzdCkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIm5ldyBiZXN0ICVkIiwgaSk7CisgICAgICAgICAgdGltZXIgPSB0ZXN0OworICAgICAgICAgIHRpbWVyX3RpbWVvdXQgPSB0ZXN0X3RpbWVvdXQ7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgICAgfQorICAgIH0KKyAgICBpZiAodGltZXIgJiYgIXByaXYtPmJsb2NrZWQpIHsKKyAgICAgIEdzdENsb2NrICpjbG9jazsKKyAgICAgIEdzdENsb2NrVGltZSBzeW5jX3RpbWU7CisgICAgICBHc3RDbG9ja0lEIGlkOworICAgICAgR3N0Q2xvY2tSZXR1cm4gcmV0OworICAgICAgR3N0Q2xvY2tUaW1lRGlmZiBjbG9ja19qaXR0ZXI7CisKKyAgICAgIGlmICh0aW1lcl90aW1lb3V0ID09IC0xIHx8IHRpbWVyX3RpbWVvdXQgPD0gbm93KSB7CisgICAgICAgIC8qIFdlIGhhdmUgbm9ybWFsbHkgcmVtb3ZlZCBhbGwgbG9zdCB0aW1lcnMgaW4gdGhlIGxvb3AgYWJvdmUgKi8KKyAgICAgICAgZ19hc3NlcnQgKHRpbWVyLT50eXBlICE9IFRJTUVSX1RZUEVfTE9TVCk7CisKKyAgICAgICAgZG9fdGltZW91dCAoaml0dGVyYnVmZmVyLCB0aW1lciwgbm93KTsKKyAgICAgICAgLyogY2hlY2sgaGVyZSwgZG9fdGltZW91dCBjb3VsZCBoYXZlIHJlbGVhc2VkIHRoZSBsb2NrICovCisgICAgICAgIGlmICghcHJpdi0+dGltZXJfcnVubmluZykKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoaml0dGVyYnVmZmVyKTsKKyAgICAgIGNsb2NrID0gR1NUX0VMRU1FTlRfQ0xPQ0sgKGppdHRlcmJ1ZmZlcik7CisgICAgICBpZiAoIWNsb2NrKSB7CisgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChqaXR0ZXJidWZmZXIpOworICAgICAgICAvKiBsZXQncyBqdXN0IHB1c2ggaWYgdGhlcmUgaXMgbm8gY2xvY2sgKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiTm8gY2xvY2ssIHRpbWVvdXQgcmlnaHQgYXdheSIpOworICAgICAgICBub3cgPSB0aW1lcl90aW1lb3V0OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLyogcHJlcGFyZSBmb3Igc3luYyBhZ2FpbnN0IGNsb2NrICovCisgICAgICBzeW5jX3RpbWUgPSB0aW1lcl90aW1lb3V0ICsgR1NUX0VMRU1FTlRfQ0FTVCAoaml0dGVyYnVmZmVyKS0+YmFzZV90aW1lOworICAgICAgLyogYWRkIGxhdGVuY3kgb2YgcGVlciB0byBnZXQgaW5wdXQgdGltZSAqLworICAgICAgc3luY190aW1lICs9IHByaXYtPnBlZXJfbGF0ZW5jeTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAic3luYyB0byB0aW1lc3RhbXAgJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICAgIiB3aXRoIHN5bmMgdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXJfdGltZW91dCksIEdTVF9USU1FX0FSR1MgKHN5bmNfdGltZSkpOworCisgICAgICAvKiBjcmVhdGUgYW4gZW50cnkgZm9yIHRoZSBjbG9jayAqLworICAgICAgaWQgPSBwcml2LT5jbG9ja19pZCA9IGdzdF9jbG9ja19uZXdfc2luZ2xlX3Nob3RfaWQgKGNsb2NrLCBzeW5jX3RpbWUpOworICAgICAgcHJpdi0+dGltZXJfdGltZW91dCA9IHRpbWVyX3RpbWVvdXQ7CisgICAgICBwcml2LT50aW1lcl9zZXFudW0gPSB0aW1lci0+c2VxbnVtOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGppdHRlcmJ1ZmZlcik7CisKKyAgICAgIC8qIHJlbGVhc2UgdGhlIGxvY2sgc28gdGhhdCB0aGUgb3RoZXIgZW5kIGNhbiBwdXNoIHN0dWZmIG9yIHVubG9jayAqLworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworCisgICAgICByZXQgPSBnc3RfY2xvY2tfaWRfd2FpdCAoaWQsICZjbG9ja19qaXR0ZXIpOworCisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgaWYgKCFwcml2LT50aW1lcl9ydW5uaW5nKSB7CisgICAgICAgIGdzdF9jbG9ja19pZF91bnJlZiAoaWQpOworICAgICAgICBwcml2LT5jbG9ja19pZCA9IE5VTEw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAocmV0ICE9IEdTVF9DTE9DS19VTlNDSEVEVUxFRCkgeworICAgICAgICBub3cgPSB0aW1lcl90aW1lb3V0ICsgTUFYIChjbG9ja19qaXR0ZXIsIDApOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsCisgICAgICAgICAgICAic3luYyBkb25lLCAlZCwgIyVkLCAlIiBHU1RfU1RJTUVfRk9STUFULCByZXQsIHByaXYtPnRpbWVyX3NlcW51bSwKKyAgICAgICAgICAgIEdTVF9TVElNRV9BUkdTIChjbG9ja19qaXR0ZXIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInN5bmMgdW5zY2hlZHVsZWQiKTsKKyAgICAgIH0KKyAgICAgIC8qIGFuZCBmcmVlIHRoZSBlbnRyeSAqLworICAgICAgZ3N0X2Nsb2NrX2lkX3VucmVmIChpZCk7CisgICAgICBwcml2LT5jbG9ja19pZCA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIG5vIHRpbWVycywgd2FpdCBmb3IgYWN0aXZpdHkgKi8KKyAgICAgIEpCVUZfV0FJVF9USU1FUiAocHJpdik7CisgICAgfQorICB9CisgIEpCVUZfVU5MT0NLIChwcml2KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJ3ZSBhcmUgc3RvcHBpbmciKTsKKyAgcmV0dXJuOworfQorCisvKgorICogVGhpcyBmdW5jaW9uIGltcGxlbWVudHMgdGhlIG1haW4gcHVzaGluZyBsb29wIG9uIHRoZSBzb3VyY2UgcGFkLgorICoKKyAqIEl0IGZpcnN0IHRyaWVzIHRvIHB1c2ggYXMgbWFueSBidWZmZXJzIGFzIHBvc3NpYmxlLiBJZiB0aGVyZSBpcyBhIHNlcW51bQorICogbWlzbWF0Y2gsIHdlIHdhaXQgZm9yIHRoZSBuZXh0IHRpbWVvdXRzLgorICovCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2xvb3AgKEdzdFJ0cEppdHRlckJ1ZmZlciAqIGppdHRlcmJ1ZmZlcikKK3sKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKyAgR3N0Rmxvd1JldHVybiByZXN1bHQgPSBHU1RfRkxPV19PSzsKKworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIEpCVUZfTE9DS19DSEVDSyAocHJpdiwgZmx1c2hpbmcpOworICBkbyB7CisgICAgcmVzdWx0ID0gaGFuZGxlX25leHRfYnVmZmVyIChqaXR0ZXJidWZmZXIpOworICAgIGlmIChHX0xJS0VMWSAocmVzdWx0ID09IEdTVF9GTE9XX1dBSVQpKSB7CisgICAgICAvKiBub3cgd2FpdCBmb3IgdGhlIG5leHQgZXZlbnQgKi8KKyAgICAgIEpCVUZfV0FJVF9FVkVOVCAocHJpdiwgZmx1c2hpbmcpOworICAgICAgcmVzdWx0ID0gR1NUX0ZMT1dfT0s7CisgICAgfQorICB9IHdoaWxlIChyZXN1bHQgPT0gR1NUX0ZMT1dfT0spOworICAvKiBzdG9yZSByZXN1bHQgZm9yIHVwc3RyZWFtICovCisgIHByaXYtPnNyY3Jlc3VsdCA9IHJlc3VsdDsKKyAgLyogaWYgd2UgZ2V0IGhlcmUgd2UgbmVlZCB0byBwYXVzZSAqLworICBnb3RvIHBhdXNlOworCisgIC8qIEVSUk9SUyAqLworZmx1c2hpbmc6CisgIHsKKyAgICByZXN1bHQgPSBwcml2LT5zcmNyZXN1bHQ7CisgICAgZ290byBwYXVzZTsKKyAgfQorcGF1c2U6CisgIHsKKyAgICBHc3RFdmVudCAqZXZlbnQ7CisKKyAgICBKQlVGX1NJR05BTF9RVUVSWSAocHJpdiwgRkFMU0UpOworICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInBhdXNpbmcgdGFzaywgcmVhc29uICVzIiwKKyAgICAgICAgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJlc3VsdCkpOworICAgIGdzdF9wYWRfcGF1c2VfdGFzayAocHJpdi0+c3JjcGFkKTsKKyAgICBpZiAocmVzdWx0ID09IEdTVF9GTE9XX0VPUykgeworICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2VvcyAoKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocHJpdi0+c3JjcGFkLCBldmVudCk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorfQorCisvKiBjb2xsZWN0IHRoZSBpbmZvIGZyb20gdGhlIGxhc3Rlc3QgUlRDUCBwYWNrZXQgYW5kIHRoZSBqaXR0ZXJidWZmZXIgc3luYywgZG8KKyAqIHNvbWUgc2FuaXR5IGNoZWNrcyBhbmQgdGhlbiBlbWl0IHRoZSBoYW5kbGUtc3luYyBzaWduYWwgd2l0aCB0aGUgcGFyYW1ldGVycy4KKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgTE9DSyAqLworc3RhdGljIHZvaWQKK2RvX2hhbmRsZV9zeW5jIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqaXR0ZXJidWZmZXIpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXY7CisgIGd1aW50NjQgYmFzZV9ydHB0aW1lLCBiYXNlX3RpbWU7CisgIGd1aW50MzIgY2xvY2tfcmF0ZTsKKyAgZ3VpbnQ2NCBsYXN0X3J0cHRpbWU7CisgIGd1aW50NjQgY2xvY2tfYmFzZTsKKyAgZ3VpbnQ2NCBleHRfcnRwdGltZSwgZGlmZjsKKyAgZ2Jvb2xlYW4gdmFsaWQgPSBUUlVFLCBrZWVwID0gRkFMU0U7CisKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICAvKiBnZXQgdGhlIGxhc3QgdmFsdWVzIGZyb20gdGhlIGppdHRlcmJ1ZmZlciAqLworICBydHBfaml0dGVyX2J1ZmZlcl9nZXRfc3luYyAocHJpdi0+amJ1ZiwgJmJhc2VfcnRwdGltZSwgJmJhc2VfdGltZSwKKyAgICAgICZjbG9ja19yYXRlLCAmbGFzdF9ydHB0aW1lKTsKKworICBjbG9ja19iYXNlID0gcHJpdi0+Y2xvY2tfYmFzZTsKKyAgZXh0X3J0cHRpbWUgPSBwcml2LT5leHRfcnRwdGltZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJleHQgU1IgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBiYXNlICUiCisgICAgICBHX0dVSU5UNjRfRk9STUFUICIsIGNsb2NrLXJhdGUgJSIgR19HVUlOVDMyX0ZPUk1BVAorICAgICAgIiwgY2xvY2stYmFzZSAlIiBHX0dVSU5UNjRfRk9STUFUICIsIGxhc3QtcnRwdGltZSAlIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgZXh0X3J0cHRpbWUsIGJhc2VfcnRwdGltZSwgY2xvY2tfcmF0ZSwgY2xvY2tfYmFzZSwgbGFzdF9ydHB0aW1lKTsKKworICBpZiAoYmFzZV9ydHB0aW1lID09IC0xIHx8IGNsb2NrX3JhdGUgPT0gLTEgfHwgYmFzZV90aW1lID09IC0xKSB7CisgICAgLyogd2Uga2VlcCB0aGlzIFNSIHBhY2tldCBmb3IgbGF0ZXIuIFdoZW4gd2UgZ2V0IGEgdmFsaWQgUlRQIHBhY2tldCB0aGUKKyAgICAgKiBhYm92ZSB2YWx1ZXMgd2lsbCBiZSBzZXQgYW5kIHdlIGNhbiB0cnkgdG8gdXNlIHRoZSBTUiBwYWNrZXQgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJrZWVwaW5nIGZvciBsYXRlciwgbm8gUlRQIHZhbHVlcyIpOworICAgIGtlZXAgPSBUUlVFOworICB9IGVsc2UgeworICAgIC8qIHdlIGNhbid0IGFjY2VwdCBhbnl0aGluZyB0aGF0IGhhcHBlbmVkIGJlZm9yZSB3ZSBkaWQgdGhlIGxhc3QgcmVzeW5jICovCisgICAgaWYgKGJhc2VfcnRwdGltZSA+IGV4dF9ydHB0aW1lKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJkcm9wcGluZywgb2xkZXIgdGhhbiBiYXNlIHRpbWUiKTsKKyAgICAgIHZhbGlkID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHRoZSBTUiBSVFAgdGltZXN0YW1wIG11c3QgYmUgc29tZXRoaW5nIGNsb3NlIHRvIHdoYXQgd2UgbGFzdCBvYnNlcnZlZAorICAgICAgICogaW4gdGhlIGppdHRlcmJ1ZmZlciAqLworICAgICAgaWYgKGV4dF9ydHB0aW1lID4gbGFzdF9ydHB0aW1lKSB7CisgICAgICAgIC8qIGNoZWNrIGhvdyBmYXIgYWhlYWQgaXQgaXMgdG8gb3VyIFJUUCB0aW1lc3RhbXBzICovCisgICAgICAgIGRpZmYgPSBleHRfcnRwdGltZSAtIGxhc3RfcnRwdGltZTsKKyAgICAgICAgLyogaWYgYmlnZ2VyIHRoYW4gMSBzZWNvbmQsIHdlIGRyb3AgaXQgKi8KKyAgICAgICAgaWYgKGppdHRlcmJ1ZmZlci0+cHJpdi0+bWF4X3J0Y3BfcnRwX3RpbWVfZGlmZiAhPSAtMSAmJgorICAgICAgICAgICAgZGlmZiA+CisgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGppdHRlcmJ1ZmZlci0+cHJpdi0+bWF4X3J0Y3BfcnRwX3RpbWVfZGlmZiwKKyAgICAgICAgICAgICAgICBjbG9ja19yYXRlLCAxMDAwKSkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInRvbyBmYXIgYWhlYWQiKTsKKyAgICAgICAgICAvKiBzaG91bGQgZHJvcCB0aGlzLCBidXQgc29tZSBSVFNQIHNlcnZlcnMgZW5kIHVwIHdpdGggYm9ndXMKKyAgICAgICAgICAgKiB3YXkgdG9vIGFoZWFkIFJUQ1AgcGFja2V0IHdoZW4gcmVwZWF0ZWQgUEFVU0UvUExBWSwKKyAgICAgICAgICAgKiBzbyBzdGlsbCB0cmlnZ2VyIHJwdGJpbiBzeW5jIGJ1dCBpbnZhbGlkYXRlIFJUQ1AgZGF0YQorICAgICAgICAgICAqIChzeW5jIG1pZ2h0IHVzZSBvdGhlciBtZXRob2RzKSAqLworICAgICAgICAgIGV4dF9ydHB0aW1lID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiZXh0IGxhc3QgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBkaWZmICUiCisgICAgICAgICAgICBHX0dVSU5UNjRfRk9STUFULCBsYXN0X3J0cHRpbWUsIGRpZmYpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChrZWVwKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAia2VlcGluZyBSVENQIHBhY2tldCBmb3IgbGF0ZXIiKTsKKyAgfSBlbHNlIGlmICh2YWxpZCkgeworICAgIEdzdFN0cnVjdHVyZSAqczsKKworICAgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLXN5bmMiLAorICAgICAgICAiYmFzZS1ydHB0aW1lIiwgR19UWVBFX1VJTlQ2NCwgYmFzZV9ydHB0aW1lLAorICAgICAgICAiYmFzZS10aW1lIiwgR19UWVBFX1VJTlQ2NCwgYmFzZV90aW1lLAorICAgICAgICAiY2xvY2stcmF0ZSIsIEdfVFlQRV9VSU5ULCBjbG9ja19yYXRlLAorICAgICAgICAiY2xvY2stYmFzZSIsIEdfVFlQRV9VSU5UNjQsIGNsb2NrX2Jhc2UsCisgICAgICAgICJzci1leHQtcnRwdGltZSIsIEdfVFlQRV9VSU5UNjQsIGV4dF9ydHB0aW1lLAorICAgICAgICAic3ItYnVmZmVyIiwgR1NUX1RZUEVfQlVGRkVSLCBwcml2LT5sYXN0X3NyLCBOVUxMKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInNpZ25hbGluZyBzeW5jIik7CisgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmcHJpdi0+bGFzdF9zciwgTlVMTCk7CisgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgIGdfc2lnbmFsX2VtaXQgKGppdHRlcmJ1ZmZlciwKKyAgICAgICAgZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX3NpZ25hbHNbU0lHTkFMX0hBTkRMRV9TWU5DXSwgMCwgcyk7CisgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHMpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgImRyb3BwaW5nIFJUQ1AgcGFja2V0Iik7CisgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmcHJpdi0+bGFzdF9zciwgTlVMTCk7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9jaGFpbl9ydGNwIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlciAqaml0dGVyYnVmZmVyOworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBndWludDMyIHNzcmM7CisgIEdzdFJUQ1BQYWNrZXQgcGFja2V0OworICBndWludDY0IGV4dF9ydHB0aW1lOworICBndWludDMyIHJ0cHRpbWU7CisgIEdzdFJUQ1BCdWZmZXIgcnRjcCA9IHsgTlVMTCwgfTsKKworICBqaXR0ZXJidWZmZXIgPSBHU1RfUlRQX0pJVFRFUl9CVUZGRVIgKHBhcmVudCk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFnc3RfcnRjcF9idWZmZXJfdmFsaWRhdGVfcmVkdWNlZCAoYnVmZmVyKSkpCisgICAgZ290byBpbnZhbGlkX2J1ZmZlcjsKKworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIGdzdF9ydGNwX2J1ZmZlcl9tYXAgKGJ1ZmZlciwgR1NUX01BUF9SRUFELCAmcnRjcCk7CisKKyAgaWYgKCFnc3RfcnRjcF9idWZmZXJfZ2V0X2ZpcnN0X3BhY2tldCAoJnJ0Y3AsICZwYWNrZXQpKQorICAgIGdvdG8gZW1wdHlfYnVmZmVyOworCisgIC8qIGZpcnN0IHBhY2tldCBtdXN0IGJlIFNSIG9yIFJSIG9yIGVsc2UgdGhlIHZhbGlkYXRlIHdvdWxkIGhhdmUgZmFpbGVkICovCisgIHN3aXRjaCAoZ3N0X3J0Y3BfcGFja2V0X2dldF90eXBlICgmcGFja2V0KSkgeworICAgIGNhc2UgR1NUX1JUQ1BfVFlQRV9TUjoKKyAgICAgIGdzdF9ydGNwX3BhY2tldF9zcl9nZXRfc2VuZGVyX2luZm8gKCZwYWNrZXQsICZzc3JjLCBOVUxMLCAmcnRwdGltZSwKKyAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIGlnbm9yZV9idWZmZXI7CisgIH0KKyAgZ3N0X3J0Y3BfYnVmZmVyX3VubWFwICgmcnRjcCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAicmVjZWl2ZWQgUlRDUCBvZiBTU1JDICUwOHgiLCBzc3JjKTsKKworICBKQlVGX0xPQ0sgKHByaXYpOworICAvKiBjb252ZXJ0IHRoZSBSVFAgdGltZXN0YW1wIHRvIG91ciBleHRlbmRlZCB0aW1lc3RhbXAsIHVzaW5nIHRoZSBzYW1lIG9mZnNldAorICAgKiB3ZSB1c2VkIGluIHRoZSBqaXR0ZXJidWZmZXIgKi8KKyAgZXh0X3J0cHRpbWUgPSBwcml2LT5qYnVmLT5leHRfcnRwdGltZTsKKyAgZXh0X3J0cHRpbWUgPSBnc3RfcnRwX2J1ZmZlcl9leHRfdGltZXN0YW1wICgmZXh0X3J0cHRpbWUsIHJ0cHRpbWUpOworCisgIHByaXYtPmV4dF9ydHB0aW1lID0gZXh0X3J0cHRpbWU7CisgIGdzdF9idWZmZXJfcmVwbGFjZSAoJnByaXYtPmxhc3Rfc3IsIGJ1ZmZlcik7CisKKyAgZG9faGFuZGxlX3N5bmMgKGppdHRlcmJ1ZmZlcik7CisgIEpCVUZfVU5MT0NLIChwcml2KTsKKworZG9uZToKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICByZXR1cm4gcmV0OworCitpbnZhbGlkX2J1ZmZlcjoKKyAgeworICAgIC8qIHRoaXMgaXMgbm90IGZhdGFsIGJ1dCBzaG91bGQgYmUgZmlsdGVyZWQgZWFybGllciAqLworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKGppdHRlcmJ1ZmZlciwgU1RSRUFNLCBERUNPREUsIChOVUxMKSwKKyAgICAgICAgKCJSZWNlaXZlZCBpbnZhbGlkIFJUQ1AgcGF5bG9hZCwgZHJvcHBpbmciKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgZ290byBkb25lOworICB9CitlbXB0eV9idWZmZXI6CisgIHsKKyAgICAvKiB0aGlzIGlzIG5vdCBmYXRhbCBidXQgc2hvdWxkIGJlIGZpbHRlcmVkIGVhcmxpZXIgKi8KKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChqaXR0ZXJidWZmZXIsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksCisgICAgICAgICgiUmVjZWl2ZWQgZW1wdHkgUlRDUCBwYXlsb2FkLCBkcm9wcGluZyIpKTsKKyAgICBnc3RfcnRjcF9idWZmZXJfdW5tYXAgKCZydGNwKTsKKyAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICBnb3RvIGRvbmU7CisgIH0KK2lnbm9yZV9idWZmZXI6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJpZ25vcmluZyBSVENQIHBhY2tldCIpOworICAgIGdzdF9ydGNwX2J1ZmZlcl91bm1hcCAoJnJ0Y3ApOworICAgIHJldCA9IEdTVF9GTE9XX09LOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfaml0dGVyX2J1ZmZlcl9zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKyAgR3N0UnRwSml0dGVyQnVmZmVyICpqaXR0ZXJidWZmZXI7CisgIEdzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgKnByaXY7CisKKyAgaml0dGVyYnVmZmVyID0gR1NUX1JUUF9KSVRURVJfQlVGRkVSIChwYXJlbnQpOworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqZmlsdGVyLCAqY2FwczsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2NhcHMgKHF1ZXJ5LCAmZmlsdGVyKTsKKyAgICAgIGNhcHMgPSBnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0Y2FwcyAocGFkLCBmaWx0ZXIpOworICAgICAgZ3N0X3F1ZXJ5X3NldF9jYXBzX3Jlc3VsdCAocXVlcnksIGNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgaWYgKEdTVF9RVUVSWV9JU19TRVJJQUxJWkVEIChxdWVyeSkpIHsKKyAgICAgICAgUlRQSml0dGVyQnVmZmVySXRlbSAqaXRlbTsKKyAgICAgICAgZ2Jvb2xlYW4gaGVhZDsKKworICAgICAgICBKQlVGX0xPQ0tfQ0hFQ0sgKHByaXYsIG91dF9mbHVzaGluZyk7CisgICAgICAgIGlmIChydHBfaml0dGVyX2J1ZmZlcl9nZXRfbW9kZSAocHJpdi0+amJ1ZikgIT0KKyAgICAgICAgICAgIFJUUF9KSVRURVJfQlVGRkVSX01PREVfQlVGRkVSKSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiYWRkaW5nIHNlcmlhbGl6ZWQgcXVlcnkiKTsKKyAgICAgICAgICBpdGVtID0gYWxsb2NfaXRlbSAocXVlcnksIElURU1fVFlQRV9RVUVSWSwgLTEsIC0xLCAtMSwgMCwgLTEpOworICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2luc2VydCAocHJpdi0+amJ1ZiwgaXRlbSwgJmhlYWQsIE5VTEwpOworICAgICAgICAgIGlmIChoZWFkKQorICAgICAgICAgICAgSkJVRl9TSUdOQUxfRVZFTlQgKHByaXYpOworICAgICAgICAgIEpCVUZfV0FJVF9RVUVSWSAocHJpdiwgb3V0X2ZsdXNoaW5nKTsKKyAgICAgICAgICByZXMgPSBwcml2LT5sYXN0X3F1ZXJ5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInJlZnVzaW5nIHF1ZXJ5LCB3ZSBhcmUgYnVmZmVyaW5nIik7CisgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlczsKKyAgLyogRVJST1JTICovCitvdXRfZmx1c2hpbmc6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJ3ZSBhcmUgZmx1c2hpbmciKTsKKyAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXIgKmppdHRlcmJ1ZmZlcjsKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgaml0dGVyYnVmZmVyID0gR1NUX1JUUF9KSVRURVJfQlVGRkVSIChwYXJlbnQpOworICBwcml2ID0gaml0dGVyYnVmZmVyLT5wcml2OworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0xBVEVOQ1k6CisgICAgeworICAgICAgLyogV2UgbmVlZCB0byBzZW5kIHRoZSBxdWVyeSB1cHN0cmVhbSBhbmQgYWRkIHRoZSByZXR1cm5lZCBsYXRlbmN5IHRvIG91cgorICAgICAgICogb3duICovCisgICAgICBHc3RDbG9ja1RpbWUgbWluX2xhdGVuY3ksIG1heF9sYXRlbmN5OworICAgICAgZ2Jvb2xlYW4gdXNfbGl2ZTsKKyAgICAgIEdzdENsb2NrVGltZSBvdXJfbGF0ZW5jeTsKKworICAgICAgaWYgKChyZXMgPSBnc3RfcGFkX3BlZXJfcXVlcnkgKHByaXYtPnNpbmtwYWQsIHF1ZXJ5KSkpIHsKKyAgICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2xhdGVuY3kgKHF1ZXJ5LCAmdXNfbGl2ZSwgJm1pbl9sYXRlbmN5LCAmbWF4X2xhdGVuY3kpOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIlBlZXIgbGF0ZW5jeTogbWluICUiCisgICAgICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiBtYXggJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobWluX2xhdGVuY3kpLCBHU1RfVElNRV9BUkdTIChtYXhfbGF0ZW5jeSkpOworCisgICAgICAgIC8qIHN0b3JlIHRoaXMgc28gdGhhdCB3ZSBjYW4gc2FmZWx5IHN5bmMgb24gdGhlIHBlZXIgYnVmZmVycy4gKi8KKyAgICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgICAgcHJpdi0+cGVlcl9sYXRlbmN5ID0gbWluX2xhdGVuY3k7CisgICAgICAgIG91cl9sYXRlbmN5ID0gcHJpdi0+bGF0ZW5jeV9uczsKKyAgICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgIk91ciBsYXRlbmN5OiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgICBHU1RfVElNRV9BUkdTIChvdXJfbGF0ZW5jeSkpOworCisgICAgICAgIC8qIHdlIGFkZCBzb21lIGxhdGVuY3kgYnV0IGNhbiBidWZmZXIgYW4gaW5maW5pdGUgYW1vdW50IG9mIHRpbWUgKi8KKyAgICAgICAgbWluX2xhdGVuY3kgKz0gb3VyX2xhdGVuY3k7CisgICAgICAgIG1heF9sYXRlbmN5ID0gLTE7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoaml0dGVyYnVmZmVyLCAiQ2FsY3VsYXRlZCB0b3RhbCBsYXRlbmN5IDogbWluICUiCisgICAgICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiBtYXggJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobWluX2xhdGVuY3kpLCBHU1RfVElNRV9BUkdTIChtYXhfbGF0ZW5jeSkpOworCisgICAgICAgIGdzdF9xdWVyeV9zZXRfbGF0ZW5jeSAocXVlcnksIFRSVUUsIG1pbl9sYXRlbmN5LCBtYXhfbGF0ZW5jeSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfUE9TSVRJT046CisgICAgeworICAgICAgR3N0Q2xvY2tUaW1lIHN0YXJ0LCBsYXN0X291dDsKKyAgICAgIEdzdEZvcm1hdCBmbXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9wb3NpdGlvbiAocXVlcnksICZmbXQsIE5VTEwpOworICAgICAgaWYgKGZtdCAhPSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIHN0YXJ0ID0gcHJpdi0+bnB0X3N0YXJ0OworICAgICAgbGFzdF9vdXQgPSBwcml2LT5sYXN0X291dF90aW1lOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJucHQgc3RhcnQgJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICAgIiwgbGFzdCBvdXQgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChzdGFydCksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobGFzdF9vdXQpKTsKKworICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdGFydCkgJiYgR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGxhc3Rfb3V0KSkgeworICAgICAgICAvKiBicmluZyAwLWJhc2VkIG91dGdvaW5nIHRpbWUgdG8gc3RyZWFtIHRpbWUgKi8KKyAgICAgICAgZ3N0X3F1ZXJ5X3NldF9wb3NpdGlvbiAocXVlcnksIEdTVF9GT1JNQVRfVElNRSwgc3RhcnQgKyBsYXN0X291dCk7CisgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpmaWx0ZXIsICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZmaWx0ZXIpOworICAgICAgY2FwcyA9IGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9nZXRjYXBzIChwYWQsIGZpbHRlcik7CisgICAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICByZXMgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cEppdHRlckJ1ZmZlciAqaml0dGVyYnVmZmVyOworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OworCisgIGppdHRlcmJ1ZmZlciA9IEdTVF9SVFBfSklUVEVSX0JVRkZFUiAob2JqZWN0KTsKKyAgcHJpdiA9IGppdHRlcmJ1ZmZlci0+cHJpdjsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTEFURU5DWToKKyAgICB7CisgICAgICBndWludCBuZXdfbGF0ZW5jeSwgb2xkX2xhdGVuY3k7CisKKyAgICAgIG5ld19sYXRlbmN5ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworCisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgb2xkX2xhdGVuY3kgPSBwcml2LT5sYXRlbmN5X21zOworICAgICAgcHJpdi0+bGF0ZW5jeV9tcyA9IG5ld19sYXRlbmN5OworICAgICAgcHJpdi0+bGF0ZW5jeV9ucyA9IHByaXYtPmxhdGVuY3lfbXMgKiBHU1RfTVNFQ09ORDsKKyAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX3NldF9kZWxheSAocHJpdi0+amJ1ZiwgcHJpdi0+bGF0ZW5jeV9ucyk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisKKyAgICAgIC8qIHBvc3QgbWVzc2FnZSBpZiBsYXRlbmN5IGNoYW5nZWQsIHRoaXMgd2lsbCBpbmZvcm0gdGhlIHBhcmVudCBwaXBlbGluZQorICAgICAgICogdGhhdCBhIGxhdGVuY3kgcmVjb25maWd1cmF0aW9uIGlzIHBvc3NpYmxlL25lZWRlZC4gKi8KKyAgICAgIGlmIChuZXdfbGF0ZW5jeSAhPSBvbGRfbGF0ZW5jeSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChqaXR0ZXJidWZmZXIsICJsYXRlbmN5IGNoYW5nZWQgdG86ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKG5ld19sYXRlbmN5ICogR1NUX01TRUNPTkQpKTsKKworICAgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKGppdHRlcmJ1ZmZlciksCisgICAgICAgICAgICBnc3RfbWVzc2FnZV9uZXdfbGF0ZW5jeSAoR1NUX09CSkVDVF9DQVNUIChqaXR0ZXJidWZmZXIpKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0RST1BfT05fTEFURU5DWToKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBwcml2LT5kcm9wX29uX2xhdGVuY3kgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVFNfT0ZGU0VUOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIGlmIChwcml2LT5tYXhfdHNfb2Zmc2V0X2FkanVzdG1lbnQgIT0gMCkgeworICAgICAgICBnaW50NjQgbmV3X29mZnNldCA9IGdfdmFsdWVfZ2V0X2ludDY0ICh2YWx1ZSk7CisKKyAgICAgICAgaWYgKG5ld19vZmZzZXQgPiBwcml2LT50c19vZmZzZXQpIHsKKyAgICAgICAgICBwcml2LT50c19vZmZzZXRfcmVtYWluZGVyID0gbmV3X29mZnNldCAtIHByaXYtPnRzX29mZnNldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcml2LT50c19vZmZzZXRfcmVtYWluZGVyID0gLShwcml2LT50c19vZmZzZXQgLSBuZXdfb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpdi0+dHNfb2Zmc2V0ID0gZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKTsKKyAgICAgICAgcHJpdi0+dHNfb2Zmc2V0X3JlbWFpbmRlciA9IDA7CisgICAgICB9CisgICAgICBwcml2LT50c19kaXNjb250ID0gVFJVRTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfVFNfT0ZGU0VUX0FESlVTVE1FTlQ6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgcHJpdi0+bWF4X3RzX29mZnNldF9hZGp1c3RtZW50ID0gZ192YWx1ZV9nZXRfdWludDY0ICh2YWx1ZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRE9fTE9TVDoKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBwcml2LT5kb19sb3N0ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01PREU6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgcnRwX2ppdHRlcl9idWZmZXJfc2V0X21vZGUgKHByaXYtPmpidWYsIGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRE9fUkVUUkFOU01JU1NJT046CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgcHJpdi0+ZG9fcmV0cmFuc21pc3Npb24gPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRYX05FWFRfU0VRTlVNOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIHByaXYtPnJ0eF9uZXh0X3NlcW51bSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVFhfREVMQVk6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgcHJpdi0+cnR4X2RlbGF5ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRYX01JTl9ERUxBWToKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBwcml2LT5ydHhfbWluX2RlbGF5ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUWF9ERUxBWV9SRU9SREVSOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIHByaXYtPnJ0eF9kZWxheV9yZW9yZGVyID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRYX1JFVFJZX1RJTUVPVVQ6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgcHJpdi0+cnR4X3JldHJ5X3RpbWVvdXQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVFhfTUlOX1JFVFJZX1RJTUVPVVQ6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgcHJpdi0+cnR4X21pbl9yZXRyeV90aW1lb3V0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRYX1JFVFJZX1BFUklPRDoKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBwcml2LT5ydHhfcmV0cnlfcGVyaW9kID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRYX01BWF9SRVRSSUVTOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIHByaXYtPnJ0eF9tYXhfcmV0cmllcyA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUWF9ERUFETElORToKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBwcml2LT5ydHhfZGVhZGxpbmVfbXMgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVFhfU1RBVFNfVElNRU9VVDoKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBwcml2LT5ydHhfc3RhdHNfdGltZW91dCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIHByaXYtPm1heF9ydGNwX3J0cF90aW1lX2RpZmYgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfRFJPUE9VVF9USU1FOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIHByaXYtPm1heF9kcm9wb3V0X3RpbWUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX01JU09SREVSX1RJTUU6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgcHJpdi0+bWF4X21pc29yZGVyX3RpbWUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkZDNzI3M19TWU5DOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX3NldF9yZmM3MjczX3N5bmMgKHByaXYtPmpidWYsCisgICAgICAgICAgZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpKTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GQVNUU1RBUlRfTUlOX1BBQ0tFVFM6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgcHJpdi0+ZmFzdHN0YXJ0X21pbl9wYWNrZXRzID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9qaXR0ZXJfYnVmZmVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXIgKmppdHRlcmJ1ZmZlcjsKKyAgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZSAqcHJpdjsKKworICBqaXR0ZXJidWZmZXIgPSBHU1RfUlRQX0pJVFRFUl9CVUZGRVIgKG9iamVjdCk7CisgIHByaXYgPSBqaXR0ZXJidWZmZXItPnByaXY7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xBVEVOQ1k6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHByaXYtPmxhdGVuY3lfbXMpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RST1BfT05fTEFURU5DWToKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcHJpdi0+ZHJvcF9vbl9sYXRlbmN5KTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UU19PRkZTRVQ6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfaW50NjQgKHZhbHVlLCBwcml2LT50c19vZmZzZXQpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVDoKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBwcml2LT5tYXhfdHNfb2Zmc2V0X2FkanVzdG1lbnQpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RPX0xPU1Q6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHByaXYtPmRvX2xvc3QpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01PREU6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF9tb2RlIChwcml2LT5qYnVmKSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUEVSQ0VOVDoKKyAgICB7CisgICAgICBnaW50IHBlcmNlbnQ7CisKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBpZiAocHJpdi0+c3JjcmVzdWx0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICBwZXJjZW50ID0gMTAwOworICAgICAgZWxzZQorICAgICAgICBwZXJjZW50ID0gcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3BlcmNlbnQgKHByaXYtPmpidWYpOworCisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBwZXJjZW50KTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfRE9fUkVUUkFOU01JU1NJT046CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHByaXYtPmRvX3JldHJhbnNtaXNzaW9uKTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVFhfTkVYVF9TRVFOVU06CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHByaXYtPnJ0eF9uZXh0X3NlcW51bSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRYX0RFTEFZOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHByaXYtPnJ0eF9kZWxheSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRYX01JTl9ERUxBWToKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcHJpdi0+cnR4X21pbl9kZWxheSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRYX0RFTEFZX1JFT1JERVI6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgcHJpdi0+cnR4X2RlbGF5X3Jlb3JkZXIpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUWF9SRVRSWV9USU1FT1VUOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHByaXYtPnJ0eF9yZXRyeV90aW1lb3V0KTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVFhfTUlOX1JFVFJZX1RJTUVPVVQ6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgcHJpdi0+cnR4X21pbl9yZXRyeV90aW1lb3V0KTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVFhfUkVUUllfUEVSSU9EOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHByaXYtPnJ0eF9yZXRyeV9wZXJpb2QpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUWF9NQVhfUkVUUklFUzoKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBwcml2LT5ydHhfbWF4X3JldHJpZXMpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUWF9ERUFETElORToKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBwcml2LT5ydHhfZGVhZGxpbmVfbXMpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUWF9TVEFUU19USU1FT1VUOgorICAgICAgSkJVRl9MT0NLIChwcml2KTsKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBwcml2LT5ydHhfc3RhdHNfdGltZW91dCk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1RBVFM6CisgICAgICBnX3ZhbHVlX3Rha2VfYm94ZWQgKHZhbHVlLAorICAgICAgICAgIGdzdF9ydHBfaml0dGVyX2J1ZmZlcl9jcmVhdGVfc3RhdHMgKGppdHRlcmJ1ZmZlcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9SVENQX1JUUF9USU1FX0RJRkY6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgcHJpdi0+bWF4X3J0Y3BfcnRwX3RpbWVfZGlmZik7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX0RST1BPVVRfVElNRToKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcHJpdi0+bWF4X2Ryb3BvdXRfdGltZSk7CisgICAgICBKQlVGX1VOTE9DSyAocHJpdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX01JU09SREVSX1RJTUU6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHByaXYtPm1heF9taXNvcmRlcl90aW1lKTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRkM3MjczX1NZTkM6CisgICAgICBKQlVGX0xPQ0sgKHByaXYpOworICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsCisgICAgICAgICAgcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3JmYzcyNzNfc3luYyAocHJpdi0+amJ1ZikpOworICAgICAgSkJVRl9VTkxPQ0sgKHByaXYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZBU1RTVEFSVF9NSU5fUEFDS0VUUzoKKyAgICAgIEpCVUZfTE9DSyAocHJpdik7CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcHJpdi0+ZmFzdHN0YXJ0X21pbl9wYWNrZXRzKTsKKyAgICAgIEpCVUZfVU5MT0NLIChwcml2KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdzdFN0cnVjdHVyZSAqCitnc3RfcnRwX2ppdHRlcl9idWZmZXJfY3JlYXRlX3N0YXRzIChHc3RSdHBKaXR0ZXJCdWZmZXIgKiBqYnVmKQoreworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2ID0gamJ1Zi0+cHJpdjsKKyAgR3N0U3RydWN0dXJlICpzOworCisgIEpCVUZfTE9DSyAocHJpdik7CisgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLWppdHRlcmJ1ZmZlci1zdGF0cyIsCisgICAgICAibnVtLXB1c2hlZCIsIEdfVFlQRV9VSU5UNjQsIHByaXYtPm51bV9wdXNoZWQsCisgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCBwcml2LT5udW1fbG9zdCwKKyAgICAgICJudW0tbGF0ZSIsIEdfVFlQRV9VSU5UNjQsIHByaXYtPm51bV9sYXRlLAorICAgICAgIm51bS1kdXBsaWNhdGVzIiwgR19UWVBFX1VJTlQ2NCwgcHJpdi0+bnVtX2R1cGxpY2F0ZXMsCisgICAgICAiYXZnLWppdHRlciIsIEdfVFlQRV9VSU5UNjQsIHByaXYtPmF2Z19qaXR0ZXIsCisgICAgICAicnR4LWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgcHJpdi0+bnVtX3J0eF9yZXF1ZXN0cywKKyAgICAgICJydHgtc3VjY2Vzcy1jb3VudCIsIEdfVFlQRV9VSU5UNjQsIHByaXYtPm51bV9ydHhfc3VjY2VzcywKKyAgICAgICJydHgtcGVyLXBhY2tldCIsIEdfVFlQRV9ET1VCTEUsIHByaXYtPmF2Z19ydHhfbnVtLAorICAgICAgInJ0eC1ydHQiLCBHX1RZUEVfVUlOVDY0LCBwcml2LT5hdmdfcnR4X3J0dCwgTlVMTCk7CisgIEpCVUZfVU5MT0NLIChwcml2KTsKKworICByZXR1cm4gczsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5oIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwaml0dGVyYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViYjEzYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cGppdHRlcmJ1ZmZlci5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBGYXJzaWdodCBWb2ljZStWaWRlbyBsaWJyYXJ5CisgKgorICogIENvcHlyaWdodCAyMDA3IENvbGxhYm9yYSBMdGQsIAorICogIENvcHlyaWdodCAyMDA3IE5va2lhIENvcnBvcmF0aW9uCisgKiAgIEBhdXRob3I6IFBoaWxpcHBlIEthbGFmIDxwaGlsaXBwZS5rYWxhZkBjb2xsYWJvcmEuY28udWs+LgorICogIENvcHlyaWdodCAyMDA3IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX0pJVFRFUl9CVUZGRVJfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9KSVRURVJfQlVGRkVSX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworLyogI2RlZmluZSdzIGRvbid0IGxpa2Ugd2hpdGVzcGFjZXkgYml0cyAqLworI2RlZmluZSBHU1RfVFlQRV9SVFBfSklUVEVSX0JVRkZFUiBcCisgIChnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9KSVRURVJfQlVGRkVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksIFwKKyAgR1NUX1RZUEVfUlRQX0pJVFRFUl9CVUZGRVIsR3N0UnRwSml0dGVyQnVmZmVyKSkKKyNkZWZpbmUgR1NUX1JUUF9KSVRURVJfQlVGRkVSX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLCBcCisgIEdTVF9UWVBFX1JUUF9KSVRURVJfQlVGRkVSLEdzdFJ0cEppdHRlckJ1ZmZlckNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9KSVRURVJfQlVGRkVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX0pJVFRFUl9CVUZGRVIpKQorI2RlZmluZSBHU1RfSVNfUlRQX0pJVFRFUl9CVUZGRVJfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9KSVRURVJfQlVGRkVSKSkKKyNkZWZpbmUgR1NUX1JUUF9KSVRURVJfQlVGRkVSX0NBU1Qob2JqKSBcCisgICgoR3N0UnRwSml0dGVyQnVmZmVyICopKG9iaikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBKaXR0ZXJCdWZmZXIgR3N0UnRwSml0dGVyQnVmZmVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEppdHRlckJ1ZmZlckNsYXNzIEdzdFJ0cEppdHRlckJ1ZmZlckNsYXNzOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cEppdHRlckJ1ZmZlclByaXZhdGUgR3N0UnRwSml0dGVyQnVmZmVyUHJpdmF0ZTsKKworLyoqCisgKiBHc3RSdHBKaXR0ZXJCdWZmZXI6CisgKgorICogT3BhcXVlIGppdHRlcmJ1ZmZlciBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0UnRwSml0dGVyQnVmZmVyCit7CisgIEdzdEVsZW1lbnQgcGFyZW50OworCisgIC8qPCBwcml2YXRlID4qLworICBHc3RSdHBKaXR0ZXJCdWZmZXJQcml2YXRlICpwcml2OyAvKiBGSVhNRTogcmVtb3ZlPyAqLworfTsKKworc3RydWN0IF9Hc3RSdHBKaXR0ZXJCdWZmZXJDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworCisgIC8qIHNpZ25hbHMgKi8KKyAgR3N0Q2FwcyogKCpyZXF1ZXN0X3B0X21hcCkgICAoR3N0UnRwSml0dGVyQnVmZmVyICpidWZmZXIsIGd1aW50IHB0KTsKKworICB2b2lkICAgICAoKmhhbmRsZV9zeW5jKSAgICAgIChHc3RSdHBKaXR0ZXJCdWZmZXIgKmJ1ZmZlciwgR3N0U3RydWN0dXJlICpzKTsKKyAgdm9pZCAgICAgKCpvbl9ucHRfc3RvcCkgICAgICAoR3N0UnRwSml0dGVyQnVmZmVyICpidWZmZXIpOworCisgIC8qIGFjdGlvbnMgKi8KKyAgdm9pZCAgICAgKCpjbGVhcl9wdF9tYXApICAgKEdzdFJ0cEppdHRlckJ1ZmZlciAqYnVmZmVyKTsKKworICBHc3RDbG9ja1RpbWUgKCpzZXRfYWN0aXZlKSAgICAgKEdzdFJ0cEppdHRlckJ1ZmZlciAqYnVmZmVyLCBnYm9vbGVhbiBhY3RpdmUsIGd1aW50NjQgZWxhcHNlZCk7Cit9OworCitHVHlwZSBnc3RfcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfUlRQX0pJVFRFUl9CVUZGRVJfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9nc3RydHBtYW5hZ2VyLmMgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBtYW5hZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2YjBiNwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cG1hbmFnZXIuYwpAQCAtMCwwICsxLDc5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0cnRwYmluLmgiCisjaW5jbHVkZSAiZ3N0cnRwaml0dGVyYnVmZmVyLmgiCisjaW5jbHVkZSAiZ3N0cnRwcHRkZW11eC5oIgorI2luY2x1ZGUgImdzdHJ0cHNlc3Npb24uaCIKKyNpbmNsdWRlICJnc3RydHBydHhxdWV1ZS5oIgorI2luY2x1ZGUgImdzdHJ0cHJ0eHJlY2VpdmUuaCIKKyNpbmNsdWRlICJnc3RydHBydHhzZW5kLmgiCisjaW5jbHVkZSAiZ3N0cnRwc3NyY2RlbXV4LmgiCisjaW5jbHVkZSAiZ3N0cnRwZHRtZm11eC5oIgorI2luY2x1ZGUgImdzdHJ0cG11eC5oIgorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cGJpbiIsIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX1JUUF9CSU4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBqaXR0ZXJidWZmZXIiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX1JUUF9KSVRURVJfQlVGRkVSKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwcHRkZW11eCIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfUlRQX1BUX0RFTVVYKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwc2Vzc2lvbiIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfUlRQX1NFU1NJT04pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfcnR4X3F1ZXVlX3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9ydHBfcnR4X3JlY2VpdmVfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9ydHhfc2VuZF9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwc3NyY2RlbXV4IiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9SVFBfU1NSQ19ERU1VWCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9tdXhfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3J0cF9kdG1mX211eF9wbHVnaW5faW5pdCAocGx1Z2luKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBydHBtYW5hZ2VyLAorICAgICJSVFAgc2Vzc2lvbiBtYW5hZ2VtZW50IHBsdWdpbiBsaWJyYXJ5IiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cG11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NmU1NzAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBtdXguYwpAQCAtMCwwICsxLDEwMDkgQEAKKy8qIFJUUCBtdXhlciBlbGVtZW50IGZvciBHU3RyZWFtZXIKKyAqCisgKiBnc3RydHBtdXguYzoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3LTIwMTA+IE5va2lhIENvcnBvcmF0aW9uLgorICogICBDb250YWN0OiBaZWVzaGFuIEFsaSA8emVlc2hhbi5hbGlAbm9raWEuY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAwNy0yMDEwPiBDb2xsYWJvcmEgTHRkCisgKiAgIENvbnRhY3Q6IE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgMjAwMCwyMDA1IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwbXV4CisgKiBAc2VlX2Fsc286IHJ0cGR0bWZtdXgKKyAqCisgKiBUaGUgcnRwIG11eGVyIHRha2VzIG11bHRpcGxlIFJUUCBzdHJlYW1zIGhhdmluZyB0aGUgc2FtZSBjbG9jay1yYXRlIGFuZAorICogbXV4ZXMgaW50byBhIHNpbmdsZSBzdHJlYW0gd2l0aCBhIHNpbmdsZSBTU1JDLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgcnRwbXV4IG5hbWU9bXV4ICEgdWRwc2luayBob3N0PTEyNy4wLjAuMSBwb3J0PTg4ODggICAgICAgIFwKKyAqICAgICAgICAgICAgICBhbHNhc3JjICEgYWxhd2VuYyAhIHJ0cHBjbWFwYXkgISAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgICAgICAgICAgICBhcHBsaWNhdGlvbi94LXJ0cCwgcGF5bG9hZD04LCByYXRlPTgwMDAgISBtdXguc2lua18wICAgIFwKKyAqICAgICAgICAgICAgICBhdWRpb3Rlc3RzcmMgaXMtbGl2ZT0xICEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgICAgICAgICAgICBtdWxhd2VuYyAhIHJ0cHBjbXVwYXkgISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgICAgICAgICAgICBhcHBsaWNhdGlvbi94LXJ0cCwgcGF5bG9hZD0wLCByYXRlPTgwMDAgISBtdXguc2lua18xCisgKiBdfAorICogSW4gdGhpcyBleGFtcGxlLCBhbiBhdWRpbyBzdHJlYW0gaXMgY2FwdHVyZWQgZnJvbSBBTFNBIGFuZCBhbm90aGVyIGlzCisgKiBnZW5lcmF0ZWQsIGJvdGggYXJlIGVuY29kZWQgaW50byBkaWZmZXJlbnQgcGF5bG9hZCB0eXBlcyBhbmQgbXV4ZWQgdG9nZXRoZXIKKyAqIHNvIHRoZXkgY2FuIGJlIHNlbnQgb24gdGhlIHNhbWUgcG9ydC4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RydHBtdXguaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF9tdXhfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3J0cF9tdXhfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfVElNRVNUQU1QX09GRlNFVCwKKyAgUFJPUF9TRVFOVU1fT0ZGU0VULAorICBQUk9QX1NFUU5VTSwKKyAgUFJPUF9TU1JDCit9OworCisjZGVmaW5lIERFRkFVTFRfVElNRVNUQU1QX09GRlNFVCAtMQorI2RlZmluZSBERUZBVUxUX1NFUU5VTV9PRkZTRVQgICAgLTEKKyNkZWZpbmUgREVGQVVMVF9TU1JDICAgICAgICAgICAgIC0xCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2lua18ldSIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIpCisgICAgKTsKKworc3RhdGljIEdzdFBhZCAqZ3N0X3J0cF9tdXhfcmVxdWVzdF9uZXdfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIG5hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfbXV4X3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfbXV4X2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9tdXhfY2hhaW5fbGlzdCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyTGlzdCAqIGJ1ZmZlcmxpc3QpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfbXV4X3NldGNhcHMgKEdzdFBhZCAqIHBhZCwgR3N0UlRQTXV4ICogcnRwX211eCwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tdXhfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9tdXhfc2lua19xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UXVlcnkgKiBxdWVyeSk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX211eF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKgorICAgIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX211eF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX211eF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX211eF9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfbXV4X3NyY19ldmVudF9yZWFsIChHc3RSVFBNdXggKiBydHBfbXV4LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitHX0RFRklORV9UWVBFIChHc3RSVFBNdXgsIGdzdF9ydHBfbXV4LCBHU1RfVFlQRV9FTEVNRU5UKTsKKworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tdXhfY2xhc3NfaW5pdCAoR3N0UlRQTXV4Q2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua19mYWN0b3J5KTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiUlRQIG11eGVyIiwKKyAgICAgICJDb2RlYy9NdXhlciIsCisgICAgICAibXVsdGlwbGV4IE4gcnRwIHN0cmVhbXMgaW50byBvbmUiLCAiWmVlc2hhbiBBbGkgPGZpcnN0Lmxhc3RAbm9raWEuY29tPiIpOworCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9ydHBfbXV4X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9tdXhfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X3J0cF9tdXhfZGlzcG9zZTsKKworICBrbGFzcy0+c3JjX2V2ZW50ID0gZ3N0X3J0cF9tdXhfc3JjX2V2ZW50X3JlYWw7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwKKyAgICAgIFBST1BfVElNRVNUQU1QX09GRlNFVCwgZ19wYXJhbV9zcGVjX2ludCAoInRpbWVzdGFtcC1vZmZzZXQiLAorICAgICAgICAgICJUaW1lc3RhbXAgT2Zmc2V0IiwKKyAgICAgICAgICAiT2Zmc2V0IHRvIGFkZCB0byBhbGwgb3V0Z29pbmcgdGltZXN0YW1wcyAoLTEgPSByYW5kb20pIiwgLTEsCisgICAgICAgICAgR19NQVhJTlQsIERFRkFVTFRfVElNRVNUQU1QX09GRlNFVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9TRVFOVU1fT0ZGU0VULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInNlcW51bS1vZmZzZXQiLCAiU2VxdWVuY2UgbnVtYmVyIE9mZnNldCIsCisgICAgICAgICAgIk9mZnNldCB0byBhZGQgdG8gYWxsIG91dGdvaW5nIHNlcW51bSAoLTEgPSByYW5kb20pIiwgLTEsIEdfTUFYSU5ULAorICAgICAgICAgIERFRkFVTFRfU0VRTlVNX09GRlNFVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfU0VRTlVNLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJzZXFudW0iLCAiU2VxdWVuY2UgbnVtYmVyIiwKKyAgICAgICAgICAiVGhlIFJUUCBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3QgcHJvY2Vzc2VkIHBhY2tldCIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCAwLCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1NTUkMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInNzcmMiLCAiU1NSQyIsCisgICAgICAgICAgIlRoZSBTU1JDIG9mIHRoZSBwYWNrZXRzIChkZWZhdWx0ID09IHJhbmRvbSkiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVCwgREVGQVVMVF9TU1JDLAorICAgICAgICAgIEdTVF9QQVJBTV9NVVRBQkxFX1BMQVlJTkcgfCBHX1BBUkFNX1JFQURXUklURSB8CisgICAgICAgICAgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPnJlcXVlc3RfbmV3X3BhZCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9tdXhfcmVxdWVzdF9uZXdfcGFkKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVsZWFzZV9wYWQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9tdXhfcmVsZWFzZV9wYWQpOworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9tdXhfY2hhbmdlX3N0YXRlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXV4X2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJUUE11eCAqcnRwX211eCA9IEdTVF9SVFBfTVVYIChvYmplY3QpOworICBHTGlzdCAqaXRlbTsKKworICBnX2NsZWFyX29iamVjdCAoJnJ0cF9tdXgtPmxhc3RfcGFkKTsKKworcmVzdGFydDoKKyAgZm9yIChpdGVtID0gR1NUX0VMRU1FTlRfUEFEUyAob2JqZWN0KTsgaXRlbTsgaXRlbSA9IGdfbGlzdF9uZXh0IChpdGVtKSkgeworICAgIEdzdFBhZCAqcGFkID0gR1NUX1BBRCAoaXRlbS0+ZGF0YSk7CisgICAgaWYgKEdTVF9QQURfSVNfU0lOSyAocGFkKSkgeworICAgICAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAoR1NUX0VMRU1FTlQgKG9iamVjdCksIHBhZCk7CisgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgfQorICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF9ydHBfbXV4X3BhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tdXhfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UlRQTXV4ICpydHBfbXV4ID0gR1NUX1JUUF9NVVggKHBhcmVudCk7CisgIEdzdFJUUE11eENsYXNzICprbGFzczsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIGtsYXNzID0gR1NUX1JUUF9NVVhfR0VUX0NMQVNTIChydHBfbXV4KTsKKworICByZXQgPSBrbGFzcy0+c3JjX2V2ZW50IChydHBfbXV4LCBldmVudCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX211eF9zcmNfZXZlbnRfcmVhbCAoR3N0UlRQTXV4ICogcnRwX211eCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNOgorICAgIHsKKyAgICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCk7CisKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiR3N0UlRQQ29sbGlzaW9uIikpIHsKKyAgICAgICAgZ3VpbnQgc3NyYyA9IDA7CisKKyAgICAgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF91aW50IChzLCAic3NyYyIsICZzc3JjKSkKKyAgICAgICAgICBzc3JjID0gLTE7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwX211eCwgImNvbGxpZGVkIHNzcmM6ICUiIEdfR1VJTlQzMl9GT1JNQVQsIHNzcmMpOworCisgICAgICAgIC8qIGNob29zZSBhbm90aGVyIHNzcmMgZm9yIG91ciBzdHJlYW0gKi8KKyAgICAgICAgR1NUX09CSkVDVF9MT0NLIChydHBfbXV4KTsKKyAgICAgICAgaWYgKHNzcmMgPT0gcnRwX211eC0+Y3VycmVudF9zc3JjKSB7CisgICAgICAgICAgR3N0Q2FwcyAqY2FwczsKKyAgICAgICAgICBndWludCBzdWdnZXN0ZWRfc3NyYyA9IDA7CisgICAgICAgICAgZ3VpbnQzMiBuZXdfc3NyYzsKKworICAgICAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF91aW50IChzLCAic3VnZ2VzdGVkLXNzcmMiLCAmc3VnZ2VzdGVkX3NzcmMpKQorICAgICAgICAgICAgcnRwX211eC0+Y3VycmVudF9zc3JjID0gc3VnZ2VzdGVkX3NzcmM7CisKKyAgICAgICAgICB3aGlsZSAoc3NyYyA9PSBydHBfbXV4LT5jdXJyZW50X3NzcmMpCisgICAgICAgICAgICBydHBfbXV4LT5jdXJyZW50X3NzcmMgPSBnX3JhbmRvbV9pbnQgKCk7CisKKyAgICAgICAgICBuZXdfc3NyYyA9IHJ0cF9tdXgtPmN1cnJlbnRfc3NyYzsKKyAgICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwX211eCk7CisKKyAgICAgICAgICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChydHBfbXV4LT5zcmNwYWQpOworICAgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKyAgICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAic3NyYyIsIEdfVFlQRV9VSU5ULCBuZXdfc3NyYywgTlVMTCk7CisgICAgICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAocnRwX211eC0+c3JjcGFkLCBjYXBzKTsKKyAgICAgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0cF9tdXgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKworICByZXR1cm4gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChydHBfbXV4LT5zcmNwYWQsIEdTVF9PQkpFQ1QgKHJ0cF9tdXgpLCBldmVudCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX211eF9pbml0IChHc3RSVFBNdXggKiBydHBfbXV4KQoreworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChydHBfbXV4KTsKKworICBydHBfbXV4LT5zcmNwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAoZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsCisgICAgICAgICAgInNyYyIpLCAic3JjIik7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChydHBfbXV4LT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9tdXhfc3JjX2V2ZW50KSk7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKHJ0cF9tdXgtPnNyY3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChydHBfbXV4KSwgcnRwX211eC0+c3JjcGFkKTsKKworICBydHBfbXV4LT5zc3JjID0gREVGQVVMVF9TU1JDOworICBydHBfbXV4LT5jdXJyZW50X3NzcmMgPSBERUZBVUxUX1NTUkM7CisgIHJ0cF9tdXgtPnNzcmNfcmFuZG9tID0gVFJVRTsKKyAgcnRwX211eC0+dHNfb2Zmc2V0ID0gREVGQVVMVF9USU1FU1RBTVBfT0ZGU0VUOworICBydHBfbXV4LT5zZXFudW1fb2Zmc2V0ID0gREVGQVVMVF9TRVFOVU1fT0ZGU0VUOworCisgIHJ0cF9tdXgtPmxhc3Rfc3RvcCA9IEdTVF9DTE9DS19USU1FX05PTkU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX211eF9zZXR1cF9zaW5rcGFkIChHc3RSVFBNdXggKiBydHBfbXV4LCBHc3RQYWQgKiBzaW5rcGFkKQoreworICBHc3RSVFBNdXhQYWRQcml2YXRlICpwYWRwcml2ID0gZ19zbGljZV9uZXcwIChHc3RSVFBNdXhQYWRQcml2YXRlKTsKKworICAvKiBzZXR1cCBzb21lIHBhZCBmdW5jdGlvbnMgKi8KKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHNpbmtwYWQsIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX211eF9jaGFpbikpOworICBnc3RfcGFkX3NldF9jaGFpbl9saXN0X2Z1bmN0aW9uIChzaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfbXV4X2NoYWluX2xpc3QpKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9tdXhfc2lua19ldmVudCkpOworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAoc2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX211eF9zaW5rX3F1ZXJ5KSk7CisKKworICBnc3Rfc2VnbWVudF9pbml0ICgmcGFkcHJpdi0+c2VnbWVudCwgR1NUX0ZPUk1BVF9VTkRFRklORUQpOworCisgIGdzdF9wYWRfc2V0X2VsZW1lbnRfcHJpdmF0ZSAoc2lua3BhZCwgcGFkcHJpdik7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzaW5rcGFkLCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHJ0cF9tdXgpLCBzaW5rcGFkKTsKK30KKworc3RhdGljIEdzdFBhZCAqCitnc3RfcnRwX211eF9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogcmVxX25hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSVFBNdXggKnJ0cF9tdXg7CisgIEdzdFBhZCAqbmV3cGFkOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICh0ZW1wbCAhPSBOVUxMLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19SVFBfTVVYIChlbGVtZW50KSwgTlVMTCk7CisKKyAgcnRwX211eCA9IEdTVF9SVFBfTVVYIChlbGVtZW50KTsKKworICBpZiAodGVtcGwtPmRpcmVjdGlvbiAhPSBHU1RfUEFEX1NJTkspIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cF9tdXgsICJyZXF1ZXN0IHBhZCB0aGF0IGlzIG5vdCBhIFNJTksgcGFkIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBuZXdwYWQgPSBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlICh0ZW1wbCwgcmVxX25hbWUpOworICBpZiAobmV3cGFkKQorICAgIGdzdF9ydHBfbXV4X3NldHVwX3NpbmtwYWQgKHJ0cF9tdXgsIG5ld3BhZCk7CisgIGVsc2UKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0cF9tdXgsICJmYWlsZWQgdG8gY3JlYXRlIHJlcXVlc3QgcGFkIik7CisKKyAgcmV0dXJuIG5ld3BhZDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXV4X3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKQoreworICBHc3RSVFBNdXhQYWRQcml2YXRlICpwYWRwcml2OworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZWxlbWVudCk7CisgIHBhZHByaXYgPSBnc3RfcGFkX2dldF9lbGVtZW50X3ByaXZhdGUgKHBhZCk7CisgIGdzdF9wYWRfc2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkLCBOVUxMKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGVsZW1lbnQpOworCisgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKGVsZW1lbnQsIHBhZCk7CisKKyAgaWYgKHBhZHByaXYpIHsKKyAgICBnX3NsaWNlX2ZyZWUgKEdzdFJUUE11eFBhZFByaXZhdGUsIHBhZHByaXYpOworICB9Cit9CisKKy8qIFB1dCBvdXIgb3duIHRpbWVzdGFtcC1vZmZzZXQgb24gdGhlIGJ1ZmZlciAqLworc3RhdGljIHZvaWQKK2dzdF9ydHBfbXV4X3JlYWRqdXN0X3J0cF90aW1lc3RhbXBfbG9ja2VkIChHc3RSVFBNdXggKiBydHBfbXV4LAorICAgIEdzdFJUUE11eFBhZFByaXZhdGUgKiBwYWRwcml2LCBHc3RSVFBCdWZmZXIgKiBydHBidWZmZXIpCit7CisgIGd1aW50MzIgdHM7CisgIGd1aW50MzIgc2lua190c19iYXNlID0gMDsKKworICBpZiAocGFkcHJpdiAmJiBwYWRwcml2LT5oYXZlX3RpbWVzdGFtcF9vZmZzZXQpCisgICAgc2lua190c19iYXNlID0gcGFkcHJpdi0+dGltZXN0YW1wX29mZnNldDsKKworICB0cyA9IGdzdF9ydHBfYnVmZmVyX2dldF90aW1lc3RhbXAgKHJ0cGJ1ZmZlcikgLSBzaW5rX3RzX2Jhc2UgKworICAgICAgcnRwX211eC0+dHNfYmFzZTsKKyAgR1NUX0xPR19PQkpFQ1QgKHJ0cF9tdXgsICJSZS1hZGp1c3RpbmcgUlRQIHRzICV1IHRvICV1IiwKKyAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF90aW1lc3RhbXAgKHJ0cGJ1ZmZlciksIHRzKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3RpbWVzdGFtcCAocnRwYnVmZmVyLCB0cyk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcHJvY2Vzc19idWZmZXJfbG9ja2VkIChHc3RSVFBNdXggKiBydHBfbXV4LCBHc3RSVFBNdXhQYWRQcml2YXRlICogcGFkcHJpdiwKKyAgICBHc3RSVFBCdWZmZXIgKiBydHBidWZmZXIpCit7CisgIEdzdFJUUE11eENsYXNzICprbGFzcyA9IEdTVF9SVFBfTVVYX0dFVF9DTEFTUyAocnRwX211eCk7CisKKyAgaWYgKGtsYXNzLT5hY2NlcHRfYnVmZmVyX2xvY2tlZCkKKyAgICBpZiAoIWtsYXNzLT5hY2NlcHRfYnVmZmVyX2xvY2tlZCAocnRwX211eCwgcGFkcHJpdiwgcnRwYnVmZmVyKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICBydHBfbXV4LT5zZXFudW0rKzsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3NlcSAocnRwYnVmZmVyLCBydHBfbXV4LT5zZXFudW0pOworCisgIGdzdF9ydHBfYnVmZmVyX3NldF9zc3JjIChydHBidWZmZXIsIHJ0cF9tdXgtPmN1cnJlbnRfc3NyYyk7CisgIGdzdF9ydHBfbXV4X3JlYWRqdXN0X3J0cF90aW1lc3RhbXBfbG9ja2VkIChydHBfbXV4LCBwYWRwcml2LCBydHBidWZmZXIpOworICBHU1RfTE9HX09CSkVDVCAocnRwX211eCwKKyAgICAgICJQdXNoaW5nIHBhY2tldCBzaXplICUiIEdfR1NJWkVfRk9STUFUICIsIHNlcT0lZCwgdHM9JXUiLAorICAgICAgcnRwYnVmZmVyLT5tYXBbMF0uc2l6ZSwgcnRwX211eC0+c2VxbnVtLAorICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X3RpbWVzdGFtcCAocnRwYnVmZmVyKSk7CisKKyAgaWYgKHBhZHByaXYpIHsKKyAgICBpZiAocGFkcHJpdi0+c2VnbWVudC5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICBHU1RfQlVGRkVSX1BUUyAocnRwYnVmZmVyLT5idWZmZXIpID0KKyAgICAgICAgICBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZwYWRwcml2LT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgR1NUX0JVRkZFUl9QVFMgKHJ0cGJ1ZmZlci0+YnVmZmVyKSk7CisgICAgICBHU1RfQlVGRkVSX0RUUyAocnRwYnVmZmVyLT5idWZmZXIpID0KKyAgICAgICAgICBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZwYWRwcml2LT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgR1NUX0JVRkZFUl9EVFMgKHJ0cGJ1ZmZlci0+YnVmZmVyKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0cnVjdCBCdWZmZXJMaXN0RGF0YQoreworICBHc3RSVFBNdXggKnJ0cF9tdXg7CisgIEdzdFJUUE11eFBhZFByaXZhdGUgKnBhZHByaXY7CisgIGdib29sZWFuIGRyb3A7Cit9OworCitzdGF0aWMgZ2Jvb2xlYW4KK3Byb2Nlc3NfbGlzdF9pdGVtIChHc3RCdWZmZXIgKiogYnVmZmVyLCBndWludCBpZHgsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgc3RydWN0IEJ1ZmZlckxpc3REYXRhICpiZCA9IHVzZXJfZGF0YTsKKyAgR3N0UlRQQnVmZmVyIHJ0cGJ1ZmZlciA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisKKyAgKmJ1ZmZlciA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoKmJ1ZmZlcik7CisKKyAgZ3N0X3J0cF9idWZmZXJfbWFwICgqYnVmZmVyLCBHU1RfTUFQX1JFQURXUklURSwgJnJ0cGJ1ZmZlcik7CisKKyAgYmQtPmRyb3AgPSAhcHJvY2Vzc19idWZmZXJfbG9ja2VkIChiZC0+cnRwX211eCwgYmQtPnBhZHByaXYsICZydHBidWZmZXIpOworCisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwYnVmZmVyKTsKKworICBpZiAoYmQtPmRyb3ApCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChHU1RfQlVGRkVSX0RVUkFUSU9OX0lTX1ZBTElEICgqYnVmZmVyKSAmJgorICAgICAgR1NUX0JVRkZFUl9QVFNfSVNfVkFMSUQgKCpidWZmZXIpKQorICAgIGJkLT5ydHBfbXV4LT5sYXN0X3N0b3AgPSBHU1RfQlVGRkVSX1BUUyAoKmJ1ZmZlcikgKworICAgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OICgqYnVmZmVyKTsKKyAgZWxzZQorICAgIGJkLT5ydHBfbXV4LT5sYXN0X3N0b3AgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4gcmVzZW5kX2V2ZW50cyAoR3N0UGFkICogcGFkLCBHc3RFdmVudCAqKiBldmVudCwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9tdXhfY2hhaW5fbGlzdCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyTGlzdCAqIGJ1ZmZlcmxpc3QpCit7CisgIEdzdFJUUE11eCAqcnRwX211eDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdFJUUE11eFBhZFByaXZhdGUgKnBhZHByaXY7CisgIGdib29sZWFuIGNoYW5nZWQgPSBGQUxTRTsKKyAgc3RydWN0IEJ1ZmZlckxpc3REYXRhIGJkOworCisgIHJ0cF9tdXggPSBHU1RfUlRQX01VWCAocGFyZW50KTsKKworICBpZiAoZ3N0X3BhZF9jaGVja19yZWNvbmZpZ3VyZSAocnRwX211eC0+c3JjcGFkKSkgeworICAgIEdzdENhcHMgKmN1cnJlbnRfY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFkKTsKKworICAgIGlmICghZ3N0X3J0cF9tdXhfc2V0Y2FwcyAocGFkLCBydHBfbXV4LCBjdXJyZW50X2NhcHMpKSB7CisgICAgICBnc3RfcGFkX21hcmtfcmVjb25maWd1cmUgKHJ0cF9tdXgtPnNyY3BhZCk7CisgICAgICBpZiAoR1NUX1BBRF9JU19GTFVTSElORyAocnRwX211eC0+c3JjcGFkKSkKKyAgICAgICAgcmV0ID0gR1NUX0ZMT1dfRkxVU0hJTkc7CisgICAgICBlbHNlCisgICAgICAgIHJldCA9IEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICAgICAgZ3N0X2J1ZmZlcl9saXN0X3VucmVmIChidWZmZXJsaXN0KTsKKyAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBnc3RfY2Fwc191bnJlZiAoY3VycmVudF9jYXBzKTsKKyAgfQorCisgIEdTVF9PQkpFQ1RfTE9DSyAocnRwX211eCk7CisKKyAgcGFkcHJpdiA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKyAgaWYgKCFwYWRwcml2KSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0cF9tdXgpOworICAgIHJldCA9IEdTVF9GTE9XX05PVF9MSU5LRUQ7CisgICAgZ3N0X2J1ZmZlcl9saXN0X3VucmVmIChidWZmZXJsaXN0KTsKKyAgICBnb3RvIG91dDsKKyAgfQorCisgIGJkLnJ0cF9tdXggPSBydHBfbXV4OworICBiZC5wYWRwcml2ID0gcGFkcHJpdjsKKyAgYmQuZHJvcCA9IEZBTFNFOworCisgIGJ1ZmZlcmxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbWFrZV93cml0YWJsZSAoYnVmZmVybGlzdCk7CisgIGdzdF9idWZmZXJfbGlzdF9mb3JlYWNoIChidWZmZXJsaXN0LCBwcm9jZXNzX2xpc3RfaXRlbSwgJmJkKTsKKworICBpZiAoIWJkLmRyb3AgJiYgcGFkICE9IHJ0cF9tdXgtPmxhc3RfcGFkKSB7CisgICAgY2hhbmdlZCA9IFRSVUU7CisgICAgZ19jbGVhcl9vYmplY3QgKCZydHBfbXV4LT5sYXN0X3BhZCk7CisgICAgcnRwX211eC0+bGFzdF9wYWQgPSBnX29iamVjdF9yZWYgKHBhZCk7CisgIH0KKworICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwX211eCk7CisKKyAgaWYgKGNoYW5nZWQpCisgICAgZ3N0X3BhZF9zdGlja3lfZXZlbnRzX2ZvcmVhY2ggKHBhZCwgcmVzZW5kX2V2ZW50cywgcnRwX211eCk7CisKKyAgaWYgKGJkLmRyb3ApIHsKKyAgICBnc3RfYnVmZmVyX2xpc3RfdW5yZWYgKGJ1ZmZlcmxpc3QpOworICAgIHJldCA9IEdTVF9GTE9XX09LOworICB9IGVsc2UgeworICAgIHJldCA9IGdzdF9wYWRfcHVzaF9saXN0IChydHBfbXV4LT5zcmNwYWQsIGJ1ZmZlcmxpc3QpOworICB9CisKK291dDoKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3Jlc2VuZF9ldmVudHMgKEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0UlRQTXV4ICpydHBfbXV4ID0gdXNlcl9kYXRhOworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoKmV2ZW50KSA9PSBHU1RfRVZFTlRfQ0FQUykgeworICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICBnc3RfZXZlbnRfcGFyc2VfY2FwcyAoKmV2ZW50LCAmY2Fwcyk7CisgICAgZ3N0X3J0cF9tdXhfc2V0Y2FwcyAocGFkLCBydHBfbXV4LCBjYXBzKTsKKyAgfSBlbHNlIGlmIChHU1RfRVZFTlRfVFlQRSAoKmV2ZW50KSA9PSBHU1RfRVZFTlRfU0VHTUVOVCkgeworICAgIEdzdFNlZ21lbnQgbmV3X3NlZ21lbnQ7CisgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJm5ld19zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocnRwX211eC0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZuZXdfc2VnbWVudCkpOworICB9IGVsc2UgeworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocnRwX211eC0+c3JjcGFkLCBnc3RfZXZlbnRfcmVmICgqZXZlbnQpKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9tdXhfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJUUE11eCAqcnRwX211eDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdFJUUE11eFBhZFByaXZhdGUgKnBhZHByaXY7CisgIGdib29sZWFuIGRyb3A7CisgIGdib29sZWFuIGNoYW5nZWQgPSBGQUxTRTsKKyAgR3N0UlRQQnVmZmVyIHJ0cGJ1ZmZlciA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisKKyAgcnRwX211eCA9IEdTVF9SVFBfTVVYIChwYXJlbnQpOworCisgIGlmIChnc3RfcGFkX2NoZWNrX3JlY29uZmlndXJlIChydHBfbXV4LT5zcmNwYWQpKSB7CisgICAgR3N0Q2FwcyAqY3VycmVudF9jYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChwYWQpOworCisgICAgaWYgKCFnc3RfcnRwX211eF9zZXRjYXBzIChwYWQsIHJ0cF9tdXgsIGN1cnJlbnRfY2FwcykpIHsKKyAgICAgIGdzdF9wYWRfbWFya19yZWNvbmZpZ3VyZSAocnRwX211eC0+c3JjcGFkKTsKKyAgICAgIGlmIChHU1RfUEFEX0lTX0ZMVVNISU5HIChydHBfbXV4LT5zcmNwYWQpKQorICAgICAgICByZXQgPSBHU1RfRkxPV19GTFVTSElORzsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0ID0gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIGdzdF9jYXBzX3VucmVmIChjdXJyZW50X2NhcHMpOworICB9CisKKyAgR1NUX09CSkVDVF9MT0NLIChydHBfbXV4KTsKKyAgcGFkcHJpdiA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKworICBpZiAoIXBhZHByaXYpIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwX211eCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfTk9UX0xJTktFRDsKKyAgfQorCisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoYnVmZmVyKTsKKworICBpZiAoIWdzdF9ydHBfYnVmZmVyX21hcCAoYnVmZmVyLCBHU1RfTUFQX1JFQURXUklURSwgJnJ0cGJ1ZmZlcikpIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwX211eCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChydHBfbXV4LCAiSW52YWxpZCBSVFAgYnVmZmVyIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgZHJvcCA9ICFwcm9jZXNzX2J1ZmZlcl9sb2NrZWQgKHJ0cF9tdXgsIHBhZHByaXYsICZydHBidWZmZXIpOworCisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwYnVmZmVyKTsKKworICBpZiAoIWRyb3ApIHsKKyAgICBpZiAocGFkICE9IHJ0cF9tdXgtPmxhc3RfcGFkKSB7CisgICAgICBjaGFuZ2VkID0gVFJVRTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmcnRwX211eC0+bGFzdF9wYWQpOworICAgICAgcnRwX211eC0+bGFzdF9wYWQgPSBnX29iamVjdF9yZWYgKHBhZCk7CisgICAgfQorCisgICAgaWYgKEdTVF9CVUZGRVJfRFVSQVRJT05fSVNfVkFMSUQgKGJ1ZmZlcikgJiYKKyAgICAgICAgR1NUX0JVRkZFUl9QVFNfSVNfVkFMSUQgKGJ1ZmZlcikpCisgICAgICBydHBfbXV4LT5sYXN0X3N0b3AgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKSArCisgICAgICAgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKTsKKyAgICBlbHNlCisgICAgICBydHBfbXV4LT5sYXN0X3N0b3AgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0cF9tdXgpOworCisgIGlmIChjaGFuZ2VkKQorICAgIGdzdF9wYWRfc3RpY2t5X2V2ZW50c19mb3JlYWNoIChwYWQsIHJlc2VuZF9ldmVudHMsIHJ0cF9tdXgpOworCisgIGlmIChkcm9wKSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgfSBlbHNlIHsKKyAgICByZXQgPSBnc3RfcGFkX3B1c2ggKHJ0cF9tdXgtPnNyY3BhZCwgYnVmZmVyKTsKKyAgfQorCitvdXQ6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9tdXhfc2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RSVFBNdXggKiBydHBfbXV4LCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworICBHc3RSVFBNdXhQYWRQcml2YXRlICpwYWRwcml2OworICBHc3RDYXBzICpwZWVyY2FwczsKKworICBpZiAoIWdzdF9jYXBzX2lzX2ZpeGVkIChjYXBzKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcGVlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAocnRwX211eC0+c3JjcGFkLCBOVUxMKTsKKyAgaWYgKHBlZXJjYXBzKSB7CisgICAgR3N0Q2FwcyAqdGNhcHMsICpvdGhlcmNhcHM7OworICAgIHRjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisgICAgb3RoZXJjYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKHBlZXJjYXBzLCB0Y2FwcywKKyAgICAgICAgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKworICAgIGlmIChnc3RfY2Fwc19nZXRfc2l6ZSAob3RoZXJjYXBzKSA+IDApIHsKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKG90aGVyY2FwcywgMCk7CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHJ0cF9tdXgpOworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKHN0cnVjdHVyZSwgInNzcmMiLCAmcnRwX211eC0+Y3VycmVudF9zc3JjKSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJVc2UgZG93bnN0cmVhbSBzc3JjOiAleCIsCisgICAgICAgICAgICBydHBfbXV4LT5jdXJyZW50X3NzcmMpOworICAgICAgICBydHBfbXV4LT5oYXZlX3NzcmMgPSBUUlVFOworICAgICAgfQorICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0cF9tdXgpOworICAgIH0KKworICAgIGdzdF9jYXBzX3VucmVmIChvdGhlcmNhcHMpOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGNhcHMpOworICB9CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgaWYgKCFzdHJ1Y3R1cmUpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9PQkpFQ1RfTE9DSyAocnRwX211eCk7CisgIHBhZHByaXYgPSBnc3RfcGFkX2dldF9lbGVtZW50X3ByaXZhdGUgKHBhZCk7CisgIGlmIChwYWRwcml2ICYmCisgICAgICBnc3Rfc3RydWN0dXJlX2dldF91aW50IChzdHJ1Y3R1cmUsICJ0aW1lc3RhbXAtb2Zmc2V0IiwKKyAgICAgICAgICAmcGFkcHJpdi0+dGltZXN0YW1wX29mZnNldCkpIHsKKyAgICBwYWRwcml2LT5oYXZlX3RpbWVzdGFtcF9vZmZzZXQgPSBUUlVFOworICB9CisKKyAgY2FwcyA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworCisgIC8qIGlmIHdlIGRvbid0IGhhdmUgYSBzcGVjaWZpZWQgc3NyYywgZmlyc3QgdHJ5IHRvIHRha2Ugb25lIGZyb20gdGhlIGNhcHMsCisgICAgIGFuZCBpZiB0aGF0IGZhaWxzLCBnZW5lcmF0ZSBvbmUgKi8KKyAgaWYgKCFydHBfbXV4LT5oYXZlX3NzcmMpIHsKKyAgICBpZiAocnRwX211eC0+c3NyY19yYW5kb20pIHsKKyAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAoc3RydWN0dXJlLCAic3NyYyIsICZydHBfbXV4LT5jdXJyZW50X3NzcmMpKQorICAgICAgICBydHBfbXV4LT5jdXJyZW50X3NzcmMgPSBnX3JhbmRvbV9pbnQgKCk7CisgICAgICBydHBfbXV4LT5oYXZlX3NzcmMgPSBUUlVFOworICAgIH0KKyAgfQorCisgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsCisgICAgICAidGltZXN0YW1wLW9mZnNldCIsIEdfVFlQRV9VSU5ULCBydHBfbXV4LT50c19iYXNlLAorICAgICAgInNlcW51bS1vZmZzZXQiLCBHX1RZUEVfVUlOVCwgcnRwX211eC0+c2VxbnVtX2Jhc2UsCisgICAgICAic3NyYyIsIEdfVFlQRV9VSU5ULCBydHBfbXV4LT5jdXJyZW50X3NzcmMsIE5VTEwpOworCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHBfbXV4KTsKKworICBpZiAocnRwX211eC0+c2VuZF9zdHJlYW1fc3RhcnQpIHsKKyAgICBnY2hhciBzX2lkWzMyXTsKKworICAgIC8qIHN0cmVhbS1zdGFydCAoRklYTUU6IGNyZWF0ZSBpZCBiYXNlZCBvbiBpbnB1dCBpZHMpICovCisgICAgZ19zbnByaW50ZiAoc19pZCwgc2l6ZW9mIChzX2lkKSwgImludGVybGVhdmUtJTA4eCIsIGdfcmFuZG9tX2ludCAoKSk7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChydHBfbXV4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0IChzX2lkKSk7CisKKyAgICBydHBfbXV4LT5zZW5kX3N0cmVhbV9zdGFydCA9IEZBTFNFOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwX211eCwKKyAgICAgICJzZXR0aW5nIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQgIiBvbiBzcmMgcGFkLi4iLCBjYXBzKTsKKyAgcmV0ID0gZ3N0X3BhZF9zZXRfY2FwcyAocnRwX211eC0+c3JjcGFkLCBjYXBzKTsKKworCisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorY2xlYXJfY2FwcyAoR3N0Q2FwcyAqIGNhcHMsIGdib29sZWFuIG9ubHlfY2xvY2tfcmF0ZSkKK3sKKyAgZ2ludCBpLCBqOworCisgIC8qIExldHMgb25seSBtYXRjaCBvbiB0aGUgY2xvY2stcmF0ZSAqLworICBmb3IgKGkgPSAwOyBpIDwgZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKworICAgIGZvciAoaiA9IDA7IGogPCBnc3Rfc3RydWN0dXJlX25fZmllbGRzIChzKTsgaisrKSB7CisgICAgICBjb25zdCBnY2hhciAqbmFtZSA9IGdzdF9zdHJ1Y3R1cmVfbnRoX2ZpZWxkX25hbWUgKHMsIGopOworCisgICAgICBpZiAoc3RyY21wIChuYW1lLCAiY2xvY2stcmF0ZSIpICYmIChvbmx5X2Nsb2NrX3JhdGUgfHwKKyAgICAgICAgICAgICAgKHN0cmNtcCAobmFtZSwgInNzcmMiKSkpKSB7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCBuYW1lKTsKKyAgICAgICAgai0tOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3NhbWVfY2xvY2tfcmF0ZV9mb2xkIChjb25zdCBHVmFsdWUgKiBpdGVtLCBHVmFsdWUgKiByZXQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0UGFkICpteXBhZCA9IHVzZXJfZGF0YTsKKyAgR3N0UGFkICpwYWQgPSBnX3ZhbHVlX2dldF9vYmplY3QgKGl0ZW0pOworICBHc3RDYXBzICpwZWVyY2FwczsKKyAgR3N0Q2FwcyAqYWNjdW1jYXBzOworCisgIGlmIChwYWQgPT0gbXlwYWQpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgYWNjdW1jYXBzID0gZ192YWx1ZV9nZXRfYm94ZWQgKHJldCk7CisgIHBlZXJjYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKHBhZCwgYWNjdW1jYXBzKTsKKyAgaWYgKCFwZWVyY2FwcykgeworICAgIGdfd2FybmluZyAoIm5vIHBlZXJjYXBzIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcGVlcmNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChwZWVyY2Fwcyk7CisgIGNsZWFyX2NhcHMgKHBlZXJjYXBzLCBUUlVFKTsKKworICBnX3ZhbHVlX3Rha2VfYm94ZWQgKHJldCwgcGVlcmNhcHMpOworCisgIHJldHVybiAhZ3N0X2NhcHNfaXNfZW1wdHkgKHBlZXJjYXBzKTsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3J0cF9tdXhfZ2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RSVFBNdXggKiBtdXgsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworICBHc3RJdGVyYXRvciAqaXRlciA9IE5VTEw7CisgIEdWYWx1ZSB2ID0geyAwIH07CisgIEdzdEl0ZXJhdG9yUmVzdWx0IHJlczsKKyAgR3N0Q2FwcyAqcGVlcmNhcHM7CisgIEdzdENhcHMgKm90aGVyY2FwczsKKyAgR3N0Q2FwcyAqdGNhcHM7CisKKyAgcGVlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAobXV4LT5zcmNwYWQsIE5VTEwpOworCisgIGlmIChwZWVyY2FwcykgeworICAgIHRjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisgICAgb3RoZXJjYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKHBlZXJjYXBzLCB0Y2FwcywKKyAgICAgICAgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcmNhcHMpOworICB9IGVsc2UgeworICAgIHRjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKG11eC0+c3JjcGFkKTsKKyAgICBpZiAoZmlsdGVyKQorICAgICAgb3RoZXJjYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgdGNhcHMsCisgICAgICAgICAgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBlbHNlCisgICAgICBvdGhlcmNhcHMgPSBnc3RfY2Fwc19jb3B5ICh0Y2Fwcyk7CisgIH0KKyAgZ3N0X2NhcHNfdW5yZWYgKHRjYXBzKTsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiSW50ZXJzZWN0ZWQgc3JjcGFkLXBlZXJjYXBzIGFuZCB0ZW1wbGF0ZSBjYXBzOiAlIgorICAgICAgR1NUX1BUUl9GT1JNQVQsIG90aGVyY2Fwcyk7CisKKyAgY2xlYXJfY2FwcyAob3RoZXJjYXBzLCBUUlVFKTsKKworICBnX3ZhbHVlX2luaXQgKCZ2LCBHU1RfVFlQRV9DQVBTKTsKKworICBpdGVyID0gZ3N0X2VsZW1lbnRfaXRlcmF0ZV9zaW5rX3BhZHMgKEdTVF9FTEVNRU5UIChtdXgpKTsKKyAgZG8geworICAgIGdzdF92YWx1ZV9zZXRfY2FwcyAoJnYsIG90aGVyY2Fwcyk7CisgICAgcmVzID0gZ3N0X2l0ZXJhdG9yX2ZvbGQgKGl0ZXIsIHNhbWVfY2xvY2tfcmF0ZV9mb2xkLCAmdiwgcGFkKTsKKyAgICBnc3RfaXRlcmF0b3JfcmVzeW5jIChpdGVyKTsKKyAgfSB3aGlsZSAocmVzID09IEdTVF9JVEVSQVRPUl9SRVNZTkMpOworICBnc3RfaXRlcmF0b3JfZnJlZSAoaXRlcik7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdCAoKEdzdENhcHMgKikgZ3N0X3ZhbHVlX2dldF9jYXBzICgmdiksIG90aGVyY2Fwcyk7CisKKyAgZ192YWx1ZV91bnNldCAoJnYpOworICBnc3RfY2Fwc191bnJlZiAob3RoZXJjYXBzKTsKKworICBpZiAocmVzID09IEdTVF9JVEVSQVRPUl9FUlJPUikgeworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworICB9CisKKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX211eF9zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0UlRQTXV4ICptdXggPSBHU1RfUlRQX01VWCAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpmaWx0ZXIsICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZmaWx0ZXIpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIlJlY2VpdmVkIGNhcHMtcXVlcnkgd2l0aCBmaWx0ZXItY2FwczogJSIKKyAgICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgZmlsdGVyKTsKKyAgICAgIGNhcHMgPSBnc3RfcnRwX211eF9nZXRjYXBzIChwYWQsIG11eCwgZmlsdGVyKTsKKyAgICAgIGdzdF9xdWVyeV9zZXRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCBjYXBzKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChtdXgsICJBbnN3ZXJpbmcgY2Fwcy1xdWVyeSB3aXRoIGNhcHM6ICUiCisgICAgICAgICAgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9tdXhfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJUUE11eCAqcnRwX211eDsKKworICBydHBfbXV4ID0gR1NUX1JUUF9NVVggKG9iamVjdCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChydHBfbXV4KTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1RJTUVTVEFNUF9PRkZTRVQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBydHBfbXV4LT50c19vZmZzZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NFUU5VTV9PRkZTRVQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBydHBfbXV4LT5zZXFudW1fb2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TRVFOVU06CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnRwX211eC0+c2VxbnVtKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TU1JDOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0cF9tdXgtPnNzcmMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwX211eCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX211eF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UlRQTXV4ICpydHBfbXV4OworCisgIHJ0cF9tdXggPSBHU1RfUlRQX01VWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfVElNRVNUQU1QX09GRlNFVDoKKyAgICAgIHJ0cF9tdXgtPnRzX29mZnNldCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NFUU5VTV9PRkZTRVQ6CisgICAgICBydHBfbXV4LT5zZXFudW1fb2Zmc2V0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1NSQzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocnRwX211eCk7CisgICAgICBydHBfbXV4LT5zc3JjID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgcnRwX211eC0+Y3VycmVudF9zc3JjID0gcnRwX211eC0+c3NyYzsKKyAgICAgIHJ0cF9tdXgtPmhhdmVfc3NyYyA9IFRSVUU7CisgICAgICBydHBfbXV4LT5zc3JjX3JhbmRvbSA9IEZBTFNFOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0cF9tdXgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfbXV4X3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSVFBNdXggKm11eCA9IEdTVF9SVFBfTVVYIChwYXJlbnQpOworICBnYm9vbGVhbiBpc19wYWQ7CisgIGdib29sZWFuIHJldDsKKworICBHU1RfT0JKRUNUX0xPQ0sgKG11eCk7CisgIGlzX3BhZCA9IChwYWQgPT0gbXV4LT5sYXN0X3BhZCk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChtdXgpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICBHU1RfTE9HX09CSkVDVCAocGFkLCAiUmVjZWl2ZWQgY2Fwcy1ldmVudCB3aXRoIGNhcHM6ICUiCisgICAgICAgICAgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworICAgICAgcmV0ID0gZ3N0X3J0cF9tdXhfc2V0Y2FwcyAocGFkLCBtdXgsIGNhcHMpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgIHsKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAobXV4KTsKKyAgICAgIG11eC0+bGFzdF9zdG9wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChtdXgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgeworICAgICAgR3N0UlRQTXV4UGFkUHJpdmF0ZSAqcGFkcHJpdjsKKworICAgICAgR1NUX09CSkVDVF9MT0NLIChtdXgpOworICAgICAgcGFkcHJpdiA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKworICAgICAgaWYgKHBhZHByaXYpIHsKKyAgICAgICAgZ3N0X2V2ZW50X2NvcHlfc2VnbWVudCAoZXZlbnQsICZwYWRwcml2LT5zZWdtZW50KTsKKyAgICAgIH0KKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChtdXgpOworCisgICAgICBpZiAoaXNfcGFkKSB7CisgICAgICAgIEdzdFNlZ21lbnQgbmV3X3NlZ21lbnQ7CisgICAgICAgIGdzdF9zZWdtZW50X2luaXQgKCZuZXdfc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmbmV3X3NlZ21lbnQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChpc19wYWQpIHsKKyAgICByZXR1cm4gZ3N0X3BhZF9wdXNoX2V2ZW50IChtdXgtPnNyY3BhZCwgZXZlbnQpOworICB9IGVsc2UgeworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgIHJldHVybiBUUlVFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX211eF9yZWFkeV90b19wYXVzZWQgKEdzdFJUUE11eCAqIHJ0cF9tdXgpCit7CisKKyAgR1NUX09CSkVDVF9MT0NLIChydHBfbXV4KTsKKworICBnX2NsZWFyX29iamVjdCAoJnJ0cF9tdXgtPmxhc3RfcGFkKTsKKyAgcnRwX211eC0+c2VuZF9zdHJlYW1fc3RhcnQgPSBUUlVFOworCisgIGlmIChydHBfbXV4LT5zZXFudW1fb2Zmc2V0ID09IC0xKQorICAgIHJ0cF9tdXgtPnNlcW51bV9iYXNlID0gZ19yYW5kb21faW50X3JhbmdlICgwLCBHX01BWFVJTlQxNik7CisgIGVsc2UKKyAgICBydHBfbXV4LT5zZXFudW1fYmFzZSA9IHJ0cF9tdXgtPnNlcW51bV9vZmZzZXQ7CisgIHJ0cF9tdXgtPnNlcW51bSA9IHJ0cF9tdXgtPnNlcW51bV9iYXNlOworCisgIGlmIChydHBfbXV4LT50c19vZmZzZXQgPT0gLTEpCisgICAgcnRwX211eC0+dHNfYmFzZSA9IGdfcmFuZG9tX2ludCAoKTsKKyAgZWxzZQorICAgIHJ0cF9tdXgtPnRzX2Jhc2UgPSBydHBfbXV4LT50c19vZmZzZXQ7CisKKyAgcnRwX211eC0+bGFzdF9zdG9wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBpZiAocnRwX211eC0+c3NyY19yYW5kb20pIHsKKyAgICBydHBfbXV4LT5oYXZlX3NzcmMgPSBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICBydHBfbXV4LT5jdXJyZW50X3NzcmMgPSBydHBfbXV4LT5zc3JjOworICAgIHJ0cF9tdXgtPmhhdmVfc3NyYyA9IFRSVUU7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChydHBfbXV4LCAic2V0IHRpbWVzdGFtcC1vZmZzZXQgdG8gJXUiLCBydHBfbXV4LT50c19iYXNlKTsKKworICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwX211eCk7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9tdXhfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UlRQTXV4ICpydHBfbXV4OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcnRwX211eCA9IEdTVF9SVFBfTVVYIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X3J0cF9tdXhfcmVhZHlfdG9fcGF1c2VkIChydHBfbXV4KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChnc3RfcnRwX211eF9wYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsCisgICAgICB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ19jbGVhcl9vYmplY3QgKCZydHBfbXV4LT5sYXN0X3BhZCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9tdXhfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9ydHBfbXV4X2RlYnVnLCAicnRwbXV4IiwgMCwgInJ0cCBtdXhlciIpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwbXV4IiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIEdTVF9UWVBFX1JUUF9NVVgpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmggYi9nc3QvcnRwbWFuYWdlci9nc3RydHBtdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGU5ZjQxCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwbXV4LmgKQEAgLTAsMCArMSw5OCBAQAorLyogUlRQIG11eGVyIGVsZW1lbnQgZm9yIEdTdHJlYW1lcgorICoKKyAqIGdzdHJ0cG11eC5oOgorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IE5va2lhIENvcnBvcmF0aW9uLgorICogICBDb250YWN0OiBaZWVzaGFuIEFsaSA8emVlc2hhbi5hbGlAbm9raWEuY29tPgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgMjAwMCwyMDA1IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfTVVYX0hfXworI2RlZmluZSBfX0dTVF9SVFBfTVVYX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX01VWCAoZ3N0X3J0cF9tdXhfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9NVVgob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX01VWCwgR3N0UlRQTXV4KSkKKyNkZWZpbmUgR1NUX1JUUF9NVVhfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NVVgsIEdzdFJUUE11eENsYXNzKSkKKyNkZWZpbmUgR1NUX1JUUF9NVVhfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9SVFBfTVVYLCBHc3RSVFBNdXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfTVVYKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9NVVgpKQorI2RlZmluZSBHU1RfSVNfUlRQX01VWF9DTEFTUyhvYmopIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9NVVgpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFJUUE11eCBHc3RSVFBNdXg7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQTXV4Q2xhc3MgR3N0UlRQTXV4Q2xhc3M7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ2Jvb2xlYW4gaGF2ZV90aW1lc3RhbXBfb2Zmc2V0OworICBndWludCB0aW1lc3RhbXBfb2Zmc2V0OworCisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBnYm9vbGVhbiBwcmlvcml0eTsKK30gR3N0UlRQTXV4UGFkUHJpdmF0ZTsKKworCisvKioKKyAqIEdzdFJUUE11eDoKKyAqCisgKiBUaGUgb3BhcXVlICNHc3RSVFBNdXggc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdFJUUE11eAoreworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgLyogcGFkICovCisgIEdzdFBhZCAqc3JjcGFkOworCisgIGd1aW50MzIgdHNfYmFzZTsKKyAgZ3VpbnQxNiBzZXFudW1fYmFzZTsKKworICBnaW50MzIgdHNfb2Zmc2V0OworICBnaW50MTYgc2VxbnVtX29mZnNldDsKKyAgZ3VpbnQxNiBzZXFudW07ICAgICAgICAgICAgICAgLyogcHJvdGVjdGVkIGJ5IG9iamVjdCBsb2NrICovCisgIGd1aW50IHNzcmM7CisgIGd1aW50IGN1cnJlbnRfc3NyYzsKKyAgZ2Jvb2xlYW4gaGF2ZV9zc3JjOworICBnYm9vbGVhbiBzc3JjX3JhbmRvbTsKKworICBHc3RQYWQgKmxhc3RfcGFkOyAvKiBwcm90ZWN0ZWQgYnkgb2JqZWN0IGxvY2sgKi8KKworICBHc3RDbG9ja1RpbWUgbGFzdF9zdG9wOworICBnYm9vbGVhbiBzZW5kX3N0cmVhbV9zdGFydDsKK307CisKK3N0cnVjdCBfR3N0UlRQTXV4Q2xhc3MKK3sKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudF9jbGFzczsKKworICBnYm9vbGVhbiAoKmFjY2VwdF9idWZmZXJfbG9ja2VkKSAoR3N0UlRQTXV4ICpydHBfbXV4LAorICAgICAgR3N0UlRQTXV4UGFkUHJpdmF0ZSAqIHBhZHByaXYsIEdzdFJUUEJ1ZmZlciAqIGJ1ZmZlcik7CisKKyAgZ2Jvb2xlYW4gKCpzcmNfZXZlbnQpIChHc3RSVFBNdXggKnJ0cF9tdXgsIEdzdEV2ZW50ICpldmVudCk7Cit9OworCisKK0dUeXBlIGdzdF9ydHBfbXV4X2dldF90eXBlICh2b2lkKTsKK2dib29sZWFuIGdzdF9ydHBfbXV4X3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1JUUF9NVVhfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmMgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAyMGE0NAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHB0ZGVtdXguYwpAQCAtMCwwICsxLDY0NiBAQAorLyogCisgKiBSVFAgRGVtdXggZWxlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqIEBhdXRob3IgS2FpIFZlaG1hbmVuIDxrYWkudmVobWFuZW5Abm9raWEuY29tPgorICoKKyAqIExvb3NlbHkgYmFzZWQgb24gR1N0cmVhbWVyIGdzdGRlY29kZWJpbgorICogQ29weXJpZ2h0IChDKSA8MjAwND4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHBwdGRlbXV4CisgKgorICogcnRwcHRkZW11eCBhY3RzIGFzIGEgZGVtdXhlciBmb3IgUlRQIHBhY2tldHMgYmFzZWQgb24gdGhlIHBheWxvYWQgdHlwZSBvZgorICogdGhlIHBhY2tldHMuIEl0cyBtYWluIHB1cnBvc2UgaXMgdG8gYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gZWFzaWx5IHJlY2VpdmUKKyAqIGFuZCBkZWNvZGUgYW4gUlRQIHN0cmVhbSB3aXRoIG11bHRpcGxlIHBheWxvYWQgdHlwZXMuCisgKiAKKyAqIEZvciBlYWNoIHBheWxvYWQgdHlwZSB0aGF0IGlzIGRldGVjdGVkLCBhIG5ldyBwYWQgd2lsbCBiZSBjcmVhdGVkIGFuZCB0aGUKKyAqICNHc3RSdHBQdERlbXV4OjpuZXctcGF5bG9hZC10eXBlIHNpZ25hbCB3aWxsIGJlIGVtaXR0ZWQuIFdoZW4gdGhlIHBheWxvYWQgZm9yCisgKiB0aGUgUlRQIHN0cmVhbSBjaGFuZ2VzLCB0aGUgI0dzdFJ0cFB0RGVtdXg6OnBheWxvYWQtdHlwZS1jaGFuZ2Ugc2lnbmFsIHdpbGwgYmUKKyAqIGVtaXR0ZWQuCisgKiAKKyAqIFRoZSBlbGVtZW50IHdpbGwgdHJ5IHRvIHNldCBjb21wbGV0ZSBhbmQgdW5pcXVlIGFwcGxpY2F0aW9uL3gtcnRwIGNhcHMKKyAqIG9uIHRoZSBvdXRwdXQgcGFkcyBiYXNlZCBvbiB0aGUgcmVzdWx0IG9mIHRoZSAjR3N0UnRwUHREZW11eDo6cmVxdWVzdC1wdC1tYXAKKyAqIHNpZ25hbC4KKyAqIAorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB1ZHBzcmMgY2Fwcz0iYXBwbGljYXRpb24veC1ydHAiICEgcnRwcHRkZW11eCAhIGZha2VzaW5rCisgKiBdfCBUYWtlcyBhbiBSVFAgc3RyZWFtIGFuZCBzZW5kIHRoZSBSVFAgcGFja2V0cyB3aXRoIHRoZSBmaXJzdCBkZXRlY3RlZAorICogcGF5bG9hZCB0eXBlIHRvIGZha2VzaW5rLCBkaXNjYXJkaW5nIHRoZSBvdGhlciBwYXlsb2FkIHR5cGVzLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisvKgorICogQ29udHJpYnV0b3JzOgorICogQW5kcmUgTW9yZWlyYSBNYWdhbGhhZXMgPGFuZHJlLm1hZ2FsaGFlc0BpbmR0Lm9yZy5icj4KKyAqLworLyoKKyAqIFN0YXR1czoKKyAqICAtIHdvcmtzIHdpdGggdGhlIHRlc3RfcnRwZGVtdXguYyB0b29sCisgKgorICogQ2hlY2s6CisgKiAgLSBpcyBlbWl0dGluZyBhIHNpZ25hbCBlbm91Z2gsIG9yIHNob3VsZCB3ZQorICogICAgdXNlIEdzdEV2ZW50IHRvIG5vdGlmeSBkb3duc3RyZWFtIGVsZW1lbnRzCisgKiAgICBvZiB0aGUgbmV3IHBhY2tldC4uLiBubz8KKyAqCisgKiBOb3RlczoKKyAqICAtIGVtaXRzIGV2ZW50IGJvdGggZm9yIG5ldyBQVHMsIGFuZCB3aGVuZXZlcgorICogICAgYSBQVCBpcyBjaGFuZ2VkCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKyNpbmNsdWRlICJnc3RydHBwdGRlbXV4LmgiCisKKy8qIGdlbmVyaWMgdGVtcGxhdGVzICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcnRwX3B0X2RlbXV4X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBydHBfcHRfZGVtdXhfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjXyV1IiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIiAicGF5bG9hZCA9IChpbnQpIFsgMCwgMjU1IF0iKQorICAgICk7CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9ydHBfcHRfZGVtdXhfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3J0cF9wdF9kZW11eF9kZWJ1ZworCisvKgorICogSXRlbSBmb3Igc3RvcmluZyBHc3RQYWQ8LT5wdCBwYWlycy4KKyAqLworc3RydWN0IF9Hc3RSdHBQdERlbXV4UGFkCit7CisgIEdzdFBhZCAqcGFkOyAgICAgICAgLyoqPCBwb2ludGVyIHRvIHRoZSBhY3R1YWwgcGFkICovCisgIGdpbnQgcHQ7ICAgICAgICAgICAgIC8qKjwgUlRQIHBheWxvYWQtdHlwZSBhdHRhY2hlZCB0byBwYWQgKi8KKyAgZ2Jvb2xlYW4gbmV3Y2FwczsKK307CisKKy8qIHNpZ25hbHMgKi8KK2VudW0KK3sKKyAgU0lHTkFMX1JFUVVFU1RfUFRfTUFQLAorICBTSUdOQUxfTkVXX1BBWUxPQURfVFlQRSwKKyAgU0lHTkFMX1BBWUxPQURfVFlQRV9DSEFOR0UsCisgIFNJR05BTF9DTEVBUl9QVF9NQVAsCisgIExBU1RfU0lHTkFMCit9OworCisjZGVmaW5lIGdzdF9ydHBfcHRfZGVtdXhfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwUHREZW11eCwgZ3N0X3J0cF9wdF9kZW11eCwgR1NUX1RZUEVfRUxFTUVOVCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfcHRfZGVtdXhfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX3B0X2RlbXV4X3JlbGVhc2UgKEdzdFJ0cFB0RGVtdXggKiBwdGRlbXV4KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3B0X2RlbXV4X3NldHVwIChHc3RSdHBQdERlbXV4ICogcHRkZW11eCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3B0X2RlbXV4X3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9wdF9kZW11eF9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX3B0X2RlbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgdm9pZCBnc3RfcnRwX3B0X2RlbXV4X2NsZWFyX3B0X21hcCAoR3N0UnRwUHREZW11eCAqIHJ0cGRlbXV4KTsKKworc3RhdGljIEdzdFBhZCAqZmluZF9wYWRfZm9yX3B0IChHc3RSdHBQdERlbXV4ICogcnRwZGVtdXgsIGd1aW50OCBwdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3B0X2RlbXV4X3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CisKKworc3RhdGljIGd1aW50IGdzdF9ydHBfcHRfZGVtdXhfc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsKKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcHRfZGVtdXhfY2xhc3NfaW5pdCAoR3N0UnRwUHREZW11eENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9rbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2tsYXNzOworCisgIGdvYmplY3Rfa2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2tsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICAvKioKKyAgICogR3N0UnRwUHREZW11eDo6cmVxdWVzdC1wdC1tYXA6CisgICAqIEBkZW11eDogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBwdDogdGhlIHBheWxvYWQgdHlwZQorICAgKgorICAgKiBSZXF1ZXN0IHRoZSBwYXlsb2FkIHR5cGUgYXMgI0dzdENhcHMgZm9yIEBwdC4KKyAgICovCisgIGdzdF9ydHBfcHRfZGVtdXhfc2lnbmFsc1tTSUdOQUxfUkVRVUVTVF9QVF9NQVBdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoInJlcXVlc3QtcHQtbWFwIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFB0RGVtdXhDbGFzcywgcmVxdWVzdF9wdF9tYXApLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdTVF9UWVBFX0NBUFMsIDEsIEdfVFlQRV9VSU5UKTsKKworICAvKioKKyAgICogR3N0UnRwUHREZW11eDo6bmV3LXBheWxvYWQtdHlwZToKKyAgICogQGRlbXV4OiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHB0OiB0aGUgcGF5bG9hZCB0eXBlCisgICAqIEBwYWQ6IHRoZSBwYWQgd2l0aCB0aGUgbmV3IHBheWxvYWQKKyAgICoKKyAgICogRW1pdGVkIHdoZW4gYSBuZXcgcGF5bG9hZCB0eXBlIHBhZCBoYXMgYmVlbiBjcmVhdGVkIGluIEBkZW11eC4KKyAgICovCisgIGdzdF9ydHBfcHRfZGVtdXhfc2lnbmFsc1tTSUdOQUxfTkVXX1BBWUxPQURfVFlQRV0gPQorICAgICAgZ19zaWduYWxfbmV3ICgibmV3LXBheWxvYWQtdHlwZSIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBQdERlbXV4Q2xhc3MsIG5ld19wYXlsb2FkX3R5cGUpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdTVF9UWVBFX1BBRCk7CisKKyAgLyoqCisgICAqIEdzdFJ0cFB0RGVtdXg6OnBheWxvYWQtdHlwZS1jaGFuZ2U6CisgICAqIEBkZW11eDogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBwdDogdGhlIG5ldyBwYXlsb2FkIHR5cGUKKyAgICoKKyAgICogRW1pdGVkIHdoZW4gdGhlIHBheWxvYWQgdHlwZSBjaGFuZ2VkLgorICAgKi8KKyAgZ3N0X3J0cF9wdF9kZW11eF9zaWduYWxzW1NJR05BTF9QQVlMT0FEX1RZUEVfQ0hBTkdFXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJwYXlsb2FkLXR5cGUtY2hhbmdlIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFB0RGVtdXhDbGFzcywKKyAgICAgICAgICBwYXlsb2FkX3R5cGVfY2hhbmdlKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1VJTlQsCisgICAgICBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX1VJTlQpOworCisgIC8qKgorICAgKiBHc3RSdHBQdERlbXV4OjpjbGVhci1wdC1tYXA6CisgICAqIEBkZW11eDogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqCisgICAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gY2FsbCB0aGlzIHNpZ25hbCB0byBpbnN0cnVjdCB0aGUgZWxlbWVudCB0byBkaXNjYXJkIHRoZQorICAgKiBjdXJyZW50bHkgY2FjaGVkIHBheWxvYWQgdHlwZSBtYXAuCisgICAqLworICBnc3RfcnRwX3B0X2RlbXV4X3NpZ25hbHNbU0lHTkFMX0NMRUFSX1BUX01BUF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgiY2xlYXItcHQtbWFwIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX0FDVElPTiB8IEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFB0RGVtdXhDbGFzcywKKyAgICAgICAgICBjbGVhcl9wdF9tYXApLCBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fVk9JRCwKKyAgICAgIEdfVFlQRV9OT05FLCAwLCBHX1RZUEVfTk9ORSk7CisKKyAgZ29iamVjdF9rbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX3B0X2RlbXV4X2ZpbmFsaXplOworCisgIGdzdGVsZW1lbnRfa2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9wdF9kZW11eF9jaGFuZ2Vfc3RhdGUpOworCisgIGtsYXNzLT5jbGVhcl9wdF9tYXAgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9wdF9kZW11eF9jbGVhcl9wdF9tYXApOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2tsYXNzLAorICAgICAgJnJ0cF9wdF9kZW11eF9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfa2xhc3MsCisgICAgICAmcnRwX3B0X2RlbXV4X3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9rbGFzcywgIlJUUCBEZW11eCIsCisgICAgICAiRGVtdXgvTmV0d29yay9SVFAiLAorICAgICAgIlBhcnNlcyBjb2RlYyBzdHJlYW1zIHRyYW5zbWl0dGVkIGluIHRoZSBzYW1lIFJUUCBzZXNzaW9uIiwKKyAgICAgICJLYWkgVmVobWFuZW4gPGthaS52ZWhtYW5lbkBub2tpYS5jb20+Iik7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9ydHBfcHRfZGVtdXhfZGVidWcsCisgICAgICAicnRwcHRkZW11eCIsIDAsICJSVFAgY29kZWMgZGVtdXhlciIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9wdF9kZW11eF9pbml0IChHc3RSdHBQdERlbXV4ICogcHRkZW11eCkKK3sKKyAgR3N0RWxlbWVudENsYXNzICprbGFzcyA9IEdTVF9FTEVNRU5UX0dFVF9DTEFTUyAocHRkZW11eCk7CisKKyAgcHRkZW11eC0+c2luayA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywKKyAgICAgICAgICAic2luayIpLCAic2luayIpOworICBnX2Fzc2VydCAocHRkZW11eC0+c2luayAhPSBOVUxMKTsKKworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAocHRkZW11eC0+c2luaywgZ3N0X3J0cF9wdF9kZW11eF9jaGFpbik7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChwdGRlbXV4LT5zaW5rLCBnc3RfcnRwX3B0X2RlbXV4X3NpbmtfZXZlbnQpOworCisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChwdGRlbXV4KSwgcHRkZW11eC0+c2luayk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3B0X2RlbXV4X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBnc3RfcnRwX3B0X2RlbXV4X3JlbGVhc2UgKEdTVF9SVFBfUFRfREVNVVggKG9iamVjdCkpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3J0cF9wdF9kZW11eF9nZXRfY2FwcyAoR3N0UnRwUHREZW11eCAqIHJ0cGRlbXV4LCBndWludCBwdCkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR1ZhbHVlIHJldCA9IHsgMCB9OworICBHVmFsdWUgYXJnc1syXSA9IHsgezB9LCB7MH0gfTsKKworICAvKiBmaWd1cmUgb3V0IHRoZSBjYXBzICovCisgIGdfdmFsdWVfaW5pdCAoJmFyZ3NbMF0sIEdTVF9UWVBFX0VMRU1FTlQpOworICBnX3ZhbHVlX3NldF9vYmplY3QgKCZhcmdzWzBdLCBydHBkZW11eCk7CisgIGdfdmFsdWVfaW5pdCAoJmFyZ3NbMV0sIEdfVFlQRV9VSU5UKTsKKyAgZ192YWx1ZV9zZXRfdWludCAoJmFyZ3NbMV0sIHB0KTsKKworICBnX3ZhbHVlX2luaXQgKCZyZXQsIEdTVF9UWVBFX0NBUFMpOworICBnX3ZhbHVlX3NldF9ib3hlZCAoJnJldCwgTlVMTCk7CisKKyAgZ19zaWduYWxfZW1pdHYgKGFyZ3MsIGdzdF9ydHBfcHRfZGVtdXhfc2lnbmFsc1tTSUdOQUxfUkVRVUVTVF9QVF9NQVBdLCAwLAorICAgICAgJnJldCk7CisKKyAgZ192YWx1ZV91bnNldCAoJmFyZ3NbMF0pOworICBnX3ZhbHVlX3Vuc2V0ICgmYXJnc1sxXSk7CisgIGNhcHMgPSBnX3ZhbHVlX2R1cF9ib3hlZCAoJnJldCk7CisgIGdfdmFsdWVfdW5zZXQgKCZyZXQpOworICBpZiAoY2FwcyA9PSBOVUxMKSB7CisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocnRwZGVtdXgtPnNpbmspOworICB9CisKKyAgR1NUX0RFQlVHICgicHQgJWQsIGdvdCBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBwdCwgY2Fwcyk7CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3B0X2RlbXV4X2NsZWFyX3B0X21hcCAoR3N0UnRwUHREZW11eCAqIHJ0cGRlbXV4KQoreworICBHU0xpc3QgKndhbGs7CisKKyAgR1NUX09CSkVDVF9MT0NLIChydHBkZW11eCk7CisgIEdTVF9ERUJVRyAoImNsZWFyaW5nIHB0IG1hcCIpOworICBmb3IgKHdhbGsgPSBydHBkZW11eC0+c3JjcGFkczsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RSdHBQdERlbXV4UGFkICpwYWQgPSB3YWxrLT5kYXRhOworCisgICAgcGFkLT5uZXdjYXBzID0gVFJVRTsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwZGVtdXgpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK25lZWRfY2Fwc19mb3JfcHQgKEdzdFJ0cFB0RGVtdXggKiBydHBkZW11eCwgZ3VpbnQ4IHB0KQoreworICBHU0xpc3QgKndhbGs7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIEdTVF9PQkpFQ1RfTE9DSyAocnRwZGVtdXgpOworICBmb3IgKHdhbGsgPSBydHBkZW11eC0+c3JjcGFkczsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RSdHBQdERlbXV4UGFkICpwYWQgPSB3YWxrLT5kYXRhOworCisgICAgaWYgKHBhZC0+cHQgPT0gcHQpIHsKKyAgICAgIHJldCA9IHBhZC0+bmV3Y2FwczsKKyAgICB9CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0cGRlbXV4KTsKKworICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkCitjbGVhcl9uZXdjYXBzX2Zvcl9wdCAoR3N0UnRwUHREZW11eCAqIHJ0cGRlbXV4LCBndWludDggcHQpCit7CisgIEdTTGlzdCAqd2FsazsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHJ0cGRlbXV4KTsKKyAgZm9yICh3YWxrID0gcnRwZGVtdXgtPnNyY3BhZHM7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UnRwUHREZW11eFBhZCAqcGFkID0gd2Fsay0+ZGF0YTsKKworICAgIGlmIChwYWQtPnB0ID09IHB0KSB7CisgICAgICBwYWQtPm5ld2NhcHMgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwZGVtdXgpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2ZvcndhcmRfc3RpY2t5X2V2ZW50cyAoR3N0UGFkICogcGFkLCBHc3RFdmVudCAqKiBldmVudCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RQYWQgKnNyY3BhZCA9IEdTVF9QQURfQ0FTVCAodXNlcl9kYXRhKTsKKworICAvKiBTdHJlYW0gc3RhcnQgYW5kIGNhcHMgaGF2ZSBhbHJlYWR5IGJlZW4gcHVzaGVkICovCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoKmV2ZW50KSA+PSBHU1RfRVZFTlRfU0VHTUVOVCkKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwgZ3N0X2V2ZW50X3JlZiAoKmV2ZW50KSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3B0X2RlbXV4X2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RSdHBQdERlbXV4ICpydHBkZW11eDsKKyAgZ3VpbnQ4IHB0OworICBHc3RQYWQgKnNyY3BhZDsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0UlRQQnVmZmVyIHJ0cCA9IHsgTlVMTCB9OworCisgIHJ0cGRlbXV4ID0gR1NUX1JUUF9QVF9ERU1VWCAocGFyZW50KTsKKworICBpZiAoIWdzdF9ydHBfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQUQsICZydHApKQorICAgIGdvdG8gaW52YWxpZF9idWZmZXI7CisKKyAgcHQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF90eXBlICgmcnRwKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGRlbXV4LCAicmVjZWl2ZWQgYnVmZmVyIGZvciBwdCAlZCIsIHB0KTsKKworICBzcmNwYWQgPSBmaW5kX3BhZF9mb3JfcHQgKHJ0cGRlbXV4LCBwdCk7CisgIGlmIChzcmNwYWQgPT0gTlVMTCkgeworICAgIC8qIG5ldyBQVCwgY3JlYXRlIGEgc3JjIHBhZCAqLworICAgIEdzdFJ0cFB0RGVtdXhQYWQgKnJ0cGRlbXV4cGFkOworICAgIEdzdEVsZW1lbnRDbGFzcyAqa2xhc3M7CisgICAgR3N0UGFkVGVtcGxhdGUgKnRlbXBsOworICAgIGdjaGFyICpwYWRuYW1lOworCisgICAgY2FwcyA9IGdzdF9ydHBfcHRfZGVtdXhfZ2V0X2NhcHMgKHJ0cGRlbXV4LCBwdCk7CisgICAgaWYgKCFjYXBzKQorICAgICAgZ290byBub19jYXBzOworCisgICAga2xhc3MgPSBHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKHJ0cGRlbXV4KTsKKyAgICB0ZW1wbCA9IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLCAic3JjXyV1Iik7CisgICAgcGFkbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNyY18ldSIsIHB0KTsKKyAgICBzcmNwYWQgPSBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlICh0ZW1wbCwgcGFkbmFtZSk7CisgICAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoc3JjcGFkKTsKKyAgICBnX2ZyZWUgKHBhZG5hbWUpOworICAgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChzcmNwYWQsIGdzdF9ydHBfcHRfZGVtdXhfc3JjX2V2ZW50KTsKKworICAgIEdTVF9ERUJVRyAoIkFkZGluZyBwdD0lZCB0byB0aGUgbGlzdC4iLCBwdCk7CisgICAgcnRwZGVtdXhwYWQgPSBnX3NsaWNlX25ldzAgKEdzdFJ0cFB0RGVtdXhQYWQpOworICAgIHJ0cGRlbXV4cGFkLT5wdCA9IHB0OworICAgIHJ0cGRlbXV4cGFkLT5uZXdjYXBzID0gRkFMU0U7CisgICAgcnRwZGVtdXhwYWQtPnBhZCA9IHNyY3BhZDsKKyAgICBnc3Rfb2JqZWN0X3JlZiAoc3JjcGFkKTsKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKHJ0cGRlbXV4KTsKKyAgICBydHBkZW11eC0+c3JjcGFkcyA9IGdfc2xpc3RfYXBwZW5kIChydHBkZW11eC0+c3JjcGFkcywgcnRwZGVtdXhwYWQpOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHBkZW11eCk7CisKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKHNyY3BhZCwgVFJVRSk7CisKKworICAgIC8qIEZpcnN0IHB1c2ggdGhlIHN0cmVhbS1zdGFydCBldmVudCwgaXQgbXVzdCBhbHdheXMgY29tZSBmaXJzdCAqLworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjcGFkLAorICAgICAgICBnc3RfcGFkX2dldF9zdGlja3lfZXZlbnQgKHJ0cGRlbXV4LT5zaW5rLCBHU1RfRVZFTlRfU1RSRUFNX1NUQVJULCAwKSk7CisKKyAgICAvKiBUaGVuIGNhcHMgZXZlbnQgaXMgc2VudCAqLworICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKyAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAicGF5bG9hZCIsIEdfVFlQRV9JTlQsIHB0LCBOVUxMKTsKKyAgICBnc3RfcGFkX3NldF9jYXBzIChzcmNwYWQsIGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgIC8qIEZpcnN0IHN0aWNreSBldmVudHMgb24gc2luayBwYWQgYXJlIGZvcndhcmRlZCB0byB0aGUgbmV3IHNyYyBwYWQgKi8KKyAgICBnc3RfcGFkX3N0aWNreV9ldmVudHNfZm9yZWFjaCAocnRwZGVtdXgtPnNpbmssIGZvcndhcmRfc3RpY2t5X2V2ZW50cywKKyAgICAgICAgc3JjcGFkKTsKKworICAgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cGRlbXV4KSwgc3JjcGFkKTsKKworICAgIEdTVF9ERUJVRyAoImVtaXR0aW5nIG5ldy1wYXlsb2FkLXR5cGUgZm9yIHB0ICVkIiwgcHQpOworICAgIGdfc2lnbmFsX2VtaXQgKEdfT0JKRUNUIChydHBkZW11eCksCisgICAgICAgIGdzdF9ydHBfcHRfZGVtdXhfc2lnbmFsc1tTSUdOQUxfTkVXX1BBWUxPQURfVFlQRV0sIDAsIHB0LCBzcmNwYWQpOworICB9CisKKyAgaWYgKHB0ICE9IHJ0cGRlbXV4LT5sYXN0X3B0KSB7CisgICAgZ2ludCBlbWl0X3B0ID0gcHQ7CisKKyAgICAvKiBvdXIgb3duIHNpZ25hbCB3aXRoIGFuIGV4dHJhIGZsYWcgdGhhdCB0aGlzIGlzIHRoZSBvbmx5IHBhZCAqLworICAgIHJ0cGRlbXV4LT5sYXN0X3B0ID0gcHQ7CisgICAgR1NUX0RFQlVHICgiZW1pdHRpbmcgcGF5bG9hZC10eXBlLWNoYW5nZWQgZm9yIHB0ICVkIiwgZW1pdF9wdCk7CisgICAgZ19zaWduYWxfZW1pdCAoR19PQkpFQ1QgKHJ0cGRlbXV4KSwKKyAgICAgICAgZ3N0X3J0cF9wdF9kZW11eF9zaWduYWxzW1NJR05BTF9QQVlMT0FEX1RZUEVfQ0hBTkdFXSwgMCwgZW1pdF9wdCk7CisgIH0KKworICB3aGlsZSAobmVlZF9jYXBzX2Zvcl9wdCAocnRwZGVtdXgsIHB0KSkgeworICAgIEdTVF9ERUJVRyAoIm5lZWQgbmV3IGNhcHMgZm9yICVkIiwgcHQpOworICAgIGNhcHMgPSBnc3RfcnRwX3B0X2RlbXV4X2dldF9jYXBzIChydHBkZW11eCwgcHQpOworICAgIGlmICghY2FwcykKKyAgICAgIGdvdG8gbm9fY2FwczsKKworICAgIGNsZWFyX25ld2NhcHNfZm9yX3B0IChydHBkZW11eCwgcHQpOworCisgICAgY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGNhcHMpOworICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJwYXlsb2FkIiwgR19UWVBFX0lOVCwgcHQsIE5VTEwpOworICAgIGdzdF9wYWRfc2V0X2NhcHMgKHNyY3BhZCwgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9CisKKyAgLyogcHVzaCB0byBzcmNwYWQgKi8KKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChzcmNwYWQsIGJ1Zik7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworaW52YWxpZF9idWZmZXI6CisgIHsKKyAgICAvKiB0aGlzIHNob3VsZCBub3QgYmUgZmF0YWwgKi8KKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHBkZW11eCwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAoIkRyb3BwaW5nIGludmFsaWQgUlRQIHBheWxvYWQiKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK25vX2NhcHM6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocnRwZGVtdXgsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksCisgICAgICAgICgiQ291bGQgbm90IGdldCBjYXBzIGZvciBwYXlsb2FkIikpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgaWYgKHNyY3BhZCkKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBHc3RQYWQgKgorZmluZF9wYWRfZm9yX3B0IChHc3RSdHBQdERlbXV4ICogcnRwZGVtdXgsIGd1aW50OCBwdCkKK3sKKyAgR3N0UGFkICpyZXNwYWQgPSBOVUxMOworICBHU0xpc3QgKndhbGs7CisKKyAgR1NUX09CSkVDVF9MT0NLIChydHBkZW11eCk7CisgIGZvciAod2FsayA9IHJ0cGRlbXV4LT5zcmNwYWRzOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJ0cFB0RGVtdXhQYWQgKnBhZCA9IHdhbGstPmRhdGE7CisKKyAgICBpZiAocGFkLT5wdCA9PSBwdCkgeworICAgICAgcmVzcGFkID0gZ3N0X29iamVjdF9yZWYgKHBhZC0+cGFkKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAocnRwZGVtdXgpOworCisgIHJldHVybiByZXNwYWQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9wdF9kZW11eF9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwUHREZW11eCAqcnRwZGVtdXg7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIHJ0cGRlbXV4ID0gR1NUX1JUUF9QVF9ERU1VWCAocGFyZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOgorICAgIHsKKyAgICAgIGdzdF9ydHBfcHRfZGVtdXhfY2xlYXJfcHRfbWFwIChydHBkZW11eCk7CisgICAgICAvKiBkb24ndCBmb3J3YXJkIHRoZSBldmVudCwgd2UgY2xlYXJlZCB0aGUgcHRtYXAgYW5kIG9uIHRoZSBuZXh0IGJ1ZmZlciB3ZQorICAgICAgICogd2lsbCBhZGQgdGhlIHB0IHRvIHRoZSBjYXBzIGFuZCBwdXNoIGEgbmV3IGNhcHMgZXZlbnQgKi8KKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9DVVNUT01fRE9XTlNUUkVBTToKKyAgICB7CisgICAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgICAgIHMgPSBnc3RfZXZlbnRfZ2V0X3N0cnVjdHVyZSAoZXZlbnQpOworCisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgIkdzdFJUUFBhY2tldExvc3QiKSkgeworICAgICAgICBHc3RQYWQgKnNyY3BhZCA9IGZpbmRfcGFkX2Zvcl9wdCAocnRwZGVtdXgsIHJ0cGRlbXV4LT5sYXN0X3B0KTsKKworICAgICAgICBpZiAoc3JjcGFkKSB7CisgICAgICAgICAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmNwYWQsIGV2ZW50KTsKKyAgICAgICAgICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgICB9CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlcyA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9wdF9kZW11eF9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBQdERlbXV4ICpkZW11eDsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzOworCisgIGRlbXV4ID0gR1NUX1JUUF9QVF9ERU1VWCAocGFyZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU06CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX0JPVEg6CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX0JPVEhfT09COgorICAgICAgcyA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCk7CisgICAgICBpZiAocyAmJiAhZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHMsICJwYXlsb2FkIikpIHsKKyAgICAgICAgR1NMaXN0ICp3YWxrOworCisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZGVtdXgpOworICAgICAgICBmb3IgKHdhbGsgPSBkZW11eC0+c3JjcGFkczsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICAgICAgICBHc3RSdHBQdERlbXV4UGFkICpkcGFkID0gKEdzdFJ0cFB0RGVtdXhQYWQgKikgd2Fsay0+ZGF0YTsKKworICAgICAgICAgIGlmIChkcGFkLT5wYWQgPT0gcGFkKSB7CisgICAgICAgICAgICBHc3RTdHJ1Y3R1cmUgKndzOworCisgICAgICAgICAgICBldmVudCA9CisgICAgICAgICAgICAgICAgR1NUX0VWRU5UX0NBU1QgKGdzdF9taW5pX29iamVjdF9tYWtlX3dyaXRhYmxlCisgICAgICAgICAgICAgICAgKEdTVF9NSU5JX09CSkVDVF9DQVNUIChldmVudCkpKTsKKyAgICAgICAgICAgIHdzID0gZ3N0X2V2ZW50X3dyaXRhYmxlX3N0cnVjdHVyZSAoZXZlbnQpOworICAgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHdzLCAicGF5bG9hZCIsIEdfVFlQRV9VSU5ULCBkcGFkLT5wdCwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGRlbXV4KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7Cit9CisKKy8qCisgKiBSZXNlcnZlcyByZXNvdXJjZXMgZm9yIHRoZSBvYmplY3QuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9wdF9kZW11eF9zZXR1cCAoR3N0UnRwUHREZW11eCAqIHB0ZGVtdXgpCit7CisgIHB0ZGVtdXgtPnNyY3BhZHMgPSBOVUxMOworICBwdGRlbXV4LT5sYXN0X3B0ID0gMHhGRkZGOworCisgIHJldHVybiBUUlVFOworfQorCisvKgorICogRnJlZSByZXNvdXJjZXMgZm9yIHRoZSBvYmplY3QuCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfcnRwX3B0X2RlbXV4X3JlbGVhc2UgKEdzdFJ0cFB0RGVtdXggKiBwdGRlbXV4KQoreworICBHU0xpc3QgKnRtcHBhZHM7CisgIEdTTGlzdCAqd2FsazsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHB0ZGVtdXgpOworICB0bXBwYWRzID0gcHRkZW11eC0+c3JjcGFkczsKKyAgcHRkZW11eC0+c3JjcGFkcyA9IE5VTEw7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChwdGRlbXV4KTsKKworICBmb3IgKHdhbGsgPSB0bXBwYWRzOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJ0cFB0RGVtdXhQYWQgKnBhZCA9IHdhbGstPmRhdGE7CisKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKHBhZC0+cGFkLCBGQUxTRSk7CisgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocHRkZW11eCksIHBhZC0+cGFkKTsKKyAgICBnX3NsaWNlX2ZyZWUgKEdzdFJ0cFB0RGVtdXhQYWQsIHBhZCk7CisgIH0KKyAgZ19zbGlzdF9mcmVlICh0bXBwYWRzKTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfcnRwX3B0X2RlbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0UnRwUHREZW11eCAqcHRkZW11eDsKKworICBwdGRlbXV4ID0gR1NUX1JUUF9QVF9ERU1VWCAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBpZiAoZ3N0X3J0cF9wdF9kZW11eF9zZXR1cCAocHRkZW11eCkgIT0gVFJVRSkKKyAgICAgICAgcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGdzdF9ydHBfcHRfZGVtdXhfcmVsZWFzZSAocHRkZW11eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5oIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcHRkZW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMWJiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBwdGRlbXV4LmgKQEAgLTAsMCArMSw2MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1BUX0RFTVVYX0hfXworI2RlZmluZSBfX0dTVF9SVFBfUFRfREVNVVhfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1BUX0RFTVVYICAgICAgICAgICAgKGdzdF9ydHBfcHRfZGVtdXhfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9QVF9ERU1VWChvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9QVF9ERU1VWCxHc3RSdHBQdERlbXV4KSkKKyNkZWZpbmUgR1NUX1JUUF9QVF9ERU1VWF9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX1BUX0RFTVVYLEdzdFJ0cFB0RGVtdXhDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfUFRfREVNVVgob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfUFRfREVNVVgpKQorI2RlZmluZSBHU1RfSVNfUlRQX1BUX0RFTVVYX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfUFRfREVNVVgpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwUHREZW11eCBHc3RSdHBQdERlbXV4OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFB0RGVtdXhDbGFzcyBHc3RSdHBQdERlbXV4Q2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwUHREZW11eFBhZCBHc3RSdHBQdERlbXV4UGFkOworCitzdHJ1Y3QgX0dzdFJ0cFB0RGVtdXgKK3sKKyAgR3N0RWxlbWVudCBwYXJlbnQ7ICAvKio8IHBhcmVudCBjbGFzcyAqLworCisgIEdzdFBhZCAqc2luazsgICAgICAgLyoqPCB0aGUgc2luayBwYWQgKi8KKyAgZ3VpbnQxNiBsYXN0X3B0OyAgICAvKio8IHB0IG9mIHRoZSBsYXN0IHBhY2tldCAweEZGRkYgaWYgbm9uZSAqLworICBHU0xpc3QgKnNyY3BhZHM7ICAgIC8qKjwgYSBsaW5rZWQgbGlzdCBvZiBHc3RSdHBQdERlbXV4UGFkIG9iamVjdHMgKi8KK307CisKK3N0cnVjdCBfR3N0UnRwUHREZW11eENsYXNzCit7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7CisKKyAgLyogZ2V0IHRoZSBjYXBzIGZvciBwdCAqLworICBHc3RDYXBzKiAoKnJlcXVlc3RfcHRfbWFwKSAgICAgIChHc3RSdHBQdERlbXV4ICpkZW11eCwgZ3VpbnQgcHQpOworCisgIC8qIHNpZ25hbCBlbW1pdGVkIHdoZW4gYSBuZXcgUFQgaXMgZm91bmQgZnJvbSB0aGUgaW5jb21pbmcgc3RyZWFtICovCisgIHZvaWQgICAgICgqbmV3X3BheWxvYWRfdHlwZSkgICAgKEdzdFJ0cFB0RGVtdXggKmRlbXV4LCBndWludCBwdCwgR3N0UGFkICogcGFkKTsKKworICAvKiBzaWduYWwgZW1pdHRlZCB3aGVuIHRoZSBwYXlsb2FkIHR5cGUgY2hhbmdlcyAqLworICB2b2lkICAgICAoKnBheWxvYWRfdHlwZV9jaGFuZ2UpIChHc3RSdHBQdERlbXV4ICpkZW11eCwgZ3VpbnQgcHQpOworCisgIHZvaWQgICAgICgqY2xlYXJfcHRfbWFwKSAgICAgICAgKEdzdFJ0cFB0RGVtdXggKmRlbXV4KTsKK307CisKK0dUeXBlIGdzdF9ydHBfcHRfZGVtdXhfZ2V0X3R5cGUgKHZvaWQpOworCisjZW5kaWYgLyogX19HU1RfUlRQX1BUX0RFTVVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cXVldWUuYyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHF1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBkNmNiZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHF1ZXVlLmMKQEAgLTAsMCArMSw1MjEgQEAKKy8qIFJUUCBSZXRyYW5zbWlzc2lvbiBxdWV1ZSBlbGVtZW50IGZvciBHU3RyZWFtZXIKKyAqCisgKiBnc3RydHBydHhxdWV1ZS5jOgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cHJ0eHF1ZXVlCisgKgorICogcnRwcnR4cXVldWUgbWFpbnRhaW5zIGEgcXVldWUgb2YgdHJhbnNtaXR0ZWQgUlRQIHBhY2tldHMsIHVwIHRvIGEKKyAqIGNvbmZpZ3VyYWJsZSBsaW1pdCAoc2VlICNHc3RSVFBSdHhRdWV1ZTo6bWF4LXNpemUtdGltZSwKKyAqICNHc3RSVFBSdHhRdWV1ZTo6bWF4LXNpemUtcGFja2V0cyksIGFuZCByZXRyYW5zbWl0cyB0aGVtIHVwb24gcmVxdWVzdAorICogZnJvbSB0aGUgZG93bnN0cmVhbSBydHBzZXNzaW9uIChHc3RSVFBSZXRyYW5zbWlzc2lvblJlcXVlc3QgZXZlbnQpLgorICoKKyAqIFRoaXMgZWxlbWVudCBpcyBzaW1pbGFyIHRvIHJ0cHJ0eHNlbmQsIGJ1dCBpdCBoYXMgZGlmZmVyZW5jZXM6CisgKiAtIFJldHJhbnNtaXNzaW9uIGZyb20gcnRwcnR4cXVldWUgaXMgbm90IFJGQyA0NTg4IGNvbXBsaWFudC4gVGhlCisgKiByZXRyYW5zbWl0dGVkIHBhY2tldHMgaGF2ZSB0aGUgc2FtZSBzc3JjIGFuZCBwYXlsb2FkIHR5cGUgYXMgdGhlIG9yaWdpbmFsCisgKiBzdHJlYW0uCisgKiAtIEFzIGEgc2lkZS1lZmZlY3Qgb2YgdGhlIGFib3ZlLCBydHBydHhxdWV1ZSBkb2VzIG5vdCByZXF1aXJlIHRoZSB1c2Ugb2YKKyAqIHJ0cHJ0eHJlY2VpdmUgb24gdGhlIHJlY2VpdmluZyBlbmQuIHJ0cGppdHRlcmJ1ZmZlciBhbG9uZSBpcyBhYmxlIHRvCisgKiByZWNvbnN0cnVjdCB0aGUgc3RyZWFtLgorICogLSBSZXRyYW5zbWlzc2lvbiBmcm9tIHJ0cHJ0eHF1ZXVlIGhhcHBlbnMgYXMgc29vbiBhcyB0aGUgbmV4dCByZWd1bGFyIGZsb3cKKyAqIHBhY2tldCBpcyBjaGFpbmVkLCB3aGlsZSBydHBydHhzZW5kIHJldHJhbnNtaXRzIGFzIHNvb24gYXMgdGhlIHJldHJhbnNtaXNzaW9uCisgKiBldmVudCBpcyByZWNlaXZlZCwgdXNpbmcgYSBoZWxwZXIgdGhyZWFkLgorICogLSBydHBydHhxdWV1ZSBjYW4gYmUgdXNlZCB3aXRoIHJ0cGJpbiB3aXRob3V0IHRoZSBuZWVkIG9mIGhvb2tpbmcgdG8gaXRzCisgKiAjR3N0UnRwQmluOjpyZXF1ZXN0LWF1eC1zZW5kZXIgc2lnbmFsLCB3aGljaCBtZWFucyBpdCBjYW4gYmUgdXNlZCB3aXRoCisgKiBydHBiaW4gdXNpbmcgZ3N0LWxhdW5jaC4KKyAqCisgKiBTZWUgYWxzbyAjR3N0UnRwUnR4U2VuZCwgI0dzdFJ0cFJ0eFJlY2VpdmUKKyAqCisgKiAjIEV4YW1wbGUgcGlwZWxpbmVzCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgcnRwYmluIG5hbWU9YiBydHAtcHJvZmlsZT1hdnBmIFwKKyAqICAgIGF1ZGlvdGVzdHNyYyBpcy1saXZlPXRydWUgISBvcHVzZW5jICEgcnRwb3B1c3BheSBwdD05NiAhIHJ0cHJ0eHF1ZXVlICEgYi5zZW5kX3J0cF9zaW5rXzAgXAorICogICAgYi5zZW5kX3J0cF9zcmNfMCAhIGlkZW50aXR5IGRyb3AtcHJvYmFiaWxpdHk9MC4wMSAhIHVkcHNpbmsgaG9zdD0iMTI3LjAuMC4xIiBwb3J0PTUwMDAgXAorICogICAgdWRwc3JjIHBvcnQ9NTAwMSAhIGIucmVjdl9ydGNwX3NpbmtfMCBcCisgKiAgICBiLnNlbmRfcnRjcF9zcmNfMCAhIHVkcHNpbmsgaG9zdD0iMTI3LjAuMC4xIiBwb3J0PTUwMDIgc3luYz1mYWxzZSBhc3luYz1mYWxzZQorICogXXwgU2VuZGVyIHBpcGVsaW5lCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgcnRwYmluIG5hbWU9YiBydHAtcHJvZmlsZT1hdnBmIGRvLXJldHJhbnNtaXNzaW9uPXRydWUgXAorICogICAgdWRwc3JjIHBvcnQ9NTAwMCBjYXBzPSJhcHBsaWNhdGlvbi94LXJ0cCxtZWRpYT0oc3RyaW5nKWF1ZGlvLGNsb2NrLXJhdGU9KGludCk0ODAwMCxlbmNvZGluZy1uYW1lPShzdHJpbmcpT1BVUyxwYXlsb2FkPShpbnQpOTYiICEgXAorICogICAgICAgIGIucmVjdl9ydHBfc2lua18wIFwKKyAqICAgIGIuICEgcnRwb3B1c2RlcGF5ICEgb3B1c2RlYyAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rIFwKKyAqICAgIHVkcHNyYyBwb3J0PTUwMDIgISBiLnJlY3ZfcnRjcF9zaW5rXzAgXAorICogICAgYi5zZW5kX3J0Y3Bfc3JjXzAgISB1ZHBzaW5rIGhvc3Q9IjEyNy4wLjAuMSIgcG9ydD01MDAxIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UKKyAqIF18IFJlY2VpdmVyIHBpcGVsaW5lCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RydHBydHhxdWV1ZS5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfcnRwX3J0eF9xdWV1ZV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfcnRwX3J0eF9xdWV1ZV9kZWJ1ZworCisjZGVmaW5lIERFRkFVTFRfTUFYX1NJWkVfVElNRSAgICAwCisjZGVmaW5lIERFRkFVTFRfTUFYX1NJWkVfUEFDS0VUUyAxMDAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTUFYX1NJWkVfVElNRSwKKyAgUFJPUF9NQVhfU0laRV9QQUNLRVRTLAorICBQUk9QX1JFUVVFU1RTLAorICBQUk9QX0ZVTEZJTExFRF9SRVFVRVNUUywKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwIikKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9ydHhfcXVldWVfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRwX3J0eF9xdWV1ZV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfcnR4X3F1ZXVlX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9ydHhfcXVldWVfY2hhaW5fbGlzdCAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyTGlzdCAqIGxpc3QpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9ydHhfcXVldWVfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICoKKyAgICBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9ydHhfcXVldWVfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9ydHhfcXVldWVfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9ydHhfcXVldWVfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitHX0RFRklORV9UWVBFIChHc3RSVFBSdHhRdWV1ZSwgZ3N0X3J0cF9ydHhfcXVldWUsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9ydHhfcXVldWVfY2xhc3NfaW5pdCAoR3N0UlRQUnR4UXVldWVDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9ydHhfcXVldWVfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX3J0eF9xdWV1ZV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9ydHhfcXVldWVfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfU0laRV9USU1FLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJtYXgtc2l6ZS10aW1lIiwgIk1heCBTaXplIFRpbWVzIiwKKyAgICAgICAgICAiQW1vdW50IG9mIG1zIHRvIHF1ZXVlICgwID0gdW5saW1pdGVkKSIsIDAsIEdfTUFYVUlOVCwKKyAgICAgICAgICBERUZBVUxUX01BWF9TSVpFX1RJTUUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX1NJWkVfUEFDS0VUUywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LXNpemUtcGFja2V0cyIsICJNYXggU2l6ZSBQYWNrZXRzIiwKKyAgICAgICAgICAiQW1vdW50IG9mIHBhY2tldHMgdG8gcXVldWUgKDAgPSB1bmxpbWl0ZWQpIiwgMCwgR19NQVhVSU5ULAorICAgICAgICAgIERFRkFVTFRfTUFYX1NJWkVfUEFDS0VUUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JFUVVFU1RTLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJyZXF1ZXN0cyIsICJSZXF1ZXN0cyIsCisgICAgICAgICAgIlRvdGFsIG51bWJlciBvZiByZXRyYW5zbWlzc2lvbiByZXF1ZXN0cyIsIDAsIEdfTUFYVUlOVCwKKyAgICAgICAgICAwLCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRlVMRklMTEVEX1JFUVVFU1RTLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJmdWxmaWxsZWQtcmVxdWVzdHMiLCAiRnVsZmlsbGVkIFJlcXVlc3RzIiwKKyAgICAgICAgICAiTnVtYmVyIG9mIGZ1bGZpbGxlZCByZXRyYW5zbWlzc2lvbiByZXF1ZXN0cyIsIDAsIEdfTUFYVUlOVCwKKyAgICAgICAgICAwLCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfZmFjdG9yeSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgUmV0cmFuc21pc3Npb24gUXVldWUiLCAiQ29kZWMiLAorICAgICAgIktlZXAgUlRQIHBhY2tldHMgaW4gYSBxdWV1ZSBmb3IgcmV0cmFuc21pc3Npb24iLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX3J0eF9xdWV1ZV9jaGFuZ2Vfc3RhdGUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9ydHhfcXVldWVfcmVzZXQgKEdzdFJUUFJ0eFF1ZXVlICogcnR4LCBnYm9vbGVhbiBmdWxsKQoreworICBnX211dGV4X2xvY2sgKCZydHgtPmxvY2spOworICBnX3F1ZXVlX2ZvcmVhY2ggKHJ0eC0+cXVldWUsIChHRnVuYykgZ3N0X2J1ZmZlcl91bnJlZiwgTlVMTCk7CisgIGdfcXVldWVfY2xlYXIgKHJ0eC0+cXVldWUpOworICBnX2xpc3RfZm9yZWFjaCAocnR4LT5wZW5kaW5nLCAoR0Z1bmMpIGdzdF9idWZmZXJfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAocnR4LT5wZW5kaW5nKTsKKyAgcnR4LT5wZW5kaW5nID0gTlVMTDsKKyAgcnR4LT5uX3JlcXVlc3RzID0gMDsKKyAgcnR4LT5uX2Z1bGZpbGxlZF9yZXF1ZXN0cyA9IDA7CisgIGdfbXV0ZXhfdW5sb2NrICgmcnR4LT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcnR4X3F1ZXVlX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RSVFBSdHhRdWV1ZSAqcnR4ID0gR1NUX1JUUF9SVFhfUVVFVUUgKG9iamVjdCk7CisKKyAgZ3N0X3J0cF9ydHhfcXVldWVfcmVzZXQgKHJ0eCwgVFJVRSk7CisgIGdfcXVldWVfZnJlZSAocnR4LT5xdWV1ZSk7CisgIGdfbXV0ZXhfY2xlYXIgKCZydHgtPmxvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChnc3RfcnRwX3J0eF9xdWV1ZV9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcnR4X3F1ZXVlX2luaXQgKEdzdFJUUFJ0eFF1ZXVlICogcnR4KQoreworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChydHgpOworCisgIHJ0eC0+c3JjcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLAorICAgICAgICAgICJzcmMiKSwgInNyYyIpOworICBHU1RfUEFEX1NFVF9QUk9YWV9DQVBTIChydHgtPnNyY3BhZCk7CisgIEdTVF9QQURfU0VUX1BST1hZX0FMTE9DQVRJT04gKHJ0eC0+c3JjcGFkKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHJ0eC0+c3JjcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfcnR4X3F1ZXVlX3NyY19ldmVudCkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAocnR4KSwgcnR4LT5zcmNwYWQpOworCisgIHJ0eC0+c2lua3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywKKyAgICAgICAgICAic2luayIpLCAic2luayIpOworICBHU1RfUEFEX1NFVF9QUk9YWV9DQVBTIChydHgtPnNpbmtwYWQpOworICBHU1RfUEFEX1NFVF9QUk9YWV9BTExPQ0FUSU9OIChydHgtPnNpbmtwYWQpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAocnR4LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfcnR4X3F1ZXVlX3NpbmtfZXZlbnQpKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHJ0eC0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX3J0eF9xdWV1ZV9jaGFpbikpOworICBnc3RfcGFkX3NldF9jaGFpbl9saXN0X2Z1bmN0aW9uIChydHgtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9ydHhfcXVldWVfY2hhaW5fbGlzdCkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAocnR4KSwgcnR4LT5zaW5rcGFkKTsKKworICBydHgtPnF1ZXVlID0gZ19xdWV1ZV9uZXcgKCk7CisgIGdfbXV0ZXhfaW5pdCAoJnJ0eC0+bG9jayk7CisKKyAgcnR4LT5tYXhfc2l6ZV90aW1lID0gREVGQVVMVF9NQVhfU0laRV9USU1FOworICBydHgtPm1heF9zaXplX3BhY2tldHMgPSBERUZBVUxUX01BWF9TSVpFX1BBQ0tFVFM7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdFJUUFJ0eFF1ZXVlICpydHg7CisgIGd1aW50IHNlcW51bTsKKyAgZ2Jvb2xlYW4gZm91bmQ7Cit9IFJUWERhdGE7CisKK3N0YXRpYyB2b2lkCitwdXNoX3NlcW51bSAoR3N0QnVmZmVyICogYnVmZmVyLCBSVFhEYXRhICogZGF0YSkKK3sKKyAgR3N0UlRQUnR4UXVldWUgKnJ0eCA9IGRhdGEtPnJ0eDsKKyAgR3N0UlRQQnVmZmVyIHJ0cGJ1ZmZlciA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisgIGd1aW50MTYgc2VxbnVtOworCisgIGlmIChkYXRhLT5mb3VuZCkKKyAgICByZXR1cm47CisKKyAgaWYgKCFHU1RfSVNfQlVGRkVSIChidWZmZXIpIHx8CisgICAgICAhZ3N0X3J0cF9idWZmZXJfbWFwIChidWZmZXIsIEdTVF9NQVBfUkVBRCwgJnJ0cGJ1ZmZlcikpCisgICAgcmV0dXJuOworCisgIHNlcW51bSA9IGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKCZydHBidWZmZXIpOworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cGJ1ZmZlcik7CisKKyAgaWYgKHNlcW51bSA9PSBkYXRhLT5zZXFudW0pIHsKKyAgICBkYXRhLT5mb3VuZCA9IFRSVUU7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnR4LCAiZm91bmQgJWQiLCBzZXFudW0pOworICAgIHJ0eC0+cGVuZGluZyA9IGdfbGlzdF9wcmVwZW5kIChydHgtPnBlbmRpbmcsIGdzdF9idWZmZXJfcmVmIChidWZmZXIpKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfcnR4X3F1ZXVlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFJUUFJ0eFF1ZXVlICpydHggPSBHU1RfUlRQX1JUWF9RVUVVRSAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTToKKyAgICB7CisgICAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgICAgIHMgPSBnc3RfZXZlbnRfZ2V0X3N0cnVjdHVyZSAoZXZlbnQpOworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJHc3RSVFBSZXRyYW5zbWlzc2lvblJlcXVlc3QiKSkgeworICAgICAgICBndWludCBzZXFudW07CisgICAgICAgIFJUWERhdGEgZGF0YTsKKworICAgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKHMsICJzZXFudW0iLCAmc2VxbnVtKSkKKyAgICAgICAgICBzZXFudW0gPSAtMTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHgsICJyZXF1ZXN0ICVkIiwgc2VxbnVtKTsKKworICAgICAgICBnX211dGV4X2xvY2sgKCZydHgtPmxvY2spOworICAgICAgICBkYXRhLnJ0eCA9IHJ0eDsKKyAgICAgICAgZGF0YS5zZXFudW0gPSBzZXFudW07CisgICAgICAgIGRhdGEuZm91bmQgPSBGQUxTRTsKKyAgICAgICAgcnR4LT5uX3JlcXVlc3RzICs9IDE7CisgICAgICAgIGdfcXVldWVfZm9yZWFjaCAocnR4LT5xdWV1ZSwgKEdGdW5jKSBwdXNoX3NlcW51bSwgJmRhdGEpOworICAgICAgICBnX211dGV4X3VubG9jayAoJnJ0eC0+bG9jayk7CisKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXMgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9ydHhfcXVldWVfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UlRQUnR4UXVldWUgKnJ0eCA9IEdTVF9SVFBfUlRYX1FVRVVFIChwYXJlbnQpOworICBnYm9vbGVhbiByZXM7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDoKKyAgICB7CisgICAgICBnX211dGV4X2xvY2sgKCZydHgtPmxvY2spOworICAgICAgZ3N0X2V2ZW50X2NvcHlfc2VnbWVudCAoZXZlbnQsICZydHgtPmhlYWRfc2VnbWVudCk7CisgICAgICBnX3F1ZXVlX3B1c2hfaGVhZCAocnR4LT5xdWV1ZSwgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmcnR4LT5sb2NrKTsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQKK2RvX3B1c2ggKEdzdEJ1ZmZlciAqIGJ1ZmZlciwgR3N0UlRQUnR4UXVldWUgKiBydHgpCit7CisgIHJ0eC0+bl9mdWxmaWxsZWRfcmVxdWVzdHMgKz0gMTsKKyAgZ3N0X3BhZF9wdXNoIChydHgtPnNyY3BhZCwgYnVmZmVyKTsKK30KKworc3RhdGljIGd1aW50MzIKK2dldF90c19kaWZmIChHc3RSVFBSdHhRdWV1ZSAqIHJ0eCkKK3sKKyAgR3N0Q2xvY2tUaW1lIGhpZ2hfdHMsIGxvd190czsKKyAgR3N0Q2xvY2tUaW1lRGlmZiByZXN1bHQ7CisgIEdzdEJ1ZmZlciAqaGlnaF9idWYsICpsb3dfYnVmOworCisgIGhpZ2hfYnVmID0gZ19xdWV1ZV9wZWVrX2hlYWQgKHJ0eC0+cXVldWUpOworCisgIHdoaWxlIChHU1RfSVNfRVZFTlQgKChsb3dfYnVmID0gZ19xdWV1ZV9wZWVrX3RhaWwgKHJ0eC0+cXVldWUpKSkpIHsKKyAgICBHc3RFdmVudCAqZXZlbnQgPSBnX3F1ZXVlX3BvcF90YWlsIChydHgtPnF1ZXVlKTsKKyAgICBnc3RfZXZlbnRfY29weV9zZWdtZW50IChldmVudCwgJnJ0eC0+dGFpbF9zZWdtZW50KTsKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgfQorCisgIGlmICghaGlnaF9idWYgfHwgIWxvd19idWYgfHwgaGlnaF9idWYgPT0gbG93X2J1ZikKKyAgICByZXR1cm4gMDsKKworICBoaWdoX3RzID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGhpZ2hfYnVmKTsKKyAgbG93X3RzID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGxvd19idWYpOworCisgIGhpZ2hfdHMgPSBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZydHgtPmhlYWRfc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgaGlnaF90cyk7CisgIGxvd190cyA9IGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJnJ0eC0+dGFpbF9zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICBsb3dfdHMpOworCisgIHJlc3VsdCA9IGhpZ2hfdHMgLSBsb3dfdHM7CisKKyAgLyogcmV0dXJuIHZhbHVlIGluIG1zIGluc3RlYWQgb2YgbnMgKi8KKyAgcmV0dXJuIChndWludDMyKSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChyZXN1bHQsIDEsIEdTVF9NU0VDT05EKTsKK30KKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBydHgtPmxvY2sgKi8KK3N0YXRpYyB2b2lkCitzaHJpbmtfcXVldWUgKEdzdFJUUFJ0eFF1ZXVlICogcnR4KQoreworICBpZiAocnR4LT5tYXhfc2l6ZV9wYWNrZXRzKSB7CisgICAgd2hpbGUgKGdfcXVldWVfZ2V0X2xlbmd0aCAocnR4LT5xdWV1ZSkgPiBydHgtPm1heF9zaXplX3BhY2tldHMpCisgICAgICBnc3RfYnVmZmVyX3VucmVmIChnX3F1ZXVlX3BvcF90YWlsIChydHgtPnF1ZXVlKSk7CisgIH0KKyAgaWYgKHJ0eC0+bWF4X3NpemVfdGltZSkgeworICAgIHdoaWxlIChnZXRfdHNfZGlmZiAocnR4KSA+IHJ0eC0+bWF4X3NpemVfdGltZSkKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGdfcXVldWVfcG9wX3RhaWwgKHJ0eC0+cXVldWUpKTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9ydHhfcXVldWVfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJUUFJ0eFF1ZXVlICpydHg7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHTGlzdCAqcGVuZGluZzsKKworICBydHggPSBHU1RfUlRQX1JUWF9RVUVVRSAocGFyZW50KTsKKworICBnX211dGV4X2xvY2sgKCZydHgtPmxvY2spOworICBnX3F1ZXVlX3B1c2hfaGVhZCAocnR4LT5xdWV1ZSwgZ3N0X2J1ZmZlcl9yZWYgKGJ1ZmZlcikpOworICBzaHJpbmtfcXVldWUgKHJ0eCk7CisKKyAgcGVuZGluZyA9IHJ0eC0+cGVuZGluZzsKKyAgcnR4LT5wZW5kaW5nID0gTlVMTDsKKyAgZ19tdXRleF91bmxvY2sgKCZydHgtPmxvY2spOworCisgIHBlbmRpbmcgPSBnX2xpc3RfcmV2ZXJzZSAocGVuZGluZyk7CisgIGdfbGlzdF9mb3JlYWNoIChwZW5kaW5nLCAoR0Z1bmMpIGRvX3B1c2gsIHJ0eCk7CisgIGdfbGlzdF9mcmVlIChwZW5kaW5nKTsKKworICByZXQgPSBnc3RfcGFkX3B1c2ggKHJ0eC0+c3JjcGFkLCBidWZmZXIpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcHVzaF90b19xdWV1ZSAoR3N0QnVmZmVyICoqIGJ1ZmZlciwgZ3VpbnQgaWR4LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdRdWV1ZSAqcXVldWUgPSB1c2VyX2RhdGE7CisKKyAgZ19xdWV1ZV9wdXNoX2hlYWQgKHF1ZXVlLCBnc3RfYnVmZmVyX3JlZiAoKmJ1ZmZlcikpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9ydHhfcXVldWVfY2hhaW5fbGlzdCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyTGlzdCAqIGxpc3QpCit7CisgIEdzdFJUUFJ0eFF1ZXVlICpydHg7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHTGlzdCAqcGVuZGluZzsKKworICBydHggPSBHU1RfUlRQX1JUWF9RVUVVRSAocGFyZW50KTsKKworICBnX211dGV4X2xvY2sgKCZydHgtPmxvY2spOworICBnc3RfYnVmZmVyX2xpc3RfZm9yZWFjaCAobGlzdCwgcHVzaF90b19xdWV1ZSwgcnR4LT5xdWV1ZSk7CisgIHNocmlua19xdWV1ZSAocnR4KTsKKworICBwZW5kaW5nID0gcnR4LT5wZW5kaW5nOworICBydHgtPnBlbmRpbmcgPSBOVUxMOworICBnX211dGV4X3VubG9jayAoJnJ0eC0+bG9jayk7CisKKyAgcGVuZGluZyA9IGdfbGlzdF9yZXZlcnNlIChwZW5kaW5nKTsKKyAgZ19saXN0X2ZvcmVhY2ggKHBlbmRpbmcsIChHRnVuYykgZG9fcHVzaCwgcnR4KTsKKyAgZ19saXN0X2ZyZWUgKHBlbmRpbmcpOworCisgIHJldCA9IGdzdF9wYWRfcHVzaF9saXN0IChydHgtPnNyY3BhZCwgbGlzdCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcnR4X3F1ZXVlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSVFBSdHhRdWV1ZSAqcnR4ID0gR1NUX1JUUF9SVFhfUVVFVUUgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX01BWF9TSVpFX1RJTUU6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnR4LT5tYXhfc2l6ZV90aW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfU0laRV9QQUNLRVRTOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0eC0+bWF4X3NpemVfcGFja2V0cyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVRVUVTVFM6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnR4LT5uX3JlcXVlc3RzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GVUxGSUxMRURfUkVRVUVTVFM6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnR4LT5uX2Z1bGZpbGxlZF9yZXF1ZXN0cyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3J0eF9xdWV1ZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UlRQUnR4UXVldWUgKnJ0eCA9IEdTVF9SVFBfUlRYX1FVRVVFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NQVhfU0laRV9USU1FOgorICAgICAgcnR4LT5tYXhfc2l6ZV90aW1lID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9TSVpFX1BBQ0tFVFM6CisgICAgICBydHgtPm1heF9zaXplX3BhY2tldHMgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9ydHhfcXVldWVfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RSVFBSdHhRdWV1ZSAqcnR4OworCisgIHJ0eCA9IEdTVF9SVFBfUlRYX1FVRVVFIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPQorICAgICAgR1NUX0VMRU1FTlRfQ0xBU1MgKGdzdF9ydHBfcnR4X3F1ZXVlX3BhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwKKyAgICAgIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3RfcnRwX3J0eF9xdWV1ZV9yZXNldCAocnR4LCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfcnRwX3J0eF9xdWV1ZV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3J0cF9ydHhfcXVldWVfZGVidWcsICJydHBydHhxdWV1ZSIsIDAsCisgICAgICAicnRwIHJldHJhbnNtaXNzaW9uIHF1ZXVlIik7CisKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJydHBydHhxdWV1ZSIsIEdTVF9SQU5LX05PTkUsCisgICAgICBHU1RfVFlQRV9SVFBfUlRYX1FVRVVFKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHF1ZXVlLmggYi9nc3QvcnRwbWFuYWdlci9nc3RydHBydHhxdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZThkNDQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBydHhxdWV1ZS5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIFJUUCBtdXhlciBlbGVtZW50IGZvciBHU3RyZWFtZXIKKyAqCisgKiBnc3RydHBtdXguaDoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqICAgQ29udGFjdDogWmVlc2hhbiBBbGkgPHplZXNoYW4uYWxpQG5va2lhLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgIDIwMDAsMjAwNSBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1JUWF9RVUVVRV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1JUWF9RVUVVRV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1JUUF9SVFhfUVVFVUUgKGdzdF9ydHBfcnR4X3F1ZXVlX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfUlRYX1FVRVVFKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9SVFhfUVVFVUUsIEdzdFJUUFJ0eFF1ZXVlKSkKKyNkZWZpbmUgR1NUX1JUUF9SVFhfUVVFVUVfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1JUUF9SVFhfUVVFVUUsIEdzdFJUUFJ0eFF1ZXVlQ2xhc3MpKQorI2RlZmluZSBHU1RfUlRQX1JUWF9RVUVVRV9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX1JUUF9SVFhfUVVFVUUsIEdzdFJUUFJ0eFF1ZXVlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1JUWF9RVUVVRShvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfUlRYX1FVRVVFKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9SVFhfUVVFVUVfQ0xBU1Mob2JqKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfUlRYX1FVRVVFKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBSdHhRdWV1ZSBHc3RSVFBSdHhRdWV1ZTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBSdHhRdWV1ZUNsYXNzIEdzdFJUUFJ0eFF1ZXVlQ2xhc3M7CisKKy8qKgorICogR3N0UlRQUnR4UXVldWU6CisgKgorICogVGhlIG9wYXF1ZSAjR3N0UlRQUnR4UXVldWUgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgX0dzdFJUUFJ0eFF1ZXVlCit7CisgIEdzdEVsZW1lbnQgZWxlbWVudDsKKworICAvKiBwYWQgKi8KKyAgR3N0UGFkICpzaW5rcGFkOworICBHc3RQYWQgKnNyY3BhZDsKKworICBHTXV0ZXggbG9jazsKKyAgR1F1ZXVlICpxdWV1ZTsKKyAgR0xpc3QgKnBlbmRpbmc7CisKKyAgZ3VpbnQgbWF4X3NpemVfdGltZTsKKyAgZ3VpbnQgbWF4X3NpemVfcGFja2V0czsKKworICBHc3RTZWdtZW50IGhlYWRfc2VnbWVudDsKKyAgR3N0U2VnbWVudCB0YWlsX3NlZ21lbnQ7CisKKyAgLyogU3RhdGlzdGljcyAqLworICBndWludCBuX3JlcXVlc3RzOworICBndWludCBuX2Z1bGZpbGxlZF9yZXF1ZXN0czsKK307CisKK3N0cnVjdCBfR3N0UlRQUnR4UXVldWVDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworCitHVHlwZSBnc3RfcnRwX3J0eF9xdWV1ZV9nZXRfdHlwZSAodm9pZCk7CitnYm9vbGVhbiBnc3RfcnRwX3J0eF9xdWV1ZV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9SVFBfUlRYX1FVRVVFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOGE2NjYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmMKQEAgLTAsMCArMSw3OTEgQEAKKy8qIFJUUCBSZXRyYW5zbWlzc2lvbiByZWNlaXZlciBlbGVtZW50IGZvciBHU3RyZWFtZXIKKyAqCisgKiBnc3RydHBydHhyZWNlaXZlLmM6CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIENvbGxhYm9yYSBMdGQuCisgKiAgIEBhdXRob3IgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtcnRwcnR4cmVjZWl2ZQorICogQHNlZV9hbHNvOiBydHBydHhzZW5kLCBydHBzZXNzaW9uLCBydHBqaXR0ZXJidWZmZXIKKyAqCisgKiBydHBydHhyZWNlaXZlIGxpc3RlbnMgdG8gdGhlIHJldHJhbnNtaXNzaW9uIGV2ZW50cyBmcm9tIHRoZQorICogZG93bnN0cmVhbSBydHBqaXR0ZXJidWZmZXIgYW5kIHJlbWVtYmVycyB0aGUgU1NSQyAoc3NyYzEpIG9mIHRoZSBzdHJlYW0gYW5kCisgKiB0aGUgc2VxdWVuY2UgbnVtYmVyIHRoYXQgd2FzIHJlcXVlc3RlZC4gV2hlbiBpdCByZWNlaXZlcyBhIHBhY2tldCB3aXRoCisgKiBhIHNlcXVlbmNlIG51bWJlciBlcXVhbCB0byBvbmUgb2YgdGhlIG9uZXMgc3RvcmVkIGFuZCB3aXRoIGEgZGlmZmVyZW50IFNTUkMsCisgKiBpdCBpZGVudGlmaWVzIHRoZSBuZXcgU1NSQyAoc3NyYzIpIGFzIHRoZSByZXRyYW5zbWlzc2lvbiBzdHJlYW0gb2Ygc3NyYzEuCisgKiBGcm9tIHRoaXMgcG9pbnQgb24sIGl0IHJlcGxhY2VzIHNzcmMyIHdpdGggc3NyYzEgaW4gYWxsIHBhY2tldHMgb2YgdGhlCisgKiBzc3JjMiBzdHJlYW0gYW5kIGZsYWdzIHRoZW0gYXMgcmV0cmFuc21pc3Npb25zLCBzbyB0aGF0IHJ0cGppdHRlcmJ1ZmZlcgorICogY2FuIHJlY29uc3RydWN0IHRoZSBvcmlnaW5hbCBzdHJlYW0uCisgKgorICogVGhpcyBhbGdvcml0aG0gaXMgaW1wbGVtZW50ZWQgYXMgc3BlY2lmaWVkIGluIFJGQyA0NTg4LgorICoKKyAqIFRoaXMgZWxlbWVudCBpcyBtZWFudCB0byBiZSB1c2VkIHdpdGggcnRwcnR4c2VuZCBvbiB0aGUgc2VuZGVyIHNpZGUuCisgKiBTZWUgI0dzdFJ0cFJ0eFNlbmQKKyAqCisgKiBCZWxvdyB5b3UgY2FuIHNlZSBzb21lIGV4YW1wbGVzIHRoYXQgaWxsdXN0cmF0ZSBob3cgcnRwcnR4cmVjZWl2ZSBhbmQKKyAqIHJ0cHJ0eHNlbmQgZml0IGFtb25nIHRoZSBvdGhlciBydHAgZWxlbWVudHMgYW5kIGhvdyB0aGV5IHdvcmsgaW50ZXJuYWxseS4KKyAqIE5vcm1hbGx5LCBob2V3ZXZlciwgeW91IHNob3VsZCBhdm9pZCB1c2luZyBzdWNoIHBpcGVsaW5lcyBhbmQgdXNlCisgKiBydHBiaW4gaW5zdGVhZCwgd2l0aCBpdHMgI0dzdFJ0cEJpbjo6cmVxdWVzdC1hdXgtc2VuZGVyIGFuZAorICogI0dzdFJ0cEJpbjo6cmVxdWVzdC1hdXgtcmVjZWl2ZXIgc2lnbmFscy4gU2VlICNHc3RSdHBCaW4uCisgKgorICogIyBFeGFtcGxlIHBpcGVsaW5lcworICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHJ0cHNlc3Npb24gbmFtZT1ydHBzZXNzaW9uIHJ0cC1wcm9maWxlPWF2cGYgXAorICogICAgIGF1ZGlvdGVzdHNyYyBpcy1saXZlPXRydWUgISBvcHVzZW5jICEgcnRwb3B1c3BheSBwdD05NiAhIFwKKyAqICAgICAgICAgcnRwcnR4c2VuZCBwYXlsb2FkLXR5cGUtbWFwPSJhcHBsaWNhdGlvbi94LXJ0cC1wdC1tYXAsOTY9KHVpbnQpOTciICEgXAorICogICAgICAgICBydHBzZXNzaW9uLnNlbmRfcnRwX3NpbmsgXAorICogICAgIHJ0cHNlc3Npb24uc2VuZF9ydHBfc3JjICEgaWRlbnRpdHkgZHJvcC1wcm9iYWJpbGl0eT0wLjAxICEgXAorICogICAgICAgICB1ZHBzaW5rIGhvc3Q9IjEyNy4wLjAuMSIgcG9ydD01MDAwIFwKKyAqICAgICB1ZHBzcmMgcG9ydD01MDAxICEgcnRwc2Vzc2lvbi5yZWN2X3J0Y3Bfc2luayBcCisgKiAgICAgcnRwc2Vzc2lvbi5zZW5kX3J0Y3Bfc3JjICEgdWRwc2luayBob3N0PSIxMjcuMC4wLjEiIHBvcnQ9NTAwMiBcCisgKiAgICAgICAgIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UKKyAqIF18IFNlbmQgYXVkaW8gc3RyZWFtIHRocm91Z2ggcG9ydCA1MDAwICg1MDAxIGFuZCA1MDAyIGFyZSBqdXN0IHRoZSBydGNwCisgKiBsaW5rIHdpdGggdGhlIHJlY2VpdmVyKQorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHJ0cHNlc3Npb24gbmFtZT1ydHBzZXNzaW9uIHJ0cC1wcm9maWxlPWF2cGYgXAorICogICAgIHVkcHNyYyBwb3J0PTUwMDAgY2Fwcz0iYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZylhdWRpbyxjbG9jay1yYXRlPShpbnQpNDgwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKU9QVVMscGF5bG9hZD0oaW50KTk2IiAhIFwKKyAqICAgICAgICAgcnRwc2Vzc2lvbi5yZWN2X3J0cF9zaW5rIFwKKyAqICAgICBydHBzZXNzaW9uLnJlY3ZfcnRwX3NyYyAhIFwKKyAqICAgICAgICAgcnRwcnR4cmVjZWl2ZSBwYXlsb2FkLXR5cGUtbWFwPSJhcHBsaWNhdGlvbi94LXJ0cC1wdC1tYXAsOTY9KHVpbnQpOTciICEgXAorICogICAgICAgICBydHBzc3JjZGVtdXggISBydHBqaXR0ZXJidWZmZXIgZG8tcmV0cmFuc21pc3Npb249dHJ1ZSAhIFwKKyAqICAgICAgICAgcnRwb3B1c2RlcGF5ICEgb3B1c2RlYyAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rIFwKKyAqICAgICBydHBzZXNzaW9uLnNlbmRfcnRjcF9zcmMgISBcCisgKiAgICAgICAgIHVkcHNpbmsgaG9zdD0iMTI3LjAuMC4xIiBwb3J0PTUwMDEgc3luYz1mYWxzZSBhc3luYz1mYWxzZSBcCisgKiAgICAgdWRwc3JjIHBvcnQ9NTAwMiAhIHJ0cHNlc3Npb24ucmVjdl9ydGNwX3NpbmsKKyAqIF18IFJlY2VpdmUgYXVkaW8gc3RyZWFtIGZyb20gcG9ydCA1MDAwICg1MDAxIGFuZCA1MDAyIGFyZSBqdXN0IHRoZSBydGNwCisgKiBsaW5rIHdpdGggdGhlIHNlbmRlcikKKyAqCisgKiBJbiB0aGlzIGV4YW1wbGUgd2UgY2FuIHNlZSBhIHNpbXBsZSBzdHJlYW1pbmcgb2YgYW4gT1BVUyBzdHJlYW0gd2l0aCBzb21lCisgKiBvZiB0aGUgcGFja2V0cyBiZWluZyBhcnRpZmljaWFsbHkgZHJvcHBlZCBieSB0aGUgaWRlbnRpdHkgZWxlbWVudC4KKyAqIFRoYW5rcyB0byByZXRyYW5zbWlzc2lvbiwgeW91IHNob3VsZCBzdGlsbCBoZWFyIGEgY2xlYXIgc291bmQgd2hlbiBzZXR0aW5nCisgKiBkcm9wLXByb2JhYmlsaXR5IHRvIHNvbWV0aGluZyBncmVhdGVyIHRoYW4gMC4KKyAqCisgKiBJbnRlcm5hbGx5LCB0aGUgcnRwaml0dGVyYnVmZmVyIHdpbGwgZ2VuZXJhdGUgYSBjdXN0b20gdXBzdHJlYW0gZXZlbnQsCisgKiBHc3RSVFBSZXRyYW5zbWlzc2lvblJlcXVlc3QsIHdoZW4gaXQgZGV0ZWN0cyB0aGF0IG9uZSBwYWNrZXQgaXMgbWlzc2luZy4KKyAqIFRoZW4gdGhpcyByZXF1ZXN0IGlzIHRyYW5zbGF0ZWQgdG8gYSBGQiBOQUNLIGluIHRoZSBydGNwIGxpbmsgYnkgcnRwc2Vzc2lvbi4KKyAqIEZpbmFsbHkgdGhlIHJ0cHNlc3Npb24gb2YgdGhlIHNlbmRlciBzaWRlIHdpbGwgcmUtY29udmVydCBpdCBpbiBhCisgKiBHc3RSVFBSZXRyYW5zbWlzc2lvblJlcXVlc3QgdGhhdCB3aWxsIGJlIGhhbmRsZWQgYnkgcnRwcnR4c2VuZC4gcnRwcnR4c2VuZAorICogd2lsbCB0aGVuIHJlLXNlbmQgdGhlIG1pc3NpbmcgcGFja2V0IHdpdGggYSBuZXcgc3JyYyBhbmQgYSBkaWZmZXJlbnQgcGF5bG9hZAorICogdHlwZSAoaGVyZSwgOTcpLCBidXQgd2l0aCB0aGUgc2FtZSBvcmlnaW5hbCBzZXF1ZW5jZSBudW1iZXIuIE9uIHRoZSByZWNlaXZlcgorICogc2lkZSwgcnRwcnR4cmVjZWl2ZSB3aWxsIGFzc29jaWF0ZSB0aGlzIG5ldyBzdHJlYW0gd2l0aCB0aGUgb3JpZ2luYWwgYW5kCisgKiBmb3J3YXJkIHRoZSByZXRyYW5zbWlzc2lvbiBwYWNrZXRzIHRvIHJ0cGppdHRlcmJ1ZmZlciB3aXRoIHRoZSBvcmlnaW5hbAorICogc3NyYyBhbmQgcGF5bG9hZCB0eXBlLgorICoKKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBydHBzZXNzaW9uIG5hbWU9cnRwc2Vzc2lvbiBydHAtcHJvZmlsZT1hdnBmIFwKKyAqICAgICBhdWRpb3Rlc3RzcmMgaXMtbGl2ZT10cnVlICEgb3B1c2VuYyAhIHJ0cG9wdXNwYXkgcHQ9OTcgc2VxbnVtLW9mZnNldD0xICEgXAorICogICAgICAgICBydHBydHhzZW5kIHBheWxvYWQtdHlwZS1tYXA9ImFwcGxpY2F0aW9uL3gtcnRwLXB0LW1hcCw5Nz0odWludCk5OSIgISBcCisgKiAgICAgICAgIGZ1bm5lbCBuYW1lPWYgISBydHBzZXNzaW9uLnNlbmRfcnRwX3NpbmsgXAorICogICAgIGF1ZGlvdGVzdHNyYyBmcmVxPTY2MC4wIGlzLWxpdmU9dHJ1ZSAhIG9wdXNlbmMgISBcCisgKiAgICAgICAgIHJ0cG9wdXNwYXkgcHQ9OTcgc2VxbnVtLW9mZnNldD0xMDAgISBcCisgKiAgICAgICAgIHJ0cHJ0eHNlbmQgcGF5bG9hZC10eXBlLW1hcD0iYXBwbGljYXRpb24veC1ydHAtcHQtbWFwLDk3PSh1aW50KTk5IiAhIFwKKyAqICAgICAgICAgZi4gXAorICogICAgIHJ0cHNlc3Npb24uc2VuZF9ydHBfc3JjICEgaWRlbnRpdHkgZHJvcC1wcm9iYWJpbGl0eT0wLjAxICEgXAorICogICAgICAgICB1ZHBzaW5rIGhvc3Q9IjEyNy4wLjAuMSIgcG9ydD01MDAwIFwKKyAqICAgICB1ZHBzcmMgcG9ydD01MDAxICEgcnRwc2Vzc2lvbi5yZWN2X3J0Y3Bfc2luayBcCisgKiAgICAgcnRwc2Vzc2lvbi5zZW5kX3J0Y3Bfc3JjICEgdWRwc2luayBob3N0PSIxMjcuMC4wLjEiIHBvcnQ9NTAwMiBcCisgKiAgICAgICAgIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UKKyAqIF18IFNlbmQgdHdvIGF1ZGlvIHN0cmVhbXMgdG8gcG9ydCA1MDAwLgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHJ0cHNlc3Npb24gbmFtZT1ydHBzZXNzaW9uIHJ0cC1wcm9maWxlPWF2cGYgXAorICogICAgIHVkcHNyYyBwb3J0PTUwMDAgY2Fwcz0iYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZylhdWRpbyxjbG9jay1yYXRlPShpbnQpNDgwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKU9QVVMscGF5bG9hZD0oaW50KTk3IiAhIFwKKyAqICAgICAgICAgcnRwc2Vzc2lvbi5yZWN2X3J0cF9zaW5rIFwKKyAqICAgICBydHBzZXNzaW9uLnJlY3ZfcnRwX3NyYyAhIFwKKyAqICAgICAgICAgcnRwcnR4cmVjZWl2ZSBwYXlsb2FkLXR5cGUtbWFwPSJhcHBsaWNhdGlvbi94LXJ0cC1wdC1tYXAsOTc9KHVpbnQpOTkiICEgXAorICogICAgICAgICBydHBzc3JjZGVtdXggbmFtZT1kZW11eCBcCisgKiAgICAgZGVtdXguICEgcXVldWUgISBydHBqaXR0ZXJidWZmZXIgZG8tcmV0cmFuc21pc3Npb249dHJ1ZSAhIHJ0cG9wdXNkZXBheSAhIFwKKyAqICAgICAgICAgb3B1c2RlYyAhIGF1ZGlvY29udmVydCAhIGF1dG9hdWRpb3NpbmsgXAorICogICAgIGRlbXV4LiAhIHF1ZXVlICEgcnRwaml0dGVyYnVmZmVyIGRvLXJldHJhbnNtaXNzaW9uPXRydWUgISBydHBvcHVzZGVwYXkgISBcCisgKiAgICAgICAgIG9wdXNkZWMgISBhdWRpb2NvbnZlcnQgISBhdXRvYXVkaW9zaW5rIFwKKyAqICAgICB1ZHBzcmMgcG9ydD01MDAyICEgcnRwc2Vzc2lvbi5yZWN2X3J0Y3Bfc2luayBcCisgKiAgICAgcnRwc2Vzc2lvbi5zZW5kX3J0Y3Bfc3JjICEgdWRwc2luayBob3N0PSIxMjcuMC4wLjEiIHBvcnQ9NTAwMSBcCisgKiAgICAgICAgIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UKKyAqIF18IFJlY2VpdmUgdHdvIGF1ZGlvIHN0cmVhbXMgZnJvbSBwb3J0IDUwMDAuCisgKgorICogSW4gdGhpcyBleGFtcGxlIHdlIGFyZSBzdHJlYW1pbmcgdHdvIHN0cmVhbXMgb2YgdGhlIHNhbWUgdHlwZSB0aHJvdWdoIHRoZQorICogc2FtZSBwb3J0LiBUaGV5LCBob3dldmVyLCBhcmUgdXNpbmcgYSBkaWZmZXJlbnQgU1NSQyAoc3NyYyBpcyByYW5kb21seQorICogZ2VuZXJhdGVkIG9uIGVhY2ggcGF5bG9hZGVyIC0gcnRwb3B1c3BheSBpbiB0aGlzIGV4YW1wbGUpLCBzbyB0aGV5IGNhbiBiZQorICogaWRlbnRpZmllZCBhbmQgZGVtdWx0aXBsZXhlZCBieSBydHBzc3JjZGVtdXggb24gdGhlIHJlY2VpdmVyIHNpZGUuIFRoaXMgaXMKKyAqIGFuIGV4YW1wbGUgb2YgU1NSQy1tdWx0aXBsZXhpbmcuCisgKgorICogSXQgaXMgaW1wb3J0YW50IGhlcmUgdG8gdXNlIGEgZGlmZmVyZW50IHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlcgorICogKHNlcW51bS1vZmZzZXQpLCBzaW5jZSB0aGlzIGlzIHRoZSBvbmx5IG1lYW5zIG9mIGlkZW50aWZpY2F0aW9uIHRoYXQKKyAqIHJ0cHJ0eHJlY2VpdmUgdXNlcyB0aGUgdmVyeSBmaXJzdCB0aW1lIHRvIGlkZW50aWZ5IHJldHJhbnNtaXNzaW9uIHN0cmVhbXMuCisgKiBJdCBpcyBhbiBlcnJvciwgYWNjb3JkaW5nIHRvIFJGQzQ1ODggdG8gaGF2ZSB0d28gcmV0cmFuc21pc3Npb24gcmVxdWVzdHMgZm9yCisgKiBwYWNrZXRzIGJlbG9uZ2luZyB0byB0d28gZGlmZmVyZW50IHN0cmVhbXMgYnV0IHdpdGggdGhlIHNhbWUgc2VxdWVuY2UgbnVtYmVyLgorICogTm90ZSB0aGF0IHRoZSBkZWZhdWx0IHNlcW51bS1vZmZzZXQgdmFsdWUgKC0xLCB3aGljaCBtZWFucyByYW5kb20pIHdvdWxkCisgKiB3b3JrIGp1c3QgZmluZSwgYnV0IGl0IGlzIG92ZXJyaWRlbiBoZXJlIGZvciBpbGx1c3RyYXRpb24gcHVycG9zZXMuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJnc3RydHBydHhyZWNlaXZlLmgiCisKKyNkZWZpbmUgQVNTT0NfVElNRU9VVCAoR1NUX1NFQ09ORCkKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF9ydHhfcmVjZWl2ZV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfcnRwX3J0eF9yZWNlaXZlX2RlYnVnCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX1BBWUxPQURfVFlQRV9NQVAsCisgIFBST1BfTlVNX1JUWF9SRVFVRVNUUywKKyAgUFJPUF9OVU1fUlRYX1BBQ0tFVFMsCisgIFBST1BfTlVNX1JUWF9BU1NPQ19QQUNLRVRTCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIpCisgICAgKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfcnR4X3JlY2VpdmVfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfcnR4X3JlY2VpdmVfY2hhaW4gKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX3J0eF9yZWNlaXZlX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfcnR4X3JlY2VpdmVfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9ydHhfcmVjZWl2ZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX3J0eF9yZWNlaXZlX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworR19ERUZJTkVfVFlQRSAoR3N0UnRwUnR4UmVjZWl2ZSwgZ3N0X3J0cF9ydHhfcmVjZWl2ZSwgR1NUX1RZUEVfRUxFTUVOVCk7CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3J0eF9yZWNlaXZlX2NsYXNzX2luaXQgKEdzdFJ0cFJ0eFJlY2VpdmVDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9ydHhfcmVjZWl2ZV9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9ydHBfcnR4X3JlY2VpdmVfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfcnR4X3JlY2VpdmVfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QQVlMT0FEX1RZUEVfTUFQLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgicGF5bG9hZC10eXBlLW1hcCIsICJQYXlsb2FkIFR5cGUgTWFwIiwKKyAgICAgICAgICAiTWFwIG9mIG9yaWdpbmFsIHBheWxvYWQgdHlwZXMgdG8gdGhlaXIgcmV0cmFuc21pc3Npb24gcGF5bG9hZCB0eXBlcyIsCisgICAgICAgICAgR1NUX1RZUEVfU1RSVUNUVVJFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX05VTV9SVFhfUkVRVUVTVFMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm51bS1ydHgtcmVxdWVzdHMiLCAiTnVtIFJUWCBSZXF1ZXN0cyIsCisgICAgICAgICAgIk51bWJlciBvZiByZXRyYW5zbWlzc2lvbiBldmVudHMgcmVjZWl2ZWQiLCAwLCBHX01BWFVJTlQsCisgICAgICAgICAgMCwgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX05VTV9SVFhfUEFDS0VUUywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibnVtLXJ0eC1wYWNrZXRzIiwgIk51bSBSVFggUGFja2V0cyIsCisgICAgICAgICAgIiBOdW1iZXIgb2YgcmV0cmFuc21pc3Npb24gcGFja2V0cyByZWNlaXZlZCIsIDAsIEdfTUFYVUlOVCwKKyAgICAgICAgICAwLCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTlVNX1JUWF9BU1NPQ19QQUNLRVRTLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJudW0tcnR4LWFzc29jLXBhY2tldHMiLAorICAgICAgICAgICJOdW0gUlRYIEFzc29jaWF0ZWQgUGFja2V0cyIsICJOdW1iZXIgb2YgcmV0cmFuc21pc3Npb24gcGFja2V0cyAiCisgICAgICAgICAgImNvcnJlY3RseSBhc3NvY2lhdGVkIHdpdGggcmV0cmFuc21pc3Npb24gcmVxdWVzdHMiLCAwLCBHX01BWFVJTlQsCisgICAgICAgICAgMCwgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX2ZhY3RvcnkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiUlRQIFJldHJhbnNtaXNzaW9uIHJlY2VpdmVyIiwgIkNvZGVjIiwKKyAgICAgICJSZWNlaXZlIHJldHJhbnNtaXR0ZWQgUlRQIHBhY2tldHMgYWNjb3JkaW5nIHRvIFJGQzQ1ODgiLAorICAgICAgIkp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPiIpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9ydHhfcmVjZWl2ZV9jaGFuZ2Vfc3RhdGUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9ydHhfcmVjZWl2ZV9yZXNldCAoR3N0UnRwUnR4UmVjZWl2ZSAqIHJ0eCkKK3sKKyAgR1NUX09CSkVDVF9MT0NLIChydHgpOworICBnX2hhc2hfdGFibGVfcmVtb3ZlX2FsbCAocnR4LT5zc3JjMl9zc3JjMV9tYXApOworICBnX2hhc2hfdGFibGVfcmVtb3ZlX2FsbCAocnR4LT5zZXFudW1fc3NyYzFfbWFwKTsKKyAgcnR4LT5udW1fcnR4X3JlcXVlc3RzID0gMDsKKyAgcnR4LT5udW1fcnR4X3BhY2tldHMgPSAwOworICBydHgtPm51bV9ydHhfYXNzb2NfcGFja2V0cyA9IDA7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9ydHhfcmVjZWl2ZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwUnR4UmVjZWl2ZSAqcnR4ID0gR1NUX1JUUF9SVFhfUkVDRUlWRSAob2JqZWN0KTsKKworICBnX2hhc2hfdGFibGVfdW5yZWYgKHJ0eC0+c3NyYzJfc3NyYzFfbWFwKTsKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChydHgtPnNlcW51bV9zc3JjMV9tYXApOworICBnX2hhc2hfdGFibGVfdW5yZWYgKHJ0eC0+cnR4X3B0X21hcCk7CisgIGlmIChydHgtPnJ0eF9wdF9tYXBfc3RydWN0dXJlKQorICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocnR4LT5ydHhfcHRfbWFwX3N0cnVjdHVyZSk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF9ydHBfcnR4X3JlY2VpdmVfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGd1aW50MzIgc3NyYzsKKyAgR3N0Q2xvY2tUaW1lIHRpbWU7Cit9IFNzcmNBc3NvYzsKKworc3RhdGljIFNzcmNBc3NvYyAqCitzc3JjX2Fzc29jX25ldyAoZ3VpbnQzMiBzc3JjLCBHc3RDbG9ja1RpbWUgdGltZSkKK3sKKyAgU3NyY0Fzc29jICphc3NvYyA9IGdfc2xpY2VfbmV3IChTc3JjQXNzb2MpOworCisgIGFzc29jLT5zc3JjID0gc3NyYzsKKyAgYXNzb2MtPnRpbWUgPSB0aW1lOworCisgIHJldHVybiBhc3NvYzsKK30KKworc3RhdGljIHZvaWQKK3NzcmNfYXNzb2NfZnJlZSAoU3NyY0Fzc29jICogYXNzb2MpCit7CisgIGdfc2xpY2VfZnJlZSAoU3NyY0Fzc29jLCBhc3NvYyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3J0eF9yZWNlaXZlX2luaXQgKEdzdFJ0cFJ0eFJlY2VpdmUgKiBydHgpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqa2xhc3MgPSBHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKHJ0eCk7CisKKyAgcnR4LT5zcmNwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAoZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsCisgICAgICAgICAgInNyYyIpLCAic3JjIik7CisgIEdTVF9QQURfU0VUX1BST1hZX0NBUFMgKHJ0eC0+c3JjcGFkKTsKKyAgR1NUX1BBRF9TRVRfUFJPWFlfQUxMT0NBVElPTiAocnR4LT5zcmNwYWQpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAocnR4LT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9ydHhfcmVjZWl2ZV9zcmNfZXZlbnQpKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHJ0eCksIHJ0eC0+c3JjcGFkKTsKKworICBydHgtPnNpbmtwYWQgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAoZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsCisgICAgICAgICAgInNpbmsiKSwgInNpbmsiKTsKKyAgR1NUX1BBRF9TRVRfUFJPWFlfQ0FQUyAocnR4LT5zaW5rcGFkKTsKKyAgR1NUX1BBRF9TRVRfUFJPWFlfQUxMT0NBVElPTiAocnR4LT5zaW5rcGFkKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHJ0eC0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX3J0eF9yZWNlaXZlX2NoYWluKSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChydHgpLCBydHgtPnNpbmtwYWQpOworCisgIHJ0eC0+c3NyYzJfc3NyYzFfbWFwID0gZ19oYXNoX3RhYmxlX25ldyAoZ19kaXJlY3RfaGFzaCwgZ19kaXJlY3RfZXF1YWwpOworICBydHgtPnNlcW51bV9zc3JjMV9tYXAgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfZGlyZWN0X2hhc2gsIGdfZGlyZWN0X2VxdWFsLAorICAgICAgTlVMTCwgKEdEZXN0cm95Tm90aWZ5KSBzc3JjX2Fzc29jX2ZyZWUpOworCisgIHJ0eC0+cnR4X3B0X21hcCA9IGdfaGFzaF90YWJsZV9uZXcgKGdfZGlyZWN0X2hhc2gsIGdfZGlyZWN0X2VxdWFsKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3J0eF9yZWNlaXZlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwUnR4UmVjZWl2ZSAqcnR4ID0gR1NUX1JUUF9SVFhfUkVDRUlWRSAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTToKKyAgICB7CisgICAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfZXZlbnRfZ2V0X3N0cnVjdHVyZSAoZXZlbnQpOworCisgICAgICAvKiBUaGlzIGV2ZW50IHVzdWFsbHkgY29tZXMgZnJvbSB0aGUgZG93bnN0cmVhbSBnc3RydHBqaXR0ZXJidWZmZXIgKi8KKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiR3N0UlRQUmV0cmFuc21pc3Npb25SZXF1ZXN0IikpIHsKKyAgICAgICAgZ3VpbnQgc2VxbnVtID0gMDsKKyAgICAgICAgZ3VpbnQgc3NyYyA9IDA7CisgICAgICAgIGdwb2ludGVyIHNzcmMyID0gMDsKKworICAgICAgICAvKiByZXRyaWV2ZSBzZXFudW0gb2YgdGhlIHBhY2tldCB0aGF0IG5lZWQgdG8gYmUgcmV0cmFuc21pdHRlZCAqLworICAgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKHMsICJzZXFudW0iLCAmc2VxbnVtKSkKKyAgICAgICAgICBzZXFudW0gPSAtMTsKKworICAgICAgICAvKiByZXRyaWV2ZSBzc3JjIG9mIHRoZSBwYWNrZXQgdGhhdCBuZWVkIHRvIGJlIHJldHJhbnNtaXR0ZWQKKyAgICAgICAgICogaXQncyB1c2VmdWwgd2hlbiByZWNvbnN0cnVjdGluZyB0aGUgb3JpZ2luYWwgcGFja2V0IGZyb20gdGhlIHJ0eCBwYWNrZXQgKi8KKyAgICAgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF91aW50IChzLCAic3NyYyIsICZzc3JjKSkKKyAgICAgICAgICBzc3JjID0gLTE7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnR4LCAiZ290IHJ0eCByZXF1ZXN0IGZvciBzZXFudW06ICV1LCBzc3JjOiAlWCIsCisgICAgICAgICAgICBzZXFudW0sIHNzcmMpOworCisgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKworICAgICAgICAvKiBpbmNyZWFzZSBudW1iZXIgb2Ygc2VlbiByZXF1ZXN0cyBmb3Igb3VyIHN0YXRpc3RpY3MgKi8KKyAgICAgICAgKytydHgtPm51bV9ydHhfcmVxdWVzdHM7CisKKyAgICAgICAgLyogRmlyc3QsIHdlIGxvb2t1cCBpbiBvdXIgbWFwIHRvIHNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgYXNzb2NpYXRlIHRoaXMKKyAgICAgICAgICogbWFzdGVyIHN0cmVhbSBzc3JjIHdpdGggaXRzIHJldHJhbnNtaXR0ZWQgc3RyZWFtLgorICAgICAgICAgKiBFdmVyeSBzc3JjIGFyZSB1bmlxdWUgc28gd2UgY2FuIHVzZSB0aGUgc2FtZSBoYXNoIHRhYmxlCisgICAgICAgICAqIGZvciBib3RoIHJldHJpZXZpbmcgdGhlIHNzcmMxIGZyb20gc3NyYzIgYW5kIGFsc28gc3NyYzIgZnJvbSBzc3JjMQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGdfaGFzaF90YWJsZV9sb29rdXBfZXh0ZW5kZWQgKHJ0eC0+c3NyYzJfc3NyYzFfbWFwLAorICAgICAgICAgICAgICAgIEdVSU5UX1RPX1BPSU5URVIgKHNzcmMpLCBOVUxMLCAmc3NyYzIpCisgICAgICAgICAgICAmJiBHUE9JTlRFUl9UT19VSU5UIChzc3JjMikgIT0gR1BPSU5URVJfVE9fVUlOVCAoc3NyYykpIHsKKyAgICAgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHgsICJSZXRyYW5zbWl0ZWQgc3RyZWFtICVYIGFscmVhZHkgYXNzb2NpYXRlZCAiCisgICAgICAgICAgICAgICJ0byBpdHMgbWFzdGVyLCAlWCIsIEdQT0lOVEVSX1RPX1VJTlQgKHNzcmMyKSwgc3NyYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgU3NyY0Fzc29jICphc3NvYzsKKworICAgICAgICAgIC8qIG5vdCBhbHJlYWR5IGFzc29jaWF0ZWQgYnV0IGFsc28gd2UgaGF2ZSB0byBjaGVjayB0aGF0IHdlIGhhdmUgbm90CisgICAgICAgICAgICogYWxyZWFkeSBjb25zaWRlcmVkIHRoaXMgcmVxdWVzdC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoZ19oYXNoX3RhYmxlX2xvb2t1cF9leHRlbmRlZCAocnR4LT5zZXFudW1fc3NyYzFfbWFwLAorICAgICAgICAgICAgICAgICAgR1VJTlRfVE9fUE9JTlRFUiAoc2VxbnVtKSwgTlVMTCwgKGdwb2ludGVyICopICYgYXNzb2MpKSB7CisgICAgICAgICAgICBpZiAoYXNzb2MtPnNzcmMgPT0gc3NyYykgeworICAgICAgICAgICAgICAvKiBzYW1lIHNlcW51bSwgc2FtZSBzc3JjICovCisKKyAgICAgICAgICAgICAgLyogZG8gbm90aGluZyBiZWNhdXNlIHdlIGhhdmUgYWxyZWFkeSBjb25zaWRlcmVkIHRoaXMgcmVxdWVzdAorICAgICAgICAgICAgICAgKiBUaGUgaml0dGVyIG1heSBiZSB0b28gaW1wYXRpZW50IG9mIHRoZSBydHggcGFja2V0IGhhcyBiZWVuCisgICAgICAgICAgICAgICAqIGxvc3QgdG9vLgorICAgICAgICAgICAgICAgKiBJdCBkb2VzIG5vdCBtZWFuIHdlIHJlamVjdCB0aGUgZXZlbnQsIHdlIHN0aWxsIHdhbnQgdG8gZm9yd2FyZAorICAgICAgICAgICAgICAgKiB0aGUgcmVxdWVzdCB0byB0aGUgZ3N0cnRwc2Vzc2lvbiB0byBiZSB0cmFuc2xhdGVyIGludG8gYSBGQiBOQUNLCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnR4LCAiRHVwbGljYXRlIHJlcXVlc3Q6IHNlcW51bTogJXUsIHNzcmM6ICVYIiwKKyAgICAgICAgICAgICAgICAgIHNlcW51bSwgc3NyYyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvKiBzYW1lIHNlcW51bSwgZGlmZmVyZW50IHNzcmMgKi8KKworICAgICAgICAgICAgICAvKiBJZiB0aGUgYXNzb2NpYXRpb24gYXR0ZW1wdCBpcyBsYXJnZXIgdGhhbiBBU1NPQ19USU1FT1VULAorICAgICAgICAgICAgICAgKiB0aGVuIHdlIGdpdmUgdXAgb24gaXQsIGFuZCB0cnkgdGhpcyBvbmUuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChydHgtPmxhc3RfdGltZSkgfHwKKyAgICAgICAgICAgICAgICAgICFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoYXNzb2MtPnRpbWUpIHx8CisgICAgICAgICAgICAgICAgICBhc3NvYy0+dGltZSArIEFTU09DX1RJTUVPVVQgPCBydHgtPmxhc3RfdGltZSkgeworICAgICAgICAgICAgICAgIC8qIEZyb20gUkZDIDQ1ODg6CisgICAgICAgICAgICAgICAgICogdGhlIHJlY2VpdmVyIE1VU1QgTk9UIGhhdmUgdHdvIG91dHN0YW5kaW5nIHJlcXVlc3RzIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgKiBzYW1lIHBhY2tldCBzZXF1ZW5jZSBudW1iZXIgaW4gdHdvIGRpZmZlcmVudCBvcmlnaW5hbCBzdHJlYW1zCisgICAgICAgICAgICAgICAgICogYmVmb3JlIHRoZSBhc3NvY2lhdGlvbiBpcyByZXNvbHZlZC4gT3RoZXJ3aXNlIGl0J3MgaW1wb3NzaWJsZQorICAgICAgICAgICAgICAgICAqIHRvIGFzc29jaWF0ZSBhIHJ0eCBzdHJlYW0gYW5kIGl0cyBtYXN0ZXIgc3RyZWFtCisgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvKiByZW1vdmUgc2VxbnVtIGluIG9yZGVyIHRvIHJldXNlIHRoZSBzcG90ICovCisgICAgICAgICAgICAgICAgZ19oYXNoX3RhYmxlX3JlbW92ZSAocnR4LT5zZXFudW1fc3NyYzFfbWFwLAorICAgICAgICAgICAgICAgICAgICBHVUlOVF9UT19QT0lOVEVSIChzZXFudW0pKTsKKyAgICAgICAgICAgICAgICBnb3RvIHJldHJhbnNtaXQ7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgR1NUX0lORk9fT0JKRUNUIChydHgsICJyZWplY3RpbmcgcmVxdWVzdCBmb3Igc2VxbnVtICV1IgorICAgICAgICAgICAgICAgICAgICAiIG9mIG1hc3RlciBzdHJlYW0gJVg7IHRoZXJlIGlzIGFscmVhZHkgYSBwZW5kaW5nIHJlcXVlc3QgIgorICAgICAgICAgICAgICAgICAgICAiZm9yIHRoZSBzYW1lIHNlcW51bSBvbiBzc3JjICVYIHRoYXQgaGFzIG5vdCBleHBpcmVkIiwKKyAgICAgICAgICAgICAgICAgICAgc2VxbnVtLCBzc3JjLCBhc3NvYy0+c3NyYyk7CisKKyAgICAgICAgICAgICAgICAvKiBkbyBub3QgZm9yd2FyZCB0aGUgZXZlbnQgYXMgd2UgYXJlIHJlamVjdGluZyB0aGlzIHJlcXVlc3QgKi8KKyAgICAgICAgICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKyAgICAgICAgICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0cmFuc21pdDoKKyAgICAgICAgICAgIC8qIHRoZSByZXF1ZXN0IGhhcyBub3QgYmVlbiBhbHJlYWR5IGNvbnNpZGVyZWQKKyAgICAgICAgICAgICAqIGluc2VydCBpdCBmb3IgdGhlIGZpcnN0IHRpbWUgKi8KKyAgICAgICAgICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHJ0eC0+c2VxbnVtX3NzcmMxX21hcCwKKyAgICAgICAgICAgICAgICBHVUlOVF9UT19QT0lOVEVSIChzZXFudW0pLAorICAgICAgICAgICAgICAgIHNzcmNfYXNzb2NfbmV3IChzc3JjLCBydHgtPmxhc3RfdGltZSkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0eCwgInBhY2tldCBudW1iZXIgJXUgb2YgbWFzdGVyIHN0cmVhbSAlWCIKKyAgICAgICAgICAgICIgbmVlZHMgdG8gYmUgcmV0cmFuc21pdHRlZCIsIHNlcW51bSwgc3NyYyk7CisKKyAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7CisgICAgICB9CisKKyAgICAgIC8qIFRyYW5zZmVyIGV2ZW50IHVwc3RyZWFtIHNvIHRoYXQgdGhlIHJlcXVlc3QgY2FuIGFjdXRhbGx5IGJ5IHRyYW5zbGF0ZWQKKyAgICAgICAqIHRocm91Z2ggZ3N0cnRwc2Vzc2lvbiB0aHJvdWdoIHRoZSBuZXR3b3JrICovCisgICAgICByZXMgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKKy8qIENvcHkgZml4ZWQgaGVhZGVyIGFuZCBleHRlbnNpb24uIFJlcGxhY2UgY3VycmVudCBzc3JjIGJ5IHNzcmMxLAorICogcmVtb3ZlIE9TTiBhbmQgcmVwbGFjZSBjdXJyZW50IHNlcSBudW0gYnkgT1NOLgorICogQ29weSBtZW1vcnkgdG8gYXZvaWQgdG8gbWFudWFsbHkgY29weSBlYWNoIHJ0cCBidWZmZXIgZmllbGQuCisgKi8KK3N0YXRpYyBHc3RCdWZmZXIgKgorX2dzdF9ydHBfYnVmZmVyX25ld19mcm9tX3J0eCAoR3N0UlRQQnVmZmVyICogcnRwLCBndWludDMyIHNzcmMxLAorICAgIGd1aW50MTYgb3JpZ25fc2VxbnVtLCBndWludDggb3JpZ2luX3BheWxvYWRfdHlwZSkKK3sKKyAgR3N0TWVtb3J5ICptZW0gPSBOVUxMOworICBHc3RSVFBCdWZmZXIgbmV3X3J0cCA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisgIEdzdEJ1ZmZlciAqbmV3X2J1ZmZlciA9IGdzdF9idWZmZXJfbmV3ICgpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ3VpbnQgcGF5bG9hZF9sZW4gPSAwOworCisgIC8qIGNvcHkgZml4ZWQgaGVhZGVyICovCisgIG1lbSA9IGdzdF9tZW1vcnlfY29weSAocnRwLT5tYXBbMF0ubWVtb3J5LAorICAgICAgKGd1aW50OCAqKSBydHAtPmRhdGFbMF0gLSBydHAtPm1hcFswXS5kYXRhLCBydHAtPnNpemVbMF0pOworICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKG5ld19idWZmZXIsIG1lbSk7CisKKyAgLyogY29weSBleHRlbnNpb24gaWYgYW55ICovCisgIGlmIChydHAtPnNpemVbMV0pIHsKKyAgICBtZW0gPSBnc3RfbWVtb3J5X2NvcHkgKHJ0cC0+bWFwWzFdLm1lbW9yeSwKKyAgICAgICAgKGd1aW50OCAqKSBydHAtPmRhdGFbMV0gLSBydHAtPm1hcFsxXS5kYXRhLCBydHAtPnNpemVbMV0pOworICAgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAobmV3X2J1ZmZlciwgbWVtKTsKKyAgfQorCisgIC8qIGNvcHkgcGF5bG9hZCBhbmQgcmVtb3ZlIE9TTiAqLworICBwYXlsb2FkX2xlbiA9IHJ0cC0+c2l6ZVsyXSAtIDI7CisgIG1lbSA9IGdzdF9hbGxvY2F0b3JfYWxsb2MgKE5VTEwsIHBheWxvYWRfbGVuLCBOVUxMKTsKKworICBnc3RfbWVtb3J5X21hcCAobWVtLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaWYgKHJ0cC0+c2l6ZVsyXSkKKyAgICBtZW1jcHkgKG1hcC5kYXRhLCAoZ3VpbnQ4ICopIHJ0cC0+ZGF0YVsyXSArIDIsIHBheWxvYWRfbGVuKTsKKyAgZ3N0X21lbW9yeV91bm1hcCAobWVtLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl9hcHBlbmRfbWVtb3J5IChuZXdfYnVmZmVyLCBtZW0pOworCisgIC8qIHRoZSBzZW5kZXIgYWx3YXlzIGNvbnN0cnVjdHMgcnR4IHBhY2tldHMgd2l0aG91dCBwYWRkaW5nLAorICAgKiBCdXQgdGhlIHJlY2VpdmVyIGNhbiBzdGlsbCByZWNlaXZlIHJ0eCBwYWNrZXRzIHdpdGggcGFkZGluZy4KKyAgICogU28ganVzdCBjb3B5IGl0LgorICAgKi8KKyAgaWYgKHJ0cC0+c2l6ZVszXSkgeworICAgIGd1aW50IHBhZF9sZW4gPSBydHAtPnNpemVbM107CisKKyAgICBtZW0gPSBnc3RfYWxsb2NhdG9yX2FsbG9jIChOVUxMLCBwYWRfbGVuLCBOVUxMKTsKKworICAgIGdzdF9tZW1vcnlfbWFwIChtZW0sICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgIG1hcC5kYXRhW3BhZF9sZW4gLSAxXSA9IHBhZF9sZW47CisgICAgZ3N0X21lbW9yeV91bm1hcCAobWVtLCAmbWFwKTsKKworICAgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAobmV3X2J1ZmZlciwgbWVtKTsKKyAgfQorCisgIC8qIHNldCBzc3JjIGFuZCBzZXEgbnVtICovCisgIGdzdF9ydHBfYnVmZmVyX21hcCAobmV3X2J1ZmZlciwgR1NUX01BUF9XUklURSwgJm5ld19ydHApOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfc3NyYyAoJm5ld19ydHAsIHNzcmMxKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3NlcSAoJm5ld19ydHAsIG9yaWduX3NlcW51bSk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9wYXlsb2FkX3R5cGUgKCZuZXdfcnRwLCBvcmlnaW5fcGF5bG9hZF90eXBlKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZuZXdfcnRwKTsKKworICBnc3RfYnVmZmVyX2NvcHlfaW50byAobmV3X2J1ZmZlciwgcnRwLT5idWZmZXIsCisgICAgICBHU1RfQlVGRkVSX0NPUFlfRkxBR1MgfCBHU1RfQlVGRkVSX0NPUFlfVElNRVNUQU1QUywgMCwgLTEpOworICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChuZXdfYnVmZmVyLCBHU1RfUlRQX0JVRkZFUl9GTEFHX1JFVFJBTlNNSVNTSU9OKTsKKworICByZXR1cm4gbmV3X2J1ZmZlcjsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfcnR4X3JlY2VpdmVfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJ0cFJ0eFJlY2VpdmUgKnJ0eCA9IEdTVF9SVFBfUlRYX1JFQ0VJVkUgKHBhcmVudCk7CisgIEdzdFJUUEJ1ZmZlciBydHAgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RCdWZmZXIgKm5ld19idWZmZXIgPSBOVUxMOworICBndWludDMyIHNzcmMgPSAwOworICBncG9pbnRlciBzc3JjMSA9IDA7CisgIGd1aW50MzIgc3NyYzIgPSAwOworICBndWludDE2IHNlcW51bSA9IDA7CisgIGd1aW50MTYgb3JpZ25fc2VxbnVtID0gMDsKKyAgZ3VpbnQ4IHBheWxvYWRfdHlwZSA9IDA7CisgIGdwb2ludGVyIHBheWxvYWQgPSBOVUxMOworICBndWludDggb3JpZ2luX3BheWxvYWRfdHlwZSA9IDA7CisgIGdib29sZWFuIGlzX3J0eDsKKyAgZ2Jvb2xlYW4gZHJvcCA9IEZBTFNFOworCisgIC8qIG1hcCBjdXJyZW50IHJ0cCBwYWNrZXQgdG8gcGFyc2UgaXRzIGhlYWRlciAqLworICBpZiAoIWdzdF9ydHBfYnVmZmVyX21hcCAoYnVmZmVyLCBHU1RfTUFQX1JFQUQsICZydHApKQorICAgIGdvdG8gaW52YWxpZF9idWZmZXI7CisKKyAgc3NyYyA9IGdzdF9ydHBfYnVmZmVyX2dldF9zc3JjICgmcnRwKTsKKyAgc2VxbnVtID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAoJnJ0cCk7CisgIHBheWxvYWRfdHlwZSA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3R5cGUgKCZydHApOworCisgIC8qIGNoZWNrIGlmIHdlIGhhdmUgYSByZXRyYW5zbWlzc2lvbiBwYWNrZXQgKHRoaXMgaW5mb3JtYXRpb24gY29tZXMgZnJvbSBTRFApICovCisgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKworICBpc19ydHggPQorICAgICAgZ19oYXNoX3RhYmxlX2xvb2t1cF9leHRlbmRlZCAocnR4LT5ydHhfcHRfbWFwLAorICAgICAgR1VJTlRfVE9fUE9JTlRFUiAocGF5bG9hZF90eXBlKSwgTlVMTCwgTlVMTCk7CisKKyAgaWYgKGlzX3J0eCkgeworICAgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisKKyAgICBpZiAoIXBheWxvYWQgfHwgZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuICgmcnRwKSA8IDIpIHsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHgpOworICAgICAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworICAgICAgZ290byBpbnZhbGlkX2J1ZmZlcjsKKyAgICB9CisgIH0KKworICBydHgtPmxhc3RfdGltZSA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworCisgIGlmIChnX2hhc2hfdGFibGVfc2l6ZSAocnR4LT5zZXFudW1fc3NyYzFfbWFwKSA+IDApIHsKKyAgICBHSGFzaFRhYmxlSXRlciBpdGVyOworICAgIGdwb2ludGVyIGtleSwgdmFsdWU7CisKKyAgICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaXRlciwgcnR4LT5zZXFudW1fc3NyYzFfbWFwKTsKKyAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJml0ZXIsICZrZXksICZ2YWx1ZSkpIHsKKyAgICAgIFNzcmNBc3NvYyAqYXNzb2MgPSB2YWx1ZTsKKworICAgICAgLyogcmVtb3ZlIGFzc29jaWF0aW9uIHJlcXVlc3QgaWYgaXQgaXMgdG9vIG9sZCAqLworICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChydHgtPmxhc3RfdGltZSkgJiYKKyAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoYXNzb2MtPnRpbWUpICYmCisgICAgICAgICAgYXNzb2MtPnRpbWUgKyBBU1NPQ19USU1FT1VUIDwgcnR4LT5sYXN0X3RpbWUpIHsKKyAgICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfcmVtb3ZlICgmaXRlcik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogaWYgdGhlIGN1cnJlbnQgcGFja2V0IGlzIGZyb20gYSByZXRyYW5zbWlzc2lvbiBzdHJlYW0gKi8KKyAgaWYgKGlzX3J0eCkgeworICAgIC8qIGluY3JlYXNlIG91ciBzdGF0aXN0aWMgKi8KKyAgICArK3J0eC0+bnVtX3J0eF9wYWNrZXRzOworCisgICAgLyogcmVhZCBPU04gaW4gdGhlIHJ0eCBwYXlsb2FkICovCisgICAgb3JpZ25fc2VxbnVtID0gR1NUX1JFQURfVUlOVDE2X0JFIChnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCkpOworICAgIG9yaWdpbl9wYXlsb2FkX3R5cGUgPQorICAgICAgICBHUE9JTlRFUl9UT19VSU5UIChnX2hhc2hfdGFibGVfbG9va3VwIChydHgtPnJ0eF9wdF9tYXAsCisgICAgICAgICAgICBHVUlOVF9UT19QT0lOVEVSIChwYXlsb2FkX3R5cGUpKSk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHgsICJHb3QgcnR4IHBhY2tldDogcnR4IHNlcW51bSAldSwgcnR4IHNzcmMgJVgsICIKKyAgICAgICAgInJ0eCBwdCAldSwgb3JpZyBzZXFudW0gJXUsIG9yaWcgcHQgJXUiLCBzZXFudW0sIHNzcmMsIHBheWxvYWRfdHlwZSwKKyAgICAgICAgb3JpZ25fc2VxbnVtLCBvcmlnaW5fcGF5bG9hZF90eXBlKTsKKworICAgIC8qIGZpcnN0IHdlIGNoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhc3NvY2lhdGVkIHRoaXMgcmV0cmFuc21pc3Npb24gc3RyZWFtCisgICAgICogdG8gYSBtYXN0ZXIgc3RyZWFtICovCisgICAgaWYgKGdfaGFzaF90YWJsZV9sb29rdXBfZXh0ZW5kZWQgKHJ0eC0+c3NyYzJfc3NyYzFfbWFwLAorICAgICAgICAgICAgR1VJTlRfVE9fUE9JTlRFUiAoc3NyYyksIE5VTEwsICZzc3JjMSkpIHsKKyAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0eCwKKyAgICAgICAgICAicGFja2V0IGlzIGZyb20gcmV0cmFuc21pc3Npb24gc3RyZWFtICVYIGFscmVhZHkgYXNzb2NpYXRlZCB0byAiCisgICAgICAgICAgIm1hc3RlciBzdHJlYW0gJVgiLCBzc3JjLCBHUE9JTlRFUl9UT19VSU5UIChzc3JjMSkpOworICAgICAgc3NyYzIgPSBzc3JjOworICAgIH0gZWxzZSB7CisgICAgICBTc3JjQXNzb2MgKmFzc29jOworCisgICAgICAvKiB0aGUgY3VycmVudCByZXRyYW5zbWl0dGVkIHBhY2tldCBoYXMgaXRzIHJ0eCBzdHJlYW0gbm90IGFscmVhZHkKKyAgICAgICAqIGFzc29jaWF0ZWQgdG8gYSBtYXN0ZXIgc3RyZWFtLCBzbyByZXRyaWV2ZSBpdCBmcm9tIG91ciByZXF1ZXN0CisgICAgICAgKiBoaXN0b3J5ICovCisgICAgICBpZiAoZ19oYXNoX3RhYmxlX2xvb2t1cF9leHRlbmRlZCAocnR4LT5zZXFudW1fc3NyYzFfbWFwLAorICAgICAgICAgICAgICBHVUlOVF9UT19QT0lOVEVSIChvcmlnbl9zZXFudW0pLCBOVUxMLCAoZ3BvaW50ZXIgKikgJiBhc3NvYykpIHsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHJ0eCwKKyAgICAgICAgICAgICJhc3NvY2lhdGluZyByZXRyYW5zbWl0dGVkIHN0cmVhbSAlWCB0byBtYXN0ZXIgc3RyZWFtICVYIHRoYW5rcyAiCisgICAgICAgICAgICAidG8gcnR4IHBhY2tldCAldSAob3JpZyBzZXFudW0gJXUpIiwgc3NyYywgYXNzb2MtPnNzcmMsIHNlcW51bSwKKyAgICAgICAgICAgIG9yaWduX3NlcW51bSk7CisgICAgICAgIHNzcmMxID0gR1VJTlRfVE9fUE9JTlRFUiAoYXNzb2MtPnNzcmMpOworICAgICAgICBzc3JjMiA9IHNzcmM7CisKKyAgICAgICAgLyoganVzdCBwdXQgYSBndWFyZCAqLworICAgICAgICBpZiAoR1BPSU5URVJfVE9fVUlOVCAoc3NyYzEpID09IHNzcmMyKQorICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnR4LCAiUlRYIHJlY2VpdmVyIHNzcmMyX3NzcmMxX21hcCBiYWQgc3RhdGUsICIKKyAgICAgICAgICAgICAgIm1hc3RlciBhbmQgcnR4IFNTUkNzIGFyZSB0aGUgc2FtZSAoJVgpXG4iLCBzc3JjKTsKKworICAgICAgICAvKiBmcmVlIHRoZSBzcG90IHNvIHRoYXQgdGhpcyBzZXFudW0gY2FuIGJlIHVzZWQgdG8gZG8gYW5vdGhlcgorICAgICAgICAgKiBhc3NvY2lhdGlvbiAqLworICAgICAgICBnX2hhc2hfdGFibGVfcmVtb3ZlIChydHgtPnNlcW51bV9zc3JjMV9tYXAsCisgICAgICAgICAgICBHVUlOVF9UT19QT0lOVEVSIChvcmlnbl9zZXFudW0pKTsKKworICAgICAgICAvKiBhY3R1YWxseSBkbyB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBydHggc3RyZWFtIGFuZCBtYXN0ZXIgc3RyZWFtICovCisgICAgICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHJ0eC0+c3NyYzJfc3NyYzFfbWFwLCBHVUlOVF9UT19QT0lOVEVSIChzc3JjMiksCisgICAgICAgICAgICBzc3JjMSk7CisKKyAgICAgICAgLyogYWxzbyBkbyB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBtYXN0ZXIgc3RyZWFtIGFuZCBydHggc3RyZWFtCisgICAgICAgICAqIGV2ZXJ5IHNzcmMgYXJlIHVuaXF1ZSBzbyB3ZSBjYW4gdXNlIHRoZSBzYW1lIGhhc2ggdGFibGUKKyAgICAgICAgICogZm9yIGJvdGggcmV0cmlldmluZyB0aGUgc3NyYzEgZnJvbSBzc3JjMiBhbmQgYWxzbyBzc3JjMiBmcm9tIHNzcmMxCisgICAgICAgICAqLworICAgICAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChydHgtPnNzcmMyX3NzcmMxX21hcCwgc3NyYzEsCisgICAgICAgICAgICBHVUlOVF9UT19QT0lOVEVSIChzc3JjMikpOworCisgICAgICB9IGVsc2UgeworICAgICAgICAvKiB3ZSBhcmUgbm90IGFibGUgdG8gYXNzb2NpYXRlIHRoaXMgcnR4IHBhY2tldCB3aXRoIGEgbWFzdGVyIHN0cmVhbSAqLworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHJ0eCwKKyAgICAgICAgICAgICJkcm9wcGluZyBydHggcGFja2V0ICV1IGJlY2F1c2UgaXRzIG9yaWcgc2VxbnVtICgldSkgaXMgbm90IGluIG91ciIKKyAgICAgICAgICAgICIgcGVuZGluZyByZXRyYW5zbWlzc2lvbiByZXF1ZXN0cyIsIHNlcW51bSwgb3JpZ25fc2VxbnVtKTsKKyAgICAgICAgZHJvcCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogaWYgbm90IGRyb3BwZWQgdGhlIHBhY2tldCB3YXMgc3VjY2Vzc2Z1bGx5IGFzc29jaWF0ZWQgKi8KKyAgaWYgKGlzX3J0eCAmJiAhZHJvcCkKKyAgICArK3J0eC0+bnVtX3J0eF9hc3NvY19wYWNrZXRzOworCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHgpOworCisgIC8qIGp1c3QgZHJvcCB0aGUgcGFja2V0IGlmIHRoZSBhc3NvY2lhdGlvbiBjb3VsZCBub3QgaGF2ZSBiZWVuIG1hZGUgKi8KKyAgaWYgKGRyb3ApIHsKKyAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICAvKiBjcmVhdGUgdGhlIHJldHJhbnNtaXNzaW9uIHBhY2tldCAqLworICBpZiAoaXNfcnR4KQorICAgIG5ld19idWZmZXIgPQorICAgICAgICBfZ3N0X3J0cF9idWZmZXJfbmV3X2Zyb21fcnR4ICgmcnRwLCBHUE9JTlRFUl9UT19VSU5UIChzc3JjMSksCisgICAgICAgIG9yaWduX3NlcW51bSwgb3JpZ2luX3BheWxvYWRfdHlwZSk7CisKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIC8qIHB1c2ggdGhlIHBhY2tldCAqLworICBpZiAoaXNfcnR4KSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICBHU1RfTE9HX09CSkVDVCAocnR4LCAicHVzaGluZyBwYWNrZXQgc2VxbnVtOiV1IGZyb20gcmVzdHJhbnNtaXNzaW9uICIKKyAgICAgICAgInN0cmVhbSBzc3JjOiAlWCAobWFzdGVyIHNzcmMgJVgpIiwgb3JpZ25fc2VxbnVtLCBzc3JjMiwKKyAgICAgICAgR1BPSU5URVJfVE9fVUlOVCAoc3NyYzEpKTsKKyAgICByZXQgPSBnc3RfcGFkX3B1c2ggKHJ0eC0+c3JjcGFkLCBuZXdfYnVmZmVyKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfVFJBQ0VfT0JKRUNUIChydHgsICJwdXNoaW5nIHBhY2tldCBzZXFudW06JXUgZnJvbSBtYXN0ZXIgc3RyZWFtICIKKyAgICAgICAgInNzcmM6ICVYIiwgc2VxbnVtLCBzc3JjKTsKKyAgICByZXQgPSBnc3RfcGFkX3B1c2ggKHJ0eC0+c3JjcGFkLCBidWZmZXIpOworICB9CisKKyAgcmV0dXJuIHJldDsKKworaW52YWxpZF9idWZmZXI6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChydHgsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksCisgICAgICAgICgiUmVjZWl2ZWQgaW52YWxpZCBSVFAgcGF5bG9hZCwgZHJvcHBpbmciKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcnR4X3JlY2VpdmVfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cFJ0eFJlY2VpdmUgKnJ0eCA9IEdTVF9SVFBfUlRYX1JFQ0VJVkUgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1BBWUxPQURfVFlQRV9NQVA6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHJ0eCk7CisgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIHJ0eC0+cnR4X3B0X21hcF9zdHJ1Y3R1cmUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTlVNX1JUWF9SRVFVRVNUUzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHgtPm51bV9ydHhfcmVxdWVzdHMpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTlVNX1JUWF9QQUNLRVRTOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChydHgpOworICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0eC0+bnVtX3J0eF9wYWNrZXRzKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05VTV9SVFhfQVNTT0NfUEFDS0VUUzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHgtPm51bV9ydHhfYXNzb2NfcGFja2V0cyk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitzdHJ1Y3R1cmVfdG9faGFzaF90YWJsZV9pbnYgKEdRdWFyayBmaWVsZF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsCisgICAgZ3BvaW50ZXIgaGFzaCkKK3sKKyAgY29uc3QgZ2NoYXIgKmZpZWxkX3N0cjsKKyAgZ3VpbnQgZmllbGRfdWludDsKKyAgZ3VpbnQgdmFsdWVfdWludDsKKworICBmaWVsZF9zdHIgPSBnX3F1YXJrX3RvX3N0cmluZyAoZmllbGRfaWQpOworICBmaWVsZF91aW50ID0gYXRvaSAoZmllbGRfc3RyKTsKKyAgdmFsdWVfdWludCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoKEdIYXNoVGFibGUgKikgaGFzaCwgR1VJTlRfVE9fUE9JTlRFUiAodmFsdWVfdWludCksCisgICAgICBHVUlOVF9UT19QT0lOVEVSIChmaWVsZF91aW50KSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3J0eF9yZWNlaXZlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSdHBSdHhSZWNlaXZlICpydHggPSBHU1RfUlRQX1JUWF9SRUNFSVZFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QQVlMT0FEX1RZUEVfTUFQOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChydHgpOworICAgICAgaWYgKHJ0eC0+cnR4X3B0X21hcF9zdHJ1Y3R1cmUpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocnR4LT5ydHhfcHRfbWFwX3N0cnVjdHVyZSk7CisgICAgICBydHgtPnJ0eF9wdF9tYXBfc3RydWN0dXJlID0gZ192YWx1ZV9kdXBfYm94ZWQgKHZhbHVlKTsKKyAgICAgIGdfaGFzaF90YWJsZV9yZW1vdmVfYWxsIChydHgtPnJ0eF9wdF9tYXApOworICAgICAgZ3N0X3N0cnVjdHVyZV9mb3JlYWNoIChydHgtPnJ0eF9wdF9tYXBfc3RydWN0dXJlLAorICAgICAgICAgIHN0cnVjdHVyZV90b19oYXNoX3RhYmxlX2ludiwgcnR4LT5ydHhfcHRfbWFwKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfcnR4X3JlY2VpdmVfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdFJ0cFJ0eFJlY2VpdmUgKnJ0eDsKKworICBydHggPSBHU1RfUlRQX1JUWF9SRUNFSVZFIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPQorICAgICAgR1NUX0VMRU1FTlRfQ0xBU1MgKGdzdF9ydHBfcnR4X3JlY2VpdmVfcGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlCisgICAgICAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfcnR4X3JlY2VpdmVfcmVzZXQgKHJ0eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9ydHhfcmVjZWl2ZV9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3J0cF9ydHhfcmVjZWl2ZV9kZWJ1ZywgInJ0cHJ0eHJlY2VpdmUiLCAwLAorICAgICAgInJ0cCByZXRyYW5zbWlzc2lvbiByZWNlaXZlciIpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwcnR4cmVjZWl2ZSIsIEdTVF9SQU5LX05PTkUsCisgICAgICBHU1RfVFlQRV9SVFBfUlRYX1JFQ0VJVkUpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5oIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4cmVjZWl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNmM0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBydHhyZWNlaXZlLmgKQEAgLTAsMCArMSw4MCBAQAorLyogUlRQIFJldHJhbnNtaXNzaW9uIHJlY2VpdmVyIGVsZW1lbnQgZm9yIEdTdHJlYW1lcgorICoKKyAqIGdzdHJ0cHJ0eHJlY2VpdmUuaDoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ29sbGFib3JhIEx0ZC4KKyAqICAgQGF1dGhvciBKdWxpZW4gSXNvcmNlIDxqdWxpZW4uaXNvcmNlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9SVFhfUkVDRUlWRV9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1JUWF9SRUNFSVZFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1JUWF9SRUNFSVZFIChnc3RfcnRwX3J0eF9yZWNlaXZlX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfUlRYX1JFQ0VJVkUob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX1JUWF9SRUNFSVZFLCBHc3RSdHBSdHhSZWNlaXZlKSkKKyNkZWZpbmUgR1NUX1JUUF9SVFhfUkVDRUlWRV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX1JUWF9SRUNFSVZFLCBHc3RSdHBSdHhSZWNlaXZlQ2xhc3MpKQorI2RlZmluZSBHU1RfUlRQX1JUWF9SRUNFSVZFX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfUlRQX1JUWF9SRUNFSVZFLCBHc3RSdHBSdHhSZWNlaXZlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1JUWF9SRUNFSVZFKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUUF9SVFhfUkVDRUlWRSkpCisjZGVmaW5lIEdTVF9JU19SVFBfUlRYX1JFQ0VJVkVfQ0xBU1Mob2JqKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfUlRYX1JFQ0VJVkUpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFJ0eFJlY2VpdmUgR3N0UnRwUnR4UmVjZWl2ZTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBSdHhSZWNlaXZlQ2xhc3MgR3N0UnRwUnR4UmVjZWl2ZUNsYXNzOworCitzdHJ1Y3QgX0dzdFJ0cFJ0eFJlY2VpdmUKK3sKKyAgR3N0RWxlbWVudCBlbGVtZW50OworCisgIC8qIHBhZCAqLworICBHc3RQYWQgKnNpbmtwYWQ7CisgIEdzdFBhZCAqc3JjcGFkOworCisgIC8qIHJldHJpZXZlIGFzc29jaWF0ZWQgbWFzdGVyIHN0cmVhbSBmcm9tIHJ0eCBzdHJlYW0KKyAgICogaXQgYWxzbyB3b3JrcyB0byByZXRyaWV2ZSBydHggc3RyZWFtIGZyb20gbWFzdGVyIHN0cmVhbQorICAgKiBhcyB3ZSBtYWtlIHN1cmUgYWxsIHNzcmMgYXJlIHVuaXF1ZSAqLworICBHSGFzaFRhYmxlICpzc3JjMl9zc3JjMV9tYXA7CisKKyAgLyogY29udGFpbnMgc2VxbnVtIG9mIHJlcXVlc3QgcGFja2V0cyBvZiB3aG9tIHRoZWlyIHNzcmMgaGF2ZQorICAgKiBub3QgYmVlbiBhc3NvY2lhdGVkIHRvIGEgcnR4IHN0cmVhbSB5ZXQgKi8KKyAgR0hhc2hUYWJsZSAqc2VxbnVtX3NzcmMxX21hcDsKKworICAvKiBydHggcHQgKHVpbnQpIC0+IG9yaWdpbiBwdCAodWludCkgKi8KKyAgR0hhc2hUYWJsZSAqcnR4X3B0X21hcDsKKyAgLyogb3JpZ2luIHB0IChzdHJpbmcpIC0+IHJ0eCBwdCAodWludCkgKi8KKyAgR3N0U3RydWN0dXJlICpydHhfcHRfbWFwX3N0cnVjdHVyZTsKKworICAvKiBzdGF0aXN0aWNzICovCisgIGd1aW50IG51bV9ydHhfcmVxdWVzdHM7CisgIGd1aW50IG51bV9ydHhfcGFja2V0czsKKyAgZ3VpbnQgbnVtX3J0eF9hc3NvY19wYWNrZXRzOworCisgIEdzdENsb2NrVGltZSBsYXN0X3RpbWU7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cFJ0eFJlY2VpdmVDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworCitHVHlwZSBnc3RfcnRwX3J0eF9yZWNlaXZlX2dldF90eXBlICh2b2lkKTsKK2dib29sZWFuIGdzdF9ydHBfcnR4X3JlY2VpdmVfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19HU1RfUlRQX1JUWF9SRUNFSVZFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMjlkODQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBydHhzZW5kLmMKQEAgLTAsMCArMSw5NDggQEAKKy8qIFJUUCBSZXRyYW5zbWlzc2lvbiBzZW5kZXIgZWxlbWVudCBmb3IgR1N0cmVhbWVyCisgKgorICogZ3N0cnRwcnR4c2VuZC5jOgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBDb2xsYWJvcmEgTHRkLgorICogICBAYXV0aG9yIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cHJ0eHNlbmQKKyAqCisgKiBTZWUgI0dzdFJ0cFJ0eFJlY2VpdmUgZm9yIGV4YW1wbGVzCisgKiAKKyAqIFRoZSBwdXJwb3NlIG9mIHRoZSBzZW5kZXIgUlRYIG9iamVjdCBpcyB0byBrZWVwIGEgaGlzdG9yeSBvZiBSVFAgcGFja2V0cyB1cAorICogdG8gYSBjb25maWd1cmFibGUgbGltaXQgKG1heC1zaXplLXRpbWUgb3IgbWF4LXNpemUtcGFja2V0cykuIEl0IHdpbGwgbGlzdGVuCisgKiBmb3IgdXBzdHJlYW0gY3VzdG9tIHJldHJhbnNtaXNzaW9uIGV2ZW50cyAoR3N0UlRQUmV0cmFuc21pc3Npb25SZXF1ZXN0KSB0aGF0CisgKiBjb21lcyBmcm9tIGRvd25zdHJlYW0gKCNHc3RSdHBTZXNzaW9uKS4gV2hlbiByZWNlaXZpbmcgYSByZXF1ZXN0IGl0IHdpbGwKKyAqIGxvb2sgdXAgdGhlIHJlcXVlc3RlZCBzZXFudW0gaW4gaXRzIGxpc3Qgb2Ygc3RvcmVkIHBhY2tldHMuIElmIHRoZSBwYWNrZXQKKyAqIGlzIGF2YWlsYWJsZSwgaXQgd2lsbCBjcmVhdGUgYSBSVFggcGFja2V0IGFjY29yZGluZyB0byBSRkMgNDU4OCBhbmQgc2VuZAorICogdGhpcyBhcyBhbiBhdXhpbGlhcnkgc3RyZWFtLiBSVFggaXMgU1NSQy1tdWx0aXBsZXhlZAorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZ3N0cnRwcnR4c2VuZC5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfcnRwX3J0eF9zZW5kX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9ydHBfcnR4X3NlbmRfZGVidWcKKworI2RlZmluZSBERUZBVUxUX1JUWF9QQVlMT0FEX1RZUEUgMAorI2RlZmluZSBERUZBVUxUX01BWF9TSVpFX1RJTUUgICAgMAorI2RlZmluZSBERUZBVUxUX01BWF9TSVpFX1BBQ0tFVFMgMTAwCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX1NTUkNfTUFQLAorICBQUk9QX1BBWUxPQURfVFlQRV9NQVAsCisgIFBST1BfTUFYX1NJWkVfVElNRSwKKyAgUFJPUF9NQVhfU0laRV9QQUNLRVRTLAorICBQUk9QX05VTV9SVFhfUkVRVUVTVFMsCisgIFBST1BfTlVNX1JUWF9QQUNLRVRTCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCwgIiAiY2xvY2stcmF0ZSA9IChpbnQpIFsxLCBNQVhdIikKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9ydHhfc2VuZF9xdWV1ZV9jaGVja19mdWxsIChHc3REYXRhUXVldWUgKiBxdWV1ZSwKKyAgICBndWludCB2aXNpYmxlLCBndWludCBieXRlcywgZ3VpbnQ2NCB0aW1lLCBncG9pbnRlciBjaGVja2RhdGEpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9ydHhfc2VuZF9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfcnR4X3NlbmRfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX3J0eF9zZW5kX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9ydHhfc2VuZF9jaGFpbl9saXN0IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXJMaXN0ICogbGlzdCk7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfcnR4X3NlbmRfc3JjX2xvb3AgKEdzdFJ0cFJ0eFNlbmQgKiBydHgpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfcnR4X3NlbmRfYWN0aXZhdGVfbW9kZSAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UGFkTW9kZSBtb2RlLCBnYm9vbGVhbiBhY3RpdmUpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9ydHhfc2VuZF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKgorICAgIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX3J0eF9zZW5kX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfcnR4X3NlbmRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9ydHhfc2VuZF9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK0dfREVGSU5FX1RZUEUgKEdzdFJ0cFJ0eFNlbmQsIGdzdF9ydHBfcnR4X3NlbmQsIEdTVF9UWVBFX0VMRU1FTlQpOworCit0eXBlZGVmIHN0cnVjdAoreworICBndWludDE2IHNlcW51bTsKKyAgZ3VpbnQzMiB0aW1lc3RhbXA7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworfSBCdWZmZXJRdWV1ZUl0ZW07CisKK3N0YXRpYyB2b2lkCitidWZmZXJfcXVldWVfaXRlbV9mcmVlIChCdWZmZXJRdWV1ZUl0ZW0gKiBpdGVtKQoreworICBnc3RfYnVmZmVyX3VucmVmIChpdGVtLT5idWZmZXIpOworICBnX3NsaWNlX2ZyZWUgKEJ1ZmZlclF1ZXVlSXRlbSwgaXRlbSk7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGd1aW50MzIgcnR4X3NzcmM7CisgIGd1aW50MTYgc2VxbnVtX2Jhc2UsIG5leHRfc2VxbnVtOworICBnaW50IGNsb2NrX3JhdGU7CisKKyAgLyogaGlzdG9yeSBvZiBydHAgcGFja2V0cyAqLworICBHU2VxdWVuY2UgKnF1ZXVlOworfSBTU1JDUnR4RGF0YTsKKworc3RhdGljIFNTUkNSdHhEYXRhICoKK3NzcmNfcnR4X2RhdGFfbmV3IChndWludDMyIHJ0eF9zc3JjKQoreworICBTU1JDUnR4RGF0YSAqZGF0YSA9IGdfc2xpY2VfbmV3MCAoU1NSQ1J0eERhdGEpOworCisgIGRhdGEtPnJ0eF9zc3JjID0gcnR4X3NzcmM7CisgIGRhdGEtPm5leHRfc2VxbnVtID0gZGF0YS0+c2VxbnVtX2Jhc2UgPSBnX3JhbmRvbV9pbnRfcmFuZ2UgKDAsIEdfTUFYVUlOVDE2KTsKKyAgZGF0YS0+cXVldWUgPSBnX3NlcXVlbmNlX25ldyAoKEdEZXN0cm95Tm90aWZ5KSBidWZmZXJfcXVldWVfaXRlbV9mcmVlKTsKKworICByZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQKK3NzcmNfcnR4X2RhdGFfZnJlZSAoU1NSQ1J0eERhdGEgKiBkYXRhKQoreworICBnX3NlcXVlbmNlX2ZyZWUgKGRhdGEtPnF1ZXVlKTsKKyAgZ19zbGljZV9mcmVlIChTU1JDUnR4RGF0YSwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3J0eF9zZW5kX2NsYXNzX2luaXQgKEdzdFJ0cFJ0eFNlbmRDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9ydHhfc2VuZF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9ydHBfcnR4X3NlbmRfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9ydHBfcnR4X3NlbmRfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TU1JDX01BUCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoInNzcmMtbWFwIiwgIlNTUkMgTWFwIiwKKyAgICAgICAgICAiTWFwIG9mIFNTUkNzIHRvIHRoZWlyIHJldHJhbnNtaXNzaW9uIFNTUkNzIGZvciBTU1JDLW11bHRpcGxleGVkIG1vZGUiCisgICAgICAgICAgIiAoZGVmYXVsdCA9IHJhbmRvbSkiLCBHU1RfVFlQRV9TVFJVQ1RVUkUsCisgICAgICAgICAgR19QQVJBTV9XUklUQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BBWUxPQURfVFlQRV9NQVAsCisgICAgICBnX3BhcmFtX3NwZWNfYm94ZWQgKCJwYXlsb2FkLXR5cGUtbWFwIiwgIlBheWxvYWQgVHlwZSBNYXAiLAorICAgICAgICAgICJNYXAgb2Ygb3JpZ2luYWwgcGF5bG9hZCB0eXBlcyB0byB0aGVpciByZXRyYW5zbWlzc2lvbiBwYXlsb2FkIHR5cGVzIiwKKyAgICAgICAgICBHU1RfVFlQRV9TVFJVQ1RVUkUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX1NJWkVfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LXNpemUtdGltZSIsICJNYXggU2l6ZSBUaW1lIiwKKyAgICAgICAgICAiQW1vdW50IG9mIG1zIHRvIHF1ZXVlICgwID0gdW5saW1pdGVkKSIsIDAsIEdfTUFYVUlOVCwKKyAgICAgICAgICBERUZBVUxUX01BWF9TSVpFX1RJTUUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX1NJWkVfUEFDS0VUUywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LXNpemUtcGFja2V0cyIsICJNYXggU2l6ZSBQYWNrZXRzIiwKKyAgICAgICAgICAiQW1vdW50IG9mIHBhY2tldHMgdG8gcXVldWUgKDAgPSB1bmxpbWl0ZWQpIiwgMCwgR19NQVhJTlQxNiwKKyAgICAgICAgICBERUZBVUxUX01BWF9TSVpFX1BBQ0tFVFMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9OVU1fUlRYX1JFUVVFU1RTLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJudW0tcnR4LXJlcXVlc3RzIiwgIk51bSBSVFggUmVxdWVzdHMiLAorICAgICAgICAgICJOdW1iZXIgb2YgcmV0cmFuc21pc3Npb24gZXZlbnRzIHJlY2VpdmVkIiwgMCwgR19NQVhVSU5ULAorICAgICAgICAgIDAsIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9OVU1fUlRYX1BBQ0tFVFMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm51bS1ydHgtcGFja2V0cyIsICJOdW0gUlRYIFBhY2tldHMiLAorICAgICAgICAgICIgTnVtYmVyIG9mIHJldHJhbnNtaXNzaW9uIHBhY2tldHMgc2VudCIsIDAsIEdfTUFYVUlOVCwKKyAgICAgICAgICAwLCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX2ZhY3RvcnkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfZmFjdG9yeSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSVFAgUmV0cmFuc21pc3Npb24gU2VuZGVyIiwgIkNvZGVjIiwKKyAgICAgICJSZXRyYW5zbWl0IFJUUCBwYWNrZXRzIHdoZW4gbmVlZGVkLCBhY2NvcmRpbmcgdG8gUkZDNDU4OCIsCisgICAgICAiSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX3J0eF9zZW5kX2NoYW5nZV9zdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3J0eF9zZW5kX3Jlc2V0IChHc3RSdHBSdHhTZW5kICogcnR4KQoreworICBHU1RfT0JKRUNUX0xPQ0sgKHJ0eCk7CisgIGdzdF9kYXRhX3F1ZXVlX2ZsdXNoIChydHgtPnF1ZXVlKTsKKyAgZ19oYXNoX3RhYmxlX3JlbW92ZV9hbGwgKHJ0eC0+c3NyY19kYXRhKTsKKyAgZ19oYXNoX3RhYmxlX3JlbW92ZV9hbGwgKHJ0eC0+cnR4X3NzcmNzKTsKKyAgcnR4LT5udW1fcnR4X3JlcXVlc3RzID0gMDsKKyAgcnR4LT5udW1fcnR4X3BhY2tldHMgPSAwOworICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcnR4X3NlbmRfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cFJ0eFNlbmQgKnJ0eCA9IEdTVF9SVFBfUlRYX1NFTkQgKG9iamVjdCk7CisKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChydHgtPnNzcmNfZGF0YSk7CisgIGdfaGFzaF90YWJsZV91bnJlZiAocnR4LT5ydHhfc3NyY3MpOworICBpZiAocnR4LT5leHRlcm5hbF9zc3JjX21hcCkKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHJ0eC0+ZXh0ZXJuYWxfc3NyY19tYXApOworICBnX2hhc2hfdGFibGVfdW5yZWYgKHJ0eC0+cnR4X3B0X21hcCk7CisgIGlmIChydHgtPnJ0eF9wdF9tYXBfc3RydWN0dXJlKQorICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocnR4LT5ydHhfcHRfbWFwX3N0cnVjdHVyZSk7CisgIGdfb2JqZWN0X3VucmVmIChydHgtPnF1ZXVlKTsKKworICBHX09CSkVDVF9DTEFTUyAoZ3N0X3J0cF9ydHhfc2VuZF9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcnR4X3NlbmRfaW5pdCAoR3N0UnRwUnR4U2VuZCAqIHJ0eCkKK3sKKyAgR3N0RWxlbWVudENsYXNzICprbGFzcyA9IEdTVF9FTEVNRU5UX0dFVF9DTEFTUyAocnR4KTsKKworICBydHgtPnNyY3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywKKyAgICAgICAgICAic3JjIiksICJzcmMiKTsKKyAgR1NUX1BBRF9TRVRfUFJPWFlfQ0FQUyAocnR4LT5zcmNwYWQpOworICBHU1RfUEFEX1NFVF9QUk9YWV9BTExPQ0FUSU9OIChydHgtPnNyY3BhZCk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChydHgtPnNyY3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX3J0eF9zZW5kX3NyY19ldmVudCkpOworICBnc3RfcGFkX3NldF9hY3RpdmF0ZW1vZGVfZnVuY3Rpb24gKHJ0eC0+c3JjcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfcnR4X3NlbmRfYWN0aXZhdGVfbW9kZSkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAocnR4KSwgcnR4LT5zcmNwYWQpOworCisgIHJ0eC0+c2lua3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywKKyAgICAgICAgICAic2luayIpLCAic2luayIpOworICBHU1RfUEFEX1NFVF9QUk9YWV9DQVBTIChydHgtPnNpbmtwYWQpOworICBHU1RfUEFEX1NFVF9QUk9YWV9BTExPQ0FUSU9OIChydHgtPnNpbmtwYWQpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAocnR4LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfcnR4X3NlbmRfc2lua19ldmVudCkpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAocnR4LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfcnR4X3NlbmRfY2hhaW4pKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fbGlzdF9mdW5jdGlvbiAocnR4LT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfcnR4X3NlbmRfY2hhaW5fbGlzdCkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAocnR4KSwgcnR4LT5zaW5rcGFkKTsKKworICBydHgtPnF1ZXVlID0gZ3N0X2RhdGFfcXVldWVfbmV3IChnc3RfcnRwX3J0eF9zZW5kX3F1ZXVlX2NoZWNrX2Z1bGwsIE5VTEwsCisgICAgICBOVUxMLCBydHgpOworICBydHgtPnNzcmNfZGF0YSA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19kaXJlY3RfaGFzaCwgZ19kaXJlY3RfZXF1YWwsCisgICAgICBOVUxMLCAoR0Rlc3Ryb3lOb3RpZnkpIHNzcmNfcnR4X2RhdGFfZnJlZSk7CisgIHJ0eC0+cnR4X3NzcmNzID0gZ19oYXNoX3RhYmxlX25ldyAoZ19kaXJlY3RfaGFzaCwgZ19kaXJlY3RfZXF1YWwpOworICBydHgtPnJ0eF9wdF9tYXAgPSBnX2hhc2hfdGFibGVfbmV3IChnX2RpcmVjdF9oYXNoLCBnX2RpcmVjdF9lcXVhbCk7CisKKyAgcnR4LT5tYXhfc2l6ZV90aW1lID0gREVGQVVMVF9NQVhfU0laRV9USU1FOworICBydHgtPm1heF9zaXplX3BhY2tldHMgPSBERUZBVUxUX01BWF9TSVpFX1BBQ0tFVFM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3J0eF9zZW5kX3NldF9mbHVzaGluZyAoR3N0UnRwUnR4U2VuZCAqIHJ0eCwgZ2Jvb2xlYW4gZmx1c2gpCit7CisgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKyAgZ3N0X2RhdGFfcXVldWVfc2V0X2ZsdXNoaW5nIChydHgtPnF1ZXVlLCBmbHVzaCk7CisgIGdzdF9kYXRhX3F1ZXVlX2ZsdXNoIChydHgtPnF1ZXVlKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9ydHhfc2VuZF9xdWV1ZV9jaGVja19mdWxsIChHc3REYXRhUXVldWUgKiBxdWV1ZSwKKyAgICBndWludCB2aXNpYmxlLCBndWludCBieXRlcywgZ3VpbnQ2NCB0aW1lLCBncG9pbnRlciBjaGVja2RhdGEpCit7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfcnR4X2RhdGFfcXVldWVfaXRlbV9mcmVlIChncG9pbnRlciBpdGVtKQoreworICBHc3REYXRhUXVldWVJdGVtICpkYXRhID0gaXRlbTsKKyAgaWYgKGRhdGEtPm9iamVjdCkKKyAgICBnc3RfbWluaV9vYmplY3RfdW5yZWYgKGRhdGEtPm9iamVjdCk7CisgIGdfc2xpY2VfZnJlZSAoR3N0RGF0YVF1ZXVlSXRlbSwgZGF0YSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9ydHhfc2VuZF9wdXNoX291dCAoR3N0UnRwUnR4U2VuZCAqIHJ0eCwgZ3BvaW50ZXIgb2JqZWN0KQoreworICBHc3REYXRhUXVldWVJdGVtICpkYXRhOworICBnYm9vbGVhbiBzdWNjZXNzOworCisgIGRhdGEgPSBnX3NsaWNlX25ldzAgKEdzdERhdGFRdWV1ZUl0ZW0pOworICBkYXRhLT5vYmplY3QgPSBHU1RfTUlOSV9PQkpFQ1QgKG9iamVjdCk7CisgIGRhdGEtPnNpemUgPSAxOworICBkYXRhLT5kdXJhdGlvbiA9IDE7CisgIGRhdGEtPnZpc2libGUgPSBUUlVFOworICBkYXRhLT5kZXN0cm95ID0gZ3N0X3J0cF9ydHhfZGF0YV9xdWV1ZV9pdGVtX2ZyZWU7CisKKyAgc3VjY2VzcyA9IGdzdF9kYXRhX3F1ZXVlX3B1c2ggKHJ0eC0+cXVldWUsIGRhdGEpOworCisgIGlmICghc3VjY2VzcykKKyAgICBkYXRhLT5kZXN0cm95IChkYXRhKTsKKworICByZXR1cm4gc3VjY2VzczsKK30KKworc3RhdGljIGd1aW50MzIKK2dzdF9ydHBfcnR4X3NlbmRfY2hvb3NlX3NzcmMgKEdzdFJ0cFJ0eFNlbmQgKiBydHgsIGd1aW50MzIgY2hvaWNlLAorICAgIGdib29sZWFuIGNvbnNpZGVyX2Nob2ljZSkKK3sKKyAgZ3VpbnQzMiBzc3JjID0gY29uc2lkZXJfY2hvaWNlID8gY2hvaWNlIDogZ19yYW5kb21faW50ICgpOworCisgIC8qIG1ha2Ugc3VyZSB0byBiZSBkaWZmZXJlbnQgdGhhbiBhbnkgb3RoZXIgKi8KKyAgd2hpbGUgKGdfaGFzaF90YWJsZV9jb250YWlucyAocnR4LT5zc3JjX2RhdGEsIEdVSU5UX1RPX1BPSU5URVIgKHNzcmMpKSB8fAorICAgICAgZ19oYXNoX3RhYmxlX2NvbnRhaW5zIChydHgtPnJ0eF9zc3JjcywgR1VJTlRfVE9fUE9JTlRFUiAoc3NyYykpKSB7CisgICAgc3NyYyA9IGdfcmFuZG9tX2ludCAoKTsKKyAgfQorCisgIHJldHVybiBzc3JjOworfQorCitzdGF0aWMgU1NSQ1J0eERhdGEgKgorZ3N0X3J0cF9ydHhfc2VuZF9nZXRfc3NyY19kYXRhIChHc3RSdHBSdHhTZW5kICogcnR4LCBndWludDMyIHNzcmMpCit7CisgIFNTUkNSdHhEYXRhICpkYXRhOworICBndWludDMyIHJ0eF9zc3JjID0gMDsKKyAgZ2Jvb2xlYW4gY29uc2lkZXIgPSBGQUxTRTsKKworICBpZiAoR19VTkxJS0VMWSAoIWdfaGFzaF90YWJsZV9jb250YWlucyAocnR4LT5zc3JjX2RhdGEsCisgICAgICAgICAgICAgIEdVSU5UX1RPX1BPSU5URVIgKHNzcmMpKSkpIHsKKyAgICBpZiAocnR4LT5leHRlcm5hbF9zc3JjX21hcCkgeworICAgICAgZ2NoYXIgKnNzcmNfc3RyOworICAgICAgc3NyY19zdHIgPSBnX3N0cmR1cF9wcmludGYgKCIlIiBHX0dVSU5UMzJfRk9STUFULCBzc3JjKTsKKyAgICAgIGNvbnNpZGVyID0gZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAocnR4LT5leHRlcm5hbF9zc3JjX21hcCwgc3NyY19zdHIsCisgICAgICAgICAgJnJ0eF9zc3JjKTsKKyAgICAgIGdfZnJlZSAoc3NyY19zdHIpOworICAgIH0KKyAgICBydHhfc3NyYyA9IGdzdF9ydHBfcnR4X3NlbmRfY2hvb3NlX3NzcmMgKHJ0eCwgcnR4X3NzcmMsIGNvbnNpZGVyKTsKKyAgICBkYXRhID0gc3NyY19ydHhfZGF0YV9uZXcgKHJ0eF9zc3JjKTsKKyAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChydHgtPnNzcmNfZGF0YSwgR1VJTlRfVE9fUE9JTlRFUiAoc3NyYyksIGRhdGEpOworICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHJ0eC0+cnR4X3NzcmNzLCBHVUlOVF9UT19QT0lOVEVSIChydHhfc3NyYyksCisgICAgICAgIEdVSU5UX1RPX1BPSU5URVIgKHNzcmMpKTsKKyAgfSBlbHNlIHsKKyAgICBkYXRhID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAocnR4LT5zc3JjX2RhdGEsIEdVSU5UX1RPX1BPSU5URVIgKHNzcmMpKTsKKyAgfQorICByZXR1cm4gZGF0YTsKK30KKworLyogQ29weSBmaXhlZCBoZWFkZXIgYW5kIGV4dGVuc2lvbi4gQWRkIE9TTiBiZWZvcmUgdG8gY29weSBwYXlsb2FkCisgKiBDb3B5IG1lbW9yeSB0byBhdm9pZCB0byBtYW51YWxseSBjb3B5IGVhY2ggcnRwIGJ1ZmZlciBmaWVsZC4KKyAqLworc3RhdGljIEdzdEJ1ZmZlciAqCitnc3RfcnRwX3J0eF9idWZmZXJfbmV3IChHc3RSdHBSdHhTZW5kICogcnR4LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdE1lbW9yeSAqbWVtID0gTlVMTDsKKyAgR3N0UlRQQnVmZmVyIHJ0cCA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisgIEdzdFJUUEJ1ZmZlciBuZXdfcnRwID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKyAgR3N0QnVmZmVyICpuZXdfYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludCBwYXlsb2FkX2xlbiA9IDA7CisgIFNTUkNSdHhEYXRhICpkYXRhOworICBndWludDMyIHNzcmM7CisgIGd1aW50MTYgc2VxbnVtOworICBndWludDggZm10cDsKKworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGJ1ZmZlciwgR1NUX01BUF9SRUFELCAmcnRwKTsKKworICAvKiBnZXQgbmVlZGVkIGRhdGEgZnJvbSBHc3RSdHBSdHhTZW5kICovCisgIHNzcmMgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfc3NyYyAoJnJ0cCk7CisgIGRhdGEgPSBnc3RfcnRwX3J0eF9zZW5kX2dldF9zc3JjX2RhdGEgKHJ0eCwgc3NyYyk7CisgIHNzcmMgPSBkYXRhLT5ydHhfc3NyYzsKKyAgc2VxbnVtID0gZGF0YS0+bmV4dF9zZXFudW0rKzsKKyAgZm10cCA9IEdQT0lOVEVSX1RPX1VJTlQgKGdfaGFzaF90YWJsZV9sb29rdXAgKHJ0eC0+cnR4X3B0X21hcCwKKyAgICAgICAgICBHVUlOVF9UT19QT0lOVEVSIChnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF90eXBlICgmcnRwKSkpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHgsICJjcmVhdGluZyBydHggYnVmZmVyLCBvcmlnIHNlcW51bTogJXUsICIKKyAgICAgICJydHggc2VxbnVtOiAldSwgcnR4IHNzcmM6ICVYIiwgZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAoJnJ0cCksCisgICAgICBzZXFudW0sIHNzcmMpOworCisgIC8qIGdzdF9ydHBfYnVmZmVyX21hcCBkb2VzIG5vdCBtYXAgdGhlIHBheWxvYWQgc28gZG8gaXQgbm93ICovCisgIGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKworICAvKiBjb3B5IGZpeGVkIGhlYWRlciAqLworICBtZW0gPSBnc3RfbWVtb3J5X2NvcHkgKHJ0cC5tYXBbMF0ubWVtb3J5LCAwLCBydHAuc2l6ZVswXSk7CisgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAobmV3X2J1ZmZlciwgbWVtKTsKKworICAvKiBjb3B5IGV4dGVuc2lvbiBpZiBhbnkgKi8KKyAgaWYgKHJ0cC5zaXplWzFdKSB7CisgICAgbWVtID0gZ3N0X21lbW9yeV9jb3B5IChydHAubWFwWzFdLm1lbW9yeSwgMCwgcnRwLnNpemVbMV0pOworICAgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAobmV3X2J1ZmZlciwgbWVtKTsKKyAgfQorCisgIC8qIGNvcHkgcGF5bG9hZCBhbmQgYWRkIE9TTiBqdXN0IGJlZm9yZSAqLworICBwYXlsb2FkX2xlbiA9IDIgKyBydHAuc2l6ZVsyXTsKKyAgbWVtID0gZ3N0X2FsbG9jYXRvcl9hbGxvYyAoTlVMTCwgcGF5bG9hZF9sZW4sIE5VTEwpOworCisgIGdzdF9tZW1vcnlfbWFwIChtZW0sICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBHU1RfV1JJVEVfVUlOVDE2X0JFIChtYXAuZGF0YSwgZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAoJnJ0cCkpOworICBpZiAocnRwLnNpemVbMl0pCisgICAgbWVtY3B5IChtYXAuZGF0YSArIDIsIHJ0cC5kYXRhWzJdLCBydHAuc2l6ZVsyXSk7CisgIGdzdF9tZW1vcnlfdW5tYXAgKG1lbSwgJm1hcCk7CisgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAobmV3X2J1ZmZlciwgbWVtKTsKKworICAvKiBldmVyeXRoaW5nIG5lZWRlZCBpcyBjb3BpZWQgKi8KKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIC8qIHNldCBzc3JjLCBzZXFudW0gYW5kIGZtdHAgKi8KKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChuZXdfYnVmZmVyLCBHU1RfTUFQX1dSSVRFLCAmbmV3X3J0cCk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9zc3JjICgmbmV3X3J0cCwgc3NyYyk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9zZXEgKCZuZXdfcnRwLCBzZXFudW0pOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfcGF5bG9hZF90eXBlICgmbmV3X3J0cCwgZm10cCk7CisgIC8qIFJGQyA0NTg4OiBsZXQgb3RoZXIgZWxlbWVudHMgZG8gdGhlIHBhZGRpbmcsIGFzIG5vcm1hbCAqLworICBnc3RfcnRwX2J1ZmZlcl9zZXRfcGFkZGluZyAoJm5ld19ydHAsIEZBTFNFKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZuZXdfcnRwKTsKKworICAvKiBDb3B5IG92ZXIgdGltZXN0YW1wcyAqLworICBnc3RfYnVmZmVyX2NvcHlfaW50byAobmV3X2J1ZmZlciwgYnVmZmVyLCBHU1RfQlVGRkVSX0NPUFlfVElNRVNUQU1QUywgMCwgLTEpOworCisgIHJldHVybiBuZXdfYnVmZmVyOworfQorCitzdGF0aWMgZ2ludAorYnVmZmVyX3F1ZXVlX2l0ZW1zX2NtcCAoQnVmZmVyUXVldWVJdGVtICogYSwgQnVmZmVyUXVldWVJdGVtICogYiwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIC8qIGdzdF9ydHBfYnVmZmVyX2NvbXBhcmVfc2VxbnVtIHJldHVybnMgdGhlIG9wcG9zaXRlIG9mIHdoYXQgd2Ugd2FudCwKKyAgICogaXQgcmV0dXJucyBuZWdhdGl2ZSB3aGVuIHNlcW51bTEgPiBzZXFudW0yIGFuZCB3ZSB3YW50IG5lZ2F0aXZlCisgICAqIHdoZW4gYiA+IGEsIGkuZS4gYSBpcyBzbWFsbGVyLCBzbyBpdCBjb21lcyBmaXJzdCBpbiB0aGUgc2VxdWVuY2UgKi8KKyAgcmV0dXJuIGdzdF9ydHBfYnVmZmVyX2NvbXBhcmVfc2VxbnVtIChiLT5zZXFudW0sIGEtPnNlcW51bSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9ydHhfc2VuZF9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBSdHhTZW5kICpydHggPSBHU1RfUlRQX1JUWF9TRU5EIChwYXJlbnQpOworICBnYm9vbGVhbiByZXM7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNOgorICAgIHsKKyAgICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCk7CisKKyAgICAgIC8qIFRoaXMgZXZlbnQgdXN1YWxseSBjb21lcyBmcm9tIHRoZSBkb3duc3RyZWFtIGdzdHJ0cHNlc3Npb24gKi8KKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiR3N0UlRQUmV0cmFuc21pc3Npb25SZXF1ZXN0IikpIHsKKyAgICAgICAgZ3VpbnQgc2VxbnVtID0gMDsKKyAgICAgICAgZ3VpbnQgc3NyYyA9IDA7CisgICAgICAgIEdzdEJ1ZmZlciAqcnR4X2J1ZiA9IE5VTEw7CisKKyAgICAgICAgLyogcmV0cmlldmUgc2VxbnVtIG9mIHRoZSBwYWNrZXQgdGhhdCBuZWVkIHRvIGJlIHJldHJhbnNtaXR0ZWQgKi8KKyAgICAgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF91aW50IChzLCAic2VxbnVtIiwgJnNlcW51bSkpCisgICAgICAgICAgc2VxbnVtID0gLTE7CisKKyAgICAgICAgLyogcmV0cmlldmUgc3NyYyBvZiB0aGUgcGFja2V0IHRoYXQgbmVlZCB0byBiZSByZXRyYW5zbWl0dGVkICovCisgICAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAocywgInNzcmMiLCAmc3NyYykpCisgICAgICAgICAgc3NyYyA9IC0xOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0eCwgImdvdCBydHggcmVxdWVzdCBmb3Igc2VxbnVtOiAldSwgc3NyYzogJVgiLAorICAgICAgICAgICAgc2VxbnVtLCBzc3JjKTsKKworICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHJ0eCk7CisgICAgICAgIC8qIGNoZWNrIGlmIHJlcXVlc3QgaXMgZm9yIHVzICovCisgICAgICAgIGlmIChnX2hhc2hfdGFibGVfY29udGFpbnMgKHJ0eC0+c3NyY19kYXRhLCBHVUlOVF9UT19QT0lOVEVSIChzc3JjKSkpIHsKKyAgICAgICAgICBTU1JDUnR4RGF0YSAqZGF0YTsKKyAgICAgICAgICBHU2VxdWVuY2VJdGVyICppdGVyOworICAgICAgICAgIEJ1ZmZlclF1ZXVlSXRlbSBzZWFyY2hfaXRlbTsKKworICAgICAgICAgIC8qIHVwZGF0ZSBzdGF0aXN0aWNzICovCisgICAgICAgICAgKytydHgtPm51bV9ydHhfcmVxdWVzdHM7CisKKyAgICAgICAgICBkYXRhID0gZ3N0X3J0cF9ydHhfc2VuZF9nZXRfc3NyY19kYXRhIChydHgsIHNzcmMpOworCisgICAgICAgICAgc2VhcmNoX2l0ZW0uc2VxbnVtID0gc2VxbnVtOworICAgICAgICAgIGl0ZXIgPSBnX3NlcXVlbmNlX2xvb2t1cCAoZGF0YS0+cXVldWUsICZzZWFyY2hfaXRlbSwKKyAgICAgICAgICAgICAgKEdDb21wYXJlRGF0YUZ1bmMpIGJ1ZmZlcl9xdWV1ZV9pdGVtc19jbXAsIE5VTEwpOworICAgICAgICAgIGlmIChpdGVyKSB7CisgICAgICAgICAgICBCdWZmZXJRdWV1ZUl0ZW0gKml0ZW0gPSBnX3NlcXVlbmNlX2dldCAoaXRlcik7CisgICAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocnR4LCAiZm91bmQgJXUiLCBpdGVtLT5zZXFudW0pOworICAgICAgICAgICAgcnR4X2J1ZiA9IGdzdF9ydHBfcnR4X2J1ZmZlcl9uZXcgKHJ0eCwgaXRlbS0+YnVmZmVyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7CisKKyAgICAgICAgaWYgKHJ0eF9idWYpCisgICAgICAgICAgZ3N0X3J0cF9ydHhfc2VuZF9wdXNoX291dCAocnR4LCBydHhfYnVmKTsKKworICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgcmVzID0gVFJVRTsKKworICAgICAgICAvKiBUaGlzIGV2ZW50IHVzdWFsbHkgY29tZXMgZnJvbSB0aGUgZG93bnN0cmVhbSBnc3RydHBzZXNzaW9uICovCisgICAgICB9IGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJHc3RSVFBDb2xsaXNpb24iKSkgeworICAgICAgICBndWludCBzc3JjID0gMDsKKworICAgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKHMsICJzc3JjIiwgJnNzcmMpKQorICAgICAgICAgIHNzcmMgPSAtMTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHgsICJnb3Qgc3NyYyBjb2xsaXNpb24sIHNzcmM6ICVYIiwgc3NyYyk7CisKKyAgICAgICAgR1NUX09CSkVDVF9MT0NLIChydHgpOworCisgICAgICAgIC8qIGNob29zZSBhbm90aGVyIHNzcmMgZm9yIG91ciByZXRyYW5zbWl0ZWQgc3RyZWFtICovCisgICAgICAgIGlmIChnX2hhc2hfdGFibGVfY29udGFpbnMgKHJ0eC0+cnR4X3NzcmNzLCBHVUlOVF9UT19QT0lOVEVSIChzc3JjKSkpIHsKKyAgICAgICAgICBndWludCBtYXN0ZXJfc3NyYzsKKyAgICAgICAgICBTU1JDUnR4RGF0YSAqZGF0YTsKKworICAgICAgICAgIG1hc3Rlcl9zc3JjID0gR1BPSU5URVJfVE9fVUlOVCAoZ19oYXNoX3RhYmxlX2xvb2t1cCAocnR4LT5ydHhfc3NyY3MsCisgICAgICAgICAgICAgICAgICBHVUlOVF9UT19QT0lOVEVSIChzc3JjKSkpOworICAgICAgICAgIGRhdGEgPSBnc3RfcnRwX3J0eF9zZW5kX2dldF9zc3JjX2RhdGEgKHJ0eCwgbWFzdGVyX3NzcmMpOworCisgICAgICAgICAgLyogY2hhbmdlIHJ0eF9zc3JjIGFuZCB1cGRhdGUgdGhlIHJldmVyc2UgbWFwICovCisgICAgICAgICAgZGF0YS0+cnR4X3NzcmMgPSBnc3RfcnRwX3J0eF9zZW5kX2Nob29zZV9zc3JjIChydHgsIDAsIEZBTFNFKTsKKyAgICAgICAgICBnX2hhc2hfdGFibGVfcmVtb3ZlIChydHgtPnJ0eF9zc3JjcywgR1VJTlRfVE9fUE9JTlRFUiAoc3NyYykpOworICAgICAgICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHJ0eC0+cnR4X3NzcmNzLAorICAgICAgICAgICAgICBHVUlOVF9UT19QT0lOVEVSIChkYXRhLT5ydHhfc3NyYyksCisgICAgICAgICAgICAgIEdVSU5UX1RPX1BPSU5URVIgKG1hc3Rlcl9zc3JjKSk7CisKKyAgICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKworICAgICAgICAgIC8qIG5vIG5lZWQgdG8gZm9yd2FyZCB0byBwYXlsb2FkZXIgYmVjYXVzZSB3ZSBtYWtlIHN1cmUgdG8gaGF2ZQorICAgICAgICAgICAqIGEgZGlmZmVyZW50IHNzcmMKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgICAgICByZXMgPSBUUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIGlmIG1hc3RlciBzc3JjIGhhcyBjb2xsaWRlZCwgcmVtb3ZlIGl0IGZyb20gb3VyIGRhdGEsIGFzIGl0CisgICAgICAgICAgICogaXMgbm90IGdvaW5nIHRvIGJlIHVzZWQgYW55IGxvbmdlciAqLworICAgICAgICAgIGlmIChnX2hhc2hfdGFibGVfY29udGFpbnMgKHJ0eC0+c3NyY19kYXRhLCBHVUlOVF9UT19QT0lOVEVSIChzc3JjKSkpIHsKKyAgICAgICAgICAgIFNTUkNSdHhEYXRhICpkYXRhOworICAgICAgICAgICAgZGF0YSA9IGdzdF9ydHBfcnR4X3NlbmRfZ2V0X3NzcmNfZGF0YSAocnR4LCBzc3JjKTsKKyAgICAgICAgICAgIGdfaGFzaF90YWJsZV9yZW1vdmUgKHJ0eC0+cnR4X3NzcmNzLAorICAgICAgICAgICAgICAgIEdVSU5UX1RPX1BPSU5URVIgKGRhdGEtPnJ0eF9zc3JjKSk7CisgICAgICAgICAgICBnX2hhc2hfdGFibGVfcmVtb3ZlIChydHgtPnNzcmNfZGF0YSwgR1VJTlRfVE9fUE9JTlRFUiAoc3NyYykpOworICAgICAgICAgIH0KKworICAgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHgpOworCisgICAgICAgICAgLyogZm9yd2FyZCBldmVudCB0byBwYXlsb2FkZXIgaW4gY2FzZSBjb2xsaWRlZCBzc3JjIGlzCisgICAgICAgICAgICogbWFzdGVyIHN0cmVhbSAqLworICAgICAgICAgIHJlcyA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfcnR4X3NlbmRfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFJ0cFJ0eFNlbmQgKnJ0eCA9IEdTVF9SVFBfUlRYX1NFTkQgKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RBUlQ6CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHJ0eC0+c3JjcGFkLCBldmVudCk7CisgICAgICBnc3RfcnRwX3J0eF9zZW5kX3NldF9mbHVzaGluZyAocnR4LCBUUlVFKTsKKyAgICAgIGdzdF9wYWRfcGF1c2VfdGFzayAocnR4LT5zcmNwYWQpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocnR4LT5zcmNwYWQsIGV2ZW50KTsKKyAgICAgIGdzdF9ydHBfcnR4X3NlbmRfc2V0X2ZsdXNoaW5nIChydHgsIEZBTFNFKTsKKyAgICAgIGdzdF9wYWRfc3RhcnRfdGFzayAocnR4LT5zcmNwYWQsCisgICAgICAgICAgKEdzdFRhc2tGdW5jdGlvbikgZ3N0X3J0cF9ydHhfc2VuZF9zcmNfbG9vcCwgcnR4LCBOVUxMKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAocnR4LCAiR290IEVPUyAtIGVucXVldWVpbmcgaXQiKTsKKyAgICAgIGdzdF9ydHBfcnR4X3NlbmRfcHVzaF9vdXQgKHJ0eCwgZXZlbnQpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgY2FzZSBHU1RfRVZFTlRfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworICAgICAgR3N0U3RydWN0dXJlICpzOworICAgICAgZ3VpbnQgc3NyYzsKKyAgICAgIGdpbnQgcGF5bG9hZDsKKyAgICAgIGdwb2ludGVyIHJ0eF9wYXlsb2FkOworICAgICAgU1NSQ1J0eERhdGEgKmRhdGE7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChldmVudCwgJmNhcHMpOworCisgICAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKHMsICJzc3JjIiwgJnNzcmMpKQorICAgICAgICBzc3JjID0gLTE7CisgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgInBheWxvYWQiLCAmcGF5bG9hZCkpCisgICAgICAgIHBheWxvYWQgPSAtMTsKKworICAgICAgaWYgKHBheWxvYWQgPT0gLTEpCisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocnR4LCAiTm8gcGF5bG9hZCBpbiBjYXBzIik7CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKyAgICAgIGRhdGEgPSBnc3RfcnRwX3J0eF9zZW5kX2dldF9zc3JjX2RhdGEgKHJ0eCwgc3NyYyk7CisgICAgICBpZiAoIWdfaGFzaF90YWJsZV9sb29rdXBfZXh0ZW5kZWQgKHJ0eC0+cnR4X3B0X21hcCwKKyAgICAgICAgICAgICAgR1VJTlRfVE9fUE9JTlRFUiAocGF5bG9hZCksIE5VTEwsICZydHhfcGF5bG9hZCkpCisgICAgICAgIHJ0eF9wYXlsb2FkID0gR0lOVF9UT19QT0lOVEVSICgtMSk7CisKKyAgICAgIGlmIChHUE9JTlRFUl9UT19JTlQgKHJ0eF9wYXlsb2FkKSA9PSAtMSAmJiBwYXlsb2FkICE9IC0xKQorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHJ0eCwgIlBheWxvYWQgJWQgbm90IGluIHJ0eC1wdC1tYXAiLCBwYXlsb2FkKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnR4LAorICAgICAgICAgICJnb3QgY2FwcyBmb3IgcGF5bG9hZDogJWQtPiVkLCBzc3JjOiAldS0+JXUgOiAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgICBwYXlsb2FkLCBHUE9JTlRFUl9UT19JTlQgKHJ0eF9wYXlsb2FkKSwgc3NyYywgZGF0YS0+cnR4X3NzcmMsIGNhcHMpOworCisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJjbG9jay1yYXRlIiwgJmRhdGEtPmNsb2NrX3JhdGUpOworCisgICAgICAvKiBUaGUgc2Vzc2lvbiBtaWdodCBuZWVkIHRvIGtub3cgdGhlIFJUWCBzc3JjICovCisgICAgICBjYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAicnR4LXNzcmMiLCBHX1RZUEVfVUlOVCwgZGF0YS0+cnR4X3NzcmMsCisgICAgICAgICAgInJ0eC1zZXFudW0tb2Zmc2V0IiwgR19UWVBFX1VJTlQsIGRhdGEtPnNlcW51bV9iYXNlLCBOVUxMKTsKKworICAgICAgaWYgKEdQT0lOVEVSX1RPX0lOVCAocnR4X3BheWxvYWQpICE9IC0xKQorICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAicnR4LXBheWxvYWQiLCBHX1RZUEVfSU5ULAorICAgICAgICAgICAgR1BPSU5URVJfVE9fSU5UIChydHhfcGF5bG9hZCksIE5VTEwpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHgsICJnb3QgY2xvY2stcmF0ZSBmcm9tIGNhcHM6ICVkIGZvciBzc3JjOiAldSIsCisgICAgICAgICAgZGF0YS0+Y2xvY2tfcmF0ZSwgc3NyYyk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfY2FwcyAoY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7Cit9CisKKy8qIGxpa2UgcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3RzX2RpZmYoKSAqLworc3RhdGljIGd1aW50MzIKK2dzdF9ydHBfcnR4X3NlbmRfZ2V0X3RzX2RpZmYgKFNTUkNSdHhEYXRhICogZGF0YSkKK3sKKyAgZ3VpbnQ2NCBoaWdoX3RzLCBsb3dfdHM7CisgIEJ1ZmZlclF1ZXVlSXRlbSAqaGlnaF9idWYsICpsb3dfYnVmOworICBndWludDMyIHJlc3VsdDsKKworICBoaWdoX2J1ZiA9CisgICAgICBnX3NlcXVlbmNlX2dldCAoZ19zZXF1ZW5jZV9pdGVyX3ByZXYgKGdfc2VxdWVuY2VfZ2V0X2VuZF9pdGVyCisgICAgICAgICAgKGRhdGEtPnF1ZXVlKSkpOworICBsb3dfYnVmID0gZ19zZXF1ZW5jZV9nZXQgKGdfc2VxdWVuY2VfZ2V0X2JlZ2luX2l0ZXIgKGRhdGEtPnF1ZXVlKSk7CisKKyAgaWYgKCFoaWdoX2J1ZiB8fCAhbG93X2J1ZiB8fCBoaWdoX2J1ZiA9PSBsb3dfYnVmKQorICAgIHJldHVybiAwOworCisgIGhpZ2hfdHMgPSBoaWdoX2J1Zi0+dGltZXN0YW1wOworICBsb3dfdHMgPSBsb3dfYnVmLT50aW1lc3RhbXA7CisKKyAgLyogaXQgbmVlZHMgdG8gd29yayBpZiB0cyB3cmFwcyAqLworICBpZiAoaGlnaF90cyA+PSBsb3dfdHMpIHsKKyAgICByZXN1bHQgPSAoZ3VpbnQzMikgKGhpZ2hfdHMgLSBsb3dfdHMpOworICB9IGVsc2UgeworICAgIHJlc3VsdCA9IChndWludDMyKSAoaGlnaF90cyArIEdfTUFYVUlOVDMyICsgMSAtIGxvd190cyk7CisgIH0KKworICAvKiByZXR1cm4gdmFsdWUgaW4gbXMgaW5zdGVhZCBvZiBjbG9jayB0aWNrcyAqLworICByZXR1cm4gKGd1aW50MzIpIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHJlc3VsdCwgMTAwMCwgZGF0YS0+Y2xvY2tfcmF0ZSk7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggbG9jayAqLworc3RhdGljIHZvaWQKK3Byb2Nlc3NfYnVmZmVyIChHc3RSdHBSdHhTZW5kICogcnR4LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJUUEJ1ZmZlciBydHAgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworICBCdWZmZXJRdWV1ZUl0ZW0gKml0ZW07CisgIFNTUkNSdHhEYXRhICpkYXRhOworICBndWludDE2IHNlcW51bTsKKyAgZ3VpbnQ4IHBheWxvYWRfdHlwZTsKKyAgZ3VpbnQzMiBzc3JjLCBydHB0aW1lOworCisgIC8qIHJlYWQgdGhlIGluZm9ybWF0aW9uIHdlIHdhbnQgZnJvbSB0aGUgYnVmZmVyICovCisgIGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmZmVyLCBHU1RfTUFQX1JFQUQsICZydHApOworICBzZXFudW0gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxICgmcnRwKTsKKyAgcGF5bG9hZF90eXBlID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfdHlwZSAoJnJ0cCk7CisgIHNzcmMgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfc3NyYyAoJnJ0cCk7CisgIHJ0cHRpbWUgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wICgmcnRwKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIEdTVF9UUkFDRV9PQkpFQ1QgKHJ0eCwgIlByb2Nlc3NpbmcgYnVmZmVyIHNlcW51bTogJXUsIHNzcmM6ICVYIiwgc2VxbnVtLAorICAgICAgc3NyYyk7CisKKyAgLyogZG8gbm90IHN0b3JlIHRoZSBidWZmZXIgaWYgaXQncyBwYXlsb2FkIHR5cGUgaXMgdW5rbm93biAqLworICBpZiAoZ19oYXNoX3RhYmxlX2NvbnRhaW5zIChydHgtPnJ0eF9wdF9tYXAsIEdVSU5UX1RPX1BPSU5URVIgKHBheWxvYWRfdHlwZSkpKSB7CisgICAgZGF0YSA9IGdzdF9ydHBfcnR4X3NlbmRfZ2V0X3NzcmNfZGF0YSAocnR4LCBzc3JjKTsKKworICAgIC8qIGFkZCBjdXJyZW50IHJ0cCBidWZmZXIgdG8gcXVldWUgaGlzdG9yeSAqLworICAgIGl0ZW0gPSBnX3NsaWNlX25ldzAgKEJ1ZmZlclF1ZXVlSXRlbSk7CisgICAgaXRlbS0+c2VxbnVtID0gc2VxbnVtOworICAgIGl0ZW0tPnRpbWVzdGFtcCA9IHJ0cHRpbWU7CisgICAgaXRlbS0+YnVmZmVyID0gZ3N0X2J1ZmZlcl9yZWYgKGJ1ZmZlcik7CisgICAgZ19zZXF1ZW5jZV9hcHBlbmQgKGRhdGEtPnF1ZXVlLCBpdGVtKTsKKworICAgIC8qIHJlbW92ZSBvbGRlc3QgcGFja2V0cyBmcm9tIGhpc3RvcnkgaWYgdGhleSBhcmUgdG9vIG1hbnkgKi8KKyAgICBpZiAocnR4LT5tYXhfc2l6ZV9wYWNrZXRzKSB7CisgICAgICB3aGlsZSAoZ19zZXF1ZW5jZV9nZXRfbGVuZ3RoIChkYXRhLT5xdWV1ZSkgPiBydHgtPm1heF9zaXplX3BhY2tldHMpCisgICAgICAgIGdfc2VxdWVuY2VfcmVtb3ZlIChnX3NlcXVlbmNlX2dldF9iZWdpbl9pdGVyIChkYXRhLT5xdWV1ZSkpOworICAgIH0KKyAgICBpZiAocnR4LT5tYXhfc2l6ZV90aW1lKSB7CisgICAgICB3aGlsZSAoZ3N0X3J0cF9ydHhfc2VuZF9nZXRfdHNfZGlmZiAoZGF0YSkgPiBydHgtPm1heF9zaXplX3RpbWUpCisgICAgICAgIGdfc2VxdWVuY2VfcmVtb3ZlIChnX3NlcXVlbmNlX2dldF9iZWdpbl9pdGVyIChkYXRhLT5xdWV1ZSkpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9ydHhfc2VuZF9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UnRwUnR4U2VuZCAqcnR4ID0gR1NUX1JUUF9SVFhfU0VORCAocGFyZW50KTsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgR1NUX09CSkVDVF9MT0NLIChydHgpOworICBwcm9jZXNzX2J1ZmZlciAocnR4LCBidWZmZXIpOworICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChydHgtPnNyY3BhZCwgYnVmZmVyKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3Byb2Nlc3NfYnVmZmVyX2Zyb21fbGlzdCAoR3N0QnVmZmVyICoqIGJ1ZmZlciwgZ3VpbnQgaWR4LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIHByb2Nlc3NfYnVmZmVyICh1c2VyX2RhdGEsICpidWZmZXIpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfcnR4X3NlbmRfY2hhaW5fbGlzdCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyTGlzdCAqIGxpc3QpCit7CisgIEdzdFJ0cFJ0eFNlbmQgKnJ0eCA9IEdTVF9SVFBfUlRYX1NFTkQgKHBhcmVudCk7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworCisgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKyAgZ3N0X2J1ZmZlcl9saXN0X2ZvcmVhY2ggKGxpc3QsIHByb2Nlc3NfYnVmZmVyX2Zyb21fbGlzdCwgcnR4KTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7CisKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoX2xpc3QgKHJ0eC0+c3JjcGFkLCBsaXN0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9ydHhfc2VuZF9zcmNfbG9vcCAoR3N0UnRwUnR4U2VuZCAqIHJ0eCkKK3sKKyAgR3N0RGF0YVF1ZXVlSXRlbSAqZGF0YTsKKworICBpZiAoZ3N0X2RhdGFfcXVldWVfcG9wIChydHgtPnF1ZXVlLCAmZGF0YSkpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocnR4LCAicHVzaGluZyBydHggYnVmZmVyICVwIiwgZGF0YS0+b2JqZWN0KTsKKworICAgIGlmIChHX0xJS0VMWSAoR1NUX0lTX0JVRkZFUiAoZGF0YS0+b2JqZWN0KSkpIHsKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKyAgICAgIC8qIFVwZGF0ZSBzdGF0aXN0aWNzIGp1c3QgYmVmb3JlIHB1c2hpbmcuICovCisgICAgICBydHgtPm51bV9ydHhfcGFja2V0cysrOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7CisKKyAgICAgIGdzdF9wYWRfcHVzaCAocnR4LT5zcmNwYWQsIEdTVF9CVUZGRVIgKGRhdGEtPm9iamVjdCkpOworICAgIH0gZWxzZSBpZiAoR1NUX0lTX0VWRU5UIChkYXRhLT5vYmplY3QpKSB7CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHJ0eC0+c3JjcGFkLCBHU1RfRVZFTlQgKGRhdGEtPm9iamVjdCkpOworCisgICAgICAvKiBhZnRlciBFT1MsIHdlIHNob3VsZCBub3Qgc2VuZCBhbnkgbW9yZSBidWZmZXJzLAorICAgICAgICogZXZlbiBpZiB0aGVyZSBhcmUgbW9yZSByZXF1ZXN0cyBjb21pbmcgaW4gKi8KKyAgICAgIGlmIChHU1RfRVZFTlRfVFlQRSAoZGF0YS0+b2JqZWN0KSA9PSBHU1RfRVZFTlRfRU9TKSB7CisgICAgICAgIGdzdF9ydHBfcnR4X3NlbmRfc2V0X2ZsdXNoaW5nIChydHgsIFRSVUUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICB9CisKKyAgICBkYXRhLT5vYmplY3QgPSBOVUxMOyAgICAgICAgLyogd2Ugbm8gbG9uZ2VyIG93biB0aGF0IG9iamVjdCAqLworICAgIGRhdGEtPmRlc3Ryb3kgKGRhdGEpOworICB9IGVsc2UgeworICAgIEdTVF9MT0dfT0JKRUNUIChydHgsICJmbHVzaGluZyIpOworICAgIGdzdF9wYWRfcGF1c2VfdGFzayAocnR4LT5zcmNwYWQpOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9ydHhfc2VuZF9hY3RpdmF0ZV9tb2RlIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSkKK3sKKyAgR3N0UnRwUnR4U2VuZCAqcnR4ID0gR1NUX1JUUF9SVFhfU0VORCAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBHU1RfUEFEX01PREVfUFVTSDoKKyAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgZ3N0X3J0cF9ydHhfc2VuZF9zZXRfZmx1c2hpbmcgKHJ0eCwgRkFMU0UpOworICAgICAgICByZXQgPSBnc3RfcGFkX3N0YXJ0X3Rhc2sgKHJ0eC0+c3JjcGFkLAorICAgICAgICAgICAgKEdzdFRhc2tGdW5jdGlvbikgZ3N0X3J0cF9ydHhfc2VuZF9zcmNfbG9vcCwgcnR4LCBOVUxMKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9ydHBfcnR4X3NlbmRfc2V0X2ZsdXNoaW5nIChydHgsIFRSVUUpOworICAgICAgICByZXQgPSBnc3RfcGFkX3N0b3BfdGFzayAocnR4LT5zcmNwYWQpOworICAgICAgfQorICAgICAgR1NUX0lORk9fT0JKRUNUIChydHgsICJhY3RpdmF0ZV9tb2RlOiBhY3RpdmUgJWQsIHJldCAlZCIsIGFjdGl2ZSwgcmV0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9ydHhfc2VuZF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwUnR4U2VuZCAqcnR4ID0gR1NUX1JUUF9SVFhfU0VORCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUEFZTE9BRF9UWVBFX01BUDoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKyAgICAgIGdfdmFsdWVfc2V0X2JveGVkICh2YWx1ZSwgcnR4LT5ydHhfcHRfbWFwX3N0cnVjdHVyZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfU0laRV9USU1FOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChydHgpOworICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0eC0+bWF4X3NpemVfdGltZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfU0laRV9QQUNLRVRTOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChydHgpOworICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0eC0+bWF4X3NpemVfcGFja2V0cyk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9OVU1fUlRYX1JFUVVFU1RTOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChydHgpOworICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0eC0+bnVtX3J0eF9yZXF1ZXN0cyk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9OVU1fUlRYX1BBQ0tFVFM6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHJ0eCk7CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnR4LT5udW1fcnR4X3BhY2tldHMpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorc3RydWN0dXJlX3RvX2hhc2hfdGFibGUgKEdRdWFyayBmaWVsZF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIGdwb2ludGVyIGhhc2gpCit7CisgIGNvbnN0IGdjaGFyICpmaWVsZF9zdHI7CisgIGd1aW50IGZpZWxkX3VpbnQ7CisgIGd1aW50IHZhbHVlX3VpbnQ7CisKKyAgZmllbGRfc3RyID0gZ19xdWFya190b19zdHJpbmcgKGZpZWxkX2lkKTsKKyAgZmllbGRfdWludCA9IGF0b2kgKGZpZWxkX3N0cik7CisgIHZhbHVlX3VpbnQgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKChHSGFzaFRhYmxlICopIGhhc2gsIEdVSU5UX1RPX1BPSU5URVIgKGZpZWxkX3VpbnQpLAorICAgICAgR1VJTlRfVE9fUE9JTlRFUiAodmFsdWVfdWludCkpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9ydHhfc2VuZF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwUnR4U2VuZCAqcnR4ID0gR1NUX1JUUF9SVFhfU0VORCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU1NSQ19NQVA6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHJ0eCk7CisgICAgICBpZiAocnR4LT5leHRlcm5hbF9zc3JjX21hcCkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChydHgtPmV4dGVybmFsX3NzcmNfbWFwKTsKKyAgICAgIHJ0eC0+ZXh0ZXJuYWxfc3NyY19tYXAgPSBnX3ZhbHVlX2R1cF9ib3hlZCAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUEFZTE9BRF9UWVBFX01BUDoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAocnR4KTsKKyAgICAgIGlmIChydHgtPnJ0eF9wdF9tYXBfc3RydWN0dXJlKQorICAgICAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHJ0eC0+cnR4X3B0X21hcF9zdHJ1Y3R1cmUpOworICAgICAgcnR4LT5ydHhfcHRfbWFwX3N0cnVjdHVyZSA9IGdfdmFsdWVfZHVwX2JveGVkICh2YWx1ZSk7CisgICAgICBnX2hhc2hfdGFibGVfcmVtb3ZlX2FsbCAocnR4LT5ydHhfcHRfbWFwKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZm9yZWFjaCAocnR4LT5ydHhfcHRfbWFwX3N0cnVjdHVyZSwgc3RydWN0dXJlX3RvX2hhc2hfdGFibGUsCisgICAgICAgICAgcnR4LT5ydHhfcHRfbWFwKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9TSVpFX1RJTUU6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHJ0eCk7CisgICAgICBydHgtPm1heF9zaXplX3RpbWUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocnR4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfU0laRV9QQUNLRVRTOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChydHgpOworICAgICAgcnR4LT5tYXhfc2l6ZV9wYWNrZXRzID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9ydHhfc2VuZF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdFJ0cFJ0eFNlbmQgKnJ0eDsKKworICBydHggPSBHU1RfUlRQX1JUWF9TRU5EIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPQorICAgICAgR1NUX0VMRU1FTlRfQ0xBU1MgKGdzdF9ydHBfcnR4X3NlbmRfcGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LAorICAgICAgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfcnR4X3NlbmRfcmVzZXQgKHJ0eCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3J0cF9ydHhfc2VuZF9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3J0cF9ydHhfc2VuZF9kZWJ1ZywgInJ0cHJ0eHNlbmQiLCAwLAorICAgICAgInJ0cCByZXRyYW5zbWlzc2lvbiBzZW5kZXIiKTsKKworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0cHJ0eHNlbmQiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfUlRQX1JUWF9TRU5EKTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuaCBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHJ0eHNlbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjA4NGU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvZ3N0cnRwcnR4c2VuZC5oCkBAIC0wLDAgKzEsODQgQEAKKy8qIFJUUCBSZXRyYW5zbWlzc2lvbiBzZW5kZXIgZWxlbWVudCBmb3IgR1N0cmVhbWVyCisgKgorICogZ3N0cnRwcnR4c2VuZC5oOgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBDb2xsYWJvcmEgTHRkLgorICogICBAYXV0aG9yIEp1bGllbiBJc29yY2UgPGp1bGllbi5pc29yY2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRQX1JUWF9TRU5EX0hfXworI2RlZmluZSBfX0dTVF9SVFBfUlRYX1NFTkRfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RkYXRhcXVldWUuaD4KKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9SVFBfUlRYX1NFTkQgKGdzdF9ydHBfcnR4X3NlbmRfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1JUUF9SVFhfU0VORChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9SVFBfUlRYX1NFTkQsIEdzdFJ0cFJ0eFNlbmQpKQorI2RlZmluZSBHU1RfUlRQX1JUWF9TRU5EX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9SVFBfUlRYX1NFTkQsIEdzdFJ0cFJ0eFNlbmRDbGFzcykpCisjZGVmaW5lIEdTVF9SVFBfUlRYX1NFTkRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9SVFBfUlRYX1NFTkQsIEdzdFJ0cFJ0eFNlbmRDbGFzcykpCisjZGVmaW5lIEdTVF9JU19SVFBfUlRYX1NFTkQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1JUWF9TRU5EKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9SVFhfU0VORF9DTEFTUyhvYmopIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1JUUF9SVFhfU0VORCkpCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwUnR4U2VuZCBHc3RSdHBSdHhTZW5kOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFJ0eFNlbmRDbGFzcyBHc3RSdHBSdHhTZW5kQ2xhc3M7CisKK3N0cnVjdCBfR3N0UnRwUnR4U2VuZAoreworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgLyogcGFkICovCisgIEdzdFBhZCAqc2lua3BhZDsKKyAgR3N0UGFkICpzcmNwYWQ7CisKKyAgLyogcnRwIHBhY2tldHMgdGhhdCB3aWxsIGJlIHB1c2hlZCBvdXQgKi8KKyAgR3N0RGF0YVF1ZXVlICpxdWV1ZTsKKworICAvKiBzc3JjIC0+IFNTUkNSdHhEYXRhICovCisgIEdIYXNoVGFibGUgKnNzcmNfZGF0YTsKKyAgLyogcnR4IHNzcmMgLT4gbWFzdGVyIHNzcmMgKi8KKyAgR0hhc2hUYWJsZSAqcnR4X3NzcmNzOworCisgIC8qIG1hc3RlciBzc3JjIC0+IHJ0eCBzc3JjIChwcm9wZXJ0eSkgKi8KKyAgR3N0U3RydWN0dXJlICpleHRlcm5hbF9zc3JjX21hcDsKKworICAvKiBvcmlnIHB0ICh1aW50KSAtPiBydHggcHQgKHVpbnQpICovCisgIEdIYXNoVGFibGUgKnJ0eF9wdF9tYXA7CisgIC8qIG9yaWcgcHQgKHN0cmluZykgLT4gcnR4IHB0ICh1aW50KSAqLworICBHc3RTdHJ1Y3R1cmUgKnJ0eF9wdF9tYXBfc3RydWN0dXJlOworCisgIC8qIGJ1ZmZlcmluZyBjb250cm9sIHByb3BlcnRpZXMgKi8KKyAgZ3VpbnQgbWF4X3NpemVfdGltZTsKKyAgZ3VpbnQgbWF4X3NpemVfcGFja2V0czsKKworICAvKiBzdGF0aXN0aWNzICovCisgIGd1aW50IG51bV9ydHhfcmVxdWVzdHM7CisgIGd1aW50IG51bV9ydHhfcGFja2V0czsKK307CisKK3N0cnVjdCBfR3N0UnRwUnR4U2VuZENsYXNzCit7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCisKK0dUeXBlIGdzdF9ydHBfcnR4X3NlbmRfZ2V0X3R5cGUgKHZvaWQpOworZ2Jvb2xlYW4gZ3N0X3J0cF9ydHhfc2VuZF9wbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9SVFBfUlRYX1NFTkRfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmMgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4OTIyYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uYwpAQCAtMCwwICsxLDI3MTkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHBzZXNzaW9uCisgKiBAc2VlX2Fsc286IHJ0cGppdHRlcmJ1ZmZlciwgcnRwYmluLCBydHBwdGRlbXV4LCBydHBzc3JjZGVtdXgKKyAqCisgKiBUaGUgUlRQIHNlc3Npb24gbWFuYWdlciBtb2RlbHMgcGFydGljaXBhbnRzIHdpdGggdW5pcXVlIFNTUkMgaW4gYW4gUlRQCisgKiBzZXNzaW9uLiBUaGlzIHNlc3Npb24gY2FuIGJlIHVzZWQgdG8gc2VuZCBhbmQgcmVjZWl2ZSBSVFAgYW5kIFJUQ1AgcGFja2V0cy4KKyAqIEJhc2VkIG9uIHdoYXQgUkVRVUVTVCBwYWRzIGFyZSByZXF1ZXN0ZWQgZnJvbSB0aGUgc2Vzc2lvbiBtYW5hZ2VyLCBzcGVjaWZpYworICogZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWN0aXZhdGVkLgorICoKKyAqIFRoZSBzZXNzaW9uIG1hbmFnZXIgY3VycmVudGx5IGltcGxlbWVudHMgUkZDIDM1NTAgaW5jbHVkaW5nOgorICogPGl0ZW1pemVkbGlzdD4KKyAqICAgPGxpc3RpdGVtPgorICogICAgIDxwYXJhPlJUUCBwYWNrZXQgdmFsaWRhdGlvbiBiYXNlZCBvbiBjb25zZWN1dGl2ZSBzZXF1ZW5jZSBudW1iZXJzLjwvcGFyYT4KKyAqICAgPC9saXN0aXRlbT4KKyAqICAgPGxpc3RpdGVtPgorICogICAgIDxwYXJhPk1haW50YWluYW5jZSBvZiB0aGUgU1NSQyBwYXJ0aWNpcGFudCBkYXRhYmFzZS48L3BhcmE+CisgKiAgIDwvbGlzdGl0ZW0+CisgKiAgIDxsaXN0aXRlbT4KKyAqICAgICA8cGFyYT5LZWVwaW5nIHBlciBwYXJ0aWNpcGFudCBzdGF0aXN0aWNzIGJhc2VkIG9uIHJlY2VpdmVkIFJUQ1AgcGFja2V0cy48L3BhcmE+CisgKiAgIDwvbGlzdGl0ZW0+CisgKiAgIDxsaXN0aXRlbT4KKyAqICAgICA8cGFyYT5TY2hlZHVsaW5nIG9mIFJSL1NSIFJUQ1AgcGFja2V0cy48L3BhcmE+CisgKiAgIDwvbGlzdGl0ZW0+CisgKiAgIDxsaXN0aXRlbT4KKyAqICAgICA8cGFyYT5TdXBwb3J0IGZvciBtdWx0aXBsZSBzZW5kZXIgU1NSQy48L3BhcmE+CisgKiAgIDwvbGlzdGl0ZW0+CisgKiA8L2l0ZW1pemVkbGlzdD4KKyAqCisgKiBUaGUgcnRwc2Vzc2lvbiB3aWxsIG5vdCBkZW11eCBwYWNrZXRzIGJhc2VkIG9uIFNTUkMgb3IgcGF5bG9hZCB0eXBlLCBub3Igd2lsbAorICogaXQgY29ycmVjdCBmb3IgcGFja2V0IHJlb3JkZXJpbmcgYW5kIGppdHRlci4gVXNlICNHc3RSdHBzU3JjRGVtdXgsCisgKiAjR3N0UnRwUHREZW11eCBhbmQgR3N0UnRwSml0dGVyQnVmZmVyIGluIGFkZGl0aW9uIHRvICNHc3RSdHBTZXNzaW9uIHRvCisgKiBwZXJmb3JtIHRoZXNlIHRhc2tzLiBJdCBpcyB1c3VhbGx5IGEgZ29vZCBpZGVhIHRvIHVzZSAjR3N0UnRwQmluLCB3aGljaAorICogY29tYmluZXMgYWxsIHRoZXNlIGZlYXR1cmVzIGluIG9uZSBlbGVtZW50LgorICoKKyAqIFRvIHVzZSAjR3N0UnRwU2Vzc2lvbiBhcyBhbiBSVFAgcmVjZWl2ZXIsIHJlcXVlc3QgYSByZWN2X3J0cF9zaW5rIHBhZCwgd2hpY2ggd2lsbAorICogYXV0b21hdGljYWxseSBjcmVhdGUgcmVjdl9ydHBfc3JjIHBhZC4gRGF0YSByZWNlaXZlZCBvbiB0aGUgcmVjdl9ydHBfc2luayBwYWQKKyAqIHdpbGwgYmUgcHJvY2Vzc2VkIGluIHRoZSBzZXNzaW9uIGFuZCBhZnRlciBiZWluZyB2YWxpZGF0ZWQgZm9yd2FyZGVkIG9uIHRoZQorICogcmVjdl9ydHBfc3JjIHBhZC4KKyAqCisgKiBUbyBhbHNvIHVzZSAjR3N0UnRwU2Vzc2lvbiBhcyBhbiBSVENQIHJlY2VpdmVyLCByZXF1ZXN0IGEgcmVjdl9ydGNwX3NpbmsgcGFkLAorICogd2hpY2ggd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIHN5bmNfc3JjIHBhZC4gUGFja2V0cyByZWNlaXZlZCBvbiB0aGUgUlRDUAorICogcGFkIHdpbGwgYmUgdXNlZCBieSB0aGUgc2Vzc2lvbiBtYW5hZ2VyIHRvIHVwZGF0ZSB0aGUgc3RhdHMgYW5kIGRhdGFiYXNlIG9mCisgKiB0aGUgb3RoZXIgcGFydGljaXBhbnRzLiBTUiBwYWNrZXRzIHdpbGwgYmUgZm9yd2FyZGVkIG9uIHRoZSBzeW5jX3NyYyBwYWQKKyAqIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIGludGVyLXN0cmVhbSBzeW5jaHJvbmlzYXRpb24gd2hlbiBuZWVkZWQuCisgKgorICogSWYgeW91IHdhbnQgdGhlIHNlc3Npb24gbWFuYWdlciB0byBnZW5lcmF0ZSBhbmQgc2VuZCBSVENQIHBhY2tldHMsIHJlcXVlc3QKKyAqIHRoZSBzZW5kX3J0Y3Bfc3JjIHBhZC4gUGFja2V0IHB1c2hlZCBvbiB0aGlzIHBhZCBjb250YWluIFNSL1JSIFJUQ1AgcmVwb3J0cworICogdGhhdCBzaG91bGQgYmUgc2VudCB0byBhbGwgcGFydGljaXBhbnRzIGluIHRoZSBzZXNzaW9uLgorICoKKyAqIFRvIHVzZSAjR3N0UnRwU2Vzc2lvbiBhcyBhIHNlbmRlciwgcmVxdWVzdCBhIHNlbmRfcnRwX3NpbmsgcGFkLCB3aGljaCB3aWxsCisgKiBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIHNlbmRfcnRwX3NyYyBwYWQuIFRoZSBzZXNzaW9uIG1hbmFnZXIgd2lsbAorICogZm9yd2FyZCB0aGUgcGFja2V0cyBvbiB0aGUgc2VuZF9ydHBfc3JjIHBhZCBhZnRlciB1cGRhdGluZyBpdHMgaW50ZXJuYWwgc3RhdGUuCisgKgorICogVGhlIHNlc3Npb24gbWFuYWdlciBuZWVkcyB0aGUgY2xvY2stcmF0ZSBvZiB0aGUgcGF5bG9hZCB0eXBlcyBpdCBpcyBoYW5kbGluZworICogYW5kIHdpbGwgc2lnbmFsIHRoZSAjR3N0UnRwU2Vzc2lvbjo6cmVxdWVzdC1wdC1tYXAgc2lnbmFsIHdoZW4gaXQgbmVlZHMgc3VjaCBhCisgKiBtYXBwaW5nLiBPbmUgY2FuIGNsZWFyIHRoZSBjYWNoZWQgdmFsdWVzIHdpdGggdGhlICNHc3RSdHBTZXNzaW9uOjpjbGVhci1wdC1tYXAKKyAqIHNpZ25hbC4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHVkcHNyYyBwb3J0PTUwMDAgY2Fwcz0iYXBwbGljYXRpb24veC1ydHAsIC4uLiIgISAucmVjdl9ydHBfc2luayBydHBzZXNzaW9uIC5yZWN2X3J0cF9zcmMgISBydHB0aGVvcmFkZXBheSAhIHRoZW9yYWRlYyAhIHh2aW1hZ2VzaW5rCisgKiBdfCBSZWNlaXZlIHRoZW9yYSBSVFAgcGFja2V0cyBmcm9tIHBvcnQgNTAwMCBhbmQgc2VuZCB0aGVtIHRvIHRoZSBkZXBheWxvYWRlciwKKyAqIGRlY29kZXIgYW5kIGRpc3BsYXkuIE5vdGUgdGhhdCB0aGUgYXBwbGljYXRpb24veC1ydHAgY2FwcyBvbiB1ZHBzcmMgc2hvdWxkIGJlCisgKiBjb25maWd1cmVkIGJhc2VkIG9uIHNvbWUgbmVnb3RpYXRpb24gcHJvY2VzcyBzdWNoIGFzIFJUU1AgZm9yIHRoaXMgcGlwZWxpbmUKKyAqIHRvIHdvcmsgY29ycmVjdGx5LgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHVkcHNyYyBwb3J0PTUwMDAgY2Fwcz0iYXBwbGljYXRpb24veC1ydHAsIC4uLiIgISAucmVjdl9ydHBfc2luayBydHBzZXNzaW9uIG5hbWU9c2Vzc2lvbiBcCisgKiAgICAgICAgLnJlY3ZfcnRwX3NyYyAhIHJ0cHRoZW9yYWRlcGF5ICEgdGhlb3JhZGVjICEgeHZpbWFnZXNpbmsgXAorICogICAgIHVkcHNyYyBwb3J0PTUwMDEgY2Fwcz0iYXBwbGljYXRpb24veC1ydGNwIiAhIHNlc3Npb24ucmVjdl9ydGNwX3NpbmsKKyAqIF18IFJlY2VpdmUgdGhlb3JhIFJUUCBwYWNrZXRzIGZyb20gcG9ydCA1MDAwIGFuZCBzZW5kIHRoZW0gdG8gdGhlIGRlcGF5bG9hZGVyLAorICogZGVjb2RlciBhbmQgZGlzcGxheS4gUmVjZWl2ZSBSVENQIHBhY2tldHMgZnJvbSBwb3J0IDUwMDEgYW5kIHByb2Nlc3MgdGhlbSBpbgorICogdGhlIHNlc3Npb24gbWFuYWdlci4KKyAqIE5vdGUgdGhhdCB0aGUgYXBwbGljYXRpb24veC1ydHAgY2FwcyBvbiB1ZHBzcmMgc2hvdWxkIGJlCisgKiBjb25maWd1cmVkIGJhc2VkIG9uIHNvbWUgbmVnb3RpYXRpb24gcHJvY2VzcyBzdWNoIGFzIFJUU1AgZm9yIHRoaXMgcGlwZWxpbmUKKyAqIHRvIHdvcmsgY29ycmVjdGx5LgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyAhIHRoZW9yYWVuYyAhIHJ0cHRoZW9yYXBheSAhIC5zZW5kX3J0cF9zaW5rIHJ0cHNlc3Npb24gLnNlbmRfcnRwX3NyYyAhIHVkcHNpbmsgcG9ydD01MDAwCisgKiBdfCBTZW5kIHRoZW9yYSBSVFAgcGFja2V0cyB0aHJvdWdoIHRoZSBzZXNzaW9uIG1hbmFnZXIgYW5kIG91dCBvbiBVRFAgcG9ydAorICogNTAwMC4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB2aWRlb3Rlc3RzcmMgISB0aGVvcmFlbmMgISBydHB0aGVvcmFwYXkgISAuc2VuZF9ydHBfc2luayBydHBzZXNzaW9uIG5hbWU9c2Vzc2lvbiAuc2VuZF9ydHBfc3JjIFwKKyAqICAgICAhIHVkcHNpbmsgcG9ydD01MDAwICBzZXNzaW9uLnNlbmRfcnRjcF9zcmMgISB1ZHBzaW5rIHBvcnQ9NTAwMQorICogXXwgU2VuZCB0aGVvcmEgUlRQIHBhY2tldHMgdGhyb3VnaCB0aGUgc2Vzc2lvbiBtYW5hZ2VyIGFuZCBvdXQgb24gVURQIHBvcnQKKyAqIDUwMDAuIFNlbmQgUlRDUCBwYWNrZXRzIG9uIHBvcnQgNTAwMS4gTm90ZSB0aGF0IHRoaXMgcGlwZWxpbmUgd2lsbCBub3QgcHJlcm9sbAorICogY29ycmVjdGx5IGJlY2F1c2UgdGhlIHNlY29uZCB1ZHBzaW5rIHdpbGwgbm90IHByZXJvbGwgY29ycmVjdGx5IChubyBSVENQCisgKiBwYWNrZXRzIGFyZSBzZW50IGluIHRoZSBQQVVTRUQgc3RhdGUpLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG1hbnVhbGx5IHNldCBhbmQKKyAqIGtlZXAgKHNlZSBnc3RfZWxlbWVudF9zZXRfbG9ja2VkX3N0YXRlKCkpIHRoZSBSVENQIHVkcHNpbmsgdG8gdGhlIFBMQVlJTkcgc3RhdGUuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKyNpbmNsdWRlIDxnc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oPgorCisjaW5jbHVkZSAiZ3N0cnRwc2Vzc2lvbi5oIgorI2luY2x1ZGUgInJ0cHNlc3Npb24uaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF9zZXNzaW9uX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9ydHBfc2Vzc2lvbl9kZWJ1ZworCitHVHlwZQorZ3N0X3J0cF9udHBfdGltZV9zb3VyY2VfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB0eXBlID0gMDsKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmFsdWVzW10gPSB7CisgICAge0dTVF9SVFBfTlRQX1RJTUVfU09VUkNFX05UUCwgIk5UUCB0aW1lIGJhc2VkIG9uIHJlYWx0aW1lIGNsb2NrIiwgIm50cCJ9LAorICAgIHtHU1RfUlRQX05UUF9USU1FX1NPVVJDRV9VTklYLCAiVU5JWCB0aW1lIGJhc2VkIG9uIHJlYWx0aW1lIGNsb2NrIiwgInVuaXgifSwKKyAgICB7R1NUX1JUUF9OVFBfVElNRV9TT1VSQ0VfUlVOTklOR19USU1FLAorICAgICAgICAgICJSdW5uaW5nIHRpbWUgYmFzZWQgb24gcGlwZWxpbmUgY2xvY2siLAorICAgICAgICAicnVubmluZy10aW1lIn0sCisgICAge0dTVF9SVFBfTlRQX1RJTUVfU09VUkNFX0NMT0NLX1RJTUUsICJQaXBlbGluZSBjbG9jayB0aW1lIiwgImNsb2NrLXRpbWUifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0sCisgIH07CisKKyAgaWYgKCF0eXBlKSB7CisgICAgdHlwZSA9IGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RSdHBOdHBUaW1lU291cmNlIiwgdmFsdWVzKTsKKyAgfQorICByZXR1cm4gdHlwZTsKK30KKworLyogc2luayBwYWRzICovCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcnRwc2Vzc2lvbl9yZWN2X3J0cF9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgicmVjdl9ydHBfc2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHJ0cHNlc3Npb25fcmVjdl9ydGNwX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJyZWN2X3J0Y3Bfc2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0Y3AiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBydHBzZXNzaW9uX3NlbmRfcnRwX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzZW5kX3J0cF9zaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9SRVFVRVNULAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwIikKKyAgICApOworCisvKiBzcmMgcGFkcyAqLworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHJ0cHNlc3Npb25fcmVjdl9ydHBfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgicmVjdl9ydHBfc3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1NPTUVUSU1FUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHJ0cHNlc3Npb25fc3luY19zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzeW5jX3NyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydGNwIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcnRwc2Vzc2lvbl9zZW5kX3J0cF9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzZW5kX3J0cF9zcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfU09NRVRJTUVTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcnRwc2Vzc2lvbl9zZW5kX3J0Y3Bfc3JjX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2VuZF9ydGNwX3NyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9SRVFVRVNULAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRjcCIpCisgICAgKTsKKworLyogc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICBTSUdOQUxfUkVRVUVTVF9QVF9NQVAsCisgIFNJR05BTF9DTEVBUl9QVF9NQVAsCisKKyAgU0lHTkFMX09OX05FV19TU1JDLAorICBTSUdOQUxfT05fU1NSQ19DT0xMSVNJT04sCisgIFNJR05BTF9PTl9TU1JDX1ZBTElEQVRFRCwKKyAgU0lHTkFMX09OX1NTUkNfQUNUSVZFLAorICBTSUdOQUxfT05fU1NSQ19TREVTLAorICBTSUdOQUxfT05fQllFX1NTUkMsCisgIFNJR05BTF9PTl9CWUVfVElNRU9VVCwKKyAgU0lHTkFMX09OX1RJTUVPVVQsCisgIFNJR05BTF9PTl9TRU5ERVJfVElNRU9VVCwKKyAgU0lHTkFMX09OX05FV19TRU5ERVJfU1NSQywKKyAgU0lHTkFMX09OX1NFTkRFUl9TU1JDX0FDVElWRSwKKyAgTEFTVF9TSUdOQUwKK307CisKKyNkZWZpbmUgREVGQVVMVF9CQU5EV0lEVEggICAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfUlRDUF9GUkFDVElPTiAgICAgICAgUlRQX1NUQVRTX1JUQ1BfRlJBQ1RJT04KKyNkZWZpbmUgREVGQVVMVF9SVENQX1JSX0JBTkRXSURUSCAgICAtMQorI2RlZmluZSBERUZBVUxUX1JUQ1BfUlNfQkFORFdJRFRIICAgIC0xCisjZGVmaW5lIERFRkFVTFRfU0RFUyAgICAgICAgICAgICAgICAgTlVMTAorI2RlZmluZSBERUZBVUxUX05VTV9TT1VSQ0VTICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9OVU1fQUNUSVZFX1NPVVJDRVMgICAwCisjZGVmaW5lIERFRkFVTFRfVVNFX1BJUEVMSU5FX0NMT0NLICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9SVENQX01JTl9JTlRFUlZBTCAgICAoUlRQX1NUQVRTX01JTl9JTlRFUlZBTCAqIEdTVF9TRUNPTkQpCisjZGVmaW5lIERFRkFVTFRfUFJPQkFUSU9OICAgICAgICAgICAgUlRQX0RFRkFVTFRfUFJPQkFUSU9OCisjZGVmaW5lIERFRkFVTFRfTUFYX0RST1BPVVRfVElNRSAgICAgNjAwMDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfTUlTT1JERVJfVElNRSAgICAyMDAwCisjZGVmaW5lIERFRkFVTFRfUlRQX1BST0ZJTEUgICAgICAgICAgR1NUX1JUUF9QUk9GSUxFX0FWUAorI2RlZmluZSBERUZBVUxUX05UUF9USU1FX1NPVVJDRSAgICAgIEdTVF9SVFBfTlRQX1RJTUVfU09VUkNFX05UUAorI2RlZmluZSBERUZBVUxUX1JUQ1BfU1lOQ19TRU5EX1RJTUUgIFRSVUUKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQkFORFdJRFRILAorICBQUk9QX1JUQ1BfRlJBQ1RJT04sCisgIFBST1BfUlRDUF9SUl9CQU5EV0lEVEgsCisgIFBST1BfUlRDUF9SU19CQU5EV0lEVEgsCisgIFBST1BfU0RFUywKKyAgUFJPUF9OVU1fU09VUkNFUywKKyAgUFJPUF9OVU1fQUNUSVZFX1NPVVJDRVMsCisgIFBST1BfSU5URVJOQUxfU0VTU0lPTiwKKyAgUFJPUF9VU0VfUElQRUxJTkVfQ0xPQ0ssCisgIFBST1BfUlRDUF9NSU5fSU5URVJWQUwsCisgIFBST1BfUFJPQkFUSU9OLAorICBQUk9QX01BWF9EUk9QT1VUX1RJTUUsCisgIFBST1BfTUFYX01JU09SREVSX1RJTUUsCisgIFBST1BfU1RBVFMsCisgIFBST1BfUlRQX1BST0ZJTEUsCisgIFBST1BfTlRQX1RJTUVfU09VUkNFLAorICBQUk9QX1JUQ1BfU1lOQ19TRU5EX1RJTUUKK307CisKKyNkZWZpbmUgR1NUX1JUUF9TRVNTSU9OX0dFVF9QUklWQVRFKG9iaikgIFwKKwkgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9QUklWQVRFICgob2JqKSwgR1NUX1RZUEVfUlRQX1NFU1NJT04sIEdzdFJ0cFNlc3Npb25Qcml2YXRlKSkKKworI2RlZmluZSBHU1RfUlRQX1NFU1NJT05fTE9DSyhzZXNzKSAgIGdfbXV0ZXhfbG9jayAoJihzZXNzKS0+cHJpdi0+bG9jaykKKyNkZWZpbmUgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyhzZXNzKSBnX211dGV4X3VubG9jayAoJihzZXNzKS0+cHJpdi0+bG9jaykKKworI2RlZmluZSBHU1RfUlRQX1NFU1NJT05fV0FJVChzZXNzKSAgIGdfY29uZF93YWl0ICgmKHNlc3MpLT5wcml2LT5jb25kLCAmKHNlc3MpLT5wcml2LT5sb2NrKQorI2RlZmluZSBHU1RfUlRQX1NFU1NJT05fU0lHTkFMKHNlc3MpIGdfY29uZF9zaWduYWwgKCYoc2VzcyktPnByaXYtPmNvbmQpCisKK3N0cnVjdCBfR3N0UnRwU2Vzc2lvblByaXZhdGUKK3sKKyAgR011dGV4IGxvY2s7CisgIEdDb25kIGNvbmQ7CisgIEdzdENsb2NrICpzeXNjbG9jazsKKworICBSVFBTZXNzaW9uICpzZXNzaW9uOworCisgIC8qIHRocmVhZCBmb3Igc2VuZGluZyBvdXQgUlRDUCAqLworICBHc3RDbG9ja0lEIGlkOworICBnYm9vbGVhbiBzdG9wX3RocmVhZDsKKyAgR1RocmVhZCAqdGhyZWFkOworICBnYm9vbGVhbiB0aHJlYWRfc3RvcHBlZDsKKyAgZ2Jvb2xlYW4gd2FpdF9zZW5kOworCisgIC8qIGNhcHMgbWFwcGluZyAqLworICBHSGFzaFRhYmxlICpwdG1hcDsKKworICBHc3RDbG9ja1RpbWUgc2VuZF9sYXRlbmN5OworCisgIGdib29sZWFuIHVzZV9waXBlbGluZV9jbG9jazsKKyAgR3N0UnRwTnRwVGltZVNvdXJjZSBudHBfdGltZV9zb3VyY2U7CisgIGdib29sZWFuIHJ0Y3Bfc3luY19zZW5kX3RpbWU7CisKKyAgZ3VpbnQgcnR4X2NvdW50OworfTsKKworLyogY2FsbGJhY2tzIHRvIGhhbmRsZSBhY3Rpb25zIGZyb20gdGhlIHNlc3Npb24gbWFuYWdlciAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9zZXNzaW9uX3Byb2Nlc3NfcnRwIChSVFBTZXNzaW9uICogc2VzcywKKyAgICBSVFBTb3VyY2UgKiBzcmMsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfc2Vzc2lvbl9zZW5kX3J0cCAoUlRQU2Vzc2lvbiAqIHNlc3MsCisgICAgUlRQU291cmNlICogc3JjLCBncG9pbnRlciBkYXRhLCBncG9pbnRlciB1c2VyX2RhdGEpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3J0cF9zZXNzaW9uX3NlbmRfcnRjcCAoUlRQU2Vzc2lvbiAqIHNlc3MsCisgICAgUlRQU291cmNlICogc3JjLCBHc3RCdWZmZXIgKiBidWZmZXIsIGdib29sZWFuIGVvcywgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF9ydHBfc2Vzc2lvbl9zeW5jX3J0Y3AgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlciwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3N0YXRpYyBnaW50IGdzdF9ydHBfc2Vzc2lvbl9jbG9ja19yYXRlIChSVFBTZXNzaW9uICogc2VzcywgZ3VpbnQ4IHBheWxvYWQsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfc2Vzc2lvbl9yZWNvbnNpZGVyIChSVFBTZXNzaW9uICogc2VzcywgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfc2Vzc2lvbl9yZXF1ZXN0X2tleV91bml0IChSVFBTZXNzaW9uICogc2VzcywgZ3VpbnQzMiBzc3JjLAorICAgIGdib29sZWFuIGFsbF9oZWFkZXJzLCBncG9pbnRlciB1c2VyX2RhdGEpOworc3RhdGljIEdzdENsb2NrVGltZSBnc3RfcnRwX3Nlc3Npb25fcmVxdWVzdF90aW1lIChSVFBTZXNzaW9uICogc2Vzc2lvbiwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9zZXNzaW9uX25vdGlmeV9uYWNrIChSVFBTZXNzaW9uICogc2VzcywKKyAgICBndWludDE2IHNlcW51bSwgZ3VpbnQxNiBibHAsIGd1aW50MzIgc3NyYywgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfc2Vzc2lvbl9yZWNvbmZpZ3VyZSAoUlRQU2Vzc2lvbiAqIHNlc3MsIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKK3N0YXRpYyBSVFBTZXNzaW9uQ2FsbGJhY2tzIGNhbGxiYWNrcyA9IHsKKyAgZ3N0X3J0cF9zZXNzaW9uX3Byb2Nlc3NfcnRwLAorICBnc3RfcnRwX3Nlc3Npb25fc2VuZF9ydHAsCisgIGdzdF9ydHBfc2Vzc2lvbl9zeW5jX3J0Y3AsCisgIGdzdF9ydHBfc2Vzc2lvbl9zZW5kX3J0Y3AsCisgIGdzdF9ydHBfc2Vzc2lvbl9jbG9ja19yYXRlLAorICBnc3RfcnRwX3Nlc3Npb25fcmVjb25zaWRlciwKKyAgZ3N0X3J0cF9zZXNzaW9uX3JlcXVlc3Rfa2V5X3VuaXQsCisgIGdzdF9ydHBfc2Vzc2lvbl9yZXF1ZXN0X3RpbWUsCisgIGdzdF9ydHBfc2Vzc2lvbl9ub3RpZnlfbmFjaywKKyAgZ3N0X3J0cF9zZXNzaW9uX3JlY29uZmlndXJlCit9OworCisvKiBHT2JqZWN0IHZtZXRob2RzICovCitzdGF0aWMgdm9pZCBnc3RfcnRwX3Nlc3Npb25fZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9zZXNzaW9uX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9ydHBfc2Vzc2lvbl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKKy8qIEdzdEVsZW1lbnQgdm1ldGhvZHMgKi8KK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfcnRwX3Nlc3Npb25fY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyBHc3RQYWQgKmdzdF9ydHBfc2Vzc2lvbl9yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9zZXNzaW9uX3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfc2Vzc2lvbl9zaW5rX3NldGNhcHMgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbiwgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfc2Vzc2lvbl9zZXRjYXBzX3NlbmRfcnRwIChHc3RQYWQgKiBwYWQsCisgICAgR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24sIEdzdENhcHMgKiBjYXBzKTsKKworc3RhdGljIHZvaWQgZ3N0X3J0cF9zZXNzaW9uX2NsZWFyX3B0X21hcCAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24pOworCitzdGF0aWMgR3N0U3RydWN0dXJlICpnc3RfcnRwX3Nlc3Npb25fY3JlYXRlX3N0YXRzIChHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbik7CisKK3N0YXRpYyBndWludCBnc3RfcnRwX3Nlc3Npb25fc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsKKworc3RhdGljIHZvaWQKK29uX25ld19zc3JjIChSVFBTZXNzaW9uICogc2Vzc2lvbiwgUlRQU291cmNlICogc3JjLCBHc3RSdHBTZXNzaW9uICogc2VzcykKK3sKKyAgZ19zaWduYWxfZW1pdCAoc2VzcywgZ3N0X3J0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX05FV19TU1JDXSwgMCwKKyAgICAgIHNyYy0+c3NyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9zc3JjX2NvbGxpc2lvbiAoUlRQU2Vzc2lvbiAqIHNlc3Npb24sIFJUUFNvdXJjZSAqIHNyYywgR3N0UnRwU2Vzc2lvbiAqIHNlc3MpCit7CisgIEdzdFBhZCAqc2VuZF9ydHBfc2luazsKKworICBnX3NpZ25hbF9lbWl0IChzZXNzLCBnc3RfcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fU1NSQ19DT0xMSVNJT05dLCAwLAorICAgICAgc3JjLT5zc3JjKTsKKworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgIGlmICgoc2VuZF9ydHBfc2luayA9IHNlc3MtPnNlbmRfcnRwX3NpbmspKQorICAgIGdzdF9vYmplY3RfcmVmIChzZW5kX3J0cF9zaW5rKTsKKyAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisKKyAgaWYgKHNlbmRfcnRwX3NpbmspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgICBHc3RFdmVudCAqZXZlbnQ7CisgICAgUlRQU291cmNlICppbnRlcm5hbF9zcmM7CisgICAgZ3VpbnQzMiBzdWdnZXN0ZWRfc3NyYzsKKworICAgIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiR3N0UlRQQ29sbGlzaW9uIiwgInNzcmMiLCBHX1RZUEVfVUlOVCwKKyAgICAgICAgKGd1aW50KSBzcmMtPnNzcmMsIE5VTEwpOworCisgICAgLyogaWYgdGhlcmUgaXMgbm8gc291cmNlIHVzaW5nIHRoZSBzdWdnZXN0ZWQgc3NyYywgbW9zdCBwcm9iYWJseSBiZWNhdXNlCisgICAgICogdGhpcyBzc3JjIGhhcyBqdXN0IGNvbGxpZGVkLCBzdWdnZXN0IHVwc3RyZWFtIHRvIHVzZSBpdCAqLworICAgIHN1Z2dlc3RlZF9zc3JjID0gcnRwX3Nlc3Npb25fc3VnZ2VzdF9zc3JjIChzZXNzaW9uLCBOVUxMKTsKKyAgICBpbnRlcm5hbF9zcmMgPSBydHBfc2Vzc2lvbl9nZXRfc291cmNlX2J5X3NzcmMgKHNlc3Npb24sIHN1Z2dlc3RlZF9zc3JjKTsKKyAgICBpZiAoIWludGVybmFsX3NyYykKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzdHJ1Y3R1cmUsICJzdWdnZXN0ZWQtc3NyYyIsIEdfVFlQRV9VSU5ULAorICAgICAgICAgIChndWludCkgc3VnZ2VzdGVkX3NzcmMsIE5VTEwpOworICAgIGVsc2UKKyAgICAgIGdfb2JqZWN0X3VucmVmIChpbnRlcm5hbF9zcmMpOworCisgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwgc3RydWN0dXJlKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbmRfcnRwX3NpbmssIGV2ZW50KTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzZW5kX3J0cF9zaW5rKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorb25fc3NyY192YWxpZGF0ZWQgKFJUUFNlc3Npb24gKiBzZXNzaW9uLCBSVFBTb3VyY2UgKiBzcmMsIEdzdFJ0cFNlc3Npb24gKiBzZXNzKQoreworICBnX3NpZ25hbF9lbWl0IChzZXNzLCBnc3RfcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fU1NSQ19WQUxJREFURURdLCAwLAorICAgICAgc3JjLT5zc3JjKTsKK30KKworc3RhdGljIHZvaWQKK29uX3NzcmNfYWN0aXZlIChSVFBTZXNzaW9uICogc2Vzc2lvbiwgUlRQU291cmNlICogc3JjLCBHc3RSdHBTZXNzaW9uICogc2VzcykKK3sKKyAgZ19zaWduYWxfZW1pdCAoc2VzcywgZ3N0X3J0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfQUNUSVZFXSwgMCwKKyAgICAgIHNyYy0+c3NyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9zc3JjX3NkZXMgKFJUUFNlc3Npb24gKiBzZXNzaW9uLCBSVFBTb3VyY2UgKiBzcmMsIEdzdFJ0cFNlc3Npb24gKiBzZXNzKQoreworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdzdE1lc3NhZ2UgKm07CisKKyAgLyogY29udmVydCB0aGUgbmV3IFNERVMgaW5mbyBpbnRvIGEgbWVzc2FnZSAqLworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzaW9uKTsKKyAgZ19vYmplY3RfZ2V0IChzcmMsICJzZGVzIiwgJnMsIE5VTEwpOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3Npb24pOworCisgIG0gPSBnc3RfbWVzc2FnZV9uZXdfY3VzdG9tIChHU1RfTUVTU0FHRV9FTEVNRU5ULCBHU1RfT0JKRUNUIChzZXNzKSwgcyk7CisgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAoc2VzcyksIG0pOworCisgIGdfc2lnbmFsX2VtaXQgKHNlc3MsIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TU1JDX1NERVNdLCAwLAorICAgICAgc3JjLT5zc3JjKTsKK30KKworc3RhdGljIHZvaWQKK29uX2J5ZV9zc3JjIChSVFBTZXNzaW9uICogc2Vzc2lvbiwgUlRQU291cmNlICogc3JjLCBHc3RSdHBTZXNzaW9uICogc2VzcykKK3sKKyAgZ19zaWduYWxfZW1pdCAoc2VzcywgZ3N0X3J0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX0JZRV9TU1JDXSwgMCwKKyAgICAgIHNyYy0+c3NyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9ieWVfdGltZW91dCAoUlRQU2Vzc2lvbiAqIHNlc3Npb24sIFJUUFNvdXJjZSAqIHNyYywgR3N0UnRwU2Vzc2lvbiAqIHNlc3MpCit7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MsIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9CWUVfVElNRU9VVF0sIDAsCisgICAgICBzcmMtPnNzcmMpOworfQorCitzdGF0aWMgdm9pZAorb25fdGltZW91dCAoUlRQU2Vzc2lvbiAqIHNlc3Npb24sIFJUUFNvdXJjZSAqIHNyYywgR3N0UnRwU2Vzc2lvbiAqIHNlc3MpCit7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MsIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9USU1FT1VUXSwgMCwKKyAgICAgIHNyYy0+c3NyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9zZW5kZXJfdGltZW91dCAoUlRQU2Vzc2lvbiAqIHNlc3Npb24sIFJUUFNvdXJjZSAqIHNyYywgR3N0UnRwU2Vzc2lvbiAqIHNlc3MpCit7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MsIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TRU5ERVJfVElNRU9VVF0sIDAsCisgICAgICBzcmMtPnNzcmMpOworfQorCitzdGF0aWMgdm9pZAorb25fbmV3X3NlbmRlcl9zc3JjIChSVFBTZXNzaW9uICogc2Vzc2lvbiwgUlRQU291cmNlICogc3JjLCBHc3RSdHBTZXNzaW9uICogc2VzcykKK3sKKyAgZ19zaWduYWxfZW1pdCAoc2VzcywgZ3N0X3J0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX05FV19TRU5ERVJfU1NSQ10sIDAsCisgICAgICBzcmMtPnNzcmMpOworfQorCitzdGF0aWMgdm9pZAorb25fc2VuZGVyX3NzcmNfYWN0aXZlIChSVFBTZXNzaW9uICogc2Vzc2lvbiwgUlRQU291cmNlICogc3JjLAorICAgIEdzdFJ0cFNlc3Npb24gKiBzZXNzKQoreworICBnX3NpZ25hbF9lbWl0IChzZXNzLCBnc3RfcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fU0VOREVSX1NTUkNfQUNUSVZFXSwgMCwKKyAgICAgIHNyYy0+c3NyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9ub3RpZnlfc3RhdHMgKFJUUFNlc3Npb24gKiBzZXNzaW9uLCBHUGFyYW1TcGVjICogc3BlYywKKyAgICBHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbikKK3sKKyAgZ19vYmplY3Rfbm90aWZ5IChHX09CSkVDVCAocnRwc2Vzc2lvbiksICJzdGF0cyIpOworfQorCisjZGVmaW5lIGdzdF9ydHBfc2Vzc2lvbl9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RSdHBTZXNzaW9uLCBnc3RfcnRwX3Nlc3Npb24sIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zZXNzaW9uX2NsYXNzX2luaXQgKEdzdFJ0cFNlc3Npb25DbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ190eXBlX2NsYXNzX2FkZF9wcml2YXRlIChrbGFzcywgc2l6ZW9mIChHc3RSdHBTZXNzaW9uUHJpdmF0ZSkpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9zZXNzaW9uX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfcnRwX3Nlc3Npb25fc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX3Nlc3Npb25fZ2V0X3Byb3BlcnR5OworCisgIC8qKgorICAgKiBHc3RSdHBTZXNzaW9uOjpyZXF1ZXN0LXB0LW1hcDoKKyAgICogQHNlc3M6IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAcHQ6IHRoZSBwdAorICAgKgorICAgKiBSZXF1ZXN0IHRoZSBwYXlsb2FkIHR5cGUgYXMgI0dzdENhcHMgZm9yIEBwdC4KKyAgICovCisgIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9SRVFVRVNUX1BUX01BUF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgicmVxdWVzdC1wdC1tYXAiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwU2Vzc2lvbkNsYXNzLCByZXF1ZXN0X3B0X21hcCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR1NUX1RZUEVfQ0FQUywgMSwgR19UWVBFX1VJTlQpOworICAvKioKKyAgICogR3N0UnRwU2Vzc2lvbjo6Y2xlYXItcHQtbWFwOgorICAgKiBAc2VzczogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqCisgICAqIENsZWFyIHRoZSBjYWNoZWQgcHQtbWFwcyByZXF1ZXN0ZWQgd2l0aCAjR3N0UnRwU2Vzc2lvbjo6cmVxdWVzdC1wdC1tYXAuCisgICAqLworICBnc3RfcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfQ0xFQVJfUFRfTUFQXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJjbGVhci1wdC1tYXAiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfQUNUSU9OLCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFNlc3Npb25DbGFzcywgY2xlYXJfcHRfbWFwKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19WT0lELCBHX1RZUEVfTk9ORSwgMCwgR19UWVBFX05PTkUpOworCisgIC8qKgorICAgKiBHc3RSdHBTZXNzaW9uOjpvbi1uZXctc3NyYzoKKyAgICogQHNlc3M6IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc3NyYzogdGhlIFNTUkMKKyAgICoKKyAgICogTm90aWZ5IG9mIGEgbmV3IFNTUkMgdGhhdCBlbnRlcmVkIEBzZXNzaW9uLgorICAgKi8KKyAgZ3N0X3J0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX05FV19TU1JDXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1uZXctc3NyYyIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBTZXNzaW9uQ2xhc3MsIG9uX25ld19zc3JjKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19VSU5ULCBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX1VJTlQpOworICAvKioKKyAgICogR3N0UnRwU2Vzc2lvbjo6b24tc3NyY19jb2xsaXNpb246CisgICAqIEBzZXNzOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSB3aGVuIHdlIGhhdmUgYW4gU1NSQyBjb2xsaXNpb24KKyAgICovCisgIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TU1JDX0NPTExJU0lPTl0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tc3NyYy1jb2xsaXNpb24iLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwU2Vzc2lvbkNsYXNzLAorICAgICAgICAgIG9uX3NzcmNfY29sbGlzaW9uKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1VJTlQsCisgICAgICBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX1VJTlQpOworICAvKioKKyAgICogR3N0UnRwU2Vzc2lvbjo6b24tc3NyY192YWxpZGF0ZWQ6CisgICAqIEBzZXNzOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhIG5ldyBTU1JDIHRoYXQgYmVjYW1lIHZhbGlkYXRlZC4KKyAgICovCisgIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TU1JDX1ZBTElEQVRFRF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tc3NyYy12YWxpZGF0ZWQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwU2Vzc2lvbkNsYXNzLAorICAgICAgICAgIG9uX3NzcmNfdmFsaWRhdGVkKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1VJTlQsCisgICAgICBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX1VJTlQpOworICAvKioKKyAgICogR3N0UnRwU2Vzc2lvbjo6b24tc3NyYy1hY3RpdmU6CisgICAqIEBzZXNzOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhIFNTUkMgdGhhdCBpcyBhY3RpdmUsIGkuZS4sIHNlbmRpbmcgUlRDUC4KKyAgICovCisgIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TU1JDX0FDVElWRV0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tc3NyYy1hY3RpdmUiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwU2Vzc2lvbkNsYXNzLAorICAgICAgICAgIG9uX3NzcmNfYWN0aXZlKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1VJTlQsCisgICAgICBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX1VJTlQpOworICAvKioKKyAgICogR3N0UnRwU2Vzc2lvbjo6b24tc3NyYy1zZGVzOgorICAgKiBAc2Vzc2lvbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzcmM6IHRoZSBTU1JDCisgICAqCisgICAqIE5vdGlmeSB0aGF0IGEgbmV3IFNERVMgd2FzIHJlY2VpdmVkIGZvciBTU1JDLgorICAgKi8KKyAgZ3N0X3J0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfU0RFU10gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tc3NyYy1zZGVzIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFNlc3Npb25DbGFzcywgb25fc3NyY19zZGVzKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19VSU5ULCBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX1VJTlQpOworCisgIC8qKgorICAgKiBHc3RSdHBTZXNzaW9uOjpvbi1ieWUtc3NyYzoKKyAgICogQHNlc3M6IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc3NyYzogdGhlIFNTUkMKKyAgICoKKyAgICogTm90aWZ5IG9mIGFuIFNTUkMgdGhhdCBiZWNhbWUgaW5hY3RpdmUgYmVjYXVzZSBvZiBhIEJZRSBwYWNrZXQuCisgICAqLworICBnc3RfcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fQllFX1NTUkNdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLWJ5ZS1zc3JjIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFNlc3Npb25DbGFzcywgb25fYnllX3NzcmMpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1VJTlQsIEdfVFlQRV9OT05FLCAxLCBHX1RZUEVfVUlOVCk7CisgIC8qKgorICAgKiBHc3RSdHBTZXNzaW9uOjpvbi1ieWUtdGltZW91dDoKKyAgICogQHNlc3M6IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc3NyYzogdGhlIFNTUkMKKyAgICoKKyAgICogTm90aWZ5IG9mIGFuIFNTUkMgdGhhdCBoYXMgdGltZWQgb3V0IGJlY2F1c2Ugb2YgQllFCisgICAqLworICBnc3RfcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fQllFX1RJTUVPVVRdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLWJ5ZS10aW1lb3V0IiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFNlc3Npb25DbGFzcywgb25fYnllX3RpbWVvdXQpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1VJTlQsIEdfVFlQRV9OT05FLCAxLCBHX1RZUEVfVUlOVCk7CisgIC8qKgorICAgKiBHc3RSdHBTZXNzaW9uOjpvbi10aW1lb3V0OgorICAgKiBAc2VzczogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzc3JjOiB0aGUgU1NSQworICAgKgorICAgKiBOb3RpZnkgb2YgYW4gU1NSQyB0aGF0IGhhcyB0aW1lZCBvdXQKKyAgICovCisgIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9USU1FT1VUXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi10aW1lb3V0IiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFNlc3Npb25DbGFzcywgb25fdGltZW91dCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fVUlOVCwgR19UWVBFX05PTkUsIDEsIEdfVFlQRV9VSU5UKTsKKyAgLyoqCisgICAqIEdzdFJ0cFNlc3Npb246Om9uLXNlbmRlci10aW1lb3V0OgorICAgKiBAc2VzczogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzc3JjOiB0aGUgU1NSQworICAgKgorICAgKiBOb3RpZnkgb2YgYSBzZW5kZXIgU1NSQyB0aGF0IGhhcyB0aW1lZCBvdXQgYW5kIGJlY2FtZSBhIHJlY2VpdmVyCisgICAqLworICBnc3RfcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fU0VOREVSX1RJTUVPVVRdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXNlbmRlci10aW1lb3V0IiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFNlc3Npb25DbGFzcywKKyAgICAgICAgICBvbl9zZW5kZXJfdGltZW91dCksIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19VSU5ULAorICAgICAgR19UWVBFX05PTkUsIDEsIEdfVFlQRV9VSU5UKTsKKworICAvKioKKyAgICogR3N0UnRwU2Vzc2lvbjo6b24tbmV3LXNlbmRlci1zc3JjOgorICAgKiBAc2VzczogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzc3JjOiB0aGUgc2VuZGVyIFNTUkMKKyAgICoKKyAgICogTm90aWZ5IG9mIGEgbmV3IHNlbmRlciBTU1JDIHRoYXQgZW50ZXJlZCBAc2Vzc2lvbi4KKyAgICoKKyAgICogU2luY2U6IDEuOAorICAgKi8KKyAgZ3N0X3J0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX05FV19TRU5ERVJfU1NSQ10gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tbmV3LXNlbmRlci1zc3JjIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFNlc3Npb25DbGFzcywgb25fbmV3X3NzcmMpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1VJTlQsIEdfVFlQRV9OT05FLCAxLCBHX1RZUEVfVUlOVCk7CisKKyAgLyoqCisgICAqIEdzdFJ0cFNlc3Npb246Om9uLXNlbmRlci1zc3JjLWFjdGl2ZToKKyAgICogQHNlc3M6IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc3NyYzogdGhlIHNlbmRlciBTU1JDCisgICAqCisgICAqIE5vdGlmeSBvZiBhIHNlbmRlciBTU1JDIHRoYXQgaXMgYWN0aXZlLCBpLmUuLCBzZW5kaW5nIFJUQ1AuCisgICAqCisgICAqIFNpbmNlOiAxLjgKKyAgICovCisgIGdzdF9ydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TRU5ERVJfU1NSQ19BQ1RJVkVdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXNlbmRlci1zc3JjLWFjdGl2ZSIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBTZXNzaW9uQ2xhc3MsCisgICAgICAgICAgb25fc3NyY19hY3RpdmUpLCBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fVUlOVCwKKyAgICAgIEdfVFlQRV9OT05FLCAxLCBHX1RZUEVfVUlOVCk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CQU5EV0lEVEgsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZHdpZHRoIiwgIkJhbmR3aWR0aCIsCisgICAgICAgICAgIlRoZSBiYW5kd2lkdGggb2YgdGhlIHNlc3Npb24gaW4gYnl0ZXMgcGVyIHNlY29uZCAoMCBmb3IgYXV0by1kaXNjb3ZlcikiLAorICAgICAgICAgIDAuMCwgR19NQVhET1VCTEUsIERFRkFVTFRfQkFORFdJRFRILAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRDUF9GUkFDVElPTiwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJydGNwLWZyYWN0aW9uIiwgIlJUQ1AgRnJhY3Rpb24iLAorICAgICAgICAgICJUaGUgUlRDUCBiYW5kd2lkdGggb2YgdGhlIHNlc3Npb24gaW4gYnl0ZXMgcGVyIHNlY29uZCAiCisgICAgICAgICAgIihvciBhcyBhIHJlYWwgZnJhY3Rpb24gb2YgdGhlIFJUUCBiYW5kd2lkdGggaWYgPCAxLjApIiwKKyAgICAgICAgICAwLjAsIEdfTUFYRE9VQkxFLCBERUZBVUxUX1JUQ1BfRlJBQ1RJT04sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVENQX1JSX0JBTkRXSURUSCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJydGNwLXJyLWJhbmR3aWR0aCIsICJSVENQIFJSIGJhbmR3aWR0aCIsCisgICAgICAgICAgIlRoZSBSVENQIGJhbmR3aWR0aCB1c2VkIGZvciByZWNlaXZlcnMgaW4gYnl0ZXMgcGVyIHNlY29uZCAoLTEgPSBkZWZhdWx0KSIsCisgICAgICAgICAgLTEsIEdfTUFYSU5ULCBERUZBVUxUX1JUQ1BfUlJfQkFORFdJRFRILAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRDUF9SU19CQU5EV0lEVEgsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicnRjcC1ycy1iYW5kd2lkdGgiLCAiUlRDUCBSUyBiYW5kd2lkdGgiLAorICAgICAgICAgICJUaGUgUlRDUCBiYW5kd2lkdGggdXNlZCBmb3Igc2VuZGVycyBpbiBieXRlcyBwZXIgc2Vjb25kICgtMSA9IGRlZmF1bHQpIiwKKyAgICAgICAgICAtMSwgR19NQVhJTlQsIERFRkFVTFRfUlRDUF9SU19CQU5EV0lEVEgsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TREVTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgic2RlcyIsICJTREVTIiwKKyAgICAgICAgICAiVGhlIFNERVMgaXRlbXMgb2YgdGhpcyBzZXNzaW9uIiwKKyAgICAgICAgICBHU1RfVFlQRV9TVFJVQ1RVUkUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTlVNX1NPVVJDRVMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm51bS1zb3VyY2VzIiwgIk51bSBTb3VyY2VzIiwKKyAgICAgICAgICAiVGhlIG51bWJlciBvZiBzb3VyY2VzIGluIHRoZSBzZXNzaW9uIiwgMCwgR19NQVhVSU5ULAorICAgICAgICAgIERFRkFVTFRfTlVNX1NPVVJDRVMsIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9OVU1fQUNUSVZFX1NPVVJDRVMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm51bS1hY3RpdmUtc291cmNlcyIsICJOdW0gQWN0aXZlIFNvdXJjZXMiLAorICAgICAgICAgICJUaGUgbnVtYmVyIG9mIGFjdGl2ZSBzb3VyY2VzIGluIHRoZSBzZXNzaW9uIiwgMCwgR19NQVhVSU5ULAorICAgICAgICAgIERFRkFVTFRfTlVNX0FDVElWRV9TT1VSQ0VTLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9JTlRFUk5BTF9TRVNTSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoImludGVybmFsLXNlc3Npb24iLCAiSW50ZXJuYWwgU2Vzc2lvbiIsCisgICAgICAgICAgIlRoZSBpbnRlcm5hbCBSVFBTZXNzaW9uIG9iamVjdCIsIFJUUF9UWVBFX1NFU1NJT04sCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1VTRV9QSVBFTElORV9DTE9DSywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgidXNlLXBpcGVsaW5lLWNsb2NrIiwgIlVzZSBwaXBlbGluZSBjbG9jayIsCisgICAgICAgICAgIlVzZSB0aGUgcGlwZWxpbmUgcnVubmluZy10aW1lIHRvIHNldCB0aGUgTlRQIHRpbWUgaW4gdGhlIFJUQ1AgU1IgbWVzc2FnZXMgIgorICAgICAgICAgICIoREVQUkVDQVRFRDogVXNlIG50cC10aW1lLXNvdXJjZSBwcm9wZXJ0eSkiLAorICAgICAgICAgIERFRkFVTFRfVVNFX1BJUEVMSU5FX0NMT0NLLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdfUEFSQU1fREVQUkVDQVRFRCkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRDUF9NSU5fSU5URVJWQUwsCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgicnRjcC1taW4taW50ZXJ2YWwiLCAiTWluaW11bSBSVENQIGludGVydmFsIiwKKyAgICAgICAgICAiTWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIFJlZ3VsYXIgUlRDUCBwYWNrZXQgKGluIG5zKSIsCisgICAgICAgICAgMCwgR19NQVhVSU5UNjQsIERFRkFVTFRfUlRDUF9NSU5fSU5URVJWQUwsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QUk9CQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInByb2JhdGlvbiIsICJOdW1iZXIgb2YgcHJvYmF0aW9ucyIsCisgICAgICAgICAgIkNvbnNlY3V0aXZlIHBhY2tldCBzZXF1ZW5jZSBudW1iZXJzIHRvIGFjY2VwdCB0aGUgc291cmNlIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfUFJPQkFUSU9OLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX0RST1BPVVRfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LWRyb3BvdXQtdGltZSIsICJNYXggZHJvcG91dCB0aW1lIiwKKyAgICAgICAgICAiVGhlIG1heGltdW0gdGltZSAobWlsbGlzZWNvbmRzKSBvZiBtaXNzaW5nIHBhY2tldHMgdG9sZXJhdGVkLiIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCBERUZBVUxUX01BWF9EUk9QT1VUX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfTUlTT1JERVJfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LW1pc29yZGVyLXRpbWUiLCAiTWF4IG1pc29yZGVyIHRpbWUiLAorICAgICAgICAgICJUaGUgbWF4aW11bSB0aW1lIChtaWxsaXNlY29uZHMpIG9mIG1pc29yZGVyZWQgcGFja2V0cyB0b2xlcmF0ZWQuIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfTUFYX01JU09SREVSX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFJ0cFNlc3Npb246OnN0YXRzOgorICAgKgorICAgKiBWYXJpb3VzIHNlc3Npb24gc3RhdGlzdGljcy4gVGhpcyBwcm9wZXJ0eSByZXR1cm5zIGEgR3N0U3RydWN0dXJlCisgICAqIHdpdGggbmFtZSBhcHBsaWNhdGlvbi94LXJ0cC1zZXNzaW9uLXN0YXRzIHdpdGggdGhlIGZvbGxvd2luZyBmaWVsZHM6CisgICAqCisgICAqICAicnR4LWNvdW50IiAgICAgICBHX1RZUEVfVUlOVCAgIFRoZSBudW1iZXIgb2YgcmV0cmFuc21pc3Npb24gZXZlbnRzCisgICAqICAgICAgcmVjZWl2ZWQgZnJvbSBkb3duc3RyZWFtIChpbiByZWNlaXZlciBtb2RlKQorICAgKiAgInJ0eC1kcm9wLWNvdW50IiAgR19UWVBFX1VJTlQgICBUaGUgbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9uIGV2ZW50cworICAgKiAgICAgIGRyb3BwZWQgKGR1ZSB0byBiYW5kd2lkdGggY29uc3RyYWludHMpCisgICAqICAic2VudC1uYWNrLWNvdW50IiBHX1RZUEVfVUlOVCAgIE51bWJlciBvZiBOQUNLcyBzZW50CisgICAqICAicmVjdi1uYWNrLWNvdW50IiBHX1RZUEVfVUlOVCAgIE51bWJlciBvZiBOQUNLcyByZWNlaXZlZAorICAgKiAgInNvdXJjZS1zdGF0cyIgICAgR19UWVBFX0JPWEVEICBHVmFsdWVBcnJheSBvZiAjUlRQU291cmNlOjpzdGF0cyBmb3IgYWxsCisgICAqICAgICAgUlRQIHNvdXJjZXMgKFNpbmNlIDEuOCkKKyAgICoKKyAgICogU2luY2U6IDEuNAorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TVEFUUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoInN0YXRzIiwgIlN0YXRpc3RpY3MiLAorICAgICAgICAgICJWYXJpb3VzIHN0YXRpc3RpY3MiLCBHU1RfVFlQRV9TVFJVQ1RVUkUsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JUUF9QUk9GSUxFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJydHAtcHJvZmlsZSIsICJSVFAgUHJvZmlsZSIsCisgICAgICAgICAgIlJUUCBwcm9maWxlIHRvIHVzZSIsIEdTVF9UWVBFX1JUUF9QUk9GSUxFLCBERUZBVUxUX1JUUF9QUk9GSUxFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTlRQX1RJTUVfU09VUkNFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJudHAtdGltZS1zb3VyY2UiLCAiTlRQIFRpbWUgU291cmNlIiwKKyAgICAgICAgICAiTlRQIHRpbWUgc291cmNlIGZvciBSVENQIHBhY2tldHMiLAorICAgICAgICAgIGdzdF9ydHBfbnRwX3RpbWVfc291cmNlX2dldF90eXBlICgpLCBERUZBVUxUX05UUF9USU1FX1NPVVJDRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JUQ1BfU1lOQ19TRU5EX1RJTUUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInJ0Y3Atc3luYy1zZW5kLXRpbWUiLCAiUlRDUCBTeW5jIFNlbmQgVGltZSIsCisgICAgICAgICAgIlVzZSBzZW5kIHRpbWUgb3IgY2FwdHVyZSB0aW1lIGZvciBSVENQIHN5bmMgIgorICAgICAgICAgICIoVFJVRSA9IHNlbmQgdGltZSwgRkFMU0UgPSBjYXB0dXJlIHRpbWUpIiwKKyAgICAgICAgICBERUZBVUxUX1JUQ1BfU1lOQ19TRU5EX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX3Nlc3Npb25fY2hhbmdlX3N0YXRlKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVxdWVzdF9uZXdfcGFkID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX3Nlc3Npb25fcmVxdWVzdF9uZXdfcGFkKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVsZWFzZV9wYWQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfc2Vzc2lvbl9yZWxlYXNlX3BhZCk7CisKKyAga2xhc3MtPmNsZWFyX3B0X21hcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX3Nlc3Npb25fY2xlYXJfcHRfbWFwKTsKKworICAvKiBzaW5rIHBhZHMgKi8KKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmcnRwc2Vzc2lvbl9yZWN2X3J0cF9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmcnRwc2Vzc2lvbl9yZWN2X3J0Y3Bfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJnJ0cHNlc3Npb25fc2VuZF9ydHBfc2lua190ZW1wbGF0ZSk7CisKKyAgLyogc3JjIHBhZHMgKi8KKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmcnRwc2Vzc2lvbl9yZWN2X3J0cF9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZydHBzZXNzaW9uX3N5bmNfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmcnRwc2Vzc2lvbl9zZW5kX3J0cF9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZydHBzZXNzaW9uX3NlbmRfcnRjcF9zcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJSVFAgU2Vzc2lvbiIsCisgICAgICAiRmlsdGVyL05ldHdvcmsvUlRQIiwKKyAgICAgICJJbXBsZW1lbnQgYW4gUlRQIHNlc3Npb24iLCAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3J0cF9zZXNzaW9uX2RlYnVnLAorICAgICAgInJ0cHNlc3Npb24iLCAwLCAiUlRQIFNlc3Npb24iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc2Vzc2lvbl9pbml0IChHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbikKK3sKKyAgcnRwc2Vzc2lvbi0+cHJpdiA9IEdTVF9SVFBfU0VTU0lPTl9HRVRfUFJJVkFURSAocnRwc2Vzc2lvbik7CisgIGdfbXV0ZXhfaW5pdCAoJnJ0cHNlc3Npb24tPnByaXYtPmxvY2spOworICBnX2NvbmRfaW5pdCAoJnJ0cHNlc3Npb24tPnByaXYtPmNvbmQpOworICBydHBzZXNzaW9uLT5wcml2LT5zeXNjbG9jayA9IGdzdF9zeXN0ZW1fY2xvY2tfb2J0YWluICgpOworICBydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uID0gcnRwX3Nlc3Npb25fbmV3ICgpOworICBydHBzZXNzaW9uLT5wcml2LT51c2VfcGlwZWxpbmVfY2xvY2sgPSBERUZBVUxUX1VTRV9QSVBFTElORV9DTE9DSzsKKyAgcnRwc2Vzc2lvbi0+cHJpdi0+cnRjcF9zeW5jX3NlbmRfdGltZSA9IERFRkFVTFRfUlRDUF9TWU5DX1NFTkRfVElNRTsKKworICAvKiBjb25maWd1cmUgY2FsbGJhY2tzICovCisgIHJ0cF9zZXNzaW9uX3NldF9jYWxsYmFja3MgKHJ0cHNlc3Npb24tPnByaXYtPnNlc3Npb24sICZjYWxsYmFja3MsIHJ0cHNlc3Npb24pOworICAvKiBjb25maWd1cmUgc2lnbmFscyAqLworICBnX3NpZ25hbF9jb25uZWN0IChydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uLCAib24tbmV3LXNzcmMiLAorICAgICAgKEdDYWxsYmFjaykgb25fbmV3X3NzcmMsIHJ0cHNlc3Npb24pOworICBnX3NpZ25hbF9jb25uZWN0IChydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uLCAib24tc3NyYy1jb2xsaXNpb24iLAorICAgICAgKEdDYWxsYmFjaykgb25fc3NyY19jb2xsaXNpb24sIHJ0cHNlc3Npb24pOworICBnX3NpZ25hbF9jb25uZWN0IChydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uLCAib24tc3NyYy12YWxpZGF0ZWQiLAorICAgICAgKEdDYWxsYmFjaykgb25fc3NyY192YWxpZGF0ZWQsIHJ0cHNlc3Npb24pOworICBnX3NpZ25hbF9jb25uZWN0IChydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uLCAib24tc3NyYy1hY3RpdmUiLAorICAgICAgKEdDYWxsYmFjaykgb25fc3NyY19hY3RpdmUsIHJ0cHNlc3Npb24pOworICBnX3NpZ25hbF9jb25uZWN0IChydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uLCAib24tc3NyYy1zZGVzIiwKKyAgICAgIChHQ2FsbGJhY2spIG9uX3NzcmNfc2RlcywgcnRwc2Vzc2lvbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cHNlc3Npb24tPnByaXYtPnNlc3Npb24sICJvbi1ieWUtc3NyYyIsCisgICAgICAoR0NhbGxiYWNrKSBvbl9ieWVfc3NyYywgcnRwc2Vzc2lvbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cHNlc3Npb24tPnByaXYtPnNlc3Npb24sICJvbi1ieWUtdGltZW91dCIsCisgICAgICAoR0NhbGxiYWNrKSBvbl9ieWVfdGltZW91dCwgcnRwc2Vzc2lvbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cHNlc3Npb24tPnByaXYtPnNlc3Npb24sICJvbi10aW1lb3V0IiwKKyAgICAgIChHQ2FsbGJhY2spIG9uX3RpbWVvdXQsIHJ0cHNlc3Npb24pOworICBnX3NpZ25hbF9jb25uZWN0IChydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uLCAib24tc2VuZGVyLXRpbWVvdXQiLAorICAgICAgKEdDYWxsYmFjaykgb25fc2VuZGVyX3RpbWVvdXQsIHJ0cHNlc3Npb24pOworICBnX3NpZ25hbF9jb25uZWN0IChydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uLCAib24tbmV3LXNlbmRlci1zc3JjIiwKKyAgICAgIChHQ2FsbGJhY2spIG9uX25ld19zZW5kZXJfc3NyYywgcnRwc2Vzc2lvbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cHNlc3Npb24tPnByaXYtPnNlc3Npb24sICJvbi1zZW5kZXItc3NyYy1hY3RpdmUiLAorICAgICAgKEdDYWxsYmFjaykgb25fc2VuZGVyX3NzcmNfYWN0aXZlLCBydHBzZXNzaW9uKTsKKyAgZ19zaWduYWxfY29ubmVjdCAocnRwc2Vzc2lvbi0+cHJpdi0+c2Vzc2lvbiwgIm5vdGlmeTo6c3RhdHMiLAorICAgICAgKEdDYWxsYmFjaykgb25fbm90aWZ5X3N0YXRzLCBydHBzZXNzaW9uKTsKKyAgcnRwc2Vzc2lvbi0+cHJpdi0+cHRtYXAgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9jYXBzX3VucmVmKTsKKworICBnc3Rfc2VnbWVudF9pbml0ICgmcnRwc2Vzc2lvbi0+cmVjdl9ydHBfc2VnLCBHU1RfRk9STUFUX1VOREVGSU5FRCk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZydHBzZXNzaW9uLT5zZW5kX3J0cF9zZWcsIEdTVF9GT1JNQVRfVU5ERUZJTkVEKTsKKworICBydHBzZXNzaW9uLT5wcml2LT50aHJlYWRfc3RvcHBlZCA9IFRSVUU7CisKKyAgcnRwc2Vzc2lvbi0+cHJpdi0+cnR4X2NvdW50ID0gMDsKKworICBydHBzZXNzaW9uLT5wcml2LT5udHBfdGltZV9zb3VyY2UgPSBERUZBVUxUX05UUF9USU1FX1NPVVJDRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc2Vzc2lvbl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UnRwU2Vzc2lvbiAqcnRwc2Vzc2lvbjsKKworICBydHBzZXNzaW9uID0gR1NUX1JUUF9TRVNTSU9OIChvYmplY3QpOworCisgIGdfaGFzaF90YWJsZV9kZXN0cm95IChydHBzZXNzaW9uLT5wcml2LT5wdG1hcCk7CisgIGdfbXV0ZXhfY2xlYXIgKCZydHBzZXNzaW9uLT5wcml2LT5sb2NrKTsKKyAgZ19jb25kX2NsZWFyICgmcnRwc2Vzc2lvbi0+cHJpdi0+Y29uZCk7CisgIGdfb2JqZWN0X3VucmVmIChydHBzZXNzaW9uLT5wcml2LT5zeXNjbG9jayk7CisgIGdfb2JqZWN0X3VucmVmIChydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3Nlc3Npb25fc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisgIEdzdFJ0cFNlc3Npb25Qcml2YXRlICpwcml2OworCisgIHJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKG9iamVjdCk7CisgIHByaXYgPSBydHBzZXNzaW9uLT5wcml2OworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9CQU5EV0lEVEg6CisgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChwcml2LT5zZXNzaW9uKSwgImJhbmR3aWR0aCIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX0ZSQUNUSU9OOgorICAgICAgZ19vYmplY3Rfc2V0X3Byb3BlcnR5IChHX09CSkVDVCAocHJpdi0+c2Vzc2lvbiksICJydGNwLWZyYWN0aW9uIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUQ1BfUlJfQkFORFdJRFRIOgorICAgICAgZ19vYmplY3Rfc2V0X3Byb3BlcnR5IChHX09CSkVDVCAocHJpdi0+c2Vzc2lvbiksICJydGNwLXJyLWJhbmR3aWR0aCIsCisgICAgICAgICAgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUQ1BfUlNfQkFORFdJRFRIOgorICAgICAgZ19vYmplY3Rfc2V0X3Byb3BlcnR5IChHX09CSkVDVCAocHJpdi0+c2Vzc2lvbiksICJydGNwLXJzLWJhbmR3aWR0aCIsCisgICAgICAgICAgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NERVM6CisgICAgICBydHBfc2Vzc2lvbl9zZXRfc2Rlc19zdHJ1Y3QgKHByaXYtPnNlc3Npb24sIGdfdmFsdWVfZ2V0X2JveGVkICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRV9QSVBFTElORV9DTE9DSzoKKyAgICAgIHByaXYtPnVzZV9waXBlbGluZV9jbG9jayA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX01JTl9JTlRFUlZBTDoKKyAgICAgIGdfb2JqZWN0X3NldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKHByaXYtPnNlc3Npb24pLCAicnRjcC1taW4taW50ZXJ2YWwiLAorICAgICAgICAgIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9CQVRJT046CisgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChwcml2LT5zZXNzaW9uKSwgInByb2JhdGlvbiIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfRFJPUE9VVF9USU1FOgorICAgICAgZ19vYmplY3Rfc2V0X3Byb3BlcnR5IChHX09CSkVDVCAocHJpdi0+c2Vzc2lvbiksICJtYXgtZHJvcG91dC10aW1lIiwKKyAgICAgICAgICB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX01JU09SREVSX1RJTUU6CisgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChwcml2LT5zZXNzaW9uKSwgIm1heC1taXNvcmRlci10aW1lIiwKKyAgICAgICAgICB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRQX1BST0ZJTEU6CisgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChwcml2LT5zZXNzaW9uKSwgInJ0cC1wcm9maWxlIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05UUF9USU1FX1NPVVJDRToKKyAgICAgIHByaXYtPm50cF90aW1lX3NvdXJjZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX1NZTkNfU0VORF9USU1FOgorICAgICAgcHJpdi0+cnRjcF9zeW5jX3NlbmRfdGltZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc2Vzc2lvbl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UnRwU2Vzc2lvbiAqcnRwc2Vzc2lvbjsKKyAgR3N0UnRwU2Vzc2lvblByaXZhdGUgKnByaXY7CisKKyAgcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTiAob2JqZWN0KTsKKyAgcHJpdiA9IHJ0cHNlc3Npb24tPnByaXY7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0JBTkRXSURUSDoKKyAgICAgIGdfb2JqZWN0X2dldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKHByaXYtPnNlc3Npb24pLCAiYmFuZHdpZHRoIiwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUQ1BfRlJBQ1RJT046CisgICAgICBnX29iamVjdF9nZXRfcHJvcGVydHkgKEdfT0JKRUNUIChwcml2LT5zZXNzaW9uKSwgInJ0Y3AtZnJhY3Rpb24iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRDUF9SUl9CQU5EV0lEVEg6CisgICAgICBnX29iamVjdF9nZXRfcHJvcGVydHkgKEdfT0JKRUNUIChwcml2LT5zZXNzaW9uKSwgInJ0Y3AtcnItYmFuZHdpZHRoIiwKKyAgICAgICAgICB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRDUF9SU19CQU5EV0lEVEg6CisgICAgICBnX29iamVjdF9nZXRfcHJvcGVydHkgKEdfT0JKRUNUIChwcml2LT5zZXNzaW9uKSwgInJ0Y3AtcnMtYmFuZHdpZHRoIiwKKyAgICAgICAgICB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0RFUzoKKyAgICAgIGdfdmFsdWVfdGFrZV9ib3hlZCAodmFsdWUsIHJ0cF9zZXNzaW9uX2dldF9zZGVzX3N0cnVjdCAocHJpdi0+c2Vzc2lvbikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05VTV9TT1VSQ0VTOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0cF9zZXNzaW9uX2dldF9udW1fc291cmNlcyAocHJpdi0+c2Vzc2lvbikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05VTV9BQ1RJVkVfU09VUkNFUzoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLAorICAgICAgICAgIHJ0cF9zZXNzaW9uX2dldF9udW1fYWN0aXZlX3NvdXJjZXMgKHByaXYtPnNlc3Npb24pKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTlRFUk5BTF9TRVNTSU9OOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgcHJpdi0+c2Vzc2lvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFX1BJUEVMSU5FX0NMT0NLOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHByaXYtPnVzZV9waXBlbGluZV9jbG9jayk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRDUF9NSU5fSU5URVJWQUw6CisgICAgICBnX29iamVjdF9nZXRfcHJvcGVydHkgKEdfT0JKRUNUIChwcml2LT5zZXNzaW9uKSwgInJ0Y3AtbWluLWludGVydmFsIiwKKyAgICAgICAgICB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUFJPQkFUSU9OOgorICAgICAgZ19vYmplY3RfZ2V0X3Byb3BlcnR5IChHX09CSkVDVCAocHJpdi0+c2Vzc2lvbiksICJwcm9iYXRpb24iLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX0RST1BPVVRfVElNRToKKyAgICAgIGdfb2JqZWN0X2dldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKHByaXYtPnNlc3Npb24pLCAibWF4LWRyb3BvdXQtdGltZSIsCisgICAgICAgICAgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9NSVNPUkRFUl9USU1FOgorICAgICAgZ19vYmplY3RfZ2V0X3Byb3BlcnR5IChHX09CSkVDVCAocHJpdi0+c2Vzc2lvbiksICJtYXgtbWlzb3JkZXItdGltZSIsCisgICAgICAgICAgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUQVRTOgorICAgICAgZ192YWx1ZV90YWtlX2JveGVkICh2YWx1ZSwgZ3N0X3J0cF9zZXNzaW9uX2NyZWF0ZV9zdGF0cyAocnRwc2Vzc2lvbikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUUF9QUk9GSUxFOgorICAgICAgZ19vYmplY3RfZ2V0X3Byb3BlcnR5IChHX09CSkVDVCAocHJpdi0+c2Vzc2lvbiksICJydHAtcHJvZmlsZSIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9OVFBfVElNRV9TT1VSQ0U6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgcHJpdi0+bnRwX3RpbWVfc291cmNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX1NZTkNfU0VORF9USU1FOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHByaXYtPnJ0Y3Bfc3luY19zZW5kX3RpbWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RydWN0dXJlICoKK2dzdF9ydHBfc2Vzc2lvbl9jcmVhdGVfc3RhdHMgKEdzdFJ0cFNlc3Npb24gKiBydHBzZXNzaW9uKQoreworICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgZ19vYmplY3RfZ2V0IChydHBzZXNzaW9uLT5wcml2LT5zZXNzaW9uLCAic3RhdHMiLCAmcywgTlVMTCk7CisgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAicnR4LWNvdW50IiwgR19UWVBFX1VJTlQsIHJ0cHNlc3Npb24tPnByaXYtPnJ0eF9jb3VudCwKKyAgICAgIE5VTEwpOworCisgIHJldHVybiBzOworfQorCitzdGF0aWMgdm9pZAorZ2V0X2N1cnJlbnRfdGltZXMgKEdzdFJ0cFNlc3Npb24gKiBydHBzZXNzaW9uLCBHc3RDbG9ja1RpbWUgKiBydW5uaW5nX3RpbWUsCisgICAgZ3VpbnQ2NCAqIG50cG5zdGltZSkKK3sKKyAgZ3VpbnQ2NCBudHBucyA9IC0xOworICBHc3RDbG9jayAqY2xvY2s7CisgIEdzdENsb2NrVGltZSBiYXNlX3RpbWUsIHJ0LCBjbG9ja190aW1lOworCisgIEdTVF9PQkpFQ1RfTE9DSyAocnRwc2Vzc2lvbik7CisgIGlmICgoY2xvY2sgPSBHU1RfRUxFTUVOVF9DTE9DSyAocnRwc2Vzc2lvbikpKSB7CisgICAgYmFzZV90aW1lID0gR1NUX0VMRU1FTlRfQ0FTVCAocnRwc2Vzc2lvbiktPmJhc2VfdGltZTsKKyAgICBnc3Rfb2JqZWN0X3JlZiAoY2xvY2spOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHBzZXNzaW9uKTsKKworICAgIC8qIGdldCBjdXJyZW50IGNsb2NrIHRpbWUgYW5kIGNvbnZlcnQgdG8gcnVubmluZyB0aW1lICovCisgICAgY2xvY2tfdGltZSA9IGdzdF9jbG9ja19nZXRfdGltZSAoY2xvY2spOworICAgIHJ0ID0gY2xvY2tfdGltZSAtIGJhc2VfdGltZTsKKworICAgIGlmIChydHBzZXNzaW9uLT5wcml2LT51c2VfcGlwZWxpbmVfY2xvY2spIHsKKyAgICAgIG50cG5zID0gcnQ7CisgICAgICAvKiBhZGQgY29uc3RhbnQgdG8gY29udmVydCBmcm9tIDE5NzAgYmFzZWQgdGltZSB0byAxOTAwIGJhc2VkIHRpbWUgKi8KKyAgICAgIG50cG5zICs9ICgyMjA4OTg4ODAwTEwgKiBHU1RfU0VDT05EKTsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChydHBzZXNzaW9uLT5wcml2LT5udHBfdGltZV9zb3VyY2UpIHsKKyAgICAgICAgY2FzZSBHU1RfUlRQX05UUF9USU1FX1NPVVJDRV9OVFA6CisgICAgICAgIGNhc2UgR1NUX1JUUF9OVFBfVElNRV9TT1VSQ0VfVU5JWDp7CisgICAgICAgICAgR1RpbWVWYWwgY3VycmVudDsKKworICAgICAgICAgIC8qIGdldCBjdXJyZW50IE5UUCB0aW1lICovCisgICAgICAgICAgZ19nZXRfY3VycmVudF90aW1lICgmY3VycmVudCk7CisgICAgICAgICAgbnRwbnMgPSBHU1RfVElNRVZBTF9UT19USU1FIChjdXJyZW50KTsKKworICAgICAgICAgIC8qIGFkZCBjb25zdGFudCB0byBjb252ZXJ0IGZyb20gMTk3MCBiYXNlZCB0aW1lIHRvIDE5MDAgYmFzZWQgdGltZSAqLworICAgICAgICAgIGlmIChydHBzZXNzaW9uLT5wcml2LT5udHBfdGltZV9zb3VyY2UgPT0gR1NUX1JUUF9OVFBfVElNRV9TT1VSQ0VfTlRQKQorICAgICAgICAgICAgbnRwbnMgKz0gKDIyMDg5ODg4MDBMTCAqIEdTVF9TRUNPTkQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgR1NUX1JUUF9OVFBfVElNRV9TT1VSQ0VfUlVOTklOR19USU1FOgorICAgICAgICAgIG50cG5zID0gcnQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX1JUUF9OVFBfVElNRV9TT1VSQ0VfQ0xPQ0tfVElNRToKKyAgICAgICAgICBudHBucyA9IGNsb2NrX3RpbWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgbnRwbnMgPSAtMTsKKyAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChjbG9jayk7CisgIH0gZWxzZSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHJ0cHNlc3Npb24pOworICAgIHJ0ID0gLTE7CisgICAgbnRwbnMgPSAtMTsKKyAgfQorICBpZiAocnVubmluZ190aW1lKQorICAgICpydW5uaW5nX3RpbWUgPSBydDsKKyAgaWYgKG50cG5zdGltZSkKKyAgICAqbnRwbnN0aW1lID0gbnRwbnM7Cit9CisKKy8qIG11c3QgYmUgY2FsbGVkIHdpdGggR1NUX1JUUF9TRVNTSU9OX0xPQ0sgKi8KK3N0YXRpYyB2b2lkCitzaWduYWxfd2FpdGluZ19ydGNwX3RocmVhZF91bmxvY2tlZCAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24pCit7CisgIGlmIChydHBzZXNzaW9uLT5wcml2LT53YWl0X3NlbmQpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocnRwc2Vzc2lvbiwgInNpZ25hbCBSVENQIHRocmVhZCIpOworICAgIHJ0cHNlc3Npb24tPnByaXYtPndhaXRfc2VuZCA9IEZBTFNFOworICAgIEdTVF9SVFBfU0VTU0lPTl9TSUdOQUwgKHJ0cHNlc3Npb24pOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitydGNwX3RocmVhZCAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24pCit7CisgIEdzdENsb2NrSUQgaWQ7CisgIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWU7CisgIEdzdENsb2NrVGltZSBuZXh0X3RpbWVvdXQ7CisgIGd1aW50NjQgbnRwbnN0aW1lOworICBHc3RDbG9ja1RpbWUgcnVubmluZ190aW1lOworICBSVFBTZXNzaW9uICpzZXNzaW9uOworICBHc3RDbG9jayAqc3lzY2xvY2s7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgImVudGVyaW5nIFJUQ1AgdGhyZWFkIik7CisKKyAgR1NUX1JUUF9TRVNTSU9OX0xPQ0sgKHJ0cHNlc3Npb24pOworCisgIHdoaWxlIChydHBzZXNzaW9uLT5wcml2LT53YWl0X3NlbmQpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocnRwc2Vzc2lvbiwgIndhaXRpbmcgZm9yIGdldHRpbmcgc3RhcnRlZCIpOworICAgIEdTVF9SVFBfU0VTU0lPTl9XQUlUIChydHBzZXNzaW9uKTsKKyAgICBHU1RfTE9HX09CSkVDVCAocnRwc2Vzc2lvbiwgInNpZ25hbGVkLi4uIik7CisgIH0KKworICBzeXNjbG9jayA9IHJ0cHNlc3Npb24tPnByaXYtPnN5c2Nsb2NrOworICBjdXJyZW50X3RpbWUgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKHN5c2Nsb2NrKTsKKworICBzZXNzaW9uID0gcnRwc2Vzc2lvbi0+cHJpdi0+c2Vzc2lvbjsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAic3RhcnRpbmcgYXQgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoY3VycmVudF90aW1lKSk7CisgIHNlc3Npb24tPnN0YXJ0X3RpbWUgPSBjdXJyZW50X3RpbWU7CisKKyAgd2hpbGUgKCFydHBzZXNzaW9uLT5wcml2LT5zdG9wX3RocmVhZCkgeworICAgIEdzdENsb2NrUmV0dXJuIHJlczsKKworICAgIC8qIGdldCBpbml0aWFsIGVzdGltYXRlICovCisgICAgbmV4dF90aW1lb3V0ID0gcnRwX3Nlc3Npb25fbmV4dF90aW1lb3V0IChzZXNzaW9uLCBjdXJyZW50X3RpbWUpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgIm5leHQgY2hlY2sgdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKG5leHRfdGltZW91dCkpOworCisgICAgLyogbGVhdmUgaWYgbm8gbW9yZSB0aW1lb3V0cywgdGhlIHNlc3Npb24gZW5kZWQgKi8KKyAgICBpZiAobmV4dF90aW1lb3V0ID09IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgICBicmVhazsKKworICAgIGlkID0gcnRwc2Vzc2lvbi0+cHJpdi0+aWQgPQorICAgICAgICBnc3RfY2xvY2tfbmV3X3NpbmdsZV9zaG90X2lkIChzeXNjbG9jaywgbmV4dF90aW1lb3V0KTsKKyAgICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICAgIHJlcyA9IGdzdF9jbG9ja19pZF93YWl0IChpZCwgTlVMTCk7CisKKyAgICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgICAgZ3N0X2Nsb2NrX2lkX3VucmVmIChpZCk7CisgICAgcnRwc2Vzc2lvbi0+cHJpdi0+aWQgPSBOVUxMOworCisgICAgaWYgKHJ0cHNlc3Npb24tPnByaXYtPnN0b3BfdGhyZWFkKQorICAgICAgYnJlYWs7CisKKyAgICAvKiB1cGRhdGUgY3VycmVudCB0aW1lICovCisgICAgY3VycmVudF90aW1lID0gZ3N0X2Nsb2NrX2dldF90aW1lIChzeXNjbG9jayk7CisKKyAgICAvKiBnZXQgY3VycmVudCBOVFAgdGltZSAqLworICAgIGdldF9jdXJyZW50X3RpbWVzIChydHBzZXNzaW9uLCAmcnVubmluZ190aW1lLCAmbnRwbnN0aW1lKTsKKworICAgIC8qIHdlIGdldCB1bmxvY2tlZCBiZWNhdXNlIHdlIG5lZWQgdG8gcGVyZm9ybSByZWNvbnNpZGVyYXRpb24sIGRvbid0IHBlcmZvcm0KKyAgICAgKiB0aGUgdGltZW91dCBidXQgZ2V0IGEgbmV3IHJlcG9ydGluZyBlc3RpbWF0ZS4gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAidW5sb2NrZWQgJWQsIGN1cnJlbnQgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICByZXMsIEdTVF9USU1FX0FSR1MgKGN1cnJlbnRfdGltZSkpOworCisgICAgLyogcGVyZm9ybSBhY3Rpb25zLCB3ZSBpZ25vcmUgcmVzdWx0LiBSZWxlYXNlIGxvY2sgYmVjYXVzZSBpdCBtaWdodCBwdXNoLiAqLworICAgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHJ0cHNlc3Npb24pOworICAgIHJ0cF9zZXNzaW9uX29uX3RpbWVvdXQgKHNlc3Npb24sIGN1cnJlbnRfdGltZSwgbnRwbnN0aW1lLCBydW5uaW5nX3RpbWUpOworICAgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKyAgfQorICAvKiBtYXJrIHRoZSB0aHJlYWQgYXMgc3RvcHBlZCBub3cgKi8KKyAgcnRwc2Vzc2lvbi0+cHJpdi0+dGhyZWFkX3N0b3BwZWQgPSBUUlVFOworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAibGVhdmluZyBSVENQIHRocmVhZCIpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3N0YXJ0X3J0Y3BfdGhyZWFkIChHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbikKK3sKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgIGdib29sZWFuIHJlczsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAic3RhcnRpbmcgUlRDUCB0aHJlYWQiKTsKKworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgIHJ0cHNlc3Npb24tPnByaXYtPnN0b3BfdGhyZWFkID0gRkFMU0U7CisgIGlmIChydHBzZXNzaW9uLT5wcml2LT50aHJlYWRfc3RvcHBlZCkgeworICAgIC8qIGlmIHRoZSB0aHJlYWQgc3RvcHBlZCwgYW5kIHdlIHN0aWxsIGhhdmUgYSBoYW5kbGUgdG8gdGhlIHRocmVhZCwgam9pbiBpdAorICAgICAqIG5vdy4gV2UgY2FuIHNhZmVseSBqb2luIHdpdGggdGhlIGxvY2sgaGVsZCwgdGhlIHRocmVhZCB3aWxsIG5vdCB0YWtlIGl0CisgICAgICogYW55bW9yZS4gKi8KKyAgICBpZiAocnRwc2Vzc2lvbi0+cHJpdi0+dGhyZWFkKQorICAgICAgZ190aHJlYWRfam9pbiAocnRwc2Vzc2lvbi0+cHJpdi0+dGhyZWFkKTsKKyAgICAvKiBvbmx5IGNyZWF0ZSBhIG5ldyB0aHJlYWQgaWYgdGhlIG9sZCBvbmUgd2FzIHN0b3BwZWQuIE90aGVyd2lzZSB3ZSBjYW4KKyAgICAgKiBqdXN0IHJldXNlIHRoZSBjdXJyZW50bHkgcnVubmluZyBvbmUuICovCisgICAgcnRwc2Vzc2lvbi0+cHJpdi0+dGhyZWFkID0gZ190aHJlYWRfdHJ5X25ldyAoInJ0cHNlc3Npb24tcnRjcC10aHJlYWQiLAorICAgICAgICAoR1RocmVhZEZ1bmMpIHJ0Y3BfdGhyZWFkLCBydHBzZXNzaW9uLCAmZXJyb3IpOworICAgIHJ0cHNlc3Npb24tPnByaXYtPnRocmVhZF9zdG9wcGVkID0gRkFMU0U7CisgIH0KKyAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgaWYgKGVycm9yICE9IE5VTEwpIHsKKyAgICByZXMgPSBGQUxTRTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAiZmFpbGVkIHRvIHN0YXJ0IHRocmVhZCwgJXMiLCBlcnJvci0+bWVzc2FnZSk7CisgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgIH0gZWxzZSB7CisgICAgcmVzID0gVFJVRTsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZAorc3RvcF9ydGNwX3RocmVhZCAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJzdG9wcGluZyBSVENQIHRocmVhZCIpOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKyAgcnRwc2Vzc2lvbi0+cHJpdi0+c3RvcF90aHJlYWQgPSBUUlVFOworICBzaWduYWxfd2FpdGluZ19ydGNwX3RocmVhZF91bmxvY2tlZCAocnRwc2Vzc2lvbik7CisgIGlmIChydHBzZXNzaW9uLT5wcml2LT5pZCkKKyAgICBnc3RfY2xvY2tfaWRfdW5zY2hlZHVsZSAocnRwc2Vzc2lvbi0+cHJpdi0+aWQpOworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKK30KKworc3RhdGljIHZvaWQKK2pvaW5fcnRjcF90aHJlYWQgKEdzdFJ0cFNlc3Npb24gKiBydHBzZXNzaW9uKQoreworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgIC8qIGRvbid0IHRyeSB0byBqb2luIHdoZW4gd2UgaGF2ZSBubyB0aHJlYWQgKi8KKyAgaWYgKHJ0cHNlc3Npb24tPnByaXYtPnRocmVhZCAhPSBOVUxMKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgImpvaW5pbmcgUlRDUCB0aHJlYWQiKTsKKyAgICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICAgIGdfdGhyZWFkX2pvaW4gKHJ0cHNlc3Npb24tPnByaXYtPnRocmVhZCk7CisKKyAgICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgICAgLyogYWZ0ZXIgdGhlIGpvaW4sIHRha2UgdGhlIGxvY2sgYW5kIGNsZWFyIHRoZSB0aHJlYWQgc3RydWN0dXJlLiBUaGUgY2FsbGVyCisgICAgICogaXMgc3VwcG9zZWQgdG8gbm90IGNvbmN1cnJlbnRseSBjYWxsIHN0YXJ0IGFuZCBqb2luLiAqLworICAgIHJ0cHNlc3Npb24tPnByaXYtPnRocmVhZCA9IE5VTEw7CisgIH0KKyAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9zZXNzaW9uX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJlczsKKyAgR3N0UnRwU2Vzc2lvbiAqcnRwc2Vzc2lvbjsKKworICBydHBzZXNzaW9uID0gR1NUX1JUUF9TRVNTSU9OIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgICAgICBpZiAocnRwc2Vzc2lvbi0+c2VuZF9ydHBfc3JjKQorICAgICAgICBydHBzZXNzaW9uLT5wcml2LT53YWl0X3NlbmQgPSBUUlVFOworICAgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUExBWUlOR19UT19QQVVTRUQ6CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIC8qIG5vIG5lZWQgdG8gam9pbiB5ZXQsIHdlIG1pZ2h0IHdhbnQgdG8gY29udGludWUgbGF0ZXIuIEFsc28sIHRoZQorICAgICAgICogZGF0YWZsb3cgY291bGQgYmxvY2sgZG93bnN0cmVhbSBzbyB0aGF0IGEgam9pbiBjb3VsZCBqdXN0IGJsb2NrCisgICAgICAgKiBmb3JldmVyLiAqLworICAgICAgc3RvcF9ydGNwX3RocmVhZCAocnRwc2Vzc2lvbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXMgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgICBpZiAoIXN0YXJ0X3J0Y3BfdGhyZWFkIChydHBzZXNzaW9uKSkKKyAgICAgICAgZ290byBmYWlsZWRfdGhyZWFkOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIC8qIGRvd25zdHJlYW0gaXMgbm93IHJlbGVhc2luZyB0aGUgZGF0YWZsb3cgYW5kIHdlIGNhbiBqb2luLiAqLworICAgICAgam9pbl9ydGNwX3RocmVhZCAocnRwc2Vzc2lvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworZmFpbGVkX3RocmVhZDoKKyAgeworICAgIHJldHVybiBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCityZXR1cm5fdHJ1ZSAoZ3BvaW50ZXIga2V5LCBncG9pbnRlciB2YWx1ZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc2Vzc2lvbl9jbGVhcl9wdF9tYXAgKEdzdFJ0cFNlc3Npb24gKiBydHBzZXNzaW9uKQoreworICBnX2hhc2hfdGFibGVfZm9yZWFjaF9yZW1vdmUgKHJ0cHNlc3Npb24tPnByaXYtPnB0bWFwLCByZXR1cm5fdHJ1ZSwgTlVMTCk7Cit9CisKKy8qIGNhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIG1hbmFnZXIgaGFzIGFuIFJUUCBwYWNrZXQgb3IgYSBsaXN0IG9mIHBhY2tldHMKKyAqIHJlYWR5IGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3Nlc3Npb25fcHJvY2Vzc19ydHAgKFJUUFNlc3Npb24gKiBzZXNzLCBSVFBTb3VyY2UgKiBzcmMsCisgICAgR3N0QnVmZmVyICogYnVmZmVyLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0OworICBHc3RSdHBTZXNzaW9uICpydHBzZXNzaW9uOworICBHc3RQYWQgKnJ0cF9zcmM7CisKKyAgcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTiAodXNlcl9kYXRhKTsKKworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgIGlmICgocnRwX3NyYyA9IHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NyYykpCisgICAgZ3N0X29iamVjdF9yZWYgKHJ0cF9zcmMpOworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICBpZiAocnRwX3NyYykgeworICAgIEdTVF9MT0dfT0JKRUNUIChydHBzZXNzaW9uLCAicHVzaGluZyByZWNlaXZlZCBSVFAgcGFja2V0Iik7CisgICAgcmVzdWx0ID0gZ3N0X3BhZF9wdXNoIChydHBfc3JjLCBidWZmZXIpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cF9zcmMpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJkcm9wcGluZyByZWNlaXZlZCBSVFAgcGFja2V0Iik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXN1bHQgPSBHU1RfRkxPV19PSzsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKiBjYWxsZWQgd2hlbiB0aGUgc2Vzc2lvbiBtYW5hZ2VyIGhhcyBhbiBSVFAgcGFja2V0IHJlYWR5IGZvciBmdXJ0aGVyCisgKiBzZW5kaW5nICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9zZXNzaW9uX3NlbmRfcnRwIChSVFBTZXNzaW9uICogc2VzcywgUlRQU291cmNlICogc3JjLAorICAgIGdwb2ludGVyIGRhdGEsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXN1bHQ7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisgIEdzdFBhZCAqcnRwX3NyYzsKKworICBydHBzZXNzaW9uID0gR1NUX1JUUF9TRVNTSU9OICh1c2VyX2RhdGEpOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKyAgaWYgKChydHBfc3JjID0gcnRwc2Vzc2lvbi0+c2VuZF9ydHBfc3JjKSkKKyAgICBnc3Rfb2JqZWN0X3JlZiAocnRwX3NyYyk7CisgIHNpZ25hbF93YWl0aW5nX3J0Y3BfdGhyZWFkX3VubG9ja2VkIChydHBzZXNzaW9uKTsKKyAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgaWYgKHJ0cF9zcmMpIHsKKyAgICBpZiAoR1NUX0lTX0JVRkZFUiAoZGF0YSkpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChydHBzZXNzaW9uLCAic2VuZGluZyBSVFAgcGFja2V0Iik7CisgICAgICByZXN1bHQgPSBnc3RfcGFkX3B1c2ggKHJ0cF9zcmMsIEdTVF9CVUZGRVJfQ0FTVCAoZGF0YSkpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwc2Vzc2lvbiwgInNlbmRpbmcgUlRQIGxpc3QiKTsKKyAgICAgIHJlc3VsdCA9IGdzdF9wYWRfcHVzaF9saXN0IChydHBfc3JjLCBHU1RfQlVGRkVSX0xJU1RfQ0FTVCAoZGF0YSkpOworICAgIH0KKyAgICBnc3Rfb2JqZWN0X3VucmVmIChydHBfc3JjKTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfbWluaV9vYmplY3RfdW5yZWYgKEdTVF9NSU5JX09CSkVDVF9DQVNUIChkYXRhKSk7CisgICAgcmVzdWx0ID0gR1NUX0ZMT1dfT0s7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2RvX3J0Y3BfZXZlbnRzIChHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbiwgR3N0UGFkICogc3JjcGFkKQoreworICBHc3RDYXBzICpjYXBzOworICBHc3RTZWdtZW50IHNlZzsKKyAgR3N0RXZlbnQgKmV2ZW50OworICBnY2hhciAqc3RyZWFtX2lkOworICBnYm9vbGVhbiBoYXZlX2dyb3VwX2lkOworICBndWludCBncm91cF9pZDsKKworICBzdHJlYW1faWQgPQorICAgICAgZ19zdHJkdXBfcHJpbnRmICgiJTA4eCUwOHglMDh4JTA4eCIsIGdfcmFuZG9tX2ludCAoKSwgZ19yYW5kb21faW50ICgpLAorICAgICAgZ19yYW5kb21faW50ICgpLCBnX3JhbmRvbV9pbnQgKCkpOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKyAgaWYgKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NpbmspIHsKKyAgICBldmVudCA9CisgICAgICAgIGdzdF9wYWRfZ2V0X3N0aWNreV9ldmVudCAocnRwc2Vzc2lvbi0+cmVjdl9ydHBfc2luaywKKyAgICAgICAgR1NUX0VWRU5UX1NUUkVBTV9TVEFSVCwgMCk7CisgICAgaWYgKGV2ZW50KSB7CisgICAgICBpZiAoZ3N0X2V2ZW50X3BhcnNlX2dyb3VwX2lkIChldmVudCwgJmdyb3VwX2lkKSkKKyAgICAgICAgaGF2ZV9ncm91cF9pZCA9IFRSVUU7CisgICAgICBlbHNlCisgICAgICAgIGhhdmVfZ3JvdXBfaWQgPSBGQUxTRTsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgIH0gZWxzZSB7CisgICAgICBoYXZlX2dyb3VwX2lkID0gVFJVRTsKKyAgICAgIGdyb3VwX2lkID0gZ3N0X3V0aWxfZ3JvdXBfaWRfbmV4dCAoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaGF2ZV9ncm91cF9pZCA9IFRSVUU7CisgICAgZ3JvdXBfaWQgPSBnc3RfdXRpbF9ncm91cF9pZF9uZXh0ICgpOworICB9CisgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHJ0cHNlc3Npb24pOworCisgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKHN0cmVhbV9pZCk7CisgIGlmIChoYXZlX2dyb3VwX2lkKQorICAgIGdzdF9ldmVudF9zZXRfZ3JvdXBfaWQgKGV2ZW50LCBncm91cF9pZCk7CisgIGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjcGFkLCBldmVudCk7CisgIGdfZnJlZSAoc3RyZWFtX2lkKTsKKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtcnRjcCIpOworICBnc3RfcGFkX3NldF9jYXBzIChzcmNwYWQsIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWcpOworICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwgZXZlbnQpOworfQorCisvKiBjYWxsZWQgd2hlbiB0aGUgc2Vzc2lvbiBtYW5hZ2VyIGhhcyBhbiBSVENQIHBhY2tldCByZWFkeSBmb3IgZnVydGhlcgorICogc2VuZGluZy4gVGhlIGVvcyBmbGFnIGlzIHNldCB3aGVuIGFuIEVPUyBldmVudCBzaG91bGQgYmUgc2VudCBkb3duc3RyZWFtIGFzCisgKiB3ZWxsLiAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfc2Vzc2lvbl9zZW5kX3J0Y3AgKFJUUFNlc3Npb24gKiBzZXNzLCBSVFBTb3VyY2UgKiBzcmMsCisgICAgR3N0QnVmZmVyICogYnVmZmVyLCBnYm9vbGVhbiBlb3MsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXN1bHQ7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisgIEdzdFBhZCAqcnRjcF9zcmM7CisKKyAgcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTiAodXNlcl9kYXRhKTsKKworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgIGlmIChydHBzZXNzaW9uLT5wcml2LT5zdG9wX3RocmVhZCkKKyAgICBnb3RvIHN0b3BwaW5nOworCisgIGlmICgocnRjcF9zcmMgPSBydHBzZXNzaW9uLT5zZW5kX3J0Y3Bfc3JjKSkgeworICAgIGdzdF9vYmplY3RfcmVmIChydGNwX3NyYyk7CisgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgICAvKiBzZXQgcnRjcCBjYXBzIG9uIG91dHB1dCBwYWQgKi8KKyAgICBpZiAoIWdzdF9wYWRfaGFzX2N1cnJlbnRfY2FwcyAocnRjcF9zcmMpKQorICAgICAgZG9fcnRjcF9ldmVudHMgKHJ0cHNlc3Npb24sIHJ0Y3Bfc3JjKTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChydHBzZXNzaW9uLCAic2VuZGluZyBSVENQIik7CisgICAgcmVzdWx0ID0gZ3N0X3BhZF9wdXNoIChydGNwX3NyYywgYnVmZmVyKTsKKworICAgIC8qIHdlIGhhdmUgdG8gc2VuZCBFT1MgYWZ0ZXIgdGhpcyBwYWNrZXQgKi8KKyAgICBpZiAoZW9zKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRwc2Vzc2lvbiwgInNlbmRpbmcgRU9TIik7CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHJ0Y3Bfc3JjLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgICAgfQorICAgIGdzdF9vYmplY3RfdW5yZWYgKHJ0Y3Bfc3JjKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJub3Qgc2VuZGluZyBSVENQLCBubyBvdXRwdXQgcGFkIik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXN1bHQgPSBHU1RfRkxPV19PSzsKKyAgfQorICByZXR1cm4gcmVzdWx0OworCisgIC8qIEVSUk9SUyAqLworc3RvcHBpbmc6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAid2UgYXJlIHN0b3BwaW5nIik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK30KKworLyogY2FsbGVkIHdoZW4gdGhlIHNlc3Npb24gbWFuYWdlciBoYXMgYW4gU1IgUlRDUCBwYWNrZXQgcmVhZHkgZm9yIGhhbmRsaW5nCisgKiBpbnRlciBzdHJlYW0gc3luY2hyb25pc2F0aW9uICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9zZXNzaW9uX3N5bmNfcnRjcCAoUlRQU2Vzc2lvbiAqIHNlc3MsCisgICAgR3N0QnVmZmVyICogYnVmZmVyLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0OworICBHc3RSdHBTZXNzaW9uICpydHBzZXNzaW9uOworICBHc3RQYWQgKnN5bmNfc3JjOworCisgIHJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKHVzZXJfZGF0YSk7CisKKyAgR1NUX1JUUF9TRVNTSU9OX0xPQ0sgKHJ0cHNlc3Npb24pOworICBpZiAocnRwc2Vzc2lvbi0+cHJpdi0+c3RvcF90aHJlYWQpCisgICAgZ290byBzdG9wcGluZzsKKworICBpZiAoKHN5bmNfc3JjID0gcnRwc2Vzc2lvbi0+c3luY19zcmMpKSB7CisgICAgZ3N0X29iamVjdF9yZWYgKHN5bmNfc3JjKTsKKyAgICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICAgIC8qIHNldCBydGNwIGNhcHMgb24gb3V0cHV0IHBhZCwgdGhpcyBoYXBwZW5zCisgICAgICogd2hlbiB3ZSByZWNlaXZlIFJUQ1AgbXV4ZWQgd2l0aCBSVFAgYWNjb3JkaW5nCisgICAgICogdG8gUkZDNTc2MS4gT3RoZXJ3aXNlIHdlIHdvdWxkIGhhdmUgZm9yd2FyZGVkCisgICAgICogdGhlIGV2ZW50cyBmcm9tIHRoZSByZWN2X3J0Y3Bfc2luayBwYWQgYWxyZWFkeQorICAgICAqLworICAgIGlmICghZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChzeW5jX3NyYykpCisgICAgICBkb19ydGNwX2V2ZW50cyAocnRwc2Vzc2lvbiwgc3luY19zcmMpOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJzZW5kaW5nIFN5bmMgUlRDUCIpOworICAgIHJlc3VsdCA9IGdzdF9wYWRfcHVzaCAoc3luY19zcmMsIGJ1ZmZlcik7CisgICAgZ3N0X29iamVjdF91bnJlZiAoc3luY19zcmMpOworICB9IGVsc2UgeworICAgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHJ0cHNlc3Npb24pOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgIm5vdCBzZW5kaW5nIFN5bmMgUlRDUCwgbm8gb3V0cHV0IHBhZCIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgcmVzdWx0ID0gR1NUX0ZMT1dfT0s7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKKworICAvKiBFUlJPUlMgKi8KK3N0b3BwaW5nOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgIndlIGFyZSBzdG9wcGluZyIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3Nlc3Npb25fY2FjaGVfY2FwcyAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24sIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSdHBTZXNzaW9uUHJpdmF0ZSAqcHJpdjsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzOworICBnaW50IHBheWxvYWQ7CisKKyAgcHJpdiA9IHJ0cHNlc3Npb24tPnByaXY7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgInBhcnNpbmcgY2FwcyIpOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJwYXlsb2FkIiwgJnBheWxvYWQpKQorICAgIHJldHVybjsKKworICBpZiAoZ19oYXNoX3RhYmxlX2xvb2t1cCAocHJpdi0+cHRtYXAsIEdJTlRfVE9fUE9JTlRFUiAocGF5bG9hZCkpKQorICAgIHJldHVybjsKKworICBnX2hhc2hfdGFibGVfaW5zZXJ0IChwcml2LT5wdG1hcCwgR0lOVF9UT19QT0lOVEVSIChwYXlsb2FkKSwKKyAgICAgIGdzdF9jYXBzX3JlZiAoY2FwcykpOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfcnRwX3Nlc3Npb25fZ2V0X2NhcHNfZm9yX3B0IChHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbiwgZ3VpbnQgcGF5bG9hZCkKK3sKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisgIEdWYWx1ZSBhcmdzWzJdID0geyB7MH0sIHswfSB9OworICBHVmFsdWUgcmV0ID0geyAwIH07CisKKyAgR1NUX1JUUF9TRVNTSU9OX0xPQ0sgKHJ0cHNlc3Npb24pOworICBjYXBzID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAocnRwc2Vzc2lvbi0+cHJpdi0+cHRtYXAsCisgICAgICBHSU5UX1RPX1BPSU5URVIgKHBheWxvYWQpKTsKKyAgaWYgKGNhcHMpIHsKKyAgICBnc3RfY2Fwc19yZWYgKGNhcHMpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIC8qIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUsIHRyeSB0byBnZXQgaXQgd2l0aCBhIHNpZ25hbCAqLworICBnX3ZhbHVlX2luaXQgKCZhcmdzWzBdLCBHU1RfVFlQRV9FTEVNRU5UKTsKKyAgZ192YWx1ZV9zZXRfb2JqZWN0ICgmYXJnc1swXSwgcnRwc2Vzc2lvbik7CisgIGdfdmFsdWVfaW5pdCAoJmFyZ3NbMV0sIEdfVFlQRV9VSU5UKTsKKyAgZ192YWx1ZV9zZXRfdWludCAoJmFyZ3NbMV0sIHBheWxvYWQpOworCisgIGdfdmFsdWVfaW5pdCAoJnJldCwgR1NUX1RZUEVfQ0FQUyk7CisgIGdfdmFsdWVfc2V0X2JveGVkICgmcmV0LCBOVUxMKTsKKworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICBnX3NpZ25hbF9lbWl0diAoYXJncywgZ3N0X3J0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX1JFUVVFU1RfUFRfTUFQXSwgMCwKKyAgICAgICZyZXQpOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKworICBnX3ZhbHVlX3Vuc2V0ICgmYXJnc1swXSk7CisgIGdfdmFsdWVfdW5zZXQgKCZhcmdzWzFdKTsKKyAgY2FwcyA9IChHc3RDYXBzICopIGdfdmFsdWVfZHVwX2JveGVkICgmcmV0KTsKKyAgZ192YWx1ZV91bnNldCAoJnJldCk7CisgIGlmICghY2FwcykKKyAgICBnb3RvIG5vX2NhcHM7CisKKyAgZ3N0X3J0cF9zZXNzaW9uX2NhY2hlX2NhcHMgKHJ0cHNlc3Npb24sIGNhcHMpOworCitkb25lOgorICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICByZXR1cm4gY2FwczsKKworbm9fY2FwczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJjb3VsZCBub3QgZ2V0IGNhcHMiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworLyogY2FsbGVkIHdoZW4gdGhlIHNlc3Npb24gbWFuYWdlciBuZWVkcyB0aGUgY2xvY2sgcmF0ZSAqLworc3RhdGljIGdpbnQKK2dzdF9ydHBfc2Vzc2lvbl9jbG9ja19yYXRlIChSVFBTZXNzaW9uICogc2VzcywgZ3VpbnQ4IHBheWxvYWQsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBnaW50IHJlc3VsdCA9IC0xOworICBHc3RSdHBTZXNzaW9uICpydHBzZXNzaW9uOworICBHc3RDYXBzICpjYXBzOworICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTl9DQVNUICh1c2VyX2RhdGEpOworCisgIGNhcHMgPSBnc3RfcnRwX3Nlc3Npb25fZ2V0X2NhcHNfZm9yX3B0IChydHBzZXNzaW9uLCBwYXlsb2FkKTsKKworICBpZiAoIWNhcHMpCisgICAgZ290byBkb25lOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJjbG9jay1yYXRlIiwgJnJlc3VsdCkpCisgICAgZ290byBub19jbG9ja19yYXRlOworCisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAicGFyc2VkIGNsb2NrLXJhdGUgJWQiLCByZXN1bHQpOworCitkb25lOgorCisgIHJldHVybiByZXN1bHQ7CisKKyAgLyogRVJST1JTICovCitub19jbG9ja19yYXRlOgorICB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJObyBjbG9jay1yYXRlIGluIGNhcHMhIik7CisgICAgZ290byBkb25lOworICB9Cit9CisKKy8qIGNhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIG1hbmFnZXIgYXNrcyB1cyB0byByZWNvbnNpZGVyIHRoZSB0aW1lb3V0ICovCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zZXNzaW9uX3JlY29uc2lkZXIgKFJUUFNlc3Npb24gKiBzZXNzLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisKKyAgcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTl9DQVNUICh1c2VyX2RhdGEpOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgInVubG9jayB0aW1lciBmb3IgcmVjb25zaWRlcmF0aW9uIik7CisgIGlmIChydHBzZXNzaW9uLT5wcml2LT5pZCkKKyAgICBnc3RfY2xvY2tfaWRfdW5zY2hlZHVsZSAocnRwc2Vzc2lvbi0+cHJpdi0+aWQpOworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3Nlc3Npb25fZXZlbnRfcmVjdl9ydHBfc2luayAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwU2Vzc2lvbiAqcnRwc2Vzc2lvbjsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTiAocGFyZW50KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAicmVjZWl2ZWQgZXZlbnQgJXMiLAorICAgICAgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICAgIC8qIHByb2Nlc3MgKi8KKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChldmVudCwgJmNhcHMpOworICAgICAgZ3N0X3J0cF9zZXNzaW9uX3Npbmtfc2V0Y2FwcyAocGFkLCBydHBzZXNzaW9uLCBjYXBzKTsKKyAgICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAocnRwc2Vzc2lvbi0+cmVjdl9ydHBfc3JjLCBldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9zZWdtZW50X2luaXQgKCZydHBzZXNzaW9uLT5yZWN2X3J0cF9zZWcsIEdTVF9GT1JNQVRfVU5ERUZJTkVEKTsKKyAgICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAocnRwc2Vzc2lvbi0+cmVjdl9ydHBfc3JjLCBldmVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgIHsKKyAgICAgIEdzdFNlZ21lbnQgKnNlZ21lbnQsIGluX3NlZ21lbnQ7CisKKyAgICAgIHNlZ21lbnQgPSAmcnRwc2Vzc2lvbi0+cmVjdl9ydHBfc2VnOworCisgICAgICAvKiB0aGUgbmV3c2VnbWVudCBldmVudCBpcyBuZWVkZWQgdG8gY29udmVydCB0aGUgUlRQIHRpbWVzdGFtcCB0bworICAgICAgICogcnVubmluZ190aW1lLCB3aGljaCBpcyBuZWVkZWQgdG8gZ2VuZXJhdGUgYSBtYXBwaW5nIGZyb20gUlRQIHRvIE5UUAorICAgICAgICogdGltZXN0YW1wcyBpbiBTUiByZXBvcnRzICovCisgICAgICBnc3RfZXZlbnRfY29weV9zZWdtZW50IChldmVudCwgJmluX3NlZ21lbnQpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgInJlY2VpdmVkIHNlZ21lbnQgJSIgR1NUX1NFR01FTlRfRk9STUFULAorICAgICAgICAgICZpbl9zZWdtZW50KTsKKworICAgICAgLyogYWNjZXB0IHVwc3RyZWFtICovCisgICAgICBnc3Rfc2VnbWVudF9jb3B5X2ludG8gKCZpbl9zZWdtZW50LCBzZWdtZW50KTsKKworICAgICAgLyogcHVzaCBldmVudCBmb3J3YXJkICovCisgICAgICByZXQgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NyYywgZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICB7CisgICAgICBHc3RQYWQgKnJ0Y3Bfc3JjOworCisgICAgICByZXQgPQorICAgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocnRwc2Vzc2lvbi0+cmVjdl9ydHBfc3JjLCBnc3RfZXZlbnRfcmVmIChldmVudCkpOworCisgICAgICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgICAgICBpZiAoKHJ0Y3Bfc3JjID0gcnRwc2Vzc2lvbi0+c2VuZF9ydGNwX3NyYykpCisgICAgICAgIGdzdF9vYmplY3RfcmVmIChydGNwX3NyYyk7CisgICAgICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICAgICAgaWYgKHJ0Y3Bfc3JjKSB7CisgICAgICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAocnRjcF9zcmMsIGV2ZW50KTsKKyAgICAgICAgZ3N0X29iamVjdF91bnJlZiAocnRjcF9zcmMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIHJldCA9IFRSVUU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAocnRwc2Vzc2lvbi0+cmVjdl9ydHBfc3JjLCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7CisKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3Nlc3Npb25fcmVxdWVzdF9yZW1vdGVfa2V5X3VuaXQgKEdzdFJ0cFNlc3Npb24gKiBydHBzZXNzaW9uLAorICAgIGd1aW50MzIgc3NyYywgZ3VpbnQgcGF5bG9hZCwgZ2Jvb2xlYW4gYWxsX2hlYWRlcnMsIGdpbnQgY291bnQpCit7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgY2FwcyA9IGdzdF9ydHBfc2Vzc2lvbl9nZXRfY2Fwc19mb3JfcHQgKHJ0cHNlc3Npb24sIHBheWxvYWQpOworCisgIGlmIChjYXBzKSB7CisgICAgY29uc3QgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgICAgZ2Jvb2xlYW4gcGxpOworICAgIGdib29sZWFuIGZpcjsKKworICAgIHBsaSA9IGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAicnRjcC1mYi1uYWNrLXBsaSIpOworICAgIGZpciA9IGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAicnRjcC1mYi1jY20tZmlyIikgJiYgYWxsX2hlYWRlcnM7CisKKyAgICAvKiBHb29nbGUgVGFsayB1c2VzIEZJUiBmb3IgcmVwYWlyLCBzbyBzZW5kIGl0IGV2ZW4gaWYgd2UganVzdCB3YW50IGEKKyAgICAgKiByZWd1bGFyIFBMSSAqLworICAgIGlmICghcGxpICYmCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAicnRjcC1mYi14LWdzdHJlYW1lci1maXItYXMtcmVwYWlyIikpCisgICAgICBmaXIgPSBUUlVFOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgaWYgKHBsaSB8fCBmaXIpCisgICAgICByZXR1cm4gcnRwX3Nlc3Npb25fcmVxdWVzdF9rZXlfdW5pdCAocnRwc2Vzc2lvbi0+cHJpdi0+c2Vzc2lvbiwgc3NyYywKKyAgICAgICAgICBmaXIsIGNvdW50KTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3Nlc3Npb25fZXZlbnRfcmVjdl9ydHBfc3JjIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBTZXNzaW9uICpydHBzZXNzaW9uOworICBnYm9vbGVhbiBmb3J3YXJkID0gVFJVRTsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzOworICBndWludDMyIHNzcmM7CisgIGd1aW50IHB0OworCisgIHJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNOgorICAgICAgcyA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCk7CisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgIkdzdEZvcmNlS2V5VW5pdCIpICYmCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAocywgInNzcmMiLCAmc3NyYykgJiYKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF91aW50IChzLCAicGF5bG9hZCIsICZwdCkpIHsKKyAgICAgICAgZ2Jvb2xlYW4gYWxsX2hlYWRlcnMgPSBGQUxTRTsKKyAgICAgICAgZ2ludCBjb3VudCA9IC0xOworCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2Jvb2xlYW4gKHMsICJhbGwtaGVhZGVycyIsICZhbGxfaGVhZGVycyk7CisgICAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJjb3VudCIsICZjb3VudCkgJiYgY291bnQgPCAwKQorICAgICAgICAgIGNvdW50ICs9IEdfTUFYSU5UOyAgICAvKiBNYWtlIHN1cmUgY291bnQgaXMgcG9zaXRpdmUgaWYgcHJlc2VudCAqLworICAgICAgICBpZiAoZ3N0X3J0cF9zZXNzaW9uX3JlcXVlc3RfcmVtb3RlX2tleV91bml0IChydHBzZXNzaW9uLCBzc3JjLCBwdCwKKyAgICAgICAgICAgICAgICBhbGxfaGVhZGVycywgY291bnQpKQorICAgICAgICAgIGZvcndhcmQgPSBGQUxTRTsKKyAgICAgIH0gZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgIkdzdFJUUFJldHJhbnNtaXNzaW9uUmVxdWVzdCIpKSB7CisgICAgICAgIEdzdENsb2NrVGltZSBydW5uaW5nX3RpbWU7CisgICAgICAgIGd1aW50IHNlcW51bSwgZGVsYXksIGRlYWRsaW5lLCBtYXhfZGVsYXksIGF2Z19ydHQ7CisKKyAgICAgICAgR1NUX1JUUF9TRVNTSU9OX0xPQ0sgKHJ0cHNlc3Npb24pOworICAgICAgICBydHBzZXNzaW9uLT5wcml2LT5ydHhfY291bnQrKzsKKyAgICAgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgICAgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9jbG9ja190aW1lIChzLCAicnVubmluZy10aW1lIiwgJnJ1bm5pbmdfdGltZSkpCisgICAgICAgICAgcnVubmluZ190aW1lID0gLTE7CisgICAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAocywgInNzcmMiLCAmc3NyYykpCisgICAgICAgICAgc3NyYyA9IC0xOworICAgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKHMsICJzZXFudW0iLCAmc2VxbnVtKSkKKyAgICAgICAgICBzZXFudW0gPSAtMTsKKyAgICAgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF91aW50IChzLCAiZGVsYXkiLCAmZGVsYXkpKQorICAgICAgICAgIGRlbGF5ID0gMDsKKyAgICAgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF91aW50IChzLCAiZGVhZGxpbmUiLCAmZGVhZGxpbmUpKQorICAgICAgICAgIGRlYWRsaW5lID0gMTAwOworICAgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKHMsICJhdmctcnR0IiwgJmF2Z19ydHQpKQorICAgICAgICAgIGF2Z19ydHQgPSA0MDsKKworICAgICAgICAvKiByZW1haW5pbmcgdGltZSB0byByZWNlaXZlIHRoZSBwYWNrZXQgKi8KKyAgICAgICAgbWF4X2RlbGF5ID0gZGVhZGxpbmU7CisgICAgICAgIGlmIChtYXhfZGVsYXkgPiBkZWxheSkKKyAgICAgICAgICBtYXhfZGVsYXkgLT0gZGVsYXk7CisgICAgICAgIC8qIGVzdGltYXRlZCBSVFQgKi8KKyAgICAgICAgaWYgKG1heF9kZWxheSA+IGF2Z19ydHQpCisgICAgICAgICAgbWF4X2RlbGF5IC09IGF2Z19ydHQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtYXhfZGVsYXkgPSAwOworCisgICAgICAgIGlmIChydHBfc2Vzc2lvbl9yZXF1ZXN0X25hY2sgKHJ0cHNlc3Npb24tPnByaXYtPnNlc3Npb24sIHNzcmMsIHNlcW51bSwKKyAgICAgICAgICAgICAgICBtYXhfZGVsYXkgKiBHU1RfTVNFQ09ORCkpCisgICAgICAgICAgZm9yd2FyZCA9IEZBTFNFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKGZvcndhcmQpIHsKKyAgICBHc3RQYWQgKnJlY3ZfcnRwX3Npbms7CisKKyAgICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgICAgaWYgKChyZWN2X3J0cF9zaW5rID0gcnRwc2Vzc2lvbi0+cmVjdl9ydHBfc2luaykpCisgICAgICBnc3Rfb2JqZWN0X3JlZiAocmVjdl9ydHBfc2luayk7CisgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgICBpZiAocmVjdl9ydHBfc2luaykgeworICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChyZWN2X3J0cF9zaW5rLCBldmVudCk7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChyZWN2X3J0cF9zaW5rKTsKKyAgICB9IGVsc2UKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICB9IGVsc2UgeworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgR3N0SXRlcmF0b3IgKgorZ3N0X3J0cF9zZXNzaW9uX2l0ZXJhdGVfaW50ZXJuYWxfbGlua3MgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50KQoreworICBHc3RSdHBTZXNzaW9uICpydHBzZXNzaW9uOworICBHc3RQYWQgKm90aGVycGFkID0gTlVMTDsKKyAgR3N0SXRlcmF0b3IgKml0ID0gTlVMTDsKKworICBydHBzZXNzaW9uID0gR1NUX1JUUF9TRVNTSU9OIChwYXJlbnQpOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKyAgaWYgKHBhZCA9PSBydHBzZXNzaW9uLT5yZWN2X3J0cF9zcmMpIHsKKyAgICBvdGhlcnBhZCA9IGdzdF9vYmplY3RfcmVmIChydHBzZXNzaW9uLT5yZWN2X3J0cF9zaW5rKTsKKyAgfSBlbHNlIGlmIChwYWQgPT0gcnRwc2Vzc2lvbi0+cmVjdl9ydHBfc2luaykgeworICAgIG90aGVycGFkID0gZ3N0X29iamVjdF9yZWYgKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NyYyk7CisgIH0gZWxzZSBpZiAocGFkID09IHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NyYykgeworICAgIG90aGVycGFkID0gZ3N0X29iamVjdF9yZWYgKHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmspOworICB9IGVsc2UgaWYgKHBhZCA9PSBydHBzZXNzaW9uLT5zZW5kX3J0cF9zaW5rKSB7CisgICAgb3RoZXJwYWQgPSBnc3Rfb2JqZWN0X3JlZiAocnRwc2Vzc2lvbi0+c2VuZF9ydHBfc3JjKTsKKyAgfQorICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICBpZiAob3RoZXJwYWQpIHsKKyAgICBHVmFsdWUgdmFsID0geyAwLCB9OworCisgICAgZ192YWx1ZV9pbml0ICgmdmFsLCBHU1RfVFlQRV9QQUQpOworICAgIGdfdmFsdWVfc2V0X29iamVjdCAoJnZhbCwgb3RoZXJwYWQpOworICAgIGl0ID0gZ3N0X2l0ZXJhdG9yX25ld19zaW5nbGUgKEdTVF9UWVBFX1BBRCwgJnZhbCk7CisgICAgZ192YWx1ZV91bnNldCAoJnZhbCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAob3RoZXJwYWQpOworICB9IGVsc2UgeworICAgIGl0ID0gZ3N0X2l0ZXJhdG9yX25ld19zaW5nbGUgKEdTVF9UWVBFX1BBRCwgTlVMTCk7CisgIH0KKworICByZXR1cm4gaXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9zZXNzaW9uX3Npbmtfc2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbiwKKyAgICBHc3RDYXBzICogY2FwcykKK3sKKyAgR1NUX1JUUF9TRVNTSU9OX0xPQ0sgKHJ0cHNlc3Npb24pOworICBnc3RfcnRwX3Nlc3Npb25fY2FjaGVfY2FwcyAocnRwc2Vzc2lvbiwgY2Fwcyk7CisgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHJ0cHNlc3Npb24pOworCisgIHJldHVybiBUUlVFOworfQorCisvKiByZWNlaXZlIGEgcGFja2V0IGZyb20gYSBzZW5kZXIsIHNlbmQgaXQgdG8gdGhlIFJUUCBzZXNzaW9uIG1hbmFnZXIgYW5kCisgKiBmb3J3YXJkIHRoZSBwYWNrZXQgb24gdGhlIHJ0cF9zcmMgcGFkCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3Nlc3Npb25fY2hhaW5fcmVjdl9ydHAgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UnRwU2Vzc2lvbiAqcnRwc2Vzc2lvbjsKKyAgR3N0UnRwU2Vzc2lvblByaXZhdGUgKnByaXY7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lLCBydW5uaW5nX3RpbWU7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisgIGd1aW50NjQgbnRwbnN0aW1lOworCisgIHJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKHBhcmVudCk7CisgIHByaXYgPSBydHBzZXNzaW9uLT5wcml2OworCisgIEdTVF9MT0dfT0JKRUNUIChydHBzZXNzaW9uLCAicmVjZWl2ZWQgUlRQIHBhY2tldCIpOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKyAgc2lnbmFsX3dhaXRpbmdfcnRjcF90aHJlYWRfdW5sb2NrZWQgKHJ0cHNlc3Npb24pOworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICAvKiBnZXQgTlRQIHRpbWUgd2hlbiB0aGlzIHBhY2tldCB3YXMgY2FwdHVyZWQsIHRoaXMgZGVwZW5kcyBvbiB0aGUgdGltZXN0YW1wLiAqLworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEICh0aW1lc3RhbXApKSB7CisgICAgLyogY29udmVydCB0byBydW5uaW5nIHRpbWUgdXNpbmcgdGhlIHNlZ21lbnQgdmFsdWVzICovCisgICAgcnVubmluZ190aW1lID0KKyAgICAgICAgZ3N0X3NlZ21lbnRfdG9fcnVubmluZ190aW1lICgmcnRwc2Vzc2lvbi0+cmVjdl9ydHBfc2VnLCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgIHRpbWVzdGFtcCk7CisgICAgbnRwbnN0aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgfSBlbHNlIHsKKyAgICBnZXRfY3VycmVudF90aW1lcyAocnRwc2Vzc2lvbiwgJnJ1bm5pbmdfdGltZSwgJm50cG5zdGltZSk7CisgIH0KKyAgY3VycmVudF90aW1lID0gZ3N0X2Nsb2NrX2dldF90aW1lIChwcml2LT5zeXNjbG9jayk7CisKKyAgcmV0ID0gcnRwX3Nlc3Npb25fcHJvY2Vzc19ydHAgKHByaXYtPnNlc3Npb24sIGJ1ZmZlciwgY3VycmVudF90aW1lLAorICAgICAgcnVubmluZ190aW1lLCBudHBuc3RpbWUpOworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gcHVzaF9lcnJvcjsKKworZG9uZToKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworcHVzaF9lcnJvcjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJwcm9jZXNzIHJldHVybmVkICVzIiwKKyAgICAgICAgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfc2Vzc2lvbl9ldmVudF9yZWN2X3J0Y3Bfc2luayAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UnRwU2Vzc2lvbiAqcnRwc2Vzc2lvbjsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTiAocGFyZW50KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAicmVjZWl2ZWQgZXZlbnQgJXMiLAorICAgICAgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUdNRU5UOgorICAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHN5bmNfc3JjIHBhZCBoYXMgY2FwcyBiZWZvcmUgdGhlIHNlZ21lbnQgZXZlbnQuCisgICAgICAgKiBPdGhlcndpc2Ugd2UgbWlnaHQgZ2V0IGEgc2VnbWVudCBldmVudCBiZWZvcmUgY2FwcyBmcm9tIHRoZSByZWNlaXZlCisgICAgICAgKiBSVENQIHBhZCwgYW5kIHRoZW4gbGF0ZXIgd2hlbiByZWNlaXZpbmcgUlRDUCBwYWNrZXRzIHdpbGwgc2V0IGNhcHMuCisgICAgICAgKiBUaGlzIHdpbGwgcmVzdWx0cyBpbiBhIHN0aWNreSBldmVudCBtaXNvcmRlcmluZyB3YXJuaW5nCisgICAgICAgKi8KKyAgICAgIGlmICghZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChydHBzZXNzaW9uLT5zeW5jX3NyYykpIHsKKyAgICAgICAgR3N0Q2FwcyAqY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXJ0Y3AiKTsKKyAgICAgICAgZ3N0X3BhZF9zZXRfY2FwcyAocnRwc2Vzc2lvbi0+c3luY19zcmMsIGNhcHMpOworICAgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICB9CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChydHBzZXNzaW9uLT5zeW5jX3NyYywgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKiBSZWNlaXZlIGFuIFJUQ1AgcGFja2V0IGZyb20gYSBzZW5kZXIsIHNlbmQgaXQgdG8gdGhlIFJUUCBzZXNzaW9uIG1hbmFnZXIgYW5kCisgKiBmb3J3YXJkIHRoZSBTUiBwYWNrZXRzIHRvIHRoZSBzeW5jX3NyYyBwYWQuCisgKi8KK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX3Nlc3Npb25fY2hhaW5fcmVjdl9ydGNwIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisgIEdzdFJ0cFNlc3Npb25Qcml2YXRlICpwcml2OworICBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lOworICBndWludDY0IG50cG5zdGltZTsKKworICBydHBzZXNzaW9uID0gR1NUX1JUUF9TRVNTSU9OIChwYXJlbnQpOworICBwcml2ID0gcnRwc2Vzc2lvbi0+cHJpdjsKKworICBHU1RfTE9HX09CSkVDVCAocnRwc2Vzc2lvbiwgInJlY2VpdmVkIFJUQ1AgcGFja2V0Iik7CisKKyAgR1NUX1JUUF9TRVNTSU9OX0xPQ0sgKHJ0cHNlc3Npb24pOworICBzaWduYWxfd2FpdGluZ19ydGNwX3RocmVhZF91bmxvY2tlZCAocnRwc2Vzc2lvbik7CisgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHJ0cHNlc3Npb24pOworCisgIGN1cnJlbnRfdGltZSA9IGdzdF9jbG9ja19nZXRfdGltZSAocHJpdi0+c3lzY2xvY2spOworICBnZXRfY3VycmVudF90aW1lcyAocnRwc2Vzc2lvbiwgTlVMTCwgJm50cG5zdGltZSk7CisKKyAgcnRwX3Nlc3Npb25fcHJvY2Vzc19ydGNwIChwcml2LT5zZXNzaW9uLCBidWZmZXIsIGN1cnJlbnRfdGltZSwgbnRwbnN0aW1lKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7ICAgICAgICAgICAvKiBhbHdheXMgcmV0dXJuIE9LICovCit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9zZXNzaW9uX3F1ZXJ5X3NlbmRfcnRjcF9zcmMgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIHJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKHBhcmVudCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgInJlY2VpdmVkIFFVRVJZICVzIiwKKyAgICAgIEdTVF9RVUVSWV9UWVBFX05BTUUgKHF1ZXJ5KSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfTEFURU5DWToKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICAvKiB1c2UgdGhlIGRlZmF1bHRzIGZvciB0aGUgbGF0ZW5jeSBxdWVyeS4gKi8KKyAgICAgIGdzdF9xdWVyeV9zZXRfbGF0ZW5jeSAocXVlcnksIEZBTFNFLCAwLCAtMSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogb3RoZXIgcXVlcmllcyBzaW1wbHkgZmFpbCBmb3Igbm93ICovCisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRjcF9zcmMgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTiAocGFyZW50KTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgInJlY2VpdmVkIEVWRU5UICVzIiwKKyAgICAgIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICBjYXNlIEdTVF9FVkVOVF9MQVRFTkNZOgorICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIG90aGVyIGV2ZW50cyBzaW1wbHkgZmFpbCBmb3Igbm93ICovCisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIHJldCA9IEZBTFNFOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRwX3NpbmsgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIHJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKHBhcmVudCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgInJlY2VpdmVkIEVWRU5UICVzIiwKKyAgICAgIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICAvKiBwcm9jZXNzICovCisgICAgICBnc3RfZXZlbnRfcGFyc2VfY2FwcyAoZXZlbnQsICZjYXBzKTsKKyAgICAgIGdzdF9ydHBfc2Vzc2lvbl9zZXRjYXBzX3NlbmRfcnRwIChwYWQsIHJ0cHNlc3Npb24sIGNhcHMpOworICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChydHBzZXNzaW9uLT5zZW5kX3J0cF9zcmMsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnJ0cHNlc3Npb24tPnNlbmRfcnRwX3NlZywgR1NUX0ZPUk1BVF9VTkRFRklORUQpOworICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChydHBzZXNzaW9uLT5zZW5kX3J0cF9zcmMsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6eworICAgICAgR3N0U2VnbWVudCAqc2VnbWVudCwgaW5fc2VnbWVudDsKKworICAgICAgc2VnbWVudCA9ICZydHBzZXNzaW9uLT5zZW5kX3J0cF9zZWc7CisKKyAgICAgIC8qIHRoZSBuZXdzZWdtZW50IGV2ZW50IGlzIG5lZWRlZCB0byBjb252ZXJ0IHRoZSBSVFAgdGltZXN0YW1wIHRvCisgICAgICAgKiBydW5uaW5nX3RpbWUsIHdoaWNoIGlzIG5lZWRlZCB0byBnZW5lcmF0ZSBhIG1hcHBpbmcgZnJvbSBSVFAgdG8gTlRQCisgICAgICAgKiB0aW1lc3RhbXBzIGluIFNSIHJlcG9ydHMgKi8KKyAgICAgIGdzdF9ldmVudF9jb3B5X3NlZ21lbnQgKGV2ZW50LCAmaW5fc2VnbWVudCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAicmVjZWl2ZWQgc2VnbWVudCAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsCisgICAgICAgICAgJmluX3NlZ21lbnQpOworCisgICAgICAvKiBhY2NlcHQgdXBzdHJlYW0gKi8KKyAgICAgIGdzdF9zZWdtZW50X2NvcHlfaW50byAoJmluX3NlZ21lbnQsIHNlZ21lbnQpOworCisgICAgICAvKiBwdXNoIGV2ZW50IGZvcndhcmQgKi8KKyAgICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAocnRwc2Vzc2lvbi0+c2VuZF9ydHBfc3JjLCBldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRU9TOnsKKyAgICAgIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWU7CisKKyAgICAgIC8qIHB1c2ggZG93bnN0cmVhbSBGSVhNRSwgd2UgYXJlIG5vdCBzdXBwb3NlZCB0byBsZWF2ZSB0aGUgc2Vzc2lvbiBqdXN0CisgICAgICAgKiBiZWNhdXNlIHdlIHN0b3Agc2VuZGluZy4gKi8KKyAgICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAocnRwc2Vzc2lvbi0+c2VuZF9ydHBfc3JjLCBldmVudCk7CisgICAgICBjdXJyZW50X3RpbWUgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKHJ0cHNlc3Npb24tPnByaXYtPnN5c2Nsb2NrKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgInNjaGVkdWxpbmcgQllFIG1lc3NhZ2UiKTsKKyAgICAgIHJ0cF9zZXNzaW9uX21hcmtfYWxsX2J5ZSAocnRwc2Vzc2lvbi0+cHJpdi0+c2Vzc2lvbiwgIkVuZCBPZiBTdHJlYW0iKTsKKyAgICAgIHJ0cF9zZXNzaW9uX3NjaGVkdWxlX2J5ZSAocnRwc2Vzc2lvbi0+cHJpdi0+c2Vzc2lvbiwgY3VycmVudF90aW1lKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OnsKKyAgICAgIEdzdFBhZCAqc2VuZF9ydHBfc3JjOworCisgICAgICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgICAgICBpZiAoKHNlbmRfcnRwX3NyYyA9IHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NyYykpCisgICAgICAgIGdzdF9vYmplY3RfcmVmIChzZW5kX3J0cF9zcmMpOworICAgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgICAgIGlmIChzZW5kX3J0cF9zcmMpIHsKKyAgICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChzZW5kX3J0cF9zcmMsIGV2ZW50KTsKKyAgICAgICAgZ3N0X29iamVjdF91bnJlZiAoc2VuZF9ydHBfc3JjKTsKKyAgICAgIH0gZWxzZQorICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3Nlc3Npb25fZXZlbnRfc2VuZF9ydHBfc3JjIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBTZXNzaW9uICpydHBzZXNzaW9uOworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBydHBzZXNzaW9uID0gR1NUX1JUUF9TRVNTSU9OIChwYXJlbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJyZWNlaXZlZCBFVkVOVCAlcyIsCisgICAgICBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0xBVEVOQ1k6CisgICAgICAvKiBzYXZlIHRoZSBsYXRlbmN5LCB3ZSBuZWVkIHRoaXMgdG8ga25vdyB3aGVuIGFuIFJUUCBwYWNrZXQgd2lsbCBiZQorICAgICAgICogcmVuZGVyZWQgYnkgdGhlIHNpbmsgKi8KKyAgICAgIGdzdF9ldmVudF9wYXJzZV9sYXRlbmN5IChldmVudCwgJnJ0cHNlc3Npb24tPnByaXYtPnNlbmRfbGF0ZW5jeSk7CisKKyAgICAgIHJldCA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfcnRwX3Nlc3Npb25fZ2V0Y2Fwc19zZW5kX3J0cCAoR3N0UGFkICogcGFkLCBHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbiwKKyAgICBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RSdHBTZXNzaW9uUHJpdmF0ZSAqcHJpdjsKKyAgR3N0Q2FwcyAqcmVzdWx0OworICBHc3RTdHJ1Y3R1cmUgKnMxLCAqczI7CisgIGd1aW50IHNzcmM7CisgIGdib29sZWFuIGlzX3JhbmRvbTsKKworICBwcml2ID0gcnRwc2Vzc2lvbi0+cHJpdjsKKworICBzc3JjID0gcnRwX3Nlc3Npb25fc3VnZ2VzdF9zc3JjIChwcml2LT5zZXNzaW9uLCAmaXNfcmFuZG9tKTsKKworICAvKiB3ZSBjYW4gYmFzaWNhbGx5IGFjY2VwdCBhbnl0aGluZyBidXQgd2UgcHJlZmVyIHRvIHJlY2VpdmUgcGFja2V0cyB3aXRoIG91cgorICAgKiBpbnRlcm5hbCBTU1JDIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBwYXRjaCBpdC4gQ3JlYXRlIGEgc3RydWN0dXJlIHdpdGgKKyAgICogdGhlIFNTUkMgYW5kIGFub3RoZXIgb25lIHdpdGhvdXQuCisgICAqIE9ubHkgZG8gdGhpcyBpZiB0aGUgc2Vzc2lvbiBhY3R1YWxseSBkZWNpZGVkIG9uIGFuIHNzcmMgYWxyZWFkeSwKKyAgICogb3RoZXJ3aXNlIHdlIGdpdmUgdXBzdHJlYW0gdGhlIG9wcG9ydHVuaXR5IHRvIHNlbGVjdCBhbiBzc3JjIGl0c2VsZiAqLworICBpZiAoIWlzX3JhbmRvbSkgeworICAgIHMxID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cCIsICJzc3JjIiwgR19UWVBFX1VJTlQsIHNzcmMsCisgICAgICAgIE5VTEwpOworICAgIHMyID0gZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCJhcHBsaWNhdGlvbi94LXJ0cCIpOworCisgICAgcmVzdWx0ID0gZ3N0X2NhcHNfbmV3X2Z1bGwgKHMxLCBzMiwgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0ID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtcnRwIik7CisgIH0KKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqY2FwcyA9IHJlc3VsdDsKKworICAgIHJlc3VsdCA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIGNhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgImdldHRpbmcgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgcmVzdWx0KTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHBfc2Vzc2lvbl9xdWVyeV9zZW5kX3J0cCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisKKyAgcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTiAocGFyZW50KTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmZpbHRlciwgKmNhcHM7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9jYXBzIChxdWVyeSwgJmZpbHRlcik7CisgICAgICBjYXBzID0gZ3N0X3J0cF9zZXNzaW9uX2dldGNhcHNfc2VuZF9ydHAgKHBhZCwgcnRwc2Vzc2lvbiwgZmlsdGVyKTsKKyAgICAgIGdzdF9xdWVyeV9zZXRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCBjYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3Nlc3Npb25fc2V0Y2Fwc19zZW5kX3J0cCAoR3N0UGFkICogcGFkLCBHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbiwKKyAgICBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UnRwU2Vzc2lvblByaXZhdGUgKnByaXY7CisKKyAgcHJpdiA9IHJ0cHNlc3Npb24tPnByaXY7CisKKyAgcnRwX3Nlc3Npb25fdXBkYXRlX3NlbmRfY2FwcyAocHJpdi0+c2Vzc2lvbiwgY2Fwcyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFJlY2lldmUgYW4gUlRQIHBhY2tldCBvciBhIGxpc3Qgb2YgcGFja2V0cyB0byBiZSBzZW5kIHRvIHRoZSByZWNlaXZlcnMsCisgKiBzZW5kIHRvIFJUUCBzZXNzaW9uIG1hbmFnZXIgYW5kIGZvcndhcmQgdG8gc2VuZF9ydHBfc3JjLgorICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3NlbmRfcnRwX2NvbW1vbiAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24sCisgICAgZ3BvaW50ZXIgZGF0YSwgZ2Jvb2xlYW4gaXNfbGlzdCkKK3sKKyAgR3N0UnRwU2Vzc2lvblByaXZhdGUgKnByaXY7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBydW5uaW5nX3RpbWU7CisgIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWU7CisKKyAgcHJpdiA9IHJ0cHNlc3Npb24tPnByaXY7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJyZWNlaXZlZCBSVFAgJXMiLCBpc19saXN0ID8gImxpc3QiIDogInBhY2tldCIpOworCisgIC8qIGdldCBOVFAgdGltZSB3aGVuIHRoaXMgcGFja2V0IHdhcyBjYXB0dXJlZCwgdGhpcyBkZXBlbmRzIG9uIHRoZSB0aW1lc3RhbXAuICovCisgIGlmIChpc19saXN0KSB7CisgICAgR3N0QnVmZmVyICpidWZmZXIgPSBOVUxMOworCisgICAgLyogQWxsIGdyb3VwcyBpbiBhbiBsaXN0IGhhdmUgdGhlIHNhbWUgdGltZXN0YW1wLgorICAgICAqIFNvLCBqdXN0IHRha2UgaXQgZnJvbSB0aGUgZmlyc3QgZ3JvdXAuICovCisgICAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9saXN0X2dldCAoR1NUX0JVRkZFUl9MSVNUX0NBU1QgKGRhdGEpLCAwKTsKKyAgICBpZiAoYnVmZmVyKQorICAgICAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcik7CisgICAgZWxzZQorICAgICAgdGltZXN0YW1wID0gLTE7CisgIH0gZWxzZSB7CisgICAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9QVFMgKEdTVF9CVUZGRVJfQ0FTVCAoZGF0YSkpOworICB9CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEICh0aW1lc3RhbXApKSB7CisgICAgLyogY29udmVydCB0byBydW5uaW5nIHRpbWUgdXNpbmcgdGhlIHNlZ21lbnQgc3RhcnQgdmFsdWUuICovCisgICAgcnVubmluZ190aW1lID0KKyAgICAgICAgZ3N0X3NlZ21lbnRfdG9fcnVubmluZ190aW1lICgmcnRwc2Vzc2lvbi0+c2VuZF9ydHBfc2VnLCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgIHRpbWVzdGFtcCk7CisgICAgaWYgKHByaXYtPnJ0Y3Bfc3luY19zZW5kX3RpbWUpCisgICAgICBydW5uaW5nX3RpbWUgKz0gcHJpdi0+c2VuZF9sYXRlbmN5OworICB9IGVsc2UgeworICAgIC8qIG5vIHRpbWVzdGFtcC4gKi8KKyAgICBydW5uaW5nX3RpbWUgPSAtMTsKKyAgfQorCisgIGN1cnJlbnRfdGltZSA9IGdzdF9jbG9ja19nZXRfdGltZSAocHJpdi0+c3lzY2xvY2spOworICByZXQgPSBydHBfc2Vzc2lvbl9zZW5kX3J0cCAocHJpdi0+c2Vzc2lvbiwgZGF0YSwgaXNfbGlzdCwgY3VycmVudF90aW1lLAorICAgICAgcnVubmluZ190aW1lKTsKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIHB1c2hfZXJyb3I7CisKK2RvbmU6CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK3B1c2hfZXJyb3I6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAicHJvY2VzcyByZXR1cm5lZCAlcyIsCisgICAgICAgIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfc2Vzc2lvbl9jaGFpbl9zZW5kX3J0cCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RSdHBTZXNzaW9uICpydHBzZXNzaW9uID0gR1NUX1JUUF9TRVNTSU9OIChwYXJlbnQpOworCisgIHJldHVybiBnc3RfcnRwX3Nlc3Npb25fY2hhaW5fc2VuZF9ydHBfY29tbW9uIChydHBzZXNzaW9uLCBidWZmZXIsIEZBTFNFKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfc2Vzc2lvbl9jaGFpbl9zZW5kX3J0cF9saXN0IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXJMaXN0ICogbGlzdCkKK3sKKyAgR3N0UnRwU2Vzc2lvbiAqcnRwc2Vzc2lvbiA9IEdTVF9SVFBfU0VTU0lPTiAocGFyZW50KTsKKworICByZXR1cm4gZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3NlbmRfcnRwX2NvbW1vbiAocnRwc2Vzc2lvbiwgbGlzdCwgVFJVRSk7Cit9CisKKy8qIENyZWF0ZSBzaW5rcGFkIHRvIHJlY2VpdmUgUlRQIHBhY2tldHMgZnJvbSBzZW5kZXJzLiBUaGlzIHdpbGwgYWxzbyBjcmVhdGUgYQorICogc3JjcGFkIGZvciB0aGUgUlRQIHBhY2tldHMuCisgKi8KK3N0YXRpYyBHc3RQYWQgKgorY3JlYXRlX3JlY3ZfcnRwX3NpbmsgKEdzdFJ0cFNlc3Npb24gKiBydHBzZXNzaW9uKQoreworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAiY3JlYXRpbmcgUlRQIHNpbmsgcGFkIik7CisKKyAgcnRwc2Vzc2lvbi0+cmVjdl9ydHBfc2luayA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnJ0cHNlc3Npb25fcmVjdl9ydHBfc2lua190ZW1wbGF0ZSwKKyAgICAgICJyZWN2X3J0cF9zaW5rIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChydHBzZXNzaW9uLT5yZWN2X3J0cF9zaW5rLAorICAgICAgZ3N0X3J0cF9zZXNzaW9uX2NoYWluX3JlY3ZfcnRwKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NpbmssCisgICAgICBnc3RfcnRwX3Nlc3Npb25fZXZlbnRfcmVjdl9ydHBfc2luayk7CisgIGdzdF9wYWRfc2V0X2l0ZXJhdGVfaW50ZXJuYWxfbGlua3NfZnVuY3Rpb24gKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NpbmssCisgICAgICBnc3RfcnRwX3Nlc3Npb25faXRlcmF0ZV9pbnRlcm5hbF9saW5rcyk7CisgIEdTVF9QQURfU0VUX1BST1hZX0FMTE9DQVRJT04gKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NpbmspOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NpbmssIFRSVUUpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBzZXNzaW9uKSwKKyAgICAgIHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NpbmspOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJjcmVhdGluZyBSVFAgc3JjIHBhZCIpOworICBydHBzZXNzaW9uLT5yZWN2X3J0cF9zcmMgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZydHBzZXNzaW9uX3JlY3ZfcnRwX3NyY190ZW1wbGF0ZSwKKyAgICAgICJyZWN2X3J0cF9zcmMiKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NyYywKKyAgICAgIGdzdF9ydHBfc2Vzc2lvbl9ldmVudF9yZWN2X3J0cF9zcmMpOworICBnc3RfcGFkX3NldF9pdGVyYXRlX2ludGVybmFsX2xpbmtzX2Z1bmN0aW9uIChydHBzZXNzaW9uLT5yZWN2X3J0cF9zcmMsCisgICAgICBnc3RfcnRwX3Nlc3Npb25faXRlcmF0ZV9pbnRlcm5hbF9saW5rcyk7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NyYyk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAocnRwc2Vzc2lvbi0+cmVjdl9ydHBfc3JjLCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwc2Vzc2lvbiksIHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NyYyk7CisKKyAgcmV0dXJuIHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3Npbms7Cit9CisKKy8qIFJlbW92ZSBzaW5rcGFkIHRvIHJlY2VpdmUgUlRQIHBhY2tldHMgZnJvbSBzZW5kZXJzLiBUaGlzIHdpbGwgYWxzbyByZW1vdmUKKyAqIHRoZSBzcmNwYWQgZm9yIHRoZSBSVFAgcGFja2V0cy4KKyAqLworc3RhdGljIHZvaWQKK3JlbW92ZV9yZWN2X3J0cF9zaW5rIChHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbikKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgInJlbW92aW5nIFJUUCBzaW5rIHBhZCIpOworCisgIC8qIGRlYWN0aXZhdGUgZnJvbSBzb3VyY2UgdG8gc2luayAqLworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NyYywgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NpbmssIEZBTFNFKTsKKworICAvKiByZW1vdmUgcGFkcyAqLworICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBzZXNzaW9uKSwKKyAgICAgIHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NpbmspOworICBydHBzZXNzaW9uLT5yZWN2X3J0cF9zaW5rID0gTlVMTDsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAicmVtb3ZpbmcgUlRQIHNyYyBwYWQiKTsKKyAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwc2Vzc2lvbiksCisgICAgICBydHBzZXNzaW9uLT5yZWN2X3J0cF9zcmMpOworICBydHBzZXNzaW9uLT5yZWN2X3J0cF9zcmMgPSBOVUxMOworfQorCisvKiBDcmVhdGUgYSBzaW5rcGFkIHRvIHJlY2VpdmUgUlRDUCBtZXNzYWdlcyBmcm9tIHNlbmRlcnMsIHRoaXMgd2lsbCBhbHNvIGNyZWF0ZSBhCisgKiBzeW5jX3NyYyBwYWQgZm9yIHRoZSBTUiBwYWNrZXRzLgorICovCitzdGF0aWMgR3N0UGFkICoKK2NyZWF0ZV9yZWN2X3J0Y3Bfc2luayAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJjcmVhdGluZyBSVENQIHNpbmsgcGFkIik7CisKKyAgcnRwc2Vzc2lvbi0+cmVjdl9ydGNwX3NpbmsgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZydHBzZXNzaW9uX3JlY3ZfcnRjcF9zaW5rX3RlbXBsYXRlLAorICAgICAgInJlY3ZfcnRjcF9zaW5rIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChydHBzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luaywKKyAgICAgIGdzdF9ydHBfc2Vzc2lvbl9jaGFpbl9yZWN2X3J0Y3ApOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAocnRwc2Vzc2lvbi0+cmVjdl9ydGNwX3NpbmssCisgICAgICBnc3RfcnRwX3Nlc3Npb25fZXZlbnRfcmVjdl9ydGNwX3NpbmspOworICBnc3RfcGFkX3NldF9pdGVyYXRlX2ludGVybmFsX2xpbmtzX2Z1bmN0aW9uIChydHBzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luaywKKyAgICAgIGdzdF9ydHBfc2Vzc2lvbl9pdGVyYXRlX2ludGVybmFsX2xpbmtzKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChydHBzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luaywgVFJVRSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cHNlc3Npb24pLAorICAgICAgcnRwc2Vzc2lvbi0+cmVjdl9ydGNwX3NpbmspOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJjcmVhdGluZyBzeW5jIHNyYyBwYWQiKTsKKyAgcnRwc2Vzc2lvbi0+c3luY19zcmMgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZydHBzZXNzaW9uX3N5bmNfc3JjX3RlbXBsYXRlLAorICAgICAgInN5bmNfc3JjIik7CisgIGdzdF9wYWRfc2V0X2l0ZXJhdGVfaW50ZXJuYWxfbGlua3NfZnVuY3Rpb24gKHJ0cHNlc3Npb24tPnN5bmNfc3JjLAorICAgICAgZ3N0X3J0cF9zZXNzaW9uX2l0ZXJhdGVfaW50ZXJuYWxfbGlua3MpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChydHBzZXNzaW9uLT5zeW5jX3NyYyk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAocnRwc2Vzc2lvbi0+c3luY19zcmMsIFRSVUUpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBzZXNzaW9uKSwgcnRwc2Vzc2lvbi0+c3luY19zcmMpOworCisgIHJldHVybiBydHBzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luazsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9yZWN2X3J0Y3Bfc2luayAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJyZW1vdmluZyBSVENQIHNpbmsgcGFkIik7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChydHBzZXNzaW9uLT5zeW5jX3NyYywgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rLCBGQUxTRSk7CisKKyAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwc2Vzc2lvbiksCisgICAgICBydHBzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luayk7CisgIHJ0cHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rID0gTlVMTDsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAicmVtb3Zpbmcgc3luYyBzcmMgcGFkIik7CisgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cHNlc3Npb24pLCBydHBzZXNzaW9uLT5zeW5jX3NyYyk7CisgIHJ0cHNlc3Npb24tPnN5bmNfc3JjID0gTlVMTDsKK30KKworLyogQ3JlYXRlIGEgc2lua3BhZCB0byByZWNlaXZlIFJUUCBwYWNrZXRzIGZvciByZWNlaXZlcnMuIFRoaXMgd2lsbCBhbHNvIGNyZWF0ZSBhCisgKiBzZW5kX3J0cF9zcmMgcGFkLgorICovCitzdGF0aWMgR3N0UGFkICoKK2NyZWF0ZV9zZW5kX3J0cF9zaW5rIChHc3RSdHBTZXNzaW9uICogcnRwc2Vzc2lvbikKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwc2Vzc2lvbiwgImNyZWF0aW5nIHBhZCIpOworCisgIHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmsgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZydHBzZXNzaW9uX3NlbmRfcnRwX3NpbmtfdGVtcGxhdGUsCisgICAgICAic2VuZF9ydHBfc2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAocnRwc2Vzc2lvbi0+c2VuZF9ydHBfc2luaywKKyAgICAgIGdzdF9ydHBfc2Vzc2lvbl9jaGFpbl9zZW5kX3J0cCk7CisgIGdzdF9wYWRfc2V0X2NoYWluX2xpc3RfZnVuY3Rpb24gKHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmssCisgICAgICBnc3RfcnRwX3Nlc3Npb25fY2hhaW5fc2VuZF9ydHBfbGlzdCk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChydHBzZXNzaW9uLT5zZW5kX3J0cF9zaW5rLAorICAgICAgZ3N0X3J0cF9zZXNzaW9uX3F1ZXJ5X3NlbmRfcnRwKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmssCisgICAgICBnc3RfcnRwX3Nlc3Npb25fZXZlbnRfc2VuZF9ydHBfc2luayk7CisgIGdzdF9wYWRfc2V0X2l0ZXJhdGVfaW50ZXJuYWxfbGlua3NfZnVuY3Rpb24gKHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmssCisgICAgICBnc3RfcnRwX3Nlc3Npb25faXRlcmF0ZV9pbnRlcm5hbF9saW5rcyk7CisgIEdTVF9QQURfU0VUX1BST1hZX0NBUFMgKHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmspOworICBHU1RfUEFEX1NFVF9QUk9YWV9BTExPQ0FUSU9OIChydHBzZXNzaW9uLT5zZW5kX3J0cF9zaW5rKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChydHBzZXNzaW9uLT5zZW5kX3J0cF9zaW5rLCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwc2Vzc2lvbiksCisgICAgICBydHBzZXNzaW9uLT5zZW5kX3J0cF9zaW5rKTsKKworICBydHBzZXNzaW9uLT5zZW5kX3J0cF9zcmMgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZydHBzZXNzaW9uX3NlbmRfcnRwX3NyY190ZW1wbGF0ZSwKKyAgICAgICJzZW5kX3J0cF9zcmMiKTsKKyAgZ3N0X3BhZF9zZXRfaXRlcmF0ZV9pbnRlcm5hbF9saW5rc19mdW5jdGlvbiAocnRwc2Vzc2lvbi0+c2VuZF9ydHBfc3JjLAorICAgICAgZ3N0X3J0cF9zZXNzaW9uX2l0ZXJhdGVfaW50ZXJuYWxfbGlua3MpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAocnRwc2Vzc2lvbi0+c2VuZF9ydHBfc3JjLAorICAgICAgZ3N0X3J0cF9zZXNzaW9uX2V2ZW50X3NlbmRfcnRwX3NyYyk7CisgIEdTVF9QQURfU0VUX1BST1hZX0NBUFMgKHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NyYyk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAocnRwc2Vzc2lvbi0+c2VuZF9ydHBfc3JjLCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwc2Vzc2lvbiksIHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NyYyk7CisKKyAgcmV0dXJuIHJ0cHNlc3Npb24tPnNlbmRfcnRwX3Npbms7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfc2VuZF9ydHBfc2luayAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJyZW1vdmluZyBwYWQiKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NyYywgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmssIEZBTFNFKTsKKworICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBzZXNzaW9uKSwKKyAgICAgIHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmspOworICBydHBzZXNzaW9uLT5zZW5kX3J0cF9zaW5rID0gTlVMTDsKKworICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBzZXNzaW9uKSwKKyAgICAgIHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NyYyk7CisgIHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NyYyA9IE5VTEw7Cit9CisKKy8qIENyZWF0ZSBhIHNyY3BhZCB3aXRoIHRoZSBSVENQIHBhY2tldHMgdG8gc2VuZCBvdXQuCisgKiBUaGlzIHBhZCB3aWxsIGJlIGRyaXZlbiBieSB0aGUgUlRQIHNlc3Npb24gbWFuYWdlciB3aGVuIGl0IHdhbnRzIHRvIHNlbmQgb3V0CisgKiBSVENQIHBhY2tldHMuCisgKi8KK3N0YXRpYyBHc3RQYWQgKgorY3JlYXRlX3NlbmRfcnRjcF9zcmMgKEdzdFJ0cFNlc3Npb24gKiBydHBzZXNzaW9uKQoreworICBHU1RfREVCVUdfT0JKRUNUIChydHBzZXNzaW9uLCAiY3JlYXRpbmcgcGFkIik7CisKKyAgcnRwc2Vzc2lvbi0+c2VuZF9ydGNwX3NyYyA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnJ0cHNlc3Npb25fc2VuZF9ydGNwX3NyY190ZW1wbGF0ZSwKKyAgICAgICJzZW5kX3J0Y3Bfc3JjIik7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKHJ0cHNlc3Npb24tPnNlbmRfcnRjcF9zcmMpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cHNlc3Npb24tPnNlbmRfcnRjcF9zcmMsIFRSVUUpOworICBnc3RfcGFkX3NldF9pdGVyYXRlX2ludGVybmFsX2xpbmtzX2Z1bmN0aW9uIChydHBzZXNzaW9uLT5zZW5kX3J0Y3Bfc3JjLAorICAgICAgZ3N0X3J0cF9zZXNzaW9uX2l0ZXJhdGVfaW50ZXJuYWxfbGlua3MpOworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAocnRwc2Vzc2lvbi0+c2VuZF9ydGNwX3NyYywKKyAgICAgIGdzdF9ydHBfc2Vzc2lvbl9xdWVyeV9zZW5kX3J0Y3Bfc3JjKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHJ0cHNlc3Npb24tPnNlbmRfcnRjcF9zcmMsCisgICAgICBnc3RfcnRwX3Nlc3Npb25fZXZlbnRfc2VuZF9ydGNwX3NyYyk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cHNlc3Npb24pLAorICAgICAgcnRwc2Vzc2lvbi0+c2VuZF9ydGNwX3NyYyk7CisKKyAgcmV0dXJuIHJ0cHNlc3Npb24tPnNlbmRfcnRjcF9zcmM7Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdmVfc2VuZF9ydGNwX3NyYyAoR3N0UnRwU2Vzc2lvbiAqIHJ0cHNlc3Npb24pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cHNlc3Npb24sICJyZW1vdmluZyBwYWQiKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cHNlc3Npb24tPnNlbmRfcnRjcF9zcmMsIEZBTFNFKTsKKworICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBzZXNzaW9uKSwKKyAgICAgIHJ0cHNlc3Npb24tPnNlbmRfcnRjcF9zcmMpOworICBydHBzZXNzaW9uLT5zZW5kX3J0Y3Bfc3JjID0gTlVMTDsKK30KKworc3RhdGljIEdzdFBhZCAqCitnc3RfcnRwX3Nlc3Npb25fcmVxdWVzdF9uZXdfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIG5hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSdHBTZXNzaW9uICpydHBzZXNzaW9uOworICBHc3RFbGVtZW50Q2xhc3MgKmtsYXNzOworICBHc3RQYWQgKnJlc3VsdDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAodGVtcGwgIT0gTlVMTCwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfUlRQX1NFU1NJT04gKGVsZW1lbnQpLCBOVUxMKTsKKworICBydHBzZXNzaW9uID0gR1NUX1JUUF9TRVNTSU9OIChlbGVtZW50KTsKKyAga2xhc3MgPSBHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKGVsZW1lbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVsZW1lbnQsICJyZXF1ZXN0aW5nIHBhZCAlcyIsIEdTVF9TVFJfTlVMTCAobmFtZSkpOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKworICAvKiBmaWd1cmUgb3V0IHRoZSB0ZW1wbGF0ZSAqLworICBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJyZWN2X3J0cF9zaW5rIikpIHsKKyAgICBpZiAocnRwc2Vzc2lvbi0+cmVjdl9ydHBfc2luayAhPSBOVUxMKQorICAgICAgZ290byBleGlzdHM7CisKKyAgICByZXN1bHQgPSBjcmVhdGVfcmVjdl9ydHBfc2luayAocnRwc2Vzc2lvbik7CisgIH0gZWxzZSBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsCisgICAgICAgICAgInJlY3ZfcnRjcF9zaW5rIikpIHsKKyAgICBpZiAocnRwc2Vzc2lvbi0+cmVjdl9ydGNwX3NpbmsgIT0gTlVMTCkKKyAgICAgIGdvdG8gZXhpc3RzOworCisgICAgcmVzdWx0ID0gY3JlYXRlX3JlY3ZfcnRjcF9zaW5rIChydHBzZXNzaW9uKTsKKyAgfSBlbHNlIGlmICh0ZW1wbCA9PSBnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywKKyAgICAgICAgICAic2VuZF9ydHBfc2luayIpKSB7CisgICAgaWYgKHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmsgIT0gTlVMTCkKKyAgICAgIGdvdG8gZXhpc3RzOworCisgICAgcmVzdWx0ID0gY3JlYXRlX3NlbmRfcnRwX3NpbmsgKHJ0cHNlc3Npb24pOworICB9IGVsc2UgaWYgKHRlbXBsID09IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLAorICAgICAgICAgICJzZW5kX3J0Y3Bfc3JjIikpIHsKKyAgICBpZiAocnRwc2Vzc2lvbi0+c2VuZF9ydGNwX3NyYyAhPSBOVUxMKQorICAgICAgZ290byBleGlzdHM7CisKKyAgICByZXN1bHQgPSBjcmVhdGVfc2VuZF9ydGNwX3NyYyAocnRwc2Vzc2lvbik7CisgIH0gZWxzZQorICAgIGdvdG8gd3JvbmdfdGVtcGxhdGU7CisKKyAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgcmV0dXJuIHJlc3VsdDsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX3RlbXBsYXRlOgorICB7CisgICAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisgICAgZ193YXJuaW5nICgicnRwc2Vzc2lvbjogdGhpcyBpcyBub3Qgb3VyIHRlbXBsYXRlIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2V4aXN0czoKKyAgeworICAgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHJ0cHNlc3Npb24pOworICAgIGdfd2FybmluZyAoInJ0cHNlc3Npb246IHBhZCBhbHJlYWR5IHJlcXVlc3RlZCIpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3Nlc3Npb25fcmVsZWFzZV9wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWQgKiBwYWQpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb247CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1JUUF9TRVNTSU9OIChlbGVtZW50KSk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19QQUQgKHBhZCkpOworCisgIHJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKGVsZW1lbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVsZW1lbnQsICJyZWxlYXNpbmcgcGFkICVzOiVzIiwgR1NUX0RFQlVHX1BBRF9OQU1FIChwYWQpKTsKKworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgaWYgKHJ0cHNlc3Npb24tPnJlY3ZfcnRwX3NpbmsgPT0gcGFkKSB7CisgICAgcmVtb3ZlX3JlY3ZfcnRwX3NpbmsgKHJ0cHNlc3Npb24pOworICB9IGVsc2UgaWYgKHJ0cHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rID09IHBhZCkgeworICAgIHJlbW92ZV9yZWN2X3J0Y3Bfc2luayAocnRwc2Vzc2lvbik7CisgIH0gZWxzZSBpZiAocnRwc2Vzc2lvbi0+c2VuZF9ydHBfc2luayA9PSBwYWQpIHsKKyAgICByZW1vdmVfc2VuZF9ydHBfc2luayAocnRwc2Vzc2lvbik7CisgIH0gZWxzZSBpZiAocnRwc2Vzc2lvbi0+c2VuZF9ydGNwX3NyYyA9PSBwYWQpIHsKKyAgICByZW1vdmVfc2VuZF9ydGNwX3NyYyAocnRwc2Vzc2lvbik7CisgIH0gZWxzZQorICAgIGdvdG8gd3JvbmdfcGFkOworCisgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHJ0cHNlc3Npb24pOworCisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX3BhZDoKKyAgeworICAgIEdTVF9SVFBfU0VTU0lPTl9VTkxPQ0sgKHJ0cHNlc3Npb24pOworICAgIGdfd2FybmluZyAoInJ0cHNlc3Npb246IGFza2VkIHRvIHJlbGVhc2UgYW4gdW5rbm93biBwYWQiKTsKKyAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc2Vzc2lvbl9yZXF1ZXN0X2tleV91bml0IChSVFBTZXNzaW9uICogc2VzcywKKyAgICBndWludDMyIHNzcmMsIGdib29sZWFuIGFsbF9oZWFkZXJzLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKHVzZXJfZGF0YSk7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgR3N0UGFkICpzZW5kX3J0cF9zaW5rOworCisgIEdTVF9SVFBfU0VTU0lPTl9MT0NLIChydHBzZXNzaW9uKTsKKyAgaWYgKChzZW5kX3J0cF9zaW5rID0gcnRwc2Vzc2lvbi0+c2VuZF9ydHBfc2luaykpCisgICAgZ3N0X29iamVjdF9yZWYgKHNlbmRfcnRwX3NpbmspOworICBHU1RfUlRQX1NFU1NJT05fVU5MT0NLIChydHBzZXNzaW9uKTsKKworICBpZiAoc2VuZF9ydHBfc2luaykgeworICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19jdXN0b20gKEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU0sCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiR3N0Rm9yY2VLZXlVbml0IiwgInNzcmMiLCBHX1RZUEVfVUlOVCwgc3NyYywKKyAgICAgICAgICAgICJhbGwtaGVhZGVycyIsIEdfVFlQRV9CT09MRUFOLCBhbGxfaGVhZGVycywgTlVMTCkpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc2VuZF9ydHBfc2luaywgZXZlbnQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNlbmRfcnRwX3NpbmspOworICB9Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2dzdF9ydHBfc2Vzc2lvbl9yZXF1ZXN0X3RpbWUgKFJUUFNlc3Npb24gKiBzZXNzaW9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKHVzZXJfZGF0YSk7CisKKyAgcmV0dXJuIGdzdF9jbG9ja19nZXRfdGltZSAocnRwc2Vzc2lvbi0+cHJpdi0+c3lzY2xvY2spOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zZXNzaW9uX25vdGlmeV9uYWNrIChSVFBTZXNzaW9uICogc2VzcywgZ3VpbnQxNiBzZXFudW0sCisgICAgZ3VpbnQxNiBibHAsIGd1aW50MzIgc3NyYywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RSdHBTZXNzaW9uICpydHBzZXNzaW9uID0gR1NUX1JUUF9TRVNTSU9OICh1c2VyX2RhdGEpOworICBHc3RFdmVudCAqZXZlbnQ7CisgIEdzdFBhZCAqc2VuZF9ydHBfc2luazsKKworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgIGlmICgoc2VuZF9ydHBfc2luayA9IHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmspKQorICAgIGdzdF9vYmplY3RfcmVmIChzZW5kX3J0cF9zaW5rKTsKKyAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgaWYgKHNlbmRfcnRwX3NpbmspIHsKKyAgICB3aGlsZSAoVFJVRSkgeworICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoIkdzdFJUUFJldHJhbnNtaXNzaW9uUmVxdWVzdCIsCisgICAgICAgICAgICAgICJzZXFudW0iLCBHX1RZUEVfVUlOVCwgKGd1aW50KSBzZXFudW0sCisgICAgICAgICAgICAgICJzc3JjIiwgR19UWVBFX1VJTlQsIChndWludCkgc3NyYywgTlVMTCkpOworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzZW5kX3J0cF9zaW5rLCBldmVudCk7CisKKyAgICAgIGlmIChibHAgPT0gMCkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIHNlcW51bSsrOworICAgICAgd2hpbGUgKChibHAgJiAxKSA9PSAwKSB7CisgICAgICAgIHNlcW51bSsrOworICAgICAgICBibHAgPj49IDE7CisgICAgICB9CisgICAgICBibHAgPj49IDE7CisgICAgfQorICAgIGdzdF9vYmplY3RfdW5yZWYgKHNlbmRfcnRwX3NpbmspOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3Nlc3Npb25fcmVjb25maWd1cmUgKFJUUFNlc3Npb24gKiBzZXNzLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFJ0cFNlc3Npb24gKnJ0cHNlc3Npb24gPSBHU1RfUlRQX1NFU1NJT04gKHVzZXJfZGF0YSk7CisgIEdzdFBhZCAqc2VuZF9ydHBfc2luazsKKworICBHU1RfUlRQX1NFU1NJT05fTE9DSyAocnRwc2Vzc2lvbik7CisgIGlmICgoc2VuZF9ydHBfc2luayA9IHJ0cHNlc3Npb24tPnNlbmRfcnRwX3NpbmspKQorICAgIGdzdF9vYmplY3RfcmVmIChzZW5kX3J0cF9zaW5rKTsKKyAgR1NUX1JUUF9TRVNTSU9OX1VOTE9DSyAocnRwc2Vzc2lvbik7CisKKyAgaWYgKHNlbmRfcnRwX3NpbmspIHsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNlbmRfcnRwX3NpbmssIGdzdF9ldmVudF9uZXdfcmVjb25maWd1cmUgKCkpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNlbmRfcnRwX3NpbmspOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmggYi9nc3QvcnRwbWFuYWdlci9nc3RydHBzZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMxYzEwOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNlc3Npb24uaApAQCAtMCwwICsxLDkwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfU0VTU0lPTl9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1NFU1NJT05fSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1NFU1NJT04gXAorICAoZ3N0X3J0cF9zZXNzaW9uX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfU0VTU0lPTihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9TRVNTSU9OLEdzdFJ0cFNlc3Npb24pKQorI2RlZmluZSBHU1RfUlRQX1NFU1NJT05fQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX1NFU1NJT04sR3N0UnRwU2Vzc2lvbkNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9TRVNTSU9OKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfUlRQX1NFU1NJT04pKQorI2RlZmluZSBHU1RfSVNfUlRQX1NFU1NJT05fQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX1NFU1NJT04pKQorI2RlZmluZSBHU1RfUlRQX1NFU1NJT05fQ0FTVChvYmopICgoR3N0UnRwU2Vzc2lvbiAqKShvYmopKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU2Vzc2lvbiBHc3RSdHBTZXNzaW9uOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFJ0cFNlc3Npb25DbGFzcyBHc3RSdHBTZXNzaW9uQ2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU2Vzc2lvblByaXZhdGUgR3N0UnRwU2Vzc2lvblByaXZhdGU7CisKK3N0cnVjdCBfR3N0UnRwU2Vzc2lvbiB7CisgIEdzdEVsZW1lbnQgICAgIGVsZW1lbnQ7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIEdzdFBhZCAgICAgICAgKnJlY3ZfcnRwX3Npbms7CisgIEdzdFNlZ21lbnQgICAgIHJlY3ZfcnRwX3NlZzsKKyAgR3N0UGFkICAgICAgICAqcmVjdl9ydGNwX3Npbms7CisgIEdzdFBhZCAgICAgICAgKnNlbmRfcnRwX3Npbms7CisgIEdzdFNlZ21lbnQgICAgIHNlbmRfcnRwX3NlZzsKKworICBHc3RQYWQgICAgICAgICpyZWN2X3J0cF9zcmM7CisgIEdzdFBhZCAgICAgICAgKnN5bmNfc3JjOworICBHc3RQYWQgICAgICAgICpzZW5kX3J0cF9zcmM7CisgIEdzdFBhZCAgICAgICAgKnNlbmRfcnRjcF9zcmM7CisKKyAgR3N0UnRwU2Vzc2lvblByaXZhdGUgKnByaXY7Cit9OworCitzdHJ1Y3QgX0dzdFJ0cFNlc3Npb25DbGFzcyB7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7CisKKyAgLyogc2lnbmFscyAqLworICBHc3RDYXBzKiAoKnJlcXVlc3RfcHRfbWFwKSAoR3N0UnRwU2Vzc2lvbiAqc2VzcywgZ3VpbnQgcHQpOworICB2b2lkICAgICAoKmNsZWFyX3B0X21hcCkgICAoR3N0UnRwU2Vzc2lvbiAqc2Vzcyk7CisKKyAgdm9pZCAgICAgKCpvbl9uZXdfc3NyYykgICAgICAgKEdzdFJ0cFNlc3Npb24gKnNlc3MsIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fc3NyY19jb2xsaXNpb24pIChHc3RSdHBTZXNzaW9uICpzZXNzLCBndWludDMyIHNzcmMpOworICB2b2lkICAgICAoKm9uX3NzcmNfdmFsaWRhdGVkKSAoR3N0UnRwU2Vzc2lvbiAqc2VzcywgZ3VpbnQzMiBzc3JjKTsKKyAgdm9pZCAgICAgKCpvbl9zc3JjX2FjdGl2ZSkgICAgKEdzdFJ0cFNlc3Npb24gKnNlc3MsIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fc3NyY19zZGVzKSAgICAgIChHc3RSdHBTZXNzaW9uICpzZXNzLCBndWludDMyIHNzcmMpOworICB2b2lkICAgICAoKm9uX2J5ZV9zc3JjKSAgICAgICAoR3N0UnRwU2Vzc2lvbiAqc2VzcywgZ3VpbnQzMiBzc3JjKTsKKyAgdm9pZCAgICAgKCpvbl9ieWVfdGltZW91dCkgICAgKEdzdFJ0cFNlc3Npb24gKnNlc3MsIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fdGltZW91dCkgICAgICAgIChHc3RSdHBTZXNzaW9uICpzZXNzLCBndWludDMyIHNzcmMpOworICB2b2lkICAgICAoKm9uX3NlbmRlcl90aW1lb3V0KSAoR3N0UnRwU2Vzc2lvbiAqc2VzcywgZ3VpbnQzMiBzc3JjKTsKKyAgdm9pZCAgICAgKCpvbl9uZXdfc2VuZGVyX3NzcmMpICAgICAgKEdzdFJ0cFNlc3Npb24gKnNlc3MsIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fc2VuZGVyX3NzcmNfYWN0aXZlKSAgIChHc3RSdHBTZXNzaW9uICpzZXNzLCBndWludDMyIHNzcmMpOworfTsKKworR1R5cGUgZ3N0X3J0cF9zZXNzaW9uX2dldF90eXBlICh2b2lkKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX1JUUF9OVFBfVElNRV9TT1VSQ0VfTlRQLAorICBHU1RfUlRQX05UUF9USU1FX1NPVVJDRV9VTklYLAorICBHU1RfUlRQX05UUF9USU1FX1NPVVJDRV9SVU5OSU5HX1RJTUUsCisgIEdTVF9SVFBfTlRQX1RJTUVfU09VUkNFX0NMT0NLX1RJTUUKK30gR3N0UnRwTnRwVGltZVNvdXJjZTsKKworR1R5cGUgZ3N0X3J0cF9udHBfdGltZV9zb3VyY2VfZ2V0X3R5cGUgKHZvaWQpOworCisjZW5kaWYgLyogX19HU1RfUlRQX1NFU1NJT05fSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYyBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YTNjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguYwpAQCAtMCwwICsxLDk1NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFJUUCBTU1JDIGRlbXV4ZXIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHBzc3JjZGVtdXgKKyAqCisgKiBydHBzc3JjZGVtdXggYWN0cyBhcyBhIGRlbXV4ZXIgZm9yIFJUUCBwYWNrZXRzIGJhc2VkIG9uIHRoZSBTU1JDIG9mIHRoZQorICogcGFja2V0cy4gSXRzIG1haW4gcHVycG9zZSBpcyB0byBhbGxvdyBhbiBhcHBsaWNhdGlvbiB0byBlYXNpbHkgcmVjZWl2ZSBhbmQKKyAqIGRlY29kZSBhbiBSVFAgc3RyZWFtIHdpdGggbXVsdGlwbGUgU1NSQ3MuCisgKiAKKyAqIEZvciBlYWNoIFNTUkMgdGhhdCBpcyBkZXRlY3RlZCwgYSBuZXcgcGFkIHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlCisgKiAjR3N0UnRwU3NyY0RlbXV4OjpuZXctc3NyYy1wYWQgc2lnbmFsIHdpbGwgYmUgZW1pdHRlZC4gCisgKiAKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdWRwc3JjIGNhcHM9ImFwcGxpY2F0aW9uL3gtcnRwIiAhIHJ0cHNzcmNkZW11eCAhIGZha2VzaW5rCisgKiBdfCBUYWtlcyBhbiBSVFAgc3RyZWFtIGFuZCBzZW5kIHRoZSBSVFAgcGFja2V0cyB3aXRoIHRoZSBmaXJzdCBkZXRlY3RlZCBTU1JDCisgKiB0byBmYWtlc2luaywgZGlzY2FyZGluZyB0aGUgb3RoZXIgU1NSQ3MuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydGNwYnVmZmVyLmg+CisKKyNpbmNsdWRlICJnc3RydHBzc3JjZGVtdXguaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3J0cF9zc3JjX2RlbXV4X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9ydHBfc3NyY19kZW11eF9kZWJ1ZworCisvKiBnZW5lcmljIHRlbXBsYXRlcyAqLworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHJ0cF9zc3JjX2RlbXV4X3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBydHBfc3NyY19kZW11eF9ydGNwX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJydGNwX3NpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0Y3AiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBydHBfc3NyY19kZW11eF9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmNfJXUiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfU09NRVRJTUVTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgcnRwX3NzcmNfZGVtdXhfcnRjcF9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJydGNwX3NyY18ldSIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydGNwIikKKyAgICApOworCisjZGVmaW5lIEdTVF9QQURfTE9DSyhvYmopICAgKGdfcmVjX211dGV4X2xvY2sgKCYob2JqKS0+cGFkbG9jaykpCisjZGVmaW5lIEdTVF9QQURfVU5MT0NLKG9iaikgKGdfcmVjX211dGV4X3VubG9jayAoJihvYmopLT5wYWRsb2NrKSkKKwordHlwZWRlZiBlbnVtCit7CisgIFJUUF9QQUQsCisgIFJUQ1BfUEFECit9IFBhZFR5cGU7CisKKy8qIHNpZ25hbHMgKi8KK2VudW0KK3sKKyAgU0lHTkFMX05FV19TU1JDX1BBRCwKKyAgU0lHTkFMX1JFTU9WRURfU1NSQ19QQUQsCisgIFNJR05BTF9DTEVBUl9TU1JDLAorICBMQVNUX1NJR05BTAorfTsKKworI2RlZmluZSBnc3RfcnRwX3NzcmNfZGVtdXhfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0UnRwU3NyY0RlbXV4LCBnc3RfcnRwX3NzcmNfZGVtdXgsIEdTVF9UWVBFX0VMRU1FTlQpOworCisvKiBHT2JqZWN0IHZtZXRob2RzICovCitzdGF0aWMgdm9pZCBnc3RfcnRwX3NzcmNfZGVtdXhfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX3NzcmNfZGVtdXhfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCisvKiBHc3RFbGVtZW50IHZtZXRob2RzICovCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0cF9zc3JjX2RlbXV4X2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqCisgICAgZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyB2b2lkIGdzdF9ydHBfc3NyY19kZW11eF9jbGVhcl9zc3JjIChHc3RSdHBTc3JjRGVtdXggKiBkZW11eCwKKyAgICBndWludDMyIHNzcmMpOworCisvKiBzaW5rcGFkIHN0dWZmICovCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX3NzcmNfZGVtdXhfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0cF9zc3JjX2RlbXV4X3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX3NzcmNfZGVtdXhfcnRjcF9jaGFpbiAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBHc3RJdGVyYXRvciAqZ3N0X3J0cF9zc3JjX2RlbXV4X2l0ZXJhdGVfaW50ZXJuYWxfbGlua3Nfc2luayAoR3N0UGFkICoKKyAgICBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCk7CisKKy8qIHNyY3BhZCBzdHVmZiAqLworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfc3NyY19kZW11eF9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIEdzdEl0ZXJhdG9yICpnc3RfcnRwX3NzcmNfZGVtdXhfaXRlcmF0ZV9pbnRlcm5hbF9saW5rc19zcmMgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9ydHBfc3NyY19kZW11eF9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworCitzdGF0aWMgZ3VpbnQgZ3N0X3J0cF9zc3JjX2RlbXV4X3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07CisKKy8qCisgKiBJdGVtIGZvciBzdG9yaW5nIEdzdFBhZCA8LT4gU1NSQyBwYWlycy4KKyAqLworc3RydWN0IF9Hc3RSdHBTc3JjRGVtdXhQYWQKK3sKKyAgZ3VpbnQzMiBzc3JjOworICBHc3RQYWQgKnJ0cF9wYWQ7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdFBhZCAqcnRjcF9wYWQ7CisKKyAgZ2Jvb2xlYW4gcHVzaGVkX2luaXRpYWxfcnRwX2V2ZW50czsKKyAgZ2Jvb2xlYW4gcHVzaGVkX2luaXRpYWxfcnRjcF9ldmVudHM7Cit9OworCisvKiBmaW5kIGEgc3JjIHBhZCBmb3IgYSBnaXZlbiBTU1JDLCByZXR1cm5zIE5VTEwgaWYgdGhlIFNTUkMgd2FzIG5vdCBmb3VuZAorICovCitzdGF0aWMgR3N0UnRwU3NyY0RlbXV4UGFkICoKK2ZpbmRfZGVtdXhfcGFkX2Zvcl9zc3JjIChHc3RSdHBTc3JjRGVtdXggKiBkZW11eCwgZ3VpbnQzMiBzc3JjKQoreworICBHU0xpc3QgKndhbGs7CisKKyAgZm9yICh3YWxrID0gZGVtdXgtPnNyY3BhZHM7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UnRwU3NyY0RlbXV4UGFkICpwYWQgPSAoR3N0UnRwU3NyY0RlbXV4UGFkICopIHdhbGstPmRhdGE7CisKKyAgICBpZiAocGFkLT5zc3JjID09IHNzcmMpCisgICAgICByZXR1cm4gcGFkOworICB9CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgR3N0RXZlbnQgKgorYWRkX3NzcmNfYW5kX3JlZiAoR3N0RXZlbnQgKiBldmVudCwgZ3VpbnQzMiBzc3JjKQoreworICAvKiBTZXQgdGhlIHNzcmMgb24gdGhlIG91dHB1dCBjYXBzICovCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKyAgICAgIEdzdENhcHMgKm5ld2NhcHM7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChldmVudCwgJmNhcHMpOworICAgICAgbmV3Y2FwcyA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworCisgICAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAobmV3Y2FwcywgMCk7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgInNzcmMiLCBHX1RZUEVfVUlOVCwgc3NyYywgTlVMTCk7CisgICAgICBldmVudCA9IGdzdF9ldmVudF9uZXdfY2FwcyAobmV3Y2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAobmV3Y2Fwcyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGdzdF9ldmVudF9yZWYgKGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGV2ZW50OworfQorCitzdHJ1Y3QgRm9yd2FyZFN0aWNreUV2ZW50RGF0YQoreworICBHc3RQYWQgKnBhZDsKKyAgZ3VpbnQzMiBzc3JjOworfTsKKworc3RhdGljIGdib29sZWFuCitmb3J3YXJkX3N0aWNreV9ldmVudHMgKEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgc3RydWN0IEZvcndhcmRTdGlja3lFdmVudERhdGEgKmRhdGEgPSB1c2VyX2RhdGE7CisgIEdzdEV2ZW50ICpuZXdldmVudDsKKworICBuZXdldmVudCA9IGFkZF9zc3JjX2FuZF9yZWYgKCpldmVudCwgZGF0YS0+c3NyYyk7CisKKyAgZ3N0X3BhZF9wdXNoX2V2ZW50IChkYXRhLT5wYWQsIG5ld2V2ZW50KTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2ZvcndhcmRfaW5pdGlhbF9ldmVudHMgKEdzdFJ0cFNzcmNEZW11eCAqIGRlbXV4LCBndWludDMyIHNzcmMsIEdzdFBhZCAqIHBhZCwKKyAgICBQYWRUeXBlIHBhZHR5cGUpCit7CisgIHN0cnVjdCBGb3J3YXJkU3RpY2t5RXZlbnREYXRhIGZkYXRhOworICBHc3RQYWQgKnNpbmtwYWQgPSBOVUxMOworCisgIGlmIChwYWR0eXBlID09IFJUUF9QQUQpCisgICAgc2lua3BhZCA9IGRlbXV4LT5ydHBfc2luazsKKyAgZWxzZSBpZiAocGFkdHlwZSA9PSBSVENQX1BBRCkKKyAgICBzaW5rcGFkID0gZGVtdXgtPnJ0Y3Bfc2luazsKKyAgZWxzZQorICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworCisgIGZkYXRhLnNzcmMgPSBzc3JjOworICBmZGF0YS5wYWQgPSBwYWQ7CisKKyAgZ3N0X3BhZF9zdGlja3lfZXZlbnRzX2ZvcmVhY2ggKHNpbmtwYWQsIGZvcndhcmRfc3RpY2t5X2V2ZW50cywgJmZkYXRhKTsKK30KKworc3RhdGljIEdzdFBhZCAqCitmaW5kX29yX2NyZWF0ZV9kZW11eF9wYWRfZm9yX3NzcmMgKEdzdFJ0cFNzcmNEZW11eCAqIGRlbXV4LCBndWludDMyIHNzcmMsCisgICAgUGFkVHlwZSBwYWR0eXBlKQoreworICBHc3RQYWQgKnJ0cF9wYWQsICpydGNwX3BhZDsKKyAgR3N0RWxlbWVudENsYXNzICprbGFzczsKKyAgR3N0UGFkVGVtcGxhdGUgKnRlbXBsOworICBnY2hhciAqcGFkbmFtZTsKKyAgR3N0UnRwU3NyY0RlbXV4UGFkICpkZW11eHBhZDsKKyAgR3N0UGFkICpyZXRwYWQ7CisgIGd1bG9uZyBydHBfYmxvY2ssIHJ0Y3BfYmxvY2s7CisKKyAgR1NUX1BBRF9MT0NLIChkZW11eCk7CisKKyAgZGVtdXhwYWQgPSBmaW5kX2RlbXV4X3BhZF9mb3Jfc3NyYyAoZGVtdXgsIHNzcmMpOworICBpZiAoZGVtdXhwYWQgIT0gTlVMTCkgeworICAgIGdib29sZWFuIGZvcndhcmQgPSBGQUxTRTsKKworICAgIHN3aXRjaCAocGFkdHlwZSkgeworICAgICAgY2FzZSBSVFBfUEFEOgorICAgICAgICByZXRwYWQgPSBnc3Rfb2JqZWN0X3JlZiAoZGVtdXhwYWQtPnJ0cF9wYWQpOworICAgICAgICBpZiAoIWRlbXV4cGFkLT5wdXNoZWRfaW5pdGlhbF9ydHBfZXZlbnRzKSB7CisgICAgICAgICAgZm9yd2FyZCA9IFRSVUU7CisgICAgICAgICAgZGVtdXhwYWQtPnB1c2hlZF9pbml0aWFsX3J0cF9ldmVudHMgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSVENQX1BBRDoKKyAgICAgICAgcmV0cGFkID0gZ3N0X29iamVjdF9yZWYgKGRlbXV4cGFkLT5ydGNwX3BhZCk7CisgICAgICAgIGlmICghZGVtdXhwYWQtPnB1c2hlZF9pbml0aWFsX3J0Y3BfZXZlbnRzKSB7CisgICAgICAgICAgZm9yd2FyZCA9IFRSVUU7CisgICAgICAgICAgZGVtdXhwYWQtPnB1c2hlZF9pbml0aWFsX3J0Y3BfZXZlbnRzID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHBhZCA9IE5VTEw7CisgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgIH0KKworICAgIEdTVF9QQURfVU5MT0NLIChkZW11eCk7CisKKyAgICBpZiAoZm9yd2FyZCkKKyAgICAgIGZvcndhcmRfaW5pdGlhbF9ldmVudHMgKGRlbXV4LCBzc3JjLCByZXRwYWQsIHBhZHR5cGUpOworICAgIHJldHVybiByZXRwYWQ7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgImNyZWF0aW5nIG5ldyBwYWQgZm9yIFNTUkMgJTA4eCIsIHNzcmMpOworCisgIGtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChkZW11eCk7CisgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJzcmNfJXUiKTsKKyAgcGFkbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNyY18ldSIsIHNzcmMpOworICBydHBfcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAodGVtcGwsIHBhZG5hbWUpOworICBnX2ZyZWUgKHBhZG5hbWUpOworCisgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJydGNwX3NyY18ldSIpOworICBwYWRuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgicnRjcF9zcmNfJXUiLCBzc3JjKTsKKyAgcnRjcF9wYWQgPSBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlICh0ZW1wbCwgcGFkbmFtZSk7CisgIGdfZnJlZSAocGFkbmFtZSk7CisKKyAgLyogd3JhcCBpbiBzdHJ1Y3R1cmUgYW5kIGFkZCB0byBsaXN0ICovCisgIGRlbXV4cGFkID0gZ19uZXcwIChHc3RSdHBTc3JjRGVtdXhQYWQsIDEpOworICBkZW11eHBhZC0+c3NyYyA9IHNzcmM7CisgIGRlbXV4cGFkLT5ydHBfcGFkID0gcnRwX3BhZDsKKyAgZGVtdXhwYWQtPnJ0Y3BfcGFkID0gcnRjcF9wYWQ7CisKKyAgZ3N0X3BhZF9zZXRfZWxlbWVudF9wcml2YXRlIChydHBfcGFkLCBkZW11eHBhZCk7CisgIGdzdF9wYWRfc2V0X2VsZW1lbnRfcHJpdmF0ZSAocnRjcF9wYWQsIGRlbXV4cGFkKTsKKworICBkZW11eC0+c3JjcGFkcyA9IGdfc2xpc3RfcHJlcGVuZCAoZGVtdXgtPnNyY3BhZHMsIGRlbXV4cGFkKTsKKworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAocnRwX3BhZCwgZ3N0X3J0cF9zc3JjX2RlbXV4X3NyY19xdWVyeSk7CisgIGdzdF9wYWRfc2V0X2l0ZXJhdGVfaW50ZXJuYWxfbGlua3NfZnVuY3Rpb24gKHJ0cF9wYWQsCisgICAgICBnc3RfcnRwX3NzcmNfZGVtdXhfaXRlcmF0ZV9pbnRlcm5hbF9saW5rc19zcmMpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAocnRwX3BhZCwgZ3N0X3J0cF9zc3JjX2RlbXV4X3NyY19ldmVudCk7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKHJ0cF9wYWQpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cF9wYWQsIFRSVUUpOworCisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChydGNwX3BhZCwgZ3N0X3J0cF9zc3JjX2RlbXV4X3NyY19ldmVudCk7CisgIGdzdF9wYWRfc2V0X2l0ZXJhdGVfaW50ZXJuYWxfbGlua3NfZnVuY3Rpb24gKHJ0Y3BfcGFkLAorICAgICAgZ3N0X3J0cF9zc3JjX2RlbXV4X2l0ZXJhdGVfaW50ZXJuYWxfbGlua3Nfc3JjKTsKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAocnRjcF9wYWQpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0Y3BfcGFkLCBUUlVFKTsKKworICBpZiAocGFkdHlwZSA9PSBSVFBfUEFEKSB7CisgICAgZGVtdXhwYWQtPnB1c2hlZF9pbml0aWFsX3J0cF9ldmVudHMgPSBUUlVFOworICAgIGZvcndhcmRfaW5pdGlhbF9ldmVudHMgKGRlbXV4LCBzc3JjLCBydHBfcGFkLCBwYWR0eXBlKTsKKyAgfSBlbHNlIGlmIChwYWR0eXBlID09IFJUQ1BfUEFEKSB7CisgICAgZGVtdXhwYWQtPnB1c2hlZF9pbml0aWFsX3J0Y3BfZXZlbnRzID0gVFJVRTsKKyAgICBmb3J3YXJkX2luaXRpYWxfZXZlbnRzIChkZW11eCwgc3NyYywgcnRjcF9wYWQsIHBhZHR5cGUpOworICB9IGVsc2UgeworICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICB9CisKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCBydHBfcGFkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCBydGNwX3BhZCk7CisKKyAgc3dpdGNoIChwYWR0eXBlKSB7CisgICAgY2FzZSBSVFBfUEFEOgorICAgICAgcmV0cGFkID0gZ3N0X29iamVjdF9yZWYgKGRlbXV4cGFkLT5ydHBfcGFkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUlRDUF9QQUQ6CisgICAgICByZXRwYWQgPSBnc3Rfb2JqZWN0X3JlZiAoZGVtdXhwYWQtPnJ0Y3BfcGFkKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXRwYWQgPSBOVUxMOworICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgIH0KKworICBnc3Rfb2JqZWN0X3JlZiAocnRwX3BhZCk7CisgIGdzdF9vYmplY3RfcmVmIChydGNwX3BhZCk7CisKKyAgcnRwX2Jsb2NrID0gZ3N0X3BhZF9hZGRfcHJvYmUgKHJ0cF9wYWQsIEdTVF9QQURfUFJPQkVfVFlQRV9CTE9DS19ET1dOU1RSRUFNLAorICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisgIHJ0Y3BfYmxvY2sgPSBnc3RfcGFkX2FkZF9wcm9iZSAocnRjcF9wYWQsIEdTVF9QQURfUFJPQkVfVFlQRV9CTE9DS19ET1dOU1RSRUFNLAorICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgR1NUX1BBRF9VTkxPQ0sgKGRlbXV4KTsKKworICBnX3NpZ25hbF9lbWl0IChHX09CSkVDVCAoZGVtdXgpLAorICAgICAgZ3N0X3J0cF9zc3JjX2RlbXV4X3NpZ25hbHNbU0lHTkFMX05FV19TU1JDX1BBRF0sIDAsIHNzcmMsIHJ0cF9wYWQpOworCisgIGdzdF9wYWRfcmVtb3ZlX3Byb2JlIChydHBfcGFkLCBydHBfYmxvY2spOworICBnc3RfcGFkX3JlbW92ZV9wcm9iZSAocnRjcF9wYWQsIHJ0Y3BfYmxvY2spOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cF9wYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChydGNwX3BhZCk7CisKKyAgcmV0dXJuIHJldHBhZDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc3NyY19kZW11eF9jbGFzc19pbml0IChHc3RSdHBTc3JjRGVtdXhDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3Rfa2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9rbGFzczsKKyAgR3N0UnRwU3NyY0RlbXV4Q2xhc3MgKmdzdHJ0cHNzcmNkZW11eF9rbGFzczsKKworICBnb2JqZWN0X2tsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9rbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdHJ0cHNzcmNkZW11eF9rbGFzcyA9IChHc3RSdHBTc3JjRGVtdXhDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2tsYXNzLT5kaXNwb3NlID0gZ3N0X3J0cF9zc3JjX2RlbXV4X2Rpc3Bvc2U7CisgIGdvYmplY3Rfa2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0cF9zc3JjX2RlbXV4X2ZpbmFsaXplOworCisgIC8qKgorICAgKiBHc3RSdHBTc3JjRGVtdXg6Om5ldy1zc3JjLXBhZDoKKyAgICogQGRlbXV4OiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNzcmM6IHRoZSBTU1JDIG9mIHRoZSBwYWQKKyAgICogQHBhZDogdGhlIG5ldyBwYWQuCisgICAqCisgICAqIEVtaXRlZCB3aGVuIGEgbmV3IFNTUkMgcGFkIGhhcyBiZWVuIGNyZWF0ZWQuCisgICAqLworICBnc3RfcnRwX3NzcmNfZGVtdXhfc2lnbmFsc1tTSUdOQUxfTkVXX1NTUkNfUEFEXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJuZXctc3NyYy1wYWQiLAorICAgICAgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwgR19TSUdOQUxfUlVOX0xBU1QsCisgICAgICBHX1NUUlVDVF9PRkZTRVQgKEdzdFJ0cFNzcmNEZW11eENsYXNzLCBuZXdfc3NyY19wYWQpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdTVF9UWVBFX1BBRCk7CisKKyAgLyoqCisgICAqIEdzdFJ0cFNzcmNEZW11eDo6cmVtb3ZlZC1zc3JjLXBhZDoKKyAgICogQGRlbXV4OiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNzcmM6IHRoZSBTU1JDIG9mIHRoZSBwYWQKKyAgICogQHBhZDogdGhlIHJlbW92ZWQgcGFkLgorICAgKgorICAgKiBFbWl0ZWQgd2hlbiBhIFNTUkMgcGFkIGhhcyBiZWVuIHJlbW92ZWQuCisgICAqLworICBnc3RfcnRwX3NzcmNfZGVtdXhfc2lnbmFsc1tTSUdOQUxfUkVNT1ZFRF9TU1JDX1BBRF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgicmVtb3ZlZC1zc3JjLXBhZCIsCisgICAgICBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLCBHX1NJR05BTF9SVU5fTEFTVCwKKyAgICAgIEdfU1RSVUNUX09GRlNFVCAoR3N0UnRwU3NyY0RlbXV4Q2xhc3MsIHJlbW92ZWRfc3NyY19wYWQpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdTVF9UWVBFX1BBRCk7CisKKyAgLyoqCisgICAqIEdzdFJ0cFNzcmNEZW11eDo6Y2xlYXItc3NyYzoKKyAgICogQGRlbXV4OiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNzcmM6IHRoZSBTU1JDIG9mIHRoZSBwYWQKKyAgICoKKyAgICogQWN0aW9uIHNpZ25hbCB0byByZW1vdmUgdGhlIHBhZCBmb3IgU1NSQy4KKyAgICovCisgIGdzdF9ydHBfc3NyY19kZW11eF9zaWduYWxzW1NJR05BTF9DTEVBUl9TU1JDXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJjbGVhci1zc3JjIiwKKyAgICAgIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksIEdfU0lHTkFMX1JVTl9MQVNUIHwgR19TSUdOQUxfQUNUSU9OLAorICAgICAgR19TVFJVQ1RfT0ZGU0VUIChHc3RSdHBTc3JjRGVtdXhDbGFzcywgY2xlYXJfc3NyYyksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDEsIEdfVFlQRV9VSU5UKTsKKworICBnc3RlbGVtZW50X2tsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfc3NyY19kZW11eF9jaGFuZ2Vfc3RhdGUpOworICBnc3RydHBzc3JjZGVtdXhfa2xhc3MtPmNsZWFyX3NzcmMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfc3NyY19kZW11eF9jbGVhcl9zc3JjKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9rbGFzcywKKyAgICAgICZydHBfc3NyY19kZW11eF9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfa2xhc3MsCisgICAgICAmcnRwX3NzcmNfZGVtdXhfcnRjcF9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfa2xhc3MsCisgICAgICAmcnRwX3NzcmNfZGVtdXhfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfa2xhc3MsCisgICAgICAmcnRwX3NzcmNfZGVtdXhfcnRjcF9zcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfa2xhc3MsICJSVFAgU1NSQyBEZW11eCIsCisgICAgICAiRGVtdXgvTmV0d29yay9SVFAiLAorICAgICAgIlNwbGl0cyBSVFAgc3RyZWFtcyBiYXNlZCBvbiB0aGUgU1NSQyIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3J0cF9zc3JjX2RlbXV4X2RlYnVnLAorICAgICAgInJ0cHNzcmNkZW11eCIsIDAsICJSVFAgU1NSQyBkZW11eGVyIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3NzcmNfZGVtdXhfaW5pdCAoR3N0UnRwU3NyY0RlbXV4ICogZGVtdXgpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqa2xhc3MgPSBHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKGRlbXV4KTsKKworICBkZW11eC0+cnRwX3NpbmsgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAoZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsCisgICAgICAgICAgInNpbmsiKSwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKGRlbXV4LT5ydHBfc2luaywgZ3N0X3J0cF9zc3JjX2RlbXV4X2NoYWluKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKGRlbXV4LT5ydHBfc2luaywgZ3N0X3J0cF9zc3JjX2RlbXV4X3NpbmtfZXZlbnQpOworICBnc3RfcGFkX3NldF9pdGVyYXRlX2ludGVybmFsX2xpbmtzX2Z1bmN0aW9uIChkZW11eC0+cnRwX3NpbmssCisgICAgICBnc3RfcnRwX3NzcmNfZGVtdXhfaXRlcmF0ZV9pbnRlcm5hbF9saW5rc19zaW5rKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCBkZW11eC0+cnRwX3NpbmspOworCisgIGRlbXV4LT5ydGNwX3NpbmsgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAoZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsCisgICAgICAgICAgInJ0Y3Bfc2luayIpLCAicnRjcF9zaW5rIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChkZW11eC0+cnRjcF9zaW5rLCBnc3RfcnRwX3NzcmNfZGVtdXhfcnRjcF9jaGFpbik7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChkZW11eC0+cnRjcF9zaW5rLCBnc3RfcnRwX3NzcmNfZGVtdXhfc2lua19ldmVudCk7CisgIGdzdF9wYWRfc2V0X2l0ZXJhdGVfaW50ZXJuYWxfbGlua3NfZnVuY3Rpb24gKGRlbXV4LT5ydGNwX3NpbmssCisgICAgICBnc3RfcnRwX3NzcmNfZGVtdXhfaXRlcmF0ZV9pbnRlcm5hbF9saW5rc19zaW5rKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCBkZW11eC0+cnRjcF9zaW5rKTsKKworICBnX3JlY19tdXRleF9pbml0ICgmZGVtdXgtPnBhZGxvY2spOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zc3JjX2RlbXV4X3Jlc2V0IChHc3RSdHBTc3JjRGVtdXggKiBkZW11eCkKK3sKKyAgR1NMaXN0ICp3YWxrOworCisgIGZvciAod2FsayA9IGRlbXV4LT5zcmNwYWRzOyB3YWxrOyB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJ0cFNzcmNEZW11eFBhZCAqZHBhZCA9IChHc3RSdHBTc3JjRGVtdXhQYWQgKikgd2Fsay0+ZGF0YTsKKworICAgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoZHBhZC0+cnRwX3BhZCwgRkFMU0UpOworICAgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoZHBhZC0+cnRjcF9wYWQsIEZBTFNFKTsKKworICAgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSwgZHBhZC0+cnRwX3BhZCk7CisgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoZGVtdXgpLCBkcGFkLT5ydGNwX3BhZCk7CisgICAgZ19mcmVlIChkcGFkKTsKKyAgfQorICBnX3NsaXN0X2ZyZWUgKGRlbXV4LT5zcmNwYWRzKTsKKyAgZGVtdXgtPnNyY3BhZHMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9zc3JjX2RlbXV4X2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cFNzcmNEZW11eCAqZGVtdXg7CisKKyAgZGVtdXggPSBHU1RfUlRQX1NTUkNfREVNVVggKG9iamVjdCk7CisKKyAgZ3N0X3J0cF9zc3JjX2RlbXV4X3Jlc2V0IChkZW11eCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRwX3NzcmNfZGVtdXhfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJ0cFNzcmNEZW11eCAqZGVtdXg7CisKKyAgZGVtdXggPSBHU1RfUlRQX1NTUkNfREVNVVggKG9iamVjdCk7CisgIGdfcmVjX211dGV4X2NsZWFyICgmZGVtdXgtPnBhZGxvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfc3NyY19kZW11eF9jbGVhcl9zc3JjIChHc3RSdHBTc3JjRGVtdXggKiBkZW11eCwgZ3VpbnQzMiBzc3JjKQoreworICBHc3RSdHBTc3JjRGVtdXhQYWQgKmRwYWQ7CisKKyAgR1NUX1BBRF9MT0NLIChkZW11eCk7CisgIGRwYWQgPSBmaW5kX2RlbXV4X3BhZF9mb3Jfc3NyYyAoZGVtdXgsIHNzcmMpOworICBpZiAoZHBhZCA9PSBOVUxMKSB7CisgICAgR1NUX1BBRF9VTkxPQ0sgKGRlbXV4KTsKKyAgICBnb3RvIHVua25vd25fcGFkOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJjbGVhcmluZyBwYWQgZm9yIFNTUkMgJTA4eCIsIHNzcmMpOworCisgIGRlbXV4LT5zcmNwYWRzID0gZ19zbGlzdF9yZW1vdmUgKGRlbXV4LT5zcmNwYWRzLCBkcGFkKTsKKyAgR1NUX1BBRF9VTkxPQ0sgKGRlbXV4KTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKGRwYWQtPnJ0cF9wYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChkcGFkLT5ydGNwX3BhZCwgRkFMU0UpOworCisgIGdfc2lnbmFsX2VtaXQgKEdfT0JKRUNUIChkZW11eCksCisgICAgICBnc3RfcnRwX3NzcmNfZGVtdXhfc2lnbmFsc1tTSUdOQUxfUkVNT1ZFRF9TU1JDX1BBRF0sIDAsIHNzcmMsCisgICAgICBkcGFkLT5ydHBfcGFkKTsKKworICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChkZW11eCksIGRwYWQtPnJ0cF9wYWQpOworICBnc3RfZWxlbWVudF9yZW1vdmVfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChkZW11eCksIGRwYWQtPnJ0Y3BfcGFkKTsKKworICBnX2ZyZWUgKGRwYWQpOworCisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK3Vua25vd25fcGFkOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChkZW11eCwgInVua25vd24gU1NSQyAlMDh4Iiwgc3NyYyk7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0cnVjdCBGb3J3YXJkRXZlbnREYXRhCit7CisgIEdzdFJ0cFNzcmNEZW11eCAqZGVtdXg7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RQYWQgKnBhZDsKK307CisKK3N0YXRpYyBnYm9vbGVhbgorZm9yd2FyZF9ldmVudCAoR3N0UGFkICogcGFkLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIHN0cnVjdCBGb3J3YXJkRXZlbnREYXRhICpmZGF0YSA9IHVzZXJfZGF0YTsKKyAgR1NMaXN0ICp3YWxrID0gTlVMTDsKKyAgR3N0RXZlbnQgKm5ld2V2ZW50ID0gTlVMTDsKKworICBHU1RfUEFEX0xPQ0sgKGZkYXRhLT5kZW11eCk7CisgIGZvciAod2FsayA9IGZkYXRhLT5kZW11eC0+c3JjcGFkczsgd2Fsazsgd2FsayA9IHdhbGstPm5leHQpIHsKKyAgICBHc3RSdHBTc3JjRGVtdXhQYWQgKmRwYWQgPSAoR3N0UnRwU3NyY0RlbXV4UGFkICopIHdhbGstPmRhdGE7CisKKyAgICAvKiBPbmx5IGZvcndhcmQgdGhlIGV2ZW50IGlmIHRoZSBpbml0aWFsIGV2ZW50cyBoYXZlIGJlZW4gdGhyb3VnaCBmaXJzdCwKKyAgICAgKiB0aGUgaW5pdGlhbCBldmVudHMgc2hvdWxkIGJlIGZvcndhcmRlZCBiZWZvcmUgYW55IG90aGVyIGV2ZW50CisgICAgICogb3IgYnVmZmVyIGlzIHB1c2hlZCAqLworICAgIGlmICgocGFkID09IGRwYWQtPnJ0cF9wYWQgJiYgZHBhZC0+cHVzaGVkX2luaXRpYWxfcnRwX2V2ZW50cykgfHwKKyAgICAgICAgKHBhZCA9PSBkcGFkLT5ydGNwX3BhZCAmJiBkcGFkLT5wdXNoZWRfaW5pdGlhbF9ydGNwX2V2ZW50cykpIHsKKyAgICAgIG5ld2V2ZW50ID0gYWRkX3NzcmNfYW5kX3JlZiAoZmRhdGEtPmV2ZW50LCBkcGFkLT5zc3JjKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBHU1RfUEFEX1VOTE9DSyAoZmRhdGEtPmRlbXV4KTsKKworICBpZiAobmV3ZXZlbnQpCisgICAgZmRhdGEtPnJlcyAmPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHBhZCwgbmV3ZXZlbnQpOworCisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9zc3JjX2RlbXV4X3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFJ0cFNzcmNEZW11eCAqZGVtdXg7CisgIHN0cnVjdCBGb3J3YXJkRXZlbnREYXRhIGZkYXRhOworCisgIGRlbXV4ID0gR1NUX1JUUF9TU1JDX0RFTVVYIChwYXJlbnQpOworCisgIGZkYXRhLmRlbXV4ID0gZGVtdXg7CisgIGZkYXRhLnBhZCA9IHBhZDsKKyAgZmRhdGEuZXZlbnQgPSBldmVudDsKKyAgZmRhdGEucmVzID0gVFJVRTsKKworICBnc3RfcGFkX2ZvcndhcmQgKHBhZCwgZm9yd2FyZF9ldmVudCwgJmZkYXRhKTsKKworICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKworICByZXR1cm4gZmRhdGEucmVzOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9zc3JjX2RlbXV4X2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0UnRwU3NyY0RlbXV4ICpkZW11eDsKKyAgZ3VpbnQzMiBzc3JjOworICBHc3RSVFBCdWZmZXIgcnRwID0geyBOVUxMIH07CisgIEdzdFBhZCAqc3JjcGFkOworICBHc3RSdHBTc3JjRGVtdXhQYWQgKmRwYWQ7CisKKyAgZGVtdXggPSBHU1RfUlRQX1NTUkNfREVNVVggKHBhcmVudCk7CisKKyAgaWYgKCFnc3RfcnRwX2J1ZmZlcl9tYXAgKGJ1ZiwgR1NUX01BUF9SRUFELCAmcnRwKSkKKyAgICBnb3RvIGludmFsaWRfcGF5bG9hZDsKKworICBzc3JjID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3NzcmMgKCZydHApOworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJyZWNlaXZlZCBidWZmZXIgb2YgU1NSQyAlMDh4Iiwgc3NyYyk7CisKKyAgc3JjcGFkID0gZmluZF9vcl9jcmVhdGVfZGVtdXhfcGFkX2Zvcl9zc3JjIChkZW11eCwgc3NyYywgUlRQX1BBRCk7CisgIGlmIChzcmNwYWQgPT0gTlVMTCkKKyAgICBnb3RvIGNyZWF0ZV9mYWlsZWQ7CisKKyAgLyogcHVzaCB0byBzcmNwYWQgKi8KKyAgcmV0ID0gZ3N0X3BhZF9wdXNoIChzcmNwYWQsIGJ1Zik7CisKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgIC8qIGNoZWNrIGlmIHRoZSBzc3JjIHN0aWxsIHRoZXJlLCBtYXkgaGF2ZSBiZWVuIHJlbW92ZWQgKi8KKyAgICBHU1RfUEFEX0xPQ0sgKGRlbXV4KTsKKyAgICBkcGFkID0gZmluZF9kZW11eF9wYWRfZm9yX3NzcmMgKGRlbXV4LCBzc3JjKTsKKyAgICBpZiAoZHBhZCA9PSBOVUxMIHx8IGRwYWQtPnJ0cF9wYWQgIT0gc3JjcGFkKSB7CisgICAgICAvKiBTU1JDIHdhcyByZW1vdmVkIGR1cmluZyB0aGUgcHVzaCAuLi4gaWdub3JlIHRoZSBlcnJvciAqLworICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgfQorICAgIEdTVF9QQURfVU5MT0NLIChkZW11eCk7CisgIH0KKworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX3BheWxvYWQ6CisgIHsKKyAgICAvKiB0aGlzIGlzIGZhdGFsIGFuZCBzaG91bGQgYmUgZmlsdGVyZWQgZWFybGllciAqLworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkZW11eCwgU1RSRUFNLCBERUNPREUsIChOVUxMKSwKKyAgICAgICAgKCJEcm9wcGluZyBpbnZhbGlkIFJUUCBwYXlsb2FkIikpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CitjcmVhdGVfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlbXV4LCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgbmV3IHBhZCIpKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0cF9zc3JjX2RlbXV4X3J0Y3BfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdFJ0cFNzcmNEZW11eCAqZGVtdXg7CisgIGd1aW50MzIgc3NyYzsKKyAgR3N0UlRDUFBhY2tldCBwYWNrZXQ7CisgIEdzdFJUQ1BCdWZmZXIgcnRjcCA9IHsgTlVMTCwgfTsKKyAgR3N0UGFkICpzcmNwYWQ7CisgIEdzdFJ0cFNzcmNEZW11eFBhZCAqZHBhZDsKKworICBkZW11eCA9IEdTVF9SVFBfU1NSQ19ERU1VWCAocGFyZW50KTsKKworICBpZiAoIWdzdF9ydGNwX2J1ZmZlcl92YWxpZGF0ZV9yZWR1Y2VkIChidWYpKQorICAgIGdvdG8gaW52YWxpZF9ydGNwOworCisgIGdzdF9ydGNwX2J1ZmZlcl9tYXAgKGJ1ZiwgR1NUX01BUF9SRUFELCAmcnRjcCk7CisgIGlmICghZ3N0X3J0Y3BfYnVmZmVyX2dldF9maXJzdF9wYWNrZXQgKCZydGNwLCAmcGFja2V0KSkgeworICAgIGdzdF9ydGNwX2J1ZmZlcl91bm1hcCAoJnJ0Y3ApOworICAgIGdvdG8gaW52YWxpZF9ydGNwOworICB9CisKKyAgLyogZmlyc3QgcGFja2V0IG11c3QgYmUgU1Igb3IgUlIsIG9yIGluIGNhc2Ugb2YgYSByZWR1Y2VkIHNpemUgUlRDUCBwYWNrZXQKKyAgICogaXQgbXVzdCBiZSBBUFAsIFJUUEZCIG9yIFBTRkIgZmVlYWRiYWNrLCBvciBlbHNlIHRoZSB2YWxpZGF0ZSB3b3VsZAorICAgKiBoYXZlIGZhaWxlZCAqLworICBzd2l0Y2ggKGdzdF9ydGNwX3BhY2tldF9nZXRfdHlwZSAoJnBhY2tldCkpIHsKKyAgICBjYXNlIEdTVF9SVENQX1RZUEVfU1I6CisgICAgICAvKiBnZXQgdGhlIHNzcmMgc28gdGhhdCB3ZSBjYW4gcm91dGUgaXQgdG8gdGhlIHJpZ2h0IHNvdXJjZSBwYWQgKi8KKyAgICAgIGdzdF9ydGNwX3BhY2tldF9zcl9nZXRfc2VuZGVyX2luZm8gKCZwYWNrZXQsICZzc3JjLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUlRDUF9UWVBFX1JSOgorICAgICAgc3NyYyA9IGdzdF9ydGNwX3BhY2tldF9ycl9nZXRfc3NyYyAoJnBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9SVENQX1RZUEVfQVBQOgorICAgIGNhc2UgR1NUX1JUQ1BfVFlQRV9SVFBGQjoKKyAgICBjYXNlIEdTVF9SVENQX1RZUEVfUFNGQjoKKyAgICAgIHNzcmMgPSBnc3RfcnRjcF9wYWNrZXRfZmJfZ2V0X3NlbmRlcl9zc3JjICgmcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIHVuZXhwZWN0ZWRfcnRjcDsKKyAgfQorICBnc3RfcnRjcF9idWZmZXJfdW5tYXAgKCZydGNwKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChkZW11eCwgInJlY2VpdmVkIFJUQ1Agb2YgU1NSQyAlMDh4Iiwgc3NyYyk7CisKKyAgc3JjcGFkID0gZmluZF9vcl9jcmVhdGVfZGVtdXhfcGFkX2Zvcl9zc3JjIChkZW11eCwgc3NyYywgUlRDUF9QQUQpOworICBpZiAoc3JjcGFkID09IE5VTEwpCisgICAgZ290byBjcmVhdGVfZmFpbGVkOworCisgIC8qIHB1c2ggdG8gc3JjcGFkICovCisgIHJldCA9IGdzdF9wYWRfcHVzaCAoc3JjcGFkLCBidWYpOworCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAvKiBjaGVjayBpZiB0aGUgc3NyYyBzdGlsbCB0aGVyZSwgbWF5IGhhdmUgYmVlbiByZW1vdmVkICovCisgICAgR1NUX1BBRF9MT0NLIChkZW11eCk7CisgICAgZHBhZCA9IGZpbmRfZGVtdXhfcGFkX2Zvcl9zc3JjIChkZW11eCwgc3NyYyk7CisgICAgaWYgKGRwYWQgPT0gTlVMTCB8fCBkcGFkLT5ydGNwX3BhZCAhPSBzcmNwYWQpIHsKKyAgICAgIC8qIFNTUkMgd2FzIHJlbW92ZWQgZHVyaW5nIHRoZSBwdXNoIC4uLiBpZ25vcmUgdGhlIGVycm9yICovCisgICAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICB9CisgICAgR1NUX1BBRF9VTkxPQ0sgKGRlbXV4KTsKKyAgfQorCisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfcnRjcDoKKyAgeworICAgIC8qIHRoaXMgaXMgZmF0YWwgYW5kIHNob3VsZCBiZSBmaWx0ZXJlZCBlYXJsaWVyICovCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlbXV4LCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAoIkRyb3BwaW5nIGludmFsaWQgUlRDUCBwYWNrZXQiKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3VuZXhwZWN0ZWRfcnRjcDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRlbXV4LCAiZHJvcHBpbmcgdW5leHBlY3RlZCBSVENQIHBhY2tldCIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CitjcmVhdGVfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRlbXV4LCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgbmV3IHBhZCIpKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgR3N0UnRwU3NyY0RlbXV4UGFkICoKK2ZpbmRfZGVtdXhfcGFkX2Zvcl9wYWQgKEdzdFJ0cFNzcmNEZW11eCAqIGRlbXV4LCBHc3RQYWQgKiBwYWQpCit7CisgIEdTTGlzdCAqd2FsazsKKworICBmb3IgKHdhbGsgPSBkZW11eC0+c3JjcGFkczsgd2Fsazsgd2FsayA9IGdfc2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RSdHBTc3JjRGVtdXhQYWQgKmRwYWQgPSAoR3N0UnRwU3NyY0RlbXV4UGFkICopIHdhbGstPmRhdGE7CisgICAgaWYgKGRwYWQtPnJ0cF9wYWQgPT0gcGFkIHx8IGRwYWQtPnJ0Y3BfcGFkID09IHBhZCkgeworICAgICAgcmV0dXJuIGRwYWQ7CisgICAgfQorICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfcnRwX3NzcmNfZGVtdXhfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RSdHBTc3JjRGVtdXggKmRlbXV4OworICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgZGVtdXggPSBHU1RfUlRQX1NTUkNfREVNVVggKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNOgorICAgIGNhc2UgR1NUX0VWRU5UX0NVU1RPTV9CT1RIOgorICAgIGNhc2UgR1NUX0VWRU5UX0NVU1RPTV9CT1RIX09PQjoKKyAgICAgIHMgPSBnc3RfZXZlbnRfZ2V0X3N0cnVjdHVyZSAoZXZlbnQpOworICAgICAgaWYgKHMgJiYgIWdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAic3NyYyIpKSB7CisgICAgICAgIEdzdFJ0cFNzcmNEZW11eFBhZCAqZHBhZCA9IGZpbmRfZGVtdXhfcGFkX2Zvcl9wYWQgKGRlbXV4LCBwYWQpOworCisgICAgICAgIGlmIChkcGFkKSB7CisgICAgICAgICAgR3N0U3RydWN0dXJlICp3czsKKworICAgICAgICAgIGV2ZW50ID0gZ3N0X2V2ZW50X21ha2Vfd3JpdGFibGUgKGV2ZW50KTsKKyAgICAgICAgICB3cyA9IGdzdF9ldmVudF93cml0YWJsZV9zdHJ1Y3R1cmUgKGV2ZW50KTsKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAod3MsICJzc3JjIiwgR19UWVBFX1VJTlQsIGRwYWQtPnNzcmMsIE5VTEwpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworfQorCitzdGF0aWMgR3N0SXRlcmF0b3IgKgorZ3N0X3J0cF9zc3JjX2RlbXV4X2l0ZXJhdGVfaW50ZXJuYWxfbGlua3Nfc3JjIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCkKK3sKKyAgR3N0UnRwU3NyY0RlbXV4ICpkZW11eDsKKyAgR3N0UGFkICpvdGhlcnBhZCA9IE5VTEw7CisgIEdzdEl0ZXJhdG9yICppdCA9IE5VTEw7CisgIEdTTGlzdCAqY3VycmVudDsKKworICBkZW11eCA9IEdTVF9SVFBfU1NSQ19ERU1VWCAocGFyZW50KTsKKworICBHU1RfUEFEX0xPQ0sgKGRlbXV4KTsKKyAgZm9yIChjdXJyZW50ID0gZGVtdXgtPnNyY3BhZHM7IGN1cnJlbnQ7IGN1cnJlbnQgPSBnX3NsaXN0X25leHQgKGN1cnJlbnQpKSB7CisgICAgR3N0UnRwU3NyY0RlbXV4UGFkICpkcGFkID0gKEdzdFJ0cFNzcmNEZW11eFBhZCAqKSBjdXJyZW50LT5kYXRhOworCisgICAgaWYgKHBhZCA9PSBkcGFkLT5ydHBfcGFkKSB7CisgICAgICBvdGhlcnBhZCA9IGRlbXV4LT5ydHBfc2luazsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZiAocGFkID09IGRwYWQtPnJ0Y3BfcGFkKSB7CisgICAgICBvdGhlcnBhZCA9IGRlbXV4LT5ydGNwX3Npbms7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKG90aGVycGFkKSB7CisgICAgR1ZhbHVlIHZhbCA9IHsgMCwgfTsKKworICAgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR1NUX1RZUEVfUEFEKTsKKyAgICBnX3ZhbHVlX3NldF9vYmplY3QgKCZ2YWwsIG90aGVycGFkKTsKKyAgICBpdCA9IGdzdF9pdGVyYXRvcl9uZXdfc2luZ2xlIChHU1RfVFlQRV9QQUQsICZ2YWwpOworICAgIGdfdmFsdWVfdW5zZXQgKCZ2YWwpOworCisgIH0KKyAgR1NUX1BBRF9VTkxPQ0sgKGRlbXV4KTsKKworICByZXR1cm4gaXQ7Cit9CisKKy8qIFNob3VsZCByZXR1cm4gMCBmb3IgZWxlbWVudHMgdG8gYmUgaW5jbHVkZWQgKi8KK3N0YXRpYyBnaW50CitzcmNfcGFkX2NvbXBhcmVfZnVuYyAoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpCit7CisgIEdzdFBhZCAqcGFkID0gR1NUX1BBRCAoZ192YWx1ZV9nZXRfb2JqZWN0IChhKSk7CisgIGNvbnN0IGdjaGFyICpwcmVmaXggPSBnX3ZhbHVlX2dldF9zdHJpbmcgKGIpOworICBnaW50IHJlczsKKworICAvKiAwIG1lYW5zIGVxdWFsIG1lYW5zIHdlIGFjY2VwdCB0aGUgcGFkLCBhY2NlcHRlZCBpZiB0aGVyZSBpcyBhIG5hbWUKKyAgICogYW5kIGl0IHN0YXJ0cyB3aXRoIHRoZSBwcmVmaXggKi8KKyAgR1NUX09CSkVDVF9MT0NLIChwYWQpOworICByZXMgPSAhR1NUX1BBRF9OQU1FIChwYWQpIHx8ICFnX3N0cl9oYXNfcHJlZml4IChHU1RfUEFEX05BTUUgKHBhZCksIHByZWZpeCk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChwYWQpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RJdGVyYXRvciAqCitnc3RfcnRwX3NzcmNfZGVtdXhfaXRlcmF0ZV9pbnRlcm5hbF9saW5rc19zaW5rIChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50KQoreworICBHc3RSdHBTc3JjRGVtdXggKmRlbXV4OworICBHc3RJdGVyYXRvciAqaXQgPSBOVUxMOworICBHVmFsdWUgZ3ZhbCA9IHsgMCwgfTsKKworICBkZW11eCA9IEdTVF9SVFBfU1NSQ19ERU1VWCAocGFyZW50KTsKKworICBnX3ZhbHVlX2luaXQgKCZndmFsLCBHX1RZUEVfU1RSSU5HKTsKKyAgaWYgKHBhZCA9PSBkZW11eC0+cnRwX3NpbmspCisgICAgZ192YWx1ZV9zZXRfc3RhdGljX3N0cmluZyAoJmd2YWwsICJzcmNfIik7CisgIGVsc2UgaWYgKHBhZCA9PSBkZW11eC0+cnRjcF9zaW5rKQorICAgIGdfdmFsdWVfc2V0X3N0YXRpY19zdHJpbmcgKCZndmFsLCAicnRjcF9zcmNfIik7CisgIGVsc2UKKyAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKworICBpdCA9IGdzdF9lbGVtZW50X2l0ZXJhdGVfc3JjX3BhZHMgKEdTVF9FTEVNRU5UX0NBU1QgKGRlbXV4KSk7CisgIGl0ID0gZ3N0X2l0ZXJhdG9yX2ZpbHRlciAoaXQsIHNyY19wYWRfY29tcGFyZV9mdW5jLCAmZ3ZhbCk7CisKKyAgcmV0dXJuIGl0OworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9zc3JjX2RlbXV4X3NyY19xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0UnRwU3NyY0RlbXV4ICpkZW11eDsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgZGVtdXggPSBHU1RfUlRQX1NTUkNfREVNVVggKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfTEFURU5DWToKKyAgICB7CisKKyAgICAgIGlmICgocmVzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5IChkZW11eC0+cnRwX3NpbmssIHF1ZXJ5KSkpIHsKKyAgICAgICAgZ2Jvb2xlYW4gbGl2ZTsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIG1pbl9sYXRlbmN5LCBtYXhfbGF0ZW5jeTsKKyAgICAgICAgR3N0UnRwU3NyY0RlbXV4UGFkICpkZW11eHBhZDsKKworICAgICAgICBkZW11eHBhZCA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKworICAgICAgICBnc3RfcXVlcnlfcGFyc2VfbGF0ZW5jeSAocXVlcnksICZsaXZlLCAmbWluX2xhdGVuY3ksICZtYXhfbGF0ZW5jeSk7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJwZWVyIG1pbiBsYXRlbmN5ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKG1pbl9sYXRlbmN5KSk7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZGVtdXgsICJsYXRlbmN5IGZvciBTU1JDICUwOHgiLCBkZW11eHBhZC0+c3NyYyk7CisKKyAgICAgICAgZ3N0X3F1ZXJ5X3NldF9sYXRlbmN5IChxdWVyeSwgbGl2ZSwgbWluX2xhdGVuY3ksIG1heF9sYXRlbmN5KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9ydHBfc3NyY19kZW11eF9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0UnRwU3NyY0RlbXV4ICpkZW11eDsKKworICBkZW11eCA9IEdTVF9SVFBfU1NSQ19ERU1VWCAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF9ydHBfc3NyY19kZW11eF9yZXNldCAoZGVtdXgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguaCBiL2dzdC9ydHBtYW5hZ2VyL2dzdHJ0cHNzcmNkZW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZGY0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9nc3RydHBzc3JjZGVtdXguaApAQCAtMCwwICsxLDYwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFBfU1NSQ19ERU1VWF9IX18KKyNkZWZpbmUgX19HU1RfUlRQX1NTUkNfREVNVVhfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRQX1NTUkNfREVNVVggICAgICAgICAgICAoZ3N0X3J0cF9zc3JjX2RlbXV4X2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFBfU1NSQ19ERU1VWChvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1JUUF9TU1JDX0RFTVVYLEdzdFJ0cFNzcmNEZW11eCkpCisjZGVmaW5lIEdTVF9SVFBfU1NSQ19ERU1VWF9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX1NTUkNfREVNVVgsR3N0UnRwU3NyY0RlbXV4Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRQX1NTUkNfREVNVVgob2JqKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfU1NSQ19ERU1VWCkpCisjZGVmaW5lIEdTVF9JU19SVFBfU1NSQ19ERU1VWF9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfUlRQX1NTUkNfREVNVVgpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwU3NyY0RlbXV4IEdzdFJ0cFNzcmNEZW11eDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBTc3JjRGVtdXhDbGFzcyBHc3RSdHBTc3JjRGVtdXhDbGFzczsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSdHBTc3JjRGVtdXhQYWQgR3N0UnRwU3NyY0RlbXV4UGFkOworCitzdHJ1Y3QgX0dzdFJ0cFNzcmNEZW11eAoreworICBHc3RFbGVtZW50IHBhcmVudDsKKworICBHc3RQYWQgKnJ0cF9zaW5rOworICBHc3RQYWQgKnJ0Y3Bfc2luazsKKworICBHUmVjTXV0ZXggcGFkbG9jazsKKyAgR1NMaXN0ICpzcmNwYWRzOworfTsKKworc3RydWN0IF9Hc3RSdHBTc3JjRGVtdXhDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworCisgIC8qIHNpZ25hbHMgKi8KKyAgdm9pZCAoKm5ld19zc3JjX3BhZCkgICAgIChHc3RSdHBTc3JjRGVtdXggKmRlbXV4LCBndWludDMyIHNzcmMsIEdzdFBhZCAqcGFkKTsKKyAgdm9pZCAoKnJlbW92ZWRfc3NyY19wYWQpIChHc3RSdHBTc3JjRGVtdXggKmRlbXV4LCBndWludDMyIHNzcmMsIEdzdFBhZCAqcGFkKTsKKworICAvKiBhY3Rpb25zICovCisgIHZvaWQgKCpjbGVhcl9zc3JjKSAgICAgICAoR3N0UnRwU3NyY0RlbXV4ICpkZW11eCwgZ3VpbnQzMiBzc3JjKTsKK307CisKK0dUeXBlIGdzdF9ydHBfc3NyY19kZW11eF9nZXRfdHlwZSAodm9pZCk7CisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfU1NSQ19ERU1VWF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHBtYW5hZ2VyL21lc29uLmJ1aWxkIGIvZ3N0L3J0cG1hbmFnZXIvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1NmYzNwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMjYgQEAKK3J0cG1hbmFnZXJfc291cmNlcyA9IFsKKyAgJ2dzdHJ0cG1hbmFnZXIuYycsCisgICdnc3RydHBiaW4uYycsCisgICdnc3RydHBkdG1mbXV4LmMnLAorICAnZ3N0cnRwaml0dGVyYnVmZmVyLmMnLAorICAnZ3N0cnRwbXV4LmMnLAorICAnZ3N0cnRwcHRkZW11eC5jJywKKyAgJ2dzdHJ0cHJ0eHF1ZXVlLmMnLAorICAnZ3N0cnRwcnR4cmVjZWl2ZS5jJywKKyAgJ2dzdHJ0cHJ0eHNlbmQuYycsCisgICdnc3RydHBzc3JjZGVtdXguYycsCisgICdydHBqaXR0ZXJidWZmZXIuYycsCisgICdydHBzZXNzaW9uLmMnLAorICAncnRwc291cmNlLmMnLAorICAncnRwc3RhdHMuYycsCisgICdnc3RydHBzZXNzaW9uLmMnLAorXQorCitnc3RydHBtYW5hZ2VyID0gbGlicmFyeSgnZ3N0cnRwbWFuYWdlcicsCisgIHJ0cG1hbmFnZXJfc291cmNlcywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0bmV0X2RlcCwgZ3N0cnRwX2RlcCwgZ2lvX2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYyBiL2dzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMTg3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuYwpAQCAtMCwwICsxLDEyOTcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0Y3BidWZmZXIuaD4KKworI2luY2x1ZGUgInJ0cGppdHRlcmJ1ZmZlci5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHBfaml0dGVyX2J1ZmZlcl9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBydHBfaml0dGVyX2J1ZmZlcl9kZWJ1ZworCisjZGVmaW5lIE1BWF9XSU5ET1cJUlRQX0pJVFRFUl9CVUZGRVJfTUFYX1dJTkRPVworI2RlZmluZSBNQVhfVElNRQkoMiAqIEdTVF9TRUNPTkQpCisKKy8qIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgUFJPUF8wCit9OworCisvKiBHT2JqZWN0IHZtZXRob2RzICovCitzdGF0aWMgdm9pZCBydHBfaml0dGVyX2J1ZmZlcl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK0dUeXBlCitydHBfaml0dGVyX2J1ZmZlcl9tb2RlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgaml0dGVyX2J1ZmZlcl9tb2RlX3R5cGUgPSAwOworICBzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSBqaXR0ZXJfYnVmZmVyX21vZGVzW10gPSB7CisgICAge1JUUF9KSVRURVJfQlVGRkVSX01PREVfTk9ORSwgIk9ubHkgdXNlIFJUUCB0aW1lc3RhbXBzIiwgIm5vbmUifSwKKyAgICB7UlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9TTEFWRSwgIlNsYXZlIHJlY2VpdmVyIHRvIHNlbmRlciBjbG9jayIsICJzbGF2ZSJ9LAorICAgIHtSVFBfSklUVEVSX0JVRkZFUl9NT0RFX0JVRkZFUiwgIkRvIGxvdy9oaWdoIHdhdGVybWFyayBidWZmZXJpbmciLAorICAgICAgICAiYnVmZmVyIn0sCisgICAge1JUUF9KSVRURVJfQlVGRkVSX01PREVfU1lOQ0VELCAiU3luY2hyb25pemVkIHNlbmRlciBhbmQgcmVjZWl2ZXIgY2xvY2tzIiwKKyAgICAgICAgInN5bmNlZCJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIWppdHRlcl9idWZmZXJfbW9kZV90eXBlKSB7CisgICAgaml0dGVyX2J1ZmZlcl9tb2RlX3R5cGUgPQorICAgICAgICBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiUlRQSml0dGVyQnVmZmVyTW9kZSIsIGppdHRlcl9idWZmZXJfbW9kZXMpOworICB9CisgIHJldHVybiBqaXR0ZXJfYnVmZmVyX21vZGVfdHlwZTsKK30KKworLyogc3RhdGljIGd1aW50IHJ0cF9qaXR0ZXJfYnVmZmVyX3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07ICovCisKK0dfREVGSU5FX1RZUEUgKFJUUEppdHRlckJ1ZmZlciwgcnRwX2ppdHRlcl9idWZmZXIsIEdfVFlQRV9PQkpFQ1QpOworCitzdGF0aWMgdm9pZAorcnRwX2ppdHRlcl9idWZmZXJfY2xhc3NfaW5pdCAoUlRQSml0dGVyQnVmZmVyQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gcnRwX2ppdHRlcl9idWZmZXJfZmluYWxpemU7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cF9qaXR0ZXJfYnVmZmVyX2RlYnVnLCAicnRwaml0dGVyYnVmZmVyIiwgMCwKKyAgICAgICJSVFAgSml0dGVyIEJ1ZmZlciIpOworfQorCitzdGF0aWMgdm9pZAorcnRwX2ppdHRlcl9idWZmZXJfaW5pdCAoUlRQSml0dGVyQnVmZmVyICogamJ1ZikKK3sKKyAgZ19tdXRleF9pbml0ICgmamJ1Zi0+Y2xvY2tfbG9jayk7CisKKyAgamJ1Zi0+cGFja2V0cyA9IGdfcXVldWVfbmV3ICgpOworICBqYnVmLT5tb2RlID0gUlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9TTEFWRTsKKworICBydHBfaml0dGVyX2J1ZmZlcl9yZXNldF9za2V3IChqYnVmKTsKK30KKworc3RhdGljIHZvaWQKK3J0cF9qaXR0ZXJfYnVmZmVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBSVFBKaXR0ZXJCdWZmZXIgKmpidWY7CisKKyAgamJ1ZiA9IFJUUF9KSVRURVJfQlVGRkVSX0NBU1QgKG9iamVjdCk7CisKKyAgaWYgKGpidWYtPm1lZGlhX2Nsb2NrX3N5bmNlZF9pZCkKKyAgICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QgKGpidWYtPm1lZGlhX2Nsb2NrLAorICAgICAgICBqYnVmLT5tZWRpYV9jbG9ja19zeW5jZWRfaWQpOworICBpZiAoamJ1Zi0+bWVkaWFfY2xvY2spCisgICAgZ3N0X29iamVjdF91bnJlZiAoamJ1Zi0+bWVkaWFfY2xvY2spOworCisgIGlmIChqYnVmLT5waXBlbGluZV9jbG9jaykKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChqYnVmLT5waXBlbGluZV9jbG9jayk7CisKKyAgZ19xdWV1ZV9mcmVlIChqYnVmLT5wYWNrZXRzKTsKKworICBnX211dGV4X2NsZWFyICgmamJ1Zi0+Y2xvY2tfbG9jayk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHJ0cF9qaXR0ZXJfYnVmZmVyX3BhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCisvKioKKyAqIHJ0cF9qaXR0ZXJfYnVmZmVyX25ldzoKKyAqCisgKiBDcmVhdGUgYW4gI1JUUEppdHRlckJ1ZmZlci4KKyAqCisgKiBSZXR1cm5zOiBhIG5ldyAjUlRQSml0dGVyQnVmZmVyLiBVc2UgZ19vYmplY3RfdW5yZWYoKSBhZnRlciB1c2FnZS4KKyAqLworUlRQSml0dGVyQnVmZmVyICoKK3J0cF9qaXR0ZXJfYnVmZmVyX25ldyAodm9pZCkKK3sKKyAgUlRQSml0dGVyQnVmZmVyICpqYnVmOworCisgIGpidWYgPSBnX29iamVjdF9uZXcgKFJUUF9UWVBFX0pJVFRFUl9CVUZGRVIsIE5VTEwpOworCisgIHJldHVybiBqYnVmOworfQorCisvKioKKyAqIHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF9tb2RlOgorICogQGpidWY6IGFuICNSVFBKaXR0ZXJCdWZmZXIKKyAqCisgKiBHZXQgdGhlIGN1cnJlbnQgaml0dGVyYnVmZmVyIG1vZGUuCisgKgorICogUmV0dXJuczogdGhlIGN1cnJlbnQgaml0dGVyYnVmZmVyIG1vZGUuCisgKi8KK1JUUEppdHRlckJ1ZmZlck1vZGUKK3J0cF9qaXR0ZXJfYnVmZmVyX2dldF9tb2RlIChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmKQoreworICByZXR1cm4gamJ1Zi0+bW9kZTsKK30KKworLyoqCisgKiBydHBfaml0dGVyX2J1ZmZlcl9zZXRfbW9kZToKKyAqIEBqYnVmOiBhbiAjUlRQSml0dGVyQnVmZmVyCisgKiBAbW9kZTogYSAjUlRQSml0dGVyQnVmZmVyTW9kZQorICoKKyAqIFNldCB0aGUgYnVmZmVyaW5nIGFuZCBjbG9jayBzbGF2aW5nIGFsZ29yaXRobSB1c2VkIGluIHRoZSBAamJ1Zi4KKyAqLwordm9pZAorcnRwX2ppdHRlcl9idWZmZXJfc2V0X21vZGUgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYsIFJUUEppdHRlckJ1ZmZlck1vZGUgbW9kZSkKK3sKKyAgamJ1Zi0+bW9kZSA9IG1vZGU7Cit9CisKK0dzdENsb2NrVGltZQorcnRwX2ppdHRlcl9idWZmZXJfZ2V0X2RlbGF5IChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmKQoreworICByZXR1cm4gamJ1Zi0+ZGVsYXk7Cit9CisKK3ZvaWQKK3J0cF9qaXR0ZXJfYnVmZmVyX3NldF9kZWxheSAoUlRQSml0dGVyQnVmZmVyICogamJ1ZiwgR3N0Q2xvY2tUaW1lIGRlbGF5KQoreworICBqYnVmLT5kZWxheSA9IGRlbGF5OworICBqYnVmLT5sb3dfbGV2ZWwgPSAoZGVsYXkgKiAxNSkgLyAxMDA7CisgIC8qIHRoZSBoaWdoIGxldmVsIGlzIGF0IDkwJSBpbiBvcmRlciB0byByZWxlYXNlIHBhY2tldHMgYmVmb3JlIHdlIGZpbGwgdXAgdGhlCisgICAqIGJ1ZmZlciB1cCB0byB0aGUgbGF0ZW5jeSAqLworICBqYnVmLT5oaWdoX2xldmVsID0gKGRlbGF5ICogOTApIC8gMTAwOworCisgIEdTVF9ERUJVRyAoImRlbGF5ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBtaW4gJSIgR1NUX1RJTUVfRk9STUFUICIsIG1heCAlIgorICAgICAgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChqYnVmLT5kZWxheSksCisgICAgICBHU1RfVElNRV9BUkdTIChqYnVmLT5sb3dfbGV2ZWwpLCBHU1RfVElNRV9BUkdTIChqYnVmLT5oaWdoX2xldmVsKSk7Cit9CisKKy8qKgorICogcnRwX2ppdHRlcl9idWZmZXJfc2V0X2Nsb2NrX3JhdGU6CisgKiBAamJ1ZjogYW4gI1JUUEppdHRlckJ1ZmZlcgorICogQGNsb2NrX3JhdGU6IHRoZSBuZXcgY2xvY2sgcmF0ZQorICoKKyAqIFNldCB0aGUgY2xvY2sgcmF0ZSBpbiB0aGUgaml0dGVyYnVmZmVyLgorICovCit2b2lkCitydHBfaml0dGVyX2J1ZmZlcl9zZXRfY2xvY2tfcmF0ZSAoUlRQSml0dGVyQnVmZmVyICogamJ1ZiwgZ3VpbnQzMiBjbG9ja19yYXRlKQoreworICBpZiAoamJ1Zi0+Y2xvY2tfcmF0ZSAhPSBjbG9ja19yYXRlKSB7CisgICAgR1NUX0RFQlVHICgiQ2xvY2sgcmF0ZSBjaGFuZ2VkIGZyb20gJSIgR19HVUlOVDMyX0ZPUk1BVCAiIHRvICUiCisgICAgICAgIEdfR1VJTlQzMl9GT1JNQVQsIGpidWYtPmNsb2NrX3JhdGUsIGNsb2NrX3JhdGUpOworICAgIGpidWYtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX3Jlc2V0X3NrZXcgKGpidWYpOworICB9Cit9CisKKy8qKgorICogcnRwX2ppdHRlcl9idWZmZXJfZ2V0X2Nsb2NrX3JhdGU6CisgKiBAamJ1ZjogYW4gI1JUUEppdHRlckJ1ZmZlcgorICoKKyAqIEdldCB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZSBjbG9jayByYXRlIGluIEBqYnVmLgorICoKKyAqIFJldHVybnM6IHRoZSBjdXJyZW50IGNsb2NrLXJhdGUKKyAqLworZ3VpbnQzMgorcnRwX2ppdHRlcl9idWZmZXJfZ2V0X2Nsb2NrX3JhdGUgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYpCit7CisgIHJldHVybiBqYnVmLT5jbG9ja19yYXRlOworfQorCitzdGF0aWMgdm9pZAorbWVkaWFfY2xvY2tfc3luY2VkX2NiIChHc3RDbG9jayAqIGNsb2NrLCBnYm9vbGVhbiBzeW5jZWQsCisgICAgUlRQSml0dGVyQnVmZmVyICogamJ1ZikKK3sKKyAgR3N0Q2xvY2tUaW1lIGludGVybmFsLCBleHRlcm5hbDsKKworICBnX211dGV4X2xvY2sgKCZqYnVmLT5jbG9ja19sb2NrKTsKKyAgaWYgKGpidWYtPnBpcGVsaW5lX2Nsb2NrKSB7CisgICAgaW50ZXJuYWwgPSBnc3RfY2xvY2tfZ2V0X2ludGVybmFsX3RpbWUgKGpidWYtPm1lZGlhX2Nsb2NrKTsKKyAgICBleHRlcm5hbCA9IGdzdF9jbG9ja19nZXRfdGltZSAoamJ1Zi0+cGlwZWxpbmVfY2xvY2spOworCisgICAgZ3N0X2Nsb2NrX3NldF9jYWxpYnJhdGlvbiAoamJ1Zi0+bWVkaWFfY2xvY2ssIGludGVybmFsLCBleHRlcm5hbCwgMSwgMSk7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZqYnVmLT5jbG9ja19sb2NrKTsKK30KKworLyoqCisgKiBydHBfaml0dGVyX2J1ZmZlcl9zZXRfbWVkaWFfY2xvY2s6CisgKiBAamJ1ZjogYW4gI1JUUEppdHRlckJ1ZmZlcgorICogQGNsb2NrOiAodHJhbnNmZXIgZnVsbCk6IG1lZGlhICNHc3RDbG9jaworICogQGNsb2NrX29mZnNldDogUlRQIHRpbWUgYXQgY2xvY2sgZXBvY2ggb3IgLTEKKyAqCisgKiBTZXRzIHRoZSBtZWRpYSBjbG9jayBmb3IgdGhlIG1lZGlhIGFuZCB0aGUgY2xvY2sgb2Zmc2V0CisgKgorICovCit2b2lkCitydHBfaml0dGVyX2J1ZmZlcl9zZXRfbWVkaWFfY2xvY2sgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYsIEdzdENsb2NrICogY2xvY2ssCisgICAgZ3VpbnQ2NCBjbG9ja19vZmZzZXQpCit7CisgIGdfbXV0ZXhfbG9jayAoJmpidWYtPmNsb2NrX2xvY2spOworICBpZiAoamJ1Zi0+bWVkaWFfY2xvY2spIHsKKyAgICBpZiAoamJ1Zi0+bWVkaWFfY2xvY2tfc3luY2VkX2lkKQorICAgICAgZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0IChqYnVmLT5tZWRpYV9jbG9jaywKKyAgICAgICAgICBqYnVmLT5tZWRpYV9jbG9ja19zeW5jZWRfaWQpOworICAgIGpidWYtPm1lZGlhX2Nsb2NrX3N5bmNlZF9pZCA9IDA7CisgICAgZ3N0X29iamVjdF91bnJlZiAoamJ1Zi0+bWVkaWFfY2xvY2spOworICB9CisgIGpidWYtPm1lZGlhX2Nsb2NrID0gY2xvY2s7CisgIGpidWYtPm1lZGlhX2Nsb2NrX29mZnNldCA9IGNsb2NrX29mZnNldDsKKworICBpZiAoamJ1Zi0+cGlwZWxpbmVfY2xvY2sgJiYgamJ1Zi0+bWVkaWFfY2xvY2sgJiYKKyAgICAgIGpidWYtPnBpcGVsaW5lX2Nsb2NrICE9IGpidWYtPm1lZGlhX2Nsb2NrKSB7CisgICAgamJ1Zi0+bWVkaWFfY2xvY2tfc3luY2VkX2lkID0KKyAgICAgICAgZ19zaWduYWxfY29ubmVjdCAoamJ1Zi0+bWVkaWFfY2xvY2ssICJzeW5jZWQiLAorICAgICAgICBHX0NBTExCQUNLIChtZWRpYV9jbG9ja19zeW5jZWRfY2IpLCBqYnVmKTsKKyAgICBpZiAoZ3N0X2Nsb2NrX2lzX3N5bmNlZCAoamJ1Zi0+bWVkaWFfY2xvY2spKSB7CisgICAgICBHc3RDbG9ja1RpbWUgaW50ZXJuYWwsIGV4dGVybmFsOworCisgICAgICBpbnRlcm5hbCA9IGdzdF9jbG9ja19nZXRfaW50ZXJuYWxfdGltZSAoamJ1Zi0+bWVkaWFfY2xvY2spOworICAgICAgZXh0ZXJuYWwgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKGpidWYtPnBpcGVsaW5lX2Nsb2NrKTsKKworICAgICAgZ3N0X2Nsb2NrX3NldF9jYWxpYnJhdGlvbiAoamJ1Zi0+bWVkaWFfY2xvY2ssIGludGVybmFsLCBleHRlcm5hbCwgMSwgMSk7CisgICAgfQorCisgICAgZ3N0X2Nsb2NrX3NldF9tYXN0ZXIgKGpidWYtPm1lZGlhX2Nsb2NrLCBqYnVmLT5waXBlbGluZV9jbG9jayk7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZqYnVmLT5jbG9ja19sb2NrKTsKK30KKworLyoqCisgKiBydHBfaml0dGVyX2J1ZmZlcl9zZXRfcGlwZWxpbmVfY2xvY2s6CisgKiBAamJ1ZjogYW4gI1JUUEppdHRlckJ1ZmZlcgorICogQGNsb2NrOiBwaXBlbGluZSAjR3N0Q2xvY2sKKyAqCisgKiBTZXRzIHRoZSBwaXBlbGluZSBjbG9jaworICoKKyAqLwordm9pZAorcnRwX2ppdHRlcl9idWZmZXJfc2V0X3BpcGVsaW5lX2Nsb2NrIChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmLCBHc3RDbG9jayAqIGNsb2NrKQoreworICBnX211dGV4X2xvY2sgKCZqYnVmLT5jbG9ja19sb2NrKTsKKyAgaWYgKGpidWYtPnBpcGVsaW5lX2Nsb2NrKQorICAgIGdzdF9vYmplY3RfdW5yZWYgKGpidWYtPnBpcGVsaW5lX2Nsb2NrKTsKKyAgamJ1Zi0+cGlwZWxpbmVfY2xvY2sgPSBjbG9jayA/IGdzdF9vYmplY3RfcmVmIChjbG9jaykgOiBOVUxMOworCisgIGlmIChqYnVmLT5waXBlbGluZV9jbG9jayAmJiBqYnVmLT5tZWRpYV9jbG9jayAmJgorICAgICAgamJ1Zi0+cGlwZWxpbmVfY2xvY2sgIT0gamJ1Zi0+bWVkaWFfY2xvY2spIHsKKyAgICBpZiAoZ3N0X2Nsb2NrX2lzX3N5bmNlZCAoamJ1Zi0+bWVkaWFfY2xvY2spKSB7CisgICAgICBHc3RDbG9ja1RpbWUgaW50ZXJuYWwsIGV4dGVybmFsOworCisgICAgICBpbnRlcm5hbCA9IGdzdF9jbG9ja19nZXRfaW50ZXJuYWxfdGltZSAoamJ1Zi0+bWVkaWFfY2xvY2spOworICAgICAgZXh0ZXJuYWwgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKGpidWYtPnBpcGVsaW5lX2Nsb2NrKTsKKworICAgICAgZ3N0X2Nsb2NrX3NldF9jYWxpYnJhdGlvbiAoamJ1Zi0+bWVkaWFfY2xvY2ssIGludGVybmFsLCBleHRlcm5hbCwgMSwgMSk7CisgICAgfQorCisgICAgZ3N0X2Nsb2NrX3NldF9tYXN0ZXIgKGpidWYtPm1lZGlhX2Nsb2NrLCBqYnVmLT5waXBlbGluZV9jbG9jayk7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZqYnVmLT5jbG9ja19sb2NrKTsKK30KKworZ2Jvb2xlYW4KK3J0cF9qaXR0ZXJfYnVmZmVyX2dldF9yZmM3MjczX3N5bmMgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYpCit7CisgIHJldHVybiBqYnVmLT5yZmM3MjczX3N5bmM7Cit9CisKK3ZvaWQKK3J0cF9qaXR0ZXJfYnVmZmVyX3NldF9yZmM3MjczX3N5bmMgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYsCisgICAgZ2Jvb2xlYW4gcmZjNzI3M19zeW5jKQoreworICBqYnVmLT5yZmM3MjczX3N5bmMgPSByZmM3MjczX3N5bmM7Cit9CisKKy8qKgorICogcnRwX2ppdHRlcl9idWZmZXJfcmVzZXRfc2tldzoKKyAqIEBqYnVmOiBhbiAjUlRQSml0dGVyQnVmZmVyCisgKgorICogUmVzZXQgdGhlIHNrZXcgY2FsY3VsYXRpb25zIGluIEBqYnVmLgorICovCit2b2lkCitydHBfaml0dGVyX2J1ZmZlcl9yZXNldF9za2V3IChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmKQoreworICBqYnVmLT5iYXNlX3RpbWUgPSAtMTsKKyAgamJ1Zi0+YmFzZV9ydHB0aW1lID0gLTE7CisgIGpidWYtPmJhc2VfZXh0cnRwID0gLTE7CisgIGpidWYtPm1lZGlhX2Nsb2NrX2Jhc2VfdGltZSA9IC0xOworICBqYnVmLT5leHRfcnRwdGltZSA9IC0xOworICBqYnVmLT5sYXN0X3J0cHRpbWUgPSAtMTsKKyAgamJ1Zi0+d2luZG93X3BvcyA9IDA7CisgIGpidWYtPndpbmRvd19maWxsaW5nID0gVFJVRTsKKyAgamJ1Zi0+d2luZG93X21pbiA9IDA7CisgIGpidWYtPnNrZXcgPSAwOworICBqYnVmLT5wcmV2X3NlbmRfZGlmZiA9IC0xOworICBqYnVmLT5wcmV2X291dF90aW1lID0gLTE7CisgIGpidWYtPm5lZWRfcmVzeW5jID0gVFJVRTsKKworICBHU1RfREVCVUcgKCJyZXNldCBza2V3IGNvcnJlY3Rpb24iKTsKK30KKworLyoqCisgKiBydHBfaml0dGVyX2J1ZmZlcl9kaXNhYmxlX2J1ZmZlcmluZzoKKyAqIEBqYnVmOiBhbiAjUlRQSml0dGVyQnVmZmVyCisgKiBAZGlzYWJsZWQ6IHRoZSBuZXcgc3RhdGUKKyAqCisgKiBFbmFibGUgb3IgZGlzYWJsZSBidWZmZXJpbmcgb24gQGpidWYuCisgKi8KK3ZvaWQKK3J0cF9qaXR0ZXJfYnVmZmVyX2Rpc2FibGVfYnVmZmVyaW5nIChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmLCBnYm9vbGVhbiBkaXNhYmxlZCkKK3sKKyAgamJ1Zi0+YnVmZmVyaW5nX2Rpc2FibGVkID0gZGlzYWJsZWQ7Cit9CisKK3N0YXRpYyB2b2lkCitydHBfaml0dGVyX2J1ZmZlcl9yZXN5bmMgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYsIEdzdENsb2NrVGltZSB0aW1lLAorICAgIEdzdENsb2NrVGltZSBnc3RydHB0aW1lLCBndWludDY0IGV4dF9ydHB0aW1lLCBnYm9vbGVhbiByZXNldF9za2V3KQoreworICBqYnVmLT5iYXNlX3RpbWUgPSB0aW1lOworICBqYnVmLT5tZWRpYV9jbG9ja19iYXNlX3RpbWUgPSAtMTsKKyAgamJ1Zi0+YmFzZV9ydHB0aW1lID0gZ3N0cnRwdGltZTsKKyAgamJ1Zi0+YmFzZV9leHRydHAgPSBleHRfcnRwdGltZTsKKyAgamJ1Zi0+cHJldl9vdXRfdGltZSA9IC0xOworICBqYnVmLT5wcmV2X3NlbmRfZGlmZiA9IC0xOworICBpZiAocmVzZXRfc2tldykgeworICAgIGpidWYtPndpbmRvd19maWxsaW5nID0gVFJVRTsKKyAgICBqYnVmLT53aW5kb3dfcG9zID0gMDsKKyAgICBqYnVmLT53aW5kb3dfbWluID0gMDsKKyAgICBqYnVmLT53aW5kb3dfc2l6ZSA9IDA7CisgICAgamJ1Zi0+c2tldyA9IDA7CisgIH0KKyAgamJ1Zi0+bmVlZF9yZXN5bmMgPSBGQUxTRTsKK30KKworc3RhdGljIGd1aW50NjQKK2dldF9idWZmZXJfbGV2ZWwgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYpCit7CisgIFJUUEppdHRlckJ1ZmZlckl0ZW0gKmhpZ2hfYnVmID0gTlVMTCwgKmxvd19idWYgPSBOVUxMOworICBndWludDY0IGxldmVsOworCisgIC8qIGZpcnN0IGJ1ZmZlciB3aXRoIHRpbWVzdGFtcCAqLworICBoaWdoX2J1ZiA9IChSVFBKaXR0ZXJCdWZmZXJJdGVtICopIGdfcXVldWVfcGVla190YWlsX2xpbmsgKGpidWYtPnBhY2tldHMpOworICB3aGlsZSAoaGlnaF9idWYpIHsKKyAgICBpZiAoaGlnaF9idWYtPmR0cyAhPSAtMSB8fCBoaWdoX2J1Zi0+cHRzICE9IC0xKQorICAgICAgYnJlYWs7CisKKyAgICBoaWdoX2J1ZiA9IChSVFBKaXR0ZXJCdWZmZXJJdGVtICopIGdfbGlzdF9wcmV2aW91cyAoaGlnaF9idWYpOworICB9CisKKyAgbG93X2J1ZiA9IChSVFBKaXR0ZXJCdWZmZXJJdGVtICopIGdfcXVldWVfcGVla19oZWFkX2xpbmsgKGpidWYtPnBhY2tldHMpOworICB3aGlsZSAobG93X2J1ZikgeworICAgIGlmIChsb3dfYnVmLT5kdHMgIT0gLTEgfHwgbG93X2J1Zi0+cHRzICE9IC0xKQorICAgICAgYnJlYWs7CisKKyAgICBsb3dfYnVmID0gKFJUUEppdHRlckJ1ZmZlckl0ZW0gKikgZ19saXN0X25leHQgKGxvd19idWYpOworICB9CisKKyAgaWYgKCFoaWdoX2J1ZiB8fCAhbG93X2J1ZiB8fCBoaWdoX2J1ZiA9PSBsb3dfYnVmKSB7CisgICAgbGV2ZWwgPSAwOworICB9IGVsc2UgeworICAgIGd1aW50NjQgaGlnaF90cywgbG93X3RzOworCisgICAgaGlnaF90cyA9IGhpZ2hfYnVmLT5kdHMgIT0gLTEgPyBoaWdoX2J1Zi0+ZHRzIDogaGlnaF9idWYtPnB0czsKKyAgICBsb3dfdHMgPSBsb3dfYnVmLT5kdHMgIT0gLTEgPyBsb3dfYnVmLT5kdHMgOiBsb3dfYnVmLT5wdHM7CisKKyAgICBpZiAoaGlnaF90cyA+IGxvd190cykKKyAgICAgIGxldmVsID0gaGlnaF90cyAtIGxvd190czsKKyAgICBlbHNlCisgICAgICBsZXZlbCA9IDA7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoamJ1ZiwKKyAgICAgICAgImxvdyAlIiBHU1RfVElNRV9GT1JNQVQgIiBoaWdoICUiIEdTVF9USU1FX0ZPUk1BVCAiIGxldmVsICUiCisgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGxvd190cyksIEdTVF9USU1FX0FSR1MgKGhpZ2hfdHMpLAorICAgICAgICBsZXZlbCk7CisgIH0KKyAgcmV0dXJuIGxldmVsOworfQorCitzdGF0aWMgdm9pZAordXBkYXRlX2J1ZmZlcl9sZXZlbCAoUlRQSml0dGVyQnVmZmVyICogamJ1ZiwgZ2ludCAqIHBlcmNlbnQpCit7CisgIGdib29sZWFuIHBvc3QgPSBGQUxTRTsKKyAgZ3VpbnQ2NCBsZXZlbDsKKworICBsZXZlbCA9IGdldF9idWZmZXJfbGV2ZWwgKGpidWYpOworICBHU1RfREVCVUcgKCJidWZmZXIgbGV2ZWwgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChsZXZlbCkpOworCisgIGlmIChqYnVmLT5idWZmZXJpbmdfZGlzYWJsZWQpIHsKKyAgICBHU1RfREVCVUcgKCJidWZmZXJpbmcgaXMgZGlzYWJsZWQiKTsKKyAgICBsZXZlbCA9IGpidWYtPmhpZ2hfbGV2ZWw7CisgIH0KKworICBpZiAoamJ1Zi0+YnVmZmVyaW5nKSB7CisgICAgcG9zdCA9IFRSVUU7CisgICAgaWYgKGxldmVsID49IGpidWYtPmhpZ2hfbGV2ZWwpIHsKKyAgICAgIEdTVF9ERUJVRyAoImJ1ZmZlcmluZyBmaW5pc2hlZCIpOworICAgICAgamJ1Zi0+YnVmZmVyaW5nID0gRkFMU0U7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChsZXZlbCA8IGpidWYtPmxvd19sZXZlbCkgeworICAgICAgR1NUX0RFQlVHICgiYnVmZmVyaW5nIHN0YXJ0ZWQiKTsKKyAgICAgIGpidWYtPmJ1ZmZlcmluZyA9IFRSVUU7CisgICAgICBwb3N0ID0gVFJVRTsKKyAgICB9CisgIH0KKyAgaWYgKHBvc3QpIHsKKyAgICBnaW50IHBlcmM7CisKKyAgICBpZiAoamJ1Zi0+YnVmZmVyaW5nICYmIChqYnVmLT5oaWdoX2xldmVsICE9IDApKSB7CisgICAgICBwZXJjID0gKGxldmVsICogMTAwIC8gamJ1Zi0+aGlnaF9sZXZlbCk7CisgICAgICBwZXJjID0gTUlOIChwZXJjLCAxMDApOworICAgIH0gZWxzZSB7CisgICAgICBwZXJjID0gMTAwOworICAgIH0KKworICAgIGlmIChwZXJjZW50KQorICAgICAgKnBlcmNlbnQgPSBwZXJjOworCisgICAgR1NUX0RFQlVHICgiYnVmZmVyaW5nICVkIiwgcGVyYyk7CisgIH0KK30KKworLyogRm9yIHRoZSBjbG9jayBza2V3IHdlIHVzZSBhIHdpbmRvd2VkIGxvdyBwb2ludCBhdmVyYWdpbmcgYWxnb3JpdGhtIGFzIGNhbiBiZQorICogZm91bmQgaW4gRm9iZXIsIE9ybGFyZXkgYW5kIExldHosIDIwMDUsICJSZWFsIFRpbWUgQ2xvY2sgU2tldyBFc3RpbWF0aW9uCisgKiBvdmVyIE5ldHdvcmsgRGVsYXlzIjoKKyAqIGh0dHA6Ly93d3cuZ3JhbWUuZnIvUmVzc291cmNlcy9wdWIvVFItMDUwNjAxLnBkZgorICogaHR0cDovL2NpdGVzZWVyeC5pc3QucHN1LmVkdS92aWV3ZG9jL3N1bW1hcnk/ZG9pPTEwLjEuMS4xMDIuMTU0NgorICoKKyAqIFRoZSBpZGVhIGlzIHRoYXQgdGhlIGppdHRlciBpcyBjb21wb3NlZCBvZjoKKyAqCisgKiAgSiA9IE4gKyBuCisgKgorICogICBOICAgOiBhIGNvbnN0YW50IG5ldHdvcmsgZGVsYXkuCisgKiAgIG4gICA6IHJhbmRvbSBhZGRlZCBub2lzZS4gVGhlIG5vaXNlIGlzIGNvbmNlbnRyYXRlZCBhcm91bmQgMAorICoKKyAqIEluIHRoZSByZWNlaXZlciB3ZSBjYW4gdHJhY2sgdGhlIGVsYXBzZWQgdGltZSBhdCB0aGUgc2VuZGVyIHdpdGg6CisgKgorICogIHNlbmRfZGlmZihpKSA9IChUc2kgLSBUczApOworICoKKyAqICAgVHNpIDogVGhlIHRpbWUgYXQgdGhlIHNlbmRlciBhdCBwYWNrZXQgaQorICogICBUczAgOiBUaGUgdGltZSBhdCB0aGUgc2VuZGVyIGF0IHRoZSBmaXJzdCBwYWNrZXQKKyAqCisgKiBUaGlzIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIFJUUCB0aW1lc3RhbXAgaW4gdGhlIGZpcnN0IHJlY2VpdmVkIHBhY2tldAorICogYW5kIHRoZSBjdXJyZW50IHBhY2tldC4KKyAqCisgKiBBdCB0aGUgcmVjZWl2ZXIgd2UgaGF2ZSB0byBkZWFsIHdpdGggdGhlIGppdHRlciBpbnRyb2R1Y2VkIGJ5IHRoZSBuZXR3b3JrLgorICoKKyAqICByZWN2X2RpZmYoaSkgPSAoVHJpIC0gVHIwKQorICoKKyAqICAgVHJpIDogVGhlIHRpbWUgYXQgdGhlIHJlY2VpdmVyIGF0IHBhY2tldCBpCisgKiAgIFRyMCA6IFRoZSB0aW1lIGF0IHRoZSByZWNlaXZlciBhdCB0aGUgZmlyc3QgcGFja2V0CisgKgorICogQm90aCBvZiB0aGVzZSB2YWx1ZXMgY29udGFpbiBhIGppdHRlciBKaSwgYSBqaXR0ZXIgZm9yIHBhY2tldCBpLCBzbyB3ZSBjYW4KKyAqIHdyaXRlOgorICoKKyAqICByZWN2X2RpZmYoaSkgPSAoQ3JpICsgRCArIG5pKSAtIChDcjAgKyBEICsgbjApKQorICoKKyAqICAgIENyaSAgICA6IFRoZSB0aW1lIG9mIHRoZSBjbG9jayBhdCB0aGUgcmVjZWl2ZXIgZm9yIHBhY2tldCBpCisgKiAgICBEICsgbmkgOiBUaGUgaml0dGVyIHdoZW4gcmVjZWl2aW5nIHBhY2tldCBpCisgKgorICogV2Ugc2VlIHRoYXQgdGhlIG5ldHdvcmsgZGVsYXkgaXMgaXJyZWxldmFudCBoZXJlIGFzIHdlIGNhbiBlbGxpbWluYXRlIEQ6CisgKgorICogIHJlY3ZfZGlmZihpKSA9IChDcmkgKyBuaSkgLSAoQ3IwICsgbjApKQorICoKKyAqIFRoZSBkcmlmdCBpcyBub3cgZXhwcmVzc2VkIGFzOgorICoKKyAqICBEcmlmdChpKSA9IHJlY3ZfZGlmZihpKSAtIHNlbmRfZGlmZihpKTsKKyAqCisgKiBXZSBub3cga2VlcCB0aGUgVyBsYXRlc3QgdmFsdWVzIG9mIERyaWZ0IGFuZCBmaW5kIHRoZSBtaW5pbXVtICh0aGlzIGlzIHRoZQorICogb25lIHdpdGggdGhlIGxvd2VzdCBuZXR3b3JrIGppdHRlciBhbmQgdGh1cyB0aGUgb25lIHdoaWNoIGlzIGxlYXN0IGFmZmVjdGVkCisgKiBieSBpdCkuIFdlIGF2ZXJhZ2UgdGhpcyBsb3dlc3QgdmFsdWUgdG8gc21vb3RoIG91dCB0aGUgcmVzdWx0aW5nIG5ldHdvcmsgc2tldy4KKyAqCisgKiBCb3RoIHRoZSB3aW5kb3cgYW5kIHRoZSB3ZWlnaHRpbmcgdXNlZCBmb3IgYXZlcmFnaW5nIGluZmx1ZW5jZSB0aGUgYWNjdXJhY3kKKyAqIG9mIHRoZSBkcmlmdCBlc3RpbWF0aW9uLiBGaW5kaW5nIHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMgdHVybnMgb3V0IHRvIGJlIGEKKyAqIGNvbXByb21pc2UgYmV0d2VlbiBhY2N1cmFjeSBhbmQgaW5lcnRpYS4KKyAqCisgKiBXZSB1c2UgYSAyIHNlY29uZCB3aW5kb3cgb3IgdXAgdG8gNTEyIGRhdGEgcG9pbnRzLCB3aGljaCBpcyBzdGF0aXN0aWNhbGx5IGJpZworICogZW5vdWdoIHRvIGNhdGNoIHNwaWtlcyAoRklYTUUsIGRldGVjdCBzcGlrZXMpLgorICogV2UgYWxzbyB1c2UgYSByYXRoZXIgbGFyZ2Ugd2VpZ2h0aW5nIGZhY3RvciAoMTI1KSB0byBzbW9vdGhseSBhZGFwdC4gRHVyaW5nCisgKiBzdGFydHVwLCB3aGVuIGZpbGxpbmcgdGhlIHdpbmRvdywgd2UgdXNlIGEgcGFyYWJvbGljIHdlaWdodGluZyBmYWN0b3IsIHRoZQorICogbW9yZSB0aGUgd2luZG93IGlzIGZpbGxlZCwgdGhlIGZhc3RlciB3ZSBtb3ZlIHRvIHRoZSBkZXRlY3RlZCBwb3NzaWJsZSBza2V3LgorICoKKyAqIFJldHVybnM6IEB0aW1lIGFkanVzdGVkIHdpdGggdGhlIGNsb2NrIHNrZXcuCisgKi8KK3N0YXRpYyBHc3RDbG9ja1RpbWUKK2NhbGN1bGF0ZV9za2V3IChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmLCBndWludDY0IGV4dF9ydHB0aW1lLAorICAgIEdzdENsb2NrVGltZSBnc3RydHB0aW1lLCBHc3RDbG9ja1RpbWUgdGltZSkKK3sKKyAgZ3VpbnQ2NCBzZW5kX2RpZmYsIHJlY3ZfZGlmZjsKKyAgZ2ludDY0IGRlbHRhOworICBnaW50NjQgb2xkOworICBnaW50IHBvcywgaTsKKyAgR3N0Q2xvY2tUaW1lIG91dF90aW1lOworICBndWludDY0IHNsb3BlOworCisgIC8qIGVsYXBzZWQgdGltZSBhdCBzZW5kZXIgKi8KKyAgc2VuZF9kaWZmID0gZ3N0cnRwdGltZSAtIGpidWYtPmJhc2VfcnRwdGltZTsKKworICAvKiB3ZSBkb24ndCBoYXZlIGFuIGFycml2YWwgdGltZXN0YW1wIHNvIHdlIGNhbid0IGRvIHNrZXcgZGV0ZWN0aW9uLiB3ZQorICAgKiBzaG91bGQgc3RpbGwgYXBwbHkgYSB0aW1lc3RhbXAgYmFzZWQgb24gUlRQIHRpbWVzdGFtcCBhbmQgYmFzZV90aW1lICovCisgIGlmICh0aW1lID09IC0xIHx8IGpidWYtPmJhc2VfdGltZSA9PSAtMSkKKyAgICBnb3RvIG5vX3NrZXc7CisKKyAgLyogZWxhcHNlZCB0aW1lIGF0IHJlY2VpdmVyLCBpbmNsdWRlcyB0aGUgaml0dGVyICovCisgIHJlY3ZfZGlmZiA9IHRpbWUgLSBqYnVmLT5iYXNlX3RpbWU7CisKKyAgLyogbWVhc3VyZSB0aGUgZGlmZiAqLworICBkZWx0YSA9ICgoZ2ludDY0KSByZWN2X2RpZmYpIC0gKChnaW50NjQpIHNlbmRfZGlmZik7CisKKyAgLyogbWVhc3VyZSB0aGUgc2xvcGUsIHRoaXMgZ2l2ZXMgYSByb3VnaHQgZXN0aW1hdGUgYmV0d2VlbiB0aGUgc2VuZGVyIHNwZWVkCisgICAqIGFuZCB0aGUgcmVjZWl2ZXIgc3BlZWQuIFRoaXMgc2hvdWxkIGJlIGFwcHJveGltYXRlbHkgOCwgaGlnaGVyIHZhbHVlcworICAgKiBpbmRpY2F0ZSBhIGJ1cnN0IChlc3BlY2lhbGx5IHdoZW4gdGhlIGNvbm5lY3Rpb24gc3RhcnRzKSAqLworICBpZiAocmVjdl9kaWZmID4gMCkKKyAgICBzbG9wZSA9IChzZW5kX2RpZmYgKiA4KSAvIHJlY3ZfZGlmZjsKKyAgZWxzZQorICAgIHNsb3BlID0gODsKKworICBHU1RfREVCVUcgKCJ0aW1lICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBiYXNlICUiIEdTVF9USU1FX0ZPUk1BVCAiLCByZWN2X2RpZmYgJSIKKyAgICAgIEdTVF9USU1FX0ZPUk1BVCAiLCBzbG9wZSAlIiBHX0dVSU5UNjRfRk9STUFULCBHU1RfVElNRV9BUkdTICh0aW1lKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKGpidWYtPmJhc2VfdGltZSksIEdTVF9USU1FX0FSR1MgKHJlY3ZfZGlmZiksIHNsb3BlKTsKKworICAvKiBpZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzZW5kZXIgdGltZWxpbmUgYW5kIHRoZSByZWNlaXZlciB0aW1lbGluZQorICAgKiBjaGFuZ2VkIHRvbyBxdWlja2x5IHdlIGhhdmUgdG8gcmVzeW5jIGJlY2F1c2UgdGhlIHNlcnZlciBsaWtlbHkgcmVzdGFydGVkCisgICAqIGl0cyB0aW1lc3RhbXBzLiAqLworICBpZiAoQUJTIChkZWx0YSAtIGpidWYtPnNrZXcpID4gR1NUX1NFQ09ORCkgeworICAgIEdTVF9XQVJOSU5HICgiZGVsdGEgLSBza2V3OiAlIiBHU1RfVElNRV9GT1JNQVQgIiB0b28gYmlnLCByZXNldCBza2V3IiwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoQUJTIChkZWx0YSAtIGpidWYtPnNrZXcpKSk7CisgICAgcnRwX2ppdHRlcl9idWZmZXJfcmVzeW5jIChqYnVmLCB0aW1lLCBnc3RydHB0aW1lLCBleHRfcnRwdGltZSwgVFJVRSk7CisgICAgc2VuZF9kaWZmID0gMDsKKyAgICBkZWx0YSA9IDA7CisgIH0KKworICBwb3MgPSBqYnVmLT53aW5kb3dfcG9zOworCisgIGlmIChHX1VOTElLRUxZIChqYnVmLT53aW5kb3dfZmlsbGluZykpIHsKKyAgICAvKiB3ZSBhcmUgZmlsbGluZyB0aGUgd2luZG93ICovCisgICAgR1NUX0RFQlVHICgiZmlsbGluZyAlZCwgZGVsdGEgJSIgR19HSU5UNjRfRk9STUFULCBwb3MsIGRlbHRhKTsKKyAgICBqYnVmLT53aW5kb3dbcG9zKytdID0gZGVsdGE7CisgICAgLyogY2FsYyB0aGUgbWluIGRlbHRhIHdlIG9ic2VydmVkICovCisgICAgaWYgKEdfVU5MSUtFTFkgKHBvcyA9PSAxIHx8IGRlbHRhIDwgamJ1Zi0+d2luZG93X21pbikpCisgICAgICBqYnVmLT53aW5kb3dfbWluID0gZGVsdGE7CisKKyAgICBpZiAoR19VTkxJS0VMWSAoc2VuZF9kaWZmID49IE1BWF9USU1FIHx8IHBvcyA+PSBNQVhfV0lORE9XKSkgeworICAgICAgamJ1Zi0+d2luZG93X3NpemUgPSBwb3M7CisKKyAgICAgIC8qIHdpbmRvdyBmaWxsZWQgKi8KKyAgICAgIEdTVF9ERUJVRyAoIm1pbiAlIiBHX0dJTlQ2NF9GT1JNQVQsIGpidWYtPndpbmRvd19taW4pOworCisgICAgICAvKiB0aGUgc2tldyBpcyBub3cgdGhlIG1pbiAqLworICAgICAgamJ1Zi0+c2tldyA9IGpidWYtPndpbmRvd19taW47CisgICAgICBqYnVmLT53aW5kb3dfZmlsbGluZyA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICBnaW50IHBlcmNfdGltZSwgcGVyY193aW5kb3csIHBlcmM7CisKKyAgICAgIC8qIGZpZ3VyZSBvdXQgaG93IG11Y2ggd2UgZmlsbGVkIHRoZSB3aW5kb3csIHRoaXMgZGVwZW5kcyBvbiB0aGUgYW1vdW50IG9mCisgICAgICAgKiB0aW1lIHdlIGhhdmUgb3IgdGhlIG1heCBudW1iZXIgb2YgcG9pbnRzIHdlIGtlZXAuICovCisgICAgICBwZXJjX3RpbWUgPSBzZW5kX2RpZmYgKiAxMDAgLyBNQVhfVElNRTsKKyAgICAgIHBlcmNfd2luZG93ID0gcG9zICogMTAwIC8gTUFYX1dJTkRPVzsKKyAgICAgIHBlcmMgPSBNQVggKHBlcmNfdGltZSwgcGVyY193aW5kb3cpOworCisgICAgICAvKiBtYWtlIGEgcGFyYWJvbGljIGZ1bmN0aW9uLCB0aGUgY2xvc2VyIHdlIGdldCB0byB0aGUgTUFYLCB0aGUgbW9yZSB2YWx1ZQorICAgICAgICogd2UgZ2l2ZSB0byB0aGUgc2NhbGluZyBmYWN0b3Igb2YgdGhlIG5ldyB2YWx1ZSAqLworICAgICAgcGVyYyA9IHBlcmMgKiBwZXJjOworCisgICAgICAvKiBxdWlja2x5IGdvIHRvIHRoZSBtaW4gdmFsdWUgd2hlbiB3ZSBhcmUgZmlsbGluZyB1cCwgc2xvd2x5IHdoZW4gd2UgYXJlCisgICAgICAgKiBqdXN0IHN0YXJ0aW5nIGJlY2F1c2Ugd2UncmUgbm90IHN1cmUgaXQncyBhIGdvb2QgdmFsdWUgeWV0LiAqLworICAgICAgamJ1Zi0+c2tldyA9CisgICAgICAgICAgKHBlcmMgKiBqYnVmLT53aW5kb3dfbWluICsgKCgxMDAwMCAtIHBlcmMpICogamJ1Zi0+c2tldykpIC8gMTAwMDA7CisgICAgICBqYnVmLT53aW5kb3dfc2l6ZSA9IHBvcyArIDE7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIHBpY2sgb2xkIHZhbHVlIGFuZCBzdG9yZSBuZXcgdmFsdWUuIFdlIGtlZXAgdGhlIHByZXZpb3VzIHZhbHVlIGluIG9yZGVyCisgICAgICogdG8gcXVpY2tseSBjaGVjayBpZiB0aGUgbWluIG9mIHRoZSB3aW5kb3cgY2hhbmdlZCAqLworICAgIG9sZCA9IGpidWYtPndpbmRvd1twb3NdOworICAgIGpidWYtPndpbmRvd1twb3MrK10gPSBkZWx0YTsKKworICAgIGlmIChHX1VOTElLRUxZIChkZWx0YSA8PSBqYnVmLT53aW5kb3dfbWluKSkgeworICAgICAgLyogaWYgdGhlIG5ldyB2YWx1ZSB3ZSBpbnNlcnRlZCBpcyBzbWFsbGVyIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IG1pbiwKKyAgICAgICAqIGl0IGJlY29tZXMgdGhlIG5ldyBtaW4gKi8KKyAgICAgIGpidWYtPndpbmRvd19taW4gPSBkZWx0YTsKKyAgICB9IGVsc2UgaWYgKEdfVU5MSUtFTFkgKG9sZCA9PSBqYnVmLT53aW5kb3dfbWluKSkgeworICAgICAgZ2ludDY0IG1pbiA9IEdfTUFYSU5UNjQ7CisKKyAgICAgIC8qIGlmIHdlIHJlbW92ZWQgdGhlIG9sZCBtaW4sIHdlIGhhdmUgdG8gZmluZCBhIG5ldyBtaW4gKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBqYnVmLT53aW5kb3dfc2l6ZTsgaSsrKSB7CisgICAgICAgIC8qIHdlIGZvdW5kIGFub3RoZXIgdmFsdWUgZXF1YWwgdG8gdGhlIG9sZCBtaW4sIHdlIGNhbiBzdG9wIHNlYXJjaGluZyBub3cgKi8KKyAgICAgICAgaWYgKGpidWYtPndpbmRvd1tpXSA9PSBvbGQpIHsKKyAgICAgICAgICBtaW4gPSBvbGQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGpidWYtPndpbmRvd1tpXSA8IG1pbikKKyAgICAgICAgICBtaW4gPSBqYnVmLT53aW5kb3dbaV07CisgICAgICB9CisgICAgICBqYnVmLT53aW5kb3dfbWluID0gbWluOworICAgIH0KKyAgICAvKiBhdmVyYWdlIHRoZSBtaW4gdmFsdWVzICovCisgICAgamJ1Zi0+c2tldyA9IChqYnVmLT53aW5kb3dfbWluICsgKDEyNCAqIGpidWYtPnNrZXcpKSAvIDEyNTsKKyAgICBHU1RfREVCVUcgKCJkZWx0YSAlIiBHX0dJTlQ2NF9GT1JNQVQgIiwgbmV3IG1pbjogJSIgR19HSU5UNjRfRk9STUFULAorICAgICAgICBkZWx0YSwgamJ1Zi0+d2luZG93X21pbik7CisgIH0KKyAgLyogd3JhcCBhcm91bmQgaW4gdGhlIHdpbmRvdyAqLworICBpZiAoR19VTkxJS0VMWSAocG9zID49IGpidWYtPndpbmRvd19zaXplKSkKKyAgICBwb3MgPSAwOworICBqYnVmLT53aW5kb3dfcG9zID0gcG9zOworCitub19za2V3OgorICAvKiB0aGUgb3V0cHV0IHRpbWUgaXMgZGVmaW5lZCBhcyB0aGUgYmFzZSB0aW1lc3RhbXAgcGx1cyB0aGUgUlRQIHRpbWUKKyAgICogYWRqdXN0ZWQgZm9yIHRoZSBjbG9jayBza2V3IC4qLworICBpZiAoamJ1Zi0+YmFzZV90aW1lICE9IC0xKSB7CisgICAgb3V0X3RpbWUgPSBqYnVmLT5iYXNlX3RpbWUgKyBzZW5kX2RpZmY7CisgICAgLyogc2tldyBjYW4gYmUgbmVnYXRpdmUgYW5kIHdlIGRvbid0IHdhbnQgdG8gbWFrZSBpbnZhbGlkIHRpbWVzdGFtcHMgKi8KKyAgICBpZiAoamJ1Zi0+c2tldyA8IDAgJiYgb3V0X3RpbWUgPCAtamJ1Zi0+c2tldykgeworICAgICAgb3V0X3RpbWUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBvdXRfdGltZSArPSBqYnVmLT5za2V3OworICAgIH0KKyAgfSBlbHNlCisgICAgb3V0X3RpbWUgPSAtMTsKKworICBHU1RfREVCVUcgKCJza2V3ICUiIEdfR0lOVDY0X0ZPUk1BVCAiLCBvdXQgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgamJ1Zi0+c2tldywgR1NUX1RJTUVfQVJHUyAob3V0X3RpbWUpKTsKKworICByZXR1cm4gb3V0X3RpbWU7Cit9CisKK3N0YXRpYyB2b2lkCitxdWV1ZV9kb19pbnNlcnQgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYsIEdMaXN0ICogbGlzdCwgR0xpc3QgKiBpdGVtKQoreworICBHUXVldWUgKnF1ZXVlID0gamJ1Zi0+cGFja2V0czsKKworICAvKiBJdCdzIG1vcmUgbGlrZWx5IHRoYXQgdGhlIHBhY2tldCB3YXMgaW5zZXJ0ZWQgYXQgdGhlIHRhaWwgb2YgdGhlIHF1ZXVlICovCisgIGlmIChHX0xJS0VMWSAobGlzdCkpIHsKKyAgICBpdGVtLT5wcmV2ID0gbGlzdDsKKyAgICBpdGVtLT5uZXh0ID0gbGlzdC0+bmV4dDsKKyAgICBsaXN0LT5uZXh0ID0gaXRlbTsKKyAgfSBlbHNlIHsKKyAgICBpdGVtLT5wcmV2ID0gTlVMTDsKKyAgICBpdGVtLT5uZXh0ID0gcXVldWUtPmhlYWQ7CisgICAgcXVldWUtPmhlYWQgPSBpdGVtOworICB9CisgIGlmIChpdGVtLT5uZXh0KQorICAgIGl0ZW0tPm5leHQtPnByZXYgPSBpdGVtOworICBlbHNlCisgICAgcXVldWUtPnRhaWwgPSBpdGVtOworICBxdWV1ZS0+bGVuZ3RoKys7Cit9CisKK0dzdENsb2NrVGltZQorcnRwX2ppdHRlcl9idWZmZXJfY2FsY3VsYXRlX3B0cyAoUlRQSml0dGVyQnVmZmVyICogamJ1ZiwgR3N0Q2xvY2tUaW1lIGR0cywKKyAgICBnYm9vbGVhbiBlc3RpbWF0ZWRfZHRzLCBndWludDMyIHJ0cHRpbWUsIEdzdENsb2NrVGltZSBiYXNlX3RpbWUpCit7CisgIGd1aW50NjQgZXh0X3J0cHRpbWU7CisgIEdzdENsb2NrVGltZSBnc3RydHB0aW1lLCBwdHM7CisgIEdzdENsb2NrICptZWRpYV9jbG9jaywgKnBpcGVsaW5lX2Nsb2NrOworICBndWludDY0IG1lZGlhX2Nsb2NrX29mZnNldDsKKyAgZ2Jvb2xlYW4gcmZjNzI3M19tb2RlOworCisgIC8qIHJ0cCB0aW1lIGp1bXBzIGFyZSBjaGVja2VkIGZvciBkdXJpbmcgc2tldyBjYWxjdWxhdGlvbiwgYnV0IGJ5cGFzc2VkCisgICAqIGluIG90aGVyIG1vZGUsIHNvIG1pbmQgdGhvc2UgaGVyZSBhbmQgcmVzZXQgamIgaWYgbmVlZGVkLgorICAgKiBPbmx5IHJlc2V0IGlmIHZhbGlkIGlucHV0IHRpbWUsIHdoaWNoIGlzIGxpa2VseSBmb3IgVURQIGlucHV0CisgICAqIHdoZXJlIHdlIGV4cGVjdCB0aGlzIG1pZ2h0IGhhcHBlbiBkdWUgdG8gYXN5bmMgdGhyZWFkIGVmZmVjdHMKKyAgICogKGluIHNlZWsgYW5kIHN0YXRlIGNoYW5nZSBjeWNsZXMpLCBidXQgbm90IHNvIG11Y2ggZm9yIFRDUCBpbnB1dCAqLworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGR0cykgJiYgIWVzdGltYXRlZF9kdHMgJiYKKyAgICAgIGpidWYtPm1vZGUgIT0gUlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9TTEFWRSAmJgorICAgICAgamJ1Zi0+YmFzZV90aW1lICE9IC0xICYmIGpidWYtPmxhc3RfcnRwdGltZSAhPSAtMSkgeworICAgIEdzdENsb2NrVGltZSBleHRfcnRwdGltZSA9IGpidWYtPmV4dF9ydHB0aW1lOworCisgICAgZXh0X3J0cHRpbWUgPSBnc3RfcnRwX2J1ZmZlcl9leHRfdGltZXN0YW1wICgmZXh0X3J0cHRpbWUsIHJ0cHRpbWUpOworICAgIGlmIChleHRfcnRwdGltZSA+IGpidWYtPmxhc3RfcnRwdGltZSArIDMgKiBqYnVmLT5jbG9ja19yYXRlIHx8CisgICAgICAgIGV4dF9ydHB0aW1lICsgMyAqIGpidWYtPmNsb2NrX3JhdGUgPCBqYnVmLT5sYXN0X3J0cHRpbWUpIHsKKyAgICAgIC8qIHJlc2V0IGV2ZW4gaWYgd2UgZG9uJ3QgaGF2ZSB2YWxpZCBpbmNvbWluZyB0aW1lOworICAgICAgICogc3RpbGwgYmV0dGVyIHRoYW4gcHJvZHVjaW5nIHBvc3NpYmx5IHZlcnkgYm9ndXMgb3V0cHV0IHRpbWVzdGFtcCAqLworICAgICAgR1NUX1dBUk5JTkcgKCJydHAgZGVsdGEgdG9vIGJpZywgcmVzZXQgc2tldyIpOworICAgICAgcnRwX2ppdHRlcl9idWZmZXJfcmVzZXRfc2tldyAoamJ1Zik7CisgICAgfQorICB9CisKKyAgLyogUmV0dXJuIHRoZSBsYXN0IHRpbWUgaWYgd2UgZ290IHRoZSBzYW1lIFJUUCB0aW1lc3RhbXAgYWdhaW4gKi8KKyAgZXh0X3J0cHRpbWUgPSBnc3RfcnRwX2J1ZmZlcl9leHRfdGltZXN0YW1wICgmamJ1Zi0+ZXh0X3J0cHRpbWUsIHJ0cHRpbWUpOworICBpZiAoamJ1Zi0+bGFzdF9ydHB0aW1lICE9IC0xICYmIGV4dF9ydHB0aW1lID09IGpidWYtPmxhc3RfcnRwdGltZSkgeworICAgIHJldHVybiBqYnVmLT5wcmV2X291dF90aW1lOworICB9CisKKyAgLyoga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBleHRlbmRlZCBydHB0aW1lICovCisgIGpidWYtPmxhc3RfcnRwdGltZSA9IGV4dF9ydHB0aW1lOworCisgIGdfbXV0ZXhfbG9jayAoJmpidWYtPmNsb2NrX2xvY2spOworICBtZWRpYV9jbG9jayA9IGpidWYtPm1lZGlhX2Nsb2NrID8gZ3N0X29iamVjdF9yZWYgKGpidWYtPm1lZGlhX2Nsb2NrKSA6IE5VTEw7CisgIHBpcGVsaW5lX2Nsb2NrID0KKyAgICAgIGpidWYtPnBpcGVsaW5lX2Nsb2NrID8gZ3N0X29iamVjdF9yZWYgKGpidWYtPnBpcGVsaW5lX2Nsb2NrKSA6IE5VTEw7CisgIG1lZGlhX2Nsb2NrX29mZnNldCA9IGpidWYtPm1lZGlhX2Nsb2NrX29mZnNldDsKKyAgZ19tdXRleF91bmxvY2sgKCZqYnVmLT5jbG9ja19sb2NrKTsKKworICBnc3RydHB0aW1lID0KKyAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKGV4dF9ydHB0aW1lLCBHU1RfU0VDT05ELCBqYnVmLT5jbG9ja19yYXRlKTsKKworICBpZiAoR19MSUtFTFkgKGpidWYtPmJhc2VfcnRwdGltZSAhPSAtMSkpIHsKKyAgICAvKiBjaGVjayBlbGFwc2VkIHRpbWUgaW4gUlRQIHVuaXRzICovCisgICAgaWYgKGdzdHJ0cHRpbWUgPCBqYnVmLT5iYXNlX3J0cHRpbWUpIHsKKyAgICAgIC8qIGVsYXBzZWQgdGltZSBhdCBzZW5kZXIsIHRpbWVzdGFtcHMgY2FuIGdvIGJhY2t3YXJkcyBhbmQgdGh1cyBiZQorICAgICAgICogc21hbGxlciB0aGFuIG91ciBiYXNlIHRpbWUsIHNjaGVkdWxlIHRvIHRha2UgYSBuZXcgYmFzZSB0aW1lIGluCisgICAgICAgKiB0aGF0IGNhc2UuICovCisgICAgICBHU1RfV0FSTklORyAoImJhY2t3YXJkIHRpbWVzdGFtcHMgYXQgc2VydmVyLCBzY2hlZHVsZSByZXN5bmMiKTsKKyAgICAgIGpidWYtPm5lZWRfcmVzeW5jID0gVFJVRTsKKyAgICB9CisgIH0KKworICBzd2l0Y2ggKGpidWYtPm1vZGUpIHsKKyAgICBjYXNlIFJUUF9KSVRURVJfQlVGRkVSX01PREVfTk9ORToKKyAgICBjYXNlIFJUUF9KSVRURVJfQlVGRkVSX01PREVfQlVGRkVSOgorICAgICAgLyogc2VuZCAwIGFzIHRoZSBmaXJzdCB0aW1lc3RhbXAgYW5kIC0xIGZvciB0aGUgb3RoZXIgb25lcy4gVGhpcyB3aWxsCisgICAgICAgKiBpbnRlcnBvbGF0ZSB0aGVtIGZyb20gdGhlIFJUUCB0aW1lc3RhbXBzIHdpdGggYSAwIG9yaWdpbi4gSW4gYnVmZmVyaW5nCisgICAgICAgKiBtb2RlIHdlIHdpbGwgYWRqdXN0IHRoZSBvdXRnb2luZyB0aW1lc3RhbXBzIGFjY29yZGluZyB0byB0aGUgYW1vdW50IG9mCisgICAgICAgKiB0aW1lIHdlIHNwZW50IGJ1ZmZlcmluZy4gKi8KKyAgICAgIGlmIChqYnVmLT5iYXNlX3RpbWUgPT0gLTEpCisgICAgICAgIGR0cyA9IDA7CisgICAgICBlbHNlCisgICAgICAgIGR0cyA9IC0xOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX1NZTkNFRDoKKyAgICAgIC8qIHN5bmNocm9uaXplZCBjbG9ja3MsIHRha2UgZmlyc3QgdGltZXN0YW1wIGFzIGJhc2UsIHVzZSBSVFAgdGltZXN0YW1wcworICAgICAgICogdG8gaW50ZXJwb2xhdGUgKi8KKyAgICAgIGlmIChqYnVmLT5iYXNlX3RpbWUgIT0gLTEgJiYgIWpidWYtPm5lZWRfcmVzeW5jKQorICAgICAgICBkdHMgPSAtMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9TTEFWRToKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBuZWVkIHJlc3luYywgbG9jayBvbiB0byB0aW1lIGFuZCBnc3RydHB0aW1lIGlmIHdlIGNhbiwgb3RoZXJ3aXNlIHdlCisgICAqIGRvIHdpdGggdGhlIHByZXZpb3VzIHZhbHVlcyAqLworICBpZiAoR19VTkxJS0VMWSAoamJ1Zi0+bmVlZF9yZXN5bmMgJiYgZHRzICE9IC0xKSkgeworICAgIEdTVF9JTkZPICgicmVzeW5jIHRvIHRpbWUgJSIgR1NUX1RJTUVfRk9STUFUICIsIHJ0cHRpbWUgJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChkdHMpLCBHU1RfVElNRV9BUkdTIChnc3RydHB0aW1lKSk7CisgICAgcnRwX2ppdHRlcl9idWZmZXJfcmVzeW5jIChqYnVmLCBkdHMsIGdzdHJ0cHRpbWUsIGV4dF9ydHB0aW1lLCBGQUxTRSk7CisgIH0KKworICBHU1RfREVCVUcgKCJleHRydHAgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBnc3RydHAgJSIgR1NUX1RJTUVfRk9STUFUICIsIGJhc2UgJSIKKyAgICAgIEdTVF9USU1FX0ZPUk1BVCAiLCBzZW5kX2RpZmYgJSIgR1NUX1RJTUVfRk9STUFULCBleHRfcnRwdGltZSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKGdzdHJ0cHRpbWUpLCBHU1RfVElNRV9BUkdTIChqYnVmLT5iYXNlX3J0cHRpbWUpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoZ3N0cnRwdGltZSAtIGpidWYtPmJhc2VfcnRwdGltZSkpOworCisgIHJmYzcyNzNfbW9kZSA9IG1lZGlhX2Nsb2NrICYmIHBpcGVsaW5lX2Nsb2NrCisgICAgICAmJiBnc3RfY2xvY2tfaXNfc3luY2VkIChtZWRpYV9jbG9jayk7CisKKyAgaWYgKHJmYzcyNzNfbW9kZSAmJiBqYnVmLT5tb2RlID09IFJUUF9KSVRURVJfQlVGRkVSX01PREVfU0xBVkUKKyAgICAgICYmIChtZWRpYV9jbG9ja19vZmZzZXQgPT0gLTEgfHwgIWpidWYtPnJmYzcyNzNfc3luYykpIHsKKyAgICBHc3RDbG9ja1RpbWUgaW50ZXJuYWwsIGV4dGVybmFsOworICAgIEdzdENsb2NrVGltZSByYXRlX251bSwgcmF0ZV9kZW5vbTsKKyAgICBHc3RDbG9ja1RpbWUgbnNydHB0aW1lZGlmZiwgcnRwbnRwdGltZSwgcnRwc3lzdGltZTsKKworICAgIGdzdF9jbG9ja19nZXRfY2FsaWJyYXRpb24gKG1lZGlhX2Nsb2NrLCAmaW50ZXJuYWwsICZleHRlcm5hbCwgJnJhdGVfbnVtLAorICAgICAgICAmcmF0ZV9kZW5vbSk7CisKKyAgICAvKiBTbGF2ZSB0byB0aGUgUkZDNzI3MyBtZWRpYSBjbG9jayBpbnN0ZWFkIG9mIHRyeWluZyB0byBlc3RpbWF0ZSBpdAorICAgICAqIGJhc2VkIG9uIHJlY2VpdmUgdGltZXMgYW5kIFJUUCB0aW1lc3RhbXBzICovCisKKyAgICBpZiAoamJ1Zi0+bWVkaWFfY2xvY2tfYmFzZV90aW1lID09IC0xKSB7CisgICAgICBpZiAoamJ1Zi0+YmFzZV90aW1lICE9IC0xKSB7CisgICAgICAgIGpidWYtPm1lZGlhX2Nsb2NrX2Jhc2VfdGltZSA9CisgICAgICAgICAgICBnc3RfY2xvY2tfdW5hZGp1c3Rfd2l0aF9jYWxpYnJhdGlvbiAobWVkaWFfY2xvY2ssCisgICAgICAgICAgICBqYnVmLT5iYXNlX3RpbWUgKyBiYXNlX3RpbWUsIGludGVybmFsLCBleHRlcm5hbCwgcmF0ZV9udW0sCisgICAgICAgICAgICByYXRlX2Rlbm9tKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkdHMgIT0gLTEpCisgICAgICAgICAgamJ1Zi0+bWVkaWFfY2xvY2tfYmFzZV90aW1lID0KKyAgICAgICAgICAgICAgZ3N0X2Nsb2NrX3VuYWRqdXN0X3dpdGhfY2FsaWJyYXRpb24gKG1lZGlhX2Nsb2NrLCBkdHMgKyBiYXNlX3RpbWUsCisgICAgICAgICAgICAgIGludGVybmFsLCBleHRlcm5hbCwgcmF0ZV9udW0sIHJhdGVfZGVub20pOworICAgICAgICBlbHNlCisgICAgICAgICAgamJ1Zi0+bWVkaWFfY2xvY2tfYmFzZV90aW1lID0KKyAgICAgICAgICAgICAgZ3N0X2Nsb2NrX2dldF9pbnRlcm5hbF90aW1lIChtZWRpYV9jbG9jayk7CisgICAgICAgIGpidWYtPmJhc2VfcnRwdGltZSA9IGdzdHJ0cHRpbWU7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGdzdHJ0cHRpbWUgPiBqYnVmLT5iYXNlX3J0cHRpbWUpCisgICAgICBuc3J0cHRpbWVkaWZmID0gZ3N0cnRwdGltZSAtIGpidWYtPmJhc2VfcnRwdGltZTsKKyAgICBlbHNlCisgICAgICBuc3J0cHRpbWVkaWZmID0gMDsKKworICAgIHJ0cG50cHRpbWUgPSBuc3J0cHRpbWVkaWZmICsgamJ1Zi0+bWVkaWFfY2xvY2tfYmFzZV90aW1lOworCisgICAgcnRwc3lzdGltZSA9CisgICAgICAgIGdzdF9jbG9ja19hZGp1c3Rfd2l0aF9jYWxpYnJhdGlvbiAobWVkaWFfY2xvY2ssIHJ0cG50cHRpbWUsIGludGVybmFsLAorICAgICAgICBleHRlcm5hbCwgcmF0ZV9udW0sIHJhdGVfZGVub20pOworCisgICAgaWYgKHJ0cHN5c3RpbWUgPiBiYXNlX3RpbWUpCisgICAgICBwdHMgPSBydHBzeXN0aW1lIC0gYmFzZV90aW1lOworICAgIGVsc2UKKyAgICAgIHB0cyA9IDA7CisKKyAgICBHU1RfREVCVUcgKCJSRkM3MjczIGNsb2NrIHRpbWUgJSIgR1NUX1RJTUVfRk9STUFUICIsIG91dCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHJ0cHN5c3RpbWUpLCBHU1RfVElNRV9BUkdTIChwdHMpKTsKKyAgfSBlbHNlIGlmIChyZmM3MjczX21vZGUgJiYgKGpidWYtPm1vZGUgPT0gUlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9TTEFWRQorICAgICAgICAgIHx8IGpidWYtPm1vZGUgPT0gUlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9TWU5DRUQpCisgICAgICAmJiBtZWRpYV9jbG9ja19vZmZzZXQgIT0gLTEgJiYgamJ1Zi0+cmZjNzI3M19zeW5jKSB7CisgICAgR3N0Q2xvY2tUaW1lIG50cHRpbWUsIHJ0cHRpbWVfdG1wOworICAgIEdzdENsb2NrVGltZSBudHBydHB0aW1lLCBydHBzeXN0aW1lOworICAgIEdzdENsb2NrVGltZSBpbnRlcm5hbCwgZXh0ZXJuYWw7CisgICAgR3N0Q2xvY2tUaW1lIHJhdGVfbnVtLCByYXRlX2Rlbm9tOworCisgICAgLyogRG9uJ3QgZG8gYW55IG9mIHRoZSBkdHMgcmVsYXRlZCBhZGp1c3RtZW50cyBmdXJ0aGVyIGRvd24gKi8KKyAgICBkdHMgPSAtMTsKKworICAgIC8qIENhbGN1bGF0ZSB0aGUgYWN0dWFsIGNsb2NrIHRpbWUgb24gdGhlIHNlbmRlciBzaWRlIGJhc2VkIG9uIHRoZQorICAgICAqIFJGQzcyNzMgY2xvY2sgYW5kIGNvbnZlcnQgaXQgdG8gb3VyIHBpcGVsaW5lIGNsb2NrCisgICAgICovCisKKyAgICBnc3RfY2xvY2tfZ2V0X2NhbGlicmF0aW9uIChtZWRpYV9jbG9jaywgJmludGVybmFsLCAmZXh0ZXJuYWwsICZyYXRlX251bSwKKyAgICAgICAgJnJhdGVfZGVub20pOworCisgICAgbnRwdGltZSA9IGdzdF9jbG9ja19nZXRfaW50ZXJuYWxfdGltZSAobWVkaWFfY2xvY2spOworCisgICAgbnRwcnRwdGltZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAobnRwdGltZSwgamJ1Zi0+Y2xvY2tfcmF0ZSwgR1NUX1NFQ09ORCk7CisgICAgbnRwcnRwdGltZSArPSBtZWRpYV9jbG9ja19vZmZzZXQ7CisgICAgbnRwcnRwdGltZSAmPSAweGZmZmZmZmZmOworCisgICAgcnRwdGltZV90bXAgPSBydHB0aW1lOworICAgIC8qIENoZWNrIGZvciB3cmFwYXJvdW5kcywgd2UgYXNzdW1lIHRoYXQgdGhlIGRpZmYgYmV0d2VlbiBjdXJyZW50IFJUUAorICAgICAqIHRpbWVzdGFtcCBhbmQgY3VycmVudCBtZWRpYSBjbG9jayB0aW1lIGNhbid0IGJlIGJpZ2dlciB0aGFuCisgICAgICogMioqMzEgY2xvY2sgdW5pdHMgKi8KKyAgICBpZiAobnRwcnRwdGltZSA+IHJ0cHRpbWVfdG1wICYmIG50cHJ0cHRpbWUgLSBydHB0aW1lX3RtcCA+PSAweDgwMDAwMDAwKQorICAgICAgcnRwdGltZV90bXAgKz0gR19HVUlOVDY0X0NPTlNUQU5UICgweDEwMDAwMDAwMCk7CisgICAgZWxzZSBpZiAocnRwdGltZV90bXAgPiBudHBydHB0aW1lICYmIHJ0cHRpbWVfdG1wIC0gbnRwcnRwdGltZSA+PSAweDgwMDAwMDAwKQorICAgICAgbnRwcnRwdGltZSArPSBHX0dVSU5UNjRfQ09OU1RBTlQgKDB4MTAwMDAwMDAwKTsKKworICAgIGlmIChudHBydHB0aW1lID4gcnRwdGltZV90bXApCisgICAgICBudHB0aW1lIC09CisgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChudHBydHB0aW1lIC0gcnRwdGltZV90bXAsIGpidWYtPmNsb2NrX3JhdGUsCisgICAgICAgICAgR1NUX1NFQ09ORCk7CisgICAgZWxzZQorICAgICAgbnRwdGltZSArPQorICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAocnRwdGltZV90bXAgLSBudHBydHB0aW1lLCBqYnVmLT5jbG9ja19yYXRlLAorICAgICAgICAgIEdTVF9TRUNPTkQpOworCisgICAgcnRwc3lzdGltZSA9CisgICAgICAgIGdzdF9jbG9ja19hZGp1c3Rfd2l0aF9jYWxpYnJhdGlvbiAobWVkaWFfY2xvY2ssIG50cHRpbWUsIGludGVybmFsLAorICAgICAgICBleHRlcm5hbCwgcmF0ZV9udW0sIHJhdGVfZGVub20pOworICAgIC8qIEFsbCB0aGlzIGFzc3VtZXMgdGhhdCB0aGUgcGlwZWxpbmUgaGFzIGVub3VnaCBhZGRpdGlvbmFsCisgICAgICogbGF0ZW5jeSB0byBjb3ZlciBmb3IgdGhlIG5ldHdvcmsgZGVsYXkgKi8KKyAgICBpZiAocnRwc3lzdGltZSA+IGJhc2VfdGltZSkKKyAgICAgIHB0cyA9IHJ0cHN5c3RpbWUgLSBiYXNlX3RpbWU7CisgICAgZWxzZQorICAgICAgcHRzID0gMDsKKworICAgIEdTVF9ERUJVRyAoIlJGQzcyNzMgY2xvY2sgdGltZSAlIiBHU1RfVElNRV9GT1JNQVQgIiwgb3V0ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAocnRwc3lzdGltZSksIEdTVF9USU1FX0FSR1MgKHB0cykpOworICB9IGVsc2UgeworICAgIC8qIElmIHdlIHVzZWQgdGhlIFJGQzcyNzMgY2xvY2sgYmVmb3JlIGFuZCBub3QgYW55bW9yZSwKKyAgICAgKiB3ZSBuZWVkIHRvIHJlc3luYyBpdCBsYXRlciBhZ2FpbiAqLworICAgIGpidWYtPm1lZGlhX2Nsb2NrX2Jhc2VfdGltZSA9IC0xOworCisgICAgLyogZG8gc2tldyBjYWxjdWxhdGlvbiBieSBtZWFzdXJpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBydHB0aW1lIGFuZCB0aGUKKyAgICAgKiByZWNlaXZlIGR0cywgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgc2tldyBjb3JyZWN0ZWQgcnRwdGltZS4gKi8KKyAgICBwdHMgPSBjYWxjdWxhdGVfc2tldyAoamJ1ZiwgZXh0X3J0cHRpbWUsIGdzdHJ0cHRpbWUsIGR0cyk7CisgIH0KKworICAvKiBjaGVjayBpZiB0aW1lc3RhbXBzIGFyZSBub3QgZ29pbmcgYmFja3dhcmRzLCB3ZSBjYW4gb25seSBjaGVjayB0aGlzIGlmIHdlCisgICAqIGhhdmUgYSBwcmV2aW91cyBvdXQgdGltZSBhbmQgYSBwcmV2aW91cyBzZW5kX2RpZmYgKi8KKyAgaWYgKEdfTElLRUxZIChwdHMgIT0gLTEgJiYgamJ1Zi0+cHJldl9vdXRfdGltZSAhPSAtMQorICAgICAgICAgICYmIGpidWYtPnByZXZfc2VuZF9kaWZmICE9IC0xKSkgeworICAgIC8qIG5vdyBjaGVjayBmb3IgYmFja3dhcmRzIHRpbWVzdGFtcHMgKi8KKyAgICBpZiAoR19VTkxJS0VMWSAoCisgICAgICAgICAgICAvKiBpZiB0aGUgc2VydmVyIHRpbWVzdGFtcHMgd2VudCB1cCBhbmQgdGhlIG91dF90aW1lIGJhY2t3YXJkcyAqLworICAgICAgICAgICAgKGdzdHJ0cHRpbWUgLSBqYnVmLT5iYXNlX3J0cHRpbWUgPiBqYnVmLT5wcmV2X3NlbmRfZGlmZgorICAgICAgICAgICAgICAgICYmIHB0cyA8IGpidWYtPnByZXZfb3V0X3RpbWUpIHx8CisgICAgICAgICAgICAvKiBpZiB0aGUgc2VydmVyIHRpbWVzdGFtcHMgd2VudCBiYWNrd2FyZHMgYW5kIHRoZSBvdXRfdGltZSBmb3J3YXJkcyAqLworICAgICAgICAgICAgKGdzdHJ0cHRpbWUgLSBqYnVmLT5iYXNlX3J0cHRpbWUgPCBqYnVmLT5wcmV2X3NlbmRfZGlmZgorICAgICAgICAgICAgICAgICYmIHB0cyA+IGpidWYtPnByZXZfb3V0X3RpbWUpIHx8CisgICAgICAgICAgICAvKiBpZiB0aGUgc2VydmVyIHRpbWVzdGFtcHMgZGlkIG5vdCBjaGFuZ2UgKi8KKyAgICAgICAgICAgIGdzdHJ0cHRpbWUgLSBqYnVmLT5iYXNlX3J0cHRpbWUgPT0gamJ1Zi0+cHJldl9zZW5kX2RpZmYpKSB7CisgICAgICBHU1RfREVCVUcgKCJiYWNrd2FyZHMgdGltZXN0YW1wcywgdXNpbmcgcHJldmlvdXMgdGltZSIpOworICAgICAgcHRzID0gamJ1Zi0+cHJldl9vdXRfdGltZTsKKyAgICB9CisgIH0KKworICBpZiAoZHRzICE9IC0xICYmIHB0cyArIGpidWYtPmRlbGF5IDwgZHRzKSB7CisgICAgLyogaWYgd2UgYXJlIGdvaW5nIHRvIHByb2R1Y2UgYSB0aW1lc3RhbXAgdGhhdCBpcyBsYXRlciB0aGFuIHRoZSBpbnB1dAorICAgICAqIHRpbWVzdGFtcCwgd2UgbmVlZCB0byByZXNldCB0aGUgaml0dGVyYnVmZmVyLiBMaWtlbHkgdGhlIHNlcnZlciBwYXVzZWQKKyAgICAgKiB0ZW1wb3JhcmlseSAqLworICAgIEdTVF9ERUJVRyAoIm91dCAlIiBHU1RfVElNRV9GT1JNQVQgIiArICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiA8IHRpbWUgJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFUICIsIHJlc2V0IGppdHRlcmJ1ZmZlciIsIEdTVF9USU1FX0FSR1MgKHB0cyksCisgICAgICAgIGpidWYtPmRlbGF5LCBHU1RfVElNRV9BUkdTIChkdHMpKTsKKyAgICBydHBfaml0dGVyX2J1ZmZlcl9yZXN5bmMgKGpidWYsIGR0cywgZ3N0cnRwdGltZSwgZXh0X3J0cHRpbWUsIFRSVUUpOworICAgIHB0cyA9IGR0czsKKyAgfQorCisgIGpidWYtPnByZXZfb3V0X3RpbWUgPSBwdHM7CisgIGpidWYtPnByZXZfc2VuZF9kaWZmID0gZ3N0cnRwdGltZSAtIGpidWYtPmJhc2VfcnRwdGltZTsKKworICBpZiAobWVkaWFfY2xvY2spCisgICAgZ3N0X29iamVjdF91bnJlZiAobWVkaWFfY2xvY2spOworICBpZiAocGlwZWxpbmVfY2xvY2spCisgICAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmVfY2xvY2spOworCisgIHJldHVybiBwdHM7Cit9CisKKworLyoqCisgKiBydHBfaml0dGVyX2J1ZmZlcl9pbnNlcnQ6CisgKiBAamJ1ZjogYW4gI1JUUEppdHRlckJ1ZmZlcgorICogQGl0ZW06IGFuICNSVFBKaXR0ZXJCdWZmZXJJdGVtIHRvIGluc2VydAorICogQGhlYWQ6IFRSVUUgd2hlbiB0aGUgaGVhZCBlbGVtZW50IGNoYW5nZWQuCisgKiBAcGVyY2VudDogdGhlIGJ1ZmZlcmluZyBwZXJjZW50IGFmdGVyIGluc2VydGlvbgorICoKKyAqIEluc2VydHMgQGl0ZW0gaW50byB0aGUgcGFja2V0IHF1ZXVlIG9mIEBqYnVmLiBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZQorICogcGFja2V0IHdpbGwgYmUgdXNlZCB0byBzb3J0IHRoZSBwYWNrZXRzLiBUaGlzIGZ1bmN0aW9uIHRha2VzIG93bmVyaGlwIG9mCisgKiBAYnVmIHdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMgJVRSVUUuCisgKgorICogV2hlbiBAaGVhZCBpcyAlVFJVRSwgdGhlIG5ldyBwYWNrZXQgd2FzIGFkZGVkIGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBhbmQKKyAqIHdpbGwgYmUgYXZhaWxhYmxlIHdpdGggdGhlIG5leHQgY2FsbCB0byBydHBfaml0dGVyX2J1ZmZlcl9wb3AoKSBhbmQKKyAqIHJ0cF9qaXR0ZXJfYnVmZmVyX3BlZWsoKS4KKyAqCisgKiBSZXR1cm5zOiAlRkFMU0UgaWYgYSBwYWNrZXQgd2l0aCB0aGUgc2FtZSBudW1iZXIgYWxyZWFkeSBleGlzdGVkLgorICovCitnYm9vbGVhbgorcnRwX2ppdHRlcl9idWZmZXJfaW5zZXJ0IChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmLCBSVFBKaXR0ZXJCdWZmZXJJdGVtICogaXRlbSwKKyAgICBnYm9vbGVhbiAqIGhlYWQsIGdpbnQgKiBwZXJjZW50KQoreworICBHTGlzdCAqbGlzdCwgKmV2ZW50ID0gTlVMTDsKKyAgZ3VpbnQxNiBzZXFudW07CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGpidWYgIT0gTlVMTCwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoaXRlbSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgbGlzdCA9IGpidWYtPnBhY2tldHMtPnRhaWw7CisKKyAgLyogbm8gc2VxbnVtLCBzaW1wbHkgYXBwZW5kIHRoZW4gKi8KKyAgaWYgKGl0ZW0tPnNlcW51bSA9PSAtMSkKKyAgICBnb3RvIGFwcGVuZDsKKworICBzZXFudW0gPSBpdGVtLT5zZXFudW07CisKKyAgLyogbG9vcCB0aGUgbGlzdCB0byBza2lwIHN0cmljdGx5IGxhcmdlciBzZXFudW0gYnVmZmVycyAqLworICBmb3IgKDsgbGlzdDsgbGlzdCA9IGdfbGlzdF9wcmV2aW91cyAobGlzdCkpIHsKKyAgICBndWludDE2IHFzZXE7CisgICAgZ2ludCBnYXA7CisgICAgUlRQSml0dGVyQnVmZmVySXRlbSAqcWl0ZW0gPSAoUlRQSml0dGVyQnVmZmVySXRlbSAqKSBsaXN0OworCisgICAgaWYgKHFpdGVtLT5zZXFudW0gPT0gLTEpIHsKKyAgICAgIC8qIGtlZXAgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjb25zZWN1dGl2ZSBldmVudCBpZiBub3QgYWxyZWFkeQorICAgICAgICogc2V0LiB3ZSB3aWxsIGluc2VydCB0aGUgcGFja2V0IGFmdGVyIHRoZSBldmVudCBpZiB3ZSBjYW4ndCBmaW5kCisgICAgICAgKiBhIHBhY2tldCB3aXRoIGxvd2VyIHNlcXVlbmNlIG51bWJlciBiZWZvcmUgdGhlIGV2ZW50LiAqLworICAgICAgaWYgKGV2ZW50ID09IE5VTEwpCisgICAgICAgIGV2ZW50ID0gbGlzdDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHFzZXEgPSBxaXRlbS0+c2VxbnVtOworCisgICAgLyogY29tcGFyZSB0aGUgbmV3IHNlcW51bSB0byB0aGUgb25lIGluIHRoZSBidWZmZXIgKi8KKyAgICBnYXAgPSBnc3RfcnRwX2J1ZmZlcl9jb21wYXJlX3NlcW51bSAoc2VxbnVtLCBxc2VxKTsKKworICAgIC8qIHdlIGhpdCBhIHBhY2tldCB3aXRoIHRoZSBzYW1lIHNlcW51bSwgbm90aWZ5IGEgZHVwbGljYXRlICovCisgICAgaWYgKEdfVU5MSUtFTFkgKGdhcCA9PSAwKSkKKyAgICAgIGdvdG8gZHVwbGljYXRlOworCisgICAgLyogc2VxbnVtID4gcXNlcSwgd2UgY2FuIHN0b3AgbG9va2luZyAqLworICAgIGlmIChHX0xJS0VMWSAoZ2FwIDwgMCkpCisgICAgICBicmVhazsKKworICAgIC8qIGlmIHdlJ3ZlIGZvdW5kIGEgcGFja2V0IHdpdGggZ3JlYXRlciBzZXF1ZW5jZSBudW1iZXIsIGNsZWFudXAgdGhlCisgICAgICogZXZlbnQgcG9pbnRlciBhcyB0aGUgcGFja2V0IHdpbGwgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBldmVudCAqLworICAgIGV2ZW50ID0gTlVMTDsKKyAgfQorCisgIC8qIGlmIGV2ZW50IGlzIHNldCBpdCBtZWFucyB0aGF0IHBhY2tldHMgYmVmb3JlIHRoZSBldmVudCBoYWQgc21hbGxlcgorICAgKiBzZXF1ZW5jZSBudW1iZXIsIHNvIHdlIHdpbGwgaW5zZXJ0IG91ciBwYWNrZXQgYWZ0ZXIgdGhlIGV2ZW50ICovCisgIGlmIChldmVudCkKKyAgICBsaXN0ID0gZXZlbnQ7CisKK2FwcGVuZDoKKyAgcXVldWVfZG9faW5zZXJ0IChqYnVmLCBsaXN0LCAoR0xpc3QgKikgaXRlbSk7CisKKyAgLyogYnVmZmVyaW5nIG1vZGUsIHVwZGF0ZSBidWZmZXIgc3RhdHMgKi8KKyAgaWYgKGpidWYtPm1vZGUgPT0gUlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9CVUZGRVIpCisgICAgdXBkYXRlX2J1ZmZlcl9sZXZlbCAoamJ1ZiwgcGVyY2VudCk7CisgIGVsc2UgaWYgKHBlcmNlbnQpCisgICAgKnBlcmNlbnQgPSAtMTsKKworICAvKiBoZWFkIHdhcyBjaGFuZ2VkIHdoZW4gd2UgZGlkIG5vdCBmaW5kIGEgcHJldmlvdXMgcGFja2V0LCB3ZSBzZXQgdGhlIHJldHVybgorICAgKiBmbGFnIHdoZW4gcmVxdWVzdGVkLiAqLworICBpZiAoR19MSUtFTFkgKGhlYWQpKQorICAgICpoZWFkID0gKGxpc3QgPT0gTlVMTCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitkdXBsaWNhdGU6CisgIHsKKyAgICBHU1RfREVCVUcgKCJkdXBsaWNhdGUgcGFja2V0ICVkIGZvdW5kIiwgKGdpbnQpIHNlcW51bSk7CisgICAgaWYgKEdfTElLRUxZIChoZWFkKSkKKyAgICAgICpoZWFkID0gRkFMU0U7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qKgorICogcnRwX2ppdHRlcl9idWZmZXJfcG9wOgorICogQGpidWY6IGFuICNSVFBKaXR0ZXJCdWZmZXIKKyAqIEBwZXJjZW50OiB0aGUgYnVmZmVyaW5nIHBlcmNlbnQKKyAqCisgKiBQb3BzIHRoZSBvbGRlc3QgYnVmZmVyIGZyb20gdGhlIHBhY2tldCBxdWV1ZSBvZiBAamJ1Zi4gVGhlIHBvcHBlZCBidWZmZXIgd2lsbAorICogaGF2ZSBpdHMgdGltZXN0YW1wIGFkanVzdGVkIHdpdGggdGhlIGluY29tbWluZyBydW5uaW5nX3RpbWUgYW5kIHRoZSBkZXRlY3RlZAorICogY2xvY2sgc2tldy4KKyAqCisgKiBSZXR1cm5zOiBhICNHc3RCdWZmZXIgb3IgJU5VTEwgd2hlbiB0aGVyZSB3YXMgbm8gcGFja2V0IGluIHRoZSBxdWV1ZS4KKyAqLworUlRQSml0dGVyQnVmZmVySXRlbSAqCitydHBfaml0dGVyX2J1ZmZlcl9wb3AgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYsIGdpbnQgKiBwZXJjZW50KQoreworICBHTGlzdCAqaXRlbSA9IE5VTEw7CisgIEdRdWV1ZSAqcXVldWU7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGpidWYgIT0gTlVMTCwgTlVMTCk7CisKKyAgcXVldWUgPSBqYnVmLT5wYWNrZXRzOworCisgIGl0ZW0gPSBxdWV1ZS0+aGVhZDsKKyAgaWYgKGl0ZW0pIHsKKyAgICBxdWV1ZS0+aGVhZCA9IGl0ZW0tPm5leHQ7CisgICAgaWYgKHF1ZXVlLT5oZWFkKQorICAgICAgcXVldWUtPmhlYWQtPnByZXYgPSBOVUxMOworICAgIGVsc2UKKyAgICAgIHF1ZXVlLT50YWlsID0gTlVMTDsKKyAgICBxdWV1ZS0+bGVuZ3RoLS07CisgIH0KKworICAvKiBidWZmZXJpbmcgbW9kZSwgdXBkYXRlIGJ1ZmZlciBzdGF0cyAqLworICBpZiAoamJ1Zi0+bW9kZSA9PSBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX0JVRkZFUikKKyAgICB1cGRhdGVfYnVmZmVyX2xldmVsIChqYnVmLCBwZXJjZW50KTsKKyAgZWxzZSBpZiAocGVyY2VudCkKKyAgICAqcGVyY2VudCA9IC0xOworCisgIHJldHVybiAoUlRQSml0dGVyQnVmZmVySXRlbSAqKSBpdGVtOworfQorCisvKioKKyAqIHJ0cF9qaXR0ZXJfYnVmZmVyX3BlZWs6CisgKiBAamJ1ZjogYW4gI1JUUEppdHRlckJ1ZmZlcgorICoKKyAqIFBlZWsgdGhlIG9sZGVzdCBidWZmZXIgZnJvbSB0aGUgcGFja2V0IHF1ZXVlIG9mIEBqYnVmLgorICoKKyAqIFNlZSBydHBfaml0dGVyX2J1ZmZlcl9pbnNlcnQoKSB0byBjaGVjayB3aGVuIGFuIG9sZGVyIHBhY2tldCB3YXMKKyAqIGFkZGVkLgorICoKKyAqIFJldHVybnM6IGEgI0dzdEJ1ZmZlciBvciAlTlVMTCB3aGVuIHRoZXJlIHdhcyBubyBwYWNrZXQgaW4gdGhlIHF1ZXVlLgorICovCitSVFBKaXR0ZXJCdWZmZXJJdGVtICoKK3J0cF9qaXR0ZXJfYnVmZmVyX3BlZWsgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChqYnVmICE9IE5VTEwsIE5VTEwpOworCisgIHJldHVybiAoUlRQSml0dGVyQnVmZmVySXRlbSAqKSBqYnVmLT5wYWNrZXRzLT5oZWFkOworfQorCisvKioKKyAqIHJ0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoOgorICogQGpidWY6IGFuICNSVFBKaXR0ZXJCdWZmZXIKKyAqIEBmcmVlX2Z1bmM6IGZ1bmN0aW9uIHRvIGZyZWUgZWFjaCBpdGVtCisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgcGFzc2VkIHRvIEBmcmVlX2Z1bmMKKyAqCisgKiBGbHVzaCBhbGwgcGFja2V0cyBmcm9tIHRoZSBqaXR0ZXJidWZmZXIuCisgKi8KK3ZvaWQKK3J0cF9qaXR0ZXJfYnVmZmVyX2ZsdXNoIChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmLCBHRnVuYyBmcmVlX2Z1bmMsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHTGlzdCAqaXRlbTsKKworICBnX3JldHVybl9pZl9mYWlsIChqYnVmICE9IE5VTEwpOworICBnX3JldHVybl9pZl9mYWlsIChmcmVlX2Z1bmMgIT0gTlVMTCk7CisKKyAgd2hpbGUgKChpdGVtID0gZ19xdWV1ZV9wb3BfaGVhZF9saW5rIChqYnVmLT5wYWNrZXRzKSkpCisgICAgZnJlZV9mdW5jICgoUlRQSml0dGVyQnVmZmVySXRlbSAqKSBpdGVtLCB1c2VyX2RhdGEpOworfQorCisvKioKKyAqIHJ0cF9qaXR0ZXJfYnVmZmVyX2lzX2J1ZmZlcmluZzoKKyAqIEBqYnVmOiBhbiAjUlRQSml0dGVyQnVmZmVyCisgKgorICogQ2hlY2sgaWYgQGpidWYgaXMgYnVmZmVyaW5nIGN1cnJlbnRseS4gVXNlcnMgb2YgdGhlIGppdHRlcmJ1ZmZlciBzaG91bGQgbm90CisgKiBwb3AgcGFja2V0cyB3aGlsZSBpbiBidWZmZXJpbmcgbW9kZS4KKyAqCisgKiBSZXR1cm5zOiB0aGUgYnVmZmVyaW5nIHN0YXRlIG9mIEBqYnVmCisgKi8KK2dib29sZWFuCitydHBfaml0dGVyX2J1ZmZlcl9pc19idWZmZXJpbmcgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYpCit7CisgIHJldHVybiBqYnVmLT5idWZmZXJpbmcgJiYgIWpidWYtPmJ1ZmZlcmluZ19kaXNhYmxlZDsKK30KKworLyoqCisgKiBydHBfaml0dGVyX2J1ZmZlcl9zZXRfYnVmZmVyaW5nOgorICogQGpidWY6IGFuICNSVFBKaXR0ZXJCdWZmZXIKKyAqIEBidWZmZXJpbmc6IHRoZSBuZXcgYnVmZmVyaW5nIHN0YXRlCisgKgorICogRm9yY2VzIEBqYnVmIHRvIGdvIGludG8gdGhlIGJ1ZmZlcmluZyBzdGF0ZS4KKyAqLwordm9pZAorcnRwX2ppdHRlcl9idWZmZXJfc2V0X2J1ZmZlcmluZyAoUlRQSml0dGVyQnVmZmVyICogamJ1ZiwgZ2Jvb2xlYW4gYnVmZmVyaW5nKQoreworICBqYnVmLT5idWZmZXJpbmcgPSBidWZmZXJpbmc7Cit9CisKKy8qKgorICogcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3BlcmNlbnQ6CisgKiBAamJ1ZjogYW4gI1JUUEppdHRlckJ1ZmZlcgorICoKKyAqIEdldCB0aGUgYnVmZmVyaW5nIHBlcmNlbnQgb2YgdGhlIGppdHRlcmJ1ZmZlci4KKyAqCisgKiBSZXR1cm5zOiB0aGUgYnVmZmVyaW5nIHBlcmNlbnQKKyAqLworZ2ludAorcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3BlcmNlbnQgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYpCit7CisgIGdpbnQgcGVyY2VudDsKKyAgZ3VpbnQ2NCBsZXZlbDsKKworICBpZiAoR19VTkxJS0VMWSAoamJ1Zi0+aGlnaF9sZXZlbCA9PSAwKSkKKyAgICByZXR1cm4gMTAwOworCisgIGlmIChHX1VOTElLRUxZIChqYnVmLT5idWZmZXJpbmdfZGlzYWJsZWQpKQorICAgIHJldHVybiAxMDA7CisKKyAgbGV2ZWwgPSBnZXRfYnVmZmVyX2xldmVsIChqYnVmKTsKKyAgcGVyY2VudCA9IChsZXZlbCAqIDEwMCAvIGpidWYtPmhpZ2hfbGV2ZWwpOworICBwZXJjZW50ID0gTUlOIChwZXJjZW50LCAxMDApOworCisgIHJldHVybiBwZXJjZW50OworfQorCisvKioKKyAqIHJ0cF9qaXR0ZXJfYnVmZmVyX251bV9wYWNrZXRzOgorICogQGpidWY6IGFuICNSVFBKaXR0ZXJCdWZmZXIKKyAqCisgKiBHZXQgdGhlIG51bWJlciBvZiBwYWNrZXRzIGN1cnJlbnRseSBpbiAiamJ1Zi4KKyAqCisgKiBSZXR1cm5zOiBUaGUgbnVtYmVyIG9mIHBhY2tldHMgaW4gQGpidWYuCisgKi8KK2d1aW50CitydHBfaml0dGVyX2J1ZmZlcl9udW1fcGFja2V0cyAoUlRQSml0dGVyQnVmZmVyICogamJ1ZikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGpidWYgIT0gTlVMTCwgMCk7CisKKyAgcmV0dXJuIGpidWYtPnBhY2tldHMtPmxlbmd0aDsKK30KKworLyoqCisgKiBydHBfaml0dGVyX2J1ZmZlcl9nZXRfdHNfZGlmZjoKKyAqIEBqYnVmOiBhbiAjUlRQSml0dGVyQnVmZmVyCisgKgorICogR2V0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHRpbWVzdGFtcHMgb2YgZmlyc3QgYW5kIGxhc3QgcGFja2V0IGluIHRoZQorICogaml0dGVyYnVmZmVyLgorICoKKyAqIFJldHVybnM6IFRoZSBkaWZmZXJlbmNlIGV4cHJlc3NlZCBpbiB0aGUgdGltZXN0YW1wIHVuaXRzIG9mIHRoZSBwYWNrZXRzLgorICovCitndWludDMyCitydHBfaml0dGVyX2J1ZmZlcl9nZXRfdHNfZGlmZiAoUlRQSml0dGVyQnVmZmVyICogamJ1ZikKK3sKKyAgZ3VpbnQ2NCBoaWdoX3RzLCBsb3dfdHM7CisgIFJUUEppdHRlckJ1ZmZlckl0ZW0gKmhpZ2hfYnVmLCAqbG93X2J1ZjsKKyAgZ3VpbnQzMiByZXN1bHQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGpidWYgIT0gTlVMTCwgMCk7CisKKyAgaGlnaF9idWYgPSAoUlRQSml0dGVyQnVmZmVySXRlbSAqKSBnX3F1ZXVlX3BlZWtfdGFpbF9saW5rIChqYnVmLT5wYWNrZXRzKTsKKyAgbG93X2J1ZiA9IChSVFBKaXR0ZXJCdWZmZXJJdGVtICopIGdfcXVldWVfcGVla19oZWFkX2xpbmsgKGpidWYtPnBhY2tldHMpOworCisgIGlmICghaGlnaF9idWYgfHwgIWxvd19idWYgfHwgaGlnaF9idWYgPT0gbG93X2J1ZikKKyAgICByZXR1cm4gMDsKKworICBoaWdoX3RzID0gaGlnaF9idWYtPnJ0cHRpbWU7CisgIGxvd190cyA9IGxvd19idWYtPnJ0cHRpbWU7CisKKyAgLyogaXQgbmVlZHMgdG8gd29yayBpZiB0cyB3cmFwcyAqLworICBpZiAoaGlnaF90cyA+PSBsb3dfdHMpIHsKKyAgICByZXN1bHQgPSAoZ3VpbnQzMikgKGhpZ2hfdHMgLSBsb3dfdHMpOworICB9IGVsc2UgeworICAgIHJlc3VsdCA9IChndWludDMyKSAoaGlnaF90cyArIEdfTUFYVUlOVDMyICsgMSAtIGxvd190cyk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBydHBfaml0dGVyX2J1ZmZlcl9nZXRfc3luYzoKKyAqIEBqYnVmOiBhbiAjUlRQSml0dGVyQnVmZmVyCisgKiBAcnRwdGltZTogcmVzdWx0IFJUUCB0aW1lCisgKiBAdGltZXN0YW1wOiByZXN1bHQgR1N0cmVhbWVyIHRpbWVzdGFtcAorICogQGNsb2NrX3JhdGU6IGNsb2NrLXJhdGUgb2YgQHJ0cHRpbWUKKyAqIEBsYXN0X3J0cHRpbWU6IGxhc3Qgc2VlbiBydHB0aW1lLgorICoKKyAqIENhbGN1bGF0ZXMgdGhlIHJlbGF0aW9uIGJldHdlZW4gdGhlIFJUUCB0aW1lc3RhbXAgYW5kIHRoZSBHU3RyZWFtZXIgdGltZXN0YW1wCisgKiB1c2VkIGZvciBjb25zdHJ1Y3RpbmcgdGltZXN0YW1wcy4KKyAqCisgKiBGb3IgZXh0ZW5kZWQgUlRQIHRpbWVzdGFtcCBAcnRwdGltZSB3aXRoIGEgY2xvY2stcmF0ZSBvZiBAY2xvY2tfcmF0ZSwKKyAqIHRoZSBHU3RyZWFtZXIgdGltZXN0YW1wIGlzIGN1cnJlbnRseSBAdGltZXN0YW1wLgorICoKKyAqIFRoZSBsYXN0IHNlZW4gZXh0ZW5kZWQgUlRQIHRpbWVzdGFtcCB3aXRoIGNsb2NrLXJhdGUgQGNsb2NrLXJhdGUgaXMgcmV0dXJuZWQgaW4KKyAqIEBsYXN0X3J0cHRpbWUuCisgKi8KK3ZvaWQKK3J0cF9qaXR0ZXJfYnVmZmVyX2dldF9zeW5jIChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmLCBndWludDY0ICogcnRwdGltZSwKKyAgICBndWludDY0ICogdGltZXN0YW1wLCBndWludDMyICogY2xvY2tfcmF0ZSwgZ3VpbnQ2NCAqIGxhc3RfcnRwdGltZSkKK3sKKyAgaWYgKHJ0cHRpbWUpCisgICAgKnJ0cHRpbWUgPSBqYnVmLT5iYXNlX2V4dHJ0cDsKKyAgaWYgKHRpbWVzdGFtcCkKKyAgICAqdGltZXN0YW1wID0gamJ1Zi0+YmFzZV90aW1lICsgamJ1Zi0+c2tldzsKKyAgaWYgKGNsb2NrX3JhdGUpCisgICAgKmNsb2NrX3JhdGUgPSBqYnVmLT5jbG9ja19yYXRlOworICBpZiAobGFzdF9ydHB0aW1lKQorICAgICpsYXN0X3J0cHRpbWUgPSBqYnVmLT5sYXN0X3J0cHRpbWU7Cit9CisKKy8qKgorICogcnRwX2ppdHRlcl9idWZmZXJfY2FuX2Zhc3Rfc3RhcnQ6CisgKiBAamJ1ZjogYW4gI1JUUEppdHRlckJ1ZmZlcgorICogQG51bV9wYWNrZXRzOiBOdW1iZXIgb2YgY29uc2VjdXRpdmUgcGFja2V0cyBuZWVkZWQKKyAqCisgKiBDaGVjayBpZiBpbiB0aGUgcXVldWUgaWYgdGhlcmUgaXMgZW5vdWdoIHBhY2tldHMgd2l0aCBjb25zZWN1dGl2ZSBzZXFudW0gaW4KKyAqIG9yZGVyIHRvIHN0YXJ0IGRlbGl2ZXJpbmcgdGhlbS4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBpZiB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHBhY2tldHMgd2FzIGZvdW5kLgorICovCitnYm9vbGVhbgorcnRwX2ppdHRlcl9idWZmZXJfY2FuX2Zhc3Rfc3RhcnQgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYsIGdpbnQgbnVtX3BhY2tldCkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKyAgUlRQSml0dGVyQnVmZmVySXRlbSAqbGFzdF9pdGVtID0gTlVMTCwgKml0ZW07CisgIGdpbnQgaTsKKworICBpZiAocnRwX2ppdHRlcl9idWZmZXJfbnVtX3BhY2tldHMgKGpidWYpIDwgbnVtX3BhY2tldCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaXRlbSA9IHJ0cF9qaXR0ZXJfYnVmZmVyX3BlZWsgKGpidWYpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhY2tldDsgaSsrKSB7CisgICAgaWYgKEdfTElLRUxZIChsYXN0X2l0ZW0pKSB7CisgICAgICBndWludDE2IGV4cGVjdGVkX3NlcW51bSA9IGxhc3RfaXRlbS0+c2VxbnVtICsgMTsKKworICAgICAgaWYgKGV4cGVjdGVkX3NlcW51bSAhPSBpdGVtLT5zZXFudW0pIHsKKyAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGxhc3RfaXRlbSA9IGl0ZW07CisgICAgaXRlbSA9IChSVFBKaXR0ZXJCdWZmZXJJdGVtICopIGxhc3RfaXRlbS0+bmV4dDsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaCBiL2dzdC9ydHBtYW5hZ2VyL3J0cGppdHRlcmJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZGI2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9ydHBqaXR0ZXJidWZmZXIuaApAQCAtMCwwICsxLDE5NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19SVFBfSklUVEVSX0JVRkZFUl9IX18KKyNkZWZpbmUgX19SVFBfSklUVEVSX0JVRkZFUl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0Y3BidWZmZXIuaD4KKwordHlwZWRlZiBzdHJ1Y3QgX1JUUEppdHRlckJ1ZmZlciBSVFBKaXR0ZXJCdWZmZXI7Cit0eXBlZGVmIHN0cnVjdCBfUlRQSml0dGVyQnVmZmVyQ2xhc3MgUlRQSml0dGVyQnVmZmVyQ2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBfUlRQSml0dGVyQnVmZmVySXRlbSBSVFBKaXR0ZXJCdWZmZXJJdGVtOworCisjZGVmaW5lIFJUUF9UWVBFX0pJVFRFUl9CVUZGRVIgICAgICAgICAgICAgKHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF90eXBlKCkpCisjZGVmaW5lIFJUUF9KSVRURVJfQlVGRkVSKHNyYykgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChzcmMpLFJUUF9UWVBFX0pJVFRFUl9CVUZGRVIsUlRQSml0dGVyQnVmZmVyKSkKKyNkZWZpbmUgUlRQX0pJVFRFUl9CVUZGRVJfQ0xBU1Moa2xhc3MpICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxSVFBfVFlQRV9KSVRURVJfQlVGRkVSLFJUUEppdHRlckJ1ZmZlckNsYXNzKSkKKyNkZWZpbmUgUlRQX0lTX0pJVFRFUl9CVUZGRVIoc3JjKSAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKHNyYyksUlRQX1RZUEVfSklUVEVSX0JVRkZFUikpCisjZGVmaW5lIFJUUF9JU19KSVRURVJfQlVGRkVSX0NMQVNTKGtsYXNzKSAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksUlRQX1RZUEVfSklUVEVSX0JVRkZFUikpCisjZGVmaW5lIFJUUF9KSVRURVJfQlVGRkVSX0NBU1Qoc3JjKSAgICAgICAgKChSVFBKaXR0ZXJCdWZmZXIgKikoc3JjKSkKKworLyoqCisgKiBSVFBKaXR0ZXJCdWZmZXJNb2RlOgorICogQFJUUF9KSVRURVJfQlVGRkVSX01PREVfTk9ORTogZG9uJ3QgZG8gYW55IHNrZXcgY29ycmVjdGlvbiwgb3V0Z29pbmcKKyAqICAgIHRpbWVzdGFtcHMgYXJlIGNhbGN1bGF0ZWQgZGlyZWN0bHkgZnJvbSB0aGUgUlRQIHRpbWVzdGFtcHMuIFRoaXMgbW9kZSBpcworICogICAgZ29vZCBmb3IgcmVjb3JkaW5nIGJ1dCBub3QgZm9yIHJlYWwtdGltZSBhcHBsaWNhdGlvbnMuCisgKiBAUlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9TTEFWRTogY2FsY3VsYXRlIHRoZSBza2V3IGJldHdlZW4gc2VuZGVyIGFuZCByZWNlaXZlcgorICogICAgYW5kIHByb2R1Y2Ugc21vb3RoZWQgYWRqdXN0ZWQgb3V0Z29pbmcgdGltZXN0YW1wcy4gVGhpcyBtb2RlIGlzIGdvb2QgZm9yCisgKiAgICBsb3cgbGF0ZW5jeSBjb21tdW5pY2F0aW9ucy4KKyAqIEBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX0JVRkZFUjogYnVmZmVyIHBhY2tldHMgYmV0d2VlbiBsb3cvaGlnaCB3YXRlcm1hcmtzLgorICogICAgVGhpcyBtb2RlIGlzIGdvb2QgZm9yIHN0cmVhbWluZyBjb21tdW5pY2F0aW9uLgorICogQFJUUF9KSVRURVJfQlVGRkVSX01PREVfU1lOQ0VEOiBzZW5kZXIgYW5kIHJlY2VpdmVyIGNsb2NrcyBhcmUgc3luY2hyb25pemVkLAorICogICAgbGlrZSAjUlRQX0pJVFRFUl9CVUZGRVJfTU9ERV9TTEFWRSBidXQgc2tldyBpcyBhc3N1bWVkIHRvIGJlIDAuIEdvb2QgZm9yCisgKiAgICBsb3cgbGF0ZW5jeSBjb21tdW5pY2F0aW9uIHdoZW4gc2VuZGVyIGFuZCByZWNlaXZlciBjbG9ja3MgYXJlCisgKiAgICBzeW5jaHJvbml6ZWQgYW5kIHRoZXJlIGlzIHRodXMgbm8gY2xvY2sgc2tldy4KKyAqIEBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX0xBU1Q6IGxhc3QgYnVmZmVyIG1vZGUuCisgKgorICogVGhlIGRpZmZlcmVudCBidWZmZXIgbW9kZXMgZm9yIGEgaml0dGVyYnVmZmVyLgorICovCit0eXBlZGVmIGVudW0geworICBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX05PTkUgICAgPSAwLAorICBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX1NMQVZFICAgPSAxLAorICBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX0JVRkZFUiAgPSAyLAorICAvKiBGSVhNRSAzIGlzIG1pc3NpbmcgYmVjYXVzZSBpdCB3YXMgdXNlZCBmb3IgJ2F1dG8nIGluIGppdHRlcmJ1ZmZlciAqLworICBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX1NZTkNFRCAgPSA0LAorICBSVFBfSklUVEVSX0JVRkZFUl9NT0RFX0xBU1QKK30gUlRQSml0dGVyQnVmZmVyTW9kZTsKKworI2RlZmluZSBSVFBfVFlQRV9KSVRURVJfQlVGRkVSX01PREUgKHJ0cF9qaXR0ZXJfYnVmZmVyX21vZGVfZ2V0X3R5cGUoKSkKK0dUeXBlIHJ0cF9qaXR0ZXJfYnVmZmVyX21vZGVfZ2V0X3R5cGUgKHZvaWQpOworCisjZGVmaW5lIFJUUF9KSVRURVJfQlVGRkVSX01BWF9XSU5ET1cgNTEyCisvKioKKyAqIFJUUEppdHRlckJ1ZmZlcjoKKyAqCisgKiBBIEppdHRlckJ1ZmZlciBpbiB0aGUgI1JUUFNlc3Npb24KKyAqLworc3RydWN0IF9SVFBKaXR0ZXJCdWZmZXIgeworICBHT2JqZWN0ICAgICAgICBvYmplY3Q7CisKKyAgR1F1ZXVlICAgICAgICAqcGFja2V0czsKKworICBSVFBKaXR0ZXJCdWZmZXJNb2RlIG1vZGU7CisKKyAgR3N0Q2xvY2tUaW1lICAgZGVsYXk7CisKKyAgLyogZm9yIGJ1ZmZlcmluZyAqLworICBnYm9vbGVhbiAgICAgICAgICBidWZmZXJpbmc7CisgIGd1aW50NjQgICAgICAgICAgIGxvd19sZXZlbDsKKyAgZ3VpbnQ2NCAgICAgICAgICAgaGlnaF9sZXZlbDsKKworICAvKiBmb3IgY2FsY3VsYXRpbmcgc2tldyAqLworICBnYm9vbGVhbiAgICAgICBuZWVkX3Jlc3luYzsKKyAgR3N0Q2xvY2tUaW1lICAgYmFzZV90aW1lOworICBHc3RDbG9ja1RpbWUgICBiYXNlX3J0cHRpbWU7CisgIEdzdENsb2NrVGltZSAgIG1lZGlhX2Nsb2NrX2Jhc2VfdGltZTsKKyAgZ3VpbnQzMiAgICAgICAgY2xvY2tfcmF0ZTsKKyAgR3N0Q2xvY2tUaW1lICAgYmFzZV9leHRydHA7CisgIEdzdENsb2NrVGltZSAgIHByZXZfb3V0X3RpbWU7CisgIGd1aW50NjQgICAgICAgIGV4dF9ydHB0aW1lOworICBndWludDY0ICAgICAgICBsYXN0X3J0cHRpbWU7CisgIGdpbnQ2NCAgICAgICAgIHdpbmRvd1tSVFBfSklUVEVSX0JVRkZFUl9NQVhfV0lORE9XXTsKKyAgZ3VpbnQgICAgICAgICAgd2luZG93X3BvczsKKyAgZ3VpbnQgICAgICAgICAgd2luZG93X3NpemU7CisgIGdib29sZWFuICAgICAgIHdpbmRvd19maWxsaW5nOworICBnaW50NjQgICAgICAgICB3aW5kb3dfbWluOworICBnaW50NjQgICAgICAgICBza2V3OworICBnaW50NjQgICAgICAgICBwcmV2X3NlbmRfZGlmZjsKKyAgZ2Jvb2xlYW4gICAgICAgYnVmZmVyaW5nX2Rpc2FibGVkOworCisgIEdNdXRleCAgICAgICAgIGNsb2NrX2xvY2s7CisgIEdzdENsb2NrICAgICAgKnBpcGVsaW5lX2Nsb2NrOworICBHc3RDbG9jayAgICAgICptZWRpYV9jbG9jazsKKyAgZ3Vsb25nICAgICAgICAgbWVkaWFfY2xvY2tfc3luY2VkX2lkOworICBndWludDY0ICAgICAgICBtZWRpYV9jbG9ja19vZmZzZXQ7CisKKyAgZ2Jvb2xlYW4gICAgICAgcmZjNzI3M19zeW5jOworfTsKKworc3RydWN0IF9SVFBKaXR0ZXJCdWZmZXJDbGFzcyB7CisgIEdPYmplY3RDbGFzcyAgIHBhcmVudF9jbGFzczsKK307CisKKy8qKgorICogUlRQSml0dGVyQnVmZmVySXRlbToKKyAqIEBkYXRhOiB0aGUgZGF0YSBvZiB0aGUgaXRlbQorICogQG5leHQ6IHBvaW50ZXIgdG8gbmV4dCBpdGVtCisgKiBAcHJldjogcG9pbnRlciB0byBwcmV2aW91cyBpdGVtCisgKiBAdHlwZTogdGhlIHR5cGUgb2YgQGRhdGEsIHVzZWQgZnJlZWx5IGJ5IGNhbGxlcgorICogQGR0czogaW5wdXQgRFRTCisgKiBAcHRzOiBvdXRwdXQgUFRTCisgKiBAc2VxbnVtOiBzZXFudW0sIHRoZSBzZXFudW0gaXMgdXNlZCB0byBpbnNlcnQgdGhlIGl0ZW0gaW4gdGhlCisgKiAgIHJpZ2h0IHBvc2l0aW9uIGluIHRoZSBqaXR0ZXJidWZmZXIgYW5kIGRldGVjdCBkdXBsaWNhdGVzLiBVc2UgLTEgdG8KKyAqICAgYXBwZW5kLgorICogQGNvdW50OiBhbW91bnQgb2Ygc2VxbnVtIGluIHRoaXMgaXRlbQorICogQHJ0cHRpbWU6IHJ0cCB0aW1lc3RhbXAKKyAqCisgKiBBbiBvYmplY3QgY29udGFpbmluZyBhbiBSVFAgcGFja2V0IG9yIGV2ZW50LgorICovCitzdHJ1Y3QgX1JUUEppdHRlckJ1ZmZlckl0ZW0geworICBncG9pbnRlciBkYXRhOworICBHTGlzdCAqbmV4dDsKKyAgR0xpc3QgKnByZXY7CisgIGd1aW50IHR5cGU7CisgIEdzdENsb2NrVGltZSBkdHM7CisgIEdzdENsb2NrVGltZSBwdHM7CisgIGd1aW50IHNlcW51bTsKKyAgZ3VpbnQgY291bnQ7CisgIGd1aW50IHJ0cHRpbWU7Cit9OworCitHVHlwZSBydHBfaml0dGVyX2J1ZmZlcl9nZXRfdHlwZSAodm9pZCk7CisKKy8qIG1hbmFnaW5nIGxpZmV0aW1lICovCitSVFBKaXR0ZXJCdWZmZXIqICAgICAgcnRwX2ppdHRlcl9idWZmZXJfbmV3ICAgICAgICAgICAgICAodm9pZCk7CisKK1JUUEppdHRlckJ1ZmZlck1vZGUgICBydHBfaml0dGVyX2J1ZmZlcl9nZXRfbW9kZSAgICAgICAgIChSVFBKaXR0ZXJCdWZmZXIgKmpidWYpOwordm9pZCAgICAgICAgICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX3NldF9tb2RlICAgICAgICAgKFJUUEppdHRlckJ1ZmZlciAqamJ1ZiwgUlRQSml0dGVyQnVmZmVyTW9kZSBtb2RlKTsKKworR3N0Q2xvY2tUaW1lICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF9kZWxheSAgICAgICAgKFJUUEppdHRlckJ1ZmZlciAqamJ1Zik7Cit2b2lkICAgICAgICAgICAgICAgICAgcnRwX2ppdHRlcl9idWZmZXJfc2V0X2RlbGF5ICAgICAgICAoUlRQSml0dGVyQnVmZmVyICpqYnVmLCBHc3RDbG9ja1RpbWUgZGVsYXkpOworCit2b2lkICAgICAgICAgICAgICAgICAgcnRwX2ppdHRlcl9idWZmZXJfc2V0X2Nsb2NrX3JhdGUgICAoUlRQSml0dGVyQnVmZmVyICpqYnVmLCBndWludDMyIGNsb2NrX3JhdGUpOworZ3VpbnQzMiAgICAgICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF9jbG9ja19yYXRlICAgKFJUUEppdHRlckJ1ZmZlciAqamJ1Zik7CisKK3ZvaWQgICAgICAgICAgICAgICAgICBydHBfaml0dGVyX2J1ZmZlcl9zZXRfbWVkaWFfY2xvY2sgIChSVFBKaXR0ZXJCdWZmZXIgKmpidWYsIEdzdENsb2NrICogY2xvY2ssIGd1aW50NjQgY2xvY2tfb2Zmc2V0KTsKK3ZvaWQgICAgICAgICAgICAgICAgICBydHBfaml0dGVyX2J1ZmZlcl9zZXRfcGlwZWxpbmVfY2xvY2sgKFJUUEppdHRlckJ1ZmZlciAqamJ1ZiwgR3N0Q2xvY2sgKiBjbG9jayk7CisKK2dib29sZWFuICAgICAgICAgICAgICBydHBfaml0dGVyX2J1ZmZlcl9nZXRfcmZjNzI3M19zeW5jIChSVFBKaXR0ZXJCdWZmZXIgKmpidWYpOwordm9pZCAgICAgICAgICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX3NldF9yZmM3MjczX3N5bmMgKFJUUEppdHRlckJ1ZmZlciAqamJ1ZiwgZ2Jvb2xlYW4gcmZjNzI3M19zeW5jKTsKKwordm9pZCAgICAgICAgICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX3Jlc2V0X3NrZXcgICAgICAgKFJUUEppdHRlckJ1ZmZlciAqamJ1Zik7CisKK2dib29sZWFuICAgICAgICAgICAgICBydHBfaml0dGVyX2J1ZmZlcl9pbnNlcnQgICAgICAgICAgIChSVFBKaXR0ZXJCdWZmZXIgKmpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRQSml0dGVyQnVmZmVySXRlbSAqaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYm9vbGVhbiAqaGVhZCwgZ2ludCAqcGVyY2VudCk7CisKK3ZvaWQgICAgICAgICAgICAgICAgICBydHBfaml0dGVyX2J1ZmZlcl9kaXNhYmxlX2J1ZmZlcmluZyAoUlRQSml0dGVyQnVmZmVyICpqYnVmLCBnYm9vbGVhbiBkaXNhYmxlZCk7CisKK1JUUEppdHRlckJ1ZmZlckl0ZW0gKiBydHBfaml0dGVyX2J1ZmZlcl9wZWVrICAgICAgICAgICAgIChSVFBKaXR0ZXJCdWZmZXIgKmpidWYpOworUlRQSml0dGVyQnVmZmVySXRlbSAqIHJ0cF9qaXR0ZXJfYnVmZmVyX3BvcCAgICAgICAgICAgICAgKFJUUEppdHRlckJ1ZmZlciAqamJ1ZiwgZ2ludCAqcGVyY2VudCk7CisKK3ZvaWQgICAgICAgICAgICAgICAgICBydHBfaml0dGVyX2J1ZmZlcl9mbHVzaCAgICAgICAgICAgIChSVFBKaXR0ZXJCdWZmZXIgKmpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Z1bmMgZnJlZV9mdW5jLCBncG9pbnRlciB1c2VyX2RhdGEpOworCitnYm9vbGVhbiAgICAgICAgICAgICAgcnRwX2ppdHRlcl9idWZmZXJfaXNfYnVmZmVyaW5nICAgICAoUlRQSml0dGVyQnVmZmVyICogamJ1Zik7Cit2b2lkICAgICAgICAgICAgICAgICAgcnRwX2ppdHRlcl9idWZmZXJfc2V0X2J1ZmZlcmluZyAgICAoUlRQSml0dGVyQnVmZmVyICogamJ1ZiwgZ2Jvb2xlYW4gYnVmZmVyaW5nKTsKK2dpbnQgICAgICAgICAgICAgICAgICBydHBfaml0dGVyX2J1ZmZlcl9nZXRfcGVyY2VudCAgICAgIChSVFBKaXR0ZXJCdWZmZXIgKiBqYnVmKTsKKworZ3VpbnQgICAgICAgICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX251bV9wYWNrZXRzICAgICAgKFJUUEppdHRlckJ1ZmZlciAqamJ1Zik7CitndWludDMyICAgICAgICAgICAgICAgcnRwX2ppdHRlcl9idWZmZXJfZ2V0X3RzX2RpZmYgICAgICAoUlRQSml0dGVyQnVmZmVyICpqYnVmKTsKKwordm9pZCAgICAgICAgICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2dldF9zeW5jICAgICAgICAgKFJUUEppdHRlckJ1ZmZlciAqamJ1ZiwgZ3VpbnQ2NCAqcnRwdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDY0ICp0aW1lc3RhbXAsIGd1aW50MzIgKmNsb2NrX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCAqbGFzdF9ydHB0aW1lKTsKKworR3N0Q2xvY2tUaW1lICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2NhbGN1bGF0ZV9wdHMgICAgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYsIEdzdENsb2NrVGltZSBkdHMsIGdib29sZWFuIGVzdGltYXRlZF9kdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBydHB0aW1lLCBHc3RDbG9ja1RpbWUgYmFzZV90aW1lKTsKKworZ2Jvb2xlYW4gICAgICAgICAgICAgIHJ0cF9qaXR0ZXJfYnVmZmVyX2Nhbl9mYXN0X3N0YXJ0ICAgKFJUUEppdHRlckJ1ZmZlciAqIGpidWYsIGdpbnQgbnVtX3BhY2tldCk7CisKKyNlbmRpZiAvKiBfX1JUUF9KSVRURVJfQlVGRkVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jIGIvZ3N0L3J0cG1hbmFnZXIvcnRwc2Vzc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOTlkMjMKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmMKQEAgLTAsMCArMSw0NDI4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyogRklYTUUgMC4xMTogc3VwcHJlc3Mgd2FybmluZ3MgZm9yIGRlcHJlY2F0ZWQgQVBJIHN1Y2ggYXMgR1ZhbHVlQXJyYXkKKyAqIHdpdGggbmV3ZXIgR0xpYiB2ZXJzaW9ucyAoPj0gMi4zMS4wKSAqLworI2RlZmluZSBHTElCX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0Y3BidWZmZXIuaD4KKworI2luY2x1ZGUgPGdzdC9nbGliLWNvbXBhdC1wcml2YXRlLmg+CisKKyNpbmNsdWRlICJydHBzZXNzaW9uLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cF9zZXNzaW9uX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHJ0cF9zZXNzaW9uX2RlYnVnCisKKy8qIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgU0lHTkFMX0dFVF9TT1VSQ0VfQllfU1NSQywKKyAgU0lHTkFMX09OX05FV19TU1JDLAorICBTSUdOQUxfT05fU1NSQ19DT0xMSVNJT04sCisgIFNJR05BTF9PTl9TU1JDX1ZBTElEQVRFRCwKKyAgU0lHTkFMX09OX1NTUkNfQUNUSVZFLAorICBTSUdOQUxfT05fU1NSQ19TREVTLAorICBTSUdOQUxfT05fQllFX1NTUkMsCisgIFNJR05BTF9PTl9CWUVfVElNRU9VVCwKKyAgU0lHTkFMX09OX1RJTUVPVVQsCisgIFNJR05BTF9PTl9TRU5ERVJfVElNRU9VVCwKKyAgU0lHTkFMX09OX1NFTkRJTkdfUlRDUCwKKyAgU0lHTkFMX09OX0FQUF9SVENQLAorICBTSUdOQUxfT05fRkVFREJBQ0tfUlRDUCwKKyAgU0lHTkFMX1NFTkRfUlRDUCwKKyAgU0lHTkFMX1NFTkRfUlRDUF9GVUxMLAorICBTSUdOQUxfT05fUkVDRUlWSU5HX1JUQ1AsCisgIFNJR05BTF9PTl9ORVdfU0VOREVSX1NTUkMsCisgIFNJR05BTF9PTl9TRU5ERVJfU1NSQ19BQ1RJVkUsCisgIExBU1RfU0lHTkFMCit9OworCisjZGVmaW5lIERFRkFVTFRfSU5URVJOQUxfU09VUkNFICAgICAgTlVMTAorI2RlZmluZSBERUZBVUxUX0JBTkRXSURUSCAgICAgICAgICAgIDAuMAorI2RlZmluZSBERUZBVUxUX1JUQ1BfRlJBQ1RJT04gICAgICAgIFJUUF9TVEFUU19SVENQX0ZSQUNUSU9OCisjZGVmaW5lIERFRkFVTFRfUlRDUF9SUl9CQU5EV0lEVEggICAgLTEKKyNkZWZpbmUgREVGQVVMVF9SVENQX1JTX0JBTkRXSURUSCAgICAtMQorI2RlZmluZSBERUZBVUxUX1JUQ1BfTVRVICAgICAgICAgICAgIDE0MDAKKyNkZWZpbmUgREVGQVVMVF9TREVTICAgICAgICAgICAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfTlVNX1NPVVJDRVMgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX05VTV9BQ1RJVkVfU09VUkNFUyAgIDAKKyNkZWZpbmUgREVGQVVMVF9TT1VSQ0VTICAgICAgICAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfUlRDUF9NSU5fSU5URVJWQUwgICAgKFJUUF9TVEFUU19NSU5fSU5URVJWQUwgKiBHU1RfU0VDT05EKQorI2RlZmluZSBERUZBVUxUX1JUQ1BfRkVFREJBQ0tfUkVURU5USU9OX1dJTkRPVyAoMiAqIEdTVF9TRUNPTkQpCisjZGVmaW5lIERFRkFVTFRfUlRDUF9JTU1FRElBVEVfRkVFREJBQ0tfVEhSRVNIT0xEICgzKQorI2RlZmluZSBERUZBVUxUX1BST0JBVElPTiAgICAgICAgICAgIFJUUF9ERUZBVUxUX1BST0JBVElPTgorI2RlZmluZSBERUZBVUxUX01BWF9EUk9QT1VUX1RJTUUgICAgIDYwMDAwCisjZGVmaW5lIERFRkFVTFRfTUFYX01JU09SREVSX1RJTUUgICAgMjAwMAorI2RlZmluZSBERUZBVUxUX1JUUF9QUk9GSUxFICAgICAgICAgIEdTVF9SVFBfUFJPRklMRV9BVlAKKyNkZWZpbmUgREVGQVVMVF9SVENQX1JFRFVDRURfU0laRSAgICBGQUxTRQorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9JTlRFUk5BTF9TU1JDLAorICBQUk9QX0lOVEVSTkFMX1NPVVJDRSwKKyAgUFJPUF9CQU5EV0lEVEgsCisgIFBST1BfUlRDUF9GUkFDVElPTiwKKyAgUFJPUF9SVENQX1JSX0JBTkRXSURUSCwKKyAgUFJPUF9SVENQX1JTX0JBTkRXSURUSCwKKyAgUFJPUF9SVENQX01UVSwKKyAgUFJPUF9TREVTLAorICBQUk9QX05VTV9TT1VSQ0VTLAorICBQUk9QX05VTV9BQ1RJVkVfU09VUkNFUywKKyAgUFJPUF9TT1VSQ0VTLAorICBQUk9QX0ZBVk9SX05FVywKKyAgUFJPUF9SVENQX01JTl9JTlRFUlZBTCwKKyAgUFJPUF9SVENQX0ZFRURCQUNLX1JFVEVOVElPTl9XSU5ET1csCisgIFBST1BfUlRDUF9JTU1FRElBVEVfRkVFREJBQ0tfVEhSRVNIT0xELAorICBQUk9QX1BST0JBVElPTiwKKyAgUFJPUF9NQVhfRFJPUE9VVF9USU1FLAorICBQUk9QX01BWF9NSVNPUkRFUl9USU1FLAorICBQUk9QX1NUQVRTLAorICBQUk9QX1JUUF9QUk9GSUxFLAorICBQUk9QX1JUQ1BfUkVEVUNFRF9TSVpFCit9OworCisvKiB1cGRhdGUgYXZlcmFnZSBwYWNrZXQgc2l6ZSAqLworI2RlZmluZSBJTklUX0FWRyhhdmcsIHZhbCkgXAorICAgKGF2ZykgPSAodmFsKTsKKyNkZWZpbmUgVVBEQVRFX0FWRyhhdmcsIHZhbCkgICAgICAgICAgICBcCisgIGlmICgoYXZnKSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKGF2ZykgPSAodmFsKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAoYXZnKSA9ICgodmFsKSArICgxNSAqIChhdmcpKSkgPj4gNDsKKworCisvKiBHT2JqZWN0IHZtZXRob2RzICovCitzdGF0aWMgdm9pZCBydHBfc2Vzc2lvbl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBydHBfc2Vzc2lvbl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBydHBfc2Vzc2lvbl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBydHBfc2Vzc2lvbl9zZW5kX3J0Y3AgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgIEdzdENsb2NrVGltZSBtYXhfZGVsYXkpOworCitzdGF0aWMgZ3VpbnQgcnRwX3Nlc3Npb25fc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsKKworR19ERUZJTkVfVFlQRSAoUlRQU2Vzc2lvbiwgcnRwX3Nlc3Npb24sIEdfVFlQRV9PQkpFQ1QpOworCitzdGF0aWMgZ3VpbnQzMiBydHBfc2Vzc2lvbl9jcmVhdGVfbmV3X3NzcmMgKFJUUFNlc3Npb24gKiBzZXNzKTsKK3N0YXRpYyBSVFBTb3VyY2UgKm9idGFpbl9zb3VyY2UgKFJUUFNlc3Npb24gKiBzZXNzLCBndWludDMyIHNzcmMsCisgICAgZ2Jvb2xlYW4gKiBjcmVhdGVkLCBSVFBQYWNrZXRJbmZvICogcGluZm8sIGdib29sZWFuIHJ0cCk7CitzdGF0aWMgUlRQU291cmNlICpvYnRhaW5faW50ZXJuYWxfc291cmNlIChSVFBTZXNzaW9uICogc2VzcywKKyAgICBndWludDMyIHNzcmMsIGdib29sZWFuICogY3JlYXRlZCwgR3N0Q2xvY2tUaW1lIGN1cnJlbnRfdGltZSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBydHBfc2Vzc2lvbl9zY2hlZHVsZV9ieWVfbG9ja2VkIChSVFBTZXNzaW9uICogc2VzcywKKyAgICBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lKTsKK3N0YXRpYyBHc3RDbG9ja1RpbWUgY2FsY3VsYXRlX3J0Y3BfaW50ZXJ2YWwgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgIGdib29sZWFuIGRldGVybWluaXN0aWMsIGdib29sZWFuIGZpcnN0KTsKKworc3RhdGljIGdib29sZWFuCithY2N1bXVsYXRlX3RydWVzIChHU2lnbmFsSW52b2NhdGlvbkhpbnQgKiBpaGludCwgR1ZhbHVlICogcmV0dXJuX2FjY3UsCisgICAgY29uc3QgR1ZhbHVlICogaGFuZGxlcl9yZXR1cm4sIGdwb2ludGVyIGRhdGEpCit7CisgIGlmIChnX3ZhbHVlX2dldF9ib29sZWFuIChoYW5kbGVyX3JldHVybikpCisgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAocmV0dXJuX2FjY3UsIFRSVUUpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorcnRwX3Nlc3Npb25fY2xhc3NfaW5pdCAoUlRQU2Vzc2lvbkNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHJ0cF9zZXNzaW9uX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBydHBfc2Vzc2lvbl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHJ0cF9zZXNzaW9uX2dldF9wcm9wZXJ0eTsKKworICAvKioKKyAgICogUlRQU2Vzc2lvbjo6Z2V0LXNvdXJjZS1ieS1zc3JjOgorICAgKiBAc2Vzc2lvbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzc3JjOiB0aGUgU1NSQyBvZiB0aGUgUlRQU291cmNlCisgICAqCisgICAqIFJlcXVlc3QgdGhlICNSVFBTb3VyY2Ugb2JqZWN0IHdpdGggU1NSQyBAc3NyYyBpbiBAc2Vzc2lvbi4KKyAgICovCisgIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX0dFVF9TT1VSQ0VfQllfU1NSQ10gPQorICAgICAgZ19zaWduYWxfbmV3ICgiZ2V0LXNvdXJjZS1ieS1zc3JjIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNUIHwgR19TSUdOQUxfQUNUSU9OLCBHX1NUUlVDVF9PRkZTRVQgKFJUUFNlc3Npb25DbGFzcywKKyAgICAgICAgICBnZXRfc291cmNlX2J5X3NzcmMpLCBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywKKyAgICAgIFJUUF9UWVBFX1NPVVJDRSwgMSwgR19UWVBFX1VJTlQpOworCisgIC8qKgorICAgKiBSVFBTZXNzaW9uOjpvbi1uZXctc3NyYzoKKyAgICogQHNlc3Npb246IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc3JjOiB0aGUgbmV3IFJUUFNvdXJjZQorICAgKgorICAgKiBOb3RpZnkgb2YgYSBuZXcgU1NSQyB0aGF0IGVudGVyZWQgQHNlc3Npb24uCisgICAqLworICBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9ORVdfU1NSQ10gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tbmV3LXNzcmMiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoUlRQU2Vzc2lvbkNsYXNzLCBvbl9uZXdfc3NyYyksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fT0JKRUNULCBHX1RZUEVfTk9ORSwgMSwKKyAgICAgIFJUUF9UWVBFX1NPVVJDRSk7CisgIC8qKgorICAgKiBSVFBTZXNzaW9uOjpvbi1zc3JjLWNvbGxpc2lvbjoKKyAgICogQHNlc3Npb246IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc3JjOiB0aGUgI1JUUFNvdXJjZSB0aGF0IGNhdXNlZCBhIGNvbGxpc2lvbgorICAgKgorICAgKiBOb3RpZnkgd2hlbiB3ZSBoYXZlIGFuIFNTUkMgY29sbGlzaW9uCisgICAqLworICBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TU1JDX0NPTExJU0lPTl0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tc3NyYy1jb2xsaXNpb24iLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoUlRQU2Vzc2lvbkNsYXNzLCBvbl9zc3JjX2NvbGxpc2lvbiksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fT0JKRUNULCBHX1RZUEVfTk9ORSwgMSwKKyAgICAgIFJUUF9UWVBFX1NPVVJDRSk7CisgIC8qKgorICAgKiBSVFBTZXNzaW9uOjpvbi1zc3JjLXZhbGlkYXRlZDoKKyAgICogQHNlc3Npb246IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc3JjOiB0aGUgbmV3IHZhbGlkYXRlZCBSVFBTb3VyY2UKKyAgICoKKyAgICogTm90aWZ5IG9mIGEgbmV3IFNTUkMgdGhhdCBiZWNhbWUgdmFsaWRhdGVkLgorICAgKi8KKyAgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fU1NSQ19WQUxJREFURURdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXNzcmMtdmFsaWRhdGVkIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKFJUUFNlc3Npb25DbGFzcywgb25fc3NyY192YWxpZGF0ZWQpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX09CSkVDVCwgR19UWVBFX05PTkUsIDEsCisgICAgICBSVFBfVFlQRV9TT1VSQ0UpOworICAvKioKKyAgICogUlRQU2Vzc2lvbjo6b24tc3NyYy1hY3RpdmU6CisgICAqIEBzZXNzaW9uOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNyYzogdGhlIGFjdGl2ZSBSVFBTb3VyY2UKKyAgICoKKyAgICogTm90aWZ5IG9mIGEgU1NSQyB0aGF0IGlzIGFjdGl2ZSwgaS5lLiwgc2VuZGluZyBSVENQLgorICAgKi8KKyAgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fU1NSQ19BQ1RJVkVdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXNzcmMtYWN0aXZlIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKFJUUFNlc3Npb25DbGFzcywgb25fc3NyY19hY3RpdmUpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX09CSkVDVCwgR19UWVBFX05PTkUsIDEsCisgICAgICBSVFBfVFlQRV9TT1VSQ0UpOworICAvKioKKyAgICogUlRQU2Vzc2lvbjo6b24tc3NyYy1zZGVzOgorICAgKiBAc2Vzc2lvbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzcmM6IHRoZSBSVFBTb3VyY2UKKyAgICoKKyAgICogTm90aWZ5IHRoYXQgYSBuZXcgU0RFUyB3YXMgcmVjZWl2ZWQgZm9yIFNTUkMuCisgICAqLworICBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TU1JDX1NERVNdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXNzcmMtc2RlcyIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChSVFBTZXNzaW9uQ2xhc3MsIG9uX3NzcmNfc2RlcyksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fT0JKRUNULCBHX1RZUEVfTk9ORSwgMSwKKyAgICAgIFJUUF9UWVBFX1NPVVJDRSk7CisgIC8qKgorICAgKiBSVFBTZXNzaW9uOjpvbi1ieWUtc3NyYzoKKyAgICogQHNlc3Npb246IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc3JjOiB0aGUgUlRQU291cmNlIHRoYXQgd2VudCBhd2F5CisgICAqCisgICAqIE5vdGlmeSBvZiBhbiBTU1JDIHRoYXQgYmVjYW1lIGluYWN0aXZlIGJlY2F1c2Ugb2YgYSBCWUUgcGFja2V0LgorICAgKi8KKyAgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fQllFX1NTUkNdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLWJ5ZS1zc3JjIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKFJUUFNlc3Npb25DbGFzcywgb25fYnllX3NzcmMpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX09CSkVDVCwgR19UWVBFX05PTkUsIDEsCisgICAgICBSVFBfVFlQRV9TT1VSQ0UpOworICAvKioKKyAgICogUlRQU2Vzc2lvbjo6b24tYnllLXRpbWVvdXQ6CisgICAqIEBzZXNzaW9uOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNyYzogdGhlIFJUUFNvdXJjZSB0aGF0IHRpbWVkIG91dAorICAgKgorICAgKiBOb3RpZnkgb2YgYW4gU1NSQyB0aGF0IGhhcyB0aW1lZCBvdXQgYmVjYXVzZSBvZiBCWUUKKyAgICovCisgIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX0JZRV9USU1FT1VUXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1ieWUtdGltZW91dCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChSVFBTZXNzaW9uQ2xhc3MsIG9uX2J5ZV90aW1lb3V0KSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19PQkpFQ1QsIEdfVFlQRV9OT05FLCAxLAorICAgICAgUlRQX1RZUEVfU09VUkNFKTsKKyAgLyoqCisgICAqIFJUUFNlc3Npb246Om9uLXRpbWVvdXQ6CisgICAqIEBzZXNzaW9uOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNyYzogdGhlIFJUUFNvdXJjZSB0aGF0IHRpbWVkIG91dAorICAgKgorICAgKiBOb3RpZnkgb2YgYW4gU1NSQyB0aGF0IGhhcyB0aW1lZCBvdXQKKyAgICovCisgIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX1RJTUVPVVRdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXRpbWVvdXQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoUlRQU2Vzc2lvbkNsYXNzLCBvbl90aW1lb3V0KSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19PQkpFQ1QsIEdfVFlQRV9OT05FLCAxLAorICAgICAgUlRQX1RZUEVfU09VUkNFKTsKKyAgLyoqCisgICAqIFJUUFNlc3Npb246Om9uLXNlbmRlci10aW1lb3V0OgorICAgKiBAc2Vzc2lvbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzcmM6IHRoZSBSVFBTb3VyY2UgdGhhdCB0aW1lZCBvdXQKKyAgICoKKyAgICogTm90aWZ5IG9mIGFuIFNTUkMgdGhhdCB3YXMgYSBzZW5kZXIgYnV0IHRpbWVkIG91dCBhbmQgYmVjYW1lIGEgcmVjZWl2ZXIuCisgICAqLworICBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TRU5ERVJfVElNRU9VVF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tc2VuZGVyLXRpbWVvdXQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoUlRQU2Vzc2lvbkNsYXNzLCBvbl9zZW5kZXJfdGltZW91dCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fT0JKRUNULCBHX1RZUEVfTk9ORSwgMSwKKyAgICAgIFJUUF9UWVBFX1NPVVJDRSk7CisKKyAgLyoqCisgICAqIFJUUFNlc3Npb246Om9uLXNlbmRpbmctcnRjcAorICAgKiBAc2Vzc2lvbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBidWZmZXI6IHRoZSAjR3N0QnVmZmVyIGNvbnRhaW5pbmcgdGhlIFJUQ1AgcGFja2V0IGFib3V0IHRvIGJlIHNlbnQKKyAgICogQGVhcmx5OiAlVFJVRSBpZiB0aGUgcGFja2V0IGlzIGVhcmx5LCAlRkFMU0UgaWYgaXQgaXMgcmVndWxhcgorICAgKgorICAgKiBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIGJlZm9yZSBzZW5kaW5nIGFuIFJUQ1AgcGFja2V0LCBpdCBjYW4gYmUgdXNlZAorICAgKiB0byBhZGQgZXh0cmEgUlRDUCBQYWNrZXRzLgorICAgKgorICAgKiBSZXR1cm5zOiAlVFJVRSBpZiB0aGUgUlRDUCBidWZmZXIgc2hvdWxkIE5PVCBiZSBzdXBwcmVzc2VkLCAlRkFMU0UKKyAgICogaWYgc3VwcHJlc3NpbmcgaXQgaXMgYWNjZXB0YWJsZQorICAgKi8KKyAgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fU0VORElOR19SVENQXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1zZW5kaW5nLXJ0Y3AiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoUlRQU2Vzc2lvbkNsYXNzLCBvbl9zZW5kaW5nX3J0Y3ApLAorICAgICAgYWNjdW11bGF0ZV90cnVlcywgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9CT09MRUFOLCAyLAorICAgICAgR1NUX1RZUEVfQlVGRkVSIHwgR19TSUdOQUxfVFlQRV9TVEFUSUNfU0NPUEUsIEdfVFlQRV9CT09MRUFOKTsKKworICAvKioKKyAgICogUlRQU2Vzc2lvbjo6b24tYXBwLXJ0Y3A6CisgICAqIEBzZXNzaW9uOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHN1YnR5cGU6IFRoZSBzdWJ0eXBlIG9mIHRoZSBwYWNrZXQKKyAgICogQHNzcmM6IFRoZSBTU1JDL0NTUkMgb2YgdGhlIHBhY2tldAorICAgKiBAbmFtZTogVGhlIG5hbWUgb2YgdGhlIHBhY2tldAorICAgKiBAZGF0YTogYSAjR3N0QnVmZmVyIHdpdGggdGhlIGFwcGxpY2F0aW9uLWRlcGVuZGFudCBkYXRhIG9yICVOVUxMIGlmCisgICAqIHRoZXJlIHdhcyBubyBkYXRhCisgICAqCisgICAqIE5vdGlmeSB0aGF0IGEgUlRDUCBBUFAgcGFja2V0IGhhcyBiZWVuIHJlY2VpdmVkCisgICAqLworICBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9BUFBfUlRDUF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tYXBwLXJ0Y3AiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoUlRQU2Vzc2lvbkNsYXNzLCBvbl9hcHBfcnRjcCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDQsCisgICAgICBHX1RZUEVfVUlOVCwgR19UWVBFX1VJTlQsIEdfVFlQRV9TVFJJTkcsIEdTVF9UWVBFX0JVRkZFUik7CisKKyAgLyoqCisgICAqIFJUUFNlc3Npb246Om9uLWZlZWRiYWNrLXJ0Y3A6CisgICAqIEBzZXNzaW9uOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHR5cGU6IFR5cGUgb2YgUlRDUCBwYWNrZXQsIHdpbGwgYmUgJUdTVF9SVENQX1RZUEVfUlRQRkIgb3IKKyAgICogICVHU1RfUlRDUF9UWVBFX1JUUEZCCisgICAqIEBmYnR5cGU6IFRoZSB0eXBlIG9mIFJUQ1AgRkIgcGFja2V0LCBwcm9iYWJseSBwYXJ0IG9mICNHc3RSVENQRkJUeXBlCisgICAqIEBzZW5kZXJfc3NyYzogVGhlIFNTUkMgb2YgdGhlIHNlbmRlcgorICAgKiBAbWVkaWFfc3NyYzogVGhlIFNTUkMgb2YgdGhlIG1lZGlhIHRoaXMgcmVmZXJzIHRvCisgICAqIEBmY2k6IGEgI0dzdEJ1ZmZlciB3aXRoIHRoZSBGQ0kgZGF0YSBmcm9tIHRoZSBGQiBwYWNrZXQgb3IgJU5VTEwgaWYKKyAgICogdGhlcmUgd2FzIG5vIEZDSQorICAgKgorICAgKiBOb3RpZnkgdGhhdCBhIFJUQ1AgZmVlZGJhY2sgcGFja2V0IGhhcyBiZWVuIHJlY2VpdmVkCisgICAqLworICBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9GRUVEQkFDS19SVENQXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1mZWVkYmFjay1ydGNwIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKFJUUFNlc3Npb25DbGFzcywgb25fZmVlZGJhY2tfcnRjcCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDUsIEdfVFlQRV9VSU5ULAorICAgICAgR19UWVBFX1VJTlQsIEdfVFlQRV9VSU5ULCBHX1RZUEVfVUlOVCwgR1NUX1RZUEVfQlVGRkVSKTsKKworICAvKioKKyAgICogUlRQU2Vzc2lvbjo6c2VuZC1ydGNwOgorICAgKiBAc2Vzc2lvbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBtYXhfZGVsYXk6IFRoZSBtYXhpbXVtIGRlbGF5IGFmdGVyIHdoaWNoIHRoZSBmZWVkYmFjayB3aWxsIG5vdCBiZSB1c2VmdWwKKyAgICogIGFueW1vcmUKKyAgICoKKyAgICogUmVxdWVzdHMgdGhhdCB0aGUgI1JUUFNlc3Npb24gaW5pdGlhdGUgYSBuZXcgUlRDUCBwYWNrZXQgYXMgc29vbiBhcworICAgKiBwb3NzaWJsZSB3aXRoaW4gdGhlIHJlcXVlc3RlZCBkZWxheS4KKyAgICoKKyAgICogVGhpcyBzZXRzIGZlZWRiYWNrIHRvICVUUlVFIGlmIG5vdCBhbHJlYWR5IGRvbmUgYmVmb3JlLgorICAgKi8KKyAgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfU0VORF9SVENQXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJzZW5kLXJ0Y3AiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QgfCBHX1NJR05BTF9BQ1RJT04sCisgICAgICBHX1NUUlVDVF9PRkZTRVQgKFJUUFNlc3Npb25DbGFzcywgc2VuZF9ydGNwKSwgTlVMTCwgTlVMTCwKKyAgICAgIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX1VJTlQ2NCk7CisKKyAgLyoqCisgICAqIFJUUFNlc3Npb246OnNlbmQtcnRjcC1mdWxsOgorICAgKiBAc2Vzc2lvbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBtYXhfZGVsYXk6IFRoZSBtYXhpbXVtIGRlbGF5IGFmdGVyIHdoaWNoIHRoZSBmZWVkYmFjayB3aWxsIG5vdCBiZSB1c2VmdWwKKyAgICogIGFueW1vcmUKKyAgICoKKyAgICogUmVxdWVzdHMgdGhhdCB0aGUgI1JUUFNlc3Npb24gaW5pdGlhdGUgYSBuZXcgUlRDUCBwYWNrZXQgYXMgc29vbiBhcworICAgKiBwb3NzaWJsZSB3aXRoaW4gdGhlIHJlcXVlc3RlZCBkZWxheS4KKyAgICoKKyAgICogVGhpcyBzZXRzIGZlZWRiYWNrIHRvICVUUlVFIGlmIG5vdCBhbHJlYWR5IGRvbmUgYmVmb3JlLgorICAgKgorICAgKiBSZXR1cm5zOiBUUlVFIGlmIHRoZSBuZXcgUlRDUCBwYWNrZXQgY291bGQgYmUgc2NoZWR1bGVkIHdpdGhpbiB0aGUKKyAgICogcmVxdWVzdGVkIGRlbGF5LCBGQUxTRSBvdGhlcndpc2UuCisgICAqCisgICAqIFNpbmNlOiAxLjYKKyAgICovCisgIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX1NFTkRfUlRDUF9GVUxMXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJzZW5kLXJ0Y3AtZnVsbCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCB8IEdfU0lHTkFMX0FDVElPTiwKKyAgICAgIEdfU1RSVUNUX09GRlNFVCAoUlRQU2Vzc2lvbkNsYXNzLCBzZW5kX3J0Y3ApLCBOVUxMLCBOVUxMLAorICAgICAgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9CT09MRUFOLCAxLCBHX1RZUEVfVUlOVDY0KTsKKworICAvKioKKyAgICogUlRQU2Vzc2lvbjo6b24tcmVjZWl2aW5nLXJ0Y3AKKyAgICogQHNlc3Npb246IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAYnVmZmVyOiB0aGUgI0dzdEJ1ZmZlciBjb250YWluaW5nIHRoZSBSVENQIHBhY2tldCB0aGF0IHdhcyByZWNlaXZlZAorICAgKgorICAgKiBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gcmVjZWl2aW5nIGFuIFJUQ1AgcGFja2V0IGJlZm9yZSBpdCBpcyBoYW5kbGVkCisgICAqIGJ5IHRoZSBzZXNzaW9uLiBJdCBjYW4gYmUgdXNlZCB0byBleHRyYWN0IGN1c3RvbSBpbmZvcm1hdGlvbiBmcm9tIFJUQ1AgcGFja2V0cy4KKyAgICoKKyAgICogU2luY2U6IDEuNgorICAgKi8KKyAgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fUkVDRUlWSU5HX1JUQ1BdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXJlY2VpdmluZy1ydGNwIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKFJUUFNlc3Npb25DbGFzcywgb25fcmVjZWl2aW5nX3J0Y3ApLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAxLAorICAgICAgR1NUX1RZUEVfQlVGRkVSIHwgR19TSUdOQUxfVFlQRV9TVEFUSUNfU0NPUEUpOworCisgIC8qKgorICAgKiBSVFBTZXNzaW9uOjpvbi1uZXctc2VuZGVyLXNzcmM6CisgICAqIEBzZXNzaW9uOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNyYzogdGhlIG5ldyBzZW5kZXIgUlRQU291cmNlCisgICAqCisgICAqIE5vdGlmeSBvZiBhIG5ldyBzZW5kZXIgU1NSQyB0aGF0IGVudGVyZWQgQHNlc3Npb24uCisgICAqCisgICAqIFNpbmNlOiAxLjgKKyAgICovCisgIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX05FV19TRU5ERVJfU1NSQ10gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tbmV3LXNlbmRlci1zc3JjIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKFJUUFNlc3Npb25DbGFzcywgb25fbmV3X3NlbmRlcl9zc3JjKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19PQkpFQ1QsIEdfVFlQRV9OT05FLCAxLAorICAgICAgUlRQX1RZUEVfU09VUkNFKTsKKworICAvKioKKyAgICogUlRQU2Vzc2lvbjo6b24tc2VuZGVyLXNzcmMtYWN0aXZlOgorICAgKiBAc2Vzc2lvbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzcmM6IHRoZSBhY3RpdmUgc2VuZGVyIFJUUFNvdXJjZQorICAgKgorICAgKiBOb3RpZnkgb2YgYSBzZW5kZXIgU1NSQyB0aGF0IGlzIGFjdGl2ZSwgaS5lLiwgc2VuZGluZyBSVENQLgorICAgKgorICAgKiBTaW5jZTogMS44CisgICAqLworICBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9TRU5ERVJfU1NSQ19BQ1RJVkVdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXNlbmRlci1zc3JjLWFjdGl2ZSIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChSVFBTZXNzaW9uQ2xhc3MsCisgICAgICAgICAgb25fc2VuZGVyX3NzcmNfYWN0aXZlKSwgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX09CSkVDVCwKKyAgICAgIEdfVFlQRV9OT05FLCAxLCBSVFBfVFlQRV9TT1VSQ0UpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSU5URVJOQUxfU1NSQywKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiaW50ZXJuYWwtc3NyYyIsICJJbnRlcm5hbCBTU1JDIiwKKyAgICAgICAgICAiVGhlIGludGVybmFsIFNTUkMgdXNlZCBmb3IgdGhlIHNlc3Npb24gKGRlcHJlY2F0ZWQpIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIDAsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSU5URVJOQUxfU09VUkNFLAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoImludGVybmFsLXNvdXJjZSIsICJJbnRlcm5hbCBTb3VyY2UiLAorICAgICAgICAgICJUaGUgaW50ZXJuYWwgc291cmNlIGVsZW1lbnQgb2YgdGhlIHNlc3Npb24gKGRlcHJlY2F0ZWQpIiwKKyAgICAgICAgICBSVFBfVFlQRV9TT1VSQ0UsIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CQU5EV0lEVEgsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYmFuZHdpZHRoIiwgIkJhbmR3aWR0aCIsCisgICAgICAgICAgIlRoZSBiYW5kd2lkdGggb2YgdGhlIHNlc3Npb24gaW4gYml0cyBwZXIgc2Vjb25kICgwIGZvciBhdXRvLWRpc2NvdmVyKSIsCisgICAgICAgICAgMC4wLCBHX01BWERPVUJMRSwgREVGQVVMVF9CQU5EV0lEVEgsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVENQX0ZSQUNUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoInJ0Y3AtZnJhY3Rpb24iLCAiUlRDUCBGcmFjdGlvbiIsCisgICAgICAgICAgIlRoZSBmcmFjdGlvbiBvZiB0aGUgYmFuZHdpZHRoIHVzZWQgZm9yIFJUQ1AgaW4gYml0cyBwZXIgc2Vjb25kIChvciBhcyBhIHJlYWwgZnJhY3Rpb24gb2YgdGhlIFJUUCBiYW5kd2lkdGggaWYgPCAxKSIsCisgICAgICAgICAgMC4wLCBHX01BWERPVUJMRSwgREVGQVVMVF9SVENQX0ZSQUNUSU9OLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRDUF9SUl9CQU5EV0lEVEgsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicnRjcC1yci1iYW5kd2lkdGgiLCAiUlRDUCBSUiBiYW5kd2lkdGgiLAorICAgICAgICAgICJUaGUgUlRDUCBiYW5kd2lkdGggdXNlZCBmb3IgcmVjZWl2ZXJzIGluIGJpdHMgcGVyIHNlY29uZCAoLTEgPSBkZWZhdWx0KSIsCisgICAgICAgICAgLTEsIEdfTUFYSU5ULCBERUZBVUxUX1JUQ1BfUlJfQkFORFdJRFRILAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRDUF9SU19CQU5EV0lEVEgsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicnRjcC1ycy1iYW5kd2lkdGgiLCAiUlRDUCBSUyBiYW5kd2lkdGgiLAorICAgICAgICAgICJUaGUgUlRDUCBiYW5kd2lkdGggdXNlZCBmb3Igc2VuZGVycyBpbiBiaXRzIHBlciBzZWNvbmQgKC0xID0gZGVmYXVsdCkiLAorICAgICAgICAgIC0xLCBHX01BWElOVCwgREVGQVVMVF9SVENQX1JTX0JBTkRXSURUSCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JUQ1BfTVRVLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJydGNwLW10dSIsICJSVENQIE1UVSIsCisgICAgICAgICAgIlRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIFJUQ1AgcGFja2V0cyIsCisgICAgICAgICAgMTYsIEdfTUFYSU5UMTYsIERFRkFVTFRfUlRDUF9NVFUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TREVTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgic2RlcyIsICJTREVTIiwKKyAgICAgICAgICAiVGhlIFNERVMgaXRlbXMgb2YgdGhpcyBzZXNzaW9uIiwKKyAgICAgICAgICBHU1RfVFlQRV9TVFJVQ1RVUkUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTlVNX1NPVVJDRVMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm51bS1zb3VyY2VzIiwgIk51bSBTb3VyY2VzIiwKKyAgICAgICAgICAiVGhlIG51bWJlciBvZiBzb3VyY2VzIGluIHRoZSBzZXNzaW9uIiwgMCwgR19NQVhVSU5ULAorICAgICAgICAgIERFRkFVTFRfTlVNX1NPVVJDRVMsIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9OVU1fQUNUSVZFX1NPVVJDRVMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoIm51bS1hY3RpdmUtc291cmNlcyIsICJOdW0gQWN0aXZlIFNvdXJjZXMiLAorICAgICAgICAgICJUaGUgbnVtYmVyIG9mIGFjdGl2ZSBzb3VyY2VzIGluIHRoZSBzZXNzaW9uIiwgMCwgR19NQVhVSU5ULAorICAgICAgICAgIERFRkFVTFRfTlVNX0FDVElWRV9TT1VSQ0VTLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBSVFBTb3VyY2U6OnNvdXJjZXMKKyAgICoKKyAgICogR2V0IGEgR1ZhbHVlIEFycmF5IG9mIGFsbCBzb3VyY2VzIGluIHRoZSBzZXNzaW9uLgorICAgKgorICAgKiA8ZXhhbXBsZT4KKyAgICogPHRpdGxlPkdldHRpbmcgdGhlICNSVFBTb3VyY2VzIG9mIGEgc2Vzc2lvbgorICAgKiA8cHJvZ3JhbWxpc3Rpbmc+CisgICAqIHsKKyAgICogICBHVmFsdWVBcnJheSAqYXJyOworICAgKiAgIEdWYWx1ZSAqdmFsOworICAgKiAgIGd1aW50IGk7CisgICAqCisgICAqICAgZ19vYmplY3RfZ2V0IChzZXNzLCAic291cmNlcyIsICZhcnIsIE5VTEwpOworICAgKgorICAgKiAgIGZvciAoaSA9IDA7IGkgPCBhcnItPm5fdmFsdWVzOyBpKyspIHsKKyAgICogICAgIFJUUFNvdXJjZSAqc291cmNlOworICAgKgorICAgKiAgICAgdmFsID0gZ192YWx1ZV9hcnJheV9nZXRfbnRoIChhcnIsIGkpOworICAgKiAgICAgc291cmNlID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWwpOworICAgKiAgIH0KKyAgICogICBnX3ZhbHVlX2FycmF5X2ZyZWUgKGFycik7CisgICAqIH0KKyAgICogPC9wcm9ncmFtbGlzdGluZz4KKyAgICogPC9leGFtcGxlPgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TT1VSQ0VTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgic291cmNlcyIsICJTb3VyY2VzIiwKKyAgICAgICAgICAiQW4gYXJyYXkgb2YgYWxsIGtub3duIHNvdXJjZXMgaW4gdGhlIHNlc3Npb24iLAorICAgICAgICAgIEdfVFlQRV9WQUxVRV9BUlJBWSwgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0ZBVk9SX05FVywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZmF2b3ItbmV3IiwgIkZhdm9yIG5ldyBzb3VyY2VzIiwKKyAgICAgICAgICAiUmVzb2x2ZSBTU1JDIGNvbmZsaWN0IGluIGZhdm9yIG9mIG5ldyBzb3VyY2VzIiwgRkFMU0UsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVENQX01JTl9JTlRFUlZBTCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJydGNwLW1pbi1pbnRlcnZhbCIsICJNaW5pbXVtIFJUQ1AgaW50ZXJ2YWwiLAorICAgICAgICAgICJNaW5pbXVtIGludGVydmFsIGJldHdlZW4gUmVndWxhciBSVENQIHBhY2tldCAoaW4gbnMpIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQ2NCwgREVGQVVMVF9SVENQX01JTl9JTlRFUlZBTCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9SVENQX0ZFRURCQUNLX1JFVEVOVElPTl9XSU5ET1csCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgicnRjcC1mZWVkYmFjay1yZXRlbnRpb24td2luZG93IiwKKyAgICAgICAgICAiUlRDUCBGZWVkYmFjayByZXRlbnRpb24gd2luZG93IiwKKyAgICAgICAgICAiRHVyYXRpb24gZHVyaW5nIHdoaWNoIFJUQ1AgRmVlZGJhY2sgcGFja2V0cyBhcmUgcmV0YWluZWQgKGluIG5zKSIsCisgICAgICAgICAgMCwgR19NQVhVSU5UNjQsIERFRkFVTFRfUlRDUF9GRUVEQkFDS19SRVRFTlRJT05fV0lORE9XLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1JUQ1BfSU1NRURJQVRFX0ZFRURCQUNLX1RIUkVTSE9MRCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgicnRjcC1pbW1lZGlhdGUtZmVlZGJhY2stdGhyZXNob2xkIiwKKyAgICAgICAgICAiUlRDUCBJbW1lZGlhdGUgRmVlZGJhY2sgdGhyZXNob2xkIiwKKyAgICAgICAgICAiVGhlIG1heGltdW0gbnVtYmVyIG9mIG1lbWJlcnMgb2YgYSBSVFAgc2Vzc2lvbiBmb3Igd2hpY2ggaW1tZWRpYXRlIgorICAgICAgICAgICIgZmVlZGJhY2sgaXMgdXNlZCAoREVQUkVDQVRFRDogaGFzIG5vIGVmZmVjdCBhbmQgaXMgbm90IG5lZWRlZCkiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVCwgREVGQVVMVF9SVENQX0lNTUVESUFURV9GRUVEQkFDS19USFJFU0hPTEQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR19QQVJBTV9ERVBSRUNBVEVEKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QUk9CQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInByb2JhdGlvbiIsICJOdW1iZXIgb2YgcHJvYmF0aW9ucyIsCisgICAgICAgICAgIkNvbnNlY3V0aXZlIHBhY2tldCBzZXF1ZW5jZSBudW1iZXJzIHRvIGFjY2VwdCB0aGUgc291cmNlIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfUFJPQkFUSU9OLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX0RST1BPVVRfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LWRyb3BvdXQtdGltZSIsICJNYXggZHJvcG91dCB0aW1lIiwKKyAgICAgICAgICAiVGhlIG1heGltdW0gdGltZSAobWlsbGlzZWNvbmRzKSBvZiBtaXNzaW5nIHBhY2tldHMgdG9sZXJhdGVkLiIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCBERUZBVUxUX01BWF9EUk9QT1VUX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfTUlTT1JERVJfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LW1pc29yZGVyLXRpbWUiLCAiTWF4IG1pc29yZGVyIHRpbWUiLAorICAgICAgICAgICJUaGUgbWF4aW11bSB0aW1lIChtaWxsaXNlY29uZHMpIG9mIG1pc29yZGVyZWQgcGFja2V0cyB0b2xlcmF0ZWQuIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfTUFYX01JU09SREVSX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIFJUUFNlc3Npb246OnN0YXRzOgorICAgKgorICAgKiBWYXJpb3VzIHNlc3Npb24gc3RhdGlzdGljcy4gVGhpcyBwcm9wZXJ0eSByZXR1cm5zIGEgR3N0U3RydWN0dXJlCisgICAqIHdpdGggbmFtZSBhcHBsaWNhdGlvbi94LXJ0cC1zZXNzaW9uLXN0YXRzIHdpdGggdGhlIGZvbGxvd2luZyBmaWVsZHM6CisgICAqCisgICAqICAicnR4LWRyb3AtY291bnQiICBHX1RZUEVfVUlOVCAgIFRoZSBudW1iZXIgb2YgcmV0cmFuc21pc3Npb24gZXZlbnRzCisgICAqICAgICAgZHJvcHBlZCAoZHVlIHRvIGJhbmR3aWR0aCBjb25zdHJhaW50cykKKyAgICogICJzZW50LW5hY2stY291bnQiIEdfVFlQRV9VSU5UICAgTnVtYmVyIG9mIE5BQ0tzIHNlbnQKKyAgICogICJyZWN2LW5hY2stY291bnQiIEdfVFlQRV9VSU5UICAgTnVtYmVyIG9mIE5BQ0tzIHJlY2VpdmVkCisgICAqICAic291cmNlLXN0YXRzIiAgICBHX1RZUEVfQk9YRUQgIEdWYWx1ZUFycmF5IG9mICNSVFBTb3VyY2U6OnN0YXRzIGZvciBhbGwKKyAgICogICAgICBSVFAgc291cmNlcyAoU2luY2UgMS44KQorICAgKgorICAgKiBTaW5jZTogMS40CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NUQVRTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgic3RhdHMiLCAiU3RhdGlzdGljcyIsCisgICAgICAgICAgIlZhcmlvdXMgc3RhdGlzdGljcyIsIEdTVF9UWVBFX1NUUlVDVFVSRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUlRQX1BST0ZJTEUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoInJ0cC1wcm9maWxlIiwgIlJUUCBQcm9maWxlIiwKKyAgICAgICAgICAiUlRQIHByb2ZpbGUgdG8gdXNlIGZvciB0aGlzIHNlc3Npb24iLCBHU1RfVFlQRV9SVFBfUFJPRklMRSwKKyAgICAgICAgICBERUZBVUxUX1JUUF9QUk9GSUxFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JUQ1BfUkVEVUNFRF9TSVpFLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJydGNwLXJlZHVjZWQtc2l6ZSIsICJSVENQIFJlZHVjZWQgU2l6ZSIsCisgICAgICAgICAgIlVzZSBSZWR1Y2VkIFNpemUgUlRDUCBmb3IgZmVlZGJhY2sgcGFja2V0cyIsCisgICAgICAgICAgREVGQVVMVF9SVENQX1JFRFVDRURfU0laRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBrbGFzcy0+Z2V0X3NvdXJjZV9ieV9zc3JjID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChydHBfc2Vzc2lvbl9nZXRfc291cmNlX2J5X3NzcmMpOworICBrbGFzcy0+c2VuZF9ydGNwID0gR1NUX0RFQlVHX0ZVTkNQVFIgKHJ0cF9zZXNzaW9uX3NlbmRfcnRjcCk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cF9zZXNzaW9uX2RlYnVnLCAicnRwc2Vzc2lvbiIsIDAsICJSVFAgU2Vzc2lvbiIpOworfQorCitzdGF0aWMgdm9pZAorcnRwX3Nlc3Npb25faW5pdCAoUlRQU2Vzc2lvbiAqIHNlc3MpCit7CisgIGdpbnQgaTsKKyAgZ2NoYXIgKnN0cjsKKworICBnX211dGV4X2luaXQgKCZzZXNzLT5sb2NrKTsKKyAgc2Vzcy0+a2V5ID0gZ19yYW5kb21faW50ICgpOworICBzZXNzLT5tYXNrX2lkeCA9IDA7CisgIHNlc3MtPm1hc2sgPSAwOworCisgIC8qIFRPRE86IFdlIGN1cnJlbnRseSBvbmx5IHVzZSB0aGUgZmlyc3QgaGFzaCB0YWJsZSBidXQgdGhpcyBpcyB0aGUKKyAgICogYmVnaW5uaW5nIG9mIGFuIGltcGxlbWVudGF0aW9uIGZvciBSRkMyNzYyCisgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDE7IGkrKykgeworICAgIHNlc3MtPnNzcmNzW2ldID0KKyAgICAgICAgZ19oYXNoX3RhYmxlX25ld19mdWxsIChOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdfb2JqZWN0X3VucmVmKTsKKyAgfQorCisgIHJ0cF9zdGF0c19pbml0X2RlZmF1bHRzICgmc2Vzcy0+c3RhdHMpOworICBJTklUX0FWRyAoc2Vzcy0+c3RhdHMuYXZnX3J0Y3BfcGFja2V0X3NpemUsIDEwMCk7CisgIHJ0cF9zdGF0c19zZXRfbWluX2ludGVydmFsICgmc2Vzcy0+c3RhdHMsCisgICAgICAoZ2RvdWJsZSkgREVGQVVMVF9SVENQX01JTl9JTlRFUlZBTCAvIEdTVF9TRUNPTkQpOworCisgIHNlc3MtPnJlY2FsY19iYW5kd2lkdGggPSBUUlVFOworICBzZXNzLT5iYW5kd2lkdGggPSBERUZBVUxUX0JBTkRXSURUSDsKKyAgc2Vzcy0+cnRjcF9iYW5kd2lkdGggPSBERUZBVUxUX1JUQ1BfRlJBQ1RJT047CisgIHNlc3MtPnJ0Y3BfcnJfYmFuZHdpZHRoID0gREVGQVVMVF9SVENQX1JSX0JBTkRXSURUSDsKKyAgc2Vzcy0+cnRjcF9yc19iYW5kd2lkdGggPSBERUZBVUxUX1JUQ1BfUlNfQkFORFdJRFRIOworCisgIC8qIGRlZmF1bHQgVURQIGhlYWRlciBsZW5ndGggKi8KKyAgc2Vzcy0+aGVhZGVyX2xlbiA9IDI4OworICBzZXNzLT5tdHUgPSBERUZBVUxUX1JUQ1BfTVRVOworCisgIHNlc3MtPnByb2JhdGlvbiA9IERFRkFVTFRfUFJPQkFUSU9OOworICBzZXNzLT5tYXhfZHJvcG91dF90aW1lID0gREVGQVVMVF9NQVhfRFJPUE9VVF9USU1FOworICBzZXNzLT5tYXhfbWlzb3JkZXJfdGltZSA9IERFRkFVTFRfTUFYX01JU09SREVSX1RJTUU7CisKKyAgLyogc29tZSBkZWZhdWx0IFNERVMgZW50cmllcyAqLworICBzZXNzLT5zZGVzID0gZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCJhcHBsaWNhdGlvbi94LXJ0cC1zb3VyY2Utc2RlcyIpOworCisgIC8qIHdlIGRvIG5vdCB3YW50IHRvIGxlYWsgZGV0YWlscyBsaWtlIHRoZSB1c2VybmFtZSBvciBob3N0bmFtZSBoZXJlICovCisgIHN0ciA9IGdfc3RyZHVwX3ByaW50ZiAoInVzZXIldUBob3N0LSV4IiwgZ19yYW5kb21faW50ICgpLCBnX3JhbmRvbV9pbnQgKCkpOworICBnc3Rfc3RydWN0dXJlX3NldCAoc2Vzcy0+c2RlcywgImNuYW1lIiwgR19UWVBFX1NUUklORywgc3RyLCBOVUxMKTsKKyAgZ19mcmVlIChzdHIpOworCisjaWYgMAorICAvKiB3ZSBkbyBub3Qgd2FudCB0byBsZWFrIHRoZSB1c2VyJ3MgcmVhbCBuYW1lIGhlcmUgKi8KKyAgc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiQW5vbiV1IiwgZ19yYW5kb21faW50ICgpKTsKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKHNkZXMsICJuYW1lIiwgR19UWVBFX1NUUklORywgc3RyLCBOVUxMKTsKKyAgZ19mcmVlIChzdHIpOworI2VuZGlmCisKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKHNlc3MtPnNkZXMsICJ0b29sIiwgR19UWVBFX1NUUklORywgIkdTdHJlYW1lciIsIE5VTEwpOworCisgIC8qIHRoaXMgaXMgdGhlIFNTUkMgd2Ugc3VnZ2VzdCAqLworICBzZXNzLT5zdWdnZXN0ZWRfc3NyYyA9IHJ0cF9zZXNzaW9uX2NyZWF0ZV9uZXdfc3NyYyAoc2Vzcyk7CisgIHNlc3MtPmludGVybmFsX3NzcmNfc2V0ID0gRkFMU0U7CisKKyAgc2Vzcy0+Zmlyc3RfcnRjcCA9IFRSVUU7CisgIHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgc2Vzcy0+bGFzdF9ydGNwX2NoZWNrX3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBzZXNzLT5sYXN0X3J0Y3Bfc2VuZF90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgc2Vzcy0+bGFzdF9ydGNwX2ludGVydmFsID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBzZXNzLT5uZXh0X2Vhcmx5X3J0Y3BfdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIHNlc3MtPnJ0Y3BfZmVlZGJhY2tfcmV0ZW50aW9uX3dpbmRvdyA9IERFRkFVTFRfUlRDUF9GRUVEQkFDS19SRVRFTlRJT05fV0lORE9XOworICBzZXNzLT5ydGNwX2ltbWVkaWF0ZV9mZWVkYmFja190aHJlc2hvbGQgPQorICAgICAgREVGQVVMVF9SVENQX0lNTUVESUFURV9GRUVEQkFDS19USFJFU0hPTEQ7CisgIHNlc3MtPnJ0cF9wcm9maWxlID0gREVGQVVMVF9SVFBfUFJPRklMRTsKKyAgc2Vzcy0+cmVkdWNlZF9zaXplX3J0Y3AgPSBERUZBVUxUX1JUQ1BfUkVEVUNFRF9TSVpFOworCisgIHNlc3MtPmlzX2RvaW5nX3B0cCA9IFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitydHBfc2Vzc2lvbl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgUlRQU2Vzc2lvbiAqc2VzczsKKyAgZ2ludCBpOworCisgIHNlc3MgPSBSVFBfU0VTU0lPTl9DQVNUIChvYmplY3QpOworCisgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoc2Vzcy0+c2Rlcyk7CisKKyAgZ19saXN0X2ZyZWVfZnVsbCAoc2Vzcy0+Y29uZmxpY3RpbmdfYWRkcmVzc2VzLAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBydHBfY29uZmxpY3RpbmdfYWRkcmVzc19mcmVlKTsKKworICAvKiBUT0RPOiBDaGFuZ2UgdGhpcyBhZ2FpbiB3aGVuIGltcGxlbWVudGluZyBSRkMgMjc2MgorICAgKiBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCAxOyBpKyspCisgICAgZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKHNlc3MtPnNzcmNzW2ldKTsKKworICBnX211dGV4X2NsZWFyICgmc2Vzcy0+bG9jayk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHJ0cF9zZXNzaW9uX3BhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorY29weV9zb3VyY2UgKGdwb2ludGVyIGtleSwgUlRQU291cmNlICogc291cmNlLCBHVmFsdWVBcnJheSAqIGFycikKK3sKKyAgR1ZhbHVlIHZhbHVlID0geyAwIH07CisKKyAgZ192YWx1ZV9pbml0ICgmdmFsdWUsIFJUUF9UWVBFX1NPVVJDRSk7CisgIGdfdmFsdWVfdGFrZV9vYmplY3QgKCZ2YWx1ZSwgc291cmNlKTsKKyAgLyogY29waWVzIHRoZSB2YWx1ZSAqLworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAoYXJyLCAmdmFsdWUpOworfQorCitzdGF0aWMgR1ZhbHVlQXJyYXkgKgorcnRwX3Nlc3Npb25fY3JlYXRlX3NvdXJjZXMgKFJUUFNlc3Npb24gKiBzZXNzKQoreworICBHVmFsdWVBcnJheSAqcmVzOworICBndWludCBzaXplOworCisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICAvKiBnZXQgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0YWJsZSAqLworICBzaXplID0gZ19oYXNoX3RhYmxlX3NpemUgKHNlc3MtPnNzcmNzW3Nlc3MtPm1hc2tfaWR4XSk7CisgIC8qIGNyZWF0ZSB0aGUgcmVzdWx0IHZhbHVlIGFycmF5ICovCisgIHJlcyA9IGdfdmFsdWVfYXJyYXlfbmV3IChzaXplKTsKKworICAvKiBhbmQgY29weSBhbGwgdmFsdWVzIGludG8gdGhlIGFycmF5ICovCisgIGdfaGFzaF90YWJsZV9mb3JlYWNoIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0sIChHSEZ1bmMpIGNvcHlfc291cmNlLCByZXMpOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitjcmVhdGVfc291cmNlX3N0YXRzIChncG9pbnRlciBrZXksIFJUUFNvdXJjZSAqIHNvdXJjZSwgR1ZhbHVlQXJyYXkgKiBhcnIpCit7CisgIEdWYWx1ZSB2YWx1ZSA9IEdfVkFMVUVfSU5JVDsKKyAgR3N0U3RydWN0dXJlICpzOworCisgIGdfb2JqZWN0X2dldCAoc291cmNlLCAic3RhdHMiLCAmcywgTlVMTCk7CisKKyAgZ192YWx1ZV9pbml0ICgmdmFsdWUsIEdTVF9UWVBFX1NUUlVDVFVSRSk7CisgIGdzdF92YWx1ZV9zZXRfc3RydWN0dXJlICgmdmFsdWUsIHMpOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAoYXJyLCAmdmFsdWUpOworICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHMpOworICBnX3ZhbHVlX3Vuc2V0ICgmdmFsdWUpOworfQorCitzdGF0aWMgR3N0U3RydWN0dXJlICoKK3J0cF9zZXNzaW9uX2NyZWF0ZV9zdGF0cyAoUlRQU2Vzc2lvbiAqIHNlc3MpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgR1ZhbHVlQXJyYXkgKnNvdXJjZV9zdGF0czsKKyAgR1ZhbHVlIHNvdXJjZV9zdGF0c192ID0gR19WQUxVRV9JTklUOworICBndWludCBzaXplOworCisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1zZXNzaW9uLXN0YXRzIiwKKyAgICAgICJydHgtZHJvcC1jb3VudCIsIEdfVFlQRV9VSU5ULCBzZXNzLT5zdGF0cy5uYWNrc19kcm9wcGVkLAorICAgICAgInNlbnQtbmFjay1jb3VudCIsIEdfVFlQRV9VSU5ULCBzZXNzLT5zdGF0cy5uYWNrc19zZW50LAorICAgICAgInJlY3YtbmFjay1jb3VudCIsIEdfVFlQRV9VSU5ULCBzZXNzLT5zdGF0cy5uYWNrc19yZWNlaXZlZCwgTlVMTCk7CisKKyAgc2l6ZSA9IGdfaGFzaF90YWJsZV9zaXplIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0pOworICBzb3VyY2Vfc3RhdHMgPSBnX3ZhbHVlX2FycmF5X25ldyAoc2l6ZSk7CisgIGdfaGFzaF90YWJsZV9mb3JlYWNoIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0sCisgICAgICAoR0hGdW5jKSBjcmVhdGVfc291cmNlX3N0YXRzLCBzb3VyY2Vfc3RhdHMpOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIGdfdmFsdWVfaW5pdCAoJnNvdXJjZV9zdGF0c192LCBHX1RZUEVfVkFMVUVfQVJSQVkpOworICBnX3ZhbHVlX3Rha2VfYm94ZWQgKCZzb3VyY2Vfc3RhdHNfdiwgc291cmNlX3N0YXRzKTsKKyAgZ3N0X3N0cnVjdHVyZV90YWtlX3ZhbHVlIChzLCAic291cmNlLXN0YXRzIiwgJnNvdXJjZV9zdGF0c192KTsKKworICByZXR1cm4gczsKK30KKworc3RhdGljIHZvaWQKK3J0cF9zZXNzaW9uX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBSVFBTZXNzaW9uICpzZXNzOworCisgIHNlc3MgPSBSVFBfU0VTU0lPTiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfSU5URVJOQUxfU1NSQzoKKyAgICAgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICAgICAgc2Vzcy0+c3VnZ2VzdGVkX3NzcmMgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBzZXNzLT5pbnRlcm5hbF9zc3JjX3NldCA9IFRSVUU7CisgICAgICBzZXNzLT5pbnRlcm5hbF9zc3JjX2Zyb21fY2Fwc19vcl9wcm9wZXJ0eSA9IFRSVUU7CisgICAgICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICAgICAgaWYgKHNlc3MtPmNhbGxiYWNrcy5yZWNvbmZpZ3VyZSkKKyAgICAgICAgc2Vzcy0+Y2FsbGJhY2tzLnJlY29uZmlndXJlIChzZXNzLCBzZXNzLT5yZWNvbmZpZ3VyZV91c2VyX2RhdGEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JBTkRXSURUSDoKKyAgICAgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICAgICAgc2Vzcy0+YmFuZHdpZHRoID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBzZXNzLT5yZWNhbGNfYmFuZHdpZHRoID0gVFJVRTsKKyAgICAgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRDUF9GUkFDVElPTjoKKyAgICAgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICAgICAgc2Vzcy0+cnRjcF9iYW5kd2lkdGggPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIHNlc3MtPnJlY2FsY19iYW5kd2lkdGggPSBUUlVFOworICAgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX1JSX0JBTkRXSURUSDoKKyAgICAgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICAgICAgc2Vzcy0+cnRjcF9ycl9iYW5kd2lkdGggPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIHNlc3MtPnJlY2FsY19iYW5kd2lkdGggPSBUUlVFOworICAgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX1JTX0JBTkRXSURUSDoKKyAgICAgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICAgICAgc2Vzcy0+cnRjcF9yc19iYW5kd2lkdGggPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIHNlc3MtPnJlY2FsY19iYW5kd2lkdGggPSBUUlVFOworICAgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX01UVToKKyAgICAgIHNlc3MtPm10dSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TREVTOgorICAgICAgcnRwX3Nlc3Npb25fc2V0X3NkZXNfc3RydWN0IChzZXNzLCBnX3ZhbHVlX2dldF9ib3hlZCAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GQVZPUl9ORVc6CisgICAgICBzZXNzLT5mYXZvcl9uZXcgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRDUF9NSU5fSU5URVJWQUw6CisgICAgICBydHBfc3RhdHNfc2V0X21pbl9pbnRlcnZhbCAoJnNlc3MtPnN0YXRzLAorICAgICAgICAgIChnZG91YmxlKSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKSAvIEdTVF9TRUNPTkQpOworICAgICAgLyogdHJpZ2dlciByZWNvbnNpZGVyYXRpb24gKi8KKyAgICAgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICAgICAgc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUgPSAwOworICAgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgICAgIGlmIChzZXNzLT5jYWxsYmFja3MucmVjb25zaWRlcikKKyAgICAgICAgc2Vzcy0+Y2FsbGJhY2tzLnJlY29uc2lkZXIgKHNlc3MsIHNlc3MtPnJlY29uc2lkZXJfdXNlcl9kYXRhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX0lNTUVESUFURV9GRUVEQkFDS19USFJFU0hPTEQ6CisgICAgICBzZXNzLT5ydGNwX2ltbWVkaWF0ZV9mZWVkYmFja190aHJlc2hvbGQgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUFJPQkFUSU9OOgorICAgICAgc2Vzcy0+cHJvYmF0aW9uID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9EUk9QT1VUX1RJTUU6CisgICAgICBzZXNzLT5tYXhfZHJvcG91dF90aW1lID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9NSVNPUkRFUl9USU1FOgorICAgICAgc2Vzcy0+bWF4X21pc29yZGVyX3RpbWUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRQX1BST0ZJTEU6CisgICAgICBzZXNzLT5ydHBfcHJvZmlsZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIC8qIHRyaWdnZXIgcmVjb25zaWRlcmF0aW9uICovCisgICAgICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgICAgIHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lID0gMDsKKyAgICAgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgICAgICBpZiAoc2Vzcy0+Y2FsbGJhY2tzLnJlY29uc2lkZXIpCisgICAgICAgIHNlc3MtPmNhbGxiYWNrcy5yZWNvbnNpZGVyIChzZXNzLCBzZXNzLT5yZWNvbnNpZGVyX3VzZXJfZGF0YSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRDUF9SRURVQ0VEX1NJWkU6CisgICAgICBzZXNzLT5yZWR1Y2VkX3NpemVfcnRjcCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3J0cF9zZXNzaW9uX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBSVFBTZXNzaW9uICpzZXNzOworCisgIHNlc3MgPSBSVFBfU0VTU0lPTiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfSU5URVJOQUxfU1NSQzoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHBfc2Vzc2lvbl9zdWdnZXN0X3NzcmMgKHNlc3MsIE5VTEwpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTlRFUk5BTF9TT1VSQ0U6CisgICAgICAvKiBGSVhNRSwgcmV0dXJuIGEgcmFuZG9tIHNvdXJjZSAqLworICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORFdJRFRIOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgc2Vzcy0+YmFuZHdpZHRoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX0ZSQUNUSU9OOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgc2Vzcy0+cnRjcF9iYW5kd2lkdGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUQ1BfUlJfQkFORFdJRFRIOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgc2Vzcy0+cnRjcF9ycl9iYW5kd2lkdGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUQ1BfUlNfQkFORFdJRFRIOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgc2Vzcy0+cnRjcF9yc19iYW5kd2lkdGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUQ1BfTVRVOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNlc3MtPm10dSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0RFUzoKKyAgICAgIGdfdmFsdWVfdGFrZV9ib3hlZCAodmFsdWUsIHJ0cF9zZXNzaW9uX2dldF9zZGVzX3N0cnVjdCAoc2VzcykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05VTV9TT1VSQ0VTOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0cF9zZXNzaW9uX2dldF9udW1fc291cmNlcyAoc2VzcykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05VTV9BQ1RJVkVfU09VUkNFUzoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHBfc2Vzc2lvbl9nZXRfbnVtX2FjdGl2ZV9zb3VyY2VzIChzZXNzKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU09VUkNFUzoKKyAgICAgIGdfdmFsdWVfdGFrZV9ib3hlZCAodmFsdWUsIHJ0cF9zZXNzaW9uX2NyZWF0ZV9zb3VyY2VzIChzZXNzKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRkFWT1JfTkVXOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNlc3MtPmZhdm9yX25ldyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRDUF9NSU5fSU5URVJWQUw6CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBzZXNzLT5zdGF0cy5taW5faW50ZXJ2YWwgKiBHU1RfU0VDT05EKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX0lNTUVESUFURV9GRUVEQkFDS19USFJFU0hPTEQ6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc2Vzcy0+cnRjcF9pbW1lZGlhdGVfZmVlZGJhY2tfdGhyZXNob2xkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9CQVRJT046CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc2Vzcy0+cHJvYmF0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfRFJPUE9VVF9USU1FOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNlc3MtPm1heF9kcm9wb3V0X3RpbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9NSVNPUkRFUl9USU1FOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNlc3MtPm1heF9taXNvcmRlcl90aW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVEFUUzoKKyAgICAgIGdfdmFsdWVfdGFrZV9ib3hlZCAodmFsdWUsIHJ0cF9zZXNzaW9uX2NyZWF0ZV9zdGF0cyAoc2VzcykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JUUF9QUk9GSUxFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHNlc3MtPnJ0cF9wcm9maWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SVENQX1JFRFVDRURfU0laRToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzZXNzLT5yZWR1Y2VkX3NpemVfcnRjcCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitvbl9uZXdfc3NyYyAoUlRQU2Vzc2lvbiAqIHNlc3MsIFJUUFNvdXJjZSAqIHNvdXJjZSkKK3sKKyAgZ19vYmplY3RfcmVmIChzb3VyY2UpOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICBnX3NpZ25hbF9lbWl0IChzZXNzLCBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9ORVdfU1NSQ10sIDAsIHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICBnX29iamVjdF91bnJlZiAoc291cmNlKTsKK30KKworc3RhdGljIHZvaWQKK29uX3NzcmNfY29sbGlzaW9uIChSVFBTZXNzaW9uICogc2VzcywgUlRQU291cmNlICogc291cmNlKQoreworICBnX29iamVjdF9yZWYgKHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MsIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfQ09MTElTSU9OXSwgMCwKKyAgICAgIHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICBnX29iamVjdF91bnJlZiAoc291cmNlKTsKK30KKworc3RhdGljIHZvaWQKK29uX3NzcmNfdmFsaWRhdGVkIChSVFBTZXNzaW9uICogc2VzcywgUlRQU291cmNlICogc291cmNlKQoreworICBnX29iamVjdF9yZWYgKHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MsIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfVkFMSURBVEVEXSwgMCwKKyAgICAgIHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICBnX29iamVjdF91bnJlZiAoc291cmNlKTsKK30KKworc3RhdGljIHZvaWQKK29uX3NzcmNfYWN0aXZlIChSVFBTZXNzaW9uICogc2VzcywgUlRQU291cmNlICogc291cmNlKQoreworICBnX29iamVjdF9yZWYgKHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MsIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX1NTUkNfQUNUSVZFXSwgMCwgc291cmNlKTsKKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgIGdfb2JqZWN0X3VucmVmIChzb3VyY2UpOworfQorCitzdGF0aWMgdm9pZAorb25fc3NyY19zZGVzIChSVFBTZXNzaW9uICogc2VzcywgUlRQU291cmNlICogc291cmNlKQoreworICBnX29iamVjdF9yZWYgKHNvdXJjZSk7CisgIEdTVF9ERUJVRyAoIlNERVMgY2hhbmdlZCBmb3IgU1NSQyAlMDh4Iiwgc291cmNlLT5zc3JjKTsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgZ19zaWduYWxfZW1pdCAoc2VzcywgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fU1NSQ19TREVTXSwgMCwgc291cmNlKTsKKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgIGdfb2JqZWN0X3VucmVmIChzb3VyY2UpOworfQorCitzdGF0aWMgdm9pZAorb25fYnllX3NzcmMgKFJUUFNlc3Npb24gKiBzZXNzLCBSVFBTb3VyY2UgKiBzb3VyY2UpCit7CisgIGdfb2JqZWN0X3JlZiAoc291cmNlKTsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgZ19zaWduYWxfZW1pdCAoc2VzcywgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fQllFX1NTUkNdLCAwLCBzb3VyY2UpOworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgZ19vYmplY3RfdW5yZWYgKHNvdXJjZSk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9ieWVfdGltZW91dCAoUlRQU2Vzc2lvbiAqIHNlc3MsIFJUUFNvdXJjZSAqIHNvdXJjZSkKK3sKKyAgZ19vYmplY3RfcmVmIChzb3VyY2UpOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICBnX3NpZ25hbF9lbWl0IChzZXNzLCBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9CWUVfVElNRU9VVF0sIDAsIHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICBnX29iamVjdF91bnJlZiAoc291cmNlKTsKK30KKworc3RhdGljIHZvaWQKK29uX3RpbWVvdXQgKFJUUFNlc3Npb24gKiBzZXNzLCBSVFBTb3VyY2UgKiBzb3VyY2UpCit7CisgIGdfb2JqZWN0X3JlZiAoc291cmNlKTsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgZ19zaWduYWxfZW1pdCAoc2VzcywgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fVElNRU9VVF0sIDAsIHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICBnX29iamVjdF91bnJlZiAoc291cmNlKTsKK30KKworc3RhdGljIHZvaWQKK29uX3NlbmRlcl90aW1lb3V0IChSVFBTZXNzaW9uICogc2VzcywgUlRQU291cmNlICogc291cmNlKQoreworICBnX29iamVjdF9yZWYgKHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MsIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX1NFTkRFUl9USU1FT1VUXSwgMCwKKyAgICAgIHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICBnX29iamVjdF91bnJlZiAoc291cmNlKTsKK30KKworc3RhdGljIHZvaWQKK29uX25ld19zZW5kZXJfc3NyYyAoUlRQU2Vzc2lvbiAqIHNlc3MsIFJUUFNvdXJjZSAqIHNvdXJjZSkKK3sKKyAgZ19vYmplY3RfcmVmIChzb3VyY2UpOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICBnX3NpZ25hbF9lbWl0IChzZXNzLCBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9ORVdfU0VOREVSX1NTUkNdLCAwLAorICAgICAgc291cmNlKTsKKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgIGdfb2JqZWN0X3VucmVmIChzb3VyY2UpOworfQorCitzdGF0aWMgdm9pZAorb25fc2VuZGVyX3NzcmNfYWN0aXZlIChSVFBTZXNzaW9uICogc2VzcywgUlRQU291cmNlICogc291cmNlKQoreworICBnX29iamVjdF9yZWYgKHNvdXJjZSk7CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgIGdfc2lnbmFsX2VtaXQgKHNlc3MsIHJ0cF9zZXNzaW9uX3NpZ25hbHNbU0lHTkFMX09OX1NFTkRFUl9TU1JDX0FDVElWRV0sIDAsCisgICAgICBzb3VyY2UpOworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgZ19vYmplY3RfdW5yZWYgKHNvdXJjZSk7Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fbmV3OgorICoKKyAqIENyZWF0ZSBhIG5ldyBzZXNzaW9uIG9iamVjdC4KKyAqCisgKiBSZXR1cm5zOiBhIG5ldyAjUlRQU2Vzc2lvbi4gZ19vYmplY3RfdW5yZWYoKSBhZnRlciB1c2FnZS4KKyAqLworUlRQU2Vzc2lvbiAqCitydHBfc2Vzc2lvbl9uZXcgKHZvaWQpCit7CisgIFJUUFNlc3Npb24gKnNlc3M7CisKKyAgc2VzcyA9IGdfb2JqZWN0X25ldyAoUlRQX1RZUEVfU0VTU0lPTiwgTlVMTCk7CisKKyAgcmV0dXJuIHNlc3M7Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fc2V0X2NhbGxiYWNrczoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQGNhbGxiYWNrczogY2FsbGJhY2tzIHRvIGNvbmZpZ3VyZQorICogQHVzZXJfZGF0YTogdXNlciBkYXRhIHBhc3NlZCBpbiB0aGUgY2FsbGJhY2tzCisgKgorICogQ29uZmlndXJlIGEgc2V0IG9mIGNhbGxiYWNrcyB0byBiZSBub3RpZmllZCBvZiBhY3Rpb25zLgorICovCit2b2lkCitydHBfc2Vzc2lvbl9zZXRfY2FsbGJhY2tzIChSVFBTZXNzaW9uICogc2VzcywgUlRQU2Vzc2lvbkNhbGxiYWNrcyAqIGNhbGxiYWNrcywKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKFJUUF9JU19TRVNTSU9OIChzZXNzKSk7CisKKyAgaWYgKGNhbGxiYWNrcy0+cHJvY2Vzc19ydHApIHsKKyAgICBzZXNzLT5jYWxsYmFja3MucHJvY2Vzc19ydHAgPSBjYWxsYmFja3MtPnByb2Nlc3NfcnRwOworICAgIHNlc3MtPnByb2Nlc3NfcnRwX3VzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgfQorICBpZiAoY2FsbGJhY2tzLT5zZW5kX3J0cCkgeworICAgIHNlc3MtPmNhbGxiYWNrcy5zZW5kX3J0cCA9IGNhbGxiYWNrcy0+c2VuZF9ydHA7CisgICAgc2Vzcy0+c2VuZF9ydHBfdXNlcl9kYXRhID0gdXNlcl9kYXRhOworICB9CisgIGlmIChjYWxsYmFja3MtPnNlbmRfcnRjcCkgeworICAgIHNlc3MtPmNhbGxiYWNrcy5zZW5kX3J0Y3AgPSBjYWxsYmFja3MtPnNlbmRfcnRjcDsKKyAgICBzZXNzLT5zZW5kX3J0Y3BfdXNlcl9kYXRhID0gdXNlcl9kYXRhOworICB9CisgIGlmIChjYWxsYmFja3MtPnN5bmNfcnRjcCkgeworICAgIHNlc3MtPmNhbGxiYWNrcy5zeW5jX3J0Y3AgPSBjYWxsYmFja3MtPnN5bmNfcnRjcDsKKyAgICBzZXNzLT5zeW5jX3J0Y3BfdXNlcl9kYXRhID0gdXNlcl9kYXRhOworICB9CisgIGlmIChjYWxsYmFja3MtPmNsb2NrX3JhdGUpIHsKKyAgICBzZXNzLT5jYWxsYmFja3MuY2xvY2tfcmF0ZSA9IGNhbGxiYWNrcy0+Y2xvY2tfcmF0ZTsKKyAgICBzZXNzLT5jbG9ja19yYXRlX3VzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgfQorICBpZiAoY2FsbGJhY2tzLT5yZWNvbnNpZGVyKSB7CisgICAgc2Vzcy0+Y2FsbGJhY2tzLnJlY29uc2lkZXIgPSBjYWxsYmFja3MtPnJlY29uc2lkZXI7CisgICAgc2Vzcy0+cmVjb25zaWRlcl91c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgIH0KKyAgaWYgKGNhbGxiYWNrcy0+cmVxdWVzdF9rZXlfdW5pdCkgeworICAgIHNlc3MtPmNhbGxiYWNrcy5yZXF1ZXN0X2tleV91bml0ID0gY2FsbGJhY2tzLT5yZXF1ZXN0X2tleV91bml0OworICAgIHNlc3MtPnJlcXVlc3Rfa2V5X3VuaXRfdXNlcl9kYXRhID0gdXNlcl9kYXRhOworICB9CisgIGlmIChjYWxsYmFja3MtPnJlcXVlc3RfdGltZSkgeworICAgIHNlc3MtPmNhbGxiYWNrcy5yZXF1ZXN0X3RpbWUgPSBjYWxsYmFja3MtPnJlcXVlc3RfdGltZTsKKyAgICBzZXNzLT5yZXF1ZXN0X3RpbWVfdXNlcl9kYXRhID0gdXNlcl9kYXRhOworICB9CisgIGlmIChjYWxsYmFja3MtPm5vdGlmeV9uYWNrKSB7CisgICAgc2Vzcy0+Y2FsbGJhY2tzLm5vdGlmeV9uYWNrID0gY2FsbGJhY2tzLT5ub3RpZnlfbmFjazsKKyAgICBzZXNzLT5ub3RpZnlfbmFja191c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgIH0KKyAgaWYgKGNhbGxiYWNrcy0+cmVjb25maWd1cmUpIHsKKyAgICBzZXNzLT5jYWxsYmFja3MucmVjb25maWd1cmUgPSBjYWxsYmFja3MtPnJlY29uZmlndXJlOworICAgIHNlc3MtPnJlY29uZmlndXJlX3VzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgfQorfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX3NldF9wcm9jZXNzX3J0cF9jYWxsYmFjazoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQGNhbGxiYWNrOiBjYWxsYmFjayB0byBzZXQKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YSBwYXNzZWQgaW4gdGhlIGNhbGxiYWNrCisgKgorICogQ29uZmlndXJlIG9ubHkgdGhlIHByb2Nlc3NfcnRwIGNhbGxiYWNrIHRvIGJlIG5vdGlmaWVkIG9mIHRoZSBwcm9jZXNzX3J0cCBhY3Rpb24uCisgKi8KK3ZvaWQKK3J0cF9zZXNzaW9uX3NldF9wcm9jZXNzX3J0cF9jYWxsYmFjayAoUlRQU2Vzc2lvbiAqIHNlc3MsCisgICAgUlRQU2Vzc2lvblByb2Nlc3NSVFAgY2FsbGJhY2ssIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpKTsKKworICBzZXNzLT5jYWxsYmFja3MucHJvY2Vzc19ydHAgPSBjYWxsYmFjazsKKyAgc2Vzcy0+cHJvY2Vzc19ydHBfdXNlcl9kYXRhID0gdXNlcl9kYXRhOworfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX3NldF9zZW5kX3J0cF9jYWxsYmFjazoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQGNhbGxiYWNrOiBjYWxsYmFjayB0byBzZXQKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YSBwYXNzZWQgaW4gdGhlIGNhbGxiYWNrCisgKgorICogQ29uZmlndXJlIG9ubHkgdGhlIHNlbmRfcnRwIGNhbGxiYWNrIHRvIGJlIG5vdGlmaWVkIG9mIHRoZSBzZW5kX3J0cCBhY3Rpb24uCisgKi8KK3ZvaWQKK3J0cF9zZXNzaW9uX3NldF9zZW5kX3J0cF9jYWxsYmFjayAoUlRQU2Vzc2lvbiAqIHNlc3MsCisgICAgUlRQU2Vzc2lvblNlbmRSVFAgY2FsbGJhY2ssIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpKTsKKworICBzZXNzLT5jYWxsYmFja3Muc2VuZF9ydHAgPSBjYWxsYmFjazsKKyAgc2Vzcy0+c2VuZF9ydHBfdXNlcl9kYXRhID0gdXNlcl9kYXRhOworfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX3NldF9zZW5kX3J0Y3BfY2FsbGJhY2s6CisgKiBAc2VzczogYW4gI1JUUFNlc3Npb24KKyAqIEBjYWxsYmFjazogY2FsbGJhY2sgdG8gc2V0CisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgcGFzc2VkIGluIHRoZSBjYWxsYmFjaworICoKKyAqIENvbmZpZ3VyZSBvbmx5IHRoZSBzZW5kX3J0Y3AgY2FsbGJhY2sgdG8gYmUgbm90aWZpZWQgb2YgdGhlIHNlbmRfcnRjcCBhY3Rpb24uCisgKi8KK3ZvaWQKK3J0cF9zZXNzaW9uX3NldF9zZW5kX3J0Y3BfY2FsbGJhY2sgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgIFJUUFNlc3Npb25TZW5kUlRDUCBjYWxsYmFjaywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBnX3JldHVybl9pZl9mYWlsIChSVFBfSVNfU0VTU0lPTiAoc2VzcykpOworCisgIHNlc3MtPmNhbGxiYWNrcy5zZW5kX3J0Y3AgPSBjYWxsYmFjazsKKyAgc2Vzcy0+c2VuZF9ydGNwX3VzZXJfZGF0YSA9IHVzZXJfZGF0YTsKK30KKworLyoqCisgKiBydHBfc2Vzc2lvbl9zZXRfc3luY19ydGNwX2NhbGxiYWNrOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKiBAY2FsbGJhY2s6IGNhbGxiYWNrIHRvIHNldAorICogQHVzZXJfZGF0YTogdXNlciBkYXRhIHBhc3NlZCBpbiB0aGUgY2FsbGJhY2sKKyAqCisgKiBDb25maWd1cmUgb25seSB0aGUgc3luY19ydGNwIGNhbGxiYWNrIHRvIGJlIG5vdGlmaWVkIG9mIHRoZSBzeW5jX3J0Y3AgYWN0aW9uLgorICovCit2b2lkCitydHBfc2Vzc2lvbl9zZXRfc3luY19ydGNwX2NhbGxiYWNrIChSVFBTZXNzaW9uICogc2VzcywKKyAgICBSVFBTZXNzaW9uU3luY1JUQ1AgY2FsbGJhY2ssIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpKTsKKworICBzZXNzLT5jYWxsYmFja3Muc3luY19ydGNwID0gY2FsbGJhY2s7CisgIHNlc3MtPnN5bmNfcnRjcF91c2VyX2RhdGEgPSB1c2VyX2RhdGE7Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fc2V0X2Nsb2NrX3JhdGVfY2FsbGJhY2s6CisgKiBAc2VzczogYW4gI1JUUFNlc3Npb24KKyAqIEBjYWxsYmFjazogY2FsbGJhY2sgdG8gc2V0CisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgcGFzc2VkIGluIHRoZSBjYWxsYmFjaworICoKKyAqIENvbmZpZ3VyZSBvbmx5IHRoZSBjbG9ja19yYXRlIGNhbGxiYWNrIHRvIGJlIG5vdGlmaWVkIG9mIHRoZSBjbG9ja19yYXRlIGFjdGlvbi4KKyAqLwordm9pZAorcnRwX3Nlc3Npb25fc2V0X2Nsb2NrX3JhdGVfY2FsbGJhY2sgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgIFJUUFNlc3Npb25DbG9ja1JhdGUgY2FsbGJhY2ssIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpKTsKKworICBzZXNzLT5jYWxsYmFja3MuY2xvY2tfcmF0ZSA9IGNhbGxiYWNrOworICBzZXNzLT5jbG9ja19yYXRlX3VzZXJfZGF0YSA9IHVzZXJfZGF0YTsKK30KKworLyoqCisgKiBydHBfc2Vzc2lvbl9zZXRfcmVjb25zaWRlcl9jYWxsYmFjazoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQGNhbGxiYWNrOiBjYWxsYmFjayB0byBzZXQKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YSBwYXNzZWQgaW4gdGhlIGNhbGxiYWNrCisgKgorICogQ29uZmlndXJlIG9ubHkgdGhlIHJlY29uc2lkZXIgY2FsbGJhY2sgdG8gYmUgbm90aWZpZWQgb2YgdGhlIHJlY29uc2lkZXIgYWN0aW9uLgorICovCit2b2lkCitydHBfc2Vzc2lvbl9zZXRfcmVjb25zaWRlcl9jYWxsYmFjayAoUlRQU2Vzc2lvbiAqIHNlc3MsCisgICAgUlRQU2Vzc2lvblJlY29uc2lkZXIgY2FsbGJhY2ssIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpKTsKKworICBzZXNzLT5jYWxsYmFja3MucmVjb25zaWRlciA9IGNhbGxiYWNrOworICBzZXNzLT5yZWNvbnNpZGVyX3VzZXJfZGF0YSA9IHVzZXJfZGF0YTsKK30KKworLyoqCisgKiBydHBfc2Vzc2lvbl9zZXRfcmVxdWVzdF90aW1lX2NhbGxiYWNrOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKiBAY2FsbGJhY2s6IGNhbGxiYWNrIHRvIHNldAorICogQHVzZXJfZGF0YTogdXNlciBkYXRhIHBhc3NlZCBpbiB0aGUgY2FsbGJhY2sKKyAqCisgKiBDb25maWd1cmUgb25seSB0aGUgcmVxdWVzdF90aW1lIGNhbGxiYWNrCisgKi8KK3ZvaWQKK3J0cF9zZXNzaW9uX3NldF9yZXF1ZXN0X3RpbWVfY2FsbGJhY2sgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgIFJUUFNlc3Npb25SZXF1ZXN0VGltZSBjYWxsYmFjaywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBnX3JldHVybl9pZl9mYWlsIChSVFBfSVNfU0VTU0lPTiAoc2VzcykpOworCisgIHNlc3MtPmNhbGxiYWNrcy5yZXF1ZXN0X3RpbWUgPSBjYWxsYmFjazsKKyAgc2Vzcy0+cmVxdWVzdF90aW1lX3VzZXJfZGF0YSA9IHVzZXJfZGF0YTsKK30KKworLyoqCisgKiBydHBfc2Vzc2lvbl9zZXRfYmFuZHdpZHRoOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKiBAYmFuZHdpZHRoOiB0aGUgYmFuZHdpZHRoIGFsbG9jYXRlZAorICoKKyAqIFNldCB0aGUgc2Vzc2lvbiBiYW5kd2lkdGggaW4gYml0cyBwZXIgc2Vjb25kLgorICovCit2b2lkCitydHBfc2Vzc2lvbl9zZXRfYmFuZHdpZHRoIChSVFBTZXNzaW9uICogc2VzcywgZ2RvdWJsZSBiYW5kd2lkdGgpCit7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKFJUUF9JU19TRVNTSU9OIChzZXNzKSk7CisKKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgIHNlc3MtPnN0YXRzLmJhbmR3aWR0aCA9IGJhbmR3aWR0aDsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKK30KKworLyoqCisgKiBydHBfc2Vzc2lvbl9nZXRfYmFuZHdpZHRoOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKgorICogR2V0IHRoZSBzZXNzaW9uIGJhbmR3aWR0aC4KKyAqCisgKiBSZXR1cm5zOiB0aGUgc2Vzc2lvbiBiYW5kd2lkdGguCisgKi8KK2dkb3VibGUKK3J0cF9zZXNzaW9uX2dldF9iYW5kd2lkdGggKFJUUFNlc3Npb24gKiBzZXNzKQoreworICBnZG91YmxlIHJlc3VsdDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpLCAwKTsKKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgcmVzdWx0ID0gc2Vzcy0+c3RhdHMuYmFuZHdpZHRoOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fc2V0X3J0Y3BfZnJhY3Rpb246CisgKiBAc2VzczogYW4gI1JUUFNlc3Npb24KKyAqIEBiYW5kd2lkdGg6IHRoZSBSVENQIGJhbmR3aWR0aAorICoKKyAqIFNldCB0aGUgYmFuZHdpZHRoIGluIGJpdHMgcGVyIHNlY29uZCB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBSVENQCisgKiBtZXNzYWdlcy4KKyAqLwordm9pZAorcnRwX3Nlc3Npb25fc2V0X3J0Y3BfZnJhY3Rpb24gKFJUUFNlc3Npb24gKiBzZXNzLCBnZG91YmxlIGJhbmR3aWR0aCkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpKTsKKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgc2Vzcy0+c3RhdHMucnRjcF9iYW5kd2lkdGggPSBiYW5kd2lkdGg7CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fZ2V0X3J0Y3BfZnJhY3Rpb246CisgKiBAc2VzczogYW4gI1JUUFNlc3Npb24KKyAqCisgKiBHZXQgdGhlIHNlc3Npb24gYmFuZHdpZHRoIHVzZWQgZm9yIFJUQ1AuCisgKgorICogUmV0dXJuczogVGhlIGJhbmR3aWR0aCB1c2VkIGZvciBSVENQIG1lc3NhZ2VzLgorICovCitnZG91YmxlCitydHBfc2Vzc2lvbl9nZXRfcnRjcF9mcmFjdGlvbiAoUlRQU2Vzc2lvbiAqIHNlc3MpCit7CisgIGdkb3VibGUgcmVzdWx0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU0VTU0lPTiAoc2VzcyksIDAuMCk7CisKKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgIHJlc3VsdCA9IHNlc3MtPnN0YXRzLnJ0Y3BfYmFuZHdpZHRoOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fZ2V0X3NkZXNfc3RydWN0OgorICogQHNlc3M6IGFuICNSVFNQU2Vzc2lvbgorICoKKyAqIEdldCB0aGUgU0RFUyBkYXRhIGFzIGEgI0dzdFN0cnVjdHVyZQorICoKKyAqIFJldHVybnM6IGEgR3N0U3RydWN0dXJlIHdpdGggU0RFUyBpdGVtcyBmb3IgQHNlc3MuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhCisgKiBjb3B5IG9mIHRoZSBTREVTIHN0cnVjdHVyZSwgdXNlIGdzdF9zdHJ1Y3R1cmVfZnJlZSgpIGFmdGVyIHVzYWdlLgorICovCitHc3RTdHJ1Y3R1cmUgKgorcnRwX3Nlc3Npb25fZ2V0X3NkZXNfc3RydWN0IChSVFBTZXNzaW9uICogc2VzcykKK3sKKyAgR3N0U3RydWN0dXJlICpyZXN1bHQgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU0VTU0lPTiAoc2VzcyksIE5VTEwpOworCisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICBpZiAoc2Vzcy0+c2RlcykKKyAgICByZXN1bHQgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHNlc3MtPnNkZXMpOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fc2V0X3NkZXNfc3RydWN0OgorICogQHNlc3M6IGFuICNSVFNQU2Vzc2lvbgorICogQHNkZXM6IGEgI0dzdFN0cnVjdHVyZQorICoKKyAqIFNldCB0aGUgU0RFUyBkYXRhIGFzIGEgI0dzdFN0cnVjdHVyZS4gVGhpcyBmdW5jdGlvbiBtYWtlcyBhIGNvcHkgb2YgQHNkZXMuCisgKi8KK3ZvaWQKK3J0cF9zZXNzaW9uX3NldF9zZGVzX3N0cnVjdCAoUlRQU2Vzc2lvbiAqIHNlc3MsIGNvbnN0IEdzdFN0cnVjdHVyZSAqIHNkZXMpCit7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKHNkZXMpOworICBnX3JldHVybl9pZl9mYWlsIChSVFBfSVNfU0VTU0lPTiAoc2VzcykpOworCisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICBpZiAoc2Vzcy0+c2RlcykKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHNlc3MtPnNkZXMpOworICBzZXNzLT5zZGVzID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChzZGVzKTsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK3NvdXJjZV9wdXNoX3J0cCAoUlRQU291cmNlICogc291cmNlLCBncG9pbnRlciBkYXRhLCBSVFBTZXNzaW9uICogc2Vzc2lvbikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXN1bHQgPSBHU1RfRkxPV19PSzsKKworICBpZiAoc291cmNlLT5pbnRlcm5hbCkgeworICAgIEdTVF9MT0cgKCJzb3VyY2UgJTA4eCBwdXNoZWQgc2VuZGVyIFJUUCBwYWNrZXQiLCBzb3VyY2UtPnNzcmMpOworCisgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzaW9uKTsKKworICAgIGlmIChzZXNzaW9uLT5jYWxsYmFja3Muc2VuZF9ydHApCisgICAgICByZXN1bHQgPQorICAgICAgICAgIHNlc3Npb24tPmNhbGxiYWNrcy5zZW5kX3J0cCAoc2Vzc2lvbiwgc291cmNlLCBkYXRhLAorICAgICAgICAgIHNlc3Npb24tPnNlbmRfcnRwX3VzZXJfZGF0YSk7CisgICAgZWxzZSB7CisgICAgICBnc3RfbWluaV9vYmplY3RfdW5yZWYgKEdTVF9NSU5JX09CSkVDVF9DQVNUIChkYXRhKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9MT0cgKCJzb3VyY2UgJTA4eCBwdXNoZWQgcmVjZWl2ZXIgUlRQIHBhY2tldCIsIHNvdXJjZS0+c3NyYyk7CisgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzaW9uKTsKKworICAgIGlmIChzZXNzaW9uLT5jYWxsYmFja3MucHJvY2Vzc19ydHApCisgICAgICByZXN1bHQgPQorICAgICAgICAgIHNlc3Npb24tPmNhbGxiYWNrcy5wcm9jZXNzX3J0cCAoc2Vzc2lvbiwgc291cmNlLAorICAgICAgICAgIEdTVF9CVUZGRVJfQ0FTVCAoZGF0YSksIHNlc3Npb24tPnByb2Nlc3NfcnRwX3VzZXJfZGF0YSk7CisgICAgZWxzZQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoR1NUX0JVRkZFUl9DQVNUIChkYXRhKSk7CisgIH0KKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzc2lvbik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGdpbnQKK3NvdXJjZV9jbG9ja19yYXRlIChSVFBTb3VyY2UgKiBzb3VyY2UsIGd1aW50OCBwdCwgUlRQU2Vzc2lvbiAqIHNlc3Npb24pCit7CisgIGdpbnQgcmVzdWx0OworCisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzc2lvbik7CisKKyAgaWYgKHNlc3Npb24tPmNhbGxiYWNrcy5jbG9ja19yYXRlKQorICAgIHJlc3VsdCA9CisgICAgICAgIHNlc3Npb24tPmNhbGxiYWNrcy5jbG9ja19yYXRlIChzZXNzaW9uLCBwdCwKKyAgICAgICAgc2Vzc2lvbi0+Y2xvY2tfcmF0ZV91c2VyX2RhdGEpOworICBlbHNlCisgICAgcmVzdWx0ID0gLTE7CisKKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzc2lvbik7CisKKyAgR1NUX0RFQlVHICgiZ290IGNsb2NrLXJhdGUgJWQgZm9yIHB0ICVkIiwgcmVzdWx0LCBwdCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFJUUFNvdXJjZUNhbGxiYWNrcyBjYWxsYmFja3MgPSB7CisgIChSVFBTb3VyY2VQdXNoUlRQKSBzb3VyY2VfcHVzaF9ydHAsCisgIChSVFBTb3VyY2VDbG9ja1JhdGUpIHNvdXJjZV9jbG9ja19yYXRlLAorfTsKKworCisvKioKKyAqIHJ0cF9zZXNzaW9uX2ZpbmRfY29uZmxpY3RpbmdfYWRkcmVzczoKKyAqIEBzZXNzaW9uOiBUaGUgc2Vzc2lvbiB0aGUgcGFja2V0IGNhbWUgaW4KKyAqIEBhZGRyZXNzOiBhZGRyZXNzIHRvIGNoZWNrIGZvcgorICogQHRpbWU6IFRoZSB0aW1lIHdoZW4gdGhlIHBhY2tldCB0aGF0IGlzIHBvc3NpYmx5IGluIGNvbmZsaWN0IGFycml2ZWQKKyAqCisgKiBDaGVja3MgaWYgYW4gYWRkcmVzcyB3aGljaCBoYXMgYSBjb25mbGljdCBpcyBhbHJlYWR5IGtub3duLiBJZiBpdCBpcworICogYSBrbm93biBjb25mbGljdCwgcmVtZW1iZXIgdGhlIHRpbWUKKyAqCisgKiBSZXR1cm5zOiBUUlVFIGlmIGl0IHdhcyBhIGtub3duIGNvbmZsaWN0LCBGQUxTRSBvdGhlcndpc2UKKyAqLworc3RhdGljIGdib29sZWFuCitydHBfc2Vzc2lvbl9maW5kX2NvbmZsaWN0aW5nX2FkZHJlc3MgKFJUUFNlc3Npb24gKiBzZXNzaW9uLAorICAgIEdTb2NrZXRBZGRyZXNzICogYWRkcmVzcywgR3N0Q2xvY2tUaW1lIHRpbWUpCit7CisgIHJldHVybiBmaW5kX2NvbmZsaWN0aW5nX2FkZHJlc3MgKHNlc3Npb24tPmNvbmZsaWN0aW5nX2FkZHJlc3NlcywgYWRkcmVzcywKKyAgICAgIHRpbWUpOworfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX2FkZF9jb25mbGljdGluZ19hZGRyZXNzOgorICogQHNlc3Npb246IFRoZSBzZXNzaW9uIHRoZSBwYWNrZXQgY2FtZSBpbgorICogQGFkZHJlc3M6IGFkZHJlc3MgdG8gcmVtZW1iZXIKKyAqIEB0aW1lOiBUaGUgdGltZSB3aGVuIHRoZSBwYWNrZXQgdGhhdCBpcyBpbiBjb25mbGljdCBhcnJpdmVkCisgKgorICogQWRkcyBhIG5ldyBjb25mbGljdCBhZGRyZXNzCisgKi8KK3N0YXRpYyB2b2lkCitydHBfc2Vzc2lvbl9hZGRfY29uZmxpY3RpbmdfYWRkcmVzcyAoUlRQU2Vzc2lvbiAqIHNlc3MsCisgICAgR1NvY2tldEFkZHJlc3MgKiBhZGRyZXNzLCBHc3RDbG9ja1RpbWUgdGltZSkKK3sKKyAgc2Vzcy0+Y29uZmxpY3RpbmdfYWRkcmVzc2VzID0KKyAgICAgIGFkZF9jb25mbGljdGluZ19hZGRyZXNzIChzZXNzLT5jb25mbGljdGluZ19hZGRyZXNzZXMsIGFkZHJlc3MsIHRpbWUpOworfQorCisKK3N0YXRpYyBnYm9vbGVhbgorY2hlY2tfY29sbGlzaW9uIChSVFBTZXNzaW9uICogc2VzcywgUlRQU291cmNlICogc291cmNlLAorICAgIFJUUFBhY2tldEluZm8gKiBwaW5mbywgZ2Jvb2xlYW4gcnRwKQoreworICBndWludDMyIHNzcmM7CisKKyAgLyogSWYgd2UgaGF2ZSBubyBwaW5mbyBhZGRyZXNzLCB3ZSBjYW4ndCBkbyBjb2xsaXNpb24gY2hlY2tpbmcgKi8KKyAgaWYgKCFwaW5mby0+YWRkcmVzcykKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgc3NyYyA9IHJ0cF9zb3VyY2VfZ2V0X3NzcmMgKHNvdXJjZSk7CisKKyAgaWYgKCFzb3VyY2UtPmludGVybmFsKSB7CisgICAgR1NvY2tldEFkZHJlc3MgKmZyb207CisKKyAgICAvKiBUaGlzIGlzIG5vdCBvdXIgbG9jYWwgc291cmNlLCBidXQgbGV0cyBjaGVjayBpZiB0d28gcmVtb3RlCisgICAgICogc291cmNlIGNvbGxpZGUgKi8KKyAgICBpZiAocnRwKSB7CisgICAgICBmcm9tID0gc291cmNlLT5ydHBfZnJvbTsKKyAgICB9IGVsc2UgeworICAgICAgZnJvbSA9IHNvdXJjZS0+cnRjcF9mcm9tOworICAgIH0KKworICAgIGlmIChmcm9tKSB7CisgICAgICBpZiAoX19nX3NvY2tldF9hZGRyZXNzX2VxdWFsIChmcm9tLCBwaW5mby0+YWRkcmVzcykpIHsKKyAgICAgICAgLyogQWRkcmVzcyBpcyB0aGUgc2FtZSAqLworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfTE9HICgid2UgaGF2ZSBhIHRoaXJkLXBhcnR5IGNvbGxpc2lvbiBvciBsb29wIHNzcmM6JXgiLCBzc3JjKTsKKyAgICAgICAgaWYgKHNlc3MtPmZhdm9yX25ldykgeworICAgICAgICAgIGlmIChydHBfc291cmNlX2ZpbmRfY29uZmxpY3RpbmdfYWRkcmVzcyAoc291cmNlLAorICAgICAgICAgICAgICAgICAgcGluZm8tPmFkZHJlc3MsIHBpbmZvLT5jdXJyZW50X3RpbWUpKSB7CisgICAgICAgICAgICBnY2hhciAqYnVmMTsKKworICAgICAgICAgICAgYnVmMSA9IF9fZ19zb2NrZXRfYWRkcmVzc190b19zdHJpbmcgKHBpbmZvLT5hZGRyZXNzKTsKKyAgICAgICAgICAgIEdTVF9MT0cgKCJLbm93biBjb25mbGljdCBvbiAleCBmb3IgJXMsIGRyb3BwaW5nIHBhY2tldCIsIHNzcmMsCisgICAgICAgICAgICAgICAgYnVmMSk7CisgICAgICAgICAgICBnX2ZyZWUgKGJ1ZjEpOworCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2NoYXIgKmJ1ZjEsICpidWYyOworCisgICAgICAgICAgICAvKiBDdXJyZW50IGFkZHJlc3MgaXMgbm90IGEga25vd24gY29uZmxpY3QsIGxldHMgYXNzdW1lIHRoaXMgaXMKKyAgICAgICAgICAgICAqIGEgbmV3IHNvdXJjZS4gU2F2ZSBvbGQgYWRkcmVzcyBpbiBwb3NzaWJsZSBjb25mbGljdCBsaXN0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJ0cF9zb3VyY2VfYWRkX2NvbmZsaWN0aW5nX2FkZHJlc3MgKHNvdXJjZSwgZnJvbSwKKyAgICAgICAgICAgICAgICBwaW5mby0+Y3VycmVudF90aW1lKTsKKworICAgICAgICAgICAgYnVmMSA9IF9fZ19zb2NrZXRfYWRkcmVzc190b19zdHJpbmcgKGZyb20pOworICAgICAgICAgICAgYnVmMiA9IF9fZ19zb2NrZXRfYWRkcmVzc190b19zdHJpbmcgKHBpbmZvLT5hZGRyZXNzKTsKKworICAgICAgICAgICAgR1NUX0RFQlVHICgiTmV3IGNvbmZsaWN0IGZvciBzc3JjICV4LCByZXBsYWNpbmcgJXMgd2l0aCAlcywiCisgICAgICAgICAgICAgICAgIiBzYXZpbmcgb2xkIGFzIGtub3duIGNvbmZsaWN0Iiwgc3NyYywgYnVmMSwgYnVmMik7CisKKyAgICAgICAgICAgIGlmIChydHApCisgICAgICAgICAgICAgIHJ0cF9zb3VyY2Vfc2V0X3J0cF9mcm9tIChzb3VyY2UsIHBpbmZvLT5hZGRyZXNzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcnRwX3NvdXJjZV9zZXRfcnRjcF9mcm9tIChzb3VyY2UsIHBpbmZvLT5hZGRyZXNzKTsKKworICAgICAgICAgICAgZ19mcmVlIChidWYxKTsKKyAgICAgICAgICAgIGdfZnJlZSAoYnVmMik7CisKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogRG9uJ3QgbmVlZCB0byBzYXZlIG9sZCBhZGRyZXNzZXMsIHdlIGlnbm9yZSBuZXcgc291cmNlcyAqLworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFdlIGRvbid0IGFscmVhZHkgaGF2ZSBhIGZyb20gYWRkcmVzcyBmb3IgUlRQLCBqdXN0IHNldCBpdCAqLworICAgICAgaWYgKHJ0cCkKKyAgICAgICAgcnRwX3NvdXJjZV9zZXRfcnRwX2Zyb20gKHNvdXJjZSwgcGluZm8tPmFkZHJlc3MpOworICAgICAgZWxzZQorICAgICAgICBydHBfc291cmNlX3NldF9ydGNwX2Zyb20gKHNvdXJjZSwgcGluZm8tPmFkZHJlc3MpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIEZJWE1FOiBMb2cgM3JkIHBhcnR5IGNvbGxpc2lvbiBzb21laG93CisgICAgICogTWF5YmUgc2hvdWxkIGJlIGRvbmUgaW4gdXBwZXIgbGF5ZXIsIG9ubHkgdGhlIFNERVMgY2FuIHRlbGwgdXMKKyAgICAgKiBpZiBpdHMgYSBjb2xsaXNpb24gb3IgYSBsb29wCisgICAgICovCisgIH0gZWxzZSB7CisgICAgLyogVGhpcyBpcyBzZW5kaW5nIHdpdGggb3VyIHNzcmMsIGlzIGl0IGFuIGFkZHJlc3Mgd2UgYWxyZWFkeSBrbm93ICovCisgICAgaWYgKHJ0cF9zZXNzaW9uX2ZpbmRfY29uZmxpY3RpbmdfYWRkcmVzcyAoc2VzcywgcGluZm8tPmFkZHJlc3MsCisgICAgICAgICAgICBwaW5mby0+Y3VycmVudF90aW1lKSkgeworICAgICAgLyogSXRzIGEga25vd24gY29uZmxpY3QsIGl0cyBwcm9iYWJseSBhIGxvb3AsIG5vdCBhIGNvbGxpc2lvbgorICAgICAgICogbGV0cyBqdXN0IGRyb3AgdGhlIGluY29taW5nIHBhY2tldAorICAgICAgICovCisgICAgICBHU1RfREVCVUcgKCJPdXIgcGFja2V0cyBhcmUgYmVpbmcgbG9vcGVkIGJhY2sgdG8gdXMsIGRyb3BwaW5nIik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEl0cyBhIG5ldyBjb2xsaXNpb24sIGxldHMgY2hhbmdlIG91ciBTU1JDICovCisgICAgICBydHBfc2Vzc2lvbl9hZGRfY29uZmxpY3RpbmdfYWRkcmVzcyAoc2VzcywgcGluZm8tPmFkZHJlc3MsCisgICAgICAgICAgcGluZm8tPmN1cnJlbnRfdGltZSk7CisKKyAgICAgIEdTVF9ERUJVRyAoIkNvbGxpc2lvbiBmb3IgU1NSQyAleCIsIHNzcmMpOworICAgICAgLyogbWFyayB0aGUgc291cmNlIEJZRSAqLworICAgICAgcnRwX3NvdXJjZV9tYXJrX2J5ZSAoc291cmNlLCAiU1NSQyBDb2xsaXNpb24iKTsKKyAgICAgIC8qIGlmIHdlIHdlcmUgc3VnZ2VzdGluZyB0aGlzIFNTUkMsIGNoYW5nZSB0byBzb21ldGhpbmcgZWxzZSAqLworICAgICAgaWYgKHNlc3MtPnN1Z2dlc3RlZF9zc3JjID09IHNzcmMpIHsKKyAgICAgICAgc2Vzcy0+c3VnZ2VzdGVkX3NzcmMgPSBydHBfc2Vzc2lvbl9jcmVhdGVfbmV3X3NzcmMgKHNlc3MpOworICAgICAgICBzZXNzLT5pbnRlcm5hbF9zc3JjX3NldCA9IFRSVUU7CisgICAgICB9CisKKyAgICAgIG9uX3NzcmNfY29sbGlzaW9uIChzZXNzLCBzb3VyY2UpOworCisgICAgICBydHBfc2Vzc2lvbl9zY2hlZHVsZV9ieWVfbG9ja2VkIChzZXNzLCBwaW5mby0+Y3VycmVudF90aW1lKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ2Jvb2xlYW4gaXNfZG9pbmdfcHRwOworICBHU29ja2V0QWRkcmVzcyAqbmV3X2FkZHI7Cit9IENvbXBhcmVBZGRyRGF0YTsKKworLyogY2hlY2sgaWYgdGhlIHR3byBnaXZlbiBpcCBhZGRyIGFyZSB0aGUgc2FtZSAoZG8gbm90IGNhcmUgYWJvdXQgdGhlIHBvcnQpICovCitzdGF0aWMgZ2Jvb2xlYW4KK2lwX2FkZHJfZXF1YWwgKEdTb2NrZXRBZGRyZXNzICogYSwgR1NvY2tldEFkZHJlc3MgKiBiKQoreworICByZXR1cm4KKyAgICAgIGdfaW5ldF9hZGRyZXNzX2VxdWFsIChnX2luZXRfc29ja2V0X2FkZHJlc3NfZ2V0X2FkZHJlc3MKKyAgICAgIChHX0lORVRfU09DS0VUX0FERFJFU1MgKGEpKSwKKyAgICAgIGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcyAoR19JTkVUX1NPQ0tFVF9BRERSRVNTIChiKSkpOworfQorCitzdGF0aWMgdm9pZAorY29tcGFyZV9ydHBfc291cmNlX2FkZHIgKGNvbnN0IGdjaGFyICoga2V5LCBSVFBTb3VyY2UgKiBzb3VyY2UsCisgICAgQ29tcGFyZUFkZHJEYXRhICogZGF0YSkKK3sKKyAgLyogb25seSBjb21wYXJlIGlwIGFkZHIgb2YgcmVtb3RlIHNvdXJjZXMgd2hpY2ggYXJlIGFsc28gbm90IGNsb3NpbmcgKi8KKyAgaWYgKCFzb3VyY2UtPmludGVybmFsICYmICFzb3VyY2UtPmNsb3NpbmcgJiYgc291cmNlLT5ydHBfZnJvbSkgeworICAgIC8qIGxvb2sgZm9yIHRoZSBmaXJzdCBydHAgc291cmNlICovCisgICAgaWYgKCFkYXRhLT5uZXdfYWRkcikKKyAgICAgIGRhdGEtPm5ld19hZGRyID0gc291cmNlLT5ydHBfZnJvbTsKKyAgICAvKiBjb21wYXJlIGN1cnJlbnQgaXAgYWRkciB3aXRoIHRoZSBmaXJzdCBvbmUgKi8KKyAgICBlbHNlCisgICAgICBkYXRhLT5pc19kb2luZ19wdHAgJj0gaXBfYWRkcl9lcXVhbCAoZGF0YS0+bmV3X2FkZHIsIHNvdXJjZS0+cnRwX2Zyb20pOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjb21wYXJlX3J0Y3Bfc291cmNlX2FkZHIgKGNvbnN0IGdjaGFyICoga2V5LCBSVFBTb3VyY2UgKiBzb3VyY2UsCisgICAgQ29tcGFyZUFkZHJEYXRhICogZGF0YSkKK3sKKyAgLyogb25seSBjb21wYXJlIGlwIGFkZHIgb2YgcmVtb3RlIHNvdXJjZXMgd2hpY2ggYXJlIGFsc28gbm90IGNsb3NpbmcgKi8KKyAgaWYgKCFzb3VyY2UtPmludGVybmFsICYmICFzb3VyY2UtPmNsb3NpbmcgJiYgc291cmNlLT5ydGNwX2Zyb20pIHsKKyAgICAvKiBsb29rIGZvciB0aGUgZmlyc3QgcnRjcCBzb3VyY2UgKi8KKyAgICBpZiAoIWRhdGEtPm5ld19hZGRyKQorICAgICAgZGF0YS0+bmV3X2FkZHIgPSBzb3VyY2UtPnJ0Y3BfZnJvbTsKKyAgICBlbHNlCisgICAgICAvKiBjb21wYXJlIGN1cnJlbnQgaXAgYWRkciB3aXRoIHRoZSBmaXJzdCBvbmUgKi8KKyAgICAgIGRhdGEtPmlzX2RvaW5nX3B0cCAmPSBpcF9hZGRyX2VxdWFsIChkYXRhLT5uZXdfYWRkciwgc291cmNlLT5ydGNwX2Zyb20pOworICB9Cit9CisKKy8qIGxvb3Agb3ZlciBvdXIgbm9uLWludGVybmFsIHNvdXJjZSB0byBrbm93IGlmIHRoZSBzZXNzaW9uCisgKiBpcyBkb2luZyBwb2ludC10by1wb2ludCAqLworc3RhdGljIHZvaWQKK3Nlc3Npb25fdXBkYXRlX3B0cCAoUlRQU2Vzc2lvbiAqIHNlc3MpCit7CisgIC8qIHRvIGtub3cgaWYgdGhlIHNlc3Npb24gaXMgZG9pbmcgcG9pbnQgdG8gcG9pbnQsIHRoZSBpcCBhZGRyCisgICAqIG9mIGVhY2ggbm9uLWludGVybmFsICg9cmVtb3Rlcykgc291cmNlIGhhdmUgdG8gYmUgY29tcGFyZWQKKyAgICogdG8gZWFjaCBvdGhlci4KKyAgICovCisgIGdib29sZWFuIGlzX2RvaW5nX3J0cF9wdHA7CisgIGdib29sZWFuIGlzX2RvaW5nX3J0Y3BfcHRwOworICBDb21wYXJlQWRkckRhdGEgZGF0YTsKKworICAvKiBjb21wYXJlIHRoZSBmaXJzdCByZW1vdGUgc291cmNlJ3MgaXAgYWRkciB0aGF0IHJlY2VpdmUgcnRwIHBhY2tldHMKKyAgICogd2l0aCBvdGhlciByZW1vdGUgcnRwIHNvdXJjZS4KKyAgICogaXQncyBlbm91Z2ggYmVjYXVzZSB0aGUgc2Vzc2lvbiBqdXN0IG5lZWRzIHRvIGtub3cgaWYgdGhleSBhcmUgYWxsCisgICAqIGVxdWFscyBvciBub3QKKyAgICovCisgIGRhdGEuaXNfZG9pbmdfcHRwID0gVFJVRTsKKyAgZGF0YS5uZXdfYWRkciA9IE5VTEw7CisgIGdfaGFzaF90YWJsZV9mb3JlYWNoIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0sCisgICAgICAoR0hGdW5jKSBjb21wYXJlX3J0cF9zb3VyY2VfYWRkciwgKGdwb2ludGVyKSAmIGRhdGEpOworICBpc19kb2luZ19ydHBfcHRwID0gZGF0YS5pc19kb2luZ19wdHA7CisKKyAgLyogc2FtZSBidXQgYWJvdXQgcnRjcCAqLworICBkYXRhLmlzX2RvaW5nX3B0cCA9IFRSVUU7CisgIGRhdGEubmV3X2FkZHIgPSBOVUxMOworICBnX2hhc2hfdGFibGVfZm9yZWFjaCAoc2Vzcy0+c3NyY3Nbc2Vzcy0+bWFza19pZHhdLAorICAgICAgKEdIRnVuYykgY29tcGFyZV9ydGNwX3NvdXJjZV9hZGRyLCAoZ3BvaW50ZXIpICYgZGF0YSk7CisgIGlzX2RvaW5nX3J0Y3BfcHRwID0gZGF0YS5pc19kb2luZ19wdHA7CisKKyAgLyogdGhlIHNlc3Npb24gaXMgZG9pbmcgcG9pbnQtdG8tcG9pbnQgaWYgYWxsIHJ0cCByZW1vdGUgaGF2ZSB0aGUgc2FtZQorICAgKiBpcCBhZGRyIGFuZCBpZiBhbGwgcnRjcCByZW1vdGUgc291cmNlcyBoYXZlIHRoZSBzYW1lIGlwIGFkZHIgKi8KKyAgc2Vzcy0+aXNfZG9pbmdfcHRwID0gaXNfZG9pbmdfcnRwX3B0cCAmJiBpc19kb2luZ19ydGNwX3B0cDsKKworICBHU1RfREVCVUcgKCJkb2luZyBwb2ludC10by1wb2ludDogJWQiLCBzZXNzLT5pc19kb2luZ19wdHApOworfQorCitzdGF0aWMgdm9pZAorYWRkX3NvdXJjZSAoUlRQU2Vzc2lvbiAqIHNlc3MsIFJUUFNvdXJjZSAqIHNyYykKK3sKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoc2Vzcy0+c3NyY3Nbc2Vzcy0+bWFza19pZHhdLAorICAgICAgR0lOVF9UT19QT0lOVEVSIChzcmMtPnNzcmMpLCBzcmMpOworICAvKiByZXBvcnQgdGhlIG5ldyBzb3VyY2UgQVNBUCAqLworICBzcmMtPmdlbmVyYXRpb24gPSBzZXNzLT5nZW5lcmF0aW9uOworICAvKiB3ZSBoYXZlIG9uZSBtb3JlIHNvdXJjZSBub3cgKi8KKyAgc2Vzcy0+dG90YWxfc291cmNlcysrOworICBpZiAoUlRQX1NPVVJDRV9JU19BQ1RJVkUgKHNyYykpCisgICAgc2Vzcy0+c3RhdHMuYWN0aXZlX3NvdXJjZXMrKzsKKyAgaWYgKHNyYy0+aW50ZXJuYWwpIHsKKyAgICBzZXNzLT5zdGF0cy5pbnRlcm5hbF9zb3VyY2VzKys7CisgICAgaWYgKCFzZXNzLT5pbnRlcm5hbF9zc3JjX2Zyb21fY2Fwc19vcl9wcm9wZXJ0eQorICAgICAgICAmJiBzZXNzLT5zdWdnZXN0ZWRfc3NyYyAhPSBzcmMtPnNzcmMpIHsKKyAgICAgIHNlc3MtPnN1Z2dlc3RlZF9zc3JjID0gc3JjLT5zc3JjOworICAgICAgc2Vzcy0+aW50ZXJuYWxfc3NyY19zZXQgPSBUUlVFOworICAgIH0KKyAgfQorCisgIC8qIHVwZGF0ZSBwb2ludC10by1wb2ludCBzdGF0dXMgKi8KKyAgaWYgKCFzcmMtPmludGVybmFsKQorICAgIHNlc3Npb25fdXBkYXRlX3B0cCAoc2Vzcyk7Cit9CisKK3N0YXRpYyBSVFBTb3VyY2UgKgorZmluZF9zb3VyY2UgKFJUUFNlc3Npb24gKiBzZXNzLCBndWludDMyIHNzcmMpCit7CisgIHJldHVybiBnX2hhc2hfdGFibGVfbG9va3VwIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0sCisgICAgICBHSU5UX1RPX1BPSU5URVIgKHNzcmMpKTsKK30KKworLyogbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgc2Vzc2lvbiBsb2NrLCB0aGUgcmV0dXJuZWQgc291cmNlIG5lZWRzIHRvIGJlCisgKiB1bnJlZmZlZCBhZnRlciB1c2FnZS4gKi8KK3N0YXRpYyBSVFBTb3VyY2UgKgorb2J0YWluX3NvdXJjZSAoUlRQU2Vzc2lvbiAqIHNlc3MsIGd1aW50MzIgc3NyYywgZ2Jvb2xlYW4gKiBjcmVhdGVkLAorICAgIFJUUFBhY2tldEluZm8gKiBwaW5mbywgZ2Jvb2xlYW4gcnRwKQoreworICBSVFBTb3VyY2UgKnNvdXJjZTsKKworICBzb3VyY2UgPSBmaW5kX3NvdXJjZSAoc2Vzcywgc3NyYyk7CisgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgIC8qIG1ha2UgbmV3IFNvdXJjZSBpbiBwcm9iYXRpb24gYW5kIGluc2VydCAqLworICAgIHNvdXJjZSA9IHJ0cF9zb3VyY2VfbmV3IChzc3JjKTsKKworICAgIEdTVF9ERUJVRyAoImNyZWF0aW5nIG5ldyBzb3VyY2UgJTA4eCAlcCIsIHNzcmMsIHNvdXJjZSk7CisKKyAgICAvKiBmb3IgUlRQIHBhY2tldHMgd2UgbmVlZCB0byBzZXQgdGhlIHNvdXJjZSBpbiBwcm9iYXRpb24uIFJlY2VpdmluZyBSVENQCisgICAgICogcGFja2V0cyBvZiBhbiBTU1JDLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMgYSBzdHJvbmcgaW5kaWNhdGlvbiB0aGF0IHdlCisgICAgICogYXJlIGRlYWxpbmcgd2l0aCBhIHZhbGlkIHNvdXJjZS4gKi8KKyAgICBnX29iamVjdF9zZXQgKHNvdXJjZSwgInByb2JhdGlvbiIsIHJ0cCA/IHNlc3MtPnByb2JhdGlvbiA6IDAsCisgICAgICAgICJtYXgtZHJvcG91dC10aW1lIiwgc2Vzcy0+bWF4X2Ryb3BvdXRfdGltZSwgIm1heC1taXNvcmRlci10aW1lIiwKKyAgICAgICAgc2Vzcy0+bWF4X21pc29yZGVyX3RpbWUsIE5VTEwpOworCisgICAgLyogc3RvcmUgZnJvbSBhZGRyZXNzLCBpZiBhbnkgKi8KKyAgICBpZiAocGluZm8tPmFkZHJlc3MpIHsKKyAgICAgIGlmIChydHApCisgICAgICAgIHJ0cF9zb3VyY2Vfc2V0X3J0cF9mcm9tIChzb3VyY2UsIHBpbmZvLT5hZGRyZXNzKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcnRwX3NvdXJjZV9zZXRfcnRjcF9mcm9tIChzb3VyY2UsIHBpbmZvLT5hZGRyZXNzKTsKKyAgICB9CisKKyAgICAvKiBjb25maWd1cmUgYSBjYWxsYmFjayBvbiB0aGUgc291cmNlICovCisgICAgcnRwX3NvdXJjZV9zZXRfY2FsbGJhY2tzIChzb3VyY2UsICZjYWxsYmFja3MsIHNlc3MpOworCisgICAgYWRkX3NvdXJjZSAoc2Vzcywgc291cmNlKTsKKyAgICAqY3JlYXRlZCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgKmNyZWF0ZWQgPSBGQUxTRTsKKyAgICAvKiBjaGVjayBmb3IgY29sbGlzaW9uLCB0aGlzIHVwZGF0ZXMgdGhlIGFkZHJlc3Mgd2hlbiBub3QgcHJldmlvdXNseSBzZXQgKi8KKyAgICBpZiAoY2hlY2tfY29sbGlzaW9uIChzZXNzLCBzb3VyY2UsIHBpbmZvLCBydHApKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogUmVjZWl2aW5nIFJUQ1AgcGFja2V0cyBvZiBhbiBTU1JDIGlzIGEgc3Ryb25nIGluZGljYXRpb24gdGhhdCB3ZQorICAgICAqIGFyZSBkZWFsaW5nIHdpdGggYSB2YWxpZCBzb3VyY2UuICovCisgICAgaWYgKCFydHApCisgICAgICBnX29iamVjdF9zZXQgKHNvdXJjZSwgInByb2JhdGlvbiIsIDAsIE5VTEwpOworICB9CisgIC8qIHVwZGF0ZSBsYXN0IGFjdGl2aXR5ICovCisgIHNvdXJjZS0+bGFzdF9hY3Rpdml0eSA9IHBpbmZvLT5jdXJyZW50X3RpbWU7CisgIGlmIChydHApCisgICAgc291cmNlLT5sYXN0X3J0cF9hY3Rpdml0eSA9IHBpbmZvLT5jdXJyZW50X3RpbWU7CisgIGdfb2JqZWN0X3JlZiAoc291cmNlKTsKKworICByZXR1cm4gc291cmNlOworfQorCisvKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBzZXNzaW9uIGxvY2ssIHRoZSByZXR1cm5lZCBzb3VyY2UgbmVlZHMgdG8gYmUKKyAqIHVucmVmZmVkIGFmdGVyIHVzYWdlLiAqLworc3RhdGljIFJUUFNvdXJjZSAqCitvYnRhaW5faW50ZXJuYWxfc291cmNlIChSVFBTZXNzaW9uICogc2VzcywgZ3VpbnQzMiBzc3JjLCBnYm9vbGVhbiAqIGNyZWF0ZWQsCisgICAgR3N0Q2xvY2tUaW1lIGN1cnJlbnRfdGltZSkKK3sKKyAgUlRQU291cmNlICpzb3VyY2U7CisKKyAgc291cmNlID0gZmluZF9zb3VyY2UgKHNlc3MsIHNzcmMpOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICAvKiBtYWtlIG5ldyBpbnRlcm5hbCBTb3VyY2UgYW5kIGluc2VydCAqLworICAgIHNvdXJjZSA9IHJ0cF9zb3VyY2VfbmV3IChzc3JjKTsKKworICAgIEdTVF9ERUJVRyAoImNyZWF0aW5nIG5ldyBpbnRlcm5hbCBzb3VyY2UgJTA4eCAlcCIsIHNzcmMsIHNvdXJjZSk7CisKKyAgICBzb3VyY2UtPnZhbGlkYXRlZCA9IFRSVUU7CisgICAgc291cmNlLT5pbnRlcm5hbCA9IFRSVUU7CisgICAgc291cmNlLT5wcm9iYXRpb24gPSBGQUxTRTsKKyAgICBydHBfc291cmNlX3NldF9zZGVzX3N0cnVjdCAoc291cmNlLCBnc3Rfc3RydWN0dXJlX2NvcHkgKHNlc3MtPnNkZXMpKTsKKyAgICBydHBfc291cmNlX3NldF9jYWxsYmFja3MgKHNvdXJjZSwgJmNhbGxiYWNrcywgc2Vzcyk7CisKKyAgICBhZGRfc291cmNlIChzZXNzLCBzb3VyY2UpOworICAgICpjcmVhdGVkID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICAqY3JlYXRlZCA9IEZBTFNFOworICB9CisgIC8qIHVwZGF0ZSBsYXN0IGFjdGl2aXR5ICovCisgIGlmIChjdXJyZW50X3RpbWUgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgIHNvdXJjZS0+bGFzdF9hY3Rpdml0eSA9IGN1cnJlbnRfdGltZTsKKyAgICBzb3VyY2UtPmxhc3RfcnRwX2FjdGl2aXR5ID0gY3VycmVudF90aW1lOworICB9CisgIGdfb2JqZWN0X3JlZiAoc291cmNlKTsKKworICByZXR1cm4gc291cmNlOworfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX3N1Z2dlc3Rfc3NyYzoKKyAqIEBzZXNzOiBhICNSVFBTZXNzaW9uCisgKiBAaXNfcmFuZG9tOiBpZiB0aGUgc3VnZ2VzdGVkIHNzcmMgaXMgcmFuZG9tCisgKgorICogU3VnZ2VzdCBhbiB1bnVzZWQgU1NSQyBpbiBAc2Vzcy4KKyAqCisgKiBSZXR1cm5zOiBhIGZyZWUgdW51c2VkIFNTUkMKKyAqLworZ3VpbnQzMgorcnRwX3Nlc3Npb25fc3VnZ2VzdF9zc3JjIChSVFBTZXNzaW9uICogc2VzcywgZ2Jvb2xlYW4gKiBpc19yYW5kb20pCit7CisgIGd1aW50MzIgcmVzdWx0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU0VTU0lPTiAoc2VzcyksIDApOworCisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICByZXN1bHQgPSBzZXNzLT5zdWdnZXN0ZWRfc3NyYzsKKyAgaWYgKGlzX3JhbmRvbSkKKyAgICAqaXNfcmFuZG9tID0gIXNlc3MtPmludGVybmFsX3NzcmNfc2V0OworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fYWRkX3NvdXJjZToKKyAqIEBzZXNzOiBhICNSVFBTZXNzaW9uCisgKiBAc3JjOiAjUlRQU291cmNlIHRvIGFkZAorICoKKyAqIEFkZCBAc3JjIHRvIEBzZXNzaW9uLgorICoKKyAqIFJldHVybnM6ICVUUlVFIG9uIHN1Y2Nlc3MsICVGQUxTRSBpZiBhIHNvdXJjZSB3aXRoIHRoZSBzYW1lIFNTUkMgYWxyZWFkeQorICogZXhpc3RlZCBpbiB0aGUgc2Vzc2lvbi4KKyAqLworZ2Jvb2xlYW4KK3J0cF9zZXNzaW9uX2FkZF9zb3VyY2UgKFJUUFNlc3Npb24gKiBzZXNzLCBSVFBTb3VyY2UgKiBzcmMpCit7CisgIGdib29sZWFuIHJlc3VsdCA9IEZBTFNFOworICBSVFBTb3VyY2UgKmZpbmQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFJUUF9JU19TRVNTSU9OIChzZXNzKSwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc3JjICE9IE5VTEwsIEZBTFNFKTsKKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgZmluZCA9IGZpbmRfc291cmNlIChzZXNzLCBzcmMtPnNzcmMpOworICBpZiAoZmluZCA9PSBOVUxMKSB7CisgICAgYWRkX3NvdXJjZSAoc2Vzcywgc3JjKTsKKyAgICByZXN1bHQgPSBUUlVFOworICB9CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBydHBfc2Vzc2lvbl9nZXRfbnVtX3NvdXJjZXM6CisgKiBAc2VzczogYW4gI1JUUFNlc3Npb24KKyAqCisgKiBHZXQgdGhlIG51bWJlciBvZiBzb3VyY2VzIGluIEBzZXNzLgorICoKKyAqIFJldHVybnM6IFRoZSBudW1iZXIgb2Ygc291cmNlcyBpbiBAc2Vzcy4KKyAqLworZ3VpbnQKK3J0cF9zZXNzaW9uX2dldF9udW1fc291cmNlcyAoUlRQU2Vzc2lvbiAqIHNlc3MpCit7CisgIGd1aW50IHJlc3VsdDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpLCBGQUxTRSk7CisKKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgIHJlc3VsdCA9IHNlc3MtPnRvdGFsX3NvdXJjZXM7CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBydHBfc2Vzc2lvbl9nZXRfbnVtX2FjdGl2ZV9zb3VyY2VzOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKgorICogR2V0IHRoZSBudW1iZXIgb2YgYWN0aXZlIHNvdXJjZXMgaW4gQHNlc3MuIEEgc291cmNlIGlzIGNvbnNpZGVyZWQgYWN0aXZlIHdoZW4KKyAqIGl0IGhhcyBiZWVuIHZhbGlkYXRlZCBhbmQgaGFzIG5vdCB5ZXQgcmVjZWl2ZWQgYSBCWUUgUlRDUCBtZXNzYWdlLgorICoKKyAqIFJldHVybnM6IFRoZSBudW1iZXIgb2YgYWN0aXZlIHNvdXJjZXMgaW4gQHNlc3MuCisgKi8KK2d1aW50CitydHBfc2Vzc2lvbl9nZXRfbnVtX2FjdGl2ZV9zb3VyY2VzIChSVFBTZXNzaW9uICogc2VzcykKK3sKKyAgZ3VpbnQgcmVzdWx0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU0VTU0lPTiAoc2VzcyksIDApOworCisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICByZXN1bHQgPSBzZXNzLT5zdGF0cy5hY3RpdmVfc291cmNlczsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX2dldF9zb3VyY2VfYnlfc3NyYzoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQHNzcmM6IGFuIFNTUkMKKyAqCisgKiBGaW5kIHRoZSBzb3VyY2Ugd2l0aCBAc3NyYyBpbiBAc2Vzcy4KKyAqCisgKiBSZXR1cm5zOiBhICNSVFBTb3VyY2Ugd2l0aCBTU1JDIEBzc3JjIG9yIE5VTEwgaWYgdGhlIHNvdXJjZSB3YXMgbm90IGZvdW5kLgorICogZ19vYmplY3RfdW5yZWYoKSBhZnRlciB1c2FnZS4KKyAqLworUlRQU291cmNlICoKK3J0cF9zZXNzaW9uX2dldF9zb3VyY2VfYnlfc3NyYyAoUlRQU2Vzc2lvbiAqIHNlc3MsIGd1aW50MzIgc3NyYykKK3sKKyAgUlRQU291cmNlICpyZXN1bHQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFJUUF9JU19TRVNTSU9OIChzZXNzKSwgTlVMTCk7CisKKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgIHJlc3VsdCA9IGZpbmRfc291cmNlIChzZXNzLCBzc3JjKTsKKyAgaWYgKHJlc3VsdCAhPSBOVUxMKQorICAgIGdfb2JqZWN0X3JlZiAocmVzdWx0KTsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIFNFU1NJT04gbG9jayAqLworc3RhdGljIGd1aW50MzIKK3J0cF9zZXNzaW9uX2NyZWF0ZV9uZXdfc3NyYyAoUlRQU2Vzc2lvbiAqIHNlc3MpCit7CisgIGd1aW50MzIgc3NyYzsKKworICB3aGlsZSAoVFJVRSkgeworICAgIHNzcmMgPSBnX3JhbmRvbV9pbnQgKCk7CisKKyAgICAvKiBzZWUgaWYgaXQgZXhpc3RzIGluIHRoZSBzZXNzaW9uLCB3ZSdyZSBkb25lIGlmIGl0IGRvZXNuJ3QgKi8KKyAgICBpZiAoZmluZF9zb3VyY2UgKHNlc3MsIHNzcmMpID09IE5VTEwpCisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gc3NyYzsKK30KKworCisvKioKKyAqIHJ0cF9zZXNzaW9uX2NyZWF0ZV9zb3VyY2U6CisgKiBAc2VzczogYW4gI1JUUFNlc3Npb24KKyAqCisgKiBDcmVhdGUgYW4gI1JUUFNvdXJjZSBmb3IgdXNlIGluIEBzZXNzLiBUaGlzIGZ1bmN0aW9uIHdpbGwgY3JlYXRlIGEgc291cmNlCisgKiB3aXRoIGFuIHNzcmMgdGhhdCBpcyBjdXJyZW50bHkgbm90IHVzZWQgYnkgYW55IHBhcnRpY2lwYW50cyBpbiB0aGUgc2Vzc2lvbi4KKyAqCisgKiBSZXR1cm5zOiBhbiAjUlRQU291cmNlLgorICovCitSVFBTb3VyY2UgKgorcnRwX3Nlc3Npb25fY3JlYXRlX3NvdXJjZSAoUlRQU2Vzc2lvbiAqIHNlc3MpCit7CisgIGd1aW50MzIgc3NyYzsKKyAgUlRQU291cmNlICpzb3VyY2U7CisKKyAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgIHNzcmMgPSBydHBfc2Vzc2lvbl9jcmVhdGVfbmV3X3NzcmMgKHNlc3MpOworICBzb3VyY2UgPSBydHBfc291cmNlX25ldyAoc3NyYyk7CisgIHJ0cF9zb3VyY2Vfc2V0X2NhbGxiYWNrcyAoc291cmNlLCAmY2FsbGJhY2tzLCBzZXNzKTsKKyAgLyogd2UgbmVlZCBhbiBhZGRpdGlvbmFsIHJlZiBmb3IgdGhlIHNvdXJjZSBpbiB0aGUgaGFzaHRhYmxlICovCisgIGdfb2JqZWN0X3JlZiAoc291cmNlKTsKKyAgYWRkX3NvdXJjZSAoc2Vzcywgc291cmNlKTsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKworICByZXR1cm4gc291cmNlOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3VwZGF0ZV9wYWNrZXQgKEdzdEJ1ZmZlciAqKiBidWZmZXIsIGd1aW50IGlkeCwgUlRQUGFja2V0SW5mbyAqIHBpbmZvKQoreworICBHc3ROZXRBZGRyZXNzTWV0YSAqbWV0YTsKKworICAvKiBnZXQgcGFja2V0IHNpemUgaW5jbHVkaW5nIGhlYWRlciBvdmVyaGVhZCAqLworICBwaW5mby0+Ynl0ZXMgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoKmJ1ZmZlcikgKyBwaW5mby0+aGVhZGVyX2xlbjsKKyAgcGluZm8tPnBhY2tldHMrKzsKKworICBpZiAocGluZm8tPnJ0cCkgeworICAgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwgfTsKKworICAgIGlmICghZ3N0X3J0cF9idWZmZXJfbWFwICgqYnVmZmVyLCBHU1RfTUFQX1JFQUQsICZydHApKQorICAgICAgZ290byBpbnZhbGlkX3BhY2tldDsKKworICAgIHBpbmZvLT5wYXlsb2FkX2xlbiArPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF9sZW4gKCZydHApOworICAgIGlmIChpZHggPT0gMCkgeworICAgICAgZ2ludCBpOworCisgICAgICAvKiBvbmx5IGtlZXAgaW5mbyBmb3IgZmlyc3QgYnVmZmVyICovCisgICAgICBwaW5mby0+c3NyYyA9IGdzdF9ydHBfYnVmZmVyX2dldF9zc3JjICgmcnRwKTsKKyAgICAgIHBpbmZvLT5zZXFudW0gPSBnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxICgmcnRwKTsKKyAgICAgIHBpbmZvLT5wdCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3R5cGUgKCZydHApOworICAgICAgcGluZm8tPnJ0cHRpbWUgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wICgmcnRwKTsKKyAgICAgIC8qIGNvcHkgYXZhaWxhYmxlIGNzcmMgKi8KKyAgICAgIHBpbmZvLT5jc3JjX2NvdW50ID0gZ3N0X3J0cF9idWZmZXJfZ2V0X2NzcmNfY291bnQgKCZydHApOworICAgICAgZm9yIChpID0gMDsgaSA8IHBpbmZvLT5jc3JjX2NvdW50OyBpKyspCisgICAgICAgIHBpbmZvLT5jc3Jjc1tpXSA9IGdzdF9ydHBfYnVmZmVyX2dldF9jc3JjICgmcnRwLCBpKTsKKyAgICB9CisgICAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworICB9CisKKyAgaWYgKGlkeCA9PSAwKSB7CisgICAgLyogZm9yIG5ldGJ1ZmZlciB3ZSBjYW4gc3RvcmUgdGhlIElQIGFkZHJlc3MgdG8gY2hlY2sgZm9yIGNvbGxpc2lvbnMgKi8KKyAgICBtZXRhID0gZ3N0X2J1ZmZlcl9nZXRfbmV0X2FkZHJlc3NfbWV0YSAoKmJ1ZmZlcik7CisgICAgaWYgKHBpbmZvLT5hZGRyZXNzKQorICAgICAgZ19vYmplY3RfdW5yZWYgKHBpbmZvLT5hZGRyZXNzKTsKKyAgICBpZiAobWV0YSkgeworICAgICAgcGluZm8tPmFkZHJlc3MgPSBHX1NPQ0tFVF9BRERSRVNTIChnX29iamVjdF9yZWYgKG1ldGEtPmFkZHIpKTsKKyAgICB9IGVsc2UgeworICAgICAgcGluZm8tPmFkZHJlc3MgPSBOVUxMOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfcGFja2V0OgorICB7CisgICAgR1NUX0RFQlVHICgiaW52YWxpZCBSVFAgcGFja2V0IHJlY2VpdmVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIHVwZGF0ZSB0aGUgUlRQUGFja2V0SW5mbyBzdHJ1Y3R1cmUgd2l0aCB0aGUgY3VycmVudCB0aW1lIGFuZCBvdGhlciBiaXRzCisgKiBhYm91dCB0aGUgY3VycmVudCBidWZmZXIgd2UgYXJlIGhhbmRsaW5nLgorICogVGhpcyBmdW5jdGlvbiBpcyB0eXBpY2FsbHkgY2FsbGVkIHdoZW4gYSB2YWxpZGF0ZWQgcGFja2V0IGlzIHJlY2VpdmVkLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIFNFU1NJT05fTE9DSworICovCitzdGF0aWMgZ2Jvb2xlYW4KK3VwZGF0ZV9wYWNrZXRfaW5mbyAoUlRQU2Vzc2lvbiAqIHNlc3MsIFJUUFBhY2tldEluZm8gKiBwaW5mbywKKyAgICBnYm9vbGVhbiBzZW5kLCBnYm9vbGVhbiBydHAsIGdib29sZWFuIGlzX2xpc3QsIGdwb2ludGVyIGRhdGEsCisgICAgR3N0Q2xvY2tUaW1lIGN1cnJlbnRfdGltZSwgR3N0Q2xvY2tUaW1lIHJ1bm5pbmdfdGltZSwgZ3VpbnQ2NCBudHBuc3RpbWUpCit7CisgIGdib29sZWFuIHJlczsKKworICBwaW5mby0+c2VuZCA9IHNlbmQ7CisgIHBpbmZvLT5ydHAgPSBydHA7CisgIHBpbmZvLT5pc19saXN0ID0gaXNfbGlzdDsKKyAgcGluZm8tPmRhdGEgPSBkYXRhOworICBwaW5mby0+Y3VycmVudF90aW1lID0gY3VycmVudF90aW1lOworICBwaW5mby0+cnVubmluZ190aW1lID0gcnVubmluZ190aW1lOworICBwaW5mby0+bnRwbnN0aW1lID0gbnRwbnN0aW1lOworICBwaW5mby0+aGVhZGVyX2xlbiA9IHNlc3MtPmhlYWRlcl9sZW47CisgIHBpbmZvLT5ieXRlcyA9IDA7CisgIHBpbmZvLT5wYXlsb2FkX2xlbiA9IDA7CisgIHBpbmZvLT5wYWNrZXRzID0gMDsKKworICBpZiAoaXNfbGlzdCkgeworICAgIEdzdEJ1ZmZlckxpc3QgKmxpc3QgPSBHU1RfQlVGRkVSX0xJU1RfQ0FTVCAoZGF0YSk7CisgICAgcmVzID0KKyAgICAgICAgZ3N0X2J1ZmZlcl9saXN0X2ZvcmVhY2ggKGxpc3QsIChHc3RCdWZmZXJMaXN0RnVuYykgdXBkYXRlX3BhY2tldCwKKyAgICAgICAgcGluZm8pOworICB9IGVsc2UgeworICAgIEdzdEJ1ZmZlciAqYnVmZmVyID0gR1NUX0JVRkZFUl9DQVNUIChkYXRhKTsKKyAgICByZXMgPSB1cGRhdGVfcGFja2V0ICgmYnVmZmVyLCAwLCBwaW5mbyk7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQKK2NsZWFuX3BhY2tldF9pbmZvIChSVFBQYWNrZXRJbmZvICogcGluZm8pCit7CisgIGlmIChwaW5mby0+YWRkcmVzcykKKyAgICBnX29iamVjdF91bnJlZiAocGluZm8tPmFkZHJlc3MpOworICBpZiAocGluZm8tPmRhdGEpIHsKKyAgICBnc3RfbWluaV9vYmplY3RfdW5yZWYgKHBpbmZvLT5kYXRhKTsKKyAgICBwaW5mby0+ZGF0YSA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitzb3VyY2VfdXBkYXRlX2FjdGl2ZSAoUlRQU2Vzc2lvbiAqIHNlc3MsIFJUUFNvdXJjZSAqIHNvdXJjZSwKKyAgICBnYm9vbGVhbiBwcmV2YWN0aXZlKQoreworICBnYm9vbGVhbiBhY3RpdmUgPSBSVFBfU09VUkNFX0lTX0FDVElWRSAoc291cmNlKTsKKyAgZ3VpbnQzMiBzc3JjID0gc291cmNlLT5zc3JjOworCisgIGlmIChwcmV2YWN0aXZlID09IGFjdGl2ZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGFjdGl2ZSkgeworICAgIHNlc3MtPnN0YXRzLmFjdGl2ZV9zb3VyY2VzKys7CisgICAgR1NUX0RFQlVHICgic291cmNlOiAlMDh4IGJlY2FtZSBhY3RpdmUsICVkIGFjdGl2ZSBzb3VyY2VzIiwgc3NyYywKKyAgICAgICAgc2Vzcy0+c3RhdHMuYWN0aXZlX3NvdXJjZXMpOworICB9IGVsc2UgeworICAgIHNlc3MtPnN0YXRzLmFjdGl2ZV9zb3VyY2VzLS07CisgICAgR1NUX0RFQlVHICgic291cmNlOiAlMDh4IGJlY2FtZSBpbmFjdGl2ZSwgJWQgYWN0aXZlIHNvdXJjZXMiLCBzc3JjLAorICAgICAgICBzZXNzLT5zdGF0cy5hY3RpdmVfc291cmNlcyk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorc291cmNlX3VwZGF0ZV9zZW5kZXIgKFJUUFNlc3Npb24gKiBzZXNzLCBSVFBTb3VyY2UgKiBzb3VyY2UsCisgICAgZ2Jvb2xlYW4gcHJldnNlbmRlcikKK3sKKyAgZ2Jvb2xlYW4gc2VuZGVyID0gUlRQX1NPVVJDRV9JU19TRU5ERVIgKHNvdXJjZSk7CisgIGd1aW50MzIgc3NyYyA9IHNvdXJjZS0+c3NyYzsKKworICBpZiAocHJldnNlbmRlciA9PSBzZW5kZXIpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChzZW5kZXIpIHsKKyAgICBzZXNzLT5zdGF0cy5zZW5kZXJfc291cmNlcysrOworICAgIGlmIChzb3VyY2UtPmludGVybmFsKQorICAgICAgc2Vzcy0+c3RhdHMuaW50ZXJuYWxfc2VuZGVyX3NvdXJjZXMrKzsKKyAgICBHU1RfREVCVUcgKCJzb3VyY2U6ICUwOHggYmVjYW1lIHNlbmRlciwgJWQgc2VuZGVyIHNvdXJjZXMiLCBzc3JjLAorICAgICAgICBzZXNzLT5zdGF0cy5zZW5kZXJfc291cmNlcyk7CisgIH0gZWxzZSB7CisgICAgc2Vzcy0+c3RhdHMuc2VuZGVyX3NvdXJjZXMtLTsKKyAgICBpZiAoc291cmNlLT5pbnRlcm5hbCkKKyAgICAgIHNlc3MtPnN0YXRzLmludGVybmFsX3NlbmRlcl9zb3VyY2VzLS07CisgICAgR1NUX0RFQlVHICgic291cmNlOiAlMDh4IGJlY2FtZSBub24gc2VuZGVyLCAlZCBzZW5kZXIgc291cmNlcyIsIHNzcmMsCisgICAgICAgIHNlc3MtPnN0YXRzLnNlbmRlcl9zb3VyY2VzKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBydHBfc2Vzc2lvbl9wcm9jZXNzX3J0cDoKKyAqIEBzZXNzOiBhbmQgI1JUUFNlc3Npb24KKyAqIEBidWZmZXI6IGFuIFJUUCBidWZmZXIKKyAqIEBjdXJyZW50X3RpbWU6IHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lCisgKiBAcnVubmluZ190aW1lOiB0aGUgcnVubmluZ190aW1lIG9mIEBidWZmZXIKKyAqCisgKiBQcm9jZXNzIGFuIFJUUCBidWZmZXIgaW4gdGhlIHNlc3Npb24gbWFuYWdlci4gVGhpcyBmdW5jdGlvbiB0YWtlcyBvd25lcnNoaXAKKyAqIG9mIEBidWZmZXIuCisgKgorICogUmV0dXJuczogYSAjR3N0Rmxvd1JldHVybi4KKyAqLworR3N0Rmxvd1JldHVybgorcnRwX3Nlc3Npb25fcHJvY2Vzc19ydHAgKFJUUFNlc3Npb24gKiBzZXNzLCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgR3N0Q2xvY2tUaW1lIGN1cnJlbnRfdGltZSwgR3N0Q2xvY2tUaW1lIHJ1bm5pbmdfdGltZSwgZ3VpbnQ2NCBudHBuc3RpbWUpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0OworICBndWludDMyIHNzcmM7CisgIFJUUFNvdXJjZSAqc291cmNlOworICBnYm9vbGVhbiBjcmVhdGVkOworICBnYm9vbGVhbiBwcmV2c2VuZGVyLCBwcmV2YWN0aXZlOworICBSVFBQYWNrZXRJbmZvIHBpbmZvID0geyAwLCB9OworICBndWludDY0IG9sZHJhdGU7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFJUUF9JU19TRVNTSU9OIChzZXNzKSwgR1NUX0ZMT1dfRVJST1IpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX0JVRkZFUiAoYnVmZmVyKSwgR1NUX0ZMT1dfRVJST1IpOworCisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworCisgIC8qIHVwZGF0ZSBwaW5mbyBzdGF0cyAqLworICBpZiAoIXVwZGF0ZV9wYWNrZXRfaW5mbyAoc2VzcywgJnBpbmZvLCBGQUxTRSwgVFJVRSwgRkFMU0UsIGJ1ZmZlciwKKyAgICAgICAgICBjdXJyZW50X3RpbWUsIHJ1bm5pbmdfdGltZSwgbnRwbnN0aW1lKSkgeworICAgIEdTVF9ERUJVRyAoImludmFsaWQgUlRQIHBhY2tldCByZWNlaXZlZCIpOworICAgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgICAgcmV0dXJuIHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnRjcCAoc2VzcywgYnVmZmVyLCBjdXJyZW50X3RpbWUsIG50cG5zdGltZSk7CisgIH0KKworICBzc3JjID0gcGluZm8uc3NyYzsKKworICBzb3VyY2UgPSBvYnRhaW5fc291cmNlIChzZXNzLCBzc3JjLCAmY3JlYXRlZCwgJnBpbmZvLCBUUlVFKTsKKyAgaWYgKCFzb3VyY2UpCisgICAgZ290byBjb2xsaXNpb247CisKKyAgcHJldnNlbmRlciA9IFJUUF9TT1VSQ0VfSVNfU0VOREVSIChzb3VyY2UpOworICBwcmV2YWN0aXZlID0gUlRQX1NPVVJDRV9JU19BQ1RJVkUgKHNvdXJjZSk7CisgIG9sZHJhdGUgPSBzb3VyY2UtPmJpdHJhdGU7CisKKyAgLyogbGV0IHNvdXJjZSBwcm9jZXNzIHRoZSBwYWNrZXQgKi8KKyAgcmVzdWx0ID0gcnRwX3NvdXJjZV9wcm9jZXNzX3J0cCAoc291cmNlLCAmcGluZm8pOworCisgIC8qIHNvdXJjZSBiZWNhbWUgYWN0aXZlICovCisgIGlmIChzb3VyY2VfdXBkYXRlX2FjdGl2ZSAoc2Vzcywgc291cmNlLCBwcmV2YWN0aXZlKSkKKyAgICBvbl9zc3JjX3ZhbGlkYXRlZCAoc2Vzcywgc291cmNlKTsKKworICBzb3VyY2VfdXBkYXRlX3NlbmRlciAoc2Vzcywgc291cmNlLCBwcmV2c2VuZGVyKTsKKworICBpZiAob2xkcmF0ZSAhPSBzb3VyY2UtPmJpdHJhdGUpCisgICAgc2Vzcy0+cmVjYWxjX2JhbmR3aWR0aCA9IFRSVUU7CisKKyAgaWYgKGNyZWF0ZWQpCisgICAgb25fbmV3X3NzcmMgKHNlc3MsIHNvdXJjZSk7CisKKyAgaWYgKHNvdXJjZS0+dmFsaWRhdGVkKSB7CisgICAgZ2Jvb2xlYW4gY3JlYXRlZDsKKyAgICBnaW50IGk7CisKKyAgICAvKiBmb3IgdmFsaWRhdGVkIHNvdXJjZXMsIHdlIGFkZCB0aGUgQ1NSQ3MgYXMgd2VsbCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBwaW5mby5jc3JjX2NvdW50OyBpKyspIHsKKyAgICAgIGd1aW50MzIgY3NyYzsKKyAgICAgIFJUUFNvdXJjZSAqY3NyY19zcmM7CisKKyAgICAgIGNzcmMgPSBwaW5mby5jc3Jjc1tpXTsKKworICAgICAgLyogZ2V0IHNvdXJjZSAqLworICAgICAgY3NyY19zcmMgPSBvYnRhaW5fc291cmNlIChzZXNzLCBjc3JjLCAmY3JlYXRlZCwgJnBpbmZvLCBUUlVFKTsKKyAgICAgIGlmICghY3NyY19zcmMpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoY3JlYXRlZCkgeworICAgICAgICBHU1RfREVCVUcgKCJjcmVhdGVkIG5ldyBDU1JDOiAlMDh4IiwgY3NyYyk7CisgICAgICAgIHJ0cF9zb3VyY2Vfc2V0X2FzX2NzcmMgKGNzcmNfc3JjKTsKKyAgICAgICAgc291cmNlX3VwZGF0ZV9hY3RpdmUgKHNlc3MsIGNzcmNfc3JjLCBGQUxTRSk7CisgICAgICAgIG9uX25ld19zc3JjIChzZXNzLCBjc3JjX3NyYyk7CisgICAgICB9CisgICAgICBnX29iamVjdF91bnJlZiAoY3NyY19zcmMpOworICAgIH0KKyAgfQorICBnX29iamVjdF91bnJlZiAoc291cmNlKTsKKworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIGNsZWFuX3BhY2tldF9pbmZvICgmcGluZm8pOworCisgIHJldHVybiByZXN1bHQ7CisKKyAgLyogRVJST1JTICovCitjb2xsaXNpb246CisgIHsKKyAgICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICAgIGNsZWFuX3BhY2tldF9pbmZvICgmcGluZm8pOworICAgIEdTVF9ERUJVRyAoImlnbm9yaW5nIHBhY2tldCBiZWNhdXNlIGl0cyBjb2xsaXNpb25pbmciKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3J0cF9zZXNzaW9uX3Byb2Nlc3NfcmIgKFJUUFNlc3Npb24gKiBzZXNzLCBSVFBTb3VyY2UgKiBzb3VyY2UsCisgICAgR3N0UlRDUFBhY2tldCAqIHBhY2tldCwgUlRQUGFja2V0SW5mbyAqIHBpbmZvKQoreworICBndWludCBjb3VudCwgaTsKKworICBjb3VudCA9IGdzdF9ydGNwX3BhY2tldF9nZXRfcmJfY291bnQgKHBhY2tldCk7CisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgZ3VpbnQzMiBzc3JjLCBleHRoaWdoZXN0c2VxLCBqaXR0ZXIsIGxzciwgZGxzcjsKKyAgICBndWludDggZnJhY3Rpb25sb3N0OworICAgIGdpbnQzMiBwYWNrZXRzbG9zdDsKKyAgICBSVFBTb3VyY2UgKnNyYzsKKworICAgIGdzdF9ydGNwX3BhY2tldF9nZXRfcmIgKHBhY2tldCwgaSwgJnNzcmMsICZmcmFjdGlvbmxvc3QsCisgICAgICAgICZwYWNrZXRzbG9zdCwgJmV4dGhpZ2hlc3RzZXEsICZqaXR0ZXIsICZsc3IsICZkbHNyKTsKKworICAgIEdTVF9ERUJVRyAoIlJCICVkOiBTU1JDICUwOHgsIGppdHRlciAlIiBHX0dVSU5UMzJfRk9STUFULCBpLCBzc3JjLCBqaXR0ZXIpOworCisgICAgLyogZmluZCBvdXIgb3duIHNvdXJjZSAqLworICAgIHNyYyA9IGZpbmRfc291cmNlIChzZXNzLCBzc3JjKTsKKyAgICBpZiAoc3JjID09IE5VTEwpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChzcmMtPmludGVybmFsICYmIFJUUF9TT1VSQ0VfSVNfQUNUSVZFIChzcmMpKSB7CisgICAgICAvKiBvbmx5IGRlYWwgd2l0aCByZXBvcnQgYmxvY2tzIGZvciBvdXIgc2Vzc2lvbiwgd2UgdXBkYXRlIHRoZSBzdGF0cyBvZgorICAgICAgICogdGhlIHNlbmRlciBvZiB0aGUgUlRDUCBtZXNzYWdlLiBXZSBjb3VsZCBhbHNvIGNvbXBhcmUgb3VyIHN0YXRzIGFnYWluc3QKKyAgICAgICAqIHRoZSBvdGhlciBzZW5kZXIgdG8gc2VlIGlmIHdlIGFyZSBiZXR0ZXIgb3Igd29yc2UuICovCisgICAgICAvKiBGSVhNRSwgbmVlZCB0byBrZWVwIHRyYWNrIHdobyB0aGUgUkIgYmxvY2sgaXMgZnJvbSAqLworICAgICAgcnRwX3NvdXJjZV9wcm9jZXNzX3JiIChzb3VyY2UsIHBpbmZvLT5udHBuc3RpbWUsIGZyYWN0aW9ubG9zdCwKKyAgICAgICAgICBwYWNrZXRzbG9zdCwgZXh0aGlnaGVzdHNlcSwgaml0dGVyLCBsc3IsIGRsc3IpOworICAgIH0KKyAgfQorICBvbl9zc3JjX2FjdGl2ZSAoc2Vzcywgc291cmNlKTsKK30KKworLyogQSBTZW5kZXIgcmVwb3J0IGNvbnRhaW5zIHN0YXRpc3RpY3MgYWJvdXQgaG93IHRoZSBzZW5kZXIgaXMgZG9pbmcuIFRoaXMKKyAqIGluY2x1ZGVzIHRpbWluZyBpbmZvcm1hdGFpb24gc3VjaCBhcyB0aGUgcmVsYXRpb24gYmV0d2VlbiBSVFAgYW5kIE5UUAorICogdGltZXN0YW1wcyBhbmQgdGhlIG51bWJlciBvZiBwYWNrZXRzL2J5dGVzIGl0IHNlbnQgdG8gdXMuCisgKgorICogSW4gdGhpcyByZXBvcnQgaXMgYWxzbyBpbmNsdWRlZCBhIHNldCBvZiByZXBvcnQgYmxvY2tzIHJlbGF0ZWQgdG8gaG93IHRoaXMKKyAqIHNlbmRlciBpcyByZWNlaXZpbmcgZGF0YSAoaW4gY2FzZSB3ZSAob3Igc29tZWJvZHkgZWxzZSkgaXMgYWxzbyBzZW5kaW5nIHN0dWZmCisgKiB0byBpdCkuIFRoaXMgaW5mbyBpbmNsdWRlcyB0aGUgcGFja2V0IGxvc3MsIGppdHRlciBhbmQgc2VxbnVtLiBJdCBhbHNvCisgKiBjb250YWlucyBpbmZvcm1hdGlvbiB0byBjYWxjdWxhdGUgdGhlIHJvdW5kIHRyaXAgdGltZSAoTFNSL0RMU1IpLgorICovCitzdGF0aWMgdm9pZAorcnRwX3Nlc3Npb25fcHJvY2Vzc19zciAoUlRQU2Vzc2lvbiAqIHNlc3MsIEdzdFJUQ1BQYWNrZXQgKiBwYWNrZXQsCisgICAgUlRQUGFja2V0SW5mbyAqIHBpbmZvLCBnYm9vbGVhbiAqIGRvX3N5bmMpCit7CisgIGd1aW50MzIgc2VuZGVyc3NyYywgcnRwdGltZSwgcGFja2V0X2NvdW50LCBvY3RldF9jb3VudDsKKyAgZ3VpbnQ2NCBudHB0aW1lOworICBSVFBTb3VyY2UgKnNvdXJjZTsKKyAgZ2Jvb2xlYW4gY3JlYXRlZCwgcHJldnNlbmRlcjsKKworICBnc3RfcnRjcF9wYWNrZXRfc3JfZ2V0X3NlbmRlcl9pbmZvIChwYWNrZXQsICZzZW5kZXJzc3JjLCAmbnRwdGltZSwgJnJ0cHRpbWUsCisgICAgICAmcGFja2V0X2NvdW50LCAmb2N0ZXRfY291bnQpOworCisgIEdTVF9ERUJVRyAoImdvdCBTUiBwYWNrZXQ6IFNTUkMgJTA4eCwgdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBzZW5kZXJzc3JjLCBHU1RfVElNRV9BUkdTIChwaW5mby0+Y3VycmVudF90aW1lKSk7CisKKyAgc291cmNlID0gb2J0YWluX3NvdXJjZSAoc2Vzcywgc2VuZGVyc3NyYywgJmNyZWF0ZWQsIHBpbmZvLCBGQUxTRSk7CisgIGlmICghc291cmNlKQorICAgIHJldHVybjsKKworICAvKiBza2lwIG5vbi1ieWUgcGFja2V0cyBmb3Igc291cmNlcyB0aGF0IGFyZSBtYXJrZWQgQllFICovCisgIGlmIChzZXNzLT5zY2hlZHVsZWRfYnllICYmIFJUUF9TT1VSQ0VfSVNfTUFSS0VEX0JZRSAoc291cmNlKSkKKyAgICBnb3RvIG91dDsKKworICAvKiBkb24ndCB0cnkgdG8gZG8gbGlwLXN5bmMgZm9yIHNvdXJjZXMgdGhhdCBzZW50IGEgQllFICovCisgIGlmIChSVFBfU09VUkNFX0lTX01BUktFRF9CWUUgKHNvdXJjZSkpCisgICAgKmRvX3N5bmMgPSBGQUxTRTsKKyAgZWxzZQorICAgICpkb19zeW5jID0gVFJVRTsKKworICBwcmV2c2VuZGVyID0gUlRQX1NPVVJDRV9JU19TRU5ERVIgKHNvdXJjZSk7CisKKyAgLyogZmlyc3QgdXBkYXRlIHRoZSBzb3VyY2UgKi8KKyAgcnRwX3NvdXJjZV9wcm9jZXNzX3NyIChzb3VyY2UsIHBpbmZvLT5jdXJyZW50X3RpbWUsIG50cHRpbWUsIHJ0cHRpbWUsCisgICAgICBwYWNrZXRfY291bnQsIG9jdGV0X2NvdW50KTsKKworICBzb3VyY2VfdXBkYXRlX3NlbmRlciAoc2Vzcywgc291cmNlLCBwcmV2c2VuZGVyKTsKKworICBpZiAoY3JlYXRlZCkKKyAgICBvbl9uZXdfc3NyYyAoc2Vzcywgc291cmNlKTsKKworICBydHBfc2Vzc2lvbl9wcm9jZXNzX3JiIChzZXNzLCBzb3VyY2UsIHBhY2tldCwgcGluZm8pOworCitvdXQ6CisgIGdfb2JqZWN0X3VucmVmIChzb3VyY2UpOworfQorCisvKiBBIHJlY2VpdmVyIHJlcG9ydCBjb250YWlucyBzdGF0aXN0aWNzIGFib3V0IGhvdyBhIHJlY2VpdmVyIGlzIGRvaW5nLiBJdAorICogaW5jbHVkZXMgc3R1ZmYgbGlrZSBwYWNrZXQgbG9zcywgaml0dGVyIGFuZCB0aGUgc2VxbnVtIGl0IHJlY2VpdmVkIGxhc3QuIEl0CisgKiBhbHNvIGNvbnRhaW5zIGluZm8gdG8gY2FsY3VsYXRlIHRoZSByb3VuZCB0cmlwIHRpbWUuCisgKgorICogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBob3cgdGhlIHNlbmRlciBvZiB0aGlzIHJlcG9ydCBpcyBkb2luZyB3cnQgdG8gdXMuCisgKi8KK3N0YXRpYyB2b2lkCitydHBfc2Vzc2lvbl9wcm9jZXNzX3JyIChSVFBTZXNzaW9uICogc2VzcywgR3N0UlRDUFBhY2tldCAqIHBhY2tldCwKKyAgICBSVFBQYWNrZXRJbmZvICogcGluZm8pCit7CisgIGd1aW50MzIgc2VuZGVyc3NyYzsKKyAgUlRQU291cmNlICpzb3VyY2U7CisgIGdib29sZWFuIGNyZWF0ZWQ7CisKKyAgc2VuZGVyc3NyYyA9IGdzdF9ydGNwX3BhY2tldF9ycl9nZXRfc3NyYyAocGFja2V0KTsKKworICBHU1RfREVCVUcgKCJnb3QgUlIgcGFja2V0OiBTU1JDICUwOHgiLCBzZW5kZXJzc3JjKTsKKworICBzb3VyY2UgPSBvYnRhaW5fc291cmNlIChzZXNzLCBzZW5kZXJzc3JjLCAmY3JlYXRlZCwgcGluZm8sIEZBTFNFKTsKKyAgaWYgKCFzb3VyY2UpCisgICAgcmV0dXJuOworCisgIC8qIHNraXAgbm9uLWJ5ZSBwYWNrZXRzIGZvciBzb3VyY2VzIHRoYXQgYXJlIG1hcmtlZCBCWUUgKi8KKyAgaWYgKHNlc3MtPnNjaGVkdWxlZF9ieWUgJiYgUlRQX1NPVVJDRV9JU19NQVJLRURfQllFIChzb3VyY2UpKQorICAgIGdvdG8gb3V0OworCisgIGlmIChjcmVhdGVkKQorICAgIG9uX25ld19zc3JjIChzZXNzLCBzb3VyY2UpOworCisgIHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcmIgKHNlc3MsIHNvdXJjZSwgcGFja2V0LCBwaW5mbyk7CisKK291dDoKKyAgZ19vYmplY3RfdW5yZWYgKHNvdXJjZSk7Cit9CisKKy8qIEdldCBTREVTIGl0ZW1zIGFuZCBzdG9yZSB0aGVtIGluIHRoZSBTU1JDICovCitzdGF0aWMgdm9pZAorcnRwX3Nlc3Npb25fcHJvY2Vzc19zZGVzIChSVFBTZXNzaW9uICogc2VzcywgR3N0UlRDUFBhY2tldCAqIHBhY2tldCwKKyAgICBSVFBQYWNrZXRJbmZvICogcGluZm8pCit7CisgIGd1aW50IGl0ZW1zLCBpLCBqOworICBnYm9vbGVhbiBtb3JlX2l0ZW1zLCBtb3JlX2VudHJpZXM7CisKKyAgaXRlbXMgPSBnc3RfcnRjcF9wYWNrZXRfc2Rlc19nZXRfaXRlbV9jb3VudCAocGFja2V0KTsKKyAgR1NUX0RFQlVHICgiZ290IFNERVMgcGFja2V0IHdpdGggJWQgaXRlbXMiLCBpdGVtcyk7CisKKyAgbW9yZV9pdGVtcyA9IGdzdF9ydGNwX3BhY2tldF9zZGVzX2ZpcnN0X2l0ZW0gKHBhY2tldCk7CisgIGkgPSAwOworICB3aGlsZSAobW9yZV9pdGVtcykgeworICAgIGd1aW50MzIgc3NyYzsKKyAgICBnYm9vbGVhbiBjaGFuZ2VkLCBjcmVhdGVkLCBwcmV2YWN0aXZlOworICAgIFJUUFNvdXJjZSAqc291cmNlOworICAgIEdzdFN0cnVjdHVyZSAqc2RlczsKKworICAgIHNzcmMgPSBnc3RfcnRjcF9wYWNrZXRfc2Rlc19nZXRfc3NyYyAocGFja2V0KTsKKworICAgIEdTVF9ERUJVRyAoIml0ZW0gJWQsIFNTUkMgJTA4eCIsIGksIHNzcmMpOworCisgICAgY2hhbmdlZCA9IEZBTFNFOworCisgICAgLyogZmluZCBzcmMsIG5vIHByb2JhdGlvbiB3aGVuIGRlYWxpbmcgd2l0aCBSVENQICovCisgICAgc291cmNlID0gb2J0YWluX3NvdXJjZSAoc2Vzcywgc3NyYywgJmNyZWF0ZWQsIHBpbmZvLCBGQUxTRSk7CisgICAgaWYgKCFzb3VyY2UpCisgICAgICByZXR1cm47CisKKyAgICAvKiBza2lwIG5vbi1ieWUgcGFja2V0cyBmb3Igc291cmNlcyB0aGF0IGFyZSBtYXJrZWQgQllFICovCisgICAgaWYgKHNlc3MtPnNjaGVkdWxlZF9ieWUgJiYgUlRQX1NPVVJDRV9JU19NQVJLRURfQllFIChzb3VyY2UpKQorICAgICAgZ290byBuZXh0OworCisgICAgc2RlcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgiYXBwbGljYXRpb24veC1ydHAtc291cmNlLXNkZXMiKTsKKworICAgIG1vcmVfZW50cmllcyA9IGdzdF9ydGNwX3BhY2tldF9zZGVzX2ZpcnN0X2VudHJ5IChwYWNrZXQpOworICAgIGogPSAwOworICAgIHdoaWxlIChtb3JlX2VudHJpZXMpIHsKKyAgICAgIEdzdFJUQ1BTREVTVHlwZSB0eXBlOworICAgICAgZ3VpbnQ4IGxlbjsKKyAgICAgIGd1aW50OCAqZGF0YTsKKyAgICAgIGdjaGFyICpuYW1lOworICAgICAgZ2NoYXIgKnZhbHVlOworCisgICAgICBnc3RfcnRjcF9wYWNrZXRfc2Rlc19nZXRfZW50cnkgKHBhY2tldCwgJnR5cGUsICZsZW4sICZkYXRhKTsKKworICAgICAgR1NUX0RFQlVHICgiZW50cnkgJWQsIHR5cGUgJWQsIGxlbiAlZCwgZGF0YSAlLipzIiwgaiwgdHlwZSwgbGVuLCBsZW4sCisgICAgICAgICAgZGF0YSk7CisKKyAgICAgIGlmICh0eXBlID09IEdTVF9SVENQX1NERVNfUFJJVikgeworICAgICAgICBuYW1lID0gZ19zdHJuZHVwICgoY29uc3QgZ2NoYXIgKikgJmRhdGFbMV0sIGRhdGFbMF0pOworICAgICAgICBsZW4gLT0gZGF0YVswXSArIDE7CisgICAgICAgIGRhdGEgKz0gZGF0YVswXSArIDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBuYW1lID0gZ19zdHJkdXAgKGdzdF9ydGNwX3NkZXNfdHlwZV90b19uYW1lICh0eXBlKSk7CisgICAgICB9CisKKyAgICAgIHZhbHVlID0gZ19zdHJuZHVwICgoY29uc3QgZ2NoYXIgKikgZGF0YSwgbGVuKTsKKworICAgICAgaWYgKGdfdXRmOF92YWxpZGF0ZSAodmFsdWUsIC0xLCBOVUxMKSkgeworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoc2RlcywgbmFtZSwgR19UWVBFX1NUUklORywgdmFsdWUsIE5VTEwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJpZ25vcmUgU0RFUyBmaWVsZCAlcyB3aXRoIG5vbi11dGY4IGRhdGEgJXMiLCBuYW1lLCB2YWx1ZSk7CisgICAgICB9CisKKyAgICAgIGdfZnJlZSAobmFtZSk7CisgICAgICBnX2ZyZWUgKHZhbHVlKTsKKworICAgICAgbW9yZV9lbnRyaWVzID0gZ3N0X3J0Y3BfcGFja2V0X3NkZXNfbmV4dF9lbnRyeSAocGFja2V0KTsKKyAgICAgIGorKzsKKyAgICB9CisKKyAgICAvKiB0YWtlcyBvd25lcnNoaXAgb2Ygc2RlcyAqLworICAgIGNoYW5nZWQgPSBydHBfc291cmNlX3NldF9zZGVzX3N0cnVjdCAoc291cmNlLCBzZGVzKTsKKworICAgIHByZXZhY3RpdmUgPSBSVFBfU09VUkNFX0lTX0FDVElWRSAoc291cmNlKTsKKyAgICBzb3VyY2UtPnZhbGlkYXRlZCA9IFRSVUU7CisKKyAgICBpZiAoY3JlYXRlZCkKKyAgICAgIG9uX25ld19zc3JjIChzZXNzLCBzb3VyY2UpOworCisgICAgLyogc291cmNlIGJlY2FtZSBhY3RpdmUgKi8KKyAgICBpZiAoc291cmNlX3VwZGF0ZV9hY3RpdmUgKHNlc3MsIHNvdXJjZSwgcHJldmFjdGl2ZSkpCisgICAgICBvbl9zc3JjX3ZhbGlkYXRlZCAoc2Vzcywgc291cmNlKTsKKworICAgIGlmIChjaGFuZ2VkKQorICAgICAgb25fc3NyY19zZGVzIChzZXNzLCBzb3VyY2UpOworCisgIG5leHQ6CisgICAgZ19vYmplY3RfdW5yZWYgKHNvdXJjZSk7CisKKyAgICBtb3JlX2l0ZW1zID0gZ3N0X3J0Y3BfcGFja2V0X3NkZXNfbmV4dF9pdGVtIChwYWNrZXQpOworICAgIGkrKzsKKyAgfQorfQorCisvKiBCWUUgaXMgc2VudCB3aGVuIGEgY2xpZW50IGxlYXZlcyB0aGUgc2Vzc2lvbgorICovCitzdGF0aWMgdm9pZAorcnRwX3Nlc3Npb25fcHJvY2Vzc19ieWUgKFJUUFNlc3Npb24gKiBzZXNzLCBHc3RSVENQUGFja2V0ICogcGFja2V0LAorICAgIFJUUFBhY2tldEluZm8gKiBwaW5mbykKK3sKKyAgZ3VpbnQgY291bnQsIGk7CisgIGdjaGFyICpyZWFzb247CisgIGdib29sZWFuIHJlY29uc2lkZXIgPSBGQUxTRTsKKworICByZWFzb24gPSBnc3RfcnRjcF9wYWNrZXRfYnllX2dldF9yZWFzb24gKHBhY2tldCk7CisgIEdTVF9ERUJVRyAoImdvdCBCWUUgcGFja2V0IChyZWFzb246ICVzKSIsIEdTVF9TVFJfTlVMTCAocmVhc29uKSk7CisKKyAgY291bnQgPSBnc3RfcnRjcF9wYWNrZXRfYnllX2dldF9zc3JjX2NvdW50IChwYWNrZXQpOworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIGd1aW50MzIgc3NyYzsKKyAgICBSVFBTb3VyY2UgKnNvdXJjZTsKKyAgICBnYm9vbGVhbiBwcmV2YWN0aXZlLCBwcmV2c2VuZGVyOworICAgIGd1aW50IHBtZW1iZXJzLCBtZW1iZXJzOworCisgICAgc3NyYyA9IGdzdF9ydGNwX3BhY2tldF9ieWVfZ2V0X250aF9zc3JjIChwYWNrZXQsIGkpOworICAgIEdTVF9ERUJVRyAoIlNTUkM6ICUwOHgiLCBzc3JjKTsKKworICAgIC8qIGZpbmQgc3JjIGFuZCBtYXJrIGJ5ZSwgbm8gcHJvYmF0aW9uIHdoZW4gZGVhbGluZyB3aXRoIFJUQ1AgKi8KKyAgICBzb3VyY2UgPSBmaW5kX3NvdXJjZSAoc2Vzcywgc3NyYyk7CisgICAgaWYgKCFzb3VyY2UgfHwgc291cmNlLT5pbnRlcm5hbCkgeworICAgICAgR1NUX0RFQlVHICgiSWdub3Jpbmcgc3VzcGljaW91cyBCWUUgcGFja2V0IChyZWFzb246ICVzKSIsCisgICAgICAgICAgIXNvdXJjZSA/ICJjYW4ndCBmaW5kIHNvdXJjZSIgOiAiaGFzIGludGVybmFsIHNvdXJjZSBTU1JDIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBzdG9yZSB0aW1lIGZvciB3aGVuIHdlIG5lZWQgdG8gdGltZSBvdXQgdGhpcyBzb3VyY2UgKi8KKyAgICBzb3VyY2UtPmJ5ZV90aW1lID0gcGluZm8tPmN1cnJlbnRfdGltZTsKKworICAgIHByZXZhY3RpdmUgPSBSVFBfU09VUkNFX0lTX0FDVElWRSAoc291cmNlKTsKKyAgICBwcmV2c2VuZGVyID0gUlRQX1NPVVJDRV9JU19TRU5ERVIgKHNvdXJjZSk7CisKKyAgICAvKiBtYXJrIHRoZSBzb3VyY2UgQllFICovCisgICAgcnRwX3NvdXJjZV9tYXJrX2J5ZSAoc291cmNlLCByZWFzb24pOworCisgICAgcG1lbWJlcnMgPSBzZXNzLT5zdGF0cy5hY3RpdmVfc291cmNlczsKKworICAgIHNvdXJjZV91cGRhdGVfYWN0aXZlIChzZXNzLCBzb3VyY2UsIHByZXZhY3RpdmUpOworICAgIHNvdXJjZV91cGRhdGVfc2VuZGVyIChzZXNzLCBzb3VyY2UsIHByZXZzZW5kZXIpOworCisgICAgbWVtYmVycyA9IHNlc3MtPnN0YXRzLmFjdGl2ZV9zb3VyY2VzOworCisgICAgaWYgKCFzZXNzLT5zY2hlZHVsZWRfYnllICYmIG1lbWJlcnMgPCBwbWVtYmVycykgeworICAgICAgLyogc29tZSBtZW1iZXJzIHdlbnQgYXdheSBzaW5jZSB0aGUgcHJldmlvdXMgdGltZW91dCBlc3RpbWF0ZS4KKyAgICAgICAqIFBlcmZvcm0gcmV2ZXJzZSByZWNvbnNpZGVyYXRpb24gYnV0IG9ubHkgd2hlbiB3ZSBhcmUgbm90IHNjaGVkdWxpbmcgYQorICAgICAgICogQllFIG91cnNlbHZlcy4gKi8KKyAgICAgIGlmIChzZXNzLT5uZXh0X3J0Y3BfY2hlY2tfdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FICYmCisgICAgICAgICAgcGluZm8tPmN1cnJlbnRfdGltZSA8IHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lKSB7CisgICAgICAgIEdzdENsb2NrVGltZSB0aW1lX3JlbWFpbmluZzsKKworICAgICAgICAvKiBTY2FsZSBvdXIgbmV4dCBSVENQIGNoZWNrIHRpbWUgYWNjb3JkaW5nIHRvIHRoZSBjaGFuZ2Ugb2YgbnVtYmVycworICAgICAgICAgKiBvZiBtZW1iZXJzLiBCdXQgb25seSBpZiBhKSB0aGlzIGlzIHRoZSBmaXJzdCBSVENQLCBvciBiKSB0aGlzIGlzIG5vdAorICAgICAgICAgKiBhIGZlZWRiYWNrIHNlc3Npb24sIG9yIGMpIHRoaXMgaXMgYSBmZWVkYmFjayBzZXNzaW9uIGJ1dCB3ZSBzY2hlZHVsZQorICAgICAgICAgKiBmb3IgZXZlcnkgUlRDUCBpbnRlcnZhbCAoYWthIG5vIHQtcnItaW50ZXJ2YWwgc2V0KS4KKyAgICAgICAgICoKKyAgICAgICAgICogRklYTUU6IGEpIGFuZCBiKSBhcmUgbm90IGdyZWF0IGFzIHdlIHdpbGwgcG9zc2libHkgZ28gYmVsb3cgVG1pbgorICAgICAgICAgKiBmb3Igbm9uLWZlZWRiYWNrIHByb2ZpbGVzIGFuZCBpbiBjYXNlIG9mIGEpIGJlbG93CisgICAgICAgICAqIFRtaW4vdC1yci1pbnRlcnZhbCBpbiBhbnkgY2FzZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzZXNzLT5sYXN0X3J0Y3Bfc2VuZF90aW1lID09IEdTVF9DTE9DS19USU1FX05PTkUgfHwKKyAgICAgICAgICAgICEoc2Vzcy0+cnRwX3Byb2ZpbGUgPT0gR1NUX1JUUF9QUk9GSUxFX0FWUEYKKyAgICAgICAgICAgICAgICB8fCBzZXNzLT5ydHBfcHJvZmlsZSA9PSBHU1RfUlRQX1BST0ZJTEVfU0FWUEYpIHx8CisgICAgICAgICAgICBzZXNzLT5uZXh0X3J0Y3BfY2hlY2tfdGltZSAtIHNlc3MtPmxhc3RfcnRjcF9zZW5kX3RpbWUgPT0KKyAgICAgICAgICAgIHNlc3MtPmxhc3RfcnRjcF9pbnRlcnZhbCkgeworICAgICAgICAgIHRpbWVfcmVtYWluaW5nID0gc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUgLSBwaW5mby0+Y3VycmVudF90aW1lOworICAgICAgICAgIHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lID0KKyAgICAgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlICh0aW1lX3JlbWFpbmluZywgbWVtYmVycywgcG1lbWJlcnMpOworICAgICAgICAgIHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lICs9IHBpbmZvLT5jdXJyZW50X3RpbWU7CisgICAgICAgIH0KKyAgICAgICAgc2Vzcy0+bGFzdF9ydGNwX2ludGVydmFsID0KKyAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoc2Vzcy0+bGFzdF9ydGNwX2ludGVydmFsLCBtZW1iZXJzLCBwbWVtYmVycyk7CisKKyAgICAgICAgR1NUX0RFQlVHICgicmV2ZXJzZSByZWNvbnNpZGVyYXRpb24gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUpKTsKKworICAgICAgICAvKiBtYXJrIHBlbmRpbmcgcmVjb25zaWRlci4gV2Ugb25seSB3YW50IHRvIHNpZ25hbCB0aGUgcmVjb25zaWRlcmF0aW9uCisgICAgICAgICAqIG9uY2UgYWZ0ZXIgd2UgaGFuZGxlZCBhbGwgdGhlIHNvdXJjZSBpbiB0aGUgYnllIHBhY2tldCAqLworICAgICAgICByZWNvbnNpZGVyID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvbl9ieWVfc3NyYyAoc2Vzcywgc291cmNlKTsKKyAgfQorICBpZiAocmVjb25zaWRlcikgeworICAgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgICAgLyogbm90aWZ5IGFwcCBvZiByZWNvbnNpZGVyYXRpb24gKi8KKyAgICBpZiAoc2Vzcy0+Y2FsbGJhY2tzLnJlY29uc2lkZXIpCisgICAgICBzZXNzLT5jYWxsYmFja3MucmVjb25zaWRlciAoc2Vzcywgc2Vzcy0+cmVjb25zaWRlcl91c2VyX2RhdGEpOworICAgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworICB9CisKKyAgZ19mcmVlIChyZWFzb24pOworfQorCitzdGF0aWMgdm9pZAorcnRwX3Nlc3Npb25fcHJvY2Vzc19hcHAgKFJUUFNlc3Npb24gKiBzZXNzLCBHc3RSVENQUGFja2V0ICogcGFja2V0LAorICAgIFJUUFBhY2tldEluZm8gKiBwaW5mbykKK3sKKyAgR1NUX0RFQlVHICgicmVjZWl2ZWQgQVBQIik7CisKKyAgaWYgKGdfc2lnbmFsX2hhc19oYW5kbGVyX3BlbmRpbmcgKHNlc3MsCisgICAgICAgICAgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fQVBQX1JUQ1BdLCAwLCBUUlVFKSkgeworICAgIEdzdEJ1ZmZlciAqZGF0YV9idWZmZXIgPSBOVUxMOworICAgIGd1aW50MTYgZGF0YV9sZW5ndGg7CisgICAgZ2NoYXIgbmFtZVs1XTsKKworICAgIGRhdGFfbGVuZ3RoID0gZ3N0X3J0Y3BfcGFja2V0X2FwcF9nZXRfZGF0YV9sZW5ndGggKHBhY2tldCkgKiA0OworICAgIGlmIChkYXRhX2xlbmd0aCA+IDApIHsKKyAgICAgIGd1aW50OCAqZGF0YSA9IGdzdF9ydGNwX3BhY2tldF9hcHBfZ2V0X2RhdGEgKHBhY2tldCk7CisgICAgICBkYXRhX2J1ZmZlciA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKHBhY2tldC0+cnRjcC0+YnVmZmVyLAorICAgICAgICAgIEdTVF9CVUZGRVJfQ09QWV9NRU1PUlksIGRhdGEgLSBwYWNrZXQtPnJ0Y3AtPm1hcC5kYXRhLCBkYXRhX2xlbmd0aCk7CisgICAgICBHU1RfQlVGRkVSX1BUUyAoZGF0YV9idWZmZXIpID0gcGluZm8tPnJ1bm5pbmdfdGltZTsKKyAgICB9CisKKyAgICBtZW1jcHkgKG5hbWUsIGdzdF9ydGNwX3BhY2tldF9hcHBfZ2V0X25hbWUgKHBhY2tldCksIDQpOworICAgIG5hbWVbNF0gPSAnXDAnOworCisgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgICBnX3NpZ25hbF9lbWl0IChzZXNzLCBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9BUFBfUlRDUF0sIDAsCisgICAgICAgIGdzdF9ydGNwX3BhY2tldF9hcHBfZ2V0X3N1YnR5cGUgKHBhY2tldCksCisgICAgICAgIGdzdF9ydGNwX3BhY2tldF9hcHBfZ2V0X3NzcmMgKHBhY2tldCksIG5hbWUsIGRhdGFfYnVmZmVyKTsKKyAgICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKworICAgIGlmIChkYXRhX2J1ZmZlcikKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGRhdGFfYnVmZmVyKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3J0cF9zZXNzaW9uX3JlcXVlc3RfbG9jYWxfa2V5X3VuaXQgKFJUUFNlc3Npb24gKiBzZXNzLCBSVFBTb3VyY2UgKiBzcmMsCisgICAgZ3VpbnQzMiBtZWRpYV9zc3JjLCBnYm9vbGVhbiBmaXIsIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUpCit7CisgIGd1aW50MzIgcm91bmRfdHJpcCA9IDA7CisKKyAgcnRwX3NvdXJjZV9nZXRfbGFzdF9yYiAoc3JjLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAmcm91bmRfdHJpcCk7CisKKyAgaWYgKHNyYy0+bGFzdF9rZXlmcmFtZV9yZXF1ZXN0ICE9IEdTVF9DTE9DS19USU1FX05PTkUgJiYgcm91bmRfdHJpcCkgeworICAgIEdzdENsb2NrVGltZSByb3VuZF90cmlwX2luX25zID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChyb3VuZF90cmlwLAorICAgICAgICBHU1RfU0VDT05ELCA2NTUzNik7CisKKyAgICAvKiBTYW5pdHkgY2hlY2sgdG8gYXZvaWQgYWx3YXlzIGlnbm9yaW5nIFBMSS9GSVIgaWYgd2UgcmVjZWl2ZSBSVENQCisgICAgICogcGFja2V0cyB3aXRoIGVycm9uZW91cyB2YWx1ZXMgcmVzdWx0aW5nIGluIGNyYXp5IGhpZ2ggUlRULiAqLworICAgIGlmIChyb3VuZF90cmlwX2luX25zID4gNSAqIEdTVF9TRUNPTkQpCisgICAgICByb3VuZF90cmlwX2luX25zID0gR1NUX1NFQ09ORCAvIDI7CisKKyAgICBpZiAoY3VycmVudF90aW1lIC0gc3JjLT5sYXN0X2tleWZyYW1lX3JlcXVlc3QgPCAyICogcm91bmRfdHJpcF9pbl9ucykgeworICAgICAgR1NUX0RFQlVHICgiSWdub3JpbmcgJXMgcmVxdWVzdCBmcm9tICVYIGJlY2F1c2Ugb25lIHdhcyBzZW5kIHdpdGhvdXQgb25lICIKKyAgICAgICAgICAiUlRUICglIiBHU1RfVElNRV9GT1JNQVQgIiA8ICUiIEdTVF9USU1FX0ZPUk1BVCAiKSIsCisgICAgICAgICAgZmlyID8gIkZJUiIgOiAiUExJIiwgcnRwX3NvdXJjZV9nZXRfc3NyYyAoc3JjKSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChjdXJyZW50X3RpbWUgLSBzcmMtPmxhc3Rfa2V5ZnJhbWVfcmVxdWVzdCksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocm91bmRfdHJpcF9pbl9ucykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorCisgIHNyYy0+bGFzdF9rZXlmcmFtZV9yZXF1ZXN0ID0gY3VycmVudF90aW1lOworCisgIEdTVF9MT0cgKCJyZWNlaXZlZCAlcyByZXF1ZXN0IGZyb20gJVggYWJvdXQgJVggJXAoJXApIiwgZmlyID8gIkZJUiIgOiAiUExJIiwKKyAgICAgIHJ0cF9zb3VyY2VfZ2V0X3NzcmMgKHNyYyksIG1lZGlhX3NzcmMsIHNlc3MtPmNhbGxiYWNrcy5wcm9jZXNzX3J0cCwKKyAgICAgIHNlc3MtPmNhbGxiYWNrcy5yZXF1ZXN0X2tleV91bml0KTsKKworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICBzZXNzLT5jYWxsYmFja3MucmVxdWVzdF9rZXlfdW5pdCAoc2VzcywgbWVkaWFfc3NyYywgZmlyLAorICAgICAgc2Vzcy0+cmVxdWVzdF9rZXlfdW5pdF91c2VyX2RhdGEpOworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3J0cF9zZXNzaW9uX3Byb2Nlc3NfcGxpIChSVFBTZXNzaW9uICogc2VzcywgZ3VpbnQzMiBzZW5kZXJfc3NyYywKKyAgICBndWludDMyIG1lZGlhX3NzcmMsIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUpCit7CisgIFJUUFNvdXJjZSAqc3JjOworCisgIGlmICghc2Vzcy0+Y2FsbGJhY2tzLnJlcXVlc3Rfa2V5X3VuaXQpCisgICAgcmV0dXJuOworCisgIHNyYyA9IGZpbmRfc291cmNlIChzZXNzLCBzZW5kZXJfc3NyYyk7CisgIGlmIChzcmMgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgcnRwX3Nlc3Npb25fcmVxdWVzdF9sb2NhbF9rZXlfdW5pdCAoc2Vzcywgc3JjLCBtZWRpYV9zc3JjLCBGQUxTRSwKKyAgICAgIGN1cnJlbnRfdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkCitydHBfc2Vzc2lvbl9wcm9jZXNzX2ZpciAoUlRQU2Vzc2lvbiAqIHNlc3MsIGd1aW50MzIgc2VuZGVyX3NzcmMsCisgICAgZ3VpbnQzMiBtZWRpYV9zc3JjLCBndWludDggKiBmY2lfZGF0YSwgZ3VpbnQgZmNpX2xlbmd0aCwKKyAgICBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lKQoreworICBSVFBTb3VyY2UgKnNyYzsKKyAgZ3VpbnQzMiBzc3JjOworICBndWludCBwb3NpdGlvbiA9IDA7CisgIGdib29sZWFuIG91cl9yZXF1ZXN0ID0gRkFMU0U7CisKKyAgaWYgKCFzZXNzLT5jYWxsYmFja3MucmVxdWVzdF9rZXlfdW5pdCkKKyAgICByZXR1cm47CisKKyAgaWYgKGZjaV9sZW5ndGggPCA4KQorICAgIHJldHVybjsKKworICBzcmMgPSBmaW5kX3NvdXJjZSAoc2Vzcywgc2VuZGVyX3NzcmMpOworCisgIC8qIEhhY2sgYmVjYXVzZSBHb29nbGUgZmFpbHMgdG8gc2V0IHRoZSBzZW5kZXJfc3NyYyBjb3JyZWN0bHkgKi8KKyAgaWYgKCFzcmMgJiYgc2VuZGVyX3NzcmMgPT0gMSkgeworICAgIEdIYXNoVGFibGVJdGVyIGl0ZXI7CisKKyAgICAvKiB3ZSBjYW4ndCBmaW5kIHRoZSBzb3VyY2UgaWYgdGhlcmUgYXJlIG11bHRpcGxlICovCisgICAgaWYgKHNlc3MtPnN0YXRzLnNlbmRlcl9zb3VyY2VzID4gc2Vzcy0+c3RhdHMuaW50ZXJuYWxfc2VuZGVyX3NvdXJjZXMgKyAxKQorICAgICAgcmV0dXJuOworCisgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJml0ZXIsIHNlc3MtPnNzcmNzW3Nlc3MtPm1hc2tfaWR4XSk7CisgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZpdGVyLCBOVUxMLCAoZ3BvaW50ZXIgKikgJiBzcmMpKSB7CisgICAgICBpZiAoIXNyYy0+aW50ZXJuYWwgJiYgcnRwX3NvdXJjZV9pc19zZW5kZXIgKHNyYykpCisgICAgICAgIGJyZWFrOworICAgICAgc3JjID0gTlVMTDsKKyAgICB9CisgIH0KKyAgaWYgKCFzcmMpCisgICAgcmV0dXJuOworCisgIGZvciAocG9zaXRpb24gPSAwOyBwb3NpdGlvbiA8IGZjaV9sZW5ndGg7IHBvc2l0aW9uICs9IDgpIHsKKyAgICBndWludDggKmRhdGEgPSBmY2lfZGF0YSArIHBvc2l0aW9uOworICAgIFJUUFNvdXJjZSAqb3duOworCisgICAgc3NyYyA9IEdTVF9SRUFEX1VJTlQzMl9CRSAoZGF0YSk7CisKKyAgICBvd24gPSBmaW5kX3NvdXJjZSAoc2Vzcywgc3NyYyk7CisgICAgaWYgKG93biA9PSBOVUxMKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAob3duLT5pbnRlcm5hbCkgeworICAgICAgb3VyX3JlcXVlc3QgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmICghb3VyX3JlcXVlc3QpCisgICAgcmV0dXJuOworCisgIHJ0cF9zZXNzaW9uX3JlcXVlc3RfbG9jYWxfa2V5X3VuaXQgKHNlc3MsIHNyYywgbWVkaWFfc3NyYywgVFJVRSwKKyAgICAgIGN1cnJlbnRfdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkCitydHBfc2Vzc2lvbl9wcm9jZXNzX25hY2sgKFJUUFNlc3Npb24gKiBzZXNzLCBndWludDMyIHNlbmRlcl9zc3JjLAorICAgIGd1aW50MzIgbWVkaWFfc3NyYywgZ3VpbnQ4ICogZmNpX2RhdGEsIGd1aW50IGZjaV9sZW5ndGgsCisgICAgR3N0Q2xvY2tUaW1lIGN1cnJlbnRfdGltZSkKK3sKKyAgc2Vzcy0+c3RhdHMubmFja3NfcmVjZWl2ZWQrKzsKKworICBpZiAoIXNlc3MtPmNhbGxiYWNrcy5ub3RpZnlfbmFjaykKKyAgICByZXR1cm47CisKKyAgd2hpbGUgKGZjaV9sZW5ndGggPiAwKSB7CisgICAgZ3VpbnQxNiBzZXFudW0sIGJscDsKKworICAgIHNlcW51bSA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoZmNpX2RhdGEpOworICAgIGJscCA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoZmNpX2RhdGEgKyAyKTsKKworICAgIEdTVF9ERUJVRyAoIk5BQ0sgIyV1LCBibHAgJTA0eCwgU1NSQyAweCUwOHgiLCBzZXFudW0sIGJscCwgbWVkaWFfc3NyYyk7CisKKyAgICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICAgIHNlc3MtPmNhbGxiYWNrcy5ub3RpZnlfbmFjayAoc2Vzcywgc2VxbnVtLCBibHAsIG1lZGlhX3NzcmMsCisgICAgICAgIHNlc3MtPm5vdGlmeV9uYWNrX3VzZXJfZGF0YSk7CisgICAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisKKyAgICBmY2lfZGF0YSArPSA0OworICAgIGZjaV9sZW5ndGggLT0gNDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorcnRwX3Nlc3Npb25fcHJvY2Vzc19mZWVkYmFjayAoUlRQU2Vzc2lvbiAqIHNlc3MsIEdzdFJUQ1BQYWNrZXQgKiBwYWNrZXQsCisgICAgUlRQUGFja2V0SW5mbyAqIHBpbmZvLCBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lKQoreworICBHc3RSVENQVHlwZSB0eXBlOworICBHc3RSVENQRkJUeXBlIGZidHlwZTsKKyAgZ3VpbnQzMiBzZW5kZXJfc3NyYywgbWVkaWFfc3NyYzsKKyAgZ3VpbnQ4ICpmY2lfZGF0YTsKKyAgZ3VpbnQgZmNpX2xlbmd0aDsKKyAgUlRQU291cmNlICpzcmM7CisKKyAgLyogVGhlIGZlZWRiYWNrIHBhY2tldCBtdXN0IGluY2x1ZGUgYm90aCBzZW5kZXIgU1NSQyBhbmQgbWVkaWEgU1NSQyAqLworICBpZiAocGFja2V0LT5sZW5ndGggPCAyKQorICAgIHJldHVybjsKKworICB0eXBlID0gZ3N0X3J0Y3BfcGFja2V0X2dldF90eXBlIChwYWNrZXQpOworICBmYnR5cGUgPSBnc3RfcnRjcF9wYWNrZXRfZmJfZ2V0X3R5cGUgKHBhY2tldCk7CisgIHNlbmRlcl9zc3JjID0gZ3N0X3J0Y3BfcGFja2V0X2ZiX2dldF9zZW5kZXJfc3NyYyAocGFja2V0KTsKKyAgbWVkaWFfc3NyYyA9IGdzdF9ydGNwX3BhY2tldF9mYl9nZXRfbWVkaWFfc3NyYyAocGFja2V0KTsKKworICBzcmMgPSBmaW5kX3NvdXJjZSAoc2VzcywgbWVkaWFfc3NyYyk7CisKKyAgLyogc2tpcCBub24tYnllIHBhY2tldHMgZm9yIHNvdXJjZXMgdGhhdCBhcmUgbWFya2VkIEJZRSAqLworICBpZiAoc2Vzcy0+c2NoZWR1bGVkX2J5ZSAmJiBzcmMgJiYgUlRQX1NPVVJDRV9JU19NQVJLRURfQllFIChzcmMpKQorICAgIHJldHVybjsKKworICBmY2lfZGF0YSA9IGdzdF9ydGNwX3BhY2tldF9mYl9nZXRfZmNpIChwYWNrZXQpOworICBmY2lfbGVuZ3RoID0gZ3N0X3J0Y3BfcGFja2V0X2ZiX2dldF9mY2lfbGVuZ3RoIChwYWNrZXQpICogc2l6ZW9mIChndWludDMyKTsKKworICBHU1RfREVCVUcgKCJyZWNlaXZlZCBmZWVkYmFjayAlZDolZCBmcm9tICUwOFggYWJvdXQgJTA4WCB3aXRoIEZDSSBvZiAiCisgICAgICAibGVuZ3RoICVkIiwgdHlwZSwgZmJ0eXBlLCBzZW5kZXJfc3NyYywgbWVkaWFfc3NyYywgZmNpX2xlbmd0aCk7CisKKyAgaWYgKGdfc2lnbmFsX2hhc19oYW5kbGVyX3BlbmRpbmcgKHNlc3MsCisgICAgICAgICAgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fRkVFREJBQ0tfUlRDUF0sIDAsIFRSVUUpKSB7CisgICAgR3N0QnVmZmVyICpmY2lfYnVmZmVyID0gTlVMTDsKKworICAgIGlmIChmY2lfbGVuZ3RoID4gMCkgeworICAgICAgZmNpX2J1ZmZlciA9IGdzdF9idWZmZXJfY29weV9yZWdpb24gKHBhY2tldC0+cnRjcC0+YnVmZmVyLAorICAgICAgICAgIEdTVF9CVUZGRVJfQ09QWV9NRU1PUlksIGZjaV9kYXRhIC0gcGFja2V0LT5ydGNwLT5tYXAuZGF0YSwKKyAgICAgICAgICBmY2lfbGVuZ3RoKTsKKyAgICAgIEdTVF9CVUZGRVJfUFRTIChmY2lfYnVmZmVyKSA9IHBpbmZvLT5ydW5uaW5nX3RpbWU7CisgICAgfQorCisgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgICBnX3NpZ25hbF9lbWl0IChzZXNzLCBydHBfc2Vzc2lvbl9zaWduYWxzW1NJR05BTF9PTl9GRUVEQkFDS19SVENQXSwgMCwKKyAgICAgICAgdHlwZSwgZmJ0eXBlLCBzZW5kZXJfc3NyYywgbWVkaWFfc3NyYywgZmNpX2J1ZmZlcik7CisgICAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisKKyAgICBpZiAoZmNpX2J1ZmZlcikKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGZjaV9idWZmZXIpOworICB9CisKKyAgaWYgKHNyYyAmJiBzZXNzLT5ydGNwX2ZlZWRiYWNrX3JldGVudGlvbl93aW5kb3cpIHsKKyAgICBydHBfc291cmNlX3JldGFpbl9ydGNwX3BhY2tldCAoc3JjLCBwYWNrZXQsIHBpbmZvLT5ydW5uaW5nX3RpbWUpOworICB9CisKKyAgaWYgKChzcmMgJiYgc3JjLT5pbnRlcm5hbCkgfHwKKyAgICAgIC8qIFBTRkIgRklSIHB1dHMgdGhlIG1lZGlhIHNzcmMgaW5zaWRlIHRoZSBGQ0kgKi8KKyAgICAgICh0eXBlID09IEdTVF9SVENQX1RZUEVfUFNGQiAmJiBmYnR5cGUgPT0gR1NUX1JUQ1BfUFNGQl9UWVBFX0ZJUikpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgR1NUX1JUQ1BfVFlQRV9QU0ZCOgorICAgICAgICBzd2l0Y2ggKGZidHlwZSkgeworICAgICAgICAgIGNhc2UgR1NUX1JUQ1BfUFNGQl9UWVBFX1BMSToKKyAgICAgICAgICAgIGlmIChzcmMpCisgICAgICAgICAgICAgIHNyYy0+c3RhdHMucmVjdl9wbGlfY291bnQrKzsKKyAgICAgICAgICAgIHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcGxpIChzZXNzLCBzZW5kZXJfc3NyYywgbWVkaWFfc3NyYywKKyAgICAgICAgICAgICAgICBjdXJyZW50X3RpbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHU1RfUlRDUF9QU0ZCX1RZUEVfRklSOgorICAgICAgICAgICAgaWYgKHNyYykKKyAgICAgICAgICAgICAgc3JjLT5zdGF0cy5yZWN2X2Zpcl9jb3VudCsrOworICAgICAgICAgICAgcnRwX3Nlc3Npb25fcHJvY2Vzc19maXIgKHNlc3MsIHNlbmRlcl9zc3JjLCBtZWRpYV9zc3JjLCBmY2lfZGF0YSwKKyAgICAgICAgICAgICAgICBmY2lfbGVuZ3RoLCBjdXJyZW50X3RpbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX1JUUEZCOgorICAgICAgICBzd2l0Y2ggKGZidHlwZSkgeworICAgICAgICAgIGNhc2UgR1NUX1JUQ1BfUlRQRkJfVFlQRV9OQUNLOgorICAgICAgICAgICAgaWYgKHNyYykKKyAgICAgICAgICAgICAgc3JjLT5zdGF0cy5yZWN2X25hY2tfY291bnQrKzsKKyAgICAgICAgICAgIHJ0cF9zZXNzaW9uX3Byb2Nlc3NfbmFjayAoc2Vzcywgc2VuZGVyX3NzcmMsIG1lZGlhX3NzcmMsCisgICAgICAgICAgICAgICAgZmNpX2RhdGEsIGZjaV9sZW5ndGgsIGN1cnJlbnRfdGltZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnRjcDoKKyAqIEBzZXNzOiBhbmQgI1JUUFNlc3Npb24KKyAqIEBidWZmZXI6IGFuIFJUQ1AgYnVmZmVyCisgKiBAY3VycmVudF90aW1lOiB0aGUgY3VycmVudCBzeXN0ZW0gdGltZQorICogQG50cG5zdGltZTogdGhlIGN1cnJlbnQgTlRQIHRpbWUgaW4gbmFub3NlY29uZHMKKyAqCisgKiBQcm9jZXNzIGFuIFJUQ1AgYnVmZmVyIGluIHRoZSBzZXNzaW9uIG1hbmFnZXIuIFRoaXMgZnVuY3Rpb24gdGFrZXMgb3duZXJzaGlwCisgKiBvZiBAYnVmZmVyLgorICoKKyAqIFJldHVybnM6IGEgI0dzdEZsb3dSZXR1cm4uCisgKi8KK0dzdEZsb3dSZXR1cm4KK3J0cF9zZXNzaW9uX3Byb2Nlc3NfcnRjcCAoUlRQU2Vzc2lvbiAqIHNlc3MsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwKKyAgICBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lLCBndWludDY0IG50cG5zdGltZSkKK3sKKyAgR3N0UlRDUFBhY2tldCBwYWNrZXQ7CisgIGdib29sZWFuIG1vcmUsIGlzX2J5ZSA9IEZBTFNFLCBkb19zeW5jID0gRkFMU0U7CisgIFJUUFBhY2tldEluZm8gcGluZm8gPSB7IDAsIH07CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdFJUQ1BCdWZmZXIgcnRjcCA9IHsgTlVMTCwgfTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpLCBHU1RfRkxPV19FUlJPUik7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfQlVGRkVSIChidWZmZXIpLCBHU1RfRkxPV19FUlJPUik7CisKKyAgaWYgKCFnc3RfcnRjcF9idWZmZXJfdmFsaWRhdGVfcmVkdWNlZCAoYnVmZmVyKSkKKyAgICBnb3RvIGludmFsaWRfcGFja2V0OworCisgIEdTVF9ERUJVRyAoInJlY2VpdmVkIFJUQ1AgcGFja2V0Iik7CisKKyAgZ19zaWduYWxfZW1pdCAoc2VzcywgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fUkVDRUlWSU5HX1JUQ1BdLCAwLAorICAgICAgYnVmZmVyKTsKKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgLyogdXBkYXRlIHBpbmZvIHN0YXRzICovCisgIHVwZGF0ZV9wYWNrZXRfaW5mbyAoc2VzcywgJnBpbmZvLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBidWZmZXIsIGN1cnJlbnRfdGltZSwKKyAgICAgIC0xLCBudHBuc3RpbWUpOworCisgIC8qIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIGNvbXBvdW5kIHBhY2tldCAqLworICBnc3RfcnRjcF9idWZmZXJfbWFwIChidWZmZXIsIEdTVF9NQVBfUkVBRCwgJnJ0Y3ApOworICBtb3JlID0gZ3N0X3J0Y3BfYnVmZmVyX2dldF9maXJzdF9wYWNrZXQgKCZydGNwLCAmcGFja2V0KTsKKyAgd2hpbGUgKG1vcmUpIHsKKyAgICBHc3RSVENQVHlwZSB0eXBlOworCisgICAgdHlwZSA9IGdzdF9ydGNwX3BhY2tldF9nZXRfdHlwZSAoJnBhY2tldCk7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgR1NUX1JUQ1BfVFlQRV9TUjoKKyAgICAgICAgcnRwX3Nlc3Npb25fcHJvY2Vzc19zciAoc2VzcywgJnBhY2tldCwgJnBpbmZvLCAmZG9fc3luYyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX1JSOgorICAgICAgICBydHBfc2Vzc2lvbl9wcm9jZXNzX3JyIChzZXNzLCAmcGFja2V0LCAmcGluZm8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1JUQ1BfVFlQRV9TREVTOgorICAgICAgICBydHBfc2Vzc2lvbl9wcm9jZXNzX3NkZXMgKHNlc3MsICZwYWNrZXQsICZwaW5mbyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX0JZRToKKyAgICAgICAgaXNfYnllID0gVFJVRTsKKyAgICAgICAgLyogZG9uJ3QgdHJ5IHRvIGF0dGVtcHQgbGlwLXN5bmMgYW55bW9yZSBmb3Igc3RyZWFtcyB3aXRoIGEgQllFICovCisgICAgICAgIGRvX3N5bmMgPSBGQUxTRTsKKyAgICAgICAgcnRwX3Nlc3Npb25fcHJvY2Vzc19ieWUgKHNlc3MsICZwYWNrZXQsICZwaW5mbyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX0FQUDoKKyAgICAgICAgcnRwX3Nlc3Npb25fcHJvY2Vzc19hcHAgKHNlc3MsICZwYWNrZXQsICZwaW5mbyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX1JUUEZCOgorICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX1BTRkI6CisgICAgICAgIHJ0cF9zZXNzaW9uX3Byb2Nlc3NfZmVlZGJhY2sgKHNlc3MsICZwYWNrZXQsICZwaW5mbywgY3VycmVudF90aW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9SVENQX1RZUEVfWFI6CisgICAgICAgIC8qIEZJWE1FOiBUaGlzIGJsb2NrIGlzIGFkZGVkIHRvIGRvd25ncmFkZSB3YXJuaW5nIGxldmVsLgorICAgICAgICAgKiBPbmNlIHRoZSBwYXJzZXIgaXMgaW1wbGVtZW50ZWQsIGl0IHNob3VsZCBiZSByZXBsYWNlZCB3aXRoCisgICAgICAgICAqIGEgcHJvcGVyIHByb2Nlc3MgZnVuY3Rpb24uICovCisgICAgICAgIEdTVF9ERUJVRyAoImdvdCBSVENQIFhSIHBhY2tldCwgYnV0IGlnbm9yZWQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfV0FSTklORyAoImdvdCB1bmtub3duIFJUQ1AgcGFja2V0IHR5cGU6ICVkIiwgdHlwZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtb3JlID0gZ3N0X3J0Y3BfcGFja2V0X21vdmVfdG9fbmV4dCAoJnBhY2tldCk7CisgIH0KKworICBnc3RfcnRjcF9idWZmZXJfdW5tYXAgKCZydGNwKTsKKworICAvKiBpZiB3ZSBhcmUgc2NoZWR1bGluZyBhIEJZRSwgd2Ugb25seSB3YW50IHRvIGNvdW50IGJ5ZSBwYWNrZXRzLCBlbHNlIHdlCisgICAqIGNvdW50IGV2ZXJ5dGhpbmcgKi8KKyAgaWYgKHNlc3MtPnNjaGVkdWxlZF9ieWUgJiYgaXNfYnllKSB7CisgICAgc2Vzcy0+YnllX3N0YXRzLmJ5ZV9tZW1iZXJzKys7CisgICAgVVBEQVRFX0FWRyAoc2Vzcy0+YnllX3N0YXRzLmF2Z19ydGNwX3BhY2tldF9zaXplLCBwaW5mby5ieXRlcyk7CisgIH0KKworICAvKiBrZWVwIHRyYWNrIG9mIGF2ZXJhZ2UgcGFja2V0IHNpemUgKi8KKyAgVVBEQVRFX0FWRyAoc2Vzcy0+c3RhdHMuYXZnX3J0Y3BfcGFja2V0X3NpemUsIHBpbmZvLmJ5dGVzKTsKKworICBHU1RfREVCVUcgKCIlcCwgcmVjZWl2ZWQgUlRDUCBwYWNrZXQsIGF2ZyBzaXplICV1LCAldSIsICZzZXNzLT5zdGF0cywKKyAgICAgIHNlc3MtPnN0YXRzLmF2Z19ydGNwX3BhY2tldF9zaXplLCBwaW5mby5ieXRlcyk7CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisKKyAgcGluZm8uZGF0YSA9IE5VTEw7CisgIGNsZWFuX3BhY2tldF9pbmZvICgmcGluZm8pOworCisgIC8qIG5vdGlmeSBjYWxsZXIgb2Ygc3IgcGFja2V0cyBpbiB0aGUgY2FsbGJhY2sgKi8KKyAgaWYgKGRvX3N5bmMgJiYgc2Vzcy0+Y2FsbGJhY2tzLnN5bmNfcnRjcCkgeworICAgIHJlc3VsdCA9IHNlc3MtPmNhbGxiYWNrcy5zeW5jX3J0Y3AgKHNlc3MsIGJ1ZmZlciwKKyAgICAgICAgc2Vzcy0+c3luY19ydGNwX3VzZXJfZGF0YSk7CisgIH0gZWxzZQorICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgcmV0dXJuIHJlc3VsdDsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfcGFja2V0OgorICB7CisgICAgR1NUX0RFQlVHICgiaW52YWxpZCBSVENQIHBhY2tldCByZWNlaXZlZCIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fdXBkYXRlX3NlbmRfY2FwczoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQGNhcHM6IGEgI0dzdENhcHMKKyAqCisgKiBVcGRhdGUgdGhlIGNhcHMgb2YgdGhlIHNlbmRlciBpbiB0aGUgcnRwIHNlc3Npb24uCisgKi8KK3ZvaWQKK3J0cF9zZXNzaW9uX3VwZGF0ZV9zZW5kX2NhcHMgKFJUUFNlc3Npb24gKiBzZXNzLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzOworICBndWludCBzc3JjOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKFJUUF9JU19TRVNTSU9OIChzZXNzKSk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19DQVBTIChjYXBzKSk7CisKKyAgR1NUX0xPRyAoInJlY2VpdmVkIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAocywgInNzcmMiLCAmc3NyYykpIHsKKyAgICBSVFBTb3VyY2UgKnNvdXJjZTsKKyAgICBnYm9vbGVhbiBjcmVhdGVkOworCisgICAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgICAgc291cmNlID0gb2J0YWluX2ludGVybmFsX3NvdXJjZSAoc2Vzcywgc3NyYywgJmNyZWF0ZWQsIEdTVF9DTE9DS19USU1FX05PTkUpOworICAgIHNlc3MtPnN1Z2dlc3RlZF9zc3JjID0gc3NyYzsKKyAgICBzZXNzLT5pbnRlcm5hbF9zc3JjX3NldCA9IFRSVUU7CisgICAgc2Vzcy0+aW50ZXJuYWxfc3NyY19mcm9tX2NhcHNfb3JfcHJvcGVydHkgPSBUUlVFOworICAgIGlmIChzb3VyY2UpIHsKKyAgICAgIHJ0cF9zb3VyY2VfdXBkYXRlX2NhcHMgKHNvdXJjZSwgY2Fwcyk7CisKKyAgICAgIGlmIChjcmVhdGVkKQorICAgICAgICBvbl9uZXdfc2VuZGVyX3NzcmMgKHNlc3MsIHNvdXJjZSk7CisKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzb3VyY2UpOworICAgIH0KKworICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF91aW50IChzLCAicnR4LXNzcmMiLCAmc3NyYykpIHsKKyAgICAgIHNvdXJjZSA9CisgICAgICAgICAgb2J0YWluX2ludGVybmFsX3NvdXJjZSAoc2Vzcywgc3NyYywgJmNyZWF0ZWQsIEdTVF9DTE9DS19USU1FX05PTkUpOworICAgICAgaWYgKHNvdXJjZSkgeworICAgICAgICBydHBfc291cmNlX3VwZGF0ZV9jYXBzIChzb3VyY2UsIGNhcHMpOworICAgICAgICBnX29iamVjdF91bnJlZiAoc291cmNlKTsKKyAgICAgIH0KKyAgICB9CisgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgfSBlbHNlIHsKKyAgICBzZXNzLT5pbnRlcm5hbF9zc3JjX2Zyb21fY2Fwc19vcl9wcm9wZXJ0eSA9IEZBTFNFOworICB9Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fc2VuZF9ydHA6CisgKiBAc2VzczogYW4gI1JUUFNlc3Npb24KKyAqIEBkYXRhOiBwb2ludGVyIHRvIGVpdGhlciBhbiBSVFAgYnVmZmVyIG9yIGEgbGlzdCBvZiBSVFAgYnVmZmVycworICogQGlzX2xpc3Q6IFRSVUUgd2hlbiBAZGF0YSBpcyBhIGJ1ZmZlciBsaXN0CisgKiBAY3VycmVudF90aW1lOiB0aGUgY3VycmVudCBzeXN0ZW0gdGltZQorICogQHJ1bm5pbmdfdGltZTogdGhlIHJ1bm5pbmcgdGltZSBvZiBAZGF0YQorICoKKyAqIFNlbmQgdGhlIFJUUCBidWZmZXIgaW4gdGhlIHNlc3Npb24gbWFuYWdlci4gVGhpcyBmdW5jdGlvbiB0YWtlcyBvd25lcnNoaXAgb2YKKyAqIEBidWZmZXIuCisgKgorICogUmV0dXJuczogYSAjR3N0Rmxvd1JldHVybi4KKyAqLworR3N0Rmxvd1JldHVybgorcnRwX3Nlc3Npb25fc2VuZF9ydHAgKFJUUFNlc3Npb24gKiBzZXNzLCBncG9pbnRlciBkYXRhLCBnYm9vbGVhbiBpc19saXN0LAorICAgIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUsIEdzdENsb2NrVGltZSBydW5uaW5nX3RpbWUpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0OworICBSVFBTb3VyY2UgKnNvdXJjZTsKKyAgZ2Jvb2xlYW4gcHJldnNlbmRlcjsKKyAgZ3VpbnQ2NCBvbGRyYXRlOworICBSVFBQYWNrZXRJbmZvIHBpbmZvID0geyAwLCB9OworICBnYm9vbGVhbiBjcmVhdGVkOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU0VTU0lPTiAoc2VzcyksIEdTVF9GTE9XX0VSUk9SKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGlzX2xpc3QgfHwgR1NUX0lTX0JVRkZFUiAoZGF0YSksIEdTVF9GTE9XX0VSUk9SKTsKKworICBHU1RfTE9HICgicmVjZWl2ZWQgUlRQICVzIGZvciBzZW5kaW5nIiwgaXNfbGlzdCA/ICJsaXN0IiA6ICJwYWNrZXQiKTsKKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgaWYgKCF1cGRhdGVfcGFja2V0X2luZm8gKHNlc3MsICZwaW5mbywgVFJVRSwgVFJVRSwgaXNfbGlzdCwgZGF0YSwKKyAgICAgICAgICBjdXJyZW50X3RpbWUsIHJ1bm5pbmdfdGltZSwgLTEpKQorICAgIGdvdG8gaW52YWxpZF9wYWNrZXQ7CisKKyAgc291cmNlID0gb2J0YWluX2ludGVybmFsX3NvdXJjZSAoc2VzcywgcGluZm8uc3NyYywgJmNyZWF0ZWQsIGN1cnJlbnRfdGltZSk7CisgIGlmIChjcmVhdGVkKQorICAgIG9uX25ld19zZW5kZXJfc3NyYyAoc2Vzcywgc291cmNlKTsKKworICBwcmV2c2VuZGVyID0gUlRQX1NPVVJDRV9JU19TRU5ERVIgKHNvdXJjZSk7CisgIG9sZHJhdGUgPSBzb3VyY2UtPmJpdHJhdGU7CisKKyAgLyogd2UgdXNlIG91ciBvd24gc291cmNlIHRvIHNlbmQgKi8KKyAgcmVzdWx0ID0gcnRwX3NvdXJjZV9zZW5kX3J0cCAoc291cmNlLCAmcGluZm8pOworCisgIHNvdXJjZV91cGRhdGVfc2VuZGVyIChzZXNzLCBzb3VyY2UsIHByZXZzZW5kZXIpOworCisgIGlmIChvbGRyYXRlICE9IHNvdXJjZS0+Yml0cmF0ZSkKKyAgICBzZXNzLT5yZWNhbGNfYmFuZHdpZHRoID0gVFJVRTsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKworICBnX29iamVjdF91bnJlZiAoc291cmNlKTsKKyAgY2xlYW5fcGFja2V0X2luZm8gKCZwaW5mbyk7CisKKyAgcmV0dXJuIHJlc3VsdDsKKworaW52YWxpZF9wYWNrZXQ6CisgIHsKKyAgICBnc3RfbWluaV9vYmplY3RfdW5yZWYgKEdTVF9NSU5JX09CSkVDVF9DQVNUIChkYXRhKSk7CisgICAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgICBHU1RfREVCVUcgKCJpbnZhbGlkIFJUUCBwYWNrZXQgcmVjZWl2ZWQiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2FkZF9iaXRyYXRlcyAoZ3BvaW50ZXIga2V5LCBSVFBTb3VyY2UgKiBzb3VyY2UsIGdkb3VibGUgKiBiYW5kd2lkdGgpCit7CisgICpiYW5kd2lkdGggKz0gc291cmNlLT5iaXRyYXRlOworfQorCisvKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHNlc3Npb24gbG9jayAqLworc3RhdGljIEdzdENsb2NrVGltZQorY2FsY3VsYXRlX3J0Y3BfaW50ZXJ2YWwgKFJUUFNlc3Npb24gKiBzZXNzLCBnYm9vbGVhbiBkZXRlcm1pbmlzdGljLAorICAgIGdib29sZWFuIGZpcnN0KQoreworICBHc3RDbG9ja1RpbWUgcmVzdWx0OworICBSVFBTZXNzaW9uU3RhdHMgKnN0YXRzOworCisgIC8qIHJlY2FsY3VsYXRlIGJhbmR3aWR0aCB3aGVuIGl0IGNoYW5nZWQgKi8KKyAgaWYgKHNlc3MtPnJlY2FsY19iYW5kd2lkdGgpIHsKKyAgICBnZG91YmxlIGJhbmR3aWR0aDsKKworICAgIGlmIChzZXNzLT5iYW5kd2lkdGggPiAwKQorICAgICAgYmFuZHdpZHRoID0gc2Vzcy0+YmFuZHdpZHRoOworICAgIGVsc2UgeworICAgICAgLyogSWYgaXQgaXMgPD0gMCwgdGhlbiB0cnkgdG8gZXN0aW1hdGUgdGhlIGFjdHVhbCBiYW5kd2lkdGggKi8KKyAgICAgIGJhbmR3aWR0aCA9IDA7CisKKyAgICAgIGdfaGFzaF90YWJsZV9mb3JlYWNoIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0sCisgICAgICAgICAgKEdIRnVuYykgYWRkX2JpdHJhdGVzLCAmYmFuZHdpZHRoKTsKKyAgICB9CisgICAgaWYgKGJhbmR3aWR0aCA8IFJUUF9TVEFUU19CQU5EV0lEVEgpCisgICAgICBiYW5kd2lkdGggPSBSVFBfU1RBVFNfQkFORFdJRFRIOworCisgICAgcnRwX3N0YXRzX3NldF9iYW5kd2lkdGhzICgmc2Vzcy0+c3RhdHMsIGJhbmR3aWR0aCwKKyAgICAgICAgc2Vzcy0+cnRjcF9iYW5kd2lkdGgsIHNlc3MtPnJ0Y3BfcnNfYmFuZHdpZHRoLCBzZXNzLT5ydGNwX3JyX2JhbmR3aWR0aCk7CisKKyAgICBzZXNzLT5yZWNhbGNfYmFuZHdpZHRoID0gRkFMU0U7CisgIH0KKworICBpZiAoc2Vzcy0+c2NoZWR1bGVkX2J5ZSkgeworICAgIHN0YXRzID0gJnNlc3MtPmJ5ZV9zdGF0czsKKyAgICByZXN1bHQgPSBydHBfc3RhdHNfY2FsY3VsYXRlX2J5ZV9pbnRlcnZhbCAoc3RhdHMpOworICB9IGVsc2UgeworICAgIHNlc3Npb25fdXBkYXRlX3B0cCAoc2Vzcyk7CisKKyAgICBzdGF0cyA9ICZzZXNzLT5zdGF0czsKKyAgICByZXN1bHQgPSBydHBfc3RhdHNfY2FsY3VsYXRlX3J0Y3BfaW50ZXJ2YWwgKHN0YXRzLAorICAgICAgICBzdGF0cy0+aW50ZXJuYWxfc2VuZGVyX3NvdXJjZXMgPiAwLCBzZXNzLT5ydHBfcHJvZmlsZSwKKyAgICAgICAgc2Vzcy0+aXNfZG9pbmdfcHRwLCBmaXJzdCk7CisgIH0KKworICBHU1RfREVCVUcgKCJuZXh0IGRldGVybWluaXN0aWMgaW50ZXJ2YWw6ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBmaXJzdCAlZCIsCisgICAgICBHU1RfVElNRV9BUkdTIChyZXN1bHQpLCBmaXJzdCk7CisKKyAgaWYgKCFkZXRlcm1pbmlzdGljICYmIHJlc3VsdCAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKQorICAgIHJlc3VsdCA9IHJ0cF9zdGF0c19hZGRfcnRjcF9qaXR0ZXIgKHN0YXRzLCByZXN1bHQpOworCisgIEdTVF9ERUJVRyAoIm5leHQgaW50ZXJ2YWw6ICUiIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAocmVzdWx0KSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK3NvdXJjZV9tYXJrX2J5ZSAoY29uc3QgZ2NoYXIgKiBrZXksIFJUUFNvdXJjZSAqIHNvdXJjZSwgY29uc3QgZ2NoYXIgKiByZWFzb24pCit7CisgIGlmIChzb3VyY2UtPmludGVybmFsKQorICAgIHJ0cF9zb3VyY2VfbWFya19ieWUgKHNvdXJjZSwgcmVhc29uKTsKK30KKworLyoqCisgKiBydHBfc2Vzc2lvbl9tYXJrX2FsbF9ieWU6CisgKiBAc2VzczogYW4gI1JUUFNlc3Npb24KKyAqIEByZWFzb246IGEgcmVhc29uCisgKgorICogTWFyayBhbGwgaW50ZXJuYWwgc291cmNlcyBvZiB0aGUgc2Vzc2lvbiBhcyBCWUUgd2l0aCBAcmVhc29uLgorICovCit2b2lkCitydHBfc2Vzc2lvbl9tYXJrX2FsbF9ieWUgKFJUUFNlc3Npb24gKiBzZXNzLCBjb25zdCBnY2hhciAqIHJlYXNvbikKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpKTsKKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKHNlc3MtPnNzcmNzW3Nlc3MtPm1hc2tfaWR4XSwKKyAgICAgIChHSEZ1bmMpIHNvdXJjZV9tYXJrX2J5ZSwgKGdwb2ludGVyKSByZWFzb24pOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworfQorCisvKiBTdG9wIHRoZSBjdXJyZW50IEBzZXNzIGFuZCBzY2hlZHVsZSBhIEJZRSBtZXNzYWdlIGZvciB0aGUgb3RoZXIgbWVtYmVycy4KKyAqIE9uZSBtdXN0IGhhdmUgdGhlIHNlc3Npb24gbG9jayB0byBjYWxsIHRoaXMgZnVuY3Rpb24KKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK3J0cF9zZXNzaW9uX3NjaGVkdWxlX2J5ZV9sb2NrZWQgKFJUUFNlc3Npb24gKiBzZXNzLCBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lKQoreworICBHc3RGbG93UmV0dXJuIHJlc3VsdCA9IEdTVF9GTE9XX09LOworICBHc3RDbG9ja1RpbWUgaW50ZXJ2YWw7CisKKyAgLyogbm90aGluZyB0byBkbyBpdCB3ZSBhbHJlYWR5IHNjaGVkdWxlZCBieWUgKi8KKyAgaWYgKHNlc3MtPnNjaGVkdWxlZF9ieWUpCisgICAgZ290byBkb25lOworCisgIC8qIHdlIHNjaGVkdWxlIEJZRSBub3cgKi8KKyAgc2Vzcy0+c2NoZWR1bGVkX2J5ZSA9IFRSVUU7CisgIC8qIGF0IGxlYXN0IG9uZSBtZW1iZXIgd2FudHMgdG8gc2VuZCBhIEJZRSAqLworICBtZW1jcHkgKCZzZXNzLT5ieWVfc3RhdHMsICZzZXNzLT5zdGF0cywgc2l6ZW9mIChSVFBTZXNzaW9uU3RhdHMpKTsKKyAgSU5JVF9BVkcgKHNlc3MtPmJ5ZV9zdGF0cy5hdmdfcnRjcF9wYWNrZXRfc2l6ZSwgMTAwKTsKKyAgc2Vzcy0+YnllX3N0YXRzLmJ5ZV9tZW1iZXJzID0gMTsKKyAgc2Vzcy0+Zmlyc3RfcnRjcCA9IFRSVUU7CisKKyAgLyogcmVzY2hlZHVsZSB0cmFuc21pc3Npb24gKi8KKyAgc2Vzcy0+bGFzdF9ydGNwX3NlbmRfdGltZSA9IGN1cnJlbnRfdGltZTsKKyAgc2Vzcy0+bGFzdF9ydGNwX2NoZWNrX3RpbWUgPSBjdXJyZW50X3RpbWU7CisgIGludGVydmFsID0gY2FsY3VsYXRlX3J0Y3BfaW50ZXJ2YWwgKHNlc3MsIEZBTFNFLCBUUlVFKTsKKworICBpZiAoaW50ZXJ2YWwgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICBzZXNzLT5uZXh0X3J0Y3BfY2hlY2tfdGltZSA9IGN1cnJlbnRfdGltZSArIGludGVydmFsOworICBlbHNlCisgICAgc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBzZXNzLT5sYXN0X3J0Y3BfaW50ZXJ2YWwgPSBpbnRlcnZhbDsKKworICBHU1RfREVCVUcgKCJTY2hlZHVsZSBCWUUgZm9yICUiIEdTVF9USU1FX0ZPUk1BVCAiLCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChpbnRlcnZhbCksIEdTVF9USU1FX0FSR1MgKHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lKSk7CisKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKyAgLyogbm90aWZ5IGFwcCBvZiByZWNvbnNpZGVyYXRpb24gKi8KKyAgaWYgKHNlc3MtPmNhbGxiYWNrcy5yZWNvbnNpZGVyKQorICAgIHNlc3MtPmNhbGxiYWNrcy5yZWNvbnNpZGVyIChzZXNzLCBzZXNzLT5yZWNvbnNpZGVyX3VzZXJfZGF0YSk7CisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworZG9uZToKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX3NjaGVkdWxlX2J5ZToKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQGN1cnJlbnRfdGltZTogdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUKKyAqCisgKiBTY2hlZHVsZSBhIEJZRSBtZXNzYWdlIGZvciBhbGwgc291cmNlcyBtYXJrZWQgYXMgQllFIGluIEBzZXNzLgorICoKKyAqIFJldHVybnM6IGEgI0dzdEZsb3dSZXR1cm4uCisgKi8KK0dzdEZsb3dSZXR1cm4KK3J0cF9zZXNzaW9uX3NjaGVkdWxlX2J5ZSAoUlRQU2Vzc2lvbiAqIHNlc3MsIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU0VTU0lPTiAoc2VzcyksIEdTVF9GTE9XX0VSUk9SKTsKKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgcmVzdWx0ID0gcnRwX3Nlc3Npb25fc2NoZWR1bGVfYnllX2xvY2tlZCAoc2VzcywgY3VycmVudF90aW1lKTsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX25leHRfdGltZW91dDoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQGN1cnJlbnRfdGltZTogdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUKKyAqCisgKiBHZXQgdGhlIG5leHQgdGltZSB3ZSBzaG91bGQgcGVyZm9ybSBzZXNzaW9uIG1haW50ZW5hbmNlIHRhc2tzLgorICoKKyAqIFJldHVybnM6IGEgdGltZSB3aGVuIHJ0cF9zZXNzaW9uX29uX3RpbWVvdXQoKSBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlCisgKiBjdXJyZW50IHN5c3RlbSB0aW1lLgorICovCitHc3RDbG9ja1RpbWUKK3J0cF9zZXNzaW9uX25leHRfdGltZW91dCAoUlRQU2Vzc2lvbiAqIHNlc3MsIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUpCit7CisgIEdzdENsb2NrVGltZSByZXN1bHQsIGludGVydmFsID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoUlRQX0lTX1NFU1NJT04gKHNlc3MpLCBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHNlc3MtPm5leHRfZWFybHlfcnRjcF90aW1lKSkgeworICAgIEdTVF9ERUJVRyAoImhhdmUgZWFybHkgcnRjcCB0aW1lIik7CisgICAgcmVzdWx0ID0gc2Vzcy0+bmV4dF9lYXJseV9ydGNwX3RpbWU7CisgICAgZ290byBlYXJseV9leGl0OworICB9CisKKyAgcmVzdWx0ID0gc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWU7CisKKyAgR1NUX0RFQlVHICgiY3VycmVudCB0aW1lOiAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIsIG5leHQgdGltZTogJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoY3VycmVudF90aW1lKSwgR1NUX1RJTUVfQVJHUyAocmVzdWx0KSk7CisKKyAgaWYgKHJlc3VsdCA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FIHx8IHJlc3VsdCA8IGN1cnJlbnRfdGltZSkgeworICAgIEdTVF9ERUJVRyAoInRha2UgY3VycmVudCB0aW1lIGFzIGJhc2UiKTsKKyAgICAvKiBvdXIgcHJldmlvdXMgY2hlY2sgdGltZSBleHBpcmVkLCBzdGFydCBjb3VudGluZyBmcm9tIHRoZSBjdXJyZW50IHRpbWUKKyAgICAgKiBhZ2Fpbi4gKi8KKyAgICByZXN1bHQgPSBjdXJyZW50X3RpbWU7CisgIH0KKworICBpZiAoc2Vzcy0+c2NoZWR1bGVkX2J5ZSkgeworICAgIGlmIChzZXNzLT5ieWVfc3RhdHMuYWN0aXZlX3NvdXJjZXMgPj0gNTApIHsKKyAgICAgIEdTVF9ERUJVRyAoInJlY29uc2lkZXIgQllFLCBtb3JlIHRoYW4gNTAgc291cmNlcyIpOworICAgICAgLyogcmVjb25zaWRlciBCWUUgaWYgbWVtYmVycyA+PSA1MCAqLworICAgICAgaW50ZXJ2YWwgPSBjYWxjdWxhdGVfcnRjcF9pbnRlcnZhbCAoc2VzcywgRkFMU0UsIFRSVUUpOworICAgICAgc2Vzcy0+bGFzdF9ydGNwX2ludGVydmFsID0gaW50ZXJ2YWw7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChzZXNzLT5maXJzdF9ydGNwKSB7CisgICAgICBHU1RfREVCVUcgKCJmaXJzdCBSVENQIHBhY2tldCIpOworICAgICAgLyogd2UgYXJlIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgKi8KKyAgICAgIGludGVydmFsID0gY2FsY3VsYXRlX3J0Y3BfaW50ZXJ2YWwgKHNlc3MsIEZBTFNFLCBUUlVFKTsKKyAgICAgIHNlc3MtPmxhc3RfcnRjcF9pbnRlcnZhbCA9IGludGVydmFsOworICAgIH0gZWxzZSBpZiAoc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUgPCBjdXJyZW50X3RpbWUpIHsKKyAgICAgIEdTVF9ERUJVRyAoIm9sZCBjaGVjayB0aW1lIGV4cGlyZWQsIGdldHRpbmcgbmV3IHRpbWVvdXQiKTsKKyAgICAgIC8qIGdldCBhIG5ldyB0aW1lb3V0IHdoZW4gd2UgbmVlZCB0byAqLworICAgICAgaW50ZXJ2YWwgPSBjYWxjdWxhdGVfcnRjcF9pbnRlcnZhbCAoc2VzcywgRkFMU0UsIEZBTFNFKTsKKyAgICAgIHNlc3MtPmxhc3RfcnRjcF9pbnRlcnZhbCA9IGludGVydmFsOworCisgICAgICBpZiAoKHNlc3MtPnJ0cF9wcm9maWxlID09IEdTVF9SVFBfUFJPRklMRV9BVlBGCisgICAgICAgICAgICAgIHx8IHNlc3MtPnJ0cF9wcm9maWxlID09IEdTVF9SVFBfUFJPRklMRV9TQVZQRikKKyAgICAgICAgICAmJiBpbnRlcnZhbCAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgICAgIC8qIEFwcGx5IHRoZSBydWxlcyBmcm9tIFJGQyA0NTg1IHNlY3Rpb24gMy41LjMgKi8KKyAgICAgICAgaWYgKHNlc3MtPnN0YXRzLm1pbl9pbnRlcnZhbCAhPSAwKSB7CisgICAgICAgICAgR3N0Q2xvY2tUaW1lIFRfcnJfY3VycmVudF9pbnRlcnZhbCA9IGdfcmFuZG9tX2RvdWJsZV9yYW5nZSAoMC41LAorICAgICAgICAgICAgICAxLjUpICogc2Vzcy0+c3RhdHMubWluX2ludGVydmFsICogR1NUX1NFQ09ORDsKKworICAgICAgICAgIGlmIChUX3JyX2N1cnJlbnRfaW50ZXJ2YWwgPiBpbnRlcnZhbCkgeworICAgICAgICAgICAgR1NUX0RFQlVHICgiQWRqdXN0aW5nIGludGVydmFsIGZvciB0LXJyLWludGVydmFsOiAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAgICAgICAiID4gJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChUX3JyX2N1cnJlbnRfaW50ZXJ2YWwpLAorICAgICAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGludGVydmFsKSk7CisgICAgICAgICAgICBpbnRlcnZhbCA9IFRfcnJfY3VycmVudF9pbnRlcnZhbDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoaW50ZXJ2YWwgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICByZXN1bHQgKz0gaW50ZXJ2YWw7CisgIGVsc2UKKyAgICByZXN1bHQgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lID0gcmVzdWx0OworCitlYXJseV9leGl0OgorCisgIEdTVF9ERUJVRyAoImN1cnJlbnQgdGltZTogJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAiLCBuZXh0IHRpbWU6ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKGN1cnJlbnRfdGltZSksIEdTVF9USU1FX0FSR1MgKHJlc3VsdCkpOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIFJUUFNvdXJjZSAqc291cmNlOworICBnYm9vbGVhbiBpc19ieWU7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworfSBSZXBvcnRPdXRwdXQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdFJUQ1BCdWZmZXIgcnRjcGJ1ZjsKKyAgUlRQU2Vzc2lvbiAqc2VzczsKKyAgUlRQU291cmNlICpzb3VyY2U7CisgIGd1aW50IG51bV90b19yZXBvcnQ7CisgIGdib29sZWFuIGhhdmVfZmlyOworICBnYm9vbGVhbiBoYXZlX3BsaTsKKyAgZ2Jvb2xlYW4gaGF2ZV9uYWNrOworICBHc3RCdWZmZXIgKnJ0Y3A7CisgIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWU7CisgIGd1aW50NjQgbnRwbnN0aW1lOworICBHc3RDbG9ja1RpbWUgcnVubmluZ190aW1lOworICBHc3RDbG9ja1RpbWUgaW50ZXJ2YWw7CisgIEdzdFJUQ1BQYWNrZXQgcGFja2V0OworICBnYm9vbGVhbiBoYXNfc2RlczsKKyAgZ2Jvb2xlYW4gaXNfZWFybHk7CisgIGdib29sZWFuIG1heV9zdXBwcmVzczsKKyAgR1F1ZXVlIG91dHB1dDsKKyAgZ3VpbnQgbmFja2VkX3NlcW51bXM7Cit9IFJlcG9ydERhdGE7CisKK3N0YXRpYyB2b2lkCitzZXNzaW9uX3N0YXJ0X3J0Y3AgKFJUUFNlc3Npb24gKiBzZXNzLCBSZXBvcnREYXRhICogZGF0YSkKK3sKKyAgR3N0UlRDUFBhY2tldCAqcGFja2V0ID0gJmRhdGEtPnBhY2tldDsKKyAgUlRQU291cmNlICpvd24gPSBkYXRhLT5zb3VyY2U7CisgIEdzdFJUQ1BCdWZmZXIgKnJ0Y3AgPSAmZGF0YS0+cnRjcGJ1ZjsKKworICBkYXRhLT5ydGNwID0gZ3N0X3J0Y3BfYnVmZmVyX25ldyAoc2Vzcy0+bXR1KTsKKyAgZGF0YS0+aGFzX3NkZXMgPSBGQUxTRTsKKworICBnc3RfcnRjcF9idWZmZXJfbWFwIChkYXRhLT5ydGNwLCBHU1RfTUFQX1JFQURXUklURSwgcnRjcCk7CisKKyAgaWYgKGRhdGEtPmlzX2Vhcmx5ICYmIHNlc3MtPnJlZHVjZWRfc2l6ZV9ydGNwKQorICAgIHJldHVybjsKKworICBpZiAoUlRQX1NPVVJDRV9JU19TRU5ERVIgKG93bikpIHsKKyAgICBndWludDY0IG50cHRpbWU7CisgICAgZ3VpbnQzMiBydHB0aW1lOworICAgIGd1aW50MzIgcGFja2V0X2NvdW50LCBvY3RldF9jb3VudDsKKworICAgIC8qIHdlIGFyZSBhIHNlbmRlciwgY3JlYXRlIFNSICovCisgICAgR1NUX0RFQlVHICgiY3JlYXRlIFNSIGZvciBTU1JDICUwOHgiLCBvd24tPnNzcmMpOworICAgIGdzdF9ydGNwX2J1ZmZlcl9hZGRfcGFja2V0IChydGNwLCBHU1RfUlRDUF9UWVBFX1NSLCBwYWNrZXQpOworCisgICAgLyogZ2V0IGxhdGVzdCBzdGF0cyAqLworICAgIHJ0cF9zb3VyY2VfZ2V0X25ld19zciAob3duLCBkYXRhLT5udHBuc3RpbWUsIGRhdGEtPnJ1bm5pbmdfdGltZSwKKyAgICAgICAgJm50cHRpbWUsICZydHB0aW1lLCAmcGFja2V0X2NvdW50LCAmb2N0ZXRfY291bnQpOworICAgIC8qIHN0b3JlIHN0YXRzICovCisgICAgcnRwX3NvdXJjZV9wcm9jZXNzX3NyIChvd24sIGRhdGEtPmN1cnJlbnRfdGltZSwgbnRwdGltZSwgcnRwdGltZSwKKyAgICAgICAgcGFja2V0X2NvdW50LCBvY3RldF9jb3VudCk7CisKKyAgICAvKiBmaWxsIGluIHNlbmRlciByZXBvcnQgaW5mbyAqLworICAgIGdzdF9ydGNwX3BhY2tldF9zcl9zZXRfc2VuZGVyX2luZm8gKHBhY2tldCwgb3duLT5zc3JjLAorICAgICAgICBudHB0aW1lLCBydHB0aW1lLCBwYWNrZXRfY291bnQsIG9jdGV0X2NvdW50KTsKKyAgfSBlbHNlIHsKKyAgICAvKiB3ZSBhcmUgb25seSByZWNlaXZlciwgY3JlYXRlIFJSICovCisgICAgR1NUX0RFQlVHICgiY3JlYXRlIFJSIGZvciBTU1JDICUwOHgiLCBvd24tPnNzcmMpOworICAgIGdzdF9ydGNwX2J1ZmZlcl9hZGRfcGFja2V0IChydGNwLCBHU1RfUlRDUF9UWVBFX1JSLCBwYWNrZXQpOworICAgIGdzdF9ydGNwX3BhY2tldF9ycl9zZXRfc3NyYyAocGFja2V0LCBvd24tPnNzcmMpOworICB9Cit9CisKKy8qIGNvbnN0cnVjdCBhIFNlbmRlciBvciBSZWNlaXZlciBSZXBvcnQgKi8KK3N0YXRpYyB2b2lkCitzZXNzaW9uX3JlcG9ydF9ibG9ja3MgKGNvbnN0IGdjaGFyICoga2V5LCBSVFBTb3VyY2UgKiBzb3VyY2UsIFJlcG9ydERhdGEgKiBkYXRhKQoreworICBSVFBTZXNzaW9uICpzZXNzID0gZGF0YS0+c2VzczsKKyAgR3N0UlRDUFBhY2tldCAqcGFja2V0ID0gJmRhdGEtPnBhY2tldDsKKyAgZ3VpbnQ4IGZyYWN0aW9ubG9zdDsKKyAgZ2ludDMyIHBhY2tldHNsb3N0OworICBndWludDMyIGV4dGhpZ2hlc3RzZXEsIGppdHRlcjsKKyAgZ3VpbnQzMiBsc3IsIGRsc3I7CisKKyAgLyogZG9uJ3QgcmVwb3J0IGZvciBzb3VyY2VzIGluIGZ1dHVyZSBnZW5lcmF0aW9ucyAqLworICBpZiAoKChnaW50MTYpIChzb3VyY2UtPmdlbmVyYXRpb24gLSBzZXNzLT5nZW5lcmF0aW9uKSkgPiAwKSB7CisgICAgR1NUX0RFQlVHICgic291cmNlICUwOHggZ2VuZXJhdGlvbiAldSA+ICV1Iiwgc291cmNlLT5zc3JjLAorICAgICAgICBzb3VyY2UtPmdlbmVyYXRpb24sIHNlc3MtPmdlbmVyYXRpb24pOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChnX2hhc2hfdGFibGVfY29udGFpbnMgKHNvdXJjZS0+cmVwb3J0ZWRfaW5fc3Jfb2YsCisgICAgICAgICAgR1VJTlRfVE9fUE9JTlRFUiAoZGF0YS0+c291cmNlLT5zc3JjKSkpIHsKKyAgICBHU1RfREVCVUcgKCJzb3VyY2UgJTA4eCBhbHJlYWR5IHJlcG9ydGVkIGluIHRoaXMgZ2VuZXJhdGlvbiIsIHNvdXJjZS0+c3NyYyk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGdzdF9ydGNwX3BhY2tldF9nZXRfcmJfY291bnQgKHBhY2tldCkgPT0gR1NUX1JUQ1BfTUFYX1JCX0NPVU5UKSB7CisgICAgR1NUX0RFQlVHICgibWF4IFJCIGNvdW50IHJlYWNoZWQiKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBvbmx5IHJlcG9ydCBhYm91dCBvdGhlciBzZW5kZXIgKi8KKyAgaWYgKHNvdXJjZSA9PSBkYXRhLT5zb3VyY2UpCisgICAgZ290byByZXBvcnRlZDsKKworICBpZiAoIVJUUF9TT1VSQ0VfSVNfU0VOREVSIChzb3VyY2UpKSB7CisgICAgR1NUX0RFQlVHICgic291cmNlICUwOHggbm90IHNlbmRlciIsIHNvdXJjZS0+c3NyYyk7CisgICAgZ290byByZXBvcnRlZDsKKyAgfQorCisgIEdTVF9ERUJVRyAoImNyZWF0ZSBSQiBmb3IgU1NSQyAlMDh4Iiwgc291cmNlLT5zc3JjKTsKKworICAvKiBnZXQgbmV3IHN0YXRzICovCisgIHJ0cF9zb3VyY2VfZ2V0X25ld19yYiAoc291cmNlLCBkYXRhLT5jdXJyZW50X3RpbWUsICZmcmFjdGlvbmxvc3QsCisgICAgICAmcGFja2V0c2xvc3QsICZleHRoaWdoZXN0c2VxLCAmaml0dGVyLCAmbHNyLCAmZGxzcik7CisKKyAgLyogc3RvcmUgbGFzdCBnZW5lcmF0ZWQgUlIgcGFja2V0ICovCisgIHNvdXJjZS0+bGFzdF9yci5pc192YWxpZCA9IFRSVUU7CisgIHNvdXJjZS0+bGFzdF9yci5mcmFjdGlvbmxvc3QgPSBmcmFjdGlvbmxvc3Q7CisgIHNvdXJjZS0+bGFzdF9yci5wYWNrZXRzbG9zdCA9IHBhY2tldHNsb3N0OworICBzb3VyY2UtPmxhc3RfcnIuZXh0aGlnaGVzdHNlcSA9IGV4dGhpZ2hlc3RzZXE7CisgIHNvdXJjZS0+bGFzdF9yci5qaXR0ZXIgPSBqaXR0ZXI7CisgIHNvdXJjZS0+bGFzdF9yci5sc3IgPSBsc3I7CisgIHNvdXJjZS0+bGFzdF9yci5kbHNyID0gZGxzcjsKKworICAvKiBwYWNrZXQgaXMgbm90IHlldCBmaWxsZWQsIGFkZCByZXBvcnQgYmxvY2sgZm9yIHRoaXMgc291cmNlLiAqLworICBnc3RfcnRjcF9wYWNrZXRfYWRkX3JiIChwYWNrZXQsIHNvdXJjZS0+c3NyYywgZnJhY3Rpb25sb3N0LCBwYWNrZXRzbG9zdCwKKyAgICAgIGV4dGhpZ2hlc3RzZXEsIGppdHRlciwgbHNyLCBkbHNyKTsKKworcmVwb3J0ZWQ6CisgIGdfaGFzaF90YWJsZV9hZGQgKHNvdXJjZS0+cmVwb3J0ZWRfaW5fc3Jfb2YsCisgICAgICBHVUlOVF9UT19QT0lOVEVSIChkYXRhLT5zb3VyY2UtPnNzcmMpKTsKK30KKworLyogY29uc3RydWN0IEZJUiAqLworc3RhdGljIHZvaWQKK3Nlc3Npb25fYWRkX2ZpciAoY29uc3QgZ2NoYXIgKiBrZXksIFJUUFNvdXJjZSAqIHNvdXJjZSwgUmVwb3J0RGF0YSAqIGRhdGEpCit7CisgIEdzdFJUQ1BQYWNrZXQgKnBhY2tldCA9ICZkYXRhLT5wYWNrZXQ7CisgIGd1aW50MTYgbGVuOworICBndWludDggKmZjaV9kYXRhOworCisgIGlmICghc291cmNlLT5zZW5kX2ZpcikKKyAgICByZXR1cm47CisKKyAgbGVuID0gZ3N0X3J0Y3BfcGFja2V0X2ZiX2dldF9mY2lfbGVuZ3RoIChwYWNrZXQpOworICBpZiAoIWdzdF9ydGNwX3BhY2tldF9mYl9zZXRfZmNpX2xlbmd0aCAocGFja2V0LCBsZW4gKyAyKSkKKyAgICAvKiBleGl0IGJlY2F1c2UgdGhlIHBhY2tldCBpcyBmdWxsLCB3aWxsIHB1dCBuZXh0IHJlcXVlc3QgaW4gYQorICAgICAqIGZ1cnRoZXIgcGFja2V0ICovCisgICAgcmV0dXJuOworCisgIGZjaV9kYXRhID0gZ3N0X3J0Y3BfcGFja2V0X2ZiX2dldF9mY2kgKHBhY2tldCkgKyAobGVuICogNCk7CisKKyAgR1NUX1dSSVRFX1VJTlQzMl9CRSAoZmNpX2RhdGEsIHNvdXJjZS0+c3NyYyk7CisgIGZjaV9kYXRhICs9IDQ7CisgIGZjaV9kYXRhWzBdID0gc291cmNlLT5jdXJyZW50X3NlbmRfZmlyX3NlcW51bTsKKyAgZmNpX2RhdGFbMV0gPSBmY2lfZGF0YVsyXSA9IGZjaV9kYXRhWzNdID0gMDsKKworICBzb3VyY2UtPnNlbmRfZmlyID0gRkFMU0U7CisgIHNvdXJjZS0+c3RhdHMuc2VudF9maXJfY291bnQrKzsKK30KKworc3RhdGljIHZvaWQKK3Nlc3Npb25fZmlyIChSVFBTZXNzaW9uICogc2VzcywgUmVwb3J0RGF0YSAqIGRhdGEpCit7CisgIEdzdFJUQ1BCdWZmZXIgKnJ0Y3AgPSAmZGF0YS0+cnRjcGJ1ZjsKKyAgR3N0UlRDUFBhY2tldCAqcGFja2V0ID0gJmRhdGEtPnBhY2tldDsKKworICBpZiAoIWdzdF9ydGNwX2J1ZmZlcl9hZGRfcGFja2V0IChydGNwLCBHU1RfUlRDUF9UWVBFX1BTRkIsIHBhY2tldCkpCisgICAgcmV0dXJuOworCisgIGdzdF9ydGNwX3BhY2tldF9mYl9zZXRfdHlwZSAocGFja2V0LCBHU1RfUlRDUF9QU0ZCX1RZUEVfRklSKTsKKyAgZ3N0X3J0Y3BfcGFja2V0X2ZiX3NldF9zZW5kZXJfc3NyYyAocGFja2V0LCBkYXRhLT5zb3VyY2UtPnNzcmMpOworICBnc3RfcnRjcF9wYWNrZXRfZmJfc2V0X21lZGlhX3NzcmMgKHBhY2tldCwgMCk7CisKKyAgZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKHNlc3MtPnNzcmNzW3Nlc3MtPm1hc2tfaWR4XSwKKyAgICAgIChHSEZ1bmMpIHNlc3Npb25fYWRkX2ZpciwgZGF0YSk7CisKKyAgaWYgKGdzdF9ydGNwX3BhY2tldF9mYl9nZXRfZmNpX2xlbmd0aCAocGFja2V0KSA9PSAwKQorICAgIGdzdF9ydGNwX3BhY2tldF9yZW1vdmUgKHBhY2tldCk7CisgIGVsc2UKKyAgICBkYXRhLT5tYXlfc3VwcHJlc3MgPSBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitoYXNfcGxpX2NvbXBhcmVfZnVuYyAoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGlnbm9yZWQpCit7CisgIEdzdFJUQ1BQYWNrZXQgcGFja2V0OworICBHc3RSVENQQnVmZmVyIHJ0Y3AgPSB7IE5VTEwsIH07CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIGdzdF9ydGNwX2J1ZmZlcl9tYXAgKChHc3RCdWZmZXIgKikgYSwgR1NUX01BUF9SRUFELCAmcnRjcCk7CisKKyAgaWYgKGdzdF9ydGNwX2J1ZmZlcl9nZXRfZmlyc3RfcGFja2V0ICgmcnRjcCwgJnBhY2tldCkpIHsKKyAgICBpZiAoZ3N0X3J0Y3BfcGFja2V0X2dldF90eXBlICgmcGFja2V0KSA9PSBHU1RfUlRDUF9UWVBFX1BTRkIgJiYKKyAgICAgICAgZ3N0X3J0Y3BfcGFja2V0X2ZiX2dldF90eXBlICgmcGFja2V0KSA9PSBHU1RfUlRDUF9QU0ZCX1RZUEVfUExJKQorICAgICAgcmV0ID0gVFJVRTsKKyAgfQorCisgIGdzdF9ydGNwX2J1ZmZlcl91bm1hcCAoJnJ0Y3ApOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qIGNvbnN0cnVjdCBQTEkgKi8KK3N0YXRpYyB2b2lkCitzZXNzaW9uX3BsaSAoY29uc3QgZ2NoYXIgKiBrZXksIFJUUFNvdXJjZSAqIHNvdXJjZSwgUmVwb3J0RGF0YSAqIGRhdGEpCit7CisgIEdzdFJUQ1BCdWZmZXIgKnJ0Y3AgPSAmZGF0YS0+cnRjcGJ1ZjsKKyAgR3N0UlRDUFBhY2tldCAqcGFja2V0ID0gJmRhdGEtPnBhY2tldDsKKworICBpZiAoIXNvdXJjZS0+c2VuZF9wbGkpCisgICAgcmV0dXJuOworCisgIGlmIChydHBfc291cmNlX2hhc19yZXRhaW5lZCAoc291cmNlLCBoYXNfcGxpX2NvbXBhcmVfZnVuYywgTlVMTCkpCisgICAgcmV0dXJuOworCisgIGlmICghZ3N0X3J0Y3BfYnVmZmVyX2FkZF9wYWNrZXQgKHJ0Y3AsIEdTVF9SVENQX1RZUEVfUFNGQiwgcGFja2V0KSkKKyAgICAvKiBleGl0IGJlY2F1c2UgdGhlIHBhY2tldCBpcyBmdWxsLCB3aWxsIHB1dCBuZXh0IHJlcXVlc3QgaW4gYQorICAgICAqIGZ1cnRoZXIgcGFja2V0ICovCisgICAgcmV0dXJuOworCisgIGdzdF9ydGNwX3BhY2tldF9mYl9zZXRfdHlwZSAocGFja2V0LCBHU1RfUlRDUF9QU0ZCX1RZUEVfUExJKTsKKyAgZ3N0X3J0Y3BfcGFja2V0X2ZiX3NldF9zZW5kZXJfc3NyYyAocGFja2V0LCBkYXRhLT5zb3VyY2UtPnNzcmMpOworICBnc3RfcnRjcF9wYWNrZXRfZmJfc2V0X21lZGlhX3NzcmMgKHBhY2tldCwgc291cmNlLT5zc3JjKTsKKworICBzb3VyY2UtPnNlbmRfcGxpID0gRkFMU0U7CisgIGRhdGEtPm1heV9zdXBwcmVzcyA9IEZBTFNFOworCisgIHNvdXJjZS0+c3RhdHMuc2VudF9wbGlfY291bnQrKzsKK30KKworLyogY29uc3RydWN0IE5BQ0sgKi8KK3N0YXRpYyB2b2lkCitzZXNzaW9uX25hY2sgKGNvbnN0IGdjaGFyICoga2V5LCBSVFBTb3VyY2UgKiBzb3VyY2UsIFJlcG9ydERhdGEgKiBkYXRhKQoreworICBHc3RSVENQQnVmZmVyICpydGNwID0gJmRhdGEtPnJ0Y3BidWY7CisgIEdzdFJUQ1BQYWNrZXQgKnBhY2tldCA9ICZkYXRhLT5wYWNrZXQ7CisgIGd1aW50MzIgKm5hY2tzOworICBndWludCBuX25hY2tzLCBpOworICBndWludDggKmZjaV9kYXRhOworCisgIGlmICghc291cmNlLT5zZW5kX25hY2spCisgICAgcmV0dXJuOworCisgIGlmICghZ3N0X3J0Y3BfYnVmZmVyX2FkZF9wYWNrZXQgKHJ0Y3AsIEdTVF9SVENQX1RZUEVfUlRQRkIsIHBhY2tldCkpCisgICAgLyogZXhpdCBiZWNhdXNlIHRoZSBwYWNrZXQgaXMgZnVsbCwgd2lsbCBwdXQgbmV4dCByZXF1ZXN0IGluIGEKKyAgICAgKiBmdXJ0aGVyIHBhY2tldCAqLworICAgIHJldHVybjsKKworICBnc3RfcnRjcF9wYWNrZXRfZmJfc2V0X3R5cGUgKHBhY2tldCwgR1NUX1JUQ1BfUlRQRkJfVFlQRV9OQUNLKTsKKyAgZ3N0X3J0Y3BfcGFja2V0X2ZiX3NldF9zZW5kZXJfc3NyYyAocGFja2V0LCBkYXRhLT5zb3VyY2UtPnNzcmMpOworICBnc3RfcnRjcF9wYWNrZXRfZmJfc2V0X21lZGlhX3NzcmMgKHBhY2tldCwgc291cmNlLT5zc3JjKTsKKworICBuYWNrcyA9IHJ0cF9zb3VyY2VfZ2V0X25hY2tzIChzb3VyY2UsICZuX25hY2tzKTsKKyAgR1NUX0RFQlVHICgiJXUgTkFDS3MiLCBuX25hY2tzKTsKKyAgaWYgKCFnc3RfcnRjcF9wYWNrZXRfZmJfc2V0X2ZjaV9sZW5ndGggKHBhY2tldCwgbl9uYWNrcykpCisgICAgcmV0dXJuOworCisgIGZjaV9kYXRhID0gZ3N0X3J0Y3BfcGFja2V0X2ZiX2dldF9mY2kgKHBhY2tldCk7CisgIGZvciAoaSA9IDA7IGkgPCBuX25hY2tzOyBpKyspIHsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0JFIChmY2lfZGF0YSwgbmFja3NbaV0pOworICAgIGZjaV9kYXRhICs9IDQ7CisgICAgZGF0YS0+bmFja2VkX3NlcW51bXMrKzsKKyAgfQorCisgIHJ0cF9zb3VyY2VfY2xlYXJfbmFja3MgKHNvdXJjZSk7CisgIGRhdGEtPm1heV9zdXBwcmVzcyA9IEZBTFNFOworICBzb3VyY2UtPnN0YXRzLnNlbnRfbmFja19jb3VudCArPSBuX25hY2tzOworfQorCisvKiBwZXJmb3JtIGNsZWFudXAgb2Ygc291cmNlcyB0aGF0IHRpbWVkIG91dCAqLworc3RhdGljIHZvaWQKK3Nlc3Npb25fY2xlYW51cCAoY29uc3QgZ2NoYXIgKiBrZXksIFJUUFNvdXJjZSAqIHNvdXJjZSwgUmVwb3J0RGF0YSAqIGRhdGEpCit7CisgIGdib29sZWFuIHJlbW92ZSA9IEZBTFNFOworICBnYm9vbGVhbiBieWV0aW1lb3V0ID0gRkFMU0U7CisgIGdib29sZWFuIHNlbmRlcnRpbWVvdXQgPSBGQUxTRTsKKyAgZ2Jvb2xlYW4gaXNfc2VuZGVyLCBpc19hY3RpdmU7CisgIFJUUFNlc3Npb24gKnNlc3MgPSBkYXRhLT5zZXNzOworICBHc3RDbG9ja1RpbWUgaW50ZXJ2YWwsIGJpbnRlcnZhbDsKKyAgR3N0Q2xvY2tUaW1lIGJ0aW1lOworCisgIEdTVF9ERUJVRyAoImxvb2sgYXQgJTA4eCwgZ2VuZXJhdGlvbiAldSIsIHNvdXJjZS0+c3NyYywgc291cmNlLT5nZW5lcmF0aW9uKTsKKworICAvKiBjaGVjayBmb3Igb3V0ZGF0ZWQgY29sbGlzaW9ucyAqLworICBpZiAoc291cmNlLT5pbnRlcm5hbCkgeworICAgIEdTVF9ERUJVRyAoIlRpbWluZyBvdXQgY29sbGlzaW9ucyBmb3IgJXgiLCBzb3VyY2UtPnNzcmMpOworICAgIHJ0cF9zb3VyY2VfdGltZW91dCAoc291cmNlLCBkYXRhLT5jdXJyZW50X3RpbWUsCisgICAgICAgIGRhdGEtPnJ1bm5pbmdfdGltZSAtIHNlc3MtPnJ0Y3BfZmVlZGJhY2tfcmV0ZW50aW9uX3dpbmRvdyk7CisgIH0KKworICAvKiBub3RoaW5nIGVsc2UgdG8gZG8gd2hlbiB3aXRob3V0IFJUQ1AgKi8KKyAgaWYgKGRhdGEtPmludGVydmFsID09IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgcmV0dXJuOworCisgIGlzX3NlbmRlciA9IFJUUF9TT1VSQ0VfSVNfU0VOREVSIChzb3VyY2UpOworICBpc19hY3RpdmUgPSBSVFBfU09VUkNFX0lTX0FDVElWRSAoc291cmNlKTsKKworICAvKiBvdXIgb3duIHJ0Y3AgaW50ZXJ2YWwgbWF5IGhhdmUgYmVlbiBmb3JjZWQgbG93IGJ5IHNlY29uZGFyeSBjb25maWd1cmF0aW9uLAorICAgKiB3aGlsZSBzZW5kZXIgc2lkZSBtYXkgc3RpbGwgb3BlcmF0ZSB3aXRoIGhpZ2hlciBpbnRlcnZhbCwKKyAgICogc28gZG8gbm90IGp1c3QgdGFrZSBvdXIgaW50ZXJ2YWwgdG8gZGVjaWRlIG9uIHRpbWluZyBvdXQgc2VuZGVyLAorICAgKiBidXQgdGFrZSAoaWYgZGF0YS0+aW50ZXJ2YWwgPD0gNSAqIEdTVF9TRUNPTkQpOgorICAgKiAgIGludGVydmFsID0gQ0xBTVAgKHNlbmRlcl9pbnRlcnZhbCwgZGF0YS0+aW50ZXJ2YWwsIDUgKiBHU1RfU0VDT05EKQorICAgKiB3aGVyZSBzZW5kZXJfaW50ZXJ2YWwgaXMgZGlmZmVyZW5jZSBiZXR3ZWVuIGxhc3QgMiByZWNlaXZlZCBSVENQIHJlcG9ydHMKKyAgICovCisgIGlmIChkYXRhLT5pbnRlcnZhbCA+PSA1ICogR1NUX1NFQ09ORCB8fCBzb3VyY2UtPmludGVybmFsKSB7CisgICAgYmludGVydmFsID0gZGF0YS0+aW50ZXJ2YWw7CisgIH0gZWxzZSB7CisgICAgR1NUX0xPRyAoInByZXZfcnRjcCAlIiBHU1RfVElNRV9GT1JNQVQgIiwgbGFzdF9ydGNwICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoc291cmNlLT5zdGF0cy5wcmV2X3J0Y3B0aW1lKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoc291cmNlLT5zdGF0cy5sYXN0X3J0Y3B0aW1lKSk7CisgICAgLyogaWYgbm90IHJlY2VpdmVkIGVub3VnaCB5ZXQsIGZhbGxiYWNrIHRvIGxhcmdlciBkZWZhdWx0ICovCisgICAgaWYgKHNvdXJjZS0+c3RhdHMubGFzdF9ydGNwdGltZSA+IHNvdXJjZS0+c3RhdHMucHJldl9ydGNwdGltZSkKKyAgICAgIGJpbnRlcnZhbCA9IHNvdXJjZS0+c3RhdHMubGFzdF9ydGNwdGltZSAtIHNvdXJjZS0+c3RhdHMucHJldl9ydGNwdGltZTsKKyAgICBlbHNlCisgICAgICBiaW50ZXJ2YWwgPSA1ICogR1NUX1NFQ09ORDsKKyAgICBiaW50ZXJ2YWwgPSBDTEFNUCAoYmludGVydmFsLCBkYXRhLT5pbnRlcnZhbCwgNSAqIEdTVF9TRUNPTkQpOworICB9CisgIEdTVF9MT0cgKCJ0aW1lb3V0IGJhc2UgaW50ZXJ2YWwgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoYmludGVydmFsKSk7CisKKyAgaWYgKCFzb3VyY2UtPmludGVybmFsICYmIHNvdXJjZS0+bWFya2VkX2J5ZSkgeworICAgIC8qIGlmIHdlIHJlY2VpdmVkIGEgQllFIGZyb20gdGhlIHNvdXJjZSwgcmVtb3ZlIHRoZSBzb3VyY2UgYWZ0ZXIgc29tZQorICAgICAqIHRpbWUuICovCisgICAgaWYgKGRhdGEtPmN1cnJlbnRfdGltZSA+IHNvdXJjZS0+YnllX3RpbWUgJiYKKyAgICAgICAgZGF0YS0+Y3VycmVudF90aW1lIC0gc291cmNlLT5ieWVfdGltZSA+IHNlc3MtPnN0YXRzLmJ5ZV90aW1lb3V0KSB7CisgICAgICBHU1RfREVCVUcgKCJyZW1vdmluZyBCWUUgc291cmNlICUwOHgiLCBzb3VyY2UtPnNzcmMpOworICAgICAgcmVtb3ZlID0gVFJVRTsKKyAgICAgIGJ5ZXRpbWVvdXQgPSBUUlVFOworICAgIH0KKyAgfQorCisgIGlmIChzb3VyY2UtPmludGVybmFsICYmIHNvdXJjZS0+c2VudF9ieWUpIHsKKyAgICBHU1RfREVCVUcgKCJyZW1vdmluZyBpbnRlcm5hbCBzb3VyY2UgdGhhdCBoYXMgc2VudCBCWUUgJTA4eCIsIHNvdXJjZS0+c3NyYyk7CisgICAgcmVtb3ZlID0gVFJVRTsKKyAgfQorCisgIC8qIHNvdXJjZXMgdGhhdCB3ZXJlIGluYWN0aXZlIGZvciBtb3JlIHRoYW4gNSB0aW1lcyB0aGUgZGV0ZXJtaW5pc3RpYyByZXBvcnRpbmcKKyAgICogaW50ZXJ2YWwgZ2V0IHRpbWVkIG91dC4gdGhlIG1pbiB0aW1lb3V0IGlzIDUgc2Vjb25kcy4gKi8KKyAgLyogbWluZCBvbGQgdGltZSB0aGF0IG1pZ2h0IHByZS1kYXRlIGxhc3QgdGltZSBnb2luZyB0byBQTEFZSU5HICovCisgIGJ0aW1lID0gTUFYIChzb3VyY2UtPmxhc3RfYWN0aXZpdHksIHNlc3MtPnN0YXJ0X3RpbWUpOworICBpZiAoZGF0YS0+Y3VycmVudF90aW1lID4gYnRpbWUpIHsKKyAgICBpbnRlcnZhbCA9IE1BWCAoYmludGVydmFsICogNSwgNSAqIEdTVF9TRUNPTkQpOworICAgIGlmIChkYXRhLT5jdXJyZW50X3RpbWUgLSBidGltZSA+IGludGVydmFsKSB7CisgICAgICBHU1RfREVCVUcgKCJyZW1vdmluZyB0aW1lb3V0IHNvdXJjZSAlMDh4LCBsYXN0ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICBzb3VyY2UtPnNzcmMsIEdTVF9USU1FX0FSR1MgKGJ0aW1lKSk7CisgICAgICBpZiAoc291cmNlLT5pbnRlcm5hbCkgeworICAgICAgICAvKiB0aGlzIGlzIGFuIGludGVybmFsIHNvdXJjZSB0aGF0IGlzIG5vdCB1c2luZyBvdXIgc3VnZ2VzdGVkIHNzcmMuCisgICAgICAgICAqIHNpbmNlIHRoZXJlIG11c3QgYmUgYW5vdGhlciBzb3VyY2UgdXNpbmcgdGhpcyBzc3JjLCB3ZSBjYW4gcmVtb3ZlCisgICAgICAgICAqIHRoaXMgb25lIGluc3RlYWQgb2YgbWFraW5nIGl0IGEgcmVjZWl2ZXIgZm9yZXZlciAqLworICAgICAgICBpZiAoc291cmNlLT5zc3JjICE9IHNlc3MtPnN1Z2dlc3RlZF9zc3JjKSB7CisgICAgICAgICAgcnRwX3NvdXJjZV9tYXJrX2J5ZSAoc291cmNlLCAidGltZWQgb3V0Iik7CisgICAgICAgICAgLyogZG8gbm90IHNjaGVkdWxlIGJ5ZSBoZXJlLCBzaW5jZSB3ZSBhcmUgaW5zaWRlIHRoZSBSVENQIHRpbWVvdXQKKyAgICAgICAgICAgKiBwcm9jZXNzaW5nIGFuZCBzY2hlZHVsaW5nIGJ5ZSB3aWxsIGludGVyZmVyZSB3aXRoIFNSL1JSIHNlbmRpbmcgKi8KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVtb3ZlID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBzZW5kZXJzIHRoYXQgZGlkIG5vdCBzZW5kIGZvciBhIGxvbmcgdGltZSBiZWNvbWUgYSByZWNlaXZlciwgdGhpcyBhbHNvCisgICAqIGhvbGRzIGZvciBvdXIgb3duIHNvdXJjZXMuICovCisgIGlmIChpc19zZW5kZXIpIHsKKyAgICAvKiBtaW5kIG9sZCB0aW1lIHRoYXQgbWlnaHQgcHJlLWRhdGUgbGFzdCB0aW1lIGdvaW5nIHRvIFBMQVlJTkcgKi8KKyAgICBidGltZSA9IE1BWCAoc291cmNlLT5sYXN0X3J0cF9hY3Rpdml0eSwgc2Vzcy0+c3RhcnRfdGltZSk7CisgICAgaWYgKGRhdGEtPmN1cnJlbnRfdGltZSA+IGJ0aW1lKSB7CisgICAgICBpbnRlcnZhbCA9IE1BWCAoYmludGVydmFsICogMiwgNSAqIEdTVF9TRUNPTkQpOworICAgICAgaWYgKGRhdGEtPmN1cnJlbnRfdGltZSAtIGJ0aW1lID4gaW50ZXJ2YWwpIHsKKyAgICAgICAgR1NUX0RFQlVHICgic2VuZGVyIHNvdXJjZSAlMDh4IHRpbWVkIG91dCBhbmQgYmVjYW1lIHJlY2VpdmVyLCBsYXN0ICUiCisgICAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIHNvdXJjZS0+c3NyYywgR1NUX1RJTUVfQVJHUyAoYnRpbWUpKTsKKyAgICAgICAgc2VuZGVydGltZW91dCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKHJlbW92ZSkgeworICAgIHNlc3MtPnRvdGFsX3NvdXJjZXMtLTsKKyAgICBpZiAoaXNfc2VuZGVyKSB7CisgICAgICBzZXNzLT5zdGF0cy5zZW5kZXJfc291cmNlcy0tOworICAgICAgaWYgKHNvdXJjZS0+aW50ZXJuYWwpCisgICAgICAgIHNlc3MtPnN0YXRzLmludGVybmFsX3NlbmRlcl9zb3VyY2VzLS07CisgICAgfQorICAgIGlmIChpc19hY3RpdmUpCisgICAgICBzZXNzLT5zdGF0cy5hY3RpdmVfc291cmNlcy0tOworCisgICAgaWYgKHNvdXJjZS0+aW50ZXJuYWwpCisgICAgICBzZXNzLT5zdGF0cy5pbnRlcm5hbF9zb3VyY2VzLS07CisKKyAgICBpZiAoYnlldGltZW91dCkKKyAgICAgIG9uX2J5ZV90aW1lb3V0IChzZXNzLCBzb3VyY2UpOworICAgIGVsc2UKKyAgICAgIG9uX3RpbWVvdXQgKHNlc3MsIHNvdXJjZSk7CisgIH0gZWxzZSB7CisgICAgaWYgKHNlbmRlcnRpbWVvdXQpIHsKKyAgICAgIHNvdXJjZS0+aXNfc2VuZGVyID0gRkFMU0U7CisgICAgICBzZXNzLT5zdGF0cy5zZW5kZXJfc291cmNlcy0tOworICAgICAgaWYgKHNvdXJjZS0+aW50ZXJuYWwpCisgICAgICAgIHNlc3MtPnN0YXRzLmludGVybmFsX3NlbmRlcl9zb3VyY2VzLS07CisKKyAgICAgIG9uX3NlbmRlcl90aW1lb3V0IChzZXNzLCBzb3VyY2UpOworICAgIH0KKyAgICAvKiBjb3VudCBob3cgbWFueSBzb3VyY2UgdG8gcmVwb3J0IGluIHRoaXMgZ2VuZXJhdGlvbiAqLworICAgIGlmICgoKGdpbnQxNikgKHNvdXJjZS0+Z2VuZXJhdGlvbiAtIHNlc3MtPmdlbmVyYXRpb24pKSA8PSAwKQorICAgICAgZGF0YS0+bnVtX3RvX3JlcG9ydCsrOworICB9CisgIHNvdXJjZS0+Y2xvc2luZyA9IHJlbW92ZTsKK30KKworc3RhdGljIHZvaWQKK3Nlc3Npb25fc2RlcyAoUlRQU2Vzc2lvbiAqIHNlc3MsIFJlcG9ydERhdGEgKiBkYXRhKQoreworICBHc3RSVENQUGFja2V0ICpwYWNrZXQgPSAmZGF0YS0+cGFja2V0OworICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnNkZXM7CisgIGdpbnQgaSwgbl9maWVsZHM7CisgIEdzdFJUQ1BCdWZmZXIgKnJ0Y3AgPSAmZGF0YS0+cnRjcGJ1ZjsKKworICAvKiBhZGQgU0RFUyBwYWNrZXQgKi8KKyAgZ3N0X3J0Y3BfYnVmZmVyX2FkZF9wYWNrZXQgKHJ0Y3AsIEdTVF9SVENQX1RZUEVfU0RFUywgcGFja2V0KTsKKworICBnc3RfcnRjcF9wYWNrZXRfc2Rlc19hZGRfaXRlbSAocGFja2V0LCBkYXRhLT5zb3VyY2UtPnNzcmMpOworCisgIHNkZXMgPSBydHBfc291cmNlX2dldF9zZGVzX3N0cnVjdCAoZGF0YS0+c291cmNlKTsKKworICAvKiBhZGQgYWxsIGZpZWxkcyBpbiB0aGUgc3RydWN0dXJlLCB0aGUgb3JkZXIgaXMgbm90IGltcG9ydGFudC4gKi8KKyAgbl9maWVsZHMgPSBnc3Rfc3RydWN0dXJlX25fZmllbGRzIChzZGVzKTsKKyAgZm9yIChpID0gMDsgaSA8IG5fZmllbGRzOyArK2kpIHsKKyAgICBjb25zdCBnY2hhciAqZmllbGQ7CisgICAgY29uc3QgZ2NoYXIgKnZhbHVlOworICAgIEdzdFJUQ1BTREVTVHlwZSB0eXBlOworCisgICAgZmllbGQgPSBnc3Rfc3RydWN0dXJlX250aF9maWVsZF9uYW1lIChzZGVzLCBpKTsKKyAgICBpZiAoZmllbGQgPT0gTlVMTCkKKyAgICAgIGNvbnRpbnVlOworICAgIHZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzZGVzLCBmaWVsZCk7CisgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICBjb250aW51ZTsKKyAgICB0eXBlID0gZ3N0X3J0Y3Bfc2Rlc19uYW1lX3RvX3R5cGUgKGZpZWxkKTsKKworICAgIC8qIEVhcmx5IHBhY2tldHMgYXJlIG1pbmltYWwgYW5kIG9ubHkgaW5jbHVkZSB0aGUgQ05BTUUgKi8KKyAgICBpZiAoZGF0YS0+aXNfZWFybHkgJiYgdHlwZSAhPSBHU1RfUlRDUF9TREVTX0NOQU1FKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAodHlwZSA+IEdTVF9SVENQX1NERVNfRU5EICYmIHR5cGUgPCBHU1RfUlRDUF9TREVTX1BSSVYpIHsKKyAgICAgIGdzdF9ydGNwX3BhY2tldF9zZGVzX2FkZF9lbnRyeSAocGFja2V0LCB0eXBlLCBzdHJsZW4gKHZhbHVlKSwKKyAgICAgICAgICAoY29uc3QgZ3VpbnQ4ICopIHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gR1NUX1JUQ1BfU0RFU19QUklWKSB7CisgICAgICBnc2l6ZSBwcmVmaXhfbGVuOworICAgICAgZ3NpemUgdmFsdWVfbGVuOworICAgICAgZ3NpemUgZGF0YV9sZW47CisgICAgICBndWludDggZGF0YVsyNTZdOworCisgICAgICAvKiBkb24ndCBhY2NlcHQgZW50cmllcyB0aGF0IGFyZSB0b28gYmlnICovCisgICAgICBwcmVmaXhfbGVuID0gc3RybGVuIChmaWVsZCk7CisgICAgICBpZiAocHJlZml4X2xlbiA+IDI1NSkKKyAgICAgICAgY29udGludWU7CisgICAgICB2YWx1ZV9sZW4gPSBzdHJsZW4gKHZhbHVlKTsKKyAgICAgIGlmICh2YWx1ZV9sZW4gPiAyNTUpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGF0YV9sZW4gPSAxICsgcHJlZml4X2xlbiArIHZhbHVlX2xlbjsKKyAgICAgIGlmIChkYXRhX2xlbiA+IDI1NSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGRhdGFbMF0gPSBwcmVmaXhfbGVuOworICAgICAgbWVtY3B5ICgmZGF0YVsxXSwgZmllbGQsIHByZWZpeF9sZW4pOworICAgICAgbWVtY3B5ICgmZGF0YVsxICsgcHJlZml4X2xlbl0sIHZhbHVlLCB2YWx1ZV9sZW4pOworCisgICAgICBnc3RfcnRjcF9wYWNrZXRfc2Rlc19hZGRfZW50cnkgKHBhY2tldCwgdHlwZSwgZGF0YV9sZW4sIGRhdGEpOworICAgIH0KKyAgfQorCisgIGRhdGEtPmhhc19zZGVzID0gVFJVRTsKK30KKworLyogc2NoZWR1bGUgYSBCWUUgcGFja2V0ICovCitzdGF0aWMgdm9pZAorbWFrZV9zb3VyY2VfYnllIChSVFBTZXNzaW9uICogc2VzcywgUlRQU291cmNlICogc291cmNlLCBSZXBvcnREYXRhICogZGF0YSkKK3sKKyAgR3N0UlRDUFBhY2tldCAqcGFja2V0ID0gJmRhdGEtPnBhY2tldDsKKyAgR3N0UlRDUEJ1ZmZlciAqcnRjcCA9ICZkYXRhLT5ydGNwYnVmOworCisgIC8qIGFkZCBTREVTICovCisgIHNlc3Npb25fc2RlcyAoc2VzcywgZGF0YSk7CisgIC8qIGFkZCBhIEJZRSBwYWNrZXQgKi8KKyAgZ3N0X3J0Y3BfYnVmZmVyX2FkZF9wYWNrZXQgKHJ0Y3AsIEdTVF9SVENQX1RZUEVfQllFLCBwYWNrZXQpOworICBnc3RfcnRjcF9wYWNrZXRfYnllX2FkZF9zc3JjIChwYWNrZXQsIHNvdXJjZS0+c3NyYyk7CisgIGlmIChzb3VyY2UtPmJ5ZV9yZWFzb24pCisgICAgZ3N0X3J0Y3BfcGFja2V0X2J5ZV9zZXRfcmVhc29uIChwYWNrZXQsIHNvdXJjZS0+YnllX3JlYXNvbik7CisKKyAgLyogd2UgaGF2ZSBhIEJZRSBwYWNrZXQgbm93ICovCisgIHNvdXJjZS0+c2VudF9ieWUgPSBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2lzX3J0Y3BfdGltZSAoUlRQU2Vzc2lvbiAqIHNlc3MsIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUsIFJlcG9ydERhdGEgKiBkYXRhKQoreworICBHc3RDbG9ja1RpbWUgbmV3X3NlbmRfdGltZTsKKyAgR3N0Q2xvY2tUaW1lIGludGVydmFsOworICBSVFBTZXNzaW9uU3RhdHMgKnN0YXRzOworCisgIGlmIChzZXNzLT5zY2hlZHVsZWRfYnllKQorICAgIHN0YXRzID0gJnNlc3MtPmJ5ZV9zdGF0czsKKyAgZWxzZQorICAgIHN0YXRzID0gJnNlc3MtPnN0YXRzOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc2Vzcy0+bmV4dF9lYXJseV9ydGNwX3RpbWUpKQorICAgIGRhdGEtPmlzX2Vhcmx5ID0gVFJVRTsKKyAgZWxzZQorICAgIGRhdGEtPmlzX2Vhcmx5ID0gRkFMU0U7CisKKyAgaWYgKGRhdGEtPmlzX2Vhcmx5ICYmIHNlc3MtPm5leHRfZWFybHlfcnRjcF90aW1lIDwgY3VycmVudF90aW1lKSB7CisgICAgR1NUX0RFQlVHICgiZWFybHkgZmVlZGJhY2sgJSIgR1NUX1RJTUVfRk9STUFUICIgPCBub3cgJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChzZXNzLT5uZXh0X2Vhcmx5X3J0Y3BfdGltZSksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGN1cnJlbnRfdGltZSkpOworICB9IGVsc2UgaWYgKHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lID09IEdTVF9DTE9DS19USU1FX05PTkUgfHwKKyAgICAgIHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lID4gY3VycmVudF90aW1lKSB7CisgICAgR1NUX0RFQlVHICgibm8gY2hlY2sgdGltZSB5ZXQsIG5leHQgJSIgR1NUX1RJTUVfRk9STUFUICIgPiBub3cgJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChzZXNzLT5uZXh0X3J0Y3BfY2hlY2tfdGltZSksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGN1cnJlbnRfdGltZSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIHRha2UgaW50ZXJ2YWwgYW5kIGFkZCBqaXR0ZXIgKi8KKyAgaW50ZXJ2YWwgPSBkYXRhLT5pbnRlcnZhbDsKKyAgaWYgKGludGVydmFsICE9IEdTVF9DTE9DS19USU1FX05PTkUpCisgICAgaW50ZXJ2YWwgPSBydHBfc3RhdHNfYWRkX3J0Y3Bfaml0dGVyIChzdGF0cywgaW50ZXJ2YWwpOworCisgIGlmIChzZXNzLT5sYXN0X3J0Y3BfY2hlY2tfdGltZSAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgLyogcGVyZm9ybSBmb3J3YXJkIHJlY29uc2lkZXJhdGlvbiAqLworICAgIGlmIChpbnRlcnZhbCAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgICBHc3RDbG9ja1RpbWUgZWxhcHNlZDsKKworICAgICAgLyogZ2V0IGVsYXBzZWQgdGltZSBzaW5jZSB3ZSBsYXN0IHJlcG9ydGVkICovCisgICAgICBlbGFwc2VkID0gY3VycmVudF90aW1lIC0gc2Vzcy0+bGFzdF9ydGNwX2NoZWNrX3RpbWU7CisKKyAgICAgIEdTVF9ERUJVRyAoImZvcndhcmQgcmVjb25zaWRlcmF0aW9uICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBlbGFwc2VkICUiCisgICAgICAgICAgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChpbnRlcnZhbCksIEdTVF9USU1FX0FSR1MgKGVsYXBzZWQpKTsKKyAgICAgIG5ld19zZW5kX3RpbWUgPSBpbnRlcnZhbCArIHNlc3MtPmxhc3RfcnRjcF9jaGVja190aW1lOworICAgIH0gZWxzZSB7CisgICAgICBuZXdfc2VuZF90aW1lID0gc2Vzcy0+bGFzdF9ydGNwX2NoZWNrX3RpbWU7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IFJUQ1AgcGFja2V0LCB3ZSBjYW4gcmVjb25zaWRlciBhbnl0aGluZyBiYXNlZAorICAgICAqIG9uIHRoZSBsYXN0IFJUQ1Agc2VuZCB0aW1lIGJlY2F1c2UgdGhlcmUgd2FzIG5vbmUuCisgICAgICovCisgICAgZ193YXJuX2lmX2ZhaWwgKCFkYXRhLT5pc19lYXJseSk7CisgICAgZGF0YS0+aXNfZWFybHkgPSBGQUxTRTsKKyAgICBuZXdfc2VuZF90aW1lID0gY3VycmVudF90aW1lOworICB9CisKKyAgaWYgKCFkYXRhLT5pc19lYXJseSkgeworICAgIC8qIGNoZWNrIGlmIHJlY29uc2lkZXJhdGlvbiAqLworICAgIGlmIChuZXdfc2VuZF90aW1lID09IEdTVF9DTE9DS19USU1FX05PTkUgfHwgY3VycmVudF90aW1lIDwgbmV3X3NlbmRfdGltZSkgeworICAgICAgR1NUX0RFQlVHICgicmVjb25zaWRlciBSVENQIGZvciAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobmV3X3NlbmRfdGltZSkpOworICAgICAgLyogc3RvcmUgbmV3IGNoZWNrIHRpbWUgKi8KKyAgICAgIHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lID0gbmV3X3NlbmRfdGltZTsKKyAgICAgIHNlc3MtPmxhc3RfcnRjcF9pbnRlcnZhbCA9IGludGVydmFsOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHNlc3MtPmxhc3RfcnRjcF9pbnRlcnZhbCA9IGludGVydmFsOworICAgIGlmICgoc2Vzcy0+cnRwX3Byb2ZpbGUgPT0gR1NUX1JUUF9QUk9GSUxFX0FWUEYKKyAgICAgICAgICAgIHx8IHNlc3MtPnJ0cF9wcm9maWxlID09IEdTVF9SVFBfUFJPRklMRV9TQVZQRikKKyAgICAgICAgJiYgaW50ZXJ2YWwgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkgeworICAgICAgLyogQXBwbHkgdGhlIHJ1bGVzIGZyb20gUkZDIDQ1ODUgc2VjdGlvbiAzLjUuMyAqLworICAgICAgaWYgKHN0YXRzLT5taW5faW50ZXJ2YWwgIT0gMCAmJiAhc2Vzcy0+Zmlyc3RfcnRjcCkgeworICAgICAgICBHc3RDbG9ja1RpbWUgVF9ycl9jdXJyZW50X2ludGVydmFsID0KKyAgICAgICAgICAgIGdfcmFuZG9tX2RvdWJsZV9yYW5nZSAoMC41LCAxLjUpICogc3RhdHMtPm1pbl9pbnRlcnZhbCAqIEdTVF9TRUNPTkQ7CisKKyAgICAgICAgaWYgKFRfcnJfY3VycmVudF9pbnRlcnZhbCA+IGludGVydmFsKSB7CisgICAgICAgICAgR1NUX0RFQlVHICgiQWRqdXN0aW5nIGludGVydmFsIGZvciB0LXJyLWludGVydmFsOiAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAgICAgIiA+ICUiIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAoVF9ycl9jdXJyZW50X2ludGVydmFsKSwKKyAgICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoaW50ZXJ2YWwpKTsKKyAgICAgICAgICBpbnRlcnZhbCA9IFRfcnJfY3VycmVudF9pbnRlcnZhbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBzZXNzLT5uZXh0X3J0Y3BfY2hlY2tfdGltZSA9IGN1cnJlbnRfdGltZSArIGludGVydmFsOworICB9CisKKworICBHU1RfREVCVUcgKCJjYW4gc2VuZCBSVENQIG5vdywgbmV4dCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChzZXNzLT5uZXh0X3J0Y3BfY2hlY2tfdGltZSkpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorY2xvbmVfc3NyY3NfaGFzaHRhYmxlIChnY2hhciAqIGtleSwgUlRQU291cmNlICogc291cmNlLCBHSGFzaFRhYmxlICogaGFzaF90YWJsZSkKK3sKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoaGFzaF90YWJsZSwga2V5LCBnX29iamVjdF9yZWYgKHNvdXJjZSkpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3JlbW92ZV9jbG9zaW5nX3NvdXJjZXMgKGNvbnN0IGdjaGFyICoga2V5LCBSVFBTb3VyY2UgKiBzb3VyY2UsCisgICAgUmVwb3J0RGF0YSAqIGRhdGEpCit7CisgIGlmIChzb3VyY2UtPmNsb3NpbmcpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKHNvdXJjZS0+c2VuZF9maXIpCisgICAgZGF0YS0+aGF2ZV9maXIgPSBUUlVFOworICBpZiAoc291cmNlLT5zZW5kX3BsaSkKKyAgICBkYXRhLT5oYXZlX3BsaSA9IFRSVUU7CisgIGlmIChzb3VyY2UtPnNlbmRfbmFjaykKKyAgICBkYXRhLT5oYXZlX25hY2sgPSBUUlVFOworCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dlbmVyYXRlX3J0Y3AgKGNvbnN0IGdjaGFyICoga2V5LCBSVFBTb3VyY2UgKiBzb3VyY2UsIFJlcG9ydERhdGEgKiBkYXRhKQoreworICBSVFBTZXNzaW9uICpzZXNzID0gZGF0YS0+c2VzczsKKyAgZ2Jvb2xlYW4gaXNfYnllID0gRkFMU0U7CisgIFJlcG9ydE91dHB1dCAqb3V0cHV0OworCisgIC8qIG9ubHkgZ2VuZXJhdGUgUlRDUCBmb3IgYWN0aXZlIGludGVybmFsIHNvdXJjZXMgKi8KKyAgaWYgKCFzb3VyY2UtPmludGVybmFsIHx8IHNvdXJjZS0+c2VudF9ieWUpCisgICAgcmV0dXJuOworCisgIC8qIGlnbm9yZSBvdGhlciBzb3VyY2VzIHdoZW4gd2UgZG8gdGhlIHRpbWVvdXQgYWZ0ZXIgYSBzY2hlZHVsZWQgQllFICovCisgIGlmIChzZXNzLT5zY2hlZHVsZWRfYnllICYmICFzb3VyY2UtPm1hcmtlZF9ieWUpCisgICAgcmV0dXJuOworCisgIGRhdGEtPnNvdXJjZSA9IHNvdXJjZTsKKworICAvKiBvcGVuIHBhY2tldCAqLworICBzZXNzaW9uX3N0YXJ0X3J0Y3AgKHNlc3MsIGRhdGEpOworCisgIGlmIChzb3VyY2UtPm1hcmtlZF9ieWUpIHsKKyAgICAvKiBzZW5kIEJZRSAqLworICAgIG1ha2Vfc291cmNlX2J5ZSAoc2Vzcywgc291cmNlLCBkYXRhKTsKKyAgICBpc19ieWUgPSBUUlVFOworICB9IGVsc2UgaWYgKCFkYXRhLT5pc19lYXJseSkgeworICAgIC8qIGxvb3Agb3ZlciBhbGwga25vd24gc291cmNlcyBhbmQgYWRkIHJlcG9ydCBibG9ja3MuIElmIHdlIGFyZSBlYXJseSwgd2UKKyAgICAgKiBqdXN0IG1ha2UgYSBtaW5pbWFsIFJUQ1AgcGFja2V0IGFuZCBza2lwIHRoaXMgc3RlcCAqLworICAgIGdfaGFzaF90YWJsZV9mb3JlYWNoIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0sCisgICAgICAgIChHSEZ1bmMpIHNlc3Npb25fcmVwb3J0X2Jsb2NrcywgZGF0YSk7CisgIH0KKyAgaWYgKCFkYXRhLT5oYXNfc2RlcyAmJiAoIWRhdGEtPmlzX2Vhcmx5IHx8ICFzZXNzLT5yZWR1Y2VkX3NpemVfcnRjcCkpCisgICAgc2Vzc2lvbl9zZGVzIChzZXNzLCBkYXRhKTsKKworICBpZiAoZGF0YS0+aGF2ZV9maXIpCisgICAgc2Vzc2lvbl9maXIgKHNlc3MsIGRhdGEpOworCisgIGlmIChkYXRhLT5oYXZlX3BsaSkKKyAgICBnX2hhc2hfdGFibGVfZm9yZWFjaCAoc2Vzcy0+c3NyY3Nbc2Vzcy0+bWFza19pZHhdLAorICAgICAgICAoR0hGdW5jKSBzZXNzaW9uX3BsaSwgZGF0YSk7CisKKyAgaWYgKGRhdGEtPmhhdmVfbmFjaykKKyAgICBnX2hhc2hfdGFibGVfZm9yZWFjaCAoc2Vzcy0+c3NyY3Nbc2Vzcy0+bWFza19pZHhdLAorICAgICAgICAoR0hGdW5jKSBzZXNzaW9uX25hY2ssIGRhdGEpOworCisgIGdzdF9ydGNwX2J1ZmZlcl91bm1hcCAoJmRhdGEtPnJ0Y3BidWYpOworCisgIG91dHB1dCA9IGdfc2xpY2VfbmV3IChSZXBvcnRPdXRwdXQpOworICBvdXRwdXQtPnNvdXJjZSA9IGdfb2JqZWN0X3JlZiAoc291cmNlKTsKKyAgb3V0cHV0LT5pc19ieWUgPSBpc19ieWU7CisgIG91dHB1dC0+YnVmZmVyID0gZGF0YS0+cnRjcDsKKyAgLyogcXVldWUgdGhlIFJUQ1AgcGFja2V0IHRvIHB1c2ggbGF0ZXIgKi8KKyAgZ19xdWV1ZV9wdXNoX3RhaWwgKCZkYXRhLT5vdXRwdXQsIG91dHB1dCk7Cit9CisKK3N0YXRpYyB2b2lkCit1cGRhdGVfZ2VuZXJhdGlvbiAoY29uc3QgZ2NoYXIgKiBrZXksIFJUUFNvdXJjZSAqIHNvdXJjZSwgUmVwb3J0RGF0YSAqIGRhdGEpCit7CisgIFJUUFNlc3Npb24gKnNlc3MgPSBkYXRhLT5zZXNzOworCisgIGlmIChnX2hhc2hfdGFibGVfc2l6ZSAoc291cmNlLT5yZXBvcnRlZF9pbl9zcl9vZikgPj0KKyAgICAgIHNlc3MtPnN0YXRzLmludGVybmFsX3NvdXJjZXMpIHsKKyAgICAvKiBzb3VyY2UgaXMgcmVwb3J0ZWQsIG1vdmUgdG8gbmV4dCBnZW5lcmF0aW9uICovCisgICAgc291cmNlLT5nZW5lcmF0aW9uID0gc2Vzcy0+Z2VuZXJhdGlvbiArIDE7CisgICAgZ19oYXNoX3RhYmxlX3JlbW92ZV9hbGwgKHNvdXJjZS0+cmVwb3J0ZWRfaW5fc3Jfb2YpOworCisgICAgR1NUX0xPRyAoInJlcG9ydGVkIHNvdXJjZSAleCwgbmV3IGdlbmVyYXRpb246ICVkIiwgc291cmNlLT5zc3JjLAorICAgICAgICBzb3VyY2UtPmdlbmVyYXRpb24pOworCisgICAgLyogaWYgd2UgcmVwb3J0ZWQgYWxsIHNvdXJjZXMgaW4gdGhpcyBnZW5lcmF0aW9uLCBtb3ZlIHRvIG5leHQgKi8KKyAgICBpZiAoLS1kYXRhLT5udW1fdG9fcmVwb3J0ID09IDApIHsKKyAgICAgIHNlc3MtPmdlbmVyYXRpb24rKzsKKyAgICAgIEdTVF9ERUJVRyAoImFsbCByZXBvcnRlZCwgZ2VuZXJhdGlvbiBub3cgJXUiLCBzZXNzLT5nZW5lcmF0aW9uKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitydHBfc2Vzc2lvbl9hcmVfYWxsX3NvdXJjZXNfYnllIChSVFBTZXNzaW9uICogc2VzcykKK3sKKyAgR0hhc2hUYWJsZUl0ZXIgaXRlcjsKKyAgUlRQU291cmNlICpzcmM7CisKKyAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJml0ZXIsIHNlc3MtPnNzcmNzW3Nlc3MtPm1hc2tfaWR4XSk7CisgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaXRlciwgTlVMTCwgKGdwb2ludGVyICopICYgc3JjKSkgeworICAgIGlmIChzcmMtPmludGVybmFsICYmICFzcmMtPnNlbnRfYnllKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogcnRwX3Nlc3Npb25fb25fdGltZW91dDoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQGN1cnJlbnRfdGltZTogdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUKKyAqIEBudHBuc3RpbWU6IHRoZSBjdXJyZW50IE5UUCB0aW1lIGluIG5hbm9zZWNvbmRzCisgKiBAcnVubmluZ190aW1lOiB0aGUgY3VycmVudCBydW5uaW5nX3RpbWUgb2YgdGhlIHBpcGVsaW5lCisgKgorICogUGVyZm9ybSBtYWludGVuYW5jZSBhY3Rpb25zIGFmdGVyIHRoZSB0aW1lb3V0IG9idGFpbmVkIHdpdGgKKyAqIHJ0cF9zZXNzaW9uX25leHRfdGltZW91dCgpIGV4cGlyZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHBlcmZvcm0gdGltZW91dHMgb2YgcmVjZWl2ZXJzIGFuZCBzZW5kZXJzLCBzZW5kIGEgQllFCisgKiBwYWNrZXQgb3IgZ2VuZXJhdGUgUlRDUCBwYWNrZXRzIHdpdGggY3VycmVudCBzZXNzaW9uIHN0YXRzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGNhbGwgdGhlICNSVFBTZXNzaW9uU2VuZFJUQ1AgY2FsbGJhY2ssIHBvc3NpYmx5IG11bHRpcGxlCisgKiB0aW1lcywgZm9yIGVhY2ggcGFja2V0IHRoYXQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KKyAqCisgKiBSZXR1cm5zOiBhICNHc3RGbG93UmV0dXJuLgorICovCitHc3RGbG93UmV0dXJuCitydHBfc2Vzc2lvbl9vbl90aW1lb3V0IChSVFBTZXNzaW9uICogc2VzcywgR3N0Q2xvY2tUaW1lIGN1cnJlbnRfdGltZSwKKyAgICBndWludDY0IG50cG5zdGltZSwgR3N0Q2xvY2tUaW1lIHJ1bm5pbmdfdGltZSkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXN1bHQgPSBHU1RfRkxPV19PSzsKKyAgUmVwb3J0RGF0YSBkYXRhID0geyBHU1RfUlRDUF9CVUZGRVJfSU5JVCB9OworICBHSGFzaFRhYmxlICp0YWJsZV9jb3B5OworICBSZXBvcnRPdXRwdXQgKm91dHB1dDsKKyAgZ2Jvb2xlYW4gYWxsX2VtcHR5ID0gRkFMU0U7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFJUUF9JU19TRVNTSU9OIChzZXNzKSwgR1NUX0ZMT1dfRVJST1IpOworCisgIEdTVF9ERUJVRyAoInJlcG9ydGluZyBhdCAlIiBHU1RfVElNRV9GT1JNQVQgIiwgTlRQIHRpbWUgJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAiLCBydW5uaW5nLXRpbWUgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChjdXJyZW50X3RpbWUpLAorICAgICAgR1NUX1RJTUVfQVJHUyAobnRwbnN0aW1lKSwgR1NUX1RJTUVfQVJHUyAocnVubmluZ190aW1lKSk7CisKKyAgZGF0YS5zZXNzID0gc2VzczsKKyAgZGF0YS5jdXJyZW50X3RpbWUgPSBjdXJyZW50X3RpbWU7CisgIGRhdGEubnRwbnN0aW1lID0gbnRwbnN0aW1lOworICBkYXRhLnJ1bm5pbmdfdGltZSA9IHJ1bm5pbmdfdGltZTsKKyAgZGF0YS5udW1fdG9fcmVwb3J0ID0gMDsKKyAgZGF0YS5tYXlfc3VwcHJlc3MgPSBGQUxTRTsKKyAgZGF0YS5uYWNrZWRfc2VxbnVtcyA9IDA7CisgIGdfcXVldWVfaW5pdCAoJmRhdGEub3V0cHV0KTsKKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgLyogZ2V0IGEgbmV3IGludGVydmFsLCB3ZSBuZWVkIHRoaXMgZm9yIHZhcmlvdXMgY2xlYW51cHMgZXRjICovCisgIGRhdGEuaW50ZXJ2YWwgPSBjYWxjdWxhdGVfcnRjcF9pbnRlcnZhbCAoc2VzcywgVFJVRSwgc2Vzcy0+Zmlyc3RfcnRjcCk7CisKKyAgR1NUX0RFQlVHICgiaW50ZXJ2YWwgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChkYXRhLmludGVydmFsKSk7CisKKyAgLyogd2UgbmVlZCBhbiBpbnRlcm5hbCBzb3VyY2Ugbm93ICovCisgIGlmIChzZXNzLT5zdGF0cy5pbnRlcm5hbF9zb3VyY2VzID09IDApIHsKKyAgICBSVFBTb3VyY2UgKnNvdXJjZTsKKyAgICBnYm9vbGVhbiBjcmVhdGVkOworCisgICAgc291cmNlID0gb2J0YWluX2ludGVybmFsX3NvdXJjZSAoc2Vzcywgc2Vzcy0+c3VnZ2VzdGVkX3NzcmMsICZjcmVhdGVkLAorICAgICAgICBjdXJyZW50X3RpbWUpOworICAgIHNlc3MtPmludGVybmFsX3NzcmNfc2V0ID0gVFJVRTsKKworICAgIGlmIChjcmVhdGVkKQorICAgICAgb25fbmV3X3NlbmRlcl9zc3JjIChzZXNzLCBzb3VyY2UpOworCisgICAgZ19vYmplY3RfdW5yZWYgKHNvdXJjZSk7CisgIH0KKworICBzZXNzLT5jb25mbGljdGluZ19hZGRyZXNzZXMgPQorICAgICAgdGltZW91dF9jb25mbGljdGluZ19hZGRyZXNzZXMgKHNlc3MtPmNvbmZsaWN0aW5nX2FkZHJlc3NlcywgY3VycmVudF90aW1lKTsKKworICAvKiBNYWtlIGEgbG9jYWwgY29weSBvZiB0aGUgaGFzaHRhYmxlLiBXZSBuZWVkIHRvIGRvIHRoaXMgYmVjYXVzZSB0aGUKKyAgICogY2xlYW51cCBzdGFnZSBiZWxvdyByZWxlYXNlcyB0aGUgc2Vzc2lvbiBsb2NrLiAqLworICB0YWJsZV9jb3B5ID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnX29iamVjdF91bnJlZik7CisgIGdfaGFzaF90YWJsZV9mb3JlYWNoIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0sCisgICAgICAoR0hGdW5jKSBjbG9uZV9zc3Jjc19oYXNodGFibGUsIHRhYmxlX2NvcHkpOworCisgIC8qIENsZWFuIHVwIHRoZSBzZXNzaW9uLCBtYXJrIHRoZSBzb3VyY2UgZm9yIHJlbW92aW5nLCB0aGlzIG1pZ2h0IHJlbGVhc2UgdGhlCisgICAqIHNlc3Npb24gbG9jay4gKi8KKyAgZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKHRhYmxlX2NvcHksIChHSEZ1bmMpIHNlc3Npb25fY2xlYW51cCwgJmRhdGEpOworICBnX2hhc2hfdGFibGVfZGVzdHJveSAodGFibGVfY29weSk7CisKKyAgLyogTm93IHJlbW92ZSB0aGUgbWFya2VkIHNvdXJjZXMgKi8KKyAgZ19oYXNoX3RhYmxlX2ZvcmVhY2hfcmVtb3ZlIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0sCisgICAgICAoR0hSRnVuYykgcmVtb3ZlX2Nsb3Npbmdfc291cmNlcywgJmRhdGEpOworCisgIC8qIHVwZGF0ZSBwb2ludC10by1wb2ludCBzdGF0dXMgKi8KKyAgc2Vzc2lvbl91cGRhdGVfcHRwIChzZXNzKTsKKworICAvKiBzZWUgaWYgd2UgbmVlZCB0byBnZW5lcmF0ZSBTUiBvciBSUiBwYWNrZXRzICovCisgIGlmICghaXNfcnRjcF90aW1lIChzZXNzLCBjdXJyZW50X3RpbWUsICZkYXRhKSkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogY2hlY2sgaWYgYWxsIHRoZSBidWZmZXJzIGFyZSBlbXB0eSBhZmVyIGdlbmVyYXRpb24gKi8KKyAgYWxsX2VtcHR5ID0gVFJVRTsKKworICBHU1RfREVCVUcKKyAgICAgICgiZG9pbmcgUlRDUCBnZW5lcmF0aW9uICV1IGZvciAldSBzb3VyY2VzLCBlYXJseSAlZCwgbWF5IHN1cHByZXNzICVkIiwKKyAgICAgIHNlc3MtPmdlbmVyYXRpb24sIGRhdGEubnVtX3RvX3JlcG9ydCwgZGF0YS5pc19lYXJseSwgZGF0YS5tYXlfc3VwcHJlc3MpOworCisgIC8qIGdlbmVyYXRlIFJUQ1AgZm9yIGFsbCBpbnRlcm5hbCBzb3VyY2VzICovCisgIGdfaGFzaF90YWJsZV9mb3JlYWNoIChzZXNzLT5zc3Jjc1tzZXNzLT5tYXNrX2lkeF0sCisgICAgICAoR0hGdW5jKSBnZW5lcmF0ZV9ydGNwLCAmZGF0YSk7CisKKyAgLyogdXBkYXRlIHRoZSBnZW5lcmF0aW9uIGZvciBhbGwgdGhlIHNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcmVwb3J0ZWQgKi8KKyAgZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKHNlc3MtPnNzcmNzW3Nlc3MtPm1hc2tfaWR4XSwKKyAgICAgIChHSEZ1bmMpIHVwZGF0ZV9nZW5lcmF0aW9uLCAmZGF0YSk7CisKKyAgLyogd2Uga2VlcCB0cmFjayBvZiB0aGUgbGFzdCByZXBvcnQgdGltZSBpbiBvcmRlciB0byB0aW1lb3V0IGluYWN0aXZlCisgICAqIHJlY2VpdmVycyBvciBzZW5kZXJzICovCisgIGlmICghZGF0YS5pc19lYXJseSkgeworICAgIEdTVF9ERUJVRyAoIlRpbWUgc2luY2UgbGFzdCByZWd1bGFyIFJUQ1A6ICUiIEdTVF9USU1FX0ZPUk1BVCAiIC0gJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFUICIgPSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGRhdGEuY3VycmVudF90aW1lKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoc2Vzcy0+bGFzdF9ydGNwX3NlbmRfdGltZSksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGRhdGEuY3VycmVudF90aW1lIC0gc2Vzcy0+bGFzdF9ydGNwX3NlbmRfdGltZSkpOworICAgIHNlc3MtPmxhc3RfcnRjcF9zZW5kX3RpbWUgPSBkYXRhLmN1cnJlbnRfdGltZTsKKyAgfQorCisgIEdTVF9ERUJVRyAoIlRpbWUgc2luY2UgbGFzdCBSVENQOiAlIiBHU1RfVElNRV9GT1JNQVQgIiAtICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiA9ICUiIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAoZGF0YS5jdXJyZW50X3RpbWUpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoc2Vzcy0+bGFzdF9ydGNwX2NoZWNrX3RpbWUpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoZGF0YS5jdXJyZW50X3RpbWUgLSBzZXNzLT5sYXN0X3J0Y3BfY2hlY2tfdGltZSkpOworICBzZXNzLT5sYXN0X3J0Y3BfY2hlY2tfdGltZSA9IGRhdGEuY3VycmVudF90aW1lOworICBzZXNzLT5maXJzdF9ydGNwID0gRkFMU0U7CisgIHNlc3MtPm5leHRfZWFybHlfcnRjcF90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgc2Vzcy0+c2NoZWR1bGVkX2J5ZSA9IEZBTFNFOworCitkb25lOgorICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIC8qIG5vdGlmeSBhYm91dCB1cGRhdGVkIHN0YXRpc3RpY3MgKi8KKyAgZ19vYmplY3Rfbm90aWZ5IChHX09CSkVDVCAoc2VzcyksICJzdGF0cyIpOworCisgIC8qIHB1c2ggb3V0IHRoZSBSVENQIHBhY2tldHMgKi8KKyAgd2hpbGUgKChvdXRwdXQgPSBnX3F1ZXVlX3BvcF9oZWFkICgmZGF0YS5vdXRwdXQpKSkgeworICAgIGdib29sZWFuIGRvX25vdF9zdXBwcmVzcywgZW1wdHlfYnVmZmVyOworICAgIEdzdEJ1ZmZlciAqYnVmZmVyID0gb3V0cHV0LT5idWZmZXI7CisgICAgUlRQU291cmNlICpzb3VyY2UgPSBvdXRwdXQtPnNvdXJjZTsKKworICAgIC8qIEdpdmUgdGhlIHVzZXIgYSBjaGFuZ2UgdG8gYWRkIGl0cyBvd24gcGFja2V0ICovCisgICAgZ19zaWduYWxfZW1pdCAoc2VzcywgcnRwX3Nlc3Npb25fc2lnbmFsc1tTSUdOQUxfT05fU0VORElOR19SVENQXSwgMCwKKyAgICAgICAgYnVmZmVyLCBkYXRhLmlzX2Vhcmx5LCAmZG9fbm90X3N1cHByZXNzKTsKKworICAgIGVtcHR5X2J1ZmZlciA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikgPT0gMDsKKworICAgIGlmICghZW1wdHlfYnVmZmVyKQorICAgICAgYWxsX2VtcHR5ID0gRkFMU0U7CisKKyAgICBpZiAoc2Vzcy0+Y2FsbGJhY2tzLnNlbmRfcnRjcCAmJgorICAgICAgICAhZW1wdHlfYnVmZmVyICYmIChkb19ub3Rfc3VwcHJlc3MgfHwgIWRhdGEubWF5X3N1cHByZXNzKSkgeworICAgICAgZ3VpbnQgcGFja2V0X3NpemU7CisKKyAgICAgIHBhY2tldF9zaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKSArIHNlc3MtPmhlYWRlcl9sZW47CisKKyAgICAgIFVQREFURV9BVkcgKHNlc3MtPnN0YXRzLmF2Z19ydGNwX3BhY2tldF9zaXplLCBwYWNrZXRfc2l6ZSk7CisgICAgICBHU1RfREVCVUcgKCIlcCwgc2VuZGluZyBSVENQIHBhY2tldCwgYXZnIHNpemUgJXUsICV1IiwgJnNlc3MtPnN0YXRzLAorICAgICAgICAgIHNlc3MtPnN0YXRzLmF2Z19ydGNwX3BhY2tldF9zaXplLCBwYWNrZXRfc2l6ZSk7CisgICAgICByZXN1bHQgPQorICAgICAgICAgIHNlc3MtPmNhbGxiYWNrcy5zZW5kX3J0Y3AgKHNlc3MsIHNvdXJjZSwgYnVmZmVyLAorICAgICAgICAgIHJ0cF9zZXNzaW9uX2FyZV9hbGxfc291cmNlc19ieWUgKHNlc3MpLCBzZXNzLT5zZW5kX3J0Y3BfdXNlcl9kYXRhKTsKKworICAgICAgUlRQX1NFU1NJT05fTE9DSyAoc2Vzcyk7CisgICAgICBzZXNzLT5zdGF0cy5uYWNrc19zZW50ICs9IGRhdGEubmFja2VkX3NlcW51bXM7CisgICAgICBvbl9zZW5kZXJfc3NyY19hY3RpdmUgKHNlc3MsIHNvdXJjZSk7CisgICAgICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUcgKCJmcmVlaW5nIHBhY2tldCBjYWxsYmFjazogJXAiCisgICAgICAgICAgIiBlbXB0eV9idWZmZXI6ICVkLCAiCisgICAgICAgICAgIiBkb19ub3Rfc3VwcHJlc3M6ICVkIG1heV9zdXBwcmVzczogJWQiLCBzZXNzLT5jYWxsYmFja3Muc2VuZF9ydGNwLAorICAgICAgICAgIGVtcHR5X2J1ZmZlciwgZG9fbm90X3N1cHByZXNzLCBkYXRhLm1heV9zdXBwcmVzcyk7CisgICAgICBpZiAoIWVtcHR5X2J1ZmZlcikgeworICAgICAgICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgICAgICAgc2Vzcy0+c3RhdHMubmFja3NfZHJvcHBlZCArPSBkYXRhLm5hY2tlZF9zZXFudW1zOworICAgICAgICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICAgICAgfQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICB9CisgICAgZ19vYmplY3RfdW5yZWYgKHNvdXJjZSk7CisgICAgZ19zbGljZV9mcmVlIChSZXBvcnRPdXRwdXQsIG91dHB1dCk7CisgIH0KKworICBpZiAoYWxsX2VtcHR5KQorICAgIEdTVF9FUlJPUiAoImdlbmVyYXRlZCBlbXB0eSBSVENQIG1lc3NhZ2VzIGZvciBhbGwgdGhlIHNvdXJjZXMiKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX3JlcXVlc3RfZWFybHlfcnRjcDoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQGN1cnJlbnRfdGltZTogdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUKKyAqIEBtYXhfZGVsYXk6IG1heGltdW0gZGVsYXkKKyAqCisgKiBSZXF1ZXN0IHRyYW5zbWlzc2lvbiBvZiBlYXJseSBSVENQCisgKgorICogUmV0dXJuczogJVRSVUUgaWYgdGhlIHJlbGF0ZWQgUlRDUCBjYW4gYmUgc2NoZWR1bGVkLgorICovCitnYm9vbGVhbgorcnRwX3Nlc3Npb25fcmVxdWVzdF9lYXJseV9ydGNwIChSVFBTZXNzaW9uICogc2VzcywgR3N0Q2xvY2tUaW1lIGN1cnJlbnRfdGltZSwKKyAgICBHc3RDbG9ja1RpbWUgbWF4X2RlbGF5KQoreworICBHc3RDbG9ja1RpbWUgVF9kaXRoZXJfbWF4LCBUX3JyLCBvZmZzZXQgPSAwOworICBnYm9vbGVhbiByZXQ7CisgIGdib29sZWFuIGFsbG93X2Vhcmx5OworCisgIC8qIEltcGxlbWVudHMgdGhlIGFsZ29yaXRobSBkZXNjcmliZWQgaW4gUkZDIDQ1ODUgc2VjdGlvbiAzLjUuMiAqLworCisgIFJUUF9TRVNTSU9OX0xPQ0sgKHNlc3MpOworCisgIC8qIFdlIGFzc3VtZSBhIGZlZWRiYWNrIHByb2ZpbGUgaWYgc29tZXRoaW5nIGlzIHJlcXVlc3RpbmcgUlRDUAorICAgKiB0byBiZSBzZW50ICovCisgIHNlc3MtPnJ0cF9wcm9maWxlID0gR1NUX1JUUF9QUk9GSUxFX0FWUEY7CisKKyAgLyogQ2hlY2sgaWYgYWxyZWFkeSByZXF1ZXN0ZWQgKi8KKyAgLyogIFJGQyA0NTg1IHNlY3Rpb24gMy41LjIgc3RlcCAyICovCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc2Vzcy0+bmV4dF9lYXJseV9ydGNwX3RpbWUpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNlc3MsICJhbHJlYWR5IGhhdmUgbmV4dCBlYXJseSBydGNwIHRpbWUiKTsKKyAgICByZXQgPSAoY3VycmVudF90aW1lICsgbWF4X2RlbGF5ID4gc2Vzcy0+bmV4dF9lYXJseV9ydGNwX3RpbWUpOworICAgIGdvdG8gZW5kOworICB9CisKKyAgaWYgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNlc3MsICJubyBuZXh0IFJUQ1AgY2hlY2sgdGltZSIpOworICAgIHJldCA9IEZBTFNFOworICAgIGdvdG8gZW5kOworICB9CisKKyAgLyogUkZDIDQ1ODUgc2VjdGlvbiAzLjUuMyBzdGVwIDEKKyAgICogSWYgbm8gcmVndWxhciBSVENQIHBhY2tldCBoYXMgYmVlbiBzZW50IGJlZm9yZSwgdGhlbiBhIHJlZ3VsYXIKKyAgICogUlRDUCBwYWNrZXQgaGFzIHRvIGJlIHNjaGVkdWxlZCBmaXJzdCBhbmQgRkIgbWVzc2FnZXMgbWlnaHQgYmUKKyAgICogaW5jbHVkZWQgdGhlcmUKKyAgICovCisgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHNlc3MtPmxhc3RfcnRjcF9zZW5kX3RpbWUpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNlc3MsICJubyBSVENQIHNlbnQgeWV0Iik7CisKKyAgICBpZiAoY3VycmVudF90aW1lICsgbWF4X2RlbGF5ID4gc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzZXNzLAorICAgICAgICAgICJuZXh0IHNjaGVkdWxlZCB0aW1lIGlzIHNvb24gJSIgR1NUX1RJTUVfRk9STUFUICIgKyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAiID4gJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChjdXJyZW50X3RpbWUpLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKG1heF9kZWxheSksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUpKTsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzZXNzLAorICAgICAgICAgICJjYW4ndCBhbGxvdyBlYXJseSBmZWVkYmFjaywgbmV4dCBzY2hlZHVsZWQgdGltZSBpcyB0b28gbGF0ZSAlIgorICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiICsgJSIgR1NUX1RJTUVfRk9STUFUICIgPCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoY3VycmVudF90aW1lKSwgR1NUX1RJTUVfQVJHUyAobWF4X2RlbGF5KSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChzZXNzLT5uZXh0X3J0Y3BfY2hlY2tfdGltZSkpOworICAgICAgcmV0ID0gRkFMU0U7CisgICAgfQorICAgIGdvdG8gZW5kOworICB9CisKKyAgVF9yciA9IHNlc3MtPmxhc3RfcnRjcF9pbnRlcnZhbDsKKworICAvKiAgUkZDIDQ1ODUgc2VjdGlvbiAzLjUuMiBzdGVwIDJiICovCisgIC8qIElmIHRoZSB0b3RhbCBzb3VyY2VzIGlzIDw9MiwgdGhlbiB0aGVyZSBpcyBvbmx5IHVzIGFuZCBvbmUgcGVlciAqLworICAvKiBXaGVuIHRoZXJlIGlzIG9uZSBhdXhpbGlhcnkgc3RyZWFtIHRoZSBzZXNzaW9uIGNhbiBzdGlsbCBkbyBwb2ludAorICAgKiB0byBwb2ludC4KKyAgICovCisgIGlmIChzZXNzLT5pc19kb2luZ19wdHApIHsKKyAgICBUX2RpdGhlcl9tYXggPSAwOworICB9IGVsc2UgeworICAgIC8qIERpdmlkZSBieSAyIGJlY2F1c2UgbCA9IDAuNSAqLworICAgIFRfZGl0aGVyX21heCA9IFRfcnI7CisgICAgVF9kaXRoZXJfbWF4IC89IDI7CisgIH0KKworICAvKiAgUkZDIDQ1ODUgc2VjdGlvbiAzLjUuMiBzdGVwIDMgKi8KKyAgaWYgKGN1cnJlbnRfdGltZSArIFRfZGl0aGVyX21heCA+IHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNlc3MsCisgICAgICAgICJkb24ndCBzZW5kIGJlY2F1c2Ugb2YgZGl0aGVyLCBuZXh0IHNjaGVkdWxlZCB0aW1lIGlzIHRvbyBzb29uICUiCisgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiICsgJSIgR1NUX1RJTUVfRk9STUFUICIgPiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGN1cnJlbnRfdGltZSksIEdTVF9USU1FX0FSR1MgKFRfZGl0aGVyX21heCksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHNlc3MtPm5leHRfcnRjcF9jaGVja190aW1lKSk7CisgICAgcmV0ID0gVF9kaXRoZXJfbWF4IDw9IG1heF9kZWxheTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIC8qICBSRkMgNDU4NSBzZWN0aW9uIDMuNS4yIHN0ZXAgNGEgYW5kCisgICAqICBSRkMgNDU4NSBzZWN0aW9uIDMuNS4yIHN0ZXAgNiAqLworICBhbGxvd19lYXJseSA9IEZBTFNFOworICBpZiAoc2Vzcy0+bGFzdF9ydGNwX2NoZWNrX3RpbWUgPT0gc2Vzcy0+bGFzdF9ydGNwX3NlbmRfdGltZSkgeworICAgIC8qIExhc3QgdGltZSB3ZSBzZW50IGEgZnVsbCBSVENQIHBhY2tldCwgd2UgY2FuIG5vdyBpbW1lZGlhdGVseQorICAgICAqIHNlbmQgYW4gZWFybHkgb25lIGFzIGFsbG93X2Vhcmx5IHdhcyByZXNldCB0byBUUlVFICovCisgICAgYWxsb3dfZWFybHkgPSBUUlVFOworICB9IGVsc2UgaWYgKHNlc3MtPmxhc3RfcnRjcF9jaGVja190aW1lICsgVF9yciA8PSBjdXJyZW50X3RpbWUgKyBtYXhfZGVsYXkpIHsKKyAgICAvKiBMYXN0IHBhY2tldCB3ZSBzZW50IHdhcyBhbiBlYXJseSBSVENQIHBhY2tldCBhbmQgbW9yZSB0aGFuCisgICAgICogVF9yciBoYXMgcGFzc2VkIHNpbmNlIHRoZW4sIG1lYW5pbmcgd2Ugd291bGQgaGF2ZSBzdXBwcmVzc2VkCisgICAgICogYSByZWd1bGFyIFJUQ1AgcGFja2V0IGFscmVhZHkgYW5kIHJlc2V0IGFsbG93X2Vhcmx5IHRvIFRSVUUgKi8KKyAgICBhbGxvd19lYXJseSA9IFRSVUU7CisKKyAgICAvKiBXZSBoYXZlIHRvIG9mZnNldCBhIGJpdCBhcyBUX3JyIGhhcyBub3QgcGFzc2VkIHlldCwgYnV0IHdpbGwgYmVmb3JlCisgICAgICogbWF4X2RlbGF5ICovCisgICAgaWYgKHNlc3MtPmxhc3RfcnRjcF9jaGVja190aW1lICsgVF9yciA+IGN1cnJlbnRfdGltZSkKKyAgICAgIG9mZnNldCA9IChzZXNzLT5sYXN0X3J0Y3BfY2hlY2tfdGltZSArIFRfcnIpIC0gY3VycmVudF90aW1lOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlc3MsCisgICAgICAgICJjYW4ndCBhbGxvdyBlYXJseSBSVENQIHlldDogbGFzdCByZWd1bGFyICUiIEdTVF9USU1FX0ZPUk1BVCAiLCAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiArICUiIEdTVF9USU1FX0ZPUk1BVCAiID4gJSIgR1NUX1RJTUVfRk9STUFUICIgKyAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHNlc3MtPmxhc3RfcnRjcF9zZW5kX3RpbWUpLAorICAgICAgICBHU1RfVElNRV9BUkdTIChzZXNzLT5sYXN0X3J0Y3BfY2hlY2tfdGltZSksIEdTVF9USU1FX0FSR1MgKFRfcnIpLAorICAgICAgICBHU1RfVElNRV9BUkdTIChjdXJyZW50X3RpbWUpLCBHU1RfVElNRV9BUkdTIChtYXhfZGVsYXkpKTsKKyAgfQorCisgIGlmICghYWxsb3dfZWFybHkpIHsKKyAgICAvKiBJZ25vcmUgdGhlIHJlcXVlc3QgYSBzY2hlZHVsZWQgcGFja2V0IHdpbGwgYmUgaW4gdGltZSBhbnl3YXkgKi8KKyAgICBpZiAoY3VycmVudF90aW1lICsgbWF4X2RlbGF5ID4gc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzZXNzLAorICAgICAgICAgICJuZXh0IHNjaGVkdWxlZCB0aW1lIGlzIHNvb24gJSIgR1NUX1RJTUVfRk9STUFUICIgKyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAiID4gJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChjdXJyZW50X3RpbWUpLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKG1heF9kZWxheSksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc2Vzcy0+bmV4dF9ydGNwX2NoZWNrX3RpbWUpKTsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzZXNzLAorICAgICAgICAgICJjYW4ndCBhbGxvdyBlYXJseSBmZWVkYmFjayBhbmQgbmV4dCBzY2hlZHVsZWQgdGltZSBpcyB0b28gbGF0ZSAlIgorICAgICAgICAgIEdTVF9USU1FX0ZPUk1BVCAiICsgJSIgR1NUX1RJTUVfRk9STUFUICIgPCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoY3VycmVudF90aW1lKSwgR1NUX1RJTUVfQVJHUyAobWF4X2RlbGF5KSwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChzZXNzLT5uZXh0X3J0Y3BfY2hlY2tfdGltZSkpOworICAgICAgcmV0ID0gRkFMU0U7CisgICAgfQorICAgIGdvdG8gZW5kOworICB9CisKKyAgLyogIFJGQyA0NTg1IHNlY3Rpb24gMy41LjIgc3RlcCA0YiAqLworICBpZiAoVF9kaXRoZXJfbWF4KSB7CisgICAgLyogU2NoZWR1bGUgYW4gZWFybHkgdHJhbnNtaXNzaW9uIGxhdGVyICovCisgICAgc2Vzcy0+bmV4dF9lYXJseV9ydGNwX3RpbWUgPSBnX3JhbmRvbV9kb3VibGUgKCkgKiBUX2RpdGhlcl9tYXggKworICAgICAgICBjdXJyZW50X3RpbWUgKyBvZmZzZXQ7CisgIH0gZWxzZSB7CisgICAgLyogSWYgbm8gZGl0aGVyaW5nLCBzY2hlZHVsZSBpdCBmb3IgTk9XICovCisgICAgc2Vzcy0+bmV4dF9lYXJseV9ydGNwX3RpbWUgPSBjdXJyZW50X3RpbWUgKyBvZmZzZXQ7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoc2VzcywgIm5leHQgZWFybHkgUlRDUCB0aW1lICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiwgbmV4dCByZWd1bGFyIFJUQ1AgdGltZSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChzZXNzLT5uZXh0X2Vhcmx5X3J0Y3BfdGltZSksCisgICAgICBHU1RfVElNRV9BUkdTIChzZXNzLT5uZXh0X3J0Y3BfY2hlY2tfdGltZSkpOworICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworCisgIC8qIG5vdGlmeSBhcHAgb2YgbmVlZCB0byBzZW5kIHBhY2tldCBlYXJseQorICAgKiBhbmQgdGhlcmVmb3JlIG9mIHRpbWVvdXQgY2hhbmdlICovCisgIGlmIChzZXNzLT5jYWxsYmFja3MucmVjb25zaWRlcikKKyAgICBzZXNzLT5jYWxsYmFja3MucmVjb25zaWRlciAoc2Vzcywgc2Vzcy0+cmVjb25zaWRlcl91c2VyX2RhdGEpOworCisgIHJldHVybiBUUlVFOworCitlbmQ6CisKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3J0cF9zZXNzaW9uX3NlbmRfcnRjcCAoUlRQU2Vzc2lvbiAqIHNlc3MsIEdzdENsb2NrVGltZSBtYXhfZGVsYXkpCit7CisgIEdzdENsb2NrVGltZSBub3c7CisKKyAgaWYgKCFzZXNzLT5jYWxsYmFja3Muc2VuZF9ydGNwKQorICAgIHJldHVybiBGQUxTRTsKKworICBub3cgPSBzZXNzLT5jYWxsYmFja3MucmVxdWVzdF90aW1lIChzZXNzLCBzZXNzLT5yZXF1ZXN0X3RpbWVfdXNlcl9kYXRhKTsKKworICByZXR1cm4gcnRwX3Nlc3Npb25fcmVxdWVzdF9lYXJseV9ydGNwIChzZXNzLCBub3csIG1heF9kZWxheSk7Cit9CisKK2dib29sZWFuCitydHBfc2Vzc2lvbl9yZXF1ZXN0X2tleV91bml0IChSVFBTZXNzaW9uICogc2VzcywgZ3VpbnQzMiBzc3JjLAorICAgIGdib29sZWFuIGZpciwgZ2ludCBjb3VudCkKK3sKKyAgUlRQU291cmNlICpzcmM7CisKKyAgaWYgKCFydHBfc2Vzc2lvbl9zZW5kX3J0Y3AgKHNlc3MsIDUgKiBHU1RfU0VDT05EKSkgeworICAgIEdTVF9ERUJVRyAoIkZJUi9QTEkgbm90IHNlbnQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgc3JjID0gZmluZF9zb3VyY2UgKHNlc3MsIHNzcmMpOworICBpZiAoc3JjID09IE5VTEwpCisgICAgZ290byBub19zb3VyY2U7CisKKyAgaWYgKGZpcikgeworICAgIHNyYy0+c2VuZF9wbGkgPSBGQUxTRTsKKyAgICBzcmMtPnNlbmRfZmlyID0gVFJVRTsKKworICAgIGlmIChjb3VudCA9PSAtMSB8fCBjb3VudCAhPSBzcmMtPmxhc3RfZmlyX2NvdW50KQorICAgICAgc3JjLT5jdXJyZW50X3NlbmRfZmlyX3NlcW51bSsrOworICAgIHNyYy0+bGFzdF9maXJfY291bnQgPSBjb3VudDsKKyAgfSBlbHNlIGlmICghc3JjLT5zZW5kX2ZpcikgeworICAgIHNyYy0+c2VuZF9wbGkgPSBUUlVFOworICB9CisgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19zb3VyY2U6CisgIHsKKyAgICBSVFBfU0VTU0lPTl9VTkxPQ0sgKHNlc3MpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKioKKyAqIHJ0cF9zZXNzaW9uX3JlcXVlc3RfbmFjazoKKyAqIEBzZXNzOiBhICNSVFBTZXNzaW9uCisgKiBAc3NyYzogdGhlIFNTUkMKKyAqIEBzZXFudW06IHRoZSBtaXNzaW5nIHNlcW51bQorICogQG1heF9kZWxheTogbWF4IGRlbGF5IHRvIHJlcXVlc3QgTkFDSworICoKKyAqIFJlcXVlc3Qgc2NoZWR1bGluZyBvZiBhIE5BQ0sgZmVlZGJhY2sgcGFja2V0IGZvciBAc2VxbnVtIGluIEBzc3JjLgorICoKKyAqIFJldHVybnM6ICVUUlVFIGlmIHRoZSBOQUNLIGZlZWRiYWNrIGNvdWxkIGJlIHNjaGVkdWxlZAorICovCitnYm9vbGVhbgorcnRwX3Nlc3Npb25fcmVxdWVzdF9uYWNrIChSVFBTZXNzaW9uICogc2VzcywgZ3VpbnQzMiBzc3JjLCBndWludDE2IHNlcW51bSwKKyAgICBHc3RDbG9ja1RpbWUgbWF4X2RlbGF5KQoreworICBSVFBTb3VyY2UgKnNvdXJjZTsKKworICBpZiAoIXJ0cF9zZXNzaW9uX3NlbmRfcnRjcCAoc2VzcywgbWF4X2RlbGF5KSkgeworICAgIEdTVF9ERUJVRyAoIk5BQ0sgbm90IHNlbnQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBSVFBfU0VTU0lPTl9MT0NLIChzZXNzKTsKKyAgc291cmNlID0gZmluZF9zb3VyY2UgKHNlc3MsIHNzcmMpOworICBpZiAoc291cmNlID09IE5VTEwpCisgICAgZ290byBub19zb3VyY2U7CisKKyAgR1NUX0RFQlVHICgicmVxdWVzdCBOQUNLIGZvciAlMDh4LCAjJXUiLCBzc3JjLCBzZXFudW0pOworICBydHBfc291cmNlX3JlZ2lzdGVyX25hY2sgKHNvdXJjZSwgc2VxbnVtKTsKKyAgUlRQX1NFU1NJT05fVU5MT0NLIChzZXNzKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK25vX3NvdXJjZToKKyAgeworICAgIFJUUF9TRVNTSU9OX1VOTE9DSyAoc2Vzcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmggYi9nc3QvcnRwbWFuYWdlci9ydHBzZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNhOGE4MgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL3J0cHNlc3Npb24uaApAQCAtMCwwICsxLDQwNCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19SVFBfU0VTU0lPTl9IX18KKyNkZWZpbmUgX19SVFBfU0VTU0lPTl9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgInJ0cHNvdXJjZS5oIgorCit0eXBlZGVmIHN0cnVjdCBfUlRQU2Vzc2lvbiBSVFBTZXNzaW9uOwordHlwZWRlZiBzdHJ1Y3QgX1JUUFNlc3Npb25DbGFzcyBSVFBTZXNzaW9uQ2xhc3M7CisKKyNkZWZpbmUgUlRQX1RZUEVfU0VTU0lPTiAgICAgICAgICAgICAocnRwX3Nlc3Npb25fZ2V0X3R5cGUoKSkKKyNkZWZpbmUgUlRQX1NFU1NJT04oc2VzcykgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKHNlc3MpLFJUUF9UWVBFX1NFU1NJT04sUlRQU2Vzc2lvbikpCisjZGVmaW5lIFJUUF9TRVNTSU9OX0NMQVNTKGtsYXNzKSAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksUlRQX1RZUEVfU0VTU0lPTixSVFBTZXNzaW9uQ2xhc3MpKQorI2RlZmluZSBSVFBfSVNfU0VTU0lPTihzZXNzKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgoc2VzcyksUlRQX1RZUEVfU0VTU0lPTikpCisjZGVmaW5lIFJUUF9JU19TRVNTSU9OX0NMQVNTKGtsYXNzKSAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksUlRQX1RZUEVfU0VTU0lPTikpCisjZGVmaW5lIFJUUF9TRVNTSU9OX0NBU1Qoc2VzcykgICAgICAgKChSVFBTZXNzaW9uICopKHNlc3MpKQorCisjZGVmaW5lIFJUUF9TRVNTSU9OX0xPQ0soc2VzcykgICAgIChnX211dGV4X2xvY2sgKCYoc2VzcyktPmxvY2spKQorI2RlZmluZSBSVFBfU0VTU0lPTl9VTkxPQ0soc2VzcykgICAoZ19tdXRleF91bmxvY2sgKCYoc2VzcyktPmxvY2spKQorCisvKioKKyAqIFJUUFNlc3Npb25Qcm9jZXNzUlRQOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKiBAc3JjOiB0aGUgI1JUUFNvdXJjZQorICogQGJ1ZmZlcjogdGhlIFJUUCBidWZmZXIgcmVhZHkgZm9yIHByb2Nlc3NpbmcKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YSBzcGVjaWZpZWQgd2hlbiByZWdpc3RlcmluZworICoKKyAqIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbiBAc2VzcyBoYXMgQGJ1ZmZlciByZWFkeSBmb3IgZnVydGhlcgorICogcHJvY2Vzc2luZy4gUHJvY2Vzc2luZyB0aGUgYnVmZmVyIHR5cGljYWxseSBpbmNsdWRlcyBkZWNvZGluZyBhbmQgZGlzcGxheWluZworICogdGhlIGJ1ZmZlci4KKyAqCisgKiBSZXR1cm5zOiBhICNHc3RGbG93UmV0dXJuLgorICovCit0eXBlZGVmIEdzdEZsb3dSZXR1cm4gKCpSVFBTZXNzaW9uUHJvY2Vzc1JUUCkgKFJUUFNlc3Npb24gKnNlc3MsIFJUUFNvdXJjZSAqc3JjLCBHc3RCdWZmZXIgKmJ1ZmZlciwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKworLyoqCisgKiBSVFBTZXNzaW9uU2VuZFJUUDoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQHNyYzogdGhlICNSVFBTb3VyY2UKKyAqIEBidWZmZXI6IHRoZSBSVFAgYnVmZmVyIHJlYWR5IGZvciBzZW5kaW5nCisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgc3BlY2lmaWVkIHdoZW4gcmVnaXN0ZXJpbmcKKyAqCisgKiBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdoZW4gQHNlc3MgaGFzIEBidWZmZXIgcmVhZHkgZm9yIHNlbmRpbmcgdG8KKyAqIGFsbCBsaXN0ZW5pbmcgcGFydGljaXBhbnRzIGluIHRoaXMgc2Vzc2lvbi4KKyAqCisgKiBSZXR1cm5zOiBhICNHc3RGbG93UmV0dXJuLgorICovCit0eXBlZGVmIEdzdEZsb3dSZXR1cm4gKCpSVFBTZXNzaW9uU2VuZFJUUCkgKFJUUFNlc3Npb24gKnNlc3MsIFJUUFNvdXJjZSAqc3JjLCBncG9pbnRlciBkYXRhLCBncG9pbnRlciB1c2VyX2RhdGEpOworCisvKioKKyAqIFJUUFNlc3Npb25TZW5kUlRDUDoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQHNyYzogdGhlICNSVFBTb3VyY2UKKyAqIEBidWZmZXI6IHRoZSBSVENQIGJ1ZmZlciByZWFkeSBmb3Igc2VuZGluZworICogQGVvczogaWYgYW4gRU9TIGV2ZW50IHNob3VsZCBiZSBwdXNoZWQKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YSBzcGVjaWZpZWQgd2hlbiByZWdpc3RlcmluZworICoKKyAqIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbiBAc2VzcyBoYXMgQGJ1ZmZlciByZWFkeSBmb3Igc2VuZGluZyB0bworICogYWxsIGxpc3RlbmluZyBwYXJ0aWNpcGFudHMgaW4gdGhpcyBzZXNzaW9uLgorICoKKyAqIFJldHVybnM6IGEgI0dzdEZsb3dSZXR1cm4uCisgKi8KK3R5cGVkZWYgR3N0Rmxvd1JldHVybiAoKlJUUFNlc3Npb25TZW5kUlRDUCkgKFJUUFNlc3Npb24gKnNlc3MsIFJUUFNvdXJjZSAqc3JjLCBHc3RCdWZmZXIgKmJ1ZmZlciwKKyAgICBnYm9vbGVhbiBlb3MsIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKKy8qKgorICogUlRQU2Vzc2lvblN5bmNSVENQOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKiBAYnVmZmVyOiB0aGUgUlRDUCBidWZmZXIgcmVhZHkgZm9yIHN5bmNocm9uaXNhdGlvbgorICogQHVzZXJfZGF0YTogdXNlciBkYXRhIHNwZWNpZmllZCB3aGVuIHJlZ2lzdGVyaW5nCisgKgorICogVGhpcyBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aGVuIEBzZXNzIGhhcyBhbiBTUiBAYnVmZmVyIHJlYWR5IGZvciBkb2luZworICogc3luY2hyb25pc2F0aW9uIGJldHdlZW4gc3RyZWFtcy4KKyAqCisgKiBSZXR1cm5zOiBhICNHc3RGbG93UmV0dXJuLgorICovCit0eXBlZGVmIEdzdEZsb3dSZXR1cm4gKCpSVFBTZXNzaW9uU3luY1JUQ1ApIChSVFBTZXNzaW9uICpzZXNzLCBHc3RCdWZmZXIgKmJ1ZmZlciwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKworLyoqCisgKiBSVFBTZXNzaW9uQ2xvY2tSYXRlOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKiBAcGF5bG9hZDogdGhlIHBheWxvYWQKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YSBzcGVjaWZpZWQgd2hlbiByZWdpc3RlcmluZworICoKKyAqIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbiBAc2VzcyBuZWVkcyB0aGUgY2xvY2stcmF0ZSBvZiBAcGF5bG9hZC4KKyAqCisgKiBSZXR1cm5zOiB0aGUgY2xvY2stcmF0ZSBvZiBAcHQuCisgKi8KK3R5cGVkZWYgZ2ludCAoKlJUUFNlc3Npb25DbG9ja1JhdGUpIChSVFBTZXNzaW9uICpzZXNzLCBndWludDggcGF5bG9hZCwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKworLyoqCisgKiBSVFBTZXNzaW9uUmVjb25zaWRlcjoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQHVzZXJfZGF0YTogdXNlciBkYXRhIHNwZWNpZmllZCB3aGVuIHJlZ2lzdGVyaW5nCisgKgorICogVGhpcyBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aGVuIEBzZXNzIG5lZWRzIHRvIGNhbmNlbCB0aGUgY3VycmVudCB0aW1lb3V0LgorICogVGhlIGN1cnJlbnRseSBydW5uaW5nIHRpbWVvdXQgc2hvdWxkIGJlIGNhbmNlbGVkIGFuZCBhIG5ldyByZXBvcnRpbmcgaW50ZXJ2YWwKKyAqIHNob3VsZCBiZSByZXF1ZXN0ZWQgZnJvbSBAc2Vzcy4KKyAqLwordHlwZWRlZiB2b2lkICgqUlRQU2Vzc2lvblJlY29uc2lkZXIpIChSVFBTZXNzaW9uICpzZXNzLCBncG9pbnRlciB1c2VyX2RhdGEpOworCisvKioKKyAqIFJUUFNlc3Npb25SZXF1ZXN0S2V5VW5pdDoKKyAqIEBzZXNzOiBhbiAjUlRQU2Vzc2lvbgorICogQHNzcmM6IFNTUkMgb2YgdGhlIHNvdXJjZSByZWxhdGVkIHRvIHRoZSBrZXkgdW5pdCByZXF1ZXN0CisgKiBAYWxsX2hlYWRlcnM6ICVUUlVFIGlmICJhbGwtaGVhZGVycyIgcHJvcGVydHkgc2hvdWxkIGJlIHNldCBvbiB0aGUga2V5IHVuaXQKKyAqICByZXF1ZXN0CisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgc3BlY2lmaWVkIHdoZW4gcmVnaXN0ZXJpbmcKKyAqCisgKiBBc2tzIHRoZSBlbmNvZGVyIHRvIHByb2R1Y2UgYSBrZXkgdW5pdCBhcyBzb29uIGFzIHBvc3NpYmx5IHdpdGhpbiB0aGUKKyAqIGJhbmR3aWR0aCBjb25zdHJhaW50cworICovCit0eXBlZGVmIHZvaWQgKCpSVFBTZXNzaW9uUmVxdWVzdEtleVVuaXQpIChSVFBTZXNzaW9uICpzZXNzLCBndWludDMyIHNzcmMsCisgICAgZ2Jvb2xlYW4gYWxsX2hlYWRlcnMsIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKKy8qKgorICogUlRQU2Vzc2lvblJlcXVlc3RUaW1lOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgc3BlY2lmaWVkIHdoZW4gcmVnaXN0ZXJpbmcKKyAqCisgKiBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdoZW4gQHNlc3MgbmVlZHMgdGhlIGN1cnJlbnQgdGltZS4gVGhlIHRpbWUKKyAqIHNob3VsZCBiZSByZXR1cm5lZCBhcyBhICNHc3RDbG9ja1RpbWUKKyAqLwordHlwZWRlZiBHc3RDbG9ja1RpbWUgKCpSVFBTZXNzaW9uUmVxdWVzdFRpbWUpIChSVFBTZXNzaW9uICpzZXNzLAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKKy8qKgorICogUlRQU2Vzc2lvbk5vdGlmeU5BQ0s6CisgKiBAc2VzczogYW4gI1JUUFNlc3Npb24KKyAqIEBzZXFudW06IHRoZSBtaXNzaW5nIHNlcW51bQorICogQGJscDogb3RoZXIgbWlzc2luZyBzZXFudW1zCisgKiBAc3NyYzogU1NSQyBvZiByZXF1ZXN0ZWQgc3RyZWFtCisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgc3BlY2lmaWVkIHdoZW4gcmVnaXN0ZXJpbmcKKyAqCisgKiBOb3RpZmllcyBvZiBOQUNLZWQgZnJhbWVzLgorICovCit0eXBlZGVmIHZvaWQgKCpSVFBTZXNzaW9uTm90aWZ5TkFDSykgKFJUUFNlc3Npb24gKnNlc3MsCisgICAgZ3VpbnQxNiBzZXFudW0sIGd1aW50MTYgYmxwLCBndWludDMyIHNzcmMsIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKKy8qKgorICogUlRQU2Vzc2lvblJlY29uZmlndXJlOgorICogQHNlc3M6IGFuICNSVFBTZXNzaW9uCisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgc3BlY2lmaWVkIHdoZW4gcmVnaXN0ZXJpbmcKKyAqCisgKiBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdoZW4gQHNlc3Mgd2FudHMgdG8gcmVjb25maWd1cmUgdGhlCisgKiBuZWdvdGlhdGVkIHBhcmFtZXRlcnMuCisgKi8KK3R5cGVkZWYgdm9pZCAoKlJUUFNlc3Npb25SZWNvbmZpZ3VyZSkgKFJUUFNlc3Npb24gKnNlc3MsIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKKy8qKgorICogUlRQU2Vzc2lvbkNhbGxiYWNrczoKKyAqIEBSVFBTZXNzaW9uUHJvY2Vzc1JUUDogY2FsbGJhY2sgdG8gcHJvY2VzcyBSVFAgcGFja2V0cworICogQFJUUFNlc3Npb25TZW5kUlRQOiBjYWxsYmFjayBmb3Igc2VuZGluZyBSVFAgcGFja2V0cworICogQFJUUFNlc3Npb25TZW5kUlRDUDogY2FsbGJhY2sgZm9yIHNlbmRpbmcgUlRDUCBwYWNrZXRzCisgKiBAUlRQU2Vzc2lvblN5bmNSVENQOiBjYWxsYmFjayBmb3IgaGFuZGxpbmcgU1IgcGFja2V0cworICogQFJUUFNlc3Npb25SZWNvbnNpZGVyOiBjYWxsYmFjayBmb3IgcmVjb25zaWRlcmluZyB0aGUgdGltZW91dAorICogQFJUUFNlc3Npb25SZXF1ZXN0S2V5VW5pdDogY2FsbGJhY2sgZm9yIHJlcXVlc3RpbmcgYSBuZXcga2V5IHVuaXQKKyAqIEBSVFBTZXNzaW9uUmVxdWVzdFRpbWU6IGNhbGxiYWNrIGZvciByZXF1ZXN0aW5nIHRoZSBjdXJyZW50IHRpbWUKKyAqIEBSVFBTZXNzaW9uTm90aWZ5TkFDSzogY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBOQUNLCisgKiBAUlRQU2Vzc2lvblJlY29uZmlndXJlOiBjYWxsYmFjayBmb3IgcmVxdWVzdGluZyByZWNvbmZpZ3VyYXRpb24KKyAqCisgKiBUaGVzZSBjYWxsYmFja3MgY2FuIGJlIGluc3RhbGxlZCBvbiB0aGUgc2Vzc2lvbiBtYW5hZ2VyIHRvIGdldCBub3RpZmljYXRpb24KKyAqIHdoZW4gUlRQIGFuZCBSVENQIHBhY2tldHMgYXJlIHJlYWR5IGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuIFRoZXNlIGNhbGxiYWNrcworICogYXJlIG5vdCBpbXBsZW1lbnRlZCB3aXRoIHNpZ25hbHMgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgUlRQU2Vzc2lvblByb2Nlc3NSVFAgIHByb2Nlc3NfcnRwOworICBSVFBTZXNzaW9uU2VuZFJUUCAgICAgc2VuZF9ydHA7CisgIFJUUFNlc3Npb25TeW5jUlRDUCAgICBzeW5jX3J0Y3A7CisgIFJUUFNlc3Npb25TZW5kUlRDUCAgICBzZW5kX3J0Y3A7CisgIFJUUFNlc3Npb25DbG9ja1JhdGUgICBjbG9ja19yYXRlOworICBSVFBTZXNzaW9uUmVjb25zaWRlciAgcmVjb25zaWRlcjsKKyAgUlRQU2Vzc2lvblJlcXVlc3RLZXlVbml0IHJlcXVlc3Rfa2V5X3VuaXQ7CisgIFJUUFNlc3Npb25SZXF1ZXN0VGltZSByZXF1ZXN0X3RpbWU7CisgIFJUUFNlc3Npb25Ob3RpZnlOQUNLICBub3RpZnlfbmFjazsKKyAgUlRQU2Vzc2lvblJlY29uZmlndXJlIHJlY29uZmlndXJlOworfSBSVFBTZXNzaW9uQ2FsbGJhY2tzOworCisvKioKKyAqIFJUUFNlc3Npb246CisgKiBAbG9jazogbG9jayB0byBwcm90ZWN0IHRoZSBzZXNzaW9uCisgKiBAc291cmNlOiB0aGUgc291cmNlIG9mIHRoaXMgc2Vzc2lvbgorICogQHNzcmNzOiBIYXNodGFibGUgb2Ygc291cmNlcyBpbmRleGVkIGJ5IFNTUkMKKyAqIEBudW1fc291cmNlczogdGhlIG51bWJlciBvZiBzb3VyY2VzCisgKiBAYWN0aXZlY291bnQ6IHRoZSBudW1iZXIgb2YgYWN0aXZlIHNvdXJjZXMKKyAqIEBjYWxsYmFja3M6IGNhbGxiYWNrcworICogQHVzZXJfZGF0YTogdXNlciBkYXRhIHBhc3NlZCBpbiBjYWxsYmFja3MKKyAqIEBzdGF0czogc2Vzc2lvbiBzdGF0aXN0aWNzCisgKiBAY29uZmxpY3RpbmdfYWRkcmVzc2VzOiBHTGlzdCBvZiBjb25mbGljdGluZyBhZGRyZXNzZXMKKyAqCisgKiBUaGUgUlRQIHNlc3Npb24gbWFuYWdlciBvYmplY3QKKyAqLworc3RydWN0IF9SVFBTZXNzaW9uIHsKKyAgR09iamVjdCAgICAgICBvYmplY3Q7CisKKyAgR011dGV4ICAgICAgICBsb2NrOworCisgIGd1aW50ICAgICAgICAgaGVhZGVyX2xlbjsKKyAgZ3VpbnQgICAgICAgICBtdHU7CisKKyAgR3N0U3RydWN0dXJlICpzZGVzOworCisgIGd1aW50ICAgICAgICAgcHJvYmF0aW9uOworICBndWludDMyICAgICAgIG1heF9kcm9wb3V0X3RpbWU7CisgIGd1aW50MzIgICAgICAgbWF4X21pc29yZGVyX3RpbWU7CisKKyAgR3N0UlRQUHJvZmlsZSBydHBfcHJvZmlsZTsKKworICBnYm9vbGVhbiAgICAgIHJlZHVjZWRfc2l6ZV9ydGNwOworCisgIC8qIGJhbmR3aWR0aHMgKi8KKyAgZ2Jvb2xlYW4gICAgIHJlY2FsY19iYW5kd2lkdGg7CisgIGd1aW50ICAgICAgICBiYW5kd2lkdGg7CisgIGdkb3VibGUgICAgICBydGNwX2JhbmR3aWR0aDsKKyAgZ3VpbnQgICAgICAgIHJ0Y3BfcnJfYmFuZHdpZHRoOworICBndWludCAgICAgICAgcnRjcF9yc19iYW5kd2lkdGg7CisKKyAgZ3VpbnQzMiAgICAgICBzdWdnZXN0ZWRfc3NyYzsKKyAgZ2Jvb2xlYW4gICAgICBpbnRlcm5hbF9zc3JjX3NldDsKKyAgZ2Jvb2xlYW4gICAgICBpbnRlcm5hbF9zc3JjX2Zyb21fY2Fwc19vcl9wcm9wZXJ0eTsKKworICAvKiBmb3Igc2VuZGVyL3JlY2VpdmVyIGNvdW50aW5nICovCisgIGd1aW50MzIgICAgICAga2V5OworICBndWludDMyICAgICAgIG1hc2tfaWR4OworICBndWludDMyICAgICAgIG1hc2s7CisgIEdIYXNoVGFibGUgICAqc3NyY3NbMzJdOworICBndWludCAgICAgICAgIHRvdGFsX3NvdXJjZXM7CisKKyAgZ3VpbnQxNiAgICAgICBnZW5lcmF0aW9uOworICBHc3RDbG9ja1RpbWUgIG5leHRfcnRjcF9jaGVja190aW1lOyAvKiB0biAqLworICBHc3RDbG9ja1RpbWUgIGxhc3RfcnRjcF9jaGVja190aW1lOyAvKiB0cCAqLworICBHc3RDbG9ja1RpbWUgIGxhc3RfcnRjcF9zZW5kX3RpbWU7ICAvKiB0X3JyX2xhc3QgKi8KKyAgR3N0Q2xvY2tUaW1lICBsYXN0X3J0Y3BfaW50ZXJ2YWw7ICAgLyogVF9yciAqLworICBHc3RDbG9ja1RpbWUgIHN0YXJ0X3RpbWU7CisgIGdib29sZWFuICAgICAgZmlyc3RfcnRjcDsKKyAgZ2Jvb2xlYW4gICAgICBhbGxvd19lYXJseTsKKworICBHc3RDbG9ja1RpbWUgIG5leHRfZWFybHlfcnRjcF90aW1lOworCisgIGdib29sZWFuICAgICAgc2NoZWR1bGVkX2J5ZTsKKworICBSVFBTZXNzaW9uQ2FsbGJhY2tzICAgY2FsbGJhY2tzOworICBncG9pbnRlciAgICAgICAgICAgICAgcHJvY2Vzc19ydHBfdXNlcl9kYXRhOworICBncG9pbnRlciAgICAgICAgICAgICAgc2VuZF9ydHBfdXNlcl9kYXRhOworICBncG9pbnRlciAgICAgICAgICAgICAgc2VuZF9ydGNwX3VzZXJfZGF0YTsKKyAgZ3BvaW50ZXIgICAgICAgICAgICAgIHN5bmNfcnRjcF91c2VyX2RhdGE7CisgIGdwb2ludGVyICAgICAgICAgICAgICBjbG9ja19yYXRlX3VzZXJfZGF0YTsKKyAgZ3BvaW50ZXIgICAgICAgICAgICAgIHJlY29uc2lkZXJfdXNlcl9kYXRhOworICBncG9pbnRlciAgICAgICAgICAgICAgcmVxdWVzdF9rZXlfdW5pdF91c2VyX2RhdGE7CisgIGdwb2ludGVyICAgICAgICAgICAgICByZXF1ZXN0X3RpbWVfdXNlcl9kYXRhOworICBncG9pbnRlciAgICAgICAgICAgICAgbm90aWZ5X25hY2tfdXNlcl9kYXRhOworICBncG9pbnRlciAgICAgICAgICAgICAgcmVjb25maWd1cmVfdXNlcl9kYXRhOworCisgIFJUUFNlc3Npb25TdGF0cyBzdGF0czsKKyAgUlRQU2Vzc2lvblN0YXRzIGJ5ZV9zdGF0czsKKworICBnYm9vbGVhbiAgICAgIGZhdm9yX25ldzsKKyAgR3N0Q2xvY2tUaW1lICBydGNwX2ZlZWRiYWNrX3JldGVudGlvbl93aW5kb3c7CisgIGd1aW50ICAgICAgICAgcnRjcF9pbW1lZGlhdGVfZmVlZGJhY2tfdGhyZXNob2xkOworCisgIGdib29sZWFuICAgICAgaXNfZG9pbmdfcHRwOworCisgIEdMaXN0ICAgICAgICAgKmNvbmZsaWN0aW5nX2FkZHJlc3NlczsKK307CisKKy8qKgorICogUlRQU2Vzc2lvbkNsYXNzOgorICogQG9uX25ld19zc3JjOiBlbWl0ZWQgd2hlbiBhIG5ldyBzb3VyY2UgaXMgZm91bmQKKyAqIEBvbl9ieWVfc3NyYzogZW1pdGVkIHdoZW4gYSBzb3VyY2UgaXMgZ29uZQorICoKKyAqIFRoZSBzZXNzaW9uIGNsYXNzLgorICovCitzdHJ1Y3QgX1JUUFNlc3Npb25DbGFzcyB7CisgIEdPYmplY3RDbGFzcyAgIHBhcmVudF9jbGFzczsKKworICAvKiBhY3Rpb24gc2lnbmFscyAqLworICBSVFBTb3VyY2UqICgqZ2V0X3NvdXJjZV9ieV9zc3JjKSAoUlRQU2Vzc2lvbiAqc2VzcywgZ3VpbnQzMiBzc3JjKTsKKworICAvKiBzaWduYWxzICovCisgIHZvaWQgKCpvbl9uZXdfc3NyYykgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIFJUUFNvdXJjZSAqc291cmNlKTsKKyAgdm9pZCAoKm9uX3NzcmNfY29sbGlzaW9uKSAoUlRQU2Vzc2lvbiAqc2VzcywgUlRQU291cmNlICpzb3VyY2UpOworICB2b2lkICgqb25fc3NyY192YWxpZGF0ZWQpIChSVFBTZXNzaW9uICpzZXNzLCBSVFBTb3VyY2UgKnNvdXJjZSk7CisgIHZvaWQgKCpvbl9zc3JjX2FjdGl2ZSkgICAgKFJUUFNlc3Npb24gKnNlc3MsIFJUUFNvdXJjZSAqc291cmNlKTsKKyAgdm9pZCAoKm9uX3NzcmNfc2RlcykgICAgICAoUlRQU2Vzc2lvbiAqc2VzcywgUlRQU291cmNlICpzb3VyY2UpOworICB2b2lkICgqb25fYnllX3NzcmMpICAgICAgIChSVFBTZXNzaW9uICpzZXNzLCBSVFBTb3VyY2UgKnNvdXJjZSk7CisgIHZvaWQgKCpvbl9ieWVfdGltZW91dCkgICAgKFJUUFNlc3Npb24gKnNlc3MsIFJUUFNvdXJjZSAqc291cmNlKTsKKyAgdm9pZCAoKm9uX3RpbWVvdXQpICAgICAgICAoUlRQU2Vzc2lvbiAqc2VzcywgUlRQU291cmNlICpzb3VyY2UpOworICB2b2lkICgqb25fc2VuZGVyX3RpbWVvdXQpIChSVFBTZXNzaW9uICpzZXNzLCBSVFBTb3VyY2UgKnNvdXJjZSk7CisgIGdib29sZWFuICgqb25fc2VuZGluZ19ydGNwKSAoUlRQU2Vzc2lvbiAqc2VzcywgR3N0QnVmZmVyICpidWZmZXIsCisgICAgICBnYm9vbGVhbiBlYXJseSk7CisgIHZvaWQgKCpvbl9hcHBfcnRjcCkgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIGd1aW50IHN1YnR5cGUsIGd1aW50IHNzcmMsCisgICAgICBjb25zdCBnY2hhciAqbmFtZSwgR3N0QnVmZmVyICpkYXRhKTsKKyAgdm9pZCAoKm9uX2ZlZWRiYWNrX3J0Y3ApICAoUlRQU2Vzc2lvbiAqc2VzcywgZ3VpbnQgdHlwZSwgZ3VpbnQgZmJ0eXBlLAorICAgICAgZ3VpbnQgc2VuZGVyX3NzcmMsIGd1aW50IG1lZGlhX3NzcmMsIEdzdEJ1ZmZlciAqZmNpKTsKKyAgZ2Jvb2xlYW4gKCpzZW5kX3J0Y3ApICAgICAoUlRQU2Vzc2lvbiAqc2VzcywgR3N0Q2xvY2tUaW1lIG1heF9kZWxheSk7CisgIHZvaWQgKCpvbl9yZWNlaXZpbmdfcnRjcCkgKFJUUFNlc3Npb24gKnNlc3MsIEdzdEJ1ZmZlciAqYnVmZmVyKTsKKyAgdm9pZCAoKm9uX25ld19zZW5kZXJfc3NyYykgICAgIChSVFBTZXNzaW9uICpzZXNzLCBSVFBTb3VyY2UgKnNvdXJjZSk7CisgIHZvaWQgKCpvbl9zZW5kZXJfc3NyY19hY3RpdmUpICAoUlRQU2Vzc2lvbiAqc2VzcywgUlRQU291cmNlICpzb3VyY2UpOworfTsKKworR1R5cGUgcnRwX3Nlc3Npb25fZ2V0X3R5cGUgKHZvaWQpOworCisvKiBjcmVhdGUgYW5kIGNvbmZpZ3VyZSAqLworUlRQU2Vzc2lvbiogICAgIHJ0cF9zZXNzaW9uX25ldyAgICAgICAgICAgKHZvaWQpOwordm9pZCAgICAgICAgICAgIHJ0cF9zZXNzaW9uX3NldF9jYWxsYmFja3MgICAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUUFNlc3Npb25DYWxsYmFja3MgKmNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciB1c2VyX2RhdGEpOwordm9pZCAgICAgICAgICAgIHJ0cF9zZXNzaW9uX3NldF9wcm9jZXNzX3J0cF9jYWxsYmFjayAgIChSVFBTZXNzaW9uICogc2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVFBTZXNzaW9uUHJvY2Vzc1JUUCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciB1c2VyX2RhdGEpOwordm9pZCAgICAgICAgICAgIHJ0cF9zZXNzaW9uX3NldF9zZW5kX3J0cF9jYWxsYmFjayAgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUUFNlc3Npb25TZW5kUlRQIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyIHVzZXJfZGF0YSk7Cit2b2lkICAgICAgICAgICAgcnRwX3Nlc3Npb25fc2V0X3NlbmRfcnRjcF9jYWxsYmFjayAgIChSVFBTZXNzaW9uICogc2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVFBTZXNzaW9uU2VuZFJUQ1AgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3ZvaWQgICAgICAgICAgICBydHBfc2Vzc2lvbl9zZXRfc3luY19ydGNwX2NhbGxiYWNrICAgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUUFNlc3Npb25TeW5jUlRDUCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciB1c2VyX2RhdGEpOwordm9pZCAgICAgICAgICAgIHJ0cF9zZXNzaW9uX3NldF9jbG9ja19yYXRlX2NhbGxiYWNrICAgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUUFNlc3Npb25DbG9ja1JhdGUgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3ZvaWQgICAgICAgICAgICBydHBfc2Vzc2lvbl9zZXRfcmVjb25zaWRlcl9jYWxsYmFjayAoUlRQU2Vzc2lvbiAqIHNlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRQU2Vzc2lvblJlY29uc2lkZXIgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3ZvaWQgICAgICAgICAgICBydHBfc2Vzc2lvbl9zZXRfcmVxdWVzdF90aW1lX2NhbGxiYWNrIChSVFBTZXNzaW9uICogc2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVFBTZXNzaW9uUmVxdWVzdFRpbWUgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKwordm9pZCAgICAgICAgICAgIHJ0cF9zZXNzaW9uX3NldF9iYW5kd2lkdGggICAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIGdkb3VibGUgYmFuZHdpZHRoKTsKK2dkb3VibGUgICAgICAgICBydHBfc2Vzc2lvbl9nZXRfYmFuZHdpZHRoICAgICAgICAgIChSVFBTZXNzaW9uICpzZXNzKTsKK3ZvaWQgICAgICAgICAgICBydHBfc2Vzc2lvbl9zZXRfcnRjcF9mcmFjdGlvbiAgICAgIChSVFBTZXNzaW9uICpzZXNzLCBnZG91YmxlIGZyYWN0aW9uKTsKK2dkb3VibGUgICAgICAgICBydHBfc2Vzc2lvbl9nZXRfcnRjcF9mcmFjdGlvbiAgICAgIChSVFBTZXNzaW9uICpzZXNzKTsKKworR3N0U3RydWN0dXJlICogIHJ0cF9zZXNzaW9uX2dldF9zZGVzX3N0cnVjdCAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MpOwordm9pZCAgICAgICAgICAgIHJ0cF9zZXNzaW9uX3NldF9zZGVzX3N0cnVjdCAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIGNvbnN0IEdzdFN0cnVjdHVyZSAqc2Rlcyk7CisKKy8qIGhhbmRsaW5nIHNvdXJjZXMgKi8KK2d1aW50MzIgICAgICAgICBydHBfc2Vzc2lvbl9zdWdnZXN0X3NzcmMgICAgICAgICAgIChSVFBTZXNzaW9uICpzZXNzLCBnYm9vbGVhbiAqaXNfcmFuZG9tKTsKKworZ2Jvb2xlYW4gICAgICAgIHJ0cF9zZXNzaW9uX2FkZF9zb3VyY2UgICAgICAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIFJUUFNvdXJjZSAqc3JjKTsKK2d1aW50ICAgICAgICAgICBydHBfc2Vzc2lvbl9nZXRfbnVtX3NvdXJjZXMgICAgICAgIChSVFBTZXNzaW9uICpzZXNzKTsKK2d1aW50ICAgICAgICAgICBydHBfc2Vzc2lvbl9nZXRfbnVtX2FjdGl2ZV9zb3VyY2VzIChSVFBTZXNzaW9uICpzZXNzKTsKK1JUUFNvdXJjZSogICAgICBydHBfc2Vzc2lvbl9nZXRfc291cmNlX2J5X3NzcmMgICAgIChSVFBTZXNzaW9uICpzZXNzLCBndWludDMyIHNzcmMpOworUlRQU291cmNlKiAgICAgIHJ0cF9zZXNzaW9uX2NyZWF0ZV9zb3VyY2UgICAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MpOworCisvKiBwcm9jZXNzaW5nIHBhY2tldHMgZnJvbSByZWNlaXZlcnMgKi8KK0dzdEZsb3dSZXR1cm4gICBydHBfc2Vzc2lvbl9wcm9jZXNzX3J0cCAgICAgICAgICAgIChSVFBTZXNzaW9uICpzZXNzLCBHc3RCdWZmZXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lLAorCQkJCQkJICAgIEdzdENsb2NrVGltZSBydW5uaW5nX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCBudHBuc3RpbWUpOworR3N0Rmxvd1JldHVybiAgIHJ0cF9zZXNzaW9uX3Byb2Nlc3NfcnRjcCAgICAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIEdzdEJ1ZmZlciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCBudHBuc3RpbWUpOworCisvKiBwcm9jZXNzaW5nIHBhY2tldHMgZm9yIHNlbmRpbmcgKi8KK3ZvaWQgICAgICAgICAgICBydHBfc2Vzc2lvbl91cGRhdGVfc2VuZF9jYXBzICAgICAgIChSVFBTZXNzaW9uICpzZXNzLCBHc3RDYXBzICpjYXBzKTsKK0dzdEZsb3dSZXR1cm4gICBydHBfc2Vzc2lvbl9zZW5kX3J0cCAgICAgICAgICAgICAgIChSVFBTZXNzaW9uICpzZXNzLCBncG9pbnRlciBkYXRhLCBnYm9vbGVhbiBpc19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUsIEdzdENsb2NrVGltZSBydW5uaW5nX3RpbWUpOworCisvKiBzY2hlZHVsaW5nIGJ5ZSAqLwordm9pZCAgICAgICAgICAgIHJ0cF9zZXNzaW9uX21hcmtfYWxsX2J5ZSAgICAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIGNvbnN0IGdjaGFyICpyZWFzb24pOworR3N0Rmxvd1JldHVybiAgIHJ0cF9zZXNzaW9uX3NjaGVkdWxlX2J5ZSAgICAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUpOworCisvKiBnZXQgaW50ZXJ2YWwgZm9yIG5leHQgUlRDUCBpbnRlcnZhbCAqLworR3N0Q2xvY2tUaW1lICAgIHJ0cF9zZXNzaW9uX25leHRfdGltZW91dCAgICAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUpOworR3N0Rmxvd1JldHVybiAgIHJ0cF9zZXNzaW9uX29uX3RpbWVvdXQgICAgICAgICAgICAgKFJUUFNlc3Npb24gKnNlc3MsIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQ2NCBudHBuc3RpbWUsIEdzdENsb2NrVGltZSBydW5uaW5nX3RpbWUpOworCisvKiByZXF1ZXN0IHRoZSB0cmFuc21pdHRpb24gb2YgYW4gZWFybHkgUlRDUCBwYWNrZXQgKi8KK2dib29sZWFuICAgICAgICBydHBfc2Vzc2lvbl9yZXF1ZXN0X2Vhcmx5X3J0Y3AgICAgIChSVFBTZXNzaW9uICogc2VzcywgR3N0Q2xvY2tUaW1lIGN1cnJlbnRfdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RDbG9ja1RpbWUgbWF4X2RlbGF5KTsKKworLyogTm90aWZ5IHNlc3Npb24gb2YgYSByZXF1ZXN0IGZvciBhIG5ldyBrZXkgdW5pdCAqLworZ2Jvb2xlYW4gICAgICAgIHJ0cF9zZXNzaW9uX3JlcXVlc3Rfa2V5X3VuaXQgICAgICAgKFJUUFNlc3Npb24gKiBzZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgc3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYm9vbGVhbiBmaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCBjb3VudCk7CitnYm9vbGVhbiAgICAgICAgcnRwX3Nlc3Npb25fcmVxdWVzdF9uYWNrICAgICAgICAgICAoUlRQU2Vzc2lvbiAqIHNlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBzc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MTYgc2VxbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENsb2NrVGltZSBtYXhfZGVsYXkpOworCisKKyNlbmRpZiAvKiBfX1JUUF9TRVNTSU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmMgYi9nc3QvcnRwbWFuYWdlci9ydHBzb3VyY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzI2NDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmMKQEAgLTAsMCArMSwxOTQ4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpICAyMDE1IEt1cmVudG8gKGh0dHA6Ly9rdXJlbnRvLm9yZy8pCisgKiAgIEBhdXRob3I6IE1pZ3VlbCBQYXLDrXMgPG1wYXJpc2RpYXpAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRjcGJ1ZmZlci5oPgorCisjaW5jbHVkZSAicnRwc291cmNlLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHJ0cF9zb3VyY2VfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgcnRwX3NvdXJjZV9kZWJ1ZworCisjZGVmaW5lIFJUUF9NQVhfUFJPQkFUSU9OX0xFTiAgMzIKKworLyogc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICBMQVNUX1NJR05BTAorfTsKKworI2RlZmluZSBERUZBVUxUX1NTUkMgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9JU19DU1JDICAgICAgICAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX0lTX1ZBTElEQVRFRCAgICAgICAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfSVNfU0VOREVSICAgICAgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9TREVTICAgICAgICAgICAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfUFJPQkFUSU9OICAgICAgICAgICAgUlRQX0RFRkFVTFRfUFJPQkFUSU9OCisjZGVmaW5lIERFRkFVTFRfTUFYX0RST1BPVVRfVElNRSAgICAgNjAwMDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfTUlTT1JERVJfVElNRSAgICAyMDAwCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX1NTUkMsCisgIFBST1BfSVNfQ1NSQywKKyAgUFJPUF9JU19WQUxJREFURUQsCisgIFBST1BfSVNfU0VOREVSLAorICBQUk9QX1NERVMsCisgIFBST1BfU1RBVFMsCisgIFBST1BfUFJPQkFUSU9OLAorICBQUk9QX01BWF9EUk9QT1VUX1RJTUUsCisgIFBST1BfTUFYX01JU09SREVSX1RJTUUKK307CisKKy8qIEdPYmplY3Qgdm1ldGhvZHMgKi8KK3N0YXRpYyB2b2lkIHJ0cF9zb3VyY2VfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgcnRwX3NvdXJjZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBydHBfc291cmNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworLyogc3RhdGljIGd1aW50IHJ0cF9zb3VyY2Vfc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsgKi8KKworR19ERUZJTkVfVFlQRSAoUlRQU291cmNlLCBydHBfc291cmNlLCBHX1RZUEVfT0JKRUNUKTsKKworc3RhdGljIHZvaWQKK3J0cF9zb3VyY2VfY2xhc3NfaW5pdCAoUlRQU291cmNlQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gcnRwX3NvdXJjZV9maW5hbGl6ZTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBydHBfc291cmNlX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gcnRwX3NvdXJjZV9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TU1JDLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJzc3JjIiwgIlNTUkMiLAorICAgICAgICAgICJUaGUgU1NSQyBvZiB0aGlzIHNvdXJjZSIsIDAsIEdfTUFYVUlOVCwgREVGQVVMVF9TU1JDLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lTX0NTUkMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImlzLWNzcmMiLCAiSXMgQ1NSQyIsCisgICAgICAgICAgIklmIHRoaXMgU1NSQyBpcyBhY3RpbmcgYXMgYSBjb250cmlidXRpbmcgc291cmNlIiwKKyAgICAgICAgICBERUZBVUxUX0lTX0NTUkMsIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9JU19WQUxJREFURUQsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImlzLXZhbGlkYXRlZCIsICJJcyBWYWxpZGF0ZWQiLAorICAgICAgICAgICJJZiB0aGlzIFNTUkMgaXMgdmFsaWRhdGVkIiwgREVGQVVMVF9JU19WQUxJREFURUQsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lTX1NFTkRFUiwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiaXMtc2VuZGVyIiwgIklzIFNlbmRlciIsCisgICAgICAgICAgIklmIHRoaXMgU1NSQyBpcyBhIHNlbmRlciIsIERFRkFVTFRfSVNfU0VOREVSLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIFJUUFNvdXJjZTo6c2RlcworICAgKgorICAgKiBUaGUgY3VycmVudCBTREVTIGl0ZW1zIG9mIHRoZSBzb3VyY2UuIFJldHVybnMgYSBzdHJ1Y3R1cmUgd2l0aCBuYW1lCisgICAqIGFwcGxpY2F0aW9uL3gtcnRwLXNvdXJjZS1zZGVzIGFuZCBtYXkgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkczoKKyAgICoKKyAgICogICdjbmFtZScgICAgICAgR19UWVBFX1NUUklORyAgOiBUaGUgY2Fub25pY2FsIG5hbWUgaW4gdGhlIGZvcm0gdXNlckBob3N0CisgICAqICAnbmFtZScgICAgICAgIEdfVFlQRV9TVFJJTkcgIDogVGhlIHVzZXIgbmFtZQorICAgKiAgJ2VtYWlsJyAgICAgICBHX1RZUEVfU1RSSU5HICA6IFRoZSB1c2VyJ3MgZWxlY3Ryb25pYyBtYWlsIGFkZHJlc3MKKyAgICogICdwaG9uZScgICAgICAgR19UWVBFX1NUUklORyAgOiBUaGUgdXNlcidzIHBob25lIG51bWJlcgorICAgKiAgJ2xvY2F0aW9uJyAgICBHX1RZUEVfU1RSSU5HICA6IFRoZSBnZW9ncmFwaGljIHVzZXIgbG9jYXRpb24KKyAgICogICd0b29sJyAgICAgICAgR19UWVBFX1NUUklORyAgOiBUaGUgbmFtZSBvZiBhcHBsaWNhdGlvbiBvciB0b29sCisgICAqICAnbm90ZScgICAgICAgIEdfVFlQRV9TVFJJTkcgIDogQSBub3RpY2UgYWJvdXQgdGhlIHNvdXJjZQorICAgKgorICAgKiAgT3RoZXIgZmllbGRzIG1heSBiZSBwcmVzZW50IGFuZCB0aGVzZSByZXByZXNlbnQgcHJpdmF0ZSBpdGVtcyBpbgorICAgKiAgdGhlIFNERVMgd2hlcmUgdGhlIGZpZWxkIG5hbWUgaXMgdGhlIHByZWZpeC4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU0RFUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoInNkZXMiLCAiU0RFUyIsCisgICAgICAgICAgIlRoZSBTREVTIGluZm9ybWF0aW9uIGZvciB0aGlzIHNvdXJjZSIsCisgICAgICAgICAgR1NUX1RZUEVfU1RSVUNUVVJFLCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBSVFBTb3VyY2U6OnN0YXRzCisgICAqCisgICAqIFRoaXMgcHJvcGVydHkgcmV0dXJucyBhIEdzdFN0cnVjdHVyZSBuYW1lZCBhcHBsaWNhdGlvbi94LXJ0cC1zb3VyY2Utc3RhdHMgd2l0aAorICAgKiBmaWVsZHMgdXNlZnVsIGZvciBzdGF0aXN0aWNzIGFuZCBkaWFnbm9zdGljcy4KKyAgICoKKyAgICogVGFrZSBub3RlIG9mIGVhY2ggcmVzcGVjdGl2ZSBmaWVsZCdzIHVuaXRzOgorICAgKgorICAgKiAtIE5UUCB0aW1lcyBhcmUgaW4gdGhlIGFwcHJvcHJpYXRlIDMyLWJpdCBvciA2NC1iaXQgZml4ZWQtcG9pbnQgZm9ybWF0CisgICAqICAgc3RhcnRpbmcgZnJvbSBKYW51YXJ5IDEsIDE5NzAgKGV4Y2VwdCBmb3IgdGltZXNwYW5zKS4KKyAgICogLSBSVFAgdGltZXMgYXJlIGluIGNsb2NrIHJhdGUgdW5pdHMgKGkuZS4gY2xvY2sgcmF0ZSA9IDEgc2Vjb25kKQorICAgKiAgIHN0YXJ0aW5nIGF0IGEgcmFuZG9tIG9mZnNldC4KKyAgICogLSBGb3IgZmllbGRzIGluZGljYXRpbmcgcGFja2V0IGxvc3MsIG5vdGUgdGhhdCBsYXRlIHBhY2tldHMgYXJlIG5vdCBjb25zaWRlcmVkIGxvc3QsCisgICAqICAgYW5kIGR1cGxpY2F0ZXMgYXJlIG5vdCB0YWtlbiBpbnRvIGFjY291bnQuIEhlbmNlLCB0aGUgbG9zcyBtYXkgYmUgbmVnYXRpdmUKKyAgICogICBpZiB0aGVyZSBhcmUgZHVwbGljYXRlcy4KKyAgICoKKyAgICogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIGFsd2F5cyBwcmVzZW50LgorICAgKgorICAgKiAgInNzcmMiICAgICAgICAgR19UWVBFX1VJTlQgICAgIHRoZSBTU1JDIG9mIHRoaXMgc291cmNlCisgICAqICAiaW50ZXJuYWwiICAgICBHX1RZUEVfQk9PTEVBTiAgdGhpcyBzb3VyY2UgaXMgYSBzb3VyY2Ugb2YgdGhlIHNlc3Npb24KKyAgICogICJ2YWxpZGF0ZWQiICAgIEdfVFlQRV9CT09MRUFOICB0aGUgc291cmNlIGlzIHZhbGlkYXRlZAorICAgKiAgInJlY2VpdmVkLWJ5ZSIgR19UWVBFX0JPT0xFQU4gIHdlIHJlY2VpdmVkIGEgQllFIGZyb20gdGhpcyBzb3VyY2UKKyAgICogICJpcy1jc3JjIiAgICAgIEdfVFlQRV9CT09MRUFOICB0aGlzIHNvdXJjZSB3YXMgZm91bmQgYXMgQ1NSQworICAgKiAgImlzLXNlbmRlciIgICAgR19UWVBFX0JPT0xFQU4gIHRoaXMgc291cmNlIGlzIGEgc2VuZGVyCisgICAqICAic2VxbnVtLWJhc2UiICBHX1RZUEVfSU5UICAgICAgZmlyc3Qgc2VxbnVtIGlmIGtub3duCisgICAqICAiY2xvY2stcmF0ZSIgICBHX1RZUEVfSU5UICAgICAgdGhlIGNsb2NrIHJhdGUgb2YgdGhlIG1lZGlhCisgICAqCisgICAqIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBvbmx5IHByZXNlbnQgd2hlbiBrbm93bi4KKyAgICoKKyAgICogICJydHAtZnJvbSIgICAgIEdfVFlQRV9TVFJJTkcgICB3aGVyZSB3ZSByZWNlaXZlZCB0aGUgbGFzdCBSVFAgcGFja2V0IGZyb20KKyAgICogICJydGNwLWZyb20iICAgIEdfVFlQRV9TVFJJTkcgICB3aGVyZSB3ZSByZWNlaXZlZCB0aGUgbGFzdCBSVENQIHBhY2tldCBmcm9tCisgICAqCisgICAqIFRoZSBmb2xsb3dpbmcgZmllbGRzIG1ha2Ugc2Vuc2UgZm9yIGludGVybmFsIHNvdXJjZXMgYW5kIHdpbGwgb25seSBpbmNyZWFzZQorICAgKiB3aGVuICJpcy1zZW5kZXIiIGlzIFRSVUUuCisgICAqCisgICAqICAib2N0ZXRzLXNlbnQiICBHX1RZUEVfVUlOVDY0ICAgbnVtYmVyIG9mIGJ5dGVzIHdlIHNlbnQKKyAgICogICJwYWNrZXRzLXNlbnQiIEdfVFlQRV9VSU5UNjQgICBudW1iZXIgb2YgcGFja2V0cyB3ZSBzZW50CisgICAqCisgICAqIFRoZSBmb2xsb3dpbmcgZmllbGRzIG1ha2Ugc2Vuc2UgZm9yIG5vbi1pbnRlcm5hbCBzb3VyY2VzIGFuZCB3aWxsIG9ubHkKKyAgICogaW5jcmVhc2Ugd2hlbiAiaXMtc2VuZGVyIiBpcyBUUlVFLgorICAgKgorICAgKiAgIm9jdGV0cy1yZWNlaXZlZCIgIEdfVFlQRV9VSU5UNjQgIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWNlaXZlZAorICAgKiAgInBhY2tldHMtcmVjZWl2ZWQiIEdfVFlQRV9VSU5UNjQgIHRvdGFsIG51bWJlciBvZiBwYWNrZXRzIHJlY2VpdmVkCisgICAqCisgICAqIEZvbGxvd2luZyBmaWVsZHMgYXJlIHVwZGF0ZWQgd2hlbiAiaXMtc2VuZGVyIiBpcyBUUlVFLgorICAgKgorICAgKiAgImJpdHJhdGUiICAgICAgR19UWVBFX1VJTlQ2NCAgIGJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kCisgICAqICAiaml0dGVyIiAgICAgICBHX1RZUEVfVUlOVCAgICAgZXN0aW1hdGVkIGppdHRlciAoaW4gY2xvY2sgcmF0ZSB1bml0cykKKyAgICogICJwYWNrZXRzLWxvc3QiIEdfVFlQRV9JTlQgICAgICBlc3RpbWF0ZWQgYW1vdW50IG9mIHBhY2tldHMgbG9zdAorICAgKgorICAgKiBUaGUgbGFzdCBTUiByZXBvcnQgdGhpcyBzb3VyY2Ugc2VudC4gVGhpcyBvbmx5IHVwZGF0ZXMgd2hlbiAiaXMtc2VuZGVyIiBpcworICAgKiBUUlVFLgorICAgKgorICAgKiAgImhhdmUtc3IiICAgICAgICAgR19UWVBFX0JPT0xFQU4gIHRoZSBzb3VyY2UgaGFzIHNlbnQgU1IKKyAgICogICJzci1udHB0aW1lIiAgICAgIEdfVFlQRV9VSU5UNjQgICBOVFAgdGltZSBvZiBTUiAoaW4gTlRQIFRpbWVzdGFtcCBGb3JtYXQsIDMyLjMyIGZpeGVkIHBvaW50KQorICAgKiAgInNyLXJ0cHRpbWUiICAgICAgR19UWVBFX1VJTlQgICAgIFJUUCB0aW1lIG9mIFNSIChpbiBjbG9jayByYXRlIHVuaXRzKQorICAgKiAgInNyLW9jdGV0LWNvdW50IiAgR19UWVBFX1VJTlQgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIFNSCisgICAqICAic3ItcGFja2V0LWNvdW50IiBHX1RZUEVfVUlOVCAgICAgdGhlIG51bWJlciBvZiBwYWNrZXRzIGluIHRoZSBTUgorICAgKgorICAgKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgb25seSBwcmVzZW50IGZvciBub24taW50ZXJuYWwgc291cmNlcyBhbmQKKyAgICogcmVwcmVzZW50IHRoZSBjb250ZW50IG9mIHRoZSBsYXN0IFJCIHBhY2tldCB0aGF0IHdhcyBzZW50IHRvIHRoaXMgc291cmNlLgorICAgKiBUaGVzZSB2YWx1ZXMgYXJlIG9ubHkgdXBkYXRlZCB3aGVuIHRoZSBzb3VyY2UgaXMgc2VuZGluZy4KKyAgICoKKyAgICogICJzZW50LXJiIiAgICAgICAgICAgICAgIEdfVFlQRV9CT09MRUFOICB3ZSBoYXZlIHNlbnQgYW4gUkIKKyAgICogICJzZW50LXJiLWZyYWN0aW9ubG9zdCIgIEdfVFlQRV9VSU5UICAgICBjYWxjdWxhdGVkIGxvc3QgOC1iaXQgZnJhY3Rpb24KKyAgICogICJzZW50LXJiLXBhY2tldHNsb3N0IiAgIEdfVFlQRV9JTlQgICAgICBsb3N0IHBhY2tldHMKKyAgICogICJzZW50LXJiLWV4dGhpZ2hlc3RzZXEiIEdfVFlQRV9VSU5UICAgICBsYXN0IHNlZW4gc2VxbnVtCisgICAqICAic2VudC1yYi1qaXR0ZXIiICAgICAgICBHX1RZUEVfVUlOVCAgICAgaml0dGVyIChpbiBjbG9jayByYXRlIHVuaXRzKQorICAgKiAgInNlbnQtcmItbHNyIiAgICAgICAgICAgR19UWVBFX1VJTlQgICAgIGxhc3QgU1IgdGltZSAoc2Vjb25kcyBpbiBOVFAgU2hvcnQgRm9ybWF0LCAxNi4xNiBmaXhlZCBwb2ludCkKKyAgICogICJzZW50LXJiLWRsc3IiICAgICAgICAgIEdfVFlQRV9VSU5UICAgICBkZWxheSBzaW5jZSBsYXN0IFNSIChzZWNvbmRzIGluIE5UUCBTaG9ydCBGb3JtYXQsIDE2LjE2IGZpeGVkIHBvaW50KQorICAgKgorICAgKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgb25seSBwcmVzZW50IGZvciBub24taW50ZXJuYWwgc291cmNlcyBhbmQKKyAgICogcmVwcmVzZW50cyB0aGUgbGFzdCBSQiB0aGF0IHRoaXMgc291cmNlIHNlbnQuIFRoaXMgaXMgb25seSB1cGRhdGVkCisgICAqIHdoZW4gdGhlIHNvdXJjZSBpcyByZWNlaXZpbmcgZGF0YSBhbmQgc2VuZGluZyBSQiBibG9ja3MuCisgICAqCisgICAqICAiaGF2ZS1yYiIgICAgICAgICAgR19UWVBFX0JPT0xFQU4gIHRoZSBzb3VyY2UgaGFzIHNlbnQgUkIKKyAgICogICJyYi1mcmFjdGlvbmxvc3QiICBHX1RZUEVfVUlOVCAgICAgbG9zdCA4LWJpdCBmcmFjdGlvbgorICAgKiAgInJiLXBhY2tldHNsb3N0IiAgIEdfVFlQRV9JTlQgICAgICBsb3N0IHBhY2tldHMKKyAgICogICJyYi1leHRoaWdoZXN0c2VxIiBHX1RZUEVfVUlOVCAgICAgaGlnaGVzdCByZWNlaXZlZCBzZXFudW0KKyAgICogICJyYi1qaXR0ZXIiICAgICAgICBHX1RZUEVfVUlOVCAgICAgcmVjZXB0aW9uIGppdHRlciAoaW4gY2xvY2sgcmF0ZSB1bml0cykKKyAgICogICJyYi1sc3IiICAgICAgICAgICBHX1RZUEVfVUlOVCAgICAgbGFzdCBTUiB0aW1lIChzZWNvbmRzIGluIE5UUCBTaG9ydCBGb3JtYXQsIDE2LjE2IGZpeGVkIHBvaW50KQorICAgKiAgInJiLWRsc3IiICAgICAgICAgIEdfVFlQRV9VSU5UICAgICBkZWxheSBzaW5jZSBsYXN0IFNSIChzZWNvbmRzIGluIE5UUCBTaG9ydCBGb3JtYXQsIDE2LjE2IGZpeGVkIHBvaW50KQorICAgKgorICAgKiBUaGUgcm91bmQgdHJpcCBvZiB0aGlzIHNvdXJjZSBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIGxhc3QgUkIKKyAgICogdmFsdWVzIGFuZCB0aGUgcmVjZXB0aW9uIHRpbWUgb2YgdGhlIGxhc3QgUkIgcGFja2V0LiBJdCBpcyBvbmx5IHByZXNlbnQgZm9yCisgICAqIG5vbi1pbnRlcm5hbCBzb3VyY2VzLgorICAgKgorICAgKiAgInJiLXJvdW5kLXRyaXAiICAgIEdfVFlQRV9VSU5UICAgICB0aGUgcm91bmQtdHJpcCB0aW1lIChzZWNvbmRzIGluIE5UUCBTaG9ydCBGb3JtYXQsIDE2LjE2IGZpeGVkIHBvaW50KQorICAgKgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TVEFUUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoInN0YXRzIiwgIlN0YXRzIiwKKyAgICAgICAgICAiVGhlIHN0YXRzIG9mIHRoaXMgc291cmNlIiwgR1NUX1RZUEVfU1RSVUNUVVJFLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QUk9CQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoInByb2JhdGlvbiIsICJOdW1iZXIgb2YgcHJvYmF0aW9ucyIsCisgICAgICAgICAgIkNvbnNlY3V0aXZlIHBhY2tldCBzZXF1ZW5jZSBudW1iZXJzIHRvIGFjY2VwdCB0aGUgc291cmNlIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfUFJPQkFUSU9OLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX0RST1BPVVRfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LWRyb3BvdXQtdGltZSIsICJNYXggZHJvcG91dCB0aW1lIiwKKyAgICAgICAgICAiVGhlIG1heGltdW0gdGltZSAobWlsbGlzZWNvbmRzKSBvZiBtaXNzaW5nIHBhY2tldHMgdG9sZXJhdGVkLiIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCBERUZBVUxUX01BWF9EUk9QT1VUX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfTUlTT1JERVJfVElNRSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibWF4LW1pc29yZGVyLXRpbWUiLCAiTWF4IG1pc29yZGVyIHRpbWUiLAorICAgICAgICAgICJUaGUgbWF4aW11bSB0aW1lIChtaWxsaXNlY29uZHMpIG9mIG1pc29yZGVyZWQgcGFja2V0cyB0b2xlcmF0ZWQuIiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIERFRkFVTFRfTUFYX01JU09SREVSX1RJTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0cF9zb3VyY2VfZGVidWcsICJydHBzb3VyY2UiLCAwLCAiUlRQIFNvdXJjZSIpOworfQorCisvKioKKyAqIHJ0cF9zb3VyY2VfcmVzZXQ6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKgorICogUmVzZXQgdGhlIHN0YXRzIG9mIEBzcmMuCisgKi8KK3ZvaWQKK3J0cF9zb3VyY2VfcmVzZXQgKFJUUFNvdXJjZSAqIHNyYykKK3sKKyAgc3JjLT5tYXJrZWRfYnllID0gRkFMU0U7CisgIGlmIChzcmMtPmJ5ZV9yZWFzb24pCisgICAgZ19mcmVlIChzcmMtPmJ5ZV9yZWFzb24pOworICBzcmMtPmJ5ZV9yZWFzb24gPSBOVUxMOworICBzcmMtPnNlbnRfYnllID0gRkFMU0U7CisgIGdfaGFzaF90YWJsZV9yZW1vdmVfYWxsIChzcmMtPnJlcG9ydGVkX2luX3NyX29mKTsKKworICBzcmMtPnN0YXRzLmN5Y2xlcyA9IC0xOworICBzcmMtPnN0YXRzLmppdHRlciA9IDA7CisgIHNyYy0+c3RhdHMudHJhbnNpdCA9IC0xOworICBzcmMtPnN0YXRzLmN1cnJfc3IgPSAwOworICBzcmMtPnN0YXRzLnNyWzBdLmlzX3ZhbGlkID0gRkFMU0U7CisgIHNyYy0+c3RhdHMuY3Vycl9yciA9IDA7CisgIHNyYy0+c3RhdHMucnJbMF0uaXNfdmFsaWQgPSBGQUxTRTsKKyAgc3JjLT5zdGF0cy5wcmV2X3J0cHRpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBzcmMtPnN0YXRzLnByZXZfcnRjcHRpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBzcmMtPnN0YXRzLmxhc3RfcnRwdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIHNyYy0+c3RhdHMubGFzdF9ydGNwdGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIGdfYXJyYXlfc2V0X3NpemUgKHNyYy0+bmFja3MsIDApOworCisgIHNyYy0+c3RhdHMuc2VudF9wbGlfY291bnQgPSAwOworICBzcmMtPnN0YXRzLnNlbnRfZmlyX2NvdW50ID0gMDsKKyAgc3JjLT5zdGF0cy5zZW50X25hY2tfY291bnQgPSAwOworICBzcmMtPnN0YXRzLnJlY3ZfbmFja19jb3VudCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitydHBfc291cmNlX2luaXQgKFJUUFNvdXJjZSAqIHNyYykKK3sKKyAgLyogc291cmNlcyBhcmUgaW5pdGlhbHkgb24gcHJvYmF0aW9uIHVudGlsIHdlIHJlY2VpdmUgZW5vdWdoIHZhbGlkIFJUUAorICAgKiBwYWNrZXRzIG9yIGEgdmFsaWQgUlRDUCBwYWNrZXQgKi8KKyAgc3JjLT52YWxpZGF0ZWQgPSBGQUxTRTsKKyAgc3JjLT5pbnRlcm5hbCA9IEZBTFNFOworICBzcmMtPnByb2JhdGlvbiA9IERFRkFVTFRfUFJPQkFUSU9OOworICBzcmMtPmN1cnJfcHJvYmF0aW9uID0gc3JjLT5wcm9iYXRpb247CisgIHNyYy0+Y2xvc2luZyA9IEZBTFNFOworICBzcmMtPm1heF9kcm9wb3V0X3RpbWUgPSBERUZBVUxUX01BWF9EUk9QT1VUX1RJTUU7CisgIHNyYy0+bWF4X21pc29yZGVyX3RpbWUgPSBERUZBVUxUX01BWF9NSVNPUkRFUl9USU1FOworCisgIHNyYy0+c2RlcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgiYXBwbGljYXRpb24veC1ydHAtc291cmNlLXNkZXMiKTsKKworICBzcmMtPnBheWxvYWQgPSAtMTsKKyAgc3JjLT5jbG9ja19yYXRlID0gLTE7CisgIHNyYy0+cGFja2V0cyA9IGdfcXVldWVfbmV3ICgpOworICBzcmMtPnNlcW51bV9vZmZzZXQgPSAtMTsKKyAgc3JjLT5sYXN0X3J0cHRpbWUgPSAtMTsKKworICBzcmMtPnJldGFpbmVkX2ZlZWRiYWNrID0gZ19xdWV1ZV9uZXcgKCk7CisgIHNyYy0+bmFja3MgPSBnX2FycmF5X25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKGd1aW50MzIpKTsKKworICBzcmMtPnJlcG9ydGVkX2luX3NyX29mID0gZ19oYXNoX3RhYmxlX25ldyAoZ19kaXJlY3RfaGFzaCwgZ19kaXJlY3RfZXF1YWwpOworCisgIHNyYy0+bGFzdF9rZXlmcmFtZV9yZXF1ZXN0ID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBydHBfc291cmNlX3Jlc2V0IChzcmMpOworCisgIHNyYy0+cHRfc2V0ID0gRkFMU0U7Cit9CisKK3ZvaWQKK3J0cF9jb25mbGljdGluZ19hZGRyZXNzX2ZyZWUgKFJUUENvbmZsaWN0aW5nQWRkcmVzcyAqIGFkZHIpCit7CisgIGdfb2JqZWN0X3VucmVmIChhZGRyLT5hZGRyZXNzKTsKKyAgZ19zbGljZV9mcmVlIChSVFBDb25mbGljdGluZ0FkZHJlc3MsIGFkZHIpOworfQorCitzdGF0aWMgdm9pZAorcnRwX3NvdXJjZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgUlRQU291cmNlICpzcmM7CisKKyAgc3JjID0gUlRQX1NPVVJDRV9DQVNUIChvYmplY3QpOworCisgIGdfcXVldWVfZm9yZWFjaCAoc3JjLT5wYWNrZXRzLCAoR0Z1bmMpIGdzdF9idWZmZXJfdW5yZWYsIE5VTEwpOworICBnX3F1ZXVlX2ZyZWUgKHNyYy0+cGFja2V0cyk7CisKKyAgZ3N0X3N0cnVjdHVyZV9mcmVlIChzcmMtPnNkZXMpOworCisgIGdfZnJlZSAoc3JjLT5ieWVfcmVhc29uKTsKKworICBnc3RfY2Fwc19yZXBsYWNlICgmc3JjLT5jYXBzLCBOVUxMKTsKKworICBnX2xpc3RfZnJlZV9mdWxsIChzcmMtPmNvbmZsaWN0aW5nX2FkZHJlc3NlcywKKyAgICAgIChHRGVzdHJveU5vdGlmeSkgcnRwX2NvbmZsaWN0aW5nX2FkZHJlc3NfZnJlZSk7CisgIGdfcXVldWVfZm9yZWFjaCAoc3JjLT5yZXRhaW5lZF9mZWVkYmFjaywgKEdGdW5jKSBnc3RfYnVmZmVyX3VucmVmLCBOVUxMKTsKKyAgZ19xdWV1ZV9mcmVlIChzcmMtPnJldGFpbmVkX2ZlZWRiYWNrKTsKKworICBnX2FycmF5X2ZyZWUgKHNyYy0+bmFja3MsIFRSVUUpOworCisgIGlmIChzcmMtPnJ0cF9mcm9tKQorICAgIGdfb2JqZWN0X3VucmVmIChzcmMtPnJ0cF9mcm9tKTsKKyAgaWYgKHNyYy0+cnRjcF9mcm9tKQorICAgIGdfb2JqZWN0X3VucmVmIChzcmMtPnJ0Y3BfZnJvbSk7CisKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChzcmMtPnJlcG9ydGVkX2luX3NyX29mKTsKKworICBHX09CSkVDVF9DTEFTUyAocnRwX3NvdXJjZV9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdFN0cnVjdHVyZSAqCitydHBfc291cmNlX2NyZWF0ZV9zdGF0cyAoUlRQU291cmNlICogc3JjKQoreworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIGdib29sZWFuIGlzX3NlbmRlciA9IHNyYy0+aXNfc2VuZGVyOworICBnYm9vbGVhbiBpbnRlcm5hbCA9IHNyYy0+aW50ZXJuYWw7CisgIGdjaGFyICphZGRyZXNzX3N0cjsKKyAgZ2Jvb2xlYW4gaGF2ZV9yYjsKKyAgZ3VpbnQ4IGZyYWN0aW9ubG9zdCA9IDA7CisgIGdpbnQzMiBwYWNrZXRzbG9zdCA9IDA7CisgIGd1aW50MzIgZXh0aGlnaGVzdHNlcSA9IDA7CisgIGd1aW50MzIgaml0dGVyID0gMDsKKyAgZ3VpbnQzMiBsc3IgPSAwOworICBndWludDMyIGRsc3IgPSAwOworICBndWludDMyIHJvdW5kX3RyaXAgPSAwOworICBnYm9vbGVhbiBoYXZlX3NyOworICBHc3RDbG9ja1RpbWUgdGltZSA9IDA7CisgIGd1aW50NjQgbnRwdGltZSA9IDA7CisgIGd1aW50MzIgcnRwdGltZSA9IDA7CisgIGd1aW50MzIgcGFja2V0X2NvdW50ID0gMDsKKyAgZ3VpbnQzMiBvY3RldF9jb3VudCA9IDA7CisKKworICAvKiBjb21tb24gZGF0YSBmb3IgYWxsIHR5cGVzIG9mIHNvdXJjZXMgKi8KKyAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtc291cmNlLXN0YXRzIiwKKyAgICAgICJzc3JjIiwgR19UWVBFX1VJTlQsIChndWludCkgc3JjLT5zc3JjLAorICAgICAgImludGVybmFsIiwgR19UWVBFX0JPT0xFQU4sIGludGVybmFsLAorICAgICAgInZhbGlkYXRlZCIsIEdfVFlQRV9CT09MRUFOLCBzcmMtPnZhbGlkYXRlZCwKKyAgICAgICJyZWNlaXZlZC1ieWUiLCBHX1RZUEVfQk9PTEVBTiwgc3JjLT5tYXJrZWRfYnllLAorICAgICAgImlzLWNzcmMiLCBHX1RZUEVfQk9PTEVBTiwgc3JjLT5pc19jc3JjLAorICAgICAgImlzLXNlbmRlciIsIEdfVFlQRV9CT09MRUFOLCBpc19zZW5kZXIsCisgICAgICAic2VxbnVtLWJhc2UiLCBHX1RZUEVfSU5ULCBzcmMtPnNlcW51bV9vZmZzZXQsCisgICAgICAiY2xvY2stcmF0ZSIsIEdfVFlQRV9JTlQsIHNyYy0+Y2xvY2tfcmF0ZSwgTlVMTCk7CisKKyAgLyogYWRkIGFkZHJlc3MgYW5kIHBvcnQgKi8KKyAgaWYgKHNyYy0+cnRwX2Zyb20pIHsKKyAgICBhZGRyZXNzX3N0ciA9IF9fZ19zb2NrZXRfYWRkcmVzc190b19zdHJpbmcgKHNyYy0+cnRwX2Zyb20pOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAicnRwLWZyb20iLCBHX1RZUEVfU1RSSU5HLCBhZGRyZXNzX3N0ciwgTlVMTCk7CisgICAgZ19mcmVlIChhZGRyZXNzX3N0cik7CisgIH0KKyAgaWYgKHNyYy0+cnRjcF9mcm9tKSB7CisgICAgYWRkcmVzc19zdHIgPSBfX2dfc29ja2V0X2FkZHJlc3NfdG9fc3RyaW5nIChzcmMtPnJ0Y3BfZnJvbSk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJydGNwLWZyb20iLCBHX1RZUEVfU1RSSU5HLCBhZGRyZXNzX3N0ciwgTlVMTCk7CisgICAgZ19mcmVlIChhZGRyZXNzX3N0cik7CisgIH0KKworICBnc3Rfc3RydWN0dXJlX3NldCAocywKKyAgICAgICJvY3RldHMtc2VudCIsIEdfVFlQRV9VSU5UNjQsIHNyYy0+c3RhdHMub2N0ZXRzX3NlbnQsCisgICAgICAicGFja2V0cy1zZW50IiwgR19UWVBFX1VJTlQ2NCwgc3JjLT5zdGF0cy5wYWNrZXRzX3NlbnQsCisgICAgICAib2N0ZXRzLXJlY2VpdmVkIiwgR19UWVBFX1VJTlQ2NCwgc3JjLT5zdGF0cy5vY3RldHNfcmVjZWl2ZWQsCisgICAgICAicGFja2V0cy1yZWNlaXZlZCIsIEdfVFlQRV9VSU5UNjQsIHNyYy0+c3RhdHMucGFja2V0c19yZWNlaXZlZCwKKyAgICAgICJiaXRyYXRlIiwgR19UWVBFX1VJTlQ2NCwgc3JjLT5iaXRyYXRlLAorICAgICAgInBhY2tldHMtbG9zdCIsIEdfVFlQRV9JTlQsCisgICAgICAoZ2ludCkgcnRwX3N0YXRzX2dldF9wYWNrZXRzX2xvc3QgKCZzcmMtPnN0YXRzKSwgImppdHRlciIsIEdfVFlQRV9VSU5ULAorICAgICAgKGd1aW50KSAoc3JjLT5zdGF0cy5qaXR0ZXIgPj4gNCksCisgICAgICAic2VudC1wbGktY291bnQiLCBHX1RZUEVfVUlOVCwgc3JjLT5zdGF0cy5zZW50X3BsaV9jb3VudCwKKyAgICAgICJyZWN2LXBsaS1jb3VudCIsIEdfVFlQRV9VSU5ULCBzcmMtPnN0YXRzLnJlY3ZfcGxpX2NvdW50LAorICAgICAgInNlbnQtZmlyLWNvdW50IiwgR19UWVBFX1VJTlQsIHNyYy0+c3RhdHMuc2VudF9maXJfY291bnQsCisgICAgICAicmVjdi1maXItY291bnQiLCBHX1RZUEVfVUlOVCwgc3JjLT5zdGF0cy5yZWN2X2Zpcl9jb3VudCwKKyAgICAgICJzZW50LW5hY2stY291bnQiLCBHX1RZUEVfVUlOVCwgc3JjLT5zdGF0cy5zZW50X25hY2tfY291bnQsCisgICAgICAicmVjdi1uYWNrLWNvdW50IiwgR19UWVBFX1VJTlQsIHNyYy0+c3RhdHMucmVjdl9uYWNrX2NvdW50LCBOVUxMKTsKKworICAvKiBnZXQgdGhlIGxhc3QgU1IuICovCisgIGhhdmVfc3IgPSBydHBfc291cmNlX2dldF9sYXN0X3NyIChzcmMsICZ0aW1lLCAmbnRwdGltZSwgJnJ0cHRpbWUsCisgICAgICAmcGFja2V0X2NvdW50LCAmb2N0ZXRfY291bnQpOworICBnc3Rfc3RydWN0dXJlX3NldCAocywKKyAgICAgICJoYXZlLXNyIiwgR19UWVBFX0JPT0xFQU4sIGhhdmVfc3IsCisgICAgICAic3ItbnRwdGltZSIsIEdfVFlQRV9VSU5UNjQsIG50cHRpbWUsCisgICAgICAic3ItcnRwdGltZSIsIEdfVFlQRV9VSU5ULCAoZ3VpbnQpIHJ0cHRpbWUsCisgICAgICAic3Itb2N0ZXQtY291bnQiLCBHX1RZUEVfVUlOVCwgKGd1aW50KSBvY3RldF9jb3VudCwKKyAgICAgICJzci1wYWNrZXQtY291bnQiLCBHX1RZUEVfVUlOVCwgKGd1aW50KSBwYWNrZXRfY291bnQsIE5VTEwpOworCisgIGlmICghaW50ZXJuYWwpIHsKKyAgICAvKiBnZXQgdGhlIGxhc3QgUkIgd2Ugc2VudCAqLworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLAorICAgICAgICAic2VudC1yYiIsIEdfVFlQRV9CT09MRUFOLCBzcmMtPmxhc3RfcnIuaXNfdmFsaWQsCisgICAgICAgICJzZW50LXJiLWZyYWN0aW9ubG9zdCIsIEdfVFlQRV9VSU5ULCAoZ3VpbnQpIHNyYy0+bGFzdF9yci5mcmFjdGlvbmxvc3QsCisgICAgICAgICJzZW50LXJiLXBhY2tldHNsb3N0IiwgR19UWVBFX0lOVCwgKGdpbnQpIHNyYy0+bGFzdF9yci5wYWNrZXRzbG9zdCwKKyAgICAgICAgInNlbnQtcmItZXh0aGlnaGVzdHNlcSIsIEdfVFlQRV9VSU5ULAorICAgICAgICAoZ3VpbnQpIHNyYy0+bGFzdF9yci5leHRoaWdoZXN0c2VxLCAic2VudC1yYi1qaXR0ZXIiLCBHX1RZUEVfVUlOVCwKKyAgICAgICAgKGd1aW50KSBzcmMtPmxhc3RfcnIuaml0dGVyLCAic2VudC1yYi1sc3IiLCBHX1RZUEVfVUlOVCwKKyAgICAgICAgKGd1aW50KSBzcmMtPmxhc3RfcnIubHNyLCAic2VudC1yYi1kbHNyIiwgR19UWVBFX1VJTlQsCisgICAgICAgIChndWludCkgc3JjLT5sYXN0X3JyLmRsc3IsIE5VTEwpOworCisgICAgLyogZ2V0IHRoZSBsYXN0IFJCICovCisgICAgaGF2ZV9yYiA9IHJ0cF9zb3VyY2VfZ2V0X2xhc3RfcmIgKHNyYywgJmZyYWN0aW9ubG9zdCwgJnBhY2tldHNsb3N0LAorICAgICAgICAmZXh0aGlnaGVzdHNlcSwgJmppdHRlciwgJmxzciwgJmRsc3IsICZyb3VuZF90cmlwKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLAorICAgICAgICAiaGF2ZS1yYiIsIEdfVFlQRV9CT09MRUFOLCBoYXZlX3JiLAorICAgICAgICAicmItZnJhY3Rpb25sb3N0IiwgR19UWVBFX1VJTlQsIChndWludCkgZnJhY3Rpb25sb3N0LAorICAgICAgICAicmItcGFja2V0c2xvc3QiLCBHX1RZUEVfSU5ULCAoZ2ludCkgcGFja2V0c2xvc3QsCisgICAgICAgICJyYi1leHRoaWdoZXN0c2VxIiwgR19UWVBFX1VJTlQsIChndWludCkgZXh0aGlnaGVzdHNlcSwKKyAgICAgICAgInJiLWppdHRlciIsIEdfVFlQRV9VSU5ULCAoZ3VpbnQpIGppdHRlciwKKyAgICAgICAgInJiLWxzciIsIEdfVFlQRV9VSU5ULCAoZ3VpbnQpIGxzciwKKyAgICAgICAgInJiLWRsc3IiLCBHX1RZUEVfVUlOVCwgKGd1aW50KSBkbHNyLAorICAgICAgICAicmItcm91bmQtdHJpcCIsIEdfVFlQRV9VSU5ULCAoZ3VpbnQpIHJvdW5kX3RyaXAsIE5VTEwpOworICB9CisKKyAgcmV0dXJuIHM7Cit9CisKKy8qKgorICogcnRwX3NvdXJjZV9nZXRfc2Rlc19zdHJ1Y3Q6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKgorICogR2V0IHRoZSBTREVTIGZyb20gQHNyYy4gU2VlIHRoZSBTREVTIHByb3BlcnR5IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogUmV0dXJuczogJUdzdFN0cnVjdHVyZSBvZiB0eXBlICJhcHBsaWNhdGlvbi94LXJ0cC1zb3VyY2Utc2RlcyIuIFRoZSByZXN1bHQgaXMKKyAqIHZhbGlkIHVudGlsIHRoZSBTREVTIGl0ZW1zIG9mIEBzcmMgYXJlIG1vZGlmaWVkLgorICovCitjb25zdCBHc3RTdHJ1Y3R1cmUgKgorcnRwX3NvdXJjZV9nZXRfc2Rlc19zdHJ1Y3QgKFJUUFNvdXJjZSAqIHNyYykKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFJUUF9JU19TT1VSQ0UgKHNyYyksIE5VTEwpOworCisgIHJldHVybiBzcmMtPnNkZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorc2Rlc19zdHJ1Y3RfY29tcGFyZV9mdW5jIChHUXVhcmsgZmllbGRfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0U3RydWN0dXJlICpvbGQ7CisgIGNvbnN0IGdjaGFyICpmaWVsZDsKKworICBvbGQgPSBHU1RfU1RSVUNUVVJFICh1c2VyX2RhdGEpOworICBmaWVsZCA9IGdfcXVhcmtfdG9fc3RyaW5nIChmaWVsZF9pZCk7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAob2xkLCBmaWVsZCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGdfYXNzZXJ0IChHX1ZBTFVFX0hPTERTX1NUUklORyAodmFsdWUpKTsKKworICByZXR1cm4gc3RyY21wIChnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSwgZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChvbGQsCisgICAgICAgICAgZmllbGQpKSA9PSAwOworfQorCisvKioKKyAqIHJ0cF9zb3VyY2Vfc2V0X3NkZXNfc3RydWN0OgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICogQHNkZXM6IHRoZSBTREVTIHN0cnVjdHVyZQorICoKKyAqIFN0b3JlIHRoZSBAc2RlcyBpbiBAc3JjLiBAc2RlcyBtdXN0IGJlIGEgc3RydWN0dXJlIG9mIHR5cGUKKyAqICJhcHBsaWNhdGlvbi94LXJ0cC1zb3VyY2Utc2RlcyIsIHNlZSB0aGUgU0RFUyBwcm9wZXJ0eSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgb3duZXJzaGlwIG9mIEBzZGVzLgorICoKKyAqIFJldHVybnM6ICVGQUxTRSBpZiB0aGUgU0RFUyB3YXMgdW5jaGFuZ2VkLgorICovCitnYm9vbGVhbgorcnRwX3NvdXJjZV9zZXRfc2Rlc19zdHJ1Y3QgKFJUUFNvdXJjZSAqIHNyYywgR3N0U3RydWN0dXJlICogc2RlcykKK3sKKyAgZ2Jvb2xlYW4gY2hhbmdlZDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoUlRQX0lTX1NPVVJDRSAoc3JjKSwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc3RyY21wIChnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzZGVzKSwKKyAgICAgICAgICAiYXBwbGljYXRpb24veC1ydHAtc291cmNlLXNkZXMiKSA9PSAwLCBGQUxTRSk7CisKKyAgY2hhbmdlZCA9ICFnc3Rfc3RydWN0dXJlX2ZvcmVhY2ggKHNkZXMsIHNkZXNfc3RydWN0X2NvbXBhcmVfZnVuYywgc3JjLT5zZGVzKTsKKworICBpZiAoY2hhbmdlZCkgeworICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoc3JjLT5zZGVzKTsKKyAgICBzcmMtPnNkZXMgPSBzZGVzOworICB9IGVsc2UgeworICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoc2Rlcyk7CisgIH0KKyAgcmV0dXJuIGNoYW5nZWQ7Cit9CisKK3N0YXRpYyB2b2lkCitydHBfc291cmNlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBSVFBTb3VyY2UgKnNyYzsKKworICBzcmMgPSBSVFBfU09VUkNFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TU1JDOgorICAgICAgc3JjLT5zc3JjID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST0JBVElPTjoKKyAgICAgIHNyYy0+cHJvYmF0aW9uID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9EUk9QT1VUX1RJTUU6CisgICAgICBzcmMtPm1heF9kcm9wb3V0X3RpbWUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX01JU09SREVSX1RJTUU6CisgICAgICBzcmMtPm1heF9taXNvcmRlcl90aW1lID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorcnRwX3NvdXJjZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgUlRQU291cmNlICpzcmM7CisKKyAgc3JjID0gUlRQX1NPVVJDRSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU1NSQzoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHBfc291cmNlX2dldF9zc3JjIChzcmMpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JU19DU1JDOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHJ0cF9zb3VyY2VfaXNfYXNfY3NyYyAoc3JjKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSVNfVkFMSURBVEVEOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHJ0cF9zb3VyY2VfaXNfdmFsaWRhdGVkIChzcmMpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JU19TRU5ERVI6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcnRwX3NvdXJjZV9pc19zZW5kZXIgKHNyYykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NERVM6CisgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIHJ0cF9zb3VyY2VfZ2V0X3NkZXNfc3RydWN0IChzcmMpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVEFUUzoKKyAgICAgIGdfdmFsdWVfdGFrZV9ib3hlZCAodmFsdWUsIHJ0cF9zb3VyY2VfY3JlYXRlX3N0YXRzIChzcmMpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9CQVRJT046CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc3JjLT5wcm9iYXRpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9EUk9QT1VUX1RJTUU6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc3JjLT5tYXhfZHJvcG91dF90aW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NQVhfTUlTT1JERVJfVElNRToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzcmMtPm1heF9taXNvcmRlcl90aW1lKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyoqCisgKiBydHBfc291cmNlX25ldzoKKyAqIEBzc3JjOiBhbiBTU1JDCisgKgorICogQ3JlYXRlIGEgI1JUUFNvdXJjZSB3aXRoIEBzc3JjLgorICoKKyAqIFJldHVybnM6IGEgbmV3ICNSVFBTb3VyY2UuIFVzZSBnX29iamVjdF91bnJlZigpIGFmdGVyIHVzYWdlLgorICovCitSVFBTb3VyY2UgKgorcnRwX3NvdXJjZV9uZXcgKGd1aW50MzIgc3NyYykKK3sKKyAgUlRQU291cmNlICpzcmM7CisKKyAgc3JjID0gZ19vYmplY3RfbmV3IChSVFBfVFlQRV9TT1VSQ0UsIE5VTEwpOworICBzcmMtPnNzcmMgPSBzc3JjOworCisgIHJldHVybiBzcmM7Cit9CisKKy8qKgorICogcnRwX3NvdXJjZV9zZXRfY2FsbGJhY2tzOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICogQGNiOiBjYWxsYmFjayBmdW5jdGlvbnMKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YQorICoKKyAqIFNldCB0aGUgY2FsbGJhY2tzIGZvciB0aGUgc291cmNlLgorICovCit2b2lkCitydHBfc291cmNlX3NldF9jYWxsYmFja3MgKFJUUFNvdXJjZSAqIHNyYywgUlRQU291cmNlQ2FsbGJhY2tzICogY2IsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBnX3JldHVybl9pZl9mYWlsIChSVFBfSVNfU09VUkNFIChzcmMpKTsKKworICBzcmMtPmNhbGxiYWNrcy5wdXNoX3J0cCA9IGNiLT5wdXNoX3J0cDsKKyAgc3JjLT5jYWxsYmFja3MuY2xvY2tfcmF0ZSA9IGNiLT5jbG9ja19yYXRlOworICBzcmMtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKK30KKworLyoqCisgKiBydHBfc291cmNlX2dldF9zc3JjOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICoKKyAqIEdldCB0aGUgU1NSQyBvZiBAc291cmNlLgorICoKKyAqIFJldHVybnM6IHRoZSBTU1JDIG9mIHNyYy4KKyAqLworZ3VpbnQzMgorcnRwX3NvdXJjZV9nZXRfc3NyYyAoUlRQU291cmNlICogc3JjKQoreworICBndWludDMyIHJlc3VsdDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoUlRQX0lTX1NPVVJDRSAoc3JjKSwgMCk7CisKKyAgcmVzdWx0ID0gc3JjLT5zc3JjOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcnRwX3NvdXJjZV9zZXRfYXNfY3NyYzoKKyAqIEBzcmM6IGFuICNSVFBTb3VyY2UKKyAqCisgKiBDb25maWd1cmUgQHNyYyBhcyBhIENTUkMsIHRoaXMgd2lsbCBhbHNvIHZhbGlkYXRlIEBzcmMuCisgKi8KK3ZvaWQKK3J0cF9zb3VyY2Vfc2V0X2FzX2NzcmMgKFJUUFNvdXJjZSAqIHNyYykKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoUlRQX0lTX1NPVVJDRSAoc3JjKSk7CisKKyAgc3JjLT52YWxpZGF0ZWQgPSBUUlVFOworICBzcmMtPmlzX2NzcmMgPSBUUlVFOworfQorCisvKioKKyAqIHJ0cF9zb3VyY2VfaXNfYXNfY3NyYzoKKyAqIEBzcmM6IGFuICNSVFBTb3VyY2UKKyAqCisgKiBDaGVjayBpZiBAc3JjIGlzIGEgY29udHJpYnV0aW5nIHNvdXJjZS4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBpZiBAc3JjIGlzIGFjdGluZyBhcyBhIGNvbnRyaWJ1dGluZyBzb3VyY2UuCisgKi8KK2dib29sZWFuCitydHBfc291cmNlX2lzX2FzX2NzcmMgKFJUUFNvdXJjZSAqIHNyYykKK3sKKyAgZ2Jvb2xlYW4gcmVzdWx0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU09VUkNFIChzcmMpLCBGQUxTRSk7CisKKyAgcmVzdWx0ID0gc3JjLT5pc19jc3JjOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcnRwX3NvdXJjZV9pc19hY3RpdmU6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKgorICogQ2hlY2sgaWYgQHNyYyBpcyBhbiBhY3RpdmUgc291cmNlLiBBIHNvdXJjZSBpcyBhY3RpdmUgaWYgaXQgaGFzIGJlZW4KKyAqIHZhbGlkYXRlZCBhbmQgaGFzIG5vdCB5ZXQgcmVjZWl2ZWQgYSBCWUUgcGFja2V0CisgKgorICogUmV0dXJuczogJVRSVUUgaWYgQHNyYyBpcyBhbiBxYWN0aXZlIHNvdXJjZS4KKyAqLworZ2Jvb2xlYW4KK3J0cF9zb3VyY2VfaXNfYWN0aXZlIChSVFBTb3VyY2UgKiBzcmMpCit7CisgIGdib29sZWFuIHJlc3VsdDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoUlRQX0lTX1NPVVJDRSAoc3JjKSwgRkFMU0UpOworCisgIHJlc3VsdCA9IFJUUF9TT1VSQ0VfSVNfQUNUSVZFIChzcmMpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcnRwX3NvdXJjZV9pc192YWxpZGF0ZWQ6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKgorICogQ2hlY2sgaWYgQHNyYyBpcyBhIHZhbGlkYXRlZCBzb3VyY2UuCisgKgorICogUmV0dXJuczogJVRSVUUgaWYgQHNyYyBpcyBhIHZhbGlkYXRlZCBzb3VyY2UuCisgKi8KK2dib29sZWFuCitydHBfc291cmNlX2lzX3ZhbGlkYXRlZCAoUlRQU291cmNlICogc3JjKQoreworICBnYm9vbGVhbiByZXN1bHQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFJUUF9JU19TT1VSQ0UgKHNyYyksIEZBTFNFKTsKKworICByZXN1bHQgPSBzcmMtPnZhbGlkYXRlZDsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHJ0cF9zb3VyY2VfaXNfc2VuZGVyOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICoKKyAqIENoZWNrIGlmIEBzcmMgaXMgYSBzZW5kaW5nIHNvdXJjZS4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBpZiBAc3JjIGlzIGEgc2VuZGluZyBzb3VyY2UuCisgKi8KK2dib29sZWFuCitydHBfc291cmNlX2lzX3NlbmRlciAoUlRQU291cmNlICogc3JjKQoreworICBnYm9vbGVhbiByZXN1bHQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFJUUF9JU19TT1VSQ0UgKHNyYyksIEZBTFNFKTsKKworICByZXN1bHQgPSBSVFBfU09VUkNFX0lTX1NFTkRFUiAoc3JjKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHJ0cF9zb3VyY2VfaXNfbWFya2VkX2J5ZToKKyAqIEBzcmM6IGFuICNSVFBTb3VyY2UKKyAqCisgKiBDaGVjayBpZiBAc3JjIGlzIG1hcmtlZCBhcyBsZWF2aW5nIHRoZSBzZXNzaW9uIHdpdGggYSBCWUUgcGFja2V0LgorICoKKyAqIFJldHVybnM6ICVUUlVFIGlmIEBzcmMgaGFzIGJlZW4gbWFya2VkIEJZRS4KKyAqLworZ2Jvb2xlYW4KK3J0cF9zb3VyY2VfaXNfbWFya2VkX2J5ZSAoUlRQU291cmNlICogc3JjKQoreworICBnYm9vbGVhbiByZXN1bHQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFJUUF9JU19TT1VSQ0UgKHNyYyksIEZBTFNFKTsKKworICByZXN1bHQgPSBSVFBfU09VUkNFX0lTX01BUktFRF9CWUUgKHNyYyk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIHJ0cF9zb3VyY2VfZ2V0X2J5ZV9yZWFzb246CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKgorICogR2V0IHRoZSBCWUUgcmVhc29uIGZvciBAc3JjLiBDaGVjayBpZiB0aGUgc291cmNlIGlzIG1hcmtlZCBhcyBsZWF2aW5nIHRoZQorICogc2Vzc2lvbiB3aXRoIGEgQllFIG1lc3NhZ2UgZmlyc3Qgd2l0aCBydHBfc291cmNlX2lzX21hcmtlZF9ieWUoKS4KKyAqCisgKiBSZXR1cm5zOiBUaGUgQllFIHJlYXNvbiBvciBOVUxMIHdoZW4gbm8gcmVhc29uIHdhcyBnaXZlbiBvciB0aGUgc291cmNlIHdhcworICogbm90IG1hcmtlZCBCWUUgeWV0LiBnX2ZyZWUoKSBhZnRlciB1c2FnZS4KKyAqLworZ2NoYXIgKgorcnRwX3NvdXJjZV9nZXRfYnllX3JlYXNvbiAoUlRQU291cmNlICogc3JjKQoreworICBnY2hhciAqcmVzdWx0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU09VUkNFIChzcmMpLCBOVUxMKTsKKworICByZXN1bHQgPSBnX3N0cmR1cCAoc3JjLT5ieWVfcmVhc29uKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHJ0cF9zb3VyY2VfdXBkYXRlX2NhcHM6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKiBAY2FwczogYSAjR3N0Q2FwcworICoKKyAqIFBhcnNlIEBjYXBzIGFuZCBzdG9yZSBhbGwgcmVsZXZhbnQgaW5mb3JtYXRpb24gaW4gQHNvdXJjZS4KKyAqLwordm9pZAorcnRwX3NvdXJjZV91cGRhdGVfY2FwcyAoUlRQU291cmNlICogc3JjLCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzOworICBndWludCB2YWw7CisgIGdpbnQgaXZhbDsKKyAgZ2Jvb2xlYW4gcnR4OworCisgIC8qIG5vdGhpbmcgY2hhbmdlZCwgcmV0dXJuICovCisgIGlmIChjYXBzID09IE5VTEwgfHwgc3JjLT5jYXBzID09IGNhcHMpCisgICAgcmV0dXJuOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBydHggPSAoZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAocywgInJ0eC1zc3JjIiwgJnZhbCkgJiYgdmFsID09IHNyYy0+c3NyYyk7CisKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgcnR4ID8gInJ0eC1wYXlsb2FkIiA6ICJwYXlsb2FkIiwgJml2YWwpKQorICAgIHNyYy0+cGF5bG9hZCA9IGl2YWw7CisgIGVsc2UKKyAgICBzcmMtPnBheWxvYWQgPSAtMTsKKworICBHU1RfREVCVUcgKCJnb3QgJXNwYXlsb2FkICVkIiwgcnR4ID8gInJ0eCAiIDogIiIsIHNyYy0+cGF5bG9hZCk7CisKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImNsb2NrLXJhdGUiLCAmaXZhbCkpCisgICAgc3JjLT5jbG9ja19yYXRlID0gaXZhbDsKKyAgZWxzZQorICAgIHNyYy0+Y2xvY2tfcmF0ZSA9IC0xOworCisgIEdTVF9ERUJVRyAoImdvdCBjbG9jay1yYXRlICVkIiwgc3JjLT5jbG9ja19yYXRlKTsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAocywgcnR4ID8gInJ0eC1zZXFudW0tb2Zmc2V0IiA6ICJzZXFudW0tb2Zmc2V0IiwKKyAgICAgICAgICAmdmFsKSkKKyAgICBzcmMtPnNlcW51bV9vZmZzZXQgPSB2YWw7CisgIGVsc2UKKyAgICBzcmMtPnNlcW51bV9vZmZzZXQgPSAtMTsKKworICBHU1RfREVCVUcgKCJnb3QgJXNzZXFudW0tb2Zmc2V0ICUiIEdfR0lOVDMyX0ZPUk1BVCwgcnR4ID8gInJ0eCAiIDogIiIsCisgICAgICBzcmMtPnNlcW51bV9vZmZzZXQpOworCisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzcmMtPmNhcHMsIGNhcHMpOworfQorCisvKioKKyAqIHJ0cF9zb3VyY2Vfc2V0X3J0cF9mcm9tOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICogQGFkZHJlc3M6IHRoZSBSVFAgYWRkcmVzcyB0byBzZXQKKyAqCisgKiBTZXQgdGhhdCBAc3JjIGlzIHJlY2VpdmluZyBSVFAgcGFja2V0cyBmcm9tIEBhZGRyZXNzLiBUaGlzIGlzIHVzZWQgZm9yCisgKiBjb2xsaXN0aW9uIGNoZWNraW5nLgorICovCit2b2lkCitydHBfc291cmNlX3NldF9ydHBfZnJvbSAoUlRQU291cmNlICogc3JjLCBHU29ja2V0QWRkcmVzcyAqIGFkZHJlc3MpCit7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKFJUUF9JU19TT1VSQ0UgKHNyYykpOworCisgIGlmIChzcmMtPnJ0cF9mcm9tKQorICAgIGdfb2JqZWN0X3VucmVmIChzcmMtPnJ0cF9mcm9tKTsKKyAgc3JjLT5ydHBfZnJvbSA9IEdfU09DS0VUX0FERFJFU1MgKGdfb2JqZWN0X3JlZiAoYWRkcmVzcykpOworfQorCisvKioKKyAqIHJ0cF9zb3VyY2Vfc2V0X3J0Y3BfZnJvbToKKyAqIEBzcmM6IGFuICNSVFBTb3VyY2UKKyAqIEBhZGRyZXNzOiB0aGUgUlRDUCBhZGRyZXNzIHRvIHNldAorICoKKyAqIFNldCB0aGF0IEBzcmMgaXMgcmVjZWl2aW5nIFJUQ1AgcGFja2V0cyBmcm9tIEBhZGRyZXNzLiBUaGlzIGlzIHVzZWQgZm9yCisgKiBjb2xsaXN0aW9uIGNoZWNraW5nLgorICovCit2b2lkCitydHBfc291cmNlX3NldF9ydGNwX2Zyb20gKFJUUFNvdXJjZSAqIHNyYywgR1NvY2tldEFkZHJlc3MgKiBhZGRyZXNzKQoreworICBnX3JldHVybl9pZl9mYWlsIChSVFBfSVNfU09VUkNFIChzcmMpKTsKKworICBpZiAoc3JjLT5ydGNwX2Zyb20pCisgICAgZ19vYmplY3RfdW5yZWYgKHNyYy0+cnRjcF9mcm9tKTsKKyAgc3JjLT5ydGNwX2Zyb20gPSBHX1NPQ0tFVF9BRERSRVNTIChnX29iamVjdF9yZWYgKGFkZHJlc3MpKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK3B1c2hfcGFja2V0IChSVFBTb3VyY2UgKiBzcmMsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKworICAvKiBwdXNoIHF1ZXVlZCBwYWNrZXRzIGZpcnN0IGlmIGFueSAqLworICB3aGlsZSAoIWdfcXVldWVfaXNfZW1wdHkgKHNyYy0+cGFja2V0cykpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZmZlciA9IEdTVF9CVUZGRVJfQ0FTVCAoZ19xdWV1ZV9wb3BfaGVhZCAoc3JjLT5wYWNrZXRzKSk7CisKKyAgICBHU1RfTE9HICgicHVzaGluZyBxdWV1ZWQgcGFja2V0Iik7CisgICAgaWYgKHNyYy0+Y2FsbGJhY2tzLnB1c2hfcnRwKQorICAgICAgc3JjLT5jYWxsYmFja3MucHVzaF9ydHAgKHNyYywgYnVmZmVyLCBzcmMtPnVzZXJfZGF0YSk7CisgICAgZWxzZQorICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgfQorICBHU1RfTE9HICgicHVzaGluZyBuZXcgcGFja2V0Iik7CisgIC8qIHB1c2ggcGFja2V0ICovCisgIGlmIChzcmMtPmNhbGxiYWNrcy5wdXNoX3J0cCkKKyAgICByZXQgPSBzcmMtPmNhbGxiYWNrcy5wdXNoX3J0cCAoc3JjLCBidWZmZXIsIHNyYy0+dXNlcl9kYXRhKTsKKyAgZWxzZQorICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdpbnQKK2dldF9jbG9ja19yYXRlIChSVFBTb3VyY2UgKiBzcmMsIGd1aW50OCBwYXlsb2FkKQoreworICBpZiAoc3JjLT5wYXlsb2FkID09IC0xKSB7CisgICAgLyogZmlyc3QgcGF5bG9hZCByZWNlaXZlZCwgbm90aGluZyB3YXMgaW4gdGhlIGNhcHMsIGxvY2sgb24gdG8gdGhpcyBwYXlsb2FkICovCisgICAgc3JjLT5wYXlsb2FkID0gcGF5bG9hZDsKKyAgICBHU1RfREVCVUcgKCJmaXJzdCBwYXlsb2FkICVkIiwgcGF5bG9hZCk7CisgIH0gZWxzZSBpZiAocGF5bG9hZCAhPSBzcmMtPnBheWxvYWQpIHsKKyAgICAvKiB3ZSBoYXZlIGEgZGlmZmVyZW50IHBheWxvYWQgdGhhbiBiZWZvcmUsIHJlc2V0IHRoZSBjbG9jay1yYXRlICovCisgICAgR1NUX0RFQlVHICgibmV3IHBheWxvYWQgJWQiLCBwYXlsb2FkKTsKKyAgICBzcmMtPnBheWxvYWQgPSBwYXlsb2FkOworICAgIHNyYy0+Y2xvY2tfcmF0ZSA9IC0xOworICAgIHNyYy0+c3RhdHMudHJhbnNpdCA9IC0xOworICB9CisKKyAgaWYgKHNyYy0+Y2xvY2tfcmF0ZSA9PSAtMSkgeworICAgIGdpbnQgY2xvY2tfcmF0ZSA9IC0xOworCisgICAgaWYgKHNyYy0+Y2FsbGJhY2tzLmNsb2NrX3JhdGUpCisgICAgICBjbG9ja19yYXRlID0gc3JjLT5jYWxsYmFja3MuY2xvY2tfcmF0ZSAoc3JjLCBwYXlsb2FkLCBzcmMtPnVzZXJfZGF0YSk7CisKKyAgICBHU1RfREVCVUcgKCJnb3QgY2xvY2stcmF0ZSAlZCIsIGNsb2NrX3JhdGUpOworCisgICAgc3JjLT5jbG9ja19yYXRlID0gY2xvY2tfcmF0ZTsKKyAgICBnc3RfcnRwX3BhY2tldF9yYXRlX2N0eF9yZXNldCAoJnNyYy0+cGFja2V0X3JhdGVfY3R4LCBjbG9ja19yYXRlKTsKKyAgfQorICByZXR1cm4gc3JjLT5jbG9ja19yYXRlOworfQorCisvKiBKaXR0ZXIgaXMgdGhlIHZhcmlhdGlvbiBpbiB0aGUgZGVsYXkgb2YgcmVjZWl2ZWQgcGFja2V0cyBpbiBhIGZsb3cuIEl0IGlzCisgKiBtZWFzdXJlZCBieSBjb21wYXJpbmcgdGhlIGludGVydmFsIHdoZW4gUlRQIHBhY2tldHMgd2VyZSBzZW50IHRvIHRoZSBpbnRlcnZhbAorICogYXQgd2hpY2ggdGhleSB3ZXJlIHJlY2VpdmVkLiBGb3IgaW5zdGFuY2UsIGlmIHBhY2tldCAjMSBhbmQgcGFja2V0ICMyIGxlYXZlCisgKiA1MCBtaWxsaXNlY29uZHMgYXBhcnQgYW5kIGFycml2ZSA2MCBtaWxsaXNlY29uZHMgYXBhcnQsIHRoZW4gdGhlIGppdHRlciBpcyAxMAorICogbWlsbGlzZWNvbmRzLiAqLworc3RhdGljIHZvaWQKK2NhbGN1bGF0ZV9qaXR0ZXIgKFJUUFNvdXJjZSAqIHNyYywgUlRQUGFja2V0SW5mbyAqIHBpbmZvKQoreworICBHc3RDbG9ja1RpbWUgcnVubmluZ190aW1lOworICBndWludDMyIHJ0cGFycml2YWwsIHRyYW5zaXQsIHJ0cHRpbWU7CisgIGdpbnQzMiBkaWZmOworICBnaW50IGNsb2NrX3JhdGU7CisgIGd1aW50OCBwdDsKKworICAvKiBnZXQgYXJyaXZhbCB0aW1lICovCisgIGlmICgocnVubmluZ190aW1lID0gcGluZm8tPnJ1bm5pbmdfdGltZSkgPT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkKKyAgICBnb3RvIG5vX3RpbWU7CisKKyAgcHQgPSBwaW5mby0+cHQ7CisKKyAgR1NUX0xPRyAoIlNTUkMgJTA4eCBnb3QgcGF5bG9hZCAlZCIsIHNyYy0+c3NyYywgcHQpOworCisgIC8qIGdldCBjbG9ja3JhdGUgKi8KKyAgaWYgKChjbG9ja19yYXRlID0gZ2V0X2Nsb2NrX3JhdGUgKHNyYywgcHQpKSA9PSAtMSkKKyAgICBnb3RvIG5vX2Nsb2NrX3JhdGU7CisKKyAgcnRwdGltZSA9IHBpbmZvLT5ydHB0aW1lOworCisgIC8qIGNvbnZlcnQgYXJyaXZhbCB0aW1lIHRvIFJUUCB0aW1lc3RhbXAgdW5pdHMsIHRydW5jYXRlIHRvIDMyIGJpdHMsIHdlIGRvbid0CisgICAqIGNhcmUgYWJvdXQgdGhlIGFic29sdXRlIHZhbHVlLCBqdXN0IHRoZSBkaWZmZXJlbmNlLiAqLworICBydHBhcnJpdmFsID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAocnVubmluZ190aW1lLCBjbG9ja19yYXRlLCBHU1RfU0VDT05EKTsKKworICAvKiB0cmFuc2l0IHRpbWUgaXMgZGlmZmVyZW5jZSB3aXRoIFJUUCB0aW1lc3RhbXAgKi8KKyAgdHJhbnNpdCA9IHJ0cGFycml2YWwgLSBydHB0aW1lOworCisgIC8qIGdldCBBQlMgZGlmZiB3aXRoIHByZXZpb3VzIHRyYW5zaXQgdGltZSAqLworICBpZiAoc3JjLT5zdGF0cy50cmFuc2l0ICE9IC0xKSB7CisgICAgaWYgKHRyYW5zaXQgPiBzcmMtPnN0YXRzLnRyYW5zaXQpCisgICAgICBkaWZmID0gdHJhbnNpdCAtIHNyYy0+c3RhdHMudHJhbnNpdDsKKyAgICBlbHNlCisgICAgICBkaWZmID0gc3JjLT5zdGF0cy50cmFuc2l0IC0gdHJhbnNpdDsKKyAgfSBlbHNlCisgICAgZGlmZiA9IDA7CisKKyAgc3JjLT5zdGF0cy50cmFuc2l0ID0gdHJhbnNpdDsKKworICAvKiB1cGRhdGUgaml0dGVyLCB0aGUgdmFsdWUgd2Ugc3RvcmUgaXMgc2NhbGVkIHVwIHNvIHdlIGNhbiBrZWVwIHByZWNpc2lvbi4gKi8KKyAgc3JjLT5zdGF0cy5qaXR0ZXIgKz0gZGlmZiAtICgoc3JjLT5zdGF0cy5qaXR0ZXIgKyA4KSA+PiA0KTsKKworICBzcmMtPnN0YXRzLnByZXZfcnRwdGltZSA9IHNyYy0+c3RhdHMubGFzdF9ydHB0aW1lOworICBzcmMtPnN0YXRzLmxhc3RfcnRwdGltZSA9IHJ0cGFycml2YWw7CisKKyAgR1NUX0xPRyAoInJ0cGFycml2YWwgJXUsIHJ0cHRpbWUgJXUsIGNsb2NrLXJhdGUgJWQsIGRpZmYgJWQsIGppdHRlcjogJWYiLAorICAgICAgcnRwYXJyaXZhbCwgcnRwdGltZSwgY2xvY2tfcmF0ZSwgZGlmZiwgKHNyYy0+c3RhdHMuaml0dGVyKSAvIDE2LjApOworCisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK25vX3RpbWU6CisgIHsKKyAgICBHU1RfV0FSTklORyAoImNhbm5vdCBnZXQgY3VycmVudCBydW5uaW5nX3RpbWUiKTsKKyAgICByZXR1cm47CisgIH0KK25vX2Nsb2NrX3JhdGU6CisgIHsKKyAgICBHU1RfV0FSTklORyAoImNhbm5vdCBnZXQgY2xvY2stcmF0ZSBmb3IgcHQgJWQiLCBwdCk7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitpbml0X3NlcSAoUlRQU291cmNlICogc3JjLCBndWludDE2IHNlcSkKK3sKKyAgc3JjLT5zdGF0cy5iYXNlX3NlcSA9IHNlcTsKKyAgc3JjLT5zdGF0cy5tYXhfc2VxID0gc2VxOworICBzcmMtPnN0YXRzLmJhZF9zZXEgPSBSVFBfU0VRX01PRCArIDE7IC8qIHNvIHNlcSA9PSBiYWRfc2VxIGlzIGZhbHNlICovCisgIHNyYy0+c3RhdHMuY3ljbGVzID0gMDsKKyAgc3JjLT5zdGF0cy5wYWNrZXRzX3JlY2VpdmVkID0gMDsKKyAgc3JjLT5zdGF0cy5vY3RldHNfcmVjZWl2ZWQgPSAwOworICBzcmMtPnN0YXRzLmJ5dGVzX3JlY2VpdmVkID0gMDsKKyAgc3JjLT5zdGF0cy5wcmV2X3JlY2VpdmVkID0gMDsKKyAgc3JjLT5zdGF0cy5wcmV2X2V4cGVjdGVkID0gMDsKKyAgc3JjLT5zdGF0cy5yZWN2X3BsaV9jb3VudCA9IDA7CisgIHNyYy0+c3RhdHMucmVjdl9maXJfY291bnQgPSAwOworCisgIEdTVF9ERUJVRyAoImJhc2Vfc2VxICVkIiwgc2VxKTsKK30KKworI2RlZmluZSBCSVRSQVRFX0lOVEVSVkFMICgyICogR1NUX1NFQ09ORCkKKworc3RhdGljIHZvaWQKK2RvX2JpdHJhdGVfZXN0aW1hdGlvbiAoUlRQU291cmNlICogc3JjLCBHc3RDbG9ja1RpbWUgcnVubmluZ190aW1lLAorICAgIGd1aW50NjQgKiBieXRlc19oYW5kbGVkKQoreworICBndWludDY0IGVsYXBzZWQ7CisKKyAgaWYgKHNyYy0+cHJldl9ydGltZSkgeworICAgIGVsYXBzZWQgPSBydW5uaW5nX3RpbWUgLSBzcmMtPnByZXZfcnRpbWU7CisKKyAgICBpZiAoZWxhcHNlZCA+IEJJVFJBVEVfSU5URVJWQUwpIHsKKyAgICAgIGd1aW50NjQgcmF0ZTsKKworICAgICAgcmF0ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoKmJ5dGVzX2hhbmRsZWQsIDggKiBHU1RfU0VDT05ELCBlbGFwc2VkKTsKKworICAgICAgR1NUX0xPRyAoIkVsYXBzZWQgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBieXRlcyAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgIiwgcmF0ZSAlIiBHX0dVSU5UNjRfRk9STUFULCBlbGFwc2VkLCAqYnl0ZXNfaGFuZGxlZCwgcmF0ZSk7CisKKyAgICAgIGlmIChzcmMtPmJpdHJhdGUgPT0gMCkKKyAgICAgICAgc3JjLT5iaXRyYXRlID0gcmF0ZTsKKyAgICAgIGVsc2UKKyAgICAgICAgc3JjLT5iaXRyYXRlID0gKChzcmMtPmJpdHJhdGUgKiAzKSArIHJhdGUpIC8gNDsKKworICAgICAgc3JjLT5wcmV2X3J0aW1lID0gcnVubmluZ190aW1lOworICAgICAgKmJ5dGVzX2hhbmRsZWQgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfTE9HICgiUmVzZXQgYml0cmF0ZSBtZWFzdXJlbWVudCIpOworICAgIHNyYy0+cHJldl9ydGltZSA9IHJ1bm5pbmdfdGltZTsKKyAgICBzcmMtPmJpdHJhdGUgPSAwOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgordXBkYXRlX3JlY2VpdmVyX3N0YXRzIChSVFBTb3VyY2UgKiBzcmMsIFJUUFBhY2tldEluZm8gKiBwaW5mbywKKyAgICBnYm9vbGVhbiBpc19yZWNlaXZlKQoreworICBndWludDE2IHNlcW5yLCBleHBlY3RlZDsKKyAgUlRQU291cmNlU3RhdHMgKnN0YXRzOworICBnaW50MTYgZGVsdGE7CisgIGdpbnQzMiBwYWNrZXRfcmF0ZSwgbWF4X2Ryb3BvdXQsIG1heF9taXNvcmRlcjsKKworICBzdGF0cyA9ICZzcmMtPnN0YXRzOworCisgIHNlcW5yID0gcGluZm8tPnNlcW51bTsKKworICBwYWNrZXRfcmF0ZSA9CisgICAgICBnc3RfcnRwX3BhY2tldF9yYXRlX2N0eF91cGRhdGUgKCZzcmMtPnBhY2tldF9yYXRlX2N0eCwgcGluZm8tPnNlcW51bSwKKyAgICAgIHBpbmZvLT5ydHB0aW1lKTsKKyAgbWF4X2Ryb3BvdXQgPQorICAgICAgZ3N0X3J0cF9wYWNrZXRfcmF0ZV9jdHhfZ2V0X21heF9kcm9wb3V0ICgmc3JjLT5wYWNrZXRfcmF0ZV9jdHgsCisgICAgICBzcmMtPm1heF9kcm9wb3V0X3RpbWUpOworICBtYXhfbWlzb3JkZXIgPQorICAgICAgZ3N0X3J0cF9wYWNrZXRfcmF0ZV9jdHhfZ2V0X21heF9taXNvcmRlciAoJnNyYy0+cGFja2V0X3JhdGVfY3R4LAorICAgICAgc3JjLT5tYXhfbWlzb3JkZXJfdGltZSk7CisgIEdTVF9UUkFDRSAoIlNTUkMgJTA4eCwgcGFja2V0X3JhdGU6ICVkLCBtYXhfZHJvcG91dDogJWQsIG1heF9taXNvcmRlcjogJWQiLAorICAgICAgc3JjLT5zc3JjLCBwYWNrZXRfcmF0ZSwgbWF4X2Ryb3BvdXQsIG1heF9taXNvcmRlcik7CisKKyAgaWYgKHN0YXRzLT5jeWNsZXMgPT0gLTEpIHsKKyAgICBHU1RfREVCVUcgKCJyZWNlaXZlZCBmaXJzdCBwYWNrZXQiKTsKKyAgICAvKiBmaXJzdCB0aW1lIHdlIGhlYXJkIG9mIHRoaXMgc291cmNlICovCisgICAgaW5pdF9zZXEgKHNyYywgc2VxbnIpOworICAgIHNyYy0+c3RhdHMubWF4X3NlcSA9IHNlcW5yIC0gMTsKKyAgICBzcmMtPmN1cnJfcHJvYmF0aW9uID0gc3JjLT5wcm9iYXRpb247CisgIH0KKworICBpZiAoaXNfcmVjZWl2ZSkgeworICAgIGV4cGVjdGVkID0gc3JjLT5zdGF0cy5tYXhfc2VxICsgMTsKKyAgICBkZWx0YSA9IGdzdF9ydHBfYnVmZmVyX2NvbXBhcmVfc2VxbnVtIChleHBlY3RlZCwgc2VxbnIpOworCisgICAgLyogaWYgd2UgYXJlIHN0aWxsIG9uIHByb2JhdGlvbiwgY2hlY2sgc2VxbnVtICovCisgICAgaWYgKHNyYy0+Y3Vycl9wcm9iYXRpb24pIHsKKyAgICAgIC8qIHdoZW4gaW4gcHJvYmF0aW9uLCB3ZSByZXF1aXJlIGNvbnNlY3V0aXZlIHNlcW51bXMgKi8KKyAgICAgIGlmIChkZWx0YSA9PSAwKSB7CisgICAgICAgIC8qIGV4cGVjdGVkIHBhY2tldCAqLworICAgICAgICBHU1RfREVCVUcgKCJwcm9iYXRpb246IHNlcW5yICVkID09IGV4cGVjdGVkICVkIiwgc2VxbnIsIGV4cGVjdGVkKTsKKyAgICAgICAgc3JjLT5jdXJyX3Byb2JhdGlvbi0tOworICAgICAgICBpZiAoc2VxbnIgPCBzdGF0cy0+bWF4X3NlcSkgeworICAgICAgICAgIC8qIHNlcXVlbmNlIG51bWJlciB3cmFwcGVkIC0gY291bnQgYW5vdGhlciA2NEsgY3ljbGUuICovCisgICAgICAgICAgc3RhdHMtPmN5Y2xlcyArPSBSVFBfU0VRX01PRDsKKyAgICAgICAgfQorICAgICAgICBzcmMtPnN0YXRzLm1heF9zZXEgPSBzZXFucjsKKworICAgICAgICBpZiAoc3JjLT5jdXJyX3Byb2JhdGlvbiA9PSAwKSB7CisgICAgICAgICAgR1NUX0RFQlVHICgicHJvYmF0aW9uIGRvbmUhIik7CisgICAgICAgICAgaW5pdF9zZXEgKHNyYywgc2VxbnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdzdEJ1ZmZlciAqcTsKKworICAgICAgICAgIEdTVF9ERUJVRyAoInByb2JhdGlvbiAlZDogcXVldWUgcGFja2V0Iiwgc3JjLT5jdXJyX3Byb2JhdGlvbik7CisgICAgICAgICAgLyogd2hlbiBzdGlsbCBpbiBwcm9iYXRpb24sIGtlZXAgcGFja2V0cyBpbiBhIGxpc3QuICovCisgICAgICAgICAgZ19xdWV1ZV9wdXNoX3RhaWwgKHNyYy0+cGFja2V0cywgcGluZm8tPmRhdGEpOworICAgICAgICAgIHBpbmZvLT5kYXRhID0gTlVMTDsKKyAgICAgICAgICAvKiByZW1vdmUgcGFja2V0cyBmcm9tIHF1ZXVlIGlmIHRoZXJlIGFyZSB0b28gbWFueSAqLworICAgICAgICAgIHdoaWxlIChnX3F1ZXVlX2dldF9sZW5ndGggKHNyYy0+cGFja2V0cykgPiBSVFBfTUFYX1BST0JBVElPTl9MRU4pIHsKKyAgICAgICAgICAgIHEgPSBnX3F1ZXVlX3BvcF9oZWFkIChzcmMtPnBhY2tldHMpOworICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAocSk7CisgICAgICAgICAgfQorICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogdW5leHBlY3RlZCBzZXFudW0gaW4gcHJvYmF0aW9uICovCisgICAgICAgIGdvdG8gcHJvYmF0aW9uX3NlcW51bTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGRlbHRhID49IDAgJiYgZGVsdGEgPCBtYXhfZHJvcG91dCkgeworICAgICAgLyogQ2xlYXIgYmFkIHBhY2tldHMgKi8KKyAgICAgIHN0YXRzLT5iYWRfc2VxID0gUlRQX1NFUV9NT0QgKyAxOyAvKiBzbyBzZXEgPT0gYmFkX3NlcSBpcyBmYWxzZSAqLworICAgICAgZ19xdWV1ZV9mb3JlYWNoIChzcmMtPnBhY2tldHMsIChHRnVuYykgZ3N0X2J1ZmZlcl91bnJlZiwgTlVMTCk7CisgICAgICBnX3F1ZXVlX2NsZWFyIChzcmMtPnBhY2tldHMpOworCisgICAgICAvKiBpbiBvcmRlciwgd2l0aCBwZXJtaXNzaWJsZSBnYXAgKi8KKyAgICAgIGlmIChzZXFuciA8IHN0YXRzLT5tYXhfc2VxKSB7CisgICAgICAgIC8qIHNlcXVlbmNlIG51bWJlciB3cmFwcGVkIC0gY291bnQgYW5vdGhlciA2NEsgY3ljbGUuICovCisgICAgICAgIHN0YXRzLT5jeWNsZXMgKz0gUlRQX1NFUV9NT0Q7CisgICAgICB9CisgICAgICBzdGF0cy0+bWF4X3NlcSA9IHNlcW5yOworICAgIH0gZWxzZSBpZiAoZGVsdGEgPCAtbWF4X21pc29yZGVyIHx8IGRlbHRhID49IG1heF9kcm9wb3V0KSB7CisgICAgICAvKiB0aGUgc2VxdWVuY2UgbnVtYmVyIG1hZGUgYSB2ZXJ5IGxhcmdlIGp1bXAgKi8KKyAgICAgIGlmIChzZXFuciA9PSBzdGF0cy0+YmFkX3NlcSAmJiBzcmMtPnBhY2tldHMtPmhlYWQpIHsKKyAgICAgICAgLyogdHdvIHNlcXVlbnRpYWwgcGFja2V0cyAtLSBhc3N1bWUgdGhhdCB0aGUgb3RoZXIgc2lkZQorICAgICAgICAgKiByZXN0YXJ0ZWQgd2l0aG91dCB0ZWxsaW5nIHVzIHNvIGp1c3QgcmUtc3luYworICAgICAgICAgKiAoaS5lLiwgcHJldGVuZCB0aGlzIHdhcyB0aGUgZmlyc3QgcGFja2V0KS4gICovCisgICAgICAgIGluaXRfc2VxIChzcmMsIHNlcW5yKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHVuYWNjZXB0YWJsZSBqdW1wICovCisgICAgICAgIHN0YXRzLT5iYWRfc2VxID0gKHNlcW5yICsgMSkgJiAoUlRQX1NFUV9NT0QgLSAxKTsKKyAgICAgICAgZ19xdWV1ZV9mb3JlYWNoIChzcmMtPnBhY2tldHMsIChHRnVuYykgZ3N0X2J1ZmZlcl91bnJlZiwgTlVMTCk7CisgICAgICAgIGdfcXVldWVfY2xlYXIgKHNyYy0+cGFja2V0cyk7CisgICAgICAgIGdfcXVldWVfcHVzaF90YWlsIChzcmMtPnBhY2tldHMsIHBpbmZvLT5kYXRhKTsKKyAgICAgICAgcGluZm8tPmRhdGEgPSBOVUxMOworICAgICAgICBnb3RvIGJhZF9zZXF1ZW5jZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogZGVsdGEgPCAwICYmIGRlbHRhID49IC1tYXhfbWlzb3JkZXIgKi8KKyAgICAgIC8qIENsZWFyIGJhZCBwYWNrZXRzICovCisgICAgICBzdGF0cy0+YmFkX3NlcSA9IFJUUF9TRVFfTU9EICsgMTsgLyogc28gc2VxID09IGJhZF9zZXEgaXMgZmFsc2UgKi8KKyAgICAgIGdfcXVldWVfZm9yZWFjaCAoc3JjLT5wYWNrZXRzLCAoR0Z1bmMpIGdzdF9idWZmZXJfdW5yZWYsIE5VTEwpOworICAgICAgZ19xdWV1ZV9jbGVhciAoc3JjLT5wYWNrZXRzKTsKKworICAgICAgLyogZHVwbGljYXRlIG9yIHJlb3JkZXJlZCBwYWNrZXQsIHdpbGwgYmUgZmlsdGVyZWQgYnkgaml0dGVyYnVmZmVyLiAqLworICAgICAgR1NUX0lORk8gKCJkdXBsaWNhdGUgb3IgcmVvcmRlcmVkIHBhY2tldCAoc2VxbnIgJXUsIGV4cGVjdGVkICV1KSIsCisgICAgICAgICAgc2VxbnIsIGV4cGVjdGVkKTsKKyAgICB9CisgIH0KKworICBzcmMtPnN0YXRzLm9jdGV0c19yZWNlaXZlZCArPSBwaW5mby0+cGF5bG9hZF9sZW47CisgIHNyYy0+c3RhdHMuYnl0ZXNfcmVjZWl2ZWQgKz0gcGluZm8tPmJ5dGVzOworICBzcmMtPnN0YXRzLnBhY2tldHNfcmVjZWl2ZWQrKzsKKyAgLyogZm9yIHRoZSBiaXRyYXRlIGVzdGltYXRpb24gKi8KKyAgc3JjLT5ieXRlc19yZWNlaXZlZCArPSBwaW5mby0+cGF5bG9hZF9sZW47CisKKyAgR1NUX0xPRyAoInNlcSAldSwgUEM6ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgT0M6ICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBzZXFuciwgc3JjLT5zdGF0cy5wYWNrZXRzX3JlY2VpdmVkLCBzcmMtPnN0YXRzLm9jdGV0c19yZWNlaXZlZCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitkb25lOgorICB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitiYWRfc2VxdWVuY2U6CisgIHsKKyAgICBHU1RfV0FSTklORworICAgICAgICAoInVuYWNjZXB0YWJsZSBzZXFudW0gcmVjZWl2ZWQgKHNlcW5yICV1LCBkZWx0YSAlZCwgcGFja2V0X3JhdGU6ICVkLCBtYXhfZHJvcG91dDogJWQsIG1heF9taXNvcmRlcjogJWQpIiwKKyAgICAgICAgc2VxbnIsIGRlbHRhLCBwYWNrZXRfcmF0ZSwgbWF4X2Ryb3BvdXQsIG1heF9taXNvcmRlcik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citwcm9iYXRpb25fc2VxbnVtOgorICB7CisgICAgR1NUX1dBUk5JTkcgKCJwcm9iYXRpb246IHNlcW5yICVkICE9IGV4cGVjdGVkICVkIiwgc2VxbnIsIGV4cGVjdGVkKTsKKyAgICBzcmMtPmN1cnJfcHJvYmF0aW9uID0gc3JjLT5wcm9iYXRpb247CisgICAgc3JjLT5zdGF0cy5tYXhfc2VxID0gc2VxbnI7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qKgorICogcnRwX3NvdXJjZV9wcm9jZXNzX3J0cDoKKyAqIEBzcmM6IGFuICNSVFBTb3VyY2UKKyAqIEBwaW5mbzogYW4gI1JUUFBhY2tldEluZm8KKyAqCisgKiBMZXQgQHNyYyBoYW5kbGUgdGhlIGluY29tbWluZyBSVFAgcGFja2V0IGRlc2NyaWJlZCBpbiBAcGluZm8uCisgKgorICogUmV0dXJuczogYSAjR3N0Rmxvd1JldHVybi4KKyAqLworR3N0Rmxvd1JldHVybgorcnRwX3NvdXJjZV9wcm9jZXNzX3J0cCAoUlRQU291cmNlICogc3JjLCBSVFBQYWNrZXRJbmZvICogcGluZm8pCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzdWx0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU09VUkNFIChzcmMpLCBHU1RfRkxPV19FUlJPUik7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChwaW5mbyAhPSBOVUxMLCBHU1RfRkxPV19FUlJPUik7CisKKyAgaWYgKCF1cGRhdGVfcmVjZWl2ZXJfc3RhdHMgKHNyYywgcGluZm8sIFRSVUUpKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICAvKiB0aGUgc291cmNlIHRoYXQgc2VudCB0aGUgcGFja2V0IG11c3QgYmUgYSBzZW5kZXIgKi8KKyAgc3JjLT5pc19zZW5kZXIgPSBUUlVFOworICBzcmMtPnZhbGlkYXRlZCA9IFRSVUU7CisKKyAgZG9fYml0cmF0ZV9lc3RpbWF0aW9uIChzcmMsIHBpbmZvLT5ydW5uaW5nX3RpbWUsICZzcmMtPmJ5dGVzX3JlY2VpdmVkKTsKKworICAvKiBjYWxjdWxhdGUgaml0dGVyIGZvciB0aGUgc3RhdHMgKi8KKyAgY2FsY3VsYXRlX2ppdHRlciAoc3JjLCBwaW5mbyk7CisKKyAgLyogd2UncmUgcmVhZHkgdG8gcHVzaCB0aGUgUlRQIHBhY2tldCBub3cgKi8KKyAgcmVzdWx0ID0gcHVzaF9wYWNrZXQgKHNyYywgcGluZm8tPmRhdGEpOworICBwaW5mby0+ZGF0YSA9IE5VTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBydHBfc291cmNlX21hcmtfYnllOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICogQHJlYXNvbjogdGhlIHJlYXNvbiBmb3IgbGVhdmluZworICoKKyAqIE1hcmsgQHNyYyBpbiB0aGUgQllFIHN0YXRlLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgc291cmNlIHdhbnRzIHRvCisgKiBsZWF2ZSB0aGUgc2Vzc3Npb24gb3Igd2hlbiBhIEJZRSBwYWNrZXRzIGhhcyBiZWVuIHJlY2VpdmVkLgorICoKKyAqIFRoaXMgd2lsbCBtYWtlIHRoZSBzb3VyY2UgaW5hY3RpdmUuCisgKi8KK3ZvaWQKK3J0cF9zb3VyY2VfbWFya19ieWUgKFJUUFNvdXJjZSAqIHNyYywgY29uc3QgZ2NoYXIgKiByZWFzb24pCit7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKFJUUF9JU19TT1VSQ0UgKHNyYykpOworCisgIEdTVF9ERUJVRyAoIm1hcmtpbmcgU1NSQyAlMDh4IGFzIEJZRSwgcmVhc29uOiAlcyIsIHNyYy0+c3NyYywKKyAgICAgIEdTVF9TVFJfTlVMTCAocmVhc29uKSk7CisKKyAgLyogY29weSB0aGUgcmVhc29uIGFuZCBtYXJrIGFzIGJ5ZSAqLworICBnX2ZyZWUgKHNyYy0+YnllX3JlYXNvbik7CisgIHNyYy0+YnllX3JlYXNvbiA9IGdfc3RyZHVwIChyZWFzb24pOworICBzcmMtPm1hcmtlZF9ieWUgPSBUUlVFOworfQorCisvKioKKyAqIHJ0cF9zb3VyY2Vfc2VuZF9ydHA6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKiBAZGF0YTogYW4gUlRQIGJ1ZmZlciBvciBhIGxpc3Qgb2YgUlRQIGJ1ZmZlcnMKKyAqIEBpc19saXN0OiBpZiBAZGF0YSBpcyBhIGJ1ZmZlciBvciBsaXN0CisgKiBAcnVubmluZ190aW1lOiB0aGUgcnVubmluZyB0aW1lIG9mIEBkYXRhCisgKgorICogU2VuZCBAZGF0YSAoYW4gUlRQIGJ1ZmZlciBvciBsaXN0IG9mIGJ1ZmZlcnMpIG9yaWdpbmF0aW5nIGZyb20gQHNyYy4KKyAqIFRoaXMgd2lsbCBtYWtlIEBzcmMgYSBzZW5kZXIuIFRoaXMgZnVuY3Rpb24gdGFrZXMgb3duZXJzaGlwIG9mIEBkYXRhIGFuZAorICogbW9kaWZpZXMgdGhlIFNTUkMgaW4gdGhlIFJUUCBwYWNrZXQgdG8gdGhhdCBvZiBAc3JjIHdoZW4gbmVlZGVkLgorICoKKyAqIFJldHVybnM6IGEgI0dzdEZsb3dSZXR1cm4uCisgKi8KK0dzdEZsb3dSZXR1cm4KK3J0cF9zb3VyY2Vfc2VuZF9ydHAgKFJUUFNvdXJjZSAqIHNyYywgUlRQUGFja2V0SW5mbyAqIHBpbmZvKQoreworICBHc3RGbG93UmV0dXJuIHJlc3VsdDsKKyAgR3N0Q2xvY2tUaW1lIHJ1bm5pbmdfdGltZTsKKyAgZ3VpbnQzMiBydHB0aW1lOworICBndWludDY0IGV4dF9ydHB0aW1lOworICBndWludDY0IHJ0X2RpZmYsIHJ0cF9kaWZmOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU09VUkNFIChzcmMpLCBHU1RfRkxPV19FUlJPUik7CisKKyAgLyogd2UgYXJlIGEgc2VuZGVyIG5vdyAqLworICBzcmMtPmlzX3NlbmRlciA9IFRSVUU7CisKKyAgLyogd2UgYXJlIGFsc28gYSByZWNlaXZlciBvZiBvdXIgcGFja2V0cyAqLworICBpZiAoIXVwZGF0ZV9yZWNlaXZlcl9zdGF0cyAoc3JjLCBwaW5mbywgRkFMU0UpKQorICAgIHJldHVybiBHU1RfRkxPV19PSzsKKworICBpZiAoc3JjLT5wdF9zZXQgJiYgc3JjLT5wdCAhPSBwaW5mby0+cHQpIHsKKyAgICBHU1RfV0FSTklORyAoIkNoYW5naW5nIHB0IGZyb20gJXUgdG8gJXUgZm9yIFNTUkMgJXUiLCBzcmMtPnB0LCBwaW5mby0+cHQsCisgICAgICAgIHNyYy0+c3NyYyk7CisgIH0KKworICBzcmMtPnB0ID0gcGluZm8tPnB0OworICBzcmMtPnB0X3NldCA9IFRSVUU7CisKKyAgLyogdXBkYXRlIHN0YXRzIGZvciB0aGUgU1IgKi8KKyAgc3JjLT5zdGF0cy5wYWNrZXRzX3NlbnQgKz0gcGluZm8tPnBhY2tldHM7CisgIHNyYy0+c3RhdHMub2N0ZXRzX3NlbnQgKz0gcGluZm8tPnBheWxvYWRfbGVuOworICBzcmMtPmJ5dGVzX3NlbnQgKz0gcGluZm8tPnBheWxvYWRfbGVuOworCisgIHJ1bm5pbmdfdGltZSA9IHBpbmZvLT5ydW5uaW5nX3RpbWU7CisKKyAgZG9fYml0cmF0ZV9lc3RpbWF0aW9uIChzcmMsIHJ1bm5pbmdfdGltZSwgJnNyYy0+Ynl0ZXNfc2VudCk7CisKKyAgcnRwdGltZSA9IHBpbmZvLT5ydHB0aW1lOworCisgIGV4dF9ydHB0aW1lID0gc3JjLT5sYXN0X3J0cHRpbWU7CisgIGV4dF9ydHB0aW1lID0gZ3N0X3J0cF9idWZmZXJfZXh0X3RpbWVzdGFtcCAoJmV4dF9ydHB0aW1lLCBydHB0aW1lKTsKKworICBHU1RfTE9HICgiU1NSQyAlMDh4LCBSVFAgJSIgR19HVUlOVDY0X0ZPUk1BVCAiLCBydW5uaW5nX3RpbWUgJSIKKyAgICAgIEdTVF9USU1FX0ZPUk1BVCwgc3JjLT5zc3JjLCBleHRfcnRwdGltZSwgR1NUX1RJTUVfQVJHUyAocnVubmluZ190aW1lKSk7CisKKyAgaWYgKGV4dF9ydHB0aW1lID4gc3JjLT5sYXN0X3J0cHRpbWUpIHsKKyAgICBydHBfZGlmZiA9IGV4dF9ydHB0aW1lIC0gc3JjLT5sYXN0X3J0cHRpbWU7CisgICAgcnRfZGlmZiA9IHJ1bm5pbmdfdGltZSAtIHNyYy0+bGFzdF9ydGltZTsKKworICAgIC8qIGNhbGMgdGhlIGRpZmYgc28gd2UgY2FuIGRldGVjdCBkcmlmdCBhdCB0aGUgc2VuZGVyLiBUaGlzIGNhbiBhbHNvIGJlIHVzZWQKKyAgICAgKiB0byBndWVzdGltYXRlIHRoZSBjbG9jayByYXRlIGlmIHRoZSBOVFAgdGltZSBpcyBsb2NrZWQgdG8gdGhlIFJUUAorICAgICAqIHRpbWVzdGFtcHMgKGFzIGlzIHRoZSBjYXNlIHdoZW4gdGhlIGNhcHR1cmUgZGV2aWNlIGlzIHByb3ZpZGluZyB0aGUgY2xvY2spLiAqLworICAgIEdTVF9MT0cgKCJTU1JDICUwOHgsIGRpZmYgUlRQICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgZGlmZiBydW5uaW5nX3RpbWUgJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFULCBzcmMtPnNzcmMsIHJ0cF9kaWZmLCBHU1RfVElNRV9BUkdTIChydF9kaWZmKSk7CisgIH0KKworICAvKiB3ZSBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHJlY2VpdmVkIFJUUCB0aW1lc3RhbXAgYW5kIHRoZSBjb3JyZXNwb25kaW5nCisgICAqIGJ1ZmZlciBydW5uaW5nX3RpbWUgc28gdGhhdCB3ZSBjYW4gdXNlIHRoaXMgaW5mbyB3aGVuIGNvbnN0cnVjdGluZyBTUiByZXBvcnRzICovCisgIHNyYy0+bGFzdF9ydGltZSA9IHJ1bm5pbmdfdGltZTsKKyAgc3JjLT5sYXN0X3J0cHRpbWUgPSBleHRfcnRwdGltZTsKKworICAvKiBwdXNoIHBhY2tldCAqLworICBpZiAoIXNyYy0+Y2FsbGJhY2tzLnB1c2hfcnRwKQorICAgIGdvdG8gbm9fY2FsbGJhY2s7CisKKyAgR1NUX0xPRyAoInB1c2hpbmcgUlRQICVzICUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICBwaW5mby0+aXNfbGlzdCA/ICJsaXN0IiA6ICJwYWNrZXQiLCBzcmMtPnN0YXRzLnBhY2tldHNfc2VudCk7CisKKyAgcmVzdWx0ID0gc3JjLT5jYWxsYmFja3MucHVzaF9ydHAgKHNyYywgcGluZm8tPmRhdGEsIHNyYy0+dXNlcl9kYXRhKTsKKyAgcGluZm8tPmRhdGEgPSBOVUxMOworCisgIHJldHVybiByZXN1bHQ7CisKKyAgLyogRVJST1JTICovCitub19jYWxsYmFjazoKKyAgeworICAgIEdTVF9XQVJOSU5HICgibm8gY2FsbGJhY2sgaW5zdGFsbGVkLCBkcm9wcGluZyBwYWNrZXQiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK30KKworLyoqCisgKiBydHBfc291cmNlX3Byb2Nlc3Nfc3I6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKiBAdGltZTogdGltZSBvZiBwYWNrZXQgYXJyaXZhbAorICogQG50cHRpbWU6IHRoZSBOVFAgdGltZSAoaW4gTlRQIFRpbWVzdGFtcCBGb3JtYXQsIDMyLjMyIGZpeGVkIHBvaW50KQorICogQHJ0cHRpbWU6IHRoZSBSVFAgdGltZSAoaW4gY2xvY2sgcmF0ZSB1bml0cykKKyAqIEBwYWNrZXRfY291bnQ6IHRoZSBwYWNrZXQgY291bnQKKyAqIEBvY3RldF9jb3VudDogdGhlIG9jdGV0IGNvdW50CisgKgorICogVXBkYXRlIHRoZSBzZW5kZXIgcmVwb3J0IGluIEBzcmMuCisgKi8KK3ZvaWQKK3J0cF9zb3VyY2VfcHJvY2Vzc19zciAoUlRQU291cmNlICogc3JjLCBHc3RDbG9ja1RpbWUgdGltZSwgZ3VpbnQ2NCBudHB0aW1lLAorICAgIGd1aW50MzIgcnRwdGltZSwgZ3VpbnQzMiBwYWNrZXRfY291bnQsIGd1aW50MzIgb2N0ZXRfY291bnQpCit7CisgIFJUUFNlbmRlclJlcG9ydCAqY3VycjsKKyAgZ2ludCBjdXJyaWR4OworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKFJUUF9JU19TT1VSQ0UgKHNyYykpOworCisgIEdTVF9ERUJVRyAoImdvdCBTUiBwYWNrZXQ6IFNTUkMgJTA4eCwgTlRQICUwOHg6JTA4eCwgUlRQICUiIEdfR1VJTlQzMl9GT1JNQVQKKyAgICAgICIsIFBDICUiIEdfR1VJTlQzMl9GT1JNQVQgIiwgT0MgJSIgR19HVUlOVDMyX0ZPUk1BVCwgc3JjLT5zc3JjLAorICAgICAgKGd1aW50MzIpIChudHB0aW1lID4+IDMyKSwgKGd1aW50MzIpIChudHB0aW1lICYgMHhmZmZmZmZmZiksIHJ0cHRpbWUsCisgICAgICBwYWNrZXRfY291bnQsIG9jdGV0X2NvdW50KTsKKworICBjdXJyaWR4ID0gc3JjLT5zdGF0cy5jdXJyX3NyIF4gMTsKKyAgY3VyciA9ICZzcmMtPnN0YXRzLnNyW2N1cnJpZHhdOworCisgIC8qIHRoaXMgaXMgYSBzZW5kZXIgbm93ICovCisgIHNyYy0+aXNfc2VuZGVyID0gVFJVRTsKKworICAvKiB1cGRhdGUgY3VycmVudCAqLworICBjdXJyLT5pc192YWxpZCA9IFRSVUU7CisgIGN1cnItPm50cHRpbWUgPSBudHB0aW1lOworICBjdXJyLT5ydHB0aW1lID0gcnRwdGltZTsKKyAgY3Vyci0+cGFja2V0X2NvdW50ID0gcGFja2V0X2NvdW50OworICBjdXJyLT5vY3RldF9jb3VudCA9IG9jdGV0X2NvdW50OworICBjdXJyLT50aW1lID0gdGltZTsKKworICAvKiBtYWtlIGN1cnJlbnQgKi8KKyAgc3JjLT5zdGF0cy5jdXJyX3NyID0gY3VycmlkeDsKKworICBzcmMtPnN0YXRzLnByZXZfcnRjcHRpbWUgPSBzcmMtPnN0YXRzLmxhc3RfcnRjcHRpbWU7CisgIHNyYy0+c3RhdHMubGFzdF9ydGNwdGltZSA9IHRpbWU7Cit9CisKKy8qKgorICogcnRwX3NvdXJjZV9wcm9jZXNzX3JiOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICogQG50cG5zdGltZTogdGhlIGN1cnJlbnQgdGltZSBpbiBuYW5vc2Vjb25kcyBzaW5jZSAxOTcwCisgKiBAZnJhY3Rpb25sb3N0OiBmcmFjdGlvbiBsb3N0IHNpbmNlIGxhc3QgU1IvUlIKKyAqIEBwYWNrZXRzbG9zdDogdGhlIGN1bXVsYXRpdmUgbnVtYmVyIG9mIHBhY2tldHMgbG9zdAorICogQGV4dGhpZ2hlc3RzZXE6IHRoZSBleHRlbmRlZCBsYXN0IHNlcXVlbmNlIG51bWJlciByZWNlaXZlZAorICogQGppdHRlcjogdGhlIGludGVyYXJyaXZhbCBqaXR0ZXIgKGluIGNsb2NrIHJhdGUgdW5pdHMpCisgKiBAbHNyOiB0aGUgdGltZSBvZiB0aGUgbGFzdCBTUiBwYWNrZXQgb24gdGhpcyBzb3VyY2UKKyAqICAgKGluIE5UUCBTaG9ydCBGb3JtYXQsIDE2LjE2IGZpeGVkIHBvaW50KQorICogQGRsc3I6IHRoZSBkZWxheSBzaW5jZSB0aGUgbGFzdCBTUiBwYWNrZXQKKyAqICAgKGluIE5UUCBTaG9ydCBGb3JtYXQsIDE2LjE2IGZpeGVkIHBvaW50KQorICoKKyAqIFVwZGF0ZSB0aGUgcmVwb3J0IGJsb2NrIGluIEBzcmMuCisgKi8KK3ZvaWQKK3J0cF9zb3VyY2VfcHJvY2Vzc19yYiAoUlRQU291cmNlICogc3JjLCBndWludDY0IG50cG5zdGltZSwKKyAgICBndWludDggZnJhY3Rpb25sb3N0LCBnaW50MzIgcGFja2V0c2xvc3QsIGd1aW50MzIgZXh0aGlnaGVzdHNlcSwKKyAgICBndWludDMyIGppdHRlciwgZ3VpbnQzMiBsc3IsIGd1aW50MzIgZGxzcikKK3sKKyAgUlRQUmVjZWl2ZXJSZXBvcnQgKmN1cnI7CisgIGdpbnQgY3VycmlkeDsKKyAgZ3VpbnQzMiBudHAsIEE7CisgIGd1aW50NjQgZl9udHA7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoUlRQX0lTX1NPVVJDRSAoc3JjKSk7CisKKyAgR1NUX0RFQlVHICgiZ290IFJCIHBhY2tldDogU1NSQyAlMDh4LCBGTCAlMngsIFBMICVkLCBIUyAlIiBHX0dVSU5UMzJfRk9STUFUCisgICAgICAiLCBqaXR0ZXIgJSIgR19HVUlOVDMyX0ZPUk1BVCAiLCBMU1IgJTA0eDolMDR4LCBETFNSICUwNHg6JTA0eCIsCisgICAgICBzcmMtPnNzcmMsIGZyYWN0aW9ubG9zdCwgcGFja2V0c2xvc3QsIGV4dGhpZ2hlc3RzZXEsIGppdHRlciwgbHNyID4+IDE2LAorICAgICAgbHNyICYgMHhmZmZmLCBkbHNyID4+IDE2LCBkbHNyICYgMHhmZmZmKTsKKworICBjdXJyaWR4ID0gc3JjLT5zdGF0cy5jdXJyX3JyIF4gMTsKKyAgY3VyciA9ICZzcmMtPnN0YXRzLnJyW2N1cnJpZHhdOworCisgIC8qIHVwZGF0ZSBjdXJyZW50ICovCisgIGN1cnItPmlzX3ZhbGlkID0gVFJVRTsKKyAgY3Vyci0+ZnJhY3Rpb25sb3N0ID0gZnJhY3Rpb25sb3N0OworICBjdXJyLT5wYWNrZXRzbG9zdCA9IHBhY2tldHNsb3N0OworICBjdXJyLT5leHRoaWdoZXN0c2VxID0gZXh0aGlnaGVzdHNlcTsKKyAgY3Vyci0+aml0dGVyID0gaml0dGVyOworICBjdXJyLT5sc3IgPSBsc3I7CisgIGN1cnItPmRsc3IgPSBkbHNyOworCisgIC8qIGNvbnZlcnQgdGhlIE5UUCB0aW1lIGluIG5hbm9zZWNvbmRzIHRvIDMyLjMyIGZpeGVkIHBvaW50ICovCisgIGZfbnRwID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChudHBuc3RpbWUsICgxTEwgPDwgMzIpLCBHU1RfU0VDT05EKTsKKyAgLyogY2FsY3VsYXRlIHJvdW5kIHRyaXAsIHJvdW5kIHRoZSB0aW1lIHVwICovCisgIG50cCA9ICgoZl9udHAgKyAweGZmZmYpID4+IDE2KSAmIDB4ZmZmZmZmZmY7CisKKyAgQSA9IGRsc3IgKyBsc3I7CisgIGlmIChBID4gMCAmJiBudHAgPiBBKQorICAgIEEgPSBudHAgLSBBOworICBlbHNlCisgICAgQSA9IDA7CisgIGN1cnItPnJvdW5kX3RyaXAgPSBBOworCisgIEdTVF9ERUJVRyAoIk5UUCAlMDR4OiUwNHgsIHJvdW5kIHRyaXAgJTA0eDolMDR4IiwgbnRwID4+IDE2LCBudHAgJiAweGZmZmYsCisgICAgICBBID4+IDE2LCBBICYgMHhmZmZmKTsKKworICAvKiBtYWtlIGN1cnJlbnQgKi8KKyAgc3JjLT5zdGF0cy5jdXJyX3JyID0gY3VycmlkeDsKK30KKworLyoqCisgKiBydHBfc291cmNlX2dldF9uZXdfc3I6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKiBAbnRwbnN0aW1lOiB0aGUgY3VycmVudCB0aW1lIGluIG5hbm9zZWNvbmRzIHNpbmNlIDE5NzAKKyAqIEBydW5uaW5nX3RpbWU6IHRoZSBjdXJyZW50IHJ1bm5pbmdfdGltZSBvZiB0aGUgcGlwZWxpbmUKKyAqIEBudHB0aW1lOiB0aGUgTlRQIHRpbWUgKGluIE5UUCBUaW1lc3RhbXAgRm9ybWF0LCAzMi4zMiBmaXhlZCBwb2ludCkKKyAqIEBydHB0aW1lOiB0aGUgUlRQIHRpbWUgY29ycmVzcG9uZGluZyB0byBAbnRwdGltZSAoaW4gY2xvY2sgcmF0ZSB1bml0cykKKyAqIEBwYWNrZXRfY291bnQ6IHRoZSBwYWNrZXQgY291bnQKKyAqIEBvY3RldF9jb3VudDogdGhlIG9jdGV0IGNvdW50CisgKgorICogR2V0IG5ldyB2YWx1ZXMgdG8gcHV0IGludG8gYSBuZXcgU1IgcmVwb3J0IGZyb20gdGhpcyBzb3VyY2UuCisgKgorICogQHJ1bm5pbmdfdGltZSBhbmQgQG50cG5zdGltZSBhcmUgY2FwdHVyZWQgYXQgdGhlIHNhbWUgdGltZSBhbmQgcmVwcmVzZW50IHRoZQorICogcnVubmluZyB0aW1lIG9mIHRoZSBwaXBlbGluZSBjbG9jayBhbmQgdGhlIGFic29sdXRlIGN1cnJlbnQgc3lzdGVtIHRpbWUgaW4KKyAqIG5hbm9zZWNvbmRzIHJlc3BlY3RpdmVseS4gVG9nZXRoZXIgd2l0aCB0aGUgbGFzdCBydW5uaW5nX3RpbWUgYW5kIFJUUCB0aW1lc3RhbXAKKyAqIHdlIGhhdmUgb2JzZXJ2ZWQgaW4gdGhlIHNvdXJjZSwgd2UgY2FuIGdlbmVyYXRlIEBudHB0aW1lIGFuZCBAcnRwdGltZSBmb3IgYW4gU1IKKyAqIHBhY2tldC4gQG50cHRpbWUgaXMgYmFzaWNhbGx5IHRoZSBmaXhlZCBwb2ludCByZXByZXNlbnRhdGlvbiBvZiBAbnRwbnN0aW1lCisgKiBhbmQgQHJ0cHRpbWUgdGhlIGFzc29jaWF0ZWQgUlRQIHRpbWVzdGFtcC4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBvbiBzdWNjZXNzLgorICovCitnYm9vbGVhbgorcnRwX3NvdXJjZV9nZXRfbmV3X3NyIChSVFBTb3VyY2UgKiBzcmMsIGd1aW50NjQgbnRwbnN0aW1lLAorICAgIEdzdENsb2NrVGltZSBydW5uaW5nX3RpbWUsIGd1aW50NjQgKiBudHB0aW1lLCBndWludDMyICogcnRwdGltZSwKKyAgICBndWludDMyICogcGFja2V0X2NvdW50LCBndWludDMyICogb2N0ZXRfY291bnQpCit7CisgIGd1aW50NjQgdF9ydHA7CisgIGd1aW50NjQgdF9jdXJyZW50X250cDsKKyAgR3N0Q2xvY2tUaW1lRGlmZiBkaWZmOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChSVFBfSVNfU09VUkNFIChzcmMpLCBGQUxTRSk7CisKKyAgLyogV2UgbGFzdCBzYXcgYSBidWZmZXIgd2l0aCBsYXN0X3J0cHRpbWUgYXQgbGFzdF9ydGltZS4gR2l2ZW4gYSBydW5uaW5nX3RpbWUKKyAgICogYW5kIGFuIE5UUCB0aW1lLCB3ZSBjYW4gc2NhbGUgdGhlIFJUUCB0aW1lc3RhbXBzIHNvIHRoYXQgdGhleSBtYXRjaCB0aGUKKyAgICogZ2l2ZW4gTlRQIHRpbWUuICBmb3Igc2NhbGluZywgd2UgYXNzdW1lIHRoYXQgdGhlIHNsb3BlIG9mIHRoZSBydHB0aW1lIHZzCisgICAqIHJ1bm5pbmdfdGltZSB2cyBudHB0aW1lIGN1cnZlIGlzIGNsb3NlIHRvIDEsIHdoaWNoIGlzIGNlcnRhaW5seQorICAgKiBzdWZmaWNpZW50IGZvciB0aGUgZnJlcXVlbmN5IGF0IHdoaWNoIHdlIHJlcG9ydCBTUiBhbmQgdGhlIHJhdGUgd2Ugc2VuZAorICAgKiBvdXQgUlRQIHBhY2tldHMuICovCisgIHRfcnRwID0gc3JjLT5sYXN0X3J0cHRpbWU7CisKKyAgR1NUX0RFQlVHICgibGFzdF9ydGltZSAlIiBHU1RfVElNRV9GT1JNQVQgIiwgbGFzdF9ydHB0aW1lICUiCisgICAgICBHX0dVSU5UNjRfRk9STUFULCBHU1RfVElNRV9BUkdTIChzcmMtPmxhc3RfcnRpbWUpLCB0X3J0cCk7CisKKyAgaWYgKHNyYy0+Y2xvY2tfcmF0ZSA9PSAtMSAmJiBzcmMtPnB0X3NldCkgeworICAgIEdTVF9JTkZPICgibm8gY2xvY2stcmF0ZSwgZ2V0dGluZyBmb3IgcHQgJXUgYW5kIFNTUkMgJXUiLCBzcmMtPnB0LAorICAgICAgICBzcmMtPnNzcmMpOworICAgIGdldF9jbG9ja19yYXRlIChzcmMsIHNyYy0+cHQpOworICB9CisKKyAgaWYgKHNyYy0+Y2xvY2tfcmF0ZSAhPSAtMSkgeworICAgIC8qIGdldCB0aGUgZGlmZiBiZXR3ZWVuIHRoZSBjbG9jayBydW5uaW5nX3RpbWUgYW5kIHRoZSBidWZmZXIgcnVubmluZ190aW1lLgorICAgICAqIFRoaXMgaXMgdGhlIGVsYXBzZWQgdGltZSwgYXMgbWVhc3VyZWQgYWdhaW5zdCB0aGUgcGlwZWxpbmUgY2xvY2ssIGJldHdlZW4KKyAgICAgKiB3aGVuIHRoZSBydHAgdGltZXN0YW1wIHdhcyBvYnNlcnZlZCBhbmQgdGhlIGN1cnJlbnQgcnVubmluZ190aW1lLgorICAgICAqCisgICAgICogV2UgbmVlZCB0byBhcHBseSB0aGlzIGRpZmYgdG8gdGhlIFJUUCB0aW1lc3RhbXAgdG8gZ2V0IHRoZSBSVFAgdGltZXN0YW1wCisgICAgICogZm9yIHRoZSBnaXZlbiBudHBuc3RpbWUuICovCisgICAgZGlmZiA9IEdTVF9DTE9DS19ESUZGIChzcmMtPmxhc3RfcnRpbWUsIHJ1bm5pbmdfdGltZSk7CisgICAgR1NUX0RFQlVHICgicnVubmluZ190aW1lICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBkaWZmICUiIEdTVF9TVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHJ1bm5pbmdfdGltZSksIEdTVF9TVElNRV9BUkdTIChkaWZmKSk7CisKKyAgICAvKiBub3cgdHJhbnNsYXRlIHRoZSBkaWZmIHRvIFJUUCB0aW1lLCBoYW5kbGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGNhc2VzLgorICAgICAqIElmIHRoZXJlIGlzIG5vIGRpZmYsIHdlIGFscmVhZHkgc2V0IHJ0cHRpbWUgY29ycmVjdGx5IGFib3ZlLiAqLworICAgIGlmIChkaWZmID4gMCkgeworICAgICAgdF9ydHAgKz0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoZGlmZiwgc3JjLT5jbG9ja19yYXRlLCBHU1RfU0VDT05EKTsKKyAgICB9IGVsc2UgeworICAgICAgZGlmZiA9IC1kaWZmOworICAgICAgdF9ydHAgLT0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoZGlmZiwgc3JjLT5jbG9ja19yYXRlLCBHU1RfU0VDT05EKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkcgKCJubyBjbG9jay1yYXRlLCBjYW5ub3QgaW50ZXJwb2xhdGUgcnRwIHRpbWUgZm9yIFNTUkMgJXUiLAorICAgICAgICBzcmMtPnNzcmMpOworICB9CisKKyAgLyogY29udmVydCB0aGUgTlRQIHRpbWUgaW4gbmFub3NlY29uZHMgdG8gMzIuMzIgZml4ZWQgcG9pbnQgKi8KKyAgdF9jdXJyZW50X250cCA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAobnRwbnN0aW1lLCAoMUxMIDw8IDMyKSwgR1NUX1NFQ09ORCk7CisKKyAgR1NUX0RFQlVHICgiTlRQICUwOHg6JTA4eCwgUlRQICUiIEdfR1VJTlQzMl9GT1JNQVQsCisgICAgICAoZ3VpbnQzMikgKHRfY3VycmVudF9udHAgPj4gMzIpLCAoZ3VpbnQzMikgKHRfY3VycmVudF9udHAgJiAweGZmZmZmZmZmKSwKKyAgICAgIChndWludDMyKSB0X3J0cCk7CisKKyAgaWYgKG50cHRpbWUpCisgICAgKm50cHRpbWUgPSB0X2N1cnJlbnRfbnRwOworICBpZiAocnRwdGltZSkKKyAgICAqcnRwdGltZSA9IHRfcnRwOworICBpZiAocGFja2V0X2NvdW50KQorICAgICpwYWNrZXRfY291bnQgPSBzcmMtPnN0YXRzLnBhY2tldHNfc2VudDsKKyAgaWYgKG9jdGV0X2NvdW50KQorICAgICpvY3RldF9jb3VudCA9IHNyYy0+c3RhdHMub2N0ZXRzX3NlbnQ7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogcnRwX3NvdXJjZV9nZXRfbmV3X3JiOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICogQHRpbWU6IHRoZSBjdXJyZW50IHRpbWUgb2YgdGhlIHN5c3RlbSBjbG9jaworICogQGZyYWN0aW9ubG9zdDogZnJhY3Rpb24gbG9zdCBzaW5jZSBsYXN0IFNSL1JSCisgKiBAcGFja2V0c2xvc3Q6IHRoZSBjdW11bGF0aXZlIG51bWJlciBvZiBwYWNrZXRzIGxvc3QKKyAqIEBleHRoaWdoZXN0c2VxOiB0aGUgZXh0ZW5kZWQgbGFzdCBzZXF1ZW5jZSBudW1iZXIgcmVjZWl2ZWQKKyAqIEBqaXR0ZXI6IHRoZSBpbnRlcmFycml2YWwgaml0dGVyIChpbiBjbG9jayByYXRlIHVuaXRzKQorICogQGxzcjogdGhlIHRpbWUgb2YgdGhlIGxhc3QgU1IgcGFja2V0IG9uIHRoaXMgc291cmNlCisgKiAgIChpbiBOVFAgU2hvcnQgRm9ybWF0LCAxNi4xNiBmaXhlZCBwb2ludCkKKyAqIEBkbHNyOiB0aGUgZGVsYXkgc2luY2UgdGhlIGxhc3QgU1IgcGFja2V0CisgKiAgIChpbiBOVFAgU2hvcnQgRm9ybWF0LCAxNi4xNiBmaXhlZCBwb2ludCkKKyAqCisgKiBHZXQgbmV3IHZhbHVlcyB0byBwdXQgaW50byBhIG5ldyByZXBvcnQgYmxvY2sgZnJvbSB0aGlzIHNvdXJjZS4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBvbiBzdWNjZXNzLgorICovCitnYm9vbGVhbgorcnRwX3NvdXJjZV9nZXRfbmV3X3JiIChSVFBTb3VyY2UgKiBzcmMsIEdzdENsb2NrVGltZSB0aW1lLAorICAgIGd1aW50OCAqIGZyYWN0aW9ubG9zdCwgZ2ludDMyICogcGFja2V0c2xvc3QsIGd1aW50MzIgKiBleHRoaWdoZXN0c2VxLAorICAgIGd1aW50MzIgKiBqaXR0ZXIsIGd1aW50MzIgKiBsc3IsIGd1aW50MzIgKiBkbHNyKQoreworICBSVFBTb3VyY2VTdGF0cyAqc3RhdHM7CisgIGd1aW50NjQgZXh0ZW5kZWRfbWF4LCBleHBlY3RlZDsKKyAgZ3VpbnQ2NCBleHBlY3RlZF9pbnRlcnZhbCwgcmVjZWl2ZWRfaW50ZXJ2YWwsIG50cHRpbWU7CisgIGdpbnQ2NCBsb3N0LCBsb3N0X2ludGVydmFsOworICBndWludDMyIGZyYWN0aW9uLCBMU1IsIERMU1I7CisgIEdzdENsb2NrVGltZSBzcl90aW1lOworCisgIHN0YXRzID0gJnNyYy0+c3RhdHM7CisKKyAgZXh0ZW5kZWRfbWF4ID0gc3RhdHMtPmN5Y2xlcyArIHN0YXRzLT5tYXhfc2VxOworICBleHBlY3RlZCA9IGV4dGVuZGVkX21heCAtIHN0YXRzLT5iYXNlX3NlcSArIDE7CisKKyAgR1NUX0RFQlVHICgiZXh0X21heCAlIiBHX0dVSU5UNjRfRk9STUFUICIsIGV4cGVjdGVkICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICIsIHJlY2VpdmVkICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgYmFzZV9zZXEgJSIgR19HVUlOVDMyX0ZPUk1BVCwKKyAgICAgIGV4dGVuZGVkX21heCwgZXhwZWN0ZWQsIHN0YXRzLT5wYWNrZXRzX3JlY2VpdmVkLCBzdGF0cy0+YmFzZV9zZXEpOworCisgIGxvc3QgPSBleHBlY3RlZCAtIHN0YXRzLT5wYWNrZXRzX3JlY2VpdmVkOworICBsb3N0ID0gQ0xBTVAgKGxvc3QsIC0weDgwMDAwMCwgMHg3ZmZmZmYpOworCisgIGV4cGVjdGVkX2ludGVydmFsID0gZXhwZWN0ZWQgLSBzdGF0cy0+cHJldl9leHBlY3RlZDsKKyAgc3RhdHMtPnByZXZfZXhwZWN0ZWQgPSBleHBlY3RlZDsKKyAgcmVjZWl2ZWRfaW50ZXJ2YWwgPSBzdGF0cy0+cGFja2V0c19yZWNlaXZlZCAtIHN0YXRzLT5wcmV2X3JlY2VpdmVkOworICBzdGF0cy0+cHJldl9yZWNlaXZlZCA9IHN0YXRzLT5wYWNrZXRzX3JlY2VpdmVkOworCisgIGxvc3RfaW50ZXJ2YWwgPSBleHBlY3RlZF9pbnRlcnZhbCAtIHJlY2VpdmVkX2ludGVydmFsOworCisgIGlmIChleHBlY3RlZF9pbnRlcnZhbCA9PSAwIHx8IGxvc3RfaW50ZXJ2YWwgPD0gMCkKKyAgICBmcmFjdGlvbiA9IDA7CisgIGVsc2UKKyAgICBmcmFjdGlvbiA9IChsb3N0X2ludGVydmFsIDw8IDgpIC8gZXhwZWN0ZWRfaW50ZXJ2YWw7CisKKyAgR1NUX0RFQlVHICgiYWRkIFJSIGZvciBTU1JDICUwOHgiLCBzcmMtPnNzcmMpOworICAvKiB3ZSBzY2FsZWQgdGhlIGppdHRlciB1cCBmb3IgYWRkaXRpb25hbCBwcmVjaXNpb24gKi8KKyAgR1NUX0RFQlVHICgiZnJhY3Rpb24gJSIgR19HVUlOVDMyX0ZPUk1BVCAiLCBsb3N0ICUiIEdfR0lOVDY0X0ZPUk1BVAorICAgICAgIiwgZXh0c2VxICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgaml0dGVyICVkIiwgZnJhY3Rpb24sIGxvc3QsCisgICAgICBleHRlbmRlZF9tYXgsIHN0YXRzLT5qaXR0ZXIgPj4gNCk7CisKKyAgaWYgKHJ0cF9zb3VyY2VfZ2V0X2xhc3Rfc3IgKHNyYywgJnNyX3RpbWUsICZudHB0aW1lLCBOVUxMLCBOVUxMLCBOVUxMKSkgeworICAgIEdzdENsb2NrVGltZSBkaWZmOworCisgICAgLyogTFNSIGlzIG1pZGRsZSAzMiBiaXRzIG9mIHRoZSBsYXN0IG50cHRpbWUgKi8KKyAgICBMU1IgPSAobnRwdGltZSA+PiAxNikgJiAweGZmZmZmZmZmOworICAgIGRpZmYgPSB0aW1lIC0gc3JfdGltZTsKKyAgICBHU1RfREVCVUcgKCJsYXN0IFNSIHRpbWUgZGlmZiAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGRpZmYpKTsKKyAgICAvKiBETFNSLCBkZWxheSBzaW5jZSBsYXN0IFNSIGlzIGV4cHJlc3NlZCBpbiAxLzY1NTM2IHNlY29uZCB1bml0cyAqLworICAgIERMU1IgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChkaWZmLCA2NTUzNiwgR1NUX1NFQ09ORCk7CisgIH0gZWxzZSB7CisgICAgLyogTm8gdmFsaWQgU1IgcmVjZWl2ZWQsIExTUi9ETFNSIGFyZSBzZXQgdG8gMCB0aGVuICovCisgICAgR1NUX0RFQlVHICgibm8gdmFsaWQgU1IgcmVjZWl2ZWQiKTsKKyAgICBMU1IgPSAwOworICAgIERMU1IgPSAwOworICB9CisgIEdTVF9ERUJVRyAoIkxTUiAlMDR4OiUwNHgsIERMU1IgJTA0eDolMDR4IiwgTFNSID4+IDE2LCBMU1IgJiAweGZmZmYsCisgICAgICBETFNSID4+IDE2LCBETFNSICYgMHhmZmZmKTsKKworICBpZiAoZnJhY3Rpb25sb3N0KQorICAgICpmcmFjdGlvbmxvc3QgPSBmcmFjdGlvbjsKKyAgaWYgKHBhY2tldHNsb3N0KQorICAgICpwYWNrZXRzbG9zdCA9IGxvc3Q7CisgIGlmIChleHRoaWdoZXN0c2VxKQorICAgICpleHRoaWdoZXN0c2VxID0gZXh0ZW5kZWRfbWF4OworICBpZiAoaml0dGVyKQorICAgICpqaXR0ZXIgPSBzdGF0cy0+aml0dGVyID4+IDQ7CisgIGlmIChsc3IpCisgICAgKmxzciA9IExTUjsKKyAgaWYgKGRsc3IpCisgICAgKmRsc3IgPSBETFNSOworCisgIHJldHVybiBUUlVFOworfQorCisvKioKKyAqIHJ0cF9zb3VyY2VfZ2V0X2xhc3Rfc3I6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKiBAdGltZTogdGltZSBvZiBwYWNrZXQgYXJyaXZhbAorICogQG50cHRpbWU6IHRoZSBOVFAgdGltZSAoaW4gTlRQIFRpbWVzdGFtcCBGb3JtYXQsIDMyLjMyIGZpeGVkIHBvaW50KQorICogQHJ0cHRpbWU6IHRoZSBSVFAgdGltZSAoaW4gY2xvY2sgcmF0ZSB1bml0cykKKyAqIEBwYWNrZXRfY291bnQ6IHRoZSBwYWNrZXQgY291bnQKKyAqIEBvY3RldF9jb3VudDogdGhlIG9jdGV0IGNvdW50CisgKgorICogR2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGxhc3Qgc2VuZGVyIHJlcG9ydCBhcyBzZXQgd2l0aCBydHBfc291cmNlX3Byb2Nlc3Nfc3IoKS4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBpZiB0aGVyZSB3YXMgYSB2YWxpZCBTUiByZXBvcnQuCisgKi8KK2dib29sZWFuCitydHBfc291cmNlX2dldF9sYXN0X3NyIChSVFBTb3VyY2UgKiBzcmMsIEdzdENsb2NrVGltZSAqIHRpbWUsIGd1aW50NjQgKiBudHB0aW1lLAorICAgIGd1aW50MzIgKiBydHB0aW1lLCBndWludDMyICogcGFja2V0X2NvdW50LCBndWludDMyICogb2N0ZXRfY291bnQpCit7CisgIFJUUFNlbmRlclJlcG9ydCAqY3VycjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoUlRQX0lTX1NPVVJDRSAoc3JjKSwgRkFMU0UpOworCisgIGN1cnIgPSAmc3JjLT5zdGF0cy5zcltzcmMtPnN0YXRzLmN1cnJfc3JdOworICBpZiAoIWN1cnItPmlzX3ZhbGlkKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobnRwdGltZSkKKyAgICAqbnRwdGltZSA9IGN1cnItPm50cHRpbWU7CisgIGlmIChydHB0aW1lKQorICAgICpydHB0aW1lID0gY3Vyci0+cnRwdGltZTsKKyAgaWYgKHBhY2tldF9jb3VudCkKKyAgICAqcGFja2V0X2NvdW50ID0gY3Vyci0+cGFja2V0X2NvdW50OworICBpZiAob2N0ZXRfY291bnQpCisgICAgKm9jdGV0X2NvdW50ID0gY3Vyci0+b2N0ZXRfY291bnQ7CisgIGlmICh0aW1lKQorICAgICp0aW1lID0gY3Vyci0+dGltZTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBydHBfc291cmNlX2dldF9sYXN0X3JiOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICogQGZyYWN0aW9ubG9zdDogZnJhY3Rpb24gbG9zdCBzaW5jZSBsYXN0IFNSL1JSCisgKiBAcGFja2V0c2xvc3Q6IHRoZSBjdW11bGF0aXZlIG51bWJlciBvZiBwYWNrZXRzIGxvc3QKKyAqIEBleHRoaWdoZXN0c2VxOiB0aGUgZXh0ZW5kZWQgbGFzdCBzZXF1ZW5jZSBudW1iZXIgcmVjZWl2ZWQKKyAqIEBqaXR0ZXI6IHRoZSBpbnRlcmFycml2YWwgaml0dGVyIChpbiBjbG9jayByYXRlIHVuaXRzKQorICogQGxzcjogdGhlIHRpbWUgb2YgdGhlIGxhc3QgU1IgcGFja2V0IG9uIHRoaXMgc291cmNlCisgKiAgIChpbiBOVFAgU2hvcnQgRm9ybWF0LCAxNi4xNiBmaXhlZCBwb2ludCkKKyAqIEBkbHNyOiB0aGUgZGVsYXkgc2luY2UgdGhlIGxhc3QgU1IgcGFja2V0CisgKiAgIChpbiBOVFAgU2hvcnQgRm9ybWF0LCAxNi4xNiBmaXhlZCBwb2ludCkKKyAqIEByb3VuZF90cmlwOiB0aGUgcm91bmQtdHJpcCB0aW1lCisgKiAgIChpbiBOVFAgU2hvcnQgRm9ybWF0LCAxNi4xNiBmaXhlZCBwb2ludCkKKyAqCisgKiBHZXQgdGhlIHZhbHVlcyBvZiB0aGUgbGFzdCBSQiByZXBvcnQgc2V0IHdpdGggcnRwX3NvdXJjZV9wcm9jZXNzX3JiKCkuCisgKgorICogUmV0dXJuczogJVRSVUUgaWYgdGhlcmUgd2FzIGEgdmFsaWQgU0IgcmVwb3J0LgorICovCitnYm9vbGVhbgorcnRwX3NvdXJjZV9nZXRfbGFzdF9yYiAoUlRQU291cmNlICogc3JjLCBndWludDggKiBmcmFjdGlvbmxvc3QsCisgICAgZ2ludDMyICogcGFja2V0c2xvc3QsIGd1aW50MzIgKiBleHRoaWdoZXN0c2VxLCBndWludDMyICogaml0dGVyLAorICAgIGd1aW50MzIgKiBsc3IsIGd1aW50MzIgKiBkbHNyLCBndWludDMyICogcm91bmRfdHJpcCkKK3sKKyAgUlRQUmVjZWl2ZXJSZXBvcnQgKmN1cnI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFJUUF9JU19TT1VSQ0UgKHNyYyksIEZBTFNFKTsKKworICBjdXJyID0gJnNyYy0+c3RhdHMucnJbc3JjLT5zdGF0cy5jdXJyX3JyXTsKKyAgaWYgKCFjdXJyLT5pc192YWxpZCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKGZyYWN0aW9ubG9zdCkKKyAgICAqZnJhY3Rpb25sb3N0ID0gY3Vyci0+ZnJhY3Rpb25sb3N0OworICBpZiAocGFja2V0c2xvc3QpCisgICAgKnBhY2tldHNsb3N0ID0gY3Vyci0+cGFja2V0c2xvc3Q7CisgIGlmIChleHRoaWdoZXN0c2VxKQorICAgICpleHRoaWdoZXN0c2VxID0gY3Vyci0+ZXh0aGlnaGVzdHNlcTsKKyAgaWYgKGppdHRlcikKKyAgICAqaml0dGVyID0gY3Vyci0+aml0dGVyOworICBpZiAobHNyKQorICAgICpsc3IgPSBjdXJyLT5sc3I7CisgIGlmIChkbHNyKQorICAgICpkbHNyID0gY3Vyci0+ZGxzcjsKKyAgaWYgKHJvdW5kX3RyaXApCisgICAgKnJvdW5kX3RyaXAgPSBjdXJyLT5yb3VuZF90cmlwOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorZmluZF9jb25mbGljdGluZ19hZGRyZXNzIChHTGlzdCAqIGNvbmZsaWN0aW5nX2FkZHJlc3NlcywKKyAgICBHU29ja2V0QWRkcmVzcyAqIGFkZHJlc3MsIEdzdENsb2NrVGltZSB0aW1lKQoreworICBHTGlzdCAqaXRlbTsKKworICBmb3IgKGl0ZW0gPSBjb25mbGljdGluZ19hZGRyZXNzZXM7IGl0ZW07IGl0ZW0gPSBnX2xpc3RfbmV4dCAoaXRlbSkpIHsKKyAgICBSVFBDb25mbGljdGluZ0FkZHJlc3MgKmtub3duX2NvbmZsaWN0ID0gaXRlbS0+ZGF0YTsKKworICAgIGlmIChfX2dfc29ja2V0X2FkZHJlc3NfZXF1YWwgKGFkZHJlc3MsIGtub3duX2NvbmZsaWN0LT5hZGRyZXNzKSkgeworICAgICAga25vd25fY29uZmxpY3QtPnRpbWUgPSB0aW1lOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitHTGlzdCAqCithZGRfY29uZmxpY3RpbmdfYWRkcmVzcyAoR0xpc3QgKiBjb25mbGljdGluZ19hZGRyZXNzZXMsCisgICAgR1NvY2tldEFkZHJlc3MgKiBhZGRyZXNzLCBHc3RDbG9ja1RpbWUgdGltZSkKK3sKKyAgUlRQQ29uZmxpY3RpbmdBZGRyZXNzICpuZXdfY29uZmxpY3Q7CisKKyAgbmV3X2NvbmZsaWN0ID0gZ19zbGljZV9uZXcgKFJUUENvbmZsaWN0aW5nQWRkcmVzcyk7CisKKyAgbmV3X2NvbmZsaWN0LT5hZGRyZXNzID0gR19TT0NLRVRfQUREUkVTUyAoZ19vYmplY3RfcmVmIChhZGRyZXNzKSk7CisgIG5ld19jb25mbGljdC0+dGltZSA9IHRpbWU7CisKKyAgcmV0dXJuIGdfbGlzdF9wcmVwZW5kIChjb25mbGljdGluZ19hZGRyZXNzZXMsIG5ld19jb25mbGljdCk7Cit9CisKK0dMaXN0ICoKK3RpbWVvdXRfY29uZmxpY3RpbmdfYWRkcmVzc2VzIChHTGlzdCAqIGNvbmZsaWN0aW5nX2FkZHJlc3NlcywKKyAgICBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lKQoreworICBHTGlzdCAqaXRlbTsKKyAgLyogImEgcmVsYXRpdmVseSBsb25nIHRpbWUiIC0tIFJGQyAzNTUwIHNlY3Rpb24gOC4yICovCisgIGNvbnN0IEdzdENsb2NrVGltZSBjb2xsaXNpb25fdGltZW91dCA9CisgICAgICBSVFBfU1RBVFNfTUlOX0lOVEVSVkFMICogR1NUX1NFQ09ORCAqIDEwOworCisgIGl0ZW0gPSBnX2xpc3RfZmlyc3QgKGNvbmZsaWN0aW5nX2FkZHJlc3Nlcyk7CisgIHdoaWxlIChpdGVtKSB7CisgICAgUlRQQ29uZmxpY3RpbmdBZGRyZXNzICprbm93bl9jb25mbGljdCA9IGl0ZW0tPmRhdGE7CisgICAgR0xpc3QgKm5leHRfaXRlbSA9IGdfbGlzdF9uZXh0IChpdGVtKTsKKworICAgIGlmIChrbm93bl9jb25mbGljdC0+dGltZSA8IGN1cnJlbnRfdGltZSAtIGNvbGxpc2lvbl90aW1lb3V0KSB7CisgICAgICBnY2hhciAqYnVmOworCisgICAgICBjb25mbGljdGluZ19hZGRyZXNzZXMgPSBnX2xpc3RfZGVsZXRlX2xpbmsgKGNvbmZsaWN0aW5nX2FkZHJlc3NlcywgaXRlbSk7CisgICAgICBidWYgPSBfX2dfc29ja2V0X2FkZHJlc3NfdG9fc3RyaW5nIChrbm93bl9jb25mbGljdC0+YWRkcmVzcyk7CisgICAgICBHU1RfREVCVUcgKCJjb2xsaXNpb24gJXAgdGltZWQgb3V0OiAlcyIsIGtub3duX2NvbmZsaWN0LCBidWYpOworICAgICAgZ19mcmVlIChidWYpOworICAgICAgcnRwX2NvbmZsaWN0aW5nX2FkZHJlc3NfZnJlZSAoa25vd25fY29uZmxpY3QpOworICAgIH0KKyAgICBpdGVtID0gbmV4dF9pdGVtOworICB9CisKKyAgcmV0dXJuIGNvbmZsaWN0aW5nX2FkZHJlc3NlczsKK30KKworLyoqCisgKiBydHBfc291cmNlX2ZpbmRfY29uZmxpY3RpbmdfYWRkcmVzczoKKyAqIEBzcmM6IFRoZSBzb3VyY2UgdGhlIHBhY2tldCBjYW1lIGluCisgKiBAYWRkcmVzczogYWRkcmVzcyB0byBjaGVjayBmb3IKKyAqIEB0aW1lOiBUaGUgdGltZSB3aGVuIHRoZSBwYWNrZXQgdGhhdCBpcyBwb3NzaWJseSBpbiBjb25mbGljdCBhcnJpdmVkCisgKgorICogQ2hlY2tzIGlmIGFuIGFkZHJlc3Mgd2hpY2ggaGFzIGEgY29uZmxpY3QgaXMgYWxyZWFkeSBrbm93bi4gSWYgaXQgaXMKKyAqIGEga25vd24gY29uZmxpY3QsIHJlbWVtYmVyIHRoZSB0aW1lCisgKgorICogUmV0dXJuczogVFJVRSBpZiBpdCB3YXMgYSBrbm93biBjb25mbGljdCwgRkFMU0Ugb3RoZXJ3aXNlCisgKi8KK2dib29sZWFuCitydHBfc291cmNlX2ZpbmRfY29uZmxpY3RpbmdfYWRkcmVzcyAoUlRQU291cmNlICogc3JjLCBHU29ja2V0QWRkcmVzcyAqIGFkZHJlc3MsCisgICAgR3N0Q2xvY2tUaW1lIHRpbWUpCit7CisgIHJldHVybiBmaW5kX2NvbmZsaWN0aW5nX2FkZHJlc3MgKHNyYy0+Y29uZmxpY3RpbmdfYWRkcmVzc2VzLCBhZGRyZXNzLCB0aW1lKTsKK30KKworLyoqCisgKiBydHBfc291cmNlX2FkZF9jb25mbGljdGluZ19hZGRyZXNzOgorICogQHNyYzogVGhlIHNvdXJjZSB0aGUgcGFja2V0IGNhbWUgaW4KKyAqIEBhZGRyZXNzOiBhZGRyZXNzIHRvIHJlbWVtYmVyCisgKiBAdGltZTogVGhlIHRpbWUgd2hlbiB0aGUgcGFja2V0IHRoYXQgaXMgaW4gY29uZmxpY3QgYXJyaXZlZAorICoKKyAqIEFkZHMgYSBuZXcgY29uZmxpY3QgYWRkcmVzcworICovCit2b2lkCitydHBfc291cmNlX2FkZF9jb25mbGljdGluZ19hZGRyZXNzIChSVFBTb3VyY2UgKiBzcmMsCisgICAgR1NvY2tldEFkZHJlc3MgKiBhZGRyZXNzLCBHc3RDbG9ja1RpbWUgdGltZSkKK3sKKyAgc3JjLT5jb25mbGljdGluZ19hZGRyZXNzZXMgPQorICAgICAgYWRkX2NvbmZsaWN0aW5nX2FkZHJlc3MgKHNyYy0+Y29uZmxpY3RpbmdfYWRkcmVzc2VzLCBhZGRyZXNzLCB0aW1lKTsKK30KKworLyoqCisgKiBydHBfc291cmNlX3RpbWVvdXQ6CisgKiBAc3JjOiBUaGUgI1JUUFNvdXJjZQorICogQGN1cnJlbnRfdGltZTogVGhlIGN1cnJlbnQgdGltZQorICogQGZlZWRiYWNrX3JldGVudGlvbl93aW5kb3c6IFRoZSBydW5uaW5nIHRpbWUgYmVmb3JlIHdoaWNoIHJldGFpbmVkIGZlZWRiYWNrCisgKiBwYWNrZXRzIGhhdmUgdG8gYmUgZGlzY2FyZGVkCisgKgorICogVGhpcyBpcyBwcm9jZXNzZWQgb24gZWFjaCBSVENQIGludGVydmFsLiBJdCB0aW1lcyBvdXQgb2xkIGNvbGxpc2lvbnMuCisgKiBJdCBhbHNvIHRpbWVzIG91dCBvbGQgcmV0YWluZWQgZmVlZGJhY2sgcGFja2V0cworICovCit2b2lkCitydHBfc291cmNlX3RpbWVvdXQgKFJUUFNvdXJjZSAqIHNyYywgR3N0Q2xvY2tUaW1lIGN1cnJlbnRfdGltZSwKKyAgICBHc3RDbG9ja1RpbWUgZmVlZGJhY2tfcmV0ZW50aW9uX3dpbmRvdykKK3sKKyAgR3N0UlRDUFBhY2tldCAqcGt0OworCisgIHNyYy0+Y29uZmxpY3RpbmdfYWRkcmVzc2VzID0KKyAgICAgIHRpbWVvdXRfY29uZmxpY3RpbmdfYWRkcmVzc2VzIChzcmMtPmNvbmZsaWN0aW5nX2FkZHJlc3NlcywgY3VycmVudF90aW1lKTsKKworICAvKiBUaW1lIG91dCBBVlBGIHBhY2tldHMgdGhhdCBhcmUgb2xkZXIgdGhhbiB0aGUgZGVzaXJlZCBsZW5ndGggKi8KKyAgd2hpbGUgKChwa3QgPSBnX3F1ZXVlX3BlZWtfdGFpbCAoc3JjLT5yZXRhaW5lZF9mZWVkYmFjaykpICYmCisgICAgICBHU1RfQlVGRkVSX1BUUyAocGt0KSA8IGZlZWRiYWNrX3JldGVudGlvbl93aW5kb3cpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoZ19xdWV1ZV9wb3BfdGFpbCAoc3JjLT5yZXRhaW5lZF9mZWVkYmFjaykpOworfQorCitzdGF0aWMgZ2ludAorY29tcGFyZV9idWZmZXJzIChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBjb25zdCBHc3RCdWZmZXIgKmJ1ZmEgPSBhOworICBjb25zdCBHc3RCdWZmZXIgKmJ1ZmIgPSBiOworCisgIHJldHVybiBHU1RfQlVGRkVSX1BUUyAoYnVmYSkgLSBHU1RfQlVGRkVSX1BUUyAoYnVmYik7Cit9CisKK3ZvaWQKK3J0cF9zb3VyY2VfcmV0YWluX3J0Y3BfcGFja2V0IChSVFBTb3VyY2UgKiBzcmMsIEdzdFJUQ1BQYWNrZXQgKiBwYWNrZXQsCisgICAgR3N0Q2xvY2tUaW1lIHJ1bm5pbmdfdGltZSkKK3sKKyAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9jb3B5X3JlZ2lvbiAocGFja2V0LT5ydGNwLT5idWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9NRU1PUlksCisgICAgICBwYWNrZXQtPm9mZnNldCwgKGdzdF9ydGNwX3BhY2tldF9nZXRfbGVuZ3RoIChwYWNrZXQpICsgMSkgKiA0KTsKKworICBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKSA9IHJ1bm5pbmdfdGltZTsKKworICBnX3F1ZXVlX2luc2VydF9zb3J0ZWQgKHNyYy0+cmV0YWluZWRfZmVlZGJhY2ssIGJ1ZmZlciwgY29tcGFyZV9idWZmZXJzLCBOVUxMKTsKK30KKworZ2Jvb2xlYW4KK3J0cF9zb3VyY2VfaGFzX3JldGFpbmVkIChSVFBTb3VyY2UgKiBzcmMsIEdDb21wYXJlRnVuYyBmdW5jLCBnY29uc3Rwb2ludGVyIGRhdGEpCit7CisgIGlmIChnX3F1ZXVlX2ZpbmRfY3VzdG9tIChzcmMtPnJldGFpbmVkX2ZlZWRiYWNrLCBkYXRhLCBmdW5jKSkKKyAgICByZXR1cm4gVFJVRTsKKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBydHBfc291cmNlX3JlZ2lzdGVyX25hY2s6CisgKiBAc3JjOiBUaGUgI1JUUFNvdXJjZQorICogQHNlcW51bTogYSBzZXFudW0KKyAqCisgKiBSZWdpc3RlciB0aGF0IEBzZXFudW0gaGFzIG5vdCBiZWVuIHJlY2VpdmVkIGZyb20gQHNyYy4KKyAqLwordm9pZAorcnRwX3NvdXJjZV9yZWdpc3Rlcl9uYWNrIChSVFBTb3VyY2UgKiBzcmMsIGd1aW50MTYgc2VxbnVtKQoreworICBndWludCBpLCBsZW47CisgIGd1aW50MzIgZHdvcmQgPSBzZXFudW0gPDwgMTY7CisgIGdpbnQgZGlmZiA9IDE2OworCisgIGxlbiA9IHNyYy0+bmFja3MtPmxlbjsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgZ3VpbnQzMiB0ZHdvcmQ7CisgICAgZ3VpbnQxNiB0c2VxOworCisgICAgdGR3b3JkID0gZ19hcnJheV9pbmRleCAoc3JjLT5uYWNrcywgZ3VpbnQzMiwgaSk7CisgICAgdHNlcSA9IHRkd29yZCA+PiAxNjsKKworICAgIGRpZmYgPSBnc3RfcnRwX2J1ZmZlcl9jb21wYXJlX3NlcW51bSAodHNlcSwgc2VxbnVtKTsKKyAgICBpZiAoZGlmZiA8IDE2KQorICAgICAgYnJlYWs7CisgIH0KKyAgLyogd2UgYWxyZWFkeSBoYXZlIHRoaXMgc2VxbnVtICovCisgIGlmIChkaWZmID09IDApCisgICAgcmV0dXJuOworICAvKiBpdCBjb21lcyBiZWZvcmUgdGhlIHJlY29yZGVkIHNlcW51bSwgRklYTUUsIHdlIGNvdWxkIG1lcmdlIGl0CisgICAqIGlmIG5vdCB0byBmYXIgYXdheSAqLworICBpZiAoZGlmZiA8IDApIHsKKyAgICBHU1RfREVCVUcgKCJpbnNlcnQgTkFDSyAjJXUgYXQgJXUiLCBzZXFudW0sIGkpOworICAgIGdfYXJyYXlfaW5zZXJ0X3ZhbCAoc3JjLT5uYWNrcywgaSwgZHdvcmQpOworICB9IGVsc2UgaWYgKGRpZmYgPCAxNikgeworICAgIC8qIHdlIGNhbiBtZXJnZSBpdCAqLworICAgIGR3b3JkID0gZ19hcnJheV9pbmRleCAoc3JjLT5uYWNrcywgZ3VpbnQzMiwgaSk7CisgICAgZHdvcmQgfD0gMSA8PCAoZGlmZiAtIDEpOworICAgIEdTVF9ERUJVRyAoIm1lcmdlIE5BQ0sgIyV1IGF0ICV1IHdpdGggTkFDSyAjJXUgLT4gMHglMDh4Iiwgc2VxbnVtLCBpLAorICAgICAgICBkd29yZCA+PiAxNiwgZHdvcmQpOworICAgIGdfYXJyYXlfaW5kZXggKHNyYy0+bmFja3MsIGd1aW50MzIsIGkpID0gZHdvcmQ7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHICgiYXBwZW5kIE5BQ0sgIyV1Iiwgc2VxbnVtKTsKKyAgICBnX2FycmF5X2FwcGVuZF92YWwgKHNyYy0+bmFja3MsIGR3b3JkKTsKKyAgfQorICBzcmMtPnNlbmRfbmFjayA9IFRSVUU7Cit9CisKKy8qKgorICogcnRwX3NvdXJjZV9nZXRfbmFja3M6CisgKiBAc3JjOiBUaGUgI1JUUFNvdXJjZQorICogQG5fbmFja3M6IHJlc3VsdCBudW1iZXIgb2YgbmFja3MKKyAqCisgKiBHZXQgdGhlIHJlZ2lzdGVyZWQgTkFDS1Mgc2luY2UgdGhlIGxhc3QgcnRwX3NvdXJjZV9jbGVhcl9uYWNrcygpLgorICoKKyAqIFJldHVybnM6IGFuIGFycmF5IG9mIEBuX25hY2tzIHNlcW51bSB2YWx1ZXMuCisgKi8KK2d1aW50MzIgKgorcnRwX3NvdXJjZV9nZXRfbmFja3MgKFJUUFNvdXJjZSAqIHNyYywgZ3VpbnQgKiBuX25hY2tzKQoreworICBpZiAobl9uYWNrcykKKyAgICAqbl9uYWNrcyA9IHNyYy0+bmFja3MtPmxlbjsKKworICByZXR1cm4gKGd1aW50MzIgKikgc3JjLT5uYWNrcy0+ZGF0YTsKK30KKwordm9pZAorcnRwX3NvdXJjZV9jbGVhcl9uYWNrcyAoUlRQU291cmNlICogc3JjKQoreworICBnX2FycmF5X3NldF9zaXplIChzcmMtPm5hY2tzLCAwKTsKKyAgc3JjLT5zZW5kX25hY2sgPSBGQUxTRTsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oIGIvZ3N0L3J0cG1hbmFnZXIvcnRwc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgyMjY3ZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHBtYW5hZ2VyL3J0cHNvdXJjZS5oCkBAIC0wLDAgKzEsMzA1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpICAyMDE1IEt1cmVudG8gKGh0dHA6Ly9rdXJlbnRvLm9yZy8pCisgKiAgIEBhdXRob3I6IE1pZ3VlbCBQYXLDrXMgPG1wYXJpc2RpYXpAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19SVFBfU09VUkNFX0hfXworI2RlZmluZSBfX1JUUF9TT1VSQ0VfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9ydHAuaD4KKyNpbmNsdWRlIDxnc3QvbmV0L2dzdG5ldGFkZHJlc3NtZXRhLmg+CisjaW5jbHVkZSA8Z2lvL2dpby5oPgorCisjaW5jbHVkZSAicnRwc3RhdHMuaCIKKworLyogdGhlIGRlZmF1bHQgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIFJUUCBwYWNrZXRzIHdlIG5lZWQgdG8gcmVjZWl2ZSBiZWZvcmUgdGhlCisgKiBzb3VyY2UgaXMgY29uc2lkZXJlZCB2YWxpZCAqLworI2RlZmluZSBSVFBfTk9fUFJPQkFUSU9OICAgICAgICAwCisjZGVmaW5lIFJUUF9ERUZBVUxUX1BST0JBVElPTiAgIDIKKworI2RlZmluZSBSVFBfU0VRX01PRCAgICAgICAgICAoMSA8PCAxNikKKwordHlwZWRlZiBzdHJ1Y3QgX1JUUFNvdXJjZSBSVFBTb3VyY2U7Cit0eXBlZGVmIHN0cnVjdCBfUlRQU291cmNlQ2xhc3MgUlRQU291cmNlQ2xhc3M7CisKKyNkZWZpbmUgUlRQX1RZUEVfU09VUkNFICAgICAgICAgICAgIChydHBfc291cmNlX2dldF90eXBlKCkpCisjZGVmaW5lIFJUUF9TT1VSQ0Uoc3JjKSAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKHNyYyksUlRQX1RZUEVfU09VUkNFLFJUUFNvdXJjZSkpCisjZGVmaW5lIFJUUF9TT1VSQ0VfQ0xBU1Moa2xhc3MpICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxSVFBfVFlQRV9TT1VSQ0UsUlRQU291cmNlQ2xhc3MpKQorI2RlZmluZSBSVFBfSVNfU09VUkNFKHNyYykgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChzcmMpLFJUUF9UWVBFX1NPVVJDRSkpCisjZGVmaW5lIFJUUF9JU19TT1VSQ0VfQ0xBU1Moa2xhc3MpICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxSVFBfVFlQRV9TT1VSQ0UpKQorI2RlZmluZSBSVFBfU09VUkNFX0NBU1Qoc3JjKSAgICAgICAgKChSVFBTb3VyY2UgKikoc3JjKSkKKworLyoqCisgKiBSVFBfU09VUkNFX0lTX0FDVElWRToKKyAqIEBzcmM6IGFuICNSVFBTb3VyY2UKKyAqCisgKiBDaGVjayBpZiBAc3JjIGlzIGFjdGl2ZS4gQSBzb3VyY2UgaXMgYWN0aXZlIHdoZW4gaXQgaGFzIGJlZW4gdmFsaWRhdGVkCisgKiBhbmQgaGFzIG5vdCB5ZXQgcmVjZWl2ZWQgYSBCWUUgcGFja2V0LgorICovCisjZGVmaW5lIFJUUF9TT1VSQ0VfSVNfQUNUSVZFKHNyYykgIChzcmMtPnZhbGlkYXRlZCAmJiAhc3JjLT5tYXJrZWRfYnllKQorCisvKioKKyAqIFJUUF9TT1VSQ0VfSVNfU0VOREVSOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICoKKyAqIENoZWNrIGlmIEBzcmMgaXMgYSBzZW5kZXIuCisgKi8KKyNkZWZpbmUgUlRQX1NPVVJDRV9JU19TRU5ERVIoc3JjKSAgKHNyYy0+aXNfc2VuZGVyKQorLyoqCisgKiBSVFBfU09VUkNFX0lTX01BUktFRF9CWUU6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKgorICogQ2hlY2sgaWYgQHNyYyBpcyBhIG1hcmtlZCBhcyBCWUUuCisgKi8KKyNkZWZpbmUgUlRQX1NPVVJDRV9JU19NQVJLRURfQllFKHNyYykgIChzcmMtPm1hcmtlZF9ieWUpCisKKworLyoqCisgKiBSVFBTb3VyY2VQdXNoUlRQOgorICogQHNyYzogYW4gI1JUUFNvdXJjZQorICogQGRhdGE6IHRoZSBSVFAgYnVmZmVyIG9yIGJ1ZmZlciBsaXN0IHJlYWR5IGZvciBwcm9jZXNzaW5nCisgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgc3BlY2lmaWVkIHdoZW4gcmVnaXN0ZXJpbmcKKyAqCisgKiBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdoZW4gQHNyYyBoYXMgQGJ1ZmZlciByZWFkeSBmb3IgZnVydGhlcgorICogcHJvY2Vzc2luZy4KKyAqCisgKiBSZXR1cm5zOiBhICNHc3RGbG93UmV0dXJuLgorICovCit0eXBlZGVmIEdzdEZsb3dSZXR1cm4gKCpSVFBTb3VyY2VQdXNoUlRQKSAoUlRQU291cmNlICpzcmMsIGdwb2ludGVyIGRhdGEsCisJZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKworLyoqCisgKiBSVFBTb3VyY2VDbG9ja1JhdGU6CisgKiBAc3JjOiBhbiAjUlRQU291cmNlCisgKiBAcGF5bG9hZDogYSBwYXlsb2FkIHR5cGUKKyAqIEB1c2VyX2RhdGE6IHVzZXIgZGF0YSBzcGVjaWZpZWQgd2hlbiByZWdpc3RlcmluZworICoKKyAqIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbiBAc3JjIG5lZWRzIHRoZSBjbG9jay1yYXRlIG9mIHRoZQorICogQHBheWxvYWQuCisgKgorICogUmV0dXJuczogYSBjbG9jay1yYXRlIGZvciBAcGF5bG9hZC4KKyAqLwordHlwZWRlZiBnaW50ICgqUlRQU291cmNlQ2xvY2tSYXRlKSAoUlRQU291cmNlICpzcmMsIGd1aW50OCBwYXlsb2FkLCBncG9pbnRlciB1c2VyX2RhdGEpOworCisvKioKKyAqIFJUUFNvdXJjZUNhbGxiYWNrczoKKyAqIEBwdXNoX3J0cDogYSBwYWNrZXQgYmVjb21lcyBhdmFpbGFibGUgZm9yIGhhbmRsaW5nCisgKiBAY2xvY2tfcmF0ZTogYSBjbG9jay1yYXRlIGlzIHJlcXVlc3RlZAorICogQGdldF90aW1lOiB0aGUgY3VycmVudCBjbG9jayB0aW1lIGlzIHJlcXVlc3RlZAorICoKKyAqIENhbGxiYWNrcyBwZXJmb3JtZWQgYnkgI1JUUFNvdXJjZSB3aGVuIGFjdGlvbnMgbmVlZCB0byBiZSBwZXJmb3JtZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgUlRQU291cmNlUHVzaFJUUCAgICAgcHVzaF9ydHA7CisgIFJUUFNvdXJjZUNsb2NrUmF0ZSAgIGNsb2NrX3JhdGU7Cit9IFJUUFNvdXJjZUNhbGxiYWNrczsKKworLyoqCisgKiBSVFBDb25mbGljdGluZ0FkZHJlc3M6CisgKiBAYWRkcmVzczogI0dTb2NrZXRBZGRyZXNzIHdoaWNoIGNvbmZsaWN0ZWQKKyAqIEBsYXN0X2NvbmZsaWN0X3RpbWU6IHRpbWUgd2hlbiB0aGUgbGFzdCBjb25mbGljdCB3YXMgc2VlbgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gYWNjb3VudCBmb3IgYWRkcmVzc2VzIHRoYXQgaGF2ZSBjb25mbGljdGVkIHRvIGZpbmQKKyAqIGxvb3BzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIEdTb2NrZXRBZGRyZXNzICphZGRyZXNzOworICBHc3RDbG9ja1RpbWUgdGltZTsKK30gUlRQQ29uZmxpY3RpbmdBZGRyZXNzOworCisvKioKKyAqIFJUUFNvdXJjZToKKyAqCisgKiBBIHNvdXJjZSBpbiB0aGUgI1JUUFNlc3Npb24KKyAqCisgKiBAY29uZmxpY3RpbmdfYWRkcmVzc2VzOiBHTGlzdCBvZiBjb25mbGljdGluZyBhZGRyZXNzZXMKKyAqLworc3RydWN0IF9SVFBTb3VyY2UgeworICBHT2JqZWN0ICAgICAgIG9iamVjdDsKKworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgZ3VpbnQzMiAgICAgICBzc3JjOworCisgIGd1aW50MTYgICAgICAgZ2VuZXJhdGlvbjsKKyAgR0hhc2hUYWJsZSAgICAqcmVwb3J0ZWRfaW5fc3Jfb2Y7ICAgICAvKiBzZXQgb2YgU1NSQ3MgKi8KKworICBndWludCAgICAgICAgIHByb2JhdGlvbjsKKyAgZ3VpbnQgICAgICAgICBjdXJyX3Byb2JhdGlvbjsKKyAgZ2Jvb2xlYW4gICAgICB2YWxpZGF0ZWQ7CisgIGdib29sZWFuICAgICAgaW50ZXJuYWw7CisgIGdib29sZWFuICAgICAgaXNfY3NyYzsKKyAgZ2Jvb2xlYW4gICAgICBpc19zZW5kZXI7CisgIGdib29sZWFuICAgICAgY2xvc2luZzsKKworICBHc3RTdHJ1Y3R1cmUgICpzZGVzOworCisgIGdib29sZWFuICAgICAgbWFya2VkX2J5ZTsKKyAgZ2NoYXIgICAgICAgICpieWVfcmVhc29uOworICBnYm9vbGVhbiAgICAgIHNlbnRfYnllOworCisgIEdTb2NrZXRBZGRyZXNzICpydHBfZnJvbTsKKyAgR1NvY2tldEFkZHJlc3MgKnJ0Y3BfZnJvbTsKKworICBnaW50ICAgICAgICAgIHBheWxvYWQ7CisgIEdzdENhcHMgICAgICAqY2FwczsKKyAgZ2ludCAgICAgICAgICBjbG9ja19yYXRlOworICBnaW50MzIgICAgICAgIHNlcW51bV9vZmZzZXQ7CisKKyAgR3N0Q2xvY2tUaW1lICBieWVfdGltZTsKKyAgR3N0Q2xvY2tUaW1lICBsYXN0X2FjdGl2aXR5OworICBHc3RDbG9ja1RpbWUgIGxhc3RfcnRwX2FjdGl2aXR5OworCisgIEdzdENsb2NrVGltZSAgbGFzdF9ydGltZTsKKyAgR3N0Q2xvY2tUaW1lICBsYXN0X3J0cHRpbWU7CisKKyAgLyogZm9yIGJpdHJhdGUgZXN0aW1hdGlvbiAqLworICBndWludDY0ICAgICAgIGJpdHJhdGU7CisgIEdzdENsb2NrVGltZSAgcHJldl9ydGltZTsKKyAgZ3VpbnQ2NCAgICAgICBieXRlc19zZW50OworICBndWludDY0ICAgICAgIGJ5dGVzX3JlY2VpdmVkOworCisgIEdRdWV1ZSAgICAgICAqcGFja2V0czsKKyAgUlRQUGFja2V0UmF0ZUN0eCBwYWNrZXRfcmF0ZV9jdHg7CisgIGd1aW50MzIgICAgICAgbWF4X2Ryb3BvdXRfdGltZTsKKyAgZ3VpbnQzMiAgICAgICBtYXhfbWlzb3JkZXJfdGltZTsKKworICBSVFBTb3VyY2VDYWxsYmFja3MgY2FsbGJhY2tzOworICBncG9pbnRlciAgICAgICAgICAgdXNlcl9kYXRhOworCisgIFJUUFNvdXJjZVN0YXRzIHN0YXRzOworICBSVFBSZWNlaXZlclJlcG9ydCBsYXN0X3JyOworCisgIEdMaXN0ICAgICAgICAgKmNvbmZsaWN0aW5nX2FkZHJlc3NlczsKKworICBHUXVldWUgICAgICAgICpyZXRhaW5lZF9mZWVkYmFjazsKKworICBnYm9vbGVhbiAgICAgc2VuZF9wbGk7CisgIGdib29sZWFuICAgICBzZW5kX2ZpcjsKKyAgZ3VpbnQ4ICAgICAgIGN1cnJlbnRfc2VuZF9maXJfc2VxbnVtOworICBnaW50ICAgICAgICAgbGFzdF9maXJfY291bnQ7CisgIEdzdENsb2NrVGltZSBsYXN0X2tleWZyYW1lX3JlcXVlc3Q7CisKKyAgZ2Jvb2xlYW4gICAgIHNlbmRfbmFjazsKKyAgR0FycmF5ICAgICAgKm5hY2tzOworCisgIGdib29sZWFuICAgICAgcHRfc2V0OworICBndWludDggICAgICAgIHB0OworfTsKKworc3RydWN0IF9SVFBTb3VyY2VDbGFzcyB7CisgIEdPYmplY3RDbGFzcyAgIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIHJ0cF9zb3VyY2VfZ2V0X3R5cGUgKHZvaWQpOworCisvKiBtYW5hZ2luZyBsaWZldGltZSBvZiBzb3VyY2VzICovCitSVFBTb3VyY2UqICAgICAgcnRwX3NvdXJjZV9uZXcgICAgICAgICAgICAgICAgIChndWludDMyIHNzcmMpOwordm9pZCAgICAgICAgICAgIHJ0cF9zb3VyY2Vfc2V0X2NhbGxiYWNrcyAgICAgICAoUlRQU291cmNlICpzcmMsIFJUUFNvdXJjZUNhbGxiYWNrcyAqY2IsIGdwb2ludGVyIGRhdGEpOworCisvKiBwcm9wZXJ0aWVzICovCitndWludDMyICAgICAgICAgcnRwX3NvdXJjZV9nZXRfc3NyYyAgICAgICAgICAgIChSVFBTb3VyY2UgKnNyYyk7CisKK3ZvaWQgICAgICAgICAgICBydHBfc291cmNlX3NldF9hc19jc3JjICAgICAgICAgKFJUUFNvdXJjZSAqc3JjKTsKK2dib29sZWFuICAgICAgICBydHBfc291cmNlX2lzX2FzX2NzcmMgICAgICAgICAgKFJUUFNvdXJjZSAqc3JjKTsKKworZ2Jvb2xlYW4gICAgICAgIHJ0cF9zb3VyY2VfaXNfYWN0aXZlICAgICAgICAgICAoUlRQU291cmNlICpzcmMpOworZ2Jvb2xlYW4gICAgICAgIHJ0cF9zb3VyY2VfaXNfdmFsaWRhdGVkICAgICAgICAoUlRQU291cmNlICpzcmMpOworZ2Jvb2xlYW4gICAgICAgIHJ0cF9zb3VyY2VfaXNfc2VuZGVyICAgICAgICAgICAoUlRQU291cmNlICpzcmMpOworCit2b2lkICAgICAgICAgICAgcnRwX3NvdXJjZV9tYXJrX2J5ZSAgICAgICAgICAgIChSVFBTb3VyY2UgKnNyYywgY29uc3QgZ2NoYXIgKnJlYXNvbik7CitnYm9vbGVhbiAgICAgICAgcnRwX3NvdXJjZV9pc19tYXJrZWRfYnllICAgICAgIChSVFBTb3VyY2UgKnNyYyk7CitnY2hhciAqICAgICAgICAgcnRwX3NvdXJjZV9nZXRfYnllX3JlYXNvbiAgICAgIChSVFBTb3VyY2UgKnNyYyk7CisKK3ZvaWQgICAgICAgICAgICBydHBfc291cmNlX3VwZGF0ZV9jYXBzICAgICAgICAgKFJUUFNvdXJjZSAqc3JjLCBHc3RDYXBzICpjYXBzKTsKKworLyogU0RFUyBpbmZvICovCitjb25zdCBHc3RTdHJ1Y3R1cmUgKgorICAgICAgICAgICAgICAgIHJ0cF9zb3VyY2VfZ2V0X3NkZXNfc3RydWN0ICAgICAoUlRQU291cmNlICogc3JjKTsKK2dib29sZWFuICAgICAgICBydHBfc291cmNlX3NldF9zZGVzX3N0cnVjdCAgICAgKFJUUFNvdXJjZSAqIHNyYywgR3N0U3RydWN0dXJlICpzZGVzKTsKKworLyogaGFuZGxpbmcgbmV0d29yayBhZGRyZXNzICovCit2b2lkICAgICAgICAgICAgcnRwX3NvdXJjZV9zZXRfcnRwX2Zyb20gICAgICAgIChSVFBTb3VyY2UgKnNyYywgR1NvY2tldEFkZHJlc3MgKmFkZHJlc3MpOwordm9pZCAgICAgICAgICAgIHJ0cF9zb3VyY2Vfc2V0X3J0Y3BfZnJvbSAgICAgICAoUlRQU291cmNlICpzcmMsIEdTb2NrZXRBZGRyZXNzICphZGRyZXNzKTsKKworLyogaGFuZGxpbmcgUlRQICovCitHc3RGbG93UmV0dXJuICAgcnRwX3NvdXJjZV9wcm9jZXNzX3J0cCAgICAgICAgIChSVFBTb3VyY2UgKnNyYywgUlRQUGFja2V0SW5mbyAqcGluZm8pOworCitHc3RGbG93UmV0dXJuICAgcnRwX3NvdXJjZV9zZW5kX3J0cCAgICAgICAgICAgIChSVFBTb3VyY2UgKnNyYywgUlRQUGFja2V0SW5mbyAqcGluZm8pOworCisvKiBSVENQIG1lc3NhZ2VzICovCit2b2lkICAgICAgICAgICAgcnRwX3NvdXJjZV9wcm9jZXNzX3NyICAgICAgICAgIChSVFBTb3VyY2UgKnNyYywgR3N0Q2xvY2tUaW1lIHRpbWUsIGd1aW50NjQgbnRwdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgcnRwdGltZSwgZ3VpbnQzMiBwYWNrZXRfY291bnQsIGd1aW50MzIgb2N0ZXRfY291bnQpOwordm9pZCAgICAgICAgICAgIHJ0cF9zb3VyY2VfcHJvY2Vzc19yYiAgICAgICAgICAoUlRQU291cmNlICpzcmMsIGd1aW50NjQgbnRwbnN0aW1lLCBndWludDggZnJhY3Rpb25sb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyIHBhY2tldHNsb3N0LCBndWludDMyIGV4dGhpZ2hlc3RzZXEsIGd1aW50MzIgaml0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsc3IsIGd1aW50MzIgZGxzcik7CisKK2dib29sZWFuICAgICAgICBydHBfc291cmNlX2dldF9uZXdfc3IgICAgICAgICAgKFJUUFNvdXJjZSAqc3JjLCBndWludDY0IG50cG5zdGltZSwgR3N0Q2xvY2tUaW1lIHJ1bm5pbmdfdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50NjQgKm50cHRpbWUsIGd1aW50MzIgKnJ0cHRpbWUsIGd1aW50MzIgKnBhY2tldF9jb3VudCwKKwkJCQkJCWd1aW50MzIgKm9jdGV0X2NvdW50KTsKK2dib29sZWFuICAgICAgICBydHBfc291cmNlX2dldF9uZXdfcmIgICAgICAgICAgKFJUUFNvdXJjZSAqc3JjLCBHc3RDbG9ja1RpbWUgdGltZSwgZ3VpbnQ4ICpmcmFjdGlvbmxvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnBhY2tldHNsb3N0LCBndWludDMyICpleHRoaWdoZXN0c2VxLCBndWludDMyICpqaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpsc3IsIGd1aW50MzIgKmRsc3IpOworCitnYm9vbGVhbiAgICAgICAgcnRwX3NvdXJjZV9nZXRfbGFzdF9zciAgICAgICAgIChSVFBTb3VyY2UgKnNyYywgR3N0Q2xvY2tUaW1lICp0aW1lLCBndWludDY0ICpudHB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqcnRwdGltZSwgZ3VpbnQzMiAqcGFja2V0X2NvdW50LAorCQkJCQkJZ3VpbnQzMiAqb2N0ZXRfY291bnQpOworZ2Jvb2xlYW4gICAgICAgIHJ0cF9zb3VyY2VfZ2V0X2xhc3RfcmIgICAgICAgICAoUlRQU291cmNlICpzcmMsIGd1aW50OCAqZnJhY3Rpb25sb3N0LCBnaW50MzIgKnBhY2tldHNsb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqZXh0aGlnaGVzdHNlcSwgZ3VpbnQzMiAqaml0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqbHNyLCBndWludDMyICpkbHNyLCBndWludDMyICpyb3VuZF90cmlwKTsKKwordm9pZCAgICAgICAgICAgIHJ0cF9zb3VyY2VfcmVzZXQgICAgICAgICAgICAgICAoUlRQU291cmNlICogc3JjKTsKKworZ2Jvb2xlYW4gICAgICAgIHJ0cF9zb3VyY2VfZmluZF9jb25mbGljdGluZ19hZGRyZXNzIChSVFBTb3VyY2UgKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU29ja2V0QWRkcmVzcyAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENsb2NrVGltZSB0aW1lKTsKKwordm9pZCAgICAgICAgICAgIHJ0cF9zb3VyY2VfYWRkX2NvbmZsaWN0aW5nX2FkZHJlc3MgKFJUUFNvdXJjZSAqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdTb2NrZXRBZGRyZXNzICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0Q2xvY2tUaW1lIHRpbWUpOworCitnYm9vbGVhbiAgICAgICAgZmluZF9jb25mbGljdGluZ19hZGRyZXNzICAgICAgIChHTGlzdCAqIGNvbmZsaWN0aW5nX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU29ja2V0QWRkcmVzcyAqIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RDbG9ja1RpbWUgdGltZSk7CisKK0dMaXN0ICogICAgICAgICBhZGRfY29uZmxpY3RpbmdfYWRkcmVzcyAgICAgICAgKEdMaXN0ICogY29uZmxpY3RpbmdfYWRkcmVzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NvY2tldEFkZHJlc3MgKiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0Q2xvY2tUaW1lIHRpbWUpOworR0xpc3QgKiAgICAgICAgIHRpbWVvdXRfY29uZmxpY3RpbmdfYWRkcmVzc2VzICAoR0xpc3QgKiBjb25mbGljdGluZ19hZGRyZXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RDbG9ja1RpbWUgY3VycmVudF90aW1lKTsKKwordm9pZCAgICAgICAgICAgIHJ0cF9jb25mbGljdGluZ19hZGRyZXNzX2ZyZWUgICAoUlRQQ29uZmxpY3RpbmdBZGRyZXNzICogYWRkcik7CisKK3ZvaWQgICAgICAgICAgICBydHBfc291cmNlX3RpbWVvdXQgICAgICAgICAgICAgKFJUUFNvdXJjZSAqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENsb2NrVGltZSBjdXJyZW50X3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RDbG9ja1RpbWUgZmVlZGJhY2tfcmV0ZW50aW9uX3dpbmRvdyk7CisKK3ZvaWQgICAgICAgICAgICBydHBfc291cmNlX3JldGFpbl9ydGNwX3BhY2tldCAgKFJUUFNvdXJjZSAqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFJUQ1BQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENsb2NrVGltZSBydW5uaW5nX3RpbWUpOworZ2Jvb2xlYW4gICAgICAgIHJ0cF9zb3VyY2VfaGFzX3JldGFpbmVkICAgICAgICAoUlRQU291cmNlICogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NvbXBhcmVGdW5jIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY29uc3Rwb2ludGVyIGRhdGEpOworCit2b2lkICAgICAgICAgICAgcnRwX3NvdXJjZV9yZWdpc3Rlcl9uYWNrICAgICAgIChSVFBTb3VyY2UgKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDE2IHNlcW51bSk7CitndWludDMyICogICAgICAgcnRwX3NvdXJjZV9nZXRfbmFja3MgICAgICAgICAgIChSVFBTb3VyY2UgKiBzcmMsIGd1aW50ICpuX25hY2tzKTsKK3ZvaWQgICAgICAgICAgICBydHBfc291cmNlX2NsZWFyX25hY2tzICAgICAgICAgKFJUUFNvdXJjZSAqIHNyYyk7CisKKyNlbmRpZiAvKiBfX1JUUF9TT1VSQ0VfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5jIGIvZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2JkMTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuYwpAQCAtMCwwICsxLDQzMCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAgMjAxNSBLdXJlbnRvIChodHRwOi8va3VyZW50by5vcmcvKQorICogICBAYXV0aG9yOiBNaWd1ZWwgUGFyw61zIDxtcGFyaXNkaWF6QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAicnRwc3RhdHMuaCIKKwordm9pZAorZ3N0X3J0cF9wYWNrZXRfcmF0ZV9jdHhfcmVzZXQgKFJUUFBhY2tldFJhdGVDdHggKiBjdHgsIGdpbnQzMiBjbG9ja19yYXRlKQoreworICBjdHgtPmNsb2NrX3JhdGUgPSBjbG9ja19yYXRlOworICBjdHgtPnByb2JlZCA9IEZBTFNFOworICBjdHgtPmF2Z19wYWNrZXRfcmF0ZSA9IC0xOworICBjdHgtPmxhc3RfdHMgPSAtMTsKK30KKworZ3VpbnQzMgorZ3N0X3J0cF9wYWNrZXRfcmF0ZV9jdHhfdXBkYXRlIChSVFBQYWNrZXRSYXRlQ3R4ICogY3R4LCBndWludDE2IHNlcW51bSwKKyAgICBndWludDMyIHRzKQoreworICBndWludDY0IG5ld190cywgZGlmZl90czsKKyAgZ2ludCBkaWZmX3NlcW51bTsKKyAgZ2ludDMyIG5ld19wYWNrZXRfcmF0ZTsKKworICBpZiAoY3R4LT5jbG9ja19yYXRlIDw9IDApIHsKKyAgICByZXR1cm4gY3R4LT5hdmdfcGFja2V0X3JhdGU7CisgIH0KKworICBuZXdfdHMgPSBjdHgtPmxhc3RfdHM7CisgIGdzdF9ydHBfYnVmZmVyX2V4dF90aW1lc3RhbXAgKCZuZXdfdHMsIHRzKTsKKworICBpZiAoIWN0eC0+cHJvYmVkKSB7CisgICAgY3R4LT5sYXN0X3NlcW51bSA9IHNlcW51bTsKKyAgICBjdHgtPmxhc3RfdHMgPSBuZXdfdHM7CisgICAgY3R4LT5wcm9iZWQgPSBUUlVFOworICAgIHJldHVybiBjdHgtPmF2Z19wYWNrZXRfcmF0ZTsKKyAgfQorCisgIGRpZmZfc2VxbnVtID0gZ3N0X3J0cF9idWZmZXJfY29tcGFyZV9zZXFudW0gKGN0eC0+bGFzdF9zZXFudW0sIHNlcW51bSk7CisgIGlmIChkaWZmX3NlcW51bSA8PSAwIHx8IG5ld190cyA8PSBjdHgtPmxhc3RfdHMpIHsKKyAgICByZXR1cm4gY3R4LT5hdmdfcGFja2V0X3JhdGU7CisgIH0KKworICBkaWZmX3RzID0gbmV3X3RzIC0gY3R4LT5sYXN0X3RzOworICBkaWZmX3RzID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoZGlmZl90cywgR1NUX1NFQ09ORCwgY3R4LT5jbG9ja19yYXRlKTsKKyAgbmV3X3BhY2tldF9yYXRlID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChkaWZmX3NlcW51bSwgR1NUX1NFQ09ORCwgZGlmZl90cyk7CisKKyAgLyogVGhlIGdvYWwgaXMgdGhhdCBoaWdoZXIgcGFja2V0IHJhdGVzICJ3aW4iLgorICAgKiBJZiB0aGVyZSdzIGEgc3VkZGVuIGJ1cnN0LCB0aGUgYXZlcmFnZSB3aWxsIGdvIHVwIGZhc3QsCisgICAqIGJ1dCBpdCB3aWxsIGdvIGRvd24gYWdhaW4gc2xvd2x5LgorICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgYnVyc3R5IGNhc2VzLCB3aGVyZSBhIGxvdCBvZiBwYWNrZXRzIGFyZSBjbG9zZQorICAgKiB0byBlYWNoIG90aGVyIGFuZCBzaG91bGQgYWxsb3cgYSBoaWdoZXIgcmVvcmRlci9kcm9wb3V0IHRoZXJlLgorICAgKiBSb3VuZCB1cCB0aGUgbmV3IGF2ZXJhZ2UuCisgICAqLworICBpZiAoY3R4LT5hdmdfcGFja2V0X3JhdGUgPiBuZXdfcGFja2V0X3JhdGUpIHsKKyAgICBjdHgtPmF2Z19wYWNrZXRfcmF0ZSA9ICg3ICogY3R4LT5hdmdfcGFja2V0X3JhdGUgKyBuZXdfcGFja2V0X3JhdGUgKyA3KSAvIDg7CisgIH0gZWxzZSB7CisgICAgY3R4LT5hdmdfcGFja2V0X3JhdGUgPSAoY3R4LT5hdmdfcGFja2V0X3JhdGUgKyBuZXdfcGFja2V0X3JhdGUgKyAxKSAvIDI7CisgIH0KKworICBjdHgtPmxhc3Rfc2VxbnVtID0gc2VxbnVtOworICBjdHgtPmxhc3RfdHMgPSBuZXdfdHM7CisKKyAgcmV0dXJuIGN0eC0+YXZnX3BhY2tldF9yYXRlOworfQorCitndWludDMyCitnc3RfcnRwX3BhY2tldF9yYXRlX2N0eF9nZXQgKFJUUFBhY2tldFJhdGVDdHggKiBjdHgpCit7CisgIHJldHVybiBjdHgtPmF2Z19wYWNrZXRfcmF0ZTsKK30KKworZ3VpbnQzMgorZ3N0X3J0cF9wYWNrZXRfcmF0ZV9jdHhfZ2V0X21heF9kcm9wb3V0IChSVFBQYWNrZXRSYXRlQ3R4ICogY3R4LCBnaW50MzIgdGltZV9tcykKK3sKKyAgaWYgKHRpbWVfbXMgPD0gMCB8fCAhY3R4LT5wcm9iZWQpIHsKKyAgICByZXR1cm4gUlRQX0RFRl9EUk9QT1VUOworICB9CisKKyAgcmV0dXJuIE1BWCAoUlRQX01JTl9EUk9QT1VULCBjdHgtPmF2Z19wYWNrZXRfcmF0ZSAqIHRpbWVfbXMgLyAxMDAwKTsKK30KKworZ3VpbnQzMgorZ3N0X3J0cF9wYWNrZXRfcmF0ZV9jdHhfZ2V0X21heF9taXNvcmRlciAoUlRQUGFja2V0UmF0ZUN0eCAqIGN0eCwKKyAgICBnaW50MzIgdGltZV9tcykKK3sKKyAgaWYgKHRpbWVfbXMgPD0gMCB8fCAhY3R4LT5wcm9iZWQpIHsKKyAgICByZXR1cm4gUlRQX0RFRl9NSVNPUkRFUjsKKyAgfQorCisgIHJldHVybiBNQVggKFJUUF9NSU5fTUlTT1JERVIsIGN0eC0+YXZnX3BhY2tldF9yYXRlICogdGltZV9tcyAvIDEwMDApOworfQorCisvKioKKyAqIHJ0cF9zdGF0c19pbml0X2RlZmF1bHRzOgorICogQHN0YXRzOiBhbiAjUlRQU2Vzc2lvblN0YXRzIHN0cnVjdAorICoKKyAqIEluaXRpYWxpemUgQHN0YXRzIHdpdGggaXRzIGRlZmF1bHQgdmFsdWVzLgorICovCit2b2lkCitydHBfc3RhdHNfaW5pdF9kZWZhdWx0cyAoUlRQU2Vzc2lvblN0YXRzICogc3RhdHMpCit7CisgIHJ0cF9zdGF0c19zZXRfYmFuZHdpZHRocyAoc3RhdHMsIC0xLCAtMSwgLTEsIC0xKTsKKyAgc3RhdHMtPm1pbl9pbnRlcnZhbCA9IFJUUF9TVEFUU19NSU5fSU5URVJWQUw7CisgIHN0YXRzLT5ieWVfdGltZW91dCA9IFJUUF9TVEFUU19CWUVfVElNRU9VVDsKKyAgc3RhdHMtPm5hY2tzX2Ryb3BwZWQgPSAwOworICBzdGF0cy0+bmFja3Nfc2VudCA9IDA7CisgIHN0YXRzLT5uYWNrc19yZWNlaXZlZCA9IDA7Cit9CisKKy8qKgorICogcnRwX3N0YXRzX3NldF9iYW5kd2lkdGhzOgorICogQHN0YXRzOiBhbiAjUlRQU2Vzc2lvblN0YXRzIHN0cnVjdAorICogQHJ0cF9idzogUlRQIGJhbmR3aWR0aAorICogQHJ0Y3BfYnc6IFJUQ1AgYmFuZHdpZHRoCisgKiBAcnM6IHNlbmRlciBSVENQIGJhbmR3aWR0aAorICogQHJyOiByZWNlaXZlciBSVENQIGJhbmR3aWR0aAorICoKKyAqIENvbmZpZ3VyZSB0aGUgYmFuZHdpZHRoIHBhcmFtZXRlcnMgaW4gdGhlIHN0YXRzLiBXaGVuIGFuIGlucHV0IHZhcmlhYmxlIGlzCisgKiBzZXQgdG8gLTEsIGl0IHdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBvdGhlciBpbnB1dCB2YXJpYWJsZXMgYW5kIGZyb20gdGhlCisgKiBkZWZhdWx0cy4KKyAqLwordm9pZAorcnRwX3N0YXRzX3NldF9iYW5kd2lkdGhzIChSVFBTZXNzaW9uU3RhdHMgKiBzdGF0cywgZ3VpbnQgcnRwX2J3LAorICAgIGdkb3VibGUgcnRjcF9idywgZ3VpbnQgcnMsIGd1aW50IHJyKQoreworICBHU1RfREVCVUcgKCJyZWNhbGMgYmFuZHdpZHRoczogUlRQICV1LCBSVENQICVmLCBSUyAldSwgUlIgJXUiLCBydHBfYncsCisgICAgICBydGNwX2J3LCBycywgcnIpOworCisgIC8qIHdoZW4gZ2l2ZW4sIHNlbmRlciBhbmQgcmVjZWl2ZSBiYW5kd2lkdGggYWRkIHVwIHRvIHRoZSB0b3RhbAorICAgKiBydGNwIGJhbmR3aWR0aCAqLworICBpZiAocnMgIT0gLTEgJiYgcnIgIT0gLTEpCisgICAgcnRjcF9idyA9IHJzICsgcnI7CisKKyAgLyogSWYgcnRjcF9idyBpcyBiZXR3ZWVuIDAgYW5kIDEsIGl0IGlzIGEgZnJhY3Rpb24gb2YgcnRwX2J3ICovCisgIGlmIChydGNwX2J3ID4gMC4wICYmIHJ0Y3BfYncgPCAxLjApIHsKKyAgICBpZiAocnRwX2J3ID4gMC4wKQorICAgICAgcnRjcF9idyA9IHJ0cF9idyAqIHJ0Y3BfYnc7CisgICAgZWxzZQorICAgICAgcnRjcF9idyA9IC0xLjA7CisgIH0KKworICAvKiBSVENQIGlzIDUlIG9mIHRoZSBSVFAgYmFuZHdpZHRoICovCisgIGlmIChydHBfYncgPT0gLTEgJiYgcnRjcF9idyA+IDEuMCkKKyAgICBydHBfYncgPSBydGNwX2J3ICogMjA7CisgIGVsc2UgaWYgKHJ0cF9idyAhPSAtMSAmJiBydGNwX2J3IDwgMC4wKQorICAgIHJ0Y3BfYncgPSBydHBfYncgLyAyMDsKKyAgZWxzZSBpZiAocnRwX2J3ID09IC0xICYmIHJ0Y3BfYncgPCAwLjApIHsKKyAgICAvKiBub3RoaW5nIGdpdmVuLCB0YWtlIGRlZmF1bHRzICovCisgICAgcnRwX2J3ID0gUlRQX1NUQVRTX0JBTkRXSURUSDsKKyAgICBydGNwX2J3ID0gcnRwX2J3ICogUlRQX1NUQVRTX1JUQ1BfRlJBQ1RJT047CisgIH0KKworICBzdGF0cy0+YmFuZHdpZHRoID0gcnRwX2J3OworICBzdGF0cy0+cnRjcF9iYW5kd2lkdGggPSBydGNwX2J3OworCisgIC8qIG5vdyBmaWd1cmUgb3V0IHRoZSBmcmFjdGlvbnMgKi8KKyAgaWYgKHJzID09IC0xKSB7CisgICAgLyogcnMgdW5rbm93biAqLworICAgIGlmIChyciA9PSAtMSkgeworICAgICAgLyogYm90aCBub3QgZ2l2ZW4sIHVzZSBkZWZhdWx0cyAqLworICAgICAgcnMgPSBzdGF0cy0+cnRjcF9iYW5kd2lkdGggKiBSVFBfU1RBVFNfU0VOREVSX0ZSQUNUSU9OOworICAgICAgcnIgPSBzdGF0cy0+cnRjcF9iYW5kd2lkdGggKiBSVFBfU1RBVFNfUkVDRUlWRVJfRlJBQ1RJT047CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHJyIGtub3duLCBjYWxjdWxhdGUgcnMgKi8KKyAgICAgIGlmIChzdGF0cy0+cnRjcF9iYW5kd2lkdGggPiBycikKKyAgICAgICAgcnMgPSBzdGF0cy0+cnRjcF9iYW5kd2lkdGggLSBycjsKKyAgICAgIGVsc2UKKyAgICAgICAgcnMgPSAwOworICAgIH0KKyAgfSBlbHNlIGlmIChyciA9PSAtMSkgeworICAgIC8qIHJzIGtub3duLCBjYWxjdWxhdGUgcnIgKi8KKyAgICBpZiAoc3RhdHMtPnJ0Y3BfYmFuZHdpZHRoID4gcnMpCisgICAgICByciA9IHN0YXRzLT5ydGNwX2JhbmR3aWR0aCAtIHJzOworICAgIGVsc2UKKyAgICAgIHJyID0gMDsKKyAgfQorCisgIGlmIChzdGF0cy0+cnRjcF9iYW5kd2lkdGggPiAwKSB7CisgICAgc3RhdHMtPnNlbmRlcl9mcmFjdGlvbiA9ICgoZ2RvdWJsZSkgcnMpIC8gKChnZG91YmxlKSBzdGF0cy0+cnRjcF9iYW5kd2lkdGgpOworICAgIHN0YXRzLT5yZWNlaXZlcl9mcmFjdGlvbiA9IDEuMCAtIHN0YXRzLT5zZW5kZXJfZnJhY3Rpb247CisgIH0gZWxzZSB7CisgICAgLyogbm8gUlRDUCBiYW5kd2lkdGgsIHNldCBkdW1teSB2YWx1ZXMgKi8KKyAgICBzdGF0cy0+c2VuZGVyX2ZyYWN0aW9uID0gMC4wOworICAgIHN0YXRzLT5yZWNlaXZlcl9mcmFjdGlvbiA9IDAuMDsKKyAgfQorICBHU1RfREVCVUcgKCJiYW5kd2lkdGhzOiBSVFAgJXUsIFJUQ1AgJXUsIFJTICVmLCBSUiAlZiIsIHN0YXRzLT5iYW5kd2lkdGgsCisgICAgICBzdGF0cy0+cnRjcF9iYW5kd2lkdGgsIHN0YXRzLT5zZW5kZXJfZnJhY3Rpb24sIHN0YXRzLT5yZWNlaXZlcl9mcmFjdGlvbik7Cit9CisKKy8qKgorICogcnRwX3N0YXRzX2NhbGN1bGF0ZV9ydGNwX2ludGVydmFsOgorICogQHN0YXRzOiBhbiAjUlRQU2Vzc2lvblN0YXRzIHN0cnVjdAorICogQHNlbmRlcjogaWYgd2UgYXJlIGEgc2VuZGVyCisgKiBAcHJvZmlsZTogUlRQIHByb2ZpbGUgb2YgdGhpcyBzZXNzaW9uCisgKiBAcHRwOiBpZiB0aGlzIHNlc3Npb24gaXMgYSBwb2ludC10by1wb2ludCBzZXNzaW9uCisgKiBAZmlyc3Q6IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUKKyAqCisgKiBDYWxjdWxhdGUgdGhlIFJUQ1AgaW50ZXJ2YWwuIFRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiBpcyB0aGUgYW1vdW50IG9mCisgKiB0aW1lIHRvIHdhaXQgKGluIG5hbm9zZWNvbmRzKSBiZWZvcmUgc2VuZGluZyBhIG5ldyBSVENQIG1lc3NhZ2UuCisgKgorICogUmV0dXJuczogdGhlIFJUQ1AgaW50ZXJ2YWwuCisgKi8KK0dzdENsb2NrVGltZQorcnRwX3N0YXRzX2NhbGN1bGF0ZV9ydGNwX2ludGVydmFsIChSVFBTZXNzaW9uU3RhdHMgKiBzdGF0cywgZ2Jvb2xlYW4gd2Vfc2VuZCwKKyAgICBHc3RSVFBQcm9maWxlIHByb2ZpbGUsIGdib29sZWFuIHB0cCwgZ2Jvb2xlYW4gZmlyc3QpCit7CisgIGdkb3VibGUgbWVtYmVycywgc2VuZGVycywgbjsKKyAgZ2RvdWJsZSBhdmdfcnRjcF9zaXplLCBydGNwX2J3OworICBnZG91YmxlIGludGVydmFsOworICBnZG91YmxlIHJ0Y3BfbWluX3RpbWU7CisKKyAgaWYgKHByb2ZpbGUgPT0gR1NUX1JUUF9QUk9GSUxFX0FWUEYgfHwgcHJvZmlsZSA9PSBHU1RfUlRQX1BST0ZJTEVfU0FWUEYpIHsKKyAgICAvKiBSRkMgNDU4NSAzLjRkKSwgMy41LjEgKi8KKworICAgIGlmIChmaXJzdCAmJiAhcHRwKQorICAgICAgcnRjcF9taW5fdGltZSA9IDEuMDsKKyAgICBlbHNlCisgICAgICBydGNwX21pbl90aW1lID0gMC4wOworICB9IGVsc2UgeworICAgIC8qIFZlcnkgZmlyc3QgY2FsbCBhdCBhcHBsaWNhdGlvbiBzdGFydC11cCB1c2VzIGhhbGYgdGhlIG1pbgorICAgICAqIGRlbGF5IGZvciBxdWlja2VyIG5vdGlmaWNhdGlvbiB3aGlsZSBzdGlsbCBhbGxvd2luZyBzb21lIHRpbWUKKyAgICAgKiBiZWZvcmUgcmVwb3J0aW5nIGZvciByYW5kb21pemF0aW9uIGFuZCB0byBsZWFybiBhYm91dCBvdGhlcgorICAgICAqIHNvdXJjZXMgc28gdGhlIHJlcG9ydCBpbnRlcnZhbCB3aWxsIGNvbnZlcmdlIHRvIHRoZSBjb3JyZWN0CisgICAgICogaW50ZXJ2YWwgbW9yZSBxdWlja2x5LgorICAgICAqLworICAgIHJ0Y3BfbWluX3RpbWUgPSBzdGF0cy0+bWluX2ludGVydmFsOworICAgIGlmIChmaXJzdCkKKyAgICAgIHJ0Y3BfbWluX3RpbWUgLz0gMi4wOworICB9CisKKyAgLyogRGVkaWNhdGUgYSBmcmFjdGlvbiBvZiB0aGUgUlRDUCBiYW5kd2lkdGggdG8gc2VuZGVycyB1bmxlc3MKKyAgICogdGhlIG51bWJlciBvZiBzZW5kZXJzIGlzIGxhcmdlIGVub3VnaCB0aGF0IHRoZWlyIHNoYXJlIGlzCisgICAqIG1vcmUgdGhhbiB0aGF0IGZyYWN0aW9uLgorICAgKi8KKyAgbiA9IG1lbWJlcnMgPSBzdGF0cy0+YWN0aXZlX3NvdXJjZXM7CisgIHNlbmRlcnMgPSAoZ2RvdWJsZSkgc3RhdHMtPnNlbmRlcl9zb3VyY2VzOworICBydGNwX2J3ID0gc3RhdHMtPnJ0Y3BfYmFuZHdpZHRoOworCisgIGlmIChzZW5kZXJzIDw9IG1lbWJlcnMgKiBzdGF0cy0+c2VuZGVyX2ZyYWN0aW9uKSB7CisgICAgaWYgKHdlX3NlbmQpIHsKKyAgICAgIHJ0Y3BfYncgKj0gc3RhdHMtPnNlbmRlcl9mcmFjdGlvbjsKKyAgICAgIG4gPSBzZW5kZXJzOworICAgIH0gZWxzZSB7CisgICAgICBydGNwX2J3ICo9IHN0YXRzLT5yZWNlaXZlcl9mcmFjdGlvbjsKKyAgICAgIG4gLT0gc2VuZGVyczsKKyAgICB9CisgIH0KKworICAvKiBubyBiYW5kd2lkdGggZm9yIFJUQ1AsIHJldHVybiBOT05FIHRvIHNpZ25hbCB0aGF0IHdlIGRvbid0IHdhbnQgdG8gc2VuZAorICAgKiBSVENQIHBhY2tldHMgKi8KKyAgaWYgKHJ0Y3BfYncgPD0gMC4wMDAxKQorICAgIHJldHVybiBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgIGF2Z19ydGNwX3NpemUgPSA4LjAgKiBzdGF0cy0+YXZnX3J0Y3BfcGFja2V0X3NpemU7CisgIC8qCisgICAqIFRoZSBlZmZlY3RpdmUgbnVtYmVyIG9mIHNpdGVzIHRpbWVzIHRoZSBhdmVyYWdlIHBhY2tldCBzaXplIGlzCisgICAqIHRoZSB0b3RhbCBudW1iZXIgb2Ygb2N0ZXRzIHNlbnQgd2hlbiBlYWNoIHNpdGUgc2VuZHMgYSByZXBvcnQuCisgICAqIERpdmlkaW5nIHRoaXMgYnkgdGhlIGVmZmVjdGl2ZSBiYW5kd2lkdGggZ2l2ZXMgdGhlIHRpbWUKKyAgICogaW50ZXJ2YWwgb3ZlciB3aGljaCB0aG9zZSBwYWNrZXRzIG11c3QgYmUgc2VudCBpbiBvcmRlciB0bworICAgKiBtZWV0IHRoZSBiYW5kd2lkdGggdGFyZ2V0LCB3aXRoIGEgbWluaW11bSBlbmZvcmNlZC4gIEluIHRoYXQKKyAgICogdGltZSBpbnRlcnZhbCB3ZSBzZW5kIG9uZSByZXBvcnQgc28gdGhpcyB0aW1lIGlzIGFsc28gb3VyCisgICAqIGF2ZXJhZ2UgdGltZSBiZXR3ZWVuIHJlcG9ydHMuCisgICAqLworICBHU1RfREVCVUcgKCJhdmcgc2l6ZSAlZiwgbiAlZiwgcnRjcF9idyAlZiIsIGF2Z19ydGNwX3NpemUsIG4sIHJ0Y3BfYncpOworICBpbnRlcnZhbCA9IGF2Z19ydGNwX3NpemUgKiBuIC8gcnRjcF9idzsKKyAgaWYgKGludGVydmFsIDwgcnRjcF9taW5fdGltZSkKKyAgICBpbnRlcnZhbCA9IHJ0Y3BfbWluX3RpbWU7CisKKyAgcmV0dXJuIGludGVydmFsICogR1NUX1NFQ09ORDsKK30KKworLyoqCisgKiBydHBfc3RhdHNfYWRkX3J0Y3Bfaml0dGVyOgorICogQHN0YXRzOiBhbiAjUlRQU2Vzc2lvblN0YXRzIHN0cnVjdAorICogQGludGVydmFsOiBhbiBSVENQIGludGVydmFsCisgKgorICogQXBwbHkgYSByYW5kb20gaml0dGVyIHRvIHRoZSBAaW50ZXJ2YWwuIEBpbnRlcnZhbCBpcyB0eXBpY2FsbHkgb2J0YWluZWQgd2l0aAorICogcnRwX3N0YXRzX2NhbGN1bGF0ZV9ydGNwX2ludGVydmFsKCkuCisgKgorICogUmV0dXJuczogdGhlIG5ldyBSVENQIGludGVydmFsLgorICovCitHc3RDbG9ja1RpbWUKK3J0cF9zdGF0c19hZGRfcnRjcF9qaXR0ZXIgKFJUUFNlc3Npb25TdGF0cyAqIHN0YXRzLCBHc3RDbG9ja1RpbWUgaW50ZXJ2YWwpCit7CisgIGdkb3VibGUgdGVtcDsKKworICAvKiBzZWUgUkZDIDM1NTAgcCAzMAorICAgKiBUbyBjb21wZW5zYXRlIGZvciAidW5jb25kaXRpb25hbCByZWNvbnNpZGVyYXRpb24iIGNvbnZlcmdpbmcgdG8gYQorICAgKiB2YWx1ZSBiZWxvdyB0aGUgaW50ZW5kZWQgYXZlcmFnZS4KKyAgICovCisjZGVmaW5lIENPTVBFTlNBVElPTiAgKDIuNzE4MjggLSAxLjUpOworCisgIHRlbXAgPSAoaW50ZXJ2YWwgKiBnX3JhbmRvbV9kb3VibGVfcmFuZ2UgKDAuNSwgMS41KSkgLyBDT01QRU5TQVRJT047CisKKyAgcmV0dXJuIChHc3RDbG9ja1RpbWUpIHRlbXA7Cit9CisKKworLyoqCisgKiBydHBfc3RhdHNfY2FsY3VsYXRlX2J5ZV9pbnRlcnZhbDoKKyAqIEBzdGF0czogYW4gI1JUUFNlc3Npb25TdGF0cyBzdHJ1Y3QKKyAqCisgKiBDYWxjdWxhdGUgdGhlIEJZRSBpbnRlcnZhbC4gVGhlIHJlc3VsdCBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRoZSBhbW91bnQgb2YKKyAqIHRpbWUgdG8gd2FpdCAoaW4gbmFub3NlY29uZHMpIGJlZm9yZSBzZW5kaW5nIGEgQllFIG1lc3NhZ2UuCisgKgorICogUmV0dXJuczogdGhlIEJZRSBpbnRlcnZhbC4KKyAqLworR3N0Q2xvY2tUaW1lCitydHBfc3RhdHNfY2FsY3VsYXRlX2J5ZV9pbnRlcnZhbCAoUlRQU2Vzc2lvblN0YXRzICogc3RhdHMpCit7CisgIGdkb3VibGUgbWVtYmVyczsKKyAgZ2RvdWJsZSBhdmdfcnRjcF9zaXplLCBydGNwX2J3OworICBnZG91YmxlIGludGVydmFsOworICBnZG91YmxlIHJ0Y3BfbWluX3RpbWU7CisKKyAgLyogbm8gaW50ZXJ2YWwgd2hlbiB3ZSBoYXZlIGxlc3MgdGhhbiA1MCBtZW1iZXJzICovCisgIGlmIChzdGF0cy0+YWN0aXZlX3NvdXJjZXMgPCA1MCkKKyAgICByZXR1cm4gMDsKKworICBydGNwX21pbl90aW1lID0gKHN0YXRzLT5taW5faW50ZXJ2YWwpIC8gMi4wOworCisgIC8qIERlZGljYXRlIGEgZnJhY3Rpb24gb2YgdGhlIFJUQ1AgYmFuZHdpZHRoIHRvIHNlbmRlcnMgdW5sZXNzCisgICAqIHRoZSBudW1iZXIgb2Ygc2VuZGVycyBpcyBsYXJnZSBlbm91Z2ggdGhhdCB0aGVpciBzaGFyZSBpcworICAgKiBtb3JlIHRoYW4gdGhhdCBmcmFjdGlvbi4KKyAgICovCisgIG1lbWJlcnMgPSBzdGF0cy0+YnllX21lbWJlcnM7CisgIHJ0Y3BfYncgPSBzdGF0cy0+cnRjcF9iYW5kd2lkdGggKiBzdGF0cy0+cmVjZWl2ZXJfZnJhY3Rpb247CisKKyAgLyogbm8gYmFuZHdpZHRoIGZvciBSVENQLCByZXR1cm4gTk9ORSB0byBzaWduYWwgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHNlbmQKKyAgICogUlRDUCBwYWNrZXRzICovCisgIGlmIChydGNwX2J3IDw9IDAuMDAwMSkKKyAgICByZXR1cm4gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKworICBhdmdfcnRjcF9zaXplID0gOC4wICogc3RhdHMtPmF2Z19ydGNwX3BhY2tldF9zaXplOworICAvKgorICAgKiBUaGUgZWZmZWN0aXZlIG51bWJlciBvZiBzaXRlcyB0aW1lcyB0aGUgYXZlcmFnZSBwYWNrZXQgc2l6ZSBpcworICAgKiB0aGUgdG90YWwgbnVtYmVyIG9mIG9jdGV0cyBzZW50IHdoZW4gZWFjaCBzaXRlIHNlbmRzIGEgcmVwb3J0LgorICAgKiBEaXZpZGluZyB0aGlzIGJ5IHRoZSBlZmZlY3RpdmUgYmFuZHdpZHRoIGdpdmVzIHRoZSB0aW1lCisgICAqIGludGVydmFsIG92ZXIgd2hpY2ggdGhvc2UgcGFja2V0cyBtdXN0IGJlIHNlbnQgaW4gb3JkZXIgdG8KKyAgICogbWVldCB0aGUgYmFuZHdpZHRoIHRhcmdldCwgd2l0aCBhIG1pbmltdW0gZW5mb3JjZWQuICBJbiB0aGF0CisgICAqIHRpbWUgaW50ZXJ2YWwgd2Ugc2VuZCBvbmUgcmVwb3J0IHNvIHRoaXMgdGltZSBpcyBhbHNvIG91cgorICAgKiBhdmVyYWdlIHRpbWUgYmV0d2VlbiByZXBvcnRzLgorICAgKi8KKyAgaW50ZXJ2YWwgPSBhdmdfcnRjcF9zaXplICogbWVtYmVycyAvIHJ0Y3BfYnc7CisgIGlmIChpbnRlcnZhbCA8IHJ0Y3BfbWluX3RpbWUpCisgICAgaW50ZXJ2YWwgPSBydGNwX21pbl90aW1lOworCisgIHJldHVybiBpbnRlcnZhbCAqIEdTVF9TRUNPTkQ7Cit9CisKKy8qKgorICogcnRwX3N0YXRzX2dldF9wYWNrZXRzX2xvc3Q6CisgKiBAc3RhdHM6IGFuICNSVFBTb3VyY2VTdGF0cyBzdHJ1Y3QKKyAqCisgKiBDYWxjdWxhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBSVFAgcGFja2V0cyBsb3N0IHNpbmNlIGJlZ2lubmluZyBvZgorICogcmVjZXB0aW9uLiBQYWNrZXRzIHRoYXQgYXJyaXZlIGxhdGUgYXJlIG5vdCBjb25zaWRlcmVkIGxvc3QsIGFuZAorICogZHVwbGljYXRlcyBhcmUgbm90IHRha2VuIGludG8gYWNjb3VudC4gSGVuY2UsIHRoZSBsb3NzIG1heSBiZSBuZWdhdGl2ZQorICogaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZXMuCisgKgorICogUmV0dXJuczogdG90YWwgUlRQIHBhY2tldHMgbG9zdC4KKyAqLworZ2ludDY0CitydHBfc3RhdHNfZ2V0X3BhY2tldHNfbG9zdCAoY29uc3QgUlRQU291cmNlU3RhdHMgKiBzdGF0cykKK3sKKyAgZ2ludDY0IGxvc3Q7CisgIGd1aW50NjQgZXh0ZW5kZWRfbWF4LCBleHBlY3RlZDsKKworICBleHRlbmRlZF9tYXggPSBzdGF0cy0+Y3ljbGVzICsgc3RhdHMtPm1heF9zZXE7CisgIGV4cGVjdGVkID0gZXh0ZW5kZWRfbWF4IC0gc3RhdHMtPmJhc2Vfc2VxICsgMTsKKyAgbG9zdCA9IGV4cGVjdGVkIC0gc3RhdHMtPnBhY2tldHNfcmVjZWl2ZWQ7CisKKyAgcmV0dXJuIGxvc3Q7Cit9CisKK3ZvaWQKK3J0cF9zdGF0c19zZXRfbWluX2ludGVydmFsIChSVFBTZXNzaW9uU3RhdHMgKiBzdGF0cywgZ2RvdWJsZSBtaW5faW50ZXJ2YWwpCit7CisgIHN0YXRzLT5taW5faW50ZXJ2YWwgPSBtaW5faW50ZXJ2YWw7Cit9CisKK2dib29sZWFuCitfX2dfc29ja2V0X2FkZHJlc3NfZXF1YWwgKEdTb2NrZXRBZGRyZXNzICogYSwgR1NvY2tldEFkZHJlc3MgKiBiKQoreworICBHSW5ldFNvY2tldEFkZHJlc3MgKmlhLCAqaWI7CisgIEdJbmV0QWRkcmVzcyAqaWFhLCAqaWFiOworCisgIGlhID0gR19JTkVUX1NPQ0tFVF9BRERSRVNTIChhKTsKKyAgaWIgPSBHX0lORVRfU09DS0VUX0FERFJFU1MgKGIpOworCisgIGlmIChnX2luZXRfc29ja2V0X2FkZHJlc3NfZ2V0X3BvcnQgKGlhKSAhPQorICAgICAgZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9wb3J0IChpYikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlhYSA9IGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcyAoaWEpOworICBpYWIgPSBnX2luZXRfc29ja2V0X2FkZHJlc3NfZ2V0X2FkZHJlc3MgKGliKTsKKworICByZXR1cm4gZ19pbmV0X2FkZHJlc3NfZXF1YWwgKGlhYSwgaWFiKTsKK30KKworZ2NoYXIgKgorX19nX3NvY2tldF9hZGRyZXNzX3RvX3N0cmluZyAoR1NvY2tldEFkZHJlc3MgKiBhZGRyKQoreworICBHSW5ldFNvY2tldEFkZHJlc3MgKmlhOworICBnY2hhciAqcmV0LCAqdG1wOworCisgIGlhID0gR19JTkVUX1NPQ0tFVF9BRERSRVNTIChhZGRyKTsKKworICB0bXAgPSBnX2luZXRfYWRkcmVzc190b19zdHJpbmcgKGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcyAoaWEpKTsKKyAgcmV0ID0gZ19zdHJkdXBfcHJpbnRmICgiJXM6JXUiLCB0bXAsIGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfcG9ydCAoaWEpKTsKKyAgZ19mcmVlICh0bXApOworCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRwbWFuYWdlci9ydHBzdGF0cy5oIGIvZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGZiZGRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0cG1hbmFnZXIvcnRwc3RhdHMuaApAQCAtMCwwICsxLDI2NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA3PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAgMjAxNSBLdXJlbnRvIChodHRwOi8va3VyZW50by5vcmcvKQorICogICBAYXV0aG9yOiBNaWd1ZWwgUGFyw61zIDxtcGFyaXNkaWF6QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fUlRQX1NUQVRTX0hfXworI2RlZmluZSBfX1JUUF9TVEFUU19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvbmV0L2dzdG5ldGFkZHJlc3NtZXRhLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9ydHAuaD4KKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisKKy8qKgorICogUlRQU2VuZGVyUmVwb3J0OgorICoKKyAqIEEgc2VuZGVyIHJlcG9ydCBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgZ2Jvb2xlYW4gaXNfdmFsaWQ7CisgIGd1aW50NjQgbnRwdGltZTsKKyAgZ3VpbnQzMiBydHB0aW1lOworICBndWludDMyIHBhY2tldF9jb3VudDsKKyAgZ3VpbnQzMiBvY3RldF9jb3VudDsKKyAgR3N0Q2xvY2tUaW1lIHRpbWU7Cit9IFJUUFNlbmRlclJlcG9ydDsKKworLyoqCisgKiBSVFBSZWNlaXZlclJlcG9ydDoKKyAqCisgKiBBIHJlY2VpdmVyIHJlcG9ydCBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgZ2Jvb2xlYW4gaXNfdmFsaWQ7CisgIGd1aW50MzIgc3NyYzsgLyogd2hvIHRoZSByZXBvcnQgaXMgZnJvbSAqLworICBndWludDggIGZyYWN0aW9ubG9zdDsKKyAgZ3VpbnQzMiBwYWNrZXRzbG9zdDsKKyAgZ3VpbnQzMiBleHRoaWdoZXN0c2VxOworICBndWludDMyIGppdHRlcjsKKyAgZ3VpbnQzMiBsc3I7CisgIGd1aW50MzIgZGxzcjsKKyAgZ3VpbnQzMiByb3VuZF90cmlwOworfSBSVFBSZWNlaXZlclJlcG9ydDsKKworLyoqCisgKiBSVFBQYWNrZXRJbmZvOgorICogQHNlbmQ6IGlmIHRoaXMgaXMgYSBwYWNrZXQgZm9yIHNlbmRpbmcKKyAqIEBydHA6IGlmIHRoaXMgaW5mbyBpcyBhYm91dCBhbiBSVFAgcGFja2V0CisgKiBAaXNfbGlzdDogaWYgdGhpcyBpcyBhIGJ1ZmZlcmxpc3QKKyAqIEBkYXRhOiBhICNHc3RCdWZmZXIgb3IgI0dzdEJ1ZmZlckxpc3QKKyAqIEBhZGRyZXNzOiBhZGRyZXNzIG9mIHRoZSBzZW5kZXIgb2YgdGhlIHBhY2tldAorICogQGN1cnJlbnRfdGltZTogY3VycmVudCB0aW1lIGFjY29yZGluZyB0byB0aGUgc3lzdGVtIGNsb2NrCisgKiBAcnVubmluZ190aW1lOiB0aW1lIG9mIGEgcGFja2V0IGFzIGJ1ZmZlciBydW5uaW5nX3RpbWUKKyAqIEBudHBuc3RpbWU6IHRpbWUgb2YgYSBwYWNrZXQgTlRQIHRpbWUgaW4gbmFub3NlY29uZHMKKyAqIEBoZWFkZXJfbGVuOiBudW1iZXIgb2Ygb3ZlcmhlYWQgYnl0ZXMgcGVyIHBhY2tldAorICogQGJ5dGVzOiBieXRlcyBvZiB0aGUgcGFja2V0IGluY2x1ZGluZyBsb3dsZXZlbCBvdmVyaGVhZAorICogQHBheWxvYWRfbGVuOiBieXRlcyBvZiB0aGUgUlRQIHBheWxvYWQKKyAqIEBzZXFudW06IHRoZSBzZXFudW0gb2YgdGhlIHBhY2tldAorICogQHB0OiB0aGUgcGF5bG9hZCB0eXBlIG9mIHRoZSBwYWNrZXQKKyAqIEBydHB0aW1lOiB0aGUgUlRQIHRpbWUgb2YgdGhlIHBhY2tldAorICoKKyAqIFN0cnVjdHVyZSBob2xkaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYWNrZXQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgZ2Jvb2xlYW4gICAgICBzZW5kOworICBnYm9vbGVhbiAgICAgIHJ0cDsKKyAgZ2Jvb2xlYW4gICAgICBpc19saXN0OworICBncG9pbnRlciAgICAgIGRhdGE7CisgIEdTb2NrZXRBZGRyZXNzICphZGRyZXNzOworICBHc3RDbG9ja1RpbWUgIGN1cnJlbnRfdGltZTsKKyAgR3N0Q2xvY2tUaW1lICBydW5uaW5nX3RpbWU7CisgIGd1aW50NjQgICAgICAgbnRwbnN0aW1lOworICBndWludCAgICAgICAgIGhlYWRlcl9sZW47CisgIGd1aW50ICAgICAgICAgYnl0ZXM7CisgIGd1aW50ICAgICAgICAgcGFja2V0czsKKyAgZ3VpbnQgICAgICAgICBwYXlsb2FkX2xlbjsKKyAgZ3VpbnQzMiAgICAgICBzc3JjOworICBndWludDE2ICAgICAgIHNlcW51bTsKKyAgZ3VpbnQ4ICAgICAgICBwdDsKKyAgZ3VpbnQzMiAgICAgICBydHB0aW1lOworICBndWludDMyICAgICAgIGNzcmNfY291bnQ7CisgIGd1aW50MzIgICAgICAgY3NyY3NbMTZdOworfSBSVFBQYWNrZXRJbmZvOworCisvKioKKyAqIFJUUFNvdXJjZVN0YXRzOgorICogQHBhY2tldHNyZWNlaXZlZDogbnVtYmVyIG9mIHJlY2VpdmVkIHBhY2tldHMgaW4gdG90YWwKKyAqIEBwcmV2cGFja2V0c3JlY2VpdmVkOiBudW1iZXIgb2YgcGFja2V0cyByZWNlaXZlZCBpbiBwcmV2aW91cyByZXBvcnRpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbAorICogQG9jdGV0c3JlY2VpdmVkOiBudW1iZXIgb2YgcGF5bG9hZCBieXRlcyByZWNlaXZlZAorICogQGJ5dGVzcmVjZWl2ZWQ6IG51bWJlciBvZiB0b3RhbCBieXRlcyByZWNlaXZlZCBpbmNsdWRpbmcgaGVhZGVycyBhbmQgbG93ZXIKKyAqICAgICAgICAgICAgICAgICBwcm90b2NvbCBsZXZlbCBvdmVyaGVhZAorICogQG1heF9zZXFucjogaGlnaGVzdCBzZXF1ZW5jZSBudW1iZXIgcmVjZWl2ZWQKKyAqIEB0cmFuc2l0OiBwcmV2aW91cyB0cmFuc2l0IHRpbWUgdXNlZCBmb3IgY2FsY3VsYXRpbmcgQGppdHRlcgorICogQGppdHRlcjogY3VycmVudCBqaXR0ZXIgKGluIGNsb2NrIHJhdGUgdW5pdHMgc2NhbGVkIGJ5IDE2IGZvciBwcmVjaXNpb24pCisgKiBAcHJldl9ydHB0aW1lOiBwcmV2aW91cyB0aW1lIHdoZW4gYW4gUlRQIHBhY2tldCB3YXMgcmVjZWl2ZWQKKyAqIEBwcmV2X3J0Y3B0aW1lOiBwcmV2aW91cyB0aW1lIHdoZW4gYW4gUlRDUCBwYWNrZXQgd2FzIHJlY2VpdmVkCisgKiBAbGFzdF9ydHB0aW1lOiB0aW1lIHdoZW4gbGFzdCBSVFAgcGFja2V0IHJlY2VpdmVkCisgKiBAbGFzdF9ydGNwdGltZTogdGltZSB3aGVuIGxhc3QgUlRDUCBwYWNrZXQgcmVjZWl2ZWQKKyAqIEBjdXJyX3JyOiBpbmRleCBvZiBjdXJyZW50IEByciBibG9jaworICogQHJyOiBwcmV2aW91cyBhbmQgY3VycmVudCByZWNlaXZlciByZXBvcnQgYmxvY2sKKyAqIEBjdXJyX3NyOiBpbmRleCBvZiBjdXJyZW50IEBzciBibG9jaworICogQHNyOiBwcmV2aW91cyBhbmQgY3VycmVudCBzZW5kZXIgcmVwb3J0IGJsb2NrCisgKgorICogU3RhdHMgYWJvdXQgYSBzb3VyY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgZ3VpbnQ2NCAgICAgIHBhY2tldHNfcmVjZWl2ZWQ7CisgIGd1aW50NjQgICAgICBvY3RldHNfcmVjZWl2ZWQ7CisgIGd1aW50NjQgICAgICBieXRlc19yZWNlaXZlZDsKKworICBndWludDMyICAgICAgcHJldl9leHBlY3RlZDsKKyAgZ3VpbnQzMiAgICAgIHByZXZfcmVjZWl2ZWQ7CisKKyAgZ3VpbnQxNiAgICAgIG1heF9zZXE7CisgIGd1aW50NjQgICAgICBjeWNsZXM7CisgIGd1aW50MzIgICAgICBiYXNlX3NlcTsKKyAgZ3VpbnQzMiAgICAgIGJhZF9zZXE7CisgIGd1aW50MzIgICAgICB0cmFuc2l0OworICBndWludDMyICAgICAgaml0dGVyOworCisgIGd1aW50NjQgICAgICBwYWNrZXRzX3NlbnQ7CisgIGd1aW50NjQgICAgICBvY3RldHNfc2VudDsKKworICBndWludCAgICAgICAgc2VudF9wbGlfY291bnQ7CisgIGd1aW50ICAgICAgICByZWN2X3BsaV9jb3VudDsKKyAgZ3VpbnQgICAgICAgIHNlbnRfZmlyX2NvdW50OworICBndWludCAgICAgICAgcmVjdl9maXJfY291bnQ7CisgIGd1aW50ICAgICAgICBzZW50X25hY2tfY291bnQ7CisgIGd1aW50ICAgICAgICByZWN2X25hY2tfY291bnQ7CisKKyAgLyogd2hlbiB3ZSByZWNlaXZlZCBzdHVmZiAqLworICBHc3RDbG9ja1RpbWUgcHJldl9ydHB0aW1lOworICBHc3RDbG9ja1RpbWUgcHJldl9ydGNwdGltZTsKKyAgR3N0Q2xvY2tUaW1lIGxhc3RfcnRwdGltZTsKKyAgR3N0Q2xvY2tUaW1lIGxhc3RfcnRjcHRpbWU7CisKKyAgLyogc2VuZGVyIGFuZCByZWNlaXZlciByZXBvcnRzICovCisgIGdpbnQgICAgICAgICAgICAgIGN1cnJfcnI7CisgIFJUUFJlY2VpdmVyUmVwb3J0IHJyWzJdOworICBnaW50ICAgICAgICAgICAgICBjdXJyX3NyOworICBSVFBTZW5kZXJSZXBvcnQgICBzclsyXTsKK30gUlRQU291cmNlU3RhdHM7CisKKyNkZWZpbmUgUlRQX1NUQVRTX0JBTkRXSURUSCAgICAgICAgICAgNjQwMDAKKyNkZWZpbmUgUlRQX1NUQVRTX1JUQ1BfRlJBQ1RJT04gICAgICAgMC4wNQorLyoKKyAqIE1pbmltdW0gYXZlcmFnZSB0aW1lIGJldHdlZW4gUlRDUCBwYWNrZXRzIGZyb20gdGhpcyBzaXRlIChpbgorICogc2Vjb25kcykuICBUaGlzIHRpbWUgcHJldmVudHMgdGhlIHJlcG9ydHMgZnJvbSBgY2x1bXBpbmcnIHdoZW4KKyAqIHNlc3Npb25zIGFyZSBzbWFsbCBhbmQgdGhlIGxhdyBvZiBsYXJnZSBudW1iZXJzIGlzbid0IGhlbHBpbmcKKyAqIHRvIHNtb290aCBvdXQgdGhlIHRyYWZmaWMuICBJdCBhbHNvIGtlZXBzIHRoZSByZXBvcnQgaW50ZXJ2YWwKKyAqIGZyb20gYmVjb21pbmcgcmlkaWN1bG91c2x5IHNtYWxsIGR1cmluZyB0cmFuc2llbnQgb3V0YWdlcyBsaWtlCisgKiBhIG5ldHdvcmsgcGFydGl0aW9uLgorICovCisjZGVmaW5lIFJUUF9TVEFUU19NSU5fSU5URVJWQUwgICAgICA1LjAKKy8qCisgKiBGcmFjdGlvbiBvZiB0aGUgUlRDUCBiYW5kd2lkdGggdG8gYmUgc2hhcmVkIGFtb25nIGFjdGl2ZQorICogc2VuZGVycy4gIChUaGlzIGZyYWN0aW9uIHdhcyBjaG9zZW4gc28gdGhhdCBpbiBhIHR5cGljYWwKKyAqIHNlc3Npb24gd2l0aCBvbmUgb3IgdHdvIGFjdGl2ZSBzZW5kZXJzLCB0aGUgY29tcHV0ZWQgcmVwb3J0CisgKiB0aW1lIHdvdWxkIGJlIHJvdWdobHkgZXF1YWwgdG8gdGhlIG1pbmltdW0gcmVwb3J0IHRpbWUgc28gdGhhdAorICogd2UgZG9uJ3QgdW5uZWNlc3NhcmlseSBzbG93IGRvd24gcmVjZWl2ZXIgcmVwb3J0cy4pIFRoZQorICogcmVjZWl2ZXIgZnJhY3Rpb24gbXVzdCBiZSAxIC0gdGhlIHNlbmRlciBmcmFjdGlvbi4KKyAqLworI2RlZmluZSBSVFBfU1RBVFNfU0VOREVSX0ZSQUNUSU9OICAgICAgICgwLjI1KQorI2RlZmluZSBSVFBfU1RBVFNfUkVDRUlWRVJfRlJBQ1RJT04gICAgICgxLjAgLSBSVFBfU1RBVFNfU0VOREVSX0ZSQUNUSU9OKQorCisvKgorICogV2hlbiByZWNlaXZpbmcgYSBCWUUgZnJvbSBhIHNvdXJjZSwgcmVtb3ZlIHRoZSBzb3VyY2UgZnJvbSB0aGUgZGF0YWJhc2UKKyAqIGFmdGVyIHRoaXMgdGltZW91dC4KKyAqLworI2RlZmluZSBSVFBfU1RBVFNfQllFX1RJTUVPVVQgICAgICAgICAgICgyICogR1NUX1NFQ09ORCkKKworLyoKKyAqIFRoZSBkZWZhdWx0IGFuZCBtaW5pbXVtIHZhbHVlcyBvZiB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWlzc2luZyBwYWNrZXRzIHdlIHRvbGVyYXRlLgorICogVGhlc2UgYXJlIHBhY2tldHMgd2l0aCBhc2VxdWVuY2UgbnVtYmVyIGJpZ2dlciB0aGFuIHRoZSBsYXN0IHNlZW4gcGFja2V0LgorICovCisjZGVmaW5lIFJUUF9ERUZfRFJPUE9VVCAgICAgIDMwMDAKKyNkZWZpbmUgUlRQX01JTl9EUk9QT1VUICAgICAgMzAKKworLyoKKyAqIFRoZSBkZWZhdWx0IGFuZCBtaW5pbXVtIHZhbHVlcyBvZiB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWlzb3JkZXJlZCBwYWNrZXRzIHdlIHRvbGVyYXRlLgorICogVGhlc2UgYXJlIHBhY2tldHMgd2l0aCBhIHNlcXVlbmNlIG51bWJlciBzbWFsbGVyIHRoYW4gdGhlIGxhc3Qgc2VlbiBwYWNrZXQuCisgKi8KKyNkZWZpbmUgUlRQX0RFRl9NSVNPUkRFUiAgICAgMTAwCisjZGVmaW5lIFJUUF9NSU5fTUlTT1JERVIgICAgIDEwCisKKy8qKgorICogUlRQUGFja2V0UmF0ZUN0eDoKKyAqCisgKiBDb250ZXh0IHRvIGNhbGN1bGF0ZSB0aGUgcHNldWRvLWF2ZXJhZ2UgcGFja2V0IHJhdGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgZ2Jvb2xlYW4gcHJvYmVkOworICBnaW50MzIgY2xvY2tfcmF0ZTsKKyAgZ3VpbnQxNiBsYXN0X3NlcW51bTsKKyAgZ3VpbnQ2NCBsYXN0X3RzOworICBndWludDMyIGF2Z19wYWNrZXRfcmF0ZTsKK30gUlRQUGFja2V0UmF0ZUN0eDsKKwordm9pZCBnc3RfcnRwX3BhY2tldF9yYXRlX2N0eF9yZXNldCAoUlRQUGFja2V0UmF0ZUN0eCAqIGN0eCwgZ2ludDMyIGNsb2NrX3JhdGUpOworZ3VpbnQzMiBnc3RfcnRwX3BhY2tldF9yYXRlX2N0eF91cGRhdGUgKFJUUFBhY2tldFJhdGVDdHggKmN0eCwgZ3VpbnQxNiBzZXFudW0sIGd1aW50MzIgdHMpOworZ3VpbnQzMiBnc3RfcnRwX3BhY2tldF9yYXRlX2N0eF9nZXQgKFJUUFBhY2tldFJhdGVDdHggKmN0eCk7CitndWludDMyIGdzdF9ydHBfcGFja2V0X3JhdGVfY3R4X2dldF9tYXhfZHJvcG91dCAoUlRQUGFja2V0UmF0ZUN0eCAqY3R4LCBnaW50MzIgdGltZV9tcyk7CitndWludDMyIGdzdF9ydHBfcGFja2V0X3JhdGVfY3R4X2dldF9tYXhfbWlzb3JkZXIgKFJUUFBhY2tldFJhdGVDdHggKmN0eCwgZ2ludDMyIHRpbWVfbXMpOworCisvKioKKyAqIFJUUFNlc3Npb25TdGF0czoKKyAqCisgKiBTdGF0cyBrZXB0IGZvciBhIHNlc3Npb24gYW5kIHVzZWQgdG8gcHJvZHVjZSBSVENQIHBhY2tldCB0aW1lb3V0cy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBndWludCAgICAgICAgIGJhbmR3aWR0aDsKKyAgZ3VpbnQgICAgICAgICBydGNwX2JhbmR3aWR0aDsKKyAgZ2RvdWJsZSAgICAgICBzZW5kZXJfZnJhY3Rpb247CisgIGdkb3VibGUgICAgICAgcmVjZWl2ZXJfZnJhY3Rpb247CisgIGdkb3VibGUgICAgICAgbWluX2ludGVydmFsOworICBHc3RDbG9ja1RpbWUgIGJ5ZV90aW1lb3V0OworICBndWludCAgICAgICAgIGludGVybmFsX3NvdXJjZXM7CisgIGd1aW50ICAgICAgICAgc2VuZGVyX3NvdXJjZXM7CisgIGd1aW50ICAgICAgICAgaW50ZXJuYWxfc2VuZGVyX3NvdXJjZXM7CisgIGd1aW50ICAgICAgICAgYWN0aXZlX3NvdXJjZXM7CisgIGd1aW50ICAgICAgICAgYXZnX3J0Y3BfcGFja2V0X3NpemU7CisgIGd1aW50ICAgICAgICAgYnllX21lbWJlcnM7CisgIGd1aW50ICAgICAgICAgbmFja3NfZHJvcHBlZDsKKyAgZ3VpbnQgICAgICAgICBuYWNrc19zZW50OworICBndWludCAgICAgICAgIG5hY2tzX3JlY2VpdmVkOworfSBSVFBTZXNzaW9uU3RhdHM7CisKK3ZvaWQgICAgICAgICAgIHJ0cF9zdGF0c19pbml0X2RlZmF1bHRzICAgICAgICAgICAgICAoUlRQU2Vzc2lvblN0YXRzICpzdGF0cyk7CisKK3ZvaWQgICAgICAgICAgIHJ0cF9zdGF0c19zZXRfYmFuZHdpZHRocyAgICAgICAgICAgICAoUlRQU2Vzc2lvblN0YXRzICpzdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQgcnRwX2J3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlIHJ0Y3BfYncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50IHJzLCBndWludCBycik7CisKK0dzdENsb2NrVGltZSAgIHJ0cF9zdGF0c19jYWxjdWxhdGVfcnRjcF9pbnRlcnZhbCAgICAoUlRQU2Vzc2lvblN0YXRzICpzdGF0cywgZ2Jvb2xlYW4gc2VuZGVyLCBHc3RSVFBQcm9maWxlIHByb2ZpbGUsIGdib29sZWFuIHB0cCwgZ2Jvb2xlYW4gZmlyc3QpOworR3N0Q2xvY2tUaW1lICAgcnRwX3N0YXRzX2FkZF9ydGNwX2ppdHRlciAgICAgICAgICAgIChSVFBTZXNzaW9uU3RhdHMgKnN0YXRzLCBHc3RDbG9ja1RpbWUgaW50ZXJ2YWwpOworR3N0Q2xvY2tUaW1lICAgcnRwX3N0YXRzX2NhbGN1bGF0ZV9ieWVfaW50ZXJ2YWwgICAgIChSVFBTZXNzaW9uU3RhdHMgKnN0YXRzKTsKK2dpbnQ2NCAgICAgICAgIHJ0cF9zdGF0c19nZXRfcGFja2V0c19sb3N0ICAgICAgICAgICAoY29uc3QgUlRQU291cmNlU3RhdHMgKnN0YXRzKTsKKwordm9pZCAgICAgICAgICAgcnRwX3N0YXRzX3NldF9taW5faW50ZXJ2YWwgICAgICAgICAgIChSVFBTZXNzaW9uU3RhdHMgKnN0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlIG1pbl9pbnRlcnZhbCk7CisKKworZ2Jvb2xlYW4gX19nX3NvY2tldF9hZGRyZXNzX2VxdWFsIChHU29ja2V0QWRkcmVzcyAqYSwgR1NvY2tldEFkZHJlc3MgKmIpOworZ2NoYXIgKiBfX2dfc29ja2V0X2FkZHJlc3NfdG9fc3RyaW5nIChHU29ja2V0QWRkcmVzcyAqIGFkZHIpOworCisjZW5kaWYgLyogX19SVFBfU1RBVFNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRzcC8uZ2l0aWdub3JlIGIvZ3N0L3J0c3AvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDg0NmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0c3AvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDggQEAKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorKi5vCisqLmxvCisqLmxhCisuZGVwcworLmxpYnMKK3Rlc3QKZGlmZiAtLWdpdCBhL2dzdC9ydHNwL0NPUFlJTkcuTUlUIGIvZ3N0L3J0c3AvQ09QWUlORy5NSVQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2OWI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHNwL0NPUFlJTkcuTUlUCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgU291cmNlIENvZGUgaXMgbGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2UuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCmRpZmYgLS1naXQgYS9nc3QvcnRzcC9NYWtlZmlsZS5hbSBiL2dzdC9ydHNwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTc5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRzcC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE1IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RydHNwLmxhCisKK2xpYmdzdHJ0c3BfbGFfU09VUkNFUyA9IGdzdHJ0c3AuYyBnc3RydHNwc3JjLmMgXAorCQkJZ3N0cnRwZGVjLmMgZ3N0cnRzcGV4dC5jCisKK2xpYmdzdHJ0c3BfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKEdJT19DRkxBR1MpCitsaWJnc3RydHNwX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKEdTVF9CQVNFX0xJQlMpICQoR0lPX0xJQlMpIFwKKwkJICAgICAgIC1sZ3N0cnRwLUBHU1RfQVBJX1ZFUlNJT05AIC1sZ3N0cnRzcC1AR1NUX0FQSV9WRVJTSU9OQCBcCisJCSAgICAgICAtbGdzdHNkcC1AR1NUX0FQSV9WRVJTSU9OQCAkKEdTVF9ORVRfTElCUykgJChHU1RfTElCUykKK2xpYmdzdHJ0c3BfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdHJ0c3BzcmMuaCAgICAgXAorCQkgZ3N0cnRzcC5oICAgICAgICBcCisJCSBnc3RydHBkZWMuaCAgICAgIFwKKwkJIGdzdHJ0c3BleHQuaApkaWZmIC0tZ2l0IGEvZ3N0L3J0c3AvUkVBRE1FIGIvZ3N0L3J0c3AvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNmYzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRzcC9SRUFETUUKQEAgLTAsMCArMSwzNzcgQEAKK1JUU1Agc291cmNlIAorLS0tLS0tLS0tLS0KKworVGhlIFJUU1Agc291cmNlIGVzdGFibGlzaGVzIGEgY29ubmVjdGlvbiB0byBhbiBSVFNQIHNlcnZlciBhbmQgc2V0cyB1cAordGhlIFVEUCBzb3VyY2VzIGFuZCBSVFAgc2Vzc2lvbiBoYW5kbGVycy4KKworQW4gUlRTUCBzZXNzaW9uIGlzIGNyZWF0ZWQgYXMgZm9sbG93czoKKworLSBQYXJzZSBSVFNQIFVSTDoKKworICAgZXg6CisgICAgIHJ0c3A6Ly90aHJlYWQ6NTQ1NC9zb3V0aC1ydHNwLm1wMworCistIE9wZW4gYSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgdXJsLiBBbGwgZnVydGhlciBjb252ZXJzYXRpb24gd2l0aAorICB0aGUgc2VydmVyIHNob3VsZCBiZSBkb25lIHdpdGggdGhpcyBjb25uZWN0aW9uLiBFYWNoIHJlcXVlc3QvcmVwbHkgaGFzCisgIGEgQ1NlcSBudW1iZXIgYWRkZWQgdG8gdGhlIGhlYWRlci4KKworLSBTZW5kIGEgREVTQ1JJQkUgcmVxdWVzdCBmb3IgdGhlIHVybC4gV2UgY3VycmVudGx5IHN1cHBvcnQgYSByZXNwb25zZSBpbgorICBTRFAuCisKKyAgZXg6CisKKyAgICA+PiBERVNDUklCRSBydHNwOi8vdGhyZWFkOjU0NTQvc291dGgtcnRzcC5tcDMgUlRTUC8xLjAKKyAgICA+PiBBY2NlcHQ6IGFwcGxpY2F0aW9uL3NkcAorICAgID4+IENTZXE6IDAKKyAgICA+PgorICAgIDw8IFJUU1AvMS4wIDIwMCBPSworICAgIDw8IENvbnRlbnQtTGVuZ3RoOiA4NAorICAgIDw8IENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vc2RwCisgICAgPDwgQ1NlcTogMAorICAgIDw8IERhdGU6IFdlZCBNYXkgMTEgMTM6MDk6MzcgMjAwNSBHTVQKKyAgICA8PAorICAgIDw8IHY9MAorICAgIDw8IG89LSAwIDAgSU4gSVA0IDE5Mi4xNjguMS4xCisgICAgPDwgcz1ObyBUaXRsZQorICAgIDw8IG09YXVkaW8gMCBSVFAvQVZQIDE0CisgICAgPDwgYT1jb250cm9sOnN0cmVhbWlkPTAKKworLSBQYXJzZSB0aGUgU0RQIG1lc3NhZ2UsIGZvciBlYWNoIHN0cmVhbSAobT0pIHdlIGNyZWF0ZSBhbiBHc3RSVFBTdHJlYW0uIFdlIG5lZWQKKyAgdG8gYWxsb2NhdGUgdHdvIGxvY2FsIFVEUCBwb3J0cyBmb3IgcmVjZWl2aW5nIHRoZSBSVFAgYW5kIFJUQ1AgZGF0YSBiZWNhdXNlIHdlCisgIG5lZWQgdG8gc2VuZCB0aGUgcG9ydCBudW1iZXJzIHRvIHRoZSBzZXJ2ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC4KKworICBJbiBSVFNQU3JjIHdlIGZpcnN0IGNyZWF0ZSBhbiBlbGVtZW50IHRoYXQgY2FuIGhhbmRsZSB0aGUgdWRwOi8vMC4wLjAuMDowIHVyaS4gVGhpcworICB3aWxsIGNyZWF0ZSBhbiB1ZHAgc291cmNlIGVsZW1lbnQgd2l0aCBhIHJhbmRvbSBwb3J0IG51bWJlci4gV2UgZ2V0IHRoZSBwb3J0CisgIG51bWJlciBieSBnZXR0aW5nIHRoZSAicG9ydCIgcHJvcGVydHkgb2YgdGhlIGVsZW1lbnQgYWZ0ZXIgc2V0dGluZyB0aGUgZWxlbWVudCB0byAKKyAgUEFVU0VELiBUaGlzIGVsZW1lbnQgaXMgdXNlZCBmb3IgdGhlIFJUUCBwYWNrZXRzIGFuZCBoYXMgdG8gYmUgYW4gZXZlbiBudW1iZXIuIElmCisgIHRoZSByYW5kb20gcG9ydCBudW1iZXIgaXMgbm90IGFuIGV2ZW4gbnVtYmVyIHdlIHJldHJ5IHRvIGFsbG9jYXRlIGEgbmV3IHVkcCBzb3VyY2UuCisKKyAgV2UgdGhlbiBjcmVhdGUgYW5vdGhlciBVRFAgc291cmNlIGVsZW1lbnQgd2l0aCB0aGUgbmV4dCAodW5ldmVuKSBwb3J0IG51bWJlciB0byAKKyAgcmVjZWl2ZSB0aGUgUlRDUCBwYWNrZXQgb24uIEFmdGVyIHRoaXMgc3RlcCB3ZSBoYXZlIHR3byB1ZHAgcG9ydHMgd2UgY2FuIHVzZSB0bworICBhY2NlcHQgUlRQIHBhY2tldHMuCisKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCArLS0tLS0tLS0tLS0tKyAgfAorICAgIHwgfCB1ZHBzcmMwICAgIHwgIHwKKyAgICB8IHwgIHBvcnQ9NTAwMCB8ICB8CisgICAgfCArLS0tLS0tLS0tLS0tKyAgfAorICAgIHwgKy0tLS0tLS0tLS0tLSsgIHwKKyAgICB8IHwgdWRwc3JjMSAgICB8ICB8CisgICAgfCB8ICBwb3J0PTUwMDEgfCAgfAorICAgIHwgKy0tLS0tLS0tLS0tLSsgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0rCisKKy0gU2VuZCBhIFNFVFVQIG1lc3NhZ2UgdG8gdGhlIHNlcnZlciB3aXRoIHRoZSBSVFAgcG9ydHMuIFdlIGdldCB0aGUgc2V0dXAgVVJJIGZyb20KKyAgdGhlIGE9IGF0dHJpYnV0ZSBpbiB0aGUgU0RQIG1lc3NhZ2UuIFRoaXMgY2FuIGJlIGFuIGFic29sdXRlIFVSTCBvciBhIHJlbGF0aXZlCisgIHVybC4KKworICBleDoKKworICAgID4+IFNFVFVQIHJ0c3A6Ly90aHJlYWQ6NTQ1NC9zb3V0aC1ydHNwLm1wMy9zdHJlYW1pZD0wIFJUU1AvMS4wCisgICAgPj4gQ1NlcTogMQorICAgID4+IFRyYW5zcG9ydDogUlRQL0FWUC9VRFA7dW5pY2FzdDtjbGllbnRfcG9ydD01MDAwLTUwMDEsUlRQL0FWUC9VRFA7bXVsdGljYXN0LFJUUC9BVlAvVENQCisgICAgPj4KKyAgICA8PCBSVFNQLzEuMCAyMDAgT0sKKyAgICA8PCBUcmFuc3BvcnQ6IFJUUC9BVlAvVURQO3VuaWNhc3Q7Y2xpZW50X3BvcnQ9NTAwMC01MDAxO3NlcnZlcl9wb3J0PTYwMDAtNjAwMQorICAgIDw8IENTZXE6IDEKKyAgICA8PCBEYXRlOiBXZWQgTWF5IDExIDEzOjIxOjQzIDIwMDUgR01UCisgICAgPDwgU2Vzc2lvbjogNWQ1Y2I5NDQxMzI4OGNjZAorICAgIDw8CisKKyAgVGhlIGNsaWVudCBuZWVkcyB0byBzZW5kIHRoZSBsb2NhbCBwb3J0cyB0byB0aGUgc2VydmVyIGFsb25nIHdpdGggdGhlIHN1cHBvcnRlZCAKKyAgdHJhbnNwb3J0IHR5cGVzLiBUaGUgc2VydmVyIHNlbGVjdHMgdGhlIGZpbmFsIHRyYW5zcG9ydCB3aGljaCBpdCByZXR1cm5zIGluIHRoZQorICBUcmFuc3BvcnQgaGVhZGVyIGZpZWxkLiBUaGUgc2VydmVyIGFsc28gaW5jbHVkZXMgaXRzIHBvcnRzIHdoZXJlIFJUUCBhbmQgUlRDUAorICBtZXNzYWdlcyBjYW4gYmUgc2VudCB0by4KKworICBJbiB0aGUgYWJvdmUgZXhhbXBsZSBVRFAgd2FzIGNob29zZW4gYXMgYSB0cmFuc3BvcnQuIEF0IHRoaXMgcG9pbnQgdGhlIFJUU1BTcmMgZWxlbWVudAorICB3aWxsIGZ1cnRlciBjb25maWd1cmUgaXRzIGVsZW1lbnRzIHRvIHByb2Nlc3MgdGhpcyBzdHJlYW0uCisKKyAgVGhlIFJUU1BTcmMgd2lsbCBjcmVhdGUgYW5kIGNvbm5lY3QgYW4gUlRQIHNlc3Npb24gbWFuYWdlciBlbGVtZW50IGFuZCB3aWxsCisgIGNvbm5lY3QgaXQgdG8gdGhlIHNyYyBwYWRzIG9mIHRoZSB1ZHAgZWxlbWVudC4gVGhlIGRhdGEgcGFkIGZyb20gdGhlIFJUUCBzZXNzaW9uIAorICBtYW5hZ2VyIGlzIGdob3N0cGFkZGVkIHRvIFJUUFNyYy4KKyAgVGhlIFJUQ1AgcGFkIG9mIHRoZSBydHBkZWMgaXMgcm91dGVkIHRvIGEgbmV3IHVkcHNpbmsgdGhhdCBzZW5kcyBkYXRhIHRvIHRoZSBSVENQCisgIHBvcnQgb2YgdGhlIHNlcnZlciBhcyByZXR1cm5lZCBpbiB0aGUgVHJhbnNwb3J0OiBoZWFkZXIgZmllbGQuCisKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgKy0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCB8IHVkcHNyYzAgICAgfCAgICstLS0tLS0tLSsgICAgICAgICAgICAgICAgIHwKKyAgICB8IHwgIHBvcnQ9NTAwMCAtLS0tLSBydHBkZWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB8ICstLS0tLS0tLS0tLS0rICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgfAorICAgIHwgKy0tLS0tLS0tLS0tLSsgICB8ICAgICAgICB8ICArLS0tLS0tLS0tLS0tKyB8CisgICAgfCB8IHVkcHNyYzEgICAgLS0tLS0gUlRDUCAgIC0tLS0gdWRwc2luayAgICB8IHwKKyAgICB8IHwgIHBvcnQ9NTAwMSB8ICAgKy0tLS0tLS0tKyAgfCAgcG9ydD02MDAxIHwgfAorICAgIHwgKy0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tKyB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworICBUaGUgb3V0cHV0IHR5cGUgb2YgcnRwZGVjIGlzIGNvbmZpZ3VyZWQgYXMgdGhlIG1lZGlhIHR5cGUgc3BlY2lmaWVkIGluIHRoZSBTRFAKKyAgbWVzc2FnZS4gCisKKy0gQWxsIHRoZSBlbGVtZW50cyBhcmUgc2V0IHRvIFBBVVNFRC9QTEFZSU5HIGFuZCB0aGUgUExBWSBSVFNQIG1lc3NhZ2UgaXMKKyAgc2VudC4KKworICAgID4+IFBMQVkgcnRzcDovL3RocmVhZDo1NDU0L3NvdXRoLXJ0c3AubXAzIFJUU1AvMS4wCisgICAgPj4gQ1NlcTogMgorICAgID4+IFNlc3Npb246IDVkNWNiOTQ0MTMyODhjY2QKKyAgICA+PgorICAgIDw8IFJUU1AvMS4wIDIwMCBPSworICAgIDw8IENTZXE6IDIKKyAgICA8PCBEYXRlOiBXZWQgTWF5IDExIDEzOjIxOjQzIDIwMDUgR01UCisgICAgPDwgU2Vzc2lvbjogNWQ1Y2I5NDQxMzI4OGNjZAorICAgIDw8CisKKy0gVGhlIHVkcCBzb3VyY2UgZWxlbWVudHMgcmVjZWl2ZSBkYXRhIGZyb20gdGhhdCBwb2ludCBhbmQgdGhlIFJUUC9SVENQIG1lc3NhZ2VzCisgIGFyZSBwcm9jZXNzZWQgYnkgdGhlIGVsZW1lbnRzLgorCistIEluIHRoZSBjYXNlIG9mIGludGVybGVhdmVkIG1vZGUsIHRoZSBTRVRVUCBtZXRob2QgeWllbGRzOgorCisgICAgPj4gU0VUVVAgcnRzcDovL3RocmVhZDo1NDU0L3NvdXRoLXJ0c3AubXAzL3N0cmVhbWlkPTAgUlRTUC8xLjAKKyAgICA+PiBDU2VxOiAxCisgICAgPj4gVHJhbnNwb3J0OiBSVFAvQVZQL1VEUDt1bmljYXN0O2NsaWVudF9wb3J0PTUwMDAtNTAwMSxSVFAvQVZQL1VEUDttdWx0aWNhc3QsUlRQL0FWUC9UQ1AKKyAgICA+PgorICAgIDw8IFJUU1AvMS4wIDIwMCBPSworICAgIDw8IFRyYW5zcG9ydDogUlRQL0FWUC9UQ1A7aW50ZXJsZWF2ZWQ9MC0xCisgICAgPDwgQ1NlcTogMQorICAgIDw8IERhdGU6IFdlZCBNYXkgMTEgMTM6MjE6NDMgMjAwNSBHTVQKKyAgICA8PCBTZXNzaW9uOiA1ZDVjYjk0NDEzMjg4Y2NkCisgICAgPDwKKworICBUaGlzIG1lYW5zIHRoYXQgUlRQL1JUQ1AgbWVzc2FnZXMgd2lsbCBiZSBzZW50IG9uIGNoYW5uZWwgMC8xIHJlc3BlY3RpdmVseSBhbmQgdGhhdAorICB0aGUgZGF0YSB3aWxsIGJlIHJlY2VpdmVkIG9uIHRoZSBzYW1lIGNvbm5lY3Rpb24gYXMgdGhlIFJUU1AgY29ubmVjdGlvbi4KKworICBBdCB0aGlzIHBvaW50LCB3ZSByZW1vdmUgdGhlIFVEUCBzb3VyY2UgZWxlbWVudHMgYXMgd2UgZG9uJ3QgbmVlZCB0aGVtIGFueW1vcmUuIFdlCisgIHNldCB1cCB0aGUgcnRwc2VzcyBzZXNzaW9uIG1hbmFnZXIgZWxlbWVudCB0aG91Z2ggYXMgZm9sbG93czoKKworICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCArLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8IHwgX2xvb3AoKSAgICB8ICAgKy0tLS0tLS0tKyAgICAgICAgICAgICAgICAgfAorICAgIHwgfCAgICAgICAgICAgIC0tLS0tIHJ0cHNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHwgfCAgICAgICAgICAgIHwgICB8ICAgICAgICB8ICAgICAgICAgICAgICAgICB8CisgICAgfCB8ICAgICAgICAgICAgfCAgIHwgICAgICAgIHwgICstLS0tLS0tLS0tLS0rIHwKKyAgICB8IHwgICAgICAgICAgICAtLS0tLSBSVENQICAgLS0tLSB1ZHBzaW5rICAgIHwgfAorICAgIHwgfCAgICAgICAgICAgIHwgICArLS0tLS0tLS0rICB8ICBwb3J0PTYwMDEgfCB8CisgICAgfCArLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0rIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgIFdlIHN0YXJ0IGFuIGludGVyYWwgdGFzayB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIFJUU1AgY29ubmVjdGlvbiB3YWl0aW5nCisgIGZvciBkYXRhLiBUaGUgcmVjZWl2ZWQgZGF0YSBpcyB0aGVuIHB1c2hlZCB0byB0aGUgcnRwZGVjIGVsZW1lbnQuCisKKyAgV2hlbiByZWFkaW5nIGZyb20gdGhlIFJUU1AgY29ubmVjdGlvbiB3ZSByZWNlaXZlIGRhdGEgcGFja2V0cyBpbiB0aGUKKyAgZm9sbG93aW5nIGxheW91dCAoc2VlIGFsc28gUkZDMjMyNikKKworICAgICQ8MSBieXRlIGNoYW5uZWw+PDIgYnl0ZXMgbGVuZ3RoLCBiaWcgZW5kaWFuPjxsZW5ndGggYnl0ZXMgb2YgZGF0YT4KKworCitSVFNQIHNlcnZlcgorLS0tLS0tLS0tLS0KKworQW4gUlRTUCBzZXJ2ZXIgbGlzdGVuIG9uIGEgcG9ydCAoZGVmYXVsdCA1NTQpIGZvciBjbGllbnQgY29ubmVjdGlvbnMuIFRoZSBjbGllbnQKK3R5cGljYWxseSBrZWVwcyB0aGlzIGNoYW5uZWwgb3BlbiBkdXJpbmcgdGhlIFJUU1Agc2Vzc2lvbiB0byBpbnN0cnVjdCB0aGUgc2VydmVyCit0byBwYXVzZS9wbGF5L3N0b3AgdGhlIHN0cmVhbS4KKworVGhlIHNlcnZlciBleHBvc2VzIGEgc3RyZWFtIGNvbnNpc3Rpbmcgb2Ygb25lIG9yIG1vcmUgbWVkaWEgc3RyZWFtcyB1c2luZyBhbgorVVJMLiBUaGUgbWVkaWEgc3RyZWFtcyBhcmUgdHlwaWNhbGx5IGF1ZGlvIGFuZCB2aWRlby4KKworICBleDoKKyAgICAgcnRzcDovL3RocmVhZDo1NDU0L2FsaWVuLXJ0c3AubXBlZworCisgICAgIGV4cG9zZXMgYW4gYXVkaW8vdmlkZW8gc3RyZWFtLiBUaGUgdmlkZW8gaXMgbXBlZyBwYWNrZXRpemVkIGluIFJUUCBhbmQKKyAgICAgdGhlIGF1ZGlvIGlzIG1wMyBpbiBSVFAuCisKK1RoZSBzdHJlYW1pbmcgc2VydmVyIHR5cGljYWxseSB1c2VzIGEgZGlmZmVyZW50IGNoYW5uZWwgdG8gc2VuZCB0aGUgbWVkaWEKK2RhdGEgdG8gY2xpZW50cywgdHlwaWNhbGx5IHVzaW5nIFJUUCBvdmVyIFVEUC4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzdHJlYW0KK3RoZSBkYXRhIHRvIHRoZSBjbGllbnQgdXNpbmcgdGhlIGluaXRpYWwgUlRTUCBUQ1Agc2Vzc2lvbiAodGhlIGludGVybGVhdmVkCittb2RlKS4gVGhpcyBsYXN0IG1vZGUgaXMgdXNlZnVsIHdoZW4gdGhlIGNsaWVudCBpcyBiZWhpbmQgYSBmaXJld2FsbCBidXQKK2RvZXMgbm90IHRha2UgYWR2YW50YWdlIG9mIHRoZSBSVFAvVURQIGZlYXR1cmVzLgorCitJbiBib3RoIGNhc2VzLCBtZWRpYSBkYXRhIGlzIHNlbmQgdG8gdGhlIGNsaWVudHMgaW4gYW4gdW5tdWx0aXBsZXhlZCBmb3JtYXQKK3BhY2tldGl6ZWQgYXMgUlRQIHBhY2tldHMuCisKK1RoZSBzdHJlYW1pbmcgc2VydmVyIGhhcyB0byBuZWdvdGlhdGUgYSBjb25uZWN0aW9uIHByb3RvY29sIGZvciBlYWNoIG9mIHRoZQorbWVkaWEgc3RyZWFtcyB3aXRoIHRoZSBjbGllbnQuCisKK01pbmltYWwgc2VydmVyIHJlcXVpcmVtZW50czoKKworLSBUaGUgc2VydmVyIHNob3VsZCBjb3B5IHRoZSBDU2VxIGhlYWRlciBmaWVsZCBpbiBhIGNsaWVudCByZXF1ZXN0IHRvIHRoZQorICByZXNwb25zZSBzbyB0aGF0IHRoZSBjbGllbnQgY2FuIG1hdGNoIHRoZSByZXNwb25zZSB0byB0aGUgcmVxdWVzdC4KKworLSBUaGUgc2VydmVyIHNob3VsZCBrZWVwIGEgc2Vzc2lvbiBmb3IgZWFjaCBjbGllbnQgYWZ0ZXIgdGhlIGNsaWVudCBpc3N1ZWQKKyAgYSBTRVRVUCBjb21tYW5kLiBUaGUgY2xpZW50IHNob3VsZCB1c2UgdGhlIHNhbWUgc2Vzc2lvbiBpZCBmb3IgYWxsIGZ1dHVyZQorICByZXF1ZXN0IHRvIHRoaXMgc2VydmVyLgorCistIHRoZSBzZXJ2ZXIgbXVzdCBzdXBwb3J0IGFuIE9QVElPTlMgcmVxdWVzdCBzZW5kIG92ZXIgdGhlIFJUU1AgY29ubmVjdGlvbi4KKworICAgID4+IE9QVElPTlMgKiBSVFNQLzEuMAorICAgID4+IENTZXE6IDEKKyAgICA+PgorICAgIDw8IFJUU1AvMS4wIDIwMCBPSworICAgIDw8IENTZXE6IDEKKyAgICA8PCBEYXRlOiBXZWQgTWF5IDExIDEzOjIxOjQzIDIwMDUgR01UCisgICAgPDwgU2Vzc2lvbjogNWQ1Y2I5NDQxMzI4OGNjZAorICAgIDw8IFB1YmxpYzogREVTQ1JJQkUsIFNFVFVQLCBURUFSRE9XTiwgUExBWQorICAgIDw8CisKKyAgIFRoZSBPUFRJT05TIHJlcXVlc3Qgc2hvdWxkIGxpc3QgYWxsIHN1cHBvcnRlZCBtZXRob2RzIG9uIHRoZSBzZXJ2ZXIuCisgCisgLSBUaGUgc2VydmVyIHNob3VsZCBzdXBwb3J0IHRoZSBERVNDUklCRSBtZXRob2QuCisKKyAgICA+PiBERVNDUklCRSBydHNwOi8vdGhyZWFkOjU0NTQvc291dGgtcnRzcC5tcDMgUlRTUC8xLjAKKyAgICA+PiBBY2NlcHQ6IGFwcGxpY2F0aW9uL3NkcAorICAgID4+IENTZXE6IDIKKyAgICA+PgorICAgIDw8IFJUU1AvMS4wIDIwMCBPSworICAgIDw8IENvbnRlbnQtTGVuZ3RoOiA4NAorICAgIDw8IENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vc2RwCisgICAgPDwgQ1NlcTogMgorICAgIDw8IERhdGU6IFdlZCBNYXkgMTEgMTM6MDk6MzcgMjAwNSBHTVQKKyAgICA8PAorICAgIDw8IHY9MAorICAgIDw8IG89LSAwIDAgSU4gSVA0IDE5Mi4xNjguMS4xCisgICAgPDwgcz1ObyBUaXRsZQorICAgIDw8IG09YXVkaW8gMCBSVFAvQVZQIDE0CisgICAgPDwgYT1jb250cm9sOnN0cmVhbWlkPTAKKworICAgIFRoZSBjbGllbnQgaXNzdWVzIGEgREVTQ1JJQkUgY29tbWFuZCBmb3IgYSBzcGVjaWZpYyBVUkwgdGhhdCBjb3JyZXNwb25kcworICAgIHRvIGFuIGF2YWlsYWJsZSBzdHJlYW0uIFRoZSBjbGllbnQgd2lsbCBhbHNvIHNlbmQgYW4gQWNjZXB0IGhlYWRlciB0bworICAgIGxpc3QgaXRzIHN1cHBvcnRlZCBmb3JtYXRzLiAKKworICAgIFRoZSBzZXJ2ZXIgYW5zd2VycyB0aGlzIHJlcXVlc3Qgd2l0aCBhIHJlcGx5IGluIG9uZSBvZiB0aGUgY2xpZW50IHN1cHBvcnRlZAorICAgIGZvcm1hdHMgKGFwcGxpY2F0aW9uL3NkcCBpcyB0aGUgbW9zdCBjb21tb24pLiBUaGUgc2VydmVyIHR5cGljYWxseSBzZW5kcyBhCisgICAgZml4ZWQgcmVwbHkgdG8gYWxsIGNsaWVudHMgZm9yIGVhY2ggY29uZmlndXJlZCBzdHJlYW0uCisKKyAtIFRoZSBzZXJ2ZXIgbXVzdCBzdXBwb3J0IHRoZSBTRVRVUCBjb21tYW5kIHRvIGNvbmZpZ3VyZSB0aGUgbWVkaWEgc3RyZWFtcyAKKyAgIHRoYXQgd2VyZSBsaXN0ZWQgaW4gdGhlIERFU0NSSUJFIGNvbW1hbmQuCisKKyAgICA+PiBTRVRVUCBydHNwOi8vdGhyZWFkOjU0NTQvc291dGgtcnRzcC5tcDMvc3RyZWFtaWQ9MCBSVFNQLzEuMAorICAgID4+IENTZXE6IDMKKyAgICA+PiBUcmFuc3BvcnQ6IFJUUC9BVlAvVURQO3VuaWNhc3Q7Y2xpZW50X3BvcnQ9NTAwMC01MDAxLFJUUC9BVlAvVURQO211bHRpY2FzdCxSVFAvQVZQL1RDUAorICAgID4+CisgICAgPDwgUlRTUC8xLjAgMjAwIE9LCisgICAgPDwgVHJhbnNwb3J0OiBSVFAvQVZQL1VEUDt1bmljYXN0O2NsaWVudF9wb3J0PTUwMDAtNTAwMTtzZXJ2ZXJfcG9ydD02MDAwLTYwMDEKKyAgICA8PCBDU2VxOiAzCisgICAgPDwgRGF0ZTogV2VkIE1heSAxMSAxMzoyMTo0MyAyMDA1IEdNVAorICAgIDw8IFNlc3Npb246IDVkNWNiOTQ0MTMyODhjY2QKKworICAgIFRoZSBjbGllbnQgd2lsbCBzZW5kIGEgU0VUVVAgY29tbWFuZCBmb3IgZWFjaCBvZiB0aGUgc3RyZWFtcyBsaXN0ZWQgaW4gdGhlIAorICAgIERFU0NSSUJFIHJlcGx5LiBGb3Igc2RwIHdpbGwgdXNlIGEgVVJMIGFzIGxpc3RlZCBpbiB0aGUgYT1jb250cm9sOiBwcm9wZXJ0eS4KKworICAgIFRoZSBjbGllbnQgd2lsbCBsaXN0IHRoZSBzdXBwb3J0ZWQgdHJhbnNwb3J0cyBpbiB0aGUgVHJhbnNwb3J0OiBoZWFkZXIgZmllbGQuCisgICAgRWFjaCB0cmFuc3BvcnQgaXMgc2VwYXJhdGVkIHdpdGggYSBjb21tYSAoLCkgYW5kIGxpc3RlZCBpbiBvcmRlciBvZiBwcmVmZXJlbmNlLgorICAgIFRoZSBzZXJ2ZXIgaGFzIHRvIHNlbGVjdCB0aGUgZmlyc3Qgc3VwcG9ydGVkIHRyYW5zcG9ydC4KKyAKKyAgICBJbiB0aGUgYWJvdmUgZXhhbXBsZSAzIHRyYW5zcG9ydCBhcmUgbGlzdGVkOgorCisgICAgICAgUlRQL0FWUC9VRFA7dW5pY2FzdDtjbGllbnRfcG9ydD01MDAwLTUwMDEKKworICAgICAgICAgVGhlIGNsaWVudCB3aWxsIGFjY2VwdCBSVFAgb3ZlciBVRFAgb24gdGhlIHBvcnQgcGFpciA1MDAwLTUwMDEuIFBvcnQKKwkgNTAwMCB3aWxsIGFjY2VwdCB0aGUgUlRQIHBhY2tldHMsIDUwMDEgdGhlIFJUU1AgcGFja2V0cyBzZW5kIGJ5IHRoZQorCSBzZXJ2ZXIuCisgICAgICAgCisgICAgICAgUlRQL0FWUC9VRFA7bXVsdGljYXN0CisKKyAgICAgICAgIFRoZSBjbGllbnQgY2FuIGpvaW4gYSBtdWx0aWNhc3QgZ3JvdXAgZm9yIHRoZSBzcGVjaWZpYyBtZWRpYSBzdHJlYW0uCisJIFRoZSBwb3J0IG51bWJlcnMgb2YgdGhlIG11bHRpY2FzdCBncm91cCBpdCB3aWxsIGNvbm5lY3QgdG8gaGF2ZSB0bworCSBiZSBzcGVjaWZpZWQgYnkgdGhlIHNlcnZlciBpbiB0aGUgcmVwbHkuCisgICAgICAgCisgICAgICAgUlRQL0FWUC9UQ1AKKworICAgICAgICAgdGhlIGNsaWVudCBjYW4gYWNjZXB0IFJUUCBwYWNrZXRzIGludGVybGVhdmVkIG9uIHRoZSBSVFNQIGNvbm5lY3Rpb24uCisKKyAgICBUaGUgc2VydmVyIHNlbGVjdHMgYSBzdXBwb3J0ZWQgdHJhbnNwb3J0IGFuIGFsbG9jYXRlcyBhbiBSVFAgcG9ydCBwYWlyIHRvCisgICAgcmVjZWl2ZSBSVFAgYW5kIFJUU1AgZGF0YSBmcm9tIHRoZSBjbGllbnQuIFRoaXMgbGFzdCBzdGVwIGlzIG9wdGlvbmFsIHdoZW4KKyAgICB0aGUgc2VydmVyIGRvZXMgbm90IGFjY2VwdCBSVFAgZGF0YS4KKworICAgIFRoZSBzZXJ2ZXIgc2hvdWxkIGFsbG9jYXRlIGEgc2Vzc2lvbiBmb3IgdGhlIGNsaWVudCBhbmQgc2hvdWxkIHNlbmQgdGhlCisgICAgc2Vzc2lvbklkIHRvIHRoZSBjbGllbnQuIFRoZSBjbGllbnQgc2hvdWxkIHVzZSB0aGlzIHNlc3Npb24gaWQgZm9yIGFsbAorICAgIGZ1dHVyZSByZXF1ZXN0cy4KKworICAgIFRoZSBzZXJ2ZXIgbWF5IHJlZnVzZSBhIGNsaWVudCB0aGF0IGRvZXMgbm90IHVzZSB0aGUgc2FtZSB0cmFuc3BvcnQgbWV0aG9kCisgICAgZm9yIGFsbCBtZWRpYSBzdHJlYW1zLgorCisgICAgVGhlIHNlcnZlciBzdG9yZXMgYWxsIGNsaWVudCBwb3J0IHBhaXJzIGluIHRoZSBzZXJ2ZXIgY2xpZW50IHNlc3Npb24gYWxvbmcKKyAgICB3aXRoIHRoZSB0cmFuc3BvcnQgbWV0aG9kLgorCisgICAgZXg6CisKKyAgICAgIEZvciBhbiBvbi1kZW1hbmQgc3RyZWFtIHRoZSBzZXJ2ZXIgY291bGQgY29uc3RydWN0IGEgKG1pbmltYWwpIFJUUCBHU3RyZWFtZXIgCisgICAgICBwaXBlbGluZSBmb3IgdGhlIGNsaWVudCBhcyBmb2xsb3dzIChmb3IgYW4gbXAzIHN0cmVhbSk6CisgICAgCisgICAgICArLS0tLS0tLS0tKyAgICArLS0tLS0tLS0tLS0rICAgICstLS0tLS0tLS0tLS0rICAgICstLS0tLS0tLS0tLS0tKworICAgICAgfCBmaWxlc3JjIHwgICAgfCBydHBtcDNlbmMgfCAgICB8IHJ0cHNlc3Npb24gfCAgICB8IHVkcHNpbmsgICAgIHwKKyAgICAgIHwgICAgICAgICB8ICAgIHwgICAgICAgICAgIHwgICAgfCAgICAgICAgICAgIHwgICAgfCAgIGhvc3Q9WFhYICB8CisgICAgICB8ICAgICAgICAgfCAgICB8ICAgICAgICAgICB8ICAgIHwgICAgICAgICAgICB8ICAgIHwgICBwb3J0PTUwMDAgfAorICAgICAgfCAgICAgICAgc3JjLS1zaW5rICAgICAgICBzcmMtLXJ0cHNpbmsgICBydHBzcmMtLXNpbmsgICAgICAgICAgIHwKKyAgICAgICstLS0tLS0tLS0rICAgICstLS0tLS0tLS0tLSsgICAgfCAgICAgICAgICAgIHwgICAgKy0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICstLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICB8IHVkcHNpbmsgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgfCAgIGhvc3Q9WFhYICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgIHwgICBwb3J0PTUwMDEgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHJ0c3BzcmMtLXNpbmsgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLSsgICAgKy0tLS0tLS0tLS0tLS0rCisKKyAgICAgIFRoZSBzZXJ2ZXIgd291bGQgc2V0IHRoZSBhYm92ZSBwaXBlbGluZSB0byBQQVVTRSB0byBtYWtlIHN1cmUgbm8gZGF0YQorICAgICAgaXMgc2VudCB0byB0aGUgY2xpZW50IHlldC4KKworICAgICAgb3B0aW9uYWxseSB1ZHBzcmMgZWxlbWVudHMgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcmVjZWl2ZSBjbGllbnQgUlRQIGFuZAorICAgICAgUlRTUCBtZXNzYWdlcy4KKworICAgIGV4OgorCisgICAgICBGb3IgYSBsaXZlIHN0cmVhbSB0aGUgc2VydmVyIGNvdWxkIGNvbnN0cnVjdCBhIChtaW5pbWFsKSBSVFAgR1N0cmVhbWVyIAorICAgICAgcGlwZWxpbmUgZm9yIHRoZSBjbGllbnRzIGFzIGZvbGxvd3MgKGZvciBhbiBtcDMgc3RyZWFtKToKKyAgICAKKyAgICAgICstLS0tLS0tLS0rICAgICstLS0tLS0tLSsgICAgKy0tLS0tLS0tLS0tKyAgICArLS0tLS0tLS0tLS0tKyAgICArLS0tLS0tLS0tLS0tLS0rCisgICAgICB8IHNvdXJjZSAgfCAgICB8IG1wM2VuYyB8ICAgIHwgcnRwbXAzZW5jIHwgICAgfCBydHBzZXNzaW9uIHwgICAgfCBtdWx0aXVkcHNpbmsgfAorICAgICAgfCAgICAgICAgIHwgICAgfCAgICAgICAgfCAgICB8ICAgICAgICAgICB8ICAgIHwgICAgICAgICAgICB8ICAgIHwgICBob3N0PS4uLiAgIHwKKyAgICAgIHwgICAgICAgICB8ICAgIHwgICAgICAgIHwgICAgfCAgICAgICAgICAgfCAgICB8ICAgICAgICAgICAgfCAgICB8ICAgcG9ydD0uLi4gICB8CisgICAgICB8ICAgICAgICBzcmMtLXNpbmsgICAgIHNyYy0tc2luayAgICAgICAgc3JjLS1ydHBzaW5rICAgcnRwc3JjLS1zaW5rICAgICAgICAgICAgfAorICAgICAgKy0tLS0tLS0tLSsgICAgKy0tLS0tLS0tKyAgICArLS0tLS0tLS0tLS0rICAgIHwgICAgICAgICAgICB8ICAgICstLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICArLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgfCBtdWx0aXVkcHNpbmsgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgIHwgICBob3N0PS4uLiAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICB8ICAgcG9ydD0uLi4gICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICBydHNwc3JjLS1zaW5rICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0rICAgICstLS0tLS0tLS0tLS0tLSsKKworICAgICAgTWVkaWEgZGF0YSBpcyBzdHJlYW1lZCB0byBjbGllbnRzIGJ5IGFkZGluZyB0aGUgY2xpZW50IGhvc3QgYW5kIHBvcnQgbnVtYmVycworICAgICAgdG8gdGhlIG11bHRpdWRwc2lua3MuCisKKyAgICAgIG9wdGlvbmFsbHkgdWRwc3JjIGVsZW1lbnRzIGNhbiBiZSBjb25maWd1cmVkIHRvIHJlY2VpdmUgY2xpZW50IFJUUCBhbmQKKyAgICAgIFJUU1AgbWVzc2FnZXMuCisgICAgIAorIC0gVGhlIHNlcnZlciBtdXN0IHN1cHBvcnQgdGhlIFBMQVkgY29tbWFuZCB0byBzdGFydCBwbGF5YmFjayBvZiB0aGUgY29uZmlndXJlZAorICAgbWVkaWEgc3RyZWFtcy4KKworICAgID4+IFBMQVkgcnRzcDovL3RocmVhZDo1NDU0L3NvdXRoLXJ0c3AubXAzIFJUU1AvMS4wCisgICAgPj4gQ1NlcTogMgorICAgID4+IFNlc3Npb246IDVkNWNiOTQ0MTMyODhjY2QKKyAgICA+PgorICAgIDw8IFJUU1AvMS4wIDIwMCBPSworICAgIDw8IENTZXE6IDIKKyAgICA8PCBEYXRlOiBXZWQgTWF5IDExIDEzOjIxOjQzIDIwMDUgR01UCisgICAgPDwgU2Vzc2lvbjogNWQ1Y2I5NDQxMzI4OGNjZAorICAgIDw8CisKKyAgICBVc2luZyB0aGUgU2Vzc2lvbjogaGVhZGVyIGZpZWxkLCB0aGUgc2VydmVyIGZpbmRzIHRoZSBwaXBlbGluZSBvZiB0aGUgc2Vzc2lvbgorICAgIHRvIFBMQVkgYW5kIHNldHMgdGhlIHBpcGVsaW5lIHRvIFBMQVlJTkcgYXQgd2hpY2ggcG9pbnQgdGhlIGNsaWVudCByZWNlaXZlcworICAgIHRoZSBtZWRpYSBzdHJlYW0gZGF0YS4KKworICAgIEluIGNhc2Ugb2YgYSBsaXZlIHN0cmVhbSwgdGhlIHNlcnZlciBhZGRzIHRoZSBwb3J0IG51bWJlcnMgdG8gYSBtdWx0aXVkcHNpbmsKKyAgICBlbGVtZW50LgorCisgLSBUaGUgc2VydmVyIG11c3Qgc3VwcG9ydCB0aGUgVEVBUkRPV04gY29tbWFuZCB0byBzdG9wIHBsYXliYWNrIGFuZCBmcmVlIHRoZQorICAgc2Vzc2lvbiBvZiBhIGNsaWVudC4KKworICAgID4+IFRFQVJET1dOIHJ0c3A6Ly90aHJlYWQ6NTQ1NC9zb3V0aC1ydHNwLm1wMyBSVFNQLzEuMAorICAgID4+IENTZXE6IDQKKyAgICA+PiBTZXNzaW9uOiA1ZDVjYjk0NDEzMjg4Y2NkCisgICAgPj4KKyAgICA8PCBSVFNQLzEuMCAyMDAgT0sKKyAgICA8PCBDU2VxOiA0CisgICAgPDwgRGF0ZTogV2VkIE1heSAxMSAxMzoyMTo0MyAyMDA1IEdNVAorICAgIDw8CisKKyAgICBUaGUgc2VydmVyIGRlc3Ryb3lzIHRoZSBjbGllbnQgcGlwZWxpbmUgaW4gY2FzZSBvZiBhbiBvbi1kZW1hbmQgc3RyZWFtIG9yCisgICAgcmVtb3ZlcyB0aGUgY2xpZW50IHBvcnRzIGZyb20gdGhlIG11bHRpdWRwc2lua3MuIFRoaXMgZWZmZWN0aXZlbHkgc3RvcHMKKyAgICBzdHJlYW1pbmcgdG8gdGhlIGNsaWVudC4KKworCmRpZmYgLS1naXQgYS9nc3QvcnRzcC9VUkxTIGIvZ3N0L3J0c3AvVVJMUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmI0MDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0c3AvVVJMUwpAQCAtMCwwICsxLDM4IEBACitTb21lIHRlc3QgVVJMUzoKKworU1ZRMyB2aWRlbzogCisgIHJ0c3A6Ly9jdW11bHVzLmNyZWF0aXZlLmF1Y2tsYW5kLmFjLm56L35zaGFkby9uZWxzb25faXZfNTEyay5tb3YKKyAgcnRzcDovL3N0cmVhbXIuaGl0cG9wcy5qcC9uZ2MvbW92L20wNjA5Lm1vdiAKKworQVNGIChhdWRpby92aWRlbyk6IAorICBydHNwOi8vYW9kLm15bGlzdGVuLmNvbS9hb2QvOC8wMy8wNjk4MDNfMDkwMzEzNS53bWEKKyAgcnRzcDovLzE5NS4yNDYuOC42OS9kdXJfcHVsbF9oaQorICBydHNwOi8vMTk1LjIxOS4xNjAuMjAwL21jcD9jaGlkPTI1JnBpZD0xOTYmdmlkPTI0MDIyMDEmYnI9ODAwJnRpZD0xJnZvaWQ9Mjg0NCZtdWs9SDFKNHlGcjBtSkIKKyAgcnRzcDovL2ExMTc0LnYyNjYzMGYuYzI2NjMwLmcudm0uYWthbWFpc3RyZWFtLm5ldC83LzExNzQvMjY2MzAvMzYxL29kLXZpZGVvLm1zbi5jb20vOC9tYnIvcnNfcGVyZl9kaWxhbmFfMDkxMjA2X2ZpbmFsZTkxMzUud212CisKK01QNFYtRVMvbXBlZzQtZ2VuZXJpYyhBQ0MpOgorICBydHNwOi8vdm9kLm53ZWMuanAvcXVpY2t0aW1lLzUwNS5tb3YKKyAgcnRzcDovLzIwMy4xNDAuNjguMjQxOjU1NC9oaXJha2F0YWVpem91OS5tcDQKKyAgcnRzcDovL2ttZGkudXRvcm9udG8uY2E6NTU1L29zY29uZi8yMDA0X21heTkuMS5tcDQKKworWC1RVChoMjY0KS9tcGVnNC1nZW5lcmljKEFDQyk6CisgIHJ0c3A6Ly9hMjA0Ny52MTQxM2IuYzE0MTMuZy52cS5ha2FtYWlzdHJlYW0ubmV0LzUvMjA0Ny8xNDEzLzFfaDI2NF8xMTAvMWExYTFhZTY1NmM2MzI5NzAyNjdlMDRlYmQzMTk2YzQyODk3MGU3Y2U4NTdiODFjNGFhYjE2NzdlNDQ1YWVkYzNmYWUxYjRhN2JhZmUwMTMvODg0ODEyNV8xXzExMC5tb3YKKworTVA0Vi1FUy9NUDRBLUxBVE0KKyAgcnRzcDovLzY4LjI1MS4xNjguMTMvdGhpc2lzbG92ZS4zZ3AKKworSDI2NC9NUEEKKyAgcnRzcDovLzEzMC4xOTIuODYuMTY2L2VkLm1vdgorCitSRUFMOgorICBydHNwOi8vMjEzLjI1NC4yMzkuNjEvZmFybS8qL2VuY29kZXIvdGFnZXNzY2hhdS9saXZlMWhpZ2gucm0KKyAgcnRzcDovLzY0LjE5Mi4xMzcuMTA1OjU1NC9yZWFsLmFtYXpvbi1kZS5ldTIvcGhvbm9uZXQvQi8wLzAvMC9IL1cvWS80L0svUy8wMS4wMS5ybT9jbG9ha3BvcnQ9ODAsNTU0LDcwNzAKKworICBydHNwOi8vMjExLjg5LjIyNS4xL2VuY29kZXIvY25yN19wCisgIHJ0c3A6Ly9zdHJlYW0yLnZpc3VhbC5jei9icm9hZGNhc3QvY3QvQ1QyNC1IaWdoLnJtCisKK0FBQywgaW50ZXJsZWF2ZWQ6CisgIHJ0c3A6Ly9pYTMwMDEzNS51cy5hcmNoaXZlLm9yZzo1NTQvMC9pdGVtcy91bmNvdmVyZWRfaW50ZXJ2aWV3cy91bmNvdmVyZWRfaW50ZXJ2aWV3c18zXzI1NmtiLm1wNAorCitWYXJpb3VzIHNhbXBsZXMgaGVyZToKKyAgaHR0cDovL3d3dy5qZXQtc3RyZWFtLm5sL3NhbXBsZXMvbXA0Lmh0bWwKZGlmZiAtLWdpdCBhL2dzdC9ydHNwL2dzdHJ0cGRlYy5jIGIvZ3N0L3J0c3AvZ3N0cnRwZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NmN2M3OQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHNwL2dzdHJ0cGRlYy5jCkBAIC0wLDAgKzEsODk4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDUsMjAwNj4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisvKiBFbGVtZW50LUNoZWNrbGlzdC1WZXJzaW9uOiA1ICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXJ0cGRlYworICoKKyAqIEEgc2ltcGxlIFJUUCBzZXNzaW9uIG1hbmFnZXIgdXNlZCBpbnRlcm5hbGx5IGJ5IHJ0c3BzcmMuCisgKi8KKworLyogI2RlZmluZSBIQVZFX1JUQ1AgKi8KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKyNpZmRlZiBIQVZFX1JUQ1AKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0Y3BidWZmZXIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0cnRwZGVjLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRwZGVjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHBkZWNfZGVidWcpCisKKy8qIEdzdFJUUERlYyBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIFNJR05BTF9SRVFVRVNUX1BUX01BUCwKKyAgU0lHTkFMX0NMRUFSX1BUX01BUCwKKworICBTSUdOQUxfT05fTkVXX1NTUkMsCisgIFNJR05BTF9PTl9TU1JDX0NPTExJU0lPTiwKKyAgU0lHTkFMX09OX1NTUkNfVkFMSURBVEVELAorICBTSUdOQUxfT05fQllFX1NTUkMsCisgIFNJR05BTF9PTl9CWUVfVElNRU9VVCwKKyAgU0lHTkFMX09OX1RJTUVPVVQsCisgIExBU1RfU0lHTkFMCit9OworCisjZGVmaW5lIERFRkFVTFRfTEFURU5DWV9NUyAgICAgIDIwMAorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MQVRFTkNZCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3J0cF9kZWNfcmVjdl9ydHBfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInJlY3ZfcnRwX3NpbmtfJXUiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2RlY19yZWN2X3J0Y3Bfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInJlY3ZfcnRjcF9zaW5rXyV1IiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9SRVFVRVNULAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRjcCIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9ydHBfZGVjX3JlY3ZfcnRwX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInJlY3ZfcnRwX3NyY18ldV8ldV8ldSIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfcnRwX2RlY19ydGNwX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInJ0Y3Bfc3JjXyV1IiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX1JFUVVFU1QsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydGNwIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfcnRwX2RlY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2RlY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRwX2RlY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBHc3RDbG9jayAqZ3N0X3J0cF9kZWNfcHJvdmlkZV9jbG9jayAoR3N0RWxlbWVudCAqIGVsZW1lbnQpOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF9ydHBfZGVjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CitzdGF0aWMgR3N0UGFkICpnc3RfcnRwX2RlY19yZXF1ZXN0X25ld19wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsIGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIHZvaWQgZ3N0X3J0cF9kZWNfcmVsZWFzZV9wYWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWQgKiBwYWQpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX2RlY19jaGFpbl9ydHAgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfcnRwX2RlY19jaGFpbl9ydGNwIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworCisKKy8qIE1hbmFnZXMgdGhlIHJlY2VpdmluZyBlbmQgb2YgdGhlIHBhY2tldHMuCisgKgorICogVGhlcmUgaXMgb25lIHN1Y2ggc3RydWN0dXJlIGZvciBlYWNoIFJUUCBzZXNzaW9uIChhdWRpby92aWRlby8uLi4pLgorICogV2UgZ2V0IHRoZSBSVFAvUlRDUCBwYWNrZXRzIGFuZCBzdHVmZiB0aGVtIGludG8gdGhlIHNlc3Npb24gbWFuYWdlci4gCisgKi8KK3N0cnVjdCBfR3N0UlRQRGVjU2Vzc2lvbgoreworICAvKiBzZXNzaW9uIGlkICovCisgIGdpbnQgaWQ7CisgIC8qIHRoZSBwYXJlbnQgYmluICovCisgIEdzdFJUUERlYyAqZGVjOworCisgIGdib29sZWFuIGFjdGl2ZTsKKyAgLyogd2Ugb25seSBzdXBwb3J0IG9uZSBzc3JjIGFuZCBvbmUgcHQgKi8KKyAgZ3VpbnQzMiBzc3JjOworICBndWludDggcHQ7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgLyogdGhlIHBhZHMgb2YgdGhlIHNlc3Npb24gKi8KKyAgR3N0UGFkICpyZWN2X3J0cF9zaW5rOworICBHc3RQYWQgKnJlY3ZfcnRwX3NyYzsKKyAgR3N0UGFkICpyZWN2X3J0Y3Bfc2luazsKKyAgR3N0UGFkICpydGNwX3NyYzsKK307CisKKy8qIGZpbmQgYSBzZXNzaW9uIHdpdGggdGhlIGdpdmVuIGlkICovCitzdGF0aWMgR3N0UlRQRGVjU2Vzc2lvbiAqCitmaW5kX3Nlc3Npb25fYnlfaWQgKEdzdFJUUERlYyAqIHJ0cGRlYywgZ2ludCBpZCkKK3sKKyAgR1NMaXN0ICp3YWxrOworCisgIGZvciAod2FsayA9IHJ0cGRlYy0+c2Vzc2lvbnM7IHdhbGs7IHdhbGsgPSBnX3NsaXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRQRGVjU2Vzc2lvbiAqc2VzcyA9IChHc3RSVFBEZWNTZXNzaW9uICopIHdhbGstPmRhdGE7CisKKyAgICBpZiAoc2Vzcy0+aWQgPT0gaWQpCisgICAgICByZXR1cm4gc2VzczsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworLyogY3JlYXRlIGEgc2Vzc2lvbiB3aXRoIHRoZSBnaXZlbiBpZCAqLworc3RhdGljIEdzdFJUUERlY1Nlc3Npb24gKgorY3JlYXRlX3Nlc3Npb24gKEdzdFJUUERlYyAqIHJ0cGRlYywgZ2ludCBpZCkKK3sKKyAgR3N0UlRQRGVjU2Vzc2lvbiAqc2VzczsKKworICBzZXNzID0gZ19uZXcwIChHc3RSVFBEZWNTZXNzaW9uLCAxKTsKKyAgc2Vzcy0+aWQgPSBpZDsKKyAgc2Vzcy0+ZGVjID0gcnRwZGVjOworICBydHBkZWMtPnNlc3Npb25zID0gZ19zbGlzdF9wcmVwZW5kIChydHBkZWMtPnNlc3Npb25zLCBzZXNzKTsKKworICByZXR1cm4gc2VzczsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfc2Vzc2lvbiAoR3N0UlRQRGVjU2Vzc2lvbiAqIHNlc3Npb24pCit7CisgIGdfZnJlZSAoc2Vzc2lvbik7Cit9CisKK3N0YXRpYyBndWludCBnc3RfcnRwX2RlY19zaWduYWxzW0xBU1RfU0lHTkFMXSA9IHsgMCB9OworCisjZGVmaW5lIGdzdF9ydHBfZGVjX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFJUUERlYywgZ3N0X3J0cF9kZWMsIEdTVF9UWVBFX0VMRU1FTlQpOworCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9kZWNfY2xhc3NfaW5pdCAoR3N0UlRQRGVjQ2xhc3MgKiBnX2NsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0UlRQRGVjQ2xhc3MgKmtsYXNzOworCisgIGtsYXNzID0gKEdzdFJUUERlY0NsYXNzICopIGdfY2xhc3M7CisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAocnRwZGVjX2RlYnVnLCAicnRwZGVjIiwgMCwgIlJUUCBkZWNvZGVyIik7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfcnRwX2RlY19maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3J0cF9kZWNfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfcnRwX2RlY19nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MQVRFTkNZLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJsYXRlbmN5IiwgIkJ1ZmZlciBsYXRlbmN5IGluIG1zIiwKKyAgICAgICAgICAiQW1vdW50IG9mIG1zIHRvIGJ1ZmZlciIsIDAsIEdfTUFYVUlOVCwgREVGQVVMVF9MQVRFTkNZX01TLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSVFBEZWM6OnJlcXVlc3QtcHQtbWFwOgorICAgKiBAcnRwZGVjOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqIEBwdDogdGhlIHB0CisgICAqCisgICAqIFJlcXVlc3QgdGhlIHBheWxvYWQgdHlwZSBhcyAjR3N0Q2FwcyBmb3IgQHB0IGluIEBzZXNzaW9uLgorICAgKi8KKyAgZ3N0X3J0cF9kZWNfc2lnbmFsc1tTSUdOQUxfUkVRVUVTVF9QVF9NQVBdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoInJlcXVlc3QtcHQtbWFwIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJUUERlY0NsYXNzLCByZXF1ZXN0X3B0X21hcCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR1NUX1RZUEVfQ0FQUywgMiwgR19UWVBFX1VJTlQsCisgICAgICBHX1RZUEVfVUlOVCk7CisKKyAgZ3N0X3J0cF9kZWNfc2lnbmFsc1tTSUdOQUxfQ0xFQVJfUFRfTUFQXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJjbGVhci1wdC1tYXAiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UlRQRGVjQ2xhc3MsIGNsZWFyX3B0X21hcCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fVk9JRCwgR19UWVBFX05PTkUsIDAsIEdfVFlQRV9OT05FKTsKKworICAvKioKKyAgICogR3N0UlRQRGVjOjpvbi1uZXctc3NyYzoKKyAgICogQHJ0cGJpbjogdGhlIG9iamVjdCB3aGljaCByZWNlaXZlZCB0aGUgc2lnbmFsCisgICAqIEBzZXNzaW9uOiB0aGUgc2Vzc2lvbgorICAgKiBAc3NyYzogdGhlIFNTUkMgCisgICAqCisgICAqIE5vdGlmeSBvZiBhIG5ldyBTU1JDIHRoYXQgZW50ZXJlZCBAc2Vzc2lvbi4KKyAgICovCisgIGdzdF9ydHBfZGVjX3NpZ25hbHNbU0lHTkFMX09OX05FV19TU1JDXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJvbi1uZXctc3NyYyIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RSVFBEZWNDbGFzcywgb25fbmV3X3NzcmMpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdfVFlQRV9VSU5UKTsKKyAgLyoqCisgICAqIEdzdFJUUERlYzo6b24tc3NyY19jb2xsaXNpb246CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc2Vzc2lvbjogdGhlIHNlc3Npb24KKyAgICogQHNzcmM6IHRoZSBTU1JDIAorICAgKgorICAgKiBOb3RpZnkgd2hlbiB3ZSBoYXZlIGFuIFNTUkMgY29sbGlzaW9uCisgICAqLworICBnc3RfcnRwX2RlY19zaWduYWxzW1NJR05BTF9PTl9TU1JDX0NPTExJU0lPTl0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tc3NyYy1jb2xsaXNpb24iLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UlRQRGVjQ2xhc3MsIG9uX3NzcmNfY29sbGlzaW9uKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMiwgR19UWVBFX1VJTlQsCisgICAgICBHX1RZUEVfVUlOVCk7CisgIC8qKgorICAgKiBHc3RSVFBEZWM6Om9uLXNzcmNfdmFsaWRhdGVkOgorICAgKiBAcnRwYmluOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqIEBzc3JjOiB0aGUgU1NSQyAKKyAgICoKKyAgICogTm90aWZ5IG9mIGEgbmV3IFNTUkMgdGhhdCBiZWNhbWUgdmFsaWRhdGVkLgorICAgKi8KKyAgZ3N0X3J0cF9kZWNfc2lnbmFsc1tTSUdOQUxfT05fU1NSQ19WQUxJREFURURdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXNzcmMtdmFsaWRhdGVkIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCBHX1NUUlVDVF9PRkZTRVQgKEdzdFJUUERlY0NsYXNzLCBvbl9zc3JjX3ZhbGlkYXRlZCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDIsIEdfVFlQRV9VSU5ULAorICAgICAgR19UWVBFX1VJTlQpOworCisgIC8qKgorICAgKiBHc3RSVFBEZWM6Om9uLWJ5ZS1zc3JjOgorICAgKiBAcnRwYmluOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqIEBzc3JjOiB0aGUgU1NSQyAKKyAgICoKKyAgICogTm90aWZ5IG9mIGFuIFNTUkMgdGhhdCBiZWNhbWUgaW5hY3RpdmUgYmVjYXVzZSBvZiBhIEJZRSBwYWNrZXQuCisgICAqLworICBnc3RfcnRwX2RlY19zaWduYWxzW1NJR05BTF9PTl9CWUVfU1NSQ10gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tYnllLXNzcmMiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UlRQRGVjQ2xhc3MsIG9uX2J5ZV9zc3JjKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMiwgR19UWVBFX1VJTlQsCisgICAgICBHX1RZUEVfVUlOVCk7CisgIC8qKgorICAgKiBHc3RSVFBEZWM6Om9uLWJ5ZS10aW1lb3V0OgorICAgKiBAcnRwYmluOiB0aGUgb2JqZWN0IHdoaWNoIHJlY2VpdmVkIHRoZSBzaWduYWwKKyAgICogQHNlc3Npb246IHRoZSBzZXNzaW9uCisgICAqIEBzc3JjOiB0aGUgU1NSQyAKKyAgICoKKyAgICogTm90aWZ5IG9mIGFuIFNTUkMgdGhhdCBoYXMgdGltZWQgb3V0IGJlY2F1c2Ugb2YgQllFCisgICAqLworICBnc3RfcnRwX2RlY19zaWduYWxzW1NJR05BTF9PTl9CWUVfVElNRU9VVF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tYnllLXRpbWVvdXQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UlRQRGVjQ2xhc3MsIG9uX2J5ZV90aW1lb3V0KSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMiwgR19UWVBFX1VJTlQsCisgICAgICBHX1RZUEVfVUlOVCk7CisgIC8qKgorICAgKiBHc3RSVFBEZWM6Om9uLXRpbWVvdXQ6CisgICAqIEBydHBiaW46IHRoZSBvYmplY3Qgd2hpY2ggcmVjZWl2ZWQgdGhlIHNpZ25hbAorICAgKiBAc2Vzc2lvbjogdGhlIHNlc3Npb24KKyAgICogQHNzcmM6IHRoZSBTU1JDIAorICAgKgorICAgKiBOb3RpZnkgb2YgYW4gU1NSQyB0aGF0IGhhcyB0aW1lZCBvdXQKKyAgICovCisgIGdzdF9ydHBfZGVjX3NpZ25hbHNbU0lHTkFMX09OX1RJTUVPVVRdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoIm9uLXRpbWVvdXQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0UlRQRGVjQ2xhc3MsIG9uX3RpbWVvdXQpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfVUlOVCwKKyAgICAgIEdfVFlQRV9VSU5UKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5wcm92aWRlX2Nsb2NrID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfcnRwX2RlY19wcm92aWRlX2Nsb2NrKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9ydHBfZGVjX2NoYW5nZV9zdGF0ZSk7CisgIGdzdGVsZW1lbnRfY2xhc3MtPnJlcXVlc3RfbmV3X3BhZCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kZWNfcmVxdWVzdF9uZXdfcGFkKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cmVsZWFzZV9wYWQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3J0cF9kZWNfcmVsZWFzZV9wYWQpOworCisgIC8qIHNpbmsgcGFkcyAqLworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2RlY19yZWN2X3J0cF9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3J0cF9kZWNfcmVjdl9ydGNwX3NpbmtfdGVtcGxhdGUpOworICAvKiBzcmMgcGFkcyAqLworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2RlY19yZWN2X3J0cF9zcmNfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfcnRwX2RlY19ydGNwX3NyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlJUUCBEZWNvZGVyIiwKKyAgICAgICJDb2RlYy9QYXJzZXIvTmV0d29yayIsCisgICAgICAiQWNjZXB0cyByYXcgUlRQIGFuZCBSVENQIHBhY2tldHMgYW5kIHNlbmRzIHRoZW0gZm9yd2FyZCIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZGVjX2luaXQgKEdzdFJUUERlYyAqIHJ0cGRlYykKK3sKKyAgcnRwZGVjLT5wcm92aWRlZF9jbG9jayA9IGdzdF9zeXN0ZW1fY2xvY2tfb2J0YWluICgpOworICBydHBkZWMtPmxhdGVuY3kgPSBERUZBVUxUX0xBVEVOQ1lfTVM7CisKKyAgR1NUX09CSkVDVF9GTEFHX1NFVCAocnRwZGVjLCBHU1RfRUxFTUVOVF9GTEFHX1BST1ZJREVfQ0xPQ0spOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0cF9kZWNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFJUUERlYyAqcnRwZGVjOworCisgIHJ0cGRlYyA9IEdTVF9SVFBfREVDIChvYmplY3QpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cGRlYy0+cHJvdmlkZWRfY2xvY2spOworICBnX3NsaXN0X2ZvcmVhY2ggKHJ0cGRlYy0+c2Vzc2lvbnMsIChHRnVuYykgZnJlZV9zZXNzaW9uLCBOVUxMKTsKKyAgZ19zbGlzdF9mcmVlIChydHBkZWMtPnNlc3Npb25zKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0cF9kZWNfcXVlcnlfc3JjIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0xBVEVOQ1k6CisgICAgeworICAgICAgLyogd2UgcHJldGVuZCB0byBiZSBsaXZlIHdpdGggYSAzIHNlY29uZCBsYXRlbmN5ICovCisgICAgICAvKiBGSVhNRTogRG8gd2UgcmVhbGx5IGhhdmUgaW5maW5pdGUgbWF4aW11bSBsYXRlbmN5PyAqLworICAgICAgZ3N0X3F1ZXJ5X3NldF9sYXRlbmN5IChxdWVyeSwgVFJVRSwgMyAqIEdTVF9TRUNPTkQsIC0xKTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRwX2RlY19jaGFpbl9ydHAgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzOworICBHc3RSVFBEZWMgKnJ0cGRlYzsKKyAgR3N0UlRQRGVjU2Vzc2lvbiAqc2Vzc2lvbjsKKyAgZ3VpbnQzMiBzc3JjOworICBndWludDggcHQ7CisgIEdzdFJUUEJ1ZmZlciBydHAgPSB7IE5VTEwsIH07CisKKyAgcnRwZGVjID0gR1NUX1JUUF9ERUMgKHBhcmVudCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwZGVjLCAiZ290IHJ0cCBwYWNrZXQiKTsKKworICBpZiAoIWdzdF9ydHBfYnVmZmVyX21hcCAoYnVmZmVyLCBHU1RfTUFQX1JFQUQsICZydHApKQorICAgIGdvdG8gYmFkX3BhY2tldDsKKworICBzc3JjID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3NzcmMgKCZydHApOworICBwdCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3R5cGUgKCZydHApOworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwZGVjLCAiU1NSQyAlMDh4LCBQVCAlZCIsIHNzcmMsIHB0KTsKKworICAvKiBmaW5kIHNlc3Npb24gKi8KKyAgc2Vzc2lvbiA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKworICAvKiBzZWUgaWYgd2UgaGF2ZSB0aGUgcGFkICovCisgIGlmICghc2Vzc2lvbi0+YWN0aXZlKSB7CisgICAgR3N0UGFkVGVtcGxhdGUgKnRlbXBsOworICAgIEdzdEVsZW1lbnRDbGFzcyAqa2xhc3M7CisgICAgZ2NoYXIgKm5hbWU7CisgICAgR3N0Q2FwcyAqY2FwczsKKyAgICBHVmFsdWUgcmV0ID0geyAwIH07CisgICAgR1ZhbHVlIGFyZ3NbM10gPSB7IHswfQorICAgICwgezB9CisgICAgLCB7MH0KKyAgICB9OworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwZGVjLCAiY3JlYXRpbmcgc3RyZWFtIik7CisKKyAgICBzZXNzaW9uLT5zc3JjID0gc3NyYzsKKyAgICBzZXNzaW9uLT5wdCA9IHB0OworCisgICAgLyogZ2V0IHB0IG1hcCAqLworICAgIGdfdmFsdWVfaW5pdCAoJmFyZ3NbMF0sIEdTVF9UWVBFX0VMRU1FTlQpOworICAgIGdfdmFsdWVfc2V0X29iamVjdCAoJmFyZ3NbMF0sIHJ0cGRlYyk7CisgICAgZ192YWx1ZV9pbml0ICgmYXJnc1sxXSwgR19UWVBFX1VJTlQpOworICAgIGdfdmFsdWVfc2V0X3VpbnQgKCZhcmdzWzFdLCBzZXNzaW9uLT5pZCk7CisgICAgZ192YWx1ZV9pbml0ICgmYXJnc1syXSwgR19UWVBFX1VJTlQpOworICAgIGdfdmFsdWVfc2V0X3VpbnQgKCZhcmdzWzJdLCBwdCk7CisKKyAgICBnX3ZhbHVlX2luaXQgKCZyZXQsIEdTVF9UWVBFX0NBUFMpOworICAgIGdfdmFsdWVfc2V0X2JveGVkICgmcmV0LCBOVUxMKTsKKworICAgIGdfc2lnbmFsX2VtaXR2IChhcmdzLCBnc3RfcnRwX2RlY19zaWduYWxzW1NJR05BTF9SRVFVRVNUX1BUX01BUF0sIDAsICZyZXQpOworCisgICAgY2FwcyA9IChHc3RDYXBzICopIGdfdmFsdWVfZ2V0X2JveGVkICgmcmV0KTsKKworICAgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJyZWN2X3J0cF9zcmNfJXVfJXVfJXUiLCBzZXNzaW9uLT5pZCwgc3NyYywgcHQpOworICAgIGtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChydHBkZWMpOworICAgIHRlbXBsID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJyZWN2X3J0cF9zcmNfJXVfJXVfJXUiKTsKKyAgICBzZXNzaW9uLT5yZWN2X3J0cF9zcmMgPSBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlICh0ZW1wbCwgbmFtZSk7CisgICAgZ19mcmVlIChuYW1lKTsKKworICAgIGdzdF9wYWRfc2V0X2NhcHMgKHNlc3Npb24tPnJlY3ZfcnRwX3NyYywgY2Fwcyk7CisKKyAgICBnc3RfcGFkX3NldF9lbGVtZW50X3ByaXZhdGUgKHNlc3Npb24tPnJlY3ZfcnRwX3NyYywgc2Vzc2lvbik7CisgICAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHNlc3Npb24tPnJlY3ZfcnRwX3NyYywgZ3N0X3J0cF9kZWNfcXVlcnlfc3JjKTsKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKHNlc3Npb24tPnJlY3ZfcnRwX3NyYywgVFJVRSk7CisgICAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAocnRwZGVjKSwgc2Vzc2lvbi0+cmVjdl9ydHBfc3JjKTsKKworICAgIHNlc3Npb24tPmFjdGl2ZSA9IFRSVUU7CisgIH0KKworICByZXMgPSBnc3RfcGFkX3B1c2ggKHNlc3Npb24tPnJlY3ZfcnRwX3NyYywgYnVmZmVyKTsKKworICByZXR1cm4gcmVzOworCitiYWRfcGFja2V0OgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAocnRwZGVjLCBTVFJFQU0sIERFQ09ERSwgKE5VTEwpLAorICAgICAgICAoIlJUUCBwYWNrZXQgZGlkIG5vdCB2YWxpZGF0ZSwgZHJvcHBpbmciKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9ydHBfZGVjX2NoYWluX3J0Y3AgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIEdzdFJUUERlYyAqc3JjOworCisjaWZkZWYgSEFWRV9SVENQCisgIGdib29sZWFuIHZhbGlkOworICBHc3RSVENQUGFja2V0IHBhY2tldDsKKyAgZ2Jvb2xlYW4gbW9yZTsKKyNlbmRpZgorCisgIHNyYyA9IEdTVF9SVFBfREVDIChwYXJlbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImdvdCBydGNwIHBhY2tldCIpOworCisjaWZkZWYgSEFWRV9SVENQCisgIHZhbGlkID0gZ3N0X3J0Y3BfYnVmZmVyX3ZhbGlkYXRlIChidWZmZXIpOworICBpZiAoIXZhbGlkKQorICAgIGdvdG8gYmFkX3BhY2tldDsKKworICAvKiBwb3NpdGlvbiBvbiBmaXJzdCBwYWNrZXQgKi8KKyAgbW9yZSA9IGdzdF9ydGNwX2J1ZmZlcl9nZXRfZmlyc3RfcGFja2V0IChidWZmZXIsICZwYWNrZXQpOworICB3aGlsZSAobW9yZSkgeworICAgIHN3aXRjaCAoZ3N0X3J0Y3BfcGFja2V0X2dldF90eXBlICgmcGFja2V0KSkgeworICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX1NSOgorICAgICAgeworICAgICAgICBndWludDMyIHNzcmMsIHJ0cHRpbWUsIHBhY2tldF9jb3VudCwgb2N0ZXRfY291bnQ7CisgICAgICAgIGd1aW50NjQgbnRwdGltZTsKKyAgICAgICAgZ3VpbnQgY291bnQsIGk7CisKKyAgICAgICAgZ3N0X3J0Y3BfcGFja2V0X3NyX2dldF9zZW5kZXJfaW5mbyAoJnBhY2tldCwgJnNzcmMsICZudHB0aW1lLCAmcnRwdGltZSwKKyAgICAgICAgICAgICZwYWNrZXRfY291bnQsICZvY3RldF9jb3VudCk7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLAorICAgICAgICAgICAgImdvdCBTUiBwYWNrZXQ6IFNTUkMgJTA4eCwgTlRQICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAgICIsIFJUUCAldSwgUEMgJXUsIE9DICV1Iiwgc3NyYywgbnRwdGltZSwgcnRwdGltZSwgcGFja2V0X2NvdW50LAorICAgICAgICAgICAgb2N0ZXRfY291bnQpOworCisgICAgICAgIGNvdW50ID0gZ3N0X3J0Y3BfcGFja2V0X2dldF9yYl9jb3VudCAoJnBhY2tldCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgZ3VpbnQzMiBzc3JjLCBleHRoaWdoZXN0c2VxLCBqaXR0ZXIsIGxzciwgZGxzcjsKKyAgICAgICAgICBndWludDggZnJhY3Rpb25sb3N0OworICAgICAgICAgIGdpbnQzMiBwYWNrZXRzbG9zdDsKKworICAgICAgICAgIGdzdF9ydGNwX3BhY2tldF9nZXRfcmIgKCZwYWNrZXQsIGksICZzc3JjLCAmZnJhY3Rpb25sb3N0LAorICAgICAgICAgICAgICAmcGFja2V0c2xvc3QsICZleHRoaWdoZXN0c2VxLCAmaml0dGVyLCAmbHNyLCAmZGxzcik7CisKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJnb3QgUkIgcGFja2V0ICVkOiBTU1JDICUwOHgsIEZMICV1IgorICAgICAgICAgICAgICAiLCBQTCAldSwgSFMgJXUsIEpJVFRFUiAldSwgTFNSICV1LCBETFNSICV1Iiwgc3NyYywgZnJhY3Rpb25sb3N0LAorICAgICAgICAgICAgICBwYWNrZXRzbG9zdCwgZXh0aGlnaGVzdHNlcSwgaml0dGVyLCBsc3IsIGRsc3IpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX1JSOgorICAgICAgeworICAgICAgICBndWludDMyIHNzcmM7CisgICAgICAgIGd1aW50IGNvdW50LCBpOworCisgICAgICAgIHNzcmMgPSBnc3RfcnRjcF9wYWNrZXRfcnJfZ2V0X3NzcmMgKCZwYWNrZXQpOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImdvdCBSUiBwYWNrZXQ6IFNTUkMgJTA4eCIsIHNzcmMpOworCisgICAgICAgIGNvdW50ID0gZ3N0X3J0Y3BfcGFja2V0X2dldF9yYl9jb3VudCAoJnBhY2tldCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgZ3VpbnQzMiBzc3JjLCBleHRoaWdoZXN0c2VxLCBqaXR0ZXIsIGxzciwgZGxzcjsKKyAgICAgICAgICBndWludDggZnJhY3Rpb25sb3N0OworICAgICAgICAgIGdpbnQzMiBwYWNrZXRzbG9zdDsKKworICAgICAgICAgIGdzdF9ydGNwX3BhY2tldF9nZXRfcmIgKCZwYWNrZXQsIGksICZzc3JjLCAmZnJhY3Rpb25sb3N0LAorICAgICAgICAgICAgICAmcGFja2V0c2xvc3QsICZleHRoaWdoZXN0c2VxLCAmaml0dGVyLCAmbHNyLCAmZGxzcik7CisKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJnb3QgUkIgcGFja2V0ICVkOiBTU1JDICUwOHgsIEZMICV1IgorICAgICAgICAgICAgICAiLCBQTCAldSwgSFMgJXUsIEpJVFRFUiAldSwgTFNSICV1LCBETFNSICV1Iiwgc3NyYywgZnJhY3Rpb25sb3N0LAorICAgICAgICAgICAgICBwYWNrZXRzbG9zdCwgZXh0aGlnaGVzdHNlcSwgaml0dGVyLCBsc3IsIGRsc3IpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX1NERVM6CisgICAgICB7CisgICAgICAgIGd1aW50IGNodW5rcywgaSwgajsKKyAgICAgICAgZ2Jvb2xlYW4gbW9yZV9jaHVua3MsIG1vcmVfaXRlbXM7CisKKyAgICAgICAgY2h1bmtzID0gZ3N0X3J0Y3BfcGFja2V0X3NkZXNfZ2V0X2NodW5rX2NvdW50ICgmcGFja2V0KTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZ290IFNERVMgcGFja2V0IHdpdGggJWQgY2h1bmtzIiwgY2h1bmtzKTsKKworICAgICAgICBtb3JlX2NodW5rcyA9IGdzdF9ydGNwX3BhY2tldF9zZGVzX2ZpcnN0X2NodW5rICgmcGFja2V0KTsKKyAgICAgICAgaSA9IDA7CisgICAgICAgIHdoaWxlIChtb3JlX2NodW5rcykgeworICAgICAgICAgIGd1aW50MzIgc3NyYzsKKworICAgICAgICAgIHNzcmMgPSBnc3RfcnRjcF9wYWNrZXRfc2Rlc19nZXRfc3NyYyAoJnBhY2tldCk7CisKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjaHVuayAlZCwgU1NSQyAlMDh4IiwgaSwgc3NyYyk7CisKKyAgICAgICAgICBtb3JlX2l0ZW1zID0gZ3N0X3J0Y3BfcGFja2V0X3NkZXNfZmlyc3RfaXRlbSAoJnBhY2tldCk7CisgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgd2hpbGUgKG1vcmVfaXRlbXMpIHsKKyAgICAgICAgICAgIEdzdFJUQ1BTREVTVHlwZSB0eXBlOworICAgICAgICAgICAgZ3VpbnQ4IGxlbjsKKyAgICAgICAgICAgIGdjaGFyICpkYXRhOworCisgICAgICAgICAgICBnc3RfcnRjcF9wYWNrZXRfc2Rlc19nZXRfaXRlbSAoJnBhY2tldCwgJnR5cGUsICZsZW4sICZkYXRhKTsKKworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiaXRlbSAlZCwgdHlwZSAlZCwgbGVuICVkLCBkYXRhICVzIiwgaiwKKyAgICAgICAgICAgICAgICB0eXBlLCBsZW4sIGRhdGEpOworCisgICAgICAgICAgICBtb3JlX2l0ZW1zID0gZ3N0X3J0Y3BfcGFja2V0X3NkZXNfbmV4dF9pdGVtICgmcGFja2V0KTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICB9CisgICAgICAgICAgbW9yZV9jaHVua3MgPSBnc3RfcnRjcF9wYWNrZXRfc2Rlc19uZXh0X2NodW5rICgmcGFja2V0KTsKKyAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEdTVF9SVENQX1RZUEVfQllFOgorICAgICAgeworICAgICAgICBndWludCBjb3VudCwgaTsKKyAgICAgICAgZ2NoYXIgKnJlYXNvbjsKKworICAgICAgICByZWFzb24gPSBnc3RfcnRjcF9wYWNrZXRfYnllX2dldF9yZWFzb24gKCZwYWNrZXQpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJnb3QgQllFIHBhY2tldCAocmVhc29uOiAlcykiLAorICAgICAgICAgICAgR1NUX1NUUl9OVUxMIChyZWFzb24pKTsKKyAgICAgICAgZ19mcmVlIChyZWFzb24pOworCisgICAgICAgIGNvdW50ID0gZ3N0X3J0Y3BfcGFja2V0X2J5ZV9nZXRfc3NyY19jb3VudCAoJnBhY2tldCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgZ3VpbnQzMiBzc3JjOworCisKKyAgICAgICAgICBzc3JjID0gZ3N0X3J0Y3BfcGFja2V0X2J5ZV9nZXRfbnRoX3NzcmMgKCZwYWNrZXQsIGkpOworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiU1NSQzogJTA4eCIsIHNzcmMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfUlRDUF9UWVBFX0FQUDoKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZ290IEFQUCBwYWNrZXQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgImdvdCB1bmtub3duIFJUQ1AgcGFja2V0Iik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtb3JlID0gZ3N0X3J0Y3BfcGFja2V0X21vdmVfdG9fbmV4dCAoJnBhY2tldCk7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCitiYWRfcGFja2V0OgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJnb3QgaW52YWxpZCBSVENQIHBhY2tldCIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CisjZWxzZQorICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZGVjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSVFBEZWMgKnNyYzsKKworICBzcmMgPSBHU1RfUlRQX0RFQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTEFURU5DWToKKyAgICAgIHNyYy0+bGF0ZW5jeSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZGVjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RSVFBEZWMgKnNyYzsKKworICBzcmMgPSBHU1RfUlRQX0RFQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTEFURU5DWToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzcmMtPmxhdGVuY3kpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgR3N0Q2xvY2sgKgorZ3N0X3J0cF9kZWNfcHJvdmlkZV9jbG9jayAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdFJUUERlYyAqcnRwZGVjOworCisgIHJ0cGRlYyA9IEdTVF9SVFBfREVDIChlbGVtZW50KTsKKworICByZXR1cm4gR1NUX0NMT0NLX0NBU1QgKGdzdF9vYmplY3RfcmVmIChydHBkZWMtPnByb3ZpZGVkX2Nsb2NrKSk7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0cF9kZWNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgLyogd2UncmUgTk9fUFJFUk9MTCB3aGVuIGdvaW5nIHRvIFBBVVNFRCAqLworICAgICAgcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9OT19QUkVST0xMOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogQ3JlYXRlIGEgcGFkIGZvciByZWNlaXZpbmcgUlRQIGZvciB0aGUgc2Vzc2lvbiBpbiBAbmFtZQorICovCitzdGF0aWMgR3N0UGFkICoKK2NyZWF0ZV9yZWN2X3J0cCAoR3N0UlRQRGVjICogcnRwZGVjLCBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIG5hbWUpCit7CisgIGd1aW50IHNlc3NpZDsKKyAgR3N0UlRQRGVjU2Vzc2lvbiAqc2Vzc2lvbjsKKworICAvKiBmaXJzdCBnZXQgdGhlIHNlc3Npb24gbnVtYmVyICovCisgIGlmIChuYW1lID09IE5VTEwgfHwgc3NjYW5mIChuYW1lLCAicmVjdl9ydHBfc2lua18ldSIsICZzZXNzaWQpICE9IDEpCisgICAgZ290byBub19uYW1lOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGRlYywgImZpbmRpbmcgc2Vzc2lvbiAlZCIsIHNlc3NpZCk7CisKKyAgLyogZ2V0IG9yIGNyZWF0ZSBzZXNzaW9uICovCisgIHNlc3Npb24gPSBmaW5kX3Nlc3Npb25fYnlfaWQgKHJ0cGRlYywgc2Vzc2lkKTsKKyAgaWYgKCFzZXNzaW9uKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAocnRwZGVjLCAiY3JlYXRpbmcgc2Vzc2lvbiAlZCIsIHNlc3NpZCk7CisgICAgLyogY3JlYXRlIHNlc3Npb24gbm93ICovCisgICAgc2Vzc2lvbiA9IGNyZWF0ZV9zZXNzaW9uIChydHBkZWMsIHNlc3NpZCk7CisgICAgaWYgKHNlc3Npb24gPT0gTlVMTCkKKyAgICAgIGdvdG8gY3JlYXRlX2Vycm9yOworICB9CisgIC8qIGNoZWNrIGlmIHBhZCB3YXMgcmVxdWVzdGVkICovCisgIGlmIChzZXNzaW9uLT5yZWN2X3J0cF9zaW5rICE9IE5VTEwpCisgICAgZ290byBleGlzdGVkOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0cGRlYywgImdldHRpbmcgUlRQIHNpbmsgcGFkIik7CisKKyAgc2Vzc2lvbi0+cmVjdl9ydHBfc2luayA9IGdzdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKHRlbXBsLCBuYW1lKTsKKyAgZ3N0X3BhZF9zZXRfZWxlbWVudF9wcml2YXRlIChzZXNzaW9uLT5yZWN2X3J0cF9zaW5rLCBzZXNzaW9uKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHNlc3Npb24tPnJlY3ZfcnRwX3NpbmssIGdzdF9ydHBfZGVjX2NoYWluX3J0cCk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc2Vzc2lvbi0+cmVjdl9ydHBfc2luaywgVFJVRSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cGRlYyksIHNlc3Npb24tPnJlY3ZfcnRwX3NpbmspOworCisgIHJldHVybiBzZXNzaW9uLT5yZWN2X3J0cF9zaW5rOworCisgIC8qIEVSUk9SUyAqLworbm9fbmFtZToKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGRlYzogaW52YWxpZCBuYW1lIGdpdmVuIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2NyZWF0ZV9lcnJvcjoKKyAgeworICAgIC8qIGNyZWF0ZV9zZXNzaW9uIGFscmVhZHkgd2FybmVkICovCisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2V4aXN0ZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBkZWM6IHJlY3ZfcnRwIHBhZCBhbHJlYWR5IHJlcXVlc3RlZCBmb3Igc2Vzc2lvbiAlZCIsIHNlc3NpZCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLyogQ3JlYXRlIGEgcGFkIGZvciByZWNlaXZpbmcgUlRDUCBmb3IgdGhlIHNlc3Npb24gaW4gQG5hbWUKKyAqLworc3RhdGljIEdzdFBhZCAqCitjcmVhdGVfcmVjdl9ydGNwIChHc3RSVFBEZWMgKiBydHBkZWMsIEdzdFBhZFRlbXBsYXRlICogdGVtcGwsCisgICAgY29uc3QgZ2NoYXIgKiBuYW1lKQoreworICBndWludCBzZXNzaWQ7CisgIEdzdFJUUERlY1Nlc3Npb24gKnNlc3Npb247CisKKyAgLyogZmlyc3QgZ2V0IHRoZSBzZXNzaW9uIG51bWJlciAqLworICBpZiAobmFtZSA9PSBOVUxMIHx8IHNzY2FuZiAobmFtZSwgInJlY3ZfcnRjcF9zaW5rXyV1IiwgJnNlc3NpZCkgIT0gMSkKKyAgICBnb3RvIG5vX25hbWU7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocnRwZGVjLCAiZmluZGluZyBzZXNzaW9uICVkIiwgc2Vzc2lkKTsKKworICAvKiBnZXQgdGhlIHNlc3Npb24sIGl0IG11c3QgZXhpc3Qgb3Igd2UgZXJyb3IgKi8KKyAgc2Vzc2lvbiA9IGZpbmRfc2Vzc2lvbl9ieV9pZCAocnRwZGVjLCBzZXNzaWQpOworICBpZiAoIXNlc3Npb24pCisgICAgZ290byBub19zZXNzaW9uOworCisgIC8qIGNoZWNrIGlmIHBhZCB3YXMgcmVxdWVzdGVkICovCisgIGlmIChzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luayAhPSBOVUxMKQorICAgIGdvdG8gZXhpc3RlZDsKKworICBHU1RfREVCVUdfT0JKRUNUIChydHBkZWMsICJnZXR0aW5nIFJUQ1Agc2luayBwYWQiKTsKKworICBzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luayA9IGdzdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKHRlbXBsLCBuYW1lKTsKKyAgZ3N0X3BhZF9zZXRfZWxlbWVudF9wcml2YXRlIChzZXNzaW9uLT5yZWN2X3J0cF9zaW5rLCBzZXNzaW9uKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rLCBnc3RfcnRwX2RlY19jaGFpbl9ydGNwKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzZXNzaW9uLT5yZWN2X3J0Y3Bfc2luaywgVFJVRSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHJ0cGRlYyksIHNlc3Npb24tPnJlY3ZfcnRjcF9zaW5rKTsKKworICByZXR1cm4gc2Vzc2lvbi0+cmVjdl9ydGNwX3Npbms7CisKKyAgLyogRVJST1JTICovCitub19uYW1lOgorICB7CisgICAgZ193YXJuaW5nICgicnRwZGVjOiBpbnZhbGlkIG5hbWUgZ2l2ZW4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorbm9fc2Vzc2lvbjoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGRlYzogbm8gc2Vzc2lvbiB3aXRoIGlkICVkIiwgc2Vzc2lkKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorZXhpc3RlZDoKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGRlYzogcmVjdl9ydGNwIHBhZCBhbHJlYWR5IHJlcXVlc3RlZCBmb3Igc2Vzc2lvbiAlZCIsCisgICAgICAgIHNlc3NpZCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLyogQ3JlYXRlIGEgcGFkIGZvciBzZW5kaW5nIFJUQ1AgZm9yIHRoZSBzZXNzaW9uIGluIEBuYW1lCisgKi8KK3N0YXRpYyBHc3RQYWQgKgorY3JlYXRlX3J0Y3AgKEdzdFJUUERlYyAqIHJ0cGRlYywgR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgY29uc3QgZ2NoYXIgKiBuYW1lKQoreworICBndWludCBzZXNzaWQ7CisgIEdzdFJUUERlY1Nlc3Npb24gKnNlc3Npb247CisKKyAgLyogZmlyc3QgZ2V0IHRoZSBzZXNzaW9uIG51bWJlciAqLworICBpZiAobmFtZSA9PSBOVUxMIHx8IHNzY2FuZiAobmFtZSwgInJ0Y3Bfc3JjXyV1IiwgJnNlc3NpZCkgIT0gMSkKKyAgICBnb3RvIG5vX25hbWU7CisKKyAgLyogZ2V0IG9yIGNyZWF0ZSBzZXNzaW9uICovCisgIHNlc3Npb24gPSBmaW5kX3Nlc3Npb25fYnlfaWQgKHJ0cGRlYywgc2Vzc2lkKTsKKyAgaWYgKCFzZXNzaW9uKQorICAgIGdvdG8gbm9fc2Vzc2lvbjsKKworICAvKiBjaGVjayBpZiBwYWQgd2FzIHJlcXVlc3RlZCAqLworICBpZiAoc2Vzc2lvbi0+cnRjcF9zcmMgIT0gTlVMTCkKKyAgICBnb3RvIGV4aXN0ZWQ7CisKKyAgc2Vzc2lvbi0+cnRjcF9zcmMgPSBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlICh0ZW1wbCwgbmFtZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc2Vzc2lvbi0+cnRjcF9zcmMsIFRSVUUpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChydHBkZWMpLCBzZXNzaW9uLT5ydGNwX3NyYyk7CisKKyAgcmV0dXJuIHNlc3Npb24tPnJ0Y3Bfc3JjOworCisgIC8qIEVSUk9SUyAqLworbm9fbmFtZToKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGRlYzogaW52YWxpZCBuYW1lIGdpdmVuIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK25vX3Nlc3Npb246CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBkZWM6IHNlc3Npb24gd2l0aCBpZCAlZCBkb2VzIG5vdCBleGlzdCIsIHNlc3NpZCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2V4aXN0ZWQ6CisgIHsKKyAgICBnX3dhcm5pbmcgKCJydHBkZWM6IHJ0Y3Bfc3JjIHBhZCBhbHJlYWR5IHJlcXVlc3RlZCBmb3Igc2Vzc2lvbiAlZCIsIHNlc3NpZCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLyogCisgKi8KK3N0YXRpYyBHc3RQYWQgKgorZ3N0X3J0cF9kZWNfcmVxdWVzdF9uZXdfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIG5hbWUsIGNvbnN0IEdzdENhcHMgKiBjYXBzKQoreworICBHc3RSVFBEZWMgKnJ0cGRlYzsKKyAgR3N0RWxlbWVudENsYXNzICprbGFzczsKKyAgR3N0UGFkICpyZXN1bHQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHRlbXBsICE9IE5VTEwsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX1JUUF9ERUMgKGVsZW1lbnQpLCBOVUxMKTsKKworICBydHBkZWMgPSBHU1RfUlRQX0RFQyAoZWxlbWVudCk7CisgIGtsYXNzID0gR1NUX0VMRU1FTlRfR0VUX0NMQVNTIChlbGVtZW50KTsKKworICAvKiBmaWd1cmUgb3V0IHRoZSB0ZW1wbGF0ZSAqLworICBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJyZWN2X3J0cF9zaW5rXyV1IikpIHsKKyAgICByZXN1bHQgPSBjcmVhdGVfcmVjdl9ydHAgKHJ0cGRlYywgdGVtcGwsIG5hbWUpOworICB9IGVsc2UgaWYgKHRlbXBsID09IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLAorICAgICAgICAgICJyZWN2X3J0Y3Bfc2lua18ldSIpKSB7CisgICAgcmVzdWx0ID0gY3JlYXRlX3JlY3ZfcnRjcCAocnRwZGVjLCB0ZW1wbCwgbmFtZSk7CisgIH0gZWxzZSBpZiAodGVtcGwgPT0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoa2xhc3MsICJydGNwX3NyY18ldSIpKSB7CisgICAgcmVzdWx0ID0gY3JlYXRlX3J0Y3AgKHJ0cGRlYywgdGVtcGwsIG5hbWUpOworICB9IGVsc2UKKyAgICBnb3RvIHdyb25nX3RlbXBsYXRlOworCisgIHJldHVybiByZXN1bHQ7CisKKyAgLyogRVJST1JTICovCit3cm9uZ190ZW1wbGF0ZToKKyAgeworICAgIGdfd2FybmluZyAoInJ0cGRlYzogdGhpcyBpcyBub3Qgb3VyIHRlbXBsYXRlIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHBfZGVjX3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKQoreworfQpkaWZmIC0tZ2l0IGEvZ3N0L3J0c3AvZ3N0cnRwZGVjLmggYi9nc3QvcnRzcC9nc3RydHBkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTgzZTIzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0c3AvZ3N0cnRwZGVjLmgKQEAgLTAsMCArMSw4OCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1LDIwMDY+IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qCisgKiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgU291cmNlIENvZGUgaXMgbGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2UuCisgKiBTZWUgZnVydGhlciBleHBsYW5hdGlvbiBhdHRhY2hlZCBpbiBMaWNlbnNlIFN0YXRlbWVudCAoZGlzdHJpYnV0ZWQgaW4gdGhlIGZpbGUKKyAqIExJQ0VOU0UpLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1JUUF9ERUNfSF9fCisjZGVmaW5lIF9fR1NUX1JUUF9ERUNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9SVFBfREVDICAJCShnc3RfcnRwX2RlY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfSVNfUlRQX0RFQyhvYmopICAJCShHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9SVFBfREVDKSkKKyNkZWZpbmUgR1NUX0lTX1JUUF9ERUNfQ0xBU1Moa2xhc3MpIAkoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFBfREVDKSkKKyNkZWZpbmUgR1NUX1JUUF9ERUMob2JqKSAgCQkoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRQX0RFQywgR3N0UlRQRGVjKSkKKyNkZWZpbmUgR1NUX1JUUF9ERUNfQ0xBU1Moa2xhc3MpICAJKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRQX0RFQywgR3N0UlRQRGVjQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UlRQRGVjIEdzdFJUUERlYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBEZWNDbGFzcyBHc3RSVFBEZWNDbGFzczsKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFBEZWNTZXNzaW9uIEdzdFJUUERlY1Nlc3Npb247CisKK3N0cnVjdCBfR3N0UlRQRGVjIHsKKyAgR3N0RWxlbWVudCAgZWxlbWVudDsKKworICBndWludCAgICAgICBsYXRlbmN5OworICBHU0xpc3QgICAgICpzZXNzaW9uczsKKyAgR3N0Q2xvY2sgICAqcHJvdmlkZWRfY2xvY2s7Cit9OworCitzdHJ1Y3QgX0dzdFJUUERlY0NsYXNzIHsKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudF9jbGFzczsKKworICAvKiBnZXQgdGhlIGNhcHMgZm9yIHB0ICovCisgIEdzdENhcHMqICgqcmVxdWVzdF9wdF9tYXApICAoR3N0UlRQRGVjICpydHBkZWMsIGd1aW50IHNlc3Npb24sIGd1aW50IHB0KTsKKworICB2b2lkICAgICAoKmNsZWFyX3B0X21hcCkgICAgKEdzdFJUUERlYyAqcnRwZGVjKTsKKworICB2b2lkICAgICAoKm9uX25ld19zc3JjKSAgICAgICAoR3N0UlRQRGVjICpydHBkZWMsIGd1aW50IHNlc3Npb24sIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fc3NyY19jb2xsaXNpb24pIChHc3RSVFBEZWMgKnJ0cGRlYywgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjKTsKKyAgdm9pZCAgICAgKCpvbl9zc3JjX3ZhbGlkYXRlZCkgKEdzdFJUUERlYyAqcnRwZGVjLCBndWludCBzZXNzaW9uLCBndWludDMyIHNzcmMpOworICB2b2lkICAgICAoKm9uX2J5ZV9zc3JjKSAgICAgICAoR3N0UlRQRGVjICpydHBkZWMsIGd1aW50IHNlc3Npb24sIGd1aW50MzIgc3NyYyk7CisgIHZvaWQgICAgICgqb25fYnllX3RpbWVvdXQpICAgIChHc3RSVFBEZWMgKnJ0cGRlYywgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQzMiBzc3JjKTsKKyAgdm9pZCAgICAgKCpvbl90aW1lb3V0KSAgICAgICAgKEdzdFJUUERlYyAqcnRwZGVjLCBndWludCBzZXNzaW9uLCBndWludDMyIHNzcmMpOworfTsKKworR1R5cGUgZ3N0X3J0cF9kZWNfZ2V0X3R5cGUodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFBfREVDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3J0c3AvZ3N0cnRzcC5jIGIvZ3N0L3J0c3AvZ3N0cnRzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZTJjM2YKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRzcC9nc3RydHNwLmMKQEAgLTAsMCArMSw3NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdC9nc3QtaTE4bi1wbHVnaW4uaCIKKworI2luY2x1ZGUgImdzdHJ0cGRlYy5oIgorI2luY2x1ZGUgImdzdHJ0c3BzcmMuaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworI2lmZGVmIEVOQUJMRV9OTFMKKyAgYmluZHRleHRkb21haW4gKEdFVFRFWFRfUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKEdFVFRFWFRfUEFDS0FHRSwgIlVURi04Iik7CisjZW5kaWYgLyogRU5BQkxFX05MUyAqLworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInJ0c3BzcmMiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX1JUU1BTUkMpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAicnRwZGVjIiwgR1NUX1JBTktfTk9ORSwgR1NUX1RZUEVfUlRQX0RFQykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgcnRzcCwKKyAgICAidHJhbnNmZXIgZGF0YSB2aWEgUlRTUCIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvcnRzcC9nc3RydHNwLmggYi9nc3QvcnRzcC9nc3RydHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmNWVmOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHNwL2dzdHJ0c3AuaApAQCAtMCwwICsxLDUzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgIDwyMDA2PiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKgorICogVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIFNvdXJjZSBDb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlLgorICogU2VlIGZ1cnRoZXIgZXhwbGFuYXRpb24gYXR0YWNoZWQgaW4gTGljZW5zZSBTdGF0ZW1lbnQgKGRpc3RyaWJ1dGVkIGluIHRoZSBmaWxlCisgKiBMSUNFTlNFKS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKKyAqIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX0dTVF9SVFNQX0hfXworI2RlZmluZSBfX0dTVF9SVFNQX0hfXworCitHX0JFR0lOX0RFQ0xTCisKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUU1BfSF9fICovCisKZGlmZiAtLWdpdCBhL2dzdC9ydHNwL2dzdHJ0c3BleHQuYyBiL2dzdC9ydHNwL2dzdHJ0c3BleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2I1YTk3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0c3AvZ3N0cnRzcGV4dC5jCkBAIC0wLDAgKzEsMjY4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qCisgKiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgU291cmNlIENvZGUgaXMgbGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2UuCisgKiBTZWUgZnVydGhlciBleHBsYW5hdGlvbiBhdHRhY2hlZCBpbiBMaWNlbnNlIFN0YXRlbWVudCAoZGlzdHJpYnV0ZWQgaW4gdGhlIGZpbGUKKyAqIExJQ0VOU0UpLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworICogb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZ3N0cnRzcGV4dC5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChydHNwZXh0X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChydHNwZXh0X2RlYnVnKQorCitzdGF0aWMgR0xpc3QgKmV4dGVuc2lvbnM7CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BfZXh0X2xpc3RfZmlsdGVyIChHc3RQbHVnaW5GZWF0dXJlICogZmVhdHVyZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RFbGVtZW50RmFjdG9yeSAqZmFjdG9yeTsKKyAgZ3VpbnQgcmFuazsKKworICAvKiB3ZSBvbmx5IGNhcmUgYWJvdXQgZWxlbWVudCBmYWN0b3JpZXMgKi8KKyAgaWYgKCFHU1RfSVNfRUxFTUVOVF9GQUNUT1JZIChmZWF0dXJlKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZmFjdG9yeSA9IEdTVF9FTEVNRU5UX0ZBQ1RPUlkgKGZlYXR1cmUpOworCisgIGlmICghZ3N0X2VsZW1lbnRfZmFjdG9yeV9oYXNfaW50ZXJmYWNlIChmYWN0b3J5LCAiR3N0UlRTUEV4dGVuc2lvbiIpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBvbmx5IHNlbGVjdCBlbGVtZW50cyB3aXRoIGF1dG9wbHVnZ2luZyByYW5rICovCisgIHJhbmsgPSBnc3RfcGx1Z2luX2ZlYXR1cmVfZ2V0X3JhbmsgKGZlYXR1cmUpOworICBpZiAocmFuayA8IEdTVF9SQU5LX01BUkdJTkFMKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorZ3N0X3J0c3BfZXh0X2xpc3RfaW5pdCAodm9pZCkKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHJ0c3BleHRfZGVidWcsICJydHNwZXh0IiwgMCwgIlJUU1AgZXh0ZW5zaW9uIik7CisKKyAgLyogZ2V0IGEgbGlzdCBvZiBhbGwgZXh0ZW5zaW9ucyAqLworICBleHRlbnNpb25zID0gZ3N0X3JlZ2lzdHJ5X2ZlYXR1cmVfZmlsdGVyIChnc3RfcmVnaXN0cnlfZ2V0ICgpLAorICAgICAgKEdzdFBsdWdpbkZlYXR1cmVGaWx0ZXIpIGdzdF9ydHNwX2V4dF9saXN0X2ZpbHRlciwgRkFMU0UsIE5VTEwpOworfQorCitHc3RSVFNQRXh0ZW5zaW9uTGlzdCAqCitnc3RfcnRzcF9leHRfbGlzdF9nZXQgKHZvaWQpCit7CisgIEdzdFJUU1BFeHRlbnNpb25MaXN0ICpyZXN1bHQ7CisgIEdMaXN0ICp3YWxrOworCisgIHJlc3VsdCA9IGdfbmV3MCAoR3N0UlRTUEV4dGVuc2lvbkxpc3QsIDEpOworCisgIGZvciAod2FsayA9IGV4dGVuc2lvbnM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RFbGVtZW50RmFjdG9yeSAqZmFjdG9yeSA9IEdTVF9FTEVNRU5UX0ZBQ1RPUlkgKHdhbGstPmRhdGEpOworICAgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisKKyAgICBlbGVtZW50ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9jcmVhdGUgKGZhY3RvcnksIE5VTEwpOworICAgIGlmICghZWxlbWVudCkgeworICAgICAgR1NUX0VSUk9SICgiY291bGQgbm90IGNyZWF0ZSBleHRlbnNpb24gaW5zdGFuY2UiKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIEdTVF9ERUJVRyAoImFkZGVkIGV4dGVuc2lvbiBpbnRlcmZhY2UgZm9yICclcyciLAorICAgICAgICBHU1RfRUxFTUVOVF9OQU1FIChlbGVtZW50KSk7CisgICAgcmVzdWx0LT5leHRlbnNpb25zID0gZ19saXN0X3ByZXBlbmQgKHJlc3VsdC0+ZXh0ZW5zaW9ucywgZWxlbWVudCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZAorZ3N0X3J0c3BfZXh0X2xpc3RfZnJlZSAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKiBleHQpCit7CisgIEdMaXN0ICp3YWxrOworCisgIGZvciAod2FsayA9IGV4dC0+ZXh0ZW5zaW9uczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BFeHRlbnNpb24gKmVsZW0gPSAoR3N0UlRTUEV4dGVuc2lvbiAqKSB3YWxrLT5kYXRhOworCisgICAgZ3N0X29iamVjdF91bnJlZiAoR1NUX09CSkVDVF9DQVNUIChlbGVtKSk7CisgIH0KKyAgZ19saXN0X2ZyZWUgKGV4dC0+ZXh0ZW5zaW9ucyk7CisgIGdfZnJlZSAoZXh0KTsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHNwX2V4dF9saXN0X2RldGVjdF9zZXJ2ZXIgKEdzdFJUU1BFeHRlbnNpb25MaXN0ICogZXh0LAorICAgIEdzdFJUU1BNZXNzYWdlICogcmVzcCkKK3sKKyAgR0xpc3QgKndhbGs7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgZm9yICh3YWxrID0gZXh0LT5leHRlbnNpb25zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUEV4dGVuc2lvbiAqZWxlbSA9IChHc3RSVFNQRXh0ZW5zaW9uICopIHdhbGstPmRhdGE7CisKKyAgICByZXMgPSBnc3RfcnRzcF9leHRlbnNpb25fZGV0ZWN0X3NlcnZlciAoZWxlbSwgcmVzcCk7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BfZXh0X2xpc3RfYmVmb3JlX3NlbmQgKEdzdFJUU1BFeHRlbnNpb25MaXN0ICogZXh0LCBHc3RSVFNQTWVzc2FnZSAqIHJlcSkKK3sKKyAgR0xpc3QgKndhbGs7CisgIEdzdFJUU1BSZXN1bHQgcmVzID0gR1NUX1JUU1BfT0s7CisKKyAgZm9yICh3YWxrID0gZXh0LT5leHRlbnNpb25zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUEV4dGVuc2lvbiAqZWxlbSA9IChHc3RSVFNQRXh0ZW5zaW9uICopIHdhbGstPmRhdGE7CisKKyAgICByZXMgPSBnc3RfcnRzcF9leHRlbnNpb25fYmVmb3JlX3NlbmQgKGVsZW0sIHJlcSk7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BfZXh0X2xpc3RfYWZ0ZXJfc2VuZCAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKiBleHQsIEdzdFJUU1BNZXNzYWdlICogcmVxLAorICAgIEdzdFJUU1BNZXNzYWdlICogcmVzcCkKK3sKKyAgR0xpc3QgKndhbGs7CisgIEdzdFJUU1BSZXN1bHQgcmVzID0gR1NUX1JUU1BfT0s7CisKKyAgZm9yICh3YWxrID0gZXh0LT5leHRlbnNpb25zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUEV4dGVuc2lvbiAqZWxlbSA9IChHc3RSVFNQRXh0ZW5zaW9uICopIHdhbGstPmRhdGE7CisKKyAgICByZXMgPSBnc3RfcnRzcF9leHRlbnNpb25fYWZ0ZXJfc2VuZCAoZWxlbSwgcmVxLCByZXNwKTsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitHc3RSVFNQUmVzdWx0Citnc3RfcnRzcF9leHRfbGlzdF9wYXJzZV9zZHAgKEdzdFJUU1BFeHRlbnNpb25MaXN0ICogZXh0LCBHc3RTRFBNZXNzYWdlICogc2RwLAorICAgIEdzdFN0cnVjdHVyZSAqIHMpCit7CisgIEdMaXN0ICp3YWxrOworICBHc3RSVFNQUmVzdWx0IHJlcyA9IEdTVF9SVFNQX09LOworCisgIGZvciAod2FsayA9IGV4dC0+ZXh0ZW5zaW9uczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BFeHRlbnNpb24gKmVsZW0gPSAoR3N0UlRTUEV4dGVuc2lvbiAqKSB3YWxrLT5kYXRhOworCisgICAgcmVzID0gZ3N0X3J0c3BfZXh0ZW5zaW9uX3BhcnNlX3NkcCAoZWxlbSwgc2RwLCBzKTsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitHc3RSVFNQUmVzdWx0Citnc3RfcnRzcF9leHRfbGlzdF9zZXR1cF9tZWRpYSAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKiBleHQsIEdzdFNEUE1lZGlhICogbWVkaWEpCit7CisgIEdMaXN0ICp3YWxrOworICBHc3RSVFNQUmVzdWx0IHJlcyA9IEdTVF9SVFNQX09LOworCisgIGZvciAod2FsayA9IGV4dC0+ZXh0ZW5zaW9uczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BFeHRlbnNpb24gKmVsZW0gPSAoR3N0UlRTUEV4dGVuc2lvbiAqKSB3YWxrLT5kYXRhOworCisgICAgcmVzID0gZ3N0X3J0c3BfZXh0ZW5zaW9uX3NldHVwX21lZGlhIChlbGVtLCBtZWRpYSk7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworZ2Jvb2xlYW4KK2dzdF9ydHNwX2V4dF9saXN0X2NvbmZpZ3VyZV9zdHJlYW0gKEdzdFJUU1BFeHRlbnNpb25MaXN0ICogZXh0LCBHc3RDYXBzICogY2FwcykKK3sKKyAgR0xpc3QgKndhbGs7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgZm9yICh3YWxrID0gZXh0LT5leHRlbnNpb25zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUEV4dGVuc2lvbiAqZWxlbSA9IChHc3RSVFNQRXh0ZW5zaW9uICopIHdhbGstPmRhdGE7CisKKyAgICByZXMgPSBnc3RfcnRzcF9leHRlbnNpb25fY29uZmlndXJlX3N0cmVhbSAoZWxlbSwgY2Fwcyk7CisgICAgaWYgKCFyZXMpCisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitHc3RSVFNQUmVzdWx0Citnc3RfcnRzcF9leHRfbGlzdF9nZXRfdHJhbnNwb3J0cyAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKiBleHQsCisgICAgR3N0UlRTUExvd2VyVHJhbnMgcHJvdG9jb2xzLCBnY2hhciAqKiB0cmFuc3BvcnQpCit7CisgIEdMaXN0ICp3YWxrOworICBHc3RSVFNQUmVzdWx0IHJlcyA9IEdTVF9SVFNQX09LOworCisgIGZvciAod2FsayA9IGV4dC0+ZXh0ZW5zaW9uczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BFeHRlbnNpb24gKmVsZW0gPSAoR3N0UlRTUEV4dGVuc2lvbiAqKSB3YWxrLT5kYXRhOworCisgICAgcmVzID0gZ3N0X3J0c3BfZXh0ZW5zaW9uX2dldF90cmFuc3BvcnRzIChlbGVtLCBwcm90b2NvbHMsIHRyYW5zcG9ydCk7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BfZXh0X2xpc3Rfc3RyZWFtX3NlbGVjdCAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKiBleHQsIEdzdFJUU1BVcmwgKiB1cmwpCit7CisgIEdMaXN0ICp3YWxrOworICBHc3RSVFNQUmVzdWx0IHJlcyA9IEdTVF9SVFNQX09LOworCisgIGZvciAod2FsayA9IGV4dC0+ZXh0ZW5zaW9uczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BFeHRlbnNpb24gKmVsZW0gPSAoR3N0UlRTUEV4dGVuc2lvbiAqKSB3YWxrLT5kYXRhOworCisgICAgcmVzID0gZ3N0X3J0c3BfZXh0ZW5zaW9uX3N0cmVhbV9zZWxlY3QgKGVsZW0sIHVybCk7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKwordm9pZAorZ3N0X3J0c3BfZXh0X2xpc3RfY29ubmVjdCAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKiBleHQsCisgICAgY29uc3QgZ2NoYXIgKiBkZXRhaWxlZF9zaWduYWwsIEdDYWxsYmFjayBjX2hhbmRsZXIsIGdwb2ludGVyIGRhdGEpCit7CisgIEdMaXN0ICp3YWxrOworCisgIGZvciAod2FsayA9IGV4dC0+ZXh0ZW5zaW9uczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BFeHRlbnNpb24gKmVsZW0gPSAoR3N0UlRTUEV4dGVuc2lvbiAqKSB3YWxrLT5kYXRhOworCisgICAgZ19zaWduYWxfY29ubmVjdCAoZWxlbSwgZGV0YWlsZWRfc2lnbmFsLCBjX2hhbmRsZXIsIGRhdGEpOworICB9Cit9CisKK0dzdFJUU1BSZXN1bHQKK2dzdF9ydHNwX2V4dF9saXN0X3JlY2VpdmVfcmVxdWVzdCAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKiBleHQsCisgICAgR3N0UlRTUE1lc3NhZ2UgKiByZXEpCit7CisgIEdMaXN0ICp3YWxrOworICBHc3RSVFNQUmVzdWx0IHJlcyA9IEdTVF9SVFNQX0VOT1RJTVBMOworCisgIGZvciAod2FsayA9IGV4dC0+ZXh0ZW5zaW9uczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BFeHRlbnNpb24gKmVsZW0gPSAoR3N0UlRTUEV4dGVuc2lvbiAqKSB3YWxrLT5kYXRhOworCisgICAgcmVzID0gZ3N0X3J0c3BfZXh0ZW5zaW9uX3JlY2VpdmVfcmVxdWVzdCAoZWxlbSwgcmVxKTsKKyAgICBpZiAocmVzICE9IEdTVF9SVFNQX0VOT1RJTVBMKQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL2dzdC9ydHNwL2dzdHJ0c3BleHQuaCBiL2dzdC9ydHNwL2dzdHJ0c3BleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTg3Nzk2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0c3AvZ3N0cnRzcGV4dC5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRTUF9FWFRfSF9fCisjZGVmaW5lIF9fR1NUX1JUU1BfRVhUX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHNwL2dzdHJ0c3BleHRlbnNpb24uaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0UlRTUEV4dGVuc2lvbkxpc3QgR3N0UlRTUEV4dGVuc2lvbkxpc3Q7CisKK3N0cnVjdCBfR3N0UlRTUEV4dGVuc2lvbkxpc3QKK3sKKyAgR0xpc3QgKmV4dGVuc2lvbnM7Cit9OworCit2b2lkICAgICAgICAgICAgICAgICAgICBnc3RfcnRzcF9leHRfbGlzdF9pbml0ICAgICh2b2lkKTsKKworR3N0UlRTUEV4dGVuc2lvbkxpc3QgKiAgZ3N0X3J0c3BfZXh0X2xpc3RfZ2V0ICAgICAodm9pZCk7Cit2b2lkICAgICAgICAgICAgICAgICAgICBnc3RfcnRzcF9leHRfbGlzdF9mcmVlICAgIChHc3RSVFNQRXh0ZW5zaW9uTGlzdCAqZXh0KTsKKworZ2Jvb2xlYW4gICAgICBnc3RfcnRzcF9leHRfbGlzdF9kZXRlY3Rfc2VydmVyICAgICAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKmV4dCwgR3N0UlRTUE1lc3NhZ2UgKnJlc3ApOworICAKK0dzdFJUU1BSZXN1bHQgZ3N0X3J0c3BfZXh0X2xpc3RfYmVmb3JlX3NlbmQgICAgICAgKEdzdFJUU1BFeHRlbnNpb25MaXN0ICpleHQsIEdzdFJUU1BNZXNzYWdlICpyZXEpOworR3N0UlRTUFJlc3VsdCBnc3RfcnRzcF9leHRfbGlzdF9hZnRlcl9zZW5kICAgICAgICAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKmV4dCwgR3N0UlRTUE1lc3NhZ2UgKnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFJUU1BNZXNzYWdlICpyZXNwKTsKK0dzdFJUU1BSZXN1bHQgZ3N0X3J0c3BfZXh0X2xpc3RfcGFyc2Vfc2RwICAgICAgICAgKEdzdFJUU1BFeHRlbnNpb25MaXN0ICpleHQsIEdzdFNEUE1lc3NhZ2UgKnNkcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFN0cnVjdHVyZSAqcyk7CitHc3RSVFNQUmVzdWx0IGdzdF9ydHNwX2V4dF9saXN0X3NldHVwX21lZGlhICAgICAgIChHc3RSVFNQRXh0ZW5zaW9uTGlzdCAqZXh0LCBHc3RTRFBNZWRpYSAqbWVkaWEpOworZ2Jvb2xlYW4gICAgICBnc3RfcnRzcF9leHRfbGlzdF9jb25maWd1cmVfc3RyZWFtICAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKmV4dCwgR3N0Q2FwcyAqY2Fwcyk7CitHc3RSVFNQUmVzdWx0IGdzdF9ydHNwX2V4dF9saXN0X2dldF90cmFuc3BvcnRzICAgIChHc3RSVFNQRXh0ZW5zaW9uTGlzdCAqZXh0LCBHc3RSVFNQTG93ZXJUcmFucyBwcm90b2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKnRyYW5zcG9ydCk7CitHc3RSVFNQUmVzdWx0IGdzdF9ydHNwX2V4dF9saXN0X3N0cmVhbV9zZWxlY3QgICAgIChHc3RSVFNQRXh0ZW5zaW9uTGlzdCAqZXh0LCBHc3RSVFNQVXJsICp1cmwpOworCit2b2lkICAgICAgICAgIGdzdF9ydHNwX2V4dF9saXN0X2Nvbm5lY3QgICAgICAgICAgIChHc3RSVFNQRXh0ZW5zaW9uTGlzdCAqZXh0LAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKmRldGFpbGVkX3NpZ25hbCwgR0NhbGxiYWNrIGNfaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyIGRhdGEpOworR3N0UlRTUFJlc3VsdCBnc3RfcnRzcF9leHRfbGlzdF9yZWNlaXZlX3JlcXVlc3QgICAoR3N0UlRTUEV4dGVuc2lvbkxpc3QgKmV4dCwgR3N0UlRTUE1lc3NhZ2UgKnJlcSk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9SVFNQX0VYVF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9ydHNwL2dzdHJ0c3BzcmMuYyBiL2dzdC9ydHNwL2dzdHJ0c3BzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjM2MDczCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jCkBAIC0wLDAgKzEsODc1NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1LDIwMDY+IFdpbSBUYXltYW5zIDx3aW0gYXQgZmx1ZW5kbyBkb3QgY29tPgorICogICAgICAgICAgICAgICA8MjAwNj4gTHV0eiBNdWVsbGVyIDxsdXR6IGF0IHRvcGZyb3NlIGRvdCBkZT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1ydHNwc3JjCisgKgorICogTWFrZXMgYSBjb25uZWN0aW9uIHRvIGFuIFJUU1Agc2VydmVyIGFuZCByZWFkIHRoZSBkYXRhLgorICogcnRzcHNyYyBzdHJpY3RseSBmb2xsb3dzIFJGQyAyMzI2IGFuZCB0aGVyZWZvcmUgZG9lcyBub3QgKHlldCkgc3VwcG9ydAorICogUmVhbE1lZGlhL1F1aWNrdGltZS9NaWNyb3NvZnQgZXh0ZW5zaW9ucy4KKyAqCisgKiBSVFNQIHN1cHBvcnRzIHRyYW5zcG9ydCBvdmVyIFRDUCBvciBVRFAgaW4gdW5pY2FzdCBvciBtdWx0aWNhc3QgbW9kZS4gQnkKKyAqIGRlZmF1bHQgcnRzcHNyYyB3aWxsIG5lZ290aWF0ZSBhIGNvbm5lY3Rpb24gaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKyAqIFVEUCB1bmljYXN0L1VEUCBtdWx0aWNhc3QvVENQLiBUaGUgb3JkZXIgY2Fubm90IGJlIGNoYW5nZWQgYnV0IHRoZSBhbGxvd2VkCisgKiBwcm90b2NvbHMgY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCB0aGUgI0dzdFJUU1BTcmM6cHJvdG9jb2xzIHByb3BlcnR5LgorICoKKyAqIHJ0c3BzcmMgY3VycmVudGx5IHVuZGVyc3RhbmRzIFNEUCBhcyB0aGUgZm9ybWF0IG9mIHRoZSBzZXNzaW9uIGRlc2NyaXB0aW9uLgorICogRm9yIGVhY2ggc3RyZWFtIGxpc3RlZCBpbiB0aGUgU0RQIGEgbmV3IHJ0cF9zdHJlYW1cJWQgcGFkIHdpbGwgYmUgY3JlYXRlZAorICogd2l0aCBjYXBzIGRlcml2ZWQgZnJvbSB0aGUgU0RQIG1lZGlhIGRlc2NyaXB0aW9uLiBUaGlzIGlzIGEgY2FwcyBvZiBtaW1lIHR5cGUKKyAqICJhcHBsaWNhdGlvbi94LXJ0cCIgdGhhdCBjYW4gYmUgY29ubmVjdGVkIHRvIGFueSBhdmFpbGFibGUgUlRQIGRlcGF5bG9hZGVyCisgKiBlbGVtZW50LgorICoKKyAqIHJ0c3BzcmMgd2lsbCBpbnRlcm5hbGx5IGluc3RhbnRpYXRlIGFuIFJUUCBzZXNzaW9uIG1hbmFnZXIgZWxlbWVudAorICogdGhhdCB3aWxsIGhhbmRsZSB0aGUgUlRDUCBtZXNzYWdlcyB0byBhbmQgZnJvbSB0aGUgc2VydmVyLCBqaXR0ZXIgcmVtb3ZhbCwKKyAqIHBhY2tldCByZW9yZGVyaW5nIGFsb25nIHdpdGggcHJvdmlkaW5nIGEgY2xvY2sgZm9yIHRoZSBwaXBlbGluZS4KKyAqIFRoaXMgZmVhdHVyZSBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgZ3N0cnRwYmluIGVsZW1lbnQuCisgKgorICogcnRzcHNyYyBhY3RzIGxpa2UgYSBsaXZlIHNvdXJjZSBhbmQgd2lsbCB0aGVyZWZvcmUgb25seSBnZW5lcmF0ZSBkYXRhIGluIHRoZQorICogUExBWUlORyBzdGF0ZS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgcnRzcHNyYyBsb2NhdGlvbj1ydHNwOi8vc29tZS5zZXJ2ZXIvdXJsICEgZmFrZXNpbmsKKyAqIF18IEVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gYW4gUlRTUCBzZXJ2ZXIgYW5kIHNlbmQgdGhlIHJhdyBSVFAgcGFja2V0cyB0byBhCisgKiBmYWtlc2luay4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmIC8qIEhBVkVfVU5JU1REX0ggKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSA8Z3N0L25ldC9nc3RuZXQuaD4KKyNpbmNsdWRlIDxnc3Qvc2RwL2dzdHNkcG1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnc3Qvc2RwL2dzdG1pa2V5Lmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9ydHAuaD4KKworI2luY2x1ZGUgImdzdC9nc3QtaTE4bi1wbHVnaW4uaCIKKworI2luY2x1ZGUgImdzdHJ0c3BzcmMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAocnRzcHNyY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAocnRzcHNyY19kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHJ0cHRlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzdHJlYW1fJXUiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfU09NRVRJTUVTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwOyBhcHBsaWNhdGlvbi94LXJkdCIpKTsKKworLyogdGVtcGxhdGVzIHVzZWQgaW50ZXJuYWxseSAqLworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGFueXNyY3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgiaW50ZXJuYWxzcmNfJXUiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfU09NRVRJTUVTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgYW55c2lua3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgiaW50ZXJuYWxzaW5rXyV1IiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9TT01FVElNRVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK2VudW0KK3sKKyAgU0lHTkFMX0hBTkRMRV9SRVFVRVNULAorICBTSUdOQUxfT05fU0RQLAorICBTSUdOQUxfU0VMRUNUX1NUUkVBTSwKKyAgU0lHTkFMX05FV19NQU5BR0VSLAorICBTSUdOQUxfUkVRVUVTVF9SVENQX0tFWSwKKyAgU0lHTkFMX0FDQ0VQVF9DRVJUSUZJQ0FURSwKKyAgU0lHTkFMX0JFRk9SRV9TRU5ELAorICBMQVNUX1NJR05BTAorfTsKKworZW51bSBfR3N0UnRzcFNyY1J0Y3BTeW5jTW9kZQoreworICBSVENQX1NZTkNfQUxXQVlTLAorICBSVENQX1NZTkNfSU5JVElBTCwKKyAgUlRDUF9TWU5DX1JUUAorfTsKKworZW51bSBfR3N0UnRzcFNyY0J1ZmZlck1vZGUKK3sKKyAgQlVGRkVSX01PREVfTk9ORSwKKyAgQlVGRkVSX01PREVfU0xBVkUsCisgIEJVRkZFUl9NT0RFX0JVRkZFUiwKKyAgQlVGRkVSX01PREVfQVVUTywKKyAgQlVGRkVSX01PREVfU1lOQ0VECit9OworCisjZGVmaW5lIEdTVF9UWVBFX1JUU1BfU1JDX0JVRkZFUl9NT0RFIChnc3RfcnRzcF9zcmNfYnVmZmVyX21vZGVfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3J0c3Bfc3JjX2J1ZmZlcl9tb2RlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgYnVmZmVyX21vZGVfdHlwZSA9IDA7CisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGJ1ZmZlcl9tb2Rlc1tdID0geworICAgIHtCVUZGRVJfTU9ERV9OT05FLCAiT25seSB1c2UgUlRQIHRpbWVzdGFtcHMiLCAibm9uZSJ9LAorICAgIHtCVUZGRVJfTU9ERV9TTEFWRSwgIlNsYXZlIHJlY2VpdmVyIHRvIHNlbmRlciBjbG9jayIsICJzbGF2ZSJ9LAorICAgIHtCVUZGRVJfTU9ERV9CVUZGRVIsICJEbyBsb3cvaGlnaCB3YXRlcm1hcmsgYnVmZmVyaW5nIiwgImJ1ZmZlciJ9LAorICAgIHtCVUZGRVJfTU9ERV9BVVRPLCAiQ2hvb3NlIG1vZGUgZGVwZW5kaW5nIG9uIHN0cmVhbSBsaXZlIiwgImF1dG8ifSwKKyAgICB7QlVGRkVSX01PREVfU1lOQ0VELCAiU3luY2hyb25pemVkIHNlbmRlciBhbmQgcmVjZWl2ZXIgY2xvY2tzIiwgInN5bmNlZCJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIWJ1ZmZlcl9tb2RlX3R5cGUpIHsKKyAgICBidWZmZXJfbW9kZV90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFJUU1BTcmNCdWZmZXJNb2RlIiwgYnVmZmVyX21vZGVzKTsKKyAgfQorICByZXR1cm4gYnVmZmVyX21vZGVfdHlwZTsKK30KKworZW51bSBfR3N0UnRzcFNyY050cFRpbWVTb3VyY2UKK3sKKyAgTlRQX1RJTUVfU09VUkNFX05UUCwKKyAgTlRQX1RJTUVfU09VUkNFX1VOSVgsCisgIE5UUF9USU1FX1NPVVJDRV9SVU5OSU5HX1RJTUUsCisgIE5UUF9USU1FX1NPVVJDRV9DTE9DS19USU1FCit9OworCisjZGVmaW5lIERFQlVHX1JUU1AoX19zZWxmLG1zZykgZ3N0X3J0c3BzcmNfcHJpbnRfcnRzcF9tZXNzYWdlIChfX3NlbGYsIG1zZykKKyNkZWZpbmUgREVCVUdfU0RQKF9fc2VsZixtc2cpIGdzdF9ydHNwc3JjX3ByaW50X3NkcF9tZXNzYWdlIChfX3NlbGYsIG1zZykKKworI2RlZmluZSBHU1RfVFlQRV9SVFNQX1NSQ19OVFBfVElNRV9TT1VSQ0UgKGdzdF9ydHNwX3NyY19udHBfdGltZV9zb3VyY2VfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3J0c3Bfc3JjX250cF90aW1lX3NvdXJjZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIG50cF90aW1lX3NvdXJjZV90eXBlID0gMDsKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgbnRwX3RpbWVfc291cmNlX3ZhbHVlc1tdID0geworICAgIHtOVFBfVElNRV9TT1VSQ0VfTlRQLCAiTlRQIHRpbWUgYmFzZWQgb24gcmVhbHRpbWUgY2xvY2siLCAibnRwIn0sCisgICAge05UUF9USU1FX1NPVVJDRV9VTklYLCAiVU5JWCB0aW1lIGJhc2VkIG9uIHJlYWx0aW1lIGNsb2NrIiwgInVuaXgifSwKKyAgICB7TlRQX1RJTUVfU09VUkNFX1JVTk5JTkdfVElNRSwKKyAgICAgICAgICAiUnVubmluZyB0aW1lIGJhc2VkIG9uIHBpcGVsaW5lIGNsb2NrIiwKKyAgICAgICAgInJ1bm5pbmctdGltZSJ9LAorICAgIHtOVFBfVElNRV9TT1VSQ0VfQ0xPQ0tfVElNRSwgIlBpcGVsaW5lIGNsb2NrIHRpbWUiLCAiY2xvY2stdGltZSJ9LAorICAgIHswLCBOVUxMLCBOVUxMfSwKKyAgfTsKKworICBpZiAoIW50cF90aW1lX3NvdXJjZV90eXBlKSB7CisgICAgbnRwX3RpbWVfc291cmNlX3R5cGUgPQorICAgICAgICBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0UlRTUFNyY050cFRpbWVTb3VyY2UiLAorICAgICAgICBudHBfdGltZV9zb3VyY2VfdmFsdWVzKTsKKyAgfQorICByZXR1cm4gbnRwX3RpbWVfc291cmNlX3R5cGU7Cit9CisKKyNkZWZpbmUgREVGQVVMVF9MT0NBVElPTiAgICAgICAgIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9QUk9UT0NPTFMgICAgICAgIEdTVF9SVFNQX0xPV0VSX1RSQU5TX1VEUCB8IEdTVF9SVFNQX0xPV0VSX1RSQU5TX1VEUF9NQ0FTVCB8IEdTVF9SVFNQX0xPV0VSX1RSQU5TX1RDUAorI2RlZmluZSBERUZBVUxUX0RFQlVHICAgICAgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9SRVRSWSAgICAgICAgICAgIDIwCisjZGVmaW5lIERFRkFVTFRfVElNRU9VVCAgICAgICAgICA1MDAwMDAwCisjZGVmaW5lIERFRkFVTFRfVURQX0JVRkZFUl9TSVpFICAweDgwMDAwCisjZGVmaW5lIERFRkFVTFRfVENQX1RJTUVPVVQgICAgICAyMDAwMDAwMAorI2RlZmluZSBERUZBVUxUX0xBVEVOQ1lfTVMgICAgICAgMjAwMAorI2RlZmluZSBERUZBVUxUX0RST1BfT05fTEFURU5DWSAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9DT05ORUNUSU9OX1NQRUVEIDAKKyNkZWZpbmUgREVGQVVMVF9OQVRfTUVUSE9EICAgICAgIEdTVF9SVFNQX05BVF9EVU1NWQorI2RlZmluZSBERUZBVUxUX0RPX1JUQ1AgICAgICAgICAgVFJVRQorI2RlZmluZSBERUZBVUxUX0RPX1JUU1BfS0VFUF9BTElWRSAgICAgICBUUlVFCisjZGVmaW5lIERFRkFVTFRfUFJPWFkgICAgICAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfUlRQX0JMT0NLU0laRSAgICAwCisjZGVmaW5lIERFRkFVTFRfVVNFUl9JRCAgICAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfVVNFUl9QVyAgICAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfQlVGRkVSX01PREUgICAgICBCVUZGRVJfTU9ERV9BVVRPCisjZGVmaW5lIERFRkFVTFRfUE9SVF9SQU5HRSAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfU0hPUlRfSEVBREVSICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX1BST0JBVElPTiAgICAgICAgMgorI2RlZmluZSBERUZBVUxUX1VEUF9SRUNPTk5FQ1QgICAgVFJVRQorI2RlZmluZSBERUZBVUxUX01VTFRJQ0FTVF9JRkFDRSAgTlVMTAorI2RlZmluZSBERUZBVUxUX05UUF9TWU5DICAgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9VU0VfUElQRUxJTkVfQ0xPQ0sgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9UTFNfVkFMSURBVElPTl9GTEFHUyAgICAgR19UTFNfQ0VSVElGSUNBVEVfVkFMSURBVEVfQUxMCisjZGVmaW5lIERFRkFVTFRfVExTX0RBVEFCQVNFICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfVExTX0lOVEVSQUNUSU9OICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfRE9fUkVUUkFOU01JU1NJT04gICAgICAgIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9OVFBfVElNRV9TT1VSQ0UgIE5UUF9USU1FX1NPVVJDRV9OVFAKKyNkZWZpbmUgREVGQVVMVF9VU0VSX0FHRU5UICAgICAgICJHU3RyZWFtZXIvIiBQQUNLQUdFX1ZFUlNJT04KKyNkZWZpbmUgREVGQVVMVF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGIDEwMDAKKyNkZWZpbmUgREVGQVVMVF9SRkM3MjczX1NZTkMgICAgICAgICBGQUxTRQorI2RlZmluZSBERUZBVUxUX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVCAgIEdfR1VJTlQ2NF9DT05TVEFOVCgwKQorI2RlZmluZSBERUZBVUxUX01BWF9UU19PRkZTRVQgICBHX0dJTlQ2NF9DT05TVEFOVCgzMDAwMDAwMDAwKQorI2RlZmluZSBERUZBVUxUX1ZFUlNJT04gICAgICAgICBHU1RfUlRTUF9WRVJTSU9OXzFfMAorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9MT0NBVElPTiwKKyAgUFJPUF9QUk9UT0NPTFMsCisgIFBST1BfREVCVUcsCisgIFBST1BfUkVUUlksCisgIFBST1BfVElNRU9VVCwKKyAgUFJPUF9UQ1BfVElNRU9VVCwKKyAgUFJPUF9MQVRFTkNZLAorICBQUk9QX0RST1BfT05fTEFURU5DWSwKKyAgUFJPUF9DT05ORUNUSU9OX1NQRUVELAorICBQUk9QX05BVF9NRVRIT0QsCisgIFBST1BfRE9fUlRDUCwKKyAgUFJPUF9ET19SVFNQX0tFRVBfQUxJVkUsCisgIFBST1BfUFJPWFksCisgIFBST1BfUFJPWFlfSUQsCisgIFBST1BfUFJPWFlfUFcsCisgIFBST1BfUlRQX0JMT0NLU0laRSwKKyAgUFJPUF9VU0VSX0lELAorICBQUk9QX1VTRVJfUFcsCisgIFBST1BfQlVGRkVSX01PREUsCisgIFBST1BfUE9SVF9SQU5HRSwKKyAgUFJPUF9VRFBfQlVGRkVSX1NJWkUsCisgIFBST1BfU0hPUlRfSEVBREVSLAorICBQUk9QX1BST0JBVElPTiwKKyAgUFJPUF9VRFBfUkVDT05ORUNULAorICBQUk9QX01VTFRJQ0FTVF9JRkFDRSwKKyAgUFJPUF9OVFBfU1lOQywKKyAgUFJPUF9VU0VfUElQRUxJTkVfQ0xPQ0ssCisgIFBST1BfU0RFUywKKyAgUFJPUF9UTFNfVkFMSURBVElPTl9GTEFHUywKKyAgUFJPUF9UTFNfREFUQUJBU0UsCisgIFBST1BfVExTX0lOVEVSQUNUSU9OLAorICBQUk9QX0RPX1JFVFJBTlNNSVNTSU9OLAorICBQUk9QX05UUF9USU1FX1NPVVJDRSwKKyAgUFJPUF9VU0VSX0FHRU5ULAorICBQUk9QX01BWF9SVENQX1JUUF9USU1FX0RJRkYsCisgIFBST1BfUkZDNzI3M19TWU5DLAorICBQUk9QX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVCwKKyAgUFJPUF9NQVhfVFNfT0ZGU0VULAorICBQUk9QX0RFRkFVTFRfVkVSU0lPTiwKK307CisKKyNkZWZpbmUgR1NUX1RZUEVfUlRTUF9OQVRfTUVUSE9EIChnc3RfcnRzcF9uYXRfbWV0aG9kX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9ydHNwX25hdF9tZXRob2RfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBydHNwX25hdF9tZXRob2RfdHlwZSA9IDA7CisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHJ0c3BfbmF0X21ldGhvZFtdID0geworICAgIHtHU1RfUlRTUF9OQVRfTk9ORSwgIk5vbmUiLCAibm9uZSJ9LAorICAgIHtHU1RfUlRTUF9OQVRfRFVNTVksICJTZW5kIER1bW15IHBhY2tldHMiLCAiZHVtbXkifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0sCisgIH07CisKKyAgaWYgKCFydHNwX25hdF9tZXRob2RfdHlwZSkgeworICAgIHJ0c3BfbmF0X21ldGhvZF90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFJUU1BOYXRNZXRob2QiLCBydHNwX25hdF9tZXRob2QpOworICB9CisgIHJldHVybiBydHNwX25hdF9tZXRob2RfdHlwZTsKK30KKworI2RlZmluZSBSVFNQX1NSQ19SRVNQT05TRV9FUlJPUihzcmMsIHJlc3BvbnNlX21zZywgZXJyX2NhdCwgZXJyX2NvZGUsIGVycm9yX21lc3NhZ2UpIFwKKyAgZG8geyBcCisgICAgR1NUX0VMRU1FTlRfRVJST1JfV0lUSF9ERVRBSUxTKChzcmMpLCBlcnJfY2F0LCBlcnJfY29kZSwgKCIlcyIsIGVycm9yX21lc3NhZ2UpLCBcCisgICAgICAgICgiJXMgKCVkKSIsIChyZXNwb25zZV9tc2cpLT50eXBlX2RhdGEucmVzcG9uc2UucmVhc29uLCAocmVzcG9uc2VfbXNnKS0+dHlwZV9kYXRhLnJlc3BvbnNlLmNvZGUpLCBcCisgICAgICAgICgicnRzcC1zdGF0dXMtY29kZSIsIEdfVFlQRV9VSU5ULCAocmVzcG9uc2VfbXNnKS0+dHlwZV9kYXRhLnJlc3BvbnNlLmNvZGUsIFwKKyAgICAgICAgICJydHNwLXN0YXR1cy1yZWFzb24iLCBHX1RZUEVfU1RSSU5HLCBHU1RfU1RSX05VTEwoKHJlc3BvbnNlX21zZyktPnR5cGVfZGF0YS5yZXNwb25zZS5yZWFzb24pLCBOVUxMKSk7IFwKKyAgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgZ3N0X3J0c3BzcmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3RfcnRzcHNyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfcnRzcHNyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBHc3RDbG9jayAqZ3N0X3J0c3BzcmNfcHJvdmlkZV9jbG9jayAoR3N0RWxlbWVudCAqIGVsZW1lbnQpOworCitzdGF0aWMgdm9pZCBnc3RfcnRzcHNyY191cmlfaGFuZGxlcl9pbml0IChncG9pbnRlciBnX2lmYWNlLAorICAgIGdwb2ludGVyIGlmYWNlX2RhdGEpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0c3BzcmNfc2V0X3Byb3h5IChHc3RSVFNQU3JjICogcnRzcCwgY29uc3QgZ2NoYXIgKiBwcm94eSk7CitzdGF0aWMgdm9pZCBnc3RfcnRzcHNyY19zZXRfdGNwX3RpbWVvdXQgKEdzdFJUU1BTcmMgKiBydHNwc3JjLCBndWludDY0IHRpbWVvdXQpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRzcHNyY19zZW5kX2V2ZW50IChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgdm9pZCBnc3RfcnRzcHNyY19oYW5kbGVfbWVzc2FnZSAoR3N0QmluICogYmluLCBHc3RNZXNzYWdlICogbWVzc2FnZSk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfcnRzcHNyY19zZXR1cF9hdXRoIChHc3RSVFNQU3JjICogc3JjLAorICAgIEdzdFJUU1BNZXNzYWdlICogcmVzcG9uc2UpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCAoR3N0UlRTUFNyYyAqIHNyYywgZ2ludCBjbWQsCisgICAgZ2ludCBtYXNrKTsKK3N0YXRpYyBHc3RSVFNQUmVzdWx0IGdzdF9ydHNwc3JjX3NlbmRfY2IgKEdzdFJUU1BFeHRlbnNpb24gKiBleHQsCisgICAgR3N0UlRTUE1lc3NhZ2UgKiByZXF1ZXN0LCBHc3RSVFNQTWVzc2FnZSAqIHJlc3BvbnNlLCBHc3RSVFNQU3JjICogc3JjKTsKKworc3RhdGljIEdzdFJUU1BSZXN1bHQgZ3N0X3J0c3BzcmNfb3BlbiAoR3N0UlRTUFNyYyAqIHNyYywgZ2Jvb2xlYW4gYXN5bmMpOworc3RhdGljIEdzdFJUU1BSZXN1bHQgZ3N0X3J0c3BzcmNfcGxheSAoR3N0UlRTUFNyYyAqIHNyYywgR3N0U2VnbWVudCAqIHNlZ21lbnQsCisgICAgZ2Jvb2xlYW4gYXN5bmMsIGNvbnN0IGdjaGFyICogc2Vla19zdHlsZSk7CitzdGF0aWMgR3N0UlRTUFJlc3VsdCBnc3RfcnRzcHNyY19wYXVzZSAoR3N0UlRTUFNyYyAqIHNyYywgZ2Jvb2xlYW4gYXN5bmMpOworc3RhdGljIEdzdFJUU1BSZXN1bHQgZ3N0X3J0c3BzcmNfY2xvc2UgKEdzdFJUU1BTcmMgKiBzcmMsIGdib29sZWFuIGFzeW5jLAorICAgIGdib29sZWFuIG9ubHlfY2xvc2UpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0c3BzcmNfdXJpX3NldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyLAorICAgIGNvbnN0IGdjaGFyICogdXJpLCBHRXJyb3IgKiogZXJyb3IpOworc3RhdGljIGdjaGFyICpnc3RfcnRzcHNyY191cmlfZ2V0X3VyaSAoR3N0VVJJSGFuZGxlciAqIGhhbmRsZXIpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0c3BzcmNfYWN0aXZhdGVfc3RyZWFtcyAoR3N0UlRTUFNyYyAqIHNyYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0c3BzcmNfbG9vcCAoR3N0UlRTUFNyYyAqIHNyYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0c3BzcmNfc3RyZWFtX3B1c2hfZXZlbnQgKEdzdFJUU1BTcmMgKiBzcmMsCisgICAgR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3J0c3BzcmNfcHVzaF9ldmVudCAoR3N0UlRTUFNyYyAqIHNyYywgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgdm9pZCBnc3RfcnRzcHNyY19jb25uZWN0aW9uX2ZsdXNoIChHc3RSVFNQU3JjICogc3JjLCBnYm9vbGVhbiBmbHVzaCk7CitzdGF0aWMgR3N0UlRTUFJlc3VsdCBnc3RfcnRzcF9jb25uaW5mb19jbG9zZSAoR3N0UlRTUFNyYyAqIHNyYywKKyAgICBHc3RSVFNQQ29ubkluZm8gKiBpbmZvLCBnYm9vbGVhbiBmcmVlKTsKK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19wcmludF9ydHNwX21lc3NhZ2UgKEdzdFJUU1BTcmMgKiBzcmMsIGNvbnN0IEdzdFJUU1BNZXNzYWdlICogbXNnKTsKK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19wcmludF9zZHBfbWVzc2FnZSAoR3N0UlRTUFNyYyAqIHNyYywgY29uc3QgR3N0U0RQTWVzc2FnZSAqIG1zZyk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGd1aW50OCBwdDsKKyAgR3N0Q2FwcyAqY2FwczsKK30gUHRNYXBJdGVtOworCisvKiBjb21tYW5kcyB3ZSBzZW5kIHRvIG91dCBsb29wIHRvIG5vdGlmeSBpdCBvZiBldmVudHMgKi8KKyNkZWZpbmUgQ01EX09QRU4gICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgQ01EX1BMQVkgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgQ01EX1BBVVNFICAgICAgKDEgPDwgMikKKyNkZWZpbmUgQ01EX0NMT1NFICAgICAgKDEgPDwgMykKKyNkZWZpbmUgQ01EX1dBSVQgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgQ01EX1JFQ09OTkVDVCAgKDEgPDwgNSkKKyNkZWZpbmUgQ01EX0xPT1AgICAgICAgKDEgPDwgNikKKworLyogbWFzayBmb3IgYWxsIGNvbW1hbmRzICovCisjZGVmaW5lIENNRF9BTEwgICAgICAgICAoKENNRF9MT09QIDw8IDEpIC0gMSkKKworI2RlZmluZSBHU1RfRUxFTUVOVF9QUk9HUkVTUyhlbCwgdHlwZSwgY29kZSwgdGV4dCkgICAgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2NoYXIgKl9fdHh0ID0gX2dzdF9lbGVtZW50X2Vycm9yX3ByaW50ZiB0ZXh0OyAgICAgICAgXAorICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKGVsKSwgICAgICBcCisgICAgICBnc3RfbWVzc2FnZV9uZXdfcHJvZ3Jlc3MgKEdTVF9PQkpFQ1RfQ0FTVCAoZWwpLCAgIFwKKyAgICAgICAgICBHU1RfUFJPR1JFU1NfVFlQRV8gIyN0eXBlLCBjb2RlLCBfX3R4dCkpOyAgICAgXAorICBnX2ZyZWUgKF9fdHh0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IEdfU1RNVF9FTkQKKworc3RhdGljIGd1aW50IGdzdF9ydHNwc3JjX3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07CisKKyNkZWZpbmUgZ3N0X3J0c3BzcmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdFJUU1BTcmMsIGdzdF9ydHNwc3JjLCBHU1RfVFlQRV9CSU4sCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9VUklfSEFORExFUiwgZ3N0X3J0c3BzcmNfdXJpX2hhbmRsZXJfaW5pdCkpOworCisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKK2NtZF90b19zdHJpbmcgKGd1aW50IGNtZCkKK3sKKyAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIENNRF9PUEVOOgorICAgICAgcmV0dXJuICJPUEVOIjsKKyAgICBjYXNlIENNRF9QTEFZOgorICAgICAgcmV0dXJuICJQTEFZIjsKKyAgICBjYXNlIENNRF9QQVVTRToKKyAgICAgIHJldHVybiAiUEFVU0UiOworICAgIGNhc2UgQ01EX0NMT1NFOgorICAgICAgcmV0dXJuICJDTE9TRSI7CisgICAgY2FzZSBDTURfV0FJVDoKKyAgICAgIHJldHVybiAiV0FJVCI7CisgICAgY2FzZSBDTURfUkVDT05ORUNUOgorICAgICAgcmV0dXJuICJSRUNPTk5FQ1QiOworICAgIGNhc2UgQ01EX0xPT1A6CisgICAgICByZXR1cm4gIkxPT1AiOworICB9CisKKyAgcmV0dXJuICJ1bmtub3duIjsKK30KKyNlbmRpZgorCitzdGF0aWMgZ2Jvb2xlYW4KK2RlZmF1bHRfc2VsZWN0X3N0cmVhbSAoR3N0UlRTUFNyYyAqIHNyYywgZ3VpbnQgaWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJkZWZhdWx0IGhhbmRsZXIiKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorc2VsZWN0X3N0cmVhbV9hY2N1bSAoR1NpZ25hbEludm9jYXRpb25IaW50ICogaWhpbnQsCisgICAgR1ZhbHVlICogcmV0dXJuX2FjY3UsIGNvbnN0IEdWYWx1ZSAqIGhhbmRsZXJfcmV0dXJuLCBncG9pbnRlciBkYXRhKQoreworICBnYm9vbGVhbiBteWJvb2xlYW47CisKKyAgbXlib29sZWFuID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAoaGFuZGxlcl9yZXR1cm4pOworICBHU1RfREVCVUcgKCJhY2N1bSAlZCIsIG15Ym9vbGVhbik7CisgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHJldHVybl9hY2N1LCBteWJvb2xlYW4pOworCisgIC8qIHN0b3AgZW1pc3Npb24gaWYgRkFMU0UgKi8KKyAgcmV0dXJuIG15Ym9vbGVhbjsKK30KKworc3RhdGljIGdib29sZWFuCitkZWZhdWx0X2JlZm9yZV9zZW5kIChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQTWVzc2FnZSAqIG1zZykKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZGVmYXVsdCBoYW5kbGVyIik7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2JlZm9yZV9zZW5kX2FjY3VtIChHU2lnbmFsSW52b2NhdGlvbkhpbnQgKiBpaGludCwKKyAgICBHVmFsdWUgKiByZXR1cm5fYWNjdSwgY29uc3QgR1ZhbHVlICogaGFuZGxlcl9yZXR1cm4sIGdwb2ludGVyIGRhdGEpCit7CisgIGdib29sZWFuIG15Ym9vbGVhbjsKKworICBteWJvb2xlYW4gPSBnX3ZhbHVlX2dldF9ib29sZWFuIChoYW5kbGVyX3JldHVybik7CisgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHJldHVybl9hY2N1LCBteWJvb2xlYW4pOworCisgIC8qIHByZXZlbnQgc2VuZCBpZiBGQUxTRSAqLworICByZXR1cm4gbXlib29sZWFuOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfY2xhc3NfaW5pdCAoR3N0UlRTUFNyY0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCaW5DbGFzcyAqZ3N0YmluX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmluX2NsYXNzID0gKEdzdEJpbkNsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChydHNwc3JjX2RlYnVnLCAicnRzcHNyYyIsIDAsICJSVFNQIHNyYyIpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9ydHNwc3JjX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3J0c3BzcmNfZ2V0X3Byb3BlcnR5OworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3J0c3BzcmNfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MT0NBVElPTiwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJsb2NhdGlvbiIsICJSVFNQIExvY2F0aW9uIiwKKyAgICAgICAgICAiTG9jYXRpb24gb2YgdGhlIFJUU1AgdXJsIHRvIHJlYWQiLAorICAgICAgICAgIERFRkFVTFRfTE9DQVRJT04sIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUFJPVE9DT0xTLAorICAgICAgZ19wYXJhbV9zcGVjX2ZsYWdzICgicHJvdG9jb2xzIiwgIlByb3RvY29scyIsCisgICAgICAgICAgIkFsbG93ZWQgbG93ZXIgdHJhbnNwb3J0IHByb3RvY29scyIsIEdTVF9UWVBFX1JUU1BfTE9XRVJfVFJBTlMsCisgICAgICAgICAgREVGQVVMVF9QUk9UT0NPTFMsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfREVCVUcsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImRlYnVnIiwgIkRlYnVnIiwKKyAgICAgICAgICAiRHVtcCByZXF1ZXN0IGFuZCByZXNwb25zZSBtZXNzYWdlcyB0byBzdGRvdXQiCisgICAgICAgICAgIihERVBSRUNBVEVEOiBQcmludGVkIGFsbCBSVFNQIG1lc3NhZ2UgdG8gZ3N0cmVhbWVyIGxvZyBhcyAnbG9nJyBsZXZlbCkiLAorICAgICAgICAgIERFRkFVTFRfREVCVUcsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR19QQVJBTV9ERVBSRUNBVEVEKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SRVRSWSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgicmV0cnkiLCAiUmV0cnkiLAorICAgICAgICAgICJNYXggbnVtYmVyIG9mIHJldHJpZXMgd2hlbiBhbGxvY2F0aW5nIFJUUCBwb3J0cy4iLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDE2LCBERUZBVUxUX1JFVFJZLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVElNRU9VVCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJ0aW1lb3V0IiwgIlRpbWVvdXQiLAorICAgICAgICAgICJSZXRyeSBUQ1AgdHJhbnNwb3J0IGFmdGVyIFVEUCB0aW1lb3V0IG1pY3Jvc2Vjb25kcyAoMCA9IGRpc2FibGVkKSIsCisgICAgICAgICAgMCwgR19NQVhVSU5UNjQsIERFRkFVTFRfVElNRU9VVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RDUF9USU1FT1VULAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoInRjcC10aW1lb3V0IiwgIlRDUCBUaW1lb3V0IiwKKyAgICAgICAgICAiRmFpbCBhZnRlciB0aW1lb3V0IG1pY3Jvc2Vjb25kcyBvbiBUQ1AgY29ubmVjdGlvbnMgKDAgPSBkaXNhYmxlZCkiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDY0LCBERUZBVUxUX1RDUF9USU1FT1VULAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTEFURU5DWSwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgibGF0ZW5jeSIsICJCdWZmZXIgbGF0ZW5jeSBpbiBtcyIsCisgICAgICAgICAgIkFtb3VudCBvZiBtcyB0byBidWZmZXIiLCAwLCBHX01BWFVJTlQsIERFRkFVTFRfTEFURU5DWV9NUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RST1BfT05fTEFURU5DWSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZHJvcC1vbi1sYXRlbmN5IiwKKyAgICAgICAgICAiRHJvcCBidWZmZXJzIHdoZW4gbWF4aW11bSBsYXRlbmN5IGlzIHJlYWNoZWQiLAorICAgICAgICAgICJUZWxscyB0aGUgaml0dGVyYnVmZmVyIHRvIG5ldmVyIGV4Y2VlZCB0aGUgZ2l2ZW4gbGF0ZW5jeSBpbiBzaXplIiwKKyAgICAgICAgICBERUZBVUxUX0RST1BfT05fTEFURU5DWSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DT05ORUNUSU9OX1NQRUVELAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoImNvbm5lY3Rpb24tc3BlZWQiLCAiQ29ubmVjdGlvbiBTcGVlZCIsCisgICAgICAgICAgIk5ldHdvcmsgY29ubmVjdGlvbiBzcGVlZCBpbiBrYnBzICgwID0gdW5rbm93bikiLAorICAgICAgICAgIDAsIEdfTUFYVUlOVDY0IC8gMTAwMCwgREVGQVVMVF9DT05ORUNUSU9OX1NQRUVELAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTkFUX01FVEhPRCwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgibmF0LW1ldGhvZCIsICJOQVQgTWV0aG9kIiwKKyAgICAgICAgICAiTWV0aG9kIHRvIHVzZSBmb3IgdHJhdmVyc2luZyBmaXJld2FsbHMgYW5kIE5BVCIsCisgICAgICAgICAgR1NUX1RZUEVfUlRTUF9OQVRfTUVUSE9ELCBERUZBVUxUX05BVF9NRVRIT0QsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFJUU1BTcmM6ZG8tcnRjcDoKKyAgICoKKyAgICogRW5hYmxlIFJUQ1Agc3VwcG9ydC4gU29tZSBvbGQgc2VydmVyIGRvbid0IGxpa2UgUlRDUCBhbmQgdGhlbiB0aGlzIHByb3BlcnR5CisgICAqIG5lZWRzIHRvIGJlIHNldCB0byBGQUxTRS4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRE9fUlRDUCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZG8tcnRjcCIsICJEbyBSVENQIiwKKyAgICAgICAgICAiU2VuZCBSVENQIHBhY2tldHMsIGRpc2FibGUgZm9yIG9sZCBpbmNvbXBhdGlibGUgc2VydmVyLiIsCisgICAgICAgICAgREVGQVVMVF9ET19SVENQLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UlRTUFNyYzpkby1ydHNwLWtlZXAtYWxpdmU6CisgICAqCisgICAqIEVuYWJsZSBSVFNQIGtlZXAgYWxpdmUgc3VwcG9ydC4gU29tZSBvbGQgc2VydmVyIGRvbid0IGxpa2UgUlRTUAorICAgKiBrZWVwIGFsaXZlIGFuZCB0aGVuIHRoaXMgcHJvcGVydHkgbmVlZHMgdG8gYmUgc2V0IHRvIEZBTFNFLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ET19SVFNQX0tFRVBfQUxJVkUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImRvLXJ0c3Ata2VlcC1hbGl2ZSIsICJEbyBSVFNQIEtlZXAgQWxpdmUiLAorICAgICAgICAgICJTZW5kIFJUU1Aga2VlcCBhbGl2ZSBwYWNrZXRzLCBkaXNhYmxlIGZvciBvbGQgaW5jb21wYXRpYmxlIHNlcnZlci4iLAorICAgICAgICAgIERFRkFVTFRfRE9fUlRTUF9LRUVQX0FMSVZFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSVFNQU3JjOnByb3h5OgorICAgKgorICAgKiBTZXQgdGhlIHByb3h5IHBhcmFtZXRlcnMuIFRoaXMgaGFzIHRvIGJlIGEgc3RyaW5nIG9mIHRoZSBmb3JtYXQKKyAgICogW2h0dHA6Ly9dW3VzZXI6cGFzc3dkQF1ob3N0Wzpwb3J0XS4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUFJPWFksCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgicHJveHkiLCAiUHJveHkiLAorICAgICAgICAgICJQcm94eSBzZXR0aW5ncyBmb3IgSFRUUCB0dW5uZWxpbmcuIEZvcm1hdDogW2h0dHA6Ly9dW3VzZXI6cGFzc3dkQF1ob3N0Wzpwb3J0XSIsCisgICAgICAgICAgREVGQVVMVF9QUk9YWSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RSVFNQU3JjOnByb3h5LWlkOgorICAgKgorICAgKiBTZXRzIHRoZSBwcm94eSBVUkkgdXNlciBpZCBmb3IgYXV0aGVudGljYXRpb24uIElmIHRoZSBVUkkgc2V0IHZpYSB0aGUKKyAgICogInByb3h5IiBwcm9wZXJ0eSBjb250YWlucyBhIHVzZXItaWQgYWxyZWFkeSwgdGhhdCB3aWxsIHRha2UgcHJlY2VkZW5jZS4KKyAgICoKKyAgICogU2luY2U6IDEuMgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QUk9YWV9JRCwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJwcm94eS1pZCIsICJwcm94eS1pZCIsCisgICAgICAgICAgIkhUVFAgcHJveHkgVVJJIHVzZXIgaWQgZm9yIGF1dGhlbnRpY2F0aW9uIiwgIiIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RSVFNQU3JjOnByb3h5LXB3OgorICAgKgorICAgKiBTZXRzIHRoZSBwcm94eSBVUkkgcGFzc3dvcmQgZm9yIGF1dGhlbnRpY2F0aW9uLiBJZiB0aGUgVVJJIHNldCB2aWEgdGhlCisgICAqICJwcm94eSIgcHJvcGVydHkgY29udGFpbnMgYSBwYXNzd29yZCBhbHJlYWR5LCB0aGF0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLgorICAgKgorICAgKiBTaW5jZTogMS4yCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BST1hZX1BXLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInByb3h5LXB3IiwgInByb3h5LXB3IiwKKyAgICAgICAgICAiSFRUUCBwcm94eSBVUkkgdXNlciBwYXNzd29yZCBmb3IgYXV0aGVudGljYXRpb24iLCAiIiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UlRTUFNyYzpydHAtYmxvY2tzaXplOgorICAgKgorICAgKiBSVFAgcGFja2FnZSBzaXplIHRvIHN1Z2dlc3QgdG8gc2VydmVyLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9SVFBfQkxPQ0tTSVpFLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJydHAtYmxvY2tzaXplIiwgIlJUUCBCbG9ja3NpemUiLAorICAgICAgICAgICJSVFAgcGFja2FnZSBzaXplIHRvIHN1Z2dlc3QgdG8gc2VydmVyICgwID0gZGlzYWJsZWQpIiwKKyAgICAgICAgICAwLCA2NTUzNiwgREVGQVVMVF9SVFBfQkxPQ0tTSVpFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1VTRVJfSUQsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgidXNlci1pZCIsICJ1c2VyLWlkIiwKKyAgICAgICAgICAiUlRTUCBsb2NhdGlvbiBVUkkgdXNlciBpZCBmb3IgYXV0aGVudGljYXRpb24iLCBERUZBVUxUX1VTRVJfSUQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVVNFUl9QVywKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJ1c2VyLXB3IiwgInVzZXItcHciLAorICAgICAgICAgICJSVFNQIGxvY2F0aW9uIFVSSSB1c2VyIHBhc3N3b3JkIGZvciBhdXRoZW50aWNhdGlvbiIsIERFRkFVTFRfVVNFUl9QVywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UlRTUFNyYzpidWZmZXItbW9kZToKKyAgICoKKyAgICogQ29udHJvbCB0aGUgYnVmZmVyaW5nIGFuZCB0aW1lc3RhbXBpbmcgbW9kZSB1c2VkIGJ5IHRoZSBqaXR0ZXJidWZmZXIuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0JVRkZFUl9NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJidWZmZXItbW9kZSIsICJCdWZmZXIgTW9kZSIsCisgICAgICAgICAgIkNvbnRyb2wgdGhlIGJ1ZmZlcmluZyBhbGdvcml0aG0gaW4gdXNlIiwKKyAgICAgICAgICBHU1RfVFlQRV9SVFNQX1NSQ19CVUZGRVJfTU9ERSwgREVGQVVMVF9CVUZGRVJfTU9ERSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UlRTUFNyYzpwb3J0LXJhbmdlOgorICAgKgorICAgKiBDb25maWd1cmUgdGhlIGNsaWVudCBwb3J0IG51bWJlcnMgdGhhdCBjYW4gYmUgdXNlZCB0byByZWNpZXZlIFJUUCBhbmQKKyAgICogUlRDUC4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUE9SVF9SQU5HRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJwb3J0LXJhbmdlIiwgIlBvcnQgcmFuZ2UiLAorICAgICAgICAgICJDbGllbnQgcG9ydCByYW5nZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlY2VpdmUgUlRQIGFuZCBSVENQIGRhdGEsICIKKyAgICAgICAgICAiZWcuIDMwMDAtMzAwNSAoTlVMTCA9IG5vIHJlc3RyaWN0aW9ucykiLCBERUZBVUxUX1BPUlRfUkFOR0UsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFJUU1BTcmM6dWRwLWJ1ZmZlci1zaXplOgorICAgKgorICAgKiBTaXplIG9mIHRoZSBrZXJuZWwgVURQIHJlY2VpdmUgYnVmZmVyIGluIGJ5dGVzLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9VRFBfQlVGRkVSX1NJWkUsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgidWRwLWJ1ZmZlci1zaXplIiwgIlVEUCBCdWZmZXIgU2l6ZSIsCisgICAgICAgICAgIlNpemUgb2YgdGhlIGtlcm5lbCBVRFAgcmVjZWl2ZSBidWZmZXIgaW4gYnl0ZXMsIDA9ZGVmYXVsdCIsCisgICAgICAgICAgMCwgR19NQVhJTlQsIERFRkFVTFRfVURQX0JVRkZFUl9TSVpFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSVFNQU3JjOnNob3J0LWhlYWRlcjoKKyAgICoKKyAgICogT25seSBzZW5kIHRoZSBiYXNpYyBSVFNQIGhlYWRlcnMgZm9yIGJyb2tlbiBlbmNvZGVycy4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU0hPUlRfSEVBREVSLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzaG9ydC1oZWFkZXIiLCAiU2hvcnQgSGVhZGVyIiwKKyAgICAgICAgICAiT25seSBzZW5kIHRoZSBiYXNpYyBSVFNQIGhlYWRlcnMgZm9yIGJyb2tlbiBlbmNvZGVycyIsCisgICAgICAgICAgREVGQVVMVF9TSE9SVF9IRUFERVIsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUFJPQkFUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJwcm9iYXRpb24iLCAiTnVtYmVyIG9mIHByb2JhdGlvbnMiLAorICAgICAgICAgICJDb25zZWN1dGl2ZSBwYWNrZXQgc2VxdWVuY2UgbnVtYmVycyB0byBhY2NlcHQgdGhlIHNvdXJjZSIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCBERUZBVUxUX1BST0JBVElPTiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1VEUF9SRUNPTk5FQ1QsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInVkcC1yZWNvbm5lY3QiLCAiUmVjb25uZWN0IHRvIHRoZSBzZXJ2ZXIiLAorICAgICAgICAgICJSZWNvbm5lY3QgdG8gdGhlIHNlcnZlciBpZiBSVFNQIGNvbm5lY3Rpb24gaXMgY2xvc2VkIHdoZW4gZG9pbmcgVURQIiwKKyAgICAgICAgICBERUZBVUxUX1VEUF9SRUNPTk5FQ1QsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTVVMVElDQVNUX0lGQUNFLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoIm11bHRpY2FzdC1pZmFjZSIsICJNdWx0aWNhc3QgSW50ZXJmYWNlIiwKKyAgICAgICAgICAiVGhlIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIHRvIGpvaW4gdGhlIG11bHRpY2FzdCBncm91cCIsCisgICAgICAgICAgREVGQVVMVF9NVUxUSUNBU1RfSUZBQ0UsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTlRQX1NZTkMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoIm50cC1zeW5jIiwgIlN5bmMgb24gTlRQIGNsb2NrIiwKKyAgICAgICAgICAiU3luY2hyb25pemUgcmVjZWl2ZWQgc3RyZWFtcyB0byB0aGUgTlRQIGNsb2NrIiwgREVGQVVMVF9OVFBfU1lOQywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1VTRV9QSVBFTElORV9DTE9DSywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgidXNlLXBpcGVsaW5lLWNsb2NrIiwgIlVzZSBwaXBlbGluZSBjbG9jayIsCisgICAgICAgICAgIlVzZSB0aGUgcGlwZWxpbmUgcnVubmluZy10aW1lIHRvIHNldCB0aGUgTlRQIHRpbWUgaW4gdGhlIFJUQ1AgU1IgbWVzc2FnZXMiCisgICAgICAgICAgIihERVBSRUNBVEVEOiBVc2UgbnRwLXRpbWUtc291cmNlIHByb3BlcnR5KSIsCisgICAgICAgICAgREVGQVVMVF9VU0VfUElQRUxJTkVfQ0xPQ0ssCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR19QQVJBTV9ERVBSRUNBVEVEKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TREVTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgic2RlcyIsICJTREVTIiwKKyAgICAgICAgICAiVGhlIFNERVMgaXRlbXMgb2YgdGhpcyBzZXNzaW9uIiwKKyAgICAgICAgICBHU1RfVFlQRV9TVFJVQ1RVUkUsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSVFNQU3JjOjp0bHMtdmFsaWRhdGlvbi1mbGFnczoKKyAgICoKKyAgICogVExTIGNlcnRpZmljYXRlIHZhbGlkYXRpb24gZmxhZ3MgdXNlZCB0byB2YWxpZGF0ZSBzZXJ2ZXIKKyAgICogY2VydGlmaWNhdGUuCisgICAqCisgICAqIFNpbmNlOiAxLjIuMQorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UTFNfVkFMSURBVElPTl9GTEFHUywKKyAgICAgIGdfcGFyYW1fc3BlY19mbGFncyAoInRscy12YWxpZGF0aW9uLWZsYWdzIiwgIlRMUyB2YWxpZGF0aW9uIGZsYWdzIiwKKyAgICAgICAgICAiVExTIGNlcnRpZmljYXRlIHZhbGlkYXRpb24gZmxhZ3MgdXNlZCB0byB2YWxpZGF0ZSB0aGUgc2VydmVyIGNlcnRpZmljYXRlIiwKKyAgICAgICAgICBHX1RZUEVfVExTX0NFUlRJRklDQVRFX0ZMQUdTLCBERUZBVUxUX1RMU19WQUxJREFUSU9OX0ZMQUdTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSVFNQU3JjOjp0bHMtZGF0YWJhc2U6CisgICAqCisgICAqIFRMUyBkYXRhYmFzZSB3aXRoIGFuY2hvciBjZXJ0aWZpY2F0ZSBhdXRob3JpdGllcyB1c2VkIHRvIHZhbGlkYXRlCisgICAqIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUuCisgICAqCisgICAqIFNpbmNlOiAxLjQKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVExTX0RBVEFCQVNFLAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInRscy1kYXRhYmFzZSIsICJUTFMgZGF0YWJhc2UiLAorICAgICAgICAgICJUTFMgZGF0YWJhc2Ugd2l0aCBhbmNob3IgY2VydGlmaWNhdGUgYXV0aG9yaXRpZXMgdXNlZCB0byB2YWxpZGF0ZSB0aGUgc2VydmVyIGNlcnRpZmljYXRlIiwKKyAgICAgICAgICBHX1RZUEVfVExTX0RBVEFCQVNFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UlRTUFNyYzo6dGxzLWludGVyYWN0aW9uOgorICAgKgorICAgKiBBICNHVGxzSW50ZXJhY3Rpb24gb2JqZWN0IHRvIGJlIHVzZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBvciBjZXJ0aWZpY2F0ZQorICAgKiBkYXRhYmFzZSBuZWVkIHRvIGludGVyYWN0IHdpdGggdGhlIHVzZXIuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIHByb21wdCB0aGUKKyAgICogdXNlciBmb3IgcGFzc3dvcmRzIHdoZXJlIG5lY2Vzc2FyeS4KKyAgICoKKyAgICogU2luY2U6IDEuNgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UTFNfSU5URVJBQ1RJT04sCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgidGxzLWludGVyYWN0aW9uIiwgIlRMUyBpbnRlcmFjdGlvbiIsCisgICAgICAgICAgIkEgR1Rsc0ludGVyYWN0aW9uIG9iamVjdCB0byBwcm9tdCB0aGUgdXNlciBmb3IgcGFzc3dvcmQgb3IgY2VydGlmaWNhdGUiLAorICAgICAgICAgIEdfVFlQRV9UTFNfSU5URVJBQ1RJT04sIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSVFNQU3JjOjpkby1yZXRyYW5zbWlzc2lvbjoKKyAgICoKKyAgICogQXR0ZW1wdCB0byBhc2sgdGhlIHNlcnZlciB0byByZXRyYW5zbWl0IGxvc3QgcGFja2V0cyBhY2NvcmRpbmcgdG8gUkZDNDU4OC4KKyAgICoKKyAgICogTm90ZTogY3VycmVudGx5IG9ubHkgd29ya3Mgd2l0aCBTU1JDLW11bHRpcGxleGVkIHJldHJhbnNtaXNzaW9uIHN0cmVhbXMKKyAgICoKKyAgICogU2luY2U6IDEuNgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ET19SRVRSQU5TTUlTU0lPTiwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZG8tcmV0cmFuc21pc3Npb24iLCAiUmV0cmFuc21pc3Npb24iLAorICAgICAgICAgICJBc2sgdGhlIHNlcnZlciB0byByZXRyYW5zbWl0IGxvc3QgcGFja2V0cyIsCisgICAgICAgICAgREVGQVVMVF9ET19SRVRSQU5TTUlTU0lPTiwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0UlRTUFNyYzo6bnRwLXRpbWUtc291cmNlOgorICAgKgorICAgKiBhbGxvd3MgdG8gc2VsZWN0IHRoZSB0aW1lIHNvdXJjZSB0aGF0IHNob3VsZCBiZSB1c2VkCisgICAqIGZvciB0aGUgTlRQIHRpbWUgaW4gUlRDUCBwYWNrZXRzCisgICAqCisgICAqIFNpbmNlOiAxLjYKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTlRQX1RJTUVfU09VUkNFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJudHAtdGltZS1zb3VyY2UiLCAiTlRQIFRpbWUgU291cmNlIiwKKyAgICAgICAgICAiTlRQIHRpbWUgc291cmNlIGZvciBSVENQIHBhY2tldHMiLAorICAgICAgICAgIEdTVF9UWVBFX1JUU1BfU1JDX05UUF9USU1FX1NPVVJDRSwgREVGQVVMVF9OVFBfVElNRV9TT1VSQ0UsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFJUU1BTcmM6OnVzZXItYWdlbnQ6CisgICAqCisgICAqIFRoZSBzdHJpbmcgdG8gc2V0IGluIHRoZSBVc2VyLUFnZW50IGhlYWRlci4KKyAgICoKKyAgICogU2luY2U6IDEuNgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9VU0VSX0FHRU5ULAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInVzZXItYWdlbnQiLCAiVXNlciBBZ2VudCIsCisgICAgICAgICAgIlRoZSBVc2VyLUFnZW50IHN0cmluZyB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIiLAorICAgICAgICAgIERFRkFVTFRfVVNFUl9BR0VOVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoIm1heC1ydGNwLXJ0cC10aW1lLWRpZmYiLCAiTWF4IFJUQ1AgUlRQIFRpbWUgRGlmZiIsCisgICAgICAgICAgIk1heGltdW0gYW1vdW50IG9mIHRpbWUgaW4gbXMgdGhhdCB0aGUgUlRQIHRpbWUgaW4gUlRDUCBTUnMgIgorICAgICAgICAgICJpcyBhbGxvd2VkIHRvIGJlIGFoZWFkICgtMSBkaXNhYmxlZCkiLCAtMSwgR19NQVhJTlQsCisgICAgICAgICAgREVGQVVMVF9NQVhfUlRDUF9SVFBfVElNRV9ESUZGLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkZDNzI3M19TWU5DLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJyZmM3MjczLXN5bmMiLCAiU3luYyBvbiBSRkM3MjczIGNsb2NrIiwKKyAgICAgICAgICAiU3luY2hyb25pemUgcmVjZWl2ZWQgc3RyZWFtcyB0byB0aGUgUkZDNzI3MyBjbG9jayAiCisgICAgICAgICAgIihyZXF1aXJlcyBjbG9jayBhbmQgb2Zmc2V0IHRvIGJlIHByb3ZpZGVkKSIsIERFRkFVTFRfUkZDNzI3M19TWU5DLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSVFNQU3JjOmRlZmF1bHQtcnRzcC12ZXJzaW9uOgorICAgKgorICAgKiBUaGUgcHJlZmVycmVkIFJUU1AgdmVyc2lvbiB0byB1c2Ugd2hpbGUgbmVnb3RpYXRpbmcgdGhlIHZlcnNpb24gd2l0aCB0aGUgc2VydmVyLgorICAgKgorICAgKiBTaW5jZTogMS4xNAorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ERUZBVUxUX1ZFUlNJT04sCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoImRlZmF1bHQtcnRzcC12ZXJzaW9uIiwKKyAgICAgICAgICAiVGhlIFJUU1AgdmVyc2lvbiB0byB0cnkgZmlyc3QiLAorICAgICAgICAgICJUaGUgUlRTUCB2ZXJzaW9uIHRoYXQgc2hvdWxkIGJlIHRyaWVkIGZpcnN0IHdoZW4gbmVnb3RpYXRpbmcgdmVyc2lvbi4iLAorICAgICAgICAgIEdTVF9UWVBFX1JUU1BfVkVSU0lPTiwgREVGQVVMVF9WRVJTSU9OLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RSVFNQU3JjOm1heC10cy1vZmZzZXQtYWRqdXN0bWVudDoKKyAgICoKKyAgICogU3luY2luZyB0aW1lIHN0YW1wcyB0byBOVFAgdGltZSBhZGRzIGEgdGltZSBvZmZzZXQuIFRoaXMgcGFyYW1ldGVyCisgICAqIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbmFub3NlY29uZHMgcGVyIGZyYW1lIHRoYXQgdGhpcyB0aW1lIG9mZnNldAorICAgKiBtYXkgYmUgYWRqdXN0ZWQgd2l0aC4gVGhpcyBpcyB1c2VkIHRvIGF2b2lkIHN1ZGRlbiBsYXJnZSBjaGFuZ2VzIHRvIHRpbWUKKyAgICogc3RhbXBzLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NQVhfVFNfT0ZGU0VUX0FESlVTVE1FTlQsCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgibWF4LXRzLW9mZnNldC1hZGp1c3RtZW50IiwKKyAgICAgICAgICAiTWF4IFRpbWVzdGFtcCBPZmZzZXQgQWRqdXN0bWVudCIsCisgICAgICAgICAgIlRoZSBtYXhpbXVtIG51bWJlciBvZiBuYW5vc2Vjb25kcyBwZXIgZnJhbWUgdGhhdCB0aW1lIHN0YW1wIG9mZnNldHMgIgorICAgICAgICAgICJtYXkgYmUgYWRqdXN0ZWQgKDAgPSBubyBsaW1pdCkuIiwgMCwgR19NQVhVSU5UNjQsCisgICAgICAgICAgREVGQVVMVF9NQVhfVFNfT0ZGU0VUX0FESlVTVE1FTlQsIEdfUEFSQU1fUkVBRFdSSVRFIHwKKyAgICAgICAgICBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFJ0cEJpbjptYXgtdHMtb2Zmc2V0OgorICAgKgorICAgKiBVc2VkIHRvIHNldCBhbiB1cHBlciBsaW1pdCBvZiBob3cgbGFyZ2UgYSB0aW1lIG9mZnNldCBtYXkgYmUuIFRoaXMKKyAgICogaXMgdXNlZCB0byBwcm90ZWN0IGFnYWluc3QgdW5yZWFsaXN0aWMgdmFsdWVzIGFzIGEgcmVzdWx0IG9mIGVpdGhlcgorICAgKiBjbGllbnQsc2VydmVyIG9yIGNsb2NrIGlzc3Vlcy4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUFYX1RTX09GRlNFVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQ2NCAoIm1heC10cy1vZmZzZXQiLCAiTWF4IFRTIE9mZnNldCIsCisgICAgICAgICAgIlRoZSBtYXhpbXVtIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0aW1lIG9mZnNldCBpbiAobmFub3NlY29uZHMpLiAiCisgICAgICAgICAgIk5vdGUsIGlmIHRoZSBudHAtc3luYyBwYXJhbWV0ZXIgaXMgc2V0IHRoZSBkZWZhdWx0IHZhbHVlIGlzICIKKyAgICAgICAgICAiY2hhbmdlZCB0byAwIChubyBsaW1pdCkiLCAwLCBHX01BWElOVDY0LCBERUZBVUxUX01BWF9UU19PRkZTRVQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFJUU1BTcmM6OmhhbmRsZS1yZXF1ZXN0OgorICAgKiBAcnRzcHNyYzogYSAjR3N0UlRTUFNyYworICAgKiBAcmVxdWVzdDogYSAjR3N0UlRTUE1lc3NhZ2UKKyAgICogQHJlc3BvbnNlOiBhICNHc3RSVFNQTWVzc2FnZQorICAgKgorICAgKiBIYW5kbGUgYSBzZXJ2ZXIgcmVxdWVzdCBpbiBAcmVxdWVzdCBhbmQgcHJlcGFyZSBAcmVzcG9uc2UuCisgICAqCisgICAqIFRoaXMgc2lnbmFsIGlzIGNhbGxlZCBmcm9tIHRoZSBzdHJlYW1pbmcgdGhyZWFkLCB5b3Ugc2hvdWxkIHRoZXJlZm9yZSBub3QKKyAgICogZG8gYW55IHN0YXRlIGNoYW5nZXMgb24gQHJ0c3BzcmMgYmVjYXVzZSB0aGlzIG1pZ2h0IGRlYWRsb2NrLiBJZiB5b3Ugd2FudAorICAgKiB0byBtb2RpZnkgdGhlIHN0YXRlIGFzIGEgcmVzdWx0IG9mIHRoaXMgc2lnbmFsLCBwb3N0IGEKKyAgICogI0dTVF9NRVNTQUdFX1JFUVVFU1RfU1RBVEUgbWVzc2FnZSBvbiB0aGUgYnVzIG9yIHNpZ25hbCB0aGUgbWFpbiB0aHJlYWQKKyAgICogaW4gc29tZSBvdGhlciB3YXkuCisgICAqCisgICAqIFNpbmNlOiAxLjIKKyAgICovCisgIGdzdF9ydHNwc3JjX3NpZ25hbHNbU0lHTkFMX0hBTkRMRV9SRVFVRVNUXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJoYW5kbGUtcmVxdWVzdCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksIDAsCisgICAgICAwLCBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDIsCisgICAgICBHX1RZUEVfUE9JTlRFUiwgR19UWVBFX1BPSU5URVIpOworCisgIC8qKgorICAgKiBHc3RSVFNQU3JjOjpvbi1zZHA6CisgICAqIEBydHNwc3JjOiBhICNHc3RSVFNQU3JjCisgICAqIEBzZHA6IGEgI0dzdFNEUE1lc3NhZ2UKKyAgICoKKyAgICogRW1pdGVkIHdoZW4gdGhlIGNsaWVudCBoYXMgcmV0cmlldmVkIHRoZSBTRFAgYW5kIGJlZm9yZSBpdCBjb25maWd1cmVzIHRoZQorICAgKiBzdHJlYW1zIGluIHRoZSBTRFAuIEBzZHAgY2FuIGJlIGluc3BlY3RlZCBhbmQgbW9kaWZpZWQuCisgICAqCisgICAqIFRoaXMgc2lnbmFsIGlzIGNhbGxlZCBmcm9tIHRoZSBzdHJlYW1pbmcgdGhyZWFkLCB5b3Ugc2hvdWxkIHRoZXJlZm9yZSBub3QKKyAgICogZG8gYW55IHN0YXRlIGNoYW5nZXMgb24gQHJ0c3BzcmMgYmVjYXVzZSB0aGlzIG1pZ2h0IGRlYWRsb2NrLiBJZiB5b3Ugd2FudAorICAgKiB0byBtb2RpZnkgdGhlIHN0YXRlIGFzIGEgcmVzdWx0IG9mIHRoaXMgc2lnbmFsLCBwb3N0IGEKKyAgICogI0dTVF9NRVNTQUdFX1JFUVVFU1RfU1RBVEUgbWVzc2FnZSBvbiB0aGUgYnVzIG9yIHNpZ25hbCB0aGUgbWFpbiB0aHJlYWQKKyAgICogaW4gc29tZSBvdGhlciB3YXkuCisgICAqCisgICAqIFNpbmNlOiAxLjIKKyAgICovCisgIGdzdF9ydHNwc3JjX3NpZ25hbHNbU0lHTkFMX09OX1NEUF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgib24tc2RwIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwgMCwKKyAgICAgIDAsIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMSwKKyAgICAgIEdTVF9UWVBFX1NEUF9NRVNTQUdFIHwgR19TSUdOQUxfVFlQRV9TVEFUSUNfU0NPUEUpOworCisgIC8qKgorICAgKiBHc3RSVFNQU3JjOjpzZWxlY3Qtc3RyZWFtOgorICAgKiBAcnRzcHNyYzogYSAjR3N0UlRTUFNyYworICAgKiBAbnVtOiB0aGUgc3RyZWFtIG51bWJlcgorICAgKiBAY2FwczogdGhlIHN0cmVhbSBjYXBzCisgICAqCisgICAqIEVtaXRlZCBiZWZvcmUgdGhlIGNsaWVudCBkZWNpZGVzIHRvIGNvbmZpZ3VyZSB0aGUgc3RyZWFtIEBudW0gd2l0aAorICAgKiBAY2Fwcy4KKyAgICoKKyAgICogUmV0dXJuczogJVRSVUUgd2hlbiB0aGUgc3RyZWFtIHNob3VsZCBiZSBzZWxlY3RlZCwgJUZBTFNFIHdoZW4gdGhlIHN0cmVhbQorICAgKiBpcyB0byBiZSBpZ25vcmVkLgorICAgKgorICAgKiBTaW5jZTogMS4yCisgICAqLworICBnc3RfcnRzcHNyY19zaWduYWxzW1NJR05BTF9TRUxFQ1RfU1RSRUFNXSA9CisgICAgICBnX3NpZ25hbF9uZXdfY2xhc3NfaGFuZGxlciAoInNlbGVjdC1zdHJlYW0iLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0ZJUlNUIHwgR19TSUdOQUxfUlVOX0NMRUFOVVAsCisgICAgICAoR0NhbGxiYWNrKSBkZWZhdWx0X3NlbGVjdF9zdHJlYW0sIHNlbGVjdF9zdHJlYW1fYWNjdW0sIE5VTEwsCisgICAgICBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX0JPT0xFQU4sIDIsIEdfVFlQRV9VSU5ULAorICAgICAgR1NUX1RZUEVfQ0FQUyk7CisgIC8qKgorICAgKiBHc3RSVFNQU3JjOjpuZXctbWFuYWdlcjoKKyAgICogQHJ0c3BzcmM6IGEgI0dzdFJUU1BTcmMKKyAgICogQG1hbmFnZXI6IGEgI0dzdEVsZW1lbnQKKyAgICoKKyAgICogRW1pdGVkIGFmdGVyIGEgbmV3IG1hbmFnZXIgKGxpa2UgcnRwYmluKSB3YXMgY3JlYXRlZCBhbmQgdGhlIGRlZmF1bHQKKyAgICogcHJvcGVydGllcyB3ZXJlIGNvbmZpZ3VyZWQuCisgICAqCisgICAqIFNpbmNlOiAxLjQKKyAgICovCisgIGdzdF9ydHNwc3JjX3NpZ25hbHNbU0lHTkFMX05FV19NQU5BR0VSXSA9CisgICAgICBnX3NpZ25hbF9uZXdfY2xhc3NfaGFuZGxlciAoIm5ldy1tYW5hZ2VyIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9GSVJTVCB8IEdfU0lHTkFMX1JVTl9DTEVBTlVQLCAwLCBOVUxMLCBOVUxMLAorICAgICAgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAxLCBHU1RfVFlQRV9FTEVNRU5UKTsKKworICAvKioKKyAgICogR3N0UlRTUFNyYzo6cmVxdWVzdC1ydGNwLWtleToKKyAgICogQHJ0c3BzcmM6IGEgI0dzdFJUU1BTcmMKKyAgICogQG51bTogdGhlIHN0cmVhbSBudW1iZXIKKyAgICoKKyAgICogU2lnbmFsIGVtaXRlZCB0byBnZXQgdGhlIGNyeXB0byBwYXJhbWV0ZXJzIHJlbGV2YW50IHRvIHRoZSBSVENQCisgICAqIHN0cmVhbS4gVXNlciBzaG91bGQgcHJvdmlkZSB0aGUga2V5IGFuZCB0aGUgUlRDUCBlbmNyeXB0aW9uIGNpcGhlcnMKKyAgICogYW5kIGF1dGhlbnRpY2F0aW9uLCBhbmQgcmV0dXJuIHRoZW0gd3JhcHBlZCBpbiBhIEdzdENhcHMuCisgICAqCisgICAqIFNpbmNlOiAxLjQKKyAgICovCisgIGdzdF9ydHNwc3JjX3NpZ25hbHNbU0lHTkFMX1JFUVVFU1RfUlRDUF9LRVldID0KKyAgICAgIGdfc2lnbmFsX25ldyAoInJlcXVlc3QtcnRjcC1rZXkiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIEdTVF9UWVBFX0NBUFMsIDEsIEdfVFlQRV9VSU5UKTsKKworICAvKioKKyAgICogR3N0UlRTUFNyYzo6YWNjZXB0LWNlcnRpZmljYXRlOgorICAgKiBAcnRzcHNyYzogYSAjR3N0UlRTUFNyYworICAgKiBAcGVlcl9jZXJ0OiB0aGUgcGVlcidzICNHVGxzQ2VydGlmaWNhdGUKKyAgICogQGVycm9yczogdGhlIHByb2JsZW1zIHdpdGggQHBlZXJfY2VydAorICAgKiBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgc2V0IHdoZW4gdGhlIHNpZ25hbCBoYW5kbGVyIHdhcyBjb25uZWN0ZWQuCisgICAqCisgICAqIFRoaXMgd2lsbCBkaXJlY3RseSBtYXAgdG8gI0dUbHNDb25uZWN0aW9uICdzICJhY2NlcHQtY2VydGlmaWNhdGUiCisgICAqIHNpZ25hbCBhbmQgYmUgcGVyZm9ybWVkIGFmdGVyIHRoZSBkZWZhdWx0IGNoZWNrcyBvZiAjR3N0UlRTUENvbm5lY3Rpb24KKyAgICogKGNoZWNraW5nIGFnYWluc3QgdGhlICNHVGxzRGF0YWJhc2Ugd2l0aCB0aGUgZ2l2ZW4gI0dUbHNDZXJ0aWZpY2F0ZUZsYWdzKQorICAgKiBoYXZlIGZhaWxlZC4gSWYgbm8gI0dUbHNEYXRhYmFzZSBpcyBzZXQgb24gdGhpcyBjb25uZWN0aW9uLCBvbmx5IHRoaXMKKyAgICogc2lnbmFsIHdpbGwgYmUgZW1pdHRlZC4KKyAgICoKKyAgICogU2luY2U6IDEuMTQKKyAgICovCisgIGdzdF9ydHNwc3JjX3NpZ25hbHNbU0lHTkFMX0FDQ0VQVF9DRVJUSUZJQ0FURV0gPQorICAgICAgZ19zaWduYWxfbmV3ICgiYWNjZXB0LWNlcnRpZmljYXRlIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULCAwLCBnX3NpZ25hbF9hY2N1bXVsYXRvcl90cnVlX2hhbmRsZWQsIE5VTEwsIE5VTEwsCisgICAgICBHX1RZUEVfQk9PTEVBTiwgMywgR19UWVBFX1RMU19DT05ORUNUSU9OLCBHX1RZUEVfVExTX0NFUlRJRklDQVRFLAorICAgICAgR19UWVBFX1RMU19DRVJUSUZJQ0FURV9GTEFHUyk7CisKKyAgLyoKKyAgICogR3N0UlRTUFNyYzo6YmVmb3JlLXNlbmQKKyAgICogQHJ0c3BzcmM6IGEgI0dzdFJUU1BTcmMKKyAgICogQG51bTogdGhlIHN0cmVhbSBudW1iZXIKKyAgICoKKyAgICogRW1pdHRlZCBiZWZvcmUgZWFjaCBSVFNQIHJlcXVlc3QgaXMgc2VudCwgaW4gb3JkZXIgdG8gYWxsb3cKKyAgICogdGhlIGFwcGxpY2F0aW9uIHRvIG1vZGlmeSBzZW5kIHBhcmFtZXRlcnMgb3IgdG8gc2tpcCB0aGUgbWVzc2FnZSBlbnRpcmVseS4KKyAgICogVGhpcyBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHdvcmsgd2l0aCBPTlZJRiBQcm9maWxlIEcgc2VydmVycywKKyAgICogd2hpY2ggbmVlZCBhIGRpZmZlcmVudC9hZGRpdGlvbmFsIHJhbmdlLCByYXRlLWNvbnRyb2wsIGFuZCBpbnRyYS94CisgICAqIHBhcmFtZXRlcnMuCisgICAqCisgICAqIFJldHVybnM6ICVUUlVFIHdoZW4gdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHNlbnQsICVGQUxTRSB3aGVuIHRoZQorICAgKiBjb21tYW5kIHNob3VsZCBiZSBkcm9wcGVkLgorICAgKgorICAgKiBTaW5jZTogMS4xNAorICAgKi8KKyAgZ3N0X3J0c3BzcmNfc2lnbmFsc1tTSUdOQUxfQkVGT1JFX1NFTkRdID0KKyAgICAgIGdfc2lnbmFsX25ld19jbGFzc19oYW5kbGVyICgiYmVmb3JlLXNlbmQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0ZJUlNUIHwgR19TSUdOQUxfUlVOX0NMRUFOVVAsCisgICAgICAoR0NhbGxiYWNrKSBkZWZhdWx0X2JlZm9yZV9zZW5kLCBiZWZvcmVfc2VuZF9hY2N1bSwgTlVMTCwKKyAgICAgIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfQk9PTEVBTiwKKyAgICAgIDEsIEdTVF9UWVBFX1JUU1BfTUVTU0FHRSB8IEdfU0lHTkFMX1RZUEVfU1RBVElDX1NDT1BFKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5zZW5kX2V2ZW50ID0gZ3N0X3J0c3BzcmNfc2VuZF9ldmVudDsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+cHJvdmlkZV9jbG9jayA9IGdzdF9ydHNwc3JjX3Byb3ZpZGVfY2xvY2s7CisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF9ydHNwc3JjX2NoYW5nZV9zdGF0ZTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnJ0cHRlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlJUU1AgcGFja2V0IHJlY2VpdmVyIiwgIlNvdXJjZS9OZXR3b3JrIiwKKyAgICAgICJSZWNlaXZlIGRhdGEgb3ZlciB0aGUgbmV0d29yayB2aWEgUlRTUCAoUkZDIDIzMjYpIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPiwgIgorICAgICAgIlRoaWpzIFZlcm1laXIgPHRoaWpzLnZlcm1laXJAYmFyY28uY29tPiwgIgorICAgICAgIkx1dHogTXVlbGxlciA8bHV0ekB0b3Bmcm9zZS5kZT4iKTsKKworICBnc3RiaW5fY2xhc3MtPmhhbmRsZV9tZXNzYWdlID0gZ3N0X3J0c3BzcmNfaGFuZGxlX21lc3NhZ2U7CisKKyAgZ3N0X3J0c3BfZXh0X2xpc3RfaW5pdCAoKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX2luaXQgKEdzdFJUU1BTcmMgKiBzcmMpCit7CisgIHNyYy0+Y29ubmluZm8ubG9jYXRpb24gPSBnX3N0cmR1cCAoREVGQVVMVF9MT0NBVElPTik7CisgIHNyYy0+cHJvdG9jb2xzID0gREVGQVVMVF9QUk9UT0NPTFM7CisgIHNyYy0+ZGVidWcgPSBERUZBVUxUX0RFQlVHOworICBzcmMtPnJldHJ5ID0gREVGQVVMVF9SRVRSWTsKKyAgc3JjLT51ZHBfdGltZW91dCA9IERFRkFVTFRfVElNRU9VVDsKKyAgZ3N0X3J0c3BzcmNfc2V0X3RjcF90aW1lb3V0IChzcmMsIERFRkFVTFRfVENQX1RJTUVPVVQpOworICBzcmMtPmxhdGVuY3kgPSBERUZBVUxUX0xBVEVOQ1lfTVM7CisgIHNyYy0+ZHJvcF9vbl9sYXRlbmN5ID0gREVGQVVMVF9EUk9QX09OX0xBVEVOQ1k7CisgIHNyYy0+Y29ubmVjdGlvbl9zcGVlZCA9IERFRkFVTFRfQ09OTkVDVElPTl9TUEVFRDsKKyAgc3JjLT5uYXRfbWV0aG9kID0gREVGQVVMVF9OQVRfTUVUSE9EOworICBzcmMtPmRvX3J0Y3AgPSBERUZBVUxUX0RPX1JUQ1A7CisgIHNyYy0+ZG9fcnRzcF9rZWVwX2FsaXZlID0gREVGQVVMVF9ET19SVFNQX0tFRVBfQUxJVkU7CisgIGdzdF9ydHNwc3JjX3NldF9wcm94eSAoc3JjLCBERUZBVUxUX1BST1hZKTsKKyAgc3JjLT5ydHBfYmxvY2tzaXplID0gREVGQVVMVF9SVFBfQkxPQ0tTSVpFOworICBzcmMtPnVzZXJfaWQgPSBnX3N0cmR1cCAoREVGQVVMVF9VU0VSX0lEKTsKKyAgc3JjLT51c2VyX3B3ID0gZ19zdHJkdXAgKERFRkFVTFRfVVNFUl9QVyk7CisgIHNyYy0+YnVmZmVyX21vZGUgPSBERUZBVUxUX0JVRkZFUl9NT0RFOworICBzcmMtPmNsaWVudF9wb3J0X3JhbmdlLm1pbiA9IDA7CisgIHNyYy0+Y2xpZW50X3BvcnRfcmFuZ2UubWF4ID0gMDsKKyAgc3JjLT51ZHBfYnVmZmVyX3NpemUgPSBERUZBVUxUX1VEUF9CVUZGRVJfU0laRTsKKyAgc3JjLT5zaG9ydF9oZWFkZXIgPSBERUZBVUxUX1NIT1JUX0hFQURFUjsKKyAgc3JjLT5wcm9iYXRpb24gPSBERUZBVUxUX1BST0JBVElPTjsKKyAgc3JjLT51ZHBfcmVjb25uZWN0ID0gREVGQVVMVF9VRFBfUkVDT05ORUNUOworICBzcmMtPm11bHRpX2lmYWNlID0gZ19zdHJkdXAgKERFRkFVTFRfTVVMVElDQVNUX0lGQUNFKTsKKyAgc3JjLT5udHBfc3luYyA9IERFRkFVTFRfTlRQX1NZTkM7CisgIHNyYy0+dXNlX3BpcGVsaW5lX2Nsb2NrID0gREVGQVVMVF9VU0VfUElQRUxJTkVfQ0xPQ0s7CisgIHNyYy0+c2RlcyA9IE5VTEw7CisgIHNyYy0+dGxzX3ZhbGlkYXRpb25fZmxhZ3MgPSBERUZBVUxUX1RMU19WQUxJREFUSU9OX0ZMQUdTOworICBzcmMtPnRsc19kYXRhYmFzZSA9IERFRkFVTFRfVExTX0RBVEFCQVNFOworICBzcmMtPnRsc19pbnRlcmFjdGlvbiA9IERFRkFVTFRfVExTX0lOVEVSQUNUSU9OOworICBzcmMtPmRvX3JldHJhbnNtaXNzaW9uID0gREVGQVVMVF9ET19SRVRSQU5TTUlTU0lPTjsKKyAgc3JjLT5udHBfdGltZV9zb3VyY2UgPSBERUZBVUxUX05UUF9USU1FX1NPVVJDRTsKKyAgc3JjLT51c2VyX2FnZW50ID0gZ19zdHJkdXAgKERFRkFVTFRfVVNFUl9BR0VOVCk7CisgIHNyYy0+bWF4X3J0Y3BfcnRwX3RpbWVfZGlmZiA9IERFRkFVTFRfTUFYX1JUQ1BfUlRQX1RJTUVfRElGRjsKKyAgc3JjLT5yZmM3MjczX3N5bmMgPSBERUZBVUxUX1JGQzcyNzNfU1lOQzsKKyAgc3JjLT5tYXhfdHNfb2Zmc2V0X2FkanVzdG1lbnQgPSBERUZBVUxUX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVDsKKyAgc3JjLT5tYXhfdHNfb2Zmc2V0ID0gREVGQVVMVF9NQVhfVFNfT0ZGU0VUOworICBzcmMtPm1heF90c19vZmZzZXRfaXNfc2V0ID0gRkFMU0U7CisgIHNyYy0+ZGVmYXVsdF92ZXJzaW9uID0gREVGQVVMVF9WRVJTSU9OOworICBzcmMtPnZlcnNpb24gPSBHU1RfUlRTUF9WRVJTSU9OX0lOVkFMSUQ7CisKKyAgLyogZ2V0IGEgbGlzdCBvZiBhbGwgZXh0ZW5zaW9ucyAqLworICBzcmMtPmV4dGVuc2lvbnMgPSBnc3RfcnRzcF9leHRfbGlzdF9nZXQgKCk7CisKKyAgLyogY29ubmVjdCB0byBzZW5kIHNpZ25hbCAqLworICBnc3RfcnRzcF9leHRfbGlzdF9jb25uZWN0IChzcmMtPmV4dGVuc2lvbnMsICJzZW5kIiwKKyAgICAgIChHQ2FsbGJhY2spIGdzdF9ydHNwc3JjX3NlbmRfY2IsIHNyYyk7CisKKyAgLyogcHJvdGVjdHMgdGhlIHN0cmVhbWluZyB0aHJlYWQgaW4gaW50ZXJsZWF2ZWQgbW9kZSBvciB0aGUgcG9sbGluZworICAgKiB0aHJlYWQgaW4gVURQIG1vZGUuICovCisgIGdfcmVjX211dGV4X2luaXQgKCZzcmMtPnN0cmVhbV9yZWNfbG9jayk7CisKKyAgLyogcHJvdGVjdHMgb3VyIHN0YXRlIGNoYW5nZXMgZnJvbSBtdWx0aXBsZSBpbnZvY2F0aW9ucyAqLworICBnX3JlY19tdXRleF9pbml0ICgmc3JjLT5zdGF0ZV9yZWNfbG9jayk7CisKKyAgc3JjLT5zdGF0ZSA9IEdTVF9SVFNQX1NUQVRFX0lOVkFMSUQ7CisKKyAgZ19tdXRleF9pbml0ICgmc3JjLT5jb25uaW5mby5zZW5kX2xvY2spOworICBnX211dGV4X2luaXQgKCZzcmMtPmNvbm5pbmZvLnJlY3ZfbG9jayk7CisKKyAgR1NUX09CSkVDVF9GTEFHX1NFVCAoc3JjLCBHU1RfRUxFTUVOVF9GTEFHX1NPVVJDRSk7CisgIGdzdF9iaW5fc2V0X3N1cHByZXNzZWRfZmxhZ3MgKEdTVF9CSU4gKHNyYyksCisgICAgICBHU1RfRUxFTUVOVF9GTEFHX1NPVVJDRSB8IEdTVF9FTEVNRU5UX0ZMQUdfU0lOSyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0UlRTUFNyYyAqcnRzcHNyYzsKKworICBydHNwc3JjID0gR1NUX1JUU1BTUkMgKG9iamVjdCk7CisKKyAgZ3N0X3J0c3BfZXh0X2xpc3RfZnJlZSAocnRzcHNyYy0+ZXh0ZW5zaW9ucyk7CisgIGdfZnJlZSAocnRzcHNyYy0+Y29ubmluZm8ubG9jYXRpb24pOworICBnc3RfcnRzcF91cmxfZnJlZSAocnRzcHNyYy0+Y29ubmluZm8udXJsKTsKKyAgZ19mcmVlIChydHNwc3JjLT5jb25uaW5mby51cmxfc3RyKTsKKyAgZ19mcmVlIChydHNwc3JjLT51c2VyX2lkKTsKKyAgZ19mcmVlIChydHNwc3JjLT51c2VyX3B3KTsKKyAgZ19mcmVlIChydHNwc3JjLT5tdWx0aV9pZmFjZSk7CisgIGdfZnJlZSAocnRzcHNyYy0+dXNlcl9hZ2VudCk7CisKKyAgaWYgKHJ0c3BzcmMtPnNkcCkgeworICAgIGdzdF9zZHBfbWVzc2FnZV9mcmVlIChydHNwc3JjLT5zZHApOworICAgIHJ0c3BzcmMtPnNkcCA9IE5VTEw7CisgIH0KKyAgaWYgKHJ0c3BzcmMtPnByb3ZpZGVkX2Nsb2NrKQorICAgIGdzdF9vYmplY3RfdW5yZWYgKHJ0c3BzcmMtPnByb3ZpZGVkX2Nsb2NrKTsKKworICBpZiAocnRzcHNyYy0+c2RlcykKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHJ0c3BzcmMtPnNkZXMpOworCisgIGlmIChydHNwc3JjLT50bHNfZGF0YWJhc2UpCisgICAgZ19vYmplY3RfdW5yZWYgKHJ0c3BzcmMtPnRsc19kYXRhYmFzZSk7CisKKyAgaWYgKHJ0c3BzcmMtPnRsc19pbnRlcmFjdGlvbikKKyAgICBnX29iamVjdF91bnJlZiAocnRzcHNyYy0+dGxzX2ludGVyYWN0aW9uKTsKKworICAvKiBmcmVlIGxvY2tzICovCisgIGdfcmVjX211dGV4X2NsZWFyICgmcnRzcHNyYy0+c3RyZWFtX3JlY19sb2NrKTsKKyAgZ19yZWNfbXV0ZXhfY2xlYXIgKCZydHNwc3JjLT5zdGF0ZV9yZWNfbG9jayk7CisKKyAgZ19tdXRleF9jbGVhciAoJnJ0c3BzcmMtPmNvbm5pbmZvLnNlbmRfbG9jayk7CisgIGdfbXV0ZXhfY2xlYXIgKCZydHNwc3JjLT5jb25uaW5mby5yZWN2X2xvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdENsb2NrICoKK2dzdF9ydHNwc3JjX3Byb3ZpZGVfY2xvY2sgKEdzdEVsZW1lbnQgKiBlbGVtZW50KQoreworICBHc3RSVFNQU3JjICpzcmMgPSBHU1RfUlRTUFNSQyAoZWxlbWVudCk7CisgIEdzdENsb2NrICpjbG9jazsKKworICBpZiAoKGNsb2NrID0gc3JjLT5wcm92aWRlZF9jbG9jaykgIT0gTlVMTCkKKyAgICByZXR1cm4gZ3N0X29iamVjdF9yZWYgKGNsb2NrKTsKKworICByZXR1cm4gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnByb3ZpZGVfY2xvY2sgKGVsZW1lbnQpOworfQorCisvKiBhIHByb3h5IHN0cmluZyBvZiB0aGUgZm9ybWF0IFt1c2VyOnBhc3N3ZEBdaG9zdFs6cG9ydF0gKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfc2V0X3Byb3h5IChHc3RSVFNQU3JjICogcnRzcCwgY29uc3QgZ2NoYXIgKiBwcm94eSkKK3sKKyAgZ2NoYXIgKnAsICphdCwgKmNvbDsKKworICBnX2ZyZWUgKHJ0c3AtPnByb3h5X3VzZXIpOworICBydHNwLT5wcm94eV91c2VyID0gTlVMTDsKKyAgZ19mcmVlIChydHNwLT5wcm94eV9wYXNzd2QpOworICBydHNwLT5wcm94eV9wYXNzd2QgPSBOVUxMOworICBnX2ZyZWUgKHJ0c3AtPnByb3h5X2hvc3QpOworICBydHNwLT5wcm94eV9ob3N0ID0gTlVMTDsKKyAgcnRzcC0+cHJveHlfcG9ydCA9IDA7CisKKyAgcCA9IChnY2hhciAqKSBwcm94eTsKKworICBpZiAocCA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworCisgIC8qIHdlIGFsbG93IGh0dHA6Ly8gaW4gZnJvbnQgYnV0IGlnbm9yZSBpdCAqLworICBpZiAoZ19zdHJfaGFzX3ByZWZpeCAocCwgImh0dHA6Ly8iKSkKKyAgICBwICs9IDc7CisKKyAgYXQgPSBzdHJjaHIgKHAsICdAJyk7CisgIGlmIChhdCkgeworICAgIC8qIGxvb2sgZm9yIHVzZXI6cGFzc3dkICovCisgICAgY29sID0gc3RyY2hyIChwcm94eSwgJzonKTsKKyAgICBpZiAoY29sID09IE5VTEwgfHwgY29sID4gYXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBydHNwLT5wcm94eV91c2VyID0gZ19zdHJuZHVwIChwLCBjb2wgLSBwKTsKKyAgICBjb2wrKzsKKyAgICBydHNwLT5wcm94eV9wYXNzd2QgPSBnX3N0cm5kdXAgKGNvbCwgYXQgLSBjb2wpOworCisgICAgLyogbW92ZSB0byBob3N0ICovCisgICAgcCA9IGF0ICsgMTsKKyAgfSBlbHNlIHsKKyAgICBpZiAocnRzcC0+cHJvcF9wcm94eV9pZCAhPSBOVUxMICYmICpydHNwLT5wcm9wX3Byb3h5X2lkICE9ICdcMCcpCisgICAgICBydHNwLT5wcm94eV91c2VyID0gZ19zdHJkdXAgKHJ0c3AtPnByb3BfcHJveHlfaWQpOworICAgIGlmIChydHNwLT5wcm9wX3Byb3h5X3B3ICE9IE5VTEwgJiYgKnJ0c3AtPnByb3BfcHJveHlfcHcgIT0gJ1wwJykKKyAgICAgIHJ0c3AtPnByb3h5X3Bhc3N3ZCA9IGdfc3RyZHVwIChydHNwLT5wcm9wX3Byb3h5X3B3KTsKKyAgICBpZiAocnRzcC0+cHJveHlfdXNlciAhPSBOVUxMIHx8IHJ0c3AtPnByb3h5X3Bhc3N3ZCAhPSBOVUxMKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAocnRzcCwgInNldCBwcm94eSB1c2VyL3B3IGZyb20gcHJvcGVydGllczogJXM6JXMiLAorICAgICAgICAgIEdTVF9TVFJfTlVMTCAocnRzcC0+cHJveHlfdXNlciksIEdTVF9TVFJfTlVMTCAocnRzcC0+cHJveHlfcGFzc3dkKSk7CisgICAgfQorICB9CisgIGNvbCA9IHN0cmNociAocCwgJzonKTsKKworICBpZiAoY29sKSB7CisgICAgLyogZXZlcnl0aGluZyBiZWZvcmUgdGhlIGNvbG9uIGlzIHRoZSBob3N0bmFtZSAqLworICAgIHJ0c3AtPnByb3h5X2hvc3QgPSBnX3N0cm5kdXAgKHAsIGNvbCAtIHApOworICAgIHAgPSBjb2wgKyAxOworICAgIHJ0c3AtPnByb3h5X3BvcnQgPSBzdHJ0b3VsIChwLCAoY2hhciAqKikgJnAsIDEwKTsKKyAgfSBlbHNlIHsKKyAgICBydHNwLT5wcm94eV9ob3N0ID0gZ19zdHJkdXAgKHApOworICAgIHJ0c3AtPnByb3h5X3BvcnQgPSA4MDgwOworICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfc2V0X3RjcF90aW1lb3V0IChHc3RSVFNQU3JjICogcnRzcHNyYywgZ3VpbnQ2NCB0aW1lb3V0KQoreworICBydHNwc3JjLT50Y3BfdGltZW91dC50dl9zZWMgPSB0aW1lb3V0IC8gR19VU0VDX1BFUl9TRUM7CisgIHJ0c3BzcmMtPnRjcF90aW1lb3V0LnR2X3VzZWMgPSB0aW1lb3V0ICUgR19VU0VDX1BFUl9TRUM7CisKKyAgaWYgKHRpbWVvdXQgIT0gMCkKKyAgICBydHNwc3JjLT5wdGNwX3RpbWVvdXQgPSAmcnRzcHNyYy0+dGNwX3RpbWVvdXQ7CisgIGVsc2UKKyAgICBydHNwc3JjLT5wdGNwX3RpbWVvdXQgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFJUU1BTcmMgKnJ0c3BzcmM7CisKKyAgcnRzcHNyYyA9IEdTVF9SVFNQU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MT0NBVElPTjoKKyAgICAgIGdzdF9ydHNwc3JjX3VyaV9zZXRfdXJpIChHU1RfVVJJX0hBTkRMRVIgKHJ0c3BzcmMpLAorICAgICAgICAgIGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9UT0NPTFM6CisgICAgICBydHNwc3JjLT5wcm90b2NvbHMgPSBnX3ZhbHVlX2dldF9mbGFncyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RFQlVHOgorICAgICAgcnRzcHNyYy0+ZGVidWcgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVUUlk6CisgICAgICBydHNwc3JjLT5yZXRyeSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USU1FT1VUOgorICAgICAgcnRzcHNyYy0+dWRwX3RpbWVvdXQgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UQ1BfVElNRU9VVDoKKyAgICAgIGdzdF9ydHNwc3JjX3NldF90Y3BfdGltZW91dCAocnRzcHNyYywgZ192YWx1ZV9nZXRfdWludDY0ICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xBVEVOQ1k6CisgICAgICBydHNwc3JjLT5sYXRlbmN5ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RST1BfT05fTEFURU5DWToKKyAgICAgIHJ0c3BzcmMtPmRyb3Bfb25fbGF0ZW5jeSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT05ORUNUSU9OX1NQRUVEOgorICAgICAgcnRzcHNyYy0+Y29ubmVjdGlvbl9zcGVlZCA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX05BVF9NRVRIT0Q6CisgICAgICBydHNwc3JjLT5uYXRfbWV0aG9kID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RPX1JUQ1A6CisgICAgICBydHNwc3JjLT5kb19ydGNwID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RPX1JUU1BfS0VFUF9BTElWRToKKyAgICAgIHJ0c3BzcmMtPmRvX3J0c3Bfa2VlcF9hbGl2ZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9YWToKKyAgICAgIGdzdF9ydHNwc3JjX3NldF9wcm94eSAocnRzcHNyYywgZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST1hZX0lEOgorICAgICAgZ19mcmVlIChydHNwc3JjLT5wcm9wX3Byb3h5X2lkKTsKKyAgICAgIHJ0c3BzcmMtPnByb3BfcHJveHlfaWQgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9YWV9QVzoKKyAgICAgIGdfZnJlZSAocnRzcHNyYy0+cHJvcF9wcm94eV9wdyk7CisgICAgICBydHNwc3JjLT5wcm9wX3Byb3h5X3B3ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRQX0JMT0NLU0laRToKKyAgICAgIHJ0c3BzcmMtPnJ0cF9ibG9ja3NpemUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFUl9JRDoKKyAgICAgIGdfZnJlZSAocnRzcHNyYy0+dXNlcl9pZCk7CisgICAgICBydHNwc3JjLT51c2VyX2lkID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFUl9QVzoKKyAgICAgIGdfZnJlZSAocnRzcHNyYy0+dXNlcl9wdyk7CisgICAgICBydHNwc3JjLT51c2VyX3B3ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQlVGRkVSX01PREU6CisgICAgICBydHNwc3JjLT5idWZmZXJfbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QT1JUX1JBTkdFOgorICAgIHsKKyAgICAgIGNvbnN0IGdjaGFyICpzdHI7CisKKyAgICAgIHN0ciA9IGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpOworICAgICAgaWYgKHNzY2FuZiAoc3RyLCAiJXUtJXUiLCAmcnRzcHNyYy0+Y2xpZW50X3BvcnRfcmFuZ2UubWluLAorICAgICAgICAgICAgICAmcnRzcHNyYy0+Y2xpZW50X3BvcnRfcmFuZ2UubWF4KSAhPSAyKSB7CisgICAgICAgIHJ0c3BzcmMtPmNsaWVudF9wb3J0X3JhbmdlLm1pbiA9IDA7CisgICAgICAgIHJ0c3BzcmMtPmNsaWVudF9wb3J0X3JhbmdlLm1heCA9IDA7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX1VEUF9CVUZGRVJfU0laRToKKyAgICAgIHJ0c3BzcmMtPnVkcF9idWZmZXJfc2l6ZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NIT1JUX0hFQURFUjoKKyAgICAgIHJ0c3BzcmMtPnNob3J0X2hlYWRlciA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QUk9CQVRJT046CisgICAgICBydHNwc3JjLT5wcm9iYXRpb24gPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVURQX1JFQ09OTkVDVDoKKyAgICAgIHJ0c3BzcmMtPnVkcF9yZWNvbm5lY3QgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTVVMVElDQVNUX0lGQUNFOgorICAgICAgZ19mcmVlIChydHNwc3JjLT5tdWx0aV9pZmFjZSk7CisKKyAgICAgIGlmIChnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSA9PSBOVUxMKQorICAgICAgICBydHNwc3JjLT5tdWx0aV9pZmFjZSA9IGdfc3RyZHVwIChERUZBVUxUX01VTFRJQ0FTVF9JRkFDRSk7CisgICAgICBlbHNlCisgICAgICAgIHJ0c3BzcmMtPm11bHRpX2lmYWNlID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTlRQX1NZTkM6CisgICAgICBydHNwc3JjLT5udHBfc3luYyA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIC8qIFRoZSBkZWZhdWx0IHZhbHVlIG9mIG1heF90c19vZmZzZXQgZGVwZW5kcyBvbiBudHBfc3luYy4gSWYgdXNlcgorICAgICAgICogaGFzbid0IHNldCBpdCB0aGVuIGNoYW5nZSBkZWZhdWx0IHZhbHVlICovCisgICAgICBpZiAoIXJ0c3BzcmMtPm1heF90c19vZmZzZXRfaXNfc2V0KSB7CisgICAgICAgIGlmIChydHNwc3JjLT5udHBfc3luYykgeworICAgICAgICAgIHJ0c3BzcmMtPm1heF90c19vZmZzZXQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJ0c3BzcmMtPm1heF90c19vZmZzZXQgPSBERUZBVUxUX01BWF9UU19PRkZTRVQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VfUElQRUxJTkVfQ0xPQ0s6CisgICAgICBydHNwc3JjLT51c2VfcGlwZWxpbmVfY2xvY2sgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0RFUzoKKyAgICAgIHJ0c3BzcmMtPnNkZXMgPSBnX3ZhbHVlX2R1cF9ib3hlZCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RMU19WQUxJREFUSU9OX0ZMQUdTOgorICAgICAgcnRzcHNyYy0+dGxzX3ZhbGlkYXRpb25fZmxhZ3MgPSBnX3ZhbHVlX2dldF9mbGFncyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RMU19EQVRBQkFTRToKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmcnRzcHNyYy0+dGxzX2RhdGFiYXNlKTsKKyAgICAgIHJ0c3BzcmMtPnRsc19kYXRhYmFzZSA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RMU19JTlRFUkFDVElPTjoKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmcnRzcHNyYy0+dGxzX2ludGVyYWN0aW9uKTsKKyAgICAgIHJ0c3BzcmMtPnRsc19pbnRlcmFjdGlvbiA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RPX1JFVFJBTlNNSVNTSU9OOgorICAgICAgcnRzcHNyYy0+ZG9fcmV0cmFuc21pc3Npb24gPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTlRQX1RJTUVfU09VUkNFOgorICAgICAgcnRzcHNyYy0+bnRwX3RpbWVfc291cmNlID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRVJfQUdFTlQ6CisgICAgICBnX2ZyZWUgKHJ0c3BzcmMtPnVzZXJfYWdlbnQpOworICAgICAgcnRzcHNyYy0+dXNlcl9hZ2VudCA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9SVENQX1JUUF9USU1FX0RJRkY6CisgICAgICBydHNwc3JjLT5tYXhfcnRjcF9ydHBfdGltZV9kaWZmID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkZDNzI3M19TWU5DOgorICAgICAgcnRzcHNyYy0+cmZjNzI3M19zeW5jID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVDoKKyAgICAgIHJ0c3BzcmMtPm1heF90c19vZmZzZXRfYWRqdXN0bWVudCA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9UU19PRkZTRVQ6CisgICAgICBydHNwc3JjLT5tYXhfdHNfb2Zmc2V0ID0gZ192YWx1ZV9nZXRfaW50NjQgKHZhbHVlKTsKKyAgICAgIHJ0c3BzcmMtPm1heF90c19vZmZzZXRfaXNfc2V0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERUZBVUxUX1ZFUlNJT046CisgICAgICBydHNwc3JjLT5kZWZhdWx0X3ZlcnNpb24gPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0UlRTUFNyYyAqcnRzcHNyYzsKKworICBydHNwc3JjID0gR1NUX1JUU1BTUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0xPQ0FUSU9OOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgcnRzcHNyYy0+Y29ubmluZm8ubG9jYXRpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST1RPQ09MUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ZsYWdzICh2YWx1ZSwgcnRzcHNyYy0+cHJvdG9jb2xzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERUJVRzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBydHNwc3JjLT5kZWJ1Zyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVUUlk6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgcnRzcHNyYy0+cmV0cnkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RJTUVPVVQ6CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBydHNwc3JjLT51ZHBfdGltZW91dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVENQX1RJTUVPVVQ6CisgICAgeworICAgICAgZ3VpbnQ2NCB0aW1lb3V0OworCisgICAgICB0aW1lb3V0ID0gKChndWludDY0KSBydHNwc3JjLT50Y3BfdGltZW91dC50dl9zZWMpICogR19VU0VDX1BFUl9TRUMgKworICAgICAgICAgIHJ0c3BzcmMtPnRjcF90aW1lb3V0LnR2X3VzZWM7CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCB0aW1lb3V0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfTEFURU5DWToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHNwc3JjLT5sYXRlbmN5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9EUk9QX09OX0xBVEVOQ1k6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcnRzcHNyYy0+ZHJvcF9vbl9sYXRlbmN5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DT05ORUNUSU9OX1NQRUVEOgorICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgcnRzcHNyYy0+Y29ubmVjdGlvbl9zcGVlZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTkFUX01FVEhPRDoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBydHNwc3JjLT5uYXRfbWV0aG9kKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ET19SVENQOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHJ0c3BzcmMtPmRvX3J0Y3ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RPX1JUU1BfS0VFUF9BTElWRToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBydHNwc3JjLT5kb19ydHNwX2tlZXBfYWxpdmUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST1hZOgorICAgIHsKKyAgICAgIGdjaGFyICpzdHI7CisKKyAgICAgIGlmIChydHNwc3JjLT5wcm94eV9ob3N0KSB7CisgICAgICAgIHN0ciA9CisgICAgICAgICAgICBnX3N0cmR1cF9wcmludGYgKCIlczolZCIsIHJ0c3BzcmMtPnByb3h5X2hvc3QsIHJ0c3BzcmMtPnByb3h5X3BvcnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGdfdmFsdWVfdGFrZV9zdHJpbmcgKHZhbHVlLCBzdHIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9QUk9YWV9JRDoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHJ0c3BzcmMtPnByb3BfcHJveHlfaWQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BST1hZX1BXOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgcnRzcHNyYy0+cHJvcF9wcm94eV9wdyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUlRQX0JMT0NLU0laRToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBydHNwc3JjLT5ydHBfYmxvY2tzaXplKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VSX0lEOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgcnRzcHNyYy0+dXNlcl9pZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFUl9QVzoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHJ0c3BzcmMtPnVzZXJfcHcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JVRkZFUl9NT0RFOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHJ0c3BzcmMtPmJ1ZmZlcl9tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QT1JUX1JBTkdFOgorICAgIHsKKyAgICAgIGdjaGFyICpzdHI7CisKKyAgICAgIGlmIChydHNwc3JjLT5jbGllbnRfcG9ydF9yYW5nZS5taW4gIT0gMCkgeworICAgICAgICBzdHIgPSBnX3N0cmR1cF9wcmludGYgKCIldS0ldSIsIHJ0c3BzcmMtPmNsaWVudF9wb3J0X3JhbmdlLm1pbiwKKyAgICAgICAgICAgIHJ0c3BzcmMtPmNsaWVudF9wb3J0X3JhbmdlLm1heCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdHIgPSBOVUxMOworICAgICAgfQorICAgICAgZ192YWx1ZV90YWtlX3N0cmluZyAodmFsdWUsIHN0cik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX1VEUF9CVUZGRVJfU0laRToKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHJ0c3BzcmMtPnVkcF9idWZmZXJfc2l6ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0hPUlRfSEVBREVSOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHJ0c3BzcmMtPnNob3J0X2hlYWRlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUFJPQkFUSU9OOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHJ0c3BzcmMtPnByb2JhdGlvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVURQX1JFQ09OTkVDVDoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBydHNwc3JjLT51ZHBfcmVjb25uZWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NVUxUSUNBU1RfSUZBQ0U6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBydHNwc3JjLT5tdWx0aV9pZmFjZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTlRQX1NZTkM6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgcnRzcHNyYy0+bnRwX3N5bmMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VTRV9QSVBFTElORV9DTE9DSzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBydHNwc3JjLT51c2VfcGlwZWxpbmVfY2xvY2spOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NERVM6CisgICAgICBnX3ZhbHVlX3NldF9ib3hlZCAodmFsdWUsIHJ0c3BzcmMtPnNkZXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RMU19WQUxJREFUSU9OX0ZMQUdTOgorICAgICAgZ192YWx1ZV9zZXRfZmxhZ3MgKHZhbHVlLCBydHNwc3JjLT50bHNfdmFsaWRhdGlvbl9mbGFncyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVExTX0RBVEFCQVNFOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgcnRzcHNyYy0+dGxzX2RhdGFiYXNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UTFNfSU5URVJBQ1RJT046CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBydHNwc3JjLT50bHNfaW50ZXJhY3Rpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RPX1JFVFJBTlNNSVNTSU9OOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHJ0c3BzcmMtPmRvX3JldHJhbnNtaXNzaW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9OVFBfVElNRV9TT1VSQ0U6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgcnRzcHNyYy0+bnRwX3RpbWVfc291cmNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VSX0FHRU5UOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgcnRzcHNyYy0+dXNlcl9hZ2VudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX1JUQ1BfUlRQX1RJTUVfRElGRjoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHJ0c3BzcmMtPm1heF9ydGNwX3J0cF90aW1lX2RpZmYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JGQzcyNzNfU1lOQzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBydHNwc3JjLT5yZmM3MjczX3N5bmMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01BWF9UU19PRkZTRVRfQURKVVNUTUVOVDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHJ0c3BzcmMtPm1heF90c19vZmZzZXRfYWRqdXN0bWVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUFYX1RTX09GRlNFVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludDY0ICh2YWx1ZSwgcnRzcHNyYy0+bWF4X3RzX29mZnNldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfREVGQVVMVF9WRVJTSU9OOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHJ0c3BzcmMtPmRlZmF1bHRfdmVyc2lvbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBnaW50CitmaW5kX3N0cmVhbV9ieV9pZCAoR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwgZ2ludCAqIGlkKQoreworICBpZiAoc3RyZWFtLT5pZCA9PSAqaWQpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgZ2ludAorZmluZF9zdHJlYW1fYnlfY2hhbm5lbCAoR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwgZ2ludCAqIGNoYW5uZWwpCit7CisgIC8qIGlnbm9yZSB1bmNvbmZpZ3VyZWQgY2hhbm5lbHMgaGVyZSAoZS5nLiwgdGhvc2UgdGhhdAorICAgKiB3ZXJlIGV4cGxpY2l0bHkgc2tpcHBlZCBkdXJpbmcgU0VUVVApICovCisgIGlmICgoc3RyZWFtLT5jaGFubmVscGFkWzBdICE9IE5VTEwpICYmCisgICAgICAoc3RyZWFtLT5jaGFubmVsWzBdID09ICpjaGFubmVsIHx8IHN0cmVhbS0+Y2hhbm5lbFsxXSA9PSAqY2hhbm5lbCkpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgZ2ludAorZmluZF9zdHJlYW1fYnlfdWRwc3JjIChHc3RSVFNQU3RyZWFtICogc3RyZWFtLCBnY29uc3Rwb2ludGVyIGEpCit7CisgIEdzdEVsZW1lbnQgKnNyYyA9IChHc3RFbGVtZW50ICopIGE7CisKKyAgaWYgKHN0cmVhbS0+dWRwc3JjWzBdID09IHNyYykKKyAgICByZXR1cm4gMDsKKyAgaWYgKHN0cmVhbS0+dWRwc3JjWzFdID09IHNyYykKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBnaW50CitmaW5kX3N0cmVhbV9ieV9zZXR1cCAoR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwgZ2NvbnN0cG9pbnRlciBhKQoreworICBpZiAoc3RyZWFtLT5jb25uaW5mby5sb2NhdGlvbikgeworICAgIC8qIGNoZWNrIHF1YWxpZmllZCBzZXR1cF91cmwgKi8KKyAgICBpZiAoIXN0cmNtcCAoc3RyZWFtLT5jb25uaW5mby5sb2NhdGlvbiwgKGdjaGFyICopIGEpKQorICAgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHN0cmVhbS0+Y29udHJvbF91cmwpIHsKKyAgICAvKiBjaGVjayBvcmlnaW5hbCBjb250cm9sX3VybCAqLworICAgIGlmICghc3RyY21wIChzdHJlYW0tPmNvbnRyb2xfdXJsLCAoZ2NoYXIgKikgYSkpCisgICAgICByZXR1cm4gMDsKKworICAgIC8qIGNoZWNrIGlmIHF1YWxpZmllZCBzZXR1cF91cmwgZW5kcyB3aXRoIHN0cmluZyAqLworICAgIGlmIChnX3N0cl9oYXNfc3VmZml4IChzdHJlYW0tPmNvbnRyb2xfdXJsLCAoZ2NoYXIgKikgYSkpCisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiAtMTsKK30KKworc3RhdGljIEdzdFJUU1BTdHJlYW0gKgorZmluZF9zdHJlYW0gKEdzdFJUU1BTcmMgKiBzcmMsIGdjb25zdHBvaW50ZXIgZGF0YSwgZ2NvbnN0cG9pbnRlciBmdW5jKQoreworICBHTGlzdCAqbHN0cmVhbTsKKworICAvKiBmaW5kIGFuZCBnZXQgc3RyZWFtICovCisgIGlmICgobHN0cmVhbSA9IGdfbGlzdF9maW5kX2N1c3RvbSAoc3JjLT5zdHJlYW1zLCBkYXRhLCAoR0NvbXBhcmVGdW5jKSBmdW5jKSkpCisgICAgcmV0dXJuIChHc3RSVFNQU3RyZWFtICopIGxzdHJlYW0tPmRhdGE7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBHc3RTRFBCYW5kd2lkdGggKgorZ3N0X3J0c3BzcmNfZ2V0X2JhbmR3aWR0aCAoR3N0UlRTUFNyYyAqIHNyYywgY29uc3QgR3N0U0RQTWVzc2FnZSAqIHNkcCwKKyAgICBjb25zdCBHc3RTRFBNZWRpYSAqIG1lZGlhLCBjb25zdCBnY2hhciAqIHR5cGUpCit7CisgIGd1aW50IGksIGxlbjsKKworICAvKiBmaXJzdCBsb29rIGluIHRoZSBtZWRpYSBzcGVjaWZpYyBzZWN0aW9uICovCisgIGxlbiA9IGdzdF9zZHBfbWVkaWFfYmFuZHdpZHRoc19sZW4gKG1lZGlhKTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgY29uc3QgR3N0U0RQQmFuZHdpZHRoICpidyA9IGdzdF9zZHBfbWVkaWFfZ2V0X2JhbmR3aWR0aCAobWVkaWEsIGkpOworCisgICAgaWYgKHN0cmNtcCAoYnctPmJ3dHlwZSwgdHlwZSkgPT0gMCkKKyAgICAgIHJldHVybiBidzsKKyAgfQorICAvKiB0aGVuIGxvb2sgaW4gdGhlIG1lc3NhZ2Ugc3BlY2lmaWMgc2VjdGlvbiAqLworICBsZW4gPSBnc3Rfc2RwX21lc3NhZ2VfYmFuZHdpZHRoc19sZW4gKHNkcCk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGNvbnN0IEdzdFNEUEJhbmR3aWR0aCAqYncgPSBnc3Rfc2RwX21lc3NhZ2VfZ2V0X2JhbmR3aWR0aCAoc2RwLCBpKTsKKworICAgIGlmIChzdHJjbXAgKGJ3LT5id3R5cGUsIHR5cGUpID09IDApCisgICAgICByZXR1cm4gYnc7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19jb2xsZWN0X2JhbmR3aWR0aCAoR3N0UlRTUFNyYyAqIHNyYywgY29uc3QgR3N0U0RQTWVzc2FnZSAqIHNkcCwKKyAgICBjb25zdCBHc3RTRFBNZWRpYSAqIG1lZGlhLCBHc3RSVFNQU3RyZWFtICogc3RyZWFtKQoreworICBjb25zdCBHc3RTRFBCYW5kd2lkdGggKmJ3OworCisgIGlmICgoYncgPSBnc3RfcnRzcHNyY19nZXRfYmFuZHdpZHRoIChzcmMsIHNkcCwgbWVkaWEsIEdTVF9TRFBfQldUWVBFX0FTKSkpCisgICAgc3RyZWFtLT5hc19iYW5kd2lkdGggPSBidy0+YmFuZHdpZHRoOworICBlbHNlCisgICAgc3RyZWFtLT5hc19iYW5kd2lkdGggPSAtMTsKKworICBpZiAoKGJ3ID0gZ3N0X3J0c3BzcmNfZ2V0X2JhbmR3aWR0aCAoc3JjLCBzZHAsIG1lZGlhLCBHU1RfU0RQX0JXVFlQRV9SUikpKQorICAgIHN0cmVhbS0+cnJfYmFuZHdpZHRoID0gYnctPmJhbmR3aWR0aDsKKyAgZWxzZQorICAgIHN0cmVhbS0+cnJfYmFuZHdpZHRoID0gLTE7CisKKyAgaWYgKChidyA9IGdzdF9ydHNwc3JjX2dldF9iYW5kd2lkdGggKHNyYywgc2RwLCBtZWRpYSwgR1NUX1NEUF9CV1RZUEVfUlMpKSkKKyAgICBzdHJlYW0tPnJzX2JhbmR3aWR0aCA9IGJ3LT5iYW5kd2lkdGg7CisgIGVsc2UKKyAgICBzdHJlYW0tPnJzX2JhbmR3aWR0aCA9IC0xOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfZG9fc3RyZWFtX2Nvbm5lY3Rpb24gKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BTdHJlYW0gKiBzdHJlYW0sCisgICAgY29uc3QgR3N0U0RQQ29ubmVjdGlvbiAqIGNvbm4pCit7CisgIGlmIChjb25uLT5uZXR0eXBlID09IE5VTEwgfHwgc3RyY21wIChjb25uLT5uZXR0eXBlLCAiSU4iKSAhPSAwKQorICAgIHJldHVybjsKKworICBpZiAoY29ubi0+YWRkcnR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogY2hlY2sgZm9yIElQVjYgKi8KKyAgaWYgKHN0cmNtcCAoY29ubi0+YWRkcnR5cGUsICJJUDQiKSA9PSAwKQorICAgIHN0cmVhbS0+aXNfaXB2NiA9IEZBTFNFOworICBlbHNlIGlmIChzdHJjbXAgKGNvbm4tPmFkZHJ0eXBlLCAiSVA2IikgPT0gMCkKKyAgICBzdHJlYW0tPmlzX2lwdjYgPSBUUlVFOworICBlbHNlCisgICAgcmV0dXJuOworCisgIC8qIHNhdmUgYWRkcmVzcyAqLworICBnX2ZyZWUgKHN0cmVhbS0+ZGVzdGluYXRpb24pOworICBzdHJlYW0tPmRlc3RpbmF0aW9uID0gZ19zdHJkdXAgKGNvbm4tPmFkZHJlc3MpOworCisgIC8qIGNoZWNrIGZvciBtdWx0aWNhc3QgKi8KKyAgc3RyZWFtLT5pc19tdWx0aWNhc3QgPQorICAgICAgZ3N0X3NkcF9hZGRyZXNzX2lzX211bHRpY2FzdCAoY29ubi0+bmV0dHlwZSwgY29ubi0+YWRkcnR5cGUsCisgICAgICBjb25uLT5hZGRyZXNzKTsKKyAgc3RyZWFtLT50dGwgPSBjb25uLT50dGw7Cit9CisKKy8qIEdvIG92ZXIgdGhlIGNvbm5lY3Rpb25zIGZvciBhIHN0cmVhbS4KKyAqIC0gSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBJUFY2LCB3ZSB3aWxsIHNldHVwIElQVjYgc29ja2V0cyBmb3Igc2VuZGluZyBhbmQKKyAqICAgcmVjZWl2aW5nLgorICogLSBJZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgbG9jYWxob3N0IGFkZHJlc3MsIHdlIGRpc2FibGUgbXVsdGljYXN0CisgKi8KK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19jb2xsZWN0X2Nvbm5lY3Rpb25zIChHc3RSVFNQU3JjICogc3JjLCBjb25zdCBHc3RTRFBNZXNzYWdlICogc2RwLAorICAgIGNvbnN0IEdzdFNEUE1lZGlhICogbWVkaWEsIEdzdFJUU1BTdHJlYW0gKiBzdHJlYW0pCit7CisgIGNvbnN0IEdzdFNEUENvbm5lY3Rpb24gKmNvbm47CisgIGd1aW50IGksIGxlbjsKKworICAvKiBmaXJzdCBsb29rIGluIHRoZSBtZWRpYSBzcGVjaWZpYyBzZWN0aW9uICovCisgIGxlbiA9IGdzdF9zZHBfbWVkaWFfY29ubmVjdGlvbnNfbGVuIChtZWRpYSk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGNvbm4gPSBnc3Rfc2RwX21lZGlhX2dldF9jb25uZWN0aW9uIChtZWRpYSwgaSk7CisKKyAgICBnc3RfcnRzcHNyY19kb19zdHJlYW1fY29ubmVjdGlvbiAoc3JjLCBzdHJlYW0sIGNvbm4pOworICB9CisgIC8qIHRoZW4gbG9vayBpbiB0aGUgbWVzc2FnZSBzcGVjaWZpYyBzZWN0aW9uICovCisgIGlmICgoY29ubiA9IGdzdF9zZHBfbWVzc2FnZV9nZXRfY29ubmVjdGlvbiAoc2RwKSkpIHsKKyAgICBnc3RfcnRzcHNyY19kb19zdHJlYW1fY29ubmVjdGlvbiAoc3JjLCBzdHJlYW0sIGNvbm4pOworICB9Cit9CisKK3N0YXRpYyBnY2hhciAqCittYWtlX3N0cmVhbV9pZCAoR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwgY29uc3QgR3N0U0RQTWVkaWEgKiBtZWRpYSkKK3sKKyAgZ2NoYXIgKnN0cmVhbV9pZCA9CisgICAgICBnX3N0cmR1cF9wcmludGYgKCIlczolZDolZDolczolZCIsIG1lZGlhLT5tZWRpYSwgbWVkaWEtPnBvcnQsCisgICAgICBtZWRpYS0+bnVtX3BvcnRzLCBtZWRpYS0+cHJvdG8sIHN0cmVhbS0+ZGVmYXVsdF9wdCk7CisKKyAgZ19zdHJjYW5vbiAoc3RyZWFtX2lkLCBHX0NTRVRfYV8yX3ogR19DU0VUX0FfMl9aIEdfQ1NFVF9ESUdJVFMsICc6Jyk7CisKKyAgcmV0dXJuIHN0cmVhbV9pZDsKK30KKworLyogICBtPTxtZWRpYT4gPFVEUCBwb3J0PiBSVFAvQVZQIDxwYXlsb2FkPgorICovCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfY29sbGVjdF9wYXlsb2FkcyAoR3N0UlRTUFNyYyAqIHNyYywgY29uc3QgR3N0U0RQTWVzc2FnZSAqIHNkcCwKKyAgICBjb25zdCBHc3RTRFBNZWRpYSAqIG1lZGlhLCBHc3RSVFNQU3RyZWFtICogc3RyZWFtKQoreworICBndWludCBpLCBsZW47CisgIGNvbnN0IGdjaGFyICpwcm90bzsKKyAgR3N0Q2FwcyAqZ2xvYmFsX2NhcHM7CisKKyAgLyogZ2V0IHByb3RvICovCisgIHByb3RvID0gZ3N0X3NkcF9tZWRpYV9nZXRfcHJvdG8gKG1lZGlhKTsKKyAgaWYgKHByb3RvID09IE5VTEwpCisgICAgZ290byBub19wcm90bzsKKworICBpZiAoZ19zdHJfZXF1YWwgKHByb3RvLCAiUlRQL0FWUCIpKQorICAgIHN0cmVhbS0+cHJvZmlsZSA9IEdTVF9SVFNQX1BST0ZJTEVfQVZQOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvdG8sICJSVFAvU0FWUCIpKQorICAgIHN0cmVhbS0+cHJvZmlsZSA9IEdTVF9SVFNQX1BST0ZJTEVfU0FWUDsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKHByb3RvLCAiUlRQL0FWUEYiKSkKKyAgICBzdHJlYW0tPnByb2ZpbGUgPSBHU1RfUlRTUF9QUk9GSUxFX0FWUEY7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm90bywgIlJUUC9TQVZQRiIpKQorICAgIHN0cmVhbS0+cHJvZmlsZSA9IEdTVF9SVFNQX1BST0ZJTEVfU0FWUEY7CisgIGVsc2UKKyAgICBnb3RvIHVua25vd25fcHJvdG87CisKKyAgaWYgKGdzdF9zZHBfbWVkaWFfZ2V0X2F0dHJpYnV0ZV92YWwgKG1lZGlhLCAicmVjdm9ubHkiKSAhPSBOVUxMKQorICAgIGdvdG8gcmVjdm9ubHlfbWVkaWE7CisKKyAgLyogUGFyc2UgZ2xvYmFsIFNEUCBhdHRyaWJ1dGVzIG9uY2UgKi8KKyAgZ2xvYmFsX2NhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXBwbGljYXRpb24veC11bmtub3duIik7CisgIEdTVF9ERUJVRyAoIm1hcHBpbmcgc2RwIHNlc3Npb24gbGV2ZWwgYXR0cmlidXRlcyB0byBjYXBzIik7CisgIGdzdF9zZHBfbWVzc2FnZV9hdHRyaWJ1dGVzX3RvX2NhcHMgKHNkcCwgZ2xvYmFsX2NhcHMpOworICBHU1RfREVCVUcgKCJtYXBwaW5nIHNkcCBtZWRpYSBsZXZlbCBhdHRyaWJ1dGVzIHRvIGNhcHMiKTsKKyAgZ3N0X3NkcF9tZWRpYV9hdHRyaWJ1dGVzX3RvX2NhcHMgKG1lZGlhLCBnbG9iYWxfY2Fwcyk7CisKKyAgLyogS2VlcCBhIGNvcHkgb2YgdGhlIFNEUCBrZXkgbWFuYWdlbWVudCAqLworICBnc3Rfc2RwX21lZGlhX3BhcnNlX2tleW1nbXQgKG1lZGlhLCAmc3RyZWFtLT5taWtleSk7CisgIGlmIChzdHJlYW0tPm1pa2V5ID09IE5VTEwpCisgICAgZ3N0X3NkcF9tZXNzYWdlX3BhcnNlX2tleW1nbXQgKHNkcCwgJnN0cmVhbS0+bWlrZXkpOworCisgIGxlbiA9IGdzdF9zZHBfbWVkaWFfZm9ybWF0c19sZW4gKG1lZGlhKTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgZ2ludCBwdDsKKyAgICBHc3RDYXBzICpjYXBzLCAqb3V0Y2FwczsKKyAgICBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgY29uc3QgZ2NoYXIgKmVuYzsKKyAgICBQdE1hcEl0ZW0gaXRlbTsKKworICAgIHB0ID0gYXRvaSAoZ3N0X3NkcF9tZWRpYV9nZXRfZm9ybWF0IChtZWRpYSwgaSkpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiIGxvb2tpbmcgYXQgJWQgcHQ6ICVkIiwgaSwgcHQpOworCisgICAgLyogY29udmVydCBjYXBzICovCisgICAgY2FwcyA9IGdzdF9zZHBfbWVkaWFfZ2V0X2NhcHNfZnJvbV9tZWRpYSAobWVkaWEsIHB0KTsKKyAgICBpZiAoY2FwcyA9PSBOVUxMKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgIiBza2lwcGluZyBwdCAlZCB3aXRob3V0IGNhcHMiLCBwdCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiBkbyBzb21lIHR3ZWFrcyAqLworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgICBpZiAoKGVuYyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgImVuY29kaW5nLW5hbWUiKSkpIHsKKyAgICAgIHN0cmVhbS0+aXNfcmVhbCA9IChzdHJzdHIgKGVuYywgIi1SRUFMIikgIT0gTlVMTCk7CisgICAgICBpZiAoc3RyY21wIChlbmMsICJYLUFTRi1QRiIpID09IDApCisgICAgICAgIHN0cmVhbS0+Y29udGFpbmVyID0gVFJVRTsKKyAgICB9CisKKyAgICAvKiBNZXJnZSBpbiBnbG9iYWwgY2FwcyAqLworICAgIC8qIEludGVyc2VjdCB3aWxsIG1lcmdlIGluIG1pc3NpbmcgZmllbGRzIHRvIHRoZSBjdXJyZW50IGNhcHMgKi8KKyAgICBvdXRjYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChjYXBzLCBnbG9iYWxfY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgLyogdGhlIGZpcnN0IHB0IHdpbGwgYmUgdGhlIGRlZmF1bHQgKi8KKyAgICBpZiAoc3RyZWFtLT5wdG1hcC0+bGVuID09IDApCisgICAgICBzdHJlYW0tPmRlZmF1bHRfcHQgPSBwdDsKKworICAgIGl0ZW0ucHQgPSBwdDsKKyAgICBpdGVtLmNhcHMgPSBvdXRjYXBzOworCisgICAgZ19hcnJheV9hcHBlbmRfdmFsIChzdHJlYW0tPnB0bWFwLCBpdGVtKTsKKyAgfQorCisgIHN0cmVhbS0+c3RyZWFtX2lkID0gbWFrZV9zdHJlYW1faWQgKHN0cmVhbSwgbWVkaWEpOworCisgIGdzdF9jYXBzX3VucmVmIChnbG9iYWxfY2Fwcyk7CisgIHJldHVybjsKKworbm9fcHJvdG86CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzcmMsICJjYW4ndCBmaW5kIHByb3RvIGluIG1lZGlhIik7CisgICAgcmV0dXJuOworICB9Cit1bmtub3duX3Byb3RvOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoc3JjLCAidW5rbm93biBwcm90byBpbiBtZWRpYTogJyVzJyIsIHByb3RvKTsKKyAgICByZXR1cm47CisgIH0KK3JlY3Zvbmx5X21lZGlhOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicmVjdm9ubHkgbWVkaWEgaWdub3JlZCIpOworICAgIHJldHVybjsKKyAgfQorfQorCitzdGF0aWMgY29uc3QgZ2NoYXIgKgorZ2V0X2FnZ3JlZ2F0ZV9jb250cm9sIChHc3RSVFNQU3JjICogc3JjKQoreworICBjb25zdCBnY2hhciAqYmFzZTsKKworICBpZiAoc3JjLT5jb250cm9sKQorICAgIGJhc2UgPSBzcmMtPmNvbnRyb2w7CisgIGVsc2UgaWYgKHNyYy0+Y29udGVudF9iYXNlKQorICAgIGJhc2UgPSBzcmMtPmNvbnRlbnRfYmFzZTsKKyAgZWxzZSBpZiAoc3JjLT5jb25uaW5mby51cmxfc3RyKQorICAgIGJhc2UgPSBzcmMtPmNvbm5pbmZvLnVybF9zdHI7CisgIGVsc2UKKyAgICBiYXNlID0gIi8iOworCisgIHJldHVybiBiYXNlOworfQorCitzdGF0aWMgdm9pZAorY2xlYXJfcHRtYXBfaXRlbSAoUHRNYXBJdGVtICogaXRlbSkKK3sKKyAgaWYgKGl0ZW0tPmNhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKGl0ZW0tPmNhcHMpOworfQorCitzdGF0aWMgR3N0UlRTUFN0cmVhbSAqCitnc3RfcnRzcHNyY19jcmVhdGVfc3RyZWFtIChHc3RSVFNQU3JjICogc3JjLCBHc3RTRFBNZXNzYWdlICogc2RwLCBnaW50IGlkeCwKKyAgICBnaW50IG5fc3RyZWFtcykKK3sKKyAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtOworICBjb25zdCBnY2hhciAqY29udHJvbF91cmw7CisgIGNvbnN0IEdzdFNEUE1lZGlhICptZWRpYTsKKworICAvKiBnZXQgbWVkaWEsIHNob3VsZCBub3QgcmV0dXJuIE5VTEwgKi8KKyAgbWVkaWEgPSBnc3Rfc2RwX21lc3NhZ2VfZ2V0X21lZGlhIChzZHAsIGlkeCk7CisgIGlmIChtZWRpYSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHN0cmVhbSA9IGdfbmV3MCAoR3N0UlRTUFN0cmVhbSwgMSk7CisgIHN0cmVhbS0+cGFyZW50ID0gc3JjOworICAvKiB3ZSBtYXJrIHRoZSBwYWQgYXMgbm90IGxpbmtlZCwgd2Ugd2lsbCBtYXJrIGl0IGFzIE9LIHdoZW4gd2UgYWRkIHRoZSBwYWQgdG8KKyAgICogdGhlIGVsZW1lbnQuICovCisgIHN0cmVhbS0+bGFzdF9yZXQgPSBHU1RfRkxPV19OT1RfTElOS0VEOworICBzdHJlYW0tPmFkZGVkID0gRkFMU0U7CisgIHN0cmVhbS0+c2V0dXAgPSBGQUxTRTsKKyAgc3RyZWFtLT5za2lwcGVkID0gRkFMU0U7CisgIHN0cmVhbS0+aWQgPSBpZHg7CisgIHN0cmVhbS0+ZW9zID0gRkFMU0U7CisgIHN0cmVhbS0+ZGlzY29udCA9IFRSVUU7CisgIHN0cmVhbS0+c2VxYmFzZSA9IC0xOworICBzdHJlYW0tPnRpbWViYXNlID0gLTE7CisgIHN0cmVhbS0+c2VuZF9zc3JjID0gZ19yYW5kb21faW50ICgpOworICBzdHJlYW0tPnByb2ZpbGUgPSBHU1RfUlRTUF9QUk9GSUxFX0FWUDsKKyAgc3RyZWFtLT5wdG1hcCA9IGdfYXJyYXlfbmV3IChGQUxTRSwgRkFMU0UsIHNpemVvZiAoUHRNYXBJdGVtKSk7CisgIHN0cmVhbS0+bWlrZXkgPSBOVUxMOworICBzdHJlYW0tPnN0cmVhbV9pZCA9IE5VTEw7CisgIGdfbXV0ZXhfaW5pdCAoJnN0cmVhbS0+Y29ubmluZm8uc2VuZF9sb2NrKTsKKyAgZ19tdXRleF9pbml0ICgmc3RyZWFtLT5jb25uaW5mby5yZWN2X2xvY2spOworICBnX2FycmF5X3NldF9jbGVhcl9mdW5jIChzdHJlYW0tPnB0bWFwLCAoR0Rlc3Ryb3lOb3RpZnkpIGNsZWFyX3B0bWFwX2l0ZW0pOworCisgIC8qIGNvbGxlY3QgYmFuZHdpZHRoIGluZm9ybWF0aW9uIGZvciB0aGlzIHN0ZWFtLiBGSVhNRSwgY29uZmlndXJlIGluIHRoZSBSVFAKKyAgICogc2Vzc2lvbiBtYW5hZ2VyIHRvIHNjYWxlIFJUQ1AuICovCisgIGdzdF9ydHNwc3JjX2NvbGxlY3RfYmFuZHdpZHRoIChzcmMsIHNkcCwgbWVkaWEsIHN0cmVhbSk7CisKKyAgLyogY29sbGVjdCBjb25uZWN0aW9uIGluZm8gKi8KKyAgZ3N0X3J0c3BzcmNfY29sbGVjdF9jb25uZWN0aW9ucyAoc3JjLCBzZHAsIG1lZGlhLCBzdHJlYW0pOworCisgIC8qIG1ha2UgdGhlIHBheWxvYWQgdHlwZSBtYXAgKi8KKyAgZ3N0X3J0c3BzcmNfY29sbGVjdF9wYXlsb2FkcyAoc3JjLCBzZHAsIG1lZGlhLCBzdHJlYW0pOworCisgIC8qIGNvbGxlY3QgcG9ydCBudW1iZXIgKi8KKyAgc3RyZWFtLT5wb3J0ID0gZ3N0X3NkcF9tZWRpYV9nZXRfcG9ydCAobWVkaWEpOworCisgIC8qIGdldCBjb250cm9sIHVybCB0byBjb25zdHJ1Y3QgdGhlIHNldHVwIHVybC4gVGhlIHNldHVwIHVybCBpcyB1c2VkIHRvCisgICAqIGNvbmZpZ3VyZSB0aGUgdHJhbnNwb3J0IG9mIHRoZSBzdHJlYW0gYW5kIGlzIHVzZWQgdG8gaWRlbnRpdHkgdGhlIHN0cmVhbSBpbgorICAgKiB0aGUgUlRQLUluZm8gaGVhZGVyIGZpZWxkIHJldHVybmVkIGZyb20gUExBWS4gKi8KKyAgY29udHJvbF91cmwgPSBnc3Rfc2RwX21lZGlhX2dldF9hdHRyaWJ1dGVfdmFsIChtZWRpYSwgImNvbnRyb2wiKTsKKyAgaWYgKGNvbnRyb2xfdXJsID09IE5VTEwpCisgICAgY29udHJvbF91cmwgPSBnc3Rfc2RwX21lc3NhZ2VfZ2V0X2F0dHJpYnV0ZV92YWxfbiAoc2RwLCAiY29udHJvbCIsIDApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN0cmVhbSAlZCwgKCVwKSIsIHN0cmVhbS0+aWQsIHN0cmVhbSk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIiBwb3J0OiAlZCIsIHN0cmVhbS0+cG9ydCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIiBjb250YWluZXI6ICVkIiwgc3RyZWFtLT5jb250YWluZXIpOworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICIgY29udHJvbDogJXMiLCBHU1RfU1RSX05VTEwgKGNvbnRyb2xfdXJsKSk7CisKKyAgLyogUkZDIDIzMjYsIEMuMzogbWlzc2luZyBjb250cm9sX3VybCBwZXJtaXR0ZWQgaW4gY2FzZSBvZiBhIHNpbmdsZSBzdHJlYW0gKi8KKyAgaWYgKGNvbnRyb2xfdXJsID09IE5VTEwgJiYgbl9zdHJlYW1zID09IDEpIHsKKyAgICBjb250cm9sX3VybCA9ICIiOworICB9CisKKyAgaWYgKGNvbnRyb2xfdXJsICE9IE5VTEwpIHsKKyAgICBzdHJlYW0tPmNvbnRyb2xfdXJsID0gZ19zdHJkdXAgKGNvbnRyb2xfdXJsKTsKKyAgICAvKiBCdWlsZCBhIGZ1bGx5IHF1YWxpZmllZCB1cmwgdXNpbmcgdGhlIGNvbnRlbnRfYmFzZSBpZiBhbnkgb3IgYnkgcHJlZml4aW5nCisgICAgICogdGhlIG9yaWdpbmFsIHJlcXVlc3QuCisgICAgICogSWYgdGhlIGNvbnRyb2xfdXJsIHN0YXJ0cyB3aXRoIGEgJy8nIG9yIGEgbm9uIHJ0c3A6IHByb3RvY29sIHdlIHdpbGwgbW9zdAorICAgICAqIGxpa2VseSBidWlsZCBhIFVSTCB0aGF0IHRoZSBzZXJ2ZXIgd2lsbCBmYWlsIHRvIHVuZGVyc3RhbmQsIHRoaXMgaXMgb2ssCisgICAgICogd2Ugd2lsbCBmYWlsIHRoZW4uICovCisgICAgaWYgKGdfc3RyX2hhc19wcmVmaXggKGNvbnRyb2xfdXJsLCAicnRzcDovLyIpKQorICAgICAgc3RyZWFtLT5jb25uaW5mby5sb2NhdGlvbiA9IGdfc3RyZHVwIChjb250cm9sX3VybCk7CisgICAgZWxzZSB7CisgICAgICBjb25zdCBnY2hhciAqYmFzZTsKKyAgICAgIGdib29sZWFuIGhhc19zbGFzaDsKKworICAgICAgaWYgKGdfc3RyY21wMCAoY29udHJvbF91cmwsICIqIikgPT0gMCkKKyAgICAgICAgY29udHJvbF91cmwgPSAiIjsKKworICAgICAgYmFzZSA9IGdldF9hZ2dyZWdhdGVfY29udHJvbCAoc3JjKTsKKworICAgICAgLyogY2hlY2sgaWYgdGhlIGJhc2UgZW5kcyBvciBjb250cm9sIHN0YXJ0cyB3aXRoIC8gKi8KKyAgICAgIGhhc19zbGFzaCA9IGdfc3RyX2hhc19wcmVmaXggKGNvbnRyb2xfdXJsLCAiLyIpOworICAgICAgaGFzX3NsYXNoID0gaGFzX3NsYXNoIHx8IGdfc3RyX2hhc19zdWZmaXggKGJhc2UsICIvIik7CisKKyAgICAgIC8qIGNvbmNhdGVuYXRlIHRoZSB0d28gc3RyaW5ncywgaW5zZXJ0IC8gd2hlbiBub3QgcHJlc2VudCAqLworICAgICAgc3RyZWFtLT5jb25uaW5mby5sb2NhdGlvbiA9CisgICAgICAgICAgZ19zdHJkdXBfcHJpbnRmICgiJXMlcyVzIiwgYmFzZSwgaGFzX3NsYXNoID8gIiIgOiAiLyIsIGNvbnRyb2xfdXJsKTsKKyAgICB9CisgIH0KKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiIHNldHVwOiAlcyIsCisgICAgICBHU1RfU1RSX05VTEwgKHN0cmVhbS0+Y29ubmluZm8ubG9jYXRpb24pKTsKKworICAvKiB3ZSBrZWVwIHRyYWNrIG9mIGFsbCBzdHJlYW1zICovCisgIHNyYy0+c3RyZWFtcyA9IGdfbGlzdF9hcHBlbmQgKHNyYy0+c3RyZWFtcywgc3RyZWFtKTsKKworICByZXR1cm4gc3RyZWFtOworCisgIC8qIEVSUk9SUyAqLworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWUgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BTdHJlYW0gKiBzdHJlYW0pCit7CisgIGdpbnQgaTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJmcmVlIHN0cmVhbSAlcCIsIHN0cmVhbSk7CisKKyAgZ19hcnJheV9mcmVlIChzdHJlYW0tPnB0bWFwLCBUUlVFKTsKKworICBnX2ZyZWUgKHN0cmVhbS0+ZGVzdGluYXRpb24pOworICBnX2ZyZWUgKHN0cmVhbS0+Y29udHJvbF91cmwpOworICBnX2ZyZWUgKHN0cmVhbS0+Y29ubmluZm8ubG9jYXRpb24pOworICBnX2ZyZWUgKHN0cmVhbS0+c3RyZWFtX2lkKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgaWYgKHN0cmVhbS0+dWRwc3JjW2ldKSB7CisgICAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHN0cmVhbS0+dWRwc3JjW2ldLCBHU1RfU1RBVEVfTlVMTCk7CisgICAgICBnc3RfYmluX3JlbW92ZSAoR1NUX0JJTl9DQVNUIChzcmMpLCBzdHJlYW0tPnVkcHNyY1tpXSk7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChzdHJlYW0tPnVkcHNyY1tpXSk7CisgICAgfQorICAgIGlmIChzdHJlYW0tPmNoYW5uZWxwYWRbaV0pCisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChzdHJlYW0tPmNoYW5uZWxwYWRbaV0pOworCisgICAgaWYgKHN0cmVhbS0+dWRwc2lua1tpXSkgeworICAgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzdHJlYW0tPnVkcHNpbmtbaV0sIEdTVF9TVEFURV9OVUxMKTsKKyAgICAgIGdzdF9iaW5fcmVtb3ZlIChHU1RfQklOX0NBU1QgKHNyYyksIHN0cmVhbS0+dWRwc2lua1tpXSk7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChzdHJlYW0tPnVkcHNpbmtbaV0pOworICAgIH0KKyAgfQorICBpZiAoc3RyZWFtLT5mYWtlc3JjKSB7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzdHJlYW0tPmZha2VzcmMsIEdTVF9TVEFURV9OVUxMKTsKKyAgICBnc3RfYmluX3JlbW92ZSAoR1NUX0JJTl9DQVNUIChzcmMpLCBzdHJlYW0tPmZha2VzcmMpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHN0cmVhbS0+ZmFrZXNyYyk7CisgIH0KKyAgaWYgKHN0cmVhbS0+c3JjcGFkKSB7CisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzdHJlYW0tPnNyY3BhZCwgRkFMU0UpOworICAgIGlmIChzdHJlYW0tPmFkZGVkKQorICAgICAgZ3N0X2VsZW1lbnRfcmVtb3ZlX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoc3JjKSwgc3RyZWFtLT5zcmNwYWQpOworICB9CisgIGlmIChzdHJlYW0tPnNydHBlbmMpCisgICAgZ3N0X29iamVjdF91bnJlZiAoc3RyZWFtLT5zcnRwZW5jKTsKKyAgaWYgKHN0cmVhbS0+c3J0cGRlYykKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzdHJlYW0tPnNydHBkZWMpOworICBpZiAoc3RyZWFtLT5zcnRjcHBhcmFtcykKKyAgICBnc3RfY2Fwc191bnJlZiAoc3RyZWFtLT5zcnRjcHBhcmFtcyk7CisgIGlmIChzdHJlYW0tPm1pa2V5KQorICAgIGdzdF9taWtleV9tZXNzYWdlX3VucmVmIChzdHJlYW0tPm1pa2V5KTsKKyAgaWYgKHN0cmVhbS0+cnRjcHBhZCkKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzdHJlYW0tPnJ0Y3BwYWQpOworICBpZiAoc3RyZWFtLT5zZXNzaW9uKQorICAgIGdfb2JqZWN0X3VucmVmIChzdHJlYW0tPnNlc3Npb24pOworICBpZiAoc3RyZWFtLT5ydHhfcHRfbWFwKQorICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoc3RyZWFtLT5ydHhfcHRfbWFwKTsKKworICBnX211dGV4X2NsZWFyICgmc3RyZWFtLT5jb25uaW5mby5zZW5kX2xvY2spOworICBnX211dGV4X2NsZWFyICgmc3RyZWFtLT5jb25uaW5mby5yZWN2X2xvY2spOworCisgIGdfZnJlZSAoc3RyZWFtKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX2NsZWFudXAgKEdzdFJUU1BTcmMgKiBzcmMpCit7CisgIEdMaXN0ICp3YWxrOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNsZWFudXAiKTsKKworICBmb3IgKHdhbGsgPSBzcmMtPnN0cmVhbXM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RSVFNQU3RyZWFtICpzdHJlYW0gPSAoR3N0UlRTUFN0cmVhbSAqKSB3YWxrLT5kYXRhOworCisgICAgZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWUgKHNyYywgc3RyZWFtKTsKKyAgfQorICBnX2xpc3RfZnJlZSAoc3JjLT5zdHJlYW1zKTsKKyAgc3JjLT5zdHJlYW1zID0gTlVMTDsKKyAgaWYgKHNyYy0+bWFuYWdlcikgeworICAgIGlmIChzcmMtPm1hbmFnZXJfc2lnX2lkKSB7CisgICAgICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QgKHNyYy0+bWFuYWdlciwgc3JjLT5tYW5hZ2VyX3NpZ19pZCk7CisgICAgICBzcmMtPm1hbmFnZXJfc2lnX2lkID0gMDsKKyAgICB9CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzcmMtPm1hbmFnZXIsIEdTVF9TVEFURV9OVUxMKTsKKyAgICBnc3RfYmluX3JlbW92ZSAoR1NUX0JJTl9DQVNUIChzcmMpLCBzcmMtPm1hbmFnZXIpOworICAgIHNyYy0+bWFuYWdlciA9IE5VTEw7CisgIH0KKyAgaWYgKHNyYy0+cHJvcHMpCisgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChzcmMtPnByb3BzKTsKKyAgc3JjLT5wcm9wcyA9IE5VTEw7CisKKyAgZ19mcmVlIChzcmMtPmNvbnRlbnRfYmFzZSk7CisgIHNyYy0+Y29udGVudF9iYXNlID0gTlVMTDsKKworICBnX2ZyZWUgKHNyYy0+Y29udHJvbCk7CisgIHNyYy0+Y29udHJvbCA9IE5VTEw7CisKKyAgaWYgKHNyYy0+cmFuZ2UpCisgICAgZ3N0X3J0c3BfcmFuZ2VfZnJlZSAoc3JjLT5yYW5nZSk7CisgIHNyYy0+cmFuZ2UgPSBOVUxMOworCisgIC8qIGRvbid0IGNsZWFyIHRoZSBTRFAgd2hlbiBpdCB3YXMgdXNlZCBpbiB0aGUgdXJsICovCisgIGlmIChzcmMtPnNkcCAmJiAhc3JjLT5mcm9tX3NkcCkgeworICAgIGdzdF9zZHBfbWVzc2FnZV9mcmVlIChzcmMtPnNkcCk7CisgICAgc3JjLT5zZHAgPSBOVUxMOworICB9CisKKyAgc3JjLT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKworICBpZiAoc3JjLT5wcm92aWRlZF9jbG9jaykgeworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNyYy0+cHJvdmlkZWRfY2xvY2spOworICAgIHNyYy0+cHJvdmlkZWRfY2xvY2sgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfYWxsb2NfdWRwX3BvcnRzIChHc3RSVFNQU3RyZWFtICogc3RyZWFtLAorICAgIGdpbnQgKiBydHBwb3J0LCBnaW50ICogcnRjcHBvcnQpCit7CisgIEdzdFJUU1BTcmMgKnNyYzsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RFbGVtZW50ICp1ZHBzcmMwLCAqdWRwc3JjMTsKKyAgZ2ludCB0bXBfcnRwLCB0bXBfcnRjcDsKKyAgZ3VpbnQgY291bnQ7CisgIGNvbnN0IGdjaGFyICpob3N0OworCisgIHNyYyA9IHN0cmVhbS0+cGFyZW50OworCisgIHVkcHNyYzAgPSBOVUxMOworICB1ZHBzcmMxID0gTlVMTDsKKyAgY291bnQgPSAwOworCisgIC8qIFN0YXJ0IGF0IG5leHQgcG9ydCAqLworICB0bXBfcnRwID0gc3JjLT5uZXh0X3BvcnRfbnVtOworCisgIGlmIChzdHJlYW0tPmlzX2lwdjYpCisgICAgaG9zdCA9ICJ1ZHA6Ly9bOjowXSI7CisgIGVsc2UKKyAgICBob3N0ID0gInVkcDovLzAuMC4wLjAiOworCisgIC8qIHRyeSB0byBhbGxvY2F0ZSAyIFVEUCBwb3J0cywgdGhlIFJUUCBwb3J0IHNob3VsZCBiZSBhbiBldmVuCisgICAqIG51bWJlciBhbmQgdGhlIFJUQ1AgcG9ydCBzaG91bGQgYmUgdGhlIG5leHQgKHVuZXZlbikgcG9ydCAqLworYWdhaW46CisKKyAgaWYgKHRtcF9ydHAgIT0gMCAmJiBzcmMtPmNsaWVudF9wb3J0X3JhbmdlLm1heCA+IDAgJiYKKyAgICAgIHRtcF9ydHAgPj0gc3JjLT5jbGllbnRfcG9ydF9yYW5nZS5tYXgpCisgICAgZ290byBub19wb3J0czsKKworICB1ZHBzcmMwID0gZ3N0X2VsZW1lbnRfbWFrZV9mcm9tX3VyaSAoR1NUX1VSSV9TUkMsIGhvc3QsIE5VTEwsIE5VTEwpOworICBpZiAodWRwc3JjMCA9PSBOVUxMKQorICAgIGdvdG8gbm9fdWRwX3Byb3RvY29sOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUICh1ZHBzcmMwKSwgInBvcnQiLCB0bXBfcnRwLCAicmV1c2UiLCBGQUxTRSwgTlVMTCk7CisKKyAgaWYgKHNyYy0+dWRwX2J1ZmZlcl9zaXplICE9IDApCisgICAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAodWRwc3JjMCksICJidWZmZXItc2l6ZSIsIHNyYy0+dWRwX2J1ZmZlcl9zaXplLAorICAgICAgICBOVUxMKTsKKworICByZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHVkcHNyYzAsIEdTVF9TVEFURV9SRUFEWSk7CisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKSB7CisgICAgaWYgKHRtcF9ydHAgIT0gMCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiVW5hYmxlIHRvIG1ha2UgdWRwc3JjIGZyb20gUlRQIHBvcnQgJWQiLCB0bXBfcnRwKTsKKworICAgICAgdG1wX3J0cCArPSAyOworICAgICAgaWYgKCsrY291bnQgPiBzcmMtPnJldHJ5KQorICAgICAgICBnb3RvIG5vX3BvcnRzOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJmcmVlIFJUUCB1ZHBzcmMiKTsKKyAgICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAodWRwc3JjMCwgR1NUX1NUQVRFX05VTEwpOworICAgICAgZ3N0X29iamVjdF91bnJlZiAodWRwc3JjMCk7CisgICAgICB1ZHBzcmMwID0gTlVMTDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicmV0cnkgJWQiLCBjb3VudCk7CisgICAgICBnb3RvIGFnYWluOworICAgIH0KKyAgICBnb3RvIG5vX3VkcF9wcm90b2NvbDsKKyAgfQorCisgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKHVkcHNyYzApLCAicG9ydCIsICZ0bXBfcnRwLCBOVUxMKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZ290IFJUUCBwb3J0ICVkIiwgdG1wX3J0cCk7CisKKyAgLyogY2hlY2sgaWYgcG9ydCBpcyBldmVuICovCisgIGlmICgodG1wX3J0cCAmIDB4MDEpICE9IDApIHsKKyAgICAvKiBwb3J0IG5vdCBldmVuLCBjbG9zZSBhbmQgYWxsb2NhdGUgYW5vdGhlciAqLworICAgIGlmICgrK2NvdW50ID4gc3JjLT5yZXRyeSkKKyAgICAgIGdvdG8gbm9fcG9ydHM7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJSVFAgcG9ydCBub3QgZXZlbiIpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZnJlZSBSVFAgdWRwc3JjIik7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlICh1ZHBzcmMwLCBHU1RfU1RBVEVfTlVMTCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAodWRwc3JjMCk7CisgICAgdWRwc3JjMCA9IE5VTEw7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJyZXRyeSAlZCIsIGNvdW50KTsKKyAgICB0bXBfcnRwKys7CisgICAgZ290byBhZ2FpbjsKKyAgfQorCisgIC8qIGFsbG9jYXRlIHBvcnQrMSBmb3IgUlRDUCBub3cgKi8KKyAgdWRwc3JjMSA9IGdzdF9lbGVtZW50X21ha2VfZnJvbV91cmkgKEdTVF9VUklfU1JDLCBob3N0LCBOVUxMLCBOVUxMKTsKKyAgaWYgKHVkcHNyYzEgPT0gTlVMTCkKKyAgICBnb3RvIG5vX3VkcF9ydGNwX3Byb3RvY29sOworCisgIC8qIHNldCBwb3J0ICovCisgIHRtcF9ydGNwID0gdG1wX3J0cCArIDE7CisgIGlmIChzcmMtPmNsaWVudF9wb3J0X3JhbmdlLm1heCA+IDAgJiYgdG1wX3J0Y3AgPiBzcmMtPmNsaWVudF9wb3J0X3JhbmdlLm1heCkKKyAgICBnb3RvIG5vX3BvcnRzOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHVkcHNyYzEpLCAicG9ydCIsIHRtcF9ydGNwLCAicmV1c2UiLCBGQUxTRSwgTlVMTCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic3RhcnRpbmcgUlRDUCBvbiBwb3J0ICVkIiwgdG1wX3J0Y3ApOworICByZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHVkcHNyYzEsIEdTVF9TVEFURV9SRUFEWSk7CisgIC8qIHRtcF9ydGNwIHBvcnQgaXMgYnVzeSBhbHJlYWR5IDogcmV0cnkgdG8gbWFrZSBydHAvcnRjcCBwYWlyICovCisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiVW5hYmxlIHRvIG1ha2UgdWRwc3JjIGZyb20gUlRDUCBwb3J0ICVkIiwgdG1wX3J0Y3ApOworCisgICAgaWYgKCsrY291bnQgPiBzcmMtPnJldHJ5KQorICAgICAgZ290byBub19wb3J0czsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImZyZWUgUlRQIHVkcHNyYyIpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAodWRwc3JjMCwgR1NUX1NUQVRFX05VTEwpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHVkcHNyYzApOworICAgIHVkcHNyYzAgPSBOVUxMOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZnJlZSBSVENQIHVkcHNyYyIpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAodWRwc3JjMSwgR1NUX1NUQVRFX05VTEwpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHVkcHNyYzEpOworICAgIHVkcHNyYzEgPSBOVUxMOworCisgICAgdG1wX3J0cCArPSAyOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInJldHJ5ICVkIiwgY291bnQpOworICAgIGdvdG8gYWdhaW47CisgIH0KKworICAvKiBhbGwgZmluZSwgZG8gcG9ydCBjaGVjayAqLworICBnX29iamVjdF9nZXQgKEdfT0JKRUNUICh1ZHBzcmMwKSwgInBvcnQiLCBydHBwb3J0LCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChHX09CSkVDVCAodWRwc3JjMSksICJwb3J0IiwgcnRjcHBvcnQsIE5VTEwpOworCisgIC8qIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uLi4gKi8KKyAgaWYgKCpydHBwb3J0ICE9IHRtcF9ydHAgfHwgKnJ0Y3Bwb3J0ICE9IHRtcF9ydGNwKQorICAgIGdvdG8gcG9ydF9lcnJvcjsKKworICAvKiB3ZSBrZWVwIHRoZXNlIGVsZW1lbnRzLCB3ZSBjb25maWd1cmUgYWxsIGluIGNvbmZpZ3VyZV90cmFuc3BvcnQgd2hlbiB0aGUKKyAgICogc2VydmVyIHRvbGQgdXMgdG8gcmVhbGx5IHVzZSB0aGUgVURQIHBvcnRzLiAqLworICBzdHJlYW0tPnVkcHNyY1swXSA9IGdzdF9vYmplY3RfcmVmX3NpbmsgKHVkcHNyYzApOworICBzdHJlYW0tPnVkcHNyY1sxXSA9IGdzdF9vYmplY3RfcmVmX3NpbmsgKHVkcHNyYzEpOworICBnc3RfZWxlbWVudF9zZXRfbG9ja2VkX3N0YXRlIChzdHJlYW0tPnVkcHNyY1swXSwgVFJVRSk7CisgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHN0cmVhbS0+dWRwc3JjWzFdLCBUUlVFKTsKKworICAvKiBrZWVwIHRyYWNrIG9mIG5leHQgYXZhaWxhYmxlIHBvcnQgbnVtYmVyIHdoZW4gd2UgaGF2ZSBhIHJhbmdlCisgICAqIGNvbmZpZ3VyZWQgKi8KKyAgaWYgKHNyYy0+bmV4dF9wb3J0X251bSAhPSAwKQorICAgIHNyYy0+bmV4dF9wb3J0X251bSA9IHRtcF9ydGNwICsgMTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK25vX3VkcF9wcm90b2NvbDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNvdWxkIG5vdCBnZXQgVURQIHNvdXJjZSIpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorbm9fcG9ydHM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb3VsZCBub3QgYWxsb2NhdGUgVURQIHBvcnQgcGFpciBhZnRlciAlZCByZXRyaWVzIiwKKyAgICAgICAgY291bnQpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorbm9fdWRwX3J0Y3BfcHJvdG9jb2w6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb3VsZCBub3QgZ2V0IFVEUCBzb3VyY2UgZm9yIFJUQ1AiKTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KK3BvcnRfZXJyb3I6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJwb3J0cyBkb24ndCBtYXRjaCBydHA6ICVkPC0+JWQsIHJ0Y3A6ICVkPC0+JWQiLAorICAgICAgICB0bXBfcnRwLCAqcnRwcG9ydCwgdG1wX3J0Y3AsICpydGNwcG9ydCk7CisgICAgZ290byBjbGVhbnVwOworICB9CitjbGVhbnVwOgorICB7CisgICAgaWYgKHVkcHNyYzApIHsKKyAgICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAodWRwc3JjMCwgR1NUX1NUQVRFX05VTEwpOworICAgICAgZ3N0X29iamVjdF91bnJlZiAodWRwc3JjMCk7CisgICAgfQorICAgIGlmICh1ZHBzcmMxKSB7CisgICAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHVkcHNyYzEsIEdTVF9TVEFURV9OVUxMKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHVkcHNyYzEpOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX3NldF9zdGF0ZSAoR3N0UlRTUFNyYyAqIHNyYywgR3N0U3RhdGUgc3RhdGUpCit7CisgIEdMaXN0ICp3YWxrOworCisgIGlmIChzcmMtPm1hbmFnZXIpCisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChHU1RfRUxFTUVOVF9DQVNUIChzcmMtPm1hbmFnZXIpLCBzdGF0ZSk7CisKKyAgZm9yICh3YWxrID0gc3JjLT5zdHJlYW1zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtID0gKEdzdFJUU1BTdHJlYW0gKikgd2Fsay0+ZGF0YTsKKyAgICBnaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICBpZiAoc3RyZWFtLT51ZHBzcmNbaV0pCisgICAgICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc3RyZWFtLT51ZHBzcmNbaV0sIHN0YXRlKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX2ZsdXNoIChHc3RSVFNQU3JjICogc3JjLCBnYm9vbGVhbiBmbHVzaCwgZ2Jvb2xlYW4gcGxheWluZykKK3sKKyAgR3N0RXZlbnQgKmV2ZW50OworICBnaW50IGNtZDsKKyAgR3N0U3RhdGUgc3RhdGU7CisKKyAgaWYgKGZsdXNoKSB7CisgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0YXJ0ICgpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN0YXJ0IGZsdXNoIik7CisgICAgY21kID0gQ01EX1dBSVQ7CisgICAgc3RhdGUgPSBHU1RfU1RBVEVfUEFVU0VEOworICB9IGVsc2UgeworICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19mbHVzaF9zdG9wIChGQUxTRSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic3RvcCBmbHVzaDsgcGxheWluZyAlZCIsIHBsYXlpbmcpOworICAgIGNtZCA9IENNRF9MT09QOworICAgIGlmIChwbGF5aW5nKQorICAgICAgc3RhdGUgPSBHU1RfU1RBVEVfUExBWUlORzsKKyAgICBlbHNlCisgICAgICBzdGF0ZSA9IEdTVF9TVEFURV9QQVVTRUQ7CisgIH0KKyAgZ3N0X3J0c3BzcmNfcHVzaF9ldmVudCAoc3JjLCBldmVudCk7CisgIGdzdF9ydHNwc3JjX2xvb3Bfc2VuZF9jbWQgKHNyYywgY21kLCBDTURfTE9PUCk7CisgIGdzdF9ydHNwc3JjX3NldF9zdGF0ZSAoc3JjLCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBHc3RSVFNQUmVzdWx0Citnc3RfcnRzcHNyY19jb25uZWN0aW9uX3NlbmQgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BDb25uSW5mbyAqIGNvbm5pbmZvLAorICAgIEdzdFJUU1BNZXNzYWdlICogbWVzc2FnZSwgR1RpbWVWYWwgKiB0aW1lb3V0KQoreworICBHc3RSVFNQUmVzdWx0IHJldDsKKworICBpZiAoY29ubmluZm8tPmNvbm5lY3Rpb24pIHsKKyAgICBnX211dGV4X2xvY2sgKCZjb25uaW5mby0+c2VuZF9sb2NrKTsKKyAgICByZXQgPSBnc3RfcnRzcF9jb25uZWN0aW9uX3NlbmQgKGNvbm5pbmZvLT5jb25uZWN0aW9uLCBtZXNzYWdlLCB0aW1lb3V0KTsKKyAgICBnX211dGV4X3VubG9jayAoJmNvbm5pbmZvLT5zZW5kX2xvY2spOworICB9IGVsc2UgeworICAgIHJldCA9IEdTVF9SVFNQX0VSUk9SOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX2Nvbm5lY3Rpb25fcmVjZWl2ZSAoR3N0UlRTUFNyYyAqIHNyYywgR3N0UlRTUENvbm5JbmZvICogY29ubmluZm8sCisgICAgR3N0UlRTUE1lc3NhZ2UgKiBtZXNzYWdlLCBHVGltZVZhbCAqIHRpbWVvdXQpCit7CisgIEdzdFJUU1BSZXN1bHQgcmV0OworCisgIGlmIChjb25uaW5mby0+Y29ubmVjdGlvbikgeworICAgIGdfbXV0ZXhfbG9jayAoJmNvbm5pbmZvLT5yZWN2X2xvY2spOworICAgIHJldCA9IGdzdF9ydHNwX2Nvbm5lY3Rpb25fcmVjZWl2ZSAoY29ubmluZm8tPmNvbm5lY3Rpb24sIG1lc3NhZ2UsIHRpbWVvdXQpOworICAgIGdfbXV0ZXhfdW5sb2NrICgmY29ubmluZm8tPnJlY3ZfbG9jayk7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gR1NUX1JUU1BfRVJST1I7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfZ2V0X3Bvc2l0aW9uIChHc3RSVFNQU3JjICogc3JjKQoreworICBHc3RRdWVyeSAqcXVlcnk7CisgIEdMaXN0ICp3YWxrOworCisgIHF1ZXJ5ID0gZ3N0X3F1ZXJ5X25ld19wb3NpdGlvbiAoR1NUX0ZPUk1BVF9USU1FKTsKKyAgLyogIHNob3VsZCBiZSBrbm93biBzb21ld2hlcmUgZG93biB0aGUgc3RyZWFtIChlLmcuIGppdHRlcmJ1ZmZlcikgKi8KKyAgZm9yICh3YWxrID0gc3JjLT5zdHJlYW1zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtID0gKEdzdFJUU1BTdHJlYW0gKikgd2Fsay0+ZGF0YTsKKyAgICBHc3RGb3JtYXQgZm10OworICAgIGdpbnQ2NCBwb3M7CisKKyAgICBpZiAoc3RyZWFtLT5zcmNwYWQpIHsKKyAgICAgIGlmIChnc3RfcGFkX3F1ZXJ5IChzdHJlYW0tPnNyY3BhZCwgcXVlcnkpKSB7CisgICAgICAgIGdzdF9xdWVyeV9wYXJzZV9wb3NpdGlvbiAocXVlcnksICZmbXQsICZwb3MpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJyZXRhaW5pbmcgcG9zaXRpb24gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAocG9zKSk7CisgICAgICAgIHNyYy0+bGFzdF9wb3MgPSBwb3M7CisgICAgICAgIGdvdG8gb3V0OworICAgICAgfQorICAgIH0KKyAgfQorCisgIHNyYy0+bGFzdF9wb3MgPSAwOworCitvdXQ6CisKKyAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfcGVyZm9ybV9zZWVrIChHc3RSVFNQU3JjICogc3JjLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBnZG91YmxlIHJhdGU7CisgIEdzdEZvcm1hdCBmb3JtYXQ7CisgIEdzdFNlZWtGbGFncyBmbGFnczsKKyAgR3N0U2Vla1R5cGUgY3VyX3R5cGUgPSBHU1RfU0VFS19UWVBFX05PTkUsIHN0b3BfdHlwZTsKKyAgZ2ludDY0IGN1ciwgc3RvcDsKKyAgZ2Jvb2xlYW4gZmx1c2gsIHNraXA7CisgIGdib29sZWFuIHVwZGF0ZTsKKyAgZ2Jvb2xlYW4gcGxheWluZzsKKyAgR3N0U2VnbWVudCBzZWVrc2VnbWVudCA9IHsgMCwgfTsKKyAgR0xpc3QgKndhbGs7CisgIGNvbnN0IGdjaGFyICpzZWVrX3N0eWxlID0gTlVMTDsKKworICBpZiAoZXZlbnQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJkb2luZyBzZWVrIHdpdGggZXZlbnQgJSIgR1NUX1BUUl9GT1JNQVQsIGV2ZW50KTsKKworICAgIGdzdF9ldmVudF9wYXJzZV9zZWVrIChldmVudCwgJnJhdGUsICZmb3JtYXQsICZmbGFncywKKyAgICAgICAgJmN1cl90eXBlLCAmY3VyLCAmc3RvcF90eXBlLCAmc3RvcCk7CisKKyAgICAvKiBubyBuZWdhdGl2ZSByYXRlcyB5ZXQgKi8KKyAgICBpZiAocmF0ZSA8IDAuMCkKKyAgICAgIGdvdG8gbmVnYXRpdmVfcmF0ZTsKKworICAgIC8qIHdlIG5lZWQgVElNRSBmb3JtYXQgKi8KKyAgICBpZiAoZm9ybWF0ICE9IHNyYy0+c2VnbWVudC5mb3JtYXQpCisgICAgICBnb3RvIG5vX2Zvcm1hdDsKKworICAgIC8qIENoZWNrIGlmIHdlIGFyZSBub3QgYXQgYWxsIHNlZWthYmxlICovCisgICAgaWYgKHNyYy0+c2Vla2FibGUgPT0gLTEuMCkKKyAgICAgIGdvdG8gbm90X3NlZWthYmxlOworCisgICAgLyogQWRkaXRpb25hbCBzZWVraW5nLXRvLWJlZ2lubmluZy1vbmx5IGNoZWNrICovCisgICAgaWYgKHNyYy0+c2Vla2FibGUgPT0gMC4wICYmIGN1ciAhPSAwKQorICAgICAgZ290byBub3Rfc2Vla2FibGU7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZG9pbmcgc2VlayB3aXRob3V0IGV2ZW50Iik7CisgICAgZmxhZ3MgPSAwOworICAgIGN1cl90eXBlID0gR1NUX1NFRUtfVFlQRV9TRVQ7CisgICAgc3RvcF90eXBlID0gR1NUX1NFRUtfVFlQRV9TRVQ7CisgIH0KKworICAvKiBnZXQgZmx1c2ggZmxhZyAqLworICBmbHVzaCA9IGZsYWdzICYgR1NUX1NFRUtfRkxBR19GTFVTSDsKKyAgc2tpcCA9IGZsYWdzICYgR1NUX1NFRUtfRkxBR19TS0lQOworCisgIC8qIG5vdyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgc3RyZWFtaW5nIHRocmVhZCBpcyBzdG9wcGVkLiBXZSBkbyB0aGlzIGJ5CisgICAqIGVpdGhlciBzZW5kaW5nIGEgRkxVU0hfU1RBUlQgZXZlbnQgZG93bnN0cmVhbSB3aGljaCB3aWxsIGNhdXNlIHRoZQorICAgKiBzdHJlYW1pbmcgdGhyZWFkIHRvIHN0b3Agd2l0aCBhIFdST05HX1NUQVRFLgorICAgKiBGb3IgYSBub24tZmx1c2hpbmcgc2VlayB3ZSBzaW1wbHkgcGF1c2UgdGhlIHRhc2ssIHdoaWNoIHdpbGwgaGFwcGVuIGFzIHNvb24KKyAgICogYXMgaXQgY29tcGxldGVzIG9uZSBpdGVyYXRpb24gKGFuZCB0aHVzIG1pZ2h0IGJsb2NrIHdoZW4gdGhlIHNpbmsgaXMKKyAgICogYmxvY2tpbmcgaW4gcHJlcm9sbCkuICovCisgIGlmIChmbHVzaCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN0YXJ0aW5nIGZsdXNoIik7CisgICAgZ3N0X3J0c3BzcmNfZmx1c2ggKHNyYywgVFJVRSwgRkFMU0UpOworICB9IGVsc2UgeworICAgIGlmIChzcmMtPnRhc2spIHsKKyAgICAgIGdzdF90YXNrX3BhdXNlIChzcmMtPnRhc2spOworICAgIH0KKyAgfQorCisgIC8qIHdlIHNob3VsZCBub3cgYmUgYWJsZSB0byBncmFiIHRoZSBzdHJlYW1pbmcgdGhyZWFkIGJlY2F1c2Ugd2Ugc3RvcHBlZCBpdAorICAgKiB3aXRoIHRoZSBhYm92ZSBmbHVzaC9wYXVzZSBjb2RlICovCisgIEdTVF9SVFNQX1NUUkVBTV9MT0NLIChzcmMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN0b3BwZWQgc3RyZWFtaW5nIik7CisKKyAgLyogc3RvcCBmbHVzaGluZyB0aGUgcnRzcCBjb25uZWN0aW9uIHNvIHdlIGNhbiBzZW5kIFBBVVNFL1BMQVkgYmVsb3cgKi8KKyAgZ3N0X3J0c3BzcmNfY29ubmVjdGlvbl9mbHVzaCAoc3JjLCBGQUxTRSk7CisKKyAgLyogY29weSBzZWdtZW50LCB3ZSBuZWVkIHRoaXMgYmVjYXVzZSB3ZSBzdGlsbCBuZWVkIHRoZSBvbGQKKyAgICogc2VnbWVudCB3aGVuIHdlIGNsb3NlIHRoZSBjdXJyZW50IHNlZ21lbnQuICovCisgIG1lbWNweSAoJnNlZWtzZWdtZW50LCAmc3JjLT5zZWdtZW50LCBzaXplb2YgKEdzdFNlZ21lbnQpKTsKKworICAvKiBjb25maWd1cmUgdGhlIHNlZWsgcGFyYW1ldGVycyBpbiB0aGUgc2Vla3NlZ21lbnQuIFdlIHdpbGwgdGhlbiBoYXZlIHRoZQorICAgKiByaWdodCB2YWx1ZXMgaW4gdGhlIHNlZ21lbnQgdG8gcGVyZm9ybSB0aGUgc2VlayAqLworICBpZiAoZXZlbnQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb25maWd1cmluZyBzZWVrIik7CisgICAgZ3N0X3NlZ21lbnRfZG9fc2VlayAoJnNlZWtzZWdtZW50LCByYXRlLCBmb3JtYXQsIGZsYWdzLAorICAgICAgICBjdXJfdHlwZSwgY3VyLCBzdG9wX3R5cGUsIHN0b3AsICZ1cGRhdGUpOworICB9CisKKyAgLyogZmlndXJlIG91dCB0aGUgbGFzdCBwb3NpdGlvbiB3ZSBuZWVkIHRvIHBsYXkuIElmIGl0J3MgY29uZmlndXJlZCAoc3RvcCAhPQorICAgKiAtMSksIHVzZSB0aGF0LCBlbHNlIHdlIHBsYXkgdW50aWwgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBmaWxlICovCisgIGlmICgoc3RvcCA9IHNlZWtzZWdtZW50LnN0b3ApID09IC0xKQorICAgIHN0b3AgPSBzZWVrc2VnbWVudC5kdXJhdGlvbjsKKworICAvKiBpZiB3ZSB3ZXJlIHBsYXlpbmcsIHBhdXNlIGZpcnN0ICovCisgIHBsYXlpbmcgPSAoc3JjLT5zdGF0ZSA9PSBHU1RfUlRTUF9TVEFURV9QTEFZSU5HKTsKKyAgaWYgKHBsYXlpbmcpIHsKKyAgICAvKiBvYnRhaW4gY3VycmVudCBwb3NpdGlvbiBpbiBjYXNlIHNlZWsgZmFpbHMgKi8KKyAgICBnc3RfcnRzcHNyY19nZXRfcG9zaXRpb24gKHNyYyk7CisgICAgZ3N0X3J0c3BzcmNfcGF1c2UgKHNyYywgRkFMU0UpOworICB9CisgIHNyYy0+c2tpcCA9IHNraXA7CisKKyAgc3JjLT5zdGF0ZSA9IEdTVF9SVFNQX1NUQVRFX1NFRUtJTkc7CisKKyAgLyogUExBWSB3aWxsIGFkZCB0aGUgcmFuZ2UgaGVhZGVyIG5vdy4gKi8KKyAgc3JjLT5uZWVkX3JhbmdlID0gVFJVRTsKKworICAvKiBwcmVwYXJlIGZvciBzdHJlYW1pbmcgYWdhaW4gKi8KKyAgaWYgKGZsdXNoKSB7CisgICAgLyogaWYgd2Ugc3RhcnRlZCBmbHVzaCwgd2Ugc3RvcCBub3cgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdG9wcGluZyBmbHVzaCIpOworICAgIGdzdF9ydHNwc3JjX2ZsdXNoIChzcmMsIEZBTFNFLCBwbGF5aW5nKTsKKyAgfQorCisgIC8qIG5vdyB3ZSBkaWQgdGhlIHNlZWsgYW5kIGNhbiBhY3RpdmF0ZSB0aGUgbmV3IHNlZ21lbnQgdmFsdWVzICovCisgIG1lbWNweSAoJnNyYy0+c2VnbWVudCwgJnNlZWtzZWdtZW50LCBzaXplb2YgKEdzdFNlZ21lbnQpKTsKKworICAvKiBpZiB3ZSdyZSBkb2luZyBhIHNlZ21lbnQgc2VlaywgcG9zdCBhIFNFR01FTlRfU1RBUlQgbWVzc2FnZSAqLworICBpZiAoc3JjLT5zZWdtZW50LmZsYWdzICYgR1NUX1NFRUtfRkxBR19TRUdNRU5UKSB7CisgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUIChzcmMpLAorICAgICAgICBnc3RfbWVzc2FnZV9uZXdfc2VnbWVudF9zdGFydCAoR1NUX09CSkVDVF9DQVNUIChzcmMpLAorICAgICAgICAgICAgc3JjLT5zZWdtZW50LmZvcm1hdCwgc3JjLT5zZWdtZW50LnBvc2l0aW9uKSk7CisgIH0KKworICAvKiBub3cgY3JlYXRlIHRoZSBuZXdzZWdtZW50ICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIkNyZWF0aW5nIG5ld3NlZ21lbnQgZnJvbSAlIiBHX0dJTlQ2NF9GT1JNQVQKKyAgICAgICIgdG8gJSIgR19HSU5UNjRfRk9STUFULCBzcmMtPnNlZ21lbnQucG9zaXRpb24sIHN0b3ApOworCisgIC8qIG1hcmsgZGlzY29udCAqLworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJtYXJrIERJU0NPTlQsIHdlIGRpZCBhIHNlZWsgdG8gYW5vdGhlciBwb3NpdGlvbiIpOworICBmb3IgKHdhbGsgPSBzcmMtPnN0cmVhbXM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RSVFNQU3RyZWFtICpzdHJlYW0gPSAoR3N0UlRTUFN0cmVhbSAqKSB3YWxrLT5kYXRhOworICAgIHN0cmVhbS0+ZGlzY29udCA9IFRSVUU7CisgIH0KKworICAvKiBhbmQgY29udGludWUgcGxheWluZyBpZiBuZWVkZWQgKi8KKyAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworICBwbGF5aW5nID0gKEdTVF9TVEFURV9QRU5ESU5HIChzcmMpID09IEdTVF9TVEFURV9WT0lEX1BFTkRJTkcKKyAgICAgICYmIEdTVF9TVEFURSAoc3JjKSA9PSBHU1RfU1RBVEVfUExBWUlORykKKyAgICAgIHx8IChHU1RfU1RBVEVfUEVORElORyAoc3JjKSA9PSBHU1RfU1RBVEVfUExBWUlORyk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcmMpOworCisgIGlmIChzcmMtPnZlcnNpb24gPj0gR1NUX1JUU1BfVkVSU0lPTl8yXzApIHsKKyAgICBpZiAoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0FDQ1VSQVRFKQorICAgICAgc2Vla19zdHlsZSA9ICJSQVAiOworICAgIGVsc2UgaWYgKGZsYWdzICYgR1NUX1NFRUtfRkxBR19LRVlfVU5JVCkKKyAgICAgIHNlZWtfc3R5bGUgPSAiQ29SQVAiOworICAgIGVsc2UgaWYgKGZsYWdzICYgR1NUX1NFRUtfRkxBR19LRVlfVU5JVAorICAgICAgICAmJiBmbGFncyAmIEdTVF9TRUVLX0ZMQUdfU05BUF9CRUZPUkUpCisgICAgICBzZWVrX3N0eWxlID0gIkZpcnN0LVByaW9yIjsKKyAgICBlbHNlIGlmIChmbGFncyAmIEdTVF9TRUVLX0ZMQUdfS0VZX1VOSVQgJiYgZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NOQVBfQUZURVIpCisgICAgICBzZWVrX3N0eWxlID0gIk5leHQiOworICB9CisKKyAgaWYgKHBsYXlpbmcpCisgICAgZ3N0X3J0c3BzcmNfcGxheSAoc3JjLCAmc2Vla3NlZ21lbnQsIEZBTFNFLCBzZWVrX3N0eWxlKTsKKworICBHU1RfUlRTUF9TVFJFQU1fVU5MT0NLIChzcmMpOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworbmVnYXRpdmVfcmF0ZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIm5lZ2F0aXZlIHBsYXliYWNrIHJhdGVzIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX2Zvcm1hdDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInVuc3VwcG9ydGVkIGZvcm1hdCBnaXZlbiwgc2VlayBhYm9ydGVkLiIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm90X3NlZWthYmxlOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic3RyZWFtIGlzIG5vdCBzZWVrYWJsZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHNwc3JjX2hhbmRsZV9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFJUU1BTcmMgKnNyYzsKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKyAgZ2Jvb2xlYW4gZm9yd2FyZDsKKworICBzcmMgPSBHU1RfUlRTUFNSQ19DQVNUIChwYXJlbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInBhZCAlczolcyByZWNlaXZlZCBldmVudCAlcyIsCisgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKHBhZCksIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICAgIHJlcyA9IGdzdF9ydHNwc3JjX3BlcmZvcm1fc2VlayAoc3JjLCBldmVudCk7CisgICAgICBmb3J3YXJkID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9RT1M6CisgICAgY2FzZSBHU1RfRVZFTlRfTkFWSUdBVElPTjoKKyAgICBjYXNlIEdTVF9FVkVOVF9MQVRFTkNZOgorICAgIGRlZmF1bHQ6CisgICAgICBmb3J3YXJkID0gVFJVRTsKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChmb3J3YXJkKSB7CisgICAgR3N0UGFkICp0YXJnZXQ7CisKKyAgICBpZiAoKHRhcmdldCA9IGdzdF9naG9zdF9wYWRfZ2V0X3RhcmdldCAoR1NUX0dIT1NUX1BBRF9DQVNUIChwYWQpKSkpIHsKKyAgICAgIHJlcyA9IGdzdF9wYWRfc2VuZF9ldmVudCAodGFyZ2V0LCBldmVudCk7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmICh0YXJnZXQpOworICAgIH0gZWxzZSB7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHNwc3JjX2hhbmRsZV9zcmNfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtOworCisgIHN0cmVhbSA9IGdzdF9wYWRfZ2V0X2VsZW1lbnRfcHJpdmF0ZSAocGFkKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TVFJFQU1fU1RBUlQ6eworICAgICAgY29uc3QgZ2NoYXIgKnVwc3RyZWFtX2lkOworICAgICAgZ2NoYXIgKnN0cmVhbV9pZDsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3N0cmVhbV9zdGFydCAoZXZlbnQsICZ1cHN0cmVhbV9pZCk7CisgICAgICBzdHJlYW1faWQgPSBnX3N0cmR1cF9wcmludGYgKCIlcy8lcyIsIHVwc3RyZWFtX2lkLCBzdHJlYW0tPnN0cmVhbV9pZCk7CisKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoc3RyZWFtX2lkKTsKKyAgICAgIGdfZnJlZSAoc3RyZWFtX2lkKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gZ3N0X3BhZF9wdXNoX2V2ZW50IChzdHJlYW0tPnNyY3BhZCwgZXZlbnQpOworfQorCisvKiB0aGlzIGlzIHRoZSBmaW5hbCBldmVudCBmdW5jdGlvbiB3ZSByZWNlaXZlIG9uIHRoZSBpbnRlcm5hbCBzb3VyY2UgcGFkIHdoZW4KKyAqIHdlIGRlYWwgd2l0aCBUQ1AgY29ubmVjdGlvbnMgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfaGFuZGxlX2ludGVybmFsX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgInJlY2VpdmVkIGV2ZW50ICVzIiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9TRUVLOgorICAgIGNhc2UgR1NUX0VWRU5UX1FPUzoKKyAgICBjYXNlIEdTVF9FVkVOVF9OQVZJR0FUSU9OOgorICAgIGNhc2UgR1NUX0VWRU5UX0xBVEVOQ1k6CisgICAgZGVmYXVsdDoKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKKy8qIHRoaXMgaXMgdGhlIGZpbmFsIHF1ZXJ5IGZ1bmN0aW9uIHdlIHJlY2VpdmUgb24gdGhlIGludGVybmFsIHNvdXJjZSBwYWQgd2hlbgorICogd2UgZGVhbCB3aXRoIFRDUCBjb25uZWN0aW9ucyAqLworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY19oYW5kbGVfaW50ZXJuYWxfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RSVFNQU3JjICpzcmM7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisKKyAgc3JjID0gR1NUX1JUU1BTUkNfQ0FTVCAoZ3N0X3BhZF9nZXRfZWxlbWVudF9wcml2YXRlIChwYWQpKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJwYWQgJXM6JXMgcmVjZWl2ZWQgcXVlcnkgJXMiLAorICAgICAgR1NUX0RFQlVHX1BBRF9OQU1FIChwYWQpLCBHU1RfUVVFUllfVFlQRV9OQU1FIChxdWVyeSkpOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX1BPU0lUSU9OOgorICAgIHsKKyAgICAgIC8qIG5vIGlkZWEgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9EVVJBVElPTjoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfZHVyYXRpb24gKHF1ZXJ5LCAmZm9ybWF0LCBOVUxMKTsKKworICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICAgICAgZ3N0X3F1ZXJ5X3NldF9kdXJhdGlvbiAocXVlcnksIGZvcm1hdCwgc3JjLT5zZWdtZW50LmR1cmF0aW9uKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9MQVRFTkNZOgorICAgIHsKKyAgICAgIC8qIHdlIGFyZSBsaXZlIHdpdGggYSBtaW4gbGF0ZW5jeSBvZiAwIGFuZCB1bmxpbWl0ZWQgbWF4IGxhdGVuY3ksIHRoaXMKKyAgICAgICAqIHJlc3VsdCB3aWxsIGJlIHVwZGF0ZWQgYnkgdGhlIHNlc3Npb24gbWFuYWdlciBpZiB0aGVyZSBpcyBhbnkuICovCisgICAgICBnc3RfcXVlcnlfc2V0X2xhdGVuY3kgKHF1ZXJ5LCBUUlVFLCAwLCAtMSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworLyogdGhpcyBxdWVyeSBpcyBleGVjdXRlZCBvbiB0aGUgZ2hvc3Qgc291cmNlIHBhZCBleHBvc2VkIG9uIHJ0c3BzcmMuICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHNwc3JjX2hhbmRsZV9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFJUU1BTcmMgKnNyYzsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgc3JjID0gR1NUX1JUU1BTUkNfQ0FTVCAocGFyZW50KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJwYWQgJXM6JXMgcmVjZWl2ZWQgcXVlcnkgJXMiLAorICAgICAgR1NUX0RFQlVHX1BBRF9OQU1FIChwYWQpLCBHU1RfUVVFUllfVFlQRV9OQU1FIChxdWVyeSkpOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0RVUkFUSU9OOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9kdXJhdGlvbiAocXVlcnksICZmb3JtYXQsIE5VTEwpOworCisgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfVElNRToKKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X2R1cmF0aW9uIChxdWVyeSwgZm9ybWF0LCBzcmMtPnNlZ21lbnQuZHVyYXRpb24pOworICAgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfU0VFS0lORzoKKyAgICB7CisgICAgICBHc3RGb3JtYXQgZm9ybWF0OworCisgICAgICBnc3RfcXVlcnlfcGFyc2Vfc2Vla2luZyAocXVlcnksICZmb3JtYXQsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgaWYgKGZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgZ2Jvb2xlYW4gc2Vla2FibGUgPQorICAgICAgICAgICAgc3JjLT5jdXJfcHJvdG9jb2xzICE9IEdTVF9SVFNQX0xPV0VSX1RSQU5TX1VEUF9NQ0FTVDsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIHN0YXJ0ID0gMCwgZHVyYXRpb24gPSBzcmMtPnNlZ21lbnQuZHVyYXRpb247CisKKyAgICAgICAgLyogc2Vla2luZyB3aXRob3V0IGR1cmF0aW9uIGlzIHVubGlrZWx5ICovCisgICAgICAgIHNlZWthYmxlID0gc2Vla2FibGUgJiYgc3JjLT5zZWVrYWJsZSA+PSAwLjAgJiYgc3JjLT5zZWdtZW50LmR1cmF0aW9uICYmCisgICAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3JjLT5zZWdtZW50LmR1cmF0aW9uKTsKKworICAgICAgICBpZiAoc2Vla2FibGUpIHsKKyAgICAgICAgICBpZiAoc3JjLT5zZWVrYWJsZSA+IDAuMCkgeworICAgICAgICAgICAgc3RhcnQgPSBzcmMtPmxhc3RfcG9zIC0gc3JjLT5zZWVrYWJsZSAqIEdTVF9TRUNPTkQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHNyYy0+c2Vla2FibGUgPT0gMCBtZWFucyB0aGF0IHdlIGNhbiBvbmx5IHNlZWsgdG8gMCAqLworICAgICAgICAgICAgc3RhcnQgPSAwOworICAgICAgICAgICAgZHVyYXRpb24gPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICJzZWVrYWJsZSA6ICVkIiwgc2Vla2FibGUpOworCisgICAgICAgIGdzdF9xdWVyeV9zZXRfc2Vla2luZyAocXVlcnksIEdTVF9GT1JNQVRfVElNRSwgc2Vla2FibGUsIHN0YXJ0LAorICAgICAgICAgICAgZHVyYXRpb24pOworICAgICAgICByZXMgPSBUUlVFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX1VSSToKKyAgICB7CisgICAgICBnY2hhciAqdXJpOworCisgICAgICB1cmkgPSBnc3RfcnRzcHNyY191cmlfZ2V0X3VyaSAoR1NUX1VSSV9IQU5ETEVSIChzcmMpKTsKKyAgICAgIGlmICh1cmkgIT0gTlVMTCkgeworICAgICAgICBnc3RfcXVlcnlfc2V0X3VyaSAocXVlcnksIHVyaSk7CisgICAgICAgIGdfZnJlZSAodXJpKTsKKyAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgIHsKKyAgICAgIEdzdFBhZCAqdGFyZ2V0ID0gZ3N0X2dob3N0X3BhZF9nZXRfdGFyZ2V0IChHU1RfR0hPU1RfUEFEX0NBU1QgKHBhZCkpOworCisgICAgICAvKiBmb3J3YXJkIHRoZSBxdWVyeSB0byB0aGUgcHJveHkgdGFyZ2V0IHBhZCAqLworICAgICAgaWYgKHRhcmdldCkgeworICAgICAgICByZXMgPSBnc3RfcGFkX3F1ZXJ5ICh0YXJnZXQsIHF1ZXJ5KTsKKyAgICAgICAgZ3N0X29iamVjdF91bnJlZiAodGFyZ2V0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKKy8qIGNhbGxiYWNrIGZvciBSVENQIG1lc3NhZ2VzIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlciB3aGVuIG9wZXJhdGluZyBpbiBUQ1AKKyAqIG1vZGUuICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3J0c3BzcmNfc2lua19jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0UlRTUFNyYyAqc3JjOworICBHc3RSVFNQU3RyZWFtICpzdHJlYW07CisgIEdzdEZsb3dSZXR1cm4gcmVzID0gR1NUX0ZMT1dfT0s7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmRhdGE7CisgIGd1aW50IHNpemU7CisgIEdzdFJUU1BSZXN1bHQgcmV0OworICBHc3RSVFNQTWVzc2FnZSBtZXNzYWdlID0geyAwIH07CisgIEdzdFJUU1BDb25uSW5mbyAqY29ubmluZm87CisKKyAgc3RyZWFtID0gKEdzdFJUU1BTdHJlYW0gKikgZ3N0X3BhZF9nZXRfZWxlbWVudF9wcml2YXRlIChwYWQpOworICBzcmMgPSBzdHJlYW0tPnBhcmVudDsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBzaXplID0gbWFwLnNpemU7CisgIGRhdGEgPSBtYXAuZGF0YTsKKworICBnc3RfcnRzcF9tZXNzYWdlX2luaXRfZGF0YSAoJm1lc3NhZ2UsIHN0cmVhbS0+Y2hhbm5lbFsxXSk7CisKKyAgLyogbGVuZCB0aGUgYm9keSBkYXRhIHRvIHRoZSBtZXNzYWdlICovCisgIGdzdF9ydHNwX21lc3NhZ2VfdGFrZV9ib2R5ICgmbWVzc2FnZSwgZGF0YSwgc2l6ZSk7CisKKyAgaWYgKHN0cmVhbS0+Y29ubmluZm8uY29ubmVjdGlvbikKKyAgICBjb25uaW5mbyA9ICZzdHJlYW0tPmNvbm5pbmZvOworICBlbHNlCisgICAgY29ubmluZm8gPSAmc3JjLT5jb25uaW5mbzsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzZW5kaW5nICV1IGJ5dGVzIFJUQ1AiLCBzaXplKTsKKyAgcmV0ID0gZ3N0X3J0c3BzcmNfY29ubmVjdGlvbl9zZW5kIChzcmMsIGNvbm5pbmZvLCAmbWVzc2FnZSwgTlVMTCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNlbnQgUlRDUCwgJWQiLCByZXQpOworCisgIC8qIGFuZCBzdGVhbCBpdCBhd2F5IGFnYWluIGJlY2F1c2Ugd2Ugd2lsbCBmcmVlIGl0IHdoZW4gdW5yZWZmaW5nIHRoZQorICAgKiBidWZmZXIgKi8KKyAgZ3N0X3J0c3BfbWVzc2FnZV9zdGVhbF9ib2R5ICgmbWVzc2FnZSwgJmRhdGEsICZzaXplKTsKKyAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJm1lc3NhZ2UpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdFBhZFByb2JlUmV0dXJuCitwYWRfYmxvY2tlZCAoR3N0UGFkICogcGFkLCBHc3RQYWRQcm9iZUluZm8gKiBpbmZvLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFJUU1BTcmMgKnNyYyA9IHVzZXJfZGF0YTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJwYWQgJXM6JXMgYmxvY2tlZCwgYWN0aXZhdGluZyBzdHJlYW1zIiwKKyAgICAgIEdTVF9ERUJVR19QQURfTkFNRSAocGFkKSk7CisKKyAgLyogYWN0aXZhdGUgdGhlIHN0cmVhbXMgKi8KKyAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworICBpZiAoIXNyYy0+bmVlZF9hY3RpdmF0ZSkKKyAgICBnb3RvIHdhc19vazsKKworICBzcmMtPm5lZWRfYWN0aXZhdGUgPSBGQUxTRTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisKKyAgZ3N0X3J0c3BzcmNfYWN0aXZhdGVfc3RyZWFtcyAoc3JjKTsKKworICByZXR1cm4gR1NUX1BBRF9QUk9CRV9PSzsKKword2FzX29rOgorICB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisgICAgcmV0dXJuIEdTVF9QQURfUFJPQkVfT0s7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitjb3B5X3N0aWNreV9ldmVudHMgKEdzdFBhZCAqIHBhZCwgR3N0RXZlbnQgKiogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0UGFkICpncGFkID0gR1NUX1BBRF9DQVNUICh1c2VyX2RhdGEpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGdwYWQsICJzdG9yZSBzdGlja3kgZXZlbnQgJSIgR1NUX1BUUl9GT1JNQVQsICpldmVudCk7CisgIGdzdF9wYWRfc3RvcmVfc3RpY2t5X2V2ZW50IChncGFkLCAqZXZlbnQpOworCisgIHJldHVybiBUUlVFOworfQorCisvKiB0aGlzIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIG1hbmFnZXIgZ2VuZXJhdGVkIGEgbmV3IHNyYyBwYWQgd2l0aAorICogcGF5bG9hZGVkIFJUUCBwYWNrZXRzLiBXZSBzaW1wbHkgZ2hvc3QgdGhlIHBhZCBoZXJlLiAqLworc3RhdGljIHZvaWQKK25ld19tYW5hZ2VyX3BhZCAoR3N0RWxlbWVudCAqIG1hbmFnZXIsIEdzdFBhZCAqIHBhZCwgR3N0UlRTUFNyYyAqIHNyYykKK3sKKyAgZ2NoYXIgKm5hbWU7CisgIEdzdFBhZFRlbXBsYXRlICp0ZW1wbGF0ZTsKKyAgZ2ludCBpZCwgc3NyYywgcHQ7CisgIEdMaXN0ICpvc3RyZWFtczsKKyAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtOworICBnYm9vbGVhbiBhbGxfYWRkZWQ7CisgIEdzdFBhZCAqaW50ZXJuYWxfc3JjOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImdvdCBuZXcgbWFuYWdlciBwYWQgJSIgR1NUX1BUUl9GT1JNQVQsIHBhZCk7CisKKyAgR1NUX1JUU1BfU1RBVEVfTE9DSyAoc3JjKTsKKyAgLyogZmluZCBzdHJlYW0gKi8KKyAgbmFtZSA9IGdzdF9vYmplY3RfZ2V0X25hbWUgKEdTVF9PQkpFQ1RfQ0FTVCAocGFkKSk7CisgIGlmIChzc2NhbmYgKG5hbWUsICJyZWN2X3J0cF9zcmNfJXVfJXVfJXUiLCAmaWQsICZzc3JjLCAmcHQpICE9IDMpCisgICAgZ290byB1bmtub3duX3N0cmVhbTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdHJlYW06ICV1LCBTU1JDICUwOHgsIFBUICVkIiwgaWQsIHNzcmMsIHB0KTsKKworICBzdHJlYW0gPSBmaW5kX3N0cmVhbSAoc3JjLCAmaWQsIChncG9pbnRlcikgZmluZF9zdHJlYW1fYnlfaWQpOworICBpZiAoc3RyZWFtID09IE5VTEwpCisgICAgZ290byB1bmtub3duX3N0cmVhbTsKKworICAvKiBzYXZlIFNTUkMgKi8KKyAgc3RyZWFtLT5zc3JjID0gc3NyYzsKKworICAvKiB3ZSdsbCBhZGQgaXQgbGF0ZXIgc2VlIGJlbG93ICovCisgIHN0cmVhbS0+YWRkZWQgPSBUUlVFOworCisgIC8qIGNoZWNrIGlmIHdlIGFkZGVkIGFsbCBzdHJlYW1zICovCisgIGFsbF9hZGRlZCA9IFRSVUU7CisgIGZvciAob3N0cmVhbXMgPSBzcmMtPnN0cmVhbXM7IG9zdHJlYW1zOyBvc3RyZWFtcyA9IGdfbGlzdF9uZXh0IChvc3RyZWFtcykpIHsKKyAgICBHc3RSVFNQU3RyZWFtICpvc3RyZWFtID0gKEdzdFJUU1BTdHJlYW0gKikgb3N0cmVhbXMtPmRhdGE7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdHJlYW0gJXAsIGNvbnRhaW5lciAlZCwgYWRkZWQgJWQsIHNldHVwICVkIiwKKyAgICAgICAgb3N0cmVhbSwgb3N0cmVhbS0+Y29udGFpbmVyLCBvc3RyZWFtLT5hZGRlZCwgb3N0cmVhbS0+c2V0dXApOworCisgICAgLyogaWYgd2UgZmluZCBhIHN0cmVhbSBmb3Igd2hpY2ggd2UgZGlkIGEgc2V0dXAgdGhhdCBpcyBub3QgYWRkZWQsIHdlCisgICAgICogbmVlZCB0byB3YWl0IHNvbWUgbW9yZSAqLworICAgIGlmIChvc3RyZWFtLT5zZXR1cCAmJiAhb3N0cmVhbS0+YWRkZWQpIHsKKyAgICAgIGFsbF9hZGRlZCA9IEZBTFNFOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIEdTVF9SVFNQX1NUQVRFX1VOTE9DSyAoc3JjKTsKKworICAvKiBjcmVhdGUgYSBuZXcgcGFkIHdlIHdpbGwgdXNlIHRvIHN0cmVhbSB0byAqLworICB0ZW1wbGF0ZSA9IGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCAoJnJ0cHRlbXBsYXRlKTsKKyAgc3RyZWFtLT5zcmNwYWQgPSBnc3RfZ2hvc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChuYW1lLCBwYWQsIHRlbXBsYXRlKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodGVtcGxhdGUpOworICBnX2ZyZWUgKG5hbWUpOworCisgIC8qIFdlIGludGVyY2VwdCBhbmQgbW9kaWZ5IHRoZSBzdHJlYW0gc3RhcnQgZXZlbnQgKi8KKyAgaW50ZXJuYWxfc3JjID0KKyAgICAgIEdTVF9QQUQgKGdzdF9wcm94eV9wYWRfZ2V0X2ludGVybmFsIChHU1RfUFJPWFlfUEFEIChzdHJlYW0tPnNyY3BhZCkpKTsKKyAgZ3N0X3BhZF9zZXRfZWxlbWVudF9wcml2YXRlIChpbnRlcm5hbF9zcmMsIHN0cmVhbSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChpbnRlcm5hbF9zcmMsIGdzdF9ydHNwc3JjX2hhbmRsZV9zcmNfc2lua19ldmVudCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGludGVybmFsX3NyYyk7CisKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHN0cmVhbS0+c3JjcGFkLCBnc3RfcnRzcHNyY19oYW5kbGVfc3JjX2V2ZW50KTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHN0cmVhbS0+c3JjcGFkLCBnc3RfcnRzcHNyY19oYW5kbGVfc3JjX3F1ZXJ5KTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzdHJlYW0tPnNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc3RpY2t5X2V2ZW50c19mb3JlYWNoIChwYWQsIGNvcHlfc3RpY2t5X2V2ZW50cywgc3RyZWFtLT5zcmNwYWQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUIChzcmMpLCBzdHJlYW0tPnNyY3BhZCk7CisKKyAgaWYgKGFsbF9hZGRlZCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIldlIGFkZGVkIGFsbCBzdHJlYW1zIik7CisgICAgLyogd2hlbiB3ZSBnZXQgaGVyZSwgYWxsIHN0cmVhbSBhcmUgYWRkZWQgYW5kIHdlIGNhbiBmaXJlIHRoZSBuby1tb3JlLXBhZHMKKyAgICAgKiBzaWduYWwuICovCisgICAgZ3N0X2VsZW1lbnRfbm9fbW9yZV9wYWRzIChHU1RfRUxFTUVOVF9DQVNUIChzcmMpKTsKKyAgfQorCisgIHJldHVybjsKKworICAvKiBFUlJPUlMgKi8KK3Vua25vd25fc3RyZWFtOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiaWdub3JpbmcgdW5rbm93biBzdHJlYW0iKTsKKyAgICBHU1RfUlRTUF9TVEFURV9VTkxPQ0sgKHNyYyk7CisgICAgZ19mcmVlIChuYW1lKTsKKyAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorc3RyZWFtX2dldF9jYXBzX2Zvcl9wdCAoR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwgZ3VpbnQgcHQpCit7CisgIGd1aW50IGksIGxlbjsKKworICBsZW4gPSBzdHJlYW0tPnB0bWFwLT5sZW47CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIFB0TWFwSXRlbSAqaXRlbSA9ICZnX2FycmF5X2luZGV4IChzdHJlYW0tPnB0bWFwLCBQdE1hcEl0ZW0sIGkpOworICAgIGlmIChpdGVtLT5wdCA9PSBwdCkKKyAgICAgIHJldHVybiBpdGVtLT5jYXBzOworICB9CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCityZXF1ZXN0X3B0X21hcCAoR3N0RWxlbWVudCAqIG1hbmFnZXIsIGd1aW50IHNlc3Npb24sIGd1aW50IHB0LCBHc3RSVFNQU3JjICogc3JjKQoreworICBHc3RSVFNQU3RyZWFtICpzdHJlYW07CisgIEdzdENhcHMgKmNhcHM7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZ2V0dGluZyBwdCBtYXAgZm9yIHB0ICVkIGluIHNlc3Npb24gJWQiLCBwdCwgc2Vzc2lvbik7CisKKyAgR1NUX1JUU1BfU1RBVEVfTE9DSyAoc3JjKTsKKyAgc3RyZWFtID0gZmluZF9zdHJlYW0gKHNyYywgJnNlc3Npb24sIChncG9pbnRlcikgZmluZF9zdHJlYW1fYnlfaWQpOworICBpZiAoIXN0cmVhbSkKKyAgICBnb3RvIHVua25vd25fc3RyZWFtOworCisgIGlmICgoY2FwcyA9IHN0cmVhbV9nZXRfY2Fwc19mb3JfcHQgKHN0cmVhbSwgcHQpKSkKKyAgICBnc3RfY2Fwc19yZWYgKGNhcHMpOworICBHU1RfUlRTUF9TVEFURV9VTkxPQ0sgKHNyYyk7CisKKyAgcmV0dXJuIGNhcHM7CisKK3Vua25vd25fc3RyZWFtOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAidW5rbm93biBzdHJlYW0gJWQiLCBzZXNzaW9uKTsKKyAgICBHU1RfUlRTUF9TVEFURV9VTkxPQ0sgKHNyYyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX2RvX3N0cmVhbV9lb3MgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BTdHJlYW0gKiBzdHJlYW0pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNldHRpbmcgc3RyZWFtIGZvciBzZXNzaW9uICV1IHRvIEVPUyIsIHN0cmVhbS0+aWQpOworCisgIGlmIChzdHJlYW0tPmVvcykKKyAgICBnb3RvIHdhc19lb3M7CisKKyAgc3RyZWFtLT5lb3MgPSBUUlVFOworICBnc3RfcnRzcHNyY19zdHJlYW1fcHVzaF9ldmVudCAoc3JjLCBzdHJlYW0sIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLword2FzX2VvczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN0cmVhbSBmb3Igc2Vzc2lvbiAldSB3YXMgYWxyZWFkeSBFT1MiLCBzdHJlYW0tPmlkKTsKKyAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIHZvaWQKK29uX2J5ZV9zc3JjIChHT2JqZWN0ICogc2Vzc2lvbiwgR09iamVjdCAqIHNvdXJjZSwgR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSkKK3sKKyAgR3N0UlRTUFNyYyAqc3JjID0gc3RyZWFtLT5wYXJlbnQ7CisgIGd1aW50IHNzcmM7CisKKyAgZ19vYmplY3RfZ2V0IChzb3VyY2UsICJzc3JjIiwgJnNzcmMsIE5VTEwpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNvdXJjZSAlMDh4LCBzdHJlYW0gJTA4eCwgc2Vzc2lvbiAldSByZWNlaXZlZCBCWUUiLAorICAgICAgc3NyYywgc3RyZWFtLT5zc3JjLCBzdHJlYW0tPmlkKTsKKworICBpZiAoc3NyYyA9PSBzdHJlYW0tPnNzcmMpCisgICAgZ3N0X3J0c3BzcmNfZG9fc3RyZWFtX2VvcyAoc3JjLCBzdHJlYW0pOworfQorCitzdGF0aWMgdm9pZAorb25fdGltZW91dCAoR09iamVjdCAqIHNlc3Npb24sIEdPYmplY3QgKiBzb3VyY2UsIEdzdFJUU1BTdHJlYW0gKiBzdHJlYW0pCit7CisgIEdzdFJUU1BTcmMgKnNyYyA9IHN0cmVhbS0+cGFyZW50OworICBndWludCBzc3JjOworCisgIGdfb2JqZWN0X2dldCAoc291cmNlLCAic3NyYyIsICZzc3JjLCBOVUxMKTsKKworICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgInNvdXJjZSAlMDh4LCBzdHJlYW0gJTA4eCBpbiBzZXNzaW9uICV1IHRpbWVkIG91dCIsCisgICAgICBzc3JjLCBzdHJlYW0tPnNzcmMsIHN0cmVhbS0+aWQpOworCisgIGlmIChzc3JjID09IHN0cmVhbS0+c3NyYykKKyAgICBnc3RfcnRzcHNyY19kb19zdHJlYW1fZW9zIChzcmMsIHN0cmVhbSk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9ucHRfc3RvcCAoR3N0RWxlbWVudCAqIHJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQgc3NyYywgR3N0UlRTUFNyYyAqIHNyYykKK3sKKyAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNvdXJjZSBpbiBzZXNzaW9uICV1IHJlYWNoZWQgTlBUIHN0b3AiLCBzZXNzaW9uKTsKKworICAvKiBnZXQgc3RyZWFtIGZvciBzZXNzaW9uICovCisgIHN0cmVhbSA9IGZpbmRfc3RyZWFtIChzcmMsICZzZXNzaW9uLCAoZ3BvaW50ZXIpIGZpbmRfc3RyZWFtX2J5X2lkKTsKKyAgaWYgKHN0cmVhbSkgeworICAgIGdzdF9ydHNwc3JjX2RvX3N0cmVhbV9lb3MgKHNyYywgc3RyZWFtKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorb25fc3NyY19hY3RpdmUgKEdPYmplY3QgKiBzZXNzaW9uLCBHT2JqZWN0ICogc291cmNlLCBHc3RSVFNQU3RyZWFtICogc3RyZWFtKQoreworICBHU1RfREVCVUdfT0JKRUNUIChzdHJlYW0tPnBhcmVudCwgInNvdXJjZSBpbiBzZXNzaW9uICV1IGlzIGFjdGl2ZSIsCisgICAgICBzdHJlYW0tPmlkKTsKK30KKworc3RhdGljIHZvaWQKK3NldF9tYW5hZ2VyX2J1ZmZlcl9tb2RlIChHc3RSVFNQU3JjICogc3JjKQoreworICBHT2JqZWN0Q2xhc3MgKmtsYXNzOworCisgIGlmIChzcmMtPm1hbmFnZXIgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAga2xhc3MgPSBHX09CSkVDVF9HRVRfQ0xBU1MgKEdfT0JKRUNUIChzcmMtPm1hbmFnZXIpKTsKKworICBpZiAoIWdfb2JqZWN0X2NsYXNzX2ZpbmRfcHJvcGVydHkgKGtsYXNzLCAiYnVmZmVyLW1vZGUiKSkKKyAgICByZXR1cm47CisKKyAgaWYgKHNyYy0+YnVmZmVyX21vZGUgIT0gQlVGRkVSX01PREVfQVVUTykgeworICAgIGdfb2JqZWN0X3NldCAoc3JjLT5tYW5hZ2VyLCAiYnVmZmVyLW1vZGUiLCBzcmMtPmJ1ZmZlcl9tb2RlLCBOVUxMKTsKKworICAgIHJldHVybjsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywKKyAgICAgICJhdXRvIGJ1ZmZlcmluZyBtb2RlLCBoYXZlIGNsb2NrICUiIEdTVF9QVFJfRk9STUFULCBzcmMtPnByb3ZpZGVkX2Nsb2NrKTsKKworICBpZiAoc3JjLT5wcm92aWRlZF9jbG9jaykgeworICAgIEdzdENsb2NrICpjbG9jayA9IGdzdF9lbGVtZW50X2dldF9jbG9jayAoR1NUX0VMRU1FTlRfQ0FTVCAoc3JjKSk7CisKKyAgICBpZiAoY2xvY2sgPT0gc3JjLT5wcm92aWRlZF9jbG9jaykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic2VsZWN0ZWQgc3luY2VkIik7CisgICAgICBnX29iamVjdF9zZXQgKHNyYy0+bWFuYWdlciwgImJ1ZmZlci1tb2RlIiwgQlVGRkVSX01PREVfU1lOQ0VELCBOVUxMKTsKKworICAgICAgaWYgKGNsb2NrKQorICAgICAgICBnc3Rfb2JqZWN0X3VucmVmIChjbG9jayk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBPdGhlcndpc2UgZmFsbC10aHJvdWdoIGFuZCB1c2UgYW5vdGhlciBidWZmZXIgbW9kZSAqLworICAgIGlmIChjbG9jaykKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGNsb2NrKTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImF1dG8gYnVmZmVyaW5nIG1vZGUiKTsKKyAgaWYgKHNyYy0+dXNlX2J1ZmZlcmluZykgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNlbGVjdGVkIGJ1ZmZlciIpOworICAgIGdfb2JqZWN0X3NldCAoc3JjLT5tYW5hZ2VyLCAiYnVmZmVyLW1vZGUiLCBCVUZGRVJfTU9ERV9CVUZGRVIsIE5VTEwpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNlbGVjdGVkIHNsYXZlIik7CisgICAgZ19vYmplY3Rfc2V0IChzcmMtPm1hbmFnZXIsICJidWZmZXItbW9kZSIsIEJVRkZFUl9NT0RFX1NMQVZFLCBOVUxMKTsKKyAgfQorfQorCitzdGF0aWMgR3N0Q2FwcyAqCityZXF1ZXN0X2tleSAoR3N0RWxlbWVudCAqIHNydHBkZWMsIGd1aW50IHNzcmMsIEdzdFJUU1BTdHJlYW0gKiBzdHJlYW0pCit7CisgIGd1aW50IGk7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdE1JS0VZTWVzc2FnZSAqbXNnID0gc3RyZWFtLT5taWtleTsKKworICBHU1RfREVCVUcgKCJyZXF1ZXN0IGtleSBTU1JDICV1Iiwgc3NyYyk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX3JlZiAoc3RyZWFtX2dldF9jYXBzX2Zvcl9wdCAoc3RyZWFtLCBzdHJlYW0tPmRlZmF1bHRfcHQpKTsKKyAgY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGNhcHMpOworCisgIC8qIHBhcnNlIGNyeXB0byBzZXNzaW9ucyBhbmQgbG9vayBmb3IgdGhlIFNTUkMgcm9sbG92ZXIgY291bnRlciAqLworICBtc2cgPSBzdHJlYW0tPm1pa2V5OworICBmb3IgKGkgPSAwOyBtc2cgJiYgaSA8IGdzdF9taWtleV9tZXNzYWdlX2dldF9uX2NzIChtc2cpOyBpKyspIHsKKyAgICBjb25zdCBHc3RNSUtFWU1hcFNSVFAgKm1hcCA9IGdzdF9taWtleV9tZXNzYWdlX2dldF9jc19zcnRwIChtc2csIGkpOworCisgICAgaWYgKHNzcmMgPT0gbWFwLT5zc3JjKSB7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAicm9jIiwgR19UWVBFX1VJTlQsIG1hcC0+cm9jLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCityZXF1ZXN0X3J0cF9kZWNvZGVyIChHc3RFbGVtZW50ICogcnRwYmluLCBndWludCBzZXNzaW9uLCBHc3RSVFNQU3RyZWFtICogc3RyZWFtKQoreworICBHU1RfREVCVUcgKCJkZWNvZGVyIHNlc3Npb24gJXUsIHN0cmVhbSAlcCwgJWQiLCBzZXNzaW9uLCBzdHJlYW0sIHN0cmVhbS0+aWQpOworICBpZiAoc3RyZWFtLT5pZCAhPSBzZXNzaW9uKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChzdHJlYW0tPnByb2ZpbGUgIT0gR1NUX1JUU1BfUFJPRklMRV9TQVZQICYmCisgICAgICBzdHJlYW0tPnByb2ZpbGUgIT0gR1NUX1JUU1BfUFJPRklMRV9TQVZQRikKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoc3RyZWFtLT5zcnRwZGVjID09IE5VTEwpIHsKKyAgICBnY2hhciAqbmFtZTsKKworICAgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzcnRwZGVjXyV1Iiwgc2Vzc2lvbik7CisgICAgc3RyZWFtLT5zcnRwZGVjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgic3J0cGRlYyIsIG5hbWUpOworICAgIGdfZnJlZSAobmFtZSk7CisKKyAgICBpZiAoc3RyZWFtLT5zcnRwZGVjID09IE5VTEwpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzdHJlYW0tPnBhcmVudCwgQ09SRSwgTUlTU0lOR19QTFVHSU4sIChOVUxMKSwKKyAgICAgICAgICAoIm5vIHNydHBkZWMgZWxlbWVudCBwcmVzZW50ISIpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBnX3NpZ25hbF9jb25uZWN0IChzdHJlYW0tPnNydHBkZWMsICJyZXF1ZXN0LWtleSIsCisgICAgICAgIChHQ2FsbGJhY2spIHJlcXVlc3Rfa2V5LCBzdHJlYW0pOworICB9CisgIHJldHVybiBnc3Rfb2JqZWN0X3JlZiAoc3RyZWFtLT5zcnRwZGVjKTsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorcmVxdWVzdF9ydGNwX2VuY29kZXIgKEdzdEVsZW1lbnQgKiBydHBiaW4sIGd1aW50IHNlc3Npb24sCisgICAgR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSkKK3sKKyAgZ2NoYXIgKm5hbWU7CisgIEdzdFBhZCAqcGFkOworCisgIEdTVF9ERUJVRyAoImRlY29kZXIgc2Vzc2lvbiAldSwgc3RyZWFtICVwLCAlZCIsIHNlc3Npb24sIHN0cmVhbSwgc3RyZWFtLT5pZCk7CisgIGlmIChzdHJlYW0tPmlkICE9IHNlc3Npb24pCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKHN0cmVhbS0+cHJvZmlsZSAhPSBHU1RfUlRTUF9QUk9GSUxFX1NBVlAgJiYKKyAgICAgIHN0cmVhbS0+cHJvZmlsZSAhPSBHU1RfUlRTUF9QUk9GSUxFX1NBVlBGKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChzdHJlYW0tPnNydHBlbmMgPT0gTlVMTCkgeworICAgIEdzdFN0cnVjdHVyZSAqczsKKworICAgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzcnRwZW5jXyV1Iiwgc2Vzc2lvbik7CisgICAgc3RyZWFtLT5zcnRwZW5jID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgic3J0cGVuYyIsIG5hbWUpOworICAgIGdfZnJlZSAobmFtZSk7CisKKyAgICBpZiAoc3RyZWFtLT5zcnRwZW5jID09IE5VTEwpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzdHJlYW0tPnBhcmVudCwgQ09SRSwgTUlTU0lOR19QTFVHSU4sIChOVUxMKSwKKyAgICAgICAgICAoIm5vIHNydHBlbmMgZWxlbWVudCBwcmVzZW50ISIpKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIGdldCBSVENQIGNyeXB0byBwYXJhbWV0ZXJzIGZyb20gY2FwcyAqLworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChzdHJlYW0tPnNydGNwcGFyYW1zLCAwKTsKKyAgICBpZiAocykgeworICAgICAgR3N0QnVmZmVyICpidWY7CisgICAgICBjb25zdCBnY2hhciAqc3RyOworICAgICAgR1R5cGUgY2lwaGVydHlwZSwgYXV0aHR5cGU7CisgICAgICBHVmFsdWUgcnRjcF9jaXBoZXIgPSBHX1ZBTFVFX0lOSVQsIHJ0Y3BfYXV0aCA9IEdfVkFMVUVfSU5JVDsKKworICAgICAgY2lwaGVydHlwZSA9IGdfdHlwZV9mcm9tX25hbWUgKCJHc3RTcnRwQ2lwaGVyVHlwZSIpOworICAgICAgYXV0aHR5cGUgPSBnX3R5cGVfZnJvbV9uYW1lICgiR3N0U3J0cEF1dGhUeXBlIik7CisgICAgICBnX3ZhbHVlX2luaXQgKCZydGNwX2NpcGhlciwgY2lwaGVydHlwZSk7CisgICAgICBnX3ZhbHVlX2luaXQgKCZydGNwX2F1dGgsIGF1dGh0eXBlKTsKKworICAgICAgc3RyID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAic3J0Y3AtY2lwaGVyIik7CisgICAgICBnc3RfdmFsdWVfZGVzZXJpYWxpemUgKCZydGNwX2NpcGhlciwgc3RyKTsKKyAgICAgIHN0ciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgInNydGNwLWF1dGgiKTsKKyAgICAgIGdzdF92YWx1ZV9kZXNlcmlhbGl6ZSAoJnJ0Y3BfYXV0aCwgc3RyKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0IChzLCAic3J0cC1rZXkiLCBHU1RfVFlQRV9CVUZGRVIsICZidWYsIE5VTEwpOworCisgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChzdHJlYW0tPnNydHBlbmMpLCAicnRwLWNpcGhlciIsCisgICAgICAgICAgJnJ0Y3BfY2lwaGVyKTsKKyAgICAgIGdfb2JqZWN0X3NldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKHN0cmVhbS0+c3J0cGVuYyksICJydHAtYXV0aCIsCisgICAgICAgICAgJnJ0Y3BfYXV0aCk7CisgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChzdHJlYW0tPnNydHBlbmMpLCAicnRjcC1jaXBoZXIiLAorICAgICAgICAgICZydGNwX2NpcGhlcik7CisgICAgICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChzdHJlYW0tPnNydHBlbmMpLCAicnRjcC1hdXRoIiwKKyAgICAgICAgICAmcnRjcF9hdXRoKTsKKyAgICAgIGdfb2JqZWN0X3NldCAoc3RyZWFtLT5zcnRwZW5jLCAia2V5IiwgYnVmLCBOVUxMKTsKKworICAgICAgZ192YWx1ZV91bnNldCAoJnJ0Y3BfY2lwaGVyKTsKKyAgICAgIGdfdmFsdWVfdW5zZXQgKCZydGNwX2F1dGgpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICB9CisgIH0KKyAgbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInJ0Y3Bfc2lua18lZCIsIHNlc3Npb24pOworICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHN0cmVhbS0+c3J0cGVuYywgbmFtZSk7CisgIGdfZnJlZSAobmFtZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisKKyAgcmV0dXJuIGdzdF9vYmplY3RfcmVmIChzdHJlYW0tPnNydHBlbmMpOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCityZXF1ZXN0X2F1eF9yZWNlaXZlciAoR3N0RWxlbWVudCAqIHJ0cGJpbiwgZ3VpbnQgc2Vzc2lkLCBHc3RSVFNQU3JjICogc3JjKQoreworICBHc3RFbGVtZW50ICpydHgsICpiaW47CisgIEdzdFBhZCAqcGFkOworICBnY2hhciAqbmFtZTsKKyAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtOworCisgIHN0cmVhbSA9IGZpbmRfc3RyZWFtIChzcmMsICZzZXNzaWQsIChncG9pbnRlcikgZmluZF9zdHJlYW1fYnlfaWQpOworICBpZiAoIXN0cmVhbSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiU3RyZWFtICV1IG5vdCBmb3VuZCIsIHNlc3NpZCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBHU1RfSU5GT19PQkpFQ1QgKHNyYywgImNyZWF0aW5nIHJldHJhbnNtaXNpb24gcmVjZWl2ZXIgZm9yIHNlc3Npb24gJXUgIgorICAgICAgIndpdGggbWFwICUiIEdTVF9QVFJfRk9STUFULCBzZXNzaWQsIHN0cmVhbS0+cnR4X3B0X21hcCk7CisgIGJpbiA9IGdzdF9iaW5fbmV3IChOVUxMKTsKKyAgcnR4ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwcnR4cmVjZWl2ZSIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHJ0eCwgInBheWxvYWQtdHlwZS1tYXAiLCBzdHJlYW0tPnJ0eF9wdF9tYXAsIE5VTEwpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAoYmluKSwgcnR4KTsKKworICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocnR4LCAic3JjIik7CisgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzcmNfJXUiLCBzZXNzaWQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIGdzdF9naG9zdF9wYWRfbmV3IChuYW1lLCBwYWQpKTsKKyAgZ19mcmVlIChuYW1lKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGFkKTsKKworICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocnR4LCAic2luayIpOworICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic2lua18ldSIsIHNlc3NpZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgZ3N0X2dob3N0X3BhZF9uZXcgKG5hbWUsIHBhZCkpOworICBnX2ZyZWUgKG5hbWUpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworCisgIHJldHVybiBiaW47Cit9CisKK3N0YXRpYyB2b2lkCithZGRfcmV0cmFuc21pc3Npb24gKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BUcmFuc3BvcnQgKiB0cmFuc3BvcnQpCit7CisgIEdMaXN0ICp3YWxrOworICBndWludCBzaWduYWxfaWQ7CisgIGdib29sZWFuIGRvX3JldHJhbnNtaXNzaW9uID0gRkFMU0U7CisKKyAgaWYgKHRyYW5zcG9ydC0+dHJhbnMgIT0gR1NUX1JUU1BfVFJBTlNfUlRQKQorICAgIHJldHVybjsKKyAgaWYgKHRyYW5zcG9ydC0+cHJvZmlsZSAhPSBHU1RfUlRTUF9QUk9GSUxFX0FWUEYgJiYKKyAgICAgIHRyYW5zcG9ydC0+cHJvZmlsZSAhPSBHU1RfUlRTUF9QUk9GSUxFX1NBVlBGKQorICAgIHJldHVybjsKKworICBzaWduYWxfaWQgPSBnX3NpZ25hbF9sb29rdXAgKCJyZXF1ZXN0LWF1eC1yZWNlaXZlciIsCisgICAgICBHX09CSkVDVF9UWVBFIChzcmMtPm1hbmFnZXIpKTsKKyAgLyogdGhlcmUncyBhbHJlYWR5IHNvbWV0aGluZyBjb25uZWN0ZWQgKi8KKyAgaWYgKGdfc2lnbmFsX2hhbmRsZXJfZmluZCAoc3JjLT5tYW5hZ2VyLCBHX1NJR05BTF9NQVRDSF9JRCwgc2lnbmFsX2lkLCAwLAorICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpICE9IDApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJOb3QgYWRkaW5nIFJUWCBBVVggZWxlbWVudCBhcyAiCisgICAgICAgICJcInJlcXVlc3QtYXV4LXJlY2VpdmVyXCIgc2lnbmFsIGlzICIKKyAgICAgICAgImFscmVhZHkgdXNlZCBieSB0aGUgYXBwbGljYXRpb24iKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBidWlsZCB0aGUgcmV0cmFuc21pc3Npb24gcGF5bG9hZCB0eXBlIG1hcCAqLworICBmb3IgKHdhbGsgPSBzcmMtPnN0cmVhbXM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RSVFNQU3RyZWFtICpzdHJlYW0gPSAoR3N0UlRTUFN0cmVhbSAqKSB3YWxrLT5kYXRhOworICAgIGdib29sZWFuIGRvX3JldHJhbnNtaXNzaW9uX3N0cmVhbSA9IEZBTFNFOworICAgIGludCBpOworCisgICAgaWYgKHN0cmVhbS0+cnR4X3B0X21hcCkKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoc3RyZWFtLT5ydHhfcHRfbWFwKTsKKyAgICBzdHJlYW0tPnJ0eF9wdF9tYXAgPSBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoImFwcGxpY2F0aW9uL3gtcnRwLXB0LW1hcCIpOworCisgICAgZm9yIChpID0gMDsgaSA8IHN0cmVhbS0+cHRtYXAtPmxlbjsgaSsrKSB7CisgICAgICBQdE1hcEl0ZW0gKml0ZW0gPSAmZ19hcnJheV9pbmRleCAoc3RyZWFtLT5wdG1hcCwgUHRNYXBJdGVtLCBpKTsKKyAgICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGl0ZW0tPmNhcHMsIDApOworICAgICAgY29uc3QgZ2NoYXIgKmVuY29kaW5nOworCisgICAgICAvKiB3ZSBvbmx5IGNhcmUgYWJvdXQgUlRYIHN0cmVhbXMgKi8KKyAgICAgIGlmICgoZW5jb2RpbmcgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJlbmNvZGluZy1uYW1lIikpCisgICAgICAgICAgJiYgZ19zdHJjbXAwIChlbmNvZGluZywgIlJUWCIpID09IDApIHsKKyAgICAgICAgY29uc3QgZ2NoYXIgKnN0cmVhbV9wdF9zOworICAgICAgICBnaW50IHJ0eF9wdDsKKworICAgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAicGF5bG9hZCIsICZydHhfcHQpCisgICAgICAgICAgICAmJiAoc3RyZWFtX3B0X3MgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJhcHQiKSkpIHsKKworICAgICAgICAgIGlmIChydHhfcHQgIT0gMCkgeworICAgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cmVhbS0+cnR4X3B0X21hcCwgc3RyZWFtX3B0X3MsIEdfVFlQRV9VSU5ULAorICAgICAgICAgICAgICAgIHJ0eF9wdCwgTlVMTCk7CisgICAgICAgICAgICBkb19yZXRyYW5zbWlzc2lvbl9zdHJlYW0gPSBUUlVFOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChkb19yZXRyYW5zbWlzc2lvbl9zdHJlYW0pIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImJ1aWx0IHJldHJhbnNtaXNzaW9uIHBheWxvYWQgbWFwIGZvciBzdHJlYW0gIgorICAgICAgICAgICJpZCAlaTogJSIgR1NUX1BUUl9GT1JNQVQsIHN0cmVhbS0+aWQsIHN0cmVhbS0+cnR4X3B0X21hcCk7CisgICAgICBkb19yZXRyYW5zbWlzc2lvbiA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIm5vIHJldHJhbnNtaXNzaW9uIHBheWxvYWQgbWFwIGZvciBzdHJlYW0gIgorICAgICAgICAgICJpZCAlaSIsIHN0cmVhbS0+aWQpOworICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChzdHJlYW0tPnJ0eF9wdF9tYXApOworICAgICAgc3RyZWFtLT5ydHhfcHRfbWFwID0gTlVMTDsKKyAgICB9CisgIH0KKworICBpZiAoZG9fcmV0cmFuc21pc3Npb24pIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJFbmFibGluZyByZXRyYW5zbWlzc2lvbnMiKTsKKworICAgIGdfb2JqZWN0X3NldCAoc3JjLT5tYW5hZ2VyLCAiZG8tcmV0cmFuc21pc3Npb24iLCBUUlVFLCBOVUxMKTsKKworICAgIC8qIGVuYWJsZSBSRkM0NTg4IHJldHJhbnNtaXNzaW9uIGhhbmRsaW5nIGJ5IHNldHRpbmcgcnRwcnR4cmVjZWl2ZQorICAgICAqIGFzIHRoZSAiYXV4IiBlbGVtZW50IG9mIHJ0cGJpbiAqLworICAgIGdfc2lnbmFsX2Nvbm5lY3QgKHNyYy0+bWFuYWdlciwgInJlcXVlc3QtYXV4LXJlY2VpdmVyIiwKKyAgICAgICAgKEdDYWxsYmFjaykgcmVxdWVzdF9hdXhfcmVjZWl2ZXIsIHNyYyk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLAorICAgICAgICAiTm90IGVuYWJsaW5nIHJldHJhbnNtaXNzaW9ucyBhcyBubyBzdHJlYW0gaGFkIGEgcmV0cmFuc21pc3Npb24gcGF5bG9hZCBtYXAiKTsKKyAgfQorfQorCisvKiB0cnkgdG8gZ2V0IGFuZCBjb25maWd1cmUgYSBtYW5hZ2VyICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfbWFuYWdlciAoR3N0UlRTUFNyYyAqIHNyYywgR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RSVFNQVHJhbnNwb3J0ICogdHJhbnNwb3J0KQoreworICBjb25zdCBnY2hhciAqbWFuYWdlcjsKKyAgZ2NoYXIgKm5hbWU7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICAvKiBmaW5kIGEgbWFuYWdlciAqLworICBpZiAoZ3N0X3J0c3BfdHJhbnNwb3J0X2dldF9tYW5hZ2VyICh0cmFuc3BvcnQtPnRyYW5zLCAmbWFuYWdlciwgMCkgPCAwKQorICAgIGdvdG8gbm9fbWFuYWdlcjsKKworICBpZiAobWFuYWdlcikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInVzaW5nIG1hbmFnZXIgJXMiLCBtYW5hZ2VyKTsKKworICAgIC8qIGNvbmZpZ3VyZSB0aGUgbWFuYWdlciAqLworICAgIGlmIChzcmMtPm1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgR09iamVjdENsYXNzICprbGFzczsKKworICAgICAgaWYgKCEoc3JjLT5tYW5hZ2VyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlIChtYW5hZ2VyLCAibWFuYWdlciIpKSkgeworICAgICAgICAvKiBmYWxsYmFjayAqLworICAgICAgICBpZiAoZ3N0X3J0c3BfdHJhbnNwb3J0X2dldF9tYW5hZ2VyICh0cmFuc3BvcnQtPnRyYW5zLCAmbWFuYWdlciwgMSkgPCAwKQorICAgICAgICAgIGdvdG8gbm9fbWFuYWdlcjsKKworICAgICAgICBpZiAoIW1hbmFnZXIpCisgICAgICAgICAgZ290byB1c2Vfbm9fbWFuYWdlcjsKKworICAgICAgICBpZiAoIShzcmMtPm1hbmFnZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKG1hbmFnZXIsICJtYW5hZ2VyIikpKQorICAgICAgICAgIGdvdG8gbWFuYWdlcl9mYWlsZWQ7CisgICAgICB9CisKKyAgICAgIC8qIHdlIG1hbmFnZSB0aGlzIGVsZW1lbnQgKi8KKyAgICAgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHNyYy0+bWFuYWdlciwgVFJVRSk7CisgICAgICBnc3RfYmluX2FkZCAoR1NUX0JJTl9DQVNUIChzcmMpLCBzcmMtPm1hbmFnZXIpOworCisgICAgICByZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNyYy0+bWFuYWdlciwgR1NUX1NUQVRFX1BBVVNFRCk7CisgICAgICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICAgICAgZ290byBzdGFydF9tYW5hZ2VyX2ZhaWx1cmU7CisKKyAgICAgIGdfb2JqZWN0X3NldCAoc3JjLT5tYW5hZ2VyLCAibGF0ZW5jeSIsIHNyYy0+bGF0ZW5jeSwgTlVMTCk7CisKKyAgICAgIGtsYXNzID0gR19PQkpFQ1RfR0VUX0NMQVNTIChHX09CSkVDVCAoc3JjLT5tYW5hZ2VyKSk7CisKKyAgICAgIGlmIChnX29iamVjdF9jbGFzc19maW5kX3Byb3BlcnR5IChrbGFzcywgIm50cC1zeW5jIikpIHsKKyAgICAgICAgZ19vYmplY3Rfc2V0IChzcmMtPm1hbmFnZXIsICJudHAtc3luYyIsIHNyYy0+bnRwX3N5bmMsIE5VTEwpOworICAgICAgfQorCisgICAgICBpZiAoZ19vYmplY3RfY2xhc3NfZmluZF9wcm9wZXJ0eSAoa2xhc3MsICJyZmM3MjczLXN5bmMiKSkgeworICAgICAgICBnX29iamVjdF9zZXQgKHNyYy0+bWFuYWdlciwgInJmYzcyNzMtc3luYyIsIHNyYy0+cmZjNzI3M19zeW5jLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgaWYgKHNyYy0+dXNlX3BpcGVsaW5lX2Nsb2NrKSB7CisgICAgICAgIGlmIChnX29iamVjdF9jbGFzc19maW5kX3Byb3BlcnR5IChrbGFzcywgInVzZS1waXBlbGluZS1jbG9jayIpKSB7CisgICAgICAgICAgZ19vYmplY3Rfc2V0IChzcmMtPm1hbmFnZXIsICJ1c2UtcGlwZWxpbmUtY2xvY2siLCBUUlVFLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGdfb2JqZWN0X2NsYXNzX2ZpbmRfcHJvcGVydHkgKGtsYXNzLCAibnRwLXRpbWUtc291cmNlIikpIHsKKyAgICAgICAgICBnX29iamVjdF9zZXQgKHNyYy0+bWFuYWdlciwgIm50cC10aW1lLXNvdXJjZSIsIHNyYy0+bnRwX3RpbWVfc291cmNlLAorICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoc3JjLT5zZGVzICYmIGdfb2JqZWN0X2NsYXNzX2ZpbmRfcHJvcGVydHkgKGtsYXNzLCAic2RlcyIpKSB7CisgICAgICAgIGdfb2JqZWN0X3NldCAoc3JjLT5tYW5hZ2VyLCAic2RlcyIsIHNyYy0+c2RlcywgTlVMTCk7CisgICAgICB9CisKKyAgICAgIGlmIChnX29iamVjdF9jbGFzc19maW5kX3Byb3BlcnR5IChrbGFzcywgImRyb3Atb24tbGF0ZW5jeSIpKSB7CisgICAgICAgIGdfb2JqZWN0X3NldCAoc3JjLT5tYW5hZ2VyLCAiZHJvcC1vbi1sYXRlbmN5Iiwgc3JjLT5kcm9wX29uX2xhdGVuY3ksCisgICAgICAgICAgICBOVUxMKTsKKyAgICAgIH0KKworICAgICAgaWYgKGdfb2JqZWN0X2NsYXNzX2ZpbmRfcHJvcGVydHkgKGtsYXNzLCAibWF4LXJ0Y3AtcnRwLXRpbWUtZGlmZiIpKSB7CisgICAgICAgIGdfb2JqZWN0X3NldCAoc3JjLT5tYW5hZ2VyLCAibWF4LXJ0Y3AtcnRwLXRpbWUtZGlmZiIsCisgICAgICAgICAgICBzcmMtPm1heF9ydGNwX3J0cF90aW1lX2RpZmYsIE5VTEwpOworICAgICAgfQorCisgICAgICBpZiAoZ19vYmplY3RfY2xhc3NfZmluZF9wcm9wZXJ0eSAoa2xhc3MsICJtYXgtdHMtb2Zmc2V0LWFkanVzdG1lbnQiKSkgeworICAgICAgICBnX29iamVjdF9zZXQgKHNyYy0+bWFuYWdlciwgIm1heC10cy1vZmZzZXQtYWRqdXN0bWVudCIsCisgICAgICAgICAgICBzcmMtPm1heF90c19vZmZzZXRfYWRqdXN0bWVudCwgTlVMTCk7CisgICAgICB9CisKKyAgICAgIGlmIChnX29iamVjdF9jbGFzc19maW5kX3Byb3BlcnR5IChrbGFzcywgIm1heC10cy1vZmZzZXQiKSkgeworICAgICAgICBnaW50NjQgbWF4X3RzX29mZnNldDsKKworICAgICAgICAvKiBzZXR0aW5nIG1heC10cy1vZmZzZXQgaW4gdGhlIG1hbmFnZXIgaGFzIHNpZGUgZWZmZWN0cyBzbyBvbmx5IGRvIGl0CisgICAgICAgICAqIGlmIHRoZSB2YWx1ZSBkaWZmZXJzICovCisgICAgICAgIGdfb2JqZWN0X2dldCAoc3JjLT5tYW5hZ2VyLCAibWF4LXRzLW9mZnNldCIsICZtYXhfdHNfb2Zmc2V0LCBOVUxMKTsKKyAgICAgICAgaWYgKG1heF90c19vZmZzZXQgIT0gc3JjLT5tYXhfdHNfb2Zmc2V0KSB7CisgICAgICAgICAgZ19vYmplY3Rfc2V0IChzcmMtPm1hbmFnZXIsICJtYXgtdHMtb2Zmc2V0Iiwgc3JjLT5tYXhfdHNfb2Zmc2V0LAorICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBidWZmZXIgbW9kZSBwYXVzZXMgYXJlIGhhbmRsZWQgYnkgYWRkaW5nIG9mZnNldHMgdG8gYnVmZmVyIHRpbWVzLAorICAgICAgICogYnV0IHNvbWUgZGVwYXlsb2FkZXJzIG1heSBoYXZlIGEgaGFyZCB0aW1lIHN5bmNpbmcgb3V0cHV0IHRpbWVzCisgICAgICAgKiB3aXRoIHN1Y2ggaW5wdXQgdGltZXMsIGUuZy4gY29udGFpbmVyIG9uZXMsIG1vc3Qgbm90YWJseSBBU0YgKi8KKyAgICAgIC8qIFRPRE8gYWx0ZXJuYXRpdmVzIGFyZSBoYXZpbmcgYW4gZXZlbnQgdGhhdCBpbmRpY2F0ZXMgdGhlc2Ugc2hpZnRzLAorICAgICAgICogb3IgaGF2aW5nIHJ0c3AgZXh0ZW5zaW9ucyBwcm92aWRlIHN1Z2dlc3Rpb24gb24gYnVmZmVyIG1vZGUgKi8KKyAgICAgIC8qIHZhbGlkIGR1cmF0aW9uIGltcGxpZXMgbm90IGxpa2VseSBsaXZlIHBpcGVsaW5lLAorICAgICAgICogc28gc2xhdmluZyBpbiBqaXR0ZXJidWZmZXIgZG9lcyBub3QgbWFrZSBtdWNoIHNlbnNlCisgICAgICAgKiAoYW5kIG1pZ2h0IG1lc3MgdGhpbmdzIHVwIGR1ZSB0byBidXJzdHMpICovCisgICAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHNyYy0+c2VnbWVudC5kdXJhdGlvbikgJiYKKyAgICAgICAgICBzcmMtPnNlZ21lbnQuZHVyYXRpb24gJiYgc3RyZWFtLT5jb250YWluZXIpIHsKKyAgICAgICAgc3JjLT51c2VfYnVmZmVyaW5nID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyYy0+dXNlX2J1ZmZlcmluZyA9IEZBTFNFOworICAgICAgfQorCisgICAgICBzZXRfbWFuYWdlcl9idWZmZXJfbW9kZSAoc3JjKTsKKworICAgICAgLyogY29ubmVjdCB0byBzaWduYWxzICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb25uZWN0IHRvIHNpZ25hbHMgb24gc2Vzc2lvbiBtYW5hZ2VyLCBzdHJlYW0gJXAiLAorICAgICAgICAgIHN0cmVhbSk7CisgICAgICBzcmMtPm1hbmFnZXJfc2lnX2lkID0KKyAgICAgICAgICBnX3NpZ25hbF9jb25uZWN0IChzcmMtPm1hbmFnZXIsICJwYWQtYWRkZWQiLAorICAgICAgICAgIChHQ2FsbGJhY2spIG5ld19tYW5hZ2VyX3BhZCwgc3JjKTsKKyAgICAgIHNyYy0+bWFuYWdlcl9wdG1hcF9pZCA9CisgICAgICAgICAgZ19zaWduYWxfY29ubmVjdCAoc3JjLT5tYW5hZ2VyLCAicmVxdWVzdC1wdC1tYXAiLAorICAgICAgICAgIChHQ2FsbGJhY2spIHJlcXVlc3RfcHRfbWFwLCBzcmMpOworCisgICAgICBnX3NpZ25hbF9jb25uZWN0IChzcmMtPm1hbmFnZXIsICJvbi1ucHQtc3RvcCIsIChHQ2FsbGJhY2spIG9uX25wdF9zdG9wLAorICAgICAgICAgIHNyYyk7CisKKyAgICAgIGdfc2lnbmFsX2VtaXQgKHNyYywgZ3N0X3J0c3BzcmNfc2lnbmFsc1tTSUdOQUxfTkVXX01BTkFHRVJdLCAwLAorICAgICAgICAgIHNyYy0+bWFuYWdlcik7CisKKyAgICAgIGlmIChzcmMtPmRvX3JldHJhbnNtaXNzaW9uKQorICAgICAgICBhZGRfcmV0cmFuc21pc3Npb24gKHNyYywgdHJhbnNwb3J0KTsKKyAgICB9CisgICAgZ19zaWduYWxfY29ubmVjdCAoc3JjLT5tYW5hZ2VyLCAicmVxdWVzdC1ydHAtZGVjb2RlciIsCisgICAgICAgIChHQ2FsbGJhY2spIHJlcXVlc3RfcnRwX2RlY29kZXIsIHN0cmVhbSk7CisgICAgZ19zaWduYWxfY29ubmVjdCAoc3JjLT5tYW5hZ2VyLCAicmVxdWVzdC1ydGNwLWRlY29kZXIiLAorICAgICAgICAoR0NhbGxiYWNrKSByZXF1ZXN0X3J0cF9kZWNvZGVyLCBzdHJlYW0pOworICAgIGdfc2lnbmFsX2Nvbm5lY3QgKHNyYy0+bWFuYWdlciwgInJlcXVlc3QtcnRjcC1lbmNvZGVyIiwKKyAgICAgICAgKEdDYWxsYmFjaykgcmVxdWVzdF9ydGNwX2VuY29kZXIsIHN0cmVhbSk7CisKKyAgICAvKiB3ZSBzdHJlYW0gZGlyZWN0bHkgdG8gdGhlIG1hbmFnZXIsIGdldCBzb21lIHBhZHMuIEVhY2ggUlRTUCBzdHJlYW0gZ29lcworICAgICAqIGludG8gYSBzZXBhcmF0ZSBSVFAgc2Vzc2lvbi4gKi8KKyAgICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgicmVjdl9ydHBfc2lua18ldSIsIHN0cmVhbS0+aWQpOworICAgIHN0cmVhbS0+Y2hhbm5lbHBhZFswXSA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoc3JjLT5tYW5hZ2VyLCBuYW1lKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworICAgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJyZWN2X3J0Y3Bfc2lua18ldSIsIHN0cmVhbS0+aWQpOworICAgIHN0cmVhbS0+Y2hhbm5lbHBhZFsxXSA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoc3JjLT5tYW5hZ2VyLCBuYW1lKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworCisgICAgLyogbm93IGNvbmZpZ3VyZSB0aGUgYmFuZHdpZHRoIGluIHRoZSBtYW5hZ2VyICovCisgICAgaWYgKGdfc2lnbmFsX2xvb2t1cCAoImdldC1pbnRlcm5hbC1zZXNzaW9uIiwKKyAgICAgICAgICAgIEdfT0JKRUNUX1RZUEUgKHNyYy0+bWFuYWdlcikpICE9IDApIHsKKyAgICAgIEdPYmplY3QgKnJ0cHNlc3Npb247CisKKyAgICAgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAoc3JjLT5tYW5hZ2VyLCAiZ2V0LWludGVybmFsLXNlc3Npb24iLCBzdHJlYW0tPmlkLAorICAgICAgICAgICZydHBzZXNzaW9uKTsKKyAgICAgIGlmIChydHBzZXNzaW9uKSB7CisgICAgICAgIEdzdFJUUFByb2ZpbGUgcnRwX3Byb2ZpbGU7CisKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUIChzcmMsICJjb25maWd1cmUgYmFuZHdpZHRoIGluIHNlc3Npb24gJXAiLCBydHBzZXNzaW9uKTsKKworICAgICAgICBzdHJlYW0tPnNlc3Npb24gPSBydHBzZXNzaW9uOworCisgICAgICAgIGlmIChzdHJlYW0tPmFzX2JhbmR3aWR0aCAhPSAtMSkgeworICAgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoc3JjLCAic2V0dGluZyBBUzogJWYiLAorICAgICAgICAgICAgICAoZ2RvdWJsZSkgKHN0cmVhbS0+YXNfYmFuZHdpZHRoICogMTAwMCkpOworICAgICAgICAgIGdfb2JqZWN0X3NldCAocnRwc2Vzc2lvbiwgImJhbmR3aWR0aCIsCisgICAgICAgICAgICAgIChnZG91YmxlKSAoc3RyZWFtLT5hc19iYW5kd2lkdGggKiAxMDAwKSwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmVhbS0+cnJfYmFuZHdpZHRoICE9IC0xKSB7CisgICAgICAgICAgR1NUX0lORk9fT0JKRUNUIChzcmMsICJzZXR0aW5nIFJSOiAldSIsIHN0cmVhbS0+cnJfYmFuZHdpZHRoKTsKKyAgICAgICAgICBnX29iamVjdF9zZXQgKHJ0cHNlc3Npb24sICJydGNwLXJyLWJhbmR3aWR0aCIsIHN0cmVhbS0+cnJfYmFuZHdpZHRoLAorICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyZWFtLT5yc19iYW5kd2lkdGggIT0gLTEpIHsKKyAgICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHNyYywgInNldHRpbmcgUlM6ICV1Iiwgc3RyZWFtLT5yc19iYW5kd2lkdGgpOworICAgICAgICAgIGdfb2JqZWN0X3NldCAocnRwc2Vzc2lvbiwgInJ0Y3AtcnMtYmFuZHdpZHRoIiwgc3RyZWFtLT5yc19iYW5kd2lkdGgsCisgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChzdHJlYW0tPnByb2ZpbGUpIHsKKyAgICAgICAgICBjYXNlIEdTVF9SVFNQX1BST0ZJTEVfQVZQRjoKKyAgICAgICAgICAgIHJ0cF9wcm9maWxlID0gR1NUX1JUUF9QUk9GSUxFX0FWUEY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9SVFNQX1BST0ZJTEVfU0FWUDoKKyAgICAgICAgICAgIHJ0cF9wcm9maWxlID0gR1NUX1JUUF9QUk9GSUxFX1NBVlA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9SVFNQX1BST0ZJTEVfU0FWUEY6CisgICAgICAgICAgICBydHBfcHJvZmlsZSA9IEdTVF9SVFBfUFJPRklMRV9TQVZQRjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX1JUU1BfUFJPRklMRV9BVlA6CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJ0cF9wcm9maWxlID0gR1NUX1JUUF9QUk9GSUxFX0FWUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZ19vYmplY3Rfc2V0IChydHBzZXNzaW9uLCAicnRwLXByb2ZpbGUiLCBydHBfcHJvZmlsZSwgTlVMTCk7CisKKyAgICAgICAgZ19vYmplY3Rfc2V0IChydHBzZXNzaW9uLCAicHJvYmF0aW9uIiwgc3JjLT5wcm9iYXRpb24sIE5VTEwpOworCisgICAgICAgIGdfb2JqZWN0X3NldCAocnRwc2Vzc2lvbiwgImludGVybmFsLXNzcmMiLCBzdHJlYW0tPnNlbmRfc3NyYywgTlVMTCk7CisKKyAgICAgICAgZ19zaWduYWxfY29ubmVjdCAocnRwc2Vzc2lvbiwgIm9uLWJ5ZS1zc3JjIiwgKEdDYWxsYmFjaykgb25fYnllX3NzcmMsCisgICAgICAgICAgICBzdHJlYW0pOworICAgICAgICBnX3NpZ25hbF9jb25uZWN0IChydHBzZXNzaW9uLCAib24tYnllLXRpbWVvdXQiLCAoR0NhbGxiYWNrKSBvbl90aW1lb3V0LAorICAgICAgICAgICAgc3RyZWFtKTsKKyAgICAgICAgZ19zaWduYWxfY29ubmVjdCAocnRwc2Vzc2lvbiwgIm9uLXRpbWVvdXQiLCAoR0NhbGxiYWNrKSBvbl90aW1lb3V0LAorICAgICAgICAgICAgc3RyZWFtKTsKKyAgICAgICAgZ19zaWduYWxfY29ubmVjdCAocnRwc2Vzc2lvbiwgIm9uLXNzcmMtYWN0aXZlIiwKKyAgICAgICAgICAgIChHQ2FsbGJhY2spIG9uX3NzcmNfYWN0aXZlLCBzdHJlYW0pOworICAgICAgfQorICAgIH0KKyAgfQorCit1c2Vfbm9fbWFuYWdlcjoKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19tYW5hZ2VyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY2Fubm90IGdldCBhIHNlc3Npb24gbWFuYWdlciIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbWFuYWdlcl9mYWlsZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJubyBzZXNzaW9uIG1hbmFnZXIgZWxlbWVudCAlcyBmb3VuZCIsIG1hbmFnZXIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorc3RhcnRfbWFuYWdlcl9mYWlsdXJlOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY291bGQgbm90IHN0YXJ0IHNlc3Npb24gbWFuYWdlciIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKiBmcmVlIHRoZSBVRFAgc291cmNlcyBhbGxvY2F0ZWQgd2hlbiBuZWdvdGlhdGluZyBhIHRyYW5zcG9ydC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHNlcnZlciBuZWdvdGlhdGVkIHRvIGEgdHJhbnNwb3J0IHdoZXJlIHRoZQorICogVURQIHNvdXJjZXMgYXJlIG5vdCBuZWVkZWQgYW55bW9yZSwgc3VjaCBhcyBUQ1Agb3IgbXVsdGljYXN0LiAqLworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX3N0cmVhbV9mcmVlX3VkcCAoR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSkKK3sKKyAgZ2ludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICBpZiAoc3RyZWFtLT51ZHBzcmNbaV0pIHsKKyAgICAgIEdTVF9ERUJVRyAoImZyZWUgVURQIHNvdXJjZSAlZCBmb3Igc3RyZWFtICVwIiwgaSwgc3RyZWFtKTsKKyAgICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc3RyZWFtLT51ZHBzcmNbaV0sIEdTVF9TVEFURV9OVUxMKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHN0cmVhbS0+dWRwc3JjW2ldKTsKKyAgICAgIHN0cmVhbS0+dWRwc3JjW2ldID0gTlVMTDsKKyAgICB9CisgIH0KK30KKworLyogZm9yIFRDUCwgY3JlYXRlIHBhZHMgdG8gc2VuZCBhbmQgcmVjZWl2ZSBkYXRhIHRvIGFuZCBmcm9tIHRoZSBtYW5hZ2VyIGFuZCB0bworICogaW50ZXJjZXB0IHZhcmlvdXMgZXZlbnRzIGFuZCBxdWVyaWVzCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV90Y3AgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BTdHJlYW0gKiBzdHJlYW0sCisgICAgR3N0UlRTUFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgR3N0UGFkICoqIG91dHBhZCkKK3sKKyAgZ2NoYXIgKm5hbWU7CisgIEdzdFBhZFRlbXBsYXRlICp0ZW1wbGF0ZTsKKyAgR3N0UGFkICpwYWQwLCAqcGFkMTsKKworICAvKiBjb25maWd1cmUgZm9yIGludGVybGVhdmVkIGRlbGl2ZXJ5LCBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUKKyAgICogaGVyZSwgdGhlIGxvb3AgZnVuY3Rpb24gd2lsbCBjYWxsIHRoZSBjaGFpbiBmdW5jdGlvbnMgb2YgdGhlCisgICAqIHNlc3Npb24gbWFuYWdlci4gKi8KKyAgc3RyZWFtLT5jaGFubmVsWzBdID0gdHJhbnNwb3J0LT5pbnRlcmxlYXZlZC5taW47CisgIHN0cmVhbS0+Y2hhbm5lbFsxXSA9IHRyYW5zcG9ydC0+aW50ZXJsZWF2ZWQubWF4OworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdHJlYW0gJXAgb24gY2hhbm5lbHMgJWQtJWQiLCBzdHJlYW0sCisgICAgICBzdHJlYW0tPmNoYW5uZWxbMF0sIHN0cmVhbS0+Y2hhbm5lbFsxXSk7CisKKyAgLyogd2UgY2FuIHJlbW92ZSB0aGUgYWxsb2NhdGVkIFVEUCBwb3J0cyBub3cgKi8KKyAgZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWVfdWRwIChzdHJlYW0pOworCisgIC8qIG5vIHNlc3Npb24gbWFuYWdlciwgc2VuZCBkYXRhIHRvIHNyY3BhZCBkaXJlY3RseSAqLworICBpZiAoIXN0cmVhbS0+Y2hhbm5lbHBhZFswXSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIm5vIG1hbmFnZXIsIGNyZWF0aW5nIHBhZCIpOworCisgICAgLyogY3JlYXRlIGEgbmV3IHBhZCB3ZSB3aWxsIHVzZSB0byBzdHJlYW0gdG8gKi8KKyAgICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic3RyZWFtXyV1Iiwgc3RyZWFtLT5pZCk7CisgICAgdGVtcGxhdGUgPSBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXQgKCZydHB0ZW1wbGF0ZSk7CisgICAgc3RyZWFtLT5jaGFubmVscGFkWzBdID0gZ3N0X3BhZF9uZXdfZnJvbV90ZW1wbGF0ZSAodGVtcGxhdGUsIG5hbWUpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHRlbXBsYXRlKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworCisgICAgLyogc2V0IGNhcHMgYW5kIGFjdGl2YXRlICovCisgICAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAoc3RyZWFtLT5jaGFubmVscGFkWzBdKTsKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKHN0cmVhbS0+Y2hhbm5lbHBhZFswXSwgVFJVRSk7CisKKyAgICAqb3V0cGFkID0gZ3N0X29iamVjdF9yZWYgKHN0cmVhbS0+Y2hhbm5lbHBhZFswXSk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAidXNpbmcgbWFuYWdlciBzb3VyY2UgcGFkIik7CisKKyAgICB0ZW1wbGF0ZSA9IGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCAoJmFueXNyY3RlbXBsYXRlKTsKKworICAgIC8qIGFsbG9jYXRlIHBhZHMgZm9yIHNlbmRpbmcgdGhlIGNoYW5uZWwgZGF0YSBpbnRvIHRoZSBtYW5hZ2VyICovCisgICAgcGFkMCA9IGdzdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKHRlbXBsYXRlLCAiaW50ZXJuYWxzcmNfMCIpOworICAgIGdzdF9wYWRfbGlua19mdWxsIChwYWQwLCBzdHJlYW0tPmNoYW5uZWxwYWRbMF0sIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzdHJlYW0tPmNoYW5uZWxwYWRbMF0pOworICAgIHN0cmVhbS0+Y2hhbm5lbHBhZFswXSA9IHBhZDA7CisgICAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHBhZDAsIGdzdF9ydHNwc3JjX2hhbmRsZV9pbnRlcm5hbF9zcmNfZXZlbnQpOworICAgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChwYWQwLCBnc3RfcnRzcHNyY19oYW5kbGVfaW50ZXJuYWxfc3JjX3F1ZXJ5KTsKKyAgICBnc3RfcGFkX3NldF9lbGVtZW50X3ByaXZhdGUgKHBhZDAsIHNyYyk7CisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlIChwYWQwLCBUUlVFKTsKKworICAgIGlmIChzdHJlYW0tPmNoYW5uZWxwYWRbMV0pIHsKKyAgICAgIC8qIGlmIHdlIGhhdmUgYSBzaW5rcGFkIGZvciB0aGUgb3RoZXIgY2hhbm5lbCwgY3JlYXRlIGEgcGFkIGFuZCBsaW5rIHRvIHRoZQorICAgICAgICogbWFuYWdlci4gKi8KKyAgICAgIHBhZDEgPSBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlICh0ZW1wbGF0ZSwgImludGVybmFsc3JjXzEiKTsKKyAgICAgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChwYWQxLCBnc3RfcnRzcHNyY19oYW5kbGVfaW50ZXJuYWxfc3JjX2V2ZW50KTsKKyAgICAgIGdzdF9wYWRfbGlua19mdWxsIChwYWQxLCBzdHJlYW0tPmNoYW5uZWxwYWRbMV0sCisgICAgICAgICAgR1NUX1BBRF9MSU5LX0NIRUNLX05PVEhJTkcpOworICAgICAgZ3N0X29iamVjdF91bnJlZiAoc3RyZWFtLT5jaGFubmVscGFkWzFdKTsKKyAgICAgIHN0cmVhbS0+Y2hhbm5lbHBhZFsxXSA9IHBhZDE7CisgICAgICBnc3RfcGFkX3NldF9hY3RpdmUgKHBhZDEsIFRSVUUpOworICAgIH0KKyAgICBnc3Rfb2JqZWN0X3VucmVmICh0ZW1wbGF0ZSk7CisgIH0KKyAgLyogc2V0dXAgUlRDUCB0cmFuc3BvcnQgYmFjayB0byB0aGUgc2VydmVyIGlmIHdlIGhhdmUgdG8uICovCisgIGlmIChzcmMtPm1hbmFnZXIgJiYgc3JjLT5kb19ydGNwKSB7CisgICAgR3N0UGFkICpwYWQ7CisKKyAgICB0ZW1wbGF0ZSA9IGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCAoJmFueXNpbmt0ZW1wbGF0ZSk7CisKKyAgICBzdHJlYW0tPnJ0Y3BwYWQgPSBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlICh0ZW1wbGF0ZSwgImludGVybmFsc2lua18wIik7CisgICAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHN0cmVhbS0+cnRjcHBhZCwgZ3N0X3J0c3BzcmNfc2lua19jaGFpbik7CisgICAgZ3N0X3BhZF9zZXRfZWxlbWVudF9wcml2YXRlIChzdHJlYW0tPnJ0Y3BwYWQsIHN0cmVhbSk7CisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzdHJlYW0tPnJ0Y3BwYWQsIFRSVUUpOworCisgICAgLyogZ2V0IHNlc3Npb24gUlRDUCBwYWQgKi8KKyAgICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic2VuZF9ydGNwX3NyY18ldSIsIHN0cmVhbS0+aWQpOworICAgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoc3JjLT5tYW5hZ2VyLCBuYW1lKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworCisgICAgLyogYW5kIGxpbmsgKi8KKyAgICBpZiAocGFkKSB7CisgICAgICBnc3RfcGFkX2xpbmtfZnVsbCAocGFkLCBzdHJlYW0tPnJ0Y3BwYWQsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisgICAgfQorCisgICAgZ3N0X29iamVjdF91bnJlZiAodGVtcGxhdGUpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfZ2V0X3RyYW5zcG9ydF9pbmZvIChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQU3RyZWFtICogc3RyZWFtLAorICAgIEdzdFJUU1BUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIGNvbnN0IGdjaGFyICoqIGRlc3RpbmF0aW9uLCBnaW50ICogbWluLAorICAgIGdpbnQgKiBtYXgsIGd1aW50ICogdHRsKQoreworICBpZiAodHJhbnNwb3J0LT5sb3dlcl90cmFuc3BvcnQgPT0gR1NUX1JUU1BfTE9XRVJfVFJBTlNfVURQX01DQVNUKSB7CisgICAgaWYgKGRlc3RpbmF0aW9uKSB7CisgICAgICBpZiAoISgqZGVzdGluYXRpb24gPSB0cmFuc3BvcnQtPmRlc3RpbmF0aW9uKSkKKyAgICAgICAgKmRlc3RpbmF0aW9uID0gc3RyZWFtLT5kZXN0aW5hdGlvbjsKKyAgICB9CisgICAgaWYgKG1pbiAmJiBtYXgpIHsKKyAgICAgIC8qIHRyYW5zcG9ydCBmaXJzdCAqLworICAgICAgKm1pbiA9IHRyYW5zcG9ydC0+cG9ydC5taW47CisgICAgICAqbWF4ID0gdHJhbnNwb3J0LT5wb3J0Lm1heDsKKyAgICAgIGlmICgqbWluID09IC0xICYmICptYXggPT0gLTEpIHsKKyAgICAgICAgLyogdGhlbiB0cnkgZnJvbSBTRFAgKi8KKyAgICAgICAgaWYgKHN0cmVhbS0+cG9ydCAhPSAwKSB7CisgICAgICAgICAgKm1pbiA9IHN0cmVhbS0+cG9ydDsKKyAgICAgICAgICAqbWF4ID0gc3RyZWFtLT5wb3J0ICsgMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmICh0dGwpIHsKKyAgICAgIGlmICghKCp0dGwgPSB0cmFuc3BvcnQtPnR0bCkpCisgICAgICAgICp0dGwgPSBzdHJlYW0tPnR0bDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGRlc3RpbmF0aW9uKSB7CisgICAgICAvKiBmaXJzdCB0YWtlIHRoZSBzb3VyY2UsIHRoZW4gdGhlIGVuZHBvaW50IHRvIGZpZ3VyZSBvdXQgd2hlcmUgdG8gc2VuZAorICAgICAgICogdGhlIFJUQ1AuICovCisgICAgICBpZiAoISgqZGVzdGluYXRpb24gPSB0cmFuc3BvcnQtPnNvdXJjZSkpIHsKKyAgICAgICAgaWYgKHNyYy0+Y29ubmluZm8uY29ubmVjdGlvbikKKyAgICAgICAgICAqZGVzdGluYXRpb24gPSBnc3RfcnRzcF9jb25uZWN0aW9uX2dldF9pcCAoc3JjLT5jb25uaW5mby5jb25uZWN0aW9uKTsKKyAgICAgICAgZWxzZSBpZiAoc3RyZWFtLT5jb25uaW5mby5jb25uZWN0aW9uKQorICAgICAgICAgICpkZXN0aW5hdGlvbiA9CisgICAgICAgICAgICAgIGdzdF9ydHNwX2Nvbm5lY3Rpb25fZ2V0X2lwIChzdHJlYW0tPmNvbm5pbmZvLmNvbm5lY3Rpb24pOworICAgICAgfQorICAgIH0KKyAgICBpZiAobWluICYmIG1heCkgeworICAgICAgLyogZm9yIHVuaWNhc3Qgd2Ugb25seSBleHBlY3QgdGhlIHBvcnRzIGhlcmUgKi8KKyAgICAgICptaW4gPSB0cmFuc3BvcnQtPnNlcnZlcl9wb3J0Lm1pbjsKKyAgICAgICptYXggPSB0cmFuc3BvcnQtPnNlcnZlcl9wb3J0Lm1heDsKKyAgICB9CisgIH0KK30KKworLyogRm9yIG11bHRpY2FzdCBjcmVhdGUgVURQIHNvdXJjZXMgYW5kIGpvaW4gdGhlIG11bHRpY2FzdCBncm91cC4gKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV9tY2FzdCAoR3N0UlRTUFNyYyAqIHNyYywgR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RSVFNQVHJhbnNwb3J0ICogdHJhbnNwb3J0LCBHc3RQYWQgKiogb3V0cGFkKQoreworICBnY2hhciAqdXJpOworICBjb25zdCBnY2hhciAqZGVzdGluYXRpb247CisgIGdpbnQgbWluLCBtYXg7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY3JlYXRpbmcgVURQIHNvdXJjZXMgZm9yIG11bHRpY2FzdCIpOworCisgIC8qIHdlIGNhbiByZW1vdmUgdGhlIGFsbG9jYXRlZCBVRFAgcG9ydHMgbm93ICovCisgIGdzdF9ydHNwc3JjX3N0cmVhbV9mcmVlX3VkcCAoc3RyZWFtKTsKKworICBnc3RfcnRzcHNyY19nZXRfdHJhbnNwb3J0X2luZm8gKHNyYywgc3RyZWFtLCB0cmFuc3BvcnQsICZkZXN0aW5hdGlvbiwgJm1pbiwKKyAgICAgICZtYXgsIE5VTEwpOworCisgIC8qIHdlIG5lZWQgYSBkZXN0aW5hdGlvbiBub3cgKi8KKyAgaWYgKGRlc3RpbmF0aW9uID09IE5VTEwpCisgICAgZ290byBub19kZXN0aW5hdGlvbjsKKworICAvKiB3ZSByZWFsbHkgbmVlZCBwb3J0cyBub3cgb3Igd2Ugd29uJ3QgYmUgYWJsZSB0byByZWNlaXZlIGFueXRoaW5nIGF0IGFsbCAqLworICBpZiAobWluID09IC0xICYmIG1heCA9PSAtMSkKKyAgICBnb3RvIG5vX3BvcnRzOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImhhdmUgZGVzdGluYXRpb24gJyVzJyBhbmQgcG9ydHMgKCVkKS0oJWQpIiwKKyAgICAgIGRlc3RpbmF0aW9uLCBtaW4sIG1heCk7CisKKyAgLyogY3JlYXRpbmcgVURQIHNvdXJjZSBmb3IgUlRQICovCisgIGlmIChtaW4gIT0gLTEpIHsKKyAgICB1cmkgPSBnX3N0cmR1cF9wcmludGYgKCJ1ZHA6Ly8lczolZCIsIGRlc3RpbmF0aW9uLCBtaW4pOworICAgIHN0cmVhbS0+dWRwc3JjWzBdID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfbWFrZV9mcm9tX3VyaSAoR1NUX1VSSV9TUkMsIHVyaSwgTlVMTCwgTlVMTCk7CisgICAgZ19mcmVlICh1cmkpOworICAgIGlmIChzdHJlYW0tPnVkcHNyY1swXSA9PSBOVUxMKQorICAgICAgZ290byBub19lbGVtZW50OworCisgICAgLyogdGFrZSBvd25lcnNoaXAgKi8KKyAgICBnc3Rfb2JqZWN0X3JlZl9zaW5rIChzdHJlYW0tPnVkcHNyY1swXSk7CisKKyAgICBpZiAoc3JjLT51ZHBfYnVmZmVyX3NpemUgIT0gMCkKKyAgICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHN0cmVhbS0+dWRwc3JjWzBdKSwgImJ1ZmZlci1zaXplIiwKKyAgICAgICAgICBzcmMtPnVkcF9idWZmZXJfc2l6ZSwgTlVMTCk7CisKKyAgICBpZiAoc3JjLT5tdWx0aV9pZmFjZSAhPSBOVUxMKQorICAgICAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc3RyZWFtLT51ZHBzcmNbMF0pLCAibXVsdGljYXN0LWlmYWNlIiwKKyAgICAgICAgICBzcmMtPm11bHRpX2lmYWNlLCBOVUxMKTsKKworICAgIC8qIGNoYW5nZSBzdGF0ZSAqLworICAgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHN0cmVhbS0+dWRwc3JjWzBdLCBUUlVFKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHN0cmVhbS0+dWRwc3JjWzBdLCBHU1RfU1RBVEVfUkVBRFkpOworICB9CisKKyAgLyogY3JlYXRpbmcgYW5vdGhlciBVRFAgc291cmNlIGZvciBSVENQICovCisgIGlmIChtYXggIT0gLTEpIHsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgdXJpID0gZ19zdHJkdXBfcHJpbnRmICgidWRwOi8vJXM6JWQiLCBkZXN0aW5hdGlvbiwgbWF4KTsKKyAgICBzdHJlYW0tPnVkcHNyY1sxXSA9CisgICAgICAgIGdzdF9lbGVtZW50X21ha2VfZnJvbV91cmkgKEdTVF9VUklfU1JDLCB1cmksIE5VTEwsIE5VTEwpOworICAgIGdfZnJlZSAodXJpKTsKKyAgICBpZiAoc3RyZWFtLT51ZHBzcmNbMV0gPT0gTlVMTCkKKyAgICAgIGdvdG8gbm9fZWxlbWVudDsKKworICAgIGlmIChzdHJlYW0tPnByb2ZpbGUgPT0gR1NUX1JUU1BfUFJPRklMRV9TQVZQIHx8CisgICAgICAgIHN0cmVhbS0+cHJvZmlsZSA9PSBHU1RfUlRTUF9QUk9GSUxFX1NBVlBGKQorICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXNydGNwIik7CisgICAgZWxzZQorICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXJ0Y3AiKTsKKyAgICBnX29iamVjdF9zZXQgKHN0cmVhbS0+dWRwc3JjWzFdLCAiY2FwcyIsIGNhcHMsIE5VTEwpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgIC8qIHRha2Ugb3duZXJzaGlwICovCisgICAgZ3N0X29iamVjdF9yZWZfc2luayAoc3RyZWFtLT51ZHBzcmNbMV0pOworCisgICAgaWYgKHNyYy0+bXVsdGlfaWZhY2UgIT0gTlVMTCkKKyAgICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHN0cmVhbS0+dWRwc3JjWzFdKSwgIm11bHRpY2FzdC1pZmFjZSIsCisgICAgICAgICAgc3JjLT5tdWx0aV9pZmFjZSwgTlVMTCk7CisKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHN0cmVhbS0+dWRwc3JjWzFdLCBHU1RfU1RBVEVfUkVBRFkpOworICB9CisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworbm9fZWxlbWVudDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIm5vIFVEUCBzb3VyY2UgZWxlbWVudCBmb3VuZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fZGVzdGluYXRpb246CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJubyBkZXN0aW5hdGlvbiBmb3VuZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fcG9ydHM6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJubyBwb3J0cyBmb3VuZCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKiBjb25maWd1cmUgdGhlIHJlbWFpbmRlciBvZiB0aGUgVURQIHBvcnRzICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdWRwIChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQU3RyZWFtICogc3RyZWFtLAorICAgIEdzdFJUU1BUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdzdFBhZCAqKiBvdXRwYWQpCit7CisgIC8qIHdlIG1hbmFnZSB0aGUgVURQIGVsZW1lbnRzIG5vdy4gRm9yIHVuaWNhc3QsIHRoZSBVRFAgc291cmNlcyB3aGVyZQorICAgKiBhbGxvY2F0ZWQgaW4gdGhlIHN0cmVhbSB3aGVuIHdlIHN1Z2dlc3RlZCBhIHRyYW5zcG9ydC4gKi8KKyAgaWYgKHN0cmVhbS0+dWRwc3JjWzBdKSB7CisgICAgR3N0Q2FwcyAqY2FwczsKKworICAgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHN0cmVhbS0+dWRwc3JjWzBdLCBUUlVFKTsKKyAgICBnc3RfYmluX2FkZCAoR1NUX0JJTl9DQVNUIChzcmMpLCBzdHJlYW0tPnVkcHNyY1swXSk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzZXR0aW5nIHVwIFVEUCBzb3VyY2UiKTsKKworICAgIC8qIGNvbmZpZ3VyZSBhIHRpbWVvdXQgb24gdGhlIFVEUCBwb3J0LiBXaGVuIHRoZSB0aW1lb3V0IG1lc3NhZ2UgaXMKKyAgICAgKiBwb3N0ZWQsIHdlIGFzc3VtZSBVRFAgdHJhbnNwb3J0IGlzIG5vdCBwb3NzaWJsZS4gV2UgcmVjb25uZWN0IHVzaW5nIFRDUAorICAgICAqIGlmIHdlIGNhbi4gKi8KKyAgICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzdHJlYW0tPnVkcHNyY1swXSksICJ0aW1lb3V0IiwKKyAgICAgICAgc3JjLT51ZHBfdGltZW91dCAqIDEwMDAsIE5VTEwpOworCisgICAgaWYgKChjYXBzID0gc3RyZWFtX2dldF9jYXBzX2Zvcl9wdCAoc3RyZWFtLCBzdHJlYW0tPmRlZmF1bHRfcHQpKSkKKyAgICAgIGdfb2JqZWN0X3NldCAoc3RyZWFtLT51ZHBzcmNbMF0sICJjYXBzIiwgY2FwcywgTlVMTCk7CisKKyAgICAvKiBnZXQgb3V0cHV0IHBhZCBvZiB0aGUgVURQIHNvdXJjZS4gKi8KKyAgICAqb3V0cGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHN0cmVhbS0+dWRwc3JjWzBdLCAic3JjIik7CisKKyAgICAvKiBzYXZlIGl0IHNvIHdlIGNhbiB1bmJsb2NrICovCisgICAgc3RyZWFtLT5ibG9ja2VkcGFkID0gKm91dHBhZDsKKworICAgIC8qIGNvbmZpZ3VyZSBwYWQgYmxvY2sgb24gdGhlIHBhZC4gQXMgc29vbiBhcyB0aGVyZSBpcyBkYXRhZmxvdyBvbiB0aGUKKyAgICAgKiBVRFAgc291cmNlLCB3ZSBrbm93IHRoYXQgVURQIGlzIG5vdCBibG9ja2VkIGJ5IGEgZmlyZXdhbGwgYW5kIHdlIGNhbgorICAgICAqIGNvbmZpZ3VyZSBhbGwgdGhlIHN0cmVhbXMgdG8gbGV0IHRoZSBhcHBsaWNhdGlvbiBhdXRvcGx1ZyBkZWNvZGVycy4gKi8KKyAgICBzdHJlYW0tPmJsb2NraWQgPQorICAgICAgICBnc3RfcGFkX2FkZF9wcm9iZSAoc3RyZWFtLT5ibG9ja2VkcGFkLAorICAgICAgICBHU1RfUEFEX1BST0JFX1RZUEVfQkxPQ0sgfCBHU1RfUEFEX1BST0JFX1RZUEVfQlVGRkVSIHwKKyAgICAgICAgR1NUX1BBRF9QUk9CRV9UWVBFX0JVRkZFUl9MSVNULCBwYWRfYmxvY2tlZCwgc3JjLCBOVUxMKTsKKworICAgIGlmIChzdHJlYW0tPmNoYW5uZWxwYWRbMF0pIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNvbm5lY3RpbmcgVURQIHNvdXJjZSAwIHRvIG1hbmFnZXIiKTsKKyAgICAgIC8qIGNvbmZpZ3VyZSBmb3IgVURQIGRlbGl2ZXJ5LCB3ZSBuZWVkIHRvIGNvbm5lY3QgdGhlIFVEUCBwYWRzIHRvCisgICAgICAgKiB0aGUgc2Vzc2lvbiBwbHVnaW4uICovCisgICAgICBnc3RfcGFkX2xpbmtfZnVsbCAoKm91dHBhZCwgc3RyZWFtLT5jaGFubmVscGFkWzBdLAorICAgICAgICAgIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKCpvdXRwYWQpOworICAgICAgKm91dHBhZCA9IE5VTEw7CisgICAgICAvKiB3ZSBjb25uZWN0ZWQgdG8gcGFkLWFkZGVkIHNpZ25hbCB0byBnZXQgcGFkcyBmcm9tIHRoZSBtYW5hZ2VyICovCisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInVzaW5nIFVEUCBzcmMgcGFkIGFzIG91dHB1dCIpOworICAgIH0KKyAgfQorCisgIC8qIFJUQ1AgcG9ydCAqLworICBpZiAoc3RyZWFtLT51ZHBzcmNbMV0pIHsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSAoc3RyZWFtLT51ZHBzcmNbMV0sIFRSVUUpOworICAgIGdzdF9iaW5fYWRkIChHU1RfQklOX0NBU1QgKHNyYyksIHN0cmVhbS0+dWRwc3JjWzFdKTsKKworICAgIGlmIChzdHJlYW0tPnByb2ZpbGUgPT0gR1NUX1JUU1BfUFJPRklMRV9TQVZQIHx8CisgICAgICAgIHN0cmVhbS0+cHJvZmlsZSA9PSBHU1RfUlRTUF9QUk9GSUxFX1NBVlBGKQorICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXNydGNwIik7CisgICAgZWxzZQorICAgICAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXJ0Y3AiKTsKKyAgICBnX29iamVjdF9zZXQgKHN0cmVhbS0+dWRwc3JjWzFdLCAiY2FwcyIsIGNhcHMsIE5VTEwpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAgIGlmIChzdHJlYW0tPmNoYW5uZWxwYWRbMV0pIHsKKyAgICAgIEdzdFBhZCAqcGFkOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb25uZWN0aW5nIFVEUCBzb3VyY2UgMSB0byBtYW5hZ2VyIik7CisKKyAgICAgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzdHJlYW0tPnVkcHNyY1sxXSwgInNyYyIpOworICAgICAgZ3N0X3BhZF9saW5rX2Z1bGwgKHBhZCwgc3RyZWFtLT5jaGFubmVscGFkWzFdLAorICAgICAgICAgIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGxlYXZlIHVubGlua2VkICovCisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCisvKiBjb25maWd1cmUgdGhlIFVEUCBzaW5rIGJhY2sgdG8gdGhlIHNlcnZlciBmb3Igc3RhdHVzIHJlcG9ydHMgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV91ZHBfc2lua3MgKEdzdFJUU1BTcmMgKiBzcmMsCisgICAgR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwgR3N0UlRTUFRyYW5zcG9ydCAqIHRyYW5zcG9ydCkKK3sKKyAgR3N0UGFkICpwYWQ7CisgIGdpbnQgcnRwX3BvcnQsIHJ0Y3BfcG9ydDsKKyAgZ2Jvb2xlYW4gZG9fcnRwLCBkb19ydGNwOworICBjb25zdCBnY2hhciAqZGVzdGluYXRpb247CisgIGdjaGFyICp1cmksICpuYW1lOworICBndWludCB0dGwgPSAwOworICBHU29ja2V0ICpzb2NrZXQ7CisKKyAgLyogZ2V0IHRyYW5zcG9ydCBpbmZvICovCisgIGdzdF9ydHNwc3JjX2dldF90cmFuc3BvcnRfaW5mbyAoc3JjLCBzdHJlYW0sIHRyYW5zcG9ydCwgJmRlc3RpbmF0aW9uLAorICAgICAgJnJ0cF9wb3J0LCAmcnRjcF9wb3J0LCAmdHRsKTsKKworICAvKiBzZWUgd2hhdCB3ZSBuZWVkIHRvIGRvICovCisgIGRvX3J0cCA9IChydHBfcG9ydCAhPSAtMSk7CisgIC8qIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgc2VydmVyIGRvZXMgbm90IHdhbnQgdXMgdG8gc2VuZCBSVENQIGluIHdoaWNoIGNhc2UKKyAgICogdGhlIHBvcnQgaXMgLTEgKi8KKyAgZG9fcnRjcCA9IChydGNwX3BvcnQgIT0gLTEgJiYgc3JjLT5tYW5hZ2VyICE9IE5VTEwgJiYgc3JjLT5kb19ydGNwKTsKKworICAvKiB3ZSBuZWVkIGEgZGVzdGluYXRpb24gd2hlbiB3ZSBoYXZlIFJUUCBvciBSVENQIHBvcnRzICovCisgIGlmIChkZXN0aW5hdGlvbiA9PSBOVUxMICYmIChkb19ydHAgfHwgZG9fcnRjcCkpCisgICAgZ290byBub19kZXN0aW5hdGlvbjsKKworICAvKiB0cnkgdG8gY29uc3RydWN0IHRoZSBmYWtlc3JjIHRvIHRoZSBSVFAgcG9ydCBvZiB0aGUgc2VydmVyIHRvIG9wZW4gdXAgYW55CisgICAqIE5BVCBmaXJld2FsbHMgKi8KKyAgaWYgKGRvX3J0cCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNvbmZpZ3VyZSBSVFAgVURQIHNpbmsgZm9yICVzOiVkIiwgZGVzdGluYXRpb24sCisgICAgICAgIHJ0cF9wb3J0KTsKKworICAgIHVyaSA9IGdfc3RyZHVwX3ByaW50ZiAoInVkcDovLyVzOiVkIiwgZGVzdGluYXRpb24sIHJ0cF9wb3J0KTsKKyAgICBzdHJlYW0tPnVkcHNpbmtbMF0gPQorICAgICAgICBnc3RfZWxlbWVudF9tYWtlX2Zyb21fdXJpIChHU1RfVVJJX1NJTkssIHVyaSwgTlVMTCwgTlVMTCk7CisgICAgZ19mcmVlICh1cmkpOworICAgIGlmIChzdHJlYW0tPnVkcHNpbmtbMF0gPT0gTlVMTCkKKyAgICAgIGdvdG8gbm9fc2lua19lbGVtZW50OworCisgICAgLyogZG9uJ3Qgam9pbiBtdWx0aWNhc3QgZ3JvdXAsIHdlIHdpbGwgaGF2ZSB0aGUgc291cmNlIHNvY2tldCBkbyB0aGF0ICovCisgICAgLyogbm8gc3luYyBvciBhc3luYyBzdGF0ZSBjaGFuZ2VzIG5lZWRlZCAqLworICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHN0cmVhbS0+dWRwc2lua1swXSksICJhdXRvLW11bHRpY2FzdCIsIEZBTFNFLAorICAgICAgICAibG9vcCIsIEZBTFNFLCAic3luYyIsIEZBTFNFLCAiYXN5bmMiLCBGQUxTRSwgTlVMTCk7CisgICAgaWYgKHR0bCA+IDApCisgICAgICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzdHJlYW0tPnVkcHNpbmtbMF0pLCAidHRsIiwgdHRsLCBOVUxMKTsKKworICAgIGlmIChzdHJlYW0tPnVkcHNyY1swXSkgeworICAgICAgLyogY29uZmlndXJlIHNvY2tldCwgd2UgZ2l2ZSBpdCB0aGUgc2FtZSBVRFAgc29ja2V0IGFzIHRoZSB1ZHBzcmMgZm9yIFJUUAorICAgICAgICogc28gdGhhdCBOQVQgZmlyZXdhbGxzIHdpbGwgb3BlbiBhIGhvbGUgZm9yIHVzICovCisgICAgICBnX29iamVjdF9nZXQgKEdfT0JKRUNUIChzdHJlYW0tPnVkcHNyY1swXSksICJ1c2VkLXNvY2tldCIsICZzb2NrZXQsIE5VTEwpOworICAgICAgaWYgKCFzb2NrZXQpCisgICAgICAgIGdvdG8gbm9fc29ja2V0OworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJSVFAgVURQIHNyYyBoYXMgc29jayAlcCIsIHNvY2tldCk7CisgICAgICAvKiBjb25maWd1cmUgc29ja2V0IGFuZCBtYWtlIHN1cmUgdWRwc2luayBkb2VzIG5vdCBjbG9zZSBpdCB3aGVuIHNodXR0aW5nCisgICAgICAgKiBkb3duLCBpdCBiZWxvbmdzIHRvIHVkcHNyYyBhZnRlciBhbGwuICovCisgICAgICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzdHJlYW0tPnVkcHNpbmtbMF0pLCAic29ja2V0Iiwgc29ja2V0LAorICAgICAgICAgICJjbG9zZS1zb2NrZXQiLCBGQUxTRSwgTlVMTCk7CisgICAgICBnX29iamVjdF91bnJlZiAoc29ja2V0KTsKKyAgICB9CisKKyAgICAvKiB0aGUgc291cmNlIGZvciB0aGUgZHVtbXkgcGFja2V0cyB0byBvcGVuIHVwIE5BVCAqLworICAgIHN0cmVhbS0+ZmFrZXNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzcmMiLCBOVUxMKTsKKyAgICBpZiAoc3RyZWFtLT5mYWtlc3JjID09IE5VTEwpCisgICAgICBnb3RvIG5vX2Zha2VzcmNfZWxlbWVudDsKKworICAgIC8qIHJhbmRvbSBkYXRhIGluIDUgYnVmZmVycywgYSBzaXplIG9mIDIwMCBieXRlcyBzaG91bGQgYmUgZmluZSAqLworICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHN0cmVhbS0+ZmFrZXNyYyksICJmaWxsdHlwZSIsIDMsICJudW0tYnVmZmVycyIsIDUsCisgICAgICAgICJzaXpldHlwZSIsIDIsICJzaXplbWF4IiwgMjAwLCAic2lsZW50IiwgVFJVRSwgTlVMTCk7CisKKyAgICAvKiBrZWVwIGV2ZXJ5dGhpbmcgbG9ja2VkICovCisgICAgZ3N0X2VsZW1lbnRfc2V0X2xvY2tlZF9zdGF0ZSAoc3RyZWFtLT51ZHBzaW5rWzBdLCBUUlVFKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfbG9ja2VkX3N0YXRlIChzdHJlYW0tPmZha2VzcmMsIFRSVUUpOworCisgICAgZ3N0X29iamVjdF9yZWYgKHN0cmVhbS0+dWRwc2lua1swXSk7CisgICAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU5fQ0FTVCAoc3JjKSwgc3RyZWFtLT51ZHBzaW5rWzBdKTsKKyAgICBnc3Rfb2JqZWN0X3JlZiAoc3RyZWFtLT5mYWtlc3JjKTsKKyAgICBnc3RfYmluX2FkZCAoR1NUX0JJTl9DQVNUIChzcmMpLCBzdHJlYW0tPmZha2VzcmMpOworCisgICAgZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKHN0cmVhbS0+ZmFrZXNyYywgInNyYyIsIHN0cmVhbS0+dWRwc2lua1swXSwKKyAgICAgICAgInNpbmsiLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgIH0KKyAgaWYgKGRvX3J0Y3ApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb25maWd1cmUgUlRDUCBVRFAgc2luayBmb3IgJXM6JWQiLCBkZXN0aW5hdGlvbiwKKyAgICAgICAgcnRjcF9wb3J0KTsKKworICAgIHVyaSA9IGdfc3RyZHVwX3ByaW50ZiAoInVkcDovLyVzOiVkIiwgZGVzdGluYXRpb24sIHJ0Y3BfcG9ydCk7CisgICAgc3RyZWFtLT51ZHBzaW5rWzFdID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfbWFrZV9mcm9tX3VyaSAoR1NUX1VSSV9TSU5LLCB1cmksIE5VTEwsIE5VTEwpOworICAgIGdfZnJlZSAodXJpKTsKKyAgICBpZiAoc3RyZWFtLT51ZHBzaW5rWzFdID09IE5VTEwpCisgICAgICBnb3RvIG5vX3NpbmtfZWxlbWVudDsKKworICAgIC8qIGRvbid0IGpvaW4gbXVsdGljYXN0IGdyb3VwLCB3ZSB3aWxsIGhhdmUgdGhlIHNvdXJjZSBzb2NrZXQgZG8gdGhhdCAqLworICAgIC8qIG5vIHN5bmMgb3IgYXN5bmMgc3RhdGUgY2hhbmdlcyBuZWVkZWQgKi8KKyAgICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzdHJlYW0tPnVkcHNpbmtbMV0pLCAiYXV0by1tdWx0aWNhc3QiLCBGQUxTRSwKKyAgICAgICAgImxvb3AiLCBGQUxTRSwgInN5bmMiLCBGQUxTRSwgImFzeW5jIiwgRkFMU0UsIE5VTEwpOworICAgIGlmICh0dGwgPiAwKQorICAgICAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc3RyZWFtLT51ZHBzaW5rWzBdKSwgInR0bCIsIHR0bCwgTlVMTCk7CisKKyAgICBpZiAoc3RyZWFtLT51ZHBzcmNbMV0pIHsKKyAgICAgIC8qIGNvbmZpZ3VyZSBzb2NrZXQsIHdlIGdpdmUgaXQgdGhlIHNhbWUgVURQIHNvY2tldCBhcyB0aGUgdWRwc3JjIGZvciBSVENQCisgICAgICAgKiBiZWNhdXNlIHNvbWUgc2VydmVycyBjaGVjayB0aGUgcG9ydCBudW1iZXIgb2Ygd2hlcmUgaXQgc2VuZHMgUlRDUCB0byBpZGVudGlmeQorICAgICAgICogdGhlIFJUQ1AgcGFja2V0cyBpdCByZWNlaXZlcyAqLworICAgICAgZ19vYmplY3RfZ2V0IChHX09CSkVDVCAoc3RyZWFtLT51ZHBzcmNbMV0pLCAidXNlZC1zb2NrZXQiLCAmc29ja2V0LCBOVUxMKTsKKyAgICAgIGlmICghc29ja2V0KQorICAgICAgICBnb3RvIG5vX3NvY2tldDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiUlRDUCBVRFAgc3JjIGhhcyBzb2NrICVwIiwgc29ja2V0KTsKKyAgICAgIC8qIGNvbmZpZ3VyZSBzb2NrZXQgYW5kIG1ha2Ugc3VyZSB1ZHBzaW5rIGRvZXMgbm90IGNsb3NlIGl0IHdoZW4gc2h1dHRpbmcKKyAgICAgICAqIGRvd24sIGl0IGJlbG9uZ3MgdG8gdWRwc3JjIGFmdGVyIGFsbC4gKi8KKyAgICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHN0cmVhbS0+dWRwc2lua1sxXSksICJzb2NrZXQiLCBzb2NrZXQsCisgICAgICAgICAgImNsb3NlLXNvY2tldCIsIEZBTFNFLCBOVUxMKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzb2NrZXQpOworICAgIH0KKworICAgIC8qIHdlIGtlZXAgdGhpcyBwbGF5aW5nIGFsd2F5cyAqLworICAgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUgKHN0cmVhbS0+dWRwc2lua1sxXSwgVFJVRSk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzdHJlYW0tPnVkcHNpbmtbMV0sIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICAgIGdzdF9vYmplY3RfcmVmIChzdHJlYW0tPnVkcHNpbmtbMV0pOworICAgIGdzdF9iaW5fYWRkIChHU1RfQklOX0NBU1QgKHNyYyksIHN0cmVhbS0+dWRwc2lua1sxXSk7CisKKyAgICBzdHJlYW0tPnJ0Y3BwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc3RyZWFtLT51ZHBzaW5rWzFdLCAic2luayIpOworCisgICAgLyogZ2V0IHNlc3Npb24gUlRDUCBwYWQgKi8KKyAgICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic2VuZF9ydGNwX3NyY18ldSIsIHN0cmVhbS0+aWQpOworICAgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoc3JjLT5tYW5hZ2VyLCBuYW1lKTsKKyAgICBnX2ZyZWUgKG5hbWUpOworCisgICAgLyogYW5kIGxpbmsgKi8KKyAgICBpZiAocGFkKSB7CisgICAgICBnc3RfcGFkX2xpbmtfZnVsbCAocGFkLCBzdHJlYW0tPnJ0Y3BwYWQsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19kZXN0aW5hdGlvbjoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNyYywgIm5vIGRlc3RpbmF0aW9uIGFkZHJlc3Mgc3BlY2lmaWVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19zaW5rX2VsZW1lbnQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzcmMsICJubyBVRFAgc2luayBlbGVtZW50IGZvdW5kIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19mYWtlc3JjX2VsZW1lbnQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzcmMsICJubyBmYWtlc3JjIGVsZW1lbnQgZm91bmQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX3NvY2tldDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNyYywgImZhaWxlZCB0byBjcmVhdGUgc29ja2V0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qIHNldHMgdXAgYWxsIGVsZW1lbnRzIG5lZWRlZCBmb3Igc3RyZWFtaW5nIG92ZXIgdGhlIHNwZWNpZmllZCB0cmFuc3BvcnQuCisgKiBEb2VzIG5vdCB5ZXQgZXhwb3NlIHRoZSBlbGVtZW50IHBhZHMsIHRoaXMgd2lsbCBiZSBkb25lIHdoZW4gdGhlcmUgaXMgYWN0dWFsbAorICogZGF0YWZsb3cgZGV0ZWN0ZWQsIHdoaWNoIG1pZ2h0IG5ldmVyIGhhcHBlbiB3aGVuIFVEUCBpcyBibG9ja2VkIGluIGEKKyAqIGZpcmV3YWxsLCBmb3IgZXhhbXBsZS4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RyYW5zcG9ydCAoR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RSVFNQVHJhbnNwb3J0ICogdHJhbnNwb3J0KQoreworICBHc3RSVFNQU3JjICpzcmM7CisgIEdzdFBhZCAqb3V0cGFkID0gTlVMTDsKKyAgR3N0UGFkVGVtcGxhdGUgKnRlbXBsYXRlOworICBnY2hhciAqbmFtZTsKKyAgY29uc3QgZ2NoYXIgKm1lZGlhX3R5cGU7CisgIGd1aW50IGksIGxlbjsKKworICBzcmMgPSBzdHJlYW0tPnBhcmVudDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb25maWd1cmluZyB0cmFuc3BvcnQgZm9yIHN0cmVhbSAlcCIsIHN0cmVhbSk7CisKKyAgLyogZ2V0IHRoZSBwcm9wZXIgbWVkaWEgdHlwZSBmb3IgdGhpcyBzdHJlYW0gbm93ICovCisgIGlmIChnc3RfcnRzcF90cmFuc3BvcnRfZ2V0X21lZGlhX3R5cGUgKHRyYW5zcG9ydCwgJm1lZGlhX3R5cGUpIDwgMCkKKyAgICBnb3RvIHVua25vd25fdHJhbnNwb3J0OworICBpZiAoIW1lZGlhX3R5cGUpCisgICAgZ290byB1bmtub3duX3RyYW5zcG9ydDsKKworICAvKiBjb25maWd1cmUgdGhlIGZpbmFsIG1lZGlhIHR5cGUgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic2V0dGluZyBtZWRpYSB0eXBlIHRvICVzIiwgbWVkaWFfdHlwZSk7CisKKyAgbGVuID0gc3RyZWFtLT5wdG1hcC0+bGVuOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgUHRNYXBJdGVtICppdGVtID0gJmdfYXJyYXlfaW5kZXggKHN0cmVhbS0+cHRtYXAsIFB0TWFwSXRlbSwgaSk7CisKKyAgICBpZiAoaXRlbS0+Y2FwcyA9PSBOVUxMKQorICAgICAgY29udGludWU7CisKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoaXRlbS0+Y2FwcywgMCk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAocywgbWVkaWFfdHlwZSk7CisgICAgLyogc2V0IHNzcmMgaWYga25vd24gKi8KKyAgICBpZiAodHJhbnNwb3J0LT5zc3JjKQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJzc3JjIiwgR19UWVBFX1VJTlQsIHRyYW5zcG9ydC0+c3NyYywgTlVMTCk7CisgIH0KKworICAvKiB0cnkgdG8gZ2V0IGFuZCBjb25maWd1cmUgYSBtYW5hZ2VyLCBjaGFubmVscGFkWzAtMV0gd2lsbCBiZSBjb25maWd1cmVkIHdpdGgKKyAgICogdGhlIHBhZHMgZm9yIHRoZSBtYW5hZ2VyLCBvciBOVUxMIHdoZW4gbm8gbWFuYWdlciBpcyBuZWVkZWQuICovCisgIGlmICghZ3N0X3J0c3BzcmNfc3RyZWFtX2NvbmZpZ3VyZV9tYW5hZ2VyIChzcmMsIHN0cmVhbSwgdHJhbnNwb3J0KSkKKyAgICBnb3RvIG5vX21hbmFnZXI7CisKKyAgc3dpdGNoICh0cmFuc3BvcnQtPmxvd2VyX3RyYW5zcG9ydCkgeworICAgIGNhc2UgR1NUX1JUU1BfTE9XRVJfVFJBTlNfVENQOgorICAgICAgaWYgKCFnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3RjcCAoc3JjLCBzdHJlYW0sIHRyYW5zcG9ydCwgJm91dHBhZCkpCisgICAgICAgIGdvdG8gdHJhbnNwb3J0X2ZhaWxlZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1JUU1BfTE9XRVJfVFJBTlNfVURQX01DQVNUOgorICAgICAgaWYgKCFnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX21jYXN0IChzcmMsIHN0cmVhbSwgdHJhbnNwb3J0LCAmb3V0cGFkKSkKKyAgICAgICAgZ290byB0cmFuc3BvcnRfZmFpbGVkOworICAgICAgLyogZmFsbHRocm91Z2gsIHRoZSByZXN0IGlzIHRoZSBzYW1lIGZvciBVRFAgYW5kIE1DQVNUICovCisgICAgY2FzZSBHU1RfUlRTUF9MT1dFUl9UUkFOU19VRFA6CisgICAgICBpZiAoIWdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdWRwIChzcmMsIHN0cmVhbSwgdHJhbnNwb3J0LCAmb3V0cGFkKSkKKyAgICAgICAgZ290byB0cmFuc3BvcnRfZmFpbGVkOworICAgICAgLyogY29uZmlndXJlIHVkcHNpbmtzIGJhY2sgdG8gdGhlIHNlcnZlciBmb3IgUlRDUCBtZXNzYWdlcyBhbmQgZm9yIHRoZQorICAgICAgICogZHVtbXkgUlRQIG1lc3NhZ2VzIHRvIG9wZW4gTkFULiAqLworICAgICAgaWYgKCFnc3RfcnRzcHNyY19zdHJlYW1fY29uZmlndXJlX3VkcF9zaW5rcyAoc3JjLCBzdHJlYW0sIHRyYW5zcG9ydCkpCisgICAgICAgIGdvdG8gdHJhbnNwb3J0X2ZhaWxlZDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIHVua25vd25fdHJhbnNwb3J0OworICB9CisKKyAgaWYgKG91dHBhZCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNyZWF0aW5nIGdob3N0cGFkIik7CisKKyAgICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChvdXRwYWQpOworCisgICAgLyogY3JlYXRlIGdob3N0cGFkLCBkb24ndCBhZGQganVzdCB5ZXQsIHRoaXMgd2lsbCBiZSBkb25lIHdoZW4gd2UgYWN0aXZhdGUKKyAgICAgKiB0aGUgc3RyZWFtLiAqLworICAgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzdHJlYW1fJXUiLCBzdHJlYW0tPmlkKTsKKyAgICB0ZW1wbGF0ZSA9IGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCAoJnJ0cHRlbXBsYXRlKTsKKyAgICBzdHJlYW0tPnNyY3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X2Zyb21fdGVtcGxhdGUgKG5hbWUsIG91dHBhZCwgdGVtcGxhdGUpOworICAgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChzdHJlYW0tPnNyY3BhZCwgZ3N0X3J0c3BzcmNfaGFuZGxlX3NyY19ldmVudCk7CisgICAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHN0cmVhbS0+c3JjcGFkLCBnc3RfcnRzcHNyY19oYW5kbGVfc3JjX3F1ZXJ5KTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmICh0ZW1wbGF0ZSk7CisgICAgZ19mcmVlIChuYW1lKTsKKworICAgIGdzdF9vYmplY3RfdW5yZWYgKG91dHBhZCk7CisgIH0KKyAgLyogbWFyayBwYWQgYXMgb2sgKi8KKyAgc3RyZWFtLT5sYXN0X3JldCA9IEdTVF9GTE9XX09LOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLwordHJhbnNwb3J0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImZhaWxlZCB0byBjb25maWd1cmUgdHJhbnNwb3J0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit1bmtub3duX3RyYW5zcG9ydDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInVua25vd24gdHJhbnNwb3J0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19tYW5hZ2VyOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY2Fubm90IGdldCBhIHNlc3Npb24gbWFuYWdlciIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKiBzZW5kIGEgY291cGxlIG9mIGR1bW15IHJhbmRvbSBwYWNrZXRzIG9uIHRoZSByZWNlaXZlciBSVFAgcG9ydCB0byB0aGUgc2VydmVyLAorICogdGhpcyBzaG91bGQgbWFrZSBhIGZpcmV3YWxsIHRoaW5rIHdlIGluaXRpYXRlZCB0aGUgZGF0YSB0cmFuc2ZlciBhbmQKKyAqIGhvcGVmdWxseSBhbGxvdyBwYWNrZXRzIHRvIGdvIGZyb20gdGhlIHNlbmRlciBwb3J0IHRvIG91ciBSVFAgcmVjZWl2ZXIgcG9ydCAqLworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY19zZW5kX2R1bW15X3BhY2tldHMgKEdzdFJUU1BTcmMgKiBzcmMpCit7CisgIEdMaXN0ICp3YWxrOworCisgIGlmIChzcmMtPm5hdF9tZXRob2QgIT0gR1NUX1JUU1BfTkFUX0RVTU1ZKQorICAgIHJldHVybiBUUlVFOworCisgIGZvciAod2FsayA9IHNyYy0+c3RyZWFtczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BTdHJlYW0gKnN0cmVhbSA9IChHc3RSVFNQU3RyZWFtICopIHdhbGstPmRhdGE7CisKKyAgICBpZiAoc3RyZWFtLT5mYWtlc3JjICYmIHN0cmVhbS0+dWRwc2lua1swXSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic2VuZGluZyBkdW1teSBwYWNrZXQgdG8gc3RyZWFtICVwIiwgc3RyZWFtKTsKKyAgICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc3RyZWFtLT51ZHBzaW5rWzBdLCBHU1RfU1RBVEVfTlVMTCk7CisgICAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHN0cmVhbS0+ZmFrZXNyYywgR1NUX1NUQVRFX05VTEwpOworICAgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzdHJlYW0tPnVkcHNpbmtbMF0sIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc3RyZWFtLT5mYWtlc3JjLCBHU1RfU1RBVEVfUExBWUlORyk7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCisvKiBBZGRzIHRoZSBzb3VyY2UgcGFkcyBvZiBhbGwgY29uZmlndXJlZCBzdHJlYW1zIHRvIHRoZSBlbGVtZW50LgorICogVGhpcyBjb2RlIGlzIHBlcmZvcm1lZCB3aGVuIHdlIGRldGVjdGVkIGRhdGFmbG93LgorICoKKyAqIFdlIGRldGVjdCBkYXRhZmxvdyBmcm9tIGVpdGhlciB0aGUgX2xvb3AgZnVuY3Rpb24gb3Igd2l0aCBwYWQgcHJvYmVzIG9uIHRoZQorICogdWRwIHNvdXJjZXMuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfYWN0aXZhdGVfc3RyZWFtcyAoR3N0UlRTUFNyYyAqIHNyYykKK3sKKyAgR0xpc3QgKndhbGs7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiYWN0aXZhdGluZyBzdHJlYW1zIik7CisKKyAgZm9yICh3YWxrID0gc3JjLT5zdHJlYW1zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtID0gKEdzdFJUU1BTdHJlYW0gKikgd2Fsay0+ZGF0YTsKKworICAgIGlmIChzdHJlYW0tPnVkcHNyY1swXSkgeworICAgICAgLyogcmVtb3ZlIHRpbWVvdXQsIHdlIGFyZSBzdHJlYW1pbmcgbm93IGFuZCB0aW1lb3V0cyB3aWxsIGJlIGhhbmRsZWQgYnkKKyAgICAgICAqIHRoZSBzZXNzaW9uIG1hbmFnZXIgYW5kIGppdHRlciBidWZmZXIgKi8KKyAgICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHN0cmVhbS0+dWRwc3JjWzBdKSwgInRpbWVvdXQiLCAoZ3VpbnQ2NCkgMCwgTlVMTCk7CisgICAgfQorICAgIGlmIChzdHJlYW0tPnNyY3BhZCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiYWN0aXZhdGluZyBzdHJlYW0gcGFkICVwIiwgc3RyZWFtKTsKKyAgICAgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc3RyZWFtLT5zcmNwYWQsIFRSVUUpOworCisgICAgICAvKiBpZiB3ZSBkb24ndCBoYXZlIGEgc2Vzc2lvbiBtYW5hZ2VyLCBzZXQgdGhlIGNhcHMgbm93LiBJZiB3ZSBoYXZlIGEKKyAgICAgICAqIHNlc3Npb24sIHdlIHdpbGwgZ2V0IGEgbm90aWZpY2F0aW9uIG9mIHRoZSBwYWQgYW5kIHRoZSBjYXBzLiAqLworICAgICAgaWYgKCFzcmMtPm1hbmFnZXIpIHsKKyAgICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgICBjYXBzID0gc3RyZWFtX2dldF9jYXBzX2Zvcl9wdCAoc3RyZWFtLCBzdHJlYW0tPmRlZmF1bHRfcHQpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzZXR0aW5nIHBhZCBjYXBzIGZvciBzdHJlYW0gJXAiLCBzdHJlYW0pOworICAgICAgICBnc3RfcGFkX3NldF9jYXBzIChzdHJlYW0tPnNyY3BhZCwgY2Fwcyk7CisgICAgICB9CisgICAgICAvKiBhZGQgdGhlIHBhZCAqLworICAgICAgaWYgKCFzdHJlYW0tPmFkZGVkKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImFkZGluZyBzdHJlYW0gcGFkICVwIiwgc3RyZWFtKTsKKyAgICAgICAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlRfQ0FTVCAoc3JjKSwgc3RyZWFtLT5zcmNwYWQpOworICAgICAgICBzdHJlYW0tPmFkZGVkID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiB1bmJsb2NrIGFsbCBwYWRzICovCisgIGZvciAod2FsayA9IHNyYy0+c3RyZWFtczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BTdHJlYW0gKnN0cmVhbSA9IChHc3RSVFNQU3RyZWFtICopIHdhbGstPmRhdGE7CisKKyAgICBpZiAoc3RyZWFtLT5ibG9ja2lkKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJ1bmJsb2NraW5nIHN0cmVhbSBwYWQgJXAiLCBzdHJlYW0pOworICAgICAgZ3N0X3BhZF9yZW1vdmVfcHJvYmUgKHN0cmVhbS0+YmxvY2tlZHBhZCwgc3RyZWFtLT5ibG9ja2lkKTsKKyAgICAgIHN0cmVhbS0+YmxvY2tpZCA9IDA7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19jb25maWd1cmVfY2FwcyAoR3N0UlRTUFNyYyAqIHNyYywgR3N0U2VnbWVudCAqIHNlZ21lbnQsCisgICAgZ2Jvb2xlYW4gcmVzZXRfbWFuYWdlcikKK3sKKyAgR0xpc3QgKndhbGs7CisgIGd1aW50NjQgc3RhcnQsIHN0b3A7CisgIGdkb3VibGUgcGxheV9zcGVlZCwgcGxheV9zY2FsZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb25maWd1cmluZyBzdHJlYW0gY2FwcyIpOworCisgIHN0YXJ0ID0gc2VnbWVudC0+cG9zaXRpb247CisgIHN0b3AgPSBzZWdtZW50LT5kdXJhdGlvbjsKKyAgcGxheV9zcGVlZCA9IHNlZ21lbnQtPnJhdGU7CisgIHBsYXlfc2NhbGUgPSBzZWdtZW50LT5hcHBsaWVkX3JhdGU7CisKKyAgZm9yICh3YWxrID0gc3JjLT5zdHJlYW1zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtID0gKEdzdFJUU1BTdHJlYW0gKikgd2Fsay0+ZGF0YTsKKyAgICBndWludCBqLCBsZW47CisKKyAgICBpZiAoIXN0cmVhbS0+c2V0dXApCisgICAgICBjb250aW51ZTsKKworICAgIGxlbiA9IHN0cmVhbS0+cHRtYXAtPmxlbjsKKyAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisgICAgICBQdE1hcEl0ZW0gKml0ZW0gPSAmZ19hcnJheV9pbmRleCAoc3RyZWFtLT5wdG1hcCwgUHRNYXBJdGVtLCBqKTsKKworICAgICAgaWYgKGl0ZW0tPmNhcHMgPT0gTlVMTCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChpdGVtLT5jYXBzKTsKKyAgICAgIC8qIHVwZGF0ZSBjYXBzICovCisgICAgICBpZiAoc3RyZWFtLT50aW1lYmFzZSAhPSAtMSkKKyAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgImNsb2NrLWJhc2UiLCBHX1RZUEVfVUlOVCwKKyAgICAgICAgICAgIChndWludCkgc3RyZWFtLT50aW1lYmFzZSwgTlVMTCk7CisgICAgICBpZiAoc3RyZWFtLT5zZXFiYXNlICE9IC0xKQorICAgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAic2VxbnVtLWJhc2UiLCBHX1RZUEVfVUlOVCwKKyAgICAgICAgICAgIChndWludCkgc3RyZWFtLT5zZXFiYXNlLCBOVUxMKTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJucHQtc3RhcnQiLCBHX1RZUEVfVUlOVDY0LCBzdGFydCwgTlVMTCk7CisgICAgICBpZiAoc3RvcCAhPSAtMSkKKyAgICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgIm5wdC1zdG9wIiwgR19UWVBFX1VJTlQ2NCwgc3RvcCwgTlVMTCk7CisgICAgICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAicGxheS1zcGVlZCIsIEdfVFlQRV9ET1VCTEUsIHBsYXlfc3BlZWQsIE5VTEwpOworICAgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywgInBsYXktc2NhbGUiLCBHX1RZUEVfRE9VQkxFLCBwbGF5X3NjYWxlLCBOVUxMKTsKKworICAgICAgaXRlbS0+Y2FwcyA9IGNhcHM7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdHJlYW0gJXAsIHB0ICVkLCBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBzdHJlYW0sCisgICAgICAgICAgaXRlbS0+cHQsIGNhcHMpOworCisgICAgICBpZiAoaXRlbS0+cHQgPT0gc3RyZWFtLT5kZWZhdWx0X3B0KSB7CisgICAgICAgIGlmIChzdHJlYW0tPnVkcHNyY1swXSkKKyAgICAgICAgICBnX29iamVjdF9zZXQgKHN0cmVhbS0+dWRwc3JjWzBdLCAiY2FwcyIsIGNhcHMsIE5VTEwpOworICAgICAgICBzdHJlYW0tPm5lZWRfY2FwcyA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChyZXNldF9tYW5hZ2VyICYmIHNyYy0+bWFuYWdlcikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNsZWFyIHNlc3Npb24iKTsKKyAgICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHNyYy0+bWFuYWdlciwgImNsZWFyLXB0LW1hcCIsIE5VTEwpOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRzcHNyY19jb21iaW5lX2Zsb3dzIChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQU3RyZWFtICogc3RyZWFtLAorICAgIEdzdEZsb3dSZXR1cm4gcmV0KQoreworICBHTGlzdCAqc3RyZWFtczsKKworICAvKiBzdG9yZSB0aGUgdmFsdWUgKi8KKyAgc3RyZWFtLT5sYXN0X3JldCA9IHJldDsKKworICAvKiBpZiBpdCdzIHN1Y2Nlc3Mgd2UgY2FuIHJldHVybiB0aGUgdmFsdWUgcmlnaHQgYXdheSAqLworICBpZiAocmV0ID09IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZG9uZTsKKworICAvKiBhbnkgb3RoZXIgZXJyb3IgdGhhdCBpcyBub3QtbGlua2VkIGNhbiBiZSByZXR1cm5lZCByaWdodAorICAgKiBhd2F5ICovCisgIGlmIChyZXQgIT0gR1NUX0ZMT1dfTk9UX0xJTktFRCkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogb25seSByZXR1cm4gTk9UX0xJTktFRCBpZiBhbGwgb3RoZXIgcGFkcyByZXR1cm5lZCBOT1RfTElOS0VEICovCisgIGZvciAoc3RyZWFtcyA9IHNyYy0+c3RyZWFtczsgc3RyZWFtczsgc3RyZWFtcyA9IGdfbGlzdF9uZXh0IChzdHJlYW1zKSkgeworICAgIEdzdFJUU1BTdHJlYW0gKm9zdHJlYW0gPSAoR3N0UlRTUFN0cmVhbSAqKSBzdHJlYW1zLT5kYXRhOworCisgICAgcmV0ID0gb3N0cmVhbS0+bGFzdF9yZXQ7CisgICAgLyogc29tZSBvdGhlciByZXR1cm4gdmFsdWUgKG11c3QgYmUgU1VDQ0VTUyBidXQgd2UgY2FuIHJldHVybgorICAgICAqIG90aGVyIHZhbHVlcyBhcyB3ZWxsKSAqLworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfTk9UX0xJTktFRCkKKyAgICAgIGdvdG8gZG9uZTsKKyAgfQorICAvKiBpZiB3ZSBnZXQgaGVyZSwgYWxsIG90aGVyIHBhZHMgd2VyZSB1bmxpbmtlZCBhbmQgd2UgcmV0dXJuCisgICAqIE5PVF9MSU5LRUQgdGhlbiAqLworZG9uZToKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY19zdHJlYW1fcHVzaF9ldmVudCAoR3N0UlRTUFNyYyAqIHNyYywgR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBnYm9vbGVhbiByZXMgPSBUUlVFOworCisgIC8qIG9ubHkgc3RyZWFtcyB0aGF0IGhhdmUgYSBjb25uZWN0aW9uIHRvIHRoZSBvdXRzaWRlIHdvcmxkICovCisgIGlmICghc3RyZWFtLT5zZXR1cCkKKyAgICBnb3RvIGRvbmU7CisKKyAgaWYgKHN0cmVhbS0+dWRwc3JjWzBdKSB7CisgICAgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworICAgIHJlcyA9IGdzdF9lbGVtZW50X3NlbmRfZXZlbnQgKHN0cmVhbS0+dWRwc3JjWzBdLCBldmVudCk7CisgIH0gZWxzZSBpZiAoc3RyZWFtLT5jaGFubmVscGFkWzBdKSB7CisgICAgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworICAgIGlmIChHU1RfUEFEX0lTX1NSQyAoc3RyZWFtLT5jaGFubmVscGFkWzBdKSkKKyAgICAgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5jaGFubmVscGFkWzBdLCBldmVudCk7CisgICAgZWxzZQorICAgICAgcmVzID0gZ3N0X3BhZF9zZW5kX2V2ZW50IChzdHJlYW0tPmNoYW5uZWxwYWRbMF0sIGV2ZW50KTsKKyAgfQorCisgIGlmIChzdHJlYW0tPnVkcHNyY1sxXSkgeworICAgIGdzdF9ldmVudF9yZWYgKGV2ZW50KTsKKyAgICByZXMgJj0gZ3N0X2VsZW1lbnRfc2VuZF9ldmVudCAoc3RyZWFtLT51ZHBzcmNbMV0sIGV2ZW50KTsKKyAgfSBlbHNlIGlmIChzdHJlYW0tPmNoYW5uZWxwYWRbMV0pIHsKKyAgICBnc3RfZXZlbnRfcmVmIChldmVudCk7CisgICAgaWYgKEdTVF9QQURfSVNfU1JDIChzdHJlYW0tPmNoYW5uZWxwYWRbMV0pKQorICAgICAgcmVzICY9IGdzdF9wYWRfcHVzaF9ldmVudCAoc3RyZWFtLT5jaGFubmVscGFkWzFdLCBldmVudCk7CisgICAgZWxzZQorICAgICAgcmVzICY9IGdzdF9wYWRfc2VuZF9ldmVudCAoc3RyZWFtLT5jaGFubmVscGFkWzFdLCBldmVudCk7CisgIH0KKworZG9uZToKKyAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY19wdXNoX2V2ZW50IChHc3RSVFNQU3JjICogc3JjLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHTGlzdCAqc3RyZWFtczsKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKworICBmb3IgKHN0cmVhbXMgPSBzcmMtPnN0cmVhbXM7IHN0cmVhbXM7IHN0cmVhbXMgPSBnX2xpc3RfbmV4dCAoc3RyZWFtcykpIHsKKyAgICBHc3RSVFNQU3RyZWFtICpvc3RyZWFtID0gKEdzdFJUU1BTdHJlYW0gKikgc3RyZWFtcy0+ZGF0YTsKKworICAgIGdzdF9ldmVudF9yZWYgKGV2ZW50KTsKKyAgICByZXMgJj0gZ3N0X3J0c3BzcmNfc3RyZWFtX3B1c2hfZXZlbnQgKHNyYywgb3N0cmVhbSwgZXZlbnQpOworICB9CisgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorYWNjZXB0X2NlcnRpZmljYXRlX2NiIChHVGxzQ29ubmVjdGlvbiAqIGNvbm4sIEdUbHNDZXJ0aWZpY2F0ZSAqIHBlZXJfY2VydCwKKyAgICBHVGxzQ2VydGlmaWNhdGVGbGFncyBlcnJvcnMsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0UlRTUFNyYyAqc3JjID0gdXNlcl9kYXRhOworICBnYm9vbGVhbiBhY2NlcHQgPSBGQUxTRTsKKworICBnX3NpZ25hbF9lbWl0IChzcmMsIGdzdF9ydHNwc3JjX3NpZ25hbHNbU0lHTkFMX0FDQ0VQVF9DRVJUSUZJQ0FURV0sIDAsIGNvbm4sCisgICAgICBwZWVyX2NlcnQsIGVycm9ycywgJmFjY2VwdCk7CisKKyAgcmV0dXJuIGFjY2VwdDsKK30KKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwX2Nvbm5pbmZvX2Nvbm5lY3QgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BDb25uSW5mbyAqIGluZm8sCisgICAgZ2Jvb2xlYW4gYXN5bmMpCit7CisgIEdzdFJUU1BSZXN1bHQgcmVzOworICBHc3RSVFNQTWVzc2FnZSByZXNwb25zZTsKKyAgZ2Jvb2xlYW4gcmV0cnkgPSBGQUxTRTsKKyAgbWVtc2V0ICgmcmVzcG9uc2UsIDAsIHNpemVvZiAocmVzcG9uc2UpKTsKKyAgZ3N0X3J0c3BfbWVzc2FnZV9pbml0ICgmcmVzcG9uc2UpOworICBkbyB7CisgICAgaWYgKGluZm8tPmNvbm5lY3Rpb24gPT0gTlVMTCkgeworICAgICAgaWYgKGluZm8tPnVybCA9PSBOVUxMKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInBhcnNpbmcgdXJpICglcykuLi4iLCBpbmZvLT5sb2NhdGlvbik7CisgICAgICAgIGlmICgocmVzID0gZ3N0X3J0c3BfdXJsX3BhcnNlIChpbmZvLT5sb2NhdGlvbiwgJmluZm8tPnVybCkpIDwgMCkKKyAgICAgICAgICBnb3RvIHBhcnNlX2Vycm9yOworICAgICAgfQorICAgICAgLyogY3JlYXRlIGNvbm5lY3Rpb24gKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNyZWF0aW5nIGNvbm5lY3Rpb24gKCVzKS4uLiIsIGluZm8tPmxvY2F0aW9uKTsKKyAgICAgIGlmICgocmVzID0gZ3N0X3J0c3BfY29ubmVjdGlvbl9jcmVhdGUgKGluZm8tPnVybCwgJmluZm8tPmNvbm5lY3Rpb24pKSA8IDApCisgICAgICAgIGdvdG8gY291bGRfbm90X2NyZWF0ZTsKKworICAgICAgaWYgKHJldHJ5KSB7CisgICAgICAgIGdzdF9ydHNwc3JjX3NldHVwX2F1dGggKHNyYywgJnJlc3BvbnNlKTsKKyAgICAgIH0KKworICAgICAgZ19mcmVlIChpbmZvLT51cmxfc3RyKTsKKyAgICAgIGluZm8tPnVybF9zdHIgPSBnc3RfcnRzcF91cmxfZ2V0X3JlcXVlc3RfdXJpIChpbmZvLT51cmwpOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzYW5pdGl6ZWQgdXJpICVzIiwgaW5mby0+dXJsX3N0cik7CisKKyAgICAgIGlmIChpbmZvLT51cmwtPnRyYW5zcG9ydHMgJiBHU1RfUlRTUF9MT1dFUl9UUkFOU19UTFMpIHsKKyAgICAgICAgaWYgKCFnc3RfcnRzcF9jb25uZWN0aW9uX3NldF90bHNfdmFsaWRhdGlvbl9mbGFncyAoaW5mby0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICBzcmMtPnRsc192YWxpZGF0aW9uX2ZsYWdzKSkKKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgIlVuYWJsZSB0byBzZXQgVExTIHZhbGlkYXRpb24gZmxhZ3MiKTsKKworICAgICAgICBpZiAoc3JjLT50bHNfZGF0YWJhc2UpCisgICAgICAgICAgZ3N0X3J0c3BfY29ubmVjdGlvbl9zZXRfdGxzX2RhdGFiYXNlIChpbmZvLT5jb25uZWN0aW9uLAorICAgICAgICAgICAgICBzcmMtPnRsc19kYXRhYmFzZSk7CisKKyAgICAgICAgaWYgKHNyYy0+dGxzX2ludGVyYWN0aW9uKQorICAgICAgICAgIGdzdF9ydHNwX2Nvbm5lY3Rpb25fc2V0X3Rsc19pbnRlcmFjdGlvbiAoaW5mby0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgc3JjLT50bHNfaW50ZXJhY3Rpb24pOworICAgICAgICBnc3RfcnRzcF9jb25uZWN0aW9uX3NldF9hY2NlcHRfY2VydGlmaWNhdGVfZnVuYyAoaW5mby0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgIGFjY2VwdF9jZXJ0aWZpY2F0ZV9jYiwgc3JjLCBOVUxMKTsKKyAgICAgIH0KKworICAgICAgaWYgKGluZm8tPnVybC0+dHJhbnNwb3J0cyAmIEdTVF9SVFNQX0xPV0VSX1RSQU5TX0hUVFApCisgICAgICAgIGdzdF9ydHNwX2Nvbm5lY3Rpb25fc2V0X3R1bm5lbGVkIChpbmZvLT5jb25uZWN0aW9uLCBUUlVFKTsKKworICAgICAgaWYgKHNyYy0+cHJveHlfaG9zdCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzZXR0aW5nIHByb3h5ICVzOiVkIiwgc3JjLT5wcm94eV9ob3N0LAorICAgICAgICAgICAgc3JjLT5wcm94eV9wb3J0KTsKKyAgICAgICAgZ3N0X3J0c3BfY29ubmVjdGlvbl9zZXRfcHJveHkgKGluZm8tPmNvbm5lY3Rpb24sIHNyYy0+cHJveHlfaG9zdCwKKyAgICAgICAgICAgIHNyYy0+cHJveHlfcG9ydCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFpbmZvLT5jb25uZWN0ZWQpIHsKKyAgICAgIC8qIGNvbm5lY3QgKi8KKyAgICAgIGlmIChhc3luYykKKyAgICAgICAgR1NUX0VMRU1FTlRfUFJPR1JFU1MgKHNyYywgQ09OVElOVUUsICJjb25uZWN0IiwKKyAgICAgICAgICAgICgiQ29ubmVjdGluZyB0byAlcyIsIGluZm8tPmxvY2F0aW9uKSk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb25uZWN0aW5nICglcykuLi4iLCBpbmZvLT5sb2NhdGlvbik7CisgICAgICByZXMgPSBnc3RfcnRzcF9jb25uZWN0aW9uX2Nvbm5lY3Rfd2l0aF9yZXNwb25zZSAoaW5mby0+Y29ubmVjdGlvbiwKKyAgICAgICAgICBzcmMtPnB0Y3BfdGltZW91dCwgJnJlc3BvbnNlKTsKKworICAgICAgaWYgKHJlc3BvbnNlLnR5cGUgPT0gR1NUX1JUU1BfTUVTU0FHRV9IVFRQX1JFU1BPTlNFICYmCisgICAgICAgICAgcmVzcG9uc2UudHlwZV9kYXRhLnJlc3BvbnNlLmNvZGUgPT0gR1NUX1JUU1BfU1RTX1VOQVVUSE9SSVpFRCkgeworICAgICAgICBnc3RfcnRzcF9jb25uaW5mb19jbG9zZSAoc3JjLCBpbmZvLCBUUlVFKTsKKyAgICAgICAgaWYgKCFyZXRyeSkKKyAgICAgICAgICByZXRyeSA9IFRSVUU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXRyeSA9IEZBTFNFOyAgICAgICAgLy8gd2Ugc2hvdWxkIG5vdCByZXRyeSBtb3JlIHRoYW4gb25jZQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0cnkgPSBGQUxTRTsKKyAgICAgIH0KKworICAgICAgaWYgKHJlcyA9PSBHU1RfUlRTUF9PSykKKyAgICAgICAgaW5mby0+Y29ubmVjdGVkID0gVFJVRTsKKyAgICAgIGVsc2UgaWYgKCFyZXRyeSkKKyAgICAgICAgZ290byBjb3VsZF9ub3RfY29ubmVjdDsKKyAgICB9CisgIH0gd2hpbGUgKCFpbmZvLT5jb25uZWN0ZWQgJiYgcmV0cnkpOworCisgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXNwb25zZSk7CisgIHJldHVybiBHU1RfUlRTUF9PSzsKKworICAvKiBFUlJPUlMgKi8KK3BhcnNlX2Vycm9yOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoc3JjLCAiTm8gdmFsaWQgUlRTUCBVUkwgd2FzIHByb3ZpZGVkIik7CisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJnJlc3BvbnNlKTsKKyAgICByZXR1cm4gcmVzOworICB9Citjb3VsZF9ub3RfY3JlYXRlOgorICB7CisgICAgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0cnJlc3VsdCAocmVzKTsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzcmMsICJDb3VsZCBub3QgY3JlYXRlIGNvbm5lY3Rpb24uICglcykiLCBzdHIpOworICAgIGdfZnJlZSAoc3RyKTsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVzcG9uc2UpOworICAgIHJldHVybiByZXM7CisgIH0KK2NvdWxkX25vdF9jb25uZWN0OgorICB7CisgICAgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0cnJlc3VsdCAocmVzKTsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzcmMsICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIuICglcykiLCBzdHIpOworICAgIGdfZnJlZSAoc3RyKTsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVzcG9uc2UpOworICAgIHJldHVybiByZXM7CisgIH0KK30KKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwX2Nvbm5pbmZvX2Nsb3NlIChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQQ29ubkluZm8gKiBpbmZvLAorICAgIGdib29sZWFuIGZyZWUpCit7CisgIEdTVF9SVFNQX1NUQVRFX0xPQ0sgKHNyYyk7CisgIGlmIChpbmZvLT5jb25uZWN0ZWQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjbG9zaW5nIGNvbm5lY3Rpb24uLi4iKTsKKyAgICBnc3RfcnRzcF9jb25uZWN0aW9uX2Nsb3NlIChpbmZvLT5jb25uZWN0aW9uKTsKKyAgICBpbmZvLT5jb25uZWN0ZWQgPSBGQUxTRTsKKyAgfQorICBpZiAoZnJlZSAmJiBpbmZvLT5jb25uZWN0aW9uKSB7CisgICAgLyogZnJlZSBjb25uZWN0aW9uICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZnJlZWluZyBjb25uZWN0aW9uLi4uIik7CisgICAgZ3N0X3J0c3BfY29ubmVjdGlvbl9mcmVlIChpbmZvLT5jb25uZWN0aW9uKTsKKyAgICBpbmZvLT5jb25uZWN0aW9uID0gTlVMTDsKKyAgICBpbmZvLT5mbHVzaGluZyA9IEZBTFNFOworICB9CisgIEdTVF9SVFNQX1NUQVRFX1VOTE9DSyAoc3JjKTsKKyAgcmV0dXJuIEdTVF9SVFNQX09LOworfQorCitzdGF0aWMgR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BfY29ubmluZm9fcmVjb25uZWN0IChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQQ29ubkluZm8gKiBpbmZvLAorICAgIGdib29sZWFuIGFzeW5jKQoreworICBHc3RSVFNQUmVzdWx0IHJlczsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJyZWNvbm5lY3RpbmcgY29ubmVjdGlvbi4uLiIpOworICBnc3RfcnRzcF9jb25uaW5mb19jbG9zZSAoc3JjLCBpbmZvLCBGQUxTRSk7CisgIHJlcyA9IGdzdF9ydHNwX2Nvbm5pbmZvX2Nvbm5lY3QgKHNyYywgaW5mbywgYXN5bmMpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19jb25uZWN0aW9uX2ZsdXNoIChHc3RSVFNQU3JjICogc3JjLCBnYm9vbGVhbiBmbHVzaCkKK3sKKyAgR0xpc3QgKndhbGs7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic2V0IGZsdXNoaW5nICVkIiwgZmx1c2gpOworICBHU1RfUlRTUF9TVEFURV9MT0NLIChzcmMpOworICBpZiAoc3JjLT5jb25uaW5mby5jb25uZWN0aW9uICYmIHNyYy0+Y29ubmluZm8uZmx1c2hpbmcgIT0gZmx1c2gpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb25uZWN0aW9uIGZsdXNoIik7CisgICAgZ3N0X3J0c3BfY29ubmVjdGlvbl9mbHVzaCAoc3JjLT5jb25uaW5mby5jb25uZWN0aW9uLCBmbHVzaCk7CisgICAgc3JjLT5jb25uaW5mby5mbHVzaGluZyA9IGZsdXNoOworICB9CisgIGZvciAod2FsayA9IHNyYy0+c3RyZWFtczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BTdHJlYW0gKnN0cmVhbSA9IChHc3RSVFNQU3RyZWFtICopIHdhbGstPmRhdGE7CisgICAgaWYgKHN0cmVhbS0+Y29ubmluZm8uY29ubmVjdGlvbiAmJiBzdHJlYW0tPmNvbm5pbmZvLmZsdXNoaW5nICE9IGZsdXNoKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdHJlYW0gJXAgZmx1c2giLCBzdHJlYW0pOworICAgICAgZ3N0X3J0c3BfY29ubmVjdGlvbl9mbHVzaCAoc3RyZWFtLT5jb25uaW5mby5jb25uZWN0aW9uLCBmbHVzaCk7CisgICAgICBzdHJlYW0tPmNvbm5pbmZvLmZsdXNoaW5nID0gZmx1c2g7CisgICAgfQorICB9CisgIEdTVF9SVFNQX1NUQVRFX1VOTE9DSyAoc3JjKTsKK30KKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX2luaXRfcmVxdWVzdCAoR3N0UlRTUFNyYyAqIHNyYywgR3N0UlRTUE1lc3NhZ2UgKiBtc2csCisgICAgR3N0UlRTUE1ldGhvZCBtZXRob2QsIGNvbnN0IGdjaGFyICogdXJpKQoreworICBHc3RSVFNQUmVzdWx0IHJlczsKKworICByZXMgPSBnc3RfcnRzcF9tZXNzYWdlX2luaXRfcmVxdWVzdCAobXNnLCBtZXRob2QsIHVyaSk7CisgIGlmIChyZXMgPCAwKQorICAgIHJldHVybiByZXM7CisKKyAgLyogc2V0IHVzZXItYWdlbnQgKi8KKyAgaWYgKHNyYy0+dXNlcl9hZ2VudCkKKyAgICBnc3RfcnRzcF9tZXNzYWdlX2FkZF9oZWFkZXIgKG1zZywgR1NUX1JUU1BfSERSX1VTRVJfQUdFTlQsIHNyYy0+dXNlcl9hZ2VudCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworLyogRklYTUUsIGhhbmRsZSBzZXJ2ZXIgcmVxdWVzdCwgcmVwbHkgd2l0aCBPSywgZm9yIG5vdyAqLworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX2hhbmRsZV9yZXF1ZXN0IChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQQ29ubkluZm8gKiBjb25uaW5mbywKKyAgICBHc3RSVFNQTWVzc2FnZSAqIHJlcXVlc3QpCit7CisgIEdzdFJUU1BNZXNzYWdlIHJlc3BvbnNlID0geyAwIH07CisgIEdzdFJUU1BSZXN1bHQgcmVzOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImdvdCBzZXJ2ZXIgcmVxdWVzdCBtZXNzYWdlIik7CisKKyAgREVCVUdfUlRTUCAoc3JjLCByZXF1ZXN0KTsKKworICByZXMgPSBnc3RfcnRzcF9leHRfbGlzdF9yZWNlaXZlX3JlcXVlc3QgKHNyYy0+ZXh0ZW5zaW9ucywgcmVxdWVzdCk7CisKKyAgaWYgKHJlcyA9PSBHU1RfUlRTUF9FTk9USU1QTCkgeworICAgIC8qIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sIHNlbmQgT0sgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJwcmVwYXJlIE9LIHJlcGx5Iik7CisgICAgcmVzID0KKyAgICAgICAgZ3N0X3J0c3BfbWVzc2FnZV9pbml0X3Jlc3BvbnNlICgmcmVzcG9uc2UsIEdTVF9SVFNQX1NUU19PSywgIk9LIiwKKyAgICAgICAgcmVxdWVzdCk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICBnb3RvIHNlbmRfZXJyb3I7CisKKyAgICAvKiBsZXQgYXBwIHBhcnNlIGFuZCByZXBseSAqLworICAgIGdfc2lnbmFsX2VtaXQgKHNyYywgZ3N0X3J0c3BzcmNfc2lnbmFsc1tTSUdOQUxfSEFORExFX1JFUVVFU1RdLAorICAgICAgICAwLCByZXF1ZXN0LCAmcmVzcG9uc2UpOworCisgICAgREVCVUdfUlRTUCAoc3JjLCAmcmVzcG9uc2UpOworCisgICAgcmVzID0gZ3N0X3J0c3BzcmNfY29ubmVjdGlvbl9zZW5kIChzcmMsIGNvbm5pbmZvLCAmcmVzcG9uc2UsIE5VTEwpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgZ290byBzZW5kX2Vycm9yOworCisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJnJlc3BvbnNlKTsKKyAgfSBlbHNlIGlmIChyZXMgPT0gR1NUX1JUU1BfRUVPRikKKyAgICByZXR1cm4gcmVzOworCisgIHJldHVybiBHU1RfUlRTUF9PSzsKKworICAvKiBFUlJPUlMgKi8KK3NlbmRfZXJyb3I6CisgIHsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVzcG9uc2UpOworICAgIHJldHVybiByZXM7CisgIH0KK30KKworLyogc2VuZCBzZXJ2ZXIga2VlcC1hbGl2ZSAqLworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX3NlbmRfa2VlcF9hbGl2ZSAoR3N0UlRTUFNyYyAqIHNyYykKK3sKKyAgR3N0UlRTUE1lc3NhZ2UgcmVxdWVzdCA9IHsgMCB9OworICBHc3RSVFNQUmVzdWx0IHJlczsKKyAgR3N0UlRTUE1ldGhvZCBtZXRob2Q7CisgIGNvbnN0IGdjaGFyICpjb250cm9sOworCisgIGlmIChzcmMtPmRvX3J0c3Bfa2VlcF9hbGl2ZSA9PSBGQUxTRSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImRvLXJ0c3Ata2VlcC1hbGl2ZSBpcyBGQUxTRSwgbm90IHNlbmRpbmcuIik7CisgICAgZ3N0X3J0c3BfY29ubmVjdGlvbl9yZXNldF90aW1lb3V0IChzcmMtPmNvbm5pbmZvLmNvbm5lY3Rpb24pOworICAgIHJldHVybiBHU1RfUlRTUF9PSzsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNyZWF0aW5nIHNlcnZlciBrZWVwLWFsaXZlIik7CisKKyAgLyogZmluZCBhIG1ldGhvZCB0byB1c2UgZm9yIGtlZXAtYWxpdmUgKi8KKyAgaWYgKHNyYy0+bWV0aG9kcyAmIEdTVF9SVFNQX0dFVF9QQVJBTUVURVIpCisgICAgbWV0aG9kID0gR1NUX1JUU1BfR0VUX1BBUkFNRVRFUjsKKyAgZWxzZQorICAgIG1ldGhvZCA9IEdTVF9SVFNQX09QVElPTlM7CisKKyAgY29udHJvbCA9IGdldF9hZ2dyZWdhdGVfY29udHJvbCAoc3JjKTsKKyAgaWYgKGNvbnRyb2wgPT0gTlVMTCkKKyAgICBnb3RvIG5vX2NvbnRyb2w7CisKKyAgcmVzID0gZ3N0X3J0c3BzcmNfaW5pdF9yZXF1ZXN0IChzcmMsICZyZXF1ZXN0LCBtZXRob2QsIGNvbnRyb2wpOworICBpZiAocmVzIDwgMCkKKyAgICBnb3RvIHNlbmRfZXJyb3I7CisKKyAgcmVxdWVzdC50eXBlX2RhdGEucmVxdWVzdC52ZXJzaW9uID0gc3JjLT52ZXJzaW9uOworCisgIHJlcyA9IGdzdF9ydHNwc3JjX2Nvbm5lY3Rpb25fc2VuZCAoc3JjLCAmc3JjLT5jb25uaW5mbywgJnJlcXVlc3QsIE5VTEwpOworICBpZiAocmVzIDwgMCkKKyAgICBnb3RvIHNlbmRfZXJyb3I7CisKKyAgZ3N0X3J0c3BfY29ubmVjdGlvbl9yZXNldF90aW1lb3V0IChzcmMtPmNvbm5pbmZvLmNvbm5lY3Rpb24pOworICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVxdWVzdCk7CisKKyAgcmV0dXJuIEdTVF9SVFNQX09LOworCisgIC8qIEVSUk9SUyAqLworbm9fY29udHJvbDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAibm8gY29udHJvbCB1cmwgdG8gc2VuZCBrZWVwYWxpdmUiKTsKKyAgICByZXR1cm4gR1NUX1JUU1BfT0s7CisgIH0KK3NlbmRfZXJyb3I6CisgIHsKKyAgICBnY2hhciAqc3RyID0gZ3N0X3J0c3Bfc3RycmVzdWx0IChyZXMpOworCisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJnJlcXVlc3QpOworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNyYywgUkVTT1VSQ0UsIFdSSVRFLCAoTlVMTCksCisgICAgICAgICgiQ291bGQgbm90IHNlbmQga2VlcC1hbGl2ZS4gKCVzKSIsIHN0cikpOworICAgIGdfZnJlZSAoc3RyKTsKKyAgICByZXR1cm4gcmVzOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRzcHNyY19oYW5kbGVfZGF0YSAoR3N0UlRTUFNyYyAqIHNyYywgR3N0UlRTUE1lc3NhZ2UgKiBtZXNzYWdlKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBnaW50IGNoYW5uZWw7CisgIEdzdFJUU1BTdHJlYW0gKnN0cmVhbTsKKyAgR3N0UGFkICpvdXRwYWQgPSBOVUxMOworICBndWludDggKmRhdGE7CisgIGd1aW50IHNpemU7CisgIEdzdEJ1ZmZlciAqYnVmOworICBnYm9vbGVhbiBpc19ydGNwOworCisgIGNoYW5uZWwgPSBtZXNzYWdlLT50eXBlX2RhdGEuZGF0YS5jaGFubmVsOworCisgIHN0cmVhbSA9IGZpbmRfc3RyZWFtIChzcmMsICZjaGFubmVsLCAoZ3BvaW50ZXIpIGZpbmRfc3RyZWFtX2J5X2NoYW5uZWwpOworICBpZiAoIXN0cmVhbSkKKyAgICBnb3RvIHVua25vd25fc3RyZWFtOworCisgIGlmIChjaGFubmVsID09IHN0cmVhbS0+Y2hhbm5lbFswXSkgeworICAgIG91dHBhZCA9IHN0cmVhbS0+Y2hhbm5lbHBhZFswXTsKKyAgICBpc19ydGNwID0gRkFMU0U7CisgIH0gZWxzZSBpZiAoY2hhbm5lbCA9PSBzdHJlYW0tPmNoYW5uZWxbMV0pIHsKKyAgICBvdXRwYWQgPSBzdHJlYW0tPmNoYW5uZWxwYWRbMV07CisgICAgaXNfcnRjcCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgaXNfcnRjcCA9IEZBTFNFOworICB9CisKKyAgLyogdGFrZSBhIGxvb2sgYXQgdGhlIGJvZHkgdG8gZmlndXJlIG91dCB3aGF0IHdlIGhhdmUgKi8KKyAgZ3N0X3J0c3BfbWVzc2FnZV9nZXRfYm9keSAobWVzc2FnZSwgJmRhdGEsICZzaXplKTsKKyAgaWYgKHNpemUgPCAyKQorICAgIGdvdG8gaW52YWxpZF9sZW5ndGg7CisKKyAgLyogY2hhbm5lbHMgYXJlIG5vdCBjb3JyZWN0IG9uIHNvbWUgc2VydmVycywgZG8gZXh0cmEgY2hlY2sgKi8KKyAgaWYgKGRhdGFbMV0gPj0gMjAwICYmIGRhdGFbMV0gPD0gMjA0KSB7CisgICAgLyogaG1tIFJUQ1AgbWVzc2FnZSBzd2l0Y2ggdG8gdGhlIFJUQ1AgcGFkIG9mIHRoZSBzYW1lIHN0cmVhbS4gKi8KKyAgICBvdXRwYWQgPSBzdHJlYW0tPmNoYW5uZWxwYWRbMV07CisgICAgaXNfcnRjcCA9IFRSVUU7CisgIH0KKworICAvKiB3ZSBoYXZlIG5vIGNsdWUgd2hhdCB0aGlzIGlzLCBqdXN0IGlnbm9yZSB0aGVuLiAqLworICBpZiAob3V0cGFkID09IE5VTEwpCisgICAgZ290byB1bmtub3duX3N0cmVhbTsKKworICAvKiB0YWtlIHRoZSBtZXNzYWdlIGJvZHkgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyAqLworICBnc3RfcnRzcF9tZXNzYWdlX3N0ZWFsX2JvZHkgKG1lc3NhZ2UsICZkYXRhLCAmc2l6ZSk7CisKKyAgLyogc3RyaXAgdGhlIHRyYWlsaW5nIFwwICovCisgIHNpemUgLT0gMTsKKworICBidWYgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgZ3N0X2J1ZmZlcl9hcHBlbmRfbWVtb3J5IChidWYsCisgICAgICBnc3RfbWVtb3J5X25ld193cmFwcGVkICgwLCBkYXRhLCBzaXplLCAwLCBzaXplLCBkYXRhLCBnX2ZyZWUpKTsKKworICAvKiBkb24ndCBuZWVkIG1lc3NhZ2UgYW55bW9yZSAqLworICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0IChtZXNzYWdlKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJwdXNoaW5nIGRhdGEgb2Ygc2l6ZSAlZCBvbiBjaGFubmVsICVkIiwgc2l6ZSwKKyAgICAgIGNoYW5uZWwpOworCisgIGlmIChzcmMtPm5lZWRfYWN0aXZhdGUpIHsKKyAgICBnY2hhciAqc3RyZWFtX2lkOworICAgIEdzdEV2ZW50ICpldmVudDsKKyAgICBHQ2hlY2tzdW0gKmNzOworICAgIGdjaGFyICp1cmk7CisgICAgR0xpc3QgKnN0cmVhbXM7CisgICAgZ3VpbnQgZ3JvdXBfaWQgPSBnc3RfdXRpbF9ncm91cF9pZF9uZXh0ICgpOworCisgICAgLyogZ2VuZXJhdGUgYW4gU0hBMjU2IHN1bSBvZiB0aGUgVVJJICovCisgICAgY3MgPSBnX2NoZWNrc3VtX25ldyAoR19DSEVDS1NVTV9TSEEyNTYpOworICAgIHVyaSA9IHNyYy0+Y29ubmluZm8ubG9jYXRpb247CisgICAgZ19jaGVja3N1bV91cGRhdGUgKGNzLCAoY29uc3QgZ3VjaGFyICopIHVyaSwgc3RybGVuICh1cmkpKTsKKworICAgIGZvciAoc3RyZWFtcyA9IHNyYy0+c3RyZWFtczsgc3RyZWFtczsgc3RyZWFtcyA9IGdfbGlzdF9uZXh0IChzdHJlYW1zKSkgeworICAgICAgR3N0UlRTUFN0cmVhbSAqb3N0cmVhbSA9IChHc3RSVFNQU3RyZWFtICopIHN0cmVhbXMtPmRhdGE7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICBzdHJlYW1faWQgPQorICAgICAgICAgIGdfc3RyZHVwX3ByaW50ZiAoIiVzLyVkIiwgZ19jaGVja3N1bV9nZXRfc3RyaW5nIChjcyksIG9zdHJlYW0tPmlkKTsKKyAgICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKHN0cmVhbV9pZCk7CisgICAgICBnc3RfZXZlbnRfc2V0X2dyb3VwX2lkIChldmVudCwgZ3JvdXBfaWQpOworCisgICAgICBnX2ZyZWUgKHN0cmVhbV9pZCk7CisgICAgICBnc3RfcnRzcHNyY19zdHJlYW1fcHVzaF9ldmVudCAoc3JjLCBvc3RyZWFtLCBldmVudCk7CisKKyAgICAgIGlmICgoY2FwcyA9IHN0cmVhbV9nZXRfY2Fwc19mb3JfcHQgKG9zdHJlYW0sIG9zdHJlYW0tPmRlZmF1bHRfcHQpKSkgeworICAgICAgICAvKiBvbmx5IHN0cmVhbXMgdGhhdCBoYXZlIGEgY29ubmVjdGlvbiB0byB0aGUgb3V0c2lkZSB3b3JsZCAqLworICAgICAgICBpZiAob3N0cmVhbS0+c2V0dXApIHsKKyAgICAgICAgICBpZiAob3N0cmVhbS0+dWRwc3JjWzBdKSB7CisgICAgICAgICAgICBnc3RfZWxlbWVudF9zZW5kX2V2ZW50IChvc3RyZWFtLT51ZHBzcmNbMF0sCisgICAgICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgICAgICAgICAgfSBlbHNlIGlmIChvc3RyZWFtLT5jaGFubmVscGFkWzBdKSB7CisgICAgICAgICAgICBpZiAoR1NUX1BBRF9JU19TUkMgKG9zdHJlYW0tPmNoYW5uZWxwYWRbMF0pKQorICAgICAgICAgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKG9zdHJlYW0tPmNoYW5uZWxwYWRbMF0sCisgICAgICAgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X2NhcHMgKGNhcHMpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZ3N0X3BhZF9zZW5kX2V2ZW50IChvc3RyZWFtLT5jaGFubmVscGFkWzBdLAorICAgICAgICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgICAgICAgICAgfQorICAgICAgICAgIG9zdHJlYW0tPm5lZWRfY2FwcyA9IEZBTFNFOworCisgICAgICAgICAgaWYgKG9zdHJlYW0tPnByb2ZpbGUgPT0gR1NUX1JUU1BfUFJPRklMRV9TQVZQIHx8CisgICAgICAgICAgICAgIG9zdHJlYW0tPnByb2ZpbGUgPT0gR1NUX1JUU1BfUFJPRklMRV9TQVZQRikKKyAgICAgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXBwbGljYXRpb24veC1zcnRjcCIpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXBwbGljYXRpb24veC1ydGNwIik7CisKKyAgICAgICAgICBpZiAob3N0cmVhbS0+dWRwc3JjWzFdKSB7CisgICAgICAgICAgICBnc3RfZWxlbWVudF9zZW5kX2V2ZW50IChvc3RyZWFtLT51ZHBzcmNbMV0sCisgICAgICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgICAgICAgICAgfSBlbHNlIGlmIChvc3RyZWFtLT5jaGFubmVscGFkWzFdKSB7CisgICAgICAgICAgICBpZiAoR1NUX1BBRF9JU19TUkMgKG9zdHJlYW0tPmNoYW5uZWxwYWRbMV0pKQorICAgICAgICAgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKG9zdHJlYW0tPmNoYW5uZWxwYWRbMV0sCisgICAgICAgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X2NhcHMgKGNhcHMpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZ3N0X3BhZF9zZW5kX2V2ZW50IChvc3RyZWFtLT5jaGFubmVscGFkWzFdLAorICAgICAgICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGdfY2hlY2tzdW1fZnJlZSAoY3MpOworCisgICAgZ3N0X3J0c3BzcmNfYWN0aXZhdGVfc3RyZWFtcyAoc3JjKTsKKyAgICBzcmMtPm5lZWRfYWN0aXZhdGUgPSBGQUxTRTsKKyAgICBzcmMtPm5lZWRfc2VnbWVudCA9IFRSVUU7CisgIH0KKworICBpZiAoc3JjLT5iYXNlX3RpbWUgPT0gLTEpIHsKKyAgICAvKiBUYWtlIGN1cnJlbnQgcnVubmluZ190aW1lLiBUaGlzIHRpbWVzdGFtcCB3aWxsIGJlIHB1dCBvbgorICAgICAqIHRoZSBmaXJzdCBidWZmZXIgb2YgZWFjaCBzdHJlYW0gYmVjYXVzZSB3ZSBhcmUgYSBsaXZlIHNvdXJjZSBhbmQgc28gd2UKKyAgICAgKiB0aW1lc3RhbXAgd2l0aCB0aGUgcnVubmluZ190aW1lLiBXaGVuIHdlIGFyZSBkZWFsaW5nIHdpdGggVENQLCB3ZSBhbHNvCisgICAgICogb25seSB0aW1lc3RhbXAgdGhlIGZpcnN0IGJ1ZmZlciAodXNpbmcgdGhlIERJU0NPTlQgZmxhZykgYmVjYXVzZSBhIHNlcnZlcgorICAgICAqIHR5cGljYWxseSBidXJzdHMgZGF0YSwgZm9yIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8gY29tcGVuc2F0ZSBieSBzcGVlZGluZworICAgICAqIHVwIHRoZSBtZWRpYS4gVGhlIG90aGVyIHRpbWVzdGFtcHMgd2lsbCBiZSBpbnRlcnBvbGxhdGVkIGZyb20gdGhpcyBvbmUKKyAgICAgKiB1c2luZyB0aGUgUlRQIHRpbWVzdGFtcHMuICovCisgICAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworICAgIGlmIChHU1RfRUxFTUVOVF9DTE9DSyAoc3JjKSkgeworICAgICAgR3N0Q2xvY2tUaW1lIG5vdzsKKyAgICAgIEdzdENsb2NrVGltZSBiYXNlX3RpbWU7CisKKyAgICAgIG5vdyA9IGdzdF9jbG9ja19nZXRfdGltZSAoR1NUX0VMRU1FTlRfQ0xPQ0sgKHNyYykpOworICAgICAgYmFzZV90aW1lID0gR1NUX0VMRU1FTlRfQ0FTVCAoc3JjKS0+YmFzZV90aW1lOworCisgICAgICBzcmMtPmJhc2VfdGltZSA9IG5vdyAtIGJhc2VfdGltZTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZmlyc3QgYnVmZmVyIGF0IHRpbWUgJSIgR1NUX1RJTUVfRk9STUFUICIsIGJhc2UgJSIKKyAgICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKG5vdyksIEdTVF9USU1FX0FSR1MgKGJhc2VfdGltZSkpOworICAgIH0KKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc3JjKTsKKyAgfQorCisgIC8qIElmIG5lZWRlZCBzZW5kIGEgbmV3IHNlZ21lbnQsIGRvbid0IGZvcmdldCB3ZSBhcmUgbGl2ZSBhbmQgYnVmZmVyIGFyZQorICAgKiB0aW1lc3RhbXBlZCB3aXRoIHJ1bm5pbmcgdGltZSAqLworICBpZiAoc3JjLT5uZWVkX3NlZ21lbnQpIHsKKyAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgICAgc3JjLT5uZWVkX3NlZ21lbnQgPSBGQUxTRTsKKyAgICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgICBnc3RfcnRzcHNyY19wdXNoX2V2ZW50IChzcmMsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKyAgfQorCisgIGlmIChzdHJlYW0tPm5lZWRfY2FwcykgeworICAgIEdzdENhcHMgKmNhcHM7CisKKyAgICBpZiAoKGNhcHMgPSBzdHJlYW1fZ2V0X2NhcHNfZm9yX3B0IChzdHJlYW0sIHN0cmVhbS0+ZGVmYXVsdF9wdCkpKSB7CisgICAgICAvKiBvbmx5IHN0cmVhbXMgdGhhdCBoYXZlIGEgY29ubmVjdGlvbiB0byB0aGUgb3V0c2lkZSB3b3JsZCAqLworICAgICAgaWYgKHN0cmVhbS0+c2V0dXApIHsKKyAgICAgICAgLyogT25seSBuZWVkIHRvIHVwZGF0ZSB0aGUgVENQIGNhcHMgaGVyZSwgVURQIGlzIGFscmVhZHkgaGFuZGxlZCAqLworICAgICAgICBpZiAoc3RyZWFtLT5jaGFubmVscGFkWzBdKSB7CisgICAgICAgICAgaWYgKEdTVF9QQURfSVNfU1JDIChzdHJlYW0tPmNoYW5uZWxwYWRbMF0pKQorICAgICAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzdHJlYW0tPmNoYW5uZWxwYWRbMF0sCisgICAgICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZ3N0X3BhZF9zZW5kX2V2ZW50IChzdHJlYW0tPmNoYW5uZWxwYWRbMF0sCisgICAgICAgICAgICAgICAgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtLT5uZWVkX2NhcHMgPSBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdHJlYW0tPm5lZWRfY2FwcyA9IEZBTFNFOworICB9CisKKyAgaWYgKHN0cmVhbS0+ZGlzY29udCAmJiAhaXNfcnRjcCkgeworICAgIC8qIG1hcmsgZmlyc3QgUlRQIGJ1ZmZlciBhcyBkaXNjb250ICovCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgICAgc3RyZWFtLT5kaXNjb250ID0gRkFMU0U7CisgICAgLyogZmlyc3QgYnVmZmVyIGdldHMgdGhlIHRpbWVzdGFtcCwgb3RoZXIgYnVmZmVycyBhcmUgbm90IHRpbWVzdGFtcGVkIGFuZAorICAgICAqIHRoZWlyIHByZXNlbnRhdGlvbiB0aW1lIHdpbGwgYmUgaW50ZXJwb2xsYXRlZCBmcm9tIHRoZSBydHAgdGltZXN0YW1wcy4gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzZXR0aW5nIHRpbWVzdGFtcCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHNyYy0+YmFzZV90aW1lKSk7CisKKyAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKSA9IHNyYy0+YmFzZV90aW1lOworICB9CisKKyAgLyogY2hhaW4gdG8gdGhlIHBlZXIgcGFkICovCisgIGlmIChHU1RfUEFEX0lTX1NJTksgKG91dHBhZCkpCisgICAgcmV0ID0gZ3N0X3BhZF9jaGFpbiAob3V0cGFkLCBidWYpOworICBlbHNlCisgICAgcmV0ID0gZ3N0X3BhZF9wdXNoIChvdXRwYWQsIGJ1Zik7CisKKyAgaWYgKCFpc19ydGNwKSB7CisgICAgLyogY29tYmluZSBhbGwgc3RyZWFtIGZsb3dzIGZvciB0aGUgZGF0YSB0cmFuc3BvcnQgKi8KKyAgICByZXQgPSBnc3RfcnRzcHNyY19jb21iaW5lX2Zsb3dzIChzcmMsIHN0cmVhbSwgcmV0KTsKKyAgfQorICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLwordW5rbm93bl9zdHJlYW06CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJ1bmtub3duIHN0cmVhbSBvbiBjaGFubmVsICVkLCBpZ25vcmVkIiwgY2hhbm5lbCk7CisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAobWVzc2FnZSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CitpbnZhbGlkX2xlbmd0aDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNyYywgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICAgKCJTaG9ydCBtZXNzYWdlIHJlY2VpdmVkLCBpZ25vcmluZy4iKSk7CisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAobWVzc2FnZSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRzcHNyY19sb29wX2ludGVybGVhdmVkIChHc3RSVFNQU3JjICogc3JjKQoreworICBHc3RSVFNQTWVzc2FnZSBtZXNzYWdlID0geyAwIH07CisgIEdzdFJUU1BSZXN1bHQgcmVzOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHVGltZVZhbCB0dl90aW1lb3V0OworCisgIHdoaWxlIChUUlVFKSB7CisgICAgLyogZ2V0IHRoZSBuZXh0IHRpbWVvdXQgaW50ZXJ2YWwgKi8KKyAgICBnc3RfcnRzcF9jb25uZWN0aW9uX25leHRfdGltZW91dCAoc3JjLT5jb25uaW5mby5jb25uZWN0aW9uLCAmdHZfdGltZW91dCk7CisKKyAgICAvKiBzZWUgaWYgdGhlIHRpbWVvdXQgcGVyaW9kIGV4cGlyZWQgKi8KKyAgICBpZiAoKHR2X3RpbWVvdXQudHZfc2VjIHwgdHZfdGltZW91dC50dl91c2VjKSA9PSAwKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJ0aW1vdXQsIHNlbmRpbmcga2VlcC1hbGl2ZSIpOworICAgICAgLyogc2VuZCBrZWVwLWFsaXZlLCBvbmx5IGFjdCBvbiBpbnRlcnJ1cHQsIGEgd2FybmluZyB3aWxsIGJlIHBvc3RlZCBmb3IKKyAgICAgICAqIG90aGVyIGVycm9ycy4gKi8KKyAgICAgIGlmICgocmVzID0gZ3N0X3J0c3BzcmNfc2VuZF9rZWVwX2FsaXZlIChzcmMpKSA9PSBHU1RfUlRTUF9FSU5UUikKKyAgICAgICAgZ290byBpbnRlcnJ1cHQ7CisgICAgICAvKiBnZXQgbmV3IHRpbWVvdXQgKi8KKyAgICAgIGdzdF9ydHNwX2Nvbm5lY3Rpb25fbmV4dF90aW1lb3V0IChzcmMtPmNvbm5pbmZvLmNvbm5lY3Rpb24sICZ0dl90aW1lb3V0KTsKKyAgICB9CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJkb2luZyByZWNlaXZlIHdpdGggdGltZW91dCAlbGQgc2Vjb25kcywgJWxkIHVzZWMiLAorICAgICAgICB0dl90aW1lb3V0LnR2X3NlYywgdHZfdGltZW91dC50dl91c2VjKTsKKworICAgIC8qIHByb3RlY3QgdGhlIGNvbm5lY3Rpb24gd2l0aCB0aGUgY29ubmVjdGlvbiBsb2NrIHNvIHRoYXQgd2UgY2FuIHNlZSB3aGVuCisgICAgICogd2UgYXJlIGZpbmlzaGVkIGRvaW5nIHNlcnZlciBjb21tdW5pY2F0aW9uICovCisgICAgcmVzID0KKyAgICAgICAgZ3N0X3J0c3BzcmNfY29ubmVjdGlvbl9yZWNlaXZlIChzcmMsICZzcmMtPmNvbm5pbmZvLAorICAgICAgICAmbWVzc2FnZSwgc3JjLT5wdGNwX3RpbWVvdXQpOworCisgICAgc3dpdGNoIChyZXMpIHsKKyAgICAgIGNhc2UgR1NUX1JUU1BfT0s6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIndlIHJlY2VpdmVkIGEgc2VydmVyIG1lc3NhZ2UiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9SVFNQX0VJTlRSOgorICAgICAgICAvKiB3ZSBnb3QgaW50ZXJydXB0ZWQgdGhpcyBtZWFucyB3ZSBuZWVkIHRvIHN0b3AgKi8KKyAgICAgICAgZ290byBpbnRlcnJ1cHQ7CisgICAgICBjYXNlIEdTVF9SVFNQX0VUSU1FT1VUOgorICAgICAgICAvKiBubyByZXBseSwgc2VuZCBrZWVwIGFsaXZlICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInRpbWVvdXQsIHNlbmRpbmcga2VlcC1hbGl2ZSIpOworICAgICAgICBpZiAoKHJlcyA9IGdzdF9ydHNwc3JjX3NlbmRfa2VlcF9hbGl2ZSAoc3JjKSkgPT0gR1NUX1JUU1BfRUlOVFIpCisgICAgICAgICAgZ290byBpbnRlcnJ1cHQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgY2FzZSBHU1RfUlRTUF9FRU9GOgorICAgICAgICAvKiBnbyBFT1Mgd2hlbiB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiAqLworICAgICAgICBnb3RvIHNlcnZlcl9lb2Y7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIHJlY2VpdmVfZXJyb3I7CisgICAgfQorCisgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHsKKyAgICAgIGNhc2UgR1NUX1JUU1BfTUVTU0FHRV9SRVFVRVNUOgorICAgICAgICAvKiBzZXJ2ZXIgc2VuZHMgdXMgYSByZXF1ZXN0IG1lc3NhZ2UsIGhhbmRsZSBpdCAqLworICAgICAgICByZXMgPSBnc3RfcnRzcHNyY19oYW5kbGVfcmVxdWVzdCAoc3JjLCAmc3JjLT5jb25uaW5mbywgJm1lc3NhZ2UpOworICAgICAgICBpZiAocmVzID09IEdTVF9SVFNQX0VFT0YpCisgICAgICAgICAgZ290byBzZXJ2ZXJfZW9mOworICAgICAgICBlbHNlIGlmIChyZXMgPCAwKQorICAgICAgICAgIGdvdG8gaGFuZGxlX3JlcXVlc3RfZmFpbGVkOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1JUU1BfTUVTU0FHRV9SRVNQT05TRToKKyAgICAgICAgLyogd2UgaWdub3JlIHJlc3BvbnNlIG1lc3NhZ2VzICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImlnbm9yaW5nIHJlc3BvbnNlIG1lc3NhZ2UiKTsKKyAgICAgICAgREVCVUdfUlRTUCAoc3JjLCAmbWVzc2FnZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUlRTUF9NRVNTQUdFX0RBVEE6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImdvdCBkYXRhIG1lc3NhZ2UiKTsKKyAgICAgICAgcmV0ID0gZ3N0X3J0c3BzcmNfaGFuZGxlX2RhdGEgKHNyYywgJm1lc3NhZ2UpOworICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgIGdvdG8gaGFuZGxlX2RhdGFfZmFpbGVkOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiaWdub3JpbmcgdW5rbm93biBtZXNzYWdlIHR5cGUgJWQiLAorICAgICAgICAgICAgbWVzc2FnZS50eXBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworCisgIC8qIEVSUk9SUyAqLworc2VydmVyX2VvZjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIndlIGdvdCBhbiBlb2YgZnJvbSB0aGUgc2VydmVyIik7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoc3JjLCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgICAoIlRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uLiIpKTsKKyAgICBzcmMtPmNvbm5pbmZvLmNvbm5lY3RlZCA9IEZBTFNFOworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZtZXNzYWdlKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworICB9CitpbnRlcnJ1cHQ6CisgIHsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmbWVzc2FnZSk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZ290IGludGVycnVwdGVkIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICB9CityZWNlaXZlX2Vycm9yOgorICB7CisgICAgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0cnJlc3VsdCAocmVzKTsKKworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBSRUFELCAoTlVMTCksCisgICAgICAgICgiQ291bGQgbm90IHJlY2VpdmUgbWVzc2FnZS4gKCVzKSIsIHN0cikpOworICAgIGdfZnJlZSAoc3RyKTsKKworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZtZXNzYWdlKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2hhbmRsZV9yZXF1ZXN0X2ZhaWxlZDoKKyAgeworICAgIGdjaGFyICpzdHIgPSBnc3RfcnRzcF9zdHJyZXN1bHQgKHJlcyk7CisKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgV1JJVEUsIChOVUxMKSwKKyAgICAgICAgKCJDb3VsZCBub3QgaGFuZGxlIHNlcnZlciBtZXNzYWdlLiAoJXMpIiwgc3RyKSk7CisgICAgZ19mcmVlIChzdHIpOworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZtZXNzYWdlKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2hhbmRsZV9kYXRhX2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNvdWxkIG5vIGhhbmRsZSBkYXRhIG1lc3NhZ2UiKTsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfcnRzcHNyY19sb29wX3VkcCAoR3N0UlRTUFNyYyAqIHNyYykKK3sKKyAgR3N0UlRTUFJlc3VsdCByZXM7CisgIEdzdFJUU1BNZXNzYWdlIG1lc3NhZ2UgPSB7IDAgfTsKKyAgZ2ludCByZXRyeSA9IDA7CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBHVGltZVZhbCB0dl90aW1lb3V0OworCisgICAgLyogZ2V0IHRoZSBuZXh0IHRpbWVvdXQgaW50ZXJ2YWwgKi8KKyAgICBnc3RfcnRzcF9jb25uZWN0aW9uX25leHRfdGltZW91dCAoc3JjLT5jb25uaW5mby5jb25uZWN0aW9uLCAmdHZfdGltZW91dCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJkb2luZyByZWNlaXZlIHdpdGggdGltZW91dCAlZCBzZWNvbmRzIiwKKyAgICAgICAgKGdpbnQpIHR2X3RpbWVvdXQudHZfc2VjKTsKKworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZtZXNzYWdlKTsKKworICAgIC8qIHdlIHNob3VsZCBjb250aW51ZSByZWFkaW5nIHRoZSBUQ1Agc29ja2V0IGJlY2F1c2UgdGhlIHNlcnZlciBtaWdodAorICAgICAqIHNlbmQgdXMgcmVxdWVzdHMuIFdoZW4gdGhlIHNlc3Npb24gdGltZW91dCBleHBpcmVzLCB3ZSBuZWVkIHRvIHNlbmQgYQorICAgICAqIGtlZXAtYWxpdmUgcmVxdWVzdCB0byBrZWVwIHRoZSBzZXNzaW9uIG9wZW4uICovCisgICAgcmVzID0gZ3N0X3J0c3BzcmNfY29ubmVjdGlvbl9yZWNlaXZlIChzcmMsICZzcmMtPmNvbm5pbmZvLAorICAgICAgICAmbWVzc2FnZSwgJnR2X3RpbWVvdXQpOworCisgICAgc3dpdGNoIChyZXMpIHsKKyAgICAgIGNhc2UgR1NUX1JUU1BfT0s6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIndlIHJlY2VpdmVkIGEgc2VydmVyIG1lc3NhZ2UiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9SVFNQX0VJTlRSOgorICAgICAgICAvKiB3ZSBnb3QgaW50ZXJydXB0ZWQsIHNlZSB3aGF0IHdlIGhhdmUgdG8gZG8gKi8KKyAgICAgICAgZ290byBpbnRlcnJ1cHQ7CisgICAgICBjYXNlIEdTVF9SVFNQX0VUSU1FT1VUOgorICAgICAgICAvKiBzZW5kIGtlZXAtYWxpdmUsIGlnbm9yZSB0aGUgcmVzdWx0LCBhIHdhcm5pbmcgd2lsbCBiZSBwb3N0ZWQuICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInRpbWVvdXQsIHNlbmRpbmcga2VlcC1hbGl2ZSIpOworICAgICAgICBpZiAoKHJlcyA9IGdzdF9ydHNwc3JjX3NlbmRfa2VlcF9hbGl2ZSAoc3JjKSkgPT0gR1NUX1JUU1BfRUlOVFIpCisgICAgICAgICAgZ290byBpbnRlcnJ1cHQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgY2FzZSBHU1RfUlRTUF9FRU9GOgorICAgICAgICAvKiBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uLiBub3QgdmVyeSBmYXRhbCBmb3IgVURQLCByZWNvbm5lY3QgYW5kCisgICAgICAgICAqIHNlZSB3aGF0IGhhcHBlbnMuICovCisgICAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNyYywgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICAgICAgICgiVGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24uIikpOworICAgICAgICBpZiAoc3JjLT51ZHBfcmVjb25uZWN0KSB7CisgICAgICAgICAgaWYgKChyZXMgPQorICAgICAgICAgICAgICAgICAgZ3N0X3J0c3BfY29ubmluZm9fcmVjb25uZWN0IChzcmMsICZzcmMtPmNvbm5pbmZvLCBGQUxTRSkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gY29ubmVjdF9lcnJvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIHNlcnZlcl9lb2Y7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICBjYXNlIEdTVF9SVFNQX0VORVQ6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIkFuIGV0aGVybmV0IHByb2JsZW0gb2NjdXJlZC4iKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNyYywgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICAgICAgICgiVW5oYW5kbGVkIHJldHVybiB2YWx1ZSAlZC4iLCByZXMpKTsKKyAgICAgICAgZ290byByZWNlaXZlX2Vycm9yOworICAgIH0KKworICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7CisgICAgICBjYXNlIEdTVF9SVFNQX01FU1NBR0VfUkVRVUVTVDoKKyAgICAgICAgLyogc2VydmVyIHNlbmRzIHVzIGEgcmVxdWVzdCBtZXNzYWdlLCBoYW5kbGUgaXQgKi8KKyAgICAgICAgcmVzID0gZ3N0X3J0c3BzcmNfaGFuZGxlX3JlcXVlc3QgKHNyYywgJnNyYy0+Y29ubmluZm8sICZtZXNzYWdlKTsKKyAgICAgICAgaWYgKHJlcyA9PSBHU1RfUlRTUF9FRU9GKQorICAgICAgICAgIGdvdG8gc2VydmVyX2VvZjsKKyAgICAgICAgZWxzZSBpZiAocmVzIDwgMCkKKyAgICAgICAgICBnb3RvIGhhbmRsZV9yZXF1ZXN0X2ZhaWxlZDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9SVFNQX01FU1NBR0VfUkVTUE9OU0U6CisgICAgICAgIC8qIHdlIGlnbm9yZSByZXNwb25zZSBhbmQgZGF0YSBtZXNzYWdlcyAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJpZ25vcmluZyByZXNwb25zZSBtZXNzYWdlIik7CisgICAgICAgIERFQlVHX1JUU1AgKHNyYywgJm1lc3NhZ2UpOworICAgICAgICBpZiAobWVzc2FnZS50eXBlX2RhdGEucmVzcG9uc2UuY29kZSA9PSBHU1RfUlRTUF9TVFNfVU5BVVRIT1JJWkVEKSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiYnV0IGlzIFVuYXV0aG9yaXplZCByZXNwb25zZSAuLi4iKTsKKyAgICAgICAgICBpZiAoZ3N0X3J0c3BzcmNfc2V0dXBfYXV0aCAoc3JjLCAmbWVzc2FnZSkgJiYgIShyZXRyeSsrKSkgeworICAgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic28gcmV0cnlpbmcga2VlcC1hbGl2ZSIpOworICAgICAgICAgICAgaWYgKChyZXMgPSBnc3RfcnRzcHNyY19zZW5kX2tlZXBfYWxpdmUgKHNyYykpID09IEdTVF9SVFNQX0VJTlRSKQorICAgICAgICAgICAgICBnb3RvIGludGVycnVwdDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0cnkgPSAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUlRTUF9NRVNTQUdFX0RBVEE6CisgICAgICAgIC8qIHdlIGlnbm9yZSByZXNwb25zZSBhbmQgZGF0YSBtZXNzYWdlcyAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJpZ25vcmluZyBkYXRhIG1lc3NhZ2UiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgImlnbm9yaW5nIHVua25vd24gbWVzc2FnZSB0eXBlICVkIiwKKyAgICAgICAgICAgIG1lc3NhZ2UudHlwZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKworICAvKiB3ZSBnZXQgaGVyZSB3aGVuIHRoZSBjb25uZWN0aW9uIGdvdCBpbnRlcnJ1cHRlZCAqLworaW50ZXJydXB0OgorICB7CisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJm1lc3NhZ2UpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImdvdCBpbnRlcnJ1cHRlZCIpOworICAgIHJldHVybiBHU1RfRkxPV19GTFVTSElORzsKKyAgfQorY29ubmVjdF9lcnJvcjoKKyAgeworICAgIGdjaGFyICpzdHIgPSBnc3RfcnRzcF9zdHJyZXN1bHQgKHJlcyk7CisgICAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgICBzcmMtPmNvbm5pbmZvLmNvbm5lY3RlZCA9IEZBTFNFOworICAgIGlmIChyZXMgIT0gR1NUX1JUU1BfRUlOVFIpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBPUEVOX1JFQURfV1JJVEUsIChOVUxMKSwKKyAgICAgICAgICAoIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlci4gKCVzKSIsIHN0cikpOworICAgICAgZ19mcmVlIChzdHIpOworICAgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0ZMVVNISU5HOworICAgIH0KKyAgICByZXR1cm4gcmV0OworICB9CityZWNlaXZlX2Vycm9yOgorICB7CisgICAgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0cnJlc3VsdCAocmVzKTsKKworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBSRUFELCAoTlVMTCksCisgICAgICAgICgiQ291bGQgbm90IHJlY2VpdmUgbWVzc2FnZS4gKCVzKSIsIHN0cikpOworICAgIGdfZnJlZSAoc3RyKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2hhbmRsZV9yZXF1ZXN0X2ZhaWxlZDoKKyAgeworICAgIGdjaGFyICpzdHIgPSBnc3RfcnRzcF9zdHJyZXN1bHQgKHJlcyk7CisgICAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmbWVzc2FnZSk7CisgICAgaWYgKHJlcyAhPSBHU1RfUlRTUF9FSU5UUikgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFdSSVRFLCAoTlVMTCksCisgICAgICAgICAgKCJDb3VsZCBub3QgaGFuZGxlIHNlcnZlciBtZXNzYWdlLiAoJXMpIiwgc3RyKSk7CisgICAgICBnX2ZyZWUgKHN0cik7CisgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0ID0gR1NUX0ZMT1dfRkxVU0hJTkc7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0KK3NlcnZlcl9lb2Y6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJ3ZSBnb3QgYW4gZW9mIGZyb20gdGhlIHNlcnZlciIpOworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNyYywgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICAgKCJUaGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbi4iKSk7CisgICAgc3JjLT5jb25uaW5mby5jb25uZWN0ZWQgPSBGQUxTRTsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmbWVzc2FnZSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VPUzsKKyAgfQorfQorCitzdGF0aWMgR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BzcmNfcmVjb25uZWN0IChHc3RSVFNQU3JjICogc3JjLCBnYm9vbGVhbiBhc3luYykKK3sKKyAgR3N0UlRTUFJlc3VsdCByZXMgPSBHU1RfUlRTUF9PSzsKKyAgZ2Jvb2xlYW4gcmVzdGFydDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJkb2luZyByZWNvbm5lY3QiKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHNyYyk7CisgIC8qIG9ubHkgcmVzdGFydCB3aGVuIHRoZSBwYWRzIHdlcmUgbm90IHlldCBhY3RpdmF0ZWQsIGVsc2Ugd2Ugd2VyZQorICAgKiBzdHJlYW1pbmcgb3ZlciBVRFAgKi8KKyAgcmVzdGFydCA9IHNyYy0+bmVlZF9hY3RpdmF0ZTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisKKyAgLyogbm8gbmVlZCB0byByZXN0YXJ0LCB3ZSdyZSBkb25lICovCisgIGlmICghcmVzdGFydCkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogd2UgY2FuIHRyeSBvbmx5IFRDUCBub3cgKi8KKyAgc3JjLT5jdXJfcHJvdG9jb2xzID0gR1NUX1JUU1BfTE9XRVJfVFJBTlNfVENQOworCisgIC8qIGNsb3NlIGFuZCBjbGVhbnVwIG91ciBzdGF0ZSAqLworICBpZiAoKHJlcyA9IGdzdF9ydHNwc3JjX2Nsb3NlIChzcmMsIGFzeW5jLCBGQUxTRSkpIDwgMCkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogc2VlIGlmIHdlIGhhdmUgVENQIGxlZnQgdG8gdHJ5LiBBbHNvIGRvbid0IHRyeSBUQ1Agd2hlbiB3ZSB3ZXJlIGNvbmZpZ3VyZWQKKyAgICogd2l0aCBhbiBTRFAuICovCisgIGlmICghKHNyYy0+cHJvdG9jb2xzICYgR1NUX1JUU1BfTE9XRVJfVFJBTlNfVENQKSB8fCBzcmMtPmZyb21fc2RwKQorICAgIGdvdG8gbm9fcHJvdG9jb2xzOworCisgIC8qIFdlIHBvc3QgYSB3YXJuaW5nIG1lc3NhZ2Ugbm93IHRvIGluZm9ybSB0aGUgdXNlcgorICAgKiB0aGF0IG5vdGhpbmcgaGFwcGVuZWQuIEl0J3MgbW9zdCBsaWtlbHkgYSBmaXJld2FsbCB0aGluZy4gKi8KKyAgR1NUX0VMRU1FTlRfV0FSTklORyAoc3JjLCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgKCJDb3VsZCBub3QgcmVjZWl2ZSBhbnkgVURQIHBhY2tldHMgZm9yICUuNGYgc2Vjb25kcywgbWF5YmUgeW91ciAiCisgICAgICAgICAgImZpcmV3YWxsIGlzIGJsb2NraW5nIGl0LiBSZXRyeWluZyB1c2luZyBhIHRjcCBjb25uZWN0aW9uLiIsCisgICAgICAgICAgZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAoc3JjLT51ZHBfdGltZW91dCkgLyAxMDAwMDAwLjApKTsKKworICAvKiBvcGVuIG5ldyBjb25uZWN0aW9uIHVzaW5nIHRjcCAqLworICBpZiAoZ3N0X3J0c3BzcmNfb3BlbiAoc3JjLCBhc3luYykgPCAwKQorICAgIGdvdG8gb3Blbl9mYWlsZWQ7CisKKyAgLyogc3RhcnQgcGxheWJhY2sgKi8KKyAgaWYgKGdzdF9ydHNwc3JjX3BsYXkgKHNyYywgJnNyYy0+c2VnbWVudCwgYXN5bmMsIE5VTEwpIDwgMCkKKyAgICBnb3RvIHBsYXlfZmFpbGVkOworCitkb25lOgorICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworbm9fcHJvdG9jb2xzOgorICB7CisgICAgc3JjLT5jdXJfcHJvdG9jb2xzID0gMDsKKyAgICAvKiBubyB0cmFuc3BvcnQgcG9zc2libGUsIHBvc3QgYW4gZXJyb3IgYW5kIHN0b3AgKi8KKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCByZWNlaXZlIGFueSBVRFAgcGFja2V0cyBmb3IgJS40ZiBzZWNvbmRzLCBtYXliZSB5b3VyICIKKyAgICAgICAgICAgICJmaXJld2FsbCBpcyBibG9ja2luZyBpdC4gTm8gb3RoZXIgcHJvdG9jb2xzIHRvIHRyeS4iLAorICAgICAgICAgICAgZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAoc3JjLT51ZHBfdGltZW91dCkgLyAxMDAwMDAwLjApKTsKKyAgICByZXR1cm4gR1NUX1JUU1BfRVJST1I7CisgIH0KK29wZW5fZmFpbGVkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAib3BlbiBmYWlsZWQiKTsKKyAgICByZXR1cm4gR1NUX1JUU1BfT0s7CisgIH0KK3BsYXlfZmFpbGVkOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicGxheSBmYWlsZWQiKTsKKyAgICByZXR1cm4gR1NUX1JUU1BfT0s7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX2xvb3Bfc3RhcnRfY21kIChHc3RSVFNQU3JjICogc3JjLCBnaW50IGNtZCkKK3sKKyAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIENNRF9PUEVOOgorICAgICAgR1NUX0VMRU1FTlRfUFJPR1JFU1MgKHNyYywgU1RBUlQsICJvcGVuIiwgKCJPcGVuaW5nIFN0cmVhbSIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX1BMQVk6CisgICAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBTVEFSVCwgInJlcXVlc3QiLCAoIlNlbmRpbmcgUExBWSByZXF1ZXN0IikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfUEFVU0U6CisgICAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBTVEFSVCwgInJlcXVlc3QiLCAoIlNlbmRpbmcgUEFVU0UgcmVxdWVzdCIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0NMT1NFOgorICAgICAgR1NUX0VMRU1FTlRfUFJPR1JFU1MgKHNyYywgU1RBUlQsICJjbG9zZSIsICgiQ2xvc2luZyBTdHJlYW0iKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX2xvb3BfY29tcGxldGVfY21kIChHc3RSVFNQU3JjICogc3JjLCBnaW50IGNtZCkKK3sKKyAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIENNRF9PUEVOOgorICAgICAgR1NUX0VMRU1FTlRfUFJPR1JFU1MgKHNyYywgQ09NUExFVEUsICJvcGVuIiwgKCJPcGVuZWQgU3RyZWFtIikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfUExBWToKKyAgICAgIEdTVF9FTEVNRU5UX1BST0dSRVNTIChzcmMsIENPTVBMRVRFLCAicmVxdWVzdCIsICgiU2VudCBQTEFZIHJlcXVlc3QiKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9QQVVTRToKKyAgICAgIEdTVF9FTEVNRU5UX1BST0dSRVNTIChzcmMsIENPTVBMRVRFLCAicmVxdWVzdCIsICgiU2VudCBQQVVTRSByZXF1ZXN0IikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfQ0xPU0U6CisgICAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBDT01QTEVURSwgImNsb3NlIiwgKCJDbG9zZWQgU3RyZWFtIikpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19sb29wX2NhbmNlbF9jbWQgKEdzdFJUU1BTcmMgKiBzcmMsIGdpbnQgY21kKQoreworICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgQ01EX09QRU46CisgICAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBDQU5DRUxFRCwgIm9wZW4iLCAoIk9wZW4gY2FuY2VsZWQiKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9QTEFZOgorICAgICAgR1NUX0VMRU1FTlRfUFJPR1JFU1MgKHNyYywgQ0FOQ0VMRUQsICJyZXF1ZXN0IiwgKCJQTEFZIGNhbmNlbGVkIikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfUEFVU0U6CisgICAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBDQU5DRUxFRCwgInJlcXVlc3QiLCAoIlBBVVNFIGNhbmNlbGVkIikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfQ0xPU0U6CisgICAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBDQU5DRUxFRCwgImNsb3NlIiwgKCJDbG9zZSBjYW5jZWxlZCIpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfbG9vcF9lcnJvcl9jbWQgKEdzdFJUU1BTcmMgKiBzcmMsIGdpbnQgY21kKQoreworICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgQ01EX09QRU46CisgICAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBFUlJPUiwgIm9wZW4iLCAoIk9wZW4gZmFpbGVkIikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfUExBWToKKyAgICAgIEdTVF9FTEVNRU5UX1BST0dSRVNTIChzcmMsIEVSUk9SLCAicmVxdWVzdCIsICgiUExBWSBmYWlsZWQiKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9QQVVTRToKKyAgICAgIEdTVF9FTEVNRU5UX1BST0dSRVNTIChzcmMsIEVSUk9SLCAicmVxdWVzdCIsICgiUEFVU0UgZmFpbGVkIikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfQ0xPU0U6CisgICAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBFUlJPUiwgImNsb3NlIiwgKCJDbG9zZSBmYWlsZWQiKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX2xvb3BfZW5kX2NtZCAoR3N0UlRTUFNyYyAqIHNyYywgZ2ludCBjbWQsIEdzdFJUU1BSZXN1bHQgcmV0KQoreworICBpZiAocmV0ID09IEdTVF9SVFNQX09LKQorICAgIGdzdF9ydHNwc3JjX2xvb3BfY29tcGxldGVfY21kIChzcmMsIGNtZCk7CisgIGVsc2UgaWYgKHJldCA9PSBHU1RfUlRTUF9FSU5UUikKKyAgICBnc3RfcnRzcHNyY19sb29wX2NhbmNlbF9jbWQgKHNyYywgY21kKTsKKyAgZWxzZQorICAgIGdzdF9ydHNwc3JjX2xvb3BfZXJyb3JfY21kIChzcmMsIGNtZCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCAoR3N0UlRTUFNyYyAqIHNyYywgZ2ludCBjbWQsIGdpbnQgbWFzaykKK3sKKyAgZ2ludCBvbGQ7CisgIGdib29sZWFuIGZsdXNoZWQgPSBGQUxTRTsKKworICAvKiBzdGFydCBuZXcgcmVxdWVzdCAqLworICBnc3RfcnRzcHNyY19sb29wX3N0YXJ0X2NtZCAoc3JjLCBjbWQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNlbmRpbmcgY21kICVzIiwgY21kX3RvX3N0cmluZyAoY21kKSk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworICBvbGQgPSBzcmMtPnBlbmRpbmdfY21kOworICBpZiAob2xkID09IENNRF9SRUNPTk5FQ1QpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJpZ25vcmUsIHdlIHdlcmUgcmVjb25uZWN0aW5nIik7CisgICAgY21kID0gQ01EX1JFQ09OTkVDVDsKKyAgfSBlbHNlIGlmIChvbGQgPT0gQ01EX0NMT1NFKSB7CisgICAgLyogb3VyIENNRF9DTE9TRSBtaWdodCBoYXZlIGludGVycnV0cGVkIENNRF9MT09QLiBnc3RfcnRzcHNyY19sb29wCisgICAgICogd2lsbCBzZW5kIGEgQ01EX1dBSVQgd2hpY2ggd291bGQgY2FuY2VsIG91ciBwZW5kaW5nIENNRF9DTE9TRSAoaWYKKyAgICAgKiBzdGlsbCBwZW5kaW5nKS4gV2UganVzdCBhdm9pZCBpdCBoZXJlIGJ5IG1ha2luZyBzdXJlIENNRF9DTE9TRSBpcworICAgICAqIHN0aWxsIHRoZSBwZW5kaW5nIGNvbW1hbmQuICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiaWdub3JlLCB3ZSB3ZXJlIGNsb3NpbmciKTsKKyAgICBjbWQgPSBDTURfQ0xPU0U7CisgIH0gZWxzZSBpZiAob2xkICE9IENNRF9XQUlUKSB7CisgICAgc3JjLT5wZW5kaW5nX2NtZCA9IENNRF9XQUlUOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcmMpOworICAgIC8qIGNhbmNlbCBwcmV2aW91cyByZXF1ZXN0ICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY2FuY2VsIHByZXZpb3VzIHJlcXVlc3QgJXMiLCBjbWRfdG9fc3RyaW5nIChvbGQpKTsKKyAgICBnc3RfcnRzcHNyY19sb29wX2NhbmNlbF9jbWQgKHNyYywgb2xkKTsKKyAgICBHU1RfT0JKRUNUX0xPQ0sgKHNyYyk7CisgIH0KKyAgc3JjLT5wZW5kaW5nX2NtZCA9IGNtZDsKKyAgLyogaW50ZXJydXB0IGlmIGFsbG93ZWQgKi8KKyAgaWYgKHNyYy0+YnVzeV9jbWQgJiBtYXNrKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY29ubmVjdGlvbiBmbHVzaCBidXN5ICVzIiwKKyAgICAgICAgY21kX3RvX3N0cmluZyAoc3JjLT5idXN5X2NtZCkpOworICAgIGdzdF9ydHNwc3JjX2Nvbm5lY3Rpb25fZmx1c2ggKHNyYywgVFJVRSk7CisgICAgZmx1c2hlZCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAibm90IGludGVycnVwdGluZyBidXN5IGNtZCAlcyIsCisgICAgICAgIGNtZF90b19zdHJpbmcgKHNyYy0+YnVzeV9jbWQpKTsKKyAgfQorICBpZiAoc3JjLT50YXNrKQorICAgIGdzdF90YXNrX3N0YXJ0IChzcmMtPnRhc2spOworICBHU1RfT0JKRUNUX1VOTE9DSyAoc3JjKTsKKworICByZXR1cm4gZmx1c2hlZDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY19sb29wIChHc3RSVFNQU3JjICogc3JjKQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBpZiAoIXNyYy0+Y29ubmluZm8uY29ubmVjdGlvbiB8fCAhc3JjLT5jb25uaW5mby5jb25uZWN0ZWQpCisgICAgZ290byBub19jb25uZWN0aW9uOworCisgIGlmIChzcmMtPmludGVybGVhdmVkKQorICAgIHJldCA9IGdzdF9ydHNwc3JjX2xvb3BfaW50ZXJsZWF2ZWQgKHNyYyk7CisgIGVsc2UKKyAgICByZXQgPSBnc3RfcnRzcHNyY19sb29wX3VkcCAoc3JjKTsKKworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gcGF1c2U7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19jb25uZWN0aW9uOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJ3ZSBhcmUgbm90IGNvbm5lY3RlZCIpOworICAgIHJldCA9IEdTVF9GTE9XX0ZMVVNISU5HOworICAgIGdvdG8gcGF1c2U7CisgIH0KK3BhdXNlOgorICB7CisgICAgY29uc3QgZ2NoYXIgKnJlYXNvbiA9IGdzdF9mbG93X2dldF9uYW1lIChyZXQpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicGF1c2luZyB0YXNrLCByZWFzb24gJXMiLCByZWFzb24pOworICAgIHNyYy0+cnVubmluZyA9IEZBTFNFOworICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRU9TKSB7CisgICAgICAvKiBwZXJmb3JtIEVPUyBsb2dpYyAqLworICAgICAgaWYgKHNyYy0+c2VnbWVudC5mbGFncyAmIEdTVF9TRUVLX0ZMQUdfU0VHTUVOVCkgeworICAgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHNyYyksCisgICAgICAgICAgICBnc3RfbWVzc2FnZV9uZXdfc2VnbWVudF9kb25lIChHU1RfT0JKRUNUX0NBU1QgKHNyYyksCisgICAgICAgICAgICAgICAgc3JjLT5zZWdtZW50LmZvcm1hdCwgc3JjLT5zZWdtZW50LnBvc2l0aW9uKSk7CisgICAgICAgIGdzdF9ydHNwc3JjX3B1c2hfZXZlbnQgKHNyYywKKyAgICAgICAgICAgIGdzdF9ldmVudF9uZXdfc2VnbWVudF9kb25lIChzcmMtPnNlZ21lbnQuZm9ybWF0LAorICAgICAgICAgICAgICAgIHNyYy0+c2VnbWVudC5wb3NpdGlvbikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3N0X3J0c3BzcmNfcHVzaF9ldmVudCAoc3JjLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXQgPT0gR1NUX0ZMT1dfTk9UX0xJTktFRCB8fCByZXQgPCBHU1RfRkxPV19FT1MpIHsKKyAgICAgIC8qIGZvciBmYXRhbCBlcnJvcnMgd2UgcG9zdCBhbiBlcnJvciBtZXNzYWdlLCBwb3N0IHRoZSBlcnJvciBiZWZvcmUgdGhlCisgICAgICAgKiBFT1Mgc28gdGhlIGFwcCBrbm93cyBhYm91dCB0aGUgZXJyb3IgZmlyc3QuICovCisgICAgICBHU1RfRUxFTUVOVF9GTE9XX0VSUk9SIChzcmMsIHJldCk7CisgICAgICBnc3RfcnRzcHNyY19wdXNoX2V2ZW50IChzcmMsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgICB9CisgICAgZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCAoc3JjLCBDTURfV0FJVCwgQ01EX0xPT1ApOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworc3RhdGljIGNvbnN0IGdjaGFyICoKK2dzdF9ydHNwX2F1dGhfbWV0aG9kX3RvX3N0cmluZyAoR3N0UlRTUEF1dGhNZXRob2QgbWV0aG9kKQoreworICBnaW50IGluZGV4ID0gMDsKKworICB3aGlsZSAobWV0aG9kICE9IDApIHsKKyAgICBpbmRleCsrOworICAgIG1ldGhvZCA+Pj0gMTsKKyAgfQorICBzd2l0Y2ggKGluZGV4KSB7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuICJOb25lIjsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gIkJhc2ljIjsKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gIkRpZ2VzdCI7CisgIH0KKworICByZXR1cm4gIlVua25vd24iOworfQorI2VuZGlmCisKKy8qIFBhcnNlIGEgV1dXLUF1dGhlbnRpY2F0ZSBSZXNwb25zZSBoZWFkZXIgYW5kIGRldGVybWluZSB0aGUKKyAqIGF2YWlsYWJsZSBhdXRoZW50aWNhdGlvbiBtZXRob2RzCisgKgorICogVGhpcyBjb2RlIHNob3VsZCBhbHNvIGNvcGUgd2l0aCB0aGUgZmFjdCB0aGF0IGVhY2ggV1dXLUF1dGhlbnRpY2F0ZQorICogaGVhZGVyIGNhbiBjb250YWluIG11bHRpcGxlIGNoYWxsZW5nZSBtZXRob2RzICsgdG9rZW5zCisgKgorICogQXQgdGhlIG1vbWVudCwgZm9yIEJhc2ljIGF1dGgsIHdlIGp1c3QgZG8gYSBtaW5pbWFsIGNoZWNrIGFuZCBkb24ndAorICogZXZlbiBwYXJzZSBvdXQgdGhlIHJlYWxtICovCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfcGFyc2VfYXV0aF9oZHIgKEdzdFJUU1BNZXNzYWdlICogcmVzcG9uc2UsCisgICAgR3N0UlRTUEF1dGhNZXRob2QgKiBtZXRob2RzLCBHc3RSVFNQQ29ubmVjdGlvbiAqIGNvbm4sIGdib29sZWFuICogc3RhbGUpCit7CisgIEdzdFJUU1BBdXRoQ3JlZGVudGlhbCAqKmNyZWRlbnRpYWxzLCAqKmNyZWRlbnRpYWw7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAocmVzcG9uc2UgIT0gTlVMTCk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKG1ldGhvZHMgIT0gTlVMTCk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKHN0YWxlICE9IE5VTEwpOworCisgIGNyZWRlbnRpYWxzID0KKyAgICAgIGdzdF9ydHNwX21lc3NhZ2VfcGFyc2VfYXV0aF9jcmVkZW50aWFscyAocmVzcG9uc2UsCisgICAgICBHU1RfUlRTUF9IRFJfV1dXX0FVVEhFTlRJQ0FURSk7CisgIGlmICghY3JlZGVudGlhbHMpCisgICAgcmV0dXJuOworCisgIGNyZWRlbnRpYWwgPSBjcmVkZW50aWFsczsKKyAgd2hpbGUgKCpjcmVkZW50aWFsKSB7CisgICAgaWYgKCgqY3JlZGVudGlhbCktPnNjaGVtZSA9PSBHU1RfUlRTUF9BVVRIX0JBU0lDKSB7CisgICAgICAqbWV0aG9kcyB8PSBHU1RfUlRTUF9BVVRIX0JBU0lDOworICAgIH0gZWxzZSBpZiAoKCpjcmVkZW50aWFsKS0+c2NoZW1lID09IEdTVF9SVFNQX0FVVEhfRElHRVNUKSB7CisgICAgICBHc3RSVFNQQXV0aFBhcmFtICoqcGFyYW0gPSAoKmNyZWRlbnRpYWwpLT5wYXJhbXM7CisKKyAgICAgICptZXRob2RzIHw9IEdTVF9SVFNQX0FVVEhfRElHRVNUOworCisgICAgICBnc3RfcnRzcF9jb25uZWN0aW9uX2NsZWFyX2F1dGhfcGFyYW1zIChjb25uKTsKKyAgICAgICpzdGFsZSA9IEZBTFNFOworCisgICAgICB3aGlsZSAoKnBhcmFtKSB7CisgICAgICAgIGlmIChzdHJjbXAgKCgqcGFyYW0pLT5uYW1lLCAic3RhbGUiKSA9PSAwCisgICAgICAgICAgICAmJiBnX2FzY2lpX3N0cmNhc2VjbXAgKCgqcGFyYW0pLT52YWx1ZSwgIlRSVUUiKSA9PSAwKQorICAgICAgICAgICpzdGFsZSA9IFRSVUU7CisgICAgICAgIGdzdF9ydHNwX2Nvbm5lY3Rpb25fc2V0X2F1dGhfcGFyYW0gKGNvbm4sICgqcGFyYW0pLT5uYW1lLAorICAgICAgICAgICAgKCpwYXJhbSktPnZhbHVlKTsKKyAgICAgICAgcGFyYW0rKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjcmVkZW50aWFsKys7CisgIH0KKworICBnc3RfcnRzcF9hdXRoX2NyZWRlbnRpYWxzX2ZyZWUgKGNyZWRlbnRpYWxzKTsKK30KKworLyoqCisgKiBnc3RfcnRzcHNyY19zZXR1cF9hdXRoOgorICogQHNyYzogdGhlIHJ0c3Agc291cmNlCisgKgorICogQ29uZmlndXJlIGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFuZCBhdXRoIG1ldGhvZCBvbiB0aGUKKyAqIGNvbm5lY3Rpb24gb2JqZWN0IGJhc2VkIG9uIGEgcmVzcG9uc2Ugd2UgcmVjZWl2ZWQgZnJvbSB0aGUKKyAqIHBlZXIuCisgKgorICogQ3VycmVudGx5LCB0aGlzIHJlcXVpcmVzIHRoYXQgYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgd2VyZSBzdXBwbGllZAorICogaW4gdGhlIHVyaS4gSW4gdGhlIGZ1dHVyZSwgdGhleSBtYXkgYmUgcmVxdWVzdGVkIG9uIGRlbWFuZCBieSBzZW5kaW5nCisgKiBhIG1lc3NhZ2UgdXAgdGhlIGJ1cy4KKyAqCisgKiBSZXR1cm5zOiBUUlVFIGlmIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGNvdWxkIGJlIHNldCB1cCBjb3JyZWN0bHkuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfc2V0dXBfYXV0aCAoR3N0UlRTUFNyYyAqIHNyYywgR3N0UlRTUE1lc3NhZ2UgKiByZXNwb25zZSkKK3sKKyAgZ2NoYXIgKnVzZXIgPSBOVUxMOworICBnY2hhciAqcGFzcyA9IE5VTEw7CisgIEdzdFJUU1BBdXRoTWV0aG9kIGF2YWlsX21ldGhvZHMgPSBHU1RfUlRTUF9BVVRIX05PTkU7CisgIEdzdFJUU1BBdXRoTWV0aG9kIG1ldGhvZDsKKyAgR3N0UlRTUFJlc3VsdCBhdXRoX3Jlc3VsdDsKKyAgR3N0UlRTUFVybCAqdXJsOworICBHc3RSVFNQQ29ubmVjdGlvbiAqY29ubjsKKyAgZ2Jvb2xlYW4gc3RhbGUgPSBGQUxTRTsKKworICBjb25uID0gc3JjLT5jb25uaW5mby5jb25uZWN0aW9uOworCisgIC8qIElkZW50aWZ5IHRoZSBhdmFpbGFibGUgYXV0aCBtZXRob2RzIGFuZCBzZWUgaWYgYW55IGFyZSBzdXBwb3J0ZWQgKi8KKyAgZ3N0X3J0c3BzcmNfcGFyc2VfYXV0aF9oZHIgKHJlc3BvbnNlLCAmYXZhaWxfbWV0aG9kcywgY29ubiwgJnN0YWxlKTsKKworICBpZiAoYXZhaWxfbWV0aG9kcyA9PSBHU1RfUlRTUF9BVVRIX05PTkUpCisgICAgZ290byBub19hdXRoX2F2YWlsYWJsZTsKKworICAvKiBGb3IgZGlnZXN0IGF1dGgsIGlmIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgdGhhdCB0aGUgc2Vzc2lvbgorICAgKiBkYXRhIGFyZSBzdGFsZSwgd2UganVzdCB1cGRhdGUgdGhlbSBpbiB0aGUgY29ubmVjdGlvbiBvYmplY3QgYW5kCisgICAqIHJldHVybiBUUlVFIHRvIHJldHJ5IHRoZSByZXF1ZXN0ICovCisgIGlmIChzdGFsZSkKKyAgICBzcmMtPnRyaWVkX3VybF9hdXRoID0gRkFMU0U7CisKKyAgdXJsID0gZ3N0X3J0c3BfY29ubmVjdGlvbl9nZXRfdXJsIChjb25uKTsKKworICAvKiBEbyB3ZSBoYXZlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBhdmFpbGFibGU/ICovCisgIGlmICh1cmwgIT0gTlVMTCAmJiAhc3JjLT50cmllZF91cmxfYXV0aCAmJiB1cmwtPnVzZXIgIT0gTlVMTAorICAgICAgJiYgdXJsLT5wYXNzd2QgIT0gTlVMTCkgeworICAgIHVzZXIgPSB1cmwtPnVzZXI7CisgICAgcGFzcyA9IHVybC0+cGFzc3dkOworICAgIHNyYy0+dHJpZWRfdXJsX2F1dGggPSBUUlVFOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywKKyAgICAgICAgIkF0dGVtcHRpbmcgYXV0aGVudGljYXRpb24gdXNpbmcgY3JlZGVudGlhbHMgZnJvbSB0aGUgVVJMIik7CisgIH0gZWxzZSB7CisgICAgdXNlciA9IHNyYy0+dXNlcl9pZDsKKyAgICBwYXNzID0gc3JjLT51c2VyX3B3OworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywKKyAgICAgICAgIkF0dGVtcHRpbmcgYXV0aGVudGljYXRpb24gdXNpbmcgY3JlZGVudGlhbHMgZnJvbSB0aGUgcHJvcGVydGllcyIpOworICB9CisKKyAgLyogRklYTUU6IElmIHRoZSB1cmwgZGlkbid0IGNvbnRhaW4gdXNlcm5hbWUgYW5kIHBhc3N3b3JkIG9yIHdlIHRyaWVkIHRoZW0KKyAgICogYWxyZWFkeSwgcmVxdWVzdCBhIHVzZXJuYW1lIGFuZCBwYXNzd2QgZnJvbSB0aGUgYXBwbGljYXRpb24gdmlhIHNvbWUga2luZAorICAgKiBvZiBjcmVkZW50aWFscyByZXF1ZXN0IG1lc3NhZ2UgKi8KKworICAvKiBJZiB3ZSBkb24ndCBoYXZlIGEgdXNlcm5hbWUgYW5kIHBhc3N3ZCBhdCB0aGlzIHBvaW50LCBiYWlsIG91dC4gKi8KKyAgaWYgKHVzZXIgPT0gTlVMTCB8fCBwYXNzID09IE5VTEwpCisgICAgZ290byBub191c2VyX3Bhc3M7CisKKyAgLyogVHJ5IHRvIGNvbmZpZ3VyZSBmb3IgZWFjaCBhdmFpbGFibGUgYXV0aGVudGljYXRpb24gbWV0aG9kLCBzdHJvbmdlc3QgdG8KKyAgICogd2Vha2VzdCAqLworICBmb3IgKG1ldGhvZCA9IEdTVF9SVFNQX0FVVEhfTUFYOyBtZXRob2QgIT0gR1NUX1JUU1BfQVVUSF9OT05FOyBtZXRob2QgPj49IDEpIHsKKyAgICAvKiBDaGVjayBpZiB0aGlzIG1ldGhvZCBpcyBhdmFpbGFibGUgb24gdGhlIHNlcnZlciAqLworICAgIGlmICgobWV0aG9kICYgYXZhaWxfbWV0aG9kcykgPT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogUGFzcyB0aGUgY3JlZGVudGlhbHMgdG8gdGhlIGNvbm5lY3Rpb24gdG8gdHJ5IG9uIHRoZSBuZXh0IHJlcXVlc3QgKi8KKyAgICBhdXRoX3Jlc3VsdCA9IGdzdF9ydHNwX2Nvbm5lY3Rpb25fc2V0X2F1dGggKGNvbm4sIG1ldGhvZCwgdXNlciwgcGFzcyk7CisgICAgLyogSU5WQUwgaW5kaWNhdGVzIGFuIGludmFsaWQgdXNlcm5hbWUvcGFzc3dkIHdlcmUgc3VwcGxpZWQsIHNvIHdlJ2xsIGp1c3QKKyAgICAgKiBpZ25vcmUgaXQgYW5kIGVuZCB1cCByZXRyeWluZyBsYXRlciAqLworICAgIGlmIChhdXRoX3Jlc3VsdCA9PSBHU1RfUlRTUF9PSyB8fCBhdXRoX3Jlc3VsdCA9PSBHU1RfUlRTUF9FSU5WQUwpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIkF0dGVtcHRpbmcgJXMgYXV0aGVudGljYXRpb24iLAorICAgICAgICAgIGdzdF9ydHNwX2F1dGhfbWV0aG9kX3RvX3N0cmluZyAobWV0aG9kKSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAobWV0aG9kID09IEdTVF9SVFNQX0FVVEhfTk9ORSkKKyAgICBnb3RvIG5vX2F1dGhfYXZhaWxhYmxlOworCisgIHJldHVybiBUUlVFOworCitub19hdXRoX2F2YWlsYWJsZToKKyAgeworICAgIC8qIE91dHB1dCBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgd2UgY291bGRuJ3QgY29ubmVjdCBiZWNhdXNlIHRoZXJlIHdlcmUKKyAgICAgKiBubyBzdXBwb3J0ZWQgYXV0aGVudGljYXRpb24gcHJvdG9jb2xzICovCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwgKE5VTEwpLAorICAgICAgICAoIk5vIHN1cHBvcnRlZCBhdXRoZW50aWNhdGlvbiBwcm90b2NvbCB3YXMgZm91bmQiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub191c2VyX3Bhc3M6CisgIHsKKyAgICAvKiBXZSBkb24ndCBmaXJlIGFuIGVycm9yIG1lc3NhZ2UsIHdlIGp1c3QgcmV0dXJuIEZBTFNFIGFuZCBsZXQgdGhlCisgICAgICogbm9ybWFsIE5PVF9BVVRIT1JJWkVEIGVycm9yIGJlIHByb3BhZ2F0ZWQgKi8KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwX3NyY19yZWNlaXZlX3Jlc3BvbnNlIChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQQ29ubkluZm8gKiBjb25uaW5mbywKKyAgICBHc3RSVFNQTWVzc2FnZSAqIHJlc3BvbnNlLCBHc3RSVFNQU3RhdHVzQ29kZSAqIGNvZGUpCit7CisgIEdzdFJUU1BTdGF0dXNDb2RlIHRoZWNvZGU7CisgIGdjaGFyICpjb250ZW50X2Jhc2UgPSBOVUxMOworICBHc3RSVFNQUmVzdWx0IHJlcyA9IGdzdF9ydHNwc3JjX2Nvbm5lY3Rpb25fcmVjZWl2ZSAoc3JjLCBjb25uaW5mbywKKyAgICAgIHJlc3BvbnNlLCBzcmMtPnB0Y3BfdGltZW91dCk7CisKKyAgaWYgKHJlcyA8IDApCisgICAgZ290byByZWNlaXZlX2Vycm9yOworCisgIERFQlVHX1JUU1AgKHNyYywgcmVzcG9uc2UpOworCisgIHN3aXRjaCAocmVzcG9uc2UtPnR5cGUpIHsKKyAgICBjYXNlIEdTVF9SVFNQX01FU1NBR0VfUkVRVUVTVDoKKyAgICAgIHJlcyA9IGdzdF9ydHNwc3JjX2hhbmRsZV9yZXF1ZXN0IChzcmMsIGNvbm5pbmZvLCByZXNwb25zZSk7CisgICAgICBpZiAocmVzID09IEdTVF9SVFNQX0VFT0YpCisgICAgICAgIGdvdG8gc2VydmVyX2VvZjsKKyAgICAgIGVsc2UgaWYgKHJlcyA8IDApCisgICAgICAgIGdvdG8gaGFuZGxlX3JlcXVlc3RfZmFpbGVkOworCisgICAgICAvKiBOb3QgYSByZXNwb25zZSwgcmVjZWl2ZSBuZXh0IG1lc3NhZ2UgKi8KKyAgICAgIHJldHVybiBnc3RfcnRzcF9zcmNfcmVjZWl2ZV9yZXNwb25zZSAoc3JjLCBjb25uaW5mbywgcmVzcG9uc2UsIGNvZGUpOworICAgIGNhc2UgR1NUX1JUU1BfTUVTU0FHRV9SRVNQT05TRToKKyAgICAgIC8qIG9rLCBhIHJlc3BvbnNlIGlzIGdvb2QgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInJlY2VpdmVkIHJlc3BvbnNlIG1lc3NhZ2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1JUU1BfTUVTU0FHRV9EQVRBOgorICAgICAgLyogZ2V0IG5leHQgcmVzcG9uc2UgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImhhbmRsZSBkYXRhIHJlc3BvbnNlIG1lc3NhZ2UiKTsKKyAgICAgIGdzdF9ydHNwc3JjX2hhbmRsZV9kYXRhIChzcmMsIHJlc3BvbnNlKTsKKworICAgICAgLyogTm90IGEgcmVzcG9uc2UsIHJlY2VpdmUgbmV4dCBtZXNzYWdlICovCisgICAgICByZXR1cm4gZ3N0X3J0c3Bfc3JjX3JlY2VpdmVfcmVzcG9uc2UgKHNyYywgY29ubmluZm8sIHJlc3BvbnNlLCBjb2RlKTsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJpZ25vcmluZyB1bmtub3duIG1lc3NhZ2UgdHlwZSAlZCIsCisgICAgICAgICAgcmVzcG9uc2UtPnR5cGUpOworCisgICAgICAvKiBOb3QgYSByZXNwb25zZSwgcmVjZWl2ZSBuZXh0IG1lc3NhZ2UgKi8KKyAgICAgIHJldHVybiBnc3RfcnRzcF9zcmNfcmVjZWl2ZV9yZXNwb25zZSAoc3JjLCBjb25uaW5mbywgcmVzcG9uc2UsIGNvZGUpOworICB9CisKKyAgdGhlY29kZSA9IHJlc3BvbnNlLT50eXBlX2RhdGEucmVzcG9uc2UuY29kZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJnb3QgcmVzcG9uc2UgbWVzc2FnZSAlZCIsIHRoZWNvZGUpOworCisgIC8qIGlmIHRoZSBjYWxsZXIgd2FudGVkIHRoZSByZXN1bHQgY29kZSwgd2Ugc3RvcmUgaXQuICovCisgIGlmIChjb2RlKQorICAgICpjb2RlID0gdGhlY29kZTsKKworICAvKiBJZiB0aGUgcmVxdWVzdCBkaWRuJ3Qgc3VjY2VlZCwgYmFpbCBvdXQgYmVmb3JlIGRvaW5nIGFueSBtb3JlICovCisgIGlmICh0aGVjb2RlICE9IEdTVF9SVFNQX1NUU19PSykKKyAgICByZXR1cm4gR1NUX1JUU1BfT0s7CisKKyAgLyogc3RvcmUgbmV3IGNvbnRlbnQgYmFzZSBpZiBhbnkgKi8KKyAgZ3N0X3J0c3BfbWVzc2FnZV9nZXRfaGVhZGVyIChyZXNwb25zZSwgR1NUX1JUU1BfSERSX0NPTlRFTlRfQkFTRSwKKyAgICAgICZjb250ZW50X2Jhc2UsIDApOworICBpZiAoY29udGVudF9iYXNlKSB7CisgICAgZ19mcmVlIChzcmMtPmNvbnRlbnRfYmFzZSk7CisgICAgc3JjLT5jb250ZW50X2Jhc2UgPSBnX3N0cmR1cCAoY29udGVudF9iYXNlKTsKKyAgfQorCisgIHJldHVybiBHU1RfUlRTUF9PSzsKKworICAvKiBFUlJPUlMgKi8KK3JlY2VpdmVfZXJyb3I6CisgIHsKKyAgICBzd2l0Y2ggKHJlcykgeworICAgICAgY2FzZSBHU1RfUlRTUF9FRU9GOgorICAgICAgICByZXR1cm4gR1NUX1JUU1BfRUVPRjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICB7CisgICAgICAgIGdjaGFyICpzdHIgPSBnc3RfcnRzcF9zdHJyZXN1bHQgKHJlcyk7CisKKyAgICAgICAgaWYgKHJlcyAhPSBHU1RfUlRTUF9FSU5UUikgeworICAgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBSRUFELCAoTlVMTCksCisgICAgICAgICAgICAgICgiQ291bGQgbm90IHJlY2VpdmUgbWVzc2FnZS4gKCVzKSIsIHN0cikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAicmVjZWl2ZSBpbnRlcnJ1cHRlZCIpOworICAgICAgICB9CisgICAgICAgIGdfZnJlZSAoc3RyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7CisgIH0KK2hhbmRsZV9yZXF1ZXN0X2ZhaWxlZDoKKyAgeworICAgIC8qIEVSUk9SIHdhcyBwb3N0ZWQgKi8KKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0IChyZXNwb25zZSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorc2VydmVyX2VvZjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIndlIGdvdCBhbiBlb2YgZnJvbSB0aGUgc2VydmVyIik7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoc3JjLCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgICAoIlRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uLiIpKTsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0IChyZXNwb25zZSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorfQorCisKK3N0YXRpYyBHc3RSVFNQUmVzdWx0Citnc3RfcnRzcHNyY190cnlfc2VuZCAoR3N0UlRTUFNyYyAqIHNyYywgR3N0UlRTUENvbm5JbmZvICogY29ubmluZm8sCisgICAgR3N0UlRTUE1lc3NhZ2UgKiByZXF1ZXN0LCBHc3RSVFNQTWVzc2FnZSAqIHJlc3BvbnNlLAorICAgIEdzdFJUU1BTdGF0dXNDb2RlICogY29kZSkKK3sKKyAgR3N0UlRTUFJlc3VsdCByZXM7CisgIGdpbnQgdHJ5ID0gMDsKKyAgZ2Jvb2xlYW4gYWxsb3dfc2VuZCA9IFRSVUU7CisKK2FnYWluOgorICBpZiAoIXNyYy0+c2hvcnRfaGVhZGVyKQorICAgIGdzdF9ydHNwX2V4dF9saXN0X2JlZm9yZV9zZW5kIChzcmMtPmV4dGVuc2lvbnMsIHJlcXVlc3QpOworCisgIGdfc2lnbmFsX2VtaXQgKHNyYywgZ3N0X3J0c3BzcmNfc2lnbmFsc1tTSUdOQUxfQkVGT1JFX1NFTkRdLCAwLAorICAgICAgcmVxdWVzdCwgJmFsbG93X3NlbmQpOworICBpZiAoIWFsbG93X3NlbmQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJza2lwcGluZyBtZXNzYWdlLCBkaXNhYmxlZCBieSBzaWduYWwiKTsKKyAgICByZXR1cm4gR1NUX1JUU1BfT0s7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzZW5kaW5nIG1lc3NhZ2UiKTsKKworICBERUJVR19SVFNQIChzcmMsIHJlcXVlc3QpOworCisgIHJlcyA9IGdzdF9ydHNwc3JjX2Nvbm5lY3Rpb25fc2VuZCAoc3JjLCBjb25uaW5mbywgcmVxdWVzdCwgc3JjLT5wdGNwX3RpbWVvdXQpOworICBpZiAocmVzIDwgMCkKKyAgICBnb3RvIHNlbmRfZXJyb3I7CisKKyAgZ3N0X3J0c3BfY29ubmVjdGlvbl9yZXNldF90aW1lb3V0IChjb25uaW5mby0+Y29ubmVjdGlvbik7CisgIGlmICghcmVzcG9uc2UpCisgICAgcmV0dXJuIHJlczsKKworICByZXMgPSBnc3RfcnRzcF9zcmNfcmVjZWl2ZV9yZXNwb25zZSAoc3JjLCBjb25uaW5mbywgcmVzcG9uc2UsIGNvZGUpOworICBpZiAocmVzID09IEdTVF9SVFNQX0VFT0YpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgInNlcnZlciBjbG9zZWQgY29ubmVjdGlvbiIpOworICAgIC8qIG9ubHkgdHJ5IG9uY2UgYWZ0ZXIgcmVjb25uZWN0LCB0aGVuIGZhbGx0aHJvdWdoIGFuZCBlcnJvciBvdXQgKi8KKyAgICBpZiAoKHRyeSA9PSAwKSAmJiAhc3JjLT5pbnRlcmxlYXZlZCAmJiBzcmMtPnVkcF9yZWNvbm5lY3QpIHsKKyAgICAgIHRyeSsrOworICAgICAgLyogaWYgcmVjb25uZWN0IHN1Y2NlZWRzLCB0cnkgYWdhaW4gKi8KKyAgICAgIGlmICgocmVzID0gZ3N0X3J0c3BfY29ubmluZm9fcmVjb25uZWN0IChzcmMsICZzcmMtPmNvbm5pbmZvLCBGQUxTRSkpID09IDApCisgICAgICAgIGdvdG8gYWdhaW47CisgICAgfQorICB9CisgIGdzdF9ydHNwX2V4dF9saXN0X2FmdGVyX3NlbmQgKHNyYy0+ZXh0ZW5zaW9ucywgcmVxdWVzdCwgcmVzcG9uc2UpOworCisgIHJldHVybiByZXM7CisKK3NlbmRfZXJyb3I6CisgIHsKKyAgICBnY2hhciAqc3RyID0gZ3N0X3J0c3Bfc3RycmVzdWx0IChyZXMpOworCisgICAgaWYgKHJlcyAhPSBHU1RfUlRTUF9FSU5UUikgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFdSSVRFLCAoTlVMTCksCisgICAgICAgICAgKCJDb3VsZCBub3Qgc2VuZCBtZXNzYWdlLiAoJXMpIiwgc3RyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAic2VuZCBpbnRlcnJ1cHRlZCIpOworICAgIH0KKyAgICBnX2ZyZWUgKHN0cik7CisgICAgcmV0dXJuIHJlczsKKyAgfQorfQorCisvKioKKyAqIGdzdF9ydHNwc3JjX3NlbmQ6CisgKiBAc3JjOiB0aGUgcnRzcCBzb3VyY2UKKyAqIEBjb25uaW5mbzogdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gdG8gc2VuZCBvbgorICogQHJlcXVlc3Q6IG11c3QgcG9pbnQgdG8gYSB2YWxpZCByZXF1ZXN0CisgKiBAcmVzcG9uc2U6IG11c3QgcG9pbnQgdG8gYW4gZW1wdHkgI0dzdFJUU1BNZXNzYWdlCisgKiBAY29kZTogYW4gb3B0aW9uYWwgY29kZSByZXN1bHQKKyAqIEB2ZXJzaW9uczogTGlzdCBvZiB2ZXJzaW9ucyB0byB0cnksIHNldHRpbmcgaXQgYmFjayBvbnRvIHRoZSBAcmVxdWVzdCBtZXNzYWdlCisgKiAgICAgICAgICAgIGlmIG5vdCBzZXQsIGBzcmMtPnZlcnNpb25gIHdpbGwgYmUgdXNlZCBhcyBSVFNQIHZlcnNpb24uCisgKgorICogc2VuZCBAcmVxdWVzdCBhbmQgcmV0cmlldmUgdGhlIHJlc3BvbnNlIGluIEByZXNwb25zZS4gb3B0aW9uYWxseSBAY29kZSBjYW4gYmUKKyAqIG5vbi1OVUxMIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBjb250YWluIHRoZSBzdGF0dXMgY29kZSBvZiB0aGUgcmVzcG9uc2UuCisgKgorICogSWYgVGhpcyBmdW5jdGlvbiByZXR1cm5zICNHU1RfUlRTUF9PSywgQHJlc3BvbnNlIHdpbGwgY29udGFpbiBhIHZhbGlkIHJlc3BvbnNlCisgKiBtZXNzYWdlIHRoYXQgc2hvdWxkIGJlIGNsZWFuZWQgd2l0aCBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0KCkgYWZ0ZXIgdXNhZ2UuCisgKgorICogSWYgQGNvZGUgaXMgTlVMTCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAjR1NUX1JUU1BfRVJST1IgKHdpdGggYW4gaW52YWxpZAorICogQHJlc3BvbnNlIG1lc3NhZ2UpIGlmIHRoZSByZXNwb25zZSBjb2RlIHdhcyBub3QgMjAwIChPSykuCisgKgorICogSWYgdGhlIGF0dGVtcHQgcmVzdWx0cyBpbiBhbiBhdXRoZW50aWNhdGlvbiBmYWlsdXJlLCB0aGVuIHRoaXMgd2lsbCBhdHRlbXB0CisgKiB0byByZXRyaWV2ZSBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscyB2aWEgZ3N0X3J0c3BzcmNfc2V0dXBfYXV0aCBhbmQgcmV0cnkKKyAqIHRoZSByZXF1ZXN0LgorICoKKyAqIFJldHVybnM6ICNHU1RfUlRTUF9PSyBpZiB0aGUgcHJvY2Vzc2luZyB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX3NlbmQgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BDb25uSW5mbyAqIGNvbm5pbmZvLAorICAgIEdzdFJUU1BNZXNzYWdlICogcmVxdWVzdCwgR3N0UlRTUE1lc3NhZ2UgKiByZXNwb25zZSwKKyAgICBHc3RSVFNQU3RhdHVzQ29kZSAqIGNvZGUsIEdzdFJUU1BWZXJzaW9uICogdmVyc2lvbnMpCit7CisgIEdzdFJUU1BTdGF0dXNDb2RlIGludF9jb2RlID0gR1NUX1JUU1BfU1RTX09LOworICBHc3RSVFNQUmVzdWx0IHJlcyA9IEdTVF9SVFNQX0VSUk9SOworICBnaW50IGNvdW50OworICBnYm9vbGVhbiByZXRyeTsKKyAgR3N0UlRTUE1ldGhvZCBtZXRob2QgPSBHU1RfUlRTUF9JTlZBTElEOworICBnaW50IHZlcnNpb25fcmV0cnkgPSAwOworCisgIGNvdW50ID0gMDsKKyAgZG8geworICAgIHJldHJ5ID0gRkFMU0U7CisKKyAgICAvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgbG9vcCBmb3JldmVyICovCisgICAgaWYgKGNvdW50KysgPiA4KQorICAgICAgYnJlYWs7CisKKyAgICAvKiBzYXZlIG1ldGhvZCBzbyB3ZSBjYW4gZGlzYWJsZSBpdCB3aGVuIHRoZSBzZXJ2ZXIgY29tcGxhaW5zICovCisgICAgbWV0aG9kID0gcmVxdWVzdC0+dHlwZV9kYXRhLnJlcXVlc3QubWV0aG9kOworCisgICAgaWYgKCF2ZXJzaW9ucykKKyAgICAgIHJlcXVlc3QtPnR5cGVfZGF0YS5yZXF1ZXN0LnZlcnNpb24gPSBzcmMtPnZlcnNpb247CisKKyAgICBpZiAoKHJlcyA9CisgICAgICAgICAgICBnc3RfcnRzcHNyY190cnlfc2VuZCAoc3JjLCBjb25uaW5mbywgcmVxdWVzdCwgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgJmludF9jb2RlKSkgPCAwKQorICAgICAgZ290byBlcnJvcjsKKworICAgIHN3aXRjaCAoaW50X2NvZGUpIHsKKyAgICAgIGNhc2UgR1NUX1JUU1BfU1RTX1VOQVVUSE9SSVpFRDoKKyAgICAgIGNhc2UgR1NUX1JUU1BfU1RTX05PVF9GT1VORDoKKyAgICAgICAgaWYgKGdzdF9ydHNwc3JjX3NldHVwX2F1dGggKHNyYywgcmVzcG9uc2UpKSB7CisgICAgICAgICAgLyogVHJ5IHRoZSByZXF1ZXN0L3Jlc3BvbnNlIGFnYWluIGFmdGVyIGNvbmZpZ3VyaW5nIHRoZSBhdXRoIGluZm8KKyAgICAgICAgICAgKiBhbmQgbG9vcCBhZ2FpbiAqLworICAgICAgICAgIHJldHJ5ID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1JUU1BfU1RTX1JUU1BfVkVSU0lPTl9OT1RfU1VQUE9SVEVEOgorICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHNyYywgIlZlcnNpb24gJXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyIiwKKyAgICAgICAgICAgIHZlcnNpb25zID8gZ3N0X3J0c3BfdmVyc2lvbl9hc190ZXh0ICh2ZXJzaW9uc1t2ZXJzaW9uX3JldHJ5XSkgOgorICAgICAgICAgICAgInVua25vd24iKTsKKyAgICAgICAgaWYgKHZlcnNpb25zICYmIHZlcnNpb25zW3ZlcnNpb25fcmV0cnldICE9IEdTVF9SVFNQX1ZFUlNJT05fSU5WQUxJRCkgeworICAgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoc3JjLCAiVW5zdXBwb3J0ZWQgdmVyc2lvbiAlcyA9PiB0cnlpbmcgJXMiLAorICAgICAgICAgICAgICBnc3RfcnRzcF92ZXJzaW9uX2FzX3RleHQgKHJlcXVlc3QtPnR5cGVfZGF0YS5yZXF1ZXN0LnZlcnNpb24pLAorICAgICAgICAgICAgICBnc3RfcnRzcF92ZXJzaW9uX2FzX3RleHQgKHZlcnNpb25zW3ZlcnNpb25fcmV0cnldKSk7CisgICAgICAgICAgcmVxdWVzdC0+dHlwZV9kYXRhLnJlcXVlc3QudmVyc2lvbiA9IHZlcnNpb25zW3ZlcnNpb25fcmV0cnldOworICAgICAgICAgIHJldHJ5ID0gVFJVRTsKKyAgICAgICAgICB2ZXJzaW9uX3JldHJ5Kys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogZmFsbHRyb3VnaCAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IHdoaWxlIChyZXRyeSA9PSBUUlVFKTsKKworICAvKiBJZiB0aGUgdXNlciByZXF1ZXN0ZWQgdGhlIGNvZGUsIGxldCB0aGVtIGhhbmRsZSBlcnJvcnMsIG90aGVyd2lzZQorICAgKiBwb3N0IGFuIGVycm9yIGJlbG93ICovCisgIGlmIChjb2RlICE9IE5VTEwpCisgICAgKmNvZGUgPSBpbnRfY29kZTsKKyAgZWxzZSBpZiAoaW50X2NvZGUgIT0gR1NUX1JUU1BfU1RTX09LKQorICAgIGdvdG8gZXJyb3JfcmVzcG9uc2U7CisKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK2Vycm9yOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZ290IGVycm9yICVkIiwgcmVzKTsKKyAgICByZXR1cm4gcmVzOworICB9CitlcnJvcl9yZXNwb25zZToKKyAgeworICAgIHJlcyA9IEdTVF9SVFNQX0VSUk9SOworCisgICAgc3dpdGNoIChyZXNwb25zZS0+dHlwZV9kYXRhLnJlc3BvbnNlLmNvZGUpIHsKKyAgICAgIGNhc2UgR1NUX1JUU1BfU1RTX05PVF9GT1VORDoKKyAgICAgICAgUlRTUF9TUkNfUkVTUE9OU0VfRVJST1IgKHNyYywgcmVzcG9uc2UsIFJFU09VUkNFLCBOT1RfRk9VTkQsCisgICAgICAgICAgICAiTm90IGZvdW5kIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUlRTUF9TVFNfVU5BVVRIT1JJWkVEOgorICAgICAgICBSVFNQX1NSQ19SRVNQT05TRV9FUlJPUiAoc3JjLCByZXNwb25zZSwgUkVTT1VSQ0UsIE5PVF9BVVRIT1JJWkVELAorICAgICAgICAgICAgIlVuYXV0aG9yaXplZCIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1JUU1BfU1RTX01PVkVEX1BFUk1BTkVOVExZOgorICAgICAgY2FzZSBHU1RfUlRTUF9TVFNfTU9WRV9URU1QT1JBUklMWToKKyAgICAgIHsKKyAgICAgICAgZ2NoYXIgKm5ld19sb2NhdGlvbjsKKyAgICAgICAgR3N0UlRTUExvd2VyVHJhbnMgdHJhbnNwb3J0czsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJnb3QgcmVkaXJlY3Rpb24iKTsKKyAgICAgICAgLyogaWYgd2UgZG9uJ3QgaGF2ZSBhIExvY2F0aW9uIEhlYWRlciwgd2UgbXVzdCBlcnJvciAqLworICAgICAgICBpZiAoZ3N0X3J0c3BfbWVzc2FnZV9nZXRfaGVhZGVyIChyZXNwb25zZSwgR1NUX1JUU1BfSERSX0xPQ0FUSU9OLAorICAgICAgICAgICAgICAgICZuZXdfbG9jYXRpb24sIDApIDwgMCkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBXaGVuIHdlIHJlY2VpdmUgYSByZWRpcmVjdCByZXN1bHQsIHdlIGdvIGJhY2sgdG8gdGhlIElOSVQgc3RhdGUgYWZ0ZXIKKyAgICAgICAgICogcGFyc2luZyB0aGUgbmV3IFVSSS4gVGhlIGNhbGxlciBzaG91bGQgZG8gdGhlIG5lZWRlZCBzdGVwcyB0byBpc3N1ZQorICAgICAgICAgKiBhIG5ldyBzZXR1cCB3aGVuIGl0IGRldGVjdHMgdGhpcyBzdGF0ZSBjaGFuZ2UuICovCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInJlZGlyZWN0aW9uIHRvICVzIiwgbmV3X2xvY2F0aW9uKTsKKworICAgICAgICAvKiBzYXZlIGN1cnJlbnQgdHJhbnNwb3J0cyAqLworICAgICAgICBpZiAoc3JjLT5jb25uaW5mby51cmwpCisgICAgICAgICAgdHJhbnNwb3J0cyA9IHNyYy0+Y29ubmluZm8udXJsLT50cmFuc3BvcnRzOworICAgICAgICBlbHNlCisgICAgICAgICAgdHJhbnNwb3J0cyA9IEdTVF9SVFNQX0xPV0VSX1RSQU5TX1VOS05PV047CisKKyAgICAgICAgZ3N0X3J0c3BzcmNfdXJpX3NldF91cmkgKEdTVF9VUklfSEFORExFUiAoc3JjKSwgbmV3X2xvY2F0aW9uLCBOVUxMKTsKKworICAgICAgICAvKiBzZXQgb2xkIHRyYW5zcG9ydHMgKi8KKyAgICAgICAgaWYgKHNyYy0+Y29ubmluZm8udXJsICYmIHRyYW5zcG9ydHMgIT0gR1NUX1JUU1BfTE9XRVJfVFJBTlNfVU5LTk9XTikKKyAgICAgICAgICBzcmMtPmNvbm5pbmZvLnVybC0+dHJhbnNwb3J0cyA9IHRyYW5zcG9ydHM7CisKKyAgICAgICAgc3JjLT5uZWVkX3JlZGlyZWN0ID0gVFJVRTsKKyAgICAgICAgcmVzID0gR1NUX1JUU1BfT0s7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfUlRTUF9TVFNfTk9UX0FDQ0VQVEFCTEU6CisgICAgICBjYXNlIEdTVF9SVFNQX1NUU19OT1RfSU1QTEVNRU5URUQ6CisgICAgICBjYXNlIEdTVF9SVFNQX1NUU19NRVRIT0RfTk9UX0FMTE9XRUQ6CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiZ290IE5PVCBJTVBMRU1FTlRFRCwgZGlzYWJsZSBtZXRob2QgJXMiLAorICAgICAgICAgICAgZ3N0X3J0c3BfbWV0aG9kX2FzX3RleHQgKG1ldGhvZCkpOworICAgICAgICBzcmMtPm1ldGhvZHMgJj0gfm1ldGhvZDsKKyAgICAgICAgcmVzID0gR1NUX1JUU1BfT0s7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgUlRTUF9TUkNfUkVTUE9OU0VfRVJST1IgKHNyYywgcmVzcG9uc2UsIFJFU09VUkNFLCBSRUFELAorICAgICAgICAgICAgIlVuaGFuZGxlZCBlcnJvciIpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgLyogaWYgd2UgcmV0dXJuIEVSUk9SIHdlIHNob3VsZCB1bnNldCB0aGUgcmVzcG9uc2Ugb3Vyc2VsdmVzICovCisgICAgaWYgKHJlcyA9PSBHU1RfUlRTUF9FUlJPUikKKyAgICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKHJlc3BvbnNlKTsKKworICAgIHJldHVybiByZXM7CisgIH0KK30KKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX3NlbmRfY2IgKEdzdFJUU1BFeHRlbnNpb24gKiBleHQsIEdzdFJUU1BNZXNzYWdlICogcmVxdWVzdCwKKyAgICBHc3RSVFNQTWVzc2FnZSAqIHJlc3BvbnNlLCBHc3RSVFNQU3JjICogc3JjKQoreworICByZXR1cm4gZ3N0X3J0c3BzcmNfc2VuZCAoc3JjLCAmc3JjLT5jb25uaW5mbywgcmVxdWVzdCwgcmVzcG9uc2UsIE5VTEwsIE5VTEwpOworfQorCisKKy8qIHBhcnNlIHRoZSByZXNwb25zZSBhbmQgY29sbGVjdCBhbGwgdGhlIHN1cHBvcnRlZCBtZXRob2RzLiBXZSBuZWVkIHRoaXMKKyAqIGluZm9ybWF0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgdHJ5IHRvIHNlbmQgYW4gdW5zdXBwb3J0ZWQgcmVxdWVzdCB0byB0aGUKKyAqIHNlcnZlci4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY19wYXJzZV9tZXRob2RzIChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQTWVzc2FnZSAqIHJlc3BvbnNlKQoreworICBHc3RSVFNQSGVhZGVyRmllbGQgZmllbGQ7CisgIGdjaGFyICpyZXNwb3B0aW9uczsKKyAgZ2ludCBpbmR4ID0gMDsKKworICAvKiByZXNldCBzdXBwb3J0ZWQgbWV0aG9kcyAqLworICBzcmMtPm1ldGhvZHMgPSAwOworCisgIC8qIFRyeSBBbGxvdyBIZWFkZXIgZmlyc3QgKi8KKyAgZmllbGQgPSBHU1RfUlRTUF9IRFJfQUxMT1c7CisgIHdoaWxlIChUUlVFKSB7CisgICAgcmVzcG9wdGlvbnMgPSBOVUxMOworICAgIGdzdF9ydHNwX21lc3NhZ2VfZ2V0X2hlYWRlciAocmVzcG9uc2UsIGZpZWxkLCAmcmVzcG9wdGlvbnMsIGluZHgpOworICAgIGlmICghcmVzcG9wdGlvbnMpCisgICAgICBicmVhazsKKworICAgIHNyYy0+bWV0aG9kcyB8PSBnc3RfcnRzcF9vcHRpb25zX2Zyb21fdGV4dCAocmVzcG9wdGlvbnMpOworCisgICAgaW5keCsrOworICB9CisKKyAgaW5keCA9IDA7CisgIGZpZWxkID0gR1NUX1JUU1BfSERSX1BVQkxJQzsKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICByZXNwb3B0aW9ucyA9IE5VTEw7CisgICAgZ3N0X3J0c3BfbWVzc2FnZV9nZXRfaGVhZGVyIChyZXNwb25zZSwgZmllbGQsICZyZXNwb3B0aW9ucywgaW5keCk7CisgICAgaWYgKCFyZXNwb3B0aW9ucykKKyAgICAgIGJyZWFrOworCisgICAgc3JjLT5tZXRob2RzIHw9IGdzdF9ydHNwX29wdGlvbnNfZnJvbV90ZXh0IChyZXNwb3B0aW9ucyk7CisKKyAgICBpbmR4Kys7CisgIH0KKworICBpZiAoc3JjLT5tZXRob2RzID09IDApIHsKKyAgICAvKiBuZWl0aGVyIEFsbG93IG5vciBQdWJsaWMgYXJlIHJlcXVpcmVkLCBhc3N1bWUgdGhlIHNlcnZlciBzdXBwb3J0cworICAgICAqIGF0IGxlYXN0IERFU0NSSUJFLCBTRVRVUCwgd2UgYWx3YXlzIGFzc3VtZSBpdCBzdXBwb3J0cyBQTEFZIGFzCisgICAgICogd2VsbC4gKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb3VsZCBub3QgZ2V0IE9QVElPTlMiKTsKKyAgICBzcmMtPm1ldGhvZHMgPSBHU1RfUlRTUF9ERVNDUklCRSB8IEdTVF9SVFNQX1NFVFVQOworICB9CisgIC8qIGFsd2F5cyBhc3N1bWUgUExBWSwgRklYTUUsIGV4dGVuc2lvbnMgc2hvdWxkIGJlIGFibGUgdG8gb3ZlcnJpZGUKKyAgICogdGhpcyAqLworICBzcmMtPm1ldGhvZHMgfD0gR1NUX1JUU1BfUExBWTsKKyAgLyogYWxzbyBhc3N1bWUgaXQgd2lsbCBzdXBwb3J0IFJhbmdlICovCisgIHNyYy0+c2Vla2FibGUgPSBHX01BWEZMT0FUOworCisgIC8qIHdlIG5lZWQgZGVzY3JpYmUgYW5kIHNldHVwICovCisgIGlmICghKHNyYy0+bWV0aG9kcyAmIEdTVF9SVFNQX0RFU0NSSUJFKSkKKyAgICBnb3RvIG5vX2Rlc2NyaWJlOworICBpZiAoIShzcmMtPm1ldGhvZHMgJiBHU1RfUlRTUF9TRVRVUCkpCisgICAgZ290byBub19zZXR1cDsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK25vX2Rlc2NyaWJlOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwgKE5VTEwpLAorICAgICAgICAoIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IERFU0NSSUJFLiIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX3NldHVwOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwgKE5VTEwpLAorICAgICAgICAoIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IFNFVFVQLiIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogbWFza3MgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGhhcmRjb2RlZCBwcm90b2NvbCBvcmRlciBvZiBwcmVmZXJlbmNlCisgKiBpbiBjb2RlIGJlbG93ICovCitzdGF0aWMgY29uc3QgZ3VpbnQgcHJvdG9jb2xfbWFza3NbXSA9IHsKKyAgR1NUX1JUU1BfTE9XRVJfVFJBTlNfVURQLAorICBHU1RfUlRTUF9MT1dFUl9UUkFOU19VRFBfTUNBU1QsCisgIEdTVF9SVFNQX0xPV0VSX1RSQU5TX1RDUCwKKyAgMAorfTsKKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX2NyZWF0ZV90cmFuc3BvcnRzX3N0cmluZyAoR3N0UlRTUFNyYyAqIHNyYywKKyAgICBHc3RSVFNQTG93ZXJUcmFucyBwcm90b2NvbHMsIEdzdFJUU1BQcm9maWxlIHByb2ZpbGUsIGdjaGFyICoqIHRyYW5zcG9ydHMpCit7CisgIEdzdFJUU1BSZXN1bHQgcmVzOworICBHU3RyaW5nICpyZXN1bHQ7CisgIGdib29sZWFuIGFkZF91ZHBfc3RyOworCisgICp0cmFuc3BvcnRzID0gTlVMTDsKKworICByZXMgPQorICAgICAgZ3N0X3J0c3BfZXh0X2xpc3RfZ2V0X3RyYW5zcG9ydHMgKHNyYy0+ZXh0ZW5zaW9ucywgcHJvdG9jb2xzLCB0cmFuc3BvcnRzKTsKKworICBpZiAocmVzIDwgMCkKKyAgICBnb3RvIGZhaWxlZDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJnb3QgdHJhbnNwb3J0cyAlcyIsIEdTVF9TVFJfTlVMTCAoKnRyYW5zcG9ydHMpKTsKKworICAvKiBleHRlbnNpb24gbGlzdGVkIHRyYW5zcG9ydHMsIHVzZSB0aG9zZSAqLworICBpZiAoKnRyYW5zcG9ydHMgIT0gTlVMTCkKKyAgICByZXR1cm4gR1NUX1JUU1BfT0s7CisKKyAgLyogaXQncyB0aGUgZGVmYXVsdCAqLworICBhZGRfdWRwX3N0ciA9IEZBTFNFOworCisgIC8qIHRoZSBkZWZhdWx0IFJUU1AgdHJhbnNwb3J0cyAqLworICByZXN1bHQgPSBnX3N0cmluZ19uZXcgKCJSVFAiKTsKKworICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICBjYXNlIEdTVF9SVFNQX1BST0ZJTEVfQVZQOgorICAgICAgZ19zdHJpbmdfYXBwZW5kIChyZXN1bHQsICIvQVZQIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9SVFNQX1BST0ZJTEVfU0FWUDoKKyAgICAgIGdfc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiL1NBVlAiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1JUU1BfUFJPRklMRV9BVlBGOgorICAgICAgZ19zdHJpbmdfYXBwZW5kIChyZXN1bHQsICIvQVZQRiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUlRTUF9QUk9GSUxFX1NBVlBGOgorICAgICAgZ19zdHJpbmdfYXBwZW5kIChyZXN1bHQsICIvU0FWUEYiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChwcm90b2NvbHMgJiBHU1RfUlRTUF9MT1dFUl9UUkFOU19VRFApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJhZGRpbmcgVURQIHVuaWNhc3QiKTsKKyAgICBpZiAoYWRkX3VkcF9zdHIpCisgICAgICBnX3N0cmluZ19hcHBlbmQgKHJlc3VsdCwgIi9VRFAiKTsKKyAgICBnX3N0cmluZ19hcHBlbmQgKHJlc3VsdCwgIjt1bmljYXN0O2NsaWVudF9wb3J0PSUldTEtJSV1MiIpOworICB9IGVsc2UgaWYgKHByb3RvY29scyAmIEdTVF9SVFNQX0xPV0VSX1RSQU5TX1VEUF9NQ0FTVCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImFkZGluZyBVRFAgbXVsdGljYXN0Iik7CisgICAgLyogd2UgZG9uJ3QgaGF2ZSB0byBhbGxvY2F0ZSBhbnkgVURQIHBvcnRzIHlldCwgaWYgdGhlIHNlbGVjdGVkIHRyYW5zcG9ydAorICAgICAqIHR1cm5zIG91dCB0byBiZSBtdWx0aWNhc3Qgd2UgY2FuIGNyZWF0ZSB0aGVtIGFuZCBqb2luIHRoZSBtdWx0aWNhc3QKKyAgICAgKiBncm91cCBpbmRpY2F0ZWQgaW4gdGhlIHRyYW5zcG9ydCByZXBseSAqLworICAgIGlmIChhZGRfdWRwX3N0cikKKyAgICAgIGdfc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiL1VEUCIpOworICAgIGdfc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiO211bHRpY2FzdCIpOworICAgIGlmIChzcmMtPm5leHRfcG9ydF9udW0gIT0gMCkgeworICAgICAgaWYgKHNyYy0+Y2xpZW50X3BvcnRfcmFuZ2UubWF4ID4gMCAmJgorICAgICAgICAgIHNyYy0+bmV4dF9wb3J0X251bSA+PSBzcmMtPmNsaWVudF9wb3J0X3JhbmdlLm1heCkKKyAgICAgICAgZ290byBub19wb3J0czsKKworICAgICAgZ19zdHJpbmdfYXBwZW5kX3ByaW50ZiAocmVzdWx0LCAiO2NsaWVudF9wb3J0PSVkLSVkIiwKKyAgICAgICAgICBzcmMtPm5leHRfcG9ydF9udW0sIHNyYy0+bmV4dF9wb3J0X251bSArIDEpOworICAgIH0KKyAgfSBlbHNlIGlmIChwcm90b2NvbHMgJiBHU1RfUlRTUF9MT1dFUl9UUkFOU19UQ1ApIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJhZGRpbmcgVENQIik7CisKKyAgICBnX3N0cmluZ19hcHBlbmQgKHJlc3VsdCwgIi9UQ1A7dW5pY2FzdDtpbnRlcmxlYXZlZD0lJWkxLSUlaTIiKTsKKyAgfQorICAqdHJhbnNwb3J0cyA9IGdfc3RyaW5nX2ZyZWUgKHJlc3VsdCwgRkFMU0UpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInByZXBhcmVkIHRyYW5zcG9ydHMgJXMiLCBHU1RfU1RSX05VTEwgKCp0cmFuc3BvcnRzKSk7CisKKyAgcmV0dXJuIEdTVF9SVFNQX09LOworCisgIC8qIEVSUk9SUyAqLworZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SICgiZXh0ZW5zaW9uIGdhdmUgZXJyb3IgJWQiLCByZXMpOworICAgIHJldHVybiByZXM7CisgIH0KK25vX3BvcnRzOgorICB7CisgICAgR1NUX0VSUk9SICgibm8gbW9yZSBwb3J0cyBhdmFpbGFibGUiKTsKKyAgICByZXR1cm4gR1NUX1JUU1BfRVJST1I7CisgIH0KK30KKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX3ByZXBhcmVfdHJhbnNwb3J0cyAoR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwgZ2NoYXIgKiogdHJhbnNwb3J0cywKKyAgICBnaW50IG9yaWdfcnRwcG9ydCwgZ2ludCBvcmlnX3J0Y3Bwb3J0KQoreworICBHc3RSVFNQU3JjICpzcmM7CisgIGdpbnQgbnJfdWRwLCBucl9pbnQ7CisgIGdjaGFyICpuZXh0LCAqcDsKKyAgZ2ludCBydHBwb3J0ID0gMCwgcnRjcHBvcnQgPSAwOworICBHU3RyaW5nICpzdHI7CisKKyAgc3JjID0gc3RyZWFtLT5wYXJlbnQ7CisKKyAgLyogZmluZCBudW1iZXIgb2YgcGxhY2Vob2xkZXJzIGZpcnN0ICovCisgIGlmIChzdHJzdHIgKCp0cmFuc3BvcnRzLCAiJSVpMiIpKQorICAgIG5yX2ludCA9IDI7CisgIGVsc2UgaWYgKHN0cnN0ciAoKnRyYW5zcG9ydHMsICIlJWkxIikpCisgICAgbnJfaW50ID0gMTsKKyAgZWxzZQorICAgIG5yX2ludCA9IDA7CisKKyAgaWYgKHN0cnN0ciAoKnRyYW5zcG9ydHMsICIlJXUyIikpCisgICAgbnJfdWRwID0gMjsKKyAgZWxzZSBpZiAoc3Ryc3RyICgqdHJhbnNwb3J0cywgIiUldTEiKSkKKyAgICBucl91ZHAgPSAxOworICBlbHNlCisgICAgbnJfdWRwID0gMDsKKworICBpZiAobnJfdWRwID09IDAgJiYgbnJfaW50ID09IDApCisgICAgZ290byBkb25lOworCisgIGlmIChucl91ZHAgPiAwKSB7CisgICAgaWYgKCFvcmlnX3J0cHBvcnQgfHwgIW9yaWdfcnRjcHBvcnQpIHsKKyAgICAgIGlmICghZ3N0X3J0c3BzcmNfYWxsb2NfdWRwX3BvcnRzIChzdHJlYW0sICZydHBwb3J0LCAmcnRjcHBvcnQpKQorICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9IGVsc2UgeworICAgICAgcnRwcG9ydCA9IG9yaWdfcnRwcG9ydDsKKyAgICAgIHJ0Y3Bwb3J0ID0gb3JpZ19ydGNwcG9ydDsKKyAgICB9CisgIH0KKworICBzdHIgPSBnX3N0cmluZ19uZXcgKCIiKTsKKyAgcCA9ICp0cmFuc3BvcnRzOworICB3aGlsZSAoKG5leHQgPSBzdHJzdHIgKHAsICIlJSIpKSkgeworICAgIGdfc3RyaW5nX2FwcGVuZF9sZW4gKHN0ciwgcCwgbmV4dCAtIHApOworICAgIGlmIChuZXh0WzJdID09ICd1JykgeworICAgICAgaWYgKG5leHRbM10gPT0gJzEnKQorICAgICAgICBnX3N0cmluZ19hcHBlbmRfcHJpbnRmIChzdHIsICIlZCIsIHJ0cHBvcnQpOworICAgICAgZWxzZSBpZiAobmV4dFszXSA9PSAnMicpCisgICAgICAgIGdfc3RyaW5nX2FwcGVuZF9wcmludGYgKHN0ciwgIiVkIiwgcnRjcHBvcnQpOworICAgIH0KKyAgICBpZiAobmV4dFsyXSA9PSAnaScpIHsKKyAgICAgIGlmIChuZXh0WzNdID09ICcxJykKKyAgICAgICAgZ19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3RyLCAiJWQiLCBzcmMtPmZyZWVfY2hhbm5lbCk7CisgICAgICBlbHNlIGlmIChuZXh0WzNdID09ICcyJykKKyAgICAgICAgZ19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3RyLCAiJWQiLCBzcmMtPmZyZWVfY2hhbm5lbCArIDEpOworCisgICAgfQorCisgICAgcCA9IG5leHQgKyA0OworICB9CisgIGlmIChzcmMtPnZlcnNpb24gPj0gR1NUX1JUU1BfVkVSU0lPTl8yXzApCisgICAgc3JjLT5mcmVlX2NoYW5uZWwgKz0gMjsKKworICAvKiBhcHBlbmQgZmluYWwgcGFydCAqLworICBnX3N0cmluZ19hcHBlbmQgKHN0ciwgcCk7CisKKyAgZ19mcmVlICgqdHJhbnNwb3J0cyk7CisgICp0cmFuc3BvcnRzID0gZ19zdHJpbmdfZnJlZSAoc3RyLCBGQUxTRSk7CisKK2RvbmU6CisgIHJldHVybiBHU1RfUlRTUF9PSzsKKworICAvKiBFUlJPUlMgKi8KK2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBhbGxvY2F0ZSB1ZHAgcG9ydHMiKTsKKyAgICByZXR1cm4gR1NUX1JUU1BfRVJST1I7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorc2lnbmFsX2dldF9zcnRjcF9wYXJhbXMgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BTdHJlYW0gKiBzdHJlYW0pCit7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworCisgIGdfc2lnbmFsX2VtaXQgKHNyYywgZ3N0X3J0c3BzcmNfc2lnbmFsc1tTSUdOQUxfUkVRVUVTVF9SVENQX0tFWV0sIDAsCisgICAgICBzdHJlYW0tPmlkLCAmY2Fwcyk7CisKKyAgaWYgKGNhcHMgIT0gTlVMTCkKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJTUlRQIHBhcmFtZXRlcnMgcmVjZWl2ZWQiKTsKKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIEdzdENhcHMgKgorZGVmYXVsdF9zcnRjcF9wYXJhbXMgKHZvaWQpCit7CisgIGd1aW50IGk7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdEJ1ZmZlciAqYnVmOworICBndWludDggKmtleV9kYXRhOworI2RlZmluZSBLRVlfU0laRSAzMAorICBndWludCBkYXRhX3NpemUgPSBHU1RfUk9VTkRfVVBfNCAoS0VZX1NJWkUpOworCisgIC8qIGNyZWF0ZSBhIHJhbmRvbSBrZXkgKi8KKyAga2V5X2RhdGEgPSBnX21hbGxvYyAoZGF0YV9zaXplKTsKKyAgZm9yIChpID0gMDsgaSA8IGRhdGFfc2l6ZTsgaSArPSA0KQorICAgIEdTVF9XUklURV9VSU5UMzJfQkUgKGtleV9kYXRhICsgaSwgZ19yYW5kb21faW50ICgpKTsKKworICBidWYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChrZXlfZGF0YSwgS0VZX1NJWkUpOworCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXBwbGljYXRpb24veC1zcnRjcCIsCisgICAgICAic3J0cC1rZXkiLCBHU1RfVFlQRV9CVUZGRVIsIGJ1ZiwKKyAgICAgICJzcnRwLWNpcGhlciIsIEdfVFlQRV9TVFJJTkcsICJhZXMtMTI4LWljbSIsCisgICAgICAic3J0cC1hdXRoIiwgR19UWVBFX1NUUklORywgImhtYWMtc2hhMS04MCIsCisgICAgICAic3J0Y3AtY2lwaGVyIiwgR19UWVBFX1NUUklORywgImFlcy0xMjgtaWNtIiwKKyAgICAgICJzcnRjcC1hdXRoIiwgR19UWVBFX1NUUklORywgImhtYWMtc2hhMS04MCIsIE5VTEwpOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyBnY2hhciAqCitnc3RfcnRzcHNyY19zdHJlYW1fbWFrZV9rZXltZ210IChHc3RSVFNQU3JjICogc3JjLCBHc3RSVFNQU3RyZWFtICogc3RyZWFtKQoreworICBnY2hhciAqYmFzZTY0LCAqcmVzdWx0ID0gTlVMTDsKKyAgR3N0TUlLRVlNZXNzYWdlICptaWtleV9tc2c7CisKKyAgc3RyZWFtLT5zcnRjcHBhcmFtcyA9IHNpZ25hbF9nZXRfc3J0Y3BfcGFyYW1zIChzcmMsIHN0cmVhbSk7CisgIGlmIChzdHJlYW0tPnNydGNwcGFyYW1zID09IE5VTEwpCisgICAgc3RyZWFtLT5zcnRjcHBhcmFtcyA9IGRlZmF1bHRfc3J0Y3BfcGFyYW1zICgpOworCisgIG1pa2V5X21zZyA9IGdzdF9taWtleV9tZXNzYWdlX25ld19mcm9tX2NhcHMgKHN0cmVhbS0+c3J0Y3BwYXJhbXMpOworICBpZiAobWlrZXlfbXNnKSB7CisgICAgLyogYWRkIHBvbGljeSAnMCcgZm9yIG91ciBTU1JDICovCisgICAgZ3N0X21pa2V5X21lc3NhZ2VfYWRkX2NzX3NydHAgKG1pa2V5X21zZywgMCwgc3RyZWFtLT5zZW5kX3NzcmMsIDApOworCisgICAgYmFzZTY0ID0gZ3N0X21pa2V5X21lc3NhZ2VfYmFzZTY0X2VuY29kZSAobWlrZXlfbXNnKTsKKyAgICBnc3RfbWlrZXlfbWVzc2FnZV91bnJlZiAobWlrZXlfbXNnKTsKKworICAgIGlmIChiYXNlNjQpIHsKKyAgICAgIHJlc3VsdCA9IGdzdF9zZHBfbWFrZV9rZXltZ210IChzdHJlYW0tPmNvbm5pbmZvLmxvY2F0aW9uLCBiYXNlNjQpOworICAgICAgZ19mcmVlIChiYXNlNjQpOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBHc3RSVFNQUmVzdWx0Citnc3RfcnRzcF9zcmNfc2V0dXBfc3RyZWFtX2Zyb21fcmVzcG9uc2UgKEdzdFJUU1BTcmMgKiBzcmMsCisgICAgR3N0UlRTUFN0cmVhbSAqIHN0cmVhbSwgR3N0UlRTUE1lc3NhZ2UgKiByZXNwb25zZSwKKyAgICBHc3RSVFNQTG93ZXJUcmFucyAqIHByb3RvY29scywgZ2ludCByZXRyeSwgZ2ludCAqIHJ0cHBvcnQsIGdpbnQgKiBydGNwcG9ydCkKK3sKKyAgZ2NoYXIgKnJlc3B0cmFucyA9IE5VTEw7CisgIEdzdFJUU1BUcmFuc3BvcnQgdHJhbnNwb3J0ID0geyAwIH07CisKKyAgZ3N0X3J0c3BfbWVzc2FnZV9nZXRfaGVhZGVyIChyZXNwb25zZSwgR1NUX1JUU1BfSERSX1RSQU5TUE9SVCwgJnJlc3B0cmFucywgMCk7CisgIGlmICghcmVzcHRyYW5zKSB7CisgICAgZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWVfdWRwIChzdHJlYW0pOworICAgIGdvdG8gbm9fdHJhbnNwb3J0OworICB9CisKKyAgLyogcGFyc2UgdHJhbnNwb3J0LCBnbyB0byBuZXh0IHN0cmVhbSBvbiBwYXJzZSBlcnJvciAqLworICBpZiAoZ3N0X3J0c3BfdHJhbnNwb3J0X3BhcnNlIChyZXNwdHJhbnMsICZ0cmFuc3BvcnQpICE9IEdTVF9SVFNQX09LKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJmYWlsZWQgdG8gcGFyc2UgdHJhbnNwb3J0ICVzIiwgcmVzcHRyYW5zKTsKKyAgICByZXR1cm4gR1NUX1JUU1BfRUxBU1Q7CisgIH0KKworICAvKiB1cGRhdGUgYWxsb3dlZCB0cmFuc3BvcnRzIGZvciBvdGhlciBzdHJlYW1zLiBvbmNlIHRoZSB0cmFuc3BvcnQgb2YKKyAgICogb25lIHN0cmVhbSBoYXMgYmVlbiBkZXRlcm1pbmVkLCB3ZSBtYWtlIHN1cmUgdGhhdCBhbGwgb3RoZXIgc3RyZWFtcworICAgKiBhcmUgY29uZmlndXJlZCBpbiB0aGUgc2FtZSB3YXkgKi8KKyAgc3dpdGNoICh0cmFuc3BvcnQubG93ZXJfdHJhbnNwb3J0KSB7CisgICAgY2FzZSBHU1RfUlRTUF9MT1dFUl9UUkFOU19UQ1A6CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzdHJlYW0gJXAgYXMgVENQIGludGVybGVhdmVkIiwgc3RyZWFtKTsKKyAgICAgIGlmIChwcm90b2NvbHMpCisgICAgICAgICpwcm90b2NvbHMgPSBHU1RfUlRTUF9MT1dFUl9UUkFOU19UQ1A7CisgICAgICBzcmMtPmludGVybGVhdmVkID0gVFJVRTsKKyAgICAgIGlmIChzcmMtPnZlcnNpb24gPCBHU1RfUlRTUF9WRVJTSU9OXzJfMCkgeworICAgICAgICAvKiB1cGRhdGUgZnJlZSBjaGFubmVscyAqLworICAgICAgICBzcmMtPmZyZWVfY2hhbm5lbCA9IE1BWCAodHJhbnNwb3J0LmludGVybGVhdmVkLm1pbiwgc3JjLT5mcmVlX2NoYW5uZWwpOworICAgICAgICBzcmMtPmZyZWVfY2hhbm5lbCA9IE1BWCAodHJhbnNwb3J0LmludGVybGVhdmVkLm1heCwgc3JjLT5mcmVlX2NoYW5uZWwpOworICAgICAgICBzcmMtPmZyZWVfY2hhbm5lbCsrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUlRTUF9MT1dFUl9UUkFOU19VRFBfTUNBU1Q6CisgICAgICAvKiBvbmx5IGFsbG93IG11bHRpY2FzdCBmb3Igb3RoZXIgc3RyZWFtcyAqLworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic3RyZWFtICVwIGFzIFVEUCBtdWx0aWNhc3QiLCBzdHJlYW0pOworICAgICAgaWYgKHByb3RvY29scykKKyAgICAgICAgKnByb3RvY29scyA9IEdTVF9SVFNQX0xPV0VSX1RSQU5TX1VEUF9NQ0FTVDsKKyAgICAgIC8qIGlmIHRoZSBzZXJ2ZXIgc2VsZWN0ZWQgb3VyIHBvcnRzLCBpbmNyZW1lbnQgb3VyIGNvdW50ZXJzIHNvIHRoYXQKKyAgICAgICAqIHdlIHNlbGVjdCBhIG5ldyBwb3J0IGxhdGVyICovCisgICAgICBpZiAoc3JjLT5uZXh0X3BvcnRfbnVtID09IHRyYW5zcG9ydC5wb3J0Lm1pbiAmJgorICAgICAgICAgIHNyYy0+bmV4dF9wb3J0X251bSArIDEgPT0gdHJhbnNwb3J0LnBvcnQubWF4KSB7CisgICAgICAgIHNyYy0+bmV4dF9wb3J0X251bSArPSAyOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUlRTUF9MT1dFUl9UUkFOU19VRFA6CisgICAgICAvKiBvbmx5IGFsbG93IHVuaWNhc3QgZm9yIG90aGVyIHN0cmVhbXMgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN0cmVhbSAlcCBhcyBVRFAgdW5pY2FzdCIsIHN0cmVhbSk7CisgICAgICBpZiAocHJvdG9jb2xzKQorICAgICAgICAqcHJvdG9jb2xzID0gR1NUX1JUU1BfTE9XRVJfVFJBTlNfVURQOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN0cmVhbSAlcCB1bmtub3duIHRyYW5zcG9ydCAlZCIsIHN0cmVhbSwKKyAgICAgICAgICB0cmFuc3BvcnQubG93ZXJfdHJhbnNwb3J0KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKCFzcmMtPmludGVybGVhdmVkIHx8ICFyZXRyeSkgeworICAgIC8qIG5vdyBjb25maWd1cmUgdGhlIHN0cmVhbSB3aXRoIHRoZSBzZWxlY3RlZCB0cmFuc3BvcnQgKi8KKyAgICBpZiAoIWdzdF9ydHNwc3JjX3N0cmVhbV9jb25maWd1cmVfdHJhbnNwb3J0IChzdHJlYW0sICZ0cmFuc3BvcnQpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsCisgICAgICAgICAgImNvdWxkIG5vdCBjb25maWd1cmUgc3RyZWFtICVwIHRyYW5zcG9ydCwgc2tpcHBpbmcgc3RyZWFtIiwgc3RyZWFtKTsKKyAgICAgIGdvdG8gZG9uZTsKKyAgICB9IGVsc2UgaWYgKHN0cmVhbS0+dWRwc3JjWzBdICYmIHN0cmVhbS0+dWRwc3JjWzFdICYmIHJ0cHBvcnQgJiYgcnRjcHBvcnQpIHsKKyAgICAgIC8qIHJldGFpbiB0aGUgZmlyc3QgYWxsb2NhdGVkIFVEUCBwb3J0IHBhaXIgKi8KKyAgICAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKHN0cmVhbS0+dWRwc3JjWzBdKSwgInBvcnQiLCBydHBwb3J0LCBOVUxMKTsKKyAgICAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKHN0cmVhbS0+dWRwc3JjWzFdKSwgInBvcnQiLCBydGNwcG9ydCwgTlVMTCk7CisgICAgfQorICB9CisgIC8qIHdlIG5lZWQgdG8gYWN0aXZhdGUgYXQgbGVhc3Qgb25lIHN0cmVhbSB3aGVuIHdlIGRldGVjdCBhY3Rpdml0eSAqLworICBzcmMtPm5lZWRfYWN0aXZhdGUgPSBUUlVFOworCisgIC8qIHN0cmVhbSBpcyBzZXR1cCBub3cgKi8KKyAgc3RyZWFtLT5zZXR1cCA9IFRSVUU7CisgIHN0cmVhbS0+d2FpdGluZ19zZXR1cF9yZXNwb25zZSA9IEZBTFNFOworCisgIGlmIChzcmMtPnZlcnNpb24gPj0gR1NUX1JUU1BfVkVSU0lPTl8yXzApIHsKKyAgICBnY2hhciAqcHJvcCwgKm1lZGlhX3Byb3BlcnRpZXM7CisgICAgZ2NoYXIgKipwcm9wczsKKyAgICBnaW50IGk7CisKKyAgICBpZiAoZ3N0X3J0c3BfbWVzc2FnZV9nZXRfaGVhZGVyIChyZXNwb25zZSwgR1NUX1JUU1BfSERSX01FRElBX1BST1BFUlRJRVMsCisgICAgICAgICAgICAmbWVkaWFfcHJvcGVydGllcywgMCkgIT0gR1NUX1JUU1BfT0spIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBXUklURSwgKE5VTEwpLAorICAgICAgICAgICgiRXJyb3I6IE5vIE1FRElBX1BST1BFUlRZIGhlYWRlciBpbiBhIFNFVFVQIHJlcXVlc3QgaW4gUlRTUCAyLjAiCisgICAgICAgICAgICAgICIgLSB0aGlzIGhlYWRlciBpcyBtYW5kYXRvcnkuIikpOworCisgICAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0IChyZXNwb25zZSk7CisgICAgICByZXR1cm4gR1NUX1JUU1BfRVJST1I7CisgICAgfQorCisgICAgcHJvcHMgPSBnX3N0cnNwbGl0IChtZWRpYV9wcm9wZXJ0aWVzLCAiLCIsIC0yKTsKKyAgICBmb3IgKGkgPSAwOyBwcm9wc1tpXTsgaSsrKSB7CisgICAgICBwcm9wID0gcHJvcHNbaV07CisKKyAgICAgIHdoaWxlICgqcHJvcCA9PSAnICcpCisgICAgICAgIHByb3ArKzsKKworICAgICAgaWYgKHN0cnN0ciAocHJvcCwgIlJhbmRvbS1BY2Nlc3MiKSkgeworICAgICAgICBnY2hhciAqKnJhbmRvbV9zZWVrYWJsZV92YWwgPSBnX3N0cnNwbGl0IChwcm9wLCAiPSIsIDIpOworCisgICAgICAgIGlmICghcmFuZG9tX3NlZWthYmxlX3ZhbFsxXSkKKyAgICAgICAgICBzcmMtPnNlZWthYmxlID0gR19NQVhGTE9BVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNyYy0+c2Vla2FibGUgPSBnX2FzY2lpX3N0cnRvZCAocmFuZG9tX3NlZWthYmxlX3ZhbFsxXSwgTlVMTCk7CisKKyAgICAgICAgZ19zdHJmcmVldiAocmFuZG9tX3NlZWthYmxlX3ZhbCk7CisgICAgICB9IGVsc2UgaWYgKCFnX3N0cmNtcDAgKHByb3AsICJOby1TZWVraW5nIikpIHsKKyAgICAgICAgc3JjLT5zZWVrYWJsZSA9IC0xLjA7CisgICAgICB9IGVsc2UgaWYgKCFnX3N0cmNtcDAgKHByb3AsICJCZWdpbm5pbmctT25seSIpKSB7CisgICAgICAgIHNyYy0+c2Vla2FibGUgPSAwLjA7CisgICAgICB9CisgICAgfQorCisgICAgZ19zdHJmcmVldiAocHJvcHMpOworICB9CisKK2RvbmU6CisgIC8qIGNsZWFuIHVwIG91ciB0cmFuc3BvcnQgc3RydWN0ICovCisgIGdzdF9ydHNwX3RyYW5zcG9ydF9pbml0ICgmdHJhbnNwb3J0KTsKKyAgLyogY2xlYW4gdXAgdXNlZCBSVFNQIG1lc3NhZ2VzICovCisgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKHJlc3BvbnNlKTsKKworICByZXR1cm4gR1NUX1JUU1BfT0s7CisKK25vX3RyYW5zcG9ydDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoIlNlcnZlciBkaWQgbm90IHNlbGVjdCB0cmFuc3BvcnQuIikpOworCisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAocmVzcG9uc2UpOworICAgIHJldHVybiBHU1RfUlRTUF9FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BzcmNfc2V0dXBfc3RyZWFtc19lbmQgKEdzdFJUU1BTcmMgKiBzcmMsIGdib29sZWFuIGFzeW5jKQoreworICBHTGlzdCAqdG1wOworICBHc3RSVFNQQ29ubkluZm8gKmNvbm5pbmZvOworCisgIGdfYXNzZXJ0IChzcmMtPnZlcnNpb24gPj0gR1NUX1JUU1BfVkVSU0lPTl8yXzApOworCisgIGNvbm5pbmZvID0gJnNyYy0+Y29ubmluZm87CisgIGZvciAodG1wID0gc3JjLT5zdHJlYW1zOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkgeworICAgIEdzdFJUU1BTdHJlYW0gKnN0cmVhbSA9IChHc3RSVFNQU3RyZWFtICopIHRtcC0+ZGF0YTsKKyAgICBHc3RSVFNQTWVzc2FnZSByZXNwb25zZSA9IHsgMCwgfTsKKworICAgIGlmICghc3RyZWFtLT53YWl0aW5nX3NldHVwX3Jlc3BvbnNlKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoIXNyYy0+Y29ubmluZm8uY29ubmVjdGlvbikKKyAgICAgIGNvbm5pbmZvID0gJigoR3N0UlRTUFN0cmVhbSAqKSB0bXAtPmRhdGEpLT5jb25uaW5mbzsKKworICAgIGdzdF9ydHNwX3NyY19yZWNlaXZlX3Jlc3BvbnNlIChzcmMsIGNvbm5pbmZvLCAmcmVzcG9uc2UsIE5VTEwpOworCisgICAgZ3N0X3J0c3Bfc3JjX3NldHVwX3N0cmVhbV9mcm9tX3Jlc3BvbnNlIChzcmMsIHN0cmVhbSwKKyAgICAgICAgJnJlc3BvbnNlLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKyAgfQorCisgIHJldHVybiBHU1RfUlRTUF9PSzsKK30KKworLyogUGVyZm9ybSB0aGUgU0VUVVAgcmVxdWVzdCBmb3IgYWxsIHRoZSBzdHJlYW1zLgorICoKKyAqIFdlIGFzayB0aGUgc2VydmVyIGZvciBhIHNwZWNpZmljIHRyYW5zcG9ydCwgd2hpY2ggaW5pdGlhbGx5IGluY2x1ZGVzIGFsbCB0aGUKKyAqIG9uZXMgd2UgY2FuIHN1cHBvcnQgKFVEUC9UQ1AvTVVMVElDQVNUKS4gRm9yIHRoZSBVRFAgdHJhbnNwb3J0IHdlIGFsbG9jYXRlCisgKiB0d28gbG9jYWwgVURQIHBvcnRzIHRoYXQgd2Ugc2VuZCB0byB0aGUgc2VydmVyLgorICoKKyAqIE9uY2UgdGhlIHNlcnZlciByZXBsaWVkIHdpdGggYSB0cmFuc3BvcnQsIHdlIGNvbmZpZ3VyZSB0aGUgb3RoZXIgc3RyZWFtcworICogd2l0aCB0aGUgc2FtZSB0cmFuc3BvcnQuCisgKgorICogSW4gY2FzZSBzZXR1cCByZXF1ZXN0IGFyZSBub3QgcGlwZWxpbmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyBjb25maWd1cmUgdGhlCisgKiBzdHJlYW0gZm9yIHRoZSBzZWxlY3RlZCB0cmFuc3BvcnQsICogd2hpY2ggYmFzaWNhbGx5IG1lYW5zIGNyZWF0aW5nIHRoZSBwaXBlbGluZS4KKyAqIE90aGVyd2lzZSwgdGhlIGZpcnN0IHN0cmVhbSBpcyBzZXR1cCByaWdodCBhd2F5IGZyb20gdGhlIHJlcGx5IGFuZCBhCisgKiBDTURfRklOQUxJWkVfU0VUVVAgY29tbWFuZCBpcyBzZXQgZm9yIHRoZSBzdHJlYW0gcGlwZWxpbmVzIHRvIGhhcHBlbiBvbiB0aGUKKyAqIHJlbWFpbmluZyBzdHJlYW1zIGZyb20gdGhlIFJUU1AgdGhyZWFkLgorICovCitzdGF0aWMgR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BzcmNfc2V0dXBfc3RyZWFtc19zdGFydCAoR3N0UlRTUFNyYyAqIHNyYywgZ2Jvb2xlYW4gYXN5bmMpCit7CisgIEdMaXN0ICp3YWxrOworICBHc3RSVFNQUmVzdWx0IHJlcyA9IEdTVF9SVFNQX0VSUk9SOworICBHc3RSVFNQTWVzc2FnZSByZXF1ZXN0ID0geyAwIH07CisgIEdzdFJUU1BNZXNzYWdlIHJlc3BvbnNlID0geyAwIH07CisgIEdzdFJUU1BTdHJlYW0gKnN0cmVhbSA9IE5VTEw7CisgIEdzdFJUU1BMb3dlclRyYW5zIHByb3RvY29sczsKKyAgR3N0UlRTUFN0YXR1c0NvZGUgY29kZTsKKyAgZ2Jvb2xlYW4gdW5zdXBwb3J0ZWRfcmVhbCA9IEZBTFNFOworICBnaW50IHJ0cHBvcnQsIHJ0Y3Bwb3J0OworICBHc3RSVFNQVXJsICp1cmw7CisgIGdjaGFyICpodmFsOworICBnY2hhciAqcGlwZWxpbmVkX3JlcXVlc3RfaWQgPSBOVUxMOworCisgIGlmIChzcmMtPmNvbm5pbmZvLmNvbm5lY3Rpb24pIHsKKyAgICB1cmwgPSBnc3RfcnRzcF9jb25uZWN0aW9uX2dldF91cmwgKHNyYy0+Y29ubmluZm8uY29ubmVjdGlvbik7CisgICAgLyogd2UgaW5pdGlhbGx5IGFsbG93IGFsbCBjb25maWd1cmVkIGxvd2VyIHRyYW5zcG9ydHMuIGJhc2VkIG9uIHRoZSBVUkwKKyAgICAgKiB0cmFuc3BvcnRzIGFuZCB0aGUgcmVwbGllcyBmcm9tIHRoZSBzZXJ2ZXIgd2UgbmFycm93IHRoZW0gZG93bi4gKi8KKyAgICBwcm90b2NvbHMgPSB1cmwtPnRyYW5zcG9ydHMgJiBzcmMtPmN1cl9wcm90b2NvbHM7CisgIH0gZWxzZSB7CisgICAgdXJsID0gTlVMTDsKKyAgICBwcm90b2NvbHMgPSBzcmMtPmN1cl9wcm90b2NvbHM7CisgIH0KKworICBpZiAocHJvdG9jb2xzID09IDApCisgICAgZ290byBub19wcm90b2NvbHM7CisKKyAgLyogcmVzZXQgc29tZSBzdGF0ZSAqLworICBzcmMtPmZyZWVfY2hhbm5lbCA9IDA7CisgIHNyYy0+aW50ZXJsZWF2ZWQgPSBGQUxTRTsKKyAgc3JjLT5uZWVkX2FjdGl2YXRlID0gRkFMU0U7CisgIC8qIGtlZXAgdHJhY2sgb2YgbmV4dCBwb3J0IG51bWJlciwgMCBpcyByYW5kb20gKi8KKyAgc3JjLT5uZXh0X3BvcnRfbnVtID0gc3JjLT5jbGllbnRfcG9ydF9yYW5nZS5taW47CisgIHJ0cHBvcnQgPSBydGNwcG9ydCA9IDA7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHNyYy0+c3RyZWFtcyA9PSBOVUxMKSkKKyAgICBnb3RvIG5vX3N0cmVhbXM7CisKKyAgZm9yICh3YWxrID0gc3JjLT5zdHJlYW1zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUENvbm5JbmZvICpjb25uaW5mbzsKKyAgICBnY2hhciAqdHJhbnNwb3J0czsKKyAgICBnaW50IHJldHJ5ID0gMDsKKyAgICBndWludCBtYXNrID0gMDsKKyAgICBnYm9vbGVhbiBzZWxlY3RlZDsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgc3RyZWFtID0gKEdzdFJUU1BTdHJlYW0gKikgd2Fsay0+ZGF0YTsKKworICAgIGNhcHMgPSBzdHJlYW1fZ2V0X2NhcHNfZm9yX3B0IChzdHJlYW0sIHN0cmVhbS0+ZGVmYXVsdF9wdCk7CisgICAgaWYgKGNhcHMgPT0gTlVMTCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic2tpcHBpbmcgc3RyZWFtICVwLCBubyBjYXBzIiwgc3RyZWFtKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChzdHJlYW0tPnNraXBwZWQpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNraXBwaW5nIHN0cmVhbSAlcCIsIHN0cmVhbSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiBzZWUgaWYgd2UgbmVlZCB0byBjb25maWd1cmUgdGhpcyBzdHJlYW0gKi8KKyAgICBpZiAoIWdzdF9ydHNwX2V4dF9saXN0X2NvbmZpZ3VyZV9zdHJlYW0gKHNyYy0+ZXh0ZW5zaW9ucywgY2FwcykpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNraXBwaW5nIHN0cmVhbSAlcCwgZGlzYWJsZWQgYnkgZXh0ZW5zaW9uIiwKKyAgICAgICAgICBzdHJlYW0pOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgZ19zaWduYWxfZW1pdCAoc3JjLCBnc3RfcnRzcHNyY19zaWduYWxzW1NJR05BTF9TRUxFQ1RfU1RSRUFNXSwgMCwKKyAgICAgICAgc3RyZWFtLT5pZCwgY2FwcywgJnNlbGVjdGVkKTsKKyAgICBpZiAoIXNlbGVjdGVkKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJza2lwcGluZyBzdHJlYW0gJXAsIGRpc2FibGVkIGJ5IHNpZ25hbCIsIHN0cmVhbSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiBtZXJnZS9vdmVyd3JpdGUgZ2xvYmFsIGNhcHMgKi8KKyAgICBpZiAoY2FwcykgeworICAgICAgZ3VpbnQgaiwgbnVtOworICAgICAgR3N0U3RydWN0dXJlICpzOworCisgICAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgICAgIG51bSA9IGdzdF9zdHJ1Y3R1cmVfbl9maWVsZHMgKHNyYy0+cHJvcHMpOworICAgICAgZm9yIChqID0gMDsgaiA8IG51bTsgaisrKSB7CisgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lOworICAgICAgICBjb25zdCBHVmFsdWUgKnZhbDsKKworICAgICAgICBuYW1lID0gZ3N0X3N0cnVjdHVyZV9udGhfZmllbGRfbmFtZSAoc3JjLT5wcm9wcywgaik7CisgICAgICAgIHZhbCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzcmMtPnByb3BzLCBuYW1lKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKHMsIG5hbWUsIHZhbCk7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY29waWVkICVzIiwgbmFtZSk7CisgICAgICB9CisgICAgfQorCisgICAgLyogc2tpcCBzZXR1cCBpZiB3ZSBoYXZlIG5vIFVSTCBmb3IgaXQgKi8KKyAgICBpZiAoc3RyZWFtLT5jb25uaW5mby5sb2NhdGlvbiA9PSBOVUxMKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJza2lwcGluZyBzdHJlYW0gJXAsIG5vIHNldHVwIiwgc3RyZWFtKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChzcmMtPmNvbm5pbmZvLmNvbm5lY3Rpb24gPT0gTlVMTCkgeworICAgICAgaWYgKCFnc3RfcnRzcF9jb25uaW5mb19jb25uZWN0IChzcmMsICZzdHJlYW0tPmNvbm5pbmZvLCBhc3luYykpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic2tpcHBpbmcgc3RyZWFtICVwLCBmYWlsZWQgdG8gY29ubmVjdCIsIHN0cmVhbSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY29ubmluZm8gPSAmc3RyZWFtLT5jb25uaW5mbzsKKyAgICB9IGVsc2UgeworICAgICAgY29ubmluZm8gPSAmc3JjLT5jb25uaW5mbzsKKyAgICB9CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZG9pbmcgc2V0dXAgb2Ygc3RyZWFtICVwIHdpdGggJXMiLCBzdHJlYW0sCisgICAgICAgIHN0cmVhbS0+Y29ubmluZm8ubG9jYXRpb24pOworCisgICAgLyogaWYgd2UgaGF2ZSBhIG11bHRpY2FzdCBjb25uZWN0aW9uLCBvbmx5IHN1Z2dlc3QgbXVsdGljYXN0IGZyb20gbm93IG9uICovCisgICAgaWYgKHN0cmVhbS0+aXNfbXVsdGljYXN0KQorICAgICAgcHJvdG9jb2xzICY9IEdTVF9SVFNQX0xPV0VSX1RSQU5TX1VEUF9NQ0FTVDsKKworICBuZXh0X3Byb3RvY29sOgorICAgIC8qIGZpcnN0IHNlbGVjdGFibGUgcHJvdG9jb2wgKi8KKyAgICB3aGlsZSAocHJvdG9jb2xfbWFza3NbbWFza10gJiYgIShwcm90b2NvbHMgJiBwcm90b2NvbF9tYXNrc1ttYXNrXSkpCisgICAgICBtYXNrKys7CisgICAgaWYgKCFwcm90b2NvbF9tYXNrc1ttYXNrXSkKKyAgICAgIGdvdG8gbm9fcHJvdG9jb2xzOworCisgIHJldHJ5OgorICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInByb3RvY29scyA9IDB4JXgsIHByb3RvY29sIG1hc2sgPSAweCV4IiwgcHJvdG9jb2xzLAorICAgICAgICBwcm90b2NvbF9tYXNrc1ttYXNrXSk7CisgICAgLyogY3JlYXRlIGEgc3RyaW5nIHdpdGggZmlyc3QgdHJhbnNwb3J0IGluIGxpbmUgKi8KKyAgICB0cmFuc3BvcnRzID0gTlVMTDsKKyAgICByZXMgPSBnc3RfcnRzcHNyY19jcmVhdGVfdHJhbnNwb3J0c19zdHJpbmcgKHNyYywKKyAgICAgICAgcHJvdG9jb2xzICYgcHJvdG9jb2xfbWFza3NbbWFza10sIHN0cmVhbS0+cHJvZmlsZSwgJnRyYW5zcG9ydHMpOworICAgIGlmIChyZXMgPCAwIHx8IHRyYW5zcG9ydHMgPT0gTlVMTCkKKyAgICAgIGdvdG8gc2V0dXBfdHJhbnNwb3J0X2ZhaWxlZDsKKworICAgIGlmIChzdHJsZW4gKHRyYW5zcG9ydHMpID09IDApIHsKKyAgICAgIGdfZnJlZSAodHJhbnNwb3J0cyk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJubyB0cmFuc3BvcnRzIGZvdW5kIik7CisgICAgICBtYXNrKys7CisgICAgICBnb3RvIG5leHRfcHJvdG9jb2w7CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicmVwbGFjZSBwb3J0cyBpbiAlcyIsIEdTVF9TVFJfTlVMTCAodHJhbnNwb3J0cykpOworCisgICAgLyogcmVwbGFjZSBwbGFjZWhvbGRlcnMgd2l0aCByZWFsIHZhbHVlcywgdGhpcyBmdW5jdGlvbiB3aWxsIG9wdGlvbmFsbHkKKyAgICAgKiBhbGxvY2F0ZSBVRFAgcG9ydHMgYW5kIG90aGVyIGluZm8gbmVlZGVkIHRvIGV4ZWN1dGUgdGhlIHNldHVwIHJlcXVlc3QgKi8KKyAgICByZXMgPSBnc3RfcnRzcHNyY19wcmVwYXJlX3RyYW5zcG9ydHMgKHN0cmVhbSwgJnRyYW5zcG9ydHMsCisgICAgICAgIHJldHJ5ID4gMCA/IHJ0cHBvcnQgOiAwLCByZXRyeSA+IDAgPyBydGNwcG9ydCA6IDApOworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICBnX2ZyZWUgKHRyYW5zcG9ydHMpOworICAgICAgZ290byBzZXR1cF90cmFuc3BvcnRfZmFpbGVkOworICAgIH0KKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInRyYW5zcG9ydCBpcyBub3cgJXMiLCBHU1RfU1RSX05VTEwgKHRyYW5zcG9ydHMpKTsKKyAgICAvKiBjcmVhdGUgU0VUVVAgcmVxdWVzdCAqLworICAgIHJlcyA9CisgICAgICAgIGdzdF9ydHNwc3JjX2luaXRfcmVxdWVzdCAoc3JjLCAmcmVxdWVzdCwgR1NUX1JUU1BfU0VUVVAsCisgICAgICAgIHN0cmVhbS0+Y29ubmluZm8ubG9jYXRpb24pOworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICBnX2ZyZWUgKHRyYW5zcG9ydHMpOworICAgICAgZ290byBjcmVhdGVfcmVxdWVzdF9mYWlsZWQ7CisgICAgfQorCisgICAgaWYgKHNyYy0+dmVyc2lvbiA+PSBHU1RfUlRTUF9WRVJTSU9OXzJfMCkgeworICAgICAgaWYgKCFwaXBlbGluZWRfcmVxdWVzdF9pZCkKKyAgICAgICAgcGlwZWxpbmVkX3JlcXVlc3RfaWQgPSBnX3N0cmR1cF9wcmludGYgKCIlZCIsCisgICAgICAgICAgICBnX3JhbmRvbV9pbnRfcmFuZ2UgKDAsIEdfTUFYSU5UMzIpKTsKKworICAgICAgZ3N0X3J0c3BfbWVzc2FnZV9hZGRfaGVhZGVyICgmcmVxdWVzdCwgR1NUX1JUU1BfSERSX1BJUEVMSU5FRF9SRVFVRVNUUywKKyAgICAgICAgICBwaXBlbGluZWRfcmVxdWVzdF9pZCk7CisgICAgICBnc3RfcnRzcF9tZXNzYWdlX2FkZF9oZWFkZXIgKCZyZXF1ZXN0LCBHU1RfUlRTUF9IRFJfQUNDRVBUX1JBTkdFUywKKyAgICAgICAgICAibnB0LCBjbG9jaywgc21wdGUsIGNsb2NrIik7CisgICAgfQorCisgICAgLyogc2VsZWN0IHRyYW5zcG9ydCAqLworICAgIGdzdF9ydHNwX21lc3NhZ2VfdGFrZV9oZWFkZXIgKCZyZXF1ZXN0LCBHU1RfUlRTUF9IRFJfVFJBTlNQT1JULCB0cmFuc3BvcnRzKTsKKworICAgIC8qIHNldCB1cCBrZXlzICovCisgICAgaWYgKHN0cmVhbS0+cHJvZmlsZSA9PSBHU1RfUlRTUF9QUk9GSUxFX1NBVlAgfHwKKyAgICAgICAgc3RyZWFtLT5wcm9maWxlID09IEdTVF9SVFNQX1BST0ZJTEVfU0FWUEYpIHsKKyAgICAgIGh2YWwgPSBnc3RfcnRzcHNyY19zdHJlYW1fbWFrZV9rZXltZ210IChzcmMsIHN0cmVhbSk7CisgICAgICBnc3RfcnRzcF9tZXNzYWdlX3Rha2VfaGVhZGVyICgmcmVxdWVzdCwgR1NUX1JUU1BfSERSX0tFWU1HTVQsIGh2YWwpOworICAgIH0KKworICAgIC8qIGlmIHRoZSB1c2VyIHdhbnRzIGEgbm9uIGRlZmF1bHQgUlRQIHBhY2tldCBzaXplIHdlIGFkZCB0aGUgYmxvY2tzaXplCisgICAgICogcGFyYW1ldGVyICovCisgICAgaWYgKHNyYy0+cnRwX2Jsb2Nrc2l6ZSA+IDApIHsKKyAgICAgIGh2YWwgPSBnX3N0cmR1cF9wcmludGYgKCIlZCIsIHNyYy0+cnRwX2Jsb2Nrc2l6ZSk7CisgICAgICBnc3RfcnRzcF9tZXNzYWdlX3Rha2VfaGVhZGVyICgmcmVxdWVzdCwgR1NUX1JUU1BfSERSX0JMT0NLU0laRSwgaHZhbCk7CisgICAgfQorCisgICAgaWYgKGFzeW5jKQorICAgICAgR1NUX0VMRU1FTlRfUFJPR1JFU1MgKHNyYywgQ09OVElOVUUsICJyZXF1ZXN0IiwgKCJTRVRVUCBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICBzdHJlYW0tPmlkKSk7CisKKyAgICAvKiBoYW5kbGUgdGhlIGNvZGUgb3Vyc2VsdmVzICovCisgICAgcmVzID0KKyAgICAgICAgZ3N0X3J0c3BzcmNfc2VuZCAoc3JjLCBjb25uaW5mbywgJnJlcXVlc3QsCisgICAgICAgIHBpcGVsaW5lZF9yZXF1ZXN0X2lkID8gTlVMTCA6ICZyZXNwb25zZSwgJmNvZGUsIE5VTEwpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgZ290byBzZW5kX2Vycm9yOworCisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICBjYXNlIEdTVF9SVFNQX1NUU19PSzoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9SVFNQX1NUU19VTlNVUFBPUlRFRF9UUkFOU1BPUlQ6CisgICAgICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXF1ZXN0KTsKKyAgICAgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJnJlc3BvbnNlKTsKKyAgICAgICAgLyogY2xlYW51cCBvZiBsZWZ0b3ZlciB0cmFuc3BvcnQgKi8KKyAgICAgICAgZ3N0X3J0c3BzcmNfc3RyZWFtX2ZyZWVfdWRwIChzdHJlYW0pOworICAgICAgICAvKiBNUyBXTVNlcnZlciBSVFNQIE1VU1QgdXNlIHNhbWUgVURQIHBhaXIgaW4gYWxsIFNFVFVQIHJlcXVlc3RzOworICAgICAgICAgKiB3ZSBtaWdodCBiZSBpbiB0aGlzIGNhc2UgKi8KKyAgICAgICAgaWYgKHN0cmVhbS0+Y29udGFpbmVyICYmIHJ0cHBvcnQgJiYgcnRjcHBvcnQgJiYgIXJldHJ5KSB7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicmV0cnlpbmcgd2l0aCBvcmlnaW5hbCBwb3J0IHBhaXIgJXUtJXUiLAorICAgICAgICAgICAgICBydHBwb3J0LCBydGNwcG9ydCk7CisgICAgICAgICAgcmV0cnkrKzsKKyAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICB9CisgICAgICAgIC8qIHRoaXMgdHJhbnNwb3J0IGRpZCBub3QgZ28gZG93biB3ZWxsLCBidXQgd2UgbWF5IGhhdmUgb3RoZXJzIHRvIHRyeQorICAgICAgICAgKiB0aGF0IHdlIGRpZCBub3Qgc2VuZCB5ZXQsIHRyeSB0aG9zZSBhbmQgb25seSBnaXZlIHVwIHRoZW4KKyAgICAgICAgICogYnV0IG5vdCB3aXRob3V0IGNoZWNraW5nIGZvciBsb3N0IGNhdXNlL2V4dGVuc2lvbiBzbyB3ZSBjYW4KKyAgICAgICAgICogcG9zdCBhIG5pY2VyL21vcmUgdXNlZnVsIGVycm9yIG1lc3NhZ2UgbGF0ZXIgKi8KKyAgICAgICAgaWYgKCF1bnN1cHBvcnRlZF9yZWFsKQorICAgICAgICAgIHVuc3VwcG9ydGVkX3JlYWwgPSBzdHJlYW0tPmlzX3JlYWw7CisgICAgICAgIC8qIHNlbGVjdCBuZXh0IGF2YWlsYWJsZSBwcm90b2NvbCwgZ2l2ZSB1cCBvbiB0aGlzIHN0cmVhbSBpZiBub25lICovCisgICAgICAgIG1hc2srKzsKKyAgICAgICAgd2hpbGUgKHByb3RvY29sX21hc2tzW21hc2tdICYmICEocHJvdG9jb2xzICYgcHJvdG9jb2xfbWFza3NbbWFza10pKQorICAgICAgICAgIG1hc2srKzsKKyAgICAgICAgaWYgKCFwcm90b2NvbF9tYXNrc1ttYXNrXSB8fCB1bnN1cHBvcnRlZF9yZWFsKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBlbHNlCisgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIGNsZWFudXAgb2YgbGVmdG92ZXIgdHJhbnNwb3J0IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IHN0cmVhbSAqLworICAgICAgICBnc3RfcnRzcHNyY19zdHJlYW1fZnJlZV91ZHAgKHN0cmVhbSk7CisgICAgICAgIGdvdG8gcmVzcG9uc2VfZXJyb3I7CisgICAgfQorCisKKyAgICBpZiAoIXBpcGVsaW5lZF9yZXF1ZXN0X2lkKSB7CisgICAgICAvKiBwYXJzZSByZXNwb25zZSB0cmFuc3BvcnQgKi8KKyAgICAgIHJlcyA9IGdzdF9ydHNwX3NyY19zZXR1cF9zdHJlYW1fZnJvbV9yZXNwb25zZSAoc3JjLCBzdHJlYW0sCisgICAgICAgICAgJnJlc3BvbnNlLCAmcHJvdG9jb2xzLCByZXRyeSwgJnJ0cHBvcnQsICZydGNwcG9ydCk7CisgICAgICBzd2l0Y2ggKHJlcykgeworICAgICAgICBjYXNlIEdTVF9SVFNQX0VSUk9SOgorICAgICAgICAgIGdvdG8gY2xlYW51cF9lcnJvcjsKKyAgICAgICAgY2FzZSBHU1RfUlRTUF9FTEFTVDoKKyAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzdHJlYW0tPndhaXRpbmdfc2V0dXBfcmVzcG9uc2UgPSBUUlVFOworICAgICAgLyogd2UgbmVlZCB0byBhY3RpdmF0ZSBhdCBsZWFzdCBvbmUgc3RyZWFtIHdoZW4gd2UgZGV0ZWN0IGFjdGl2aXR5ICovCisgICAgICBzcmMtPm5lZWRfYWN0aXZhdGUgPSBUUlVFOworICAgIH0KKworICAgIHsKKyAgICAgIEdMaXN0ICpza2lwID0gd2FsazsKKworICAgICAgd2hpbGUgKFRSVUUpIHsKKyAgICAgICAgR3N0UlRTUFN0cmVhbSAqc3NraXA7CisKKyAgICAgICAgc2tpcCA9IGdfbGlzdF9uZXh0IChza2lwKTsKKyAgICAgICAgaWYgKHNraXAgPT0gTlVMTCkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBzc2tpcCA9IChHc3RSVFNQU3RyZWFtICopIHNraXAtPmRhdGE7CisKKyAgICAgICAgLyogc2tpcCBhbGwgc3RyZWFtcyB3aXRoIHRoZSBzYW1lIGNvbnRyb2wgdXJsICovCisgICAgICAgIGlmIChnX3N0cl9lcXVhbCAoc3RyZWFtLT5jb25uaW5mby5sb2NhdGlvbiwgc3NraXAtPmNvbm5pbmZvLmxvY2F0aW9uKSkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImZvdW5kIHN0cmVhbSAlcCB3aXRoIHNhbWUgY29udHJvbCAlcyIsCisgICAgICAgICAgICAgIHNza2lwLCBzc2tpcC0+Y29ubmluZm8ubG9jYXRpb24pOworICAgICAgICAgIHNza2lwLT5za2lwcGVkID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVxdWVzdCk7CisgIH0KKworICBpZiAocGlwZWxpbmVkX3JlcXVlc3RfaWQpIHsKKyAgICBnc3RfcnRzcHNyY19zZXR1cF9zdHJlYW1zX2VuZCAoc3JjLCBUUlVFKTsKKyAgfQorCisgIC8qIHN0b3JlIHRoZSB0cmFuc3BvcnQgcHJvdG9jb2wgdGhhdCB3YXMgY29uZmlndXJlZCAqLworICBzcmMtPmN1cl9wcm90b2NvbHMgPSBwcm90b2NvbHM7CisKKyAgZ3N0X3J0c3BfZXh0X2xpc3Rfc3RyZWFtX3NlbGVjdCAoc3JjLT5leHRlbnNpb25zLCB1cmwpOworCisgIGlmIChwaXBlbGluZWRfcmVxdWVzdF9pZCkKKyAgICBnX2ZyZWUgKHBpcGVsaW5lZF9yZXF1ZXN0X2lkKTsKKworICAvKiBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGFjdGl2YXRlLCBlcnJvciBvdXQgKi8KKyAgaWYgKCFzcmMtPm5lZWRfYWN0aXZhdGUpCisgICAgZ290byBub3RoaW5nX3RvX2FjdGl2YXRlOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitub19wcm90b2NvbHM6CisgIHsKKyAgICAvKiBubyB0cmFuc3BvcnQgcG9zc2libGUsIHBvc3QgYW4gZXJyb3IgYW5kIHN0b3AgKi8KKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciwgbm8gcHJvdG9jb2xzIGxlZnQiKSk7CisgICAgcmV0dXJuIEdTVF9SVFNQX0VSUk9SOworICB9Citub19zdHJlYW1zOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiU0RQIGNvbnRhaW5zIG5vIHN0cmVhbXMiKSk7CisgICAgcmV0dXJuIEdTVF9SVFNQX0VSUk9SOworICB9CitjcmVhdGVfcmVxdWVzdF9mYWlsZWQ6CisgIHsKKyAgICBnY2hhciAqc3RyID0gZ3N0X3J0c3Bfc3RycmVzdWx0IChyZXMpOworCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgTElCUkFSWSwgSU5JVCwgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgcmVxdWVzdC4gKCVzKSIsIHN0cikpOworICAgIGdfZnJlZSAoc3RyKTsKKyAgICBnb3RvIGNsZWFudXBfZXJyb3I7CisgIH0KK3NldHVwX3RyYW5zcG9ydF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJDb3VsZCBub3Qgc2V0dXAgdHJhbnNwb3J0LiIpKTsKKyAgICByZXMgPSBHU1RfUlRTUF9FUlJPUjsKKyAgICBnb3RvIGNsZWFudXBfZXJyb3I7CisgIH0KK3Jlc3BvbnNlX2Vycm9yOgorICB7CisgICAgY29uc3QgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0YXR1c19hc190ZXh0IChjb2RlKTsKKworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBXUklURSwgKE5VTEwpLAorICAgICAgICAoIkVycm9yICglZCk6ICVzIiwgY29kZSwgR1NUX1NUUl9OVUxMIChzdHIpKSk7CisgICAgcmVzID0gR1NUX1JUU1BfRVJST1I7CisgICAgZ290byBjbGVhbnVwX2Vycm9yOworICB9CitzZW5kX2Vycm9yOgorICB7CisgICAgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0cnJlc3VsdCAocmVzKTsKKworICAgIGlmIChyZXMgIT0gR1NUX1JUU1BfRUlOVFIpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBXUklURSwgKE5VTEwpLAorICAgICAgICAgICgiQ291bGQgbm90IHNlbmQgbWVzc2FnZS4gKCVzKSIsIHN0cikpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgInNlbmQgaW50ZXJydXB0ZWQiKTsKKyAgICB9CisgICAgZ19mcmVlIChzdHIpOworICAgIGdvdG8gY2xlYW51cF9lcnJvcjsKKyAgfQorbm90aGluZ190b19hY3RpdmF0ZToKKyAgeworICAgIC8qIG5vbmUgb2YgdGhlIGF2YWlsYWJsZSBlcnJvciBjb2RlcyBpcyByZWFsbHkgcmlnaHQgLi4gKi8KKyAgICBpZiAodW5zdXBwb3J0ZWRfcmVhbCkgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgU1RSRUFNLCBDT0RFQ19OT1RfRk9VTkQsCisgICAgICAgICAgKF8oIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgIgorICAgICAgICAgICAgICAgICAgIkdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iKSksCisgICAgICAgICAgKE5VTEwpKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgU1RSRUFNLCBDT0RFQ19OT1RfRk9VTkQsCisgICAgICAgICAgKF8oIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyAiCisgICAgICAgICAgICAgICAgICAibW9yZSB0cmFuc3BvcnQgcHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyAiCisgICAgICAgICAgICAgICAgICAidGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiBwbHVnaW4uIikpLCAoTlVMTCkpOworICAgIH0KKyAgICByZXR1cm4gR1NUX1JUU1BfRVJST1I7CisgIH0KK2NsZWFudXBfZXJyb3I6CisgIHsKKyAgICBpZiAocGlwZWxpbmVkX3JlcXVlc3RfaWQpCisgICAgICBnX2ZyZWUgKHBpcGVsaW5lZF9yZXF1ZXN0X2lkKTsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVxdWVzdCk7CisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJnJlc3BvbnNlKTsKKyAgICByZXR1cm4gcmVzOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfcGFyc2VfcmFuZ2UgKEdzdFJUU1BTcmMgKiBzcmMsIGNvbnN0IGdjaGFyICogcmFuZ2UsCisgICAgR3N0U2VnbWVudCAqIHNlZ21lbnQpCit7CisgIGdpbnQ2NCBzZWNvbmRzOworICBHc3RSVFNQVGltZVJhbmdlICp0aGVyYW5nZTsKKworICBpZiAoc3JjLT5yYW5nZSkKKyAgICBnc3RfcnRzcF9yYW5nZV9mcmVlIChzcmMtPnJhbmdlKTsKKworICBpZiAoZ3N0X3J0c3BfcmFuZ2VfcGFyc2UgKHJhbmdlLCAmdGhlcmFuZ2UpID09IEdTVF9SVFNQX09LKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicGFyc2VkIHJhbmdlICVzIiwgcmFuZ2UpOworICAgIHNyYy0+cmFuZ2UgPSB0aGVyYW5nZTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJmYWlsZWQgdG8gcGFyc2UgcmFuZ2UgJXMiLCByYW5nZSk7CisgICAgc3JjLT5yYW5nZSA9IE5VTEw7CisgICAgZ3N0X3NlZ21lbnRfaW5pdCAoc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJyYW5nZTogdHlwZSAlZCwgbWluICVmIC0gdHlwZSAlZCwgIG1heCAlZiAiLAorICAgICAgdGhlcmFuZ2UtPm1pbi50eXBlLCB0aGVyYW5nZS0+bWluLnNlY29uZHMsIHRoZXJhbmdlLT5tYXgudHlwZSwKKyAgICAgIHRoZXJhbmdlLT5tYXguc2Vjb25kcyk7CisKKyAgaWYgKHRoZXJhbmdlLT5taW4udHlwZSA9PSBHU1RfUlRTUF9USU1FX05PVykKKyAgICBzZWNvbmRzID0gMDsKKyAgZWxzZSBpZiAodGhlcmFuZ2UtPm1pbi50eXBlID09IEdTVF9SVFNQX1RJTUVfRU5EKQorICAgIHNlY29uZHMgPSAwOworICBlbHNlCisgICAgc2Vjb25kcyA9IHRoZXJhbmdlLT5taW4uc2Vjb25kcyAqIEdTVF9TRUNPTkQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicmFuZ2U6IG1pbiAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChzZWNvbmRzKSk7CisKKyAgLyogd2UgbmVlZCB0byBzdGFydCBwbGF5YmFjayB3aXRob3V0IGNsaXBwaW5nIGZyb20gdGhlIHBvc2l0aW9uIHJlcG9ydGVkIGJ5CisgICAqIHRoZSBzZXJ2ZXIgKi8KKyAgc2VnbWVudC0+c3RhcnQgPSBzZWNvbmRzOworICBzZWdtZW50LT5wb3NpdGlvbiA9IHNlY29uZHM7CisKKyAgaWYgKHRoZXJhbmdlLT5tYXgudHlwZSA9PSBHU1RfUlRTUF9USU1FX05PVykKKyAgICBzZWNvbmRzID0gLTE7CisgIGVsc2UgaWYgKHRoZXJhbmdlLT5tYXgudHlwZSA9PSBHU1RfUlRTUF9USU1FX0VORCkKKyAgICBzZWNvbmRzID0gLTE7CisgIGVsc2UKKyAgICBzZWNvbmRzID0gdGhlcmFuZ2UtPm1heC5zZWNvbmRzICogR1NUX1NFQ09ORDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJyYW5nZTogbWF4ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHNlY29uZHMpKTsKKworICAvKiBsaXZlIChXTVMpIHNlcnZlciBtaWdodCBzZW5kIG92ZXJmbG93ZWQgbGFyZ2UgbWF4IGFzIGl0cyBpZGVhIG9mIGluZmluaXR5LAorICAgKiBjb21wZW5zYXRlIHRvIHByZXZlbnQgcHJvYmxlbXMgbGF0ZXIgb24gKi8KKyAgaWYgKHNlY29uZHMgIT0gLTEgJiYgc2Vjb25kcyA8IDApIHsKKyAgICBzZWNvbmRzID0gLTE7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiaW5zYW5lIHJhbmdlLCBzZXQgdG8gTk9ORSIpOworICB9CisKKyAgLyogbGl2ZSAoV01TKSBtaWdodCBzZW5kIG1pbiA9PSBtYXgsIHdoaWNoIGlzIG5vdCB3b3J0aCByZWNvcmRpbmcgKi8KKyAgaWYgKHNlZ21lbnQtPmR1cmF0aW9uID09IC0xICYmIHNlY29uZHMgPT0gc2VnbWVudC0+c3RhcnQpCisgICAgc2Vjb25kcyA9IC0xOworCisgIC8qIGRvbid0IGNoYW5nZSBkdXJhdGlvbiB3aXRoIHVua25vd24gdmFsdWUsIHdlIG1pZ2h0IGhhdmUgYSB2YWxpZCB2YWx1ZQorICAgKiB0aGVyZSB0aGF0IHdlIHdhbnQgdG8ga2VlcC4gKi8KKyAgaWYgKHNlY29uZHMgIT0gLTEpCisgICAgc2VnbWVudC0+ZHVyYXRpb24gPSBzZWNvbmRzOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBQYXJzZSBjbG9jayBwcm9maXZlZCBieSB0aGUgc2VydmVyIHdpdGggZm9sbG93aW5nIHN5bnRheDoKKyAqCisgKiAiR3N0TmV0VGltZVByb3ZpZGVyIDx3cmFwcGVkLWNsb2NrPiA8c2VydmVyLUlQOnBvcnQ+IDxjbG9jay10aW1lPiIKKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY19wYXJzZV9nc3RfY2xvY2sgKEdzdFJUU1BTcmMgKiBzcmMsIGNvbnN0IGdjaGFyICogZ3N0Y2xvY2spCit7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIGlmIChnX3N0cl9oYXNfcHJlZml4IChnc3RjbG9jaywgIkdzdE5ldFRpbWVQcm92aWRlciAiKSkgeworICAgIGdjaGFyICoqZmllbGRzID0gTlVMTCwgKipwYXJ0cyA9IE5VTEw7CisgICAgZ2NoYXIgKnJlbW90ZV9pcCwgKnN0cjsKKyAgICBnaW50IHBvcnQ7CisgICAgR3N0Q2xvY2tUaW1lIGJhc2VfdGltZTsKKyAgICBHc3RDbG9jayAqbmV0Y2xvY2s7CisKKyAgICBmaWVsZHMgPSBnX3N0cnNwbGl0IChnc3RjbG9jaywgIiAiLCAwKTsKKworICAgIC8qIHdyYXBwZWQgY2xvY2ssIG5vdCB2ZXJ5IGludGVyZXN0aW5nIGZvciBub3cgKi8KKyAgICBpZiAoZmllbGRzWzFdID09IE5VTEwpCisgICAgICBnb3RvIGNsZWFudXA7CisKKyAgICAvKiByZW1vdGUgSVAgYWRkcmVzcyBhbmQgcG9ydCAqLworICAgIGlmICgoc3RyID0gZmllbGRzWzJdKSA9PSBOVUxMKQorICAgICAgZ290byBjbGVhbnVwOworCisgICAgcGFydHMgPSBnX3N0cnNwbGl0IChzdHIsICI6IiwgMCk7CisKKyAgICBpZiAoKHJlbW90ZV9pcCA9IHBhcnRzWzBdKSA9PSBOVUxMKQorICAgICAgZ290byBjbGVhbnVwOworCisgICAgaWYgKChzdHIgPSBwYXJ0c1sxXSkgPT0gTlVMTCkKKyAgICAgIGdvdG8gY2xlYW51cDsKKworICAgIHBvcnQgPSBhdG9pIChzdHIpOworICAgIGlmIChwb3J0ID09IDApCisgICAgICBnb3RvIGNsZWFudXA7CisKKyAgICAvKiBiYXNlLXRpbWUgKi8KKyAgICBpZiAoKHN0ciA9IGZpZWxkc1szXSkgPT0gTlVMTCkKKyAgICAgIGdvdG8gY2xlYW51cDsKKworICAgIGJhc2VfdGltZSA9IGdfYXNjaWlfc3RydG91bGwgKHN0ciwgTlVMTCwgMTApOworCisgICAgbmV0Y2xvY2sgPQorICAgICAgICBnc3RfbmV0X2NsaWVudF9jbG9ja19uZXcgKChnY2hhciAqKSAiR3N0UlRTUENsb2NrIiwgcmVtb3RlX2lwLCBwb3J0LAorICAgICAgICBiYXNlX3RpbWUpOworCisgICAgaWYgKHNyYy0+cHJvdmlkZWRfY2xvY2spCisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChzcmMtPnByb3ZpZGVkX2Nsb2NrKTsKKyAgICBzcmMtPnByb3ZpZGVkX2Nsb2NrID0gbmV0Y2xvY2s7CisKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHNyYyksCisgICAgICAgIGdzdF9tZXNzYWdlX25ld19jbG9ja19wcm92aWRlIChHU1RfT0JKRUNUX0NBU1QgKHNyYyksCisgICAgICAgICAgICBzcmMtPnByb3ZpZGVkX2Nsb2NrLCBUUlVFKSk7CisKKyAgICByZXMgPSBUUlVFOworICBjbGVhbnVwOgorICAgIGdfc3RyZnJlZXYgKGZpZWxkcyk7CisgICAgZ19zdHJmcmVldiAocGFydHMpOworICB9CisgIHJldHVybiByZXM7Cit9CisKKy8qIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIFJUU1Agc3RhdGUgbG9jayAqLworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX29wZW5fZnJvbV9zZHAgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFNEUE1lc3NhZ2UgKiBzZHAsCisgICAgZ2Jvb2xlYW4gYXN5bmMpCit7CisgIEdzdFJUU1BSZXN1bHQgcmVzOworICBnaW50IGksIG5fc3RyZWFtczsKKworICAvKiBwcmVwYXJlIGdsb2JhbCBzdHJlYW0gY2FwcyBwcm9wZXJ0aWVzICovCisgIGlmIChzcmMtPnByb3BzKQorICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2FsbF9maWVsZHMgKHNyYy0+cHJvcHMpOworICBlbHNlCisgICAgc3JjLT5wcm9wcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgiUlRTUFByb3BlcnRpZXMiKTsKKworICBERUJVR19TRFAgKHNyYywgc2RwKTsKKworICBnc3RfcnRzcF9leHRfbGlzdF9wYXJzZV9zZHAgKHNyYy0+ZXh0ZW5zaW9ucywgc2RwLCBzcmMtPnByb3BzKTsKKworICAvKiBsZXQgdGhlIGFwcCBpbnNwZWN0IGFuZCBjaGFuZ2UgdGhlIFNEUCAqLworICBnX3NpZ25hbF9lbWl0IChzcmMsIGdzdF9ydHNwc3JjX3NpZ25hbHNbU0lHTkFMX09OX1NEUF0sIDAsIHNkcCk7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNyYy0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKworICAvKiBwYXJzZSByYW5nZSBmb3IgZHVyYXRpb24gcmVwb3J0aW5nLiAqLworICB7CisgICAgY29uc3QgZ2NoYXIgKnJhbmdlOworCisgICAgZm9yIChpID0gMDs7IGkrKykgeworICAgICAgcmFuZ2UgPSBnc3Rfc2RwX21lc3NhZ2VfZ2V0X2F0dHJpYnV0ZV92YWxfbiAoc2RwLCAicmFuZ2UiLCBpKTsKKyAgICAgIGlmIChyYW5nZSA9PSBOVUxMKQorICAgICAgICBicmVhazsKKworICAgICAgLyoga2VlcCB0cmFjayBvZiB0aGUgcmFuZ2UgYW5kIGNvbmZpZ3VyZSBpdCBpbiB0aGUgc2VnbWVudCAqLworICAgICAgaWYgKGdzdF9ydHNwc3JjX3BhcnNlX3JhbmdlIChzcmMsIHJhbmdlLCAmc3JjLT5zZWdtZW50KSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIC8qIHBhcnNlIGNsb2NrIGluZm9ybWF0aW9uLiBUaGlzIGlzIEdTdHJlYW1lciBzcGVjaWZpYywgYSBzZXJ2ZXIgY2FuIHRlbGwgdGhlCisgICAqIGNsaWVudCB3aGF0IGNsb2NrIGl0IGlzIHVzaW5nIGFuZCB3cmFwIHRoYXQgaW4gYSBuZXR3b3JrIGNsb2NrLiBUaGUKKyAgICogYWR2YW50YWdlIG9mIHRoYXQgaXMgdGhhdCB3ZSBjYW4gc2xhdmUgdG8gaXQuICovCisgIHsKKyAgICBjb25zdCBnY2hhciAqZ3N0Y2xvY2s7CisKKyAgICBmb3IgKGkgPSAwOzsgaSsrKSB7CisgICAgICBnc3RjbG9jayA9IGdzdF9zZHBfbWVzc2FnZV9nZXRfYXR0cmlidXRlX3ZhbF9uIChzZHAsICJ4LWdzdC1jbG9jayIsIGkpOworICAgICAgaWYgKGdzdGNsb2NrID09IE5VTEwpCisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBwYXJzZSB0aGUgY2xvY2sgYW5kIGV4cG9zZSBpdCBpbiB0aGUgcHJvdmlkZV9jbG9jayBtZXRob2QgKi8KKyAgICAgIGlmIChnc3RfcnRzcHNyY19wYXJzZV9nc3RfY2xvY2sgKHNyYywgZ3N0Y2xvY2spKQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgLyogdHJ5IHRvIGZpbmQgYSBnbG9iYWwgY29udHJvbCBhdHRyaWJ1dGUuIE5vdGUgdGhhdCBhICcqJyBtZWFucyB0aGF0IHdlIHNob3VsZAorICAgKiBkbyBhZ2dyZWdhdGUgY29udHJvbCB3aXRoIHRoZSBjdXJyZW50IHVybCAoc28gd2UgZG9uJ3QgZG8gYW55dGhpbmcgYW5kCisgICAqIGxlYXZlIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gYXMgaXMpICovCisgIHsKKyAgICBjb25zdCBnY2hhciAqY29udHJvbDsKKworICAgIGZvciAoaSA9IDA7OyBpKyspIHsKKyAgICAgIGNvbnRyb2wgPSBnc3Rfc2RwX21lc3NhZ2VfZ2V0X2F0dHJpYnV0ZV92YWxfbiAoc2RwLCAiY29udHJvbCIsIGkpOworICAgICAgaWYgKGNvbnRyb2wgPT0gTlVMTCkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIG9ubHkgdGFrZSBmdWxseSBxdWFsaWZpZWQgdXJscyAqLworICAgICAgaWYgKGdfc3RyX2hhc19wcmVmaXggKGNvbnRyb2wsICJydHNwOi8vIikpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoY29udHJvbCkgeworICAgICAgZ19mcmVlIChzcmMtPmNvbm5pbmZvLmxvY2F0aW9uKTsKKyAgICAgIHNyYy0+Y29ubmluZm8ubG9jYXRpb24gPSBnX3N0cmR1cCAoY29udHJvbCk7CisgICAgICAvKiBtYWtlIGEgY29ubmVjdGlvbiBmb3IgdGhpcywgaWYgdGhlcmUgd2FzIGEgY29ubmVjdGlvbiBhbHJlYWR5LCBub3RoaW5nCisgICAgICAgKiBoYXBwZW5zLiAqLworICAgICAgaWYgKGdzdF9ydHNwX2Nvbm5pbmZvX2Nvbm5lY3QgKHNyYywgJnNyYy0+Y29ubmluZm8sIGFzeW5jKSA8IDApIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoc3JjLCAiY291bGQgbm90IGNvbm5lY3QiKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogd2UgbmVlZCB0byBrZWVwIHRoZSBjb250cm9sIHVybCBzZXBhcmF0ZSBmcm9tIHRoZSBjb25uZWN0aW9uIHVybCBiZWNhdXNlCisgICAgICogdGhlIHJ1bGVzIGZvciBjb25zdHJ1Y3RpbmcgdGhlIG1lZGlhIGNvbnRyb2wgdXJsIG5lZWQgaXQgKi8KKyAgICBnX2ZyZWUgKHNyYy0+Y29udHJvbCk7CisgICAgc3JjLT5jb250cm9sID0gZ19zdHJkdXAgKGNvbnRyb2wpOworICB9CisKKyAgLyogY3JlYXRlIHN0cmVhbXMgKi8KKyAgbl9zdHJlYW1zID0gZ3N0X3NkcF9tZXNzYWdlX21lZGlhc19sZW4gKHNkcCk7CisgIGZvciAoaSA9IDA7IGkgPCBuX3N0cmVhbXM7IGkrKykgeworICAgIGdzdF9ydHNwc3JjX2NyZWF0ZV9zdHJlYW0gKHNyYywgc2RwLCBpLCBuX3N0cmVhbXMpOworICB9CisKKyAgc3JjLT5zdGF0ZSA9IEdTVF9SVFNQX1NUQVRFX0lOSVQ7CisKKyAgLyogc2V0dXAgc3RyZWFtcyAqLworICBpZiAoKHJlcyA9IGdzdF9ydHNwc3JjX3NldHVwX3N0cmVhbXNfc3RhcnQgKHNyYywgYXN5bmMpKSA8IDApCisgICAgZ290byBzZXR1cF9mYWlsZWQ7CisKKyAgLyogcmVzZXQgb3VyIHN0YXRlICovCisgIHNyYy0+bmVlZF9yYW5nZSA9IFRSVUU7CisgIHNyYy0+c2tpcCA9IEZBTFNFOworCisgIHNyYy0+c3RhdGUgPSBHU1RfUlRTUF9TVEFURV9SRUFEWTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworc2V0dXBfZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoc3JjLCAic2V0dXAgZmFpbGVkIik7CisgICAgZ3N0X3J0c3BzcmNfY2xlYW51cCAoc3JjKTsKKyAgICByZXR1cm4gcmVzOworICB9Cit9CisKK3N0YXRpYyBHc3RSVFNQUmVzdWx0Citnc3RfcnRzcHNyY19yZXRyaWV2ZV9zZHAgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFNEUE1lc3NhZ2UgKiogc2RwLAorICAgIGdib29sZWFuIGFzeW5jKQoreworICBHc3RSVFNQUmVzdWx0IHJlczsKKyAgR3N0UlRTUE1lc3NhZ2UgcmVxdWVzdCA9IHsgMCB9OworICBHc3RSVFNQTWVzc2FnZSByZXNwb25zZSA9IHsgMCB9OworICBndWludDggKmRhdGE7CisgIGd1aW50IHNpemU7CisgIGdjaGFyICpyZXNwY29udCA9IE5VTEw7CisgIEdzdFJUU1BWZXJzaW9uIHZlcnNpb25zW10gPQorICAgICAgeyBHU1RfUlRTUF9WRVJTSU9OXzJfMCwgR1NUX1JUU1BfVkVSU0lPTl9JTlZBTElEIH07CisKKyAgc3JjLT52ZXJzaW9uID0gc3JjLT5kZWZhdWx0X3ZlcnNpb247CisgIGlmIChzcmMtPmRlZmF1bHRfdmVyc2lvbiA9PSBHU1RfUlRTUF9WRVJTSU9OXzJfMCkgeworICAgIHZlcnNpb25zWzBdID0gR1NUX1JUU1BfVkVSU0lPTl8xXzA7CisgIH0KKworcmVzdGFydDoKKyAgc3JjLT5uZWVkX3JlZGlyZWN0ID0gRkFMU0U7CisKKyAgLyogY2FuJ3QgY29udGludWUgd2l0aG91dCBhIHZhbGlkIHVybCAqLworICBpZiAoR19VTkxJS0VMWSAoc3JjLT5jb25uaW5mby51cmwgPT0gTlVMTCkpIHsKKyAgICByZXMgPSBHU1RfUlRTUF9FSU5WQUw7CisgICAgZ290byBub191cmw7CisgIH0KKyAgc3JjLT50cmllZF91cmxfYXV0aCA9IEZBTFNFOworCisgIGlmICgocmVzID0gZ3N0X3J0c3BfY29ubmluZm9fY29ubmVjdCAoc3JjLCAmc3JjLT5jb25uaW5mbywgYXN5bmMpKSA8IDApCisgICAgZ290byBjb25uZWN0X2ZhaWxlZDsKKworICAvKiBjcmVhdGUgT1BUSU9OUyAqLworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjcmVhdGUgb3B0aW9ucy4uLiAoJXMpIiwgYXN5bmMgPyAiYXN5bmMiIDogInN5bmMiKTsKKyAgcmVzID0KKyAgICAgIGdzdF9ydHNwc3JjX2luaXRfcmVxdWVzdCAoc3JjLCAmcmVxdWVzdCwgR1NUX1JUU1BfT1BUSU9OUywKKyAgICAgIHNyYy0+Y29ubmluZm8udXJsX3N0cik7CisgIGlmIChyZXMgPCAwKQorICAgIGdvdG8gY3JlYXRlX3JlcXVlc3RfZmFpbGVkOworCisgIC8qIHNlbmQgT1BUSU9OUyAqLworICByZXF1ZXN0LnR5cGVfZGF0YS5yZXF1ZXN0LnZlcnNpb24gPSBzcmMtPnZlcnNpb247CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInNlbmQgb3B0aW9ucy4uLiIpOworCisgIGlmIChhc3luYykKKyAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBDT05USU5VRSwgIm9wZW4iLCAoIlJldHJpZXZpbmcgc2VydmVyIG9wdGlvbnMiKSk7CisKKyAgaWYgKChyZXMgPQorICAgICAgICAgIGdzdF9ydHNwc3JjX3NlbmQgKHNyYywgJnNyYy0+Y29ubmluZm8sICZyZXF1ZXN0LCAmcmVzcG9uc2UsCisgICAgICAgICAgICAgIE5VTEwsIHZlcnNpb25zKSkgPCAwKSB7CisgICAgZ290byBzZW5kX2Vycm9yOworICB9CisKKyAgc3JjLT52ZXJzaW9uID0gcmVxdWVzdC50eXBlX2RhdGEucmVxdWVzdC52ZXJzaW9uOworICBHU1RfSU5GT19PQkpFQ1QgKHNyYywgIk5vdyB1c2luZyB2ZXJzaW9uOiAlcyIsCisgICAgICBnc3RfcnRzcF92ZXJzaW9uX2FzX3RleHQgKHNyYy0+dmVyc2lvbikpOworCisgIC8qIHBhcnNlIE9QVElPTlMgKi8KKyAgaWYgKCFnc3RfcnRzcHNyY19wYXJzZV9tZXRob2RzIChzcmMsICZyZXNwb25zZSkpCisgICAgZ290byBtZXRob2RzX2Vycm9yOworCisgIC8qIGNyZWF0ZSBERVNDUklCRSAqLworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjcmVhdGUgZGVzY3JpYmUuLi4iKTsKKyAgcmVzID0KKyAgICAgIGdzdF9ydHNwc3JjX2luaXRfcmVxdWVzdCAoc3JjLCAmcmVxdWVzdCwgR1NUX1JUU1BfREVTQ1JJQkUsCisgICAgICBzcmMtPmNvbm5pbmZvLnVybF9zdHIpOworICBpZiAocmVzIDwgMCkKKyAgICBnb3RvIGNyZWF0ZV9yZXF1ZXN0X2ZhaWxlZDsKKworICAvKiB3ZSBvbmx5IGFjY2VwdCBTRFAgZm9yIG5vdyAqLworICBnc3RfcnRzcF9tZXNzYWdlX2FkZF9oZWFkZXIgKCZyZXF1ZXN0LCBHU1RfUlRTUF9IRFJfQUNDRVBULAorICAgICAgImFwcGxpY2F0aW9uL3NkcCIpOworCisgIC8qIHNlbmQgREVTQ1JJQkUgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic2VuZCBkZXNjcmliZS4uLiIpOworCisgIGlmIChhc3luYykKKyAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBDT05USU5VRSwgIm9wZW4iLCAoIlJldHJpZXZpbmcgbWVkaWEgaW5mbyIpKTsKKworICBpZiAoKHJlcyA9CisgICAgICAgICAgZ3N0X3J0c3BzcmNfc2VuZCAoc3JjLCAmc3JjLT5jb25uaW5mbywgJnJlcXVlc3QsICZyZXNwb25zZSwKKyAgICAgICAgICAgICAgTlVMTCwgTlVMTCkpIDwgMCkKKyAgICBnb3RvIHNlbmRfZXJyb3I7CisKKyAgLyogd2Ugb25seSBwZXJmb3JtIHJlZGlyZWN0IGZvciBkZXNjcmliZSBhbmQgcGxheSwgY3VycmVudGx5ICovCisgIGlmIChzcmMtPm5lZWRfcmVkaXJlY3QpIHsKKyAgICAvKiBjbG9zZSBjb25uZWN0aW9uLCB3ZSBkb24ndCBoYXZlIHRvIHNlbmQgYSBURUFSRE9XTiB5ZXQsIGlnbm9yZSB0aGUKKyAgICAgKiByZXN1bHQuICovCisgICAgZ3N0X3J0c3BfY29ubmluZm9fY2xvc2UgKHNyYywgJnNyYy0+Y29ubmluZm8sIFRSVUUpOworCisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJnJlcXVlc3QpOworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXNwb25zZSk7CisKKyAgICAvKiBhbmQgbm93IHJldHJ5ICovCisgICAgZ290byByZXN0YXJ0OworICB9CisKKyAgLyogaXQgY291bGQgYmUgdGhhdCB0aGUgREVTQ1JJQkUgbWV0aG9kIHdhcyBub3QgaW1wbGVtZW50ZWQgKi8KKyAgaWYgKCEoc3JjLT5tZXRob2RzICYgR1NUX1JUU1BfREVTQ1JJQkUpKQorICAgIGdvdG8gbm9fZGVzY3JpYmU7CisKKyAgLyogY2hlY2sgaWYgcmVwbHkgaXMgU0RQICovCisgIGdzdF9ydHNwX21lc3NhZ2VfZ2V0X2hlYWRlciAoJnJlc3BvbnNlLCBHU1RfUlRTUF9IRFJfQ09OVEVOVF9UWVBFLCAmcmVzcGNvbnQsCisgICAgICAwKTsKKyAgLyogY291bGQgbm90IGJlIHNldCBidXQgc2luY2UgdGhlIHJlcXVlc3QgcmV0dXJuZWQgT0ssIHdlIGFzc3VtZSBpdAorICAgKiB3YXMgU0RQLCBlbHNlIGNoZWNrIGl0LiAqLworICBpZiAocmVzcGNvbnQpIHsKKyAgICBjb25zdCBnY2hhciAqcHJvcHMgPSBzdHJjaHIgKHJlc3Bjb250LCAnOycpOworCisgICAgaWYgKHByb3BzKSB7CisgICAgICBnY2hhciAqbWltZXR5cGUgPSBnX3N0cm5kdXAgKHJlc3Bjb250LCBwcm9wcyAtIHJlc3Bjb250KTsKKworICAgICAgbWltZXR5cGUgPSBnX3N0cnN0cmlwIChtaW1ldHlwZSk7CisgICAgICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wIChtaW1ldHlwZSwgImFwcGxpY2F0aW9uL3NkcCIpICE9IDApIHsKKyAgICAgICAgZ19mcmVlIChtaW1ldHlwZSk7CisgICAgICAgIGdvdG8gd3JvbmdfY29udGVudF90eXBlOworICAgICAgfQorCisgICAgICAvKiBUT0RPOiBDaGVjayBmb3IgY2hhcnNldCBwcm9wZXJ0eSBhbmQgZG8gY29udmVyc2lvbnMgb2YgYWxsIG1lc3NhZ2VzIGlmCisgICAgICAgKiBuZWVkZWQuIFNvbWUgc2VydmVycyBhY3R1YWxseSBzZW5kIHRoYXQgcHJvcGVydHkgKi8KKworICAgICAgZ19mcmVlIChtaW1ldHlwZSk7CisgICAgfSBlbHNlIGlmIChnX2FzY2lpX3N0cmNhc2VjbXAgKHJlc3Bjb250LCAiYXBwbGljYXRpb24vc2RwIikgIT0gMCkgeworICAgICAgZ290byB3cm9uZ19jb250ZW50X3R5cGU7CisgICAgfQorICB9CisKKyAgLyogZ2V0IG1lc3NhZ2UgYm9keSBhbmQgcGFyc2UgYXMgU0RQICovCisgIGdzdF9ydHNwX21lc3NhZ2VfZ2V0X2JvZHkgKCZyZXNwb25zZSwgJmRhdGEsICZzaXplKTsKKyAgaWYgKGRhdGEgPT0gTlVMTCB8fCBzaXplID09IDApCisgICAgZ290byBub19kZXNjcmliZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJwYXJzZSBTRFAuLi4iKTsKKyAgZ3N0X3NkcF9tZXNzYWdlX25ldyAoc2RwKTsKKyAgZ3N0X3NkcF9tZXNzYWdlX3BhcnNlX2J1ZmZlciAoZGF0YSwgc2l6ZSwgKnNkcCk7CisKKyAgLyogY2xlYW4gdXAgYW55IG1lc3NhZ2VzICovCisgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXF1ZXN0KTsKKyAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJnJlc3BvbnNlKTsKKworICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SUyAqLworbm9fdXJsOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE5PVF9GT1VORCwgKE5VTEwpLAorICAgICAgICAoIk5vIHZhbGlkIFJUU1AgVVJMIHdhcyBwcm92aWRlZCIpKTsKKyAgICBnb3RvIGNsZWFudXBfZXJyb3I7CisgIH0KK2Nvbm5lY3RfZmFpbGVkOgorICB7CisgICAgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0cnJlc3VsdCAocmVzKTsKKworICAgIGlmIChyZXMgIT0gR1NUX1JUU1BfRUlOVFIpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBPUEVOX1JFQURfV1JJVEUsIChOVUxMKSwKKyAgICAgICAgICAoIkZhaWxlZCB0byBjb25uZWN0LiAoJXMpIiwgc3RyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiY29ubmVjdCBpbnRlcnJ1cHRlZCIpOworICAgIH0KKyAgICBnX2ZyZWUgKHN0cik7CisgICAgZ290byBjbGVhbnVwX2Vycm9yOworICB9CitjcmVhdGVfcmVxdWVzdF9mYWlsZWQ6CisgIHsKKyAgICBnY2hhciAqc3RyID0gZ3N0X3J0c3Bfc3RycmVzdWx0IChyZXMpOworCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgTElCUkFSWSwgSU5JVCwgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgcmVxdWVzdC4gKCVzKSIsIHN0cikpOworICAgIGdfZnJlZSAoc3RyKTsKKyAgICBnb3RvIGNsZWFudXBfZXJyb3I7CisgIH0KK3NlbmRfZXJyb3I6CisgIHsKKyAgICAvKiBEb24ndCBwb3N0IGEgbWVzc2FnZSAtIHRoZSBydHNwX3NlbmQgbWV0aG9kIHdpbGwgaGF2ZQorICAgICAqIHRha2VuIGNhcmUgb2YgaXQgYmVjYXVzZSB3ZSBwYXNzZWQgTlVMTCBmb3IgdGhlIHJlc3BvbnNlIGNvZGUgKi8KKyAgICBnb3RvIGNsZWFudXBfZXJyb3I7CisgIH0KK21ldGhvZHNfZXJyb3I6CisgIHsKKyAgICAvKiBlcnJvciB3YXMgcG9zdGVkICovCisgICAgcmVzID0gR1NUX1JUU1BfRVJST1I7CisgICAgZ290byBjbGVhbnVwX2Vycm9yOworICB9Cit3cm9uZ19jb250ZW50X3R5cGU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBTRFAsIGdvdCAlcy4iLCByZXNwY29udCkpOworICAgIHJlcyA9IEdTVF9SVFNQX0VSUk9SOworICAgIGdvdG8gY2xlYW51cF9lcnJvcjsKKyAgfQorbm9fZGVzY3JpYmU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJTZXJ2ZXIgY2FuIG5vdCBwcm92aWRlIGFuIFNEUC4iKSk7CisgICAgcmVzID0gR1NUX1JUU1BfRVJST1I7CisgICAgZ290byBjbGVhbnVwX2Vycm9yOworICB9CitjbGVhbnVwX2Vycm9yOgorICB7CisgICAgaWYgKHNyYy0+Y29ubmluZm8uY29ubmVjdGlvbikgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZnJlZSBjb25uZWN0aW9uIik7CisgICAgICBnc3RfcnRzcF9jb25uaW5mb19jbG9zZSAoc3JjLCAmc3JjLT5jb25uaW5mbywgVFJVRSk7CisgICAgfQorICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXF1ZXN0KTsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVzcG9uc2UpOworICAgIHJldHVybiByZXM7CisgIH0KK30KKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX29wZW4gKEdzdFJUU1BTcmMgKiBzcmMsIGdib29sZWFuIGFzeW5jKQoreworICBHc3RSVFNQUmVzdWx0IHJldDsKKworICBzcmMtPm1ldGhvZHMgPQorICAgICAgR1NUX1JUU1BfU0VUVVAgfCBHU1RfUlRTUF9QTEFZIHwgR1NUX1JUU1BfUEFVU0UgfCBHU1RfUlRTUF9URUFSRE9XTjsKKworICBpZiAoc3JjLT5zZHAgPT0gTlVMTCkgeworICAgIGlmICgocmV0ID0gZ3N0X3J0c3BzcmNfcmV0cmlldmVfc2RwIChzcmMsICZzcmMtPnNkcCwgYXN5bmMpKSA8IDApCisgICAgICBnb3RvIG5vX3NkcDsKKyAgfQorCisgIGlmICgocmV0ID0gZ3N0X3J0c3BzcmNfb3Blbl9mcm9tX3NkcCAoc3JjLCBzcmMtPnNkcCwgYXN5bmMpKSA8IDApCisgICAgZ290byBvcGVuX2ZhaWxlZDsKKworZG9uZToKKyAgaWYgKGFzeW5jKQorICAgIGdzdF9ydHNwc3JjX2xvb3BfZW5kX2NtZCAoc3JjLCBDTURfT1BFTiwgcmV0KTsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworbm9fc2RwOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJjYW4ndCBnZXQgc2RwIik7CisgICAgc3JjLT5vcGVuX2Vycm9yID0gVFJVRTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK29wZW5fZmFpbGVkOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJjYW4ndCBzZXR1cCBzdHJlYW1pbmcgZnJvbSBzZHAiKTsKKyAgICBzcmMtPm9wZW5fZXJyb3IgPSBUUlVFOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCitzdGF0aWMgR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BzcmNfY2xvc2UgKEdzdFJUU1BTcmMgKiBzcmMsIGdib29sZWFuIGFzeW5jLCBnYm9vbGVhbiBvbmx5X2Nsb3NlKQoreworICBHc3RSVFNQTWVzc2FnZSByZXF1ZXN0ID0geyAwIH07CisgIEdzdFJUU1BNZXNzYWdlIHJlc3BvbnNlID0geyAwIH07CisgIEdzdFJUU1BSZXN1bHQgcmVzID0gR1NUX1JUU1BfT0s7CisgIEdMaXN0ICp3YWxrOworICBjb25zdCBnY2hhciAqY29udHJvbDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJURUFSRE9XTi4uLiIpOworCisgIGdzdF9ydHNwc3JjX3NldF9zdGF0ZSAoc3JjLCBHU1RfU1RBVEVfUkVBRFkpOworCisgIGlmIChzcmMtPnN0YXRlIDwgR1NUX1JUU1BfU1RBVEVfUkVBRFkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJub3QgcmVhZHksIGRvaW5nIGNsZWFudXAiKTsKKyAgICBnb3RvIGNsb3NlOworICB9CisKKyAgaWYgKG9ubHlfY2xvc2UpCisgICAgZ290byBjbG9zZTsKKworICAvKiBjb25zdHJ1Y3QgYSBjb250cm9sIHVybCAqLworICBjb250cm9sID0gZ2V0X2FnZ3JlZ2F0ZV9jb250cm9sIChzcmMpOworCisgIGlmICghKHNyYy0+bWV0aG9kcyAmIChHU1RfUlRTUF9QTEFZIHwgR1NUX1JUU1BfVEVBUkRPV04pKSkKKyAgICBnb3RvIG5vdF9zdXBwb3J0ZWQ7CisKKyAgZm9yICh3YWxrID0gc3JjLT5zdHJlYW1zOyB3YWxrOyB3YWxrID0gZ19saXN0X25leHQgKHdhbGspKSB7CisgICAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtID0gKEdzdFJUU1BTdHJlYW0gKikgd2Fsay0+ZGF0YTsKKyAgICBjb25zdCBnY2hhciAqc2V0dXBfdXJsOworICAgIEdzdFJUU1BDb25uSW5mbyAqaW5mbzsKKworICAgIC8qIHRyeSBhZ2dyZWdhdGUgY29udHJvbCBmaXJzdCBidXQgZG8gbm9uLWFnZ3JlZ2F0ZSBjb250cm9sIG90aGVyd2lzZSAqLworICAgIGlmIChjb250cm9sKQorICAgICAgc2V0dXBfdXJsID0gY29udHJvbDsKKyAgICBlbHNlIGlmICgoc2V0dXBfdXJsID0gc3RyZWFtLT5jb25uaW5mby5sb2NhdGlvbikgPT0gTlVMTCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKHNyYy0+Y29ubmluZm8uY29ubmVjdGlvbikgeworICAgICAgaW5mbyA9ICZzcmMtPmNvbm5pbmZvOworICAgIH0gZWxzZSBpZiAoc3RyZWFtLT5jb25uaW5mby5jb25uZWN0aW9uKSB7CisgICAgICBpbmZvID0gJnN0cmVhbS0+Y29ubmluZm87CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIWluZm8tPmNvbm5lY3RlZCkKKyAgICAgIGdvdG8gbmV4dDsKKworICAgIC8qIGRvIFRFQVJET1dOICovCisgICAgcmVzID0KKyAgICAgICAgZ3N0X3J0c3BzcmNfaW5pdF9yZXF1ZXN0IChzcmMsICZyZXF1ZXN0LCBHU1RfUlRTUF9URUFSRE9XTiwgc2V0dXBfdXJsKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgIGdvdG8gY3JlYXRlX3JlcXVlc3RfZmFpbGVkOworCisgICAgaWYgKGFzeW5jKQorICAgICAgR1NUX0VMRU1FTlRfUFJPR1JFU1MgKHNyYywgQ09OVElOVUUsICJjbG9zZSIsICgiQ2xvc2luZyBzdHJlYW0iKSk7CisKKyAgICBpZiAoKHJlcyA9CisgICAgICAgICAgICBnc3RfcnRzcHNyY19zZW5kIChzcmMsIGluZm8sICZyZXF1ZXN0LCAmcmVzcG9uc2UsIE5VTEwsIE5VTEwpKSA8IDApCisgICAgICBnb3RvIHNlbmRfZXJyb3I7CisKKyAgICAvKiBGSVhNRSwgcGFyc2UgcmVzdWx0PyAqLworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXF1ZXN0KTsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVzcG9uc2UpOworCisgIG5leHQ6CisgICAgLyogZWFybHkgZXhpdCB3aGVuIHdlIGRpZCBhZ2dyZWdhdGUgY29udHJvbCAqLworICAgIGlmIChjb250cm9sKQorICAgICAgYnJlYWs7CisgIH0KKworY2xvc2U6CisgIC8qIGNsb3NlIGNvbm5lY3Rpb25zICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNsb3NpbmcgY29ubmVjdGlvbi4uLiIpOworICBnc3RfcnRzcF9jb25uaW5mb19jbG9zZSAoc3JjLCAmc3JjLT5jb25uaW5mbywgVFJVRSk7CisgIGZvciAod2FsayA9IHNyYy0+c3RyZWFtczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BTdHJlYW0gKnN0cmVhbSA9IChHc3RSVFNQU3RyZWFtICopIHdhbGstPmRhdGE7CisgICAgZ3N0X3J0c3BfY29ubmluZm9fY2xvc2UgKHNyYywgJnN0cmVhbS0+Y29ubmluZm8sIFRSVUUpOworICB9CisKKyAgLyogY2xlYW51cCAqLworICBnc3RfcnRzcHNyY19jbGVhbnVwIChzcmMpOworCisgIHNyYy0+c3RhdGUgPSBHU1RfUlRTUF9TVEFURV9JTlZBTElEOworCisgIGlmIChhc3luYykKKyAgICBnc3RfcnRzcHNyY19sb29wX2VuZF9jbWQgKHNyYywgQ01EX0NMT1NFLCByZXMpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitjcmVhdGVfcmVxdWVzdF9mYWlsZWQ6CisgIHsKKyAgICBnY2hhciAqc3RyID0gZ3N0X3J0c3Bfc3RycmVzdWx0IChyZXMpOworCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgTElCUkFSWSwgSU5JVCwgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgcmVxdWVzdC4gKCVzKSIsIHN0cikpOworICAgIGdfZnJlZSAoc3RyKTsKKyAgICBnb3RvIGNsb3NlOworICB9CitzZW5kX2Vycm9yOgorICB7CisgICAgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0cnJlc3VsdCAocmVzKTsKKworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXF1ZXN0KTsKKyAgICBpZiAocmVzICE9IEdTVF9SVFNQX0VJTlRSKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgV1JJVEUsIChOVUxMKSwKKyAgICAgICAgICAoIkNvdWxkIG5vdCBzZW5kIG1lc3NhZ2UuICglcykiLCBzdHIpKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJURUFSRE9XTiBpbnRlcnJ1cHRlZCIpOworICAgIH0KKyAgICBnX2ZyZWUgKHN0cik7CisgICAgZ290byBjbG9zZTsKKyAgfQorbm90X3N1cHBvcnRlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywKKyAgICAgICAgIlRFQVJET1dOIGFuZCBQTEFZIG5vdCBzdXBwb3J0ZWQsIGNhbid0IGRvIFRFQVJET1dOIik7CisgICAgZ290byBjbG9zZTsKKyAgfQorfQorCisvKiBSVFAtSW5mbyBpcyBvZiB0aGUgZm9ybWF0OgorICoKKyAqIHVybD08VVJMPjtbc2VxPTxzZXFiYXNlPjtydHB0aW1lPTx0aW1lYmFzZT5dIFssIHVybD0uLi5dCisgKgorICogcnRwdGltZSBjb3JyZXNwb25kcyB0byB0aGUgdGltZXN0YW1wIGZvciB0aGUgTlBUIHRpbWUgZ2l2ZW4gaW4gdGhlIGhlYWRlcgorICogc2VxYmFzZSBjb3JyZXNwb25kcyB0byB0aGUgbmV4dCBzZXF1ZW5jZSBudW1iZXIgd2UgcmVjZWl2ZWQuIFRoaXMgbnVtYmVyCisgKiBpbmRpY2F0ZXMgdGhlIGZpcnN0IHNlcW51bSBhZnRlciB0aGUgc2VlayBhbmQgc2hvdWxkIGJlIHVzZWQgdG8gZGlzY2FyZAorICogcGFja2V0cyB0aGF0IGFyZSBmcm9tIGJlZm9yZSB0aGUgc2Vlay4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY19wYXJzZV9ydHBpbmZvIChHc3RSVFNQU3JjICogc3JjLCBnY2hhciAqIHJ0cGluZm8pCit7CisgIGdjaGFyICoqaW5mb3M7CisgIGdpbnQgaSwgajsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJwYXJzaW5nIFJUUC1JbmZvICVzIiwgcnRwaW5mbyk7CisKKyAgaW5mb3MgPSBnX3N0cnNwbGl0IChydHBpbmZvLCAiLCIsIDApOworICBmb3IgKGkgPSAwOyBpbmZvc1tpXTsgaSsrKSB7CisgICAgZ2NoYXIgKipmaWVsZHM7CisgICAgR3N0UlRTUFN0cmVhbSAqc3RyZWFtOworICAgIGdpbnQzMiBzZXFiYXNlOworICAgIGdpbnQ2NCB0aW1lYmFzZTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInBhcnNpbmcgaW5mbyAlcyIsIGluZm9zW2ldKTsKKworICAgIC8qIGluaXQgdmFsdWVzLCB0eXBlcyBvZiBzZXFiYXNlIGFuZCB0aW1lYmFzZSBhcmUgYmlnZ2VyIHRoYW4gbmVlZGVkIHNvIHdlCisgICAgICogY2FuIHN0b3JlIC0xIGFzIHVuaW5pdGlhbGl6ZWQgdmFsdWVzICovCisgICAgc3RyZWFtID0gTlVMTDsKKyAgICBzZXFiYXNlID0gLTE7CisgICAgdGltZWJhc2UgPSAtMTsKKworICAgIC8qIHBhcnNlIHVybCwgZmluZCBzdHJlYW0gZm9yIHVybC4KKyAgICAgKiBwYXJzZSBzZXEgYW5kIHJ0cHRpbWUuIFRoZSBzZXEgbnVtYmVyIHNob3VsZCBiZSBjb25maWd1cmVkIGluIHRoZSBydHAKKyAgICAgKiBkZXBheWxvYWRlciBvciBzZXNzaW9uIG1hbmFnZXIgdG8gZGV0ZWN0IGdhcHMuIFNhbWUgZm9yIHRoZSBydHB0aW1lLCBpdAorICAgICAqIHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBpbml0aWFsIHRpbWUgbmV3c2VnbWVudC4gKi8KKyAgICBmaWVsZHMgPSBnX3N0cnNwbGl0IChpbmZvc1tpXSwgIjsiLCAwKTsKKyAgICBmb3IgKGogPSAwOyBmaWVsZHNbal07IGorKykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicGFyc2luZyBmaWVsZCAlcyIsIGZpZWxkc1tqXSk7CisgICAgICAvKiByZW1vdmUgbGVhZGluZyB3aGl0ZXNwYWNlICovCisgICAgICBmaWVsZHNbal0gPSBnX3N0cmNodWcgKGZpZWxkc1tqXSk7CisgICAgICBpZiAoZ19zdHJfaGFzX3ByZWZpeCAoZmllbGRzW2pdLCAidXJsPSIpKSB7CisgICAgICAgIC8qIGdldCB0aGUgdXJsIGFuZCB0aGUgc3RyZWFtICovCisgICAgICAgIHN0cmVhbSA9CisgICAgICAgICAgICBmaW5kX3N0cmVhbSAoc3JjLCAoZmllbGRzW2pdICsgNCksIChncG9pbnRlcikgZmluZF9zdHJlYW1fYnlfc2V0dXApOworICAgICAgfSBlbHNlIGlmIChnX3N0cl9oYXNfcHJlZml4IChmaWVsZHNbal0sICJzZXE9IikpIHsKKyAgICAgICAgc2VxYmFzZSA9IGF0b2kgKGZpZWxkc1tqXSArIDQpOworICAgICAgfSBlbHNlIGlmIChnX3N0cl9oYXNfcHJlZml4IChmaWVsZHNbal0sICJydHB0aW1lPSIpKSB7CisgICAgICAgIHRpbWViYXNlID0gZ19hc2NpaV9zdHJ0b2xsIChmaWVsZHNbal0gKyA4LCBOVUxMLCAxMCk7CisgICAgICB9CisgICAgfQorICAgIGdfc3RyZnJlZXYgKGZpZWxkcyk7CisgICAgLyogbm93IHdlIG5lZWQgdG8gc3RvcmUgdGhlIHZhbHVlcyBmb3IgdGhlIGNhcHMgb2YgdGhlIHN0cmVhbSAqLworICAgIGlmIChzdHJlYW0gIT0gTlVMTCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLAorICAgICAgICAgICJmb3VuZCBzdHJlYW0gJXAsIHNldHRpbmc6IHNlcWJhc2UgJWQsIHRpbWViYXNlICUiIEdfR0lOVDY0X0ZPUk1BVCwKKyAgICAgICAgICBzdHJlYW0sIHNlcWJhc2UsIHRpbWViYXNlKTsKKworICAgICAgLyogd2UgaGF2ZSBhIHN0cmVhbSwgY29uZmlndXJlIGRldGVjdGVkIHBhcmFtcyAqLworICAgICAgc3RyZWFtLT5zZXFiYXNlID0gc2VxYmFzZTsKKyAgICAgIHN0cmVhbS0+dGltZWJhc2UgPSB0aW1lYmFzZTsKKyAgICB9CisgIH0KKyAgZ19zdHJmcmVldiAoaW5mb3MpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfaGFuZGxlX3J0Y3BfaW50ZXJ2YWwgKEdzdFJUU1BTcmMgKiBzcmMsIGdjaGFyICogcnRjcCkKK3sKKyAgZ3VpbnQ2NCBpbnRlcnZhbDsKKyAgR0xpc3QgKndhbGs7CisKKyAgaW50ZXJ2YWwgPSBzdHJ0b3VsIChydGNwLCBOVUxMLCAxMCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInJ0Y3AgaW50ZXJ2YWw6ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBtcyIsIGludGVydmFsKTsKKworICBpZiAoIWludGVydmFsKQorICAgIHJldHVybjsKKworICBpbnRlcnZhbCAqPSBHU1RfTVNFQ09ORDsKKworICBmb3IgKHdhbGsgPSBzcmMtPnN0cmVhbXM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RSVFNQU3RyZWFtICpzdHJlYW0gPSAoR3N0UlRTUFN0cmVhbSAqKSB3YWxrLT5kYXRhOworCisgICAgLyogYWxyZWFkeSAob3B0aW9uYWxseSkgcmV0cmlldmVkIHRoaXMgd2hlbiBjb25maWd1cmluZyBtYW5hZ2VyICovCisgICAgaWYgKHN0cmVhbS0+c2Vzc2lvbikgeworICAgICAgR09iamVjdCAqcnRwc2Vzc2lvbiA9IHN0cmVhbS0+c2Vzc2lvbjsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY29uZmlndXJlIHJ0Y3AgaW50ZXJ2YWwgaW4gc2Vzc2lvbiAlcCIsCisgICAgICAgICAgcnRwc2Vzc2lvbik7CisgICAgICBnX29iamVjdF9zZXQgKHJ0cHNlc3Npb24sICJydGNwLW1pbi1pbnRlcnZhbCIsIGludGVydmFsLCBOVUxMKTsKKyAgICB9CisgIH0KKworICAvKiBub3cgaXQgaGFwcGVucyB0aGF0IChYZW5vbikgc2VydmVyIHNlbmRpbmcgdGhpcyBtYXkgYWxzbyBwcm92aWRlIGJvZ3VzCisgICAqIFJUQ1AgU1Igc3luYyBkYXRhIChpLmUuIHdpdGggcXVpdGUgc29tZSBqaXR0ZXIpLCBzbyBuZXZlciBtaW5kIHRob3NlCisgICAqIGFuZCBqdXN0IHVzZSBSVFAtSW5mbyB0byBzeW5jICovCisgIGlmIChzcmMtPm1hbmFnZXIpIHsKKyAgICBHT2JqZWN0Q2xhc3MgKmtsYXNzOworCisgICAga2xhc3MgPSBHX09CSkVDVF9HRVRfQ0xBU1MgKEdfT0JKRUNUIChzcmMtPm1hbmFnZXIpKTsKKyAgICBpZiAoZ19vYmplY3RfY2xhc3NfZmluZF9wcm9wZXJ0eSAoa2xhc3MsICJydGNwLXN5bmMiKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiY29uZmlndXJpbmcgcnRwIHN5bmMgbWV0aG9kIik7CisgICAgICBnX29iamVjdF9zZXQgKHNyYy0+bWFuYWdlciwgInJ0Y3Atc3luYyIsIFJUQ1BfU1lOQ19SVFAsIE5VTEwpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgZ2RvdWJsZQorZ3N0X3J0c3BzcmNfZ2V0X2Zsb2F0IChjb25zdCBnY2hhciAqIGRzdHIpCit7CisgIGdjaGFyIHNbR19BU0NJSV9EVE9TVFJfQlVGX1NJWkVdID0geyAwLCB9OworCisgIC8qIGNhbm9uaWNhbGlzZSBmbG9hdGluZyBwb2ludCBzdHJpbmcgc28gd2UgY2FuIGhhbmRsZSBmbG9hdCBzdHJpbmdzCisgICAqIGluIHRoZSBmb3JtICIyNC45MzAiIG9yICIyNCw5MzAiIGlycmVzcGVjdGl2ZSBvZiB0aGUgY3VycmVudCBsb2NhbGUgKi8KKyAgZ19zdHJsY3B5IChzLCBkc3RyLCBzaXplb2YgKHMpKTsKKyAgZ19zdHJkZWxpbWl0IChzLCAiLCIsICcuJyk7CisgIHJldHVybiBnX2FzY2lpX3N0cnRvZCAocywgTlVMTCk7Cit9CisKK3N0YXRpYyBnY2hhciAqCitnZW5fcmFuZ2VfaGVhZGVyIChHc3RSVFNQU3JjICogc3JjLCBHc3RTZWdtZW50ICogc2VnbWVudCkKK3sKKyAgZ2NoYXIgdmFsX3N0cltHX0FTQ0lJX0RUT1NUUl9CVUZfU0laRV0gPSB7IDAsIH07CisKKyAgaWYgKHNyYy0+cmFuZ2UgJiYgc3JjLT5yYW5nZS0+bWluLnR5cGUgPT0gR1NUX1JUU1BfVElNRV9OT1cpIHsKKyAgICBnX3N0cmxjcHkgKHZhbF9zdHIsICJub3ciLCBzaXplb2YgKHZhbF9zdHIpKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoc2VnbWVudC0+cG9zaXRpb24gPT0gMCkgeworICAgICAgZ19zdHJsY3B5ICh2YWxfc3RyLCAiMCIsIHNpemVvZiAodmFsX3N0cikpOworICAgIH0gZWxzZSB7CisgICAgICBnX2FzY2lpX2R0b3N0ciAodmFsX3N0ciwgc2l6ZW9mICh2YWxfc3RyKSwKKyAgICAgICAgICAoKGdkb3VibGUpIHNlZ21lbnQtPnBvc2l0aW9uKSAvIEdTVF9TRUNPTkQpOworICAgIH0KKyAgfQorICByZXR1cm4gZ19zdHJkdXBfcHJpbnRmICgibnB0PSVzLSIsIHZhbF9zdHIpOworfQorCitzdGF0aWMgdm9pZAorY2xlYXJfcnRwX2Jhc2UgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFJUU1BTdHJlYW0gKiBzdHJlYW0pCit7CisgIGd1aW50IGksIGxlbjsKKworICBzdHJlYW0tPnRpbWViYXNlID0gLTE7CisgIHN0cmVhbS0+c2VxYmFzZSA9IC0xOworCisgIGxlbiA9IHN0cmVhbS0+cHRtYXAtPmxlbjsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgUHRNYXBJdGVtICppdGVtID0gJmdfYXJyYXlfaW5kZXggKHN0cmVhbS0+cHRtYXAsIFB0TWFwSXRlbSwgaSk7CisgICAgR3N0U3RydWN0dXJlICpzOworCisgICAgaWYgKGl0ZW0tPmNhcHMgPT0gTlVMTCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaXRlbS0+Y2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGl0ZW0tPmNhcHMpOworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChpdGVtLT5jYXBzLCAwKTsKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZHMgKHMsICJjbG9jay1iYXNlIiwgInNlcW51bS1iYXNlIiwgTlVMTCk7CisgICAgaWYgKGl0ZW0tPnB0ID09IHN0cmVhbS0+ZGVmYXVsdF9wdCAmJiBzdHJlYW0tPnVkcHNyY1swXSkKKyAgICAgIGdfb2JqZWN0X3NldCAoc3RyZWFtLT51ZHBzcmNbMF0sICJjYXBzIiwgaXRlbS0+Y2FwcywgTlVMTCk7CisgIH0KKyAgc3RyZWFtLT5uZWVkX2NhcHMgPSBUUlVFOworfQorCitzdGF0aWMgR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BzcmNfZW5zdXJlX29wZW4gKEdzdFJUU1BTcmMgKiBzcmMsIGdib29sZWFuIGFzeW5jKQoreworICBHc3RSVFNQUmVzdWx0IHJlcyA9IEdTVF9SVFNQX09LOworCisgIGlmIChzcmMtPnN0YXRlIDwgR1NUX1JUU1BfU1RBVEVfUkVBRFkpIHsKKyAgICByZXMgPSBHU1RfUlRTUF9FUlJPUjsKKyAgICBpZiAoc3JjLT5vcGVuX2Vycm9yKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJ0aGUgc3RyZWFtIHdhcyBpbiBlcnJvciIpOworICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBpZiAoYXN5bmMpCisgICAgICBnc3RfcnRzcHNyY19sb29wX3N0YXJ0X2NtZCAoc3JjLCBDTURfT1BFTik7CisKKyAgICBpZiAoKHJlcyA9IGdzdF9ydHNwc3JjX29wZW4gKHNyYywgYXN5bmMpKSA8IDApIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImZhaWxlZCB0byBvcGVuIHN0cmVhbSIpOworICAgICAgZ290byBkb25lOworICAgIH0KKyAgfQorCitkb25lOgorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0UlRTUFJlc3VsdAorZ3N0X3J0c3BzcmNfcGxheSAoR3N0UlRTUFNyYyAqIHNyYywgR3N0U2VnbWVudCAqIHNlZ21lbnQsIGdib29sZWFuIGFzeW5jLAorICAgIGNvbnN0IGdjaGFyICogc2Vla19zdHlsZSkKK3sKKyAgR3N0UlRTUE1lc3NhZ2UgcmVxdWVzdCA9IHsgMCB9OworICBHc3RSVFNQTWVzc2FnZSByZXNwb25zZSA9IHsgMCB9OworICBHc3RSVFNQUmVzdWx0IHJlcyA9IEdTVF9SVFNQX09LOworICBHTGlzdCAqd2FsazsKKyAgZ2NoYXIgKmh2YWw7CisgIGdpbnQgaHZhbF9pZHg7CisgIGNvbnN0IGdjaGFyICpjb250cm9sOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIlBMQVkuLi4iKTsKKworcmVzdGFydDoKKyAgaWYgKChyZXMgPSBnc3RfcnRzcHNyY19lbnN1cmVfb3BlbiAoc3JjLCBhc3luYykpIDwgMCkKKyAgICBnb3RvIG9wZW5fZmFpbGVkOworCisgIGlmICghKHNyYy0+bWV0aG9kcyAmIEdTVF9SVFNQX1BMQVkpKQorICAgIGdvdG8gbm90X3N1cHBvcnRlZDsKKworICBpZiAoc3JjLT5zdGF0ZSA9PSBHU1RfUlRTUF9TVEFURV9QTEFZSU5HKQorICAgIGdvdG8gd2FzX3BsYXlpbmc7CisKKyAgaWYgKCFzcmMtPmNvbm5pbmZvLmNvbm5lY3Rpb24gfHwgIXNyYy0+Y29ubmluZm8uY29ubmVjdGVkKQorICAgIGdvdG8gZG9uZTsKKworICAvKiBzZW5kIHNvbWUgZHVtbXkgcGFja2V0cyBiZWZvcmUgd2UgYWN0aXZhdGUgdGhlIHJlY2VpdmUgaW4gdGhlCisgICAqIHVkcCBzb3VyY2VzICovCisgIGdzdF9ydHNwc3JjX3NlbmRfZHVtbXlfcGFja2V0cyAoc3JjKTsKKworICAvKiByZXF1aXJlIG5ldyBTUiBwYWNrZXRzICovCisgIGlmIChzcmMtPm1hbmFnZXIpCisgICAgZ19zaWduYWxfZW1pdF9ieV9uYW1lIChzcmMtPm1hbmFnZXIsICJyZXNldC1zeW5jIiwgTlVMTCk7CisKKyAgLyogY29uc3RydWN0IGEgY29udHJvbCB1cmwgKi8KKyAgY29udHJvbCA9IGdldF9hZ2dyZWdhdGVfY29udHJvbCAoc3JjKTsKKworICBmb3IgKHdhbGsgPSBzcmMtPnN0cmVhbXM7IHdhbGs7IHdhbGsgPSBnX2xpc3RfbmV4dCAod2FsaykpIHsKKyAgICBHc3RSVFNQU3RyZWFtICpzdHJlYW0gPSAoR3N0UlRTUFN0cmVhbSAqKSB3YWxrLT5kYXRhOworICAgIGNvbnN0IGdjaGFyICpzZXR1cF91cmw7CisgICAgR3N0UlRTUENvbm5JbmZvICpjb25uaW5mbzsKKworICAgIC8qIHRyeSBhZ2dyZWdhdGUgY29udHJvbCBmaXJzdCBidXQgZG8gbm9uLWFnZ3JlZ2F0ZSBjb250cm9sIG90aGVyd2lzZSAqLworICAgIGlmIChjb250cm9sKQorICAgICAgc2V0dXBfdXJsID0gY29udHJvbDsKKyAgICBlbHNlIGlmICgoc2V0dXBfdXJsID0gc3RyZWFtLT5jb25uaW5mby5sb2NhdGlvbikgPT0gTlVMTCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKHNyYy0+Y29ubmluZm8uY29ubmVjdGlvbikgeworICAgICAgY29ubmluZm8gPSAmc3JjLT5jb25uaW5mbzsKKyAgICB9IGVsc2UgaWYgKHN0cmVhbS0+Y29ubmluZm8uY29ubmVjdGlvbikgeworICAgICAgY29ubmluZm8gPSAmc3RyZWFtLT5jb25uaW5mbzsKKyAgICB9IGVsc2UgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLyogZG8gcGxheSAqLworICAgIHJlcyA9IGdzdF9ydHNwc3JjX2luaXRfcmVxdWVzdCAoc3JjLCAmcmVxdWVzdCwgR1NUX1JUU1BfUExBWSwgc2V0dXBfdXJsKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgIGdvdG8gY3JlYXRlX3JlcXVlc3RfZmFpbGVkOworCisgICAgaWYgKHNyYy0+bmVlZF9yYW5nZSAmJiBzcmMtPnNlZWthYmxlID49IDAuMCkgeworICAgICAgaHZhbCA9IGdlbl9yYW5nZV9oZWFkZXIgKHNyYywgc2VnbWVudCk7CisKKyAgICAgIGdzdF9ydHNwX21lc3NhZ2VfdGFrZV9oZWFkZXIgKCZyZXF1ZXN0LCBHU1RfUlRTUF9IRFJfUkFOR0UsIGh2YWwpOworCisgICAgICAvKiBzdG9yZSB0aGUgbmV3c2VnbWVudCBldmVudCBzbyBpdCBjYW4gYmUgc2VudCBmcm9tIHRoZSBzdHJlYW1pbmcgdGhyZWFkLiAqLworICAgICAgc3JjLT5uZWVkX3NlZ21lbnQgPSBUUlVFOworICAgIH0KKworICAgIGlmIChzZWdtZW50LT5yYXRlICE9IDEuMCkgeworICAgICAgZ2NoYXIgaHZhbFtHX0FTQ0lJX0RUT1NUUl9CVUZfU0laRV07CisKKyAgICAgIGdfYXNjaWlfZHRvc3RyIChodmFsLCBzaXplb2YgKGh2YWwpLCBzZWdtZW50LT5yYXRlKTsKKyAgICAgIGlmIChzcmMtPnNraXApCisgICAgICAgIGdzdF9ydHNwX21lc3NhZ2VfYWRkX2hlYWRlciAoJnJlcXVlc3QsIEdTVF9SVFNQX0hEUl9TQ0FMRSwgaHZhbCk7CisgICAgICBlbHNlCisgICAgICAgIGdzdF9ydHNwX21lc3NhZ2VfYWRkX2hlYWRlciAoJnJlcXVlc3QsIEdTVF9SVFNQX0hEUl9TUEVFRCwgaHZhbCk7CisgICAgfQorCisgICAgaWYgKHNlZWtfc3R5bGUpCisgICAgICBnc3RfcnRzcF9tZXNzYWdlX2FkZF9oZWFkZXIgKCZyZXF1ZXN0LCBHU1RfUlRTUF9IRFJfU0VFS19TVFlMRSwKKyAgICAgICAgICBzZWVrX3N0eWxlKTsKKworICAgIGlmIChhc3luYykKKyAgICAgIEdTVF9FTEVNRU5UX1BST0dSRVNTIChzcmMsIENPTlRJTlVFLCAicmVxdWVzdCIsICgiU2VuZGluZyBQTEFZIHJlcXVlc3QiKSk7CisKKyAgICBpZiAoKHJlcyA9CisgICAgICAgICAgICBnc3RfcnRzcHNyY19zZW5kIChzcmMsIGNvbm5pbmZvLCAmcmVxdWVzdCwgJnJlc3BvbnNlLCBOVUxMLCBOVUxMKSkKKyAgICAgICAgPCAwKQorICAgICAgZ290byBzZW5kX2Vycm9yOworCisgICAgaWYgKHNyYy0+bmVlZF9yZWRpcmVjdCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLAorICAgICAgICAgICJyZWRpcmVjdDogdGVhcmluZyBkb3duIGFuZCByZXN0YXJ0aW5nIHdpdGggbmV3IHVybCIpOworICAgICAgLyogdGVhcmRvd24gYW5kIHJlc3RhcnQgd2l0aCBuZXcgdXJsICovCisgICAgICBnc3RfcnRzcHNyY19jbG9zZSAoc3JjLCBUUlVFLCBGQUxTRSk7CisgICAgICAvKiByZXNldCBwcm90b2NvbHMgdG8gZm9yY2UgcmUtbmVnb3RpYXRpb24gd2l0aCByZWRpcmVjdGVkIHVybCAqLworICAgICAgc3JjLT5jdXJfcHJvdG9jb2xzID0gc3JjLT5wcm90b2NvbHM7CisgICAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVxdWVzdCk7CisgICAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVzcG9uc2UpOworICAgICAgZ290byByZXN0YXJ0OworICAgIH0KKworICAgIC8qIHNlZWsgbWF5IGhhdmUgc2lsZW50bHkgZmFpbGVkIGFzIGl0IGlzIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICBpZiAoIShzcmMtPm1ldGhvZHMgJiBHU1RfUlRTUF9QTEFZKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiUExBWSBSYW5nZSBub3Qgc3VwcG9ydGVkOyByZS1lbmFibGUgUExBWSIpOworCisgICAgICBpZiAoc3JjLT52ZXJzaW9uID49IEdTVF9SVFNQX1ZFUlNJT05fMl8wICYmIHNyYy0+c2Vla2FibGUgPj0gMC4wKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiU2VydmVyIGRlY2xhcmVkIHN0cmVhbSBhcyBzZWVrYWJsZSBidXQiCisgICAgICAgICAgICAiIHBsYXlpbmcgd2l0aCByYW5nZSBmYWlsZWQuLi4gSWdub3JpbmcgaW5mb3JtYXRpb24uIik7CisgICAgICB9CisgICAgICAvKiBvYnZpb3VzbHkgaXQgaXMgc3VwcG9ydGVkIGFzIHdlIG1hZGUgaXQgaGVyZSAqLworICAgICAgc3JjLT5tZXRob2RzIHw9IEdTVF9SVFNQX1BMQVk7CisgICAgICBzcmMtPnNlZWthYmxlID0gLTEuMDsKKyAgICAgIC8qIGJ1dCB0aGVyZSBpcyBub3RoaW5nIHRvIHBhcnNlIGluIHRoZSByZXNwb25zZSwKKyAgICAgICAqIHNvIGNvbnZleSB3ZSBoYXZlIG5vIGlkZWEgYW5kIG5vdCB0byBleHBlY3QgYW55dGhpbmcgcGFydGljdWxhciAqLworICAgICAgY2xlYXJfcnRwX2Jhc2UgKHNyYywgc3RyZWFtKTsKKyAgICAgIGlmIChjb250cm9sKSB7CisgICAgICAgIEdMaXN0ICpydW47CisKKyAgICAgICAgLyogbmVlZCB0byBkbyBmb3IgYWxsIHN0cmVhbXMgKi8KKyAgICAgICAgZm9yIChydW4gPSBzcmMtPnN0cmVhbXM7IHJ1bjsgcnVuID0gZ19saXN0X25leHQgKHJ1bikpCisgICAgICAgICAgY2xlYXJfcnRwX2Jhc2UgKHNyYywgKEdzdFJUU1BTdHJlYW0gKikgcnVuLT5kYXRhKTsKKyAgICAgIH0KKyAgICAgIC8qIE5PVEUgdGhlIGFib3ZlIGFsc28gZGlzYWJsZXMgbnB0IGJhc2VkIGVvcyBkZXRlY3Rpb24gKi8KKyAgICAgIC8qIGFuZCBiZWxvdyBmb3JjZXMgcG9zaXRpb24gdG8gMCwKKyAgICAgICAqIHdoaWNoIGlzIHZpc2libGUgZmVlZGJhY2sgd2UgbG9zdCB0aGUgcGxvdCAqLworICAgICAgc2VnbWVudC0+c3RhcnQgPSBzZWdtZW50LT5wb3NpdGlvbiA9IHNyYy0+bGFzdF9wb3M7CisgICAgfQorCisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJnJlcXVlc3QpOworCisgICAgLyogcGFyc2UgUlRQIG5wdCBmaWVsZC4gVGhpcyBpcyB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtIChOb3JtYWwKKyAgICAgKiBQbGF5IFRpbWUpIGFuZCBzaG91bGQgYmUgcHV0IGluIHRoZSBORVdTRUdNRU5UIHBvc2l0aW9uIGZpZWxkLiAqLworICAgIGlmIChnc3RfcnRzcF9tZXNzYWdlX2dldF9oZWFkZXIgKCZyZXNwb25zZSwgR1NUX1JUU1BfSERSX1JBTkdFLCAmaHZhbCwKKyAgICAgICAgICAgIDApID09IEdTVF9SVFNQX09LKQorICAgICAgZ3N0X3J0c3BzcmNfcGFyc2VfcmFuZ2UgKHNyYywgaHZhbCwgc2VnbWVudCk7CisKKyAgICAvKiBhc3N1bWUgMS4wIHJhdGUgbm93LCBvdmVyd3JpdGUgd2hlbiB0aGUgU0NBTEUgb3IgU1BFRUQgaGVhZGVycyBhcmUgcHJlc2VudC4gKi8KKyAgICBzZWdtZW50LT5yYXRlID0gMS4wOworCisgICAgLyogcGFyc2UgU3BlZWQgaGVhZGVyLiBUaGlzIGlzIHRoZSBpbnRlbmRlZCBwbGF5YmFjayByYXRlIG9mIHRoZSBzdHJlYW0KKyAgICAgKiBhbmQgc2hvdWxkIGJlIHB1dCBpbiB0aGUgTkVXU0VHTUVOVCByYXRlIGZpZWxkLiAqLworICAgIGlmIChnc3RfcnRzcF9tZXNzYWdlX2dldF9oZWFkZXIgKCZyZXNwb25zZSwgR1NUX1JUU1BfSERSX1NQRUVELCAmaHZhbCwKKyAgICAgICAgICAgIDApID09IEdTVF9SVFNQX09LKSB7CisgICAgICBzZWdtZW50LT5yYXRlID0gZ3N0X3J0c3BzcmNfZ2V0X2Zsb2F0IChodmFsKTsKKyAgICB9IGVsc2UgaWYgKGdzdF9ydHNwX21lc3NhZ2VfZ2V0X2hlYWRlciAoJnJlc3BvbnNlLCBHU1RfUlRTUF9IRFJfU0NBTEUsCisgICAgICAgICAgICAmaHZhbCwgMCkgPT0gR1NUX1JUU1BfT0spIHsKKyAgICAgIHNlZ21lbnQtPnJhdGUgPSBnc3RfcnRzcHNyY19nZXRfZmxvYXQgKGh2YWwpOworICAgIH0KKworICAgIC8qIHBhcnNlIHRoZSBSVFAtSW5mbyBoZWFkZXIgZmllbGQgKGlmIEFOWSkgdG8gZ2V0IHRoZSBiYXNlIHNlcW51bSBhbmQgdGltZXN0YW1wCisgICAgICogZm9yIHRoZSBSVFAgcGFja2V0cy4gSWYgdGhpcyBpcyBub3QgcHJlc2VudCwgd2UgYXNzdW1lIGFsbCBzdGFydHMgZnJvbSAwLi4uCisgICAgICogVGhpcyBpcyBpbmZvIGZvciB0aGUgUlRQIHNlc3Npb24gbWFuYWdlciB0aGF0IHdlIHBhc3MgdG8gaXQgaW4gY2Fwcy4gKi8KKyAgICBodmFsX2lkeCA9IDA7CisgICAgd2hpbGUgKGdzdF9ydHNwX21lc3NhZ2VfZ2V0X2hlYWRlciAoJnJlc3BvbnNlLCBHU1RfUlRTUF9IRFJfUlRQX0lORk8sCisgICAgICAgICAgICAmaHZhbCwgaHZhbF9pZHgrKykgPT0gR1NUX1JUU1BfT0spCisgICAgICBnc3RfcnRzcHNyY19wYXJzZV9ydHBpbmZvIChzcmMsIGh2YWwpOworCisgICAgLyogc29tZSBzZXJ2ZXJzIGluZGljYXRlIFJUQ1AgcGFyYW1ldGVycyBpbiBQTEFZIHJlc3BvbnNlLAorICAgICAqIHJhdGhlciB0aGFuIHByb3Blcmx5IGluIFNEUCAqLworICAgIGlmIChnc3RfcnRzcF9tZXNzYWdlX2dldF9oZWFkZXIgKCZyZXNwb25zZSwgR1NUX1JUU1BfSERSX1JUQ1BfSU5URVJWQUwsCisgICAgICAgICAgICAmaHZhbCwgMCkgPT0gR1NUX1JUU1BfT0spCisgICAgICBnc3RfcnRzcHNyY19oYW5kbGVfcnRjcF9pbnRlcnZhbCAoc3JjLCBodmFsKTsKKworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXNwb25zZSk7CisKKyAgICAvKiBlYXJseSBleGl0IHdoZW4gd2UgZGlkIGFnZ3JlZ2F0ZSBjb250cm9sICovCisgICAgaWYgKGNvbnRyb2wpCisgICAgICBicmVhazsKKyAgfQorICAvKiBjb25maWd1cmUgdGhlIGNhcHMgb2YgdGhlIHN0cmVhbXMgYWZ0ZXIgd2UgcGFyc2VkIGFsbCBoZWFkZXJzLiBPbmx5IHJlc2V0CisgICAqIHRoZSBtYW5hZ2VyIG9iamVjdCB3aGVuIHdlIHNldCBhIG5ldyBSYW5nZSBoZWFkZXIgKHdlIGRpZCBhIHNlZWspICovCisgIGdzdF9ydHNwc3JjX2NvbmZpZ3VyZV9jYXBzIChzcmMsIHNlZ21lbnQsIHNyYy0+bmVlZF9yYW5nZSk7CisKKyAgLyogc2V0IHRvIFBMQVlJTkcgYWZ0ZXIgd2UgaGF2ZSBjb25maWd1cmVkIHRoZSBjYXBzLCBvdGhlcndpc2Ugd2UKKyAgICogbWlnaHQgZW5kIHVwIGNhbGxpbmcgcmVxdWVzdF9rZXkgKHdpdGggU1JUUCkgd2hpbGUgY2FwcyBhcmUgc3RpbGwKKyAgICogYmVpbmcgY29uZmlndXJlZC4gKi8KKyAgZ3N0X3J0c3BzcmNfc2V0X3N0YXRlIChzcmMsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICAvKiBzZXQgYWdhaW4gd2hlbiBuZWVkZWQgKi8KKyAgc3JjLT5uZWVkX3JhbmdlID0gRkFMU0U7CisKKyAgc3JjLT5ydW5uaW5nID0gVFJVRTsKKyAgc3JjLT5iYXNlX3RpbWUgPSAtMTsKKyAgc3JjLT5zdGF0ZSA9IEdTVF9SVFNQX1NUQVRFX1BMQVlJTkc7CisKKyAgLyogbWFyayBkaXNjb250ICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIm1hcmsgRElTQ09OVCwgd2UgZGlkIGEgc2VlayB0byBhbm90aGVyIHBvc2l0aW9uIik7CisgIGZvciAod2FsayA9IHNyYy0+c3RyZWFtczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BTdHJlYW0gKnN0cmVhbSA9IChHc3RSVFNQU3RyZWFtICopIHdhbGstPmRhdGE7CisgICAgc3RyZWFtLT5kaXNjb250ID0gVFJVRTsKKyAgfQorCitkb25lOgorICBpZiAoYXN5bmMpCisgICAgZ3N0X3J0c3BzcmNfbG9vcF9lbmRfY21kIChzcmMsIENNRF9QTEFZLCByZXMpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitvcGVuX2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImZhaWxlZCB0byBvcGVuIHN0cmVhbSIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorbm90X3N1cHBvcnRlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIlBMQVkgaXMgbm90IHN1cHBvcnRlZCIpOworICAgIGdvdG8gZG9uZTsKKyAgfQord2FzX3BsYXlpbmc6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJ3ZSB3ZXJlIGFscmVhZHkgUExBWUlORyIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorY3JlYXRlX3JlcXVlc3RfZmFpbGVkOgorICB7CisgICAgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0cnJlc3VsdCAocmVzKTsKKworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIExJQlJBUlksIElOSVQsIChOVUxMKSwKKyAgICAgICAgKCJDb3VsZCBub3QgY3JlYXRlIHJlcXVlc3QuICglcykiLCBzdHIpKTsKKyAgICBnX2ZyZWUgKHN0cik7CisgICAgZ290byBkb25lOworICB9CitzZW5kX2Vycm9yOgorICB7CisgICAgZ2NoYXIgKnN0ciA9IGdzdF9ydHNwX3N0cnJlc3VsdCAocmVzKTsKKworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXF1ZXN0KTsKKyAgICBpZiAocmVzICE9IEdTVF9SVFNQX0VJTlRSKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgV1JJVEUsIChOVUxMKSwKKyAgICAgICAgICAoIkNvdWxkIG5vdCBzZW5kIG1lc3NhZ2UuICglcykiLCBzdHIpKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJQTEFZIGludGVycnVwdGVkIik7CisgICAgfQorICAgIGdfZnJlZSAoc3RyKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIEdzdFJUU1BSZXN1bHQKK2dzdF9ydHNwc3JjX3BhdXNlIChHc3RSVFNQU3JjICogc3JjLCBnYm9vbGVhbiBhc3luYykKK3sKKyAgR3N0UlRTUFJlc3VsdCByZXMgPSBHU1RfUlRTUF9PSzsKKyAgR3N0UlRTUE1lc3NhZ2UgcmVxdWVzdCA9IHsgMCB9OworICBHc3RSVFNQTWVzc2FnZSByZXNwb25zZSA9IHsgMCB9OworICBHTGlzdCAqd2FsazsKKyAgY29uc3QgZ2NoYXIgKmNvbnRyb2w7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiUEFVU0UuLi4iKTsKKworICBpZiAoKHJlcyA9IGdzdF9ydHNwc3JjX2Vuc3VyZV9vcGVuIChzcmMsIGFzeW5jKSkgPCAwKQorICAgIGdvdG8gb3Blbl9mYWlsZWQ7CisKKyAgaWYgKCEoc3JjLT5tZXRob2RzICYgR1NUX1JUU1BfUEFVU0UpKQorICAgIGdvdG8gbm90X3N1cHBvcnRlZDsKKworICBpZiAoc3JjLT5zdGF0ZSA9PSBHU1RfUlRTUF9TVEFURV9SRUFEWSkKKyAgICBnb3RvIHdhc19wYXVzZWQ7CisKKyAgaWYgKCFzcmMtPmNvbm5pbmZvLmNvbm5lY3Rpb24gfHwgIXNyYy0+Y29ubmluZm8uY29ubmVjdGVkKQorICAgIGdvdG8gbm9fY29ubmVjdGlvbjsKKworICAvKiBjb25zdHJ1Y3QgYSBjb250cm9sIHVybCAqLworICBjb250cm9sID0gZ2V0X2FnZ3JlZ2F0ZV9jb250cm9sIChzcmMpOworCisgIC8qIGxvb3Agb3ZlciB0aGUgc3RyZWFtcy4gV2UgbWlnaHQgZXhpdCB0aGUgbG9vcCBlYXJseSB3aGVuIHdlIGNvdWxkIGRvIGFuCisgICAqIGFnZ3JlZ2F0ZSBjb250cm9sICovCisgIGZvciAod2FsayA9IHNyYy0+c3RyZWFtczsgd2Fsazsgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKSkgeworICAgIEdzdFJUU1BTdHJlYW0gKnN0cmVhbSA9IChHc3RSVFNQU3RyZWFtICopIHdhbGstPmRhdGE7CisgICAgR3N0UlRTUENvbm5JbmZvICpjb25uaW5mbzsKKyAgICBjb25zdCBnY2hhciAqc2V0dXBfdXJsOworCisgICAgLyogdHJ5IGFnZ3JlZ2F0ZSBjb250cm9sIGZpcnN0IGJ1dCBkbyBub24tYWdncmVnYXRlIGNvbnRyb2wgb3RoZXJ3aXNlICovCisgICAgaWYgKGNvbnRyb2wpCisgICAgICBzZXR1cF91cmwgPSBjb250cm9sOworICAgIGVsc2UgaWYgKChzZXR1cF91cmwgPSBzdHJlYW0tPmNvbm5pbmZvLmxvY2F0aW9uKSA9PSBOVUxMKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoc3JjLT5jb25uaW5mby5jb25uZWN0aW9uKSB7CisgICAgICBjb25uaW5mbyA9ICZzcmMtPmNvbm5pbmZvOworICAgIH0gZWxzZSBpZiAoc3RyZWFtLT5jb25uaW5mby5jb25uZWN0aW9uKSB7CisgICAgICBjb25uaW5mbyA9ICZzdHJlYW0tPmNvbm5pbmZvOworICAgIH0gZWxzZSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAoYXN5bmMpCisgICAgICBHU1RfRUxFTUVOVF9QUk9HUkVTUyAoc3JjLCBDT05USU5VRSwgInJlcXVlc3QiLAorICAgICAgICAgICgiU2VuZGluZyBQQVVTRSByZXF1ZXN0IikpOworCisgICAgaWYgKChyZXMgPQorICAgICAgICAgICAgZ3N0X3J0c3BzcmNfaW5pdF9yZXF1ZXN0IChzcmMsICZyZXF1ZXN0LCBHU1RfUlRTUF9QQVVTRSwKKyAgICAgICAgICAgICAgICBzZXR1cF91cmwpKSA8IDApCisgICAgICBnb3RvIGNyZWF0ZV9yZXF1ZXN0X2ZhaWxlZDsKKworICAgIGlmICgocmVzID0KKyAgICAgICAgICAgIGdzdF9ydHNwc3JjX3NlbmQgKHNyYywgY29ubmluZm8sICZyZXF1ZXN0LCAmcmVzcG9uc2UsIE5VTEwsCisgICAgICAgICAgICAgICAgTlVMTCkpIDwgMCkKKyAgICAgIGdvdG8gc2VuZF9lcnJvcjsKKworICAgIGdzdF9ydHNwX21lc3NhZ2VfdW5zZXQgKCZyZXF1ZXN0KTsKKyAgICBnc3RfcnRzcF9tZXNzYWdlX3Vuc2V0ICgmcmVzcG9uc2UpOworCisgICAgLyogZXhpdCBlYXJseSB3aGVuIHdlIGRpZCBhZ3JlZ2F0ZSBjb250cm9sICovCisgICAgaWYgKGNvbnRyb2wpCisgICAgICBicmVhazsKKyAgfQorCisgIC8qIGNoYW5nZSBlbGVtZW50IHN0YXRlcyBub3cgKi8KKyAgZ3N0X3J0c3BzcmNfc2V0X3N0YXRlIChzcmMsIEdTVF9TVEFURV9QQVVTRUQpOworCitub19jb25uZWN0aW9uOgorICBzcmMtPnN0YXRlID0gR1NUX1JUU1BfU1RBVEVfUkVBRFk7CisKK2RvbmU6CisgIGlmIChhc3luYykKKyAgICBnc3RfcnRzcHNyY19sb29wX2VuZF9jbWQgKHNyYywgQ01EX1BBVVNFLCByZXMpOworCisgIHJldHVybiByZXM7CisKKyAgLyogRVJST1JTICovCitvcGVuX2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImZhaWxlZCB0byBvcGVuIHN0cmVhbSIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorbm90X3N1cHBvcnRlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIlBBVVNFIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3dhc19wYXVzZWQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJ3ZSB3ZXJlIGFscmVhZHkgUEFVU0VEIik7CisgICAgZ290byBkb25lOworICB9CitjcmVhdGVfcmVxdWVzdF9mYWlsZWQ6CisgIHsKKyAgICBnY2hhciAqc3RyID0gZ3N0X3J0c3Bfc3RycmVzdWx0IChyZXMpOworCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgTElCUkFSWSwgSU5JVCwgKE5VTEwpLAorICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgcmVxdWVzdC4gKCVzKSIsIHN0cikpOworICAgIGdfZnJlZSAoc3RyKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK3NlbmRfZXJyb3I6CisgIHsKKyAgICBnY2hhciAqc3RyID0gZ3N0X3J0c3Bfc3RycmVzdWx0IChyZXMpOworCisgICAgZ3N0X3J0c3BfbWVzc2FnZV91bnNldCAoJnJlcXVlc3QpOworICAgIGlmIChyZXMgIT0gR1NUX1JUU1BfRUlOVFIpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBXUklURSwgKE5VTEwpLAorICAgICAgICAgICgiQ291bGQgbm90IHNlbmQgbWVzc2FnZS4gKCVzKSIsIHN0cikpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgIlBBVVNFIGludGVycnVwdGVkIik7CisgICAgfQorICAgIGdfZnJlZSAoc3RyKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX2hhbmRsZV9tZXNzYWdlIChHc3RCaW4gKiBiaW4sIEdzdE1lc3NhZ2UgKiBtZXNzYWdlKQoreworICBHc3RSVFNQU3JjICpydHNwc3JjOworCisgIHJ0c3BzcmMgPSBHU1RfUlRTUFNSQyAoYmluKTsKKworICBzd2l0Y2ggKEdTVF9NRVNTQUdFX1RZUEUgKG1lc3NhZ2UpKSB7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FT1M6CisgICAgICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VMRU1FTlQ6CisgICAgeworICAgICAgY29uc3QgR3N0U3RydWN0dXJlICpzID0gZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobWVzc2FnZSk7CisKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiR3N0VURQU3JjVGltZW91dCIpKSB7CisgICAgICAgIGdib29sZWFuIGlnbm9yZV90aW1lb3V0OworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJpbiwgInRpbWVvdXQgb24gVURQIHBvcnQiKTsKKworICAgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHJ0c3BzcmMpOworICAgICAgICBpZ25vcmVfdGltZW91dCA9IHJ0c3BzcmMtPmlnbm9yZV90aW1lb3V0OworICAgICAgICBydHNwc3JjLT5pZ25vcmVfdGltZW91dCA9IFRSVUU7CisgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChydHNwc3JjKTsKKworICAgICAgICAvKiB3ZSBvbmx5IGFjdCBvbiB0aGUgZmlyc3QgdWRwIHRpbWVvdXQgbWVzc2FnZSwgb3RoZXJzIGFyZSBpcnJlbGV2YW50CisgICAgICAgICAqIGFuZCBjYW4gYmUgaWdub3JlZC4gKi8KKyAgICAgICAgaWYgKCFpZ25vcmVfdGltZW91dCkKKyAgICAgICAgICBnc3RfcnRzcHNyY19sb29wX3NlbmRfY21kIChydHNwc3JjLCBDTURfUkVDT05ORUNULCBDTURfTE9PUCk7CisgICAgICAgIC8qIGVhdCBhbmQgZnJlZSAqLworICAgICAgICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIEdTVF9CSU5fQ0xBU1MgKHBhcmVudF9jbGFzcyktPmhhbmRsZV9tZXNzYWdlIChiaW4sIG1lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6CisgICAgeworICAgICAgR3N0T2JqZWN0ICp1ZHBzcmM7CisgICAgICBHc3RSVFNQU3RyZWFtICpzdHJlYW07CisgICAgICBHc3RGbG93UmV0dXJuIHJldDsKKworICAgICAgdWRwc3JjID0gR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocnRzcHNyYywgImdvdCBlcnJvciBmcm9tICVzIiwKKyAgICAgICAgICBHU1RfRUxFTUVOVF9OQU1FICh1ZHBzcmMpKTsKKworICAgICAgc3RyZWFtID0gZmluZF9zdHJlYW0gKHJ0c3BzcmMsIHVkcHNyYywgKGdwb2ludGVyKSBmaW5kX3N0cmVhbV9ieV91ZHBzcmMpOworICAgICAgaWYgKCFzdHJlYW0pCisgICAgICAgIGdvdG8gZm9yd2FyZDsKKworICAgICAgLyogd2UgaWdub3JlIHRoZSBSVENQIHVkcHNyYyAqLworICAgICAgaWYgKHN0cmVhbS0+dWRwc3JjWzFdID09IEdTVF9FTEVNRU5UX0NBU1QgKHVkcHNyYykpCisgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgLyogaWYgd2UgZ2V0IGVycm9yIG1lc3NhZ2VzIGZyb20gdGhlIHVkcCBzb3VyY2VzLCB0aGF0J3Mgbm90IGEgcHJvYmxlbSBhcworICAgICAgICogbG9uZyBhcyBub3QgYWxsIG9mIHRoZW0gZXJyb3Igb3V0LiBXZSBhbHNvIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGhlCisgICAgICAgKiBwcm9ibGVtIGlzLCB0aGUgbWVzc2FnZSBkb2VzIG5vdCBnaXZlIGVub3VnaCBkZXRhaWwuLi4gKi8KKyAgICAgIHJldCA9IGdzdF9ydHNwc3JjX2NvbWJpbmVfZmxvd3MgKHJ0c3BzcmMsIHN0cmVhbSwgR1NUX0ZMT1dfTk9UX0xJTktFRCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChydHNwc3JjLCAiY29tYmluZWQgZmxvd3M6ICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBmb3J3YXJkOworCisgICAgZG9uZToKKyAgICAgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIGJyZWFrOworCisgICAgZm9yd2FyZDoKKyAgICAgIC8qIGZhdGFsIGJ1dCBub3Qgb3VyIG1lc3NhZ2UsIGZvcndhcmQgKi8KKyAgICAgIEdTVF9CSU5fQ0xBU1MgKHBhcmVudF9jbGFzcyktPmhhbmRsZV9tZXNzYWdlIChiaW4sIG1lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgeworICAgICAgR1NUX0JJTl9DTEFTUyAocGFyZW50X2NsYXNzKS0+aGFuZGxlX21lc3NhZ2UgKGJpbiwgbWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworLyogdGhlIHRocmVhZCB3aGVyZSBldmVyeXRoaW5nIGhhcHBlbnMgKi8KK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY190aHJlYWQgKEdzdFJUU1BTcmMgKiBzcmMpCit7CisgIGdpbnQgY21kOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoc3JjKTsKKyAgY21kID0gc3JjLT5wZW5kaW5nX2NtZDsKKyAgaWYgKGNtZCA9PSBDTURfUkVDT05ORUNUIHx8IGNtZCA9PSBDTURfUExBWSB8fCBjbWQgPT0gQ01EX1BBVVNFCisgICAgICB8fCBjbWQgPT0gQ01EX0xPT1AgfHwgY21kID09IENNRF9PUEVOKQorICAgIHNyYy0+cGVuZGluZ19jbWQgPSBDTURfTE9PUDsKKyAgZWxzZQorICAgIHNyYy0+cGVuZGluZ19jbWQgPSBDTURfV0FJVDsKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZ290IGNvbW1hbmQgJXMiLCBjbWRfdG9fc3RyaW5nIChjbWQpKTsKKworICAvKiB3ZSBnb3QgdGhlIG1lc3NhZ2UgY29tbWFuZCwgc28gZW5zdXJlIGNvbW11bmljYXRpb24gaXMgcG9zc2libGUgYWdhaW4gKi8KKyAgZ3N0X3J0c3BzcmNfY29ubmVjdGlvbl9mbHVzaCAoc3JjLCBGQUxTRSk7CisKKyAgc3JjLT5idXN5X2NtZCA9IGNtZDsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisKKyAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIENNRF9PUEVOOgorICAgICAgZ3N0X3J0c3BzcmNfb3BlbiAoc3JjLCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX1BMQVk6CisgICAgICBnc3RfcnRzcHNyY19wbGF5IChzcmMsICZzcmMtPnNlZ21lbnQsIFRSVUUsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfUEFVU0U6CisgICAgICBnc3RfcnRzcHNyY19wYXVzZSAoc3JjLCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX0NMT1NFOgorICAgICAgZ3N0X3J0c3BzcmNfY2xvc2UgKHNyYywgVFJVRSwgRkFMU0UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfTE9PUDoKKyAgICAgIGdzdF9ydHNwc3JjX2xvb3AgKHNyYyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENNRF9SRUNPTk5FQ1Q6CisgICAgICBnc3RfcnRzcHNyY19yZWNvbm5lY3QgKHNyYywgRkFMU0UpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworICAvKiBhbmQgZ28gYmFjayB0byBzbGVlcCAqLworICBpZiAoc3JjLT5wZW5kaW5nX2NtZCA9PSBDTURfV0FJVCkgeworICAgIGlmIChzcmMtPnRhc2spCisgICAgICBnc3RfdGFza19wYXVzZSAoc3JjLT50YXNrKTsKKyAgfQorICAvKiByZXNldCB3YWl0aW5nICovCisgIHNyYy0+YnVzeV9jbWQgPSBDTURfV0FJVDsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfc3RhcnQgKEdzdFJUU1BTcmMgKiBzcmMpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInN0YXJ0aW5nIik7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzcmMpOworCisgIHNyYy0+cGVuZGluZ19jbWQgPSBDTURfV0FJVDsKKworICBpZiAoc3JjLT50YXNrID09IE5VTEwpIHsKKyAgICBzcmMtPnRhc2sgPSBnc3RfdGFza19uZXcgKChHc3RUYXNrRnVuY3Rpb24pIGdzdF9ydHNwc3JjX3RocmVhZCwgc3JjLCBOVUxMKTsKKyAgICBpZiAoc3JjLT50YXNrID09IE5VTEwpCisgICAgICBnb3RvIHRhc2tfZXJyb3I7CisKKyAgICBnc3RfdGFza19zZXRfbG9jayAoc3JjLT50YXNrLCBHU1RfUlRTUF9TVFJFQU1fR0VUX0xPQ0sgKHNyYykpOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcmMpOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLwordGFza19lcnJvcjoKKyAgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzcmMpOworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNyYywgImZhaWxlZCB0byBjcmVhdGUgdGFzayIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9ydHNwc3JjX3N0b3AgKEdzdFJUU1BTcmMgKiBzcmMpCit7CisgIEdzdFRhc2sgKnRhc2s7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAic3RvcHBpbmciKTsKKworICAvKiBhbHNvIGNhbmNlbHMgcGVuZGluZyB0YXNrICovCisgIGdzdF9ydHNwc3JjX2xvb3Bfc2VuZF9jbWQgKHNyYywgQ01EX1dBSVQsIENNRF9BTEwpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoc3JjKTsKKyAgaWYgKCh0YXNrID0gc3JjLT50YXNrKSkgeworICAgIHNyYy0+dGFzayA9IE5VTEw7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisKKyAgICBnc3RfdGFza19zdG9wICh0YXNrKTsKKworICAgIC8qIG1ha2Ugc3VyZSBpdCBpcyBub3QgcnVubmluZyAqLworICAgIEdTVF9SVFNQX1NUUkVBTV9MT0NLIChzcmMpOworICAgIEdTVF9SVFNQX1NUUkVBTV9VTkxPQ0sgKHNyYyk7CisKKyAgICAvKiBub3cgd2FpdCBmb3IgdGhlIHRhc2sgdG8gZmluaXNoICovCisgICAgZ3N0X3Rhc2tfam9pbiAodGFzayk7CisKKyAgICAvKiBhbmQgZnJlZSB0aGUgdGFzayAqLworICAgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKHRhc2spKTsKKworICAgIEdTVF9PQkpFQ1RfTE9DSyAoc3JjKTsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoc3JjKTsKKworICAvKiBlbnN1cmUgc3luY2hyb25vdXNseSBhbGwgaXMgY2xvc2VkIGFuZCBjbGVhbiAqLworICBnc3RfcnRzcHNyY19jbG9zZSAoc3JjLCBGQUxTRSwgVFJVRSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3J0c3BzcmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0UlRTUFNyYyAqcnRzcHNyYzsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHJ0c3BzcmMgPSBHU1RfUlRTUFNSQyAoZWxlbWVudCk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICBpZiAoIWdzdF9ydHNwc3JjX3N0YXJ0IChydHNwc3JjKSkKKyAgICAgICAgZ290byBzdGFydF9mYWlsZWQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgLyogaW5pdCBzb21lIHN0YXRlICovCisgICAgICBydHNwc3JjLT5jdXJfcHJvdG9jb2xzID0gcnRzcHNyYy0+cHJvdG9jb2xzOworICAgICAgLyogZmlyc3QgYXR0ZW1wdCwgZG9uJ3QgaWdub3JlIHRpbWVvdXRzICovCisgICAgICBydHNwc3JjLT5pZ25vcmVfdGltZW91dCA9IEZBTFNFOworICAgICAgcnRzcHNyYy0+b3Blbl9lcnJvciA9IEZBTFNFOworICAgICAgZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCAocnRzcHNyYywgQ01EX09QRU4sIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19QTEFZSU5HOgorICAgICAgc2V0X21hbmFnZXJfYnVmZmVyX21vZGUgKHJ0c3BzcmMpOworICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgLyogdW5ibG9jayB0aGUgdGNwIHRhc2tzIGFuZCBtYWtlIHRoZSBsb29wIHdhaXRpbmcgKi8KKyAgICAgIGlmIChnc3RfcnRzcHNyY19sb29wX3NlbmRfY21kIChydHNwc3JjLCBDTURfV0FJVCwgQ01EX0xPT1ApKSB7CisgICAgICAgIC8qIG1ha2Ugc3VyZSBpdCBpcyB3YWl0aW5nIGJlZm9yZSB3ZSBzZW5kIFBBVVNFIG9yIFBMQVkgYmVsb3cgKi8KKyAgICAgICAgR1NUX1JUU1BfU1RSRUFNX0xPQ0sgKHJ0c3BzcmMpOworICAgICAgICBHU1RfUlRTUF9TVFJFQU1fVU5MT0NLIChydHNwc3JjKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKyAgaWYgKHJldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpCisgICAgZ290byBkb25lOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfTk9fUFJFUk9MTDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUExBWUlORzoKKyAgICAgIGdzdF9ydHNwc3JjX2xvb3Bfc2VuZF9jbWQgKHJ0c3BzcmMsIENNRF9QTEFZLCAwKTsKKyAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QTEFZSU5HX1RPX1BBVVNFRDoKKyAgICAgIC8qIHNlbmQgcGF1c2UgcmVxdWVzdCBhbmQga2VlcCB0aGUgaWRsZSB0YXNrIGFyb3VuZCAqLworICAgICAgZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCAocnRzcHNyYywgQ01EX1BBVVNFLCBDTURfTE9PUCk7CisgICAgICByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX05PX1BSRVJPTEw7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3J0c3BzcmNfbG9vcF9zZW5kX2NtZCAocnRzcHNyYywgQ01EX0NMT1NFLCBDTURfQUxMKTsKKyAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgZ3N0X3J0c3BzcmNfc3RvcCAocnRzcHNyYyk7CisgICAgICByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1M7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogT3RoZXJ3aXNlIGl0J3Mgc3VjY2Vzcywgd2UgZG9uJ3Qgd2FudCB0byByZXR1cm4gc3B1cmlvdXMKKyAgICAgICAqIE5PX1BSRVJPTEwgb3IgQVNZTkMgZnJvbSBpbnRlcm5hbCBlbGVtZW50cyBhcyB3ZSBjYXJlIGZvcgorICAgICAgICogc3RhdGUgY2hhbmdlcyBvdXJzZWx2ZXMgaGVyZQorICAgICAgICoKKyAgICAgICAqIFRoaXMgaXMgdG8gY2F0Y2ggUEFVU0VELT5QQVVTRUQgYW5kIFBMQVlJTkctPlBMQVlJTkcgdHJhbnNpdGlvbnMuCisgICAgICAgKi8KKyAgICAgIGlmIChHU1RfU1RBVEVfVFJBTlNJVElPTl9ORVhUICh0cmFuc2l0aW9uKSA9PSBHU1RfU1RBVEVfUEFVU0VEKQorICAgICAgICByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX05PX1BSRVJPTEw7CisgICAgICBlbHNlCisgICAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUzsKKyAgICAgIGJyZWFrOworICB9CisKK2RvbmU6CisgIHJldHVybiByZXQ7CisKK3N0YXJ0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHJ0c3BzcmMsICJzdGFydCBmYWlsZWQiKTsKKyAgICByZXR1cm4gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3J0c3BzcmNfc2VuZF9ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlczsKKyAgR3N0UlRTUFNyYyAqcnRzcHNyYzsKKworICBydHNwc3JjID0gR1NUX1JUU1BTUkMgKGVsZW1lbnQpOworCisgIGlmIChHU1RfRVZFTlRfSVNfRE9XTlNUUkVBTSAoZXZlbnQpKSB7CisgICAgcmVzID0gZ3N0X3J0c3BzcmNfcHVzaF9ldmVudCAocnRzcHNyYywgZXZlbnQpOworICB9IGVsc2UgeworICAgIHJlcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zZW5kX2V2ZW50IChlbGVtZW50LCBldmVudCk7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCisKKy8qKiogR1NUVVJJSEFORExFUiBJTlRFUkZBQ0UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIEdzdFVSSVR5cGUKK2dzdF9ydHNwc3JjX3VyaV9nZXRfdHlwZSAoR1R5cGUgdHlwZSkKK3sKKyAgcmV0dXJuIEdTVF9VUklfU1JDOworfQorCitzdGF0aWMgY29uc3QgZ2NoYXIgKmNvbnN0ICoKK2dzdF9ydHNwc3JjX3VyaV9nZXRfcHJvdG9jb2xzIChHVHlwZSB0eXBlKQoreworICBzdGF0aWMgY29uc3QgZ2NoYXIgKnByb3RvY29sc1tdID0KKyAgICAgIHsgInJ0c3AiLCAicnRzcHUiLCAicnRzcHQiLCAicnRzcGgiLCAicnRzcC1zZHAiLAorICAgICJydHNwcyIsICJydHNwc3UiLCAicnRzcHN0IiwgInJ0c3BzaCIsIE5VTEwKKyAgfTsKKworICByZXR1cm4gcHJvdG9jb2xzOworfQorCitzdGF0aWMgZ2NoYXIgKgorZ3N0X3J0c3BzcmNfdXJpX2dldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyKQoreworICBHc3RSVFNQU3JjICpzcmMgPSBHU1RfUlRTUFNSQyAoaGFuZGxlcik7CisKKyAgLyogRklYTUU6IG1ha2UgdGhyZWFkLXNhZmUgKi8KKyAgcmV0dXJuIGdfc3RyZHVwIChzcmMtPmNvbm5pbmZvLmxvY2F0aW9uKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfcnRzcHNyY191cmlfc2V0X3VyaSAoR3N0VVJJSGFuZGxlciAqIGhhbmRsZXIsIGNvbnN0IGdjaGFyICogdXJpLAorICAgIEdFcnJvciAqKiBlcnJvcikKK3sKKyAgR3N0UlRTUFNyYyAqc3JjOworICBHc3RSVFNQUmVzdWx0IHJlczsKKyAgR3N0U0RQUmVzdWx0IHNyZXM7CisgIEdzdFJUU1BVcmwgKm5ld3VybCA9IE5VTEw7CisgIEdzdFNEUE1lc3NhZ2UgKnNkcCA9IE5VTEw7CisKKyAgc3JjID0gR1NUX1JUU1BTUkMgKGhhbmRsZXIpOworCisgIC8qIHNhbWUgVVJJLCB3ZSdyZSBmaW5lICovCisgIGlmIChzcmMtPmNvbm5pbmZvLmxvY2F0aW9uICYmIHVyaSAmJiAhc3RyY21wICh1cmksIHNyYy0+Y29ubmluZm8ubG9jYXRpb24pKQorICAgIGdvdG8gd2FzX29rOworCisgIGlmIChnX3N0cl9oYXNfcHJlZml4ICh1cmksICJydHNwLXNkcDovLyIpKSB7CisgICAgc3JlcyA9IGdzdF9zZHBfbWVzc2FnZV9uZXcgKCZzZHApOworICAgIGlmIChzcmVzIDwgMCkKKyAgICAgIGdvdG8gc2RwX2ZhaWxlZDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInBhcnNpbmcgU0RQIG1lc3NhZ2UiKTsKKyAgICBzcmVzID0gZ3N0X3NkcF9tZXNzYWdlX3BhcnNlX3VyaSAodXJpLCBzZHApOworICAgIGlmIChzcmVzIDwgMCkKKyAgICAgIGdvdG8gaW52YWxpZF9zZHA7CisgIH0gZWxzZSB7CisgICAgLyogdHJ5IHRvIHBhcnNlICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicGFyc2luZyBVUkkiKTsKKyAgICBpZiAoKHJlcyA9IGdzdF9ydHNwX3VybF9wYXJzZSAodXJpLCAmbmV3dXJsKSkgPCAwKQorICAgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgfQorCisgIC8qIGlmIHdvcmtlZCwgZnJlZSBwcmV2aW91cyBhbmQgc3RvcmUgbmV3IHVybCBvYmplY3QgYWxvbmcgd2l0aCB0aGUgb3JpZ2luYWwKKyAgICogbG9jYXRpb24uICovCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImNvbmZpZ3VyaW5nIFVSSSIpOworICBnX2ZyZWUgKHNyYy0+Y29ubmluZm8ubG9jYXRpb24pOworICBzcmMtPmNvbm5pbmZvLmxvY2F0aW9uID0gZ19zdHJkdXAgKHVyaSk7CisgIGdzdF9ydHNwX3VybF9mcmVlIChzcmMtPmNvbm5pbmZvLnVybCk7CisgIHNyYy0+Y29ubmluZm8udXJsID0gbmV3dXJsOworICBnX2ZyZWUgKHNyYy0+Y29ubmluZm8udXJsX3N0cik7CisgIGlmIChuZXd1cmwpCisgICAgc3JjLT5jb25uaW5mby51cmxfc3RyID0gZ3N0X3J0c3BfdXJsX2dldF9yZXF1ZXN0X3VyaSAoc3JjLT5jb25uaW5mby51cmwpOworICBlbHNlCisgICAgc3JjLT5jb25uaW5mby51cmxfc3RyID0gTlVMTDsKKworICBpZiAoc3JjLT5zZHApCisgICAgZ3N0X3NkcF9tZXNzYWdlX2ZyZWUgKHNyYy0+c2RwKTsKKyAgc3JjLT5zZHAgPSBzZHA7CisgIHNyYy0+ZnJvbV9zZHAgPSBzZHAgIT0gTlVMTDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJzZXQgdXJpOiAlcyIsIEdTVF9TVFJfTlVMTCAodXJpKSk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgInJlcXVlc3QgdXJpIGlzOiAlcyIsCisgICAgICBHU1RfU1RSX05VTEwgKHNyYy0+Y29ubmluZm8udXJsX3N0cikpOworCisgIHJldHVybiBUUlVFOworCisgIC8qIFNwZWNpYWwgY2FzZXMgKi8KK3dhc19vazoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIlVSSSB3YXMgb2s6ICclcyciLCBHU1RfU1RSX05VTEwgKHVyaSkpOworICAgIHJldHVybiBUUlVFOworICB9CitzZHBfZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoc3JjLCAiQ291bGQgbm90IGNyZWF0ZSBuZXcgU0RQICglZCkiLCBzcmVzKTsKKyAgICBnX3NldF9lcnJvcl9saXRlcmFsIChlcnJvciwgR1NUX1VSSV9FUlJPUiwgR1NUX1VSSV9FUlJPUl9CQURfVVJJLAorICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBTRFAiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfc2RwOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoc3JjLCAiTm90IGEgdmFsaWQgU0RQICglZCkgJyVzJyIsIHNyZXMsCisgICAgICAgIEdTVF9TVFJfTlVMTCAodXJpKSk7CisgICAgZ3N0X3NkcF9tZXNzYWdlX2ZyZWUgKHNkcCk7CisgICAgZ19zZXRfZXJyb3JfbGl0ZXJhbCAoZXJyb3IsIEdTVF9VUklfRVJST1IsIEdTVF9VUklfRVJST1JfQkFEX1VSSSwKKyAgICAgICAgIkludmFsaWQgU0RQIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitwYXJzZV9lcnJvcjoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNyYywgIk5vdCBhIHZhbGlkIFJUU1AgdXJsICclcycgKCVkKSIsCisgICAgICAgIEdTVF9TVFJfTlVMTCAodXJpKSwgcmVzKTsKKyAgICBnX3NldF9lcnJvcl9saXRlcmFsIChlcnJvciwgR1NUX1VSSV9FUlJPUiwgR1NUX1VSSV9FUlJPUl9CQURfVVJJLAorICAgICAgICAiSW52YWxpZCBSVFNQIFVSSSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3J0c3BzcmNfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0VVJJSGFuZGxlckludGVyZmFjZSAqaWZhY2UgPSAoR3N0VVJJSGFuZGxlckludGVyZmFjZSAqKSBnX2lmYWNlOworCisgIGlmYWNlLT5nZXRfdHlwZSA9IGdzdF9ydHNwc3JjX3VyaV9nZXRfdHlwZTsKKyAgaWZhY2UtPmdldF9wcm90b2NvbHMgPSBnc3RfcnRzcHNyY191cmlfZ2V0X3Byb3RvY29sczsKKyAgaWZhY2UtPmdldF91cmkgPSBnc3RfcnRzcHNyY191cmlfZ2V0X3VyaTsKKyAgaWZhY2UtPnNldF91cmkgPSBnc3RfcnRzcHNyY191cmlfc2V0X3VyaTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgX1JUU1BLZXlWYWx1ZQoreworICBHc3RSVFNQSGVhZGVyRmllbGQgZmllbGQ7CisgIGdjaGFyICp2YWx1ZTsKKyAgZ2NoYXIgKmN1c3RvbV9rZXk7ICAgICAgICAgICAgLyogY3VzdG9tIGhlYWRlciBzdHJpbmcgKGZpZWxkIGlzIElOVkFMSUQgdGhlbikgKi8KK30gUlRTUEtleVZhbHVlOworCitzdGF0aWMgdm9pZAora2V5X3ZhbHVlX2ZvcmVhY2ggKEdBcnJheSAqIGFycmF5LCBHRnVuYyBmdW5jLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGd1aW50IGk7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoYXJyYXkgIT0gTlVMTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IGFycmF5LT5sZW47IGkrKykgeworICAgICgqZnVuYykgKCZnX2FycmF5X2luZGV4IChhcnJheSwgUlRTUEtleVZhbHVlLCBpKSwgdXNlcl9kYXRhKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZHVtcF9rZXlfdmFsdWUgKGdwb2ludGVyIGRhdGEsIGdwb2ludGVyIHVzZXJfZGF0YSBHX0dOVUNfVU5VU0VEKQoreworICBSVFNQS2V5VmFsdWUgKmtleV92YWx1ZSA9IChSVFNQS2V5VmFsdWUgKikgZGF0YTsKKyAgR3N0UlRTUFNyYyAqc3JjID0gR1NUX1JUU1BTUkMgKHVzZXJfZGF0YSk7CisgIGNvbnN0IGdjaGFyICprZXlfc3RyaW5nOworCisgIGlmIChrZXlfdmFsdWUtPmN1c3RvbV9rZXkgIT0gTlVMTCkKKyAgICBrZXlfc3RyaW5nID0ga2V5X3ZhbHVlLT5jdXN0b21fa2V5OworICBlbHNlCisgICAga2V5X3N0cmluZyA9IGdzdF9ydHNwX2hlYWRlcl9hc190ZXh0IChrZXlfdmFsdWUtPmZpZWxkKTsKKworICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAga2V5OiAnJXMnLCB2YWx1ZTogJyVzJyIsIGtleV9zdHJpbmcsCisgICAgICBrZXlfdmFsdWUtPnZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9ydHNwc3JjX3ByaW50X3J0c3BfbWVzc2FnZSAoR3N0UlRTUFNyYyAqIHNyYywgY29uc3QgR3N0UlRTUE1lc3NhZ2UgKiBtc2cpCit7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQgc2l6ZTsKKyAgR1N0cmluZyAqYm9keV9zdHJpbmcgPSBOVUxMOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKHNyYyAhPSBOVUxMKTsKKyAgZ19yZXR1cm5faWZfZmFpbCAobXNnICE9IE5VTEwpOworCisgIGlmIChnc3RfZGVidWdfY2F0ZWdvcnlfZ2V0X3RocmVzaG9sZCAoR1NUX0NBVF9ERUZBVUxUKSA8IEdTVF9MRVZFTF9MT0cpCisgICAgcmV0dXJuOworCisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICBzd2l0Y2ggKG1zZy0+dHlwZSkgeworICAgIGNhc2UgR1NUX1JUU1BfTUVTU0FHRV9SRVFVRVNUOgorICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIlJUU1AgcmVxdWVzdCBtZXNzYWdlICVwIiwgbXNnKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgcmVxdWVzdCBsaW5lOiIpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgIG1ldGhvZDogJyVzJyIsCisgICAgICAgICAgZ3N0X3J0c3BfbWV0aG9kX2FzX3RleHQgKG1zZy0+dHlwZV9kYXRhLnJlcXVlc3QubWV0aG9kKSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgdXJpOiAgICAnJXMnIiwgbXNnLT50eXBlX2RhdGEucmVxdWVzdC51cmkpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgIHZlcnNpb246ICclcyciLAorICAgICAgICAgIGdzdF9ydHNwX3ZlcnNpb25fYXNfdGV4dCAobXNnLT50eXBlX2RhdGEucmVxdWVzdC52ZXJzaW9uKSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiIGhlYWRlcnM6Iik7CisgICAgICBrZXlfdmFsdWVfZm9yZWFjaCAobXNnLT5oZHJfZmllbGRzLCBkdW1wX2tleV92YWx1ZSwgc3JjKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgYm9keToiKTsKKyAgICAgIGdzdF9ydHNwX21lc3NhZ2VfZ2V0X2JvZHkgKG1zZywgJmRhdGEsICZzaXplKTsKKyAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICBib2R5X3N0cmluZyA9IGdfc3RyaW5nX25ld19sZW4gKChjb25zdCBnY2hhciAqKSBkYXRhLCBzaXplKTsKKyAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAlcyglZCkiLCBib2R5X3N0cmluZy0+c3RyLCBzaXplKTsKKyAgICAgICAgZ19zdHJpbmdfZnJlZSAoYm9keV9zdHJpbmcsIFRSVUUpOworICAgICAgICBib2R5X3N0cmluZyA9IE5VTEw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9SVFNQX01FU1NBR0VfUkVTUE9OU0U6CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiUlRTUCByZXNwb25zZSBtZXNzYWdlICVwIiwgbXNnKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgc3RhdHVzIGxpbmU6Iik7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgY29kZTogICAnJWQnIiwgbXNnLT50eXBlX2RhdGEucmVzcG9uc2UuY29kZSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgcmVhc29uOiAnJXMnIiwgbXNnLT50eXBlX2RhdGEucmVzcG9uc2UucmVhc29uKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgICB2ZXJzaW9uOiAnJXMiLAorICAgICAgICAgIGdzdF9ydHNwX3ZlcnNpb25fYXNfdGV4dCAobXNnLT50eXBlX2RhdGEucmVzcG9uc2UudmVyc2lvbikpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiBoZWFkZXJzOiIpOworICAgICAga2V5X3ZhbHVlX2ZvcmVhY2ggKG1zZy0+aGRyX2ZpZWxkcywgZHVtcF9rZXlfdmFsdWUsIHNyYyk7CisgICAgICBnc3RfcnRzcF9tZXNzYWdlX2dldF9ib2R5IChtc2csICZkYXRhLCAmc2l6ZSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiIGJvZHk6IGxlbmd0aCAlZCIsIHNpemUpOworICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIGJvZHlfc3RyaW5nID0gZ19zdHJpbmdfbmV3X2xlbiAoKGNvbnN0IGdjaGFyICopIGRhdGEsIHNpemUpOworICAgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICVzKCVkKSIsIGJvZHlfc3RyaW5nLT5zdHIsIHNpemUpOworICAgICAgICBnX3N0cmluZ19mcmVlIChib2R5X3N0cmluZywgVFJVRSk7CisgICAgICAgIGJvZHlfc3RyaW5nID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1JUU1BfTUVTU0FHRV9IVFRQX1JFUVVFU1Q6CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiSFRUUCByZXF1ZXN0IG1lc3NhZ2UgJXAiLCBtc2cpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiByZXF1ZXN0IGxpbmU6Iik7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgbWV0aG9kOiAgJyVzJyIsCisgICAgICAgICAgZ3N0X3J0c3BfbWV0aG9kX2FzX3RleHQgKG1zZy0+dHlwZV9kYXRhLnJlcXVlc3QubWV0aG9kKSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgdXJpOiAgICAgJyVzJyIsIG1zZy0+dHlwZV9kYXRhLnJlcXVlc3QudXJpKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgICB2ZXJzaW9uOiAnJXMnIiwKKyAgICAgICAgICBnc3RfcnRzcF92ZXJzaW9uX2FzX3RleHQgKG1zZy0+dHlwZV9kYXRhLnJlcXVlc3QudmVyc2lvbikpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiBoZWFkZXJzOiIpOworICAgICAga2V5X3ZhbHVlX2ZvcmVhY2ggKG1zZy0+aGRyX2ZpZWxkcywgZHVtcF9rZXlfdmFsdWUsIHNyYyk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiIGJvZHk6Iik7CisgICAgICBnc3RfcnRzcF9tZXNzYWdlX2dldF9ib2R5IChtc2csICZkYXRhLCAmc2l6ZSk7CisgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgYm9keV9zdHJpbmcgPSBnX3N0cmluZ19uZXdfbGVuICgoY29uc3QgZ2NoYXIgKikgZGF0YSwgc2l6ZSk7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgJXMoJWQpIiwgYm9keV9zdHJpbmctPnN0ciwgc2l6ZSk7CisgICAgICAgIGdfc3RyaW5nX2ZyZWUgKGJvZHlfc3RyaW5nLCBUUlVFKTsKKyAgICAgICAgYm9keV9zdHJpbmcgPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfUlRTUF9NRVNTQUdFX0hUVFBfUkVTUE9OU0U6CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiSFRUUCByZXNwb25zZSBtZXNzYWdlICVwIiwgbXNnKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgc3RhdHVzIGxpbmU6Iik7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgY29kZTogICAgJyVkJyIsIG1zZy0+dHlwZV9kYXRhLnJlc3BvbnNlLmNvZGUpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgIHJlYXNvbjogICclcyciLCBtc2ctPnR5cGVfZGF0YS5yZXNwb25zZS5yZWFzb24pOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgIHZlcnNpb246ICclcyciLAorICAgICAgICAgIGdzdF9ydHNwX3ZlcnNpb25fYXNfdGV4dCAobXNnLT50eXBlX2RhdGEucmVzcG9uc2UudmVyc2lvbikpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiBoZWFkZXJzOiIpOworICAgICAga2V5X3ZhbHVlX2ZvcmVhY2ggKG1zZy0+aGRyX2ZpZWxkcywgZHVtcF9rZXlfdmFsdWUsIHNyYyk7CisgICAgICBnc3RfcnRzcF9tZXNzYWdlX2dldF9ib2R5IChtc2csICZkYXRhLCAmc2l6ZSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiIGJvZHk6IGxlbmd0aCAlZCIsIHNpemUpOworICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIGJvZHlfc3RyaW5nID0gZ19zdHJpbmdfbmV3X2xlbiAoKGNvbnN0IGdjaGFyICopIGRhdGEsIHNpemUpOworICAgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICVzKCVkKSIsIGJvZHlfc3RyaW5nLT5zdHIsIHNpemUpOworICAgICAgICBnX3N0cmluZ19mcmVlIChib2R5X3N0cmluZywgVFJVRSk7CisgICAgICAgIGJvZHlfc3RyaW5nID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1JUU1BfTUVTU0FHRV9EQVRBOgorICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIlJUU1AgZGF0YSBtZXNzYWdlICVwIiwgbXNnKTsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgY2hhbm5lbDogJyVkJyIsIG1zZy0+dHlwZV9kYXRhLmRhdGEuY2hhbm5lbCk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiIHNpemU6ICAgICclZCciLCBtc2ctPmJvZHlfc2l6ZSk7CisgICAgICBnc3RfcnRzcF9tZXNzYWdlX2dldF9ib2R5IChtc2csICZkYXRhLCAmc2l6ZSk7CisgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgYm9keV9zdHJpbmcgPSBnX3N0cmluZ19uZXdfbGVuICgoY29uc3QgZ2NoYXIgKikgZGF0YSwgc2l6ZSk7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgJXMoJWQpIiwgYm9keV9zdHJpbmctPnN0ciwgc2l6ZSk7CisgICAgICAgIGdfc3RyaW5nX2ZyZWUgKGJvZHlfc3RyaW5nLCBUUlVFKTsKKyAgICAgICAgYm9keV9zdHJpbmcgPSBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICJ1bnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUgJWQiLCBtc2ctPnR5cGUpOworICAgICAgYnJlYWs7CisgIH0KKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfcnRzcHNyY19wcmludF9zZHBfbWVkaWEgKEdzdFJUU1BTcmMgKiBzcmMsIEdzdFNEUE1lZGlhICogbWVkaWEpCit7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgICBtZWRpYTogICAgICAgJyVzJyIsIEdTVF9TVFJfTlVMTCAobWVkaWEtPm1lZGlhKSk7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgICBwb3J0OiAgICAgICAgJyV1JyIsIG1lZGlhLT5wb3J0KTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgIG51bV9wb3J0czogICAnJXUnIiwgbWVkaWEtPm51bV9wb3J0cyk7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgICBwcm90bzogICAgICAgJyVzJyIsIEdTVF9TVFJfTlVMTCAobWVkaWEtPnByb3RvKSk7CisgIGlmIChtZWRpYS0+Zm10cyAmJiBtZWRpYS0+Zm10cy0+bGVuID4gMCkgeworICAgIGd1aW50IGk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgZm9ybWF0czoiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWVkaWEtPmZtdHMtPmxlbjsgaSsrKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgIGZvcm1hdCAgJyVzJyIsIGdfYXJyYXlfaW5kZXggKG1lZGlhLT5mbXRzLAorICAgICAgICAgICAgICBnY2hhciAqLCBpKSk7CisgICAgfQorICB9CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgICBpbmZvcm1hdGlvbjogJyVzJyIsCisgICAgICBHU1RfU1RSX05VTEwgKG1lZGlhLT5pbmZvcm1hdGlvbikpOworICBpZiAobWVkaWEtPmNvbm5lY3Rpb25zICYmIG1lZGlhLT5jb25uZWN0aW9ucy0+bGVuID4gMCkgeworICAgIGd1aW50IGk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgY29ubmVjdGlvbnM6Iik7CisgICAgZm9yIChpID0gMDsgaSA8IG1lZGlhLT5jb25uZWN0aW9ucy0+bGVuOyBpKyspIHsKKyAgICAgIEdzdFNEUENvbm5lY3Rpb24gKmNvbm4gPQorICAgICAgICAgICZnX2FycmF5X2luZGV4IChtZWRpYS0+Y29ubmVjdGlvbnMsIEdzdFNEUENvbm5lY3Rpb24sIGkpOworCisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgIG5ldHR5cGU6ICAgICAgJyVzJyIsCisgICAgICAgICAgR1NUX1NUUl9OVUxMIChjb25uLT5uZXR0eXBlKSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgIGFkZHJ0eXBlOiAgICAgJyVzJyIsCisgICAgICAgICAgR1NUX1NUUl9OVUxMIChjb25uLT5hZGRydHlwZSkpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgICBhZGRyZXNzOiAgICAgICclcyciLAorICAgICAgICAgIEdTVF9TVFJfTlVMTCAoY29ubi0+YWRkcmVzcykpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgICB0dGw6ICAgICAgICAgICcldSciLCBjb25uLT50dGwpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgICBhZGRyX251bWJlcjogICcldSciLCBjb25uLT5hZGRyX251bWJlcik7CisgICAgfQorICB9CisgIGlmIChtZWRpYS0+YmFuZHdpZHRocyAmJiBtZWRpYS0+YmFuZHdpZHRocy0+bGVuID4gMCkgeworICAgIGd1aW50IGk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgYmFuZHdpZHRoczoiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWVkaWEtPmJhbmR3aWR0aHMtPmxlbjsgaSsrKSB7CisgICAgICBHc3RTRFBCYW5kd2lkdGggKmJ3ID0KKyAgICAgICAgICAmZ19hcnJheV9pbmRleCAobWVkaWEtPmJhbmR3aWR0aHMsIEdzdFNEUEJhbmR3aWR0aCwgaSk7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgICAgdHlwZTogICAgICAgICAnJXMnIiwgR1NUX1NUUl9OVUxMIChidy0+Ynd0eXBlKSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgIGJhbmR3aWR0aDogICAgJyV1JyIsIGJ3LT5iYW5kd2lkdGgpOworICAgIH0KKyAgfQorICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAga2V5OiIpOworICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgIHR5cGU6ICAgICAgICclcyciLCBHU1RfU1RSX05VTEwgKG1lZGlhLT5rZXkudHlwZSkpOworICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICAgIGRhdGE6ICAgICAgICclcyciLCBHU1RfU1RSX05VTEwgKG1lZGlhLT5rZXkuZGF0YSkpOworICBpZiAobWVkaWEtPmF0dHJpYnV0ZXMgJiYgbWVkaWEtPmF0dHJpYnV0ZXMtPmxlbiA+IDApIHsKKyAgICBndWludCBpOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgIGF0dHJpYnV0ZXM6Iik7CisgICAgZm9yIChpID0gMDsgaSA8IG1lZGlhLT5hdHRyaWJ1dGVzLT5sZW47IGkrKykgeworICAgICAgR3N0U0RQQXR0cmlidXRlICphdHRyID0KKyAgICAgICAgICAmZ19hcnJheV9pbmRleCAobWVkaWEtPmF0dHJpYnV0ZXMsIEdzdFNEUEF0dHJpYnV0ZSwgaSk7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgICAgYXR0cmlidXRlICclcycgOiAnJXMnIiwgYXR0ci0+a2V5LCBhdHRyLT52YWx1ZSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQKK2dzdF9ydHNwc3JjX3ByaW50X3NkcF9tZXNzYWdlIChHc3RSVFNQU3JjICogc3JjLCBjb25zdCBHc3RTRFBNZXNzYWdlICogbXNnKQoreworICBnX3JldHVybl9pZl9mYWlsIChzcmMgIT0gTlVMTCk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKG1zZyAhPSBOVUxMKTsKKworICBpZiAoZ3N0X2RlYnVnX2NhdGVnb3J5X2dldF90aHJlc2hvbGQgKEdTVF9DQVRfREVGQVVMVCkgPCBHU1RfTEVWRUxfTE9HKQorICAgIHJldHVybjsKKworICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgInNkcCBwYWNrZXQgJXA6IiwgbXNnKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiB2ZXJzaW9uOiAgICAgICAnJXMnIiwgR1NUX1NUUl9OVUxMIChtc2ctPnZlcnNpb24pKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiBvcmlnaW46Iik7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgIHVzZXJuYW1lOiAgICAgJyVzJyIsCisgICAgICBHU1RfU1RSX05VTEwgKG1zZy0+b3JpZ2luLnVzZXJuYW1lKSk7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgIHNlc3NfaWQ6ICAgICAgJyVzJyIsCisgICAgICBHU1RfU1RSX05VTEwgKG1zZy0+b3JpZ2luLnNlc3NfaWQpKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgc2Vzc192ZXJzaW9uOiAnJXMnIiwKKyAgICAgIEdTVF9TVFJfTlVMTCAobXNnLT5vcmlnaW4uc2Vzc192ZXJzaW9uKSk7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgIG5ldHR5cGU6ICAgICAgJyVzJyIsCisgICAgICBHU1RfU1RSX05VTEwgKG1zZy0+b3JpZ2luLm5ldHR5cGUpKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgYWRkcnR5cGU6ICAgICAnJXMnIiwKKyAgICAgIEdTVF9TVFJfTlVMTCAobXNnLT5vcmlnaW4uYWRkcnR5cGUpKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgYWRkcjogICAgICAgICAnJXMnIiwgR1NUX1NUUl9OVUxMIChtc2ctPm9yaWdpbi5hZGRyKSk7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgc2Vzc2lvbl9uYW1lOiAgJyVzJyIsCisgICAgICBHU1RfU1RSX05VTEwgKG1zZy0+c2Vzc2lvbl9uYW1lKSk7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgaW5mb3JtYXRpb246ICAgJyVzJyIsIEdTVF9TVFJfTlVMTCAobXNnLT5pbmZvcm1hdGlvbikpOworICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiIHVyaTogICAgICAgICAgICclcyciLCBHU1RfU1RSX05VTEwgKG1zZy0+dXJpKSk7CisKKyAgaWYgKG1zZy0+ZW1haWxzICYmIG1zZy0+ZW1haWxzLT5sZW4gPiAwKSB7CisgICAgZ3VpbnQgaTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgZW1haWxzOiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBtc2ctPmVtYWlscy0+bGVuOyBpKyspIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgIGVtYWlsICclcyciLCBnX2FycmF5X2luZGV4IChtc2ctPmVtYWlscywgZ2NoYXIgKiwKKyAgICAgICAgICAgICAgaSkpOworICAgIH0KKyAgfQorICBpZiAobXNnLT5waG9uZXMgJiYgbXNnLT5waG9uZXMtPmxlbiA+IDApIHsKKyAgICBndWludCBpOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiBwaG9uZXM6Iik7CisgICAgZm9yIChpID0gMDsgaSA8IG1zZy0+cGhvbmVzLT5sZW47IGkrKykgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgcGhvbmUgJyVzJyIsIGdfYXJyYXlfaW5kZXggKG1zZy0+cGhvbmVzLCBnY2hhciAqLAorICAgICAgICAgICAgICBpKSk7CisgICAgfQorICB9CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgY29ubmVjdGlvbjoiKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgbmV0dHlwZTogICAgICAnJXMnIiwKKyAgICAgIEdTVF9TVFJfTlVMTCAobXNnLT5jb25uZWN0aW9uLm5ldHR5cGUpKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgYWRkcnR5cGU6ICAgICAnJXMnIiwKKyAgICAgIEdTVF9TVFJfTlVMTCAobXNnLT5jb25uZWN0aW9uLmFkZHJ0eXBlKSk7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgIGFkZHJlc3M6ICAgICAgJyVzJyIsCisgICAgICBHU1RfU1RSX05VTEwgKG1zZy0+Y29ubmVjdGlvbi5hZGRyZXNzKSk7CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgIHR0bDogICAgICAgICAgJyV1JyIsIG1zZy0+Y29ubmVjdGlvbi50dGwpOworICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICBhZGRyX251bWJlcjogICcldSciLCBtc2ctPmNvbm5lY3Rpb24uYWRkcl9udW1iZXIpOworICBpZiAobXNnLT5iYW5kd2lkdGhzICYmIG1zZy0+YmFuZHdpZHRocy0+bGVuID4gMCkgeworICAgIGd1aW50IGk7CisKKyAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiIGJhbmR3aWR0aHM6Iik7CisgICAgZm9yIChpID0gMDsgaSA8IG1zZy0+YmFuZHdpZHRocy0+bGVuOyBpKyspIHsKKyAgICAgIEdzdFNEUEJhbmR3aWR0aCAqYncgPQorICAgICAgICAgICZnX2FycmF5X2luZGV4IChtc2ctPmJhbmR3aWR0aHMsIEdzdFNEUEJhbmR3aWR0aCwgaSk7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgIHR5cGU6ICAgICAgICAgJyVzJyIsIEdTVF9TVFJfTlVMTCAoYnctPmJ3dHlwZSkpOworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgYmFuZHdpZHRoOiAgICAnJXUnIiwgYnctPmJhbmR3aWR0aCk7CisgICAgfQorICB9CisgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIga2V5OiIpOworICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICB0eXBlOiAgICAgICAgICclcyciLCBHU1RfU1RSX05VTEwgKG1zZy0+a2V5LnR5cGUpKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIiAgZGF0YTogICAgICAgICAnJXMnIiwgR1NUX1NUUl9OVUxMIChtc2ctPmtleS5kYXRhKSk7CisgIGlmIChtc2ctPmF0dHJpYnV0ZXMgJiYgbXNnLT5hdHRyaWJ1dGVzLT5sZW4gPiAwKSB7CisgICAgZ3VpbnQgaTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgYXR0cmlidXRlczoiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLT5hdHRyaWJ1dGVzLT5sZW47IGkrKykgeworICAgICAgR3N0U0RQQXR0cmlidXRlICphdHRyID0KKyAgICAgICAgICAmZ19hcnJheV9pbmRleCAobXNnLT5hdHRyaWJ1dGVzLCBHc3RTRFBBdHRyaWJ1dGUsIGkpOworCisgICAgICBHU1RfTE9HX09CSkVDVCAoc3JjLCAiICBhdHRyaWJ1dGUgJyVzJyA6ICclcyciLCBhdHRyLT5rZXksIGF0dHItPnZhbHVlKTsKKyAgICB9CisgIH0KKyAgaWYgKG1zZy0+bWVkaWFzICYmIG1zZy0+bWVkaWFzLT5sZW4gPiAwKSB7CisgICAgZ3VpbnQgaTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgbWVkaWFzOiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBtc2ctPm1lZGlhcy0+bGVuOyBpKyspIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzcmMsICIgIG1lZGlhICV1OiIsIGkpOworICAgICAgZ3N0X3J0c3BzcmNfcHJpbnRfc2RwX21lZGlhIChzcmMsICZnX2FycmF5X2luZGV4IChtc2ctPm1lZGlhcywKKyAgICAgICAgICAgICAgR3N0U0RQTWVkaWEsIGkpKTsKKyAgICB9CisgIH0KKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Cit9CmRpZmYgLS1naXQgYS9nc3QvcnRzcC9nc3RydHNwc3JjLmggYi9nc3QvcnRzcC9nc3RydHNwc3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5MjFkMgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9ydHNwL2dzdHJ0c3BzcmMuaApAQCAtMCwwICsxLDMwNyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICA8MjAwNj4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoKKyAqIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBTb3VyY2UgQ29kZSBpcyBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZS4KKyAqIFNlZSBmdXJ0aGVyIGV4cGxhbmF0aW9uIGF0dGFjaGVkIGluIExpY2Vuc2UgU3RhdGVtZW50IChkaXN0cmlidXRlZCBpbiB0aGUgZmlsZQorICogTElDRU5TRSkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCisgKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19HU1RfUlRTUFNSQ19IX18KKyNkZWZpbmUgX19HU1RfUlRTUFNSQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8Z3N0L3J0c3AvcnRzcC5oPgorI2luY2x1ZGUgPGdpby9naW8uaD4KKworI2luY2x1ZGUgImdzdHJ0c3BleHQuaCIKKworI2RlZmluZSBHU1RfVFlQRV9SVFNQU1JDIFwKKyAgKGdzdF9ydHNwc3JjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9SVFNQU1JDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfUlRTUFNSQyxHc3RSVFNQU3JjKSkKKyNkZWZpbmUgR1NUX1JUU1BTUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfUlRTUFNSQyxHc3RSVFNQU3JjQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfUlRTUFNSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1JUU1BTUkMpKQorI2RlZmluZSBHU1RfSVNfUlRTUFNSQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9SVFNQU1JDKSkKKyNkZWZpbmUgR1NUX1JUU1BTUkNfQ0FTVChvYmopIFwKKyAgKChHc3RSVFNQU3JjICopKG9iaikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFNQU3JjIEdzdFJUU1BTcmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0UlRTUFNyY0NsYXNzIEdzdFJUU1BTcmNDbGFzczsKKworI2RlZmluZSBHU1RfUlRTUF9TVEFURV9HRVRfTE9DSyhydHNwKSAgICAoJkdTVF9SVFNQU1JDX0NBU1QocnRzcCktPnN0YXRlX3JlY19sb2NrKQorI2RlZmluZSBHU1RfUlRTUF9TVEFURV9MT0NLKHJ0c3ApICAgICAgICAoZ19yZWNfbXV0ZXhfbG9jayAoR1NUX1JUU1BfU1RBVEVfR0VUX0xPQ0socnRzcCkpKQorI2RlZmluZSBHU1RfUlRTUF9TVEFURV9VTkxPQ0socnRzcCkgICAgICAoZ19yZWNfbXV0ZXhfdW5sb2NrIChHU1RfUlRTUF9TVEFURV9HRVRfTE9DSyhydHNwKSkpCisKKyNkZWZpbmUgR1NUX1JUU1BfU1RSRUFNX0dFVF9MT0NLKHJ0c3ApICAgKCZHU1RfUlRTUFNSQ19DQVNUKHJ0c3ApLT5zdHJlYW1fcmVjX2xvY2spCisjZGVmaW5lIEdTVF9SVFNQX1NUUkVBTV9MT0NLKHJ0c3ApICAgICAgIChnX3JlY19tdXRleF9sb2NrIChHU1RfUlRTUF9TVFJFQU1fR0VUX0xPQ0socnRzcCkpKQorI2RlZmluZSBHU1RfUlRTUF9TVFJFQU1fVU5MT0NLKHJ0c3ApICAgICAoZ19yZWNfbXV0ZXhfdW5sb2NrIChHU1RfUlRTUF9TVFJFQU1fR0VUX0xPQ0socnRzcCkpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0UlRTUENvbm5JbmZvIEdzdFJUU1BDb25uSW5mbzsKKworc3RydWN0IF9Hc3RSVFNQQ29ubkluZm8geworICBnY2hhciAgICAgICAgICAgICAgKmxvY2F0aW9uOworICBHc3RSVFNQVXJsICAgICAgICAgKnVybDsKKyAgZ2NoYXIgICAgICAgICAgICAgICp1cmxfc3RyOworICBHc3RSVFNQQ29ubmVjdGlvbiAgKmNvbm5lY3Rpb247CisgIGdib29sZWFuICAgICAgICAgICAgY29ubmVjdGVkOworICBnYm9vbGVhbiAgICAgICAgICAgIGZsdXNoaW5nOworCisgIEdNdXRleCAgICAgICAgICAgICAgc2VuZF9sb2NrOworICBHTXV0ZXggICAgICAgICAgICAgIHJlY3ZfbG9jazsKK307CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RSVFNQU3RyZWFtIEdzdFJUU1BTdHJlYW07CisKK3N0cnVjdCBfR3N0UlRTUFN0cmVhbSB7CisgIGdpbnQgICAgICAgICAgaWQ7CisKKyAgR3N0UlRTUFNyYyAgICpwYXJlbnQ7IC8qIHBhcmVudCwgbm8gZXh0cmEgcmVmIHRvIHBhcmVudCBpcyB0YWtlbiAqLworCisgIC8qIHBhZCB3ZSBleHBvc2Ugb3IgTlVMTCB3aGVuIGl0IGRvZXMgbm90IGhhdmUgYW4gYWN0dWFsIHBhZCAqLworICBHc3RQYWQgICAgICAgKnNyY3BhZDsKKyAgR3N0Rmxvd1JldHVybiBsYXN0X3JldDsKKyAgZ2Jvb2xlYW4gICAgICBhZGRlZDsKKyAgZ2Jvb2xlYW4gICAgICBzZXR1cDsKKyAgZ2Jvb2xlYW4gICAgICBza2lwcGVkOworICBnYm9vbGVhbiAgICAgIGVvczsKKyAgZ2Jvb2xlYW4gICAgICBkaXNjb250OworICBnYm9vbGVhbiAgICAgIG5lZWRfY2FwczsKKyAgZ2Jvb2xlYW4gICAgICB3YWl0aW5nX3NldHVwX3Jlc3BvbnNlOworCisgIC8qIGZvciBpbnRlcmxlYXZlZCBtb2RlICovCisgIGd1aW50OCAgICAgICAgY2hhbm5lbFsyXTsKKyAgR3N0UGFkICAgICAgICpjaGFubmVscGFkWzJdOworCisgIC8qIG91ciB1ZHAgc291cmNlcyAqLworICBHc3RFbGVtZW50ICAgKnVkcHNyY1syXTsKKyAgR3N0UGFkICAgICAgICpibG9ja2VkcGFkOworICBndWxvbmcgICAgICAgIGJsb2NraWQ7CisgIGdib29sZWFuICAgICAgaXNfaXB2NjsKKworICAvKiBvdXIgdWRwIHNpbmtzIGJhY2sgdG8gdGhlIHNlcnZlciAqLworICBHc3RFbGVtZW50ICAgKnVkcHNpbmtbMl07CisgIEdzdFBhZCAgICAgICAqcnRjcHBhZDsKKworICAvKiBmYWtlc3JjIGZvciBzZW5kaW5nIGR1bW15IGRhdGEgKi8KKyAgR3N0RWxlbWVudCAgICpmYWtlc3JjOworCisgIC8qIHN0YXRlICovCisgIGd1aW50ICAgICAgICAgcG9ydDsKKyAgZ2Jvb2xlYW4gICAgICBjb250YWluZXI7CisgIGdib29sZWFuICAgICAgaXNfcmVhbDsKKyAgZ3VpbnQ4ICAgICAgICBkZWZhdWx0X3B0OworICBHc3RSVFNQUHJvZmlsZSBwcm9maWxlOworICBHQXJyYXkgICAgICAgKnB0bWFwOworICAvKiBvcmlnaW5hbCBjb250cm9sIHVybCAqLworICBnY2hhciAgICAgICAgKmNvbnRyb2xfdXJsOworICBndWludDMyICAgICAgIHNzcmM7CisgIGd1aW50MzIgICAgICAgc2VxYmFzZTsKKyAgZ3VpbnQ2NCAgICAgICB0aW1lYmFzZTsKKyAgR3N0RWxlbWVudCAgICpzcnRwZGVjOworICBHc3RDYXBzICAgICAgKnNydGNwcGFyYW1zOworICBHc3RFbGVtZW50ICAgKnNydHBlbmM7CisgIGd1aW50MzIgICAgICAgc2VuZF9zc3JjOworCisgIC8qIHBlciBzdHJlYW0gY29ubmVjdGlvbiAqLworICBHc3RSVFNQQ29ubkluZm8gIGNvbm5pbmZvOworCisgIC8qIHNlc3Npb24gKi8KKyAgR09iamVjdCAgICAgICpzZXNzaW9uOworCisgIC8qIHNydHAga2V5IG1hbmFnZW1lbnQgKi8KKyAgR3N0TUlLRVlNZXNzYWdlICptaWtleTsKKworICAvKiBiYW5kd2lkdGggKi8KKyAgZ3VpbnQgICAgICAgICBhc19iYW5kd2lkdGg7CisgIGd1aW50ICAgICAgICAgcnNfYmFuZHdpZHRoOworICBndWludCAgICAgICAgIHJyX2JhbmR3aWR0aDsKKworICAvKiBkZXN0aW5hdGlvbiAqLworICBnY2hhciAgICAgICAgKmRlc3RpbmF0aW9uOworICBnYm9vbGVhbiAgICAgIGlzX211bHRpY2FzdDsKKyAgZ3VpbnQgICAgICAgICB0dGw7CisKKyAgLyogQSB1bmlxdWUgYW5kIHN0YWJsZSBpZCB3ZSB3aWxsIHVzZSBmb3IgdGhlIHN0cmVhbSBzdGFydCBldmVudCAqLworICBnY2hhciAqc3RyZWFtX2lkOworCisgIEdzdFN0cnVjdHVyZSAgICAgKnJ0eF9wdF9tYXA7Cit9OworCisvKioKKyAqIEdzdFJUU1BOYXRNZXRob2Q6CisgKiBAR1NUX1JUU1BfTkFUX05PTkU6IG5vbmUKKyAqIEBHU1RfUlRTUF9OQVRfRFVNTVk6IHNlbmQgZHVtbXkgcGFja2V0cworICoKKyAqIERpZmZlcmVudCBtZXRob2RzIGZvciB0cnlpbmcgdG8gdHJhdmVyc2UgZmlyZXdhbGxzLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgR1NUX1JUU1BfTkFUX05PTkUsCisgIEdTVF9SVFNQX05BVF9EVU1NWQorfSBHc3RSVFNQTmF0TWV0aG9kOworCitzdHJ1Y3QgX0dzdFJUU1BTcmMgeworICBHc3RCaW4gICAgICAgICAgIHBhcmVudDsKKworICAvKiB0YXNrIGFuZCBtdXRleCBmb3IgaW50ZXJsZWF2ZWQgbW9kZSAqLworICBnYm9vbGVhbiAgICAgICAgIGludGVybGVhdmVkOworICBHc3RUYXNrICAgICAgICAgKnRhc2s7CisgIEdSZWNNdXRleCAgICAgICAgc3RyZWFtX3JlY19sb2NrOworICBHc3RTZWdtZW50ICAgICAgIHNlZ21lbnQ7CisgIGdib29sZWFuICAgICAgICAgcnVubmluZzsKKyAgZ2Jvb2xlYW4gICAgICAgICBuZWVkX3JhbmdlOworICBnYm9vbGVhbiAgICAgICAgIHNraXA7CisgIGdpbnQgICAgICAgICAgICAgZnJlZV9jaGFubmVsOworICBnYm9vbGVhbiAgICAgICAgIG5lZWRfc2VnbWVudDsKKyAgR3N0Q2xvY2tUaW1lICAgICBiYXNlX3RpbWU7CisKKyAgLyogVURQIG1vZGUgbG9vcCAqLworICBnaW50ICAgICAgICAgICAgIHBlbmRpbmdfY21kOworICBnaW50ICAgICAgICAgICAgIGJ1c3lfY21kOworICBnYm9vbGVhbiAgICAgICAgIGlnbm9yZV90aW1lb3V0OworICBnYm9vbGVhbiAgICAgICAgIG9wZW5fZXJyb3I7CisKKyAgLyogbXV0ZXggZm9yIHByb3RlY3Rpbmcgc3RhdGUgY2hhbmdlcyAqLworICBHUmVjTXV0ZXggICAgICAgIHN0YXRlX3JlY19sb2NrOworCisgIEdzdFNEUE1lc3NhZ2UgICAqc2RwOworICBnYm9vbGVhbiAgICAgICAgIGZyb21fc2RwOworICBHTGlzdCAgICAgICAgICAgKnN0cmVhbXM7CisgIEdzdFN0cnVjdHVyZSAgICAqcHJvcHM7CisgIGdib29sZWFuICAgICAgICAgbmVlZF9hY3RpdmF0ZTsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIEdzdFJUU1BMb3dlclRyYW5zIHByb3RvY29sczsKKyAgZ2Jvb2xlYW4gICAgICAgICAgZGVidWc7CisgIGd1aW50ICAgICAgICAgICAgIHJldHJ5OworICBndWludDY0ICAgICAgICAgICB1ZHBfdGltZW91dDsKKyAgR1RpbWVWYWwgICAgICAgICAgdGNwX3RpbWVvdXQ7CisgIEdUaW1lVmFsICAgICAgICAgKnB0Y3BfdGltZW91dDsKKyAgZ3VpbnQgICAgICAgICAgICAgbGF0ZW5jeTsKKyAgZ2Jvb2xlYW4gICAgICAgICAgZHJvcF9vbl9sYXRlbmN5OworICBndWludDY0ICAgICAgICAgICBjb25uZWN0aW9uX3NwZWVkOworICBHc3RSVFNQTmF0TWV0aG9kICBuYXRfbWV0aG9kOworICBnYm9vbGVhbiAgICAgICAgICBkb19ydGNwOworICBnYm9vbGVhbiAgICAgICAgICBkb19ydHNwX2tlZXBfYWxpdmU7CisgIGdjaGFyICAgICAgICAgICAgKnByb3h5X2hvc3Q7CisgIGd1aW50ICAgICAgICAgICAgIHByb3h5X3BvcnQ7CisgIGdjaGFyICAgICAgICAgICAgKnByb3h5X3VzZXI7ICAgICAgICAvKiBmcm9tIHVybCBvciBwcm9wZXJ0eSAqLworICBnY2hhciAgICAgICAgICAgICpwcm94eV9wYXNzd2Q7ICAgICAgLyogZnJvbSB1cmwgb3IgcHJvcGVydHkgKi8KKyAgZ2NoYXIgICAgICAgICAgICAqcHJvcF9wcm94eV9pZDsgICAgIC8qIHNldCB2aWEgcHJvcGVydHkgKi8KKyAgZ2NoYXIgICAgICAgICAgICAqcHJvcF9wcm94eV9wdzsgICAgIC8qIHNldCB2aWEgcHJvcGVydHkgKi8KKyAgZ3VpbnQgICAgICAgICAgICAgcnRwX2Jsb2Nrc2l6ZTsKKyAgZ2NoYXIgICAgICAgICAgICAqdXNlcl9pZDsKKyAgZ2NoYXIgICAgICAgICAgICAqdXNlcl9wdzsKKyAgZ2ludCAgICAgICAgICAgICAgYnVmZmVyX21vZGU7CisgIEdzdFJUU1BSYW5nZSAgICAgIGNsaWVudF9wb3J0X3JhbmdlOworICBnaW50ICAgICAgICAgICAgICB1ZHBfYnVmZmVyX3NpemU7CisgIGdib29sZWFuICAgICAgICAgIHNob3J0X2hlYWRlcjsKKyAgZ3VpbnQgICAgICAgICAgICAgcHJvYmF0aW9uOworICBnYm9vbGVhbiAgICAgICAgICB1ZHBfcmVjb25uZWN0OworICBnY2hhciAgICAgICAgICAgICptdWx0aV9pZmFjZTsKKyAgZ2Jvb2xlYW4gICAgICAgICAgbnRwX3N5bmM7CisgIGdib29sZWFuICAgICAgICAgIHVzZV9waXBlbGluZV9jbG9jazsKKyAgR3N0U3RydWN0dXJlICAgICAqc2RlczsKKyAgR1Rsc0NlcnRpZmljYXRlRmxhZ3MgdGxzX3ZhbGlkYXRpb25fZmxhZ3M7CisgIEdUbHNEYXRhYmFzZSAgICAgKnRsc19kYXRhYmFzZTsKKyAgR1Rsc0ludGVyYWN0aW9uICAqdGxzX2ludGVyYWN0aW9uOworICBnYm9vbGVhbiAgICAgICAgICBkb19yZXRyYW5zbWlzc2lvbjsKKyAgZ2ludCAgICAgICAgICAgICAgbnRwX3RpbWVfc291cmNlOworICBnY2hhciAgICAgICAgICAgICp1c2VyX2FnZW50OworICBHc3RDbG9ja1RpbWUgICAgICBtYXhfcnRjcF9ydHBfdGltZV9kaWZmOworICBnYm9vbGVhbiAgICAgICAgICByZmM3MjczX3N5bmM7CisgIGd1aW50NjQgICAgICAgICAgIG1heF90c19vZmZzZXRfYWRqdXN0bWVudDsKKyAgZ2ludDY0ICAgICAgICAgICAgbWF4X3RzX29mZnNldDsKKyAgZ2Jvb2xlYW4gICAgICAgICAgbWF4X3RzX29mZnNldF9pc19zZXQ7CisKKyAgLyogc3RhdGUgKi8KKyAgR3N0UlRTUFN0YXRlICAgICAgIHN0YXRlOworICBnY2hhciAgICAgICAgICAgICAqY29udGVudF9iYXNlOworICBHc3RSVFNQTG93ZXJUcmFucyAgY3VyX3Byb3RvY29sczsKKyAgZ2Jvb2xlYW4gICAgICAgICAgIHRyaWVkX3VybF9hdXRoOworICBnY2hhciAgICAgICAgICAgICAqYWRkcjsKKyAgZ2Jvb2xlYW4gICAgICAgICAgIG5lZWRfcmVkaXJlY3Q7CisgIEdzdFJUU1BUaW1lUmFuZ2UgICpyYW5nZTsKKyAgZ2NoYXIgICAgICAgICAgICAgKmNvbnRyb2w7CisgIGd1aW50ICAgICAgICAgICAgICBuZXh0X3BvcnRfbnVtOworICBHc3RDbG9jayAgICAgICAgICAqcHJvdmlkZWRfY2xvY2s7CisKKyAgLyogc3VwcG9ydGVkIG1ldGhvZHMgKi8KKyAgZ2ludCAgICAgICAgICAgICAgIG1ldGhvZHM7CisKKyAgLyogc2Vla2FiaWxpdHkKKyAgICogLTEuMCA6IFN0cmVhbSBpcyBub3Qgc2Vla2FibGUKKyAgICogIDAuMCA6IHNlZWthYmxlIG9ubHkgdG8gdGhlIGJlZ2lubmluZworICAgKiBHX01BWEZMT0FUIDogQW55IHZhbHVlIGlzIHBvc3NpYmxlCisgICAqCisgICAqIEFueSBvdGhlciBwb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGxvbmdlc3QgZHVyYXRpb24KKyAgICogYmV0d2VlbiBhbnkgdHdvIHJhbmRvbSBhY2Nlc3MgcG9pbnRzCisgICAqICAqLworICBnZmxvYXQgICAgICAgICAgICAgc2Vla2FibGU7CisgIEdzdENsb2NrVGltZSAgICAgICBsYXN0X3BvczsKKworICAvKiBzZXNzaW9uIG1hbmFnZW1lbnQgKi8KKyAgR3N0RWxlbWVudCAgICAgICptYW5hZ2VyOworICBndWxvbmcgICAgICAgICAgIG1hbmFnZXJfc2lnX2lkOworICBndWxvbmcgICAgICAgICAgIG1hbmFnZXJfcHRtYXBfaWQ7CisgIGdib29sZWFuICAgICAgICAgdXNlX2J1ZmZlcmluZzsKKworICBHc3RSVFNQQ29ubkluZm8gIGNvbm5pbmZvOworCisgIC8qIGEgbGlzdCBvZiBSVFNQIGV4dGVuc2lvbnMgYXMgR3N0RWxlbWVudCAqLworICBHc3RSVFNQRXh0ZW5zaW9uTGlzdCAgKmV4dGVuc2lvbnM7CisKKyAgR3N0UlRTUFZlcnNpb24gZGVmYXVsdF92ZXJzaW9uOworICBHc3RSVFNQVmVyc2lvbiB2ZXJzaW9uOworfTsKKworc3RydWN0IF9Hc3RSVFNQU3JjQ2xhc3MgeworICBHc3RCaW5DbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfcnRzcHNyY19nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1JUU1BTUkNfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvcnRzcC9tZXNvbi5idWlsZCBiL2dzdC9ydHNwL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZThhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvcnRzcC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDE1IEBACitydHNwX3NvdXJjZXMgPSBbCisgICdnc3RydHNwLmMnLAorICAnZ3N0cnRzcHNyYy5jJywKKyAgJ2dzdHJ0cGRlYy5jJywKKyAgJ2dzdHJ0c3BleHQuYycsCitdCisKK2dzdHJ0c3AgPSBsaWJyYXJ5KCdnc3RydHNwJywKKyAgcnRzcF9zb3VyY2VzLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnaW9fZGVwLCBnc3RydHBfZGVwLCBnc3RydHNwX2RlcCwgZ3N0c2RwX2RlcCwgZ3N0bmV0X2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3Qvc2hhcGV3aXBlL01ha2VmaWxlLmFtIGIvZ3N0L3NoYXBld2lwZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjNkOTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3NoYXBld2lwZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDkgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdHNoYXBld2lwZS5sYQorCitsaWJnc3RzaGFwZXdpcGVfbGFfU09VUkNFUyA9IGdzdHNoYXBld2lwZS5jCisKK2xpYmdzdHNoYXBld2lwZV9sYV9DRkxBR1MgPSAkKEdJT19DRkxBR1MpICQoR1NUX0NGTEFHUykgJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykKK2xpYmdzdHNoYXBld2lwZV9sYV9MSUJBREQgPSAkKEdJT19MSUJTKSAkKEdTVF9MSUJTKSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R2aWRlby1AR1NUX0FQSV9WRVJTSU9OQAorbGliZ3N0c2hhcGV3aXBlX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3RzaGFwZXdpcGUuaApkaWZmIC0tZ2l0IGEvZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuYyBiL2dzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EwZGZkYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmMKQEAgLTAsMCArMSwxMTUwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOSwyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXNoYXBld2lwZQorICoKKyAqIFRoZSBzaGFwZXdpcGUgZWxlbWVudCBwcm92aWRlcyBjdXN0b20gdHJhbnNpdGlvbnMgb24gdmlkZW8gc3RyZWFtcworICogYmFzZWQgb24gYSBncmF5c2NhbGUgYml0bWFwLiBUaGUgc3RhdGUgb2YgdGhlIHRyYW5zaXRpb24gY2FuIGJlCisgKiBjb250cm9sbGVkIGJ5IHRoZSBwb3NpdGlvbiBwcm9wZXJ0eSBhbmQgYW4gb3B0aW9uYWwgYmxlbmRlZCBib3JkZXIKKyAqIGNhbiBiZSBhZGRlZCBieSB0aGUgYm9yZGVyIHByb3BlcnR5LgorICoKKyAqIFRyYW5zaXRpb24gYml0bWFwcyBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIHRoZQorICogPHVsaW5rIHVybD0iaHR0cDovL2NpbmVsZXJyYS5vcmcvdHJhbnNpdGlvbnMucGhwIj5DaW5lbGVycmEgdHJhbnNpdGlvbjwvdWxpbms+CisgKiBwYWdlLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiB2aWRlb3Rlc3RzcmMgISB2aWRlby94LXJhdyxmb3JtYXQ9QVlVVix3aWR0aD02NDAsaGVpZ2h0PTQ4MCAhIHNoYXBld2lwZSBwb3NpdGlvbj0wLjUgbmFtZT1zaGFwZSAhIHZpZGVvbWl4ZXIgbmFtZT1taXhlciAhIHZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsgICAgIGZpbGVzcmMgbG9jYXRpb249bWFzay5wbmcgISB0eXBlZmluZCAhIGRlY29kZWJpbiAhIHZpZGVvY29udmVydCAhIHZpZGVvc2NhbGUgISBxdWV1ZSAhIHNoYXBlLm1hc2tfc2luayAgICB2aWRlb3Rlc3RzcmMgcGF0dGVybj1zbm93ICEgdmlkZW8veC1yYXcsZm9ybWF0PUFZVVYsd2lkdGg9NjQwLGhlaWdodD00ODAgISBxdWV1ZSAhIG1peGVyLgorICogXXwgVGhpcyBwaXBlbGluZSBhZGRzIHRoZSB0cmFuc2l0aW9uIGZyb20gbWFzay5wbmcgd2l0aCBwb3NpdGlvbiAwLjUgdG8gYW4gU01QVEUgdGVzdCBzY3JlZW4gYW5kIHNub3cuCisgKiA8L3JlZnNlY3QyPgorICovCisKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImdzdHNoYXBld2lwZS5oIgorCitzdGF0aWMgdm9pZCBnc3Rfc2hhcGVfd2lwZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3Rfc2hhcGVfd2lwZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfc2hhcGVfd2lwZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyB2b2lkIGdzdF9zaGFwZV93aXBlX3Jlc2V0IChHc3RTaGFwZVdpcGUgKiBzZWxmKTsKK3N0YXRpYyB2b2lkIGdzdF9zaGFwZV93aXBlX3VwZGF0ZV9xb3MgKEdzdFNoYXBlV2lwZSAqIHNlbGYsIGdkb3VibGUgcHJvcG9ydGlvbiwKKyAgICBHc3RDbG9ja1RpbWVEaWZmIGRpZmYsIEdzdENsb2NrVGltZSB0aW1lKTsKK3N0YXRpYyB2b2lkIGdzdF9zaGFwZV93aXBlX3Jlc2V0X3FvcyAoR3N0U2hhcGVXaXBlICogc2VsZik7CitzdGF0aWMgdm9pZCBnc3Rfc2hhcGVfd2lwZV9yZWFkX3FvcyAoR3N0U2hhcGVXaXBlICogc2VsZiwgZ2RvdWJsZSAqIHByb3BvcnRpb24sCisgICAgR3N0Q2xvY2tUaW1lICogdGltZSk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3Rfc2hhcGVfd2lwZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc2hhcGVfd2lwZV92aWRlb19zaW5rX2NoYWluIChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9zaGFwZV93aXBlX3ZpZGVvX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF9zaGFwZV93aXBlX3ZpZGVvX3Npbmtfc2V0Y2FwcyAoR3N0U2hhcGVXaXBlICogc2VsZiwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3NoYXBlX3dpcGVfdmlkZW9fc2lua19nZXRjYXBzIChHc3RTaGFwZVdpcGUgKiBzZWxmLAorICAgIEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NoYXBlX3dpcGVfdmlkZW9fc2lua19xdWVyeSAoR3N0UGFkICogcGFkLAorICAgIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc2hhcGVfd2lwZV9tYXNrX3NpbmtfY2hhaW4gKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NoYXBlX3dpcGVfbWFza19zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc2hhcGVfd2lwZV9tYXNrX3Npbmtfc2V0Y2FwcyAoR3N0U2hhcGVXaXBlICogc2VsZiwKKyAgICBHc3RDYXBzICogY2Fwcyk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3NoYXBlX3dpcGVfbWFza19zaW5rX2dldGNhcHMgKEdzdFNoYXBlV2lwZSAqIHNlbGYsCisgICAgR3N0UGFkICogcGFkLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc2hhcGVfd2lwZV9tYXNrX3NpbmtfcXVlcnkgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIGdib29sZWFuIGdzdF9zaGFwZV93aXBlX3NyY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3NoYXBlX3dpcGVfc3JjX2dldGNhcHMgKEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NoYXBlX3dpcGVfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUE9TSVRJT04sCisgIFBST1BfQk9SREVSCit9OworCisjZGVmaW5lIERFRkFVTFRfUE9TSVRJT04gMC4wCisjZGVmaW5lIERFRkFVTFRfQk9SREVSIDAuMAorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgdmlkZW9fc2lua19wYWRfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJ2aWRlb19zaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBBWVVWLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0JBIH0iKSkpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgbWFza19zaW5rX3BhZF90ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJtYXNrX3NpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgR1JBWTgsICIKKyAgICAgICAgIndpZHRoID0gIiBHU1RfVklERU9fU0laRV9SQU5HRSAiLCAiCisgICAgICAgICJoZWlnaHQgPSAiIEdTVF9WSURFT19TSVpFX1JBTkdFICIsICIgImZyYW1lcmF0ZSA9IDAvMSA7ICIKKyAgICAgICAgInZpZGVvL3gtcmF3LCAiICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9WSURFT19ORSAoR1JBWTE2KSAiLCAiCisgICAgICAgICJ3aWR0aCA9ICIgR1NUX1ZJREVPX1NJWkVfUkFOR0UgIiwgIgorICAgICAgICAiaGVpZ2h0ID0gIiBHU1RfVklERU9fU0laRV9SQU5HRSAiLCAiICJmcmFtZXJhdGUgPSAwLzEiKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfcGFkX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwgR1NUX1BBRF9TUkMsIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgQVlVViwgQVJHQiwgQkdSQSwgQUJHUiwgUkdCQSB9IikpKTsKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3NoYXBlX3dpcGVfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3NoYXBlX3dpcGVfZGVidWcKKworI2RlZmluZSBnc3Rfc2hhcGVfd2lwZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RTaGFwZVdpcGUsIGdzdF9zaGFwZV93aXBlLCBHU1RfVFlQRV9FTEVNRU5UKTsKKworc3RhdGljIHZvaWQKK2dzdF9zaGFwZV93aXBlX2NsYXNzX2luaXQgKEdzdFNoYXBlV2lwZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3Rfc2hhcGVfd2lwZV9maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3NoYXBlX3dpcGVfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfc2hhcGVfd2lwZV9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QT1NJVElPTiwKKyAgICAgIGdfcGFyYW1fc3BlY19mbG9hdCAoInBvc2l0aW9uIiwgIlBvc2l0aW9uIiwgIlBvc2l0aW9uIG9mIHRoZSBtYXNrIiwKKyAgICAgICAgICAwLjAsIDEuMCwgREVGQVVMVF9QT1NJVElPTiwKKyAgICAgICAgICBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQk9SREVSLAorICAgICAgZ19wYXJhbV9zcGVjX2Zsb2F0ICgiYm9yZGVyIiwgIkJvcmRlciIsICJCb3JkZXIgb2YgdGhlIG1hc2siLAorICAgICAgICAgIDAuMCwgMS4wLCBERUZBVUxUX0JPUkRFUiwKKyAgICAgICAgICBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2hhcGVfd2lwZV9jaGFuZ2Vfc3RhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiU2hhcGUgV2lwZSB0cmFuc2l0aW9uIGZpbHRlciIsCisgICAgICAiRmlsdGVyL0VkaXRvci9WaWRlbyIsCisgICAgICAiQWRkcyBhIHNoYXBlIHdpcGUgdHJhbnNpdGlvbiB0byBhIHZpZGVvIHN0cmVhbSIsCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmdmlkZW9fc2lua19wYWRfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZtYXNrX3NpbmtfcGFkX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmc3JjX3BhZF90ZW1wbGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc2hhcGVfd2lwZV9pbml0IChHc3RTaGFwZVdpcGUgKiBzZWxmKQoreworICBzZWxmLT52aWRlb19zaW5rcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmdmlkZW9fc2lua19wYWRfdGVtcGxhdGUsICJ2aWRlb19zaW5rIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChzZWxmLT52aWRlb19zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zaGFwZV93aXBlX3ZpZGVvX3NpbmtfY2hhaW4pKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHNlbGYtPnZpZGVvX3NpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NoYXBlX3dpcGVfdmlkZW9fc2lua19ldmVudCkpOworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAoc2VsZi0+dmlkZW9fc2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc2hhcGVfd2lwZV92aWRlb19zaW5rX3F1ZXJ5KSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzZWxmKSwgc2VsZi0+dmlkZW9fc2lua3BhZCk7CisKKyAgc2VsZi0+bWFza19zaW5rcGFkID0KKyAgICAgIGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmbWFza19zaW5rX3BhZF90ZW1wbGF0ZSwgIm1hc2tfc2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAoc2VsZi0+bWFza19zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zaGFwZV93aXBlX21hc2tfc2lua19jaGFpbikpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoc2VsZi0+bWFza19zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zaGFwZV93aXBlX21hc2tfc2lua19ldmVudCkpOworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAoc2VsZi0+bWFza19zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zaGFwZV93aXBlX21hc2tfc2lua19xdWVyeSkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoc2VsZiksIHNlbGYtPm1hc2tfc2lua3BhZCk7CisKKyAgc2VsZi0+c3JjcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmNfcGFkX3RlbXBsYXRlLCAic3JjIik7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChzZWxmLT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NoYXBlX3dpcGVfc3JjX2V2ZW50KSk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChzZWxmLT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NoYXBlX3dpcGVfc3JjX3F1ZXJ5KSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzZWxmKSwgc2VsZi0+c3JjcGFkKTsKKworICBnX211dGV4X2luaXQgKCZzZWxmLT5tYXNrX211dGV4KTsKKyAgZ19jb25kX2luaXQgKCZzZWxmLT5tYXNrX2NvbmQpOworCisgIGdzdF9zaGFwZV93aXBlX3Jlc2V0IChzZWxmKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zaGFwZV93aXBlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTaGFwZVdpcGUgKnNlbGYgPSBHU1RfU0hBUEVfV0lQRSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUE9TSVRJT046CisgICAgICBnX3ZhbHVlX3NldF9mbG9hdCAodmFsdWUsIHNlbGYtPm1hc2tfcG9zaXRpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JPUkRFUjoKKyAgICAgIGdfdmFsdWVfc2V0X2Zsb2F0ICh2YWx1ZSwgc2VsZi0+bWFza19ib3JkZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3NoYXBlX3dpcGVfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFNoYXBlV2lwZSAqc2VsZiA9IEdTVF9TSEFQRV9XSVBFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QT1NJVElPTjp7CisgICAgICBnZmxvYXQgZiA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzZWxmLCAiU2V0dGluZyBtYXNrIHBvc2l0aW9uOiAlZiIsIGYpOworICAgICAgc2VsZi0+bWFza19wb3NpdGlvbiA9IGY7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0JPUkRFUjp7CisgICAgICBnZmxvYXQgZiA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzZWxmLCAiU2V0dGluZyBtYXNrIGJvcmRlcjogJWYiLCBmKTsKKyAgICAgIHNlbGYtPm1hc2tfYm9yZGVyID0gZjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc2hhcGVfd2lwZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0U2hhcGVXaXBlICpzZWxmID0gR1NUX1NIQVBFX1dJUEUgKG9iamVjdCk7CisKKyAgZ3N0X3NoYXBlX3dpcGVfcmVzZXQgKHNlbGYpOworCisgIGdfY29uZF9jbGVhciAoJnNlbGYtPm1hc2tfY29uZCk7CisgIGdfbXV0ZXhfY2xlYXIgKCZzZWxmLT5tYXNrX211dGV4KTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc2hhcGVfd2lwZV9yZXNldCAoR3N0U2hhcGVXaXBlICogc2VsZikKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlJlc2V0dGluZyBpbnRlcm5hbCBzdGF0ZSIpOworCisgIGlmIChzZWxmLT5tYXNrKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKHNlbGYtPm1hc2spOworICBzZWxmLT5tYXNrID0gTlVMTDsKKworICBnX211dGV4X2xvY2sgKCZzZWxmLT5tYXNrX211dGV4KTsKKyAgZ19jb25kX3NpZ25hbCAoJnNlbGYtPm1hc2tfY29uZCk7CisgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bWFza19tdXRleCk7CisKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJnNlbGYtPnZpbmZvKTsKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJnNlbGYtPm1pbmZvKTsKKyAgc2VsZi0+bWFza19icHAgPSAwOworCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWxmLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworCisgIGdzdF9zaGFwZV93aXBlX3Jlc2V0X3FvcyAoc2VsZik7CisgIHNlbGYtPmZyYW1lX2R1cmF0aW9uID0gMDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2hhcGVfd2lwZV92aWRlb19zaW5rX3NldGNhcHMgKEdzdFNoYXBlV2lwZSAqIHNlbGYsIEdzdENhcHMgKiBjYXBzKQoreworICBnYm9vbGVhbiByZXQgPSBUUlVFOworICBHc3RWaWRlb0luZm8gaW5mbzsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiU2V0dGluZyBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgaWYgKCFnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKSkKKyAgICBnb3RvIGludmFsaWRfY2FwczsKKworICBpZiAoKHNlbGYtPnZpbmZvLndpZHRoICE9IGluZm8ud2lkdGggfHwgc2VsZi0+dmluZm8uaGVpZ2h0ICE9IGluZm8uaGVpZ2h0KSAmJgorICAgICAgc2VsZi0+dmluZm8ud2lkdGggPiAwICYmIHNlbGYtPnZpbmZvLmhlaWdodCA+IDApIHsKKyAgICBnX211dGV4X2xvY2sgKCZzZWxmLT5tYXNrX211dGV4KTsKKyAgICBpZiAoc2VsZi0+bWFzaykKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHNlbGYtPm1hc2spOworICAgIHNlbGYtPm1hc2sgPSBOVUxMOworICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bWFza19tdXRleCk7CisgIH0KKworCisgIGlmIChpbmZvLmZwc19uICE9IDApCisgICAgc2VsZi0+ZnJhbWVfZHVyYXRpb24gPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKEdTVF9TRUNPTkQsIGluZm8uZnBzX2QsIGluZm8uZnBzX24pOworICBlbHNlCisgICAgc2VsZi0+ZnJhbWVfZHVyYXRpb24gPSAwOworCisgIHNlbGYtPnZpbmZvID0gaW5mbzsKKworICByZXQgPSBnc3RfcGFkX3NldF9jYXBzIChzZWxmLT5zcmNwYWQsIGNhcHMpOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCitpbnZhbGlkX2NhcHM6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiSW52YWxpZCBjYXBzIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9zaGFwZV93aXBlX3ZpZGVvX3NpbmtfZ2V0Y2FwcyAoR3N0U2hhcGVXaXBlICogc2VsZiwgR3N0UGFkICogcGFkLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnRlbXBsLCAqcmV0LCAqdG1wOworCisgIHJldCA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFkKTsKKyAgaWYgKHJldCAhPSBOVUxMKQorICAgIHJldHVybiByZXQ7CisKKyAgdGVtcGwgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAocGFkKTsKKyAgdG1wID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKHNlbGYtPnNyY3BhZCwgTlVMTCk7CisgIGlmICh0bXApIHsKKyAgICByZXQgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHRtcCwgdGVtcGwpOworICAgIGdzdF9jYXBzX3VucmVmICh0ZW1wbCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcCk7CisgIH0gZWxzZSB7CisgICAgcmV0ID0gdGVtcGw7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAic3JjcGFkIGFjY2VwdGVkIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCByZXQpOworCisgIGlmIChnc3RfY2Fwc19pc19lbXB0eSAocmV0KSkKKyAgICBnb3RvIGRvbmU7CisKKyAgdG1wID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKHBhZCwgTlVMTCk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgInBlZXJwYWQgYWNjZXB0ZWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIHRtcCk7CisgIGlmICh0bXApIHsKKyAgICBHc3RDYXBzICppbnRlcnNlY3Rpb247CisKKyAgICBpbnRlcnNlY3Rpb24gPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHRtcCwgcmV0KTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmV0KTsKKyAgICByZXQgPSBpbnRlcnNlY3Rpb247CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiaW50ZXJzZWN0aW9uOiAlIiBHU1RfUFRSX0ZPUk1BVCwgdG1wKTsKKworICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKHJldCkpCisgICAgZ290byBkb25lOworCisgIGlmIChzZWxmLT52aW5mby5oZWlnaHQgJiYgc2VsZi0+dmluZm8ud2lkdGgpIHsKKyAgICBndWludCBpLCBuOworCisgICAgcmV0ID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocmV0KTsKKyAgICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKHJldCk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAocmV0LCBpKTsKKworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHNlbGYtPnZpbmZvLndpZHRoLCAiaGVpZ2h0IiwKKyAgICAgICAgICBHX1RZUEVfSU5ULCBzZWxmLT52aW5mby5oZWlnaHQsIE5VTEwpOworICAgIH0KKyAgfQorCisgIHRtcCA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChzZWxmLT5tYXNrX3NpbmtwYWQsIE5VTEwpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJtYXNrIGFjY2VwdGVkIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCB0bXApOworICBpZiAodG1wKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uLCAqdG1wMjsKKyAgICBndWludCBpLCBuOworCisgICAgdG1wMiA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChzZWxmLT5tYXNrX3NpbmtwYWQpOworICAgIGludGVyc2VjdGlvbiA9IGdzdF9jYXBzX2ludGVyc2VjdCAodG1wLCB0bXAyKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wMik7CisgICAgdG1wID0gaW50ZXJzZWN0aW9uOworCisgICAgdG1wID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAodG1wKTsKKyAgICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKHRtcCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlICh0bXAsIGkpOworCisgICAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZHMgKHMsICJmb3JtYXQiLCAiZnJhbWVyYXRlIiwgTlVMTCk7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzLCAidmlkZW8veC1yYXciKTsKKyAgICB9CisKKyAgICBpbnRlcnNlY3Rpb24gPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHRtcCwgcmV0KTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmV0KTsKKyAgICByZXQgPSBpbnRlcnNlY3Rpb247CisgIH0KK2RvbmU6CisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJSZXR1cm5pbmcgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIHJldCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2hhcGVfd2lwZV9tYXNrX3Npbmtfc2V0Y2FwcyAoR3N0U2hhcGVXaXBlICogc2VsZiwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIGdpbnQgd2lkdGgsIGhlaWdodCwgYnBwOworICBHc3RWaWRlb0luZm8gaW5mbzsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiU2V0dGluZyBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgaWYgKCFnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKSkgeworICAgIHJldCA9IEZBTFNFOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIHdpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKCZpbmZvKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUICgmaW5mbyk7CisgIGJwcCA9IEdTVF9WSURFT19JTkZPX0NPTVBfREVQVEggKCZpbmZvLCAwKTsKKworICBpZiAoKHNlbGYtPnZpbmZvLndpZHRoICE9IHdpZHRoIHx8IHNlbGYtPnZpbmZvLmhlaWdodCAhPSBoZWlnaHQpICYmCisgICAgICBzZWxmLT52aW5mby53aWR0aCA+IDAgJiYgc2VsZi0+dmluZm8uaGVpZ2h0ID4gMCkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJNYXNrIGNhcHMgbXVzdCBoYXZlIHRoZSBzYW1lIHdpZHRoL2hlaWdodCAiCisgICAgICAgICJhcyB0aGUgdmlkZW8gY2FwcyIpOworICAgIHJldCA9IEZBTFNFOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIHNlbGYtPm1hc2tfYnBwID0gYnBwOworICBzZWxmLT5taW5mbyA9IGluZm87CisKK2RvbmU6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9zaGFwZV93aXBlX21hc2tfc2lua19nZXRjYXBzIChHc3RTaGFwZVdpcGUgKiBzZWxmLCBHc3RQYWQgKiBwYWQsCisgICAgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqcmV0LCAqdG1wLCAqdGNhcHM7CisgIGd1aW50IGksIG47CisKKyAgcmV0ID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChwYWQpOworICBpZiAocmV0ICE9IE5VTEwpCisgICAgcmV0dXJuIHJldDsKKworICB0Y2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChzZWxmLT52aWRlb19zaW5rcGFkKTsKKyAgdG1wID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKHNlbGYtPnZpZGVvX3NpbmtwYWQsIE5VTEwpOworICBpZiAodG1wKSB7CisgICAgcmV0ID0gZ3N0X2NhcHNfaW50ZXJzZWN0ICh0bXAsIHRjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmICh0bXApOworICB9IGVsc2UgeworICAgIHJldCA9IHRjYXBzOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgInZpZGVvIHNpbmsgYWNjZXB0ZWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIHJldCk7CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChyZXQpKQorICAgIGdvdG8gZG9uZTsKKworICB0bXAgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAoc2VsZi0+c3JjcGFkLCBOVUxMKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgInNyY3BhZCBhY2NlcHRlZCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKworICBpZiAodG1wKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgaW50ZXJzZWN0aW9uID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChyZXQsIHRtcCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHJldCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcCk7CisgICAgcmV0ID0gaW50ZXJzZWN0aW9uOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgImludGVyc2VjdGlvbjogJSIgR1NUX1BUUl9GT1JNQVQsIHJldCk7CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChyZXQpKQorICAgIGdvdG8gZG9uZTsKKworICByZXQgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChyZXQpOworICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKHJldCk7CisgIHRtcCA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHJldCwgaSk7CisgICAgR3N0U3RydWN0dXJlICp0OworCisgICAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAocywgInZpZGVvL3gtcmF3Iik7CisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGRzIChzLCAiZm9ybWF0IiwgImZyYW1lcmF0ZSIsIE5VTEwpOworCisgICAgaWYgKHNlbGYtPnZpbmZvLndpZHRoICYmIHNlbGYtPnZpbmZvLmhlaWdodCkKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAid2lkdGgiLCBHX1RZUEVfSU5ULCBzZWxmLT52aW5mby53aWR0aCwgImhlaWdodCIsCisgICAgICAgICAgR19UWVBFX0lOVCwgc2VsZi0+dmluZm8uaGVpZ2h0LCBOVUxMKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sIDAsIDEsIE5VTEwpOworCisgICAgdCA9IGdzdF9zdHJ1Y3R1cmVfY29weSAocyk7CisKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsIEdTVF9WSURFT19ORSAoR1JBWTE2KSwgTlVMTCk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHQsICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiR1JBWTgiLCBOVUxMKTsKKworICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKHRtcCwgdCk7CisgIH0KKyAgZ3N0X2NhcHNfYXBwZW5kIChyZXQsIHRtcCk7CisKKyAgdG1wID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKHBhZCwgTlVMTCk7CisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJwZWVyIGFjY2VwdGVkIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCB0bXApOworCisgIGlmICh0bXApIHsKKyAgICBHc3RDYXBzICppbnRlcnNlY3Rpb247CisKKyAgICBpbnRlcnNlY3Rpb24gPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHRtcCwgcmV0KTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmV0KTsKKyAgICByZXQgPSBpbnRlcnNlY3Rpb247CisgIH0KKworZG9uZToKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIlJldHVybmluZyBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3Rfc2hhcGVfd2lwZV9zcmNfZ2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RTaGFwZVdpcGUgKnNlbGYgPSBHU1RfU0hBUEVfV0lQRSAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKyAgR3N0Q2FwcyAqdGVtcGwsICpyZXQsICp0bXA7CisKKyAgcmV0ID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChwYWQpOworICBpZiAocmV0ICE9IE5VTEwpCisgICAgcmV0dXJuIHJldDsKKworICByZXQgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHNlbGYtPnZpZGVvX3NpbmtwYWQpOworICBpZiAocmV0ICE9IE5VTEwpCisgICAgcmV0dXJuIHJldDsKKworICB0ZW1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChzZWxmLT52aWRlb19zaW5rcGFkKTsKKyAgdG1wID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKHNlbGYtPnZpZGVvX3NpbmtwYWQsIE5VTEwpOworICBpZiAodG1wKSB7CisgICAgcmV0ID0gZ3N0X2NhcHNfaW50ZXJzZWN0ICh0bXAsIHRlbXBsKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodGVtcGwpOworICAgIGdzdF9jYXBzX3VucmVmICh0bXApOworICB9IGVsc2UgeworICAgIHJldCA9IHRlbXBsOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgInZpZGVvIHNpbmsgYWNjZXB0ZWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIHJldCk7CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChyZXQpKQorICAgIGdvdG8gZG9uZTsKKworICB0bXAgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAocGFkLCBOVUxMKTsKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgInBlZXIgYWNjZXB0ZWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIHJldCk7CisgIGlmICh0bXApIHsKKyAgICBHc3RDYXBzICppbnRlcnNlY3Rpb247CisKKyAgICBpbnRlcnNlY3Rpb24gPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHRtcCwgcmV0KTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocmV0KTsKKyAgICByZXQgPSBpbnRlcnNlY3Rpb247CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiaW50ZXJzZWN0aW9uOiAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKworICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKHJldCkpCisgICAgZ290byBkb25lOworCisgIGlmIChzZWxmLT52aW5mby5oZWlnaHQgJiYgc2VsZi0+dmluZm8ud2lkdGgpIHsKKyAgICBndWludCBpLCBuOworCisgICAgcmV0ID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAocmV0KTsKKyAgICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKHJldCk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAocmV0LCBpKTsKKworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHNlbGYtPnZpbmZvLndpZHRoLCAiaGVpZ2h0IiwKKyAgICAgICAgICBHX1RZUEVfSU5ULCBzZWxmLT52aW5mby5oZWlnaHQsIE5VTEwpOworICAgIH0KKyAgfQorCisgIHRtcCA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChzZWxmLT5tYXNrX3NpbmtwYWQsIE5VTEwpOworICBHU1RfTE9HX09CSkVDVCAocGFkLCAibWFzayBzaW5rIGFjY2VwdGVkIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCByZXQpOworICBpZiAodG1wKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uLCAqdG1wMjsKKyAgICBndWludCBpLCBuOworCisgICAgdG1wMiA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChzZWxmLT5tYXNrX3NpbmtwYWQpOworICAgIGludGVyc2VjdGlvbiA9IGdzdF9jYXBzX2ludGVyc2VjdCAodG1wLCB0bXAyKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wMik7CisKKyAgICB0bXAgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChpbnRlcnNlY3Rpb24pOworICAgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAodG1wKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHRtcCwgaSk7CisKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkcyAocywgImZvcm1hdCIsICJmcmFtZXJhdGUiLCBOVUxMKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHMsICJ2aWRlby94LXJhdyIpOworICAgIH0KKworICAgIGludGVyc2VjdGlvbiA9IGdzdF9jYXBzX2ludGVyc2VjdCAodG1wLCByZXQpOworICAgIGdzdF9jYXBzX3VucmVmICh0bXApOworICAgIGdzdF9jYXBzX3VucmVmIChyZXQpOworICAgIHJldCA9IGludGVyc2VjdGlvbjsKKyAgfQorCitkb25lOgorCisgIGdzdF9vYmplY3RfdW5yZWYgKHNlbGYpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJSZXR1cm5pbmcgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIHJldCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2hhcGVfd2lwZV92aWRlb19zaW5rX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RTaGFwZVdpcGUgKnNlbGYgPSAoR3N0U2hhcGVXaXBlICopIHBhcmVudDsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJIYW5kbGluZyBxdWVyeSBvZiB0eXBlICclcyciLAorICAgICAgZ3N0X3F1ZXJ5X3R5cGVfZ2V0X25hbWUgKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpKTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKmZpbHRlciwgKmNhcHM7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9jYXBzIChxdWVyeSwgJmZpbHRlcik7CisgICAgICBjYXBzID0gZ3N0X3NoYXBlX3dpcGVfdmlkZW9fc2lua19nZXRjYXBzIChzZWxmLCBwYWQsIGZpbHRlcik7CisgICAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NoYXBlX3dpcGVfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0U2hhcGVXaXBlICpzZWxmID0gR1NUX1NIQVBFX1dJUEUgKHBhcmVudCk7CisgIGdib29sZWFuIHJldDsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiSGFuZGxpbmcgcXVlcnkgb2YgdHlwZSAnJXMnIiwKKyAgICAgIGdzdF9xdWVyeV90eXBlX2dldF9uYW1lIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpmaWx0ZXIsICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZmaWx0ZXIpOworICAgICAgY2FwcyA9IGdzdF9zaGFwZV93aXBlX3NyY19nZXRjYXBzIChwYWQsIGZpbHRlcik7CisgICAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX3BlZXJfcXVlcnkgKHNlbGYtPnZpZGVvX3NpbmtwYWQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zaGFwZV93aXBlX3VwZGF0ZV9xb3MgKEdzdFNoYXBlV2lwZSAqIHNlbGYsIGdkb3VibGUgcHJvcG9ydGlvbiwKKyAgICBHc3RDbG9ja1RpbWVEaWZmIGRpZmYsIEdzdENsb2NrVGltZSB0aW1lc3RhbXApCit7CisgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZik7CisgIHNlbGYtPnByb3BvcnRpb24gPSBwcm9wb3J0aW9uOworICBpZiAoR19MSUtFTFkgKHRpbWVzdGFtcCAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSkgeworICAgIGlmIChHX1VOTElLRUxZIChkaWZmID4gMCkpCisgICAgICBzZWxmLT5lYXJsaWVzdF90aW1lID0gdGltZXN0YW1wICsgMiAqIGRpZmYgKyBzZWxmLT5mcmFtZV9kdXJhdGlvbjsKKyAgICBlbHNlCisgICAgICBzZWxmLT5lYXJsaWVzdF90aW1lID0gdGltZXN0YW1wICsgZGlmZjsKKyAgfSBlbHNlIHsKKyAgICBzZWxmLT5lYXJsaWVzdF90aW1lID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc2hhcGVfd2lwZV9yZXNldF9xb3MgKEdzdFNoYXBlV2lwZSAqIHNlbGYpCit7CisgIGdzdF9zaGFwZV93aXBlX3VwZGF0ZV9xb3MgKHNlbGYsIDAuNSwgMCwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc2hhcGVfd2lwZV9yZWFkX3FvcyAoR3N0U2hhcGVXaXBlICogc2VsZiwgZ2RvdWJsZSAqIHByb3BvcnRpb24sCisgICAgR3N0Q2xvY2tUaW1lICogdGltZSkKK3sKKyAgR1NUX09CSkVDVF9MT0NLIChzZWxmKTsKKyAgKnByb3BvcnRpb24gPSBzZWxmLT5wcm9wb3J0aW9uOworICAqdGltZSA9IHNlbGYtPmVhcmxpZXN0X3RpbWU7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChzZWxmKTsKK30KKworLyogUGVyZm9ybSBxb3MgY2FsY3VsYXRpb25zIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBuZXh0IGZyYW1lLiBSZXR1cm5zIFRSVUUgaWYKKyAqIHRoZSBmcmFtZSBzaG91bGQgYmUgcHJvY2Vzc2VkLCBGQUxTRSBpZiB0aGUgZnJhbWUgY2FuIGJlIGRyb3BwZWQgZW50aXJlbHkgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NoYXBlX3dpcGVfZG9fcW9zIChHc3RTaGFwZVdpcGUgKiBzZWxmLCBHc3RDbG9ja1RpbWUgdGltZXN0YW1wKQoreworICBHc3RDbG9ja1RpbWUgcW9zdGltZSwgZWFybGllc3RfdGltZTsKKyAgZ2RvdWJsZSBwcm9wb3J0aW9uOworCisgIC8qIG5vIHRpbWVzdGFtcCwgY2FuJ3QgZG8gUW9TID0+IHByb2Nlc3MgZnJhbWUgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAodGltZXN0YW1wKSkpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoc2VsZiwgImludmFsaWQgdGltZXN0YW1wLCBjYW4ndCBkbyBRb1MsIHByb2Nlc3MgZnJhbWUiKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIC8qIGdldCBsYXRlc3QgUW9TIG9ic2VydmF0aW9uIHZhbHVlcyAqLworICBnc3Rfc2hhcGVfd2lwZV9yZWFkX3FvcyAoc2VsZiwgJnByb3BvcnRpb24sICZlYXJsaWVzdF90aW1lKTsKKworICAvKiBza2lwIHFvcyBpZiB3ZSBoYXZlIG5vIG9ic2VydmF0aW9uICh5ZXQpID0+IHByb2Nlc3MgZnJhbWUgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKCFHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoZWFybGllc3RfdGltZSkpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNlbGYsICJubyBvYnNlcnZhdGlvbiB5ZXQsIHByb2Nlc3MgZnJhbWUiKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIC8qIHFvcyBpcyBkb25lIG9uIHJ1bm5pbmcgdGltZSAqLworICBxb3N0aW1lID0gZ3N0X3NlZ21lbnRfdG9fcnVubmluZ190aW1lICgmc2VsZi0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgdGltZXN0YW1wKTsKKworICAvKiBzZWUgaG93IG91ciBuZXh0IHRpbWVzdGFtcCByZWxhdGVzIHRvIHRoZSBsYXRlc3QgcW9zIHRpbWVzdGFtcCAqLworICBHU1RfTE9HX09CSkVDVCAoc2VsZiwgInFvc3RpbWUgJSIgR1NUX1RJTUVfRk9STUFUICIsIGVhcmxpZXN0ICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHFvc3RpbWUpLCBHU1RfVElNRV9BUkdTIChlYXJsaWVzdF90aW1lKSk7CisKKyAgaWYgKHFvc3RpbWUgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSAmJiBxb3N0aW1lIDw9IGVhcmxpZXN0X3RpbWUpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAid2UgYXJlIGxhdGUsIGRyb3AgZnJhbWUiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoc2VsZiwgInByb2Nlc3MgZnJhbWUiKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNkZWZpbmUgQ1JFQVRFX0FSR0JfRlVOQ1RJT05TKGRlcHRoLCBuYW1lLCBzaGlmdCwgYSwgciwgZywgYikgXAorc3RhdGljIHZvaWQgXAorZ3N0X3NoYXBlX3dpcGVfYmxlbmRfIyNuYW1lIyNfIyNkZXB0aCAoR3N0U2hhcGVXaXBlICogc2VsZiwgR3N0VmlkZW9GcmFtZSAqIGluZnJhbWUsIFwKKyAgICBHc3RWaWRlb0ZyYW1lICogbWFza2ZyYW1lLCBHc3RWaWRlb0ZyYW1lICogb3V0ZnJhbWUpIFwKK3sgXAorICBjb25zdCBndWludCMjZGVwdGggKm1hc2sgPSAoY29uc3QgZ3VpbnQjI2RlcHRoICopIEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChtYXNrZnJhbWUsIDApOyBcCisgIGNvbnN0IGd1aW50OCAqaW5wdXQgPSAoY29uc3QgZ3VpbnQ4ICopIEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbmZyYW1lLCAwKTsgXAorICBndWludDggKm91dHB1dCA9IChndWludDggKikgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dGZyYW1lLCAwKTsgXAorICBndWludCBpLCBqOyBcCisgIGdpbnQgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluZnJhbWUpOyBcCisgIGdpbnQgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5mcmFtZSk7IFwKKyAgZ3VpbnQgbWFza19pbmNyZW1lbnQgPSAoKGRlcHRoID09IDE2KSA/IEdTVF9ST1VORF9VUF8yICh3aWR0aCkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1RfUk9VTkRfVVBfNCAod2lkdGgpKSAtIHdpZHRoOyBcCisgIGdmbG9hdCBwb3NpdGlvbiA9IHNlbGYtPm1hc2tfcG9zaXRpb247IFwKKyAgZ2Zsb2F0IGxvdyA9IHBvc2l0aW9uIC0gKHNlbGYtPm1hc2tfYm9yZGVyIC8gMi4wZik7IFwKKyAgZ2Zsb2F0IGhpZ2ggPSBwb3NpdGlvbiArIChzZWxmLT5tYXNrX2JvcmRlciAvIDIuMGYpOyBcCisgIGd1aW50MzIgbG93X2ksIGhpZ2hfaSwgcm91bmRfaTsgXAorICBcCisgIGlmIChsb3cgPCAwLjBmKSB7IFwKKyAgICBoaWdoID0gMC4wZjsgXAorICAgIGxvdyA9IDAuMGY7IFwKKyAgfSBcCisgIFwKKyAgaWYgKGhpZ2ggPiAxLjBmKSB7IFwKKyAgICBsb3cgPSAxLjBmOyBcCisgICAgaGlnaCA9IDEuMGY7IFwKKyAgfSBcCisgIFwKKyAgbG93X2kgPSBsb3cgKiA2NTUzNjsgXAorICBoaWdoX2kgPSBoaWdoICogNjU1MzY7IFwKKyAgcm91bmRfaSA9IChoaWdoX2kgLSBsb3dfaSkgPj4gMTsgXAorICBcCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeyBcCisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsgXAorICAgICAgZ3VpbnQzMiBpbiA9ICptYXNrIDw8IHNoaWZ0OyBcCisgICAgICBcCisgICAgICBpZiAoaW4gPCBsb3dfaSkgeyBcCisgICAgICAgIG91dHB1dFthXSA9IDB4MDA7ICAgICAgIC8qIEEgKi8gXAorICAgICAgICBvdXRwdXRbcl0gPSBpbnB1dFtyXTsgICAvKiBSICovIFwKKyAgICAgICAgb3V0cHV0W2ddID0gaW5wdXRbZ107ICAgLyogRyAqLyBcCisgICAgICAgIG91dHB1dFtiXSA9IGlucHV0W2JdOyAgIC8qIEIgKi8gXAorICAgICAgfSBlbHNlIGlmIChpbiA+PSBoaWdoX2kpIHsgXAorICAgICAgICBvdXRwdXRbYV0gPSBpbnB1dFthXTsgICAvKiBBICovIFwKKyAgICAgICAgb3V0cHV0W3JdID0gaW5wdXRbcl07ICAgLyogUiAqLyBcCisgICAgICAgIG91dHB1dFtnXSA9IGlucHV0W2ddOyAgIC8qIEcgKi8gXAorICAgICAgICBvdXRwdXRbYl0gPSBpbnB1dFtiXTsgICAvKiBCICovIFwKKyAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgZ3VpbnQzMiB2YWw7IFwKKyAgICAgICAgLyogTm90ZTogVGhpcyB3aWxsIG5ldmVyIG92ZXJmbG93IG9yIGJlIGxhcmdlciB0aGFuIDI1NSEgKi8gXAorICAgICAgICB2YWwgPSAoKChpbiAtIGxvd19pKSA8PCAxNikgKyByb3VuZF9pKSAvIChoaWdoX2kgLSBsb3dfaSk7IFwKKyAgICAgICAgdmFsID0gKHZhbCAqIGlucHV0W2FdICsgMzI3NjgpID4+IDE2OyBcCisgICAgICAgIFwKKyAgICAgICAgb3V0cHV0W2FdID0gdmFsOyAgICAgICAgLyogQSAqLyBcCisgICAgICAgIG91dHB1dFtyXSA9IGlucHV0W3JdOyAgIC8qIFIgKi8gXAorICAgICAgICBvdXRwdXRbZ10gPSBpbnB1dFtnXTsgICAvKiBHICovIFwKKyAgICAgICAgb3V0cHV0W2JdID0gaW5wdXRbYl07ICAgLyogQiAqLyBcCisgICAgICB9IFwKKyAgICAgIFwKKyAgICAgIG1hc2srKzsgXAorICAgICAgaW5wdXQgKz0gNDsgXAorICAgICAgb3V0cHV0ICs9IDQ7IFwKKyAgICB9IFwKKyAgICBtYXNrICs9IG1hc2tfaW5jcmVtZW50OyBcCisgIH0gXAorfQorCitDUkVBVEVfQVJHQl9GVU5DVElPTlMgKDE2LCBhcmdiLCAwLCAwLCAxLCAyLCAzKTsKK0NSRUFURV9BUkdCX0ZVTkNUSU9OUyAoOCwgYXJnYiwgOCwgMCwgMSwgMiwgMyk7CisKK0NSRUFURV9BUkdCX0ZVTkNUSU9OUyAoMTYsIGJncmEsIDAsIDMsIDIsIDEsIDApOworQ1JFQVRFX0FSR0JfRlVOQ1RJT05TICg4LCBiZ3JhLCA4LCAzLCAyLCAxLCAwKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9zaGFwZV93aXBlX3ZpZGVvX3NpbmtfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0U2hhcGVXaXBlICpzZWxmID0gR1NUX1NIQVBFX1dJUEUgKHBhcmVudCk7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdEJ1ZmZlciAqbWFzayA9IE5VTEwsICpvdXRidWYgPSBOVUxMOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworICBHc3RWaWRlb0ZyYW1lIGluZnJhbWUsIG91dGZyYW1lLCBtYXNrZnJhbWU7CisKKyAgaWYgKEdfVU5MSUtFTFkgKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJnNlbGYtPnZpbmZvKSA9PQorICAgICAgICAgIEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTikpCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKTsKKyAgdGltZXN0YW1wID0KKyAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmc2VsZi0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXApOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAodGltZXN0YW1wKSkKKyAgICBnc3Rfb2JqZWN0X3N5bmNfdmFsdWVzIChHU1RfT0JKRUNUIChzZWxmKSwgdGltZXN0YW1wKTsKKworICBHU1RfTE9HX09CSkVDVCAoc2VsZiwKKyAgICAgICJCbGVuZGluZyBidWZmZXIgd2l0aCB0aW1lc3RhbXAgJSIgR1NUX1RJTUVfRk9STUFUICIgYXQgcG9zaXRpb24gJWYiLAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSwgc2VsZi0+bWFza19wb3NpdGlvbik7CisKKyAgZ19tdXRleF9sb2NrICgmc2VsZi0+bWFza19tdXRleCk7CisgIGlmIChzZWxmLT5zaHV0ZG93bikKKyAgICBnb3RvIHNodXRkb3duOworCisgIGlmICghc2VsZi0+bWFzaykKKyAgICBnX2NvbmRfd2FpdCAoJnNlbGYtPm1hc2tfY29uZCwgJnNlbGYtPm1hc2tfbXV0ZXgpOworCisgIGlmIChzZWxmLT5tYXNrID09IE5VTEwgfHwgc2VsZi0+c2h1dGRvd24pIHsKKyAgICBnb3RvIHNodXRkb3duOworICB9IGVsc2UgeworICAgIG1hc2sgPSBnc3RfYnVmZmVyX3JlZiAoc2VsZi0+bWFzayk7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZzZWxmLT5tYXNrX211dGV4KTsKKworICBpZiAoIWdzdF9zaGFwZV93aXBlX2RvX3FvcyAoc2VsZiwgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcikpKQorICAgIGdvdG8gcW9zOworCisgIC8qIFdpbGwgYmxlbmQgaW5wbGFjZSBpZiBidWZmZXIgaXMgd3JpdGFibGUgKi8KKyAgb3V0YnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChidWZmZXIpOworICBnc3RfdmlkZW9fZnJhbWVfbWFwICgmb3V0ZnJhbWUsICZzZWxmLT52aW5mbywgb3V0YnVmLCBHU1RfTUFQX1JFQURXUklURSk7CisgIGdzdF92aWRlb19mcmFtZV9tYXAgKCZpbmZyYW1lLCAmc2VsZi0+dmluZm8sIG91dGJ1ZiwgR1NUX01BUF9SRUFEKTsKKworICBnc3RfdmlkZW9fZnJhbWVfbWFwICgmbWFza2ZyYW1lLCAmc2VsZi0+bWluZm8sIG1hc2ssIEdTVF9NQVBfUkVBRCk7CisKKyAgc3dpdGNoIChHU1RfVklERU9fSU5GT19GT1JNQVQgKCZzZWxmLT52aW5mbykpIHsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQUJHUjoKKyAgICAgIGlmIChzZWxmLT5tYXNrX2JwcCA9PSAxNikKKyAgICAgICAgZ3N0X3NoYXBlX3dpcGVfYmxlbmRfYXJnYl8xNiAoc2VsZiwgJmluZnJhbWUsICZtYXNrZnJhbWUsICZvdXRmcmFtZSk7CisgICAgICBlbHNlCisgICAgICAgIGdzdF9zaGFwZV93aXBlX2JsZW5kX2FyZ2JfOCAoc2VsZiwgJmluZnJhbWUsICZtYXNrZnJhbWUsICZvdXRmcmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICAgIGlmIChzZWxmLT5tYXNrX2JwcCA9PSAxNikKKyAgICAgICAgZ3N0X3NoYXBlX3dpcGVfYmxlbmRfYmdyYV8xNiAoc2VsZiwgJmluZnJhbWUsICZtYXNrZnJhbWUsICZvdXRmcmFtZSk7CisgICAgICBlbHNlCisgICAgICAgIGdzdF9zaGFwZV93aXBlX2JsZW5kX2JncmFfOCAoc2VsZiwgJmluZnJhbWUsICZtYXNrZnJhbWUsICZvdXRmcmFtZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBicmVhazsKKyAgfQorCisgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJm91dGZyYW1lKTsKKyAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmaW5mcmFtZSk7CisKKyAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmbWFza2ZyYW1lKTsKKworICBnc3RfYnVmZmVyX3VucmVmIChtYXNrKTsKKworICByZXQgPSBnc3RfcGFkX3B1c2ggKHNlbGYtPnNyY3BhZCwgb3V0YnVmKTsKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykpCisgICAgZ290byBwdXNoX2ZhaWxlZDsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVycm9ycyAqLworbm90X25lZ290aWF0ZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiTm8gdmFsaWQgY2FwcyB5ZXQiKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgfQorc2h1dGRvd246CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiU2h1dHRpbmcgZG93biIpOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICB9Citxb3M6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiRHJvcHBpbmcgYnVmZmVyIGJlY2F1c2Ugb2YgUW9TIik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChtYXNrKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KK3B1c2hfZmFpbGVkOgorICB7CisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19GTFVTSElORykKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNlbGYsICJQdXNoaW5nIGJ1ZmZlciBkb3duc3RyZWFtIGZhaWxlZDogJXMiLAorICAgICAgICAgIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfc2hhcGVfd2lwZV9tYXNrX3NpbmtfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0U2hhcGVXaXBlICpzZWxmID0gR1NUX1NIQVBFX1dJUEUgKHBhcmVudCk7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisKKyAgZ19tdXRleF9sb2NrICgmc2VsZi0+bWFza19tdXRleCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJTZXR0aW5nIG5ldyBtYXNrIGJ1ZmZlcjogJSIgR1NUX1BUUl9GT1JNQVQsIGJ1ZmZlcik7CisKKyAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmc2VsZi0+bWFzaywgYnVmZmVyKTsKKyAgZ19jb25kX3NpZ25hbCAoJnNlbGYtPm1hc2tfY29uZCk7CisgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bWFza19tdXRleCk7CisKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9zaGFwZV93aXBlX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFNoYXBlV2lwZSAqc2VsZiA9IEdTVF9TSEFQRV9XSVBFIChlbGVtZW50KTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQ6CisgICAgICBzZWxmLT5zaHV0ZG93biA9IEZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIC8qIFVuYmxvY2sgdmlkZW8gc2luayBjaGFpbiBmdW5jdGlvbiAqLworICAgICAgZ19tdXRleF9sb2NrICgmc2VsZi0+bWFza19tdXRleCk7CisgICAgICBzZWxmLT5zaHV0ZG93biA9IFRSVUU7CisgICAgICBnX2NvbmRfc2lnbmFsICgmc2VsZi0+bWFza19jb25kKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2VsZi0+bWFza19tdXRleCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSkKKyAgICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3NoYXBlX3dpcGVfcmVzZXQgKHNlbGYpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2hhcGVfd2lwZV92aWRlb19zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RTaGFwZVdpcGUgKnNlbGYgPSBHU1RfU0hBUEVfV0lQRSAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJHb3QgJXMgZXZlbnQiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICByZXQgPSBnc3Rfc2hhcGVfd2lwZV92aWRlb19zaW5rX3NldGNhcHMgKHNlbGYsIGNhcHMpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDoKKyAgICB7CisgICAgICBHc3RTZWdtZW50IHNlZzsKKworICAgICAgZ3N0X2V2ZW50X2NvcHlfc2VnbWVudCAoZXZlbnQsICZzZWcpOworICAgICAgaWYgKHNlZy5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwKKyAgICAgICAgICAgICJHb3QgU0VHTUVOVCBldmVudCBpbiBHU1RfRk9STUFUX1RJTUUgJSIgR1NUX1BUUl9GT1JNQVQsICZzZWcpOworICAgICAgICBzZWxmLT5zZWdtZW50ID0gc2VnOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlbGYtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgICAgICB9CisgICAgfQorICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdzdF9zaGFwZV93aXBlX3Jlc2V0X3FvcyAoc2VsZik7CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChzZWxmLT5zcmNwYWQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc2hhcGVfd2lwZV9tYXNrX3NpbmtfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFNoYXBlV2lwZSAqc2VsZiA9IEdTVF9TSEFQRV9XSVBFIChwYXJlbnQpOworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJHb3QgJXMgZXZlbnQiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICBnc3Rfc2hhcGVfd2lwZV9tYXNrX3Npbmtfc2V0Y2FwcyAoc2VsZiwgY2Fwcyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIGdfbXV0ZXhfbG9jayAoJnNlbGYtPm1hc2tfbXV0ZXgpOworICAgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmc2VsZi0+bWFzaywgTlVMTCk7CisgICAgICBnX211dGV4X3VubG9jayAoJnNlbGYtPm1hc2tfbXV0ZXgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogRHJvcHBpbmcgYWxsIGV2ZW50cyBoZXJlICovCisgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zaGFwZV93aXBlX21hc2tfc2lua19xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0U2hhcGVXaXBlICpzZWxmID0gR1NUX1NIQVBFX1dJUEUgKHBhcmVudCk7CisgIGdib29sZWFuIHJldDsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiSGFuZGxpbmcgcXVlcnkgb2YgdHlwZSAnJXMnIiwKKyAgICAgIGdzdF9xdWVyeV90eXBlX2dldF9uYW1lIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpmaWx0ZXIsICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZmaWx0ZXIpOworICAgICAgY2FwcyA9IGdzdF9zaGFwZV93aXBlX21hc2tfc2lua19nZXRjYXBzIChzZWxmLCBwYWQsIGZpbHRlcik7CisgICAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX3F1ZXJ5X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3Rfc2hhcGVfd2lwZV9zcmNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RTaGFwZVdpcGUgKnNlbGYgPSBHU1RfU0hBUEVfV0lQRSAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJHb3QgJXMgZXZlbnQiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1FPUzp7CisgICAgICBHc3RRT1NUeXBlIHR5cGU7CisgICAgICBHc3RDbG9ja1RpbWVEaWZmIGRpZmY7CisgICAgICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworICAgICAgZ2RvdWJsZSBwcm9wb3J0aW9uOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfcW9zIChldmVudCwgJnR5cGUsICZwcm9wb3J0aW9uLCAmZGlmZiwgJnRpbWVzdGFtcCk7CisKKyAgICAgIGdzdF9zaGFwZV93aXBlX3VwZGF0ZV9xb3MgKHNlbGYsIHByb3BvcnRpb24sIGRpZmYsIHRpbWVzdGFtcCk7CisgICAgfQorICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9wYWRfcHVzaF9ldmVudCAoc2VsZi0+dmlkZW9fc2lua3BhZCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3Rfc2hhcGVfd2lwZV9kZWJ1ZywgInNoYXBld2lwZSIsIDAsCisgICAgICAic2hhcGV3aXBlIGVsZW1lbnQiKTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJzaGFwZXdpcGUiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX1NIQVBFX1dJUEUpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHNoYXBld2lwZSwKKyAgICAiU2hhcGUgV2lwZSB0cmFuc2l0aW9uIGZpbHRlciIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L3NoYXBld2lwZS9nc3RzaGFwZXdpcGUuaCBiL2dzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3MzFjZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zaGFwZXdpcGUvZ3N0c2hhcGV3aXBlLmgKQEAgLTAsMCArMSw4MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1NIQVBFX1dJUEVfSF9fCisjZGVmaW5lIF9fR1NUX1NIQVBFX1dJUEVfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9TSEFQRV9XSVBFIFwKKyAgKGdzdF9zaGFwZV93aXBlX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9TSEFQRV9XSVBFKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfU0hBUEVfV0lQRSxHc3RTaGFwZVdpcGUpKQorI2RlZmluZSBHU1RfU0hBUEVfV0lQRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9TSEFQRV9XSVBFLEdzdFNoYXBlV2lwZUNsYXNzKSkKKyNkZWZpbmUgR1NUX1NIQVBFX1dJUEVfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLEdTVF9UWVBFX1NIQVBFX1dJUEUsR3N0U2hhcGVXaXBlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfU0hBUEVfV0lQRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1NIQVBFX1dJUEUpKQorI2RlZmluZSBHU1RfSVNfU0hBUEVfV0lQRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9TSEFQRV9XSVBFKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNoYXBlV2lwZSBHc3RTaGFwZVdpcGU7Cit0eXBlZGVmIHN0cnVjdCBfR3N0U2hhcGVXaXBlQ2xhc3MgR3N0U2hhcGVXaXBlQ2xhc3M7CisKK3N0cnVjdCBfR3N0U2hhcGVXaXBlCit7CisgIEdzdEVsZW1lbnQgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KKyAgR3N0UGFkICp2aWRlb19zaW5rcGFkOworICBHc3RQYWQgKm1hc2tfc2lua3BhZDsKKworICBHc3RQYWQgKnNyY3BhZDsKKworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgR3N0QnVmZmVyICptYXNrOworICBnZmxvYXQgbWFza19wb3NpdGlvbjsKKyAgZ2Zsb2F0IG1hc2tfYm9yZGVyOworICBHTXV0ZXggbWFza19tdXRleDsKKyAgR0NvbmQgbWFza19jb25kOworICBnaW50IG1hc2tfYnBwOworCisgIEdzdFZpZGVvSW5mbyB2aW5mbzsKKyAgR3N0VmlkZW9JbmZvIG1pbmZvOworCisgIGdib29sZWFuIHNodXRkb3duOworCisgIGdkb3VibGUgcHJvcG9ydGlvbjsKKyAgR3N0Q2xvY2tUaW1lIGVhcmxpZXN0X3RpbWU7CisgIEdzdENsb2NrVGltZSBmcmFtZV9kdXJhdGlvbjsKK307CisKK3N0cnVjdCBfR3N0U2hhcGVXaXBlQ2xhc3MKK3sKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9zaGFwZV93aXBlX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1NIQVBFX1dJUEVfSF9fICovCmRpZmYgLS1naXQgYS9nc3Qvc2hhcGV3aXBlL21lc29uLmJ1aWxkIGIvZ3N0L3NoYXBld2lwZS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2IzY2RmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3NoYXBld2lwZS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDggQEAKK2dzdHNoYXBld2lwZSA9IGxpYnJhcnkoJ2dzdHNoYXBld2lwZScsCisgICdnc3RzaGFwZXdpcGUuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ2lvX2RlcCwgZ3N0X2RlcCwgZ3N0dmlkZW9fZGVwXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2dzdC9zbXB0ZS9NYWtlZmlsZS5hbSBiL2dzdC9zbXB0ZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTExMWIyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3NtcHRlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTAgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdHNtcHRlLmxhCisKK2xpYmdzdHNtcHRlX2xhX1NPVVJDRVMgPSBnc3RzbXB0ZS5jIGdzdG1hc2suYyBiYXJib3h3aXBlcy5jIHBhaW50LmMgZ3N0c21wdGVhbHBoYS5jIHBsdWdpbi5jCisKK25vaW5zdF9IRUFERVJTID0gZ3N0c21wdGUuaCBnc3RtYXNrLmggcGFpbnQuaCBnc3RzbXB0ZWFscGhhLmgKKworbGliZ3N0c21wdGVfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQorbGliZ3N0c21wdGVfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpICQoR1NUX0JBU0VfTElCUykgJChMSUJNKSBcCisJCQktbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKSAKK2xpYmdzdHNtcHRlX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKZGlmZiAtLWdpdCBhL2dzdC9zbXB0ZS9iYXJib3h3aXBlcy5jIGIvZ3N0L3NtcHRlL2JhcmJveHdpcGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1NWVhYQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zbXB0ZS9iYXJib3h3aXBlcy5jCkBAIC0wLDAgKzEsOTU3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAicGFpbnQuaCIKKyNpbmNsdWRlICJnc3RtYXNrLmgiCisKK2VudW0KK3sKKyAgQk9YX1ZFUlRJQ0FMID0gMSwKKyAgQk9YX0hPUklaT05UQUwgPSAyLAorICBCT1hfQ0xPQ0sgPSAzLAorICBUUklHQU5MRV9MSU5FQVIgPSA0Cit9OworCitzdGF0aWMgY29uc3QgZ2ludCBib3hlc18xYltdWzddID0geworI2RlZmluZSBXSVBFX0IxXzEgICAgICAgMAorICB7Qk9YX1ZFUlRJQ0FMLCAwLCAwLCAwLCAxLCAxLCAxfSwKKyNkZWZpbmUgV0lQRV9CMV8yICAgICAgIDEKKyAge0JPWF9IT1JJWk9OVEFMLCAwLCAwLCAwLCAxLCAxLCAxfQorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgYm94ZXNfMmJbXVs3ICogMl0gPSB7CisjZGVmaW5lIFdJUEVfQjJfMjEgICAgICAwCisgIHtCT1hfVkVSVElDQUwsIDAsIDAsIDEsIDEsIDIsIDAsCisgICAgICBCT1hfVkVSVElDQUwsIDEsIDAsIDAsIDIsIDIsIDF9LAorI2RlZmluZSBXSVBFX0IyXzIyICAgICAgMQorICB7Qk9YX0hPUklaT05UQUwsIDAsIDAsIDEsIDIsIDEsIDAsCisgICAgICBCT1hfSE9SSVpPTlRBTCwgMCwgMSwgMCwgMiwgMiwgMX0sCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBib3hfY2xvY2tfMWJbXVsxICogMTBdID0geworI2RlZmluZSBXSVBFX0IxXzI0MSAgICAgMAorICB7Qk9YX0NMT0NLLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxLCAxfSwKKyNkZWZpbmUgV0lQRV9CMV8yNDIgICAgIDEKKyAge0JPWF9DTE9DSywgMCwgMSwgMCwgMSwgMSwgMCwgMCwgMCwgMX0sCisjZGVmaW5lIFdJUEVfQjFfMjQzICAgICAyCisgIHtCT1hfQ0xPQ0ssIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDAsIDF9LAorI2RlZmluZSBXSVBFX0IxXzI0NCAgICAgMworICB7Qk9YX0NMT0NLLCAxLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxfSwKK307CisKKyNkZWZpbmUgV0lQRV9CMl8yMjEgICAgIDAKK3N0YXRpYyBjb25zdCBnaW50IGJveF9jbG9ja18yYltdWzIgKiAxMF0gPSB7CisjZGVmaW5lIFdJUEVfQjJfMjIxICAgICAwCisgIHtCT1hfQ0xPQ0ssIDEsIDAsIDAsIDIsIDAsIDAsIDEsIDIsIDEsCisgICAgICBCT1hfQ0xPQ0ssIDEsIDAsIDAsIDEsIDIsIDEsIDAsIDAsIDJ9LAorI2RlZmluZSBXSVBFX0IyXzIyMiAgICAgMQorICB7Qk9YX0NMT0NLLCAyLCAxLCAwLCAyLCAyLCAwLCAwLCAxLCAxLAorICAgICAgQk9YX0NMT0NLLCAyLCAxLCAwLCAwLCAxLCAxLCAyLCAwLCAyfSwKKyNkZWZpbmUgV0lQRV9CMl8yMjMgICAgIDIKKyAge0JPWF9DTE9DSywgMSwgMiwgMCwgMCwgMiwgMCwgMSwgMCwgMSwKKyAgICAgIEJPWF9DTE9DSywgMSwgMiwgMCwgMSwgMCwgMSwgMiwgMiwgMn0sCisjZGVmaW5lIFdJUEVfQjJfMjI0ICAgICAzCisgIHtCT1hfQ0xPQ0ssIDAsIDEsIDAsIDAsIDAsIDAsIDIsIDEsIDEsCisgICAgICBCT1hfQ0xPQ0ssIDAsIDEsIDAsIDIsIDEsIDEsIDAsIDIsIDJ9LAorI2RlZmluZSBXSVBFX0IyXzIyNSAgICAgNAorICB7Qk9YX0NMT0NLLCAxLCAwLCAwLCAyLCAwLCAwLCAxLCAyLCAxLAorICAgICAgQk9YX0NMT0NLLCAxLCAyLCAwLCAwLCAyLCAwLCAxLCAwLCAxfSwKKyNkZWZpbmUgV0lQRV9CMl8yMjYgICAgIDUKKyAge0JPWF9DTE9DSywgMCwgMSwgMCwgMCwgMCwgMCwgMiwgMSwgMSwKKyAgICAgIEJPWF9DTE9DSywgMiwgMSwgMCwgMiwgMiwgMCwgMCwgMSwgMX0sCisjZGVmaW5lIFdJUEVfQjJfMjMxICAgICA2CisgIHtCT1hfQ0xPQ0ssIDEsIDAsIDAsIDEsIDIsIDAsIDIsIDAsIDEsCisgICAgICBCT1hfQ0xPQ0ssIDEsIDAsIDAsIDEsIDIsIDAsIDAsIDAsIDF9LAorI2RlZmluZSBXSVBFX0IyXzIzMiAgICAgNworICB7Qk9YX0NMT0NLLCAyLCAxLCAwLCAwLCAxLCAwLCAyLCAwLCAxLAorICAgICAgQk9YX0NMT0NLLCAyLCAxLCAwLCAwLCAxLCAwLCAyLCAyLCAxfSwKKyNkZWZpbmUgV0lQRV9CMl8yMzMgICAgIDgKKyAge0JPWF9DTE9DSywgMSwgMiwgMCwgMSwgMCwgMCwgMiwgMiwgMSwKKyAgICAgIEJPWF9DTE9DSywgMSwgMiwgMCwgMSwgMCwgMCwgMCwgMiwgMX0sCisjZGVmaW5lIFdJUEVfQjJfMjM0ICAgICA5CisgIHtCT1hfQ0xPQ0ssIDAsIDEsIDAsIDIsIDEsIDAsIDAsIDAsIDEsCisgICAgICBCT1hfQ0xPQ0ssIDAsIDEsIDAsIDIsIDEsIDAsIDAsIDIsIDF9LAorI2RlZmluZSBXSVBFX0IyXzI1MSAgICAgMTAKKyAge0JPWF9DTE9DSywgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMiwgMSwKKyAgICAgIEJPWF9DTE9DSywgMiwgMCwgMCwgMSwgMCwgMCwgMiwgMiwgMX0sCisjZGVmaW5lIFdJUEVfQjJfMjUyICAgICAxMQorICB7Qk9YX0NMT0NLLCAwLCAwLCAwLCAwLCAxLCAwLCAyLCAwLCAxLAorICAgICAgQk9YX0NMT0NLLCAwLCAyLCAwLCAwLCAxLCAwLCAyLCAyLCAxfSwKKyNkZWZpbmUgV0lQRV9CMl8yNTMgICAgIDEyCisgIHtCT1hfQ0xPQ0ssIDAsIDIsIDAsIDEsIDIsIDAsIDAsIDAsIDEsCisgICAgICBCT1hfQ0xPQ0ssIDIsIDIsIDAsIDEsIDIsIDAsIDIsIDAsIDF9LAorI2RlZmluZSBXSVBFX0IyXzI1NCAgICAgMTMKKyAge0JPWF9DTE9DSywgMiwgMCwgMCwgMiwgMSwgMCwgMCwgMCwgMSwKKyAgICAgIEJPWF9DTE9DSywgMiwgMiwgMCwgMiwgMSwgMCwgMCwgMiwgMX0sCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBib3hfY2xvY2tfNGJbXVs0ICogMTBdID0geworI2RlZmluZSBXSVBFX0I0XzIwMSAgICAgMAorICB7Qk9YX0NMT0NLLCAxLCAxLCAwLCAxLCAwLCAwLCAyLCAxLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDIsIDEsIDEsIDEsIDIsIDIsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMSwgMiwgMiwgMCwgMSwgMywKKyAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMCwgMSwgMywgMSwgMCwgNH0sCisjZGVmaW5lIFdJUEVfQjRfMjAyICAgICAxCisgIHtCT1hfQ0xPQ0ssIDEsIDEsIDAsIDEsIDAsIDMsIDIsIDEsIDQsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMiwgMSwgMCwgMSwgMiwgMSwKKyAgICAgICAgQk9YX0NMT0NLLCAxLCAxLCAwLCAxLCAyLCAxLCAwLCAxLCAyLAorICAgICAgQk9YX0NMT0NLLCAxLCAxLCAwLCAwLCAxLCAyLCAxLCAwLCAzfSwKKyNkZWZpbmUgV0lQRV9CNF8yMDMgICAgIDIKKyAge0JPWF9DTE9DSywgMSwgMSwgMCwgMSwgMCwgMiwgMiwgMSwgMywKKyAgICAgICAgQk9YX0NMT0NLLCAxLCAxLCAwLCAyLCAxLCAzLCAxLCAyLCA0LAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDEsIDIsIDAsIDAsIDEsIDEsCisgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDAsIDJ9LAorI2RlZmluZSBXSVBFX0I0XzIwNCAgICAgMworICB7Qk9YX0NMT0NLLCAxLCAxLCAwLCAxLCAwLCAxLCAyLCAxLCAyLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDIsIDEsIDIsIDEsIDIsIDMsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMSwgMiwgMywgMCwgMSwgNCwKKyAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMCwgMSwgMCwgMSwgMCwgMX0sCisjZGVmaW5lIFdJUEVfQjRfMjA1ICAgICA0CisgIHtCT1hfQ0xPQ0ssIDEsIDEsIDAsIDEsIDAsIDAsIDIsIDEsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMiwgMSwgMSwgMSwgMiwgMiwKKyAgICAgICAgQk9YX0NMT0NLLCAxLCAxLCAwLCAxLCAyLCAwLCAwLCAxLCAxLAorICAgICAgQk9YX0NMT0NLLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAwLCAyfSwKKyNkZWZpbmUgV0lQRV9CNF8yMDYgICAgIDUKKyAge0JPWF9DTE9DSywgMSwgMSwgMCwgMSwgMCwgMSwgMiwgMSwgMiwKKyAgICAgICAgQk9YX0NMT0NLLCAxLCAxLCAwLCAyLCAxLCAwLCAxLCAyLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDEsIDIsIDEsIDAsIDEsIDIsCisgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDAsIDF9LAorI2RlZmluZSBXSVBFX0I0XzIwNyAgICAgNgorICB7Qk9YX0NMT0NLLCAxLCAxLCAwLCAxLCAwLCAwLCAyLCAxLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDIsIDEsIDAsIDEsIDIsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMSwgMiwgMCwgMCwgMSwgMSwKKyAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMCwgMSwgMCwgMSwgMCwgMX0sCisjZGVmaW5lIFdJUEVfQjRfMjExICAgICA3CisgIHtCT1hfQ0xPQ0ssIDEsIDEsIDAsIDEsIDAsIDAsIDIsIDEsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMiwgMSwgMSwgMSwgMiwgMiwKKyAgICAgICAgQk9YX0NMT0NLLCAxLCAxLCAwLCAxLCAwLCAwLCAwLCAxLCAxLAorICAgICAgQk9YX0NMT0NLLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAyLCAyfSwKKyNkZWZpbmUgV0lQRV9CNF8yMTIgICAgIDgKKyAge0JPWF9DTE9DSywgMSwgMSwgMCwgMiwgMSwgMCwgMSwgMCwgMSwKKyAgICAgICAgQk9YX0NMT0NLLCAxLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAyLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDIsIDEsIDAsIDEsIDIsIDEsCisgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDEsIDIsIDEsIDAsIDEsIDJ9LAorI2RlZmluZSBXSVBFX0I0XzIxMyAgICAgOQorICB7Qk9YX0NMT0NLLCAxLCAxLCAwLCAxLCAwLCAwLCAyLCAxLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDEsIDAsIDAsIDAsIDEsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMSwgMiwgMCwgMiwgMSwgMSwKKyAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMSwgMiwgMCwgMCwgMSwgMX0sCisjZGVmaW5lIFdJUEVfQjRfMjE0ICAgICAxMAorICB7Qk9YX0NMT0NLLCAxLCAxLCAwLCAyLCAxLCAwLCAxLCAwLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDEsIDAsIDIsIDEsIDAsIDEsIDIsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMCwgMSwgMCwgMSwgMCwgMSwKKyAgICAgIEJPWF9DTE9DSywgMSwgMSwgMCwgMCwgMSwgMCwgMSwgMiwgMX0sCisjZGVmaW5lIFdJUEVfQjRfMjI3ICAgICAxMQorICB7Qk9YX0NMT0NLLCAxLCAwLCAwLCAyLCAwLCAwLCAxLCAxLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDAsIDAsIDEsIDEsIDEsIDAsIDAsIDIsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMiwgMCwgMiwgMiwgMCwgMSwgMSwgMSwKKyAgICAgIEJPWF9DTE9DSywgMSwgMiwgMCwgMSwgMSwgMSwgMCwgMiwgMn0sCisjZGVmaW5lIFdJUEVfQjRfMjI4ICAgICAxMgorICB7Qk9YX0NMT0NLLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAxLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDAsIDEsIDAsIDEsIDEsIDEsIDAsIDIsIDIsCisgICAgICAgIEJPWF9DTE9DSywgMiwgMSwgMCwgMiwgMCwgMCwgMSwgMSwgMSwKKyAgICAgIEJPWF9DTE9DSywgMiwgMSwgMCwgMSwgMSwgMSwgMiwgMiwgMn0sCisjZGVmaW5lIFdJUEVfQjRfMjM1ICAgICAxMworICB7Qk9YX0NMT0NLLCAxLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDAsIDAsIDEsIDEsIDAsIDIsIDAsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMiwgMCwgMSwgMSwgMCwgMiwgMiwgMSwKKyAgICAgIEJPWF9DTE9DSywgMSwgMiwgMCwgMSwgMSwgMCwgMCwgMiwgMX0sCisjZGVmaW5lIFdJUEVfQjRfMjM2ICAgICAxNAorICB7Qk9YX0NMT0NLLCAwLCAxLCAwLCAxLCAxLCAwLCAwLCAwLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDAsIDEsIDAsIDEsIDEsIDAsIDAsIDIsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMiwgMSwgMCwgMSwgMSwgMCwgMiwgMCwgMSwKKyAgICAgIEJPWF9DTE9DSywgMiwgMSwgMCwgMSwgMSwgMCwgMiwgMiwgMX0sCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBib3hfY2xvY2tfOGJbXVs4ICogMTBdID0geworI2RlZmluZSBXSVBFX0I4XzI2MSAgICAgMAorICB7Qk9YX0NMT0NLLCAyLCAxLCAwLCAyLCAyLCAwLCA0LCAxLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDIsIDEsIDAsIDQsIDEsIDEsIDIsIDAsIDIsCisgICAgICAgIEJPWF9DTE9DSywgMiwgMSwgMCwgMiwgMCwgMiwgMCwgMSwgMywKKyAgICAgICAgQk9YX0NMT0NLLCAyLCAxLCAwLCAwLCAxLCAzLCAyLCAyLCA0LAorICAgICAgICBCT1hfQ0xPQ0ssIDIsIDMsIDAsIDIsIDIsIDAsIDQsIDMsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMiwgMywgMCwgNCwgMywgMSwgMiwgNCwgMiwKKyAgICAgICAgQk9YX0NMT0NLLCAyLCAzLCAwLCAyLCA0LCAyLCAwLCAzLCAzLAorICAgICAgQk9YX0NMT0NLLCAyLCAzLCAwLCAwLCAzLCAzLCAyLCAyLCA0fSwKKyNkZWZpbmUgV0lQRV9COF8yNjIgICAgIDEKKyAge0JPWF9DTE9DSywgMSwgMiwgMCwgMiwgMiwgMCwgMSwgMCwgMSwKKyAgICAgICAgQk9YX0NMT0NLLCAxLCAyLCAwLCAxLCAwLCAxLCAwLCAyLCAyLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDIsIDAsIDAsIDIsIDIsIDEsIDQsIDMsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMiwgMCwgMSwgNCwgMywgMiwgMiwgNCwKKyAgICAgICAgQk9YX0NMT0NLLCAzLCAyLCAwLCAyLCAyLCAwLCAzLCAwLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDMsIDIsIDAsIDMsIDAsIDEsIDQsIDIsIDIsCisgICAgICAgIEJPWF9DTE9DSywgMywgMiwgMCwgNCwgMiwgMiwgMywgNCwgMywKKyAgICAgIEJPWF9DTE9DSywgMywgMiwgMCwgMywgNCwgMywgMiwgMiwgNH0sCisjZGVmaW5lIFdJUEVfQjhfMjYzICAgICAyCisgIHtCT1hfQ0xPQ0ssIDIsIDEsIDAsIDIsIDAsIDAsIDQsIDEsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMiwgMSwgMCwgNCwgMSwgMSwgMiwgMiwgMiwKKyAgICAgICAgQk9YX0NMT0NLLCAyLCAxLCAwLCAyLCAwLCAwLCAwLCAxLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDIsIDEsIDAsIDAsIDEsIDEsIDIsIDIsIDIsCisgICAgICAgIEJPWF9DTE9DSywgMiwgMywgMCwgMiwgNCwgMCwgNCwgMywgMSwKKyAgICAgICAgQk9YX0NMT0NLLCAyLCAzLCAwLCA0LCAzLCAxLCAyLCAyLCAyLAorICAgICAgICBCT1hfQ0xPQ0ssIDIsIDMsIDAsIDIsIDQsIDAsIDAsIDMsIDEsCisgICAgICBCT1hfQ0xPQ0ssIDIsIDMsIDAsIDAsIDMsIDEsIDIsIDIsIDJ9LAorI2RlZmluZSBXSVBFX0I4XzI2NCAgICAgMworICB7Qk9YX0NMT0NLLCAxLCAyLCAwLCAwLCAyLCAwLCAxLCAwLCAxLAorICAgICAgICBCT1hfQ0xPQ0ssIDEsIDIsIDAsIDEsIDAsIDEsIDIsIDIsIDIsCisgICAgICAgIEJPWF9DTE9DSywgMSwgMiwgMCwgMCwgMiwgMCwgMSwgNCwgMSwKKyAgICAgICAgQk9YX0NMT0NLLCAxLCAyLCAwLCAxLCA0LCAxLCAyLCAyLCAyLAorICAgICAgICBCT1hfQ0xPQ0ssIDMsIDIsIDAsIDQsIDIsIDAsIDMsIDAsIDEsCisgICAgICAgIEJPWF9DTE9DSywgMywgMiwgMCwgMywgMCwgMSwgMiwgMiwgMiwKKyAgICAgICAgQk9YX0NMT0NLLCAzLCAyLCAwLCA0LCAyLCAwLCAzLCA0LCAxLAorICAgICAgQk9YX0NMT0NLLCAzLCAyLCAwLCAzLCA0LCAxLCAyLCAyLCAyfSwKK307CisKK3N0YXRpYyBjb25zdCBnaW50IHRyaWFuZ2xlc18ydFtdWzIgKiA5XSA9IHsKKyAgLyogMyAtPiA2ICovCisjZGVmaW5lIFdJUEVfVDJfMyAgICAgICAwCisgIHswLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLAorICAgICAgMSwgMCwgMSwgMCwgMCwgMCwgMSwgMSwgMX0sCisjZGVmaW5lIFdJUEVfVDJfNCAgICAgICBXSVBFX1QyXzMrMQorICB7MCwgMCwgMSwgMSwgMCwgMCwgMCwgMSwgMSwKKyAgICAgIDEsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDF9LAorI2RlZmluZSBXSVBFX1QyXzUgICAgICAgV0lQRV9UMl80KzEKKyAgezAsIDAsIDEsIDAsIDEsIDEsIDEsIDEsIDAsCisgICAgICAxLCAwLCAxLCAwLCAwLCAxLCAxLCAxLCAwfSwKKyNkZWZpbmUgV0lQRV9UMl82ICAgICAgIFdJUEVfVDJfNSsxCisgIHswLCAwLCAxLCAxLCAwLCAxLCAwLCAxLCAwLAorICAgICAgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMSwgMX0sCisjZGVmaW5lIFdJUEVfVDJfNDEgICAgICBXSVBFX1QyXzYrMQorICB7MCwgMCwgMCwgMSwgMCwgMSwgMCwgMSwgMSwKKyAgICAgIDEsIDAsIDEsIDAsIDEsIDEsIDEsIDEsIDJ9LAorI2RlZmluZSBXSVBFX1QyXzQyICAgICAgV0lQRV9UMl80MSsxCisgIHswLCAwLCAxLCAxLCAwLCAwLCAxLCAxLCAxLAorICAgICAgMCwgMCwgMSwgMCwgMSwgMiwgMSwgMSwgMX0sCisjZGVmaW5lIFdJUEVfVDJfNDUgICAgICBXSVBFX1QyXzQyKzEKKyAgezAsIDAsIDEsIDEsIDAsIDAsIDAsIDEsIDAsCisgICAgICAxLCAwLCAwLCAwLCAxLCAwLCAxLCAxLCAxfSwKKyNkZWZpbmUgV0lQRV9UMl80NiAgICAgIFdJUEVfVDJfNDUrMQorICB7MCwgMCwgMCwgMSwgMCwgMSwgMSwgMSwgMCwKKyAgICAgIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDB9LAorI2RlZmluZSBXSVBFX1QyXzI0NSAgICAgV0lQRV9UMl80NisxCisgIHswLCAwLCAwLCAyLCAwLCAwLCAyLCAyLCAxLAorICAgICAgMiwgMiwgMCwgMCwgMiwgMCwgMCwgMCwgMX0sCisjZGVmaW5lIFdJUEVfVDJfMjQ2ICAgICBXSVBFX1QyXzI0NSsxCisgIHswLCAyLCAwLCAwLCAwLCAwLCAyLCAwLCAxLAorICAgICAgMiwgMCwgMCwgMiwgMiwgMCwgMCwgMiwgMX0sCit9OworCitzdGF0aWMgY29uc3QgZ2ludCB0cmlhbmdsZXNfM3RbXVszICogOV0gPSB7CisgIC8qIDIzIC0+IDI2ICovCisjZGVmaW5lIFdJUEVfVDNfMjMgICAgICAwCisgIHswLCAwLCAxLCAxLCAwLCAwLCAwLCAyLCAxLAorICAgICAgICAxLCAwLCAwLCAwLCAyLCAxLCAyLCAyLCAxLAorICAgICAgMSwgMCwgMCwgMiwgMCwgMSwgMiwgMiwgMX0sCisjZGVmaW5lIFdJUEVfVDNfMjQgICAgICAxCisgIHswLCAwLCAxLCAyLCAwLCAxLCAyLCAxLCAwLAorICAgICAgICAwLCAwLCAxLCAyLCAxLCAwLCAwLCAyLCAxLAorICAgICAgMiwgMSwgMCwgMCwgMiwgMSwgMiwgMiwgMX0sCisjZGVmaW5lIFdJUEVfVDNfMjUgICAgICAyCisgIHswLCAwLCAxLCAwLCAyLCAxLCAxLCAyLCAwLAorICAgICAgICAwLCAwLCAxLCAyLCAwLCAxLCAxLCAyLCAwLAorICAgICAgMiwgMCwgMSwgMSwgMiwgMCwgMiwgMiwgMX0sCisjZGVmaW5lIFdJUEVfVDNfMjYgICAgICAzCisgIHswLCAwLCAxLCAyLCAwLCAxLCAwLCAxLCAwLAorICAgICAgICAyLCAwLCAxLCAwLCAxLCAwLCAyLCAyLCAxLAorICAgICAgMCwgMSwgMCwgMCwgMiwgMSwgMiwgMiwgMX0sCit9OworCitzdGF0aWMgY29uc3QgZ2ludCB0cmlhbmdsZXNfNHRbXVs0ICogOV0gPSB7CisjZGVmaW5lIFdJUEVfVDRfNjEgICAgICAwCisgIHswLCAwLCAxLCAxLCAwLCAwLCAxLCAyLCAxLAorICAgICAgICAwLCAwLCAxLCAwLCAyLCAyLCAxLCAyLCAxLAorICAgICAgICAxLCAwLCAwLCAyLCAwLCAxLCAxLCAyLCAxLAorICAgICAgMiwgMCwgMSwgMSwgMiwgMSwgMiwgMiwgMn0sCisjZGVmaW5lIFdJUEVfVDRfNjIgICAgICAxCisgIHswLCAwLCAyLCAyLCAwLCAxLCAwLCAxLCAxLAorICAgICAgICAyLCAwLCAxLCAwLCAxLCAxLCAyLCAxLCAwLAorICAgICAgICAwLCAxLCAxLCAyLCAxLCAwLCAyLCAyLCAxLAorICAgICAgMCwgMSwgMSwgMCwgMiwgMiwgMiwgMiwgMX0sCisjZGVmaW5lIFdJUEVfVDRfNjMgICAgICAyCisgIHswLCAwLCAyLCAxLCAwLCAxLCAwLCAyLCAxLAorICAgICAgICAxLCAwLCAxLCAwLCAyLCAxLCAxLCAyLCAwLAorICAgICAgICAxLCAwLCAxLCAxLCAyLCAwLCAyLCAyLCAxLAorICAgICAgMSwgMCwgMSwgMiwgMCwgMiwgMiwgMiwgMX0sCisjZGVmaW5lIFdJUEVfVDRfNjQgICAgICAzCisgIHswLCAwLCAxLCAyLCAwLCAyLCAyLCAxLCAxLAorICAgICAgICAwLCAwLCAxLCAwLCAxLCAwLCAyLCAxLCAxLAorICAgICAgICAwLCAxLCAwLCAyLCAxLCAxLCAwLCAyLCAxLAorICAgICAgMiwgMSwgMSwgMCwgMiwgMSwgMiwgMiwgMn0sCisjZGVmaW5lIFdJUEVfVDRfNjUgICAgICA0CisgIHswLCAwLCAwLCAxLCAwLCAxLCAxLCAyLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAyLCAxLCAxLCAyLCAwLAorICAgICAgICAxLCAwLCAxLCAyLCAwLCAwLCAxLCAyLCAwLAorICAgICAgMiwgMCwgMCwgMSwgMiwgMCwgMiwgMiwgMX0sCisjZGVmaW5lIFdJUEVfVDRfNjYgICAgICA1CisgIHswLCAwLCAxLCAyLCAwLCAwLCAwLCAxLCAwLAorICAgICAgICAyLCAwLCAwLCAwLCAxLCAwLCAyLCAxLCAxLAorICAgICAgICAwLCAxLCAwLCAyLCAxLCAxLCAyLCAyLCAwLAorICAgICAgMCwgMSwgMCwgMCwgMiwgMSwgMiwgMiwgMH0sCisjZGVmaW5lIFdJUEVfVDRfNjcgICAgICA2CisgIHswLCAwLCAxLCAxLCAwLCAwLCAwLCAyLCAwLAorICAgICAgICAxLCAwLCAwLCAwLCAyLCAwLCAxLCAyLCAxLAorICAgICAgICAxLCAwLCAwLCAxLCAyLCAxLCAyLCAyLCAwLAorICAgICAgMSwgMCwgMCwgMiwgMCwgMSwgMiwgMiwgMH0sCisjZGVmaW5lIFdJUEVfVDRfNjggICAgICA3CisgIHswLCAwLCAwLCAyLCAwLCAxLCAyLCAxLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAxLCAxLCAyLCAxLCAwLAorICAgICAgICAwLCAxLCAxLCAyLCAxLCAwLCAwLCAyLCAwLAorICAgICAgMiwgMSwgMCwgMCwgMiwgMCwgMiwgMiwgMX0sCisjZGVmaW5lIFdJUEVfVDRfMTAxICAgICA4CisgIHswLCAwLCAxLCAyLCAwLCAxLCAxLCAxLCAwLAorICAgICAgICAwLCAwLCAxLCAxLCAxLCAwLCAwLCAyLCAxLAorICAgICAgICAxLCAxLCAwLCAwLCAyLCAxLCAyLCAyLCAxLAorICAgICAgMiwgMCwgMSwgMSwgMSwgMCwgMiwgMiwgMX0sCit9OworCitzdGF0aWMgY29uc3QgZ2ludCB0cmlhbmdsZXNfOHRbXVs4ICogOV0gPSB7CisgIC8qIDcgKi8KKyNkZWZpbmUgV0lQRV9UOF83ICAgICAgIDAKKyAgezAsIDAsIDAsIDEsIDAsIDEsIDEsIDEsIDEsCisgICAgICAgIDEsIDAsIDEsIDIsIDAsIDAsIDEsIDEsIDEsCisgICAgICAgIDIsIDAsIDAsIDEsIDEsIDEsIDIsIDEsIDEsCisgICAgICAgIDEsIDEsIDEsIDIsIDEsIDEsIDIsIDIsIDAsCisgICAgICAgIDEsIDEsIDEsIDEsIDIsIDEsIDIsIDIsIDAsCisgICAgICAgIDEsIDEsIDEsIDAsIDIsIDAsIDEsIDIsIDEsCisgICAgICAgIDAsIDEsIDEsIDEsIDEsIDEsIDAsIDIsIDAsCisgICAgICAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxfSwKKyNkZWZpbmUgV0lQRV9UOF80MyAgICAgIDEKKyAgezAsIDAsIDEsIDEsIDAsIDAsIDEsIDEsIDEsCisgICAgICAgIDEsIDAsIDAsIDIsIDAsIDEsIDEsIDEsIDEsCisgICAgICAgIDIsIDAsIDEsIDEsIDEsIDEsIDIsIDEsIDIsCisgICAgICAgIDEsIDEsIDEsIDIsIDEsIDIsIDIsIDIsIDEsCisgICAgICAgIDEsIDEsIDEsIDEsIDIsIDAsIDIsIDIsIDEsCisgICAgICAgIDEsIDEsIDEsIDAsIDIsIDEsIDEsIDIsIDAsCisgICAgICAgIDAsIDEsIDIsIDEsIDEsIDEsIDAsIDIsIDEsCisgICAgICAwLCAwLCAxLCAwLCAxLCAyLCAxLCAxLCAxfSwKKyNkZWZpbmUgV0lQRV9UOF80NCAgICAgIDIKKyAgezAsIDAsIDEsIDEsIDAsIDIsIDEsIDEsIDEsCisgICAgICAgIDEsIDAsIDIsIDIsIDAsIDEsIDEsIDEsIDEsCisgICAgICAgIDIsIDAsIDEsIDEsIDEsIDEsIDIsIDEsIDAsCisgICAgICAgIDEsIDEsIDEsIDIsIDEsIDAsIDIsIDIsIDEsCisgICAgICAgIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDEsCisgICAgICAgIDEsIDEsIDEsIDAsIDIsIDEsIDEsIDIsIDIsCisgICAgICAgIDAsIDEsIDAsIDEsIDEsIDEsIDAsIDIsIDEsCisgICAgICAwLCAwLCAxLCAwLCAxLCAwLCAxLCAxLCAxfSwKKyNkZWZpbmUgV0lQRV9UOF80NyAgICAgIDMKKyAgezAsIDAsIDAsIDEsIDAsIDEsIDEsIDEsIDAsCisgICAgICAgIDEsIDAsIDEsIDIsIDAsIDAsIDEsIDEsIDAsCisgICAgICAgIDIsIDAsIDAsIDEsIDEsIDAsIDIsIDEsIDEsCisgICAgICAgIDEsIDEsIDAsIDIsIDEsIDEsIDIsIDIsIDAsCisgICAgICAgIDEsIDEsIDAsIDEsIDIsIDEsIDIsIDIsIDAsCisgICAgICAgIDEsIDEsIDAsIDAsIDIsIDAsIDEsIDIsIDEsCisgICAgICAgIDAsIDEsIDEsIDEsIDEsIDAsIDAsIDIsIDAsCisgICAgICAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAwfSwKKyNkZWZpbmUgV0lQRV9UOF80OCAgICAgIDQKKyAgezAsIDAsIDEsIDEsIDAsIDAsIDAsIDEsIDAsCisgICAgICAgIDEsIDAsIDAsIDAsIDEsIDAsIDEsIDEsIDEsCisgICAgICAgIDEsIDAsIDAsIDIsIDAsIDEsIDIsIDEsIDAsCisgICAgICAgIDEsIDAsIDAsIDEsIDEsIDEsIDIsIDEsIDAsCisgICAgICAgIDAsIDEsIDAsIDEsIDEsIDEsIDEsIDIsIDAsCisgICAgICAgIDAsIDEsIDAsIDAsIDIsIDEsIDEsIDIsIDAsCisgICAgICAgIDEsIDEsIDEsIDIsIDEsIDAsIDEsIDIsIDAsCisgICAgICAyLCAxLCAwLCAxLCAyLCAwLCAyLCAyLCAxfSwKK307CisKK3N0YXRpYyBjb25zdCBnaW50IHRyaWFuZ2xlc18xNnRbXVsxNiAqIDldID0geworICAvKiA4ICovCisjZGVmaW5lIFdJUEVfVDE2XzggICAgICAwCisgIHswLCAwLCAxLCAyLCAwLCAxLCAxLCAxLCAwLAorICAgICAgICAyLCAwLCAxLCAxLCAxLCAwLCAyLCAyLCAxLAorICAgICAgICAxLCAxLCAwLCAwLCAyLCAxLCAyLCAyLCAxLAorICAgICAgICAwLCAwLCAxLCAxLCAxLCAwLCAwLCAyLCAxLAorICAgICAgICAyLCAwLCAxLCA0LCAwLCAxLCAzLCAxLCAwLAorICAgICAgICA0LCAwLCAxLCAzLCAxLCAwLCA0LCAyLCAxLAorICAgICAgICAzLCAxLCAwLCAyLCAyLCAxLCA0LCAyLCAxLAorICAgICAgICAyLCAwLCAxLCAzLCAxLCAwLCAyLCAyLCAxLAorICAgICAgICAwLCAyLCAxLCAyLCAyLCAxLCAxLCAzLCAwLAorICAgICAgICAyLCAyLCAxLCAxLCAzLCAwLCAyLCA0LCAxLAorICAgICAgICAxLCAzLCAwLCAwLCA0LCAxLCAyLCA0LCAxLAorICAgICAgICAwLCAyLCAxLCAxLCAzLCAwLCAwLCA0LCAxLAorICAgICAgICAyLCAyLCAxLCA0LCAyLCAxLCAzLCAzLCAwLAorICAgICAgICA0LCAyLCAxLCAzLCAzLCAwLCA0LCA0LCAxLAorICAgICAgICAzLCAzLCAwLCAyLCA0LCAxLCA0LCA0LCAxLAorICAgICAgMiwgMiwgMSwgMywgMywgMCwgMiwgNCwgMX0KK307CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RXaXBlQ29uZmlnIEdzdFdpcGVDb25maWc7CisKK3N0cnVjdCBfR3N0V2lwZUNvbmZpZworeworICBjb25zdCBnaW50ICpvYmplY3RzOworICBnaW50IG5vYmplY3RzOworICBnaW50IHhzY2FsZTsKKyAgZ2ludCB5c2NhbGU7CisgIGdpbnQgY3NjYWxlOworfTsKKworc3RhdGljIGNvbnN0IEdzdFdpcGVDb25maWcgd2lwZV9jb25maWdbXSA9IHsKKyNkZWZpbmUgV0lQRV9DT05GSUdfMSAgIDAKKyAge2JveGVzXzFiW1dJUEVfQjFfMV0sIDEsIDAsIDAsIDB9LCAgICAvKiAxICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzIgICBXSVBFX0NPTkZJR18xKzEKKyAge2JveGVzXzFiW1dJUEVfQjFfMl0sIDEsIDAsIDAsIDB9LCAgICAvKiAyICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzMgICBXSVBFX0NPTkZJR18yKzEKKyAge3RyaWFuZ2xlc18ydFtXSVBFX1QyXzNdLCAyLCAwLCAwLCAwfSwgICAgICAgIC8qIDMgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfNCAgIFdJUEVfQ09ORklHXzMrMQorICB7dHJpYW5nbGVzXzJ0W1dJUEVfVDJfNF0sIDIsIDAsIDAsIDB9LCAgICAgICAgLyogNCAqLworI2RlZmluZSBXSVBFX0NPTkZJR181ICAgV0lQRV9DT05GSUdfNCsxCisgIHt0cmlhbmdsZXNfMnRbV0lQRV9UMl81XSwgMiwgMCwgMCwgMH0sICAgICAgICAvKiA1ICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzYgICBXSVBFX0NPTkZJR181KzEKKyAge3RyaWFuZ2xlc18ydFtXSVBFX1QyXzZdLCAyLCAwLCAwLCAwfSwgICAgICAgIC8qIDYgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfNyAgIFdJUEVfQ09ORklHXzYrMQorICB7dHJpYW5nbGVzXzh0W1dJUEVfVDhfN10sIDgsIDEsIDEsIDB9LCAgICAgICAgLyogNyAqLworI2RlZmluZSBXSVBFX0NPTkZJR184ICAgV0lQRV9DT05GSUdfNysxCisgIHt0cmlhbmdsZXNfMTZ0W1dJUEVfVDE2XzhdLCAxNiwgMiwgMiwgMH0sICAgICAvKiA4ICovCisKKyNkZWZpbmUgV0lQRV9DT05GSUdfMjEgIFdJUEVfQ09ORklHXzgrMQorICB7Ym94ZXNfMmJbV0lQRV9CMl8yMV0sIDIsIDEsIDEsIDB9LCAgIC8qIDIxICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzIyICBXSVBFX0NPTkZJR18yMSsxCisgIHtib3hlc18yYltXSVBFX0IyXzIyXSwgMiwgMSwgMSwgMH0sICAgLyogMjIgKi8KKworI2RlZmluZSBXSVBFX0NPTkZJR18yMyAgV0lQRV9DT05GSUdfMjIrMQorICB7dHJpYW5nbGVzXzN0W1dJUEVfVDNfMjNdLCAzLCAxLCAxLCAwfSwgICAgICAgLyogMjMgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjQgIFdJUEVfQ09ORklHXzIzKzEKKyAge3RyaWFuZ2xlc18zdFtXSVBFX1QzXzI0XSwgMywgMSwgMSwgMH0sICAgICAgIC8qIDI0ICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzI1ICBXSVBFX0NPTkZJR18yNCsxCisgIHt0cmlhbmdsZXNfM3RbV0lQRV9UM18yNV0sIDMsIDEsIDEsIDB9LCAgICAgICAvKiAyNSAqLworI2RlZmluZSBXSVBFX0NPTkZJR18yNiAgV0lQRV9DT05GSUdfMjUrMQorICB7dHJpYW5nbGVzXzN0W1dJUEVfVDNfMjZdLCAzLCAxLCAxLCAwfSwgICAgICAgLyogMjYgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfNDEgIFdJUEVfQ09ORklHXzI2KzEKKyAge3RyaWFuZ2xlc18ydFtXSVBFX1QyXzQxXSwgMiwgMCwgMCwgMX0sICAgICAgIC8qIDQxICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzQyICBXSVBFX0NPTkZJR180MSsxCisgIHt0cmlhbmdsZXNfMnRbV0lQRV9UMl80Ml0sIDIsIDAsIDAsIDF9LCAgICAgICAvKiA0MiAqLworI2RlZmluZSBXSVBFX0NPTkZJR180MyAgV0lQRV9DT05GSUdfNDIrMQorICB7dHJpYW5nbGVzXzh0W1dJUEVfVDhfNDNdLCA4LCAxLCAxLCAxfSwgICAgICAgLyogNDMgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfNDQgIFdJUEVfQ09ORklHXzQzKzEKKyAge3RyaWFuZ2xlc184dFtXSVBFX1Q4XzQ0XSwgOCwgMSwgMSwgMX0sICAgICAgIC8qIDQ0ICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzQ1ICBXSVBFX0NPTkZJR180NCsxCisgIHt0cmlhbmdsZXNfMnRbV0lQRV9UMl80NV0sIDIsIDAsIDAsIDB9LCAgICAgICAvKiA0NSAqLworI2RlZmluZSBXSVBFX0NPTkZJR180NiAgV0lQRV9DT05GSUdfNDUrMQorICB7dHJpYW5nbGVzXzJ0W1dJUEVfVDJfNDZdLCAyLCAwLCAwLCAwfSwgICAgICAgLyogNDYgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfNDcgIFdJUEVfQ09ORklHXzQ2KzEKKyAge3RyaWFuZ2xlc184dFtXSVBFX1Q4XzQ3XSwgOCwgMSwgMSwgMH0sICAgICAgIC8qIDQ3ICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzQ4ICBXSVBFX0NPTkZJR180NysxCisgIHt0cmlhbmdsZXNfOHRbV0lQRV9UOF80OF0sIDgsIDEsIDEsIDB9LCAgICAgICAvKiA0OCAqLworI2RlZmluZSBXSVBFX0NPTkZJR182MSAgV0lQRV9DT05GSUdfNDgrMQorICB7dHJpYW5nbGVzXzR0W1dJUEVfVDRfNjFdLCA0LCAxLCAxLCAxfSwgICAgICAgLyogNjEgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfNjIgIFdJUEVfQ09ORklHXzYxKzEKKyAge3RyaWFuZ2xlc180dFtXSVBFX1Q0XzYyXSwgNCwgMSwgMSwgMX0sICAgICAgIC8qIDYyICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzYzICBXSVBFX0NPTkZJR182MisxCisgIHt0cmlhbmdsZXNfNHRbV0lQRV9UNF82M10sIDQsIDEsIDEsIDF9LCAgICAgICAvKiA2MyAqLworI2RlZmluZSBXSVBFX0NPTkZJR182NCAgV0lQRV9DT05GSUdfNjMrMQorICB7dHJpYW5nbGVzXzR0W1dJUEVfVDRfNjRdLCA0LCAxLCAxLCAxfSwgICAgICAgLyogNjQgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfNjUgIFdJUEVfQ09ORklHXzY0KzEKKyAge3RyaWFuZ2xlc180dFtXSVBFX1Q0XzY1XSwgNCwgMSwgMSwgMH0sICAgICAgIC8qIDY1ICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzY2ICBXSVBFX0NPTkZJR182NSsxCisgIHt0cmlhbmdsZXNfNHRbV0lQRV9UNF82Nl0sIDQsIDEsIDEsIDB9LCAgICAgICAvKiA2NiAqLworI2RlZmluZSBXSVBFX0NPTkZJR182NyAgV0lQRV9DT05GSUdfNjYrMQorICB7dHJpYW5nbGVzXzR0W1dJUEVfVDRfNjddLCA0LCAxLCAxLCAwfSwgICAgICAgLyogNjcgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfNjggIFdJUEVfQ09ORklHXzY3KzEKKyAge3RyaWFuZ2xlc180dFtXSVBFX1Q0XzY4XSwgNCwgMSwgMSwgMH0sICAgICAgIC8qIDY4ICovCisjZGVmaW5lIFdJUEVfQ09ORklHXzEwMSBXSVBFX0NPTkZJR182OCsxCisgIHt0cmlhbmdsZXNfNHRbV0lQRV9UNF8xMDFdLCA0LCAxLCAxLCAwfSwgICAgICAvKiAxMDEgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjAxIFdJUEVfQ09ORklHXzEwMSsxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMDFdLCA0LCAxLCAxLCAyfSwgICAgICAvKiAyMDEgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjAyIFdJUEVfQ09ORklHXzIwMSsxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMDJdLCA0LCAxLCAxLCAyfSwgICAgICAvKiAyMDIgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjAzIFdJUEVfQ09ORklHXzIwMisxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMDNdLCA0LCAxLCAxLCAyfSwgICAgICAvKiAyMDMgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjA0IFdJUEVfQ09ORklHXzIwMysxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMDRdLCA0LCAxLCAxLCAyfSwgICAgICAvKiAyMDQgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjA1IFdJUEVfQ09ORklHXzIwNCsxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMDVdLCA0LCAxLCAxLCAxfSwgICAgICAvKiAyMDUgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjA2IFdJUEVfQ09ORklHXzIwNSsxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMDZdLCA0LCAxLCAxLCAxfSwgICAgICAvKiAyMDYgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjA3IFdJUEVfQ09ORklHXzIwNisxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMDddLCA0LCAxLCAxLCAwfSwgICAgICAvKiAyMDcgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjExIFdJUEVfQ09ORklHXzIwNysxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMTFdLCA0LCAxLCAxLCAxfSwgICAgICAvKiAyMTEgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjEyIFdJUEVfQ09ORklHXzIxMSsxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMTJdLCA0LCAxLCAxLCAxfSwgICAgICAvKiAyMTIgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjEzIFdJUEVfQ09ORklHXzIxMisxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMTNdLCA0LCAxLCAxLCAwfSwgICAgICAvKiAyMTMgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjE0IFdJUEVfQ09ORklHXzIxMysxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMTRdLCA0LCAxLCAxLCAwfSwgICAgICAvKiAyMTQgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjIxIFdJUEVfQ09ORklHXzIxNCsxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMjFdLCAyLCAxLCAxLCAxfSwgICAgICAvKiAyMjEgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjIyIFdJUEVfQ09ORklHXzIyMSsxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMjJdLCAyLCAxLCAxLCAxfSwgICAgICAvKiAyMjIgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjIzIFdJUEVfQ09ORklHXzIyMisxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMjNdLCAyLCAxLCAxLCAxfSwgICAgICAvKiAyMjMgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjI0IFdJUEVfQ09ORklHXzIyMysxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMjRdLCAyLCAxLCAxLCAxfSwgICAgICAvKiAyMjQgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjI1IFdJUEVfQ09ORklHXzIyNCsxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMjVdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyMjUgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjI2IFdJUEVfQ09ORklHXzIyNSsxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMjZdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyMjYgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjI3IFdJUEVfQ09ORklHXzIyNisxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMjddLCA0LCAxLCAxLCAxfSwgICAgICAvKiAyMjcgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjI4IFdJUEVfQ09ORklHXzIyNysxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMjhdLCA0LCAxLCAxLCAxfSwgICAgICAvKiAyMjggKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjMxIFdJUEVfQ09ORklHXzIyOCsxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMzFdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyMzEgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjMyIFdJUEVfQ09ORklHXzIzMSsxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMzJdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyMzIgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjMzIFdJUEVfQ09ORklHXzIzMisxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMzNdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyMzMgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjM0IFdJUEVfQ09ORklHXzIzMysxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yMzRdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyMzQgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjM1IFdJUEVfQ09ORklHXzIzNCsxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMzVdLCA0LCAxLCAxLCAwfSwgICAgICAvKiAyMzUgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjM2IFdJUEVfQ09ORklHXzIzNSsxCisgIHtib3hfY2xvY2tfNGJbV0lQRV9CNF8yMzZdLCA0LCAxLCAxLCAwfSwgICAgICAvKiAyMzYgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjQxIFdJUEVfQ09ORklHXzIzNisxCisgIHtib3hfY2xvY2tfMWJbV0lQRV9CMV8yNDFdLCAxLCAwLCAwLCAwfSwgICAgICAvKiAyNDEgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjQyIFdJUEVfQ09ORklHXzI0MSsxCisgIHtib3hfY2xvY2tfMWJbV0lQRV9CMV8yNDJdLCAxLCAwLCAwLCAwfSwgICAgICAvKiAyNDIgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjQzIFdJUEVfQ09ORklHXzI0MisxCisgIHtib3hfY2xvY2tfMWJbV0lQRV9CMV8yNDNdLCAxLCAwLCAwLCAwfSwgICAgICAvKiAyNDMgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjQ0IFdJUEVfQ09ORklHXzI0MysxCisgIHtib3hfY2xvY2tfMWJbV0lQRV9CMV8yNDRdLCAxLCAwLCAwLCAwfSwgICAgICAvKiAyNDQgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjQ1IFdJUEVfQ09ORklHXzI0NCsxCisgIHt0cmlhbmdsZXNfMnRbV0lQRV9UMl8yNDVdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyNDUgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjQ2IFdJUEVfQ09ORklHXzI0NSsxCisgIHt0cmlhbmdsZXNfMnRbV0lQRV9UMl8yNDZdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyNDYgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjUxIFdJUEVfQ09ORklHXzI0NisxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yNTFdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyNTEgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjUyIFdJUEVfQ09ORklHXzI1MSsxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yNTJdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyNTIgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjUzIFdJUEVfQ09ORklHXzI1MisxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yNTNdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyNTMgKi8KKyNkZWZpbmUgV0lQRV9DT05GSUdfMjU0IFdJUEVfQ09ORklHXzI1MysxCisgIHtib3hfY2xvY2tfMmJbV0lQRV9CMl8yNTRdLCAyLCAxLCAxLCAwfSwgICAgICAvKiAyNTQgKi8KKworI2RlZmluZSBXSVBFX0NPTkZJR18yNjEgV0lQRV9DT05GSUdfMjU0KzEKKyAge2JveF9jbG9ja184YltXSVBFX0I4XzI2MV0sIDgsIDIsIDIsIDJ9LCAgICAgIC8qIDI2MSAqLworI2RlZmluZSBXSVBFX0NPTkZJR18yNjIgV0lQRV9DT05GSUdfMjYxKzEKKyAge2JveF9jbG9ja184YltXSVBFX0I4XzI2Ml0sIDgsIDIsIDIsIDJ9LCAgICAgIC8qIDI2MiAqLworI2RlZmluZSBXSVBFX0NPTkZJR18yNjMgV0lQRV9DT05GSUdfMjYyKzEKKyAge2JveF9jbG9ja184YltXSVBFX0I4XzI2M10sIDgsIDIsIDIsIDF9LCAgICAgIC8qIDI2MyAqLworI2RlZmluZSBXSVBFX0NPTkZJR18yNjQgV0lQRV9DT05GSUdfMjYzKzEKKyAge2JveF9jbG9ja184YltXSVBFX0I4XzI2NF0sIDgsIDIsIDIsIDF9LCAgICAgIC8qIDI2NCAqLworfTsKKworc3RhdGljIHZvaWQKK2dzdF93aXBlX2JveGVzX2RyYXcgKEdzdE1hc2sgKiBtYXNrKQoreworICBjb25zdCBHc3RXaXBlQ29uZmlnICpjb25maWcgPSBtYXNrLT51c2VyX2RhdGE7CisgIGNvbnN0IGdpbnQgKmltcGFjdHMgPSBjb25maWctPm9iamVjdHM7CisgIGdpbnQgd2lkdGggPSAobWFzay0+d2lkdGggPj4gY29uZmlnLT54c2NhbGUpOworICBnaW50IGhlaWdodCA9IChtYXNrLT5oZWlnaHQgPj4gY29uZmlnLT55c2NhbGUpOworICBnaW50IGRlcHRoID0gKDEgPDwgbWFzay0+YnBwKSA+PiBjb25maWctPmNzY2FsZTsKKworICBnaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+bm9iamVjdHM7IGkrKykgeworICAgIHN3aXRjaCAoaW1wYWN0c1swXSkgeworICAgICAgY2FzZSBCT1hfVkVSVElDQUw6CisgICAgICAgIC8qIHZib3ggZG9lcyBub3QgZHJhdyBsYXN0IHBpeGVscyAqLworICAgICAgICBnc3Rfc21wdGVfcGFpbnRfdmJveCAobWFzay0+ZGF0YSwgbWFzay0+d2lkdGgsCisgICAgICAgICAgICBpbXBhY3RzWzFdICogd2lkdGgsIGltcGFjdHNbMl0gKiBoZWlnaHQsIGltcGFjdHNbM10gKiBkZXB0aCwKKyAgICAgICAgICAgIGltcGFjdHNbNF0gKiB3aWR0aCwgaW1wYWN0c1s1XSAqIGhlaWdodCwgaW1wYWN0c1s2XSAqIGRlcHRoKTsKKyAgICAgICAgaW1wYWN0cyArPSA3OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQk9YX0hPUklaT05UQUw6CisgICAgICAgIC8qIGhib3ggZG9lcyBub3QgZHJhdyBsYXN0IHBpeGVscyAqLworICAgICAgICBnc3Rfc21wdGVfcGFpbnRfaGJveCAobWFzay0+ZGF0YSwgbWFzay0+d2lkdGgsCisgICAgICAgICAgICBpbXBhY3RzWzFdICogd2lkdGgsIGltcGFjdHNbMl0gKiBoZWlnaHQsIGltcGFjdHNbM10gKiBkZXB0aCwKKyAgICAgICAgICAgIGltcGFjdHNbNF0gKiB3aWR0aCwgaW1wYWN0c1s1XSAqIGhlaWdodCwgaW1wYWN0c1s2XSAqIGRlcHRoKTsKKyAgICAgICAgaW1wYWN0cyArPSA3OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQk9YX0NMT0NLOgorICAgICAgeworICAgICAgICBnaW50IHgwLCB5MCwgeDEsIHkxLCB4MiwgeTI7CisKKyAgICAgICAgLyogbWFrZSBzdXJlIG5vdCB0byBkcmF3IG91dHNpZGUgdGhlIGFyZWEgKi8KKyAgICAgICAgeDAgPSBNSU4gKGltcGFjdHNbMV0gKiB3aWR0aCwgbWFzay0+d2lkdGggLSAxKTsKKyAgICAgICAgeTAgPSBNSU4gKGltcGFjdHNbMl0gKiBoZWlnaHQsIG1hc2stPmhlaWdodCAtIDEpOworICAgICAgICB4MSA9IE1JTiAoaW1wYWN0c1s0XSAqIHdpZHRoLCBtYXNrLT53aWR0aCAtIDEpOworICAgICAgICB5MSA9IE1JTiAoaW1wYWN0c1s1XSAqIGhlaWdodCwgbWFzay0+aGVpZ2h0IC0gMSk7CisgICAgICAgIHgyID0gTUlOIChpbXBhY3RzWzddICogd2lkdGgsIG1hc2stPndpZHRoIC0gMSk7CisgICAgICAgIHkyID0gTUlOIChpbXBhY3RzWzhdICogaGVpZ2h0LCBtYXNrLT5oZWlnaHQgLSAxKTsKKworICAgICAgICBnc3Rfc21wdGVfcGFpbnRfYm94X2Nsb2NrIChtYXNrLT5kYXRhLCBtYXNrLT53aWR0aCwKKyAgICAgICAgICAgIHgwLCB5MCwgaW1wYWN0c1szXSAqIGRlcHRoLCB4MSwgeTEsIGltcGFjdHNbNl0gKiBkZXB0aCwKKyAgICAgICAgICAgIHgyLCB5MiwgaW1wYWN0c1s5XSAqIGRlcHRoKTsKKyAgICAgICAgaW1wYWN0cyArPSAxMDsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3dpcGVfdHJpYW5nbGVzX2Nsb2NrX2RyYXcgKEdzdE1hc2sgKiBtYXNrKQoreworICBjb25zdCBHc3RXaXBlQ29uZmlnICpjb25maWcgPSBtYXNrLT51c2VyX2RhdGE7CisgIGNvbnN0IGdpbnQgKmltcGFjdHMgPSBjb25maWctPm9iamVjdHM7CisgIGdpbnQgd2lkdGggPSAobWFzay0+d2lkdGggPj4gY29uZmlnLT54c2NhbGUpOworICBnaW50IGhlaWdodCA9IChtYXNrLT5oZWlnaHQgPj4gY29uZmlnLT55c2NhbGUpOworICBnaW50IGRlcHRoID0gKDEgPDwgbWFzay0+YnBwKSA+PiBjb25maWctPmNzY2FsZTsKKyAgZ2ludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBjb25maWctPm5vYmplY3RzOyBpKyspIHsKKyAgICBnaW50IHgwLCB5MCwgeDEsIHkxLCB4MiwgeTI7CisKKyAgICAvKiBtYWtlIHN1cmUgbm90IHRvIGRyYXcgb3V0c2lkZSB0aGUgYXJlYSAqLworICAgIHgwID0gTUlOIChpbXBhY3RzWzBdICogd2lkdGgsIG1hc2stPndpZHRoIC0gMSk7CisgICAgeTAgPSBNSU4gKGltcGFjdHNbMV0gKiBoZWlnaHQsIG1hc2stPmhlaWdodCAtIDEpOworICAgIHgxID0gTUlOIChpbXBhY3RzWzNdICogd2lkdGgsIG1hc2stPndpZHRoIC0gMSk7CisgICAgeTEgPSBNSU4gKGltcGFjdHNbNF0gKiBoZWlnaHQsIG1hc2stPmhlaWdodCAtIDEpOworICAgIHgyID0gTUlOIChpbXBhY3RzWzZdICogd2lkdGgsIG1hc2stPndpZHRoIC0gMSk7CisgICAgeTIgPSBNSU4gKGltcGFjdHNbN10gKiBoZWlnaHQsIG1hc2stPmhlaWdodCAtIDEpOworCisgICAgZ3N0X3NtcHRlX3BhaW50X3RyaWFuZ2xlX2Nsb2NrIChtYXNrLT5kYXRhLCBtYXNrLT53aWR0aCwKKyAgICAgICAgeDAsIHkwLCBpbXBhY3RzWzJdICogZGVwdGgsIHgxLCB5MSwgaW1wYWN0c1s1XSAqIGRlcHRoLAorICAgICAgICB4MiwgeTIsIGltcGFjdHNbOF0gKiBkZXB0aCk7CisgICAgaW1wYWN0cyArPSA5OworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdyAoR3N0TWFzayAqIG1hc2spCit7CisgIGNvbnN0IEdzdFdpcGVDb25maWcgKmNvbmZpZyA9IG1hc2stPnVzZXJfZGF0YTsKKyAgY29uc3QgZ2ludCAqaW1wYWN0cyA9IGNvbmZpZy0+b2JqZWN0czsKKyAgZ2ludCB3aWR0aCA9IChtYXNrLT53aWR0aCA+PiBjb25maWctPnhzY2FsZSk7CisgIGdpbnQgaGVpZ2h0ID0gKG1hc2stPmhlaWdodCA+PiBjb25maWctPnlzY2FsZSk7CisgIGdpbnQgZGVwdGggPSAoMSA8PCBtYXNrLT5icHApID4+IGNvbmZpZy0+Y3NjYWxlOworCisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5ub2JqZWN0czsgaSsrKSB7CisgICAgZ2ludCB4MCwgeTAsIHgxLCB5MSwgeDIsIHkyOworCisgICAgLyogbWFrZSBzdXJlIG5vdCB0byBkcmF3IG91dHNpZGUgdGhlIGFyZWEgKi8KKyAgICB4MCA9IE1JTiAoaW1wYWN0c1swXSAqIHdpZHRoLCBtYXNrLT53aWR0aCAtIDEpOworICAgIHkwID0gTUlOIChpbXBhY3RzWzFdICogaGVpZ2h0LCBtYXNrLT5oZWlnaHQgLSAxKTsKKyAgICB4MSA9IE1JTiAoaW1wYWN0c1szXSAqIHdpZHRoLCBtYXNrLT53aWR0aCAtIDEpOworICAgIHkxID0gTUlOIChpbXBhY3RzWzRdICogaGVpZ2h0LCBtYXNrLT5oZWlnaHQgLSAxKTsKKyAgICB4MiA9IE1JTiAoaW1wYWN0c1s2XSAqIHdpZHRoLCBtYXNrLT53aWR0aCAtIDEpOworICAgIHkyID0gTUlOIChpbXBhY3RzWzddICogaGVpZ2h0LCBtYXNrLT5oZWlnaHQgLSAxKTsKKworICAgIGdzdF9zbXB0ZV9wYWludF90cmlhbmdsZV9saW5lYXIgKG1hc2stPmRhdGEsIG1hc2stPndpZHRoLAorICAgICAgICB4MCwgeTAsIGltcGFjdHNbMl0gKiBkZXB0aCwgeDEsIHkxLCBpbXBhY3RzWzVdICogZGVwdGgsCisgICAgICAgIHgyLCB5MiwgaW1wYWN0c1s4XSAqIGRlcHRoKTsKKyAgICBpbXBhY3RzICs9IDk7CisgIH0KK30KKworLyogc2VlIGFsc286CisgKiBodHRwOi8vd3d3LnczYy5ybC5hYy51ay9wYXN0dGFsa3Mvc2xpZGVtYWtlci9YTUxfTXVsdGltZWRpYS9odG1scy90cmFuc2l0aW9ucy5odG1sCisgKi8KK3N0YXRpYyBjb25zdCBHc3RNYXNrRGVmaW5pdGlvbiBkZWZpbml0aW9uc1tdID0geworICB7MSwgImJhci13aXBlLWxyIiwKKyAgICAgICAgIkEgYmFyIG1vdmVzIGZyb20gbGVmdCB0byByaWdodCIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMV19LAorICB7MiwgImJhci13aXBlLXRiIiwKKyAgICAgICAgIkEgYmFyIG1vdmVzIGZyb20gdG9wIHRvIGJvdHRvbSIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMl19LAorICB7MywgImJveC13aXBlLXRsIiwKKyAgICAgICAgIkEgYm94IGV4cGFuZHMgZnJvbSB0aGUgdXBwZXItbGVmdCBjb3JuZXIgdG8gdGhlIGxvd2VyLXJpZ2h0IGNvcm5lciIsCisgICAgICAgIGdzdF93aXBlX3RyaWFuZ2xlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzNdfSwKKyAgezQsICJib3gtd2lwZS10ciIsCisgICAgICAgICJBIGJveCBleHBhbmRzIGZyb20gdGhlIHVwcGVyLXJpZ2h0IGNvcm5lciB0byB0aGUgbG93ZXItbGVmdCBjb3JuZXIiLAorICAgICAgICBnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR180XX0sCisgIHs1LCAiYm94LXdpcGUtYnIiLAorICAgICAgICAiQSBib3ggZXhwYW5kcyBmcm9tIHRoZSBsb3dlci1yaWdodCBjb3JuZXIgdG8gdGhlIHVwcGVyLWxlZnQgY29ybmVyIiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfNV19LAorICB7NiwgImJveC13aXBlLWJsIiwKKyAgICAgICAgIkEgYm94IGV4cGFuZHMgZnJvbSB0aGUgbG93ZXItbGVmdCBjb3JuZXIgdG8gdGhlIHVwcGVyLXJpZ2h0IGNvcm5lciIsCisgICAgICAgIGdzdF93aXBlX3RyaWFuZ2xlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzZdfSwKKyAgezcsICJmb3VyLWJveC13aXBlLWNpIiwKKyAgICAgICAgIkEgYm94IHNoYXBlIGV4cGFuZHMgZnJvbSBlYWNoIG9mIHRoZSBmb3VyIGNvcm5lcnMgdG93YXJkIHRoZSBjZW50ZXIiLAorICAgICAgICBnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR183XX0sCisgIHs4LCAiZm91ci1ib3gtd2lwZS1jbyIsCisgICAgICAgICJBIGJveCBzaGFwZSBleHBhbmRzIGZyb20gdGhlIGNlbnRlciBvZiBlYWNoIHF1YWRyYW50IHRvd2FyZCB0aGUgY29ybmVycyBvZiBlYWNoIHF1YWRyYW50IiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfOF19LAorICB7MjEsICJiYXJuZG9vci12IiwKKyAgICAgICAgIkEgY2VudHJhbCwgdmVydGljYWwgbGluZSBzcGxpdHMgYW5kIGV4cGFuZHMgdG93YXJkIHRoZSBsZWZ0IGFuZCByaWdodCBlZGdlcyIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjFdfSwKKyAgezIyLCAiYmFybmRvb3ItaCIsCisgICAgICAgICJBIGNlbnRyYWwsIGhvcml6b250YWwgbGluZSBzcGxpdHMgYW5kIGV4cGFuZHMgdG93YXJkIHRoZSB0b3AgYW5kIGJvdHRvbSBlZGdlcyIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjJdfSwKKyAgezIzLCAiYm94LXdpcGUtdGMiLAorICAgICAgICAiQSBib3ggZXhwYW5kcyBmcm9tIHRoZSB0b3AgZWRnZSdzIG1pZHBvaW50IHRvIHRoZSBib3R0b20gY29ybmVycyIsCisgICAgICAgIGdzdF93aXBlX3RyaWFuZ2xlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIzXX0sCisgIHsyNCwgImJveC13aXBlLXJjIiwKKyAgICAgICAgIkEgYm94IGV4cGFuZHMgZnJvbSB0aGUgcmlnaHQgZWRnZSdzIG1pZHBvaW50IHRvIHRoZSBsZWZ0IGNvcm5lcnMiLAorICAgICAgICBnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yNF19LAorICB7MjUsICJib3gtd2lwZS1iYyIsCisgICAgICAgICJBIGJveCBleHBhbmRzIGZyb20gdGhlIGJvdHRvbSBlZGdlJ3MgbWlkcG9pbnQgdG8gdGhlIHRvcCBjb3JuZXJzIiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjVdfSwKKyAgezI2LCAiYm94LXdpcGUtbGMiLAorICAgICAgICAiQSBib3ggZXhwYW5kcyBmcm9tIHRoZSBsZWZ0IGVkZ2UncyBtaWRwb2ludCB0byB0aGUgcmlnaHQgY29ybmVycyIsCisgICAgICAgIGdzdF93aXBlX3RyaWFuZ2xlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzI2XX0sCisgIHs0MSwgImRpYWdvbmFsLXRsIiwKKyAgICAgICAgIkEgZGlhZ29uYWwgbGluZSBtb3ZlcyBmcm9tIHRoZSB1cHBlci1sZWZ0IGNvcm5lciB0byB0aGUgbG93ZXItcmlnaHQgY29ybmVyIiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfNDFdfSwKKyAgezQyLCAiZGlhZ29uYWwtdHIiLAorICAgICAgICAiQSBkaWFnb25hbCBsaW5lIG1vdmVzIGZyb20gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lciB0byB0aGUgbG93ZXItbGVmdCBjb3JuZXIiLAorICAgICAgICBnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR180Ml19LAorICB7NDMsICJib3d0aWUtdiIsCisgICAgICAgICJUd28gd2VkZ2Ugc2hhcGVzIHNsaWRlIGluIGZyb20gdGhlIHRvcCBhbmQgYm90dG9tIGVkZ2VzIHRvd2FyZCB0aGUgY2VudGVyIiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfNDNdfSwKKyAgezQ0LCAiYm93dGllLWgiLAorICAgICAgICAiVHdvIHdlZGdlIHNoYXBlcyBzbGlkZSBpbiBmcm9tIHRoZSBsZWZ0IGFuZCByaWdodCBlZGdlcyB0b3dhcmQgdGhlIGNlbnRlciIsCisgICAgICAgIGdzdF93aXBlX3RyaWFuZ2xlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzQ0XX0sCisgIHs0NSwgImJhcm5kb29yLWRibCIsCisgICAgICAgICJBIGRpYWdvbmFsIGxpbmUgZnJvbSB0aGUgbG93ZXItbGVmdCB0byB1cHBlci1yaWdodCBjb3JuZXJzIHNwbGl0cyBhbmQgZXhwYW5kcyB0b3dhcmQgdGhlIG9wcG9zaXRlIGNvcm5lcnMiLAorICAgICAgICBnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR180NV19LAorICB7NDYsICJiYXJuZG9vci1kdGwiLAorICAgICAgICAiQSBkaWFnb25hbCBsaW5lIGZyb20gdXBwZXItbGVmdCB0byBsb3dlci1yaWdodCBjb3JuZXJzIHNwbGl0cyBhbmQgZXhwYW5kcyB0b3dhcmQgdGhlIG9wcG9zaXRlIGNvcm5lcnMiLAorICAgICAgICBnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR180Nl19LAorICB7NDcsICJtaXNjLWRpYWdvbmFsLWRiZCIsCisgICAgICAgICJGb3VyIHdlZGdlIHNoYXBlcyBzcGxpdCBmcm9tIHRoZSBjZW50ZXIgYW5kIHJldHJhY3QgdG93YXJkIHRoZSBmb3VyIGVkZ2VzIiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfNDddfSwKKyAgezQ4LCAibWlzYy1kaWFnb25hbC1kZCIsCisgICAgICAgICJBIGRpYW1vbmQgY29ubmVjdGluZyB0aGUgZm91ciBlZGdlIG1pZHBvaW50cyBzaW11bHRhbmVvdXNseSBjb250cmFjdHMgdG93YXJkIHRoZSBjZW50ZXIgYW5kIGV4cGFuZHMgdG93YXJkIHRoZSBlZGdlcyIsCisgICAgICAgIGdzdF93aXBlX3RyaWFuZ2xlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzQ4XX0sCisgIHs2MSwgInZlZS1kIiwKKyAgICAgICAgIkEgd2VkZ2Ugc2hhcGUgbW92ZXMgZnJvbSB0b3AgdG8gYm90dG9tIiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfNjFdfSwKKyAgezYyLCAidmVlLWwiLAorICAgICAgICAiQSB3ZWRnZSBzaGFwZSBtb3ZlcyBmcm9tIHJpZ2h0IHRvIGxlZnQiLAorICAgICAgICBnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR182Ml19LAorICB7NjMsICJ2ZWUtdSIsCisgICAgICAgICJBIHdlZGdlIHNoYXBlIG1vdmVzIGZyb20gYm90dG9tIHRvIHRvcCIsCisgICAgICAgIGdzdF93aXBlX3RyaWFuZ2xlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzYzXX0sCisgIHs2NCwgInZlZS1yIiwKKyAgICAgICAgIkEgd2VkZ2Ugc2hhcGUgbW92ZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0IiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfNjRdfSwKKyAgezY1LCAiYmFybnZlZS1kIiwKKyAgICAgICAgIkEgJ1YnIHNoYXBlIGV4dGVuZGluZyBmcm9tIHRoZSBib3R0b20gZWRnZSdzIG1pZHBvaW50IHRvIHRoZSBvcHBvc2l0ZSBjb3JuZXJzIGNvbnRyYWN0cyB0b3dhcmQgdGhlIGNlbnRlciBhbmQgZXhwYW5kcyB0b3dhcmQgdGhlIGVkZ2VzIiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfNjVdfSwKKyAgezY2LCAiYmFybnZlZS1sIiwKKyAgICAgICAgIkEgJ1YnIHNoYXBlIGV4dGVuZGluZyBmcm9tIHRoZSBsZWZ0IGVkZ2UncyBtaWRwb2ludCB0byB0aGUgb3Bwb3NpdGUgY29ybmVycyBjb250cmFjdHMgdG93YXJkIHRoZSBjZW50ZXIgYW5kIGV4cGFuZHMgdG93YXJkIHRoZSBlZGdlcyIsCisgICAgICAgIGdzdF93aXBlX3RyaWFuZ2xlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzY2XX0sCisgIHs2NywgImJhcm52ZWUtdSIsCisgICAgICAgICJBICdWJyBzaGFwZSBleHRlbmRpbmcgZnJvbSB0aGUgdG9wIGVkZ2UncyBtaWRwb2ludCB0byB0aGUgb3Bwb3NpdGUgY29ybmVycyBjb250cmFjdHMgdG93YXJkIHRoZSBjZW50ZXIgYW5kIGV4cGFuZHMgdG93YXJkIHRoZSBlZGdlcyIsCisgICAgICAgIGdzdF93aXBlX3RyaWFuZ2xlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzY3XX0sCisgIHs2OCwgImJhcm52ZWUtciIsCisgICAgICAgICJBICdWJyBzaGFwZSBleHRlbmRpbmcgZnJvbSB0aGUgcmlnaHQgZWRnZSdzIG1pZHBvaW50IHRvIHRoZSBvcHBvc2l0ZSBjb3JuZXJzIGNvbnRyYWN0cyB0b3dhcmQgdGhlIGNlbnRlciBhbmQgZXhwYW5kcyB0b3dhcmQgdGhlIGVkZ2VzIiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfNjhdfSwKKyAgezEwMSwgImlyaXMtcmVjdCIsCisgICAgICAgICJBIHJlY3RhbmdsZSBleHBhbmRzIGZyb20gdGhlIGNlbnRlci4iLAorICAgICAgICBnc3Rfd2lwZV90cmlhbmdsZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18xMDFdfSwKKyAgezIwMSwgImNsb2NrLWN3MTIiLAorICAgICAgICAiQSByYWRpYWwgaGFuZCBzd2VlcHMgY2xvY2t3aXNlIGZyb20gdGhlIHR3ZWx2ZSBvJ2Nsb2NrIHBvc2l0aW9uIiwKKyAgICAgICAgZ3N0X3dpcGVfYm94ZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yMDFdfSwKKyAgezIwMiwgImNsb2NrLWN3MyIsCisgICAgICAgICJBIHJhZGlhbCBoYW5kIHN3ZWVwcyBjbG9ja3dpc2UgZnJvbSB0aGUgdGhyZWUgbydjbG9jayBwb3NpdGlvbiIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjAyXX0sCisgIHsyMDMsICJjbG9jay1jdzYiLAorICAgICAgICAiQSByYWRpYWwgaGFuZCBzd2VlcHMgY2xvY2t3aXNlIGZyb20gdGhlIHNpeCBvJ2Nsb2NrIHBvc2l0aW9uIiwKKyAgICAgICAgZ3N0X3dpcGVfYm94ZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yMDNdfSwKKyAgezIwNCwgImNsb2NrLWN3OSIsCisgICAgICAgICJBIHJhZGlhbCBoYW5kIHN3ZWVwcyBjbG9ja3dpc2UgZnJvbSB0aGUgbmluZSBvJ2Nsb2NrIHBvc2l0aW9uIiwKKyAgICAgICAgZ3N0X3dpcGVfYm94ZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yMDRdfSwKKyAgezIwNSwgInBpbndoZWVsLXRidiIsCisgICAgICAgICJUd28gcmFkaWFsIGhhbmRzIHN3ZWVwIGNsb2Nrd2lzZSBmcm9tIHRoZSB0d2VsdmUgYW5kIHNpeCBvJ2Nsb2NrIHBvc2l0aW9ucyIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjA1XX0sCisgIHsyMDYsICJwaW53aGVlbC10YmgiLAorICAgICAgICAiVHdvIHJhZGlhbCBoYW5kcyBzd2VlcCBjbG9ja3dpc2UgZnJvbSB0aGUgbmluZSBhbmQgdGhyZWUgbydjbG9jayBwb3NpdGlvbnMiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIwNl19LAorICB7MjA3LCAicGlud2hlZWwtZmIiLAorICAgICAgICAiRm91ciByYWRpYWwgaGFuZHMgc3dlZXAgY2xvY2t3aXNlIiwKKyAgICAgICAgZ3N0X3dpcGVfYm94ZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yMDddfSwKKyAgezIxMSwgImZhbi1jdCIsCisgICAgICAgICJBIGZhbiB1bmZvbGRzIGZyb20gdGhlIHRvcCBlZGdlLCB0aGUgZmFuIGF4aXMgYXQgdGhlIGNlbnRlciIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjExXX0sCisgIHsyMTIsICJmYW4tY3IiLAorICAgICAgICAiQSBmYW4gdW5mb2xkcyBmcm9tIHRoZSByaWdodCBlZGdlLCB0aGUgZmFuIGF4aXMgYXQgdGhlIGNlbnRlciIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjEyXX0sCisgIHsyMTMsICJkb3VibGVmYW4tZm92IiwKKyAgICAgICAgIlR3byBmYW5zLCB0aGVpciBheGVzIGF0IHRoZSBjZW50ZXIsIHVuZm9sZCBmcm9tIHRoZSB0b3AgYW5kIGJvdHRvbSIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjEzXX0sCisgIHsyMTQsICJkb3VibGVmYW4tZm9oIiwKKyAgICAgICAgIlR3byBmYW5zLCB0aGVpciBheGVzIGF0IHRoZSBjZW50ZXIsIHVuZm9sZCBmcm9tIHRoZSBsZWZ0IGFuZCByaWdodCIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjE0XX0sCisgIHsyMjEsICJzaW5nbGVzd2VlcC1jd3QiLAorICAgICAgICAiQSByYWRpYWwgaGFuZCBzd2VlcHMgY2xvY2t3aXNlIGZyb20gdGhlIHRvcCBlZGdlJ3MgbWlkcG9pbnQiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIyMV19LAorICB7MjIyLCAic2luZ2xlc3dlZXAtY3dyIiwKKyAgICAgICAgIkEgcmFkaWFsIGhhbmQgc3dlZXBzIGNsb2Nrd2lzZSBmcm9tIHRoZSByaWdodCBlZGdlJ3MgbWlkcG9pbnQiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIyMl19LAorICB7MjIzLCAic2luZ2xlc3dlZXAtY3diIiwKKyAgICAgICAgIkEgcmFkaWFsIGhhbmQgc3dlZXBzIGNsb2Nrd2lzZSBmcm9tIHRoZSBib3R0b20gZWRnZSdzIG1pZHBvaW50IiwKKyAgICAgICAgZ3N0X3dpcGVfYm94ZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yMjNdfSwKKyAgezIyNCwgInNpbmdsZXN3ZWVwLWN3bCIsCisgICAgICAgICJBIHJhZGlhbCBoYW5kIHN3ZWVwcyBjbG9ja3dpc2UgZnJvbSB0aGUgbGVmdCBlZGdlJ3MgbWlkcG9pbnQiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIyNF19LAorICB7MjI1LCAiZG91Ymxlc3dlZXAtcHYiLAorICAgICAgICAiVHdvIHJhZGlhbCBoYW5kcyBzd2VlcCBjbG9ja3dpc2UgYW5kIGNvdW50ZXItY2xvY2t3aXNlIGZyb20gdGhlIHRvcCBhbmQgYm90dG9tIGVkZ2VzJyBtaWRwb2ludHMiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIyNV19LAorICB7MjI2LCAiZG91Ymxlc3dlZXAtcGQiLAorICAgICAgICAiVHdvIHJhZGlhbCBoYW5kcyBzd2VlcCBjbG9ja3dpc2UgYW5kIGNvdW50ZXItY2xvY2t3aXNlIGZyb20gdGhlIGxlZnQgYW5kIHJpZ2h0IGVkZ2VzJyBtaWRwb2ludHMiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIyNl19LAorICB7MjI3LCAiZG91Ymxlc3dlZXAtb3YiLAorICAgICAgICAiVHdvIHJhZGlhbCBoYW5kcyBhdHRhY2hlZCBhdCB0aGUgdG9wIGFuZCBib3R0b20gZWRnZXMnIG1pZHBvaW50cyBzd2VlcCBmcm9tIHJpZ2h0IHRvIGxlZnQiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIyN119LAorICB7MjI4LCAiZG91Ymxlc3dlZXAtb2giLAorICAgICAgICAiVHdvIHJhZGlhbCBoYW5kcyBhdHRhY2hlZCBhdCB0aGUgbGVmdCBhbmQgcmlnaHQgZWRnZXMnIG1pZHBvaW50cyBzd2VlcCBmcm9tIHRvcCB0byBib3R0b20iLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIyOF19LAorICB7MjMxLCAiZmFuLXQiLAorICAgICAgICAiQSBmYW4gdW5mb2xkcyBmcm9tIHRoZSBib3R0b20sIHRoZSBmYW4gYXhpcyBhdCB0aGUgdG9wIGVkZ2UncyBtaWRwb2ludCIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjMxXX0sCisgIHsyMzIsICJmYW4tciIsCisgICAgICAgICJBIGZhbiB1bmZvbGRzIGZyb20gdGhlIGxlZnQsIHRoZSBmYW4gYXhpcyBhdCB0aGUgcmlnaHQgZWRnZSdzIG1pZHBvaW50IiwKKyAgICAgICAgZ3N0X3dpcGVfYm94ZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yMzJdfSwKKyAgezIzMywgImZhbi1iIiwKKyAgICAgICAgIkEgZmFuIHVuZm9sZHMgZnJvbSB0aGUgdG9wLCB0aGUgZmFuIGF4aXMgYXQgdGhlIGJvdHRvbSBlZGdlJ3MgbWlkcG9pbnQiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzIzM119LAorICB7MjM0LCAiZmFuLWwiLAorICAgICAgICAiQSBmYW4gdW5mb2xkcyBmcm9tIHRoZSByaWdodCwgdGhlIGZhbiBheGlzIGF0IHRoZSBsZWZ0IGVkZ2UncyBtaWRwb2ludCIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjM0XX0sCisgIHsyMzUsICJkb3VibGVmYW4tZml2IiwKKyAgICAgICAgIlR3byBmYW5zLCB0aGVpciBheGVzIGF0IHRoZSB0b3AgYW5kIGJvdHRvbSwgdW5mb2xkIGZyb20gdGhlIGNlbnRlciIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjM1XX0sCisgIHsyMzYsICJkb3VibGVmYW4tZmloIiwKKyAgICAgICAgIlR3byBmYW5zLCB0aGVpciBheGVzIGF0IHRoZSBsZWZ0IGFuZCByaWdodCwgdW5mb2xkIGZyb20gdGhlIGNlbnRlciIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjM2XX0sCisgIHsyNDEsICJzaW5nbGVzd2VlcC1jd3RsIiwKKyAgICAgICAgIkEgcmFkaWFsIGhhbmQgc3dlZXBzIGNsb2Nrd2lzZSBmcm9tIHRoZSB1cHBlci1sZWZ0IGNvcm5lciIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjQxXX0sCisgIHsyNDIsICJzaW5nbGVzd2VlcC1jd2JsIiwKKyAgICAgICAgIkEgcmFkaWFsIGhhbmQgc3dlZXBzIGNvdW50ZXItY2xvY2t3aXNlIGZyb20gdGhlIGxvd2VyLWxlZnQgY29ybmVyLiIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjQyXX0sCisgIHsyNDMsICJzaW5nbGVzd2VlcC1jd2JyIiwKKyAgICAgICAgIkEgcmFkaWFsIGhhbmQgc3dlZXBzIGNsb2Nrd2lzZSBmcm9tIHRoZSBsb3dlci1yaWdodCBjb3JuZXIiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzI0M119LAorICB7MjQ0LCAic2luZ2xlc3dlZXAtY3d0ciIsCisgICAgICAgICJBIHJhZGlhbCBoYW5kIHN3ZWVwcyBjb3VudGVyLWNsb2Nrd2lzZSBmcm9tIHRoZSB1cHBlci1yaWdodCBjb3JuZXIiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzI0NF19LAorICB7MjQ1LCAiZG91Ymxlc3dlZXAtcGR0bCIsCisgICAgICAgICJUd28gcmFkaWFsIGhhbmRzIGF0dGFjaGVkIGF0IHRoZSB1cHBlci1sZWZ0IGFuZCBsb3dlci1yaWdodCBjb3JuZXJzIHN3ZWVwIGRvd24gYW5kIHVwIiwKKyAgICAgICAgZ3N0X3dpcGVfdHJpYW5nbGVzX2Nsb2NrX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjQ1XX0sCisgIHsyNDYsICJkb3VibGVzd2VlcC1wZGJsIiwKKyAgICAgICAgIlR3byByYWRpYWwgaGFuZHMgYXR0YWNoZWQgYXQgdGhlIGxvd2VyLWxlZnQgYW5kIHVwcGVyLXJpZ2h0IGNvcm5lcnMgc3dlZXAgZG93biBhbmQgdXAiLAorICAgICAgICBnc3Rfd2lwZV90cmlhbmdsZXNfY2xvY2tfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yNDZdfSwKKyAgezI1MSwgInNhbG9vbmRvb3ItdCIsCisgICAgICAgICJUd28gcmFkaWFsIGhhbmRzIGF0dGFjaGVkIGF0IHRoZSB1cHBlci1sZWZ0IGFuZCB1cHBlci1yaWdodCBjb3JuZXJzIHN3ZWVwIGRvd24iLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzI1MV19LAorICB7MjUyLCAic2Fsb29uZG9vci1sIiwKKyAgICAgICAgIlR3byByYWRpYWwgaGFuZHMgYXR0YWNoZWQgYXQgdGhlIHVwcGVyLWxlZnQgYW5kIGxvd2VyLWxlZnQgY29ybmVycyBzd2VlcCB0byB0aGUgcmlnaHQiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzI1Ml19LAorICB7MjUzLCAic2Fsb29uZG9vci1iIiwKKyAgICAgICAgIlR3byByYWRpYWwgaGFuZHMgYXR0YWNoZWQgYXQgdGhlIGxvd2VyLWxlZnQgYW5kIGxvd2VyLXJpZ2h0IGNvcm5lcnMgc3dlZXAgdXAiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzI1M119LAorICB7MjU0LCAic2Fsb29uZG9vci1yIiwKKyAgICAgICAgIlR3byByYWRpYWwgaGFuZHMgYXR0YWNoZWQgYXQgdGhlIHVwcGVyLXJpZ2h0IGFuZCBsb3dlci1yaWdodCBjb3JuZXJzIHN3ZWVwIHRvIHRoZSBsZWZ0IiwKKyAgICAgICAgZ3N0X3dpcGVfYm94ZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yNTRdfSwKKyAgezI2MSwgIndpbmRzaGllbGQtciIsCisgICAgICAgICJUd28gcmFkaWFsIGhhbmRzIGF0dGFjaGVkIGF0IHRoZSBtaWRwb2ludHMgb2YgdGhlIHRvcCBhbmQgYm90dG9tIGhhbHZlcyBzd2VlcCBmcm9tIHJpZ2h0IHRvIGxlZnQiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzI2MV19LAorICB7MjYyLCAid2luZHNoaWVsZC11IiwKKyAgICAgICAgIlR3byByYWRpYWwgaGFuZHMgYXR0YWNoZWQgYXQgdGhlIG1pZHBvaW50cyBvZiB0aGUgbGVmdCBhbmQgcmlnaHQgaGFsdmVzIHN3ZWVwIGZyb20gdG9wIHRvIGJvdHRvbSIsCisgICAgICAgIGdzdF93aXBlX2JveGVzX2RyYXcsIF9nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3ksCisgICAgICAmd2lwZV9jb25maWdbV0lQRV9DT05GSUdfMjYyXX0sCisgIHsyNjMsICJ3aW5kc2hpZWxkLXYiLAorICAgICAgICAiVHdvIHNldHMgb2YgcmFkaWFsIGhhbmRzIGF0dGFjaGVkIGF0IHRoZSBtaWRwb2ludHMgb2YgdGhlIHRvcCBhbmQgYm90dG9tIGhhbHZlcyBzd2VlcCBmcm9tIHRvcCB0byBib3R0b20gYW5kIGJvdHRvbSB0byB0b3AiLAorICAgICAgICBnc3Rfd2lwZV9ib3hlc19kcmF3LCBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95LAorICAgICAgJndpcGVfY29uZmlnW1dJUEVfQ09ORklHXzI2M119LAorICB7MjY0LCAid2luZHNoaWVsZC1oIiwKKyAgICAgICAgIlR3byBzZXRzIG9mIHJhZGlhbCBoYW5kcyBhdHRhY2hlZCBhdCB0aGUgbWlkcG9pbnRzIG9mIHRoZSBsZWZ0IGFuZCByaWdodCBoYWx2ZXMgc3dlZXAgZnJvbSBsZWZ0IHRvIHJpZ2h0IGFuZCByaWdodCB0byBsZWZ0IiwKKyAgICAgICAgZ3N0X3dpcGVfYm94ZXNfZHJhdywgX2dzdF9tYXNrX2RlZmF1bHRfZGVzdHJveSwKKyAgICAgICZ3aXBlX2NvbmZpZ1tXSVBFX0NPTkZJR18yNjRdfSwKKyAgezAsIE5VTEwsIE5VTEwsIE5VTEx9Cit9OworCit2b2lkCitfZ3N0X2JhcmJveHdpcGVzX3JlZ2lzdGVyICh2b2lkKQoreworICBnaW50IGkgPSAwOworCisgIHdoaWxlIChkZWZpbml0aW9uc1tpXS5zaG9ydF9uYW1lKSB7CisgICAgX2dzdF9tYXNrX3JlZ2lzdGVyICgmZGVmaW5pdGlvbnNbaV0pOworICAgIGkrKzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L3NtcHRlL2dzdG1hc2suYyBiL2dzdC9zbXB0ZS9nc3RtYXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiNTkxOQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zbXB0ZS9nc3RtYXNrLmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RtYXNrLmgiCisjaW5jbHVkZSAicGFpbnQuaCIKKworc3RhdGljIEdMaXN0ICptYXNrcyA9IE5VTEw7CisKK3ZvaWQKK19nc3RfbWFza19pbml0ICh2b2lkKQoreworICBfZ3N0X2JhcmJveHdpcGVzX3JlZ2lzdGVyICgpOworfQorCitzdGF0aWMgZ2ludAorZ3N0X21hc2tfY29tcGFyZSAoR3N0TWFza0RlZmluaXRpb24gKiBkZWYxLCBHc3RNYXNrRGVmaW5pdGlvbiAqIGRlZjIpCit7CisgIHJldHVybiAoZGVmMS0+dHlwZSAtIGRlZjItPnR5cGUpOworfQorCit2b2lkCitfZ3N0X21hc2tfcmVnaXN0ZXIgKGNvbnN0IEdzdE1hc2tEZWZpbml0aW9uICogZGVmaW5pdGlvbikKK3sKKyAgbWFza3MgPQorICAgICAgZ19saXN0X2luc2VydF9zb3J0ZWQgKG1hc2tzLCAoZ3BvaW50ZXIpIGRlZmluaXRpb24sCisgICAgICAoR0NvbXBhcmVGdW5jKSBnc3RfbWFza19jb21wYXJlKTsKK30KKworY29uc3QgR0xpc3QgKgorZ3N0X21hc2tfZ2V0X2RlZmluaXRpb25zICh2b2lkKQoreworICByZXR1cm4gbWFza3M7Cit9CisKK3N0YXRpYyBHc3RNYXNrRGVmaW5pdGlvbiAqCitnc3RfbWFza19maW5kX2RlZmluaXRpb24gKGdpbnQgdHlwZSkKK3sKKyAgR0xpc3QgKndhbGsgPSBtYXNrczsKKworICB3aGlsZSAod2FsaykgeworICAgIEdzdE1hc2tEZWZpbml0aW9uICpkZWYgPSAoR3N0TWFza0RlZmluaXRpb24gKikgd2Fsay0+ZGF0YTsKKworICAgIGlmIChkZWYtPnR5cGUgPT0gdHlwZSkKKyAgICAgIHJldHVybiBkZWY7CisKKyAgICB3YWxrID0gZ19saXN0X25leHQgKHdhbGspOworICB9CisgIHJldHVybiBOVUxMOworfQorCitHc3RNYXNrICoKK2dzdF9tYXNrX2ZhY3RvcnlfbmV3IChnaW50IHR5cGUsIGdib29sZWFuIGludmVydCwgZ2ludCBicHAsIGdpbnQgd2lkdGgsCisgICAgZ2ludCBoZWlnaHQpCit7CisgIEdzdE1hc2tEZWZpbml0aW9uICpkZWZpbml0aW9uOworICBHc3RNYXNrICptYXNrID0gTlVMTDsKKworICBkZWZpbml0aW9uID0gZ3N0X21hc2tfZmluZF9kZWZpbml0aW9uICh0eXBlKTsKKyAgaWYgKGRlZmluaXRpb24pIHsKKyAgICBtYXNrID0gZ19uZXcwIChHc3RNYXNrLCAxKTsKKworICAgIG1hc2stPnR5cGUgPSBkZWZpbml0aW9uLT50eXBlOworICAgIG1hc2stPmJwcCA9IGJwcDsKKyAgICBtYXNrLT53aWR0aCA9IHdpZHRoOworICAgIG1hc2stPmhlaWdodCA9IGhlaWdodDsKKyAgICBtYXNrLT5kZXN0cm95X2Z1bmMgPSBkZWZpbml0aW9uLT5kZXN0cm95X2Z1bmM7CisgICAgbWFzay0+dXNlcl9kYXRhID0gZGVmaW5pdGlvbi0+dXNlcl9kYXRhOworICAgIG1hc2stPmRhdGEgPSBnX21hbGxvYyAod2lkdGggKiBoZWlnaHQgKiBzaXplb2YgKGd1aW50MzIpKTsKKworICAgIGRlZmluaXRpb24tPmRyYXdfZnVuYyAobWFzayk7CisKKyAgICBpZiAoaW52ZXJ0KSB7CisgICAgICBnaW50IGksIGo7CisgICAgICBndWludDMyICpkYXRhcCA9IG1hc2stPmRhdGE7CisgICAgICBndWludDMyIG1heCA9ICgxIDw8IGJwcCk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICAgICpkYXRhcCA9IG1heCAtICpkYXRhcDsKKyAgICAgICAgICBkYXRhcCsrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIG1hc2s7Cit9CisKK3ZvaWQKK19nc3RfbWFza19kZWZhdWx0X2Rlc3Ryb3kgKEdzdE1hc2sgKiBtYXNrKQoreworICBnX2ZyZWUgKG1hc2stPmRhdGEpOworICBnX2ZyZWUgKG1hc2spOworfQorCit2b2lkCitnc3RfbWFza19kZXN0cm95IChHc3RNYXNrICogbWFzaykKK3sKKyAgaWYgKG1hc2stPmRlc3Ryb3lfZnVuYykKKyAgICBtYXNrLT5kZXN0cm95X2Z1bmMgKG1hc2spOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3NtcHRlL2dzdG1hc2suaCBiL2dzdC9zbXB0ZS9nc3RtYXNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhNTA4MgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zbXB0ZS9nc3RtYXNrLmgKQEAgLTAsMCArMSw2NCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9NQVNLX0hfXworI2RlZmluZSBfX0dTVF9NQVNLX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCit0eXBlZGVmIHN0cnVjdCBfR3N0TWFzayBHc3RNYXNrOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE1hc2tEZWZpbml0aW9uIEdzdE1hc2tEZWZpbml0aW9uOworCit0eXBlZGVmIHZvaWQgICAgICAgICAgICAoKkdzdE1hc2tEcmF3RnVuYykgICAgICAgICAgICAgIChHc3RNYXNrICptYXNrKTsKK3R5cGVkZWYgdm9pZCAgICAgICAgICAgICgqR3N0TWFza0Rlc3Ryb3lGdW5jKSAgICAgICAgICAgKEdzdE1hc2sgKm1hc2spOworCitzdHJ1Y3QgX0dzdE1hc2tEZWZpbml0aW9uIHsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICB0eXBlOworICBjb25zdCBnY2hhciAgICAgICAgICAgKnNob3J0X25hbWU7CisgIGNvbnN0IGdjaGFyICAgICAgICAgICAqbG9uZ19uYW1lOworICBHc3RNYXNrRHJhd0Z1bmMgICAgICAgIGRyYXdfZnVuYzsKKyAgR3N0TWFza0Rlc3Ryb3lGdW5jICAgICBkZXN0cm95X2Z1bmM7CisgIGdjb25zdHBvaW50ZXIgICAgICAgICAgdXNlcl9kYXRhOworfTsKKworc3RydWN0IF9Hc3RNYXNrIHsKKyAgZ2ludCAgICAgICAgICAgICAgICAgICB0eXBlOworICBndWludDMyICAgICAgICAgICAgICAgKmRhdGE7CisgIGdjb25zdHBvaW50ZXIgICAgICAgICAgdXNlcl9kYXRhOworCisgIGdpbnQgICAgICAgICAgICAgICAgICAgd2lkdGg7CisgIGdpbnQgICAgICAgICAgICAgICAgICAgaGVpZ2h0OworICBnaW50ICAgICAgICAgICAgICAgICAgIGJwcDsKKworICBHc3RNYXNrRGVzdHJveUZ1bmMgICAgIGRlc3Ryb3lfZnVuYzsKK307CisKK3ZvaWQgICAgICAgICAgICAgICAgICAgIF9nc3RfbWFza19pbml0ICAgICAgICAgICAgICAgICAgKHZvaWQpOwordm9pZCAgICAgICAgICAgICAgICAgICAgX2dzdF9tYXNrX3JlZ2lzdGVyICAgICAgICAgICAgICAoY29uc3QgR3N0TWFza0RlZmluaXRpb24gKmRlZmluaXRpb24pOworCit2b2lkICAgICAgICAgICAgICAgICAgICBfZ3N0X21hc2tfZGVmYXVsdF9kZXN0cm95ICAgICAgIChHc3RNYXNrICptYXNrKTsKKworY29uc3QgR0xpc3QqICAgICAgICAgICAgZ3N0X21hc2tfZ2V0X2RlZmluaXRpb25zICAgICAgICAodm9pZCk7CitHc3RNYXNrKiAgICAgICAgICAgICAgICBnc3RfbWFza19mYWN0b3J5X25ldyAgICAgICAgICAgIChnaW50IHR5cGUsIGdib29sZWFuIGludmVydCwgZ2ludCBicHAsIGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0KTsKK3ZvaWQgICAgICAgICAgICAgICAgICAgIGdzdF9tYXNrX2Rlc3Ryb3kgICAgICAgICAgICAgICAgKEdzdE1hc2sgKm1hc2spOworCit2b2lkIF9nc3RfYmFyYm94d2lwZXNfcmVnaXN0ZXIgKHZvaWQpOworCisjZW5kaWYgLyogX19HU1RfTUFTS19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9zbXB0ZS9nc3RzbXB0ZS5jIGIvZ3N0L3NtcHRlL2dzdHNtcHRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjNTIyYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zbXB0ZS9nc3RzbXB0ZS5jCkBAIC0wLDAgKzEsNjcxIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtc21wdGUKKyAqCisgKiBzbXB0ZSBjYW4gYWNjZXB0IEk0MjAgdmlkZW8gc3RyZWFtcyB3aXRoIHRoZSBzYW1lIHdpZHRoLCBoZWlnaHQgYW5kCisgKiBmcmFtZXJhdGUuIFRoZSB0d28gaW5jb21taW5nIGJ1ZmZlcnMgYXJlIGJsZW5kZWQgdG9nZXRoZXIgdXNpbmcgYW4gZWZmZWN0CisgKiBzcGVjaWZpYyBhbHBoYSBtYXNrLiAKKyAqCisgKiBUaGUgI0dzdFNtcHRlOmRlcHRoIHByb3BlcnR5IGRlZmluZXMgdGhlIHByZXNpc2lvbiBpbiBiaXRzIG9mIHRoZSBtYXNrLiBBCisgKiBoaWdoZXIgcHJlc2lzaW9uIHdpbGwgY3JlYXRlIGEgbWFzayB3aXRoIHNtb290aGVyIGdyYWRpZW50cyBpbiBvcmRlciB0byBhdm9pZAorICogYmFuZGluZy4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+U2FtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgdmlkZW90ZXN0c3JjIHBhdHRlcm49MSAhIHNtcHRlIG5hbWU9cyBib3JkZXI9MjAwMDAgdHlwZT0yMzQgZHVyYXRpb249MjAwMDAwMDAwMCAhIHZpZGVvY29udmVydCAhIHhpbWFnZXNpbmsgdmlkZW90ZXN0c3JjICEgcy4KKyAqIF18IEEgcGlwZWxpbmUgdG8gZGVtb25zdHJhdGUgdGhlIHNtcHRlIHRyYW5zaXRpb24uCisgKiBJdCBzaG93cyBhIHBpbndoZWVsIHRyYW5zaXRpb24gYSBmcm9tIGEgc25vdyB2aWRlb3Rlc3RzcmMgdG8gYW4gc21wdGUKKyAqIHBhdHRlcm4gdmlkZW90ZXN0c3JjLiBUaGUgdHJhbnNpdGlvbiB3aWxsIHRha2UgMiBzZWNvbmRzIHRvIGNvbXBsZXRlLiBUaGUKKyAqIGVkZ2VzIG9mIHRoZSB0cmFuc2l0aW9uIGFyZSBzbW9vdGhlZCB3aXRoIGEgMjAwMDAgYmlnIGJvcmRlci4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdzdHNtcHRlLmgiCisjaW5jbHVkZSAicGFpbnQuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3NtcHRlX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9zbXB0ZV9kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3NtcHRlX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgiSTQyMCIpCisgICAgKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3Rfc21wdGVfc2luazFfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rMSIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkk0MjAiKQorICAgICkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3NtcHRlX3NpbmsyX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luazIiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJJNDIwIikKKyAgICApCisgICAgKTsKKworCisvKiBTTVBURSBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKKyNkZWZpbmUgREVGQVVMVF9QUk9QX1RZUEUJMQorI2RlZmluZSBERUZBVUxUX1BST1BfQk9SREVSCTAKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0RFUFRICTE2CisjZGVmaW5lIERFRkFVTFRfUFJPUF9EVVJBVElPTglHU1RfU0VDT05ECisjZGVmaW5lIERFRkFVTFRfUFJPUF9JTlZFUlQgICBGQUxTRQorCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9UWVBFLAorICBQUk9QX0JPUkRFUiwKKyAgUFJPUF9ERVBUSCwKKyAgUFJPUF9EVVJBVElPTiwKKyAgUFJPUF9JTlZFUlQKK307CisKKyNkZWZpbmUgR1NUX1RZUEVfU01QVEVfVFJBTlNJVElPTl9UWVBFIChnc3Rfc21wdGVfdHJhbnNpdGlvbl90eXBlX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9zbXB0ZV90cmFuc2l0aW9uX3R5cGVfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBzbXB0ZV90cmFuc2l0aW9uX3R5cGUgPSAwOworICBHRW51bVZhbHVlICpzbXB0ZV90cmFuc2l0aW9uczsKKworICBpZiAoIXNtcHRlX3RyYW5zaXRpb25fdHlwZSkgeworICAgIGNvbnN0IEdMaXN0ICpkZWZpbml0aW9uczsKKyAgICBnaW50IGkgPSAwOworCisgICAgZGVmaW5pdGlvbnMgPSBnc3RfbWFza19nZXRfZGVmaW5pdGlvbnMgKCk7CisgICAgc21wdGVfdHJhbnNpdGlvbnMgPQorICAgICAgICBnX25ldzAgKEdFbnVtVmFsdWUsIGdfbGlzdF9sZW5ndGggKChHTGlzdCAqKSBkZWZpbml0aW9ucykgKyAxKTsKKworICAgIHdoaWxlIChkZWZpbml0aW9ucykgeworICAgICAgR3N0TWFza0RlZmluaXRpb24gKmRlZmluaXRpb24gPSAoR3N0TWFza0RlZmluaXRpb24gKikgZGVmaW5pdGlvbnMtPmRhdGE7CisKKyAgICAgIGRlZmluaXRpb25zID0gZ19saXN0X25leHQgKGRlZmluaXRpb25zKTsKKworICAgICAgc21wdGVfdHJhbnNpdGlvbnNbaV0udmFsdWUgPSBkZWZpbml0aW9uLT50eXBlOworICAgICAgLyogb2xkZXIgR0xpYiB2ZXJzaW9ucyBoYXZlIHRoZSB0d28gZmllbGRzIGFzIG5vbi1jb25zdCwgaGVuY2UgdGhlIGNhc3QgKi8KKyAgICAgIHNtcHRlX3RyYW5zaXRpb25zW2ldLnZhbHVlX25pY2sgPSAoZ2NoYXIgKikgZGVmaW5pdGlvbi0+c2hvcnRfbmFtZTsKKyAgICAgIHNtcHRlX3RyYW5zaXRpb25zW2ldLnZhbHVlX25hbWUgPSAoZ2NoYXIgKikgZGVmaW5pdGlvbi0+bG9uZ19uYW1lOworCisgICAgICBpKys7CisgICAgfQorCisgICAgc21wdGVfdHJhbnNpdGlvbl90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFNNUFRFVHJhbnNpdGlvblR5cGUiLCBzbXB0ZV90cmFuc2l0aW9ucyk7CisgIH0KKyAgcmV0dXJuIHNtcHRlX3RyYW5zaXRpb25fdHlwZTsKK30KKworCitzdGF0aWMgdm9pZCBnc3Rfc21wdGVfZmluYWxpemUgKEdzdFNNUFRFICogc21wdGUpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc21wdGVfY29sbGVjdGVkIChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsCisgICAgR3N0U01QVEUgKiBzbXB0ZSk7CisKK3N0YXRpYyB2b2lkIGdzdF9zbXB0ZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfc21wdGVfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3NtcHRlX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKKy8qc3RhdGljIGd1aW50IGdzdF9zbXB0ZV9zaWduYWxzW0xBU1RfU0lHTkFMXSA9IHsgMCB9OyAqLworCisjZGVmaW5lIGdzdF9zbXB0ZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RTTVBURSwgZ3N0X3NtcHRlLCBHU1RfVFlQRV9FTEVNRU5UKTsKKworc3RhdGljIHZvaWQKK2dzdF9zbXB0ZV9jbGFzc19pbml0IChHc3RTTVBURUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBwYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3Rfc21wdGVfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfc21wdGVfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IChHT2JqZWN0RmluYWxpemVGdW5jKSBnc3Rfc21wdGVfZmluYWxpemU7CisKKyAgX2dzdF9tYXNrX2luaXQgKCk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9UWVBFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJ0eXBlIiwgIlR5cGUiLCAiVGhlIHR5cGUgb2YgdHJhbnNpdGlvbiB0byB1c2UiLAorICAgICAgICAgIEdTVF9UWVBFX1NNUFRFX1RSQU5TSVRJT05fVFlQRSwgREVGQVVMVF9QUk9QX1RZUEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQk9SREVSLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImJvcmRlciIsICJCb3JkZXIiLAorICAgICAgICAgICJUaGUgYm9yZGVyIHdpZHRoIG9mIHRoZSB0cmFuc2l0aW9uIiwgMCwgR19NQVhJTlQsCisgICAgICAgICAgREVGQVVMVF9QUk9QX0JPUkRFUiwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfREVQVEgsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiZGVwdGgiLCAiRGVwdGgiLCAiRGVwdGggb2YgdGhlIG1hc2sgaW4gYml0cyIsIDEsIDI0LAorICAgICAgICAgIERFRkFVTFRfUFJPUF9ERVBUSCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfRFVSQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfdWludDY0ICgiZHVyYXRpb24iLCAiRHVyYXRpb24iLAorICAgICAgICAgICJEdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBlZmZlY3QgaW4gbmFub3NlY29uZHMiLCAwLCBHX01BWFVJTlQ2NCwKKyAgICAgICAgICBERUZBVUxUX1BST1BfRFVSQVRJT04sIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0lOVkVSVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiaW52ZXJ0IiwgIkludmVydCIsCisgICAgICAgICAgIkludmVydCB0cmFuc2l0aW9uIG1hc2siLCBERUZBVUxUX1BST1BfSU5WRVJULAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc21wdGVfY2hhbmdlX3N0YXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc21wdGVfc2luazFfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc21wdGVfc2luazJfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3Rfc21wdGVfc3JjX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlNNUFRFIHRyYW5zaXRpb25zIiwKKyAgICAgICJGaWx0ZXIvRWRpdG9yL1ZpZGVvIiwKKyAgICAgICJBcHBseSB0aGUgc3RhbmRhcmQgU01QVEUgdHJhbnNpdGlvbnMgb24gdmlkZW8gaW1hZ2VzIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY2hlbGxvLmJlPiIpOworfQorCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdodCAgeWVsICBjeWEgIGdybiAgbWFnICByZWQgIGJsdSAgYmxrICAgLUkgICAgUSAqLworc3RhdGljIGNvbnN0IGludCB5X2NvbG9yc1tdID0geyAyNTUsIDIyNiwgMTc5LCAxNTAsIDEwNSwgNzYsIDI5LCAxNiwgMTYsIDAgfTsKK3N0YXRpYyBjb25zdCBpbnQgdV9jb2xvcnNbXSA9IHsgMTI4LCAwLCAxNzAsIDQ2LCAyMTIsIDg1LCAyNTUsIDEyOCwgMCwgMTI4IH07CitzdGF0aWMgY29uc3QgaW50IHZfY29sb3JzW10gPSB7IDEyOCwgMTU1LCAwLCAyMSwgMjM1LCAyNTUsIDEwNywgMTI4LCAxMjgsIDI1NSB9OworCitzdGF0aWMgdm9pZAorZmlsbF9pNDIwIChHc3RWaWRlb0luZm8gKiB2aW5mbywgZ3VpbnQ4ICogZGF0YSwgZ2ludCBoZWlnaHQsIGdpbnQgY29sb3IpCit7CisgIGdpbnQgc2l6ZSA9IEdTVF9WSURFT19JTkZPX0NPTVBfU1RSSURFICh2aW5mbywgMCkgKiBHU1RfUk9VTkRfVVBfMiAoaGVpZ2h0KTsKKyAgZ2ludCBzaXplNCA9IHNpemUgPj4gMjsKKyAgZ3VpbnQ4ICp5cCA9IGRhdGE7CisgIGd1aW50OCAqdXAgPSBkYXRhICsgR1NUX1ZJREVPX0lORk9fQ09NUF9PRkZTRVQgKHZpbmZvLCAxKTsKKyAgZ3VpbnQ4ICp2cCA9IGRhdGEgKyBHU1RfVklERU9fSU5GT19DT01QX09GRlNFVCAodmluZm8sIDIpOworCisgIG1lbXNldCAoeXAsIHlfY29sb3JzW2NvbG9yXSwgc2l6ZSk7CisgIG1lbXNldCAodXAsIHVfY29sb3JzW2NvbG9yXSwgc2l6ZTQpOworICBtZW1zZXQgKHZwLCB2X2NvbG9yc1tjb2xvcl0sIHNpemU0KTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc21wdGVfdXBkYXRlX21hc2sgKEdzdFNNUFRFICogc21wdGUsIGdpbnQgdHlwZSwgZ2Jvb2xlYW4gaW52ZXJ0LAorICAgIGdpbnQgZGVwdGgsIGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0KQoreworICBHc3RNYXNrICpuZXdtYXNrOworCisgIGlmIChzbXB0ZS0+bWFzaykgeworICAgIGlmIChzbXB0ZS0+dHlwZSA9PSB0eXBlICYmCisgICAgICAgIHNtcHRlLT5pbnZlcnQgPT0gaW52ZXJ0ICYmCisgICAgICAgIHNtcHRlLT5kZXB0aCA9PSBkZXB0aCAmJgorICAgICAgICBzbXB0ZS0+d2lkdGggPT0gd2lkdGggJiYgc21wdGUtPmhlaWdodCA9PSBoZWlnaHQpCisgICAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIG5ld21hc2sgPSBnc3RfbWFza19mYWN0b3J5X25ldyAodHlwZSwgaW52ZXJ0LCBkZXB0aCwgd2lkdGgsIGhlaWdodCk7CisgIGlmIChuZXdtYXNrKSB7CisgICAgaWYgKHNtcHRlLT5tYXNrKSB7CisgICAgICBnc3RfbWFza19kZXN0cm95IChzbXB0ZS0+bWFzayk7CisgICAgfQorICAgIHNtcHRlLT5tYXNrID0gbmV3bWFzazsKKyAgICBzbXB0ZS0+dHlwZSA9IHR5cGU7CisgICAgc21wdGUtPmludmVydCA9IGludmVydDsKKyAgICBzbXB0ZS0+ZGVwdGggPSBkZXB0aDsKKyAgICBzbXB0ZS0+d2lkdGggPSB3aWR0aDsKKyAgICBzbXB0ZS0+aGVpZ2h0ID0gaGVpZ2h0OworCisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9zbXB0ZV9zZXRjYXBzIChHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTTVBURSAqc21wdGU7CisgIGdib29sZWFuIHJldDsKKyAgR3N0VmlkZW9JbmZvIHZpbmZvOworCisgIHNtcHRlID0gR1NUX1NNUFRFIChHU1RfUEFEX1BBUkVOVCAocGFkKSk7CisKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJnZpbmZvKTsKKyAgaWYgKCFnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMgKCZ2aW5mbywgY2FwcykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHNtcHRlLT53aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIICgmdmluZm8pOworICBzbXB0ZS0+aGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUICgmdmluZm8pOworICBzbXB0ZS0+ZnBzX251bSA9IEdTVF9WSURFT19JTkZPX0ZQU19OICgmdmluZm8pOworICBzbXB0ZS0+ZnBzX2Rlbm9tID0gR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZ2aW5mbyk7CisKKyAgLyogZmlndXJlIG91dCB0aGUgZHVyYXRpb24gaW4gZnJhbWVzICovCisgIHNtcHRlLT5lbmRfcG9zaXRpb24gPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNtcHRlLT5kdXJhdGlvbiwKKyAgICAgIHNtcHRlLT5mcHNfbnVtLCBHU1RfU0VDT05EICogc21wdGUtPmZwc19kZW5vbSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc21wdGUsICJkdXJhdGlvbjogJWQgZnJhbWVzIiwgc21wdGUtPmVuZF9wb3NpdGlvbik7CisKKyAgcmV0ID0KKyAgICAgIGdzdF9zbXB0ZV91cGRhdGVfbWFzayAoc21wdGUsIHNtcHRlLT50eXBlLCBzbXB0ZS0+aW52ZXJ0LCBzbXB0ZS0+ZGVwdGgsCisgICAgICBzbXB0ZS0+d2lkdGgsIHNtcHRlLT5oZWlnaHQpOworCisgIGlmIChwYWQgPT0gc21wdGUtPnNpbmtwYWQxKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc21wdGUsICJzZXR0aW5nIHBhZDEgaW5mbyIpOworICAgIHNtcHRlLT52aW5mbzEgPSB2aW5mbzsKKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzbXB0ZSwgInNldHRpbmcgcGFkMiBpbmZvIik7CisgICAgc21wdGUtPnZpbmZvMiA9IHZpbmZvOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc21wdGVfc2lua19ldmVudCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLAorICAgIEdzdENvbGxlY3REYXRhICogZGF0YSwgR3N0RXZlbnQgKiBldmVudCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RQYWQgKnBhZDsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgcGFkID0gZGF0YS0+cGFkOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICByZXQgPSBnc3Rfc21wdGVfc2V0Y2FwcyAocGFkLCBjYXBzKTsKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgZXZlbnQgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChldmVudCAhPSBOVUxMKQorICAgIHJldHVybiBnc3RfY29sbGVjdF9wYWRzX2V2ZW50X2RlZmF1bHQgKHBhZHMsIGRhdGEsIGV2ZW50LCBGQUxTRSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zbXB0ZV9pbml0IChHc3RTTVBURSAqIHNtcHRlKQoreworICBzbXB0ZS0+c2lua3BhZDEgPQorICAgICAgZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZnc3Rfc21wdGVfc2luazFfdGVtcGxhdGUsICJzaW5rMSIpOworICBHU1RfUEFEX1NFVF9QUk9YWV9DQVBTIChzbXB0ZS0+c2lua3BhZDEpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAoc21wdGUpLCBzbXB0ZS0+c2lua3BhZDEpOworCisgIHNtcHRlLT5zaW5rcGFkMiA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJmdzdF9zbXB0ZV9zaW5rMl90ZW1wbGF0ZSwgInNpbmsyIik7CisgIEdTVF9QQURfU0VUX1BST1hZX0NBUFMgKHNtcHRlLT5zaW5rcGFkMik7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UIChzbXB0ZSksIHNtcHRlLT5zaW5rcGFkMik7CisKKyAgc21wdGUtPnNyY3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJmdzdF9zbXB0ZV9zcmNfdGVtcGxhdGUsICJzcmMiKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKHNtcHRlKSwgc21wdGUtPnNyY3BhZCk7CisKKyAgc21wdGUtPmNvbGxlY3QgPSBnc3RfY29sbGVjdF9wYWRzX25ldyAoKTsKKyAgZ3N0X2NvbGxlY3RfcGFkc19zZXRfZnVuY3Rpb24gKHNtcHRlLT5jb2xsZWN0LAorICAgICAgKEdzdENvbGxlY3RQYWRzRnVuY3Rpb24pIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc21wdGVfY29sbGVjdGVkKSwgc21wdGUpOworICBnc3RfY29sbGVjdF9wYWRzX3NldF9ldmVudF9mdW5jdGlvbiAoc21wdGUtPmNvbGxlY3QsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NtcHRlX3NpbmtfZXZlbnQpLCBzbXB0ZSk7CisKKyAgZ3N0X2NvbGxlY3RfcGFkc19hZGRfcGFkIChzbXB0ZS0+Y29sbGVjdCwgc21wdGUtPnNpbmtwYWQxLAorICAgICAgc2l6ZW9mIChHc3RDb2xsZWN0RGF0YSksIE5VTEwsIFRSVUUpOworICBnc3RfY29sbGVjdF9wYWRzX2FkZF9wYWQgKHNtcHRlLT5jb2xsZWN0LCBzbXB0ZS0+c2lua3BhZDIsCisgICAgICBzaXplb2YgKEdzdENvbGxlY3REYXRhKSwgTlVMTCwgVFJVRSk7CisKKyAgc21wdGUtPnR5cGUgPSBERUZBVUxUX1BST1BfVFlQRTsKKyAgc21wdGUtPmJvcmRlciA9IERFRkFVTFRfUFJPUF9CT1JERVI7CisgIHNtcHRlLT5kZXB0aCA9IERFRkFVTFRfUFJPUF9ERVBUSDsKKyAgc21wdGUtPmR1cmF0aW9uID0gREVGQVVMVF9QUk9QX0RVUkFUSU9OOworICBzbXB0ZS0+aW52ZXJ0ID0gREVGQVVMVF9QUk9QX0lOVkVSVDsKKyAgc21wdGUtPmZwc19udW0gPSAwOworICBzbXB0ZS0+ZnBzX2Rlbm9tID0gMTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zbXB0ZV9maW5hbGl6ZSAoR3N0U01QVEUgKiBzbXB0ZSkKK3sKKyAgaWYgKHNtcHRlLT5jb2xsZWN0KSB7CisgICAgZ3N0X29iamVjdF91bnJlZiAoc21wdGUtPmNvbGxlY3QpOworICB9CisgIGlmIChzbXB0ZS0+bWFzaykgeworICAgIGdzdF9tYXNrX2Rlc3Ryb3kgKHNtcHRlLT5tYXNrKTsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAoKEdPYmplY3QgKikgc21wdGUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NtcHRlX3Jlc2V0IChHc3RTTVBURSAqIHNtcHRlKQoreworICBzbXB0ZS0+d2lkdGggPSAtMTsKKyAgc21wdGUtPmhlaWdodCA9IC0xOworICBzbXB0ZS0+cG9zaXRpb24gPSAwOworICBzbXB0ZS0+ZW5kX3Bvc2l0aW9uID0gMDsKKyAgc21wdGUtPnNlbmRfc3RyZWFtX3N0YXJ0ID0gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zbXB0ZV9ibGVuZF9pNDIwIChHc3RWaWRlb0ZyYW1lICogZnJhbWUxLCBHc3RWaWRlb0ZyYW1lICogZnJhbWUyLAorICAgIEdzdFZpZGVvRnJhbWUgKiBvZnJhbWUsIEdzdE1hc2sgKiBtYXNrLCBnaW50IGJvcmRlciwgZ2ludCBwb3MpCit7CisgIGd1aW50MzIgKm1hc2twOworICBnaW50IHZhbHVlOworICBnaW50IGksIGo7CisgIGdpbnQgbWluLCBtYXg7CisgIGd1aW50OCAqaW4xLCAqaW4yLCAqb3V0LCAqaW4xdSwgKmluMXYsICppbjJ1LCAqaW4ydiwgKm91dHUsICpvdXR2OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgaWYgKGJvcmRlciA9PSAwKQorICAgIGJvcmRlcisrOworCisgIG1pbiA9IHBvcyAtIGJvcmRlcjsKKyAgbWF4ID0gcG9zOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZTEpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChmcmFtZTEpOworCisgIGluMSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lMSwgMCk7CisgIGluMiA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lMiwgMCk7CisgIG91dCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKG9mcmFtZSwgMCk7CisKKyAgaW4xdSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lMSwgMSk7CisgIGluMXYgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZTEsIDIpOworICBpbjJ1ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZnJhbWUyLCAxKTsKKyAgaW4ydiA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lMiwgMik7CisgIG91dHUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChvZnJhbWUsIDEpOworICBvdXR2ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAob2ZyYW1lLCAyKTsKKworICBtYXNrcCA9IG1hc2stPmRhdGE7CisKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgIHZhbHVlID0gKm1hc2twKys7CisgICAgICB2YWx1ZSA9ICgoQ0xBTVAgKHZhbHVlLCBtaW4sIG1heCkgLSBtaW4pIDw8IDgpIC8gYm9yZGVyOworCisgICAgICBvdXRbal0gPSAoKGluMVtqXSAqIHZhbHVlKSArIChpbjJbal0gKiAoMjU2IC0gdmFsdWUpKSkgPj4gODsKKyAgICAgIGlmICghKGkgJiAxKSAmJiAhKGogJiAxKSkgeworICAgICAgICBvdXR1W2ogLyAyXSA9CisgICAgICAgICAgICAoKGluMXVbaiAvIDJdICogdmFsdWUpICsgKGluMnVbaiAvIDJdICogKDI1NiAtIHZhbHVlKSkpID4+IDg7CisgICAgICAgIG91dHZbaiAvIDJdID0KKyAgICAgICAgICAgICgoaW4xdltqIC8gMl0gKiB2YWx1ZSkgKyAoaW4ydltqIC8gMl0gKiAoMjU2IC0gdmFsdWUpKSkgPj4gODsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbjEgKz0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZTEsIDApOworICAgIGluMiArPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lMiwgMCk7CisgICAgb3V0ICs9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAob2ZyYW1lLCAwKTsKKworICAgIGlmICghKGkgJiAxKSkgeworICAgICAgaW4xdSArPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lMSwgMSk7CisgICAgICBpbjJ1ICs9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUyLCAxKTsKKyAgICAgIGluMXYgKz0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZTEsIDIpOworICAgICAgaW4ydiArPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lMSwgMik7CisgICAgICBvdXR1ICs9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAob2ZyYW1lLCAxKTsKKyAgICAgIG91dHYgKz0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChvZnJhbWUsIDIpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3NtcHRlX2NvbGxlY3RlZCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLCBHc3RTTVBURSAqIHNtcHRlKQoreworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0Q2xvY2tUaW1lIHRzOworICBHc3RCdWZmZXIgKmluMSA9IE5VTEwsICppbjIgPSBOVUxMOworICBHU0xpc3QgKmNvbGxlY3RlZDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdFZpZGVvRnJhbWUgZnJhbWUxLCBmcmFtZTIsIG9mcmFtZTsKKworICBpZiAoR19VTkxJS0VMWSAoc21wdGUtPmZwc19udW0gPT0gMCkpCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICBpZiAoIWdzdF9wYWRfaGFzX2N1cnJlbnRfY2FwcyAoc21wdGUtPnNpbmtwYWQxKSB8fAorICAgICAgIWdzdF9wYWRfaGFzX2N1cnJlbnRfY2FwcyAoc21wdGUtPnNpbmtwYWQyKSkKKyAgICBnb3RvIG5vdF9uZWdvdGlhdGVkOworCisgIGlmICghZ3N0X3ZpZGVvX2luZm9faXNfZXF1YWwgKCZzbXB0ZS0+dmluZm8xLCAmc21wdGUtPnZpbmZvMikpCisgICAgZ290byBpbnB1dF9mb3JtYXRzX2RvX25vdF9tYXRjaDsKKworICBpZiAoc21wdGUtPnNlbmRfc3RyZWFtX3N0YXJ0KSB7CisgICAgZ2NoYXIgc19pZFszMl07CisKKyAgICAvKiBzdHJlYW0tc3RhcnQgKEZJWE1FOiBjcmVhdGUgaWQgYmFzZWQgb24gaW5wdXQgaWRzKSAqLworICAgIGdfc25wcmludGYgKHNfaWQsIHNpemVvZiAoc19pZCksICJzbXB0ZS0lMDh4IiwgZ19yYW5kb21faW50ICgpKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNtcHRlLT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0IChzX2lkKSk7CisgICAgc21wdGUtPnNlbmRfc3RyZWFtX3N0YXJ0ID0gRkFMU0U7CisgIH0KKworICB0cyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNtcHRlLT5wb3NpdGlvbiAqIEdTVF9TRUNPTkQsCisgICAgICBzbXB0ZS0+ZnBzX2Rlbm9tLCBzbXB0ZS0+ZnBzX251bSk7CisKKyAgZm9yIChjb2xsZWN0ZWQgPSBwYWRzLT5kYXRhOyBjb2xsZWN0ZWQ7IGNvbGxlY3RlZCA9IGdfc2xpc3RfbmV4dCAoY29sbGVjdGVkKSkgeworICAgIEdzdENvbGxlY3REYXRhICpkYXRhOworCisgICAgZGF0YSA9IChHc3RDb2xsZWN0RGF0YSAqKSBjb2xsZWN0ZWQtPmRhdGE7CisKKyAgICBpZiAoZGF0YS0+cGFkID09IHNtcHRlLT5zaW5rcGFkMSkKKyAgICAgIGluMSA9IGdzdF9jb2xsZWN0X3BhZHNfcG9wIChwYWRzLCBkYXRhKTsKKyAgICBlbHNlIGlmIChkYXRhLT5wYWQgPT0gc21wdGUtPnNpbmtwYWQyKQorICAgICAgaW4yID0gZ3N0X2NvbGxlY3RfcGFkc19wb3AgKHBhZHMsIGRhdGEpOworICB9CisKKyAgaWYgKGluMSA9PSBOVUxMKSB7CisgICAgLyogaWYgbm8gaW5wdXQsIG1ha2UgcGljdHVyZSBibGFjayAqLworICAgIGluMSA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoR1NUX1ZJREVPX0lORk9fU0laRSAoJnNtcHRlLT52aW5mbzEpKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoaW4xLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgICBmaWxsX2k0MjAgKCZzbXB0ZS0+dmluZm8xLCBtYXAuZGF0YSwgc21wdGUtPmhlaWdodCwgNyk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoaW4xLCAmbWFwKTsKKyAgfQorICBpZiAoaW4yID09IE5VTEwpIHsKKyAgICAvKiBpZiBubyBpbnB1dCwgbWFrZSBwaWN0dXJlIHdoaXRlICovCisgICAgaW4yID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChHU1RfVklERU9fSU5GT19TSVpFICgmc21wdGUtPnZpbmZvMikpOworICAgIGdzdF9idWZmZXJfbWFwIChpbjIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICAgIGZpbGxfaTQyMCAoJnNtcHRlLT52aW5mbzIsIG1hcC5kYXRhLCBzbXB0ZS0+aGVpZ2h0LCAwKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChpbjIsICZtYXApOworICB9CisKKyAgaWYgKHNtcHRlLT5wb3NpdGlvbiA8IHNtcHRlLT5lbmRfcG9zaXRpb24pIHsKKyAgICBvdXRidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKEdTVF9WSURFT19JTkZPX1NJWkUgKCZzbXB0ZS0+dmluZm8xKSk7CisKKyAgICAvKiBzZXQgY2FwcyBpZiBub3QgZG9uZSB5ZXQgKi8KKyAgICBpZiAoIWdzdF9wYWRfaGFzX2N1cnJlbnRfY2FwcyAoc21wdGUtPnNyY3BhZCkpIHsKKyAgICAgIEdzdENhcHMgKmNhcHM7CisgICAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgICAgIGNhcHMgPSBnc3RfdmlkZW9faW5mb190b19jYXBzICgmc21wdGUtPnZpbmZvMSk7CisKKyAgICAgIGdzdF9wYWRfc2V0X2NhcHMgKHNtcHRlLT5zcmNwYWQsIGNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAoc21wdGUtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworICAgIH0KKworICAgIGdzdF92aWRlb19mcmFtZV9tYXAgKCZmcmFtZTEsICZzbXB0ZS0+dmluZm8xLCBpbjEsIEdTVF9NQVBfUkVBRCk7CisgICAgZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJmZyYW1lMiwgJnNtcHRlLT52aW5mbzIsIGluMiwgR1NUX01BUF9SRUFEKTsKKyAgICAvKiByZS11c2UgZWl0aGVyIGluZm8sIG5vdyBrbm93IHRoZXkgYXJlIGVzc2VudGlhbGx5IGlkZW50aWNhbCAqLworICAgIGdzdF92aWRlb19mcmFtZV9tYXAgKCZvZnJhbWUsICZzbXB0ZS0+dmluZm8xLCBvdXRidWYsIEdTVF9NQVBfV1JJVEUpOworICAgIGdzdF9zbXB0ZV9ibGVuZF9pNDIwICgmZnJhbWUxLCAmZnJhbWUyLCAmb2ZyYW1lLCBzbXB0ZS0+bWFzaywgc21wdGUtPmJvcmRlciwKKyAgICAgICAgKCgxIDw8IHNtcHRlLT5kZXB0aCkgKyBzbXB0ZS0+Ym9yZGVyKSAqCisgICAgICAgIHNtcHRlLT5wb3NpdGlvbiAvIHNtcHRlLT5lbmRfcG9zaXRpb24pOworICAgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJmZyYW1lMSk7CisgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmZnJhbWUyKTsKKyAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZvZnJhbWUpOworICB9IGVsc2UgeworICAgIG91dGJ1ZiA9IGluMjsKKyAgICBnc3RfYnVmZmVyX3JlZiAoaW4yKTsKKyAgfQorCisgIHNtcHRlLT5wb3NpdGlvbisrOworCisgIGlmIChpbjEpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoaW4xKTsKKyAgaWYgKGluMikKKyAgICBnc3RfYnVmZmVyX3VucmVmIChpbjIpOworCisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpID0gdHM7CisKKyAgcmV0dXJuIGdzdF9wYWRfcHVzaCAoc21wdGUtPnNyY3BhZCwgb3V0YnVmKTsKKworICAvKiBFUlJPUlMgKi8KK25vdF9uZWdvdGlhdGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNtcHRlLCBDT1JFLCBORUdPVElBVElPTiwgKE5VTEwpLAorICAgICAgICAoIk5vIGlucHV0IGZvcm1hdCBuZWdvdGlhdGVkIikpOworICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgfQoraW5wdXRfZm9ybWF0c19kb19ub3RfbWF0Y2g6CisgIHsKKyAgICBHc3RDYXBzICpjYXBzMSwgKmNhcHMyOworCisgICAgY2FwczEgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHNtcHRlLT5zaW5rcGFkMSk7CisgICAgY2FwczIgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHNtcHRlLT5zaW5rcGFkMik7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNtcHRlLCBDT1JFLCBORUdPVElBVElPTiwgKE5VTEwpLAorICAgICAgICAoImlucHV0IGZvcm1hdHMgZG9uJ3QgbWF0Y2g6ICUiIEdTVF9QVFJfRk9STUFUICIgdnMuICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICAgICAgY2FwczEsIGNhcHMyKSk7CisgICAgaWYgKGNhcHMxKQorICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMxKTsKKyAgICBpZiAoY2FwczIpCisgICAgICBnc3RfY2Fwc191bnJlZiAoY2FwczIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3NtcHRlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTTVBURSAqc21wdGU7CisKKyAgc21wdGUgPSBHU1RfU01QVEUgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1RZUEU6CisgICAgICBzbXB0ZS0+dHlwZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CT1JERVI6CisgICAgICBzbXB0ZS0+Ym9yZGVyID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfREVQVEg6CisgICAgICBzbXB0ZS0+ZGVwdGggPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9EVVJBVElPTjoKKyAgICAgIHNtcHRlLT5kdXJhdGlvbiA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lOVkVSVDoKKyAgICAgIHNtcHRlLT5pbnZlcnQgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc21wdGVfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFNNUFRFICpzbXB0ZTsKKworICBzbXB0ZSA9IEdTVF9TTVBURSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfVFlQRToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBzbXB0ZS0+dHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQk9SREVSOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgc21wdGUtPmJvcmRlcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfREVQVEg6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBzbXB0ZS0+ZGVwdGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RVUkFUSU9OOgorICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgc21wdGUtPmR1cmF0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTlZFUlQ6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc21wdGUtPmludmVydCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3NtcHRlX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgR3N0U01QVEUgKnNtcHRlOworCisgIHNtcHRlID0gR1NUX1NNUFRFIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fUEFVU0VEOgorICAgICAgZ3N0X3NtcHRlX3Jlc2V0IChzbXB0ZSk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoc21wdGUsICJzdGFydGluZyBjb2xsZWN0cGFkcyIpOworICAgICAgZ3N0X2NvbGxlY3RfcGFkc19zdGFydCAoc21wdGUtPmNvbGxlY3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChzbXB0ZSwgInN0b3BwaW5nIGNvbGxlY3RwYWRzIik7CisgICAgICBnc3RfY29sbGVjdF9wYWRzX3N0b3AgKHNtcHRlLT5jb2xsZWN0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3Rfc21wdGVfcmVzZXQgKHNtcHRlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3NtcHRlX3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3Rfc21wdGVfZGVidWcsICJzbXB0ZSIsIDAsCisgICAgICAiU01QVEUgdHJhbnNpdGlvbiBlZmZlY3QiKTsKKworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInNtcHRlIiwgR1NUX1JBTktfTk9ORSwgR1NUX1RZUEVfU01QVEUpOworfQpkaWZmIC0tZ2l0IGEvZ3N0L3NtcHRlL2dzdHNtcHRlLmggYi9nc3Qvc21wdGUvZ3N0c21wdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDM5OTQyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3NtcHRlL2dzdHNtcHRlLmgKQEAgLTAsMCArMSw4NSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9TTVBURV9IX18KKyNkZWZpbmUgX19HU1RfU01QVEVfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0Y29sbGVjdHBhZHMuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworR19CRUdJTl9ERUNMUworCisjaW5jbHVkZSAiZ3N0bWFzay5oIgorCisjZGVmaW5lIEdTVF9UWVBFX1NNUFRFIFwKKyAgKGdzdF9zbXB0ZV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfU01QVEUob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9TTVBURSxHc3RTTVBURSkpCisjZGVmaW5lIEdTVF9TTVBURV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9TTVBURSxHc3RTTVBURUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1NNUFRFKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfU01QVEUpKQorI2RlZmluZSBHU1RfSVNfU01QVEVfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfU01QVEUpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0U01QVEUgR3N0U01QVEU7Cit0eXBlZGVmIHN0cnVjdCBfR3N0U01QVEVDbGFzcyBHc3RTTVBURUNsYXNzOworCitzdHJ1Y3QgX0dzdFNNUFRFIHsKKyAgR3N0RWxlbWVudCAgICAgZWxlbWVudDsKKworICAvKiBwYWRzICovCisgIEdzdFBhZCAgICAgICAgKnNyY3BhZCwKKyAgICAgICAgICAgICAgICAqc2lua3BhZDEsCisgICAgICAgICAgICAgICAgKnNpbmtwYWQyOworICBHc3RDb2xsZWN0UGFkcyAqY29sbGVjdDsKKyAgZ2Jvb2xlYW4gICAgICAgIHNlbmRfc3RyZWFtX3N0YXJ0OworCisgIC8qIHByb3BlcnRpZXMgKi8KKyAgZ2ludCAgICAgICAgICAgdHlwZTsKKyAgZ2ludCAgICAgICAgICAgYm9yZGVyOworICBnaW50ICAgICAgICAgICBkZXB0aDsKKyAgZ3VpbnQ2NCAgICAgICAgZHVyYXRpb247CisgIGdib29sZWFuICAgICAgIGludmVydDsKKworICAvKiBuZWdvdGlhdGVkIGZvcm1hdCAqLworICBnaW50ICAgICAgICAgICB3aWR0aDsKKyAgZ2ludCAgICAgICAgICAgaGVpZ2h0OworICBnaW50ICAgICAgICAgICBmcHNfbnVtOworICBnaW50ICAgICAgICAgICBmcHNfZGVub207CisgIEdzdFZpZGVvSW5mbyAgIHZpbmZvMTsKKyAgR3N0VmlkZW9JbmZvICAgdmluZm8yOworCisgIC8qIHN0YXRlIG9mIHRoZSBlZmZlY3QgKi8KKyAgZ2ludCAgICAgICAgICAgcG9zaXRpb247CisgIGdpbnQgICAgICAgICAgIGVuZF9wb3NpdGlvbjsKKyAgR3N0TWFzayAgICAgICAqbWFzazsKK307CisKK3N0cnVjdCBfR3N0U01QVEVDbGFzcyB7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3Rfc21wdGVfZ2V0X3R5cGUgKHZvaWQpOworZ2Jvb2xlYW4gZ3N0X3NtcHRlX3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1NNUFRFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3NtcHRlL2dzdHNtcHRlYWxwaGEuYyBiL2dzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwNzQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zbXB0ZS9nc3RzbXB0ZWFscGhhLmMKQEAgLTAsMCArMSw4MTEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOD4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1zbXB0ZWFscGhhCisgKgorICogc21wdGVhbHBoYSBjYW4gYWNjZXB0IGFuIEk0MjAgb3IgQVlVViB2aWRlbyBzdHJlYW0uIEFuIGFscGhhIGNoYW5uZWwgaXMgYWRkZWQKKyAqIHVzaW5nIGFuIGVmZmVjdCBzcGVjaWZpYyBTTVBURSBtYXNrIGluIHRoZSBJNDIwIGlucHV0IGNhc2UuIEluIHRoZSBBWVVWIGNhc2UsCisgKiB0aGUgYWxwaGEgY2hhbm5lbCBpcyBtb2RpZmllZCB1c2luZyB0aGUgZWZmZWN0IHNwZWNpZmljIFNNUFRFIG1hc2suCisgKgorICogVGhlICNHc3RTbXB0ZUFscGhhOnBvc2l0aW9uIHByb3BlcnR5IGlzIGEgY29udHJvbGxhYmUgZG91YmxlIGJldHdlZW4gMC4wIGFuZAorICogMS4wIHRoYXQgc3BlY2lmaWVzIHRoZSBwb3NpdGlvbiBpbiB0aGUgdHJhbnNpdGlvbi4gMC4wIGlzIHRoZSBzdGFydCBvZiB0aGUKKyAqIHRyYW5zaXRpb24gd2l0aCB0aGUgYWxwaGEgY2hhbm5lbCB0byBjb21wbGV0ZSBvcGFxdWUgd2hlcmUgMS4wIGhhcyB0aGUgYWxwaGEKKyAqIGNoYW5uZWwgc2V0IHRvIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQuCisgKgorICogVGhlICNHc3RTbXB0ZUFscGhhOmRlcHRoIHByb3BlcnR5IGRlZmluZXMgdGhlIHByZWNpc2lvbiBpbiBiaXRzIG9mIHRoZSBtYXNrLgorICogQSBoaWdoZXIgcHJlc2lzaW9uIHdpbGwgY3JlYXRlIGEgbWFzayB3aXRoIHNtb290aGVyIGdyYWRpZW50cyBpbiBvcmRlciB0bworICogYXZvaWQgYmFuZGluZy4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+U2FtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiA8cGFyYT4KKyAqIEhlcmUgaXMgYSBwaXBlbGluZSB0byBkZW1vbnN0cmF0ZSB0aGUgc21wdGUgdHJhbnNpdGlvbiA6CisgKiA8cHJvZ3JhbWxpc3Rpbmc+CisgKiBnc3QtbGF1bmNoLTEuMCAtdiB2aWRlb3Rlc3RzcmMgISBzbXB0ZWFscGhhIGJvcmRlcj0yMDAwMCB0eXBlPTQ0CisgKiBwb3NpdGlvbj0wLjUgISB2aWRlb21peGVyICEgdmlkZW9jb252ZXJ0ICEgeGltYWdlc2luaworICogPC9wcm9ncmFtbGlzdGluZz4KKyAqIFRoaXMgc2hvd3MgYSBtaWR3YXkgYm93dGllLWggdHJhbnNpdGlvbiBhIGZyb20gYSB2aWRlb3Rlc3RzcmMgdG8gYQorICogdHJhbnNwYXJlbnQgaW1hZ2UuIFRoZSBlZGdlcyBvZiB0aGUgdHJhbnNpdGlvbiBhcmUgc21vb3RoZWQgd2l0aCBhCisgKiAyMDAwMCBiaWcgYm9yZGVyLgorICogPC9wYXJhPgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3RzbXB0ZWFscGhhLmgiCisjaW5jbHVkZSAicGFpbnQuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3NtcHRlX2FscGhhX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF9zbXB0ZV9hbHBoYV9kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3NtcHRlX2FscGhhX3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkFZVVYiKSAiOyIKKyAgICAgICAgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkFSR0IiKSAiOyIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkJHUkEiKSAiOyIKKyAgICAgICAgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIlJHQkEiKSAiOyIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkFSR0IiKSkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X3NtcHRlX2FscGhhX3NpbmtfdGVtcGxhdGUgPQorICAgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkk0MjAiKSAiOyIKKyAgICAgICAgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIllWMTIiKQorICAgICAgICAiOyIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkFZVVYiKQorICAgICAgICAiOyIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkFSR0IiKSAiOyIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkJHUkEiKQorICAgICAgICAiOyIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIlJHQkEiKSAiOyIgR1NUX1ZJREVPX0NBUFNfTUFLRSAoIkFSR0IiKSkKKyAgICApOworCisvKiBTTVBURSBzaWduYWxzIGFuZCBwcm9wZXJ0aWVzICovCisKKyNkZWZpbmUgREVGQVVMVF9QUk9QX1RZUEUJMQorI2RlZmluZSBERUZBVUxUX1BST1BfQk9SREVSCTAKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0RFUFRICTE2CisjZGVmaW5lIERFRkFVTFRfUFJPUF9QT1NJVElPTgkwLjAKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0lOVkVSVCAgIEZBTFNFCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX1RZUEUsCisgIFBST1BfQk9SREVSLAorICBQUk9QX0RFUFRILAorICBQUk9QX1BPU0lUSU9OLAorICBQUk9QX0lOVkVSVAorfTsKKworI2RlZmluZSBBWVVWX1NJWkUodyxoKSAgICAgKCh3KSAqIChoKSAqIDQpCisKKyNkZWZpbmUgR1NUX1RZUEVfU01QVEVfVFJBTlNJVElPTl9UWVBFIChnc3Rfc21wdGVfYWxwaGFfdHJhbnNpdGlvbl90eXBlX2dldF90eXBlKCkpCitzdGF0aWMgR1R5cGUKK2dzdF9zbXB0ZV9hbHBoYV90cmFuc2l0aW9uX3R5cGVfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBzbXB0ZV90cmFuc2l0aW9uX3R5cGUgPSAwOworICBHRW51bVZhbHVlICpzbXB0ZV90cmFuc2l0aW9uczsKKworICBpZiAoIXNtcHRlX3RyYW5zaXRpb25fdHlwZSkgeworICAgIGNvbnN0IEdMaXN0ICpkZWZpbml0aW9uczsKKyAgICBnaW50IGkgPSAwOworCisgICAgZGVmaW5pdGlvbnMgPSBnc3RfbWFza19nZXRfZGVmaW5pdGlvbnMgKCk7CisgICAgc21wdGVfdHJhbnNpdGlvbnMgPQorICAgICAgICBnX25ldzAgKEdFbnVtVmFsdWUsIGdfbGlzdF9sZW5ndGggKChHTGlzdCAqKSBkZWZpbml0aW9ucykgKyAxKTsKKworICAgIHdoaWxlIChkZWZpbml0aW9ucykgeworICAgICAgR3N0TWFza0RlZmluaXRpb24gKmRlZmluaXRpb24gPSAoR3N0TWFza0RlZmluaXRpb24gKikgZGVmaW5pdGlvbnMtPmRhdGE7CisKKyAgICAgIGRlZmluaXRpb25zID0gZ19saXN0X25leHQgKGRlZmluaXRpb25zKTsKKworICAgICAgc21wdGVfdHJhbnNpdGlvbnNbaV0udmFsdWUgPSBkZWZpbml0aW9uLT50eXBlOworICAgICAgLyogb2xkZXIgR0xpYiB2ZXJzaW9ucyBoYXZlIHRoZSB0d28gZmllbGRzIGFzIG5vbi1jb25zdCwgaGVuY2UgdGhlIGNhc3QgKi8KKyAgICAgIHNtcHRlX3RyYW5zaXRpb25zW2ldLnZhbHVlX25pY2sgPSAoZ2NoYXIgKikgZGVmaW5pdGlvbi0+c2hvcnRfbmFtZTsKKyAgICAgIHNtcHRlX3RyYW5zaXRpb25zW2ldLnZhbHVlX25hbWUgPSAoZ2NoYXIgKikgZGVmaW5pdGlvbi0+bG9uZ19uYW1lOworCisgICAgICBpKys7CisgICAgfQorCisgICAgc21wdGVfdHJhbnNpdGlvbl90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFNNUFRFQWxwaGFUcmFuc2l0aW9uVHlwZSIsCisgICAgICAgIHNtcHRlX3RyYW5zaXRpb25zKTsKKyAgfQorICByZXR1cm4gc21wdGVfdHJhbnNpdGlvbl90eXBlOworfQorCisKK3N0YXRpYyB2b2lkIGdzdF9zbXB0ZV9hbHBoYV9maW5hbGl6ZSAoR3N0U01QVEVBbHBoYSAqIHNtcHRlKTsKKworc3RhdGljIHZvaWQgZ3N0X3NtcHRlX2FscGhhX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9zbXB0ZV9hbHBoYV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc21wdGVfYWxwaGFfc2V0X2luZm8gKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwKKyAgICBHc3RDYXBzICogaW5jYXBzLCBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLAorICAgIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3Rfc21wdGVfYWxwaGFfdHJhbnNmb3JtX2ZyYW1lIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsCisgICAgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLCBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lKTsKK3N0YXRpYyB2b2lkIGdzdF9zbXB0ZV9hbHBoYV9iZWZvcmVfdHJhbnNmb3JtIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBHc3RDYXBzICpnc3Rfc21wdGVfYWxwaGFfdHJhbnNmb3JtX2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RDYXBzICogZnJvbSwgR3N0Q2FwcyAqIGZpbHRlcik7CisKKyNkZWZpbmUgZ3N0X3NtcHRlX2FscGhhX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFNNUFRFQWxwaGEsIGdzdF9zbXB0ZV9hbHBoYSwgR1NUX1RZUEVfVklERU9fRklMVEVSKTsKKworc3RhdGljIHZvaWQKK2dzdF9zbXB0ZV9hbHBoYV9jbGFzc19pbml0IChHc3RTTVBURUFscGhhQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSAoa2xhc3MpOworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKnRyYW5zX2NsYXNzID0gKEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqKSBrbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzcyA9IChHc3RWaWRlb0ZpbHRlckNsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9zbXB0ZV9hbHBoYV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9zbXB0ZV9hbHBoYV9nZXRfcHJvcGVydHk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAoR09iamVjdEZpbmFsaXplRnVuYykgZ3N0X3NtcHRlX2FscGhhX2ZpbmFsaXplOworCisgIF9nc3RfbWFza19pbml0ICgpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfVFlQRSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgidHlwZSIsICJUeXBlIiwgIlRoZSB0eXBlIG9mIHRyYW5zaXRpb24gdG8gdXNlIiwKKyAgICAgICAgICBHU1RfVFlQRV9TTVBURV9UUkFOU0lUSU9OX1RZUEUsIERFRkFVTFRfUFJPUF9UWVBFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0JPUkRFUiwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJib3JkZXIiLCAiQm9yZGVyIiwKKyAgICAgICAgICAiVGhlIGJvcmRlciB3aWR0aCBvZiB0aGUgdHJhbnNpdGlvbiIsIDAsIEdfTUFYSU5ULAorICAgICAgICAgIERFRkFVTFRfUFJPUF9CT1JERVIsCisgICAgICAgICAgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0RFUFRILAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImRlcHRoIiwgIkRlcHRoIiwgIkRlcHRoIG9mIHRoZSBtYXNrIGluIGJpdHMiLCAxLCAyNCwKKyAgICAgICAgICBERUZBVUxUX1BST1BfREVQVEgsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1BPU0lUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoInBvc2l0aW9uIiwgIlBvc2l0aW9uIiwKKyAgICAgICAgICAiUG9zaXRpb24gb2YgdGhlIHRyYW5zaXRpb24gZWZmZWN0IiwgMC4wLCAxLjAsIERFRkFVTFRfUFJPUF9QT1NJVElPTiwKKyAgICAgICAgICBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RTTVBURUFscGhhOmludmVydDoKKyAgICoKKyAgICogU2V0IHRvIFRSVUUgdG8gaW52ZXJ0IHRoZSB0cmFuc2l0aW9uIG1hc2sgKGllLiBmbGlwIGl0IGhvcml6b250YWxseSkuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0lOVkVSVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiaW52ZXJ0IiwgIkludmVydCIsCisgICAgICAgICAgIkludmVydCB0cmFuc2l0aW9uIG1hc2siLCBERUZBVUxUX1BST1BfUE9TSVRJT04sCisgICAgICAgICAgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIHRyYW5zX2NsYXNzLT5iZWZvcmVfdHJhbnNmb3JtID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc21wdGVfYWxwaGFfYmVmb3JlX3RyYW5zZm9ybSk7CisgIHRyYW5zX2NsYXNzLT50cmFuc2Zvcm1fY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NtcHRlX2FscGhhX3RyYW5zZm9ybV9jYXBzKTsKKworICB2ZmlsdGVyX2NsYXNzLT5zZXRfaW5mbyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc21wdGVfYWxwaGFfc2V0X2luZm8pOworICB2ZmlsdGVyX2NsYXNzLT50cmFuc2Zvcm1fZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9zbXB0ZV9hbHBoYV90cmFuc2Zvcm1fZnJhbWUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9zbXB0ZV9hbHBoYV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3NtcHRlX2FscGhhX3NyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJTTVBURSB0cmFuc2l0aW9ucyIsCisgICAgICAiRmlsdGVyL0VkaXRvci9WaWRlbyIsCisgICAgICAiQXBwbHkgdGhlIHN0YW5kYXJkIFNNUFRFIHRyYW5zaXRpb25zIGFzIGFscGhhIG9uIHZpZGVvIGltYWdlcyIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc21wdGVfYWxwaGFfdXBkYXRlX21hc2sgKEdzdFNNUFRFQWxwaGEgKiBzbXB0ZSwgZ2ludCB0eXBlLAorICAgIGdib29sZWFuIGludmVydCwgZ2ludCBkZXB0aCwgZ2ludCB3aWR0aCwgZ2ludCBoZWlnaHQpCit7CisgIEdzdE1hc2sgKm5ld21hc2s7CisKKyAgLyogdHJ5IHRvIGF2b2lkIHJlZ2VuZXJhdGluZyB0aGUgbWFzayBpZiB3ZSBhbHJlYWR5IGhhdmUgb25lIHRoYXQgaXMKKyAgICogY29ycmVjdCAqLworICBpZiAoc21wdGUtPm1hc2spIHsKKyAgICBpZiAoc21wdGUtPnR5cGUgPT0gdHlwZSAmJgorICAgICAgICBzbXB0ZS0+aW52ZXJ0ID09IGludmVydCAmJgorICAgICAgICBzbXB0ZS0+ZGVwdGggPT0gZGVwdGggJiYKKyAgICAgICAgc21wdGUtPndpZHRoID09IHdpZHRoICYmIHNtcHRlLT5oZWlnaHQgPT0gaGVpZ2h0KQorICAgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBzbXB0ZS0+dHlwZSA9IHR5cGU7CisgIHNtcHRlLT5pbnZlcnQgPSBpbnZlcnQ7CisgIHNtcHRlLT5kZXB0aCA9IGRlcHRoOworICBzbXB0ZS0+d2lkdGggPSB3aWR0aDsKKyAgc21wdGUtPmhlaWdodCA9IGhlaWdodDsKKworICAvKiBOb3QgbmVnb3RpYXRlZCB5ZXQgKi8KKyAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIG5ld21hc2sgPSBnc3RfbWFza19mYWN0b3J5X25ldyAodHlwZSwgaW52ZXJ0LCBkZXB0aCwgd2lkdGgsIGhlaWdodCk7CisgIGlmICghbmV3bWFzaykKKyAgICBnb3RvIG1hc2tfZmFpbGVkOworCisgIGlmIChzbXB0ZS0+bWFzaykKKyAgICBnc3RfbWFza19kZXN0cm95IChzbXB0ZS0+bWFzayk7CisKKyAgc21wdGUtPm1hc2sgPSBuZXdtYXNrOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworbWFza19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzbXB0ZSwgImZhaWxlZCB0byBjcmVhdGUgYSBtYXNrIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc21wdGVfYWxwaGFfaW5pdCAoR3N0U01QVEVBbHBoYSAqIHNtcHRlKQoreworICBzbXB0ZS0+dHlwZSA9IERFRkFVTFRfUFJPUF9UWVBFOworICBzbXB0ZS0+Ym9yZGVyID0gREVGQVVMVF9QUk9QX0JPUkRFUjsKKyAgc21wdGUtPmRlcHRoID0gREVGQVVMVF9QUk9QX0RFUFRIOworICBzbXB0ZS0+cG9zaXRpb24gPSBERUZBVUxUX1BST1BfUE9TSVRJT047CisgIHNtcHRlLT5pbnZlcnQgPSBERUZBVUxUX1BST1BfSU5WRVJUOworfQorCisjZGVmaW5lIENSRUFURV9BUkdCX0ZVTkMobmFtZSwgQSwgUiwgRywgQikgXAorc3RhdGljIHZvaWQgXAorZ3N0X3NtcHRlX2FscGhhX3Byb2Nlc3NfIyNuYW1lIyNfIyNuYW1lIChHc3RTTVBURUFscGhhICogc21wdGUsIFwKKyAgICBjb25zdCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUsIEdzdE1hc2sgKiBtYXNrLCBcCisgICAgZ2ludCBib3JkZXIsIGdpbnQgcG9zKSBcCit7IFwKKyAgZ2ludCBpLCBqOyBcCisgIGNvbnN0IGd1aW50MzIgKm1hc2twOyBcCisgIGdpbnQgdmFsdWU7IFwKKyAgZ2ludCBtaW4sIG1heDsgXAorICBnaW50IHdpZHRoLCBoZWlnaHQ7IFwKKyAgZ3VpbnQ4ICppbiwgKm91dDsgXAorICBnaW50IHNyY193cmFwLCBkZXN0X3dyYXA7IFwKKyAgXAorICBpZiAoYm9yZGVyID09IDApIFwKKyAgICBib3JkZXIrKzsgXAorICBcCisgIG1pbiA9IHBvcyAtIGJvcmRlcjsgXAorICBtYXggPSBwb3M7IFwKKyAgR1NUX0RFQlVHX09CSkVDVCAoc21wdGUsICJwb3MgJWQsIG1pbiAlZCwgbWF4ICVkLCBib3JkZXIgJWQiLCBwb3MsIG1pbiwgbWF4LCBcCisgICAgICBib3JkZXIpOyBcCisgIFwKKyAgbWFza3AgPSBtYXNrLT5kYXRhOyBcCisgIFwKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKG91dF9mcmFtZSk7IFwKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAob3V0X2ZyYW1lKTsgXAorICBcCisgIGluID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAwKTsgXAorICBvdXQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKTsgXAorICBzcmNfd3JhcCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGluX2ZyYW1lLCAwKSAtICh3aWR0aCA8PCAyKTsgXAorICBkZXN0X3dyYXAgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRfZnJhbWUsIDApIC0gKHdpZHRoIDw8IDIpOyBcCisgIFwKKyAgLyogd2UgYmFzaWNhbGx5IGNvcHkgdGhlIHNvdXJjZSB0byBkZXN0IGJ1dCB3ZSBzY2FsZSB0aGUgYWxwaGEgY2hhbm5lbCB3aXRoIFwKKyAgICogdGhlIG1hc2sgKi8gXAorICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsgXAorICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7IFwKKyAgICAgIHZhbHVlID0gKm1hc2twKys7IFwKKyAgICAgIG91dFtBXSA9IChpbltBXSAqICgoQ0xBTVAgKHZhbHVlLCBtaW4sIG1heCkgLSBtaW4pIDw8IDgpIC8gYm9yZGVyKSA+PiA4OyBcCisgICAgICBvdXRbUl0gPSBpbltSXTsgXAorICAgICAgb3V0W0ddID0gaW5bR107IFwKKyAgICAgIG91dFtCXSA9IGluW0JdOyBcCisgICAgICBvdXQgKz0gNDsgXAorICAgICAgaW4gKz0gNDsgXAorICAgIH0gXAorICAgIGluICs9IHNyY193cmFwOyBcCisgICAgb3V0ICs9IGRlc3Rfd3JhcDsgXAorICB9IFwKK30KKworQ1JFQVRFX0FSR0JfRlVOQyAoYXJnYiwgMCwgMSwgMiwgMyk7CitDUkVBVEVfQVJHQl9GVU5DIChiZ3JhLCAzLCAyLCAxLCAwKTsKK0NSRUFURV9BUkdCX0ZVTkMgKGFiZ3IsIDAsIDMsIDIsIDEpOworQ1JFQVRFX0FSR0JfRlVOQyAocmdiYSwgMywgMCwgMSwgMik7CisKK3N0YXRpYyB2b2lkCitnc3Rfc21wdGVfYWxwaGFfcHJvY2Vzc19heXV2X2F5dXYgKEdzdFNNUFRFQWxwaGEgKiBzbXB0ZSwKKyAgICBjb25zdCBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUsIEdzdE1hc2sgKiBtYXNrLAorICAgIGdpbnQgYm9yZGVyLCBnaW50IHBvcykKK3sKKyAgZ2ludCBpLCBqOworICBjb25zdCBndWludDMyICptYXNrcDsKKyAgZ2ludCB2YWx1ZTsKKyAgZ2ludCBtaW4sIG1heDsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBndWludDggKmluLCAqb3V0OworICBnaW50IHNyY193cmFwLCBkZXN0X3dyYXA7CisKKyAgaWYgKGJvcmRlciA9PSAwKQorICAgIGJvcmRlcisrOworCisgIG1pbiA9IHBvcyAtIGJvcmRlcjsKKyAgbWF4ID0gcG9zOworICBHU1RfREVCVUdfT0JKRUNUIChzbXB0ZSwgInBvcyAlZCwgbWluICVkLCBtYXggJWQsIGJvcmRlciAlZCIsIHBvcywgbWluLCBtYXgsCisgICAgICBib3JkZXIpOworCisgIG1hc2twID0gbWFzay0+ZGF0YTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAob3V0X2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAob3V0X2ZyYW1lKTsKKworICBpbiA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIG91dCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworICBzcmNfd3JhcCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGluX2ZyYW1lLCAwKSAtICh3aWR0aCA8PCAyKTsKKyAgZGVzdF93cmFwID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAob3V0X2ZyYW1lLCAwKSAtICh3aWR0aCA8PCAyKTsKKworICAvKiB3ZSBiYXNpY2FsbHkgY29weSB0aGUgc291cmNlIHRvIGRlc3QgYnV0IHdlIHNjYWxlIHRoZSBhbHBoYSBjaGFubmVsIHdpdGgKKyAgICogdGhlIG1hc2sgKi8KKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgIHZhbHVlID0gKm1hc2twKys7CisgICAgICAqb3V0KysgPSAoKmluKysgKiAoKENMQU1QICh2YWx1ZSwgbWluLCBtYXgpIC0gbWluKSA8PCA4KSAvIGJvcmRlcikgPj4gODsKKyAgICAgICpvdXQrKyA9ICppbisrOworICAgICAgKm91dCsrID0gKmluKys7CisgICAgICAqb3V0KysgPSAqaW4rKzsKKyAgICB9CisgICAgaW4gKz0gc3JjX3dyYXA7CisgICAgb3V0ICs9IGRlc3Rfd3JhcDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3NtcHRlX2FscGhhX3Byb2Nlc3NfaTQyMF9heXV2IChHc3RTTVBURUFscGhhICogc21wdGUsCisgICAgY29uc3QgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLCBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lLCBHc3RNYXNrICogbWFzaywKKyAgICBnaW50IGJvcmRlciwgZ2ludCBwb3MpCit7CisgIGNvbnN0IGd1aW50OCAqc3JjWTsKKyAgY29uc3QgZ3VpbnQ4ICpzcmNVOworICBjb25zdCBndWludDggKnNyY1Y7CisgIGd1aW50OCAqb3V0OworICBnaW50IGksIGo7CisgIGdpbnQgc3JjX3dyYXAsIHNyY191X3dyYXAsIHNyY192X3dyYXAsIGRlc3Rfd3JhcDsKKyAgZ2ludCB5X3N0cmlkZSwgdV9zdHJpZGUsIHZfc3RyaWRlOworICBnYm9vbGVhbiBvZGRfd2lkdGg7CisgIGNvbnN0IGd1aW50MzIgKm1hc2twOworICBnaW50IHZhbHVlOworICBnaW50IG1pbiwgbWF4OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgaWYgKGJvcmRlciA9PSAwKQorICAgIGJvcmRlcisrOworCisgIG1pbiA9IHBvcyAtIGJvcmRlcjsKKyAgbWF4ID0gcG9zOworICBHU1RfREVCVUdfT0JKRUNUIChzbXB0ZSwgInBvcyAlZCwgbWluICVkLCBtYXggJWQsIGJvcmRlciAlZCIsIHBvcywgbWluLCBtYXgsCisgICAgICBib3JkZXIpOworCisgIG1hc2twID0gbWFzay0+ZGF0YTsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAob3V0X2ZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAob3V0X2ZyYW1lKTsKKworICB5X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoaW5fZnJhbWUsIDApOworICB1X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoaW5fZnJhbWUsIDEpOworICB2X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoaW5fZnJhbWUsIDIpOworCisgIHNyY193cmFwID0geV9zdHJpZGUgLSB3aWR0aDsKKyAgc3JjX3Vfd3JhcCA9IHVfc3RyaWRlIC0gKHdpZHRoIC8gMik7CisgIHNyY192X3dyYXAgPSB2X3N0cmlkZSAtICh3aWR0aCAvIDIpOworCisgIHNyY1kgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChpbl9mcmFtZSwgMCk7CisgIHNyY1UgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChpbl9mcmFtZSwgMSk7CisgIHNyY1YgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChpbl9mcmFtZSwgMik7CisKKyAgb3V0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisgIGRlc3Rfd3JhcCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dF9mcmFtZSwgMCkgLSAod2lkdGggPDwgMik7CisKKyAgb2RkX3dpZHRoID0gKHdpZHRoICUgMiAhPSAwKTsKKworICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGggLyAyOyBqKyspIHsKKyAgICAgIHZhbHVlID0gKm1hc2twKys7CisgICAgICAqb3V0KysgPSAoMHhmZiAqICgoQ0xBTVAgKHZhbHVlLCBtaW4sIG1heCkgLSBtaW4pIDw8IDgpIC8gYm9yZGVyKSA+PiA4OworICAgICAgKm91dCsrID0gKnNyY1krKzsKKyAgICAgICpvdXQrKyA9ICpzcmNVOworICAgICAgKm91dCsrID0gKnNyY1Y7CisgICAgICB2YWx1ZSA9ICptYXNrcCsrOworICAgICAgKm91dCsrID0gKDB4ZmYgKiAoKENMQU1QICh2YWx1ZSwgbWluLCBtYXgpIC0gbWluKSA8PCA4KSAvIGJvcmRlcikgPj4gODsKKyAgICAgICpvdXQrKyA9ICpzcmNZKys7CisgICAgICAqb3V0KysgPSAqc3JjVSsrOworICAgICAgKm91dCsrID0gKnNyY1YrKzsKKyAgICB9CisgICAgLyogTWlnaHQgaGF2ZSBvbmUgb2RkIGNvbHVtbiBsZWZ0IHRvIGRvICovCisgICAgaWYgKG9kZF93aWR0aCkgeworICAgICAgdmFsdWUgPSAqbWFza3ArKzsKKyAgICAgICpvdXQrKyA9ICgweGZmICogKChDTEFNUCAodmFsdWUsIG1pbiwgbWF4KSAtIG1pbikgPDwgOCkgLyBib3JkZXIpID4+IDg7CisgICAgICAqb3V0KysgPSAqc3JjWSsrOworICAgICAgKm91dCsrID0gKnNyY1U7CisgICAgICAqb3V0KysgPSAqc3JjVjsKKyAgICB9CisgICAgaWYgKGkgJSAyID09IDApIHsKKyAgICAgIHNyY1UgLT0gd2lkdGggLyAyOworICAgICAgc3JjViAtPSB3aWR0aCAvIDI7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY1UgKz0gc3JjX3Vfd3JhcDsKKyAgICAgIHNyY1YgKz0gc3JjX3Zfd3JhcDsKKyAgICB9CisgICAgc3JjWSArPSBzcmNfd3JhcDsKKyAgICBvdXQgKz0gZGVzdF93cmFwOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc21wdGVfYWxwaGFfYmVmb3JlX3RyYW5zZm9ybSAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFNNUFRFQWxwaGEgKnNtcHRlID0gR1NUX1NNUFRFX0FMUEhBICh0cmFucyk7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIHN0cmVhbV90aW1lOworCisgIC8qIGZpcnN0IHN5bmMgdGhlIGNvbnRyb2xsZXIgdG8gdGhlIGN1cnJlbnQgc3RyZWFtX3RpbWUgb2YgdGhlIGJ1ZmZlciAqLworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKyAgc3RyZWFtX3RpbWUgPQorICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZ0cmFucy0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLCB0aW1lc3RhbXApOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNtcHRlLCAic3luYyB0byAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHN0cmVhbV90aW1lKSkKKyAgICBnc3Rfb2JqZWN0X3N5bmNfdmFsdWVzIChHU1RfT0JKRUNUIChzbXB0ZSksIHN0cmVhbV90aW1lKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9zbXB0ZV9hbHBoYV90cmFuc2Zvcm1fZnJhbWUgKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwKKyAgICBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUpCit7CisgIEdzdFNNUFRFQWxwaGEgKnNtcHRlID0gR1NUX1NNUFRFX0FMUEhBICh2ZmlsdGVyKTsKKyAgZ2RvdWJsZSBwb3NpdGlvbjsKKyAgZ2ludCBib3JkZXI7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFzbXB0ZS0+cHJvY2VzcykpCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHNtcHRlKTsKKyAgcG9zaXRpb24gPSBzbXB0ZS0+cG9zaXRpb247CisgIGJvcmRlciA9IHNtcHRlLT5ib3JkZXI7CisKKyAgLyogcnVuIHRoZSB0eXBlIHNwZWNpZmljIGZpbHRlciBjb2RlICovCisgIHNtcHRlLT5wcm9jZXNzIChzbXB0ZSwgaW5fZnJhbWUsIG91dF9mcmFtZSwKKyAgICAgIHNtcHRlLT5tYXNrLCBib3JkZXIsICgoMSA8PCBzbXB0ZS0+ZGVwdGgpICsgYm9yZGVyKSAqIHBvc2l0aW9uKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNtcHRlKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCitub3RfbmVnb3RpYXRlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzbXB0ZSwgQ09SRSwgTkVHT1RJQVRJT04sIChOVUxMKSwKKyAgICAgICAgKCJObyBpbnB1dCBmb3JtYXQgbmVnb3RpYXRlZCIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3NtcHRlX2FscGhhX3RyYW5zZm9ybV9jYXBzIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwgR3N0Q2FwcyAqIGZyb20sIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnJlc3VsdCwgKnRtcF9jYXBzLCAqdG1wbF9jYXBzID0gTlVMTDsKKyAgZ2ludCBpLCBqOworCisgIHRtcF9jYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAoZnJvbSk7IGkrKykgeworICAgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICAgIGNvbnN0IEdWYWx1ZSAqdmFsLCAqbHZhbDsKKyAgICBHVmFsdWUgbGlzdCA9IHsgMCwgfTsKKyAgICBHVmFsdWUgYXZhbCA9IHsgMCwgfTsKKyAgICBjb25zdCBnY2hhciAqc3RyOworCisgICAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChmcm9tLCBpKSk7CisgICAgLyogd2UgY2FuIHRyYW5zZm9ybSBJNDIwIHRvIEFZVVYsCisgICAgICogc28gbmVlZCB0byBsb2NhdGUgYW5kIHN1YnN0aXR1dGUgQVlVViBmb3IgdGhlIGJvdGggb2YgdGhlbSAqLworICAgIHZhbCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJmb3JtYXQiKTsKKyAgICBpZiAodmFsICYmIEdTVF9WQUxVRV9IT0xEU19MSVNUICh2YWwpKSB7CisgICAgICBnYm9vbGVhbiBzZWVuX2F5dXYgPSBGQUxTRSwgc2Vlbl9pNDIwID0gRkFMU0U7CisKKyAgICAgIGdfdmFsdWVfaW5pdCAoJmxpc3QsIEdTVF9UWVBFX0xJU1QpOworICAgICAgZm9yIChqID0gMDsgaiA8IGdzdF92YWx1ZV9saXN0X2dldF9zaXplICh2YWwpOyBqKyspIHsKKyAgICAgICAgbHZhbCA9IGdzdF92YWx1ZV9saXN0X2dldF92YWx1ZSAodmFsLCBqKTsKKyAgICAgICAgaWYgKChzdHIgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKGx2YWwpKSkgeworICAgICAgICAgIGlmIChzdHJjbXAgKHN0ciwgIkFZVVYiKSA9PSAwKSB7CisgICAgICAgICAgICBzZWVuX2F5dXYgPSBUUlVFOworICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wIChzdHIsICJJNDIwIikgPT0gMCkgeworICAgICAgICAgICAgc2Vlbl9pNDIwID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzZWVuX2F5dXYgJiYgIXNlZW5faTQyMCkgeworICAgICAgICBzdHIgPSAiSTQyMCI7CisgICAgICB9IGVsc2UgaWYgKHNlZW5faTQyMCAmJiAhc2Vlbl9heXV2KSB7CisgICAgICAgIHN0ciA9ICJBWVVWIjsKKyAgICAgIH0gZWxzZQorICAgICAgICBzdHIgPSBOVUxMOworICAgICAgaWYgKHN0cikgeworICAgICAgICBnX3ZhbHVlX2NvcHkgKHZhbCwgJmxpc3QpOworICAgICAgICBnX3ZhbHVlX2luaXQgKCZhdmFsLCBHX1RZUEVfU1RSSU5HKTsKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmYXZhbCwgc3RyKTsKKyAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJmF2YWwpOworICAgICAgICBnX3ZhbHVlX3Jlc2V0ICgmYXZhbCk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJmb3JtYXQiLCAmbGlzdCk7CisgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZsaXN0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHZhbCAmJiBHX1ZBTFVFX0hPTERTX1NUUklORyAodmFsKSkgeworICAgICAgaWYgKChzdHIgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbCkpICYmCisgICAgICAgICAgKChzdHJjbXAgKHN0ciwgIkFZVVYiKSA9PSAwKSB8fCAoc3RyY21wIChzdHIsICJJNDIwIikgPT0gMCkpKSB7CisgICAgICAgIGdfdmFsdWVfaW5pdCAoJmxpc3QsIEdTVF9UWVBFX0xJU1QpOworICAgICAgICBnX3ZhbHVlX2luaXQgKCZhdmFsLCBHX1RZUEVfU1RSSU5HKTsKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmYXZhbCwgIkFZVVYiKTsKKyAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJmF2YWwpOworICAgICAgICBnX3ZhbHVlX3Jlc2V0ICgmYXZhbCk7CisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJmF2YWwsICJJNDIwIik7CisgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJmxpc3QsICZhdmFsKTsKKyAgICAgICAgZ192YWx1ZV9yZXNldCAoJmF2YWwpOworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAoc3RydWN0dXJlLCAiZm9ybWF0IiwgJmxpc3QpOworICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmbGlzdCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzdHJ1Y3R1cmUsICJmb3JtYXQiKTsKKyAgICB9CisKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAoc3RydWN0dXJlLCAiY29sb3JpbWV0cnkiKTsKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAoc3RydWN0dXJlLCAiY2hyb21hLXNpdGUiKTsKKworICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKHRtcF9jYXBzLCBzdHJ1Y3R1cmUpOworICB9CisKKyAgLyogR2V0IHRoZSBhcHByb3ByaWF0ZSB0ZW1wbGF0ZSAqLworICBpZiAoZGlyZWN0aW9uID09IEdTVF9QQURfU0lOSykgeworICAgIHRtcGxfY2FwcyA9CisgICAgICAgIGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldF9jYXBzICgmZ3N0X3NtcHRlX2FscGhhX3NyY190ZW1wbGF0ZSk7CisgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IEdTVF9QQURfU1JDKSB7CisgICAgdG1wbF9jYXBzID0KKyAgICAgICAgZ3N0X3N0YXRpY19wYWRfdGVtcGxhdGVfZ2V0X2NhcHMgKCZnc3Rfc21wdGVfYWxwaGFfc2lua190ZW1wbGF0ZSk7CisgIH0gZWxzZSB7CisgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgIH0KKworICAvKiBJbnRlcnNlY3Qgd2l0aCBvdXIgdGVtcGxhdGUgY2FwcyAqLworICByZXN1bHQgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHRtcF9jYXBzLCB0bXBsX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAodG1wbF9jYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHRtcF9jYXBzKTsKKworICByZXN1bHQgPSBnc3RfY2Fwc19zaW1wbGlmeSAocmVzdWx0KTsKKworICBHU1RfTE9HX09CSkVDVCAodHJhbnMsICJ0cmFuc2Zvcm1lZCAlIiBHU1RfUFRSX0ZPUk1BVCAiIHRvICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgZnJvbSwgcmVzdWx0KTsKKworICBpZiAoZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAodHJhbnMsICJVc2luZyBmaWx0ZXIgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgZmlsdGVyKTsKKyAgICBpbnRlcnNlY3Rpb24gPQorICAgICAgICBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCByZXN1bHQsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHJlc3VsdCk7CisgICAgcmVzdWx0ID0gaW50ZXJzZWN0aW9uOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHRyYW5zLCAiSW50ZXJzZWN0aW9uICUiIEdTVF9QVFJfRk9STUFULCByZXN1bHQpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc21wdGVfYWxwaGFfc2V0X2luZm8gKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwgR3N0Q2FwcyAqIGluY2FwcywKKyAgICBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLCBHc3RDYXBzICogb3V0Y2FwcywgR3N0VmlkZW9JbmZvICogb3V0X2luZm8pCit7CisgIEdzdFNNUFRFQWxwaGEgKnNtcHRlID0gR1NUX1NNUFRFX0FMUEhBICh2ZmlsdGVyKTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIHNtcHRlLT5wcm9jZXNzID0gTlVMTDsKKyAgc21wdGUtPmluX2Zvcm1hdCA9IEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoaW5faW5mbyk7CisgIHNtcHRlLT5vdXRfZm9ybWF0ID0gR1NUX1ZJREVPX0lORk9fRk9STUFUIChvdXRfaW5mbyk7CisKKyAgLyogdHJ5IHRvIHVwZGF0ZSB0aGUgbWFzayBub3csIHRoaXMgd2lsbCBhbHNvIGFkanVzdCB0aGUgd2lkdGgvaGVpZ2h0IG9uCisgICAqIHN1Y2Nlc3MgKi8KKyAgR1NUX09CSkVDVF9MT0NLIChzbXB0ZSk7CisgIHJldCA9CisgICAgICBnc3Rfc21wdGVfYWxwaGFfdXBkYXRlX21hc2sgKHNtcHRlLCBzbXB0ZS0+dHlwZSwgc21wdGUtPmludmVydCwKKyAgICAgIHNtcHRlLT5kZXB0aCwgR1NUX1ZJREVPX0lORk9fV0lEVEggKG91dF9pbmZvKSwKKyAgICAgIEdTVF9WSURFT19JTkZPX0hFSUdIVCAob3V0X2luZm8pKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNtcHRlKTsKKworICBpZiAoIXJldCkKKyAgICBnb3RvIG1hc2tfZmFpbGVkOworCisgIHN3aXRjaCAoc21wdGUtPm91dF9mb3JtYXQpIHsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICAgIHN3aXRjaCAoc21wdGUtPmluX2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICAgICAgICBzbXB0ZS0+cHJvY2VzcyA9IGdzdF9zbXB0ZV9hbHBoYV9wcm9jZXNzX2F5dXZfYXl1djsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICAgICAgc21wdGUtPnByb2Nlc3MgPSBnc3Rfc21wdGVfYWxwaGFfcHJvY2Vzc19pNDIwX2F5dXY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICAgIHN3aXRjaCAoc21wdGUtPmluX2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICAgICAgICBzbXB0ZS0+cHJvY2VzcyA9IGdzdF9zbXB0ZV9hbHBoYV9wcm9jZXNzX2FyZ2JfYXJnYjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgc3dpdGNoIChzbXB0ZS0+aW5fZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgICAgIHNtcHRlLT5wcm9jZXNzID0gZ3N0X3NtcHRlX2FscGhhX3Byb2Nlc3NfcmdiYV9yZ2JhOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgICBzd2l0Y2ggKHNtcHRlLT5pbl9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgICAgICAgc21wdGUtPnByb2Nlc3MgPSBnc3Rfc21wdGVfYWxwaGFfcHJvY2Vzc19hYmdyX2FiZ3I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgIHN3aXRjaCAoc21wdGUtPmluX2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgICAgICBzbXB0ZS0+cHJvY2VzcyA9IGdzdF9zbXB0ZV9hbHBoYV9wcm9jZXNzX2JncmFfYmdyYTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCittYXNrX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHNtcHRlLCAiZmFpbGVkIGNyZWF0aW5nIHRoZSBtYXNrIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc21wdGVfYWxwaGFfZmluYWxpemUgKEdzdFNNUFRFQWxwaGEgKiBzbXB0ZSkKK3sKKyAgaWYgKHNtcHRlLT5tYXNrKQorICAgIGdzdF9tYXNrX2Rlc3Ryb3kgKHNtcHRlLT5tYXNrKTsKKyAgc21wdGUtPm1hc2sgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAoKEdPYmplY3QgKikgc21wdGUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NtcHRlX2FscGhhX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTTVBURUFscGhhICpzbXB0ZSA9IEdTVF9TTVBURV9BTFBIQSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfVFlQRTp7CisgICAgICBnaW50IHR5cGU7CisKKyAgICAgIHR5cGUgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc21wdGUpOworICAgICAgZ3N0X3NtcHRlX2FscGhhX3VwZGF0ZV9tYXNrIChzbXB0ZSwgdHlwZSwgc21wdGUtPmludmVydCwKKyAgICAgICAgICBzbXB0ZS0+ZGVwdGgsIHNtcHRlLT53aWR0aCwgc21wdGUtPmhlaWdodCk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc21wdGUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9CT1JERVI6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNtcHRlKTsKKyAgICAgIHNtcHRlLT5ib3JkZXIgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzbXB0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfREVQVEg6eworICAgICAgZ2ludCBkZXB0aDsKKworICAgICAgZGVwdGggPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKworICAgICAgR1NUX09CSkVDVF9MT0NLIChzbXB0ZSk7CisgICAgICBnc3Rfc21wdGVfYWxwaGFfdXBkYXRlX21hc2sgKHNtcHRlLCBzbXB0ZS0+dHlwZSwgc21wdGUtPmludmVydCwKKyAgICAgICAgICBkZXB0aCwgc21wdGUtPndpZHRoLCBzbXB0ZS0+aGVpZ2h0KTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzbXB0ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX1BPU0lUSU9OOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzbXB0ZSk7CisgICAgICBzbXB0ZS0+cG9zaXRpb24gPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzbXB0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSU5WRVJUOnsKKyAgICAgIGdib29sZWFuIGludmVydDsKKworICAgICAgaW52ZXJ0ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgR1NUX09CSkVDVF9MT0NLIChzbXB0ZSk7CisgICAgICBnc3Rfc21wdGVfYWxwaGFfdXBkYXRlX21hc2sgKHNtcHRlLCBzbXB0ZS0+dHlwZSwgaW52ZXJ0LAorICAgICAgICAgIHNtcHRlLT5kZXB0aCwgc21wdGUtPndpZHRoLCBzbXB0ZS0+aGVpZ2h0KTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzbXB0ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3NtcHRlX2FscGhhX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTTVBURUFscGhhICpzbXB0ZTsKKworICBzbXB0ZSA9IEdTVF9TTVBURV9BTFBIQSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfVFlQRToKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoc21wdGUpOworICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHNtcHRlLT50eXBlKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzbXB0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQk9SREVSOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzbXB0ZSk7CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBzbXB0ZS0+Ym9yZGVyKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzbXB0ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfREVQVEg6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNtcHRlKTsKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHNtcHRlLT5kZXB0aCk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoc21wdGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BPU0lUSU9OOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChzbXB0ZSk7CisgICAgICBnX3ZhbHVlX3NldF9kb3VibGUgKHZhbHVlLCBzbXB0ZS0+cG9zaXRpb24pOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHNtcHRlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9JTlZFUlQ6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKHNtcHRlKTsKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBzbXB0ZS0+aW52ZXJ0KTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzbXB0ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2dib29sZWFuCitnc3Rfc21wdGVfYWxwaGFfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9zbXB0ZV9hbHBoYV9kZWJ1ZywgInNtcHRlYWxwaGEiLCAwLAorICAgICAgIlNNUFRFIGFscGhhIGVmZmVjdCIpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAic21wdGVhbHBoYSIsIEdTVF9SQU5LX05PTkUsCisgICAgICBHU1RfVFlQRV9TTVBURV9BTFBIQSk7Cit9CmRpZmYgLS1naXQgYS9nc3Qvc21wdGUvZ3N0c21wdGVhbHBoYS5oIGIvZ3N0L3NtcHRlL2dzdHNtcHRlYWxwaGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGQyYjM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3NtcHRlL2dzdHNtcHRlYWxwaGEuaApAQCAtMCwwICsxLDc5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1NNUFRFX0FMUEhBX0hfXworI2RlZmluZSBfX0dTVF9TTVBURV9BTFBIQV9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9maWx0ZXIuaD4KKworCitHX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlICJnc3RtYXNrLmgiCisKKyNkZWZpbmUgR1NUX1RZUEVfU01QVEVfQUxQSEEgXAorICAoZ3N0X3NtcHRlX2FscGhhX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9TTVBURV9BTFBIQShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1NNUFRFX0FMUEhBLEdzdFNNUFRFQWxwaGEpKQorI2RlZmluZSBHU1RfU01QVEVfQUxQSEFfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfU01QVEVfQUxQSEEsR3N0U01QVEVBbHBoYUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1NNUFRFX0FMUEhBKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfU01QVEVfQUxQSEEpKQorI2RlZmluZSBHU1RfSVNfU01QVEVfQUxQSEFfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfU01QVEVfQUxQSEEpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0U01QVEVBbHBoYSBHc3RTTVBURUFscGhhOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFNNUFRFQWxwaGFDbGFzcyBHc3RTTVBURUFscGhhQ2xhc3M7CisKK3N0cnVjdCBfR3N0U01QVEVBbHBoYSB7CisgIEdzdFZpZGVvRmlsdGVyIGVsZW1lbnQ7CisKKyAgLyogcHJvcGVydGllcyAqLworICBnaW50ICAgICAgICAgICB0eXBlOworICBnaW50ICAgICAgICAgICBib3JkZXI7CisgIGdpbnQgICAgICAgICAgIGRlcHRoOworICBnZG91YmxlICAgICAgICBwb3NpdGlvbjsKKyAgZ2Jvb2xlYW4gICAgICAgaW52ZXJ0OworCisgIC8qIG5lZ290aWF0ZWQgZm9ybWF0ICovCisgIEdzdFZpZGVvRm9ybWF0IGluX2Zvcm1hdCwgb3V0X2Zvcm1hdDsKKyAgZ2ludCAgICAgICAgICAgd2lkdGg7CisgIGdpbnQgICAgICAgICAgIGhlaWdodDsKKworICAvKiBzdGF0ZSBvZiB0aGUgZWZmZWN0ICovCisgIEdzdE1hc2sgICAgICAgKm1hc2s7CisKKyAgLyogcHJvY2Vzc2luZyBmdW5jdGlvbiAqLworICB2b2lkICgqcHJvY2VzcykgKEdzdFNNUFRFQWxwaGEgKiBzbXB0ZSwgY29uc3QgR3N0VmlkZW9GcmFtZSAqIGluLCBHc3RWaWRlb0ZyYW1lICogb3V0LAorICAgIEdzdE1hc2sgKiBtYXNrLCBnaW50IGJvcmRlciwgZ2ludCBwb3MpOworfTsKKworc3RydWN0IF9Hc3RTTVBURUFscGhhQ2xhc3MgeworICBHc3RWaWRlb0ZpbHRlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9zbXB0ZV9hbHBoYV9nZXRfdHlwZSAodm9pZCk7CitnYm9vbGVhbiBnc3Rfc21wdGVfYWxwaGFfcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9TTVBURV9BTFBIQV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9zbXB0ZS9tZXNvbi5idWlsZCBiL2dzdC9zbXB0ZS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTUzOWQzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3NtcHRlL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTcgQEAKK3NtcHRlX3NvdXJjZXMgPSBbCisgICdnc3RzbXB0ZS5jJywKKyAgJ2dzdG1hc2suYycsCisgICdiYXJib3h3aXBlcy5jJywKKyAgJ3BhaW50LmMnLAorICAnZ3N0c21wdGVhbHBoYS5jJywKKyAgJ3BsdWdpbi5jJywKK10KKworZ3N0c21wdGUgPSBsaWJyYXJ5KCdnc3RzbXB0ZScsCisgIHNtcHRlX3NvdXJjZXMsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0dmlkZW9fZGVwLCBnc3RfZGVwLCBsaWJtXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2dzdC9zbXB0ZS9wYWludC5jIGIvZ3N0L3NtcHRlL3BhaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q5NzMyMwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zbXB0ZS9wYWludC5jCkBAIC0wLDAgKzEsMzM4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInBhaW50LmgiCisKKyNpZm5kZWYgTV9QSQorI2RlZmluZSBNX1BJICAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CisjZW5kaWYKKwordm9pZAorZ3N0X3NtcHRlX3BhaW50X3Zib3ggKGd1aW50MzIgKiBkZXN0LCBnaW50IHN0cmlkZSwKKyAgICBnaW50IHgwLCBnaW50IHkwLCBnaW50IGMwLCBnaW50IHgxLCBnaW50IHkxLCBnaW50IGMxKQoreworICBnaW50IGksIGo7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKworICB3aWR0aCA9IHgxIC0geDA7CisgIGhlaWdodCA9IHkxIC0geTA7CisKKyAgZ19hc3NlcnQgKHdpZHRoID4gMCk7CisgIGdfYXNzZXJ0IChoZWlnaHQgPiAwKTsKKworICBkZXN0ID0gZGVzdCArIHkwICogc3RyaWRlICsgeDA7CisKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgIGRlc3Rbal0gPSAoYzEgKiBqICsgYzAgKiAod2lkdGggLSBqKSkgLyB3aWR0aDsKKyAgICB9CisgICAgZGVzdCArPSBzdHJpZGU7CisgIH0KK30KKwordm9pZAorZ3N0X3NtcHRlX3BhaW50X2hib3ggKGd1aW50MzIgKiBkZXN0LCBnaW50IHN0cmlkZSwKKyAgICBnaW50IHgwLCBnaW50IHkwLCBnaW50IGMwLCBnaW50IHgxLCBnaW50IHkxLCBnaW50IGMxKQoreworICBnaW50IGksIGo7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKworICB3aWR0aCA9IHgxIC0geDA7CisgIGhlaWdodCA9IHkxIC0geTA7CisKKyAgZ19hc3NlcnQgKHdpZHRoID4gMCk7CisgIGdfYXNzZXJ0IChoZWlnaHQgPiAwKTsKKworICBkZXN0ID0gZGVzdCArIHkwICogc3RyaWRlICsgeDA7CisKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgZ3VpbnQzMiB2YWx1ZSA9IChjMSAqIGkgKyBjMCAqIChoZWlnaHQgLSBpKSkgLyBoZWlnaHQ7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgZGVzdFtqXSA9IHZhbHVlOworICAgIH0KKyAgICBkZXN0ICs9IHN0cmlkZTsKKyAgfQorfQorCisjZGVmaW5lIFNURVBfM0RfTElORShkeGFicyxkeWFicyxkemFicyxzZHgsc2R5LHNkeix4cix5cix6cixweCxweSxweikgICAgICAgICAgIFwKK0dfU1RNVF9TVEFSVCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZHhhYnMgPj0gZHlhYnMgJiYgZHhhYnMgPj0gZHphYnMpIHsgICAgICAgICAgICAgICBcCisgICAgeXIgKz0gZHlhYnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB6ciArPSBkemFiczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh5ciA+PSBkeGFicykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBweSArPSBzZHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHlyIC09IGR4YWJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHpyID49IGR6YWJzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHB6ICs9IHNkejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgenIgLT0gZHhhYnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBweCArPSBzZHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgaWYgKGR5YWJzID49IGR4YWJzICYmIGR5YWJzID49IGR6YWJzKSB7ICAgICAgICBcCisgICAgeHIgKz0gZHhhYnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB6ciArPSBkemFiczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh4ciA+PSBkeWFicykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBweCArPSBzZHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHhyIC09IGR5YWJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHpyID49IGR6YWJzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHB6ICs9IHNkejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgenIgLT0gZHlhYnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBweSArPSBzZHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeXIgKz0gZHlhYnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB4ciArPSBkeGFiczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh5ciA+PSBkeWFicykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBweSArPSBzZHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHlyIC09IGR6YWJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHhyID49IGR5YWJzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHB4ICs9IHNkeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeHIgLT0gZHphYnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBweiArPSBzZHo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IEdfU1RNVF9FTkQKKworI2RlZmluZSBTV0FQX0lOVChhLGIpICAgICAgICAgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgIFwKKyAgZ2ludCB0bXA7ICAgICAgICAgICAgICAgICAgICAgXAorICB0bXAgPSAoYSk7ICAgICAgICAgICAgICAgICAgICBcCisgIChhKSA9IChiKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgKGIpID0gKHRtcCk7ICAgICAgICAgICAgICAgICAgXAorfSBHX1NUTVRfRU5ECisKKyNkZWZpbmUgU0lHTihhKSAoKGEpIDwgMCA/IC0xIDogMSkKKworI2RlZmluZSBQUkVQQVJFXzNEX0xJTkUoeDAseTAsejAseDEseTEsejEsZHhhYnMsZHlhYnMsZHphYnMsc2R4LHNkeSxzZHoseHIseXIsenIscHgscHkscHopXAorR19TVE1UX1NUQVJUIHsgICAgICAgICAgICAgICAgICBcCisgIGdpbnQgZHgsIGR5LCBkejsgICAgICAgICAgICAgIFwKKyAgZHggPSB4MSAtIHgwOyAgICAgICAgICAgICAgICAgXAorICBkeSA9IHkxIC0geTA7ICAgICAgICAgICAgICAgICBcCisgIGR6ID0gejEgLSB6MDsgICAgICAgICAgICAgICAgIFwKKyAgZHhhYnMgPSBhYnMgKGR4KTsgICAgICAgICAgICAgXAorICBkeWFicyA9IGFicyAoZHkpOyAgICAgICAgICAgICBcCisgIGR6YWJzID0gYWJzIChkeik7ICAgICAgICAgICAgIFwKKyAgc2R4ID0gU0lHTiAoZHgpOyAgICAgICAgICAgICAgXAorICBzZHkgPSBTSUdOIChkeSk7ICAgICAgICAgICAgICBcCisgIHNkeiA9IFNJR04gKGR6KTsgICAgICAgICAgICAgIFwKKyAgeHIgPSBkeGFicyA+PiAxOyAgICAgICAgICAgICAgXAorICB5ciA9IGR5YWJzID4+IDE7ICAgICAgICAgICAgICBcCisgIHpyID0gZHphYnMgPj4gMTsgICAgICAgICAgICAgIFwKKyAgcHggPSB4MDsgICAgICAgICAgICAgICAgICAgICAgXAorICBweSA9IHkwOyAgICAgICAgICAgICAgICAgICAgICBcCisgIHB6ID0gejA7ICAgICAgICAgICAgICAgICAgICAgIFwKK30gR19TVE1UX0VORAorCit2b2lkCitnc3Rfc21wdGVfcGFpbnRfdHJpYW5nbGVfbGluZWFyIChndWludDMyICogZGVzdCwgZ2ludCBzdHJpZGUsCisgICAgZ2ludCB4MCwgZ2ludCB5MCwgZ2ludCBjMCwKKyAgICBnaW50IHgxLCBnaW50IHkxLCBnaW50IGMxLCBnaW50IHgyLCBnaW50IHkyLCBnaW50IGMyKQoreworICBnaW50IHNkeGwsIHNkeWwsIHNkY2wsIGR4bGFicywgZHlsYWJzLCBkY2xhYnMsIHhybCwgeXJsLCBjcmwsIHB4bCwgcHlsLCBwY2w7CisgIGdpbnQgc2R4ciwgc2R5ciwgc2RjciwgZHhyYWJzLCBkeXJhYnMsIGRjcmFicywgeHJyLCB5cnIsIGNyciwgcHhyLCBweXIsIHBjcjsKKyAgZ2ludCBpLCBqLCBrLCBzZWdfc3RhcnQsIHNlZ19lbmQ7CisKKyAgaWYgKHkwID4geTEpIHsKKyAgICBTV0FQX0lOVCAoeDAsIHgxKTsKKyAgICBTV0FQX0lOVCAoeTAsIHkxKTsKKyAgICBTV0FQX0lOVCAoYzAsIGMxKTsKKyAgfQorICBpZiAoeTAgPiB5MikgeworICAgIFNXQVBfSU5UICh4MCwgeDIpOworICAgIFNXQVBfSU5UICh5MCwgeTIpOworICAgIFNXQVBfSU5UIChjMCwgYzIpOworICB9CisgIGlmICh5MSA+IHkyKSB7CisgICAgU1dBUF9JTlQgKHgxLCB4Mik7CisgICAgU1dBUF9JTlQgKHkxLCB5Mik7CisgICAgU1dBUF9JTlQgKGMxLCBjMik7CisgIH0KKworICBQUkVQQVJFXzNEX0xJTkUgKHgwLCB5MCwgYzAsIHgyLCB5MiwgYzIsCisgICAgICBkeGxhYnMsIGR5bGFicywgZGNsYWJzLCBzZHhsLCBzZHlsLCBzZGNsLCB4cmwsIHlybCwgY3JsLCBweGwsIHB5bCwgcGNsKTsKKworICBQUkVQQVJFXzNEX0xJTkUgKHgwLCB5MCwgYzAsIHgxLCB5MSwgYzEsCisgICAgICBkeHJhYnMsIGR5cmFicywgZGNyYWJzLCBzZHhyLCBzZHlyLCBzZGNyLCB4cnIsIHlyciwgY3JyLCBweHIsIHB5ciwgcGNyKTsKKworICBkZXN0ID0gZGVzdCArIHN0cmlkZSAqIHkwOworICBzZWdfc3RhcnQgPSB5MDsKKyAgc2VnX2VuZCA9IHkxOworCisgIC8qIGRvIHR3byBwYXNzZXMgKi8KKyAgZm9yIChrID0gMDsgayA8IDI7IGsrKykgeworICAgIGZvciAoaSA9IHNlZ19zdGFydDsgaSA8IHNlZ19lbmQ7IGkrKykgeworICAgICAgZ2ludCBzID0gcHhsLCBlID0gcHhyLCBzYyA9IHBjbCwgZWMgPSBwY3I7CisgICAgICBnaW50IHNpZ24gPSBTSUdOIChlIC0gcyk7CisKKyAgICAgIGUgKz0gc2lnbjsKKyAgICAgIGZvciAoaiA9IHM7IGogIT0gZTsgaiArPSBzaWduKSB7CisgICAgICAgIGRlc3Rbal0gPSAoZWMgKiAoaiAtIHMpICsgc2MgKiAoZSAtIGopKSAvIChlIC0gcyk7CisgICAgICB9CisKKyAgICAgIHdoaWxlIChweXIgPT0gaSkgeworICAgICAgICBTVEVQXzNEX0xJTkUgKGR4cmFicywgZHlyYWJzLCBkY3JhYnMsIHNkeHIsIHNkeXIsIHNkY3IsCisgICAgICAgICAgICB4cnIsIHlyciwgY3JyLCBweHIsIHB5ciwgcGNyKTsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChweWwgPT0gaSkgeworICAgICAgICBTVEVQXzNEX0xJTkUgKGR4bGFicywgZHlsYWJzLCBkY2xhYnMsIHNkeGwsIHNkeWwsIHNkY2wsCisgICAgICAgICAgICB4cmwsIHlybCwgY3JsLCBweGwsIHB5bCwgcGNsKTsKKyAgICAgIH0KKyAgICAgIGRlc3QgKz0gc3RyaWRlOworICAgIH0KKworICAgIFBSRVBBUkVfM0RfTElORSAoeDEsIHkxLCBjMSwgeDIsIHkyLCBjMiwKKyAgICAgICAgZHhyYWJzLCBkeXJhYnMsIGRjcmFicywgc2R4ciwgc2R5ciwgc2RjciwgeHJyLCB5cnIsIGNyciwgcHhyLCBweXIsIHBjcik7CisKKyAgICBzZWdfc3RhcnQgPSB5MTsKKyAgICBzZWdfZW5kID0geTI7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2RyYXdfYnJlc2VuaGFtX2xpbmUgKGd1aW50MzIgKiBkZXN0LCBnaW50IHN0cmlkZSwKKyAgICBnaW50IHgwLCBnaW50IHkwLCBnaW50IHgxLCBnaW50IHkxLCBndWludDMyIGNvbCkKK3sKKyAgZ2ludCBkeCwgZHk7CisgIGdpbnQgeF9pbmNyLCB5X2luY3I7CisgIGdpbnQgaSwgZHByLCBkcHJ1LCBQLCBpbmRlcDsKKworICBkeCA9IGFicyAoeDEgLSB4MCk7CisgIGR5ID0gYWJzICh5MSAtIHkwKTsKKworICBkZXN0ID0gZGVzdCArIHkwICogc3RyaWRlICsgeDA7CisKKyAgeF9pbmNyID0gU0lHTiAoeDEgLSB4MCk7CisgIHlfaW5jciA9IFNJR04gKHkxIC0geTApICogc3RyaWRlOworCisgIGlmIChkeCA+PSBkeSkgeworICAgIGRwciA9IGR5IDw8IDE7CisgICAgaSA9IGR4OworICAgIGluZGVwID0geF9pbmNyOworICB9IGVsc2UgeworICAgIGRwciA9IGR4IDw8IDE7CisgICAgaSA9IGR5OworICAgIGluZGVwID0geV9pbmNyOworICB9CisKKyAgZHBydSA9IGRwciAtIChpIDw8IDEpOworICBQID0gZHByIC0gaTsKKworICBmb3IgKDsgaSA+PSAwOyBpLS0pIHsKKyAgICAqZGVzdCA9IGNvbDsKKworICAgIGlmIChQID4gMCkgeworICAgICAgZGVzdCArPSB4X2luY3I7CisgICAgICBkZXN0ICs9IHlfaW5jcjsKKyAgICAgIFAgKz0gZHBydTsKKyAgICB9IGVsc2UgeworICAgICAgZGVzdCArPSBpbmRlcDsKKyAgICAgIFAgKz0gZHByOworICAgIH0KKyAgfQorfQorCit2b2lkCitnc3Rfc21wdGVfcGFpbnRfdHJpYW5nbGVfY2xvY2sgKGd1aW50MzIgKiBkZXN0LCBnaW50IHN0cmlkZSwKKyAgICBnaW50IHgwLCBnaW50IHkwLCBnaW50IGMwLAorICAgIGdpbnQgeDEsIGdpbnQgeTEsIGdpbnQgYzEsIGdpbnQgeDIsIGdpbnQgeTIsIGdpbnQgYzIpCit7CisgIGdpbnQgaTsKKyAgZ2ludCBzaWduOworICBnZmxvYXQgYW5nbGUsIGFuZ2xlX2U7CisgIGdmbG9hdCBsZW4xOworCisgIGFuZ2xlX2UgPSBhY29zICgoKHgxIC0geDApICogKHgyIC0geDApICsgKHkxIC0geTApICogKHkyIC0geTApKSAvCisgICAgICAoc3FydCAoKHgxIC0geDApICogKHgxIC0geDApICsgKHkxIC0geTApICogKHkxIC0geTApKSAqCisgICAgICAgICAgc3FydCAoKHgyIC0geDApICogKHgyIC0geDApICsgKHkyIC0geTApICogKHkyIC0geTApKSkpOworCisgIGxlbjEgPSBzcXJ0ICgoeDEgLSB4MCkgKiAoeDEgLSB4MCkgKyAoeTEgLSB5MCkgKiAoeTEgLSB5MCkpOworCisgIGlmICh4MSA9PSB4MikgeworICAgIHNpZ24gPSBTSUdOICh5MiAtIHkxKTsKKworICAgIGZvciAoaSA9IHkxOyBpICE9ICh5MiArIHNpZ24pOyBpICs9IHNpZ24pIHsKKyAgICAgIGlmICh5MSA9PSBpKQorICAgICAgICBhbmdsZSA9IDA7CisgICAgICBlbHNlCisgICAgICAgIGFuZ2xlID0gYWNvcyAoKCh4MSAtIHgwKSAqICh4MiAtIHgwKSArICh5MSAtIHkwKSAqIChpIC0geTApKSAvCisgICAgICAgICAgICAobGVuMSAqIHNxcnQgKCh4MSAtIHgwKSAqICh4MSAtIHgwKSArIChpIC0geTApICogKGkgLQorICAgICAgICAgICAgICAgICAgICAgICAgeTApKSkpIC8gYW5nbGVfZTsKKworICAgICAgZHJhd19icmVzZW5oYW1fbGluZSAoZGVzdCwgc3RyaWRlLAorICAgICAgICAgIHgwLCB5MCwgeDEsIGksIChjMiAqIGFuZ2xlICsgYzEgKiAoMS4wIC0gYW5nbGUpKSk7CisgICAgfQorICB9IGVsc2UgaWYgKHkxID09IHkyKSB7CisgICAgc2lnbiA9IFNJR04gKHgyIC0geDEpOworCisgICAgZm9yIChpID0geDE7IGkgIT0gKHgyICsgc2lnbik7IGkgKz0gc2lnbikgeworICAgICAgaWYgKHgxID09IGkpCisgICAgICAgIGFuZ2xlID0gMDsKKyAgICAgIGVsc2UKKyAgICAgICAgYW5nbGUgPSBhY29zICgoKHgxIC0geDApICogKGkgLSB4MCkgKyAoeTEgLSB5MCkgKiAoeTIgLSB5MCkpIC8KKyAgICAgICAgICAgIChsZW4xICogc3FydCAoKGkgLSB4MCkgKiAoaSAtIHgwKSArICh5MiAtIHkwKSAqICh5MiAtCisgICAgICAgICAgICAgICAgICAgICAgICB5MCkpKSkgLyBhbmdsZV9lOworCisgICAgICBkcmF3X2JyZXNlbmhhbV9saW5lIChkZXN0LCBzdHJpZGUsCisgICAgICAgICAgeDAsIHkwLCBpLCB5MSwgKGMyICogYW5nbGUgKyBjMSAqICgxLjAgLSBhbmdsZSkpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ193YXJuaW5nICgicGFpbnQgdHJpYW5nbGUgY2xvY2s6IG5vdCBzdXBwb3J0ZWQiKTsKKyAgICByZXR1cm47CisgIH0KK30KKwordm9pZAorZ3N0X3NtcHRlX3BhaW50X2JveF9jbG9jayAoZ3VpbnQzMiAqIGRlc3QsIGdpbnQgc3RyaWRlLAorICAgIGdpbnQgeDAsIGdpbnQgeTAsIGdpbnQgYzAsCisgICAgZ2ludCB4MSwgZ2ludCB5MSwgZ2ludCBjMSwgZ2ludCB4MiwgZ2ludCB5MiwgZ2ludCBjMikKK3sKKyAgZ2Zsb2F0IGFuZ2xlX20sIGNvbF9tOworICBnaW50IHh2LCB5djsKKworICBpZiAoeDEgPT0geDApIHsKKyAgICB4diA9IHgyOworICAgIHl2ID0geTE7CisgIH0gZWxzZSBpZiAoeTEgPT0geTApIHsKKyAgICB4diA9IHgxOworICAgIHl2ID0geTI7CisgIH0gZWxzZSB7CisgICAgZ193YXJuaW5nICgicGFpbnQgYm94IGNsb2NrOiBub3Qgc3VwcG9ydGVkIik7CisgICAgcmV0dXJuOworICB9CisKKyAgYW5nbGVfbSA9IDIgKiBhY29zICgoKHgxIC0geDApICogKHh2IC0geDApICsgKHkxIC0geTApICogKHl2IC0geTApKSAvCisgICAgICAoc3FydCAoKHgxIC0geDApICogKHgxIC0geDApICsgKHkxIC0geTApICogKHkxIC0geTApKSAqCisgICAgICAgICAgc3FydCAoKHh2IC0geDApICogKHh2IC0geDApICsgKHl2IC0geTApICogKHl2IC0geTApKSkpIC8gTV9QSTsKKworICBjb2xfbSA9IGMyICogYW5nbGVfbSArIGMxICogKDEuMCAtIGFuZ2xlX20pOworCisgIGdzdF9zbXB0ZV9wYWludF90cmlhbmdsZV9jbG9jayAoZGVzdCwgc3RyaWRlLAorICAgICAgeDAsIHkwLCBjMCwgeDEsIHkxLCBjMSwgeHYsIHl2LCBjb2xfbSk7CisgIGdzdF9zbXB0ZV9wYWludF90cmlhbmdsZV9jbG9jayAoZGVzdCwgc3RyaWRlLAorICAgICAgeDAsIHkwLCBjMCwgeHYsIHl2LCBjb2xfbSwgeDIsIHkyLCBjMik7Cit9CmRpZmYgLS1naXQgYS9nc3Qvc21wdGUvcGFpbnQuaCBiL2dzdC9zbXB0ZS9wYWludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MTVlMGIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3Qvc21wdGUvcGFpbnQuaApAQCAtMCwwICsxLDQ3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9TTVBURV9QQUlOVF9IX18KKyNkZWZpbmUgX19HU1RfU01QVEVfUEFJTlRfSF9fCisKKyNpbmNsdWRlIDxnbGliLmg+CisKK3ZvaWQgICAgZ3N0X3NtcHRlX3BhaW50X3Zib3ggICAgICAgICAgICAoZ3VpbnQzMiAqZGVzdCwgZ2ludCBzdHJpZGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50IHgwLCBnaW50IHkwLCBnaW50IGMwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCB4MSwgZ2ludCB5MSwgZ2ludCBjMSk7Cit2b2lkICAgIGdzdF9zbXB0ZV9wYWludF9oYm94ICAgICAgICAgICAgKGd1aW50MzIgKmRlc3QsIGdpbnQgc3RyaWRlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCB4MCwgZ2ludCB5MCwgZ2ludCBjMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgeDEsIGdpbnQgeTEsIGdpbnQgYzEpOworCit2b2lkICAgIGdzdF9zbXB0ZV9wYWludF90cmlhbmdsZV9saW5lYXIgKGd1aW50MzIgKmRlc3QsIGdpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50IHgwLCBnaW50IHkwLCBnaW50IGMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50IHgxLCBnaW50IHkxLCBnaW50IGMxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCB4MiwgZ2ludCB5MiwgZ2ludCBjMik7CisKK3ZvaWQgICAgZ3N0X3NtcHRlX3BhaW50X3RyaWFuZ2xlX2Nsb2NrICAoZ3VpbnQzMiAqZGVzdCwgZ2ludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgeDAsIGdpbnQgeTAsIGdpbnQgYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgeDEsIGdpbnQgeTEsIGdpbnQgYzEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50IHgyLCBnaW50IHkyLCBnaW50IGMyKTsKKwordm9pZCAgICBnc3Rfc21wdGVfcGFpbnRfYm94X2Nsb2NrICAgICAgIChndWludDMyICpkZXN0LCBnaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCB4MCwgZ2ludCB5MCwgZ2ludCBjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCB4MSwgZ2ludCB5MSwgZ2ludCBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCB4MiwgZ2ludCB5MiwgZ2ludCBjMik7CisKKyNlbmRpZiAvKiBfX0dTVF9TTVBURV9QQUlOVF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC9zbXB0ZS9wbHVnaW4uYyBiL2dzdC9zbXB0ZS9wbHVnaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2ViYThhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3NtcHRlL3BsdWdpbi5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwOD4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdvb2dsZS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0c21wdGUuaCIKKyNpbmNsdWRlICJnc3RzbXB0ZWFscGhhLmgiCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3Rfc21wdGVfcGx1Z2luX2luaXQgKHBsdWdpbikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X3NtcHRlX2FscGhhX3BsdWdpbl9pbml0IChwbHVnaW4pKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHNtcHRlLAorICAgICJBcHBseSB0aGUgc3RhbmRhcmQgU01QVEUgdHJhbnNpdGlvbnMgb24gdmlkZW8gaW1hZ2VzIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgIkxHUEwiLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3Qvc3BlY3RydW0vLmdpdGlnbm9yZSBiL2dzdC9zcGVjdHJ1bS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZjM2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3Qvc3BlY3RydW0vLmdpdGlnbm9yZQpAQCAtMCwwICsxLDkgQEAKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorKi5vCisqLmxvCisqLmxhCisuZGVwcworLmxpYnMKK2RlbW8tYXVkaW90ZXN0CitkZW1vLW9zc3NyYwpkaWZmIC0tZ2l0IGEvZ3N0L3NwZWN0cnVtL01ha2VmaWxlLmFtIGIvZ3N0L3NwZWN0cnVtL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMGM5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3Qvc3BlY3RydW0vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0c3BlY3RydW0ubGEKKworbGliZ3N0c3BlY3RydW1fbGFfU09VUkNFUyA9IGdzdHNwZWN0cnVtLmMKK2xpYmdzdHNwZWN0cnVtX2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQ0ZMQUdTKQorbGliZ3N0c3BlY3RydW1fbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwktbGdzdGZmdC0kKEdTVF9BUElfVkVSU0lPTikgLWxnc3RhdWRpby0kKEdTVF9BUElfVkVSU0lPTikgXAorCSQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykgJChMSUJNKQorbGliZ3N0c3BlY3RydW1fbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdHNwZWN0cnVtLmgKZGlmZiAtLWdpdCBhL2dzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jIGIvZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlODk2MAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5jCkBAIC0wLDAgKzEsMTAwNyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogICAgICAgICAgICAgICA8MjAwNiwyMDExPiBTdGVmYW4gS29zdCA8ZW5zb25pY0B1c2Vycy5zZi5uZXQ+CisgKiAgICAgICAgICAgICAgIDwyMDA3LTIwMDk+IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1zcGVjdHJ1bQorICoKKyAqIFRoZSBTcGVjdHJ1bSBlbGVtZW50IGFuYWx5emVzIHRoZSBmcmVxdWVuY3kgc3BlY3RydW0gb2YgYW4gYXVkaW8gc2lnbmFsLgorICogSWYgdGhlICNHc3RTcGVjdHJ1bTpwb3N0LW1lc3NhZ2VzIHByb3BlcnR5IGlzICVUUlVFLCBpdCBzZW5kcyBhbmFseXNpcyByZXN1bHRzCisgKiBhcyBlbGVtZW50IG1lc3NhZ2VzIG5hbWVkCisgKiA8Y2xhc3NuYW1lPiZxdW90O3NwZWN0cnVtJnF1b3Q7PC9jbGFzc25hbWU+IGFmdGVyIGVhY2ggaW50ZXJ2YWwgb2YgdGltZSBnaXZlbgorICogYnkgdGhlICNHc3RTcGVjdHJ1bTppbnRlcnZhbCBwcm9wZXJ0eS4KKyAqCisgKiBUaGUgbWVzc2FnZSdzIHN0cnVjdHVyZSBjb250YWlucyBzb21lIGNvbWJpbmF0aW9uIG9mIHRoZXNlIGZpZWxkczoKKyAqIDxpdGVtaXplZGxpc3Q+CisgKiA8bGlzdGl0ZW0+CisgKiAgIDxwYXJhPgorICogICAjR3N0Q2xvY2tUaW1lCisgKiAgIDxjbGFzc25hbWU+JnF1b3Q7dGltZXN0YW1wJnF1b3Q7PC9jbGFzc25hbWU+OgorICogICB0aGUgdGltZXN0YW1wIG9mIHRoZSBidWZmZXIgdGhhdCB0cmlnZ2VyZWQgdGhlIG1lc3NhZ2UuCisgKiAgIDwvcGFyYT4KKyAqIDwvbGlzdGl0ZW0+CisgKiA8bGlzdGl0ZW0+CisgKiAgIDxwYXJhPgorICogICAjR3N0Q2xvY2tUaW1lCisgKiAgIDxjbGFzc25hbWU+JnF1b3Q7c3RyZWFtLXRpbWUmcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgIHRoZSBzdHJlYW0gdGltZSBvZiB0aGUgYnVmZmVyLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPGxpc3RpdGVtPgorICogICA8cGFyYT4KKyAqICAgI0dzdENsb2NrVGltZQorICogICA8Y2xhc3NuYW1lPiZxdW90O3J1bm5pbmctdGltZSZxdW90OzwvY2xhc3NuYW1lPjoKKyAqICAgdGhlIHJ1bm5pbmdfdGltZSBvZiB0aGUgYnVmZmVyLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPGxpc3RpdGVtPgorICogICA8cGFyYT4KKyAqICAgI0dzdENsb2NrVGltZQorICogICA8Y2xhc3NuYW1lPiZxdW90O2R1cmF0aW9uJnF1b3Q7PC9jbGFzc25hbWU+OgorICogICB0aGUgZHVyYXRpb24gb2YgdGhlIGJ1ZmZlci4KKyAqICAgPC9wYXJhPgorICogPC9saXN0aXRlbT4KKyAqIDxsaXN0aXRlbT4KKyAqICAgPHBhcmE+CisgKiAgICNHc3RDbG9ja1RpbWUKKyAqICAgPGNsYXNzbmFtZT4mcXVvdDtlbmR0aW1lJnF1b3Q7PC9jbGFzc25hbWU+OgorICogICB0aGUgZW5kIHRpbWUgb2YgdGhlIGJ1ZmZlciB0aGF0IHRyaWdnZXJlZCB0aGUgbWVzc2FnZSBhcyBzdHJlYW0gdGltZSAodGhpcworICogICBpcyBkZXByZWNhdGVkLCBhcyBpdCBjYW4gYmUgY2FsY3VsYXRlZCBmcm9tIHN0cmVhbS10aW1lICsgZHVyYXRpb24pCisgKiAgIDwvcGFyYT4KKyAqIDwvbGlzdGl0ZW0+CisgKiA8bGlzdGl0ZW0+CisgKiAgIDxwYXJhPgorICogICAjR3N0VmFsdWVMaXN0IG9mICNnZmxvYXQKKyAqICAgPGNsYXNzbmFtZT4mcXVvdDttYWduaXR1ZGUmcXVvdDs8L2NsYXNzbmFtZT46CisgKiAgIHRoZSBsZXZlbCBmb3IgZWFjaCBmcmVxdWVuY3kgYmFuZCBpbiBkQi4gQWxsIHZhbHVlcyBiZWxvdyB0aGUgdmFsdWUgb2YgdGhlCisgKiAgICNHc3RTcGVjdHJ1bTp0aHJlc2hvbGQgcHJvcGVydHkgd2lsbCBiZSBzZXQgdG8gdGhlIHRocmVzaG9sZC4gT25seSBwcmVzZW50CisgKiAgIGlmIHRoZSAjR3N0U3BlY3RydW06bWVzc2FnZS1tYWduaXR1ZGUgcHJvcGVydHkgaXMgJVRSVUUuCisgKiAgIDwvcGFyYT4KKyAqIDwvbGlzdGl0ZW0+CisgKiA8bGlzdGl0ZW0+CisgKiAgIDxwYXJhPgorICogICAjR3N0VmFsdWVMaXN0IG9mICNnZmxvYXQKKyAqICAgPGNsYXNzbmFtZT4mcXVvdDtwaGFzZSZxdW90OzwvY2xhc3NuYW1lPjoKKyAqICAgVGhlIHBoYXNlIGZvciBlYWNoIGZyZXF1ZW5jeSBiYW5kLiBUaGUgdmFsdWUgaXMgYmV0d2VlbiAtcGkgYW5kIHBpLiBPbmx5CisgKiAgIHByZXNlbnQgaWYgdGhlICNHc3RTcGVjdHJ1bTptZXNzYWdlLXBoYXNlIHByb3BlcnR5IGlzICVUUlVFLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPC9pdGVtaXplZGxpc3Q+CisgKgorICogSWYgI0dzdFNwZWN0cnVtOm11bHRpLWNoYW5uZWwgcHJvcGVydHkgaXMgc2V0IHRvIHRydWUuIG1hZ25pdHVkZSBhbmQgcGhhc2UKKyAqIGZpZWxkcyB3aWxsIGJlIGVhY2ggYSBuZXN0ZWQgI0dzdFZhbHVlQXJyYXkuIFRoZSBmaXJzdCBkaW1lbnNpb24gYXJlIHRoZQorICogY2hhbm5lbHMgYW5kIHRoZSBzZWNvbmQgZGltZW5zaW9uIGFyZSB0aGUgdmFsdWVzLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGFwcGxpY2F0aW9uPC90aXRsZT4KKyAqIDxpbmZvcm1hbGV4YW1wbGU+PHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJDIj4KKyAqIDx4aTppbmNsdWRlIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzL1hJbmNsdWRlIiBwYXJzZT0idGV4dCIgaHJlZj0iLi4vLi4vLi4vLi4vdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vc3BlY3RydW0tZXhhbXBsZS5jIiAvPgorICogPC9wcm9ncmFtbGlzdGluZz48L2luZm9ybWFsZXhhbXBsZT4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgImdzdHNwZWN0cnVtLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF9zcGVjdHJ1bV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3Rfc3BlY3RydW1fZGVidWcKKworLyogZWxlbWVudGZhY3RvcnkgaW5mb3JtYXRpb24gKi8KKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisjIGRlZmluZSBGT1JNQVRTICJ7IFMxNkxFLCBTMjRMRSwgUzMyTEUsIEYzMkxFLCBGNjRMRSB9IgorI2Vsc2UKKyMgZGVmaW5lIEZPUk1BVFMgInsgUzE2QkUsIFMyNEJFLCBTMzJCRSwgRjMyQkUsIEY2NEJFIH0iCisjZW5kaWYKKworI2RlZmluZSBBTExPV0VEX0NBUFMgXAorICBHU1RfQVVESU9fQ0FQU19NQUtFIChGT1JNQVRTKSAiLCAiIFwKKyAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkIgorCisvKiBTcGVjdHJ1bSBwcm9wZXJ0aWVzICovCisjZGVmaW5lIERFRkFVTFRfUE9TVF9NRVNTQUdFUwkgICAgICAgIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9NRVNTQUdFX01BR05JVFVERQlUUlVFCisjZGVmaW5lIERFRkFVTFRfTUVTU0FHRV9QSEFTRQkJRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9JTlRFUlZBTAkJKEdTVF9TRUNPTkQgLyAxMCkKKyNkZWZpbmUgREVGQVVMVF9CQU5EUwkJCTEyOAorI2RlZmluZSBERUZBVUxUX1RIUkVTSE9MRAkJLTYwCisjZGVmaW5lIERFRkFVTFRfTVVMVElfQ0hBTk5FTAkJRkFMU0UKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfUE9TVF9NRVNTQUdFUywKKyAgUFJPUF9NRVNTQUdFX01BR05JVFVERSwKKyAgUFJPUF9NRVNTQUdFX1BIQVNFLAorICBQUk9QX0lOVEVSVkFMLAorICBQUk9QX0JBTkRTLAorICBQUk9QX1RIUkVTSE9MRCwKKyAgUFJPUF9NVUxUSV9DSEFOTkVMCit9OworCisjZGVmaW5lIGdzdF9zcGVjdHJ1bV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RTcGVjdHJ1bSwgZ3N0X3NwZWN0cnVtLCBHU1RfVFlQRV9BVURJT19GSUxURVIpOworCitzdGF0aWMgdm9pZCBnc3Rfc3BlY3RydW1fZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X3NwZWN0cnVtX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9zcGVjdHJ1bV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3NwZWN0cnVtX3N0YXJ0IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpOworc3RhdGljIGdib29sZWFuIGdzdF9zcGVjdHJ1bV9zdG9wIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3NwZWN0cnVtX3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdEJ1ZmZlciAqIGluKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfc3BlY3RydW1fc2V0dXAgKEdzdEF1ZGlvRmlsdGVyICogYmFzZSwKKyAgICBjb25zdCBHc3RBdWRpb0luZm8gKiBpbmZvKTsKKworc3RhdGljIHZvaWQKK2dzdF9zcGVjdHJ1bV9jbGFzc19pbml0IChHc3RTcGVjdHJ1bUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqdHJhbnNfY2xhc3MgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QXVkaW9GaWx0ZXJDbGFzcyAqZmlsdGVyX2NsYXNzID0gR1NUX0FVRElPX0ZJTFRFUl9DTEFTUyAoa2xhc3MpOworICBHc3RDYXBzICpjYXBzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9zcGVjdHJ1bV9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9zcGVjdHJ1bV9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3NwZWN0cnVtX2ZpbmFsaXplOworCisgIHRyYW5zX2NsYXNzLT5zdGFydCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BlY3RydW1fc3RhcnQpOworICB0cmFuc19jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfc3BlY3RydW1fc3RvcCk7CisgIHRyYW5zX2NsYXNzLT50cmFuc2Zvcm1faXAgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NwZWN0cnVtX3RyYW5zZm9ybV9pcCk7CisgIHRyYW5zX2NsYXNzLT5wYXNzdGhyb3VnaF9vbl9zYW1lX2NhcHMgPSBUUlVFOworCisgIGZpbHRlcl9jbGFzcy0+c2V0dXAgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3NwZWN0cnVtX3NldHVwKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1BPU1RfTUVTU0FHRVMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInBvc3QtbWVzc2FnZXMiLCAiUG9zdCBNZXNzYWdlcyIsCisgICAgICAgICAgIldoZXRoZXIgdG8gcG9zdCBhICdzcGVjdHJ1bScgZWxlbWVudCBtZXNzYWdlIG9uIHRoZSBidXMgZm9yIGVhY2ggIgorICAgICAgICAgICJwYXNzZWQgaW50ZXJ2YWwiLCBERUZBVUxUX1BPU1RfTUVTU0FHRVMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NRVNTQUdFX01BR05JVFVERSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgibWVzc2FnZS1tYWduaXR1ZGUiLCAiTWFnbml0dWRlIiwKKyAgICAgICAgICAiV2hldGhlciB0byBhZGQgYSAnbWFnbml0dWRlJyBmaWVsZCB0byB0aGUgc3RydWN0dXJlIG9mIGFueSAiCisgICAgICAgICAgIidzcGVjdHJ1bScgZWxlbWVudCBtZXNzYWdlcyBwb3N0ZWQgb24gdGhlIGJ1cyIsCisgICAgICAgICAgREVGQVVMVF9NRVNTQUdFX01BR05JVFVERSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01FU1NBR0VfUEhBU0UsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoIm1lc3NhZ2UtcGhhc2UiLCAiUGhhc2UiLAorICAgICAgICAgICJXaGV0aGVyIHRvIGFkZCBhICdwaGFzZScgZmllbGQgdG8gdGhlIHN0cnVjdHVyZSBvZiBhbnkgIgorICAgICAgICAgICInc3BlY3RydW0nIGVsZW1lbnQgbWVzc2FnZXMgcG9zdGVkIG9uIHRoZSBidXMiLAorICAgICAgICAgIERFRkFVTFRfTUVTU0FHRV9QSEFTRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9JTlRFUlZBTCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJpbnRlcnZhbCIsICJJbnRlcnZhbCIsCisgICAgICAgICAgIkludGVydmFsIG9mIHRpbWUgYmV0d2VlbiBtZXNzYWdlIHBvc3RzIChpbiBuYW5vc2Vjb25kcykiLAorICAgICAgICAgIDEsIEdfTUFYVUlOVDY0LCBERUZBVUxUX0lOVEVSVkFMLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFORFMsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoImJhbmRzIiwgIkJhbmRzIiwgIk51bWJlciBvZiBmcmVxdWVuY3kgYmFuZHMiLAorICAgICAgICAgIDIsICgoZ3VpbnQpIEdfTUFYSU5UICsgMikgLyAyLCBERUZBVUxUX0JBTkRTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVEhSRVNIT0xELAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInRocmVzaG9sZCIsICJUaHJlc2hvbGQiLAorICAgICAgICAgICJkQiB0aHJlc2hvbGQgZm9yIHJlc3VsdC4gQWxsIGxvd2VyIHZhbHVlcyB3aWxsIGJlIHNldCB0byB0aGlzIiwKKyAgICAgICAgICBHX01JTklOVCwgMCwgREVGQVVMVF9USFJFU0hPTEQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NVUxUSV9DSEFOTkVMLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJtdWx0aS1jaGFubmVsIiwgIk11bHRpY2hhbm5lbCByZXN1bHRzIiwKKyAgICAgICAgICAiU2VuZCBzZXBhcmF0ZSByZXN1bHRzIGZvciBlYWNoIGNoYW5uZWwiLAorICAgICAgICAgIERFRkFVTFRfTVVMVElfQ0hBTk5FTCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9zcGVjdHJ1bV9kZWJ1ZywgInNwZWN0cnVtIiwgMCwKKyAgICAgICJhdWRpbyBzcGVjdHJ1bSBhbmFseXNlciBlbGVtZW50Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIlNwZWN0cnVtIGFuYWx5emVyIiwKKyAgICAgICJGaWx0ZXIvQW5hbHl6ZXIvQXVkaW8iLAorICAgICAgIlJ1biBhbiBGRlQgb24gdGhlIGF1ZGlvIHNpZ25hbCwgb3V0cHV0IHNwZWN0cnVtIGRhdGEiLAorICAgICAgIkVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+LCAiCisgICAgICAiU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PiwgIgorICAgICAgIlNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPiIpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQUxMT1dFRF9DQVBTKTsKKyAgZ3N0X2F1ZGlvX2ZpbHRlcl9jbGFzc19hZGRfcGFkX3RlbXBsYXRlcyAoZmlsdGVyX2NsYXNzLCBjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwZWN0cnVtX2luaXQgKEdzdFNwZWN0cnVtICogc3BlY3RydW0pCit7CisgIHNwZWN0cnVtLT5wb3N0X21lc3NhZ2VzID0gREVGQVVMVF9QT1NUX01FU1NBR0VTOworICBzcGVjdHJ1bS0+bWVzc2FnZV9tYWduaXR1ZGUgPSBERUZBVUxUX01FU1NBR0VfTUFHTklUVURFOworICBzcGVjdHJ1bS0+bWVzc2FnZV9waGFzZSA9IERFRkFVTFRfTUVTU0FHRV9QSEFTRTsKKyAgc3BlY3RydW0tPmludGVydmFsID0gREVGQVVMVF9JTlRFUlZBTDsKKyAgc3BlY3RydW0tPmJhbmRzID0gREVGQVVMVF9CQU5EUzsKKyAgc3BlY3RydW0tPnRocmVzaG9sZCA9IERFRkFVTFRfVEhSRVNIT0xEOworCisgIGdfbXV0ZXhfaW5pdCAoJnNwZWN0cnVtLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGVjdHJ1bV9hbGxvY19jaGFubmVsX2RhdGEgKEdzdFNwZWN0cnVtICogc3BlY3RydW0pCit7CisgIGdpbnQgaTsKKyAgR3N0U3BlY3RydW1DaGFubmVsICpjZDsKKyAgZ3VpbnQgYmFuZHMgPSBzcGVjdHJ1bS0+YmFuZHM7CisgIGd1aW50IG5mZnQgPSAyICogYmFuZHMgLSAyOworCisgIGdfYXNzZXJ0IChzcGVjdHJ1bS0+Y2hhbm5lbF9kYXRhID09IE5VTEwpOworCisgIHNwZWN0cnVtLT5udW1fY2hhbm5lbHMgPSAoc3BlY3RydW0tPm11bHRpX2NoYW5uZWwpID8KKyAgICAgIEdTVF9BVURJT19GSUxURVJfQ0hBTk5FTFMgKHNwZWN0cnVtKSA6IDE7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc3BlY3RydW0sICJhbGxvY2F0aW5nIGRhdGEgZm9yICVkIGNoYW5uZWxzIiwKKyAgICAgIHNwZWN0cnVtLT5udW1fY2hhbm5lbHMpOworCisgIHNwZWN0cnVtLT5jaGFubmVsX2RhdGEgPSBnX25ldyAoR3N0U3BlY3RydW1DaGFubmVsLCBzcGVjdHJ1bS0+bnVtX2NoYW5uZWxzKTsKKyAgZm9yIChpID0gMDsgaSA8IHNwZWN0cnVtLT5udW1fY2hhbm5lbHM7IGkrKykgeworICAgIGNkID0gJnNwZWN0cnVtLT5jaGFubmVsX2RhdGFbaV07CisgICAgY2QtPmZmdF9jdHggPSBnc3RfZmZ0X2YzMl9uZXcgKG5mZnQsIEZBTFNFKTsKKyAgICBjZC0+aW5wdXQgPSBnX25ldzAgKGdmbG9hdCwgbmZmdCk7CisgICAgY2QtPmlucHV0X3RtcCA9IGdfbmV3MCAoZ2Zsb2F0LCBuZmZ0KTsKKyAgICBjZC0+ZnJlcWRhdGEgPSBnX25ldzAgKEdzdEZGVEYzMkNvbXBsZXgsIGJhbmRzKTsKKyAgICBjZC0+c3BlY3RfbWFnbml0dWRlID0gZ19uZXcwIChnZmxvYXQsIGJhbmRzKTsKKyAgICBjZC0+c3BlY3RfcGhhc2UgPSBnX25ldzAgKGdmbG9hdCwgYmFuZHMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BlY3RydW1fZnJlZV9jaGFubmVsX2RhdGEgKEdzdFNwZWN0cnVtICogc3BlY3RydW0pCit7CisgIGlmIChzcGVjdHJ1bS0+Y2hhbm5lbF9kYXRhKSB7CisgICAgZ2ludCBpOworICAgIEdzdFNwZWN0cnVtQ2hhbm5lbCAqY2Q7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcGVjdHJ1bSwgImZyZWVpbmcgZGF0YSBmb3IgJWQgY2hhbm5lbHMiLAorICAgICAgICBzcGVjdHJ1bS0+bnVtX2NoYW5uZWxzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzcGVjdHJ1bS0+bnVtX2NoYW5uZWxzOyBpKyspIHsKKyAgICAgIGNkID0gJnNwZWN0cnVtLT5jaGFubmVsX2RhdGFbaV07CisgICAgICBpZiAoY2QtPmZmdF9jdHgpCisgICAgICAgIGdzdF9mZnRfZjMyX2ZyZWUgKGNkLT5mZnRfY3R4KTsKKyAgICAgIGdfZnJlZSAoY2QtPmlucHV0KTsKKyAgICAgIGdfZnJlZSAoY2QtPmlucHV0X3RtcCk7CisgICAgICBnX2ZyZWUgKGNkLT5mcmVxZGF0YSk7CisgICAgICBnX2ZyZWUgKGNkLT5zcGVjdF9tYWduaXR1ZGUpOworICAgICAgZ19mcmVlIChjZC0+c3BlY3RfcGhhc2UpOworICAgIH0KKyAgICBnX2ZyZWUgKHNwZWN0cnVtLT5jaGFubmVsX2RhdGEpOworICAgIHNwZWN0cnVtLT5jaGFubmVsX2RhdGEgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BlY3RydW1fZmx1c2ggKEdzdFNwZWN0cnVtICogc3BlY3RydW0pCit7CisgIHNwZWN0cnVtLT5udW1fZnJhbWVzID0gMDsKKyAgc3BlY3RydW0tPm51bV9mZnQgPSAwOworCisgIHNwZWN0cnVtLT5hY2N1bXVsYXRlZF9lcnJvciA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BlY3RydW1fcmVzZXRfc3RhdGUgKEdzdFNwZWN0cnVtICogc3BlY3RydW0pCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNwZWN0cnVtLCAicmVzZXR0aW5nIHN0YXRlIik7CisKKyAgZ3N0X3NwZWN0cnVtX2ZyZWVfY2hhbm5lbF9kYXRhIChzcGVjdHJ1bSk7CisgIGdzdF9zcGVjdHJ1bV9mbHVzaCAoc3BlY3RydW0pOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwZWN0cnVtX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RTcGVjdHJ1bSAqc3BlY3RydW0gPSBHU1RfU1BFQ1RSVU0gKG9iamVjdCk7CisKKyAgZ3N0X3NwZWN0cnVtX3Jlc2V0X3N0YXRlIChzcGVjdHJ1bSk7CisgIGdfbXV0ZXhfY2xlYXIgKCZzcGVjdHJ1bS0+bG9jayk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwZWN0cnVtX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTcGVjdHJ1bSAqZmlsdGVyID0gR1NUX1NQRUNUUlVNIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QT1NUX01FU1NBR0VTOgorICAgICAgZmlsdGVyLT5wb3N0X21lc3NhZ2VzID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01FU1NBR0VfTUFHTklUVURFOgorICAgICAgZmlsdGVyLT5tZXNzYWdlX21hZ25pdHVkZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NRVNTQUdFX1BIQVNFOgorICAgICAgZmlsdGVyLT5tZXNzYWdlX3BoYXNlID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lOVEVSVkFMOnsKKyAgICAgIGd1aW50NjQgaW50ZXJ2YWwgPSBnX3ZhbHVlX2dldF91aW50NjQgKHZhbHVlKTsKKyAgICAgIGdfbXV0ZXhfbG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBpZiAoZmlsdGVyLT5pbnRlcnZhbCAhPSBpbnRlcnZhbCkgeworICAgICAgICBmaWx0ZXItPmludGVydmFsID0gaW50ZXJ2YWw7CisgICAgICAgIGdzdF9zcGVjdHJ1bV9yZXNldF9zdGF0ZSAoZmlsdGVyKTsKKyAgICAgIH0KKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfQkFORFM6eworICAgICAgZ3VpbnQgYmFuZHMgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBnX211dGV4X2xvY2sgKCZmaWx0ZXItPmxvY2spOworICAgICAgaWYgKGZpbHRlci0+YmFuZHMgIT0gYmFuZHMpIHsKKyAgICAgICAgZmlsdGVyLT5iYW5kcyA9IGJhbmRzOworICAgICAgICBnc3Rfc3BlY3RydW1fcmVzZXRfc3RhdGUgKGZpbHRlcik7CisgICAgICB9CisgICAgICBnX211dGV4X3VubG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX1RIUkVTSE9MRDoKKyAgICAgIGZpbHRlci0+dGhyZXNob2xkID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTVVMVElfQ0hBTk5FTDp7CisgICAgICBnYm9vbGVhbiBtdWx0aV9jaGFubmVsID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgZ19tdXRleF9sb2NrICgmZmlsdGVyLT5sb2NrKTsKKyAgICAgIGlmIChmaWx0ZXItPm11bHRpX2NoYW5uZWwgIT0gbXVsdGlfY2hhbm5lbCkgeworICAgICAgICBmaWx0ZXItPm11bHRpX2NoYW5uZWwgPSBtdWx0aV9jaGFubmVsOworICAgICAgICBnc3Rfc3BlY3RydW1fcmVzZXRfc3RhdGUgKGZpbHRlcik7CisgICAgICB9CisgICAgICBnX211dGV4X3VubG9jayAoJmZpbHRlci0+bG9jayk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwZWN0cnVtX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RTcGVjdHJ1bSAqZmlsdGVyID0gR1NUX1NQRUNUUlVNIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QT1NUX01FU1NBR0VTOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIGZpbHRlci0+cG9zdF9tZXNzYWdlcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUVTU0FHRV9NQUdOSVRVREU6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmlsdGVyLT5tZXNzYWdlX21hZ25pdHVkZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTUVTU0FHRV9QSEFTRToKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCBmaWx0ZXItPm1lc3NhZ2VfcGhhc2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0lOVEVSVkFMOgorICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgZmlsdGVyLT5pbnRlcnZhbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQkFORFM6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgZmlsdGVyLT5iYW5kcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSRVNIT0xEOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgZmlsdGVyLT50aHJlc2hvbGQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01VTFRJX0NIQU5ORUw6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgZmlsdGVyLT5tdWx0aV9jaGFubmVsKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BlY3RydW1fc3RhcnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucykKK3sKKyAgR3N0U3BlY3RydW0gKnNwZWN0cnVtID0gR1NUX1NQRUNUUlVNICh0cmFucyk7CisKKyAgZ3N0X3NwZWN0cnVtX3Jlc2V0X3N0YXRlIChzcGVjdHJ1bSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3NwZWN0cnVtX3N0b3AgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucykKK3sKKyAgR3N0U3BlY3RydW0gKnNwZWN0cnVtID0gR1NUX1NQRUNUUlVNICh0cmFucyk7CisKKyAgZ3N0X3NwZWN0cnVtX3Jlc2V0X3N0YXRlIChzcGVjdHJ1bSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIG1peGluZyBkYXRhIHJlYWRlcnMgKi8KKworc3RhdGljIHZvaWQKK2lucHV0X2RhdGFfbWl4ZWRfZmxvYXQgKGNvbnN0IGd1aW50OCAqIF9pbiwgZ2Zsb2F0ICogb3V0LCBndWludCBsZW4sCisgICAgZ3VpbnQgY2hhbm5lbHMsIGdmbG9hdCBtYXhfdmFsdWUsIGd1aW50IG9wLCBndWludCBuZmZ0KQoreworICBndWludCBpLCBqLCBpcCA9IDA7CisgIGdmbG9hdCB2OworICBnZmxvYXQgKmluID0gKGdmbG9hdCAqKSBfaW47CisKKyAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7CisgICAgdiA9IGluW2lwKytdOworICAgIGZvciAoaSA9IDE7IGkgPCBjaGFubmVsczsgaSsrKQorICAgICAgdiArPSBpbltpcCsrXTsKKyAgICBvdXRbb3BdID0gdiAvIGNoYW5uZWxzOworICAgIG9wID0gKG9wICsgMSkgJSBuZmZ0OworICB9Cit9CisKK3N0YXRpYyB2b2lkCitpbnB1dF9kYXRhX21peGVkX2RvdWJsZSAoY29uc3QgZ3VpbnQ4ICogX2luLCBnZmxvYXQgKiBvdXQsIGd1aW50IGxlbiwKKyAgICBndWludCBjaGFubmVscywgZ2Zsb2F0IG1heF92YWx1ZSwgZ3VpbnQgb3AsIGd1aW50IG5mZnQpCit7CisgIGd1aW50IGksIGosIGlwID0gMDsKKyAgZ2Zsb2F0IHY7CisgIGdkb3VibGUgKmluID0gKGdkb3VibGUgKikgX2luOworCisgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykgeworICAgIHYgPSBpbltpcCsrXTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgY2hhbm5lbHM7IGkrKykKKyAgICAgIHYgKz0gaW5baXArK107CisgICAgb3V0W29wXSA9IHYgLyBjaGFubmVsczsKKyAgICBvcCA9IChvcCArIDEpICUgbmZmdDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAoraW5wdXRfZGF0YV9taXhlZF9pbnQzMl9tYXggKGNvbnN0IGd1aW50OCAqIF9pbiwgZ2Zsb2F0ICogb3V0LCBndWludCBsZW4sCisgICAgZ3VpbnQgY2hhbm5lbHMsIGdmbG9hdCBtYXhfdmFsdWUsIGd1aW50IG9wLCBndWludCBuZmZ0KQoreworICBndWludCBpLCBqLCBpcCA9IDA7CisgIGdpbnQzMiAqaW4gPSAoZ2ludDMyICopIF9pbjsKKyAgZ2Zsb2F0IHY7CisKKyAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7CisgICAgdiA9IGluW2lwKytdIC8gbWF4X3ZhbHVlOworICAgIGZvciAoaSA9IDE7IGkgPCBjaGFubmVsczsgaSsrKQorICAgICAgdiArPSBpbltpcCsrXSAvIG1heF92YWx1ZTsKKyAgICBvdXRbb3BdID0gdiAvIGNoYW5uZWxzOworICAgIG9wID0gKG9wICsgMSkgJSBuZmZ0OworICB9Cit9CisKK3N0YXRpYyB2b2lkCitpbnB1dF9kYXRhX21peGVkX2ludDI0X21heCAoY29uc3QgZ3VpbnQ4ICogX2luLCBnZmxvYXQgKiBvdXQsIGd1aW50IGxlbiwKKyAgICBndWludCBjaGFubmVscywgZ2Zsb2F0IG1heF92YWx1ZSwgZ3VpbnQgb3AsIGd1aW50IG5mZnQpCit7CisgIGd1aW50IGksIGo7CisgIGdmbG9hdCB2ID0gMC4wOworCisgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisjaWYgR19CWVRFX09SREVSID09IEdfQklHX0VORElBTgorICAgICAgZ2ludDMyIHZhbHVlID0gR1NUX1JFQURfVUlOVDI0X0JFIChfaW4pOworI2Vsc2UKKyAgICAgIGdpbnQzMiB2YWx1ZSA9IEdTVF9SRUFEX1VJTlQyNF9MRSAoX2luKTsKKyNlbmRpZgorICAgICAgaWYgKHZhbHVlICYgMHgwMDgwMDAwMCkKKyAgICAgICAgdmFsdWUgfD0gMHhmZjAwMDAwMDsKKyAgICAgIHYgKz0gdmFsdWUgLyBtYXhfdmFsdWU7CisgICAgICBfaW4gKz0gMzsKKyAgICB9CisgICAgb3V0W29wXSA9IHYgLyBjaGFubmVsczsKKyAgICBvcCA9IChvcCArIDEpICUgbmZmdDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAoraW5wdXRfZGF0YV9taXhlZF9pbnQxNl9tYXggKGNvbnN0IGd1aW50OCAqIF9pbiwgZ2Zsb2F0ICogb3V0LCBndWludCBsZW4sCisgICAgZ3VpbnQgY2hhbm5lbHMsIGdmbG9hdCBtYXhfdmFsdWUsIGd1aW50IG9wLCBndWludCBuZmZ0KQoreworICBndWludCBpLCBqLCBpcCA9IDA7CisgIGdpbnQxNiAqaW4gPSAoZ2ludDE2ICopIF9pbjsKKyAgZ2Zsb2F0IHY7CisKKyAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7CisgICAgdiA9IGluW2lwKytdIC8gbWF4X3ZhbHVlOworICAgIGZvciAoaSA9IDE7IGkgPCBjaGFubmVsczsgaSsrKQorICAgICAgdiArPSBpbltpcCsrXSAvIG1heF92YWx1ZTsKKyAgICBvdXRbb3BdID0gdiAvIGNoYW5uZWxzOworICAgIG9wID0gKG9wICsgMSkgJSBuZmZ0OworICB9Cit9CisKKy8qIG5vbiBtaXhpbmcgZGF0YSByZWFkZXJzICovCisKK3N0YXRpYyB2b2lkCitpbnB1dF9kYXRhX2Zsb2F0IChjb25zdCBndWludDggKiBfaW4sIGdmbG9hdCAqIG91dCwgZ3VpbnQgbGVuLCBndWludCBjaGFubmVscywKKyAgICBnZmxvYXQgbWF4X3ZhbHVlLCBndWludCBvcCwgZ3VpbnQgbmZmdCkKK3sKKyAgZ3VpbnQgaiwgaXA7CisgIGdmbG9hdCAqaW4gPSAoZ2Zsb2F0ICopIF9pbjsKKworICBmb3IgKGogPSAwLCBpcCA9IDA7IGogPCBsZW47IGorKywgaXAgKz0gY2hhbm5lbHMpIHsKKyAgICBvdXRbb3BdID0gaW5baXBdOworICAgIG9wID0gKG9wICsgMSkgJSBuZmZ0OworICB9Cit9CisKK3N0YXRpYyB2b2lkCitpbnB1dF9kYXRhX2RvdWJsZSAoY29uc3QgZ3VpbnQ4ICogX2luLCBnZmxvYXQgKiBvdXQsIGd1aW50IGxlbiwgZ3VpbnQgY2hhbm5lbHMsCisgICAgZ2Zsb2F0IG1heF92YWx1ZSwgZ3VpbnQgb3AsIGd1aW50IG5mZnQpCit7CisgIGd1aW50IGosIGlwOworICBnZG91YmxlICppbiA9IChnZG91YmxlICopIF9pbjsKKworICBmb3IgKGogPSAwLCBpcCA9IDA7IGogPCBsZW47IGorKywgaXAgKz0gY2hhbm5lbHMpIHsKKyAgICBvdXRbb3BdID0gaW5baXBdOworICAgIG9wID0gKG9wICsgMSkgJSBuZmZ0OworICB9Cit9CisKK3N0YXRpYyB2b2lkCitpbnB1dF9kYXRhX2ludDMyX21heCAoY29uc3QgZ3VpbnQ4ICogX2luLCBnZmxvYXQgKiBvdXQsIGd1aW50IGxlbiwKKyAgICBndWludCBjaGFubmVscywgZ2Zsb2F0IG1heF92YWx1ZSwgZ3VpbnQgb3AsIGd1aW50IG5mZnQpCit7CisgIGd1aW50IGosIGlwOworICBnaW50MzIgKmluID0gKGdpbnQzMiAqKSBfaW47CisKKyAgZm9yIChqID0gMCwgaXAgPSAwOyBqIDwgbGVuOyBqKyssIGlwICs9IGNoYW5uZWxzKSB7CisgICAgb3V0W29wXSA9IGluW2lwXSAvIG1heF92YWx1ZTsKKyAgICBvcCA9IChvcCArIDEpICUgbmZmdDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAoraW5wdXRfZGF0YV9pbnQyNF9tYXggKGNvbnN0IGd1aW50OCAqIF9pbiwgZ2Zsb2F0ICogb3V0LCBndWludCBsZW4sCisgICAgZ3VpbnQgY2hhbm5lbHMsIGdmbG9hdCBtYXhfdmFsdWUsIGd1aW50IG9wLCBndWludCBuZmZ0KQoreworICBndWludCBqOworCisgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykgeworI2lmIEdfQllURV9PUkRFUiA9PSBHX0JJR19FTkRJQU4KKyAgICBnaW50MzIgdiA9IEdTVF9SRUFEX1VJTlQyNF9CRSAoX2luKTsKKyNlbHNlCisgICAgZ2ludDMyIHYgPSBHU1RfUkVBRF9VSU5UMjRfTEUgKF9pbik7CisjZW5kaWYKKyAgICBpZiAodiAmIDB4MDA4MDAwMDApCisgICAgICB2IHw9IDB4ZmYwMDAwMDA7CisgICAgX2luICs9IDMgKiBjaGFubmVsczsKKyAgICBvdXRbb3BdID0gdiAvIG1heF92YWx1ZTsKKyAgICBvcCA9IChvcCArIDEpICUgbmZmdDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAoraW5wdXRfZGF0YV9pbnQxNl9tYXggKGNvbnN0IGd1aW50OCAqIF9pbiwgZ2Zsb2F0ICogb3V0LCBndWludCBsZW4sCisgICAgZ3VpbnQgY2hhbm5lbHMsIGdmbG9hdCBtYXhfdmFsdWUsIGd1aW50IG9wLCBndWludCBuZmZ0KQoreworICBndWludCBqLCBpcDsKKyAgZ2ludDE2ICppbiA9IChnaW50MTYgKikgX2luOworCisgIGZvciAoaiA9IDAsIGlwID0gMDsgaiA8IGxlbjsgaisrLCBpcCArPSBjaGFubmVscykgeworICAgIG91dFtvcF0gPSBpbltpcF0gLyBtYXhfdmFsdWU7CisgICAgb3AgPSAob3AgKyAxKSAlIG5mZnQ7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfc3BlY3RydW1fc2V0dXAgKEdzdEF1ZGlvRmlsdGVyICogYmFzZSwgY29uc3QgR3N0QXVkaW9JbmZvICogaW5mbykKK3sKKyAgR3N0U3BlY3RydW0gKnNwZWN0cnVtID0gR1NUX1NQRUNUUlVNIChiYXNlKTsKKyAgZ2Jvb2xlYW4gbXVsdGlfY2hhbm5lbCA9IHNwZWN0cnVtLT5tdWx0aV9jaGFubmVsOworICBHc3RTcGVjdHJ1bUlucHV0RGF0YSBpbnB1dF9kYXRhID0gTlVMTDsKKworICBnX211dGV4X2xvY2sgKCZzcGVjdHJ1bS0+bG9jayk7CisgIHN3aXRjaCAoR1NUX0FVRElPX0lORk9fRk9STUFUIChpbmZvKSkgeworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMTY6CisgICAgICBpbnB1dF9kYXRhID0KKyAgICAgICAgICBtdWx0aV9jaGFubmVsID8gaW5wdXRfZGF0YV9pbnQxNl9tYXggOiBpbnB1dF9kYXRhX21peGVkX2ludDE2X21heDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMjQ6CisgICAgICBpbnB1dF9kYXRhID0KKyAgICAgICAgICBtdWx0aV9jaGFubmVsID8gaW5wdXRfZGF0YV9pbnQyNF9tYXggOiBpbnB1dF9kYXRhX21peGVkX2ludDI0X21heDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMzI6CisgICAgICBpbnB1dF9kYXRhID0KKyAgICAgICAgICBtdWx0aV9jaGFubmVsID8gaW5wdXRfZGF0YV9pbnQzMl9tYXggOiBpbnB1dF9kYXRhX21peGVkX2ludDMyX21heDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9GMzI6CisgICAgICBpbnB1dF9kYXRhID0gbXVsdGlfY2hhbm5lbCA/IGlucHV0X2RhdGFfZmxvYXQgOiBpbnB1dF9kYXRhX21peGVkX2Zsb2F0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX0Y2NDoKKyAgICAgIGlucHV0X2RhdGEgPSBtdWx0aV9jaGFubmVsID8gaW5wdXRfZGF0YV9kb3VibGUgOiBpbnB1dF9kYXRhX21peGVkX2RvdWJsZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9CisgIHNwZWN0cnVtLT5pbnB1dF9kYXRhID0gaW5wdXRfZGF0YTsKKworICBnc3Rfc3BlY3RydW1fcmVzZXRfc3RhdGUgKHNwZWN0cnVtKTsKKyAgZ19tdXRleF91bmxvY2sgKCZzcGVjdHJ1bS0+bG9jayk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHVmFsdWUgKgorZ3N0X3NwZWN0cnVtX21lc3NhZ2VfYWRkX2NvbnRhaW5lciAoR3N0U3RydWN0dXJlICogcywgR1R5cGUgdHlwZSwKKyAgICBjb25zdCBnY2hhciAqIG5hbWUpCit7CisgIEdWYWx1ZSB2ID0geyAwLCB9OworCisgIGdfdmFsdWVfaW5pdCAoJnYsIHR5cGUpOworICAvKiB3aWxsIGNvcHktYnktdmFsdWUgKi8KKyAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKHMsIG5hbWUsICZ2KTsKKyAgZ192YWx1ZV91bnNldCAoJnYpOworICByZXR1cm4gKEdWYWx1ZSAqKSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfc3BlY3RydW1fbWVzc2FnZV9hZGRfbGlzdCAoR1ZhbHVlICogY3YsIGdmbG9hdCAqIGRhdGEsIGd1aW50IG51bV92YWx1ZXMpCit7CisgIEdWYWx1ZSB2ID0geyAwLCB9OworICBndWludCBpOworCisgIGdfdmFsdWVfaW5pdCAoJnYsIEdfVFlQRV9GTE9BVCk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fdmFsdWVzOyBpKyspIHsKKyAgICBnX3ZhbHVlX3NldF9mbG9hdCAoJnYsIGRhdGFbaV0pOworICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoY3YsICZ2KTsgICAgICAgLyogY29waWVzIGJ5IHZhbHVlICovCisgIH0KKyAgZ192YWx1ZV91bnNldCAoJnYpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwZWN0cnVtX21lc3NhZ2VfYWRkX2FycmF5IChHVmFsdWUgKiBjdiwgZ2Zsb2F0ICogZGF0YSwgZ3VpbnQgbnVtX3ZhbHVlcykKK3sKKyAgR1ZhbHVlIHYgPSB7IDAsIH07CisgIEdWYWx1ZSBhID0geyAwLCB9OworICBndWludCBpOworCisgIGdfdmFsdWVfaW5pdCAoJmEsIEdTVF9UWVBFX0FSUkFZKTsKKworICBnX3ZhbHVlX2luaXQgKCZ2LCBHX1RZUEVfRkxPQVQpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3ZhbHVlczsgaSsrKSB7CisgICAgZ192YWx1ZV9zZXRfZmxvYXQgKCZ2LCBkYXRhW2ldKTsKKyAgICBnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX3ZhbHVlICgmYSwgJnYpOyAgICAgIC8qIGNvcGllcyBieSB2YWx1ZSAqLworICB9CisgIGdfdmFsdWVfdW5zZXQgKCZ2KTsKKworICBnc3RfdmFsdWVfYXJyYXlfYXBwZW5kX3ZhbHVlIChjdiwgJmEpOyAgICAgICAgLyogY29waWVzIGJ5IHZhbHVlICovCisgIGdfdmFsdWVfdW5zZXQgKCZhKTsKK30KKworc3RhdGljIEdzdE1lc3NhZ2UgKgorZ3N0X3NwZWN0cnVtX21lc3NhZ2VfbmV3IChHc3RTcGVjdHJ1bSAqIHNwZWN0cnVtLCBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLAorICAgIEdzdENsb2NrVGltZSBkdXJhdGlvbikKK3sKKyAgR3N0QmFzZVRyYW5zZm9ybSAqdHJhbnMgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0FTVCAoc3BlY3RydW0pOworICBHc3RTcGVjdHJ1bUNoYW5uZWwgKmNkOworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdWYWx1ZSAqbWN2ID0gTlVMTCwgKnBjdiA9IE5VTEw7CisgIEdzdENsb2NrVGltZSBlbmR0aW1lLCBydW5uaW5nX3RpbWUsIHN0cmVhbV90aW1lOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNwZWN0cnVtLCAicHJlcGFyaW5nIG1lc3NhZ2UsIGJhbmRzID0lZCAiLCBzcGVjdHJ1bS0+YmFuZHMpOworCisgIHJ1bm5pbmdfdGltZSA9IGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJnRyYW5zLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICB0aW1lc3RhbXApOworICBzdHJlYW1fdGltZSA9IGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmdHJhbnMtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgIHRpbWVzdGFtcCk7CisgIC8qIGVuZHRpbWUgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisgIGVuZHRpbWUgPSBzdHJlYW1fdGltZSArIGR1cmF0aW9uOworCisgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoInNwZWN0cnVtIiwKKyAgICAgICJlbmR0aW1lIiwgR1NUX1RZUEVfQ0xPQ0tfVElNRSwgZW5kdGltZSwKKyAgICAgICJ0aW1lc3RhbXAiLCBHX1RZUEVfVUlOVDY0LCB0aW1lc3RhbXAsCisgICAgICAic3RyZWFtLXRpbWUiLCBHX1RZUEVfVUlOVDY0LCBzdHJlYW1fdGltZSwKKyAgICAgICJydW5uaW5nLXRpbWUiLCBHX1RZUEVfVUlOVDY0LCBydW5uaW5nX3RpbWUsCisgICAgICAiZHVyYXRpb24iLCBHX1RZUEVfVUlOVDY0LCBkdXJhdGlvbiwgTlVMTCk7CisKKyAgaWYgKCFzcGVjdHJ1bS0+bXVsdGlfY2hhbm5lbCkgeworICAgIGNkID0gJnNwZWN0cnVtLT5jaGFubmVsX2RhdGFbMF07CisKKyAgICBpZiAoc3BlY3RydW0tPm1lc3NhZ2VfbWFnbml0dWRlKSB7CisgICAgICAvKiBGSVhNRSAwLjExOiB0aGlzIHNob3VsZCBiZSBhbiBhcnJheSwgbm90IGEgbGlzdCAqLworICAgICAgbWN2ID0gZ3N0X3NwZWN0cnVtX21lc3NhZ2VfYWRkX2NvbnRhaW5lciAocywgR1NUX1RZUEVfTElTVCwgIm1hZ25pdHVkZSIpOworICAgICAgZ3N0X3NwZWN0cnVtX21lc3NhZ2VfYWRkX2xpc3QgKG1jdiwgY2QtPnNwZWN0X21hZ25pdHVkZSwgc3BlY3RydW0tPmJhbmRzKTsKKyAgICB9CisgICAgaWYgKHNwZWN0cnVtLT5tZXNzYWdlX3BoYXNlKSB7CisgICAgICAvKiBGSVhNRSAwLjExOiB0aGlzIHNob3VsZCBiZSBhbiBhcnJheSwgbm90IGEgbGlzdCAqLworICAgICAgcGN2ID0gZ3N0X3NwZWN0cnVtX21lc3NhZ2VfYWRkX2NvbnRhaW5lciAocywgR1NUX1RZUEVfTElTVCwgInBoYXNlIik7CisgICAgICBnc3Rfc3BlY3RydW1fbWVzc2FnZV9hZGRfbGlzdCAocGN2LCBjZC0+c3BlY3RfcGhhc2UsIHNwZWN0cnVtLT5iYW5kcyk7CisgICAgfQorICB9IGVsc2UgeworICAgIGd1aW50IGM7CisgICAgZ3VpbnQgY2hhbm5lbHMgPSBHU1RfQVVESU9fRklMVEVSX0NIQU5ORUxTIChzcGVjdHJ1bSk7CisKKyAgICBpZiAoc3BlY3RydW0tPm1lc3NhZ2VfbWFnbml0dWRlKSB7CisgICAgICBtY3YgPSBnc3Rfc3BlY3RydW1fbWVzc2FnZV9hZGRfY29udGFpbmVyIChzLCBHU1RfVFlQRV9BUlJBWSwgIm1hZ25pdHVkZSIpOworICAgIH0KKyAgICBpZiAoc3BlY3RydW0tPm1lc3NhZ2VfcGhhc2UpIHsKKyAgICAgIHBjdiA9IGdzdF9zcGVjdHJ1bV9tZXNzYWdlX2FkZF9jb250YWluZXIgKHMsIEdTVF9UWVBFX0FSUkFZLCAicGhhc2UiKTsKKyAgICB9CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykgeworICAgICAgY2QgPSAmc3BlY3RydW0tPmNoYW5uZWxfZGF0YVtjXTsKKworICAgICAgaWYgKHNwZWN0cnVtLT5tZXNzYWdlX21hZ25pdHVkZSkgeworICAgICAgICBnc3Rfc3BlY3RydW1fbWVzc2FnZV9hZGRfYXJyYXkgKG1jdiwgY2QtPnNwZWN0X21hZ25pdHVkZSwKKyAgICAgICAgICAgIHNwZWN0cnVtLT5iYW5kcyk7CisgICAgICB9CisgICAgICBpZiAoc3BlY3RydW0tPm1lc3NhZ2VfcGhhc2UpIHsKKyAgICAgICAgZ3N0X3NwZWN0cnVtX21lc3NhZ2VfYWRkX2FycmF5IChwY3YsIGNkLT5zcGVjdF9waGFzZSwgc3BlY3RydW0tPmJhbmRzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGdzdF9tZXNzYWdlX25ld19lbGVtZW50IChHU1RfT0JKRUNUIChzcGVjdHJ1bSksIHMpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3NwZWN0cnVtX3J1bl9mZnQgKEdzdFNwZWN0cnVtICogc3BlY3RydW0sIEdzdFNwZWN0cnVtQ2hhbm5lbCAqIGNkLAorICAgIGd1aW50IGlucHV0X3BvcykKK3sKKyAgZ3VpbnQgaTsKKyAgZ3VpbnQgYmFuZHMgPSBzcGVjdHJ1bS0+YmFuZHM7CisgIGd1aW50IG5mZnQgPSAyICogYmFuZHMgLSAyOworICBnaW50IHRocmVzaG9sZCA9IHNwZWN0cnVtLT50aHJlc2hvbGQ7CisgIGdmbG9hdCAqaW5wdXQgPSBjZC0+aW5wdXQ7CisgIGdmbG9hdCAqaW5wdXRfdG1wID0gY2QtPmlucHV0X3RtcDsKKyAgZ2Zsb2F0ICpzcGVjdF9tYWduaXR1ZGUgPSBjZC0+c3BlY3RfbWFnbml0dWRlOworICBnZmxvYXQgKnNwZWN0X3BoYXNlID0gY2QtPnNwZWN0X3BoYXNlOworICBHc3RGRlRGMzJDb21wbGV4ICpmcmVxZGF0YSA9IGNkLT5mcmVxZGF0YTsKKyAgR3N0RkZURjMyICpmZnRfY3R4ID0gY2QtPmZmdF9jdHg7CisKKyAgZm9yIChpID0gMDsgaSA8IG5mZnQ7IGkrKykKKyAgICBpbnB1dF90bXBbaV0gPSBpbnB1dFsoaW5wdXRfcG9zICsgaSkgJSBuZmZ0XTsKKworICBnc3RfZmZ0X2YzMl93aW5kb3cgKGZmdF9jdHgsIGlucHV0X3RtcCwgR1NUX0ZGVF9XSU5ET1dfSEFNTUlORyk7CisKKyAgZ3N0X2ZmdF9mMzJfZmZ0IChmZnRfY3R4LCBpbnB1dF90bXAsIGZyZXFkYXRhKTsKKworICBpZiAoc3BlY3RydW0tPm1lc3NhZ2VfbWFnbml0dWRlKSB7CisgICAgZ2RvdWJsZSB2YWw7CisgICAgLyogQ2FsY3VsYXRlIG1hZ25pdHVkZSBpbiBkYiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBiYW5kczsgaSsrKSB7CisgICAgICB2YWwgPSBmcmVxZGF0YVtpXS5yICogZnJlcWRhdGFbaV0ucjsKKyAgICAgIHZhbCArPSBmcmVxZGF0YVtpXS5pICogZnJlcWRhdGFbaV0uaTsKKyAgICAgIHZhbCAvPSBuZmZ0ICogbmZmdDsKKyAgICAgIHZhbCA9IDEwLjAgKiBsb2cxMCAodmFsKTsKKyAgICAgIGlmICh2YWwgPCB0aHJlc2hvbGQpCisgICAgICAgIHZhbCA9IHRocmVzaG9sZDsKKyAgICAgIHNwZWN0X21hZ25pdHVkZVtpXSArPSB2YWw7CisgICAgfQorICB9CisKKyAgaWYgKHNwZWN0cnVtLT5tZXNzYWdlX3BoYXNlKSB7CisgICAgLyogQ2FsY3VsYXRlIHBoYXNlICovCisgICAgZm9yIChpID0gMDsgaSA8IGJhbmRzOyBpKyspCisgICAgICBzcGVjdF9waGFzZVtpXSArPSBhdGFuMiAoZnJlcWRhdGFbaV0uaSwgZnJlcWRhdGFbaV0ucik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGVjdHJ1bV9wcmVwYXJlX21lc3NhZ2VfZGF0YSAoR3N0U3BlY3RydW0gKiBzcGVjdHJ1bSwKKyAgICBHc3RTcGVjdHJ1bUNoYW5uZWwgKiBjZCkKK3sKKyAgZ3VpbnQgaTsKKyAgZ3VpbnQgYmFuZHMgPSBzcGVjdHJ1bS0+YmFuZHM7CisgIGd1aW50IG51bV9mZnQgPSBzcGVjdHJ1bS0+bnVtX2ZmdDsKKworICAvKiBDYWxjdWxhdGUgYXZlcmFnZSAqLworICBpZiAoc3BlY3RydW0tPm1lc3NhZ2VfbWFnbml0dWRlKSB7CisgICAgZ2Zsb2F0ICpzcGVjdF9tYWduaXR1ZGUgPSBjZC0+c3BlY3RfbWFnbml0dWRlOworICAgIGZvciAoaSA9IDA7IGkgPCBiYW5kczsgaSsrKQorICAgICAgc3BlY3RfbWFnbml0dWRlW2ldIC89IG51bV9mZnQ7CisgIH0KKyAgaWYgKHNwZWN0cnVtLT5tZXNzYWdlX3BoYXNlKSB7CisgICAgZ2Zsb2F0ICpzcGVjdF9waGFzZSA9IGNkLT5zcGVjdF9waGFzZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYmFuZHM7IGkrKykKKyAgICAgIHNwZWN0X3BoYXNlW2ldIC89IG51bV9mZnQ7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9zcGVjdHJ1bV9yZXNldF9tZXNzYWdlX2RhdGEgKEdzdFNwZWN0cnVtICogc3BlY3RydW0sCisgICAgR3N0U3BlY3RydW1DaGFubmVsICogY2QpCit7CisgIGd1aW50IGJhbmRzID0gc3BlY3RydW0tPmJhbmRzOworICBnZmxvYXQgKnNwZWN0X21hZ25pdHVkZSA9IGNkLT5zcGVjdF9tYWduaXR1ZGU7CisgIGdmbG9hdCAqc3BlY3RfcGhhc2UgPSBjZC0+c3BlY3RfcGhhc2U7CisKKyAgLyogcmVzZXQgc3BlY3RydW0gYWNjdW11bGF0b3JzICovCisgIG1lbXNldCAoc3BlY3RfbWFnbml0dWRlLCAwLCBiYW5kcyAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIG1lbXNldCAoc3BlY3RfcGhhc2UsIDAsIGJhbmRzICogc2l6ZW9mIChnZmxvYXQpKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9zcGVjdHJ1bV90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RTcGVjdHJ1bSAqc3BlY3RydW0gPSBHU1RfU1BFQ1RSVU0gKHRyYW5zKTsKKyAgZ3VpbnQgcmF0ZSA9IEdTVF9BVURJT19GSUxURVJfUkFURSAoc3BlY3RydW0pOworICBndWludCBjaGFubmVscyA9IEdTVF9BVURJT19GSUxURVJfQ0hBTk5FTFMgKHNwZWN0cnVtKTsKKyAgZ3VpbnQgYnBzID0gR1NUX0FVRElPX0ZJTFRFUl9CUFMgKHNwZWN0cnVtKTsKKyAgZ3VpbnQgYnBmID0gR1NUX0FVRElPX0ZJTFRFUl9CUEYgKHNwZWN0cnVtKTsKKyAgZ3VpbnQgb3V0cHV0X2NoYW5uZWxzID0gc3BlY3RydW0tPm11bHRpX2NoYW5uZWwgPyBjaGFubmVscyA6IDE7CisgIGd1aW50IGM7CisgIGdmbG9hdCBtYXhfdmFsdWUgPSAoMVVMIDw8ICgoYnBzIDw8IDMpIC0gMSkpIC0gMTsKKyAgZ3VpbnQgYmFuZHMgPSBzcGVjdHJ1bS0+YmFuZHM7CisgIGd1aW50IG5mZnQgPSAyICogYmFuZHMgLSAyOworICBndWludCBpbnB1dF9wb3M7CisgIGdmbG9hdCAqaW5wdXQ7CisgIEdzdE1hcEluZm8gbWFwOworICBjb25zdCBndWludDggKmRhdGE7CisgIGdzaXplIHNpemU7CisgIGd1aW50IGZmdF90b2RvLCBtc2dfdG9kbywgYmxvY2tfc2l6ZTsKKyAgZ2Jvb2xlYW4gaGF2ZV9mdWxsX2ludGVydmFsOworICBHc3RTcGVjdHJ1bUNoYW5uZWwgKmNkOworICBHc3RTcGVjdHJ1bUlucHV0RGF0YSBpbnB1dF9kYXRhOworCisgIGdfbXV0ZXhfbG9jayAoJnNwZWN0cnVtLT5sb2NrKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBzaXplID0gbWFwLnNpemU7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNwZWN0cnVtLCAiaW5wdXQgc2l6ZTogJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyIsIHNpemUpOworCisgIGlmIChHU1RfQlVGRkVSX0lTX0RJU0NPTlQgKGJ1ZmZlcikpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcGVjdHJ1bSwgIkRpc2NvbnRpbnVpdHkgZGV0ZWN0ZWQgLS0gZmx1c2hpbmciKTsKKyAgICBnc3Rfc3BlY3RydW1fZmx1c2ggKHNwZWN0cnVtKTsKKyAgfQorCisgIC8qIElmIHdlIGRvbid0IGhhdmUgYSBGRlQgY29udGV4dCB5ZXQgKG9yIGl0IHdhcyByZXNldCBkdWUgdG8gcGFyYW1ldGVyCisgICAqIGNoYW5nZXMpIGdldCBvbmUgYW5kIGFsbG9jYXRlIG1lbW9yeSBmb3IgZXZlcnl0aGluZworICAgKi8KKyAgaWYgKHNwZWN0cnVtLT5jaGFubmVsX2RhdGEgPT0gTlVMTCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNwZWN0cnVtLCAiYWxsb2NhdGluZyBmb3IgYmFuZHMgJXUiLCBiYW5kcyk7CisKKyAgICBnc3Rfc3BlY3RydW1fYWxsb2NfY2hhbm5lbF9kYXRhIChzcGVjdHJ1bSk7CisKKyAgICAvKiBudW1iZXIgb2Ygc2FtcGxlIGZyYW1lcyB3ZSBwcm9jZXNzIGJlZm9yZSBwb3N0aW5nIGEgbWVzc2FnZQorICAgICAqIGludGVydmFsIGlzIGluIG5zICovCisgICAgc3BlY3RydW0tPmZyYW1lc19wZXJfaW50ZXJ2YWwgPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNwZWN0cnVtLT5pbnRlcnZhbCwgcmF0ZSwgR1NUX1NFQ09ORCk7CisgICAgc3BlY3RydW0tPmZyYW1lc190b2RvID0gc3BlY3RydW0tPmZyYW1lc19wZXJfaW50ZXJ2YWw7CisgICAgLyogcm91bmRpbmcgZXJyb3IgZm9yIGZyYW1lc19wZXJfaW50ZXJ2YWwgaW4gbnMsCisgICAgICogYWdncmVnYXRlZCBpdCBpbiBhY2N1bXVsYXRlZF9lcnJvciAqLworICAgIHNwZWN0cnVtLT5lcnJvcl9wZXJfaW50ZXJ2YWwgPSAoc3BlY3RydW0tPmludGVydmFsICogcmF0ZSkgJSBHU1RfU0VDT05EOworICAgIGlmIChzcGVjdHJ1bS0+ZnJhbWVzX3Blcl9pbnRlcnZhbCA9PSAwKQorICAgICAgc3BlY3RydW0tPmZyYW1lc19wZXJfaW50ZXJ2YWwgPSAxOworCisgICAgR1NUX0lORk9fT0JKRUNUIChzcGVjdHJ1bSwgImludGVydmFsICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBmcGkgJSIKKyAgICAgICAgR19HVUlOVDY0X0ZPUk1BVCAiLCBlcnJvciAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHNwZWN0cnVtLT5pbnRlcnZhbCksIHNwZWN0cnVtLT5mcmFtZXNfcGVyX2ludGVydmFsLAorICAgICAgICBHU1RfVElNRV9BUkdTIChzcGVjdHJ1bS0+ZXJyb3JfcGVyX2ludGVydmFsKSk7CisKKyAgICBzcGVjdHJ1bS0+aW5wdXRfcG9zID0gMDsKKworICAgIGdzdF9zcGVjdHJ1bV9mbHVzaCAoc3BlY3RydW0pOworICB9CisKKyAgaWYgKHNwZWN0cnVtLT5udW1fZnJhbWVzID09IDApCisgICAgc3BlY3RydW0tPm1lc3NhZ2VfdHMgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKTsKKworICBpbnB1dF9wb3MgPSBzcGVjdHJ1bS0+aW5wdXRfcG9zOworICBpbnB1dF9kYXRhID0gc3BlY3RydW0tPmlucHV0X2RhdGE7CisKKyAgd2hpbGUgKHNpemUgPj0gYnBmKSB7CisgICAgLyogcnVuIGlucHV0X2RhdGEgZm9yIGEgY2h1bmsgb2YgZGF0YSAqLworICAgIGZmdF90b2RvID0gbmZmdCAtIChzcGVjdHJ1bS0+bnVtX2ZyYW1lcyAlIG5mZnQpOworICAgIG1zZ190b2RvID0gc3BlY3RydW0tPmZyYW1lc190b2RvIC0gc3BlY3RydW0tPm51bV9mcmFtZXM7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNwZWN0cnVtLAorICAgICAgICAibWVzc2FnZSBmcmFtZXMgdG9kbzogJXUsIGZmdCBmcmFtZXMgdG9kbzogJXUsIGlucHV0IGZyYW1lcyAlIgorICAgICAgICBHX0dTSVpFX0ZPUk1BVCwgbXNnX3RvZG8sIGZmdF90b2RvLCAoc2l6ZSAvIGJwZikpOworICAgIGJsb2NrX3NpemUgPSBtc2dfdG9kbzsKKyAgICBpZiAoYmxvY2tfc2l6ZSA+IChzaXplIC8gYnBmKSkKKyAgICAgIGJsb2NrX3NpemUgPSAoc2l6ZSAvIGJwZik7CisgICAgaWYgKGJsb2NrX3NpemUgPiBmZnRfdG9kbykKKyAgICAgIGJsb2NrX3NpemUgPSBmZnRfdG9kbzsKKworICAgIGZvciAoYyA9IDA7IGMgPCBvdXRwdXRfY2hhbm5lbHM7IGMrKykgeworICAgICAgY2QgPSAmc3BlY3RydW0tPmNoYW5uZWxfZGF0YVtjXTsKKyAgICAgIGlucHV0ID0gY2QtPmlucHV0OworICAgICAgLyogTW92ZSB0aGUgY3VycmVudCBmcmFtZXMgaW50byBvdXIgcmluZ2J1ZmZlcnMgKi8KKyAgICAgIGlucHV0X2RhdGEgKGRhdGEgKyBjICogYnBzLCBpbnB1dCwgYmxvY2tfc2l6ZSwgY2hhbm5lbHMsIG1heF92YWx1ZSwKKyAgICAgICAgICBpbnB1dF9wb3MsIG5mZnQpOworICAgIH0KKyAgICBkYXRhICs9IGJsb2NrX3NpemUgKiBicGY7CisgICAgc2l6ZSAtPSBibG9ja19zaXplICogYnBmOworICAgIGlucHV0X3BvcyA9IChpbnB1dF9wb3MgKyBibG9ja19zaXplKSAlIG5mZnQ7CisgICAgc3BlY3RydW0tPm51bV9mcmFtZXMgKz0gYmxvY2tfc2l6ZTsKKworICAgIGhhdmVfZnVsbF9pbnRlcnZhbCA9IChzcGVjdHJ1bS0+bnVtX2ZyYW1lcyA9PSBzcGVjdHJ1bS0+ZnJhbWVzX3RvZG8pOworCisgICAgR1NUX0xPR19PQkpFQ1QgKHNwZWN0cnVtLAorICAgICAgICAic2l6ZTogJSIgR19HU0laRV9GT1JNQVQgIiwgZG8tZmZ0ID0gJWQsIGRvLW1lc3NhZ2UgPSAlZCIsIHNpemUsCisgICAgICAgIChzcGVjdHJ1bS0+bnVtX2ZyYW1lcyAlIG5mZnQgPT0gMCksIGhhdmVfZnVsbF9pbnRlcnZhbCk7CisKKyAgICAvKiBJZiB3ZSBoYXZlIGVub3VnaCBmcmFtZXMgZm9yIGFuIEZGVCBvciB3ZSBoYXZlIGFsbCBmcmFtZXMgcmVxdWlyZWQgZm9yCisgICAgICogdGhlIGludGVydmFsIGFuZCB3ZSBoYXZlbid0IHJ1biBhIEZGVCwgdGhlbiBydW4gYW4gRkZUICovCisgICAgaWYgKChzcGVjdHJ1bS0+bnVtX2ZyYW1lcyAlIG5mZnQgPT0gMCkgfHwKKyAgICAgICAgKGhhdmVfZnVsbF9pbnRlcnZhbCAmJiAhc3BlY3RydW0tPm51bV9mZnQpKSB7CisgICAgICBmb3IgKGMgPSAwOyBjIDwgb3V0cHV0X2NoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgY2QgPSAmc3BlY3RydW0tPmNoYW5uZWxfZGF0YVtjXTsKKyAgICAgICAgZ3N0X3NwZWN0cnVtX3J1bl9mZnQgKHNwZWN0cnVtLCBjZCwgaW5wdXRfcG9zKTsKKyAgICAgIH0KKyAgICAgIHNwZWN0cnVtLT5udW1fZmZ0Kys7CisgICAgfQorCisgICAgLyogRG8gd2UgaGF2ZSB0aGUgRkZUcyBmb3Igb25lIGludGVydmFsPyAqLworICAgIGlmIChoYXZlX2Z1bGxfaW50ZXJ2YWwpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNwZWN0cnVtLCAibmZmdDogJXUgZnJhbWVzOiAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgIiBmcGk6ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiBlcnJvcjogJSIgR1NUX1RJTUVfRk9STUFULCBuZmZ0LAorICAgICAgICAgIHNwZWN0cnVtLT5udW1fZnJhbWVzLCBzcGVjdHJ1bS0+ZnJhbWVzX3Blcl9pbnRlcnZhbCwKKyAgICAgICAgICBHU1RfVElNRV9BUkdTIChzcGVjdHJ1bS0+YWNjdW11bGF0ZWRfZXJyb3IpKTsKKworICAgICAgc3BlY3RydW0tPmZyYW1lc190b2RvID0gc3BlY3RydW0tPmZyYW1lc19wZXJfaW50ZXJ2YWw7CisgICAgICBpZiAoc3BlY3RydW0tPmFjY3VtdWxhdGVkX2Vycm9yID49IEdTVF9TRUNPTkQpIHsKKyAgICAgICAgc3BlY3RydW0tPmFjY3VtdWxhdGVkX2Vycm9yIC09IEdTVF9TRUNPTkQ7CisgICAgICAgIHNwZWN0cnVtLT5mcmFtZXNfdG9kbysrOworICAgICAgfQorICAgICAgc3BlY3RydW0tPmFjY3VtdWxhdGVkX2Vycm9yICs9IHNwZWN0cnVtLT5lcnJvcl9wZXJfaW50ZXJ2YWw7CisKKyAgICAgIGlmIChzcGVjdHJ1bS0+cG9zdF9tZXNzYWdlcykgeworICAgICAgICBHc3RNZXNzYWdlICptOworCisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBvdXRwdXRfY2hhbm5lbHM7IGMrKykgeworICAgICAgICAgIGNkID0gJnNwZWN0cnVtLT5jaGFubmVsX2RhdGFbY107CisgICAgICAgICAgZ3N0X3NwZWN0cnVtX3ByZXBhcmVfbWVzc2FnZV9kYXRhIChzcGVjdHJ1bSwgY2QpOworICAgICAgICB9CisKKyAgICAgICAgbSA9IGdzdF9zcGVjdHJ1bV9tZXNzYWdlX25ldyAoc3BlY3RydW0sIHNwZWN0cnVtLT5tZXNzYWdlX3RzLAorICAgICAgICAgICAgc3BlY3RydW0tPmludGVydmFsKTsKKworICAgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UIChzcGVjdHJ1bSksIG0pOworICAgICAgfQorCisgICAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHNwZWN0cnVtLT5tZXNzYWdlX3RzKSkKKyAgICAgICAgc3BlY3RydW0tPm1lc3NhZ2VfdHMgKz0KKyAgICAgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoc3BlY3RydW0tPm51bV9mcmFtZXMsIEdTVF9TRUNPTkQsIHJhdGUpOworCisgICAgICBmb3IgKGMgPSAwOyBjIDwgb3V0cHV0X2NoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgY2QgPSAmc3BlY3RydW0tPmNoYW5uZWxfZGF0YVtjXTsKKyAgICAgICAgZ3N0X3NwZWN0cnVtX3Jlc2V0X21lc3NhZ2VfZGF0YSAoc3BlY3RydW0sIGNkKTsKKyAgICAgIH0KKyAgICAgIHNwZWN0cnVtLT5udW1fZnJhbWVzID0gMDsKKyAgICAgIHNwZWN0cnVtLT5udW1fZmZ0ID0gMDsKKyAgICB9CisgIH0KKworICBzcGVjdHJ1bS0+aW5wdXRfcG9zID0gaW5wdXRfcG9zOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIGdfbXV0ZXhfdW5sb2NrICgmc3BlY3RydW0tPmxvY2spOworCisgIGdfYXNzZXJ0IChzaXplID09IDApOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInNwZWN0cnVtIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgIEdTVF9UWVBFX1NQRUNUUlVNKTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHNwZWN0cnVtLAorICAgICJSdW4gYW4gRkZUIG9uIHRoZSBhdWRpbyBzaWduYWwsIG91dHB1dCBzcGVjdHJ1bSBkYXRhIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5oIGIvZ3N0L3NwZWN0cnVtL2dzdHNwZWN0cnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlN2U4YQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC9zcGVjdHJ1bS9nc3RzcGVjdHJ1bS5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9TUEVDVFJVTV9IX18KKyNkZWZpbmUgX19HU1RfU1BFQ1RSVU1fSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvZmlsdGVyLmg+CisjaW5jbHVkZSA8Z3N0L2ZmdC9nc3RmZnRmMzIuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1NQRUNUUlVNICAgICAgICAgICAgKGdzdF9zcGVjdHJ1bV9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfU1BFQ1RSVU0ob2JqKSAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9TUEVDVFJVTSxHc3RTcGVjdHJ1bSkpCisjZGVmaW5lIEdTVF9JU19TUEVDVFJVTShvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1NQRUNUUlVNKSkKKyNkZWZpbmUgR1NUX1NQRUNUUlVNX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSwgR1NUX1RZUEVfU1BFQ1RSVU0sR3N0U3BlY3RydW1DbGFzcykpCisjZGVmaW5lIEdTVF9JU19TUEVDVFJVTV9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksIEdTVF9UWVBFX1NQRUNUUlVNKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RTcGVjdHJ1bSBHc3RTcGVjdHJ1bTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RTcGVjdHJ1bUNsYXNzIEdzdFNwZWN0cnVtQ2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBfR3N0U3BlY3RydW1DaGFubmVsIEdzdFNwZWN0cnVtQ2hhbm5lbDsKKwordHlwZWRlZiB2b2lkICgqR3N0U3BlY3RydW1JbnB1dERhdGEpKGNvbnN0IGd1aW50OCAqIGluLCBnZmxvYXQgKiBvdXQsCisgICAgZ3VpbnQgbGVuLCBndWludCBjaGFubmVscywgZ2Zsb2F0IG1heF92YWx1ZSwgZ3VpbnQgb3AsIGd1aW50IG5mZnQpOworCitzdHJ1Y3QgX0dzdFNwZWN0cnVtQ2hhbm5lbAoreworICBnZmxvYXQgKmlucHV0OworICBnZmxvYXQgKmlucHV0X3RtcDsKKyAgR3N0RkZURjMyQ29tcGxleCAqZnJlcWRhdGE7CisgIGdmbG9hdCAqc3BlY3RfbWFnbml0dWRlOyAgICAgIC8qIGFjY3VtdWxhdGVkIG1hbmdpdHVkZSBhbmQgcGhhc2UgKi8KKyAgZ2Zsb2F0ICpzcGVjdF9waGFzZTsgICAgICAgICAgLyogd2lsbCBiZSBzY2FsZWQgYnkgbnVtX2ZmdCBiZWZvcmUgc2VuZGluZyAqLworICBHc3RGRlRGMzIgKmZmdF9jdHg7Cit9OworCitzdHJ1Y3QgX0dzdFNwZWN0cnVtCit7CisgIEdzdEF1ZGlvRmlsdGVyIHBhcmVudDsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIGdib29sZWFuIHBvc3RfbWVzc2FnZXM7ICAgICAgIC8qIHdoZXRoZXIgb3Igbm90IHRvIHBvc3QgbWVzc2FnZXMgKi8KKyAgZ2Jvb2xlYW4gbWVzc2FnZV9tYWduaXR1ZGU7CisgIGdib29sZWFuIG1lc3NhZ2VfcGhhc2U7CisgIGd1aW50NjQgaW50ZXJ2YWw7ICAgICAgICAgICAgIC8qIGhvdyBtYW55IG5hbm9zZWNvbmRzIGJldHdlZW4gZW1pdHMgKi8KKyAgZ3VpbnQ2NCBmcmFtZXNfcGVyX2ludGVydmFsOyAgLyogaG93IG1hbnkgZnJhbWVzIHBlciBpbnRlcnZhbCAqLworICBndWludDY0IGZyYW1lc190b2RvOworICBndWludCBiYW5kczsgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3BlY3RydW0gYmFuZHMgKi8KKyAgZ2ludCB0aHJlc2hvbGQ7ICAgICAgICAgICAgICAgLyogZW5lcmd5IGxldmVsIHRyZXNob2xkICovCisgIGdib29sZWFuIG11bHRpX2NoYW5uZWw7ICAgICAgIC8qIHNlbmQgc2VwYXJhdGUgY2hhbm5lbCByZXN1bHRzICovCisKKyAgZ3VpbnQ2NCBudW1fZnJhbWVzOyAgICAgICAgICAgLyogZnJhbWUgY291bnQgKDEgc2FtcGxlIHBlciBjaGFubmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaW5jZSBsYXN0IGVtaXQgKi8KKyAgZ3VpbnQ2NCBudW1fZmZ0OyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIEZGVHMgc2luY2UgbGFzdCBlbWl0ICovCisgIEdzdENsb2NrVGltZSBtZXNzYWdlX3RzOyAgICAgIC8qIHN0YXJ0dGltZSBmb3IgbmV4dCBtZXNzYWdlICovCisKKyAgLyogPHByaXZhdGU+ICovCisgIEdzdFNwZWN0cnVtQ2hhbm5lbCAqY2hhbm5lbF9kYXRhOworICBndWludCBudW1fY2hhbm5lbHM7CisKKyAgZ3VpbnQgaW5wdXRfcG9zOworICBndWludDY0IGVycm9yX3Blcl9pbnRlcnZhbDsKKyAgZ3VpbnQ2NCBhY2N1bXVsYXRlZF9lcnJvcjsKKworICBHTXV0ZXggbG9jazsKKworICBHc3RTcGVjdHJ1bUlucHV0RGF0YSBpbnB1dF9kYXRhOworfTsKKworc3RydWN0IF9Hc3RTcGVjdHJ1bUNsYXNzCit7CisgIEdzdEF1ZGlvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3NwZWN0cnVtX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1NQRUNUUlVNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3NwZWN0cnVtL21lc29uLmJ1aWxkIGIvZ3N0L3NwZWN0cnVtL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDVlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9nc3Qvc3BlY3RydW0vbWVzb24uYnVpbGQKQEAgLTAsMCArMSw4IEBACitnc3RzcGVjdHJ1bSA9IGxpYnJhcnkoJ2dzdHNwZWN0cnVtJywKKyAgJ2dzdHNwZWN0cnVtLmMnLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnc3RmZnRfZGVwLCBnc3RhdWRpb19kZXAsIGxpYm1dLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L3VkcC9NYWtlZmlsZS5hbSBiL2dzdC91ZHAvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk3NDA1YQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC91ZHAvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMyBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0dWRwLmxhCisKK2xpYmdzdHVkcF9sYV9TT1VSQ0VTID0gZ3N0dWRwLmMgZ3N0dWRwc3JjLmMgZ3N0dWRwc2luay5jIGdzdG11bHRpdWRwc2luay5jIGdzdGR5bnVkcHNpbmsuYyBnc3R1ZHBuZXR1dGlscy5jCisKK2xpYmdzdHVkcF9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfTkVUX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKEdJT19DRkxBR1MpCitsaWJnc3R1ZHBfbGFfTElCQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpICQoR1NUX0JBU0VfTElCUykgJChHU1RfTkVUX0xJQlMpICQoR0lPX0xJQlMpCitsaWJnc3R1ZHBfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdHVkcHNpbmsuaCBnc3R1ZHBzcmMuaCBnc3RtdWx0aXVkcHNpbmsuaCBnc3RkeW51ZHBzaW5rLmggZ3N0dWRwbmV0dXRpbHMuaAorCitFWFRSQV9ESVNUID0gUkVBRE1FCisKK0NMRUFORklMRVMgPSAkKEJVSUxUX1NPVVJDRVMpCmRpZmYgLS1naXQgYS9nc3QvdWRwL1JFQURNRSBiL2dzdC91ZHAvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliN2NlYmIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdWRwL1JFQURNRQpAQCAtMCwwICsxLDcgQEAKKyogV2hhdCBpcyBVRFAgc3JjL3Npbms/CisKK0l0IGlzIGEgc2V0IG9mIGVsZW1lbnQgdG8gdHJhbnNmZXIgZGF0YSB1c2luZyBVRFAsIG5vdGhpbmcgbW9yZSwgbm90aGluZyBsZXNzLgorSXRzIG1haW4gcHVycG9zZSBpcyB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggUlRQIGJ1dCB0aGV5IGFyZSBrZXB0IGFzCitzZXBhcmF0ZSBlbGVtZW50cyBiZWNhdXNlIHdlIGNhbi4KKworCmRpZmYgLS1naXQgYS9nc3QvdWRwL2dzdGR5bnVkcHNpbmsuYyBiL2dzdC91ZHAvZ3N0ZHludWRwc2luay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZTZkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdWRwL2dzdGR5bnVkcHNpbmsuYwpAQCAtMCwwICsxLDU5OSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBQaGlsaXBwZSBLaGFsYWYgPGJ1cmdlckBzcGVlZHkub3JnPgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gTm9raWEgQ29ycG9yYXRpb24gPGthaS52ZWhtYW5lbkBub2tpYS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBKb25pIFZhbHRhbmVuIDxqb25pLnZhbHRhbmVuQG1vdmlhbC5maT4KKyAqIENvcHlyaWdodCAoQykgPDIwMTI+IENvbGxhYm9yYSBMdGQuCisgKiAgIEF1dGhvcjogU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgImdzdGR5bnVkcHNpbmsuaCIKKworI2luY2x1ZGUgPGdzdC9uZXQvZ3N0bmV0YWRkcmVzc21ldGEuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZHludWRwc2lua19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCAoZHludWRwc2lua19kZWJ1ZykKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworLyogRHluVURQU2luayBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIG1ldGhvZHMgKi8KKyAgU0lHTkFMX0dFVF9TVEFUUywKKworICAvKiBzaWduYWxzICovCisKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworI2RlZmluZSBVRFBfREVGQVVMVF9TT0NLRVQJCU5VTEwKKyNkZWZpbmUgVURQX0RFRkFVTFRfQ0xPU0VfU09DS0VUCVRSVUUKKyNkZWZpbmUgVURQX0RFRkFVTFRfQklORF9BRERSRVNTCU5VTEwKKyNkZWZpbmUgVURQX0RFRkFVTFRfQklORF9QT1JUICAgCTAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfU09DS0VULAorICBQUk9QX1NPQ0tFVF9WNiwKKyAgUFJPUF9DTE9TRV9TT0NLRVQsCisgIFBST1BfQklORF9BRERSRVNTLAorICBQUk9QX0JJTkRfUE9SVAorfTsKKworc3RhdGljIHZvaWQgZ3N0X2R5bnVkcHNpbmtfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZHludWRwc2lua19yZW5kZXIgKEdzdEJhc2VTaW5rICogc2luaywKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9keW51ZHBzaW5rX3N0b3AgKEdzdEJhc2VTaW5rICogYnNpbmspOworc3RhdGljIGdib29sZWFuIGdzdF9keW51ZHBzaW5rX3N0YXJ0IChHc3RCYXNlU2luayAqIGJzaW5rKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZHludWRwc2lua191bmxvY2sgKEdzdEJhc2VTaW5rICogYnNpbmspOworc3RhdGljIGdib29sZWFuIGdzdF9keW51ZHBzaW5rX3VubG9ja19zdG9wIChHc3RCYXNlU2luayAqIGJzaW5rKTsKKworc3RhdGljIHZvaWQgZ3N0X2R5bnVkcHNpbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2R5bnVkcHNpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIEdzdFN0cnVjdHVyZSAqZ3N0X2R5bnVkcHNpbmtfZ2V0X3N0YXRzIChHc3REeW5VRFBTaW5rICogc2luaywKKyAgICBjb25zdCBnY2hhciAqIGhvc3QsIGdpbnQgcG9ydCk7CisKK3N0YXRpYyBndWludCBnc3RfZHludWRwc2lua19zaWduYWxzW0xBU1RfU0lHTkFMXSA9IHsgMCB9OworCisjZGVmaW5lIGdzdF9keW51ZHBzaW5rX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdER5blVEUFNpbmssIGdzdF9keW51ZHBzaW5rLCBHU1RfVFlQRV9CQVNFX1NJTkspOworCitzdGF0aWMgdm9pZAorZ3N0X2R5bnVkcHNpbmtfY2xhc3NfaW5pdCAoR3N0RHluVURQU2lua0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCYXNlU2lua0NsYXNzICpnc3RiYXNlc2lua19jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdGJhc2VzaW5rX2NsYXNzID0gKEdzdEJhc2VTaW5rQ2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2R5bnVkcHNpbmtfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfZHludWRwc2lua19nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2R5bnVkcHNpbmtfZmluYWxpemU7CisKKyAgZ3N0X2R5bnVkcHNpbmtfc2lnbmFsc1tTSUdOQUxfR0VUX1NUQVRTXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJnZXQtc3RhdHMiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QgfCBHX1NJR05BTF9BQ1RJT04sCisgICAgICBHX1NUUlVDVF9PRkZTRVQgKEdzdER5blVEUFNpbmtDbGFzcywgZ2V0X3N0YXRzKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHU1RfVFlQRV9TVFJVQ1RVUkUsIDIsCisgICAgICBHX1RZUEVfU1RSSU5HLCBHX1RZUEVfSU5UKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NPQ0tFVCwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJzb2NrZXQiLCAiU29ja2V0IiwKKyAgICAgICAgICAiU29ja2V0IHRvIHVzZSBmb3IgVURQIHNlbmRpbmcuIChOVUxMID09IGFsbG9jYXRlKSIsCisgICAgICAgICAgR19UWVBFX1NPQ0tFVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfU09DS0VUX1Y2LAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInNvY2tldC12NiIsICJTb2NrZXQgSVB2NiIsCisgICAgICAgICAgIlNvY2tldCB0byB1c2UgZm9yIFVEUHY2IHNlbmRpbmcuIChOVUxMID09IGFsbG9jYXRlKSIsCisgICAgICAgICAgR19UWVBFX1NPQ0tFVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ0xPU0VfU09DS0VULAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJjbG9zZS1zb2NrZXQiLCAiQ2xvc2Ugc29ja2V0IiwKKyAgICAgICAgICAiQ2xvc2Ugc29ja2V0IGlmIHBhc3NlZCBhcyBwcm9wZXJ0eSBvbiBzdGF0ZSBjaGFuZ2UiLAorICAgICAgICAgIFVEUF9ERUZBVUxUX0NMT1NFX1NPQ0tFVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CSU5EX0FERFJFU1MsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiYmluZC1hZGRyZXNzIiwgIkJpbmQgQWRkcmVzcyIsCisgICAgICAgICAgIkFkZHJlc3MgdG8gYmluZCB0aGUgc29ja2V0IHRvIiwgVURQX0RFRkFVTFRfQklORF9BRERSRVNTLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0JJTkRfUE9SVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJiaW5kLXBvcnQiLCAiQmluZCBQb3J0IiwKKyAgICAgICAgICAiUG9ydCB0byBiaW5kIHRoZSBzb2NrZXQgdG8iLCAwLCBHX01BWFVJTlQxNiwKKyAgICAgICAgICBVRFBfREVGQVVMVF9CSU5EX1BPUlQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlVEUCBwYWNrZXQgc2VuZGVyIiwKKyAgICAgICJTaW5rL05ldHdvcmsiLAorICAgICAgIlNlbmQgZGF0YSBvdmVyIHRoZSBuZXR3b3JrIHZpYSBVRFAgd2l0aCBwYWNrZXQgZGVzdGluYXRpb25zIHBpY2tlZCB1cCAiCisgICAgICAiZHluYW1pY2FsbHkgZnJvbSBtZXRhIG9uIHRoZSBidWZmZXJzIHBhc3NlZCIsCisgICAgICAiUGhpbGlwcGUgS2hhbGFmIDxidXJnZXJAc3BlZWR5Lm9yZz4iKTsKKworICBnc3RiYXNlc2lua19jbGFzcy0+cmVuZGVyID0gZ3N0X2R5bnVkcHNpbmtfcmVuZGVyOworICBnc3RiYXNlc2lua19jbGFzcy0+c3RhcnQgPSBnc3RfZHludWRwc2lua19zdGFydDsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnN0b3AgPSBnc3RfZHludWRwc2lua19zdG9wOworICBnc3RiYXNlc2lua19jbGFzcy0+dW5sb2NrID0gZ3N0X2R5bnVkcHNpbmtfdW5sb2NrOworICBnc3RiYXNlc2lua19jbGFzcy0+dW5sb2NrX3N0b3AgPSBnc3RfZHludWRwc2lua191bmxvY2tfc3RvcDsKKworICBrbGFzcy0+Z2V0X3N0YXRzID0gZ3N0X2R5bnVkcHNpbmtfZ2V0X3N0YXRzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChkeW51ZHBzaW5rX2RlYnVnLCAiZHludWRwc2luayIsIDAsICJVRFAgc2luayIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2R5bnVkcHNpbmtfaW5pdCAoR3N0RHluVURQU2luayAqIHNpbmspCit7CisgIHNpbmstPnNvY2tldCA9IFVEUF9ERUZBVUxUX1NPQ0tFVDsKKyAgc2luay0+c29ja2V0X3Y2ID0gVURQX0RFRkFVTFRfU09DS0VUOworICBzaW5rLT5jbG9zZV9zb2NrZXQgPSBVRFBfREVGQVVMVF9DTE9TRV9TT0NLRVQ7CisgIHNpbmstPmV4dGVybmFsX3NvY2tldCA9IEZBTFNFOworICBzaW5rLT5iaW5kX2FkZHJlc3MgPSBVRFBfREVGQVVMVF9CSU5EX0FERFJFU1M7CisgIHNpbmstPmJpbmRfcG9ydCA9IFVEUF9ERUZBVUxUX0JJTkRfUE9SVDsKKworICBzaW5rLT51c2VkX3NvY2tldCA9IE5VTEw7CisgIHNpbmstPnVzZWRfc29ja2V0X3Y2ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9keW51ZHBzaW5rX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3REeW5VRFBTaW5rICpzaW5rOworCisgIHNpbmsgPSBHU1RfRFlOVURQU0lOSyAob2JqZWN0KTsKKworICBpZiAoc2luay0+c29ja2V0KQorICAgIGdfb2JqZWN0X3VucmVmIChzaW5rLT5zb2NrZXQpOworICBzaW5rLT5zb2NrZXQgPSBOVUxMOworCisgIGlmIChzaW5rLT5zb2NrZXRfdjYpCisgICAgZ19vYmplY3RfdW5yZWYgKHNpbmstPnNvY2tldF92Nik7CisgIHNpbmstPnNvY2tldF92NiA9IE5VTEw7CisKKyAgaWYgKHNpbmstPnVzZWRfc29ja2V0KQorICAgIGdfb2JqZWN0X3VucmVmIChzaW5rLT51c2VkX3NvY2tldCk7CisgIHNpbmstPnVzZWRfc29ja2V0ID0gTlVMTDsKKworICBpZiAoc2luay0+dXNlZF9zb2NrZXRfdjYpCisgICAgZ19vYmplY3RfdW5yZWYgKHNpbmstPnVzZWRfc29ja2V0X3Y2KTsKKyAgc2luay0+dXNlZF9zb2NrZXRfdjYgPSBOVUxMOworCisgIGdfZnJlZSAoc2luay0+YmluZF9hZGRyZXNzKTsKKyAgc2luay0+YmluZF9hZGRyZXNzID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfZHludWRwc2lua19yZW5kZXIgKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0RHluVURQU2luayAqc2luazsKKyAgZ3NzaXplIHJldDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdE5ldEFkZHJlc3NNZXRhICptZXRhOworICBHU29ja2V0QWRkcmVzcyAqYWRkcjsKKyAgR0Vycm9yICplcnIgPSBOVUxMOworICBHU29ja2V0RmFtaWx5IGZhbWlseTsKKyAgR1NvY2tldCAqc29ja2V0OworCisgIG1ldGEgPSBnc3RfYnVmZmVyX2dldF9uZXRfYWRkcmVzc19tZXRhIChidWZmZXIpOworCisgIGlmIChtZXRhID09IE5VTEwpIHsKKyAgICBHU1RfREVCVUcgKCJSZWNlaXZlZCBidWZmZXIgd2l0aG91dCBHc3ROZXRBZGRyZXNzTWV0YSwgc2tpcHBpbmciKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgIH0KKworICBzaW5rID0gR1NUX0RZTlVEUFNJTksgKGJzaW5rKTsKKworICAvKiBsZXQncyBnZXQgdGhlIGFkZHJlc3MgZnJvbSB0aGUgbWV0YWRhdGEgKi8KKyAgYWRkciA9IG1ldGEtPmFkZHI7CisKKyAgZmFtaWx5ID0gZ19zb2NrZXRfYWRkcmVzc19nZXRfZmFtaWx5IChhZGRyKTsKKyAgaWYgKGZhbWlseSA9PSBHX1NPQ0tFVF9GQU1JTFlfSVBWNiAmJiAhc2luay0+dXNlZF9zb2NrZXRfdjYpCisgICAgZ290byBpbnZhbGlkX2ZhbWlseTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworCisgIEdTVF9ERUJVRyAoImFib3V0IHRvIHNlbmQgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyIsIG1hcC5zaXplKTsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgeworICAgIGdjaGFyICpob3N0OworCisgICAgaG9zdCA9CisgICAgICAgIGdfaW5ldF9hZGRyZXNzX3RvX3N0cmluZyAoZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9hZGRyZXNzCisgICAgICAgIChHX0lORVRfU09DS0VUX0FERFJFU1MgKGFkZHIpKSk7CisgICAgR1NUX0RFQlVHICgic2VuZGluZyAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIHRvIGNsaWVudCAlcyBwb3J0ICVkIiwKKyAgICAgICAgbWFwLnNpemUsIGhvc3QsCisgICAgICAgIGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfcG9ydCAoR19JTkVUX1NPQ0tFVF9BRERSRVNTIChhZGRyKSkpOworICAgIGdfZnJlZSAoaG9zdCk7CisgIH0KKyNlbmRpZgorCisgIC8qIFNlbGVjdCBzb2NrZXQgdG8gc2VuZCBmcm9tIGZvciB0aGlzIGFkZHJlc3MgKi8KKyAgaWYgKGZhbWlseSA9PSBHX1NPQ0tFVF9GQU1JTFlfSVBWNiB8fCAhc2luay0+dXNlZF9zb2NrZXQpCisgICAgc29ja2V0ID0gc2luay0+dXNlZF9zb2NrZXRfdjY7CisgIGVsc2UKKyAgICBzb2NrZXQgPSBzaW5rLT51c2VkX3NvY2tldDsKKworICByZXQgPQorICAgICAgZ19zb2NrZXRfc2VuZF90byAoc29ja2V0LCBhZGRyLCAoZ2NoYXIgKikgbWFwLmRhdGEsIG1hcC5zaXplLAorICAgICAgc2luay0+Y2FuY2VsbGFibGUsICZlcnIpOworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIGlmIChyZXQgPCAwKQorICAgIGdvdG8gc2VuZF9lcnJvcjsKKworICBHU1RfREVCVUcgKCJzZW50ICUiIEdfR1NTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwgcmV0KTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKK3NlbmRfZXJyb3I6CisgIHsKKyAgICBHc3RGbG93UmV0dXJuIGZsb3dfcmV0OworCisgICAgaWYgKGdfZXJyb3JfbWF0Y2hlcyAoZXJyLCBHX0lPX0VSUk9SLCBHX0lPX0VSUk9SX0NBTkNFTExFRCkpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJzZW5kIGNhbmNlbGxlZCIpOworICAgICAgZmxvd19yZXQgPSBHU1RfRkxPV19GTFVTSElORzsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNpbmssIFJFU09VUkNFLCBXUklURSwgKE5VTEwpLAorICAgICAgICAgICgic2VuZCBlcnJvcjogJXMiLCBlcnItPm1lc3NhZ2UpKTsKKyAgICAgIGZsb3dfcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgIHJldHVybiBmbG93X3JldDsKKyAgfQoraW52YWxpZF9mYW1pbHk6CisgIHsKKyAgICBHU1RfREVCVUcgKCJpbnZhbGlkIGFkZHJlc3MgZmFtaWx5IChnb3QgJWQpIiwgZmFtaWx5KTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9keW51ZHBzaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REeW5VRFBTaW5rICp1ZHBzaW5rOworCisgIHVkcHNpbmsgPSBHU1RfRFlOVURQU0lOSyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU09DS0VUOgorICAgICAgaWYgKHVkcHNpbmstPnNvY2tldCAhPSBOVUxMICYmIHVkcHNpbmstPnNvY2tldCAhPSB1ZHBzaW5rLT51c2VkX3NvY2tldCAmJgorICAgICAgICAgIHVkcHNpbmstPmNsb3NlX3NvY2tldCkgeworICAgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICAgICAgaWYgKCFnX3NvY2tldF9jbG9zZSAodWRwc2luay0+c29ja2V0LCAmZXJyKSkgeworICAgICAgICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBjbG9zZSBzb2NrZXQgJXA6ICVzIiwgdWRwc2luay0+c29ja2V0LAorICAgICAgICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAodWRwc2luay0+c29ja2V0KQorICAgICAgICBnX29iamVjdF91bnJlZiAodWRwc2luay0+c29ja2V0KTsKKyAgICAgIHVkcHNpbmstPnNvY2tldCA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgR1NUX0RFQlVHICgic2V0dGluZyBzb2NrZXQgdG8gJXAiLCB1ZHBzaW5rLT5zb2NrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NPQ0tFVF9WNjoKKyAgICAgIGlmICh1ZHBzaW5rLT5zb2NrZXRfdjYgIT0gTlVMTAorICAgICAgICAgICYmIHVkcHNpbmstPnNvY2tldF92NiAhPSB1ZHBzaW5rLT51c2VkX3NvY2tldF92NgorICAgICAgICAgICYmIHVkcHNpbmstPmNsb3NlX3NvY2tldCkgeworICAgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICAgICAgaWYgKCFnX3NvY2tldF9jbG9zZSAodWRwc2luay0+c29ja2V0X3Y2LCAmZXJyKSkgeworICAgICAgICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBjbG9zZSBzb2NrZXQgJXA6ICVzIiwgdWRwc2luay0+c29ja2V0X3Y2LAorICAgICAgICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAodWRwc2luay0+c29ja2V0X3Y2KQorICAgICAgICBnX29iamVjdF91bnJlZiAodWRwc2luay0+c29ja2V0X3Y2KTsKKyAgICAgIHVkcHNpbmstPnNvY2tldF92NiA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgR1NUX0RFQlVHICgic2V0dGluZyBzb2NrZXQgdjYgdG8gJXAiLCB1ZHBzaW5rLT5zb2NrZXRfdjYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NMT1NFX1NPQ0tFVDoKKyAgICAgIHVkcHNpbmstPmNsb3NlX3NvY2tldCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CSU5EX0FERFJFU1M6CisgICAgICBnX2ZyZWUgKHVkcHNpbmstPmJpbmRfYWRkcmVzcyk7CisgICAgICB1ZHBzaW5rLT5iaW5kX2FkZHJlc3MgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CSU5EX1BPUlQ6CisgICAgICB1ZHBzaW5rLT5iaW5kX3BvcnQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9keW51ZHBzaW5rX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REeW5VRFBTaW5rICp1ZHBzaW5rOworCisgIHVkcHNpbmsgPSBHU1RfRFlOVURQU0lOSyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfU09DS0VUOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgdWRwc2luay0+c29ja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TT0NLRVRfVjY6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCB1ZHBzaW5rLT5zb2NrZXRfdjYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NMT1NFX1NPQ0tFVDoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB1ZHBzaW5rLT5jbG9zZV9zb2NrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JJTkRfQUREUkVTUzoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHVkcHNpbmstPmJpbmRfYWRkcmVzcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQklORF9QT1JUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdWRwc2luay0+YmluZF9wb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9keW51ZHBzaW5rX2NyZWF0ZV9jYW5jZWxsYWJsZSAoR3N0RHluVURQU2luayAqIHNpbmspCit7CisgIEdQb2xsRkQgcG9sbGZkOworCisgIHNpbmstPmNhbmNlbGxhYmxlID0gZ19jYW5jZWxsYWJsZV9uZXcgKCk7CisgIHNpbmstPm1hZGVfY2FuY2VsX2ZkID0gZ19jYW5jZWxsYWJsZV9tYWtlX3BvbGxmZCAoc2luay0+Y2FuY2VsbGFibGUsICZwb2xsZmQpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2R5bnVkcHNpbmtfZnJlZV9jYW5jZWxsYWJsZSAoR3N0RHluVURQU2luayAqIHNpbmspCit7CisgIGlmIChzaW5rLT5tYWRlX2NhbmNlbF9mZCkgeworICAgIGdfY2FuY2VsbGFibGVfcmVsZWFzZV9mZCAoc2luay0+Y2FuY2VsbGFibGUpOworICAgIHNpbmstPm1hZGVfY2FuY2VsX2ZkID0gRkFMU0U7CisgIH0KKyAgZ19vYmplY3RfdW5yZWYgKHNpbmstPmNhbmNlbGxhYmxlKTsKKyAgc2luay0+Y2FuY2VsbGFibGUgPSBOVUxMOworfQorCisvKiBjcmVhdGUgYSBzb2NrZXQgZm9yIHNlbmRpbmcgdG8gcmVtb3RlIG1hY2hpbmUgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2R5bnVkcHNpbmtfc3RhcnQgKEdzdEJhc2VTaW5rICogYnNpbmspCit7CisgIEdzdER5blVEUFNpbmsgKnVkcHNpbms7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICB1ZHBzaW5rID0gR1NUX0RZTlVEUFNJTksgKGJzaW5rKTsKKworICBnc3RfZHludWRwc2lua19jcmVhdGVfY2FuY2VsbGFibGUgKHVkcHNpbmspOworCisgIHVkcHNpbmstPmV4dGVybmFsX3NvY2tldCA9IEZBTFNFOworCisgIGlmICh1ZHBzaW5rLT5zb2NrZXQpIHsKKyAgICBpZiAoZ19zb2NrZXRfZ2V0X2ZhbWlseSAodWRwc2luay0+c29ja2V0KSA9PSBHX1NPQ0tFVF9GQU1JTFlfSVBWNikgeworICAgICAgdWRwc2luay0+dXNlZF9zb2NrZXRfdjYgPSBHX1NPQ0tFVCAoZ19vYmplY3RfcmVmICh1ZHBzaW5rLT5zb2NrZXQpKTsKKyAgICAgIHVkcHNpbmstPmV4dGVybmFsX3NvY2tldCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIHVkcHNpbmstPnVzZWRfc29ja2V0ID0gR19TT0NLRVQgKGdfb2JqZWN0X3JlZiAodWRwc2luay0+c29ja2V0KSk7CisgICAgICB1ZHBzaW5rLT5leHRlcm5hbF9zb2NrZXQgPSBUUlVFOworICAgIH0KKyAgfQorCisgIGlmICh1ZHBzaW5rLT5zb2NrZXRfdjYpIHsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ19zb2NrZXRfZ2V0X2ZhbWlseSAodWRwc2luay0+c29ja2V0KSAhPQorICAgICAgICBHX1NPQ0tFVF9GQU1JTFlfSVBWNiwgRkFMU0UpOworCisgICAgaWYgKHVkcHNpbmstPnVzZWRfc29ja2V0X3Y2CisgICAgICAgICYmIHVkcHNpbmstPnVzZWRfc29ja2V0X3Y2ICE9IHVkcHNpbmstPnNvY2tldF92NikgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAodWRwc2luaywKKyAgICAgICAgICAiUHJvdmlkZWQgZGlmZmVyZW50IElQdjYgc29ja2V0cyBpbiBzb2NrZXQgYW5kIHNvY2tldC12NiBwcm9wZXJ0aWVzIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgdWRwc2luay0+dXNlZF9zb2NrZXRfdjYgPSBHX1NPQ0tFVCAoZ19vYmplY3RfcmVmICh1ZHBzaW5rLT5zb2NrZXRfdjYpKTsKKyAgICB1ZHBzaW5rLT5leHRlcm5hbF9zb2NrZXQgPSBUUlVFOworICB9CisKKyAgaWYgKCF1ZHBzaW5rLT51c2VkX3NvY2tldCAmJiAhdWRwc2luay0+dXNlZF9zb2NrZXRfdjYpIHsKKyAgICBHU29ja2V0QWRkcmVzcyAqYmluZF9hZGRyOworICAgIEdJbmV0QWRkcmVzcyAqYmluZF9pYWRkcjsKKworICAgIGlmICh1ZHBzaW5rLT5iaW5kX2FkZHJlc3MpIHsKKyAgICAgIEdTb2NrZXRGYW1pbHkgZmFtaWx5OworCisgICAgICBiaW5kX2lhZGRyID0gZ19pbmV0X2FkZHJlc3NfbmV3X2Zyb21fc3RyaW5nICh1ZHBzaW5rLT5iaW5kX2FkZHJlc3MpOworICAgICAgaWYgKCFiaW5kX2lhZGRyKSB7CisgICAgICAgIEdMaXN0ICpyZXN1bHRzOworICAgICAgICBHUmVzb2x2ZXIgKnJlc29sdmVyOworCisgICAgICAgIHJlc29sdmVyID0gZ19yZXNvbHZlcl9nZXRfZGVmYXVsdCAoKTsKKyAgICAgICAgcmVzdWx0cyA9CisgICAgICAgICAgICBnX3Jlc29sdmVyX2xvb2t1cF9ieV9uYW1lIChyZXNvbHZlciwgdWRwc2luay0+YmluZF9hZGRyZXNzLAorICAgICAgICAgICAgdWRwc2luay0+Y2FuY2VsbGFibGUsICZlcnIpOworICAgICAgICBpZiAoIXJlc3VsdHMpIHsKKyAgICAgICAgICBnX29iamVjdF91bnJlZiAocmVzb2x2ZXIpOworICAgICAgICAgIGdvdG8gbmFtZV9yZXNvbHZlOworICAgICAgICB9CisgICAgICAgIGJpbmRfaWFkZHIgPSBHX0lORVRfQUREUkVTUyAoZ19vYmplY3RfcmVmIChyZXN1bHRzLT5kYXRhKSk7CisgICAgICAgIGdfcmVzb2x2ZXJfZnJlZV9hZGRyZXNzZXMgKHJlc3VsdHMpOworICAgICAgICBnX29iamVjdF91bnJlZiAocmVzb2x2ZXIpOworICAgICAgfQorCisgICAgICBiaW5kX2FkZHIgPSBnX2luZXRfc29ja2V0X2FkZHJlc3NfbmV3IChiaW5kX2lhZGRyLCB1ZHBzaW5rLT5iaW5kX3BvcnQpOworICAgICAgZ19vYmplY3RfdW5yZWYgKGJpbmRfaWFkZHIpOworICAgICAgZmFtaWx5ID0gZ19zb2NrZXRfYWRkcmVzc19nZXRfZmFtaWx5IChHX1NPQ0tFVF9BRERSRVNTIChiaW5kX2FkZHIpKTsKKworICAgICAgaWYgKCh1ZHBzaW5rLT51c2VkX3NvY2tldCA9CisgICAgICAgICAgICAgIGdfc29ja2V0X25ldyAoZmFtaWx5LCBHX1NPQ0tFVF9UWVBFX0RBVEFHUkFNLAorICAgICAgICAgICAgICAgICAgR19TT0NLRVRfUFJPVE9DT0xfVURQLCAmZXJyKSkgPT0gTlVMTCkgeworICAgICAgICBnX29iamVjdF91bnJlZiAoYmluZF9hZGRyKTsKKyAgICAgICAgZ290byBub19zb2NrZXQ7CisgICAgICB9CisKKyAgICAgIGdfc29ja2V0X2JpbmQgKHVkcHNpbmstPnVzZWRfc29ja2V0LCBiaW5kX2FkZHIsIFRSVUUsICZlcnIpOworICAgICAgaWYgKGVyciAhPSBOVUxMKQorICAgICAgICBnb3RvIGJpbmRfZXJyb3I7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGNyZWF0ZSBzZW5kZXIgc29ja2V0cyBpZiBub25lIGF2YWlsYWJsZSAqLworICAgICAgaWYgKCh1ZHBzaW5rLT51c2VkX3NvY2tldCA9IGdfc29ja2V0X25ldyAoR19TT0NLRVRfRkFNSUxZX0lQVjQsCisgICAgICAgICAgICAgICAgICBHX1NPQ0tFVF9UWVBFX0RBVEFHUkFNLCBHX1NPQ0tFVF9QUk9UT0NPTF9VRFAsICZlcnIpKSA9PSBOVUxMKQorICAgICAgICBnb3RvIG5vX3NvY2tldDsKKworICAgICAgYmluZF9pYWRkciA9IGdfaW5ldF9hZGRyZXNzX25ld19hbnkgKEdfU09DS0VUX0ZBTUlMWV9JUFY0KTsKKyAgICAgIGJpbmRfYWRkciA9IGdfaW5ldF9zb2NrZXRfYWRkcmVzc19uZXcgKGJpbmRfaWFkZHIsIDApOworICAgICAgZ19zb2NrZXRfYmluZCAodWRwc2luay0+dXNlZF9zb2NrZXQsIGJpbmRfYWRkciwgVFJVRSwgJmVycik7CisgICAgICBnX29iamVjdF91bnJlZiAoYmluZF9hZGRyKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChiaW5kX2lhZGRyKTsKKyAgICAgIGlmIChlcnIgIT0gTlVMTCkKKyAgICAgICAgZ290byBiaW5kX2Vycm9yOworCisgICAgICBpZiAoKHVkcHNpbmstPnVzZWRfc29ja2V0X3Y2ID0gZ19zb2NrZXRfbmV3IChHX1NPQ0tFVF9GQU1JTFlfSVBWNiwKKyAgICAgICAgICAgICAgICAgIEdfU09DS0VUX1RZUEVfREFUQUdSQU0sIEdfU09DS0VUX1BST1RPQ09MX1VEUCwKKyAgICAgICAgICAgICAgICAgICZlcnIpKSA9PSBOVUxMKSB7CisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAodWRwc2luaywgIkZhaWxlZCB0byBjcmVhdGUgSVB2NiBzb2NrZXQ6ICVzIiwKKyAgICAgICAgICAgIGVyci0+bWVzc2FnZSk7CisgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYmluZF9pYWRkciA9IGdfaW5ldF9hZGRyZXNzX25ld19hbnkgKEdfU09DS0VUX0ZBTUlMWV9JUFY2KTsKKyAgICAgICAgYmluZF9hZGRyID0gZ19pbmV0X3NvY2tldF9hZGRyZXNzX25ldyAoYmluZF9pYWRkciwgMCk7CisgICAgICAgIGdfc29ja2V0X2JpbmQgKHVkcHNpbmstPnVzZWRfc29ja2V0X3Y2LCBiaW5kX2FkZHIsIFRSVUUsICZlcnIpOworICAgICAgICBnX29iamVjdF91bnJlZiAoYmluZF9hZGRyKTsKKyAgICAgICAgZ19vYmplY3RfdW5yZWYgKGJpbmRfaWFkZHIpOworICAgICAgICBpZiAoZXJyICE9IE5VTEwpCisgICAgICAgICAgZ290byBiaW5kX2Vycm9yOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmICh1ZHBzaW5rLT51c2VkX3NvY2tldCkKKyAgICBnX3NvY2tldF9zZXRfYnJvYWRjYXN0ICh1ZHBzaW5rLT51c2VkX3NvY2tldCwgVFJVRSk7CisgIGlmICh1ZHBzaW5rLT51c2VkX3NvY2tldF92NikKKyAgICBnX3NvY2tldF9zZXRfYnJvYWRjYXN0ICh1ZHBzaW5rLT51c2VkX3NvY2tldF92NiwgVFJVRSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19zb2NrZXQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUICh1ZHBzaW5rLCAiRmFpbGVkIHRvIGNyZWF0ZSBJUHY0IHNvY2tldDogJXMiLAorICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorYmluZF9lcnJvcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh1ZHBzaW5rLCBSRVNPVVJDRSwgRkFJTEVELCAoTlVMTCksCisgICAgICAgICgiRmFpbGVkIHRvIGJpbmQgc29ja2V0OiAlcyIsIGVyci0+bWVzc2FnZSkpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbmFtZV9yZXNvbHZlOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHVkcHNpbmssIFJFU09VUkNFLCBGQUlMRUQsIChOVUxMKSwKKyAgICAgICAgKCJGYWlsZWQgdG8gcmVzb2x2ZSBiaW5kIGFkZHJlc3MgJXM6ICVzIiwgdWRwc2luay0+YmluZF9hZGRyZXNzLAorICAgICAgICAgICAgZXJyLT5tZXNzYWdlKSk7CisgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RTdHJ1Y3R1cmUgKgorZ3N0X2R5bnVkcHNpbmtfZ2V0X3N0YXRzIChHc3REeW5VRFBTaW5rICogc2luaywgY29uc3QgZ2NoYXIgKiBob3N0LCBnaW50IHBvcnQpCit7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9keW51ZHBzaW5rX3N0b3AgKEdzdEJhc2VTaW5rICogYnNpbmspCit7CisgIEdzdER5blVEUFNpbmsgKnVkcHNpbms7CisKKyAgdWRwc2luayA9IEdTVF9EWU5VRFBTSU5LIChic2luayk7CisKKyAgaWYgKHVkcHNpbmstPnVzZWRfc29ja2V0KSB7CisgICAgaWYgKHVkcHNpbmstPmNsb3NlX3NvY2tldCB8fCAhdWRwc2luay0+ZXh0ZXJuYWxfc29ja2V0KSB7CisgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICAgIGlmICghZ19zb2NrZXRfY2xvc2UgKHVkcHNpbmstPnVzZWRfc29ja2V0LCAmZXJyKSkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUICh1ZHBzaW5rLCAiRmFpbGVkIHRvIGNsb3NlIHNvY2tldDogJXMiLCBlcnItPm1lc3NhZ2UpOworICAgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnX29iamVjdF91bnJlZiAodWRwc2luay0+dXNlZF9zb2NrZXQpOworICAgIHVkcHNpbmstPnVzZWRfc29ja2V0ID0gTlVMTDsKKyAgfQorCisgIGlmICh1ZHBzaW5rLT51c2VkX3NvY2tldF92NikgeworICAgIGlmICh1ZHBzaW5rLT5jbG9zZV9zb2NrZXQgfHwgIXVkcHNpbmstPmV4dGVybmFsX3NvY2tldCkgeworICAgICAgR0Vycm9yICplcnIgPSBOVUxMOworCisgICAgICBpZiAoIWdfc29ja2V0X2Nsb3NlICh1ZHBzaW5rLT51c2VkX3NvY2tldF92NiwgJmVycikpIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAodWRwc2luaywgIkZhaWxlZCB0byBjbG9zZSBzb2NrZXQ6ICVzIiwgZXJyLT5tZXNzYWdlKTsKKyAgICAgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgICB9CisgICAgfQorCisgICAgZ19vYmplY3RfdW5yZWYgKHVkcHNpbmstPnVzZWRfc29ja2V0X3Y2KTsKKyAgICB1ZHBzaW5rLT51c2VkX3NvY2tldF92NiA9IE5VTEw7CisgIH0KKworICBnc3RfZHludWRwc2lua19mcmVlX2NhbmNlbGxhYmxlICh1ZHBzaW5rKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHludWRwc2lua191bmxvY2sgKEdzdEJhc2VTaW5rICogYnNpbmspCit7CisgIEdzdER5blVEUFNpbmsgKnVkcHNpbms7CisKKyAgdWRwc2luayA9IEdTVF9EWU5VRFBTSU5LIChic2luayk7CisKKyAgZ19jYW5jZWxsYWJsZV9jYW5jZWwgKHVkcHNpbmstPmNhbmNlbGxhYmxlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZHludWRwc2lua191bmxvY2tfc3RvcCAoR3N0QmFzZVNpbmsgKiBic2luaykKK3sKKyAgR3N0RHluVURQU2luayAqdWRwc2luazsKKworICB1ZHBzaW5rID0gR1NUX0RZTlVEUFNJTksgKGJzaW5rKTsKKworICBnc3RfZHludWRwc2lua19mcmVlX2NhbmNlbGxhYmxlICh1ZHBzaW5rKTsKKyAgZ3N0X2R5bnVkcHNpbmtfY3JlYXRlX2NhbmNlbGxhYmxlICh1ZHBzaW5rKTsKKworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2dzdC91ZHAvZ3N0ZHludWRwc2luay5oIGIvZ3N0L3VkcC9nc3RkeW51ZHBzaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4NWJiNgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC91ZHAvZ3N0ZHludWRwc2luay5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gUGhpbGlwcGUgS2hhbGFmIDxidXJnZXJAc3BlZWR5Lm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0RZTlVEUFNJTktfSF9fCisjZGVmaW5lIF9fR1NUX0RZTlVEUFNJTktfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXNpbmsuaD4KKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2luY2x1ZGUgImdzdHVkcG5ldHV0aWxzLmgiCisKKyNkZWZpbmUgR1NUX1RZUEVfRFlOVURQU0lOSyAgICAgICAgICAgICAoZ3N0X2R5bnVkcHNpbmtfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0RZTlVEUFNJTksob2JqKSAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfRFlOVURQU0lOSyxHc3REeW5VRFBTaW5rKSkKKyNkZWZpbmUgR1NUX0RZTlVEUFNJTktfQ0xBU1Moa2xhc3MpICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9EWU5VRFBTSU5LLEdzdER5blVEUFNpbmtDbGFzcykpCisjZGVmaW5lIEdTVF9JU19EWU5VRFBTSU5LKG9iaikgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0RZTlVEUFNJTkspKQorI2RlZmluZSBHU1RfSVNfRFlOVURQU0lOS19DTEFTUyhrbGFzcykgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0RZTlVEUFNJTkspKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0RHluVURQU2luayBHc3REeW5VRFBTaW5rOwordHlwZWRlZiBzdHJ1Y3QgX0dzdER5blVEUFNpbmtDbGFzcyBHc3REeW5VRFBTaW5rQ2xhc3M7CisKKworLyogc2VuZHMgdWRwIHBhY2tldHMgdG8gaG9zdC9wb3J0IHBhaXJzIGNvbnRhaW5lZCBpbiB0aGUgR3N0TmV0QnVmZmVyIHJlY2VpdmVkLgorICovCitzdHJ1Y3QgX0dzdER5blVEUFNpbmsgeworICBHc3RCYXNlU2luayBwYXJlbnQ7CisKKyAgLyogcHJvcGVydGllcyAqLworICBHU29ja2V0ICpzb2NrZXQsICpzb2NrZXRfdjY7CisgIGdib29sZWFuIGNsb3NlX3NvY2tldDsKKyAgZ2NoYXIgKmJpbmRfYWRkcmVzczsKKyAgZ2ludCBiaW5kX3BvcnQ7CisKKyAgLyogdGhlIHNvY2tldCBpbiB1c2UgKi8KKyAgR1NvY2tldCAqdXNlZF9zb2NrZXQsICp1c2VkX3NvY2tldF92NjsKKyAgZ2Jvb2xlYW4gZXh0ZXJuYWxfc29ja2V0OworICBnYm9vbGVhbiBtYWRlX2NhbmNlbF9mZDsKKyAgR0NhbmNlbGxhYmxlICpjYW5jZWxsYWJsZTsKK307CisKK3N0cnVjdCBfR3N0RHluVURQU2lua0NsYXNzIHsKKyAgR3N0QmFzZVNpbmtDbGFzcyBwYXJlbnRfY2xhc3M7CisKKyAgLyogZWxlbWVudCBtZXRob2RzICovCisgIEdzdFN0cnVjdHVyZSogICgqZ2V0X3N0YXRzKSAgICAoR3N0RHluVURQU2luayAqc2luaywgY29uc3QgZ2NoYXIgKmhvc3QsIGdpbnQgcG9ydCk7CisKKyAgLyogc2lnbmFscyAqLworfTsKKworR1R5cGUgZ3N0X2R5bnVkcHNpbmtfZ2V0X3R5cGUodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9EWU5VRFBTSU5LX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuYyBiL2dzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2OTYzNAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC91ZHAvZ3N0bXVsdGl1ZHBzaW5rLmMKQEAgLTAsMCArMSwxODc0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBKYXJra28gUGFsdmlhaW5lbiA8amFya2tvLnBhbHZpYWluZW5Ac2VzY2EuY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAxMj4gQ29sbGFib3JhIEx0ZC4KKyAqICAgQXV0aG9yOiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1tdWx0aXVkcHNpbmsKKyAqIEBzZWVfYWxzbzogdWRwc2luaywgbXVsdGlmZHNpbmsKKyAqCisgKiBtdWx0aXVkcHNpbmsgaXMgYSBuZXR3b3JrIHNpbmsgdGhhdCBzZW5kcyBVRFAgcGFja2V0cyB0byBtdWx0aXBsZQorICogY2xpZW50cy4KKyAqIEl0IGNhbiBiZSBjb21iaW5lZCB3aXRoIHJ0cCBwYXlsb2FkIGVuY29kZXJzIHRvIGltcGxlbWVudCBSVFAgc3RyZWFtaW5nLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlICJnc3RtdWx0aXVkcHNpbmsuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisKKyNpZm5kZWYgR19PU19XSU4zMgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0L2dsaWItY29tcGF0LXByaXZhdGUuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAobXVsdGl1ZHBzaW5rX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIChtdWx0aXVkcHNpbmtfZGVidWcpCisKKyNkZWZpbmUgVURQX01BWF9TSVpFIDY1NTA3CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKKy8qIE11bHRpVURQU2luayBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIG1ldGhvZHMgKi8KKyAgU0lHTkFMX0FERCwKKyAgU0lHTkFMX1JFTU9WRSwKKyAgU0lHTkFMX0NMRUFSLAorICBTSUdOQUxfR0VUX1NUQVRTLAorCisgIC8qIHNpZ25hbHMgKi8KKyAgU0lHTkFMX0NMSUVOVF9BRERFRCwKKyAgU0lHTkFMX0NMSUVOVF9SRU1PVkVELAorCisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKKyNkZWZpbmUgREVGQVVMVF9TT0NLRVQgICAgICAgICAgICAgTlVMTAorI2RlZmluZSBERUZBVUxUX0NMT1NFX1NPQ0tFVCAgICAgICBUUlVFCisjZGVmaW5lIERFRkFVTFRfVVNFRF9TT0NLRVQgICAgICAgIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9DTElFTlRTICAgICAgICAgICAgTlVMTAorLyogRklYTUUsIHRoaXMgc2hvdWxkIGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQsIHdlIGRvbid0IG5lZWQgdG8gam9pbiBhIG11bHRpY2FzdAorICogZ3JvdXAgZm9yIHNlbmRpbmcsIGlmIHRoaXMgc29ja2V0IGlzIGFsc28gdXNlZCBmb3IgcmVjZWl2aW5nLCBpdCBzaG91bGQKKyAqIGJlIGNvbmZpZ3VyZWQgaW4gdGhlIGVsZW1lbnQgdGhhdCBkb2VzIHRoZSByZWNlaXZlLiAqLworI2RlZmluZSBERUZBVUxUX0FVVE9fTVVMVElDQVNUICAgICBUUlVFCisjZGVmaW5lIERFRkFVTFRfTVVMVElDQVNUX0lGQUNFICAgIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9UVEwgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgREVGQVVMVF9UVExfTUMgICAgICAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX0xPT1AgICAgICAgICAgICAgICBUUlVFCisjZGVmaW5lIERFRkFVTFRfRk9SQ0VfSVBWNCAgICAgICAgIEZBTFNFCisjZGVmaW5lIERFRkFVTFRfUU9TX0RTQ1AgICAgICAgICAgIC0xCisjZGVmaW5lIERFRkFVTFRfU0VORF9EVVBMSUNBVEVTICAgIFRSVUUKKyNkZWZpbmUgREVGQVVMVF9CVUZGRVJfU0laRSAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX0JJTkRfQUREUkVTUyAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfQklORF9QT1JUICAgICAgICAgIDAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQllURVNfVE9fU0VSVkUsCisgIFBST1BfQllURVNfU0VSVkVELAorICBQUk9QX1NPQ0tFVCwKKyAgUFJPUF9TT0NLRVRfVjYsCisgIFBST1BfQ0xPU0VfU09DS0VULAorICBQUk9QX1VTRURfU09DS0VULAorICBQUk9QX1VTRURfU09DS0VUX1Y2LAorICBQUk9QX0NMSUVOVFMsCisgIFBST1BfQVVUT19NVUxUSUNBU1QsCisgIFBST1BfTVVMVElDQVNUX0lGQUNFLAorICBQUk9QX1RUTCwKKyAgUFJPUF9UVExfTUMsCisgIFBST1BfTE9PUCwKKyAgUFJPUF9GT1JDRV9JUFY0LAorICBQUk9QX1FPU19EU0NQLAorICBQUk9QX1NFTkRfRFVQTElDQVRFUywKKyAgUFJPUF9CVUZGRVJfU0laRSwKKyAgUFJPUF9CSU5EX0FERFJFU1MsCisgIFBST1BfQklORF9QT1JUCit9OworCitzdGF0aWMgdm9pZCBnc3RfbXVsdGl1ZHBzaW5rX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X211bHRpdWRwc2lua19yZW5kZXIgKEdzdEJhc2VTaW5rICogc2luaywKKyAgICBHc3RCdWZmZXIgKiBidWZmZXIpOworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X211bHRpdWRwc2lua19yZW5kZXJfbGlzdCAoR3N0QmFzZVNpbmsgKiBic2luaywKKyAgICBHc3RCdWZmZXJMaXN0ICogYnVmZmVyX2xpc3QpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X211bHRpdWRwc2lua19zdGFydCAoR3N0QmFzZVNpbmsgKiBic2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X211bHRpdWRwc2lua19zdG9wIChHc3RCYXNlU2luayAqIGJzaW5rKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfbXVsdGl1ZHBzaW5rX3VubG9jayAoR3N0QmFzZVNpbmsgKiBic2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X211bHRpdWRwc2lua191bmxvY2tfc3RvcCAoR3N0QmFzZVNpbmsgKiBic2luayk7CisKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aXVkcHNpbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X211bHRpdWRwc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aXVkcHNpbmtfYWRkX2ludGVybmFsIChHc3RNdWx0aVVEUFNpbmsgKiBzaW5rLAorICAgIGNvbnN0IGdjaGFyICogaG9zdCwgZ2ludCBwb3J0LCBnYm9vbGVhbiBsb2NrKTsKK3N0YXRpYyB2b2lkIGdzdF9tdWx0aXVkcHNpbmtfY2xlYXJfaW50ZXJuYWwgKEdzdE11bHRpVURQU2luayAqIHNpbmssCisgICAgZ2Jvb2xlYW4gbG9jayk7CisKK3N0YXRpYyBndWludCBnc3RfbXVsdGl1ZHBzaW5rX3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07CisKKyNkZWZpbmUgZ3N0X211bHRpdWRwc2lua19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RNdWx0aVVEUFNpbmssIGdzdF9tdWx0aXVkcHNpbmssIEdTVF9UWVBFX0JBU0VfU0lOSyk7CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGl1ZHBzaW5rX2NsYXNzX2luaXQgKEdzdE11bHRpVURQU2lua0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCYXNlU2lua0NsYXNzICpnc3RiYXNlc2lua19jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdGJhc2VzaW5rX2NsYXNzID0gKEdzdEJhc2VTaW5rQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X211bHRpdWRwc2lua19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9tdWx0aXVkcHNpbmtfZmluYWxpemU7CisKKyAgLyoqCisgICAqIEdzdE11bHRpVURQU2luazo6YWRkOgorICAgKiBAZ3N0bXVsdGl1ZHBzaW5rOiB0aGUgc2luayBvbiB3aGljaCB0aGUgc2lnbmFsIGlzIGVtaXR0ZWQKKyAgICogQGhvc3Q6IHRoZSBob3N0bmFtZS9JUCBhZGRyZXNzIG9mIHRoZSBjbGllbnQgdG8gYWRkCisgICAqIEBwb3J0OiB0aGUgcG9ydCBvZiB0aGUgY2xpZW50IHRvIGFkZAorICAgKgorICAgKiBBZGQgYSBjbGllbnQgd2l0aCBkZXN0aW5hdGlvbiBAaG9zdCBhbmQgQHBvcnQgdG8gdGhlIGxpc3Qgb2YKKyAgICogY2xpZW50cy4gV2hlbiB0aGUgc2FtZSBob3N0L3BvcnQgcGFpciBpcyBhZGRlZCBtdWx0aXBsZSB0aW1lcywgdGhlCisgICAqIHNlbmQtZHVwbGljYXRlcyBwcm9wZXJ0eSBkZWZpbmVzIGlmIHRoZSBwYWNrZXRzIGFyZSBzZW50IG11bHRpcGxlIHRpbWVzIHRvCisgICAqIHRoZSBzYW1lIGhvc3QvcG9ydCBwYWlyIG9yIG5vdC4KKyAgICoKKyAgICogV2hlbiBhIGhvc3QvcG9ydCBwYWlyIGlzIGFkZGVkIG11bHRpcGxlIHRpbWVzLCBhbiBlcXVhbCBhbW91bnQgb2YgcmVtb3ZlCisgICAqIGNhbGxzIG11c3QgYmUgcGVyZm9ybWVkIHRvIGFjdHVhbGx5IHJlbW92ZSB0aGUgaG9zdC9wb3J0IHBhaXIgZnJvbSB0aGUgbGlzdAorICAgKiBvZiBkZXN0aW5hdGlvbnMuCisgICAqLworICBnc3RfbXVsdGl1ZHBzaW5rX3NpZ25hbHNbU0lHTkFMX0FERF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgiYWRkIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNUIHwgR19TSUdOQUxfQUNUSU9OLAorICAgICAgR19TVFJVQ1RfT0ZGU0VUIChHc3RNdWx0aVVEUFNpbmtDbGFzcywgYWRkKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMiwKKyAgICAgIEdfVFlQRV9TVFJJTkcsIEdfVFlQRV9JTlQpOworICAvKioKKyAgICogR3N0TXVsdGlVRFBTaW5rOjpyZW1vdmU6CisgICAqIEBnc3RtdWx0aXVkcHNpbms6IHRoZSBzaW5rIG9uIHdoaWNoIHRoZSBzaWduYWwgaXMgZW1pdHRlZAorICAgKiBAaG9zdDogdGhlIGhvc3RuYW1lL0lQIGFkZHJlc3Mgb2YgdGhlIGNsaWVudCB0byByZW1vdmUKKyAgICogQHBvcnQ6IHRoZSBwb3J0IG9mIHRoZSBjbGllbnQgdG8gcmVtb3ZlCisgICAqCisgICAqIFJlbW92ZSB0aGUgY2xpZW50IHdpdGggZGVzdGluYXRpb24gQGhvc3QgYW5kIEBwb3J0IGZyb20gdGhlIGxpc3Qgb2YKKyAgICogY2xpZW50cy4KKyAgICovCisgIGdzdF9tdWx0aXVkcHNpbmtfc2lnbmFsc1tTSUdOQUxfUkVNT1ZFXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJyZW1vdmUiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QgfCBHX1NJR05BTF9BQ1RJT04sCisgICAgICBHX1NUUlVDVF9PRkZTRVQgKEdzdE11bHRpVURQU2lua0NsYXNzLCByZW1vdmUpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLAorICAgICAgR19UWVBFX1NUUklORywgR19UWVBFX0lOVCk7CisgIC8qKgorICAgKiBHc3RNdWx0aVVEUFNpbms6OmNsZWFyOgorICAgKiBAZ3N0bXVsdGl1ZHBzaW5rOiB0aGUgc2luayBvbiB3aGljaCB0aGUgc2lnbmFsIGlzIGVtaXR0ZWQKKyAgICoKKyAgICogQ2xlYXIgdGhlIGxpc3Qgb2YgY2xpZW50cy4KKyAgICovCisgIGdzdF9tdWx0aXVkcHNpbmtfc2lnbmFsc1tTSUdOQUxfQ0xFQVJdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoImNsZWFyIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNUIHwgR19TSUdOQUxfQUNUSU9OLAorICAgICAgR19TVFJVQ1RfT0ZGU0VUIChHc3RNdWx0aVVEUFNpbmtDbGFzcywgY2xlYXIpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAwKTsKKyAgLyoqCisgICAqIEdzdE11bHRpVURQU2luazo6Z2V0LXN0YXRzOgorICAgKiBAZ3N0bXVsdGl1ZHBzaW5rOiB0aGUgc2luayBvbiB3aGljaCB0aGUgc2lnbmFsIGlzIGVtaXR0ZWQKKyAgICogQGhvc3Q6IHRoZSBob3N0bmFtZS9JUCBhZGRyZXNzIG9mIHRoZSBjbGllbnQgdG8gZ2V0IHN0YXRzIG9uCisgICAqIEBwb3J0OiB0aGUgcG9ydCBvZiB0aGUgY2xpZW50IHRvIGdldCBzdGF0cyBvbgorICAgKgorICAgKiBHZXQgdGhlIHN0YXRpc3RpY3Mgb2YgdGhlIGNsaWVudCB3aXRoIGRlc3RpbmF0aW9uIEBob3N0IGFuZCBAcG9ydC4KKyAgICoKKyAgICogUmV0dXJuczogYSBHc3RTdHJ1Y3R1cmU6IGJ5dGVzX3NlbnQsIHBhY2tldHNfc2VudCwKKyAgICogICAgICAgICAgIGNvbm5lY3RfdGltZSAoaW4gZXBvY2ggc2Vjb25kcyksIGRpc2Nvbm5lY3RfdGltZSAoaW4gZXBvY2ggc2Vjb25kcykKKyAgICovCisgIGdzdF9tdWx0aXVkcHNpbmtfc2lnbmFsc1tTSUdOQUxfR0VUX1NUQVRTXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJnZXQtc3RhdHMiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QgfCBHX1NJR05BTF9BQ1RJT04sCisgICAgICBHX1NUUlVDVF9PRkZTRVQgKEdzdE11bHRpVURQU2lua0NsYXNzLCBnZXRfc3RhdHMpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdTVF9UWVBFX1NUUlVDVFVSRSwgMiwKKyAgICAgIEdfVFlQRV9TVFJJTkcsIEdfVFlQRV9JTlQpOworICAvKioKKyAgICogR3N0TXVsdGlVRFBTaW5rOjpjbGllbnQtYWRkZWQ6CisgICAqIEBnc3RtdWx0aXVkcHNpbms6IHRoZSBzaW5rIGVtaXR0aW5nIHRoZSBzaWduYWwKKyAgICogQGhvc3Q6IHRoZSBob3N0bmFtZS9JUCBhZGRyZXNzIG9mIHRoZSBhZGRlZCBjbGllbnQKKyAgICogQHBvcnQ6IHRoZSBwb3J0IG9mIHRoZSBhZGRlZCBjbGllbnQKKyAgICoKKyAgICogU2lnbmFsIGVtaXRlZCB3aGVuIGEgbmV3IGNsaWVudCBpcyBhZGRlZCB0byB0aGUgbGlzdCBvZgorICAgKiBjbGllbnRzLgorICAgKi8KKyAgZ3N0X211bHRpdWRwc2lua19zaWduYWxzW1NJR05BTF9DTElFTlRfQURERURdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoImNsaWVudC1hZGRlZCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwgR19TVFJVQ1RfT0ZGU0VUIChHc3RNdWx0aVVEUFNpbmtDbGFzcywgY2xpZW50X2FkZGVkKSwKKyAgICAgIE5VTEwsIE5VTEwsIGdfY2Nsb3N1cmVfbWFyc2hhbF9nZW5lcmljLCBHX1RZUEVfTk9ORSwgMiwKKyAgICAgIEdfVFlQRV9TVFJJTkcsIEdfVFlQRV9JTlQpOworICAvKioKKyAgICogR3N0TXVsdGlVRFBTaW5rOjpjbGllbnQtcmVtb3ZlZDoKKyAgICogQGdzdG11bHRpdWRwc2luazogdGhlIHNpbmsgZW1pdHRpbmcgdGhlIHNpZ25hbAorICAgKiBAaG9zdDogdGhlIGhvc3RuYW1lL0lQIGFkZHJlc3Mgb2YgdGhlIHJlbW92ZWQgY2xpZW50CisgICAqIEBwb3J0OiB0aGUgcG9ydCBvZiB0aGUgcmVtb3ZlZCBjbGllbnQKKyAgICoKKyAgICogU2lnbmFsIGVtaXRlZCB3aGVuIGEgY2xpZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZgorICAgKiBjbGllbnRzLgorICAgKi8KKyAgZ3N0X211bHRpdWRwc2lua19zaWduYWxzW1NJR05BTF9DTElFTlRfUkVNT1ZFRF0gPQorICAgICAgZ19zaWduYWxfbmV3ICgiY2xpZW50LXJlbW92ZWQiLCBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsIEdfU1RSVUNUX09GRlNFVCAoR3N0TXVsdGlVRFBTaW5rQ2xhc3MsCisgICAgICAgICAgY2xpZW50X3JlbW92ZWQpLCBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywKKyAgICAgIEdfVFlQRV9OT05FLCAyLCBHX1RZUEVfU1RSSU5HLCBHX1RZUEVfSU5UKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0JZVEVTX1RPX1NFUlZFLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoImJ5dGVzLXRvLXNlcnZlIiwgIkJ5dGVzIHRvIHNlcnZlIiwKKyAgICAgICAgICAiTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIHRvIHNlcnZlIHRvIGNsaWVudHMiLCAwLCBHX01BWFVJTlQ2NCwgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0JZVEVTX1NFUlZFRCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50NjQgKCJieXRlcy1zZXJ2ZWQiLCAiQnl0ZXMgc2VydmVkIiwKKyAgICAgICAgICAiVG90YWwgbnVtYmVyIG9mIGJ5dGVzIHNlbnQgdG8gYWxsIGNsaWVudHMiLCAwLCBHX01BWFVJTlQ2NCwgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NPQ0tFVCwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJzb2NrZXQiLCAiU29ja2V0IEhhbmRsZSIsCisgICAgICAgICAgIlNvY2tldCB0byB1c2UgZm9yIFVEUCBzZW5kaW5nLiAoTlVMTCA9PSBhbGxvY2F0ZSkiLAorICAgICAgICAgIEdfVFlQRV9TT0NLRVQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NPQ0tFVF9WNiwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJzb2NrZXQtdjYiLCAiU29ja2V0IEhhbmRsZSBJUHY2IiwKKyAgICAgICAgICAiU29ja2V0IHRvIHVzZSBmb3IgVURQdjYgc2VuZGluZy4gKE5VTEwgPT0gYWxsb2NhdGUpIiwKKyAgICAgICAgICBHX1RZUEVfU09DS0VULCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DTE9TRV9TT0NLRVQsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImNsb3NlLXNvY2tldCIsICJDbG9zZSBzb2NrZXQiLAorICAgICAgICAgICJDbG9zZSBzb2NrZXQgaWYgcGFzc2VkIGFzIHByb3BlcnR5IG9uIHN0YXRlIGNoYW5nZSIsCisgICAgICAgICAgREVGQVVMVF9DTE9TRV9TT0NLRVQsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1VTRURfU09DS0VULAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInVzZWQtc29ja2V0IiwgIlVzZWQgU29ja2V0IEhhbmRsZSIsCisgICAgICAgICAgIlNvY2tldCBjdXJyZW50bHkgaW4gdXNlIGZvciBVRFAgc2VuZGluZy4gKE5VTEwgPT0gbm8gc29ja2V0KSIsCisgICAgICAgICAgR19UWVBFX1NPQ0tFVCwgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9VU0VEX1NPQ0tFVF9WNiwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJ1c2VkLXNvY2tldC12NiIsICJVc2VkIFNvY2tldCBIYW5kbGUgSVB2NiIsCisgICAgICAgICAgIlNvY2tldCBjdXJyZW50bHkgaW4gdXNlIGZvciBVRFB2NiBzZW5kaW5nLiAoTlVMTCA9PSBubyBzb2NrZXQpIiwKKyAgICAgICAgICBHX1RZUEVfU09DS0VULCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NMSUVOVFMsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiY2xpZW50cyIsICJDbGllbnRzIiwKKyAgICAgICAgICAiQSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBob3N0OnBvcnQgcGFpcnMgd2l0aCBkZXN0aW5hdGlvbnMiLAorICAgICAgICAgIERFRkFVTFRfQ0xJRU5UUywgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQVVUT19NVUxUSUNBU1QsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImF1dG8tbXVsdGljYXN0IiwKKyAgICAgICAgICAiQXV0b21hdGljYWxseSBqb2luL2xlYXZlIG11bHRpY2FzdCBncm91cHMiLAorICAgICAgICAgICJBdXRvbWF0aWNhbGx5IGpvaW4vbGVhdmUgdGhlIG11bHRpY2FzdCBncm91cHMsIEZBTFNFIG1lYW5zIHVzZXIiCisgICAgICAgICAgIiBoYXMgdG8gZG8gaXQgaGltc2VsZiIsIERFRkFVTFRfQVVUT19NVUxUSUNBU1QsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTVVMVElDQVNUX0lGQUNFLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoIm11bHRpY2FzdC1pZmFjZSIsICJNdWx0aWNhc3QgSW50ZXJmYWNlIiwKKyAgICAgICAgICAiVGhlIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHdoaWNoIHRvIGpvaW4gdGhlIG11bHRpY2FzdCBncm91cCIsCisgICAgICAgICAgREVGQVVMVF9NVUxUSUNBU1RfSUZBQ0UsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RUTCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0dGwiLCAiVW5pY2FzdCBUVEwiLAorICAgICAgICAgICJVc2VkIGZvciBzZXR0aW5nIHRoZSB1bmljYXN0IFRUTCBwYXJhbWV0ZXIiLAorICAgICAgICAgIDAsIDI1NSwgREVGQVVMVF9UVEwsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RUTF9NQywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0dGwtbWMiLCAiTXVsdGljYXN0IFRUTCIsCisgICAgICAgICAgIlVzZWQgZm9yIHNldHRpbmcgdGhlIG11bHRpY2FzdCBUVEwgcGFyYW1ldGVyIiwKKyAgICAgICAgICAwLCAyNTUsIERFRkFVTFRfVFRMX01DLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MT09QLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJsb29wIiwgIk11bHRpY2FzdCBMb29wYmFjayIsCisgICAgICAgICAgIlVzZWQgZm9yIHNldHRpbmcgdGhlIG11bHRpY2FzdCBsb29wIHBhcmFtZXRlci4gVFJVRSA9IGVuYWJsZSwiCisgICAgICAgICAgIiBGQUxTRSA9IGRpc2FibGUiLCBERUZBVUxUX0xPT1AsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RNdWx0aVVEUFNpbms6OmZvcmNlLWlwdjQ6CisgICAqCisgICAqIEZvcmNlIHRoZSB1c2Ugb2YgYW4gSVB2NCBzb2NrZXQuCisgICAqCisgICAqIFNpbmNlOiAxLjAuMgorICAgKi8KKyNpZm5kZWYgR1NUX1JFTU9WRV9ERVBSRUNBVEVECisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfRk9SQ0VfSVBWNCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZm9yY2UtaXB2NCIsICJGb3JjZSBJUHY0IiwKKyAgICAgICAgICAiRm9yY2luZyB0aGUgdXNlIG9mIGFuIElQdjQgc29ja2V0IChERVBSRUNBVEVELCBoYXMgbm8gZWZmZWN0IGFueW1vcmUpIiwKKyAgICAgICAgICBERUZBVUxUX0ZPUkNFX0lQVjQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR19QQVJBTV9ERVBSRUNBVEVEKSk7CisjZW5kaWYKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9RT1NfRFNDUCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJxb3MtZHNjcCIsICJRb1MgZGlmZiBzcnYgY29kZSBwb2ludCIsCisgICAgICAgICAgIlF1YWxpdHkgb2YgU2VydmljZSwgZGlmZmVyZW50aWF0ZWQgc2VydmljZXMgY29kZSBwb2ludCAoLTEgZGVmYXVsdCkiLAorICAgICAgICAgIC0xLCA2MywgREVGQVVMVF9RT1NfRFNDUCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgLyoqCisgICAqIEdzdE11bHRpVURQU2luazo6c2VuZC1kdXBsaWNhdGVzOgorICAgKgorICAgKiBXaGVuIGEgaG9zdC9wb3J0IHBhaXIgaXMgYWRkZWQgbXV0bGlwbGUgdGltZXMsIHNlbmQgdGhlIHBhY2tldCB0byB0aGUgaG9zdAorICAgKiBtdWx0aXBsZSB0aW1lcyBhcyB3ZWxsLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9TRU5EX0RVUExJQ0FURVMsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInNlbmQtZHVwbGljYXRlcyIsICJTZW5kIER1cGxpY2F0ZXMiLAorICAgICAgICAgICJXaGVuIGEgZGlzdGluYXRpb24vcG9ydCBwYWlyIGlzIGFkZGVkIG11bHRpcGxlIHRpbWVzLCBzZW5kIHBhY2tldHMgIgorICAgICAgICAgICJtdWx0aXBsZSB0aW1lcyBhcyB3ZWxsIiwgREVGQVVMVF9TRU5EX0RVUExJQ0FURVMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9CVUZGRVJfU0laRSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJidWZmZXItc2l6ZSIsICJCdWZmZXIgU2l6ZSIsCisgICAgICAgICAgIlNpemUgb2YgdGhlIGtlcm5lbCBzZW5kIGJ1ZmZlciBpbiBieXRlcywgMD1kZWZhdWx0IiwgMCwgR19NQVhJTlQsCisgICAgICAgICAgREVGQVVMVF9CVUZGRVJfU0laRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CSU5EX0FERFJFU1MsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiYmluZC1hZGRyZXNzIiwgIkJpbmQgQWRkcmVzcyIsCisgICAgICAgICAgIkFkZHJlc3MgdG8gYmluZCB0aGUgc29ja2V0IHRvIiwgREVGQVVMVF9CSU5EX0FERFJFU1MsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQklORF9QT1JULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImJpbmQtcG9ydCIsICJCaW5kIFBvcnQiLAorICAgICAgICAgICJQb3J0IHRvIGJpbmQgdGhlIHNvY2tldCB0byIsIDAsIEdfTUFYVUlOVDE2LAorICAgICAgICAgIERFRkFVTFRfQklORF9QT1JULCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJVRFAgcGFja2V0IHNlbmRlciIsCisgICAgICAiU2luay9OZXR3b3JrIiwKKyAgICAgICJTZW5kIGRhdGEgb3ZlciB0aGUgbmV0d29yayB2aWEgVURQIHRvIG9uZSBvciBtdWx0aXBsZSByZWNpcGllbnRzICIKKyAgICAgICJ3aGljaCBjYW4gYmUgYWRkZWQgb3IgcmVtb3ZlZCBhdCBydW50aW1lIHVzaW5nIGFjdGlvbiBzaWduYWxzIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPiIpOworCisgIGdzdGJhc2VzaW5rX2NsYXNzLT5yZW5kZXIgPSBnc3RfbXVsdGl1ZHBzaW5rX3JlbmRlcjsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnJlbmRlcl9saXN0ID0gZ3N0X211bHRpdWRwc2lua19yZW5kZXJfbGlzdDsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnN0YXJ0ID0gZ3N0X211bHRpdWRwc2lua19zdGFydDsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnN0b3AgPSBnc3RfbXVsdGl1ZHBzaW5rX3N0b3A7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT51bmxvY2sgPSBnc3RfbXVsdGl1ZHBzaW5rX3VubG9jazsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnVubG9ja19zdG9wID0gZ3N0X211bHRpdWRwc2lua191bmxvY2tfc3RvcDsKKyAga2xhc3MtPmFkZCA9IGdzdF9tdWx0aXVkcHNpbmtfYWRkOworICBrbGFzcy0+cmVtb3ZlID0gZ3N0X211bHRpdWRwc2lua19yZW1vdmU7CisgIGtsYXNzLT5jbGVhciA9IGdzdF9tdWx0aXVkcHNpbmtfY2xlYXI7CisgIGtsYXNzLT5nZXRfc3RhdHMgPSBnc3RfbXVsdGl1ZHBzaW5rX2dldF9zdGF0czsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAobXVsdGl1ZHBzaW5rX2RlYnVnLCAibXVsdGl1ZHBzaW5rIiwgMCwgIlVEUCBzaW5rIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGl1ZHBzaW5rX2NyZWF0ZV9jYW5jZWxsYWJsZSAoR3N0TXVsdGlVRFBTaW5rICogc2luaykKK3sKKyAgR1BvbGxGRCBwb2xsZmQ7CisKKyAgc2luay0+Y2FuY2VsbGFibGUgPSBnX2NhbmNlbGxhYmxlX25ldyAoKTsKKyAgc2luay0+bWFkZV9jYW5jZWxfZmQgPSBnX2NhbmNlbGxhYmxlX21ha2VfcG9sbGZkIChzaW5rLT5jYW5jZWxsYWJsZSwgJnBvbGxmZCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGl1ZHBzaW5rX2ZyZWVfY2FuY2VsbGFibGUgKEdzdE11bHRpVURQU2luayAqIHNpbmspCit7CisgIGlmIChzaW5rLT5tYWRlX2NhbmNlbF9mZCkgeworICAgIGdfY2FuY2VsbGFibGVfcmVsZWFzZV9mZCAoc2luay0+Y2FuY2VsbGFibGUpOworICAgIHNpbmstPm1hZGVfY2FuY2VsX2ZkID0gRkFMU0U7CisgIH0KKyAgZ19vYmplY3RfdW5yZWYgKHNpbmstPmNhbmNlbGxhYmxlKTsKKyAgc2luay0+Y2FuY2VsbGFibGUgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X211bHRpdWRwc2lua19pbml0IChHc3RNdWx0aVVEUFNpbmsgKiBzaW5rKQoreworICBndWludCBtYXhfbWVtOworCisgIGdfbXV0ZXhfaW5pdCAoJnNpbmstPmNsaWVudF9sb2NrKTsKKyAgc2luay0+Y2xpZW50cyA9IE5VTEw7CisgIHNpbmstPm51bV92NF91bmlxdWUgPSAwOworICBzaW5rLT5udW1fdjRfYWxsID0gMDsKKyAgc2luay0+bnVtX3Y2X3VuaXF1ZSA9IDA7CisgIHNpbmstPm51bV92Nl9hbGwgPSAwOworCisgIHNpbmstPnNvY2tldCA9IERFRkFVTFRfU09DS0VUOworICBzaW5rLT5zb2NrZXRfdjYgPSBERUZBVUxUX1NPQ0tFVDsKKyAgc2luay0+dXNlZF9zb2NrZXQgPSBERUZBVUxUX1VTRURfU09DS0VUOworICBzaW5rLT51c2VkX3NvY2tldF92NiA9IERFRkFVTFRfVVNFRF9TT0NLRVQ7CisgIHNpbmstPmNsb3NlX3NvY2tldCA9IERFRkFVTFRfQ0xPU0VfU09DS0VUOworICBzaW5rLT5leHRlcm5hbF9zb2NrZXQgPSAoc2luay0+c29ja2V0ICE9IE5VTEwpOworICBzaW5rLT5hdXRvX211bHRpY2FzdCA9IERFRkFVTFRfQVVUT19NVUxUSUNBU1Q7CisgIHNpbmstPnR0bCA9IERFRkFVTFRfVFRMOworICBzaW5rLT50dGxfbWMgPSBERUZBVUxUX1RUTF9NQzsKKyAgc2luay0+bG9vcCA9IERFRkFVTFRfTE9PUDsKKyAgc2luay0+Zm9yY2VfaXB2NCA9IERFRkFVTFRfRk9SQ0VfSVBWNDsKKyAgc2luay0+cW9zX2RzY3AgPSBERUZBVUxUX1FPU19EU0NQOworICBzaW5rLT5zZW5kX2R1cGxpY2F0ZXMgPSBERUZBVUxUX1NFTkRfRFVQTElDQVRFUzsKKyAgc2luay0+bXVsdGlfaWZhY2UgPSBnX3N0cmR1cCAoREVGQVVMVF9NVUxUSUNBU1RfSUZBQ0UpOworCisgIGdzdF9tdWx0aXVkcHNpbmtfY3JlYXRlX2NhbmNlbGxhYmxlIChzaW5rKTsKKworICAvKiBwcmUtYWxsb2NhdGUgT3V0cHV0VmVjdG9yLCBNYXBJbmZvIGFuZCBPdXRwdXRNZXNzYWdlIGFycmF5cworICAgKiBmb3IgdXNlIGluIHRoZSByZW5kZXIgYW5kIHJlbmRlcl9saXN0IGZ1bmN0aW9ucyAqLworICBtYXhfbWVtID0gZ3N0X2J1ZmZlcl9nZXRfbWF4X21lbW9yeSAoKTsKKworICBzaW5rLT5uX3ZlY3MgPSBtYXhfbWVtOworICBzaW5rLT52ZWNzID0gZ19uZXcgKEdPdXRwdXRWZWN0b3IsIHNpbmstPm5fdmVjcyk7CisKKyAgc2luay0+bl9tYXBzID0gbWF4X21lbTsKKyAgc2luay0+bWFwcyA9IGdfbmV3IChHc3RNYXBJbmZvLCBzaW5rLT5uX21hcHMpOworCisgIHNpbmstPm5fbWVzc2FnZXMgPSAxOworICBzaW5rLT5tZXNzYWdlcyA9IGdfbmV3IChHc3RPdXRwdXRNZXNzYWdlLCBzaW5rLT5uX21lc3NhZ2VzKTsKKworICAvKiB3ZSBhc3N1bWUgdGhhdCB0aGUgbnVtYmVyIG9mIG1lbW9yaWVzIHBlciBidWZmZXIgY2FuIGZpdCBpbnRvIGEgZ3VpbnQ4ICovCisgIGdfd2Fybl9pZl9mYWlsIChtYXhfbWVtIDw9IEdfTUFYVUlOVDgpOworfQorCitzdGF0aWMgR3N0VURQQ2xpZW50ICoKK2dzdF91ZHBfY2xpZW50X25ldyAoR3N0TXVsdGlVRFBTaW5rICogc2luaywgY29uc3QgZ2NoYXIgKiBob3N0LCBnaW50IHBvcnQpCit7CisgIEdzdFVEUENsaWVudCAqY2xpZW50OworICBHSW5ldEFkZHJlc3MgKmFkZHI7CisgIEdSZXNvbHZlciAqcmVzb2x2ZXI7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICBhZGRyID0gZ19pbmV0X2FkZHJlc3NfbmV3X2Zyb21fc3RyaW5nIChob3N0KTsKKyAgaWYgKCFhZGRyKSB7CisgICAgR0xpc3QgKnJlc3VsdHM7CisKKyAgICByZXNvbHZlciA9IGdfcmVzb2x2ZXJfZ2V0X2RlZmF1bHQgKCk7CisgICAgcmVzdWx0cyA9CisgICAgICAgIGdfcmVzb2x2ZXJfbG9va3VwX2J5X25hbWUgKHJlc29sdmVyLCBob3N0LCBzaW5rLT5jYW5jZWxsYWJsZSwgJmVycik7CisgICAgaWYgKCFyZXN1bHRzKQorICAgICAgZ290byBuYW1lX3Jlc29sdmU7CisgICAgYWRkciA9IEdfSU5FVF9BRERSRVNTIChnX29iamVjdF9yZWYgKHJlc3VsdHMtPmRhdGEpKTsKKworICAgIGdfcmVzb2x2ZXJfZnJlZV9hZGRyZXNzZXMgKHJlc3VsdHMpOworICAgIGdfb2JqZWN0X3VucmVmIChyZXNvbHZlcik7CisgIH0KKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgIHsKKyAgICBnY2hhciAqaXAgPSBnX2luZXRfYWRkcmVzc190b19zdHJpbmcgKGFkZHIpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgIklQIGFkZHJlc3MgZm9yIGhvc3QgJXMgaXMgJXMiLCBob3N0LCBpcCk7CisgICAgZ19mcmVlIChpcCk7CisgIH0KKyNlbmRpZgorCisgIGNsaWVudCA9IGdfc2xpY2VfbmV3MCAoR3N0VURQQ2xpZW50KTsKKyAgY2xpZW50LT5yZWZfY291bnQgPSAxOworICBjbGllbnQtPmFkZF9jb3VudCA9IDA7CisgIGNsaWVudC0+aG9zdCA9IGdfc3RyZHVwIChob3N0KTsKKyAgY2xpZW50LT5wb3J0ID0gcG9ydDsKKyAgY2xpZW50LT5hZGRyID0gZ19pbmV0X3NvY2tldF9hZGRyZXNzX25ldyAoYWRkciwgcG9ydCk7CisgIGdfb2JqZWN0X3VucmVmIChhZGRyKTsKKworICByZXR1cm4gY2xpZW50OworCituYW1lX3Jlc29sdmU6CisgIHsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICBnX29iamVjdF91bnJlZiAocmVzb2x2ZXIpOworCisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLyogY2FsbCB3aXRoIGNsaWVudCBsb2NrIGhlbGQgKi8KK3N0YXRpYyB2b2lkCitnc3RfdWRwX2NsaWVudF91bnJlZiAoR3N0VURQQ2xpZW50ICogY2xpZW50KQoreworICBpZiAoLS1jbGllbnQtPnJlZl9jb3VudCA9PSAwKSB7CisgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudC0+YWRkcik7CisgICAgZ19mcmVlIChjbGllbnQtPmhvc3QpOworICAgIGdfc2xpY2VfZnJlZSAoR3N0VURQQ2xpZW50LCBjbGllbnQpOworICB9Cit9CisKKy8qIGNhbGwgd2l0aCBjbGllbnQgbG9jayBoZWxkICovCitzdGF0aWMgaW5saW5lIEdzdFVEUENsaWVudCAqCitnc3RfdWRwX2NsaWVudF9yZWYgKEdzdFVEUENsaWVudCAqIGNsaWVudCkKK3sKKyAgKytjbGllbnQtPnJlZl9jb3VudDsKKyAgcmV0dXJuIGNsaWVudDsKK30KKworc3RhdGljIGdpbnQKK2NsaWVudF9jb21wYXJlIChHc3RVRFBDbGllbnQgKiBhLCBHc3RVRFBDbGllbnQgKiBiKQoreworICBpZiAoKGEtPnBvcnQgPT0gYi0+cG9ydCkgJiYgKHN0cmNtcCAoYS0+aG9zdCwgYi0+aG9zdCkgPT0gMCkpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGl1ZHBzaW5rX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RNdWx0aVVEUFNpbmsgKnNpbms7CisKKyAgc2luayA9IEdTVF9NVUxUSVVEUFNJTksgKG9iamVjdCk7CisKKyAgZ19saXN0X2ZvcmVhY2ggKHNpbmstPmNsaWVudHMsIChHRnVuYykgZ3N0X3VkcF9jbGllbnRfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoc2luay0+Y2xpZW50cyk7CisKKyAgaWYgKHNpbmstPnNvY2tldCkKKyAgICBnX29iamVjdF91bnJlZiAoc2luay0+c29ja2V0KTsKKyAgc2luay0+c29ja2V0ID0gTlVMTDsKKworICBpZiAoc2luay0+c29ja2V0X3Y2KQorICAgIGdfb2JqZWN0X3VucmVmIChzaW5rLT5zb2NrZXRfdjYpOworICBzaW5rLT5zb2NrZXRfdjYgPSBOVUxMOworCisgIGlmIChzaW5rLT51c2VkX3NvY2tldCkKKyAgICBnX29iamVjdF91bnJlZiAoc2luay0+dXNlZF9zb2NrZXQpOworICBzaW5rLT51c2VkX3NvY2tldCA9IE5VTEw7CisKKyAgaWYgKHNpbmstPnVzZWRfc29ja2V0X3Y2KQorICAgIGdfb2JqZWN0X3VucmVmIChzaW5rLT51c2VkX3NvY2tldF92Nik7CisgIHNpbmstPnVzZWRfc29ja2V0X3Y2ID0gTlVMTDsKKworICBnc3RfbXVsdGl1ZHBzaW5rX2ZyZWVfY2FuY2VsbGFibGUgKHNpbmspOworCisgIGdfZnJlZSAoc2luay0+bXVsdGlfaWZhY2UpOworICBzaW5rLT5tdWx0aV9pZmFjZSA9IE5VTEw7CisKKyAgZ19mcmVlIChzaW5rLT52ZWNzKTsKKyAgc2luay0+dmVjcyA9IE5VTEw7CisgIGdfZnJlZSAoc2luay0+bWFwcyk7CisgIHNpbmstPm1hcHMgPSBOVUxMOworICBnX2ZyZWUgKHNpbmstPm1lc3NhZ2VzKTsKKyAgc2luay0+bWVzc2FnZXMgPSBOVUxMOworCisgIGdfZnJlZSAoc2luay0+YmluZF9hZGRyZXNzKTsKKyAgc2luay0+YmluZF9hZGRyZXNzID0gTlVMTDsKKworICBnX211dGV4X2NsZWFyICgmc2luay0+Y2xpZW50X2xvY2spOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworLyogcmVwbGFjZW1lbnQgdW50aWwgd2UgY2FuIGRlcGVuZCB1bmNvbmRpdGlvbmFsbHkgb24gdGhlIHJlYWwgb25lIGluIEdMaWIgKi8KKyNpZm5kZWYgSEFWRV9HX1NPQ0tFVF9TRU5EX01FU1NBR0VTCisjZGVmaW5lIGdfc29ja2V0X3NlbmRfbWVzc2FnZXMgZ3N0X3NvY2tldF9zZW5kX21lc3NhZ2VzCisKK3N0YXRpYyBnaW50Citnc3Rfc29ja2V0X3NlbmRfbWVzc2FnZXMgKEdTb2NrZXQgKiBzb2NrZXQsIEdzdE91dHB1dE1lc3NhZ2UgKiBtZXNzYWdlcywKKyAgICBndWludCBudW1fbWVzc2FnZXMsIGdpbnQgZmxhZ3MsIEdDYW5jZWxsYWJsZSAqIGNhbmNlbGxhYmxlLCBHRXJyb3IgKiogZXJyb3IpCit7CisgIGdzc2l6ZSByZXN1bHQ7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX21lc3NhZ2VzOyArK2kpIHsKKyAgICBHc3RPdXRwdXRNZXNzYWdlICptc2cgPSAmbWVzc2FnZXNbaV07CisgICAgR0Vycm9yICptc2dfZXJyb3IgPSBOVUxMOworCisgICAgcmVzdWx0ID0gZ19zb2NrZXRfc2VuZF9tZXNzYWdlIChzb2NrZXQsIG1zZy0+YWRkcmVzcywKKyAgICAgICAgbXNnLT52ZWN0b3JzLCBtc2ctPm51bV92ZWN0b3JzLAorICAgICAgICBtc2ctPmNvbnRyb2xfbWVzc2FnZXMsIG1zZy0+bnVtX2NvbnRyb2xfbWVzc2FnZXMsCisgICAgICAgIGZsYWdzLCBjYW5jZWxsYWJsZSwgJm1zZ19lcnJvcik7CisKKyAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgLyogaWYgd2UgY291bGRuJ3Qgc2VuZCBhbGwgbWVzc2FnZXMsIGp1c3QgcmV0dXJuIGhvdyBtYW55IHdlIGRpZAorICAgICAgICogbWFuYWdlIHRvIHNlbmQsIHByb3ZpZGVkIHdlIG1hbmFnZWQgdG8gc2VuZCBhdCBsZWFzdCBvbmUgKi8KKyAgICAgIGlmIChtc2dfZXJyb3ItPmNvZGUgPT0gR19JT19FUlJPUl9XT1VMRF9CTE9DSyAmJiBpID4gMCkgeworICAgICAgICBnX2Vycm9yX2ZyZWUgKG1zZ19lcnJvcik7CisgICAgICAgIHJldHVybiBpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ19wcm9wYWdhdGVfZXJyb3IgKGVycm9yLCBtc2dfZXJyb3IpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorCisgICAgbXNnLT5ieXRlc19zZW50ID0gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIGk7Cit9CisjZW5kaWYgLyogSEFWRV9HX1NPQ0tFVF9TRU5EX01FU1NBR0VTICovCisKK3N0YXRpYyBnc2l6ZQorZmlsbF92ZWN0b3JzIChHT3V0cHV0VmVjdG9yICogdmVjcywgR3N0TWFwSW5mbyAqIG1hcHMsIGd1aW50IG4sIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0TWVtb3J5ICptZW07CisgIGdzaXplIHNpemUgPSAwOworICBndWludCBpOworCisgIGdfYXNzZXJ0IChnc3RfYnVmZmVyX25fbWVtb3J5IChidWYpID09IG4pOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICBtZW0gPSBnc3RfYnVmZmVyX3BlZWtfbWVtb3J5IChidWYsIGkpOworICAgIGlmIChnc3RfbWVtb3J5X21hcCAobWVtLCAmbWFwc1tpXSwgR1NUX01BUF9SRUFEKSkgeworICAgICAgdmVjc1tpXS5idWZmZXIgPSBtYXBzW2ldLmRhdGE7CisgICAgICB2ZWNzW2ldLnNpemUgPSBtYXBzW2ldLnNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9XQVJOSU5HICgiRmFpbGVkIHRvIG1hcCBtZW1vcnkgJXAgZm9yIHJlYWRpbmciLCBtZW0pOworICAgICAgdmVjc1tpXS5idWZmZXIgPSAiIjsKKyAgICAgIHZlY3NbaV0uc2l6ZSA9IDA7CisgICAgfQorICAgIHNpemUgKz0gdmVjc1tpXS5zaXplOworICB9CisKKyAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBnc2l6ZQorZ3N0X3VkcF9jYWxjX21lc3NhZ2Vfc2l6ZSAoR3N0T3V0cHV0TWVzc2FnZSAqIG1zZykKK3sKKyAgZ3NpemUgc2l6ZSA9IDA7CisgIGd1aW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG1zZy0+bnVtX3ZlY3RvcnM7ICsraSkKKyAgICBzaXplICs9IG1zZy0+dmVjdG9yc1tpXS5zaXplOworCisgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgZ2ludAorZ3N0X3VkcF9tZXNzc2FnZXNfZmluZF9maXJzdF9ub3Rfc2VudCAoR3N0T3V0cHV0TWVzc2FnZSAqIG1lc3NhZ2VzLAorICAgIGd1aW50IG51bV9tZXNzYWdlcykKK3sKKyAgZ3VpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX21lc3NhZ2VzOyArK2kpIHsKKyAgICBHc3RPdXRwdXRNZXNzYWdlICptc2cgPSAmbWVzc2FnZXNbaV07CisKKyAgICBpZiAobXNnLT5ieXRlc19zZW50ID09IDAgJiYgZ3N0X3VkcF9jYWxjX21lc3NhZ2Vfc2l6ZSAobXNnKSA+IDApCisgICAgICByZXR1cm4gaTsKKyAgfQorCisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBnY2hhciAqCitnc3RfdWRwX2FkZHJlc3NfZ2V0X3N0cmluZyAoR1NvY2tldEFkZHJlc3MgKiBhZGRyLCBnY2hhciAqIHMsIGdzaXplIHNpemUpCit7CisgIEdJbmV0U29ja2V0QWRkcmVzcyAqaXNhID0gR19JTkVUX1NPQ0tFVF9BRERSRVNTIChhZGRyKTsKKyAgR0luZXRBZGRyZXNzICppYTsKKyAgZ2NoYXIgKmFkZHJfc3RyOworCisgIGlhID0gZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9hZGRyZXNzIChpc2EpOworICBhZGRyX3N0ciA9IGdfaW5ldF9hZGRyZXNzX3RvX3N0cmluZyAoaWEpOworICBnX3NucHJpbnRmIChzLCBzaXplLCAiJXM6JXUiLCBhZGRyX3N0ciwgZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9wb3J0IChpc2EpKTsKKyAgZ19mcmVlIChhZGRyX3N0cik7CisKKyAgcmV0dXJuIHM7Cit9CisKKy8qIFdyYXBwZXIgYXJvdW5kIGdfc29ja2V0X3NlbmRfbWVzc2FnZXMoKSBwbHVzIGVycm9yIGhhbmRsaW5nIChpZ25vcmluZykuCisgKiBSZXR1cm5zIEZBTFNFIGlmIHdlIGdvdCBjYW5jZWxsZWQsIG90aGVyd2lzZSBUUlVFLiAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tdWx0aXVkcHNpbmtfc2VuZF9tZXNzYWdlcyAoR3N0TXVsdGlVRFBTaW5rICogc2luaywgR1NvY2tldCAqIHNvY2tldCwKKyAgICBHc3RPdXRwdXRNZXNzYWdlICogbWVzc2FnZXMsIGd1aW50IG51bV9tZXNzYWdlcykKK3sKKyAgZ2Jvb2xlYW4gc2VudF9tYXhfc2l6ZV93YXJuaW5nID0gRkFMU0U7CisKKyAgd2hpbGUgKG51bV9tZXNzYWdlcyA+IDApIHsKKyAgICBnY2hhciBhc3RyWzY0XSBHX0dOVUNfVU5VU0VEOworICAgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgICBndWludCBtc2dfc2l6ZSwgc2tpcCwgaTsKKyAgICBnaW50IHJldCwgZXJyX2lkeDsKKworICAgIHJldCA9IGdfc29ja2V0X3NlbmRfbWVzc2FnZXMgKHNvY2tldCwgbWVzc2FnZXMsIG51bV9tZXNzYWdlcywgMCwKKyAgICAgICAgc2luay0+Y2FuY2VsbGFibGUsICZlcnIpOworCisgICAgaWYgKEdfVU5MSUtFTFkgKHJldCA8IDApKSB7CisgICAgICBHc3RPdXRwdXRNZXNzYWdlICptc2c7CisKKyAgICAgIGlmIChnX2Vycm9yX21hdGNoZXMgKGVyciwgR19JT19FUlJPUiwgR19JT19FUlJPUl9DQU5DRUxMRUQpKSB7CisgICAgICAgIEdzdEZsb3dSZXR1cm4gZmxvd19yZXQ7CisKKyAgICAgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisKKyAgICAgICAgZmxvd19yZXQgPSBnc3RfYmFzZV9zaW5rX3dhaXRfcHJlcm9sbCAoR1NUX0JBU0VfU0lOSyAoc2luaykpOworCisgICAgICAgIGlmIChmbG93X3JldCA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICByZXR1cm4gZmxvd19yZXQ7CisgICAgICB9CisKKyAgICAgIGVycl9pZHggPSBnc3RfdWRwX21lc3NzYWdlc19maW5kX2ZpcnN0X25vdF9zZW50IChtZXNzYWdlcywgbnVtX21lc3NhZ2VzKTsKKyAgICAgIGlmIChlcnJfaWR4IDwgMCkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIG1zZyA9ICZtZXNzYWdlc1tlcnJfaWR4XTsKKyAgICAgIG1zZ19zaXplID0gZ3N0X3VkcF9jYWxjX21lc3NhZ2Vfc2l6ZSAobXNnKTsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHNpbmssICJlcnJvciBzZW5kaW5nICV1IGJ5dGVzIHRvIGNsaWVudCAlczogJXMiLCBtc2dfc2l6ZSwKKyAgICAgICAgICBnc3RfdWRwX2FkZHJlc3NfZ2V0X3N0cmluZyAobXNnLT5hZGRyZXNzLCBhc3RyLCBzaXplb2YgKGFzdHIpKSwKKyAgICAgICAgICBlcnItPm1lc3NhZ2UpOworCisgICAgICBza2lwID0gMTsKKyAgICAgIGlmIChtc2dfc2l6ZSA+IFVEUF9NQVhfU0laRSkgeworICAgICAgICBpZiAoIXNlbnRfbWF4X3NpemVfd2FybmluZykgeworICAgICAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNpbmssIFJFU09VUkNFLCBXUklURSwKKyAgICAgICAgICAgICAgKCJBdHRlbXB0aW5nIHRvIHNlbmQgYSBVRFAgcGFja2V0cyBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemUgIgorICAgICAgICAgICAgICAgICAgIigldSA+ICVkKSIsIG1zZ19zaXplLCBVRFBfTUFYX1NJWkUpLAorICAgICAgICAgICAgICAoIlJlYXNvbjogJXMiLCBlcnIgPyBlcnItPm1lc3NhZ2UgOiAidW5rbm93biByZWFzb24iKSk7CisgICAgICAgICAgc2VudF9tYXhfc2l6ZV93YXJuaW5nID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNpbmssIFJFU09VUkNFLCBXUklURSwKKyAgICAgICAgICAgICgiRXJyb3Igc2VuZGluZyBVRFAgcGFja2V0cyIpLCAoImNsaWVudCAlcywgcmVhc29uOiAlcyIsCisgICAgICAgICAgICAgICAgZ3N0X3VkcF9hZGRyZXNzX2dldF9zdHJpbmcgKG1zZy0+YWRkcmVzcywgYXN0ciwgc2l6ZW9mIChhc3RyKSksCisgICAgICAgICAgICAgICAgKGVyciAhPSBOVUxMKSA/IGVyci0+bWVzc2FnZSA6ICJ1bmtub3duIHJlYXNvbiIpKTsKKworICAgICAgICBmb3IgKGkgPSBlcnJfaWR4ICsgMTsgaSA8IG51bV9tZXNzYWdlczsgKytpLCArK3NraXApIHsKKyAgICAgICAgICBpZiAobWVzc2FnZXNbaV0uYWRkcmVzcyAhPSBtc2ctPmFkZHJlc3MpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2tpcHBpbmcgJWQgbWVzc2FnZShzKSB0byBzYW1lIGNsaWVudCIsIHNraXApOworICAgICAgfQorCisgICAgICAvKiBpZ25vcmUgYW55IGVycm9ycyBhbmQgdHJ5IHNlbmRpbmcgdGhlIHJlc3QgKi8KKyAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgcmV0ID0gc2tpcDsKKyAgICB9CisKKyAgICBnX2Fzc2VydCAocmV0IDw9IG51bV9tZXNzYWdlcyk7CisKKyAgICBtZXNzYWdlcyArPSByZXQ7CisgICAgbnVtX21lc3NhZ2VzIC09IHJldDsKKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF9tdWx0aXVkcHNpbmtfcmVuZGVyX2J1ZmZlcnMgKEdzdE11bHRpVURQU2luayAqIHNpbmssIEdzdEJ1ZmZlciAqKiBidWZmZXJzLAorICAgIGd1aW50IG51bV9idWZmZXJzLCBndWludDggKiBtZW1fbnVtcywgZ3VpbnQgdG90YWxfbWVtX251bSkKK3sKKyAgR3N0T3V0cHV0TWVzc2FnZSAqbXNnczsKKyAgZ2Jvb2xlYW4gc2VuZF9kdXBsaWNhdGVzOworICBHc3RVRFBDbGllbnQgKipjbGllbnRzOworICBHT3V0cHV0VmVjdG9yICp2ZWNzOworICBHc3RNYXBJbmZvICptYXBfaW5mb3M7CisgIEdzdEZsb3dSZXR1cm4gZmxvd19yZXQ7CisgIGd1aW50IG51bV9hZGRyX3Y0LCBudW1fYWRkcl92NjsKKyAgZ3VpbnQgbnVtX2FkZHIsIG51bV9tc2dzOworICBndWludCBpLCBqLCBtZW07CisgIGdzaXplIHNpemUgPSAwOworICBHTGlzdCAqbDsKKworICBzZW5kX2R1cGxpY2F0ZXMgPSBzaW5rLT5zZW5kX2R1cGxpY2F0ZXM7CisKKyAgZ19tdXRleF9sb2NrICgmc2luay0+Y2xpZW50X2xvY2spOworCisgIGlmIChzZW5kX2R1cGxpY2F0ZXMpIHsKKyAgICBudW1fYWRkcl92NCA9IHNpbmstPm51bV92NF9hbGw7CisgICAgbnVtX2FkZHJfdjYgPSBzaW5rLT5udW1fdjZfYWxsOworICB9IGVsc2UgeworICAgIG51bV9hZGRyX3Y0ID0gc2luay0+bnVtX3Y0X3VuaXF1ZTsKKyAgICBudW1fYWRkcl92NiA9IHNpbmstPm51bV92Nl91bmlxdWU7CisgIH0KKyAgbnVtX2FkZHIgPSBudW1fYWRkcl92NCArIG51bV9hZGRyX3Y2OworCisgIGlmIChudW1fYWRkciA9PSAwKQorICAgIGdvdG8gbm9fY2xpZW50czsKKworICBjbGllbnRzID0gZ19uZXdhIChHc3RVRFBDbGllbnQgKiwgbnVtX2FkZHIpOworICBmb3IgKGwgPSBzaW5rLT5jbGllbnRzLCBpID0gMDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworICAgIEdzdFVEUENsaWVudCAqY2xpZW50ID0gbC0+ZGF0YTsKKworICAgIGNsaWVudHNbaSsrXSA9IGdzdF91ZHBfY2xpZW50X3JlZiAoY2xpZW50KTsKKyAgICBmb3IgKGogPSAxOyBzZW5kX2R1cGxpY2F0ZXMgJiYgaiA8IGNsaWVudC0+YWRkX2NvdW50OyArK2opCisgICAgICBjbGllbnRzW2krK10gPSBnc3RfdWRwX2NsaWVudF9yZWYgKGNsaWVudCk7CisgIH0KKyAgZ19hc3NlcnRfY21wdWludCAoaSwgPT0sIG51bV9hZGRyKTsKKworICBnX211dGV4X3VubG9jayAoJnNpbmstPmNsaWVudF9sb2NrKTsKKworICBHU1RfTE9HX09CSkVDVCAoc2luaywgIiV1IGJ1ZmZlcnMsICV1IG1lbW9yaWVzIC0+IHRvIGJlIHNlbnQgdG8gJXUgY2xpZW50cyIsCisgICAgICBudW1fYnVmZmVycywgdG90YWxfbWVtX251bSwgbnVtX2FkZHIpOworCisgIC8qIGVuc3VyZSBvdXIgcHJlLWFsbG9jYXRlZCBzY3JhdGNoIHNwYWNlIGFycmF5cyBhcmUgbGFyZ2UgZW5vdWdoICovCisgIGlmIChzaW5rLT5uX3ZlY3MgPCB0b3RhbF9tZW1fbnVtKSB7CisgICAgc2luay0+bl92ZWNzID0gR1NUX1JPVU5EX1VQXzE2ICh0b3RhbF9tZW1fbnVtKTsKKyAgICBnX2ZyZWUgKHNpbmstPnZlY3MpOworICAgIHNpbmstPnZlY3MgPSBnX25ldyAoR091dHB1dFZlY3Rvciwgc2luay0+bl92ZWNzKTsKKyAgfQorICB2ZWNzID0gc2luay0+dmVjczsKKworICBpZiAoc2luay0+bl9tYXBzIDwgdG90YWxfbWVtX251bSkgeworICAgIHNpbmstPm5fbWFwcyA9IEdTVF9ST1VORF9VUF8xNiAodG90YWxfbWVtX251bSk7CisgICAgZ19mcmVlIChzaW5rLT5tYXBzKTsKKyAgICBzaW5rLT5tYXBzID0gZ19uZXcgKEdzdE1hcEluZm8sIHNpbmstPm5fbWFwcyk7CisgIH0KKyAgbWFwX2luZm9zID0gc2luay0+bWFwczsKKworICBudW1fbXNncyA9IG51bV9hZGRyICogbnVtX2J1ZmZlcnM7CisgIGlmIChzaW5rLT5uX21lc3NhZ2VzIDwgbnVtX21zZ3MpIHsKKyAgICBzaW5rLT5uX21lc3NhZ2VzID0gR1NUX1JPVU5EX1VQXzE2IChudW1fbXNncyk7CisgICAgZ19mcmVlIChzaW5rLT5tZXNzYWdlcyk7CisgICAgc2luay0+bWVzc2FnZXMgPSBnX25ldyAoR3N0T3V0cHV0TWVzc2FnZSwgc2luay0+bl9tZXNzYWdlcyk7CisgIH0KKyAgbXNncyA9IHNpbmstPm1lc3NhZ2VzOworCisgIC8qIHBvcHVsYXRlIGZpcnN0IG51bV9idWZmZXJzIG1lc3NhZ2VzIHdpdGggb3V0cHV0IHZlY3RvcnMgZm9yIHRoZSBidWZmZXJzICovCisgIGZvciAoaSA9IDAsIG1lbSA9IDA7IGkgPCBudW1fYnVmZmVyczsgKytpKSB7CisgICAgc2l6ZSArPSBmaWxsX3ZlY3RvcnMgKCZ2ZWNzW21lbV0sICZtYXBfaW5mb3NbbWVtXSwgbWVtX251bXNbaV0sIGJ1ZmZlcnNbaV0pOworICAgIG1zZ3NbaV0udmVjdG9ycyA9ICZ2ZWNzW21lbV07CisgICAgbXNnc1tpXS5udW1fdmVjdG9ycyA9IG1lbV9udW1zW2ldOworICAgIG1zZ3NbaV0ubnVtX2NvbnRyb2xfbWVzc2FnZXMgPSAwOworICAgIG1zZ3NbaV0uYnl0ZXNfc2VudCA9IDA7CisgICAgbXNnc1tpXS5jb250cm9sX21lc3NhZ2VzID0gTlVMTDsKKyAgICBtc2dzW2ldLmFkZHJlc3MgPSBjbGllbnRzWzBdLT5hZGRyOworICAgIG1lbSArPSBtZW1fbnVtc1tpXTsKKyAgfQorCisgIC8qIEZJWE1FOiBob3cgYWJvdXQgc29tZSBsb2NraW5nPyAodGhlcmUgd2Fzbid0IGFueSBiZWZvcmUgZWl0aGVyLCBidXQuLikgKi8KKyAgc2luay0+Ynl0ZXNfdG9fc2VydmUgKz0gc2l6ZTsKKworICAvKiBub3cgY29weSB0aGUgcHJlLWZpbGxlZCBudW1fYnVmZmVyIG1lc3NhZ2VzIG92ZXIgdG8gdGhlIG5leHQgbnVtX2J1ZmZlcgorICAgKiBtZXNzYWdlcyBmb3IgdGhlIG5leHQgY2xpZW50LCB3aGVyZSB3ZSBhbHNvIGNoYW5nZSB0aGUgdGFyZ2V0IGFkZGRyZXNzICovCisgIGZvciAoaSA9IDE7IGkgPCBudW1fYWRkcjsgKytpKSB7CisgICAgZm9yIChqID0gMDsgaiA8IG51bV9idWZmZXJzOyArK2opIHsKKyAgICAgIG1zZ3NbaSAqIG51bV9idWZmZXJzICsgal0gPSBtc2dzW2pdOworICAgICAgbXNnc1tpICogbnVtX2J1ZmZlcnMgKyBqXS5hZGRyZXNzID0gY2xpZW50c1tpXS0+YWRkcjsKKyAgICB9CisgIH0KKworICAvKiBub3cgc2VuZCBpdCEgKi8KKworICAvKiBubyBJUHY0IHNvY2tldD8gU2VuZCBpdCBhbGwgZnJvbSB0aGUgSVB2NiBzb2NrZXQgdGhlbi4uICovCisgIGlmIChzaW5rLT51c2VkX3NvY2tldCA9PSBOVUxMKSB7CisgICAgZmxvd19yZXQgPSBnc3RfbXVsdGl1ZHBzaW5rX3NlbmRfbWVzc2FnZXMgKHNpbmssIHNpbmstPnVzZWRfc29ja2V0X3Y2LAorICAgICAgICBtc2dzLCBudW1fbXNncyk7CisgIH0gZWxzZSB7CisgICAgZ3VpbnQgbnVtX21zZ3NfdjQgPSBudW1fYnVmZmVycyAqIG51bV9hZGRyX3Y0OworICAgIGd1aW50IG51bV9tc2dzX3Y2ID0gbnVtX2J1ZmZlcnMgKiBudW1fYWRkcl92NjsKKworICAgIC8qIG91ciBjbGllbnQgbGlzdCBpcyBzb3J0ZWQgd2l0aCBJUHY0IGNsaWVudHMgZmlyc3QgYW5kIElQdjYgb25lcyBsYXN0ICovCisgICAgZmxvd19yZXQgPSBnc3RfbXVsdGl1ZHBzaW5rX3NlbmRfbWVzc2FnZXMgKHNpbmssIHNpbmstPnVzZWRfc29ja2V0LAorICAgICAgICBtc2dzLCBudW1fbXNnc192NCk7CisKKyAgICBpZiAoZmxvd19yZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIGNhbmNlbGxlZDsKKworICAgIGZsb3dfcmV0ID0gZ3N0X211bHRpdWRwc2lua19zZW5kX21lc3NhZ2VzIChzaW5rLCBzaW5rLT51c2VkX3NvY2tldF92NiwKKyAgICAgICAgbXNncyArIG51bV9tc2dzX3Y0LCBudW1fbXNnc192Nik7CisgIH0KKworICBpZiAoZmxvd19yZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBjYW5jZWxsZWQ7CisKKyAgLyogbm93IHVwZGF0ZSBzdGF0cyAqLworICBnX211dGV4X2xvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9hZGRyOyArK2kpIHsKKyAgICBHc3RVRFBDbGllbnQgKmNsaWVudCA9IGNsaWVudHNbaV07CisKKyAgICBmb3IgKGogPSAwOyBqIDwgbnVtX2J1ZmZlcnM7ICsraikgeworICAgICAgZ3NpemUgYnl0ZXNfc2VudDsKKworICAgICAgYnl0ZXNfc2VudCA9IG1zZ3NbaSAqIG51bV9idWZmZXJzICsgal0uYnl0ZXNfc2VudDsKKworICAgICAgY2xpZW50LT5ieXRlc19zZW50ICs9IGJ5dGVzX3NlbnQ7CisgICAgICBjbGllbnQtPnBhY2tldHNfc2VudCsrOworICAgICAgc2luay0+Ynl0ZXNfc2VydmVkICs9IGJ5dGVzX3NlbnQ7CisgICAgfQorICAgIGdzdF91ZHBfY2xpZW50X3VucmVmIChjbGllbnQpOworICB9CisKKyAgZ19tdXRleF91bmxvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisKK291dDoKKworICBmb3IgKGkgPSAwOyBpIDwgbWVtOyArK2kpCisgICAgZ3N0X21lbW9yeV91bm1hcCAobWFwX2luZm9zW2ldLm1lbW9yeSwgJm1hcF9pbmZvc1tpXSk7CisKKyAgcmV0dXJuIGZsb3dfcmV0OworCitub19jbGllbnRzOgorICB7CisgICAgZ19tdXRleF91bmxvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNpbmssICJubyBjbGllbnRzIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CitjYW5jZWxsZWQ6CisgIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHNpbmssICJjYW5jZWxsZWQiKTsKKworICAgIGdfbXV0ZXhfbG9jayAoJnNpbmstPmNsaWVudF9sb2NrKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2FkZHI7ICsraSkKKyAgICAgIGdzdF91ZHBfY2xpZW50X3VucmVmIChjbGllbnRzW2ldKTsKKyAgICBnX211dGV4X3VubG9jayAoJnNpbmstPmNsaWVudF9sb2NrKTsKKyAgICBnb3RvIG91dDsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X211bHRpdWRwc2lua19yZW5kZXJfbGlzdCAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0QnVmZmVyTGlzdCAqIGJ1ZmZlcl9saXN0KQoreworICBHc3RNdWx0aVVEUFNpbmsgKnNpbms7CisgIEdzdEJ1ZmZlciAqKmJ1ZmZlcnM7CisgIEdzdEZsb3dSZXR1cm4gZmxvdzsKKyAgZ3VpbnQ4ICptZW1fbnVtczsKKyAgZ3VpbnQgdG90YWxfbWVtczsKKyAgZ3VpbnQgaSwgbnVtX2J1ZmZlcnM7CisKKyAgc2luayA9IEdTVF9NVUxUSVVEUFNJTktfQ0FTVCAoYnNpbmspOworCisgIG51bV9idWZmZXJzID0gZ3N0X2J1ZmZlcl9saXN0X2xlbmd0aCAoYnVmZmVyX2xpc3QpOworICBpZiAobnVtX2J1ZmZlcnMgPT0gMCkKKyAgICBnb3RvIG5vX2RhdGE7CisKKyAgYnVmZmVycyA9IGdfbmV3YSAoR3N0QnVmZmVyICosIG51bV9idWZmZXJzKTsKKyAgbWVtX251bXMgPSBnX25ld2EgKGd1aW50OCwgbnVtX2J1ZmZlcnMpOworICBmb3IgKGkgPSAwLCB0b3RhbF9tZW1zID0gMDsgaSA8IG51bV9idWZmZXJzOyArK2kpIHsKKyAgICBidWZmZXJzW2ldID0gZ3N0X2J1ZmZlcl9saXN0X2dldCAoYnVmZmVyX2xpc3QsIGkpOworICAgIG1lbV9udW1zW2ldID0gZ3N0X2J1ZmZlcl9uX21lbW9yeSAoYnVmZmVyc1tpXSk7CisgICAgdG90YWxfbWVtcyArPSBtZW1fbnVtc1tpXTsKKyAgfQorCisgIGZsb3cgPSBnc3RfbXVsdGl1ZHBzaW5rX3JlbmRlcl9idWZmZXJzIChzaW5rLCBidWZmZXJzLCBudW1fYnVmZmVycywKKyAgICAgIG1lbV9udW1zLCB0b3RhbF9tZW1zKTsKKworICByZXR1cm4gZmxvdzsKKworbm9fZGF0YToKKyAgeworICAgIEdTVF9MT0dfT0JKRUNUIChzaW5rLCAiZW1wdHkgYnVmZmVyIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfbXVsdGl1ZHBzaW5rX3JlbmRlciAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RNdWx0aVVEUFNpbmsgKnNpbms7CisgIEdzdEZsb3dSZXR1cm4gZmxvdzsKKyAgZ3VpbnQ4IG5fbWVtOworCisgIHNpbmsgPSBHU1RfTVVMVElVRFBTSU5LX0NBU1QgKGJzaW5rKTsKKworICBuX21lbSA9IGdzdF9idWZmZXJfbl9tZW1vcnkgKGJ1ZmZlcik7CisKKyAgaWYgKG5fbWVtID4gMCkKKyAgICBmbG93ID0gZ3N0X211bHRpdWRwc2lua19yZW5kZXJfYnVmZmVycyAoc2luaywgJmJ1ZmZlciwgMSwgJm5fbWVtLCBuX21lbSk7CisgIGVsc2UKKyAgICBmbG93ID0gR1NUX0ZMT1dfT0s7CisKKyAgcmV0dXJuIGZsb3c7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGl1ZHBzaW5rX3NldF9jbGllbnRzX3N0cmluZyAoR3N0TXVsdGlVRFBTaW5rICogc2luaywKKyAgICBjb25zdCBnY2hhciAqIHN0cmluZykKK3sKKyAgZ2NoYXIgKipjbGllbnRzOworICBnaW50IGk7CisKKyAgY2xpZW50cyA9IGdfc3Ryc3BsaXQgKHN0cmluZywgIiwiLCAwKTsKKworICBnX211dGV4X2xvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisgIC8qIGNsZWFyIGFsbCBleGlzdGluZyBjbGllbnRzICovCisgIGdzdF9tdWx0aXVkcHNpbmtfY2xlYXJfaW50ZXJuYWwgKHNpbmssIEZBTFNFKTsKKyAgZm9yIChpID0gMDsgY2xpZW50c1tpXTsgaSsrKSB7CisgICAgZ2NoYXIgKmhvc3QsICpwOworICAgIGdpbnQ2NCBwb3J0ID0gMDsKKworICAgIGhvc3QgPSBjbGllbnRzW2ldOworICAgIHAgPSBzdHJzdHIgKGNsaWVudHNbaV0sICI6Iik7CisgICAgaWYgKHAgIT0gTlVMTCkgeworICAgICAgKnAgPSAnXDAnOworICAgICAgcG9ydCA9IGdfYXNjaWlfc3RydG9sbCAocCArIDEsIE5VTEwsIDEwKTsKKyAgICB9CisgICAgaWYgKHBvcnQgIT0gMCkKKyAgICAgIGdzdF9tdWx0aXVkcHNpbmtfYWRkX2ludGVybmFsIChzaW5rLCBob3N0LCBwb3J0LCBGQUxTRSk7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisKKyAgZ19zdHJmcmVldiAoY2xpZW50cyk7Cit9CisKK3N0YXRpYyBnY2hhciAqCitnc3RfbXVsdGl1ZHBzaW5rX2dldF9jbGllbnRzX3N0cmluZyAoR3N0TXVsdGlVRFBTaW5rICogc2luaykKK3sKKyAgR1N0cmluZyAqc3RyOworICBHTGlzdCAqY2xpZW50czsKKworICBzdHIgPSBnX3N0cmluZ19uZXcgKCIiKTsKKworICBnX211dGV4X2xvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisgIGNsaWVudHMgPSBzaW5rLT5jbGllbnRzOworICB3aGlsZSAoY2xpZW50cykgeworICAgIEdzdFVEUENsaWVudCAqY2xpZW50OworICAgIGdpbnQgY291bnQ7CisKKyAgICBjbGllbnQgPSAoR3N0VURQQ2xpZW50ICopIGNsaWVudHMtPmRhdGE7CisKKyAgICBjbGllbnRzID0gZ19saXN0X25leHQgKGNsaWVudHMpOworCisgICAgY291bnQgPSBjbGllbnQtPmFkZF9jb3VudDsKKyAgICB3aGlsZSAoY291bnQtLSkgeworICAgICAgZ19zdHJpbmdfYXBwZW5kX3ByaW50ZiAoc3RyLCAiJXM6JWQlcyIsIGNsaWVudC0+aG9zdCwgY2xpZW50LT5wb3J0LAorICAgICAgICAgIChjbGllbnRzIHx8IGNvdW50ID4gMSA/ICIsIiA6ICIiKSk7CisgICAgfQorICB9CisgIGdfbXV0ZXhfdW5sb2NrICgmc2luay0+Y2xpZW50X2xvY2spOworCisgIHJldHVybiBnX3N0cmluZ19mcmVlIChzdHIsIEZBTFNFKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXVkcHNpbmtfc2V0dXBfcW9zX2RzY3AgKEdzdE11bHRpVURQU2luayAqIHNpbmssIEdTb2NrZXQgKiBzb2NrZXQpCit7CisgIC8qIGRvbid0IHRvdWNoIG9uIC0xICovCisgIGlmIChzaW5rLT5xb3NfZHNjcCA8IDApCisgICAgcmV0dXJuOworCisgIGlmIChzb2NrZXQgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyNpZmRlZiBJUF9UT1MKKyAgeworICAgIGdpbnQgdG9zOworICAgIGdpbnQgZmQ7CisKKyAgICBmZCA9IGdfc29ja2V0X2dldF9mZCAoc29ja2V0KTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJzZXR0aW5nIFRPUyB0byAlZCIsIHNpbmstPnFvc19kc2NwKTsKKworICAgIC8qIEV4dHJhY3QgYW5kIHNoaWZ0IDYgYml0cyBvZiBEU0ZJRUxEICovCisgICAgdG9zID0gKHNpbmstPnFvc19kc2NwICYgMHgzZikgPDwgMjsKKworICAgIGlmIChzZXRzb2Nrb3B0IChmZCwgSVBQUk9UT19JUCwgSVBfVE9TLCAmdG9zLCBzaXplb2YgKHRvcykpIDwgMCkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAoc2luaywgImNvdWxkIG5vdCBzZXQgVE9TOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgfQorI2lmZGVmIElQVjZfVENMQVNTCisgICAgaWYgKGdfc29ja2V0X2dldF9mYW1pbHkgKHNvY2tldCkgPT0gR19TT0NLRVRfRkFNSUxZX0lQVjYpIHsKKyAgICAgIGlmIChzZXRzb2Nrb3B0IChmZCwgSVBQUk9UT19JUFY2LCBJUFY2X1RDTEFTUywgJnRvcywgc2l6ZW9mICh0b3MpKSA8IDApIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAoc2luaywgImNvdWxkIG5vdCBzZXQgVENMQVNTOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICB9CisgICAgfQorI2VuZGlmCisgIH0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorZ3N0X211bHRpdWRwc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0TXVsdGlVRFBTaW5rICp1ZHBzaW5rOworCisgIHVkcHNpbmsgPSBHU1RfTVVMVElVRFBTSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9TT0NLRVQ6CisgICAgICBpZiAodWRwc2luay0+c29ja2V0ICE9IE5VTEwgJiYgdWRwc2luay0+c29ja2V0ICE9IHVkcHNpbmstPnVzZWRfc29ja2V0ICYmCisgICAgICAgICAgdWRwc2luay0+Y2xvc2Vfc29ja2V0KSB7CisgICAgICAgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICAgICAgICBpZiAoIWdfc29ja2V0X2Nsb3NlICh1ZHBzaW5rLT5zb2NrZXQsICZlcnIpKSB7CisgICAgICAgICAgR1NUX0VSUk9SICgiZmFpbGVkIHRvIGNsb3NlIHNvY2tldCAlcDogJXMiLCB1ZHBzaW5rLT5zb2NrZXQsCisgICAgICAgICAgICAgIGVyci0+bWVzc2FnZSk7CisgICAgICAgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh1ZHBzaW5rLT5zb2NrZXQpCisgICAgICAgIGdfb2JqZWN0X3VucmVmICh1ZHBzaW5rLT5zb2NrZXQpOworICAgICAgdWRwc2luay0+c29ja2V0ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUICh1ZHBzaW5rLCAic2V0dGluZyBzb2NrZXQgdG8gJXAiLCB1ZHBzaW5rLT5zb2NrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NPQ0tFVF9WNjoKKyAgICAgIGlmICh1ZHBzaW5rLT5zb2NrZXRfdjYgIT0gTlVMTAorICAgICAgICAgICYmIHVkcHNpbmstPnNvY2tldF92NiAhPSB1ZHBzaW5rLT51c2VkX3NvY2tldF92NgorICAgICAgICAgICYmIHVkcHNpbmstPmNsb3NlX3NvY2tldCkgeworICAgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICAgICAgaWYgKCFnX3NvY2tldF9jbG9zZSAodWRwc2luay0+c29ja2V0X3Y2LCAmZXJyKSkgeworICAgICAgICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBjbG9zZSBzb2NrZXQgJXA6ICVzIiwgdWRwc2luay0+c29ja2V0X3Y2LAorICAgICAgICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAodWRwc2luay0+c29ja2V0X3Y2KQorICAgICAgICBnX29iamVjdF91bnJlZiAodWRwc2luay0+c29ja2V0X3Y2KTsKKyAgICAgIHVkcHNpbmstPnNvY2tldF92NiA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAodWRwc2luaywgInNldHRpbmcgc29ja2V0IHRvICVwIiwgdWRwc2luay0+c29ja2V0X3Y2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTE9TRV9TT0NLRVQ6CisgICAgICB1ZHBzaW5rLT5jbG9zZV9zb2NrZXQgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0xJRU5UUzoKKyAgICAgIGdzdF9tdWx0aXVkcHNpbmtfc2V0X2NsaWVudHNfc3RyaW5nICh1ZHBzaW5rLCBnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQVVUT19NVUxUSUNBU1Q6CisgICAgICB1ZHBzaW5rLT5hdXRvX211bHRpY2FzdCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NVUxUSUNBU1RfSUZBQ0U6CisgICAgICBnX2ZyZWUgKHVkcHNpbmstPm11bHRpX2lmYWNlKTsKKworICAgICAgaWYgKGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpID09IE5VTEwpCisgICAgICAgIHVkcHNpbmstPm11bHRpX2lmYWNlID0gZ19zdHJkdXAgKERFRkFVTFRfTVVMVElDQVNUX0lGQUNFKTsKKyAgICAgIGVsc2UKKyAgICAgICAgdWRwc2luay0+bXVsdGlfaWZhY2UgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UVEw6CisgICAgICB1ZHBzaW5rLT50dGwgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UVExfTUM6CisgICAgICB1ZHBzaW5rLT50dGxfbWMgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9MT09QOgorICAgICAgdWRwc2luay0+bG9vcCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GT1JDRV9JUFY0OgorICAgICAgdWRwc2luay0+Zm9yY2VfaXB2NCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9RT1NfRFNDUDoKKyAgICAgIHVkcHNpbmstPnFvc19kc2NwID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBnc3RfbXVsdGl1ZHBzaW5rX3NldHVwX3Fvc19kc2NwICh1ZHBzaW5rLCB1ZHBzaW5rLT51c2VkX3NvY2tldCk7CisgICAgICBnc3RfbXVsdGl1ZHBzaW5rX3NldHVwX3Fvc19kc2NwICh1ZHBzaW5rLCB1ZHBzaW5rLT51c2VkX3NvY2tldF92Nik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0VORF9EVVBMSUNBVEVTOgorICAgICAgdWRwc2luay0+c2VuZF9kdXBsaWNhdGVzID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JVRkZFUl9TSVpFOgorICAgICAgdWRwc2luay0+YnVmZmVyX3NpemUgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CSU5EX0FERFJFU1M6CisgICAgICBnX2ZyZWUgKHVkcHNpbmstPmJpbmRfYWRkcmVzcyk7CisgICAgICB1ZHBzaW5rLT5iaW5kX2FkZHJlc3MgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CSU5EX1BPUlQ6CisgICAgICB1ZHBzaW5rLT5iaW5kX3BvcnQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9tdWx0aXVkcHNpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE11bHRpVURQU2luayAqdWRwc2luazsKKworICB1ZHBzaW5rID0gR1NUX01VTFRJVURQU0lOSyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQllURVNfVE9fU0VSVkU6CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCB1ZHBzaW5rLT5ieXRlc190b19zZXJ2ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQllURVNfU0VSVkVEOgorICAgICAgZ192YWx1ZV9zZXRfdWludDY0ICh2YWx1ZSwgdWRwc2luay0+Ynl0ZXNfc2VydmVkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TT0NLRVQ6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCB1ZHBzaW5rLT5zb2NrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NPQ0tFVF9WNjoKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHVkcHNpbmstPnNvY2tldF92Nik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0xPU0VfU09DS0VUOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHVkcHNpbmstPmNsb3NlX3NvY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFRF9TT0NLRVQ6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCB1ZHBzaW5rLT51c2VkX3NvY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVVNFRF9TT0NLRVRfVjY6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCB1ZHBzaW5rLT51c2VkX3NvY2tldF92Nik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0xJRU5UUzoKKyAgICAgIGdfdmFsdWVfdGFrZV9zdHJpbmcgKHZhbHVlLAorICAgICAgICAgIGdzdF9tdWx0aXVkcHNpbmtfZ2V0X2NsaWVudHNfc3RyaW5nICh1ZHBzaW5rKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQVVUT19NVUxUSUNBU1Q6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgdWRwc2luay0+YXV0b19tdWx0aWNhc3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01VTFRJQ0FTVF9JRkFDRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHVkcHNpbmstPm11bHRpX2lmYWNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UVEw6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB1ZHBzaW5rLT50dGwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RUTF9NQzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHVkcHNpbmstPnR0bF9tYyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTE9PUDoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB1ZHBzaW5rLT5sb29wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GT1JDRV9JUFY0OgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHVkcHNpbmstPmZvcmNlX2lwdjQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1FPU19EU0NQOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdWRwc2luay0+cW9zX2RzY3ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NFTkRfRFVQTElDQVRFUzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB1ZHBzaW5rLT5zZW5kX2R1cGxpY2F0ZXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JVRkZFUl9TSVpFOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdWRwc2luay0+YnVmZmVyX3NpemUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0JJTkRfQUREUkVTUzoKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHVkcHNpbmstPmJpbmRfYWRkcmVzcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQklORF9QT1JUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdWRwc2luay0+YmluZF9wb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbXVsdGl1ZHBzaW5rX2NvbmZpZ3VyZV9jbGllbnQgKEdzdE11bHRpVURQU2luayAqIHNpbmssCisgICAgR3N0VURQQ2xpZW50ICogY2xpZW50KQoreworICBHSW5ldFNvY2tldEFkZHJlc3MgKnNhZGRyID0gR19JTkVUX1NPQ0tFVF9BRERSRVNTIChjbGllbnQtPmFkZHIpOworICBHSW5ldEFkZHJlc3MgKmFkZHIgPSBnX2luZXRfc29ja2V0X2FkZHJlc3NfZ2V0X2FkZHJlc3MgKHNhZGRyKTsKKyAgR1NvY2tldEZhbWlseSBmYW1pbHkgPSBnX3NvY2tldF9hZGRyZXNzX2dldF9mYW1pbHkgKEdfU09DS0VUX0FERFJFU1MgKHNhZGRyKSk7CisgIEdTb2NrZXQgKnNvY2tldDsKKyAgR0Vycm9yICplcnIgPSBOVUxMOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJjb25maWd1cmluZyBjbGllbnQgJXAiLCBjbGllbnQpOworCisgIGlmIChmYW1pbHkgPT0gR19TT0NLRVRfRkFNSUxZX0lQVjYgJiYgIXNpbmstPnVzZWRfc29ja2V0X3Y2KQorICAgIGdvdG8gaW52YWxpZF9mYW1pbHk7CisKKyAgLyogU2VsZWN0IHNvY2tldCB0byBzZW5kIGZyb20gZm9yIHRoaXMgYWRkcmVzcyAqLworICBpZiAoZmFtaWx5ID09IEdfU09DS0VUX0ZBTUlMWV9JUFY2IHx8ICFzaW5rLT51c2VkX3NvY2tldCkKKyAgICBzb2NrZXQgPSBzaW5rLT51c2VkX3NvY2tldF92NjsKKyAgZWxzZQorICAgIHNvY2tldCA9IHNpbmstPnVzZWRfc29ja2V0OworCisgIGlmIChnX2luZXRfYWRkcmVzc19nZXRfaXNfbXVsdGljYXN0IChhZGRyKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJ3ZSBoYXZlIGEgbXVsdGljYXN0IGNsaWVudCAlcCIsIGNsaWVudCk7CisgICAgaWYgKHNpbmstPmF1dG9fbXVsdGljYXN0KSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiYXV0b2pvaW5pbmcgZ3JvdXAiKTsKKyAgICAgIGlmICghZ19zb2NrZXRfam9pbl9tdWx0aWNhc3RfZ3JvdXAgKHNvY2tldCwgYWRkciwgRkFMU0UsCisgICAgICAgICAgICAgIHNpbmstPm11bHRpX2lmYWNlLCAmZXJyKSkKKyAgICAgICAgZ290byBqb2luX2dyb3VwX2ZhaWxlZDsKKyAgICB9CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgInNldHRpbmcgbG9vcCB0byAlZCIsIHNpbmstPmxvb3ApOworICAgIGdfc29ja2V0X3NldF9tdWx0aWNhc3RfbG9vcGJhY2sgKHNvY2tldCwgc2luay0+bG9vcCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgInNldHRpbmcgdHRsIHRvICVkIiwgc2luay0+dHRsX21jKTsKKyAgICBnX3NvY2tldF9zZXRfbXVsdGljYXN0X3R0bCAoc29ja2V0LCBzaW5rLT50dGxfbWMpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJzZXR0aW5nIHVuaWNhc3QgdHRsIHRvICVkIiwgc2luay0+dHRsKTsKKyAgICBnX3NvY2tldF9zZXRfdHRsIChzb2NrZXQsIHNpbmstPnR0bCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitqb2luX2dyb3VwX2ZhaWxlZDoKKyAgeworICAgIGdzdF9tdWx0aXVkcHNpbmtfc3RvcCAoR1NUX0JBU0VfU0lOSyAoc2luaykpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJDb3VsZCBub3Qgam9pbiBtdWx0aWNhc3QgZ3JvdXA6ICVzIiwKKyAgICAgICAgICAgIGVyciA/IGVyci0+bWVzc2FnZSA6ICJ1bmtub3duIHJlYXNvbiIpKTsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfZmFtaWx5OgorICB7CisgICAgZ3N0X211bHRpdWRwc2lua19zdG9wIChHU1RfQkFTRV9TSU5LIChzaW5rKSk7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNpbmssIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoIkludmFsaWQgYWRkcmVzcyBmYW1pbHkgKGdvdCAlZCkiLCBmYW1pbHkpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogY3JlYXRlIGEgc29ja2V0IGZvciBzZW5kaW5nIHRvIHJlbW90ZSBtYWNoaW5lICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aXVkcHNpbmtfc3RhcnQgKEdzdEJhc2VTaW5rICogYnNpbmspCit7CisgIEdzdE11bHRpVURQU2luayAqc2luazsKKyAgR0xpc3QgKmNsaWVudHM7CisgIEdzdFVEUENsaWVudCAqY2xpZW50OworICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgc2luayA9IEdTVF9NVUxUSVVEUFNJTksgKGJzaW5rKTsKKworICBzaW5rLT5leHRlcm5hbF9zb2NrZXQgPSBGQUxTRTsKKworICBpZiAoc2luay0+c29ja2V0KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgInVzaW5nIGNvbmZpZ3VyZWQgc29ja2V0Iik7CisgICAgaWYgKGdfc29ja2V0X2dldF9mYW1pbHkgKHNpbmstPnNvY2tldCkgPT0gR19TT0NLRVRfRkFNSUxZX0lQVjYpIHsKKyAgICAgIHNpbmstPnVzZWRfc29ja2V0X3Y2ID0gR19TT0NLRVQgKGdfb2JqZWN0X3JlZiAoc2luay0+c29ja2V0KSk7CisgICAgICBzaW5rLT5leHRlcm5hbF9zb2NrZXQgPSBUUlVFOworICAgIH0gZWxzZSB7CisgICAgICBzaW5rLT51c2VkX3NvY2tldCA9IEdfU09DS0VUIChnX29iamVjdF9yZWYgKHNpbmstPnNvY2tldCkpOworICAgICAgc2luay0+ZXh0ZXJuYWxfc29ja2V0ID0gVFJVRTsKKyAgICB9CisgIH0KKworICBpZiAoc2luay0+c29ja2V0X3Y2KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgInVzaW5nIGNvbmZpZ3VyZWQgSVB2NiBzb2NrZXQiKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCAoIXNpbmstPnNvY2tldCB8fCBnX3NvY2tldF9nZXRfZmFtaWx5IChzaW5rLT5zb2NrZXQpICE9CisgICAgICAgIEdfU09DS0VUX0ZBTUlMWV9JUFY2LCBGQUxTRSk7CisKKyAgICBpZiAoc2luay0+dXNlZF9zb2NrZXRfdjYgJiYgc2luay0+dXNlZF9zb2NrZXRfdjYgIT0gc2luay0+c29ja2V0X3Y2KSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChzaW5rLAorICAgICAgICAgICJQcm92aWRlZCBkaWZmZXJlbnQgSVB2NiBzb2NrZXRzIGluIHNvY2tldCBhbmQgc29ja2V0LXY2IHByb3BlcnRpZXMiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBzaW5rLT51c2VkX3NvY2tldF92NiA9IEdfU09DS0VUIChnX29iamVjdF9yZWYgKHNpbmstPnNvY2tldF92NikpOworICAgIHNpbmstPmV4dGVybmFsX3NvY2tldCA9IFRSVUU7CisgIH0KKworICBpZiAoIXNpbmstPnVzZWRfc29ja2V0ICYmICFzaW5rLT51c2VkX3NvY2tldF92NikgeworICAgIEdTb2NrZXRBZGRyZXNzICpiaW5kX2FkZHI7CisgICAgR0luZXRBZGRyZXNzICpiaW5kX2lhZGRyOworCisgICAgaWYgKHNpbmstPmJpbmRfYWRkcmVzcykgeworICAgICAgR1NvY2tldEZhbWlseSBmYW1pbHk7CisKKyAgICAgIGJpbmRfaWFkZHIgPSBnX2luZXRfYWRkcmVzc19uZXdfZnJvbV9zdHJpbmcgKHNpbmstPmJpbmRfYWRkcmVzcyk7CisgICAgICBpZiAoIWJpbmRfaWFkZHIpIHsKKyAgICAgICAgR0xpc3QgKnJlc3VsdHM7CisgICAgICAgIEdSZXNvbHZlciAqcmVzb2x2ZXI7CisKKyAgICAgICAgcmVzb2x2ZXIgPSBnX3Jlc29sdmVyX2dldF9kZWZhdWx0ICgpOworICAgICAgICByZXN1bHRzID0KKyAgICAgICAgICAgIGdfcmVzb2x2ZXJfbG9va3VwX2J5X25hbWUgKHJlc29sdmVyLCBzaW5rLT5iaW5kX2FkZHJlc3MsCisgICAgICAgICAgICBzaW5rLT5jYW5jZWxsYWJsZSwgJmVycik7CisgICAgICAgIGlmICghcmVzdWx0cykgeworICAgICAgICAgIGdfb2JqZWN0X3VucmVmIChyZXNvbHZlcik7CisgICAgICAgICAgZ290byBuYW1lX3Jlc29sdmU7CisgICAgICAgIH0KKyAgICAgICAgYmluZF9pYWRkciA9IEdfSU5FVF9BRERSRVNTIChnX29iamVjdF9yZWYgKHJlc3VsdHMtPmRhdGEpKTsKKyAgICAgICAgZ19yZXNvbHZlcl9mcmVlX2FkZHJlc3NlcyAocmVzdWx0cyk7CisgICAgICAgIGdfb2JqZWN0X3VucmVmIChyZXNvbHZlcik7CisgICAgICB9CisKKyAgICAgIGJpbmRfYWRkciA9IGdfaW5ldF9zb2NrZXRfYWRkcmVzc19uZXcgKGJpbmRfaWFkZHIsIHNpbmstPmJpbmRfcG9ydCk7CisgICAgICBnX29iamVjdF91bnJlZiAoYmluZF9pYWRkcik7CisgICAgICBmYW1pbHkgPSBnX3NvY2tldF9hZGRyZXNzX2dldF9mYW1pbHkgKEdfU09DS0VUX0FERFJFU1MgKGJpbmRfYWRkcikpOworCisgICAgICBpZiAoKHNpbmstPnVzZWRfc29ja2V0ID0KKyAgICAgICAgICAgICAgZ19zb2NrZXRfbmV3IChmYW1pbHksIEdfU09DS0VUX1RZUEVfREFUQUdSQU0sCisgICAgICAgICAgICAgICAgICBHX1NPQ0tFVF9QUk9UT0NPTF9VRFAsICZlcnIpKSA9PSBOVUxMKSB7CisgICAgICAgIGdfb2JqZWN0X3VucmVmIChiaW5kX2FkZHIpOworICAgICAgICBnb3RvIG5vX3NvY2tldDsKKyAgICAgIH0KKworICAgICAgZ19zb2NrZXRfYmluZCAoc2luay0+dXNlZF9zb2NrZXQsIGJpbmRfYWRkciwgVFJVRSwgJmVycik7CisgICAgICBnX29iamVjdF91bnJlZiAoYmluZF9hZGRyKTsKKyAgICAgIGlmIChlcnIgIT0gTlVMTCkKKyAgICAgICAgZ290byBiaW5kX2Vycm9yOworICAgIH0gZWxzZSB7CisgICAgICAvKiBjcmVhdGUgc2VuZGVyIHNvY2tldHMgaWYgbm9uZSBhdmFpbGFibGUgKi8KKyAgICAgIGlmICgoc2luay0+dXNlZF9zb2NrZXQgPSBnX3NvY2tldF9uZXcgKEdfU09DS0VUX0ZBTUlMWV9JUFY0LAorICAgICAgICAgICAgICAgICAgR19TT0NLRVRfVFlQRV9EQVRBR1JBTSwgR19TT0NLRVRfUFJPVE9DT0xfVURQLCAmZXJyKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBub19zb2NrZXQ7CisKKyAgICAgIGJpbmRfaWFkZHIgPSBnX2luZXRfYWRkcmVzc19uZXdfYW55IChHX1NPQ0tFVF9GQU1JTFlfSVBWNCk7CisgICAgICBiaW5kX2FkZHIgPSBnX2luZXRfc29ja2V0X2FkZHJlc3NfbmV3IChiaW5kX2lhZGRyLCBzaW5rLT5iaW5kX3BvcnQpOworICAgICAgZ19zb2NrZXRfYmluZCAoc2luay0+dXNlZF9zb2NrZXQsIGJpbmRfYWRkciwgVFJVRSwgJmVycik7CisgICAgICBnX29iamVjdF91bnJlZiAoYmluZF9hZGRyKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChiaW5kX2lhZGRyKTsKKyAgICAgIGlmIChlcnIgIT0gTlVMTCkKKyAgICAgICAgZ290byBiaW5kX2Vycm9yOworCisgICAgICBpZiAoKHNpbmstPnVzZWRfc29ja2V0X3Y2ID0gZ19zb2NrZXRfbmV3IChHX1NPQ0tFVF9GQU1JTFlfSVBWNiwKKyAgICAgICAgICAgICAgICAgIEdfU09DS0VUX1RZUEVfREFUQUdSQU0sIEdfU09DS0VUX1BST1RPQ09MX1VEUCwKKyAgICAgICAgICAgICAgICAgICZlcnIpKSA9PSBOVUxMKSB7CisgICAgICAgIEdTVF9JTkZPX09CSkVDVCAoc2luaywgIkZhaWxlZCB0byBjcmVhdGUgSVB2NiBzb2NrZXQ6ICVzIiwKKyAgICAgICAgICAgIGVyci0+bWVzc2FnZSk7CisgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYmluZF9pYWRkciA9IGdfaW5ldF9hZGRyZXNzX25ld19hbnkgKEdfU09DS0VUX0ZBTUlMWV9JUFY2KTsKKyAgICAgICAgYmluZF9hZGRyID0gZ19pbmV0X3NvY2tldF9hZGRyZXNzX25ldyAoYmluZF9pYWRkciwgc2luay0+YmluZF9wb3J0KTsKKyAgICAgICAgZ19zb2NrZXRfYmluZCAoc2luay0+dXNlZF9zb2NrZXRfdjYsIGJpbmRfYWRkciwgVFJVRSwgJmVycik7CisgICAgICAgIGdfb2JqZWN0X3VucmVmIChiaW5kX2FkZHIpOworICAgICAgICBnX29iamVjdF91bnJlZiAoYmluZF9pYWRkcik7CisgICAgICAgIGlmIChlcnIgIT0gTlVMTCkKKyAgICAgICAgICBnb3RvIGJpbmRfZXJyb3I7CisgICAgICB9CisgICAgfQorICB9CisjaWZkZWYgU09fU05EQlVGCisgIHsKKyAgICBzb2NrbGVuX3QgbGVuOworICAgIGdpbnQgc25kc2l6ZSwgcmV0OworCisgICAgbGVuID0gc2l6ZW9mIChzbmRzaXplKTsKKyAgICBpZiAoc2luay0+YnVmZmVyX3NpemUgIT0gMCkgeworICAgICAgc25kc2l6ZSA9IHNpbmstPmJ1ZmZlcl9zaXplOworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAic2V0dGluZyB1ZHAgYnVmZmVyIG9mICVkIGJ5dGVzIiwgc25kc2l6ZSk7CisgICAgICAvKiBzZXQgYnVmZmVyIHNpemUsIE5vdGUgdGhhdCBvbiBMaW51eCB0aGlzIGlzIHR5cGljYWxseSBsaW1pdGVkIHRvIGEKKyAgICAgICAqIG1heGltdW0gb2YgYXJvdW5kIDEwMEsuIEFsc28gYSBtaW5pbXVtIG9mIDEyOCBieXRlcyBpcyByZXF1aXJlZCBvbgorICAgICAgICogTGludXguICovCisKKyAgICAgIGlmIChzaW5rLT51c2VkX3NvY2tldCkgeworICAgICAgICByZXQgPQorICAgICAgICAgICAgc2V0c29ja29wdCAoZ19zb2NrZXRfZ2V0X2ZkIChzaW5rLT51c2VkX3NvY2tldCksIFNPTF9TT0NLRVQsCisgICAgICAgICAgICBTT19TTkRCVUYsICh2b2lkICopICZzbmRzaXplLCBsZW4pOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICBHU1RfRUxFTUVOVF9XQVJOSU5HIChzaW5rLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgICAgICAgKCJDb3VsZCBub3QgY3JlYXRlIGEgYnVmZmVyIG9mIHJlcXVlc3RlZCAlZCBieXRlcywgJWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgIHNuZHNpemUsIHJldCwgZ19zdHJlcnJvciAoZXJybm8pKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHNpbmstPnVzZWRfc29ja2V0X3Y2KSB7CisgICAgICAgIHJldCA9CisgICAgICAgICAgICBzZXRzb2Nrb3B0IChnX3NvY2tldF9nZXRfZmQgKHNpbmstPnVzZWRfc29ja2V0X3Y2KSwgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgIFNPX1NOREJVRiwgKHZvaWQgKikgJnNuZHNpemUsIGxlbik7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNpbmssIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgYSBidWZmZXIgb2YgcmVxdWVzdGVkICVkIGJ5dGVzLCAlZDogJXMiLAorICAgICAgICAgICAgICAgICAgc25kc2l6ZSwgcmV0LCBnX3N0cmVycm9yIChlcnJubykpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIHJlYWQgdGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlIGJ1ZmZlci4gTm90ZSB0aGF0IG9uIGxpbnV4IHRoaXMgcmV0dXJucyAyeCB0aGUKKyAgICAgKiB2YWx1ZSB3ZSBzZXQgYmVjYXVzZSB0aGUga2VybmVsIGFsbG9jYXRlcyBleHRyYSBtZW1vcnkgZm9yIG1ldGFkYXRhLgorICAgICAqIFRoZSBkZWZhdWx0IG9uIExpbnV4IGlzIGFib3V0IDEwMEsgKHdoaWNoIGlzIGFib3V0IDUwSyB3aXRob3V0IG1ldGFkYXRhKSAqLworICAgIGlmIChzaW5rLT51c2VkX3NvY2tldCkgeworICAgICAgcmV0ID0KKyAgICAgICAgICBnZXRzb2Nrb3B0IChnX3NvY2tldF9nZXRfZmQgKHNpbmstPnVzZWRfc29ja2V0KSwgU09MX1NPQ0tFVCwKKyAgICAgICAgICBTT19TTkRCVUYsICh2b2lkICopICZzbmRzaXplLCAmbGVuKTsKKyAgICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgImhhdmUgVURQIGJ1ZmZlciBvZiAlZCBieXRlcyIsIHNuZHNpemUpOworICAgICAgZWxzZQorICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiY291bGQgbm90IGdldCBVRFAgYnVmZmVyIHNpemUiKTsKKyAgICB9CisKKyAgICBpZiAoc2luay0+dXNlZF9zb2NrZXRfdjYpIHsKKyAgICAgIHJldCA9CisgICAgICAgICAgZ2V0c29ja29wdCAoZ19zb2NrZXRfZ2V0X2ZkIChzaW5rLT51c2VkX3NvY2tldF92NiksIFNPTF9TT0NLRVQsCisgICAgICAgICAgU09fU05EQlVGLCAodm9pZCAqKSAmc25kc2l6ZSwgJmxlbik7CisgICAgICBpZiAocmV0ID09IDApCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJoYXZlIFVEUHY2IGJ1ZmZlciBvZiAlZCBieXRlcyIsIHNuZHNpemUpOworICAgICAgZWxzZQorICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiY291bGQgbm90IGdldCBVRFB2NiBidWZmZXIgc2l6ZSIpOworICAgIH0KKyAgfQorI2VuZGlmCisKKyNpZmRlZiBTT19CSU5EVE9ERVZJQ0UKKyAgaWYgKHNpbmstPm11bHRpX2lmYWNlKSB7CisgICAgaWYgKHNpbmstPnVzZWRfc29ja2V0KSB7CisgICAgICBpZiAoc2V0c29ja29wdCAoZ19zb2NrZXRfZ2V0X2ZkIChzaW5rLT51c2VkX3NvY2tldCksIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgIFNPX0JJTkRUT0RFVklDRSwgc2luay0+bXVsdGlfaWZhY2UsCisgICAgICAgICAgICAgIHN0cmxlbiAoc2luay0+bXVsdGlfaWZhY2UpKSA8IDApCisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2luaywgInNldHNvY2tvcHQgU09fQklORFRPREVWSUNFIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgfQorICAgIGlmIChzaW5rLT51c2VkX3NvY2tldF92NikgeworICAgICAgaWYgKHNldHNvY2tvcHQgKGdfc29ja2V0X2dldF9mZCAoc2luay0+dXNlZF9zb2NrZXRfdjYpLCBTT0xfU09DS0VULAorICAgICAgICAgICAgICBTT19CSU5EVE9ERVZJQ0UsIHNpbmstPm11bHRpX2lmYWNlLAorICAgICAgICAgICAgICBzdHJsZW4gKHNpbmstPm11bHRpX2lmYWNlKSkgPCAwKQorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNpbmssICJzZXRzb2Nrb3B0IFNPX0JJTkRUT0RFVklDRSBmYWlsZWQgKHY2KTogJXMiLAorICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgfQorICB9CisjZW5kaWYKKworICBpZiAoc2luay0+dXNlZF9zb2NrZXQpCisgICAgZ19zb2NrZXRfc2V0X2Jyb2FkY2FzdCAoc2luay0+dXNlZF9zb2NrZXQsIFRSVUUpOworICBpZiAoc2luay0+dXNlZF9zb2NrZXRfdjYpCisgICAgZ19zb2NrZXRfc2V0X2Jyb2FkY2FzdCAoc2luay0+dXNlZF9zb2NrZXRfdjYsIFRSVUUpOworCisgIHNpbmstPmJ5dGVzX3RvX3NlcnZlID0gMDsKKyAgc2luay0+Ynl0ZXNfc2VydmVkID0gMDsKKworICBnc3RfbXVsdGl1ZHBzaW5rX3NldHVwX3Fvc19kc2NwIChzaW5rLCBzaW5rLT51c2VkX3NvY2tldCk7CisgIGdzdF9tdWx0aXVkcHNpbmtfc2V0dXBfcW9zX2RzY3AgKHNpbmssIHNpbmstPnVzZWRfc29ja2V0X3Y2KTsKKworICAvKiBsb29rIGZvciBtdWx0aWNhc3QgY2xpZW50cyBhbmQgam9pbiBtdWx0aWNhc3QgZ3JvdXBzIGFwcHJvcHJpYXRlbHkKKyAgICAgc2V0IGFsc28gdHRsIGFuZCBtdWx0aWNhc3QgbG9vcGJhY2sgZGVsaXZlcnkgYXBwcm9wcmlhdGVseSAgKi8KKyAgZm9yIChjbGllbnRzID0gc2luay0+Y2xpZW50czsgY2xpZW50czsgY2xpZW50cyA9IGdfbGlzdF9uZXh0IChjbGllbnRzKSkgeworICAgIGNsaWVudCA9IChHc3RVRFBDbGllbnQgKikgY2xpZW50cy0+ZGF0YTsKKworICAgIGlmICghZ3N0X211bHRpdWRwc2lua19jb25maWd1cmVfY2xpZW50IChzaW5rLCBjbGllbnQpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworbm9fc29ja2V0OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNpbmssIFJFU09VUkNFLCBGQUlMRUQsIChOVUxMKSwKKyAgICAgICAgKCJDb3VsZCBub3QgY3JlYXRlIHNvY2tldDogJXMiLCBlcnItPm1lc3NhZ2UpKTsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2JpbmRfZXJyb3I6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2luaywgUkVTT1VSQ0UsIEZBSUxFRCwgKE5VTEwpLAorICAgICAgICAoIkZhaWxlZCB0byBiaW5kIHNvY2tldDogJXMiLCBlcnItPm1lc3NhZ2UpKTsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25hbWVfcmVzb2x2ZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgRkFJTEVELCAoTlVMTCksCisgICAgICAgICgiRmFpbGVkIHRvIHJlc29sdmUgYmluZCBhZGRyZXNzICVzOiAlcyIsIHNpbmstPmJpbmRfYWRkcmVzcywKKyAgICAgICAgICAgIGVyci0+bWVzc2FnZSkpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9tdWx0aXVkcHNpbmtfc3RvcCAoR3N0QmFzZVNpbmsgKiBic2luaykKK3sKKyAgR3N0TXVsdGlVRFBTaW5rICp1ZHBzaW5rOworCisgIHVkcHNpbmsgPSBHU1RfTVVMVElVRFBTSU5LIChic2luayk7CisKKyAgaWYgKHVkcHNpbmstPnVzZWRfc29ja2V0KSB7CisgICAgaWYgKHVkcHNpbmstPmNsb3NlX3NvY2tldCB8fCAhdWRwc2luay0+ZXh0ZXJuYWxfc29ja2V0KSB7CisgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICAgIGlmICghZ19zb2NrZXRfY2xvc2UgKHVkcHNpbmstPnVzZWRfc29ja2V0LCAmZXJyKSkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUICh1ZHBzaW5rLCAiRmFpbGVkIHRvIGNsb3NlIHNvY2tldDogJXMiLCBlcnItPm1lc3NhZ2UpOworICAgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBnX29iamVjdF91bnJlZiAodWRwc2luay0+dXNlZF9zb2NrZXQpOworICAgIHVkcHNpbmstPnVzZWRfc29ja2V0ID0gTlVMTDsKKyAgfQorCisgIGlmICh1ZHBzaW5rLT51c2VkX3NvY2tldF92NikgeworICAgIGlmICh1ZHBzaW5rLT5jbG9zZV9zb2NrZXQgfHwgIXVkcHNpbmstPmV4dGVybmFsX3NvY2tldCkgeworICAgICAgR0Vycm9yICplcnIgPSBOVUxMOworCisgICAgICBpZiAoIWdfc29ja2V0X2Nsb3NlICh1ZHBzaW5rLT51c2VkX3NvY2tldF92NiwgJmVycikpIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAodWRwc2luaywgIkZhaWxlZCB0byBjbG9zZSBzb2NrZXQ6ICVzIiwgZXJyLT5tZXNzYWdlKTsKKyAgICAgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgICB9CisgICAgfQorCisgICAgZ19vYmplY3RfdW5yZWYgKHVkcHNpbmstPnVzZWRfc29ja2V0X3Y2KTsKKyAgICB1ZHBzaW5rLT51c2VkX3NvY2tldF92NiA9IE5VTEw7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdpbnQKK2dzdF91ZHBfY2xpZW50X2NvbXBhcmVfc29ja2V0X2ZhbWlseSAoR3N0VURQQ2xpZW50ICogYSwgR3N0VURQQ2xpZW50ICogYikKK3sKKyAgR1NvY2tldEZhbWlseSBmYSA9IGdfc29ja2V0X2FkZHJlc3NfZ2V0X2ZhbWlseSAoYS0+YWRkcik7CisgIEdTb2NrZXRGYW1pbHkgZmIgPSBnX3NvY2tldF9hZGRyZXNzX2dldF9mYW1pbHkgKGItPmFkZHIpOworCisgIGlmIChmYSA9PSBmYikKKyAgICByZXR1cm4gMDsKKworICAvKiBhIHNob3VsZCBnbyBiZWZvcmUgYiAqLworICBpZiAoZmEgPT0gR19TT0NLRVRfRkFNSUxZX0lQVjQgJiYgZmIgPT0gR19TT0NLRVRfRkFNSUxZX0lQVjYpCisgICAgcmV0dXJuIC0xOworCisgIC8qIGIgc2hvdWxkIGdvIGJlZm9yZSBhICovCisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorZ3N0X211bHRpdWRwc2lua19hZGRfaW50ZXJuYWwgKEdzdE11bHRpVURQU2luayAqIHNpbmssIGNvbnN0IGdjaGFyICogaG9zdCwKKyAgICBnaW50IHBvcnQsIGdib29sZWFuIGxvY2spCit7CisgIEdTb2NrZXRGYW1pbHkgZmFtaWx5OworICBHc3RVRFBDbGllbnQgKmNsaWVudDsKKyAgR3N0VURQQ2xpZW50IHVkcGNsaWVudDsKKyAgR1RpbWVWYWwgbm93OworICBHTGlzdCAqZmluZDsKKworICB1ZHBjbGllbnQuaG9zdCA9IChnY2hhciAqKSBob3N0OworICB1ZHBjbGllbnQucG9ydCA9IHBvcnQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgImFkZGluZyBjbGllbnQgb24gaG9zdCAlcywgcG9ydCAlZCIsIGhvc3QsIHBvcnQpOworCisgIGlmIChsb2NrKQorICAgIGdfbXV0ZXhfbG9jayAoJnNpbmstPmNsaWVudF9sb2NrKTsKKworICBmaW5kID0gZ19saXN0X2ZpbmRfY3VzdG9tIChzaW5rLT5jbGllbnRzLCAmdWRwY2xpZW50LAorICAgICAgKEdDb21wYXJlRnVuYykgY2xpZW50X2NvbXBhcmUpOworCisgIGlmICghZmluZCkgeworICAgIGZpbmQgPSBnX2xpc3RfZmluZF9jdXN0b20gKHNpbmstPmNsaWVudHNfdG9fYmVfcmVtb3ZlZCwgJnVkcGNsaWVudCwKKyAgICAgICAgKEdDb21wYXJlRnVuYykgY2xpZW50X2NvbXBhcmUpOworICAgIGlmIChmaW5kKQorICAgICAgZ3N0X3VkcF9jbGllbnRfcmVmIChmaW5kLT5kYXRhKTsKKyAgfQorCisgIGlmIChmaW5kKSB7CisgICAgY2xpZW50ID0gKEdzdFVEUENsaWVudCAqKSBmaW5kLT5kYXRhOworCisgICAgZmFtaWx5ID0gZ19zb2NrZXRfYWRkcmVzc19nZXRfZmFtaWx5IChjbGllbnQtPmFkZHIpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgImZvdW5kICVkIGV4aXN0aW5nIGNsaWVudHMgd2l0aCBob3N0ICVzLCBwb3J0ICVkIiwKKyAgICAgICAgY2xpZW50LT5hZGRfY291bnQsIGhvc3QsIHBvcnQpOworICB9IGVsc2UgeworICAgIGNsaWVudCA9IGdzdF91ZHBfY2xpZW50X25ldyAoc2luaywgaG9zdCwgcG9ydCk7CisgICAgaWYgKCFjbGllbnQpCisgICAgICBnb3RvIGVycm9yOworCisgICAgZmFtaWx5ID0gZ19zb2NrZXRfYWRkcmVzc19nZXRfZmFtaWx5IChjbGllbnQtPmFkZHIpOworCisgICAgZ19nZXRfY3VycmVudF90aW1lICgmbm93KTsKKyAgICBjbGllbnQtPmNvbm5lY3RfdGltZSA9IEdTVF9USU1FVkFMX1RPX1RJTUUgKG5vdyk7CisKKyAgICBpZiAoc2luay0+dXNlZF9zb2NrZXQpCisgICAgICBnc3RfbXVsdGl1ZHBzaW5rX2NvbmZpZ3VyZV9jbGllbnQgKHNpbmssIGNsaWVudCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiYWRkIGNsaWVudCB3aXRoIGhvc3QgJXMsIHBvcnQgJWQiLCBob3N0LCBwb3J0KTsKKworICAgIC8qIGtlZXAgSVB2NCBjbGllbnRzIGF0IHRoZSBiZWdpbm5pbmcsIGFuZCBJUHY2IGF0IHRoZSBlbmQsIHdlIGNhbiBtYWtlCisgICAgICogdXNlIG9mIHRoaXMgaW4gZ3N0X211bHRpdWRwc2lua19yZW5kZXJfYnVmZmVycygpICovCisgICAgc2luay0+Y2xpZW50cyA9IGdfbGlzdF9pbnNlcnRfc29ydGVkIChzaW5rLT5jbGllbnRzLCBjbGllbnQsCisgICAgICAgIChHQ29tcGFyZUZ1bmMpIGdzdF91ZHBfY2xpZW50X2NvbXBhcmVfc29ja2V0X2ZhbWlseSk7CisKKyAgICBpZiAoZmFtaWx5ID09IEdfU09DS0VUX0ZBTUlMWV9JUFY0KQorICAgICAgKytzaW5rLT5udW1fdjRfdW5pcXVlOworICAgIGVsc2UKKyAgICAgICsrc2luay0+bnVtX3Y2X3VuaXF1ZTsKKyAgfQorCisgICsrY2xpZW50LT5hZGRfY291bnQ7CisKKyAgaWYgKGZhbWlseSA9PSBHX1NPQ0tFVF9GQU1JTFlfSVBWNCkKKyAgICArK3NpbmstPm51bV92NF9hbGw7CisgIGVsc2UKKyAgICArK3NpbmstPm51bV92Nl9hbGw7CisKKyAgaWYgKGxvY2spCisgICAgZ19tdXRleF91bmxvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisKKyAgZ19zaWduYWxfZW1pdCAoR19PQkpFQ1QgKHNpbmspLAorICAgICAgZ3N0X211bHRpdWRwc2lua19zaWduYWxzW1NJR05BTF9DTElFTlRfQURERURdLCAwLCBob3N0LCBwb3J0KTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiYWRkZWQgY2xpZW50IG9uIGhvc3QgJXMsIHBvcnQgJWQiLCBob3N0LCBwb3J0KTsKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworZXJyb3I6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiZGlkIG5vdCBhZGQgY2xpZW50IG9uIGhvc3QgJXMsIHBvcnQgJWQiLCBob3N0LAorICAgICAgICBwb3J0KTsKKyAgICBpZiAobG9jaykKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmc2luay0+Y2xpZW50X2xvY2spOworICAgIHJldHVybjsKKyAgfQorfQorCit2b2lkCitnc3RfbXVsdGl1ZHBzaW5rX2FkZCAoR3N0TXVsdGlVRFBTaW5rICogc2luaywgY29uc3QgZ2NoYXIgKiBob3N0LCBnaW50IHBvcnQpCit7CisgIGdzdF9tdWx0aXVkcHNpbmtfYWRkX2ludGVybmFsIChzaW5rLCBob3N0LCBwb3J0LCBUUlVFKTsKK30KKwordm9pZAorZ3N0X211bHRpdWRwc2lua19yZW1vdmUgKEdzdE11bHRpVURQU2luayAqIHNpbmssIGNvbnN0IGdjaGFyICogaG9zdCwgZ2ludCBwb3J0KQoreworICBHU29ja2V0RmFtaWx5IGZhbWlseTsKKyAgR0xpc3QgKmZpbmQ7CisgIEdzdFVEUENsaWVudCB1ZHBjbGllbnQ7CisgIEdzdFVEUENsaWVudCAqY2xpZW50OworICBHVGltZVZhbCBub3c7CisKKyAgdWRwY2xpZW50Lmhvc3QgPSAoZ2NoYXIgKikgaG9zdDsKKyAgdWRwY2xpZW50LnBvcnQgPSBwb3J0OworCisgIGdfbXV0ZXhfbG9jayAoJnNpbmstPmNsaWVudF9sb2NrKTsKKyAgZmluZCA9IGdfbGlzdF9maW5kX2N1c3RvbSAoc2luay0+Y2xpZW50cywgJnVkcGNsaWVudCwKKyAgICAgIChHQ29tcGFyZUZ1bmMpIGNsaWVudF9jb21wYXJlKTsKKyAgaWYgKCFmaW5kKQorICAgIGdvdG8gbm90X2ZvdW5kOworCisgIGNsaWVudCA9IChHc3RVRFBDbGllbnQgKikgZmluZC0+ZGF0YTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiZm91bmQgJWQgY2xpZW50cyB3aXRoIGhvc3QgJXMsIHBvcnQgJWQiLAorICAgICAgY2xpZW50LT5hZGRfY291bnQsIGhvc3QsIHBvcnQpOworCisgIC0tY2xpZW50LT5hZGRfY291bnQ7CisKKyAgZmFtaWx5ID0gZ19zb2NrZXRfYWRkcmVzc19nZXRfZmFtaWx5IChjbGllbnQtPmFkZHIpOworICBpZiAoZmFtaWx5ID09IEdfU09DS0VUX0ZBTUlMWV9JUFY0KQorICAgIC0tc2luay0+bnVtX3Y0X2FsbDsKKyAgZWxzZQorICAgIC0tc2luay0+bnVtX3Y2X2FsbDsKKworICBpZiAoY2xpZW50LT5hZGRfY291bnQgPT0gMCkgeworICAgIEdJbmV0U29ja2V0QWRkcmVzcyAqc2FkZHIgPSBHX0lORVRfU09DS0VUX0FERFJFU1MgKGNsaWVudC0+YWRkcik7CisgICAgR0luZXRBZGRyZXNzICphZGRyID0gZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9hZGRyZXNzIChzYWRkcik7CisgICAgR1NvY2tldCAqc29ja2V0OworCisgICAgLyogU2VsZWN0IHNvY2tldCB0byBzZW5kIGZyb20gZm9yIHRoaXMgYWRkcmVzcyAqLworICAgIGlmIChmYW1pbHkgPT0gR19TT0NLRVRfRkFNSUxZX0lQVjYgfHwgIXNpbmstPnVzZWRfc29ja2V0KQorICAgICAgc29ja2V0ID0gc2luay0+dXNlZF9zb2NrZXRfdjY7CisgICAgZWxzZQorICAgICAgc29ja2V0ID0gc2luay0+dXNlZF9zb2NrZXQ7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAicmVtb3ZlIGNsaWVudCB3aXRoIGhvc3QgJXMsIHBvcnQgJWQiLCBob3N0LCBwb3J0KTsKKworICAgIGdfZ2V0X2N1cnJlbnRfdGltZSAoJm5vdyk7CisgICAgY2xpZW50LT5kaXNjb25uZWN0X3RpbWUgPSBHU1RfVElNRVZBTF9UT19USU1FIChub3cpOworCisgICAgaWYgKHNvY2tldCAmJiBzaW5rLT5hdXRvX211bHRpY2FzdAorICAgICAgICAmJiBnX2luZXRfYWRkcmVzc19nZXRfaXNfbXVsdGljYXN0IChhZGRyKSkgeworICAgICAgR0Vycm9yICplcnIgPSBOVUxMOworCisgICAgICBpZiAoIWdfc29ja2V0X2xlYXZlX211bHRpY2FzdF9ncm91cCAoc29ja2V0LCBhZGRyLCBGQUxTRSwKKyAgICAgICAgICAgICAgc2luay0+bXVsdGlfaWZhY2UsICZlcnIpKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJGYWlsZWQgdG8gbGVhdmUgbXVsdGljYXN0IGdyb3VwOiAlcyIsCisgICAgICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmFtaWx5ID09IEdfU09DS0VUX0ZBTUlMWV9JUFY0KQorICAgICAgLS1zaW5rLT5udW1fdjRfdW5pcXVlOworICAgIGVsc2UKKyAgICAgIC0tc2luay0+bnVtX3Y2X3VuaXF1ZTsKKworICAgIC8qIEtlZXAgc3RhdGUgY29uc2lzdGVudCBmb3Igc3RyZWFtaW5nIHRocmVhZCwgc28gcmVtb3ZlIGZyb20gY2xpZW50IGxpc3QsCisgICAgICogYnV0IGtlZXAgaXQgYXJvdW5kIHVudGlsIGFmdGVyIHRoZSBzaWduYWwgaGFzIGJlZW4gZW1pdHRlZCwgaW4gY2FzZSBhCisgICAgICogY2FsbGJhY2sgd2FudHMgdG8gZ2V0IHN0YXRzIGZvciB0aGF0IGNsaWVudCBvciBzbyAqLworICAgIHNpbmstPmNsaWVudHMgPSBnX2xpc3RfZGVsZXRlX2xpbmsgKHNpbmstPmNsaWVudHMsIGZpbmQpOworCisgICAgc2luay0+Y2xpZW50c190b19iZV9yZW1vdmVkID0KKyAgICAgICAgZ19saXN0X3ByZXBlbmQgKHNpbmstPmNsaWVudHNfdG9fYmVfcmVtb3ZlZCwgY2xpZW50KTsKKworICAgIC8qIFVubG9jayB0byBlbWl0IHNpZ25hbCBiZWZvcmUgd2UgZGVsZXRlIHRoZSBhY3R1YWwgY2xpZW50ICovCisgICAgZ19tdXRleF91bmxvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisgICAgZ19zaWduYWxfZW1pdCAoR19PQkpFQ1QgKHNpbmspLAorICAgICAgICBnc3RfbXVsdGl1ZHBzaW5rX3NpZ25hbHNbU0lHTkFMX0NMSUVOVF9SRU1PVkVEXSwgMCwgaG9zdCwgcG9ydCk7CisgICAgZ19tdXRleF9sb2NrICgmc2luay0+Y2xpZW50X2xvY2spOworCisgICAgc2luay0+Y2xpZW50c190b19iZV9yZW1vdmVkID0KKyAgICAgICAgZ19saXN0X3JlbW92ZSAoc2luay0+Y2xpZW50c190b19iZV9yZW1vdmVkLCBjbGllbnQpOworCisgICAgZ3N0X3VkcF9jbGllbnRfdW5yZWYgKGNsaWVudCk7CisgIH0KKyAgZ19tdXRleF91bmxvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisKKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworbm90X2ZvdW5kOgorICB7CisgICAgZ19tdXRleF91bmxvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzaW5rLCAiY2xpZW50IGF0IGhvc3QgJXMsIHBvcnQgJWQgbm90IGZvdW5kIiwKKyAgICAgICAgaG9zdCwgcG9ydCk7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfbXVsdGl1ZHBzaW5rX2NsZWFyX2ludGVybmFsIChHc3RNdWx0aVVEUFNpbmsgKiBzaW5rLCBnYm9vbGVhbiBsb2NrKQoreworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rLCAiY2xlYXJpbmciKTsKKyAgLyogd2Ugb25seSBuZWVkIHRvIHJlbW92ZSB0aGUgY2xpZW50IHN0cnVjdHVyZSwgdGhlcmUgaXMgbm8gYWRkaXRpb25hbAorICAgKiBzb2NrZXQgb3IgYW55dGhpbmcgdG8gZnJlZSBmb3IgVURQICovCisgIGlmIChsb2NrKQorICAgIGdfbXV0ZXhfbG9jayAoJnNpbmstPmNsaWVudF9sb2NrKTsKKyAgZ19saXN0X2ZvcmVhY2ggKHNpbmstPmNsaWVudHMsIChHRnVuYykgZ3N0X3VkcF9jbGllbnRfdW5yZWYsIHNpbmspOworICBnX2xpc3RfZnJlZSAoc2luay0+Y2xpZW50cyk7CisgIHNpbmstPmNsaWVudHMgPSBOVUxMOworICBzaW5rLT5udW1fdjRfdW5pcXVlID0gMDsKKyAgc2luay0+bnVtX3Y0X2FsbCA9IDA7CisgIHNpbmstPm51bV92Nl91bmlxdWUgPSAwOworICBzaW5rLT5udW1fdjZfYWxsID0gMDsKKyAgaWYgKGxvY2spCisgICAgZ19tdXRleF91bmxvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7Cit9CisKK3ZvaWQKK2dzdF9tdWx0aXVkcHNpbmtfY2xlYXIgKEdzdE11bHRpVURQU2luayAqIHNpbmspCit7CisgIGdzdF9tdWx0aXVkcHNpbmtfY2xlYXJfaW50ZXJuYWwgKHNpbmssIFRSVUUpOworfQorCitHc3RTdHJ1Y3R1cmUgKgorZ3N0X211bHRpdWRwc2lua19nZXRfc3RhdHMgKEdzdE11bHRpVURQU2luayAqIHNpbmssIGNvbnN0IGdjaGFyICogaG9zdCwKKyAgICBnaW50IHBvcnQpCit7CisgIEdzdFVEUENsaWVudCAqY2xpZW50OworICBHc3RTdHJ1Y3R1cmUgKnJlc3VsdCA9IE5VTEw7CisgIEdzdFVEUENsaWVudCB1ZHBjbGllbnQ7CisgIEdMaXN0ICpmaW5kOworCisgIHVkcGNsaWVudC5ob3N0ID0gKGdjaGFyICopIGhvc3Q7CisgIHVkcGNsaWVudC5wb3J0ID0gcG9ydDsKKworICBnX211dGV4X2xvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisKKyAgZmluZCA9IGdfbGlzdF9maW5kX2N1c3RvbSAoc2luay0+Y2xpZW50cywgJnVkcGNsaWVudCwKKyAgICAgIChHQ29tcGFyZUZ1bmMpIGNsaWVudF9jb21wYXJlKTsKKworICBpZiAoIWZpbmQpCisgICAgZmluZCA9IGdfbGlzdF9maW5kX2N1c3RvbSAoc2luay0+Y2xpZW50c190b19iZV9yZW1vdmVkLCAmdWRwY2xpZW50LAorICAgICAgICAoR0NvbXBhcmVGdW5jKSBjbGllbnRfY29tcGFyZSk7CisKKyAgaWYgKCFmaW5kKQorICAgIGdvdG8gbm90X2ZvdW5kOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJzdGF0cyBmb3IgY2xpZW50IHdpdGggaG9zdCAlcywgcG9ydCAlZCIsIGhvc3QsIHBvcnQpOworCisgIGNsaWVudCA9IChHc3RVRFBDbGllbnQgKikgZmluZC0+ZGF0YTsKKworICByZXN1bHQgPSBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoIm11bHRpdWRwc2luay1zdGF0cyIpOworCisgIGdzdF9zdHJ1Y3R1cmVfc2V0IChyZXN1bHQsCisgICAgICAiYnl0ZXMtc2VudCIsIEdfVFlQRV9VSU5UNjQsIGNsaWVudC0+Ynl0ZXNfc2VudCwKKyAgICAgICJwYWNrZXRzLXNlbnQiLCBHX1RZUEVfVUlOVDY0LCBjbGllbnQtPnBhY2tldHNfc2VudCwKKyAgICAgICJjb25uZWN0LXRpbWUiLCBHX1RZUEVfVUlOVDY0LCBjbGllbnQtPmNvbm5lY3RfdGltZSwKKyAgICAgICJkaXNjb25uZWN0LXRpbWUiLCBHX1RZUEVfVUlOVDY0LCBjbGllbnQtPmRpc2Nvbm5lY3RfdGltZSwgTlVMTCk7CisKKyAgZ19tdXRleF91bmxvY2sgKCZzaW5rLT5jbGllbnRfbG9jayk7CisKKyAgcmV0dXJuIHJlc3VsdDsKKworICAvKiBFUlJPUlMgKi8KK25vdF9mb3VuZDoKKyAgeworICAgIGdfbXV0ZXhfdW5sb2NrICgmc2luay0+Y2xpZW50X2xvY2spOworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc2luaywgImNsaWVudCB3aXRoIGhvc3QgJXMsIHBvcnQgJWQgbm90IGZvdW5kIiwKKyAgICAgICAgaG9zdCwgcG9ydCk7CisgICAgLyogQXBwYXJlbnRseSAoc2VlIGNvbW1lbnQgaW4gZ3N0bXVsdGlmZHNpbmsuYykgcmV0dXJuaW5nIE5VTEwgZnJvbSBoZXJlIG1heQorICAgICAqIGNvbmZ1c2UvYnJlYWsgcHl0aG9uIGJpbmRpbmdzICovCisgICAgcmV0dXJuIGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgibXVsdGl1ZHBzaW5rLXN0YXRzIik7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbXVsdGl1ZHBzaW5rX3VubG9jayAoR3N0QmFzZVNpbmsgKiBic2luaykKK3sKKyAgR3N0TXVsdGlVRFBTaW5rICpzaW5rOworCisgIHNpbmsgPSBHU1RfTVVMVElVRFBTSU5LIChic2luayk7CisKKyAgZ19jYW5jZWxsYWJsZV9jYW5jZWwgKHNpbmstPmNhbmNlbGxhYmxlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbXVsdGl1ZHBzaW5rX3VubG9ja19zdG9wIChHc3RCYXNlU2luayAqIGJzaW5rKQoreworICBHc3RNdWx0aVVEUFNpbmsgKnNpbms7CisKKyAgc2luayA9IEdTVF9NVUxUSVVEUFNJTksgKGJzaW5rKTsKKworICBnc3RfbXVsdGl1ZHBzaW5rX2ZyZWVfY2FuY2VsbGFibGUgKHNpbmspOworICBnc3RfbXVsdGl1ZHBzaW5rX2NyZWF0ZV9jYW5jZWxsYWJsZSAoc2luayk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9nc3QvdWRwL2dzdG11bHRpdWRwc2luay5oIGIvZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODQ5ZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3VkcC9nc3RtdWx0aXVkcHNpbmsuaApAQCAtMCwwICsxLDE1MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfTVVMVElVRFBTSU5LX0hfXworI2RlZmluZSBfX0dTVF9NVUxUSVVEUFNJTktfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXNpbmsuaD4KKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2luY2x1ZGUgImdzdHVkcG5ldHV0aWxzLmgiCisKKyNkZWZpbmUgR1NUX1RZUEVfTVVMVElVRFBTSU5LICAgICAgICAgICAgKGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX01VTFRJVURQU0lOSyhvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX01VTFRJVURQU0lOSyxHc3RNdWx0aVVEUFNpbmspKQorI2RlZmluZSBHU1RfTVVMVElVRFBTSU5LX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9NVUxUSVVEUFNJTkssR3N0TXVsdGlVRFBTaW5rQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfTVVMVElVRFBTSU5LKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfTVVMVElVRFBTSU5LKSkKKyNkZWZpbmUgR1NUX0lTX01VTFRJVURQU0lOS19DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfTVVMVElVRFBTSU5LKSkKKyNkZWZpbmUgR1NUX01VTFRJVURQU0lOS19DQVNUKG9iaikgICAgICAgKChHc3RNdWx0aVVEUFNpbmsqKShvYmopKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0TXVsdGlVRFBTaW5rIEdzdE11bHRpVURQU2luazsKK3R5cGVkZWYgc3RydWN0IF9Hc3RNdWx0aVVEUFNpbmtDbGFzcyBHc3RNdWx0aVVEUFNpbmtDbGFzczsKKworI2lmIEdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgNDMsIDIpCisjZGVmaW5lIEhBVkVfR19TT0NLRVRfU0VORF9NRVNTQUdFUworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9HX1NPQ0tFVF9TRU5EX01FU1NBR0VTCisvKiBzYW1lIGFzIEdPdXRwdXRNZXNzYWdlIHVzZWQgZm9yIGdfc29ja2V0X3NlbmRfbWVzc2FnZXMoKSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAvKjwgcHJpdmF0ZSA+Ki8KKyAgR1NvY2tldEFkZHJlc3MgICAgICAgICAqYWRkcmVzczsKKworICBHT3V0cHV0VmVjdG9yICAgICAgICAgICp2ZWN0b3JzOworICBndWludCAgICAgICAgICAgICAgICAgICBudW1fdmVjdG9yczsKKworICBndWludCAgICAgICAgICAgICAgICAgICBieXRlc19zZW50OworCisgIEdTb2NrZXRDb250cm9sTWVzc2FnZSAqKmNvbnRyb2xfbWVzc2FnZXM7CisgIGd1aW50ICAgICAgICAgICAgICAgICAgIG51bV9jb250cm9sX21lc3NhZ2VzOworfSBHc3RPdXRwdXRNZXNzYWdlOworI2Vsc2UKK3R5cGVkZWYgR091dHB1dE1lc3NhZ2UgR3N0T3V0cHV0TWVzc2FnZTsKKyNlbmRpZiAvKiBIQVZFX0dfU09DS0VUX1NFTkRfTUVTU0FHRVMqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGdpbnQgcmVmX2NvdW50OyAgICAgICAgIC8qIGZvciBtZW1vcnkgbWFuYWdlbWVudCAqLworICBnaW50IGFkZF9jb3VudDsgICAgICAgICAvKiBob3cgb2Z0ZW4gdGhpcyBhZGRyZXNzIGhhcyBiZWVuIGFkZGVkICovCisKKyAgR1NvY2tldEFkZHJlc3MgKmFkZHI7CisgIGdjaGFyICpob3N0OworICBnaW50IHBvcnQ7CisKKyAgLyogUGVyLWNsaWVudCBzdGF0cyAqLworICBndWludDY0IGJ5dGVzX3NlbnQ7CisgIGd1aW50NjQgcGFja2V0c19zZW50OworICBndWludDY0IGNvbm5lY3RfdGltZTsKKyAgZ3VpbnQ2NCBkaXNjb25uZWN0X3RpbWU7Cit9IEdzdFVEUENsaWVudDsKKworLyogc2VuZHMgdWRwIHBhY2tldHMgdG8gbXVsdGlwbGUgaG9zdC9wb3J0IHBhaXJzLgorICovCitzdHJ1Y3QgX0dzdE11bHRpVURQU2luayB7CisgIEdzdEJhc2VTaW5rIHBhcmVudDsKKworICBHU29ja2V0ICAgICAgICp1c2VkX3NvY2tldCwgKnVzZWRfc29ja2V0X3Y2OworCisgIEdDYW5jZWxsYWJsZSAgKmNhbmNlbGxhYmxlOworICBnYm9vbGVhbiAgICAgICBtYWRlX2NhbmNlbF9mZDsKKworICAvKiBjbGllbnQgbWFuYWdlbWVudCAqLworICBHTXV0ZXggICAgICAgICBjbGllbnRfbG9jazsKKyAgR0xpc3QgICAgICAgICAqY2xpZW50czsKKyAgZ3VpbnQgICAgICAgICAgbnVtX3Y0X3VuaXF1ZTsgIC8qIG51bWJlciBJUHY0IGNsaWVudHMgKGV4Y2x1ZGluZyBkdXBsaWNhdGVzKSAqLworICBndWludCAgICAgICAgICBudW1fdjRfYWxsOyAgICAgLyogbnVtYmVyIElQdjQgY2xpZW50cyAoaW5jbHVkaW5nIGR1cGxpY2F0ZXMpICovCisgIGd1aW50ICAgICAgICAgIG51bV92Nl91bmlxdWU7ICAvKiBudW1iZXIgSVB2NiBjbGllbnRzIChleGNsdWRpbmcgZHVwbGljYXRlcykgKi8KKyAgZ3VpbnQgICAgICAgICAgbnVtX3Y2X2FsbDsgICAgIC8qIG51bWJlciBJUHY2IGNsaWVudHMgKGluY2x1ZGluZyBkdXBsaWNhdGVzKSAqLworICBHTGlzdCAgICAgICAgICpjbGllbnRzX3RvX2JlX3JlbW92ZWQ7CisKKyAgLyogcHJlLWFsbG9jYXRlZCBzY3JhcCBzcGFjZSBmb3IgcmVuZGVyIGZ1bmN0aW9uICovCisgIEdPdXRwdXRWZWN0b3IgICAgKnZlY3M7CisgIGd1aW50ICAgICAgICAgICAgIG5fdmVjczsKKyAgR3N0TWFwSW5mbyAgICAgICAqbWFwczsKKyAgZ3VpbnQgICAgICAgICAgICAgbl9tYXBzOworICBHc3RPdXRwdXRNZXNzYWdlICptZXNzYWdlczsKKyAgZ3VpbnQgICAgICAgICAgICAgbl9tZXNzYWdlczsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIGd1aW50NjQgICAgICAgIGJ5dGVzX3RvX3NlcnZlOworICBndWludDY0ICAgICAgICBieXRlc19zZXJ2ZWQ7CisgIEdTb2NrZXQgICAgICAgKnNvY2tldCwgKnNvY2tldF92NjsKKyAgZ2Jvb2xlYW4gICAgICAgY2xvc2Vfc29ja2V0OworCisgIGdib29sZWFuICAgICAgIGV4dGVybmFsX3NvY2tldDsKKworICBnYm9vbGVhbiAgICAgICBhdXRvX211bHRpY2FzdDsKKyAgZ2NoYXIgICAgICAgICAqbXVsdGlfaWZhY2U7CisgIGdpbnQgICAgICAgICAgIHR0bDsKKyAgZ2ludCAgICAgICAgICAgdHRsX21jOworICBnYm9vbGVhbiAgICAgICBsb29wOworICBnYm9vbGVhbiAgICAgICBmb3JjZV9pcHY0OworICBnaW50ICAgICAgICAgICBxb3NfZHNjcDsKKworICBnYm9vbGVhbiAgICAgICBzZW5kX2R1cGxpY2F0ZXM7CisgIGdpbnQgICAgICAgICAgIGJ1ZmZlcl9zaXplOworICBnY2hhciAgICAgICAgICpiaW5kX2FkZHJlc3M7CisgIGdpbnQgICAgICAgICAgIGJpbmRfcG9ydDsKK307CisKK3N0cnVjdCBfR3N0TXVsdGlVRFBTaW5rQ2xhc3MgeworICBHc3RCYXNlU2lua0NsYXNzIHBhcmVudF9jbGFzczsKKworICAvKiBlbGVtZW50IG1ldGhvZHMgKi8KKyAgdm9pZCAgICAgICAgICAoKmFkZCkgICAgICAgICAgKEdzdE11bHRpVURQU2luayAqc2luaywgY29uc3QgZ2NoYXIgKmhvc3QsIGdpbnQgcG9ydCk7CisgIHZvaWQgICAgICAgICAgKCpyZW1vdmUpICAgICAgIChHc3RNdWx0aVVEUFNpbmsgKnNpbmssIGNvbnN0IGdjaGFyICpob3N0LCBnaW50IHBvcnQpOworICB2b2lkICAgICAgICAgICgqY2xlYXIpICAgICAgICAoR3N0TXVsdGlVRFBTaW5rICpzaW5rKTsKKyAgR3N0U3RydWN0dXJlKiAoKmdldF9zdGF0cykgICAgKEdzdE11bHRpVURQU2luayAqc2luaywgY29uc3QgZ2NoYXIgKmhvc3QsIGdpbnQgcG9ydCk7CisKKyAgLyogc2lnbmFscyAqLworICB2b2lkICAgICAgICAgICgqY2xpZW50X2FkZGVkKSAoR3N0RWxlbWVudCAqZWxlbWVudCwgY29uc3QgZ2NoYXIgKmhvc3QsIGdpbnQgcG9ydCk7CisgIHZvaWQgICAgICAgICAgKCpjbGllbnRfcmVtb3ZlZCkgKEdzdEVsZW1lbnQgKmVsZW1lbnQsIGNvbnN0IGdjaGFyICpob3N0LCBnaW50IHBvcnQpOworfTsKKworR1R5cGUgZ3N0X211bHRpdWRwc2lua19nZXRfdHlwZSh2b2lkKTsKKwordm9pZCAgICAgICAgICAgIGdzdF9tdWx0aXVkcHNpbmtfYWRkICAgICAgICAgICAgKEdzdE11bHRpVURQU2luayAqc2luaywgY29uc3QgZ2NoYXIgKmhvc3QsIGdpbnQgcG9ydCk7Cit2b2lkICAgICAgICAgICAgZ3N0X211bHRpdWRwc2lua19yZW1vdmUgICAgICAgICAoR3N0TXVsdGlVRFBTaW5rICpzaW5rLCBjb25zdCBnY2hhciAqaG9zdCwgZ2ludCBwb3J0KTsKK3ZvaWQgICAgICAgICAgICBnc3RfbXVsdGl1ZHBzaW5rX2NsZWFyICAgICAgICAgIChHc3RNdWx0aVVEUFNpbmsgKnNpbmspOworR3N0U3RydWN0dXJlKiAgIGdzdF9tdWx0aXVkcHNpbmtfZ2V0X3N0YXRzICAgICAgKEdzdE11bHRpVURQU2luayAqc2luaywgY29uc3QgZ2NoYXIgKmhvc3QsIGdpbnQgcG9ydCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9NVUxUSVVEUFNJTktfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvdWRwL2dzdHVkcC5jIGIvZ3N0L3VkcC9nc3R1ZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjAyMTEyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3VkcC9nc3R1ZHAuYwpAQCAtMCwwICsxLDY3IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L25ldC9nc3RuZXRhZGRyZXNzbWV0YS5oPgorCisjaW5jbHVkZSAiZ3N0dWRwc3JjLmgiCisjaW5jbHVkZSAiZ3N0bXVsdGl1ZHBzaW5rLmgiCisjaW5jbHVkZSAiZ3N0dWRwc2luay5oIgorI2luY2x1ZGUgImdzdGR5bnVkcHNpbmsuaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICAvKiBub3QgdXNpbmcgR0xJQl9DSEVDS19WRVJTSU9OIG9uIHB1cnBvc2UsIHJ1bi10aW1lIHZlcnNpb24gbWF0dGVycyAqLworICBpZiAoZ2xpYl9jaGVja192ZXJzaW9uICgyLCAzNiwgMCkgIT0gTlVMTCkgeworICAgIEdTVF9XQVJOSU5HICgiWW91ciBHTGliIHZlcnNpb24gaXMgPCAyLjM2LCBVRFAgbXVsdGljYXN0aW5nIHN1cHBvcnQgbWF5ICIKKyAgICAgICAgImJlIGJyb2tlbiwgc2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02ODgzNzgiKTsKKyAgfQorCisgIC8qIHJlZ2lzdGVyIGluZm8gb2YgdGhlIG5ldGFkZHJlc3MgbWV0YWRhdGEgc28gdGhhdCB3ZSBjYW4gdXNlIGl0IGZyb20KKyAgICogbXVsdGlwbGUgdGhyZWFkcyByaWdodCBhd2F5LiBOb3RlIHRoYXQgdGhlIHBsdWdpbiBsb2FkaW5nIGlzIGFsd2F5cworICAgKiBzZXJpYWxpemVkICovCisgIGdzdF9uZXRfYWRkcmVzc19tZXRhX2dldF9pbmZvICgpOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInVkcHNpbmsiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX1VEUFNJTkspKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJtdWx0aXVkcHNpbmsiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX01VTFRJVURQU0lOSykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImR5bnVkcHNpbmsiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX0RZTlVEUFNJTkspKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJ1ZHBzcmMiLCBHU1RfUkFOS19OT05FLCBHU1RfVFlQRV9VRFBTUkMpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHVkcCwKKyAgICAidHJhbnNmZXIgZGF0YSB2aWEgVURQIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuYyBiL2dzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGRjNWVmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5jCkBAIC0wLDAgKzEsMTA4IEBACisvKiBHU3RyZWFtZXIgVURQIG5ldHdvcmsgdXRpbGl0eSBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA2IEpvbmkgVmFsdGFuZW4gPGpvbmkudmFsdGFuZW5AbW92aWFsLmZpPgorICogQ29weXJpZ2h0IChDKSAyMDA5IEphcmtrbyBQYWx2aWFpbmVuIDxqYXJra28ucGFsdmlhaW5lbkBzZXNjYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0dWRwbmV0dXRpbHMuaCIKKworZ2Jvb2xlYW4KK2dzdF91ZHBfcGFyc2VfdXJpIChjb25zdCBnY2hhciAqIHVyaXN0ciwgZ2NoYXIgKiogaG9zdCwgZ3VpbnQxNiAqIHBvcnQpCit7CisgIGdjaGFyICpwcm90b2NvbCwgKmxvY2F0aW9uX3N0YXJ0OworICBnY2hhciAqbG9jYXRpb24sICpsb2NhdGlvbl9lbmQ7CisgIGdjaGFyICpjb2xwdHI7CisKKyAgLyogY29uc2lkZXIgbm8gcHJvdG9jb2wgdG8gYmUgdWRwOi8vICovCisgIHByb3RvY29sID0gZ3N0X3VyaV9nZXRfcHJvdG9jb2wgKHVyaXN0cik7CisgIGlmICghcHJvdG9jb2wpCisgICAgZ290byBub19wcm90b2NvbDsKKyAgaWYgKHN0cmNtcCAocHJvdG9jb2wsICJ1ZHAiKSAhPSAwKQorICAgIGdvdG8gd3JvbmdfcHJvdG9jb2w7CisgIGdfZnJlZSAocHJvdG9jb2wpOworCisgIGxvY2F0aW9uX3N0YXJ0ID0gZ3N0X3VyaV9nZXRfbG9jYXRpb24gKHVyaXN0cik7CisgIGlmICghbG9jYXRpb25fc3RhcnQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9ERUJVRyAoImdvdCBsb2NhdGlvbiAnJXMnIiwgbG9jYXRpb25fc3RhcnQpOworCisgIC8qIFZMQyBjb21wYXRpYmlsaXR5LCBzdHJpcCBldmVyeXRoaW5nIGJlZm9yZSB0aGUgQCBzaWduLiBWTEMgdXNlcyB0aGF0IGFzIHRoZQorICAgKiByZW1vdGUgYWRkcmVzcy4gKi8KKyAgbG9jYXRpb24gPSBnX3N0cnN0cl9sZW4gKGxvY2F0aW9uX3N0YXJ0LCAtMSwgIkAiKTsKKyAgaWYgKGxvY2F0aW9uID09IE5VTEwpCisgICAgbG9jYXRpb24gPSBsb2NhdGlvbl9zdGFydDsKKyAgZWxzZQorICAgIGxvY2F0aW9uICs9IDE7CisKKyAgaWYgKGxvY2F0aW9uWzBdID09ICdbJykgeworICAgIEdTVF9ERUJVRyAoInBhcnNlIElQVjYgYWRkcmVzcyAnJXMnIiwgbG9jYXRpb24pOworICAgIGxvY2F0aW9uX2VuZCA9IHN0cmNociAobG9jYXRpb24sICddJyk7CisgICAgaWYgKGxvY2F0aW9uX2VuZCA9PSBOVUxMKQorICAgICAgZ290byB3cm9uZ19hZGRyZXNzOworCisgICAgKmhvc3QgPSBnX3N0cm5kdXAgKGxvY2F0aW9uICsgMSwgbG9jYXRpb25fZW5kIC0gbG9jYXRpb24gLSAxKTsKKyAgICBjb2xwdHIgPSBzdHJyY2hyIChsb2NhdGlvbl9lbmQsICc6Jyk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHICgicGFyc2UgSVBWNCBhZGRyZXNzICclcyciLCBsb2NhdGlvbik7CisgICAgY29scHRyID0gc3RycmNociAobG9jYXRpb24sICc6Jyk7CisKKyAgICBpZiAoY29scHRyICE9IE5VTEwpIHsKKyAgICAgICpob3N0ID0gZ19zdHJuZHVwIChsb2NhdGlvbiwgY29scHRyIC0gbG9jYXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICAqaG9zdCA9IGdfc3RyZHVwIChsb2NhdGlvbik7CisgICAgfQorICB9CisgIEdTVF9ERUJVRyAoImhvc3Qgc2V0IHRvICclcyciLCAqaG9zdCk7CisKKyAgaWYgKGNvbHB0ciAhPSBOVUxMKSB7CisgICAgKnBvcnQgPSBnX2FzY2lpX3N0cnRvbGwgKGNvbHB0ciArIDEsIE5VTEwsIDEwKTsKKyAgfSBlbHNlIHsKKyAgICAqcG9ydCA9IDA7CisgIH0KKyAgZ19mcmVlIChsb2NhdGlvbl9zdGFydCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub19wcm90b2NvbDoKKyAgeworICAgIEdTVF9FUlJPUiAoImVycm9yIHBhcnNpbmcgdXJpICVzOiBubyBwcm90b2NvbCIsIHVyaXN0cik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit3cm9uZ19wcm90b2NvbDoKKyAgeworICAgIEdTVF9FUlJPUiAoImVycm9yIHBhcnNpbmcgdXJpICVzOiB3cm9uZyBwcm90b2NvbCAoJXMgIT0gdWRwKSIsIHVyaXN0ciwKKyAgICAgICAgcHJvdG9jb2wpOworICAgIGdfZnJlZSAocHJvdG9jb2wpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQord3JvbmdfYWRkcmVzczoKKyAgeworICAgIEdTVF9FUlJPUiAoImVycm9yIHBhcnNpbmcgdXJpICVzIiwgdXJpc3RyKTsKKyAgICBnX2ZyZWUgKGxvY2F0aW9uKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaCBiL2dzdC91ZHAvZ3N0dWRwbmV0dXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjJiZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3VkcC9nc3R1ZHBuZXR1dGlscy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIEdTdHJlYW1lciBVRFAgbmV0d29yayB1dGlsaXR5IGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgSm9uaSBWYWx0YW5lbiA8am9uaS52YWx0YW5lbkBtb3ZpYWwuZmk+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2lmbmRlZiBfX0dTVF9VRFBfTkVUX1VUSUxTX0hfXworI2RlZmluZSBfX0dTVF9VRFBfTkVUX1VUSUxTX0hfXworCitnYm9vbGVhbiAgICAgZ3N0X3VkcF9wYXJzZV91cmkgICAgICAgICAgICAoY29uc3QgZ2NoYXIgKnVyaXN0ciwgZ2NoYXIgKipob3N0LCBndWludDE2ICpwb3J0KTsKKworI2VuZGlmIC8qIF9fR1NUX1VEUF9ORVRfVVRJTFNfSF9fKi8KKwpkaWZmIC0tZ2l0IGEvZ3N0L3VkcC9nc3R1ZHBzaW5rLmMgYi9nc3QvdWRwL2dzdHVkcHNpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjRkNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3VkcC9nc3R1ZHBzaW5rLmMKQEAgLTAsMCArMSwyNTkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqIENvcHlyaWdodCAoQykgPDIwMTI+IENvbGxhYm9yYSBMdGQuCisgKiAgIEF1dGhvcjogU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LXVkcHNpbmsKKyAqIEBzZWVfYWxzbzogdWRwc3JjLCBtdWx0aWZkc2luaworICoKKyAqIHVkcHNpbmsgaXMgYSBuZXR3b3JrIHNpbmsgdGhhdCBzZW5kcyBVRFAgcGFja2V0cyB0byB0aGUgbmV0d29yay4KKyAqIEl0IGNhbiBiZSBjb21iaW5lZCB3aXRoIFJUUCBwYXlsb2FkZXJzIHRvIGltcGxlbWVudCBSVFAgc3RyZWFtaW5nLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgYXVkaW90ZXN0c3JjICEgdWRwc2luaworICogXXwKKyAqIDwvcmVmc2VjdDI+CisgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlICJnc3R1ZHBzaW5rLmgiCisKKyNkZWZpbmUgVURQX0RFRkFVTFRfSE9TVCAgICAgICAgImxvY2FsaG9zdCIKKyNkZWZpbmUgVURQX0RFRkFVTFRfUE9SVCAgICAgICAgNTAwNAorCisvKiBVRFBTaW5rIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfSE9TVCwKKyAgUFJPUF9QT1JULAorICBQUk9QX1VSSSwKKyAgLyogRklMTCBNRSAqLworfTsKKworc3RhdGljIHZvaWQgZ3N0X3VkcHNpbmtfZmluYWxpemUgKEdzdFVEUFNpbmsgKiB1ZHBzaW5rKTsKKworc3RhdGljIHZvaWQgZ3N0X3VkcHNpbmtfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwKKyAgICBncG9pbnRlciBpZmFjZV9kYXRhKTsKKworc3RhdGljIHZvaWQgZ3N0X3VkcHNpbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3VkcHNpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCisvKnN0YXRpYyBndWludCBnc3RfdWRwc2lua19zaWduYWxzW0xBU1RfU0lHTkFMXSA9IHsgMCB9OyAqLworI2RlZmluZSBnc3RfdWRwc2lua19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoR3N0VURQU2luaywgZ3N0X3VkcHNpbmssIEdTVF9UWVBFX01VTFRJVURQU0lOSywKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1VSSV9IQU5ETEVSLCBnc3RfdWRwc2lua191cmlfaGFuZGxlcl9pbml0KSk7CisKK3N0YXRpYyB2b2lkCitnc3RfdWRwc2lua19jbGFzc19pbml0IChHc3RVRFBTaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF91ZHBzaW5rX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3VkcHNpbmtfZ2V0X3Byb3BlcnR5OworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gKEdPYmplY3RGaW5hbGl6ZUZ1bmMpIGdzdF91ZHBzaW5rX2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfSE9TVCwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJob3N0IiwgImhvc3QiLAorICAgICAgICAgICJUaGUgaG9zdC9JUC9NdWx0aWNhc3QgZ3JvdXAgdG8gc2VuZCB0aGUgcGFja2V0cyB0byIsCisgICAgICAgICAgVURQX0RFRkFVTFRfSE9TVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfUE9SVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJwb3J0IiwgInBvcnQiLCAiVGhlIHBvcnQgdG8gc2VuZCB0aGUgcGFja2V0cyB0byIsCisgICAgICAgICAgMCwgNjU1MzUsIFVEUF9ERUZBVUxUX1BPUlQsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIlVEUCBwYWNrZXQgc2VuZGVyIiwKKyAgICAgICJTaW5rL05ldHdvcmsiLAorICAgICAgIlNlbmQgZGF0YSBvdmVyIHRoZSBuZXR3b3JrIHZpYSBVRFAiLCAiV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF91ZHBzaW5rX2luaXQgKEdzdFVEUFNpbmsgKiB1ZHBzaW5rKQoreworICB1ZHBzaW5rLT5ob3N0ID0gZ19zdHJkdXAgKFVEUF9ERUZBVUxUX0hPU1QpOworICB1ZHBzaW5rLT5wb3J0ID0gVURQX0RFRkFVTFRfUE9SVDsKKyAgdWRwc2luay0+dXJpID0gZ19zdHJkdXBfcHJpbnRmICgidWRwOi8vJXM6JWQiLCB1ZHBzaW5rLT5ob3N0LCB1ZHBzaW5rLT5wb3J0KTsKKworICBnc3RfbXVsdGl1ZHBzaW5rX2FkZCAoR1NUX01VTFRJVURQU0lOSyAodWRwc2luayksIHVkcHNpbmstPmhvc3QsCisgICAgICB1ZHBzaW5rLT5wb3J0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF91ZHBzaW5rX2ZpbmFsaXplIChHc3RVRFBTaW5rICogdWRwc2luaykKK3sKKyAgZ19mcmVlICh1ZHBzaW5rLT5ob3N0KTsKKyAgdWRwc2luay0+aG9zdCA9IE5VTEw7CisKKyAgZ19mcmVlICh1ZHBzaW5rLT51cmkpOworICB1ZHBzaW5rLT51cmkgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAoKEdPYmplY3QgKikgdWRwc2luayk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3VkcHNpbmtfc2V0X3VyaSAoR3N0VURQU2luayAqIHNpbmssIGNvbnN0IGdjaGFyICogdXJpLCBHRXJyb3IgKiogZXJyb3IpCit7CisgIGdjaGFyICpob3N0OworICBndWludDE2IHBvcnQ7CisKKyAgZ3N0X211bHRpdWRwc2lua19yZW1vdmUgKEdTVF9NVUxUSVVEUFNJTksgKHNpbmspLCBzaW5rLT5ob3N0LCBzaW5rLT5wb3J0KTsKKworICBpZiAoIWdzdF91ZHBfcGFyc2VfdXJpICh1cmksICZob3N0LCAmcG9ydCkpCisgICAgZ290byB3cm9uZ191cmk7CisKKyAgZ19mcmVlIChzaW5rLT5ob3N0KTsKKyAgc2luay0+aG9zdCA9IGhvc3Q7CisgIHNpbmstPnBvcnQgPSBwb3J0OworCisgIGdfZnJlZSAoc2luay0+dXJpKTsKKyAgc2luay0+dXJpID0gZ19zdHJkdXAgKHVyaSk7CisKKyAgZ3N0X211bHRpdWRwc2lua19hZGQgKEdTVF9NVUxUSVVEUFNJTksgKHNpbmspLCBzaW5rLT5ob3N0LCBzaW5rLT5wb3J0KTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX3VyaToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgICAoImVycm9yIHBhcnNpbmcgdXJpICVzIiwgdXJpKSk7CisgICAgZ19zZXRfZXJyb3JfbGl0ZXJhbCAoZXJyb3IsIEdTVF9VUklfRVJST1IsIEdTVF9VUklfRVJST1JfQkFEX1VSSSwKKyAgICAgICAgIkNvdWxkIG5vdCBwYXJzZSBVRFAgVVJJIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdWRwc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VURQU2luayAqdWRwc2luazsKKworICB1ZHBzaW5rID0gR1NUX1VEUFNJTksgKG9iamVjdCk7CisKKyAgLyogcmVtb3ZlIG9sZCBob3N0ICovCisgIGdzdF9tdWx0aXVkcHNpbmtfcmVtb3ZlIChHU1RfTVVMVElVRFBTSU5LICh1ZHBzaW5rKSwKKyAgICAgIHVkcHNpbmstPmhvc3QsIHVkcHNpbmstPnBvcnQpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9IT1NUOgorICAgIHsKKyAgICAgIGNvbnN0IGdjaGFyICpob3N0OworCisgICAgICBob3N0ID0gZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSk7CisgICAgICBnX2ZyZWUgKHVkcHNpbmstPmhvc3QpOworICAgICAgdWRwc2luay0+aG9zdCA9IGdfc3RyZHVwIChob3N0KTsKKyAgICAgIGdfZnJlZSAodWRwc2luay0+dXJpKTsKKyAgICAgIHVkcHNpbmstPnVyaSA9CisgICAgICAgICAgZ19zdHJkdXBfcHJpbnRmICgidWRwOi8vJXM6JWQiLCB1ZHBzaW5rLT5ob3N0LCB1ZHBzaW5rLT5wb3J0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfUE9SVDoKKyAgICAgIHVkcHNpbmstPnBvcnQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdfZnJlZSAodWRwc2luay0+dXJpKTsKKyAgICAgIHVkcHNpbmstPnVyaSA9CisgICAgICAgICAgZ19zdHJkdXBfcHJpbnRmICgidWRwOi8vJXM6JWQiLCB1ZHBzaW5rLT5ob3N0LCB1ZHBzaW5rLT5wb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KKyAgLyogYWRkIG5ldyBob3N0ICovCisgIGdzdF9tdWx0aXVkcHNpbmtfYWRkIChHU1RfTVVMVElVRFBTSU5LICh1ZHBzaW5rKSwKKyAgICAgIHVkcHNpbmstPmhvc3QsIHVkcHNpbmstPnBvcnQpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3VkcHNpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFVEUFNpbmsgKnVkcHNpbms7CisKKyAgdWRwc2luayA9IEdTVF9VRFBTSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9IT1NUOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgdWRwc2luay0+aG9zdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUE9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHVkcHNpbmstPnBvcnQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKioqIEdTVFVSSUhBTkRMRVIgSU5URVJGQUNFICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBHc3RVUklUeXBlCitnc3RfdWRwc2lua191cmlfZ2V0X3R5cGUgKEdUeXBlIHR5cGUpCit7CisgIHJldHVybiBHU1RfVVJJX1NJTks7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqY29uc3QgKgorZ3N0X3VkcHNpbmtfdXJpX2dldF9wcm90b2NvbHMgKEdUeXBlIHR5cGUpCit7CisgIHN0YXRpYyBjb25zdCBnY2hhciAqcHJvdG9jb2xzW10gPSB7ICJ1ZHAiLCBOVUxMIH07CisKKyAgcmV0dXJuIHByb3RvY29sczsKK30KKworc3RhdGljIGdjaGFyICoKK2dzdF91ZHBzaW5rX3VyaV9nZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlcikKK3sKKyAgR3N0VURQU2luayAqc2luayA9IEdTVF9VRFBTSU5LIChoYW5kbGVyKTsKKworICByZXR1cm4gZ19zdHJkdXAgKHNpbmstPnVyaSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3VkcHNpbmtfdXJpX3NldF91cmkgKEdzdFVSSUhhbmRsZXIgKiBoYW5kbGVyLCBjb25zdCBnY2hhciAqIHVyaSwKKyAgICBHRXJyb3IgKiogZXJyb3IpCit7CisgIHJldHVybiBnc3RfdWRwc2lua19zZXRfdXJpIChHU1RfVURQU0lOSyAoaGFuZGxlciksIHVyaSwgZXJyb3IpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3VkcHNpbmtfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0VVJJSGFuZGxlckludGVyZmFjZSAqaWZhY2UgPSAoR3N0VVJJSGFuZGxlckludGVyZmFjZSAqKSBnX2lmYWNlOworCisgIGlmYWNlLT5nZXRfdHlwZSA9IGdzdF91ZHBzaW5rX3VyaV9nZXRfdHlwZTsKKyAgaWZhY2UtPmdldF9wcm90b2NvbHMgPSBnc3RfdWRwc2lua191cmlfZ2V0X3Byb3RvY29sczsKKyAgaWZhY2UtPmdldF91cmkgPSBnc3RfdWRwc2lua191cmlfZ2V0X3VyaTsKKyAgaWZhY2UtPnNldF91cmkgPSBnc3RfdWRwc2lua191cmlfc2V0X3VyaTsKK30KZGlmZiAtLWdpdCBhL2dzdC91ZHAvZ3N0dWRwc2luay5oIGIvZ3N0L3VkcC9nc3R1ZHBzaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdiNWIzNAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC91ZHAvZ3N0dWRwc2luay5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfVURQU0lOS19IX18KKyNkZWZpbmUgX19HU1RfVURQU0lOS19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlICJnc3RtdWx0aXVkcHNpbmsuaCIKKworR19CRUdJTl9ERUNMUworCisjaW5jbHVkZSAiZ3N0dWRwbmV0dXRpbHMuaCIKKworI2RlZmluZSBHU1RfVFlQRV9VRFBTSU5LICAgICAgICAgICAgICAgIChnc3RfdWRwc2lua19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfVURQU0lOSyhvYmopICAgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9VRFBTSU5LLEdzdFVEUFNpbmspKQorI2RlZmluZSBHU1RfVURQU0lOS19DTEFTUyhrbGFzcykgICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1VEUFNJTkssR3N0VURQU2lua0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1VEUFNJTksob2JqKSAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVURQU0lOSykpCisjZGVmaW5lIEdTVF9JU19VRFBTSU5LX0NMQVNTKGtsYXNzKSAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVURQU0lOSykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RVRFBTaW5rIEdzdFVEUFNpbms7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VURQU2lua0NsYXNzIEdzdFVEUFNpbmtDbGFzczsKKworc3RydWN0IF9Hc3RVRFBTaW5rIHsKKyAgR3N0TXVsdGlVRFBTaW5rIHBhcmVudDsKKworICBnY2hhciAqaG9zdDsKKyAgZ3VpbnQxNiBwb3J0OworCisgIGdjaGFyICp1cmk7Cit9OworCitzdHJ1Y3QgX0dzdFVEUFNpbmtDbGFzcyB7CisgIEdzdE11bHRpVURQU2lua0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF91ZHBzaW5rX2dldF90eXBlKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfVURQU0lOS19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC91ZHAvZ3N0dWRwc3JjLmMgYi9nc3QvdWRwL2dzdHVkcHNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZWNhNWQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdWRwL2dzdHVkcHNyYy5jCkBAIC0wLDAgKzEsMTc2MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gTm9raWEgQ29ycG9yYXRpb24gPGthaS52ZWhtYW5lbkBub2tpYS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDEyPiBDb2xsYWJvcmEgTHRkLgorICogICBBdXRob3I6IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbUBjZW50cmljdWxhci5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgQ2VudHJpY3VsYXIgTHRkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtdWRwc3JjCisgKiBAc2VlX2Fsc286IHVkcHNpbmssIG11bHRpZmRzaW5rCisgKgorICogdWRwc3JjIGlzIGEgbmV0d29yayBzb3VyY2UgdGhhdCByZWFkcyBVRFAgcGFja2V0cyBmcm9tIHRoZSBuZXR3b3JrLgorICogSXQgY2FuIGJlIGNvbWJpbmVkIHdpdGggUlRQIGRlcGF5bG9hZGVycyB0byBpbXBsZW1lbnQgUlRQIHN0cmVhbWluZy4KKyAqCisgKiBUaGUgdWRwc3JjIGVsZW1lbnQgc3VwcG9ydHMgYXV0b21hdGljIHBvcnQgYWxsb2NhdGlvbiBieSBzZXR0aW5nIHRoZQorICogI0dzdFVEUFNyYzpwb3J0IHByb3BlcnR5IHRvIDAuIEFmdGVyIHNldHRpbmcgdGhlIHVkcHNyYyB0byBQQVVTRUQsIHRoZQorICogYWxsb2NhdGVkIHBvcnQgY2FuIGJlIG9idGFpbmVkIGJ5IHJlYWRpbmcgdGhlIHBvcnQgcHJvcGVydHkuCisgKgorICogdWRwc3JjIGNhbiByZWFkIGZyb20gbXVsdGljYXN0IGdyb3VwcyBieSBzZXR0aW5nIHRoZSAjR3N0VURQU3JjOm11bHRpY2FzdC1ncm91cAorICogcHJvcGVydHkgdG8gdGhlIElQIGFkZHJlc3Mgb2YgdGhlIG11bHRpY2FzdCBncm91cC4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5IG9uZSBjYW4gcHJvdmlkZSBhIGN1c3RvbSBzb2NrZXQgdG8gdWRwc3JjIHdpdGggdGhlICNHc3RVRFBTcmM6c29ja2V0CisgKiBwcm9wZXJ0eSwgdWRwc3JjIHdpbGwgdGhlbiBub3QgYWxsb2NhdGUgYSBzb2NrZXQgaXRzZWxmIGJ1dCB1c2UgdGhlIHByb3ZpZGVkCisgKiBvbmUuCisgKgorICogVGhlICNHc3RVRFBTcmM6Y2FwcyBwcm9wZXJ0eSBpcyBtYWlubHkgdXNlZCB0byBnaXZlIGEgdHlwZSB0byB0aGUgVURQIHBhY2tldAorICogc28gdGhhdCB0aGV5IGNhbiBiZSBhdXRvcGx1Z2dlZCBpbiBHU3RyZWFtZXIgcGlwZWxpbmVzLiBUaGlzIGlzIHZlcnkgdXNlZnVsCisgKiBmb3IgUlRQIGltcGxlbWVudGF0aW9ucyB3aGVyZSB0aGUgY29udGVudHMgb2YgdGhlIFVEUCBwYWNrZXRzIGlzIHRyYW5zZmVyZWQKKyAqIG91dC1vZi1ib3VuZHMgdXNpbmcgU0RQIG9yIG90aGVyIG1lYW5zLgorICoKKyAqIFRoZSAjR3N0VURQU3JjOmJ1ZmZlci1zaXplIHByb3BlcnR5IGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGtlcm5lbAorICogYnVmZmVyc2l6ZXMgdXNlZCBmb3IgcmVjZWl2aW5nIHBhY2tldHMuIFRoZSBidWZmZXIgc2l6ZSBtYXkgYmUgaW5jcmVhc2VkIGZvcgorICogaGlnaC12b2x1bWUgY29ubmVjdGlvbnMsIG9yIG1heSBiZSBkZWNyZWFzZWQgdG8gbGltaXQgdGhlIHBvc3NpYmxlIGJhY2tsb2cgb2YKKyAqIGluY29taW5nIGRhdGEuIFRoZSBzeXN0ZW0gcGxhY2VzIGFuIGFic29sdXRlIGxpbWl0IG9uIHRoZXNlIHZhbHVlcywgb24gTGludXgsCisgKiBmb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgYnVmZmVyIHNpemUgaXMgdHlwaWNhbGx5IDUwSyBhbmQgY2FuIGJlIGluY3JlYXNlZCB0bworICogbWF4aW1hbGx5IDEwMEsuCisgKgorICogVGhlICNHc3RVRFBTcmM6c2tpcC1maXJzdC1ieXRlcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIHN0cmlwIG9mZiBhbiBhcmJpdHJhcnkKKyAqIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcmF3IHVkcCBwYWNrZXQgYW5kIGNhbiBiZSB1c2VkIHRvIHN0cmlwCisgKiBvZmYgcHJvcHJpZXRhcnkgaGVhZGVyLCBmb3IgZXhhbXBsZS4KKyAqCisgKiBUaGUgdWRwc3JjIGlzIGFsd2F5cyBhIGxpdmUgc291cmNlLiBJdCBkb2VzIGhvd2V2ZXIgbm90IHByb3ZpZGUgYSAjR3N0Q2xvY2ssCisgKiB0aGlzIGlzIGxlZnQgZm9yIGRvd25zdHJlYW0gZWxlbWVudHMgc3VjaCBhcyBhbiBSVFAgc2Vzc2lvbiBtYW5hZ2VyIG9yIGRlbXV4ZXIKKyAqIChzdWNoIGFzIGFuIE1QRUcgZGVtdXhlcikuIEFzIHdpdGggYWxsIGxpdmUgc291cmNlcywgdGhlIGNhcHR1cmVkIGJ1ZmZlcnMKKyAqIHdpbGwgaGF2ZSB0aGVpciB0aW1lc3RhbXAgc2V0IHRvIHRoZSBjdXJyZW50IHJ1bm5pbmcgdGltZSBvZiB0aGUgcGlwZWxpbmUuCisgKgorICogdWRwc3JjIGltcGxlbWVudHMgYSAjR3N0VVJJSGFuZGxlciBpbnRlcmZhY2UgdGhhdCBoYW5kbGVzIHVkcDovL2hvc3Q6cG9ydAorICogdHlwZSBVUklzLgorICoKKyAqIElmIHRoZSAjR3N0VURQU3JjOnRpbWVvdXQgcHJvcGVydHkgaXMgc2V0IHRvIGEgdmFsdWUgYmlnZ2VyIHRoYW4gMCwgdWRwc3JjCisgKiB3aWxsIGdlbmVyYXRlIGFuIGVsZW1lbnQgbWVzc2FnZSBuYW1lZAorICogPGNsYXNzbmFtZT4mcXVvdDtHc3RVRFBTcmNUaW1lb3V0JnF1b3Q7PC9jbGFzc25hbWU+CisgKiBpZiBubyBkYXRhIHdhcyByZWNpZXZlZCBpbiB0aGUgZ2l2ZW4gdGltZW91dC4KKyAqIFRoZSBtZXNzYWdlJ3Mgc3RydWN0dXJlIGNvbnRhaW5zIG9uZSBmaWVsZDoKKyAqIDxpdGVtaXplZGxpc3Q+CisgKiA8bGlzdGl0ZW0+CisgKiAgIDxwYXJhPgorICogICAjZ3VpbnQ2NAorICogICA8Y2xhc3NuYW1lPiZxdW90O3RpbWVvdXQmcXVvdDs8L2NsYXNzbmFtZT46IHRoZSB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcyB0aGF0CisgKiAgIGV4cGlyZWQgd2hlbiB3YWl0aW5nIGZvciBkYXRhLgorICogICA8L3BhcmE+CisgKiA8L2xpc3RpdGVtPgorICogPC9pdGVtaXplZGxpc3Q+CisgKiBUaGUgbWVzc2FnZSBpcyB0eXBpY2FsbHkgdXNlZCB0byBkZXRlY3QgdGhhdCBubyBVRFAgYXJyaXZlcyBpbiB0aGUgcmVjZWl2ZXIKKyAqIGJlY2F1c2UgaXQgaXMgYmxvY2tlZCBieSBhIGZpcmV3YWxsLgorICoKKyAqIEEgY3VzdG9tIGZpbGUgZGVzY3JpcHRvciBjYW4gYmUgY29uZmlndXJlZCB3aXRoIHRoZQorICogI0dzdFVEUFNyYzpzb2NrZXQgcHJvcGVydHkuIFRoZSBzb2NrZXQgd2lsbCBiZSBjbG9zZWQgd2hlbiBzZXR0aW5nCisgKiB0aGUgZWxlbWVudCB0byBSRUFEWSBieSBkZWZhdWx0LiBUaGlzIGJlaGF2aW91ciBjYW4gYmUgb3ZlcnJpZGVuCisgKiB3aXRoIHRoZSAjR3N0VURQU3JjOmNsb3NlLXNvY2tldCBwcm9wZXJ0eSwgaW4gd2hpY2ggY2FzZSB0aGUKKyAqIGFwcGxpY2F0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiB1ZHBzcmMgISBmYWtlc2luayBkdW1wPTEKKyAqIF18IEEgcGlwZWxpbmUgdG8gcmVhZCBmcm9tIHRoZSBkZWZhdWx0IHBvcnQgYW5kIGR1bXAgdGhlIHVkcCBwYWNrZXRzLgorICogVG8gYWN0dWFsbHkgZ2VuZXJhdGUgdWRwIHBhY2tldHMgb24gdGhlIGRlZmF1bHQgcG9ydCBvbmUgY2FuIHVzZSB0aGUKKyAqIHVkcHNpbmsgZWxlbWVudC4gV2hlbiBydW5uaW5nIHRoZSBmb2xsb3dpbmcgcGlwZWxpbmUgaW4gYW5vdGhlciB0ZXJtaW5hbCwgdGhlCisgKiBhYm92ZSBtZW50aW9uZWQgcGlwZWxpbmUgc2hvdWxkIGR1bXAgZGF0YSBwYWNrZXRzIHRvIHRoZSBjb25zb2xlLgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyAhIHVkcHNpbmsKKyAqIF18CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgdWRwc3JjIHBvcnQ9MCAhIGZha2VzaW5rCisgKiBdfCByZWFkIHVkcCBwYWNrZXRzIGZyb20gYSBmcmVlIHBvcnQuCisgKiA8L3JlZnNlY3QyPgorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKy8qIE5lZWRlZCB0byBnZXQgc3RydWN0IGluNl9wa3RpbmZvLgorICogQWxzbyBhbGwgdGhlc2UgaGF2ZSB0byBiZSBiZWZvcmUgZ2xpYi5oIGlzIGluY2x1ZGVkIGFzCisgKiBvdGhlcndpc2Ugc3RydWN0IGluNl9wa3RpbmZvIGlzIG5vdCBkZWZpbmVkIGNvbXBsZXRlbHkKKyAqIGR1ZSB0byBicm9rZW4gZ2xpYmMgaGVhZGVycyAqLworI2RlZmluZSBfR05VX1NPVVJDRQorLyogTmVlZGVkIGZvciBPU1gvaU9TIHRvIGRlZmluZSB0aGUgSVB2NiB2YXJpYW50cyAqLworI2RlZmluZSBfX0FQUExFX1VTRV9SRkNfMzU0MgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnc3R1ZHBzcmMuaCIKKworI2luY2x1ZGUgPGdzdC9uZXQvZ3N0bmV0YWRkcmVzc21ldGEuaD4KKworI2luY2x1ZGUgPGdpby9nbmV0d29ya2luZy5oPgorCisvKiBSZXF1aXJlZCBmb3Igb3RoZXIgcGFydHMgb2YgaW5fcGt0aW5mbyAvIGluNl9wa3RpbmZvIGJ1dCBvbmx5CisgKiBvbiBub24tV2luZG93cyBhbmQgY2FuIGJlIGluY2x1ZGVkIGFmdGVyIGdsaWIuaCAqLworI2lmbmRlZiBHX1BMQVRGT1JNX1dJTjMyCisjaW5jbHVkZSA8bmV0aW5ldC9pcC5oPgorI2VuZGlmCisKKy8qIENvbnRyb2wgbWVzc2FnZXMgZm9yIGdldHRpbmcgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKyNpZmRlZiBJUF9QS1RJTkZPCitHVHlwZSBnc3RfaXBfcGt0aW5mb19tZXNzYWdlX2dldF90eXBlICh2b2lkKTsKKworI2RlZmluZSBHU1RfVFlQRV9JUF9QS1RJTkZPX01FU1NBR0UgICAgICAgICAoZ3N0X2lwX3BrdGluZm9fbWVzc2FnZV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX0lQX1BLVElORk9fTUVTU0FHRShvKSAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgobyksIEdTVF9UWVBFX0lQX1BLVElORk9fTUVTU0FHRSwgR3N0SVBQa3RpbmZvTWVzc2FnZSkpCisjZGVmaW5lIEdTVF9JUF9QS1RJTkZPX01FU1NBR0VfQ0xBU1MoYykgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBHU1RfVFlQRV9JUF9QS1RJTkZPX01FU1NBR0UsIEdzdElQUGt0aW5mb01lc3NhZ2VDbGFzcykpCisjZGVmaW5lIEdTVF9JU19JUF9QS1RJTkZPX01FU1NBR0UobykgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG8pLCBHU1RfVFlQRV9JUF9QS1RJTkZPX01FU1NBR0UpKQorI2RlZmluZSBHU1RfSVNfSVBfUEtUSU5GT19NRVNTQUdFX0NMQVNTKGMpICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgR1NUX1RZUEVfSVBfUEtUSU5GT19NRVNTQUdFKSkKKyNkZWZpbmUgR1NUX0lQX1BLVElORk9fTUVTU0FHRV9HRVRfQ0xBU1MobykgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvKSwgR1NUX1RZUEVfSVBfUEtUSU5GT19NRVNTQUdFLCBHc3RJUFBrdGluZm9NZXNzYWdlQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0SVBQa3RpbmZvTWVzc2FnZSBHc3RJUFBrdGluZm9NZXNzYWdlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdElQUGt0aW5mb01lc3NhZ2VDbGFzcyBHc3RJUFBrdGluZm9NZXNzYWdlQ2xhc3M7CisKK3N0cnVjdCBfR3N0SVBQa3RpbmZvTWVzc2FnZUNsYXNzCit7CisgIEdTb2NrZXRDb250cm9sTWVzc2FnZUNsYXNzIHBhcmVudF9jbGFzczsKKworfTsKKworc3RydWN0IF9Hc3RJUFBrdGluZm9NZXNzYWdlCit7CisgIEdTb2NrZXRDb250cm9sTWVzc2FnZSBwYXJlbnQ7CisKKyAgZ3VpbnQgaWZpbmRleDsKKyNpZm5kZWYgR19QTEFURk9STV9XSU4zMgorI2lmbmRlZiBfX05ldEJTRF9fCisgIHN0cnVjdCBpbl9hZGRyIHNwZWNfZHN0OworI2VuZGlmCisjZW5kaWYKKyAgc3RydWN0IGluX2FkZHIgYWRkcjsKK307CisKK0dfREVGSU5FX1RZUEUgKEdzdElQUGt0aW5mb01lc3NhZ2UsIGdzdF9pcF9wa3RpbmZvX21lc3NhZ2UsCisgICAgR19UWVBFX1NPQ0tFVF9DT05UUk9MX01FU1NBR0UpOworCitzdGF0aWMgZ3NpemUKK2dzdF9pcF9wa3RpbmZvX21lc3NhZ2VfZ2V0X3NpemUgKEdTb2NrZXRDb250cm9sTWVzc2FnZSAqIG1lc3NhZ2UpCit7CisgIHJldHVybiBzaXplb2YgKHN0cnVjdCBpbl9wa3RpbmZvKTsKK30KKworc3RhdGljIGludAorZ3N0X2lwX3BrdGluZm9fbWVzc2FnZV9nZXRfbGV2ZWwgKEdTb2NrZXRDb250cm9sTWVzc2FnZSAqIG1lc3NhZ2UpCit7CisgIHJldHVybiBJUFBST1RPX0lQOworfQorCitzdGF0aWMgaW50Citnc3RfaXBfcGt0aW5mb19tZXNzYWdlX2dldF9tc2dfdHlwZSAoR1NvY2tldENvbnRyb2xNZXNzYWdlICogbWVzc2FnZSkKK3sKKyAgcmV0dXJuIElQX1BLVElORk87Cit9CisKK3N0YXRpYyBHU29ja2V0Q29udHJvbE1lc3NhZ2UgKgorZ3N0X2lwX3BrdGluZm9fbWVzc2FnZV9kZXNlcmlhbGl6ZSAoZ2ludCBsZXZlbCwKKyAgICBnaW50IHR5cGUsIGdzaXplIHNpemUsIGdwb2ludGVyIGRhdGEpCit7CisgIHN0cnVjdCBpbl9wa3RpbmZvICpwa3RpbmZvOworICBHc3RJUFBrdGluZm9NZXNzYWdlICptZXNzYWdlOworCisgIGlmIChsZXZlbCAhPSBJUFBST1RPX0lQIHx8IHR5cGUgIT0gSVBfUEtUSU5GTykKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoc2l6ZSA8IHNpemVvZiAoc3RydWN0IGluX3BrdGluZm8pKQorICAgIHJldHVybiBOVUxMOworCisgIHBrdGluZm8gPSBkYXRhOworCisgIG1lc3NhZ2UgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX0lQX1BLVElORk9fTUVTU0FHRSwgTlVMTCk7CisgIG1lc3NhZ2UtPmlmaW5kZXggPSBwa3RpbmZvLT5pcGlfaWZpbmRleDsKKyNpZm5kZWYgR19QTEFURk9STV9XSU4zMgorI2lmbmRlZiBfX05ldEJTRF9fCisgIG1lc3NhZ2UtPnNwZWNfZHN0ID0gcGt0aW5mby0+aXBpX3NwZWNfZHN0OworI2VuZGlmCisjZW5kaWYKKyAgbWVzc2FnZS0+YWRkciA9IHBrdGluZm8tPmlwaV9hZGRyOworCisgIHJldHVybiBHX1NPQ0tFVF9DT05UUk9MX01FU1NBR0UgKG1lc3NhZ2UpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2lwX3BrdGluZm9fbWVzc2FnZV9pbml0IChHc3RJUFBrdGluZm9NZXNzYWdlICogbWVzc2FnZSkKK3sKK30KKworc3RhdGljIHZvaWQKK2dzdF9pcF9wa3RpbmZvX21lc3NhZ2VfY2xhc3NfaW5pdCAoR3N0SVBQa3RpbmZvTWVzc2FnZUNsYXNzICogY2xhc3MpCit7CisgIEdTb2NrZXRDb250cm9sTWVzc2FnZUNsYXNzICpzY21fY2xhc3M7CisKKyAgc2NtX2NsYXNzID0gR19TT0NLRVRfQ09OVFJPTF9NRVNTQUdFX0NMQVNTIChjbGFzcyk7CisgIHNjbV9jbGFzcy0+Z2V0X3NpemUgPSBnc3RfaXBfcGt0aW5mb19tZXNzYWdlX2dldF9zaXplOworICBzY21fY2xhc3MtPmdldF9sZXZlbCA9IGdzdF9pcF9wa3RpbmZvX21lc3NhZ2VfZ2V0X2xldmVsOworICBzY21fY2xhc3MtPmdldF90eXBlID0gZ3N0X2lwX3BrdGluZm9fbWVzc2FnZV9nZXRfbXNnX3R5cGU7CisgIHNjbV9jbGFzcy0+ZGVzZXJpYWxpemUgPSBnc3RfaXBfcGt0aW5mb19tZXNzYWdlX2Rlc2VyaWFsaXplOworfQorI2VuZGlmCisKKyNpZmRlZiBJUFY2X1BLVElORk8KK0dUeXBlIGdzdF9pcHY2X3BrdGluZm9fbWVzc2FnZV9nZXRfdHlwZSAodm9pZCk7CisKKyNkZWZpbmUgR1NUX1RZUEVfSVBWNl9QS1RJTkZPX01FU1NBR0UgICAgICAgICAoZ3N0X2lwdjZfcGt0aW5mb19tZXNzYWdlX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfSVBWNl9QS1RJTkZPX01FU1NBR0UobykgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG8pLCBHU1RfVFlQRV9JUFY2X1BLVElORk9fTUVTU0FHRSwgR3N0SVBWNlBrdGluZm9NZXNzYWdlKSkKKyNkZWZpbmUgR1NUX0lQVjZfUEtUSU5GT19NRVNTQUdFX0NMQVNTKGMpICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgR1NUX1RZUEVfSVBWNl9QS1RJTkZPX01FU1NBR0UsIEdzdElQVjZQa3RpbmZvTWVzc2FnZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0lQVjZfUEtUSU5GT19NRVNTQUdFKG8pICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvKSwgR1NUX1RZUEVfSVBWNl9QS1RJTkZPX01FU1NBR0UpKQorI2RlZmluZSBHU1RfSVNfSVBWNl9QS1RJTkZPX01FU1NBR0VfQ0xBU1MoYykgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBHU1RfVFlQRV9JUFY2X1BLVElORk9fTUVTU0FHRSkpCisjZGVmaW5lIEdTVF9JUFY2X1BLVElORk9fTUVTU0FHRV9HRVRfQ0xBU1MobykgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvKSwgR1NUX1RZUEVfSVBWNl9QS1RJTkZPX01FU1NBR0UsIEdzdElQVjZQa3RpbmZvTWVzc2FnZUNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdElQVjZQa3RpbmZvTWVzc2FnZSBHc3RJUFY2UGt0aW5mb01lc3NhZ2U7Cit0eXBlZGVmIHN0cnVjdCBfR3N0SVBWNlBrdGluZm9NZXNzYWdlQ2xhc3MgR3N0SVBWNlBrdGluZm9NZXNzYWdlQ2xhc3M7CisKK3N0cnVjdCBfR3N0SVBWNlBrdGluZm9NZXNzYWdlQ2xhc3MKK3sKKyAgR1NvY2tldENvbnRyb2xNZXNzYWdlQ2xhc3MgcGFyZW50X2NsYXNzOworCit9OworCitzdHJ1Y3QgX0dzdElQVjZQa3RpbmZvTWVzc2FnZQoreworICBHU29ja2V0Q29udHJvbE1lc3NhZ2UgcGFyZW50OworCisgIGd1aW50IGlmaW5kZXg7CisgIHN0cnVjdCBpbjZfYWRkciBhZGRyOworfTsKKworR19ERUZJTkVfVFlQRSAoR3N0SVBWNlBrdGluZm9NZXNzYWdlLCBnc3RfaXB2Nl9wa3RpbmZvX21lc3NhZ2UsCisgICAgR19UWVBFX1NPQ0tFVF9DT05UUk9MX01FU1NBR0UpOworCitzdGF0aWMgZ3NpemUKK2dzdF9pcHY2X3BrdGluZm9fbWVzc2FnZV9nZXRfc2l6ZSAoR1NvY2tldENvbnRyb2xNZXNzYWdlICogbWVzc2FnZSkKK3sKKyAgcmV0dXJuIHNpemVvZiAoc3RydWN0IGluNl9wa3RpbmZvKTsKK30KKworc3RhdGljIGludAorZ3N0X2lwdjZfcGt0aW5mb19tZXNzYWdlX2dldF9sZXZlbCAoR1NvY2tldENvbnRyb2xNZXNzYWdlICogbWVzc2FnZSkKK3sKKyAgcmV0dXJuIElQUFJPVE9fSVBWNjsKK30KKworc3RhdGljIGludAorZ3N0X2lwdjZfcGt0aW5mb19tZXNzYWdlX2dldF9tc2dfdHlwZSAoR1NvY2tldENvbnRyb2xNZXNzYWdlICogbWVzc2FnZSkKK3sKKyAgcmV0dXJuIElQVjZfUEtUSU5GTzsKK30KKworc3RhdGljIEdTb2NrZXRDb250cm9sTWVzc2FnZSAqCitnc3RfaXB2Nl9wa3RpbmZvX21lc3NhZ2VfZGVzZXJpYWxpemUgKGdpbnQgbGV2ZWwsCisgICAgZ2ludCB0eXBlLCBnc2l6ZSBzaXplLCBncG9pbnRlciBkYXRhKQoreworICBzdHJ1Y3QgaW42X3BrdGluZm8gKnBrdGluZm87CisgIEdzdElQVjZQa3RpbmZvTWVzc2FnZSAqbWVzc2FnZTsKKworICBpZiAobGV2ZWwgIT0gSVBQUk9UT19JUFY2IHx8IHR5cGUgIT0gSVBWNl9QS1RJTkZPKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChzaXplIDwgc2l6ZW9mIChzdHJ1Y3QgaW42X3BrdGluZm8pKQorICAgIHJldHVybiBOVUxMOworCisgIHBrdGluZm8gPSBkYXRhOworCisgIG1lc3NhZ2UgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX0lQVjZfUEtUSU5GT19NRVNTQUdFLCBOVUxMKTsKKyAgbWVzc2FnZS0+aWZpbmRleCA9IHBrdGluZm8tPmlwaTZfaWZpbmRleDsKKyAgbWVzc2FnZS0+YWRkciA9IHBrdGluZm8tPmlwaTZfYWRkcjsKKworICByZXR1cm4gR19TT0NLRVRfQ09OVFJPTF9NRVNTQUdFIChtZXNzYWdlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9pcHY2X3BrdGluZm9fbWVzc2FnZV9pbml0IChHc3RJUFY2UGt0aW5mb01lc3NhZ2UgKiBtZXNzYWdlKQoreworfQorCitzdGF0aWMgdm9pZAorZ3N0X2lwdjZfcGt0aW5mb19tZXNzYWdlX2NsYXNzX2luaXQgKEdzdElQVjZQa3RpbmZvTWVzc2FnZUNsYXNzICogY2xhc3MpCit7CisgIEdTb2NrZXRDb250cm9sTWVzc2FnZUNsYXNzICpzY21fY2xhc3M7CisKKyAgc2NtX2NsYXNzID0gR19TT0NLRVRfQ09OVFJPTF9NRVNTQUdFX0NMQVNTIChjbGFzcyk7CisgIHNjbV9jbGFzcy0+Z2V0X3NpemUgPSBnc3RfaXB2Nl9wa3RpbmZvX21lc3NhZ2VfZ2V0X3NpemU7CisgIHNjbV9jbGFzcy0+Z2V0X2xldmVsID0gZ3N0X2lwdjZfcGt0aW5mb19tZXNzYWdlX2dldF9sZXZlbDsKKyAgc2NtX2NsYXNzLT5nZXRfdHlwZSA9IGdzdF9pcHY2X3BrdGluZm9fbWVzc2FnZV9nZXRfbXNnX3R5cGU7CisgIHNjbV9jbGFzcy0+ZGVzZXJpYWxpemUgPSBnc3RfaXB2Nl9wa3RpbmZvX21lc3NhZ2VfZGVzZXJpYWxpemU7Cit9CisKKyNlbmRpZgorCisjaWZkZWYgSVBfUkVDVkRTVEFERFIKK0dUeXBlIGdzdF9pcF9yZWN2ZHN0YWRkcl9tZXNzYWdlX2dldF90eXBlICh2b2lkKTsKKworI2RlZmluZSBHU1RfVFlQRV9JUF9SRUNWRFNUQUREUl9NRVNTQUdFICAgICAgICAgKGdzdF9pcF9yZWN2ZHN0YWRkcl9tZXNzYWdlX2dldF90eXBlICgpKQorI2RlZmluZSBHU1RfSVBfUkVDVkRTVEFERFJfTUVTU0FHRShvKSAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgobyksIEdTVF9UWVBFX0lQX1JFQ1ZEU1RBRERSX01FU1NBR0UsIEdzdElQUmVjdmRzdGFkZHJNZXNzYWdlKSkKKyNkZWZpbmUgR1NUX0lQX1JFQ1ZEU1RBRERSX01FU1NBR0VfQ0xBU1MoYykgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBHU1RfVFlQRV9JUF9SRUNWRFNUQUREUl9NRVNTQUdFLCBHc3RJUFJlY3Zkc3RhZGRyTWVzc2FnZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX0lQX1JFQ1ZEU1RBRERSX01FU1NBR0UobykgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG8pLCBHU1RfVFlQRV9JUF9SRUNWRFNUQUREUl9NRVNTQUdFKSkKKyNkZWZpbmUgR1NUX0lTX0lQX1JFQ1ZEU1RBRERSX01FU1NBR0VfQ0xBU1MoYykgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBHU1RfVFlQRV9JUF9SRUNWRFNUQUREUl9NRVNTQUdFKSkKKyNkZWZpbmUgR1NUX0lQX1JFQ1ZEU1RBRERSX01FU1NBR0VfR0VUX0NMQVNTKG8pIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgobyksIEdTVF9UWVBFX0lQX1JFQ1ZEU1RBRERSX01FU1NBR0UsIEdzdElQUmVjdmRzdGFkZHJNZXNzYWdlQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0SVBSZWN2ZHN0YWRkck1lc3NhZ2UgR3N0SVBSZWN2ZHN0YWRkck1lc3NhZ2U7Cit0eXBlZGVmIHN0cnVjdCBfR3N0SVBSZWN2ZHN0YWRkck1lc3NhZ2VDbGFzcyBHc3RJUFJlY3Zkc3RhZGRyTWVzc2FnZUNsYXNzOworCitzdHJ1Y3QgX0dzdElQUmVjdmRzdGFkZHJNZXNzYWdlQ2xhc3MKK3sKKyAgR1NvY2tldENvbnRyb2xNZXNzYWdlQ2xhc3MgcGFyZW50X2NsYXNzOworCit9OworCitzdHJ1Y3QgX0dzdElQUmVjdmRzdGFkZHJNZXNzYWdlCit7CisgIEdTb2NrZXRDb250cm9sTWVzc2FnZSBwYXJlbnQ7CisKKyAgZ3VpbnQgaWZpbmRleDsKKyAgc3RydWN0IGluX2FkZHIgYWRkcjsKK307CisKK0dfREVGSU5FX1RZUEUgKEdzdElQUmVjdmRzdGFkZHJNZXNzYWdlLCBnc3RfaXBfcmVjdmRzdGFkZHJfbWVzc2FnZSwKKyAgICBHX1RZUEVfU09DS0VUX0NPTlRST0xfTUVTU0FHRSk7CisKK3N0YXRpYyBnc2l6ZQorZ3N0X2lwX3JlY3Zkc3RhZGRyX21lc3NhZ2VfZ2V0X3NpemUgKEdTb2NrZXRDb250cm9sTWVzc2FnZSAqIG1lc3NhZ2UpCit7CisgIHJldHVybiBzaXplb2YgKHN0cnVjdCBpbl9hZGRyKTsKK30KKworc3RhdGljIGludAorZ3N0X2lwX3JlY3Zkc3RhZGRyX21lc3NhZ2VfZ2V0X2xldmVsIChHU29ja2V0Q29udHJvbE1lc3NhZ2UgKiBtZXNzYWdlKQoreworICByZXR1cm4gSVBQUk9UT19JUDsKK30KKworc3RhdGljIGludAorZ3N0X2lwX3JlY3Zkc3RhZGRyX21lc3NhZ2VfZ2V0X21zZ190eXBlIChHU29ja2V0Q29udHJvbE1lc3NhZ2UgKiBtZXNzYWdlKQoreworICByZXR1cm4gSVBfUkVDVkRTVEFERFI7Cit9CisKK3N0YXRpYyBHU29ja2V0Q29udHJvbE1lc3NhZ2UgKgorZ3N0X2lwX3JlY3Zkc3RhZGRyX21lc3NhZ2VfZGVzZXJpYWxpemUgKGdpbnQgbGV2ZWwsCisgICAgZ2ludCB0eXBlLCBnc2l6ZSBzaXplLCBncG9pbnRlciBkYXRhKQoreworICBzdHJ1Y3QgaW5fYWRkciAqYWRkcjsKKyAgR3N0SVBSZWN2ZHN0YWRkck1lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgaWYgKGxldmVsICE9IElQUFJPVE9fSVAgfHwgdHlwZSAhPSBJUF9SRUNWRFNUQUREUikKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoc2l6ZSA8IHNpemVvZiAoc3RydWN0IGluX2FkZHIpKQorICAgIHJldHVybiBOVUxMOworCisgIGFkZHIgPSBkYXRhOworCisgIG1lc3NhZ2UgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX0lQX1JFQ1ZEU1RBRERSX01FU1NBR0UsIE5VTEwpOworICBtZXNzYWdlLT5hZGRyID0gKmFkZHI7CisKKyAgcmV0dXJuIEdfU09DS0VUX0NPTlRST0xfTUVTU0FHRSAobWVzc2FnZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaXBfcmVjdmRzdGFkZHJfbWVzc2FnZV9pbml0IChHc3RJUFJlY3Zkc3RhZGRyTWVzc2FnZSAqIG1lc3NhZ2UpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfaXBfcmVjdmRzdGFkZHJfbWVzc2FnZV9jbGFzc19pbml0IChHc3RJUFJlY3Zkc3RhZGRyTWVzc2FnZUNsYXNzICogY2xhc3MpCit7CisgIEdTb2NrZXRDb250cm9sTWVzc2FnZUNsYXNzICpzY21fY2xhc3M7CisKKyAgc2NtX2NsYXNzID0gR19TT0NLRVRfQ09OVFJPTF9NRVNTQUdFX0NMQVNTIChjbGFzcyk7CisgIHNjbV9jbGFzcy0+Z2V0X3NpemUgPSBnc3RfaXBfcmVjdmRzdGFkZHJfbWVzc2FnZV9nZXRfc2l6ZTsKKyAgc2NtX2NsYXNzLT5nZXRfbGV2ZWwgPSBnc3RfaXBfcmVjdmRzdGFkZHJfbWVzc2FnZV9nZXRfbGV2ZWw7CisgIHNjbV9jbGFzcy0+Z2V0X3R5cGUgPSBnc3RfaXBfcmVjdmRzdGFkZHJfbWVzc2FnZV9nZXRfbXNnX3R5cGU7CisgIHNjbV9jbGFzcy0+ZGVzZXJpYWxpemUgPSBnc3RfaXBfcmVjdmRzdGFkZHJfbWVzc2FnZV9kZXNlcmlhbGl6ZTsKK30KKyNlbmRpZgorCisvKiBub3QgMTAwJSBjb3JyZWN0LCBidXQgYSBnb29kIHVwcGVyIGJvdW5kIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBwdXJwb3NlcyAqLworI2RlZmluZSBNQVhfSVBWNF9VRFBfUEFDS0VUX1NJWkUgKDY1NTM2IC0gOCkKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAodWRwc3JjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUICh1ZHBzcmNfZGVidWcpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKKyNkZWZpbmUgVURQX0RFRkFVTFRfUE9SVCAgICAgICAgICAgICAgICA1MDA0CisjZGVmaW5lIFVEUF9ERUZBVUxUX01VTFRJQ0FTVF9HUk9VUCAgICAgIjAuMC4wLjAiCisjZGVmaW5lIFVEUF9ERUZBVUxUX01VTFRJQ0FTVF9JRkFDRSAgICAgTlVMTAorI2RlZmluZSBVRFBfREVGQVVMVF9VUkkgICAgICAgICAgICAgICAgICJ1ZHA6Ly8iVURQX0RFRkFVTFRfTVVMVElDQVNUX0dST1VQIjoiR19TVFJJTkdJRlkoVURQX0RFRkFVTFRfUE9SVCkKKyNkZWZpbmUgVURQX0RFRkFVTFRfQ0FQUyAgICAgICAgICAgICAgICBOVUxMCisjZGVmaW5lIFVEUF9ERUZBVUxUX1NPQ0tFVCAgICAgICAgICAgICAgTlVMTAorI2RlZmluZSBVRFBfREVGQVVMVF9CVUZGRVJfU0laRQkJMAorI2RlZmluZSBVRFBfREVGQVVMVF9USU1FT1VUICAgICAgICAgICAgIDAKKyNkZWZpbmUgVURQX0RFRkFVTFRfU0tJUF9GSVJTVF9CWVRFUwkwCisjZGVmaW5lIFVEUF9ERUZBVUxUX0NMT1NFX1NPQ0tFVCAgICAgICBUUlVFCisjZGVmaW5lIFVEUF9ERUZBVUxUX1VTRURfU09DS0VUICAgICAgICBOVUxMCisjZGVmaW5lIFVEUF9ERUZBVUxUX0FVVE9fTVVMVElDQVNUICAgICBUUlVFCisjZGVmaW5lIFVEUF9ERUZBVUxUX1JFVVNFICAgICAgICAgICAgICBUUlVFCisjZGVmaW5lIFVEUF9ERUZBVUxUX0xPT1AgICAgICAgICAgICAgICBUUlVFCisjZGVmaW5lIFVEUF9ERUZBVUxUX1JFVFJJRVZFX1NFTkRFUl9BRERSRVNTIFRSVUUKKworZW51bQoreworICBQUk9QXzAsCisKKyAgUFJPUF9QT1JULAorICBQUk9QX01VTFRJQ0FTVF9HUk9VUCwKKyAgUFJPUF9NVUxUSUNBU1RfSUZBQ0UsCisgIFBST1BfVVJJLAorICBQUk9QX0NBUFMsCisgIFBST1BfU09DS0VULAorICBQUk9QX0JVRkZFUl9TSVpFLAorICBQUk9QX1RJTUVPVVQsCisgIFBST1BfU0tJUF9GSVJTVF9CWVRFUywKKyAgUFJPUF9DTE9TRV9TT0NLRVQsCisgIFBST1BfVVNFRF9TT0NLRVQsCisgIFBST1BfQVVUT19NVUxUSUNBU1QsCisgIFBST1BfUkVVU0UsCisgIFBST1BfQUREUkVTUywKKyAgUFJPUF9MT09QLAorICBQUk9QX1JFVFJJRVZFX1NFTkRFUl9BRERSRVNTCit9OworCitzdGF0aWMgdm9pZCBnc3RfdWRwc3JjX3VyaV9oYW5kbGVyX2luaXQgKGdwb2ludGVyIGdfaWZhY2UsIGdwb2ludGVyIGlmYWNlX2RhdGEpOworCitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3VkcHNyY19nZXRjYXBzIChHc3RCYXNlU3JjICogc3JjLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF91ZHBzcmNfY3JlYXRlIChHc3RQdXNoU3JjICogcHNyYywgR3N0QnVmZmVyICoqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3VkcHNyY19jbG9zZSAoR3N0VURQU3JjICogc3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdWRwc3JjX3VubG9jayAoR3N0QmFzZVNyYyAqIGJzcmMpOworc3RhdGljIGdib29sZWFuIGdzdF91ZHBzcmNfdW5sb2NrX3N0b3AgKEdzdEJhc2VTcmMgKiBic3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdWRwc3JjX25lZ290aWF0ZSAoR3N0QmFzZVNyYyAqIGJhc2VzcmMpOworCitzdGF0aWMgdm9pZCBnc3RfdWRwc3JjX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKKworc3RhdGljIHZvaWQgZ3N0X3VkcHNyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfdWRwc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF91ZHBzcmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKTsKKworI2RlZmluZSBnc3RfdWRwc3JjX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RVRFBTcmMsIGdzdF91ZHBzcmMsIEdTVF9UWVBFX1BVU0hfU1JDLAorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfVVJJX0hBTkRMRVIsIGdzdF91ZHBzcmNfdXJpX2hhbmRsZXJfaW5pdCkpOworCitzdGF0aWMgdm9pZAorZ3N0X3VkcHNyY19jbGFzc19pbml0IChHc3RVRFBTcmNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0QmFzZVNyY0NsYXNzICpnc3RiYXNlc3JjX2NsYXNzOworICBHc3RQdXNoU3JjQ2xhc3MgKmdzdHB1c2hzcmNfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RiYXNlc3JjX2NsYXNzID0gKEdzdEJhc2VTcmNDbGFzcyAqKSBrbGFzczsKKyAgZ3N0cHVzaHNyY19jbGFzcyA9IChHc3RQdXNoU3JjQ2xhc3MgKikga2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHVkcHNyY19kZWJ1ZywgInVkcHNyYyIsIDAsICJVRFAgc3JjIik7CisKKyNpZmRlZiBJUF9QS1RJTkZPCisgIEdTVF9UWVBFX0lQX1BLVElORk9fTUVTU0FHRTsKKyNlbmRpZgorI2lmZGVmIElQVjZfUEtUSU5GTworICBHU1RfVFlQRV9JUFY2X1BLVElORk9fTUVTU0FHRTsKKyNlbmRpZgorI2lmZGVmIElQX1JFQ1ZEU1RBRERSCisgIEdTVF9UWVBFX0lQX1JFQ1ZEU1RBRERSX01FU1NBR0U7CisjZW5kaWYKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdWRwc3JjX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3VkcHNyY19nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3VkcHNyY19maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX1BPUlQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicG9ydCIsICJQb3J0IiwKKyAgICAgICAgICAiVGhlIHBvcnQgdG8gcmVjZWl2ZSB0aGUgcGFja2V0cyBmcm9tLCAwPWFsbG9jYXRlIiwgMCwgR19NQVhVSU5UMTYsCisgICAgICAgICAgVURQX0RFRkFVTFRfUE9SVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qIEZJWE1FIDIuMDogUmVtb3ZlIG11bHRpY2FzdC1ncm91cCBwcm9wZXJ0eSAqLworI2lmbmRlZiBHU1RfUkVNT1ZFX0RFUFJFQ0FURUQKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9NVUxUSUNBU1RfR1JPVVAsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibXVsdGljYXN0LWdyb3VwIiwgIk11bHRpY2FzdCBHcm91cCIsCisgICAgICAgICAgIlRoZSBBZGRyZXNzIG9mIG11bHRpY2FzdCBncm91cCB0byBqb2luLiAoREVQUkVDQVRFRDogIgorICAgICAgICAgICJVc2UgYWRkcmVzcyBwcm9wZXJ0eSBpbnN0ZWFkKSIsIFVEUF9ERUZBVUxUX01VTFRJQ0FTVF9HUk9VUCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHX1BBUkFNX0RFUFJFQ0FURUQpKTsKKyNlbmRpZgorICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01VTFRJQ0FTVF9JRkFDRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJtdWx0aWNhc3QtaWZhY2UiLCAiTXVsdGljYXN0IEludGVyZmFjZSIsCisgICAgICAgICAgIlRoZSBuZXR3b3JrIGludGVyZmFjZSBvbiB3aGljaCB0byBqb2luIHRoZSBtdWx0aWNhc3QgZ3JvdXAuIgorICAgICAgICAgICJUaGlzIGFsbG93cyBtdWx0aXBsZSBpbnRlcmZhY2VzIHNlcGVyYXRlZCBieSBjb21tYS4gKFwiZXRoMCxldGgxXCIpIiwKKyAgICAgICAgICBVRFBfREVGQVVMVF9NVUxUSUNBU1RfSUZBQ0UsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVVJJLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInVyaSIsICJVUkkiLAorICAgICAgICAgICJVUkkgaW4gdGhlIGZvcm0gb2YgdWRwOi8vbXVsdGljYXN0X2dyb3VwOnBvcnQiLCBVRFBfREVGQVVMVF9VUkksCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ0FQUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoImNhcHMiLCAiQ2FwcyIsCisgICAgICAgICAgIlRoZSBjYXBzIG9mIHRoZSBzb3VyY2UgcGFkIiwgR1NUX1RZUEVfQ0FQUywKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TT0NLRVQsCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgic29ja2V0IiwgIlNvY2tldCIsCisgICAgICAgICAgIlNvY2tldCB0byB1c2UgZm9yIFVEUCByZWNlcHRpb24uIChOVUxMID09IGFsbG9jYXRlKSIsCisgICAgICAgICAgR19UWVBFX1NPQ0tFVCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfQlVGRkVSX1NJWkUsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiYnVmZmVyLXNpemUiLCAiQnVmZmVyIFNpemUiLAorICAgICAgICAgICJTaXplIG9mIHRoZSBrZXJuZWwgcmVjZWl2ZSBidWZmZXIgaW4gYnl0ZXMsIDA9ZGVmYXVsdCIsIDAsIEdfTUFYSU5ULAorICAgICAgICAgIFVEUF9ERUZBVUxUX0JVRkZFUl9TSVpFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9USU1FT1VULAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoInRpbWVvdXQiLCAiVGltZW91dCIsCisgICAgICAgICAgIlBvc3QgYSBtZXNzYWdlIGFmdGVyIHRpbWVvdXQgbmFub3NlY29uZHMgKDAgPSBkaXNhYmxlZCkiLCAwLAorICAgICAgICAgIEdfTUFYVUlOVDY0LCBVRFBfREVGQVVMVF9USU1FT1VULAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLAorICAgICAgUFJPUF9TS0lQX0ZJUlNUX0JZVEVTLCBnX3BhcmFtX3NwZWNfaW50ICgic2tpcC1maXJzdC1ieXRlcyIsCisgICAgICAgICAgIlNraXAgZmlyc3QgYnl0ZXMiLCAibnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAgZm9yIGVhY2ggdWRwIHBhY2tldCIsIDAsCisgICAgICAgICAgR19NQVhJTlQsIFVEUF9ERUZBVUxUX1NLSVBfRklSU1RfQllURVMsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ0xPU0VfU09DS0VULAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJjbG9zZS1zb2NrZXQiLCAiQ2xvc2Ugc29ja2V0IiwKKyAgICAgICAgICAiQ2xvc2Ugc29ja2V0IGlmIHBhc3NlZCBhcyBwcm9wZXJ0eSBvbiBzdGF0ZSBjaGFuZ2UiLAorICAgICAgICAgIFVEUF9ERUZBVUxUX0NMT1NFX1NPQ0tFVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9VU0VEX1NPQ0tFVCwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJ1c2VkLXNvY2tldCIsICJTb2NrZXQgSGFuZGxlIiwKKyAgICAgICAgICAiU29ja2V0IGN1cnJlbnRseSBpbiB1c2UgZm9yIFVEUCByZWNlcHRpb24uIChOVUxMID0gbm8gc29ja2V0KSIsCisgICAgICAgICAgR19UWVBFX1NPQ0tFVCwgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9BVVRPX01VTFRJQ0FTVCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiYXV0by1tdWx0aWNhc3QiLCAiQXV0byBNdWx0aWNhc3QiLAorICAgICAgICAgICJBdXRvbWF0aWNhbGx5IGpvaW4vbGVhdmUgbXVsdGljYXN0IGdyb3VwcyIsCisgICAgICAgICAgVURQX0RFRkFVTFRfQVVUT19NVUxUSUNBU1QsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUkVVU0UsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInJldXNlIiwgIlJldXNlIiwgIkVuYWJsZSByZXVzZSBvZiB0aGUgcG9ydCIsCisgICAgICAgICAgVURQX0RFRkFVTFRfUkVVU0UsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0FERFJFU1MsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiYWRkcmVzcyIsICJBZGRyZXNzIiwKKyAgICAgICAgICAiQWRkcmVzcyB0byByZWNlaXZlIHBhY2tldHMgZm9yLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlICIKKyAgICAgICAgICAibXVsdGljYXN0LWdyb3VwIHByb3BlcnR5IGZvciBub3ciLCBVRFBfREVGQVVMVF9NVUxUSUNBU1RfR1JPVVAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RVRFBTcmM6Omxvb3A6CisgICAqCisgICAqIENhbiBiZSB1c2VkIHRvIGRpc2FibGUgbXVsdGljYXN0IGxvb3BiYWNrLgorICAgKgorICAgKiBTaW5jZTogMS44CisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0xPT1AsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoImxvb3AiLCAiTXVsdGljYXN0IExvb3BiYWNrIiwKKyAgICAgICAgICAiVXNlZCBmb3Igc2V0dGluZyB0aGUgbXVsdGljYXN0IGxvb3AgcGFyYW1ldGVyLiBUUlVFID0gZW5hYmxlLCIKKyAgICAgICAgICAiIEZBTFNFID0gZGlzYWJsZSIsIFVEUF9ERUZBVUxUX0xPT1AsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RVRFBTcmM6OnJldHJpZXZlLXNlbmRlci1hZGRyZXNzOgorICAgKgorICAgKiBXaGV0aGVyIHRvIHJldHJpZXZlIHRoZSBzZW5kZXIgYWRkcmVzcyBhbmQgYWRkIGl0IHRvIHRoZSBidWZmZXJzIGFzCisgICAqIG1ldGEuIERpc2FibGluZyB0aGlzIG1pZ2h0IHJlc3VsdCBpbiBtaW5vciBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMKKyAgICogaW4gY2VydGFpbiBzY2VuYXJpb3MuCisgICAqCisgICAqIFNpbmNlOiAxLjEwCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1JFVFJJRVZFX1NFTkRFUl9BRERSRVNTLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJyZXRyaWV2ZS1zZW5kZXItYWRkcmVzcyIsCisgICAgICAgICAgIlJldHJpZXZlIFNlbmRlciBBZGRyZXNzIiwKKyAgICAgICAgICAiV2hldGhlciB0byByZXRyaWV2ZSB0aGUgc2VuZGVyIGFkZHJlc3MgYW5kIGFkZCBpdCB0byBidWZmZXJzIGFzICIKKyAgICAgICAgICAibWV0YS4gRGlzYWJsaW5nIHRoaXMgbWlnaHQgcmVzdWx0IGluIG1pbm9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyAiCisgICAgICAgICAgImluIGNlcnRhaW4gc2NlbmFyaW9zIiwgVURQX0RFRkFVTFRfUkVUUklFVkVfU0VOREVSX0FERFJFU1MsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAiVURQIHBhY2tldCByZWNlaXZlciIsICJTb3VyY2UvTmV0d29yayIsCisgICAgICAiUmVjZWl2ZSBkYXRhIG92ZXIgdGhlIG5ldHdvcmsgdmlhIFVEUCIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4sICIKKyAgICAgICJUaGlqcyBWZXJtZWlyIDx0aGlqcy52ZXJtZWlyQGJhcmNvLmNvbT4iKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfdWRwc3JjX2NoYW5nZV9zdGF0ZTsKKworICBnc3RiYXNlc3JjX2NsYXNzLT51bmxvY2sgPSBnc3RfdWRwc3JjX3VubG9jazsKKyAgZ3N0YmFzZXNyY19jbGFzcy0+dW5sb2NrX3N0b3AgPSBnc3RfdWRwc3JjX3VubG9ja19zdG9wOworICBnc3RiYXNlc3JjX2NsYXNzLT5nZXRfY2FwcyA9IGdzdF91ZHBzcmNfZ2V0Y2FwczsKKyAgZ3N0YmFzZXNyY19jbGFzcy0+bmVnb3RpYXRlID0gZ3N0X3VkcHNyY19uZWdvdGlhdGU7CisKKyAgZ3N0cHVzaHNyY19jbGFzcy0+Y3JlYXRlID0gZ3N0X3VkcHNyY19jcmVhdGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdWRwc3JjX2luaXQgKEdzdFVEUFNyYyAqIHVkcHNyYykKK3sKKyAgdWRwc3JjLT51cmkgPQorICAgICAgZ19zdHJkdXBfcHJpbnRmICgidWRwOi8vJXM6JXUiLCBVRFBfREVGQVVMVF9NVUxUSUNBU1RfR1JPVVAsCisgICAgICBVRFBfREVGQVVMVF9QT1JUKTsKKworICB1ZHBzcmMtPmFkZHJlc3MgPSBnX3N0cmR1cCAoVURQX0RFRkFVTFRfTVVMVElDQVNUX0dST1VQKTsKKyAgdWRwc3JjLT5wb3J0ID0gVURQX0RFRkFVTFRfUE9SVDsKKyAgdWRwc3JjLT5zb2NrZXQgPSBVRFBfREVGQVVMVF9TT0NLRVQ7CisgIHVkcHNyYy0+bXVsdGlfaWZhY2UgPSBnX3N0cmR1cCAoVURQX0RFRkFVTFRfTVVMVElDQVNUX0lGQUNFKTsKKyAgdWRwc3JjLT5idWZmZXJfc2l6ZSA9IFVEUF9ERUZBVUxUX0JVRkZFUl9TSVpFOworICB1ZHBzcmMtPnRpbWVvdXQgPSBVRFBfREVGQVVMVF9USU1FT1VUOworICB1ZHBzcmMtPnNraXBfZmlyc3RfYnl0ZXMgPSBVRFBfREVGQVVMVF9TS0lQX0ZJUlNUX0JZVEVTOworICB1ZHBzcmMtPmNsb3NlX3NvY2tldCA9IFVEUF9ERUZBVUxUX0NMT1NFX1NPQ0tFVDsKKyAgdWRwc3JjLT5leHRlcm5hbF9zb2NrZXQgPSAodWRwc3JjLT5zb2NrZXQgIT0gTlVMTCk7CisgIHVkcHNyYy0+YXV0b19tdWx0aWNhc3QgPSBVRFBfREVGQVVMVF9BVVRPX01VTFRJQ0FTVDsKKyAgdWRwc3JjLT51c2VkX3NvY2tldCA9IFVEUF9ERUZBVUxUX1VTRURfU09DS0VUOworICB1ZHBzcmMtPnJldXNlID0gVURQX0RFRkFVTFRfUkVVU0U7CisgIHVkcHNyYy0+bG9vcCA9IFVEUF9ERUZBVUxUX0xPT1A7CisgIHVkcHNyYy0+cmV0cmlldmVfc2VuZGVyX2FkZHJlc3MgPSBVRFBfREVGQVVMVF9SRVRSSUVWRV9TRU5ERVJfQUREUkVTUzsKKworICAvKiBjb25maWd1cmUgYmFzZXNyYyB0byBiZSBhIGxpdmUgc291cmNlICovCisgIGdzdF9iYXNlX3NyY19zZXRfbGl2ZSAoR1NUX0JBU0VfU1JDICh1ZHBzcmMpLCBUUlVFKTsKKyAgLyogbWFrZSBiYXNlc3JjIG91dHB1dCBhIHNlZ21lbnQgaW4gdGltZSAqLworICBnc3RfYmFzZV9zcmNfc2V0X2Zvcm1hdCAoR1NUX0JBU0VfU1JDICh1ZHBzcmMpLCBHU1RfRk9STUFUX1RJTUUpOworICAvKiBtYWtlIGJhc2VzcmMgc2V0IHRpbWVzdGFtcHMgb24gb3V0Z29pbmcgYnVmZmVycyBiYXNlZCBvbiB0aGUgcnVubmluZ190aW1lCisgICAqIHdoZW4gdGhleSB3ZXJlIGNhcHR1cmVkICovCisgIGdzdF9iYXNlX3NyY19zZXRfZG9fdGltZXN0YW1wIChHU1RfQkFTRV9TUkMgKHVkcHNyYyksIFRSVUUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3VkcHNyY19maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0VURQU3JjICp1ZHBzcmM7CisKKyAgdWRwc3JjID0gR1NUX1VEUFNSQyAob2JqZWN0KTsKKworICBpZiAodWRwc3JjLT5jYXBzKQorICAgIGdzdF9jYXBzX3VucmVmICh1ZHBzcmMtPmNhcHMpOworICB1ZHBzcmMtPmNhcHMgPSBOVUxMOworCisgIGdfZnJlZSAodWRwc3JjLT5tdWx0aV9pZmFjZSk7CisgIHVkcHNyYy0+bXVsdGlfaWZhY2UgPSBOVUxMOworCisgIGdfZnJlZSAodWRwc3JjLT51cmkpOworICB1ZHBzcmMtPnVyaSA9IE5VTEw7CisKKyAgZ19mcmVlICh1ZHBzcmMtPmFkZHJlc3MpOworICB1ZHBzcmMtPmFkZHJlc3MgPSBOVUxMOworCisgIGlmICh1ZHBzcmMtPnNvY2tldCkKKyAgICBnX29iamVjdF91bnJlZiAodWRwc3JjLT5zb2NrZXQpOworICB1ZHBzcmMtPnNvY2tldCA9IE5VTEw7CisKKyAgaWYgKHVkcHNyYy0+dXNlZF9zb2NrZXQpCisgICAgZ19vYmplY3RfdW5yZWYgKHVkcHNyYy0+dXNlZF9zb2NrZXQpOworICB1ZHBzcmMtPnVzZWRfc29ja2V0ID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF91ZHBzcmNfZ2V0Y2FwcyAoR3N0QmFzZVNyYyAqIHNyYywgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0VURQU3JjICp1ZHBzcmM7CisgIEdzdENhcHMgKmNhcHMsICpyZXN1bHQ7CisKKyAgdWRwc3JjID0gR1NUX1VEUFNSQyAoc3JjKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHNyYyk7CisgIGlmICgoY2FwcyA9IHVkcHNyYy0+Y2FwcykpCisgICAgZ3N0X2NhcHNfcmVmIChjYXBzKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisKKyAgaWYgKGNhcHMpIHsKKyAgICBpZiAoZmlsdGVyKSB7CisgICAgICByZXN1bHQgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCBjYXBzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPSBjYXBzOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSAoZmlsdGVyKSA/IGdzdF9jYXBzX3JlZiAoZmlsdGVyKSA6IGdzdF9jYXBzX25ld19hbnkgKCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2dzdF91ZHBzcmNfcmVzZXRfbWVtb3J5X2FsbG9jYXRvciAoR3N0VURQU3JjICogc3JjKQoreworICBpZiAoc3JjLT5tZW0gIT0gTlVMTCkgeworICAgIGdzdF9tZW1vcnlfdW5tYXAgKHNyYy0+bWVtLCAmc3JjLT5tYXApOworICAgIGdzdF9tZW1vcnlfdW5yZWYgKHNyYy0+bWVtKTsKKyAgICBzcmMtPm1lbSA9IE5VTEw7CisgIH0KKyAgaWYgKHNyYy0+bWVtX21heCAhPSBOVUxMKSB7CisgICAgZ3N0X21lbW9yeV91bm1hcCAoc3JjLT5tZW1fbWF4LCAmc3JjLT5tYXBfbWF4KTsKKyAgICBnc3RfbWVtb3J5X3VucmVmIChzcmMtPm1lbV9tYXgpOworICAgIHNyYy0+bWVtX21heCA9IE5VTEw7CisgIH0KKworICBzcmMtPnZlY1swXS5idWZmZXIgPSBOVUxMOworICBzcmMtPnZlY1swXS5zaXplID0gMDsKKyAgc3JjLT52ZWNbMV0uYnVmZmVyID0gTlVMTDsKKyAgc3JjLT52ZWNbMV0uc2l6ZSA9IDA7CisKKyAgaWYgKHNyYy0+YWxsb2NhdG9yICE9IE5VTEwpIHsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzcmMtPmFsbG9jYXRvcik7CisgICAgc3JjLT5hbGxvY2F0b3IgPSBOVUxMOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3VkcHNyY19uZWdvdGlhdGUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKQoreworICBHc3RVRFBTcmMgKnNyYyA9IEdTVF9VRFBTUkNfQ0FTVCAoYmFzZXNyYyk7CisgIGdib29sZWFuIHJldDsKKworICAvKiBqdXN0IGNoYWluIHVwIHRvIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLCB3ZSBqdXN0IHdhbnQgdG8KKyAgICogcmV0cmlldmUgdGhlIGFsbG9jYXRvciBhdCB0aGUgZW5kIG9mIGl0IChpZiB0aGVyZSBpcyBvbmUpICovCisgIHJldCA9IEdTVF9CQVNFX1NSQ19DTEFTUyAocGFyZW50X2NsYXNzKS0+bmVnb3RpYXRlIChiYXNlc3JjKTsKKworICBpZiAocmV0KSB7CisgICAgR3N0QWxsb2NhdGlvblBhcmFtcyBuZXdfcGFyYW1zOworICAgIEdzdEFsbG9jYXRvciAqbmV3X2FsbG9jYXRvciA9IE5VTEw7CisKKyAgICAvKiByZXRyaWV2ZSBuZXcgYWxsb2NhdG9yICovCisgICAgZ3N0X2Jhc2Vfc3JjX2dldF9hbGxvY2F0b3IgKGJhc2VzcmMsICZuZXdfYWxsb2NhdG9yLCAmbmV3X3BhcmFtcyk7CisKKyAgICBpZiAoc3JjLT5hbGxvY2F0b3IgIT0gbmV3X2FsbG9jYXRvciB8fAorICAgICAgICBtZW1jbXAgKCZzcmMtPnBhcmFtcywgJm5ld19wYXJhbXMsIHNpemVvZiAoR3N0QWxsb2NhdGlvblBhcmFtcykpICE9IDApIHsKKyAgICAgIC8qIGRyb3Agb2xkIGFsbG9jYXRvciBhbmQgdGhyb3cgYXdheSBhbnkgbWVtb3J5IGFsbG9jYXRlZCB3aXRoIGl0ICovCisgICAgICBnc3RfdWRwc3JjX3Jlc2V0X21lbW9yeV9hbGxvY2F0b3IgKHNyYyk7CisKKyAgICAgIC8qIGFuZCBzYXZlIHRoZSBuZXcgYWxsb2NhdG9yIGFuZC9vciBuZXcgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzICovCisgICAgICBzcmMtPmFsbG9jYXRvciA9IG5ld19hbGxvY2F0b3I7CisgICAgICBzcmMtPnBhcmFtcyA9IG5ld19wYXJhbXM7CisKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoc3JjLCAibmV3IGFsbG9jYXRvcjogJSIgR1NUX1BUUl9GT1JNQVQsIG5ld19hbGxvY2F0b3IpOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3VkcHNyY19hbGxvY19tZW0gKEdzdFVEUFNyYyAqIHNyYywgR3N0TWVtb3J5ICoqIHBfbWVtLCBHc3RNYXBJbmZvICogbWFwLAorICAgIGdzaXplIHNpemUpCit7CisgIEdzdE1lbW9yeSAqbWVtOworCisgIG1lbSA9IGdzdF9hbGxvY2F0b3JfYWxsb2MgKHNyYy0+YWxsb2NhdG9yLCBzaXplLCAmc3JjLT5wYXJhbXMpOworCisgIGlmICghZ3N0X21lbW9yeV9tYXAgKG1lbSwgbWFwLCBHU1RfTUFQX1dSSVRFKSkgeworICAgIGdzdF9tZW1vcnlfdW5yZWYgKG1lbSk7CisgICAgbWVtc2V0IChtYXAsIDAsIHNpemVvZiAoR3N0TWFwSW5mbykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICAqcF9tZW0gPSBtZW07CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF91ZHBzcmNfZW5zdXJlX21lbSAoR3N0VURQU3JjICogc3JjKQoreworICBpZiAoc3JjLT5tZW0gPT0gTlVMTCkgeworICAgIGdzaXplIG1lbV9zaXplID0gMTUwMDsgICAgICAvKiB0eXBpY2FsIG1heC4gTVRVICovCisKKyAgICAvKiBpZiBwYWNrZXRzIGFyZSBsaWtlbHkgdG8gYmUgc21hbGxlciwganVzdCB1c2UgdGhhdCBzaXplLCBvdGhlcndpc2UKKyAgICAgKiBkZWZhdWx0IHRvIGFzc3VtaW5nIGluY29taW5nIHBhY2tldHMgYXJlIGFyb3VuZCBNVFUgc2l6ZSAqLworICAgIGlmIChzcmMtPm1heF9zaXplID4gMCAmJiBzcmMtPm1heF9zaXplIDwgbWVtX3NpemUpCisgICAgICBtZW1fc2l6ZSA9IHNyYy0+bWF4X3NpemU7CisKKyAgICBpZiAoIWdzdF91ZHBzcmNfYWxsb2NfbWVtIChzcmMsICZzcmMtPm1lbSwgJnNyYy0+bWFwLCBtZW1fc2l6ZSkpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBzcmMtPnZlY1swXS5idWZmZXIgPSBzcmMtPm1hcC5kYXRhOworICAgIHNyYy0+dmVjWzBdLnNpemUgPSBzcmMtPm1hcC5zaXplOworICB9CisKKyAgaWYgKHNyYy0+bWVtX21heCA9PSBOVUxMKSB7CisgICAgZ3NpemUgbWF4X3NpemUgPSBNQVhfSVBWNF9VRFBfUEFDS0VUX1NJWkU7CisKKyAgICBpZiAoIWdzdF91ZHBzcmNfYWxsb2NfbWVtIChzcmMsICZzcmMtPm1lbV9tYXgsICZzcmMtPm1hcF9tYXgsIG1heF9zaXplKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHNyYy0+dmVjWzFdLmJ1ZmZlciA9IHNyYy0+bWFwX21heC5kYXRhOworICAgIHNyYy0+dmVjWzFdLnNpemUgPSBzcmMtPm1hcF9tYXguc2l6ZTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3VkcHNyY19jcmVhdGVfY2FuY2VsbGFibGUgKEdzdFVEUFNyYyAqIHNyYykKK3sKKyAgR1BvbGxGRCBwb2xsZmQ7CisKKyAgc3JjLT5jYW5jZWxsYWJsZSA9IGdfY2FuY2VsbGFibGVfbmV3ICgpOworICBzcmMtPm1hZGVfY2FuY2VsX2ZkID0gZ19jYW5jZWxsYWJsZV9tYWtlX3BvbGxmZCAoc3JjLT5jYW5jZWxsYWJsZSwgJnBvbGxmZCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdWRwc3JjX2ZyZWVfY2FuY2VsbGFibGUgKEdzdFVEUFNyYyAqIHNyYykKK3sKKyAgaWYgKHNyYy0+bWFkZV9jYW5jZWxfZmQpIHsKKyAgICBnX2NhbmNlbGxhYmxlX3JlbGVhc2VfZmQgKHNyYy0+Y2FuY2VsbGFibGUpOworICAgIHNyYy0+bWFkZV9jYW5jZWxfZmQgPSBGQUxTRTsKKyAgfQorICBnX29iamVjdF91bnJlZiAoc3JjLT5jYW5jZWxsYWJsZSk7CisgIHNyYy0+Y2FuY2VsbGFibGUgPSBOVUxMOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3VkcHNyY19jcmVhdGUgKEdzdFB1c2hTcmMgKiBwc3JjLCBHc3RCdWZmZXIgKiogYnVmKQoreworICBHc3RVRFBTcmMgKnVkcHNyYzsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBHU29ja2V0QWRkcmVzcyAqc2FkZHIgPSBOVUxMOworICBHU29ja2V0QWRkcmVzcyAqKnBfc2FkZHI7CisgIGdpbnQgZmxhZ3MgPSBHX1NPQ0tFVF9NU0dfTk9ORTsKKyAgZ2Jvb2xlYW4gdHJ5X2FnYWluOworICBHRXJyb3IgKmVyciA9IE5VTEw7CisgIGdzc2l6ZSByZXM7CisgIGdzaXplIG9mZnNldDsKKyAgR1NvY2tldENvbnRyb2xNZXNzYWdlICoqbXNncyA9IE5VTEw7CisgIEdTb2NrZXRDb250cm9sTWVzc2FnZSAqKipwX21zZ3M7CisgIGdpbnQgbl9tc2dzID0gMCwgaTsKKworICB1ZHBzcmMgPSBHU1RfVURQU1JDX0NBU1QgKHBzcmMpOworCisgIGlmICghZ3N0X3VkcHNyY19lbnN1cmVfbWVtICh1ZHBzcmMpKQorICAgIGdvdG8gbWVtb3J5X2FsbG9jX2Vycm9yOworCisgIC8qIG9wdGltaXphdGlvbjogdXNlIG1lc3NhZ2VzIG9ubHkgaW4gbXVsdGljYXN0IG1vZGUgYW5kCisgICAqIGlmIHdlIGNhbid0IGxldCB0aGUga2VybmVsIGRvIHRoZSBmaWx0ZXJpbmcgZm9yIHVzICovCisgIHBfbXNncyA9CisgICAgICAoZ19pbmV0X2FkZHJlc3NfZ2V0X2lzX211bHRpY2FzdCAoZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9hZGRyZXNzCisgICAgICAgICAgKHVkcHNyYy0+YWRkcikpKSA/ICZtc2dzIDogTlVMTDsKKyNpZmRlZiBJUF9NVUxUSUNBU1RfQUxMCisgIGlmIChnX2luZXRfYWRkcmVzc19nZXRfZmFtaWx5IChnX2luZXRfc29ja2V0X2FkZHJlc3NfZ2V0X2FkZHJlc3MKKyAgICAgICAgICAodWRwc3JjLT5hZGRyKSkgPT0gR19TT0NLRVRfRkFNSUxZX0lQVjQpCisgICAgcF9tc2dzID0gTlVMTDsKKyNlbmRpZgorCisgIC8qIFJldHJpZXZlIHNlbmRlciBhZGRyZXNzIHVubGVzcyB3ZSd2ZSBiZWVuIGNvbmZpZ3VyZWQgbm90IHRvIGRvIHNvICovCisgIHBfc2FkZHIgPSAodWRwc3JjLT5yZXRyaWV2ZV9zZW5kZXJfYWRkcmVzcykgPyAmc2FkZHIgOiBOVUxMOworCityZXRyeToKKyAgaWYgKHNhZGRyICE9IE5VTEwpIHsKKyAgICBnX29iamVjdF91bnJlZiAoc2FkZHIpOworICAgIHNhZGRyID0gTlVMTDsKKyAgfQorCisgIGRvIHsKKyAgICBnaW50NjQgdGltZW91dDsKKworICAgIHRyeV9hZ2FpbiA9IEZBTFNFOworCisgICAgaWYgKHVkcHNyYy0+dGltZW91dCkKKyAgICAgIHRpbWVvdXQgPSB1ZHBzcmMtPnRpbWVvdXQgLyAxMDAwOworICAgIGVsc2UKKyAgICAgIHRpbWVvdXQgPSAtMTsKKworICAgIEdTVF9MT0dfT0JKRUNUICh1ZHBzcmMsICJkb2luZyBzZWxlY3QsIHRpbWVvdXQgJSIgR19HSU5UNjRfRk9STUFULCB0aW1lb3V0KTsKKworICAgIGlmICghZ19zb2NrZXRfY29uZGl0aW9uX3RpbWVkX3dhaXQgKHVkcHNyYy0+dXNlZF9zb2NrZXQsIEdfSU9fSU4gfCBHX0lPX1BSSSwKKyAgICAgICAgICAgIHRpbWVvdXQsIHVkcHNyYy0+Y2FuY2VsbGFibGUsICZlcnIpKSB7CisgICAgICBpZiAoZ19lcnJvcl9tYXRjaGVzIChlcnIsIEdfSU9fRVJST1IsIEdfSU9fRVJST1JfQlVTWSkKKyAgICAgICAgICB8fCBnX2Vycm9yX21hdGNoZXMgKGVyciwgR19JT19FUlJPUiwgR19JT19FUlJPUl9DQU5DRUxMRUQpKSB7CisgICAgICAgIGdvdG8gc3RvcHBlZDsKKyAgICAgIH0gZWxzZSBpZiAoZ19lcnJvcl9tYXRjaGVzIChlcnIsIEdfSU9fRVJST1IsIEdfSU9fRVJST1JfVElNRURfT1VUKSkgeworICAgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICAgICAgLyogdGltZW91dCwgcG9zdCBlbGVtZW50IG1lc3NhZ2UgKi8KKyAgICAgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUICh1ZHBzcmMpLAorICAgICAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X2VsZW1lbnQgKEdTVF9PQkpFQ1RfQ0FTVCAodWRwc3JjKSwKKyAgICAgICAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoIkdzdFVEUFNyY1RpbWVvdXQiLAorICAgICAgICAgICAgICAgICAgICAidGltZW91dCIsIEdfVFlQRV9VSU5UNjQsIHVkcHNyYy0+dGltZW91dCwgTlVMTCkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdvdG8gc2VsZWN0X2Vycm9yOworICAgICAgfQorCisgICAgICB0cnlfYWdhaW4gPSBUUlVFOworICAgIH0KKyAgfSB3aGlsZSAoR19VTkxJS0VMWSAodHJ5X2FnYWluKSk7CisKKyAgcmVzID0KKyAgICAgIGdfc29ja2V0X3JlY2VpdmVfbWVzc2FnZSAodWRwc3JjLT51c2VkX3NvY2tldCwgcF9zYWRkciwgdWRwc3JjLT52ZWMsIDIsCisgICAgICBwX21zZ3MsICZuX21zZ3MsICZmbGFncywgdWRwc3JjLT5jYW5jZWxsYWJsZSwgJmVycik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHJlcyA8IDApKSB7CisgICAgLyogR19JT19FUlJPUl9IT1NUX1VOUkVBQ0hBQkxFIGZvciBhIFVEUCBzb2NrZXQgbWVhbnMgdGhhdCBhIHBhY2tldCBzZW50CisgICAgICogd2l0aCB1ZHBzaW5rIGdlbmVyYXRlZCBhICJwb3J0IHVucmVhY2hhYmxlIiBJQ01QIHJlc3BvbnNlLiBXZSBpZ25vcmUKKyAgICAgKiB0aGF0IGFuZCB0cnkgYWdhaW4uCisgICAgICogT24gV2luZG93cyB3ZSBnZXQgR19JT19FUlJPUl9DT05ORUNUSU9OX0NMT1NFRCBpbnN0ZWFkICovCisjaWYgR0xJQl9DSEVDS19WRVJTSU9OKDIsNDQsMCkKKyAgICBpZiAoZ19lcnJvcl9tYXRjaGVzIChlcnIsIEdfSU9fRVJST1IsIEdfSU9fRVJST1JfSE9TVF9VTlJFQUNIQUJMRSkgfHwKKyAgICAgICAgZ19lcnJvcl9tYXRjaGVzIChlcnIsIEdfSU9fRVJST1IsIEdfSU9fRVJST1JfQ09OTkVDVElPTl9DTE9TRUQpKSB7CisjZWxzZQorICAgIGlmIChnX2Vycm9yX21hdGNoZXMgKGVyciwgR19JT19FUlJPUiwgR19JT19FUlJPUl9IT1NUX1VOUkVBQ0hBQkxFKSkgeworI2VuZGlmCisgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIGdvdG8gcmVjZWl2ZV9lcnJvcjsKKyAgfQorCisgIC8qIHJlbWVtYmVyIG1heGltdW0gcGFja2V0IHNpemUgKi8KKyAgaWYgKHJlcyA+IHVkcHNyYy0+bWF4X3NpemUpCisgICAgdWRwc3JjLT5tYXhfc2l6ZSA9IHJlczsKKworICAvKiBSZXRyeSBpZiBtdWx0aWNhc3QgYW5kIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIG5vdCBvdXJzLiBXZSBkb24ndCB3YW50CisgICAqIHRvIHJlY2VpdmUgYXJiaXRyYXJ5IHBhY2tldHMgKi8KKyAgaWYgKHBfbXNncykgeworICAgIEdJbmV0QWRkcmVzcyAqaWFkZHIgPSBnX2luZXRfc29ja2V0X2FkZHJlc3NfZ2V0X2FkZHJlc3MgKHVkcHNyYy0+YWRkcik7CisgICAgZ2Jvb2xlYW4gc2tpcF9wYWNrZXQgPSBGQUxTRTsKKyAgICBnc2l6ZSBpYWRkcl9zaXplID0gZ19pbmV0X2FkZHJlc3NfZ2V0X25hdGl2ZV9zaXplIChpYWRkcik7CisgICAgY29uc3QgZ3VpbnQ4ICppYWRkcl9ieXRlcyA9IGdfaW5ldF9hZGRyZXNzX3RvX2J5dGVzIChpYWRkcik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbl9tc2dzICYmICFza2lwX3BhY2tldDsgaSsrKSB7CisjaWZkZWYgSVBfUEtUSU5GTworICAgICAgaWYgKEdTVF9JU19JUF9QS1RJTkZPX01FU1NBR0UgKG1zZ3NbaV0pKSB7CisgICAgICAgIEdzdElQUGt0aW5mb01lc3NhZ2UgKm1zZyA9IEdTVF9JUF9QS1RJTkZPX01FU1NBR0UgKG1zZ3NbaV0pOworCisgICAgICAgIGlmIChzaXplb2YgKG1zZy0+YWRkcikgPT0gaWFkZHJfc2l6ZQorICAgICAgICAgICAgJiYgbWVtY21wIChpYWRkcl9ieXRlcywgJm1zZy0+YWRkciwgc2l6ZW9mIChtc2ctPmFkZHIpKSkKKyAgICAgICAgICBza2lwX3BhY2tldCA9IFRSVUU7CisgICAgICB9CisjZW5kaWYKKyNpZmRlZiBJUFY2X1BLVElORk8KKyAgICAgIGlmIChHU1RfSVNfSVBWNl9QS1RJTkZPX01FU1NBR0UgKG1zZ3NbaV0pKSB7CisgICAgICAgIEdzdElQVjZQa3RpbmZvTWVzc2FnZSAqbXNnID0gR1NUX0lQVjZfUEtUSU5GT19NRVNTQUdFIChtc2dzW2ldKTsKKworICAgICAgICBpZiAoc2l6ZW9mIChtc2ctPmFkZHIpID09IGlhZGRyX3NpemUKKyAgICAgICAgICAgICYmIG1lbWNtcCAoaWFkZHJfYnl0ZXMsICZtc2ctPmFkZHIsIHNpemVvZiAobXNnLT5hZGRyKSkpCisgICAgICAgICAgc2tpcF9wYWNrZXQgPSBUUlVFOworICAgICAgfQorI2VuZGlmCisjaWZkZWYgSVBfUkVDVkRTVEFERFIKKyAgICAgIGlmIChHU1RfSVNfSVBfUkVDVkRTVEFERFJfTUVTU0FHRSAobXNnc1tpXSkpIHsKKyAgICAgICAgR3N0SVBSZWN2ZHN0YWRkck1lc3NhZ2UgKm1zZyA9IEdTVF9JUF9SRUNWRFNUQUREUl9NRVNTQUdFIChtc2dzW2ldKTsKKworICAgICAgICBpZiAoc2l6ZW9mIChtc2ctPmFkZHIpID09IGlhZGRyX3NpemUKKyAgICAgICAgICAgICYmIG1lbWNtcCAoaWFkZHJfYnl0ZXMsICZtc2ctPmFkZHIsIHNpemVvZiAobXNnLT5hZGRyKSkpCisgICAgICAgICAgc2tpcF9wYWNrZXQgPSBUUlVFOworICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG5fbXNnczsgaSsrKSB7CisgICAgICBnX29iamVjdF91bnJlZiAobXNnc1tpXSk7CisgICAgfQorICAgIGdfZnJlZSAobXNncyk7CisKKyAgICBpZiAoc2tpcF9wYWNrZXQpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHVkcHNyYywKKyAgICAgICAgICAiRHJvcHBpbmcgcGFja2V0IGZvciBhIGRpZmZlcmVudCBtdWx0aWNhc3QgYWRkcmVzcyIpOworICAgICAgZ290byByZXRyeTsKKyAgICB9CisgIH0KKworICBvdXRidWYgPSBnc3RfYnVmZmVyX25ldyAoKTsKKworICAvKiBhcHBlbmQgZmlyc3QgbWVtb3J5IGNodW5rIHRvIGJ1ZmZlciAqLworICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKG91dGJ1ZiwgdWRwc3JjLT5tZW0pOworCisgIC8qIGlmIHRoZSBwYWNrZXQgZGlkbid0IGZpdCBpbnRvIHRoZSBmaXJzdCBjaHVuaywgYWRkIHNlY29uZCBvbmUgYXMgd2VsbCAqLworICBpZiAocmVzID4gdWRwc3JjLT5tYXAuc2l6ZSkgeworICAgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAob3V0YnVmLCB1ZHBzcmMtPm1lbV9tYXgpOworICAgIGdzdF9tZW1vcnlfdW5tYXAgKHVkcHNyYy0+bWVtX21heCwgJnVkcHNyYy0+bWFwX21heCk7CisgICAgdWRwc3JjLT52ZWNbMV0uYnVmZmVyID0gTlVMTDsKKyAgICB1ZHBzcmMtPnZlY1sxXS5zaXplID0gMDsKKyAgICB1ZHBzcmMtPm1lbV9tYXggPSBOVUxMOworICB9CisKKyAgLyogbWFrZSBzdXJlIHdlIGFsbG9jYXRlIGEgbmV3IGNodW5rIG5leHQgdGltZSAod2UgZG8gdGhpcyBvbmx5IGhlcmUgYmVjYXVzZQorICAgKiB3ZSBsb29rIGF0IG1hcC5zaXplIHRvIHNlZSBpZiB0aGUgc2Vjb25kIG1lbW9yeSBjaHVuayBpcyBuZWVkZWQgYWJvdmUpICovCisgIGdzdF9tZW1vcnlfdW5tYXAgKHVkcHNyYy0+bWVtLCAmdWRwc3JjLT5tYXApOworICB1ZHBzcmMtPnZlY1swXS5idWZmZXIgPSBOVUxMOworICB1ZHBzcmMtPnZlY1swXS5zaXplID0gMDsKKyAgdWRwc3JjLT5tZW0gPSBOVUxMOworCisgIG9mZnNldCA9IHVkcHNyYy0+c2tpcF9maXJzdF9ieXRlczsKKworICBpZiAoR19VTkxJS0VMWSAob2Zmc2V0ID4gMCAmJiByZXMgPCBvZmZzZXQpKQorICAgIGdvdG8gc2tpcF9lcnJvcjsKKworICBnc3RfYnVmZmVyX3Jlc2l6ZSAob3V0YnVmLCBvZmZzZXQsIHJlcyAtIG9mZnNldCk7CisKKyAgLyogdXNlIGJ1ZmZlciBtZXRhZGF0YSBzbyByZWNlaXZlcnMgY2FuIGFsc28gdHJhY2sgdGhlIGFkZHJlc3MgKi8KKyAgaWYgKHNhZGRyKSB7CisgICAgZ3N0X2J1ZmZlcl9hZGRfbmV0X2FkZHJlc3NfbWV0YSAob3V0YnVmLCBzYWRkcik7CisgICAgZ19vYmplY3RfdW5yZWYgKHNhZGRyKTsKKyAgICBzYWRkciA9IE5VTEw7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAodWRwc3JjLCAicmVhZCBwYWNrZXQgb2YgJWQgYnl0ZXMiLCAoaW50KSByZXMpOworCisgICpidWYgPSBHU1RfQlVGRkVSX0NBU1QgKG91dGJ1Zik7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIC8qIEVSUk9SUyAqLworbWVtb3J5X2FsbG9jX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHVkcHNyYywgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICAgKCJGYWlsZWQgdG8gYWxsb2NhdGUgb3IgbWFwIG1lbW9yeSIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3NlbGVjdF9lcnJvcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh1ZHBzcmMsIFJFU09VUkNFLCBSRUFELCAoTlVMTCksCisgICAgICAgICgic2VsZWN0IGVycm9yOiAlcyIsIGVyci0+bWVzc2FnZSkpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorc3RvcHBlZDoKKyAgeworICAgIEdTVF9ERUJVRyAoInN0b3AgY2FsbGVkIik7CisgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICB9CityZWNlaXZlX2Vycm9yOgorICB7CisgICAgaWYgKGdfZXJyb3JfbWF0Y2hlcyAoZXJyLCBHX0lPX0VSUk9SLCBHX0lPX0VSUk9SX0JVU1kpIHx8CisgICAgICAgIGdfZXJyb3JfbWF0Y2hlcyAoZXJyLCBHX0lPX0VSUk9SLCBHX0lPX0VSUk9SX0NBTkNFTExFRCkpIHsKKyAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAodWRwc3JjLCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgICAgICgicmVjZWl2ZSBlcnJvciAlIiBHX0dTU0laRV9GT1JNQVQgIjogJXMiLCByZXMsIGVyci0+bWVzc2FnZSkpOworICAgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgICAgfQorICB9Citza2lwX2Vycm9yOgorICB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmKTsKKworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh1ZHBzcmMsIFNUUkVBTSwgREVDT0RFLCAoTlVMTCksCisgICAgICAgICgiVURQIGJ1ZmZlciB0byBzbWFsbCB0byBza2lwIGhlYWRlciIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdWRwc3JjX3NldF91cmkgKEdzdFVEUFNyYyAqIHNyYywgY29uc3QgZ2NoYXIgKiB1cmksIEdFcnJvciAqKiBlcnJvcikKK3sKKyAgZ2NoYXIgKmFkZHJlc3M7CisgIGd1aW50MTYgcG9ydDsKKworICBpZiAoIWdzdF91ZHBfcGFyc2VfdXJpICh1cmksICZhZGRyZXNzLCAmcG9ydCkpCisgICAgZ290byB3cm9uZ191cmk7CisKKyAgaWYgKHBvcnQgPT0gKGd1aW50MTYpIC0gMSkKKyAgICBwb3J0ID0gVURQX0RFRkFVTFRfUE9SVDsKKworICBnX2ZyZWUgKHNyYy0+YWRkcmVzcyk7CisgIHNyYy0+YWRkcmVzcyA9IGFkZHJlc3M7CisgIHNyYy0+cG9ydCA9IHBvcnQ7CisKKyAgZ19mcmVlIChzcmMtPnVyaSk7CisgIHNyYy0+dXJpID0gZ19zdHJkdXAgKHVyaSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCit3cm9uZ191cmk6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgUkVBRCwgKE5VTEwpLAorICAgICAgICAoImVycm9yIHBhcnNpbmcgdXJpICVzIiwgdXJpKSk7CisgICAgZ19zZXRfZXJyb3JfbGl0ZXJhbCAoZXJyb3IsIEdTVF9VUklfRVJST1IsIEdTVF9VUklfRVJST1JfQkFEX1VSSSwKKyAgICAgICAgIkNvdWxkIG5vdCBwYXJzZSBVRFAgVVJJIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdWRwc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RVRFBTcmMgKnVkcHNyYyA9IEdTVF9VRFBTUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0JVRkZFUl9TSVpFOgorICAgICAgdWRwc3JjLT5idWZmZXJfc2l6ZSA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BPUlQ6CisgICAgICB1ZHBzcmMtPnBvcnQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGdfZnJlZSAodWRwc3JjLT51cmkpOworICAgICAgdWRwc3JjLT51cmkgPQorICAgICAgICAgIGdfc3RyZHVwX3ByaW50ZiAoInVkcDovLyVzOiV1IiwgdWRwc3JjLT5hZGRyZXNzLCB1ZHBzcmMtPnBvcnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01VTFRJQ0FTVF9HUk9VUDoKKyAgICBjYXNlIFBST1BfQUREUkVTUzoKKyAgICB7CisgICAgICBjb25zdCBnY2hhciAqZ3JvdXA7CisKKyAgICAgIGdfZnJlZSAodWRwc3JjLT5hZGRyZXNzKTsKKyAgICAgIGlmICgoZ3JvdXAgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSkpCisgICAgICAgIHVkcHNyYy0+YWRkcmVzcyA9IGdfc3RyZHVwIChncm91cCk7CisgICAgICBlbHNlCisgICAgICAgIHVkcHNyYy0+YWRkcmVzcyA9IGdfc3RyZHVwIChVRFBfREVGQVVMVF9NVUxUSUNBU1RfR1JPVVApOworCisgICAgICBnX2ZyZWUgKHVkcHNyYy0+dXJpKTsKKyAgICAgIHVkcHNyYy0+dXJpID0KKyAgICAgICAgICBnX3N0cmR1cF9wcmludGYgKCJ1ZHA6Ly8lczoldSIsIHVkcHNyYy0+YWRkcmVzcywgdWRwc3JjLT5wb3J0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfTVVMVElDQVNUX0lGQUNFOgorICAgICAgZ19mcmVlICh1ZHBzcmMtPm11bHRpX2lmYWNlKTsKKworICAgICAgaWYgKGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpID09IE5VTEwpCisgICAgICAgIHVkcHNyYy0+bXVsdGlfaWZhY2UgPSBnX3N0cmR1cCAoVURQX0RFRkFVTFRfTVVMVElDQVNUX0lGQUNFKTsKKyAgICAgIGVsc2UKKyAgICAgICAgdWRwc3JjLT5tdWx0aV9pZmFjZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1VSSToKKyAgICAgIGdzdF91ZHBzcmNfc2V0X3VyaSAodWRwc3JjLCBnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0FQUzoKKyAgICB7CisgICAgICBjb25zdCBHc3RDYXBzICpuZXdfY2Fwc192YWwgPSBnc3RfdmFsdWVfZ2V0X2NhcHMgKHZhbHVlKTsKKyAgICAgIEdzdENhcHMgKm5ld19jYXBzOworICAgICAgR3N0Q2FwcyAqb2xkX2NhcHM7CisKKyAgICAgIGlmIChuZXdfY2Fwc192YWwgPT0gTlVMTCkgeworICAgICAgICBuZXdfY2FwcyA9IGdzdF9jYXBzX25ld19hbnkgKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBuZXdfY2FwcyA9IGdzdF9jYXBzX2NvcHkgKG5ld19jYXBzX3ZhbCk7CisgICAgICB9CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAodWRwc3JjKTsKKyAgICAgIG9sZF9jYXBzID0gdWRwc3JjLT5jYXBzOworICAgICAgdWRwc3JjLT5jYXBzID0gbmV3X2NhcHM7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAodWRwc3JjKTsKKyAgICAgIGlmIChvbGRfY2FwcykKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKG9sZF9jYXBzKTsKKworICAgICAgZ3N0X3BhZF9tYXJrX3JlY29uZmlndXJlIChHU1RfQkFTRV9TUkNfUEFEICh1ZHBzcmMpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfU09DS0VUOgorICAgICAgaWYgKHVkcHNyYy0+c29ja2V0ICE9IE5VTEwgJiYgdWRwc3JjLT5zb2NrZXQgIT0gdWRwc3JjLT51c2VkX3NvY2tldCAmJgorICAgICAgICAgIHVkcHNyYy0+Y2xvc2Vfc29ja2V0KSB7CisgICAgICAgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICAgICAgICBpZiAoIWdfc29ja2V0X2Nsb3NlICh1ZHBzcmMtPnNvY2tldCwgJmVycikpIHsKKyAgICAgICAgICBHU1RfRVJST1IgKCJmYWlsZWQgdG8gY2xvc2Ugc29ja2V0ICVwOiAlcyIsIHVkcHNyYy0+c29ja2V0LAorICAgICAgICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAodWRwc3JjLT5zb2NrZXQpCisgICAgICAgIGdfb2JqZWN0X3VucmVmICh1ZHBzcmMtPnNvY2tldCk7CisgICAgICB1ZHBzcmMtPnNvY2tldCA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgR1NUX0RFQlVHICgic2V0dGluZyBzb2NrZXQgdG8gJXAiLCB1ZHBzcmMtPnNvY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVElNRU9VVDoKKyAgICAgIHVkcHNyYy0+dGltZW91dCA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NLSVBfRklSU1RfQllURVM6CisgICAgICB1ZHBzcmMtPnNraXBfZmlyc3RfYnl0ZXMgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DTE9TRV9TT0NLRVQ6CisgICAgICB1ZHBzcmMtPmNsb3NlX3NvY2tldCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BVVRPX01VTFRJQ0FTVDoKKyAgICAgIHVkcHNyYy0+YXV0b19tdWx0aWNhc3QgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVVU0U6CisgICAgICB1ZHBzcmMtPnJldXNlID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xPT1A6CisgICAgICB1ZHBzcmMtPmxvb3AgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVUUklFVkVfU0VOREVSX0FERFJFU1M6CisgICAgICB1ZHBzcmMtPnJldHJpZXZlX3NlbmRlcl9hZGRyZXNzID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdWRwc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RVRFBTcmMgKnVkcHNyYyA9IEdTVF9VRFBTUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0JVRkZFUl9TSVpFOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdWRwc3JjLT5idWZmZXJfc2l6ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUE9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHVkcHNyYy0+cG9ydCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfTVVMVElDQVNUX0dST1VQOgorICAgIGNhc2UgUFJPUF9BRERSRVNTOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgdWRwc3JjLT5hZGRyZXNzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NVUxUSUNBU1RfSUZBQ0U6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCB1ZHBzcmMtPm11bHRpX2lmYWNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VUkk6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCB1ZHBzcmMtPnVyaSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0FQUzoKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAodWRwc3JjKTsKKyAgICAgIGdzdF92YWx1ZV9zZXRfY2FwcyAodmFsdWUsIHVkcHNyYy0+Y2Fwcyk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAodWRwc3JjKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TT0NLRVQ6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCB1ZHBzcmMtPnNvY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVElNRU9VVDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQ2NCAodmFsdWUsIHVkcHNyYy0+dGltZW91dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0tJUF9GSVJTVF9CWVRFUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHVkcHNyYy0+c2tpcF9maXJzdF9ieXRlcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0xPU0VfU09DS0VUOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHVkcHNyYy0+Y2xvc2Vfc29ja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VEX1NPQ0tFVDoKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHVkcHNyYy0+dXNlZF9zb2NrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FVVE9fTVVMVElDQVNUOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHVkcHNyYy0+YXV0b19tdWx0aWNhc3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JFVVNFOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHVkcHNyYy0+cmV1c2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xPT1A6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgdWRwc3JjLT5sb29wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRVRSSUVWRV9TRU5ERVJfQUREUkVTUzoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB1ZHBzcmMtPnJldHJpZXZlX3NlbmRlcl9hZGRyZXNzKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIEdJbmV0QWRkcmVzcyAqCitnc3RfdWRwc3JjX3Jlc29sdmUgKEdzdFVEUFNyYyAqIHNyYywgY29uc3QgZ2NoYXIgKiBhZGRyZXNzKQoreworICBHSW5ldEFkZHJlc3MgKmFkZHI7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgR1Jlc29sdmVyICpyZXNvbHZlcjsKKworICBhZGRyID0gZ19pbmV0X2FkZHJlc3NfbmV3X2Zyb21fc3RyaW5nIChhZGRyZXNzKTsKKyAgaWYgKCFhZGRyKSB7CisgICAgR0xpc3QgKnJlc3VsdHM7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJyZXNvbHZpbmcgSVAgYWRkcmVzcyBmb3IgaG9zdCAlcyIsIGFkZHJlc3MpOworICAgIHJlc29sdmVyID0gZ19yZXNvbHZlcl9nZXRfZGVmYXVsdCAoKTsKKyAgICByZXN1bHRzID0KKyAgICAgICAgZ19yZXNvbHZlcl9sb29rdXBfYnlfbmFtZSAocmVzb2x2ZXIsIGFkZHJlc3MsIHNyYy0+Y2FuY2VsbGFibGUsICZlcnIpOworICAgIGlmICghcmVzdWx0cykKKyAgICAgIGdvdG8gbmFtZV9yZXNvbHZlOworICAgIGFkZHIgPSBHX0lORVRfQUREUkVTUyAoZ19vYmplY3RfcmVmIChyZXN1bHRzLT5kYXRhKSk7CisKKyAgICBnX3Jlc29sdmVyX2ZyZWVfYWRkcmVzc2VzIChyZXN1bHRzKTsKKyAgICBnX29iamVjdF91bnJlZiAocmVzb2x2ZXIpOworICB9CisjaWZuZGVmIEdTVF9ESVNBQkxFX0dTVF9ERUJVRworICB7CisgICAgZ2NoYXIgKmlwID0gZ19pbmV0X2FkZHJlc3NfdG9fc3RyaW5nIChhZGRyKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIklQIGFkZHJlc3MgZm9yIGhvc3QgJXMgaXMgJXMiLCBhZGRyZXNzLCBpcCk7CisgICAgZ19mcmVlIChpcCk7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBhZGRyOworCituYW1lX3Jlc29sdmU6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgIkZhaWxlZCB0byByZXNvbHZlICVzOiAlcyIsIGFkZHJlc3MsIGVyci0+bWVzc2FnZSk7CisgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgZ19vYmplY3RfdW5yZWYgKHJlc29sdmVyKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCisvKiBjcmVhdGUgYSBzb2NrZXQgZm9yIHNlbmRpbmcgdG8gcmVtb3RlIG1hY2hpbmUgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3VkcHNyY19vcGVuIChHc3RVRFBTcmMgKiBzcmMpCit7CisgIEdJbmV0QWRkcmVzcyAqYWRkciwgKmJpbmRfYWRkcjsKKyAgR1NvY2tldEFkZHJlc3MgKmJpbmRfc2FkZHI7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICBnc3RfdWRwc3JjX2NyZWF0ZV9jYW5jZWxsYWJsZSAoc3JjKTsKKworICBpZiAoc3JjLT5zb2NrZXQgPT0gTlVMTCkgeworICAgIC8qIG5lZWQgdG8gYWxsb2NhdGUgYSBzb2NrZXQgKi8KKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJhbGxvY2F0aW5nIHNvY2tldCBmb3IgJXM6JWQiLCBzcmMtPmFkZHJlc3MsCisgICAgICAgIHNyYy0+cG9ydCk7CisKKyAgICBhZGRyID0gZ3N0X3VkcHNyY19yZXNvbHZlIChzcmMsIHNyYy0+YWRkcmVzcyk7CisgICAgaWYgKCFhZGRyKQorICAgICAgZ290byBuYW1lX3Jlc29sdmU7CisKKyAgICBpZiAoKHNyYy0+dXNlZF9zb2NrZXQgPQorICAgICAgICAgICAgZ19zb2NrZXRfbmV3IChnX2luZXRfYWRkcmVzc19nZXRfZmFtaWx5IChhZGRyKSwKKyAgICAgICAgICAgICAgICBHX1NPQ0tFVF9UWVBFX0RBVEFHUkFNLCBHX1NPQ0tFVF9QUk9UT0NPTF9VRFAsICZlcnIpKSA9PSBOVUxMKQorICAgICAgZ290byBub19zb2NrZXQ7CisKKyAgICBzcmMtPmV4dGVybmFsX3NvY2tldCA9IEZBTFNFOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiZ290IHNvY2tldCAlcCIsIHNyYy0+dXNlZF9zb2NrZXQpOworCisgICAgaWYgKHNyYy0+YWRkcikKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzcmMtPmFkZHIpOworICAgIHNyYy0+YWRkciA9CisgICAgICAgIEdfSU5FVF9TT0NLRVRfQUREUkVTUyAoZ19pbmV0X3NvY2tldF9hZGRyZXNzX25ldyAoYWRkciwgc3JjLT5wb3J0KSk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJiaW5kaW5nIG9uIHBvcnQgJWQiLCBzcmMtPnBvcnQpOworCisgICAgLyogRm9yIG11bHRpY2FzdCwgYmluZCB0byBBTlkgYW5kIGpvaW4gdGhlIG11bHRpY2FzdCBncm91cCBsYXRlciAqLworICAgIGlmIChnX2luZXRfYWRkcmVzc19nZXRfaXNfbXVsdGljYXN0IChhZGRyKSkKKyAgICAgIGJpbmRfYWRkciA9IGdfaW5ldF9hZGRyZXNzX25ld19hbnkgKGdfaW5ldF9hZGRyZXNzX2dldF9mYW1pbHkgKGFkZHIpKTsKKyAgICBlbHNlCisgICAgICBiaW5kX2FkZHIgPSBHX0lORVRfQUREUkVTUyAoZ19vYmplY3RfcmVmIChhZGRyKSk7CisKKyAgICBnX29iamVjdF91bnJlZiAoYWRkcik7CisKKyAgICBiaW5kX3NhZGRyID0gZ19pbmV0X3NvY2tldF9hZGRyZXNzX25ldyAoYmluZF9hZGRyLCBzcmMtPnBvcnQpOworICAgIGdfb2JqZWN0X3VucmVmIChiaW5kX2FkZHIpOworICAgIGlmICghZ19zb2NrZXRfYmluZCAoc3JjLT51c2VkX3NvY2tldCwgYmluZF9zYWRkciwgc3JjLT5yZXVzZSwgJmVycikpCisgICAgICBnb3RvIGJpbmRfZXJyb3I7CisKKyAgICBnX29iamVjdF91bnJlZiAoYmluZF9zYWRkcik7CisgICAgZ19zb2NrZXRfc2V0X211bHRpY2FzdF9sb29wYmFjayAoc3JjLT51c2VkX3NvY2tldCwgc3JjLT5sb29wKTsKKyAgfSBlbHNlIHsKKyAgICBHSW5ldFNvY2tldEFkZHJlc3MgKmxvY2FsX2FkZHI7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJ1c2luZyBwcm92aWRlZCBzb2NrZXQgJXAiLCBzcmMtPnNvY2tldCk7CisgICAgLyogd2UgdXNlIHRoZSBjb25maWd1cmVkIHNvY2tldCwgdHJ5IHRvIGdldCBzb21lIGluZm8gYWJvdXQgaXQgKi8KKyAgICBzcmMtPnVzZWRfc29ja2V0ID0gR19TT0NLRVQgKGdfb2JqZWN0X3JlZiAoc3JjLT5zb2NrZXQpKTsKKyAgICBzcmMtPmV4dGVybmFsX3NvY2tldCA9IFRSVUU7CisKKyAgICBsb2NhbF9hZGRyID0KKyAgICAgICAgR19JTkVUX1NPQ0tFVF9BRERSRVNTIChnX3NvY2tldF9nZXRfbG9jYWxfYWRkcmVzcyAoc3JjLT51c2VkX3NvY2tldCwKKyAgICAgICAgICAgICZlcnIpKTsKKyAgICBpZiAoIWxvY2FsX2FkZHIpCisgICAgICBnb3RvIGdldHNvY2tuYW1lX2Vycm9yOworCisgICAgYWRkciA9IGdzdF91ZHBzcmNfcmVzb2x2ZSAoc3JjLCBzcmMtPmFkZHJlc3MpOworICAgIGlmICghYWRkcikKKyAgICAgIGdvdG8gbmFtZV9yZXNvbHZlOworCisgICAgLyogSWYgYm91bmQgdG8gQU5ZIGFuZCBhZGRyZXNzIHBvaW50cyB0byBhIG11bHRpY2FzdCBhZGRyZXNzLCBtYWtlCisgICAgICogc3VyZSB0aGF0IGFkZHJlc3MgaXMgbm90IG92ZXJyaWRkZW4gd2l0aCBBTlkgYnV0IHdlIGhhdmUgdGhlCisgICAgICogb3Bwb3J0dW5pdHkgbGF0ZXIgdG8gam9pbiB0aGUgbXVsdGljYXN0IGFkZHJlc3MuIFRoaXMgZW5zdXJlcyB0aGF0IHdlCisgICAgICogaGF2ZSB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgZm9yIHNvY2tldHMgY3JlYXRlZCBieSB1ZHBzcmMgKi8KKyAgICBpZiAoIXNyYy0+YXV0b19tdWx0aWNhc3QgfHwKKyAgICAgICAgIWdfaW5ldF9hZGRyZXNzX2dldF9pc19hbnkgKGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcworICAgICAgICAgICAgKGxvY2FsX2FkZHIpKQorICAgICAgICB8fCAhZ19pbmV0X2FkZHJlc3NfZ2V0X2lzX211bHRpY2FzdCAoYWRkcikpIHsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChhZGRyKTsKKyAgICAgIGlmIChzcmMtPmFkZHIpCisgICAgICAgIGdfb2JqZWN0X3VucmVmIChzcmMtPmFkZHIpOworICAgICAgc3JjLT5hZGRyID0gbG9jYWxfYWRkcjsKKyAgICB9IGVsc2UgeworICAgICAgZ19vYmplY3RfdW5yZWYgKGxvY2FsX2FkZHIpOworICAgICAgaWYgKHNyYy0+YWRkcikKKyAgICAgICAgZ19vYmplY3RfdW5yZWYgKHNyYy0+YWRkcik7CisgICAgICBzcmMtPmFkZHIgPQorICAgICAgICAgIEdfSU5FVF9TT0NLRVRfQUREUkVTUyAoZ19pbmV0X3NvY2tldF9hZGRyZXNzX25ldyAoYWRkciwgc3JjLT5wb3J0KSk7CisgICAgICBnX29iamVjdF91bnJlZiAoYWRkcik7CisgICAgfQorICB9CisKKyAgeworICAgIGdpbnQgdmFsID0gMDsKKworICAgIGlmIChzcmMtPmJ1ZmZlcl9zaXplICE9IDApIHsKKyAgICAgIEdFcnJvciAqb3B0X2VyciA9IE5VTEw7CisKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAoc3JjLCAic2V0dGluZyB1ZHAgYnVmZmVyIG9mICVkIGJ5dGVzIiwgc3JjLT5idWZmZXJfc2l6ZSk7CisgICAgICAvKiBzZXQgYnVmZmVyIHNpemUsIE5vdGUgdGhhdCBvbiBMaW51eCB0aGlzIGlzIHR5cGljYWxseSBsaW1pdGVkIHRvIGEKKyAgICAgICAqIG1heGltdW0gb2YgYXJvdW5kIDEwMEsuIEFsc28gYSBtaW5pbXVtIG9mIDEyOCBieXRlcyBpcyByZXF1aXJlZCBvbgorICAgICAgICogTGludXguICovCisgICAgICBpZiAoIWdfc29ja2V0X3NldF9vcHRpb24gKHNyYy0+dXNlZF9zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwKKyAgICAgICAgICAgICAgc3JjLT5idWZmZXJfc2l6ZSwgJm9wdF9lcnIpKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHNyYywgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICAgICAoIkNvdWxkIG5vdCBjcmVhdGUgYSBidWZmZXIgb2YgcmVxdWVzdGVkICVkIGJ5dGVzOiAlcyIsCisgICAgICAgICAgICAgICAgc3JjLT5idWZmZXJfc2l6ZSwgb3B0X2Vyci0+bWVzc2FnZSkpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKG9wdF9lcnIpOworICAgICAgICBvcHRfZXJyID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZWFkIHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZSBidWZmZXIuIE5vdGUgdGhhdCBvbiBsaW51eCB0aGlzIHJldHVybnMKKyAgICAgKiAyeCB0aGUgdmFsdWUgd2Ugc2V0IGJlY2F1c2UgdGhlIGtlcm5lbCBhbGxvY2F0ZXMgZXh0cmEgbWVtb3J5IGZvcgorICAgICAqIG1ldGFkYXRhLiBUaGUgZGVmYXVsdCBvbiBMaW51eCBpcyBhYm91dCAxMDBLICh3aGljaCBpcyBhYm91dCA1MEsKKyAgICAgKiB3aXRob3V0IG1ldGFkYXRhKSAqLworICAgIGlmIChnX3NvY2tldF9nZXRfb3B0aW9uIChzcmMtPnVzZWRfc29ja2V0LCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsICZ2YWwsCisgICAgICAgICAgICBOVUxMKSkgeworICAgICAgR1NUX0lORk9fT0JKRUNUIChzcmMsICJoYXZlIHVkcCBidWZmZXIgb2YgJWQgYnl0ZXMiLCB2YWwpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJjb3VsZCBub3QgZ2V0IHVkcCBidWZmZXIgc2l6ZSIpOworICAgIH0KKyAgfQorCisgIGdfc29ja2V0X3NldF9icm9hZGNhc3QgKHNyYy0+dXNlZF9zb2NrZXQsIFRSVUUpOworCisgIGlmIChzcmMtPmF1dG9fbXVsdGljYXN0CisgICAgICAmJgorICAgICAgZ19pbmV0X2FkZHJlc3NfZ2V0X2lzX211bHRpY2FzdCAoZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9hZGRyZXNzCisgICAgICAgICAgKHNyYy0+YWRkcikpKSB7CisKKyAgICBpZiAoc3JjLT5tdWx0aV9pZmFjZSkgeworICAgICAgR1N0cnYgbXVsdGlfaWZhY2VzID0gZ19zdHJzcGxpdCAoc3JjLT5tdWx0aV9pZmFjZSwgIiwiLCAtMSk7CisgICAgICBnY2hhciAqKmlmYWNlcyA9IG11bHRpX2lmYWNlczsKKyAgICAgIHdoaWxlICgqaWZhY2VzKSB7CisgICAgICAgIGdfc3Ryc3RyaXAgKCppZmFjZXMpOworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJqb2luaW5nIG11bHRpY2FzdCBncm91cCAlcyBpbnRlcmZhY2UgJXMiLAorICAgICAgICAgICAgc3JjLT5hZGRyZXNzLCAqaWZhY2VzKTsKKyAgICAgICAgaWYgKCFnX3NvY2tldF9qb2luX211bHRpY2FzdF9ncm91cCAoc3JjLT51c2VkX3NvY2tldCwKKyAgICAgICAgICAgICAgICBnX2luZXRfc29ja2V0X2FkZHJlc3NfZ2V0X2FkZHJlc3MgKHNyYy0+YWRkciksCisgICAgICAgICAgICAgICAgRkFMU0UsICppZmFjZXMsICZlcnIpKSB7CisgICAgICAgICAgZ19zdHJmcmVldiAobXVsdGlfaWZhY2VzKTsKKyAgICAgICAgICBnb3RvIG1lbWJlcnNoaXA7CisgICAgICAgIH0KKworICAgICAgICBpZmFjZXMrKzsKKyAgICAgIH0KKyAgICAgIGdfc3RyZnJlZXYgKG11bHRpX2lmYWNlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImpvaW5pbmcgbXVsdGljYXN0IGdyb3VwICVzIiwgc3JjLT5hZGRyZXNzKTsKKyAgICAgIGlmICghZ19zb2NrZXRfam9pbl9tdWx0aWNhc3RfZ3JvdXAgKHNyYy0+dXNlZF9zb2NrZXQsCisgICAgICAgICAgICAgIGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcyAoc3JjLT5hZGRyKSwgRkFMU0UsIE5VTEwsICZlcnIpKQorICAgICAgICBnb3RvIG1lbWJlcnNoaXA7CisgICAgfQorCisgICAgaWYgKGdfaW5ldF9hZGRyZXNzX2dldF9mYW1pbHkgKGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcworICAgICAgICAgICAgKHNyYy0+YWRkcikpID09IEdfU09DS0VUX0ZBTUlMWV9JUFY0KSB7CisjaWYgZGVmaW5lZChJUF9NVUxUSUNBU1RfQUxMKQorICAgICAgaWYgKCFnX3NvY2tldF9zZXRfb3B0aW9uIChzcmMtPnVzZWRfc29ja2V0LCBJUFBST1RPX0lQLCBJUF9NVUxUSUNBU1RfQUxMLAorICAgICAgICAgICAgICAwLCAmZXJyKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgIkZhaWxlZCB0byBkaXNhYmxlIElQX01VTFRJQ0FTVF9BTEw6ICVzIiwKKyAgICAgICAgICAgIGVyci0+bWVzc2FnZSk7CisgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgfQorI2VsaWYgZGVmaW5lZChJUF9QS1RJTkZPKQorICAgICAgaWYgKCFnX3NvY2tldF9zZXRfb3B0aW9uIChzcmMtPnVzZWRfc29ja2V0LCBJUFBST1RPX0lQLCBJUF9QS1RJTkZPLCBUUlVFLAorICAgICAgICAgICAgICAmZXJyKSkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgIkZhaWxlZCB0byBlbmFibGUgSVBfUEtUSU5GTzogJXMiLAorICAgICAgICAgICAgZXJyLT5tZXNzYWdlKTsKKyAgICAgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgICB9CisjZWxpZiBkZWZpbmVkKElQX1JFQ1ZEU1RBRERSKQorICAgICAgaWYgKCFnX3NvY2tldF9zZXRfb3B0aW9uIChzcmMtPnVzZWRfc29ja2V0LCBJUFBST1RPX0lQLCBJUF9SRUNWRFNUQUREUiwKKyAgICAgICAgICAgICAgVFJVRSwgJmVycikpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzcmMsICJGYWlsZWQgdG8gZW5hYmxlIElQX1JFQ1ZEU1RBRERSOiAlcyIsCisgICAgICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICAgIH0KKyNlbHNlCisjcHJhZ21hIG1lc3NhZ2UoIk5vIEFQSSBhdmFpbGFibGUgZm9yIGdldHRpbmcgSVB2NCBkZXN0aW5hdGlvbiBhZGRyZXNzIikKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiTm8gQVBJIGF2YWlsYWJsZSBmb3IgZ2V0dGluZyBJUHY0IGRlc3RpbmF0aW9uICIKKyAgICAgICAgICAiYWRkcmVzcywgd2lsbCByZWNlaXZlIHBhY2tldHMgZm9yIGV2ZXJ5IGRlc3RpbmF0aW9uIHRvIG91ciBwb3J0Iik7CisjZW5kaWYKKyAgICB9IGVsc2UKKyAgICAgICAgaWYgKGdfaW5ldF9hZGRyZXNzX2dldF9mYW1pbHkgKGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcworICAgICAgICAgICAgKHNyYy0+YWRkcikpID09IEdfU09DS0VUX0ZBTUlMWV9JUFY2KSB7CisjaWZkZWYgSVBWNl9QS1RJTkZPCisjaWZkZWYgSVBWNl9SRUNWUEtUSU5GTworICAgICAgaWYgKCFnX3NvY2tldF9zZXRfb3B0aW9uIChzcmMtPnVzZWRfc29ja2V0LCBJUFBST1RPX0lQVjYsCisgICAgICAgICAgICAgIElQVjZfUkVDVlBLVElORk8sIFRSVUUsICZlcnIpKSB7CisjZWxzZQorICAgICAgaWYgKCFnX3NvY2tldF9zZXRfb3B0aW9uIChzcmMtPnVzZWRfc29ja2V0LCBJUFBST1RPX0lQVjYsIElQVjZfUEtUSU5GTywKKyAgICAgICAgICAgICAgVFJVRSwgJmVycikpIHsKKyNlbmRpZgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywgIkZhaWxlZCB0byBlbmFibGUgSVBWNl9QS1RJTkZPOiAlcyIsCisgICAgICAgICAgICBlcnItPm1lc3NhZ2UpOworICAgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICAgIH0KKyNlbHNlCisjcHJhZ21hIG1lc3NhZ2UoIk5vIEFQSSBhdmFpbGFibGUgZm9yIGdldHRpbmcgSVB2NiBkZXN0aW5hdGlvbiBhZGRyZXNzIikKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLCAiTm8gQVBJIGF2YWlsYWJsZSBmb3IgZ2V0dGluZyBJUHY2IGRlc3RpbmF0aW9uICIKKyAgICAgICAgICAiYWRkcmVzcywgd2lsbCByZWNlaXZlIHBhY2tldHMgZm9yIGV2ZXJ5IGRlc3RpbmF0aW9uIHRvIG91ciBwb3J0Iik7CisjZW5kaWYKKyAgICB9CisgIH0KKworICAvKiBOT1RFOiBzb2NrYWRkcl9pbi5zaW5fcG9ydCB3b3JrcyBmb3IgaXB2NCBhbmQgaXB2NiBiZWNhdXNlIHNpbl9wb3J0CisgICAqIGZvbGxvd3Mgc3NfZmFtaWx5IG9uIGJvdGggKi8KKyAgeworICAgIEdJbmV0U29ja2V0QWRkcmVzcyAqYWRkcjsKKyAgICBndWludDE2IHBvcnQ7CisKKyAgICBhZGRyID0KKyAgICAgICAgR19JTkVUX1NPQ0tFVF9BRERSRVNTIChnX3NvY2tldF9nZXRfbG9jYWxfYWRkcmVzcyAoc3JjLT51c2VkX3NvY2tldCwKKyAgICAgICAgICAgICZlcnIpKTsKKyAgICBpZiAoIWFkZHIpCisgICAgICBnb3RvIGdldHNvY2tuYW1lX2Vycm9yOworCisgICAgcG9ydCA9IGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfcG9ydCAoYWRkcik7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiYm91bmQsIG9uIHBvcnQgJWQiLCBwb3J0KTsKKyAgICBpZiAocG9ydCAhPSBzcmMtPnBvcnQpIHsKKyAgICAgIHNyYy0+cG9ydCA9IHBvcnQ7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJub3RpZnlpbmcgcG9ydCAlZCIsIHBvcnQpOworICAgICAgZ19vYmplY3Rfbm90aWZ5IChHX09CSkVDVCAoc3JjKSwgInBvcnQiKTsKKyAgICB9CisgICAgZ19vYmplY3RfdW5yZWYgKGFkZHIpOworICB9CisKKyAgc3JjLT5hbGxvY2F0b3IgPSBOVUxMOworICBnc3RfYWxsb2NhdGlvbl9wYXJhbXNfaW5pdCAoJnNyYy0+cGFyYW1zKTsKKworICBzcmMtPm1heF9zaXplID0gMDsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK25hbWVfcmVzb2x2ZToKKyAgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fc29ja2V0OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwgKE5VTEwpLAorICAgICAgICAoIm5vIHNvY2tldCBlcnJvcjogJXMiLCBlcnItPm1lc3NhZ2UpKTsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICBnX29iamVjdF91bnJlZiAoYWRkcik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitiaW5kX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiYmluZCBmYWlsZWQ6ICVzIiwgZXJyLT5tZXNzYWdlKSk7CisgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgZ19vYmplY3RfdW5yZWYgKGJpbmRfc2FkZHIpOworICAgIGdzdF91ZHBzcmNfY2xvc2UgKHNyYyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CittZW1iZXJzaGlwOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiY291bGQgbm90IGFkZCBtZW1iZXJzaGlwOiAlcyIsIGVyci0+bWVzc2FnZSkpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgIGdzdF91ZHBzcmNfY2xvc2UgKHNyYyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitnZXRzb2NrbmFtZV9lcnJvcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzcmMsIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoImdldHNvY2tuYW1lIGZhaWxlZDogJXMiLCBlcnItPm1lc3NhZ2UpKTsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICBnc3RfdWRwc3JjX2Nsb3NlIChzcmMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF91ZHBzcmNfdW5sb2NrIChHc3RCYXNlU3JjICogYnNyYykKK3sKKyAgR3N0VURQU3JjICpzcmM7CisKKyAgc3JjID0gR1NUX1VEUFNSQyAoYnNyYyk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIkZsdXNoaW5nIik7CisgIGdfY2FuY2VsbGFibGVfY2FuY2VsIChzcmMtPmNhbmNlbGxhYmxlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdWRwc3JjX3VubG9ja19zdG9wIChHc3RCYXNlU3JjICogYnNyYykKK3sKKyAgR3N0VURQU3JjICpzcmM7CisKKyAgc3JjID0gR1NUX1VEUFNSQyAoYnNyYyk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIk5vIGxvbmdlciBmbHVzaGluZyIpOworCisgIGdzdF91ZHBzcmNfZnJlZV9jYW5jZWxsYWJsZSAoc3JjKTsKKyAgZ3N0X3VkcHNyY19jcmVhdGVfY2FuY2VsbGFibGUgKHNyYyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3VkcHNyY19jbG9zZSAoR3N0VURQU3JjICogc3JjKQoreworICBHU1RfREVCVUcgKCJjbG9zaW5nIHNvY2tldHMiKTsKKworICBpZiAoc3JjLT51c2VkX3NvY2tldCkgeworICAgIGlmIChzcmMtPmF1dG9fbXVsdGljYXN0CisgICAgICAgICYmCisgICAgICAgIGdfaW5ldF9hZGRyZXNzX2dldF9pc19tdWx0aWNhc3QgKGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcworICAgICAgICAgICAgKHNyYy0+YWRkcikpKSB7CisgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisKKyAgICAgIGlmIChzcmMtPm11bHRpX2lmYWNlKSB7CisgICAgICAgIEdTdHJ2IG11bHRpX2lmYWNlcyA9IGdfc3Ryc3BsaXQgKHNyYy0+bXVsdGlfaWZhY2UsICIsIiwgLTEpOworICAgICAgICBnY2hhciAqKmlmYWNlcyA9IG11bHRpX2lmYWNlczsKKyAgICAgICAgd2hpbGUgKCppZmFjZXMpIHsKKyAgICAgICAgICBnX3N0cnN0cmlwICgqaWZhY2VzKTsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJsZWF2aW5nIG11bHRpY2FzdCBncm91cCAlcyBpbnRlcmZhY2UgJXMiLAorICAgICAgICAgICAgICBzcmMtPmFkZHJlc3MsICppZmFjZXMpOworICAgICAgICAgIGlmICghZ19zb2NrZXRfbGVhdmVfbXVsdGljYXN0X2dyb3VwIChzcmMtPnVzZWRfc29ja2V0LAorICAgICAgICAgICAgICAgICAgZ19pbmV0X3NvY2tldF9hZGRyZXNzX2dldF9hZGRyZXNzIChzcmMtPmFkZHIpLAorICAgICAgICAgICAgICAgICAgRkFMU0UsICppZmFjZXMsICZlcnIpKSB7CisgICAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChzcmMsICJGYWlsZWQgdG8gbGVhdmUgbXVsdGljYXN0IGdyb3VwOiAlcyIsCisgICAgICAgICAgICAgICAgZXJyLT5tZXNzYWdlKTsKKyAgICAgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZmFjZXMrKzsKKyAgICAgICAgfQorICAgICAgICBnX3N0cmZyZWV2IChtdWx0aV9pZmFjZXMpOworCisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJsZWF2aW5nIG11bHRpY2FzdCBncm91cCAlcyIsIHNyYy0+YWRkcmVzcyk7CisgICAgICAgIGlmICghZ19zb2NrZXRfbGVhdmVfbXVsdGljYXN0X2dyb3VwIChzcmMtPnVzZWRfc29ja2V0LAorICAgICAgICAgICAgICAgIGdfaW5ldF9zb2NrZXRfYWRkcmVzc19nZXRfYWRkcmVzcyAoc3JjLT5hZGRyKSwgRkFMU0UsCisgICAgICAgICAgICAgICAgTlVMTCwgJmVycikpIHsKKyAgICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChzcmMsICJGYWlsZWQgdG8gbGVhdmUgbXVsdGljYXN0IGdyb3VwOiAlcyIsCisgICAgICAgICAgICAgIGVyci0+bWVzc2FnZSk7CisgICAgICAgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3JjLT5jbG9zZV9zb2NrZXQgfHwgIXNyYy0+ZXh0ZXJuYWxfc29ja2V0KSB7CisgICAgICBHRXJyb3IgKmVyciA9IE5VTEw7CisgICAgICBpZiAoIWdfc29ja2V0X2Nsb3NlIChzcmMtPnVzZWRfc29ja2V0LCAmZXJyKSkgeworICAgICAgICBHU1RfRVJST1JfT0JKRUNUIChzcmMsICJGYWlsZWQgdG8gY2xvc2Ugc29ja2V0OiAlcyIsIGVyci0+bWVzc2FnZSk7CisgICAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgICAgfQorICAgIH0KKworICAgIGdfb2JqZWN0X3VucmVmIChzcmMtPnVzZWRfc29ja2V0KTsKKyAgICBzcmMtPnVzZWRfc29ja2V0ID0gTlVMTDsKKyAgICBnX29iamVjdF91bnJlZiAoc3JjLT5hZGRyKTsKKyAgICBzcmMtPmFkZHIgPSBOVUxMOworICB9CisKKyAgZ3N0X3VkcHNyY19yZXNldF9tZW1vcnlfYWxsb2NhdG9yIChzcmMpOworCisgIGdzdF91ZHBzcmNfZnJlZV9jYW5jZWxsYWJsZSAoc3JjKTsKKworICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF91ZHBzcmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0VURQU3JjICpzcmM7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJlc3VsdDsKKworICBzcmMgPSBHU1RfVURQU1JDIChlbGVtZW50KTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIGlmICghZ3N0X3VkcHNyY19vcGVuIChzcmMpKQorICAgICAgICBnb3RvIG9wZW5fZmFpbGVkOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIGlmICgocmVzdWx0ID0KKyAgICAgICAgICBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LAorICAgICAgICAgICAgICB0cmFuc2l0aW9uKSkgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKQorICAgIGdvdG8gZmFpbHVyZTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGdzdF91ZHBzcmNfY2xvc2UgKHNyYyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKKyAgLyogRVJST1JTICovCitvcGVuX2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgImZhaWxlZCB0byBvcGVuIHNvY2tldCIpOworICAgIHJldHVybiBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgIH0KK2ZhaWx1cmU6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJwYXJlbnQgZmFpbGVkIHN0YXRlIGNoYW5nZSIpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworCisKKworLyoqKiBHU1RVUklIQU5ETEVSIElOVEVSRkFDRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgR3N0VVJJVHlwZQorZ3N0X3VkcHNyY191cmlfZ2V0X3R5cGUgKEdUeXBlIHR5cGUpCit7CisgIHJldHVybiBHU1RfVVJJX1NSQzsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICpjb25zdCAqCitnc3RfdWRwc3JjX3VyaV9nZXRfcHJvdG9jb2xzIChHVHlwZSB0eXBlKQoreworICBzdGF0aWMgY29uc3QgZ2NoYXIgKnByb3RvY29sc1tdID0geyAidWRwIiwgTlVMTCB9OworCisgIHJldHVybiBwcm90b2NvbHM7Cit9CisKK3N0YXRpYyBnY2hhciAqCitnc3RfdWRwc3JjX3VyaV9nZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlcikKK3sKKyAgR3N0VURQU3JjICpzcmMgPSBHU1RfVURQU1JDIChoYW5kbGVyKTsKKworICByZXR1cm4gZ19zdHJkdXAgKHNyYy0+dXJpKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdWRwc3JjX3VyaV9zZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlciwgY29uc3QgZ2NoYXIgKiB1cmksCisgICAgR0Vycm9yICoqIGVycm9yKQoreworICByZXR1cm4gZ3N0X3VkcHNyY19zZXRfdXJpIChHU1RfVURQU1JDIChoYW5kbGVyKSwgdXJpLCBlcnJvcik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdWRwc3JjX3VyaV9oYW5kbGVyX2luaXQgKGdwb2ludGVyIGdfaWZhY2UsIGdwb2ludGVyIGlmYWNlX2RhdGEpCit7CisgIEdzdFVSSUhhbmRsZXJJbnRlcmZhY2UgKmlmYWNlID0gKEdzdFVSSUhhbmRsZXJJbnRlcmZhY2UgKikgZ19pZmFjZTsKKworICBpZmFjZS0+Z2V0X3R5cGUgPSBnc3RfdWRwc3JjX3VyaV9nZXRfdHlwZTsKKyAgaWZhY2UtPmdldF9wcm90b2NvbHMgPSBnc3RfdWRwc3JjX3VyaV9nZXRfcHJvdG9jb2xzOworICBpZmFjZS0+Z2V0X3VyaSA9IGdzdF91ZHBzcmNfdXJpX2dldF91cmk7CisgIGlmYWNlLT5zZXRfdXJpID0gZ3N0X3VkcHNyY191cmlfc2V0X3VyaTsKK30KZGlmZiAtLWdpdCBhL2dzdC91ZHAvZ3N0dWRwc3JjLmggYi9nc3QvdWRwL2dzdHVkcHNyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2Zjg0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdWRwL2dzdHVkcHNyYy5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfVURQU1JDX0hfXworI2RlZmluZSBfX0dTVF9VRFBTUkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0cHVzaHNyYy5oPgorI2luY2x1ZGUgPGdpby9naW8uaD4KKworR19CRUdJTl9ERUNMUworCisjaW5jbHVkZSAiZ3N0dWRwbmV0dXRpbHMuaCIKKworI2RlZmluZSBHU1RfVFlQRV9VRFBTUkMgXAorICAoZ3N0X3VkcHNyY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfVURQU1JDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVURQU1JDLEdzdFVEUFNyYykpCisjZGVmaW5lIEdTVF9VRFBTUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVURQU1JDLEdzdFVEUFNyY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1VEUFNSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1VEUFNSQykpCisjZGVmaW5lIEdTVF9JU19VRFBTUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVURQU1JDKSkKKyNkZWZpbmUgR1NUX1VEUFNSQ19DQVNUKG9iaikgKChHc3RVRFBTcmMgKikob2JqKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFVEUFNyYyBHc3RVRFBTcmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VURQU3JjQ2xhc3MgR3N0VURQU3JjQ2xhc3M7CisKK3N0cnVjdCBfR3N0VURQU3JjIHsKKyAgR3N0UHVzaFNyYyBwYXJlbnQ7CisKKyAgLyogcHJvcGVydGllcyAqLworICBnY2hhciAgICAgKmFkZHJlc3M7CisgIGdpbnQgICAgICAgcG9ydDsKKyAgZ2NoYXIgICAgICptdWx0aV9pZmFjZTsKKyAgZ2ludCAgICAgICB0dGw7CisgIEdzdENhcHMgICAqY2FwczsKKyAgZ2ludCAgICAgICBidWZmZXJfc2l6ZTsKKyAgZ3VpbnQ2NCAgICB0aW1lb3V0OworICBnaW50ICAgICAgIHNraXBfZmlyc3RfYnl0ZXM7CisgIEdTb2NrZXQgICAqc29ja2V0OworICBnYm9vbGVhbiAgIGNsb3NlX3NvY2tldDsKKyAgZ2Jvb2xlYW4gICBhdXRvX211bHRpY2FzdDsKKyAgZ2Jvb2xlYW4gICByZXVzZTsKKyAgZ2Jvb2xlYW4gICBsb29wOworICBnYm9vbGVhbiAgIHJldHJpZXZlX3NlbmRlcl9hZGRyZXNzOworCisgIC8qIHN0YXRzICovCisgIGd1aW50ICAgICAgbWF4X3NpemU7CisKKyAgLyogb3VyIHNvY2tldHMgKi8KKyAgR1NvY2tldCAgICp1c2VkX3NvY2tldDsKKyAgR0luZXRTb2NrZXRBZGRyZXNzICphZGRyOworICBnYm9vbGVhbiAgIGV4dGVybmFsX3NvY2tldDsKKworICBnYm9vbGVhbiAgIG1hZGVfY2FuY2VsX2ZkOworICBHQ2FuY2VsbGFibGUgKmNhbmNlbGxhYmxlOworCisgIC8qIG1lbW9yeSBtYW5hZ2VtZW50ICovCisgIEdzdEFsbG9jYXRvciAqYWxsb2NhdG9yOworICBHc3RBbGxvY2F0aW9uUGFyYW1zIHBhcmFtczsKKworICBHc3RNZW1vcnkgICAqbWVtOworICBHc3RNYXBJbmZvICAgbWFwOworICBHc3RNZW1vcnkgICAqbWVtX21heDsKKyAgR3N0TWFwSW5mbyAgIG1hcF9tYXg7CisgIEdJbnB1dFZlY3RvciB2ZWNbMl07CisKKyAgZ2NoYXIgICAgICp1cmk7Cit9OworCitzdHJ1Y3QgX0dzdFVEUFNyY0NsYXNzIHsKKyAgR3N0UHVzaFNyY0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF91ZHBzcmNfZ2V0X3R5cGUodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKworI2VuZGlmIC8qIF9fR1NUX1VEUFNSQ19IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC91ZHAvbWVzb24uYnVpbGQgYi9nc3QvdWRwL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYzU3NmQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdWRwL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTcgQEAKK3VkcF9zb3VyY2VzID0gWworICAnZ3N0dWRwLmMnLAorICAnZ3N0dWRwc3JjLmMnLAorICAnZ3N0dWRwc2luay5jJywKKyAgJ2dzdG11bHRpdWRwc2luay5jJywKKyAgJ2dzdGR5bnVkcHNpbmsuYycsCisgICdnc3R1ZHBuZXR1dGlscy5jJworXQorCitnc3R1ZHAgPSBsaWJyYXJ5KCdnc3R1ZHAnLAorICB1ZHBfc291cmNlcywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3RfZGVwLCBnc3RiYXNlX2RlcCwgZ3N0bmV0X2RlcCwgZ2lvX2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9ib3gvTWFrZWZpbGUuYW0gYi9nc3QvdmlkZW9ib3gvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRiNWExMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2JveC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIwIEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3R2aWRlb2JveC5sYQorCitPUkNfU09VUkNFPWdzdHZpZGVvYm94b3JjCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL29yYy5tYWsKKworbGliZ3N0dmlkZW9ib3hfbGFfU09VUkNFUyA9IGdzdHZpZGVvYm94LmMKK25vZGlzdF9saWJnc3R2aWRlb2JveF9sYV9TT1VSQ0VTID0gJChPUkNfTk9ESVNUX1NPVVJDRVMpCitsaWJnc3R2aWRlb2JveF9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJCQkgICAkKEdTVF9CQVNFX0NGTEFHUykgXAorCQkJICAgJChHU1RfQ0ZMQUdTKSBcCisJCQkgICAkKE9SQ19DRkxBR1MpCitsaWJnc3R2aWRlb2JveF9sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgXAorCQkJICAgJChHU1RfQkFTRV9MSUJTKSBcCisJCQkgICAkKEdTVF9MSUJTKSBcCisJCQkgICAkKE9SQ19MSUJTKSBcCisJCQkgICAtbGdzdHZpZGVvLUBHU1RfQVBJX1ZFUlNJT05ACitsaWJnc3R2aWRlb2JveF9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0dmlkZW9ib3guaAorRVhUUkFfRElTVCArPSBSRUFETUUKZGlmZiAtLWdpdCBhL2dzdC92aWRlb2JveC9SRUFETUUgYi9nc3QvdmlkZW9ib3gvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MWRhNTkKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9ib3gvUkVBRE1FCkBAIC0wLDAgKzEsMjEgQEAKK1ZpZGVvYm94CistLS0tLS0tLQorCitUaGlzIHBsdWdpbiBjcm9wcyBvciBlbmxhcmdlcyB0aGUgaW1hZ2UuIEl0IHRha2VzIDQgdmFsdWVzIGFzIGlucHV0LCBhCit0b3AsIGJvdHRvbSwgbGVmdCBhbmQgcmlnaHQgb2Zmc2V0LiBQb3NpdGl2ZSB2YWx1ZXMgd2lsbCBjcm9wIHRoYXQgbXVjaAorcGl4ZWxzIGZyb20gdGhlIHJlc3BlY3RpdmUgYm9yZGVyIG9mIHRoZSBpbWFnZSwgbmVnYXRpdmUgdmFsdWVzIHdpbGwgYWRkCit0aGF0IG11Y2ggcGl4ZWxzLiBXaGVuIHBpeGVscyBhcmUgYWRkZWQsIHlvdSBjYW4gc3BlY2lmeSB0aGVpciBjb2xvci4gCitTb21lIHByZWRlZmluZWQgY29sb3JzIGFyZSB1c2FibGUgd2l0aCBhbiBlbnVtIHByb3BlcnR5LgorCitUaGUgcGx1Z2luIGlzIGFscGhhIGNoYW5uZWwgYXdhcmUgYW5kIHdpbGwgdHJ5IHRvIG5lZ290aWF0ZSB3aXRoIGEgZm9ybWF0Cit0aGF0IHN1cHBvcnRzIGFscGhhIGNoYW5uZWxzIGZpcnN0LiBXaGVuIGFscGhhIGNoYW5uZWwgaXMgYWN0aXZlIHR3bworb3RoZXIgcHJvcGVydGllcywgYWxwaGEgYW5kIGJvcmRlcl9hbHBoYSBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGFscGhhCit2YWx1ZXMgb2YgdGhlIGlubmVyIHBpY3R1cmUgYW5kIHRoZSBib3JkZXIgcmVzcGVjdGl2ZWx5LiBhbiBhbHBoYSB2YWx1ZSBvZgorMC4wIG1lYW5zIHRvdGFsIHRyYW5zcGFyZW5jeSwgMS4wIGlzIG9wYXF1ZS4KKworVGhlIHZpZGVvYm94IHBsdWdpbiBoYXMgbWFueSB1c2VzIHN1Y2ggYXMgZG9pbmcgYSBtb3NhaWMgb2YgcGljdHVyZXMsIAorbGV0dGVyYm94aW5nIHZpZGVvLCBjdXR0aW5nIG91dCBwaWVjZXMgb2YgdmlkZW8sIHBpY3R1cmUgaW4gcGljdHVyZSwgZXRjLi4KKworVE9ETworCistIGFkZCBlbnVtIHRvIHNwZWNpZnkgY29tbW9uIGFzcGVjdCByYXRpb3Mvc2l6ZXMgYW5kIGFkZCBib3JkZXJzL2Nyb3AKZGlmZiAtLWdpdCBhL2dzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jIGIvZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhmOTg0YwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2JveC9nc3R2aWRlb2JveC5jCkBAIC0wLDAgKzEsMzM0NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC12aWRlb2JveAorICogQHNlZV9hbHNvOiAjR3N0VmlkZW9Dcm9wCisgKgorICogVGhpcyBwbHVnaW4gY3JvcHMgb3IgZW5sYXJnZXMgdGhlIGltYWdlLiBJdCB0YWtlcyA0IHZhbHVlcyBhcyBpbnB1dCwgYQorICogdG9wLCBib3R0b20sIGxlZnQgYW5kIHJpZ2h0IG9mZnNldC4gUG9zaXRpdmUgdmFsdWVzIHdpbGwgY3JvcCB0aGF0IG11Y2gKKyAqIHBpeGVscyBmcm9tIHRoZSByZXNwZWN0aXZlIGJvcmRlciBvZiB0aGUgaW1hZ2UsIG5lZ2F0aXZlIHZhbHVlcyB3aWxsIGFkZAorICogdGhhdCBtdWNoIHBpeGVscy4gV2hlbiBwaXhlbHMgYXJlIGFkZGVkLCB5b3UgY2FuIHNwZWNpZnkgdGhlaXIgY29sb3IuIAorICogU29tZSBwcmVkZWZpbmVkIGNvbG9ycyBhcmUgdXNhYmxlIHdpdGggYW4gZW51bSBwcm9wZXJ0eS4KKyAqIAorICogVGhlIHBsdWdpbiBpcyBhbHBoYSBjaGFubmVsIGF3YXJlIGFuZCB3aWxsIHRyeSB0byBuZWdvdGlhdGUgd2l0aCBhIGZvcm1hdAorICogdGhhdCBzdXBwb3J0cyBhbHBoYSBjaGFubmVscyBmaXJzdC4gV2hlbiBhbHBoYSBjaGFubmVsIGlzIGFjdGl2ZSB0d28KKyAqIG90aGVyIHByb3BlcnRpZXMsIGFscGhhIGFuZCBib3JkZXJfYWxwaGEgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBhbHBoYQorICogdmFsdWVzIG9mIHRoZSBpbm5lciBwaWN0dXJlIGFuZCB0aGUgYm9yZGVyIHJlc3BlY3RpdmVseS4gYW4gYWxwaGEgdmFsdWUgb2YKKyAqIDAuMCBtZWFucyB0b3RhbCB0cmFuc3BhcmVuY3ksIDEuMCBpcyBvcGFxdWUuCisgKiAKKyAqIFRoZSB2aWRlb2JveCBwbHVnaW4gaGFzIG1hbnkgdXNlcyBzdWNoIGFzIGRvaW5nIGEgbW9zYWljIG9mIHBpY3R1cmVzLCAKKyAqIGxldHRlcmJveGluZyB2aWRlbywgY3V0dGluZyBvdXQgcGllY2VzIG9mIHZpZGVvLCBwaWN0dXJlIGluIHBpY3R1cmUsIGV0Yy4uCisgKgorICogU2V0dGluZyBhdXRvY3JvcCB0byB0cnVlIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBwbHVnaW4gc28gdGhhdAorICogY2FwcyBkZXRlcm1pbmUgY3JvcCBwcm9wZXJ0aWVzIHJhdGhlciB0aGFuIHRoZSBvdGhlciB3YXkgYXJvdW5kOiBnaXZlbgorICogaW5wdXQgYW5kIG91dHB1dCBkaW1lbnNpb25zLCB0aGUgY3JvcCB2YWx1ZXMgYXJlIHNlbGVjdGVkIHNvIHRoYXQgdGhlCisgKiBzbWFsbGVyIGZyYW1lIGlzIGVmZmVjdGl2ZWx5IGNlbnRlcmVkIGluIHRoZSBsYXJnZXIgZnJhbWUuICBUaGlzCisgKiBpbnZvbHZlcyBlaXRoZXIgY3JvcHBpbmcgb3IgcGFkZGluZy4KKyAqIAorICogSWYgeW91IHVzZSBhdXRvY3JvcCB0aGVyZSBpcyBsaXR0bGUgcG9pbnQgaW4gc2V0dGluZyB0aGUgb3RoZXIKKyAqIHByb3BlcnRpZXMgbWFudWFsbHkgYmVjYXVzZSB0aGV5IHdpbGwgYmUgb3ZlcnJpZGVuIGlmIHRoZSBjYXBzIGNoYW5nZSwKKyAqIGJ1dCBub3RoaW5nIHN0b3BzIHlvdSBmcm9tIGRvaW5nIHNvLgorICogCisgKiBTYW1wbGUgcGlwZWxpbmU6CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdmlkZW90ZXN0c3JjICEgdmlkZW9ib3ggYXV0b2Nyb3A9dHJ1ZSAhIFwKKyAqICAgInZpZGVvL3gtcmF3LCB3aWR0aD02MDAsIGhlaWdodD00MDAiICEgdmlkZW9jb252ZXJ0ICEgeGltYWdlc2luaworICogXXwKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3R2aWRlb2JveC5oIgorI2luY2x1ZGUgImdzdHZpZGVvYm94b3JjLmgiCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHZpZGVvYm94X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHZpZGVvYm94X2RlYnVnCisKKy8qIEZyb20gdmlkZW90ZXN0c3JjLmMgKi8KK3N0YXRpYyBjb25zdCBndWludDggeXV2X3NkdHZfY29sb3JzX1lbVklERU9fQk9YX0ZJTExfTEFTVF0gPQorICAgIHsgMTYsIDE0NSwgNDEsIDgxLCAyMTAsIDIzNSB9Oworc3RhdGljIGNvbnN0IGd1aW50OCB5dXZfc2R0dl9jb2xvcnNfVVtWSURFT19CT1hfRklMTF9MQVNUXSA9CisgICAgeyAxMjgsIDU0LCAyNDAsIDkwLCAxNiwgMTI4IH07CitzdGF0aWMgY29uc3QgZ3VpbnQ4IHl1dl9zZHR2X2NvbG9yc19WW1ZJREVPX0JPWF9GSUxMX0xBU1RdID0KKyAgICB7IDEyOCwgMzQsIDExMCwgMjQwLCAxNDYsIDEyOCB9OworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IHl1dl9oZHR2X2NvbG9yc19ZW1ZJREVPX0JPWF9GSUxMX0xBU1RdID0KKyAgICB7IDE2LCAxNzMsIDMyLCA2MywgMjE5LCAyMzUgfTsKK3N0YXRpYyBjb25zdCBndWludDggeXV2X2hkdHZfY29sb3JzX1VbVklERU9fQk9YX0ZJTExfTEFTVF0gPQorICAgIHsgMTI4LCA0MiwgMjQwLCAxMDIsIDE2LCAxMjggfTsKK3N0YXRpYyBjb25zdCBndWludDggeXV2X2hkdHZfY29sb3JzX1ZbVklERU9fQk9YX0ZJTExfTEFTVF0gPQorICAgIHsgMTI4LCAyNiwgMTE4LCAyNDAsIDEzOCwgMTI4IH07CisKK3N0YXRpYyBjb25zdCBndWludDggcmdiX2NvbG9yc19SW1ZJREVPX0JPWF9GSUxMX0xBU1RdID0KKyAgICB7IDAsIDAsIDAsIDI1NSwgMjU1LCAyNTUgfTsKK3N0YXRpYyBjb25zdCBndWludDggcmdiX2NvbG9yc19HW1ZJREVPX0JPWF9GSUxMX0xBU1RdID0KKyAgICB7IDAsIDI1NSwgMCwgMCwgMjU1LCAyNTUgfTsKK3N0YXRpYyBjb25zdCBndWludDggcmdiX2NvbG9yc19CW1ZJREVPX0JPWF9GSUxMX0xBU1RdID0KKyAgICB7IDAsIDAsIDI1NSwgMCwgMCwgMjU1IH07CisKKy8qIEdlbmVyYXRlZCBieSAtYmFkL2V4dC9jb2cvZ2VuZXJhdGVfdGFibGVzICovCitzdGF0aWMgY29uc3QgaW50IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfaGR0dltdID0geworICAyOTgsIDAsIDQ1OSwgLTYzNTE0LAorICAyOTgsIC01NSwgLTEzNiwgMTk2ODEsCisgIDI5OCwgNTQxLCAwLCAtNzM5ODgsCit9OworCitzdGF0aWMgY29uc3QgaW50IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfc2R0dltdID0geworICAyOTgsIDAsIDQwOSwgLTU3MDY4LAorICAyOTgsIC0xMDAsIC0yMDgsIDM0NzA3LAorICAyOTgsIDUxNiwgMCwgLTcwODcwLAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9oZHR2W10gPSB7CisgIDQ3LCAxNTcsIDE2LCA0MDk2LAorICAtMjYsIC04NywgMTEyLCAzMjc2OCwKKyAgMTEyLCAtMTAyLCAtMTAsIDMyNzY4LAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9zZHR2W10gPSB7CisgIDY2LCAxMjksIDI1LCA0MDk2LAorICAtMzgsIC03NCwgMTEyLCAzMjc2OCwKKyAgMTEyLCAtOTQsIC0xOCwgMzI3NjgsCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBjb2dfeWNiY3Jfc2R0dl90b195Y2Jjcl9oZHR2X21hdHJpeF84Yml0W10gPSB7CisgIDI1NiwgLTMwLCAtNTMsIDEwNjAwLAorICAwLCAyNjEsIDI5LCAtNDM2NywKKyAgMCwgMTksIDI2MiwgLTMyODksCit9OworCitzdGF0aWMgY29uc3QgZ2ludCBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0W10gPSB7CisgIDI1NiwgMjUsIDQ5LCAtOTUzNiwKKyAgMCwgMjUzLCAtMjgsIDM5NTgsCisgIDAsIC0xOSwgMjUyLCAyOTE4LAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgY29nX2lkZW50aXR5X21hdHJpeF84Yml0W10gPSB7CisgIDI1NiwgMCwgMCwgMCwKKyAgMCwgMjU2LCAwLCAwLAorICAwLCAwLCAyNTYsIDAsCit9OworCisjZGVmaW5lIEFQUExZX01BVFJJWChtLG8sdjEsdjIsdjMpICgobVtvKjRdICogdjEgKyBtW28qNCsxXSAqIHYyICsgbVtvKjQrMl0gKiB2MyArIG1bbyo0KzNdKSA+PiA4KQorCitzdGF0aWMgdm9pZAorZmlsbF9heXV2IChHc3RWaWRlb0JveEZpbGwgZmlsbF90eXBlLCBndWludCBiX2FscGhhLAorICAgIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSwgZ2Jvb2xlYW4gc2R0dikKK3sKKyAgZ3VpbnQzMiBlbXB0eV9waXhlbDsKKyAgZ3VpbnQ4ICpkZXN0OworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgc3RyaWRlOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKTsKKworICBiX2FscGhhID0gQ0xBTVAgKGJfYWxwaGEsIDAsIDI1NSk7CisKKyAgaWYgKHNkdHYpCisgICAgZW1wdHlfcGl4ZWwgPSBHVUlOVDMyX0ZST01fQkUgKChiX2FscGhhIDw8IDI0KSB8CisgICAgICAgICh5dXZfc2R0dl9jb2xvcnNfWVtmaWxsX3R5cGVdIDw8IDE2KSB8CisgICAgICAgICh5dXZfc2R0dl9jb2xvcnNfVVtmaWxsX3R5cGVdIDw8IDgpIHwgeXV2X3NkdHZfY29sb3JzX1ZbZmlsbF90eXBlXSk7CisgIGVsc2UKKyAgICBlbXB0eV9waXhlbCA9IEdVSU5UMzJfRlJPTV9CRSAoKGJfYWxwaGEgPDwgMjQpIHwKKyAgICAgICAgKHl1dl9oZHR2X2NvbG9yc19ZW2ZpbGxfdHlwZV0gPDwgMTYpIHwKKyAgICAgICAgKHl1dl9oZHR2X2NvbG9yc19VW2ZpbGxfdHlwZV0gPDwgOCkgfCB5dXZfaGR0dl9jb2xvcnNfVltmaWxsX3R5cGVdKTsKKworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLCAwKTsKKyAgc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoZnJhbWUsIDApOworCisgIGlmIChHX0xJS0VMWSAoc3RyaWRlID09IDQgKiB3aWR0aCkpCisgICAgdmlkZW9fYm94X29yY19zcGxhdF91MzIgKChndWludDMyICopIGRlc3QsIGVtcHR5X3BpeGVsLCB3aWR0aCAqIGhlaWdodCk7CisgIGVsc2UgaWYgKGhlaWdodCkgeworICAgIGZvciAoOyBoZWlnaHQ7IC0taGVpZ2h0KSB7CisgICAgICB2aWRlb19ib3hfb3JjX3NwbGF0X3UzMiAoKGd1aW50MzIgKikgZGVzdCwgZW1wdHlfcGl4ZWwsIHdpZHRoKTsKKyAgICAgIGRlc3QgKz0gc3RyaWRlOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorY29weV9heXV2X2F5dXYgKGd1aW50IGlfYWxwaGEsIEdzdFZpZGVvRnJhbWUgKiBkZXN0X2ZyYW1lLAorICAgIGdib29sZWFuIGRlc3Rfc2R0diwgZ2ludCBkZXN0X3gsIGdpbnQgZGVzdF95LCBHc3RWaWRlb0ZyYW1lICogc3JjX2ZyYW1lLAorICAgIGdib29sZWFuIHNyY19zZHR2LCBnaW50IHNyY194LCBnaW50IHNyY195LCBnaW50IHcsIGdpbnQgaCkKK3sKKyAgZ2ludCBpLCBqOworICBnaW50IHNyY19zdHJpZGU7CisgIGdpbnQgZGVzdF9zdHJpZGU7CisgIGd1aW50OCAqZGVzdCwgKnNyYzsKKworICBzcmNfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoc3JjX2ZyYW1lLCAwKTsKKyAgZGVzdF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChkZXN0X2ZyYW1lLCAwKTsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjX2ZyYW1lLCAwKTsKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0X2ZyYW1lLCAwKTsKKworICBkZXN0ID0gZGVzdCArIGRlc3RfeSAqIGRlc3Rfc3RyaWRlICsgZGVzdF94ICogNDsKKyAgc3JjID0gc3JjICsgc3JjX3kgKiBzcmNfc3RyaWRlICsgc3JjX3ggKiA0OworCisgIHcgKj0gNDsKKworICBpZiAoZGVzdF9zZHR2ICE9IHNyY19zZHR2KSB7CisgICAgZ2ludCBtYXRyaXhbMTJdOworICAgIGdpbnQgeSwgdSwgdjsKKworICAgIG1lbWNweSAobWF0cml4LAorICAgICAgICBkZXN0X3NkdHYgPyBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0IDoKKyAgICAgICAgY29nX3ljYmNyX3NkdHZfdG9feWNiY3JfaGR0dl9tYXRyaXhfOGJpdCwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqICs9IDQpIHsKKyAgICAgICAgLyogT1JDIEZJWE1FICovCisgICAgICAgIGRlc3Rbal0gPSAoc3JjW2pdICogaV9hbHBoYSkgPj4gODsKKyAgICAgICAgeSA9IHNyY1tqICsgMV07CisgICAgICAgIHUgPSBzcmNbaiArIDJdOworICAgICAgICB2ID0gc3JjW2ogKyAzXTsKKyAgICAgICAgZGVzdFtqICsgMV0gPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeSwgdSwgdik7CisgICAgICAgIGRlc3RbaiArIDJdID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHksIHUsIHYpOworICAgICAgICBkZXN0W2ogKyAzXSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5LCB1LCB2KTsKKyAgICAgIH0KKyAgICAgIGRlc3QgKz0gZGVzdF9zdHJpZGU7CisgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IHc7IGogKz0gNCkgeworICAgICAgICAvKiBPUkMgRklYTUUgKi8KKyAgICAgICAgZGVzdFtqXSA9IChzcmNbal0gKiBpX2FscGhhKSA+PiA4OworICAgICAgICBkZXN0W2ogKyAxXSA9IHNyY1tqICsgMV07CisgICAgICAgIGRlc3RbaiArIDJdID0gc3JjW2ogKyAyXTsKKyAgICAgICAgZGVzdFtqICsgM10gPSBzcmNbaiArIDNdOworICAgICAgfQorICAgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsKKyAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorY29weV9heXV2X2k0MjAgKGd1aW50IGlfYWxwaGEsIEdzdFZpZGVvRnJhbWUgKiBkZXN0X2ZyYW1lLAorICAgIGdib29sZWFuIGRlc3Rfc2R0diwgZ2ludCBkZXN0X3gsIGdpbnQgZGVzdF95LCBHc3RWaWRlb0ZyYW1lICogc3JjX2ZyYW1lLAorICAgIGdib29sZWFuIHNyY19zZHR2LCBnaW50IHNyY194LCBnaW50IHNyY195LCBnaW50IHcsIGdpbnQgaCkKK3sKKyAgZ2ludCBpLCBqOworICBndWludDggKmRlc3RZLCAqZGVzdFkyLCAqZGVzdFUsICpkZXN0VjsKKyAgZ2ludCBkZXN0X3N0cmlkZVksIGRlc3Rfc3RyaWRlVSwgZGVzdF9zdHJpZGVWOworICBjb25zdCBndWludDggKnNyYzI7CisgIGdpbnQgc3JjX3N0cmlkZTsKKyAgZ2ludCB5X2lkeCwgdXZfaWR4OworICBnaW50IHkxLCB5MiwgeTMsIHk0OworICBnaW50IHUxLCB1MiwgdTMsIHU0OworICBnaW50IHYxLCB2MiwgdjMsIHY0OworICBnaW50IG1hdHJpeFsxMl07CisgIGd1aW50OCAqc3JjOworICBnaW50IGRlc3RfaGVpZ2h0LCBzcmNfaGVpZ2h0LCBkZXN0X3dpZHRoOworCisgIGRlc3RfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoZGVzdF9mcmFtZSk7CisgIGRlc3Rfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGRlc3RfZnJhbWUpOworICBzcmNfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoc3JjX2ZyYW1lKTsKKworICBkZXN0X3N0cmlkZVkgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGRlc3RfZnJhbWUsIDApOworICBkZXN0X3N0cmlkZVUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGRlc3RfZnJhbWUsIDEpOworICBkZXN0X3N0cmlkZVYgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGRlc3RfZnJhbWUsIDIpOworCisgIHNyY19zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChzcmNfZnJhbWUsIDApOworCisgIGRlc3RZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdF9mcmFtZSwgMCk7CisgIGRlc3RVID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdF9mcmFtZSwgMSk7CisgIGRlc3RWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdF9mcmFtZSwgMik7CisKKyAgZGVzdFkgPSBkZXN0WSArIGRlc3RfeSAqIGRlc3Rfc3RyaWRlWSArIGRlc3RfeDsKKyAgZGVzdFkyID0gKGRlc3RfeSA8IGRlc3RfaGVpZ2h0KSA/IGRlc3RZICsgZGVzdF9zdHJpZGVZIDogZGVzdFk7CisgIGRlc3RVID0gZGVzdFUgKyAoZGVzdF95IC8gMikgKiBkZXN0X3N0cmlkZVUgKyBkZXN0X3ggLyAyOworICBkZXN0ViA9IGRlc3RWICsgKGRlc3RfeSAvIDIpICogZGVzdF9zdHJpZGVWICsgZGVzdF94IC8gMjsKKworICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjX2ZyYW1lLCAwKTsKKyAgc3JjID0gc3JjICsgc3JjX3kgKiBzcmNfc3RyaWRlICsgc3JjX3ggKiA0OworICBzcmMyID0gKHNyY195IDwgc3JjX2hlaWdodCkgPyBzcmMgKyBzcmNfc3RyaWRlIDogc3JjOworCisgIGggPSBkZXN0X3kgKyBoOworICB3ID0gZGVzdF94ICsgdzsKKworICBpZiAoc3JjX3NkdHYgIT0gZGVzdF9zZHR2KQorICAgIG1lbWNweSAobWF0cml4LAorICAgICAgICBkZXN0X3NkdHYgPyBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0IDoKKyAgICAgICAgY29nX3ljYmNyX3NkdHZfdG9feWNiY3JfaGR0dl9tYXRyaXhfOGJpdCwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKyAgZWxzZQorICAgIG1lbWNweSAobWF0cml4LCBjb2dfaWRlbnRpdHlfbWF0cml4XzhiaXQsIDEyICogc2l6ZW9mIChnaW50KSk7CisKKyAgLyogMS4gSGFuZGxlIHRoZSBmaXJzdCBkZXN0aW5hdGlvbiBzY2FubGluZSBzcGVjaWFsbHkgaWYgaXQKKyAgICogICAgZG9lc24ndCBzdGFydCBhdCB0aGUgbWFjcm8gcGl4ZWwgYm91bmRhcnksIGkuZS4gYmxlbmQKKyAgICogICAgd2l0aCB0aGUgYmFja2dyb3VuZCEgKi8KKyAgaWYgKGRlc3RfeSAlIDIgPT0gMSkgeworICAgIC8qIDEuMS4gSGFuZGxlIHRoZSBmaXJzdCBkZXN0aW5hdGlvbiBwaXhlbCBpZiBpdCBkb2Vzbid0CisgICAgICogICAgICBzdGFydCBhdCB0aGUgbWFjcm8gcGl4ZWwgYm91bmRhcnksIGkuZS4gYmxlbmQgd2l0aAorICAgICAqICAgICAgdGhlIGJhY2tncm91bmQhICovCisgICAgaWYgKGRlc3RfeCAlIDIgPT0gMSkgeworICAgICAgeTEgPSBzcmNbNCAqIDAgKyAxXTsKKyAgICAgIHUxID0gc3JjWzQgKiAwICsgMl07CisgICAgICB2MSA9IHNyY1s0ICogMCArIDNdOworCisgICAgICBkZXN0WVswXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVswXSA9CisgICAgICAgICAgQ0xBTVAgKCgzICogZGVzdFVbMF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkpIC8gNCwgMCwKKyAgICAgICAgICAyNTUpOworICAgICAgZGVzdFZbMF0gPQorICAgICAgICAgIENMQU1QICgoMyAqIGRlc3RWWzBdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwgdjEpKSAvIDQsIDAsCisgICAgICAgICAgMjU1KTsKKworICAgICAgaiA9IGRlc3RfeCArIDE7CisgICAgICB5X2lkeCA9IHV2X2lkeCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGogPSBkZXN0X3g7CisgICAgICB5X2lkeCA9IHV2X2lkeCA9IDA7CisgICAgfQorCisgICAgLyogMS4yLiBDb3B5IGFsbCBtYWNybyBwaXhlbHMgZnJvbSB0aGUgc291cmNlIHRvIHRoZSBkZXN0aW5hdGlvbgorICAgICAqICAgICAgYnV0IGJsZW5kIHdpdGggdGhlIGJhY2tncm91bmQgYmVjYXVzZSB3ZSdyZSBvbmx5IGZpbGxpbmcKKyAgICAgKiAgICAgIHRoZSBsb3dlciBwYXJ0IG9mIHRoZSBtYWNybyBwaXhlbHMuICovCisgICAgZm9yICg7IGogPCB3IC0gMTsgaiArPSAyKSB7CisgICAgICB5MSA9IHNyY1s0ICogeV9pZHggKyAxXTsKKyAgICAgIHkyID0gc3JjWzQgKiB5X2lkeCArIDQgKyAxXTsKKworICAgICAgdTEgPSBzcmNbNCAqIHlfaWR4ICsgMl07CisgICAgICB1MiA9IHNyY1s0ICogeV9pZHggKyA0ICsgMl07CisKKyAgICAgIHYxID0gc3JjWzQgKiB5X2lkeCArIDNdOworICAgICAgdjIgPSBzcmNbNCAqIHlfaWR4ICsgNCArIDNdOworCisgICAgICBkZXN0WVt5X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFlbeV9pZHggKyAxXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUyLCB2MiksIDAsIDI1NSk7CisgICAgICBkZXN0VVt1dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgICgyICogZGVzdFVbdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTIsIHUyLCB2MikpIC8gNCwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKDIgKiBkZXN0Vlt1dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwgdTIsIHYyKSkgLyA0LCAwLCAyNTUpOworCisgICAgICB5X2lkeCArPSAyOworICAgICAgdXZfaWR4Kys7CisgICAgfQorCisgICAgLyogMS4zLiBOb3cgY29weSB0aGUgbGFzdCBwaXhlbCBpZiBvbmUgZXhpc3RzIGFuZCBibGVuZCBpdAorICAgICAqICAgICAgd2l0aCB0aGUgYmFja2dyb3VuZCBiZWNhdXNlIHdlIG9ubHkgZmlsbCBwYXJ0IG9mCisgICAgICogICAgICB0aGUgbWFjcm8gcGl4ZWwuIEluIGNhc2UgdGhpcyBpcyB0aGUgbGFzdCBwaXhlbCBvZgorICAgICAqICAgICAgdGhlIGRlc3RpbmF0aW9uIHdlIHdpbGwgYSBsYXJnZXIgcGFydC4gKi8KKyAgICBpZiAoaiA9PSB3IC0gMSAmJiBqID09IGRlc3Rfd2lkdGggLSAxKSB7CisgICAgICB5MSA9IHNyY1s0ICogeV9pZHggKyAxXTsKKyAgICAgIHUxID0gc3JjWzQgKiB5X2lkeCArIDJdOworICAgICAgdjEgPSBzcmNbNCAqIHlfaWR4ICsgM107CisKKyAgICAgIGRlc3RZW3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVt1dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgIChkZXN0VVt1dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwgdjEpKSAvIDIsIDAsIDI1NSk7CisgICAgICBkZXN0Vlt1dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgIChkZXN0Vlt1dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwgdjEpKSAvIDIsIDAsIDI1NSk7CisgICAgfSBlbHNlIGlmIChqID09IHcgLSAxKSB7CisgICAgICB5MSA9IHNyY1s0ICogeV9pZHggKyAxXTsKKyAgICAgIHUxID0gc3JjWzQgKiB5X2lkeCArIDJdOworICAgICAgdjEgPSBzcmNbNCAqIHlfaWR4ICsgM107CisKKyAgICAgIGRlc3RZW3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVt1dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgICgzICogZGVzdFVbdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyA0LCAwLAorICAgICAgICAgIDI1NSk7CisgICAgICBkZXN0Vlt1dl9pZHhdID0KKyAgICAgICAgICBDTEFNUCAoKDMgKiBkZXN0Vlt1dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwgdjEpKSAvIDQsCisgICAgICAgICAgMCwgMjU1KTsKKyAgICB9CisKKyAgICBkZXN0WSArPSBkZXN0X3N0cmlkZVk7CisgICAgZGVzdFkyICs9IGRlc3Rfc3RyaWRlWTsKKyAgICBkZXN0VSArPSBkZXN0X3N0cmlkZVU7CisgICAgZGVzdFYgKz0gZGVzdF9zdHJpZGVWOworICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIHNyYzIgKz0gc3JjX3N0cmlkZTsKKyAgICBpID0gZGVzdF95ICsgMTsKKyAgfSBlbHNlIHsKKyAgICBpID0gZGVzdF95OworICB9CisKKyAgLyogMi4gQ29weSBhbGwgbWFjcm8gcGl4ZWwgc2NhbmxpbmVzLCB0aGUgZGVzdGluYXRpb24gc2NhbmxpbmUKKyAgICogICAgbm93IHN0YXJ0cyBhdCBtYWNybyBwaXhlbCBib3VuZGFyeS4gKi8KKyAgZm9yICg7IGkgPCBoIC0gMTsgaSArPSAyKSB7CisgICAgLyogMi4xLiBIYW5kbGUgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIHBpeGVsIGlmIGl0IGRvZXNuJ3QKKyAgICAgKiAgICAgIHN0YXJ0IGF0IHRoZSBtYWNybyBwaXhlbCBib3VuZGFyeSwgaS5lLiBibGVuZCB3aXRoCisgICAgICogICAgICB0aGUgYmFja2dyb3VuZCEgKi8KKyAgICBpZiAoZGVzdF94ICUgMiA9PSAxKSB7CisgICAgICB5MSA9IHNyY1s0ICogMCArIDFdOworICAgICAgeTIgPSBzcmMyWzQgKiAwICsgMV07CisgICAgICB1MSA9IHNyY1s0ICogMCArIDJdOworICAgICAgdTIgPSBzcmMyWzQgKiAwICsgMl07CisgICAgICB2MSA9IHNyY1s0ICogMCArIDNdOworICAgICAgdjIgPSBzcmMyWzQgKiAwICsgM107CisKKyAgICAgIGRlc3RZWzBdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RZMlswXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUyLCB2MiksIDAsIDI1NSk7CisgICAgICBkZXN0VVswXSA9IENMQU1QICgKKyAgICAgICAgICAoMiAqIGRlc3RVWzBdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MiwgdTIsIHYyKSkgLyA0LCAwLCAyNTUpOworICAgICAgZGVzdFZbMF0gPSBDTEFNUCAoCisgICAgICAgICAgKDIgKiBkZXN0VlswXSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTIsIHUyLCB2MikpIC8gNCwgMCwgMjU1KTsKKyAgICAgIGogPSBkZXN0X3ggKyAxOworICAgICAgeV9pZHggPSB1dl9pZHggPSAxOworICAgIH0gZWxzZSB7CisgICAgICBqID0gZGVzdF94OworICAgICAgeV9pZHggPSB1dl9pZHggPSAwOworICAgIH0KKworICAgIC8qIDIuMi4gQ29weSBhbGwgbWFjcm8gcGl4ZWxzIGZyb20gdGhlIHNvdXJjZSB0byB0aGUgZGVzdGluYXRpb24uCisgICAgICogICAgICBBbGwgcGl4ZWxzIG5vdyBzdGFydCBhdCBtYWNybyBwaXhlbCBib3VuZGFyeSwgaS5lLiBubworICAgICAqICAgICAgYmxlbmRpbmcgd2l0aCB0aGUgYmFja2dyb3VuZCBpcyBuZWNlc3NhcnkuICovCisgICAgZm9yICg7IGogPCB3IC0gMTsgaiArPSAyKSB7CisgICAgICB5MSA9IHNyY1s0ICogeV9pZHggKyAxXTsKKyAgICAgIHkyID0gc3JjWzQgKiB5X2lkeCArIDQgKyAxXTsKKyAgICAgIHkzID0gc3JjMls0ICogeV9pZHggKyAxXTsKKyAgICAgIHk0ID0gc3JjMls0ICogeV9pZHggKyA0ICsgMV07CisKKyAgICAgIHUxID0gc3JjWzQgKiB5X2lkeCArIDJdOworICAgICAgdTIgPSBzcmNbNCAqIHlfaWR4ICsgNCArIDJdOworICAgICAgdTMgPSBzcmMyWzQgKiB5X2lkeCArIDJdOworICAgICAgdTQgPSBzcmMyWzQgKiB5X2lkeCArIDQgKyAyXTsKKworICAgICAgdjEgPSBzcmNbNCAqIHlfaWR4ICsgM107CisgICAgICB2MiA9IHNyY1s0ICogeV9pZHggKyA0ICsgM107CisgICAgICB2MyA9IHNyYzJbNCAqIHlfaWR4ICsgM107CisgICAgICB2NCA9IHNyYzJbNCAqIHlfaWR4ICsgNCArIDNdOworCisgICAgICBkZXN0WVt5X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFlbeV9pZHggKyAxXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUyLCB2MiksIDAsIDI1NSk7CisgICAgICBkZXN0WTJbeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MywgdTMsIHYzKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RZMlt5X2lkeCArIDFdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5NCwgdTQsIHY0KSwgMCwgMjU1KTsKKworICAgICAgZGVzdFVbdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkyLAorICAgICAgICAgICAgICAgICAgdTIsIHYyKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MywgdTMsCisgICAgICAgICAgICAgICAgICB2MykgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTQsIHU0LCB2NCkpIC8gNCwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwKKyAgICAgICAgICAgICAgICAgIHUyLCB2MikgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTMsIHUzLAorICAgICAgICAgICAgICAgICAgdjMpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHk0LCB1NCwgdjQpKSAvIDQsIDAsIDI1NSk7CisKKyAgICAgIHlfaWR4ICs9IDI7CisgICAgICB1dl9pZHgrKzsKKyAgICB9CisKKyAgICAvKiAyLjMuIE5vdyBjb3B5IHRoZSBsYXN0IHBpeGVsIGlmIG9uZSBleGlzdHMgYW5kIGJsZW5kIGl0CisgICAgICogICAgICB3aXRoIHRoZSBiYWNrZ3JvdW5kIGJlY2F1c2Ugd2Ugb25seSBmaWxsIHBhcnQgb2YKKyAgICAgKiAgICAgIHRoZSBtYWNybyBwaXhlbC4gSW4gY2FzZSB0aGlzIGlzIHRoZSBsYXN0IHBpeGVsIG9mCisgICAgICogICAgICB0aGUgZGVzdGluYXRpb24gd2Ugd2lsbCBhIGxhcmdlciBwYXJ0LiAqLworICAgIGlmIChqID09IHcgLSAxICYmIGogPT0gZGVzdF93aWR0aCAtIDEpIHsKKyAgICAgIHkxID0gc3JjWzQgKiB5X2lkeCArIDFdOworICAgICAgeTIgPSBzcmMyWzQgKiB5X2lkeCArIDFdOworCisgICAgICB1MSA9IHNyY1s0ICogeV9pZHggKyAyXTsKKyAgICAgIHUyID0gc3JjMls0ICogeV9pZHggKyAyXTsKKworICAgICAgdjEgPSBzcmNbNCAqIHlfaWR4ICsgM107CisgICAgICB2MiA9IHNyYzJbNCAqIHlfaWR4ICsgM107CisKKyAgICAgIGRlc3RZW3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WTJbeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MiwgdTIsIHYyKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVW3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwKKyAgICAgICAgICAgICAgICAgIHUyLCB2MikpIC8gMiwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwKKyAgICAgICAgICAgICAgICAgIHUyLCB2MikpIC8gMiwgMCwgMjU1KTsKKyAgICB9IGVsc2UgaWYgKGogPT0gdyAtIDEpIHsKKyAgICAgIHkxID0gc3JjWzQgKiB5X2lkeCArIDFdOworICAgICAgeTIgPSBzcmMyWzQgKiB5X2lkeCArIDFdOworCisgICAgICB1MSA9IHNyY1s0ICogeV9pZHggKyAyXTsKKyAgICAgIHUyID0gc3JjMls0ICogeV9pZHggKyAyXTsKKworICAgICAgdjEgPSBzcmNbNCAqIHlfaWR4ICsgM107CisgICAgICB2MiA9IHNyYzJbNCAqIHlfaWR4ICsgM107CisKKyAgICAgIGRlc3RZW3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WTJbeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MiwgdTIsIHYyKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVW3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKDIgKiBkZXN0VVt1dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwgdTIsIHYyKSkgLyA0LCAwLCAyNTUpOworICAgICAgZGVzdFZbdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoMiAqIGRlc3RWW3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLAorICAgICAgICAgICAgICAgICAgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkyLCB1MiwgdjIpKSAvIDQsIDAsIDI1NSk7CisgICAgfQorCisgICAgZGVzdFkgKz0gMiAqIGRlc3Rfc3RyaWRlWTsKKyAgICBkZXN0WTIgKz0gMiAqIGRlc3Rfc3RyaWRlWTsKKyAgICBkZXN0VSArPSBkZXN0X3N0cmlkZVU7CisgICAgZGVzdFYgKz0gZGVzdF9zdHJpZGVWOworICAgIHNyYyArPSAyICogc3JjX3N0cmlkZTsKKyAgICBzcmMyICs9IDIgKiBzcmNfc3RyaWRlOworICB9CisKKyAgLyogMy4gSGFuZGxlIHRoZSBsYXN0IHNjYW5saW5lIGlmIG9uZSBleGlzdHMuIFRoaXMgYWdhaW4KKyAgICogICAgZG9lc24ndCBzdGFydCBhdCBtYWNybyBwaXhlbCBib3VuZGFyeSBidXQgc2hvdWxkCisgICAqICAgIG9ubHkgZmlsbCB0aGUgdXBwZXIgcGFydCBvZiB0aGUgbWFjcm8gcGl4ZWxzLiAqLworICBpZiAoaSA9PSBoIC0gMSAmJiBpID09IGRlc3RfaGVpZ2h0IC0gMSkgeworICAgIC8qIDMuMS4gSGFuZGxlIHRoZSBmaXJzdCBkZXN0aW5hdGlvbiBwaXhlbCBpZiBpdCBkb2Vzbid0CisgICAgICogICAgICBzdGFydCBhdCB0aGUgbWFjcm8gcGl4ZWwgYm91bmRhcnksIGkuZS4gYmxlbmQgd2l0aAorICAgICAqICAgICAgdGhlIGJhY2tncm91bmQhICovCisgICAgaWYgKGRlc3RfeCAlIDIgPT0gMSkgeworICAgICAgeTEgPSBzcmNbNCAqIDAgKyAxXTsKKyAgICAgIHUxID0gc3JjWzQgKiAwICsgMl07CisgICAgICB2MSA9IHNyY1s0ICogMCArIDNdOworCisgICAgICBkZXN0WVswXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVswXSA9CisgICAgICAgICAgQ0xBTVAgKChkZXN0VVswXSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyAyLCAwLCAyNTUpOworICAgICAgZGVzdFZbMF0gPQorICAgICAgICAgIENMQU1QICgoZGVzdFZbMF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTEsIHUxLCB2MSkpIC8gMiwgMCwgMjU1KTsKKworICAgICAgaiA9IGRlc3RfeCArIDE7CisgICAgICB5X2lkeCA9IHV2X2lkeCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGogPSBkZXN0X3g7CisgICAgICB5X2lkeCA9IHV2X2lkeCA9IDA7CisgICAgfQorCisgICAgLyogMy4yLiBDb3B5IGFsbCBtYWNybyBwaXhlbHMgZnJvbSB0aGUgc291cmNlIHRvIHRoZSBkZXN0aW5hdGlvbgorICAgICAqICAgICAgYnV0IGJsZW5kIHdpdGggdGhlIGJhY2tncm91bmQgYmVjYXVzZSB3ZSdyZSBvbmx5IGZpbGxpbmcKKyAgICAgKiAgICAgIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSBtYWNybyBwaXhlbHMuICovCisgICAgZm9yICg7IGogPCB3IC0gMTsgaiArPSAyKSB7CisgICAgICB5MSA9IHNyY1s0ICogeV9pZHggKyAxXTsKKyAgICAgIHkyID0gc3JjWzQgKiB5X2lkeCArIDQgKyAxXTsKKworICAgICAgdTEgPSBzcmNbNCAqIHlfaWR4ICsgMl07CisgICAgICB1MiA9IHNyY1s0ICogeV9pZHggKyA0ICsgMl07CisKKyAgICAgIHYxID0gc3JjWzQgKiB5X2lkeCArIDNdOworICAgICAgdjIgPSBzcmNbNCAqIHlfaWR4ICsgNCArIDNdOworCisgICAgICBkZXN0WVt5X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFlbeV9pZHggKyAxXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUyLCB2MiksIDAsIDI1NSk7CisKKyAgICAgIGRlc3RVW3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKDIgKiBkZXN0VVt1dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MiwgdTIsIHYyKSkgLyA0LCAwLCAyNTUpOworICAgICAgZGVzdFZbdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoMiAqIGRlc3RWW3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTEsIHUxLAorICAgICAgICAgICAgICAgICAgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkyLCB1MiwgdjIpKSAvIDQsIDAsIDI1NSk7CisKKyAgICAgIHlfaWR4ICs9IDI7CisgICAgICB1dl9pZHgrKzsKKyAgICB9CisKKyAgICAvKiAzLjMuIE5vdyBjb3B5IHRoZSBsYXN0IHBpeGVsIGlmIG9uZSBleGlzdHMgYW5kIGJsZW5kIGl0CisgICAgICogICAgICB3aXRoIHRoZSBiYWNrZ3JvdW5kIGJlY2F1c2Ugd2Ugb25seSBmaWxsIHBhcnQgb2YKKyAgICAgKiAgICAgIHRoZSBtYWNybyBwaXhlbC4gSW4gY2FzZSB0aGlzIGlzIHRoZSBsYXN0IHBpeGVsIG9mCisgICAgICogICAgICB0aGUgZGVzdGluYXRpb24gd2Ugd2lsbCBhIGxhcmdlciBwYXJ0LiAqLworICAgIGlmIChqID09IHcgLSAxICYmIGogPT0gZGVzdF93aWR0aCAtIDEpIHsKKyAgICAgIHkxID0gc3JjWzQgKiB5X2lkeCArIDFdOworICAgICAgdTEgPSBzcmNbNCAqIHlfaWR4ICsgMl07CisgICAgICB2MSA9IHNyY1s0ICogeV9pZHggKyAzXTsKKworICAgICAgZGVzdFlbeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVW3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKGRlc3RVW3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkpIC8gMiwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKGRlc3RWW3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkpIC8gMiwgMCwgMjU1KTsKKyAgICB9IGVsc2UgaWYgKGogPT0gdyAtIDEpIHsKKyAgICAgIHkxID0gc3JjWzQgKiB5X2lkeCArIDFdOworICAgICAgdTEgPSBzcmNbNCAqIHlfaWR4ICsgMl07CisgICAgICB2MSA9IHNyY1s0ICogeV9pZHggKyAzXTsKKworICAgICAgZGVzdFlbeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVW3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKDMgKiBkZXN0VVt1dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwgdjEpKSAvIDQsIDAsCisgICAgICAgICAgMjU1KTsKKyAgICAgIGRlc3RWW3V2X2lkeF0gPQorICAgICAgICAgIENMQU1QICgoMyAqIGRlc3RWW3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkpIC8gNCwKKyAgICAgICAgICAwLCAyNTUpOworICAgIH0KKyAgfSBlbHNlIGlmIChpID09IGggLSAxKSB7CisgICAgLyogMy4xLiBIYW5kbGUgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIHBpeGVsIGlmIGl0IGRvZXNuJ3QKKyAgICAgKiAgICAgIHN0YXJ0IGF0IHRoZSBtYWNybyBwaXhlbCBib3VuZGFyeSwgaS5lLiBibGVuZCB3aXRoCisgICAgICogICAgICB0aGUgYmFja2dyb3VuZCEgKi8KKyAgICBpZiAoZGVzdF94ICUgMiA9PSAxKSB7CisgICAgICB5MSA9IHNyY1s0ICogMCArIDFdOworICAgICAgdTEgPSBzcmNbNCAqIDAgKyAyXTsKKyAgICAgIHYxID0gc3JjWzQgKiAwICsgM107CisKKyAgICAgIGRlc3RZWzBdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVWzBdID0KKyAgICAgICAgICBDTEFNUCAoKDMgKiBkZXN0VVswXSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyA0LCAwLAorICAgICAgICAgIDI1NSk7CisgICAgICBkZXN0VlswXSA9CisgICAgICAgICAgQ0xBTVAgKCgzICogZGVzdFZbMF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTEsIHUxLCB2MSkpIC8gNCwgMCwKKyAgICAgICAgICAyNTUpOworCisgICAgICBqID0gZGVzdF94ICsgMTsKKyAgICAgIHlfaWR4ID0gdXZfaWR4ID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgaiA9IGRlc3RfeDsKKyAgICAgIHlfaWR4ID0gdXZfaWR4ID0gMDsKKyAgICB9CisKKyAgICAvKiAzLjIuIENvcHkgYWxsIG1hY3JvIHBpeGVscyBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlIGRlc3RpbmF0aW9uCisgICAgICogICAgICBidXQgYmxlbmQgd2l0aCB0aGUgYmFja2dyb3VuZCBiZWNhdXNlIHdlJ3JlIG9ubHkgZmlsbGluZworICAgICAqICAgICAgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIG1hY3JvIHBpeGVscy4gKi8KKyAgICBmb3IgKDsgaiA8IHcgLSAxOyBqICs9IDIpIHsKKyAgICAgIHkxID0gc3JjWzQgKiB5X2lkeCArIDFdOworICAgICAgeTIgPSBzcmNbNCAqIHlfaWR4ICsgNCArIDFdOworCisgICAgICB1MSA9IHNyY1s0ICogeV9pZHggKyAyXTsKKyAgICAgIHUyID0gc3JjWzQgKiB5X2lkeCArIDQgKyAyXTsKKworICAgICAgdjEgPSBzcmNbNCAqIHlfaWR4ICsgM107CisgICAgICB2MiA9IHNyY1s0ICogeV9pZHggKyA0ICsgM107CisKKyAgICAgIGRlc3RZW3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WVt5X2lkeCArIDFdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MiwgdTIsIHYyKSwgMCwgMjU1KTsKKworICAgICAgZGVzdFVbdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoMiAqIGRlc3RVW3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLAorICAgICAgICAgICAgICAgICAgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkyLCB1MiwgdjIpKSAvIDQsIDAsIDI1NSk7CisgICAgICBkZXN0Vlt1dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgICgyICogZGVzdFZbdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTIsIHUyLCB2MikpIC8gNCwgMCwgMjU1KTsKKworICAgICAgeV9pZHggKz0gMjsKKyAgICAgIHV2X2lkeCsrOworICAgIH0KKworICAgIC8qIDMuMy4gTm93IGNvcHkgdGhlIGxhc3QgcGl4ZWwgaWYgb25lIGV4aXN0cyBhbmQgYmxlbmQgaXQKKyAgICAgKiAgICAgIHdpdGggdGhlIGJhY2tncm91bmQgYmVjYXVzZSB3ZSBvbmx5IGZpbGwgcGFydCBvZgorICAgICAqICAgICAgdGhlIG1hY3JvIHBpeGVsLiBJbiBjYXNlIHRoaXMgaXMgdGhlIGxhc3QgcGl4ZWwgb2YKKyAgICAgKiAgICAgIHRoZSBkZXN0aW5hdGlvbiB3ZSB3aWxsIGEgbGFyZ2VyIHBhcnQuICovCisgICAgaWYgKGogPT0gdyAtIDEgJiYgaiA9PSBkZXN0X3dpZHRoIC0gMSkgeworICAgICAgeTEgPSBzcmNbNCAqIHlfaWR4ICsgMV07CisgICAgICB1MSA9IHNyY1s0ICogeV9pZHggKyAyXTsKKyAgICAgIHYxID0gc3JjWzQgKiB5X2lkeCArIDNdOworCisgICAgICBkZXN0WVt5X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFVbdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoZGVzdFVbdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyAyLCAwLCAyNTUpOworICAgICAgZGVzdFZbdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoZGVzdFZbdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyAyLCAwLCAyNTUpOworICAgIH0gZWxzZSBpZiAoaiA9PSB3IC0gMSkgeworICAgICAgeTEgPSBzcmNbNCAqIHlfaWR4ICsgMV07CisgICAgICB1MSA9IHNyY1s0ICogeV9pZHggKyAyXTsKKyAgICAgIHYxID0gc3JjWzQgKiB5X2lkeCArIDNdOworCisgICAgICBkZXN0WVt5X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFVbdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoMyAqIGRlc3RVW3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkpIC8gNCwgMCwKKyAgICAgICAgICAyNTUpOworICAgICAgZGVzdFZbdXZfaWR4XSA9CisgICAgICAgICAgQ0xBTVAgKCgzICogZGVzdFZbdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyA0LAorICAgICAgICAgIDAsIDI1NSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitmaWxsX3BsYW5hcl95dXYgKEdzdFZpZGVvQm94RmlsbCBmaWxsX3R5cGUsIGd1aW50IGJfYWxwaGEsCisgICAgR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBnYm9vbGVhbiBzZHR2KQoreworICBndWludDggZW1wdHlfcGl4ZWxbM107CisgIGd1aW50OCAqZGVzdFksICpkZXN0VSwgKmRlc3RWOworICBnaW50IHN0cmlkZVksIHN0cmlkZVUsIHN0cmlkZVY7CisgIGdpbnQgaGVpZ2h0WSwgaGVpZ2h0VSwgaGVpZ2h0VjsKKyAgZ2ludCB3aWR0aFksIHdpZHRoVSwgd2lkdGhWOworCisgIGlmIChzZHR2KSB7CisgICAgZW1wdHlfcGl4ZWxbMF0gPSB5dXZfc2R0dl9jb2xvcnNfWVtmaWxsX3R5cGVdOworICAgIGVtcHR5X3BpeGVsWzFdID0geXV2X3NkdHZfY29sb3JzX1VbZmlsbF90eXBlXTsKKyAgICBlbXB0eV9waXhlbFsyXSA9IHl1dl9zZHR2X2NvbG9yc19WW2ZpbGxfdHlwZV07CisgIH0gZWxzZSB7CisgICAgZW1wdHlfcGl4ZWxbMF0gPSB5dXZfaGR0dl9jb2xvcnNfWVtmaWxsX3R5cGVdOworICAgIGVtcHR5X3BpeGVsWzFdID0geXV2X2hkdHZfY29sb3JzX1VbZmlsbF90eXBlXTsKKyAgICBlbXB0eV9waXhlbFsyXSA9IHl1dl9oZHR2X2NvbG9yc19WW2ZpbGxfdHlwZV07CisgIH0KKworICBzdHJpZGVZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZSwgMCk7CisgIHN0cmlkZVUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAxKTsKKyAgc3RyaWRlViA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIDIpOworCisgIGRlc3RZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZnJhbWUsIDApOworICBkZXN0VSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAxKTsKKyAgZGVzdFYgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgMik7CisKKyAgd2lkdGhZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGZyYW1lLCAwKTsKKyAgd2lkdGhVID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGZyYW1lLCAxKTsKKyAgd2lkdGhWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGZyYW1lLCAyKTsKKworICBoZWlnaHRZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgMCk7CisgIGhlaWdodFUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9IRUlHSFQgKGZyYW1lLCAxKTsKKyAgaGVpZ2h0ViA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZnJhbWUsIDIpOworCisgIGlmIChzdHJpZGVZID09IHdpZHRoWSkgeworICAgIG1lbXNldCAoZGVzdFksIGVtcHR5X3BpeGVsWzBdLCBzdHJpZGVZICogaGVpZ2h0WSk7CisgIH0gZWxzZSBpZiAoaGVpZ2h0WSkgeworICAgIGZvciAoOyBoZWlnaHRZOyAtLWhlaWdodFkpIHsKKyAgICAgIG1lbXNldCAoZGVzdFksIGVtcHR5X3BpeGVsWzBdLCB3aWR0aFkpOworICAgICAgZGVzdFkgKz0gc3RyaWRlWTsKKyAgICB9CisgIH0KKyAgaWYgKHN0cmlkZVUgPT0gd2lkdGhVKSB7CisgICAgbWVtc2V0IChkZXN0VSwgZW1wdHlfcGl4ZWxbMV0sIHN0cmlkZVUgKiBoZWlnaHRVKTsKKyAgfSBlbHNlIGlmIChoZWlnaHRVKSB7CisgICAgZm9yICg7IGhlaWdodFU7IC0taGVpZ2h0VSkgeworICAgICAgbWVtc2V0IChkZXN0VSwgZW1wdHlfcGl4ZWxbMV0sIHdpZHRoVSk7CisgICAgICBkZXN0VSArPSBzdHJpZGVVOworICAgIH0KKyAgfQorICBpZiAoc3RyaWRlViA9PSB3aWR0aFYpIHsKKyAgICBtZW1zZXQgKGRlc3RWLCBlbXB0eV9waXhlbFsyXSwgc3RyaWRlViAqIGhlaWdodFYpOworICB9IGVsc2UgaWYgKGhlaWdodFYpIHsKKyAgICBmb3IgKDsgaGVpZ2h0VjsgLS1oZWlnaHRWKSB7CisgICAgICBtZW1zZXQgKGRlc3RWLCBlbXB0eV9waXhlbFsyXSwgd2lkdGhWKTsKKyAgICAgIGRlc3RWICs9IHN0cmlkZVY7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5X3k0NDRfeTQ0NCAoZ3VpbnQgaV9hbHBoYSwgR3N0VmlkZW9GcmFtZSAqIGRlc3QsCisgICAgZ2Jvb2xlYW4gZGVzdF9zZHR2LCBnaW50IGRlc3RfeCwgZ2ludCBkZXN0X3ksIEdzdFZpZGVvRnJhbWUgKiBzcmMsCisgICAgZ2Jvb2xlYW4gc3JjX3NkdHYsIGdpbnQgc3JjX3gsIGdpbnQgc3JjX3ksIGdpbnQgdywgZ2ludCBoKQoreworICBnaW50IGksIGo7CisgIGd1aW50OCAqZGVzdFksICpkZXN0VSwgKmRlc3RWOworICBjb25zdCBndWludDggKnNyY1ksICpzcmNVLCAqc3JjVjsKKyAgZ2ludCBkZXN0X3N0cmlkZVksIGRlc3Rfc3RyaWRlVSwgZGVzdF9zdHJpZGVWOworICBnaW50IHNyY19zdHJpZGVZLCBzcmNfc3RyaWRlVSwgc3JjX3N0cmlkZVY7CisKKyAgZGVzdF9zdHJpZGVZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0LCAwKTsKKyAgZGVzdF9zdHJpZGVVID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0LCAxKTsKKyAgZGVzdF9zdHJpZGVWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0LCAyKTsKKworICBzcmNfc3RyaWRlWSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoc3JjLCAwKTsKKyAgc3JjX3N0cmlkZVUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKHNyYywgMSk7CisgIHNyY19zdHJpZGVWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChzcmMsIDIpOworCisgIGRlc3RZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdCwgMCk7CisgIGRlc3RVID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdCwgMSk7CisgIGRlc3RWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdCwgMik7CisKKyAgc3JjWSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKHNyYywgMCk7CisgIHNyY1UgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChzcmMsIDEpOworICBzcmNWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoc3JjLCAyKTsKKworICBkZXN0WSA9IGRlc3RZICsgZGVzdF95ICogZGVzdF9zdHJpZGVZICsgZGVzdF94OworICBkZXN0VSA9IGRlc3RVICsgZGVzdF95ICogZGVzdF9zdHJpZGVVICsgZGVzdF94OworICBkZXN0ViA9IGRlc3RWICsgZGVzdF95ICogZGVzdF9zdHJpZGVWICsgZGVzdF94OworCisgIHNyY1kgPSBzcmNZICsgc3JjX3kgKiBzcmNfc3RyaWRlWSArIHNyY194OworICBzcmNVID0gc3JjVSArIHNyY195ICogc3JjX3N0cmlkZVUgKyBzcmNfeDsKKyAgc3JjViA9IHNyY1YgKyBzcmNfeSAqIHNyY19zdHJpZGVWICsgc3JjX3g7CisKKyAgaWYgKHNyY19zZHR2ICE9IGRlc3Rfc2R0dikgeworICAgIGdpbnQgbWF0cml4WzEyXTsKKyAgICBnaW50IHksIHUsIHY7CisKKyAgICBtZW1jcHkgKG1hdHJpeCwKKyAgICAgICAgZGVzdF9zZHR2ID8gY29nX3ljYmNyX2hkdHZfdG9feWNiY3Jfc2R0dl9tYXRyaXhfOGJpdCA6CisgICAgICAgIGNvZ195Y2Jjcl9zZHR2X3RvX3ljYmNyX2hkdHZfbWF0cml4XzhiaXQsIDEyICogc2l6ZW9mIChnaW50KSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgdzsgaisrKSB7CisgICAgICAgIHkgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgc3JjWVtqXSwgc3JjVVtqXSwgc3JjVltqXSk7CisgICAgICAgIHUgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgc3JjWVtqXSwgc3JjVVtqXSwgc3JjVltqXSk7CisgICAgICAgIHYgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgc3JjWVtqXSwgc3JjVVtqXSwgc3JjVltqXSk7CisKKyAgICAgICAgZGVzdFlbal0gPSB5OworICAgICAgICBkZXN0VVtqXSA9IHU7CisgICAgICAgIGRlc3RWW2pdID0gdjsKKyAgICAgIH0KKyAgICAgIGRlc3RZICs9IGRlc3Rfc3RyaWRlWTsKKyAgICAgIGRlc3RVICs9IGRlc3Rfc3RyaWRlVTsKKyAgICAgIGRlc3RWICs9IGRlc3Rfc3RyaWRlVjsKKworICAgICAgc3JjWSArPSBzcmNfc3RyaWRlWTsKKyAgICAgIHNyY1UgKz0gc3JjX3N0cmlkZVU7CisgICAgICBzcmNWICs9IHNyY19zdHJpZGVWOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICBtZW1jcHkgKGRlc3RZLCBzcmNZLCB3KTsKKyAgICAgIG1lbWNweSAoZGVzdFUsIHNyY1UsIHcpOworICAgICAgbWVtY3B5IChkZXN0Viwgc3JjViwgdyk7CisKKyAgICAgIGRlc3RZICs9IGRlc3Rfc3RyaWRlWTsKKyAgICAgIGRlc3RVICs9IGRlc3Rfc3RyaWRlVTsKKyAgICAgIGRlc3RWICs9IGRlc3Rfc3RyaWRlVjsKKworICAgICAgc3JjWSArPSBzcmNfc3RyaWRlWTsKKyAgICAgIHNyY1UgKz0gc3JjX3N0cmlkZVU7CisgICAgICBzcmNWICs9IHNyY19zdHJpZGVWOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorY29weV95NDJiX3k0MmIgKGd1aW50IGlfYWxwaGEsIEdzdFZpZGVvRnJhbWUgKiBkZXN0LAorICAgIGdib29sZWFuIGRlc3Rfc2R0diwgZ2ludCBkZXN0X3gsIGdpbnQgZGVzdF95LCBHc3RWaWRlb0ZyYW1lICogc3JjLAorICAgIGdib29sZWFuIHNyY19zZHR2LCBnaW50IHNyY194LCBnaW50IHNyY195LCBnaW50IHcsIGdpbnQgaCkKK3sKKyAgZ2ludCBpLCBqOworICBndWludDggKmRlc3RZLCAqZGVzdFUsICpkZXN0VjsKKyAgY29uc3QgZ3VpbnQ4ICpzcmNZLCAqc3JjVSwgKnNyY1Y7CisgIGdpbnQgZGVzdF9zdHJpZGVZLCBkZXN0X3N0cmlkZVUsIGRlc3Rfc3RyaWRlVjsKKyAgZ2ludCBzcmNfc3RyaWRlWSwgc3JjX3N0cmlkZVUsIHNyY19zdHJpZGVWOworICBnaW50IHNyY195X2lkeCwgc3JjX3V2X2lkeDsKKyAgZ2ludCBkZXN0X3lfaWR4LCBkZXN0X3V2X2lkeDsKKyAgZ2ludCBtYXRyaXhbMTJdOworICBnaW50IHkxLCB5MjsKKyAgZ2ludCB1MSwgdTI7CisgIGdpbnQgdjEsIHYyOworICBnaW50IGRlc3Rfd2lkdGg7CisKKyAgZGVzdF93aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoZGVzdCk7CisKKyAgZGVzdF9zdHJpZGVZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0LCAwKTsKKyAgZGVzdF9zdHJpZGVVID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0LCAxKTsKKyAgZGVzdF9zdHJpZGVWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0LCAyKTsKKworICBzcmNfc3RyaWRlWSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoc3JjLCAwKTsKKyAgc3JjX3N0cmlkZVUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKHNyYywgMSk7CisgIHNyY19zdHJpZGVWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChzcmMsIDIpOworCisgIGRlc3RZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdCwgMCk7CisgIGRlc3RVID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdCwgMSk7CisgIGRlc3RWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdCwgMik7CisKKyAgc3JjWSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKHNyYywgMCk7CisgIHNyY1UgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChzcmMsIDEpOworICBzcmNWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoc3JjLCAyKTsKKworICBkZXN0WSA9IGRlc3RZICsgZGVzdF95ICogZGVzdF9zdHJpZGVZICsgZGVzdF94OworICBkZXN0VSA9IGRlc3RVICsgZGVzdF95ICogZGVzdF9zdHJpZGVVICsgZGVzdF94IC8gMjsKKyAgZGVzdFYgPSBkZXN0ViArIGRlc3RfeSAqIGRlc3Rfc3RyaWRlViArIGRlc3RfeCAvIDI7CisKKyAgc3JjWSA9IHNyY1kgKyBzcmNfeSAqIHNyY19zdHJpZGVZICsgc3JjX3g7CisgIHNyY1UgPSBzcmNVICsgc3JjX3kgKiBzcmNfc3RyaWRlVSArIHNyY194IC8gMjsKKyAgc3JjViA9IHNyY1YgKyBzcmNfeSAqIHNyY19zdHJpZGVWICsgc3JjX3ggLyAyOworCisgIGggPSBkZXN0X3kgKyBoOworICB3ID0gZGVzdF94ICsgdzsKKworICBpZiAoc3JjX3NkdHYgIT0gZGVzdF9zZHR2KQorICAgIG1lbWNweSAobWF0cml4LAorICAgICAgICBkZXN0X3NkdHYgPyBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0IDoKKyAgICAgICAgY29nX3ljYmNyX3NkdHZfdG9feWNiY3JfaGR0dl9tYXRyaXhfOGJpdCwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKyAgZWxzZQorICAgIG1lbWNweSAobWF0cml4LCBjb2dfaWRlbnRpdHlfbWF0cml4XzhiaXQsIDEyICogc2l6ZW9mIChnaW50KSk7CisKKyAgLyogMS4gQ29weSBhbGwgbWFjcm8gcGl4ZWwgc2NhbmxpbmVzLCB0aGUgZGVzdGluYXRpb24gc2NhbmxpbmUKKyAgICogICAgbm93IHN0YXJ0cyBhdCBtYWNybyBwaXhlbCBib3VuZGFyeS4gKi8KKyAgZm9yIChpID0gZGVzdF95OyBpIDwgaDsgaSsrKSB7CisgICAgLyogMS4xLiBIYW5kbGUgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIHBpeGVsIGlmIGl0IGRvZXNuJ3QKKyAgICAgKiAgICAgIHN0YXJ0IGF0IHRoZSBtYWNybyBwaXhlbCBib3VuZGFyeSwgaS5lLiBibGVuZCB3aXRoCisgICAgICogICAgICB0aGUgYmFja2dyb3VuZCEgKi8KKyAgICBpZiAoZGVzdF94ICUgMiA9PSAxKSB7CisgICAgICB5MSA9IHNyY1lbMF07CisgICAgICB1MSA9IHNyY1VbMF07CisgICAgICB2MSA9IHNyY1ZbMF07CisKKyAgICAgIGRlc3RZWzBdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVWzBdID0gQ0xBTVAgKAorICAgICAgICAgIChkZXN0VVswXSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyAyLCAwLCAyNTUpOworICAgICAgZGVzdFZbMF0gPSBDTEFNUCAoCisgICAgICAgICAgKGRlc3RWWzBdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwgdjEpKSAvIDIsIDAsIDI1NSk7CisgICAgICBqID0gZGVzdF94ICsgMTsKKyAgICAgIHNyY195X2lkeCA9IGRlc3RfeV9pZHggPSBkZXN0X3V2X2lkeCA9IDE7CisgICAgICBzcmNfdXZfaWR4ID0gKHNyY194ICUgMikgKyAxOworICAgIH0gZWxzZSB7CisgICAgICBqID0gZGVzdF94OworICAgICAgc3JjX3lfaWR4ID0gZGVzdF95X2lkeCA9IGRlc3RfdXZfaWR4ID0gMDsKKyAgICAgIHNyY191dl9pZHggPSAoc3JjX3ggJSAyKTsKKyAgICB9CisKKyAgICAvKiAxLjIuIENvcHkgYWxsIG1hY3JvIHBpeGVscyBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlIGRlc3RpbmF0aW9uLgorICAgICAqICAgICAgQWxsIHBpeGVscyBub3cgc3RhcnQgYXQgbWFjcm8gcGl4ZWwgYm91bmRhcnksIGkuZS4gbm8KKyAgICAgKiAgICAgIGJsZW5kaW5nIHdpdGggdGhlIGJhY2tncm91bmQgaXMgbmVjZXNzYXJ5LiAqLworICAgIGZvciAoOyBqIDwgdyAtIDE7IGogKz0gMikgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB5MiA9IHNyY1lbc3JjX3lfaWR4ICsgMV07CisKKyAgICAgIHUxID0gc3JjVVtzcmNfdXZfaWR4IC8gMl07CisgICAgICB2MSA9IHNyY1Zbc3JjX3V2X2lkeCAvIDJdOworICAgICAgc3JjX3V2X2lkeCsrOworICAgICAgdTIgPSBzcmNVW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHYyID0gc3JjVltzcmNfdXZfaWR4IC8gMl07CisgICAgICBzcmNfdXZfaWR4Kys7CisKKyAgICAgIGRlc3RZW2Rlc3RfeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RZW2Rlc3RfeV9pZHggKyAxXSA9CisgICAgICAgICAgQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MiwgdTIsIHYyKSwgMCwgMjU1KTsKKworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTIsCisgICAgICAgICAgICAgICAgICB1MiwgdjIpKSAvIDIsIDAsIDI1NSk7CisgICAgICBkZXN0VltkZXN0X3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwKKyAgICAgICAgICAgICAgICAgIHUyLCB2MikpIC8gMiwgMCwgMjU1KTsKKworICAgICAgZGVzdF95X2lkeCArPSAyOworICAgICAgc3JjX3lfaWR4ICs9IDI7CisgICAgICBkZXN0X3V2X2lkeCsrOworICAgIH0KKworICAgIC8qIDEuMy4gTm93IGNvcHkgdGhlIGxhc3QgcGl4ZWwgaWYgb25lIGV4aXN0cyBhbmQgYmxlbmQgaXQKKyAgICAgKiAgICAgIHdpdGggdGhlIGJhY2tncm91bmQgYmVjYXVzZSB3ZSBvbmx5IGZpbGwgcGFydCBvZgorICAgICAqICAgICAgdGhlIG1hY3JvIHBpeGVsLiBJbiBjYXNlIHRoaXMgaXMgdGhlIGxhc3QgcGl4ZWwgb2YKKyAgICAgKiAgICAgIHRoZSBkZXN0aW5hdGlvbiB3ZSB3aWxsIGEgbGFyZ2VyIHBhcnQuICovCisgICAgaWYgKGogPT0gdyAtIDEgJiYgaiA9PSBkZXN0X3dpZHRoIC0gMSkgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB1MSA9IHNyY1Vbc3JjX3V2X2lkeCAvIDJdOworICAgICAgdjEgPSBzcmNWW3NyY191dl9pZHggLyAyXTsKKworICAgICAgZGVzdFlbZGVzdF95X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgfSBlbHNlIGlmIChqID09IHcgLSAxKSB7CisgICAgICB5MSA9IHNyY1lbc3JjX3lfaWR4XTsKKyAgICAgIHUxID0gc3JjVVtzcmNfdXZfaWR4IC8gMl07CisgICAgICB2MSA9IHNyY1Zbc3JjX3V2X2lkeCAvIDJdOworCisgICAgICBkZXN0WVtkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVtkZXN0X3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKGRlc3RVW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkpIC8gMiwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoZGVzdFZbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSkgLyAyLCAwLCAyNTUpOworICAgIH0KKworICAgIGRlc3RZICs9IGRlc3Rfc3RyaWRlWTsKKyAgICBkZXN0VSArPSBkZXN0X3N0cmlkZVU7CisgICAgZGVzdFYgKz0gZGVzdF9zdHJpZGVWOworICAgIHNyY1kgKz0gc3JjX3N0cmlkZVk7CisKKyAgICBzcmNVICs9IHNyY19zdHJpZGVVOworICAgIHNyY1YgKz0gc3JjX3N0cmlkZVY7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NvcHlfeTQxYl95NDFiIChndWludCBpX2FscGhhLCBHc3RWaWRlb0ZyYW1lICogZGVzdCwKKyAgICBnYm9vbGVhbiBkZXN0X3NkdHYsIGdpbnQgZGVzdF94LCBnaW50IGRlc3RfeSwgR3N0VmlkZW9GcmFtZSAqIHNyYywKKyAgICBnYm9vbGVhbiBzcmNfc2R0diwgZ2ludCBzcmNfeCwgZ2ludCBzcmNfeSwgZ2ludCB3LCBnaW50IGgpCit7CisgIGdpbnQgaSwgajsKKyAgZ3VpbnQ4ICpkZXN0WSwgKmRlc3RVLCAqZGVzdFY7CisgIGNvbnN0IGd1aW50OCAqc3JjWSwgKnNyY1UsICpzcmNWOworICBnaW50IGRlc3Rfc3RyaWRlWSwgZGVzdF9zdHJpZGVVLCBkZXN0X3N0cmlkZVY7CisgIGdpbnQgc3JjX3N0cmlkZVksIHNyY19zdHJpZGVVLCBzcmNfc3RyaWRlVjsKKyAgZ2ludCBzcmNfeV9pZHgsIHNyY191dl9pZHg7CisgIGdpbnQgZGVzdF95X2lkeCwgZGVzdF91dl9pZHg7CisgIGdpbnQgbWF0cml4WzEyXTsKKyAgZ2ludCB5MSwgeTIsIHkzLCB5NDsKKyAgZ2ludCB1MSwgdTIsIHUzLCB1NDsKKyAgZ2ludCB2MSwgdjIsIHYzLCB2NDsKKyAgZ2ludCBkZXN0X3dpZHRoOworCisgIGRlc3Rfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGRlc3QpOworCisgIGRlc3Rfc3RyaWRlWSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZGVzdCwgMCk7CisgIGRlc3Rfc3RyaWRlVSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZGVzdCwgMSk7CisgIGRlc3Rfc3RyaWRlViA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZGVzdCwgMik7CisKKyAgc3JjX3N0cmlkZVkgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKHNyYywgMCk7CisgIHNyY19zdHJpZGVVID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChzcmMsIDEpOworICBzcmNfc3RyaWRlViA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoc3JjLCAyKTsKKworICBkZXN0WSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGRlc3QsIDApOworICBkZXN0VSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGRlc3QsIDEpOworICBkZXN0ViA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGRlc3QsIDIpOworCisgIHNyY1kgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChzcmMsIDApOworICBzcmNVID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoc3JjLCAxKTsKKyAgc3JjViA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKHNyYywgMik7CisKKyAgZGVzdFkgPSBkZXN0WSArIGRlc3RfeSAqIGRlc3Rfc3RyaWRlWSArIGRlc3RfeDsKKyAgZGVzdFUgPSBkZXN0VSArIGRlc3RfeSAqIGRlc3Rfc3RyaWRlVSArIGRlc3RfeCAvIDQ7CisgIGRlc3RWID0gZGVzdFYgKyBkZXN0X3kgKiBkZXN0X3N0cmlkZVYgKyBkZXN0X3ggLyA0OworCisgIHNyY1kgPSBzcmNZICsgc3JjX3kgKiBzcmNfc3RyaWRlWSArIHNyY194OworICBzcmNVID0gc3JjVSArIHNyY195ICogc3JjX3N0cmlkZVUgKyBzcmNfeCAvIDQ7CisgIHNyY1YgPSBzcmNWICsgc3JjX3kgKiBzcmNfc3RyaWRlViArIHNyY194IC8gNDsKKworICBoID0gZGVzdF95ICsgaDsKKyAgdyA9IGRlc3RfeCArIHc7CisKKyAgaWYgKHNyY19zZHR2ICE9IGRlc3Rfc2R0dikKKyAgICBtZW1jcHkgKG1hdHJpeCwKKyAgICAgICAgZGVzdF9zZHR2ID8gY29nX3ljYmNyX2hkdHZfdG9feWNiY3Jfc2R0dl9tYXRyaXhfOGJpdCA6CisgICAgICAgIGNvZ195Y2Jjcl9zZHR2X3RvX3ljYmNyX2hkdHZfbWF0cml4XzhiaXQsIDEyICogc2l6ZW9mIChnaW50KSk7CisgIGVsc2UKKyAgICBtZW1jcHkgKG1hdHJpeCwgY29nX2lkZW50aXR5X21hdHJpeF84Yml0LCAxMiAqIHNpemVvZiAoZ2ludCkpOworCisgIC8qIDEuIENvcHkgYWxsIG1hY3JvIHBpeGVsIHNjYW5saW5lcywgdGhlIGRlc3RpbmF0aW9uIHNjYW5saW5lCisgICAqICAgIG5vdyBzdGFydHMgYXQgbWFjcm8gcGl4ZWwgYm91bmRhcnkuICovCisgIGZvciAoaSA9IGRlc3RfeTsgaSA8IGg7IGkrKykgeworICAgIC8qIDEuMS4gSGFuZGxlIHRoZSBmaXJzdCBkZXN0aW5hdGlvbiBwaXhlbCBpZiBpdCBkb2Vzbid0CisgICAgICogICAgICBzdGFydCBhdCB0aGUgbWFjcm8gcGl4ZWwgYm91bmRhcnksIGkuZS4gYmxlbmQgd2l0aAorICAgICAqICAgICAgdGhlIGJhY2tncm91bmQhICovCisgICAgaWYgKGRlc3RfeCAlIDQgPT0gMSkgeworICAgICAgeTEgPSBzcmNZWzBdOworICAgICAgeTIgPSBzcmNZWzFdOworICAgICAgeTMgPSBzcmNZWzJdOworICAgICAgdTEgPSBzcmNVWzBdOworICAgICAgdjEgPSBzcmNWWzBdOworCisgICAgICBkZXN0WVswXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WVsxXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WVsyXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTMsIHUxLCB2MSksIDAsIDI1NSk7CisKKyAgICAgIGRlc3RVWzBdID0gQ0xBTVAgKAorICAgICAgICAgIChkZXN0VVswXSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTIsIHUxLAorICAgICAgICAgICAgICAgICAgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkzLCB1MSwgdjEpKSAvIDQsIDAsIDI1NSk7CisgICAgICBkZXN0VlswXSA9CisgICAgICAgICAgQ0xBTVAgKChkZXN0VlswXSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTIsIHUxLAorICAgICAgICAgICAgICAgICAgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkzLCB1MSwgdjEpKSAvIDQsIDAsIDI1NSk7CisKKyAgICAgIGogPSBkZXN0X3ggKyAzOworICAgICAgc3JjX3lfaWR4ID0gZGVzdF95X2lkeCA9IDM7CisgICAgICBkZXN0X3V2X2lkeCA9IDE7CisgICAgICBzcmNfdXZfaWR4ID0gKHNyY194ICUgNCkgKyAzOworICAgIH0gZWxzZSBpZiAoZGVzdF94ICUgNCA9PSAyKSB7CisgICAgICB5MSA9IHNyY1lbMF07CisgICAgICB5MiA9IHNyY1lbMV07CisgICAgICB1MSA9IHNyY1VbMF07CisgICAgICB2MSA9IHNyY1ZbMF07CisKKyAgICAgIGRlc3RZWzBdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RZWzFdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MiwgdTEsIHYxKSwgMCwgMjU1KTsKKworICAgICAgZGVzdFVbMF0gPSBDTEFNUCAoCisgICAgICAgICAgKDIgKiBkZXN0VVswXSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTIsIHUxLCB2MSkpIC8gNCwgMCwgMjU1KTsKKyAgICAgIGRlc3RWWzBdID0KKyAgICAgICAgICBDTEFNUCAoKDIgKiBkZXN0VlswXSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTIsIHUxLCB2MSkpIC8gNCwgMCwgMjU1KTsKKworICAgICAgaiA9IGRlc3RfeCArIDI7CisgICAgICBzcmNfeV9pZHggPSBkZXN0X3lfaWR4ID0gMjsKKyAgICAgIGRlc3RfdXZfaWR4ID0gMTsKKyAgICAgIHNyY191dl9pZHggPSAoc3JjX3ggJSA0KSArIDI7CisgICAgfSBlbHNlIGlmIChkZXN0X3ggJSA0ID09IDMpIHsKKyAgICAgIHkxID0gc3JjWVswXTsKKyAgICAgIHUxID0gc3JjVVswXTsKKyAgICAgIHYxID0gc3JjVlswXTsKKworICAgICAgZGVzdFlbMF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworCisgICAgICBkZXN0VVswXSA9IENMQU1QICgKKyAgICAgICAgICAoMyAqIGRlc3RVWzBdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwgdjEpKSAvIDQsIDAsIDI1NSk7CisgICAgICBkZXN0VlswXSA9IENMQU1QICgKKyAgICAgICAgICAoMyAqIGRlc3RWWzBdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwgdjEpKSAvIDQsIDAsIDI1NSk7CisKKyAgICAgIGogPSBkZXN0X3ggKyAxOworICAgICAgc3JjX3lfaWR4ID0gZGVzdF95X2lkeCA9IDE7CisgICAgICBkZXN0X3V2X2lkeCA9IDE7CisgICAgICBzcmNfdXZfaWR4ID0gKHNyY194ICUgNCkgKyAxOworICAgIH0gZWxzZSB7CisgICAgICBqID0gZGVzdF94OworICAgICAgc3JjX3lfaWR4ID0gZGVzdF95X2lkeCA9IGRlc3RfdXZfaWR4ID0gMDsKKyAgICAgIHNyY191dl9pZHggPSAoc3JjX3ggJSA0KTsKKyAgICB9CisKKyAgICAvKiAxLjIuIENvcHkgYWxsIG1hY3JvIHBpeGVscyBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlIGRlc3RpbmF0aW9uLgorICAgICAqICAgICAgQWxsIHBpeGVscyBub3cgc3RhcnQgYXQgbWFjcm8gcGl4ZWwgYm91bmRhcnksIGkuZS4gbm8KKyAgICAgKiAgICAgIGJsZW5kaW5nIHdpdGggdGhlIGJhY2tncm91bmQgaXMgbmVjZXNzYXJ5LiAqLworICAgIGZvciAoOyBqIDwgdyAtIDM7IGogKz0gNCkgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB5MiA9IHNyY1lbc3JjX3lfaWR4ICsgMV07CisgICAgICB5MyA9IHNyY1lbc3JjX3lfaWR4ICsgMl07CisgICAgICB5NCA9IHNyY1lbc3JjX3lfaWR4ICsgM107CisKKyAgICAgIHUxID0gc3JjVVtzcmNfdXZfaWR4IC8gNF07CisgICAgICB2MSA9IHNyY1Zbc3JjX3V2X2lkeCAvIDRdOworICAgICAgc3JjX3V2X2lkeCsrOworICAgICAgdTIgPSBzcmNVW3NyY191dl9pZHggLyA0XTsKKyAgICAgIHYyID0gc3JjVltzcmNfdXZfaWR4IC8gNF07CisgICAgICBzcmNfdXZfaWR4Kys7CisgICAgICB1MyA9IHNyY1Vbc3JjX3V2X2lkeCAvIDRdOworICAgICAgdjMgPSBzcmNWW3NyY191dl9pZHggLyA0XTsKKyAgICAgIHNyY191dl9pZHgrKzsKKyAgICAgIHU0ID0gc3JjVVtzcmNfdXZfaWR4IC8gNF07CisgICAgICB2NCA9IHNyY1Zbc3JjX3V2X2lkeCAvIDRdOworICAgICAgc3JjX3V2X2lkeCsrOworCisgICAgICBkZXN0WVtkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WVtkZXN0X3lfaWR4ICsgMV0gPQorICAgICAgICAgIENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUyLCB2MiksIDAsIDI1NSk7CisgICAgICBkZXN0WVtkZXN0X3lfaWR4ICsgMl0gPQorICAgICAgICAgIENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTMsIHUzLCB2MyksIDAsIDI1NSk7CisgICAgICBkZXN0WVtkZXN0X3lfaWR4ICsgM10gPQorICAgICAgICAgIENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTQsIHU0LCB2NCksIDAsIDI1NSk7CisKKyAgICAgIGRlc3RVW2Rlc3RfdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkyLAorICAgICAgICAgICAgICAgICAgdTIsIHYyKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MywgdTMsCisgICAgICAgICAgICAgICAgICB2MykgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTQsIHU0LCB2NCkpIC8gNCwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9CisgICAgICAgICAgQ0xBTVAgKChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTEsIHUxLCB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgIDIsIHkyLCB1MiwgdjIpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkzLCB1MywKKyAgICAgICAgICAgICAgICAgIHYzKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5NCwgdTQsIHY0KSkgLyA0LCAwLCAyNTUpOworCisgICAgICBkZXN0X3lfaWR4ICs9IDQ7CisgICAgICBzcmNfeV9pZHggKz0gNDsKKyAgICAgIGRlc3RfdXZfaWR4Kys7CisgICAgfQorCisgICAgLyogMS4zLiBOb3cgY29weSB0aGUgbGFzdCBwaXhlbCBpZiBvbmUgZXhpc3RzIGFuZCBibGVuZCBpdAorICAgICAqICAgICAgd2l0aCB0aGUgYmFja2dyb3VuZCBiZWNhdXNlIHdlIG9ubHkgZmlsbCBwYXJ0IG9mCisgICAgICogICAgICB0aGUgbWFjcm8gcGl4ZWwuIEluIGNhc2UgdGhpcyBpcyB0aGUgbGFzdCBwaXhlbCBvZgorICAgICAqICAgICAgdGhlIGRlc3RpbmF0aW9uIHdlIHdpbGwgYSBsYXJnZXIgcGFydC4gKi8KKyAgICBpZiAoaiA9PSB3IC0gMSAmJiBqID09IGRlc3Rfd2lkdGggLSAxKSB7CisgICAgICB5MSA9IHNyY1lbc3JjX3lfaWR4XTsKKyAgICAgIHUxID0gc3JjVVtzcmNfdXZfaWR4IC8gNF07CisgICAgICB2MSA9IHNyY1Zbc3JjX3V2X2lkeCAvIDRdOworCisgICAgICBkZXN0WVtkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVtkZXN0X3V2X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFZbZGVzdF91dl9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICB9IGVsc2UgaWYgKGogPT0gdyAtIDEpIHsKKyAgICAgIHkxID0gc3JjWVtzcmNfeV9pZHhdOworICAgICAgdTEgPSBzcmNVW3NyY191dl9pZHggLyA0XTsKKyAgICAgIHYxID0gc3JjVltzcmNfdXZfaWR4IC8gNF07CisKKyAgICAgIGRlc3RZW2Rlc3RfeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVW2Rlc3RfdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoZGVzdFVbZGVzdF91dl9pZHhdICsgMyAqIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkpIC8gNCwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoZGVzdFZbZGVzdF91dl9pZHhdICsgMyAqIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkpIC8gNCwgMCwgMjU1KTsKKyAgICB9IGVsc2UgaWYgKGogPT0gdyAtIDIgJiYgaiA9PSBkZXN0X3dpZHRoIC0gMikgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB5MiA9IHNyY1lbc3JjX3lfaWR4ICsgMV07CisgICAgICB1MSA9IHNyY1Vbc3JjX3V2X2lkeCAvIDRdOworICAgICAgdjEgPSBzcmNWW3NyY191dl9pZHggLyA0XTsKKworICAgICAgZGVzdFlbZGVzdF95X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFlbZGVzdF95X2lkeCArIDFdID0KKyAgICAgICAgICBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkyLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgfSBlbHNlIGlmIChqID09IHcgLSAyKSB7CisgICAgICB5MSA9IHNyY1lbc3JjX3lfaWR4XTsKKyAgICAgIHkyID0gc3JjWVtzcmNfeV9pZHggKyAxXTsKKyAgICAgIHUxID0gc3JjVVtzcmNfdXZfaWR4IC8gNF07CisgICAgICB2MSA9IHNyY1Zbc3JjX3V2X2lkeCAvIDRdOworCisgICAgICBkZXN0WVtkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WVtkZXN0X3lfaWR4ICsgMV0gPQorICAgICAgICAgIENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVtkZXN0X3V2X2lkeF0gPQorICAgICAgICAgIENMQU1QICgoZGVzdFVbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSkgLyAyLCAwLCAyNTUpOworICAgICAgZGVzdFZbZGVzdF91dl9pZHhdID0KKyAgICAgICAgICBDTEFNUCAoKGRlc3RWW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkpIC8gMiwgMCwgMjU1KTsKKyAgICB9IGVsc2UgaWYgKGogPT0gdyAtIDMgJiYgaiA9PSBkZXN0X3dpZHRoIC0gMykgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB5MiA9IHNyY1lbc3JjX3lfaWR4ICsgMV07CisgICAgICB5MyA9IHNyY1lbc3JjX3lfaWR4ICsgMl07CisgICAgICB1MSA9IHNyY1Vbc3JjX3V2X2lkeCAvIDRdOworICAgICAgdjEgPSBzcmNWW3NyY191dl9pZHggLyA0XTsKKworICAgICAgZGVzdFlbZGVzdF95X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFlbZGVzdF95X2lkeCArIDFdID0KKyAgICAgICAgICBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkyLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFlbZGVzdF95X2lkeCArIDJdID0KKyAgICAgICAgICBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkzLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgfSBlbHNlIGlmIChqID09IHcgLSAzKSB7CisgICAgICB5MSA9IHNyY1lbc3JjX3lfaWR4XTsKKyAgICAgIHkyID0gc3JjWVtzcmNfeV9pZHggKyAxXTsKKyAgICAgIHkzID0gc3JjWVtzcmNfeV9pZHggKyAyXTsKKyAgICAgIHUxID0gc3JjVVtzcmNfdXZfaWR4IC8gNF07CisgICAgICB2MSA9IHNyY1Zbc3JjX3V2X2lkeCAvIDRdOworCisgICAgICBkZXN0WVtkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WVtkZXN0X3lfaWR4ICsgMV0gPQorICAgICAgICAgIENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WVtkZXN0X3lfaWR4ICsgMl0gPQorICAgICAgICAgIENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTMsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVtkZXN0X3V2X2lkeF0gPQorICAgICAgICAgIENMQU1QICgoMyAqIGRlc3RVW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkpIC8gNCwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9CisgICAgICAgICAgQ0xBTVAgKCgzICogZGVzdFZbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSkgLyA0LCAwLCAyNTUpOworICAgIH0KKworICAgIGRlc3RZICs9IGRlc3Rfc3RyaWRlWTsKKyAgICBkZXN0VSArPSBkZXN0X3N0cmlkZVU7CisgICAgZGVzdFYgKz0gZGVzdF9zdHJpZGVWOworICAgIHNyY1kgKz0gc3JjX3N0cmlkZVk7CisgICAgc3JjVSArPSBzcmNfc3RyaWRlVTsKKyAgICBzcmNWICs9IHNyY19zdHJpZGVWOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5X2k0MjBfaTQyMCAoZ3VpbnQgaV9hbHBoYSwgR3N0VmlkZW9GcmFtZSAqIGRlc3QsCisgICAgZ2Jvb2xlYW4gZGVzdF9zZHR2LCBnaW50IGRlc3RfeCwgZ2ludCBkZXN0X3ksIEdzdFZpZGVvRnJhbWUgKiBzcmMsCisgICAgZ2Jvb2xlYW4gc3JjX3NkdHYsIGdpbnQgc3JjX3gsIGdpbnQgc3JjX3ksIGdpbnQgdywgZ2ludCBoKQoreworICBnaW50IGksIGo7CisgIGd1aW50OCAqZGVzdFksICpkZXN0VSwgKmRlc3RWOworICBjb25zdCBndWludDggKnNyY1ksICpzcmNVLCAqc3JjVjsKKyAgZ3VpbnQ4ICpkZXN0WTI7CisgIGNvbnN0IGd1aW50OCAqc3JjWTIsICpzcmNVMiwgKnNyY1YyOworICBnaW50IGRlc3Rfc3RyaWRlWSwgZGVzdF9zdHJpZGVVLCBkZXN0X3N0cmlkZVY7CisgIGdpbnQgc3JjX3N0cmlkZVksIHNyY19zdHJpZGVVLCBzcmNfc3RyaWRlVjsKKyAgZ2ludCBzcmNfeV9pZHgsIHNyY191dl9pZHg7CisgIGdpbnQgZGVzdF95X2lkeCwgZGVzdF91dl9pZHg7CisgIGdpbnQgbWF0cml4WzEyXTsKKyAgZ2ludCB5MSwgeTIsIHkzLCB5NDsKKyAgZ2ludCB1MSwgdTIsIHUzLCB1NDsKKyAgZ2ludCB2MSwgdjIsIHYzLCB2NDsKKyAgZ2ludCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodDsKKworICBkZXN0X3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChkZXN0KTsKKyAgZGVzdF9oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChkZXN0KTsKKworICBkZXN0X3N0cmlkZVkgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGRlc3QsIDApOworICBkZXN0X3N0cmlkZVUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGRlc3QsIDEpOworICBkZXN0X3N0cmlkZVYgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGRlc3QsIDIpOworCisgIHNyY19zdHJpZGVZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChzcmMsIDApOworICBzcmNfc3RyaWRlVSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoc3JjLCAxKTsKKyAgc3JjX3N0cmlkZVYgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKHNyYywgMik7CisKKyAgZGVzdFkgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChkZXN0LCAwKTsKKyAgZGVzdFUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChkZXN0LCAxKTsKKyAgZGVzdFYgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChkZXN0LCAyKTsKKworICBzcmNZID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoc3JjLCAwKTsKKyAgc3JjVSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKHNyYywgMSk7CisgIHNyY1YgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChzcmMsIDIpOworCisgIGRlc3RZID0gZGVzdFkgKyBkZXN0X3kgKiBkZXN0X3N0cmlkZVkgKyBkZXN0X3g7CisgIGRlc3RVID0gZGVzdFUgKyAoZGVzdF95IC8gMikgKiBkZXN0X3N0cmlkZVUgKyBkZXN0X3ggLyAyOworICBkZXN0ViA9IGRlc3RWICsgKGRlc3RfeSAvIDIpICogZGVzdF9zdHJpZGVWICsgZGVzdF94IC8gMjsKKworICBzcmNZID0gc3JjWSArIHNyY195ICogc3JjX3N0cmlkZVkgKyBzcmNfeDsKKyAgc3JjVSA9IHNyY1UgKyAoc3JjX3kgLyAyKSAqIHNyY19zdHJpZGVVICsgc3JjX3ggLyAyOworICBzcmNWID0gc3JjViArIChzcmNfeSAvIDIpICogc3JjX3N0cmlkZVYgKyBzcmNfeCAvIDI7CisKKyAgZGVzdFkyID0gZGVzdFkgKyBkZXN0X3N0cmlkZVk7CisgIHNyY1kyID0gc3JjWSArIHNyY19zdHJpZGVZOworCisgIGggPSBkZXN0X3kgKyBoOworICB3ID0gZGVzdF94ICsgdzsKKworICBpZiAoc3JjX3NkdHYgIT0gZGVzdF9zZHR2KQorICAgIG1lbWNweSAobWF0cml4LAorICAgICAgICBkZXN0X3NkdHYgPyBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0IDoKKyAgICAgICAgY29nX3ljYmNyX3NkdHZfdG9feWNiY3JfaGR0dl9tYXRyaXhfOGJpdCwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKyAgZWxzZQorICAgIG1lbWNweSAobWF0cml4LCBjb2dfaWRlbnRpdHlfbWF0cml4XzhiaXQsIDEyICogc2l6ZW9mIChnaW50KSk7CisKKyAgLyogMS4gSGFuZGxlIHRoZSBmaXJzdCBkZXN0aW5hdGlvbiBzY2FubGluZSBzcGVjaWFsbHkgaWYgaXQKKyAgICogICAgZG9lc24ndCBzdGFydCBhdCB0aGUgbWFjcm8gcGl4ZWwgYm91bmRhcnksIGkuZS4gYmxlbmQKKyAgICogICAgd2l0aCB0aGUgYmFja2dyb3VuZCEgKi8KKyAgaWYgKGRlc3RfeSAlIDIgPT0gMSkgeworICAgIC8qIDEuMS4gSGFuZGxlIHRoZSBmaXJzdCBkZXN0aW5hdGlvbiBwaXhlbCBpZiBpdCBkb2Vzbid0CisgICAgICogICAgICBzdGFydCBhdCB0aGUgbWFjcm8gcGl4ZWwgYm91bmRhcnksIGkuZS4gYmxlbmQgd2l0aAorICAgICAqICAgICAgdGhlIGJhY2tncm91bmQhICovCisgICAgaWYgKGRlc3RfeCAlIDIgPT0gMSkgeworICAgICAgeTEgPSBzcmNZWzBdOworICAgICAgdTEgPSBzcmNVWzBdOworICAgICAgdjEgPSBzcmNWWzBdOworCisgICAgICBkZXN0WVswXSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVswXSA9CisgICAgICAgICAgQ0xBTVAgKCgzICogZGVzdFVbMF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkpIC8gNCwgMCwKKyAgICAgICAgICAyNTUpOworICAgICAgZGVzdFZbMF0gPQorICAgICAgICAgIENMQU1QICgoMyAqIGRlc3RWWzBdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwgdjEpKSAvIDQsIDAsCisgICAgICAgICAgMjU1KTsKKworICAgICAgaiA9IGRlc3RfeCArIDE7CisgICAgICBzcmNfeV9pZHggPSBkZXN0X3lfaWR4ID0gZGVzdF91dl9pZHggPSAxOworICAgICAgc3JjX3V2X2lkeCA9IChzcmNfeCAlIDIpICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgaiA9IGRlc3RfeDsKKyAgICAgIHNyY195X2lkeCA9IGRlc3RfeV9pZHggPSBkZXN0X3V2X2lkeCA9IDA7CisgICAgICBzcmNfdXZfaWR4ID0gKHNyY194ICUgMik7CisgICAgfQorCisgICAgLyogMS4yLiBDb3B5IGFsbCBtYWNybyBwaXhlbHMgZnJvbSB0aGUgc291cmNlIHRvIHRoZSBkZXN0aW5hdGlvbgorICAgICAqICAgICAgYnV0IGJsZW5kIHdpdGggdGhlIGJhY2tncm91bmQgYmVjYXVzZSB3ZSdyZSBvbmx5IGZpbGxpbmcKKyAgICAgKiAgICAgIHRoZSBsb3dlciBwYXJ0IG9mIHRoZSBtYWNybyBwaXhlbHMuICovCisgICAgZm9yICg7IGogPCB3IC0gMTsgaiArPSAyKSB7CisgICAgICB5MSA9IHNyY1lbc3JjX3lfaWR4XTsKKyAgICAgIHkyID0gc3JjWVtzcmNfeV9pZHggKyAxXTsKKworICAgICAgdTEgPSBzcmNVW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHYxID0gc3JjVltzcmNfdXZfaWR4IC8gMl07CisgICAgICBzcmNfdXZfaWR4Kys7CisgICAgICB1MiA9IHNyY1Vbc3JjX3V2X2lkeCAvIDJdOworICAgICAgdjIgPSBzcmNWW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHNyY191dl9pZHgrKzsKKworICAgICAgZGVzdFlbZGVzdF95X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFlbZGVzdF95X2lkeCArIDFdID0KKyAgICAgICAgICBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkyLCB1MiwgdjIpLCAwLCAyNTUpOworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0KKyAgICAgICAgICBDTEFNUCAoKDIgKiBkZXN0VVtkZXN0X3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLAorICAgICAgICAgICAgICAgICAgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkyLCB1MiwgdjIpKSAvIDQsIDAsIDI1NSk7CisgICAgICBkZXN0VltkZXN0X3V2X2lkeF0gPQorICAgICAgICAgIENMQU1QICgoMiAqIGRlc3RWW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTIsIHUyLCB2MikpIC8gNCwgMCwgMjU1KTsKKworICAgICAgZGVzdF95X2lkeCArPSAyOworICAgICAgc3JjX3lfaWR4ICs9IDI7CisgICAgICBkZXN0X3V2X2lkeCsrOworICAgIH0KKworICAgIC8qIDEuMy4gTm93IGNvcHkgdGhlIGxhc3QgcGl4ZWwgaWYgb25lIGV4aXN0cyBhbmQgYmxlbmQgaXQKKyAgICAgKiAgICAgIHdpdGggdGhlIGJhY2tncm91bmQgYmVjYXVzZSB3ZSBvbmx5IGZpbGwgcGFydCBvZgorICAgICAqICAgICAgdGhlIG1hY3JvIHBpeGVsLiBJbiBjYXNlIHRoaXMgaXMgdGhlIGxhc3QgcGl4ZWwgb2YKKyAgICAgKiAgICAgIHRoZSBkZXN0aW5hdGlvbiB3ZSB3aWxsIGEgbGFyZ2VyIHBhcnQuICovCisgICAgaWYgKGogPT0gdyAtIDEgJiYgaiA9PSBkZXN0X3dpZHRoIC0gMSkgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB1MSA9IHNyY1Vbc3JjX3V2X2lkeCAvIDJdOworICAgICAgdjEgPSBzcmNWW3NyY191dl9pZHggLyAyXTsKKworICAgICAgZGVzdFlbZGVzdF95X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgIChkZXN0VVtkZXN0X3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkpIC8gMiwgMCwKKyAgICAgICAgICAyNTUpOworICAgICAgZGVzdFZbZGVzdF91dl9pZHhdID0KKyAgICAgICAgICBDTEFNUCAoKGRlc3RWW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkpIC8gMiwgMCwgMjU1KTsKKyAgICB9IGVsc2UgaWYgKGogPT0gdyAtIDEpIHsKKyAgICAgIHkxID0gc3JjWVtzcmNfeV9pZHhdOworICAgICAgdTEgPSBzcmNVW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHYxID0gc3JjVltzcmNfdXZfaWR4IC8gMl07CisKKyAgICAgIGRlc3RZW2Rlc3RfeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVW2Rlc3RfdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoMyAqIGRlc3RVW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyA0LAorICAgICAgICAgIDAsIDI1NSk7CisgICAgICBkZXN0VltkZXN0X3V2X2lkeF0gPQorICAgICAgICAgIENMQU1QICgoMyAqIGRlc3RWW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkpIC8gNCwgMCwgMjU1KTsKKyAgICB9CisKKyAgICBkZXN0WSArPSBkZXN0X3N0cmlkZVk7CisgICAgZGVzdFkyICs9IGRlc3Rfc3RyaWRlWTsKKyAgICBkZXN0VSArPSBkZXN0X3N0cmlkZVU7CisgICAgZGVzdFYgKz0gZGVzdF9zdHJpZGVWOworICAgIHNyY1kgKz0gc3JjX3N0cmlkZVk7CisgICAgc3JjWTIgKz0gc3JjX3N0cmlkZVk7CisgICAgc3JjX3krKzsKKyAgICBpZiAoc3JjX3kgJSAyID09IDApIHsKKyAgICAgIHNyY1UgKz0gc3JjX3N0cmlkZVU7CisgICAgICBzcmNWICs9IHNyY19zdHJpZGVWOworICAgIH0KKyAgICBpID0gZGVzdF95ICsgMTsKKyAgfSBlbHNlIHsKKyAgICBpID0gZGVzdF95OworICB9CisKKyAgLyogMi4gQ29weSBhbGwgbWFjcm8gcGl4ZWwgc2NhbmxpbmVzLCB0aGUgZGVzdGluYXRpb24gc2NhbmxpbmUKKyAgICogICAgbm93IHN0YXJ0cyBhdCBtYWNybyBwaXhlbCBib3VuZGFyeS4gKi8KKyAgZm9yICg7IGkgPCBoIC0gMTsgaSArPSAyKSB7CisgICAgLyogMi4xLiBIYW5kbGUgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIHBpeGVsIGlmIGl0IGRvZXNuJ3QKKyAgICAgKiAgICAgIHN0YXJ0IGF0IHRoZSBtYWNybyBwaXhlbCBib3VuZGFyeSwgaS5lLiBibGVuZCB3aXRoCisgICAgICogICAgICB0aGUgYmFja2dyb3VuZCEgKi8KKworICAgIHNyY1UyID0gc3JjVTsKKyAgICBzcmNWMiA9IHNyY1Y7CisgICAgaWYgKHNyY195ICUgMiA9PSAxKSB7CisgICAgICBzcmNVMiArPSBzcmNfc3RyaWRlVTsKKyAgICAgIHNyY1YyICs9IHNyY19zdHJpZGVWOworICAgIH0KKworICAgIGlmIChkZXN0X3ggJSAyID09IDEpIHsKKyAgICAgIHkxID0gc3JjWVswXTsKKyAgICAgIHkyID0gc3JjWTJbMF07CisgICAgICB1MSA9IHNyY1VbMF07CisgICAgICB2MSA9IHNyY1ZbMF07CisgICAgICB1MiA9IHNyY1UyWzBdOworICAgICAgdjIgPSBzcmNWMlswXTsKKworICAgICAgZGVzdFlbMF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFkyWzBdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MiwgdTIsIHYyKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVWzBdID0gQ0xBTVAgKAorICAgICAgICAgICgyICogZGVzdFVbMF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLAorICAgICAgICAgICAgICAgICAgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkyLCB1MiwgdjIpKSAvIDQsIDAsIDI1NSk7CisgICAgICBkZXN0VlswXSA9IENMQU1QICgKKyAgICAgICAgICAoMiAqIGRlc3RWWzBdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwgdTIsIHYyKSkgLyA0LCAwLCAyNTUpOworICAgICAgaiA9IGRlc3RfeCArIDE7CisgICAgICBzcmNfeV9pZHggPSBkZXN0X3lfaWR4ID0gZGVzdF91dl9pZHggPSAxOworICAgICAgc3JjX3V2X2lkeCA9IChzcmNfeCAlIDIpICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgaiA9IGRlc3RfeDsKKyAgICAgIHNyY195X2lkeCA9IGRlc3RfeV9pZHggPSBkZXN0X3V2X2lkeCA9IDA7CisgICAgICBzcmNfdXZfaWR4ID0gKHNyY194ICUgMik7CisgICAgfQorCisgICAgLyogMi4yLiBDb3B5IGFsbCBtYWNybyBwaXhlbHMgZnJvbSB0aGUgc291cmNlIHRvIHRoZSBkZXN0aW5hdGlvbi4KKyAgICAgKiAgICAgIEFsbCBwaXhlbHMgbm93IHN0YXJ0IGF0IG1hY3JvIHBpeGVsIGJvdW5kYXJ5LCBpLmUuIG5vCisgICAgICogICAgICBibGVuZGluZyB3aXRoIHRoZSBiYWNrZ3JvdW5kIGlzIG5lY2Vzc2FyeS4gKi8KKyAgICBmb3IgKDsgaiA8IHcgLSAxOyBqICs9IDIpIHsKKyAgICAgIHkxID0gc3JjWVtzcmNfeV9pZHhdOworICAgICAgeTIgPSBzcmNZW3NyY195X2lkeCArIDFdOworICAgICAgeTMgPSBzcmNZMltzcmNfeV9pZHhdOworICAgICAgeTQgPSBzcmNZMltzcmNfeV9pZHggKyAxXTsKKworICAgICAgdTEgPSBzcmNVW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHUzID0gc3JjVTJbc3JjX3V2X2lkeCAvIDJdOworICAgICAgdjEgPSBzcmNWW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHYzID0gc3JjVjJbc3JjX3V2X2lkeCAvIDJdOworICAgICAgc3JjX3V2X2lkeCsrOworICAgICAgdTIgPSBzcmNVW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHU0ID0gc3JjVTJbc3JjX3V2X2lkeCAvIDJdOworICAgICAgdjIgPSBzcmNWW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHY0ID0gc3JjVjJbc3JjX3V2X2lkeCAvIDJdOworICAgICAgc3JjX3V2X2lkeCsrOworCisgICAgICBkZXN0WVtkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WVtkZXN0X3lfaWR4ICsgMV0gPQorICAgICAgICAgIENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUyLCB2MiksIDAsIDI1NSk7CisgICAgICBkZXN0WTJbZGVzdF95X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkzLCB1MywgdjMpLCAwLCAyNTUpOworICAgICAgZGVzdFkyW2Rlc3RfeV9pZHggKyAxXSA9CisgICAgICAgICAgQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5NCwgdTQsIHY0KSwgMCwgMjU1KTsKKworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTIsCisgICAgICAgICAgICAgICAgICB1MiwgdjIpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkzLCB1MywKKyAgICAgICAgICAgICAgICAgIHYzKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5NCwgdTQsIHY0KSkgLyA0LCAwLCAyNTUpOworICAgICAgZGVzdFZbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTEsIHUxLCB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTIsCisgICAgICAgICAgICAgICAgICB1MiwgdjIpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkzLCB1MywKKyAgICAgICAgICAgICAgICAgIHYzKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5NCwgdTQsIHY0KSkgLyA0LCAwLCAyNTUpOworCisgICAgICBkZXN0X3lfaWR4ICs9IDI7CisgICAgICBzcmNfeV9pZHggKz0gMjsKKyAgICAgIGRlc3RfdXZfaWR4Kys7CisgICAgfQorCisgICAgLyogMi4zLiBOb3cgY29weSB0aGUgbGFzdCBwaXhlbCBpZiBvbmUgZXhpc3RzIGFuZCBibGVuZCBpdAorICAgICAqICAgICAgd2l0aCB0aGUgYmFja2dyb3VuZCBiZWNhdXNlIHdlIG9ubHkgZmlsbCBwYXJ0IG9mCisgICAgICogICAgICB0aGUgbWFjcm8gcGl4ZWwuIEluIGNhc2UgdGhpcyBpcyB0aGUgbGFzdCBwaXhlbCBvZgorICAgICAqICAgICAgdGhlIGRlc3RpbmF0aW9uIHdlIHdpbGwgYSBsYXJnZXIgcGFydC4gKi8KKyAgICBpZiAoaiA9PSB3IC0gMSAmJiBqID09IGRlc3Rfd2lkdGggLSAxKSB7CisgICAgICB5MSA9IHNyY1lbc3JjX3lfaWR4XTsKKyAgICAgIHkyID0gc3JjWTJbc3JjX3lfaWR4XTsKKworICAgICAgdTEgPSBzcmNVW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHUyID0gc3JjVTJbc3JjX3V2X2lkeCAvIDJdOworCisgICAgICB2MSA9IHNyY1Zbc3JjX3V2X2lkeCAvIDJdOworICAgICAgdjIgPSBzcmNWMltzcmNfdXZfaWR4IC8gMl07CisKKyAgICAgIGRlc3RZW2Rlc3RfeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RZMltkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUyLCB2MiksIDAsIDI1NSk7CisgICAgICBkZXN0VVtkZXN0X3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwKKyAgICAgICAgICAgICAgICAgIHUyLCB2MikpIC8gMiwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwgdjEpICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkyLAorICAgICAgICAgICAgICAgICAgdTIsIHYyKSkgLyAyLCAwLCAyNTUpOworICAgIH0gZWxzZSBpZiAoaiA9PSB3IC0gMSkgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB5MiA9IHNyY1kyW3NyY195X2lkeF07CisKKyAgICAgIHUxID0gc3JjVVtzcmNfdXZfaWR4IC8gMl07CisgICAgICB1MiA9IHNyY1UyW3NyY191dl9pZHggLyAyXTsKKworICAgICAgdjEgPSBzcmNWW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHYyID0gc3JjVjJbc3JjX3V2X2lkeCAvIDJdOworCisgICAgICBkZXN0WVtkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WTJbZGVzdF95X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkyLCB1MiwgdjIpLCAwLCAyNTUpOworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgICgyICogZGVzdFVbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwgdTIsIHYyKSkgLyA0LCAwLCAyNTUpOworICAgICAgZGVzdFZbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgICgyICogZGVzdFZbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwgdTIsIHYyKSkgLyA0LCAwLCAyNTUpOworICAgIH0KKworICAgIGRlc3RZICs9IDIgKiBkZXN0X3N0cmlkZVk7CisgICAgZGVzdFkyICs9IDIgKiBkZXN0X3N0cmlkZVk7CisgICAgZGVzdFUgKz0gZGVzdF9zdHJpZGVVOworICAgIGRlc3RWICs9IGRlc3Rfc3RyaWRlVjsKKyAgICBzcmNZICs9IDIgKiBzcmNfc3RyaWRlWTsKKyAgICBzcmNZMiArPSAyICogc3JjX3N0cmlkZVk7CisKKyAgICBzcmNfeSArPSAyOworICAgIHNyY1UgKz0gc3JjX3N0cmlkZVU7CisgICAgc3JjViArPSBzcmNfc3RyaWRlVjsKKyAgfQorCisgIC8qIDMuIEhhbmRsZSB0aGUgbGFzdCBzY2FubGluZSBpZiBvbmUgZXhpc3RzLiBUaGlzIGFnYWluCisgICAqICAgIGRvZXNuJ3Qgc3RhcnQgYXQgbWFjcm8gcGl4ZWwgYm91bmRhcnkgYnV0IHNob3VsZAorICAgKiAgICBvbmx5IGZpbGwgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIG1hY3JvIHBpeGVscy4gKi8KKyAgaWYgKGkgPT0gaCAtIDEgJiYgaSA9PSBkZXN0X2hlaWdodCAtIDEpIHsKKyAgICAvKiAzLjEuIEhhbmRsZSB0aGUgZmlyc3QgZGVzdGluYXRpb24gcGl4ZWwgaWYgaXQgZG9lc24ndAorICAgICAqICAgICAgc3RhcnQgYXQgdGhlIG1hY3JvIHBpeGVsIGJvdW5kYXJ5LCBpLmUuIGJsZW5kIHdpdGgKKyAgICAgKiAgICAgIHRoZSBiYWNrZ3JvdW5kISAqLworICAgIGlmIChkZXN0X3ggJSAyID09IDEpIHsKKyAgICAgIHkxID0gc3JjWVswXTsKKyAgICAgIHUxID0gc3JjVVswXTsKKyAgICAgIHYxID0gc3JjVlswXTsKKworICAgICAgZGVzdFlbMF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFVbMF0gPQorICAgICAgICAgIENMQU1QICgoZGVzdFVbMF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkpIC8gMiwgMCwgMjU1KTsKKyAgICAgIGRlc3RWWzBdID0KKyAgICAgICAgICBDTEFNUCAoKGRlc3RWWzBdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwgdjEpKSAvIDIsIDAsIDI1NSk7CisKKyAgICAgIGogPSBkZXN0X3ggKyAxOworICAgICAgc3JjX3lfaWR4ID0gZGVzdF95X2lkeCA9IGRlc3RfdXZfaWR4ID0gMTsKKyAgICAgIHNyY191dl9pZHggPSAoc3JjX3ggJSAyKSArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGogPSBkZXN0X3g7CisgICAgICBzcmNfeV9pZHggPSBkZXN0X3lfaWR4ID0gZGVzdF91dl9pZHggPSAwOworICAgICAgc3JjX3V2X2lkeCA9IChzcmNfeCAlIDIpOworICAgIH0KKworICAgIC8qIDMuMi4gQ29weSBhbGwgbWFjcm8gcGl4ZWxzIGZyb20gdGhlIHNvdXJjZSB0byB0aGUgZGVzdGluYXRpb24KKyAgICAgKiAgICAgIGJ1dCBibGVuZCB3aXRoIHRoZSBiYWNrZ3JvdW5kIGJlY2F1c2Ugd2UncmUgb25seSBmaWxsaW5nCisgICAgICogICAgICB0aGUgdXBwZXIgcGFydCBvZiB0aGUgbWFjcm8gcGl4ZWxzLiAqLworICAgIGZvciAoOyBqIDwgdyAtIDE7IGogKz0gMikgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB5MiA9IHNyY1lbc3JjX3lfaWR4ICsgMV07CisKKyAgICAgIHUxID0gc3JjVVtzcmNfdXZfaWR4IC8gMl07CisgICAgICB2MSA9IHNyY1Zbc3JjX3V2X2lkeCAvIDJdOworICAgICAgc3JjX3V2X2lkeCsrOworICAgICAgdTIgPSBzcmNVW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHYyID0gc3JjVltzcmNfdXZfaWR4IC8gMl07CisgICAgICBzcmNfdXZfaWR4Kys7CisKKyAgICAgIGRlc3RZW2Rlc3RfeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RZW2Rlc3RfeV9pZHggKyAxXSA9CisgICAgICAgICAgQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MiwgdTIsIHYyKSwgMCwgMjU1KTsKKworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgICgyICogZGVzdFVbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MiwgdTIsIHYyKSkgLyA0LCAwLCAyNTUpOworICAgICAgZGVzdFZbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgICgyICogZGVzdFZbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwgdTIsIHYyKSkgLyA0LCAwLCAyNTUpOworCisgICAgICBkZXN0X3lfaWR4ICs9IDI7CisgICAgICBzcmNfeV9pZHggKz0gMjsKKyAgICAgIGRlc3RfdXZfaWR4Kys7CisgICAgfQorCisgICAgLyogMy4zLiBOb3cgY29weSB0aGUgbGFzdCBwaXhlbCBpZiBvbmUgZXhpc3RzIGFuZCBibGVuZCBpdAorICAgICAqICAgICAgd2l0aCB0aGUgYmFja2dyb3VuZCBiZWNhdXNlIHdlIG9ubHkgZmlsbCBwYXJ0IG9mCisgICAgICogICAgICB0aGUgbWFjcm8gcGl4ZWwuIEluIGNhc2UgdGhpcyBpcyB0aGUgbGFzdCBwaXhlbCBvZgorICAgICAqICAgICAgdGhlIGRlc3RpbmF0aW9uIHdlIHdpbGwgYSBsYXJnZXIgcGFydC4gKi8KKyAgICBpZiAoaiA9PSB3IC0gMSAmJiBqID09IGRlc3Rfd2lkdGggLSAxKSB7CisgICAgICB5MSA9IHNyY1lbc3JjX3lfaWR4XTsKKyAgICAgIHUxID0gc3JjVVtzcmNfdXZfaWR4IC8gMl07CisgICAgICB2MSA9IHNyY1Zbc3JjX3V2X2lkeCAvIDJdOworCisgICAgICBkZXN0WVtkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0VVtkZXN0X3V2X2lkeF0gPSBDTEFNUCAoCisgICAgICAgICAgKGRlc3RVW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyAyLCAwLAorICAgICAgICAgIDI1NSk7CisgICAgICBkZXN0VltkZXN0X3V2X2lkeF0gPQorICAgICAgICAgIENMQU1QICgoZGVzdFZbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSkgLyAyLCAwLCAyNTUpOworICAgIH0gZWxzZSBpZiAoaiA9PSB3IC0gMSkgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB1MSA9IHNyY1Vbc3JjX3V2X2lkeCAvIDJdOworICAgICAgdjEgPSBzcmNWW3NyY191dl9pZHggLyAyXTsKKworICAgICAgZGVzdFlbZGVzdF95X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgICgzICogZGVzdFVbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwgdjEpKSAvIDQsCisgICAgICAgICAgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9CisgICAgICAgICAgQ0xBTVAgKCgzICogZGVzdFZbZGVzdF91dl9pZHhdICsgQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkxLCB1MSwKKyAgICAgICAgICAgICAgICAgIHYxKSkgLyA0LCAwLCAyNTUpOworICAgIH0KKyAgfSBlbHNlIGlmIChpID09IGggLSAxKSB7CisgICAgLyogMy4xLiBIYW5kbGUgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIHBpeGVsIGlmIGl0IGRvZXNuJ3QKKyAgICAgKiAgICAgIHN0YXJ0IGF0IHRoZSBtYWNybyBwaXhlbCBib3VuZGFyeSwgaS5lLiBibGVuZCB3aXRoCisgICAgICogICAgICB0aGUgYmFja2dyb3VuZCEgKi8KKyAgICBpZiAoZGVzdF94ICUgMiA9PSAxKSB7CisgICAgICB5MSA9IHNyY1lbMF07CisgICAgICB1MSA9IHNyY1VbMF07CisgICAgICB2MSA9IHNyY1ZbMF07CisKKyAgICAgIGRlc3RZWzBdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVWzBdID0KKyAgICAgICAgICBDTEFNUCAoKDMgKiBkZXN0VVswXSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyA0LCAwLAorICAgICAgICAgIDI1NSk7CisgICAgICBkZXN0VlswXSA9CisgICAgICAgICAgQ0xBTVAgKCgzICogZGVzdFZbMF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTEsIHUxLCB2MSkpIC8gNCwgMCwKKyAgICAgICAgICAyNTUpOworCisgICAgICBqID0gZGVzdF94ICsgMTsKKyAgICAgIHNyY195X2lkeCA9IGRlc3RfeV9pZHggPSBkZXN0X3V2X2lkeCA9IDE7CisgICAgICBzcmNfdXZfaWR4ID0gKHNyY194ICUgMikgKyAxOworICAgIH0gZWxzZSB7CisgICAgICBqID0gZGVzdF94OworICAgICAgc3JjX3lfaWR4ID0gZGVzdF95X2lkeCA9IGRlc3RfdXZfaWR4ID0gMDsKKyAgICAgIHNyY191dl9pZHggPSAoc3JjX3ggJSAyKTsKKyAgICB9CisKKyAgICAvKiAzLjIuIENvcHkgYWxsIG1hY3JvIHBpeGVscyBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlIGRlc3RpbmF0aW9uCisgICAgICogICAgICBidXQgYmxlbmQgd2l0aCB0aGUgYmFja2dyb3VuZCBiZWNhdXNlIHdlJ3JlIG9ubHkgZmlsbGluZworICAgICAqICAgICAgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIG1hY3JvIHBpeGVscy4gKi8KKyAgICBmb3IgKDsgaiA8IHcgLSAxOyBqICs9IDIpIHsKKyAgICAgIHkxID0gc3JjWVtzcmNfeV9pZHhdOworICAgICAgeTIgPSBzcmNZW3NyY195X2lkeCArIDFdOworCisgICAgICB1MSA9IHNyY1Vbc3JjX3V2X2lkeCAvIDJdOworICAgICAgdjEgPSBzcmNWW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHNyY191dl9pZHgrKzsKKyAgICAgIHUyID0gc3JjVVtzcmNfdXZfaWR4IC8gMl07CisgICAgICB2MiA9IHNyY1Zbc3JjX3V2X2lkeCAvIDJdOworICAgICAgc3JjX3V2X2lkeCsrOworCisgICAgICBkZXN0WVtkZXN0X3lfaWR4XSA9IENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUxLCB2MSksIDAsIDI1NSk7CisgICAgICBkZXN0WVtkZXN0X3lfaWR4ICsgMV0gPQorICAgICAgICAgIENMQU1QIChBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTIsIHUyLCB2MiksIDAsIDI1NSk7CisKKyAgICAgIGRlc3RVW2Rlc3RfdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoMiAqIGRlc3RVW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTIsIHUyLCB2MikpIC8gNCwgMCwgMjU1KTsKKyAgICAgIGRlc3RWW2Rlc3RfdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoMiAqIGRlc3RWW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkgKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgeTIsIHUyLCB2MikpIC8gNCwgMCwgMjU1KTsKKworICAgICAgZGVzdF95X2lkeCArPSAyOworICAgICAgc3JjX3lfaWR4ICs9IDI7CisgICAgICBkZXN0X3V2X2lkeCsrOworICAgIH0KKworICAgIC8qIDMuMy4gTm93IGNvcHkgdGhlIGxhc3QgcGl4ZWwgaWYgb25lIGV4aXN0cyBhbmQgYmxlbmQgaXQKKyAgICAgKiAgICAgIHdpdGggdGhlIGJhY2tncm91bmQgYmVjYXVzZSB3ZSBvbmx5IGZpbGwgcGFydCBvZgorICAgICAqICAgICAgdGhlIG1hY3JvIHBpeGVsLiBJbiBjYXNlIHRoaXMgaXMgdGhlIGxhc3QgcGl4ZWwgb2YKKyAgICAgKiAgICAgIHRoZSBkZXN0aW5hdGlvbiB3ZSB3aWxsIGEgbGFyZ2VyIHBhcnQuICovCisgICAgaWYgKGogPT0gdyAtIDEgJiYgaiA9PSBkZXN0X3dpZHRoIC0gMSkgeworICAgICAgeTEgPSBzcmNZW3NyY195X2lkeF07CisgICAgICB1MSA9IHNyY1Vbc3JjX3V2X2lkeCAvIDJdOworICAgICAgdjEgPSBzcmNWW3NyY191dl9pZHggLyAyXTsKKworICAgICAgZGVzdFlbZGVzdF95X2lkeF0gPSBDTEFNUCAoQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpLCAwLCAyNTUpOworICAgICAgZGVzdFVbZGVzdF91dl9pZHhdID0gQ0xBTVAgKAorICAgICAgICAgIChkZXN0VVtkZXN0X3V2X2lkeF0gKyBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSkpIC8gMiwgMCwKKyAgICAgICAgICAyNTUpOworICAgICAgZGVzdFZbZGVzdF91dl9pZHhdID0KKyAgICAgICAgICBDTEFNUCAoKGRlc3RWW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkpIC8gMiwgMCwgMjU1KTsKKyAgICB9IGVsc2UgaWYgKGogPT0gdyAtIDEpIHsKKyAgICAgIHkxID0gc3JjWVtzcmNfeV9pZHhdOworICAgICAgdTEgPSBzcmNVW3NyY191dl9pZHggLyAyXTsKKyAgICAgIHYxID0gc3JjVltzcmNfdXZfaWR4IC8gMl07CisKKyAgICAgIGRlc3RZW2Rlc3RfeV9pZHhdID0gQ0xBTVAgKEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKSwgMCwgMjU1KTsKKyAgICAgIGRlc3RVW2Rlc3RfdXZfaWR4XSA9IENMQU1QICgKKyAgICAgICAgICAoMyAqIGRlc3RVW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKSkgLyA0LAorICAgICAgICAgIDAsIDI1NSk7CisgICAgICBkZXN0VltkZXN0X3V2X2lkeF0gPQorICAgICAgICAgIENMQU1QICgoMyAqIGRlc3RWW2Rlc3RfdXZfaWR4XSArIEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsCisgICAgICAgICAgICAgICAgICB2MSkpIC8gNCwgMCwgMjU1KTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NvcHlfaTQyMF9heXV2IChndWludCBpX2FscGhhLCBHc3RWaWRlb0ZyYW1lICogZGVzdF9mcmFtZSwKKyAgICBnYm9vbGVhbiBkZXN0X3NkdHYsIGdpbnQgZGVzdF94LCBnaW50IGRlc3RfeSwgR3N0VmlkZW9GcmFtZSAqIHNyY19mcmFtZSwKKyAgICBnYm9vbGVhbiBzcmNfc2R0diwgZ2ludCBzcmNfeCwgZ2ludCBzcmNfeSwgZ2ludCB3LCBnaW50IGgpCit7CisgIGNvbnN0IGd1aW50OCAqc3JjWSwgKnNyY1UsICpzcmNWOworICBnaW50IHNyY19zdHJpZGVZLCBzcmNfc3RyaWRlVSwgc3JjX3N0cmlkZVY7CisgIGdpbnQgZGVzdF9zdHJpZGU7CisgIGd1aW50OCAqZGVzdDsKKworICBzcmNfc3RyaWRlWSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoc3JjX2ZyYW1lLCAwKTsKKyAgc3JjX3N0cmlkZVUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKHNyY19mcmFtZSwgMSk7CisgIHNyY19zdHJpZGVWID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChzcmNfZnJhbWUsIDIpOworCisgIHNyY1kgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChzcmNfZnJhbWUsIDApOworICBzcmNVID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoc3JjX2ZyYW1lLCAxKTsKKyAgc3JjViA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKHNyY19mcmFtZSwgMik7CisKKyAgZGVzdF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChkZXN0X2ZyYW1lLCAwKTsKKworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3RfZnJhbWUsIDApOworICBkZXN0ID0gZGVzdCArIGRlc3RfeSAqIGRlc3Rfc3RyaWRlICsgZGVzdF94ICogNDsKKworICBzcmNZID0gc3JjWSArIHNyY195ICogc3JjX3N0cmlkZVkgKyBzcmNfeDsKKyAgc3JjVSA9IHNyY1UgKyAoc3JjX3kgLyAyKSAqIHNyY19zdHJpZGVVICsgc3JjX3ggLyAyOworICBzcmNWID0gc3JjViArIChzcmNfeSAvIDIpICogc3JjX3N0cmlkZVYgKyBzcmNfeCAvIDI7CisKKyAgaV9hbHBoYSA9IENMQU1QIChpX2FscGhhLCAwLCAyNTUpOworCisgIGlmIChzcmNfc2R0diAhPSBkZXN0X3NkdHYpIHsKKyAgICBnaW50IGksIGosIHV2X2lkeDsKKyAgICBnaW50IHksIHUsIHY7CisgICAgZ2ludCB5MSwgdTEsIHYxOworICAgIGdpbnQgbWF0cml4WzEyXTsKKworICAgIG1lbWNweSAobWF0cml4LAorICAgICAgICBkZXN0X3NkdHYgPyBjb2dfeWNiY3JfaGR0dl90b195Y2Jjcl9zZHR2X21hdHJpeF84Yml0IDoKKyAgICAgICAgY29nX3ljYmNyX3NkdHZfdG9feWNiY3JfaGR0dl9tYXRyaXhfOGJpdCwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDAsIHV2X2lkeCA9IHNyY194ICUgMjsgaiA8IHc7IGorKywgdXZfaWR4KyspIHsKKyAgICAgICAgeSA9IHNyY1lbal07CisgICAgICAgIHUgPSBzcmNVW3V2X2lkeCAvIDJdOworICAgICAgICB2ID0gc3JjVlt1dl9pZHggLyAyXTsKKworICAgICAgICB5MSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5LCB1LCB2KTsKKyAgICAgICAgdTEgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeSwgdSwgdik7CisgICAgICAgIHYxID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHksIHUsIHYpOworCisgICAgICAgIGRlc3RbNCAqIGogKyAwXSA9IGlfYWxwaGE7CisgICAgICAgIGRlc3RbNCAqIGogKyAxXSA9IHkxOworICAgICAgICBkZXN0WzQgKiBqICsgMl0gPSB1MTsKKyAgICAgICAgZGVzdFs0ICogaiArIDNdID0gdjE7CisgICAgICB9CisgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworCisgICAgICBzcmNfeSsrOworICAgICAgc3JjWSArPSBzcmNfc3RyaWRlWTsKKyAgICAgIGlmIChzcmNfeSAlIDIgPT0gMCkgeworICAgICAgICBzcmNVICs9IHNyY19zdHJpZGVVOworICAgICAgICBzcmNWICs9IHNyY19zdHJpZGVWOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBnaW50IGksIGosIHV2X2lkeDsKKyAgICBnaW50IHksIHUsIHY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwLCB1dl9pZHggPSBzcmNfeCAlIDI7IGogPCB3OyBqKyssIHV2X2lkeCsrKSB7CisgICAgICAgIHkgPSBzcmNZW2pdOworICAgICAgICB1ID0gc3JjVVt1dl9pZHggLyAyXTsKKyAgICAgICAgdiA9IHNyY1ZbdXZfaWR4IC8gMl07CisKKyAgICAgICAgZGVzdFs0ICogaiArIDBdID0gaV9hbHBoYTsKKyAgICAgICAgZGVzdFs0ICogaiArIDFdID0geTsKKyAgICAgICAgZGVzdFs0ICogaiArIDJdID0gdTsKKyAgICAgICAgZGVzdFs0ICogaiArIDNdID0gdjsKKyAgICAgIH0KKyAgICAgIGRlc3QgKz0gZGVzdF9zdHJpZGU7CisKKyAgICAgIHNyY195Kys7CisgICAgICBzcmNZICs9IHNyY19zdHJpZGVZOworICAgICAgaWYgKHNyY195ICUgMiA9PSAwKSB7CisgICAgICAgIHNyY1UgKz0gc3JjX3N0cmlkZVU7CisgICAgICAgIHNyY1YgKz0gc3JjX3N0cmlkZVY7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitmaWxsX3JnYjMyIChHc3RWaWRlb0JveEZpbGwgZmlsbF90eXBlLCBndWludCBiX2FscGhhLAorICAgIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSwgZ2Jvb2xlYW4gc2R0dikKK3sKKyAgZ3VpbnQzMiBlbXB0eV9waXhlbDsKKyAgZ2ludCBwWzRdOworICBndWludDggKmRlc3Q7CisgIGd1aW50IHN0cmlkZTsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKTsKKworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLCAwKTsKKyAgc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoZnJhbWUsIDApOworCisgIHBbMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKGZyYW1lLCAzKTsKKyAgcFsxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX09GRlNFVCAoZnJhbWUsIDApOworICBwWzJdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfT0ZGU0VUIChmcmFtZSwgMSk7CisgIHBbM10gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKGZyYW1lLCAyKTsKKworICBiX2FscGhhID0gQ0xBTVAgKGJfYWxwaGEsIDAsIDI1NSk7CisKKyAgaWYgKEdTVF9WSURFT19GUkFNRV9OX0NPTVBPTkVOVFMgKGZyYW1lKSA9PSA0KSB7CisgICAgZW1wdHlfcGl4ZWwgPSBHVUlOVDMyX0ZST01fTEUgKChiX2FscGhhIDw8IChwWzBdICogOCkpIHwKKyAgICAgICAgKHJnYl9jb2xvcnNfUltmaWxsX3R5cGVdIDw8IChwWzFdICogOCkpIHwKKyAgICAgICAgKHJnYl9jb2xvcnNfR1tmaWxsX3R5cGVdIDw8IChwWzJdICogOCkpIHwKKyAgICAgICAgKHJnYl9jb2xvcnNfQltmaWxsX3R5cGVdIDw8IChwWzNdICogOCkpKTsKKyAgfSBlbHNlIHsKKyAgICBlbXB0eV9waXhlbCA9IEdVSU5UMzJfRlJPTV9MRSAoCisgICAgICAgIChyZ2JfY29sb3JzX1JbZmlsbF90eXBlXSA8PCAocFsxXSAqIDgpKSB8CisgICAgICAgIChyZ2JfY29sb3JzX0dbZmlsbF90eXBlXSA8PCAocFsyXSAqIDgpKSB8CisgICAgICAgIChyZ2JfY29sb3JzX0JbZmlsbF90eXBlXSA8PCAocFszXSAqIDgpKSk7CisgIH0KKworICBpZiAoc3RyaWRlID09IHdpZHRoICogNCkgeworICAgIHZpZGVvX2JveF9vcmNfc3BsYXRfdTMyICgoZ3VpbnQzMiAqKSBkZXN0LCBlbXB0eV9waXhlbCwgd2lkdGggKiBoZWlnaHQpOworICB9IGVsc2UgaWYgKGhlaWdodCkgeworICAgIGZvciAoOyBoZWlnaHQ7IC0taGVpZ2h0KSB7CisgICAgICB2aWRlb19ib3hfb3JjX3NwbGF0X3UzMiAoKGd1aW50MzIgKikgZGVzdCwgZW1wdHlfcGl4ZWwsIHdpZHRoKTsKKyAgICAgIGRlc3QgKz0gc3RyaWRlOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZmlsbF9yZ2IyNCAoR3N0VmlkZW9Cb3hGaWxsIGZpbGxfdHlwZSwgZ3VpbnQgYl9hbHBoYSwKKyAgICBHc3RWaWRlb0ZyYW1lICogZnJhbWUsIGdib29sZWFuIHNkdHYpCit7CisgIGdpbnQgZGVzdF9zdHJpZGU7CisgIGdpbnQgcFs0XTsKKyAgZ2ludCBpLCBqOworICBndWludDggKmRlc3Q7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChmcmFtZSk7CisKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7CisgIGRlc3Rfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoZnJhbWUsIDApOworCisgIHBbMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKGZyYW1lLCAwKTsKKyAgcFsyXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX09GRlNFVCAoZnJhbWUsIDEpOworICBwWzNdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfT0ZGU0VUIChmcmFtZSwgMik7CisKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgIGRlc3RbMyAqIGogKyBwWzFdXSA9IHJnYl9jb2xvcnNfUltmaWxsX3R5cGVdOworICAgICAgZGVzdFszICogaiArIHBbMl1dID0gcmdiX2NvbG9yc19HW2ZpbGxfdHlwZV07CisgICAgICBkZXN0WzMgKiBqICsgcFszXV0gPSByZ2JfY29sb3JzX0JbZmlsbF90eXBlXTsKKyAgICB9CisgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorY29weV9yZ2IzMiAoZ3VpbnQgaV9hbHBoYSwgR3N0VmlkZW9GcmFtZSAqIGRlc3RfZnJhbWUsCisgICAgZ2Jvb2xlYW4gZGVzdF9zZHR2LCBnaW50IGRlc3RfeCwgZ2ludCBkZXN0X3ksIEdzdFZpZGVvRnJhbWUgKiBzcmNfZnJhbWUsCisgICAgZ2Jvb2xlYW4gc3JjX3NkdHYsIGdpbnQgc3JjX3gsIGdpbnQgc3JjX3ksIGdpbnQgdywgZ2ludCBoKQoreworICBnaW50IGksIGo7CisgIGdpbnQgc3JjX3N0cmlkZSwgZGVzdF9zdHJpZGU7CisgIGdib29sZWFuIGluX2FscGhhLCBvdXRfYWxwaGE7CisgIGdpbnQgaW5fYnBwLCBvdXRfYnBwOworICBnaW50IHBfb3V0WzRdOworICBnaW50IHBfaW5bNF07CisgIGdib29sZWFuIHBhY2tlZF9vdXQ7CisgIGdib29sZWFuIHBhY2tlZF9pbjsKKyAgZ3VpbnQ4ICpzcmMsICpkZXN0OworCisgIHNyY19zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChzcmNfZnJhbWUsIDApOworICBkZXN0X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGRlc3RfZnJhbWUsIDApOworICBpbl9icHAgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChzcmNfZnJhbWUsIDApOworICBvdXRfYnBwID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUFNUUklERSAoZGVzdF9mcmFtZSwgMCk7CisgIHBhY2tlZF9pbiA9IChpbl9icHAgPCA0KTsKKyAgcGFja2VkX291dCA9IChvdXRfYnBwIDwgNCk7CisKKyAgb3V0X2FscGhhID0gR1NUX1ZJREVPX0lORk9fSEFTX0FMUEhBICgmZGVzdF9mcmFtZS0+aW5mbyk7CisgIHBfb3V0WzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfT0ZGU0VUIChkZXN0X2ZyYW1lLCAzKTsKKyAgcF9vdXRbMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKGRlc3RfZnJhbWUsIDApOworICBwX291dFsyXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX09GRlNFVCAoZGVzdF9mcmFtZSwgMSk7CisgIHBfb3V0WzNdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfT0ZGU0VUIChkZXN0X2ZyYW1lLCAyKTsKKworICBpbl9hbHBoYSA9IEdTVF9WSURFT19JTkZPX0hBU19BTFBIQSAoJnNyY19mcmFtZS0+aW5mbyk7CisgIHBfaW5bMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKHNyY19mcmFtZSwgMyk7CisgIHBfaW5bMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKHNyY19mcmFtZSwgMCk7CisgIHBfaW5bMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKHNyY19mcmFtZSwgMSk7CisgIHBfaW5bM10gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKHNyY19mcmFtZSwgMik7CisKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0X2ZyYW1lLCAwKTsKKyAgZGVzdCA9IGRlc3QgKyBkZXN0X3kgKiBkZXN0X3N0cmlkZSArIGRlc3RfeCAqIG91dF9icHA7CisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmNfZnJhbWUsIDApOworICBzcmMgPSBzcmMgKyBzcmNfeSAqIHNyY19zdHJpZGUgKyBzcmNfeCAqIGluX2JwcDsKKworICBpZiAoaW5fYWxwaGEgJiYgb3V0X2FscGhhKSB7CisgICAgdyAqPSA0OworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqICs9IDQpIHsKKyAgICAgICAgZGVzdFtqICsgcF9vdXRbMF1dID0gKHNyY1tqICsgcF9pblswXV0gKiBpX2FscGhhKSA+PiA4OworICAgICAgICBkZXN0W2ogKyBwX291dFsxXV0gPSBzcmNbaiArIHBfaW5bMV1dOworICAgICAgICBkZXN0W2ogKyBwX291dFsyXV0gPSBzcmNbaiArIHBfaW5bMl1dOworICAgICAgICBkZXN0W2ogKyBwX291dFszXV0gPSBzcmNbaiArIHBfaW5bM11dOworICAgICAgfQorICAgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsKKyAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIH0KKyAgfSBlbHNlIGlmIChvdXRfYWxwaGEgJiYgIXBhY2tlZF9pbikgeworICAgIHcgKj0gNDsKKyAgICBpX2FscGhhID0gQ0xBTVAgKGlfYWxwaGEsIDAsIDI1NSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgdzsgaiArPSA0KSB7CisgICAgICAgIGRlc3RbaiArIHBfb3V0WzBdXSA9IGlfYWxwaGE7CisgICAgICAgIGRlc3RbaiArIHBfb3V0WzFdXSA9IHNyY1tqICsgcF9pblsxXV07CisgICAgICAgIGRlc3RbaiArIHBfb3V0WzJdXSA9IHNyY1tqICsgcF9pblsyXV07CisgICAgICAgIGRlc3RbaiArIHBfb3V0WzNdXSA9IHNyY1tqICsgcF9pblszXV07CisgICAgICB9CisgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgfQorICB9IGVsc2UgaWYgKG91dF9hbHBoYSAmJiBwYWNrZWRfaW4pIHsKKyAgICBpX2FscGhhID0gQ0xBTVAgKGlfYWxwaGEsIDAsIDI1NSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgdzsgaisrKSB7CisgICAgICAgIGRlc3RbNCAqIGogKyBwX291dFswXV0gPSBpX2FscGhhOworICAgICAgICBkZXN0WzQgKiBqICsgcF9vdXRbMV1dID0gc3JjW2luX2JwcCAqIGogKyBwX2luWzFdXTsKKyAgICAgICAgZGVzdFs0ICogaiArIHBfb3V0WzJdXSA9IHNyY1tpbl9icHAgKiBqICsgcF9pblsyXV07CisgICAgICAgIGRlc3RbNCAqIGogKyBwX291dFszXV0gPSBzcmNbaW5fYnBwICogaiArIHBfaW5bM11dOworICAgICAgfQorICAgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsKKyAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIH0KKyAgfSBlbHNlIGlmICghcGFja2VkX291dCAmJiAhcGFja2VkX2luKSB7CisgICAgdyAqPSA0OworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqICs9IDQpIHsKKyAgICAgICAgZGVzdFtqICsgcF9vdXRbMV1dID0gc3JjW2ogKyBwX2luWzFdXTsKKyAgICAgICAgZGVzdFtqICsgcF9vdXRbMl1dID0gc3JjW2ogKyBwX2luWzJdXTsKKyAgICAgICAgZGVzdFtqICsgcF9vdXRbM11dID0gc3JjW2ogKyBwX2luWzNdXTsKKyAgICAgIH0KKyAgICAgIGRlc3QgKz0gZGVzdF9zdHJpZGU7CisgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IHc7IGorKykgeworICAgICAgICBkZXN0W291dF9icHAgKiBqICsgcF9vdXRbMV1dID0gc3JjW2luX2JwcCAqIGogKyBwX2luWzFdXTsKKyAgICAgICAgZGVzdFtvdXRfYnBwICogaiArIHBfb3V0WzJdXSA9IHNyY1tpbl9icHAgKiBqICsgcF9pblsyXV07CisgICAgICAgIGRlc3Rbb3V0X2JwcCAqIGogKyBwX291dFszXV0gPSBzcmNbaW5fYnBwICogaiArIHBfaW5bM11dOworICAgICAgfQorICAgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsKKyAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorY29weV9yZ2IzMl9heXV2IChndWludCBpX2FscGhhLCBHc3RWaWRlb0ZyYW1lICogZGVzdF9mcmFtZSwKKyAgICBnYm9vbGVhbiBkZXN0X3NkdHYsIGdpbnQgZGVzdF94LCBnaW50IGRlc3RfeSwgR3N0VmlkZW9GcmFtZSAqIHNyY19mcmFtZSwKKyAgICBnYm9vbGVhbiBzcmNfc2R0diwgZ2ludCBzcmNfeCwgZ2ludCBzcmNfeSwgZ2ludCB3LCBnaW50IGgpCit7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBzcmNfc3RyaWRlLCBkZXN0X3N0cmlkZTsKKyAgZ2Jvb2xlYW4gaW5fYWxwaGE7CisgIGdpbnQgaW5fYnBwOworICBnaW50IHBfaW5bNF07CisgIGdib29sZWFuIHBhY2tlZF9pbjsKKyAgZ2ludCBtYXRyaXhbMTJdOworICBnaW50IGE7CisgIGdpbnQgeSwgdSwgdjsKKyAgZ2ludCByLCBnLCBiOworICBndWludDggKmRlc3QsICpzcmM7CisKKyAgZGVzdF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChkZXN0X2ZyYW1lLCAwKTsKKyAgc3JjX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKHNyY19mcmFtZSwgMCk7CisgIGluX2JwcCA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BTVFJJREUgKHNyY19mcmFtZSwgMCk7CisgIHBhY2tlZF9pbiA9IChpbl9icHAgPCA0KTsKKworICBpbl9hbHBoYSA9IEdTVF9WSURFT19JTkZPX0hBU19BTFBIQSAoJnNyY19mcmFtZS0+aW5mbyk7CisgIHBfaW5bMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKHNyY19mcmFtZSwgMyk7CisgIHBfaW5bMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKHNyY19mcmFtZSwgMCk7CisgIHBfaW5bMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKHNyY19mcmFtZSwgMSk7CisgIHBfaW5bM10gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKHNyY19mcmFtZSwgMik7CisKKyAgbWVtY3B5IChtYXRyaXgsCisgICAgICAoZGVzdF9zZHR2KSA/IGNvZ19yZ2JfdG9feWNiY3JfbWF0cml4XzhiaXRfc2R0diA6CisgICAgICBjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X2hkdHYsIDEyICogc2l6ZW9mIChnaW50KSk7CisKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0X2ZyYW1lLCAwKTsKKyAgZGVzdCA9IGRlc3QgKyBkZXN0X3kgKiBkZXN0X3N0cmlkZSArIGRlc3RfeCAqIDQ7CisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmNfZnJhbWUsIDApOworICBzcmMgPSBzcmMgKyBzcmNfeSAqIHNyY19zdHJpZGUgKyBzcmNfeCAqIGluX2JwcDsKKworICBpZiAoaW5fYWxwaGEpIHsKKyAgICB3ICo9IDQ7CisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IHc7IGogKz0gNCkgeworICAgICAgICBhID0gKHNyY1tqICsgcF9pblswXV0gKiBpX2FscGhhKSA+PiA4OworICAgICAgICByID0gc3JjW2ogKyBwX2luWzFdXTsKKyAgICAgICAgZyA9IHNyY1tqICsgcF9pblsyXV07CisgICAgICAgIGIgPSBzcmNbaiArIHBfaW5bM11dOworCisgICAgICAgIHkgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgciwgZywgYik7CisgICAgICAgIHUgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgciwgZywgYik7CisgICAgICAgIHYgPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMiwgciwgZywgYik7CisKKyAgICAgICAgZGVzdFtqICsgMF0gPSBhOworICAgICAgICBkZXN0W2ogKyAxXSA9IENMQU1QICh5LCAwLCAyNTUpOworICAgICAgICBkZXN0W2ogKyAyXSA9IENMQU1QICh1LCAwLCAyNTUpOworICAgICAgICBkZXN0W2ogKyAzXSA9IENMQU1QICh2LCAwLCAyNTUpOworICAgICAgfQorICAgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsKKyAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIH0KKyAgfSBlbHNlIGlmICghcGFja2VkX2luKSB7CisgICAgdyAqPSA0OworICAgIGlfYWxwaGEgPSBDTEFNUCAoaV9hbHBoYSwgMCwgMjU1KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqICs9IDQpIHsKKyAgICAgICAgYSA9IGlfYWxwaGE7CisgICAgICAgIHIgPSBzcmNbaiArIHBfaW5bMV1dOworICAgICAgICBnID0gc3JjW2ogKyBwX2luWzJdXTsKKyAgICAgICAgYiA9IHNyY1tqICsgcF9pblszXV07CisKKyAgICAgICAgeSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCByLCBnLCBiKTsKKyAgICAgICAgdSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCByLCBnLCBiKTsKKyAgICAgICAgdiA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCByLCBnLCBiKTsKKworICAgICAgICBkZXN0W2ogKyAwXSA9IGE7CisgICAgICAgIGRlc3RbaiArIDFdID0gQ0xBTVAgKHksIDAsIDI1NSk7CisgICAgICAgIGRlc3RbaiArIDJdID0gQ0xBTVAgKHUsIDAsIDI1NSk7CisgICAgICAgIGRlc3RbaiArIDNdID0gQ0xBTVAgKHYsIDAsIDI1NSk7CisgICAgICB9CisgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgfQorICB9IGVsc2UgeworICAgIGlfYWxwaGEgPSBDTEFNUCAoaV9hbHBoYSwgMCwgMjU1KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqKyspIHsKKyAgICAgICAgYSA9IGlfYWxwaGE7CisgICAgICAgIHIgPSBzcmNbaW5fYnBwICogaiArIHBfaW5bMV1dOworICAgICAgICBnID0gc3JjW2luX2JwcCAqIGogKyBwX2luWzJdXTsKKyAgICAgICAgYiA9IHNyY1tpbl9icHAgKiBqICsgcF9pblszXV07CisKKyAgICAgICAgeSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCByLCBnLCBiKTsKKyAgICAgICAgdSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCByLCBnLCBiKTsKKyAgICAgICAgdiA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCByLCBnLCBiKTsKKworICAgICAgICBkZXN0WzQgKiBqICsgMF0gPSBhOworICAgICAgICBkZXN0WzQgKiBqICsgMV0gPSBDTEFNUCAoeSwgMCwgMjU1KTsKKyAgICAgICAgZGVzdFs0ICogaiArIDJdID0gQ0xBTVAgKHUsIDAsIDI1NSk7CisgICAgICAgIGRlc3RbNCAqIGogKyAzXSA9IENMQU1QICh2LCAwLCAyNTUpOworICAgICAgfQorICAgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsKKyAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorY29weV9heXV2X3JnYjMyIChndWludCBpX2FscGhhLCBHc3RWaWRlb0ZyYW1lICogZGVzdF9mcmFtZSwKKyAgICBnYm9vbGVhbiBkZXN0X3NkdHYsIGdpbnQgZGVzdF94LCBnaW50IGRlc3RfeSwgR3N0VmlkZW9GcmFtZSAqIHNyY19mcmFtZSwKKyAgICBnYm9vbGVhbiBzcmNfc2R0diwgZ2ludCBzcmNfeCwgZ2ludCBzcmNfeSwgZ2ludCB3LCBnaW50IGgpCit7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBzcmNfc3RyaWRlLCBkZXN0X3N0cmlkZTsKKyAgZ2Jvb2xlYW4gb3V0X2FscGhhOworICBnaW50IG91dF9icHA7CisgIGdpbnQgcF9vdXRbNF07CisgIGdib29sZWFuIHBhY2tlZF9vdXQ7CisgIGdpbnQgbWF0cml4WzEyXTsKKyAgZ2ludCBhOworICBnaW50IHksIHUsIHY7CisgIGdpbnQgciwgZywgYjsKKyAgZ3VpbnQ4ICpzcmMsICpkZXN0OworCisgIHNyY19zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChzcmNfZnJhbWUsIDApOworICBkZXN0X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGRlc3RfZnJhbWUsIDApOworICBvdXRfYnBwID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUFNUUklERSAoZGVzdF9mcmFtZSwgMCk7CisgIHBhY2tlZF9vdXQgPSAob3V0X2JwcCA8IDQpOworCisgIG91dF9hbHBoYSA9IEdTVF9WSURFT19JTkZPX0hBU19BTFBIQSAoJmRlc3RfZnJhbWUtPmluZm8pOworICBwX291dFswXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX09GRlNFVCAoZGVzdF9mcmFtZSwgMyk7CisgIHBfb3V0WzFdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfT0ZGU0VUIChkZXN0X2ZyYW1lLCAwKTsKKyAgcF9vdXRbMl0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKGRlc3RfZnJhbWUsIDEpOworICBwX291dFszXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX09GRlNFVCAoZGVzdF9mcmFtZSwgMik7CisKKyAgbWVtY3B5IChtYXRyaXgsCisgICAgICAoc3JjX3NkdHYpID8gY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2IDoKKyAgICAgIGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfaGR0diwgMTIgKiBzaXplb2YgKGdpbnQpKTsKKworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3RfZnJhbWUsIDApOworICBkZXN0ID0gZGVzdCArIGRlc3RfeSAqIGRlc3Rfc3RyaWRlICsgZGVzdF94ICogb3V0X2JwcDsKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyY19mcmFtZSwgMCk7CisgIHNyYyA9IHNyYyArIHNyY195ICogc3JjX3N0cmlkZSArIHNyY194ICogNDsKKworICBpZiAob3V0X2FscGhhKSB7CisgICAgdyAqPSA0OworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqICs9IDQpIHsKKyAgICAgICAgYSA9IChzcmNbaiArIDBdICogaV9hbHBoYSkgPj4gODsKKyAgICAgICAgeSA9IHNyY1tqICsgMV07CisgICAgICAgIHUgPSBzcmNbaiArIDJdOworICAgICAgICB2ID0gc3JjW2ogKyAzXTsKKworICAgICAgICByID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHksIHUsIHYpOworICAgICAgICBnID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHksIHUsIHYpOworICAgICAgICBiID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHksIHUsIHYpOworCisgICAgICAgIGRlc3RbaiArIHBfb3V0WzBdXSA9IGE7CisgICAgICAgIGRlc3RbaiArIHBfb3V0WzFdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgICBkZXN0W2ogKyBwX291dFsyXV0gPSBDTEFNUCAoZywgMCwgMjU1KTsKKyAgICAgICAgZGVzdFtqICsgcF9vdXRbM11dID0gQ0xBTVAgKGIsIDAsIDI1NSk7CisgICAgICB9CisgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgfQorICB9IGVsc2UgaWYgKCFwYWNrZWRfb3V0KSB7CisgICAgdyAqPSA0OworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqICs9IDQpIHsKKyAgICAgICAgeSA9IHNyY1tqICsgMV07CisgICAgICAgIHUgPSBzcmNbaiArIDJdOworICAgICAgICB2ID0gc3JjW2ogKyAzXTsKKworICAgICAgICByID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHksIHUsIHYpOworICAgICAgICBnID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHksIHUsIHYpOworICAgICAgICBiID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHksIHUsIHYpOworCisgICAgICAgIGRlc3RbaiArIHBfb3V0WzFdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgICBkZXN0W2ogKyBwX291dFsyXV0gPSBDTEFNUCAoZywgMCwgMjU1KTsKKyAgICAgICAgZGVzdFtqICsgcF9vdXRbM11dID0gQ0xBTVAgKGIsIDAsIDI1NSk7CisgICAgICB9CisgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqKyspIHsKKyAgICAgICAgeSA9IHNyY1s0ICogaiArIDFdOworICAgICAgICB1ID0gc3JjWzQgKiBqICsgMl07CisgICAgICAgIHYgPSBzcmNbNCAqIGogKyAzXTsKKworICAgICAgICByID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHksIHUsIHYpOworICAgICAgICBnID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHksIHUsIHYpOworICAgICAgICBiID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHksIHUsIHYpOworCisgICAgICAgIGRlc3Rbb3V0X2JwcCAqIGogKyBwX291dFsxXV0gPSBDTEFNUCAociwgMCwgMjU1KTsKKyAgICAgICAgZGVzdFtvdXRfYnBwICogaiArIHBfb3V0WzJdXSA9IENMQU1QIChnLCAwLCAyNTUpOworICAgICAgICBkZXN0W291dF9icHAgKiBqICsgcF9vdXRbM11dID0gQ0xBTVAgKGIsIDAsIDI1NSk7CisgICAgICB9CisgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitmaWxsX2dyYXkgKEdzdFZpZGVvQm94RmlsbCBmaWxsX3R5cGUsIGd1aW50IGJfYWxwaGEsCisgICAgR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBnYm9vbGVhbiBzZHR2KQoreworICBnaW50IGksIGo7CisgIGdpbnQgZGVzdF9zdHJpZGU7CisgIGd1aW50OCAqZGVzdDsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBHc3RWaWRlb0Zvcm1hdCBmb3JtYXQ7CisKKyAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZSQU1FX0ZPUk1BVCAoZnJhbWUpOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKTsKKworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLCAwKTsKKyAgZGVzdF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMCk7CisKKyAgaWYgKGZvcm1hdCA9PSBHU1RfVklERU9fRk9STUFUX0dSQVk4KSB7CisgICAgZ3VpbnQ4IHZhbCA9IHl1dl9zZHR2X2NvbG9yc19ZW2ZpbGxfdHlwZV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIG1lbXNldCAoZGVzdCwgdmFsLCB3aWR0aCk7CisgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBndWludDE2IHZhbCA9IHl1dl9zZHR2X2NvbG9yc19ZW2ZpbGxfdHlwZV0gPDwgODsKKworICAgIGlmIChmb3JtYXQgPT0gR1NUX1ZJREVPX0ZPUk1BVF9HUkFZMTZfQkUpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICAgIEdTVF9XUklURV9VSU5UMTZfQkUgKGRlc3QgKyAyICogaiwgdmFsKTsKKyAgICAgICAgfQorICAgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICBHU1RfV1JJVEVfVUlOVDE2X0xFIChkZXN0ICsgMiAqIGosIHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NvcHlfcGFja2VkX3NpbXBsZSAoZ3VpbnQgaV9hbHBoYSwgR3N0VmlkZW9GcmFtZSAqIGRlc3RfZnJhbWUsCisgICAgZ2Jvb2xlYW4gZGVzdF9zZHR2LCBnaW50IGRlc3RfeCwgZ2ludCBkZXN0X3ksIEdzdFZpZGVvRnJhbWUgKiBzcmNfZnJhbWUsCisgICAgZ2Jvb2xlYW4gc3JjX3NkdHYsIGdpbnQgc3JjX3gsIGdpbnQgc3JjX3ksIGdpbnQgdywgZ2ludCBoKQoreworICBnaW50IGk7CisgIGdpbnQgc3JjX3N0cmlkZSwgZGVzdF9zdHJpZGU7CisgIGdpbnQgcGl4ZWxfc3RyaWRlLCByb3dfc2l6ZTsKKyAgZ3VpbnQ4ICpzcmMsICpkZXN0OworCisgIHNyY19zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChzcmNfZnJhbWUsIDApOworICBkZXN0X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGRlc3RfZnJhbWUsIDApOworICBwaXhlbF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChkZXN0X2ZyYW1lLCAwKTsKKyAgcm93X3NpemUgPSB3ICogcGl4ZWxfc3RyaWRlOworCisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdF9mcmFtZSwgMCk7CisgIGRlc3QgPSBkZXN0ICsgZGVzdF95ICogZGVzdF9zdHJpZGUgKyBkZXN0X3ggKiBwaXhlbF9zdHJpZGU7CisgIHNyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmNfZnJhbWUsIDApOworICBzcmMgPSBzcmMgKyBzcmNfeSAqIHNyY19zdHJpZGUgKyBzcmNfeCAqIHBpeGVsX3N0cmlkZTsKKworICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgbWVtY3B5IChkZXN0LCBzcmMsIHJvd19zaXplKTsKKyAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworICAgIHNyYyArPSBzcmNfc3RyaWRlOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitmaWxsX3l1eTIgKEdzdFZpZGVvQm94RmlsbCBmaWxsX3R5cGUsIGd1aW50IGJfYWxwaGEsCisgICAgR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBnYm9vbGVhbiBzZHR2KQoreworICBndWludDggeSwgdSwgdjsKKyAgZ2ludCBpLCBqOworICBnaW50IHN0cmlkZTsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBndWludDggKmRlc3Q7CisgIEdzdFZpZGVvRm9ybWF0IGZvcm1hdDsKKworICBmb3JtYXQgPSBHU1RfVklERU9fRlJBTUVfRk9STUFUIChmcmFtZSk7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoZnJhbWUpOworCisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZnJhbWUsIDApOworICBzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMCk7CisKKyAgeSA9IChzZHR2KSA/IHl1dl9zZHR2X2NvbG9yc19ZW2ZpbGxfdHlwZV0gOiB5dXZfaGR0dl9jb2xvcnNfWVtmaWxsX3R5cGVdOworICB1ID0gKHNkdHYpID8geXV2X3NkdHZfY29sb3JzX1VbZmlsbF90eXBlXSA6IHl1dl9oZHR2X2NvbG9yc19VW2ZpbGxfdHlwZV07CisgIHYgPSAoc2R0dikgPyB5dXZfc2R0dl9jb2xvcnNfVltmaWxsX3R5cGVdIDogeXV2X2hkdHZfY29sb3JzX1ZbZmlsbF90eXBlXTsKKworICB3aWR0aCA9IHdpZHRoICsgKHdpZHRoICUgMik7CisKKyAgaWYgKGZvcm1hdCA9PSBHU1RfVklERU9fRk9STUFUX1lVWTIpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaiArPSAyKSB7CisgICAgICAgIGRlc3RbaiAqIDIgKyAwXSA9IHk7CisgICAgICAgIGRlc3RbaiAqIDIgKyAxXSA9IHU7CisgICAgICAgIGRlc3RbaiAqIDIgKyAyXSA9IHk7CisgICAgICAgIGRlc3RbaiAqIDIgKyAzXSA9IHY7CisgICAgICB9CisKKyAgICAgIGRlc3QgKz0gc3RyaWRlOworICAgIH0KKyAgfSBlbHNlIGlmIChmb3JtYXQgPT0gR1NUX1ZJREVPX0ZPUk1BVF9ZVllVKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGogKz0gMikgeworICAgICAgICBkZXN0W2ogKiAyICsgMF0gPSB5OworICAgICAgICBkZXN0W2ogKiAyICsgMV0gPSB2OworICAgICAgICBkZXN0W2ogKiAyICsgMl0gPSB5OworICAgICAgICBkZXN0W2ogKiAyICsgM10gPSB1OworICAgICAgfQorCisgICAgICBkZXN0ICs9IHN0cmlkZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGogKz0gMikgeworICAgICAgICBkZXN0W2ogKiAyICsgMF0gPSB1OworICAgICAgICBkZXN0W2ogKiAyICsgMV0gPSB5OworICAgICAgICBkZXN0W2ogKiAyICsgMl0gPSB2OworICAgICAgICBkZXN0W2ogKiAyICsgM10gPSB5OworICAgICAgfQorCisgICAgICBkZXN0ICs9IHN0cmlkZTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NvcHlfeXV5Ml95dXkyIChndWludCBpX2FscGhhLCBHc3RWaWRlb0ZyYW1lICogZGVzdF9mcmFtZSwKKyAgICBnYm9vbGVhbiBkZXN0X3NkdHYsIGdpbnQgZGVzdF94LCBnaW50IGRlc3RfeSwgR3N0VmlkZW9GcmFtZSAqIHNyY19mcmFtZSwKKyAgICBnYm9vbGVhbiBzcmNfc2R0diwgZ2ludCBzcmNfeCwgZ2ludCBzcmNfeSwgZ2ludCB3LCBnaW50IGgpCit7CisgIGdpbnQgaSwgajsKKyAgZ2ludCBzcmNfc3RyaWRlLCBkZXN0X3N0cmlkZTsKKyAgZ3VpbnQ4ICpzcmMsICpkZXN0OworICBHc3RWaWRlb0Zvcm1hdCBzcmNfZm9ybWF0OworCisgIHNyY19mb3JtYXQgPSBHU1RfVklERU9fRlJBTUVfRk9STUFUIChzcmNfZnJhbWUpOworCisgIHNyY19zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChzcmNfZnJhbWUsIDApOworICBkZXN0X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGRlc3RfZnJhbWUsIDApOworCisgIGRlc3RfeCA9IChkZXN0X3ggJiB+MSk7CisgIHNyY194ID0gKHNyY194ICYgfjEpOworCisgIHcgPSB3ICsgKHcgJSAyKTsKKworICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3RfZnJhbWUsIDApOworICBkZXN0ID0gZGVzdCArIGRlc3RfeSAqIGRlc3Rfc3RyaWRlICsgZGVzdF94ICogMjsKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyY19mcmFtZSwgMCk7CisgIHNyYyA9IHNyYyArIHNyY195ICogc3JjX3N0cmlkZSArIHNyY194ICogMjsKKworICBpZiAoc3JjX3NkdHYgIT0gZGVzdF9zZHR2KSB7CisgICAgZ2ludCB5MSwgdTEsIHYxOworICAgIGdpbnQgeTIsIHUyLCB2MjsKKyAgICBnaW50IG1hdHJpeFsxMl07CisKKyAgICBtZW1jcHkgKG1hdHJpeCwKKyAgICAgICAgZGVzdF9zZHR2ID8gY29nX3ljYmNyX2hkdHZfdG9feWNiY3Jfc2R0dl9tYXRyaXhfOGJpdCA6CisgICAgICAgIGNvZ195Y2Jjcl9zZHR2X3RvX3ljYmNyX2hkdHZfbWF0cml4XzhiaXQsIDEyICogc2l6ZW9mIChnaW50KSk7CisKKyAgICBpZiAoc3JjX2Zvcm1hdCA9PSBHU1RfVklERU9fRk9STUFUX1lVWTIpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHc7IGogKz0gMikgeworICAgICAgICAgIHkxID0gc3JjW2ogKiAyICsgMF07CisgICAgICAgICAgeTIgPSBzcmNbaiAqIDIgKyAyXTsKKyAgICAgICAgICB1MSA9IHUyID0gc3JjW2ogKiAyICsgMV07CisgICAgICAgICAgdjEgPSB2MiA9IHNyY1tqICogMiArIDNdOworCisgICAgICAgICAgZGVzdFtqICogMiArIDBdID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpOworICAgICAgICAgIGRlc3RbaiAqIDIgKyAxXSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAxLCB5MSwgdTEsIHYxKTsKKyAgICAgICAgICBkZXN0W2ogKiAyICsgMl0gPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUyLCB2Mik7CisgICAgICAgICAgZGVzdFtqICogMiArIDNdID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDIsIHkyLCB1MiwgdjIpOworICAgICAgICB9CisgICAgICAgIGRlc3QgKz0gZGVzdF9zdHJpZGU7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3JjX2Zvcm1hdCA9PSBHU1RfVklERU9fRk9STUFUX1lWWVUpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHc7IGogKz0gMikgeworICAgICAgICAgIHkxID0gc3JjW2ogKiAyICsgMF07CisgICAgICAgICAgeTIgPSBzcmNbaiAqIDIgKyAyXTsKKyAgICAgICAgICB2MSA9IHYyID0gc3JjW2ogKiAyICsgMV07CisgICAgICAgICAgdTEgPSB1MiA9IHNyY1tqICogMiArIDNdOworCisgICAgICAgICAgZGVzdFtqICogMiArIDBdID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MSwgdjEpOworICAgICAgICAgIGRlc3RbaiAqIDIgKyAxXSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MSwgdTEsIHYxKTsKKyAgICAgICAgICBkZXN0W2ogKiAyICsgMl0gPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMCwgeTEsIHUyLCB2Mik7CisgICAgICAgICAgZGVzdFtqICogMiArIDNdID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDEsIHkyLCB1MiwgdjIpOworICAgICAgICB9CisgICAgICAgIGRlc3QgKz0gZGVzdF9zdHJpZGU7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqICs9IDIpIHsKKyAgICAgICAgICB1MSA9IHUyID0gc3JjW2ogKiAyICsgMF07CisgICAgICAgICAgdjEgPSB2MiA9IHNyY1tqICogMiArIDJdOworICAgICAgICAgIHkxID0gc3JjW2ogKiAyICsgMV07CisgICAgICAgICAgeTIgPSBzcmNbaiAqIDIgKyAzXTsKKworICAgICAgICAgIGRlc3RbaiAqIDIgKyAxXSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAwLCB5MSwgdTEsIHYxKTsKKyAgICAgICAgICBkZXN0W2ogKiAyICsgMF0gPSBBUFBMWV9NQVRSSVggKG1hdHJpeCwgMSwgeTEsIHUxLCB2MSk7CisgICAgICAgICAgZGVzdFtqICogMiArIDNdID0gQVBQTFlfTUFUUklYIChtYXRyaXgsIDAsIHkxLCB1MiwgdjIpOworICAgICAgICAgIGRlc3RbaiAqIDIgKyAyXSA9IEFQUExZX01BVFJJWCAobWF0cml4LCAyLCB5MiwgdTIsIHYyKTsKKyAgICAgICAgfQorICAgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOworICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgbWVtY3B5IChkZXN0LCBzcmMsIHcgKiAyKTsKKyAgICAgIGRlc3QgKz0gZGVzdF9zdHJpZGU7CisgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICB9CisgIH0KK30KKworI2RlZmluZSBERUZBVUxUX0xFRlQgICAgICAwCisjZGVmaW5lIERFRkFVTFRfUklHSFQgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9UT1AgICAgICAgMAorI2RlZmluZSBERUZBVUxUX0JPVFRPTSAgICAwCisjZGVmaW5lIERFRkFVTFRfRklMTF9UWVBFIFZJREVPX0JPWF9GSUxMX0JMQUNLCisjZGVmaW5lIERFRkFVTFRfQUxQSEEgICAgIDEuMAorI2RlZmluZSBERUZBVUxUX0JPUkRFUl9BTFBIQSAxLjAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTEVGVCwKKyAgUFJPUF9SSUdIVCwKKyAgUFJPUF9UT1AsCisgIFBST1BfQk9UVE9NLAorICBQUk9QX0ZJTExfVFlQRSwKKyAgUFJPUF9BTFBIQSwKKyAgUFJPUF9CT1JERVJfQUxQSEEsCisgIFBST1BfQVVUT0NST1AKKyAgICAgIC8qIEZJTEwgTUUgKi8KK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfdmlkZW9fYm94X3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBBWVVWLCAiCisgICAgICAgICAgICAiQVJHQiwgQkdSQSwgQUJHUiwgUkdCQSwgeFJHQiwgQkdSeCwgeEJHUiwgUkdCeCwgUkdCLCBCR1IsICIKKyAgICAgICAgICAgICJZNDQ0LCBZNDJCLCBZVVkyLCBZVllVLCBVWVZZLCBJNDIwLCBZVjEyLCBZNDFCLCAiCisgICAgICAgICAgICAiR1JBWTgsIEdSQVkxNl9CRSwgR1JBWTE2X0xFIH0gIikpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF92aWRlb19ib3hfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IEFZVVYsICIKKyAgICAgICAgICAgICJBUkdCLCBCR1JBLCBBQkdSLCBSR0JBLCB4UkdCLCBCR1J4LCB4QkdSLCBSR0J4LCBSR0IsIEJHUiwgIgorICAgICAgICAgICAgIlk0NDQsIFk0MkIsIFlVWTIsIFlWWVUsIFVZVlksIEk0MjAsIFlWMTIsIFk0MUIsICIKKyAgICAgICAgICAgICJHUkFZOCwgR1JBWTE2X0JFLCBHUkFZMTZfTEUgfSAiKSkKKyAgICApOworCisjZGVmaW5lIGdzdF92aWRlb19ib3hfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0VmlkZW9Cb3gsIGdzdF92aWRlb19ib3gsIEdTVF9UWVBFX1ZJREVPX0ZJTFRFUik7CisKK3N0YXRpYyB2b2lkIGdzdF92aWRlb19ib3hfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3ZpZGVvX2JveF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdmlkZW9fYm94X3JlY2FsY190cmFuc2Zvcm0gKEdzdFZpZGVvQm94ICogdmlkZW9fYm94KTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfdmlkZW9fYm94X3RyYW5zZm9ybV9jYXBzIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwgR3N0Q2FwcyAqIGZyb20sIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIHZvaWQgZ3N0X3ZpZGVvX2JveF9iZWZvcmVfdHJhbnNmb3JtIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0QnVmZmVyICogaW4pOworc3RhdGljIGdib29sZWFuIGdzdF92aWRlb19ib3hfc3JjX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdmlkZW9fYm94X3NldF9pbmZvIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsIEdzdENhcHMgKiBpbiwKKyAgICBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLCBHc3RDYXBzICogb3V0LCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfdmlkZW9fYm94X3RyYW5zZm9ybV9mcmFtZSAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLAorICAgIEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSk7CisKKyNkZWZpbmUgR1NUX1RZUEVfVklERU9fQk9YX0ZJTEwgKGdzdF92aWRlb19ib3hfZmlsbF9nZXRfdHlwZSgpKQorc3RhdGljIEdUeXBlCitnc3RfdmlkZW9fYm94X2ZpbGxfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB2aWRlb19ib3hfZmlsbF90eXBlID0gMDsKKyAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmlkZW9fYm94X2ZpbGxbXSA9IHsKKyAgICB7VklERU9fQk9YX0ZJTExfQkxBQ0ssICJCbGFjayIsICJibGFjayJ9LAorICAgIHtWSURFT19CT1hfRklMTF9HUkVFTiwgIkdyZWVuIiwgImdyZWVuIn0sCisgICAge1ZJREVPX0JPWF9GSUxMX0JMVUUsICJCbHVlIiwgImJsdWUifSwKKyAgICB7VklERU9fQk9YX0ZJTExfUkVELCAiUmVkIiwgInJlZCJ9LAorICAgIHtWSURFT19CT1hfRklMTF9ZRUxMT1csICJZZWxsb3ciLCAieWVsbG93In0sCisgICAge1ZJREVPX0JPWF9GSUxMX1dISVRFLCAiV2hpdGUiLCAid2hpdGUifSwKKyAgICB7MCwgTlVMTCwgTlVMTH0sCisgIH07CisKKyAgaWYgKCF2aWRlb19ib3hfZmlsbF90eXBlKSB7CisgICAgdmlkZW9fYm94X2ZpbGxfdHlwZSA9CisgICAgICAgIGdfZW51bV9yZWdpc3Rlcl9zdGF0aWMgKCJHc3RWaWRlb0JveEZpbGwiLCB2aWRlb19ib3hfZmlsbCk7CisgIH0KKyAgcmV0dXJuIHZpZGVvX2JveF9maWxsX3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fYm94X2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RWaWRlb0JveCAqdmlkZW9fYm94ID0gR1NUX1ZJREVPX0JPWCAob2JqZWN0KTsKKworICBnX211dGV4X2NsZWFyICgmdmlkZW9fYm94LT5tdXRleCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JveF9jbGFzc19pbml0IChHc3RWaWRlb0JveENsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikgKGtsYXNzKTsKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzICp0cmFuc19jbGFzcyA9IChHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKikga2xhc3M7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgKnZmaWx0ZXJfY2xhc3MgPSAoR3N0VmlkZW9GaWx0ZXJDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdmlkZW9fYm94X3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3ZpZGVvX2JveF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3ZpZGVvX2JveF9maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0ZJTExfVFlQRSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgiZmlsbCIsICJGaWxsIiwgIkhvdyB0byBmaWxsIHRoZSBib3JkZXJzIiwKKyAgICAgICAgICBHU1RfVFlQRV9WSURFT19CT1hfRklMTCwgREVGQVVMVF9GSUxMX1RZUEUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0xFRlQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgibGVmdCIsICJMZWZ0IiwKKyAgICAgICAgICAiUGl4ZWxzIHRvIGJveCBhdCBsZWZ0ICg8MCAgPSBhZGQgYSBib3JkZXIpIiwgR19NSU5JTlQsIEdfTUFYSU5ULAorICAgICAgICAgIERFRkFVTFRfTEVGVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfUklHSFQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicmlnaHQiLCAiUmlnaHQiLAorICAgICAgICAgICJQaXhlbHMgdG8gYm94IGF0IHJpZ2h0ICg8MCA9IGFkZCBhIGJvcmRlcikiLCBHX01JTklOVCwgR19NQVhJTlQsCisgICAgICAgICAgREVGQVVMVF9SSUdIVCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKEdfT0JKRUNUX0NMQVNTIChrbGFzcyksIFBST1BfVE9QLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInRvcCIsICJUb3AiLAorICAgICAgICAgICJQaXhlbHMgdG8gYm94IGF0IHRvcCAoPDAgPSBhZGQgYSBib3JkZXIpIiwgR19NSU5JTlQsIEdfTUFYSU5ULAorICAgICAgICAgIERFRkFVTFRfVE9QLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9CT1RUT00sCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiYm90dG9tIiwgIkJvdHRvbSIsCisgICAgICAgICAgIlBpeGVscyB0byBib3ggYXQgYm90dG9tICg8MCA9IGFkZCBhIGJvcmRlcikiLCBHX01JTklOVCwgR19NQVhJTlQsCisgICAgICAgICAgREVGQVVMVF9CT1RUT00sCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0FMUEhBLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImFscGhhIiwgIkFscGhhIiwgIkFscGhhIHZhbHVlIHBpY3R1cmUiLCAwLjAsIDEuMCwKKyAgICAgICAgICBERUZBVUxUX0FMUEhBLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9CT1JERVJfQUxQSEEsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYm9yZGVyLWFscGhhIiwgIkJvcmRlciBBbHBoYSIsCisgICAgICAgICAgIkFscGhhIHZhbHVlIG9mIHRoZSBib3JkZXIiLCAwLjAsIDEuMCwgREVGQVVMVF9CT1JERVJfQUxQSEEsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworICAvKioKKyAgICogR3N0VmlkZW9Cb3g6YXV0b2Nyb3A6CisgICAqCisgICAqIElmIHNldCB0byAlVFJVRSB2aWRlb2JveCB3aWxsIGF1dG9tYXRpY2FsbHkgY3JvcC9wYWQgdGhlIGlucHV0CisgICAqIHZpZGVvIHRvIGJlIGNlbnRlcmVkIGluIHRoZSBvdXRwdXQuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0FVVE9DUk9QLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJhdXRvY3JvcCIsICJBdXRvIGNyb3AiLAorICAgICAgICAgICJBdXRvIGNyb3AiLCBGQUxTRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgdHJhbnNfY2xhc3MtPmJlZm9yZV90cmFuc2Zvcm0gPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19ib3hfYmVmb3JlX3RyYW5zZm9ybSk7CisgIHRyYW5zX2NsYXNzLT50cmFuc2Zvcm1fY2FwcyA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3ZpZGVvX2JveF90cmFuc2Zvcm1fY2Fwcyk7CisgIHRyYW5zX2NsYXNzLT5zcmNfZXZlbnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3ZpZGVvX2JveF9zcmNfZXZlbnQpOworCisgIHZmaWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19ib3hfc2V0X2luZm8pOworICB2ZmlsdGVyX2NsYXNzLT50cmFuc2Zvcm1fZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2ZyYW1lKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiVmlkZW8gYm94IGZpbHRlciIsCisgICAgICAiRmlsdGVyL0VmZmVjdC9WaWRlbyIsCisgICAgICAiUmVzaXplcyBhIHZpZGVvIGJ5IGFkZGluZyBib3JkZXJzIG9yIGNyb3BwaW5nIiwKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF92aWRlb19ib3hfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF92aWRlb19ib3hfc3JjX3RlbXBsYXRlKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19ib3hfaW5pdCAoR3N0VmlkZW9Cb3ggKiB2aWRlb19ib3gpCit7CisgIHZpZGVvX2JveC0+Ym94X3JpZ2h0ID0gREVGQVVMVF9SSUdIVDsKKyAgdmlkZW9fYm94LT5ib3hfbGVmdCA9IERFRkFVTFRfTEVGVDsKKyAgdmlkZW9fYm94LT5ib3hfdG9wID0gREVGQVVMVF9UT1A7CisgIHZpZGVvX2JveC0+Ym94X2JvdHRvbSA9IERFRkFVTFRfQk9UVE9NOworICB2aWRlb19ib3gtPmNyb3BfcmlnaHQgPSAwOworICB2aWRlb19ib3gtPmNyb3BfbGVmdCA9IDA7CisgIHZpZGVvX2JveC0+Y3JvcF90b3AgPSAwOworICB2aWRlb19ib3gtPmNyb3BfYm90dG9tID0gMDsKKyAgdmlkZW9fYm94LT5maWxsX3R5cGUgPSBERUZBVUxUX0ZJTExfVFlQRTsKKyAgdmlkZW9fYm94LT5hbHBoYSA9IERFRkFVTFRfQUxQSEE7CisgIHZpZGVvX2JveC0+Ym9yZGVyX2FscGhhID0gREVGQVVMVF9CT1JERVJfQUxQSEE7CisgIHZpZGVvX2JveC0+YXV0b2Nyb3AgPSBGQUxTRTsKKworICBnX211dGV4X2luaXQgKCZ2aWRlb19ib3gtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19ib3hfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFZpZGVvQm94ICp2aWRlb19ib3ggPSBHU1RfVklERU9fQk9YIChvYmplY3QpOworCisgIGdfbXV0ZXhfbG9jayAoJnZpZGVvX2JveC0+bXV0ZXgpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTEVGVDoKKyAgICAgIHZpZGVvX2JveC0+Ym94X2xlZnQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGlmICh2aWRlb19ib3gtPmJveF9sZWZ0IDwgMCkgeworICAgICAgICB2aWRlb19ib3gtPmJvcmRlcl9sZWZ0ID0gLXZpZGVvX2JveC0+Ym94X2xlZnQ7CisgICAgICAgIHZpZGVvX2JveC0+Y3JvcF9sZWZ0ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZpZGVvX2JveC0+Ym9yZGVyX2xlZnQgPSAwOworICAgICAgICB2aWRlb19ib3gtPmNyb3BfbGVmdCA9IHZpZGVvX2JveC0+Ym94X2xlZnQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUklHSFQ6CisgICAgICB2aWRlb19ib3gtPmJveF9yaWdodCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgaWYgKHZpZGVvX2JveC0+Ym94X3JpZ2h0IDwgMCkgeworICAgICAgICB2aWRlb19ib3gtPmJvcmRlcl9yaWdodCA9IC12aWRlb19ib3gtPmJveF9yaWdodDsKKyAgICAgICAgdmlkZW9fYm94LT5jcm9wX3JpZ2h0ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZpZGVvX2JveC0+Ym9yZGVyX3JpZ2h0ID0gMDsKKyAgICAgICAgdmlkZW9fYm94LT5jcm9wX3JpZ2h0ID0gdmlkZW9fYm94LT5ib3hfcmlnaHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVE9QOgorICAgICAgdmlkZW9fYm94LT5ib3hfdG9wID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBpZiAodmlkZW9fYm94LT5ib3hfdG9wIDwgMCkgeworICAgICAgICB2aWRlb19ib3gtPmJvcmRlcl90b3AgPSAtdmlkZW9fYm94LT5ib3hfdG9wOworICAgICAgICB2aWRlb19ib3gtPmNyb3BfdG9wID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZpZGVvX2JveC0+Ym9yZGVyX3RvcCA9IDA7CisgICAgICAgIHZpZGVvX2JveC0+Y3JvcF90b3AgPSB2aWRlb19ib3gtPmJveF90b3A7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQk9UVE9NOgorICAgICAgdmlkZW9fYm94LT5ib3hfYm90dG9tID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBpZiAodmlkZW9fYm94LT5ib3hfYm90dG9tIDwgMCkgeworICAgICAgICB2aWRlb19ib3gtPmJvcmRlcl9ib3R0b20gPSAtdmlkZW9fYm94LT5ib3hfYm90dG9tOworICAgICAgICB2aWRlb19ib3gtPmNyb3BfYm90dG9tID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZpZGVvX2JveC0+Ym9yZGVyX2JvdHRvbSA9IDA7CisgICAgICAgIHZpZGVvX2JveC0+Y3JvcF9ib3R0b20gPSB2aWRlb19ib3gtPmJveF9ib3R0b207CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRklMTF9UWVBFOgorICAgICAgdmlkZW9fYm94LT5maWxsX3R5cGUgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQUxQSEE6CisgICAgICB2aWRlb19ib3gtPmFscGhhID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQk9SREVSX0FMUEhBOgorICAgICAgdmlkZW9fYm94LT5ib3JkZXJfYWxwaGEgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9BVVRPQ1JPUDoKKyAgICAgIHZpZGVvX2JveC0+YXV0b2Nyb3AgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisgIGdzdF92aWRlb19ib3hfcmVjYWxjX3RyYW5zZm9ybSAodmlkZW9fYm94KTsKKworICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb19ib3gsICJDYWxsaW5nIHJlY29uZmlndXJlIik7CisgIGdzdF9iYXNlX3RyYW5zZm9ybV9yZWNvbmZpZ3VyZV9zcmMgKEdTVF9CQVNFX1RSQU5TRk9STV9DQVNUICh2aWRlb19ib3gpKTsKKworICBnX211dGV4X3VubG9jayAoJnZpZGVvX2JveC0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JveF9hdXRvY3JvcCAoR3N0VmlkZW9Cb3ggKiB2aWRlb19ib3gpCit7CisgIGdpbnQgY3JvcF93ID0gdmlkZW9fYm94LT5pbl93aWR0aCAtIHZpZGVvX2JveC0+b3V0X3dpZHRoOworICBnaW50IGNyb3BfaCA9IHZpZGVvX2JveC0+aW5faGVpZ2h0IC0gdmlkZW9fYm94LT5vdXRfaGVpZ2h0OworCisgIHZpZGVvX2JveC0+Ym94X2xlZnQgPSBjcm9wX3cgLyAyOworICBpZiAodmlkZW9fYm94LT5ib3hfbGVmdCA8IDApIHsKKyAgICB2aWRlb19ib3gtPmJvcmRlcl9sZWZ0ID0gLXZpZGVvX2JveC0+Ym94X2xlZnQ7CisgICAgdmlkZW9fYm94LT5jcm9wX2xlZnQgPSAwOworICB9IGVsc2UgeworICAgIHZpZGVvX2JveC0+Ym9yZGVyX2xlZnQgPSAwOworICAgIHZpZGVvX2JveC0+Y3JvcF9sZWZ0ID0gdmlkZW9fYm94LT5ib3hfbGVmdDsKKyAgfQorCisgIC8qIFJvdW5kIGRvd24vdXAgZm9yIG9kZCB3aWR0aCBkaWZmZXJlbmNlcyAqLworICBpZiAoY3JvcF93IDwgMCkKKyAgICBjcm9wX3cgLT0gMTsKKyAgZWxzZQorICAgIGNyb3BfdyArPSAxOworCisgIHZpZGVvX2JveC0+Ym94X3JpZ2h0ID0gY3JvcF93IC8gMjsKKyAgaWYgKHZpZGVvX2JveC0+Ym94X3JpZ2h0IDwgMCkgeworICAgIHZpZGVvX2JveC0+Ym9yZGVyX3JpZ2h0ID0gLXZpZGVvX2JveC0+Ym94X3JpZ2h0OworICAgIHZpZGVvX2JveC0+Y3JvcF9yaWdodCA9IDA7CisgIH0gZWxzZSB7CisgICAgdmlkZW9fYm94LT5ib3JkZXJfcmlnaHQgPSAwOworICAgIHZpZGVvX2JveC0+Y3JvcF9yaWdodCA9IHZpZGVvX2JveC0+Ym94X3JpZ2h0OworICB9CisKKyAgdmlkZW9fYm94LT5ib3hfdG9wID0gY3JvcF9oIC8gMjsKKyAgaWYgKHZpZGVvX2JveC0+Ym94X3RvcCA8IDApIHsKKyAgICB2aWRlb19ib3gtPmJvcmRlcl90b3AgPSAtdmlkZW9fYm94LT5ib3hfdG9wOworICAgIHZpZGVvX2JveC0+Y3JvcF90b3AgPSAwOworICB9IGVsc2UgeworICAgIHZpZGVvX2JveC0+Ym9yZGVyX3RvcCA9IDA7CisgICAgdmlkZW9fYm94LT5jcm9wX3RvcCA9IHZpZGVvX2JveC0+Ym94X3RvcDsKKyAgfQorCisgIC8qIFJvdW5kIGRvd24vdXAgZm9yIG9kZCBoZWlnaHQgZGlmZmVyZW5jZXMgKi8KKyAgaWYgKGNyb3BfaCA8IDApCisgICAgY3JvcF9oIC09IDE7CisgIGVsc2UKKyAgICBjcm9wX2ggKz0gMTsKKyAgdmlkZW9fYm94LT5ib3hfYm90dG9tID0gY3JvcF9oIC8gMjsKKworICBpZiAodmlkZW9fYm94LT5ib3hfYm90dG9tIDwgMCkgeworICAgIHZpZGVvX2JveC0+Ym9yZGVyX2JvdHRvbSA9IC12aWRlb19ib3gtPmJveF9ib3R0b207CisgICAgdmlkZW9fYm94LT5jcm9wX2JvdHRvbSA9IDA7CisgIH0gZWxzZSB7CisgICAgdmlkZW9fYm94LT5ib3JkZXJfYm90dG9tID0gMDsKKyAgICB2aWRlb19ib3gtPmNyb3BfYm90dG9tID0gdmlkZW9fYm94LT5ib3hfYm90dG9tOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fYm94X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWaWRlb0JveCAqdmlkZW9fYm94ID0gR1NUX1ZJREVPX0JPWCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTEVGVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHZpZGVvX2JveC0+Ym94X2xlZnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JJR0hUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdmlkZW9fYm94LT5ib3hfcmlnaHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RPUDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHZpZGVvX2JveC0+Ym94X3RvcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQk9UVE9NOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdmlkZW9fYm94LT5ib3hfYm90dG9tKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GSUxMX1RZUEU6CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgdmlkZW9fYm94LT5maWxsX3R5cGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FMUEhBOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgdmlkZW9fYm94LT5hbHBoYSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQk9SREVSX0FMUEhBOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgdmlkZW9fYm94LT5ib3JkZXJfYWxwaGEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0FVVE9DUk9QOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHZpZGVvX2JveC0+YXV0b2Nyb3ApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgaW5saW5lIGdpbnQKK2dzdF92aWRlb19ib3hfdHJhbnNmb3JtX2RpbWVuc2lvbiAoZ2ludCB2YWwsIGdpbnQgZGVsdGEpCit7CisgIGdpbnQ2NCBuZXdfdmFsID0gKGdpbnQ2NCkgdmFsICsgKGdpbnQ2NCkgZGVsdGE7CisKKyAgbmV3X3ZhbCA9IENMQU1QIChuZXdfdmFsLCAxLCBHX01BWElOVCk7CisKKyAgcmV0dXJuIChnaW50KSBuZXdfdmFsOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92aWRlb19ib3hfdHJhbnNmb3JtX2RpbWVuc2lvbl92YWx1ZSAoY29uc3QgR1ZhbHVlICogc3JjX3ZhbCwKKyAgICBnaW50IGRlbHRhLCBHVmFsdWUgKiBkZXN0X3ZhbCkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICBnX3ZhbHVlX2luaXQgKGRlc3RfdmFsLCBHX1ZBTFVFX1RZUEUgKHNyY192YWwpKTsKKworICBpZiAoR19WQUxVRV9IT0xEU19JTlQgKHNyY192YWwpKSB7CisgICAgZ2ludCBpdmFsID0gZ192YWx1ZV9nZXRfaW50IChzcmNfdmFsKTsKKworICAgIGl2YWwgPSBnc3RfdmlkZW9fYm94X3RyYW5zZm9ybV9kaW1lbnNpb24gKGl2YWwsIGRlbHRhKTsKKyAgICBnX3ZhbHVlX3NldF9pbnQgKGRlc3RfdmFsLCBpdmFsKTsKKyAgfSBlbHNlIGlmIChHU1RfVkFMVUVfSE9MRFNfSU5UX1JBTkdFIChzcmNfdmFsKSkgeworICAgIGdpbnQgbWluID0gZ3N0X3ZhbHVlX2dldF9pbnRfcmFuZ2VfbWluIChzcmNfdmFsKTsKKyAgICBnaW50IG1heCA9IGdzdF92YWx1ZV9nZXRfaW50X3JhbmdlX21heCAoc3JjX3ZhbCk7CisKKyAgICBtaW4gPSBnc3RfdmlkZW9fYm94X3RyYW5zZm9ybV9kaW1lbnNpb24gKG1pbiwgZGVsdGEpOworICAgIG1heCA9IGdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2RpbWVuc2lvbiAobWF4LCBkZWx0YSk7CisgICAgaWYgKG1pbiA+PSBtYXgpIHsKKyAgICAgIHJldCA9IEZBTFNFOworICAgICAgZ192YWx1ZV91bnNldCAoZGVzdF92YWwpOworICAgIH0gZWxzZSB7CisgICAgICBnc3RfdmFsdWVfc2V0X2ludF9yYW5nZSAoZGVzdF92YWwsIG1pbiwgbWF4KTsKKyAgICB9CisgIH0gZWxzZSBpZiAoR1NUX1ZBTFVFX0hPTERTX0xJU1QgKHNyY192YWwpKSB7CisgICAgZ2ludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGdzdF92YWx1ZV9saXN0X2dldF9zaXplIChzcmNfdmFsKTsgKytpKSB7CisgICAgICBjb25zdCBHVmFsdWUgKmxpc3RfdmFsOworICAgICAgR1ZhbHVlIG5ld3ZhbCA9IHsgMCwgfTsKKworICAgICAgbGlzdF92YWwgPSBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKHNyY192YWwsIGkpOworICAgICAgaWYgKGdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2RpbWVuc2lvbl92YWx1ZSAobGlzdF92YWwsIGRlbHRhLCAmbmV3dmFsKSkKKyAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlIChkZXN0X3ZhbCwgJm5ld3ZhbCk7CisgICAgICBnX3ZhbHVlX3Vuc2V0ICgmbmV3dmFsKTsKKyAgICB9CisKKyAgICBpZiAoZ3N0X3ZhbHVlX2xpc3RfZ2V0X3NpemUgKGRlc3RfdmFsKSA9PSAwKSB7CisgICAgICBnX3ZhbHVlX3Vuc2V0IChkZXN0X3ZhbCk7CisgICAgICByZXQgPSBGQUxTRTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ192YWx1ZV91bnNldCAoZGVzdF92YWwpOworICAgIHJldCA9IEZBTFNFOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3ZpZGVvX2JveF90cmFuc2Zvcm1fY2FwcyAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENhcHMgKiBmcm9tLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RWaWRlb0JveCAqdmlkZW9fYm94ID0gR1NUX1ZJREVPX0JPWCAodHJhbnMpOworICBHc3RDYXBzICp0bywgKnJldDsKKyAgR3N0Q2FwcyAqdGVtcGw7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBHc3RQYWQgKm90aGVyOworICBnaW50IGksIGo7CisKKyAgdG8gPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAoZnJvbSk7IGkrKykgeworICAgIGNvbnN0IEdWYWx1ZSAqZnZhbCwgKmx2YWw7CisgICAgR1ZhbHVlIGxpc3QgPSB7IDAsIH07CisgICAgR1ZhbHVlIHZhbCA9IHsgMCwgfTsKKyAgICBnYm9vbGVhbiBzZWVuX3l1diA9IEZBTFNFLCBzZWVuX3JnYiA9IEZBTFNFOworICAgIGNvbnN0IGdjaGFyICpzdHI7CisKKyAgICBzdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGZyb20sIGkpKTsKKworICAgIC8qIFRyYW5zZm9ybSB3aWR0aC9oZWlnaHQgKi8KKyAgICBpZiAodmlkZW9fYm94LT5hdXRvY3JvcCkgeworICAgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHN0cnVjdHVyZSwgIndpZHRoIik7CisgICAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAoc3RydWN0dXJlLCAiaGVpZ2h0Iik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdpbnQgZHcgPSAwLCBkaCA9IDA7CisgICAgICBjb25zdCBHVmFsdWUgKnY7CisgICAgICBHVmFsdWUgd192YWwgPSB7IDAsIH07CisgICAgICBHVmFsdWUgaF92YWwgPSB7IDAsIH07CisKKyAgICAgIC8qIGNhbGN1bGF0ZSB3aWR0aCBhbmQgaGVpZ2h0ICovCisgICAgICBpZiAoZGlyZWN0aW9uID09IEdTVF9QQURfU0lOSykgeworICAgICAgICBkdyAtPSB2aWRlb19ib3gtPmJveF9sZWZ0OworICAgICAgICBkdyAtPSB2aWRlb19ib3gtPmJveF9yaWdodDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGR3ICs9IHZpZGVvX2JveC0+Ym94X2xlZnQ7CisgICAgICAgIGR3ICs9IHZpZGVvX2JveC0+Ym94X3JpZ2h0OworICAgICAgfQorCisgICAgICBpZiAoZGlyZWN0aW9uID09IEdTVF9QQURfU0lOSykgeworICAgICAgICBkaCAtPSB2aWRlb19ib3gtPmJveF90b3A7CisgICAgICAgIGRoIC09IHZpZGVvX2JveC0+Ym94X2JvdHRvbTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRoICs9IHZpZGVvX2JveC0+Ym94X3RvcDsKKyAgICAgICAgZGggKz0gdmlkZW9fYm94LT5ib3hfYm90dG9tOworICAgICAgfQorCisgICAgICB2ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgIndpZHRoIik7CisgICAgICBpZiAoIWdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2RpbWVuc2lvbl92YWx1ZSAodiwgZHcsICZ3X3ZhbCkpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2aWRlb19ib3gsCisgICAgICAgICAgICAiY291bGQgbm90IHRyYW5mb3JtIHdpZHRoIHZhbHVlIHdpdGggZHc9JWQiICIsIGNhcHMgc3RydWN0dXJlPSUiCisgICAgICAgICAgICBHU1RfUFRSX0ZPUk1BVCwgZHcsIHN0cnVjdHVyZSk7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJ3aWR0aCIsICZ3X3ZhbCk7CisKKyAgICAgIHYgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAiaGVpZ2h0Iik7CisgICAgICBpZiAoIWdzdF92aWRlb19ib3hfdHJhbnNmb3JtX2RpbWVuc2lvbl92YWx1ZSAodiwgZGgsICZoX3ZhbCkpIHsKKyAgICAgICAgZ192YWx1ZV91bnNldCAoJndfdmFsKTsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2aWRlb19ib3gsCisgICAgICAgICAgICAiY291bGQgbm90IHRyYW5mb3JtIGhlaWdodCB2YWx1ZSB3aXRoIGRoPSVkIiAiLCBjYXBzIHN0cnVjdHVyZT0lIgorICAgICAgICAgICAgR1NUX1BUUl9GT1JNQVQsIGRoLCBzdHJ1Y3R1cmUpOworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAoc3RydWN0dXJlLCAiaGVpZ2h0IiwgJmhfdmFsKTsKKyAgICAgIGdfdmFsdWVfdW5zZXQgKCZ3X3ZhbCk7CisgICAgICBnX3ZhbHVlX3Vuc2V0ICgmaF92YWwpOworICAgIH0KKworICAgIC8qIFN1cHBvcnRlZCBjb252ZXJzaW9uczoKKyAgICAgKiBJNDIwLT5BWVVWCisgICAgICogSTQyMC0+WVYxMgorICAgICAqIFlWMTItPkFZVVYKKyAgICAgKiBZVjEyLT5JNDIwCisgICAgICogQVlVVi0+STQyMAorICAgICAqIEFZVVYtPllWMTIKKyAgICAgKiBBWVVWLT54UkdCICgyNGJwcCwgMzJicHAsIGluY2wuIGFscGhhKQorICAgICAqIHhSR0ItPnhSR0IgKDI0YnBwLCAzMmJwcCwgZnJvbS90byBhbGwgdmFyaWFudHMsIGluY2wuIGFscGhhKQorICAgICAqIHhSR0ItPkFZVVYgKDI0YnBwLCAzMmJwcCwgaW5jbC4gYWxwaGEpCisgICAgICoKKyAgICAgKiBQYXNzdGhyb3VnaCBvbmx5IGZvciBldmVyeXRoaW5nIGVsc2UuCisgICAgICovCisgICAgZnZhbCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJmb3JtYXQiKTsKKyAgICBpZiAoZnZhbCAmJiBHU1RfVkFMVUVfSE9MRFNfTElTVCAoZnZhbCkpIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBnc3RfdmFsdWVfbGlzdF9nZXRfc2l6ZSAoZnZhbCk7IGorKykgeworICAgICAgICBsdmFsID0gZ3N0X3ZhbHVlX2xpc3RfZ2V0X3ZhbHVlIChmdmFsLCBqKTsKKyAgICAgICAgaWYgKChzdHIgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKGx2YWwpKSkgeworICAgICAgICAgIGlmIChzdHJjbXAgKHN0ciwgIkFZVVYiKSA9PSAwKSB7CisgICAgICAgICAgICBzZWVuX3l1diA9IFRSVUU7CisgICAgICAgICAgICBzZWVuX3JnYiA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGVsc2UgaWYgKHN0cnN0ciAoc3RyLCAiUkdCIikgfHwgc3Ryc3RyIChzdHIsICJCR1IiKSkgeworICAgICAgICAgICAgc2Vlbl9yZ2IgPSBUUlVFOworICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wIChzdHIsICJJNDIwIikgPT0gMCB8fCBzdHJjbXAgKHN0ciwgIllWMTIiKSA9PSAwKSB7CisgICAgICAgICAgICBzZWVuX3l1diA9IFRSVUU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChmdmFsICYmIEdfVkFMVUVfSE9MRFNfU1RSSU5HIChmdmFsKSkgeworICAgICAgaWYgKChzdHIgPSBnX3ZhbHVlX2dldF9zdHJpbmcgKGZ2YWwpKSkgeworICAgICAgICBpZiAoc3RyY21wIChzdHIsICJBWVVWIikgPT0gMCkgeworICAgICAgICAgIHNlZW5feXV2ID0gVFJVRTsKKyAgICAgICAgICBzZWVuX3JnYiA9IFRSVUU7CisgICAgICAgIH0gZWxzZSBpZiAoc3Ryc3RyIChzdHIsICJSR0IiKSB8fCBzdHJzdHIgKHN0ciwgIkJHUiIpKSB7CisgICAgICAgICAgc2Vlbl9yZ2IgPSBUUlVFOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCAoc3RyLCAiSTQyMCIpID09IDAgfHwgc3RyY21wIChzdHIsICJZVjEyIikgPT0gMCkgeworICAgICAgICAgIHNlZW5feXV2ID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChzZWVuX3l1diB8fCBzZWVuX3JnYikgeworICAgICAgZ192YWx1ZV9pbml0ICgmbGlzdCwgR1NUX1RZUEVfTElTVCk7CisKKyAgICAgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR19UWVBFX1NUUklORyk7CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKCZ2YWwsICJBWVVWIik7CisgICAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZsaXN0LCAmdmFsKTsKKyAgICAgIGdfdmFsdWVfdW5zZXQgKCZ2YWwpOworCisgICAgICBpZiAoc2Vlbl95dXYpIHsKKyAgICAgICAgZ192YWx1ZV9pbml0ICgmdmFsLCBHX1RZUEVfU1RSSU5HKTsKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmdmFsLCAiSTQyMCIpOworICAgICAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZsaXN0LCAmdmFsKTsKKyAgICAgICAgZ192YWx1ZV9yZXNldCAoJnZhbCk7CisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJnZhbCwgIllWMTIiKTsKKyAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJnZhbCk7CisgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZ2YWwpOworICAgICAgfQorICAgICAgaWYgKHNlZW5fcmdiKSB7CisgICAgICAgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR19UWVBFX1NUUklORyk7CisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJnZhbCwgIlJHQngiKTsKKyAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJnZhbCk7CisgICAgICAgIGdfdmFsdWVfcmVzZXQgKCZ2YWwpOworICAgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKCZ2YWwsICJCR1J4Iik7CisgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJmxpc3QsICZ2YWwpOworICAgICAgICBnX3ZhbHVlX3Jlc2V0ICgmdmFsKTsKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmdmFsLCAieFJHQiIpOworICAgICAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZsaXN0LCAmdmFsKTsKKyAgICAgICAgZ192YWx1ZV9yZXNldCAoJnZhbCk7CisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJnZhbCwgInhCR1IiKTsKKyAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJnZhbCk7CisgICAgICAgIGdfdmFsdWVfcmVzZXQgKCZ2YWwpOworICAgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKCZ2YWwsICJSR0JBIik7CisgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJmxpc3QsICZ2YWwpOworICAgICAgICBnX3ZhbHVlX3Jlc2V0ICgmdmFsKTsKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmdmFsLCAiQkdSQSIpOworICAgICAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZsaXN0LCAmdmFsKTsKKyAgICAgICAgZ192YWx1ZV9yZXNldCAoJnZhbCk7CisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJnZhbCwgIkFSR0IiKTsKKyAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJnZhbCk7CisgICAgICAgIGdfdmFsdWVfcmVzZXQgKCZ2YWwpOworICAgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKCZ2YWwsICJBQkdSIik7CisgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJmxpc3QsICZ2YWwpOworICAgICAgICBnX3ZhbHVlX3Jlc2V0ICgmdmFsKTsKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmdmFsLCAiUkdCIik7CisgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJmxpc3QsICZ2YWwpOworICAgICAgICBnX3ZhbHVlX3Jlc2V0ICgmdmFsKTsKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICgmdmFsLCAiQkdSIik7CisgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJmxpc3QsICZ2YWwpOworICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdmFsKTsKKyAgICAgIH0KKyAgICAgIGdzdF92YWx1ZV9saXN0X21lcmdlICgmdmFsLCBmdmFsLCAmbGlzdCk7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAoc3RydWN0dXJlLCAiZm9ybWF0IiwgJnZhbCk7CisgICAgICBnX3ZhbHVlX3Vuc2V0ICgmdmFsKTsKKyAgICAgIGdfdmFsdWVfdW5zZXQgKCZsaXN0KTsKKyAgICB9CisKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAoc3RydWN0dXJlLCAiY29sb3JpbWV0cnkiKTsKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAoc3RydWN0dXJlLCAiY2hyb21hLXNpdGUiKTsKKworICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKHRvLCBzdHJ1Y3R1cmUpOworICB9CisKKyAgLyogZmlsdGVyIGFnYWluc3Qgc2V0IGFsbG93ZWQgY2FwcyBvbiB0aGUgcGFkICovCisgIG90aGVyID0gKGRpcmVjdGlvbiA9PSBHU1RfUEFEX1NJTkspID8gdHJhbnMtPnNyY3BhZCA6IHRyYW5zLT5zaW5rcGFkOworICB0ZW1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChvdGhlcik7CisgIHJldCA9IGdzdF9jYXBzX2ludGVyc2VjdCAodG8sIHRlbXBsKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHRvKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHRlbXBsKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb19ib3gsICJkaXJlY3Rpb24gJWQsIHRyYW5zZm9ybWVkICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAiIHRvICUiIEdTVF9QVFJfRk9STUFULCBkaXJlY3Rpb24sIGZyb20sIHJldCk7CisKKyAgaWYgKHJldCAmJiBmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICppbnRlcnNlY3Rpb247CisKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb19ib3gsICJVc2luZyBmaWx0ZXIgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgZmlsdGVyKTsKKyAgICBpbnRlcnNlY3Rpb24gPQorICAgICAgICBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCByZXQsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHJldCk7CisgICAgcmV0ID0gaW50ZXJzZWN0aW9uOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHZpZGVvX2JveCwgIkludGVyc2VjdGlvbiAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKyAgfQorCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCitiYWlsOgorICB7CisgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChzdHJ1Y3R1cmUpOworICAgIGdzdF9jYXBzX3VucmVmICh0byk7CisgICAgdG8gPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisgICAgcmV0dXJuIHRvOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZpZGVvX2JveF9yZWNhbGNfdHJhbnNmb3JtIChHc3RWaWRlb0JveCAqIHZpZGVvX2JveCkKK3sKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKworICAvKiBpZiB3ZSBoYXZlIHRoZSBzYW1lIGZvcm1hdCBpbiBhbmQgb3V0IGFuZCB3ZSBkb24ndCBuZWVkIHRvIHBlcmZvcm0gYW55CisgICAqIGNyb3BwaW5nIGF0IGFsbCwgd2UgY2FuIGp1c3Qgb3BlcmF0ZSBpbiBwYXNzdGhyb3VnaCBtb2RlICovCisgIGlmICh2aWRlb19ib3gtPmluX2Zvcm1hdCA9PSB2aWRlb19ib3gtPm91dF9mb3JtYXQgJiYKKyAgICAgIHZpZGVvX2JveC0+Ym94X2xlZnQgPT0gMCAmJiB2aWRlb19ib3gtPmJveF9yaWdodCA9PSAwICYmCisgICAgICB2aWRlb19ib3gtPmJveF90b3AgPT0gMCAmJiB2aWRlb19ib3gtPmJveF9ib3R0b20gPT0gMCAmJgorICAgICAgdmlkZW9fYm94LT5pbl9zZHR2ID09IHZpZGVvX2JveC0+b3V0X3NkdHYpIHsKKworICAgIEdTVF9MT0dfT0JKRUNUICh2aWRlb19ib3gsICJ3ZSBhcmUgdXNpbmcgcGFzc3Rocm91Z2giKTsKKyAgICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X3Bhc3N0aHJvdWdoIChHU1RfQkFTRV9UUkFOU0ZPUk1fQ0FTVCAodmlkZW9fYm94KSwKKyAgICAgICAgVFJVRSk7CisgIH0gZWxzZSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHZpZGVvX2JveCwgIndlIGFyZSBub3QgdXNpbmcgcGFzc3Rocm91Z2giKTsKKyAgICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X3Bhc3N0aHJvdWdoIChHU1RfQkFTRV9UUkFOU0ZPUk1fQ0FTVCAodmlkZW9fYm94KSwKKyAgICAgICAgRkFMU0UpOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZpZGVvX2JveF9zZWxlY3RfcHJvY2Vzc2luZ19mdW5jdGlvbnMgKEdzdFZpZGVvQm94ICogdmlkZW9fYm94KQoreworICBzd2l0Y2ggKHZpZGVvX2JveC0+b3V0X2Zvcm1hdCkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgdmlkZW9fYm94LT5maWxsID0gZmlsbF9heXV2OworICAgICAgc3dpdGNoICh2aWRlb19ib3gtPmluX2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICAgICAgICB2aWRlb19ib3gtPmNvcHkgPSBjb3B5X2F5dXZfYXl1djsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVjEyOgorICAgICAgICAgIHZpZGVvX2JveC0+Y29weSA9IGNvcHlfaTQyMF9heXV2OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hSR0I6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94QkdSOgorICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCeDoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUng6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1I6CisgICAgICAgICAgdmlkZW9fYm94LT5jb3B5ID0gY29weV9yZ2IzMl9heXV2OworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgICB2aWRlb19ib3gtPmZpbGwgPSBmaWxsX3BsYW5hcl95dXY7CisgICAgICBzd2l0Y2ggKHZpZGVvX2JveC0+aW5fZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgICAgIHZpZGVvX2JveC0+Y29weSA9IGNvcHlfYXl1dl9pNDIwOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfSTQyMDoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgICAgICAgdmlkZW9fYm94LT5jb3B5ID0gY29weV9pNDIwX2k0MjA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQUJHUjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSQToKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeFJHQjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeEJHUjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCeDoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSeDoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1I6CisgICAgICB2aWRlb19ib3gtPmZpbGwgPSAodmlkZW9fYm94LT5vdXRfZm9ybWF0ID09IEdTVF9WSURFT19GT1JNQVRfQkdSCisgICAgICAgICAgfHwgdmlkZW9fYm94LT5vdXRfZm9ybWF0ID09CisgICAgICAgICAgR1NUX1ZJREVPX0ZPUk1BVF9SR0IpID8gZmlsbF9yZ2IyNCA6IGZpbGxfcmdiMzI7CisgICAgICBzd2l0Y2ggKHZpZGVvX2JveC0+aW5fZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BUkdCOgorICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQUJHUjoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQkE6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1JBOgorICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeFJHQjoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hCR1I6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0J4OgorICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSeDoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQjoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUjoKKyAgICAgICAgICB2aWRlb19ib3gtPmNvcHkgPSBjb3B5X3JnYjMyOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVlVVjoKKyAgICAgICAgICB2aWRlb19ib3gtPmNvcHkgPSBjb3B5X2F5dXZfcmdiMzI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfR1JBWTg6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0dSQVkxNl9CRToKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfR1JBWTE2X0xFOgorICAgICAgdmlkZW9fYm94LT5maWxsID0gZmlsbF9ncmF5OworICAgICAgc3dpdGNoICh2aWRlb19ib3gtPmluX2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfR1JBWTg6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9HUkFZMTZfQkU6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9HUkFZMTZfTEU6CisgICAgICAgICAgdmlkZW9fYm94LT5jb3B5ID0gY29weV9wYWNrZWRfc2ltcGxlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lVWTI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWWVU6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICB2aWRlb19ib3gtPmZpbGwgPSBmaWxsX3l1eTI7CisgICAgICBzd2l0Y2ggKHZpZGVvX2JveC0+aW5fZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOgorICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVZZVToKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICAgICAgdmlkZW9fYm94LT5jb3B5ID0gY29weV95dXkyX3l1eTI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQ0NDoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQyQjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQxQjoKKyAgICAgIHZpZGVvX2JveC0+ZmlsbCA9IGZpbGxfcGxhbmFyX3l1djsKKyAgICAgIHN3aXRjaCAodmlkZW9fYm94LT5pbl9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0NDQ6CisgICAgICAgICAgdmlkZW9fYm94LT5jb3B5ID0gY29weV95NDQ0X3k0NDQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgICAgICAgIHZpZGVvX2JveC0+Y29weSA9IGNvcHlfeTQyYl95NDJiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQxQjoKKyAgICAgICAgICB2aWRlb19ib3gtPmNvcHkgPSBjb3B5X3k0MWJfeTQxYjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiB2aWRlb19ib3gtPmZpbGwgIT0gTlVMTCAmJiB2aWRlb19ib3gtPmNvcHkgIT0gTlVMTDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9fYm94X3NldF9pbmZvIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsIEdzdENhcHMgKiBpbiwKKyAgICBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLCBHc3RDYXBzICogb3V0LCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0VmlkZW9Cb3ggKnZpZGVvX2JveCA9IEdTVF9WSURFT19CT1ggKHZmaWx0ZXIpOworICBnYm9vbGVhbiByZXQ7CisKKyAgZ19tdXRleF9sb2NrICgmdmlkZW9fYm94LT5tdXRleCk7CisKKyAgdmlkZW9fYm94LT5pbl9mb3JtYXQgPSBHU1RfVklERU9fSU5GT19GT1JNQVQgKGluX2luZm8pOworICB2aWRlb19ib3gtPmluX3dpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKGluX2luZm8pOworICB2aWRlb19ib3gtPmluX2hlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoaW5faW5mbyk7CisKKyAgdmlkZW9fYm94LT5vdXRfZm9ybWF0ID0gR1NUX1ZJREVPX0lORk9fRk9STUFUIChvdXRfaW5mbyk7CisgIHZpZGVvX2JveC0+b3V0X3dpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKG91dF9pbmZvKTsKKyAgdmlkZW9fYm94LT5vdXRfaGVpZ2h0ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChvdXRfaW5mbyk7CisKKyAgdmlkZW9fYm94LT5pbl9zZHR2ID0KKyAgICAgIGluX2luZm8tPmNvbG9yaW1ldHJ5Lm1hdHJpeCA9PSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUNjAxOworICB2aWRlb19ib3gtPm91dF9zZHR2ID0KKyAgICAgIG91dF9pbmZvLT5jb2xvcmltZXRyeS5tYXRyaXggPT0gR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9CVDYwMTsKKworICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb19ib3gsICJJbnB1dCB3OiAlZCBoOiAlZCIsIHZpZGVvX2JveC0+aW5fd2lkdGgsCisgICAgICB2aWRlb19ib3gtPmluX2hlaWdodCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHZpZGVvX2JveCwgIk91dHB1dCB3OiAlZCBoOiAlZCIsIHZpZGVvX2JveC0+b3V0X3dpZHRoLAorICAgICAgdmlkZW9fYm94LT5vdXRfaGVpZ2h0KTsKKworICBpZiAodmlkZW9fYm94LT5hdXRvY3JvcCkKKyAgICBnc3RfdmlkZW9fYm94X2F1dG9jcm9wICh2aWRlb19ib3gpOworCisgIC8qIHJlY2FsYyB0aGUgdHJhbnNmb3JtYXRpb24gc3RyYXRlZ3kgKi8KKyAgcmV0ID0gZ3N0X3ZpZGVvX2JveF9yZWNhbGNfdHJhbnNmb3JtICh2aWRlb19ib3gpOworCisgIGlmIChyZXQpCisgICAgcmV0ID0gZ3N0X3ZpZGVvX2JveF9zZWxlY3RfcHJvY2Vzc2luZ19mdW5jdGlvbnMgKHZpZGVvX2JveCk7CisgIGdfbXV0ZXhfdW5sb2NrICgmdmlkZW9fYm94LT5tdXRleCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9fYm94X3NyY19ldmVudCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RWaWRlb0JveCAqdmlkZW9fYm94ID0gR1NUX1ZJREVPX0JPWCAodHJhbnMpOworICBHc3RTdHJ1Y3R1cmUgKm5ld19zdHJ1Y3R1cmU7CisgIGNvbnN0IEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBjb25zdCBnY2hhciAqZXZlbnRfbmFtZTsKKyAgZ2RvdWJsZSBwb2ludGVyX3g7CisgIGdkb3VibGUgcG9pbnRlcl95OworCisgIEdTVF9PQkpFQ1RfTE9DSyAodmlkZW9fYm94KTsKKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX05BVklHQVRJT04gJiYKKyAgICAgICh2aWRlb19ib3gtPmJveF9sZWZ0ICE9IDAgfHwgdmlkZW9fYm94LT5ib3hfdG9wICE9IDApKSB7CisgICAgc3RydWN0dXJlID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKyAgICBldmVudF9uYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJldmVudCIpOworCisgICAgaWYgKGV2ZW50X25hbWUgJiYKKyAgICAgICAgKHN0cmNtcCAoZXZlbnRfbmFtZSwgIm1vdXNlLW1vdmUiKSA9PSAwIHx8CisgICAgICAgICAgICBzdHJjbXAgKGV2ZW50X25hbWUsICJtb3VzZS1idXR0b24tcHJlc3MiKSA9PSAwIHx8CisgICAgICAgICAgICBzdHJjbXAgKGV2ZW50X25hbWUsICJtb3VzZS1idXR0b24tcmVsZWFzZSIpID09IDApKSB7CisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfZG91YmxlIChzdHJ1Y3R1cmUsICJwb2ludGVyX3giLCAmcG9pbnRlcl94KSAmJgorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2RvdWJsZSAoc3RydWN0dXJlLCAicG9pbnRlcl95IiwgJnBvaW50ZXJfeSkpIHsKKyAgICAgICAgZ2RvdWJsZSBuZXdfcG9pbnRlcl94LCBuZXdfcG9pbnRlcl95OworICAgICAgICBHc3RFdmVudCAqbmV3X2V2ZW50OworCisgICAgICAgIG5ld19wb2ludGVyX3ggPSBwb2ludGVyX3ggKyB2aWRlb19ib3gtPmJveF9sZWZ0OworICAgICAgICBuZXdfcG9pbnRlcl95ID0gcG9pbnRlcl95ICsgdmlkZW9fYm94LT5ib3hfdG9wOworCisgICAgICAgIG5ld19zdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHN0cnVjdHVyZSk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfc3RydWN0dXJlLAorICAgICAgICAgICAgInBvaW50ZXJfeCIsIEdfVFlQRV9ET1VCTEUsIChnZG91YmxlKSAobmV3X3BvaW50ZXJfeCksCisgICAgICAgICAgICAicG9pbnRlcl95IiwgR19UWVBFX0RPVUJMRSwgKGdkb3VibGUpIChuZXdfcG9pbnRlcl95KSwgTlVMTCk7CisKKyAgICAgICAgbmV3X2V2ZW50ID0gZ3N0X2V2ZW50X25ld19uYXZpZ2F0aW9uIChuZXdfc3RydWN0dXJlKTsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICAgIGV2ZW50ID0gbmV3X2V2ZW50OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2aWRlb19ib3gsICJGYWlsZWQgdG8gcmVhZCBuYXZpZ2F0aW9uIGV2ZW50Iik7CisgICAgICB9CisgICAgfQorICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLICh2aWRlb19ib3gpOworCisgIHJldHVybiBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNyY19ldmVudCAodHJhbnMsIGV2ZW50KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19ib3hfcHJvY2VzcyAoR3N0VmlkZW9Cb3ggKiB2aWRlb19ib3gsIEdzdFZpZGVvRnJhbWUgKiBpbiwKKyAgICBHc3RWaWRlb0ZyYW1lICogb3V0KQoreworICBndWludCBiX2FscGhhID0gQ0xBTVAgKHZpZGVvX2JveC0+Ym9yZGVyX2FscGhhICogMjU2LCAwLCAyNTUpOworICBndWludCBpX2FscGhhID0gQ0xBTVAgKHZpZGVvX2JveC0+YWxwaGEgKiAyNTYsIDAsIDI1NSk7CisgIEdzdFZpZGVvQm94RmlsbCBmaWxsX3R5cGUgPSB2aWRlb19ib3gtPmZpbGxfdHlwZTsKKyAgZ2ludCBiciwgYmwsIGJ0LCBiYiwgY3JvcF93LCBjcm9wX2g7CisKKyAgY3JvcF9oID0gMDsKKyAgY3JvcF93ID0gMDsKKworICBiciA9IHZpZGVvX2JveC0+Ym94X3JpZ2h0OworICBibCA9IHZpZGVvX2JveC0+Ym94X2xlZnQ7CisgIGJ0ID0gdmlkZW9fYm94LT5ib3hfdG9wOworICBiYiA9IHZpZGVvX2JveC0+Ym94X2JvdHRvbTsKKworICBpZiAoYnIgPj0gMCAmJiBibCA+PSAwKSB7CisgICAgY3JvcF93ID0gdmlkZW9fYm94LT5pbl93aWR0aCAtIChiciArIGJsKTsKKyAgfSBlbHNlIGlmIChiciA+PSAwICYmIGJsIDwgMCkgeworICAgIGNyb3BfdyA9IHZpZGVvX2JveC0+aW5fd2lkdGggLSAoYnIpOworICB9IGVsc2UgaWYgKGJyIDwgMCAmJiBibCA+PSAwKSB7CisgICAgY3JvcF93ID0gdmlkZW9fYm94LT5pbl93aWR0aCAtIChibCk7CisgIH0gZWxzZSBpZiAoYnIgPCAwICYmIGJsIDwgMCkgeworICAgIGNyb3BfdyA9IHZpZGVvX2JveC0+aW5fd2lkdGg7CisgIH0KKworICBpZiAoYmIgPj0gMCAmJiBidCA+PSAwKSB7CisgICAgY3JvcF9oID0gdmlkZW9fYm94LT5pbl9oZWlnaHQgLSAoYmIgKyBidCk7CisgIH0gZWxzZSBpZiAoYmIgPj0gMCAmJiBidCA8IDApIHsKKyAgICBjcm9wX2ggPSB2aWRlb19ib3gtPmluX2hlaWdodCAtIChiYik7CisgIH0gZWxzZSBpZiAoYmIgPCAwICYmIGJ0ID49IDApIHsKKyAgICBjcm9wX2ggPSB2aWRlb19ib3gtPmluX2hlaWdodCAtIChidCk7CisgIH0gZWxzZSBpZiAoYmIgPCAwICYmIGJ0IDwgMCkgeworICAgIGNyb3BfaCA9IHZpZGVvX2JveC0+aW5faGVpZ2h0OworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodmlkZW9fYm94LCAiQm9yZGVycyBhcmU6IEw6JWQsIFI6JWQsIFQ6JWQsIEI6JWQiLCBibCwgYnIsCisgICAgICBidCwgYmIpOworICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb19ib3gsICJBbHBoYSB2YWx1ZSBpczogJXUgKGZyYW1lKSAldSAoYm9yZGVyKSIsCisgICAgICBpX2FscGhhLCBiX2FscGhhKTsKKworICBpZiAoY3JvcF9oIDwgMCB8fCBjcm9wX3cgPCAwKSB7CisgICAgdmlkZW9fYm94LT5maWxsIChmaWxsX3R5cGUsIGJfYWxwaGEsIG91dCwgdmlkZW9fYm94LT5vdXRfc2R0dik7CisgIH0gZWxzZSBpZiAoYmIgPT0gMCAmJiBidCA9PSAwICYmIGJyID09IDAgJiYgYmwgPT0gMCkgeworICAgIHZpZGVvX2JveC0+Y29weSAoaV9hbHBoYSwgb3V0LCB2aWRlb19ib3gtPm91dF9zZHR2LCAwLCAwLCBpbiwKKyAgICAgICAgdmlkZW9fYm94LT5pbl9zZHR2LCAwLCAwLCBjcm9wX3csIGNyb3BfaCk7CisgIH0gZWxzZSB7CisgICAgZ2ludCBzcmNfeCA9IDAsIHNyY195ID0gMDsKKyAgICBnaW50IGRlc3RfeCA9IDAsIGRlc3RfeSA9IDA7CisKKyAgICAvKiBGaWxsIGV2ZXJ5dGhpbmcgaWYgYSBib3JkZXIgc2hvdWxkIGJlIGFkZGVkIHNvbWV3aGVyZSAqLworICAgIGlmIChidCA8IDAgfHwgYmIgPCAwIHx8IGJyIDwgMCB8fCBibCA8IDApCisgICAgICB2aWRlb19ib3gtPmZpbGwgKGZpbGxfdHlwZSwgYl9hbHBoYSwgb3V0LCB2aWRlb19ib3gtPm91dF9zZHR2KTsKKworICAgIC8qIFRvcCBib3JkZXIgKi8KKyAgICBpZiAoYnQgPCAwKSB7CisgICAgICBkZXN0X3kgKz0gLWJ0OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfeSArPSBidDsKKyAgICB9CisKKyAgICAvKiBMZWZ0IGJvcmRlciAqLworICAgIGlmIChibCA8IDApIHsKKyAgICAgIGRlc3RfeCArPSAtYmw7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY194ICs9IGJsOworICAgIH0KKworICAgIC8qIEZyYW1lICovCisgICAgdmlkZW9fYm94LT5jb3B5IChpX2FscGhhLCBvdXQsIHZpZGVvX2JveC0+b3V0X3NkdHYsIGRlc3RfeCwgZGVzdF95LAorICAgICAgICBpbiwgdmlkZW9fYm94LT5pbl9zZHR2LCBzcmNfeCwgc3JjX3ksIGNyb3BfdywgY3JvcF9oKTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUICh2aWRlb19ib3gsICJpbWFnZSBjcmVhdGVkIik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fYm94X2JlZm9yZV90cmFuc2Zvcm0gKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0QnVmZmVyICogaW4pCit7CisgIEdzdFZpZGVvQm94ICp2aWRlb19ib3ggPSBHU1RfVklERU9fQk9YICh0cmFucyk7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIHN0cmVhbV90aW1lOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbik7CisgIHN0cmVhbV90aW1lID0KKyAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmdHJhbnMtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb19ib3gsICJzeW5jIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKHZpZGVvX2JveCksIHN0cmVhbV90aW1lKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92aWRlb19ib3hfdHJhbnNmb3JtX2ZyYW1lIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsCisgICAgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLCBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lKQoreworICBHc3RWaWRlb0JveCAqdmlkZW9fYm94ID0gR1NUX1ZJREVPX0JPWCAodmZpbHRlcik7CisKKyAgZ19tdXRleF9sb2NrICgmdmlkZW9fYm94LT5tdXRleCk7CisgIGdzdF92aWRlb19ib3hfcHJvY2VzcyAodmlkZW9fYm94LCBpbl9mcmFtZSwgb3V0X2ZyYW1lKTsKKyAgZ19tdXRleF91bmxvY2sgKCZ2aWRlb19ib3gtPm11dGV4KTsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCisvKiBGSVhNRTogMC4xMSBtZXJnZSB3aXRoIHZpZGVvY3JvcCBwbHVnaW4gKi8KK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHZpZGVvYm94X2RlYnVnLCAidmlkZW9ib3giLCAwLAorICAgICAgIlJlc2l6ZXMgYSB2aWRlbyBieSBhZGRpbmcgYm9yZGVycyBvciBjcm9wcGluZyIpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAidmlkZW9ib3giLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfVklERU9fQk9YKTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHZpZGVvYm94LAorICAgICJyZXNpemVzIGEgdmlkZW8gYnkgYWRkaW5nIGJvcmRlcnMgb3IgY3JvcHBpbmciLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmggYi9nc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmI5OGFjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94LmgKQEAgLTAsMCArMSw5MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpZm5kZWYgX19HU1RfVklERU9fQk9YX0hfXworI2RlZmluZSBfX0dTVF9WSURFT19CT1hfSF9fCisKKyNkZWZpbmUgR1NUX1RZUEVfVklERU9fQk9YIFwKKyAgKGdzdF92aWRlb19ib3hfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1ZJREVPX0JPWChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1ZJREVPX0JPWCxHc3RWaWRlb0JveCkpCisjZGVmaW5lIEdTVF9WSURFT19CT1hfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVklERU9fQk9YLEdzdFZpZGVvQm94Q2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVklERU9fQk9YKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVklERU9fQk9YKSkKKyNkZWZpbmUgR1NUX0lTX1ZJREVPX0JPWF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9WSURFT19CT1gpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VmlkZW9Cb3ggR3N0VmlkZW9Cb3g7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VmlkZW9Cb3hDbGFzcyBHc3RWaWRlb0JveENsYXNzOworCit0eXBlZGVmIGVudW0KK3sKKyAgVklERU9fQk9YX0ZJTExfQkxBQ0ssCisgIFZJREVPX0JPWF9GSUxMX0dSRUVOLAorICBWSURFT19CT1hfRklMTF9CTFVFLAorICBWSURFT19CT1hfRklMTF9SRUQsCisgIFZJREVPX0JPWF9GSUxMX1lFTExPVywKKyAgVklERU9fQk9YX0ZJTExfV0hJVEUsCisgIFZJREVPX0JPWF9GSUxMX0xBU1QKK30KK0dzdFZpZGVvQm94RmlsbDsKKworc3RydWN0IF9Hc3RWaWRlb0JveAoreworICBHc3RWaWRlb0ZpbHRlciBlbGVtZW50OworCisgIC8qIDxwcml2YXRlPiAqLworCisgIC8qIEd1YXJkaW5nIGV2ZXJ5dGhpbmcgYmVsb3cgKi8KKyAgR011dGV4IG11dGV4OworICAvKiBjYXBzICovCisgIEdzdFZpZGVvRm9ybWF0IGluX2Zvcm1hdDsKKyAgZ2ludCBpbl93aWR0aCwgaW5faGVpZ2h0OworICBnYm9vbGVhbiBpbl9zZHR2OworICBHc3RWaWRlb0Zvcm1hdCBvdXRfZm9ybWF0OworICBnaW50IG91dF93aWR0aCwgb3V0X2hlaWdodDsKKyAgZ2Jvb2xlYW4gb3V0X3NkdHY7CisKKyAgZ2ludCBib3hfbGVmdCwgYm94X3JpZ2h0LCBib3hfdG9wLCBib3hfYm90dG9tOworCisgIGdpbnQgYm9yZGVyX2xlZnQsIGJvcmRlcl9yaWdodCwgYm9yZGVyX3RvcCwgYm9yZGVyX2JvdHRvbTsKKyAgZ2ludCBjcm9wX2xlZnQsIGNyb3BfcmlnaHQsIGNyb3BfdG9wLCBjcm9wX2JvdHRvbTsKKworICBnZG91YmxlIGFscGhhOworICBnZG91YmxlIGJvcmRlcl9hbHBoYTsKKworICBHc3RWaWRlb0JveEZpbGwgZmlsbF90eXBlOworCisgIGdib29sZWFuIGF1dG9jcm9wOworCisgIHZvaWQgKCpmaWxsKSAoR3N0VmlkZW9Cb3hGaWxsIGZpbGxfdHlwZSwgZ3VpbnQgYl9hbHBoYSwgR3N0VmlkZW9GcmFtZSAqZGVzdCwgZ2Jvb2xlYW4gc2R0dik7CisgIHZvaWQgKCpjb3B5KSAoZ3VpbnQgaV9hbHBoYSwgR3N0VmlkZW9GcmFtZSAqIGRlc3QsIGdib29sZWFuIGRlc3Rfc2R0diwgZ2ludCBkZXN0X3gsIGdpbnQgZGVzdF95LCBHc3RWaWRlb0ZyYW1lICogc3JjLCBnYm9vbGVhbiBzcmNfc2R0diwgZ2ludCBzcmNfeCwgZ2ludCBzcmNfeSwgZ2ludCB3LCBnaW50IGgpOworfTsKKworc3RydWN0IF9Hc3RWaWRlb0JveENsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3ZpZGVvX2JveF9nZXRfdHlwZSAodm9pZCk7CisKKyNlbmRpZiAvKiBfX0dTVF9WSURFT19CT1hfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5jIGIvZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLWRpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOThiNDkwCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLWRpc3QuYwpAQCAtMCwwICsxLDI0MiBAQAorCisvKiBhdXRvZ2VuZXJhdGVkIGZyb20gZ3N0dmlkZW9ib3hvcmMub3JjICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpZm5kZWYgX09SQ19JTlRFR0VSX1RZUEVERUZTXworI2RlZmluZSBfT1JDX0lOVEVHRVJfVFlQRURFRlNfCisjaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyNpbmNsdWRlIDxzdGRpbnQuaD4KK3R5cGVkZWYgaW50OF90IG9yY19pbnQ4OwordHlwZWRlZiBpbnQxNl90IG9yY19pbnQxNjsKK3R5cGVkZWYgaW50MzJfdCBvcmNfaW50MzI7Cit0eXBlZGVmIGludDY0X3Qgb3JjX2ludDY0OwordHlwZWRlZiB1aW50OF90IG9yY191aW50ODsKK3R5cGVkZWYgdWludDE2X3Qgb3JjX3VpbnQxNjsKK3R5cGVkZWYgdWludDMyX3Qgb3JjX3VpbnQzMjsKK3R5cGVkZWYgdWludDY0X3Qgb3JjX3VpbnQ2NDsKKyNkZWZpbmUgT1JDX1VJTlQ2NF9DKHgpIFVJTlQ2NF9DKHgpCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQordHlwZWRlZiBzaWduZWQgX19pbnQ4IG9yY19pbnQ4OwordHlwZWRlZiBzaWduZWQgX19pbnQxNiBvcmNfaW50MTY7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDMyIG9yY19pbnQzMjsKK3R5cGVkZWYgc2lnbmVkIF9faW50NjQgb3JjX2ludDY0OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDggb3JjX3VpbnQ4OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDE2IG9yY191aW50MTY7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50MzIgb3JjX3VpbnQzMjsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgKHgjI1VpNjQpCisjZGVmaW5lIGlubGluZSBfX2lubGluZQorI2Vsc2UKKyNpbmNsdWRlIDxsaW1pdHMuaD4KK3R5cGVkZWYgc2lnbmVkIGNoYXIgb3JjX2ludDg7Cit0eXBlZGVmIHNob3J0IG9yY19pbnQxNjsKK3R5cGVkZWYgaW50IG9yY19pbnQzMjsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBvcmNfdWludDg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IG9yY191aW50MTY7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBvcmNfdWludDMyOworI2lmIElOVF9NQVggPT0gTE9OR19NQVgKK3R5cGVkZWYgbG9uZyBsb25nIG9yY19pbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSAoeCMjVUxMKQorI2Vsc2UKK3R5cGVkZWYgbG9uZyBvcmNfaW50NjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgb3JjX3VpbnQ2NDsKKyNkZWZpbmUgT1JDX1VJTlQ2NF9DKHgpICh4IyNVTCkKKyNlbmRpZgorI2VuZGlmCit0eXBlZGVmIHVuaW9uCit7CisgIG9yY19pbnQxNiBpOworICBvcmNfaW50OCB4MlsyXTsKK30gb3JjX3VuaW9uMTY7Cit0eXBlZGVmIHVuaW9uCit7CisgIG9yY19pbnQzMiBpOworICBmbG9hdCBmOworICBvcmNfaW50MTYgeDJbMl07CisgIG9yY19pbnQ4IHg0WzRdOworfSBvcmNfdW5pb24zMjsKK3R5cGVkZWYgdW5pb24KK3sKKyAgb3JjX2ludDY0IGk7CisgIGRvdWJsZSBmOworICBvcmNfaW50MzIgeDJbMl07CisgIGZsb2F0IHgyZlsyXTsKKyAgb3JjX2ludDE2IHg0WzRdOworfSBvcmNfdW5pb242NDsKKyNlbmRpZgorI2lmbmRlZiBPUkNfUkVTVFJJQ1QKKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorI2RlZmluZSBPUkNfUkVTVFJJQ1QgcmVzdHJpY3QKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDQKKyNkZWZpbmUgT1JDX1JFU1RSSUNUIF9fcmVzdHJpY3RfXworI2Vsc2UKKyNkZWZpbmUgT1JDX1JFU1RSSUNUCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE9SQ19JTlRFUk5BTAorI2lmIGRlZmluZWQoX19TVU5QUk9fQykgJiYgKF9fU1VOUFJPX0MgPj0gMHg1OTApCisjZGVmaW5lIE9SQ19JTlRFUk5BTCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZWxpZiBkZWZpbmVkKF9fU1VOUFJPX0MpICYmIChfX1NVTlBST19DID49IDB4NTUwKQorI2RlZmluZSBPUkNfSU5URVJOQUwgX19oaWRkZW4KKyNlbGlmIGRlZmluZWQgKF9fR05VQ19fKQorI2RlZmluZSBPUkNfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiaGlkZGVuIikpKQorI2Vsc2UKKyNkZWZpbmUgT1JDX0lOVEVSTkFMCisjZW5kaWYKKyNlbmRpZgorCisKKyNpZm5kZWYgRElTQUJMRV9PUkMKKyNpbmNsdWRlIDxvcmMvb3JjLmg+CisjZW5kaWYKK3ZvaWQgdmlkZW9fYm94X29yY19zcGxhdF91MzIgKGd1aW50MzIgKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBwMSwgaW50IG4pOworCisKKy8qIGJlZ2luIE9yYyBDIHRhcmdldCBwcmVhbWJsZSAqLworI2RlZmluZSBPUkNfQ0xBTVAoeCxhLGIpICgoeCk8KGEpID8gKGEpIDogKCh4KT4oYikgPyAoYikgOiAoeCkpKQorI2RlZmluZSBPUkNfQUJTKGEpICgoYSk8MCA/IC0oYSkgOiAoYSkpCisjZGVmaW5lIE9SQ19NSU4oYSxiKSAoKGEpPChiKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgT1JDX01BWChhLGIpICgoYSk+KGIpID8gKGEpIDogKGIpKQorI2RlZmluZSBPUkNfU0JfTUFYIDEyNworI2RlZmluZSBPUkNfU0JfTUlOICgtMS1PUkNfU0JfTUFYKQorI2RlZmluZSBPUkNfVUJfTUFYIChvcmNfdWludDgpIDI1NQorI2RlZmluZSBPUkNfVUJfTUlOIDAKKyNkZWZpbmUgT1JDX1NXX01BWCAzMjc2NworI2RlZmluZSBPUkNfU1dfTUlOICgtMS1PUkNfU1dfTUFYKQorI2RlZmluZSBPUkNfVVdfTUFYIChvcmNfdWludDE2KTY1NTM1CisjZGVmaW5lIE9SQ19VV19NSU4gMAorI2RlZmluZSBPUkNfU0xfTUFYIDIxNDc0ODM2NDcKKyNkZWZpbmUgT1JDX1NMX01JTiAoLTEtT1JDX1NMX01BWCkKKyNkZWZpbmUgT1JDX1VMX01BWCA0Mjk0OTY3Mjk1VQorI2RlZmluZSBPUkNfVUxfTUlOIDAKKyNkZWZpbmUgT1JDX0NMQU1QX1NCKHgpIE9SQ19DTEFNUCh4LE9SQ19TQl9NSU4sT1JDX1NCX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1VCKHgpIE9SQ19DTEFNUCh4LE9SQ19VQl9NSU4sT1JDX1VCX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1NXKHgpIE9SQ19DTEFNUCh4LE9SQ19TV19NSU4sT1JDX1NXX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1VXKHgpIE9SQ19DTEFNUCh4LE9SQ19VV19NSU4sT1JDX1VXX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1NMKHgpIE9SQ19DTEFNUCh4LE9SQ19TTF9NSU4sT1JDX1NMX01BWCkKKyNkZWZpbmUgT1JDX0NMQU1QX1VMKHgpIE9SQ19DTEFNUCh4LE9SQ19VTF9NSU4sT1JDX1VMX01BWCkKKyNkZWZpbmUgT1JDX1NXQVBfVyh4KSAoKCgoeCkmMHhmZlUpPDw4KSB8ICgoKHgpJjB4ZmYwMFUpPj44KSkKKyNkZWZpbmUgT1JDX1NXQVBfTCh4KSAoKCgoeCkmMHhmZlUpPDwyNCkgfCAoKCh4KSYweGZmMDBVKTw8OCkgfCAoKCh4KSYweGZmMDAwMFUpPj44KSB8ICgoKHgpJjB4ZmYwMDAwMDBVKT4+MjQpKQorI2RlZmluZSBPUkNfU1dBUF9RKHgpICgoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZikpPDw1NikgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwKSk8PDQwKSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDAwMCkpPDwyNCkgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwMDAwMCkpPDw4KSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDAwMDAwMDApKT4+OCkgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwMDAwMDAwMDApKT4+MjQpIHwgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4ZmYwMDAwMDAwMDAwMDApKT4+NDApIHwgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4ZmYwMDAwMDAwMDAwMDAwMCkpPj41NikpCisjZGVmaW5lIE9SQ19QVFJfT0ZGU0VUKHB0cixvZmZzZXQpICgodm9pZCAqKSgoKHVuc2lnbmVkIGNoYXIgKikocHRyKSkgKyAob2Zmc2V0KSkpCisjZGVmaW5lIE9SQ19ERU5PUk1BTCh4KSAoKHgpICYgKCgoKHgpJjB4N2Y4MDAwMDApID09IDApID8gMHhmZjgwMDAwMCA6IDB4ZmZmZmZmZmYpKQorI2RlZmluZSBPUkNfSVNOQU4oeCkgKCgoKHgpJjB4N2Y4MDAwMDApID09IDB4N2Y4MDAwMDApICYmICgoKHgpJjB4MDA3ZmZmZmYpICE9IDApKQorI2RlZmluZSBPUkNfREVOT1JNQUxfRE9VQkxFKHgpICgoeCkgJiAoKCgoeCkmT1JDX1VJTlQ2NF9DKDB4N2ZmMDAwMDAwMDAwMDAwMCkpID09IDApID8gT1JDX1VJTlQ2NF9DKDB4ZmZmMDAwMDAwMDAwMDAwMCkgOiBPUkNfVUlOVDY0X0MoMHhmZmZmZmZmZmZmZmZmZmZmKSkpCisjZGVmaW5lIE9SQ19JU05BTl9ET1VCTEUoeCkgKCgoKHgpJk9SQ19VSU5UNjRfQygweDdmZjAwMDAwMDAwMDAwMDApKSA9PSBPUkNfVUlOVDY0X0MoMHg3ZmYwMDAwMDAwMDAwMDAwKSkgJiYgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4MDAwZmZmZmZmZmZmZmZmZikpICE9IDApKQorI2lmbmRlZiBPUkNfUkVTVFJJQ1QKKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorI2RlZmluZSBPUkNfUkVTVFJJQ1QgcmVzdHJpY3QKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDQKKyNkZWZpbmUgT1JDX1JFU1RSSUNUIF9fcmVzdHJpY3RfXworI2Vsc2UKKyNkZWZpbmUgT1JDX1JFU1RSSUNUCisjZW5kaWYKKyNlbmRpZgorLyogZW5kIE9yYyBDIHRhcmdldCBwcmVhbWJsZSAqLworCisKKworLyogdmlkZW9fYm94X29yY19zcGxhdF91MzIgKi8KKyNpZmRlZiBESVNBQkxFX09SQwordm9pZAordmlkZW9fYm94X29yY19zcGxhdF91MzIgKGd1aW50MzIgKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBwMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIG9yY191bmlvbjMyIHZhcjMyOworICBvcmNfdW5pb24zMiB2YXIzMzsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGQxOworCisgIC8qIDA6IGxvYWRwbCAqLworICB2YXIzMi5pID0gcDE7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDE6IGNvcHlsICovCisgICAgdmFyMzMuaSA9IHZhcjMyLmk7CisgICAgLyogMjogc3RvcmVsICovCisgICAgcHRyMFtpXSA9IHZhcjMzOworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX3ZpZGVvX2JveF9vcmNfc3BsYXRfdTMyIChPcmNFeGVjdXRvciAqIE9SQ19SRVNUUklDVCBleCkKK3sKKyAgaW50IGk7CisgIGludCBuID0gZXgtPm47CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgb3JjX3VuaW9uMzIgdmFyMzI7CisgIG9yY191bmlvbjMyIHZhcjMzOworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZXgtPmFycmF5c1swXTsKKworICAvKiAwOiBsb2FkcGwgKi8KKyAgdmFyMzIuaSA9IGV4LT5wYXJhbXNbMjRdOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAxOiBjb3B5bCAqLworICAgIHZhcjMzLmkgPSB2YXIzMi5pOworICAgIC8qIDI6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzMzsKKyAgfQorCit9CisKK3ZvaWQKK3ZpZGVvX2JveF9vcmNfc3BsYXRfdTMyIChndWludDMyICogT1JDX1JFU1RSSUNUIGQxLCBpbnQgcDEsIGludCBuKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgOSwgMjMsIDExOCwgMTA1LCAxMDAsIDEwMSwgMTExLCA5NSwgOTgsIDExMSwgMTIwLCA5NSwgMTExLCAxMTQsIDk5LAorICAgICAgICA5NSwgMTE1LCAxMTIsIDEwOCwgOTcsIDExNiwgOTUsIDExNywgNTEsIDUwLCAxMSwgNCwgNCwgMTYsIDQsIDExMiwKKyAgICAgICAgMCwgMjQsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwgX2JhY2t1cF92aWRlb19ib3hfb3JjX3NwbGF0X3UzMik7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9uYW1lIChwLCAidmlkZW9fYm94X29yY19zcGxhdF91MzIiKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsIF9iYWNrdXBfdmlkZW9fYm94X29yY19zcGxhdF91MzIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCA0LCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXIgKHAsIDQsICJwMSIpOworCisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvcHlsIiwgMCwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9QMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHAxOworCisgIGZ1bmMgPSBjLT5leGVjOworICBmdW5jIChleCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy1kaXN0LmggYi9nc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYzJkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMtZGlzdC5oCkBAIC0wLDAgKzEsOTAgQEAKKworLyogYXV0b2dlbmVyYXRlZCBmcm9tIGdzdHZpZGVvYm94b3JjLm9yYyAqLworCisjaWZuZGVmIF9HU1RWSURFT0JPWE9SQ19IXworI2RlZmluZSBfR1NUVklERU9CT1hPUkNfSF8KKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKworI2lmbmRlZiBfT1JDX0lOVEVHRVJfVFlQRURFRlNfCisjZGVmaW5lIF9PUkNfSU5URUdFUl9UWVBFREVGU18KKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorI2luY2x1ZGUgPHN0ZGludC5oPgordHlwZWRlZiBpbnQ4X3Qgb3JjX2ludDg7Cit0eXBlZGVmIGludDE2X3Qgb3JjX2ludDE2OwordHlwZWRlZiBpbnQzMl90IG9yY19pbnQzMjsKK3R5cGVkZWYgaW50NjRfdCBvcmNfaW50NjQ7Cit0eXBlZGVmIHVpbnQ4X3Qgb3JjX3VpbnQ4OwordHlwZWRlZiB1aW50MTZfdCBvcmNfdWludDE2OwordHlwZWRlZiB1aW50MzJfdCBvcmNfdWludDMyOwordHlwZWRlZiB1aW50NjRfdCBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgVUlOVDY0X0MoeCkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCit0eXBlZGVmIHNpZ25lZCBfX2ludDggb3JjX2ludDg7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDE2IG9yY19pbnQxNjsKK3R5cGVkZWYgc2lnbmVkIF9faW50MzIgb3JjX2ludDMyOwordHlwZWRlZiBzaWduZWQgX19pbnQ2NCBvcmNfaW50NjQ7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50OCBvcmNfdWludDg7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50MTYgb3JjX3VpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQzMiBvcmNfdWludDMyOwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSAoeCMjVWk2NCkKKyNkZWZpbmUgaW5saW5lIF9faW5saW5lCisjZWxzZQorI2luY2x1ZGUgPGxpbWl0cy5oPgordHlwZWRlZiBzaWduZWQgY2hhciBvcmNfaW50ODsKK3R5cGVkZWYgc2hvcnQgb3JjX2ludDE2OwordHlwZWRlZiBpbnQgb3JjX2ludDMyOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIG9yY191aW50ODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgb3JjX3VpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IG9yY191aW50MzI7CisjaWYgSU5UX01BWCA9PSBMT05HX01BWAordHlwZWRlZiBsb25nIGxvbmcgb3JjX2ludDY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgb3JjX3VpbnQ2NDsKKyNkZWZpbmUgT1JDX1VJTlQ2NF9DKHgpICh4IyNVTEwpCisjZWxzZQordHlwZWRlZiBsb25nIG9yY19pbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgKHgjI1VMKQorI2VuZGlmCisjZW5kaWYKK3R5cGVkZWYgdW5pb24geyBvcmNfaW50MTYgaTsgb3JjX2ludDggeDJbMl07IH0gb3JjX3VuaW9uMTY7Cit0eXBlZGVmIHVuaW9uIHsgb3JjX2ludDMyIGk7IGZsb2F0IGY7IG9yY19pbnQxNiB4MlsyXTsgb3JjX2ludDggeDRbNF07IH0gb3JjX3VuaW9uMzI7Cit0eXBlZGVmIHVuaW9uIHsgb3JjX2ludDY0IGk7IGRvdWJsZSBmOyBvcmNfaW50MzIgeDJbMl07IGZsb2F0IHgyZlsyXTsgb3JjX2ludDE2IHg0WzRdOyB9IG9yY191bmlvbjY0OworI2VuZGlmCisjaWZuZGVmIE9SQ19SRVNUUklDVAorI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjZGVmaW5lIE9SQ19SRVNUUklDVCByZXN0cmljdAorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAorI2RlZmluZSBPUkNfUkVTVFJJQ1QgX19yZXN0cmljdF9fCisjZWxzZQorI2RlZmluZSBPUkNfUkVTVFJJQ1QKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgT1JDX0lOVEVSTkFMCisjaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU5MCkKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykgJiYgKF9fU1VOUFJPX0MgPj0gMHg1NTApCisjZGVmaW5lIE9SQ19JTlRFUk5BTCBfX2hpZGRlbgorI2VsaWYgZGVmaW5lZCAoX19HTlVDX18pCisjZGVmaW5lIE9SQ19JTlRFUk5BTCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZWxzZQorI2RlZmluZSBPUkNfSU5URVJOQUwKKyNlbmRpZgorI2VuZGlmCisKK3ZvaWQgdmlkZW9fYm94X29yY19zcGxhdF91MzIgKGd1aW50MzIgKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBwMSwgaW50IG4pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLm9yYyBiL2dzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy5vcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiZjllNwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2JveC9nc3R2aWRlb2JveG9yYy5vcmMKQEAgLTAsMCArMSw3IEBACisKKy5mdW5jdGlvbiB2aWRlb19ib3hfb3JjX3NwbGF0X3UzMgorLmRlc3QgNCBkMSBndWludDMyCisucGFyYW0gNCBwMQorCitjb3B5bCBkMSwgcDEKKwpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvYm94L21lc29uLmJ1aWxkIGIvZ3N0L3ZpZGVvYm94L21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMGVkZTAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9ib3gvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwyNyBAQAorb3Jjc3JjID0gJ2dzdHZpZGVvYm94b3JjJworaWYgaGF2ZV9vcmNjCisgIG9yY19oID0gY3VzdG9tX3RhcmdldChvcmNzcmMgKyAnLmgnLAorICAgIGlucHV0IDogb3Jjc3JjICsgJy5vcmMnLAorICAgIG91dHB1dCA6IG9yY3NyYyArICcuaCcsCisgICAgY29tbWFuZCA6IG9yY2NfYXJncyArIFsnLS1oZWFkZXInLCAnLW8nLCAnQE9VVFBVVEAnLCAnQElOUFVUQCddKQorICBvcmNfYyA9IGN1c3RvbV90YXJnZXQob3Jjc3JjICsgJy5jJywKKyAgICBpbnB1dCA6IG9yY3NyYyArICcub3JjJywKKyAgICBvdXRwdXQgOiBvcmNzcmMgKyAnLmMnLAorICAgIGNvbW1hbmQgOiBvcmNjX2FyZ3MgKyBbJy0taW1wbGVtZW50YXRpb24nLCAnLW8nLCAnQE9VVFBVVEAnLCAnQElOUFVUQCddKQorZWxzZQorICBvcmNfaCA9IGNvbmZpZ3VyZV9maWxlKGlucHV0IDogb3Jjc3JjICsgJy1kaXN0LmgnLAorICAgIG91dHB1dCA6IG9yY3NyYyArICcuaCcsCisgICAgY29uZmlndXJhdGlvbiA6IGNvbmZpZ3VyYXRpb25fZGF0YSgpKQorICBvcmNfYyA9IGNvbmZpZ3VyZV9maWxlKGlucHV0IDogb3Jjc3JjICsgJy1kaXN0LmMnLAorICAgIG91dHB1dCA6IG9yY3NyYyArICcuYycsCisgICAgY29uZmlndXJhdGlvbiA6IGNvbmZpZ3VyYXRpb25fZGF0YSgpKQorZW5kaWYKKworZ3N0dmlkZW9ib3ggPSBsaWJyYXJ5KCdnc3R2aWRlb2JveCcsCisgICdnc3R2aWRlb2JveC5jJywgb3JjX2MsIG9yY19oLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgZGVwZW5kZW5jaWVzIDogW29yY19kZXAsIGdzdGJhc2VfZGVwLCBnc3R2aWRlb19kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvY3JvcC9NYWtlZmlsZS5hbSBiL2dzdC92aWRlb2Nyb3AvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyMGMyMQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2Nyb3AvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMiBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0dmlkZW9jcm9wLmxhCisKKyMgTm90ZTogd2Ugb25seSB1c2UgZGVmaW5lcyBmcm9tIGdzdC92aWRlby92aWRlby5oLCBidXQgbm9uZQorIyBvZiB0aGUgZnVuY3Rpb25zLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgdG8gbGliZ3N0dmlkZW8KKworbGliZ3N0dmlkZW9jcm9wX2xhX1NPVVJDRVMgPSBnc3R2aWRlb2Nyb3AuYyBnc3Rhc3BlY3RyYXRpb2Nyb3AuYworbGliZ3N0dmlkZW9jcm9wX2xhX0NGTEFHUyA9ICQoR1NUX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKQorbGliZ3N0dmlkZW9jcm9wX2xhX0xJQkFERCA9ICQoR1NUX0JBU0VfTElCUykgJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dmlkZW8tJChHU1RfQVBJX1ZFUlNJT04pCitsaWJnc3R2aWRlb2Nyb3BfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdHZpZGVvY3JvcC5oIGdzdGFzcGVjdHJhdGlvY3JvcC5oCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5jIGIvZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzFkOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuYwpAQCAtMCwwICsxLDQ5MSBAQAorLyogR1N0cmVhbWVyIHZpZGVvIGZyYW1lIGNyb3BwaW5nIHRvIGFzcGVjdC1yYXRpbworICogQ29weXJpZ2h0IChDKSAyMDA5IFRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtYXNwZWN0cmF0aW9jcm9wCisgKiBAc2VlX2Fsc286ICNHc3RWaWRlb0Nyb3AKKyAqCisgKiBUaGlzIGVsZW1lbnQgY3JvcHMgdmlkZW8gZnJhbWVzIHRvIGEgc3BlY2lmaWVkICNHc3RBc3BlY3RSYXRpb0Nyb3A6YXNwZWN0LXJhdGlvLgorICoKKyAqIElmIHRoZSBhc3BlY3QtcmF0aW8gaXMgYWxyZWFkeSBjb3JyZWN0LCB0aGUgZWxlbWVudCB3aWxsIG9wZXJhdGUKKyAqIGluIHBhc3MtdGhyb3VnaCBtb2RlLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiB2aWRlb3Rlc3RzcmMgISB2aWRlby94LXJhdyxoZWlnaHQ9NjQwLHdpZHRoPTQ4MCAhIGFzcGVjdHJhdGlvY3JvcCBhc3BlY3QtcmF0aW89MTYvOSAhIHhpbWFnZXNpbmsKKyAqIF18IFRoaXMgcGlwZWxpbmUgZ2VuZXJhdGVzIGEgdmlkZW9zdHJlYW0gaW4gNC8zIGFuZCBjcm9wcyBpdCB0byAxNi85LgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlICJnc3Rhc3BlY3RyYXRpb2Nyb3AuaCIKKworI2luY2x1ZGUgImdzdC9nbGliLWNvbXBhdC1wcml2YXRlLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGFzcGVjdF9yYXRpb19jcm9wX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGFzcGVjdF9yYXRpb19jcm9wX2RlYnVnCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0FTUEVDVF9SQVRJT19DUk9QLAorfTsKKworLyogd2Ugc3VwcG9ydCB0aGUgc2FtZSBjYXBzIGFzIHZpZGVvY3JvcCAoc3luYyBjaGFuZ2VzKSAqLworI2RlZmluZSBBU1BFQ1RfUkFUSU9fQ1JPUF9DQVBTICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHU1RfVklERU9fQ0FQU19NQUtFICgieyBSR0J4LCB4UkdCLCBCR1J4LCB4QkdSLCAiICAgIFwKKyAgICAgICJSR0JBLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0IsIEJHUiwgQVlVViwgWVVZMiwgIiBcCisgICAgICAiWVZZVSwgVVlWWSwgSTQyMCwgWVYxMiwgUkdCMTYsIFJHQjE1LCBHUkFZOCwgIiAgXAorICAgICAgIk5WMTIsIE5WMjEsIEdSQVkxNl9MRSwgR1JBWTE2X0JFIH0iKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoQVNQRUNUX1JBVElPX0NST1BfQ0FQUykKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoQVNQRUNUX1JBVElPX0NST1BfQ0FQUykKKyAgICApOworCisjZGVmaW5lIGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RBc3BlY3RSYXRpb0Nyb3AsIGdzdF9hc3BlY3RfcmF0aW9fY3JvcCwgR1NUX1RZUEVfQklOKTsKKworc3RhdGljIHZvaWQgZ3N0X2FzcGVjdF9yYXRpb19jcm9wX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfYXNwZWN0X3JhdGlvX2Nyb3Bfc2V0X2Nyb3BwaW5nIChHc3RBc3BlY3RSYXRpb0Nyb3AgKgorICAgIGFzcGVjdF9yYXRpb19jcm9wLCBnaW50IHRvcCwgZ2ludCByaWdodCwgZ2ludCBib3R0b20sIGdpbnQgbGVmdCk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X2FzcGVjdF9yYXRpb19jcm9wX2dldF9jYXBzIChHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIGdib29sZWFuIGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9zZXRfY2FwcyAoR3N0QXNwZWN0UmF0aW9Dcm9wICoKKyAgICBhc3BlY3RfcmF0aW9fY3JvcCwgR3N0Q2FwcyAqIGNhcHMpOworc3RhdGljIGdib29sZWFuIGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2dCk7CitzdGF0aWMgdm9pZCBnc3RfYXNwZWN0X3JhdGlvX2Nyb3BfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X2FzcGVjdF9yYXRpb190cmFuc2Zvcm1fc3RydWN0dXJlIChHc3RBc3BlY3RSYXRpb0Nyb3AgKgorICAgIGFzcGVjdF9yYXRpb19jcm9wLCBHc3RTdHJ1Y3R1cmUgKiBzdHJ1Y3R1cmUsIEdzdFN0cnVjdHVyZSAqKiBuZXdfc3RydWN0dXJlLAorICAgIGdib29sZWFuIHNldF92aWRlb2Nyb3ApOworCitzdGF0aWMgdm9pZAorZ3N0X2FzcGVjdF9yYXRpb19jcm9wX3NldF9jcm9wcGluZyAoR3N0QXNwZWN0UmF0aW9Dcm9wICogYXNwZWN0X3JhdGlvX2Nyb3AsCisgICAgZ2ludCB0b3AsIGdpbnQgcmlnaHQsIGdpbnQgYm90dG9tLCBnaW50IGxlZnQpCit7CisgIEdWYWx1ZSB2YWx1ZSA9IHsgMCB9OworICBpZiAoR19VTkxJS0VMWSAoIWFzcGVjdF9yYXRpb19jcm9wLT52aWRlb2Nyb3ApKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhc3BlY3RfcmF0aW9fY3JvcCwKKyAgICAgICAgIkNhbid0IHNldCB0aGUgc2V0dGluZ3MgaWYgdGhlcmUgaXMgbm8gY3JvcHBpbmcgZWxlbWVudCIpOworICAgIHJldHVybjsKKyAgfQorCisgIGdfdmFsdWVfaW5pdCAoJnZhbHVlLCBHX1RZUEVfSU5UKTsKKyAgZ192YWx1ZV9zZXRfaW50ICgmdmFsdWUsIHRvcCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGFzcGVjdF9yYXRpb19jcm9wLCAic2V0IHRvcCBjcm9wcGluZyB0bzogJWQiLCB0b3ApOworICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChhc3BlY3RfcmF0aW9fY3JvcC0+dmlkZW9jcm9wKSwgInRvcCIsCisgICAgICAmdmFsdWUpOworICBnX3ZhbHVlX3NldF9pbnQgKCZ2YWx1ZSwgcmlnaHQpOworICBHU1RfREVCVUdfT0JKRUNUIChhc3BlY3RfcmF0aW9fY3JvcCwgInNldCByaWdodCBjcm9wcGluZyB0bzogJWQiLCByaWdodCk7CisgIGdfb2JqZWN0X3NldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKGFzcGVjdF9yYXRpb19jcm9wLT52aWRlb2Nyb3ApLCAicmlnaHQiLAorICAgICAgJnZhbHVlKTsKKyAgZ192YWx1ZV9zZXRfaW50ICgmdmFsdWUsIGJvdHRvbSk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGFzcGVjdF9yYXRpb19jcm9wLCAic2V0IGJvdHRvbSBjcm9wcGluZyB0bzogJWQiLCBib3R0b20pOworICBnX29iamVjdF9zZXRfcHJvcGVydHkgKEdfT0JKRUNUIChhc3BlY3RfcmF0aW9fY3JvcC0+dmlkZW9jcm9wKSwgImJvdHRvbSIsCisgICAgICAmdmFsdWUpOworICBnX3ZhbHVlX3NldF9pbnQgKCZ2YWx1ZSwgbGVmdCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGFzcGVjdF9yYXRpb19jcm9wLCAic2V0IGxlZnQgY3JvcHBpbmcgdG86ICVkIiwgbGVmdCk7CisgIGdfb2JqZWN0X3NldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKGFzcGVjdF9yYXRpb19jcm9wLT52aWRlb2Nyb3ApLCAibGVmdCIsCisgICAgICAmdmFsdWUpOworCisgIGdfdmFsdWVfdW5zZXQgKCZ2YWx1ZSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2FzcGVjdF9yYXRpb19jcm9wX3NldF9jYXBzIChHc3RBc3BlY3RSYXRpb0Nyb3AgKiBhc3BlY3RfcmF0aW9fY3JvcCwKKyAgICBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0UGFkICpwZWVyX3BhZDsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdib29sZWFuIHJldDsKKworICBnX211dGV4X2xvY2sgKCZhc3BlY3RfcmF0aW9fY3JvcC0+Y3JvcF9sb2NrKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgZ3N0X2FzcGVjdF9yYXRpb190cmFuc2Zvcm1fc3RydWN0dXJlIChhc3BlY3RfcmF0aW9fY3JvcCwgc3RydWN0dXJlLCBOVUxMLAorICAgICAgVFJVRSk7CisgIHBlZXJfcGFkID0KKyAgICAgIGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChHU1RfRUxFTUVOVCAoYXNwZWN0X3JhdGlvX2Nyb3AtPnZpZGVvY3JvcCksCisgICAgICAic2luayIpOworICByZXQgPSBnc3RfcGFkX3NldF9jYXBzIChwZWVyX3BhZCwgY2Fwcyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBlZXJfcGFkKTsKKyAgZ19tdXRleF91bmxvY2sgKCZhc3BlY3RfcmF0aW9fY3JvcC0+Y3JvcF9sb2NrKTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfYXNwZWN0X3JhdGlvX2Nyb3Bfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldnQpCit7CisgIEdzdEFzcGVjdFJhdGlvQ3JvcCAqYXNwZWN0X3JhdGlvX2Nyb3AgPSBHU1RfQVNQRUNUX1JBVElPX0NST1AgKHBhcmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZ0KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2dCwgJmNhcHMpOworICAgICAgZ3N0X2FzcGVjdF9yYXRpb19jcm9wX3NldF9jYXBzIChhc3BlY3RfcmF0aW9fY3JvcCwgY2Fwcyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2dCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXNwZWN0X3JhdGlvX2Nyb3BfY2xhc3NfaW5pdCAoR3N0QXNwZWN0UmF0aW9Dcm9wQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X2FzcGVjdF9yYXRpb19jcm9wX2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQVNQRUNUX1JBVElPX0NST1AsCisgICAgICBnc3RfcGFyYW1fc3BlY19mcmFjdGlvbiAoImFzcGVjdC1yYXRpbyIsICJhc3BlY3QtcmF0aW8iLAorICAgICAgICAgICJUYXJnZXQgYXNwZWN0LXJhdGlvIG9mIHZpZGVvIiwgMCwgMSwgR19NQVhJTlQsIDEsIDAsIDEsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgImFzcGVjdHJhdGlvY3JvcCIsCisgICAgICAiRmlsdGVyL0VmZmVjdC9WaWRlbyIsCisgICAgICAiQ3JvcHMgdmlkZW8gaW50byBhIHVzZXItZGVmaW5lZCBhc3BlY3QtcmF0aW8iLAorICAgICAgIlRoaWpzIFZlcm1laXIgPHRoaWpzdmVybWVpckBnbWFpbC5jb20+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzcmNfdGVtcGxhdGUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FzcGVjdF9yYXRpb19jcm9wX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RBc3BlY3RSYXRpb0Nyb3AgKmFzcGVjdF9yYXRpb19jcm9wOworCisgIGFzcGVjdF9yYXRpb19jcm9wID0gR1NUX0FTUEVDVF9SQVRJT19DUk9QIChvYmplY3QpOworCisgIGdfbXV0ZXhfY2xlYXIgKCZhc3BlY3RfcmF0aW9fY3JvcC0+Y3JvcF9sb2NrKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXNwZWN0X3JhdGlvX2Nyb3BfaW5pdCAoR3N0QXNwZWN0UmF0aW9Dcm9wICogYXNwZWN0X3JhdGlvX2Nyb3ApCit7CisgIEdzdFBhZCAqbGlua19wYWQ7CisgIEdzdFBhZCAqc3JjX3BhZDsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoYXNwZWN0X3JhdGlvX2Nyb3BfZGVidWcsICJhc3BlY3RyYXRpb2Nyb3AiLCAwLAorICAgICAgImFzcGVjdHJhdGlvY3JvcCIpOworCisgIGFzcGVjdF9yYXRpb19jcm9wLT5hcl9udW0gPSAwOworICBhc3BlY3RfcmF0aW9fY3JvcC0+YXJfZGVub20gPSAxOworCisgIGdfbXV0ZXhfaW5pdCAoJmFzcGVjdF9yYXRpb19jcm9wLT5jcm9wX2xvY2spOworCisgIC8qIGFkZCB0aGUgdHJhbnNmb3JtIGVsZW1lbnQgKi8KKyAgYXNwZWN0X3JhdGlvX2Nyb3AtPnZpZGVvY3JvcCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvY3JvcCIsIE5VTEwpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAoYXNwZWN0X3JhdGlvX2Nyb3ApLCBhc3BlY3RfcmF0aW9fY3JvcC0+dmlkZW9jcm9wKTsKKworICAvKiBjcmVhdGUgZ2hvc3QgcGFkIHNyYyAqLworICBsaW5rX3BhZCA9CisgICAgICBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoR1NUX0VMRU1FTlQgKGFzcGVjdF9yYXRpb19jcm9wLT52aWRlb2Nyb3ApLAorICAgICAgInNyYyIpOworICBzcmNfcGFkID0gZ3N0X2dob3N0X3BhZF9uZXcgKCJzcmMiLCBsaW5rX3BhZCk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChzcmNfcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9zcmNfcXVlcnkpKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKGFzcGVjdF9yYXRpb19jcm9wKSwgc3JjX3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGxpbmtfcGFkKTsKKyAgLyogY3JlYXRlIGdob3N0IHBhZCBzaW5rICovCisgIGxpbmtfcGFkID0KKyAgICAgIGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChHU1RfRUxFTUVOVCAoYXNwZWN0X3JhdGlvX2Nyb3AtPnZpZGVvY3JvcCksCisgICAgICAic2luayIpOworICBhc3BlY3RfcmF0aW9fY3JvcC0+c2luayA9IGdzdF9naG9zdF9wYWRfbmV3ICgic2luayIsIGxpbmtfcGFkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKGFzcGVjdF9yYXRpb19jcm9wKSwKKyAgICAgIGFzcGVjdF9yYXRpb19jcm9wLT5zaW5rKTsKKyAgZ3N0X29iamVjdF91bnJlZiAobGlua19wYWQpOworCisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChhc3BlY3RfcmF0aW9fY3JvcC0+c2luaywKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfYXNwZWN0X3JhdGlvX2Nyb3Bfc2lua19ldmVudCkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2FzcGVjdF9yYXRpb190cmFuc2Zvcm1fc3RydWN0dXJlIChHc3RBc3BlY3RSYXRpb0Nyb3AgKiBhc3BlY3RfcmF0aW9fY3JvcCwKKyAgICBHc3RTdHJ1Y3R1cmUgKiBzdHJ1Y3R1cmUsIEdzdFN0cnVjdHVyZSAqKiBuZXdfc3RydWN0dXJlLAorICAgIGdib29sZWFuIHNldF92aWRlb2Nyb3ApCit7CisgIGdkb3VibGUgaW5jb21pbmdfYXI7CisgIGdkb3VibGUgcmVxdWVzdGVkX2FyOworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgY3JvcHZhbHVlOworICBnaW50IHBhcl9kLCBwYXJfbjsKKworICAvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgYXNwZWN0IHJhdGlvICovCisgIGlmIChhc3BlY3RfcmF0aW9fY3JvcC0+YXJfbnVtIDwgMSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFzcGVjdF9yYXRpb19jcm9wLCAiTm8gY3JvcHBpbmcgcmVxdWVzdGVkIik7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIC8qIGdldCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgY2FwcyAqLworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAid2lkdGgiLCAmd2lkdGgpIHx8CisgICAgICAhZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJoZWlnaHQiLCAmaGVpZ2h0KSkKKyAgICBnb3RvIGJlYWNoOworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfZnJhY3Rpb24gKHN0cnVjdHVyZSwgInBpeGVsLWFzcGVjdC1yYXRpbyIsCisgICAgICAgICAgJnBhcl9uLCAmcGFyX2QpKSB7CisgICAgcGFyX2QgPSBwYXJfbiA9IDE7CisgIH0KKworICBpbmNvbWluZ19hciA9ICgoZ2RvdWJsZSkgKHdpZHRoICogcGFyX24pKSAvIChoZWlnaHQgKiBwYXJfZCk7CisgIEdTVF9MT0dfT0JKRUNUIChhc3BlY3RfcmF0aW9fY3JvcCwKKyAgICAgICJpbmNvbWluZyBjYXBzIHdpZHRoKCVkKSwgaGVpZ2h0KCVkKSwgcGFyICglZC8lZCkgOiBhciA9ICVmIiwgd2lkdGgsCisgICAgICBoZWlnaHQsIHBhcl9uLCBwYXJfZCwgaW5jb21pbmdfYXIpOworCisgIHJlcXVlc3RlZF9hciA9CisgICAgICAoZ2RvdWJsZSkgYXNwZWN0X3JhdGlvX2Nyb3AtPmFyX251bSAvIGFzcGVjdF9yYXRpb19jcm9wLT5hcl9kZW5vbTsKKworICAvKiBjaGVjayBpZiB0aGUgb3JpZ2luYWwgYXNwZWN0LXJhdGlvIGlzIHRoZSBhc3BlY3QtcmF0aW8gdGhhdCB3ZSB3YW50ICovCisgIGlmIChyZXF1ZXN0ZWRfYXIgPT0gaW5jb21pbmdfYXIpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhc3BlY3RfcmF0aW9fY3JvcCwKKyAgICAgICAgIklucHV0IHZpZGVvIGFscmVhZHkgaGFzIHRoZSBjb3JyZWN0IGFzcGVjdCByYXRpbyAoJS4zZiA9PSAlLjNmKSIsCisgICAgICAgIGluY29taW5nX2FyLCByZXF1ZXN0ZWRfYXIpOworICAgIGdvdG8gYmVhY2g7CisgIH0gZWxzZSBpZiAocmVxdWVzdGVkX2FyID4gaW5jb21pbmdfYXIpIHsKKyAgICAvKiBmaXggYXNwZWN0IHJhdGlvIHdpdGggY3JvcHBpbmcgb24gdG9wIGFuZCBib3R0b20gKi8KKyAgICBjcm9wdmFsdWUgPQorICAgICAgICAoKCgoZG91YmxlKSBhc3BlY3RfcmF0aW9fY3JvcC0+YXJfZGVub20gLworICAgICAgICAgICAgICAgIChkb3VibGUpIChhc3BlY3RfcmF0aW9fY3JvcC0+YXJfbnVtKSkgKiAoKGRvdWJsZSkgcGFyX24gLworICAgICAgICAgICAgICAgIChkb3VibGUpIHBhcl9kKSAqIHdpZHRoKSAtIGhlaWdodCkgLyAyOworICAgIGlmIChjcm9wdmFsdWUgPCAwKSB7CisgICAgICBjcm9wdmFsdWUgKj0gLTE7CisgICAgfQorICAgIGlmIChjcm9wdmFsdWUgPj0gKGhlaWdodCAvIDIpKQorICAgICAgZ290byBjcm9wX2ZhaWxlZDsKKyAgICBpZiAoc2V0X3ZpZGVvY3JvcCkgeworICAgICAgZ3N0X2FzcGVjdF9yYXRpb19jcm9wX3NldF9jcm9wcGluZyAoYXNwZWN0X3JhdGlvX2Nyb3AsIGNyb3B2YWx1ZSwgMCwKKyAgICAgICAgICBjcm9wdmFsdWUsIDApOworICAgIH0KKyAgICBpZiAobmV3X3N0cnVjdHVyZSkgeworICAgICAgKm5ld19zdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHN0cnVjdHVyZSk7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoKm5ld19zdHJ1Y3R1cmUsCisgICAgICAgICAgImhlaWdodCIsIEdfVFlQRV9JTlQsIChpbnQpIChoZWlnaHQgLSAoY3JvcHZhbHVlICogMikpLCBOVUxMKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogZml4IGFzcGVjdCByYXRpbyB3aXRoIGNyb3BwaW5nIG9uIGxlZnQgYW5kIHJpZ2h0ICovCisgICAgY3JvcHZhbHVlID0KKyAgICAgICAgKCgoKGRvdWJsZSkgYXNwZWN0X3JhdGlvX2Nyb3AtPmFyX251bSAvCisgICAgICAgICAgICAgICAgKGRvdWJsZSkgKGFzcGVjdF9yYXRpb19jcm9wLT5hcl9kZW5vbSkpICogKChkb3VibGUpIHBhcl9kIC8KKyAgICAgICAgICAgICAgICAoZG91YmxlKSBwYXJfbikgKiBoZWlnaHQpIC0gd2lkdGgpIC8gMjsKKyAgICBpZiAoY3JvcHZhbHVlIDwgMCkgeworICAgICAgY3JvcHZhbHVlICo9IC0xOworICAgIH0KKyAgICBpZiAoY3JvcHZhbHVlID49ICh3aWR0aCAvIDIpKQorICAgICAgZ290byBjcm9wX2ZhaWxlZDsKKyAgICBpZiAoc2V0X3ZpZGVvY3JvcCkgeworICAgICAgZ3N0X2FzcGVjdF9yYXRpb19jcm9wX3NldF9jcm9wcGluZyAoYXNwZWN0X3JhdGlvX2Nyb3AsIDAsIGNyb3B2YWx1ZSwKKyAgICAgICAgICAwLCBjcm9wdmFsdWUpOworICAgIH0KKyAgICBpZiAobmV3X3N0cnVjdHVyZSkgeworICAgICAgKm5ld19zdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHN0cnVjdHVyZSk7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoKm5ld19zdHJ1Y3R1cmUsCisgICAgICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgKGludCkgKHdpZHRoIC0gKGNyb3B2YWx1ZSAqIDIpKSwgTlVMTCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuOworCitjcm9wX2ZhaWxlZDoKKyAgR1NUX1dBUk5JTkdfT0JKRUNUIChhc3BlY3RfcmF0aW9fY3JvcCwKKyAgICAgICJjYW4ndCBjcm9wIHRvIGFzcGVjdCByYXRpbyByZXF1ZXN0ZWQiKTsKKyAgZ290byBiZWFjaDsKK2JlYWNoOgorICBpZiAoc2V0X3ZpZGVvY3JvcCkgeworICAgIGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9zZXRfY3JvcHBpbmcgKGFzcGVjdF9yYXRpb19jcm9wLCAwLCAwLCAwLCAwKTsKKyAgfQorCisgIGlmIChuZXdfc3RydWN0dXJlKSB7CisgICAgKm5ld19zdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHN0cnVjdHVyZSk7CisgIH0KK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X2FzcGVjdF9yYXRpb19jcm9wX3RyYW5zZm9ybV9jYXBzIChHc3RBc3BlY3RSYXRpb0Nyb3AgKiBhc3BlY3RfcmF0aW9fY3JvcCwKKyAgICBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0Q2FwcyAqdHJhbnNmb3JtOworICBnaW50IHNpemUsIGk7CisKKyAgdHJhbnNmb3JtID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIHNpemUgPSBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIEdzdFN0cnVjdHVyZSAqczsKKyAgICBHc3RTdHJ1Y3R1cmUgKnRyYW5zX3M7CisKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSk7CisKKyAgICBnc3RfYXNwZWN0X3JhdGlvX3RyYW5zZm9ybV9zdHJ1Y3R1cmUgKGFzcGVjdF9yYXRpb19jcm9wLCBzLCAmdHJhbnNfcywKKyAgICAgICAgRkFMU0UpOworICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKHRyYW5zZm9ybSwgdHJhbnNfcyk7CisgIH0KKworICByZXR1cm4gdHJhbnNmb3JtOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfYXNwZWN0X3JhdGlvX2Nyb3BfZ2V0X2NhcHMgKEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0UGFkICpwZWVyOworICBHc3RBc3BlY3RSYXRpb0Nyb3AgKmFzcGVjdF9yYXRpb19jcm9wOworICBHc3RDYXBzICpyZXR1cm5fY2FwczsKKworICBhc3BlY3RfcmF0aW9fY3JvcCA9IEdTVF9BU1BFQ1RfUkFUSU9fQ1JPUCAoZ3N0X3BhZF9nZXRfcGFyZW50IChwYWQpKTsKKworICBnX211dGV4X2xvY2sgKCZhc3BlY3RfcmF0aW9fY3JvcC0+Y3JvcF9sb2NrKTsKKworICBwZWVyID0gZ3N0X3BhZF9nZXRfcGVlciAoYXNwZWN0X3JhdGlvX2Nyb3AtPnNpbmspOworICBpZiAocGVlciA9PSBOVUxMKSB7CisgICAgcmV0dXJuX2NhcHMgPSBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXRfY2FwcyAoJnNyY190ZW1wbGF0ZSk7CisgIH0gZWxzZSB7CisgICAgR3N0Q2FwcyAqcGVlcl9jYXBzOworCisgICAgcGVlcl9jYXBzID0gZ3N0X3BhZF9xdWVyeV9jYXBzIChwZWVyLCBmaWx0ZXIpOworICAgIHJldHVybl9jYXBzID0KKyAgICAgICAgZ3N0X2FzcGVjdF9yYXRpb19jcm9wX3RyYW5zZm9ybV9jYXBzIChhc3BlY3RfcmF0aW9fY3JvcCwgcGVlcl9jYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocGVlcl9jYXBzKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwZWVyKTsKKyAgfQorCisgIGdfbXV0ZXhfdW5sb2NrICgmYXNwZWN0X3JhdGlvX2Nyb3AtPmNyb3BfbG9jayk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGFzcGVjdF9yYXRpb19jcm9wKTsKKworICBpZiAocmV0dXJuX2NhcHMgJiYgZmlsdGVyKSB7CisgICAgR3N0Q2FwcyAqdG1wID0KKyAgICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgcmV0dXJuX2NhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfcmVwbGFjZSAoJnJldHVybl9jYXBzLCB0bXApOworICAgIGdzdF9jYXBzX3VucmVmICh0bXApOworICB9CisKKyAgcmV0dXJuIHJldHVybl9jYXBzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9hc3BlY3RfcmF0aW9fY3JvcF9zcmNfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqZmlsdGVyLCAqY2FwczsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2NhcHMgKHF1ZXJ5LCAmZmlsdGVyKTsKKyAgICAgIGNhcHMgPSBnc3RfYXNwZWN0X3JhdGlvX2Nyb3BfZ2V0X2NhcHMgKHBhZCwgZmlsdGVyKTsKKyAgICAgIGdzdF9xdWVyeV9zZXRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCBjYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXNwZWN0X3JhdGlvX2Nyb3Bfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEFzcGVjdFJhdGlvQ3JvcCAqYXNwZWN0X3JhdGlvX2Nyb3A7CisgIGdib29sZWFuIHJlY2hlY2sgPSBGQUxTRTsKKworICBhc3BlY3RfcmF0aW9fY3JvcCA9IEdTVF9BU1BFQ1RfUkFUSU9fQ1JPUCAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGFzcGVjdF9yYXRpb19jcm9wKTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0FTUEVDVF9SQVRJT19DUk9QOgorICAgICAgaWYgKEdTVF9WQUxVRV9IT0xEU19GUkFDVElPTiAodmFsdWUpKSB7CisgICAgICAgIGFzcGVjdF9yYXRpb19jcm9wLT5hcl9udW0gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAodmFsdWUpOworICAgICAgICBhc3BlY3RfcmF0aW9fY3JvcC0+YXJfZGVub20gPQorICAgICAgICAgICAgZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9kZW5vbWluYXRvciAodmFsdWUpOworICAgICAgICByZWNoZWNrID0gZ3N0X3BhZF9oYXNfY3VycmVudF9jYXBzIChhc3BlY3RfcmF0aW9fY3JvcC0+c2luayk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChhc3BlY3RfcmF0aW9fY3JvcCk7CisKKyAgaWYgKHJlY2hlY2spIHsKKyAgICBHc3RDYXBzICpjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChhc3BlY3RfcmF0aW9fY3JvcC0+c2luayk7CisgICAgaWYgKGNhcHMgIT0gTlVMTCkgeworICAgICAgZ3N0X2FzcGVjdF9yYXRpb19jcm9wX3NldF9jYXBzIChhc3BlY3RfcmF0aW9fY3JvcCwgY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfYXNwZWN0X3JhdGlvX2Nyb3BfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEFzcGVjdFJhdGlvQ3JvcCAqYXNwZWN0X3JhdGlvX2Nyb3A7CisKKyAgYXNwZWN0X3JhdGlvX2Nyb3AgPSBHU1RfQVNQRUNUX1JBVElPX0NST1AgKG9iamVjdCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChhc3BlY3RfcmF0aW9fY3JvcCk7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9BU1BFQ1RfUkFUSU9fQ1JPUDoKKyAgICAgIGdzdF92YWx1ZV9zZXRfZnJhY3Rpb24gKHZhbHVlLCBhc3BlY3RfcmF0aW9fY3JvcC0+YXJfbnVtLAorICAgICAgICAgIGFzcGVjdF9yYXRpb19jcm9wLT5hcl9kZW5vbSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChhc3BlY3RfcmF0aW9fY3JvcCk7Cit9CmRpZmYgLS1naXQgYS9nc3QvdmlkZW9jcm9wL2dzdGFzcGVjdHJhdGlvY3JvcC5oIGIvZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FlYjVjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvY3JvcC9nc3Rhc3BlY3RyYXRpb2Nyb3AuaApAQCAtMCwwICsxLDY3IEBACisvKiBHU3RyZWFtZXIgdmlkZW8gZnJhbWUgY3JvcHBpbmcgdG8gYXNwZWN0LXJhdGlvCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX0FTUEVDVF9SQVRJT19DUk9QX0hfXworI2RlZmluZSBfX0dTVF9BU1BFQ1RfUkFUSU9fQ1JPUF9IX18KKworI2luY2x1ZGUgPGdzdC9nc3RiaW4uaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX0FTUEVDVF9SQVRJT19DUk9QIFwKKyAgKGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQVNQRUNUX1JBVElPX0NST1Aob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9BU1BFQ1RfUkFUSU9fQ1JPUCxHc3RBc3BlY3RSYXRpb0Nyb3ApKQorI2RlZmluZSBHU1RfQVNQRUNUX1JBVElPX0NST1BfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfQVNQRUNUX1JBVElPX0NST1AsR3N0QXNwZWN0UmF0aW9Dcm9wQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfQVNQRUNUX1JBVElPX0NST1Aob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9BU1BFQ1RfUkFUSU9fQ1JPUCkpCisjZGVmaW5lIEdTVF9JU19BU1BFQ1RfUkFUSU9fQ1JPUF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9BU1BFQ1RfUkFUSU9fQ1JPUCkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RBc3BlY3RSYXRpb0Nyb3AgR3N0QXNwZWN0UmF0aW9Dcm9wOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEFzcGVjdFJhdGlvQ3JvcENsYXNzIEdzdEFzcGVjdFJhdGlvQ3JvcENsYXNzOworCitzdHJ1Y3QgX0dzdEFzcGVjdFJhdGlvQ3JvcAoreworICBHc3RCaW4gcGFyZW50OworCisgIC8qIG91ciB2aWRlb2Nyb3AgZWxlbWVudCAqLworICBHc3RFbGVtZW50ICp2aWRlb2Nyb3A7CisKKyAgR3N0UGFkICpzaW5rOworCisgIC8qIHRhcmdldCBhc3BlY3QgcmF0aW8gKi8KKyAgZ2ludCBhcl9udW07IC8qIGlmIDwgMSB0aGVuIGRvbid0IGNoYW5nZSBhciAqLworICBnaW50IGFyX2Rlbm9tOworCisgIEdNdXRleCBjcm9wX2xvY2s7Cit9OworCitzdHJ1Y3QgX0dzdEFzcGVjdFJhdGlvQ3JvcENsYXNzCit7CisgIEdzdEJpbkNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9hc3BlY3RfcmF0aW9fY3JvcF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9BU1BFQ1RfUkFUSU9fQ1JPUF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvY3JvcC9nc3R2aWRlb2Nyb3AuYyBiL2dzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlN2Q2NwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmMKQEAgLTAsMCArMSw5MTkgQEAKKy8qIEdTdHJlYW1lciB2aWRlbyBmcmFtZSBjcm9wcGluZworICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtdmlkZW9jcm9wCisgKiBAc2VlX2Fsc286ICNHc3RWaWRlb0JveAorICoKKyAqIFRoaXMgZWxlbWVudCBjcm9wcyB2aWRlbyBmcmFtZXMsIG1lYW5pbmcgaXQgY2FuIHJlbW92ZSBwYXJ0cyBvZiB0aGUKKyAqIHBpY3R1cmUgb24gdGhlIGxlZnQsIHJpZ2h0LCB0b3Agb3IgYm90dG9tIG9mIHRoZSBwaWN0dXJlIGFuZCBvdXRwdXQKKyAqIGEgc21hbGxlciBwaWN0dXJlIHRoYW4gdGhlIGlucHV0IHBpY3R1cmUsIHdpdGggdGhlIHVud2FudGVkIHBhcnRzIGF0IHRoZQorICogYm9yZGVyIHJlbW92ZWQuCisgKgorICogVGhlIHZpZGVvY3JvcCBlbGVtZW50IGlzIHNpbWlsYXIgdG8gdGhlIHZpZGVvYm94IGVsZW1lbnQsIGJ1dCBpdHMgbWFpbgorICogZ29hbCBpcyB0byBzdXBwb3J0IGEgbXVsdGl0dWRlIG9mIGZvcm1hdHMgYXMgZWZmaWNpZW50bHkgYXMgcG9zc2libGUuCisgKiBVbmxpa2UgdmlkZWJveCwgaXQgY2Fubm90IGFkZCBib3JkZXJzIHRvIHRoZSBwaWN0dXJlIGFuZCB1bmxpa2UgdmlkZWJveAorICogaXQgd2lsbCBhbHdheXMgb3V0cHV0IGltYWdlcyBpbiBleGFjdGx5IHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgaW5wdXQgaW1hZ2UuCisgKgorICogSWYgdGhlcmUgaXMgbm90aGluZyB0byBjcm9wLCB0aGUgZWxlbWVudCB3aWxsIG9wZXJhdGUgaW4gcGFzcy10aHJvdWdoIG1vZGUuCisgKgorICogTm90ZSB0aGF0IG5vIHNwZWNpYWwgZWZmb3J0cyBhcmUgbWFkZSB0byBoYW5kbGUgY2hyb21hLXN1YnNhbXBsZWQgZm9ybWF0cworICogaW4gdGhlIGNhc2Ugb2Ygb2RkLXZhbHVlZCBjcm9wcGluZyBhbmQgY29tcGVuc2F0ZSBmb3Igc3ViLXVuaXQgY2hyb21hIHBsYW5lCisgKiBzaGlmdHMgZm9yIHN1Y2ggZm9ybWF0cyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgI0dzdFZpZGVvQ3JvcDpsZWZ0IG9yCisgKiAjR3N0VmlkZW9Dcm9wOnRvcCBwcm9wZXJ0eSBpcyBzZXQgdG8gYW4gb2RkIG51bWJlci4gVGhpcyBkb2Vzbid0IG1hdHRlciBmb3IgCisgKiBtb3N0IHVzZSBjYXNlcywgYnV0IGl0IG1pZ2h0IG1hdHRlciBmb3IgeW91cnMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IHZpZGVvdGVzdHNyYyAhIHZpZGVvY3JvcCB0b3A9NDIgbGVmdD0xIHJpZ2h0PTQgYm90dG9tPTAgISB4aW1hZ2VzaW5rCisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisvKiBUT0RPOgorICogIC0gZm9yIHBhY2tlZCBmb3JtYXRzLCB3ZSBjb3VsZCBhdm9pZCBtZW1jcHkoKSBpbiBjYXNlIGNyb3BfbGVmdAorICogICAgYW5kIGNyb3BfcmlnaHQgYXJlIDAgYW5kIGp1c3QgY3JlYXRlIGEgc3ViLWJ1ZmZlciBvZiB0aGUgaW5wdXQKKyAqICAgIGJ1ZmZlcgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworI2luY2x1ZGUgImdzdHZpZGVvY3JvcC5oIgorI2luY2x1ZGUgImdzdGFzcGVjdHJhdGlvY3JvcC5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHZpZGVvY3JvcF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCB2aWRlb2Nyb3BfZGVidWcKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfTEVGVCwKKyAgUFJPUF9SSUdIVCwKKyAgUFJPUF9UT1AsCisgIFBST1BfQk9UVE9NCit9OworCisvKiB3ZSBzdXBwb3J0IHRoZSBzYW1lIGNhcHMgYXMgYXNwZWN0cmF0aW9jcm9wIChzeW5jIGNoYW5nZXMpICovCisjZGVmaW5lIFZJREVPX0NST1BfQ0FQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHU1RfVklERU9fQ0FQU19NQUtFICgieyBSR0J4LCB4UkdCLCBCR1J4LCB4QkdSLCAiICAgIFwKKyAgICAgICJSR0JBLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0IsIEJHUiwgQVlVViwgWVVZMiwgIiBcCisgICAgICAiWVZZVSwgVVlWWSwgSTQyMCwgWVYxMiwgUkdCMTYsIFJHQjE1LCBHUkFZOCwgIiAgXAorICAgICAgIk5WMTIsIE5WMjEsIEdSQVkxNl9MRSwgR1JBWTE2X0JFIH0iKQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoVklERU9fQ1JPUF9DQVBTKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChWSURFT19DUk9QX0NBUFMpCisgICAgKTsKKworI2RlZmluZSBnc3RfdmlkZW9fY3JvcF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RWaWRlb0Nyb3AsIGdzdF92aWRlb19jcm9wLCBHU1RfVFlQRV9WSURFT19GSUxURVIpOworCitzdGF0aWMgdm9pZCBnc3RfdmlkZW9fY3JvcF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfdmlkZW9fY3JvcF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBHc3RDYXBzICpnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fY2FwcyAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sIEdzdENhcHMgKiBjYXBzLCBHc3RDYXBzICogZmlsdGVyX2NhcHMpOworc3RhdGljIGdib29sZWFuIGdzdF92aWRlb19jcm9wX3NyY19ldmVudCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZpZGVvX2Nyb3Bfc2V0X2luZm8gKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwgR3N0Q2FwcyAqIGluLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXQsIEdzdFZpZGVvSW5mbyAqIG91dF9pbmZvKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9mcmFtZSAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLAorICAgIEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdmlkZW9fY3JvcF9kZWNpZGVfYWxsb2NhdGlvbiAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdFF1ZXJ5ICogcXVlcnkpOworc3RhdGljIGdib29sZWFuIGdzdF92aWRlb19jcm9wX3Byb3Bvc2VfYWxsb2NhdGlvbiAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdFF1ZXJ5ICogZGVjaWRlX3F1ZXJ5LCBHc3RRdWVyeSAqIHF1ZXJ5KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9pcCAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZpZGVvX2Nyb3Bfc3JjX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdEV2ZW50ICpuZXdfZXZlbnQ7CisgIEdzdFN0cnVjdHVyZSAqbmV3X3N0cnVjdHVyZTsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IGdjaGFyICpldmVudF9uYW1lOworICBkb3VibGUgcG9pbnRlcl94OworICBkb3VibGUgcG9pbnRlcl95OworCisgIEdzdFZpZGVvQ3JvcCAqdmNyb3AgPSBHU1RfVklERU9fQ1JPUCAodHJhbnMpOworICBuZXdfZXZlbnQgPSBOVUxMOworCisgIEdTVF9PQkpFQ1RfTE9DSyAodmNyb3ApOworICBpZiAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSA9PSBHU1RfRVZFTlRfTkFWSUdBVElPTiAmJgorICAgICAgKHZjcm9wLT5jcm9wX2xlZnQgIT0gMCB8fCB2Y3JvcC0+Y3JvcF90b3AgIT0gMCkpIHsKKyAgICBzdHJ1Y3R1cmUgPSBnc3RfZXZlbnRfZ2V0X3N0cnVjdHVyZSAoZXZlbnQpOworICAgIGV2ZW50X25hbWUgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHN0cnVjdHVyZSwgImV2ZW50Iik7CisKKyAgICBpZiAoZXZlbnRfbmFtZSAmJgorICAgICAgICAoc3RyY21wIChldmVudF9uYW1lLCAibW91c2UtbW92ZSIpID09IDAgfHwKKyAgICAgICAgICAgIHN0cmNtcCAoZXZlbnRfbmFtZSwgIm1vdXNlLWJ1dHRvbi1wcmVzcyIpID09IDAgfHwKKyAgICAgICAgICAgIHN0cmNtcCAoZXZlbnRfbmFtZSwgIm1vdXNlLWJ1dHRvbi1yZWxlYXNlIikgPT0gMCkpIHsKKworICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2RvdWJsZSAoc3RydWN0dXJlLCAicG9pbnRlcl94IiwgJnBvaW50ZXJfeCkgJiYKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9kb3VibGUgKHN0cnVjdHVyZSwgInBvaW50ZXJfeSIsICZwb2ludGVyX3kpKSB7CisKKyAgICAgICAgbmV3X3N0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfY29weSAoc3RydWN0dXJlKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG5ld19zdHJ1Y3R1cmUsCisgICAgICAgICAgICAicG9pbnRlcl94IiwgR19UWVBFX0RPVUJMRSwgKGRvdWJsZSkgKHBvaW50ZXJfeCArIHZjcm9wLT5jcm9wX2xlZnQpLAorICAgICAgICAgICAgInBvaW50ZXJfeSIsIEdfVFlQRV9ET1VCTEUsIChkb3VibGUpIChwb2ludGVyX3kgKyB2Y3JvcC0+Y3JvcF90b3ApLAorICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgbmV3X2V2ZW50ID0gZ3N0X2V2ZW50X25ld19uYXZpZ2F0aW9uIChuZXdfc3RydWN0dXJlKTsKKyAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHZjcm9wLCAiRmFpbGVkIHRvIHJlYWQgbmF2aWdhdGlvbiBldmVudCIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEdTVF9PQkpFQ1RfVU5MT0NLICh2Y3JvcCk7CisKKyAgcmV0dXJuIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+c3JjX2V2ZW50ICh0cmFucywKKyAgICAgIChuZXdfZXZlbnQgPyBuZXdfZXZlbnQgOiBldmVudCkpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2Nyb3BfY2xhc3NfaW5pdCAoR3N0VmlkZW9Dcm9wQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqYmFzZXRyYW5zZm9ybV9jbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGJhc2V0cmFuc2Zvcm1fY2xhc3MgPSAoR3N0QmFzZVRyYW5zZm9ybUNsYXNzICopIGtsYXNzOworICB2ZmlsdGVyX2NsYXNzID0gKEdzdFZpZGVvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3ZpZGVvX2Nyb3Bfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfdmlkZW9fY3JvcF9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9MRUZULAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImxlZnQiLCAiTGVmdCIsCisgICAgICAgICAgIlBpeGVscyB0byBjcm9wIGF0IGxlZnQgKC0xIHRvIGF1dG8tY3JvcCkiLCAtMSwgR19NQVhJTlQsIDAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwKKyAgICAgICAgICBHU1RfUEFSQU1fTVVUQUJMRV9QTEFZSU5HKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUklHSFQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgicmlnaHQiLCAiUmlnaHQiLAorICAgICAgICAgICJQaXhlbHMgdG8gY3JvcCBhdCByaWdodCAoLTEgdG8gYXV0by1jcm9wKSIsIC0xLCBHX01BWElOVCwgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfAorICAgICAgICAgIEdTVF9QQVJBTV9NVVRBQkxFX1BMQVlJTkcpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UT1AsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgidG9wIiwgIlRvcCIsICJQaXhlbHMgdG8gY3JvcCBhdCB0b3AgKC0xIHRvIGF1dG8tY3JvcCkiLAorICAgICAgICAgIC0xLCBHX01BWElOVCwgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfAorICAgICAgICAgIEdTVF9QQVJBTV9NVVRBQkxFX1BMQVlJTkcpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9CT1RUT00sCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiYm90dG9tIiwgIkJvdHRvbSIsCisgICAgICAgICAgIlBpeGVscyB0byBjcm9wIGF0IGJvdHRvbSAoLTEgdG8gYXV0by1jcm9wKSIsIC0xLCBHX01BWElOVCwgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfAorICAgICAgICAgIEdTVF9QQVJBTV9NVVRBQkxFX1BMQVlJTkcpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJDcm9wIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJDcm9wcyB2aWRlbyBpbnRvIGEgdXNlci1kZWZpbmVkIHJlZ2lvbiIsCisgICAgICAiVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4iKTsKKworICBiYXNldHJhbnNmb3JtX2NsYXNzLT50cmFuc2Zvcm1faXBfb25fcGFzc3Rocm91Z2ggPSBGQUxTRTsKKyAgYmFzZXRyYW5zZm9ybV9jbGFzcy0+dHJhbnNmb3JtX2NhcHMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9jYXBzKTsKKyAgYmFzZXRyYW5zZm9ybV9jbGFzcy0+c3JjX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19jcm9wX3NyY19ldmVudCk7CisgIGJhc2V0cmFuc2Zvcm1fY2xhc3MtPmRlY2lkZV9hbGxvY2F0aW9uID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdmlkZW9fY3JvcF9kZWNpZGVfYWxsb2NhdGlvbik7CisgIGJhc2V0cmFuc2Zvcm1fY2xhc3MtPnByb3Bvc2VfYWxsb2NhdGlvbiA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3ZpZGVvX2Nyb3BfcHJvcG9zZV9hbGxvY2F0aW9uKTsKKyAgYmFzZXRyYW5zZm9ybV9jbGFzcy0+dHJhbnNmb3JtX2lwID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1faXApOworCisgIHZmaWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19jcm9wX3NldF9pbmZvKTsKKyAgdmZpbHRlcl9jbGFzcy0+dHJhbnNmb3JtX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fZnJhbWUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2Nyb3BfaW5pdCAoR3N0VmlkZW9Dcm9wICogdmNyb3ApCit7CisgIHZjcm9wLT5jcm9wX3JpZ2h0ID0gMDsKKyAgdmNyb3AtPmNyb3BfbGVmdCA9IDA7CisgIHZjcm9wLT5jcm9wX3RvcCA9IDA7CisgIHZjcm9wLT5jcm9wX2JvdHRvbSA9IDA7Cit9CisKKyNkZWZpbmUgUk9VTkRfRE9XTl8yKG4pICAoKG4pJih+MSkpCisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fcGFja2VkX2NvbXBsZXggKEdzdFZpZGVvQ3JvcCAqIHZjcm9wLAorICAgIEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSwgZ2ludCB4LCBnaW50IHkpCit7CisgIGd1aW50OCAqaW5fZGF0YSwgKm91dF9kYXRhOworICBndWludCBpLCBkeDsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IGluX3N0cmlkZTsKKyAgZ2ludCBvdXRfc3RyaWRlOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChvdXRfZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChvdXRfZnJhbWUpOworCisgIGluX2RhdGEgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBvdXRfZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIGluX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGluX2ZyYW1lLCAwKTsKKyAgb3V0X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dF9mcmFtZSwgMCk7CisKKyAgaW5fZGF0YSArPSB2Y3JvcC0+Y3JvcF90b3AgKiBpbl9zdHJpZGU7CisKKyAgLyogcm91bmRpbmcgZG93biBoZXJlIHNvIHdlIGVuZCB1cCBhdCB0aGUgc3RhcnQgb2YgYSBtYWNyby1waXhlbCBhbmQgbm90CisgICAqIGluIHRoZSBtaWRkbGUgb2Ygb25lICovCisgIGluX2RhdGEgKz0gUk9VTkRfRE9XTl8yICh2Y3JvcC0+Y3JvcF9sZWZ0KSAqCisgICAgICBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChpbl9mcmFtZSwgMCk7CisKKyAgZHggPSB3aWR0aCAqIEdTVF9WSURFT19GUkFNRV9DT01QX1BTVFJJREUgKG91dF9mcmFtZSwgMCk7CisKKyAgLyogVVlWWSA9IDQ6MjoyIC0gW1UwIFkwIFYwIFkxXSBbVTIgWTIgVjIgWTNdIFtVNCBZNCBWNCBZNV0KKyAgICogWVVZViA9IDQ6MjoyIC0gW1kwIFUwIFkxIFYwXSBbWTIgVTIgWTMgVjJdIFtZNCBVNCBZNSBWNF0gPSBZVVkyICovCisgIGlmICgodmNyb3AtPmNyb3BfbGVmdCAlIDIpICE9IDApIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKKyAgICAgIGdpbnQgajsKKworICAgICAgbWVtY3B5IChvdXRfZGF0YSwgaW5fZGF0YSwgZHgpOworCisgICAgICAvKiBtb3ZlIGp1c3QgdGhlIFkgc2FtcGxlcyBvbmUgcGl4ZWwgdG8gdGhlIGxlZnQsIGRvbid0IHdvcnJ5IGFib3V0CisgICAgICAgKiBjaHJvbWEgc2hpZnQgKi8KKyAgICAgIGZvciAoaiA9IHZjcm9wLT5tYWNyb195X29mZjsgaiA8IG91dF9zdHJpZGUgLSAyOyBqICs9IDIpCisgICAgICAgIG91dF9kYXRhW2pdID0gaW5fZGF0YVtqICsgMl07CisKKyAgICAgIGluX2RhdGEgKz0gaW5fc3RyaWRlOworICAgICAgb3V0X2RhdGEgKz0gb3V0X3N0cmlkZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CisgICAgICBtZW1jcHkgKG91dF9kYXRhLCBpbl9kYXRhLCBkeCk7CisgICAgICBpbl9kYXRhICs9IGluX3N0cmlkZTsKKyAgICAgIG91dF9kYXRhICs9IG91dF9zdHJpZGU7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fcGFja2VkX3NpbXBsZSAoR3N0VmlkZW9Dcm9wICogdmNyb3AsCisgICAgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLCBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lLCBnaW50IHgsIGdpbnQgeSkKK3sKKyAgZ3VpbnQ4ICppbl9kYXRhLCAqb3V0X2RhdGE7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ3VpbnQgaSwgZHg7CisgIGdpbnQgaW5fc3RyaWRlLCBvdXRfc3RyaWRlOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChvdXRfZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChvdXRfZnJhbWUpOworCisgIGluX2RhdGEgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApOworICBvdXRfZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApOworCisgIGluX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGluX2ZyYW1lLCAwKTsKKyAgb3V0X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dF9mcmFtZSwgMCk7CisKKyAgaW5fZGF0YSArPSAodmNyb3AtPmNyb3BfdG9wICsgeSkgKiBpbl9zdHJpZGU7CisgIGluX2RhdGEgKz0KKyAgICAgICh2Y3JvcC0+Y3JvcF9sZWZ0ICsgeCkgKiBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChpbl9mcmFtZSwgMCk7CisKKyAgZHggPSB3aWR0aCAqIEdTVF9WSURFT19GUkFNRV9DT01QX1BTVFJJREUgKG91dF9mcmFtZSwgMCk7CisKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CisgICAgbWVtY3B5IChvdXRfZGF0YSwgaW5fZGF0YSwgZHgpOworICAgIGluX2RhdGEgKz0gaW5fc3RyaWRlOworICAgIG91dF9kYXRhICs9IG91dF9zdHJpZGU7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9wbGFuYXIgKEdzdFZpZGVvQ3JvcCAqIHZjcm9wLAorICAgIEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSwgZ2ludCB4LCBnaW50IHkpCit7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCBjcm9wX3RvcCwgY3JvcF9sZWZ0OworICBndWludDggKnlfb3V0LCAqdV9vdXQsICp2X291dDsKKyAgZ3VpbnQ4ICp5X2luLCAqdV9pbiwgKnZfaW47CisgIGd1aW50IGksIGR4OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChvdXRfZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChvdXRfZnJhbWUpOworICBjcm9wX2xlZnQgPSB2Y3JvcC0+Y3JvcF9sZWZ0ICsgeDsKKyAgY3JvcF90b3AgPSB2Y3JvcC0+Y3JvcF90b3AgKyB5OworCisgIC8qIFkgcGxhbmUgKi8KKyAgeV9pbiA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIHlfb3V0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgeV9pbiArPSAoY3JvcF90b3AgKiBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMCkpICsgY3JvcF9sZWZ0OworICBkeCA9IHdpZHRoOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgeworICAgIG1lbWNweSAoeV9vdXQsIHlfaW4sIGR4KTsKKyAgICB5X2luICs9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGluX2ZyYW1lLCAwKTsKKyAgICB5X291dCArPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRfZnJhbWUsIDApOworICB9CisKKyAgLyogVSArIFYgcGxhbmVzICovCisgIHVfaW4gPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDEpOworICB1X291dCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDEpOworCisgIHVfaW4gKz0gKGNyb3BfdG9wIC8gMikgKiBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMSk7CisgIHVfaW4gKz0gY3JvcF9sZWZ0IC8gMjsKKworICB2X2luID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAyKTsKKyAgdl9vdXQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAyKTsKKworICB2X2luICs9IChjcm9wX3RvcCAvIDIpICogR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoaW5fZnJhbWUsIDIpOworICB2X2luICs9IGNyb3BfbGVmdCAvIDI7CisKKyAgZHggPSBHU1RfUk9VTkRfVVBfMiAod2lkdGgpIC8gMjsKKworICBmb3IgKGkgPSAwOyBpIDwgR1NUX1JPVU5EX1VQXzIgKGhlaWdodCkgLyAyOyArK2kpIHsKKyAgICBtZW1jcHkgKHVfb3V0LCB1X2luLCBkeCk7CisgICAgbWVtY3B5ICh2X291dCwgdl9pbiwgZHgpOworICAgIHVfaW4gKz0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoaW5fZnJhbWUsIDEpOworICAgIHVfb3V0ICs9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dF9mcmFtZSwgMSk7CisgICAgdl9pbiArPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMik7CisgICAgdl9vdXQgKz0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAob3V0X2ZyYW1lLCAyKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX3NlbWlfcGxhbmFyIChHc3RWaWRlb0Nyb3AgKiB2Y3JvcCwKKyAgICBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUsIGdpbnQgeCwgZ2ludCB5KQoreworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdpbnQgY3JvcF90b3AsIGNyb3BfbGVmdDsKKyAgZ3VpbnQ4ICp5X291dCwgKnV2X291dDsKKyAgZ3VpbnQ4ICp5X2luLCAqdXZfaW47CisgIGd1aW50IGksIGR4OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChvdXRfZnJhbWUpOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChvdXRfZnJhbWUpOworICBjcm9wX2xlZnQgPSB2Y3JvcC0+Y3JvcF9sZWZ0ICsgeDsKKyAgY3JvcF90b3AgPSB2Y3JvcC0+Y3JvcF90b3AgKyB5OworCisgIC8qIFkgcGxhbmUgKi8KKyAgeV9pbiA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMCk7CisgIHlfb3V0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKG91dF9mcmFtZSwgMCk7CisKKyAgLyogVVYgcGxhbmUgKi8KKyAgdXZfaW4gPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDEpOworICB1dl9vdXQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAxKTsKKworICB5X2luICs9IGNyb3BfdG9wICogR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoaW5fZnJhbWUsIDApICsgY3JvcF9sZWZ0OworICBkeCA9IHdpZHRoOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgeworICAgIG1lbWNweSAoeV9vdXQsIHlfaW4sIGR4KTsKKyAgICB5X2luICs9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGluX2ZyYW1lLCAwKTsKKyAgICB5X291dCArPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRfZnJhbWUsIDApOworICB9CisKKyAgdXZfaW4gKz0gKGNyb3BfdG9wIC8gMikgKiBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMSk7CisgIHV2X2luICs9IEdTVF9ST1VORF9ET1dOXzIgKGNyb3BfbGVmdCk7CisgIGR4ID0gR1NUX1JPVU5EX1VQXzIgKHdpZHRoKTsKKworICBmb3IgKGkgPSAwOyBpIDwgR1NUX1JPVU5EX1VQXzIgKGhlaWdodCkgLyAyOyBpKyspIHsKKyAgICBtZW1jcHkgKHV2X291dCwgdXZfaW4sIGR4KTsKKyAgICB1dl9pbiArPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMSk7CisgICAgdXZfb3V0ICs9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dF9mcmFtZSwgMSk7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9mcmFtZSAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLAorICAgIEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSkKK3sKKyAgR3N0VmlkZW9Dcm9wICp2Y3JvcCA9IEdTVF9WSURFT19DUk9QICh2ZmlsdGVyKTsKKyAgR3N0VmlkZW9Dcm9wTWV0YSAqbWV0YSA9IGdzdF9idWZmZXJfZ2V0X3ZpZGVvX2Nyb3BfbWV0YSAoaW5fZnJhbWUtPmJ1ZmZlcik7CisgIGdpbnQgeCA9IDAsIHkgPSAwOworCisgIGlmIChHX1VOTElLRUxZICh2Y3JvcC0+bmVlZF91cGRhdGUpKSB7CisgICAgaWYgKCFnc3RfdmlkZW9fY3JvcF9zZXRfaW5mbyAodmZpbHRlciwgTlVMTCwgJnZjcm9wLT5pbl9pbmZvLCBOVUxMLAorICAgICAgICAgICAgJnZjcm9wLT5vdXRfaW5mbykpIHsKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgICB9CisgIH0KKworICBpZiAobWV0YSkgeworICAgIHggPSBtZXRhLT54OworICAgIHkgPSBtZXRhLT55OworICB9CisKKyAgc3dpdGNoICh2Y3JvcC0+cGFja2luZykgeworICAgIGNhc2UgVklERU9fQ1JPUF9QSVhFTF9GT1JNQVRfUEFDS0VEX1NJTVBMRToKKyAgICAgIGdzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9wYWNrZWRfc2ltcGxlICh2Y3JvcCwgaW5fZnJhbWUsIG91dF9mcmFtZSwgeCwgeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFZJREVPX0NST1BfUElYRUxfRk9STUFUX1BBQ0tFRF9DT01QTEVYOgorICAgICAgZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX3BhY2tlZF9jb21wbGV4ICh2Y3JvcCwgaW5fZnJhbWUsIG91dF9mcmFtZSwgeCwKKyAgICAgICAgICB5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVklERU9fQ1JPUF9QSVhFTF9GT1JNQVRfUExBTkFSOgorICAgICAgZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX3BsYW5hciAodmNyb3AsIGluX2ZyYW1lLCBvdXRfZnJhbWUsIHgsIHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWSURFT19DUk9QX1BJWEVMX0ZPUk1BVF9TRU1JX1BMQU5BUjoKKyAgICAgIGdzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9zZW1pX3BsYW5hciAodmNyb3AsIGluX2ZyYW1lLCBvdXRfZnJhbWUsIHgsIHkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICB9CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92aWRlb19jcm9wX2RlY2lkZV9hbGxvY2F0aW9uIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFZpZGVvQ3JvcCAqY3JvcCA9IEdTVF9WSURFT19DUk9QICh0cmFucyk7CisgIGdib29sZWFuIHVzZV9jcm9wX21ldGE7CisKKyAgdXNlX2Nyb3BfbWV0YSA9IChnc3RfcXVlcnlfZmluZF9hbGxvY2F0aW9uX21ldGEgKHF1ZXJ5LAorICAgICAgICAgIEdTVF9WSURFT19DUk9QX01FVEFfQVBJX1RZUEUsIE5VTEwpICYmCisgICAgICBnc3RfcXVlcnlfZmluZF9hbGxvY2F0aW9uX21ldGEgKHF1ZXJ5LCBHU1RfVklERU9fTUVUQV9BUElfVFlQRSwgTlVMTCkpOworCisgIGlmICgoY3JvcC0+Y3JvcF9sZWZ0IHwgY3JvcC0+Y3JvcF9yaWdodCB8IGNyb3AtPmNyb3BfdG9wIHwgY3JvcC0+CisgICAgICAgICAgY3JvcF9ib3R0b20pID09IDApIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGNyb3AsICJ3ZSBhcmUgdXNpbmcgcGFzc3Rocm91Z2giKTsKKyAgICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X3Bhc3N0aHJvdWdoIChHU1RfQkFTRV9UUkFOU0ZPUk0gKGNyb3ApLCBUUlVFKTsKKyAgICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X2luX3BsYWNlIChHU1RfQkFTRV9UUkFOU0ZPUk0gKGNyb3ApLCBGQUxTRSk7CisgIH0gZWxzZSBpZiAodXNlX2Nyb3BfbWV0YSkgeworICAgIEdTVF9JTkZPX09CSkVDVCAoY3JvcCwgIndlIGFyZSBkb2luZyBpbi1wbGFjZSB0cmFuc2Zvcm0gdXNpbmcgY3JvcCBtZXRhIik7CisgICAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAoR1NUX0JBU0VfVFJBTlNGT1JNIChjcm9wKSwgRkFMU0UpOworICAgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfaW5fcGxhY2UgKEdTVF9CQVNFX1RSQU5TRk9STSAoY3JvcCksIFRSVUUpOworICB9IGVsc2UgeworICAgIEdTVF9JTkZPX09CSkVDVCAoY3JvcCwgIndlIGFyZSBub3QgdXNpbmcgcGFzc3Rocm91Z2giKTsKKyAgICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X3Bhc3N0aHJvdWdoIChHU1RfQkFTRV9UUkFOU0ZPUk0gKGNyb3ApLCBGQUxTRSk7CisgICAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9pbl9wbGFjZSAoR1NUX0JBU0VfVFJBTlNGT1JNIChjcm9wKSwgRkFMU0UpOworICB9CisKKyAgcmV0dXJuIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGVjaWRlX2FsbG9jYXRpb24gKHRyYW5zLAorICAgICAgcXVlcnkpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92aWRlb19jcm9wX3Byb3Bvc2VfYWxsb2NhdGlvbiAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLAorICAgIEdzdFF1ZXJ5ICogZGVjaWRlX3F1ZXJ5LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICAvKiBpZiB3ZSBhcmUgbm90IHBhc3N0aHJvdWdoLCB3ZSBjYW4gaGFuZGxlIHZpZGVvIG1ldGEgYW5kIGNyb3AgbWV0YSAqLworICBpZiAoZGVjaWRlX3F1ZXJ5KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodHJhbnMsICJBZHZlcnRpc2luZyB2aWRlbyBtZXRhIGFuZCBjcm9wIG1ldGEgc3VwcG9ydCIpOworICAgIGdzdF9xdWVyeV9hZGRfYWxsb2NhdGlvbl9tZXRhIChxdWVyeSwgR1NUX1ZJREVPX01FVEFfQVBJX1RZUEUsIE5VTEwpOworICAgIGdzdF9xdWVyeV9hZGRfYWxsb2NhdGlvbl9tZXRhIChxdWVyeSwgR1NUX1ZJREVPX0NST1BfTUVUQV9BUElfVFlQRSwgTlVMTCk7CisgIH0KKworICByZXR1cm4gR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5wcm9wb3NlX2FsbG9jYXRpb24gKHRyYW5zLAorICAgICAgZGVjaWRlX3F1ZXJ5LCBxdWVyeSk7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1faXAgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RWaWRlb0Nyb3AgKnZjcm9wID0gR1NUX1ZJREVPX0NST1AgKHRyYW5zKTsKKyAgR3N0VmlkZW9NZXRhICp2aWRlb19tZXRhOworICBHc3RWaWRlb0Nyb3BNZXRhICpjcm9wX21ldGE7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHRyYW5zLCAiVHJhbnNmb3JtaW5nIGluLXBsYWNlIik7CisKKyAgLyogVGhlIHZpZGVvIG1ldGEgaXMgcmVxdWlyZWQgc2luY2Ugd2UgYXJlIGdvaW5nIHRvIG1ha2UgdGhlIGNhcHMKKyAgICogd2lkdGgvaGVpZ2h0IHNtYWxsZXIsIHdoaWNoIHdvdWxkIG5vdCByZXN1bHQgaW4gYSB1c2FibGUgR3N0VmlkZW9JbmZvIGZvcgorICAgKiBtYXBwaW5nIHRoZSBidWZmZXIuICovCisgIHZpZGVvX21ldGEgPSBnc3RfYnVmZmVyX2dldF92aWRlb19tZXRhIChidWYpOworICBpZiAoIXZpZGVvX21ldGEpIHsKKyAgICB2aWRlb19tZXRhID0gZ3N0X2J1ZmZlcl9hZGRfdmlkZW9fbWV0YSAoYnVmLCBHU1RfVklERU9fRlJBTUVfRkxBR19OT05FLAorICAgICAgICBHU1RfVklERU9fSU5GT19GT1JNQVQgKCZ2Y3JvcC0+aW5faW5mbyksIHZjcm9wLT5pbl9pbmZvLndpZHRoLAorICAgICAgICB2Y3JvcC0+aW5faW5mby5oZWlnaHQpOworICB9CisKKyAgY3JvcF9tZXRhID0gZ3N0X2J1ZmZlcl9nZXRfdmlkZW9fY3JvcF9tZXRhIChidWYpOworICBpZiAoIWNyb3BfbWV0YSkgeworICAgIGNyb3BfbWV0YSA9IGdzdF9idWZmZXJfYWRkX3ZpZGVvX2Nyb3BfbWV0YSAoYnVmKTsKKyAgICBjcm9wX21ldGEtPndpZHRoID0gdmNyb3AtPmluX2luZm8ud2lkdGg7CisgICAgY3JvcF9tZXRhLT5oZWlnaHQgPSB2Y3JvcC0+aW5faW5mby5oZWlnaHQ7CisgIH0KKworICBjcm9wX21ldGEtPnggKz0gdmNyb3AtPmNyb3BfbGVmdDsKKyAgY3JvcF9tZXRhLT55ICs9IHZjcm9wLT5jcm9wX3RvcDsKKyAgY3JvcF9tZXRhLT53aWR0aCA9IEdTVF9WSURFT19JTkZPX1dJRFRIICgmdmNyb3AtPm91dF9pbmZvKTsKKyAgY3JvcF9tZXRhLT5oZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZ2Y3JvcC0+b3V0X2luZm8pOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIGdpbnQKK2dzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9kaW1lbnNpb24gKGdpbnQgdmFsLCBnaW50IGRlbHRhKQoreworICBnaW50NjQgbmV3X3ZhbCA9IChnaW50NjQpIHZhbCArIChnaW50NjQpIGRlbHRhOworCisgIG5ld192YWwgPSBDTEFNUCAobmV3X3ZhbCwgMSwgR19NQVhJTlQpOworCisgIHJldHVybiAoZ2ludCkgbmV3X3ZhbDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fZGltZW5zaW9uX3ZhbHVlIChjb25zdCBHVmFsdWUgKiBzcmNfdmFsLAorICAgIGdpbnQgZGVsdGEsIEdWYWx1ZSAqIGRlc3RfdmFsLCBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBnYm9vbGVhbiBkeW5hbWljKQoreworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIGlmIChHX1ZBTFVFX0hPTERTX0lOVCAoc3JjX3ZhbCkpIHsKKyAgICBnaW50IGl2YWwgPSBnX3ZhbHVlX2dldF9pbnQgKHNyY192YWwpOworICAgIGl2YWwgPSBnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fZGltZW5zaW9uIChpdmFsLCBkZWx0YSk7CisKKyAgICBpZiAoZHluYW1pYykgeworICAgICAgaWYgKGRpcmVjdGlvbiA9PSBHU1RfUEFEX1NSQykgeworICAgICAgICBpZiAoaXZhbCA9PSBHX01BWElOVCkgeworICAgICAgICAgIGdfdmFsdWVfaW5pdCAoZGVzdF92YWwsIEdfVFlQRV9JTlQpOworICAgICAgICAgIGdfdmFsdWVfc2V0X2ludCAoZGVzdF92YWwsIGl2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdfdmFsdWVfaW5pdCAoZGVzdF92YWwsIEdTVF9UWVBFX0lOVF9SQU5HRSk7CisgICAgICAgICAgZ3N0X3ZhbHVlX3NldF9pbnRfcmFuZ2UgKGRlc3RfdmFsLCBpdmFsLCBHX01BWElOVCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpdmFsID09IDEpIHsKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKGRlc3RfdmFsLCBHX1RZUEVfSU5UKTsKKyAgICAgICAgICBnX3ZhbHVlX3NldF9pbnQgKGRlc3RfdmFsLCBpdmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnX3ZhbHVlX2luaXQgKGRlc3RfdmFsLCBHU1RfVFlQRV9JTlRfUkFOR0UpOworICAgICAgICAgIGdzdF92YWx1ZV9zZXRfaW50X3JhbmdlIChkZXN0X3ZhbCwgMSwgaXZhbCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZ192YWx1ZV9pbml0IChkZXN0X3ZhbCwgR19UWVBFX0lOVCk7CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKGRlc3RfdmFsLCBpdmFsKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoR1NUX1ZBTFVFX0hPTERTX0lOVF9SQU5HRSAoc3JjX3ZhbCkpIHsKKyAgICBnaW50IG1pbiA9IGdzdF92YWx1ZV9nZXRfaW50X3JhbmdlX21pbiAoc3JjX3ZhbCk7CisgICAgZ2ludCBtYXggPSBnc3RfdmFsdWVfZ2V0X2ludF9yYW5nZV9tYXggKHNyY192YWwpOworCisgICAgbWluID0gZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX2RpbWVuc2lvbiAobWluLCBkZWx0YSk7CisgICAgbWF4ID0gZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX2RpbWVuc2lvbiAobWF4LCBkZWx0YSk7CisKKyAgICBpZiAoZHluYW1pYykgeworICAgICAgaWYgKGRpcmVjdGlvbiA9PSBHU1RfUEFEX1NSQykKKyAgICAgICAgbWF4ID0gR19NQVhJTlQ7CisgICAgICBlbHNlCisgICAgICAgIG1pbiA9IDE7CisgICAgfQorCisgICAgaWYgKG1pbiA9PSBtYXgpIHsKKyAgICAgIGdfdmFsdWVfaW5pdCAoZGVzdF92YWwsIEdfVFlQRV9JTlQpOworICAgICAgZ192YWx1ZV9zZXRfaW50IChkZXN0X3ZhbCwgbWluKTsKKyAgICB9IGVsc2UgeworICAgICAgZ192YWx1ZV9pbml0IChkZXN0X3ZhbCwgR1NUX1RZUEVfSU5UX1JBTkdFKTsKKyAgICAgIGdzdF92YWx1ZV9zZXRfaW50X3JhbmdlIChkZXN0X3ZhbCwgbWluLCBtYXgpOworICAgIH0KKyAgfSBlbHNlIGlmIChHU1RfVkFMVUVfSE9MRFNfTElTVCAoc3JjX3ZhbCkpIHsKKyAgICBnaW50IGk7CisKKyAgICBnX3ZhbHVlX2luaXQgKGRlc3RfdmFsLCBHU1RfVFlQRV9MSVNUKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBnc3RfdmFsdWVfbGlzdF9nZXRfc2l6ZSAoc3JjX3ZhbCk7ICsraSkgeworICAgICAgY29uc3QgR1ZhbHVlICpsaXN0X3ZhbDsKKyAgICAgIEdWYWx1ZSBuZXd2YWwgPSB7IDAsIH07CisKKyAgICAgIGxpc3RfdmFsID0gZ3N0X3ZhbHVlX2xpc3RfZ2V0X3ZhbHVlIChzcmNfdmFsLCBpKTsKKyAgICAgIGlmIChnc3RfdmlkZW9fY3JvcF90cmFuc2Zvcm1fZGltZW5zaW9uX3ZhbHVlIChsaXN0X3ZhbCwgZGVsdGEsICZuZXd2YWwsCisgICAgICAgICAgICAgIGRpcmVjdGlvbiwgZHluYW1pYykpCisgICAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoZGVzdF92YWwsICZuZXd2YWwpOworICAgICAgZ192YWx1ZV91bnNldCAoJm5ld3ZhbCk7CisgICAgfQorCisgICAgaWYgKGdzdF92YWx1ZV9saXN0X2dldF9zaXplIChkZXN0X3ZhbCkgPT0gMCkgeworICAgICAgZ192YWx1ZV91bnNldCAoZGVzdF92YWwpOworICAgICAgcmV0ID0gRkFMU0U7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldCA9IEZBTFNFOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RDYXBzICogY2FwcywgR3N0Q2FwcyAqIGZpbHRlcl9jYXBzKQoreworICBHc3RWaWRlb0Nyb3AgKnZjcm9wOworICBHc3RDYXBzICpvdGhlcl9jYXBzOworICBnaW50IGR5LCBkeCwgaSwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wOworICBnYm9vbGVhbiB3X2R5bmFtaWMsIGhfZHluYW1pYzsKKworICB2Y3JvcCA9IEdTVF9WSURFT19DUk9QICh0cmFucyk7CisKKyAgR1NUX09CSkVDVF9MT0NLICh2Y3JvcCk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHZjcm9wLCAibD0lZCxyPSVkLGI9JWQsdD0lZCIsCisgICAgICB2Y3JvcC0+cHJvcF9sZWZ0LCB2Y3JvcC0+cHJvcF9yaWdodCwgdmNyb3AtPnByb3BfYm90dG9tLCB2Y3JvcC0+cHJvcF90b3ApOworCisgIHdfZHluYW1pYyA9ICh2Y3JvcC0+cHJvcF9sZWZ0ID09IC0xIHx8IHZjcm9wLT5wcm9wX3JpZ2h0ID09IC0xKTsKKyAgaF9keW5hbWljID0gKHZjcm9wLT5wcm9wX3RvcCA9PSAtMSB8fCB2Y3JvcC0+cHJvcF9ib3R0b20gPT0gLTEpOworCisgIGxlZnQgPSAodmNyb3AtPnByb3BfbGVmdCA9PSAtMSkgPyAwIDogdmNyb3AtPnByb3BfbGVmdDsKKyAgcmlnaHQgPSAodmNyb3AtPnByb3BfcmlnaHQgPT0gLTEpID8gMCA6IHZjcm9wLT5wcm9wX3JpZ2h0OworICBib3R0b20gPSAodmNyb3AtPnByb3BfYm90dG9tID09IC0xKSA/IDAgOiB2Y3JvcC0+cHJvcF9ib3R0b207CisgIHRvcCA9ICh2Y3JvcC0+cHJvcF90b3AgPT0gLTEpID8gMCA6IHZjcm9wLT5wcm9wX3RvcDsKKworICBHU1RfT0JKRUNUX1VOTE9DSyAodmNyb3ApOworCisgIGlmIChkaXJlY3Rpb24gPT0gR1NUX1BBRF9TUkMpIHsKKyAgICBkeCA9IGxlZnQgKyByaWdodDsKKyAgICBkeSA9IHRvcCArIGJvdHRvbTsKKyAgfSBlbHNlIHsKKyAgICBkeCA9IDAgLSAobGVmdCArIHJpZ2h0KTsKKyAgICBkeSA9IDAgLSAodG9wICsgYm90dG9tKTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUICh2Y3JvcCwgInRyYW5zZm9ybWluZyBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICBvdGhlcl9jYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7ICsraSkgeworICAgIGNvbnN0IEdWYWx1ZSAqdjsKKyAgICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZSwgKm5ld19zdHJ1Y3R1cmU7CisgICAgR1ZhbHVlIHdfdmFsID0geyAwLCB9LCBoX3ZhbCA9IHsKKyAgICAwLH07CisKKyAgICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCBpKTsKKworICAgIHYgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAid2lkdGgiKTsKKyAgICBpZiAoIWdzdF92aWRlb19jcm9wX3RyYW5zZm9ybV9kaW1lbnNpb25fdmFsdWUgKHYsIGR4LCAmd192YWwsIGRpcmVjdGlvbiwKKyAgICAgICAgICAgIHdfZHluYW1pYykpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodmNyb3AsICJjb3VsZCBub3QgdHJhbmZvcm0gd2lkdGggdmFsdWUgd2l0aCBkeD0lZCIKKyAgICAgICAgICAiLCBjYXBzIHN0cnVjdHVyZT0lIiBHU1RfUFRSX0ZPUk1BVCwgZHgsIHN0cnVjdHVyZSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICB2ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgImhlaWdodCIpOworICAgIGlmICghZ3N0X3ZpZGVvX2Nyb3BfdHJhbnNmb3JtX2RpbWVuc2lvbl92YWx1ZSAodiwgZHksICZoX3ZhbCwgZGlyZWN0aW9uLAorICAgICAgICAgICAgaF9keW5hbWljKSkgeworICAgICAgZ192YWx1ZV91bnNldCAoJndfdmFsKTsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodmNyb3AsICJjb3VsZCBub3QgdHJhbmZvcm0gaGVpZ2h0IHZhbHVlIHdpdGggZHk9JWQiCisgICAgICAgICAgIiwgY2FwcyBzdHJ1Y3R1cmU9JSIgR1NUX1BUUl9GT1JNQVQsIGR5LCBzdHJ1Y3R1cmUpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgbmV3X3N0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfY29weSAoc3RydWN0dXJlKTsKKyAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAobmV3X3N0cnVjdHVyZSwgIndpZHRoIiwgJndfdmFsKTsKKyAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAobmV3X3N0cnVjdHVyZSwgImhlaWdodCIsICZoX3ZhbCk7CisgICAgZ192YWx1ZV91bnNldCAoJndfdmFsKTsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmaF92YWwpOworICAgIEdTVF9MT0dfT0JKRUNUICh2Y3JvcCwgInRyYW5zZm9ybWVkIHN0cnVjdHVyZSAlMmQ6ICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAgICIgPT4gJSIgR1NUX1BUUl9GT1JNQVQsIGksIHN0cnVjdHVyZSwgbmV3X3N0cnVjdHVyZSk7CisgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAob3RoZXJfY2FwcywgbmV3X3N0cnVjdHVyZSk7CisgIH0KKworICBpZiAoIWdzdF9jYXBzX2lzX2VtcHR5IChvdGhlcl9jYXBzKSAmJiBmaWx0ZXJfY2FwcykgeworICAgIEdzdENhcHMgKnRtcCA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXJfY2Fwcywgb3RoZXJfY2FwcywKKyAgICAgICAgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc19yZXBsYWNlICgmb3RoZXJfY2FwcywgdG1wKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgfQorCisgIHJldHVybiBvdGhlcl9jYXBzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92aWRlb19jcm9wX3NldF9pbmZvIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsIEdzdENhcHMgKiBpbiwKKyAgICBHc3RWaWRlb0luZm8gKiBpbl9pbmZvLCBHc3RDYXBzICogb3V0LCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0VmlkZW9Dcm9wICpjcm9wID0gR1NUX1ZJREVPX0NST1AgKHZmaWx0ZXIpOworICBpbnQgZHgsIGR5OworCisgIEdTVF9PQkpFQ1RfTE9DSyAoY3JvcCk7CisgIGNyb3AtPm5lZWRfdXBkYXRlID0gRkFMU0U7CisgIGNyb3AtPmNyb3BfbGVmdCA9IGNyb3AtPnByb3BfbGVmdDsKKyAgY3JvcC0+Y3JvcF9yaWdodCA9IGNyb3AtPnByb3BfcmlnaHQ7CisgIGNyb3AtPmNyb3BfdG9wID0gY3JvcC0+cHJvcF90b3A7CisgIGNyb3AtPmNyb3BfYm90dG9tID0gY3JvcC0+cHJvcF9ib3R0b207CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChjcm9wKTsKKworICBkeCA9IEdTVF9WSURFT19JTkZPX1dJRFRIIChpbl9pbmZvKSAtIEdTVF9WSURFT19JTkZPX1dJRFRIIChvdXRfaW5mbyk7CisgIGR5ID0gR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbl9pbmZvKSAtIEdTVF9WSURFT19JTkZPX0hFSUdIVCAob3V0X2luZm8pOworCisgIGlmIChjcm9wLT5jcm9wX2xlZnQgPT0gLTEgJiYgY3JvcC0+Y3JvcF9yaWdodCA9PSAtMSkgeworICAgIGNyb3AtPmNyb3BfbGVmdCA9IGR4IC8gMjsKKyAgICBjcm9wLT5jcm9wX3JpZ2h0ID0gZHggLyAyICsgKGR4ICYgMSk7CisgIH0gZWxzZSBpZiAoY3JvcC0+Y3JvcF9sZWZ0ID09IC0xKSB7CisgICAgaWYgKEdfVU5MSUtFTFkgKGNyb3AtPmNyb3BfcmlnaHQgPiBkeCkpCisgICAgICBnb3RvIGNyb3BwaW5nX3Rvb19tdWNoOworICAgIGNyb3AtPmNyb3BfbGVmdCA9IGR4IC0gY3JvcC0+Y3JvcF9yaWdodDsKKyAgfSBlbHNlIGlmIChjcm9wLT5jcm9wX3JpZ2h0ID09IC0xKSB7CisgICAgaWYgKEdfVU5MSUtFTFkgKGNyb3AtPmNyb3BfbGVmdCA+IGR4KSkKKyAgICAgIGdvdG8gY3JvcHBpbmdfdG9vX211Y2g7CisgICAgY3JvcC0+Y3JvcF9yaWdodCA9IGR4IC0gY3JvcC0+Y3JvcF9sZWZ0OworICB9CisKKyAgaWYgKGNyb3AtPmNyb3BfdG9wID09IC0xICYmIGNyb3AtPmNyb3BfYm90dG9tID09IC0xKSB7CisgICAgY3JvcC0+Y3JvcF90b3AgPSBkeSAvIDI7CisgICAgY3JvcC0+Y3JvcF9ib3R0b20gPSBkeSAvIDIgKyAoZHkgJiAxKTsKKyAgfSBlbHNlIGlmIChjcm9wLT5jcm9wX3RvcCA9PSAtMSkgeworICAgIGlmIChHX1VOTElLRUxZIChjcm9wLT5jcm9wX2JvdHRvbSA+IGR5KSkKKyAgICAgIGdvdG8gY3JvcHBpbmdfdG9vX211Y2g7CisgICAgY3JvcC0+Y3JvcF90b3AgPSBkeSAtIGNyb3AtPmNyb3BfYm90dG9tOworICB9IGVsc2UgaWYgKGNyb3AtPmNyb3BfYm90dG9tID09IC0xKSB7CisgICAgaWYgKEdfVU5MSUtFTFkgKGNyb3AtPmNyb3BfdG9wID4gZHkpKQorICAgICAgZ290byBjcm9wcGluZ190b29fbXVjaDsKKyAgICBjcm9wLT5jcm9wX2JvdHRvbSA9IGR5IC0gY3JvcC0+Y3JvcF90b3A7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoKGNyb3AtPmNyb3BfbGVmdCArIGNyb3AtPmNyb3BfcmlnaHQpID49CisgICAgICAgICAgR1NUX1ZJREVPX0lORk9fV0lEVEggKGluX2luZm8pCisgICAgICAgICAgfHwgKGNyb3AtPmNyb3BfdG9wICsgY3JvcC0+Y3JvcF9ib3R0b20pID49CisgICAgICAgICAgR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbl9pbmZvKSkpCisgICAgZ290byBjcm9wcGluZ190b29fbXVjaDsKKworICBpZiAoaW4gJiYgb3V0KQorICAgIEdTVF9MT0dfT0JKRUNUIChjcm9wLCAiaW5jYXBzID0gJSIgR1NUX1BUUl9GT1JNQVQgIiwgb3V0Y2FwcyA9ICUiCisgICAgICAgIEdTVF9QVFJfRk9STUFULCBpbiwgb3V0KTsKKworICBpZiAoR1NUX1ZJREVPX0lORk9fSVNfUkdCIChpbl9pbmZvKQorICAgICAgfHwgR1NUX1ZJREVPX0lORk9fSVNfR1JBWSAoaW5faW5mbykpIHsKKyAgICBjcm9wLT5wYWNraW5nID0gVklERU9fQ1JPUF9QSVhFTF9GT1JNQVRfUEFDS0VEX1NJTVBMRTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoaW5faW5mbykpIHsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgICBjcm9wLT5wYWNraW5nID0gVklERU9fQ1JPUF9QSVhFTF9GT1JNQVRfUEFDS0VEX1NJTVBMRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVZZVToKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOgorICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICAgIGNyb3AtPnBhY2tpbmcgPSBWSURFT19DUk9QX1BJWEVMX0ZPUk1BVF9QQUNLRURfQ09NUExFWDsKKyAgICAgICAgaWYgKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoaW5faW5mbykgPT0gR1NUX1ZJREVPX0ZPUk1BVF9VWVZZKSB7CisgICAgICAgICAgLyogVVlWWSA9IDQ6MjoyIC0gW1UwIFkwIFYwIFkxXSBbVTIgWTIgVjIgWTNdIFtVNCBZNCBWNCBZNV0gKi8KKyAgICAgICAgICBjcm9wLT5tYWNyb195X29mZiA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogWVVZViA9IDQ6MjoyIC0gW1kwIFUwIFkxIFYwXSBbWTIgVTIgWTMgVjJdIFtZNCBVNCBZNSBWNF0gPSBZVVkyICovCisgICAgICAgICAgY3JvcC0+bWFjcm9feV9vZmYgPSAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVYxMjoKKyAgICAgICAgY3JvcC0+cGFja2luZyA9IFZJREVPX0NST1BfUElYRUxfRk9STUFUX1BMQU5BUjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYxMjoKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9OVjIxOgorICAgICAgICBjcm9wLT5wYWNraW5nID0gVklERU9fQ1JPUF9QSVhFTF9GT1JNQVRfU0VNSV9QTEFOQVI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byB1bmtub3duX2Zvcm1hdDsKKyAgICB9CisgIH0KKworICBjcm9wLT5pbl9pbmZvID0gKmluX2luZm87CisgIGNyb3AtPm91dF9pbmZvID0gKm91dF9pbmZvOworCisgIC8qIEVuc3VyZSBvdXIgZGVjaWRlX2FsbG9jYXRpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gKi8KKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAoR1NUX0JBU0VfVFJBTlNGT1JNIChjcm9wKSwgRkFMU0UpOworICBnc3RfYmFzZV90cmFuc2Zvcm1fc2V0X2luX3BsYWNlIChHU1RfQkFTRV9UUkFOU0ZPUk0gKGNyb3ApLCBGQUxTRSk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1IgKi8KK2Nyb3BwaW5nX3Rvb19tdWNoOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjcm9wLCAid2UgYXJlIGNyb3BwaW5nIHRvbyBtdWNoIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit1bmtub3duX2Zvcm1hdDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY3JvcCwgIlVuc3VwcG9ydGVkIGZvcm1hdCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKiBjYWxsZWQgd2l0aCBvYmplY3QgbG9jayAqLworc3RhdGljIGlubGluZSB2b2lkCitnc3RfdmlkZW9fY3JvcF9zZXRfY3JvcCAoR3N0VmlkZW9Dcm9wICogdmNyb3AsIGdpbnQgbmV3X3ZhbHVlLCBnaW50ICogcHJvcCkKK3sKKyAgaWYgKCpwcm9wICE9IG5ld192YWx1ZSkgeworICAgICpwcm9wID0gbmV3X3ZhbHVlOworICAgIHZjcm9wLT5uZWVkX3VwZGF0ZSA9IFRSVUU7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19jcm9wX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWaWRlb0Nyb3AgKnZpZGVvX2Nyb3A7CisKKyAgdmlkZW9fY3JvcCA9IEdTVF9WSURFT19DUk9QIChvYmplY3QpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAodmlkZW9fY3JvcCk7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9MRUZUOgorICAgICAgZ3N0X3ZpZGVvX2Nyb3Bfc2V0X2Nyb3AgKHZpZGVvX2Nyb3AsIGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpLAorICAgICAgICAgICZ2aWRlb19jcm9wLT5wcm9wX2xlZnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1JJR0hUOgorICAgICAgZ3N0X3ZpZGVvX2Nyb3Bfc2V0X2Nyb3AgKHZpZGVvX2Nyb3AsIGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpLAorICAgICAgICAgICZ2aWRlb19jcm9wLT5wcm9wX3JpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UT1A6CisgICAgICBnc3RfdmlkZW9fY3JvcF9zZXRfY3JvcCAodmlkZW9fY3JvcCwgZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSksCisgICAgICAgICAgJnZpZGVvX2Nyb3AtPnByb3BfdG9wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CT1RUT006CisgICAgICBnc3RfdmlkZW9fY3JvcF9zZXRfY3JvcCAodmlkZW9fY3JvcCwgZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSksCisgICAgICAgICAgJnZpZGVvX2Nyb3AtPnByb3BfYm90dG9tKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KKyAgR1NUX0xPR19PQkpFQ1QgKHZpZGVvX2Nyb3AsICJsPSVkLHI9JWQsYj0lZCx0PSVkLCBuZWVkX3VwZGF0ZTolZCIsCisgICAgICB2aWRlb19jcm9wLT5wcm9wX2xlZnQsIHZpZGVvX2Nyb3AtPnByb3BfcmlnaHQsIHZpZGVvX2Nyb3AtPnByb3BfYm90dG9tLAorICAgICAgdmlkZW9fY3JvcC0+cHJvcF90b3AsIHZpZGVvX2Nyb3AtPm5lZWRfdXBkYXRlKTsKKworICBHU1RfT0JKRUNUX1VOTE9DSyAodmlkZW9fY3JvcCk7CisKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3JlY29uZmlndXJlX3NyYyAoR1NUX0JBU0VfVFJBTlNGT1JNICh2aWRlb19jcm9wKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fY3JvcF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VmlkZW9Dcm9wICp2aWRlb19jcm9wOworCisgIHZpZGVvX2Nyb3AgPSBHU1RfVklERU9fQ1JPUCAob2JqZWN0KTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHZpZGVvX2Nyb3ApOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTEVGVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHZpZGVvX2Nyb3AtPnByb3BfbGVmdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUklHSFQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB2aWRlb19jcm9wLT5wcm9wX3JpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UT1A6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB2aWRlb19jcm9wLT5wcm9wX3RvcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQk9UVE9NOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdmlkZW9fY3JvcC0+cHJvcF9ib3R0b20pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAodmlkZW9fY3JvcCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHZpZGVvY3JvcF9kZWJ1ZywgInZpZGVvY3JvcCIsIDAsICJ2aWRlb2Nyb3AiKTsKKworICBpZiAoZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInZpZGVvY3JvcCIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfVklERU9fQ1JPUCkKKyAgICAgICYmIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJhc3BlY3RyYXRpb2Nyb3AiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX0FTUEVDVF9SQVRJT19DUk9QKSkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICB2aWRlb2Nyb3AsCisgICAgIkNyb3BzIHZpZGVvIGludG8gYSB1c2VyLWRlZmluZWQgcmVnaW9uIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC92aWRlb2Nyb3AvZ3N0dmlkZW9jcm9wLmggYi9nc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NTRlODQKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9jcm9wL2dzdHZpZGVvY3JvcC5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIEdTdHJlYW1lciB2aWRlbyBmcmFtZSBjcm9wcGluZworICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9WSURFT19DUk9QX0hfXworI2RlZmluZSBfX0dTVF9WSURFT19DUk9QX0hfXworCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WSURFT19DUk9QIFwKKyAgKGdzdF92aWRlb19jcm9wX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WSURFT19DUk9QKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVklERU9fQ1JPUCxHc3RWaWRlb0Nyb3ApKQorI2RlZmluZSBHU1RfVklERU9fQ1JPUF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WSURFT19DUk9QLEdzdFZpZGVvQ3JvcENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1ZJREVPX0NST1Aob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WSURFT19DUk9QKSkKKyNkZWZpbmUgR1NUX0lTX1ZJREVPX0NST1BfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVklERU9fQ1JPUCkpCisKK3R5cGVkZWYgZW51bSB7CisgIFZJREVPX0NST1BfUElYRUxfRk9STUFUX1BBQ0tFRF9TSU1QTEUgPSAwLCAgLyogUkdCeCwgQVlVViAqLworICBWSURFT19DUk9QX1BJWEVMX0ZPUk1BVF9QQUNLRURfQ09NUExFWCwgICAgIC8qIFVZVlksIFlWWVUgKi8KKyAgVklERU9fQ1JPUF9QSVhFTF9GT1JNQVRfUExBTkFSLCAgICAgICAgICAgICAvKiBJNDIwLCBZVjEyICovCisgIFZJREVPX0NST1BfUElYRUxfRk9STUFUX1NFTUlfUExBTkFSICAgICAgICAgLyogTlYxMiwgTlYyMSAqLworfSBWaWRlb0Nyb3BQaXhlbEZvcm1hdDsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZpZGVvQ3JvcEltYWdlRGV0YWlscyBHc3RWaWRlb0Nyb3BJbWFnZURldGFpbHM7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWaWRlb0Nyb3AgR3N0VmlkZW9Dcm9wOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZpZGVvQ3JvcENsYXNzIEdzdFZpZGVvQ3JvcENsYXNzOworCitzdHJ1Y3QgX0dzdFZpZGVvQ3JvcAoreworICBHc3RWaWRlb0ZpbHRlciBwYXJlbnQ7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIGdpbnQgcHJvcF9sZWZ0OworICBnaW50IHByb3BfcmlnaHQ7CisgIGdpbnQgcHJvcF90b3A7CisgIGdpbnQgcHJvcF9ib3R0b207CisgIGdib29sZWFuIG5lZWRfdXBkYXRlOworCisgIEdzdFZpZGVvSW5mbyBpbl9pbmZvOworICBHc3RWaWRlb0luZm8gb3V0X2luZm87CisKKyAgZ2ludCBjcm9wX2xlZnQ7CisgIGdpbnQgY3JvcF9yaWdodDsKKyAgZ2ludCBjcm9wX3RvcDsKKyAgZ2ludCBjcm9wX2JvdHRvbTsKKworICBWaWRlb0Nyb3BQaXhlbEZvcm1hdCAgcGFja2luZzsKKyAgZ2ludCBtYWNyb195X29mZjsKK307CisKK3N0cnVjdCBfR3N0VmlkZW9Dcm9wQ2xhc3MKK3sKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfdmlkZW9fY3JvcF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9WSURFT19DUk9QX0hfXyAqLworCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9jcm9wL21lc29uLmJ1aWxkIGIvZ3N0L3ZpZGVvY3JvcC9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDZiN2JlCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvY3JvcC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDggQEAKK2dzdHZpZGVvY3JvcCA9IGxpYnJhcnkoJ2dzdHZpZGVvY3JvcCcsCisgICdnc3R2aWRlb2Nyb3AuYycsICdnc3Rhc3BlY3RyYXRpb2Nyb3AuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0X2RlcCwgZ3N0YmFzZV9kZXAsIGdzdHZpZGVvX2RlcF0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9maWx0ZXIvLmdpdGlnbm9yZSBiL2dzdC92aWRlb2ZpbHRlci8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYzA4ODAKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9maWx0ZXIvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMgQEAKK2dzdHZpZGVvZXhhbXBsZS5oCitnc3R2aWRlb2V4YW1wbGUuYworCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW0gYi9nc3QvdmlkZW9maWx0ZXIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1MTdmZQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2ZpbHRlci9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIyIEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3R2aWRlb2ZpbHRlci5sYQorCitub2luc3RfSEVBREVSUyA9IGdzdHZpZGVvZmxpcC5oIGdzdHZpZGVvYmFsYW5jZS5oIGdzdGdhbW1hLmggZ3N0dmlkZW9tZWRpYW4uaAorCitFWFRSQV9ESVNUID0gZ3N0dmlkZW90ZW1wbGF0ZS5jIG1ha2VfZmlsdGVyCitDTEVBTkZJTEVTID0gZ3N0dmlkZW9leGFtcGxlLmMKKworbGliZ3N0dmlkZW9maWx0ZXJfbGFfU09VUkNFUyA9IHBsdWdpbi5jIFwKKwkJCWdzdHZpZGVvZmxpcC5jIFwKKwkJCWdzdHZpZGVvYmFsYW5jZS5jIFwKKwkJCWdzdGdhbW1hLmMgXAorCQkJZ3N0dmlkZW9tZWRpYW4uYworbGliZ3N0dmlkZW9maWx0ZXJfbGFfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKSBcCisJCQkkKEdTVF9CQVNFX0NGTEFHUykgXAorCQkJJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykKK2xpYmdzdHZpZGVvZmlsdGVyX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSBcCisJCQktbGdzdHZpZGVvLUBHU1RfQVBJX1ZFUlNJT05AIFwKKwkJCSQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykKK2xpYmdzdHZpZGVvZmlsdGVyX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykgJChMSUJNKQorCitnc3R2aWRlb2V4YW1wbGUuYzogJChzcmNkaXIpL21ha2VfZmlsdGVyICQoc3JjZGlyKS9nc3R2aWRlb3RlbXBsYXRlLmMKKwkkKHNyY2RpcikvbWFrZV9maWx0ZXIgVmlkZW9leGFtcGxlICQoc3JjZGlyKS9nc3R2aWRlb3RlbXBsYXRlLmMKZGlmZiAtLWdpdCBhL2dzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jIGIvZ3N0L3ZpZGVvZmlsdGVyL2dzdGdhbW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0NDA5ZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5jCkBAIC0wLDAgKzEsNDE0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBBcndlZCB2LiBNZXJrYXR6IDx2Lm1lcmthdHpAZ214Lm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIChwcm9iYWJseSkgZ2VuZXJhdGVkIGZyb20KKyAqIGdzdHZpZGVvdGVtcGxhdGUuYyx2IDEuMTIgMjAwNC8wMS8wNyAyMTowNzoxMiBkcyBFeHAgCisgKiBhbmQKKyAqIG1ha2VfZmlsdGVyLHYgMS42IDIwMDQvMDEvMDcgMjE6MzM6MDEgZHMgRXhwIAorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LWdhbW1hCisgKgorICogUGVyZm9ybXMgZ2FtbWEgY29ycmVjdGlvbiBvbiBhIHZpZGVvIHN0cmVhbS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdmlkZW90ZXN0c3JjICEgZ2FtbWEgZ2FtbWE9Mi4wICEgdmlkZW9jb252ZXJ0ICEgeGltYWdlc2luaworICogXXwgVGhpcyBwaXBlbGluZSB3aWxsIG1ha2UgdGhlIGltYWdlICJicmlnaHRlciIuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdmlkZW90ZXN0c3JjICEgZ2FtbWEgZ2FtbWE9MC41ICEgdmlkZW9jb252ZXJ0ICEgeGltYWdlc2luaworICogXXwgVGhpcyBwaXBlbGluZSB3aWxsIG1ha2UgdGhlIGltYWdlICJkYXJrZXIiLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RnYW1tYS5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnYW1tYV9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnYW1tYV9kZWJ1ZworCisvKiBHc3RHYW1tYSBwcm9wZXJ0aWVzICovCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9HQU1NQQorICAgICAgLyogRklMTCBNRSAqLworfTsKKworI2RlZmluZSBERUZBVUxUX1BST1BfR0FNTUEgIDEKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF9nYW1tYV9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgQVlVViwgIgorICAgICAgICAgICAgIkFSR0IsIEJHUkEsIEFCR1IsIFJHQkEsIFk0NDQsICIKKyAgICAgICAgICAgICJ4UkdCLCBSR0J4LCB4QkdSLCBCR1J4LCBSR0IsIEJHUiwgWTQyQiwgTlYxMiwgIgorICAgICAgICAgICAgIk5WMjEsIFlVWTIsIFVZVlksIFlWWVUsIEk0MjAsIFlWMTIsIElZVVYsIFk0MUIgfSIpKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfZ2FtbWFfc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IEFZVVYsICIKKyAgICAgICAgICAgICJBUkdCLCBCR1JBLCBBQkdSLCBSR0JBLCBZNDQ0LCAiCisgICAgICAgICAgICAieFJHQiwgUkdCeCwgeEJHUiwgQkdSeCwgUkdCLCBCR1IsIFk0MkIsIE5WMTIsICIKKyAgICAgICAgICAgICJOVjIxLCBZVVkyLCBVWVZZLCBZVllVLCBJNDIwLCBZVjEyLCBJWVVWLCBZNDFCIH0iKSkKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfZ2FtbWFfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2dhbW1hX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9nYW1tYV9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbyk7CitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfZ2FtbWFfdHJhbnNmb3JtX2ZyYW1lX2lwIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsCisgICAgR3N0VmlkZW9GcmFtZSAqIGZyYW1lKTsKK3N0YXRpYyB2b2lkIGdzdF9nYW1tYV9iZWZvcmVfdHJhbnNmb3JtIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnNmb3JtLAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CisKK3N0YXRpYyB2b2lkIGdzdF9nYW1tYV9jYWxjdWxhdGVfdGFibGVzIChHc3RHYW1tYSAqIGdhbW1hKTsKKworR19ERUZJTkVfVFlQRSAoR3N0R2FtbWEsIGdzdF9nYW1tYSwgR1NUX1RZUEVfVklERU9fRklMVEVSKTsKKworc3RhdGljIHZvaWQKK2dzdF9nYW1tYV9jbGFzc19pbml0IChHc3RHYW1tYUNsYXNzICogZ19jbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBnX2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGdfY2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqdHJhbnNfY2xhc3MgPSAoR3N0QmFzZVRyYW5zZm9ybUNsYXNzICopIGdfY2xhc3M7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgKnZmaWx0ZXJfY2xhc3MgPSAoR3N0VmlkZW9GaWx0ZXJDbGFzcyAqKSBnX2NsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnYW1tYV9kZWJ1ZywgImdhbW1hIiwgMCwgImdhbW1hIik7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2dhbW1hX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X2dhbW1hX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0dBTU1BLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImdhbW1hIiwgIkdhbW1hIiwgImdhbW1hIiwKKyAgICAgICAgICAwLjAxLCAxMCwgREVGQVVMVF9QUk9QX0dBTU1BLAorICAgICAgICAgIEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgIlZpZGVvIGdhbW1hIGNvcnJlY3Rpb24iLCAiRmlsdGVyL0VmZmVjdC9WaWRlbyIsCisgICAgICAiQWRqdXN0cyBnYW1tYSBvbiBhIHZpZGVvIHN0cmVhbSIsICJBcndlZCB2LiBNZXJrYXR6IDx2Lm1lcmthdHpAZ214Lm5ldCIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF9nYW1tYV9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X2dhbW1hX3NyY190ZW1wbGF0ZSk7CisKKyAgdHJhbnNfY2xhc3MtPmJlZm9yZV90cmFuc2Zvcm0gPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nYW1tYV9iZWZvcmVfdHJhbnNmb3JtKTsKKyAgdHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9pcF9vbl9wYXNzdGhyb3VnaCA9IEZBTFNFOworCisgIHZmaWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9nYW1tYV9zZXRfaW5mbyk7CisgIHZmaWx0ZXJfY2xhc3MtPnRyYW5zZm9ybV9mcmFtZV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2dhbW1hX3RyYW5zZm9ybV9mcmFtZV9pcCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ2FtbWFfaW5pdCAoR3N0R2FtbWEgKiBnYW1tYSkKK3sKKyAgLyogcHJvcGVydGllcyAqLworICBnYW1tYS0+Z2FtbWEgPSBERUZBVUxUX1BST1BfR0FNTUE7CisgIGdzdF9nYW1tYV9jYWxjdWxhdGVfdGFibGVzIChnYW1tYSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ2FtbWFfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdEdhbW1hICpnYW1tYSA9IEdTVF9HQU1NQSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfR0FNTUE6eworICAgICAgZ2RvdWJsZSB2YWwgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZ2FtbWEsICJDaGFuZ2luZyBnYW1tYSBmcm9tICVsZiB0byAlbGYiLCBnYW1tYS0+Z2FtbWEsCisgICAgICAgICAgdmFsKTsKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoZ2FtbWEpOworICAgICAgZ2FtbWEtPmdhbW1hID0gdmFsOworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKGdhbW1hKTsKKyAgICAgIGdzdF9nYW1tYV9jYWxjdWxhdGVfdGFibGVzIChnYW1tYSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2dhbW1hX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RHYW1tYSAqZ2FtbWEgPSBHU1RfR0FNTUEgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0dBTU1BOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgZ2FtbWEtPmdhbW1hKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9nYW1tYV9jYWxjdWxhdGVfdGFibGVzIChHc3RHYW1tYSAqIGdhbW1hKQoreworICBnaW50IG47CisgIGdkb3VibGUgdmFsOworICBnZG91YmxlIGV4cDsKKyAgZ2Jvb2xlYW4gcGFzc3Rocm91Z2ggPSBGQUxTRTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKGdhbW1hKTsKKyAgaWYgKGdhbW1hLT5nYW1tYSA9PSAxLjApIHsKKyAgICBwYXNzdGhyb3VnaCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgZXhwID0gMS4wIC8gZ2FtbWEtPmdhbW1hOworICAgIGZvciAobiA9IDA7IG4gPCAyNTY7IG4rKykgeworICAgICAgdmFsID0gbiAvIDI1NS4wOworICAgICAgdmFsID0gcG93ICh2YWwsIGV4cCk7CisgICAgICB2YWwgPSAyNTUuMCAqIHZhbDsKKyAgICAgIGdhbW1hLT5nYW1tYV90YWJsZVtuXSA9IChndWludDgpIGZsb29yICh2YWwgKyAwLjUpOworICAgIH0KKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAoZ2FtbWEpOworCisgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfcGFzc3Rocm91Z2ggKEdTVF9CQVNFX1RSQU5TRk9STSAoZ2FtbWEpLCBwYXNzdGhyb3VnaCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZ2FtbWFfcGxhbmFyX3l1dl9pcCAoR3N0R2FtbWEgKiBnYW1tYSwgR3N0VmlkZW9GcmFtZSAqIGZyYW1lKQoreworICBnaW50IGksIGosIGhlaWdodDsKKyAgZ2ludCB3aWR0aCwgc3RyaWRlLCByb3dfd3JhcDsKKyAgY29uc3QgZ3VpbnQ4ICp0YWJsZSA9IGdhbW1hLT5nYW1tYV90YWJsZTsKKyAgZ3VpbnQ4ICpkYXRhOworCisgIGRhdGEgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgMCk7CisgIHN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIDApOworICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9DT01QX1dJRFRIIChmcmFtZSwgMCk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZnJhbWUsIDApOworICByb3dfd3JhcCA9IHN0cmlkZSAtIHdpZHRoOworCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CisgICAgICAqZGF0YSA9IHRhYmxlWypkYXRhXTsKKyAgICAgIGRhdGErKzsKKyAgICB9CisgICAgZGF0YSArPSByb3dfd3JhcDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X2dhbW1hX3BhY2tlZF95dXZfaXAgKEdzdEdhbW1hICogZ2FtbWEsIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSkKK3sKKyAgZ2ludCBpLCBqLCBoZWlnaHQ7CisgIGdpbnQgd2lkdGgsIHN0cmlkZSwgcm93X3dyYXA7CisgIGdpbnQgcGl4ZWxfc3RyaWRlOworICBjb25zdCBndWludDggKnRhYmxlID0gZ2FtbWEtPmdhbW1hX3RhYmxlOworICBndWludDggKmRhdGE7CisKKyAgZGF0YSA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAwKTsKKyAgc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZSwgMCk7CisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGZyYW1lLCAwKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgMCk7CisgIHBpeGVsX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BTVFJJREUgKGZyYW1lLCAwKTsKKyAgcm93X3dyYXAgPSBzdHJpZGUgLSBwaXhlbF9zdHJpZGUgKiB3aWR0aDsKKworICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgKmRhdGEgPSB0YWJsZVsqZGF0YV07CisgICAgICBkYXRhICs9IHBpeGVsX3N0cmlkZTsKKyAgICB9CisgICAgZGF0YSArPSByb3dfd3JhcDsKKyAgfQorfQorCitzdGF0aWMgY29uc3QgaW50IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfc2R0dltdID0geworICAyOTgsIDAsIDQwOSwgLTU3MDY4LAorICAyOTgsIC0xMDAsIC0yMDgsIDM0NzA3LAorICAyOTgsIDUxNiwgMCwgLTcwODcwLAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9zZHR2W10gPSB7CisgIDY2LCAxMjksIDI1LCA0MDk2LAorICAtMzgsIC03NCwgMTEyLCAzMjc2OCwKKyAgMTEyLCAtOTQsIC0xOCwgMzI3NjgsCit9OworCisjZGVmaW5lIEFQUExZX01BVFJJWChtLG8sdjEsdjIsdjMpICgobVtvKjRdICogdjEgKyBtW28qNCsxXSAqIHYyICsgbVtvKjQrMl0gKiB2MyArIG1bbyo0KzNdKSA+PiA4KQorCitzdGF0aWMgdm9pZAorZ3N0X2dhbW1hX3BhY2tlZF9yZ2JfaXAgKEdzdEdhbW1hICogZ2FtbWEsIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSkKK3sKKyAgZ2ludCBpLCBqLCBoZWlnaHQ7CisgIGdpbnQgd2lkdGgsIHN0cmlkZSwgcm93X3dyYXA7CisgIGdpbnQgcGl4ZWxfc3RyaWRlOworICBjb25zdCBndWludDggKnRhYmxlID0gZ2FtbWEtPmdhbW1hX3RhYmxlOworICBnaW50IG9mZnNldHNbM107CisgIGdpbnQgciwgZywgYjsKKyAgZ2ludCB5LCB1LCB2OworICBndWludDggKmRhdGE7CisKKyAgZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7CisgIHN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGZyYW1lLCAwKTsKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZnJhbWUsIDApOworICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9IRUlHSFQgKGZyYW1lLCAwKTsKKworICBvZmZzZXRzWzBdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfT0ZGU0VUIChmcmFtZSwgMCk7CisgIG9mZnNldHNbMV0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKGZyYW1lLCAxKTsKKyAgb2Zmc2V0c1syXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX09GRlNFVCAoZnJhbWUsIDIpOworCisgIHBpeGVsX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BTVFJJREUgKGZyYW1lLCAwKTsKKyAgcm93X3dyYXAgPSBzdHJpZGUgLSBwaXhlbF9zdHJpZGUgKiB3aWR0aDsKKworICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgciA9IGRhdGFbb2Zmc2V0c1swXV07CisgICAgICBnID0gZGF0YVtvZmZzZXRzWzFdXTsKKyAgICAgIGIgPSBkYXRhW29mZnNldHNbMl1dOworCisgICAgICB5ID0gQVBQTFlfTUFUUklYIChjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYsIDAsIHIsIGcsIGIpOworICAgICAgdSA9IEFQUExZX01BVFJJWCAoY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9zZHR2LCAxLCByLCBnLCBiKTsKKyAgICAgIHYgPSBBUFBMWV9NQVRSSVggKGNvZ19yZ2JfdG9feWNiY3JfbWF0cml4XzhiaXRfc2R0diwgMiwgciwgZywgYik7CisKKyAgICAgIHkgPSB0YWJsZVtDTEFNUCAoeSwgMCwgMjU1KV07CisgICAgICByID0gQVBQTFlfTUFUUklYIChjb2dfeWNiY3JfdG9fcmdiX21hdHJpeF84Yml0X3NkdHYsIDAsIHksIHUsIHYpOworICAgICAgZyA9IEFQUExZX01BVFJJWCAoY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2LCAxLCB5LCB1LCB2KTsKKyAgICAgIGIgPSBBUFBMWV9NQVRSSVggKGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfc2R0diwgMiwgeSwgdSwgdik7CisKKyAgICAgIGRhdGFbb2Zmc2V0c1swXV0gPSBDTEFNUCAociwgMCwgMjU1KTsKKyAgICAgIGRhdGFbb2Zmc2V0c1sxXV0gPSBDTEFNUCAoZywgMCwgMjU1KTsKKyAgICAgIGRhdGFbb2Zmc2V0c1syXV0gPSBDTEFNUCAoYiwgMCwgMjU1KTsKKyAgICAgIGRhdGEgKz0gcGl4ZWxfc3RyaWRlOworICAgIH0KKyAgICBkYXRhICs9IHJvd193cmFwOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2dhbW1hX3NldF9pbmZvIChHc3RWaWRlb0ZpbHRlciAqIHZmaWx0ZXIsIEdzdENhcHMgKiBpbmNhcHMsCisgICAgR3N0VmlkZW9JbmZvICogaW5faW5mbywgR3N0Q2FwcyAqIG91dGNhcHMsIEdzdFZpZGVvSW5mbyAqIG91dF9pbmZvKQoreworICBHc3RHYW1tYSAqZ2FtbWEgPSBHU1RfR0FNTUEgKHZmaWx0ZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGdhbW1hLAorICAgICAgInNldHRpbmcgY2FwczogaW4gJSIgR1NUX1BUUl9GT1JNQVQgIiBvdXQgJSIgR1NUX1BUUl9GT1JNQVQsIGluY2FwcywKKyAgICAgIG91dGNhcHMpOworCisgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUIChpbl9pbmZvKSkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVjEyOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDFCOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDQ0OgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9OVjEyOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9OVjIxOgorICAgICAgZ2FtbWEtPnByb2Nlc3MgPSBnc3RfZ2FtbWFfcGxhbmFyX3l1dl9pcDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9VWVZZOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVllVOgorICAgICAgZ2FtbWEtPnByb2Nlc3MgPSBnc3RfZ2FtbWFfcGFja2VkX3l1dl9pcDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BUkdCOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BQkdSOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1JBOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94UkdCOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94QkdSOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0J4OgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1J4OgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUjoKKyAgICAgIGdhbW1hLT5wcm9jZXNzID0gZ3N0X2dhbW1hX3BhY2tlZF9yZ2JfaXA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ290byBpbnZhbGlkX2NhcHM7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2ludmFsaWRfY2FwczoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGdhbW1hLCAiSW52YWxpZCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgaW5jYXBzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9nYW1tYV9iZWZvcmVfdHJhbnNmb3JtIChHc3RCYXNlVHJhbnNmb3JtICogYmFzZSwgR3N0QnVmZmVyICogb3V0YnVmKQoreworICBHc3RHYW1tYSAqZ2FtbWEgPSBHU1RfR0FNTUEgKGJhc2UpOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBzdHJlYW1fdGltZTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKTsKKyAgc3RyZWFtX3RpbWUgPQorICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZiYXNlLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsIHRpbWVzdGFtcCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZ2FtbWEsICJzeW5jIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKGdhbW1hKSwgc3RyZWFtX3RpbWUpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X2dhbW1hX3RyYW5zZm9ybV9mcmFtZV9pcCAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RWaWRlb0ZyYW1lICogZnJhbWUpCit7CisgIEdzdEdhbW1hICpnYW1tYSA9IEdTVF9HQU1NQSAodmZpbHRlcik7CisKKyAgaWYgKCFnYW1tYS0+cHJvY2VzcykKKyAgICBnb3RvIG5vdF9uZWdvdGlhdGVkOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoZ2FtbWEpOworICBnYW1tYS0+cHJvY2VzcyAoZ2FtbWEsIGZyYW1lKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGdhbW1hKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCitub3RfbmVnb3RpYXRlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGdhbW1hLCAiTm90IG5lZ290aWF0ZWQgeWV0Iik7CisgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuaCBiL2dzdC92aWRlb2ZpbHRlci9nc3RnYW1tYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZjk2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9maWx0ZXIvZ3N0Z2FtbWEuaApAQCAtMCwwICsxLDc1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDAzPiBEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBBcndlZCB2LiBNZXJrYXR6IDx2Lm1lcmthdHpAZ214Lm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9WSURFT19HQU1NQV9IX18KKyNkZWZpbmUgX19HU1RfVklERU9fR0FNTUFfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9HQU1NQSBcCisgIChnc3RfZ2FtbWFfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0dBTU1BKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfR0FNTUEsR3N0R2FtbWEpKQorI2RlZmluZSBHU1RfR0FNTUFfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfR0FNTUEsR3N0R2FtbWFDbGFzcykpCisjZGVmaW5lIEdTVF9JU19HQU1NQShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0dBTU1BKSkKKyNkZWZpbmUgR1NUX0lTX0dBTU1BX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0dBTU1BKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdEdhbW1hIEdzdEdhbW1hOwordHlwZWRlZiBzdHJ1Y3QgX0dzdEdhbW1hQ2xhc3MgR3N0R2FtbWFDbGFzczsKKworLyoqCisgKiBHc3RHYW1tYToKKyAqCisgKiBPcGFxdWUgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0R2FtbWEKK3sKKyAgR3N0VmlkZW9GaWx0ZXIgdmlkZW9maWx0ZXI7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgLyogcHJvcGVydGllcyAqLworICBnZG91YmxlIGdhbW1hOworCisgIC8qIHRhYmxlcyAqLworICBndWludDggZ2FtbWFfdGFibGVbMjU2XTsKKworICB2b2lkICgqcHJvY2VzcykgKEdzdEdhbW1hICpnYW1tYSwgR3N0VmlkZW9GcmFtZSAqZnJhbWUpOworfTsKKworc3RydWN0IF9Hc3RHYW1tYUNsYXNzCit7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2dhbW1hX2dldF90eXBlKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfVklERU9fR0FNTUFfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmMgYi9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4YmNkNwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuYwpAQCAtMCwwICsxLDg0MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDEwPiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIHdhcyAocHJvYmFibHkpIGdlbmVyYXRlZCBmcm9tIGdzdHZpZGVvYmFsYW5jZS5jLAorICogZ3N0dmlkZW9iYWxhbmNlLmMsdiAxLjcgMjAwMy8xMS8wOCAwMjo0ODo1OSBkc2NobGVlZiBFeHAgCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtdmlkZW9iYWxhbmNlCisgKgorICogQWRqdXN0cyBicmlnaHRuZXNzLCBjb250cmFzdCwgaHVlLCBzYXR1cmF0aW9uIG9uIGEgdmlkZW8gc3RyZWFtLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIGxhdW5jaCBsaW5lPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB2aWRlb3Rlc3RzcmMgISB2aWRlb2JhbGFuY2Ugc2F0dXJhdGlvbj0wLjAgISB2aWRlb2NvbnZlcnQgISB4aW1hZ2VzaW5rCisgKiBdfCBUaGlzIHBpcGVsaW5lIGNvbnZlcnRzIHRoZSBpbWFnZSB0byBibGFjayBhbmQgd2hpdGUgYnkgc2V0dGluZyB0aGUKKyAqIHNhdHVyYXRpb24gdG8gMC4wLgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvbWF0aC1jb21wYXQuaD4KKworI2luY2x1ZGUgImdzdHZpZGVvYmFsYW5jZS5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2NvbG9yYmFsYW5jZS5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDICh2aWRlb2JhbGFuY2VfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgdmlkZW9iYWxhbmNlX2RlYnVnCisKKy8qIEdzdFZpZGVvQmFsYW5jZSBwcm9wZXJ0aWVzICovCisjZGVmaW5lIERFRkFVTFRfUFJPUF9DT05UUkFTVAkJMS4wCisjZGVmaW5lIERFRkFVTFRfUFJPUF9CUklHSFRORVNTCQkwLjAKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0hVRQkJMC4wCisjZGVmaW5lIERFRkFVTFRfUFJPUF9TQVRVUkFUSU9OCQkxLjAKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQ09OVFJBU1QsCisgIFBST1BfQlJJR0hUTkVTUywKKyAgUFJPUF9IVUUsCisgIFBST1BfU0FUVVJBVElPTgorfTsKKworI2RlZmluZSBQUk9DRVNTSU5HX0NBUFMgXAorICAieyBBWVVWLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0JBLCBZNDQ0LCB4UkdCLCBSR0J4LCAiIFwKKyAgInhCR1IsIEJHUngsIFJHQiwgQkdSLCBZNDJCLCBZVVkyLCBVWVZZLCBZVllVLCAiIFwKKyAgIkk0MjAsIFlWMTIsIElZVVYsIFk0MUIsIE5WMTIsIE5WMjEgfSIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF92aWRlb19iYWxhbmNlX3NyY190ZW1wbGF0ZSA9CisgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoUFJPQ0VTU0lOR19DQVBTKSAiOyIKKyAgICAgICAgInZpZGVvL3gtcmF3KEFOWSkiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfdmlkZW9fYmFsYW5jZV9zaW5rX3RlbXBsYXRlID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKFBST0NFU1NJTkdfQ0FQUykgIjsiCisgICAgICAgICJ2aWRlby94LXJhdyhBTlkpIikKKyAgICApOworCitzdGF0aWMgdm9pZCBnc3RfdmlkZW9fYmFsYW5jZV9jb2xvcmJhbGFuY2VfaW5pdCAoR3N0Q29sb3JCYWxhbmNlSW50ZXJmYWNlICoKKyAgICBpZmFjZSk7CisKK3N0YXRpYyB2b2lkIGdzdF92aWRlb19iYWxhbmNlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF92aWRlb19iYWxhbmNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworI2RlZmluZSBnc3RfdmlkZW9fYmFsYW5jZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoR3N0VmlkZW9CYWxhbmNlLCBnc3RfdmlkZW9fYmFsYW5jZSwKKyAgICBHU1RfVFlQRV9WSURFT19GSUxURVIsCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9DT0xPUl9CQUxBTkNFLAorICAgICAgICBnc3RfdmlkZW9fYmFsYW5jZV9jb2xvcmJhbGFuY2VfaW5pdCkpOworCisvKgorICogbG9vay11cCB0YWJsZXMgKExVVCkuCisgKi8KK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fYmFsYW5jZV91cGRhdGVfdGFibGVzIChHc3RWaWRlb0JhbGFuY2UgKiB2YikKK3sKKyAgZ2ludCBpLCBqOworICBnZG91YmxlIHksIHUsIHYsIGh1ZV9jb3MsIGh1ZV9zaW47CisKKyAgLyogWSAqLworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICB5ID0gMTYgKyAoKGkgLSAxNikgKiB2Yi0+Y29udHJhc3QgKyB2Yi0+YnJpZ2h0bmVzcyAqIDI1NSk7CisgICAgaWYgKHkgPCAwKQorICAgICAgeSA9IDA7CisgICAgZWxzZSBpZiAoeSA+IDI1NSkKKyAgICAgIHkgPSAyNTU7CisgICAgdmItPnRhYmxleVtpXSA9IHJpbnQgKHkpOworICB9CisKKyAgaHVlX2NvcyA9IGNvcyAoR19QSSAqIHZiLT5odWUpOworICBodWVfc2luID0gc2luIChHX1BJICogdmItPmh1ZSk7CisKKyAgLyogVS9WIGxvb2t1cCB0YWJsZXMgYXJlIDJELCBzaW5jZSB3ZSBuZWVkIGJvdGggVS9WIGZvciBlYWNoIHRhYmxlCisgICAqIHNlcGFyYXRlbHkuICovCisgIGZvciAoaSA9IC0xMjg7IGkgPCAxMjg7IGkrKykgeworICAgIGZvciAoaiA9IC0xMjg7IGogPCAxMjg7IGorKykgeworICAgICAgdSA9IDEyOCArICgoaSAqIGh1ZV9jb3MgKyBqICogaHVlX3NpbikgKiB2Yi0+c2F0dXJhdGlvbik7CisgICAgICB2ID0gMTI4ICsgKCgtaSAqIGh1ZV9zaW4gKyBqICogaHVlX2NvcykgKiB2Yi0+c2F0dXJhdGlvbik7CisgICAgICBpZiAodSA8IDApCisgICAgICAgIHUgPSAwOworICAgICAgZWxzZSBpZiAodSA+IDI1NSkKKyAgICAgICAgdSA9IDI1NTsKKyAgICAgIGlmICh2IDwgMCkKKyAgICAgICAgdiA9IDA7CisgICAgICBlbHNlIGlmICh2ID4gMjU1KQorICAgICAgICB2ID0gMjU1OworICAgICAgdmItPnRhYmxldVtpICsgMTI4XVtqICsgMTI4XSA9IHJpbnQgKHUpOworICAgICAgdmItPnRhYmxldltpICsgMTI4XVtqICsgMTI4XSA9IHJpbnQgKHYpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92aWRlb19iYWxhbmNlX2lzX3Bhc3N0aHJvdWdoIChHc3RWaWRlb0JhbGFuY2UgKiB2aWRlb2JhbGFuY2UpCit7CisgIHJldHVybiB2aWRlb2JhbGFuY2UtPmNvbnRyYXN0ID09IDEuMCAmJgorICAgICAgdmlkZW9iYWxhbmNlLT5icmlnaHRuZXNzID09IDAuMCAmJgorICAgICAgdmlkZW9iYWxhbmNlLT5odWUgPT0gMC4wICYmIHZpZGVvYmFsYW5jZS0+c2F0dXJhdGlvbiA9PSAxLjA7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fYmFsYW5jZV91cGRhdGVfcHJvcGVydGllcyAoR3N0VmlkZW9CYWxhbmNlICogdmlkZW9iYWxhbmNlKQoreworICBnYm9vbGVhbiBwYXNzdGhyb3VnaDsKKyAgR3N0QmFzZVRyYW5zZm9ybSAqYmFzZSA9IEdTVF9CQVNFX1RSQU5TRk9STSAodmlkZW9iYWxhbmNlKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHZpZGVvYmFsYW5jZSk7CisgIHBhc3N0aHJvdWdoID0gZ3N0X3ZpZGVvX2JhbGFuY2VfaXNfcGFzc3Rocm91Z2ggKHZpZGVvYmFsYW5jZSk7CisgIGlmICghcGFzc3Rocm91Z2gpCisgICAgZ3N0X3ZpZGVvX2JhbGFuY2VfdXBkYXRlX3RhYmxlcyAodmlkZW9iYWxhbmNlKTsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHZpZGVvYmFsYW5jZSk7CisKKyAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAoYmFzZSwgcGFzc3Rocm91Z2gpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JhbGFuY2VfcGxhbmFyX3l1diAoR3N0VmlkZW9CYWxhbmNlICogdmlkZW9iYWxhbmNlLAorICAgIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSkKK3sKKyAgZ2ludCB4LCB5OworICBndWludDggKnlkYXRhOworICBndWludDggKnVkYXRhLCAqdmRhdGE7CisgIGdpbnQgeXN0cmlkZSwgdXN0cmlkZSwgdnN0cmlkZTsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IHdpZHRoMiwgaGVpZ2h0MjsKKyAgZ3VpbnQ4ICp0YWJsZXkgPSB2aWRlb2JhbGFuY2UtPnRhYmxleTsKKyAgZ3VpbnQ4ICoqdGFibGV1ID0gdmlkZW9iYWxhbmNlLT50YWJsZXU7CisgIGd1aW50OCAqKnRhYmxldiA9IHZpZGVvYmFsYW5jZS0+dGFibGV2OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKTsKKworICB5ZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7CisgIHlzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMCk7CisKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgZ3VpbnQ4ICp5cHRyOworCisgICAgeXB0ciA9IHlkYXRhICsgeSAqIHlzdHJpZGU7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICp5cHRyID0gdGFibGV5Wyp5cHRyXTsKKyAgICAgIHlwdHIrKzsKKyAgICB9CisgIH0KKworICB3aWR0aDIgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZnJhbWUsIDEpOworICBoZWlnaHQyID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgMSk7CisKKyAgdWRhdGEgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZnJhbWUsIDEpOworICB2ZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMik7CisgIHVzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMSk7CisgIHZzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMik7CisKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDI7IHkrKykgeworICAgIGd1aW50OCAqdXB0ciwgKnZwdHI7CisgICAgZ3VpbnQ4IHUxLCB2MTsKKworICAgIHVwdHIgPSB1ZGF0YSArIHkgKiB1c3RyaWRlOworICAgIHZwdHIgPSB2ZGF0YSArIHkgKiB2c3RyaWRlOworCisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoMjsgeCsrKSB7CisgICAgICB1MSA9ICp1cHRyOworICAgICAgdjEgPSAqdnB0cjsKKworICAgICAgKnVwdHIrKyA9IHRhYmxldVt1MV1bdjFdOworICAgICAgKnZwdHIrKyA9IHRhYmxldlt1MV1bdjFdOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JhbGFuY2Vfc2VtaXBsYW5hcl95dXYgKEdzdFZpZGVvQmFsYW5jZSAqIHZpZGVvYmFsYW5jZSwKKyAgICBHc3RWaWRlb0ZyYW1lICogZnJhbWUpCit7CisgIGdpbnQgeCwgeTsKKyAgZ3VpbnQ4ICp5ZGF0YTsKKyAgZ3VpbnQ4ICp1dmRhdGE7CisgIGdpbnQgeXN0cmlkZSwgdXZzdHJpZGU7CisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCB3aWR0aDIsIGhlaWdodDI7CisgIGd1aW50OCAqdGFibGV5ID0gdmlkZW9iYWxhbmNlLT50YWJsZXk7CisgIGd1aW50OCAqKnRhYmxldSA9IHZpZGVvYmFsYW5jZS0+dGFibGV1OworICBndWludDggKip0YWJsZXYgPSB2aWRlb2JhbGFuY2UtPnRhYmxldjsKKyAgZ2ludCB1cG9zLCB2cG9zOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKTsKKworICB5ZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7CisgIHlzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMCk7CisKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgZ3VpbnQ4ICp5cHRyOworCisgICAgeXB0ciA9IHlkYXRhICsgeSAqIHlzdHJpZGU7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICp5cHRyID0gdGFibGV5Wyp5cHRyXTsKKyAgICAgIHlwdHIrKzsKKyAgICB9CisgIH0KKworICB3aWR0aDIgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZnJhbWUsIDEpOworICBoZWlnaHQyID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgMSk7CisKKyAgdXZkYXRhID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLCAxKTsKKyAgdXZzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMSk7CisKKyAgdXBvcyA9IEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJmZyYW1lLT5pbmZvKSA9PSBHU1RfVklERU9fRk9STUFUX05WMTIgPyAwIDogMTsKKyAgdnBvcyA9IEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJmZyYW1lLT5pbmZvKSA9PSBHU1RfVklERU9fRk9STUFUX05WMTIgPyAxIDogMDsKKworICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0MjsgeSsrKSB7CisgICAgZ3VpbnQ4ICp1dnB0cjsKKyAgICBndWludDggdTEsIHYxOworCisgICAgdXZwdHIgPSB1dmRhdGEgKyB5ICogdXZzdHJpZGU7CisKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGgyOyB4KyspIHsKKyAgICAgIHUxID0gdXZwdHJbdXBvc107CisgICAgICB2MSA9IHV2cHRyW3Zwb3NdOworCisgICAgICB1dnB0clt1cG9zXSA9IHRhYmxldVt1MV1bdjFdOworICAgICAgdXZwdHJbdnBvc10gPSB0YWJsZXZbdTFdW3YxXTsKKyAgICAgIHV2cHRyICs9IDI7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fYmFsYW5jZV9wYWNrZWRfeXV2IChHc3RWaWRlb0JhbGFuY2UgKiB2aWRlb2JhbGFuY2UsCisgICAgR3N0VmlkZW9GcmFtZSAqIGZyYW1lKQoreworICBnaW50IHgsIHksIHN0cmlkZTsKKyAgZ3VpbnQ4ICp5ZGF0YSwgKnVkYXRhLCAqdmRhdGE7CisgIGdpbnQgeW9mZiwgdW9mZiwgdm9mZjsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnaW50IHdpZHRoMiwgaGVpZ2h0MjsKKyAgZ3VpbnQ4ICp0YWJsZXkgPSB2aWRlb2JhbGFuY2UtPnRhYmxleTsKKyAgZ3VpbnQ4ICoqdGFibGV1ID0gdmlkZW9iYWxhbmNlLT50YWJsZXU7CisgIGd1aW50OCAqKnRhYmxldiA9IHZpZGVvYmFsYW5jZS0+dGFibGV2OworCisgIHdpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChmcmFtZSk7CisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKTsKKworICBzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChmcmFtZSwgMCk7CisgIHlkYXRhID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZnJhbWUsIDApOworICB5b2ZmID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUFNUUklERSAoZnJhbWUsIDApOworCisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgIGd1aW50OCAqeXB0cjsKKworICAgIHlwdHIgPSB5ZGF0YSArIHkgKiBzdHJpZGU7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICp5cHRyID0gdGFibGV5Wyp5cHRyXTsKKyAgICAgIHlwdHIgKz0geW9mZjsKKyAgICB9CisgIH0KKworICB3aWR0aDIgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZnJhbWUsIDEpOworICBoZWlnaHQyID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgMSk7CisKKyAgdWRhdGEgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgMSk7CisgIHZkYXRhID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZnJhbWUsIDIpOworICB1b2ZmID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUFNUUklERSAoZnJhbWUsIDEpOworICB2b2ZmID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfUFNUUklERSAoZnJhbWUsIDIpOworCisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQyOyB5KyspIHsKKyAgICBndWludDggKnVwdHIsICp2cHRyOworICAgIGd1aW50OCB1MSwgdjE7CisKKyAgICB1cHRyID0gdWRhdGEgKyB5ICogc3RyaWRlOworICAgIHZwdHIgPSB2ZGF0YSArIHkgKiBzdHJpZGU7CisKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGgyOyB4KyspIHsKKyAgICAgIHUxID0gKnVwdHI7CisgICAgICB2MSA9ICp2cHRyOworCisgICAgICAqdXB0ciA9IHRhYmxldVt1MV1bdjFdOworICAgICAgKnZwdHIgPSB0YWJsZXZbdTFdW3YxXTsKKworICAgICAgdXB0ciArPSB1b2ZmOworICAgICAgdnB0ciArPSB2b2ZmOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgY29uc3QgaW50IGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfc2R0dltdID0geworICAyOTgsIDAsIDQwOSwgLTU3MDY4LAorICAyOTgsIC0xMDAsIC0yMDgsIDM0NzA3LAorICAyOTgsIDUxNiwgMCwgLTcwODcwLAorfTsKKworc3RhdGljIGNvbnN0IGdpbnQgY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9zZHR2W10gPSB7CisgIDY2LCAxMjksIDI1LCA0MDk2LAorICAtMzgsIC03NCwgMTEyLCAzMjc2OCwKKyAgMTEyLCAtOTQsIC0xOCwgMzI3NjgsCit9OworCisjZGVmaW5lIEFQUExZX01BVFJJWChtLG8sdjEsdjIsdjMpICgobVtvKjRdICogdjEgKyBtW28qNCsxXSAqIHYyICsgbVtvKjQrMl0gKiB2MyArIG1bbyo0KzNdKSA+PiA4KQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JhbGFuY2VfcGFja2VkX3JnYiAoR3N0VmlkZW9CYWxhbmNlICogdmlkZW9iYWxhbmNlLAorICAgIEdzdFZpZGVvRnJhbWUgKiBmcmFtZSkKK3sKKyAgZ2ludCBpLCBqLCBoZWlnaHQ7CisgIGdpbnQgd2lkdGgsIHN0cmlkZSwgcm93X3dyYXA7CisgIGdpbnQgcGl4ZWxfc3RyaWRlOworICBndWludDggKmRhdGE7CisgIGdpbnQgb2Zmc2V0c1szXTsKKyAgZ2ludCByLCBnLCBiOworICBnaW50IHksIHUsIHY7CisgIGdpbnQgdV90bXAsIHZfdG1wOworICBndWludDggKnRhYmxleSA9IHZpZGVvYmFsYW5jZS0+dGFibGV5OworICBndWludDggKip0YWJsZXUgPSB2aWRlb2JhbGFuY2UtPnRhYmxldTsKKyAgZ3VpbnQ4ICoqdGFibGV2ID0gdmlkZW9iYWxhbmNlLT50YWJsZXY7CisKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGZyYW1lKTsKKyAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoZnJhbWUpOworCisgIG9mZnNldHNbMF0gPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKGZyYW1lLCAwKTsKKyAgb2Zmc2V0c1sxXSA9IEdTVF9WSURFT19GUkFNRV9DT01QX09GRlNFVCAoZnJhbWUsIDEpOworICBvZmZzZXRzWzJdID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfT0ZGU0VUIChmcmFtZSwgMik7CisKKyAgZGF0YSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7CisgIHN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGZyYW1lLCAwKTsKKworICBwaXhlbF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChmcmFtZSwgMCk7CisgIHJvd193cmFwID0gc3RyaWRlIC0gcGl4ZWxfc3RyaWRlICogd2lkdGg7CisKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgIHIgPSBkYXRhW29mZnNldHNbMF1dOworICAgICAgZyA9IGRhdGFbb2Zmc2V0c1sxXV07CisgICAgICBiID0gZGF0YVtvZmZzZXRzWzJdXTsKKworICAgICAgeSA9IEFQUExZX01BVFJJWCAoY29nX3JnYl90b195Y2Jjcl9tYXRyaXhfOGJpdF9zZHR2LCAwLCByLCBnLCBiKTsKKyAgICAgIHVfdG1wID0gQVBQTFlfTUFUUklYIChjb2dfcmdiX3RvX3ljYmNyX21hdHJpeF84Yml0X3NkdHYsIDEsIHIsIGcsIGIpOworICAgICAgdl90bXAgPSBBUFBMWV9NQVRSSVggKGNvZ19yZ2JfdG9feWNiY3JfbWF0cml4XzhiaXRfc2R0diwgMiwgciwgZywgYik7CisKKyAgICAgIHkgPSBDTEFNUCAoeSwgMCwgMjU1KTsKKyAgICAgIHVfdG1wID0gQ0xBTVAgKHVfdG1wLCAwLCAyNTUpOworICAgICAgdl90bXAgPSBDTEFNUCAodl90bXAsIDAsIDI1NSk7CisKKyAgICAgIHkgPSB0YWJsZXlbeV07CisgICAgICB1ID0gdGFibGV1W3VfdG1wXVt2X3RtcF07CisgICAgICB2ID0gdGFibGV2W3VfdG1wXVt2X3RtcF07CisKKyAgICAgIHIgPSBBUFBMWV9NQVRSSVggKGNvZ195Y2Jjcl90b19yZ2JfbWF0cml4XzhiaXRfc2R0diwgMCwgeSwgdSwgdik7CisgICAgICBnID0gQVBQTFlfTUFUUklYIChjb2dfeWNiY3JfdG9fcmdiX21hdHJpeF84Yml0X3NkdHYsIDEsIHksIHUsIHYpOworICAgICAgYiA9IEFQUExZX01BVFJJWCAoY29nX3ljYmNyX3RvX3JnYl9tYXRyaXhfOGJpdF9zZHR2LCAyLCB5LCB1LCB2KTsKKworICAgICAgZGF0YVtvZmZzZXRzWzBdXSA9IENMQU1QIChyLCAwLCAyNTUpOworICAgICAgZGF0YVtvZmZzZXRzWzFdXSA9IENMQU1QIChnLCAwLCAyNTUpOworICAgICAgZGF0YVtvZmZzZXRzWzJdXSA9IENMQU1QIChiLCAwLCAyNTUpOworICAgICAgZGF0YSArPSBwaXhlbF9zdHJpZGU7CisgICAgfQorICAgIGRhdGEgKz0gcm93X3dyYXA7CisgIH0KK30KKworLyogZ2V0IG5vdGlmaWVkIG9mIGNhcHMgYW5kIHBsdWcgaW4gdGhlIGNvcnJlY3QgcHJvY2VzcyBmdW5jdGlvbiAqLworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9fYmFsYW5jZV9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0VmlkZW9CYWxhbmNlICp2aWRlb2JhbGFuY2UgPSBHU1RfVklERU9fQkFMQU5DRSAodmZpbHRlcik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodmlkZW9iYWxhbmNlLAorICAgICAgImluICUiIEdTVF9QVFJfRk9STUFUICIgb3V0ICUiIEdTVF9QVFJfRk9STUFULCBpbmNhcHMsIG91dGNhcHMpOworCisgIHZpZGVvYmFsYW5jZS0+cHJvY2VzcyA9IE5VTEw7CisKKyAgc3dpdGNoIChHU1RfVklERU9fSU5GT19GT1JNQVQgKGluX2luZm8pKSB7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MUI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MkI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0NDQ6CisgICAgICB2aWRlb2JhbGFuY2UtPnByb2Nlc3MgPSBnc3RfdmlkZW9fYmFsYW5jZV9wbGFuYXJfeXV2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lVWTI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FZVVY6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWWVU6CisgICAgICB2aWRlb2JhbGFuY2UtPnByb2Nlc3MgPSBnc3RfdmlkZW9fYmFsYW5jZV9wYWNrZWRfeXV2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX05WMTI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX05WMjE6CisgICAgICB2aWRlb2JhbGFuY2UtPnByb2Nlc3MgPSBnc3RfdmlkZW9fYmFsYW5jZV9zZW1pcGxhbmFyX3l1djsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BUkdCOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BQkdSOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0JBOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1JBOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94UkdCOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94QkdSOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0J4OgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1J4OgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUjoKKyAgICAgIHZpZGVvYmFsYW5jZS0+cHJvY2VzcyA9IGdzdF92aWRlb19iYWxhbmNlX3BhY2tlZF9yZ2I7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCFnc3RfdmlkZW9fYmFsYW5jZV9pc19wYXNzdGhyb3VnaCAodmlkZW9iYWxhbmNlKSkKKyAgICAgICAgZ290byB1bmtub3duX2Zvcm1hdDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCit1bmtub3duX2Zvcm1hdDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHZpZGVvYmFsYW5jZSwgInVua25vd24gZm9ybWF0ICUiIEdTVF9QVFJfRk9STUFULCBpbmNhcHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JhbGFuY2VfYmVmb3JlX3RyYW5zZm9ybSAoR3N0QmFzZVRyYW5zZm9ybSAqIGJhc2UsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0VmlkZW9CYWxhbmNlICpiYWxhbmNlID0gR1NUX1ZJREVPX0JBTEFOQ0UgKGJhc2UpOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBzdHJlYW1fdGltZTsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKyAgc3RyZWFtX3RpbWUgPQorICAgICAgZ3N0X3NlZ21lbnRfdG9fc3RyZWFtX3RpbWUgKCZiYXNlLT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsIHRpbWVzdGFtcCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoYmFsYW5jZSwgInN5bmMgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChzdHJlYW1fdGltZSkpCisgICAgZ3N0X29iamVjdF9zeW5jX3ZhbHVlcyAoR1NUX09CSkVDVCAoYmFsYW5jZSksIHN0cmVhbV90aW1lKTsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3ZpZGVvX2JhbGFuY2VfdHJhbnNmb3JtX2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RDYXBzICogY2FwcywgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0VmlkZW9CYWxhbmNlICpiYWxhbmNlID0gR1NUX1ZJREVPX0JBTEFOQ0UgKHRyYW5zKTsKKyAgR3N0Q2FwcyAqcmV0OworCisgIGlmICghZ3N0X3ZpZGVvX2JhbGFuY2VfaXNfcGFzc3Rocm91Z2ggKGJhbGFuY2UpKSB7CisgICAgc3RhdGljIEdzdFN0YXRpY0NhcHMgcmF3X2NhcHMgPQorICAgICAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKFBST0NFU1NJTkdfQ0FQUykpOworCisgICAgY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdCAoY2FwcywgZ3N0X3N0YXRpY19jYXBzX2dldCAoJnJhd19jYXBzKSk7CisKKyAgICBpZiAoZmlsdGVyKSB7CisgICAgICByZXQgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCBjYXBzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIH0gZWxzZSB7CisgICAgICByZXQgPSBjYXBzOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZmlsdGVyKSB7CisgICAgICByZXQgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCBjYXBzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIH0gZWxzZSB7CisgICAgICByZXQgPSBnc3RfY2Fwc19yZWYgKGNhcHMpOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdmlkZW9fYmFsYW5jZV90cmFuc2Zvcm1fZnJhbWVfaXAgKEdzdFZpZGVvRmlsdGVyICogdmZpbHRlciwKKyAgICBHc3RWaWRlb0ZyYW1lICogZnJhbWUpCit7CisgIEdzdFZpZGVvQmFsYW5jZSAqdmlkZW9iYWxhbmNlID0gR1NUX1ZJREVPX0JBTEFOQ0UgKHZmaWx0ZXIpOworCisgIGlmICghdmlkZW9iYWxhbmNlLT5wcm9jZXNzKQorICAgIGdvdG8gbm90X25lZ290aWF0ZWQ7CisKKyAgR1NUX09CSkVDVF9MT0NLICh2aWRlb2JhbGFuY2UpOworICB2aWRlb2JhbGFuY2UtPnByb2Nlc3MgKHZpZGVvYmFsYW5jZSwgZnJhbWUpOworICBHU1RfT0JKRUNUX1VOTE9DSyAodmlkZW9iYWxhbmNlKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCitub3RfbmVnb3RpYXRlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHZpZGVvYmFsYW5jZSwgIk5vdCBuZWdvdGlhdGVkIHlldCIpOworICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JhbGFuY2VfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdMaXN0ICpjaGFubmVscyA9IE5VTEw7CisgIEdzdFZpZGVvQmFsYW5jZSAqYmFsYW5jZSA9IEdTVF9WSURFT19CQUxBTkNFIChvYmplY3QpOworCisgIGdfZnJlZSAoYmFsYW5jZS0+dGFibGV1WzBdKTsKKworICBjaGFubmVscyA9IGJhbGFuY2UtPmNoYW5uZWxzOworICB3aGlsZSAoY2hhbm5lbHMpIHsKKyAgICBHc3RDb2xvckJhbGFuY2VDaGFubmVsICpjaGFubmVsID0gY2hhbm5lbHMtPmRhdGE7CisKKyAgICBnX29iamVjdF91bnJlZiAoY2hhbm5lbCk7CisgICAgY2hhbm5lbHMtPmRhdGEgPSBOVUxMOworICAgIGNoYW5uZWxzID0gZ19saXN0X25leHQgKGNoYW5uZWxzKTsKKyAgfQorCisgIGlmIChiYWxhbmNlLT5jaGFubmVscykKKyAgICBnX2xpc3RfZnJlZSAoYmFsYW5jZS0+Y2hhbm5lbHMpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19iYWxhbmNlX2NsYXNzX2luaXQgKEdzdFZpZGVvQmFsYW5jZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqdHJhbnNfY2xhc3MgPSAoR3N0QmFzZVRyYW5zZm9ybUNsYXNzICopIGtsYXNzOworICBHc3RWaWRlb0ZpbHRlckNsYXNzICp2ZmlsdGVyX2NsYXNzID0gKEdzdFZpZGVvRmlsdGVyQ2xhc3MgKikga2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHZpZGVvYmFsYW5jZV9kZWJ1ZywgInZpZGVvYmFsYW5jZSIsIDAsCisgICAgICAidmlkZW9iYWxhbmNlIik7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfdmlkZW9fYmFsYW5jZV9maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3ZpZGVvX2JhbGFuY2Vfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfdmlkZW9fYmFsYW5jZV9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DT05UUkFTVCwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJjb250cmFzdCIsICJDb250cmFzdCIsICJjb250cmFzdCIsCisgICAgICAgICAgMC4wLCAyLjAsIERFRkFVTFRfUFJPUF9DT05UUkFTVCwKKyAgICAgICAgICBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQlJJR0hUTkVTUywKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJicmlnaHRuZXNzIiwgIkJyaWdodG5lc3MiLCAiYnJpZ2h0bmVzcyIsIC0xLjAsIDEuMCwKKyAgICAgICAgICBERUZBVUxUX1BST1BfQlJJR0hUTkVTUywKKyAgICAgICAgICBHU1RfUEFSQU1fQ09OVFJPTExBQkxFIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfSFVFLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoImh1ZSIsICJIdWUiLCAiaHVlIiwgLTEuMCwgMS4wLCBERUZBVUxUX1BST1BfSFVFLAorICAgICAgICAgIEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9TQVRVUkFUSU9OLAorICAgICAgZ19wYXJhbV9zcGVjX2RvdWJsZSAoInNhdHVyYXRpb24iLCAiU2F0dXJhdGlvbiIsICJzYXR1cmF0aW9uIiwgMC4wLCAyLjAsCisgICAgICAgICAgREVGQVVMVF9QUk9QX1NBVFVSQVRJT04sCisgICAgICAgICAgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJWaWRlbyBiYWxhbmNlIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJBZGp1c3RzIGJyaWdodG5lc3MsIGNvbnRyYXN0LCBodWUsIHNhdHVyYXRpb24gb24gYSB2aWRlbyBzdHJlYW0iLAorICAgICAgIkRhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJmdzdF92aWRlb19iYWxhbmNlX3NpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfdmlkZW9fYmFsYW5jZV9zcmNfdGVtcGxhdGUpOworCisgIHRyYW5zX2NsYXNzLT5iZWZvcmVfdHJhbnNmb3JtID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdmlkZW9fYmFsYW5jZV9iZWZvcmVfdHJhbnNmb3JtKTsKKyAgdHJhbnNfY2xhc3MtPnRyYW5zZm9ybV9pcF9vbl9wYXNzdGhyb3VnaCA9IEZBTFNFOworICB0cmFuc19jbGFzcy0+dHJhbnNmb3JtX2NhcHMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19iYWxhbmNlX3RyYW5zZm9ybV9jYXBzKTsKKworICB2ZmlsdGVyX2NsYXNzLT5zZXRfaW5mbyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdmlkZW9fYmFsYW5jZV9zZXRfaW5mbyk7CisgIHZmaWx0ZXJfY2xhc3MtPnRyYW5zZm9ybV9mcmFtZV9pcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3ZpZGVvX2JhbGFuY2VfdHJhbnNmb3JtX2ZyYW1lX2lwKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19iYWxhbmNlX2luaXQgKEdzdFZpZGVvQmFsYW5jZSAqIHZpZGVvYmFsYW5jZSkKK3sKKyAgY29uc3QgZ2NoYXIgKmNoYW5uZWxzWzRdID0geyAiSFVFIiwgIlNBVFVSQVRJT04iLAorICAgICJCUklHSFRORVNTIiwgIkNPTlRSQVNUIgorICB9OworICBnaW50IGk7CisKKyAgLyogSW5pdGlhbGl6ZSBwcm9wZXJ0aWV3cyAqLworICB2aWRlb2JhbGFuY2UtPmNvbnRyYXN0ID0gREVGQVVMVF9QUk9QX0NPTlRSQVNUOworICB2aWRlb2JhbGFuY2UtPmJyaWdodG5lc3MgPSBERUZBVUxUX1BST1BfQlJJR0hUTkVTUzsKKyAgdmlkZW9iYWxhbmNlLT5odWUgPSBERUZBVUxUX1BST1BfSFVFOworICB2aWRlb2JhbGFuY2UtPnNhdHVyYXRpb24gPSBERUZBVUxUX1BST1BfU0FUVVJBVElPTjsKKworICB2aWRlb2JhbGFuY2UtPnRhYmxldVswXSA9IGdfbmV3IChndWludDgsIDI1NiAqIDI1NiAqIDIpOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICB2aWRlb2JhbGFuY2UtPnRhYmxldVtpXSA9CisgICAgICAgIHZpZGVvYmFsYW5jZS0+dGFibGV1WzBdICsgaSAqIDI1NiAqIHNpemVvZiAoZ3VpbnQ4KTsKKyAgICB2aWRlb2JhbGFuY2UtPnRhYmxldltpXSA9CisgICAgICAgIHZpZGVvYmFsYW5jZS0+dGFibGV1WzBdICsgMjU2ICogMjU2ICogc2l6ZW9mIChndWludDgpICsKKyAgICAgICAgaSAqIDI1NiAqIHNpemVvZiAoZ3VpbnQ4KTsKKyAgfQorCisgIGdzdF92aWRlb19iYWxhbmNlX3VwZGF0ZV9wcm9wZXJ0aWVzICh2aWRlb2JhbGFuY2UpOworCisgIC8qIEdlbmVyYXRlIHRoZSBjaGFubmVscyBsaXN0ICovCisgIGZvciAoaSA9IDA7IGkgPCBHX05fRUxFTUVOVFMgKGNoYW5uZWxzKTsgaSsrKSB7CisgICAgR3N0Q29sb3JCYWxhbmNlQ2hhbm5lbCAqY2hhbm5lbDsKKworICAgIGNoYW5uZWwgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX0NPTE9SX0JBTEFOQ0VfQ0hBTk5FTCwgTlVMTCk7CisgICAgY2hhbm5lbC0+bGFiZWwgPSBnX3N0cmR1cCAoY2hhbm5lbHNbaV0pOworICAgIGNoYW5uZWwtPm1pbl92YWx1ZSA9IC0xMDAwOworICAgIGNoYW5uZWwtPm1heF92YWx1ZSA9IDEwMDA7CisKKyAgICB2aWRlb2JhbGFuY2UtPmNoYW5uZWxzID0gZ19saXN0X2FwcGVuZCAodmlkZW9iYWxhbmNlLT5jaGFubmVscywgY2hhbm5lbCk7CisgIH0KK30KKworc3RhdGljIGNvbnN0IEdMaXN0ICoKK2dzdF92aWRlb19iYWxhbmNlX2NvbG9yYmFsYW5jZV9saXN0X2NoYW5uZWxzIChHc3RDb2xvckJhbGFuY2UgKiBiYWxhbmNlKQoreworICBHc3RWaWRlb0JhbGFuY2UgKnZpZGVvYmFsYW5jZSA9IEdTVF9WSURFT19CQUxBTkNFIChiYWxhbmNlKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAodmlkZW9iYWxhbmNlICE9IE5VTEwsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX1ZJREVPX0JBTEFOQ0UgKHZpZGVvYmFsYW5jZSksIE5VTEwpOworCisgIHJldHVybiB2aWRlb2JhbGFuY2UtPmNoYW5uZWxzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JhbGFuY2VfY29sb3JiYWxhbmNlX3NldF92YWx1ZSAoR3N0Q29sb3JCYWxhbmNlICogYmFsYW5jZSwKKyAgICBHc3RDb2xvckJhbGFuY2VDaGFubmVsICogY2hhbm5lbCwgZ2ludCB2YWx1ZSkKK3sKKyAgR3N0VmlkZW9CYWxhbmNlICp2YiA9IEdTVF9WSURFT19CQUxBTkNFIChiYWxhbmNlKTsKKyAgZ2RvdWJsZSBuZXdfdmFsOworICBnYm9vbGVhbiBjaGFuZ2VkID0gRkFMU0U7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAodmIgIT0gTlVMTCk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19WSURFT19CQUxBTkNFICh2YikpOworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfVklERU9fRklMVEVSICh2YikpOworICBnX3JldHVybl9pZl9mYWlsIChjaGFubmVsLT5sYWJlbCAhPSBOVUxMKTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHZiKTsKKyAgaWYgKCFnX2FzY2lpX3N0cmNhc2VjbXAgKGNoYW5uZWwtPmxhYmVsLCAiSFVFIikpIHsKKyAgICBuZXdfdmFsID0gKHZhbHVlICsgMTAwMC4wKSAqIDIuMCAvIDIwMDAuMCAtIDEuMDsKKyAgICBjaGFuZ2VkID0gbmV3X3ZhbCAhPSB2Yi0+aHVlOworICAgIHZiLT5odWUgPSBuZXdfdmFsOworICB9IGVsc2UgaWYgKCFnX2FzY2lpX3N0cmNhc2VjbXAgKGNoYW5uZWwtPmxhYmVsLCAiU0FUVVJBVElPTiIpKSB7CisgICAgbmV3X3ZhbCA9ICh2YWx1ZSArIDEwMDAuMCkgKiAyLjAgLyAyMDAwLjA7CisgICAgY2hhbmdlZCA9IG5ld192YWwgIT0gdmItPnNhdHVyYXRpb247CisgICAgdmItPnNhdHVyYXRpb24gPSBuZXdfdmFsOworICB9IGVsc2UgaWYgKCFnX2FzY2lpX3N0cmNhc2VjbXAgKGNoYW5uZWwtPmxhYmVsLCAiQlJJR0hUTkVTUyIpKSB7CisgICAgbmV3X3ZhbCA9ICh2YWx1ZSArIDEwMDAuMCkgKiAyLjAgLyAyMDAwLjAgLSAxLjA7CisgICAgY2hhbmdlZCA9IG5ld192YWwgIT0gdmItPmJyaWdodG5lc3M7CisgICAgdmItPmJyaWdodG5lc3MgPSBuZXdfdmFsOworICB9IGVsc2UgaWYgKCFnX2FzY2lpX3N0cmNhc2VjbXAgKGNoYW5uZWwtPmxhYmVsLCAiQ09OVFJBU1QiKSkgeworICAgIG5ld192YWwgPSAodmFsdWUgKyAxMDAwLjApICogMi4wIC8gMjAwMC4wOworICAgIGNoYW5nZWQgPSBuZXdfdmFsICE9IHZiLT5jb250cmFzdDsKKyAgICB2Yi0+Y29udHJhc3QgPSBuZXdfdmFsOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLICh2Yik7CisKKyAgaWYgKGNoYW5nZWQpCisgICAgZ3N0X3ZpZGVvX2JhbGFuY2VfdXBkYXRlX3Byb3BlcnRpZXMgKHZiKTsKKworICBpZiAoY2hhbmdlZCkgeworICAgIGdzdF9jb2xvcl9iYWxhbmNlX3ZhbHVlX2NoYW5nZWQgKGJhbGFuY2UsIGNoYW5uZWwsCisgICAgICAgIGdzdF9jb2xvcl9iYWxhbmNlX2dldF92YWx1ZSAoYmFsYW5jZSwgY2hhbm5lbCkpOworICB9Cit9CisKK3N0YXRpYyBnaW50Citnc3RfdmlkZW9fYmFsYW5jZV9jb2xvcmJhbGFuY2VfZ2V0X3ZhbHVlIChHc3RDb2xvckJhbGFuY2UgKiBiYWxhbmNlLAorICAgIEdzdENvbG9yQmFsYW5jZUNoYW5uZWwgKiBjaGFubmVsKQoreworICBHc3RWaWRlb0JhbGFuY2UgKnZiID0gR1NUX1ZJREVPX0JBTEFOQ0UgKGJhbGFuY2UpOworICBnaW50IHZhbHVlID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAodmIgIT0gTlVMTCwgMCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfVklERU9fQkFMQU5DRSAodmIpLCAwKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGNoYW5uZWwtPmxhYmVsICE9IE5VTEwsIDApOworCisgIGlmICghZ19hc2NpaV9zdHJjYXNlY21wIChjaGFubmVsLT5sYWJlbCwgIkhVRSIpKSB7CisgICAgdmFsdWUgPSAodmItPmh1ZSArIDEpICogMjAwMC4wIC8gMi4wIC0gMTAwMC4wOworICB9IGVsc2UgaWYgKCFnX2FzY2lpX3N0cmNhc2VjbXAgKGNoYW5uZWwtPmxhYmVsLCAiU0FUVVJBVElPTiIpKSB7CisgICAgdmFsdWUgPSB2Yi0+c2F0dXJhdGlvbiAqIDIwMDAuMCAvIDIuMCAtIDEwMDAuMDsKKyAgfSBlbHNlIGlmICghZ19hc2NpaV9zdHJjYXNlY21wIChjaGFubmVsLT5sYWJlbCwgIkJSSUdIVE5FU1MiKSkgeworICAgIHZhbHVlID0gKHZiLT5icmlnaHRuZXNzICsgMSkgKiAyMDAwLjAgLyAyLjAgLSAxMDAwLjA7CisgIH0gZWxzZSBpZiAoIWdfYXNjaWlfc3RyY2FzZWNtcCAoY2hhbm5lbC0+bGFiZWwsICJDT05UUkFTVCIpKSB7CisgICAgdmFsdWUgPSB2Yi0+Y29udHJhc3QgKiAyMDAwLjAgLyAyLjAgLSAxMDAwLjA7CisgIH0KKworICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBHc3RDb2xvckJhbGFuY2VUeXBlCitnc3RfdmlkZW9fYmFsYW5jZV9jb2xvcmJhbGFuY2VfZ2V0X2JhbGFuY2VfdHlwZSAoR3N0Q29sb3JCYWxhbmNlICogYmFsYW5jZSkKK3sKKyAgcmV0dXJuIEdTVF9DT0xPUl9CQUxBTkNFX1NPRlRXQVJFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JhbGFuY2VfY29sb3JiYWxhbmNlX2luaXQgKEdzdENvbG9yQmFsYW5jZUludGVyZmFjZSAqIGlmYWNlKQoreworICBpZmFjZS0+bGlzdF9jaGFubmVscyA9IGdzdF92aWRlb19iYWxhbmNlX2NvbG9yYmFsYW5jZV9saXN0X2NoYW5uZWxzOworICBpZmFjZS0+c2V0X3ZhbHVlID0gZ3N0X3ZpZGVvX2JhbGFuY2VfY29sb3JiYWxhbmNlX3NldF92YWx1ZTsKKyAgaWZhY2UtPmdldF92YWx1ZSA9IGdzdF92aWRlb19iYWxhbmNlX2NvbG9yYmFsYW5jZV9nZXRfdmFsdWU7CisgIGlmYWNlLT5nZXRfYmFsYW5jZV90eXBlID0gZ3N0X3ZpZGVvX2JhbGFuY2VfY29sb3JiYWxhbmNlX2dldF9iYWxhbmNlX3R5cGU7Cit9CisKK3N0YXRpYyBHc3RDb2xvckJhbGFuY2VDaGFubmVsICoKK2dzdF92aWRlb19iYWxhbmNlX2ZpbmRfY2hhbm5lbCAoR3N0VmlkZW9CYWxhbmNlICogYmFsYW5jZSwgY29uc3QgZ2NoYXIgKiBsYWJlbCkKK3sKKyAgR0xpc3QgKmw7CisKKyAgZm9yIChsID0gYmFsYW5jZS0+Y2hhbm5lbHM7IGw7IGwgPSBsLT5uZXh0KSB7CisgICAgR3N0Q29sb3JCYWxhbmNlQ2hhbm5lbCAqY2hhbm5lbCA9IGwtPmRhdGE7CisKKyAgICBpZiAoZ19hc2NpaV9zdHJjYXNlY21wIChjaGFubmVsLT5sYWJlbCwgbGFiZWwpID09IDApCisgICAgICByZXR1cm4gY2hhbm5lbDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19iYWxhbmNlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWaWRlb0JhbGFuY2UgKmJhbGFuY2UgPSBHU1RfVklERU9fQkFMQU5DRSAob2JqZWN0KTsKKyAgZ2RvdWJsZSBkOworICBjb25zdCBnY2hhciAqbGFiZWwgPSBOVUxMOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoYmFsYW5jZSk7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DT05UUkFTVDoKKyAgICAgIGQgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhbGFuY2UsICJDaGFuZ2luZyBjb250cmFzdCBmcm9tICVsZiB0byAlbGYiLAorICAgICAgICAgIGJhbGFuY2UtPmNvbnRyYXN0LCBkKTsKKyAgICAgIGlmIChkICE9IGJhbGFuY2UtPmNvbnRyYXN0KQorICAgICAgICBsYWJlbCA9ICJDT05UUkFTVCI7CisgICAgICBiYWxhbmNlLT5jb250cmFzdCA9IGQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQlJJR0hUTkVTUzoKKyAgICAgIGQgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhbGFuY2UsICJDaGFuZ2luZyBicmlnaHRuZXNzIGZyb20gJWxmIHRvICVsZiIsCisgICAgICAgICAgYmFsYW5jZS0+YnJpZ2h0bmVzcywgZCk7CisgICAgICBpZiAoZCAhPSBiYWxhbmNlLT5icmlnaHRuZXNzKQorICAgICAgICBsYWJlbCA9ICJCUklHSFRORVNTIjsKKyAgICAgIGJhbGFuY2UtPmJyaWdodG5lc3MgPSBkOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0hVRToKKyAgICAgIGQgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhbGFuY2UsICJDaGFuZ2luZyBodWUgZnJvbSAlbGYgdG8gJWxmIiwgYmFsYW5jZS0+aHVlLAorICAgICAgICAgIGQpOworICAgICAgaWYgKGQgIT0gYmFsYW5jZS0+aHVlKQorICAgICAgICBsYWJlbCA9ICJIVUUiOworICAgICAgYmFsYW5jZS0+aHVlID0gZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TQVRVUkFUSU9OOgorICAgICAgZCA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFsYW5jZSwgIkNoYW5naW5nIHNhdHVyYXRpb24gZnJvbSAlbGYgdG8gJWxmIiwKKyAgICAgICAgICBiYWxhbmNlLT5zYXR1cmF0aW9uLCBkKTsKKyAgICAgIGlmIChkICE9IGJhbGFuY2UtPnNhdHVyYXRpb24pCisgICAgICAgIGxhYmVsID0gIlNBVFVSQVRJT04iOworICAgICAgYmFsYW5jZS0+c2F0dXJhdGlvbiA9IGQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGJhbGFuY2UpOworICBnc3RfdmlkZW9fYmFsYW5jZV91cGRhdGVfcHJvcGVydGllcyAoYmFsYW5jZSk7CisKKyAgaWYgKGxhYmVsKSB7CisgICAgR3N0Q29sb3JCYWxhbmNlQ2hhbm5lbCAqY2hhbm5lbCA9CisgICAgICAgIGdzdF92aWRlb19iYWxhbmNlX2ZpbmRfY2hhbm5lbCAoYmFsYW5jZSwgbGFiZWwpOworICAgIGdzdF9jb2xvcl9iYWxhbmNlX3ZhbHVlX2NoYW5nZWQgKEdTVF9DT0xPUl9CQUxBTkNFIChiYWxhbmNlKSwgY2hhbm5lbCwKKyAgICAgICAgZ3N0X2NvbG9yX2JhbGFuY2VfZ2V0X3ZhbHVlIChHU1RfQ09MT1JfQkFMQU5DRSAoYmFsYW5jZSksIGNoYW5uZWwpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2JhbGFuY2VfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFZpZGVvQmFsYW5jZSAqYmFsYW5jZSA9IEdTVF9WSURFT19CQUxBTkNFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DT05UUkFTVDoKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIGJhbGFuY2UtPmNvbnRyYXN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9CUklHSFRORVNTOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgYmFsYW5jZS0+YnJpZ2h0bmVzcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSFVFOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgYmFsYW5jZS0+aHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TQVRVUkFUSU9OOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgYmFsYW5jZS0+c2F0dXJhdGlvbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmggYi9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9iYWxhbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5ZjkyMQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2JhbGFuY2UuaApAQCAtMCwwICsxLDc5IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1ZJREVPX0JBTEFOQ0VfSF9fCisjZGVmaW5lIF9fR1NUX1ZJREVPX0JBTEFOQ0VfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WSURFT19CQUxBTkNFIFwKKyAgKGdzdF92aWRlb19iYWxhbmNlX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WSURFT19CQUxBTkNFKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVklERU9fQkFMQU5DRSxHc3RWaWRlb0JhbGFuY2UpKQorI2RlZmluZSBHU1RfVklERU9fQkFMQU5DRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WSURFT19CQUxBTkNFLEdzdFZpZGVvQmFsYW5jZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1ZJREVPX0JBTEFOQ0Uob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WSURFT19CQUxBTkNFKSkKKyNkZWZpbmUgR1NUX0lTX1ZJREVPX0JBTEFOQ0VfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVklERU9fQkFMQU5DRSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWaWRlb0JhbGFuY2UgR3N0VmlkZW9CYWxhbmNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZpZGVvQmFsYW5jZUNsYXNzIEdzdFZpZGVvQmFsYW5jZUNsYXNzOworCisvKioKKyAqIEdzdFZpZGVvQmFsYW5jZToKKyAqCisgKiBPcGFxdWUgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0VmlkZW9CYWxhbmNlIHsKKyAgR3N0VmlkZW9GaWx0ZXIgdmlkZW9maWx0ZXI7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKworICAvKiBjaGFubmVscyBmb3IgaW50ZXJmYWNlICovCisgIEdMaXN0ICpjaGFubmVsczsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIGdkb3VibGUgY29udHJhc3Q7CisgIGdkb3VibGUgYnJpZ2h0bmVzczsKKyAgZ2RvdWJsZSBodWU7CisgIGdkb3VibGUgc2F0dXJhdGlvbjsKKworICAvKiB0YWJsZXMgKi8KKyAgZ3VpbnQ4IHRhYmxleVsyNTZdOworICBndWludDggKnRhYmxldVsyNTZdOworICBndWludDggKnRhYmxldlsyNTZdOworCisgIHZvaWQgKCpwcm9jZXNzKSAoR3N0VmlkZW9CYWxhbmNlICpiYWxhbmNlLCBHc3RWaWRlb0ZyYW1lICpmcmFtZSk7Cit9OworCitzdHJ1Y3QgX0dzdFZpZGVvQmFsYW5jZUNsYXNzIHsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfdmlkZW9fYmFsYW5jZV9nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1ZJREVPX0JBTEFOQ0VfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmMgYi9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9mbGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxMzJmNQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuYwpAQCAtMCwwICsxLDEzNDYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDM+IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICogQ29weXJpZ2h0IChDKSA8MjAxMD4gU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDExPiBZb3VuZXNzIEFsYW91aSA8eW91bmVzcy5hbGFvdWlAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2FzIChwcm9iYWJseSkgZ2VuZXJhdGVkIGZyb20gZ3N0dmlkZW9mbGlwLmMsCisgKiBnc3R2aWRlb2ZsaXAuYyx2IDEuNyAyMDAzLzExLzA4IDAyOjQ4OjU5IGRzY2hsZWVmIEV4cCAKKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtdmlkZW9mbGlwCisgKgorICogRmxpcHMgYW5kIHJvdGF0ZXMgdmlkZW8uCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyAhIHZpZGVvZmxpcCBtZXRob2Q9Y2xvY2t3aXNlICEgdmlkZW9jb252ZXJ0ICEgeGltYWdlc2luaworICogXXwgVGhpcyBwaXBlbGluZSBmbGlwcyB0aGUgdGVzdCBpbWFnZSA5MCBkZWdyZWVzIGNsb2Nrd2lzZS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3R2aWRlb2ZsaXAuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworLyogR3N0VmlkZW9GbGlwIHByb3BlcnRpZXMgKi8KK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX01FVEhPRCwKKyAgUFJPUF9WSURFT19ESVJFQ1RJT04KKyAgICAgIC8qIEZJTEwgTUUgKi8KK307CisKKyNkZWZpbmUgUFJPUF9NRVRIT0RfREVGQVVMVCBHU1RfVklERU9fRkxJUF9NRVRIT0RfSURFTlRJVFkKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAodmlkZW9fZmxpcF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCB2aWRlb19mbGlwX2RlYnVnCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBnc3RfdmlkZW9fZmxpcF9zcmNfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgQVlVViwgIgorICAgICAgICAgICAgIkFSR0IsIEJHUkEsIEFCR1IsIFJHQkEsIFk0NDQsIHhSR0IsIFJHQngsIHhCR1IsIEJHUngsICIKKyAgICAgICAgICAgICJSR0IsIEJHUiwgSTQyMCwgWVYxMiwgSVlVViwgWVVZMiwgVVlWWSwgWVZZVSwgTlYxMiwgTlYyMSwgIgorICAgICAgICAgICAgIkdSQVk4LCBHUkFZMTZfQkUsIEdSQVkxNl9MRSB9IikpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGdzdF92aWRlb19mbGlwX3NpbmtfdGVtcGxhdGUgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBBWVVWLCAiCisgICAgICAgICAgICAiQVJHQiwgQkdSQSwgQUJHUiwgUkdCQSwgWTQ0NCwgeFJHQiwgUkdCeCwgeEJHUiwgQkdSeCwgIgorICAgICAgICAgICAgIlJHQiwgQkdSLCBJNDIwLCBZVjEyLCBJWVVWLCBZVVkyLCBVWVZZLCBZVllVLCBOVjEyLCBOVjIxLCAiCisgICAgICAgICAgICAiR1JBWTgsIEdSQVkxNl9CRSwgR1JBWTE2X0xFIH0iKSkKKyAgICApOworCisjZGVmaW5lIEdTVF9UWVBFX1ZJREVPX0ZMSVBfTUVUSE9EIChnc3RfdmlkZW9fZmxpcF9tZXRob2RfZ2V0X3R5cGUoKSkKKworc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdmlkZW9fZmxpcF9tZXRob2RzW10gPSB7CisgIHtHU1RfVklERU9fRkxJUF9NRVRIT0RfSURFTlRJVFksICJJZGVudGl0eSAobm8gcm90YXRpb24pIiwgIm5vbmUifSwKKyAge0dTVF9WSURFT19GTElQX01FVEhPRF85MFIsICJSb3RhdGUgY2xvY2t3aXNlIDkwIGRlZ3JlZXMiLCAiY2xvY2t3aXNlIn0sCisgIHtHU1RfVklERU9fRkxJUF9NRVRIT0RfMTgwLCAiUm90YXRlIDE4MCBkZWdyZWVzIiwgInJvdGF0ZS0xODAifSwKKyAge0dTVF9WSURFT19GTElQX01FVEhPRF85MEwsICJSb3RhdGUgY291bnRlci1jbG9ja3dpc2UgOTAgZGVncmVlcyIsCisgICAgICAiY291bnRlcmNsb2Nrd2lzZSJ9LAorICB7R1NUX1ZJREVPX0ZMSVBfTUVUSE9EX0hPUklaLCAiRmxpcCBob3Jpem9udGFsbHkiLCAiaG9yaXpvbnRhbC1mbGlwIn0sCisgIHtHU1RfVklERU9fRkxJUF9NRVRIT0RfVkVSVCwgIkZsaXAgdmVydGljYWxseSIsICJ2ZXJ0aWNhbC1mbGlwIn0sCisgIHtHU1RfVklERU9fRkxJUF9NRVRIT0RfVFJBTlMsCisgICAgICAiRmxpcCBhY3Jvc3MgdXBwZXIgbGVmdC9sb3dlciByaWdodCBkaWFnb25hbCIsICJ1cHBlci1sZWZ0LWRpYWdvbmFsIn0sCisgIHtHU1RfVklERU9fRkxJUF9NRVRIT0RfT1RIRVIsCisgICAgICAiRmxpcCBhY3Jvc3MgdXBwZXIgcmlnaHQvbG93ZXIgbGVmdCBkaWFnb25hbCIsICJ1cHBlci1yaWdodC1kaWFnb25hbCJ9LAorICB7R1NUX1ZJREVPX0ZMSVBfTUVUSE9EX0FVVE8sCisgICAgICAiU2VsZWN0IGZsaXAgbWV0aG9kIGJhc2VkIG9uIGltYWdlLW9yaWVudGF0aW9uIHRhZyIsICJhdXRvbWF0aWMifSwKKyAgezAsIE5VTEwsIE5VTEx9LAorfTsKKworc3RhdGljIEdUeXBlCitnc3RfdmlkZW9fZmxpcF9tZXRob2RfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB2aWRlb19mbGlwX21ldGhvZF90eXBlID0gMDsKKworICBpZiAoIXZpZGVvX2ZsaXBfbWV0aG9kX3R5cGUpIHsKKyAgICB2aWRlb19mbGlwX21ldGhvZF90eXBlID0gZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFZpZGVvRmxpcE1ldGhvZCIsCisgICAgICAgIHZpZGVvX2ZsaXBfbWV0aG9kcyk7CisgIH0KKyAgcmV0dXJuIHZpZGVvX2ZsaXBfbWV0aG9kX3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fZmxpcF92aWRlb19kaXJlY3Rpb25faW50ZXJmYWNlX2luaXQgKEdzdFZpZGVvRGlyZWN0aW9uSW50ZXJmYWNlICoKKyAgICBpZmFjZSkKK3sKKyAgLyogV2UgaW1wbGVtZW50IHRoZSB2aWRlby1kaXJlY3Rpb24gcHJvcGVydHkgKi8KK30KKworI2RlZmluZSBnc3RfdmlkZW9fZmxpcF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoR3N0VmlkZW9GbGlwLCBnc3RfdmlkZW9fZmxpcCwgR1NUX1RZUEVfVklERU9fRklMVEVSLAorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfVklERU9fRElSRUNUSU9OLAorICAgICAgICBnc3RfdmlkZW9fZmxpcF92aWRlb19kaXJlY3Rpb25faW50ZXJmYWNlX2luaXQpKTsKKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3ZpZGVvX2ZsaXBfdHJhbnNmb3JtX2NhcHMgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RDYXBzICogY2FwcywgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0VmlkZW9GbGlwICp2aWRlb2ZsaXAgPSBHU1RfVklERU9fRkxJUCAodHJhbnMpOworICBHc3RDYXBzICpyZXQ7CisgIGdpbnQgd2lkdGgsIGhlaWdodCwgaTsKKworICByZXQgPSBnc3RfY2Fwc19jb3B5IChjYXBzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZ3N0X2NhcHNfZ2V0X3NpemUgKHJldCk7IGkrKykgeworICAgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAocmV0LCBpKTsKKyAgICBnaW50IHBhcl9uLCBwYXJfZDsKKworICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIndpZHRoIiwgJndpZHRoKSAmJgorICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImhlaWdodCIsICZoZWlnaHQpKSB7CisKKyAgICAgIHN3aXRjaCAodmlkZW9mbGlwLT5hY3RpdmVfbWV0aG9kKSB7CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OXzkwUjoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fOTBMOgorICAgICAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9VTF9MUjoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fVVJfTEw6CisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cnVjdHVyZSwgIndpZHRoIiwgR19UWVBFX0lOVCwgaGVpZ2h0LAorICAgICAgICAgICAgICAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgd2lkdGgsIE5VTEwpOworICAgICAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9mcmFjdGlvbiAoc3RydWN0dXJlLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwKKyAgICAgICAgICAgICAgICAgICZwYXJfbiwgJnBhcl9kKSkgeworICAgICAgICAgICAgaWYgKHBhcl9uICE9IDEgfHwgcGFyX2QgIT0gMSkgeworICAgICAgICAgICAgICBHVmFsdWUgdmFsID0geyAwLCB9OworCisgICAgICAgICAgICAgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR1NUX1RZUEVfRlJBQ1RJT04pOworICAgICAgICAgICAgICBnc3RfdmFsdWVfc2V0X2ZyYWN0aW9uICgmdmFsLCBwYXJfZCwgcGFyX24pOworICAgICAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAoc3RydWN0dXJlLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgJnZhbCk7CisgICAgICAgICAgICAgIGdfdmFsdWVfdW5zZXQgKCZ2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fSURFTlRJVFk6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OXzE4MDoKKyAgICAgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fSE9SSVo6CisgICAgICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OX1ZFUlQ6CisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cnVjdHVyZSwgIndpZHRoIiwgR19UWVBFX0lOVCwgd2lkdGgsCisgICAgICAgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBoZWlnaHQsIE5VTEwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9DVVNUT006CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2aWRlb2ZsaXAsICJ1bnN1cG9ydGVkIGN1c3RvbSBvcmllbnRhdGlvbiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHZpZGVvZmxpcCwgInRyYW5zZm9ybWVkICUiIEdTVF9QVFJfRk9STUFUICIgdG8gJSIKKyAgICAgIEdTVF9QVFJfRk9STUFULCBjYXBzLCByZXQpOworCisgIGlmIChmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICppbnRlcnNlY3Rpb247CisKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb2ZsaXAsICJVc2luZyBmaWx0ZXIgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgZmlsdGVyKTsKKyAgICBpbnRlcnNlY3Rpb24gPQorICAgICAgICBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCByZXQsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHJldCk7CisgICAgcmV0ID0gaW50ZXJzZWN0aW9uOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHZpZGVvZmxpcCwgIkludGVyc2VjdGlvbiAlIiBHU1RfUFRSX0ZPUk1BVCwgcmV0KTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fZmxpcF9wbGFuYXJfeXV2IChHc3RWaWRlb0ZsaXAgKiB2aWRlb2ZsaXAsIEdzdFZpZGVvRnJhbWUgKiBkZXN0LAorICAgIGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBzcmMpCit7CisgIGdpbnQgeCwgeTsKKyAgZ3VpbnQ4IGNvbnN0ICpzOworICBndWludDggKmQ7CisgIGdpbnQgc3JjX3lfc3RyaWRlLCBzcmNfdV9zdHJpZGUsIHNyY192X3N0cmlkZTsKKyAgZ2ludCBzcmNfeV9oZWlnaHQsIHNyY191X2hlaWdodCwgc3JjX3ZfaGVpZ2h0OworICBnaW50IHNyY195X3dpZHRoLCBzcmNfdV93aWR0aCwgc3JjX3Zfd2lkdGg7CisgIGdpbnQgZGVzdF95X3N0cmlkZSwgZGVzdF91X3N0cmlkZSwgZGVzdF92X3N0cmlkZTsKKyAgZ2ludCBkZXN0X3lfaGVpZ2h0LCBkZXN0X3VfaGVpZ2h0LCBkZXN0X3ZfaGVpZ2h0OworICBnaW50IGRlc3RfeV93aWR0aCwgZGVzdF91X3dpZHRoLCBkZXN0X3Zfd2lkdGg7CisKKyAgc3JjX3lfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoc3JjLCAwKTsKKyAgc3JjX3Vfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoc3JjLCAxKTsKKyAgc3JjX3Zfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoc3JjLCAyKTsKKworICBkZXN0X3lfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoZGVzdCwgMCk7CisgIGRlc3RfdV9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChkZXN0LCAxKTsKKyAgZGVzdF92X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKGRlc3QsIDIpOworCisgIHNyY195X3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKHNyYywgMCk7CisgIHNyY191X3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKHNyYywgMSk7CisgIHNyY192X3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKHNyYywgMik7CisKKyAgZGVzdF95X3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGRlc3QsIDApOworICBkZXN0X3Vfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZGVzdCwgMSk7CisgIGRlc3Rfdl93aWR0aCA9IEdTVF9WSURFT19GUkFNRV9DT01QX1dJRFRIIChkZXN0LCAyKTsKKworICBzcmNfeV9oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9IRUlHSFQgKHNyYywgMCk7CisgIHNyY191X2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoc3JjLCAxKTsKKyAgc3JjX3ZfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChzcmMsIDIpOworCisgIGRlc3RfeV9oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9IRUlHSFQgKGRlc3QsIDApOworICBkZXN0X3VfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChkZXN0LCAxKTsKKyAgZGVzdF92X2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZGVzdCwgMik7CisKKyAgc3dpdGNoICh2aWRlb2ZsaXAtPmFjdGl2ZV9tZXRob2QpIHsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl85MFI6CisgICAgICAvKiBGbGlwIFkgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAwKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMCk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF95X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3lfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3RfeV9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY195X2hlaWdodCAtIDEgLSB4KSAqIHNyY195X3N0cmlkZSArIHldOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBGbGlwIFUgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAxKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMSk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF91X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3Vfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3RfdV9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY191X2hlaWdodCAtIDEgLSB4KSAqIHNyY191X3N0cmlkZSArIHldOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBGbGlwIFYgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAyKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMik7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF92X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3Zfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3Rfdl9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY192X2hlaWdodCAtIDEgLSB4KSAqIHNyY192X3N0cmlkZSArIHldOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl85MEw6CisgICAgICAvKiBGbGlwIFkgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAwKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMCk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF95X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3lfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3RfeV9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbeCAqIHNyY195X3N0cmlkZSArIChzcmNfeV93aWR0aCAtIDEgLSB5KV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIEZsaXAgVSAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDEpOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAxKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3VfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfdV93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF91X3N0cmlkZSArIHhdID0KKyAgICAgICAgICAgICAgc1t4ICogc3JjX3Vfc3RyaWRlICsgKHNyY191X3dpZHRoIC0gMSAtIHkpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogRmxpcCBWICovCisgICAgICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMik7CisgICAgICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3QsIDIpOworICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc3Rfdl9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzdF92X3dpZHRoOyB4KyspIHsKKyAgICAgICAgICBkW3kgKiBkZXN0X3Zfc3RyaWRlICsgeF0gPQorICAgICAgICAgICAgICBzW3ggKiBzcmNfdl9zdHJpZGUgKyAoc3JjX3Zfd2lkdGggLSAxIC0geSldOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl8xODA6CisgICAgICAvKiBGbGlwIFkgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAwKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMCk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF95X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3lfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3RfeV9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY195X2hlaWdodCAtIDEgLSB5KSAqIHNyY195X3N0cmlkZSArIChzcmNfeV93aWR0aCAtIDEgLSB4KV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIEZsaXAgVSAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDEpOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAxKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3VfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfdV93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF91X3N0cmlkZSArIHhdID0KKyAgICAgICAgICAgICAgc1soc3JjX3VfaGVpZ2h0IC0gMSAtIHkpICogc3JjX3Vfc3RyaWRlICsgKHNyY191X3dpZHRoIC0gMSAtIHgpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogRmxpcCBWICovCisgICAgICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMik7CisgICAgICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3QsIDIpOworICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc3Rfdl9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzdF92X3dpZHRoOyB4KyspIHsKKyAgICAgICAgICBkW3kgKiBkZXN0X3Zfc3RyaWRlICsgeF0gPQorICAgICAgICAgICAgICBzWyhzcmNfdl9oZWlnaHQgLSAxIC0geSkgKiBzcmNfdl9zdHJpZGUgKyAoc3JjX3Zfd2lkdGggLSAxIC0geCldOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9IT1JJWjoKKyAgICAgIC8qIEZsaXAgWSAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDApOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAwKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3lfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfeV93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF95X3N0cmlkZSArIHhdID0KKyAgICAgICAgICAgICAgc1t5ICogc3JjX3lfc3RyaWRlICsgKHNyY195X3dpZHRoIC0gMSAtIHgpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogRmxpcCBVICovCisgICAgICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMSk7CisgICAgICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3QsIDEpOworICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc3RfdV9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzdF91X3dpZHRoOyB4KyspIHsKKyAgICAgICAgICBkW3kgKiBkZXN0X3Vfc3RyaWRlICsgeF0gPQorICAgICAgICAgICAgICBzW3kgKiBzcmNfdV9zdHJpZGUgKyAoc3JjX3Vfd2lkdGggLSAxIC0geCldOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBGbGlwIFYgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAyKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMik7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF92X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3Zfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3Rfdl9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbeSAqIHNyY192X3N0cmlkZSArIChzcmNfdl93aWR0aCAtIDEgLSB4KV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OX1ZFUlQ6CisgICAgICAvKiBGbGlwIFkgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAwKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMCk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF95X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3lfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3RfeV9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY195X2hlaWdodCAtIDEgLSB5KSAqIHNyY195X3N0cmlkZSArIHhdOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBGbGlwIFUgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAxKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMSk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF91X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3Vfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3RfdV9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY191X2hlaWdodCAtIDEgLSB5KSAqIHNyY191X3N0cmlkZSArIHhdOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBGbGlwIFYgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAyKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMik7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF92X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3Zfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3Rfdl9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY192X2hlaWdodCAtIDEgLSB5KSAqIHNyY192X3N0cmlkZSArIHhdOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9VTF9MUjoKKyAgICAgIC8qIEZsaXAgWSAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDApOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAwKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3lfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfeV93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF95X3N0cmlkZSArIHhdID0gc1t4ICogc3JjX3lfc3RyaWRlICsgeV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIEZsaXAgVSAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDEpOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAxKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3VfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfdV93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF91X3N0cmlkZSArIHhdID0gc1t4ICogc3JjX3Vfc3RyaWRlICsgeV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIEZsaXAgViAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDIpOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAyKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3VfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfdV93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF92X3N0cmlkZSArIHhdID0gc1t4ICogc3JjX3Zfc3RyaWRlICsgeV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OX1VSX0xMOgorICAgICAgLyogRmxpcCBZICovCisgICAgICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMCk7CisgICAgICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3QsIDApOworICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc3RfeV9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzdF95X3dpZHRoOyB4KyspIHsKKyAgICAgICAgICBkW3kgKiBkZXN0X3lfc3RyaWRlICsgeF0gPQorICAgICAgICAgICAgICBzWyhzcmNfeV9oZWlnaHQgLSAxIC0geCkgKiBzcmNfeV9zdHJpZGUgKyAoc3JjX3lfd2lkdGggLSAxIC0geSldOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBGbGlwIFUgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAxKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMSk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF91X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3Vfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3RfdV9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY191X2hlaWdodCAtIDEgLSB4KSAqIHNyY191X3N0cmlkZSArIChzcmNfdV93aWR0aCAtIDEgLSB5KV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIEZsaXAgViAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDIpOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAyKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3ZfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3Rfdl93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF92X3N0cmlkZSArIHhdID0KKyAgICAgICAgICAgICAgc1soc3JjX3ZfaGVpZ2h0IC0gMSAtIHgpICogc3JjX3Zfc3RyaWRlICsgKHNyY192X3dpZHRoIC0gMSAtIHkpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fSURFTlRJVFk6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fZmxpcF9zZW1pX3BsYW5hcl95dXYgKEdzdFZpZGVvRmxpcCAqIHZpZGVvZmxpcCwgR3N0VmlkZW9GcmFtZSAqIGRlc3QsCisgICAgY29uc3QgR3N0VmlkZW9GcmFtZSAqIHNyYykKK3sKKyAgZ2ludCB4LCB5OworICBndWludDggY29uc3QgKnM7CisgIGd1aW50OCAqZDsKKyAgZ2ludCBzX29mZiwgZF9vZmY7CisgIGdpbnQgc3JjX3lfc3RyaWRlLCBzcmNfdXZfc3RyaWRlOworICBnaW50IHNyY195X2hlaWdodCwgc3JjX3V2X2hlaWdodDsKKyAgZ2ludCBzcmNfeV93aWR0aCwgc3JjX3V2X3dpZHRoOworICBnaW50IGRlc3RfeV9zdHJpZGUsIGRlc3RfdXZfc3RyaWRlOworICBnaW50IGRlc3RfeV9oZWlnaHQsIGRlc3RfdXZfaGVpZ2h0OworICBnaW50IGRlc3RfeV93aWR0aCwgZGVzdF91dl93aWR0aDsKKworCisgIHNyY195X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKHNyYywgMCk7CisgIHNyY191dl9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChzcmMsIDEpOworCisgIGRlc3RfeV9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChkZXN0LCAwKTsKKyAgZGVzdF91dl9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChkZXN0LCAxKTsKKworICBzcmNfeV93aWR0aCA9IEdTVF9WSURFT19GUkFNRV9DT01QX1dJRFRIIChzcmMsIDApOworICBzcmNfdXZfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoc3JjLCAxKTsKKworICBkZXN0X3lfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZGVzdCwgMCk7CisgIGRlc3RfdXZfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZGVzdCwgMSk7CisKKyAgc3JjX3lfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChzcmMsIDApOworICBzcmNfdXZfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChzcmMsIDEpOworCisgIGRlc3RfeV9oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9IRUlHSFQgKGRlc3QsIDApOworICBkZXN0X3V2X2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZGVzdCwgMSk7CisKKyAgc3dpdGNoICh2aWRlb2ZsaXAtPmFjdGl2ZV9tZXRob2QpIHsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl85MFI6CisgICAgICAvKiBGbGlwIFkgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAwKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMCk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF95X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3lfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3RfeV9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY195X2hlaWdodCAtIDEgLSB4KSAqIHNyY195X3N0cmlkZSArIHldOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBGbGlwIFVWICovCisgICAgICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMSk7CisgICAgICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3QsIDEpOworICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc3RfdXZfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfdXZfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRfb2ZmID0geSAqIGRlc3RfdXZfc3RyaWRlICsgeCAqIDI7CisgICAgICAgICAgc19vZmYgPSAoc3JjX3V2X2hlaWdodCAtIDEgLSB4KSAqIHNyY191dl9zdHJpZGUgKyB5ICogMjsKKyAgICAgICAgICBkW2Rfb2ZmXSA9IHNbc19vZmZdOworICAgICAgICAgIGRbZF9vZmYgKyAxXSA9IHNbc19vZmYgKyAxXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fOTBMOgorICAgICAgLyogRmxpcCBZICovCisgICAgICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMCk7CisgICAgICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3QsIDApOworICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc3RfeV9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzdF95X3dpZHRoOyB4KyspIHsKKyAgICAgICAgICBkW3kgKiBkZXN0X3lfc3RyaWRlICsgeF0gPQorICAgICAgICAgICAgICBzW3ggKiBzcmNfeV9zdHJpZGUgKyAoc3JjX3lfd2lkdGggLSAxIC0geSldOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBGbGlwIFVWICovCisgICAgICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMSk7CisgICAgICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3QsIDEpOworICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc3RfdXZfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfdXZfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRfb2ZmID0geSAqIGRlc3RfdXZfc3RyaWRlICsgeCAqIDI7CisgICAgICAgICAgc19vZmYgPSB4ICogc3JjX3V2X3N0cmlkZSArIChzcmNfdXZfd2lkdGggLSAxIC0geSkgKiAyOworICAgICAgICAgIGRbZF9vZmZdID0gc1tzX29mZl07CisgICAgICAgICAgZFtkX29mZiArIDFdID0gc1tzX29mZiArIDFdOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl8xODA6CisgICAgICAvKiBGbGlwIFkgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAwKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMCk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF95X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3lfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRbeSAqIGRlc3RfeV9zdHJpZGUgKyB4XSA9CisgICAgICAgICAgICAgIHNbKHNyY195X2hlaWdodCAtIDEgLSB5KSAqIHNyY195X3N0cmlkZSArIChzcmNfeV93aWR0aCAtIDEgLSB4KV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIEZsaXAgVVYgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAxKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMSk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF91dl9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzdF91dl93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZF9vZmYgPSB5ICogZGVzdF91dl9zdHJpZGUgKyB4ICogMjsKKyAgICAgICAgICBzX29mZiA9IChzcmNfdXZfaGVpZ2h0IC0gMSAtIHkpICogc3JjX3V2X3N0cmlkZSArIChzcmNfdXZfd2lkdGggLSAxIC0KKyAgICAgICAgICAgICAgeCkgKiAyOworICAgICAgICAgIGRbZF9vZmZdID0gc1tzX29mZl07CisgICAgICAgICAgZFtkX29mZiArIDFdID0gc1tzX29mZiArIDFdOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9IT1JJWjoKKyAgICAgIC8qIEZsaXAgWSAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDApOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAwKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3lfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfeV93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF95X3N0cmlkZSArIHhdID0KKyAgICAgICAgICAgICAgc1t5ICogc3JjX3lfc3RyaWRlICsgKHNyY195X3dpZHRoIC0gMSAtIHgpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogRmxpcCBVViAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDEpOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAxKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3V2X2hlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkZXN0X3V2X3dpZHRoOyB4KyspIHsKKyAgICAgICAgICBkX29mZiA9IHkgKiBkZXN0X3V2X3N0cmlkZSArIHggKiAyOworICAgICAgICAgIHNfb2ZmID0geSAqIHNyY191dl9zdHJpZGUgKyAoc3JjX3V2X3dpZHRoIC0gMSAtIHgpICogMjsKKyAgICAgICAgICBkW2Rfb2ZmXSA9IHNbc19vZmZdOworICAgICAgICAgIGRbZF9vZmYgKyAxXSA9IHNbc19vZmYgKyAxXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fVkVSVDoKKyAgICAgIC8qIEZsaXAgWSAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDApOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAwKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3lfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfeV93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF95X3N0cmlkZSArIHhdID0KKyAgICAgICAgICAgICAgc1soc3JjX3lfaGVpZ2h0IC0gMSAtIHkpICogc3JjX3lfc3RyaWRlICsgeF07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIEZsaXAgVVYgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAxKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMSk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF91dl9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzdF91dl93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZF9vZmYgPSB5ICogZGVzdF91dl9zdHJpZGUgKyB4ICogMjsKKyAgICAgICAgICBzX29mZiA9IChzcmNfdXZfaGVpZ2h0IC0gMSAtIHkpICogc3JjX3V2X3N0cmlkZSArIHggKiAyOworICAgICAgICAgIGRbZF9vZmZdID0gc1tzX29mZl07CisgICAgICAgICAgZFtkX29mZiArIDFdID0gc1tzX29mZiArIDFdOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9VTF9MUjoKKyAgICAgIC8qIEZsaXAgWSAqLworICAgICAgcyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmMsIDApOworICAgICAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAwKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkZXN0X3lfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfeV93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZFt5ICogZGVzdF95X3N0cmlkZSArIHhdID0gc1t4ICogc3JjX3lfc3RyaWRlICsgeV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIEZsaXAgVVYgKi8KKyAgICAgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAxKTsKKyAgICAgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMSk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGVzdF91dl9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzdF91dl93aWR0aDsgeCsrKSB7CisgICAgICAgICAgZF9vZmYgPSB5ICogZGVzdF91dl9zdHJpZGUgKyB4ICogMjsKKyAgICAgICAgICBzX29mZiA9IHggKiBzcmNfdXZfc3RyaWRlICsgeSAqIDI7CisgICAgICAgICAgZFtkX29mZl0gPSBzW3Nfb2ZmXTsKKyAgICAgICAgICBkW2Rfb2ZmICsgMV0gPSBzW3Nfb2ZmICsgMV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OX1VSX0xMOgorICAgICAgLyogRmxpcCBZICovCisgICAgICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMCk7CisgICAgICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3QsIDApOworICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc3RfeV9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZGVzdF95X3dpZHRoOyB4KyspIHsKKyAgICAgICAgICBkW3kgKiBkZXN0X3lfc3RyaWRlICsgeF0gPQorICAgICAgICAgICAgICBzWyhzcmNfeV9oZWlnaHQgLSAxIC0geCkgKiBzcmNfeV9zdHJpZGUgKyAoc3JjX3lfd2lkdGggLSAxIC0geSldOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBGbGlwIFVWICovCisgICAgICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMSk7CisgICAgICBkID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3QsIDEpOworICAgICAgZm9yICh5ID0gMDsgeSA8IGRlc3RfdXZfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3RfdXZfd2lkdGg7IHgrKykgeworICAgICAgICAgIGRfb2ZmID0geSAqIGRlc3RfdXZfc3RyaWRlICsgeCAqIDI7CisgICAgICAgICAgc19vZmYgPSAoc3JjX3V2X2hlaWdodCAtIDEgLSB4KSAqIHNyY191dl9zdHJpZGUgKyAoc3JjX3V2X3dpZHRoIC0gMSAtCisgICAgICAgICAgICAgIHkpICogMjsKKyAgICAgICAgICBkW2Rfb2ZmXSA9IHNbc19vZmZdOworICAgICAgICAgIGRbZF9vZmYgKyAxXSA9IHNbc19vZmYgKyAxXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fSURFTlRJVFk6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fZmxpcF9wYWNrZWRfc2ltcGxlIChHc3RWaWRlb0ZsaXAgKiB2aWRlb2ZsaXAsIEdzdFZpZGVvRnJhbWUgKiBkZXN0LAorICAgIGNvbnN0IEdzdFZpZGVvRnJhbWUgKiBzcmMpCit7CisgIGdpbnQgeCwgeSwgejsKKyAgZ3VpbnQ4IGNvbnN0ICpzOworICBndWludDggKmQ7CisgIGdpbnQgc3cgPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKHNyYyk7CisgIGdpbnQgc2ggPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChzcmMpOworICBnaW50IGR3ID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChkZXN0KTsKKyAgZ2ludCBkaCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGRlc3QpOworICBnaW50IHNyY19zdHJpZGUsIGRlc3Rfc3RyaWRlOworICBnaW50IGJwcDsKKworICBzID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyYywgMCk7CisgIGQgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdCwgMCk7CisKKyAgc3JjX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKHNyYywgMCk7CisgIGRlc3Rfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoZGVzdCwgMCk7CisgIC8qIFRoaXMgaXMgb25seSB0cnVlIGZvciBub24tc3Vic2FtcGxlZCBmb3JtYXRzISAqLworICBicHAgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFIChzcmMsIDApOworCisgIHN3aXRjaCAodmlkZW9mbGlwLT5hY3RpdmVfbWV0aG9kKSB7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fOTBSOgorICAgICAgZm9yICh5ID0gMDsgeSA8IGRoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGR3OyB4KyspIHsKKyAgICAgICAgICBmb3IgKHogPSAwOyB6IDwgYnBwOyB6KyspIHsKKyAgICAgICAgICAgIGRbeSAqIGRlc3Rfc3RyaWRlICsgeCAqIGJwcCArIHpdID0KKyAgICAgICAgICAgICAgICBzWyhzaCAtIDEgLSB4KSAqIHNyY19zdHJpZGUgKyB5ICogYnBwICsgel07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl85MEw6CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZHc7IHgrKykgeworICAgICAgICAgIGZvciAoeiA9IDA7IHogPCBicHA7IHorKykgeworICAgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgel0gPQorICAgICAgICAgICAgICAgIHNbeCAqIHNyY19zdHJpZGUgKyAoc3cgLSAxIC0geSkgKiBicHAgKyB6XTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OXzE4MDoKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkdzsgeCsrKSB7CisgICAgICAgICAgZm9yICh6ID0gMDsgeiA8IGJwcDsgeisrKSB7CisgICAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB6XSA9CisgICAgICAgICAgICAgICAgc1soc2ggLSAxIC0geSkgKiBzcmNfc3RyaWRlICsgKHN3IC0gMSAtIHgpICogYnBwICsgel07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9IT1JJWjoKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkdzsgeCsrKSB7CisgICAgICAgICAgZm9yICh6ID0gMDsgeiA8IGJwcDsgeisrKSB7CisgICAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB6XSA9CisgICAgICAgICAgICAgICAgc1t5ICogc3JjX3N0cmlkZSArIChzdyAtIDEgLSB4KSAqIGJwcCArIHpdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fVkVSVDoKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkdzsgeCsrKSB7CisgICAgICAgICAgZm9yICh6ID0gMDsgeiA8IGJwcDsgeisrKSB7CisgICAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB6XSA9CisgICAgICAgICAgICAgICAgc1soc2ggLSAxIC0geSkgKiBzcmNfc3RyaWRlICsgeCAqIGJwcCArIHpdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fVUxfTFI6CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZHc7IHgrKykgeworICAgICAgICAgIGZvciAoeiA9IDA7IHogPCBicHA7IHorKykgeworICAgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgel0gPSBzW3ggKiBzcmNfc3RyaWRlICsgeSAqIGJwcCArIHpdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fVVJfTEw6CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZHc7IHgrKykgeworICAgICAgICAgIGZvciAoeiA9IDA7IHogPCBicHA7IHorKykgeworICAgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgel0gPQorICAgICAgICAgICAgICAgIHNbKHNoIC0gMSAtIHgpICogc3JjX3N0cmlkZSArIChzdyAtIDEgLSB5KSAqIGJwcCArIHpdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fSURFTlRJVFk6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19mbGlwX3k0MjIgKEdzdFZpZGVvRmxpcCAqIHZpZGVvZmxpcCwgR3N0VmlkZW9GcmFtZSAqIGRlc3QsCisgICAgY29uc3QgR3N0VmlkZW9GcmFtZSAqIHNyYykKK3sKKyAgZ2ludCB4LCB5OworICBndWludDggY29uc3QgKnM7CisgIGd1aW50OCAqZDsKKyAgZ2ludCBzdyA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoc3JjKTsKKyAgZ2ludCBzaCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKHNyYyk7CisgIGdpbnQgZHcgPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGRlc3QpOworICBnaW50IGRoID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoZGVzdCk7CisgIGdpbnQgc3JjX3N0cmlkZSwgZGVzdF9zdHJpZGU7CisgIGdpbnQgYnBwOworICBnaW50IHlfb2Zmc2V0OworICBnaW50IHVfb2Zmc2V0OworICBnaW50IHZfb2Zmc2V0OworICBnaW50IHlfc3RyaWRlOworCisgIHMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjLCAwKTsKKyAgZCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChkZXN0LCAwKTsKKworICBzcmNfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoc3JjLCAwKTsKKyAgZGVzdF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChkZXN0LCAwKTsKKworICB5X29mZnNldCA9IEdTVF9WSURFT19GUkFNRV9DT01QX09GRlNFVCAoc3JjLCAwKTsKKyAgdV9vZmZzZXQgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9PRkZTRVQgKHNyYywgMSk7CisgIHZfb2Zmc2V0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfT0ZGU0VUIChzcmMsIDIpOworICB5X3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1BTVFJJREUgKHNyYywgMCk7CisgIGJwcCA9IHlfc3RyaWRlOworCisgIHN3aXRjaCAodmlkZW9mbGlwLT5hY3RpdmVfbWV0aG9kKSB7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fOTBSOgorICAgICAgZm9yICh5ID0gMDsgeSA8IGRoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGR3OyB4ICs9IDIpIHsKKyAgICAgICAgICBndWludDggdTsKKyAgICAgICAgICBndWludDggdjsKKyAgICAgICAgICAvKiB1L3YgbXVzdCBiZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBvZmZzZXQgb2YgdGhlIGV2ZW4gY29sdW1uICovCisgICAgICAgICAgZ2ludCBldmVuX3kgPSAoeSAmIH4xKTsKKworICAgICAgICAgIHUgPSBzWyhzaCAtIDEgLSB4KSAqIHNyY19zdHJpZGUgKyBldmVuX3kgKiBicHAgKyB1X29mZnNldF07CisgICAgICAgICAgaWYgKHggKyAxIDwgZHcpCisgICAgICAgICAgICB1ID0gKHNbKHNoIC0gMSAtICh4ICsgMSkpICogc3JjX3N0cmlkZSArIGV2ZW5feSAqIGJwcCArIHVfb2Zmc2V0XQorICAgICAgICAgICAgICAgICsgdSkgPj4gMTsKKyAgICAgICAgICB2ID0gc1soc2ggLSAxIC0geCkgKiBzcmNfc3RyaWRlICsgZXZlbl95ICogYnBwICsgdl9vZmZzZXRdOworICAgICAgICAgIGlmICh4ICsgMSA8IGR3KQorICAgICAgICAgICAgdiA9IChzWyhzaCAtIDEgLSAoeCArIDEpKSAqIHNyY19zdHJpZGUgKyBldmVuX3kgKiBicHAgKyB2X29mZnNldF0KKyAgICAgICAgICAgICAgICArIHYpID4+IDE7CisKKyAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB1X29mZnNldF0gPSB1OworICAgICAgICAgIGRbeSAqIGRlc3Rfc3RyaWRlICsgeCAqIGJwcCArIHZfb2Zmc2V0XSA9IHY7CisgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgeV9vZmZzZXRdID0KKyAgICAgICAgICAgICAgc1soc2ggLSAxIC0geCkgKiBzcmNfc3RyaWRlICsgeSAqIGJwcCArIHlfb2Zmc2V0XTsKKyAgICAgICAgICBpZiAoeCArIDEgPCBkdykKKyAgICAgICAgICAgIGRbeSAqIGRlc3Rfc3RyaWRlICsgKHggKyAxKSAqIGJwcCArIHlfb2Zmc2V0XSA9CisgICAgICAgICAgICAgICAgc1soc2ggLSAxIC0gKHggKyAxKSkgKiBzcmNfc3RyaWRlICsgeSAqIGJwcCArIHlfb2Zmc2V0XTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fOTBMOgorICAgICAgZm9yICh5ID0gMDsgeSA8IGRoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGR3OyB4ICs9IDIpIHsKKyAgICAgICAgICBndWludDggdTsKKyAgICAgICAgICBndWludDggdjsKKyAgICAgICAgICAvKiB1L3YgbXVzdCBiZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBvZmZzZXQgb2YgdGhlIGV2ZW4gY29sdW1uICovCisgICAgICAgICAgZ2ludCBldmVuX3kgPSAoKHN3IC0gMSAtIHkpICYgfjEpOworCisgICAgICAgICAgdSA9IHNbeCAqIHNyY19zdHJpZGUgKyBldmVuX3kgKiBicHAgKyB1X29mZnNldF07CisgICAgICAgICAgaWYgKHggKyAxIDwgZHcpCisgICAgICAgICAgICB1ID0gKHNbKHggKyAxKSAqIHNyY19zdHJpZGUgKyBldmVuX3kgKiBicHAgKyB1X29mZnNldF0gKyB1KSA+PiAxOworICAgICAgICAgIHYgPSBzW3ggKiBzcmNfc3RyaWRlICsgZXZlbl95ICogYnBwICsgdl9vZmZzZXRdOworICAgICAgICAgIGlmICh4ICsgMSA8IGR3KQorICAgICAgICAgICAgdiA9IChzWyh4ICsgMSkgKiBzcmNfc3RyaWRlICsgZXZlbl95ICogYnBwICsgdl9vZmZzZXRdICsgdikgPj4gMTsKKworICAgICAgICAgIGRbeSAqIGRlc3Rfc3RyaWRlICsgeCAqIGJwcCArIHVfb2Zmc2V0XSA9IHU7CisgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgdl9vZmZzZXRdID0gdjsKKyAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB5X29mZnNldF0gPQorICAgICAgICAgICAgICBzW3ggKiBzcmNfc3RyaWRlICsgKHN3IC0gMSAtIHkpICogYnBwICsgeV9vZmZzZXRdOworICAgICAgICAgIGlmICh4ICsgMSA8IGR3KQorICAgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyAoeCArIDEpICogYnBwICsgeV9vZmZzZXRdID0KKyAgICAgICAgICAgICAgICBzWyh4ICsgMSkgKiBzcmNfc3RyaWRlICsgKHN3IC0gMSAtIHkpICogYnBwICsgeV9vZmZzZXRdOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl8xODA6CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZHc7IHggKz0gMikgeworICAgICAgICAgIGd1aW50OCB1OworICAgICAgICAgIGd1aW50OCB2OworICAgICAgICAgIC8qIHUvdiBtdXN0IGJlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIG9mZnNldCBvZiB0aGUgZXZlbiBjb2x1bW4gKi8KKyAgICAgICAgICBnaW50IGV2ZW5feCA9ICgoc3cgLSAxIC0geCkgJiB+MSk7CisKKyAgICAgICAgICB1ID0gKHNbKHNoIC0gMSAtIHkpICogc3JjX3N0cmlkZSArIGV2ZW5feCAqIGJwcCArIHVfb2Zmc2V0XSArCisgICAgICAgICAgICAgIHNbKHNoIC0gMSAtIHkpICogc3JjX3N0cmlkZSArIGV2ZW5feCAqIGJwcCArIHVfb2Zmc2V0XSkgLyAyOworICAgICAgICAgIHYgPSAoc1soc2ggLSAxIC0geSkgKiBzcmNfc3RyaWRlICsgZXZlbl94ICogYnBwICsgdl9vZmZzZXRdICsKKyAgICAgICAgICAgICAgc1soc2ggLSAxIC0geSkgKiBzcmNfc3RyaWRlICsgZXZlbl94ICogYnBwICsgdl9vZmZzZXRdKSAvIDI7CisKKyAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB1X29mZnNldF0gPSB1OworICAgICAgICAgIGRbeSAqIGRlc3Rfc3RyaWRlICsgeCAqIGJwcCArIHZfb2Zmc2V0XSA9IHY7CisgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgeV9vZmZzZXRdID0KKyAgICAgICAgICAgICAgc1soc2ggLSAxIC0geSkgKiBzcmNfc3RyaWRlICsgKHN3IC0gMSAtIHgpICogYnBwICsgeV9vZmZzZXRdOworICAgICAgICAgIGlmICh4ICsgMSA8IGR3KQorICAgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyAoeCArIDEpICogYnBwICsgeV9vZmZzZXRdID0KKyAgICAgICAgICAgICAgICBzWyhzaCAtIDEgLSB5KSAqIHNyY19zdHJpZGUgKyAoc3cgLSAxIC0gKHggKyAxKSkgKiBicHAgKworICAgICAgICAgICAgICAgIHlfb2Zmc2V0XTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fSE9SSVo6CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZHc7IHggKz0gMikgeworICAgICAgICAgIGd1aW50OCB1OworICAgICAgICAgIGd1aW50OCB2OworICAgICAgICAgIC8qIHUvdiBtdXN0IGJlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIG9mZnNldCBvZiB0aGUgZXZlbiBjb2x1bW4gKi8KKyAgICAgICAgICBnaW50IGV2ZW5feCA9ICgoc3cgLSAxIC0geCkgJiB+MSk7CisKKyAgICAgICAgICB1ID0gKHNbeSAqIHNyY19zdHJpZGUgKyBldmVuX3ggKiBicHAgKyB1X29mZnNldF0gKworICAgICAgICAgICAgICBzW3kgKiBzcmNfc3RyaWRlICsgZXZlbl94ICogYnBwICsgdV9vZmZzZXRdKSAvIDI7CisgICAgICAgICAgdiA9IChzW3kgKiBzcmNfc3RyaWRlICsgZXZlbl94ICogYnBwICsgdl9vZmZzZXRdICsKKyAgICAgICAgICAgICAgc1t5ICogc3JjX3N0cmlkZSArIGV2ZW5feCAqIGJwcCArIHZfb2Zmc2V0XSkgLyAyOworCisgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgdV9vZmZzZXRdID0gdTsKKyAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB2X29mZnNldF0gPSB2OworICAgICAgICAgIGRbeSAqIGRlc3Rfc3RyaWRlICsgeCAqIGJwcCArIHlfb2Zmc2V0XSA9CisgICAgICAgICAgICAgIHNbeSAqIHNyY19zdHJpZGUgKyAoc3cgLSAxIC0geCkgKiBicHAgKyB5X29mZnNldF07CisgICAgICAgICAgaWYgKHggKyAxIDwgZHcpCisgICAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArICh4ICsgMSkgKiBicHAgKyB5X29mZnNldF0gPQorICAgICAgICAgICAgICAgIHNbeSAqIHNyY19zdHJpZGUgKyAoc3cgLSAxIC0gKHggKyAxKSkgKiBicHAgKyB5X29mZnNldF07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OX1ZFUlQ6CisgICAgICBmb3IgKHkgPSAwOyB5IDwgZGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZHc7IHggKz0gMikgeworICAgICAgICAgIGd1aW50OCB1OworICAgICAgICAgIGd1aW50OCB2OworICAgICAgICAgIC8qIHUvdiBtdXN0IGJlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIG9mZnNldCBvZiB0aGUgZXZlbiBjb2x1bW4gKi8KKyAgICAgICAgICBnaW50IGV2ZW5feCA9ICh4ICYgfjEpOworCisgICAgICAgICAgdSA9IChzWyhzaCAtIDEgLSB5KSAqIHNyY19zdHJpZGUgKyBldmVuX3ggKiBicHAgKyB1X29mZnNldF0gKworICAgICAgICAgICAgICBzWyhzaCAtIDEgLSB5KSAqIHNyY19zdHJpZGUgKyBldmVuX3ggKiBicHAgKyB1X29mZnNldF0pIC8gMjsKKyAgICAgICAgICB2ID0gKHNbKHNoIC0gMSAtIHkpICogc3JjX3N0cmlkZSArIGV2ZW5feCAqIGJwcCArIHZfb2Zmc2V0XSArCisgICAgICAgICAgICAgIHNbKHNoIC0gMSAtIHkpICogc3JjX3N0cmlkZSArIGV2ZW5feCAqIGJwcCArIHZfb2Zmc2V0XSkgLyAyOworCisgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgdV9vZmZzZXRdID0gdTsKKyAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB2X29mZnNldF0gPSB2OworICAgICAgICAgIGRbeSAqIGRlc3Rfc3RyaWRlICsgeCAqIGJwcCArIHlfb2Zmc2V0XSA9CisgICAgICAgICAgICAgIHNbKHNoIC0gMSAtIHkpICogc3JjX3N0cmlkZSArIHggKiBicHAgKyB5X29mZnNldF07CisgICAgICAgICAgaWYgKHggKyAxIDwgZHcpCisgICAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArICh4ICsgMSkgKiBicHAgKyB5X29mZnNldF0gPQorICAgICAgICAgICAgICAgIHNbKHNoIC0gMSAtIHkpICogc3JjX3N0cmlkZSArICh4ICsgMSkgKiBicHAgKyB5X29mZnNldF07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OX1VMX0xSOgorICAgICAgZm9yICh5ID0gMDsgeSA8IGRoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGR3OyB4ICs9IDIpIHsKKyAgICAgICAgICBndWludDggdTsKKyAgICAgICAgICBndWludDggdjsKKyAgICAgICAgICAvKiB1L3YgbXVzdCBiZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBvZmZzZXQgb2YgdGhlIGV2ZW4gY29sdW1uICovCisgICAgICAgICAgZ2ludCBldmVuX3kgPSAoeSAmIH4xKTsKKworICAgICAgICAgIHUgPSBzW3ggKiBzcmNfc3RyaWRlICsgZXZlbl95ICogYnBwICsgdV9vZmZzZXRdOworICAgICAgICAgIGlmICh4ICsgMSA8IGR3KQorICAgICAgICAgICAgdSA9IChzWyh4ICsgMSkgKiBzcmNfc3RyaWRlICsgZXZlbl95ICogYnBwICsgdV9vZmZzZXRdICsgdSkgPj4gMTsKKyAgICAgICAgICB2ID0gc1t4ICogc3JjX3N0cmlkZSArIGV2ZW5feSAqIGJwcCArIHZfb2Zmc2V0XTsKKyAgICAgICAgICBpZiAoeCArIDEgPCBkdykKKyAgICAgICAgICAgIHYgPSAoc1soeCArIDEpICogc3JjX3N0cmlkZSArIGV2ZW5feSAqIGJwcCArIHZfb2Zmc2V0XSArIHYpID4+IDE7CisKKyAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB1X29mZnNldF0gPSB1OworICAgICAgICAgIGRbeSAqIGRlc3Rfc3RyaWRlICsgeCAqIGJwcCArIHZfb2Zmc2V0XSA9IHY7CisgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgeV9vZmZzZXRdID0KKyAgICAgICAgICAgICAgc1t4ICogc3JjX3N0cmlkZSArIHkgKiBicHAgKyB5X29mZnNldF07CisgICAgICAgICAgaWYgKHggKyAxIDwgZHcpCisgICAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArICh4ICsgMSkgKiBicHAgKyB5X29mZnNldF0gPQorICAgICAgICAgICAgICAgIHNbKHggKyAxKSAqIHNyY19zdHJpZGUgKyB5ICogYnBwICsgeV9vZmZzZXRdOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9VUl9MTDoKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBkaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBkdzsgeCArPSAyKSB7CisgICAgICAgICAgZ3VpbnQ4IHU7CisgICAgICAgICAgZ3VpbnQ4IHY7CisgICAgICAgICAgLyogdS92IG11c3QgYmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgb2Zmc2V0IG9mIHRoZSBldmVuIGNvbHVtbiAqLworICAgICAgICAgIGdpbnQgZXZlbl95ID0gKChzdyAtIDEgLSB5KSAmIH4xKTsKKworICAgICAgICAgIHUgPSBzWyhzaCAtIDEgLSB4KSAqIHNyY19zdHJpZGUgKyBldmVuX3kgKiBicHAgKyB1X29mZnNldF07CisgICAgICAgICAgaWYgKHggKyAxIDwgZHcpCisgICAgICAgICAgICB1ID0gKHNbKHNoIC0gMSAtICh4ICsgMSkpICogc3JjX3N0cmlkZSArIGV2ZW5feSAqIGJwcCArIHVfb2Zmc2V0XQorICAgICAgICAgICAgICAgICsgdSkgPj4gMTsKKyAgICAgICAgICB2ID0gc1soc2ggLSAxIC0geCkgKiBzcmNfc3RyaWRlICsgZXZlbl95ICogYnBwICsgdl9vZmZzZXRdOworICAgICAgICAgIGlmICh4ICsgMSA8IGR3KQorICAgICAgICAgICAgdiA9IChzWyhzaCAtIDEgLSAoeCArIDEpKSAqIHNyY19zdHJpZGUgKyBldmVuX3kgKiBicHAgKyB2X29mZnNldF0KKyAgICAgICAgICAgICAgICArIHYpID4+IDE7CisKKyAgICAgICAgICBkW3kgKiBkZXN0X3N0cmlkZSArIHggKiBicHAgKyB1X29mZnNldF0gPSB1OworICAgICAgICAgIGRbeSAqIGRlc3Rfc3RyaWRlICsgeCAqIGJwcCArIHZfb2Zmc2V0XSA9IHY7CisgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyB4ICogYnBwICsgeV9vZmZzZXRdID0KKyAgICAgICAgICAgICAgc1soc2ggLSAxIC0geCkgKiBzcmNfc3RyaWRlICsgKHN3IC0gMSAtIHkpICogYnBwICsgeV9vZmZzZXRdOworICAgICAgICAgIGlmICh4ICsgMSA8IGR3KQorICAgICAgICAgICAgZFt5ICogZGVzdF9zdHJpZGUgKyAoeCArIDEpICogYnBwICsgeV9vZmZzZXRdID0KKyAgICAgICAgICAgICAgICBzWyhzaCAtIDEgLSAoeCArIDEpKSAqIHNyY19zdHJpZGUgKyAoc3cgLSAxIC0geSkgKiBicHAgKworICAgICAgICAgICAgICAgIHlfb2Zmc2V0XTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fSURFTlRJVFk6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9fZmxpcF9zZXRfaW5mbyAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdFZpZGVvSW5mbyAqIGluX2luZm8sIEdzdENhcHMgKiBvdXRjYXBzLCBHc3RWaWRlb0luZm8gKiBvdXRfaW5mbykKK3sKKyAgR3N0VmlkZW9GbGlwICp2ZiA9IEdTVF9WSURFT19GTElQICh2ZmlsdGVyKTsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgdmYtPnByb2Nlc3MgPSBOVUxMOworCisgIGlmIChHU1RfVklERU9fSU5GT19GT1JNQVQgKGluX2luZm8pICE9IEdTVF9WSURFT19JTkZPX0ZPUk1BVCAob3V0X2luZm8pKQorICAgIGdvdG8gaW52YWxpZF9jYXBzOworCisgIC8qIENoZWNrIHRoYXQgdGhleSBhcmUgY29ycmVjdCAqLworICBzd2l0Y2ggKHZmLT5hY3RpdmVfbWV0aG9kKSB7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fOTBSOgorICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OXzkwTDoKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9VTF9MUjoKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9VUl9MTDoKKyAgICAgIGlmICgoaW5faW5mby0+d2lkdGggIT0gb3V0X2luZm8tPmhlaWdodCkgfHwKKyAgICAgICAgICAoaW5faW5mby0+aGVpZ2h0ICE9IG91dF9pbmZvLT53aWR0aCkpIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAodmYsICJ3ZSBhcmUgaW52ZXJ0aW5nIHdpZHRoIGFuZCBoZWlnaHQgYnV0IGNhcHMgIgorICAgICAgICAgICAgImFyZSBub3QgY29ycmVjdCA6ICVkeCVkIHRvICVkeCVkIiwgaW5faW5mby0+d2lkdGgsCisgICAgICAgICAgICBpbl9pbmZvLT5oZWlnaHQsIG91dF9pbmZvLT53aWR0aCwgb3V0X2luZm8tPmhlaWdodCk7CisgICAgICAgIGdvdG8gYmVhY2g7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9JREVOVElUWToKKworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fT1JJRU5UQVRJT05fMTgwOgorICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OX0hPUklaOgorICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OX1ZFUlQ6CisgICAgICBpZiAoKGluX2luZm8tPndpZHRoICE9IG91dF9pbmZvLT53aWR0aCkgfHwKKyAgICAgICAgICAoaW5faW5mby0+aGVpZ2h0ICE9IG91dF9pbmZvLT5oZWlnaHQpKSB7CisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHZmLCAid2UgYXJlIGtlZXBpbmcgd2lkdGggYW5kIGhlaWdodCBidXQgY2FwcyAiCisgICAgICAgICAgICAiYXJlIG5vdCBjb3JyZWN0IDogJWR4JWQgdG8gJWR4JWQiLCBpbl9pbmZvLT53aWR0aCwKKyAgICAgICAgICAgIGluX2luZm8tPmhlaWdodCwgb3V0X2luZm8tPndpZHRoLCBvdXRfaW5mby0+aGVpZ2h0KTsKKyAgICAgICAgZ290byBiZWFjaDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gVFJVRTsKKworICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoaW5faW5mbykpIHsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfSTQyMDoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVYxMjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQ0NDoKKyAgICAgIHZmLT5wcm9jZXNzID0gZ3N0X3ZpZGVvX2ZsaXBfcGxhbmFyX3l1djsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9VWVZZOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVllVOgorICAgICAgdmYtPnByb2Nlc3MgPSBnc3RfdmlkZW9fZmxpcF95NDIyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FZVVY6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FSR0I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FCR1I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQkE6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hSR0I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX3hCR1I6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQng6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUng6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9HUkFZODoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfR1JBWTE2X0JFOgorICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9HUkFZMTZfTEU6CisgICAgICB2Zi0+cHJvY2VzcyA9IGdzdF92aWRlb19mbGlwX3BhY2tlZF9zaW1wbGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYxMjoKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYyMToKKyAgICAgIHZmLT5wcm9jZXNzID0gZ3N0X3ZpZGVvX2ZsaXBfc2VtaV9wbGFuYXJfeXV2OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKK2JlYWNoOgorICByZXR1cm4gcmV0ICYmICh2Zi0+cHJvY2VzcyAhPSBOVUxMKTsKKworaW52YWxpZF9jYXBzOgorICBHU1RfRVJST1JfT0JKRUNUICh2ZiwgIkludmFsaWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQgIiAtPiAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIGluY2Fwcywgb3V0Y2Fwcyk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19mbGlwX3NldF9tZXRob2QgKEdzdFZpZGVvRmxpcCAqIHZpZGVvZmxpcCwKKyAgICBHc3RWaWRlb09yaWVudGF0aW9uTWV0aG9kIG1ldGhvZCwgZ2Jvb2xlYW4gZnJvbV90YWcpCit7CisgIEdTVF9PQkpFQ1RfTE9DSyAodmlkZW9mbGlwKTsKKworICBpZiAobWV0aG9kID09IEdTVF9WSURFT19PUklFTlRBVElPTl9DVVNUT00pIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHZpZGVvZmxpcCwgInVuc3VwcG9ydGVkIGN1c3RvbSBvcmllbnRhdGlvbiIpOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLICh2aWRlb2ZsaXApOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFN0b3JlIHVwZGF0ZWQgbWV0aG9kICovCisgIGlmIChmcm9tX3RhZykKKyAgICB2aWRlb2ZsaXAtPnRhZ19tZXRob2QgPSBtZXRob2Q7CisgIGVsc2UKKyAgICB2aWRlb2ZsaXAtPm1ldGhvZCA9IG1ldGhvZDsKKworICAvKiBHZXQgdGhlIG5ldyBtZXRob2QgKi8KKyAgaWYgKHZpZGVvZmxpcC0+bWV0aG9kID09IEdTVF9WSURFT19PUklFTlRBVElPTl9BVVRPKQorICAgIG1ldGhvZCA9IHZpZGVvZmxpcC0+dGFnX21ldGhvZDsKKyAgZWxzZQorICAgIG1ldGhvZCA9IHZpZGVvZmxpcC0+bWV0aG9kOworCisgIGlmIChtZXRob2QgIT0gdmlkZW9mbGlwLT5hY3RpdmVfbWV0aG9kKSB7CisgICAgR0VudW1WYWx1ZSAqYWN0aXZlX21ldGhvZF9lbnVtLCAqbWV0aG9kX2VudW07CisgICAgR3N0QmFzZVRyYW5zZm9ybSAqYnRyYW5zID0gR1NUX0JBU0VfVFJBTlNGT1JNICh2aWRlb2ZsaXApOworICAgIEdFbnVtQ2xhc3MgKmVudW1fY2xhc3MgPQorICAgICAgICBnX3R5cGVfY2xhc3NfcmVmIChHU1RfVFlQRV9WSURFT19PUklFTlRBVElPTl9NRVRIT0QpOworCisgICAgYWN0aXZlX21ldGhvZF9lbnVtID0KKyAgICAgICAgZ19lbnVtX2dldF92YWx1ZSAoZW51bV9jbGFzcywgdmlkZW9mbGlwLT5hY3RpdmVfbWV0aG9kKTsKKyAgICBtZXRob2RfZW51bSA9IGdfZW51bV9nZXRfdmFsdWUgKGVudW1fY2xhc3MsIG1ldGhvZCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodmlkZW9mbGlwLCAiQ2hhbmdpbmcgbWV0aG9kIGZyb20gJXMgdG8gJXMiLAorICAgICAgICBhY3RpdmVfbWV0aG9kX2VudW0gPyBhY3RpdmVfbWV0aG9kX2VudW0tPnZhbHVlX25pY2sgOiAiKG5pbCkiLAorICAgICAgICBtZXRob2RfZW51bSA/IG1ldGhvZF9lbnVtLT52YWx1ZV9uaWNrIDogIihuaWwpIik7CisgICAgZ190eXBlX2NsYXNzX3VucmVmIChlbnVtX2NsYXNzKTsKKworICAgIHZpZGVvZmxpcC0+YWN0aXZlX21ldGhvZCA9IG1ldGhvZDsKKworICAgIEdTVF9PQkpFQ1RfVU5MT0NLICh2aWRlb2ZsaXApOworCisgICAgZ3N0X2Jhc2VfdHJhbnNmb3JtX3NldF9wYXNzdGhyb3VnaCAoYnRyYW5zLAorICAgICAgICBtZXRob2QgPT0gR1NUX1ZJREVPX09SSUVOVEFUSU9OX0lERU5USVRZKTsKKyAgICBnc3RfYmFzZV90cmFuc2Zvcm1fcmVjb25maWd1cmVfc3JjIChidHJhbnMpOworICB9IGVsc2UgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLICh2aWRlb2ZsaXApOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fZmxpcF9iZWZvcmVfdHJhbnNmb3JtIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEJ1ZmZlciAqIGluKQoreworICBHc3RWaWRlb0ZsaXAgKnZpZGVvZmxpcCA9IEdTVF9WSURFT19GTElQICh0cmFucyk7CisgIEdzdENsb2NrVGltZSB0aW1lc3RhbXAsIHN0cmVhbV90aW1lOworCisgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbik7CisgIHN0cmVhbV90aW1lID0KKyAgICAgIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmdHJhbnMtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh2aWRlb2ZsaXAsICJzeW5jIHRvICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgIGdzdF9vYmplY3Rfc3luY192YWx1ZXMgKEdTVF9PQkpFQ1QgKHZpZGVvZmxpcCksIHN0cmVhbV90aW1lKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92aWRlb19mbGlwX3RyYW5zZm9ybV9mcmFtZSAoR3N0VmlkZW9GaWx0ZXIgKiB2ZmlsdGVyLAorICAgIEdzdFZpZGVvRnJhbWUgKiBpbl9mcmFtZSwgR3N0VmlkZW9GcmFtZSAqIG91dF9mcmFtZSkKK3sKKyAgR0VudW1DbGFzcyAqZW51bV9jbGFzczsKKyAgR0VudW1WYWx1ZSAqYWN0aXZlX21ldGhvZF9lbnVtOworICBHc3RWaWRlb0ZsaXAgKnZpZGVvZmxpcCA9IEdTVF9WSURFT19GTElQICh2ZmlsdGVyKTsKKworICBpZiAoR19VTkxJS0VMWSAodmlkZW9mbGlwLT5wcm9jZXNzID09IE5VTEwpKQorICAgIGdvdG8gbm90X25lZ290aWF0ZWQ7CisKKyAgZW51bV9jbGFzcyA9IGdfdHlwZV9jbGFzc19yZWYgKEdTVF9UWVBFX1ZJREVPX09SSUVOVEFUSU9OX01FVEhPRCk7CisgIGFjdGl2ZV9tZXRob2RfZW51bSA9IGdfZW51bV9nZXRfdmFsdWUgKGVudW1fY2xhc3MsIHZpZGVvZmxpcC0+YWN0aXZlX21ldGhvZCk7CisgIEdTVF9MT0dfT0JKRUNUICh2aWRlb2ZsaXAsICJ2aWRlb2ZsaXA6IGZsaXBwaW5nICglcykiLAorICAgICAgYWN0aXZlX21ldGhvZF9lbnVtID8gYWN0aXZlX21ldGhvZF9lbnVtLT52YWx1ZV9uaWNrIDogIihuaWwpIik7CisgIGdfdHlwZV9jbGFzc191bnJlZiAoZW51bV9jbGFzcyk7CisKKyAgR1NUX09CSkVDVF9MT0NLICh2aWRlb2ZsaXApOworICB2aWRlb2ZsaXAtPnByb2Nlc3MgKHZpZGVvZmxpcCwgb3V0X2ZyYW1lLCBpbl9mcmFtZSk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLICh2aWRlb2ZsaXApOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworbm90X25lZ290aWF0ZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUICh2aWRlb2ZsaXAsICJOb3QgbmVnb3RpYXRlZCB5ZXQiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9fZmxpcF9zcmNfZXZlbnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0VmlkZW9GbGlwICp2ZiA9IEdTVF9WSURFT19GTElQICh0cmFucyk7CisgIGdkb3VibGUgbmV3X3gsIG5ld195LCB4LCB5OworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgZ2Jvb2xlYW4gcmV0OworICBHc3RWaWRlb0luZm8gKm91dF9pbmZvID0gJkdTVF9WSURFT19GSUxURVIgKHRyYW5zKS0+b3V0X2luZm87CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodmYsICJoYW5kbGluZyAlcyBldmVudCIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfTkFWSUdBVElPTjoKKyAgICAgIGV2ZW50ID0KKyAgICAgICAgICBHU1RfRVZFTlQgKGdzdF9taW5pX29iamVjdF9tYWtlX3dyaXRhYmxlIChHU1RfTUlOSV9PQkpFQ1QgKGV2ZW50KSkpOworCisgICAgICBzdHJ1Y3R1cmUgPSAoR3N0U3RydWN0dXJlICopIGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChldmVudCk7CisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfZG91YmxlIChzdHJ1Y3R1cmUsICJwb2ludGVyX3giLCAmeCkgJiYKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9kb3VibGUgKHN0cnVjdHVyZSwgInBvaW50ZXJfeSIsICZ5KSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh2ZiwgImNvbnZlcnRpbmcgJWZ4JWYiLCB4LCB5KTsKKyAgICAgICAgc3dpdGNoICh2Zi0+YWN0aXZlX21ldGhvZCkgeworICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OXzkwUjoKKyAgICAgICAgICAgIG5ld194ID0geTsKKyAgICAgICAgICAgIG5ld195ID0gb3V0X2luZm8tPndpZHRoIC0geDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OXzkwTDoKKyAgICAgICAgICAgIG5ld194ID0gb3V0X2luZm8tPmhlaWdodCAtIHk7CisgICAgICAgICAgICBuZXdfeSA9IHg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9VUl9MTDoKKyAgICAgICAgICAgIG5ld194ID0gb3V0X2luZm8tPmhlaWdodCAtIHk7CisgICAgICAgICAgICBuZXdfeSA9IG91dF9pbmZvLT53aWR0aCAtIHg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9VTF9MUjoKKyAgICAgICAgICAgIG5ld194ID0geTsKKyAgICAgICAgICAgIG5ld195ID0geDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OXzE4MDoKKyAgICAgICAgICAgIG5ld194ID0gb3V0X2luZm8tPndpZHRoIC0geDsKKyAgICAgICAgICAgIG5ld195ID0gb3V0X2luZm8tPmhlaWdodCAtIHk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdTVF9WSURFT19PUklFTlRBVElPTl9IT1JJWjoKKyAgICAgICAgICAgIG5ld194ID0gb3V0X2luZm8tPndpZHRoIC0geDsKKyAgICAgICAgICAgIG5ld195ID0geTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgR1NUX1ZJREVPX09SSUVOVEFUSU9OX1ZFUlQ6CisgICAgICAgICAgICBuZXdfeCA9IHg7CisgICAgICAgICAgICBuZXdfeSA9IG91dF9pbmZvLT5oZWlnaHQgLSB5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG5ld194ID0geDsKKyAgICAgICAgICAgIG5ld195ID0geTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHZmLCAidG8gJWZ4JWYiLCBuZXdfeCwgbmV3X3kpOworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLCAicG9pbnRlcl94IiwgR19UWVBFX0RPVUJMRSwgbmV3X3gsCisgICAgICAgICAgICAicG9pbnRlcl95IiwgR19UWVBFX0RPVUJMRSwgbmV3X3ksIE5VTEwpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zcmNfZXZlbnQgKHRyYW5zLCBldmVudCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9fZmxpcF9zaW5rX2V2ZW50IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFZpZGVvRmxpcCAqdmYgPSBHU1RfVklERU9fRkxJUCAodHJhbnMpOworICBHc3RUYWdMaXN0ICp0YWdsaXN0OworICBnY2hhciAqb3JpZW50YXRpb247CisgIGdib29sZWFuIHJldDsKKworICBHU1RfREVCVUdfT0JKRUNUICh2ZiwgImhhbmRsaW5nICVzIGV2ZW50IiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9UQUc6CisgICAgICBnc3RfZXZlbnRfcGFyc2VfdGFnIChldmVudCwgJnRhZ2xpc3QpOworCisgICAgICBpZiAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ2xpc3QsICJpbWFnZS1vcmllbnRhdGlvbiIsICZvcmllbnRhdGlvbikpIHsKKyAgICAgICAgaWYgKCFnX3N0cmNtcDAgKCJyb3RhdGUtMCIsIG9yaWVudGF0aW9uKSkKKyAgICAgICAgICBnc3RfdmlkZW9fZmxpcF9zZXRfbWV0aG9kICh2ZiwgR1NUX1ZJREVPX09SSUVOVEFUSU9OX0lERU5USVRZLCBUUlVFKTsKKyAgICAgICAgZWxzZSBpZiAoIWdfc3RyY21wMCAoInJvdGF0ZS05MCIsIG9yaWVudGF0aW9uKSkKKyAgICAgICAgICBnc3RfdmlkZW9fZmxpcF9zZXRfbWV0aG9kICh2ZiwgR1NUX1ZJREVPX09SSUVOVEFUSU9OXzkwUiwgVFJVRSk7CisgICAgICAgIGVsc2UgaWYgKCFnX3N0cmNtcDAgKCJyb3RhdGUtMTgwIiwgb3JpZW50YXRpb24pKQorICAgICAgICAgIGdzdF92aWRlb19mbGlwX3NldF9tZXRob2QgKHZmLCBHU1RfVklERU9fT1JJRU5UQVRJT05fMTgwLCBUUlVFKTsKKyAgICAgICAgZWxzZSBpZiAoIWdfc3RyY21wMCAoInJvdGF0ZS0yNzAiLCBvcmllbnRhdGlvbikpCisgICAgICAgICAgZ3N0X3ZpZGVvX2ZsaXBfc2V0X21ldGhvZCAodmYsIEdTVF9WSURFT19PUklFTlRBVElPTl85MEwsIFRSVUUpOworICAgICAgICBlbHNlIGlmICghZ19zdHJjbXAwICgiZmxpcC1yb3RhdGUtMCIsIG9yaWVudGF0aW9uKSkKKyAgICAgICAgICBnc3RfdmlkZW9fZmxpcF9zZXRfbWV0aG9kICh2ZiwgR1NUX1ZJREVPX09SSUVOVEFUSU9OX0hPUklaLCBUUlVFKTsKKyAgICAgICAgZWxzZSBpZiAoIWdfc3RyY21wMCAoImZsaXAtcm90YXRlLTkwIiwgb3JpZW50YXRpb24pKQorICAgICAgICAgIGdzdF92aWRlb19mbGlwX3NldF9tZXRob2QgKHZmLCBHU1RfVklERU9fT1JJRU5UQVRJT05fVUxfTFIsIFRSVUUpOworICAgICAgICBlbHNlIGlmICghZ19zdHJjbXAwICgiZmxpcC1yb3RhdGUtMTgwIiwgb3JpZW50YXRpb24pKQorICAgICAgICAgIGdzdF92aWRlb19mbGlwX3NldF9tZXRob2QgKHZmLCBHU1RfVklERU9fT1JJRU5UQVRJT05fVkVSVCwgVFJVRSk7CisgICAgICAgIGVsc2UgaWYgKCFnX3N0cmNtcDAgKCJmbGlwLXJvdGF0ZS0yNzAiLCBvcmllbnRhdGlvbikpCisgICAgICAgICAgZ3N0X3ZpZGVvX2ZsaXBfc2V0X21ldGhvZCAodmYsIEdTVF9WSURFT19PUklFTlRBVElPTl9VUl9MTCwgVFJVRSk7CisKKyAgICAgICAgZ19mcmVlIChvcmllbnRhdGlvbik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKHRyYW5zLCBldmVudCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19mbGlwX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWaWRlb0ZsaXAgKnZpZGVvZmxpcCA9IEdTVF9WSURFT19GTElQIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9NRVRIT0Q6CisgICAgY2FzZSBQUk9QX1ZJREVPX0RJUkVDVElPTjoKKyAgICAgIGdzdF92aWRlb19mbGlwX3NldF9tZXRob2QgKHZpZGVvZmxpcCwgZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpLCBGQUxTRSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9fZmxpcF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLAorICAgIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VmlkZW9GbGlwICp2aWRlb2ZsaXAgPSBHU1RfVklERU9fRkxJUCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfTUVUSE9EOgorICAgIGNhc2UgUFJPUF9WSURFT19ESVJFQ1RJT046CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgdmlkZW9mbGlwLT5tZXRob2QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2ZsaXBfY2xhc3NfaW5pdCAoR3N0VmlkZW9GbGlwQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzICp0cmFuc19jbGFzcyA9IChHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKikga2xhc3M7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgKnZmaWx0ZXJfY2xhc3MgPSAoR3N0VmlkZW9GaWx0ZXJDbGFzcyAqKSBrbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAodmlkZW9fZmxpcF9kZWJ1ZywgInZpZGVvZmxpcCIsIDAsICJ2aWRlb2ZsaXAiKTsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdmlkZW9fZmxpcF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF92aWRlb19mbGlwX2dldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX01FVEhPRCwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgibWV0aG9kIiwgIm1ldGhvZCIsCisgICAgICAgICAgIm1ldGhvZCAoZGVwcmVjYXRlZCwgdXNlIHZpZGVvLWRpcmVjdGlvbiBpbnN0ZWFkKSIsCisgICAgICAgICAgR1NUX1RZUEVfVklERU9fRkxJUF9NRVRIT0QsIFBST1BfTUVUSE9EX0RFRkFVTFQsCisgICAgICAgICAgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1QgfAorICAgICAgICAgIEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3Nfb3ZlcnJpZGVfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVklERU9fRElSRUNUSU9OLAorICAgICAgInZpZGVvLWRpcmVjdGlvbiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJWaWRlbyBmbGlwcGVyIiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwKKyAgICAgICJGbGlwcyBhbmQgcm90YXRlcyB2aWRlbyIsICJEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICZnc3RfdmlkZW9fZmxpcF9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmZ3N0X3ZpZGVvX2ZsaXBfc3JjX3RlbXBsYXRlKTsKKworICB0cmFuc19jbGFzcy0+dHJhbnNmb3JtX2NhcHMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19mbGlwX3RyYW5zZm9ybV9jYXBzKTsKKyAgdHJhbnNfY2xhc3MtPmJlZm9yZV90cmFuc2Zvcm0gPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19mbGlwX2JlZm9yZV90cmFuc2Zvcm0pOworICB0cmFuc19jbGFzcy0+c3JjX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19mbGlwX3NyY19ldmVudCk7CisgIHRyYW5zX2NsYXNzLT5zaW5rX2V2ZW50ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19mbGlwX3NpbmtfZXZlbnQpOworCisgIHZmaWx0ZXJfY2xhc3MtPnNldF9pbmZvID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19mbGlwX3NldF9pbmZvKTsKKyAgdmZpbHRlcl9jbGFzcy0+dHJhbnNmb3JtX2ZyYW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdmlkZW9fZmxpcF90cmFuc2Zvcm1fZnJhbWUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvX2ZsaXBfaW5pdCAoR3N0VmlkZW9GbGlwICogdmlkZW9mbGlwKQoreworICAvKiBBVVRPIGlzIG5vdCB2YWxpZCBmb3IgYWN0aXZlIG1ldGhvZCwgdGhpcyBpcyBqdXN0IHRvIGVuc3VyZSB3ZSBzZXR1cCB0aGUKKyAgICogbWV0aG9kIGluIGdzdF92aWRlb19mbGlwX3NldF9tZXRob2QoKSAqLworICB2aWRlb2ZsaXAtPmFjdGl2ZV9tZXRob2QgPSBHU1RfVklERU9fT1JJRU5UQVRJT05fQVVUTzsKK30KZGlmZiAtLWdpdCBhL2dzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaCBiL2dzdC92aWRlb2ZpbHRlci9nc3R2aWRlb2ZsaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmNhOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvZmxpcC5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1ZJREVPX0ZMSVBfSF9fCisjZGVmaW5lIF9fR1NUX1ZJREVPX0ZMSVBfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZmlsdGVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworLyoqCisgKiBHc3RWaWRlb0ZsaXBNZXRob2Q6CisgKiBAR1NUX1ZJREVPX0ZMSVBfTUVUSE9EX0lERU5USVRZOiBJZGVudGl0eSAobm8gcm90YXRpb24pCisgKiBAR1NUX1ZJREVPX0ZMSVBfTUVUSE9EXzkwUjogUm90YXRlIGNsb2Nrd2lzZSA5MCBkZWdyZWVzCisgKiBAR1NUX1ZJREVPX0ZMSVBfTUVUSE9EXzE4MDogUm90YXRlIDE4MCBkZWdyZWVzCisgKiBAR1NUX1ZJREVPX0ZMSVBfTUVUSE9EXzkwTDogUm90YXRlIGNvdW50ZXItY2xvY2t3aXNlIDkwIGRlZ3JlZXMKKyAqIEBHU1RfVklERU9fRkxJUF9NRVRIT0RfSE9SSVo6IEZsaXAgaG9yaXpvbnRhbGx5CisgKiBAR1NUX1ZJREVPX0ZMSVBfTUVUSE9EX1ZFUlQ6IEZsaXAgdmVydGljYWxseQorICogQEdTVF9WSURFT19GTElQX01FVEhPRF9UUkFOUzogRmxpcCBhY3Jvc3MgdXBwZXIgbGVmdC9sb3dlciByaWdodCBkaWFnb25hbAorICogQEdTVF9WSURFT19GTElQX01FVEhPRF9PVEhFUjogRmxpcCBhY3Jvc3MgdXBwZXIgcmlnaHQvbG93ZXIgbGVmdCBkaWFnb25hbAorICogQEdTVF9WSURFT19GTElQX01FVEhPRF9BVVRPOiBTZWxlY3QgZmxpcCBtZXRob2QgYmFzZWQgb24gaW1hZ2Utb3JpZW50YXRpb24gdGFnCisgKgorICogVGhlIGRpZmZlcmVudCBmbGlwIG1ldGhvZHMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEdTVF9WSURFT19GTElQX01FVEhPRF9JREVOVElUWSwKKyAgR1NUX1ZJREVPX0ZMSVBfTUVUSE9EXzkwUiwKKyAgR1NUX1ZJREVPX0ZMSVBfTUVUSE9EXzE4MCwKKyAgR1NUX1ZJREVPX0ZMSVBfTUVUSE9EXzkwTCwKKyAgR1NUX1ZJREVPX0ZMSVBfTUVUSE9EX0hPUklaLAorICBHU1RfVklERU9fRkxJUF9NRVRIT0RfVkVSVCwKKyAgR1NUX1ZJREVPX0ZMSVBfTUVUSE9EX1RSQU5TLAorICBHU1RfVklERU9fRkxJUF9NRVRIT0RfT1RIRVIsCisgIEdTVF9WSURFT19GTElQX01FVEhPRF9BVVRPCit9IEdzdFZpZGVvRmxpcE1ldGhvZDsKKworI2RlZmluZSBHU1RfVFlQRV9WSURFT19GTElQIFwKKyAgKGdzdF92aWRlb19mbGlwX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WSURFT19GTElQKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVklERU9fRkxJUCxHc3RWaWRlb0ZsaXApKQorI2RlZmluZSBHU1RfVklERU9fRkxJUF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WSURFT19GTElQLEdzdFZpZGVvRmxpcENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1ZJREVPX0ZMSVAob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WSURFT19GTElQKSkKKyNkZWZpbmUgR1NUX0lTX1ZJREVPX0ZMSVBfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVklERU9fRkxJUCkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWaWRlb0ZsaXAgR3N0VmlkZW9GbGlwOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZpZGVvRmxpcENsYXNzIEdzdFZpZGVvRmxpcENsYXNzOworCisvKioKKyAqIEdzdFZpZGVvRmxpcDoKKyAqCisgKiBPcGFxdWUgZGF0YXN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RWaWRlb0ZsaXAgeworICBHc3RWaWRlb0ZpbHRlciB2aWRlb2ZpbHRlcjsKKworICAvKiA8IHByaXZhdGUgPiAqLworICBHc3RWaWRlb09yaWVudGF0aW9uTWV0aG9kIG1ldGhvZDsKKyAgR3N0VmlkZW9PcmllbnRhdGlvbk1ldGhvZCB0YWdfbWV0aG9kOworICBHc3RWaWRlb09yaWVudGF0aW9uTWV0aG9kIGFjdGl2ZV9tZXRob2Q7CisgIHZvaWQgKCpwcm9jZXNzKSAoR3N0VmlkZW9GbGlwICp2aWRlb2ZsaXAsIEdzdFZpZGVvRnJhbWUgKmRlc3QsIGNvbnN0IEdzdFZpZGVvRnJhbWUgKnNyYyk7Cit9OworCitzdHJ1Y3QgX0dzdFZpZGVvRmxpcENsYXNzIHsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfdmlkZW9fZmxpcF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9WSURFT19GTElQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvbWVkaWFuLmMgYi9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9tZWRpYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDJjZDIzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvbWVkaWFuLmMKQEAgLTAsMCArMSwzMjMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZ3N0dmlkZW9tZWRpYW4uaCIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHZpZGVvX21lZGlhbl9zcmNfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBJNDIwLCBZVjEyIH0iKSkKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgdmlkZW9fbWVkaWFuX3NpbmtfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IEk0MjAsIFlWMTIgfSIpKQorICAgICk7CisKKworLyogTWVkaWFuIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworI2RlZmluZSBERUZBVUxUX0ZJTFRFUlNJWkUgICA1CisjZGVmaW5lIERFRkFVTFRfTFVNX09OTFkgICAgIFRSVUUKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0ZJTFRFUlNJWkUsCisgIFBST1BfTFVNX09OTFkKK307CisKKyNkZWZpbmUgR1NUX1RZUEVfVklERU9fTUVESUFOX1NJWkUgKGdzdF92aWRlb19tZWRpYW5fc2l6ZV9nZXRfdHlwZSgpKQorCitzdGF0aWMgY29uc3QgR0VudW1WYWx1ZSB2aWRlb19tZWRpYW5fc2l6ZXNbXSA9IHsKKyAge0dTVF9WSURFT19NRURJQU5fU0laRV81LCAiTWVkaWFuIG9mIDUgbmVpZ2hib3VyIHBpeGVscyIsICI1In0sCisgIHtHU1RfVklERU9fTUVESUFOX1NJWkVfOSwgIk1lZGlhbiBvZiA5IG5laWdoYm91ciBwaXhlbHMiLCAiOSJ9LAorICB7MCwgTlVMTCwgTlVMTH0sCit9OworCitzdGF0aWMgR1R5cGUKK2dzdF92aWRlb19tZWRpYW5fc2l6ZV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIHZpZGVvX21lZGlhbl9zaXplX3R5cGUgPSAwOworCisgIGlmICghdmlkZW9fbWVkaWFuX3NpemVfdHlwZSkgeworICAgIHZpZGVvX21lZGlhbl9zaXplX3R5cGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0VmlkZW9NZWRpYW5TaXplIiwKKyAgICAgICAgdmlkZW9fbWVkaWFuX3NpemVzKTsKKyAgfQorICByZXR1cm4gdmlkZW9fbWVkaWFuX3NpemVfdHlwZTsKK30KKworI2RlZmluZSBnc3RfdmlkZW9fbWVkaWFuX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFZpZGVvTWVkaWFuLCBnc3RfdmlkZW9fbWVkaWFuLCBHU1RfVFlQRV9WSURFT19GSUxURVIpOworCitzdGF0aWMgR3N0Rmxvd1JldHVybiBnc3RfdmlkZW9fbWVkaWFuX3RyYW5zZm9ybV9mcmFtZSAoR3N0VmlkZW9GaWx0ZXIgKiBmaWx0ZXIsCisgICAgR3N0VmlkZW9GcmFtZSAqIGluX2ZyYW1lLCBHc3RWaWRlb0ZyYW1lICogb3V0X2ZyYW1lKTsKKworc3RhdGljIHZvaWQgZ3N0X3ZpZGVvX21lZGlhbl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfdmlkZW9fbWVkaWFuX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19tZWRpYW5fY2xhc3NfaW5pdCAoR3N0VmlkZW9NZWRpYW5DbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0VmlkZW9GaWx0ZXJDbGFzcyAqdmZpbHRlcl9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIHZmaWx0ZXJfY2xhc3MgPSAoR3N0VmlkZW9GaWx0ZXJDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdmlkZW9fbWVkaWFuX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3ZpZGVvX21lZGlhbl9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKSwgUFJPUF9GSUxURVJTSVpFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJmaWx0ZXJzaXplIiwgIkZpbHRlcnNpemUiLCAiVGhlIHNpemUgb2YgdGhlIGZpbHRlciIsCisgICAgICAgICAgR1NUX1RZUEVfVklERU9fTUVESUFOX1NJWkUsIERFRkFVTFRfRklMVEVSU0laRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChHX09CSkVDVF9DTEFTUyAoa2xhc3MpLCBQUk9QX0xVTV9PTkxZLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJsdW0tb25seSIsICJMdW0gT25seSIsICJPbmx5IGFwcGx5IGZpbHRlciBvbiAiCisgICAgICAgICAgImx1bWluYW5jZSIsIERFRkFVTFRfTFVNX09OTFksCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmdmlkZW9fbWVkaWFuX3NpbmtfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJnZpZGVvX21lZGlhbl9zcmNfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJNZWRpYW4gZWZmZWN0IiwKKyAgICAgICJGaWx0ZXIvRWZmZWN0L1ZpZGVvIiwgIkFwcGx5IGEgbWVkaWFuIGZpbHRlciB0byBhbiBpbWFnZSIsCisgICAgICAiV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4iKTsKKworICB2ZmlsdGVyX2NsYXNzLT50cmFuc2Zvcm1fZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb19tZWRpYW5fdHJhbnNmb3JtX2ZyYW1lKTsKK30KKwordm9pZAorZ3N0X3ZpZGVvX21lZGlhbl9pbml0IChHc3RWaWRlb01lZGlhbiAqIG1lZGlhbikKK3sKKyAgbWVkaWFuLT5maWx0ZXJzaXplID0gREVGQVVMVF9GSUxURVJTSVpFOworICBtZWRpYW4tPmx1bV9vbmx5ID0gREVGQVVMVF9MVU1fT05MWTsKK30KKworI2RlZmluZSBQSVhfU09SVChhLGIpIHsgaWYgKChhKT4oYikpIFBJWF9TV0FQKChhKSwoYikpOyB9CisjZGVmaW5lIFBJWF9TV0FQKGEsYikgeyB1bnNpZ25lZCBjaGFyIHRlbXA9KGEpOyhhKT0oYik7KGIpPXRlbXA7IH0KKworc3RhdGljIHZvaWQKK21lZGlhbl81IChndWludDggKiBkZXN0LCBnaW50IGRzdHJpZGUsIGNvbnN0IGd1aW50OCAqIHNyYywgZ2ludCBzc3RyaWRlLAorICAgIGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0KQoreworICB1bnNpZ25lZCBjaGFyIHBbNV07CisgIGludCBpLCBqLCBrOworCisgIC8qIGNvcHkgdGhlIHRvcCBhbmQgYm90dG9tIHJvd3MgaW50byB0aGUgcmVzdWx0IGFycmF5ICovCisgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgZGVzdFtpXSA9IHNyY1tpXTsKKyAgICBkZXN0WyhoZWlnaHQgLSAxKSAqIGRzdHJpZGUgKyBpXSA9IHNyY1soaGVpZ2h0IC0gMSkgKiBzc3RyaWRlICsgaV07CisgIH0KKworICAvKiBwcm9jZXNzIHRoZSBpbnRlcmlvciBwaXhlbHMgKi8KKyAgZm9yIChrID0gMjsgayA8IGhlaWdodDsgaysrKSB7CisgICAgZGVzdCArPSBkc3RyaWRlOworICAgIHNyYyArPSBzc3RyaWRlOworCisgICAgZGVzdFswXSA9IHNyY1swXTsKKyAgICBmb3IgKGogPSAyLCBpID0gMTsgaiA8IHdpZHRoOyBqKyssIGkrKykgeworICAgICAgcFswXSA9IHNyY1tpIC0gc3N0cmlkZV07CisgICAgICBwWzFdID0gc3JjW2kgLSAxXTsKKyAgICAgIHBbMl0gPSBzcmNbaV07CisgICAgICBwWzNdID0gc3JjW2kgKyAxXTsKKyAgICAgIHBbNF0gPSBzcmNbaSArIHNzdHJpZGVdOworICAgICAgUElYX1NPUlQgKHBbMF0sIHBbMV0pOworICAgICAgUElYX1NPUlQgKHBbM10sIHBbNF0pOworICAgICAgUElYX1NPUlQgKHBbMF0sIHBbM10pOworICAgICAgUElYX1NPUlQgKHBbMV0sIHBbNF0pOworICAgICAgUElYX1NPUlQgKHBbMV0sIHBbMl0pOworICAgICAgUElYX1NPUlQgKHBbMl0sIHBbM10pOworICAgICAgUElYX1NPUlQgKHBbMV0sIHBbMl0pOworICAgICAgZGVzdFtpXSA9IHBbMl07CisgICAgfQorICAgIGRlc3RbaV0gPSBzcmNbaV07CisgIH0KK30KKworc3RhdGljIHZvaWQKK21lZGlhbl85IChndWludDggKiBkZXN0LCBnaW50IGRzdHJpZGUsIGNvbnN0IGd1aW50OCAqIHNyYywgZ2ludCBzc3RyaWRlLAorICAgIGdpbnQgd2lkdGgsIGdpbnQgaGVpZ2h0KQoreworICB1bnNpZ25lZCBjaGFyIHBbOV07CisgIGludCBpLCBqLCBrOworCisgIC8qY29weSB0aGUgdG9wIGFuZCBib3R0b20gcm93cyBpbnRvIHRoZSByZXN1bHQgYXJyYXkgKi8KKyAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICBkZXN0W2ldID0gc3JjW2ldOworICAgIGRlc3RbKGhlaWdodCAtIDEpICogZHN0cmlkZSArIGldID0gc3JjWyhoZWlnaHQgLSAxKSAqIHNzdHJpZGUgKyBpXTsKKyAgfQorICAvKiBwcm9jZXNzIHRoZSBpbnRlcmlvciBwaXhlbHMgKi8KKyAgZm9yIChrID0gMjsgayA8IGhlaWdodDsgaysrKSB7CisgICAgZGVzdCArPSBkc3RyaWRlOworICAgIHNyYyArPSBzc3RyaWRlOworCisgICAgZGVzdFswXSA9IHNyY1swXTsKKyAgICBmb3IgKGogPSAyLCBpID0gMTsgaiA8IHdpZHRoOyBqKyssIGkrKykgeworICAgICAgcFswXSA9IHNyY1tpIC0gc3N0cmlkZSAtIDFdOworICAgICAgcFsxXSA9IHNyY1tpIC0gc3N0cmlkZV07CisgICAgICBwWzJdID0gc3JjW2kgLSBzc3RyaWRlICsgMV07CisgICAgICBwWzNdID0gc3JjW2kgLSAxXTsKKyAgICAgIHBbNF0gPSBzcmNbaV07CisgICAgICBwWzVdID0gc3JjW2kgKyAxXTsKKyAgICAgIHBbNl0gPSBzcmNbaSArIHNzdHJpZGUgLSAxXTsKKyAgICAgIHBbN10gPSBzcmNbaSArIHNzdHJpZGVdOworICAgICAgcFs4XSA9IHNyY1tpICsgc3N0cmlkZSArIDFdOworICAgICAgUElYX1NPUlQgKHBbMV0sIHBbMl0pOworICAgICAgUElYX1NPUlQgKHBbNF0sIHBbNV0pOworICAgICAgUElYX1NPUlQgKHBbN10sIHBbOF0pOworICAgICAgUElYX1NPUlQgKHBbMF0sIHBbMV0pOworICAgICAgUElYX1NPUlQgKHBbM10sIHBbNF0pOworICAgICAgUElYX1NPUlQgKHBbNl0sIHBbN10pOworICAgICAgUElYX1NPUlQgKHBbMV0sIHBbMl0pOworICAgICAgUElYX1NPUlQgKHBbNF0sIHBbNV0pOworICAgICAgUElYX1NPUlQgKHBbN10sIHBbOF0pOworICAgICAgUElYX1NPUlQgKHBbMF0sIHBbM10pOworICAgICAgUElYX1NPUlQgKHBbNV0sIHBbOF0pOworICAgICAgUElYX1NPUlQgKHBbNF0sIHBbN10pOworICAgICAgUElYX1NPUlQgKHBbM10sIHBbNl0pOworICAgICAgUElYX1NPUlQgKHBbMV0sIHBbNF0pOworICAgICAgUElYX1NPUlQgKHBbMl0sIHBbNV0pOworICAgICAgUElYX1NPUlQgKHBbNF0sIHBbN10pOworICAgICAgUElYX1NPUlQgKHBbNF0sIHBbMl0pOworICAgICAgUElYX1NPUlQgKHBbNl0sIHBbNF0pOworICAgICAgUElYX1NPUlQgKHBbNF0sIHBbMl0pOworICAgICAgZGVzdFtpXSA9IHBbNF07CisgICAgfQorICAgIGRlc3RbaV0gPSBzcmNbaV07CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92aWRlb19tZWRpYW5fdHJhbnNmb3JtX2ZyYW1lIChHc3RWaWRlb0ZpbHRlciAqIGZpbHRlciwKKyAgICBHc3RWaWRlb0ZyYW1lICogaW5fZnJhbWUsIEdzdFZpZGVvRnJhbWUgKiBvdXRfZnJhbWUpCit7CisgIEdzdFZpZGVvTWVkaWFuICptZWRpYW4gPSBHU1RfVklERU9fTUVESUFOIChmaWx0ZXIpOworCisgIGlmIChtZWRpYW4tPmZpbHRlcnNpemUgPT0gNSkgeworICAgIG1lZGlhbl81IChHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAwKSwKKyAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAob3V0X2ZyYW1lLCAwKSwKKyAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAwKSwKKyAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoaW5fZnJhbWUsIDApLAorICAgICAgICBHU1RfVklERU9fRlJBTUVfV0lEVEggKGluX2ZyYW1lKSwgR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoaW5fZnJhbWUpKTsKKworICAgIGlmIChtZWRpYW4tPmx1bV9vbmx5KSB7CisgICAgICBnc3RfdmlkZW9fZnJhbWVfY29weV9wbGFuZSAob3V0X2ZyYW1lLCBpbl9mcmFtZSwgMSk7CisgICAgICBnc3RfdmlkZW9fZnJhbWVfY29weV9wbGFuZSAob3V0X2ZyYW1lLCBpbl9mcmFtZSwgMik7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lZGlhbl81IChHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAxKSwKKyAgICAgICAgICBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRfZnJhbWUsIDEpLAorICAgICAgICAgIEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMSksCisgICAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoaW5fZnJhbWUsIDEpLAorICAgICAgICAgIEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpIC8gMiwKKyAgICAgICAgICBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSkgLyAyKTsKKyAgICAgIG1lZGlhbl81IChHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAob3V0X2ZyYW1lLCAyKSwKKyAgICAgICAgICBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRfZnJhbWUsIDIpLAorICAgICAgICAgIEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChpbl9mcmFtZSwgMiksCisgICAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX1NUUklERSAoaW5fZnJhbWUsIDIpLAorICAgICAgICAgIEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpIC8gMiwKKyAgICAgICAgICBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSkgLyAyKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbWVkaWFuXzkgKEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDApLAorICAgICAgICBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChvdXRfZnJhbWUsIDApLAorICAgICAgICBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoaW5fZnJhbWUsIDApLAorICAgICAgICBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMCksCisgICAgICAgIEdTVF9WSURFT19GUkFNRV9XSURUSCAoaW5fZnJhbWUpLCBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChpbl9mcmFtZSkpOworCisgICAgaWYgKG1lZGlhbi0+bHVtX29ubHkpIHsKKyAgICAgIGdzdF92aWRlb19mcmFtZV9jb3B5X3BsYW5lIChvdXRfZnJhbWUsIGluX2ZyYW1lLCAxKTsKKyAgICAgIGdzdF92aWRlb19mcmFtZV9jb3B5X3BsYW5lIChvdXRfZnJhbWUsIGluX2ZyYW1lLCAyKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVkaWFuXzkgKEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDEpLAorICAgICAgICAgIEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dF9mcmFtZSwgMSksCisgICAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAxKSwKKyAgICAgICAgICBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMSksCisgICAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSkgLyAyLAorICAgICAgICAgIEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKSAvIDIpOworICAgICAgbWVkaWFuXzkgKEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChvdXRfZnJhbWUsIDIpLAorICAgICAgICAgIEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKG91dF9mcmFtZSwgMiksCisgICAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGluX2ZyYW1lLCAyKSwKKyAgICAgICAgICBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFIChpbl9mcmFtZSwgMiksCisgICAgICAgICAgR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChpbl9mcmFtZSkgLyAyLAorICAgICAgICAgIEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGluX2ZyYW1lKSAvIDIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19tZWRpYW5fc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFZpZGVvTWVkaWFuICptZWRpYW47CisKKyAgbWVkaWFuID0gR1NUX1ZJREVPX01FRElBTiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfRklMVEVSU0laRToKKyAgICAgIG1lZGlhbi0+ZmlsdGVyc2l6ZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9MVU1fT05MWToKKyAgICAgIG1lZGlhbi0+bHVtX29ubHkgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb19tZWRpYW5fZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFZpZGVvTWVkaWFuICptZWRpYW47CisKKyAgbWVkaWFuID0gR1NUX1ZJREVPX01FRElBTiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfRklMVEVSU0laRToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBtZWRpYW4tPmZpbHRlcnNpemUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0xVTV9PTkxZOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIG1lZGlhbi0+bHVtX29ubHkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvbWVkaWFuLmggYi9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW9tZWRpYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODc3NjcyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvbWVkaWFuLmgKQEAgLTAsMCArMSw2NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9WSURFT19NRURJQU5fSF9fCisjZGVmaW5lIF9fR1NUX1ZJREVPX01FRElBTl9IX18KKworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb2ZpbHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfVklERU9fTUVESUFOIFwKKyAgKGdzdF92aWRlb19tZWRpYW5fZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1ZJREVPX01FRElBTihvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1ZJREVPX01FRElBTixHc3RWaWRlb01lZGlhbikpCisjZGVmaW5lIEdTVF9WSURFT19NRURJQU5fQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVklERU9fTUVESUFOLEdzdFZpZGVvTWVkaWFuQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVklERU9fTUVESUFOKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVklERU9fTUVESUFOKSkKKyNkZWZpbmUgR1NUX0lTX1ZJREVPX01FRElBTl9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9WSURFT19NRURJQU4pKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VmlkZW9NZWRpYW4gR3N0VmlkZW9NZWRpYW47Cit0eXBlZGVmIHN0cnVjdCBfR3N0VmlkZW9NZWRpYW5DbGFzcyBHc3RWaWRlb01lZGlhbkNsYXNzOworCit0eXBlZGVmIGVudW0KK3sKKyAgR1NUX1ZJREVPX01FRElBTl9TSVpFXzUgPSA1LAorICBHU1RfVklERU9fTUVESUFOX1NJWkVfOSA9IDkKK30gR3N0VmlkZW9NZWRpYW5TaXplOworCitzdHJ1Y3QgX0dzdFZpZGVvTWVkaWFuIHsKKyAgR3N0VmlkZW9GaWx0ZXIgcGFyZW50OworCisgIEdzdFZpZGVvTWVkaWFuU2l6ZSBmaWx0ZXJzaXplOworICBnYm9vbGVhbiBsdW1fb25seTsKK307CisKK3N0cnVjdCBfR3N0VmlkZW9NZWRpYW5DbGFzcyB7CisgIEdzdFZpZGVvRmlsdGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3ZpZGVvX21lZGlhbl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9WSURFT19NRURJQU5fSF9fICovCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9maWx0ZXIvZ3N0dmlkZW90ZW1wbGF0ZS5jIGIvZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjA1MjZhCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvZmlsdGVyL2dzdHZpZGVvdGVtcGxhdGUuYwpAQCAtMCwwICsxLDI1MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwMz4gRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSB3YXMgKHByb2JhYmx5KSBnZW5lcmF0ZWQgZnJvbQorICogJElkJAorICogYW5kCisgKiBNQUtFRklMVEVSVkVSU0lPTgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3R2aWRlb2ZpbHRlci5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIEdTVF9UWVBFX1ZJREVPVEVNUExBVEUgXAorICAoZ3N0X3ZpZGVvdGVtcGxhdGVfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1ZJREVPVEVNUExBVEUob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9WSURFT1RFTVBMQVRFLEdzdFZpZGVvdGVtcGxhdGUpKQorI2RlZmluZSBHU1RfVklERU9URU1QTEFURV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WSURFT1RFTVBMQVRFLEdzdFZpZGVvdGVtcGxhdGVDbGFzcykpCisjZGVmaW5lIEdTVF9JU19WSURFT1RFTVBMQVRFKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVklERU9URU1QTEFURSkpCisjZGVmaW5lIEdTVF9JU19WSURFT1RFTVBMQVRFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1ZJREVPVEVNUExBVEUpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VmlkZW90ZW1wbGF0ZSBHc3RWaWRlb3RlbXBsYXRlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZpZGVvdGVtcGxhdGVDbGFzcyBHc3RWaWRlb3RlbXBsYXRlQ2xhc3M7CisKK3N0cnVjdCBfR3N0VmlkZW90ZW1wbGF0ZQoreworICBHc3RWaWRlb2ZpbHRlciB2aWRlb2ZpbHRlcjsKKworfTsKKworc3RydWN0IF9Hc3RWaWRlb3RlbXBsYXRlQ2xhc3MKK3sKKyAgR3N0VmlkZW9maWx0ZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCisKKy8qIEdzdFZpZGVvdGVtcGxhdGUgc2lnbmFscyBhbmQgYXJncyAqLworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCitlbnVtCit7CisgIFBST1BfMAorICAgICAgLyogRklMTCBNRSAqLworfTsKKworc3RhdGljIHZvaWQgZ3N0X3ZpZGVvdGVtcGxhdGVfYmFzZV9pbml0IChncG9pbnRlciBnX2NsYXNzKTsKK3N0YXRpYyB2b2lkIGdzdF92aWRlb3RlbXBsYXRlX2NsYXNzX2luaXQgKGdwb2ludGVyIGdfY2xhc3MsCisgICAgZ3BvaW50ZXIgY2xhc3NfZGF0YSk7CitzdGF0aWMgdm9pZCBnc3RfdmlkZW90ZW1wbGF0ZV9pbml0IChHVHlwZUluc3RhbmNlICogaW5zdGFuY2UsIGdwb2ludGVyIGdfY2xhc3MpOworCitzdGF0aWMgdm9pZCBnc3RfdmlkZW90ZW1wbGF0ZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfdmlkZW90ZW1wbGF0ZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyB2b2lkIGdzdF92aWRlb3RlbXBsYXRlX3BsYW5hcjQxMSAoR3N0VmlkZW9maWx0ZXIgKiB2aWRlb2ZpbHRlciwKKyAgICB2b2lkICpkZXN0LCB2b2lkICpzcmMpOworc3RhdGljIHZvaWQgZ3N0X3ZpZGVvdGVtcGxhdGVfc2V0dXAgKEdzdFZpZGVvZmlsdGVyICogdmlkZW9maWx0ZXIpOworCitHVHlwZQorZ3N0X3ZpZGVvdGVtcGxhdGVfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB2aWRlb3RlbXBsYXRlX3R5cGUgPSAwOworCisgIGlmICghdmlkZW90ZW1wbGF0ZV90eXBlKSB7CisgICAgc3RhdGljIGNvbnN0IEdUeXBlSW5mbyB2aWRlb3RlbXBsYXRlX2luZm8gPSB7CisgICAgICBzaXplb2YgKEdzdFZpZGVvdGVtcGxhdGVDbGFzcyksCisgICAgICBnc3RfdmlkZW90ZW1wbGF0ZV9iYXNlX2luaXQsCisgICAgICBOVUxMLAorICAgICAgZ3N0X3ZpZGVvdGVtcGxhdGVfY2xhc3NfaW5pdCwKKyAgICAgIE5VTEwsCisgICAgICBOVUxMLAorICAgICAgc2l6ZW9mIChHc3RWaWRlb3RlbXBsYXRlKSwKKyAgICAgIDAsCisgICAgICBnc3RfdmlkZW90ZW1wbGF0ZV9pbml0LAorICAgIH07CisKKyAgICB2aWRlb3RlbXBsYXRlX3R5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChHU1RfVFlQRV9WSURFT0ZJTFRFUiwKKyAgICAgICAgIkdzdFZpZGVvdGVtcGxhdGUiLCAmdmlkZW90ZW1wbGF0ZV9pbmZvLCAwKTsKKyAgfQorICByZXR1cm4gdmlkZW90ZW1wbGF0ZV90eXBlOworfQorCitzdGF0aWMgY29uc3QgR3N0VmlkZW9maWx0ZXJGb3JtYXQgZ3N0X3ZpZGVvdGVtcGxhdGVfZm9ybWF0c1tdID0geworICB7Ikk0MjAiLCAxMiwgZ3N0X3ZpZGVvdGVtcGxhdGVfcGxhbmFyNDExLH0sCit9OworCisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW90ZW1wbGF0ZV9iYXNlX2luaXQgKGdwb2ludGVyIGdfY2xhc3MpCit7CisKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGdfY2xhc3MpOworICBHc3RWaWRlb2ZpbHRlckNsYXNzICp2aWRlb2ZpbHRlcl9jbGFzcyA9IEdTVF9WSURFT0ZJTFRFUl9DTEFTUyAoZ19jbGFzcyk7CisgIGludCBpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsICJWaWRlbyBmaWx0ZXIgdGVtcGxhdGUiLAorICAgICAgIkZpbHRlci9FZmZlY3QvVmlkZW8iLAorICAgICAgIlRlbXBsYXRlIGZvciBhIHZpZGVvIGZpbHRlciIsICJEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4iKTsKKworICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChnc3RfdmlkZW90ZW1wbGF0ZV9mb3JtYXRzKTsgaSsrKSB7CisgICAgZ3N0X3ZpZGVvZmlsdGVyX2NsYXNzX2FkZF9mb3JtYXQgKHZpZGVvZmlsdGVyX2NsYXNzLAorICAgICAgICBnc3RfdmlkZW90ZW1wbGF0ZV9mb3JtYXRzICsgaSk7CisgIH0KKworICBnc3RfdmlkZW9maWx0ZXJfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZXMgKEdTVF9WSURFT0ZJTFRFUl9DTEFTUyAoZ19jbGFzcykpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvdGVtcGxhdGVfY2xhc3NfaW5pdCAoZ3BvaW50ZXIgZ19jbGFzcywgZ3BvaW50ZXIgY2xhc3NfZGF0YSkKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RWaWRlb2ZpbHRlckNsYXNzICp2aWRlb2ZpbHRlcl9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGdfY2xhc3MpOworICB2aWRlb2ZpbHRlcl9jbGFzcyA9IEdTVF9WSURFT0ZJTFRFUl9DTEFTUyAoZ19jbGFzcyk7CisKKyNpZiAwCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfTUVUSE9ELAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJtZXRob2QiLCAibWV0aG9kIiwgIm1ldGhvZCIsCisgICAgICAgICAgR1NUX1RZUEVfVklERU9URU1QTEFURV9NRVRIT0QsIEdTVF9WSURFT1RFTVBMQVRFX01FVEhPRF8xLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworI2VuZGlmCisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3ZpZGVvdGVtcGxhdGVfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfdmlkZW90ZW1wbGF0ZV9nZXRfcHJvcGVydHk7CisKKyAgdmlkZW9maWx0ZXJfY2xhc3MtPnNldHVwID0gZ3N0X3ZpZGVvdGVtcGxhdGVfc2V0dXA7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW90ZW1wbGF0ZV9pbml0IChHVHlwZUluc3RhbmNlICogaW5zdGFuY2UsIGdwb2ludGVyIGdfY2xhc3MpCit7CisgIEdzdFZpZGVvdGVtcGxhdGUgKnZpZGVvdGVtcGxhdGUgPSBHU1RfVklERU9URU1QTEFURSAoaW5zdGFuY2UpOworICBHc3RWaWRlb2ZpbHRlciAqdmlkZW9maWx0ZXI7CisKKyAgR1NUX0RFQlVHICgiZ3N0X3ZpZGVvdGVtcGxhdGVfaW5pdCIpOworCisgIHZpZGVvZmlsdGVyID0gR1NUX1ZJREVPRklMVEVSICh2aWRlb3RlbXBsYXRlKTsKKworICAvKiBkbyBzdHVmZiAqLworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvdGVtcGxhdGVfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFZpZGVvdGVtcGxhdGUgKnNyYzsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfVklERU9URU1QTEFURSAob2JqZWN0KSk7CisgIHNyYyA9IEdTVF9WSURFT1RFTVBMQVRFIChvYmplY3QpOworCisgIEdTVF9ERUJVRyAoImdzdF92aWRlb3RlbXBsYXRlX3NldF9wcm9wZXJ0eSIpOworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyNpZiAwCisgICAgY2FzZSBQUk9QX01FVEhPRDoKKyAgICAgIHNyYy0+bWV0aG9kID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb3RlbXBsYXRlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWaWRlb3RlbXBsYXRlICpzcmM7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1ZJREVPVEVNUExBVEUgKG9iamVjdCkpOworICBzcmMgPSBHU1RfVklERU9URU1QTEFURSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyNpZiAwCisgICAgY2FzZSBQUk9QX01FVEhPRDoKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCBzcmMtPm1ldGhvZCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInZpZGVvdGVtcGxhdGUiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfVklERU9URU1QTEFURSk7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICB2aWRlb3RlbXBsYXRlLAorICAgICJUZW1wbGF0ZSBmb3IgYSB2aWRlbyBmaWx0ZXIiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQorCisgICAgIHN0YXRpYyB2b2lkIGdzdF92aWRlb3RlbXBsYXRlX3NldHVwIChHc3RWaWRlb2ZpbHRlciAqIHZpZGVvZmlsdGVyKQoreworICBHc3RWaWRlb3RlbXBsYXRlICp2aWRlb3RlbXBsYXRlOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19WSURFT1RFTVBMQVRFICh2aWRlb2ZpbHRlcikpOworICB2aWRlb3RlbXBsYXRlID0gR1NUX1ZJREVPVEVNUExBVEUgKHZpZGVvZmlsdGVyKTsKKworICAvKiBpZiBhbnkgc2V0dXAgbmVlZHMgdG8gYmUgZG9uZSwgZG8gaXQgaGVyZSAqLworCit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW90ZW1wbGF0ZV9wbGFuYXI0MTEgKEdzdFZpZGVvZmlsdGVyICogdmlkZW9maWx0ZXIsCisgICAgdm9pZCAqZGVzdCwgdm9pZCAqc3JjKQoreworICBHc3RWaWRlb3RlbXBsYXRlICp2aWRlb3RlbXBsYXRlOworICBpbnQgd2lkdGggPSBnc3RfdmlkZW9maWx0ZXJfZ2V0X2lucHV0X3dpZHRoICh2aWRlb2ZpbHRlcik7CisgIGludCBoZWlnaHQgPSBnc3RfdmlkZW9maWx0ZXJfZ2V0X2lucHV0X2hlaWdodCAodmlkZW9maWx0ZXIpOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19WSURFT1RFTVBMQVRFICh2aWRlb2ZpbHRlcikpOworICB2aWRlb3RlbXBsYXRlID0gR1NUX1ZJREVPVEVNUExBVEUgKHZpZGVvZmlsdGVyKTsKKworICAvKiBkbyBzb21ldGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4gIFRoaXMgc2ltcGx5IGNvcGllcyB0aGUgc291cmNlCisgICAqIHRvIHRoZSBkZXN0aW5hdGlvbi4gKi8KKyAgbWVtY3B5IChkZXN0LCBzcmMsIHdpZHRoICogaGVpZ2h0ICsgKHdpZHRoIC8gMikgKiAoaGVpZ2h0IC8gMikgKiAyKTsKK30KZGlmZiAtLWdpdCBhL2dzdC92aWRlb2ZpbHRlci9tYWtlX2ZpbHRlciBiL2dzdC92aWRlb2ZpbHRlci9tYWtlX2ZpbHRlcgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OTJkMGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvZmlsdGVyL21ha2VfZmlsdGVyCkBAIC0wLDAgKzEsMzkgQEAKKyMhL2Jpbi9zaAorCitMQU5HPUMKK2V4cG9ydCBMQU5HCitMQ19DT0xMQVRFPUMKK2V4cG9ydCBMQ19DT0xMQVRFCisKK1RlbXBsYXRlPSQxOworc3JjZmlsZT0kMjsKKworaWYgdGVzdCB4IiQxIiA9IHggOyB0aGVuCisJZWNobyAiJDAgT2JqZWN0bmFtZSBbc3JjZmlsZV1cbiI7CisJZWNobyAiICBjcmVhdGVzIGdzdG9iamVjdG5hbWUue2MsaH0gaW1wbGVtZW50aW5nIEdzdE9iamVjdG5hbWUsXG4iOworCWVjaG8gIiAgc3ViY2xhc3NpbmcgR3N0VmlkZW9maWx0ZXIuXG4iOworCWV4aXQgMTsKK2ZpCisKK2lmIHRlc3QgeCIkMiIgPSB4IDsgdGhlbgorCXNyY2ZpbGU9ImdzdHZpZGVvdGVtcGxhdGUuYyIKK2ZpCisKK2lkPWBlY2hvICckSWQkJyB8IHNlZCBcCisJLWUgJ3MvXCRJW2RdOiBcKFteJF0qXClcJC9cMS9nJ2AKK2VjaG8gJGlkCisKK1RFTVBMQVRFPWBlY2hvICRUZW1wbGF0ZSB8IHRyIFs6bG93ZXI6XSBbOnVwcGVyOl1gCit0ZW1wbGF0ZT1gZWNobyAkVGVtcGxhdGUgfCB0ciBbOnVwcGVyOl0gWzpsb3dlcjpdYAorCisjIHJlbWVtYmVyIHRvIGJyZWFrIHVwIHRoZSBJZDogaW4gdGhlIGxpbmUgYmVsb3cKK3NlZCBcCisJLWUgJ3MvZ3N0dmlkZW90ZW1wbGF0ZVwuYy9TT1VSQ0VGSUxFL2cnIFwKKwktZSAicy9WaWRlb3RlbXBsYXRlLyRUZW1wbGF0ZS9nIiBcCisJLWUgInMvdmlkZW90ZW1wbGF0ZS8kdGVtcGxhdGUvZyIgXAorCS1lICJzL1ZJREVPVEVNUExBVEUvJFRFTVBMQVRFL2ciIFwKKwktZSAncy9cJElbZF06IFwoW14kXSpcKVwkL1wxL2cnIFwKKwktZSAncy9TT1VSQ0VGSUxFL2dzdHZpZGVvdGVtcGxhdGVcLmMvZycgXAorCS1lICJzJU1BS0VGSUxURVJWRVJTSU9OJSRpZCVnIiBcCisJJHNyY2ZpbGUgPmdzdCR0ZW1wbGF0ZS5jLnRtcCAmJiBtdiBnc3QkdGVtcGxhdGUuYy50bXAgZ3N0JHRlbXBsYXRlLmMKKwpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvZmlsdGVyL21lc29uLmJ1aWxkIGIvZ3N0L3ZpZGVvZmlsdGVyL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYWMxZDUKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9maWx0ZXIvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxNiBAQAordmZpbHRlcl9zb3VyY2VzID0gWworICAncGx1Z2luLmMnLAorICAnZ3N0dmlkZW9mbGlwLmMnLAorICAnZ3N0dmlkZW9iYWxhbmNlLmMnLAorICAnZ3N0Z2FtbWEuYycsCisgICdnc3R2aWRlb21lZGlhbi5jJywKK10KKworZ3N0dmlkZW9maWx0ZXIgPSBsaWJyYXJ5KCdnc3R2aWRlb2ZpbHRlcicsCisgIHZmaWx0ZXJfc291cmNlcywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0dmlkZW9fZGVwLCBsaWJtXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2dzdC92aWRlb2ZpbHRlci9wbHVnaW4uYyBiL2dzdC92aWRlb2ZpbHRlci9wbHVnaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTczNmRjCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvZmlsdGVyL3BsdWdpbi5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImdzdGdhbW1hLmgiCisjaW5jbHVkZSAiZ3N0dmlkZW9mbGlwLmgiCisjaW5jbHVkZSAiZ3N0dmlkZW9iYWxhbmNlLmgiCisjaW5jbHVkZSAiZ3N0dmlkZW9tZWRpYW4uaCIKKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gKGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJnYW1tYSIsIEdTVF9SQU5LX05PTkUsIEdTVF9UWVBFX0dBTU1BKQorICAgICAgJiYgZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInZpZGVvYmFsYW5jZSIsIEdTVF9SQU5LX05PTkUsCisgICAgICAgICAgR1NUX1RZUEVfVklERU9fQkFMQU5DRSkKKyAgICAgICYmIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJ2aWRlb2ZsaXAiLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX1ZJREVPX0ZMSVApCisgICAgICAmJiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAidmlkZW9tZWRpYW4iLCBHU1RfUkFOS19OT05FLAorICAgICAgICAgIEdTVF9UWVBFX1ZJREVPX01FRElBTikpOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgdmlkZW9maWx0ZXIsCisgICAgIlZpZGVvIGZpbHRlcnMgcGx1Z2luIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9nc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbSBiL2dzdC92aWRlb21peGVyL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMDI4OWEKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9taXhlci9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIzIEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3R2aWRlb21peGVyLmxhCisKK09SQ19TT1VSQ0U9dmlkZW9taXhlcm9yYworCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL29yYy5tYWsKKworbGliZ3N0dmlkZW9taXhlcl9sYV9TT1VSQ0VTID0gXAorCWJsZW5kLmMgXAorCXZpZGVvbWl4ZXIyLmMKKworbm9kaXN0X2xpYmdzdHZpZGVvbWl4ZXJfbGFfU09VUkNFUyA9ICQoT1JDX05PRElTVF9TT1VSQ0VTKQorbGliZ3N0dmlkZW9taXhlcl9sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgJChPUkNfQ0ZMQUdTKQorbGliZ3N0dmlkZW9taXhlcl9sYV9MSUJBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgXAorCS1sZ3N0dmlkZW8tQEdTVF9BUElfVkVSU0lPTkAgXAorCSQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykgJChPUkNfTElCUykgJChMSUJNKQorbGliZ3N0dmlkZW9taXhlcl9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKKyMgaGVhZGVycyB3ZSBuZWVkIGJ1dCBkb24ndCB3YW50IGluc3RhbGxlZAorbm9pbnN0X0hFQURFUlMgPSBcCisJYmxlbmQuaCBcCisJdmlkZW9taXhlcjIuaCBcCisJdmlkZW9taXhlcjJwYWQuaApkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvbWl4ZXIvUkVBRE1FIGIvZ3N0L3ZpZGVvbWl4ZXIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OTRhNDgKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9taXhlci9SRUFETUUKQEAgLTAsMCArMSwyNyBAQAorVmlkZW8gTWl4ZXIKKy0tLS0tLS0tLS0tCisKK0EgZ2VuZXJpY2UgdmlkZW8gbWl4ZXIsIGl0IGJsZW5kcyB0aGUgYXl1diBidWZmZXJzIGZyb20gYWxsIHBhZHMgb250byAKK2EgbmV3IGJ1ZmZlci4gVGhlIG5ldyBidWZmZXIgaGFzIGJ5IGRlZmF1bHQgYSBjaGVja2VyYm9hcmQgcGF0dGVybiBidXQKK2l0cyBjb2xvciBjYW4gYmUgY2hhbmdlZCB3aXRoIGEgcHJvcGVydHkuCitUaGUgbWl4ZXIgY2FuIG1peCBzdHJlYW1zIHdpdGggZGlmZmVyZW50IGZyYW1lcmF0ZXMgYW5kIHZpZGVvIHNpemVzLiBJdAordXNlcyB0aGUgZHVyYXRpb24gdmFsdWUgb2YgdGhlIGJ1ZmZlciB0byBzY2hlZHVsZSB0aGUgcmVuZGVyaW5nIG9mIHRoZQorYnVmZmVycy4gRm9yIHN0cmVhbXMgd2l0aCBhIGRpZmZlcmVudCByZXNvbHRpb24gdGhhbiB0aGUgZmluYWwgb3V0cHV0CityZXNvbHV0aW9uIG9uZSBjYW4gc3BlY2lmeSB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciB3aGVyZSB0aGlzCitpbWFnZSBzaG91bGQgYmUgcGxhY2VkIHdpdGggdGhlIHBhZCBwcm9wZXJ0aWVzIHhwb3MgYW5kIHlwb3MuCitUaGUgb3ZlcmFsbCBhbHBoYSB2YWx1ZSBvZiBhIHN0cmVhbSBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgd2l0aCBhIHBhZAorcHJvcGVydHkuCitCeSBkZWZhdWx0LCB0aGUgc3RyZWFtcyBhcmUgYmxlbmRlZCBpbiB0aGUgb3JkZXIgdGhhdCB0aGUgcGFkcyB3ZXJlIAorcmVxdWVzdGVkIGZyb20gdGhlIGVsZW1lbnQuIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgY2hhbmdpbmcgdGhlIAorem9yZGVyIHBhZCBwcm9wZXJ0eSBvZiB0aGUgc3RyZWFtLCBhIHN0cmVhbSB3aXRoIGxvd2VyIHpvcmRlciBnZXRzCitkcmF3biBmaXJzdC4KKworCitUT0RPCistLS0tCisKKy0gcmVhbGx5IGltcGxlbWVudCB6b3JkZXIKKy0gdGFrZSBJNDIwIHl1diBhcyB3ZWxsCistIG91dHB1dCBBWVVWIGlmIHBvc3NpYmxlLgorLSBpbXBsZW1lbnQgZGlmZmVyZW50IGJsZW5kIG1vZGVzLCBzb21lIGNvZGUgaXMgYWxyZWFkeSBkb25lCistIHVzZSBmaWx0ZXIgY2FwcyBvbiBzcmNwYWQgdG8gZGVjaWRlIG9uIHRoZSBmaW5hbCBvdXRwdXQgc2l6ZQpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvbWl4ZXIvYmxlbmQuYyBiL2dzdC92aWRlb21peGVyL2JsZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzZjkyNQotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb21peGVyL2JsZW5kLmMKQEAgLTAsMCArMSwxMDYxIEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwNCBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pbmRmcnVpdCBCdi4KKyAqICAgQXV0aG9yOiBTam9lcmQgU2ltb25zIDxzam9lcmRAbHVvbi5uZXQ+CisgKiAgIEF1dGhvcjogQWxleCBVZ2FydGUgPGFsZXh1Z2FydGVAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFsZXggVWdhcnRlIDxhdWdhcnRlQHZpY29tdGVjaC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiYmxlbmQuaCIKKyNpbmNsdWRlICJ2aWRlb21peGVyb3JjLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjZGVmaW5lIEJMRU5EKEQsUyxhbHBoYSkgKCgoRCkgKiAoMjU2IC0gKGFscGhhKSkgKyAoUykgKiAoYWxwaGEpKSA+PiA4KQorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfdmlkZW9taXhlcl9ibGVuZF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfdmlkZW9taXhlcl9ibGVuZF9kZWJ1ZworCisvKiBCZWxvdyBhcmUgdGhlIGltcGxlbWVudGF0aW9ucyBvZiBldmVyeXRoaW5nICovCisKKy8qIEEzMiBpcyBmb3IgQVlVViwgQVJHQiBhbmQgQkdSQSAqLworI2RlZmluZSBCTEVORF9BMzIobmFtZSwgbWV0aG9kLCBMT09QKQkJXAorc3RhdGljIHZvaWQgXAorbWV0aG9kIyNfICMjbmFtZSAoR3N0VmlkZW9GcmFtZSAqIHNyY2ZyYW1lLCBnaW50IHhwb3MsIGdpbnQgeXBvcywgXAorICAgIGdkb3VibGUgc3JjX2FscGhhLCBHc3RWaWRlb0ZyYW1lICogZGVzdGZyYW1lKSBcCit7IFwKKyAgZ3VpbnQgc19hbHBoYTsgXAorICBnaW50IHNyY19zdHJpZGUsIGRlc3Rfc3RyaWRlOyBcCisgIGdpbnQgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQ7IFwKKyAgZ3VpbnQ4ICpzcmMsICpkZXN0OyBcCisgIGdpbnQgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0OyBcCisgIFwKKyAgc3JjX3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChzcmNmcmFtZSk7IFwKKyAgc3JjX2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKHNyY2ZyYW1lKTsgXAorICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjZnJhbWUsIDApOyBcCisgIHNyY19zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKHNyY2ZyYW1lLCAwKTsgXAorICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3RmcmFtZSwgMCk7IFwKKyAgZGVzdF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGRlc3RmcmFtZSwgMCk7IFwKKyAgZGVzdF93aWR0aCA9IEdTVF9WSURFT19GUkFNRV9DT01QX1dJRFRIIChkZXN0ZnJhbWUsIDApOyBcCisgIGRlc3RfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChkZXN0ZnJhbWUsIDApOyBcCisgIFwKKyAgc19hbHBoYSA9IENMQU1QICgoZ2ludCkgKHNyY19hbHBoYSAqIDI1NiksIDAsIDI1Nik7IFwKKyAgXAorICAvKiBJZiBpdCdzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQuLi4gd2UganVzdCByZXR1cm4gKi8gXAorICBpZiAoR19VTkxJS0VMWSAoc19hbHBoYSA9PSAwKSkgXAorICAgIHJldHVybjsgXAorICBcCisgIC8qIGFkanVzdCBzcmMgcG9pbnRlcnMgZm9yIG5lZ2F0aXZlIHNpemVzICovIFwKKyAgaWYgKHhwb3MgPCAwKSB7IFwKKyAgICBzcmMgKz0gLXhwb3MgKiA0OyBcCisgICAgc3JjX3dpZHRoIC09IC14cG9zOyBcCisgICAgeHBvcyA9IDA7IFwKKyAgfSBcCisgIGlmICh5cG9zIDwgMCkgeyBcCisgICAgc3JjICs9IC15cG9zICogc3JjX3N0cmlkZTsgXAorICAgIHNyY19oZWlnaHQgLT0gLXlwb3M7IFwKKyAgICB5cG9zID0gMDsgXAorICB9IFwKKyAgLyogYWRqdXN0IHdpZHRoL2hlaWdodCBpZiB0aGUgc3JjIGlzIGJpZ2dlciB0aGFuIGRlc3QgKi8gXAorICBpZiAoeHBvcyArIHNyY193aWR0aCA+IGRlc3Rfd2lkdGgpIHsgXAorICAgIHNyY193aWR0aCA9IGRlc3Rfd2lkdGggLSB4cG9zOyBcCisgIH0gXAorICBpZiAoeXBvcyArIHNyY19oZWlnaHQgPiBkZXN0X2hlaWdodCkgeyBcCisgICAgc3JjX2hlaWdodCA9IGRlc3RfaGVpZ2h0IC0geXBvczsgXAorICB9IFwKKyAgXAorICBpZiAoc3JjX2hlaWdodCA+IDAgJiYgc3JjX3dpZHRoID4gMCkgeyBcCisgICAgZGVzdCA9IGRlc3QgKyA0ICogeHBvcyArICh5cG9zICogZGVzdF9zdHJpZGUpOyBcCisgIFwKKyAgICBMT09QIChkZXN0LCBzcmMsIHNyY19oZWlnaHQsIHNyY193aWR0aCwgc3JjX3N0cmlkZSwgZGVzdF9zdHJpZGUsIHNfYWxwaGEpOyBcCisgIH0gXAorfQorCisjZGVmaW5lIEJMRU5EX0EzMl9MT09QKG5hbWUsIG1ldGhvZCkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgXAorXyMjbWV0aG9kIyNfbG9vcF8jI25hbWUgKGd1aW50OCAqIGRlc3QsIGNvbnN0IGd1aW50OCAqIHNyYywgZ2ludCBzcmNfaGVpZ2h0LCBcCisgICAgZ2ludCBzcmNfd2lkdGgsIGdpbnQgc3JjX3N0cmlkZSwgZ2ludCBkZXN0X3N0cmlkZSwgZ3VpbnQgc19hbHBoYSkgXAoreyBcCisgIHNfYWxwaGEgPSBNSU4gKDI1NSwgc19hbHBoYSk7IFwKKyAgdmlkZW9fbWl4ZXJfb3JjXyMjbWV0aG9kIyNfIyNuYW1lIChkZXN0LCBkZXN0X3N0cmlkZSwgc3JjLCBzcmNfc3RyaWRlLCBcCisgICAgICBzX2FscGhhLCBzcmNfd2lkdGgsIHNyY19oZWlnaHQpOyBcCit9CisKK0JMRU5EX0EzMl9MT09QIChhcmdiLCBibGVuZCk7CitCTEVORF9BMzJfTE9PUCAoYmdyYSwgYmxlbmQpOworQkxFTkRfQTMyX0xPT1AgKGFyZ2IsIG92ZXJsYXkpOworQkxFTkRfQTMyX0xPT1AgKGJncmEsIG92ZXJsYXkpOworCisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorQkxFTkRfQTMyIChhcmdiLCBibGVuZCwgX2JsZW5kX2xvb3BfYXJnYik7CitCTEVORF9BMzIgKGJncmEsIGJsZW5kLCBfYmxlbmRfbG9vcF9iZ3JhKTsKK0JMRU5EX0EzMiAoYXJnYiwgb3ZlcmxheSwgX292ZXJsYXlfbG9vcF9hcmdiKTsKK0JMRU5EX0EzMiAoYmdyYSwgb3ZlcmxheSwgX292ZXJsYXlfbG9vcF9iZ3JhKTsKKyNlbHNlCitCTEVORF9BMzIgKGFyZ2IsIGJsZW5kLCBfYmxlbmRfbG9vcF9iZ3JhKTsKK0JMRU5EX0EzMiAoYmdyYSwgYmxlbmQsIF9ibGVuZF9sb29wX2FyZ2IpOworQkxFTkRfQTMyIChhcmdiLCBvdmVybGF5LCBfb3ZlcmxheV9sb29wX2JncmEpOworQkxFTkRfQTMyIChiZ3JhLCBvdmVybGF5LCBfb3ZlcmxheV9sb29wX2FyZ2IpOworI2VuZGlmCisKKyNkZWZpbmUgQTMyX0NIRUNLRVJfQyhuYW1lLCBSR0IsIEEsIEMxLCBDMiwgQzMpIFwKK3N0YXRpYyB2b2lkIFwKK2ZpbGxfY2hlY2tlcl8jI25hbWUjI19jIChHc3RWaWRlb0ZyYW1lICogZnJhbWUpIFwKK3sgXAorICBnaW50IGksIGo7IFwKKyAgZ2ludCB2YWw7IFwKKyAgc3RhdGljIGNvbnN0IGdpbnQgdGFiW10gPSB7IDgwLCAxNjAsIDgwLCAxNjAgfTsgXAorICBnaW50IHdpZHRoLCBoZWlnaHQ7IFwKKyAgZ3VpbnQ4ICpkZXN0OyBcCisgIFwKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7IFwKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZnJhbWUsIDApOyBcCisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZnJhbWUsIDApOyBcCisgIFwKKyAgaWYgKCFSR0IpIHsgXAorICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeyBcCisgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeyBcCisgICAgICAgIGRlc3RbQV0gPSAweGZmOyBcCisgICAgICAgIGRlc3RbQzFdID0gdGFiWygoaSAmIDB4OCkgPj4gMykgKyAoKGogJiAweDgpID4+IDMpXTsgXAorICAgICAgICBkZXN0W0MyXSA9IDEyODsgXAorICAgICAgICBkZXN0W0MzXSA9IDEyODsgXAorICAgICAgICBkZXN0ICs9IDQ7IFwKKyAgICAgIH0gXAorICAgIH0gXAorICB9IGVsc2UgeyBcCisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7IFwKKyAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7IFwKKyAgICAgICAgdmFsID0gdGFiWygoaSAmIDB4OCkgPj4gMykgKyAoKGogJiAweDgpID4+IDMpXTsgXAorICAgICAgICBkZXN0W0FdID0gMHhGRjsgXAorICAgICAgICBkZXN0W0MxXSA9IHZhbDsgXAorICAgICAgICBkZXN0W0MyXSA9IHZhbDsgXAorICAgICAgICBkZXN0W0MzXSA9IHZhbDsgXAorICAgICAgICBkZXN0ICs9IDQ7IFwKKyAgICAgIH0gXAorICAgIH0gXAorICB9IFwKK30KKworQTMyX0NIRUNLRVJfQyAoYXJnYiwgVFJVRSwgMCwgMSwgMiwgMyk7CitBMzJfQ0hFQ0tFUl9DIChiZ3JhLCBUUlVFLCAzLCAyLCAxLCAwKTsKK0EzMl9DSEVDS0VSX0MgKGF5dXYsIEZBTFNFLCAwLCAxLCAyLCAzKTsKKworI2RlZmluZSBZVVZfVE9fUihZLFUsVikgKENMQU1QICgxLjE2NCAqIChZIC0gMTYpICsgMS41OTYgKiAoViAtIDEyOCksIDAsIDI1NSkpCisjZGVmaW5lIFlVVl9UT19HKFksVSxWKSAoQ0xBTVAgKDEuMTY0ICogKFkgLSAxNikgLSAwLjgxMyAqIChWIC0gMTI4KSAtIDAuMzkxICogKFUgLSAxMjgpLCAwLCAyNTUpKQorI2RlZmluZSBZVVZfVE9fQihZLFUsVikgKENMQU1QICgxLjE2NCAqIChZIC0gMTYpICsgMi4wMTggKiAoVSAtIDEyOCksIDAsIDI1NSkpCisKKyNkZWZpbmUgQTMyX0NPTE9SKG5hbWUsIFJHQiwgQSwgQzEsIEMyLCBDMykgXAorc3RhdGljIHZvaWQgXAorZmlsbF9jb2xvcl8jI25hbWUgKEdzdFZpZGVvRnJhbWUgKiBmcmFtZSwgZ2ludCBZLCBnaW50IFUsIGdpbnQgVikgXAoreyBcCisgIGdpbnQgYzEsIGMyLCBjMzsgXAorICBndWludDMyIHZhbDsgXAorICBnaW50IHdpZHRoLCBoZWlnaHQ7IFwKKyAgZ3VpbnQ4ICpkZXN0OyBcCisgIFwKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7IFwKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZnJhbWUsIDApOyBcCisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZnJhbWUsIDApOyBcCisgIFwKKyAgaWYgKFJHQikgeyBcCisgICAgYzEgPSBZVVZfVE9fUiAoWSwgVSwgVik7IFwKKyAgICBjMiA9IFlVVl9UT19HIChZLCBVLCBWKTsgXAorICAgIGMzID0gWVVWX1RPX0IgKFksIFUsIFYpOyBcCisgIH0gZWxzZSB7IFwKKyAgICBjMSA9IFk7IFwKKyAgICBjMiA9IFU7IFwKKyAgICBjMyA9IFY7IFwKKyAgfSBcCisgIHZhbCA9IEdVSU5UMzJfRlJPTV9CRSAoKDB4ZmYgPDwgQSkgfCAoYzEgPDwgQzEpIHwgKGMyIDw8IEMyKSB8IChjMyA8PCBDMykpOyBcCisgIFwKKyAgdmlkZW9fbWl4ZXJfb3JjX3NwbGF0X3UzMiAoKGd1aW50MzIgKikgZGVzdCwgdmFsLCBoZWlnaHQgKiB3aWR0aCk7IFwKK30KKworQTMyX0NPTE9SIChhcmdiLCBUUlVFLCAyNCwgMTYsIDgsIDApOworQTMyX0NPTE9SIChiZ3JhLCBUUlVFLCAwLCA4LCAxNiwgMjQpOworQTMyX0NPTE9SIChhYmdyLCBUUlVFLCAyNCwgMCwgOCwgMTYpOworQTMyX0NPTE9SIChyZ2JhLCBUUlVFLCAwLCAyNCwgMTYsIDgpOworQTMyX0NPTE9SIChheXV2LCBGQUxTRSwgMjQsIDE2LCA4LCAwKTsKKworLyogWTQ0NCwgWTQyQiwgSTQyMCwgWVYxMiwgWTQxQiAqLworI2RlZmluZSBQTEFOQVJfWVVWX0JMRU5EKGZvcm1hdF9uYW1lLGZvcm1hdF9lbnVtLHhfcm91bmQseV9yb3VuZCxNRU1DUFksQkxFTkRMT09QKSBcCitpbmxpbmUgc3RhdGljIHZvaWQgXAorX2JsZW5kXyMjZm9ybWF0X25hbWUgKGNvbnN0IGd1aW50OCAqIHNyYywgZ3VpbnQ4ICogZGVzdCwgXAorICAgIGdpbnQgc3JjX3N0cmlkZSwgZ2ludCBkZXN0X3N0cmlkZSwgZ2ludCBzcmNfd2lkdGgsIGdpbnQgc3JjX2hlaWdodCwgXAorICAgIGdkb3VibGUgc3JjX2FscGhhKSBcCit7IFwKKyAgZ2ludCBpOyBcCisgIGdpbnQgYl9hbHBoYTsgXAorICBcCisgIC8qIElmIGl0J3MgY29tcGxldGVseSB0cmFuc3BhcmVudC4uLiB3ZSBqdXN0IHJldHVybiAqLyBcCisgIGlmIChHX1VOTElLRUxZIChzcmNfYWxwaGEgPT0gMC4wKSkgeyBcCisgICAgR1NUX0lORk8gKCJGYXN0IGNvcHkgKGFscGhhID09IDAuMCkiKTsgXAorICAgIHJldHVybjsgXAorICB9IFwKKyAgXAorICAvKiBJZiBpdCdzIGNvbXBsZXRlbHkgb3BhcXVlLCB3ZSBkbyBhIGZhc3QgY29weSAqLyBcCisgIGlmIChHX1VOTElLRUxZIChzcmNfYWxwaGEgPT0gMS4wKSkgeyBcCisgICAgR1NUX0lORk8gKCJGYXN0IGNvcHkgKGFscGhhID09IDEuMCkiKTsgXAorICAgIGZvciAoaSA9IDA7IGkgPCBzcmNfaGVpZ2h0OyBpKyspIHsgXAorICAgICAgTUVNQ1BZIChkZXN0LCBzcmMsIHNyY193aWR0aCk7IFwKKyAgICAgIHNyYyArPSBzcmNfc3RyaWRlOyBcCisgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOyBcCisgICAgfSBcCisgICAgcmV0dXJuOyBcCisgIH0gXAorICBcCisgIGJfYWxwaGEgPSBDTEFNUCAoKGdpbnQpIChzcmNfYWxwaGEgKiAyNTYpLCAwLCAyNTYpOyBcCisgIFwKKyAgQkxFTkRMT09QKGRlc3QsIGRlc3Rfc3RyaWRlLCBzcmMsIHNyY19zdHJpZGUsIGJfYWxwaGEsIHNyY193aWR0aCwgc3JjX2hlaWdodCk7IFwKK30gXAorXAorc3RhdGljIHZvaWQgXAorYmxlbmRfIyNmb3JtYXRfbmFtZSAoR3N0VmlkZW9GcmFtZSAqIHNyY2ZyYW1lLCBnaW50IHhwb3MsIGdpbnQgeXBvcywgXAorICAgIGdkb3VibGUgc3JjX2FscGhhLCBHc3RWaWRlb0ZyYW1lICogZGVzdGZyYW1lKSBcCit7IFwKKyAgY29uc3QgZ3VpbnQ4ICpiX3NyYzsgXAorICBndWludDggKmJfZGVzdDsgXAorICBnaW50IGJfc3JjX3dpZHRoOyBcCisgIGdpbnQgYl9zcmNfaGVpZ2h0OyBcCisgIGdpbnQgeG9mZnNldCA9IDA7IFwKKyAgZ2ludCB5b2Zmc2V0ID0gMDsgXAorICBnaW50IHNyY19jb21wX3Jvd3N0cmlkZSwgZGVzdF9jb21wX3Jvd3N0cmlkZTsgXAorICBnaW50IHNyY19jb21wX2hlaWdodDsgXAorICBnaW50IHNyY19jb21wX3dpZHRoOyBcCisgIGdpbnQgY29tcF95cG9zLCBjb21wX3hwb3M7IFwKKyAgZ2ludCBjb21wX3lvZmZzZXQsIGNvbXBfeG9mZnNldDsgXAorICBnaW50IGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0OyBcCisgIGNvbnN0IEdzdFZpZGVvRm9ybWF0SW5mbyAqaW5mbzsgXAorICBnaW50IHNyY193aWR0aCwgc3JjX2hlaWdodDsgXAorICBcCisgIHNyY193aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoc3JjZnJhbWUpOyBcCisgIHNyY19oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChzcmNmcmFtZSk7IFwKKyAgXAorICBpbmZvID0gc3JjZnJhbWUtPmluZm8uZmluZm87IFwKKyAgZGVzdF93aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoZGVzdGZyYW1lKTsgXAorICBkZXN0X2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGRlc3RmcmFtZSk7IFwKKyAgXAorICB4cG9zID0geF9yb3VuZCAoeHBvcyk7IFwKKyAgeXBvcyA9IHlfcm91bmQgKHlwb3MpOyBcCisgIFwKKyAgYl9zcmNfd2lkdGggPSBzcmNfd2lkdGg7IFwKKyAgYl9zcmNfaGVpZ2h0ID0gc3JjX2hlaWdodDsgXAorICBcCisgIC8qIGFkanVzdCBzcmMgcG9pbnRlcnMgZm9yIG5lZ2F0aXZlIHNpemVzICovIFwKKyAgaWYgKHhwb3MgPCAwKSB7IFwKKyAgICB4b2Zmc2V0ID0gLXhwb3M7IFwKKyAgICBiX3NyY193aWR0aCAtPSAteHBvczsgXAorICAgIHhwb3MgPSAwOyBcCisgIH0gXAorICBpZiAoeXBvcyA8IDApIHsgXAorICAgIHlvZmZzZXQgPSAteXBvczsgXAorICAgIGJfc3JjX2hlaWdodCAtPSAteXBvczsgXAorICAgIHlwb3MgPSAwOyBcCisgIH0gXAorICAvKiBJZiB4IG9yIHkgb2Zmc2V0IGFyZSBsYXJnZXIgdGhlbiB0aGUgc291cmNlIGl0J3Mgb3V0c2lkZSBvZiB0aGUgcGljdHVyZSAqLyBcCisgIGlmICh4b2Zmc2V0ID49IHNyY193aWR0aCB8fCB5b2Zmc2V0ID49IHNyY19oZWlnaHQpIHsgXAorICAgIHJldHVybjsgXAorICB9IFwKKyAgXAorICAvKiBhZGp1c3Qgd2lkdGgvaGVpZ2h0IGlmIHRoZSBzcmMgaXMgYmlnZ2VyIHRoYW4gZGVzdCAqLyBcCisgIGlmICh4cG9zICsgYl9zcmNfd2lkdGggPiBkZXN0X3dpZHRoKSB7IFwKKyAgICBiX3NyY193aWR0aCA9IGRlc3Rfd2lkdGggLSB4cG9zOyBcCisgIH0gXAorICBpZiAoeXBvcyArIGJfc3JjX2hlaWdodCA+IGRlc3RfaGVpZ2h0KSB7IFwKKyAgICBiX3NyY19oZWlnaHQgPSBkZXN0X2hlaWdodCAtIHlwb3M7IFwKKyAgfSBcCisgIGlmIChiX3NyY193aWR0aCA8PSAwIHx8IGJfc3JjX2hlaWdodCA8PSAwKSB7IFwKKyAgICByZXR1cm47IFwKKyAgfSBcCisgIFwKKyAgLyogRmlyc3QgbWl4IFksIHRoZW4gVSwgdGhlbiBWICovIFwKKyAgYl9zcmMgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChzcmNmcmFtZSwgMCk7IFwKKyAgYl9kZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdGZyYW1lLCAwKTsgXAorICBzcmNfY29tcF9yb3dzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKHNyY2ZyYW1lLCAwKTsgXAorICBkZXN0X2NvbXBfcm93c3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0ZnJhbWUsIDApOyBcCisgIHNyY19jb21wX3dpZHRoID0gR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX1dJRFRIKGluZm8sIDAsIGJfc3JjX3dpZHRoKTsgXAorICBzcmNfY29tcF9oZWlnaHQgPSBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfSEVJR0hUKGluZm8sIDAsIGJfc3JjX2hlaWdodCk7IFwKKyAgY29tcF94cG9zID0gKHhwb3MgPT0gMCkgPyAwIDogR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX1dJRFRIIChpbmZvLCAwLCB4cG9zKTsgXAorICBjb21wX3lwb3MgPSAoeXBvcyA9PSAwKSA/IDAgOiBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfSEVJR0hUIChpbmZvLCAwLCB5cG9zKTsgXAorICBjb21wX3hvZmZzZXQgPSAoeG9mZnNldCA9PSAwKSA/IDAgOiBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfV0lEVEggKGluZm8sIDAsIHhvZmZzZXQpOyBcCisgIGNvbXBfeW9mZnNldCA9ICh5b2Zmc2V0ID09IDApID8gMCA6IEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9IRUlHSFQgKGluZm8sIDAsIHlvZmZzZXQpOyBcCisgIF9ibGVuZF8jI2Zvcm1hdF9uYW1lIChiX3NyYyArIGNvbXBfeG9mZnNldCArIGNvbXBfeW9mZnNldCAqIHNyY19jb21wX3Jvd3N0cmlkZSwgXAorICAgICAgYl9kZXN0ICsgY29tcF94cG9zICsgY29tcF95cG9zICogZGVzdF9jb21wX3Jvd3N0cmlkZSwgXAorICAgICAgc3JjX2NvbXBfcm93c3RyaWRlLCBcCisgICAgICBkZXN0X2NvbXBfcm93c3RyaWRlLCBzcmNfY29tcF93aWR0aCwgc3JjX2NvbXBfaGVpZ2h0LCBcCisgICAgICBzcmNfYWxwaGEpOyBcCisgIFwKKyAgYl9zcmMgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChzcmNmcmFtZSwgMSk7IFwKKyAgYl9kZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdGZyYW1lLCAxKTsgXAorICBzcmNfY29tcF9yb3dzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKHNyY2ZyYW1lLCAxKTsgXAorICBkZXN0X2NvbXBfcm93c3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0ZnJhbWUsIDEpOyBcCisgIHNyY19jb21wX3dpZHRoID0gR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX1dJRFRIKGluZm8sIDEsIGJfc3JjX3dpZHRoKTsgXAorICBzcmNfY29tcF9oZWlnaHQgPSBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfSEVJR0hUKGluZm8sIDEsIGJfc3JjX2hlaWdodCk7IFwKKyAgY29tcF94cG9zID0gKHhwb3MgPT0gMCkgPyAwIDogR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX1dJRFRIIChpbmZvLCAxLCB4cG9zKTsgXAorICBjb21wX3lwb3MgPSAoeXBvcyA9PSAwKSA/IDAgOiBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfSEVJR0hUIChpbmZvLCAxLCB5cG9zKTsgXAorICBjb21wX3hvZmZzZXQgPSAoeG9mZnNldCA9PSAwKSA/IDAgOiBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfV0lEVEggKGluZm8sIDEsIHhvZmZzZXQpOyBcCisgIGNvbXBfeW9mZnNldCA9ICh5b2Zmc2V0ID09IDApID8gMCA6IEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9IRUlHSFQgKGluZm8sIDEsIHlvZmZzZXQpOyBcCisgIF9ibGVuZF8jI2Zvcm1hdF9uYW1lIChiX3NyYyArIGNvbXBfeG9mZnNldCArIGNvbXBfeW9mZnNldCAqIHNyY19jb21wX3Jvd3N0cmlkZSwgXAorICAgICAgYl9kZXN0ICsgY29tcF94cG9zICsgY29tcF95cG9zICogZGVzdF9jb21wX3Jvd3N0cmlkZSwgXAorICAgICAgc3JjX2NvbXBfcm93c3RyaWRlLCBcCisgICAgICBkZXN0X2NvbXBfcm93c3RyaWRlLCBzcmNfY29tcF93aWR0aCwgc3JjX2NvbXBfaGVpZ2h0LCBcCisgICAgICBzcmNfYWxwaGEpOyBcCisgIFwKKyAgYl9zcmMgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChzcmNmcmFtZSwgMik7IFwKKyAgYl9kZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZGVzdGZyYW1lLCAyKTsgXAorICBzcmNfY29tcF9yb3dzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKHNyY2ZyYW1lLCAyKTsgXAorICBkZXN0X2NvbXBfcm93c3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0ZnJhbWUsIDIpOyBcCisgIHNyY19jb21wX3dpZHRoID0gR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX1dJRFRIKGluZm8sIDIsIGJfc3JjX3dpZHRoKTsgXAorICBzcmNfY29tcF9oZWlnaHQgPSBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfSEVJR0hUKGluZm8sIDIsIGJfc3JjX2hlaWdodCk7IFwKKyAgY29tcF94cG9zID0gKHhwb3MgPT0gMCkgPyAwIDogR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX1dJRFRIIChpbmZvLCAyLCB4cG9zKTsgXAorICBjb21wX3lwb3MgPSAoeXBvcyA9PSAwKSA/IDAgOiBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfSEVJR0hUIChpbmZvLCAyLCB5cG9zKTsgXAorICBjb21wX3hvZmZzZXQgPSAoeG9mZnNldCA9PSAwKSA/IDAgOiBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfV0lEVEggKGluZm8sIDIsIHhvZmZzZXQpOyBcCisgIGNvbXBfeW9mZnNldCA9ICh5b2Zmc2V0ID09IDApID8gMCA6IEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9IRUlHSFQgKGluZm8sIDIsIHlvZmZzZXQpOyBcCisgIF9ibGVuZF8jI2Zvcm1hdF9uYW1lIChiX3NyYyArIGNvbXBfeG9mZnNldCArIGNvbXBfeW9mZnNldCAqIHNyY19jb21wX3Jvd3N0cmlkZSwgXAorICAgICAgYl9kZXN0ICsgY29tcF94cG9zICsgY29tcF95cG9zICogZGVzdF9jb21wX3Jvd3N0cmlkZSwgXAorICAgICAgc3JjX2NvbXBfcm93c3RyaWRlLCBcCisgICAgICBkZXN0X2NvbXBfcm93c3RyaWRlLCBzcmNfY29tcF93aWR0aCwgc3JjX2NvbXBfaGVpZ2h0LCBcCisgICAgICBzcmNfYWxwaGEpOyBcCit9CisKKyNkZWZpbmUgUExBTkFSX1lVVl9GSUxMX0NIRUNLRVIoZm9ybWF0X25hbWUsIGZvcm1hdF9lbnVtLCBNRU1TRVQpIFwKK3N0YXRpYyB2b2lkIFwKK2ZpbGxfY2hlY2tlcl8jI2Zvcm1hdF9uYW1lIChHc3RWaWRlb0ZyYW1lICogZnJhbWUpIFwKK3sgXAorICBnaW50IGksIGo7IFwKKyAgc3RhdGljIGNvbnN0IGludCB0YWJbXSA9IHsgODAsIDE2MCwgODAsIDE2MCB9OyBcCisgIGd1aW50OCAqcDsgXAorICBnaW50IGNvbXBfd2lkdGgsIGNvbXBfaGVpZ2h0OyBcCisgIGdpbnQgcm93c3RyaWRlOyBcCisgIFwKKyAgcCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAwKTsgXAorICBjb21wX3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGZyYW1lLCAwKTsgXAorICBjb21wX2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZnJhbWUsIDApOyBcCisgIHJvd3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIDApOyBcCisgIFwKKyAgZm9yIChpID0gMDsgaSA8IGNvbXBfaGVpZ2h0OyBpKyspIHsgXAorICAgIGZvciAoaiA9IDA7IGogPCBjb21wX3dpZHRoOyBqKyspIHsgXAorICAgICAgKnArKyA9IHRhYlsoKGkgJiAweDgpID4+IDMpICsgKChqICYgMHg4KSA+PiAzKV07IFwKKyAgICB9IFwKKyAgICBwICs9IHJvd3N0cmlkZSAtIGNvbXBfd2lkdGg7IFwKKyAgfSBcCisgIFwKKyAgcCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAxKTsgXAorICBjb21wX3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGZyYW1lLCAxKTsgXAorICBjb21wX2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZnJhbWUsIDEpOyBcCisgIHJvd3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIDEpOyBcCisgIFwKKyAgZm9yIChpID0gMDsgaSA8IGNvbXBfaGVpZ2h0OyBpKyspIHsgXAorICAgIE1FTVNFVCAocCwgMHg4MCwgY29tcF93aWR0aCk7IFwKKyAgICBwICs9IHJvd3N0cmlkZTsgXAorICB9IFwKKyAgXAorICBwID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZnJhbWUsIDIpOyBcCisgIGNvbXBfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZnJhbWUsIDIpOyBcCisgIGNvbXBfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgMik7IFwKKyAgcm93c3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZSwgMik7IFwKKyAgXAorICBmb3IgKGkgPSAwOyBpIDwgY29tcF9oZWlnaHQ7IGkrKykgeyBcCisgICAgTUVNU0VUIChwLCAweDgwLCBjb21wX3dpZHRoKTsgXAorICAgIHAgKz0gcm93c3RyaWRlOyBcCisgIH0gXAorfQorCisjZGVmaW5lIFBMQU5BUl9ZVVZfRklMTF9DT0xPUihmb3JtYXRfbmFtZSxmb3JtYXRfZW51bSxNRU1TRVQpIFwKK3N0YXRpYyB2b2lkIFwKK2ZpbGxfY29sb3JfIyNmb3JtYXRfbmFtZSAoR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBcCisgICAgZ2ludCBjb2xZLCBnaW50IGNvbFUsIGdpbnQgY29sVikgXAoreyBcCisgIGd1aW50OCAqcDsgXAorICBnaW50IGNvbXBfd2lkdGgsIGNvbXBfaGVpZ2h0OyBcCisgIGdpbnQgcm93c3RyaWRlOyBcCisgIGdpbnQgaTsgXAorICBcCisgIHAgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgMCk7IFwKKyAgY29tcF93aWR0aCA9IEdTVF9WSURFT19GUkFNRV9DT01QX1dJRFRIIChmcmFtZSwgMCk7IFwKKyAgY29tcF9oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9IRUlHSFQgKGZyYW1lLCAwKTsgXAorICByb3dzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKTsgXAorICBcCisgIGZvciAoaSA9IDA7IGkgPCBjb21wX2hlaWdodDsgaSsrKSB7IFwKKyAgICBNRU1TRVQgKHAsIGNvbFksIGNvbXBfd2lkdGgpOyBcCisgICAgcCArPSByb3dzdHJpZGU7IFwKKyAgfSBcCisgIFwKKyAgcCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAxKTsgXAorICBjb21wX3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGZyYW1lLCAxKTsgXAorICBjb21wX2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZnJhbWUsIDEpOyBcCisgIHJvd3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIDEpOyBcCisgIFwKKyAgZm9yIChpID0gMDsgaSA8IGNvbXBfaGVpZ2h0OyBpKyspIHsgXAorICAgIE1FTVNFVCAocCwgY29sVSwgY29tcF93aWR0aCk7IFwKKyAgICBwICs9IHJvd3N0cmlkZTsgXAorICB9IFwKKyAgXAorICBwID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZnJhbWUsIDIpOyBcCisgIGNvbXBfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZnJhbWUsIDIpOyBcCisgIGNvbXBfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgMik7IFwKKyAgcm93c3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZSwgMik7IFwKKyAgXAorICBmb3IgKGkgPSAwOyBpIDwgY29tcF9oZWlnaHQ7IGkrKykgeyBcCisgICAgTUVNU0VUIChwLCBjb2xWLCBjb21wX3dpZHRoKTsgXAorICAgIHAgKz0gcm93c3RyaWRlOyBcCisgIH0gXAorfQorCisjZGVmaW5lIEdTVF9ST1VORF9VUF8xKHgpICh4KQorCitQTEFOQVJfWVVWX0JMRU5EIChpNDIwLCBHU1RfVklERU9fRk9STUFUX0k0MjAsIEdTVF9ST1VORF9VUF8yLAorICAgIEdTVF9ST1VORF9VUF8yLCBtZW1jcHksIHZpZGVvX21peGVyX29yY19ibGVuZF91OCk7CitQTEFOQVJfWVVWX0ZJTExfQ0hFQ0tFUiAoaTQyMCwgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwLCBtZW1zZXQpOworUExBTkFSX1lVVl9GSUxMX0NPTE9SIChpNDIwLCBHU1RfVklERU9fRk9STUFUX0k0MjAsIG1lbXNldCk7CitQTEFOQVJfWVVWX0ZJTExfQ09MT1IgKHl2MTIsIEdTVF9WSURFT19GT1JNQVRfWVYxMiwgbWVtc2V0KTsKK1BMQU5BUl9ZVVZfQkxFTkQgKHk0NDQsIEdTVF9WSURFT19GT1JNQVRfWTQ0NCwgR1NUX1JPVU5EX1VQXzEsCisgICAgR1NUX1JPVU5EX1VQXzEsIG1lbWNweSwgdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX3U4KTsKK1BMQU5BUl9ZVVZfRklMTF9DSEVDS0VSICh5NDQ0LCBHU1RfVklERU9fRk9STUFUX1k0NDQsIG1lbXNldCk7CitQTEFOQVJfWVVWX0ZJTExfQ09MT1IgKHk0NDQsIEdTVF9WSURFT19GT1JNQVRfWTQ0NCwgbWVtc2V0KTsKK1BMQU5BUl9ZVVZfQkxFTkQgKHk0MmIsIEdTVF9WSURFT19GT1JNQVRfWTQyQiwgR1NUX1JPVU5EX1VQXzIsCisgICAgR1NUX1JPVU5EX1VQXzEsIG1lbWNweSwgdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX3U4KTsKK1BMQU5BUl9ZVVZfRklMTF9DSEVDS0VSICh5NDJiLCBHU1RfVklERU9fRk9STUFUX1k0MkIsIG1lbXNldCk7CitQTEFOQVJfWVVWX0ZJTExfQ09MT1IgKHk0MmIsIEdTVF9WSURFT19GT1JNQVRfWTQyQiwgbWVtc2V0KTsKK1BMQU5BUl9ZVVZfQkxFTkQgKHk0MWIsIEdTVF9WSURFT19GT1JNQVRfWTQxQiwgR1NUX1JPVU5EX1VQXzQsCisgICAgR1NUX1JPVU5EX1VQXzEsIG1lbWNweSwgdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX3U4KTsKK1BMQU5BUl9ZVVZfRklMTF9DSEVDS0VSICh5NDFiLCBHU1RfVklERU9fRk9STUFUX1k0MUIsIG1lbXNldCk7CitQTEFOQVJfWVVWX0ZJTExfQ09MT1IgKHk0MWIsIEdTVF9WSURFT19GT1JNQVRfWTQxQiwgbWVtc2V0KTsKKworLyogTlYxMiwgTlYyMSAqLworI2RlZmluZSBOVl9ZVVZfQkxFTkQoZm9ybWF0X25hbWUsTUVNQ1BZLEJMRU5ETE9PUCkgXAoraW5saW5lIHN0YXRpYyB2b2lkIFwKK19ibGVuZF8jI2Zvcm1hdF9uYW1lIChjb25zdCBndWludDggKiBzcmMsIGd1aW50OCAqIGRlc3QsIFwKKyAgICBnaW50IHNyY19zdHJpZGUsIGdpbnQgZGVzdF9zdHJpZGUsIGdpbnQgc3JjX3dpZHRoLCBnaW50IHNyY19oZWlnaHQsIFwKKyAgICBnZG91YmxlIHNyY19hbHBoYSkgXAoreyBcCisgIGdpbnQgaTsgXAorICBnaW50IGJfYWxwaGE7IFwKKyAgXAorICAvKiBJZiBpdCdzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQuLi4gd2UganVzdCByZXR1cm4gKi8gXAorICBpZiAoR19VTkxJS0VMWSAoc3JjX2FscGhhID09IDAuMCkpIHsgXAorICAgIEdTVF9JTkZPICgiRmFzdCBjb3B5IChhbHBoYSA9PSAwLjApIik7IFwKKyAgICByZXR1cm47IFwKKyAgfSBcCisgIFwKKyAgLyogSWYgaXQncyBjb21wbGV0ZWx5IG9wYXF1ZSwgd2UgZG8gYSBmYXN0IGNvcHkgKi8gXAorICBpZiAoR19VTkxJS0VMWSAoc3JjX2FscGhhID09IDEuMCkpIHsgXAorICAgIEdTVF9JTkZPICgiRmFzdCBjb3B5IChhbHBoYSA9PSAxLjApIik7IFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3JjX2hlaWdodDsgaSsrKSB7IFwKKyAgICAgIE1FTUNQWSAoZGVzdCwgc3JjLCBzcmNfd2lkdGgpOyBcCisgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsgXAorICAgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsgXAorICAgIH0gXAorICAgIHJldHVybjsgXAorICB9IFwKKyAgXAorICBiX2FscGhhID0gQ0xBTVAgKChnaW50KSAoc3JjX2FscGhhICogMjU2KSwgMCwgMjU2KTsgXAorICBcCisgIEJMRU5ETE9PUChkZXN0LCBkZXN0X3N0cmlkZSwgc3JjLCBzcmNfc3RyaWRlLCBiX2FscGhhLCBzcmNfd2lkdGgsIHNyY19oZWlnaHQpOyBcCit9IFwKK1wKK3N0YXRpYyB2b2lkIFwKK2JsZW5kXyMjZm9ybWF0X25hbWUgKEdzdFZpZGVvRnJhbWUgKiBzcmNmcmFtZSwgZ2ludCB4cG9zLCBnaW50IHlwb3MsIFwKKyAgICBnZG91YmxlIHNyY19hbHBoYSwgR3N0VmlkZW9GcmFtZSAqIGRlc3RmcmFtZSkgICAgICAgICAgICAgICAgICAgIFwKK3sgXAorICBjb25zdCBndWludDggKmJfc3JjOyBcCisgIGd1aW50OCAqYl9kZXN0OyBcCisgIGdpbnQgYl9zcmNfd2lkdGg7IFwKKyAgZ2ludCBiX3NyY19oZWlnaHQ7IFwKKyAgZ2ludCB4b2Zmc2V0ID0gMDsgXAorICBnaW50IHlvZmZzZXQgPSAwOyBcCisgIGdpbnQgc3JjX2NvbXBfcm93c3RyaWRlLCBkZXN0X2NvbXBfcm93c3RyaWRlOyBcCisgIGdpbnQgc3JjX2NvbXBfaGVpZ2h0OyBcCisgIGdpbnQgc3JjX2NvbXBfd2lkdGg7IFwKKyAgZ2ludCBjb21wX3lwb3MsIGNvbXBfeHBvczsgXAorICBnaW50IGNvbXBfeW9mZnNldCwgY29tcF94b2Zmc2V0OyBcCisgIGdpbnQgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQ7IFwKKyAgY29uc3QgR3N0VmlkZW9Gb3JtYXRJbmZvICppbmZvOyBcCisgIGdpbnQgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0OyBcCisgIFwKKyAgc3JjX3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChzcmNmcmFtZSk7IFwKKyAgc3JjX2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKHNyY2ZyYW1lKTsgXAorICBcCisgIGluZm8gPSBzcmNmcmFtZS0+aW5mby5maW5mbzsgXAorICBkZXN0X3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChkZXN0ZnJhbWUpOyBcCisgIGRlc3RfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0hFSUdIVCAoZGVzdGZyYW1lKTsgXAorICBcCisgIHhwb3MgPSBHU1RfUk9VTkRfVVBfMiAoeHBvcyk7IFwKKyAgeXBvcyA9IEdTVF9ST1VORF9VUF8yICh5cG9zKTsgXAorICBcCisgIGJfc3JjX3dpZHRoID0gc3JjX3dpZHRoOyBcCisgIGJfc3JjX2hlaWdodCA9IHNyY19oZWlnaHQ7IFwKKyAgXAorICAvKiBhZGp1c3Qgc3JjIHBvaW50ZXJzIGZvciBuZWdhdGl2ZSBzaXplcyAqLyBcCisgIGlmICh4cG9zIDwgMCkgeyBcCisgICAgeG9mZnNldCA9IC14cG9zOyBcCisgICAgYl9zcmNfd2lkdGggLT0gLXhwb3M7IFwKKyAgICB4cG9zID0gMDsgXAorICB9IFwKKyAgaWYgKHlwb3MgPCAwKSB7IFwKKyAgICB5b2Zmc2V0ICs9IC15cG9zOyBcCisgICAgYl9zcmNfaGVpZ2h0IC09IC15cG9zOyBcCisgICAgeXBvcyA9IDA7IFwKKyAgfSBcCisgIC8qIElmIHggb3IgeSBvZmZzZXQgYXJlIGxhcmdlciB0aGVuIHRoZSBzb3VyY2UgaXQncyBvdXRzaWRlIG9mIHRoZSBwaWN0dXJlICovIFwKKyAgaWYgKHhvZmZzZXQgPiBzcmNfd2lkdGggfHwgeW9mZnNldCA+IHNyY19oZWlnaHQpIHsgXAorICAgIHJldHVybjsgXAorICB9IFwKKyAgXAorICAvKiBhZGp1c3Qgd2lkdGgvaGVpZ2h0IGlmIHRoZSBzcmMgaXMgYmlnZ2VyIHRoYW4gZGVzdCAqLyBcCisgIGlmICh4cG9zICsgc3JjX3dpZHRoID4gZGVzdF93aWR0aCkgeyBcCisgICAgYl9zcmNfd2lkdGggPSBkZXN0X3dpZHRoIC0geHBvczsgXAorICB9IFwKKyAgaWYgKHlwb3MgKyBzcmNfaGVpZ2h0ID4gZGVzdF9oZWlnaHQpIHsgXAorICAgIGJfc3JjX2hlaWdodCA9IGRlc3RfaGVpZ2h0IC0geXBvczsgXAorICB9IFwKKyAgaWYgKGJfc3JjX3dpZHRoIDwgMCB8fCBiX3NyY19oZWlnaHQgPCAwKSB7IFwKKyAgICByZXR1cm47IFwKKyAgfSBcCisgIFwKKyAgLyogRmlyc3QgbWl4IFksIHRoZW4gVVYgKi8gXAorICBiX3NyYyA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKHNyY2ZyYW1lLCAwKTsgXAorICBiX2Rlc3QgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChkZXN0ZnJhbWUsIDApOyBcCisgIHNyY19jb21wX3Jvd3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoc3JjZnJhbWUsIDApOyBcCisgIGRlc3RfY29tcF9yb3dzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGRlc3RmcmFtZSwgMCk7IFwKKyAgc3JjX2NvbXBfd2lkdGggPSBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfV0lEVEgoaW5mbywgMCwgYl9zcmNfd2lkdGgpOyBcCisgIHNyY19jb21wX2hlaWdodCA9IEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9IRUlHSFQoaW5mbywgMCwgYl9zcmNfaGVpZ2h0KTsgXAorICBjb21wX3hwb3MgPSAoeHBvcyA9PSAwKSA/IDAgOiBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfV0lEVEggKGluZm8sIDAsIHhwb3MpOyBcCisgIGNvbXBfeXBvcyA9ICh5cG9zID09IDApID8gMCA6IEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9IRUlHSFQgKGluZm8sIDAsIHlwb3MpOyBcCisgIGNvbXBfeG9mZnNldCA9ICh4b2Zmc2V0ID09IDApID8gMCA6IEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9XSURUSCAoaW5mbywgMCwgeG9mZnNldCk7IFwKKyAgY29tcF95b2Zmc2V0ID0gKHlvZmZzZXQgPT0gMCkgPyAwIDogR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX0hFSUdIVCAoaW5mbywgMCwgeW9mZnNldCk7IFwKKyAgX2JsZW5kXyMjZm9ybWF0X25hbWUgKGJfc3JjICsgY29tcF94b2Zmc2V0ICsgY29tcF95b2Zmc2V0ICogc3JjX2NvbXBfcm93c3RyaWRlLCBcCisgICAgICBiX2Rlc3QgKyBjb21wX3hwb3MgKyBjb21wX3lwb3MgKiBkZXN0X2NvbXBfcm93c3RyaWRlLCBcCisgICAgICBzcmNfY29tcF9yb3dzdHJpZGUsIFwKKyAgICAgIGRlc3RfY29tcF9yb3dzdHJpZGUsIHNyY19jb21wX3dpZHRoLCBzcmNfY29tcF9oZWlnaHQsIFwKKyAgICAgIHNyY19hbHBoYSk7IFwKKyAgXAorICBiX3NyYyA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChzcmNmcmFtZSwgMSk7IFwKKyAgYl9kZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3RmcmFtZSwgMSk7IFwKKyAgc3JjX2NvbXBfcm93c3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChzcmNmcmFtZSwgMSk7IFwKKyAgZGVzdF9jb21wX3Jvd3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZGVzdGZyYW1lLCAxKTsgXAorICBzcmNfY29tcF93aWR0aCA9IEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9XSURUSChpbmZvLCAxLCBiX3NyY193aWR0aCk7IFwKKyAgc3JjX2NvbXBfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX0hFSUdIVChpbmZvLCAxLCBiX3NyY19oZWlnaHQpOyBcCisgIGNvbXBfeHBvcyA9ICh4cG9zID09IDApID8gMCA6IEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9XSURUSCAoaW5mbywgMSwgeHBvcyk7IFwKKyAgY29tcF95cG9zID0gKHlwb3MgPT0gMCkgPyAwIDogR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX0hFSUdIVCAoaW5mbywgMSwgeXBvcyk7IFwKKyAgY29tcF94b2Zmc2V0ID0gKHhvZmZzZXQgPT0gMCkgPyAwIDogR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX1dJRFRIIChpbmZvLCAxLCB4b2Zmc2V0KTsgXAorICBjb21wX3lvZmZzZXQgPSAoeW9mZnNldCA9PSAwKSA/IDAgOiBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfSEVJR0hUIChpbmZvLCAxLCB5b2Zmc2V0KTsgXAorICBfYmxlbmRfIyNmb3JtYXRfbmFtZSAoYl9zcmMgKyBjb21wX3hvZmZzZXQgKiAyICsgY29tcF95b2Zmc2V0ICogc3JjX2NvbXBfcm93c3RyaWRlLCBcCisgICAgICBiX2Rlc3QgKyBjb21wX3hwb3MgKiAyICsgY29tcF95cG9zICogZGVzdF9jb21wX3Jvd3N0cmlkZSwgXAorICAgICAgc3JjX2NvbXBfcm93c3RyaWRlLCBcCisgICAgICBkZXN0X2NvbXBfcm93c3RyaWRlLCAyICogc3JjX2NvbXBfd2lkdGgsIHNyY19jb21wX2hlaWdodCwgXAorICAgICAgc3JjX2FscGhhKTsgXAorfQorCisjZGVmaW5lIE5WX1lVVl9GSUxMX0NIRUNLRVIoZm9ybWF0X25hbWUsIE1FTVNFVCkgICAgICAgIFwKK3N0YXRpYyB2b2lkIFwKK2ZpbGxfY2hlY2tlcl8jI2Zvcm1hdF9uYW1lIChHc3RWaWRlb0ZyYW1lICogZnJhbWUpIFwKK3sgXAorICBnaW50IGksIGo7IFwKKyAgc3RhdGljIGNvbnN0IGludCB0YWJbXSA9IHsgODAsIDE2MCwgODAsIDE2MCB9OyBcCisgIGd1aW50OCAqcDsgXAorICBnaW50IGNvbXBfd2lkdGgsIGNvbXBfaGVpZ2h0OyBcCisgIGdpbnQgcm93c3RyaWRlOyBcCisgIFwKKyAgcCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAwKTsgXAorICBjb21wX3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGZyYW1lLCAwKTsgXAorICBjb21wX2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZnJhbWUsIDApOyBcCisgIHJvd3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIDApOyBcCisgIFwKKyAgZm9yIChpID0gMDsgaSA8IGNvbXBfaGVpZ2h0OyBpKyspIHsgXAorICAgIGZvciAoaiA9IDA7IGogPCBjb21wX3dpZHRoOyBqKyspIHsgXAorICAgICAgKnArKyA9IHRhYlsoKGkgJiAweDgpID4+IDMpICsgKChqICYgMHg4KSA+PiAzKV07IFwKKyAgICB9IFwKKyAgICBwICs9IHJvd3N0cmlkZSAtIGNvbXBfd2lkdGg7IFwKKyAgfSBcCisgIFwKKyAgcCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMSk7IFwKKyAgY29tcF93aWR0aCA9IEdTVF9WSURFT19GUkFNRV9DT01QX1dJRFRIIChmcmFtZSwgMSk7IFwKKyAgY29tcF9oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9IRUlHSFQgKGZyYW1lLCAxKTsgXAorICByb3dzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAxKTsgXAorICBcCisgIGZvciAoaSA9IDA7IGkgPCBjb21wX2hlaWdodDsgaSsrKSB7IFwKKyAgICBNRU1TRVQgKHAsIDB4ODAsIGNvbXBfd2lkdGggKiAyKTsgXAorICAgIHAgKz0gcm93c3RyaWRlOyBcCisgIH0gXAorfQorCisjZGVmaW5lIE5WX1lVVl9GSUxMX0NPTE9SKGZvcm1hdF9uYW1lLE1FTVNFVCkgXAorc3RhdGljIHZvaWQgXAorZmlsbF9jb2xvcl8jI2Zvcm1hdF9uYW1lIChHc3RWaWRlb0ZyYW1lICogZnJhbWUsIFwKKyAgICBnaW50IGNvbFksIGdpbnQgY29sVSwgZ2ludCBjb2xWKSBcCit7IFwKKyAgZ3VpbnQ4ICp5LCAqdSwgKnY7IFwKKyAgZ2ludCBjb21wX3dpZHRoLCBjb21wX2hlaWdodDsgXAorICBnaW50IHJvd3N0cmlkZTsgXAorICBnaW50IGksIGo7IFwKKyAgXAorICB5ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoZnJhbWUsIDApOyBcCisgIGNvbXBfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfQ09NUF9XSURUSCAoZnJhbWUsIDApOyBcCisgIGNvbXBfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUIChmcmFtZSwgMCk7IFwKKyAgcm93c3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChmcmFtZSwgMCk7IFwKKyAgXAorICBmb3IgKGkgPSAwOyBpIDwgY29tcF9oZWlnaHQ7IGkrKykgeyBcCisgICAgTUVNU0VUICh5LCBjb2xZLCBjb21wX3dpZHRoKTsgXAorICAgIHkgKz0gcm93c3RyaWRlOyBcCisgIH0gXAorICBcCisgIHUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9EQVRBIChmcmFtZSwgMSk7IFwKKyAgdiA9IEdTVF9WSURFT19GUkFNRV9DT01QX0RBVEEgKGZyYW1lLCAyKTsgXAorICBjb21wX3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfV0lEVEggKGZyYW1lLCAxKTsgXAorICBjb21wX2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoZnJhbWUsIDEpOyBcCisgIHJvd3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoZnJhbWUsIDEpOyBcCisgIFwKKyAgZm9yIChpID0gMDsgaSA8IGNvbXBfaGVpZ2h0OyBpKyspIHsgXAorICAgIGZvciAoaiA9IDA7IGogPCBjb21wX3dpZHRoOyBqKyspIHsgXAorICAgICAgdVtqKjJdID0gY29sVTsgXAorICAgICAgdltqKjJdID0gY29sVjsgXAorICAgIH0gXAorICAgIHUgKz0gcm93c3RyaWRlOyBcCisgICAgdiArPSByb3dzdHJpZGU7IFwKKyAgfSBcCit9CisKK05WX1lVVl9CTEVORCAobnYxMiwgbWVtY3B5LCB2aWRlb19taXhlcl9vcmNfYmxlbmRfdTgpOworTlZfWVVWX0ZJTExfQ0hFQ0tFUiAobnYxMiwgbWVtc2V0KTsKK05WX1lVVl9GSUxMX0NPTE9SIChudjEyLCBtZW1zZXQpOworTlZfWVVWX0JMRU5EIChudjIxLCBtZW1jcHksIHZpZGVvX21peGVyX29yY19ibGVuZF91OCk7CitOVl9ZVVZfRklMTF9DSEVDS0VSIChudjIxLCBtZW1zZXQpOworCisvKiBSR0IsIEJHUiwgeFJHQiwgeEJHUiwgUkdCeCwgQkdSeCAqLworCisjZGVmaW5lIFJHQl9CTEVORChuYW1lLCBicHAsIE1FTUNQWSwgQkxFTkRMT09QKSBcCitzdGF0aWMgdm9pZCBcCitibGVuZF8jI25hbWUgKEdzdFZpZGVvRnJhbWUgKiBzcmNmcmFtZSwgZ2ludCB4cG9zLCBnaW50IHlwb3MsIFwKKyAgICBnZG91YmxlIHNyY19hbHBoYSwgR3N0VmlkZW9GcmFtZSAqIGRlc3RmcmFtZSkgXAoreyBcCisgIGdpbnQgYl9hbHBoYTsgXAorICBnaW50IGk7IFwKKyAgZ2ludCBzcmNfc3RyaWRlLCBkZXN0X3N0cmlkZTsgXAorICBnaW50IGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0OyBcCisgIGd1aW50OCAqZGVzdCwgKnNyYzsgXAorICBnaW50IHNyY193aWR0aCwgc3JjX2hlaWdodDsgXAorICBcCisgIHNyY193aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoc3JjZnJhbWUpOyBcCisgIHNyY19oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChzcmNmcmFtZSk7IFwKKyAgXAorICBzcmMgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoc3JjZnJhbWUsIDApOyBcCisgIGRlc3QgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfREFUQSAoZGVzdGZyYW1lLCAwKTsgXAorICBcCisgIGRlc3Rfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGRlc3RmcmFtZSk7IFwKKyAgZGVzdF9oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChkZXN0ZnJhbWUpOyBcCisgIFwKKyAgc3JjX3N0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1NUUklERSAoc3JjZnJhbWUsIDApOyBcCisgIGRlc3Rfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChkZXN0ZnJhbWUsIDApOyBcCisgIFwKKyAgYl9hbHBoYSA9IENMQU1QICgoZ2ludCkgKHNyY19hbHBoYSAqIDI1NiksIDAsIDI1Nik7IFwKKyAgXAorICAvKiBhZGp1c3Qgc3JjIHBvaW50ZXJzIGZvciBuZWdhdGl2ZSBzaXplcyAqLyBcCisgIGlmICh4cG9zIDwgMCkgeyBcCisgICAgc3JjICs9IC14cG9zICogYnBwOyBcCisgICAgc3JjX3dpZHRoIC09IC14cG9zOyBcCisgICAgeHBvcyA9IDA7IFwKKyAgfSBcCisgIGlmICh5cG9zIDwgMCkgeyBcCisgICAgc3JjICs9IC15cG9zICogc3JjX3N0cmlkZTsgXAorICAgIHNyY19oZWlnaHQgLT0gLXlwb3M7IFwKKyAgICB5cG9zID0gMDsgXAorICB9IFwKKyAgLyogYWRqdXN0IHdpZHRoL2hlaWdodCBpZiB0aGUgc3JjIGlzIGJpZ2dlciB0aGFuIGRlc3QgKi8gXAorICBpZiAoeHBvcyArIHNyY193aWR0aCA+IGRlc3Rfd2lkdGgpIHsgXAorICAgIHNyY193aWR0aCA9IGRlc3Rfd2lkdGggLSB4cG9zOyBcCisgIH0gXAorICBpZiAoeXBvcyArIHNyY19oZWlnaHQgPiBkZXN0X2hlaWdodCkgeyBcCisgICAgc3JjX2hlaWdodCA9IGRlc3RfaGVpZ2h0IC0geXBvczsgXAorICB9IFwKKyAgXAorICBkZXN0ID0gZGVzdCArIGJwcCAqIHhwb3MgKyAoeXBvcyAqIGRlc3Rfc3RyaWRlKTsgXAorICAvKiBJZiBpdCdzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQuLi4gd2UganVzdCByZXR1cm4gKi8gXAorICBpZiAoR19VTkxJS0VMWSAoc3JjX2FscGhhID09IDAuMCkpIHsgXAorICAgIEdTVF9JTkZPICgiRmFzdCBjb3B5IChhbHBoYSA9PSAwLjApIik7IFwKKyAgICByZXR1cm47IFwKKyAgfSBcCisgIFwKKyAgLyogSWYgaXQncyBjb21wbGV0ZWx5IG9wYXF1ZSwgd2UgZG8gYSBmYXN0IGNvcHkgKi8gXAorICBpZiAoR19VTkxJS0VMWSAoc3JjX2FscGhhID09IDEuMCkpIHsgXAorICAgIEdTVF9JTkZPICgiRmFzdCBjb3B5IChhbHBoYSA9PSAxLjApIik7IFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3JjX2hlaWdodDsgaSsrKSB7IFwKKyAgICAgIE1FTUNQWSAoZGVzdCwgc3JjLCBicHAgKiBzcmNfd2lkdGgpOyBcCisgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsgXAorICAgICAgZGVzdCArPSBkZXN0X3N0cmlkZTsgXAorICAgIH0gXAorICAgIHJldHVybjsgXAorICB9IFwKKyAgXAorICBCTEVORExPT1AoZGVzdCwgZGVzdF9zdHJpZGUsIHNyYywgc3JjX3N0cmlkZSwgYl9hbHBoYSwgc3JjX3dpZHRoICogYnBwLCBzcmNfaGVpZ2h0KTsgXAorfQorCisjZGVmaW5lIFJHQl9GSUxMX0NIRUNLRVJfQyhuYW1lLCBicHAsIHIsIGcsIGIpIFwKK3N0YXRpYyB2b2lkIFwKK2ZpbGxfY2hlY2tlcl8jI25hbWUjI19jIChHc3RWaWRlb0ZyYW1lICogZnJhbWUpIFwKK3sgXAorICBnaW50IGksIGo7IFwKKyAgc3RhdGljIGNvbnN0IGludCB0YWJbXSA9IHsgODAsIDE2MCwgODAsIDE2MCB9OyBcCisgIGdpbnQgc3RyaWRlLCBkZXN0X2FkZCwgd2lkdGgsIGhlaWdodDsgXAorICBndWludDggKmRlc3Q7IFwKKyAgXAorICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoZnJhbWUpOyBcCisgIGhlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKGZyYW1lKTsgXAorICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGZyYW1lLCAwKTsgXAorICBzdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKTsgXAorICBkZXN0X2FkZCA9IHN0cmlkZSAtIHdpZHRoICogYnBwOyBcCisgIFwKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7IFwKKyAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeyBcCisgICAgICBkZXN0W3JdID0gdGFiWygoaSAmIDB4OCkgPj4gMykgKyAoKGogJiAweDgpID4+IDMpXTsgICAgICAgLyogcmVkICovIFwKKyAgICAgIGRlc3RbZ10gPSB0YWJbKChpICYgMHg4KSA+PiAzKSArICgoaiAmIDB4OCkgPj4gMyldOyAgICAgICAvKiBncmVlbiAqLyBcCisgICAgICBkZXN0W2JdID0gdGFiWygoaSAmIDB4OCkgPj4gMykgKyAoKGogJiAweDgpID4+IDMpXTsgICAgICAgLyogYmx1ZSAqLyBcCisgICAgICBkZXN0ICs9IGJwcDsgXAorICAgIH0gXAorICAgIGRlc3QgKz0gZGVzdF9hZGQ7IFwKKyAgfSBcCit9CisKKyNkZWZpbmUgUkdCX0ZJTExfQ09MT1IobmFtZSwgYnBwLCBNRU1TRVRfUkdCKSBcCitzdGF0aWMgdm9pZCBcCitmaWxsX2NvbG9yXyMjbmFtZSAoR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBcCisgICAgZ2ludCBjb2xZLCBnaW50IGNvbFUsIGdpbnQgY29sVikgXAoreyBcCisgIGdpbnQgcmVkLCBncmVlbiwgYmx1ZTsgXAorICBnaW50IGk7IFwKKyAgZ2ludCBkZXN0X3N0cmlkZTsgXAorICBnaW50IHdpZHRoLCBoZWlnaHQ7IFwKKyAgZ3VpbnQ4ICpkZXN0OyBcCisgIFwKKyAgd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGZyYW1lKTsgXAorICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChmcmFtZSk7IFwKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7IFwKKyAgZGVzdF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKTsgXAorICBcCisgIHJlZCA9IFlVVl9UT19SIChjb2xZLCBjb2xVLCBjb2xWKTsgXAorICBncmVlbiA9IFlVVl9UT19HIChjb2xZLCBjb2xVLCBjb2xWKTsgXAorICBibHVlID0gWVVWX1RPX0IgKGNvbFksIGNvbFUsIGNvbFYpOyBcCisgIFwKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7IFwKKyAgICBNRU1TRVRfUkdCIChkZXN0LCByZWQsIGdyZWVuLCBibHVlLCB3aWR0aCk7IFwKKyAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOyBcCisgIH0gXAorfQorCisjZGVmaW5lIE1FTVNFVF9SR0JfQyhuYW1lLCByLCBnLCBiKSBcCitzdGF0aWMgaW5saW5lIHZvaWQgXAorX21lbXNldF8jI25hbWUjI19jIChndWludDgqIGRlc3QsIGdpbnQgcmVkLCBnaW50IGdyZWVuLCBnaW50IGJsdWUsIGdpbnQgd2lkdGgpIHsgXAorICBnaW50IGo7IFwKKyAgXAorICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeyBcCisgICAgZGVzdFtyXSA9IHJlZDsgXAorICAgIGRlc3RbZ10gPSBncmVlbjsgXAorICAgIGRlc3RbYl0gPSBibHVlOyBcCisgICAgZGVzdCArPSAzOyBcCisgIH0gXAorfQorCisjZGVmaW5lIE1FTVNFVF9YUkdCKG5hbWUsIHIsIGcsIGIpIFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBcCitfbWVtc2V0XyMjbmFtZSAoZ3VpbnQ4KiBkZXN0LCBnaW50IHJlZCwgZ2ludCBncmVlbiwgZ2ludCBibHVlLCBnaW50IHdpZHRoKSB7IFwKKyAgZ3VpbnQzMiB2YWw7IFwKKyAgXAorICB2YWwgPSBHVUlOVDMyX0ZST01fQkUgKChyZWQgPDwgcikgfCAoZ3JlZW4gPDwgZykgfCAoYmx1ZSA8PCBiKSk7IFwKKyAgdmlkZW9fbWl4ZXJfb3JjX3NwbGF0X3UzMiAoKGd1aW50MzIgKikgZGVzdCwgdmFsLCB3aWR0aCk7IFwKK30KKworI2RlZmluZSBfb3JjX21lbWNweV91MzIoZGVzdCxzcmMsbGVuKSB2aWRlb19taXhlcl9vcmNfbWVtY3B5X3UzMigoZ3VpbnQzMiAqKSBkZXN0LCAoY29uc3QgZ3VpbnQzMiAqKSBzcmMsIGxlbi80KQorCitSR0JfQkxFTkQgKHJnYiwgMywgbWVtY3B5LCB2aWRlb19taXhlcl9vcmNfYmxlbmRfdTgpOworUkdCX0ZJTExfQ0hFQ0tFUl9DIChyZ2IsIDMsIDAsIDEsIDIpOworTUVNU0VUX1JHQl9DIChyZ2IsIDAsIDEsIDIpOworUkdCX0ZJTExfQ09MT1IgKHJnYl9jLCAzLCBfbWVtc2V0X3JnYl9jKTsKKworTUVNU0VUX1JHQl9DIChiZ3IsIDIsIDEsIDApOworUkdCX0ZJTExfQ09MT1IgKGJncl9jLCAzLCBfbWVtc2V0X2Jncl9jKTsKKworUkdCX0JMRU5EICh4cmdiLCA0LCBfb3JjX21lbWNweV91MzIsIHZpZGVvX21peGVyX29yY19ibGVuZF91OCk7CitSR0JfRklMTF9DSEVDS0VSX0MgKHhyZ2IsIDQsIDEsIDIsIDMpOworTUVNU0VUX1hSR0IgKHhyZ2IsIDI0LCAxNiwgMCk7CitSR0JfRklMTF9DT0xPUiAoeHJnYiwgNCwgX21lbXNldF94cmdiKTsKKworTUVNU0VUX1hSR0IgKHhiZ3IsIDAsIDE2LCAyNCk7CitSR0JfRklMTF9DT0xPUiAoeGJnciwgNCwgX21lbXNldF94YmdyKTsKKworTUVNU0VUX1hSR0IgKHJnYngsIDI0LCAxNiwgOCk7CitSR0JfRklMTF9DT0xPUiAocmdieCwgNCwgX21lbXNldF9yZ2J4KTsKKworTUVNU0VUX1hSR0IgKGJncngsIDgsIDE2LCAyNCk7CitSR0JfRklMTF9DT0xPUiAoYmdyeCwgNCwgX21lbXNldF9iZ3J4KTsKKworLyogWVVZMiwgWVZZVSwgVVlWWSAqLworCisjZGVmaW5lIFBBQ0tFRF80MjJfQkxFTkQobmFtZSwgTUVNQ1BZLCBCTEVORExPT1ApIFwKK3N0YXRpYyB2b2lkIFwKK2JsZW5kXyMjbmFtZSAoR3N0VmlkZW9GcmFtZSAqIHNyY2ZyYW1lLCBnaW50IHhwb3MsIGdpbnQgeXBvcywgXAorICAgIGdkb3VibGUgc3JjX2FscGhhLCBHc3RWaWRlb0ZyYW1lICogZGVzdGZyYW1lKSBcCit7IFwKKyAgZ2ludCBiX2FscGhhOyBcCisgIGdpbnQgaTsgXAorICBnaW50IHNyY19zdHJpZGUsIGRlc3Rfc3RyaWRlOyBcCisgIGdpbnQgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQ7IFwKKyAgZ3VpbnQ4ICpzcmMsICpkZXN0OyBcCisgIGdpbnQgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0OyBcCisgIFwKKyAgc3JjX3dpZHRoID0gR1NUX1ZJREVPX0ZSQU1FX1dJRFRIIChzcmNmcmFtZSk7IFwKKyAgc3JjX2hlaWdodCA9IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKHNyY2ZyYW1lKTsgXAorICBcCisgIGRlc3Rfd2lkdGggPSBHU1RfVklERU9fRlJBTUVfV0lEVEggKGRlc3RmcmFtZSk7IFwKKyAgZGVzdF9oZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChkZXN0ZnJhbWUpOyBcCisgIFwKKyAgc3JjID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKHNyY2ZyYW1lLCAwKTsgXAorICBkZXN0ID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKGRlc3RmcmFtZSwgMCk7IFwKKyAgXAorICBzcmNfc3RyaWRlID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfU1RSSURFIChzcmNmcmFtZSwgMCk7IFwKKyAgZGVzdF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGRlc3RmcmFtZSwgMCk7IFwKKyAgXAorICBiX2FscGhhID0gQ0xBTVAgKChnaW50KSAoc3JjX2FscGhhICogMjU2KSwgMCwgMjU2KTsgXAorICBcCisgIHhwb3MgPSBHU1RfUk9VTkRfVVBfMiAoeHBvcyk7IFwKKyAgXAorICAvKiBhZGp1c3Qgc3JjIHBvaW50ZXJzIGZvciBuZWdhdGl2ZSBzaXplcyAqLyBcCisgIGlmICh4cG9zIDwgMCkgeyBcCisgICAgc3JjICs9IC14cG9zICogMjsgXAorICAgIHNyY193aWR0aCAtPSAteHBvczsgXAorICAgIHhwb3MgPSAwOyBcCisgIH0gXAorICBpZiAoeXBvcyA8IDApIHsgXAorICAgIHNyYyArPSAteXBvcyAqIHNyY19zdHJpZGU7IFwKKyAgICBzcmNfaGVpZ2h0IC09IC15cG9zOyBcCisgICAgeXBvcyA9IDA7IFwKKyAgfSBcCisgIFwKKyAgLyogYWRqdXN0IHdpZHRoL2hlaWdodCBpZiB0aGUgc3JjIGlzIGJpZ2dlciB0aGFuIGRlc3QgKi8gXAorICBpZiAoeHBvcyArIHNyY193aWR0aCA+IGRlc3Rfd2lkdGgpIHsgXAorICAgIHNyY193aWR0aCA9IGRlc3Rfd2lkdGggLSB4cG9zOyBcCisgIH0gXAorICBpZiAoeXBvcyArIHNyY19oZWlnaHQgPiBkZXN0X2hlaWdodCkgeyBcCisgICAgc3JjX2hlaWdodCA9IGRlc3RfaGVpZ2h0IC0geXBvczsgXAorICB9IFwKKyAgXAorICBkZXN0ID0gZGVzdCArIDIgKiB4cG9zICsgKHlwb3MgKiBkZXN0X3N0cmlkZSk7IFwKKyAgLyogSWYgaXQncyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50Li4uIHdlIGp1c3QgcmV0dXJuICovIFwKKyAgaWYgKEdfVU5MSUtFTFkgKHNyY19hbHBoYSA9PSAwLjApKSB7IFwKKyAgICBHU1RfSU5GTyAoIkZhc3QgY29weSAoYWxwaGEgPT0gMC4wKSIpOyBcCisgICAgcmV0dXJuOyBcCisgIH0gXAorICBcCisgIC8qIElmIGl0J3MgY29tcGxldGVseSBvcGFxdWUsIHdlIGRvIGEgZmFzdCBjb3B5ICovIFwKKyAgaWYgKEdfVU5MSUtFTFkgKHNyY19hbHBoYSA9PSAxLjApKSB7IFwKKyAgICBHU1RfSU5GTyAoIkZhc3QgY29weSAoYWxwaGEgPT0gMS4wKSIpOyBcCisgICAgZm9yIChpID0gMDsgaSA8IHNyY19oZWlnaHQ7IGkrKykgeyBcCisgICAgICBNRU1DUFkgKGRlc3QsIHNyYywgMiAqIHNyY193aWR0aCk7IFwKKyAgICAgIHNyYyArPSBzcmNfc3RyaWRlOyBcCisgICAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOyBcCisgICAgfSBcCisgICAgcmV0dXJuOyBcCisgIH0gXAorICBcCisgIEJMRU5ETE9PUChkZXN0LCBkZXN0X3N0cmlkZSwgc3JjLCBzcmNfc3RyaWRlLCBiX2FscGhhLCAyICogc3JjX3dpZHRoLCBzcmNfaGVpZ2h0KTsgXAorfQorCisjZGVmaW5lIFBBQ0tFRF80MjJfRklMTF9DSEVDS0VSX0MobmFtZSwgWTEsIFUsIFkyLCBWKSBcCitzdGF0aWMgdm9pZCBcCitmaWxsX2NoZWNrZXJfIyNuYW1lIyNfYyAoR3N0VmlkZW9GcmFtZSAqIGZyYW1lKSBcCit7IFwKKyAgZ2ludCBpLCBqOyBcCisgIHN0YXRpYyBjb25zdCBpbnQgdGFiW10gPSB7IDgwLCAxNjAsIDgwLCAxNjAgfTsgXAorICBnaW50IGRlc3RfYWRkOyBcCisgIGdpbnQgd2lkdGgsIGhlaWdodDsgXAorICBndWludDggKmRlc3Q7IFwKKyAgXAorICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoZnJhbWUpOyBcCisgIHdpZHRoID0gR1NUX1JPVU5EX1VQXzIgKHdpZHRoKTsgXAorICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChmcmFtZSk7IFwKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7IFwKKyAgZGVzdF9hZGQgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKSAtIHdpZHRoICogMjsgXAorICB3aWR0aCAvPSAyOyBcCisgIFwKKyAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7IFwKKyAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgeyBcCisgICAgICBkZXN0W1kxXSA9IHRhYlsoKGkgJiAweDgpID4+IDMpICsgKChqICYgMHg4KSA+PiAzKV07IFwKKyAgICAgIGRlc3RbWTJdID0gdGFiWygoaSAmIDB4OCkgPj4gMykgKyAoKGogJiAweDgpID4+IDMpXTsgXAorICAgICAgZGVzdFtVXSA9IDEyODsgXAorICAgICAgZGVzdFtWXSA9IDEyODsgXAorICAgICAgZGVzdCArPSA0OyBcCisgICAgfSBcCisgICAgZGVzdCArPSBkZXN0X2FkZDsgXAorICB9IFwKK30KKworI2RlZmluZSBQQUNLRURfNDIyX0ZJTExfQ09MT1IobmFtZSwgWTEsIFUsIFkyLCBWKSBcCitzdGF0aWMgdm9pZCBcCitmaWxsX2NvbG9yXyMjbmFtZSAoR3N0VmlkZW9GcmFtZSAqIGZyYW1lLCBcCisgICAgZ2ludCBjb2xZLCBnaW50IGNvbFUsIGdpbnQgY29sVikgXAoreyBcCisgIGdpbnQgaTsgXAorICBnaW50IGRlc3Rfc3RyaWRlOyBcCisgIGd1aW50MzIgdmFsOyBcCisgIGdpbnQgd2lkdGgsIGhlaWdodDsgXAorICBndWludDggKmRlc3Q7IFwKKyAgXAorICB3aWR0aCA9IEdTVF9WSURFT19GUkFNRV9XSURUSCAoZnJhbWUpOyBcCisgIHdpZHRoID0gR1NUX1JPVU5EX1VQXzIgKHdpZHRoKTsgXAorICBoZWlnaHQgPSBHU1RfVklERU9fRlJBTUVfSEVJR0hUIChmcmFtZSk7IFwKKyAgZGVzdCA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBIChmcmFtZSwgMCk7IFwKKyAgZGVzdF9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfQ09NUF9TVFJJREUgKGZyYW1lLCAwKTsgXAorICB3aWR0aCAvPSAyOyBcCisgIFwKKyAgdmFsID0gR1VJTlQzMl9GUk9NX0JFICgoY29sWSA8PCBZMSkgfCAoY29sWSA8PCBZMikgfCAoY29sVSA8PCBVKSB8IChjb2xWIDw8IFYpKTsgXAorICBcCisgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeyBcCisgICAgdmlkZW9fbWl4ZXJfb3JjX3NwbGF0X3UzMiAoKGd1aW50MzIgKikgZGVzdCwgdmFsLCB3aWR0aCk7IFwKKyAgICBkZXN0ICs9IGRlc3Rfc3RyaWRlOyBcCisgIH0gXAorfQorCitQQUNLRURfNDIyX0JMRU5EICh5dXkyLCBtZW1jcHksIHZpZGVvX21peGVyX29yY19ibGVuZF91OCk7CitQQUNLRURfNDIyX0ZJTExfQ0hFQ0tFUl9DICh5dXkyLCAwLCAxLCAyLCAzKTsKK1BBQ0tFRF80MjJfRklMTF9DSEVDS0VSX0MgKHV5dnksIDEsIDAsIDMsIDIpOworUEFDS0VEXzQyMl9GSUxMX0NPTE9SICh5dXkyLCAyNCwgMTYsIDgsIDApOworUEFDS0VEXzQyMl9GSUxMX0NPTE9SICh5dnl1LCAyNCwgMCwgOCwgMTYpOworUEFDS0VEXzQyMl9GSUxMX0NPTE9SICh1eXZ5LCAxNiwgMjQsIDAsIDgpOworCisvKiBJbml0IGZ1bmN0aW9uICovCitCbGVuZEZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9ibGVuZF9hcmdiOworQmxlbmRGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYmdyYTsKK0JsZW5kRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX292ZXJsYXlfYXJnYjsKK0JsZW5kRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX292ZXJsYXlfYmdyYTsKKy8qIEFZVVYvQUJHUiBpcyBlcXVhbCB0byBBUkdCLCBSR0JBIGlzIGVxdWFsIHRvIEJHUkEgKi8KK0JsZW5kRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3k0NDQ7CitCbGVuZEZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9ibGVuZF95NDJiOworQmxlbmRGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfaTQyMDsKKy8qIEk0MjAgaXMgZXF1YWwgdG8gWVYxMiAqLworQmxlbmRGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfbnYxMjsKK0JsZW5kRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX252MjE7CitCbGVuZEZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9ibGVuZF95NDFiOworQmxlbmRGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfcmdiOworLyogQkdSIGlzIGVxdWFsIHRvIFJHQiAqLworQmxlbmRGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfcmdieDsKKy8qIEJHUngsIHhSR0IsIHhCR1IgYXJlIGVxdWFsIHRvIFJHQnggKi8KK0JsZW5kRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3l1eTI7CisvKiBZVllVIGFuZCBVWVZZIGFyZSBlcXVhbCB0byBZVVkyICovCisKK0ZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9hcmdiOworRmlsbENoZWNrZXJGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX2JncmE7CisvKiBBQkdSIGlzIGVxdWFsIHRvIEFSR0IsIFJHQkEgaXMgZXF1YWwgdG8gQkdSQSAqLworRmlsbENoZWNrZXJGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX2F5dXY7CitGaWxsQ2hlY2tlckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfeTQ0NDsKK0ZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl95NDJiOworRmlsbENoZWNrZXJGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX2k0MjA7CisvKiBJNDIwIGlzIGVxdWFsIHRvIFlWMTIgKi8KK0ZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9udjEyOworRmlsbENoZWNrZXJGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX252MjE7CitGaWxsQ2hlY2tlckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfeTQxYjsKK0ZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9yZ2I7CisvKiBCR1IgaXMgZXF1YWwgdG8gUkdCICovCitGaWxsQ2hlY2tlckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfeHJnYjsKKy8qIEJHUngsIHhSR0IsIHhCR1IgYXJlIGVxdWFsIHRvIFJHQnggKi8KK0ZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl95dXkyOworLyogWVZZVSBpcyBlcXVhbCB0byBZVVkyICovCitGaWxsQ2hlY2tlckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfdXl2eTsKKworRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYXJnYjsKK0ZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2JncmE7CitGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl9hYmdyOworRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfcmdiYTsKK0ZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2F5dXY7CitGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl95NDQ0OworRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeTQyYjsKK0ZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2k0MjA7CitGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl95djEyOworRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfbnYxMjsKKy8qIE5WMjEgaXMgZXF1YWwgdG8gTlYxMiAqLworRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeTQxYjsKK0ZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX3JnYjsKK0ZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2JncjsKK0ZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX3hyZ2I7CitGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl94YmdyOworRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfcmdieDsKK0ZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2Jncng7CitGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl95dXkyOworRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeXZ5dTsKK0ZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX3V5dnk7CisKK3ZvaWQKK2dzdF92aWRlb19taXhlcl9pbml0X2JsZW5kICh2b2lkKQoreworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3ZpZGVvbWl4ZXJfYmxlbmRfZGVidWcsICJ2aWRlb21peGVyX2JsZW5kIiwgMCwKKyAgICAgICJ2aWRlbyBtaXhlciBibGVuZGluZyBmdW5jdGlvbnMiKTsKKworICBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYXJnYiA9IGJsZW5kX2FyZ2I7CisgIGdzdF92aWRlb19taXhlcl9ibGVuZF9iZ3JhID0gYmxlbmRfYmdyYTsKKyAgZ3N0X3ZpZGVvX21peGVyX292ZXJsYXlfYXJnYiA9IG92ZXJsYXlfYXJnYjsKKyAgZ3N0X3ZpZGVvX21peGVyX292ZXJsYXlfYmdyYSA9IG92ZXJsYXlfYmdyYTsKKyAgZ3N0X3ZpZGVvX21peGVyX2JsZW5kX2k0MjAgPSBibGVuZF9pNDIwOworICBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfbnYxMiA9IGJsZW5kX252MTI7CisgIGdzdF92aWRlb19taXhlcl9ibGVuZF9udjIxID0gYmxlbmRfbnYyMTsKKyAgZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3k0NDQgPSBibGVuZF95NDQ0OworICBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfeTQyYiA9IGJsZW5kX3k0MmI7CisgIGdzdF92aWRlb19taXhlcl9ibGVuZF95NDFiID0gYmxlbmRfeTQxYjsKKyAgZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3JnYiA9IGJsZW5kX3JnYjsKKyAgZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3hyZ2IgPSBibGVuZF94cmdiOworICBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfeXV5MiA9IGJsZW5kX3l1eTI7CisKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9hcmdiID0gZmlsbF9jaGVja2VyX2FyZ2JfYzsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9iZ3JhID0gZmlsbF9jaGVja2VyX2JncmFfYzsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9heXV2ID0gZmlsbF9jaGVja2VyX2F5dXZfYzsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9pNDIwID0gZmlsbF9jaGVja2VyX2k0MjA7CisgIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfbnYxMiA9IGZpbGxfY2hlY2tlcl9udjEyOworICBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX252MjEgPSBmaWxsX2NoZWNrZXJfbnYyMTsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl95NDQ0ID0gZmlsbF9jaGVja2VyX3k0NDQ7CisgIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfeTQyYiA9IGZpbGxfY2hlY2tlcl95NDJiOworICBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3k0MWIgPSBmaWxsX2NoZWNrZXJfeTQxYjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9yZ2IgPSBmaWxsX2NoZWNrZXJfcmdiX2M7CisgIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfeHJnYiA9IGZpbGxfY2hlY2tlcl94cmdiX2M7CisgIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfeXV5MiA9IGZpbGxfY2hlY2tlcl95dXkyX2M7CisgIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfdXl2eSA9IGZpbGxfY2hlY2tlcl91eXZ5X2M7CisKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYXJnYiA9IGZpbGxfY29sb3JfYXJnYjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYmdyYSA9IGZpbGxfY29sb3JfYmdyYTsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYWJnciA9IGZpbGxfY29sb3JfYWJncjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfcmdiYSA9IGZpbGxfY29sb3JfcmdiYTsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYXl1diA9IGZpbGxfY29sb3JfYXl1djsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfaTQyMCA9IGZpbGxfY29sb3JfaTQyMDsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeXYxMiA9IGZpbGxfY29sb3JfeXYxMjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfbnYxMiA9IGZpbGxfY29sb3JfbnYxMjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeTQ0NCA9IGZpbGxfY29sb3JfeTQ0NDsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeTQyYiA9IGZpbGxfY29sb3JfeTQyYjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeTQxYiA9IGZpbGxfY29sb3JfeTQxYjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfcmdiID0gZmlsbF9jb2xvcl9yZ2JfYzsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYmdyID0gZmlsbF9jb2xvcl9iZ3JfYzsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeHJnYiA9IGZpbGxfY29sb3JfeHJnYjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeGJnciA9IGZpbGxfY29sb3JfeGJncjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfcmdieCA9IGZpbGxfY29sb3JfcmdieDsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYmdyeCA9IGZpbGxfY29sb3JfYmdyeDsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeXV5MiA9IGZpbGxfY29sb3JfeXV5MjsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeXZ5dSA9IGZpbGxfY29sb3JfeXZ5dTsKKyAgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfdXl2eSA9IGZpbGxfY29sb3JfdXl2eTsKK30KZGlmZiAtLWdpdCBhL2dzdC92aWRlb21peGVyL2JsZW5kLmggYi9nc3QvdmlkZW9taXhlci9ibGVuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMTZjNTYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QvdmlkZW9taXhlci9ibGVuZC5oCkBAIC0wLDAgKzEsMTAzIEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOSBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQkxFTkRfSF9fCisjZGVmaW5lIF9fQkxFTkRfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKK3R5cGVkZWYgdm9pZCAoKkJsZW5kRnVuY3Rpb24pIChHc3RWaWRlb0ZyYW1lICpzcmNmcmFtZSwgZ2ludCB4cG9zLCBnaW50IHlwb3MsIGdkb3VibGUgc3JjX2FscGhhLCBHc3RWaWRlb0ZyYW1lICogZGVzdGZyYW1lKTsKK3R5cGVkZWYgdm9pZCAoKkZpbGxDaGVja2VyRnVuY3Rpb24pIChHc3RWaWRlb0ZyYW1lICogZnJhbWUpOwordHlwZWRlZiB2b2lkICgqRmlsbENvbG9yRnVuY3Rpb24pIChHc3RWaWRlb0ZyYW1lICogZnJhbWUsIGdpbnQgYzEsIGdpbnQgYzIsIGdpbnQgYzMpOworCitleHRlcm4gQmxlbmRGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYXJnYjsKK2V4dGVybiBCbGVuZEZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9ibGVuZF9iZ3JhOworI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYXl1diBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYXJnYgorI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYWJnciBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYXJnYgorI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfcmdiYSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYmdyYQorZXh0ZXJuIEJsZW5kRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX292ZXJsYXlfYXJnYjsKK2V4dGVybiBCbGVuZEZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9vdmVybGF5X2JncmE7CisjZGVmaW5lIGdzdF92aWRlb19taXhlcl9vdmVybGF5X2F5dXYgZ3N0X3ZpZGVvX21peGVyX292ZXJsYXlfYXJnYgorI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfb3ZlcmxheV9hYmdyIGdzdF92aWRlb19taXhlcl9vdmVybGF5X2FyZ2IKKyNkZWZpbmUgZ3N0X3ZpZGVvX21peGVyX292ZXJsYXlfcmdiYSBnc3RfdmlkZW9fbWl4ZXJfb3ZlcmxheV9iZ3JhCitleHRlcm4gQmxlbmRGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfaTQyMDsKKyNkZWZpbmUgZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3l2MTIgZ3N0X3ZpZGVvX21peGVyX2JsZW5kX2k0MjAKK2V4dGVybiBCbGVuZEZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9ibGVuZF9udjEyOworZXh0ZXJuIEJsZW5kRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX252MjE7CitleHRlcm4gQmxlbmRGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfeTQxYjsKK2V4dGVybiBCbGVuZEZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9ibGVuZF95NDJiOworZXh0ZXJuIEJsZW5kRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3k0NDQ7CitleHRlcm4gQmxlbmRGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfcmdiOworI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYmdyIGdzdF92aWRlb19taXhlcl9ibGVuZF9yZ2IKK2V4dGVybiBCbGVuZEZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9ibGVuZF9yZ2J4OworI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYmdyeCBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfcmdieAorI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfeHJnYiBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfcmdieAorI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfeGJnciBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfcmdieAorZXh0ZXJuIEJsZW5kRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3l1eTI7CisjZGVmaW5lIGdzdF92aWRlb19taXhlcl9ibGVuZF91eXZ5IGdzdF92aWRlb19taXhlcl9ibGVuZF95dXkyOworI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfeXZ5dSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfeXV5MjsKKworZXh0ZXJuIEZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9hcmdiOworI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX2FiZ3IgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9hcmdiCitleHRlcm4gRmlsbENoZWNrZXJGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX2JncmE7CisjZGVmaW5lIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfcmdiYSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX2JncmEKK2V4dGVybiBGaWxsQ2hlY2tlckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfYXl1djsKK2V4dGVybiBGaWxsQ2hlY2tlckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfaTQyMDsKKyNkZWZpbmUgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl95djEyIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfaTQyMAorZXh0ZXJuIEZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9udjEyOworZXh0ZXJuIEZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9udjIxOworZXh0ZXJuIEZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl95NDFiOworZXh0ZXJuIEZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl95NDJiOworZXh0ZXJuIEZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl95NDQ0OworZXh0ZXJuIEZpbGxDaGVja2VyRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9yZ2I7CisjZGVmaW5lIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfYmdyIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfcmdiCitleHRlcm4gRmlsbENoZWNrZXJGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3JnYng7CisjZGVmaW5lIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfYmdyeCBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3JnYngKKyNkZWZpbmUgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl94cmdiIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfcmdieAorI2RlZmluZSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3hiZ3IgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9yZ2J4CitleHRlcm4gRmlsbENoZWNrZXJGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3l1eTI7CisjZGVmaW5lIGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfeXZ5dSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3l1eTI7CitleHRlcm4gRmlsbENoZWNrZXJGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3V5dnk7CisKK2V4dGVybiBGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl9hcmdiOworZXh0ZXJuIEZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2FiZ3I7CitleHRlcm4gRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYmdyYTsKK2V4dGVybiBGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl9yZ2JhOworZXh0ZXJuIEZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2F5dXY7CitleHRlcm4gRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfaTQyMDsKK2V4dGVybiBGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl95djEyOworZXh0ZXJuIEZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX252MTI7CisjZGVmaW5lIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX252MjEgZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfbnYxMjsKK2V4dGVybiBGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl95NDFiOworZXh0ZXJuIEZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX3k0MmI7CitleHRlcm4gRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeTQ0NDsKK2V4dGVybiBGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl9yZ2I7CitleHRlcm4gRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYmdyOworZXh0ZXJuIEZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX3hyZ2I7CitleHRlcm4gRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeGJncjsKK2V4dGVybiBGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl9yZ2J4OworZXh0ZXJuIEZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2Jncng7CitleHRlcm4gRmlsbENvbG9yRnVuY3Rpb24gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeXV5MjsKK2V4dGVybiBGaWxsQ29sb3JGdW5jdGlvbiBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl95dnl1OworZXh0ZXJuIEZpbGxDb2xvckZ1bmN0aW9uIGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX3V5dnk7CisKK3ZvaWQgZ3N0X3ZpZGVvX21peGVyX2luaXRfYmxlbmQgKHZvaWQpOworCisjZW5kaWYgLyogX19CTEVORF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC92aWRlb21peGVyL21lc29uLmJ1aWxkIGIvZ3N0L3ZpZGVvbWl4ZXIvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQyNWE0MwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb21peGVyL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMzIgQEAKK3ZtaXhlcl9zb3VyY2VzID0gWworICAnYmxlbmQuYycsCisgICd2aWRlb21peGVyMi5jJywKK10KKworb3Jjc3JjID0gJ3ZpZGVvbWl4ZXJvcmMnCitpZiBoYXZlX29yY2MKKyAgb3JjX2ggPSBjdXN0b21fdGFyZ2V0KG9yY3NyYyArICcuaCcsCisgICAgaW5wdXQgOiBvcmNzcmMgKyAnLm9yYycsCisgICAgb3V0cHV0IDogb3Jjc3JjICsgJy5oJywKKyAgICBjb21tYW5kIDogb3JjY19hcmdzICsgWyctLWhlYWRlcicsICctbycsICdAT1VUUFVUQCcsICdASU5QVVRAJ10pCisgIG9yY19jID0gY3VzdG9tX3RhcmdldChvcmNzcmMgKyAnLmMnLAorICAgIGlucHV0IDogb3Jjc3JjICsgJy5vcmMnLAorICAgIG91dHB1dCA6IG9yY3NyYyArICcuYycsCisgICAgY29tbWFuZCA6IG9yY2NfYXJncyArIFsnLS1pbXBsZW1lbnRhdGlvbicsICctbycsICdAT1VUUFVUQCcsICdASU5QVVRAJ10pCitlbHNlCisgIG9yY19oID0gY29uZmlndXJlX2ZpbGUoaW5wdXQgOiBvcmNzcmMgKyAnLWRpc3QuaCcsCisgICAgb3V0cHV0IDogb3Jjc3JjICsgJy5oJywKKyAgICBjb25maWd1cmF0aW9uIDogY29uZmlndXJhdGlvbl9kYXRhKCkpCisgIG9yY19jID0gY29uZmlndXJlX2ZpbGUoaW5wdXQgOiBvcmNzcmMgKyAnLWRpc3QuYycsCisgICAgb3V0cHV0IDogb3Jjc3JjICsgJy5jJywKKyAgICBjb25maWd1cmF0aW9uIDogY29uZmlndXJhdGlvbl9kYXRhKCkpCitlbmRpZgorCitnc3R2aWRlb21peGVyID0gbGlicmFyeSgnZ3N0dmlkZW9taXhlcicsCisgIHZtaXhlcl9zb3VyY2VzLCBvcmNfYywgb3JjX2gsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbb3JjX2RlcCwgZ3N0dmlkZW9fZGVwLCBnc3RiYXNlX2RlcCwgbGlibV0sCisgIGluc3RhbGwgOiB0cnVlLAorICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIsCispCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5jIGIvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmYyZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuYwpAQCAtMCwwICsxLDIyOTEgQEAKKy8qIEdlbmVyaWMgdmlkZW8gbWl4ZXIgcGx1Z2luCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDggV2ltIFRheW1hbnMgPHdpbUBmbHVlbmRvLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC12aWRlb21peGVyCisgKgorICogVmlkZW9taXhlciBjYW4gYWNjZXB0IEFZVVYsIEFSR0IgYW5kIEJHUkEgdmlkZW8gc3RyZWFtcy4gRm9yIGVhY2ggb2YgdGhlIHJlcXVlc3RlZAorICogc2luayBwYWRzIGl0IHdpbGwgY29tcGFyZSB0aGUgaW5jb21pbmcgZ2VvbWV0cnkgYW5kIGZyYW1lcmF0ZSB0byBkZWZpbmUgdGhlCisgKiBvdXRwdXQgcGFyYW1ldGVycy4gSW5kZWVkIG91dHB1dCB2aWRlbyBmcmFtZXMgd2lsbCBoYXZlIHRoZSBnZW9tZXRyeSBvZiB0aGUKKyAqIGJpZ2dlc3QgaW5jb21pbmcgdmlkZW8gc3RyZWFtIGFuZCB0aGUgZnJhbWVyYXRlIG9mIHRoZSBmYXN0ZXN0IGluY29taW5nIG9uZS4KKyAqCisgKiBWaWRlb21peGVyIHdpbGwgZG8gY29sb3JzcGFjZSBjb252ZXJzaW9uLgorICogCisgKiBJbmRpdmlkdWFsIHBhcmFtZXRlcnMgZm9yIGVhY2ggaW5wdXQgc3RyZWFtIGNhbiBiZSBjb25maWd1cmVkIG9uIHRoZQorICogI0dzdFZpZGVvTWl4ZXIyUGFkLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5TYW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBcCisgKiAgIHZpZGVvdGVzdHNyYyBwYXR0ZXJuPTEgISBcCisgKiAgIHZpZGVvL3gtcmF3LGZvcm1hdD1BWVVWLGZyYW1lcmF0ZT1cKGZyYWN0aW9uXCkxMC8xLHdpZHRoPTEwMCxoZWlnaHQ9MTAwICEgXAorICogICB2aWRlb2JveCBib3JkZXItYWxwaGE9MCB0b3A9LTcwIGJvdHRvbT0tNzAgcmlnaHQ9LTIyMCAhIFwKKyAqICAgdmlkZW9taXhlciBuYW1lPW1peCBzaW5rXzA6OmFscGhhPTAuNyBzaW5rXzE6OmFscGhhPTAuNSAhIFwKKyAqICAgdmlkZW9jb252ZXJ0ICEgeHZpbWFnZXNpbmsgXAorICogICB2aWRlb3Rlc3RzcmMgISBcCisgKiAgIHZpZGVvL3gtcmF3LGZvcm1hdD1BWVVWLGZyYW1lcmF0ZT1cKGZyYWN0aW9uXCk1LzEsd2lkdGg9MzIwLGhlaWdodD0yNDAgISBtaXguCisgKiBdfCBBIHBpcGVsaW5lIHRvIGRlbW9uc3RyYXRlIHZpZGVvbWl4ZXIgdXNlZCB0b2dldGhlciB3aXRoIHZpZGVvYm94LgorICogVGhpcyBzaG91bGQgc2hvdyBhIDMyMHgyNDAgcGl4ZWxzIHZpZGVvIHRlc3Qgc291cmNlIHdpdGggc29tZSB0cmFuc3BhcmVuY3kKKyAqIHNob3dpbmcgdGhlIGJhY2tncm91bmQgY2hlY2tlciBwYXR0ZXJuLiBBbm90aGVyIHZpZGVvIHRlc3Qgc291cmNlIHdpdGgganVzdAorICogdGhlIHNub3cgcGF0dGVybiBvZiAxMDB4MTAwIHBpeGVscyBpcyBvdmVybGFpZCBvbiB0b3Agb2YgdGhlIGZpcnN0IG9uZSBvbgorICogdGhlIGxlZnQgdmVydGljYWxseSBjZW50ZXJlZCB3aXRoIGEgc21hbGwgdHJhbnNwYXJlbmN5IHNob3dpbmcgdGhlIGZpcnN0CisgKiB2aWRlbyB0ZXN0IHNvdXJjZSBiZWhpbmQgYW5kIHRoZSBjaGVja2VyIHBhdHRlcm4gdW5kZXIgaXQuIE5vdGUgdGhhdCB0aGUKKyAqIGZyYW1lcmF0ZSBvZiB0aGUgb3V0cHV0IHZpZGVvIGlzIDEwIGZyYW1lcyBwZXIgc2Vjb25kLgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyBwYXR0ZXJuPTEgISBcCisgKiAgIHZpZGVvL3gtcmF3LCBmcmFtZXJhdGU9XChmcmFjdGlvblwpMTAvMSwgd2lkdGg9MTAwLCBoZWlnaHQ9MTAwICEgXAorICogICB2aWRlb21peGVyIG5hbWU9bWl4ICEgdmlkZW9jb252ZXJ0ICEgeGltYWdlc2luayBcCisgKiAgIHZpZGVvdGVzdHNyYyAhICBcCisgKiAgIHZpZGVvL3gtcmF3LCBmcmFtZXJhdGU9XChmcmFjdGlvblwpNS8xLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAgISBtaXguCisgKiBdfCBBIHBpcGVsaW5lIHRvIGRlbW9zdHJhdGUgYmdyYSBtaXhpbmcuIChUaGlzIGRvZXMgbm90IGRlbW9uc3RyYXRlIGFscGhhIGJsZW5kaW5nKS4gCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdmlkZW90ZXN0c3JjIHBhdHRlcm49MSAhIFwKKyAqICAgdmlkZW8veC1yYXcsZm9ybWF0ID1JNDIwLCBmcmFtZXJhdGU9XChmcmFjdGlvblwpMTAvMSwgd2lkdGg9MTAwLCBoZWlnaHQ9MTAwICEgXAorICogICB2aWRlb21peGVyIG5hbWU9bWl4ICEgdmlkZW9jb252ZXJ0ICEgeGltYWdlc2luayBcCisgKiAgIHZpZGVvdGVzdHNyYyAhIFwKKyAqICAgdmlkZW8veC1yYXcsZm9ybWF0PUk0MjAsIGZyYW1lcmF0ZT1cKGZyYWN0aW9uXCk1LzEsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCAhIG1peC4KKyAqIF18IEEgcGlwZWxpbmUgdG8gdGVzdCBJNDIwCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdmlkZW9taXhlciBuYW1lPW1peGVyIHNpbmtfMTo6YWxwaGE9MC41IHNpbmtfMTo6eHBvcz01MCBzaW5rXzE6Onlwb3M9NTAgISBcCisgKiAgIHZpZGVvY29udmVydCAhIHhpbWFnZXNpbmsgXAorICogICB2aWRlb3Rlc3RzcmMgcGF0dGVybj1zbm93IHRpbWVzdGFtcC1vZmZzZXQ9MzAwMDAwMDAwMCAhIFwKKyAqICAgInZpZGVvL3gtcmF3LGZvcm1hdD1BWVVWLHdpZHRoPTY0MCxoZWlnaHQ9NDgwLGZyYW1lcmF0ZT0oZnJhY3Rpb24pMzAvMSIgISBcCisgKiAgIHRpbWVvdmVybGF5ICEgcXVldWUyICEgbWl4ZXIuIFwKKyAqICAgdmlkZW90ZXN0c3JjIHBhdHRlcm49c21wdGUgISBcCisgKiAgICJ2aWRlby94LXJhdyxmb3JtYXQ9QVlVVix3aWR0aD04MDAsaGVpZ2h0PTYwMCxmcmFtZXJhdGU9KGZyYWN0aW9uKTEwLzEiICEgXAorICogICB0aW1lb3ZlcmxheSAhIHF1ZXVlMiAhIG1peGVyLgorICogXXwgQSBwaXBlbGluZSB0byBkZW1vbnN0cmF0ZSBzeW5jaHJvbml6ZWQgbWl4aW5nICh0aGUgc2Vjb25kIHN0cmVhbSBzdGFydHMgYWZ0ZXIgMyBzZWNvbmRzKQorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInZpZGVvbWl4ZXIyLmgiCisjaW5jbHVkZSAidmlkZW9taXhlcjJwYWQuaCIKKworI2lmZGVmIERJU0FCTEVfT1JDCisjZGVmaW5lIG9yY19tZW1zZXQgbWVtc2V0CisjZWxzZQorI2luY2x1ZGUgPG9yYy9vcmNmdW5jdGlvbnMuaD4KKyNlbmRpZgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfdmlkZW9taXhlcjJfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3ZpZGVvbWl4ZXIyX2RlYnVnCisKKyNkZWZpbmUgR1NUX1ZJREVPX01JWEVSMl9HRVRfTE9DSyhtaXgpIFwKKyAgKCZHU1RfVklERU9fTUlYRVIyKG1peCktPmxvY2spCisjZGVmaW5lIEdTVF9WSURFT19NSVhFUjJfTE9DSyhtaXgpIFwKKyAgKGdfbXV0ZXhfbG9jayhHU1RfVklERU9fTUlYRVIyX0dFVF9MT0NLIChtaXgpKSkKKyNkZWZpbmUgR1NUX1ZJREVPX01JWEVSMl9VTkxPQ0sobWl4KSBcCisgIChnX211dGV4X3VubG9jayhHU1RfVklERU9fTUlYRVIyX0dFVF9MT0NLIChtaXgpKSkKKyNkZWZpbmUgR1NUX1ZJREVPX01JWEVSMl9HRVRfU0VUQ0FQU19MT0NLKG1peCkgXAorICAoJkdTVF9WSURFT19NSVhFUjIobWl4KS0+c2V0Y2Fwc19sb2NrKQorI2RlZmluZSBHU1RfVklERU9fTUlYRVIyX1NFVENBUFNfTE9DSyhtaXgpIFwKKyAgKGdfbXV0ZXhfbG9jayhHU1RfVklERU9fTUlYRVIyX0dFVF9TRVRDQVBTX0xPQ0sgKG1peCkpKQorI2RlZmluZSBHU1RfVklERU9fTUlYRVIyX1NFVENBUFNfVU5MT0NLKG1peCkgXAorICAoZ19tdXRleF91bmxvY2soR1NUX1ZJREVPX01JWEVSMl9HRVRfU0VUQ0FQU19MT0NLIChtaXgpKSkKKworI2RlZmluZSBGT1JNQVRTICIgeyBBWVVWLCBCR1JBLCBBUkdCLCBSR0JBLCBBQkdSLCBZNDQ0LCBZNDJCLCBZVVkyLCBVWVZZLCAiXAorICAgICAgICAgICAgICAgICIgICBZVllVLCBJNDIwLCBZVjEyLCBOVjEyLCBOVjIxLCBZNDFCLCBSR0IsIEJHUiwgeFJHQiwgeEJHUiwgIlwKKyAgICAgICAgICAgICAgICAiICAgUkdCeCwgQkdSeCB9ICIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX1ZJREVPX0NBUFNfTUFLRSAoRk9STUFUUykpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2lua18ldSIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfUkVRVUVTVCwKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKEZPUk1BVFMpKQorICAgICk7CisKK3N0YXRpYyB2b2lkIGdzdF92aWRlb21peGVyMl9jaGlsZF9wcm94eV9pbml0IChncG9pbnRlciBnX2lmYWNlLAorICAgIGdwb2ludGVyIGlmYWNlX2RhdGEpOworc3RhdGljIGdib29sZWFuIGdzdF92aWRlb21peGVyMl9wdXNoX3NpbmtfZXZlbnQgKEdzdFZpZGVvTWl4ZXIyICogbWl4LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIHZvaWQgZ3N0X3ZpZGVvbWl4ZXIyX3JlbGVhc2VfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogcGFkKTsKK3N0YXRpYyB2b2lkIGdzdF92aWRlb21peGVyMl9yZXNldF9xb3MgKEdzdFZpZGVvTWl4ZXIyICogbWl4KTsKKworc3RydWN0IF9Hc3RWaWRlb01peGVyMkNvbGxlY3QKK3sKKyAgR3N0Q29sbGVjdERhdGEgY29sbGVjdDsgICAgICAgLyogd2UgZXh0ZW5kIHRoZSBDb2xsZWN0RGF0YSAqLworCisgIEdzdFZpZGVvTWl4ZXIyUGFkICptaXhwYWQ7CisKKyAgR3N0QnVmZmVyICpxdWV1ZWQ7ICAgICAgICAgICAgLyogYnVmZmVyIGZvciB3aGljaCB3ZSBkb24ndCBrbm93IHRoZSBlbmQgdGltZSB5ZXQgKi8KKyAgR3N0VmlkZW9JbmZvIHF1ZXVlZF92aW5mbzsKKworICBHc3RCdWZmZXIgKmJ1ZmZlcjsgICAgICAgICAgICAvKiBidWZmZXIgdGhhdCBzaG91bGQgYmUgYmxlbmRlZCBub3cgKi8KKyAgR3N0VmlkZW9JbmZvIGJ1ZmZlcl92aW5mbzsKKworICBHc3RDbG9ja1RpbWUgc3RhcnRfdGltZTsKKyAgR3N0Q2xvY2tUaW1lIGVuZF90aW1lOworfTsKKworI2RlZmluZSBERUZBVUxUX1BBRF9aT1JERVIgMAorI2RlZmluZSBERUZBVUxUX1BBRF9YUE9TICAgMAorI2RlZmluZSBERUZBVUxUX1BBRF9ZUE9TICAgMAorI2RlZmluZSBERUZBVUxUX1BBRF9BTFBIQSAgMS4wCitlbnVtCit7CisgIFBST1BfUEFEXzAsCisgIFBST1BfUEFEX1pPUkRFUiwKKyAgUFJPUF9QQURfWFBPUywKKyAgUFJPUF9QQURfWVBPUywKKyAgUFJPUF9QQURfQUxQSEEKK307CisKK0dfREVGSU5FX1RZUEUgKEdzdFZpZGVvTWl4ZXIyUGFkLCBnc3RfdmlkZW9taXhlcjJfcGFkLCBHU1RfVFlQRV9QQUQpOworCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvbWl4ZXIyX2NvbGxlY3RfZnJlZSAoR3N0Q29sbGVjdERhdGEgKiBkYXRhKQoreworICBHc3RWaWRlb01peGVyMkNvbGxlY3QgKmNkYXRhID0gKEdzdFZpZGVvTWl4ZXIyQ29sbGVjdCAqKSBkYXRhOworCisgIGdzdF9idWZmZXJfcmVwbGFjZSAoJmNkYXRhLT5idWZmZXIsIE5VTEwpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3ZpZGVvbWl4ZXIyX3NyY19zZXRjYXBzIChHc3RQYWQgKiBwYWQsIEdzdFZpZGVvTWl4ZXIyICogbWl4LAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9taXhlcjJfdXBkYXRlX3NyY19jYXBzIChHc3RWaWRlb01peGVyMiAqIG1peCkKK3sKKyAgR1NMaXN0ICpsOworICBnaW50IGJlc3Rfd2lkdGggPSAtMSwgYmVzdF9oZWlnaHQgPSAtMTsKKyAgZ2RvdWJsZSBiZXN0X2ZwcyA9IC0xLCBjdXJfZnBzOworICBnaW50IGJlc3RfZnBzX24gPSAtMSwgYmVzdF9mcHNfZCA9IC0xOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIEdTVF9WSURFT19NSVhFUjJfU0VUQ0FQU19MT0NLIChtaXgpOworICBHU1RfVklERU9fTUlYRVIyX0xPQ0sgKG1peCk7CisKKyAgZm9yIChsID0gbWl4LT5zaW5rcGFkczsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICBHc3RWaWRlb01peGVyMlBhZCAqbXBhZCA9IGwtPmRhdGE7CisgICAgZ2ludCB0aGlzX3dpZHRoLCB0aGlzX2hlaWdodDsKKyAgICBnaW50IGZwc19uLCBmcHNfZDsKKyAgICBnaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgICBmcHNfbiA9IEdTVF9WSURFT19JTkZPX0ZQU19OICgmbXBhZC0+aW5mbyk7CisgICAgZnBzX2QgPSBHU1RfVklERU9fSU5GT19GUFNfRCAoJm1wYWQtPmluZm8pOworICAgIHdpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKCZtcGFkLT5pbmZvKTsKKyAgICBoZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZtcGFkLT5pbmZvKTsKKworICAgIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKQorICAgICAgY29udGludWU7CisKKyAgICB0aGlzX3dpZHRoID0gd2lkdGggKyBNQVggKG1wYWQtPnhwb3MsIDApOworICAgIHRoaXNfaGVpZ2h0ID0gaGVpZ2h0ICsgTUFYIChtcGFkLT55cG9zLCAwKTsKKworICAgIGlmIChiZXN0X3dpZHRoIDwgdGhpc193aWR0aCkKKyAgICAgIGJlc3Rfd2lkdGggPSB0aGlzX3dpZHRoOworICAgIGlmIChiZXN0X2hlaWdodCA8IHRoaXNfaGVpZ2h0KQorICAgICAgYmVzdF9oZWlnaHQgPSB0aGlzX2hlaWdodDsKKworICAgIGlmIChmcHNfZCA9PSAwKQorICAgICAgY3VyX2ZwcyA9IDAuMDsKKyAgICBlbHNlCisgICAgICBnc3RfdXRpbF9mcmFjdGlvbl90b19kb3VibGUgKGZwc19uLCBmcHNfZCwgJmN1cl9mcHMpOworCisgICAgaWYgKGJlc3RfZnBzIDwgY3VyX2ZwcykgeworICAgICAgYmVzdF9mcHMgPSBjdXJfZnBzOworICAgICAgYmVzdF9mcHNfbiA9IGZwc19uOworICAgICAgYmVzdF9mcHNfZCA9IGZwc19kOworICAgIH0KKyAgfQorCisgIGlmIChiZXN0X2Zwc19uIDw9IDAgfHwgYmVzdF9mcHNfZCA8PSAwIHx8IGJlc3RfZnBzID09IDAuMCkgeworICAgIGJlc3RfZnBzX24gPSAyNTsKKyAgICBiZXN0X2Zwc19kID0gMTsKKyAgICBiZXN0X2ZwcyA9IDI1LjA7CisgIH0KKworICBpZiAoYmVzdF93aWR0aCA+IDAgJiYgYmVzdF9oZWlnaHQgPiAwICYmIGJlc3RfZnBzID4gMCkgeworICAgIEdzdENhcHMgKmNhcHMsICpwZWVyY2FwczsKKyAgICBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgR3N0VmlkZW9JbmZvIGluZm87CisKKyAgICBpZiAoR1NUX1ZJREVPX0lORk9fRlBTX04gKCZtaXgtPmluZm8pICE9IGJlc3RfZnBzX24gfHwKKyAgICAgICAgR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZtaXgtPmluZm8pICE9IGJlc3RfZnBzX2QpIHsKKyAgICAgIGlmIChtaXgtPnNlZ21lbnQucG9zaXRpb24gIT0gLTEpIHsKKyAgICAgICAgbWl4LT50c19vZmZzZXQgPSBtaXgtPnNlZ21lbnQucG9zaXRpb24gLSBtaXgtPnNlZ21lbnQuc3RhcnQ7CisgICAgICAgIG1peC0+bmZyYW1lcyA9IDA7CisgICAgICB9CisgICAgfQorICAgIGdzdF92aWRlb19pbmZvX2luaXQgKCZpbmZvKTsKKyAgICBnc3RfdmlkZW9faW5mb19zZXRfZm9ybWF0ICgmaW5mbywgR1NUX1ZJREVPX0lORk9fRk9STUFUICgmbWl4LT5pbmZvKSwKKyAgICAgICAgYmVzdF93aWR0aCwgYmVzdF9oZWlnaHQpOworICAgIGluZm8uZnBzX24gPSBiZXN0X2Zwc19uOworICAgIGluZm8uZnBzX2QgPSBiZXN0X2Zwc19kOworICAgIGluZm8ucGFyX24gPSBHU1RfVklERU9fSU5GT19QQVJfTiAoJm1peC0+aW5mbyk7CisgICAgaW5mby5wYXJfZCA9IEdTVF9WSURFT19JTkZPX1BBUl9EICgmbWl4LT5pbmZvKTsKKworICAgIGNhcHMgPSBnc3RfdmlkZW9faW5mb190b19jYXBzICgmaW5mbyk7CisKKyAgICBwZWVyY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChtaXgtPnNyY3BhZCwgTlVMTCk7CisgICAgaWYgKHBlZXJjYXBzICYmICFnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChwZWVyY2FwcywgY2FwcykpIHsKKyAgICAgIEdzdENhcHMgKnRtcDsKKworICAgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJ3aWR0aCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgR19NQVhJTlQsICJoZWlnaHQiLAorICAgICAgICAgIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgR19NQVhJTlQsICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTl9SQU5HRSwKKyAgICAgICAgICAwLCAxLCBHX01BWElOVCwgMSwgTlVMTCk7CisKKyAgICAgIHRtcCA9IGdzdF9jYXBzX2ludGVyc2VjdCAoY2FwcywgcGVlcmNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKyAgICAgIGNhcHMgPSB0bXA7CisgICAgICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKGNhcHMpKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1peCwgImVtcHR5IGNhcHMiKTsKKyAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgIEdTVF9WSURFT19NSVhFUjJfVU5MT0NLIChtaXgpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc190cnVuY2F0ZSAoY2Fwcyk7CisgICAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAocywgIndpZHRoIiwgYmVzdF93aWR0aCk7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAocywgImhlaWdodCIsIGJlc3RfaGVpZ2h0KTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfZnJhY3Rpb24gKHMsICJmcmFtZXJhdGUiLCBiZXN0X2Zwc19uLAorICAgICAgICAgIGJlc3RfZnBzX2QpOworCisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJ3aWR0aCIsICZpbmZvLndpZHRoKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImhlaWdodCIsICZpbmZvLmhlaWdodCk7CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9mcmFjdGlvbiAocywgImZyYWN0aW9uIiwgJmluZm8uZnBzX24sICZpbmZvLmZwc19kKTsKKyAgICB9CisKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgY2FwcyA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZpbmZvKTsKKworICAgIEdTVF9WSURFT19NSVhFUjJfVU5MT0NLIChtaXgpOworICAgIHJldCA9IGdzdF92aWRlb21peGVyMl9zcmNfc2V0Y2FwcyAobWl4LT5zcmNwYWQsIG1peCwgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9IGVsc2UgeworICAgIEdTVF9WSURFT19NSVhFUjJfVU5MT0NLIChtaXgpOworICB9CisKK2RvbmU6CisgIEdTVF9WSURFT19NSVhFUjJfU0VUQ0FQU19VTkxPQ0sgKG1peCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9taXhlcjJfdXBkYXRlX2NvbnZlcnRlcnMgKEdzdFZpZGVvTWl4ZXIyICogbWl4KQoreworICBHU0xpc3QgKnRtcDsKKyAgR3N0VmlkZW9Gb3JtYXQgYmVzdF9mb3JtYXQ7CisgIEdzdFZpZGVvSW5mbyBiZXN0X2luZm87CisgIEdzdFZpZGVvTWl4ZXIyUGFkICpwYWQ7CisgIGdib29sZWFuIG5lZWRfYWxwaGEgPSBGQUxTRTsKKyAgZ2Jvb2xlYW4gYXRfbGVhc3Rfb25lX2FscGhhID0gRkFMU0U7CisgIEdzdENhcHMgKmRvd25zdHJlYW1fY2FwczsKKyAgR3N0Q2FwcyAqcG9zc2libGVfY2FwczsKKyAgZ2NoYXIgKmJlc3RfY29sb3JpbWV0cnk7CisgIGNvbnN0IGdjaGFyICpiZXN0X2Nocm9tYTsKKyAgR0hhc2hUYWJsZSAqZm9ybWF0c190YWJsZTsKKyAgZ2ludCBiZXN0X2Zvcm1hdF9udW1iZXIgPSAwOworCisgIGJlc3RfZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9VTktOT1dOOworICBnc3RfdmlkZW9faW5mb19pbml0ICgmYmVzdF9pbmZvKTsKKworICBkb3duc3RyZWFtX2NhcHMgPSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKG1peC0+c3JjcGFkKTsKKworICBpZiAoIWRvd25zdHJlYW1fY2FwcyB8fCBnc3RfY2Fwc19pc19lbXB0eSAoZG93bnN0cmVhbV9jYXBzKSkgeworICAgIGlmIChkb3duc3RyZWFtX2NhcHMpCisgICAgICBnc3RfY2Fwc191bnJlZiAoZG93bnN0cmVhbV9jYXBzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBmb3JtYXRzX3RhYmxlID0gZ19oYXNoX3RhYmxlX25ldyAoZ19kaXJlY3RfaGFzaCwgZ19kaXJlY3RfZXF1YWwpOworCisgIC8qIGZpcnN0IGZpbmQgbmV3IHByZWZlcnJlZCBmb3JtYXQgKi8KKyAgZm9yICh0bXAgPSBtaXgtPnNpbmtwYWRzOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkgeworICAgIEdzdFN0cnVjdHVyZSAqczsKKyAgICBnaW50IGZvcm1hdF9udW1iZXI7CisKKyAgICBwYWQgPSB0bXAtPmRhdGE7CisKKyAgICBpZiAoIXBhZC0+aW5mby5maW5mbykKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKHBhZC0+aW5mby5maW5mby0+ZmxhZ3MgJiBHU1RfVklERU9fRk9STUFUX0ZMQUdfQUxQSEEpCisgICAgICBhdF9sZWFzdF9vbmVfYWxwaGEgPSBUUlVFOworCisgICAgLyogSWYgd2Ugd2FudCBhbHBoYSwgZGlzcmVnYXJkIGFsbCB0aGUgb3RoZXIgZm9ybWF0cyAqLworICAgIGlmIChuZWVkX2FscGhhICYmICEocGFkLT5pbmZvLmZpbmZvLT5mbGFncyAmIEdTVF9WSURFT19GT1JNQVRfRkxBR19BTFBIQSkpCisgICAgICBjb250aW51ZTsKKworICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBpZiB3ZSByZWxlYXNlIGEgcGFkIGFuZCBhbm90aGVyIHBhZCBoYXNuJ3QgYmVlbiBuZWdvdGlhdGVkIHlldCAqLworICAgIGlmIChHU1RfVklERU9fSU5GT19GT1JNQVQgKCZwYWQtPmluZm8pID09IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTikKKyAgICAgIGNvbnRpbnVlOworCisgICAgcG9zc2libGVfY2FwcyA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZwYWQtPmluZm8pOworCisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHBvc3NpYmxlX2NhcHMsIDApOworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkcyAocywgIndpZHRoIiwgImhlaWdodCIsICJmcmFtZXJhdGUiLAorICAgICAgICAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgImludGVybGFjZS1tb2RlIiwgTlVMTCk7CisKKyAgICAvKiBDYW4gZG93bnN0cmVhbSBhY2NlcHQgdGhpcyBmb3JtYXQgPyAqLworICAgIGlmICghZ3N0X2NhcHNfY2FuX2ludGVyc2VjdCAoZG93bnN0cmVhbV9jYXBzLCBwb3NzaWJsZV9jYXBzKSkgeworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHBvc3NpYmxlX2NhcHMpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgZ3N0X2NhcHNfdW5yZWYgKHBvc3NpYmxlX2NhcHMpOworCisgICAgZm9ybWF0X251bWJlciA9CisgICAgICAgIEdQT0lOVEVSX1RPX0lOVCAoZ19oYXNoX3RhYmxlX2xvb2t1cCAoZm9ybWF0c190YWJsZSwKKyAgICAgICAgICAgIEdJTlRfVE9fUE9JTlRFUiAoR1NUX1ZJREVPX0lORk9fRk9STUFUICgmcGFkLT5pbmZvKSkpKTsKKyAgICBmb3JtYXRfbnVtYmVyICs9IDE7CisKKyAgICBnX2hhc2hfdGFibGVfcmVwbGFjZSAoZm9ybWF0c190YWJsZSwKKyAgICAgICAgR0lOVF9UT19QT0lOVEVSIChHU1RfVklERU9fSU5GT19GT1JNQVQgKCZwYWQtPmluZm8pKSwKKyAgICAgICAgR0lOVF9UT19QT0lOVEVSIChmb3JtYXRfbnVtYmVyKSk7CisKKyAgICAvKiBJZiB0aGF0IHBhZCBpcyB0aGUgZmlyc3Qgd2l0aCBhbHBoYSwgc2V0IGl0IGFzIHRoZSBuZXcgYmVzdCBmb3JtYXQgKi8KKyAgICBpZiAoIW5lZWRfYWxwaGEgJiYgKHBhZC0+aW5mby5maW5mby0+ZmxhZ3MgJiBHU1RfVklERU9fRk9STUFUX0ZMQUdfQUxQSEEpKSB7CisgICAgICBuZWVkX2FscGhhID0gVFJVRTsKKyAgICAgIGJlc3RfZm9ybWF0ID0gR1NUX1ZJREVPX0lORk9fRk9STUFUICgmcGFkLT5pbmZvKTsKKyAgICAgIGJlc3RfaW5mbyA9IHBhZC0+aW5mbzsKKyAgICAgIGJlc3RfZm9ybWF0X251bWJlciA9IGZvcm1hdF9udW1iZXI7CisgICAgfSBlbHNlIGlmIChmb3JtYXRfbnVtYmVyID4gYmVzdF9mb3JtYXRfbnVtYmVyKSB7CisgICAgICBiZXN0X2Zvcm1hdCA9IEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJnBhZC0+aW5mbyk7CisgICAgICBiZXN0X2luZm8gPSBwYWQtPmluZm87CisgICAgICBiZXN0X2Zvcm1hdF9udW1iZXIgPSBmb3JtYXRfbnVtYmVyOworICAgIH0KKyAgfQorCisgIGdfaGFzaF90YWJsZV91bnJlZiAoZm9ybWF0c190YWJsZSk7CisKKyAgaWYgKGJlc3RfZm9ybWF0ID09IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTikgeworICAgIGRvd25zdHJlYW1fY2FwcyA9IGdzdF9jYXBzX2ZpeGF0ZSAoZG93bnN0cmVhbV9jYXBzKTsKKyAgICBnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMgKCZiZXN0X2luZm8sIGRvd25zdHJlYW1fY2Fwcyk7CisgICAgYmVzdF9mb3JtYXQgPSBHU1RfVklERU9fSU5GT19GT1JNQVQgKCZiZXN0X2luZm8pOworICB9CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGRvd25zdHJlYW1fY2Fwcyk7CisKKyAgaWYgKGF0X2xlYXN0X29uZV9hbHBoYQorICAgICAgJiYgIShiZXN0X2luZm8uZmluZm8tPmZsYWdzICYgR1NUX1ZJREVPX0ZPUk1BVF9GTEFHX0FMUEhBKSkgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChtaXgsIENPUkUsIE5FR09USUFUSU9OLAorICAgICAgICAoIkF0IGxlYXN0IG9uZSBvZiB0aGUgaW5wdXQgcGFkcyBjb250YWlucyBhbHBoYSwgYnV0IGRvd25zdHJlYW0gY2FuJ3Qgc3VwcG9ydCBhbHBoYS4iKSwKKyAgICAgICAgKCJFaXRoZXIgY29udmVydCB5b3VyIGlucHV0cyB0byBub3QgY29udGFpbiBhbHBoYSBvciBhZGQgYSB2aWRlb2NvbnZlcnQgYWZ0ZXIgdGhlIG1peGVyIikpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGJlc3RfY29sb3JpbWV0cnkgPSBnc3RfdmlkZW9fY29sb3JpbWV0cnlfdG9fc3RyaW5nICgmKGJlc3RfaW5mby5jb2xvcmltZXRyeSkpOworICBiZXN0X2Nocm9tYSA9IGdzdF92aWRlb19jaHJvbWFfdG9fc3RyaW5nIChiZXN0X2luZm8uY2hyb21hX3NpdGUpOworCisgIGlmIChHU1RfVklERU9fSU5GT19GUFNfTiAoJm1peC0+aW5mbykgIT0gR1NUX1ZJREVPX0lORk9fRlBTX04gKCZiZXN0X2luZm8pIHx8CisgICAgICBHU1RfVklERU9fSU5GT19GUFNfRCAoJm1peC0+aW5mbykgIT0gR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZiZXN0X2luZm8pKSB7CisgICAgaWYgKG1peC0+c2VnbWVudC5wb3NpdGlvbiAhPSAtMSkgeworICAgICAgbWl4LT50c19vZmZzZXQgPSBtaXgtPnNlZ21lbnQucG9zaXRpb24gLSBtaXgtPnNlZ21lbnQuc3RhcnQ7CisgICAgICBtaXgtPm5mcmFtZXMgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBtaXgtPnRzX29mZnNldCArPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKG1peC0+bmZyYW1lcywKKyAgICAgICAgICBHU1RfU0VDT05EICogR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZtaXgtPmluZm8pLAorICAgICAgICAgIEdTVF9WSURFT19JTkZPX0ZQU19OICgmbWl4LT5pbmZvKSk7CisgICAgICBtaXgtPm5mcmFtZXMgPSAwOworICAgIH0KKyAgfQorCisgIG1peC0+aW5mbyA9IGJlc3RfaW5mbzsKKworICBHU1RfREVCVUdfT0JKRUNUIChtaXgsCisgICAgICAiVGhlIG91dHB1dCBmb3JtYXQgd2lsbCBub3cgYmUgOiAlZCB3aXRoIGNvbG9yaW1ldHJ5IDogJXMgYW5kIGNocm9tYSA6ICVzIiwKKyAgICAgIGJlc3RfZm9ybWF0LCBiZXN0X2NvbG9yaW1ldHJ5LCBiZXN0X2Nocm9tYSk7CisKKyAgLyogVGhlbiBicm93c2UgdGhlIHNpbmtzIG9uY2UgbW9yZSwgc2V0dGluZyBvciB1bnNldHRpbmcgY29udmVyc2lvbiBpZiBuZWVkZWQgKi8KKyAgZm9yICh0bXAgPSBtaXgtPnNpbmtwYWRzOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkgeworICAgIGdjaGFyICpjb2xvcmltZXRyeTsKKyAgICBjb25zdCBnY2hhciAqY2hyb21hOworCisgICAgcGFkID0gdG1wLT5kYXRhOworCisgICAgaWYgKCFwYWQtPmluZm8uZmluZm8pCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChHU1RfVklERU9fSU5GT19GT1JNQVQgKCZwYWQtPmluZm8pID09IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTikKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKHBhZC0+Y29udmVydCkKKyAgICAgIGdzdF92aWRlb19jb252ZXJ0ZXJfZnJlZSAocGFkLT5jb252ZXJ0KTsKKworICAgIHBhZC0+Y29udmVydCA9IE5VTEw7CisKKyAgICBjb2xvcmltZXRyeSA9IGdzdF92aWRlb19jb2xvcmltZXRyeV90b19zdHJpbmcgKCYocGFkLT5pbmZvLmNvbG9yaW1ldHJ5KSk7CisgICAgY2hyb21hID0gZ3N0X3ZpZGVvX2Nocm9tYV90b19zdHJpbmcgKHBhZC0+aW5mby5jaHJvbWFfc2l0ZSk7CisKKyAgICBpZiAoYmVzdF9mb3JtYXQgIT0gR1NUX1ZJREVPX0lORk9fRk9STUFUICgmcGFkLT5pbmZvKSB8fAorICAgICAgICBnX3N0cmNtcDAgKGNvbG9yaW1ldHJ5LCBiZXN0X2NvbG9yaW1ldHJ5KSB8fAorICAgICAgICBnX3N0cmNtcDAgKGNocm9tYSwgYmVzdF9jaHJvbWEpKSB7CisgICAgICBHc3RWaWRlb0luZm8gdG1wX2luZm8gPSBwYWQtPmluZm87CisgICAgICB0bXBfaW5mby5maW5mbyA9IGJlc3RfaW5mby5maW5mbzsKKyAgICAgIHRtcF9pbmZvLmNocm9tYV9zaXRlID0gYmVzdF9pbmZvLmNocm9tYV9zaXRlOworICAgICAgdG1wX2luZm8uY29sb3JpbWV0cnkgPSBiZXN0X2luZm8uY29sb3JpbWV0cnk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIlRoaXMgcGFkIHdpbGwgYmUgY29udmVydGVkIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgIEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJnBhZC0+aW5mbyksCisgICAgICAgICAgR1NUX1ZJREVPX0lORk9fRk9STUFUICgmYmVzdF9pbmZvKSk7CisgICAgICBwYWQtPmNvbnZlcnQgPSBnc3RfdmlkZW9fY29udmVydGVyX25ldyAoJnBhZC0+aW5mbywgJnRtcF9pbmZvLCBOVUxMKTsKKyAgICAgIHBhZC0+bmVlZF9jb252ZXJzaW9uX3VwZGF0ZSA9IFRSVUU7CisgICAgICBpZiAoIXBhZC0+Y29udmVydCkgeworICAgICAgICBnX2ZyZWUgKGNvbG9yaW1ldHJ5KTsKKyAgICAgICAgZ19mcmVlIChiZXN0X2NvbG9yaW1ldHJ5KTsKKyAgICAgICAgR1NUX1dBUk5JTkcgKCJObyBwYXRoIGZvdW5kIGZvciBjb252ZXJzaW9uIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiVGhpcyBwYWQgd2lsbCBub3QgbmVlZCBjb252ZXJzaW9uIik7CisgICAgfQorICAgIGdfZnJlZSAoY29sb3JpbWV0cnkpOworICB9CisKKyAgZ19mcmVlIChiZXN0X2NvbG9yaW1ldHJ5KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3ZpZGVvbWl4ZXIyX3BhZF9zaW5rX3NldGNhcHMgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RWaWRlb01peGVyMiAqbWl4OworICBHc3RWaWRlb01peGVyMlBhZCAqbWl4cGFkOworICBHc3RWaWRlb0luZm8gaW5mbzsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgR1NUX0lORk9fT0JKRUNUIChwYWQsICJTZXR0aW5nIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIG1peCA9IEdTVF9WSURFT19NSVhFUjIgKHBhcmVudCk7CisgIG1peHBhZCA9IEdTVF9WSURFT19NSVhFUjJfUEFEIChwYWQpOworCisgIGlmICghZ3N0X3ZpZGVvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgY2FwcykpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwYWQsICJGYWlsZWQgdG8gcGFyc2UgY2FwcyIpOworICAgIGdvdG8gYmVhY2g7CisgIH0KKworICBHU1RfVklERU9fTUlYRVIyX0xPQ0sgKG1peCk7CisgIGlmIChHU1RfVklERU9fSU5GT19GT1JNQVQgKCZtaXgtPmluZm8pICE9IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTikgeworICAgIGlmIChHU1RfVklERU9fSU5GT19QQVJfTiAoJm1peC0+aW5mbykgIT0gR1NUX1ZJREVPX0lORk9fUEFSX04gKCZpbmZvKQorICAgICAgICB8fCBHU1RfVklERU9fSU5GT19QQVJfRCAoJm1peC0+aW5mbykgIT0gR1NUX1ZJREVPX0lORk9fUEFSX0QgKCZpbmZvKSB8fAorICAgICAgICBHU1RfVklERU9fSU5GT19JTlRFUkxBQ0VfTU9ERSAoJm1peC0+aW5mbykgIT0KKyAgICAgICAgR1NUX1ZJREVPX0lORk9fSU5URVJMQUNFX01PREUgKCZpbmZvKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLAorICAgICAgICAgICJnb3QgaW5wdXQgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCAiLCBidXQgIiAiY3VycmVudCBjYXBzIGFyZSAlIgorICAgICAgICAgIEdTVF9QVFJfRk9STUFULCBjYXBzLCBtaXgtPmN1cnJlbnRfY2Fwcyk7CisgICAgICBHU1RfVklERU9fTUlYRVIyX1VOTE9DSyAobWl4KTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKworICBtaXhwYWQtPmluZm8gPSBpbmZvOworCisgIEdTVF9DT0xMRUNUX1BBRFNfU1RSRUFNX0xPQ0sgKG1peC0+Y29sbGVjdCk7CisKKyAgcmV0ID0gZ3N0X3ZpZGVvbWl4ZXIyX3VwZGF0ZV9jb252ZXJ0ZXJzIChtaXgpOworCisgIEdTVF9WSURFT19NSVhFUjJfVU5MT0NLIChtaXgpOworICBpZiAocmV0KQorICAgIHJldCA9IGdzdF92aWRlb21peGVyMl91cGRhdGVfc3JjX2NhcHMgKG1peCk7CisgIEdTVF9DT0xMRUNUX1BBRFNfU1RSRUFNX1VOTE9DSyAobWl4LT5jb2xsZWN0KTsKKworYmVhY2g6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF92aWRlb21peGVyMl9wYWRfc2lua19nZXRjYXBzIChHc3RQYWQgKiBwYWQsIEdzdFZpZGVvTWl4ZXIyICogbWl4LAorICAgIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnNyY2NhcHM7CisgIEdzdENhcHMgKnRlbXBsYXRlX2NhcHM7CisgIEdzdENhcHMgKmZpbHRlcmVkX2NhcHM7CisgIEdzdENhcHMgKnJldHVybmVkX2NhcHM7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgZ2Jvb2xlYW4gaGFkX2N1cnJlbnRfY2FwcyA9IFRSVUU7CisgIGdpbnQgaSwgbjsKKworICB0ZW1wbGF0ZV9jYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9QQUQgKG1peC0+c3JjcGFkKSk7CisKKyAgc3JjY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX1BBRCAobWl4LT5zcmNwYWQpKTsKKyAgaWYgKHNyY2NhcHMgPT0gTlVMTCkgeworICAgIGhhZF9jdXJyZW50X2NhcHMgPSBGQUxTRTsKKyAgICBzcmNjYXBzID0gdGVtcGxhdGVfY2FwczsKKyAgfQorCisgIHNyY2NhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChzcmNjYXBzKTsKKworICBuID0gZ3N0X2NhcHNfZ2V0X3NpemUgKHNyY2NhcHMpOworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHNyY2NhcHMsIGkpOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAid2lkdGgiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIEdfTUFYSU5ULAorICAgICAgICAiaGVpZ2h0IiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCBHX01BWElOVCwKKyAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFLCAwLCAxLCBHX01BWElOVCwgMSwgTlVMTCk7CisgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgInBpeGVsLWFzcGVjdC1yYXRpbyIpKQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iLCBHU1RfVFlQRV9GUkFDVElPTiwgMSwgMSwKKyAgICAgICAgICBOVUxMKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkcyAocywgImNvbG9yaW1ldHJ5IiwgImNocm9tYS1zaXRlIiwgImZvcm1hdCIsCisgICAgICAgIE5VTEwpOworICB9CisKKyAgZmlsdGVyZWRfY2FwcyA9IHNyY2NhcHM7CisgIGlmIChmaWx0ZXIpCisgICAgZmlsdGVyZWRfY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdCAoc3JjY2FwcywgZmlsdGVyKTsKKyAgcmV0dXJuZWRfY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdCAoZmlsdGVyZWRfY2FwcywgdGVtcGxhdGVfY2Fwcyk7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworICBpZiAoZmlsdGVyKQorICAgIGdzdF9jYXBzX3VucmVmIChmaWx0ZXJlZF9jYXBzKTsKKyAgaWYgKGhhZF9jdXJyZW50X2NhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKHRlbXBsYXRlX2NhcHMpOworCisgIHJldHVybiByZXR1cm5lZF9jYXBzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92aWRlb21peGVyMl9wYWRfc2lua19hY2NlcHRjYXBzIChHc3RQYWQgKiBwYWQsIEdzdFZpZGVvTWl4ZXIyICogbWl4LAorICAgIEdzdENhcHMgKiBjYXBzKQoreworICBnYm9vbGVhbiByZXQ7CisgIEdzdENhcHMgKm1vZGlmaWVkX2NhcHM7CisgIEdzdENhcHMgKmFjY2VwdGVkX2NhcHM7CisgIEdzdENhcHMgKnRlbXBsYXRlX2NhcHM7CisgIGdib29sZWFuIGhhZF9jdXJyZW50X2NhcHMgPSBUUlVFOworICBnaW50IGksIG47CisgIEdzdFN0cnVjdHVyZSAqczsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICIlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgYWNjZXB0ZWRfY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoR1NUX1BBRCAobWl4LT5zcmNwYWQpKTsKKworICB0ZW1wbGF0ZV9jYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9QQUQgKG1peC0+c3JjcGFkKSk7CisKKyAgaWYgKGFjY2VwdGVkX2NhcHMgPT0gTlVMTCkgeworICAgIGFjY2VwdGVkX2NhcHMgPSB0ZW1wbGF0ZV9jYXBzOworICAgIGhhZF9jdXJyZW50X2NhcHMgPSBGQUxTRTsKKyAgfQorCisgIGFjY2VwdGVkX2NhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChhY2NlcHRlZF9jYXBzKTsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAic3JjIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGFjY2VwdGVkX2NhcHMpOworCisgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAoYWNjZXB0ZWRfY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoYWNjZXB0ZWRfY2FwcywgaSk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJ3aWR0aCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgR19NQVhJTlQsCisgICAgICAgICJoZWlnaHQiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIEdfTUFYSU5ULAorICAgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT05fUkFOR0UsIDAsIDEsIEdfTUFYSU5ULCAxLCBOVUxMKTsKKyAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAicGl4ZWwtYXNwZWN0LXJhdGlvIikpCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgInBpeGVsLWFzcGVjdC1yYXRpbyIsIEdTVF9UWVBFX0ZSQUNUSU9OLCAxLCAxLAorICAgICAgICAgIE5VTEwpOworCisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGRzIChzLCAiY29sb3JpbWV0cnkiLCAiY2hyb21hLXNpdGUiLCAiZm9ybWF0IiwKKyAgICAgICAgTlVMTCk7CisgIH0KKworICBtb2RpZmllZF9jYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0IChhY2NlcHRlZF9jYXBzLCB0ZW1wbGF0ZV9jYXBzKTsKKworICByZXQgPSBnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChjYXBzLCBhY2NlcHRlZF9jYXBzKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiJXNhY2NlcHRlZCBjYXBzICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgKHJldCA/ICIiIDogIm5vdCAiKSwgY2Fwcyk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgImFjY2VwdGFibGUgY2FwcyBhcmUgJSIgR1NUX1BUUl9GT1JNQVQsIGFjY2VwdGVkX2NhcHMpOworICBnc3RfY2Fwc191bnJlZiAoYWNjZXB0ZWRfY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChtb2RpZmllZF9jYXBzKTsKKyAgaWYgKGhhZF9jdXJyZW50X2NhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKHRlbXBsYXRlX2NhcHMpOworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92aWRlb21peGVyMl9zaW5rX3F1ZXJ5IChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsIEdzdENvbGxlY3REYXRhICogY2RhdGEsCisgICAgR3N0UXVlcnkgKiBxdWVyeSwgR3N0VmlkZW9NaXhlcjIgKiBtaXgpCit7CisgIEdzdFZpZGVvTWl4ZXIyUGFkICpwYWQgPSBHU1RfVklERU9fTUlYRVIyX1BBRCAoY2RhdGEtPnBhZCk7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqZmlsdGVyLCAqY2FwczsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2NhcHMgKHF1ZXJ5LCAmZmlsdGVyKTsKKyAgICAgIGNhcHMgPSBnc3RfdmlkZW9taXhlcjJfcGFkX3NpbmtfZ2V0Y2FwcyAoR1NUX1BBRCAocGFkKSwgbWl4LCBmaWx0ZXIpOworICAgICAgZ3N0X3F1ZXJ5X3NldF9jYXBzX3Jlc3VsdCAocXVlcnksIGNhcHMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9BQ0NFUFRfQ0FQUzoKKyAgICB7CisgICAgICBHc3RDYXBzICpjYXBzOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfYWNjZXB0X2NhcHMgKHF1ZXJ5LCAmY2Fwcyk7CisgICAgICByZXQgPSBnc3RfdmlkZW9taXhlcjJfcGFkX3NpbmtfYWNjZXB0Y2FwcyAoR1NUX1BBRCAocGFkKSwgbWl4LCBjYXBzKTsKKyAgICAgIGdzdF9xdWVyeV9zZXRfYWNjZXB0X2NhcHNfcmVzdWx0IChxdWVyeSwgcmV0KTsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IGdzdF9jb2xsZWN0X3BhZHNfcXVlcnlfZGVmYXVsdCAocGFkcywgY2RhdGEsIHF1ZXJ5LCBGQUxTRSk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvbWl4ZXIyX3BhZF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VmlkZW9NaXhlcjJQYWQgKnBhZCA9IEdTVF9WSURFT19NSVhFUjJfUEFEIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9QQURfWk9SREVSOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHBhZC0+em9yZGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QQURfWFBPUzoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHBhZC0+eHBvcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUEFEX1lQT1M6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCBwYWQtPnlwb3MpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BBRF9BTFBIQToKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIHBhZC0+YWxwaGEpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgaW50CitwYWRfem9yZGVyX2NvbXBhcmUgKGNvbnN0IEdzdFZpZGVvTWl4ZXIyUGFkICogcGFkMSwKKyAgICBjb25zdCBHc3RWaWRlb01peGVyMlBhZCAqIHBhZDIpCit7CisgIHJldHVybiBwYWQxLT56b3JkZXIgLSBwYWQyLT56b3JkZXI7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9taXhlcjJfcGFkX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWaWRlb01peGVyMlBhZCAqcGFkID0gR1NUX1ZJREVPX01JWEVSMl9QQUQgKG9iamVjdCk7CisgIEdzdFZpZGVvTWl4ZXIyICptaXggPSBHU1RfVklERU9fTUlYRVIyIChnc3RfcGFkX2dldF9wYXJlbnQgKEdTVF9QQUQgKHBhZCkpKTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfUEFEX1pPUkRFUjoKKyAgICAgIEdTVF9WSURFT19NSVhFUjJfTE9DSyAobWl4KTsKKyAgICAgIHBhZC0+em9yZGVyID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworCisgICAgICBtaXgtPnNpbmtwYWRzID0gZ19zbGlzdF9zb3J0IChtaXgtPnNpbmtwYWRzLAorICAgICAgICAgIChHQ29tcGFyZUZ1bmMpIHBhZF96b3JkZXJfY29tcGFyZSk7CisgICAgICBHU1RfVklERU9fTUlYRVIyX1VOTE9DSyAobWl4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9QQURfWFBPUzoKKyAgICAgIHBhZC0+eHBvcyA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BBRF9ZUE9TOgorICAgICAgcGFkLT55cG9zID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUEFEX0FMUEhBOgorICAgICAgcGFkLT5hbHBoYSA9IGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorCisgIGdzdF9vYmplY3RfdW5yZWYgKG1peCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9taXhlcjJfcGFkX2NsYXNzX2luaXQgKEdzdFZpZGVvTWl4ZXIyUGFkQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdmlkZW9taXhlcjJfcGFkX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3ZpZGVvbWl4ZXIyX3BhZF9nZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QQURfWk9SREVSLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJ6b3JkZXIiLCAiWi1PcmRlciIsICJaIE9yZGVyIG9mIHRoZSBwaWN0dXJlIiwKKyAgICAgICAgICAwLCAxMDAwMCwgREVGQVVMVF9QQURfWk9SREVSLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QQURfWFBPUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ4cG9zIiwgIlggUG9zaXRpb24iLCAiWCBQb3NpdGlvbiBvZiB0aGUgcGljdHVyZSIsCisgICAgICAgICAgR19NSU5JTlQsIEdfTUFYSU5ULCBERUZBVUxUX1BBRF9YUE9TLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QQURfWVBPUywKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ5cG9zIiwgIlkgUG9zaXRpb24iLCAiWSBQb3NpdGlvbiBvZiB0aGUgcGljdHVyZSIsCisgICAgICAgICAgR19NSU5JTlQsIEdfTUFYSU5ULCBERUZBVUxUX1BBRF9ZUE9TLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9QQURfQUxQSEEsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgiYWxwaGEiLCAiQWxwaGEiLCAiQWxwaGEgb2YgdGhlIHBpY3R1cmUiLCAwLjAsIDEuMCwKKyAgICAgICAgICBERUZBVUxUX1BBRF9BTFBIQSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9taXhlcjJfcGFkX2luaXQgKEdzdFZpZGVvTWl4ZXIyUGFkICogbWl4ZXJwYWQpCit7CisgIG1peGVycGFkLT56b3JkZXIgPSBERUZBVUxUX1BBRF9aT1JERVI7CisgIG1peGVycGFkLT54cG9zID0gREVGQVVMVF9QQURfWFBPUzsKKyAgbWl4ZXJwYWQtPnlwb3MgPSBERUZBVUxUX1BBRF9ZUE9TOworICBtaXhlcnBhZC0+YWxwaGEgPSBERUZBVUxUX1BBRF9BTFBIQTsKKyAgbWl4ZXJwYWQtPmNvbnZlcnQgPSBOVUxMOworICBtaXhlcnBhZC0+bmVlZF9jb252ZXJzaW9uX3VwZGF0ZSA9IEZBTFNFOworfQorCisvKiBHc3RWaWRlb01peGVyMiAqLworI2RlZmluZSBERUZBVUxUX0JBQ0tHUk9VTkQgVklERU9fTUlYRVIyX0JBQ0tHUk9VTkRfQ0hFQ0tFUgorZW51bQoreworICBQUk9QXzAsCisgIFBST1BfQkFDS0dST1VORAorfTsKKworI2RlZmluZSBHU1RfVFlQRV9WSURFT19NSVhFUjJfQkFDS0dST1VORCAoZ3N0X3ZpZGVvbWl4ZXIyX2JhY2tncm91bmRfZ2V0X3R5cGUoKSkKK3N0YXRpYyBHVHlwZQorZ3N0X3ZpZGVvbWl4ZXIyX2JhY2tncm91bmRfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB2aWRlb19taXhlcl9iYWNrZ3JvdW5kX3R5cGUgPSAwOworCisgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIHZpZGVvX21peGVyX2JhY2tncm91bmRbXSA9IHsKKyAgICB7VklERU9fTUlYRVIyX0JBQ0tHUk9VTkRfQ0hFQ0tFUiwgIkNoZWNrZXIgcGF0dGVybiIsICJjaGVja2VyIn0sCisgICAge1ZJREVPX01JWEVSMl9CQUNLR1JPVU5EX0JMQUNLLCAiQmxhY2siLCAiYmxhY2sifSwKKyAgICB7VklERU9fTUlYRVIyX0JBQ0tHUk9VTkRfV0hJVEUsICJXaGl0ZSIsICJ3aGl0ZSJ9LAorICAgIHtWSURFT19NSVhFUjJfQkFDS0dST1VORF9UUkFOU1BBUkVOVCwKKyAgICAgICAgIlRyYW5zcGFyZW50IEJhY2tncm91bmQgdG8gZW5hYmxlIGZ1cnRoZXIgbWl4aW5nIiwgInRyYW5zcGFyZW50In0sCisgICAgezAsIE5VTEwsIE5VTEx9LAorICB9OworCisgIGlmICghdmlkZW9fbWl4ZXJfYmFja2dyb3VuZF90eXBlKSB7CisgICAgdmlkZW9fbWl4ZXJfYmFja2dyb3VuZF90eXBlID0KKyAgICAgICAgZ19lbnVtX3JlZ2lzdGVyX3N0YXRpYyAoIkdzdFZpZGVvTWl4ZXIyQmFja2dyb3VuZCIsCisgICAgICAgIHZpZGVvX21peGVyX2JhY2tncm91bmQpOworICB9CisgIHJldHVybiB2aWRlb19taXhlcl9iYWNrZ3JvdW5kX3R5cGU7Cit9CisKKyNkZWZpbmUgZ3N0X3ZpZGVvbWl4ZXIyX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RWaWRlb01peGVyMiwgZ3N0X3ZpZGVvbWl4ZXIyLCBHU1RfVFlQRV9FTEVNRU5ULAorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfQ0hJTERfUFJPWFksCisgICAgICAgIGdzdF92aWRlb21peGVyMl9jaGlsZF9wcm94eV9pbml0KSk7CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9taXhlcjJfdXBkYXRlX3FvcyAoR3N0VmlkZW9NaXhlcjIgKiBtaXgsIGdkb3VibGUgcHJvcG9ydGlvbiwKKyAgICBHc3RDbG9ja1RpbWVEaWZmIGRpZmYsIEdzdENsb2NrVGltZSB0aW1lc3RhbXApCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKG1peCwKKyAgICAgICJVcGRhdGluZyBRb1M6IHByb3BvcnRpb24gJWxmLCBkaWZmICUiIEdTVF9TVElNRV9GT1JNQVQgIiwgdGltZXN0YW1wICUiCisgICAgICBHU1RfVElNRV9GT1JNQVQsIHByb3BvcnRpb24sIEdTVF9TVElNRV9BUkdTIChkaWZmKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCkpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAobWl4KTsKKyAgbWl4LT5wcm9wb3J0aW9uID0gcHJvcG9ydGlvbjsKKyAgaWYgKEdfTElLRUxZICh0aW1lc3RhbXAgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkpIHsKKyAgICBpZiAoIW1peC0+bGl2ZSAmJiBHX1VOTElLRUxZIChkaWZmID4gMCkpCisgICAgICBtaXgtPmVhcmxpZXN0X3RpbWUgPQorICAgICAgICAgIHRpbWVzdGFtcCArIDIgKiBkaWZmICsgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludF9yb3VuZCAoR1NUX1NFQ09ORCwKKyAgICAgICAgICBHU1RfVklERU9fSU5GT19GUFNfRCAoJm1peC0+aW5mbyksIEdTVF9WSURFT19JTkZPX0ZQU19OICgmbWl4LT5pbmZvKSk7CisgICAgZWxzZQorICAgICAgbWl4LT5lYXJsaWVzdF90aW1lID0gdGltZXN0YW1wICsgZGlmZjsKKyAgfSBlbHNlIHsKKyAgICBtaXgtPmVhcmxpZXN0X3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChtaXgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvbWl4ZXIyX3Jlc2V0X3FvcyAoR3N0VmlkZW9NaXhlcjIgKiBtaXgpCit7CisgIGdzdF92aWRlb21peGVyMl91cGRhdGVfcW9zIChtaXgsIDAuNSwgMCwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgIG1peC0+cW9zX3Byb2Nlc3NlZCA9IG1peC0+cW9zX2Ryb3BwZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvbWl4ZXIyX3JlYWRfcW9zIChHc3RWaWRlb01peGVyMiAqIG1peCwgZ2RvdWJsZSAqIHByb3BvcnRpb24sCisgICAgR3N0Q2xvY2tUaW1lICogdGltZSkKK3sKKyAgR1NUX09CSkVDVF9MT0NLIChtaXgpOworICAqcHJvcG9ydGlvbiA9IG1peC0+cHJvcG9ydGlvbjsKKyAgKnRpbWUgPSBtaXgtPmVhcmxpZXN0X3RpbWU7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChtaXgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvbWl4ZXIyX3Jlc2V0IChHc3RWaWRlb01peGVyMiAqIG1peCkKK3sKKyAgR1NMaXN0ICpsOworCisgIGdzdF92aWRlb19pbmZvX2luaXQgKCZtaXgtPmluZm8pOworICBtaXgtPnRzX29mZnNldCA9IDA7CisgIG1peC0+bmZyYW1lcyA9IDA7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJm1peC0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgbWl4LT5zZWdtZW50LnBvc2l0aW9uID0gLTE7CisKKyAgZ3N0X3ZpZGVvbWl4ZXIyX3Jlc2V0X3FvcyAobWl4KTsKKworICBmb3IgKGwgPSBtaXgtPnNpbmtwYWRzOyBsOyBsID0gbC0+bmV4dCkgeworICAgIEdzdFZpZGVvTWl4ZXIyUGFkICpwID0gbC0+ZGF0YTsKKyAgICBHc3RWaWRlb01peGVyMkNvbGxlY3QgKm1peGNvbCA9IHAtPm1peGNvbDsKKworICAgIGdzdF9idWZmZXJfcmVwbGFjZSAoJm1peGNvbC0+YnVmZmVyLCBOVUxMKTsKKyAgICBtaXhjb2wtPnN0YXJ0X3RpbWUgPSAtMTsKKyAgICBtaXhjb2wtPmVuZF90aW1lID0gLTE7CisKKyAgICBnc3RfdmlkZW9faW5mb19pbml0ICgmcC0+aW5mbyk7CisgIH0KKworICBtaXgtPm5ld3NlZ19wZW5kaW5nID0gVFJVRTsKK30KKworLyogIDEgPT0gT0sKKyAqICAwID09IG5lZWQgbW9yZSBkYXRhCisgKiAtMSA9PSBFT1MKKyAqIC0yID09IGVycm9yCisgKi8KK3N0YXRpYyBnaW50Citnc3RfdmlkZW9taXhlcjJfZmlsbF9xdWV1ZXMgKEdzdFZpZGVvTWl4ZXIyICogbWl4LAorICAgIEdzdENsb2NrVGltZSBvdXRwdXRfc3RhcnRfdGltZSwgR3N0Q2xvY2tUaW1lIG91dHB1dF9lbmRfdGltZSkKK3sKKyAgR1NMaXN0ICpsOworICBnYm9vbGVhbiBlb3MgPSBUUlVFOworICBnYm9vbGVhbiBuZWVkX21vcmVfZGF0YSA9IEZBTFNFOworCisgIGZvciAobCA9IG1peC0+c2lua3BhZHM7IGw7IGwgPSBsLT5uZXh0KSB7CisgICAgR3N0VmlkZW9NaXhlcjJQYWQgKnBhZCA9IGwtPmRhdGE7CisgICAgR3N0VmlkZW9NaXhlcjJDb2xsZWN0ICptaXhjb2wgPSBwYWQtPm1peGNvbDsKKyAgICBHc3RTZWdtZW50ICpzZWdtZW50ID0gJnBhZC0+bWl4Y29sLT5jb2xsZWN0LnNlZ21lbnQ7CisgICAgR3N0QnVmZmVyICpidWY7CisgICAgR3N0VmlkZW9JbmZvICp2aW5mbzsKKworICAgIGJ1ZiA9IGdzdF9jb2xsZWN0X3BhZHNfcGVlayAobWl4LT5jb2xsZWN0LCAmbWl4Y29sLT5jb2xsZWN0KTsKKyAgICBpZiAoYnVmKSB7CisgICAgICBHc3RDbG9ja1RpbWUgc3RhcnRfdGltZSwgZW5kX3RpbWU7CisKKyAgICAgIHN0YXJ0X3RpbWUgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKTsKKyAgICAgIGlmIChzdGFydF90aW1lID09IC0xKSB7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBhZCwgIk5lZWQgdGltZXN0YW1wZWQgYnVmZmVycyEiKTsKKyAgICAgICAgcmV0dXJuIC0yOworICAgICAgfQorCisgICAgICB2aW5mbyA9ICZwYWQtPmluZm87CisKKyAgICAgIC8qIEZJWE1FOiBNYWtlIGFsbCB0aGlzIHdvcmsgd2l0aCBuZWdhdGl2ZSByYXRlcyAqLworCisgICAgICBpZiAoKG1peGNvbC0+YnVmZmVyICYmIHN0YXJ0X3RpbWUgPCBHU1RfQlVGRkVSX1RJTUVTVEFNUCAobWl4Y29sLT5idWZmZXIpKQorICAgICAgICAgIHx8IChtaXhjb2wtPnF1ZXVlZAorICAgICAgICAgICAgICAmJiBzdGFydF90aW1lIDwgR1NUX0JVRkZFUl9USU1FU1RBTVAgKG1peGNvbC0+cXVldWVkKSkpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYWQsICJCdWZmZXIgZnJvbSB0aGUgcGFzdCwgZHJvcHBpbmciKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgYnVmID0gZ3N0X2NvbGxlY3RfcGFkc19wb3AgKG1peC0+Y29sbGVjdCwgJm1peGNvbC0+Y29sbGVjdCk7CisgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIG5lZWRfbW9yZV9kYXRhID0gVFJVRTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChtaXhjb2wtPnF1ZXVlZCkgeworICAgICAgICBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgLSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAobWl4Y29sLT5xdWV1ZWQpOworICAgICAgICBzdGFydF90aW1lID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKG1peGNvbC0+cXVldWVkKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgYnVmID0gZ3N0X2J1ZmZlcl9yZWYgKG1peGNvbC0+cXVldWVkKTsKKyAgICAgICAgdmluZm8gPSAmbWl4Y29sLT5xdWV1ZWRfdmluZm87CisgICAgICB9IGVsc2UgeworICAgICAgICBlbmRfdGltZSA9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1Zik7CisKKyAgICAgICAgaWYgKGVuZF90aW1lID09IC0xKSB7CisgICAgICAgICAgbWl4Y29sLT5xdWV1ZWQgPSBidWY7CisgICAgICAgICAgYnVmID0gZ3N0X2NvbGxlY3RfcGFkc19wb3AgKG1peC0+Y29sbGVjdCwgJm1peGNvbC0+Y29sbGVjdCk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICBtaXhjb2wtPnF1ZXVlZF92aW5mbyA9IHBhZC0+aW5mbzsKKyAgICAgICAgICBuZWVkX21vcmVfZGF0YSA9IFRSVUU7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZ19hc3NlcnQgKHN0YXJ0X3RpbWUgIT0gLTEgJiYgZW5kX3RpbWUgIT0gLTEpOworICAgICAgZW5kX3RpbWUgKz0gc3RhcnRfdGltZTsgICAvKiBjb252ZXJ0IGZyb20gZHVyYXRpb24gdG8gcG9zaXRpb24gKi8KKworICAgICAgLyogQ2hlY2sgaWYgaXQncyBpbnNpZGUgdGhlIHNlZ21lbnQgKi8KKyAgICAgIGlmIChzdGFydF90aW1lID49IHNlZ21lbnQtPnN0b3AgfHwgZW5kX3RpbWUgPCBzZWdtZW50LT5zdGFydCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsICJCdWZmZXIgb3V0c2lkZSB0aGUgc2VnbWVudCIpOworCisgICAgICAgIGlmIChidWYgPT0gbWl4Y29sLT5xdWV1ZWQpIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgIGdzdF9idWZmZXJfcmVwbGFjZSAoJm1peGNvbC0+cXVldWVkLCBOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgIGJ1ZiA9IGdzdF9jb2xsZWN0X3BhZHNfcG9wIChtaXgtPmNvbGxlY3QsICZtaXhjb2wtPmNvbGxlY3QpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBuZWVkX21vcmVfZGF0YSA9IFRSVUU7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKiBDbGlwIHRvIHNlZ21lbnQgYW5kIGNvbnZlcnQgdG8gcnVubmluZyB0aW1lICovCisgICAgICBzdGFydF90aW1lID0gTUFYIChzdGFydF90aW1lLCBzZWdtZW50LT5zdGFydCk7CisgICAgICBpZiAoc2VnbWVudC0+c3RvcCAhPSAtMSkKKyAgICAgICAgZW5kX3RpbWUgPSBNSU4gKGVuZF90aW1lLCBzZWdtZW50LT5zdG9wKTsKKyAgICAgIHN0YXJ0X3RpbWUgPQorICAgICAgICAgIGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLCBzdGFydF90aW1lKTsKKyAgICAgIGVuZF90aW1lID0KKyAgICAgICAgICBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKHNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgZW5kX3RpbWUpOworICAgICAgZ19hc3NlcnQgKHN0YXJ0X3RpbWUgIT0gLTEgJiYgZW5kX3RpbWUgIT0gLTEpOworCisgICAgICAvKiBDb252ZXJ0IHRvIHRoZSBvdXRwdXQgc2VnbWVudCByYXRlICovCisgICAgICBpZiAoQUJTIChtaXgtPnNlZ21lbnQucmF0ZSkgIT0gMS4wKSB7CisgICAgICAgIHN0YXJ0X3RpbWUgKj0gQUJTIChtaXgtPnNlZ21lbnQucmF0ZSk7CisgICAgICAgIGVuZF90aW1lICo9IEFCUyAobWl4LT5zZWdtZW50LnJhdGUpOworICAgICAgfQorCisgICAgICBpZiAobWl4Y29sLT5lbmRfdGltZSAhPSAtMSAmJiBtaXhjb2wtPmVuZF90aW1lID4gZW5kX3RpbWUpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiQnVmZmVyIGZyb20gdGhlIHBhc3QsIGRyb3BwaW5nIik7CisgICAgICAgIGlmIChidWYgPT0gbWl4Y29sLT5xdWV1ZWQpIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgIGdzdF9idWZmZXJfcmVwbGFjZSAoJm1peGNvbC0+cXVldWVkLCBOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgIGJ1ZiA9IGdzdF9jb2xsZWN0X3BhZHNfcG9wIChtaXgtPmNvbGxlY3QsICZtaXhjb2wtPmNvbGxlY3QpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBuZWVkX21vcmVfZGF0YSA9IFRSVUU7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoZW5kX3RpbWUgPj0gb3V0cHV0X3N0YXJ0X3RpbWUgJiYgc3RhcnRfdGltZSA8IG91dHB1dF9lbmRfdGltZSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChwYWQsCisgICAgICAgICAgICAiVGFraW5nIG5ldyBidWZmZXIgd2l0aCBzdGFydCB0aW1lICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9USU1FX0FSR1MgKHN0YXJ0X3RpbWUpKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmbWl4Y29sLT5idWZmZXIsIGJ1Zik7CisgICAgICAgIG1peGNvbC0+YnVmZmVyX3ZpbmZvID0gKnZpbmZvOworICAgICAgICBtaXhjb2wtPnN0YXJ0X3RpbWUgPSBzdGFydF90aW1lOworICAgICAgICBtaXhjb2wtPmVuZF90aW1lID0gZW5kX3RpbWU7CisKKyAgICAgICAgaWYgKGJ1ZiA9PSBtaXhjb2wtPnF1ZXVlZCkgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmbWl4Y29sLT5xdWV1ZWQsIE5VTEwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgICAgYnVmID0gZ3N0X2NvbGxlY3RfcGFkc19wb3AgKG1peC0+Y29sbGVjdCwgJm1peGNvbC0+Y29sbGVjdCk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgfQorICAgICAgICBlb3MgPSBGQUxTRTsKKyAgICAgIH0gZWxzZSBpZiAoc3RhcnRfdGltZSA+PSBvdXRwdXRfZW5kX3RpbWUpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiS2VlcGluZyBidWZmZXIgdW50aWwgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoc3RhcnRfdGltZSkpOworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICBlb3MgPSBGQUxTRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBhZCwgIlRvbyBvbGQgYnVmZmVyIC0tIGRyb3BwaW5nIik7CisgICAgICAgIGlmIChidWYgPT0gbWl4Y29sLT5xdWV1ZWQpIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgIGdzdF9idWZmZXJfcmVwbGFjZSAoJm1peGNvbC0+cXVldWVkLCBOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgIGJ1ZiA9IGdzdF9jb2xsZWN0X3BhZHNfcG9wIChtaXgtPmNvbGxlY3QsICZtaXhjb2wtPmNvbGxlY3QpOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBuZWVkX21vcmVfZGF0YSA9IFRSVUU7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAobWl4Y29sLT5lbmRfdGltZSAhPSAtMSkgeworICAgICAgICBpZiAobWl4Y29sLT5lbmRfdGltZSA8PSBvdXRwdXRfc3RhcnRfdGltZSkgeworICAgICAgICAgIGdzdF9idWZmZXJfcmVwbGFjZSAoJm1peGNvbC0+YnVmZmVyLCBOVUxMKTsKKyAgICAgICAgICBtaXhjb2wtPnN0YXJ0X3RpbWUgPSBtaXhjb2wtPmVuZF90aW1lID0gLTE7CisgICAgICAgICAgaWYgKCFHU1RfQ09MTEVDVF9QQURTX1NUQVRFX0lTX1NFVCAobWl4Y29sLAorICAgICAgICAgICAgICAgICAgR1NUX0NPTExFQ1RfUEFEU19TVEFURV9FT1MpKQorICAgICAgICAgICAgbmVlZF9tb3JlX2RhdGEgPSBUUlVFOworICAgICAgICB9IGVsc2UgaWYgKCFHU1RfQ09MTEVDVF9QQURTX1NUQVRFX0lTX1NFVCAobWl4Y29sLAorICAgICAgICAgICAgICAgIEdTVF9DT0xMRUNUX1BBRFNfU1RBVEVfRU9TKSkgeworICAgICAgICAgIGVvcyA9IEZBTFNFOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKG5lZWRfbW9yZV9kYXRhKQorICAgIHJldHVybiAwOworICBpZiAoZW9zKQorICAgIHJldHVybiAtMTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92aWRlb21peGVyMl9ibGVuZF9idWZmZXJzIChHc3RWaWRlb01peGVyMiAqIG1peCwKKyAgICBHc3RDbG9ja1RpbWUgb3V0cHV0X3N0YXJ0X3RpbWUsIEdzdENsb2NrVGltZSBvdXRwdXRfZW5kX3RpbWUsCisgICAgR3N0QnVmZmVyICoqIG91dGJ1ZikKK3sKKyAgR1NMaXN0ICpsOworICBndWludCBvdXRzaXplOworICBCbGVuZEZ1bmN0aW9uIGNvbXBvc2l0ZTsKKyAgR3N0VmlkZW9GcmFtZSBvdXRmcmFtZTsKKyAgc3RhdGljIEdzdEFsbG9jYXRpb25QYXJhbXMgcGFyYW1zID0geyAwLCAxNSwgMCwgMCwgfTsKKworICBvdXRzaXplID0gR1NUX1ZJREVPX0lORk9fU0laRSAoJm1peC0+aW5mbyk7CisKKyAgKm91dGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBvdXRzaXplLCAmcGFyYW1zKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKCpvdXRidWYpID0gb3V0cHV0X3N0YXJ0X3RpbWU7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKCpvdXRidWYpID0gb3V0cHV0X2VuZF90aW1lIC0gb3V0cHV0X3N0YXJ0X3RpbWU7CisKKyAgZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJm91dGZyYW1lLCAmbWl4LT5pbmZvLCAqb3V0YnVmLCBHU1RfTUFQX1JFQURXUklURSk7CisKKyAgLyogZGVmYXVsdCB0byBibGVuZGluZyAqLworICBjb21wb3NpdGUgPSBtaXgtPmJsZW5kOworICBzd2l0Y2ggKG1peC0+YmFja2dyb3VuZCkgeworICAgIGNhc2UgVklERU9fTUlYRVIyX0JBQ0tHUk9VTkRfQ0hFQ0tFUjoKKyAgICAgIG1peC0+ZmlsbF9jaGVja2VyICgmb3V0ZnJhbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWSURFT19NSVhFUjJfQkFDS0dST1VORF9CTEFDSzoKKyAgICAgIG1peC0+ZmlsbF9jb2xvciAoJm91dGZyYW1lLCAxNiwgMTI4LCAxMjgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWSURFT19NSVhFUjJfQkFDS0dST1VORF9XSElURToKKyAgICAgIG1peC0+ZmlsbF9jb2xvciAoJm91dGZyYW1lLCAyNDAsIDEyOCwgMTI4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVklERU9fTUlYRVIyX0JBQ0tHUk9VTkRfVFJBTlNQQVJFTlQ6CisgICAgeworICAgICAgZ3VpbnQgaSwgcGxhbmUsIG51bV9wbGFuZXMsIGhlaWdodDsKKworICAgICAgbnVtX3BsYW5lcyA9IEdTVF9WSURFT19GUkFNRV9OX1BMQU5FUyAoJm91dGZyYW1lKTsKKyAgICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IG51bV9wbGFuZXM7ICsrcGxhbmUpIHsKKyAgICAgICAgZ3VpbnQ4ICpwZGF0YTsKKyAgICAgICAgZ3NpemUgcm93c2l6ZSwgcGxhbmVfc3RyaWRlOworCisgICAgICAgIHBkYXRhID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKCZvdXRmcmFtZSwgcGxhbmUpOworICAgICAgICBwbGFuZV9zdHJpZGUgPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFICgmb3V0ZnJhbWUsIHBsYW5lKTsKKyAgICAgICAgcm93c2l6ZSA9IEdTVF9WSURFT19GUkFNRV9DT01QX1dJRFRIICgmb3V0ZnJhbWUsIHBsYW5lKQorICAgICAgICAgICAgKiBHU1RfVklERU9fRlJBTUVfQ09NUF9QU1RSSURFICgmb3V0ZnJhbWUsIHBsYW5lKTsKKyAgICAgICAgaGVpZ2h0ID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfSEVJR0hUICgmb3V0ZnJhbWUsIHBsYW5lKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CisgICAgICAgICAgbWVtc2V0IChwZGF0YSwgMCwgcm93c2l6ZSk7CisgICAgICAgICAgcGRhdGEgKz0gcGxhbmVfc3RyaWRlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIHVzZSBvdmVybGF5IHRvIGtlZXAgYmFja2dyb3VuZCB0cmFuc3BhcmVudCAqLworICAgICAgY29tcG9zaXRlID0gbWl4LT5vdmVybGF5OworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgZm9yIChsID0gbWl4LT5zaW5rcGFkczsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICBHc3RWaWRlb01peGVyMlBhZCAqcGFkID0gbC0+ZGF0YTsKKyAgICBHc3RWaWRlb01peGVyMkNvbGxlY3QgKm1peGNvbCA9IHBhZC0+bWl4Y29sOworCisgICAgaWYgKG1peGNvbC0+YnVmZmVyICE9IE5VTEwpIHsKKyAgICAgIEdzdENsb2NrVGltZSB0aW1lc3RhbXA7CisgICAgICBnaW50NjQgc3RyZWFtX3RpbWU7CisgICAgICBHc3RTZWdtZW50ICpzZWc7CisgICAgICBHc3RWaWRlb0ZyYW1lIGNvbnZlcnRlZF9mcmFtZTsKKyAgICAgIEdzdEJ1ZmZlciAqY29udmVydGVkX2J1ZiA9IE5VTEw7CisgICAgICBHc3RWaWRlb0ZyYW1lIGZyYW1lOworCisgICAgICBzZWcgPSAmbWl4Y29sLT5jb2xsZWN0LnNlZ21lbnQ7CisKKyAgICAgIHRpbWVzdGFtcCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChtaXhjb2wtPmJ1ZmZlcik7CisKKyAgICAgIHN0cmVhbV90aW1lID0KKyAgICAgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoc2VnLCBHU1RfRk9STUFUX1RJTUUsIHRpbWVzdGFtcCk7CisKKyAgICAgIC8qIHN5bmMgb2JqZWN0IHByb3BlcnRpZXMgb24gc3RyZWFtIHRpbWUgKi8KKyAgICAgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoc3RyZWFtX3RpbWUpKQorICAgICAgICBnc3Rfb2JqZWN0X3N5bmNfdmFsdWVzIChHU1RfT0JKRUNUIChwYWQpLCBzdHJlYW1fdGltZSk7CisKKyAgICAgIGdzdF92aWRlb19mcmFtZV9tYXAgKCZmcmFtZSwgJm1peGNvbC0+YnVmZmVyX3ZpbmZvLCBtaXhjb2wtPmJ1ZmZlciwKKyAgICAgICAgICBHU1RfTUFQX1JFQUQpOworCisgICAgICBpZiAocGFkLT5jb252ZXJ0KSB7CisgICAgICAgIGdpbnQgY29udmVydGVkX3NpemU7CisKKyAgICAgICAgLyogV2Ugd2FpdCB1bnRpbCBoZXJlIHRvIHNldCB0aGUgY29udmVyc2lvbiBpbmZvcywgaW4gY2FzZSBtaXgtPmluZm8gY2hhbmdlZCAqLworICAgICAgICBpZiAocGFkLT5uZWVkX2NvbnZlcnNpb25fdXBkYXRlKSB7CisgICAgICAgICAgcGFkLT5jb252ZXJzaW9uX2luZm8gPSBtaXgtPmluZm87CisgICAgICAgICAgZ3N0X3ZpZGVvX2luZm9fc2V0X2Zvcm1hdCAoJihwYWQtPmNvbnZlcnNpb25faW5mbyksCisgICAgICAgICAgICAgIEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJm1peC0+aW5mbyksIHBhZC0+aW5mby53aWR0aCwKKyAgICAgICAgICAgICAgcGFkLT5pbmZvLmhlaWdodCk7CisgICAgICAgICAgcGFkLT5uZWVkX2NvbnZlcnNpb25fdXBkYXRlID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBjb252ZXJ0ZWRfc2l6ZSA9IHBhZC0+Y29udmVyc2lvbl9pbmZvLnNpemU7CisgICAgICAgIGNvbnZlcnRlZF9zaXplID0gY29udmVydGVkX3NpemUgPiBvdXRzaXplID8gY29udmVydGVkX3NpemUgOiBvdXRzaXplOworICAgICAgICBjb252ZXJ0ZWRfYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIGNvbnZlcnRlZF9zaXplLCAmcGFyYW1zKTsKKworICAgICAgICBnc3RfdmlkZW9fZnJhbWVfbWFwICgmY29udmVydGVkX2ZyYW1lLCAmKHBhZC0+Y29udmVyc2lvbl9pbmZvKSwKKyAgICAgICAgICAgIGNvbnZlcnRlZF9idWYsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgICAgICAgZ3N0X3ZpZGVvX2NvbnZlcnRlcl9mcmFtZSAocGFkLT5jb252ZXJ0LCAmZnJhbWUsICZjb252ZXJ0ZWRfZnJhbWUpOworICAgICAgICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZmcmFtZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb252ZXJ0ZWRfZnJhbWUgPSBmcmFtZTsKKyAgICAgIH0KKworICAgICAgY29tcG9zaXRlICgmY29udmVydGVkX2ZyYW1lLCBwYWQtPnhwb3MsIHBhZC0+eXBvcywgcGFkLT5hbHBoYSwgJm91dGZyYW1lKTsKKworICAgICAgaWYgKHBhZC0+Y29udmVydCkKKyAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoY29udmVydGVkX2J1Zik7CisKKyAgICAgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJmNvbnZlcnRlZF9mcmFtZSk7CisgICAgfQorICB9CisgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJm91dGZyYW1lKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKKy8qIFBlcmZvcm0gcW9zIGNhbGN1bGF0aW9ucyBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgbmV4dCBmcmFtZS4gUmV0dXJucyBUUlVFIGlmCisgKiB0aGUgZnJhbWUgc2hvdWxkIGJlIHByb2Nlc3NlZCwgRkFMU0UgaWYgdGhlIGZyYW1lIGNhbiBiZSBkcm9wcGVkIGVudGlyZWx5ICovCitzdGF0aWMgZ2ludDY0Citnc3RfdmlkZW9taXhlcjJfZG9fcW9zIChHc3RWaWRlb01peGVyMiAqIG1peCwgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCkKK3sKKyAgR3N0Q2xvY2tUaW1lIHFvc3RpbWUsIGVhcmxpZXN0X3RpbWU7CisgIGdkb3VibGUgcHJvcG9ydGlvbjsKKyAgZ2ludDY0IGppdHRlcjsKKworICAvKiBubyB0aW1lc3RhbXAsIGNhbid0IGRvIFFvUyA9PiBwcm9jZXNzIGZyYW1lICovCisgIGlmIChHX1VOTElLRUxZICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHRpbWVzdGFtcCkpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKG1peCwgImludmFsaWQgdGltZXN0YW1wLCBjYW4ndCBkbyBRb1MsIHByb2Nlc3MgZnJhbWUiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBnZXQgbGF0ZXN0IFFvUyBvYnNlcnZhdGlvbiB2YWx1ZXMgKi8KKyAgZ3N0X3ZpZGVvbWl4ZXIyX3JlYWRfcW9zIChtaXgsICZwcm9wb3J0aW9uLCAmZWFybGllc3RfdGltZSk7CisKKyAgLyogc2tpcCBxb3MgaWYgd2UgaGF2ZSBubyBvYnNlcnZhdGlvbiAoeWV0KSA9PiBwcm9jZXNzIGZyYW1lICovCisgIGlmIChHX1VOTElLRUxZICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGVhcmxpZXN0X3RpbWUpKSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChtaXgsICJubyBvYnNlcnZhdGlvbiB5ZXQsIHByb2Nlc3MgZnJhbWUiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBxb3MgaXMgZG9uZSBvbiBydW5uaW5nIHRpbWUgKi8KKyAgcW9zdGltZSA9CisgICAgICBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZtaXgtPnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSwgdGltZXN0YW1wKTsKKworICAvKiBzZWUgaG93IG91ciBuZXh0IHRpbWVzdGFtcCByZWxhdGVzIHRvIHRoZSBsYXRlc3QgcW9zIHRpbWVzdGFtcCAqLworICBHU1RfTE9HX09CSkVDVCAobWl4LCAicW9zdGltZSAlIiBHU1RfVElNRV9GT1JNQVQgIiwgZWFybGllc3QgJSIKKyAgICAgIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAocW9zdGltZSksIEdTVF9USU1FX0FSR1MgKGVhcmxpZXN0X3RpbWUpKTsKKworICBqaXR0ZXIgPSBHU1RfQ0xPQ0tfRElGRiAocW9zdGltZSwgZWFybGllc3RfdGltZSk7CisgIGlmIChxb3N0aW1lICE9IEdTVF9DTE9DS19USU1FX05PTkUgJiYgaml0dGVyID4gMCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1peCwgIndlIGFyZSBsYXRlLCBkcm9wIGZyYW1lIik7CisgICAgcmV0dXJuIGppdHRlcjsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChtaXgsICJwcm9jZXNzIGZyYW1lIik7CisgIHJldHVybiBqaXR0ZXI7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdmlkZW9taXhlcjJfY29sbGVjdGVkIChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsIEdzdFZpZGVvTWl4ZXIyICogbWl4KQoreworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0Q2xvY2tUaW1lIG91dHB1dF9zdGFydF90aW1lLCBvdXRwdXRfZW5kX3RpbWU7CisgIEdzdEJ1ZmZlciAqb3V0YnVmID0gTlVMTDsKKyAgZ2ludCByZXM7CisgIGdpbnQ2NCBqaXR0ZXI7CisKKyAgLyogSWYgd2UncmUgbm90IG5lZ290aWF0ZWQgeWV0Li4uICovCisgIGlmIChHU1RfVklERU9fSU5GT19GT1JNQVQgKCZtaXgtPmluZm8pID09IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTikKKyAgICByZXR1cm4gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisKKyAgaWYgKG1peC0+c2VuZF9zdHJlYW1fc3RhcnQpIHsKKyAgICBnY2hhciBzX2lkWzMyXTsKKworICAgIC8qIHN0cmVhbS1zdGFydCAoRklYTUU6IGNyZWF0ZSBpZCBiYXNlZCBvbiBpbnB1dCBpZHMpICovCisgICAgZ19zbnByaW50ZiAoc19pZCwgc2l6ZW9mIChzX2lkKSwgIm1peC0lMDh4IiwgZ19yYW5kb21faW50ICgpKTsKKyAgICBpZiAoIWdzdF9wYWRfcHVzaF9ldmVudCAobWl4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0IChzX2lkKSkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAobWl4LT5zcmNwYWQsICJTZW5kaW5nIHN0cmVhbSBzdGFydCBldmVudCBmYWlsZWQiKTsKKyAgICB9CisgICAgbWl4LT5zZW5kX3N0cmVhbV9zdGFydCA9IEZBTFNFOworICB9CisKKyAgaWYgKGdzdF9wYWRfY2hlY2tfcmVjb25maWd1cmUgKG1peC0+c3JjcGFkKSkKKyAgICBnc3RfdmlkZW9taXhlcjJfdXBkYXRlX3NyY19jYXBzIChtaXgpOworCisgIGlmIChtaXgtPnNlbmRfY2FwcykgeworICAgIGlmICghZ3N0X3BhZF9wdXNoX2V2ZW50IChtaXgtPnNyY3BhZCwKKyAgICAgICAgICAgIGdzdF9ldmVudF9uZXdfY2FwcyAobWl4LT5jdXJyZW50X2NhcHMpKSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChtaXgtPnNyY3BhZCwgIlNlbmRpbmcgY2FwcyBldmVudCBmYWlsZWQiKTsKKyAgICB9CisgICAgbWl4LT5zZW5kX2NhcHMgPSBGQUxTRTsKKyAgfQorCisgIEdTVF9WSURFT19NSVhFUjJfTE9DSyAobWl4KTsKKworICBpZiAobWl4LT5uZXdzZWdfcGVuZGluZykgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1peCwgIlNlbmRpbmcgTkVXU0VHTUVOVCBldmVudCIpOworICAgIEdTVF9WSURFT19NSVhFUjJfVU5MT0NLIChtaXgpOworICAgIGlmICghZ3N0X3BhZF9wdXNoX2V2ZW50IChtaXgtPnNyY3BhZCwKKyAgICAgICAgICAgIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJm1peC0+c2VnbWVudCkpKSB7CisgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgIGdvdG8gZG9uZV91bmxvY2tlZDsKKyAgICB9CisgICAgR1NUX1ZJREVPX01JWEVSMl9MT0NLIChtaXgpOworICAgIG1peC0+bmV3c2VnX3BlbmRpbmcgPSBGQUxTRTsKKyAgfQorCisgIGlmIChtaXgtPnNlZ21lbnQucG9zaXRpb24gPT0gLTEpCisgICAgb3V0cHV0X3N0YXJ0X3RpbWUgPSBtaXgtPnNlZ21lbnQuc3RhcnQ7CisgIGVsc2UKKyAgICBvdXRwdXRfc3RhcnRfdGltZSA9IG1peC0+c2VnbWVudC5wb3NpdGlvbjsKKworICBvdXRwdXRfZW5kX3RpbWUgPQorICAgICAgbWl4LT50c19vZmZzZXQgKyBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKG1peC0+bmZyYW1lcyArIDEsCisgICAgICBHU1RfU0VDT05EICogR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZtaXgtPmluZm8pLAorICAgICAgR1NUX1ZJREVPX0lORk9fRlBTX04gKCZtaXgtPmluZm8pKSArIG1peC0+c2VnbWVudC5zdGFydDsKKworICBpZiAob3V0cHV0X2VuZF90aW1lID49IG1peC0+c2VnbWVudC5zdG9wKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAobWl4LCAiU2VnbWVudCBkb25lIik7CisgICAgaWYgKCEobWl4LT5zZWdtZW50LmZsYWdzICYgR1NUX1NFR01FTlRfRkxBR19TRUdNRU5UKSkgeworICAgICAgR1NUX1ZJREVPX01JWEVSMl9VTkxPQ0sgKG1peCk7CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKG1peC0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VPUzsKKyAgICAgIGdvdG8gZG9uZV91bmxvY2tlZDsKKyAgICB9CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAobWl4LT5wZW5kaW5nX3RhZ3MpKSB7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChtaXgtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld190YWcgKG1peC0+cGVuZGluZ190YWdzKSk7CisgICAgbWl4LT5wZW5kaW5nX3RhZ3MgPSBOVUxMOworICB9CisKKyAgaWYgKG1peC0+c2VnbWVudC5zdG9wICE9IC0xKQorICAgIG91dHB1dF9lbmRfdGltZSA9IE1JTiAob3V0cHV0X2VuZF90aW1lLCBtaXgtPnNlZ21lbnQuc3RvcCk7CisKKyAgcmVzID0gZ3N0X3ZpZGVvbWl4ZXIyX2ZpbGxfcXVldWVzIChtaXgsIG91dHB1dF9zdGFydF90aW1lLCBvdXRwdXRfZW5kX3RpbWUpOworCisgIGlmIChyZXMgPT0gMCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1peCwgIk5lZWQgbW9yZSBkYXRhIGZvciBkZWNpc2lvbnMiKTsKKyAgICByZXQgPSBHU1RfRkxPV19PSzsKKyAgICBnb3RvIGRvbmU7CisgIH0gZWxzZSBpZiAocmVzID09IC0xKSB7CisgICAgR1NUX1ZJREVPX01JWEVSMl9VTkxPQ0sgKG1peCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAobWl4LCAiQWxsIHNpbmtwYWRzIGFyZSBFT1MgLS0gZm9yd2FyZGluZyIpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAobWl4LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FT1M7CisgICAgZ290byBkb25lX3VubG9ja2VkOworICB9IGVsc2UgaWYgKHJlcyA9PSAtMikgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKG1peCwgIkVycm9yIGNvbGxlY3RpbmcgYnVmZmVycyIpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGppdHRlciA9IGdzdF92aWRlb21peGVyMl9kb19xb3MgKG1peCwgb3V0cHV0X3N0YXJ0X3RpbWUpOworICBpZiAoaml0dGVyIDw9IDApIHsKKyAgICByZXQgPQorICAgICAgICBnc3RfdmlkZW9taXhlcjJfYmxlbmRfYnVmZmVycyAobWl4LCBvdXRwdXRfc3RhcnRfdGltZSwKKyAgICAgICAgb3V0cHV0X2VuZF90aW1lLCAmb3V0YnVmKTsKKyAgICBtaXgtPnFvc19wcm9jZXNzZWQrKzsKKyAgfSBlbHNlIHsKKyAgICBHc3RNZXNzYWdlICptc2c7CisKKyAgICBtaXgtPnFvc19kcm9wcGVkKys7CisKKyAgICAvKiBUT0RPOiBsaXZlICovCisgICAgbXNnID0KKyAgICAgICAgZ3N0X21lc3NhZ2VfbmV3X3FvcyAoR1NUX09CSkVDVF9DQVNUIChtaXgpLCBGQUxTRSwKKyAgICAgICAgZ3N0X3NlZ21lbnRfdG9fcnVubmluZ190aW1lICgmbWl4LT5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICBvdXRwdXRfc3RhcnRfdGltZSksIGdzdF9zZWdtZW50X3RvX3N0cmVhbV90aW1lICgmbWl4LT5zZWdtZW50LAorICAgICAgICAgICAgR1NUX0ZPUk1BVF9USU1FLCBvdXRwdXRfc3RhcnRfdGltZSksIG91dHB1dF9zdGFydF90aW1lLAorICAgICAgICBvdXRwdXRfZW5kX3RpbWUgLSBvdXRwdXRfc3RhcnRfdGltZSk7CisgICAgZ3N0X21lc3NhZ2Vfc2V0X3Fvc192YWx1ZXMgKG1zZywgaml0dGVyLCBtaXgtPnByb3BvcnRpb24sIDEwMDAwMDApOworICAgIGdzdF9tZXNzYWdlX3NldF9xb3Nfc3RhdHMgKG1zZywgR1NUX0ZPUk1BVF9CVUZGRVJTLCBtaXgtPnFvc19wcm9jZXNzZWQsCisgICAgICAgIG1peC0+cW9zX2Ryb3BwZWQpOworICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZSAoR1NUX0VMRU1FTlRfQ0FTVCAobWl4KSwgbXNnKTsKKworICAgIHJldCA9IEdTVF9GTE9XX09LOworICB9CisKKyAgbWl4LT5zZWdtZW50LnBvc2l0aW9uID0gb3V0cHV0X2VuZF90aW1lOworICBtaXgtPm5mcmFtZXMrKzsKKworICBHU1RfVklERU9fTUlYRVIyX1VOTE9DSyAobWl4KTsKKyAgaWYgKG91dGJ1ZikgeworICAgIEdTVF9MT0dfT0JKRUNUIChtaXgsCisgICAgICAgICJQdXNoaW5nIGJ1ZmZlciB3aXRoIHRzICUiIEdTVF9USU1FX0ZPUk1BVCAiIGFuZCBkdXJhdGlvbiAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWYpKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmKSkpOworICAgIHJldCA9IGdzdF9wYWRfcHVzaCAobWl4LT5zcmNwYWQsIG91dGJ1Zik7CisgIH0KKyAgZ290byBkb25lX3VubG9ja2VkOworCitkb25lOgorICBHU1RfVklERU9fTUlYRVIyX1VOTE9DSyAobWl4KTsKKworZG9uZV91bmxvY2tlZDoKKyAgcmV0dXJuIHJldDsKK30KKworLyogRklYTUUsIHRoZSBkdXJhdGlvbiBxdWVyeSBzaG91bGQgcmVmbGVjdCBob3cgbG9uZyB5b3Ugd2lsbCBwcm9kdWNlCisgKiBkYXRhLCB0aGF0IGlzIHRoZSBhbW91bnQgb2Ygc3RyZWFtIHRpbWUgdW50aWwgeW91IHdpbGwgZW1pdCBFT1MuCisgKgorICogRm9yIHN5bmNocm9uaXplZCBtaXhpbmcgdGhpcyBpcyBhbHdheXMgdGhlIG1heCBvZiBhbGwgdGhlIGR1cmF0aW9ucworICogb2YgdXBzdHJlYW0gc2luY2Ugd2UgZW1pdCBFT1Mgd2hlbiBhbGwgb2YgdGhlbSBmaW5pc2hlZC4KKyAqCisgKiBXZSBkb24ndCBkbyBzeW5jaHJvbml6ZWQgbWl4aW5nIHNvIHRoaXMgcmVhbGx5IGRlcGVuZHMgb24gd2hlcmUgdGhlCisgKiBzdHJlYW1zIHdoZXJlIHB1bmNoZWQgaW4gYW5kIHdoYXQgdGhlaXIgcmVsYXRpdmUgb2Zmc2V0cyBhcmUgYWdhaW5zdAorICogZWFjaG90aGVyIHdoaWNoIHdlIGNhbiBnZXQgZnJvbSB0aGUgZmlyc3QgdGltZXN0YW1wcyB3ZSBzZWUuCisgKgorICogV2hlbiB3ZSBhZGQgYSBuZXcgc3RyZWFtIChvciByZW1vdmUgYSBzdHJlYW0pIHRoZSBkdXJhdGlvbiBtaWdodAorICogYWxzbyBiZWNvbWUgaW52YWxpZCBhZ2FpbiBhbmQgd2UgbmVlZCB0byBwb3N0IGEgbmV3IERVUkFUSU9OCisgKiBtZXNzYWdlIHRvIG5vdGlmeSB0aGlzIGZhY3QgdG8gdGhlIHBhcmVudC4KKyAqIEZvciBub3cgd2UgdGFrZSB0aGUgbWF4IG9mIGFsbCB0aGUgdXBzdHJlYW0gZWxlbWVudHMgc28gdGhlIHNpbXBsZQorICogY2FzZXMgd29yayBhdCBsZWFzdCBzb21ld2hhdC4KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9taXhlcjJfcXVlcnlfZHVyYXRpb24gKEdzdFZpZGVvTWl4ZXIyICogbWl4LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHVmFsdWUgaXRlbSA9IHsgMCB9OworICBnaW50NjQgbWF4OworICBnYm9vbGVhbiByZXM7CisgIEdzdEZvcm1hdCBmb3JtYXQ7CisgIEdzdEl0ZXJhdG9yICppdDsKKyAgZ2Jvb2xlYW4gZG9uZTsKKworICAvKiBwYXJzZSBmb3JtYXQgKi8KKyAgZ3N0X3F1ZXJ5X3BhcnNlX2R1cmF0aW9uIChxdWVyeSwgJmZvcm1hdCwgTlVMTCk7CisKKyAgbWF4ID0gLTE7CisgIHJlcyA9IFRSVUU7CisgIGRvbmUgPSBGQUxTRTsKKworICAvKiBUYWtlIG1heGltdW0gb2YgYWxsIGR1cmF0aW9ucyAqLworICBpdCA9IGdzdF9lbGVtZW50X2l0ZXJhdGVfc2lua19wYWRzIChHU1RfRUxFTUVOVF9DQVNUIChtaXgpKTsKKyAgd2hpbGUgKCFkb25lKSB7CisgICAgc3dpdGNoIChnc3RfaXRlcmF0b3JfbmV4dCAoaXQsICZpdGVtKSkgeworICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfRE9ORToKKyAgICAgICAgZG9uZSA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfSVRFUkFUT1JfT0s6CisgICAgICB7CisgICAgICAgIEdzdFBhZCAqcGFkOworICAgICAgICBnaW50NjQgZHVyYXRpb247CisKKyAgICAgICAgcGFkID0gZ192YWx1ZV9nZXRfb2JqZWN0ICgmaXRlbSk7CisKKyAgICAgICAgLyogYXNrIHNpbmsgcGVlciBmb3IgZHVyYXRpb24gKi8KKyAgICAgICAgcmVzICY9IGdzdF9wYWRfcGVlcl9xdWVyeV9kdXJhdGlvbiAocGFkLCBmb3JtYXQsICZkdXJhdGlvbik7CisgICAgICAgIC8qIHRha2UgbWF4IGZyb20gYWxsIHZhbGlkIHJldHVybiB2YWx1ZXMgKi8KKyAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgIC8qIHZhbGlkIHVua25vd24gbGVuZ3RoLCBzdG9wIHNlYXJjaGluZyAqLworICAgICAgICAgIGlmIChkdXJhdGlvbiA9PSAtMSkgeworICAgICAgICAgICAgbWF4ID0gZHVyYXRpb247CisgICAgICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogZWxzZSBzZWUgaWYgYmlnZ2VyIHRoYW4gY3VycmVudCBtYXggKi8KKyAgICAgICAgICBlbHNlIGlmIChkdXJhdGlvbiA+IG1heCkKKyAgICAgICAgICAgIG1heCA9IGR1cmF0aW9uOworICAgICAgICB9CisgICAgICAgIGdfdmFsdWVfcmVzZXQgKCZpdGVtKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEdTVF9JVEVSQVRPUl9SRVNZTkM6CisgICAgICAgIG1heCA9IC0xOworICAgICAgICByZXMgPSBUUlVFOworICAgICAgICBnc3RfaXRlcmF0b3JfcmVzeW5jIChpdCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgIGRvbmUgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZ192YWx1ZV91bnNldCAoJml0ZW0pOworICBnc3RfaXRlcmF0b3JfZnJlZSAoaXQpOworCisgIGlmIChyZXMpIHsKKyAgICAvKiBhbmQgc3RvcmUgdGhlIG1heCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG1peCwgIlRvdGFsIGR1cmF0aW9uIGluIGZvcm1hdCAlczogJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFULCBnc3RfZm9ybWF0X2dldF9uYW1lIChmb3JtYXQpLCBHU1RfVElNRV9BUkdTIChtYXgpKTsKKyAgICBnc3RfcXVlcnlfc2V0X2R1cmF0aW9uIChxdWVyeSwgZm9ybWF0LCBtYXgpOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9taXhlcjJfc3JjX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0VmlkZW9NaXhlcjIgKm1peCA9IEdTVF9WSURFT19NSVhFUjIgKHBhcmVudCk7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX1BPU0lUSU9OOgorICAgIHsKKyAgICAgIEdzdEZvcm1hdCBmb3JtYXQ7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9wb3NpdGlvbiAocXVlcnksICZmb3JtYXQsIE5VTEwpOworCisgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfVElNRToKKyAgICAgICAgICBnc3RfcXVlcnlfc2V0X3Bvc2l0aW9uIChxdWVyeSwgZm9ybWF0LAorICAgICAgICAgICAgICBnc3Rfc2VnbWVudF90b19zdHJlYW1fdGltZSAoJm1peC0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgICAgICAgICAgbWl4LT5zZWdtZW50LnBvc2l0aW9uKSk7CisgICAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9EVVJBVElPTjoKKyAgICAgIHJlcyA9IGdzdF92aWRlb21peGVyMl9xdWVyeV9kdXJhdGlvbiAobWl4LCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9RVUVSWV9DQVBTOgorICAgICAgcmVzID0gZ3N0X3BhZF9xdWVyeV9kZWZhdWx0IChwYWQsIHBhcmVudCwgcXVlcnkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIEZJWE1FLCBuZWVkcyBhIGN1c3RvbSBxdWVyeSBoYW5kbGVyIGJlY2F1c2Ugd2UgaGF2ZSBtdWx0aXBsZQorICAgICAgICogc2lua3BhZHMgKi8KKyAgICAgIHJlcyA9IEZBTFNFOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9taXhlcjJfc3JjX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0VmlkZW9NaXhlcjIgKm1peCA9IEdTVF9WSURFT19NSVhFUjIgKHBhcmVudCk7CisgIGdib29sZWFuIHJlc3VsdDsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9RT1M6CisgICAgeworICAgICAgR3N0UU9TVHlwZSB0eXBlOworICAgICAgR3N0Q2xvY2tUaW1lRGlmZiBkaWZmOworICAgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKyAgICAgIGdkb3VibGUgcHJvcG9ydGlvbjsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3FvcyAoZXZlbnQsICZ0eXBlLCAmcHJvcG9ydGlvbiwgJmRpZmYsICZ0aW1lc3RhbXApOworCisgICAgICBnc3RfdmlkZW9taXhlcjJfdXBkYXRlX3FvcyAobWl4LCBwcm9wb3J0aW9uLCBkaWZmLCB0aW1lc3RhbXApOworCisgICAgICByZXN1bHQgPSBnc3RfdmlkZW9taXhlcjJfcHVzaF9zaW5rX2V2ZW50IChtaXgsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9TRUVLOgorICAgIHsKKyAgICAgIGdkb3VibGUgcmF0ZTsKKyAgICAgIEdzdEZvcm1hdCBmbXQ7CisgICAgICBHc3RTZWVrRmxhZ3MgZmxhZ3M7CisgICAgICBHc3RTZWVrVHlwZSBzdGFydF90eXBlLCBzdG9wX3R5cGU7CisgICAgICBnaW50NjQgc3RhcnQsIHN0b3A7CisgICAgICBHU0xpc3QgKmw7CisgICAgICBnZG91YmxlIGFic19yYXRlOworCisgICAgICAvKiBwYXJzZSB0aGUgc2VlayBwYXJhbWV0ZXJzICovCisgICAgICBnc3RfZXZlbnRfcGFyc2Vfc2VlayAoZXZlbnQsICZyYXRlLCAmZm10LCAmZmxhZ3MsICZzdGFydF90eXBlLAorICAgICAgICAgICZzdGFydCwgJnN0b3BfdHlwZSwgJnN0b3ApOworCisgICAgICBpZiAocmF0ZSA8PSAwLjApIHsKKyAgICAgICAgR1NUX0VSUk9SX09CSkVDVCAobWl4LCAiTmVnYXRpdmUgcmF0ZXMgbm90IHN1cHBvcnRlZCB5ZXQiKTsKKyAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAobWl4LCAiSGFuZGxpbmcgU0VFSyBldmVudCIpOworCisgICAgICBhYnNfcmF0ZSA9IEFCUyAocmF0ZSk7CisKKyAgICAgIEdTVF9WSURFT19NSVhFUjJfTE9DSyAobWl4KTsKKyAgICAgIGZvciAobCA9IG1peC0+c2lua3BhZHM7IGw7IGwgPSBsLT5uZXh0KSB7CisgICAgICAgIEdzdFZpZGVvTWl4ZXIyUGFkICpwID0gbC0+ZGF0YTsKKworICAgICAgICBpZiAoZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0ZMVVNIKSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmcC0+bWl4Y29sLT5idWZmZXIsIE5VTEwpOworICAgICAgICAgIHAtPm1peGNvbC0+c3RhcnRfdGltZSA9IHAtPm1peGNvbC0+ZW5kX3RpbWUgPSAtMTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbnZlcnQgdG8gdGhlIG91dHB1dCBzZWdtZW50IHJhdGUgKi8KKyAgICAgICAgaWYgKEFCUyAobWl4LT5zZWdtZW50LnJhdGUpICE9IGFic19yYXRlKSB7CisgICAgICAgICAgaWYgKEFCUyAobWl4LT5zZWdtZW50LnJhdGUpICE9IDEuMCAmJiBwLT5taXhjb2wtPmJ1ZmZlcikgeworICAgICAgICAgICAgcC0+bWl4Y29sLT5zdGFydF90aW1lIC89IEFCUyAobWl4LT5zZWdtZW50LnJhdGUpOworICAgICAgICAgICAgcC0+bWl4Y29sLT5lbmRfdGltZSAvPSBBQlMgKG1peC0+c2VnbWVudC5yYXRlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGFic19yYXRlICE9IDEuMCAmJiBwLT5taXhjb2wtPmJ1ZmZlcikgeworICAgICAgICAgICAgcC0+bWl4Y29sLT5zdGFydF90aW1lICo9IGFic19yYXRlOworICAgICAgICAgICAgcC0+bWl4Y29sLT5lbmRfdGltZSAqPSBhYnNfcmF0ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEdTVF9WSURFT19NSVhFUjJfVU5MT0NLIChtaXgpOworCisgICAgICBnc3Rfc2VnbWVudF9kb19zZWVrICgmbWl4LT5zZWdtZW50LCByYXRlLCBmbXQsIGZsYWdzLCBzdGFydF90eXBlLCBzdGFydCwKKyAgICAgICAgICBzdG9wX3R5cGUsIHN0b3AsIE5VTEwpOworICAgICAgbWl4LT5zZWdtZW50LnBvc2l0aW9uID0gLTE7CisgICAgICBtaXgtPnRzX29mZnNldCA9IDA7CisgICAgICBtaXgtPm5mcmFtZXMgPSAwOworICAgICAgbWl4LT5uZXdzZWdfcGVuZGluZyA9IFRSVUU7CisKKyAgICAgIGdzdF92aWRlb21peGVyMl9yZXNldF9xb3MgKG1peCk7CisKKyAgICAgIHJlc3VsdCA9IGdzdF9jb2xsZWN0X3BhZHNfc3JjX2V2ZW50X2RlZmF1bHQgKG1peC0+Y29sbGVjdCwgcGFkLCBldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfTkFWSUdBVElPTjoKKyAgICAgIC8qIG5hdmlnYXRpb24gaXMgcmF0aGVyIHBvaW50bGVzcy4gKi8KKyAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyoganVzdCBmb3J3YXJkIHRoZSByZXN0IGZvciBub3cgKi8KKyAgICAgIHJlc3VsdCA9IGdzdF92aWRlb21peGVyMl9wdXNoX3NpbmtfZXZlbnQgKG1peCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92aWRlb21peGVyMl9zcmNfc2V0Y2FwcyAoR3N0UGFkICogcGFkLCBHc3RWaWRlb01peGVyMiAqIG1peCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworICBHc3RWaWRlb0luZm8gaW5mbzsKKworICBHU1RfSU5GT19PQkpFQ1QgKHBhZCwgInNldCBzcmMgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIGlmICghZ3N0X3ZpZGVvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgY2FwcykpCisgICAgZ290byBkb25lOworCisgIEdTVF9WSURFT19NSVhFUjJfTE9DSyAobWl4KTsKKworICBtaXgtPmJsZW5kID0gTlVMTDsKKyAgbWl4LT5vdmVybGF5ID0gTlVMTDsKKyAgbWl4LT5maWxsX2NoZWNrZXIgPSBOVUxMOworICBtaXgtPmZpbGxfY29sb3IgPSBOVUxMOworCisgIGlmIChHU1RfVklERU9fSU5GT19GUFNfTiAoJm1peC0+aW5mbykgIT0gR1NUX1ZJREVPX0lORk9fRlBTX04gKCZpbmZvKSB8fAorICAgICAgR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZtaXgtPmluZm8pICE9IEdTVF9WSURFT19JTkZPX0ZQU19EICgmaW5mbykpIHsKKyAgICBpZiAobWl4LT5zZWdtZW50LnBvc2l0aW9uICE9IC0xKSB7CisgICAgICBtaXgtPnRzX29mZnNldCA9IG1peC0+c2VnbWVudC5wb3NpdGlvbiAtIG1peC0+c2VnbWVudC5zdGFydDsKKyAgICAgIG1peC0+bmZyYW1lcyA9IDA7CisgICAgfQorICAgIGdzdF92aWRlb21peGVyMl9yZXNldF9xb3MgKG1peCk7CisgIH0KKworICBtaXgtPmluZm8gPSBpbmZvOworCisgIHN3aXRjaCAoR1NUX1ZJREVPX0lORk9fRk9STUFUICgmbWl4LT5pbmZvKSkgeworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BWVVWOgorICAgICAgbWl4LT5ibGVuZCA9IGdzdF92aWRlb19taXhlcl9ibGVuZF9heXV2OworICAgICAgbWl4LT5vdmVybGF5ID0gZ3N0X3ZpZGVvX21peGVyX292ZXJsYXlfYXl1djsKKyAgICAgIG1peC0+ZmlsbF9jaGVja2VyID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9heXV2OworICAgICAgbWl4LT5maWxsX2NvbG9yID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYXl1djsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQVJHQjoKKyAgICAgIG1peC0+YmxlbmQgPSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfYXJnYjsKKyAgICAgIG1peC0+b3ZlcmxheSA9IGdzdF92aWRlb19taXhlcl9vdmVybGF5X2FyZ2I7CisgICAgICBtaXgtPmZpbGxfY2hlY2tlciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfYXJnYjsKKyAgICAgIG1peC0+ZmlsbF9jb2xvciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2FyZ2I7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUkE6CisgICAgICBtaXgtPmJsZW5kID0gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX2JncmE7CisgICAgICBtaXgtPm92ZXJsYXkgPSBnc3RfdmlkZW9fbWl4ZXJfb3ZlcmxheV9iZ3JhOworICAgICAgbWl4LT5maWxsX2NoZWNrZXIgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX2JncmE7CisgICAgICBtaXgtPmZpbGxfY29sb3IgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl9iZ3JhOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9BQkdSOgorICAgICAgbWl4LT5ibGVuZCA9IGdzdF92aWRlb19taXhlcl9ibGVuZF9hYmdyOworICAgICAgbWl4LT5vdmVybGF5ID0gZ3N0X3ZpZGVvX21peGVyX292ZXJsYXlfYWJncjsKKyAgICAgIG1peC0+ZmlsbF9jaGVja2VyID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9hYmdyOworICAgICAgbWl4LT5maWxsX2NvbG9yID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYWJncjsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCQToKKyAgICAgIG1peC0+YmxlbmQgPSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfcmdiYTsKKyAgICAgIG1peC0+b3ZlcmxheSA9IGdzdF92aWRlb19taXhlcl9vdmVybGF5X3JnYmE7CisgICAgICBtaXgtPmZpbGxfY2hlY2tlciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfcmdiYTsKKyAgICAgIG1peC0+ZmlsbF9jb2xvciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX3JnYmE7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0NDQ6CisgICAgICBtaXgtPmJsZW5kID0gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3k0NDQ7CisgICAgICBtaXgtPm92ZXJsYXkgPSBtaXgtPmJsZW5kOworICAgICAgbWl4LT5maWxsX2NoZWNrZXIgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3k0NDQ7CisgICAgICBtaXgtPmZpbGxfY29sb3IgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl95NDQ0OworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgICAgbWl4LT5ibGVuZCA9IGdzdF92aWRlb19taXhlcl9ibGVuZF95NDJiOworICAgICAgbWl4LT5vdmVybGF5ID0gbWl4LT5ibGVuZDsKKyAgICAgIG1peC0+ZmlsbF9jaGVja2VyID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl95NDJiOworICAgICAgbWl4LT5maWxsX2NvbG9yID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeTQyYjsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVVZMjoKKyAgICAgIG1peC0+YmxlbmQgPSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfeXV5MjsKKyAgICAgIG1peC0+b3ZlcmxheSA9IG1peC0+YmxlbmQ7CisgICAgICBtaXgtPmZpbGxfY2hlY2tlciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfeXV5MjsKKyAgICAgIG1peC0+ZmlsbF9jb2xvciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX3l1eTI7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICBtaXgtPmJsZW5kID0gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3V5dnk7CisgICAgICBtaXgtPm92ZXJsYXkgPSBtaXgtPmJsZW5kOworICAgICAgbWl4LT5maWxsX2NoZWNrZXIgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3V5dnk7CisgICAgICBtaXgtPmZpbGxfY29sb3IgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl91eXZ5OworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVllVOgorICAgICAgbWl4LT5ibGVuZCA9IGdzdF92aWRlb19taXhlcl9ibGVuZF95dnl1OworICAgICAgbWl4LT5vdmVybGF5ID0gbWl4LT5ibGVuZDsKKyAgICAgIG1peC0+ZmlsbF9jaGVja2VyID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl95dnl1OworICAgICAgbWl4LT5maWxsX2NvbG9yID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeXZ5dTsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfSTQyMDoKKyAgICAgIG1peC0+YmxlbmQgPSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfaTQyMDsKKyAgICAgIG1peC0+b3ZlcmxheSA9IG1peC0+YmxlbmQ7CisgICAgICBtaXgtPmZpbGxfY2hlY2tlciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfaTQyMDsKKyAgICAgIG1peC0+ZmlsbF9jb2xvciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX2k0MjA7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1lWMTI6CisgICAgICBtaXgtPmJsZW5kID0gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3l2MTI7CisgICAgICBtaXgtPm92ZXJsYXkgPSBtaXgtPmJsZW5kOworICAgICAgbWl4LT5maWxsX2NoZWNrZXIgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3l2MTI7CisgICAgICBtaXgtPmZpbGxfY29sb3IgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl95djEyOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9OVjEyOgorICAgICAgbWl4LT5ibGVuZCA9IGdzdF92aWRlb19taXhlcl9ibGVuZF9udjEyOworICAgICAgbWl4LT5vdmVybGF5ID0gbWl4LT5ibGVuZDsKKyAgICAgIG1peC0+ZmlsbF9jaGVja2VyID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9udjEyOworICAgICAgbWl4LT5maWxsX2NvbG9yID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfbnYxMjsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfTlYyMToKKyAgICAgIG1peC0+YmxlbmQgPSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfbnYyMTsKKyAgICAgIG1peC0+b3ZlcmxheSA9IG1peC0+YmxlbmQ7CisgICAgICBtaXgtPmZpbGxfY2hlY2tlciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfbnYyMTsKKyAgICAgIG1peC0+ZmlsbF9jb2xvciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX252MjE7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0MUI6CisgICAgICBtaXgtPmJsZW5kID0gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3k0MWI7CisgICAgICBtaXgtPm92ZXJsYXkgPSBtaXgtPmJsZW5kOworICAgICAgbWl4LT5maWxsX2NoZWNrZXIgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3k0MWI7CisgICAgICBtaXgtPmZpbGxfY29sb3IgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl95NDFiOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0I6CisgICAgICBtaXgtPmJsZW5kID0gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3JnYjsKKyAgICAgIG1peC0+b3ZlcmxheSA9IG1peC0+YmxlbmQ7CisgICAgICBtaXgtPmZpbGxfY2hlY2tlciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfcmdiOworICAgICAgbWl4LT5maWxsX2NvbG9yID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfcmdiOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1I6CisgICAgICBtaXgtPmJsZW5kID0gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX2JncjsKKyAgICAgIG1peC0+b3ZlcmxheSA9IG1peC0+YmxlbmQ7CisgICAgICBtaXgtPmZpbGxfY2hlY2tlciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfYmdyOworICAgICAgbWl4LT5maWxsX2NvbG9yID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYmdyOworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94UkdCOgorICAgICAgbWl4LT5ibGVuZCA9IGdzdF92aWRlb19taXhlcl9ibGVuZF94cmdiOworICAgICAgbWl4LT5vdmVybGF5ID0gbWl4LT5ibGVuZDsKKyAgICAgIG1peC0+ZmlsbF9jaGVja2VyID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl94cmdiOworICAgICAgbWl4LT5maWxsX2NvbG9yID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfeHJnYjsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfeEJHUjoKKyAgICAgIG1peC0+YmxlbmQgPSBnc3RfdmlkZW9fbWl4ZXJfYmxlbmRfeGJncjsKKyAgICAgIG1peC0+b3ZlcmxheSA9IG1peC0+YmxlbmQ7CisgICAgICBtaXgtPmZpbGxfY2hlY2tlciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NoZWNrZXJfeGJncjsKKyAgICAgIG1peC0+ZmlsbF9jb2xvciA9IGdzdF92aWRlb19taXhlcl9maWxsX2NvbG9yX3hiZ3I7CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1JHQng6CisgICAgICBtaXgtPmJsZW5kID0gZ3N0X3ZpZGVvX21peGVyX2JsZW5kX3JnYng7CisgICAgICBtaXgtPm92ZXJsYXkgPSBtaXgtPmJsZW5kOworICAgICAgbWl4LT5maWxsX2NoZWNrZXIgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jaGVja2VyX3JnYng7CisgICAgICBtaXgtPmZpbGxfY29sb3IgPSBnc3RfdmlkZW9fbWl4ZXJfZmlsbF9jb2xvcl9yZ2J4OworICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1J4OgorICAgICAgbWl4LT5ibGVuZCA9IGdzdF92aWRlb19taXhlcl9ibGVuZF9iZ3J4OworICAgICAgbWl4LT5vdmVybGF5ID0gbWl4LT5ibGVuZDsKKyAgICAgIG1peC0+ZmlsbF9jaGVja2VyID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY2hlY2tlcl9iZ3J4OworICAgICAgbWl4LT5maWxsX2NvbG9yID0gZ3N0X3ZpZGVvX21peGVyX2ZpbGxfY29sb3JfYmdyeDsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgR1NUX1ZJREVPX01JWEVSMl9VTkxPQ0sgKG1peCk7CisKKyAgaWYgKG1peC0+Y3VycmVudF9jYXBzID09IE5VTEwgfHwKKyAgICAgIGdzdF9jYXBzX2lzX2VxdWFsIChjYXBzLCBtaXgtPmN1cnJlbnRfY2FwcykgPT0gRkFMU0UpIHsKKyAgICBnc3RfY2Fwc19yZXBsYWNlICgmbWl4LT5jdXJyZW50X2NhcHMsIGNhcHMpOworICAgIG1peC0+c2VuZF9jYXBzID0gVFJVRTsKKyAgfQorCitkb25lOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3ZpZGVvbWl4ZXIyX3NpbmtfY2xpcCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLAorICAgIEdzdENvbGxlY3REYXRhICogZGF0YSwgR3N0QnVmZmVyICogYnVmLCBHc3RCdWZmZXIgKiogb3V0YnVmLAorICAgIEdzdFZpZGVvTWl4ZXIyICogbWl4KQoreworICBHc3RWaWRlb01peGVyMlBhZCAqcGFkID0gR1NUX1ZJREVPX01JWEVSMl9QQUQgKGRhdGEtPnBhZCk7CisgIEdzdFZpZGVvTWl4ZXIyQ29sbGVjdCAqbWl4Y29sID0gcGFkLT5taXhjb2w7CisgIEdzdENsb2NrVGltZSBzdGFydF90aW1lLCBlbmRfdGltZTsKKworICBzdGFydF90aW1lID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1Zik7CisgIGlmIChzdGFydF90aW1lID09IC0xKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocGFkLCAiVGltZXN0YW1wZWQgYnVmZmVycyByZXF1aXJlZCEiKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIGVuZF90aW1lID0gR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKTsKKyAgaWYgKGVuZF90aW1lID09IC0xICYmIEdTVF9WSURFT19JTkZPX0ZQU19OICgmcGFkLT5pbmZvKSAhPSAwKQorICAgIGVuZF90aW1lID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludF9yb3VuZCAoR1NUX1NFQ09ORCwKKyAgICAgICAgR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZwYWQtPmluZm8pLCBHU1RfVklERU9fSU5GT19GUFNfTiAoJnBhZC0+aW5mbykpOworICBpZiAoZW5kX3RpbWUgPT0gLTEpIHsKKyAgICAqb3V0YnVmID0gYnVmOworICAgIHJldHVybiBHU1RfRkxPV19PSzsKKyAgfQorCisgIHN0YXJ0X3RpbWUgPSBNQVggKHN0YXJ0X3RpbWUsIG1peGNvbC0+Y29sbGVjdC5zZWdtZW50LnN0YXJ0KTsKKyAgc3RhcnRfdGltZSA9CisgICAgICBnc3Rfc2VnbWVudF90b19ydW5uaW5nX3RpbWUgKCZtaXhjb2wtPmNvbGxlY3Quc2VnbWVudCwKKyAgICAgIEdTVF9GT1JNQVRfVElNRSwgc3RhcnRfdGltZSk7CisKKyAgZW5kX3RpbWUgKz0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1Zik7CisgIGlmIChtaXhjb2wtPmNvbGxlY3Quc2VnbWVudC5zdG9wICE9IC0xKQorICAgIGVuZF90aW1lID0gTUlOIChlbmRfdGltZSwgbWl4Y29sLT5jb2xsZWN0LnNlZ21lbnQuc3RvcCk7CisgIGVuZF90aW1lID0KKyAgICAgIGdzdF9zZWdtZW50X3RvX3J1bm5pbmdfdGltZSAoJm1peGNvbC0+Y29sbGVjdC5zZWdtZW50LAorICAgICAgR1NUX0ZPUk1BVF9USU1FLCBlbmRfdGltZSk7CisKKyAgLyogQ29udmVydCB0byB0aGUgb3V0cHV0IHNlZ21lbnQgcmF0ZSAqLworICBpZiAoQUJTIChtaXgtPnNlZ21lbnQucmF0ZSkgIT0gMS4wKSB7CisgICAgc3RhcnRfdGltZSAqPSBBQlMgKG1peC0+c2VnbWVudC5yYXRlKTsKKyAgICBlbmRfdGltZSAqPSBBQlMgKG1peC0+c2VnbWVudC5yYXRlKTsKKyAgfQorCisgIGlmIChtaXhjb2wtPmJ1ZmZlciAhPSBOVUxMICYmIGVuZF90aW1lIDwgbWl4Y29sLT5lbmRfdGltZSkgeworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgKm91dGJ1ZiA9IE5VTEw7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CisKKyAgKm91dGJ1ZiA9IGJ1ZjsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvbWl4ZXIyX2ZsdXNoIChHc3RDb2xsZWN0UGFkcyAqIHBhZHMsIEdzdFZpZGVvTWl4ZXIyICogbWl4KQoreworICBpZiAobWl4LT5wZW5kaW5nX3RhZ3MpIHsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKG1peC0+cGVuZGluZ190YWdzKTsKKyAgICBtaXgtPnBlbmRpbmdfdGFncyA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9taXhlcjJfc2lua19ldmVudCAoR3N0Q29sbGVjdFBhZHMgKiBwYWRzLCBHc3RDb2xsZWN0RGF0YSAqIGNkYXRhLAorICAgIEdzdEV2ZW50ICogZXZlbnQsIEdzdFZpZGVvTWl4ZXIyICogbWl4KQoreworICBHc3RWaWRlb01peGVyMlBhZCAqcGFkID0gR1NUX1ZJREVPX01JWEVSMl9QQUQgKGNkYXRhLT5wYWQpOworICBnYm9vbGVhbiByZXQgPSBUUlVFLCBkaXNjYXJkID0gRkFMU0U7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiR290ICVzIGV2ZW50OiAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSwgZXZlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICByZXQgPQorICAgICAgICAgIGdzdF92aWRlb21peGVyMl9wYWRfc2lua19zZXRjYXBzIChHU1RfUEFEIChwYWQpLCBHU1RfT0JKRUNUIChtaXgpLAorICAgICAgICAgIGNhcHMpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBldmVudCA9IE5VTEw7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDp7CisgICAgICBHc3RTZWdtZW50IHNlZzsKKyAgICAgIGdzdF9ldmVudF9jb3B5X3NlZ21lbnQgKGV2ZW50LCAmc2VnKTsKKworICAgICAgZ19hc3NlcnQgKHNlZy5mb3JtYXQgPT0gR1NUX0ZPUk1BVF9USU1FKTsKKyAgICAgIGdzdF92aWRlb21peGVyMl9yZXNldF9xb3MgKG1peCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIG1peC0+bmV3c2VnX3BlbmRpbmcgPSBUUlVFOworCisgICAgICBnc3RfdmlkZW9taXhlcjJfcmVzZXRfcW9zIChtaXgpOworICAgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmcGFkLT5taXhjb2wtPmJ1ZmZlciwgTlVMTCk7CisgICAgICBwYWQtPm1peGNvbC0+c3RhcnRfdGltZSA9IC0xOworICAgICAgcGFkLT5taXhjb2wtPmVuZF90aW1lID0gLTE7CisKKyAgICAgIG1peC0+c2VnbWVudC5wb3NpdGlvbiA9IC0xOworICAgICAgbWl4LT50c19vZmZzZXQgPSAwOworICAgICAgbWl4LT5uZnJhbWVzID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX1RBRzoKKyAgICB7CisgICAgICAvKiBjb2xsZWN0IHRhZ3MgaGVyZSBzbyB3ZSBjYW4gcHVzaCB0aGVtIG91dCB3aGVuIHdlIGNvbGxlY3QgZGF0YSAqLworICAgICAgR3N0VGFnTGlzdCAqdGFnczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAoZXZlbnQsICZ0YWdzKTsKKyAgICAgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbWVyZ2UgKG1peC0+cGVuZGluZ190YWdzLCB0YWdzLCBHU1RfVEFHX01FUkdFX0FQUEVORCk7CisgICAgICBpZiAobWl4LT5wZW5kaW5nX3RhZ3MpCisgICAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAobWl4LT5wZW5kaW5nX3RhZ3MpOworICAgICAgbWl4LT5wZW5kaW5nX3RhZ3MgPSB0YWdzOworICAgICAgZXZlbnQgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChldmVudCAhPSBOVUxMKQorICAgIHJldHVybiBnc3RfY29sbGVjdF9wYWRzX2V2ZW50X2RlZmF1bHQgKHBhZHMsIGNkYXRhLCBldmVudCwgZGlzY2FyZCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitmb3J3YXJkX2V2ZW50X2Z1bmMgKEdWYWx1ZSAqIGl0ZW0sIEdWYWx1ZSAqIHJldCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0UGFkICpwYWQgPSBnX3ZhbHVlX2dldF9vYmplY3QgKGl0ZW0pOworICBnc3RfZXZlbnRfcmVmIChldmVudCk7CisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICJBYm91dCB0byBzZW5kIGV2ZW50ICVzIiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKyAgaWYgKCFnc3RfcGFkX3B1c2hfZXZlbnQgKHBhZCwgZXZlbnQpKSB7CisgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAocmV0LCBGQUxTRSk7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYWQsICJTZW5kaW5nIGV2ZW50ICAlcCAoJXMpIGZhaWxlZC4iLAorICAgICAgICBldmVudCwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocGFkLCAiU2VudCBldmVudCAgJXAgKCVzKS4iLAorICAgICAgICBldmVudCwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdmlkZW9taXhlcjJfcHVzaF9zaW5rX2V2ZW50IChHc3RWaWRlb01peGVyMiAqIG1peCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0SXRlcmF0b3IgKml0OworICBHVmFsdWUgdnJldCA9IHsgMCB9OworCisgIEdTVF9MT0dfT0JKRUNUIChtaXgsICJGb3J3YXJkaW5nIGV2ZW50ICVwICglcykiLCBldmVudCwKKyAgICAgIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgZ192YWx1ZV9pbml0ICgmdnJldCwgR19UWVBFX0JPT0xFQU4pOworICBnX3ZhbHVlX3NldF9ib29sZWFuICgmdnJldCwgVFJVRSk7CisgIGl0ID0gZ3N0X2VsZW1lbnRfaXRlcmF0ZV9zaW5rX3BhZHMgKEdTVF9FTEVNRU5UX0NBU1QgKG1peCkpOworICBnc3RfaXRlcmF0b3JfZm9sZCAoaXQsIChHc3RJdGVyYXRvckZvbGRGdW5jdGlvbikgZm9yd2FyZF9ldmVudF9mdW5jLCAmdnJldCwKKyAgICAgIGV2ZW50KTsKKyAgZ3N0X2l0ZXJhdG9yX2ZyZWUgKGl0KTsKKyAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisKKyAgcmV0dXJuIGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKCZ2cmV0KTsKK30KKworLyogR3N0RWxlbWVudCB2bWV0aG9kcyAqLworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfdmlkZW9taXhlcjJfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0VmlkZW9NaXhlcjIgKm1peCA9IEdTVF9WSURFT19NSVhFUjIgKGVsZW1lbnQpOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIG1peC0+c2VuZF9zdHJlYW1fc3RhcnQgPSBUUlVFOworICAgICAgbWl4LT5zZW5kX2NhcHMgPSBUUlVFOworICAgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJm1peC0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgICAgIGdzdF9jYXBzX3JlcGxhY2UgKCZtaXgtPmN1cnJlbnRfY2FwcywgTlVMTCk7CisgICAgICBHU1RfTE9HX09CSkVDVCAobWl4LCAic3RhcnRpbmcgY29sbGVjdHBhZHMiKTsKKyAgICAgIGdzdF9jb2xsZWN0X3BhZHNfc3RhcnQgKG1peC0+Y29sbGVjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgR1NUX0xPR19PQkpFQ1QgKG1peCwgInN0b3BwaW5nIGNvbGxlY3RwYWRzIik7CisgICAgICBnc3RfY29sbGVjdF9wYWRzX3N0b3AgKG1peC0+Y29sbGVjdCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3ZpZGVvbWl4ZXIyX3Jlc2V0IChtaXgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdFBhZCAqCitnc3RfdmlkZW9taXhlcjJfcmVxdWVzdF9uZXdfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RQYWRUZW1wbGF0ZSAqIHRlbXBsLCBjb25zdCBnY2hhciAqIHJlcV9uYW1lLCBjb25zdCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0VmlkZW9NaXhlcjIgKm1peDsKKyAgR3N0VmlkZW9NaXhlcjJQYWQgKm1peHBhZDsKKyAgR3N0RWxlbWVudENsYXNzICprbGFzcyA9IEdTVF9FTEVNRU5UX0dFVF9DTEFTUyAoZWxlbWVudCk7CisKKyAgbWl4ID0gR1NUX1ZJREVPX01JWEVSMiAoZWxlbWVudCk7CisKKyAgaWYgKHRlbXBsID09IGdzdF9lbGVtZW50X2NsYXNzX2dldF9wYWRfdGVtcGxhdGUgKGtsYXNzLCAic2lua18ldSIpKSB7CisgICAgZ3VpbnQgc2VyaWFsID0gMDsKKyAgICBnY2hhciAqbmFtZSA9IE5VTEw7CisgICAgR3N0VmlkZW9NaXhlcjJDb2xsZWN0ICptaXhjb2wgPSBOVUxMOworCisgICAgR1NUX1ZJREVPX01JWEVSMl9MT0NLIChtaXgpOworICAgIGlmIChyZXFfbmFtZSA9PSBOVUxMIHx8IHN0cmxlbiAocmVxX25hbWUpIDwgNgorICAgICAgICB8fCAhZ19zdHJfaGFzX3ByZWZpeCAocmVxX25hbWUsICJzaW5rXyIpKSB7CisgICAgICAvKiBubyBuYW1lIGdpdmVuIHdoZW4gcmVxdWVzdGluZyB0aGUgcGFkLCB1c2UgbmV4dCBhdmFpbGFibGUgaW50ICovCisgICAgICBzZXJpYWwgPSBtaXgtPm5leHRfc2lua3BhZCsrOworICAgIH0gZWxzZSB7CisgICAgICAvKiBwYXJzZSBzZXJpYWwgbnVtYmVyIGZyb20gcmVxdWVzdGVkIHBhZG5hbWUgKi8KKyAgICAgIHNlcmlhbCA9IGdfYXNjaWlfc3RydG91bGwgKCZyZXFfbmFtZVs1XSwgTlVMTCwgMTApOworICAgICAgaWYgKHNlcmlhbCA+PSBtaXgtPm5leHRfc2lua3BhZCkKKyAgICAgICAgbWl4LT5uZXh0X3NpbmtwYWQgPSBzZXJpYWwgKyAxOworICAgIH0KKyAgICAvKiBjcmVhdGUgbmV3IHBhZCB3aXRoIHRoZSBuYW1lICovCisgICAgbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNpbmtfJXUiLCBzZXJpYWwpOworICAgIG1peHBhZCA9IGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfVklERU9fTUlYRVIyX1BBRCwgIm5hbWUiLCBuYW1lLCAiZGlyZWN0aW9uIiwKKyAgICAgICAgdGVtcGwtPmRpcmVjdGlvbiwgInRlbXBsYXRlIiwgdGVtcGwsIE5VTEwpOworICAgIGdfZnJlZSAobmFtZSk7CisKKyAgICBtaXhwYWQtPnpvcmRlciA9IG1peC0+bnVtcGFkczsKKyAgICBtaXhwYWQtPnhwb3MgPSBERUZBVUxUX1BBRF9YUE9TOworICAgIG1peHBhZC0+eXBvcyA9IERFRkFVTFRfUEFEX1lQT1M7CisgICAgbWl4cGFkLT5hbHBoYSA9IERFRkFVTFRfUEFEX0FMUEhBOworCisgICAgbWl4Y29sID0gKEdzdFZpZGVvTWl4ZXIyQ29sbGVjdCAqKQorICAgICAgICBnc3RfY29sbGVjdF9wYWRzX2FkZF9wYWQgKG1peC0+Y29sbGVjdCwgR1NUX1BBRCAobWl4cGFkKSwKKyAgICAgICAgc2l6ZW9mIChHc3RWaWRlb01peGVyMkNvbGxlY3QpLAorICAgICAgICAoR3N0Q29sbGVjdERhdGFEZXN0cm95Tm90aWZ5KSBnc3RfdmlkZW9taXhlcjJfY29sbGVjdF9mcmVlLCBUUlVFKTsKKworICAgIC8qIEtlZXAgdHJhY2sgb2YgZWFjaCBvdGhlciAqLworICAgIG1peGNvbC0+bWl4cGFkID0gbWl4cGFkOworICAgIG1peHBhZC0+bWl4Y29sID0gbWl4Y29sOworCisgICAgbWl4Y29sLT5zdGFydF90aW1lID0gLTE7CisgICAgbWl4Y29sLT5lbmRfdGltZSA9IC0xOworCisgICAgLyogS2VlcCBhbiBpbnRlcm5hbCBsaXN0IG9mIG1peHBhZHMgZm9yIHpvcmRlcmluZyAqLworICAgIG1peC0+c2lua3BhZHMgPSBnX3NsaXN0X2luc2VydF9zb3J0ZWQgKG1peC0+c2lua3BhZHMsIG1peHBhZCwKKyAgICAgICAgKEdDb21wYXJlRnVuYykgcGFkX3pvcmRlcl9jb21wYXJlKTsKKyAgICBtaXgtPm51bXBhZHMrKzsKKyAgICBHU1RfVklERU9fTUlYRVIyX1VOTE9DSyAobWl4KTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVsZW1lbnQsICJBZGRpbmcgcGFkICVzIiwgR1NUX1BBRF9OQU1FIChtaXhwYWQpKTsKKworICAvKiBhZGQgdGhlIHBhZCB0byB0aGUgZWxlbWVudCAqLworICBnc3RfZWxlbWVudF9hZGRfcGFkIChlbGVtZW50LCBHU1RfUEFEIChtaXhwYWQpKTsKKyAgZ3N0X2NoaWxkX3Byb3h5X2NoaWxkX2FkZGVkIChHU1RfQ0hJTERfUFJPWFkgKG1peCksIEdfT0JKRUNUIChtaXhwYWQpLAorICAgICAgR1NUX09CSkVDVF9OQU1FIChtaXhwYWQpKTsKKworICByZXR1cm4gR1NUX1BBRCAobWl4cGFkKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb21peGVyMl9yZWxlYXNlX3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIHBhZCkKK3sKKyAgR3N0VmlkZW9NaXhlcjIgKm1peCA9IE5VTEw7CisgIEdzdFZpZGVvTWl4ZXIyUGFkICptaXhwYWQ7CisgIGdib29sZWFuIHVwZGF0ZV9jYXBzOworCisgIG1peCA9IEdTVF9WSURFT19NSVhFUjIgKGVsZW1lbnQpOworCisgIEdTVF9WSURFT19NSVhFUjJfTE9DSyAobWl4KTsKKyAgaWYgKEdfVU5MSUtFTFkgKGdfc2xpc3RfZmluZCAobWl4LT5zaW5rcGFkcywgcGFkKSA9PSBOVUxMKSkgeworICAgIGdfd2FybmluZyAoIlVua25vd24gcGFkICVzIiwgR1NUX1BBRF9OQU1FIChwYWQpKTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgbWl4cGFkID0gR1NUX1ZJREVPX01JWEVSMl9QQUQgKHBhZCk7CisKKyAgaWYgKG1peHBhZC0+Y29udmVydCkKKyAgICBnc3RfdmlkZW9fY29udmVydGVyX2ZyZWUgKG1peHBhZC0+Y29udmVydCk7CisgIG1peHBhZC0+Y29udmVydCA9IE5VTEw7CisKKyAgbWl4LT5zaW5rcGFkcyA9IGdfc2xpc3RfcmVtb3ZlIChtaXgtPnNpbmtwYWRzLCBwYWQpOworICBnc3RfY2hpbGRfcHJveHlfY2hpbGRfcmVtb3ZlZCAoR1NUX0NISUxEX1BST1hZIChtaXgpLCBHX09CSkVDVCAobWl4cGFkKSwKKyAgICAgIEdTVF9PQkpFQ1RfTkFNRSAobWl4cGFkKSk7CisgIG1peC0+bnVtcGFkcy0tOworCisgIEdTVF9DT0xMRUNUX1BBRFNfU1RSRUFNX0xPQ0sgKG1peC0+Y29sbGVjdCk7CisgIGdzdF92aWRlb21peGVyMl91cGRhdGVfY29udmVydGVycyAobWl4KTsKKyAgR1NUX0NPTExFQ1RfUEFEU19TVFJFQU1fVU5MT0NLIChtaXgtPmNvbGxlY3QpOworCisgIHVwZGF0ZV9jYXBzID0gR1NUX1ZJREVPX0lORk9fRk9STUFUICgmbWl4LT5pbmZvKSAhPSBHU1RfVklERU9fRk9STUFUX1VOS05PV047CisgIEdTVF9WSURFT19NSVhFUjJfVU5MT0NLIChtaXgpOworCisgIGdzdF9jb2xsZWN0X3BhZHNfcmVtb3ZlX3BhZCAobWl4LT5jb2xsZWN0LCBwYWQpOworCisgIGlmICh1cGRhdGVfY2FwcykKKyAgICBnc3RfdmlkZW9taXhlcjJfdXBkYXRlX3NyY19jYXBzIChtaXgpOworCisgIGdzdF9lbGVtZW50X3JlbW92ZV9wYWQgKGVsZW1lbnQsIHBhZCk7CisgIHJldHVybjsKK2Vycm9yOgorICBHU1RfVklERU9fTUlYRVIyX1VOTE9DSyAobWl4KTsKK30KKworLyogR09iamVjdCB2bWV0aG9kcyAqLworc3RhdGljIHZvaWQKK2dzdF92aWRlb21peGVyMl9maW5hbGl6ZSAoR09iamVjdCAqIG8pCit7CisgIEdzdFZpZGVvTWl4ZXIyICptaXggPSBHU1RfVklERU9fTUlYRVIyIChvKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChtaXgtPmNvbGxlY3QpOworICBnX211dGV4X2NsZWFyICgmbWl4LT5sb2NrKTsKKyAgZ19tdXRleF9jbGVhciAoJm1peC0+c2V0Y2Fwc19sb2NrKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG8pOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvbWl4ZXIyX2Rpc3Bvc2UgKEdPYmplY3QgKiBvKQoreworICBHc3RWaWRlb01peGVyMiAqbWl4ID0gR1NUX1ZJREVPX01JWEVSMiAobyk7CisgIEdTTGlzdCAqdG1wOworCisgIGZvciAodG1wID0gbWl4LT5zaW5rcGFkczsgdG1wOyB0bXAgPSB0bXAtPm5leHQpIHsKKyAgICBHc3RWaWRlb01peGVyMlBhZCAqbWl4cGFkID0gdG1wLT5kYXRhOworCisgICAgaWYgKG1peHBhZC0+Y29udmVydCkKKyAgICAgIGdzdF92aWRlb19jb252ZXJ0ZXJfZnJlZSAobWl4cGFkLT5jb252ZXJ0KTsKKyAgICBtaXhwYWQtPmNvbnZlcnQgPSBOVUxMOworICB9CisKKyAgaWYgKG1peC0+cGVuZGluZ190YWdzKSB7CisgICAgZ3N0X3RhZ19saXN0X3VucmVmIChtaXgtPnBlbmRpbmdfdGFncyk7CisgICAgbWl4LT5wZW5kaW5nX3RhZ3MgPSBOVUxMOworICB9CisKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJm1peC0+Y3VycmVudF9jYXBzLCBOVUxMKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAobyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9taXhlcjJfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFZpZGVvTWl4ZXIyICptaXggPSBHU1RfVklERU9fTUlYRVIyIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9CQUNLR1JPVU5EOgorICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIG1peC0+YmFja2dyb3VuZCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9taXhlcjJfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFZpZGVvTWl4ZXIyICptaXggPSBHU1RfVklERU9fTUlYRVIyIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9CQUNLR1JPVU5EOgorICAgICAgbWl4LT5iYWNrZ3JvdW5kID0gZ192YWx1ZV9nZXRfZW51bSAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBHc3RDaGlsZFByb3h5IGltcGxlbWVudGF0aW9uICovCitzdGF0aWMgR09iamVjdCAqCitnc3RfdmlkZW9taXhlcjJfY2hpbGRfcHJveHlfZ2V0X2NoaWxkX2J5X2luZGV4IChHc3RDaGlsZFByb3h5ICogY2hpbGRfcHJveHksCisgICAgZ3VpbnQgaW5kZXgpCit7CisgIEdzdFZpZGVvTWl4ZXIyICptaXggPSBHU1RfVklERU9fTUlYRVIyIChjaGlsZF9wcm94eSk7CisgIEdPYmplY3QgKm9iajsKKworICBHU1RfVklERU9fTUlYRVIyX0xPQ0sgKG1peCk7CisgIGlmICgob2JqID0gZ19zbGlzdF9udGhfZGF0YSAobWl4LT5zaW5rcGFkcywgaW5kZXgpKSkKKyAgICBnX29iamVjdF9yZWYgKG9iaik7CisgIEdTVF9WSURFT19NSVhFUjJfVU5MT0NLIChtaXgpOworICByZXR1cm4gb2JqOworfQorCitzdGF0aWMgZ3VpbnQKK2dzdF92aWRlb21peGVyMl9jaGlsZF9wcm94eV9nZXRfY2hpbGRyZW5fY291bnQgKEdzdENoaWxkUHJveHkgKiBjaGlsZF9wcm94eSkKK3sKKyAgZ3VpbnQgY291bnQgPSAwOworICBHc3RWaWRlb01peGVyMiAqbWl4ID0gR1NUX1ZJREVPX01JWEVSMiAoY2hpbGRfcHJveHkpOworCisgIEdTVF9WSURFT19NSVhFUjJfTE9DSyAobWl4KTsKKyAgY291bnQgPSBtaXgtPm51bXBhZHM7CisgIEdTVF9WSURFT19NSVhFUjJfVU5MT0NLIChtaXgpOworICBHU1RfSU5GT19PQkpFQ1QgKG1peCwgIkNoaWxkcmVuIENvdW50OiAlZCIsIGNvdW50KTsKKyAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvbWl4ZXIyX2NoaWxkX3Byb3h5X2luaXQgKGdwb2ludGVyIGdfaWZhY2UsIGdwb2ludGVyIGlmYWNlX2RhdGEpCit7CisgIEdzdENoaWxkUHJveHlJbnRlcmZhY2UgKmlmYWNlID0gZ19pZmFjZTsKKworICBHU1RfSU5GTyAoImludGlhbGl6aW5nIGNoaWxkIHByb3h5IGludGVyZmFjZSIpOworICBpZmFjZS0+Z2V0X2NoaWxkX2J5X2luZGV4ID0gZ3N0X3ZpZGVvbWl4ZXIyX2NoaWxkX3Byb3h5X2dldF9jaGlsZF9ieV9pbmRleDsKKyAgaWZhY2UtPmdldF9jaGlsZHJlbl9jb3VudCA9IGdzdF92aWRlb21peGVyMl9jaGlsZF9wcm94eV9nZXRfY2hpbGRyZW5fY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdmlkZW9taXhlcjJfY29uc3RydWN0ZWQgKEdPYmplY3QgKiBvYmopCit7CisgIEdzdFZpZGVvTWl4ZXIyICptaXggPSBHU1RfVklERU9fTUlYRVIyIChvYmopOworICBnY2hhciAqY3BfbmFtZTsKKworICBjcF9uYW1lID0gZ19zdHJjb25jYXQgKEdTVF9PQkpFQ1RfTkFNRSAob2JqKSwgIi1jb2xsZWN0cGFkcyIsIE5VTEwpOworICBnc3Rfb2JqZWN0X3NldF9uYW1lIChHU1RfT0JKRUNUIChtaXgtPmNvbGxlY3QpLCBjcF9uYW1lKTsKKyAgZ19mcmVlIChjcF9uYW1lKTsKKworICBHX09CSkVDVF9DTEFTUyAoZ3N0X3ZpZGVvbWl4ZXIyX3BhcmVudF9jbGFzcyktPmNvbnN0cnVjdGVkIChvYmopOworfQorCisvKiBHT2JqZWN0IGJvaWxlcnBsYXRlICovCitzdGF0aWMgdm9pZAorZ3N0X3ZpZGVvbWl4ZXIyX2NsYXNzX2luaXQgKEdzdFZpZGVvTWl4ZXIyQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3RlZCA9IGdzdF92aWRlb21peGVyMl9jb25zdHJ1Y3RlZDsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfdmlkZW9taXhlcjJfZmluYWxpemU7CisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3RfdmlkZW9taXhlcjJfZGlzcG9zZTsKKworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfdmlkZW9taXhlcjJfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdmlkZW9taXhlcjJfc2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQkFDS0dST1VORCwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgiYmFja2dyb3VuZCIsICJCYWNrZ3JvdW5kIiwgIkJhY2tncm91bmQgdHlwZSIsCisgICAgICAgICAgR1NUX1RZUEVfVklERU9fTUlYRVIyX0JBQ0tHUk9VTkQsCisgICAgICAgICAgREVGQVVMVF9CQUNLR1JPVU5ELCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5yZXF1ZXN0X25ld19wYWQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb21peGVyMl9yZXF1ZXN0X25ld19wYWQpOworICBnc3RlbGVtZW50X2NsYXNzLT5yZWxlYXNlX3BhZCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3ZpZGVvbWl4ZXIyX3JlbGVhc2VfcGFkKTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdmlkZW9taXhlcjJfY2hhbmdlX3N0YXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgJnNyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZzaW5rX2ZhY3RvcnkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJWaWRlbyBtaXhlciAyIiwKKyAgICAgICJGaWx0ZXIvRWRpdG9yL1ZpZGVvL0NvbXBvc2l0b3IiLAorICAgICAgIk1peCBtdWx0aXBsZSB2aWRlbyBzdHJlYW1zIiwgIldpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+LCAiCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+Iik7CisKKyAgLyogUmVnaXN0ZXIgdGhlIHBhZCBjbGFzcyAqLworICBnX3R5cGVfY2xhc3NfcmVmIChHU1RfVFlQRV9WSURFT19NSVhFUjJfUEFEKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92aWRlb21peGVyMl9pbml0IChHc3RWaWRlb01peGVyMiAqIG1peCkKK3sKKyAgR3N0RWxlbWVudENsYXNzICprbGFzcyA9IEdTVF9FTEVNRU5UX0dFVF9DTEFTUyAobWl4KTsKKworICBtaXgtPnNyY3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChrbGFzcywKKyAgICAgICAgICAic3JjIiksICJzcmMiKTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKEdTVF9QQUQgKG1peC0+c3JjcGFkKSwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdmlkZW9taXhlcjJfc3JjX3F1ZXJ5KSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uIChHU1RfUEFEIChtaXgtPnNyY3BhZCksCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3ZpZGVvbWl4ZXIyX3NyY19ldmVudCkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVCAobWl4KSwgbWl4LT5zcmNwYWQpOworCisgIG1peC0+Y29sbGVjdCA9IGdzdF9jb2xsZWN0X3BhZHNfbmV3ICgpOworICBnc3RfY29sbGVjdF9wYWRzX3NldF9mbHVzaF9mdW5jdGlvbiAobWl4LT5jb2xsZWN0LAorICAgICAgKEdzdENvbGxlY3RQYWRzRmx1c2hGdW5jdGlvbikgZ3N0X3ZpZGVvbWl4ZXIyX2ZsdXNoLCBtaXgpOworICBtaXgtPmJhY2tncm91bmQgPSBERUZBVUxUX0JBQ0tHUk9VTkQ7CisgIG1peC0+Y3VycmVudF9jYXBzID0gTlVMTDsKKyAgbWl4LT5wZW5kaW5nX3RhZ3MgPSBOVUxMOworCisgIGdzdF9jb2xsZWN0X3BhZHNfc2V0X2Z1bmN0aW9uIChtaXgtPmNvbGxlY3QsCisgICAgICAoR3N0Q29sbGVjdFBhZHNGdW5jdGlvbikgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92aWRlb21peGVyMl9jb2xsZWN0ZWQpLAorICAgICAgbWl4KTsKKyAgZ3N0X2NvbGxlY3RfcGFkc19zZXRfZXZlbnRfZnVuY3Rpb24gKG1peC0+Y29sbGVjdCwKKyAgICAgIChHc3RDb2xsZWN0UGFkc0V2ZW50RnVuY3Rpb24pIGdzdF92aWRlb21peGVyMl9zaW5rX2V2ZW50LCBtaXgpOworICBnc3RfY29sbGVjdF9wYWRzX3NldF9xdWVyeV9mdW5jdGlvbiAobWl4LT5jb2xsZWN0LAorICAgICAgKEdzdENvbGxlY3RQYWRzUXVlcnlGdW5jdGlvbikgZ3N0X3ZpZGVvbWl4ZXIyX3NpbmtfcXVlcnksIG1peCk7CisgIGdzdF9jb2xsZWN0X3BhZHNfc2V0X2NsaXBfZnVuY3Rpb24gKG1peC0+Y29sbGVjdCwKKyAgICAgIChHc3RDb2xsZWN0UGFkc0NsaXBGdW5jdGlvbikgZ3N0X3ZpZGVvbWl4ZXIyX3NpbmtfY2xpcCwgbWl4KTsKKworICBnX211dGV4X2luaXQgKCZtaXgtPmxvY2spOworICBnX211dGV4X2luaXQgKCZtaXgtPnNldGNhcHNfbG9jayk7CisgIC8qIGluaXRpYWxpemUgdmFyaWFibGVzICovCisgIGdzdF92aWRlb21peGVyMl9yZXNldCAobWl4KTsKK30KKworLyogRWxlbWVudCByZWdpc3RyYXRpb24gKi8KK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF92aWRlb21peGVyMl9kZWJ1ZywgInZpZGVvbWl4ZXIiLCAwLAorICAgICAgInZpZGVvIG1peGVyIik7CisKKyAgZ3N0X3ZpZGVvX21peGVyX2luaXRfYmxlbmQgKCk7CisKKyAgcmV0dXJuIGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJ2aWRlb21peGVyIiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgIEdTVF9UWVBFX1ZJREVPX01JWEVSMik7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICB2aWRlb21peGVyLAorICAgICJWaWRlbyBtaXhlciIsIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwKKyAgICBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9taXhlci92aWRlb21peGVyMi5oIGIvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzZhNjVmCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjIuaApAQCAtMCwwICsxLDEzMyBAQAorLyogR2VuZXJpYyB2aWRlbyBtaXhlciBwbHVnaW4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisgCisjaWZuZGVmIF9fR1NUX1ZJREVPX01JWEVSMl9IX18KKyNkZWZpbmUgX19HU1RfVklERU9fTUlYRVIyX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSAiYmxlbmQuaCIKKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3Rjb2xsZWN0cGFkcy5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfVklERU9fTUlYRVIyIChnc3RfdmlkZW9taXhlcjJfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1ZJREVPX01JWEVSMihvYmopIFwKKyAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1ZJREVPX01JWEVSMiwgR3N0VmlkZW9NaXhlcjIpKQorI2RlZmluZSBHU1RfVklERU9fTUlYRVIyX0NMQVNTKGtsYXNzKSBcCisgICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1ZJREVPX01JWEVSMiwgR3N0VmlkZW9NaXhlcjJDbGFzcykpCisjZGVmaW5lIEdTVF9JU19WSURFT19NSVhFUjIob2JqKSBcCisgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WSURFT19NSVhFUjIpKQorI2RlZmluZSBHU1RfSVNfVklERU9fTUlYRVIyX0NMQVNTKGtsYXNzKSBcCisgICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1ZJREVPX01JWEVSMikpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWaWRlb01peGVyMiBHc3RWaWRlb01peGVyMjsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWaWRlb01peGVyMkNsYXNzIEdzdFZpZGVvTWl4ZXIyQ2xhc3M7CisKKy8qKgorICogR3N0VmlkZW9NaXhlcjJCYWNrZ3JvdW5kOgorICogQFZJREVPX01JWEVSMl9CQUNLR1JPVU5EX0NIRUNLRVI6IGNoZWNrZXIgcGF0dGVybiBiYWNrZ3JvdW5kCisgKiBAVklERU9fTUlYRVIyX0JBQ0tHUk9VTkRfQkxBQ0s6IHNvbGlkIGNvbG9yIGJsYWNrIGJhY2tncm91bmQKKyAqIEBWSURFT19NSVhFUjJfQkFDS0dST1VORF9XSElURTogc29saWQgY29sb3Igd2hpdGUgYmFja2dyb3VuZAorICogQFZJREVPX01JWEVSMl9CQUNLR1JPVU5EX1RSQU5TUEFSRU5UOiBiYWNrZ3JvdW5kIGlzIGxlZnQgdHJhbnNwYXJlbnQgYW5kIGxheWVycyBhcmUgY29tcG9zaXRlZCB1c2luZyAiQSBPVkVSIEIiIGNvbXBvc2l0aW9uIHJ1bGVzLiBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSB0byBBWVVWIGFuZCBBUkdCIChhbmQgdmFyaWFudHMpIGFzIGl0IHByZXNlcnZlcyB0aGUgYWxwaGEgY2hhbm5lbCBhbmQgYWxsb3dzIGZvciBmdXJ0aGVyIG1peGluZy4KKyAqCisgKiBUaGUgZGlmZmVyZW50IGJhY2tncm91bmRzIHZpZGVvbWl4ZXIgY2FuIGJsZW5kIG92ZXIuCisgKi8KK3R5cGVkZWYgZW51bQoreworICBWSURFT19NSVhFUjJfQkFDS0dST1VORF9DSEVDS0VSLAorICBWSURFT19NSVhFUjJfQkFDS0dST1VORF9CTEFDSywKKyAgVklERU9fTUlYRVIyX0JBQ0tHUk9VTkRfV0hJVEUsCisgIFZJREVPX01JWEVSMl9CQUNLR1JPVU5EX1RSQU5TUEFSRU5ULAorfQorR3N0VmlkZW9NaXhlcjJCYWNrZ3JvdW5kOworCisvKioKKyAqIEdzdFZpZGVvTWl4ZXIyOgorICoKKyAqIFRoZSBvcGFxdWUgI0dzdFZpZGVvTWl4ZXIyIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RWaWRlb01peGVyMgoreworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKworICAvKiBwYWQgKi8KKyAgR3N0UGFkICpzcmNwYWQ7CisKKyAgLyogTG9jayB0byBwcmV2ZW50IHRoZSBzdGF0ZSB0byBjaGFuZ2Ugd2hpbGUgYmxlbmRpbmcgKi8KKyAgR011dGV4IGxvY2s7CisKKyAgLyogTG9jayB0byBwcmV2ZW50IHR3byBzcmMgc2V0Y2FwcyBmcm9tIGhhcHBlbmluZyBhdCB0aGUgc2FtZSB0aW1lICAqLworICBHTXV0ZXggc2V0Y2Fwc19sb2NrOworCisgIC8qIFNpbmsgcGFkcyB1c2luZyBDb2xsZWN0IFBhZHMgMiovCisgIEdzdENvbGxlY3RQYWRzICpjb2xsZWN0OworCisgIC8qIHNpbmtwYWRzLCBhIEdTTGlzdCBvZiBHc3RWaWRlb01peGVyMlBhZHMgKi8KKyAgR1NMaXN0ICpzaW5rcGFkczsKKyAgZ2ludCBudW1wYWRzOworICAvKiBOZXh0IGF2YWlsYWJsZSBzaW5rcGFkIGluZGV4ICovCisgIGd1aW50IG5leHRfc2lua3BhZDsKKworICAvKiBPdXRwdXQgY2FwcyAqLworICBHc3RWaWRlb0luZm8gaW5mbzsKKworICAvKiBjdXJyZW50IGNhcHMgKi8KKyAgR3N0Q2FwcyAqY3VycmVudF9jYXBzOworICBnYm9vbGVhbiBzZW5kX2NhcHM7CisKKyAgZ2Jvb2xlYW4gbmV3c2VnX3BlbmRpbmc7CisKKyAgR3N0VmlkZW9NaXhlcjJCYWNrZ3JvdW5kIGJhY2tncm91bmQ7CisKKyAgLyogQ3VycmVudCBkb3duc3RyZWFtIHNlZ21lbnQgKi8KKyAgR3N0U2VnbWVudCBzZWdtZW50OworICBHc3RDbG9ja1RpbWUgdHNfb2Zmc2V0OworICBndWludDY0IG5mcmFtZXM7CisKKyAgLyogUW9TIHN0dWZmICovCisgIGdkb3VibGUgcHJvcG9ydGlvbjsKKyAgR3N0Q2xvY2tUaW1lIGVhcmxpZXN0X3RpbWU7CisgIGd1aW50NjQgcW9zX3Byb2Nlc3NlZCwgcW9zX2Ryb3BwZWQ7CisKKyAgQmxlbmRGdW5jdGlvbiBibGVuZCwgb3ZlcmxheTsKKyAgRmlsbENoZWNrZXJGdW5jdGlvbiBmaWxsX2NoZWNrZXI7CisgIEZpbGxDb2xvckZ1bmN0aW9uIGZpbGxfY29sb3I7CisKKyAgZ2Jvb2xlYW4gc2VuZF9zdHJlYW1fc3RhcnQ7CisKKyAgLyogbGF0ZW5jeSAqLworICBnYm9vbGVhbiBsaXZlOworCisgIEdzdFRhZ0xpc3QgKnBlbmRpbmdfdGFnczsKK307CisKK3N0cnVjdCBfR3N0VmlkZW9NaXhlcjJDbGFzcworeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3ZpZGVvbWl4ZXIyX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9WSURFT19NSVhFUjJfSF9fICovCmRpZmYgLS1naXQgYS9nc3QvdmlkZW9taXhlci92aWRlb21peGVyMnBhZC5oIGIvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjJwYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzcxMWUyCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcjJwYWQuaApAQCAtMCwwICsxLDgzIEBACisvKiBHZW5lcmljIHZpZGVvIG1peGVyIHBsdWdpbgorICogQ29weXJpZ2h0IChDKSAyMDA4IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyAKKyNpZm5kZWYgX19HU1RfVklERU9fTUlYRVIyX1BBRF9IX18KKyNkZWZpbmUgX19HU1RfVklERU9fTUlYRVIyX1BBRF9IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGNvbGxlY3RwYWRzLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WSURFT19NSVhFUjJfUEFEIChnc3RfdmlkZW9taXhlcjJfcGFkX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WSURFT19NSVhFUjJfUEFEKG9iaikgXAorICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVklERU9fTUlYRVIyX1BBRCwgR3N0VmlkZW9NaXhlcjJQYWQpKQorI2RlZmluZSBHU1RfVklERU9fTUlYRVIyX1BBRF9DTEFTUyhrbGFzcykgXAorICAgICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WSURFT19NSVhFUl9QQUQsIEdzdFZpZGVvTWl4ZXIyUGFkQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVklERU9fTUlYRVIyX1BBRChvYmopIFwKKyAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1ZJREVPX01JWEVSMl9QQUQpKQorI2RlZmluZSBHU1RfSVNfVklERU9fTUlYRVIyX1BBRF9DTEFTUyhrbGFzcykgXAorICAgICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9WSURFT19NSVhFUjJfUEFEKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZpZGVvTWl4ZXIyUGFkIEdzdFZpZGVvTWl4ZXIyUGFkOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFZpZGVvTWl4ZXIyUGFkQ2xhc3MgR3N0VmlkZW9NaXhlcjJQYWRDbGFzczsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWaWRlb01peGVyMkNvbGxlY3QgR3N0VmlkZW9NaXhlcjJDb2xsZWN0OworCisvKioKKyAqIEdzdFZpZGVvTWl4ZXIyUGFkOgorICoKKyAqIFRoZSBvcGFxdWUgI0dzdFZpZGVvTWl4ZXIyUGFkIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IF9Hc3RWaWRlb01peGVyMlBhZAoreworICBHc3RQYWQgcGFyZW50OworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisKKyAgLyogY2FwcyAqLworICBHc3RWaWRlb0luZm8gaW5mbzsKKworICAvKiBwcm9wZXJ0aWVzICovCisgIGdpbnQgeHBvcywgeXBvczsKKyAgZ3VpbnQgem9yZGVyOworICBnZG91YmxlIGFscGhhOworCisgIEdzdFZpZGVvTWl4ZXIyQ29sbGVjdCAqbWl4Y29sOworCisgIC8qIGNhcHMgdXNlZCBmb3IgY29udmVyc2lvbiBpZiBuZWVkZWQgKi8KKyAgR3N0VmlkZW9JbmZvIGNvbnZlcnNpb25faW5mbzsKKworICAvKiBDb252ZXJ0ZXIsIGlmIE5VTEwgbm8gY29udmVyc2lvbiBpcyBkb25lICovCisgIEdzdFZpZGVvQ29udmVydGVyICpjb252ZXJ0OworCisgIGdib29sZWFuIG5lZWRfY29udmVyc2lvbl91cGRhdGU7Cit9OworCitzdHJ1Y3QgX0dzdFZpZGVvTWl4ZXIyUGFkQ2xhc3MKK3sKKyAgR3N0UGFkQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3ZpZGVvbWl4ZXIyX3BhZF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19HU1RfVklERU9fTUlYRVIyX1BBRF9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJvcmMtZGlzdC5jIGIvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy1kaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjMjgyYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJvcmMtZGlzdC5jCkBAIC0wLDAgKzEsMjQxNCBAQAorCisvKiBhdXRvZ2VuZXJhdGVkIGZyb20gdmlkZW9taXhlcm9yYy5vcmMgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPGdsaWIuaD4KKworI2lmbmRlZiBfT1JDX0lOVEVHRVJfVFlQRURFRlNfCisjZGVmaW5lIF9PUkNfSU5URUdFUl9UWVBFREVGU18KKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorI2luY2x1ZGUgPHN0ZGludC5oPgordHlwZWRlZiBpbnQ4X3Qgb3JjX2ludDg7Cit0eXBlZGVmIGludDE2X3Qgb3JjX2ludDE2OwordHlwZWRlZiBpbnQzMl90IG9yY19pbnQzMjsKK3R5cGVkZWYgaW50NjRfdCBvcmNfaW50NjQ7Cit0eXBlZGVmIHVpbnQ4X3Qgb3JjX3VpbnQ4OwordHlwZWRlZiB1aW50MTZfdCBvcmNfdWludDE2OwordHlwZWRlZiB1aW50MzJfdCBvcmNfdWludDMyOwordHlwZWRlZiB1aW50NjRfdCBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgVUlOVDY0X0MoeCkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCit0eXBlZGVmIHNpZ25lZCBfX2ludDggb3JjX2ludDg7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDE2IG9yY19pbnQxNjsKK3R5cGVkZWYgc2lnbmVkIF9faW50MzIgb3JjX2ludDMyOwordHlwZWRlZiBzaWduZWQgX19pbnQ2NCBvcmNfaW50NjQ7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50OCBvcmNfdWludDg7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50MTYgb3JjX3VpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQzMiBvcmNfdWludDMyOwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSAoeCMjVWk2NCkKKyNkZWZpbmUgaW5saW5lIF9faW5saW5lCisjZWxzZQorI2luY2x1ZGUgPGxpbWl0cy5oPgordHlwZWRlZiBzaWduZWQgY2hhciBvcmNfaW50ODsKK3R5cGVkZWYgc2hvcnQgb3JjX2ludDE2OwordHlwZWRlZiBpbnQgb3JjX2ludDMyOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIG9yY191aW50ODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgb3JjX3VpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IG9yY191aW50MzI7CisjaWYgSU5UX01BWCA9PSBMT05HX01BWAordHlwZWRlZiBsb25nIGxvbmcgb3JjX2ludDY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgb3JjX3VpbnQ2NDsKKyNkZWZpbmUgT1JDX1VJTlQ2NF9DKHgpICh4IyNVTEwpCisjZWxzZQordHlwZWRlZiBsb25nIG9yY19pbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgKHgjI1VMKQorI2VuZGlmCisjZW5kaWYKK3R5cGVkZWYgdW5pb24KK3sKKyAgb3JjX2ludDE2IGk7CisgIG9yY19pbnQ4IHgyWzJdOworfSBvcmNfdW5pb24xNjsKK3R5cGVkZWYgdW5pb24KK3sKKyAgb3JjX2ludDMyIGk7CisgIGZsb2F0IGY7CisgIG9yY19pbnQxNiB4MlsyXTsKKyAgb3JjX2ludDggeDRbNF07Cit9IG9yY191bmlvbjMyOwordHlwZWRlZiB1bmlvbgoreworICBvcmNfaW50NjQgaTsKKyAgZG91YmxlIGY7CisgIG9yY19pbnQzMiB4MlsyXTsKKyAgZmxvYXQgeDJmWzJdOworICBvcmNfaW50MTYgeDRbNF07Cit9IG9yY191bmlvbjY0OworI2VuZGlmCisjaWZuZGVmIE9SQ19SRVNUUklDVAorI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjZGVmaW5lIE9SQ19SRVNUUklDVCByZXN0cmljdAorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAorI2RlZmluZSBPUkNfUkVTVFJJQ1QgX19yZXN0cmljdF9fCisjZWxzZQorI2RlZmluZSBPUkNfUkVTVFJJQ1QKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgT1JDX0lOVEVSTkFMCisjaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU5MCkKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykgJiYgKF9fU1VOUFJPX0MgPj0gMHg1NTApCisjZGVmaW5lIE9SQ19JTlRFUk5BTCBfX2hpZGRlbgorI2VsaWYgZGVmaW5lZCAoX19HTlVDX18pCisjZGVmaW5lIE9SQ19JTlRFUk5BTCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZWxzZQorI2RlZmluZSBPUkNfSU5URVJOQUwKKyNlbmRpZgorI2VuZGlmCisKKworI2lmbmRlZiBESVNBQkxFX09SQworI2luY2x1ZGUgPG9yYy9vcmMuaD4KKyNlbmRpZgordm9pZCB2aWRlb19taXhlcl9vcmNfc3BsYXRfdTMyIChndWludDMyICogT1JDX1JFU1RSSUNUIGQxLCBpbnQgcDEsIGludCBuKTsKK3ZvaWQgdmlkZW9fbWl4ZXJfb3JjX21lbWNweV91MzIgKGd1aW50MzIgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ3VpbnQzMiAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pOwordm9pZCB2aWRlb19taXhlcl9vcmNfYmxlbmRfdTggKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKTsKK3ZvaWQgdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX2FyZ2IgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKTsKK3ZvaWQgdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX2JncmEgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKTsKK3ZvaWQgdmlkZW9fbWl4ZXJfb3JjX292ZXJsYXlfYXJnYiAoZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIGQxLCBpbnQgZDFfc3RyaWRlLAorICAgIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMSwgaW50IHMxX3N0cmlkZSwgaW50IHAxLCBpbnQgbiwgaW50IG0pOwordm9pZCB2aWRlb19taXhlcl9vcmNfb3ZlcmxheV9iZ3JhIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBkMV9zdHJpZGUsCisgICAgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBpbnQgczFfc3RyaWRlLCBpbnQgcDEsIGludCBuLCBpbnQgbSk7CisKKworLyogYmVnaW4gT3JjIEMgdGFyZ2V0IHByZWFtYmxlICovCisjZGVmaW5lIE9SQ19DTEFNUCh4LGEsYikgKCh4KTwoYSkgPyAoYSkgOiAoKHgpPihiKSA/IChiKSA6ICh4KSkpCisjZGVmaW5lIE9SQ19BQlMoYSkgKChhKTwwID8gLShhKSA6IChhKSkKKyNkZWZpbmUgT1JDX01JTihhLGIpICgoYSk8KGIpID8gKGEpIDogKGIpKQorI2RlZmluZSBPUkNfTUFYKGEsYikgKChhKT4oYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIE9SQ19TQl9NQVggMTI3CisjZGVmaW5lIE9SQ19TQl9NSU4gKC0xLU9SQ19TQl9NQVgpCisjZGVmaW5lIE9SQ19VQl9NQVggKG9yY191aW50OCkgMjU1CisjZGVmaW5lIE9SQ19VQl9NSU4gMAorI2RlZmluZSBPUkNfU1dfTUFYIDMyNzY3CisjZGVmaW5lIE9SQ19TV19NSU4gKC0xLU9SQ19TV19NQVgpCisjZGVmaW5lIE9SQ19VV19NQVggKG9yY191aW50MTYpNjU1MzUKKyNkZWZpbmUgT1JDX1VXX01JTiAwCisjZGVmaW5lIE9SQ19TTF9NQVggMjE0NzQ4MzY0NworI2RlZmluZSBPUkNfU0xfTUlOICgtMS1PUkNfU0xfTUFYKQorI2RlZmluZSBPUkNfVUxfTUFYIDQyOTQ5NjcyOTVVCisjZGVmaW5lIE9SQ19VTF9NSU4gMAorI2RlZmluZSBPUkNfQ0xBTVBfU0IoeCkgT1JDX0NMQU1QKHgsT1JDX1NCX01JTixPUkNfU0JfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfVUIoeCkgT1JDX0NMQU1QKHgsT1JDX1VCX01JTixPUkNfVUJfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfU1coeCkgT1JDX0NMQU1QKHgsT1JDX1NXX01JTixPUkNfU1dfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfVVcoeCkgT1JDX0NMQU1QKHgsT1JDX1VXX01JTixPUkNfVVdfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfU0woeCkgT1JDX0NMQU1QKHgsT1JDX1NMX01JTixPUkNfU0xfTUFYKQorI2RlZmluZSBPUkNfQ0xBTVBfVUwoeCkgT1JDX0NMQU1QKHgsT1JDX1VMX01JTixPUkNfVUxfTUFYKQorI2RlZmluZSBPUkNfU1dBUF9XKHgpICgoKCh4KSYweGZmVSk8PDgpIHwgKCgoeCkmMHhmZjAwVSk+PjgpKQorI2RlZmluZSBPUkNfU1dBUF9MKHgpICgoKCh4KSYweGZmVSk8PDI0KSB8ICgoKHgpJjB4ZmYwMFUpPDw4KSB8ICgoKHgpJjB4ZmYwMDAwVSk+PjgpIHwgKCgoeCkmMHhmZjAwMDAwMFUpPj4yNCkpCisjZGVmaW5lIE9SQ19TV0FQX1EoeCkgKCgoKHgpJk9SQ19VSU5UNjRfQygweGZmKSk8PDU2KSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDApKTw8NDApIHwgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4ZmYwMDAwKSk8PDI0KSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDAwMDAwKSk8PDgpIHwgKCgoeCkmT1JDX1VJTlQ2NF9DKDB4ZmYwMDAwMDAwMCkpPj44KSB8ICgoKHgpJk9SQ19VSU5UNjRfQygweGZmMDAwMDAwMDAwMCkpPj4yNCkgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwMDAwMDAwMDAwMCkpPj40MCkgfCAoKCh4KSZPUkNfVUlOVDY0X0MoMHhmZjAwMDAwMDAwMDAwMDAwKSk+PjU2KSkKKyNkZWZpbmUgT1JDX1BUUl9PRkZTRVQocHRyLG9mZnNldCkgKCh2b2lkICopKCgodW5zaWduZWQgY2hhciAqKShwdHIpKSArIChvZmZzZXQpKSkKKyNkZWZpbmUgT1JDX0RFTk9STUFMKHgpICgoeCkgJiAoKCgoeCkmMHg3ZjgwMDAwMCkgPT0gMCkgPyAweGZmODAwMDAwIDogMHhmZmZmZmZmZikpCisjZGVmaW5lIE9SQ19JU05BTih4KSAoKCgoeCkmMHg3ZjgwMDAwMCkgPT0gMHg3ZjgwMDAwMCkgJiYgKCgoeCkmMHgwMDdmZmZmZikgIT0gMCkpCisjZGVmaW5lIE9SQ19ERU5PUk1BTF9ET1VCTEUoeCkgKCh4KSAmICgoKCh4KSZPUkNfVUlOVDY0X0MoMHg3ZmYwMDAwMDAwMDAwMDAwKSkgPT0gMCkgPyBPUkNfVUlOVDY0X0MoMHhmZmYwMDAwMDAwMDAwMDAwKSA6IE9SQ19VSU5UNjRfQygweGZmZmZmZmZmZmZmZmZmZmYpKSkKKyNkZWZpbmUgT1JDX0lTTkFOX0RPVUJMRSh4KSAoKCgoeCkmT1JDX1VJTlQ2NF9DKDB4N2ZmMDAwMDAwMDAwMDAwMCkpID09IE9SQ19VSU5UNjRfQygweDdmZjAwMDAwMDAwMDAwMDApKSAmJiAoKCh4KSZPUkNfVUlOVDY0X0MoMHgwMDBmZmZmZmZmZmZmZmZmKSkgIT0gMCkpCisjaWZuZGVmIE9SQ19SRVNUUklDVAorI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjZGVmaW5lIE9SQ19SRVNUUklDVCByZXN0cmljdAorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAorI2RlZmluZSBPUkNfUkVTVFJJQ1QgX19yZXN0cmljdF9fCisjZWxzZQorI2RlZmluZSBPUkNfUkVTVFJJQ1QKKyNlbmRpZgorI2VuZGlmCisvKiBlbmQgT3JjIEMgdGFyZ2V0IHByZWFtYmxlICovCisKKworCisvKiB2aWRlb19taXhlcl9vcmNfc3BsYXRfdTMyICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK3ZpZGVvX21peGVyX29yY19zcGxhdF91MzIgKGd1aW50MzIgKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBwMSwgaW50IG4pCit7CisgIGludCBpOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIG9yY191bmlvbjMyIHZhcjMyOworICBvcmNfdW5pb24zMiB2YXIzMzsKKworICBwdHIwID0gKG9yY191bmlvbjMyICopIGQxOworCisgIC8qIDA6IGxvYWRwbCAqLworICB2YXIzMi5pID0gcDE7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDE6IGNvcHlsICovCisgICAgdmFyMzMuaSA9IHZhcjMyLmk7CisgICAgLyogMjogc3RvcmVsICovCisgICAgcHRyMFtpXSA9IHZhcjMzOworICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX3ZpZGVvX21peGVyX29yY19zcGxhdF91MzIgKE9yY0V4ZWN1dG9yICogT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IG4gPSBleC0+bjsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBvcmNfdW5pb24zMiB2YXIzMjsKKyAgb3JjX3VuaW9uMzIgdmFyMzM7CisKKyAgcHRyMCA9IChvcmNfdW5pb24zMiAqKSBleC0+YXJyYXlzWzBdOworCisgIC8qIDA6IGxvYWRwbCAqLworICB2YXIzMi5pID0gZXgtPnBhcmFtc1syNF07CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDE6IGNvcHlsICovCisgICAgdmFyMzMuaSA9IHZhcjMyLmk7CisgICAgLyogMjogc3RvcmVsICovCisgICAgcHRyMFtpXSA9IHZhcjMzOworICB9CisKK30KKwordm9pZAordmlkZW9fbWl4ZXJfb3JjX3NwbGF0X3UzMiAoZ3VpbnQzMiAqIE9SQ19SRVNUUklDVCBkMSwgaW50IHAxLCBpbnQgbikKK3sKKyAgT3JjRXhlY3V0b3IgX2V4LCAqZXggPSAmX2V4OworICBzdGF0aWMgdm9sYXRpbGUgaW50IHBfaW5pdGVkID0gMDsKKyAgc3RhdGljIE9yY0NvZGUgKmMgPSAwOworICB2b2lkICgqZnVuYykgKE9yY0V4ZWN1dG9yICopOworCisgIGlmICghcF9pbml0ZWQpIHsKKyAgICBvcmNfb25jZV9tdXRleF9sb2NrICgpOworICAgIGlmICghcF9pbml0ZWQpIHsKKyAgICAgIE9yY1Byb2dyYW0gKnA7CisKKyNpZiAxCisgICAgICBzdGF0aWMgY29uc3Qgb3JjX3VpbnQ4IGJjW10gPSB7CisgICAgICAgIDEsIDksIDI1LCAxMTgsIDEwNSwgMTAwLCAxMDEsIDExMSwgOTUsIDEwOSwgMTA1LCAxMjAsIDEwMSwgMTE0LCA5NSwgMTExLAorICAgICAgICAxMTQsIDk5LCA5NSwgMTE1LCAxMTIsIDEwOCwgOTcsIDExNiwgOTUsIDExNywgNTEsIDUwLCAxMSwgNCwgNCwgMTYsCisgICAgICAgIDQsIDExMiwgMCwgMjQsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwgX2JhY2t1cF92aWRlb19taXhlcl9vcmNfc3BsYXRfdTMyKTsKKyNlbHNlCisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3ICgpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X25hbWUgKHAsICJ2aWRlb19taXhlcl9vcmNfc3BsYXRfdTMyIik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLCBfYmFja3VwX3ZpZGVvX21peGVyX29yY19zcGxhdF91MzIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2Rlc3RpbmF0aW9uIChwLCA0LCAiZDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXIgKHAsIDQsICJwMSIpOworCisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvcHlsIiwgMCwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9QMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHAxOworCisgIGZ1bmMgPSBjLT5leGVjOworICBmdW5jIChleCk7Cit9CisjZW5kaWYKKworCisvKiB2aWRlb19taXhlcl9vcmNfbWVtY3B5X3UzMiAqLworI2lmZGVmIERJU0FCTEVfT1JDCit2b2lkCit2aWRlb19taXhlcl9vcmNfbWVtY3B5X3UzMiAoZ3VpbnQzMiAqIE9SQ19SRVNUUklDVCBkMSwKKyAgICBjb25zdCBndWludDMyICogT1JDX1JFU1RSSUNUIHMxLCBpbnQgbikKK3sKKyAgaW50IGk7CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb24zMiB2YXIzMjsKKyAgb3JjX3VuaW9uMzIgdmFyMzM7CisKKyAgcHRyMCA9IChvcmNfdW5pb24zMiAqKSBkMTsKKyAgcHRyNCA9IChvcmNfdW5pb24zMiAqKSBzMTsKKworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAvKiAwOiBsb2FkbCAqLworICAgIHZhcjMyID0gcHRyNFtpXTsKKyAgICAvKiAxOiBjb3B5bCAqLworICAgIHZhcjMzLmkgPSB2YXIzMi5pOworICAgIC8qIDI6IHN0b3JlbCAqLworICAgIHB0cjBbaV0gPSB2YXIzMzsKKyAgfQorCit9CisKKyNlbHNlCitzdGF0aWMgdm9pZAorX2JhY2t1cF92aWRlb19taXhlcl9vcmNfbWVtY3B5X3UzMiAoT3JjRXhlY3V0b3IgKiBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgbiA9IGV4LT5uOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uMzIgdmFyMzI7CisgIG9yY191bmlvbjMyIHZhcjMzOworCisgIHB0cjAgPSAob3JjX3VuaW9uMzIgKikgZXgtPmFycmF5c1swXTsKKyAgcHRyNCA9IChvcmNfdW5pb24zMiAqKSBleC0+YXJyYXlzWzRdOworCisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIDA6IGxvYWRsICovCisgICAgdmFyMzIgPSBwdHI0W2ldOworICAgIC8qIDE6IGNvcHlsICovCisgICAgdmFyMzMuaSA9IHZhcjMyLmk7CisgICAgLyogMjogc3RvcmVsICovCisgICAgcHRyMFtpXSA9IHZhcjMzOworICB9CisKK30KKwordm9pZAordmlkZW9fbWl4ZXJfb3JjX21lbWNweV91MzIgKGd1aW50MzIgKiBPUkNfUkVTVFJJQ1QgZDEsCisgICAgY29uc3QgZ3VpbnQzMiAqIE9SQ19SRVNUUklDVCBzMSwgaW50IG4pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA5LCAyNiwgMTE4LCAxMDUsIDEwMCwgMTAxLCAxMTEsIDk1LCAxMDksIDEwNSwgMTIwLCAxMDEsIDExNCwgOTUsIDExMSwKKyAgICAgICAgMTE0LCA5OSwgOTUsIDEwOSwgMTAxLCAxMDksIDk5LCAxMTIsIDEyMSwgOTUsIDExNywgNTEsIDUwLCAxMSwgNCwgNCwKKyAgICAgICAgMTIsIDQsIDQsIDExMiwgMCwgNCwgMiwgMCwKKyAgICAgIH07CisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3X2Zyb21fc3RhdGljX2J5dGVjb2RlIChiYyk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLCBfYmFja3VwX3ZpZGVvX21peGVyX29yY19tZW1jcHlfdTMyKTsKKyNlbHNlCisgICAgICBwID0gb3JjX3Byb2dyYW1fbmV3ICgpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X25hbWUgKHAsICJ2aWRlb19taXhlcl9vcmNfbWVtY3B5X3UzMiIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwgX2JhY2t1cF92aWRlb19taXhlcl9vcmNfbWVtY3B5X3UzMik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDQsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgNCwgInMxIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29weWwiLCAwLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1MxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX0QxXSA9IGQxOworICBleC0+YXJyYXlzW09SQ19WQVJfUzFdID0gKHZvaWQgKikgczE7CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIHZpZGVvX21peGVyX29yY19ibGVuZF91OCAqLworI2lmZGVmIERJU0FCTEVfT1JDCit2b2lkCit2aWRlb19taXhlcl9vcmNfYmxlbmRfdTggKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKQoreworICBpbnQgaTsKKyAgaW50IGo7CisgIG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX2ludDggKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfaW50OCB2YXIzNDsKKyAgb3JjX2ludDggdmFyMzU7CisgIG9yY191bmlvbjE2IHZhcjM2OworICBvcmNfaW50OCB2YXIzNzsKKyAgb3JjX3VuaW9uMTYgdmFyMzg7CisgIG9yY191bmlvbjE2IHZhcjM5OworICBvcmNfdW5pb24xNiB2YXI0MDsKKyAgb3JjX3VuaW9uMTYgdmFyNDE7CisgIG9yY191bmlvbjE2IHZhcjQyOworICBvcmNfdW5pb24xNiB2YXI0MzsKKyAgb3JjX3VuaW9uMTYgdmFyNDQ7CisKKyAgZm9yIChqID0gMDsgaiA8IG07IGorKykgeworICAgIHB0cjAgPSBPUkNfUFRSX09GRlNFVCAoZDEsIGQxX3N0cmlkZSAqIGopOworICAgIHB0cjQgPSBPUkNfUFRSX09GRlNFVCAoczEsIHMxX3N0cmlkZSAqIGopOworCisgICAgLyogNTogbG9hZHB3ICovCisgICAgdmFyMzYuaSA9IHAxOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgLyogMDogbG9hZGIgKi8KKyAgICAgIHZhcjM0ID0gcHRyMFtpXTsKKyAgICAgIC8qIDE6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjM4LmkgPSAob3JjX3VpbnQ4KSB2YXIzNDsKKyAgICAgIC8qIDI6IGxvYWRiICovCisgICAgICB2YXIzNSA9IHB0cjRbaV07CisgICAgICAvKiAzOiBjb252dWJ3ICovCisgICAgICB2YXIzOS5pID0gKG9yY191aW50OCkgdmFyMzU7CisgICAgICAvKiA0OiBzdWJ3ICovCisgICAgICB2YXI0MC5pID0gdmFyMzkuaSAtIHZhcjM4Lmk7CisgICAgICAvKiA2OiBtdWxsdyAqLworICAgICAgdmFyNDEuaSA9ICh2YXI0MC5pICogdmFyMzYuaSkgJiAweGZmZmY7CisgICAgICAvKiA3OiBzaGx3ICovCisgICAgICB2YXI0Mi5pID0gKChvcmNfdWludDE2KSB2YXIzOC5pKSA8PCA4OworICAgICAgLyogODogYWRkdyAqLworICAgICAgdmFyNDMuaSA9IHZhcjQyLmkgKyB2YXI0MS5pOworICAgICAgLyogOTogc2hydXcgKi8KKyAgICAgIHZhcjQ0LmkgPSAoKG9yY191aW50MTYpIHZhcjQzLmkpID4+IDg7CisgICAgICAvKiAxMDogY29udnN1c3diICovCisgICAgICB2YXIzNyA9IE9SQ19DTEFNUF9VQiAodmFyNDQuaSk7CisgICAgICAvKiAxMTogc3RvcmViICovCisgICAgICBwdHIwW2ldID0gdmFyMzc7CisgICAgfQorICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX3ZpZGVvX21peGVyX29yY19ibGVuZF91OCAoT3JjRXhlY3V0b3IgKiBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgajsKKyAgaW50IG4gPSBleC0+bjsKKyAgaW50IG0gPSBleC0+cGFyYW1zW09SQ19WQVJfQTFdOworICBvcmNfaW50OCAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY19pbnQ4ICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX2ludDggdmFyMzQ7CisgIG9yY19pbnQ4IHZhcjM1OworICBvcmNfdW5pb24xNiB2YXIzNjsKKyAgb3JjX2ludDggdmFyMzc7CisgIG9yY191bmlvbjE2IHZhcjM4OworICBvcmNfdW5pb24xNiB2YXIzOTsKKyAgb3JjX3VuaW9uMTYgdmFyNDA7CisgIG9yY191bmlvbjE2IHZhcjQxOworICBvcmNfdW5pb24xNiB2YXI0MjsKKyAgb3JjX3VuaW9uMTYgdmFyNDM7CisgIG9yY191bmlvbjE2IHZhcjQ0OworCisgIGZvciAoaiA9IDA7IGogPCBtOyBqKyspIHsKKyAgICBwdHIwID0gT1JDX1BUUl9PRkZTRVQgKGV4LT5hcnJheXNbMF0sIGV4LT5wYXJhbXNbMF0gKiBqKTsKKyAgICBwdHI0ID0gT1JDX1BUUl9PRkZTRVQgKGV4LT5hcnJheXNbNF0sIGV4LT5wYXJhbXNbNF0gKiBqKTsKKworICAgIC8qIDU6IGxvYWRwdyAqLworICAgIHZhcjM2LmkgPSBleC0+cGFyYW1zWzI0XTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIC8qIDA6IGxvYWRiICovCisgICAgICB2YXIzNCA9IHB0cjBbaV07CisgICAgICAvKiAxOiBjb252dWJ3ICovCisgICAgICB2YXIzOC5pID0gKG9yY191aW50OCkgdmFyMzQ7CisgICAgICAvKiAyOiBsb2FkYiAqLworICAgICAgdmFyMzUgPSBwdHI0W2ldOworICAgICAgLyogMzogY29udnVidyAqLworICAgICAgdmFyMzkuaSA9IChvcmNfdWludDgpIHZhcjM1OworICAgICAgLyogNDogc3VidyAqLworICAgICAgdmFyNDAuaSA9IHZhcjM5LmkgLSB2YXIzOC5pOworICAgICAgLyogNjogbXVsbHcgKi8KKyAgICAgIHZhcjQxLmkgPSAodmFyNDAuaSAqIHZhcjM2LmkpICYgMHhmZmZmOworICAgICAgLyogNzogc2hsdyAqLworICAgICAgdmFyNDIuaSA9ICgob3JjX3VpbnQxNikgdmFyMzguaSkgPDwgODsKKyAgICAgIC8qIDg6IGFkZHcgKi8KKyAgICAgIHZhcjQzLmkgPSB2YXI0Mi5pICsgdmFyNDEuaTsKKyAgICAgIC8qIDk6IHNocnV3ICovCisgICAgICB2YXI0NC5pID0gKChvcmNfdWludDE2KSB2YXI0My5pKSA+PiA4OworICAgICAgLyogMTA6IGNvbnZzdXN3YiAqLworICAgICAgdmFyMzcgPSBPUkNfQ0xBTVBfVUIgKHZhcjQ0LmkpOworICAgICAgLyogMTE6IHN0b3JlYiAqLworICAgICAgcHRyMFtpXSA9IHZhcjM3OworICAgIH0KKyAgfQorCit9CisKK3ZvaWQKK3ZpZGVvX21peGVyX29yY19ibGVuZF91OCAoZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIGQxLCBpbnQgZDFfc3RyaWRlLAorICAgIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMSwgaW50IHMxX3N0cmlkZSwgaW50IHAxLCBpbnQgbiwgaW50IG0pCit7CisgIE9yY0V4ZWN1dG9yIF9leCwgKmV4ID0gJl9leDsKKyAgc3RhdGljIHZvbGF0aWxlIGludCBwX2luaXRlZCA9IDA7CisgIHN0YXRpYyBPcmNDb2RlICpjID0gMDsKKyAgdm9pZCAoKmZ1bmMpIChPcmNFeGVjdXRvciAqKTsKKworICBpZiAoIXBfaW5pdGVkKSB7CisgICAgb3JjX29uY2VfbXV0ZXhfbG9jayAoKTsKKyAgICBpZiAoIXBfaW5pdGVkKSB7CisgICAgICBPcmNQcm9ncmFtICpwOworCisjaWYgMQorICAgICAgc3RhdGljIGNvbnN0IG9yY191aW50OCBiY1tdID0geworICAgICAgICAxLCA3LCA5LCAyNCwgMTE4LCAxMDUsIDEwMCwgMTAxLCAxMTEsIDk1LCAxMDksIDEwNSwgMTIwLCAxMDEsIDExNCwgOTUsCisgICAgICAgIDExMSwgMTE0LCA5OSwgOTUsIDk4LCAxMDgsIDEwMSwgMTEwLCAxMDAsIDk1LCAxMTcsIDU2LCAxMSwgMSwgMSwgMTIsCisgICAgICAgIDEsIDEsIDE0LCAxLCA4LCAwLCAwLCAwLCAxNiwgMiwgMjAsIDIsIDIwLCAyLCAxNTAsIDMyLAorICAgICAgICAwLCAxNTAsIDMzLCA0LCA5OCwgMzMsIDMzLCAzMiwgODksIDMzLCAzMywgMjQsIDkzLCAzMiwgMzIsIDE2LAorICAgICAgICA3MCwgMzMsIDMyLCAzMywgOTUsIDMzLCAzMywgMTYsIDE2MCwgMCwgMzMsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwgX2JhY2t1cF92aWRlb19taXhlcl9vcmNfYmxlbmRfdTgpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfMmQgKHApOworICAgICAgb3JjX3Byb2dyYW1fc2V0X25hbWUgKHAsICJ2aWRlb19taXhlcl9vcmNfYmxlbmRfdTgiKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsIF9iYWNrdXBfdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX3U4KTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9kZXN0aW5hdGlvbiAocCwgMSwgImQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCAxLCAiczEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9jb25zdGFudCAocCwgMSwgMHgwMDAwMDAwOCwgImMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfcGFyYW1ldGVyIChwLCAyLCAicDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDIsICJ0MSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgMiwgInQyIik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnVidyIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfRDEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZ1YnciLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1MxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJzdWJ3IiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsbHciLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1AxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJzaGx3IiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9DMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiYWRkdyIsIDAsIE9SQ19WQVJfVDIsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDIsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInNocnV3IiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9DMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnN1c3diIiwgMCwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMiwKKyAgICAgICAgICBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIE9SQ19FWEVDVVRPUl9NIChleCkgPSBtOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5wYXJhbXNbT1JDX1ZBUl9EMV0gPSBkMV9zdHJpZGU7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1MxXSA9IHMxX3N0cmlkZTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHAxOworCisgIGZ1bmMgPSBjLT5leGVjOworICBmdW5jIChleCk7Cit9CisjZW5kaWYKKworCisvKiB2aWRlb19taXhlcl9vcmNfYmxlbmRfYXJnYiAqLworI2lmZGVmIERJU0FCTEVfT1JDCit2b2lkCit2aWRlb19taXhlcl9vcmNfYmxlbmRfYXJnYiAoZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIGQxLCBpbnQgZDFfc3RyaWRlLAorICAgIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMSwgaW50IHMxX3N0cmlkZSwgaW50IHAxLCBpbnQgbiwgaW50IG0pCit7CisgIGludCBpOworICBpbnQgajsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjY0IHZhcjM5OworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID09IDIgJiYgZGVmaW5lZCAoX19pMzg2X18pCisgIHZvbGF0aWxlIG9yY191bmlvbjMyIHZhcjQwOworI2Vsc2UKKyAgb3JjX3VuaW9uMzIgdmFyNDA7CisjZW5kaWYKKyAgb3JjX3VuaW9uMzIgdmFyNDE7CisgIG9yY191bmlvbjE2IHZhcjQyOworICBvcmNfaW50OCB2YXI0MzsKKyAgb3JjX3VuaW9uMzIgdmFyNDQ7CisgIG9yY191bmlvbjY0IHZhcjQ1OworICBvcmNfdW5pb242NCB2YXI0NjsKKyAgb3JjX3VuaW9uNjQgdmFyNDc7CisgIG9yY191bmlvbjY0IHZhcjQ4OworICBvcmNfdW5pb24zMiB2YXI0OTsKKyAgb3JjX3VuaW9uNjQgdmFyNTA7CisgIG9yY191bmlvbjY0IHZhcjUxOworICBvcmNfdW5pb242NCB2YXI1MjsKKyAgb3JjX3VuaW9uNjQgdmFyNTM7CisgIG9yY191bmlvbjY0IHZhcjU0OworICBvcmNfdW5pb24zMiB2YXI1NTsKKyAgb3JjX3VuaW9uMzIgdmFyNTY7CisKKyAgZm9yIChqID0gMDsgaiA8IG07IGorKykgeworICAgIHB0cjAgPSBPUkNfUFRSX09GRlNFVCAoZDEsIGQxX3N0cmlkZSAqIGopOworICAgIHB0cjQgPSBPUkNfUFRSX09GRlNFVCAoczEsIHMxX3N0cmlkZSAqIGopOworCisgICAgLyogNTogbG9hZHB3ICovCisgICAgdmFyMzkueDRbMF0gPSBwMTsKKyAgICB2YXIzOS54NFsxXSA9IHAxOworICAgIHZhcjM5Lng0WzJdID0gcDE7CisgICAgdmFyMzkueDRbM10gPSBwMTsKKyAgICAvKiAxNjogbG9hZHBsICovCisgICAgdmFyNDAuaSA9IDB4MDAwMDAwZmY7ICAgICAgIC8qIDI1NSBvciAxLjI1OTg3ZS0zMjFmICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAvKiAwOiBsb2FkbCAqLworICAgICAgdmFyNDEgPSBwdHI0W2ldOworICAgICAgLyogMTogY29udmx3ICovCisgICAgICB2YXI0Mi5pID0gdmFyNDEuaTsKKyAgICAgIC8qIDI6IGNvbnZ3YiAqLworICAgICAgdmFyNDMgPSB2YXI0Mi5pOworICAgICAgLyogMzogc3BsYXRibCAqLworICAgICAgdmFyNDQuaSA9CisgICAgICAgICAgKCgoKG9yY191aW50MzIpIHZhcjQzKSAmIDB4ZmYpIDw8IDI0KSB8ICgoKChvcmNfdWludDMyKSB2YXI0MykgJiAweGZmKQorICAgICAgICAgIDw8IDE2KSB8ICgoKChvcmNfdWludDMyKSB2YXI0MykgJiAweGZmKSA8PCA4KSB8ICgoKG9yY191aW50MzIpIHZhcjQzKQorICAgICAgICAgICYgMHhmZik7CisgICAgICAvKiA0OiBjb252dWJ3ICovCisgICAgICB2YXI0NS54NFswXSA9IChvcmNfdWludDgpIHZhcjQ0Lng0WzBdOworICAgICAgdmFyNDUueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI0NC54NFsxXTsKKyAgICAgIHZhcjQ1Lng0WzJdID0gKG9yY191aW50OCkgdmFyNDQueDRbMl07CisgICAgICB2YXI0NS54NFszXSA9IChvcmNfdWludDgpIHZhcjQ0Lng0WzNdOworICAgICAgLyogNjogbXVsbHcgKi8KKyAgICAgIHZhcjQ2Lng0WzBdID0gKHZhcjQ1Lng0WzBdICogdmFyMzkueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNDYueDRbMV0gPSAodmFyNDUueDRbMV0gKiB2YXIzOS54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI0Ni54NFsyXSA9ICh2YXI0NS54NFsyXSAqIHZhcjM5Lng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjQ2Lng0WzNdID0gKHZhcjQ1Lng0WzNdICogdmFyMzkueDRbM10pICYgMHhmZmZmOworICAgICAgLyogNzogc2hydXcgKi8KKyAgICAgIHZhcjQ3Lng0WzBdID0gKChvcmNfdWludDE2KSB2YXI0Ni54NFswXSkgPj4gODsKKyAgICAgIHZhcjQ3Lng0WzFdID0gKChvcmNfdWludDE2KSB2YXI0Ni54NFsxXSkgPj4gODsKKyAgICAgIHZhcjQ3Lng0WzJdID0gKChvcmNfdWludDE2KSB2YXI0Ni54NFsyXSkgPj4gODsKKyAgICAgIHZhcjQ3Lng0WzNdID0gKChvcmNfdWludDE2KSB2YXI0Ni54NFszXSkgPj4gODsKKyAgICAgIC8qIDg6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjQ4Lng0WzBdID0gKG9yY191aW50OCkgdmFyNDEueDRbMF07CisgICAgICB2YXI0OC54NFsxXSA9IChvcmNfdWludDgpIHZhcjQxLng0WzFdOworICAgICAgdmFyNDgueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI0MS54NFsyXTsKKyAgICAgIHZhcjQ4Lng0WzNdID0gKG9yY191aW50OCkgdmFyNDEueDRbM107CisgICAgICAvKiA5OiBsb2FkbCAqLworICAgICAgdmFyNDkgPSBwdHIwW2ldOworICAgICAgLyogMTA6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjUwLng0WzBdID0gKG9yY191aW50OCkgdmFyNDkueDRbMF07CisgICAgICB2YXI1MC54NFsxXSA9IChvcmNfdWludDgpIHZhcjQ5Lng0WzFdOworICAgICAgdmFyNTAueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI0OS54NFsyXTsKKyAgICAgIHZhcjUwLng0WzNdID0gKG9yY191aW50OCkgdmFyNDkueDRbM107CisgICAgICAvKiAxMTogc3VidyAqLworICAgICAgdmFyNTEueDRbMF0gPSB2YXI0OC54NFswXSAtIHZhcjUwLng0WzBdOworICAgICAgdmFyNTEueDRbMV0gPSB2YXI0OC54NFsxXSAtIHZhcjUwLng0WzFdOworICAgICAgdmFyNTEueDRbMl0gPSB2YXI0OC54NFsyXSAtIHZhcjUwLng0WzJdOworICAgICAgdmFyNTEueDRbM10gPSB2YXI0OC54NFszXSAtIHZhcjUwLng0WzNdOworICAgICAgLyogMTI6IG11bGx3ICovCisgICAgICB2YXI1Mi54NFswXSA9ICh2YXI1MS54NFswXSAqIHZhcjQ3Lng0WzBdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjUyLng0WzFdID0gKHZhcjUxLng0WzFdICogdmFyNDcueDRbMV0pICYgMHhmZmZmOworICAgICAgdmFyNTIueDRbMl0gPSAodmFyNTEueDRbMl0gKiB2YXI0Ny54NFsyXSkgJiAweGZmZmY7CisgICAgICB2YXI1Mi54NFszXSA9ICh2YXI1MS54NFszXSAqIHZhcjQ3Lng0WzNdKSAmIDB4ZmZmZjsKKyAgICAgIC8qIDEzOiBkaXYyNTV3ICovCisgICAgICB2YXI1My54NFswXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNTIueDRbMF0gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI1Mi54NFswXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIHZhcjUzLng0WzFdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI1Mi54NFsxXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjUyLng0WzFdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgdmFyNTMueDRbMl0gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjUyLng0WzJdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNTIueDRbMl0gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICB2YXI1My54NFszXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNTIueDRbM10gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI1Mi54NFszXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIC8qIDE0OiBhZGR3ICovCisgICAgICB2YXI1NC54NFswXSA9IHZhcjUwLng0WzBdICsgdmFyNTMueDRbMF07CisgICAgICB2YXI1NC54NFsxXSA9IHZhcjUwLng0WzFdICsgdmFyNTMueDRbMV07CisgICAgICB2YXI1NC54NFsyXSA9IHZhcjUwLng0WzJdICsgdmFyNTMueDRbMl07CisgICAgICB2YXI1NC54NFszXSA9IHZhcjUwLng0WzNdICsgdmFyNTMueDRbM107CisgICAgICAvKiAxNTogY29udndiICovCisgICAgICB2YXI1NS54NFswXSA9IHZhcjU0Lng0WzBdOworICAgICAgdmFyNTUueDRbMV0gPSB2YXI1NC54NFsxXTsKKyAgICAgIHZhcjU1Lng0WzJdID0gdmFyNTQueDRbMl07CisgICAgICB2YXI1NS54NFszXSA9IHZhcjU0Lng0WzNdOworICAgICAgLyogMTc6IG9ybCAqLworICAgICAgdmFyNTYuaSA9IHZhcjU1LmkgfCB2YXI0MC5pOworICAgICAgLyogMTg6IHN0b3JlbCAqLworICAgICAgcHRyMFtpXSA9IHZhcjU2OworICAgIH0KKyAgfQorCit9CisKKyNlbHNlCitzdGF0aWMgdm9pZAorX2JhY2t1cF92aWRlb19taXhlcl9vcmNfYmxlbmRfYXJnYiAoT3JjRXhlY3V0b3IgKiBPUkNfUkVTVFJJQ1QgZXgpCit7CisgIGludCBpOworICBpbnQgajsKKyAgaW50IG4gPSBleC0+bjsKKyAgaW50IG0gPSBleC0+cGFyYW1zW09SQ19WQVJfQTFdOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uNjQgdmFyMzk7CisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPT0gMiAmJiBkZWZpbmVkIChfX2kzODZfXykKKyAgdm9sYXRpbGUgb3JjX3VuaW9uMzIgdmFyNDA7CisjZWxzZQorICBvcmNfdW5pb24zMiB2YXI0MDsKKyNlbmRpZgorICBvcmNfdW5pb24zMiB2YXI0MTsKKyAgb3JjX3VuaW9uMTYgdmFyNDI7CisgIG9yY19pbnQ4IHZhcjQzOworICBvcmNfdW5pb24zMiB2YXI0NDsKKyAgb3JjX3VuaW9uNjQgdmFyNDU7CisgIG9yY191bmlvbjY0IHZhcjQ2OworICBvcmNfdW5pb242NCB2YXI0NzsKKyAgb3JjX3VuaW9uNjQgdmFyNDg7CisgIG9yY191bmlvbjMyIHZhcjQ5OworICBvcmNfdW5pb242NCB2YXI1MDsKKyAgb3JjX3VuaW9uNjQgdmFyNTE7CisgIG9yY191bmlvbjY0IHZhcjUyOworICBvcmNfdW5pb242NCB2YXI1MzsKKyAgb3JjX3VuaW9uNjQgdmFyNTQ7CisgIG9yY191bmlvbjMyIHZhcjU1OworICBvcmNfdW5pb24zMiB2YXI1NjsKKworICBmb3IgKGogPSAwOyBqIDwgbTsgaisrKSB7CisgICAgcHRyMCA9IE9SQ19QVFJfT0ZGU0VUIChleC0+YXJyYXlzWzBdLCBleC0+cGFyYW1zWzBdICogaik7CisgICAgcHRyNCA9IE9SQ19QVFJfT0ZGU0VUIChleC0+YXJyYXlzWzRdLCBleC0+cGFyYW1zWzRdICogaik7CisKKyAgICAvKiA1OiBsb2FkcHcgKi8KKyAgICB2YXIzOS54NFswXSA9IGV4LT5wYXJhbXNbMjRdOworICAgIHZhcjM5Lng0WzFdID0gZXgtPnBhcmFtc1syNF07CisgICAgdmFyMzkueDRbMl0gPSBleC0+cGFyYW1zWzI0XTsKKyAgICB2YXIzOS54NFszXSA9IGV4LT5wYXJhbXNbMjRdOworICAgIC8qIDE2OiBsb2FkcGwgKi8KKyAgICB2YXI0MC5pID0gMHgwMDAwMDBmZjsgICAgICAgLyogMjU1IG9yIDEuMjU5ODdlLTMyMWYgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgIC8qIDA6IGxvYWRsICovCisgICAgICB2YXI0MSA9IHB0cjRbaV07CisgICAgICAvKiAxOiBjb252bHcgKi8KKyAgICAgIHZhcjQyLmkgPSB2YXI0MS5pOworICAgICAgLyogMjogY29udndiICovCisgICAgICB2YXI0MyA9IHZhcjQyLmk7CisgICAgICAvKiAzOiBzcGxhdGJsICovCisgICAgICB2YXI0NC5pID0KKyAgICAgICAgICAoKCgob3JjX3VpbnQzMikgdmFyNDMpICYgMHhmZikgPDwgMjQpIHwgKCgoKG9yY191aW50MzIpIHZhcjQzKSAmIDB4ZmYpCisgICAgICAgICAgPDwgMTYpIHwgKCgoKG9yY191aW50MzIpIHZhcjQzKSAmIDB4ZmYpIDw8IDgpIHwgKCgob3JjX3VpbnQzMikgdmFyNDMpCisgICAgICAgICAgJiAweGZmKTsKKyAgICAgIC8qIDQ6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjQ1Lng0WzBdID0gKG9yY191aW50OCkgdmFyNDQueDRbMF07CisgICAgICB2YXI0NS54NFsxXSA9IChvcmNfdWludDgpIHZhcjQ0Lng0WzFdOworICAgICAgdmFyNDUueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI0NC54NFsyXTsKKyAgICAgIHZhcjQ1Lng0WzNdID0gKG9yY191aW50OCkgdmFyNDQueDRbM107CisgICAgICAvKiA2OiBtdWxsdyAqLworICAgICAgdmFyNDYueDRbMF0gPSAodmFyNDUueDRbMF0gKiB2YXIzOS54NFswXSkgJiAweGZmZmY7CisgICAgICB2YXI0Ni54NFsxXSA9ICh2YXI0NS54NFsxXSAqIHZhcjM5Lng0WzFdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjQ2Lng0WzJdID0gKHZhcjQ1Lng0WzJdICogdmFyMzkueDRbMl0pICYgMHhmZmZmOworICAgICAgdmFyNDYueDRbM10gPSAodmFyNDUueDRbM10gKiB2YXIzOS54NFszXSkgJiAweGZmZmY7CisgICAgICAvKiA3OiBzaHJ1dyAqLworICAgICAgdmFyNDcueDRbMF0gPSAoKG9yY191aW50MTYpIHZhcjQ2Lng0WzBdKSA+PiA4OworICAgICAgdmFyNDcueDRbMV0gPSAoKG9yY191aW50MTYpIHZhcjQ2Lng0WzFdKSA+PiA4OworICAgICAgdmFyNDcueDRbMl0gPSAoKG9yY191aW50MTYpIHZhcjQ2Lng0WzJdKSA+PiA4OworICAgICAgdmFyNDcueDRbM10gPSAoKG9yY191aW50MTYpIHZhcjQ2Lng0WzNdKSA+PiA4OworICAgICAgLyogODogY29udnVidyAqLworICAgICAgdmFyNDgueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI0MS54NFswXTsKKyAgICAgIHZhcjQ4Lng0WzFdID0gKG9yY191aW50OCkgdmFyNDEueDRbMV07CisgICAgICB2YXI0OC54NFsyXSA9IChvcmNfdWludDgpIHZhcjQxLng0WzJdOworICAgICAgdmFyNDgueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI0MS54NFszXTsKKyAgICAgIC8qIDk6IGxvYWRsICovCisgICAgICB2YXI0OSA9IHB0cjBbaV07CisgICAgICAvKiAxMDogY29udnVidyAqLworICAgICAgdmFyNTAueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI0OS54NFswXTsKKyAgICAgIHZhcjUwLng0WzFdID0gKG9yY191aW50OCkgdmFyNDkueDRbMV07CisgICAgICB2YXI1MC54NFsyXSA9IChvcmNfdWludDgpIHZhcjQ5Lng0WzJdOworICAgICAgdmFyNTAueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI0OS54NFszXTsKKyAgICAgIC8qIDExOiBzdWJ3ICovCisgICAgICB2YXI1MS54NFswXSA9IHZhcjQ4Lng0WzBdIC0gdmFyNTAueDRbMF07CisgICAgICB2YXI1MS54NFsxXSA9IHZhcjQ4Lng0WzFdIC0gdmFyNTAueDRbMV07CisgICAgICB2YXI1MS54NFsyXSA9IHZhcjQ4Lng0WzJdIC0gdmFyNTAueDRbMl07CisgICAgICB2YXI1MS54NFszXSA9IHZhcjQ4Lng0WzNdIC0gdmFyNTAueDRbM107CisgICAgICAvKiAxMjogbXVsbHcgKi8KKyAgICAgIHZhcjUyLng0WzBdID0gKHZhcjUxLng0WzBdICogdmFyNDcueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNTIueDRbMV0gPSAodmFyNTEueDRbMV0gKiB2YXI0Ny54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI1Mi54NFsyXSA9ICh2YXI1MS54NFsyXSAqIHZhcjQ3Lng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjUyLng0WzNdID0gKHZhcjUxLng0WzNdICogdmFyNDcueDRbM10pICYgMHhmZmZmOworICAgICAgLyogMTM6IGRpdjI1NXcgKi8KKyAgICAgIHZhcjUzLng0WzBdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI1Mi54NFswXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjUyLng0WzBdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgdmFyNTMueDRbMV0gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjUyLng0WzFdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNTIueDRbMV0gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICB2YXI1My54NFsyXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNTIueDRbMl0gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI1Mi54NFsyXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIHZhcjUzLng0WzNdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI1Mi54NFszXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjUyLng0WzNdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgLyogMTQ6IGFkZHcgKi8KKyAgICAgIHZhcjU0Lng0WzBdID0gdmFyNTAueDRbMF0gKyB2YXI1My54NFswXTsKKyAgICAgIHZhcjU0Lng0WzFdID0gdmFyNTAueDRbMV0gKyB2YXI1My54NFsxXTsKKyAgICAgIHZhcjU0Lng0WzJdID0gdmFyNTAueDRbMl0gKyB2YXI1My54NFsyXTsKKyAgICAgIHZhcjU0Lng0WzNdID0gdmFyNTAueDRbM10gKyB2YXI1My54NFszXTsKKyAgICAgIC8qIDE1OiBjb252d2IgKi8KKyAgICAgIHZhcjU1Lng0WzBdID0gdmFyNTQueDRbMF07CisgICAgICB2YXI1NS54NFsxXSA9IHZhcjU0Lng0WzFdOworICAgICAgdmFyNTUueDRbMl0gPSB2YXI1NC54NFsyXTsKKyAgICAgIHZhcjU1Lng0WzNdID0gdmFyNTQueDRbM107CisgICAgICAvKiAxNzogb3JsICovCisgICAgICB2YXI1Ni5pID0gdmFyNTUuaSB8IHZhcjQwLmk7CisgICAgICAvKiAxODogc3RvcmVsICovCisgICAgICBwdHIwW2ldID0gdmFyNTY7CisgICAgfQorICB9CisKK30KKwordm9pZAordmlkZW9fbWl4ZXJfb3JjX2JsZW5kX2FyZ2IgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgNywgOSwgMjYsIDExOCwgMTA1LCAxMDAsIDEwMSwgMTExLCA5NSwgMTA5LCAxMDUsIDEyMCwgMTAxLCAxMTQsIDk1LAorICAgICAgICAxMTEsIDExNCwgOTksIDk1LCA5OCwgMTA4LCAxMDEsIDExMCwgMTAwLCA5NSwgOTcsIDExNCwgMTAzLCA5OCwgMTEsIDQsCisgICAgICAgIDQsIDEyLCA0LCA0LCAxNCwgNCwgMjU1LCAwLCAwLCAwLCAxNCwgMiwgOCwgMCwgMCwgMCwKKyAgICAgICAgMTYsIDIsIDIwLCA0LCAyMCwgMiwgMjAsIDEsIDIwLCA0LCAyMCwgOCwgMjAsIDgsIDIwLCA4LAorICAgICAgICAxMTMsIDMyLCA0LCAxNjMsIDMzLCAzMiwgMTU3LCAzNCwgMzMsIDE1MiwgMzUsIDM0LCAyMSwgMiwgMTUwLCAzOCwKKyAgICAgICAgMzUsIDIxLCAyLCA4OSwgMzgsIDM4LCAyNCwgMjEsIDIsIDk1LCAzOCwgMzgsIDE3LCAyMSwgMiwgMTUwLAorICAgICAgICAzNywgMzIsIDExMywgMzIsIDAsIDIxLCAyLCAxNTAsIDM2LCAzMiwgMjEsIDIsIDk4LCAzNywgMzcsIDM2LAorICAgICAgICAyMSwgMiwgODksIDM3LCAzNywgMzgsIDIxLCAyLCA4MCwgMzcsIDM3LCAyMSwgMiwgNzAsIDM2LCAzNiwKKyAgICAgICAgMzcsIDIxLCAyLCAxNTcsIDMyLCAzNiwgMTIzLCAzMiwgMzIsIDE2LCAxMjgsIDAsIDMyLCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsIF9iYWNrdXBfdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX2FyZ2IpOworI2Vsc2UKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXcgKCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfMmQgKHApOworICAgICAgb3JjX3Byb2dyYW1fc2V0X25hbWUgKHAsICJ2aWRlb19taXhlcl9vcmNfYmxlbmRfYXJnYiIpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwgX2JhY2t1cF92aWRlb19taXhlcl9vcmNfYmxlbmRfYXJnYik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDQsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgNCwgInMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfY29uc3RhbnQgKHAsIDQsIDB4MDAwMDAwZmYsICJjMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2NvbnN0YW50IChwLCAyLCAweDAwMDAwMDA4LCAiYzIiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXIgKHAsIDIsICJwMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCAyLCAidDIiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDEsICJ0MyIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQ0Iik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA4LCAidDUiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDgsICJ0NiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgOCwgInQ3Iik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibG9hZGwiLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1MxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252bHciLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252d2IiLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QyLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJzcGxhdGJsIiwgMCwgT1JDX1ZBUl9UNCwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnVidyIsIDIsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDQsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGx3IiwgMiwgT1JDX1ZBUl9UNywgT1JDX1ZBUl9UNywgT1JDX1ZBUl9QMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2hydXciLCAyLCBPUkNfVkFSX1Q3LCBPUkNfVkFSX1Q3LCBPUkNfVkFSX0MyLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMiwgT1JDX1ZBUl9UNiwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibG9hZGwiLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0QxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMiwgT1JDX1ZBUl9UNSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic3VidyIsIDIsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDUsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGx3IiwgMiwgT1JDX1ZBUl9UNiwgT1JDX1ZBUl9UNiwgT1JDX1ZBUl9UNywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiZGl2MjU1dyIsIDIsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDYsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImFkZHciLCAyLCBPUkNfVkFSX1Q1LCBPUkNfVkFSX1Q1LCBPUkNfVkFSX1Q2LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252d2IiLCAyLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1Q1LCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJvcmwiLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0MxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJzdG9yZWwiLCAwLCBPUkNfVkFSX0QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworI2VuZGlmCisKKyAgICAgIG9yY19wcm9ncmFtX2NvbXBpbGUgKHApOworICAgICAgYyA9IG9yY19wcm9ncmFtX3Rha2VfY29kZSAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9mcmVlIChwKTsKKyAgICB9CisgICAgcF9pbml0ZWQgPSBUUlVFOworICAgIG9yY19vbmNlX211dGV4X3VubG9jayAoKTsKKyAgfQorICBleC0+YXJyYXlzW09SQ19WQVJfQTJdID0gYzsKKyAgZXgtPnByb2dyYW0gPSAwOworCisgIGV4LT5uID0gbjsKKyAgT1JDX0VYRUNVVE9SX00gKGV4KSA9IG07CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9EMV0gPSBkMTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX0QxXSA9IGQxX3N0cmlkZTsKKyAgZXgtPmFycmF5c1tPUkNfVkFSX1MxXSA9ICh2b2lkICopIHMxOworICBleC0+cGFyYW1zW09SQ19WQVJfUzFdID0gczFfc3RyaWRlOworICBleC0+cGFyYW1zW09SQ19WQVJfUDFdID0gcDE7CisKKyAgZnVuYyA9IGMtPmV4ZWM7CisgIGZ1bmMgKGV4KTsKK30KKyNlbmRpZgorCisKKy8qIHZpZGVvX21peGVyX29yY19ibGVuZF9iZ3JhICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK3ZpZGVvX21peGVyX29yY19ibGVuZF9iZ3JhIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBkMV9zdHJpZGUsCisgICAgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBpbnQgczFfc3RyaWRlLCBpbnQgcDEsIGludCBuLCBpbnQgbSkKK3sKKyAgaW50IGk7CisgIGludCBqOworICBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjA7CisgIGNvbnN0IG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyNDsKKyAgb3JjX3VuaW9uNjQgdmFyNDA7CisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPT0gMiAmJiBkZWZpbmVkIChfX2kzODZfXykKKyAgdm9sYXRpbGUgb3JjX3VuaW9uMzIgdmFyNDE7CisjZWxzZQorICBvcmNfdW5pb24zMiB2YXI0MTsKKyNlbmRpZgorICBvcmNfdW5pb24zMiB2YXI0MjsKKyAgb3JjX3VuaW9uMzIgdmFyNDM7CisgIG9yY191bmlvbjE2IHZhcjQ0OworICBvcmNfaW50OCB2YXI0NTsKKyAgb3JjX3VuaW9uMzIgdmFyNDY7CisgIG9yY191bmlvbjY0IHZhcjQ3OworICBvcmNfdW5pb242NCB2YXI0ODsKKyAgb3JjX3VuaW9uNjQgdmFyNDk7CisgIG9yY191bmlvbjY0IHZhcjUwOworICBvcmNfdW5pb24zMiB2YXI1MTsKKyAgb3JjX3VuaW9uNjQgdmFyNTI7CisgIG9yY191bmlvbjY0IHZhcjUzOworICBvcmNfdW5pb242NCB2YXI1NDsKKyAgb3JjX3VuaW9uNjQgdmFyNTU7CisgIG9yY191bmlvbjY0IHZhcjU2OworICBvcmNfdW5pb24zMiB2YXI1NzsKKyAgb3JjX3VuaW9uMzIgdmFyNTg7CisKKyAgZm9yIChqID0gMDsgaiA8IG07IGorKykgeworICAgIHB0cjAgPSBPUkNfUFRSX09GRlNFVCAoZDEsIGQxX3N0cmlkZSAqIGopOworICAgIHB0cjQgPSBPUkNfUFRSX09GRlNFVCAoczEsIHMxX3N0cmlkZSAqIGopOworCisgICAgLyogNjogbG9hZHB3ICovCisgICAgdmFyNDAueDRbMF0gPSBwMTsKKyAgICB2YXI0MC54NFsxXSA9IHAxOworICAgIHZhcjQwLng0WzJdID0gcDE7CisgICAgdmFyNDAueDRbM10gPSBwMTsKKyAgICAvKiAxNzogbG9hZHBsICovCisgICAgdmFyNDEuaSA9IDB4ZmYwMDAwMDA7ICAgICAgIC8qIC0xNjc3NzIxNiBvciAyLjExMzcxZS0zMTRmICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAvKiAwOiBsb2FkbCAqLworICAgICAgdmFyNDIgPSBwdHI0W2ldOworICAgICAgLyogMTogc2hydWwgKi8KKyAgICAgIHZhcjQzLmkgPSAoKG9yY191aW50MzIpIHZhcjQyLmkpID4+IDI0OworICAgICAgLyogMjogY29udmx3ICovCisgICAgICB2YXI0NC5pID0gdmFyNDMuaTsKKyAgICAgIC8qIDM6IGNvbnZ3YiAqLworICAgICAgdmFyNDUgPSB2YXI0NC5pOworICAgICAgLyogNDogc3BsYXRibCAqLworICAgICAgdmFyNDYuaSA9CisgICAgICAgICAgKCgoKG9yY191aW50MzIpIHZhcjQ1KSAmIDB4ZmYpIDw8IDI0KSB8ICgoKChvcmNfdWludDMyKSB2YXI0NSkgJiAweGZmKQorICAgICAgICAgIDw8IDE2KSB8ICgoKChvcmNfdWludDMyKSB2YXI0NSkgJiAweGZmKSA8PCA4KSB8ICgoKG9yY191aW50MzIpIHZhcjQ1KQorICAgICAgICAgICYgMHhmZik7CisgICAgICAvKiA1OiBjb252dWJ3ICovCisgICAgICB2YXI0Ny54NFswXSA9IChvcmNfdWludDgpIHZhcjQ2Lng0WzBdOworICAgICAgdmFyNDcueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI0Ni54NFsxXTsKKyAgICAgIHZhcjQ3Lng0WzJdID0gKG9yY191aW50OCkgdmFyNDYueDRbMl07CisgICAgICB2YXI0Ny54NFszXSA9IChvcmNfdWludDgpIHZhcjQ2Lng0WzNdOworICAgICAgLyogNzogbXVsbHcgKi8KKyAgICAgIHZhcjQ4Lng0WzBdID0gKHZhcjQ3Lng0WzBdICogdmFyNDAueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNDgueDRbMV0gPSAodmFyNDcueDRbMV0gKiB2YXI0MC54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI0OC54NFsyXSA9ICh2YXI0Ny54NFsyXSAqIHZhcjQwLng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjQ4Lng0WzNdID0gKHZhcjQ3Lng0WzNdICogdmFyNDAueDRbM10pICYgMHhmZmZmOworICAgICAgLyogODogc2hydXcgKi8KKyAgICAgIHZhcjQ5Lng0WzBdID0gKChvcmNfdWludDE2KSB2YXI0OC54NFswXSkgPj4gODsKKyAgICAgIHZhcjQ5Lng0WzFdID0gKChvcmNfdWludDE2KSB2YXI0OC54NFsxXSkgPj4gODsKKyAgICAgIHZhcjQ5Lng0WzJdID0gKChvcmNfdWludDE2KSB2YXI0OC54NFsyXSkgPj4gODsKKyAgICAgIHZhcjQ5Lng0WzNdID0gKChvcmNfdWludDE2KSB2YXI0OC54NFszXSkgPj4gODsKKyAgICAgIC8qIDk6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjUwLng0WzBdID0gKG9yY191aW50OCkgdmFyNDIueDRbMF07CisgICAgICB2YXI1MC54NFsxXSA9IChvcmNfdWludDgpIHZhcjQyLng0WzFdOworICAgICAgdmFyNTAueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI0Mi54NFsyXTsKKyAgICAgIHZhcjUwLng0WzNdID0gKG9yY191aW50OCkgdmFyNDIueDRbM107CisgICAgICAvKiAxMDogbG9hZGwgKi8KKyAgICAgIHZhcjUxID0gcHRyMFtpXTsKKyAgICAgIC8qIDExOiBjb252dWJ3ICovCisgICAgICB2YXI1Mi54NFswXSA9IChvcmNfdWludDgpIHZhcjUxLng0WzBdOworICAgICAgdmFyNTIueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI1MS54NFsxXTsKKyAgICAgIHZhcjUyLng0WzJdID0gKG9yY191aW50OCkgdmFyNTEueDRbMl07CisgICAgICB2YXI1Mi54NFszXSA9IChvcmNfdWludDgpIHZhcjUxLng0WzNdOworICAgICAgLyogMTI6IHN1YncgKi8KKyAgICAgIHZhcjUzLng0WzBdID0gdmFyNTAueDRbMF0gLSB2YXI1Mi54NFswXTsKKyAgICAgIHZhcjUzLng0WzFdID0gdmFyNTAueDRbMV0gLSB2YXI1Mi54NFsxXTsKKyAgICAgIHZhcjUzLng0WzJdID0gdmFyNTAueDRbMl0gLSB2YXI1Mi54NFsyXTsKKyAgICAgIHZhcjUzLng0WzNdID0gdmFyNTAueDRbM10gLSB2YXI1Mi54NFszXTsKKyAgICAgIC8qIDEzOiBtdWxsdyAqLworICAgICAgdmFyNTQueDRbMF0gPSAodmFyNTMueDRbMF0gKiB2YXI0OS54NFswXSkgJiAweGZmZmY7CisgICAgICB2YXI1NC54NFsxXSA9ICh2YXI1My54NFsxXSAqIHZhcjQ5Lng0WzFdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjU0Lng0WzJdID0gKHZhcjUzLng0WzJdICogdmFyNDkueDRbMl0pICYgMHhmZmZmOworICAgICAgdmFyNTQueDRbM10gPSAodmFyNTMueDRbM10gKiB2YXI0OS54NFszXSkgJiAweGZmZmY7CisgICAgICAvKiAxNDogZGl2MjU1dyAqLworICAgICAgdmFyNTUueDRbMF0gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjU0Lng0WzBdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNTQueDRbMF0gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICB2YXI1NS54NFsxXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNTQueDRbMV0gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI1NC54NFsxXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIHZhcjU1Lng0WzJdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI1NC54NFsyXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjU0Lng0WzJdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgdmFyNTUueDRbM10gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjU0Lng0WzNdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNTQueDRbM10gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICAvKiAxNTogYWRkdyAqLworICAgICAgdmFyNTYueDRbMF0gPSB2YXI1Mi54NFswXSArIHZhcjU1Lng0WzBdOworICAgICAgdmFyNTYueDRbMV0gPSB2YXI1Mi54NFsxXSArIHZhcjU1Lng0WzFdOworICAgICAgdmFyNTYueDRbMl0gPSB2YXI1Mi54NFsyXSArIHZhcjU1Lng0WzJdOworICAgICAgdmFyNTYueDRbM10gPSB2YXI1Mi54NFszXSArIHZhcjU1Lng0WzNdOworICAgICAgLyogMTY6IGNvbnZ3YiAqLworICAgICAgdmFyNTcueDRbMF0gPSB2YXI1Ni54NFswXTsKKyAgICAgIHZhcjU3Lng0WzFdID0gdmFyNTYueDRbMV07CisgICAgICB2YXI1Ny54NFsyXSA9IHZhcjU2Lng0WzJdOworICAgICAgdmFyNTcueDRbM10gPSB2YXI1Ni54NFszXTsKKyAgICAgIC8qIDE4OiBvcmwgKi8KKyAgICAgIHZhcjU4LmkgPSB2YXI1Ny5pIHwgdmFyNDEuaTsKKyAgICAgIC8qIDE5OiBzdG9yZWwgKi8KKyAgICAgIHB0cjBbaV0gPSB2YXI1ODsKKyAgICB9CisgIH0KKworfQorCisjZWxzZQorc3RhdGljIHZvaWQKK19iYWNrdXBfdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX2JncmEgKE9yY0V4ZWN1dG9yICogT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IGo7CisgIGludCBuID0gZXgtPm47CisgIGludCBtID0gZXgtPnBhcmFtc1tPUkNfVkFSX0ExXTsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjY0IHZhcjQwOworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID09IDIgJiYgZGVmaW5lZCAoX19pMzg2X18pCisgIHZvbGF0aWxlIG9yY191bmlvbjMyIHZhcjQxOworI2Vsc2UKKyAgb3JjX3VuaW9uMzIgdmFyNDE7CisjZW5kaWYKKyAgb3JjX3VuaW9uMzIgdmFyNDI7CisgIG9yY191bmlvbjMyIHZhcjQzOworICBvcmNfdW5pb24xNiB2YXI0NDsKKyAgb3JjX2ludDggdmFyNDU7CisgIG9yY191bmlvbjMyIHZhcjQ2OworICBvcmNfdW5pb242NCB2YXI0NzsKKyAgb3JjX3VuaW9uNjQgdmFyNDg7CisgIG9yY191bmlvbjY0IHZhcjQ5OworICBvcmNfdW5pb242NCB2YXI1MDsKKyAgb3JjX3VuaW9uMzIgdmFyNTE7CisgIG9yY191bmlvbjY0IHZhcjUyOworICBvcmNfdW5pb242NCB2YXI1MzsKKyAgb3JjX3VuaW9uNjQgdmFyNTQ7CisgIG9yY191bmlvbjY0IHZhcjU1OworICBvcmNfdW5pb242NCB2YXI1NjsKKyAgb3JjX3VuaW9uMzIgdmFyNTc7CisgIG9yY191bmlvbjMyIHZhcjU4OworCisgIGZvciAoaiA9IDA7IGogPCBtOyBqKyspIHsKKyAgICBwdHIwID0gT1JDX1BUUl9PRkZTRVQgKGV4LT5hcnJheXNbMF0sIGV4LT5wYXJhbXNbMF0gKiBqKTsKKyAgICBwdHI0ID0gT1JDX1BUUl9PRkZTRVQgKGV4LT5hcnJheXNbNF0sIGV4LT5wYXJhbXNbNF0gKiBqKTsKKworICAgIC8qIDY6IGxvYWRwdyAqLworICAgIHZhcjQwLng0WzBdID0gZXgtPnBhcmFtc1syNF07CisgICAgdmFyNDAueDRbMV0gPSBleC0+cGFyYW1zWzI0XTsKKyAgICB2YXI0MC54NFsyXSA9IGV4LT5wYXJhbXNbMjRdOworICAgIHZhcjQwLng0WzNdID0gZXgtPnBhcmFtc1syNF07CisgICAgLyogMTc6IGxvYWRwbCAqLworICAgIHZhcjQxLmkgPSAweGZmMDAwMDAwOyAgICAgICAvKiAtMTY3NzcyMTYgb3IgMi4xMTM3MWUtMzE0ZiAqLworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgLyogMDogbG9hZGwgKi8KKyAgICAgIHZhcjQyID0gcHRyNFtpXTsKKyAgICAgIC8qIDE6IHNocnVsICovCisgICAgICB2YXI0My5pID0gKChvcmNfdWludDMyKSB2YXI0Mi5pKSA+PiAyNDsKKyAgICAgIC8qIDI6IGNvbnZsdyAqLworICAgICAgdmFyNDQuaSA9IHZhcjQzLmk7CisgICAgICAvKiAzOiBjb252d2IgKi8KKyAgICAgIHZhcjQ1ID0gdmFyNDQuaTsKKyAgICAgIC8qIDQ6IHNwbGF0YmwgKi8KKyAgICAgIHZhcjQ2LmkgPQorICAgICAgICAgICgoKChvcmNfdWludDMyKSB2YXI0NSkgJiAweGZmKSA8PCAyNCkgfCAoKCgob3JjX3VpbnQzMikgdmFyNDUpICYgMHhmZikKKyAgICAgICAgICA8PCAxNikgfCAoKCgob3JjX3VpbnQzMikgdmFyNDUpICYgMHhmZikgPDwgOCkgfCAoKChvcmNfdWludDMyKSB2YXI0NSkKKyAgICAgICAgICAmIDB4ZmYpOworICAgICAgLyogNTogY29udnVidyAqLworICAgICAgdmFyNDcueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI0Ni54NFswXTsKKyAgICAgIHZhcjQ3Lng0WzFdID0gKG9yY191aW50OCkgdmFyNDYueDRbMV07CisgICAgICB2YXI0Ny54NFsyXSA9IChvcmNfdWludDgpIHZhcjQ2Lng0WzJdOworICAgICAgdmFyNDcueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI0Ni54NFszXTsKKyAgICAgIC8qIDc6IG11bGx3ICovCisgICAgICB2YXI0OC54NFswXSA9ICh2YXI0Ny54NFswXSAqIHZhcjQwLng0WzBdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjQ4Lng0WzFdID0gKHZhcjQ3Lng0WzFdICogdmFyNDAueDRbMV0pICYgMHhmZmZmOworICAgICAgdmFyNDgueDRbMl0gPSAodmFyNDcueDRbMl0gKiB2YXI0MC54NFsyXSkgJiAweGZmZmY7CisgICAgICB2YXI0OC54NFszXSA9ICh2YXI0Ny54NFszXSAqIHZhcjQwLng0WzNdKSAmIDB4ZmZmZjsKKyAgICAgIC8qIDg6IHNocnV3ICovCisgICAgICB2YXI0OS54NFswXSA9ICgob3JjX3VpbnQxNikgdmFyNDgueDRbMF0pID4+IDg7CisgICAgICB2YXI0OS54NFsxXSA9ICgob3JjX3VpbnQxNikgdmFyNDgueDRbMV0pID4+IDg7CisgICAgICB2YXI0OS54NFsyXSA9ICgob3JjX3VpbnQxNikgdmFyNDgueDRbMl0pID4+IDg7CisgICAgICB2YXI0OS54NFszXSA9ICgob3JjX3VpbnQxNikgdmFyNDgueDRbM10pID4+IDg7CisgICAgICAvKiA5OiBjb252dWJ3ICovCisgICAgICB2YXI1MC54NFswXSA9IChvcmNfdWludDgpIHZhcjQyLng0WzBdOworICAgICAgdmFyNTAueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI0Mi54NFsxXTsKKyAgICAgIHZhcjUwLng0WzJdID0gKG9yY191aW50OCkgdmFyNDIueDRbMl07CisgICAgICB2YXI1MC54NFszXSA9IChvcmNfdWludDgpIHZhcjQyLng0WzNdOworICAgICAgLyogMTA6IGxvYWRsICovCisgICAgICB2YXI1MSA9IHB0cjBbaV07CisgICAgICAvKiAxMTogY29udnVidyAqLworICAgICAgdmFyNTIueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI1MS54NFswXTsKKyAgICAgIHZhcjUyLng0WzFdID0gKG9yY191aW50OCkgdmFyNTEueDRbMV07CisgICAgICB2YXI1Mi54NFsyXSA9IChvcmNfdWludDgpIHZhcjUxLng0WzJdOworICAgICAgdmFyNTIueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI1MS54NFszXTsKKyAgICAgIC8qIDEyOiBzdWJ3ICovCisgICAgICB2YXI1My54NFswXSA9IHZhcjUwLng0WzBdIC0gdmFyNTIueDRbMF07CisgICAgICB2YXI1My54NFsxXSA9IHZhcjUwLng0WzFdIC0gdmFyNTIueDRbMV07CisgICAgICB2YXI1My54NFsyXSA9IHZhcjUwLng0WzJdIC0gdmFyNTIueDRbMl07CisgICAgICB2YXI1My54NFszXSA9IHZhcjUwLng0WzNdIC0gdmFyNTIueDRbM107CisgICAgICAvKiAxMzogbXVsbHcgKi8KKyAgICAgIHZhcjU0Lng0WzBdID0gKHZhcjUzLng0WzBdICogdmFyNDkueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNTQueDRbMV0gPSAodmFyNTMueDRbMV0gKiB2YXI0OS54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI1NC54NFsyXSA9ICh2YXI1My54NFsyXSAqIHZhcjQ5Lng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjU0Lng0WzNdID0gKHZhcjUzLng0WzNdICogdmFyNDkueDRbM10pICYgMHhmZmZmOworICAgICAgLyogMTQ6IGRpdjI1NXcgKi8KKyAgICAgIHZhcjU1Lng0WzBdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI1NC54NFswXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjU0Lng0WzBdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgdmFyNTUueDRbMV0gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjU0Lng0WzFdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNTQueDRbMV0gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICB2YXI1NS54NFsyXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNTQueDRbMl0gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI1NC54NFsyXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIHZhcjU1Lng0WzNdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI1NC54NFszXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjU0Lng0WzNdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgLyogMTU6IGFkZHcgKi8KKyAgICAgIHZhcjU2Lng0WzBdID0gdmFyNTIueDRbMF0gKyB2YXI1NS54NFswXTsKKyAgICAgIHZhcjU2Lng0WzFdID0gdmFyNTIueDRbMV0gKyB2YXI1NS54NFsxXTsKKyAgICAgIHZhcjU2Lng0WzJdID0gdmFyNTIueDRbMl0gKyB2YXI1NS54NFsyXTsKKyAgICAgIHZhcjU2Lng0WzNdID0gdmFyNTIueDRbM10gKyB2YXI1NS54NFszXTsKKyAgICAgIC8qIDE2OiBjb252d2IgKi8KKyAgICAgIHZhcjU3Lng0WzBdID0gdmFyNTYueDRbMF07CisgICAgICB2YXI1Ny54NFsxXSA9IHZhcjU2Lng0WzFdOworICAgICAgdmFyNTcueDRbMl0gPSB2YXI1Ni54NFsyXTsKKyAgICAgIHZhcjU3Lng0WzNdID0gdmFyNTYueDRbM107CisgICAgICAvKiAxODogb3JsICovCisgICAgICB2YXI1OC5pID0gdmFyNTcuaSB8IHZhcjQxLmk7CisgICAgICAvKiAxOTogc3RvcmVsICovCisgICAgICBwdHIwW2ldID0gdmFyNTg7CisgICAgfQorICB9CisKK30KKwordm9pZAordmlkZW9fbWl4ZXJfb3JjX2JsZW5kX2JncmEgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgNywgOSwgMjYsIDExOCwgMTA1LCAxMDAsIDEwMSwgMTExLCA5NSwgMTA5LCAxMDUsIDEyMCwgMTAxLCAxMTQsIDk1LAorICAgICAgICAxMTEsIDExNCwgOTksIDk1LCA5OCwgMTA4LCAxMDEsIDExMCwgMTAwLCA5NSwgOTgsIDEwMywgMTE0LCA5NywgMTEsIDQsCisgICAgICAgIDQsIDEyLCA0LCA0LCAxNCwgNCwgMCwgMCwgMCwgMjU1LCAxNCwgNCwgMjQsIDAsIDAsIDAsCisgICAgICAgIDE0LCAyLCA4LCAwLCAwLCAwLCAxNiwgMiwgMjAsIDQsIDIwLCA0LCAyMCwgMiwgMjAsIDEsCisgICAgICAgIDIwLCA0LCAyMCwgOCwgMjAsIDgsIDIwLCA4LCAxMTMsIDMyLCA0LCAxMjYsIDMzLCAzMiwgMTcsIDE2MywKKyAgICAgICAgMzQsIDMzLCAxNTcsIDM1LCAzNCwgMTUyLCAzNiwgMzUsIDIxLCAyLCAxNTAsIDM5LCAzNiwgMjEsIDIsIDg5LAorICAgICAgICAzOSwgMzksIDI0LCAyMSwgMiwgOTUsIDM5LCAzOSwgMTgsIDIxLCAyLCAxNTAsIDM4LCAzMiwgMTEzLCAzMiwKKyAgICAgICAgMCwgMjEsIDIsIDE1MCwgMzcsIDMyLCAyMSwgMiwgOTgsIDM4LCAzOCwgMzcsIDIxLCAyLCA4OSwgMzgsCisgICAgICAgIDM4LCAzOSwgMjEsIDIsIDgwLCAzOCwgMzgsIDIxLCAyLCA3MCwgMzcsIDM3LCAzOCwgMjEsIDIsIDE1NywKKyAgICAgICAgMzIsIDM3LCAxMjMsIDMyLCAzMiwgMTYsIDEyOCwgMCwgMzIsIDIsIDAsCisgICAgICB9OworICAgICAgcCA9IG9yY19wcm9ncmFtX25ld19mcm9tX3N0YXRpY19ieXRlY29kZSAoYmMpOworICAgICAgb3JjX3Byb2dyYW1fc2V0X2JhY2t1cF9mdW5jdGlvbiAocCwgX2JhY2t1cF92aWRlb19taXhlcl9vcmNfYmxlbmRfYmdyYSk7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF8yZCAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgInZpZGVvX21peGVyX29yY19ibGVuZF9iZ3JhIik7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfYmFja3VwX2Z1bmN0aW9uIChwLCBfYmFja3VwX3ZpZGVvX21peGVyX29yY19ibGVuZF9iZ3JhKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9kZXN0aW5hdGlvbiAocCwgNCwgImQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfc291cmNlIChwLCA0LCAiczEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9jb25zdGFudCAocCwgNCwgMHhmZjAwMDAwMCwgImMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfY29uc3RhbnQgKHAsIDQsIDB4MDAwMDAwMTgsICJjMiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2NvbnN0YW50IChwLCAyLCAweDAwMDAwMDA4LCAiYzMiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXIgKHAsIDIsICJwMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDIiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDIsICJ0MyIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgMSwgInQ0Iik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDUiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDgsICJ0NiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgOCwgInQ3Iik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA4LCAidDgiKTsKKworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJsb2FkbCIsIDAsIE9SQ19WQVJfVDEsIE9SQ19WQVJfUzEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInNocnVsIiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9DMiwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udmx3IiwgMCwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udndiIiwgMCwgT1JDX1ZBUl9UNCwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic3BsYXRibCIsIDAsIE9SQ19WQVJfVDUsIE9SQ19WQVJfVDQsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZ1YnciLCAyLCBPUkNfVkFSX1Q4LCBPUkNfVkFSX1Q1LCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtdWxsdyIsIDIsIE9SQ19WQVJfVDgsIE9SQ19WQVJfVDgsIE9SQ19WQVJfUDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInNocnV3IiwgMiwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9DMywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnVidyIsIDIsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImxvYWRsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnVidyIsIDIsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDEsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgInN1YnciLCAyLCBPUkNfVkFSX1Q3LCBPUkNfVkFSX1Q3LCBPUkNfVkFSX1Q2LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtdWxsdyIsIDIsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDgsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImRpdjI1NXciLCAyLCBPUkNfVkFSX1Q3LCBPUkNfVkFSX1Q3LCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhZGR3IiwgMiwgT1JDX1ZBUl9UNiwgT1JDX1ZBUl9UNiwgT1JDX1ZBUl9UNywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udndiIiwgMiwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UNiwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAib3JsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9DMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic3RvcmVsIiwgMCwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIE9SQ19FWEVDVVRPUl9NIChleCkgPSBtOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5wYXJhbXNbT1JDX1ZBUl9EMV0gPSBkMV9zdHJpZGU7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1MxXSA9IHMxX3N0cmlkZTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHAxOworCisgIGZ1bmMgPSBjLT5leGVjOworICBmdW5jIChleCk7Cit9CisjZW5kaWYKKworCisvKiB2aWRlb19taXhlcl9vcmNfb3ZlcmxheV9hcmdiICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK3ZpZGVvX21peGVyX29yY19vdmVybGF5X2FyZ2IgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKQoreworICBpbnQgaTsKKyAgaW50IGo7CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb242NCB2YXI0MTsKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA9PSAyICYmIGRlZmluZWQgKF9faTM4Nl9fKQorICB2b2xhdGlsZSBvcmNfdW5pb24zMiB2YXI0MjsKKyNlbHNlCisgIG9yY191bmlvbjMyIHZhcjQyOworI2VuZGlmCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPT0gMiAmJiBkZWZpbmVkIChfX2kzODZfXykKKyAgdm9sYXRpbGUgb3JjX3VuaW9uMzIgdmFyNDM7CisjZWxzZQorICBvcmNfdW5pb24zMiB2YXI0MzsKKyNlbmRpZgorICBvcmNfdW5pb24zMiB2YXI0NDsKKyAgb3JjX3VuaW9uMTYgdmFyNDU7CisgIG9yY19pbnQ4IHZhcjQ2OworICBvcmNfdW5pb24zMiB2YXI0NzsKKyAgb3JjX3VuaW9uNjQgdmFyNDg7CisgIG9yY191bmlvbjY0IHZhcjQ5OworICBvcmNfdW5pb242NCB2YXI1MDsKKyAgb3JjX3VuaW9uNjQgdmFyNTE7CisgIG9yY191bmlvbjY0IHZhcjUyOworICBvcmNfdW5pb24zMiB2YXI1MzsKKyAgb3JjX3VuaW9uNjQgdmFyNTQ7CisgIG9yY191bmlvbjY0IHZhcjU1OworICBvcmNfdW5pb24zMiB2YXI1NjsKKyAgb3JjX3VuaW9uMTYgdmFyNTc7CisgIG9yY19pbnQ4IHZhcjU4OworICBvcmNfdW5pb24zMiB2YXI1OTsKKyAgb3JjX3VuaW9uNjQgdmFyNjA7CisgIG9yY191bmlvbjY0IHZhcjYxOworICBvcmNfdW5pb242NCB2YXI2MjsKKyAgb3JjX3VuaW9uNjQgdmFyNjM7CisgIG9yY191bmlvbjY0IHZhcjY0OworICBvcmNfdW5pb242NCB2YXI2NTsKKyAgb3JjX3VuaW9uNjQgdmFyNjY7CisgIG9yY191bmlvbjY0IHZhcjY3OworICBvcmNfdW5pb24zMiB2YXI2ODsKKyAgb3JjX3VuaW9uMzIgdmFyNjk7CisgIG9yY191bmlvbjMyIHZhcjcwOworICBvcmNfdW5pb24zMiB2YXI3MTsKKyAgb3JjX3VuaW9uMzIgdmFyNzI7CisKKyAgZm9yIChqID0gMDsgaiA8IG07IGorKykgeworICAgIHB0cjAgPSBPUkNfUFRSX09GRlNFVCAoZDEsIGQxX3N0cmlkZSAqIGopOworICAgIHB0cjQgPSBPUkNfUFRSX09GRlNFVCAoczEsIHMxX3N0cmlkZSAqIGopOworCisgICAgLyogNTogbG9hZHB3ICovCisgICAgdmFyNDEueDRbMF0gPSBwMTsKKyAgICB2YXI0MS54NFsxXSA9IHAxOworICAgIHZhcjQxLng0WzJdID0gcDE7CisgICAgdmFyNDEueDRbM10gPSBwMTsKKyAgICAvKiAxMDogbG9hZHBsICovCisgICAgdmFyNTMuaSA9IDB4ZmZmZmZmZmY7ICAgICAgIC8qIC0xIG9yIDIuMTIyZS0zMTRmICovCisgICAgLyogMjY6IGxvYWRwbCAqLworICAgIHZhcjQyLmkgPSAweGZmZmZmZjAwOyAgICAgICAvKiAtMjU2IG9yIDIuMTIyZS0zMTRmICovCisgICAgLyogMjk6IGxvYWRwbCAqLworICAgIHZhcjQzLmkgPSAweDAwMDAwMGZmOyAgICAgICAvKiAyNTUgb3IgMS4yNTk4N2UtMzIxZiAqLworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgLyogMDogbG9hZGwgKi8KKyAgICAgIHZhcjQ0ID0gcHRyNFtpXTsKKyAgICAgIC8qIDE6IGNvbnZsdyAqLworICAgICAgdmFyNDUuaSA9IHZhcjQ0Lmk7CisgICAgICAvKiAyOiBjb252d2IgKi8KKyAgICAgIHZhcjQ2ID0gdmFyNDUuaTsKKyAgICAgIC8qIDM6IHNwbGF0YmwgKi8KKyAgICAgIHZhcjQ3LmkgPQorICAgICAgICAgICgoKChvcmNfdWludDMyKSB2YXI0NikgJiAweGZmKSA8PCAyNCkgfCAoKCgob3JjX3VpbnQzMikgdmFyNDYpICYgMHhmZikKKyAgICAgICAgICA8PCAxNikgfCAoKCgob3JjX3VpbnQzMikgdmFyNDYpICYgMHhmZikgPDwgOCkgfCAoKChvcmNfdWludDMyKSB2YXI0NikKKyAgICAgICAgICAmIDB4ZmYpOworICAgICAgLyogNDogY29udnVidyAqLworICAgICAgdmFyNDgueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI0Ny54NFswXTsKKyAgICAgIHZhcjQ4Lng0WzFdID0gKG9yY191aW50OCkgdmFyNDcueDRbMV07CisgICAgICB2YXI0OC54NFsyXSA9IChvcmNfdWludDgpIHZhcjQ3Lng0WzJdOworICAgICAgdmFyNDgueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI0Ny54NFszXTsKKyAgICAgIC8qIDY6IG11bGx3ICovCisgICAgICB2YXI0OS54NFswXSA9ICh2YXI0OC54NFswXSAqIHZhcjQxLng0WzBdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjQ5Lng0WzFdID0gKHZhcjQ4Lng0WzFdICogdmFyNDEueDRbMV0pICYgMHhmZmZmOworICAgICAgdmFyNDkueDRbMl0gPSAodmFyNDgueDRbMl0gKiB2YXI0MS54NFsyXSkgJiAweGZmZmY7CisgICAgICB2YXI0OS54NFszXSA9ICh2YXI0OC54NFszXSAqIHZhcjQxLng0WzNdKSAmIDB4ZmZmZjsKKyAgICAgIC8qIDc6IHNocnV3ICovCisgICAgICB2YXI1MC54NFswXSA9ICgob3JjX3VpbnQxNikgdmFyNDkueDRbMF0pID4+IDg7CisgICAgICB2YXI1MC54NFsxXSA9ICgob3JjX3VpbnQxNikgdmFyNDkueDRbMV0pID4+IDg7CisgICAgICB2YXI1MC54NFsyXSA9ICgob3JjX3VpbnQxNikgdmFyNDkueDRbMl0pID4+IDg7CisgICAgICB2YXI1MC54NFszXSA9ICgob3JjX3VpbnQxNikgdmFyNDkueDRbM10pID4+IDg7CisgICAgICAvKiA4OiBjb252dWJ3ICovCisgICAgICB2YXI1MS54NFswXSA9IChvcmNfdWludDgpIHZhcjQ0Lng0WzBdOworICAgICAgdmFyNTEueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI0NC54NFsxXTsKKyAgICAgIHZhcjUxLng0WzJdID0gKG9yY191aW50OCkgdmFyNDQueDRbMl07CisgICAgICB2YXI1MS54NFszXSA9IChvcmNfdWludDgpIHZhcjQ0Lng0WzNdOworICAgICAgLyogOTogbXVsbHcgKi8KKyAgICAgIHZhcjUyLng0WzBdID0gKHZhcjUxLng0WzBdICogdmFyNTAueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNTIueDRbMV0gPSAodmFyNTEueDRbMV0gKiB2YXI1MC54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI1Mi54NFsyXSA9ICh2YXI1MS54NFsyXSAqIHZhcjUwLng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjUyLng0WzNdID0gKHZhcjUxLng0WzNdICogdmFyNTAueDRbM10pICYgMHhmZmZmOworICAgICAgLyogMTE6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjU0Lng0WzBdID0gKG9yY191aW50OCkgdmFyNTMueDRbMF07CisgICAgICB2YXI1NC54NFsxXSA9IChvcmNfdWludDgpIHZhcjUzLng0WzFdOworICAgICAgdmFyNTQueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI1My54NFsyXTsKKyAgICAgIHZhcjU0Lng0WzNdID0gKG9yY191aW50OCkgdmFyNTMueDRbM107CisgICAgICAvKiAxMjogc3VidyAqLworICAgICAgdmFyNTUueDRbMF0gPSB2YXI1NC54NFswXSAtIHZhcjUwLng0WzBdOworICAgICAgdmFyNTUueDRbMV0gPSB2YXI1NC54NFsxXSAtIHZhcjUwLng0WzFdOworICAgICAgdmFyNTUueDRbMl0gPSB2YXI1NC54NFsyXSAtIHZhcjUwLng0WzJdOworICAgICAgdmFyNTUueDRbM10gPSB2YXI1NC54NFszXSAtIHZhcjUwLng0WzNdOworICAgICAgLyogMTM6IGxvYWRsICovCisgICAgICB2YXI1NiA9IHB0cjBbaV07CisgICAgICAvKiAxNDogY29udmx3ICovCisgICAgICB2YXI1Ny5pID0gdmFyNTYuaTsKKyAgICAgIC8qIDE1OiBjb252d2IgKi8KKyAgICAgIHZhcjU4ID0gdmFyNTcuaTsKKyAgICAgIC8qIDE2OiBzcGxhdGJsICovCisgICAgICB2YXI1OS5pID0KKyAgICAgICAgICAoKCgob3JjX3VpbnQzMikgdmFyNTgpICYgMHhmZikgPDwgMjQpIHwgKCgoKG9yY191aW50MzIpIHZhcjU4KSAmIDB4ZmYpCisgICAgICAgICAgPDwgMTYpIHwgKCgoKG9yY191aW50MzIpIHZhcjU4KSAmIDB4ZmYpIDw8IDgpIHwgKCgob3JjX3VpbnQzMikgdmFyNTgpCisgICAgICAgICAgJiAweGZmKTsKKyAgICAgIC8qIDE3OiBjb252dWJ3ICovCisgICAgICB2YXI2MC54NFswXSA9IChvcmNfdWludDgpIHZhcjU5Lng0WzBdOworICAgICAgdmFyNjAueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI1OS54NFsxXTsKKyAgICAgIHZhcjYwLng0WzJdID0gKG9yY191aW50OCkgdmFyNTkueDRbMl07CisgICAgICB2YXI2MC54NFszXSA9IChvcmNfdWludDgpIHZhcjU5Lng0WzNdOworICAgICAgLyogMTg6IG11bGx3ICovCisgICAgICB2YXI2MS54NFswXSA9ICh2YXI2MC54NFswXSAqIHZhcjU1Lng0WzBdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjYxLng0WzFdID0gKHZhcjYwLng0WzFdICogdmFyNTUueDRbMV0pICYgMHhmZmZmOworICAgICAgdmFyNjEueDRbMl0gPSAodmFyNjAueDRbMl0gKiB2YXI1NS54NFsyXSkgJiAweGZmZmY7CisgICAgICB2YXI2MS54NFszXSA9ICh2YXI2MC54NFszXSAqIHZhcjU1Lng0WzNdKSAmIDB4ZmZmZjsKKyAgICAgIC8qIDE5OiBkaXYyNTV3ICovCisgICAgICB2YXI2Mi54NFswXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNjEueDRbMF0gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI2MS54NFswXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIHZhcjYyLng0WzFdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI2MS54NFsxXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjYxLng0WzFdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgdmFyNjIueDRbMl0gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjYxLng0WzJdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNjEueDRbMl0gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICB2YXI2Mi54NFszXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNjEueDRbM10gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI2MS54NFszXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIC8qIDIwOiBjb252dWJ3ICovCisgICAgICB2YXI2My54NFswXSA9IChvcmNfdWludDgpIHZhcjU2Lng0WzBdOworICAgICAgdmFyNjMueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI1Ni54NFsxXTsKKyAgICAgIHZhcjYzLng0WzJdID0gKG9yY191aW50OCkgdmFyNTYueDRbMl07CisgICAgICB2YXI2My54NFszXSA9IChvcmNfdWludDgpIHZhcjU2Lng0WzNdOworICAgICAgLyogMjE6IG11bGx3ICovCisgICAgICB2YXI2NC54NFswXSA9ICh2YXI2My54NFswXSAqIHZhcjYyLng0WzBdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjY0Lng0WzFdID0gKHZhcjYzLng0WzFdICogdmFyNjIueDRbMV0pICYgMHhmZmZmOworICAgICAgdmFyNjQueDRbMl0gPSAodmFyNjMueDRbMl0gKiB2YXI2Mi54NFsyXSkgJiAweGZmZmY7CisgICAgICB2YXI2NC54NFszXSA9ICh2YXI2My54NFszXSAqIHZhcjYyLng0WzNdKSAmIDB4ZmZmZjsKKyAgICAgIC8qIDIyOiBhZGR3ICovCisgICAgICB2YXI2NS54NFswXSA9IHZhcjY0Lng0WzBdICsgdmFyNTIueDRbMF07CisgICAgICB2YXI2NS54NFsxXSA9IHZhcjY0Lng0WzFdICsgdmFyNTIueDRbMV07CisgICAgICB2YXI2NS54NFsyXSA9IHZhcjY0Lng0WzJdICsgdmFyNTIueDRbMl07CisgICAgICB2YXI2NS54NFszXSA9IHZhcjY0Lng0WzNdICsgdmFyNTIueDRbM107CisgICAgICAvKiAyMzogYWRkdyAqLworICAgICAgdmFyNjYueDRbMF0gPSB2YXI2Mi54NFswXSArIHZhcjUwLng0WzBdOworICAgICAgdmFyNjYueDRbMV0gPSB2YXI2Mi54NFsxXSArIHZhcjUwLng0WzFdOworICAgICAgdmFyNjYueDRbMl0gPSB2YXI2Mi54NFsyXSArIHZhcjUwLng0WzJdOworICAgICAgdmFyNjYueDRbM10gPSB2YXI2Mi54NFszXSArIHZhcjUwLng0WzNdOworICAgICAgLyogMjQ6IGRpdmx1dyAqLworICAgICAgdmFyNjcueDRbMF0gPQorICAgICAgICAgICgodmFyNjYueDRbMF0gJiAweGZmKSA9PQorICAgICAgICAgIDApID8gMjU1IDogT1JDX0NMQU1QX1VCICgoKG9yY191aW50MTYpIHZhcjY1Lng0WzBdKSAvCisgICAgICAgICAgKChvcmNfdWludDE2KSB2YXI2Ni54NFswXSAmIDB4ZmYpKTsKKyAgICAgIHZhcjY3Lng0WzFdID0KKyAgICAgICAgICAoKHZhcjY2Lng0WzFdICYgMHhmZikgPT0KKyAgICAgICAgICAwKSA/IDI1NSA6IE9SQ19DTEFNUF9VQiAoKChvcmNfdWludDE2KSB2YXI2NS54NFsxXSkgLworICAgICAgICAgICgob3JjX3VpbnQxNikgdmFyNjYueDRbMV0gJiAweGZmKSk7CisgICAgICB2YXI2Ny54NFsyXSA9CisgICAgICAgICAgKCh2YXI2Ni54NFsyXSAmIDB4ZmYpID09CisgICAgICAgICAgMCkgPyAyNTUgOiBPUkNfQ0xBTVBfVUIgKCgob3JjX3VpbnQxNikgdmFyNjUueDRbMl0pIC8KKyAgICAgICAgICAoKG9yY191aW50MTYpIHZhcjY2Lng0WzJdICYgMHhmZikpOworICAgICAgdmFyNjcueDRbM10gPQorICAgICAgICAgICgodmFyNjYueDRbM10gJiAweGZmKSA9PQorICAgICAgICAgIDApID8gMjU1IDogT1JDX0NMQU1QX1VCICgoKG9yY191aW50MTYpIHZhcjY1Lng0WzNdKSAvCisgICAgICAgICAgKChvcmNfdWludDE2KSB2YXI2Ni54NFszXSAmIDB4ZmYpKTsKKyAgICAgIC8qIDI1OiBjb252d2IgKi8KKyAgICAgIHZhcjY4Lng0WzBdID0gdmFyNjcueDRbMF07CisgICAgICB2YXI2OC54NFsxXSA9IHZhcjY3Lng0WzFdOworICAgICAgdmFyNjgueDRbMl0gPSB2YXI2Ny54NFsyXTsKKyAgICAgIHZhcjY4Lng0WzNdID0gdmFyNjcueDRbM107CisgICAgICAvKiAyNzogYW5kbCAqLworICAgICAgdmFyNjkuaSA9IHZhcjY4LmkgJiB2YXI0Mi5pOworICAgICAgLyogMjg6IGNvbnZ3YiAqLworICAgICAgdmFyNzAueDRbMF0gPSB2YXI2Ni54NFswXTsKKyAgICAgIHZhcjcwLng0WzFdID0gdmFyNjYueDRbMV07CisgICAgICB2YXI3MC54NFsyXSA9IHZhcjY2Lng0WzJdOworICAgICAgdmFyNzAueDRbM10gPSB2YXI2Ni54NFszXTsKKyAgICAgIC8qIDMwOiBhbmRsICovCisgICAgICB2YXI3MS5pID0gdmFyNzAuaSAmIHZhcjQzLmk7CisgICAgICAvKiAzMTogb3JsICovCisgICAgICB2YXI3Mi5pID0gdmFyNjkuaSB8IHZhcjcxLmk7CisgICAgICAvKiAzMjogc3RvcmVsICovCisgICAgICBwdHIwW2ldID0gdmFyNzI7CisgICAgfQorICB9CisKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkCitfYmFja3VwX3ZpZGVvX21peGVyX29yY19vdmVybGF5X2FyZ2IgKE9yY0V4ZWN1dG9yICogT1JDX1JFU1RSSUNUIGV4KQoreworICBpbnQgaTsKKyAgaW50IGo7CisgIGludCBuID0gZXgtPm47CisgIGludCBtID0gZXgtPnBhcmFtc1tPUkNfVkFSX0ExXTsKKyAgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHIwOworICBjb25zdCBvcmNfdW5pb24zMiAqT1JDX1JFU1RSSUNUIHB0cjQ7CisgIG9yY191bmlvbjY0IHZhcjQxOworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID09IDIgJiYgZGVmaW5lZCAoX19pMzg2X18pCisgIHZvbGF0aWxlIG9yY191bmlvbjMyIHZhcjQyOworI2Vsc2UKKyAgb3JjX3VuaW9uMzIgdmFyNDI7CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA9PSAyICYmIGRlZmluZWQgKF9faTM4Nl9fKQorICB2b2xhdGlsZSBvcmNfdW5pb24zMiB2YXI0MzsKKyNlbHNlCisgIG9yY191bmlvbjMyIHZhcjQzOworI2VuZGlmCisgIG9yY191bmlvbjMyIHZhcjQ0OworICBvcmNfdW5pb24xNiB2YXI0NTsKKyAgb3JjX2ludDggdmFyNDY7CisgIG9yY191bmlvbjMyIHZhcjQ3OworICBvcmNfdW5pb242NCB2YXI0ODsKKyAgb3JjX3VuaW9uNjQgdmFyNDk7CisgIG9yY191bmlvbjY0IHZhcjUwOworICBvcmNfdW5pb242NCB2YXI1MTsKKyAgb3JjX3VuaW9uNjQgdmFyNTI7CisgIG9yY191bmlvbjMyIHZhcjUzOworICBvcmNfdW5pb242NCB2YXI1NDsKKyAgb3JjX3VuaW9uNjQgdmFyNTU7CisgIG9yY191bmlvbjMyIHZhcjU2OworICBvcmNfdW5pb24xNiB2YXI1NzsKKyAgb3JjX2ludDggdmFyNTg7CisgIG9yY191bmlvbjMyIHZhcjU5OworICBvcmNfdW5pb242NCB2YXI2MDsKKyAgb3JjX3VuaW9uNjQgdmFyNjE7CisgIG9yY191bmlvbjY0IHZhcjYyOworICBvcmNfdW5pb242NCB2YXI2MzsKKyAgb3JjX3VuaW9uNjQgdmFyNjQ7CisgIG9yY191bmlvbjY0IHZhcjY1OworICBvcmNfdW5pb242NCB2YXI2NjsKKyAgb3JjX3VuaW9uNjQgdmFyNjc7CisgIG9yY191bmlvbjMyIHZhcjY4OworICBvcmNfdW5pb24zMiB2YXI2OTsKKyAgb3JjX3VuaW9uMzIgdmFyNzA7CisgIG9yY191bmlvbjMyIHZhcjcxOworICBvcmNfdW5pb24zMiB2YXI3MjsKKworICBmb3IgKGogPSAwOyBqIDwgbTsgaisrKSB7CisgICAgcHRyMCA9IE9SQ19QVFJfT0ZGU0VUIChleC0+YXJyYXlzWzBdLCBleC0+cGFyYW1zWzBdICogaik7CisgICAgcHRyNCA9IE9SQ19QVFJfT0ZGU0VUIChleC0+YXJyYXlzWzRdLCBleC0+cGFyYW1zWzRdICogaik7CisKKyAgICAvKiA1OiBsb2FkcHcgKi8KKyAgICB2YXI0MS54NFswXSA9IGV4LT5wYXJhbXNbMjRdOworICAgIHZhcjQxLng0WzFdID0gZXgtPnBhcmFtc1syNF07CisgICAgdmFyNDEueDRbMl0gPSBleC0+cGFyYW1zWzI0XTsKKyAgICB2YXI0MS54NFszXSA9IGV4LT5wYXJhbXNbMjRdOworICAgIC8qIDEwOiBsb2FkcGwgKi8KKyAgICB2YXI1My5pID0gMHhmZmZmZmZmZjsgICAgICAgLyogLTEgb3IgMi4xMjJlLTMxNGYgKi8KKyAgICAvKiAyNjogbG9hZHBsICovCisgICAgdmFyNDIuaSA9IDB4ZmZmZmZmMDA7ICAgICAgIC8qIC0yNTYgb3IgMi4xMjJlLTMxNGYgKi8KKyAgICAvKiAyOTogbG9hZHBsICovCisgICAgdmFyNDMuaSA9IDB4MDAwMDAwZmY7ICAgICAgIC8qIDI1NSBvciAxLjI1OTg3ZS0zMjFmICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAvKiAwOiBsb2FkbCAqLworICAgICAgdmFyNDQgPSBwdHI0W2ldOworICAgICAgLyogMTogY29udmx3ICovCisgICAgICB2YXI0NS5pID0gdmFyNDQuaTsKKyAgICAgIC8qIDI6IGNvbnZ3YiAqLworICAgICAgdmFyNDYgPSB2YXI0NS5pOworICAgICAgLyogMzogc3BsYXRibCAqLworICAgICAgdmFyNDcuaSA9CisgICAgICAgICAgKCgoKG9yY191aW50MzIpIHZhcjQ2KSAmIDB4ZmYpIDw8IDI0KSB8ICgoKChvcmNfdWludDMyKSB2YXI0NikgJiAweGZmKQorICAgICAgICAgIDw8IDE2KSB8ICgoKChvcmNfdWludDMyKSB2YXI0NikgJiAweGZmKSA8PCA4KSB8ICgoKG9yY191aW50MzIpIHZhcjQ2KQorICAgICAgICAgICYgMHhmZik7CisgICAgICAvKiA0OiBjb252dWJ3ICovCisgICAgICB2YXI0OC54NFswXSA9IChvcmNfdWludDgpIHZhcjQ3Lng0WzBdOworICAgICAgdmFyNDgueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI0Ny54NFsxXTsKKyAgICAgIHZhcjQ4Lng0WzJdID0gKG9yY191aW50OCkgdmFyNDcueDRbMl07CisgICAgICB2YXI0OC54NFszXSA9IChvcmNfdWludDgpIHZhcjQ3Lng0WzNdOworICAgICAgLyogNjogbXVsbHcgKi8KKyAgICAgIHZhcjQ5Lng0WzBdID0gKHZhcjQ4Lng0WzBdICogdmFyNDEueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNDkueDRbMV0gPSAodmFyNDgueDRbMV0gKiB2YXI0MS54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI0OS54NFsyXSA9ICh2YXI0OC54NFsyXSAqIHZhcjQxLng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjQ5Lng0WzNdID0gKHZhcjQ4Lng0WzNdICogdmFyNDEueDRbM10pICYgMHhmZmZmOworICAgICAgLyogNzogc2hydXcgKi8KKyAgICAgIHZhcjUwLng0WzBdID0gKChvcmNfdWludDE2KSB2YXI0OS54NFswXSkgPj4gODsKKyAgICAgIHZhcjUwLng0WzFdID0gKChvcmNfdWludDE2KSB2YXI0OS54NFsxXSkgPj4gODsKKyAgICAgIHZhcjUwLng0WzJdID0gKChvcmNfdWludDE2KSB2YXI0OS54NFsyXSkgPj4gODsKKyAgICAgIHZhcjUwLng0WzNdID0gKChvcmNfdWludDE2KSB2YXI0OS54NFszXSkgPj4gODsKKyAgICAgIC8qIDg6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjUxLng0WzBdID0gKG9yY191aW50OCkgdmFyNDQueDRbMF07CisgICAgICB2YXI1MS54NFsxXSA9IChvcmNfdWludDgpIHZhcjQ0Lng0WzFdOworICAgICAgdmFyNTEueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI0NC54NFsyXTsKKyAgICAgIHZhcjUxLng0WzNdID0gKG9yY191aW50OCkgdmFyNDQueDRbM107CisgICAgICAvKiA5OiBtdWxsdyAqLworICAgICAgdmFyNTIueDRbMF0gPSAodmFyNTEueDRbMF0gKiB2YXI1MC54NFswXSkgJiAweGZmZmY7CisgICAgICB2YXI1Mi54NFsxXSA9ICh2YXI1MS54NFsxXSAqIHZhcjUwLng0WzFdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjUyLng0WzJdID0gKHZhcjUxLng0WzJdICogdmFyNTAueDRbMl0pICYgMHhmZmZmOworICAgICAgdmFyNTIueDRbM10gPSAodmFyNTEueDRbM10gKiB2YXI1MC54NFszXSkgJiAweGZmZmY7CisgICAgICAvKiAxMTogY29udnVidyAqLworICAgICAgdmFyNTQueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI1My54NFswXTsKKyAgICAgIHZhcjU0Lng0WzFdID0gKG9yY191aW50OCkgdmFyNTMueDRbMV07CisgICAgICB2YXI1NC54NFsyXSA9IChvcmNfdWludDgpIHZhcjUzLng0WzJdOworICAgICAgdmFyNTQueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI1My54NFszXTsKKyAgICAgIC8qIDEyOiBzdWJ3ICovCisgICAgICB2YXI1NS54NFswXSA9IHZhcjU0Lng0WzBdIC0gdmFyNTAueDRbMF07CisgICAgICB2YXI1NS54NFsxXSA9IHZhcjU0Lng0WzFdIC0gdmFyNTAueDRbMV07CisgICAgICB2YXI1NS54NFsyXSA9IHZhcjU0Lng0WzJdIC0gdmFyNTAueDRbMl07CisgICAgICB2YXI1NS54NFszXSA9IHZhcjU0Lng0WzNdIC0gdmFyNTAueDRbM107CisgICAgICAvKiAxMzogbG9hZGwgKi8KKyAgICAgIHZhcjU2ID0gcHRyMFtpXTsKKyAgICAgIC8qIDE0OiBjb252bHcgKi8KKyAgICAgIHZhcjU3LmkgPSB2YXI1Ni5pOworICAgICAgLyogMTU6IGNvbnZ3YiAqLworICAgICAgdmFyNTggPSB2YXI1Ny5pOworICAgICAgLyogMTY6IHNwbGF0YmwgKi8KKyAgICAgIHZhcjU5LmkgPQorICAgICAgICAgICgoKChvcmNfdWludDMyKSB2YXI1OCkgJiAweGZmKSA8PCAyNCkgfCAoKCgob3JjX3VpbnQzMikgdmFyNTgpICYgMHhmZikKKyAgICAgICAgICA8PCAxNikgfCAoKCgob3JjX3VpbnQzMikgdmFyNTgpICYgMHhmZikgPDwgOCkgfCAoKChvcmNfdWludDMyKSB2YXI1OCkKKyAgICAgICAgICAmIDB4ZmYpOworICAgICAgLyogMTc6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjYwLng0WzBdID0gKG9yY191aW50OCkgdmFyNTkueDRbMF07CisgICAgICB2YXI2MC54NFsxXSA9IChvcmNfdWludDgpIHZhcjU5Lng0WzFdOworICAgICAgdmFyNjAueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI1OS54NFsyXTsKKyAgICAgIHZhcjYwLng0WzNdID0gKG9yY191aW50OCkgdmFyNTkueDRbM107CisgICAgICAvKiAxODogbXVsbHcgKi8KKyAgICAgIHZhcjYxLng0WzBdID0gKHZhcjYwLng0WzBdICogdmFyNTUueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNjEueDRbMV0gPSAodmFyNjAueDRbMV0gKiB2YXI1NS54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI2MS54NFsyXSA9ICh2YXI2MC54NFsyXSAqIHZhcjU1Lng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjYxLng0WzNdID0gKHZhcjYwLng0WzNdICogdmFyNTUueDRbM10pICYgMHhmZmZmOworICAgICAgLyogMTk6IGRpdjI1NXcgKi8KKyAgICAgIHZhcjYyLng0WzBdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI2MS54NFswXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjYxLng0WzBdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgdmFyNjIueDRbMV0gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjYxLng0WzFdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNjEueDRbMV0gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICB2YXI2Mi54NFsyXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNjEueDRbMl0gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI2MS54NFsyXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIHZhcjYyLng0WzNdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI2MS54NFszXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjYxLng0WzNdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgLyogMjA6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjYzLng0WzBdID0gKG9yY191aW50OCkgdmFyNTYueDRbMF07CisgICAgICB2YXI2My54NFsxXSA9IChvcmNfdWludDgpIHZhcjU2Lng0WzFdOworICAgICAgdmFyNjMueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI1Ni54NFsyXTsKKyAgICAgIHZhcjYzLng0WzNdID0gKG9yY191aW50OCkgdmFyNTYueDRbM107CisgICAgICAvKiAyMTogbXVsbHcgKi8KKyAgICAgIHZhcjY0Lng0WzBdID0gKHZhcjYzLng0WzBdICogdmFyNjIueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNjQueDRbMV0gPSAodmFyNjMueDRbMV0gKiB2YXI2Mi54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI2NC54NFsyXSA9ICh2YXI2My54NFsyXSAqIHZhcjYyLng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjY0Lng0WzNdID0gKHZhcjYzLng0WzNdICogdmFyNjIueDRbM10pICYgMHhmZmZmOworICAgICAgLyogMjI6IGFkZHcgKi8KKyAgICAgIHZhcjY1Lng0WzBdID0gdmFyNjQueDRbMF0gKyB2YXI1Mi54NFswXTsKKyAgICAgIHZhcjY1Lng0WzFdID0gdmFyNjQueDRbMV0gKyB2YXI1Mi54NFsxXTsKKyAgICAgIHZhcjY1Lng0WzJdID0gdmFyNjQueDRbMl0gKyB2YXI1Mi54NFsyXTsKKyAgICAgIHZhcjY1Lng0WzNdID0gdmFyNjQueDRbM10gKyB2YXI1Mi54NFszXTsKKyAgICAgIC8qIDIzOiBhZGR3ICovCisgICAgICB2YXI2Ni54NFswXSA9IHZhcjYyLng0WzBdICsgdmFyNTAueDRbMF07CisgICAgICB2YXI2Ni54NFsxXSA9IHZhcjYyLng0WzFdICsgdmFyNTAueDRbMV07CisgICAgICB2YXI2Ni54NFsyXSA9IHZhcjYyLng0WzJdICsgdmFyNTAueDRbMl07CisgICAgICB2YXI2Ni54NFszXSA9IHZhcjYyLng0WzNdICsgdmFyNTAueDRbM107CisgICAgICAvKiAyNDogZGl2bHV3ICovCisgICAgICB2YXI2Ny54NFswXSA9CisgICAgICAgICAgKCh2YXI2Ni54NFswXSAmIDB4ZmYpID09CisgICAgICAgICAgMCkgPyAyNTUgOiBPUkNfQ0xBTVBfVUIgKCgob3JjX3VpbnQxNikgdmFyNjUueDRbMF0pIC8KKyAgICAgICAgICAoKG9yY191aW50MTYpIHZhcjY2Lng0WzBdICYgMHhmZikpOworICAgICAgdmFyNjcueDRbMV0gPQorICAgICAgICAgICgodmFyNjYueDRbMV0gJiAweGZmKSA9PQorICAgICAgICAgIDApID8gMjU1IDogT1JDX0NMQU1QX1VCICgoKG9yY191aW50MTYpIHZhcjY1Lng0WzFdKSAvCisgICAgICAgICAgKChvcmNfdWludDE2KSB2YXI2Ni54NFsxXSAmIDB4ZmYpKTsKKyAgICAgIHZhcjY3Lng0WzJdID0KKyAgICAgICAgICAoKHZhcjY2Lng0WzJdICYgMHhmZikgPT0KKyAgICAgICAgICAwKSA/IDI1NSA6IE9SQ19DTEFNUF9VQiAoKChvcmNfdWludDE2KSB2YXI2NS54NFsyXSkgLworICAgICAgICAgICgob3JjX3VpbnQxNikgdmFyNjYueDRbMl0gJiAweGZmKSk7CisgICAgICB2YXI2Ny54NFszXSA9CisgICAgICAgICAgKCh2YXI2Ni54NFszXSAmIDB4ZmYpID09CisgICAgICAgICAgMCkgPyAyNTUgOiBPUkNfQ0xBTVBfVUIgKCgob3JjX3VpbnQxNikgdmFyNjUueDRbM10pIC8KKyAgICAgICAgICAoKG9yY191aW50MTYpIHZhcjY2Lng0WzNdICYgMHhmZikpOworICAgICAgLyogMjU6IGNvbnZ3YiAqLworICAgICAgdmFyNjgueDRbMF0gPSB2YXI2Ny54NFswXTsKKyAgICAgIHZhcjY4Lng0WzFdID0gdmFyNjcueDRbMV07CisgICAgICB2YXI2OC54NFsyXSA9IHZhcjY3Lng0WzJdOworICAgICAgdmFyNjgueDRbM10gPSB2YXI2Ny54NFszXTsKKyAgICAgIC8qIDI3OiBhbmRsICovCisgICAgICB2YXI2OS5pID0gdmFyNjguaSAmIHZhcjQyLmk7CisgICAgICAvKiAyODogY29udndiICovCisgICAgICB2YXI3MC54NFswXSA9IHZhcjY2Lng0WzBdOworICAgICAgdmFyNzAueDRbMV0gPSB2YXI2Ni54NFsxXTsKKyAgICAgIHZhcjcwLng0WzJdID0gdmFyNjYueDRbMl07CisgICAgICB2YXI3MC54NFszXSA9IHZhcjY2Lng0WzNdOworICAgICAgLyogMzA6IGFuZGwgKi8KKyAgICAgIHZhcjcxLmkgPSB2YXI3MC5pICYgdmFyNDMuaTsKKyAgICAgIC8qIDMxOiBvcmwgKi8KKyAgICAgIHZhcjcyLmkgPSB2YXI2OS5pIHwgdmFyNzEuaTsKKyAgICAgIC8qIDMyOiBzdG9yZWwgKi8KKyAgICAgIHB0cjBbaV0gPSB2YXI3MjsKKyAgICB9CisgIH0KKworfQorCit2b2lkCit2aWRlb19taXhlcl9vcmNfb3ZlcmxheV9hcmdiIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBkMV9zdHJpZGUsCisgICAgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBpbnQgczFfc3RyaWRlLCBpbnQgcDEsIGludCBuLCBpbnQgbSkKK3sKKyAgT3JjRXhlY3V0b3IgX2V4LCAqZXggPSAmX2V4OworICBzdGF0aWMgdm9sYXRpbGUgaW50IHBfaW5pdGVkID0gMDsKKyAgc3RhdGljIE9yY0NvZGUgKmMgPSAwOworICB2b2lkICgqZnVuYykgKE9yY0V4ZWN1dG9yICopOworCisgIGlmICghcF9pbml0ZWQpIHsKKyAgICBvcmNfb25jZV9tdXRleF9sb2NrICgpOworICAgIGlmICghcF9pbml0ZWQpIHsKKyAgICAgIE9yY1Byb2dyYW0gKnA7CisKKyNpZiAxCisgICAgICBzdGF0aWMgY29uc3Qgb3JjX3VpbnQ4IGJjW10gPSB7CisgICAgICAgIDEsIDcsIDksIDI4LCAxMTgsIDEwNSwgMTAwLCAxMDEsIDExMSwgOTUsIDEwOSwgMTA1LCAxMjAsIDEwMSwgMTE0LCA5NSwKKyAgICAgICAgMTExLCAxMTQsIDk5LCA5NSwgMTExLCAxMTgsIDEwMSwgMTE0LCAxMDgsIDk3LCAxMjEsIDk1LCA5NywgMTE0LCAxMDMsCisgICAgICAgIDk4LAorICAgICAgICAxMSwgNCwgNCwgMTIsIDQsIDQsIDE0LCA0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDE0LCA0LCAyNTUsIDAsCisgICAgICAgIDAsIDAsIDE0LCA0LCAwLCAyNTUsIDI1NSwgMjU1LCAxNCwgMiwgOCwgMCwgMCwgMCwgMTYsIDIsCisgICAgICAgIDIwLCA0LCAyMCwgMiwgMjAsIDEsIDIwLCA4LCAyMCwgOCwgMjAsIDgsIDIwLCA0LCAyMCwgOCwKKyAgICAgICAgMjAsIDgsIDExMywgMzIsIDQsIDE2MywgMzMsIDMyLCAxNTcsIDM0LCAzMywgMTUyLCAzOCwgMzQsIDIxLCAyLAorICAgICAgICAxNTAsIDM1LCAzOCwgMjEsIDIsIDg5LCAzNSwgMzUsIDI0LCAyMSwgMiwgOTUsIDM1LCAzNSwgMTksIDIxLAorICAgICAgICAyLCAxNTAsIDQwLCAzMiwgMjEsIDIsIDg5LCA0MCwgNDAsIDM1LCAxMTUsIDM4LCAxNiwgMjEsIDIsIDE1MCwKKyAgICAgICAgMzYsIDM4LCAyMSwgMiwgOTgsIDM2LCAzNiwgMzUsIDExMywgMzIsIDAsIDE2MywgMzMsIDMyLCAxNTcsIDM0LAorICAgICAgICAzMywgMTUyLCAzOCwgMzQsIDIxLCAyLCAxNTAsIDM3LCAzOCwgMjEsIDIsIDg5LCAzNywgMzcsIDM2LCAyMSwKKyAgICAgICAgMiwgODAsIDM3LCAzNywgMjEsIDIsIDE1MCwgMzksIDMyLCAyMSwgMiwgODksIDM5LCAzOSwgMzcsIDIxLAorICAgICAgICAyLCA3MCwgMzksIDM5LCA0MCwgMjEsIDIsIDcwLCAzNywgMzcsIDM1LCAyMSwgMiwgODEsIDM5LCAzOSwKKyAgICAgICAgMzcsIDIxLCAyLCAxNTcsIDMyLCAzOSwgMTA2LCAzMiwgMzIsIDE4LCAyMSwgMiwgMTU3LCAzOCwgMzcsIDEwNiwKKyAgICAgICAgMzgsIDM4LCAxNywgMTIzLCAzMiwgMzIsIDM4LCAxMjgsIDAsIDMyLCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsIF9iYWNrdXBfdmlkZW9fbWl4ZXJfb3JjX292ZXJsYXlfYXJnYik7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF8yZCAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgInZpZGVvX21peGVyX29yY19vdmVybGF5X2FyZ2IiKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsIF9iYWNrdXBfdmlkZW9fbWl4ZXJfb3JjX292ZXJsYXlfYXJnYik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDQsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgNCwgInMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfY29uc3RhbnQgKHAsIDQsIDB4ZmZmZmZmZmYsICJjMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2NvbnN0YW50IChwLCA0LCAweDAwMDAwMGZmLCAiYzIiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9jb25zdGFudCAocCwgNCwgMHhmZmZmZmYwMCwgImMzIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfY29uc3RhbnQgKHAsIDIsIDB4MDAwMDAwMDgsICJjNCIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3BhcmFtZXRlciAocCwgMiwgInAxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDEiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDIsICJ0MiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgMSwgInQzIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA4LCAidDQiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDgsICJ0NSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgOCwgInQ2Iik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDciKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDgsICJ0OCIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgOCwgInQ5Iik7CisKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibG9hZGwiLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1MxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252bHciLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252d2IiLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QyLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJzcGxhdGJsIiwgMCwgT1JDX1ZBUl9UNywgT1JDX1ZBUl9UMywgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnVidyIsIDIsIE9SQ19WQVJfVDQsIE9SQ19WQVJfVDcsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGx3IiwgMiwgT1JDX1ZBUl9UNCwgT1JDX1ZBUl9UNCwgT1JDX1ZBUl9QMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2hydXciLCAyLCBPUkNfVkFSX1Q0LCBPUkNfVkFSX1Q0LCBPUkNfVkFSX0M0LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMiwgT1JDX1ZBUl9UOSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsbHciLCAyLCBPUkNfVkFSX1Q5LCBPUkNfVkFSX1Q5LCBPUkNfVkFSX1Q0LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJsb2FkcGwiLCAwLCBPUkNfVkFSX1Q3LCBPUkNfVkFSX0MxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMiwgT1JDX1ZBUl9UNSwgT1JDX1ZBUl9UNywgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic3VidyIsIDIsIE9SQ19WQVJfVDUsIE9SQ19WQVJfVDUsIE9SQ19WQVJfVDQsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImxvYWRsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udmx3IiwgMCwgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udndiIiwgMCwgT1JDX1ZBUl9UMywgT1JDX1ZBUl9UMiwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic3BsYXRibCIsIDAsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDMsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZ1YnciLCAyLCBPUkNfVkFSX1Q2LCBPUkNfVkFSX1Q3LCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtdWxsdyIsIDIsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDUsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImRpdjI1NXciLCAyLCBPUkNfVkFSX1Q2LCBPUkNfVkFSX1Q2LCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMiwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAibXVsbHciLCAyLCBPUkNfVkFSX1Q4LCBPUkNfVkFSX1Q4LCBPUkNfVkFSX1Q2LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhZGR3IiwgMiwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9UOSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiYWRkdyIsIDIsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDQsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImRpdmx1dyIsIDIsIE9SQ19WQVJfVDgsIE9SQ19WQVJfVDgsIE9SQ19WQVJfVDYsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZ3YiIsIDIsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDgsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImFuZGwiLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0MzLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252d2IiLCAyLCBPUkNfVkFSX1Q3LCBPUkNfVkFSX1Q2LCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhbmRsIiwgMCwgT1JDX1ZBUl9UNywgT1JDX1ZBUl9UNywgT1JDX1ZBUl9DMiwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAib3JsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UNywKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic3RvcmVsIiwgMCwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIE9SQ19FWEVDVVRPUl9NIChleCkgPSBtOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5wYXJhbXNbT1JDX1ZBUl9EMV0gPSBkMV9zdHJpZGU7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1MxXSA9IHMxX3N0cmlkZTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHAxOworCisgIGZ1bmMgPSBjLT5leGVjOworICBmdW5jIChleCk7Cit9CisjZW5kaWYKKworCisvKiB2aWRlb19taXhlcl9vcmNfb3ZlcmxheV9iZ3JhICovCisjaWZkZWYgRElTQUJMRV9PUkMKK3ZvaWQKK3ZpZGVvX21peGVyX29yY19vdmVybGF5X2JncmEgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKQoreworICBpbnQgaTsKKyAgaW50IGo7CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb242NCB2YXI0MjsKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA9PSAyICYmIGRlZmluZWQgKF9faTM4Nl9fKQorICB2b2xhdGlsZSBvcmNfdW5pb24zMiB2YXI0MzsKKyNlbHNlCisgIG9yY191bmlvbjMyIHZhcjQzOworI2VuZGlmCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPT0gMiAmJiBkZWZpbmVkIChfX2kzODZfXykKKyAgdm9sYXRpbGUgb3JjX3VuaW9uMzIgdmFyNDQ7CisjZWxzZQorICBvcmNfdW5pb24zMiB2YXI0NDsKKyNlbmRpZgorICBvcmNfdW5pb24zMiB2YXI0NTsKKyAgb3JjX3VuaW9uMzIgdmFyNDY7CisgIG9yY191bmlvbjE2IHZhcjQ3OworICBvcmNfaW50OCB2YXI0ODsKKyAgb3JjX3VuaW9uMzIgdmFyNDk7CisgIG9yY191bmlvbjY0IHZhcjUwOworICBvcmNfdW5pb242NCB2YXI1MTsKKyAgb3JjX3VuaW9uNjQgdmFyNTI7CisgIG9yY191bmlvbjY0IHZhcjUzOworICBvcmNfdW5pb242NCB2YXI1NDsKKyAgb3JjX3VuaW9uMzIgdmFyNTU7CisgIG9yY191bmlvbjY0IHZhcjU2OworICBvcmNfdW5pb242NCB2YXI1NzsKKyAgb3JjX3VuaW9uMzIgdmFyNTg7CisgIG9yY191bmlvbjMyIHZhcjU5OworICBvcmNfdW5pb24xNiB2YXI2MDsKKyAgb3JjX2ludDggdmFyNjE7CisgIG9yY191bmlvbjMyIHZhcjYyOworICBvcmNfdW5pb242NCB2YXI2MzsKKyAgb3JjX3VuaW9uNjQgdmFyNjQ7CisgIG9yY191bmlvbjY0IHZhcjY1OworICBvcmNfdW5pb242NCB2YXI2NjsKKyAgb3JjX3VuaW9uNjQgdmFyNjc7CisgIG9yY191bmlvbjY0IHZhcjY4OworICBvcmNfdW5pb242NCB2YXI2OTsKKyAgb3JjX3VuaW9uNjQgdmFyNzA7CisgIG9yY191bmlvbjMyIHZhcjcxOworICBvcmNfdW5pb24zMiB2YXI3MjsKKyAgb3JjX3VuaW9uMzIgdmFyNzM7CisgIG9yY191bmlvbjMyIHZhcjc0OworICBvcmNfdW5pb24zMiB2YXI3NTsKKworICBmb3IgKGogPSAwOyBqIDwgbTsgaisrKSB7CisgICAgcHRyMCA9IE9SQ19QVFJfT0ZGU0VUIChkMSwgZDFfc3RyaWRlICogaik7CisgICAgcHRyNCA9IE9SQ19QVFJfT0ZGU0VUIChzMSwgczFfc3RyaWRlICogaik7CisKKyAgICAvKiA2OiBsb2FkcHcgKi8KKyAgICB2YXI0Mi54NFswXSA9IHAxOworICAgIHZhcjQyLng0WzFdID0gcDE7CisgICAgdmFyNDIueDRbMl0gPSBwMTsKKyAgICB2YXI0Mi54NFszXSA9IHAxOworICAgIC8qIDExOiBsb2FkcGwgKi8KKyAgICB2YXI1NS5pID0gMHhmZmZmZmZmZjsgICAgICAgLyogLTEgb3IgMi4xMjJlLTMxNGYgKi8KKyAgICAvKiAyODogbG9hZHBsICovCisgICAgdmFyNDMuaSA9IDB4MDBmZmZmZmY7ICAgICAgIC8qIDE2Nzc3MjE1IG9yIDguMjg5MDVlLTMxN2YgKi8KKyAgICAvKiAzMTogbG9hZHBsICovCisgICAgdmFyNDQuaSA9IDB4ZmYwMDAwMDA7ICAgICAgIC8qIC0xNjc3NzIxNiBvciAyLjExMzcxZS0zMTRmICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAvKiAwOiBsb2FkbCAqLworICAgICAgdmFyNDUgPSBwdHI0W2ldOworICAgICAgLyogMTogc2hydWwgKi8KKyAgICAgIHZhcjQ2LmkgPSAoKG9yY191aW50MzIpIHZhcjQ1LmkpID4+IDI0OworICAgICAgLyogMjogY29udmx3ICovCisgICAgICB2YXI0Ny5pID0gdmFyNDYuaTsKKyAgICAgIC8qIDM6IGNvbnZ3YiAqLworICAgICAgdmFyNDggPSB2YXI0Ny5pOworICAgICAgLyogNDogc3BsYXRibCAqLworICAgICAgdmFyNDkuaSA9CisgICAgICAgICAgKCgoKG9yY191aW50MzIpIHZhcjQ4KSAmIDB4ZmYpIDw8IDI0KSB8ICgoKChvcmNfdWludDMyKSB2YXI0OCkgJiAweGZmKQorICAgICAgICAgIDw8IDE2KSB8ICgoKChvcmNfdWludDMyKSB2YXI0OCkgJiAweGZmKSA8PCA4KSB8ICgoKG9yY191aW50MzIpIHZhcjQ4KQorICAgICAgICAgICYgMHhmZik7CisgICAgICAvKiA1OiBjb252dWJ3ICovCisgICAgICB2YXI1MC54NFswXSA9IChvcmNfdWludDgpIHZhcjQ5Lng0WzBdOworICAgICAgdmFyNTAueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI0OS54NFsxXTsKKyAgICAgIHZhcjUwLng0WzJdID0gKG9yY191aW50OCkgdmFyNDkueDRbMl07CisgICAgICB2YXI1MC54NFszXSA9IChvcmNfdWludDgpIHZhcjQ5Lng0WzNdOworICAgICAgLyogNzogbXVsbHcgKi8KKyAgICAgIHZhcjUxLng0WzBdID0gKHZhcjUwLng0WzBdICogdmFyNDIueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNTEueDRbMV0gPSAodmFyNTAueDRbMV0gKiB2YXI0Mi54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI1MS54NFsyXSA9ICh2YXI1MC54NFsyXSAqIHZhcjQyLng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjUxLng0WzNdID0gKHZhcjUwLng0WzNdICogdmFyNDIueDRbM10pICYgMHhmZmZmOworICAgICAgLyogODogc2hydXcgKi8KKyAgICAgIHZhcjUyLng0WzBdID0gKChvcmNfdWludDE2KSB2YXI1MS54NFswXSkgPj4gODsKKyAgICAgIHZhcjUyLng0WzFdID0gKChvcmNfdWludDE2KSB2YXI1MS54NFsxXSkgPj4gODsKKyAgICAgIHZhcjUyLng0WzJdID0gKChvcmNfdWludDE2KSB2YXI1MS54NFsyXSkgPj4gODsKKyAgICAgIHZhcjUyLng0WzNdID0gKChvcmNfdWludDE2KSB2YXI1MS54NFszXSkgPj4gODsKKyAgICAgIC8qIDk6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjUzLng0WzBdID0gKG9yY191aW50OCkgdmFyNDUueDRbMF07CisgICAgICB2YXI1My54NFsxXSA9IChvcmNfdWludDgpIHZhcjQ1Lng0WzFdOworICAgICAgdmFyNTMueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI0NS54NFsyXTsKKyAgICAgIHZhcjUzLng0WzNdID0gKG9yY191aW50OCkgdmFyNDUueDRbM107CisgICAgICAvKiAxMDogbXVsbHcgKi8KKyAgICAgIHZhcjU0Lng0WzBdID0gKHZhcjUzLng0WzBdICogdmFyNTIueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNTQueDRbMV0gPSAodmFyNTMueDRbMV0gKiB2YXI1Mi54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI1NC54NFsyXSA9ICh2YXI1My54NFsyXSAqIHZhcjUyLng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjU0Lng0WzNdID0gKHZhcjUzLng0WzNdICogdmFyNTIueDRbM10pICYgMHhmZmZmOworICAgICAgLyogMTI6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjU2Lng0WzBdID0gKG9yY191aW50OCkgdmFyNTUueDRbMF07CisgICAgICB2YXI1Ni54NFsxXSA9IChvcmNfdWludDgpIHZhcjU1Lng0WzFdOworICAgICAgdmFyNTYueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI1NS54NFsyXTsKKyAgICAgIHZhcjU2Lng0WzNdID0gKG9yY191aW50OCkgdmFyNTUueDRbM107CisgICAgICAvKiAxMzogc3VidyAqLworICAgICAgdmFyNTcueDRbMF0gPSB2YXI1Ni54NFswXSAtIHZhcjUyLng0WzBdOworICAgICAgdmFyNTcueDRbMV0gPSB2YXI1Ni54NFsxXSAtIHZhcjUyLng0WzFdOworICAgICAgdmFyNTcueDRbMl0gPSB2YXI1Ni54NFsyXSAtIHZhcjUyLng0WzJdOworICAgICAgdmFyNTcueDRbM10gPSB2YXI1Ni54NFszXSAtIHZhcjUyLng0WzNdOworICAgICAgLyogMTQ6IGxvYWRsICovCisgICAgICB2YXI1OCA9IHB0cjBbaV07CisgICAgICAvKiAxNTogc2hydWwgKi8KKyAgICAgIHZhcjU5LmkgPSAoKG9yY191aW50MzIpIHZhcjU4LmkpID4+IDI0OworICAgICAgLyogMTY6IGNvbnZsdyAqLworICAgICAgdmFyNjAuaSA9IHZhcjU5Lmk7CisgICAgICAvKiAxNzogY29udndiICovCisgICAgICB2YXI2MSA9IHZhcjYwLmk7CisgICAgICAvKiAxODogc3BsYXRibCAqLworICAgICAgdmFyNjIuaSA9CisgICAgICAgICAgKCgoKG9yY191aW50MzIpIHZhcjYxKSAmIDB4ZmYpIDw8IDI0KSB8ICgoKChvcmNfdWludDMyKSB2YXI2MSkgJiAweGZmKQorICAgICAgICAgIDw8IDE2KSB8ICgoKChvcmNfdWludDMyKSB2YXI2MSkgJiAweGZmKSA8PCA4KSB8ICgoKG9yY191aW50MzIpIHZhcjYxKQorICAgICAgICAgICYgMHhmZik7CisgICAgICAvKiAxOTogY29udnVidyAqLworICAgICAgdmFyNjMueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI2Mi54NFswXTsKKyAgICAgIHZhcjYzLng0WzFdID0gKG9yY191aW50OCkgdmFyNjIueDRbMV07CisgICAgICB2YXI2My54NFsyXSA9IChvcmNfdWludDgpIHZhcjYyLng0WzJdOworICAgICAgdmFyNjMueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI2Mi54NFszXTsKKyAgICAgIC8qIDIwOiBtdWxsdyAqLworICAgICAgdmFyNjQueDRbMF0gPSAodmFyNjMueDRbMF0gKiB2YXI1Ny54NFswXSkgJiAweGZmZmY7CisgICAgICB2YXI2NC54NFsxXSA9ICh2YXI2My54NFsxXSAqIHZhcjU3Lng0WzFdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjY0Lng0WzJdID0gKHZhcjYzLng0WzJdICogdmFyNTcueDRbMl0pICYgMHhmZmZmOworICAgICAgdmFyNjQueDRbM10gPSAodmFyNjMueDRbM10gKiB2YXI1Ny54NFszXSkgJiAweGZmZmY7CisgICAgICAvKiAyMTogZGl2MjU1dyAqLworICAgICAgdmFyNjUueDRbMF0gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjY0Lng0WzBdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNjQueDRbMF0gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICB2YXI2NS54NFsxXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNjQueDRbMV0gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI2NC54NFsxXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIHZhcjY1Lng0WzJdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI2NC54NFsyXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjY0Lng0WzJdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgdmFyNjUueDRbM10gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjY0Lng0WzNdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNjQueDRbM10gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICAvKiAyMjogY29udnVidyAqLworICAgICAgdmFyNjYueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI1OC54NFswXTsKKyAgICAgIHZhcjY2Lng0WzFdID0gKG9yY191aW50OCkgdmFyNTgueDRbMV07CisgICAgICB2YXI2Ni54NFsyXSA9IChvcmNfdWludDgpIHZhcjU4Lng0WzJdOworICAgICAgdmFyNjYueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI1OC54NFszXTsKKyAgICAgIC8qIDIzOiBtdWxsdyAqLworICAgICAgdmFyNjcueDRbMF0gPSAodmFyNjYueDRbMF0gKiB2YXI2NS54NFswXSkgJiAweGZmZmY7CisgICAgICB2YXI2Ny54NFsxXSA9ICh2YXI2Ni54NFsxXSAqIHZhcjY1Lng0WzFdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjY3Lng0WzJdID0gKHZhcjY2Lng0WzJdICogdmFyNjUueDRbMl0pICYgMHhmZmZmOworICAgICAgdmFyNjcueDRbM10gPSAodmFyNjYueDRbM10gKiB2YXI2NS54NFszXSkgJiAweGZmZmY7CisgICAgICAvKiAyNDogYWRkdyAqLworICAgICAgdmFyNjgueDRbMF0gPSB2YXI2Ny54NFswXSArIHZhcjU0Lng0WzBdOworICAgICAgdmFyNjgueDRbMV0gPSB2YXI2Ny54NFsxXSArIHZhcjU0Lng0WzFdOworICAgICAgdmFyNjgueDRbMl0gPSB2YXI2Ny54NFsyXSArIHZhcjU0Lng0WzJdOworICAgICAgdmFyNjgueDRbM10gPSB2YXI2Ny54NFszXSArIHZhcjU0Lng0WzNdOworICAgICAgLyogMjU6IGFkZHcgKi8KKyAgICAgIHZhcjY5Lng0WzBdID0gdmFyNjUueDRbMF0gKyB2YXI1Mi54NFswXTsKKyAgICAgIHZhcjY5Lng0WzFdID0gdmFyNjUueDRbMV0gKyB2YXI1Mi54NFsxXTsKKyAgICAgIHZhcjY5Lng0WzJdID0gdmFyNjUueDRbMl0gKyB2YXI1Mi54NFsyXTsKKyAgICAgIHZhcjY5Lng0WzNdID0gdmFyNjUueDRbM10gKyB2YXI1Mi54NFszXTsKKyAgICAgIC8qIDI2OiBkaXZsdXcgKi8KKyAgICAgIHZhcjcwLng0WzBdID0KKyAgICAgICAgICAoKHZhcjY5Lng0WzBdICYgMHhmZikgPT0KKyAgICAgICAgICAwKSA/IDI1NSA6IE9SQ19DTEFNUF9VQiAoKChvcmNfdWludDE2KSB2YXI2OC54NFswXSkgLworICAgICAgICAgICgob3JjX3VpbnQxNikgdmFyNjkueDRbMF0gJiAweGZmKSk7CisgICAgICB2YXI3MC54NFsxXSA9CisgICAgICAgICAgKCh2YXI2OS54NFsxXSAmIDB4ZmYpID09CisgICAgICAgICAgMCkgPyAyNTUgOiBPUkNfQ0xBTVBfVUIgKCgob3JjX3VpbnQxNikgdmFyNjgueDRbMV0pIC8KKyAgICAgICAgICAoKG9yY191aW50MTYpIHZhcjY5Lng0WzFdICYgMHhmZikpOworICAgICAgdmFyNzAueDRbMl0gPQorICAgICAgICAgICgodmFyNjkueDRbMl0gJiAweGZmKSA9PQorICAgICAgICAgIDApID8gMjU1IDogT1JDX0NMQU1QX1VCICgoKG9yY191aW50MTYpIHZhcjY4Lng0WzJdKSAvCisgICAgICAgICAgKChvcmNfdWludDE2KSB2YXI2OS54NFsyXSAmIDB4ZmYpKTsKKyAgICAgIHZhcjcwLng0WzNdID0KKyAgICAgICAgICAoKHZhcjY5Lng0WzNdICYgMHhmZikgPT0KKyAgICAgICAgICAwKSA/IDI1NSA6IE9SQ19DTEFNUF9VQiAoKChvcmNfdWludDE2KSB2YXI2OC54NFszXSkgLworICAgICAgICAgICgob3JjX3VpbnQxNikgdmFyNjkueDRbM10gJiAweGZmKSk7CisgICAgICAvKiAyNzogY29udndiICovCisgICAgICB2YXI3MS54NFswXSA9IHZhcjcwLng0WzBdOworICAgICAgdmFyNzEueDRbMV0gPSB2YXI3MC54NFsxXTsKKyAgICAgIHZhcjcxLng0WzJdID0gdmFyNzAueDRbMl07CisgICAgICB2YXI3MS54NFszXSA9IHZhcjcwLng0WzNdOworICAgICAgLyogMjk6IGFuZGwgKi8KKyAgICAgIHZhcjcyLmkgPSB2YXI3MS5pICYgdmFyNDMuaTsKKyAgICAgIC8qIDMwOiBjb252d2IgKi8KKyAgICAgIHZhcjczLng0WzBdID0gdmFyNjkueDRbMF07CisgICAgICB2YXI3My54NFsxXSA9IHZhcjY5Lng0WzFdOworICAgICAgdmFyNzMueDRbMl0gPSB2YXI2OS54NFsyXTsKKyAgICAgIHZhcjczLng0WzNdID0gdmFyNjkueDRbM107CisgICAgICAvKiAzMjogYW5kbCAqLworICAgICAgdmFyNzQuaSA9IHZhcjczLmkgJiB2YXI0NC5pOworICAgICAgLyogMzM6IG9ybCAqLworICAgICAgdmFyNzUuaSA9IHZhcjcyLmkgfCB2YXI3NC5pOworICAgICAgLyogMzQ6IHN0b3JlbCAqLworICAgICAgcHRyMFtpXSA9IHZhcjc1OworICAgIH0KKyAgfQorCit9CisKKyNlbHNlCitzdGF0aWMgdm9pZAorX2JhY2t1cF92aWRlb19taXhlcl9vcmNfb3ZlcmxheV9iZ3JhIChPcmNFeGVjdXRvciAqIE9SQ19SRVNUUklDVCBleCkKK3sKKyAgaW50IGk7CisgIGludCBqOworICBpbnQgbiA9IGV4LT5uOworICBpbnQgbSA9IGV4LT5wYXJhbXNbT1JDX1ZBUl9BMV07CisgIG9yY191bmlvbjMyICpPUkNfUkVTVFJJQ1QgcHRyMDsKKyAgY29uc3Qgb3JjX3VuaW9uMzIgKk9SQ19SRVNUUklDVCBwdHI0OworICBvcmNfdW5pb242NCB2YXI0MjsKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA9PSAyICYmIGRlZmluZWQgKF9faTM4Nl9fKQorICB2b2xhdGlsZSBvcmNfdW5pb24zMiB2YXI0MzsKKyNlbHNlCisgIG9yY191bmlvbjMyIHZhcjQzOworI2VuZGlmCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPT0gMiAmJiBkZWZpbmVkIChfX2kzODZfXykKKyAgdm9sYXRpbGUgb3JjX3VuaW9uMzIgdmFyNDQ7CisjZWxzZQorICBvcmNfdW5pb24zMiB2YXI0NDsKKyNlbmRpZgorICBvcmNfdW5pb24zMiB2YXI0NTsKKyAgb3JjX3VuaW9uMzIgdmFyNDY7CisgIG9yY191bmlvbjE2IHZhcjQ3OworICBvcmNfaW50OCB2YXI0ODsKKyAgb3JjX3VuaW9uMzIgdmFyNDk7CisgIG9yY191bmlvbjY0IHZhcjUwOworICBvcmNfdW5pb242NCB2YXI1MTsKKyAgb3JjX3VuaW9uNjQgdmFyNTI7CisgIG9yY191bmlvbjY0IHZhcjUzOworICBvcmNfdW5pb242NCB2YXI1NDsKKyAgb3JjX3VuaW9uMzIgdmFyNTU7CisgIG9yY191bmlvbjY0IHZhcjU2OworICBvcmNfdW5pb242NCB2YXI1NzsKKyAgb3JjX3VuaW9uMzIgdmFyNTg7CisgIG9yY191bmlvbjMyIHZhcjU5OworICBvcmNfdW5pb24xNiB2YXI2MDsKKyAgb3JjX2ludDggdmFyNjE7CisgIG9yY191bmlvbjMyIHZhcjYyOworICBvcmNfdW5pb242NCB2YXI2MzsKKyAgb3JjX3VuaW9uNjQgdmFyNjQ7CisgIG9yY191bmlvbjY0IHZhcjY1OworICBvcmNfdW5pb242NCB2YXI2NjsKKyAgb3JjX3VuaW9uNjQgdmFyNjc7CisgIG9yY191bmlvbjY0IHZhcjY4OworICBvcmNfdW5pb242NCB2YXI2OTsKKyAgb3JjX3VuaW9uNjQgdmFyNzA7CisgIG9yY191bmlvbjMyIHZhcjcxOworICBvcmNfdW5pb24zMiB2YXI3MjsKKyAgb3JjX3VuaW9uMzIgdmFyNzM7CisgIG9yY191bmlvbjMyIHZhcjc0OworICBvcmNfdW5pb24zMiB2YXI3NTsKKworICBmb3IgKGogPSAwOyBqIDwgbTsgaisrKSB7CisgICAgcHRyMCA9IE9SQ19QVFJfT0ZGU0VUIChleC0+YXJyYXlzWzBdLCBleC0+cGFyYW1zWzBdICogaik7CisgICAgcHRyNCA9IE9SQ19QVFJfT0ZGU0VUIChleC0+YXJyYXlzWzRdLCBleC0+cGFyYW1zWzRdICogaik7CisKKyAgICAvKiA2OiBsb2FkcHcgKi8KKyAgICB2YXI0Mi54NFswXSA9IGV4LT5wYXJhbXNbMjRdOworICAgIHZhcjQyLng0WzFdID0gZXgtPnBhcmFtc1syNF07CisgICAgdmFyNDIueDRbMl0gPSBleC0+cGFyYW1zWzI0XTsKKyAgICB2YXI0Mi54NFszXSA9IGV4LT5wYXJhbXNbMjRdOworICAgIC8qIDExOiBsb2FkcGwgKi8KKyAgICB2YXI1NS5pID0gMHhmZmZmZmZmZjsgICAgICAgLyogLTEgb3IgMi4xMjJlLTMxNGYgKi8KKyAgICAvKiAyODogbG9hZHBsICovCisgICAgdmFyNDMuaSA9IDB4MDBmZmZmZmY7ICAgICAgIC8qIDE2Nzc3MjE1IG9yIDguMjg5MDVlLTMxN2YgKi8KKyAgICAvKiAzMTogbG9hZHBsICovCisgICAgdmFyNDQuaSA9IDB4ZmYwMDAwMDA7ICAgICAgIC8qIC0xNjc3NzIxNiBvciAyLjExMzcxZS0zMTRmICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAvKiAwOiBsb2FkbCAqLworICAgICAgdmFyNDUgPSBwdHI0W2ldOworICAgICAgLyogMTogc2hydWwgKi8KKyAgICAgIHZhcjQ2LmkgPSAoKG9yY191aW50MzIpIHZhcjQ1LmkpID4+IDI0OworICAgICAgLyogMjogY29udmx3ICovCisgICAgICB2YXI0Ny5pID0gdmFyNDYuaTsKKyAgICAgIC8qIDM6IGNvbnZ3YiAqLworICAgICAgdmFyNDggPSB2YXI0Ny5pOworICAgICAgLyogNDogc3BsYXRibCAqLworICAgICAgdmFyNDkuaSA9CisgICAgICAgICAgKCgoKG9yY191aW50MzIpIHZhcjQ4KSAmIDB4ZmYpIDw8IDI0KSB8ICgoKChvcmNfdWludDMyKSB2YXI0OCkgJiAweGZmKQorICAgICAgICAgIDw8IDE2KSB8ICgoKChvcmNfdWludDMyKSB2YXI0OCkgJiAweGZmKSA8PCA4KSB8ICgoKG9yY191aW50MzIpIHZhcjQ4KQorICAgICAgICAgICYgMHhmZik7CisgICAgICAvKiA1OiBjb252dWJ3ICovCisgICAgICB2YXI1MC54NFswXSA9IChvcmNfdWludDgpIHZhcjQ5Lng0WzBdOworICAgICAgdmFyNTAueDRbMV0gPSAob3JjX3VpbnQ4KSB2YXI0OS54NFsxXTsKKyAgICAgIHZhcjUwLng0WzJdID0gKG9yY191aW50OCkgdmFyNDkueDRbMl07CisgICAgICB2YXI1MC54NFszXSA9IChvcmNfdWludDgpIHZhcjQ5Lng0WzNdOworICAgICAgLyogNzogbXVsbHcgKi8KKyAgICAgIHZhcjUxLng0WzBdID0gKHZhcjUwLng0WzBdICogdmFyNDIueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNTEueDRbMV0gPSAodmFyNTAueDRbMV0gKiB2YXI0Mi54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI1MS54NFsyXSA9ICh2YXI1MC54NFsyXSAqIHZhcjQyLng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjUxLng0WzNdID0gKHZhcjUwLng0WzNdICogdmFyNDIueDRbM10pICYgMHhmZmZmOworICAgICAgLyogODogc2hydXcgKi8KKyAgICAgIHZhcjUyLng0WzBdID0gKChvcmNfdWludDE2KSB2YXI1MS54NFswXSkgPj4gODsKKyAgICAgIHZhcjUyLng0WzFdID0gKChvcmNfdWludDE2KSB2YXI1MS54NFsxXSkgPj4gODsKKyAgICAgIHZhcjUyLng0WzJdID0gKChvcmNfdWludDE2KSB2YXI1MS54NFsyXSkgPj4gODsKKyAgICAgIHZhcjUyLng0WzNdID0gKChvcmNfdWludDE2KSB2YXI1MS54NFszXSkgPj4gODsKKyAgICAgIC8qIDk6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjUzLng0WzBdID0gKG9yY191aW50OCkgdmFyNDUueDRbMF07CisgICAgICB2YXI1My54NFsxXSA9IChvcmNfdWludDgpIHZhcjQ1Lng0WzFdOworICAgICAgdmFyNTMueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI0NS54NFsyXTsKKyAgICAgIHZhcjUzLng0WzNdID0gKG9yY191aW50OCkgdmFyNDUueDRbM107CisgICAgICAvKiAxMDogbXVsbHcgKi8KKyAgICAgIHZhcjU0Lng0WzBdID0gKHZhcjUzLng0WzBdICogdmFyNTIueDRbMF0pICYgMHhmZmZmOworICAgICAgdmFyNTQueDRbMV0gPSAodmFyNTMueDRbMV0gKiB2YXI1Mi54NFsxXSkgJiAweGZmZmY7CisgICAgICB2YXI1NC54NFsyXSA9ICh2YXI1My54NFsyXSAqIHZhcjUyLng0WzJdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjU0Lng0WzNdID0gKHZhcjUzLng0WzNdICogdmFyNTIueDRbM10pICYgMHhmZmZmOworICAgICAgLyogMTI6IGNvbnZ1YncgKi8KKyAgICAgIHZhcjU2Lng0WzBdID0gKG9yY191aW50OCkgdmFyNTUueDRbMF07CisgICAgICB2YXI1Ni54NFsxXSA9IChvcmNfdWludDgpIHZhcjU1Lng0WzFdOworICAgICAgdmFyNTYueDRbMl0gPSAob3JjX3VpbnQ4KSB2YXI1NS54NFsyXTsKKyAgICAgIHZhcjU2Lng0WzNdID0gKG9yY191aW50OCkgdmFyNTUueDRbM107CisgICAgICAvKiAxMzogc3VidyAqLworICAgICAgdmFyNTcueDRbMF0gPSB2YXI1Ni54NFswXSAtIHZhcjUyLng0WzBdOworICAgICAgdmFyNTcueDRbMV0gPSB2YXI1Ni54NFsxXSAtIHZhcjUyLng0WzFdOworICAgICAgdmFyNTcueDRbMl0gPSB2YXI1Ni54NFsyXSAtIHZhcjUyLng0WzJdOworICAgICAgdmFyNTcueDRbM10gPSB2YXI1Ni54NFszXSAtIHZhcjUyLng0WzNdOworICAgICAgLyogMTQ6IGxvYWRsICovCisgICAgICB2YXI1OCA9IHB0cjBbaV07CisgICAgICAvKiAxNTogc2hydWwgKi8KKyAgICAgIHZhcjU5LmkgPSAoKG9yY191aW50MzIpIHZhcjU4LmkpID4+IDI0OworICAgICAgLyogMTY6IGNvbnZsdyAqLworICAgICAgdmFyNjAuaSA9IHZhcjU5Lmk7CisgICAgICAvKiAxNzogY29udndiICovCisgICAgICB2YXI2MSA9IHZhcjYwLmk7CisgICAgICAvKiAxODogc3BsYXRibCAqLworICAgICAgdmFyNjIuaSA9CisgICAgICAgICAgKCgoKG9yY191aW50MzIpIHZhcjYxKSAmIDB4ZmYpIDw8IDI0KSB8ICgoKChvcmNfdWludDMyKSB2YXI2MSkgJiAweGZmKQorICAgICAgICAgIDw8IDE2KSB8ICgoKChvcmNfdWludDMyKSB2YXI2MSkgJiAweGZmKSA8PCA4KSB8ICgoKG9yY191aW50MzIpIHZhcjYxKQorICAgICAgICAgICYgMHhmZik7CisgICAgICAvKiAxOTogY29udnVidyAqLworICAgICAgdmFyNjMueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI2Mi54NFswXTsKKyAgICAgIHZhcjYzLng0WzFdID0gKG9yY191aW50OCkgdmFyNjIueDRbMV07CisgICAgICB2YXI2My54NFsyXSA9IChvcmNfdWludDgpIHZhcjYyLng0WzJdOworICAgICAgdmFyNjMueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI2Mi54NFszXTsKKyAgICAgIC8qIDIwOiBtdWxsdyAqLworICAgICAgdmFyNjQueDRbMF0gPSAodmFyNjMueDRbMF0gKiB2YXI1Ny54NFswXSkgJiAweGZmZmY7CisgICAgICB2YXI2NC54NFsxXSA9ICh2YXI2My54NFsxXSAqIHZhcjU3Lng0WzFdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjY0Lng0WzJdID0gKHZhcjYzLng0WzJdICogdmFyNTcueDRbMl0pICYgMHhmZmZmOworICAgICAgdmFyNjQueDRbM10gPSAodmFyNjMueDRbM10gKiB2YXI1Ny54NFszXSkgJiAweGZmZmY7CisgICAgICAvKiAyMTogZGl2MjU1dyAqLworICAgICAgdmFyNjUueDRbMF0gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjY0Lng0WzBdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNjQueDRbMF0gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICB2YXI2NS54NFsxXSA9CisgICAgICAgICAgKChvcmNfdWludDE2KSAoKChvcmNfdWludDE2KSAodmFyNjQueDRbMV0gKyAxMjgpKSArCisgICAgICAgICAgICAgICgoKG9yY191aW50MTYpICh2YXI2NC54NFsxXSArIDEyOCkpID4+IDgpKSkgPj4gODsKKyAgICAgIHZhcjY1Lng0WzJdID0KKyAgICAgICAgICAoKG9yY191aW50MTYpICgoKG9yY191aW50MTYpICh2YXI2NC54NFsyXSArIDEyOCkpICsKKyAgICAgICAgICAgICAgKCgob3JjX3VpbnQxNikgKHZhcjY0Lng0WzJdICsgMTI4KSkgPj4gOCkpKSA+PiA4OworICAgICAgdmFyNjUueDRbM10gPQorICAgICAgICAgICgob3JjX3VpbnQxNikgKCgob3JjX3VpbnQxNikgKHZhcjY0Lng0WzNdICsgMTI4KSkgKworICAgICAgICAgICAgICAoKChvcmNfdWludDE2KSAodmFyNjQueDRbM10gKyAxMjgpKSA+PiA4KSkpID4+IDg7CisgICAgICAvKiAyMjogY29udnVidyAqLworICAgICAgdmFyNjYueDRbMF0gPSAob3JjX3VpbnQ4KSB2YXI1OC54NFswXTsKKyAgICAgIHZhcjY2Lng0WzFdID0gKG9yY191aW50OCkgdmFyNTgueDRbMV07CisgICAgICB2YXI2Ni54NFsyXSA9IChvcmNfdWludDgpIHZhcjU4Lng0WzJdOworICAgICAgdmFyNjYueDRbM10gPSAob3JjX3VpbnQ4KSB2YXI1OC54NFszXTsKKyAgICAgIC8qIDIzOiBtdWxsdyAqLworICAgICAgdmFyNjcueDRbMF0gPSAodmFyNjYueDRbMF0gKiB2YXI2NS54NFswXSkgJiAweGZmZmY7CisgICAgICB2YXI2Ny54NFsxXSA9ICh2YXI2Ni54NFsxXSAqIHZhcjY1Lng0WzFdKSAmIDB4ZmZmZjsKKyAgICAgIHZhcjY3Lng0WzJdID0gKHZhcjY2Lng0WzJdICogdmFyNjUueDRbMl0pICYgMHhmZmZmOworICAgICAgdmFyNjcueDRbM10gPSAodmFyNjYueDRbM10gKiB2YXI2NS54NFszXSkgJiAweGZmZmY7CisgICAgICAvKiAyNDogYWRkdyAqLworICAgICAgdmFyNjgueDRbMF0gPSB2YXI2Ny54NFswXSArIHZhcjU0Lng0WzBdOworICAgICAgdmFyNjgueDRbMV0gPSB2YXI2Ny54NFsxXSArIHZhcjU0Lng0WzFdOworICAgICAgdmFyNjgueDRbMl0gPSB2YXI2Ny54NFsyXSArIHZhcjU0Lng0WzJdOworICAgICAgdmFyNjgueDRbM10gPSB2YXI2Ny54NFszXSArIHZhcjU0Lng0WzNdOworICAgICAgLyogMjU6IGFkZHcgKi8KKyAgICAgIHZhcjY5Lng0WzBdID0gdmFyNjUueDRbMF0gKyB2YXI1Mi54NFswXTsKKyAgICAgIHZhcjY5Lng0WzFdID0gdmFyNjUueDRbMV0gKyB2YXI1Mi54NFsxXTsKKyAgICAgIHZhcjY5Lng0WzJdID0gdmFyNjUueDRbMl0gKyB2YXI1Mi54NFsyXTsKKyAgICAgIHZhcjY5Lng0WzNdID0gdmFyNjUueDRbM10gKyB2YXI1Mi54NFszXTsKKyAgICAgIC8qIDI2OiBkaXZsdXcgKi8KKyAgICAgIHZhcjcwLng0WzBdID0KKyAgICAgICAgICAoKHZhcjY5Lng0WzBdICYgMHhmZikgPT0KKyAgICAgICAgICAwKSA/IDI1NSA6IE9SQ19DTEFNUF9VQiAoKChvcmNfdWludDE2KSB2YXI2OC54NFswXSkgLworICAgICAgICAgICgob3JjX3VpbnQxNikgdmFyNjkueDRbMF0gJiAweGZmKSk7CisgICAgICB2YXI3MC54NFsxXSA9CisgICAgICAgICAgKCh2YXI2OS54NFsxXSAmIDB4ZmYpID09CisgICAgICAgICAgMCkgPyAyNTUgOiBPUkNfQ0xBTVBfVUIgKCgob3JjX3VpbnQxNikgdmFyNjgueDRbMV0pIC8KKyAgICAgICAgICAoKG9yY191aW50MTYpIHZhcjY5Lng0WzFdICYgMHhmZikpOworICAgICAgdmFyNzAueDRbMl0gPQorICAgICAgICAgICgodmFyNjkueDRbMl0gJiAweGZmKSA9PQorICAgICAgICAgIDApID8gMjU1IDogT1JDX0NMQU1QX1VCICgoKG9yY191aW50MTYpIHZhcjY4Lng0WzJdKSAvCisgICAgICAgICAgKChvcmNfdWludDE2KSB2YXI2OS54NFsyXSAmIDB4ZmYpKTsKKyAgICAgIHZhcjcwLng0WzNdID0KKyAgICAgICAgICAoKHZhcjY5Lng0WzNdICYgMHhmZikgPT0KKyAgICAgICAgICAwKSA/IDI1NSA6IE9SQ19DTEFNUF9VQiAoKChvcmNfdWludDE2KSB2YXI2OC54NFszXSkgLworICAgICAgICAgICgob3JjX3VpbnQxNikgdmFyNjkueDRbM10gJiAweGZmKSk7CisgICAgICAvKiAyNzogY29udndiICovCisgICAgICB2YXI3MS54NFswXSA9IHZhcjcwLng0WzBdOworICAgICAgdmFyNzEueDRbMV0gPSB2YXI3MC54NFsxXTsKKyAgICAgIHZhcjcxLng0WzJdID0gdmFyNzAueDRbMl07CisgICAgICB2YXI3MS54NFszXSA9IHZhcjcwLng0WzNdOworICAgICAgLyogMjk6IGFuZGwgKi8KKyAgICAgIHZhcjcyLmkgPSB2YXI3MS5pICYgdmFyNDMuaTsKKyAgICAgIC8qIDMwOiBjb252d2IgKi8KKyAgICAgIHZhcjczLng0WzBdID0gdmFyNjkueDRbMF07CisgICAgICB2YXI3My54NFsxXSA9IHZhcjY5Lng0WzFdOworICAgICAgdmFyNzMueDRbMl0gPSB2YXI2OS54NFsyXTsKKyAgICAgIHZhcjczLng0WzNdID0gdmFyNjkueDRbM107CisgICAgICAvKiAzMjogYW5kbCAqLworICAgICAgdmFyNzQuaSA9IHZhcjczLmkgJiB2YXI0NC5pOworICAgICAgLyogMzM6IG9ybCAqLworICAgICAgdmFyNzUuaSA9IHZhcjcyLmkgfCB2YXI3NC5pOworICAgICAgLyogMzQ6IHN0b3JlbCAqLworICAgICAgcHRyMFtpXSA9IHZhcjc1OworICAgIH0KKyAgfQorCit9CisKK3ZvaWQKK3ZpZGVvX21peGVyX29yY19vdmVybGF5X2JncmEgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwKKyAgICBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKQoreworICBPcmNFeGVjdXRvciBfZXgsICpleCA9ICZfZXg7CisgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcF9pbml0ZWQgPSAwOworICBzdGF0aWMgT3JjQ29kZSAqYyA9IDA7CisgIHZvaWQgKCpmdW5jKSAoT3JjRXhlY3V0b3IgKik7CisKKyAgaWYgKCFwX2luaXRlZCkgeworICAgIG9yY19vbmNlX211dGV4X2xvY2sgKCk7CisgICAgaWYgKCFwX2luaXRlZCkgeworICAgICAgT3JjUHJvZ3JhbSAqcDsKKworI2lmIDEKKyAgICAgIHN0YXRpYyBjb25zdCBvcmNfdWludDggYmNbXSA9IHsKKyAgICAgICAgMSwgNywgOSwgMjgsIDExOCwgMTA1LCAxMDAsIDEwMSwgMTExLCA5NSwgMTA5LCAxMDUsIDEyMCwgMTAxLCAxMTQsIDk1LAorICAgICAgICAxMTEsIDExNCwgOTksIDk1LCAxMTEsIDExOCwgMTAxLCAxMTQsIDEwOCwgOTcsIDEyMSwgOTUsIDk4LCAxMDMsIDExNCwKKyAgICAgICAgOTcsCisgICAgICAgIDExLCA0LCA0LCAxMiwgNCwgNCwgMTQsIDQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMTQsIDQsIDAsIDAsCisgICAgICAgIDAsIDI1NSwgMTQsIDQsIDI1NSwgMjU1LCAyNTUsIDAsIDE0LCA0LCAyNCwgMCwgMCwgMCwgMTQsIDIsCisgICAgICAgIDgsIDAsIDAsIDAsIDE2LCAyLCAyMCwgNCwgMjAsIDQsIDIwLCAyLCAyMCwgMSwgMjAsIDgsCisgICAgICAgIDIwLCA4LCAyMCwgOCwgMjAsIDQsIDIwLCA4LCAyMCwgOCwgMTEzLCAzMiwgNCwgMTI2LCAzMywgMzIsCisgICAgICAgIDE5LCAxNjMsIDM0LCAzMywgMTU3LCAzNSwgMzQsIDE1MiwgMzksIDM1LCAyMSwgMiwgMTUwLCAzNiwgMzksIDIxLAorICAgICAgICAyLCA4OSwgMzYsIDM2LCAyNCwgMjEsIDIsIDk1LCAzNiwgMzYsIDIwLCAyMSwgMiwgMTUwLCA0MSwgMzIsCisgICAgICAgIDIxLCAyLCA4OSwgNDEsIDQxLCAzNiwgMTE1LCAzOSwgMTYsIDIxLCAyLCAxNTAsIDM3LCAzOSwgMjEsIDIsCisgICAgICAgIDk4LCAzNywgMzcsIDM2LCAxMTMsIDMyLCAwLCAxMjYsIDMzLCAzMiwgMTksIDE2MywgMzQsIDMzLCAxNTcsIDM1LAorICAgICAgICAzNCwgMTUyLCAzOSwgMzUsIDIxLCAyLCAxNTAsIDM4LCAzOSwgMjEsIDIsIDg5LCAzOCwgMzgsIDM3LCAyMSwKKyAgICAgICAgMiwgODAsIDM4LCAzOCwgMjEsIDIsIDE1MCwgNDAsIDMyLCAyMSwgMiwgODksIDQwLCA0MCwgMzgsIDIxLAorICAgICAgICAyLCA3MCwgNDAsIDQwLCA0MSwgMjEsIDIsIDcwLCAzOCwgMzgsIDM2LCAyMSwgMiwgODEsIDQwLCA0MCwKKyAgICAgICAgMzgsIDIxLCAyLCAxNTcsIDMyLCA0MCwgMTA2LCAzMiwgMzIsIDE4LCAyMSwgMiwgMTU3LCAzOSwgMzgsIDEwNiwKKyAgICAgICAgMzksIDM5LCAxNywgMTIzLCAzMiwgMzIsIDM5LCAxMjgsIDAsIDMyLCAyLCAwLAorICAgICAgfTsKKyAgICAgIHAgPSBvcmNfcHJvZ3JhbV9uZXdfZnJvbV9zdGF0aWNfYnl0ZWNvZGUgKGJjKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsIF9iYWNrdXBfdmlkZW9fbWl4ZXJfb3JjX292ZXJsYXlfYmdyYSk7CisjZWxzZQorICAgICAgcCA9IG9yY19wcm9ncmFtX25ldyAoKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF8yZCAocCk7CisgICAgICBvcmNfcHJvZ3JhbV9zZXRfbmFtZSAocCwgInZpZGVvX21peGVyX29yY19vdmVybGF5X2JncmEiKTsKKyAgICAgIG9yY19wcm9ncmFtX3NldF9iYWNrdXBfZnVuY3Rpb24gKHAsIF9iYWNrdXBfdmlkZW9fbWl4ZXJfb3JjX292ZXJsYXlfYmdyYSk7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfZGVzdGluYXRpb24gKHAsIDQsICJkMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3NvdXJjZSAocCwgNCwgInMxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfY29uc3RhbnQgKHAsIDQsIDB4ZmZmZmZmZmYsICJjMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2NvbnN0YW50IChwLCA0LCAweGZmMDAwMDAwLCAiYzIiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9jb25zdGFudCAocCwgNCwgMHgwMGZmZmZmZiwgImMzIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfY29uc3RhbnQgKHAsIDQsIDB4MDAwMDAwMTgsICJjNCIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX2NvbnN0YW50IChwLCAyLCAweDAwMDAwMDA4LCAiYzUiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF9wYXJhbWV0ZXIgKHAsIDIsICJwMSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgNCwgInQxIik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDIiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDIsICJ0MyIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgMSwgInQ0Iik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA4LCAidDUiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDgsICJ0NiIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgOCwgInQ3Iik7CisgICAgICBvcmNfcHJvZ3JhbV9hZGRfdGVtcG9yYXJ5IChwLCA0LCAidDgiKTsKKyAgICAgIG9yY19wcm9ncmFtX2FkZF90ZW1wb3JhcnkgKHAsIDgsICJ0OSIpOworICAgICAgb3JjX3Byb2dyYW1fYWRkX3RlbXBvcmFyeSAocCwgOCwgInQxMCIpOworCisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImxvYWRsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9TMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2hydWwiLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0M0LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252bHciLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QyLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252d2IiLCAwLCBPUkNfVkFSX1Q0LCBPUkNfVkFSX1QzLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJzcGxhdGJsIiwgMCwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9UNCwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnVidyIsIDIsIE9SQ19WQVJfVDUsIE9SQ19WQVJfVDgsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGx3IiwgMiwgT1JDX1ZBUl9UNSwgT1JDX1ZBUl9UNSwgT1JDX1ZBUl9QMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2hydXciLCAyLCBPUkNfVkFSX1Q1LCBPUkNfVkFSX1Q1LCBPUkNfVkFSX0M1LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMiwgT1JDX1ZBUl9UMTAsIE9SQ19WQVJfVDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGx3IiwgMiwgT1JDX1ZBUl9UMTAsIE9SQ19WQVJfVDEwLCBPUkNfVkFSX1Q1LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJsb2FkcGwiLCAwLCBPUkNfVkFSX1Q4LCBPUkNfVkFSX0MxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252dWJ3IiwgMiwgT1JDX1ZBUl9UNiwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic3VidyIsIDIsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDYsIE9SQ19WQVJfVDUsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImxvYWRsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic2hydWwiLCAwLCBPUkNfVkFSX1QyLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0M0LAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252bHciLCAwLCBPUkNfVkFSX1QzLCBPUkNfVkFSX1QyLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252d2IiLCAwLCBPUkNfVkFSX1Q0LCBPUkNfVkFSX1QzLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJzcGxhdGJsIiwgMCwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9UNCwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiY29udnVidyIsIDIsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDgsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgIm11bGx3IiwgMiwgT1JDX1ZBUl9UNywgT1JDX1ZBUl9UNywgT1JDX1ZBUl9UNiwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiZGl2MjU1dyIsIDIsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDcsIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZ1YnciLCAyLCBPUkNfVkFSX1Q5LCBPUkNfVkFSX1QxLCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJtdWxsdyIsIDIsIE9SQ19WQVJfVDksIE9SQ19WQVJfVDksIE9SQ19WQVJfVDcsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImFkZHciLCAyLCBPUkNfVkFSX1Q5LCBPUkNfVkFSX1Q5LCBPUkNfVkFSX1QxMCwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAiYWRkdyIsIDIsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDcsIE9SQ19WQVJfVDUsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImRpdmx1dyIsIDIsIE9SQ19WQVJfVDksIE9SQ19WQVJfVDksIE9SQ19WQVJfVDcsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImNvbnZ3YiIsIDIsIE9SQ19WQVJfVDEsIE9SQ19WQVJfVDksIE9SQ19WQVJfRDEsCisgICAgICAgICAgT1JDX1ZBUl9EMSk7CisgICAgICBvcmNfcHJvZ3JhbV9hcHBlbmRfMiAocCwgImFuZGwiLCAwLCBPUkNfVkFSX1QxLCBPUkNfVkFSX1QxLCBPUkNfVkFSX0MzLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJjb252d2IiLCAyLCBPUkNfVkFSX1Q4LCBPUkNfVkFSX1Q3LCBPUkNfVkFSX0QxLAorICAgICAgICAgIE9SQ19WQVJfRDEpOworICAgICAgb3JjX3Byb2dyYW1fYXBwZW5kXzIgKHAsICJhbmRsIiwgMCwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9UOCwgT1JDX1ZBUl9DMiwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAib3JsIiwgMCwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9UOCwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyAgICAgIG9yY19wcm9ncmFtX2FwcGVuZF8yIChwLCAic3RvcmVsIiwgMCwgT1JDX1ZBUl9EMSwgT1JDX1ZBUl9UMSwgT1JDX1ZBUl9EMSwKKyAgICAgICAgICBPUkNfVkFSX0QxKTsKKyNlbmRpZgorCisgICAgICBvcmNfcHJvZ3JhbV9jb21waWxlIChwKTsKKyAgICAgIGMgPSBvcmNfcHJvZ3JhbV90YWtlX2NvZGUgKHApOworICAgICAgb3JjX3Byb2dyYW1fZnJlZSAocCk7CisgICAgfQorICAgIHBfaW5pdGVkID0gVFJVRTsKKyAgICBvcmNfb25jZV9tdXRleF91bmxvY2sgKCk7CisgIH0KKyAgZXgtPmFycmF5c1tPUkNfVkFSX0EyXSA9IGM7CisgIGV4LT5wcm9ncmFtID0gMDsKKworICBleC0+biA9IG47CisgIE9SQ19FWEVDVVRPUl9NIChleCkgPSBtOworICBleC0+YXJyYXlzW09SQ19WQVJfRDFdID0gZDE7CisgIGV4LT5wYXJhbXNbT1JDX1ZBUl9EMV0gPSBkMV9zdHJpZGU7CisgIGV4LT5hcnJheXNbT1JDX1ZBUl9TMV0gPSAodm9pZCAqKSBzMTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1MxXSA9IHMxX3N0cmlkZTsKKyAgZXgtPnBhcmFtc1tPUkNfVkFSX1AxXSA9IHAxOworCisgIGZ1bmMgPSBjLT5leGVjOworICBmdW5jIChleCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2dzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJvcmMtZGlzdC5oIGIvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy1kaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBjMDcwZgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJvcmMtZGlzdC5oCkBAIC0wLDAgKzEsOTYgQEAKKworLyogYXV0b2dlbmVyYXRlZCBmcm9tIHZpZGVvbWl4ZXJvcmMub3JjICovCisKKyNpZm5kZWYgX1ZJREVPTUlYRVJPUkNfSF8KKyNkZWZpbmUgX1ZJREVPTUlYRVJPUkNfSF8KKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKworI2lmbmRlZiBfT1JDX0lOVEVHRVJfVFlQRURFRlNfCisjZGVmaW5lIF9PUkNfSU5URUdFUl9UWVBFREVGU18KKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorI2luY2x1ZGUgPHN0ZGludC5oPgordHlwZWRlZiBpbnQ4X3Qgb3JjX2ludDg7Cit0eXBlZGVmIGludDE2X3Qgb3JjX2ludDE2OwordHlwZWRlZiBpbnQzMl90IG9yY19pbnQzMjsKK3R5cGVkZWYgaW50NjRfdCBvcmNfaW50NjQ7Cit0eXBlZGVmIHVpbnQ4X3Qgb3JjX3VpbnQ4OwordHlwZWRlZiB1aW50MTZfdCBvcmNfdWludDE2OwordHlwZWRlZiB1aW50MzJfdCBvcmNfdWludDMyOwordHlwZWRlZiB1aW50NjRfdCBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgVUlOVDY0X0MoeCkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCit0eXBlZGVmIHNpZ25lZCBfX2ludDggb3JjX2ludDg7Cit0eXBlZGVmIHNpZ25lZCBfX2ludDE2IG9yY19pbnQxNjsKK3R5cGVkZWYgc2lnbmVkIF9faW50MzIgb3JjX2ludDMyOwordHlwZWRlZiBzaWduZWQgX19pbnQ2NCBvcmNfaW50NjQ7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50OCBvcmNfdWludDg7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50MTYgb3JjX3VpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQzMiBvcmNfdWludDMyOwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IG9yY191aW50NjQ7CisjZGVmaW5lIE9SQ19VSU5UNjRfQyh4KSAoeCMjVWk2NCkKKyNkZWZpbmUgaW5saW5lIF9faW5saW5lCisjZWxzZQorI2luY2x1ZGUgPGxpbWl0cy5oPgordHlwZWRlZiBzaWduZWQgY2hhciBvcmNfaW50ODsKK3R5cGVkZWYgc2hvcnQgb3JjX2ludDE2OwordHlwZWRlZiBpbnQgb3JjX2ludDMyOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIG9yY191aW50ODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgb3JjX3VpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IG9yY191aW50MzI7CisjaWYgSU5UX01BWCA9PSBMT05HX01BWAordHlwZWRlZiBsb25nIGxvbmcgb3JjX2ludDY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgb3JjX3VpbnQ2NDsKKyNkZWZpbmUgT1JDX1VJTlQ2NF9DKHgpICh4IyNVTEwpCisjZWxzZQordHlwZWRlZiBsb25nIG9yY19pbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBvcmNfdWludDY0OworI2RlZmluZSBPUkNfVUlOVDY0X0MoeCkgKHgjI1VMKQorI2VuZGlmCisjZW5kaWYKK3R5cGVkZWYgdW5pb24geyBvcmNfaW50MTYgaTsgb3JjX2ludDggeDJbMl07IH0gb3JjX3VuaW9uMTY7Cit0eXBlZGVmIHVuaW9uIHsgb3JjX2ludDMyIGk7IGZsb2F0IGY7IG9yY19pbnQxNiB4MlsyXTsgb3JjX2ludDggeDRbNF07IH0gb3JjX3VuaW9uMzI7Cit0eXBlZGVmIHVuaW9uIHsgb3JjX2ludDY0IGk7IGRvdWJsZSBmOyBvcmNfaW50MzIgeDJbMl07IGZsb2F0IHgyZlsyXTsgb3JjX2ludDE2IHg0WzRdOyB9IG9yY191bmlvbjY0OworI2VuZGlmCisjaWZuZGVmIE9SQ19SRVNUUklDVAorI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjZGVmaW5lIE9SQ19SRVNUUklDVCByZXN0cmljdAorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAorI2RlZmluZSBPUkNfUkVTVFJJQ1QgX19yZXN0cmljdF9fCisjZWxzZQorI2RlZmluZSBPUkNfUkVTVFJJQ1QKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgT1JDX0lOVEVSTkFMCisjaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU5MCkKKyNkZWZpbmUgT1JDX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykgJiYgKF9fU1VOUFJPX0MgPj0gMHg1NTApCisjZGVmaW5lIE9SQ19JTlRFUk5BTCBfX2hpZGRlbgorI2VsaWYgZGVmaW5lZCAoX19HTlVDX18pCisjZGVmaW5lIE9SQ19JTlRFUk5BTCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZWxzZQorI2RlZmluZSBPUkNfSU5URVJOQUwKKyNlbmRpZgorI2VuZGlmCisKK3ZvaWQgdmlkZW9fbWl4ZXJfb3JjX3NwbGF0X3UzMiAoZ3VpbnQzMiAqIE9SQ19SRVNUUklDVCBkMSwgaW50IHAxLCBpbnQgbik7Cit2b2lkIHZpZGVvX21peGVyX29yY19tZW1jcHlfdTMyIChndWludDMyICogT1JDX1JFU1RSSUNUIGQxLCBjb25zdCBndWludDMyICogT1JDX1JFU1RSSUNUIHMxLCBpbnQgbik7Cit2b2lkIHZpZGVvX21peGVyX29yY19ibGVuZF91OCAoZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIGQxLCBpbnQgZDFfc3RyaWRlLCBjb25zdCBndWludDggKiBPUkNfUkVTVFJJQ1QgczEsIGludCBzMV9zdHJpZGUsIGludCBwMSwgaW50IG4sIGludCBtKTsKK3ZvaWQgdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX2FyZ2IgKGd1aW50OCAqIE9SQ19SRVNUUklDVCBkMSwgaW50IGQxX3N0cmlkZSwgY29uc3QgZ3VpbnQ4ICogT1JDX1JFU1RSSUNUIHMxLCBpbnQgczFfc3RyaWRlLCBpbnQgcDEsIGludCBuLCBpbnQgbSk7Cit2b2lkIHZpZGVvX21peGVyX29yY19ibGVuZF9iZ3JhIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBkMV9zdHJpZGUsIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMSwgaW50IHMxX3N0cmlkZSwgaW50IHAxLCBpbnQgbiwgaW50IG0pOwordm9pZCB2aWRlb19taXhlcl9vcmNfb3ZlcmxheV9hcmdiIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBkMV9zdHJpZGUsIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMSwgaW50IHMxX3N0cmlkZSwgaW50IHAxLCBpbnQgbiwgaW50IG0pOwordm9pZCB2aWRlb19taXhlcl9vcmNfb3ZlcmxheV9iZ3JhIChndWludDggKiBPUkNfUkVTVFJJQ1QgZDEsIGludCBkMV9zdHJpZGUsIGNvbnN0IGd1aW50OCAqIE9SQ19SRVNUUklDVCBzMSwgaW50IHMxX3N0cmlkZSwgaW50IHAxLCBpbnQgbiwgaW50IG0pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy5vcmMgYi9nc3QvdmlkZW9taXhlci92aWRlb21peGVyb3JjLm9yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmE4MjM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy5vcmMKQEAgLTAsMCArMSwyMjEgQEAKKy5mdW5jdGlvbiB2aWRlb19taXhlcl9vcmNfc3BsYXRfdTMyCisuZGVzdCA0IGQxIGd1aW50MzIKKy5wYXJhbSA0IHAxIGd1aW50MzIKKworY29weWwgZDEsIHAxCisKKy5mdW5jdGlvbiB2aWRlb19taXhlcl9vcmNfbWVtY3B5X3UzMgorLmRlc3QgNCBkMSBndWludDMyCisuc291cmNlIDQgczEgZ3VpbnQzMgorCitjb3B5bCBkMSwgczEKKworLmZ1bmN0aW9uIHZpZGVvX21peGVyX29yY19ibGVuZF91OAorLmZsYWdzIDJkCisuZGVzdCAxIGQxIGd1aW50OAorLnNvdXJjZSAxIHMxIGd1aW50OAorLnBhcmFtIDIgcDEKKy50ZW1wIDIgdDEKKy50ZW1wIDIgdDIKKy5jb25zdCAxIGMxIDggCisKK2NvbnZ1YncgdDEsIGQxCitjb252dWJ3IHQyLCBzMQorc3VidyB0MiwgdDIsIHQxCittdWxsdyB0MiwgdDIsIHAxCitzaGx3IHQxLCB0MSwgYzEKK2FkZHcgdDIsIHQxLCB0Mgorc2hydXcgdDIsIHQyLCBjMQorY29udnN1c3diIGQxLCB0MgorCisKKy5mdW5jdGlvbiB2aWRlb19taXhlcl9vcmNfYmxlbmRfYXJnYgorLmZsYWdzIDJkCisuZGVzdCA0IGQgZ3VpbnQ4Cisuc291cmNlIDQgcyBndWludDgKKy5wYXJhbSAyIGFscGhhCisudGVtcCA0IHQKKy50ZW1wIDIgdHcKKy50ZW1wIDEgdGIKKy50ZW1wIDQgYQorLnRlbXAgOCBkX3dpZGUKKy50ZW1wIDggc193aWRlCisudGVtcCA4IGFfd2lkZQorLmNvbnN0IDQgYV9hbHBoYSAweDAwMDAwMGZmCisKK2xvYWRsIHQsIHMKK2NvbnZsdyB0dywgdAorY29udndiIHRiLCB0dworc3BsYXRibCBhLCB0YgoreDQgY29udnVidyBhX3dpZGUsIGEKK3g0IG11bGx3IGFfd2lkZSwgYV93aWRlLCBhbHBoYQoreDQgc2hydXcgYV93aWRlLCBhX3dpZGUsIDgKK3g0IGNvbnZ1Yncgc193aWRlLCB0Citsb2FkbCB0LCBkCit4NCBjb252dWJ3IGRfd2lkZSwgdAoreDQgc3VidyBzX3dpZGUsIHNfd2lkZSwgZF93aWRlCit4NCBtdWxsdyBzX3dpZGUsIHNfd2lkZSwgYV93aWRlCit4NCBkaXYyNTV3IHNfd2lkZSwgc193aWRlCit4NCBhZGR3IGRfd2lkZSwgZF93aWRlLCBzX3dpZGUKK3g0IGNvbnZ3YiB0LCBkX3dpZGUKK29ybCB0LCB0LCBhX2FscGhhCitzdG9yZWwgZCwgdAorCisuZnVuY3Rpb24gdmlkZW9fbWl4ZXJfb3JjX2JsZW5kX2JncmEKKy5mbGFncyAyZAorLmRlc3QgNCBkIGd1aW50OAorLnNvdXJjZSA0IHMgZ3VpbnQ4CisucGFyYW0gMiBhbHBoYQorLnRlbXAgNCB0CisudGVtcCA0IHQyCisudGVtcCAyIHR3CisudGVtcCAxIHRiCisudGVtcCA0IGEKKy50ZW1wIDggZF93aWRlCisudGVtcCA4IHNfd2lkZQorLnRlbXAgOCBhX3dpZGUKKy5jb25zdCA0IGFfYWxwaGEgMHhmZjAwMDAwMAorCitsb2FkbCB0LCBzCitzaHJ1bCB0MiwgdCwgMjQKK2NvbnZsdyB0dywgdDIKK2NvbnZ3YiB0YiwgdHcKK3NwbGF0YmwgYSwgdGIKK3g0IGNvbnZ1YncgYV93aWRlLCBhCit4NCBtdWxsdyBhX3dpZGUsIGFfd2lkZSwgYWxwaGEKK3g0IHNocnV3IGFfd2lkZSwgYV93aWRlLCA4Cit4NCBjb252dWJ3IHNfd2lkZSwgdAorbG9hZGwgdCwgZAoreDQgY29udnVidyBkX3dpZGUsIHQKK3g0IHN1Yncgc193aWRlLCBzX3dpZGUsIGRfd2lkZQoreDQgbXVsbHcgc193aWRlLCBzX3dpZGUsIGFfd2lkZQoreDQgZGl2MjU1dyBzX3dpZGUsIHNfd2lkZQoreDQgYWRkdyBkX3dpZGUsIGRfd2lkZSwgc193aWRlCit4NCBjb252d2IgdCwgZF93aWRlCitvcmwgdCwgdCwgYV9hbHBoYQorc3RvcmVsIGQsIHQKKworCisuZnVuY3Rpb24gdmlkZW9fbWl4ZXJfb3JjX292ZXJsYXlfYXJnYgorLmZsYWdzIDJkCisuZGVzdCA0IGQgZ3VpbnQ4Cisuc291cmNlIDQgcyBndWludDgKKy5wYXJhbSAyIGFscGhhCisudGVtcCA0IHQKKy50ZW1wIDIgdHcKKy50ZW1wIDEgdGIKKy50ZW1wIDggYWxwaGFfcworLnRlbXAgOCBhbHBoYV9zX2ludgorLnRlbXAgOCBhbHBoYV9kCisudGVtcCA0IGEKKy50ZW1wIDggZF93aWRlCisudGVtcCA4IHNfd2lkZQorLmNvbnN0IDQgeGZzIDB4ZmZmZmZmZmYKKy5jb25zdCA0IGFfYWxwaGEgMHgwMDAwMDBmZgorLmNvbnN0IDQgYV9hbHBoYV9pbnYgMHhmZmZmZmYwMAorCisjIGNhbGMgc291cmNlIGFscGhhIGFzIGFscGhhX3MgPSBhbHBoYV9zICogYWxwaGEgLyAyNTYKK2xvYWRsIHQsIHMKK2NvbnZsdyB0dywgdAorY29udndiIHRiLCB0dworc3BsYXRibCBhLCB0YgoreDQgY29udnVidyBhbHBoYV9zLCBhCit4NCBtdWxsdyBhbHBoYV9zLCBhbHBoYV9zLCBhbHBoYQoreDQgc2hydXcgYWxwaGFfcywgYWxwaGFfcywgOAoreDQgY29udnVidyBzX3dpZGUsIHQKK3g0IG11bGx3IHNfd2lkZSwgc193aWRlLCBhbHBoYV9zCisKKyMgY2FsYyBkZXN0aW5hdGlvbiBhbHBoYSBhcyBhbHBoYV9kID0gKDI1NS1hbHBoYV9zKSAqIGFscGhhX2QgLyAyNTUKK2xvYWRwbCBhLCB4ZnMKK3g0IGNvbnZ1YncgYWxwaGFfc19pbnYsIGEKK3g0IHN1YncgYWxwaGFfc19pbnYsIGFscGhhX3NfaW52LCBhbHBoYV9zCitsb2FkbCB0LCBkCitjb252bHcgdHcsIHQKK2NvbnZ3YiB0YiwgdHcKK3NwbGF0YmwgYSwgdGIKK3g0IGNvbnZ1YncgYWxwaGFfZCwgYQoreDQgbXVsbHcgYWxwaGFfZCwgYWxwaGFfZCwgYWxwaGFfc19pbnYKK3g0IGRpdjI1NXcgYWxwaGFfZCwgYWxwaGFfZAoreDQgY29udnVidyBkX3dpZGUsIHQKK3g0IG11bGx3IGRfd2lkZSwgZF93aWRlLCBhbHBoYV9kCisKKyMgY2FsYyBmaW5hbCBwaXhlbCBhcyBwaXhfZCA9IHBpeF9zKmFscGhhX3MgKyBwaXhfZCphbHBoYV9kKigyNTUtYWxwaGFfcykvMjU1Cit4NCBhZGR3IGRfd2lkZSwgZF93aWRlLCBzX3dpZGUKKworIyBjYWxjIHRoZSBmaW5hbCBkZXN0aW5hdGlvbiBhbHBoYV9kID0gYWxwaGFfcyArIGFscGhhX2QgKiAoMjU1LWFscGhhX3MpLzI1NQoreDQgYWRkdyBhbHBoYV9kLCBhbHBoYV9kLCBhbHBoYV9zCisKKyMgbm93IG5vcm1hbGl6ZSB0aGUgcGl4X2QgYnkgdGhlIGZpbmFsIGFscGhhIHRvIG1ha2UgaXQgYXNzb2NpYXRpdmUKK3g0IGRpdmx1dywgZF93aWRlLCBkX3dpZGUsIGFscGhhX2QKKworIyBwYWNrIHRoZSBuZXcgYWxwaGEgaW50byB0aGUgY29ycmVjdCBzcG90Cit4NCBjb252d2IgdCwgZF93aWRlCithbmRsIHQsIHQsIGFfYWxwaGFfaW52Cit4NCBjb252d2IgYSwgYWxwaGFfZAorYW5kbCBhLCBhLCBhX2FscGhhCitvcmwgIHQsIHQsIGEKK3N0b3JlbCBkLCB0CisKKy5mdW5jdGlvbiB2aWRlb19taXhlcl9vcmNfb3ZlcmxheV9iZ3JhCisuZmxhZ3MgMmQKKy5kZXN0IDQgZCBndWludDgKKy5zb3VyY2UgNCBzIGd1aW50OAorLnBhcmFtIDIgYWxwaGEKKy50ZW1wIDQgdAorLnRlbXAgNCB0MgorLnRlbXAgMiB0dworLnRlbXAgMSB0YgorLnRlbXAgOCBhbHBoYV9zCisudGVtcCA4IGFscGhhX3NfaW52CisudGVtcCA4IGFscGhhX2QKKy50ZW1wIDQgYQorLnRlbXAgOCBkX3dpZGUKKy50ZW1wIDggc193aWRlCisuY29uc3QgNCB4ZnMgMHhmZmZmZmZmZgorLmNvbnN0IDQgYV9hbHBoYSAweGZmMDAwMDAwCisuY29uc3QgNCBhX2FscGhhX2ludiAweDAwZmZmZmZmCisKKyMgY2FsYyBzb3VyY2UgYWxwaGEgYXMgYWxwaGFfcyA9IGFscGhhX3MgKiBhbHBoYSAvIDI1NgorbG9hZGwgdCwgcworc2hydWwgdDIsIHQsIDI0Citjb252bHcgdHcsIHQyCitjb252d2IgdGIsIHR3CitzcGxhdGJsIGEsIHRiCit4NCBjb252dWJ3IGFscGhhX3MsIGEKK3g0IG11bGx3IGFscGhhX3MsIGFscGhhX3MsIGFscGhhCit4NCBzaHJ1dyBhbHBoYV9zLCBhbHBoYV9zLCA4Cit4NCBjb252dWJ3IHNfd2lkZSwgdAoreDQgbXVsbHcgc193aWRlLCBzX3dpZGUsIGFscGhhX3MKKworIyBjYWxjIGRlc3RpbmF0aW9uIGFscGhhIGFzIGFscGhhX2QgPSAoMjU1LWFscGhhX3MpICogYWxwaGFfZCAvIDI1NQorbG9hZHBsIGEsIHhmcworeDQgY29udnVidyBhbHBoYV9zX2ludiwgYQoreDQgc3VidyBhbHBoYV9zX2ludiwgYWxwaGFfc19pbnYsIGFscGhhX3MKK2xvYWRsIHQsIGQKK3NocnVsIHQyLCB0LCAyNAorY29udmx3IHR3LCB0MgorY29udndiIHRiLCB0dworc3BsYXRibCBhLCB0YgoreDQgY29udnVidyBhbHBoYV9kLCBhCit4NCBtdWxsdyBhbHBoYV9kLCBhbHBoYV9kLCBhbHBoYV9zX2ludgoreDQgZGl2MjU1dyBhbHBoYV9kLCBhbHBoYV9kCit4NCBjb252dWJ3IGRfd2lkZSwgdAoreDQgbXVsbHcgZF93aWRlLCBkX3dpZGUsIGFscGhhX2QKKworIyBjYWxjIGZpbmFsIHBpeGVsIGFzIHBpeF9kID0gcGl4X3MqYWxwaGFfcyArIHBpeF9kKmFscGhhX2QqKDI1NS1hbHBoYV9zKS8yNTUKK3g0IGFkZHcgZF93aWRlLCBkX3dpZGUsIHNfd2lkZQorCisjIGNhbGMgdGhlIGZpbmFsIGRlc3RpbmF0aW9uIGFscGhhX2QgPSBhbHBoYV9zICsgYWxwaGFfZCAqICgyNTUtYWxwaGFfcykvMjU1Cit4NCBhZGR3IGFscGhhX2QsIGFscGhhX2QsIGFscGhhX3MKKworIyBub3cgbm9ybWFsaXplIHRoZSBwaXhfZCBieSB0aGUgZmluYWwgYWxwaGEgdG8gbWFrZSBpdCBhc3NvY2lhdGl2ZQoreDQgZGl2bHV3LCBkX3dpZGUsIGRfd2lkZSwgYWxwaGFfZAorCisjIHBhY2sgdGhlIG5ldyBhbHBoYSBpbnRvIHRoZSBjb3JyZWN0IHNwb3QKK3g0IGNvbnZ3YiB0LCBkX3dpZGUKK2FuZGwgdCwgdCwgYV9hbHBoYV9pbnYKK3g0IGNvbnZ3YiBhLCBhbHBoYV9kCithbmRsIGEsIGEsIGFfYWxwaGEKK29ybCAgdCwgdCwgYQorc3RvcmVsIGQsIHQKKwpkaWZmIC0tZ2l0IGEvZ3N0L3dhdmVuYy9NYWtlZmlsZS5hbSBiL2dzdC93YXZlbmMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVlNjYxZAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC93YXZlbmMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNiBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0d2F2ZW5jLmxhCisKK2xpYmdzdHdhdmVuY19sYV9TT1VSQ0VTID0gZ3N0d2F2ZW5jLmMKK2xpYmdzdHdhdmVuY19sYV9DRkxBR1MgPSAgXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9CQVNFX0NGTEFHUykgXAorCSQoR1NUX0NGTEFHUykKK2xpYmdzdHdhdmVuY19sYV9MSUJBREQgPSAJXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSBcCisJLWxnc3RhdWRpby1AR1NUX0FQSV9WRVJTSU9OQCBcCisJLWxnc3RyaWZmLUBHU1RfQVBJX1ZFUlNJT05AIFwKKwkkKEdTVF9CQVNFX0xJQlMpIFwKKwkkKEdTVF9MSUJTKQorbGliZ3N0d2F2ZW5jX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3R3YXZlbmMuaApkaWZmIC0tZ2l0IGEvZ3N0L3dhdmVuYy9nc3R3YXZlbmMuYyBiL2dzdC93YXZlbmMvZ3N0d2F2ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhOGJkMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC93YXZlbmMvZ3N0d2F2ZW5jLmMKQEAgLTAsMCArMSwxMTQ1IEBACisvKiAtKi0gbU9kZTogQzsgdGFiLXdpZHRoOiAyOyBpbmRlbnQtdGFicy1tb2RlOiB0OyBjLWJhc2ljLW9mZnNldDogMiAtKi0gKi8KKy8qIEdTdHJlYW1lciAud2F2IGVuY29kZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDI+IElhaW4gSG9sbWVzIDxpYWluQHByZXR0eXBlb3BsZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICogCisgKi8KKy8qKgorICogU0VDVElPTjplbGVtZW50LXdhdmVuYworICoKKyAqIEZvcm1hdCBhbiBhdWRpbyBzdHJlYW0gaW50byB0aGUgd2F2IGZvcm1hdC4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgY2RwYXJhbm9pYXNyYyBtb2RlPWNvbnRpbnVvdXMgISBxdWV1ZSAhIGF1ZGlvY29udmVydCAhIHdhdmVuYyAhIGZpbGVzaW5rIGxvY2F0aW9uPWNkLndhdgorICogXXwgUmlwIGEgd2hvbGUgYXVkaW8gQ0QgaW50byBhIHNpbmdsZSB3YXYgZmlsZSwgd2l0aCB0aGUgdHJhY2sgdGFibGUgd3JpdHRlbiBpbnRvIGEgQ1VFIHNoZWV0IGluc2lkZSB0aGUgZmlsZQorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGNkcGFyYW5vaWFzcmMgdHJhY2s9NSAhIHF1ZXVlICEgYXVkaW9jb252ZXJ0ICEgd2F2ZW5jICEgZmlsZXNpbmsgbG9jYXRpb249dHJhY2s1LndhdgorICogXXwgUmlwIHRyYWNrIDUgb2YgYW4gYXVkaW8gQ0QgaW50byBhIHNpbmdsZSB3YXYgZmlsZSBjb250YWluaW5nIHVuZW5jb2RlZCByYXcgYXVkaW8gc2FtcGxlcy4KKyAqIDwvcmVmc2VjdDI+CisgKgorICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJnc3R3YXZlbmMuaCIKKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9yaWZmL3JpZmYtbWVkaWEuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RieXRld3JpdGVyLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHdhdmVuY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCB3YXZlbmNfZGVidWcKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogT2Zmc2V0IFNpemUgICAgRGVzY3JpcHRpb24gICBWYWx1ZQorICAgKiAweDAwICAgNCAgICAgICBJRCAgICAgICAgICAgIHVuaXF1ZSBpZGVudGlmaWNhdGlvbiB2YWx1ZQorICAgKiAweDA0ICAgNCAgICAgICBQb3NpdGlvbiAgICAgIHBsYXkgb3JkZXIgcG9zaXRpb24KKyAgICogMHgwOCAgIDQgICAgICAgRGF0YSBDaHVuayBJRCBSSUZGIElEIG9mIGNvcnJlc3BvbmRpbmcgZGF0YSBjaHVuaworICAgKiAweDBjICAgNCAgICAgICBDaHVuayBTdGFydCAgIEJ5dGUgT2Zmc2V0IG9mIERhdGEgQ2h1bmsgKgorICAgKiAweDEwICAgNCAgICAgICBCbG9jayBTdGFydCAgIEJ5dGUgT2Zmc2V0IHRvIHNhbXBsZSBvZiBGaXJzdCBDaGFubmVsCisgICAqIDB4MTQgICA0ICAgICAgIFNhbXBsZSBPZmZzZXQgQnl0ZSBPZmZzZXQgdG8gc2FtcGxlIGJ5dGUgb2YgRmlyc3QgQ2hhbm5lbAorICAgKi8KKyAgZ3VpbnQzMiBpZDsKKyAgZ3VpbnQzMiBwb3NpdGlvbjsKKyAgZ3VpbnQ4IGRhdGFfY2h1bmtfaWRbNF07CisgIGd1aW50MzIgY2h1bmtfc3RhcnQ7CisgIGd1aW50MzIgYmxvY2tfc3RhcnQ7CisgIGd1aW50MzIgc2FtcGxlX29mZnNldDsKK30gR3N0V2F2RW5jQ3VlOworCit0eXBlZGVmIHN0cnVjdAoreworICAvKiBPZmZzZXQgU2l6ZSAgICBEZXNjcmlwdGlvbiAgICAgVmFsdWUKKyAgICogMHgwMCAgIDQgICAgICAgQ2h1bmsgSUQgICAgICAgICJsYWJsIiAoMHg2QzYxNjI2Qykgb3IgIm5vdGUiICgweDZFNkY3NDY1KQorICAgKiAweDA0ICAgNCAgICAgICBDaHVuayBEYXRhIFNpemUgZGVwZW5kcyBvbiBjb250YWluZWQgdGV4dAorICAgKiAweDA4ICAgNCAgICAgICBDdWUgUG9pbnQgSUQgICAgMCAtIDB4RkZGRkZGRkYKKyAgICogMHgwYyAgICAgICAgICAgVGV4dAorICAgKi8KKyAgZ3VpbnQ4IGNodW5rX2lkWzRdOworICBndWludDMyIGNodW5rX2RhdGFfc2l6ZTsKKyAgZ3VpbnQzMiBjdWVfcG9pbnRfaWQ7CisgIGdjaGFyICp0ZXh0OworfSBHc3RXYXZFbmNMYWJsLCBHc3RXYXZFbmNOb3RlOworCisvKiBGSVhNRTogbW9ubyBkb2Vzbid0IHByb2R1Y2UgY29ycmVjdCBmaWxlcyBpdCBzZWVtcywgYXQgbGVhc3QgbXBsYXllciB4cnVucyAqLworI2RlZmluZSBTSU5LX0NBUFMgXAorICAgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiICAgICAgICAgIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDY1NTM1IF0sICIgICAgICBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgUzMyTEUsIFMyNExFLCBTMTZMRSwgVTgsIEYzMkxFLCBGNjRMRSB9LCAiIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQiICAgICAgXAorICAgICI7ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImF1ZGlvL3gtYWxhdywgIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmF0ZSA9IChpbnQpIFsgODAwMCwgMTkyMDAwIF0sICIgICAgXAorICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdOyAiICAgICAgICBcCisgICAgImF1ZGlvL3gtbXVsYXcsICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmF0ZSA9IChpbnQpIFsgODAwMCwgMTkyMDAwIF0sICIgICAgXAorICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgMiBdIgorCisjZGVmaW5lIFNSQ19DQVBTIFwKKyAgICAiYXVkaW8veC13YXY7ICIgXAorICAgICJhdWRpby94LXJmNjQiCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFNJTktfQ0FQUykKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChTUkNfQ0FQUykKKyAgICApOworCisjZGVmaW5lIGdzdF93YXZlbmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdFdhdkVuYywgZ3N0X3dhdmVuYywgR1NUX1RZUEVfRUxFTUVOVCwKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1RBR19TRVRURVIsIE5VTEwpCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9UT0NfU0VUVEVSLCBOVUxMKQorICAgICk7CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF93YXZlbmNfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEJ1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3dhdmVuY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0RXZlbnQgKiBldmVudCk7CitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3dhdmVuY19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworc3RhdGljIGdib29sZWFuIGdzdF93YXZlbmNfc2lua19zZXRjYXBzIChHc3RQYWQgKiBwYWQsIEdzdENhcHMgKiBjYXBzKTsKKworc3RhdGljIHZvaWQKK2dzdF93YXZlbmNfY2xhc3NfaW5pdCAoR3N0V2F2RW5jQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworCisgIGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworCisgIGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2ZW5jX2NoYW5nZV9zdGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIldBViBhdWRpbyBtdXhlciIsCisgICAgICAiQ29kZWMvTXV4ZXIvQXVkaW8iLAorICAgICAgIkVuY29kZSByYXcgYXVkaW8gaW50byBXQVYiLCAiSWFpbiBIb2xtZXMgPGlhaW5AcHJldHR5cGVvcGxlLm9yZz4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY19mYWN0b3J5KTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsICZzaW5rX2ZhY3RvcnkpOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUICh3YXZlbmNfZGVidWcsICJ3YXZlbmMiLCAwLCAiV0FWIGVuY29kZXIgZWxlbWVudCIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3dhdmVuY19pbml0IChHc3RXYXZFbmMgKiB3YXZlbmMpCit7CisgIHdhdmVuYy0+c2lua3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua19mYWN0b3J5LCAic2luayIpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAod2F2ZW5jLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZlbmNfY2hhaW4pKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHdhdmVuYy0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2ZW5jX2V2ZW50KSk7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKHdhdmVuYy0+c2lua3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UICh3YXZlbmMpLCB3YXZlbmMtPnNpbmtwYWQpOworCisgIHdhdmVuYy0+c3JjcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmNfZmFjdG9yeSwgInNyYyIpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzICh3YXZlbmMtPnNyY3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UICh3YXZlbmMpLCB3YXZlbmMtPnNyY3BhZCk7Cit9CisKKyNkZWZpbmUgUklGRl9DSFVOS19MRU4gICAgMTIKKyNkZWZpbmUgRk1UX1dBVl9DSFVOS19MRU4gMjQKKyNkZWZpbmUgRk1UX0VYVF9DSFVOS19MRU4gNDgKKyNkZWZpbmUgRkFDVF9DSFVOS19MRU4gICAgMTIKKyNkZWZpbmUgREFUQV9IRUFERVJfTEVOICAgOAorI2RlZmluZSBEUzY0X0NIVU5LX0xFTiAgICAzNgorCitzdGF0aWMgZ2Jvb2xlYW4KK3VzZV9mb3JtYXRfZXh0IChHc3RXYXZFbmMgKiB3YXZlbmMpCit7CisgIHJldHVybiB3YXZlbmMtPmNoYW5uZWxzID4gMjsKK30KKworc3RhdGljIGdib29sZWFuCit1c2VfZmFjdF9jaHVuayAoR3N0V2F2RW5jICogd2F2ZW5jKQoreworICByZXR1cm4gdXNlX2Zvcm1hdF9leHQgKHdhdmVuYykgJiYgIXdhdmVuYy0+dXNlX3JmNjQ7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9oZWFkZXJfbGVuIChHc3RXYXZFbmMgKiB3YXZlbmMpCit7CisgIGludCBsZW4gPSBSSUZGX0NIVU5LX0xFTjsKKworICBpZiAodXNlX2Zvcm1hdF9leHQgKHdhdmVuYykpCisgICAgbGVuICs9IEZNVF9FWFRfQ0hVTktfTEVOOworICBlbHNlCisgICAgbGVuICs9IEZNVF9XQVZfQ0hVTktfTEVOOworCisgIGlmICh1c2VfZmFjdF9jaHVuayAod2F2ZW5jKSkKKyAgICBsZW4gKz0gRkFDVF9DSFVOS19MRU47CisKKyAgaWYgKHdhdmVuYy0+dXNlX3JmNjQpCisgICAgbGVuICs9IERTNjRfQ0hVTktfTEVOOworCisgIHJldHVybiBsZW4gKyBEQVRBX0hFQURFUl9MRU47Cit9CisKK3N0YXRpYyBndWludDY0Citnc3RtYXNrX3RvX3dhdm1hc2sgKGd1aW50NjQgZ3N0bWFzaywgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gKiBwb3MpCit7CisgIGNvbnN0IEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHZhbGlkX3BvcyA9CisgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUIHwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUIHwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiB8CisgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxIHwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCB8CisgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hUIHwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlRfT0ZfQ0VOVEVSIHwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUX09GX0NFTlRFUiB8CisgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0NFTlRFUiB8CisgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQgfAorICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9SSUdIVCB8CisgICAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfQ0VOVEVSIHwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9MRUZUIHwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9DRU5URVIgfAorICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX1JJR0hUIHwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX0xFRlQgfAorICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfQ0VOVEVSIHwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX1JJR0hUOworCisgIGNvbnN0IEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHdhdl9wb3NbXSA9IHsKKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZULAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hULAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwKKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxLAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwKKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hULAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlRfT0ZfQ0VOVEVSLAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUX09GX0NFTlRFUiwKKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0NFTlRFUiwKKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQsCisgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9SSUdIVCwKKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfQ0VOVEVSLAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9MRUZULAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9DRU5URVIsCisgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX1JJR0hULAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX0xFRlQsCisgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfQ0VOVEVSLAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX1JJR0hULAorICB9OworICBpbnQgazsKKyAgaW50IGNoYW4gPSAwOworICBndWludDY0IHJldCA9IDA7CisgIGd1aW50NjQgbWFzayA9IDE7CisKKyAgaWYgKGdzdG1hc2sgPT0gMCB8fCAoKGdzdG1hc2sgJiB+dmFsaWRfcG9zKSAhPSAwKSkKKyAgICByZXR1cm4gMDsKKworICBmb3IgKGsgPSAwOyBrIDwgR19OX0VMRU1FTlRTICh3YXZfcG9zKTsgKytrKSB7CisgICAgaWYgKGdzdG1hc2sgJiB3YXZfcG9zW2tdKSB7CisgICAgICByZXQgfD0gbWFzazsKKyAgICAgIHBvc1tjaGFuKytdID0gd2F2X3Bvc1trXTsKKyAgICB9CisgICAgbWFzayA8PD0gMTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBndWludDggKgord3JpdGVfZm10X2NodW5rIChHc3RXYXZFbmMgKiB3YXZlbmMsIGd1aW50OCAqIGhlYWRlcikKK3sKKyAgZ3VpbnQxNiB3QmxvY2tBbGlnbjsKKworICB3QmxvY2tBbGlnbiA9ICh3YXZlbmMtPndpZHRoIC8gOCkgKiB3YXZlbmMtPmNoYW5uZWxzOworCisgIG1lbWNweSAoaGVhZGVyLCAiZm10ICIsIDQpOworICAvKiB3Q2hhbm5lbHMgKi8KKyAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoaGVhZGVyICsgMTAsIHdhdmVuYy0+Y2hhbm5lbHMpOworICAvKiBkd1NhbXBsZXNQZXJTZWMgKi8KKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoaGVhZGVyICsgMTIsIHdhdmVuYy0+cmF0ZSk7CisgIC8qIGR3QXZnQnl0ZXNQZXJTZWMgKi8KKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoaGVhZGVyICsgMTYsIHdCbG9ja0FsaWduICogd2F2ZW5jLT5yYXRlKTsKKyAgLyogd0Jsb2NrQWxpZ24gKi8KKyAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoaGVhZGVyICsgMjAsIHdCbG9ja0FsaWduKTsKKyAgLyogd0JpdHNQZXJTYW1wbGUgKi8KKyAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoaGVhZGVyICsgMjIsIHdhdmVuYy0+d2lkdGgpOworCisgIGlmICh1c2VfZm9ybWF0X2V4dCAod2F2ZW5jKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdmVuYywgIlVzaW5nIFdBVkVfRk9STUFUX0VYVEVOU0lCTEUiKTsKKworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGhlYWRlciArIDQsIEZNVF9FWFRfQ0hVTktfTEVOIC0gOCk7CisKKyAgICAvKiB3Rm9ybWF0VGFnICovCisgICAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoaGVhZGVyICsgOCwgMHhGRkZFKTsKKyAgICAvKiBjYlNpemUgKi8KKyAgICBHU1RfV1JJVEVfVUlOVDE2X0xFIChoZWFkZXIgKyAyNCwgMjIpOworICAgIC8qIHdWYWxpZEJpdHNQZXJTYW1wbGUgKi8KKyAgICBHU1RfV1JJVEVfVUlOVDE2X0xFIChoZWFkZXIgKyAyNiwgd2F2ZW5jLT53aWR0aCk7CisgICAgLyogZHdDaGFubmVsTWFzayAqLworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGhlYWRlciArIDI4LCAoZ3VpbnQzMikgd2F2ZW5jLT5jaGFubmVsX21hc2spOworCisgICAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoaGVhZGVyICsgMzIsIHdhdmVuYy0+Zm9ybWF0KTsKKworICAgIG1lbWNweSAoaGVhZGVyICsgMzQsCisgICAgICAgICJceDAwXHgwMFx4MDBceDAwXHgxMFx4MDBceDgwXHgwMFx4MDBceEFBXHgwMFx4MzhceDlCXHg3MSIsIDE0KTsKKworICAgIGhlYWRlciArPSBGTVRfRVhUX0NIVU5LX0xFTjsKKworICB9IGVsc2UgeworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGhlYWRlciArIDQsIEZNVF9XQVZfQ0hVTktfTEVOIC0gOCk7CisKKyAgICAvKiB3Rm9ybWF0VGFnICovCisgICAgR1NUX1dSSVRFX1VJTlQxNl9MRSAoaGVhZGVyICsgOCwgd2F2ZW5jLT5mb3JtYXQpOworICAgIGhlYWRlciArPSBGTVRfV0FWX0NIVU5LX0xFTjsKKyAgfQorCisgIHJldHVybiBoZWFkZXI7Cit9CisKK3N0YXRpYyBndWludDY0CitnZXRfbnVtX2ZyYW1lcyAoR3N0V2F2RW5jICogd2F2ZW5jKQoreworICBpZiAod2F2ZW5jLT5jaGFubmVscyA9PSAwIHx8IHdhdmVuYy0+d2lkdGggPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHdhdmVuYy0+YXVkaW9fbGVuZ3RoIC8gKHdhdmVuYy0+d2lkdGggLyA4KSAvIHdhdmVuYy0+Y2hhbm5lbHM7Cit9CisKK3N0YXRpYyBndWludDggKgord3JpdGVfZmFjdF9jaHVuayAoR3N0V2F2RW5jICogd2F2ZW5jLCBndWludDggKiBoZWFkZXIpCit7CisgIG1lbWNweSAoaGVhZGVyLCAiZmFjdCIsIDQpOworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChoZWFkZXIgKyA0LCBGQUNUX0NIVU5LX0xFTiAtIDgpOworICAvKiBjb21wcmVzc2VkIGZpbGVzIGFyZSBvbmx5IHN1cHBvcnRlZCB1cCB0byAyIGNoYW5uZWxzLAorICAgKiB0aGF0IG1lYW5zIHdlIG5ldmVyIHdyaXRlIGEgZmFjdCBjaHVuayBmb3IgdGhlbSAqLworICBpZiAod2F2ZW5jLT51c2VfcmY2NCkKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0xFIChoZWFkZXIgKyA4LCAweEZGRkZGRkZGKTsKKyAgZWxzZQorICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGhlYWRlciArIDgsIChndWludDMyKSBnZXRfbnVtX2ZyYW1lcyAod2F2ZW5jKSk7CisgIHJldHVybiBoZWFkZXIgKyBGQUNUX0NIVU5LX0xFTjsKK30KKworc3RhdGljIGd1aW50OCAqCit3cml0ZV9kczY0X2NodW5rIChHc3RXYXZFbmMgKiB3YXZlbmMsIGd1aW50NjQgcmlmZkxlbiwgZ3VpbnQ4ICogaGVhZGVyKQoreworICBndWludDY0IG51bUZyYW1lcyA9IGdldF9udW1fZnJhbWVzICh3YXZlbmMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdmVuYywgInJpZmZMZW49JSIgR19HVUlOVDY0X0ZPUk1BVAorICAgICAgIiwgYXVkaW8gbGVuZ3RoPSUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgbnVtRnJhbWVzPSUiIEdfR1VJTlQ2NF9GT1JNQVQsCisgICAgICByaWZmTGVuLCB3YXZlbmMtPmF1ZGlvX2xlbmd0aCwgbnVtRnJhbWVzKTsKKworICBtZW1jcHkgKGhlYWRlciwgImRzNjQiLCA0KTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoaGVhZGVyICsgNCwgRFM2NF9DSFVOS19MRU4gLSA4KTsKKyAgLyogcmlmZlNpemUgKi8KKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoaGVhZGVyICsgOCwgKGd1aW50MzIpIChyaWZmTGVuICYgMHhGRkZGRkZGRikpOworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChoZWFkZXIgKyAxMiwgKGd1aW50MzIpIChyaWZmTGVuID4+IDMyKSk7CisgIC8qIGRhdGFTaXplICovCisgIEdTVF9XUklURV9VSU5UMzJfTEUgKGhlYWRlciArIDE2LAorICAgICAgKGd1aW50MzIpICh3YXZlbmMtPmF1ZGlvX2xlbmd0aCAmIDB4RkZGRkZGRkYpKTsKKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoaGVhZGVyICsgMjAsIChndWludDMyKSAod2F2ZW5jLT5hdWRpb19sZW5ndGggPj4gMzIpKTsKKyAgLyogc2FtcGxlQ291bnQgKi8KKyAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoaGVhZGVyICsgMjQsIChndWludDMyKSAobnVtRnJhbWVzICYgMHhGRkZGRkZGRikpOworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChoZWFkZXIgKyAyOCwgKGd1aW50MzIpIChudW1GcmFtZXMgPj4gMzIpKTsKKyAgLyogdGFibGVMZW5ndGggYWx3YXlzIHplcm8gZm9yIG5vdyAqLworICBHU1RfV1JJVEVfVUlOVDMyX0xFIChoZWFkZXIgKyAzMiwgMCk7CisKKyAgcmV0dXJuIGhlYWRlciArIERTNjRfQ0hVTktfTEVOOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dzdF93YXZlbmNfY3JlYXRlX2hlYWRlcl9idWYgKEdzdFdhdkVuYyAqIHdhdmVuYykKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDggKmhlYWRlcjsKKyAgZ3VpbnQ2NCByaWZmTGVuOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdmVuYywgIkhlYWRlciBzaXplOiAlZCIsIGdldF9oZWFkZXJfbGVuICh3YXZlbmMpKTsKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChnZXRfaGVhZGVyX2xlbiAod2F2ZW5jKSk7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBoZWFkZXIgPSBtYXAuZGF0YTsKKyAgbWVtc2V0IChoZWFkZXIsIDAsIGdldF9oZWFkZXJfbGVuICh3YXZlbmMpKTsKKworICByaWZmTGVuID0gd2F2ZW5jLT5tZXRhX2xlbmd0aCArIHdhdmVuYy0+YXVkaW9fbGVuZ3RoCisgICAgICArIGdldF9oZWFkZXJfbGVuICh3YXZlbmMpIC0gODsKKworICAvKiBSSUZGIGNodW5rICovCisgIGlmICh3YXZlbmMtPnVzZV9yZjY0KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2ZW5jLCAiVXNpbmcgUkY2NCIpOworICAgIG1lbWNweSAoaGVhZGVyLCAiUkY2NCIsIDQpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGhlYWRlciArIDQsIDB4RkZGRkZGRkYpOworICB9IGVsc2UgeworICAgIG1lbWNweSAoaGVhZGVyLCAiUklGRiIsIDQpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGhlYWRlciArIDQsIChndWludDMyKSByaWZmTGVuKTsKKyAgfQorICBtZW1jcHkgKGhlYWRlciArIDgsICJXQVZFIiwgNCk7CisgIGhlYWRlciArPSBSSUZGX0NIVU5LX0xFTjsKKworICBpZiAod2F2ZW5jLT51c2VfcmY2NCkKKyAgICBoZWFkZXIgPSB3cml0ZV9kczY0X2NodW5rICh3YXZlbmMsIHJpZmZMZW4sIGhlYWRlcik7CisKKyAgaGVhZGVyID0gd3JpdGVfZm10X2NodW5rICh3YXZlbmMsIGhlYWRlcik7CisgIGlmICh1c2VfZmFjdF9jaHVuayAod2F2ZW5jKSkKKyAgICBoZWFkZXIgPSB3cml0ZV9mYWN0X2NodW5rICh3YXZlbmMsIGhlYWRlcik7CisKKyAgLyogZGF0YSBjaHVuayAqLworICBtZW1jcHkgKGhlYWRlciwgImRhdGEgIiwgNCk7CisgIGlmICh3YXZlbmMtPnVzZV9yZjY0KQorICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGhlYWRlciArIDQsIDB4RkZGRkZGRkYpOworICBlbHNlCisgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoaGVhZGVyICsgNCwgKGd1aW50MzIpIHdhdmVuYy0+YXVkaW9fbGVuZ3RoKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfd2F2ZW5jX3B1c2hfaGVhZGVyIChHc3RXYXZFbmMgKiB3YXZlbmMpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIC8qIHNlZWsgdG8gYmVnaW5uaW5nIG9mIGZpbGUgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfQllURVMpOworICBpZiAoIWdzdF9wYWRfcHVzaF9ldmVudCAod2F2ZW5jLT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2ZW5jLCAiU2VlayB0byB0aGUgYmVnaW5uaW5nIGZhaWxlZCIpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdmVuYywgIndyaXRpbmcgaGVhZGVyLCBtZXRhX3NpemU9JXUsIGF1ZGlvX3NpemU9JSIKKyAgICAgIEdfR1VJTlQ2NF9GT1JNQVQsIHdhdmVuYy0+bWV0YV9sZW5ndGgsIHdhdmVuYy0+YXVkaW9fbGVuZ3RoKTsKKworICBvdXRidWYgPSBnc3Rfd2F2ZW5jX2NyZWF0ZV9oZWFkZXJfYnVmICh3YXZlbmMpOworICBHU1RfQlVGRkVSX09GRlNFVCAob3V0YnVmKSA9IDA7CisKKyAgcmV0ID0gZ3N0X3BhZF9wdXNoICh3YXZlbmMtPnNyY3BhZCwgb3V0YnVmKTsKKworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh3YXZlbmMsICJwdXNoIGhlYWRlciBmYWlsZWQ6IGZsb3cgPSAlcyIsCisgICAgICAgIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdmVuY19zaW5rX3NldGNhcHMgKEdzdFBhZCAqIHBhZCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFdhdkVuYyAqd2F2ZW5jOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgY29uc3QgZ2NoYXIgKm5hbWU7CisgIGdpbnQgY2hhbnMsIHJhdGU7CisgIEdzdENhcHMgKmNjYXBzOworCisgIHdhdmVuYyA9IEdTVF9XQVZFTkMgKGdzdF9wYWRfZ2V0X3BhcmVudCAocGFkKSk7CisKKyAgY2NhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHBhZCk7CisgIGlmICh3YXZlbmMtPnNlbnRfaGVhZGVyICYmIGNjYXBzICYmICFnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChjYXBzLCBjY2FwcykpIHsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2NhcHMpOworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2ZW5jLCAiY2Fubm90IGNoYW5nZSBmb3JtYXQgaW4gbWlkZGxlIG9mIHN0cmVhbSIpOworICAgIGdvdG8gZmFpbDsKKyAgfQorICBpZiAoY2NhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKGNjYXBzKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh3YXZlbmMsICJnb3QgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBuYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3RydWN0dXJlKTsKKworICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAiY2hhbm5lbHMiLCAmY2hhbnMpIHx8CisgICAgICAhZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJyYXRlIiwgJnJhdGUpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh3YXZlbmMsICJjYXBzIGluY29tcGxldGUiKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KKworICB3YXZlbmMtPmNoYW5uZWxzID0gY2hhbnM7CisgIHdhdmVuYy0+cmF0ZSA9IHJhdGU7CisgIHdhdmVuYy0+Y2hhbm5lbF9tYXNrID0gMDsKKworICBpZiAoc3RyY21wIChuYW1lLCAiYXVkaW8veC1yYXciKSA9PSAwKSB7CisgICAgR3N0QXVkaW9JbmZvIGluZm87CisgICAgZ3VpbnQ2NCBnc3RtYXNrOworCisgICAgaWYgKCFnc3RfYXVkaW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh3YXZlbmMsICJDb3VsZCBub3QgcmV0cmlldmUgYXVkaW8gaW5mbyBmcm9tIGNhcHMiKTsKKyAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b19tYXNrIChpbmZvLnBvc2l0aW9uLCB3YXZlbmMtPmNoYW5uZWxzLAorICAgICAgICAgICAgRkFMU0UsICZnc3RtYXNrKSkgeworICAgICAgd2F2ZW5jLT5jaGFubmVsX21hc2sgPSBnc3RtYXNrX3RvX3dhdm1hc2sgKGdzdG1hc2ssIHdhdmVuYy0+ZGVzdFBvcyk7CisgICAgICBtZW1jcHkgKHdhdmVuYy0+c3JjUG9zLCBpbmZvLnBvc2l0aW9uLCBzaXplb2YgKGluZm8ucG9zaXRpb24pKTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdmVuYywgIkNoYW5uZWwgbWFzayBpbnB1dDogMHglIiBHX0dJTlQ2NF9NT0RJRklFUiAieCIKKyAgICAgICAgICAiIG91dHB1dDogMHglIiBHX0dJTlQ2NF9NT0RJRklFUiAieCIsIGdzdG1hc2ssIHdhdmVuYy0+Y2hhbm5lbF9tYXNrKTsKKyAgICB9CisgICAgd2F2ZW5jLT5hdWRpb19mb3JtYXQgPSBHU1RfQVVESU9fSU5GT19GT1JNQVQgKCZpbmZvKTsKKworICAgIGlmIChHU1RfQVVESU9fSU5GT19JU19JTlRFR0VSICgmaW5mbykpCisgICAgICB3YXZlbmMtPmZvcm1hdCA9IEdTVF9SSUZGX1dBVkVfRk9STUFUX1BDTTsKKyAgICBlbHNlIGlmIChHU1RfQVVESU9fSU5GT19JU19GTE9BVCAoJmluZm8pKQorICAgICAgd2F2ZW5jLT5mb3JtYXQgPSBHU1RfUklGRl9XQVZFX0ZPUk1BVF9JRUVFX0ZMT0FUOworICAgIGVsc2UKKyAgICAgIGdvdG8gZmFpbDsKKworICAgIHdhdmVuYy0+d2lkdGggPSBHU1RfQVVESU9fSU5GT19XSURUSCAoJmluZm8pOworICB9IGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImF1ZGlvL3gtYWxhdyIpID09IDApIHsKKyAgICB3YXZlbmMtPmZvcm1hdCA9IEdTVF9SSUZGX1dBVkVfRk9STUFUX0FMQVc7CisgICAgd2F2ZW5jLT53aWR0aCA9IDg7CisgIH0gZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYXVkaW8veC1tdWxhdyIpID09IDApIHsKKyAgICB3YXZlbmMtPmZvcm1hdCA9IEdTVF9SSUZGX1dBVkVfRk9STUFUX01VTEFXOworICAgIHdhdmVuYy0+d2lkdGggPSA4OworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2ZW5jLCAiVW5zdXBwb3J0ZWQgZm9ybWF0ICVzIiwgbmFtZSk7CisgICAgZ290byBmYWlsOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHdhdmVuYywKKyAgICAgICJhY2NlcHRlZCBjYXBzOiBmb3JtYXQ9MHglMDR4IGNoYW5zPSV1IHdpZHRoPSV1IHJhdGU9JXUiLAorICAgICAgd2F2ZW5jLT5mb3JtYXQsIHdhdmVuYy0+Y2hhbm5lbHMsIHdhdmVuYy0+d2lkdGgsIHdhdmVuYy0+cmF0ZSk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAod2F2ZW5jKTsKKyAgcmV0dXJuIFRSVUU7CisKK2ZhaWw6CisgIGdzdF9vYmplY3RfdW5yZWYgKHdhdmVuYyk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZwYXJzZV90YWdzX2ZvcmVhY2ggKGNvbnN0IEdzdFRhZ0xpc3QgKiB0YWdzLCBjb25zdCBnY2hhciAqIHRhZywKKyAgICBncG9pbnRlciBkYXRhKQoreworICBjb25zdCBzdHJ1Y3QKKyAgeworICAgIGd1aW50MzIgZmNjOworICAgIGNvbnN0IGdjaGFyICp0YWc7CisgIH0gcmlmZnRhZ3NbXSA9IHsKKyAgICB7CisgICAgR1NUX1JJRkZfSU5GT19JQVJMLCBHU1RfVEFHX0xPQ0FUSU9OfSwgeworICAgIEdTVF9SSUZGX0lORk9fSUFSVCwgR1NUX1RBR19BUlRJU1R9LCB7CisgICAgR1NUX1JJRkZfSU5GT19JQ01ULCBHU1RfVEFHX0NPTU1FTlR9LCB7CisgICAgR1NUX1JJRkZfSU5GT19JQ09QLCBHU1RfVEFHX0NPUFlSSUdIVH0sIHsKKyAgICBHU1RfUklGRl9JTkZPX0lDUkQsIEdTVF9UQUdfREFURX0sIHsKKyAgICBHU1RfUklGRl9JTkZPX0lHTlIsIEdTVF9UQUdfR0VOUkV9LCB7CisgICAgR1NUX1JJRkZfSU5GT19JS0VZLCBHU1RfVEFHX0tFWVdPUkRTfSwgeworICAgIEdTVF9SSUZGX0lORk9fSU5BTSwgR1NUX1RBR19USVRMRX0sIHsKKyAgICBHU1RfUklGRl9JTkZPX0lQUkQsIEdTVF9UQUdfQUxCVU19LCB7CisgICAgR1NUX1JJRkZfSU5GT19JU0JKLCBHU1RfVEFHX0FMQlVNX0FSVElTVH0sIHsKKyAgICBHU1RfUklGRl9JTkZPX0lTRlQsIEdTVF9UQUdfRU5DT0RFUn0sIHsKKyAgICBHU1RfUklGRl9JTkZPX0lTUkMsIEdTVF9UQUdfSVNSQ30sIHsKKyAgICAwLCBOVUxMfQorICB9OworICBnaW50IG47CisgIGdjaGFyICpzdHIgPSBOVUxMOworICBHc3RCeXRlV3JpdGVyICpidyA9IGRhdGE7CisgIGZvciAobiA9IDA7IHJpZmZ0YWdzW25dLmZjYyAhPSAwOyBuKyspIHsKKyAgICBpZiAoIXN0cmNtcCAocmlmZnRhZ3Nbbl0udGFnLCB0YWcpKSB7CisgICAgICBpZiAocmlmZnRhZ3Nbbl0uZmNjID09IEdTVF9SSUZGX0lORk9fSUNSRCkgeworICAgICAgICBHRGF0ZSAqZGF0ZTsKKyAgICAgICAgLyogc3BlY2lhbCBjYXNlIGZvciB0aGUgZGF0ZSB0YWcgKi8KKyAgICAgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfZGF0ZSAodGFncywgdGFnLCAmZGF0ZSkpIHsKKyAgICAgICAgICBzdHIgPQorICAgICAgICAgICAgICBnX3N0cmR1cF9wcmludGYgKCIlMDRkOiUwMmQ6JTAyZCIsIGdfZGF0ZV9nZXRfeWVhciAoZGF0ZSksCisgICAgICAgICAgICAgIGdfZGF0ZV9nZXRfbW9udGggKGRhdGUpLCBnX2RhdGVfZ2V0X2RheSAoZGF0ZSkpOworICAgICAgICAgIGdfZGF0ZV9mcmVlIChkYXRlKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ3MsIHRhZywgJnN0cik7CisgICAgICB9CisgICAgICBpZiAoc3RyKSB7CisgICAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlIChidywgcmlmZnRhZ3Nbbl0uZmNjKTsKKyAgICAgICAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKGJ3LCBHU1RfUk9VTkRfVVBfMiAoc3RybGVuIChzdHIpKSk7CisgICAgICAgIGdzdF9ieXRlX3dyaXRlcl9wdXRfc3RyaW5nIChidywgc3RyKTsKKyAgICAgICAgZ19mcmVlIChzdHIpOworICAgICAgICBzdHIgPSBOVUxMOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3dhdmVuY193cml0ZV90YWdzIChHc3RXYXZFbmMgKiB3YXZlbmMpCit7CisgIGNvbnN0IEdzdFRhZ0xpc3QgKnVzZXJfdGFnczsKKyAgR3N0VGFnTGlzdCAqdGFnczsKKyAgZ3VpbnQgc2l6ZTsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdEJ5dGVXcml0ZXIgYnc7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdhdmVuYyAhPSBOVUxMLCBHU1RfRkxPV19PSyk7CisKKyAgdXNlcl90YWdzID0gZ3N0X3RhZ19zZXR0ZXJfZ2V0X3RhZ19saXN0IChHU1RfVEFHX1NFVFRFUiAod2F2ZW5jKSk7CisgIGlmICgoIXdhdmVuYy0+dGFncykgJiYgKCF1c2VyX3RhZ3MpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2ZW5jLCAiaGF2ZSBubyB0YWdzIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CisgIHRhZ3MgPQorICAgICAgZ3N0X3RhZ19saXN0X21lcmdlICh1c2VyX3RhZ3MsIHdhdmVuYy0+dGFncywKKyAgICAgIGdzdF90YWdfc2V0dGVyX2dldF90YWdfbWVyZ2VfbW9kZSAoR1NUX1RBR19TRVRURVIgKHdhdmVuYykpKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh3YXZlbmMsICJ3cml0aW5nIHRhZ3MiKTsKKworICBnc3RfYnl0ZV93cml0ZXJfaW5pdF93aXRoX3NpemUgKCZidywgMTAyNCwgRkFMU0UpOworCisgIC8qIGFkZCBMSVNUIElORk8gY2h1bmsgKi8KKyAgZ3N0X2J5dGVfd3JpdGVyX3B1dF9kYXRhICgmYncsIChjb25zdCBndWludDggKikgIkxJU1QiLCA0KTsKKyAgZ3N0X2J5dGVfd3JpdGVyX3B1dF91aW50MzJfbGUgKCZidywgMCk7CisgIGdzdF9ieXRlX3dyaXRlcl9wdXRfZGF0YSAoJmJ3LCAoY29uc3QgZ3VpbnQ4ICopICJJTkZPIiwgNCk7CisKKyAgLyogYWRkIHRhZ3MgKi8KKyAgZ3N0X3RhZ19saXN0X2ZvcmVhY2ggKHRhZ3MsIGdzdF93YXZwYXJzZV90YWdzX2ZvcmVhY2gsICZidyk7CisKKyAgLyogc2V0cyByZWFsIHNpemUgb2YgTElTVCBJTkZPIGNodW5rICovCisgIHNpemUgPSBnc3RfYnl0ZV93cml0ZXJfZ2V0X3BvcyAoJmJ3KTsKKyAgZ3N0X2J5dGVfd3JpdGVyX3NldF9wb3MgKCZidywgNCk7CisgIGdzdF9ieXRlX3dyaXRlcl9wdXRfdWludDMyX2xlICgmYncsIHNpemUgLSA4KTsKKworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ3MpOworCisgIGJ1ZiA9IGdzdF9ieXRlX3dyaXRlcl9yZXNldF9hbmRfZ2V0X2J1ZmZlciAoJmJ3KTsKKyAgd2F2ZW5jLT5tZXRhX2xlbmd0aCArPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworICByZXR1cm4gZ3N0X3BhZF9wdXNoICh3YXZlbmMtPnNyY3BhZCwgYnVmKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2ZW5jX2lzX2N1ZV9pZF91bmlxdWUgKGd1aW50MzIgaWQsIEdMaXN0ICogbGlzdCkKK3sKKyAgR3N0V2F2RW5jQ3VlICpjdWU7CisKKyAgd2hpbGUgKGxpc3QpIHsKKyAgICBjdWUgPSBsaXN0LT5kYXRhOworICAgIGlmIChjdWUtPmlkID09IGlkKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2ZW5jX3BhcnNlX2N1ZSAoR3N0V2F2RW5jICogd2F2ZW5jLCBndWludDMyIGlkLCBHc3RUb2NFbnRyeSAqIGVudHJ5KQoreworICBnaW50NjQgc3RhcnQ7CisgIEdzdFdhdkVuY0N1ZSAqY3VlOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChlbnRyeSAhPSBOVUxMLCBGQUxTRSk7CisKKyAgZ3N0X3RvY19lbnRyeV9nZXRfc3RhcnRfc3RvcF90aW1lcyAoZW50cnksICZzdGFydCwgTlVMTCk7CisKKyAgY3VlID0gZ19uZXcgKEdzdFdhdkVuY0N1ZSwgMSk7CisgIGN1ZS0+aWQgPSBpZDsKKyAgY3VlLT5wb3NpdGlvbiA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAoc3RhcnQsIHdhdmVuYy0+cmF0ZSwgR1NUX1NFQ09ORCk7CisgIG1lbWNweSAoY3VlLT5kYXRhX2NodW5rX2lkLCAiZGF0YSIsIDQpOworICBjdWUtPmNodW5rX3N0YXJ0ID0gMDsKKyAgY3VlLT5ibG9ja19zdGFydCA9IDA7CisgIGN1ZS0+c2FtcGxlX29mZnNldCA9IGN1ZS0+cG9zaXRpb247CisgIHdhdmVuYy0+Y3VlcyA9IGdfbGlzdF9hcHBlbmQgKHdhdmVuYy0+Y3VlcywgY3VlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2ZW5jX3BhcnNlX2xhYmwgKEdzdFdhdkVuYyAqIHdhdmVuYywgZ3VpbnQzMiBpZCwgR3N0VG9jRW50cnkgKiBlbnRyeSkKK3sKKyAgZ2NoYXIgKnRhZzsKKyAgR3N0VGFnTGlzdCAqdGFnczsKKyAgR3N0V2F2RW5jTGFibCAqbGFibDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZW50cnkgIT0gTlVMTCwgRkFMU0UpOworCisgIHRhZ3MgPSBnc3RfdG9jX2VudHJ5X2dldF90YWdzIChlbnRyeSk7CisgIGlmICghdGFncykgeworICAgIEdTVF9JTkZPX09CSkVDVCAod2F2ZW5jLCAibm8gdGFncyBmb3IgZW50cnk6ICVkIiwgaWQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIWdzdF90YWdfbGlzdF9nZXRfc3RyaW5nICh0YWdzLCBHU1RfVEFHX1RJVExFLCAmdGFnKSkgeworICAgIEdTVF9JTkZPX09CSkVDVCAod2F2ZW5jLCAibm8gdGl0bGUgdGFnIGZvciBlbnRyeTogJWQiLCBpZCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgbGFibCA9IGdfbmV3IChHc3RXYXZFbmNMYWJsLCAxKTsKKyAgbWVtY3B5IChsYWJsLT5jaHVua19pZCwgImxhYmwiLCA0KTsKKyAgbGFibC0+Y2h1bmtfZGF0YV9zaXplID0gNCArIHN0cmxlbiAodGFnKSArIDE7CisgIGxhYmwtPmN1ZV9wb2ludF9pZCA9IGlkOworICBsYWJsLT50ZXh0ID0gdGFnOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdmVuYywgImdvdCBsYWJsOiAnJXMnIiwgdGFnKTsKKworICB3YXZlbmMtPmxhYmxzID0gZ19saXN0X2FwcGVuZCAod2F2ZW5jLT5sYWJscywgbGFibCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdmVuY19wYXJzZV9ub3RlIChHc3RXYXZFbmMgKiB3YXZlbmMsIGd1aW50MzIgaWQsIEdzdFRvY0VudHJ5ICogZW50cnkpCit7CisgIGdjaGFyICp0YWc7CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisgIEdzdFdhdkVuY05vdGUgKm5vdGU7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGVudHJ5ICE9IE5VTEwsIEZBTFNFKTsKKyAgdGFncyA9IGdzdF90b2NfZW50cnlfZ2V0X3RhZ3MgKGVudHJ5KTsKKyAgaWYgKCF0YWdzKSB7CisgICAgR1NUX0lORk9fT0JKRUNUICh3YXZlbmMsICJubyB0YWdzIGZvciBlbnRyeTogJWQiLCBpZCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ3MsIEdTVF9UQUdfQ09NTUVOVCwgJnRhZykpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHdhdmVuYywgIm5vIGNvbW1lbnQgdGFnIGZvciBlbnRyeTogJWQiLCBpZCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgbm90ZSA9IGdfbmV3IChHc3RXYXZFbmNOb3RlLCAxKTsKKyAgbWVtY3B5IChub3RlLT5jaHVua19pZCwgIm5vdGUiLCA0KTsKKyAgbm90ZS0+Y2h1bmtfZGF0YV9zaXplID0gNCArIHN0cmxlbiAodGFnKSArIDE7CisgIG5vdGUtPmN1ZV9wb2ludF9pZCA9IGlkOworICBub3RlLT50ZXh0ID0gdGFnOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdmVuYywgImdvdCBub3RlOiAnJXMnIiwgdGFnKTsKKworICB3YXZlbmMtPm5vdGVzID0gZ19saXN0X2FwcGVuZCAod2F2ZW5jLT5ub3Rlcywgbm90ZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdmVuY193cml0ZV9jdWVzIChndWludDggKiogZGF0YSwgR0xpc3QgKiBsaXN0KQoreworICBHc3RXYXZFbmNDdWUgKmN1ZTsKKworICB3aGlsZSAobGlzdCkgeworICAgIGN1ZSA9IGxpc3QtPmRhdGE7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoKmRhdGEsIGN1ZS0+aWQpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKCpkYXRhICsgNCwgY3VlLT5wb3NpdGlvbik7CisgICAgbWVtY3B5ICgqZGF0YSArIDgsIChnY2hhciAqKSBjdWUtPmRhdGFfY2h1bmtfaWQsIDQpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKCpkYXRhICsgMTIsIGN1ZS0+Y2h1bmtfc3RhcnQpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKCpkYXRhICsgMTYsIGN1ZS0+YmxvY2tfc3RhcnQpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKCpkYXRhICsgMjAsIGN1ZS0+c2FtcGxlX29mZnNldCk7CisgICAgKmRhdGEgKz0gMjQ7CisgICAgbGlzdCA9IGdfbGlzdF9uZXh0IChsaXN0KTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZlbmNfd3JpdGVfbGFibHMgKGd1aW50OCAqKiBkYXRhLCBHTGlzdCAqIGxpc3QpCit7CisgIEdzdFdhdkVuY0xhYmwgKmxhYmw7CisKKyAgd2hpbGUgKGxpc3QpIHsKKyAgICBsYWJsID0gbGlzdC0+ZGF0YTsKKyAgICBtZW1jcHkgKCpkYXRhLCAoZ2NoYXIgKikgbGFibC0+Y2h1bmtfaWQsIDQpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKCpkYXRhICsgNCwgbGFibC0+Y2h1bmtfZGF0YV9zaXplKTsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0xFICgqZGF0YSArIDgsIGxhYmwtPmN1ZV9wb2ludF9pZCk7CisgICAgbWVtY3B5ICgqZGF0YSArIDEyLCAoZ2NoYXIgKikgbGFibC0+dGV4dCwgc3RybGVuIChsYWJsLT50ZXh0KSk7CisgICAgKmRhdGEgKz0gOCArIEdTVF9ST1VORF9VUF8yIChsYWJsLT5jaHVua19kYXRhX3NpemUpOworICAgIGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2ZW5jX3dyaXRlX25vdGVzIChndWludDggKiogZGF0YSwgR0xpc3QgKiBsaXN0KQoreworICBHc3RXYXZFbmNOb3RlICpub3RlOworCisgIHdoaWxlIChsaXN0KSB7CisgICAgbm90ZSA9IGxpc3QtPmRhdGE7CisgICAgbWVtY3B5ICgqZGF0YSwgKGdjaGFyICopIG5vdGUtPmNodW5rX2lkLCA0KTsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0xFICgqZGF0YSArIDQsIG5vdGUtPmNodW5rX2RhdGFfc2l6ZSk7CisgICAgR1NUX1dSSVRFX1VJTlQzMl9MRSAoKmRhdGEgKyA4LCBub3RlLT5jdWVfcG9pbnRfaWQpOworICAgIG1lbWNweSAoKmRhdGEgKyAxMiwgKGdjaGFyICopIG5vdGUtPnRleHQsIHN0cmxlbiAobm90ZS0+dGV4dCkpOworICAgICpkYXRhICs9IDggKyBHU1RfUk9VTkRfVVBfMiAobm90ZS0+Y2h1bmtfZGF0YV9zaXplKTsKKyAgICBsaXN0ID0gZ19saXN0X25leHQgKGxpc3QpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfd2F2ZW5jX3dyaXRlX3RvYyAoR3N0V2F2RW5jICogd2F2ZW5jKQoreworICBHTGlzdCAqbGlzdDsKKyAgR3N0VG9jICp0b2M7CisgIEdzdFRvY0VudHJ5ICplbnRyeSwgKnN1YmVudHJ5OworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50OCAqZGF0YTsKKyAgZ3VpbnQzMiBuY3Vlcywgc2l6ZSwgY3Vlc19zaXplLCBsYWJsc19zaXplLCBub3Rlc19zaXplOworCisgIGlmICghd2F2ZW5jLT50b2MpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh3YXZlbmMsICJoYXZlIG5vIHRvYywgY2hlY2tpbmcgdG9jX3NldHRlciIpOworICAgIHdhdmVuYy0+dG9jID0gZ3N0X3RvY19zZXR0ZXJfZ2V0X3RvYyAoR1NUX1RPQ19TRVRURVIgKHdhdmVuYykpOworICB9CisgIGlmICghd2F2ZW5jLT50b2MpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHdhdmVuYywgImhhdmUgbm8gdG9jIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICB9CisKKyAgdG9jID0gZ3N0X3RvY19yZWYgKHdhdmVuYy0+dG9jKTsKKyAgc2l6ZSA9IDA7CisgIGN1ZXNfc2l6ZSA9IDA7CisgIGxhYmxzX3NpemUgPSAwOworICBub3Rlc19zaXplID0gMDsKKworICAvKiBjaGVjayBpZiB0aGUgVE9DIGVudHJpZXMgaXMgdmFsaWQgKi8KKyAgbGlzdCA9IGdzdF90b2NfZ2V0X2VudHJpZXMgKHRvYyk7CisgIGVudHJ5ID0gbGlzdC0+ZGF0YTsKKyAgaWYgKGdzdF90b2NfZW50cnlfaXNfYWx0ZXJuYXRpdmUgKGVudHJ5KSkgeworICAgIGxpc3QgPSBnc3RfdG9jX2VudHJ5X2dldF9zdWJfZW50cmllcyAoZW50cnkpOworICAgIHdoaWxlIChsaXN0KSB7CisgICAgICBzdWJlbnRyeSA9IGxpc3QtPmRhdGE7CisgICAgICBpZiAoIWdzdF90b2NfZW50cnlfaXNfc2VxdWVuY2UgKHN1YmVudHJ5KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgbGlzdCA9IGdfbGlzdF9uZXh0IChsaXN0KTsKKyAgICB9CisgICAgbGlzdCA9IGdzdF90b2NfZW50cnlfZ2V0X3N1Yl9lbnRyaWVzIChlbnRyeSk7CisgIH0KKyAgaWYgKGdzdF90b2NfZW50cnlfaXNfc2VxdWVuY2UgKGVudHJ5KSkgeworICAgIHdoaWxlIChsaXN0KSB7CisgICAgICBlbnRyeSA9IGxpc3QtPmRhdGE7CisgICAgICBpZiAoIWdzdF90b2NfZW50cnlfaXNfc2VxdWVuY2UgKGVudHJ5KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgbGlzdCA9IGdfbGlzdF9uZXh0IChsaXN0KTsKKyAgICB9CisgICAgbGlzdCA9IGdzdF90b2NfZ2V0X2VudHJpZXMgKHRvYyk7CisgIH0KKworICBuY3VlcyA9IGdfbGlzdF9sZW5ndGggKGxpc3QpOworICBHU1RfREVCVUdfT0JKRUNUICh3YXZlbmMsICJudW1iZXIgb2YgY3VlIGVudHJpZXM6ICVkIiwgbmN1ZXMpOworCisgIHdoaWxlIChsaXN0KSB7CisgICAgZ3VpbnQzMiBpZCA9IDA7CisgICAgZ2ludDY0IGlkNjQ7CisgICAgY29uc3QgZ2NoYXIgKnVpZDsKKworICAgIGVudHJ5ID0gbGlzdC0+ZGF0YTsKKyAgICB1aWQgPSBnc3RfdG9jX2VudHJ5X2dldF91aWQgKGVudHJ5KTsKKyAgICBpZDY0ID0gZ19hc2NpaV9zdHJ0b2xsICh1aWQsIE5VTEwsIDApOworICAgIC8qIGNoZWNrIGlmIGlkIHVuaXF1ZSBjb21wYXRpYmxlIHdpdGggZ3VpbnQzMiBlbHNlIGdlbmVyYXRlIHJhbmRvbSAqLworICAgIGlmIChpZDY0ID49IDAgJiYgZ3N0X3dhdmVuY19pc19jdWVfaWRfdW5pcXVlIChpZDY0LCB3YXZlbmMtPmN1ZXMpKSB7CisgICAgICBpZCA9IChndWludDMyKSBpZDY0OworICAgIH0gZWxzZSB7CisgICAgICBkbyB7CisgICAgICAgIGlkID0gZ19yYW5kb21faW50ICgpOworICAgICAgfSB3aGlsZSAoIWdzdF93YXZlbmNfaXNfY3VlX2lkX3VuaXF1ZSAoaWQsIHdhdmVuYy0+Y3VlcykpOworICAgIH0KKyAgICBnc3Rfd2F2ZW5jX3BhcnNlX2N1ZSAod2F2ZW5jLCBpZCwgZW50cnkpOworICAgIGdzdF93YXZlbmNfcGFyc2VfbGFibCAod2F2ZW5jLCBpZCwgZW50cnkpOworICAgIGdzdF93YXZlbmNfcGFyc2Vfbm90ZSAod2F2ZW5jLCBpZCwgZW50cnkpOworICAgIGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCk7CisgIH0KKworICAvKiBjb3VudCBjdWVzIHNpemUgKi8KKyAgaWYgKHdhdmVuYy0+Y3VlcykgeworICAgIGN1ZXNfc2l6ZSA9IDI0ICogZ19saXN0X2xlbmd0aCAod2F2ZW5jLT5jdWVzKTsKKyAgICBzaXplICs9IDEyICsgY3Vlc19zaXplOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2ZW5jLCAiY3VlJ3Mgbm90IGZvdW5kIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIC8qIGNvdW50IGxhYmxzIHNpemUgKi8KKyAgaWYgKHdhdmVuYy0+bGFibHMpIHsKKyAgICBsaXN0ID0gd2F2ZW5jLT5sYWJsczsKKyAgICB3aGlsZSAobGlzdCkgeworICAgICAgR3N0V2F2RW5jTGFibCAqbGFibDsKKyAgICAgIGxhYmwgPSBsaXN0LT5kYXRhOworICAgICAgbGFibHNfc2l6ZSArPSA4ICsgR1NUX1JPVU5EX1VQXzIgKGxhYmwtPmNodW5rX2RhdGFfc2l6ZSk7CisgICAgICBsaXN0ID0gZ19saXN0X25leHQgKGxpc3QpOworICAgIH0KKyAgICBzaXplICs9IGxhYmxzX3NpemU7CisgIH0KKyAgLyogY291bnQgbm90ZXMgc2l6ZSAqLworICBpZiAod2F2ZW5jLT5ub3RlcykgeworICAgIGxpc3QgPSB3YXZlbmMtPm5vdGVzOworICAgIHdoaWxlIChsaXN0KSB7CisgICAgICBHc3RXYXZFbmNOb3RlICpub3RlOworICAgICAgbm90ZSA9IGxpc3QtPmRhdGE7CisgICAgICBub3Rlc19zaXplICs9IDggKyBHU1RfUk9VTkRfVVBfMiAobm90ZS0+Y2h1bmtfZGF0YV9zaXplKTsKKyAgICAgIGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCk7CisgICAgfQorICAgIHNpemUgKz0gbm90ZXNfc2l6ZTsKKyAgfQorICBpZiAod2F2ZW5jLT5sYWJscyB8fCB3YXZlbmMtPm5vdGVzKSB7CisgICAgc2l6ZSArPSAxMjsKKyAgfQorCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZSk7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBkYXRhID0gbWFwLmRhdGE7CisgIG1lbXNldCAoZGF0YSwgMCwgc2l6ZSk7CisKKyAgLyogd3JpdGUgQ3VlIENodW5rICovCisgIGlmICh3YXZlbmMtPmN1ZXMpIHsKKyAgICBtZW1jcHkgKGRhdGEsIChnY2hhciAqKSAiY3VlICIsIDQpOworICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGRhdGEgKyA0LCA0ICsgY3Vlc19zaXplKTsKKyAgICBHU1RfV1JJVEVfVUlOVDMyX0xFIChkYXRhICsgOCwgbmN1ZXMpOworICAgIGRhdGEgKz0gMTI7CisgICAgZ3N0X3dhdmVuY193cml0ZV9jdWVzICgmZGF0YSwgd2F2ZW5jLT5jdWVzKTsKKworICAgIC8qIHdyaXRlIEFzc29jaWF0ZWQgRGF0YSBMaXN0IENodW5rICovCisgICAgaWYgKHdhdmVuYy0+bGFibHMgfHwgd2F2ZW5jLT5ub3RlcykgeworICAgICAgbWVtY3B5IChkYXRhLCAoZ2NoYXIgKikgIkxJU1QiLCA0KTsKKyAgICAgIEdTVF9XUklURV9VSU5UMzJfTEUgKGRhdGEgKyA0LCA0ICsgbGFibHNfc2l6ZSArIG5vdGVzX3NpemUpOworICAgICAgbWVtY3B5IChkYXRhICsgOCwgKGdjaGFyICopICJhZHRsIiwgNCk7CisgICAgICBkYXRhICs9IDEyOworICAgICAgaWYgKHdhdmVuYy0+bGFibHMpCisgICAgICAgIGdzdF93YXZlbmNfd3JpdGVfbGFibHMgKCZkYXRhLCB3YXZlbmMtPmxhYmxzKTsKKyAgICAgIGlmICh3YXZlbmMtPm5vdGVzKQorICAgICAgICBnc3Rfd2F2ZW5jX3dyaXRlX25vdGVzICgmZGF0YSwgd2F2ZW5jLT5ub3Rlcyk7CisgICAgfQorICB9CisKKyAgLyogZnJlZSByZXNvdXJjZXMgKi8KKyAgaWYgKHRvYykKKyAgICBnc3RfdG9jX3VucmVmICh0b2MpOworICBpZiAod2F2ZW5jLT5jdWVzKQorICAgIGdfbGlzdF9mcmVlX2Z1bGwgKHdhdmVuYy0+Y3VlcywgZ19mcmVlKTsKKyAgaWYgKHdhdmVuYy0+bGFibHMpCisgICAgZ19saXN0X2ZyZWVfZnVsbCAod2F2ZW5jLT5sYWJscywgZ19mcmVlKTsKKyAgaWYgKHdhdmVuYy0+bm90ZXMpCisgICAgZ19saXN0X2ZyZWVfZnVsbCAod2F2ZW5jLT5ub3RlcywgZ19mcmVlKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICB3YXZlbmMtPm1ldGFfbGVuZ3RoICs9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisKKyAgcmV0dXJuIGdzdF9wYWRfcHVzaCAod2F2ZW5jLT5zcmNwYWQsIGJ1Zik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdmVuY19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIEdzdFdhdkVuYyAqd2F2ZW5jOworICBHc3RUYWdMaXN0ICp0YWdzOworICBHc3RUb2MgKnRvYzsKKworICB3YXZlbmMgPSBHU1RfV0FWRU5DIChwYXJlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKGV2ZW50LCAmY2Fwcyk7CisgICAgICBnc3Rfd2F2ZW5jX3Npbmtfc2V0Y2FwcyAocGFkLCBjYXBzKTsKKworICAgICAgLyogaGF2ZSBvdXIgb3duIHNyYyBjYXBzICovCisgICAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9FVkVOVF9FT1M6CisgICAgeworICAgICAgR3N0Rmxvd1JldHVybiBmbG93OworICAgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2ZW5jLCAiZ290IEVPUyIpOworCisgICAgICBmbG93ID0gZ3N0X3dhdmVuY193cml0ZV90b2MgKHdhdmVuYyk7CisgICAgICBpZiAoZmxvdyAhPSBHU1RfRkxPV19PSykgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHdhdmVuYywgImVycm9yIHB1c2hpbmcgdG9jOiAlcyIsCisgICAgICAgICAgICBnc3RfZmxvd19nZXRfbmFtZSAoZmxvdykpOworICAgICAgfQorICAgICAgZmxvdyA9IGdzdF93YXZlbmNfd3JpdGVfdGFncyAod2F2ZW5jKTsKKyAgICAgIGlmIChmbG93ICE9IEdTVF9GTE9XX09LKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2ZW5jLCAiZXJyb3IgcHVzaGluZyB0YWdzOiAlcyIsCisgICAgICAgICAgICBnc3RfZmxvd19nZXRfbmFtZSAoZmxvdykpOworICAgICAgfQorCisgICAgICAvKiB3cml0ZSBoZWFkZXIgd2l0aCBjb3JyZWN0IGxlbmd0aCB2YWx1ZXMgKi8KKyAgICAgIGdzdF93YXZlbmNfcHVzaF9oZWFkZXIgKHdhdmVuYyk7CisKKyAgICAgIC8qIHdlJ3JlIGRvbmUgd2l0aCB0aGlzIGZpbGUgKi8KKyAgICAgIHdhdmVuYy0+ZmluaXNoZWRfcHJvcGVybHkgPSBUUlVFOworCisgICAgICAvKiBhbmQgZm9yd2FyZCB0aGUgRU9TIGV2ZW50ICovCisgICAgICByZXMgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfU0VHTUVOVDoKKyAgICAgIC8qIEp1c3QgZHJvcCBpdCwgaXQncyBwcm9iYWJseSBpbiBUSU1FIGZvcm1hdAorICAgICAgICogYW55d2F5LiBXZSdsbCBzZW5kIG91ciBvd24gbmV3c2VnbWVudCBldmVudCAqLworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9FVkVOVF9UT0M6CisgICAgICBnc3RfZXZlbnRfcGFyc2VfdG9jIChldmVudCwgJnRvYywgTlVMTCk7CisgICAgICBpZiAodG9jKSB7CisgICAgICAgIGlmICh3YXZlbmMtPnRvYyAhPSB0b2MpIHsKKyAgICAgICAgICBpZiAod2F2ZW5jLT50b2MpCisgICAgICAgICAgICBnc3RfdG9jX3VucmVmICh3YXZlbmMtPnRvYyk7CisgICAgICAgICAgd2F2ZW5jLT50b2MgPSB0b2M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3N0X3RvY191bnJlZiAodG9jKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmVzID0gZ3N0X3BhZF9ldmVudF9kZWZhdWx0IChwYWQsIHBhcmVudCwgZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfRVZFTlRfVEFHOgorICAgICAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAoZXZlbnQsICZ0YWdzKTsKKyAgICAgIGlmICh0YWdzKSB7CisgICAgICAgIGlmICh3YXZlbmMtPnRhZ3MgIT0gdGFncykgeworICAgICAgICAgIGlmICh3YXZlbmMtPnRhZ3MpCisgICAgICAgICAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHdhdmVuYy0+dGFncyk7CisgICAgICAgICAgd2F2ZW5jLT50YWdzID0gZ3N0X3RhZ19saXN0X3JlZiAodGFncyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJlcyA9IGdzdF9wYWRfZXZlbnRfZGVmYXVsdCAocGFkLCBwYXJlbnQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHBhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfd2F2ZW5jX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RXYXZFbmMgKndhdmVuYyA9IEdTVF9XQVZFTkMgKHBhcmVudCk7CisgIEdzdEZsb3dSZXR1cm4gZmxvdyA9IEdTVF9GTE9XX09LOworCisgIGlmICh3YXZlbmMtPmNoYW5uZWxzIDw9IDApIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUICh3YXZlbmMsICJHb3QgZGF0YSB3aXRob3V0IGNhcHMiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgIH0KKworICBpZiAoR19VTkxJS0VMWSAoIXdhdmVuYy0+c2VudF9oZWFkZXIpKSB7CisgICAgR3N0U3RydWN0dXJlICpzOworICAgIEdzdENhcHMgKmNhcHMgPSBnc3RfcGFkX2dldF9hbGxvd2VkX2NhcHMgKHdhdmVuYy0+c3JjcGFkKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdmVuYywgImFsbG93ZWQgc3JjIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKyAgICBpZiAoIWdzdF9jYXBzX2lzX2ZpeGVkIChjYXBzKSkgeworICAgICAgY2FwcyA9IGdzdF9jYXBzX3RydW5jYXRlIChjYXBzKTsKKyAgICB9CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICAgIHdhdmVuYy0+dXNlX3JmNjQgPSBnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiYXVkaW8veC1yZjY0Iik7CisKKyAgICBnc3RfcGFkX3NldF9jYXBzICh3YXZlbmMtPnNyY3BhZCwgY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgLyogc3RhcnRpbmcgYSBmaWxlLCBtZWFucyB3ZSBoYXZlIHRvIGZpbmlzaCBpdCBwcm9wZXJseSAqLworICAgIHdhdmVuYy0+ZmluaXNoZWRfcHJvcGVybHkgPSBGQUxTRTsKKworICAgIC8qIHB1c2ggaW5pdGlhbCBib2d1cyBoZWFkZXIsIGl0IHdpbGwgYmUgdXBkYXRlZCBvbiBFT1MgKi8KKyAgICBmbG93ID0gZ3N0X3dhdmVuY19wdXNoX2hlYWRlciAod2F2ZW5jKTsKKyAgICBpZiAoZmxvdyAhPSBHU1RfRkxPV19PSykgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh3YXZlbmMsICJlcnJvciBwdXNoaW5nIGhlYWRlcjogJXMiLAorICAgICAgICAgIGdzdF9mbG93X2dldF9uYW1lIChmbG93KSk7CisgICAgICByZXR1cm4gZmxvdzsKKyAgICB9CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2ZW5jLCAid3JvdGUgZHVtbXkgaGVhZGVyIik7CisgICAgd2F2ZW5jLT5hdWRpb19sZW5ndGggPSAwOworICAgIHdhdmVuYy0+c2VudF9oZWFkZXIgPSBUUlVFOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKHdhdmVuYywKKyAgICAgICJwdXNoaW5nICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgcmF3IGF1ZGlvLCB0cz0lIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpLCBHU1RfVElNRV9BUkdTIChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmKSkpOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoYnVmKTsKKworICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSA9IGdldF9oZWFkZXJfbGVuICh3YXZlbmMpICsgd2F2ZW5jLT5hdWRpb19sZW5ndGg7CisgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmKSA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisKKyAgd2F2ZW5jLT5hdWRpb19sZW5ndGggKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKworICBpZiAod2F2ZW5jLT5jaGFubmVsX21hc2sgIT0gMCAmJgorICAgICAgIWdzdF9hdWRpb19idWZmZXJfcmVvcmRlcl9jaGFubmVscyAoYnVmLCB3YXZlbmMtPmF1ZGlvX2Zvcm1hdCwKKyAgICAgICAgICB3YXZlbmMtPmNoYW5uZWxzLCB3YXZlbmMtPnNyY1Bvcywgd2F2ZW5jLT5kZXN0UG9zKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2ZW5jLCAiQ291bGQgbm90IHJlb3JkZXIgY2hhbm5lbHMiKTsKKyAgfQorCisgIGZsb3cgPSBnc3RfcGFkX3B1c2ggKHdhdmVuYy0+c3JjcGFkLCBidWYpOworCisgIHJldHVybiBmbG93OworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF93YXZlbmNfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTOworICBHc3RXYXZFbmMgKndhdmVuYyA9IEdTVF9XQVZFTkMgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgd2F2ZW5jLT5mb3JtYXQgPSAwOworICAgICAgd2F2ZW5jLT5jaGFubmVscyA9IDA7CisgICAgICB3YXZlbmMtPndpZHRoID0gMDsKKyAgICAgIHdhdmVuYy0+cmF0ZSA9IDA7CisgICAgICAvKiB1c2UgYm9ndXMgc2l6ZSBpbml0aWFsbHksIHdlJ2xsIHdyaXRlIHRoZSByZWFsCisgICAgICAgKiBoZWFkZXIgd2hlbiB3ZSBnZXQgRU9TIGFuZCBrbm93IHRoZSBleGFjdCBsZW5ndGggKi8KKyAgICAgIHdhdmVuYy0+YXVkaW9fbGVuZ3RoID0gMHg3RkZGMDAwMDsKKyAgICAgIHdhdmVuYy0+bWV0YV9sZW5ndGggPSAwOworICAgICAgd2F2ZW5jLT5zZW50X2hlYWRlciA9IEZBTFNFOworICAgICAgLyogaXRzIHRydWUgYmVjYXVzZSB3ZSBoYXZlbid0IHdyaXRlbiBhbnl0aGluZyAqLworICAgICAgd2F2ZW5jLT5maW5pc2hlZF9wcm9wZXJseSA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKyAgaWYgKHJldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpCisgICAgcmV0dXJuIHJldDsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgaWYgKCF3YXZlbmMtPmZpbmlzaGVkX3Byb3Blcmx5KSB7CisgICAgICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHdhdmVuYywgU1RSRUFNLCBNVVgsCisgICAgICAgICAgICAoIldhdiBzdHJlYW0gbm90IGZpbmlzaGVkIHByb3Blcmx5IiksCisgICAgICAgICAgICAoIldhdiBzdHJlYW0gbm90IGZpbmlzaGVkIHByb3Blcmx5LCBubyBFT1MgcmVjZWl2ZWQgIgorICAgICAgICAgICAgICAgICJiZWZvcmUgc2h1dGRvd24iKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdmVuYywgInRhZ3M6ICVwIiwgd2F2ZW5jLT50YWdzKTsKKyAgICAgIGlmICh3YXZlbmMtPnRhZ3MpIHsKKyAgICAgICAgZ3N0X3RhZ19saXN0X3VucmVmICh3YXZlbmMtPnRhZ3MpOworICAgICAgICB3YXZlbmMtPnRhZ3MgPSBOVUxMOworICAgICAgfQorICAgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2ZW5jLCAidG9jOiAlcCIsIHdhdmVuYy0+dG9jKTsKKyAgICAgIGlmICh3YXZlbmMtPnRvYykgeworICAgICAgICBnc3RfdG9jX3VucmVmICh3YXZlbmMtPnRvYyk7CisgICAgICAgIHdhdmVuYy0+dG9jID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGdzdF90YWdfc2V0dGVyX3Jlc2V0X3RhZ3MgKEdTVF9UQUdfU0VUVEVSICh3YXZlbmMpKTsKKyAgICAgIGdzdF90b2Nfc2V0dGVyX3Jlc2V0IChHU1RfVE9DX1NFVFRFUiAod2F2ZW5jKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAid2F2ZW5jIiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgIEdTVF9UWVBFX1dBVkVOQyk7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICB3YXZlbmMsCisgICAgIkVuY29kZSByYXcgYXVkaW8gaW50byBXQVYiLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCBHU1RfTElDRU5TRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvZ3N0L3dhdmVuYy9nc3R3YXZlbmMuaCBiL2dzdC93YXZlbmMvZ3N0d2F2ZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiMzhiYgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC93YXZlbmMvZ3N0d2F2ZW5jLmgKQEAgLTAsMCArMSw4MyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIElhaW4gSG9sbWVzIDxpYWluQHByZXR0eXBlb3BsZS5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1dBVl9FTkNfSF9fCisjZGVmaW5lIF9fR1NUX1dBVl9FTkNfSF9fCisKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1dBVkVOQyBcCisgIChnc3Rfd2F2ZW5jX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9XQVZFTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9XQVZFTkMsR3N0V2F2RW5jKSkKKyNkZWZpbmUgR1NUX1dBVkVOQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9XQVZFTkMsR3N0V2F2RW5jQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfV0FWRU5DKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfV0FWRU5DKSkKKyNkZWZpbmUgR1NUX0lTX1dBVkVOQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9XQVZFTkMpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0V2F2RW5jIEdzdFdhdkVuYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RXYXZFbmNDbGFzcyBHc3RXYXZFbmNDbGFzczsKKworc3RydWN0IF9Hc3RXYXZFbmMgeworICBHc3RFbGVtZW50IGVsZW1lbnQ7CisKKyAgR3N0UGFkICAgICpzaW5rcGFkOworICBHc3RQYWQgICAgKnNyY3BhZDsKKworICBHc3RUYWdMaXN0ICp0YWdzOworICBHc3RUb2MgICAgKnRvYzsKKyAgR0xpc3QgICAgICpjdWVzOworICBHTGlzdCAgICAgKmxhYmxzOworICBHTGlzdCAgICAgKm5vdGVzOworCisgIC8qIHVzZWZ1bCBhdWRpbyBkYXRhICovCisgIEdzdEF1ZGlvRm9ybWF0IGF1ZGlvX2Zvcm1hdDsKKyAgZ3VpbnQxNiAgICBmb3JtYXQ7CisgIGd1aW50ICAgICAgd2lkdGg7CisgIGd1aW50ICAgICAgcmF0ZTsKKyAgZ3VpbnQgICAgICBjaGFubmVsczsKKyAgZ3VpbnQ2NCAgICBjaGFubmVsX21hc2s7CisgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHNyY1Bvc1s2NF07CisgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIGRlc3RQb3NbNjRdOworICAKKyAgLyogZGF0YSBzaXplcyAqLworICBndWludDY0ICAgIGF1ZGlvX2xlbmd0aDsKKyAgZ3VpbnQzMiAgICBtZXRhX2xlbmd0aDsKKworICBnYm9vbGVhbiAgIHVzZV9yZjY0OworICBnYm9vbGVhbiAgIHNlbnRfaGVhZGVyOworICBnYm9vbGVhbiAgIGZpbmlzaGVkX3Byb3Blcmx5OworfTsKKworc3RydWN0IF9Hc3RXYXZFbmNDbGFzcyB7CisgIEdzdEVsZW1lbnRDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3Rfd2F2ZW5jX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1dBVl9FTkNfSF9fICovCmRpZmYgLS1naXQgYS9nc3Qvd2F2ZW5jL21lc29uLmJ1aWxkIGIvZ3N0L3dhdmVuYy9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGE5Mjk5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3dhdmVuYy9tZXNvbi5idWlsZApAQCAtMCwwICsxLDggQEAKK2dzdHdhdmVuYyA9IGxpYnJhcnkoJ2dzdHdhdmVuYycsCisgICdnc3R3YXZlbmMuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0YmFzZV9kZXAsIGdzdGF1ZGlvX2RlcCwgZ3N0cmlmZl9kZXBdLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L3dhdnBhcnNlLy5naXRpZ25vcmUgYi9nc3Qvd2F2cGFyc2UvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGY1ZWQzCi0tLSAvZGV2L251bGwKKysrIGIvZ3N0L3dhdnBhcnNlLy5naXRpZ25vcmUKQEAgLTAsMCArMSw3IEBACitNYWtlZmlsZQorTWFrZWZpbGUuaW4KKyoubworKi5sbworKi5sYQorLmRlcHMKKy5saWJzCmRpZmYgLS1naXQgYS9nc3Qvd2F2cGFyc2UvTWFrZWZpbGUuYW0gYi9nc3Qvd2F2cGFyc2UvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA3NmMyOAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC93YXZwYXJzZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE5IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3R3YXZwYXJzZS5sYQorCitsaWJnc3R3YXZwYXJzZV9sYV9TT1VSQ0VTID0gZ3N0d2F2cGFyc2UuYworbGliZ3N0d2F2cGFyc2VfbGFfQ0ZMQUdTID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9CQVNFX0NGTEFHUykgXAorCSQoR1NUX0NGTEFHUykKK2xpYmdzdHdhdnBhcnNlX2xhX0xJQkFERCA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgXAorCS1sZ3N0cmlmZi1AR1NUX0FQSV9WRVJTSU9OQCBcCisJLWxnc3RhdWRpby1AR1NUX0FQSV9WRVJTSU9OQCBcCisJLWxnc3R0YWctQEdTVF9BUElfVkVSU0lPTkAgXAorCS1sZ3N0cGJ1dGlscy1AR1NUX0FQSV9WRVJTSU9OQCBcCisJJChHU1RfQkFTRV9MSUJTKSBcCisJJChHU1RfTElCUykgXAorCSQoTElCTSkKK2xpYmdzdHdhdnBhcnNlX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3R3YXZwYXJzZS5oCmRpZmYgLS1naXQgYS9nc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYyBiL2dzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTcwMWYKLS0tIC9kZXYvbnVsbAorKysgYi9nc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYwpAQCAtMCwwICsxLDI5NjkgQEAKKy8qIC0qLSBNb2RlOiBDOyB0YWItd2lkdGg6IDI7IGluZGVudC10YWJzLW1vZGU6IHQ7IGMtYmFzaWMtb2Zmc2V0OiAyIC0qLSAqLworLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICogQ29weXJpZ2h0IChDKSA8MjAwNj4gTm9raWEgQ29ycG9yYXRpb24sIFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXdhdnBhcnNlCisgKgorICogUGFyc2UgYSAud2F2IGZpbGUgaW50byByYXcgb3IgY29tcHJlc3NlZCBhdWRpby4KKyAqCisgKiBXYXZwYXJzZSBzdXBwb3J0cyBib3RoIHB1c2ggYW5kIHB1bGwgbW9kZSBvcGVyYXRpb25zLCBtYWtpbmcgaXQgcG9zc2libGUgdG8KKyAqIHN0cmVhbSBmcm9tIGEgbmV0d29yayBzb3VyY2UuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIGZpbGVzcmMgbG9jYXRpb249c2luZS53YXYgISB3YXZwYXJzZSAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBdfCBSZWFkIGEgd2F2IGZpbGUgYW5kIG91dHB1dCB0byB0aGUgc291bmRjYXJkIHVzaW5nIHRoZSBBTFNBIGVsZW1lbnQuIFRoZQorICogd2F2IGZpbGUgaXMgYXNzdW1lZCB0byBjb250YWluIHJhdyB1bmNvbXByZXNzZWQgc2FtcGxlcy4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCBnbm9tZXZmc3NyYyBsb2NhdGlvbj1odHRwOi8vd3d3LmV4YW1wbGUub3JnL3NpbmUud2F2ICEgcXVldWUgISB3YXZwYXJzZSAhIGF1ZGlvY29udmVydCAhIGFsc2FzaW5rCisgKiBdfCBTdHJlYW0gZGF0YSBmcm9tIGEgbmV0d29yayB1cmwuCisgKiA8L3JlZnNlY3QyPgorICovCisKKy8qCisgKiBUT0RPOgorICogaHR0cDovL3JlcGxheWdhaW4uaHlkcm9nZW5hdWRpby5vcmcvZmlsZV9mb3JtYXRfd2F2Lmh0bWwKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJnc3R3YXZwYXJzZS5oIgorI2luY2x1ZGUgImdzdC9yaWZmL3JpZmYtbWVkaWEuaCIKKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3R0eXBlZmluZGhlbHBlci5oPgorI2luY2x1ZGUgPGdzdC9wYnV0aWxzL2Rlc2NyaXB0aW9ucy5oPgorI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAod2F2cGFyc2VfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgKHdhdnBhcnNlX2RlYnVnKQorCisvKiBEYXRhIHNpemUgY2h1bmsgb2YgUkY2NCwKKyAqIHNlZSBodHRwOi8vdGVjaC5lYnUuY2gvZG9jcy90ZWNoL3RlY2gzMzA2LTIwMDkucGRmICovCisjZGVmaW5lIEdTVF9SUzY0X1RBR19EUzY0IEdTVF9NQUtFX0ZPVVJDQyAoJ2QnLCdzJywnNicsJzQnKQorCitzdGF0aWMgdm9pZCBnc3Rfd2F2cGFyc2VfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfd2F2cGFyc2Vfc2lua19hY3RpdmF0ZSAoR3N0UGFkICogc2lua3BhZCwKKyAgICBHc3RPYmplY3QgKiBwYXJlbnQpOworc3RhdGljIGdib29sZWFuIGdzdF93YXZwYXJzZV9zaW5rX2FjdGl2YXRlX21vZGUgKEdzdFBhZCAqIHNpbmtwYWQsCisgICAgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RQYWRNb2RlIG1vZGUsIGdib29sZWFuIGFjdGl2ZSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3dhdnBhcnNlX3NlbmRfZXZlbnQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF93YXZwYXJzZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3dhdnBhcnNlX3BhZF9xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsCisgICAgR3N0UXVlcnkgKiBxdWVyeSk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3dhdnBhcnNlX3BhZF9jb252ZXJ0IChHc3RQYWQgKiBwYWQsIEdzdEZvcm1hdCBzcmNfZm9ybWF0LAorICAgIGdpbnQ2NCBzcmNfdmFsdWUsIEdzdEZvcm1hdCAqIGRlc3RfZm9ybWF0LCBnaW50NjQgKiBkZXN0X3ZhbHVlKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3dhdnBhcnNlX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RCdWZmZXIgKiBidWYpOworc3RhdGljIGdib29sZWFuIGdzdF93YXZwYXJzZV9zaW5rX2V2ZW50IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwKKyAgICBHc3RFdmVudCAqIGV2ZW50KTsKK3N0YXRpYyB2b2lkIGdzdF93YXZwYXJzZV9sb29wIChHc3RQYWQgKiBwYWQpOworc3RhdGljIGdib29sZWFuIGdzdF93YXZwYXJzZV9zcmNwYWRfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdEV2ZW50ICogZXZlbnQpOworCitzdGF0aWMgdm9pZCBnc3Rfd2F2cGFyc2Vfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3dhdnBhcnNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworI2RlZmluZSBERUZBVUxUX0lHTk9SRV9MRU5HVEggRkFMU0UKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfSUdOT1JFX0xFTkdUSCwKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX3RlbXBsYXRlX2ZhY3RvcnkgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC13YXYiKQorICAgICk7CisKKyNkZWZpbmUgREVCVUdfSU5JVCBcCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUICh3YXZwYXJzZV9kZWJ1ZywgIndhdnBhcnNlIiwgMCwgIldBViBwYXJzZXIiKTsKKworI2RlZmluZSBnc3Rfd2F2cGFyc2VfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdFdhdlBhcnNlLCBnc3Rfd2F2cGFyc2UsIEdTVF9UWVBFX0VMRU1FTlQsCisgICAgREVCVUdfSU5JVCk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qIE9mZnNldCBTaXplICAgIERlc2NyaXB0aW9uICAgVmFsdWUKKyAgICogMHgwMCAgIDQgICAgICAgSUQgICAgICAgICAgICB1bmlxdWUgaWRlbnRpZmljYXRpb24gdmFsdWUKKyAgICogMHgwNCAgIDQgICAgICAgUG9zaXRpb24gICAgICBwbGF5IG9yZGVyIHBvc2l0aW9uCisgICAqIDB4MDggICA0ICAgICAgIERhdGEgQ2h1bmsgSUQgUklGRiBJRCBvZiBjb3JyZXNwb25kaW5nIGRhdGEgY2h1bmsKKyAgICogMHgwYyAgIDQgICAgICAgQ2h1bmsgU3RhcnQgICBCeXRlIE9mZnNldCBvZiBEYXRhIENodW5rICoKKyAgICogMHgxMCAgIDQgICAgICAgQmxvY2sgU3RhcnQgICBCeXRlIE9mZnNldCB0byBzYW1wbGUgb2YgRmlyc3QgQ2hhbm5lbAorICAgKiAweDE0ICAgNCAgICAgICBTYW1wbGUgT2Zmc2V0IEJ5dGUgT2Zmc2V0IHRvIHNhbXBsZSBieXRlIG9mIEZpcnN0IENoYW5uZWwKKyAgICovCisgIGd1aW50MzIgaWQ7CisgIGd1aW50MzIgcG9zaXRpb247CisgIGd1aW50MzIgZGF0YV9jaHVua19pZDsKKyAgZ3VpbnQzMiBjaHVua19zdGFydDsKKyAgZ3VpbnQzMiBibG9ja19zdGFydDsKKyAgZ3VpbnQzMiBzYW1wbGVfb2Zmc2V0OworfSBHc3RXYXZQYXJzZUN1ZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgLyogT2Zmc2V0IFNpemUgICAgRGVzY3JpcHRpb24gICAgIFZhbHVlCisgICAqIDB4MDggICA0ICAgICAgIEN1ZSBQb2ludCBJRCAgICAwIC0gMHhGRkZGRkZGRgorICAgKiAweDBjICAgICAgICAgICBUZXh0CisgICAqLworICBndWludDMyIGN1ZV9wb2ludF9pZDsKKyAgZ2NoYXIgKnRleHQ7Cit9IEdzdFdhdlBhcnNlTGFibCwgR3N0V2F2UGFyc2VOb3RlOworCitzdGF0aWMgdm9pZAorZ3N0X3dhdnBhcnNlX2NsYXNzX2luaXQgKEdzdFdhdlBhcnNlQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzczsKKyAgR3N0UGFkVGVtcGxhdGUgKnNyY190ZW1wbGF0ZTsKKworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKworICBwYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGtsYXNzKTsKKworICBvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3Rfd2F2cGFyc2VfZGlzcG9zZTsKKworICBvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF93YXZwYXJzZV9zZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3dhdnBhcnNlX2dldF9wcm9wZXJ0eTsKKworICAvKioKKyAgICogR3N0V2F2UGFyc2U6aWdub3JlLWxlbmd0aDoKKyAgICoKKyAgICogVGhpcyBzZWxlY3RzIHdoZXRoZXIgdGhlIGxlbmd0aCBmb3VuZCBpbiBhIGRhdGEgY2h1bmsKKyAgICogc2hvdWxkIGJlIGlnbm9yZWQuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc3RyZWFtZWQgYXVkaW8KKyAgICogd2hlcmUgdGhlIGxlbmd0aCBpcyB1bmtub3duIHVudGlsIHRoZSBlbmQgb2Ygc3RyZWFtaW5nLAorICAgKiBhbmQgdmFyaW91cyBzb2Z0d2FyZS9oYXJkd2FyZSBqdXN0IHB1dHMgc29tZSByYW5kb20gdmFsdWUKKyAgICogaW4gdGhlcmUgYW5kIGhvcGVzIGl0IGRvZXNuJ3QgYnJlYWsgdG9vIG11Y2guCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChvYmplY3RfY2xhc3MsIFBST1BfSUdOT1JFX0xFTkdUSCwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiaWdub3JlLWxlbmd0aCIsCisgICAgICAgICAgIklnbm9yZSBsZW5ndGgiLAorICAgICAgICAgICJJZ25vcmUgbGVuZ3RoIGZyb20gdGhlIFdhdmUgaGVhZGVyIiwKKyAgICAgICAgICBERUZBVUxUX0lHTk9SRV9MRU5HVEgsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykKKyAgICAgICk7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0gZ3N0X3dhdnBhcnNlX2NoYW5nZV9zdGF0ZTsKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+c2VuZF9ldmVudCA9IGdzdF93YXZwYXJzZV9zZW5kX2V2ZW50OworCisgIC8qIHJlZ2lzdGVyIHBhZHMgKi8KKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmc2lua190ZW1wbGF0ZV9mYWN0b3J5KTsKKworICBzcmNfdGVtcGxhdGUgPSBnc3RfcGFkX3RlbXBsYXRlX25ldyAoInNyYyIsIEdTVF9QQURfU1JDLAorICAgICAgR1NUX1BBRF9BTFdBWVMsIGdzdF9yaWZmX2NyZWF0ZV9hdWRpb190ZW1wbGF0ZV9jYXBzICgpKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgc3JjX3RlbXBsYXRlKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiV0FWIGF1ZGlvIGRlbXV4ZXIiLAorICAgICAgIkNvZGVjL0RlbXV4ZXIvQXVkaW8iLAorICAgICAgIlBhcnNlIGEgLndhdiBmaWxlIGludG8gcmF3IGF1ZGlvIiwKKyAgICAgICJFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3dhdnBhcnNlX25vdGVzX2ZyZWUgKEdzdFdhdlBhcnNlTm90ZSAqIG5vdGUpCit7CisgIGlmIChub3RlKQorICAgIGdfZnJlZSAobm90ZS0+dGV4dCk7CisgIGdfZnJlZSAobm90ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFyc2VfbGFibHNfZnJlZSAoR3N0V2F2UGFyc2VMYWJsICogbGFibCkKK3sKKyAgaWYgKGxhYmwpCisgICAgZ19mcmVlIChsYWJsLT50ZXh0KTsKKyAgZ19mcmVlIChsYWJsKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZwYXJzZV9yZXNldCAoR3N0V2F2UGFyc2UgKiB3YXYpCit7CisgIHdhdi0+c3RhdGUgPSBHU1RfV0FWUEFSU0VfU1RBUlQ7CisKKyAgLyogVGhlc2Ugd2lsbCBhbGwgYmUgc2V0IGNvcnJlY3RseSBpbiB0aGUgZm10IGNodW5rICovCisgIHdhdi0+ZGVwdGggPSAwOworICB3YXYtPnJhdGUgPSAwOworICB3YXYtPndpZHRoID0gMDsKKyAgd2F2LT5jaGFubmVscyA9IDA7CisgIHdhdi0+YmxvY2thbGlnbiA9IDA7CisgIHdhdi0+YnBzID0gMDsKKyAgd2F2LT5mYWN0ID0gMDsKKyAgd2F2LT5vZmZzZXQgPSAwOworICB3YXYtPmVuZF9vZmZzZXQgPSAwOworICB3YXYtPmRhdGFsZWZ0ID0gMDsKKyAgd2F2LT5kYXRhc2l6ZSA9IDA7CisgIHdhdi0+ZGF0YXN0YXJ0ID0gMDsKKyAgd2F2LT5jaHVua19zaXplID0gMDsKKyAgd2F2LT5kdXJhdGlvbiA9IDA7CisgIHdhdi0+Z290X2ZtdCA9IEZBTFNFOworICB3YXYtPmZpcnN0ID0gVFJVRTsKKworICBpZiAod2F2LT5zZWVrX2V2ZW50KQorICAgIGdzdF9ldmVudF91bnJlZiAod2F2LT5zZWVrX2V2ZW50KTsKKyAgd2F2LT5zZWVrX2V2ZW50ID0gTlVMTDsKKyAgaWYgKHdhdi0+YWRhcHRlcikgeworICAgIGdzdF9hZGFwdGVyX2NsZWFyICh3YXYtPmFkYXB0ZXIpOworICAgIGdfb2JqZWN0X3VucmVmICh3YXYtPmFkYXB0ZXIpOworICAgIHdhdi0+YWRhcHRlciA9IE5VTEw7CisgIH0KKyAgaWYgKHdhdi0+dGFncykKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHdhdi0+dGFncyk7CisgIHdhdi0+dGFncyA9IE5VTEw7CisgIGlmICh3YXYtPnRvYykKKyAgICBnc3RfdG9jX3VucmVmICh3YXYtPnRvYyk7CisgIHdhdi0+dG9jID0gTlVMTDsKKyAgaWYgKHdhdi0+Y3VlcykKKyAgICBnX2xpc3RfZnJlZV9mdWxsICh3YXYtPmN1ZXMsIGdfZnJlZSk7CisgIHdhdi0+Y3VlcyA9IE5VTEw7CisgIGlmICh3YXYtPmxhYmxzKQorICAgIGdfbGlzdF9mcmVlX2Z1bGwgKHdhdi0+bGFibHMsIChHRGVzdHJveU5vdGlmeSkgZ3N0X3dhdnBhcnNlX2xhYmxzX2ZyZWUpOworICB3YXYtPmxhYmxzID0gTlVMTDsKKyAgaWYgKHdhdi0+bm90ZXMpCisgICAgZ19saXN0X2ZyZWVfZnVsbCAod2F2LT5ub3RlcywgKEdEZXN0cm95Tm90aWZ5KSBnc3Rfd2F2cGFyc2Vfbm90ZXNfZnJlZSk7CisgIHdhdi0+bm90ZXMgPSBOVUxMOworICBpZiAod2F2LT5jYXBzKQorICAgIGdzdF9jYXBzX3VucmVmICh3YXYtPmNhcHMpOworICB3YXYtPmNhcHMgPSBOVUxMOworICBpZiAod2F2LT5zdGFydF9zZWdtZW50KQorICAgIGdzdF9ldmVudF91bnJlZiAod2F2LT5zdGFydF9zZWdtZW50KTsKKyAgd2F2LT5zdGFydF9zZWdtZW50ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZwYXJzZV9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RXYXZQYXJzZSAqd2F2ID0gR1NUX1dBVlBBUlNFIChvYmplY3QpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgIldBVjogRGlzcG9zZSIpOworICBnc3Rfd2F2cGFyc2VfcmVzZXQgKHdhdik7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFyc2VfaW5pdCAoR3N0V2F2UGFyc2UgKiB3YXZwYXJzZSkKK3sKKyAgZ3N0X3dhdnBhcnNlX3Jlc2V0ICh3YXZwYXJzZSk7CisKKyAgLyogc2luayAqLworICB3YXZwYXJzZS0+c2lua3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNpbmtfdGVtcGxhdGVfZmFjdG9yeSwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZhdGVfZnVuY3Rpb24gKHdhdnBhcnNlLT5zaW5rcGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZwYXJzZV9zaW5rX2FjdGl2YXRlKSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2YXRlbW9kZV9mdW5jdGlvbiAod2F2cGFyc2UtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdnBhcnNlX3NpbmtfYWN0aXZhdGVfbW9kZSkpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAod2F2cGFyc2UtPnNpbmtwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdnBhcnNlX2NoYWluKSk7CisgIGdzdF9wYWRfc2V0X2V2ZW50X2Z1bmN0aW9uICh3YXZwYXJzZS0+c2lua3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2cGFyc2Vfc2lua19ldmVudCkpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChHU1RfRUxFTUVOVF9DQVNUICh3YXZwYXJzZSksIHdhdnBhcnNlLT5zaW5rcGFkKTsKKworICAvKiBzcmMgKi8KKyAgd2F2cGFyc2UtPnNyY3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3RlbXBsYXRlIChnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlCisgICAgICAoR1NUX0VMRU1FTlRfR0VUX0NMQVNTICh3YXZwYXJzZSksICJzcmMiKSwgInNyYyIpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzICh3YXZwYXJzZS0+c3JjcGFkKTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHdhdnBhcnNlLT5zcmNwYWQsCisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdnBhcnNlX3BhZF9xdWVyeSkpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAod2F2cGFyc2UtPnNyY3BhZCwKKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2cGFyc2Vfc3JjcGFkX2V2ZW50KSk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKEdTVF9FTEVNRU5UX0NBU1QgKHdhdnBhcnNlKSwgd2F2cGFyc2UtPnNyY3BhZCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhcnNlX3BhcnNlX2ZpbGVfaGVhZGVyIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0QnVmZmVyICogYnVmKQoreworICBndWludDMyIGRvY3R5cGU7CisKKyAgaWYgKCFnc3RfcmlmZl9wYXJzZV9maWxlX2hlYWRlciAoZWxlbWVudCwgYnVmLCAmZG9jdHlwZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChkb2N0eXBlICE9IEdTVF9SSUZGX1JJRkZfV0FWRSkKKyAgICBnb3RvIG5vdF93YXY7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub3Rfd2F2OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGVsZW1lbnQsIFNUUkVBTSwgV1JPTkdfVFlQRSwgKE5VTEwpLAorICAgICAgICAoIkZpbGUgaXMgbm90IGEgV0FWRSBmaWxlOiAweCUiIEdfR0lOVDMyX01PRElGSUVSICJ4IiwgZG9jdHlwZSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3dhdnBhcnNlX3N0cmVhbV9pbml0IChHc3RXYXZQYXJzZSAqIHdhdikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIEdzdEJ1ZmZlciAqYnVmID0gTlVMTDsKKworICBpZiAoKHJlcyA9IGdzdF9wYWRfcHVsbF9yYW5nZSAod2F2LT5zaW5rcGFkLAorICAgICAgICAgICAgICB3YXYtPm9mZnNldCwgMTIsICZidWYpKSAhPSBHU1RfRkxPV19PSykKKyAgICByZXR1cm4gcmVzOworICBlbHNlIGlmICghZ3N0X3dhdnBhcnNlX3BhcnNlX2ZpbGVfaGVhZGVyIChHU1RfRUxFTUVOVF9DQVNUICh3YXYpLCBidWYpKQorICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKworICB3YXYtPm9mZnNldCArPSAxMjsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhcnNlX3RpbWVfdG9fYnl0ZXBvcyAoR3N0V2F2UGFyc2UgKiB3YXYsIGdpbnQ2NCB0cywgZ2ludDY0ICogYnl0ZXBvcykKK3sKKyAgLyogLTEgYWx3YXlzIG1hcHMgdG8gLTEgKi8KKyAgaWYgKHRzID09IC0xKSB7CisgICAgKmJ5dGVwb3MgPSAtMTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIC8qIDAgYWx3YXlzIG1hcHMgdG8gMCAqLworICBpZiAodHMgPT0gMCkgeworICAgICpieXRlcG9zID0gMDsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGlmICh3YXYtPmJwcyA+IDApIHsKKyAgICAqYnl0ZXBvcyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9jZWlsICh0cywgKGd1aW50NjQpIHdhdi0+YnBzLCBHU1RfU0VDT05EKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIGlmICh3YXYtPmZhY3QpIHsKKyAgICBndWludDY0IGJwcyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAod2F2LT5kYXRhc2l6ZSwgd2F2LT5yYXRlLCB3YXYtPmZhY3QpOworICAgICpieXRlcG9zID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2NlaWwgKHRzLCBicHMsIEdTVF9TRUNPTkQpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGVyZm9ybSBzZWVrcyBvbiB0aGUgZWxlbWVudC4KKyAqCisgKiBJdCBhbHNvIHdvcmtzIHdoZW4gZXZlbnQgaXMgTlVMTCwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGp1c3QKKyAqIHN0YXJ0IGZyb20gdGhlIGxhc3QgY29uZmlndXJlZCBzZWdtZW50LiBUaGlzIHRlY2huaXF1ZSBpcworICogdXNlZCB3aGVuIGFjdGl2YXRpbmcgdGhlIGVsZW1lbnQgYW5kIHRvIHBlcmZvcm0gdGhlIHNlZWsgaW4KKyAqIFJFQURZLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYXJzZV9wZXJmb3JtX3NlZWsgKEdzdFdhdlBhcnNlICogd2F2LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBnYm9vbGVhbiByZXM7CisgIGdkb3VibGUgcmF0ZTsKKyAgR3N0Rm9ybWF0IGZvcm1hdCwgYmZvcm1hdDsKKyAgR3N0U2Vla0ZsYWdzIGZsYWdzOworICBHc3RTZWVrVHlwZSBjdXJfdHlwZSA9IEdTVF9TRUVLX1RZUEVfTk9ORSwgc3RvcF90eXBlOworICBnaW50NjQgY3VyLCBzdG9wLCB1cHN0cmVhbV9zaXplOworICBnYm9vbGVhbiBmbHVzaDsKKyAgZ2Jvb2xlYW4gdXBkYXRlOworICBHc3RTZWdtZW50IHNlZWtzZWdtZW50ID0geyAwLCB9OworICBnaW50NjQgbGFzdF9zdG9wOworICBndWludDMyIHNlcW51bSA9IDA7CisKKyAgaWYgKGV2ZW50KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiZG9pbmcgc2VlayB3aXRoIGV2ZW50Iik7CisKKyAgICBnc3RfZXZlbnRfcGFyc2Vfc2VlayAoZXZlbnQsICZyYXRlLCAmZm9ybWF0LCAmZmxhZ3MsCisgICAgICAgICZjdXJfdHlwZSwgJmN1ciwgJnN0b3BfdHlwZSwgJnN0b3ApOworICAgIHNlcW51bSA9IGdzdF9ldmVudF9nZXRfc2VxbnVtIChldmVudCk7CisKKyAgICAvKiBubyBuZWdhdGl2ZSByYXRlcyB5ZXQgKi8KKyAgICBpZiAocmF0ZSA8IDAuMCkKKyAgICAgIGdvdG8gbmVnYXRpdmVfcmF0ZTsKKworICAgIGlmIChmb3JtYXQgIT0gd2F2LT5zZWdtZW50LmZvcm1hdCkgeworICAgICAgR1NUX0lORk9fT0JKRUNUICh3YXYsICJjb252ZXJ0aW5nIHNlZWstZXZlbnQgZnJvbSAlcyB0byAlcyIsCisgICAgICAgICAgZ3N0X2Zvcm1hdF9nZXRfbmFtZSAoZm9ybWF0KSwKKyAgICAgICAgICBnc3RfZm9ybWF0X2dldF9uYW1lICh3YXYtPnNlZ21lbnQuZm9ybWF0KSk7CisgICAgICByZXMgPSBUUlVFOworICAgICAgaWYgKGN1cl90eXBlICE9IEdTVF9TRUVLX1RZUEVfTk9ORSkKKyAgICAgICAgcmVzID0KKyAgICAgICAgICAgIGdzdF9wYWRfcXVlcnlfY29udmVydCAod2F2LT5zcmNwYWQsIGZvcm1hdCwgY3VyLAorICAgICAgICAgICAgd2F2LT5zZWdtZW50LmZvcm1hdCwgJmN1cik7CisgICAgICBpZiAocmVzICYmIHN0b3BfdHlwZSAhPSBHU1RfU0VFS19UWVBFX05PTkUpCisgICAgICAgIHJlcyA9CisgICAgICAgICAgICBnc3RfcGFkX3F1ZXJ5X2NvbnZlcnQgKHdhdi0+c3JjcGFkLCBmb3JtYXQsIHN0b3AsCisgICAgICAgICAgICB3YXYtPnNlZ21lbnQuZm9ybWF0LCAmc3RvcCk7CisgICAgICBpZiAoIXJlcykKKyAgICAgICAgZ290byBub19mb3JtYXQ7CisKKyAgICAgIGZvcm1hdCA9IHdhdi0+c2VnbWVudC5mb3JtYXQ7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgImRvaW5nIHNlZWsgd2l0aG91dCBldmVudCIpOworICAgIGZsYWdzID0gMDsKKyAgICByYXRlID0gMS4wOworICAgIGN1cl90eXBlID0gR1NUX1NFRUtfVFlQRV9TRVQ7CisgICAgc3RvcF90eXBlID0gR1NUX1NFRUtfVFlQRV9TRVQ7CisgIH0KKworICAvKiBpbiBwdXNoIG1vZGUsIHdlIG11c3QgZGVsZWdhdGUgdG8gdXBzdHJlYW0gKi8KKyAgaWYgKHdhdi0+c3RyZWFtaW5nKSB7CisgICAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgICAvKiBpZiBzdHJlYW1pbmcgbm90IHlldCBzdGFydGVkOyBvbmx5IHByZXBhcmUgaW5pdGlhbCBuZXdzZWdtZW50ICovCisgICAgaWYgKCFldmVudCB8fCB3YXYtPnN0YXRlICE9IEdTVF9XQVZQQVJTRV9EQVRBKSB7CisgICAgICBpZiAod2F2LT5zdGFydF9zZWdtZW50KQorICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKHdhdi0+c3RhcnRfc2VnbWVudCk7CisgICAgICB3YXYtPnN0YXJ0X3NlZ21lbnQgPSBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZ3YXYtPnNlZ21lbnQpOworICAgICAgcmVzID0gVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgLyogY29udmVydCBzZWVrIHBvc2l0aW9ucyB0byBieXRlIHBvc2l0aW9ucyBpbiBkYXRhIHNlY3Rpb25zICovCisgICAgICBpZiAoZm9ybWF0ID09IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgICAvKiBzaG91bGQgbm90IGZhaWwgKi8KKyAgICAgICAgaWYgKCFnc3Rfd2F2cGFyc2VfdGltZV90b19ieXRlcG9zICh3YXYsIGN1ciwgJmN1cikpCisgICAgICAgICAgZ290byBub19wb3NpdGlvbjsKKyAgICAgICAgaWYgKCFnc3Rfd2F2cGFyc2VfdGltZV90b19ieXRlcG9zICh3YXYsIHN0b3AsICZzdG9wKSkKKyAgICAgICAgICBnb3RvIG5vX3Bvc2l0aW9uOworICAgICAgfQorICAgICAgLyogbWluZCBzYW1wbGUgYm91bmRhcnkgYW5kIGhlYWRlciAqLworICAgICAgaWYgKGN1ciA+PSAwKSB7CisgICAgICAgIGN1ciAtPSAoY3VyICUgd2F2LT5ieXRlc19wZXJfc2FtcGxlKTsKKyAgICAgICAgY3VyICs9IHdhdi0+ZGF0YXN0YXJ0OworICAgICAgfQorICAgICAgaWYgKHN0b3AgPj0gMCkgeworICAgICAgICBzdG9wIC09IChzdG9wICUgd2F2LT5ieXRlc19wZXJfc2FtcGxlKTsKKyAgICAgICAgc3RvcCArPSB3YXYtPmRhdGFzdGFydDsKKyAgICAgIH0KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgIlB1c2hpbmcgQllURSBzZWVrIHJhdGUgJWcsICIKKyAgICAgICAgICAic3RhcnQgJSIgR19HSU5UNjRfRk9STUFUICIsIHN0b3AgJSIgR19HSU5UNjRfRk9STUFULCByYXRlLCBjdXIsCisgICAgICAgICAgc3RvcCk7CisgICAgICAvKiBCWVRFIHNlZWsgZXZlbnQgKi8KKyAgICAgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWVrIChyYXRlLCBHU1RfRk9STUFUX0JZVEVTLCBmbGFncywgY3VyX3R5cGUsIGN1ciwKKyAgICAgICAgICBzdG9wX3R5cGUsIHN0b3ApOworICAgICAgZ3N0X2V2ZW50X3NldF9zZXFudW0gKGV2ZW50LCBzZXFudW0pOworICAgICAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50ICh3YXYtPnNpbmtwYWQsIGV2ZW50KTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKKyAgfQorCisgIC8qIGdldCBmbHVzaCBmbGFnICovCisgIGZsdXNoID0gZmxhZ3MgJiBHU1RfU0VFS19GTEFHX0ZMVVNIOworCisgIC8qIG5vdyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgc3RyZWFtaW5nIHRocmVhZCBpcyBzdG9wcGVkLiBXZSBkbyB0aGlzIGJ5CisgICAqIGVpdGhlciBzZW5kaW5nIGEgRkxVU0hfU1RBUlQgZXZlbnQgZG93bnN0cmVhbSB3aGljaCB3aWxsIGNhdXNlIHRoZQorICAgKiBzdHJlYW1pbmcgdGhyZWFkIHRvIHN0b3Agd2l0aCBhIFdST05HX1NUQVRFLgorICAgKiBGb3IgYSBub24tZmx1c2hpbmcgc2VlayB3ZSBzaW1wbHkgcGF1c2UgdGhlIHRhc2ssIHdoaWNoIHdpbGwgaGFwcGVuIGFzIHNvb24KKyAgICogYXMgaXQgY29tcGxldGVzIG9uZSBpdGVyYXRpb24gKGFuZCB0aHVzIG1pZ2h0IGJsb2NrIHdoZW4gdGhlIHNpbmsgaXMKKyAgICogYmxvY2tpbmcgaW4gcHJlcm9sbCkuICovCisgIGlmIChmbHVzaCkgeworICAgIEdzdEV2ZW50ICpmZXZlbnQ7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAic2VuZGluZyBmbHVzaCBzdGFydCIpOworCisgICAgZmV2ZW50ID0gZ3N0X2V2ZW50X25ld19mbHVzaF9zdGFydCAoKTsKKyAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZmV2ZW50LCBzZXFudW0pOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAod2F2LT5zaW5rcGFkLCBnc3RfZXZlbnRfcmVmIChmZXZlbnQpKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHdhdi0+c3JjcGFkLCBmZXZlbnQpOworICB9IGVsc2UgeworICAgIGdzdF9wYWRfcGF1c2VfdGFzayAod2F2LT5zaW5rcGFkKTsKKyAgfQorCisgIC8qIHdlIHNob3VsZCBub3cgYmUgYWJsZSB0byBncmFiIHRoZSBzdHJlYW1pbmcgdGhyZWFkIGJlY2F1c2Ugd2Ugc3RvcHBlZCBpdAorICAgKiB3aXRoIHRoZSBhYm92ZSBmbHVzaC9wYXVzZSBjb2RlICovCisgIEdTVF9QQURfU1RSRUFNX0xPQ0sgKHdhdi0+c2lua3BhZCk7CisKKyAgLyogc2F2ZSBjdXJyZW50IHBvc2l0aW9uICovCisgIGxhc3Rfc3RvcCA9IHdhdi0+c2VnbWVudC5wb3NpdGlvbjsKKworICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJzdG9wcGVkIHN0cmVhbWluZyBhdCAlIiBHX0dJTlQ2NF9GT1JNQVQsIGxhc3Rfc3RvcCk7CisKKyAgLyogY29weSBzZWdtZW50LCB3ZSBuZWVkIHRoaXMgYmVjYXVzZSB3ZSBzdGlsbCBuZWVkIHRoZSBvbGQKKyAgICogc2VnbWVudCB3aGVuIHdlIGNsb3NlIHRoZSBjdXJyZW50IHNlZ21lbnQuICovCisgIG1lbWNweSAoJnNlZWtzZWdtZW50LCAmd2F2LT5zZWdtZW50LCBzaXplb2YgKEdzdFNlZ21lbnQpKTsKKworICAvKiBjb25maWd1cmUgdGhlIHNlZWsgcGFyYW1ldGVycyBpbiB0aGUgc2Vla3NlZ21lbnQuIFdlIHdpbGwgdGhlbiBoYXZlIHRoZQorICAgKiByaWdodCB2YWx1ZXMgaW4gdGhlIHNlZ21lbnQgdG8gcGVyZm9ybSB0aGUgc2VlayAqLworICBpZiAoZXZlbnQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJjb25maWd1cmluZyBzZWVrIik7CisgICAgZ3N0X3NlZ21lbnRfZG9fc2VlayAoJnNlZWtzZWdtZW50LCByYXRlLCBmb3JtYXQsIGZsYWdzLAorICAgICAgICBjdXJfdHlwZSwgY3VyLCBzdG9wX3R5cGUsIHN0b3AsICZ1cGRhdGUpOworICB9CisKKyAgLyogZmlndXJlIG91dCB0aGUgbGFzdCBwb3NpdGlvbiB3ZSBuZWVkIHRvIHBsYXkuIElmIGl0J3MgY29uZmlndXJlZCAoc3RvcCAhPQorICAgKiAtMSksIHVzZSB0aGF0LCBlbHNlIHdlIHBsYXkgdW50aWwgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBmaWxlICovCisgIGlmICgoc3RvcCA9IHNlZWtzZWdtZW50LnN0b3ApID09IC0xKQorICAgIHN0b3AgPSBzZWVrc2VnbWVudC5kdXJhdGlvbjsKKworICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJjdXJfdHlwZSA9JWQiLCBjdXJfdHlwZSk7CisgIGlmICgoY3VyX3R5cGUgIT0gR1NUX1NFRUtfVFlQRV9OT05FKSkgeworICAgIC8qIGJyaW5nIG9mZnNldCB0byBieXRlcywgaWYgdGhlIGJwcyBpcyAwLCB3ZSBoYXZlIHRoZSBzZWdtZW50IGluIEJZVEVTIGFuZAorICAgICAqIHdlIGNhbiBqdXN0IGNvcHkgdGhlIGxhc3Rfc3RvcC4gSWYgbm90LCB3ZSB1c2UgdGhlIGJwcyB0byBjb252ZXJ0IFRJTUUgdG8KKyAgICAgKiBieXRlcy4gKi8KKyAgICBpZiAoIWdzdF93YXZwYXJzZV90aW1lX3RvX2J5dGVwb3MgKHdhdiwgc2Vla3NlZ21lbnQucG9zaXRpb24sCisgICAgICAgICAgICAoZ2ludDY0ICopICYgd2F2LT5vZmZzZXQpKQorICAgICAgd2F2LT5vZmZzZXQgPSBzZWVrc2VnbWVudC5wb3NpdGlvbjsKKyAgICBHU1RfTE9HX09CSkVDVCAod2F2LCAib2Zmc2V0PSUiIEdfR1VJTlQ2NF9GT1JNQVQsIHdhdi0+b2Zmc2V0KTsKKyAgICB3YXYtPm9mZnNldCAtPSAod2F2LT5vZmZzZXQgJSB3YXYtPmJ5dGVzX3Blcl9zYW1wbGUpOworICAgIEdTVF9MT0dfT0JKRUNUICh3YXYsICJvZmZzZXQ9JSIgR19HVUlOVDY0X0ZPUk1BVCwgd2F2LT5vZmZzZXQpOworICAgIHdhdi0+b2Zmc2V0ICs9IHdhdi0+ZGF0YXN0YXJ0OworICAgIEdTVF9MT0dfT0JKRUNUICh3YXYsICJvZmZzZXQ9JSIgR19HVUlOVDY0X0ZPUk1BVCwgd2F2LT5vZmZzZXQpOworICB9IGVsc2UgeworICAgIEdTVF9MT0dfT0JKRUNUICh3YXYsICJjb250aW51ZSBmcm9tIG9mZnNldD0lIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICB3YXYtPm9mZnNldCk7CisgIH0KKworICBpZiAoc3RvcF90eXBlICE9IEdTVF9TRUVLX1RZUEVfTk9ORSkgeworICAgIGlmICghZ3N0X3dhdnBhcnNlX3RpbWVfdG9fYnl0ZXBvcyAod2F2LCBzdG9wLCAoZ2ludDY0ICopICYgd2F2LT5lbmRfb2Zmc2V0KSkKKyAgICAgIHdhdi0+ZW5kX29mZnNldCA9IHN0b3A7CisgICAgR1NUX0xPR19PQkpFQ1QgKHdhdiwgImVuZF9vZmZzZXQ9JSIgR19HVUlOVDY0X0ZPUk1BVCwgd2F2LT5lbmRfb2Zmc2V0KTsKKyAgICB3YXYtPmVuZF9vZmZzZXQgLT0gKHdhdi0+ZW5kX29mZnNldCAlIHdhdi0+Ynl0ZXNfcGVyX3NhbXBsZSk7CisgICAgR1NUX0xPR19PQkpFQ1QgKHdhdiwgImVuZF9vZmZzZXQ9JSIgR19HVUlOVDY0X0ZPUk1BVCwgd2F2LT5lbmRfb2Zmc2V0KTsKKyAgICB3YXYtPmVuZF9vZmZzZXQgKz0gd2F2LT5kYXRhc3RhcnQ7CisgICAgR1NUX0xPR19PQkpFQ1QgKHdhdiwgImVuZF9vZmZzZXQ9JSIgR19HVUlOVDY0X0ZPUk1BVCwgd2F2LT5lbmRfb2Zmc2V0KTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfTE9HX09CSkVDVCAod2F2LCAiY29udGludWUgdG8gZW5kX29mZnNldD0lIiBHX0dVSU5UNjRfRk9STUFULAorICAgICAgICB3YXYtPmVuZF9vZmZzZXQpOworICB9CisKKyAgLyogbWFrZSBzdXJlIGZpbGVzaXplIGlzIG5vdCBleGNlZWRlZCBkdWUgdG8gcm91bmRpbmcgZXJyb3JzIG9yIHNvLAorICAgKiBzYW1lIHByZWNhdXRpb24gYXMgaW4gX3N0cmVhbV9oZWFkZXJzICovCisgIGJmb3JtYXQgPSBHU1RfRk9STUFUX0JZVEVTOworICBpZiAoZ3N0X3BhZF9wZWVyX3F1ZXJ5X2R1cmF0aW9uICh3YXYtPnNpbmtwYWQsIGJmb3JtYXQsICZ1cHN0cmVhbV9zaXplKSkKKyAgICB3YXYtPmVuZF9vZmZzZXQgPSBNSU4gKHdhdi0+ZW5kX29mZnNldCwgdXBzdHJlYW1fc2l6ZSk7CisKKyAgaWYgKHdhdi0+ZGF0YXNpemUgPiAwICYmIHdhdi0+ZW5kX29mZnNldCA+IHdhdi0+ZGF0YXN0YXJ0ICsgd2F2LT5kYXRhc2l6ZSkKKyAgICB3YXYtPmVuZF9vZmZzZXQgPSB3YXYtPmRhdGFzdGFydCArIHdhdi0+ZGF0YXNpemU7CisKKyAgLyogdGhpcyBpcyB0aGUgcmFuZ2Ugb2YgYnl0ZXMgd2Ugd2lsbCB1c2UgZm9yIHBsYXliYWNrICovCisgIHdhdi0+b2Zmc2V0ID0gTUlOICh3YXYtPm9mZnNldCwgd2F2LT5lbmRfb2Zmc2V0KTsKKyAgd2F2LT5kYXRhbGVmdCA9IHdhdi0+ZW5kX29mZnNldCAtIHdhdi0+b2Zmc2V0OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwKKyAgICAgICJzZWVrOiByYXRlICVsZiwgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgZW5kICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICIsIHNlZ21lbnQgJSIgR1NUX1RJTUVfRk9STUFUICIgLS0gJSIgR1NUX1RJTUVfRk9STUFULCByYXRlLCB3YXYtPm9mZnNldCwKKyAgICAgIHdhdi0+ZW5kX29mZnNldCwgR1NUX1RJTUVfQVJHUyAoc2Vla3NlZ21lbnQuc3RhcnQpLCBHU1RfVElNRV9BUkdTIChzdG9wKSk7CisKKyAgLyogcHJlcGFyZSBmb3Igc3RyZWFtaW5nIGFnYWluICovCisgIGlmIChmbHVzaCkgeworICAgIEdzdEV2ZW50ICpmZXZlbnQ7CisKKyAgICAvKiBpZiB3ZSBzZW50IGEgRkxVU0hfU1RBUlQsIHdlIG5vdyBzZW5kIGEgRkxVU0hfU1RPUCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgInNlbmRpbmcgZmx1c2ggc3RvcCIpOworCisgICAgZmV2ZW50ID0gZ3N0X2V2ZW50X25ld19mbHVzaF9zdG9wIChUUlVFKTsKKyAgICBnc3RfZXZlbnRfc2V0X3NlcW51bSAoZmV2ZW50LCBzZXFudW0pOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAod2F2LT5zaW5rcGFkLCBnc3RfZXZlbnRfcmVmIChmZXZlbnQpKTsKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHdhdi0+c3JjcGFkLCBmZXZlbnQpOworICB9CisKKyAgLyogbm93IHdlIGRpZCB0aGUgc2VlayBhbmQgY2FuIGFjdGl2YXRlIHRoZSBuZXcgc2VnbWVudCB2YWx1ZXMgKi8KKyAgbWVtY3B5ICgmd2F2LT5zZWdtZW50LCAmc2Vla3NlZ21lbnQsIHNpemVvZiAoR3N0U2VnbWVudCkpOworCisgIC8qIGlmIHdlJ3JlIGRvaW5nIGEgc2VnbWVudCBzZWVrLCBwb3N0IGEgU0VHTUVOVF9TVEFSVCBtZXNzYWdlICovCisgIGlmICh3YXYtPnNlZ21lbnQuZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NFR01FTlQpIHsKKyAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHdhdiksCisgICAgICAgIGdzdF9tZXNzYWdlX25ld19zZWdtZW50X3N0YXJ0IChHU1RfT0JKRUNUX0NBU1QgKHdhdiksCisgICAgICAgICAgICB3YXYtPnNlZ21lbnQuZm9ybWF0LCB3YXYtPnNlZ21lbnQucG9zaXRpb24pKTsKKyAgfQorCisgIC8qIG5vdyBjcmVhdGUgdGhlIG5ld3NlZ21lbnQgKi8KKyAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiQ3JlYXRpbmcgbmV3c2VnbWVudCBmcm9tICUiIEdfR0lOVDY0X0ZPUk1BVAorICAgICAgIiB0byAlIiBHX0dJTlQ2NF9GT1JNQVQsIHdhdi0+c2VnbWVudC5wb3NpdGlvbiwgc3RvcCk7CisKKyAgLyogc3RvcmUgdGhlIG5ld3NlZ21lbnQgZXZlbnQgc28gaXQgY2FuIGJlIHNlbnQgZnJvbSB0aGUgc3RyZWFtaW5nIHRocmVhZC4gKi8KKyAgaWYgKHdhdi0+c3RhcnRfc2VnbWVudCkKKyAgICBnc3RfZXZlbnRfdW5yZWYgKHdhdi0+c3RhcnRfc2VnbWVudCk7CisgIHdhdi0+c3RhcnRfc2VnbWVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJndhdi0+c2VnbWVudCk7CisgIGdzdF9ldmVudF9zZXRfc2VxbnVtICh3YXYtPnN0YXJ0X3NlZ21lbnQsIHNlcW51bSk7CisKKyAgLyogbWFyayBkaXNjb250IGlmIHdlIGFyZSBnb2luZyB0byBzdHJlYW0gZnJvbSBhbm90aGVyIHBvc2l0aW9uLiAqLworICBpZiAobGFzdF9zdG9wICE9IHdhdi0+c2VnbWVudC5wb3NpdGlvbikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgIm1hcmsgRElTQ09OVCwgd2UgZGlkIGEgc2VlayB0byBhbm90aGVyIHBvc2l0aW9uIik7CisgICAgd2F2LT5kaXNjb250ID0gVFJVRTsKKyAgfQorCisgIC8qIGFuZCBzdGFydCB0aGUgc3RyZWFtaW5nIHRhc2sgYWdhaW4gKi8KKyAgaWYgKCF3YXYtPnN0cmVhbWluZykgeworICAgIGdzdF9wYWRfc3RhcnRfdGFzayAod2F2LT5zaW5rcGFkLCAoR3N0VGFza0Z1bmN0aW9uKSBnc3Rfd2F2cGFyc2VfbG9vcCwKKyAgICAgICAgd2F2LT5zaW5rcGFkLCBOVUxMKTsKKyAgfQorCisgIEdTVF9QQURfU1RSRUFNX1VOTE9DSyAod2F2LT5zaW5rcGFkKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK25lZ2F0aXZlX3JhdGU6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJuZWdhdGl2ZSBwbGF5YmFjayByYXRlcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19mb3JtYXQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJ1bnN1cHBvcnRlZCBmb3JtYXQgZ2l2ZW4sIHNlZWsgYWJvcnRlZC4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK25vX3Bvc2l0aW9uOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LAorICAgICAgICAiQ291bGQgbm90IGRldGVybWluZSBieXRlIHBvc2l0aW9uIGZvciBkZXNpcmVkIHRpbWUiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyoKKyAqIGdzdF93YXZwYXJzZV9wZWVrX2NodW5rX2luZm86CisgKiBAd2F2IFdhdnBhcnNlIG9iamVjdAorICogQHRhZyBob2xkZXIgZm9yIHRhZworICogQHNpemUgaG9sZGVyIGZvciB0YWcgc2l6ZQorICoKKyAqIFBlZWsgbmV4dCBjaHVuayBpbmZvICh0YWcgYW5kIHNpemUpCisgKgorICogUmV0dXJuczogJVRSVUUgd2hlbiB0aGUgY2h1bmsgaW5mbyAoaGVhZGVyKSBpcyBhdmFpbGFibGUKKyAqLworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2cGFyc2VfcGVla19jaHVua19pbmZvIChHc3RXYXZQYXJzZSAqIHdhdiwgZ3VpbnQzMiAqIHRhZywgZ3VpbnQzMiAqIHNpemUpCit7CisgIGNvbnN0IGd1aW50OCAqZGF0YSA9IE5VTEw7CisKKyAgaWYgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAod2F2LT5hZGFwdGVyKSA8IDgpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGRhdGEgPSBnc3RfYWRhcHRlcl9tYXAgKHdhdi0+YWRhcHRlciwgOCk7CisgICp0YWcgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEpOworICAqc2l6ZSA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDQpOworICBnc3RfYWRhcHRlcl91bm1hcCAod2F2LT5hZGFwdGVyKTsKKworICBHU1RfREVCVUcgKCJOZXh0IGNodW5rIHNpemUgaXMgJXUgYnl0ZXMsIHR5cGUgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsICpzaXplLAorICAgICAgR1NUX0ZPVVJDQ19BUkdTICgqdGFnKSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBnc3Rfd2F2cGFyc2VfcGVla19jaHVuazoKKyAqIEB3YXYgV2F2cGFyc2Ugb2JqZWN0CisgKiBAdGFnIGhvbGRlciBmb3IgdGFnCisgKiBAc2l6ZSBob2xkZXIgZm9yIHRhZyBzaXplCisgKgorICogUGVlayBlbm91Z2ggZGF0YSBmb3Igb25lIGZ1bGwgY2h1bmsKKyAqCisgKiBSZXR1cm5zOiAlVFJVRSB3aGVuIHRoZSBmdWxsIGNodW5rIGlzIGF2YWlsYWJsZQorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYXJzZV9wZWVrX2NodW5rIChHc3RXYXZQYXJzZSAqIHdhdiwgZ3VpbnQzMiAqIHRhZywgZ3VpbnQzMiAqIHNpemUpCit7CisgIGd1aW50MzIgcGVla19zaXplID0gMDsKKyAgZ3VpbnQgYXZhaWxhYmxlOworCisgIGlmICghZ3N0X3dhdnBhcnNlX3BlZWtfY2h1bmtfaW5mbyAod2F2LCB0YWcsIHNpemUpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBzaXplIDAgLT4gZW1wdHkgZGF0YSBidWZmZXIgd291bGQgc3VycHJpc2UgbW9zdCBjYWxsZXJzLAorICAgKiBsYXJnZSBzaXplIC0+IGRvIG5vdCBib3RoZXIgdHJ5aW5nIHRvIHNxdWVlemUgdGhhdCBpbnRvIGFkYXB0ZXIsCisgICAqIHNvIHdlIHRocm93IHBvb3IgbWFuJ3MgZXhjZXB0aW9uLCB3aGljaCBjYW4gYmUgY2F1Z2h0IGlmIGNhbGxlciByZWFsbHkKKyAgICogd2FudHMgdG8gaGFuZGxlIDAgc2l6ZSBjaHVuayAqLworICBpZiAoISgqc2l6ZSkgfHwgKCpzaXplKSA+PSAoMSA8PCAzMCkpIHsKKyAgICBHU1RfSU5GTyAoIkludmFsaWQvdW5leHBlY3RlZCBjaHVuayBzaXplICV1IGZvciB0YWcgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICpzaXplLCBHU1RfRk9VUkNDX0FSR1MgKCp0YWcpKTsKKyAgICAvKiBjaGFpbiBzaG91bGQgZ2l2ZSB1cCAqLworICAgIHdhdi0+YWJvcnRfYnVmZmVyaW5nID0gVFJVRTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcGVla19zaXplID0gKCpzaXplICsgMSkgJiB+MTsKKyAgYXZhaWxhYmxlID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlICh3YXYtPmFkYXB0ZXIpOworCisgIGlmIChhdmFpbGFibGUgPj0gKDggKyBwZWVrX3NpemUpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0gZWxzZSB7CisgICAgR1NUX0xPRyAoImJ1dCBvbmx5ICV1IGJ5dGVzIGF2YWlsYWJsZSBub3ciLCBhdmFpbGFibGUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKgorICogZ3N0X3dhdnBhcnNlX2NhbGN1bGF0ZV9kdXJhdGlvbjoKKyAqIEB3YXY6IHdhdnBhcnNlIG9iamVjdAorICoKKyAqIENhbGN1bGF0ZSBkdXJhdGlvbiBvbiBkZW1hbmQgYW5kIHN0b3JlIGluIEB3YXYuIFByZWZlciBicHMsIGJ1dCB1c2UgZmFjdCBhcyBhCisgKiBmYWxsYmFjay4KKyAqCisgKiBSZXR1cm5zOiAlVFJVRSBpZiBkdXJhdGlvbiBpcyBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhcnNlX2NhbGN1bGF0ZV9kdXJhdGlvbiAoR3N0V2F2UGFyc2UgKiB3YXYpCit7CisgIGlmICh3YXYtPmR1cmF0aW9uID4gMCkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAod2F2LT5icHMgPiAwKSB7CisgICAgR1NUX0lORk9fT0JKRUNUICh3YXYsICJHb3QgZGF0YXNpemUgJSIgR19HVUlOVDY0X0ZPUk1BVCwgd2F2LT5kYXRhc2l6ZSk7CisgICAgd2F2LT5kdXJhdGlvbiA9CisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9jZWlsICh3YXYtPmRhdGFzaXplLCBHU1RfU0VDT05ELAorICAgICAgICAoZ3VpbnQ2NCkgd2F2LT5icHMpOworICAgIEdTVF9JTkZPX09CSkVDVCAod2F2LCAiR290IGR1cmF0aW9uIChicHMpICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAod2F2LT5kdXJhdGlvbikpOworICAgIHJldHVybiBUUlVFOworICB9IGVsc2UgaWYgKHdhdi0+ZmFjdCkgeworICAgIHdhdi0+ZHVyYXRpb24gPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfY2VpbCAoR1NUX1NFQ09ORCwgd2F2LT5mYWN0LCB3YXYtPnJhdGUpOworICAgIEdTVF9JTkZPX09CSkVDVCAod2F2LCAiR290IGR1cmF0aW9uIChmYWN0KSAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHdhdi0+ZHVyYXRpb24pKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdmVwYXJzZV9pZ25vcmVfY2h1bmsgKEdzdFdhdlBhcnNlICogd2F2LCBHc3RCdWZmZXIgKiBidWYsIGd1aW50MzIgdGFnLAorICAgIGd1aW50MzIgc2l6ZSkKK3sKKyAgZ3VpbnQgZmx1c2g7CisKKyAgaWYgKHdhdi0+c3RyZWFtaW5nKSB7CisgICAgaWYgKCFnc3Rfd2F2cGFyc2VfcGVla19jaHVuayAod2F2LCAmdGFnLCAmc2l6ZSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiSWdub3JpbmcgdGFnICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgR1NUX0ZPVVJDQ19BUkdTICh0YWcpKTsKKyAgZmx1c2ggPSA4ICsgKChzaXplICsgMSkgJiB+MSk7CisgIHdhdi0+b2Zmc2V0ICs9IGZsdXNoOworICBpZiAod2F2LT5zdHJlYW1pbmcpIHsKKyAgICBnc3RfYWRhcHRlcl9mbHVzaCAod2F2LT5hZGFwdGVyLCBmbHVzaCk7CisgIH0gZWxzZSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKgorICogZ3N0X3dhdnBhcnNlX2N1ZV9jaHVuazoKKyAqIEB3YXYgR3N0V2F2UGFyc2Ugb2JqZWN0CisgKiBAZGF0YSBob2xkZXIgZm9yIGRhdGEKKyAqIEBzaXplIGhvbGRlciBmb3IgZGF0YSBzaXplCisgKgorICogUGFyc2UgY3VlIGNodW5rIGZyb20gQGRhdGEgdG8gd2F2LT5jdWVzLgorICoKKyAqIFJldHVybnM6ICVUUlVFIHdoZW4gY3VlIGNodW5rIGlzIGF2YWlsYWJsZQorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYXJzZV9jdWVfY2h1bmsgKEdzdFdhdlBhcnNlICogd2F2LCBjb25zdCBndWludDggKiBkYXRhLCBndWludDMyIHNpemUpCit7CisgIGd1aW50MzIgaSwgbmN1ZXM7CisgIEdMaXN0ICpjdWVzID0gTlVMTDsKKyAgR3N0V2F2UGFyc2VDdWUgKmN1ZTsKKworICBpZiAod2F2LT5jdWVzKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh3YXYsICJmb3VuZCBhbm90aGVyIGN1ZSdzIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBuY3VlcyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSk7CisKKyAgaWYgKHNpemUgPCA0ICsgbmN1ZXMgKiAyNCkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2LCAiYnJva2VuIGZpbGUgJWQgJWQiLCBzaXplLCBuY3Vlcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogcGFyc2UgZGF0YSAqLworICBkYXRhICs9IDQ7CisgIGZvciAoaSA9IDA7IGkgPCBuY3VlczsgaSsrKSB7CisgICAgY3VlID0gZ19uZXcwIChHc3RXYXZQYXJzZUN1ZSwgMSk7CisgICAgY3VlLT5pZCA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSk7CisgICAgY3VlLT5wb3NpdGlvbiA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDQpOworICAgIGN1ZS0+ZGF0YV9jaHVua19pZCA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDgpOworICAgIGN1ZS0+Y2h1bmtfc3RhcnQgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEgKyAxMik7CisgICAgY3VlLT5ibG9ja19zdGFydCA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDE2KTsKKyAgICBjdWUtPnNhbXBsZV9vZmZzZXQgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEgKyAyMCk7CisgICAgY3VlcyA9IGdfbGlzdF9hcHBlbmQgKGN1ZXMsIGN1ZSk7CisgICAgZGF0YSArPSAyNDsKKyAgfQorCisgIHdhdi0+Y3VlcyA9IGN1ZXM7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBnc3Rfd2F2cGFyc2VfbGFibF9jaHVuazoKKyAqIEB3YXYgR3N0V2F2UGFyc2Ugb2JqZWN0CisgKiBAZGF0YSBob2xkZXIgZm9yIGRhdGEKKyAqIEBzaXplIGhvbGRlciBmb3IgZGF0YSBzaXplCisgKgorICogUGFyc2UgbGFibCBmcm9tIEBkYXRhIHRvIHdhdi0+bGFibHMuCisgKgorICogUmV0dXJuczogJVRSVUUgd2hlbiBsYWJsIGNodW5rIGlzIGF2YWlsYWJsZQorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYXJzZV9sYWJsX2NodW5rIChHc3RXYXZQYXJzZSAqIHdhdiwgY29uc3QgZ3VpbnQ4ICogZGF0YSwgZ3VpbnQzMiBzaXplKQoreworICBHc3RXYXZQYXJzZUxhYmwgKmxhYmw7CisKKyAgaWYgKHNpemUgPCA1KQorICAgIHJldHVybiBGQUxTRTsKKworICBsYWJsID0gZ19uZXcwIChHc3RXYXZQYXJzZUxhYmwsIDEpOworCisgIC8qIHBhcnNlIGRhdGEgKi8KKyAgZGF0YSArPSA4OworICBsYWJsLT5jdWVfcG9pbnRfaWQgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEpOworICBsYWJsLT50ZXh0ID0gZ19tZW1kdXAgKGRhdGEgKyA0LCBzaXplIC0gNCk7CisKKyAgd2F2LT5sYWJscyA9IGdfbGlzdF9hcHBlbmQgKHdhdi0+bGFibHMsIGxhYmwpOworCisgIHJldHVybiBUUlVFOworfQorCisvKgorICogZ3N0X3dhdnBhcnNlX25vdGVfY2h1bms6CisgKiBAd2F2IEdzdFdhdlBhcnNlIG9iamVjdAorICogQGRhdGEgaG9sZGVyIGZvciBkYXRhCisgKiBAc2l6ZSBob2xkZXIgZm9yIGRhdGEgc2l6ZQorICoKKyAqIFBhcnNlIG5vdGUgZnJvbSBAZGF0YSB0byB3YXYtPm5vdGVzLgorICoKKyAqIFJldHVybnM6ICVUUlVFIHdoZW4gbm90ZSBjaHVuayBpcyBhdmFpbGFibGUKKyAqLworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2cGFyc2Vfbm90ZV9jaHVuayAoR3N0V2F2UGFyc2UgKiB3YXYsIGNvbnN0IGd1aW50OCAqIGRhdGEsIGd1aW50MzIgc2l6ZSkKK3sKKyAgR3N0V2F2UGFyc2VOb3RlICpub3RlOworCisgIGlmIChzaXplIDwgNSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbm90ZSA9IGdfbmV3MCAoR3N0V2F2UGFyc2VOb3RlLCAxKTsKKworICAvKiBwYXJzZSBkYXRhICovCisgIGRhdGEgKz0gODsKKyAgbm90ZS0+Y3VlX3BvaW50X2lkID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKyAgbm90ZS0+dGV4dCA9IGdfbWVtZHVwIChkYXRhICsgNCwgc2l6ZSAtIDQpOworCisgIHdhdi0+bm90ZXMgPSBnX2xpc3RfYXBwZW5kICh3YXYtPm5vdGVzLCBub3RlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIGdzdF93YXZwYXJzZV9zbXBsX2NodW5rOgorICogQHdhdiBHc3RXYXZQYXJzZSBvYmplY3QKKyAqIEBkYXRhIGhvbGRlciBmb3IgZGF0YQorICogQHNpemUgaG9sZGVyIGZvciBkYXRhIHNpemUKKyAqCisgKiBQYXJzZSBzbXBsIGNodW5rIGZyb20gQGRhdGEuCisgKgorICogUmV0dXJuczogJVRSVUUgd2hlbiBjdWUgY2h1bmsgaXMgYXZhaWxhYmxlCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhcnNlX3NtcGxfY2h1bmsgKEdzdFdhdlBhcnNlICogd2F2LCBjb25zdCBndWludDggKiBkYXRhLCBndWludDMyIHNpemUpCit7CisgIGd1aW50MzIgbm90ZV9udW1iZXI7CisKKyAgLyoKKyAgICAgbWFudWZhY3R1cmVyX2lkID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhKTsKKyAgICAgcHJvZHVjdF9pZCA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDQpOworICAgICBzYW1wbGVfcGVyaW9kID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhICsgOCk7CisgICAqLworICBub3RlX251bWJlciA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDEyKTsKKyAgLyoKKyAgICAgcGl0Y2hfZnJhY3Rpb24gPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEgKyAxNik7CisgICAgIFNNUFRFX2Zvcm1hdCA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDIwKTsKKyAgICAgU01QVEVfb2Zmc2V0ID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhICsgMjQpOworICAgICBudW1fc2FtcGxlX2xvb3BzID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhICsgMjgpOworICAgICBMaXN0IG9mIFNhbXBsZSBMb29wcywgMjQgYnl0ZXMgZWFjaAorICAgKi8KKworICBpZiAoIXdhdi0+dGFncykKKyAgICB3YXYtPnRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3RfYWRkICh3YXYtPnRhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgIEdTVF9UQUdfTUlESV9CQVNFX05PVEUsIChndWludCkgbm90ZV9udW1iZXIsIE5VTEwpOworICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIGdzdF93YXZwYXJzZV9hZHRsX2NodW5rOgorICogQHdhdiBHc3RXYXZQYXJzZSBvYmplY3QKKyAqIEBkYXRhIGhvbGRlciBmb3IgZGF0YQorICogQHNpemUgaG9sZGVyIGZvciBkYXRhIHNpemUKKyAqCisgKiBQYXJzZSBhZHRsIGZyb20gQGRhdGEuCisgKgorICogUmV0dXJuczogJVRSVUUgd2hlbiBhZHRsIGNodW5rIGlzIGF2YWlsYWJsZQorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYXJzZV9hZHRsX2NodW5rIChHc3RXYXZQYXJzZSAqIHdhdiwgY29uc3QgZ3VpbnQ4ICogZGF0YSwgZ3VpbnQzMiBzaXplKQoreworICBndWludDMyIGx0YWcsIGxzaXplLCBvZmZzZXQgPSAwOworCisgIHdoaWxlIChzaXplID49IDgpIHsKKyAgICBsdGFnID0gR1NUX1JFQURfVUlOVDMyX0xFIChkYXRhICsgb2Zmc2V0KTsKKyAgICBsc2l6ZSA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIG9mZnNldCArIDQpOworCisgICAgaWYgKGxzaXplICsgOCA+IHNpemUpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2LCAiSW52YWxpZCBhZHRsIHNpemU6ICV1ICsgOCA+ICV1IiwgbHNpemUsIHNpemUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAobHRhZykgeworICAgICAgY2FzZSBHU1RfUklGRl9UQUdfbGFibDoKKyAgICAgICAgZ3N0X3dhdnBhcnNlX2xhYmxfY2h1bmsgKHdhdiwgZGF0YSArIG9mZnNldCwgc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfUklGRl9UQUdfbm90ZToKKyAgICAgICAgZ3N0X3dhdnBhcnNlX25vdGVfY2h1bmsgKHdhdiwgZGF0YSArIG9mZnNldCwgc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh3YXYsICJVbmtub3dtIGFkdGwgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGx0YWcpKTsKKyAgICAgICAgR1NUX01FTURVTVBfT0JKRUNUICh3YXYsICJVbmtub3dtIGFkdGwiLCAmZGF0YVtvZmZzZXRdLCBsc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBvZmZzZXQgKz0gOCArIEdTVF9ST1VORF9VUF8yIChsc2l6ZSk7CisgICAgc2l6ZSAtPSA4ICsgR1NUX1JPVU5EX1VQXzIgKGxzaXplKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0VGFnTGlzdCAqCitnc3Rfd2F2cGFyc2VfZ2V0X3RhZ3NfdG9jX2VudHJ5IChHc3RUb2MgKiB0b2MsIGdjaGFyICogaWQpCit7CisgIEdzdFRhZ0xpc3QgKnRhZ3MgPSBOVUxMOworICBHc3RUb2NFbnRyeSAqZW50cnkgPSBOVUxMOworCisgIGVudHJ5ID0gZ3N0X3RvY19maW5kX2VudHJ5ICh0b2MsIGlkKTsKKyAgaWYgKGVudHJ5ICE9IE5VTEwpIHsKKyAgICB0YWdzID0gZ3N0X3RvY19lbnRyeV9nZXRfdGFncyAoZW50cnkpOworICAgIGlmICh0YWdzID09IE5VTEwpIHsKKyAgICAgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgICAgZ3N0X3RvY19lbnRyeV9zZXRfdGFncyAoZW50cnksIHRhZ3MpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0YWdzOworfQorCisvKgorICogZ3N0X3dhdnBhcnNlX2NyZWF0ZV90b2M6CisgKiBAd2F2IEdzdFdhdlBhcnNlIG9iamVjdAorICoKKyAqIENyZWF0ZSBUT0MgZnJvbSB3YXYtPmN1ZXMgYW5kIHdhdi0+bGFibHMuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhcnNlX2NyZWF0ZV90b2MgKEdzdFdhdlBhcnNlICogd2F2KQoreworICBnaW50NjQgc3RhcnQsIHN0b3A7CisgIGdjaGFyICppZDsKKyAgR0xpc3QgKmxpc3Q7CisgIEdzdFdhdlBhcnNlQ3VlICpjdWU7CisgIEdzdFdhdlBhcnNlTGFibCAqbGFibDsKKyAgR3N0V2F2UGFyc2VOb3RlICpub3RlOworICBHc3RUYWdMaXN0ICp0YWdzOworICBHc3RUb2MgKnRvYzsKKyAgR3N0VG9jRW50cnkgKmVudHJ5ID0gTlVMTCwgKmN1cl9zdWJlbnRyeSA9IE5VTEwsICpwcmV2X3N1YmVudHJ5ID0gTlVMTDsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHdhdik7CisgIGlmICh3YXYtPnRvYykgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLICh3YXYpOworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2LCAiZm91bmQgYW5vdGhlciBUT0MiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoIXdhdi0+Y3VlcykgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLICh3YXYpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgLyogRklYTUU6IHNlbmQgQ1VSUkVOVCBzY29wZSB0b2MgdG9vICovCisgIHRvYyA9IGdzdF90b2NfbmV3IChHU1RfVE9DX1NDT1BFX0dMT0JBTCk7CisKKyAgLyogYWRkIGN1ZSBlZGl0aW9uICovCisgIGVudHJ5ID0gZ3N0X3RvY19lbnRyeV9uZXcgKEdTVF9UT0NfRU5UUllfVFlQRV9FRElUSU9OLCAiY3VlIik7CisgIGdzdF90b2NfZW50cnlfc2V0X3N0YXJ0X3N0b3BfdGltZXMgKGVudHJ5LCAwLCB3YXYtPmR1cmF0aW9uKTsKKyAgZ3N0X3RvY19hcHBlbmRfZW50cnkgKHRvYywgZW50cnkpOworCisgIC8qIGFkZCB0cmFja3MgaW4gY3VlIGVkaXRpb24gKi8KKyAgbGlzdCA9IHdhdi0+Y3VlczsKKyAgd2hpbGUgKGxpc3QpIHsKKyAgICBjdWUgPSBsaXN0LT5kYXRhOworICAgIHByZXZfc3ViZW50cnkgPSBjdXJfc3ViZW50cnk7CisgICAgLyogcHJldmlvdXMgdHJhY2sgc3RvcCB0aW1lID0gY3VycmVudCB0cmFjayBzdGFydCB0aW1lICovCisgICAgaWYgKHByZXZfc3ViZW50cnkgIT0gTlVMTCkgeworICAgICAgZ3N0X3RvY19lbnRyeV9nZXRfc3RhcnRfc3RvcF90aW1lcyAocHJldl9zdWJlbnRyeSwgJnN0YXJ0LCBOVUxMKTsKKyAgICAgIHN0b3AgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfcm91bmQgKGN1ZS0+cG9zaXRpb24sIEdTVF9TRUNPTkQsIHdhdi0+cmF0ZSk7CisgICAgICBnc3RfdG9jX2VudHJ5X3NldF9zdGFydF9zdG9wX3RpbWVzIChwcmV2X3N1YmVudHJ5LCBzdGFydCwgc3RvcCk7CisgICAgfQorICAgIGlkID0gZ19zdHJkdXBfcHJpbnRmICgiJTA4eCIsIGN1ZS0+aWQpOworICAgIGN1cl9zdWJlbnRyeSA9IGdzdF90b2NfZW50cnlfbmV3IChHU1RfVE9DX0VOVFJZX1RZUEVfVFJBQ0ssIGlkKTsKKyAgICBnX2ZyZWUgKGlkKTsKKyAgICBzdGFydCA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAoY3VlLT5wb3NpdGlvbiwgR1NUX1NFQ09ORCwgd2F2LT5yYXRlKTsKKyAgICBzdG9wID0gd2F2LT5kdXJhdGlvbjsKKyAgICBnc3RfdG9jX2VudHJ5X3NldF9zdGFydF9zdG9wX3RpbWVzIChjdXJfc3ViZW50cnksIHN0YXJ0LCBzdG9wKTsKKyAgICBnc3RfdG9jX2VudHJ5X2FwcGVuZF9zdWJfZW50cnkgKGVudHJ5LCBjdXJfc3ViZW50cnkpOworICAgIGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCk7CisgIH0KKworICAvKiBhZGQgdGFncyBpbiB0cmFja3MgKi8KKyAgbGlzdCA9IHdhdi0+bGFibHM7CisgIHdoaWxlIChsaXN0KSB7CisgICAgbGFibCA9IGxpc3QtPmRhdGE7CisgICAgaWQgPSBnX3N0cmR1cF9wcmludGYgKCIlMDh4IiwgbGFibC0+Y3VlX3BvaW50X2lkKTsKKyAgICB0YWdzID0gZ3N0X3dhdnBhcnNlX2dldF90YWdzX3RvY19lbnRyeSAodG9jLCBpZCk7CisgICAgZ19mcmVlIChpZCk7CisgICAgaWYgKHRhZ3MgIT0gTlVMTCkgeworICAgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9BUFBFTkQsIEdTVF9UQUdfVElUTEUsIGxhYmwtPnRleHQsCisgICAgICAgICAgTlVMTCk7CisgICAgfQorICAgIGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCk7CisgIH0KKyAgbGlzdCA9IHdhdi0+bm90ZXM7CisgIHdoaWxlIChsaXN0KSB7CisgICAgbm90ZSA9IGxpc3QtPmRhdGE7CisgICAgaWQgPSBnX3N0cmR1cF9wcmludGYgKCIlMDh4Iiwgbm90ZS0+Y3VlX3BvaW50X2lkKTsKKyAgICB0YWdzID0gZ3N0X3dhdnBhcnNlX2dldF90YWdzX3RvY19lbnRyeSAodG9jLCBpZCk7CisgICAgZ19mcmVlIChpZCk7CisgICAgaWYgKHRhZ3MgIT0gTlVMTCkgeworICAgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9QUkVQRU5ELCBHU1RfVEFHX0NPTU1FTlQsCisgICAgICAgICAgbm90ZS0+dGV4dCwgTlVMTCk7CisgICAgfQorICAgIGxpc3QgPSBnX2xpc3RfbmV4dCAobGlzdCk7CisgIH0KKworICAvKiBzZW5kIGRhdGEgYXMgVE9DICovCisgIHdhdi0+dG9jID0gdG9jOworCisgIC8qIHNlbmQgVE9DIGV2ZW50ICovCisgIGlmICh3YXYtPnRvYykgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLICh3YXYpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAod2F2LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfdG9jICh3YXYtPnRvYywgRkFMU0UpKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjZGVmaW5lIE1BWF9CVUZGRVJfU0laRSA0MDk2CisKK3N0YXRpYyBnYm9vbGVhbgorcGFyc2VfZHM2NCAoR3N0V2F2UGFyc2UgKiB3YXYsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50MzIgZGF0YVNpemVMb3csIGRhdGFTaXplSGlnaDsKKyAgZ3VpbnQzMiBzYW1wbGVDb3VudExvdywgc2FtcGxlQ291bnRIaWdoOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGFTaXplTG93ID0gR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSArIDIgKiA0KTsKKyAgZGF0YVNpemVIaWdoID0gR1NUX1JFQURfVUlOVDMyX0xFIChtYXAuZGF0YSArIDMgKiA0KTsKKyAgc2FtcGxlQ291bnRMb3cgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKG1hcC5kYXRhICsgNCAqIDQpOworICBzYW1wbGVDb3VudEhpZ2ggPSBHU1RfUkVBRF9VSU5UMzJfTEUgKG1hcC5kYXRhICsgNSAqIDQpOworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICBpZiAoZGF0YVNpemVIaWdoICE9IDB4RkZGRkZGRkYgJiYgZGF0YVNpemVMb3cgIT0gMHhGRkZGRkZGRikgeworICAgIHdhdi0+ZGF0YXNpemUgPSAoKGd1aW50NjQpIGRhdGFTaXplSGlnaCA8PCAzMikgfCBkYXRhU2l6ZUxvdzsKKyAgfQorICBpZiAoc2FtcGxlQ291bnRIaWdoICE9IDB4RkZGRkZGRkYgJiYgc2FtcGxlQ291bnRMb3cgIT0gMHhGRkZGRkZGRikgeworICAgIHdhdi0+ZmFjdCA9ICgoZ3VpbnQ2NCkgc2FtcGxlQ291bnRIaWdoIDw8IDMyKSB8IHNhbXBsZUNvdW50TG93OworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiR290ICdkczY0JyBUQUcsIGRhdGFzaXplIDogJSIgR19HSU5UNjRfRk9STUFUCisgICAgICAiIGZhY3Q6ICUiIEdfR0lOVDY0X0ZPUk1BVCwgd2F2LT5kYXRhc2l6ZSwgd2F2LT5mYWN0KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMgKEdzdFdhdlBhcnNlICogd2F2KQoreworICBHc3RGbG93UmV0dXJuIHJlcyA9IEdTVF9GTE9XX09LOworICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisgIGdzdF9yaWZmX3N0cmZfYXVkcyAqaGVhZGVyID0gTlVMTDsKKyAgZ3VpbnQzMiB0YWcsIHNpemU7CisgIGdib29sZWFuIGdvdGRhdGEgPSBGQUxTRTsKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisgIGdjaGFyICpjb2RlY19uYW1lID0gTlVMTDsKKyAgZ2ludDY0IHVwc3RyZWFtX3NpemUgPSAwOworICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgLyogc2VhcmNoIGZvciAiX2ZtdCIgY2h1bmssIHdoaWNoIG11c3QgYmUgYmVmb3JlICJkYXRhIiAqLworICB3aGlsZSAoIXdhdi0+Z290X2ZtdCkgeworICAgIEdzdEJ1ZmZlciAqZXh0cmE7CisKKyAgICBpZiAod2F2LT5zdHJlYW1pbmcpIHsKKyAgICAgIGlmICghZ3N0X3dhdnBhcnNlX3BlZWtfY2h1bmsgKHdhdiwgJnRhZywgJnNpemUpKQorICAgICAgICByZXR1cm4gcmVzOworCisgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAod2F2LT5hZGFwdGVyLCA4KTsKKyAgICAgIHdhdi0+b2Zmc2V0ICs9IDg7CisKKyAgICAgIGlmIChzaXplKSB7CisgICAgICAgIGJ1ZiA9IGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyICh3YXYtPmFkYXB0ZXIsIHNpemUpOworICAgICAgICBpZiAoc2l6ZSAmIDEpCisgICAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHdhdi0+YWRhcHRlciwgMSk7CisgICAgICAgIHdhdi0+b2Zmc2V0ICs9IEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3ICgpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoKHJlcyA9IGdzdF9yaWZmX3JlYWRfY2h1bmsgKEdTVF9FTEVNRU5UX0NBU1QgKHdhdiksIHdhdi0+c2lua3BhZCwKKyAgICAgICAgICAgICAgICAgICZ3YXYtPm9mZnNldCwgJnRhZywgJmJ1ZikpICE9IEdTVF9GTE9XX09LKQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICh0YWcgPT0gR1NUX1JTNjRfVEFHX0RTNjQpIHsKKyAgICAgIGlmICghcGFyc2VfZHM2NCAod2F2LCBidWYpKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgICBlbHNlCisgICAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmICh0YWcgIT0gR1NUX1JJRkZfVEFHX2ZtdCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAic2tpcHBpbmcgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiBjaHVuayIsCisgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTICh0YWcpKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICBidWYgPSBOVUxMOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKCEoZ3N0X3JpZmZfcGFyc2Vfc3RyZl9hdWRzIChHU1RfRUxFTUVOVF9DQVNUICh3YXYpLCBidWYsICZoZWFkZXIsCisgICAgICAgICAgICAgICAgJmV4dHJhKSkpCisgICAgICBnb3RvIHBhcnNlX2hlYWRlcl9lcnJvcjsKKworICAgIGJ1ZiA9IE5VTEw7ICAgICAgICAgICAgICAgICAvKiBwYXJzZV9zdHJmX2F1ZHMoKSB0b29rIG93bmVyc2hpcCBvZiBidWZmZXIgKi8KKworICAgIC8qIGRvIHNhbml0eSBjaGVja3Mgb2YgaGVhZGVyIGZpZWxkcyAqLworICAgIGlmIChoZWFkZXItPmNoYW5uZWxzID09IDApCisgICAgICBnb3RvIG5vX2NoYW5uZWxzOworICAgIGlmIChoZWFkZXItPnJhdGUgPT0gMCkKKyAgICAgIGdvdG8gbm9fcmF0ZTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgImNyZWF0aW5nIHRoZSBjYXBzIik7CisKKyAgICAvKiBOb3RlOiBnc3RfcmlmZl9jcmVhdGVfYXVkaW9fY2FwcyBtaWdodCBuZWVkIHRvIGZpeCB2YWx1ZXMgaW4KKyAgICAgKiB0aGUgaGVhZGVyIGhlYWRlciBkZXBlbmRpbmcgb24gdGhlIGZvcm1hdCwgc28gY2FsbCBpdCBmaXJzdCAqLworICAgIC8qIEZJWE1FOiBOZWVkIHRvIGhhbmRsZSB0aGUgY2hhbm5lbCByZW9yZGVyIG1hcCAqLworICAgIGNhcHMgPSBnc3RfcmlmZl9jcmVhdGVfYXVkaW9fY2FwcyAoaGVhZGVyLT5mb3JtYXQsIE5VTEwsIGhlYWRlciwgZXh0cmEsCisgICAgICAgIE5VTEwsICZjb2RlY19uYW1lLCBOVUxMKTsKKworICAgIGlmIChleHRyYSkKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGV4dHJhKTsKKworICAgIGlmICghY2FwcykKKyAgICAgIGdvdG8gdW5rbm93bl9mb3JtYXQ7CisKKyAgICAvKiBJZiB3ZSBnb3QgcmF3IGF1ZGlvIGZyb20gdXBzdHJlYW0sIHdlIHJlbW92ZSB0aGUgY29kZWNfZGF0YSBmaWVsZCwKKyAgICAgKiB3aGljaCBtYXkgaGF2ZSBiZWVuIGFkZGVkIGlmIHRoZSB3YXYgaGVhZGVyIGluY2x1ZGVkIGFuIGV4dGVuZGVkCisgICAgICogY2h1bmsuIFdlIHdhbnQgdG8ga2VlcCBpdCBmb3Igbm9uIHJhdyBhdWRpby4KKyAgICAgKi8KKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgICAgaWYgKHMgJiYgZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgImF1ZGlvL3gtcmF3IikpIHsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCAiY29kZWNfZGF0YSIpOworICAgIH0KKworICAgIC8qIGRvIG1vcmUgc2FuaXR5IGNoZWNrcyBvZiBoZWFkZXIgZmllbGRzCisgICAgICogKHRoZXNlIGNhbiBiZSBzYW5pdGl6ZWQgYnkgZ3N0X3JpZmZfY3JlYXRlX2F1ZGlvX2NhcHMoKQorICAgICAqLworICAgIHdhdi0+Zm9ybWF0ID0gaGVhZGVyLT5mb3JtYXQ7CisgICAgd2F2LT5yYXRlID0gaGVhZGVyLT5yYXRlOworICAgIHdhdi0+Y2hhbm5lbHMgPSBoZWFkZXItPmNoYW5uZWxzOworICAgIHdhdi0+YmxvY2thbGlnbiA9IGhlYWRlci0+YmxvY2thbGlnbjsKKyAgICB3YXYtPmRlcHRoID0gaGVhZGVyLT5iaXRzX3Blcl9zYW1wbGU7CisgICAgd2F2LT5hdl9icHMgPSBoZWFkZXItPmF2X2JwczsKKyAgICB3YXYtPnZiciA9IEZBTFNFOworCisgICAgZ19mcmVlIChoZWFkZXIpOworICAgIGhlYWRlciA9IE5VTEw7CisKKyAgICAvKiBkbyBmb3JtYXQgc3BlY2lmaWMgaGFuZGxpbmcgKi8KKyAgICBzd2l0Y2ggKHdhdi0+Zm9ybWF0KSB7CisgICAgICBjYXNlIEdTVF9SSUZGX1dBVkVfRk9STUFUX01QRUdMMTI6CisgICAgICBjYXNlIEdTVF9SSUZGX1dBVkVfRk9STUFUX01QRUdMMzoKKyAgICAgIHsKKyAgICAgICAgLyogTm90ZTogd29ya2Fyb3VuZCBmb3IgbXAyL21wMyBlbWJlZGRlZCBpbiB3YXYsIHRoYXQgcmVsaWVzIG9uIHRoZQorICAgICAgICAgKiBiaXRyYXRlIGluc2lkZSB0aGUgbXBlZyBzdHJlYW0gKi8KKyAgICAgICAgR1NUX0lORk8gKCJyZXNldHRpbmcgYnBzIGZyb20gJXUgdG8gMCBmb3IgbXAyLzMiLCB3YXYtPmF2X2Jwcyk7CisgICAgICAgIHdhdi0+YnBzID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEdTVF9SSUZGX1dBVkVfRk9STUFUX1BDTToKKyAgICAgICAgaWYgKHdhdi0+YmxvY2thbGlnbiA+IHdhdi0+Y2hhbm5lbHMgKiAoKHdhdi0+ZGVwdGggKyA3KSAvIDgpKQorICAgICAgICAgIGdvdG8gaW52YWxpZF9ibG9ja2FsaWduOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICh3YXYtPmF2X2JwcyA+IHdhdi0+YmxvY2thbGlnbiAqIHdhdi0+cmF0ZSkKKyAgICAgICAgICBnb3RvIGludmFsaWRfYnBzOworICAgICAgICAvKiB1c2UgdGhlIGNvbmZpZ3VyZWQgYnBzICovCisgICAgICAgIHdhdi0+YnBzID0gd2F2LT5hdl9icHM7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHdhdi0+d2lkdGggPSAod2F2LT5ibG9ja2FsaWduICogOCkgLyB3YXYtPmNoYW5uZWxzOworICAgIHdhdi0+Ynl0ZXNfcGVyX3NhbXBsZSA9IHdhdi0+Y2hhbm5lbHMgKiB3YXYtPndpZHRoIC8gODsKKworICAgIGlmICh3YXYtPmJ5dGVzX3Blcl9zYW1wbGUgPD0gMCkKKyAgICAgIGdvdG8gbm9fYnl0ZXNfcGVyX3NhbXBsZTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgImJsb2NrYWxpZ24gPSAldSIsIChndWludCkgd2F2LT5ibG9ja2FsaWduKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJ3aWR0aCAgICAgID0gJXUiLCAoZ3VpbnQpIHdhdi0+d2lkdGgpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgImRlcHRoICAgICAgPSAldSIsIChndWludCkgd2F2LT5kZXB0aCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiYXZfYnBzICAgICA9ICV1IiwgKGd1aW50KSB3YXYtPmF2X2Jwcyk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiZnJlcXVlbmN5ICA9ICV1IiwgKGd1aW50KSB3YXYtPnJhdGUpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgImNoYW5uZWxzICAgPSAldSIsIChndWludCkgd2F2LT5jaGFubmVscyk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiYnl0ZXNfcGVyX3NhbXBsZSA9ICV1Iiwgd2F2LT5ieXRlc19wZXJfc2FtcGxlKTsKKworICAgIC8qIGJwcyBjYW4gYmUgMCB3aGVuIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBiaXRyYXRlIChtb3N0bHkgZm9yIGNvbXByZXNzZWQKKyAgICAgKiBmb3JtYXRzKS4gVGhpcyB3aWxsIG1ha2UgdGhlIGVsZW1lbnQgb3V0cHV0IGEgQllURSBmb3JtYXQgc2VnbWVudCBhbmQKKyAgICAgKiB3aWxsIG5vdCB0aW1lc3RhbXAgdGhlIG91dGdvaW5nIGJ1ZmZlcnMuCisgICAgICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiYnBzICAgICAgICA9ICV1IiwgKGd1aW50KSB3YXYtPmJwcyk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJjYXBzID0gJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgICAgLyogY3JlYXRlIHBhZCBsYXRlciBzbyB3ZSBjYW4gc25pZmYgdGhlIGZpcnN0IGZldyBieXRlcworICAgICAqIG9mIHRoZSByZWFsIGRhdGEgYW5kIGNvcnJlY3Qgb3VyIGNhcHMgaWYgbmVjZXNzYXJ5ICovCisgICAgZ3N0X2NhcHNfcmVwbGFjZSAoJndhdi0+Y2FwcywgY2Fwcyk7CisgICAgZ3N0X2NhcHNfcmVwbGFjZSAoJmNhcHMsIE5VTEwpOworCisgICAgd2F2LT5nb3RfZm10ID0gVFJVRTsKKworICAgIGlmICh3YXYtPnRhZ3MgPT0gTlVMTCkKKyAgICAgIHdhdi0+dGFncyA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisKKyAgICB7CisgICAgICBHc3RDYXBzICp0ZW1wbF9jYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHdhdi0+c2lua3BhZCk7CisgICAgICBnc3RfcGJfdXRpbHNfYWRkX2NvZGVjX2Rlc2NyaXB0aW9uX3RvX3RhZ19saXN0ICh3YXYtPnRhZ3MsCisgICAgICAgICAgR1NUX1RBR19DT05UQUlORVJfRk9STUFULCB0ZW1wbF9jYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmICh0ZW1wbF9jYXBzKTsKKyAgICB9CisKKyAgICAvKiBJZiBicHMgaXMgbm9uemVybywgdGhlbiB3ZSBkbyBoYXZlIGEgdmFsaWQgYml0cmF0ZSB0aGF0IGNhbiBiZQorICAgICAqIGFubm91bmNlZCBpbiBhIHRhZyBsaXN0LiAqLworICAgIGlmICh3YXYtPmJwcykgeworICAgICAgZ3VpbnQgYml0cmF0ZSA9IHdhdi0+YnBzICogODsKKyAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHdhdi0+dGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICAgIEdTVF9UQUdfQklUUkFURSwgYml0cmF0ZSwgTlVMTCk7CisgICAgfQorCisgICAgaWYgKGNvZGVjX25hbWUpIHsKKyAgICAgIGdzdF90YWdfbGlzdF9hZGQgKHdhdi0+dGFncywgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgICAgIEdTVF9UQUdfQVVESU9fQ09ERUMsIGNvZGVjX25hbWUsIE5VTEwpOworCisgICAgICBnX2ZyZWUgKGNvZGVjX25hbWUpOworICAgICAgY29kZWNfbmFtZSA9IE5VTEw7CisgICAgfQorCisgIH0KKworICBnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKHdhdi0+c2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywgJnVwc3RyZWFtX3NpemUpOworICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJ1cHN0cmVhbSBzaXplICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHVwc3RyZWFtX3NpemUpOworCisgIC8qIGxvb3AgaGVhZGVycyB1bnRpbCB3ZSBnZXQgZGF0YSAqLworICB3aGlsZSAoIWdvdGRhdGEpIHsKKyAgICBpZiAod2F2LT5zdHJlYW1pbmcpIHsKKyAgICAgIGlmICghZ3N0X3dhdnBhcnNlX3BlZWtfY2h1bmtfaW5mbyAod2F2LCAmdGFnLCAmc2l6ZSkpCisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9IGVsc2UgeworICAgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICAgIGJ1ZiA9IE5VTEw7CisgICAgICBpZiAoKHJlcyA9CisgICAgICAgICAgICAgIGdzdF9wYWRfcHVsbF9yYW5nZSAod2F2LT5zaW5rcGFkLCB3YXYtPm9mZnNldCwgOCwKKyAgICAgICAgICAgICAgICAgICZidWYpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBoZWFkZXJfcmVhZF9lcnJvcjsKKyAgICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICB0YWcgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKG1hcC5kYXRhKTsKKyAgICAgIHNpemUgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKG1hcC5kYXRhICsgNCk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIH0KKworICAgIEdTVF9JTkZPX09CSkVDVCAod2F2LAorICAgICAgICAiR290IFRBRzogJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiwgb2Zmc2V0ICUiIEdfR1VJTlQ2NF9GT1JNQVQgIiwgc2l6ZSAlIgorICAgICAgICBHX0dVSU5UMzJfRk9STUFULCBHU1RfRk9VUkNDX0FSR1MgKHRhZyksIHdhdi0+b2Zmc2V0LCBzaXplKTsKKworICAgIC8qIE1heGltdW0gdmFsaWQgc2l6ZSBpcyBJTlRfTUFYICovCisgICAgaWYgKHNpemUgJiAweDgwMDAwMDAwKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHdhdiwgIkludmFsaWQgc2l6ZSwgY2xpcHBpbmcgdG8gMHg3ZmZmZmZmZiIpOworICAgICAgc2l6ZSA9IDB4N2ZmZmZmZmY7CisgICAgfQorCisgICAgLyogQ2xpcCB0byB1cHN0cmVhbSBzaXplIGlmIGtub3duICovCisgICAgaWYgKHVwc3RyZWFtX3NpemUgPiAwICYmIHNpemUgKyB3YXYtPm9mZnNldCA+IHVwc3RyZWFtX3NpemUpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2LCAiQ2xpcHBpbmcgY2h1bmsgc2l6ZSB0byBmaWxlIHNpemUiKTsKKyAgICAgIGdfYXNzZXJ0ICh1cHN0cmVhbV9zaXplID49IHdhdi0+b2Zmc2V0KTsKKyAgICAgIHNpemUgPSB1cHN0cmVhbV9zaXplIC0gd2F2LT5vZmZzZXQ7CisgICAgfQorCisgICAgLyogd2F2IGlzIGEgc3QwMHBpZCBmb3JtYXQsIHdlIGRvbid0IGtub3cgZm9yIHN1cmUgd2hlcmUgZGF0YSBzdGFydHMuCisgICAgICogU28gd2UgaGF2ZSB0byBnbyBiaXQgYnkgYml0IHVudGlsIHdlIGZpbmQgdGhlICdkYXRhJyBoZWFkZXIKKyAgICAgKi8KKyAgICBzd2l0Y2ggKHRhZykgeworICAgICAgY2FzZSBHU1RfUklGRl9UQUdfZGF0YTp7CisgICAgICAgIGd1aW50NjQgc2l6ZTY0OworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgIkdvdCAnZGF0YScgVEFHLCBzaXplIDogJXUiLCBzaXplKTsKKyAgICAgICAgc2l6ZTY0ID0gc2l6ZTsKKyAgICAgICAgaWYgKHdhdi0+aWdub3JlX2xlbmd0aCkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgIklnbm9yaW5nIGxlbmd0aCIpOworICAgICAgICAgIHNpemU2NCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdhdi0+c3RyZWFtaW5nKSB7CisgICAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHdhdi0+YWRhcHRlciwgOCk7CisgICAgICAgICAgZ290ZGF0YSA9IFRSVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgfQorICAgICAgICB3YXYtPm9mZnNldCArPSA4OworICAgICAgICB3YXYtPmRhdGFzdGFydCA9IHdhdi0+b2Zmc2V0OworICAgICAgICAvKiB1c2Ugc2l6ZSBmcm9tIGRzNjQgY2h1bmsgaWYgYXZhaWxhYmxlICovCisgICAgICAgIGlmIChzaXplNjQgPT0gLTEgJiYgd2F2LT5kYXRhc2l6ZSA+IDApIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJVc2luZyBkczY0IGRhdGFzaXplIik7CisgICAgICAgICAgc2l6ZTY0ID0gd2F2LT5kYXRhc2l6ZTsKKyAgICAgICAgfQorICAgICAgICB3YXYtPmNodW5rX3NpemUgPSBzaXplNjQ7CisKKyAgICAgICAgLyogSWYgc2l6ZSBpcyB6ZXJvLCB0aGVuIHRoZSBkYXRhIGNodW5rIHByb2JhYmx5IGFjdHVhbGx5IGV4dGVuZHMgdG8KKyAgICAgICAgICAgdGhlIGVuZCBvZiB0aGUgZmlsZSAqLworICAgICAgICBpZiAoc2l6ZTY0ID09IDAgJiYgdXBzdHJlYW1fc2l6ZSkgeworICAgICAgICAgIHNpemU2NCA9IHVwc3RyZWFtX3NpemUgLSB3YXYtPmRhdGFzdGFydDsKKyAgICAgICAgfQorICAgICAgICAvKiBPciB0aGUgZmlsZSBtaWdodCBiZSB0cnVuY2F0ZWQgKi8KKyAgICAgICAgZWxzZSBpZiAodXBzdHJlYW1fc2l6ZSkgeworICAgICAgICAgIHNpemU2NCA9IE1JTiAoc2l6ZTY0LCAodXBzdHJlYW1fc2l6ZSAtIHdhdi0+ZGF0YXN0YXJ0KSk7CisgICAgICAgIH0KKyAgICAgICAgd2F2LT5kYXRhc2l6ZSA9IHNpemU2NDsKKyAgICAgICAgd2F2LT5kYXRhbGVmdCA9IHNpemU2NDsKKyAgICAgICAgd2F2LT5lbmRfb2Zmc2V0ID0gc2l6ZTY0ICsgd2F2LT5kYXRhc3RhcnQ7CisgICAgICAgIGlmICghd2F2LT5zdHJlYW1pbmcpIHsKKyAgICAgICAgICAvKiBXZSB3aWxsIGNvbnRpbnVlIHBhcnNpbmcgdGFncyAndGlsbCBlbmQgKi8KKyAgICAgICAgICB3YXYtPm9mZnNldCArPSBzaXplNjQ7CisgICAgICAgIH0KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiZGF0YXNpemUgPSAlIiBHX0dVSU5UNjRfRk9STUFULCBzaXplNjQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgR1NUX1JJRkZfVEFHX2ZhY3Q6eworICAgICAgICBpZiAod2F2LT5mYWN0ID09IDAgJiYKKyAgICAgICAgICAgIHdhdi0+Zm9ybWF0ICE9IEdTVF9SSUZGX1dBVkVfRk9STUFUX01QRUdMMTIgJiYKKyAgICAgICAgICAgIHdhdi0+Zm9ybWF0ICE9IEdTVF9SSUZGX1dBVkVfRk9STUFUX01QRUdMMykgeworICAgICAgICAgIGNvbnN0IGd1aW50IGRhdGFfc2l6ZSA9IDQ7CisKKyAgICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHdhdiwgIkhhdmUgZmFjdCBjaHVuayIpOworICAgICAgICAgIGlmIChzaXplIDwgZGF0YV9zaXplKSB7CisgICAgICAgICAgICBpZiAoIWdzdF93YXZlcGFyc2VfaWdub3JlX2NodW5rICh3YXYsIGJ1ZiwgdGFnLCBzaXplKSkgeworICAgICAgICAgICAgICAvKiBuZWVkIG1vcmUgZGF0YSAqLworICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJuZWVkICV1LCBhdmFpbGFibGUgJXU7IGlnbm9yaW5nIGNodW5rIiwKKyAgICAgICAgICAgICAgICBkYXRhX3NpemUsIHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIG51bWJlciBvZiBzYW1wbGVzIChmb3IgY29tcHJlc3NlZCBmb3JtYXRzKSAqLworICAgICAgICAgIGlmICh3YXYtPnN0cmVhbWluZykgeworICAgICAgICAgICAgY29uc3QgZ3VpbnQ4ICpkYXRhID0gTlVMTDsKKworICAgICAgICAgICAgaWYgKCFnc3Rfd2F2cGFyc2VfcGVla19jaHVuayAod2F2LCAmdGFnLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHdhdi0+YWRhcHRlciwgOCk7CisgICAgICAgICAgICBkYXRhID0gZ3N0X2FkYXB0ZXJfbWFwICh3YXYtPmFkYXB0ZXIsIGRhdGFfc2l6ZSk7CisgICAgICAgICAgICB3YXYtPmZhY3QgPSBHU1RfUkVBRF9VSU5UMzJfTEUgKGRhdGEpOworICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKHdhdi0+YWRhcHRlcik7CisgICAgICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAod2F2LT5hZGFwdGVyLCBHU1RfUk9VTkRfVVBfMiAoc2l6ZSkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgICAgYnVmID0gTlVMTDsKKyAgICAgICAgICAgIGlmICgocmVzID0KKyAgICAgICAgICAgICAgICAgICAgZ3N0X3BhZF9wdWxsX3JhbmdlICh3YXYtPnNpbmtwYWQsIHdhdi0+b2Zmc2V0ICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfc2l6ZSwgJmJ1ZikpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgICBnb3RvIGhlYWRlcl9yZWFkX2Vycm9yOworICAgICAgICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChidWYsIDAsICZ3YXYtPmZhY3QsIDQpOworICAgICAgICAgICAgd2F2LT5mYWN0ID0gR1VJTlQzMl9GUk9NX0xFICh3YXYtPmZhY3QpOworICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICB9CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiaGF2ZSBmYWN0ICUiIEdfR1VJTlQ2NF9GT1JNQVQsIHdhdi0+ZmFjdCk7CisgICAgICAgICAgd2F2LT5vZmZzZXQgKz0gOCArIEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoIWdzdF93YXZlcGFyc2VfaWdub3JlX2NodW5rICh3YXYsIGJ1ZiwgdGFnLCBzaXplKSkgeworICAgICAgICAgICAgLyogbmVlZCBtb3JlIGRhdGEgKi8KKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEdTVF9SSUZGX1RBR19hY2lkOnsKKyAgICAgICAgY29uc3QgZ3N0X3JpZmZfYWNpZCAqYWNpZCA9IE5VTEw7CisgICAgICAgIGNvbnN0IGd1aW50IGRhdGFfc2l6ZSA9IHNpemVvZiAoZ3N0X3JpZmZfYWNpZCk7CisgICAgICAgIGdmbG9hdCB0ZW1wbzsKKworICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHdhdiwgIkhhdmUgYWNpZCBjaHVuayIpOworICAgICAgICBpZiAoc2l6ZSA8IGRhdGFfc2l6ZSkgeworICAgICAgICAgIGlmICghZ3N0X3dhdmVwYXJzZV9pZ25vcmVfY2h1bmsgKHdhdiwgYnVmLCB0YWcsIHNpemUpKSB7CisgICAgICAgICAgICAvKiBuZWVkIG1vcmUgZGF0YSAqLworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgIH0KKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJuZWVkICV1LCBhdmFpbGFibGUgJXU7IGlnbm9yaW5nIGNodW5rIiwKKyAgICAgICAgICAgICAgZGF0YV9zaXplLCBzaXplKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAod2F2LT5zdHJlYW1pbmcpIHsKKyAgICAgICAgICBpZiAoIWdzdF93YXZwYXJzZV9wZWVrX2NodW5rICh3YXYsICZ0YWcsICZzaXplKSkgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgIH0KKyAgICAgICAgICBnc3RfYWRhcHRlcl9mbHVzaCAod2F2LT5hZGFwdGVyLCA4KTsKKyAgICAgICAgICBhY2lkID0gKGNvbnN0IGdzdF9yaWZmX2FjaWQgKikgZ3N0X2FkYXB0ZXJfbWFwICh3YXYtPmFkYXB0ZXIsCisgICAgICAgICAgICAgIGRhdGFfc2l6ZSk7CisgICAgICAgICAgdGVtcG8gPSBhY2lkLT50ZW1wbzsKKyAgICAgICAgICBnc3RfYWRhcHRlcl91bm1hcCAod2F2LT5hZGFwdGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgIGJ1ZiA9IE5VTEw7CisgICAgICAgICAgaWYgKChyZXMgPQorICAgICAgICAgICAgICAgICAgZ3N0X3BhZF9wdWxsX3JhbmdlICh3YXYtPnNpbmtwYWQsIHdhdi0+b2Zmc2V0ICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplLCAmYnVmKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICBnb3RvIGhlYWRlcl9yZWFkX2Vycm9yOworICAgICAgICAgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgICAgICAgYWNpZCA9IChjb25zdCBnc3RfcmlmZl9hY2lkICopIG1hcC5kYXRhOworICAgICAgICAgIHRlbXBvID0gYWNpZC0+dGVtcG87CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICAgICAgfQorICAgICAgICAvKiBzZW5kIGRhdGEgYXMgdGFncyAqLworICAgICAgICBpZiAoIXdhdi0+dGFncykKKyAgICAgICAgICB3YXYtPnRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICAgICAgICBnc3RfdGFnX2xpc3RfYWRkICh3YXYtPnRhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgICAgICAgIEdTVF9UQUdfQkVBVFNfUEVSX01JTlVURSwgdGVtcG8sIE5VTEwpOworCisgICAgICAgIHNpemUgPSBHU1RfUk9VTkRfVVBfMiAoc2l6ZSk7CisgICAgICAgIGlmICh3YXYtPnN0cmVhbWluZykgeworICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoICh3YXYtPmFkYXB0ZXIsIHNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgd2F2LT5vZmZzZXQgKz0gOCArIHNpemU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgICAvKiBGSVhNRTogYWxsIGxpc3QgdGFncyBhZnRlciBkYXRhIGFyZSBpZ25vcmVkIGluIHN0cmVhbWluZyBtb2RlICovCisgICAgICBjYXNlIEdTVF9SSUZGX1RBR19MSVNUOnsKKyAgICAgICAgZ3VpbnQzMiBsdGFnOworCisgICAgICAgIGlmICh3YXYtPnN0cmVhbWluZykgeworICAgICAgICAgIGNvbnN0IGd1aW50OCAqZGF0YSA9IE5VTEw7CisKKyAgICAgICAgICBpZiAoZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlICh3YXYtPmFkYXB0ZXIpIDwgMTIpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICB9CisgICAgICAgICAgZGF0YSA9IGdzdF9hZGFwdGVyX21hcCAod2F2LT5hZGFwdGVyLCAxMik7CisgICAgICAgICAgbHRhZyA9IEdTVF9SRUFEX1VJTlQzMl9MRSAoZGF0YSArIDgpOworICAgICAgICAgIGdzdF9hZGFwdGVyX3VubWFwICh3YXYtPmFkYXB0ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgICAgYnVmID0gTlVMTDsKKyAgICAgICAgICBpZiAoKHJlcyA9CisgICAgICAgICAgICAgICAgICBnc3RfcGFkX3B1bGxfcmFuZ2UgKHdhdi0+c2lua3BhZCwgd2F2LT5vZmZzZXQsIDEyLAorICAgICAgICAgICAgICAgICAgICAgICZidWYpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgIGdvdG8gaGVhZGVyX3JlYWRfZXJyb3I7CisgICAgICAgICAgZ3N0X2J1ZmZlcl9leHRyYWN0IChidWYsIDgsICZsdGFnLCA0KTsKKyAgICAgICAgICBsdGFnID0gR1VJTlQzMl9GUk9NX0xFIChsdGFnKTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGx0YWcpIHsKKyAgICAgICAgICBjYXNlIEdTVF9SSUZGX0xJU1RfSU5GTzp7CisgICAgICAgICAgICBjb25zdCBnaW50IGRhdGFfc2l6ZSA9IHNpemUgLSA0OworICAgICAgICAgICAgR3N0VGFnTGlzdCAqbmV3OworCisgICAgICAgICAgICBHU1RfSU5GT19PQkpFQ1QgKHdhdiwgIkhhdmUgTElTVCBjaHVuayBJTkZPIHNpemUgJXUiLCBkYXRhX3NpemUpOworICAgICAgICAgICAgaWYgKHdhdi0+c3RyZWFtaW5nKSB7CisgICAgICAgICAgICAgIGlmICghZ3N0X3dhdnBhcnNlX3BlZWtfY2h1bmsgKHdhdiwgJnRhZywgJnNpemUpKSB7CisgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoICh3YXYtPmFkYXB0ZXIsIDEyKTsKKyAgICAgICAgICAgICAgd2F2LT5vZmZzZXQgKz0gMTI7CisgICAgICAgICAgICAgIGlmIChkYXRhX3NpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgYnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHdhdi0+YWRhcHRlciwgZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YV9zaXplICYgMSkKKyAgICAgICAgICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoICh3YXYtPmFkYXB0ZXIsIDEpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB3YXYtPm9mZnNldCArPSAxMjsKKyAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICAgICAgYnVmID0gTlVMTDsKKyAgICAgICAgICAgICAgaWYgKGRhdGFfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJlcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBnc3RfcGFkX3B1bGxfcmFuZ2UgKHdhdi0+c2lua3BhZCwgd2F2LT5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9zaXplLCAmYnVmKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgICBnb3RvIGhlYWRlcl9yZWFkX2Vycm9yOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGF0YV9zaXplID4gMCkgeworICAgICAgICAgICAgICAvKiBwYXJzZSB0YWdzICovCisgICAgICAgICAgICAgIGdzdF9yaWZmX3BhcnNlX2luZm8gKEdTVF9FTEVNRU5UICh3YXYpLCBidWYsICZuZXcpOworICAgICAgICAgICAgICBpZiAobmV3KSB7CisgICAgICAgICAgICAgICAgR3N0VGFnTGlzdCAqb2xkID0gd2F2LT50YWdzOworICAgICAgICAgICAgICAgIHdhdi0+dGFncyA9CisgICAgICAgICAgICAgICAgICAgIGdzdF90YWdfbGlzdF9tZXJnZSAob2xkLCBuZXcsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSk7CisgICAgICAgICAgICAgICAgaWYgKG9sZCkKKyAgICAgICAgICAgICAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAob2xkKTsKKyAgICAgICAgICAgICAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKG5ldyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICAgICAgd2F2LT5vZmZzZXQgKz0gR1NUX1JPVU5EX1VQXzIgKGRhdGFfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBHU1RfUklGRl9MSVNUX2FkdGw6eworICAgICAgICAgICAgY29uc3QgZ2ludCBkYXRhX3NpemUgPSBzaXplIC0gNDsKKworICAgICAgICAgICAgR1NUX0lORk9fT0JKRUNUICh3YXYsICJIYXZlICdhZHRsJyBMSVNULCBzaXplICV1IiwgZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGlmICh3YXYtPnN0cmVhbWluZykgeworICAgICAgICAgICAgICBjb25zdCBndWludDggKmRhdGEgPSBOVUxMOworCisgICAgICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoICh3YXYtPmFkYXB0ZXIsIDEyKTsKKyAgICAgICAgICAgICAgd2F2LT5vZmZzZXQgKz0gMTI7CisgICAgICAgICAgICAgIGRhdGEgPSBnc3RfYWRhcHRlcl9tYXAgKHdhdi0+YWRhcHRlciwgZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgZ3N0X3dhdnBhcnNlX2FkdGxfY2h1bmsgKHdhdiwgZGF0YSwgZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgZ3N0X2FkYXB0ZXJfdW5tYXAgKHdhdi0+YWRhcHRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgICAgICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICAgICAgICBidWYgPSBOVUxMOworICAgICAgICAgICAgICB3YXYtPm9mZnNldCArPSAxMjsKKyAgICAgICAgICAgICAgaWYgKChyZXMgPQorICAgICAgICAgICAgICAgICAgICAgIGdzdF9wYWRfcHVsbF9yYW5nZSAod2F2LT5zaW5rcGFkLCB3YXYtPm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9zaXplLCAmYnVmKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgICAgZ290byBoZWFkZXJfcmVhZF9lcnJvcjsKKyAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgICAgICAgICAgZ3N0X3dhdnBhcnNlX2FkdGxfY2h1bmsgKHdhdiwgKGNvbnN0IGd1aW50OCAqKSBtYXAuZGF0YSwKKyAgICAgICAgICAgICAgICAgIGRhdGFfc2l6ZSk7CisgICAgICAgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3YXYtPm9mZnNldCArPSBHU1RfUk9VTkRfVVBfMiAoZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh3YXYsICJJZ25vcmluZyBMSVNUIGNodW5rICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAobHRhZykpOworICAgICAgICAgICAgaWYgKCFnc3Rfd2F2ZXBhcnNlX2lnbm9yZV9jaHVuayAod2F2LCBidWYsIHRhZywgc2l6ZSkpCisgICAgICAgICAgICAgIC8qIG5lZWQgbW9yZSBkYXRhICovCisgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBHU1RfUklGRl9UQUdfY3VlOnsKKyAgICAgICAgY29uc3QgZ3VpbnQgZGF0YV9zaXplID0gc2l6ZTsKKworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJIYXZlICdjdWUnIFRBRywgc2l6ZSA6ICV1IiwgZGF0YV9zaXplKTsKKyAgICAgICAgaWYgKHdhdi0+c3RyZWFtaW5nKSB7CisgICAgICAgICAgY29uc3QgZ3VpbnQ4ICpkYXRhID0gTlVMTDsKKworICAgICAgICAgIGlmICghZ3N0X3dhdnBhcnNlX3BlZWtfY2h1bmsgKHdhdiwgJnRhZywgJnNpemUpKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoICh3YXYtPmFkYXB0ZXIsIDgpOworICAgICAgICAgIHdhdi0+b2Zmc2V0ICs9IDg7CisgICAgICAgICAgZGF0YSA9IGdzdF9hZGFwdGVyX21hcCAod2F2LT5hZGFwdGVyLCBkYXRhX3NpemUpOworICAgICAgICAgIGlmICghZ3N0X3dhdnBhcnNlX2N1ZV9jaHVuayAod2F2LCBkYXRhLCBkYXRhX3NpemUpKSB7CisgICAgICAgICAgICBnb3RvIGhlYWRlcl9yZWFkX2Vycm9yOworICAgICAgICAgIH0KKyAgICAgICAgICBnc3RfYWRhcHRlcl91bm1hcCAod2F2LT5hZGFwdGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgICAgICAgIHdhdi0+b2Zmc2V0ICs9IDg7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICBidWYgPSBOVUxMOworICAgICAgICAgIGlmICgocmVzID0KKyAgICAgICAgICAgICAgICAgIGdzdF9wYWRfcHVsbF9yYW5nZSAod2F2LT5zaW5rcGFkLCB3YXYtPm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhX3NpemUsICZidWYpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgIGdvdG8gaGVhZGVyX3JlYWRfZXJyb3I7CisgICAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgICAgICBpZiAoIWdzdF93YXZwYXJzZV9jdWVfY2h1bmsgKHdhdiwgKGNvbnN0IGd1aW50OCAqKSBtYXAuZGF0YSwKKyAgICAgICAgICAgICAgICAgIGRhdGFfc2l6ZSkpIHsKKyAgICAgICAgICAgIGdvdG8gaGVhZGVyX3JlYWRfZXJyb3I7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSA9IEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICAgICAgaWYgKHdhdi0+c3RyZWFtaW5nKSB7CisgICAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHdhdi0+YWRhcHRlciwgc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgfQorICAgICAgICBzaXplID0gR1NUX1JPVU5EX1VQXzIgKHNpemUpOworICAgICAgICB3YXYtPm9mZnNldCArPSBzaXplOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgR1NUX1JJRkZfVEFHX3NtcGw6eworICAgICAgICBjb25zdCBnaW50IGRhdGFfc2l6ZSA9IHNpemU7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiSGF2ZSAnc21wbCcgVEFHLCBzaXplIDogJXUiLCBkYXRhX3NpemUpOworICAgICAgICBpZiAod2F2LT5zdHJlYW1pbmcpIHsKKyAgICAgICAgICBjb25zdCBndWludDggKmRhdGEgPSBOVUxMOworCisgICAgICAgICAgaWYgKCFnc3Rfd2F2cGFyc2VfcGVla19jaHVuayAod2F2LCAmdGFnLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICB9CisgICAgICAgICAgZ3N0X2FkYXB0ZXJfZmx1c2ggKHdhdi0+YWRhcHRlciwgOCk7CisgICAgICAgICAgd2F2LT5vZmZzZXQgKz0gODsKKyAgICAgICAgICBkYXRhID0gZ3N0X2FkYXB0ZXJfbWFwICh3YXYtPmFkYXB0ZXIsIGRhdGFfc2l6ZSk7CisgICAgICAgICAgaWYgKCFnc3Rfd2F2cGFyc2Vfc21wbF9jaHVuayAod2F2LCBkYXRhLCBkYXRhX3NpemUpKSB7CisgICAgICAgICAgICBnb3RvIGhlYWRlcl9yZWFkX2Vycm9yOworICAgICAgICAgIH0KKyAgICAgICAgICBnc3RfYWRhcHRlcl91bm1hcCAod2F2LT5hZGFwdGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHc3RNYXBJbmZvIG1hcDsKKworICAgICAgICAgIHdhdi0+b2Zmc2V0ICs9IDg7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgICAgICAgICBidWYgPSBOVUxMOworICAgICAgICAgIGlmICgocmVzID0KKyAgICAgICAgICAgICAgICAgIGdzdF9wYWRfcHVsbF9yYW5nZSAod2F2LT5zaW5rcGFkLCB3YXYtPm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhX3NpemUsICZidWYpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgIGdvdG8gaGVhZGVyX3JlYWRfZXJyb3I7CisgICAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgICAgICBpZiAoIWdzdF93YXZwYXJzZV9zbXBsX2NodW5rICh3YXYsIChjb25zdCBndWludDggKikgbWFwLmRhdGEsCisgICAgICAgICAgICAgICAgICBkYXRhX3NpemUpKSB7CisgICAgICAgICAgICBnb3RvIGhlYWRlcl9yZWFkX2Vycm9yOworICAgICAgICAgIH0KKyAgICAgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgICAgICB9CisgICAgICAgIHNpemUgPSBHU1RfUk9VTkRfVVBfMiAoc2l6ZSk7CisgICAgICAgIGlmICh3YXYtPnN0cmVhbWluZykgeworICAgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoICh3YXYtPmFkYXB0ZXIsIHNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSA9IEdTVF9ST1VORF9VUF8yIChzaXplKTsKKyAgICAgICAgd2F2LT5vZmZzZXQgKz0gc2l6ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHdhdiwgIklnbm9yaW5nIGNodW5rICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTICh0YWcpKTsKKyAgICAgICAgaWYgKCFnc3Rfd2F2ZXBhcnNlX2lnbm9yZV9jaHVuayAod2F2LCBidWYsIHRhZywgc2l6ZSkpCisgICAgICAgICAgLyogbmVlZCBtb3JlIGRhdGEgKi8KKyAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICh1cHN0cmVhbV9zaXplICYmICh3YXYtPm9mZnNldCA+PSB1cHN0cmVhbV9zaXplKSkgeworICAgICAgLyogTm93IHdlIGFyZSBnb25lIHRocm91Z2ggdGhlIHdob2xlIGZpbGUgKi8KKyAgICAgIGdvdGRhdGEgPSBUUlVFOworICAgIH0KKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgIkZpbmlzaGVkIHBhcnNpbmcgaGVhZGVycyIpOworCisgIGlmICh3YXYtPmJwcyA8PSAwICYmIHdhdi0+ZmFjdCkgeworI2lmIDAKKyAgICAvKiBub3QgYSBnb29kIGlkZWEsIGFzIGZvciBlbWJlZGRlZCBtcDIvbXAzIHdlIHNldCBicHMgdG8gMCBlYXJsaWVyICovCisgICAgd2F2LT5icHMgPQorICAgICAgICAoZ3VpbnQzMikgZ3N0X3V0aWxfdWludDY0X3NjYWxlICgoZ3VpbnQ2NCkgd2F2LT5yYXRlLCB3YXYtPmRhdGFzaXplLAorICAgICAgICAoZ3VpbnQ2NCkgd2F2LT5mYWN0KTsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHdhdiwgImNhbGN1bGF0ZWQgYnBzIDogJXUsIGVuYWJsaW5nIFZCUiIsIHdhdi0+YnBzKTsKKyNlbmRpZgorICAgIHdhdi0+dmJyID0gVFJVRTsKKyAgfQorCisgIGlmIChnc3Rfd2F2cGFyc2VfY2FsY3VsYXRlX2R1cmF0aW9uICh3YXYpKSB7CisgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJndhdi0+c2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgICBpZiAoIXdhdi0+aWdub3JlX2xlbmd0aCkKKyAgICAgIHdhdi0+c2VnbWVudC5kdXJhdGlvbiA9IHdhdi0+ZHVyYXRpb247CisgICAgaWYgKCF3YXYtPnRvYykKKyAgICAgIGdzdF93YXZwYXJzZV9jcmVhdGVfdG9jICh3YXYpOworICB9IGVsc2UgeworICAgIC8qIG5vIGJpdHJhdGUsIGxldCBkb3duc3RyZWFtIHBlZXIgZG8gdGhlIG1hdGgsIHdlJ2xsIGZlZWQgaXQgYnl0ZXMuICovCisgICAgZ3N0X3NlZ21lbnRfaW5pdCAoJndhdi0+c2VnbWVudCwgR1NUX0ZPUk1BVF9CWVRFUyk7CisgICAgaWYgKCF3YXYtPmlnbm9yZV9sZW5ndGgpCisgICAgICB3YXYtPnNlZ21lbnQuZHVyYXRpb24gPSB3YXYtPmRhdGFzaXplOworICB9CisKKyAgLyogbm93IHdlIGhhdmUgYWxsIHRoZSBpbmZvIHRvIHBlcmZvcm0gYSBwZW5kaW5nIHNlZWsgaWYgYW55LCBpZiBubworICAgKiBldmVudCwgdGhpcyB3aWxsIHN0aWxsIGRvIHRoZSByaWdodCB0aGluZyBhbmQgaXQgd2lsbCBhbHNvIHNlbmQKKyAgICogdGhlIHJpZ2h0IG5ld3NlZ21lbnQgZXZlbnQgZG93bnN0cmVhbS4gKi8KKyAgZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayAod2F2LCB3YXYtPnNlZWtfZXZlbnQpOworICAvKiByZW1vdmUgcGVuZGluZyBldmVudCAqLworICBnc3RfZXZlbnRfcmVwbGFjZSAoJndhdi0+c2Vla19ldmVudCwgTlVMTCk7CisKKyAgLyogd2UganVzdCBzdGFydGVkLCB3ZSBhcmUgZGlzY29udCAqLworICB3YXYtPmRpc2NvbnQgPSBUUlVFOworCisgIHdhdi0+c3RhdGUgPSBHU1RfV0FWUEFSU0VfREFUQTsKKworICAvKiBkZXRlcm1pbmUgcmVhc29uYWJsZSBtYXggYnVmZmVyIHNpemUsCisgICAqIHRoYXQgaXMsIGJ1ZmZlcnMgbm90IHRvbyBzbWFsbCBlaXRoZXIgc2l6ZSBvciB0aW1lIHdpc2UKKyAgICogc28gd2UgZG8gbm90IGVuZCB1cCB3aXRoIHRvbyBtYW55IG9mIHRoZW0gKi8KKyAgLyogdmFyIGFidXNlICovCisgIGlmIChnc3Rfd2F2cGFyc2VfdGltZV90b19ieXRlcG9zICh3YXYsIDQwICogR1NUX01TRUNPTkQsICZ1cHN0cmVhbV9zaXplKSkKKyAgICB3YXYtPm1heF9idWZfc2l6ZSA9IHVwc3RyZWFtX3NpemU7CisgIGVsc2UKKyAgICB3YXYtPm1heF9idWZfc2l6ZSA9IDA7CisgIHdhdi0+bWF4X2J1Zl9zaXplID0gTUFYICh3YXYtPm1heF9idWZfc2l6ZSwgTUFYX0JVRkZFUl9TSVpFKTsKKyAgaWYgKHdhdi0+YmxvY2thbGlnbiA+IDApCisgICAgd2F2LT5tYXhfYnVmX3NpemUgLT0gKHdhdi0+bWF4X2J1Zl9zaXplICUgd2F2LT5ibG9ja2FsaWduKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJtYXggYnVmZmVyIHNpemUgJXUiLCB3YXYtPm1heF9idWZfc2l6ZSk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIC8qIEVSUk9SICovCitleGl0OgorICB7CisgICAgZ19mcmVlIChjb2RlY19uYW1lKTsKKyAgICBnX2ZyZWUgKGhlYWRlcik7CisgICAgaWYgKGNhcHMpCisgICAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorZmFpbDoKKyAgeworICAgIHJlcyA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZXhpdDsKKyAgfQorcGFyc2VfaGVhZGVyX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHdhdiwgU1RSRUFNLCBERU1VWCwgKE5VTEwpLAorICAgICAgICAoIkNvdWxkbid0IHBhcnNlIGF1ZGlvIGhlYWRlciIpKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KK25vX2NoYW5uZWxzOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHdhdiwgU1RSRUFNLCBGQUlMRUQsIChOVUxMKSwKKyAgICAgICAgKCJTdHJlYW0gY2xhaW1zIHRvIGNvbnRhaW4gbm8gY2hhbm5lbHMgLSBpbnZhbGlkIGRhdGEiKSk7CisgICAgZ290byBmYWlsOworICB9Citub19yYXRlOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHdhdiwgU1RSRUFNLCBGQUlMRUQsIChOVUxMKSwKKyAgICAgICAgKCJTdHJlYW0gd2l0aCBzYW1wbGVfcmF0ZSA9PSAwIC0gaW52YWxpZCBkYXRhIikpOworICAgIGdvdG8gZmFpbDsKKyAgfQoraW52YWxpZF9ibG9ja2FsaWduOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHdhdiwgU1RSRUFNLCBGQUlMRUQsIChOVUxMKSwKKyAgICAgICAgKCJTdHJlYW0gY2xhaW1zIGJsb2NrYWxpZ24gPSAldSwgd2hpY2ggaXMgbW9yZSB0aGFuICV1IC0gaW52YWxpZCBkYXRhIiwKKyAgICAgICAgICAgIHdhdi0+YmxvY2thbGlnbiwgd2F2LT5jaGFubmVscyAqICgod2F2LT5kZXB0aCArIDcpIC8gOCkpKTsKKyAgICBnb3RvIGZhaWw7CisgIH0KK2ludmFsaWRfYnBzOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHdhdiwgU1RSRUFNLCBGQUlMRUQsIChOVUxMKSwKKyAgICAgICAgKCJTdHJlYW0gY2xhaW1zIGF2X2JzcCA9ICV1LCB3aGljaCBpcyBtb3JlIHRoYW4gJXUgLSBpbnZhbGlkIGRhdGEiLAorICAgICAgICAgICAgd2F2LT5hdl9icHMsIHdhdi0+YmxvY2thbGlnbiAqIHdhdi0+cmF0ZSkpOworICAgIGdvdG8gZmFpbDsKKyAgfQorbm9fYnl0ZXNfcGVyX3NhbXBsZToKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh3YXYsIFNUUkVBTSwgRkFJTEVELCAoTlVMTCksCisgICAgICAgICgiQ291bGQgbm90IGNhbHVjbGF0ZSBieXRlcyBwZXIgc2FtcGxlIC0gaW52YWxpZCBkYXRhIikpOworICAgIGdvdG8gZmFpbDsKKyAgfQordW5rbm93bl9mb3JtYXQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAod2F2LCBTVFJFQU0sIFRZUEVfTk9UX0ZPVU5ELCAoTlVMTCksCisgICAgICAgICgiTm8gY2FwcyBmb3VuZCBmb3IgZm9ybWF0IDB4JXgsICV1IGNoYW5uZWxzLCAldSBIeiIsCisgICAgICAgICAgICB3YXYtPmZvcm1hdCwgd2F2LT5jaGFubmVscywgd2F2LT5yYXRlKSk7CisgICAgZ290byBmYWlsOworICB9CitoZWFkZXJfcmVhZF9lcnJvcjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh3YXYsIFNUUkVBTSwgREVNVVgsIChOVUxMKSwKKyAgICAgICAgKCJDb3VsZG4ndCByZWFkIGluIGhlYWRlciAlZCAoJXMpIiwgcmVzLCBnc3RfZmxvd19nZXRfbmFtZSAocmVzKSkpOworICAgIGdvdG8gZmFpbDsKKyAgfQorfQorCisvKgorICogUmVhZCBXQVYgZmlsZSB0YWcgd2hlbiBzdHJlYW1pbmcKKyAqLworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF93YXZwYXJzZV9wYXJzZV9zdHJlYW1faW5pdCAoR3N0V2F2UGFyc2UgKiB3YXYpCit7CisgIGlmIChnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHdhdi0+YWRhcHRlcikgPj0gMTIpIHsKKyAgICBHc3RCdWZmZXIgKnRtcDsKKworICAgIC8qIF90YWtlIGZsdXNoZXMgdGhlIGRhdGEgKi8KKyAgICB0bXAgPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAod2F2LT5hZGFwdGVyLCAxMik7CisKKyAgICBHU1RfREVCVUcgKCJQYXJzaW5nIHdhdiBoZWFkZXIiKTsKKyAgICBpZiAoIWdzdF93YXZwYXJzZV9wYXJzZV9maWxlX2hlYWRlciAoR1NUX0VMRU1FTlRfQ0FTVCAod2F2KSwgdG1wKSkKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKworICAgIHdhdi0+b2Zmc2V0ICs9IDEyOworICAgIC8qIEdvIHRvIG5leHQgc3RhdGUgKi8KKyAgICB3YXYtPnN0YXRlID0gR1NUX1dBVlBBUlNFX0hFQURFUjsKKyAgfQorICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKKy8qIGhhbmRsZSBhbiBldmVudCBzZW50IGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50LgorICoKKyAqIFRoaXMgZXZlbnQgY2FuIGJlIHNlbnQgZWl0aGVyIGluIHRoZSBSRUFEWSBzdGF0ZSBvciB0aGUKKyAqID5SRUFEWSBzdGF0ZS4gVGhlIG9ubHkgZXZlbnQgb2YgaW50ZXJlc3QgcmVhbGx5IGlzIHRoZSBzZWVrCisgKiBldmVudC4KKyAqCisgKiBJbiB0aGUgUkVBRFkgc3RhdGUgd2UgY2FuIG9ubHkgc3RvcmUgdGhlIGV2ZW50IGFuZCB0cnkgdG8KKyAqIHJlc3BlY3QgaXQgd2hlbiBnb2luZyB0byBQQVVTRUQuIFdlIGFzc3VtZSB3ZSBhcmUgaW4gdGhlCisgKiBSRUFEWSBzdGF0ZSB3aGVuIG91ciBwYXJzaW5nIHN0YXRlICE9IEdTVF9XQVZQQVJTRV9EQVRBLgorICoKKyAqIFdoZW4gd2UgYXJlIHN0ZWFtaW5nLCB3ZSBjYW4gc2ltcGx5IHBlcmZvcm0gdGhlIHNlZWsgcmlnaHQKKyAqIGF3YXkuCisgKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhcnNlX3NlbmRfZXZlbnQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHc3RXYXZQYXJzZSAqd2F2ID0gR1NUX1dBVlBBUlNFIChlbGVtZW50KTsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAicmVjZWl2ZWQgZXZlbnQgJXMiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX1NFRUs6CisgICAgICBpZiAod2F2LT5zdGF0ZSA9PSBHU1RfV0FWUEFSU0VfREFUQSkgeworICAgICAgICAvKiB3ZSBjYW4gaGFuZGxlIHRoZSBzZWVrIGRpcmVjdGx5IHdoZW4gc3RyZWFtaW5nIGRhdGEgKi8KKyAgICAgICAgcmVzID0gZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayAod2F2LCBldmVudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJxdWV1aW5nIHNlZWsgZm9yIGxhdGVyIik7CisKKyAgICAgICAgZ3N0X2V2ZW50X3JlcGxhY2UgKCZ3YXYtPnNlZWtfZXZlbnQsIGV2ZW50KTsKKworICAgICAgICAvKiB3ZSBhbHdheXMgcmV0dXJuIHRydWUgKi8KKyAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2cGFyc2VfaGF2ZV9kdHNfY2FwcyAoY29uc3QgR3N0Q2FwcyAqIGNhcHMsIEdzdFR5cGVGaW5kUHJvYmFiaWxpdHkgcHJvYikKK3sKKyAgR3N0U3RydWN0dXJlICpzOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiYXVkaW8veC1kdHMiKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIC8qIHR5cGVmaW5kIGJlaGF2aW9yIGZvciBEVFM6CisgICAqICBNQVhJTVVNOiBtdWx0aXBsZSBmcmFtZSBzeW5jcyBkZXRlY3RlZCwgY2VydGFpbmx5IERUUworICAgKiAgTElLRUxZOiBzaW5nbGUgZnJhbWUgc3luYyBhdCBvZmZzZXQgMC4gIE1heWJlIERUUz8KKyAgICogIFBPU1NJQkxFOiBzaW5nbGUgZnJhbWUgc3luYywgbm90IGF0IG9mZnNldCAwLiAgSGlnaGx5IHVubGlrZWx5CisgICAqICAgIHRvIGJlIERUUy4gICovCisgIGlmIChwcm9iID4gR1NUX1RZUEVfRklORF9MSUtFTFkpCisgICAgcmV0dXJuIFRSVUU7CisgIGlmIChwcm9iIDw9IEdTVF9UWVBFX0ZJTkRfUE9TU0lCTEUpCisgICAgcmV0dXJuIEZBTFNFOworICAvKiBmb3IgbWF5YmUsIGNoZWNrIGZvciBhdCBsZWFzdCBhIHZhbGlkLWxvb2tpbmcgcmF0ZSBhbmQgY2hhbm5lbHMgKi8KKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgImNoYW5uZWxzIikpCisgICAgcmV0dXJuIEZBTFNFOworICAvKiBhbmQgZm9yIGV4dHJhIGFzc3VyYW5jZSB3ZSBjb3VsZCBhbHNvIGNoZWNrIHRoZSByYXRlIGZyb20gdGhlIERUUyBmcmFtZQorICAgKiBhZ2FpbnN0IHRoZSBvbmUgaW4gdGhlIHdhdiBoZWFkZXIsIGJ1dCBmb3Igbm93IGxldCdzIG5vdCBkbyB0aGF0ICovCisgIHJldHVybiBnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgInJhdGUiKTsKK30KKworc3RhdGljIEdzdFRhZ0xpc3QgKgorZ3N0X3dhdnBhcnNlX2dldF91cHN0cmVhbV90YWdzIChHc3RXYXZQYXJzZSAqIHdhdiwgR3N0VGFnU2NvcGUgc2NvcGUpCit7CisgIEdzdFRhZ0xpc3QgKnRhZ3MgPSBOVUxMOworICBHc3RFdmVudCAqZXY7CisgIGdpbnQgaTsKKworICBpID0gMDsKKyAgd2hpbGUgKChldiA9IGdzdF9wYWRfZ2V0X3N0aWNreV9ldmVudCAod2F2LT5zaW5rcGFkLCBHU1RfRVZFTlRfVEFHLCBpKyspKSkgeworICAgIGdzdF9ldmVudF9wYXJzZV90YWcgKGV2LCAmdGFncyk7CisgICAgaWYgKHRhZ3MgIT0gTlVMTCAmJiBnc3RfdGFnX2xpc3RfZ2V0X3Njb3BlICh0YWdzKSA9PSBzY29wZSkgeworICAgICAgdGFncyA9IGdzdF90YWdfbGlzdF9jb3B5ICh0YWdzKTsKKyAgICAgIGdzdF90YWdfbGlzdF9yZW1vdmVfdGFnICh0YWdzLCBHU1RfVEFHX0NPTlRBSU5FUl9GT1JNQVQpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgdGFncyA9IE5VTEw7CisgICAgZ3N0X2V2ZW50X3VucmVmIChldik7CisgIH0KKyAgcmV0dXJuIHRhZ3M7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFyc2VfYWRkX3NyY19wYWQgKEdzdFdhdlBhcnNlICogd2F2LCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgR3N0VGFnTGlzdCAqdGFncywgKnV0YWdzOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHdhdiwgImFkZGluZyBzcmMgcGFkIik7CisKKyAgZ19hc3NlcnQgKHdhdi0+Y2FwcyAhPSBOVUxMKTsKKworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAod2F2LT5jYXBzLCAwKTsKKyAgaWYgKHMgJiYgZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgImF1ZGlvL3gtcmF3IikgJiYgYnVmICE9IE5VTEwpIHsKKyAgICBHc3RUeXBlRmluZFByb2JhYmlsaXR5IHByb2I7CisgICAgR3N0Q2FwcyAqdGZfY2FwczsKKworICAgIHRmX2NhcHMgPSBnc3RfdHlwZV9maW5kX2hlbHBlcl9mb3JfYnVmZmVyIChHU1RfT0JKRUNUICh3YXYpLCBidWYsICZwcm9iKTsKKyAgICBpZiAodGZfY2FwcyAhPSBOVUxMKSB7CisgICAgICBHU1RfTE9HICgidHlwZWZpbmQgY2FwcyA9ICUiIEdTVF9QVFJfRk9STUFUICIsIFA9JWQiLCB0Zl9jYXBzLCBwcm9iKTsKKyAgICAgIGlmIChnc3Rfd2F2cGFyc2VfaGF2ZV9kdHNfY2FwcyAodGZfY2FwcywgcHJvYikpIHsKKyAgICAgICAgR1NUX0lORk9fT0JKRUNUICh3YXYsICJGb3VuZCBEVFMgbWFya2VyIGluIGZpbGUgbWFya2VkIGFzIHJhdyBQQ00iKTsKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKHdhdi0+Y2Fwcyk7CisgICAgICAgIHdhdi0+Y2FwcyA9IHRmX2NhcHM7CisKKyAgICAgICAgZ3N0X3RhZ19saXN0X2FkZCAod2F2LT50YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICAgICAgICBHU1RfVEFHX0FVRElPX0NPREVDLCAiZHRzIiwgTlVMTCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJmb3VuZCBjYXBzICUiIEdTVF9QVFJfRk9STUFUICIgZm9yIHN0cmVhbSAiCisgICAgICAgICAgICAibWFya2VkIGFzIHJhdyBQQ00gYXVkaW8sIGJ1dCBpZ25vcmluZyBmb3Igbm93IiwgdGZfY2Fwcyk7CisgICAgICAgIGdzdF9jYXBzX3VucmVmICh0Zl9jYXBzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBnc3RfcGFkX3NldF9jYXBzICh3YXYtPnNyY3BhZCwgd2F2LT5jYXBzKTsKKworICBpZiAod2F2LT5zdGFydF9zZWdtZW50KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiU2VuZCBzdGFydCBzZWdtZW50IGV2ZW50IG9uIG5ld3BhZCIpOworICAgIGdzdF9wYWRfcHVzaF9ldmVudCAod2F2LT5zcmNwYWQsIHdhdi0+c3RhcnRfc2VnbWVudCk7CisgICAgd2F2LT5zdGFydF9zZWdtZW50ID0gTlVMTDsKKyAgfQorCisgIC8qIHVwc3RyZWFtIHRhZ3MsIGUuZy4gZnJvbSBpZDMvYXBlIHRhZyBiZWZvcmUgdGhlIHdhdiBmaWxlOyBhc3N1bWUgZm9yIG5vdworICAgKiB0aGF0IHRoZXJlJ2xsIGJlIG9ubHkgb25lIHNjb3BlL3R5cGUgb2YgdGFnIGxpc3QgZnJvbSB1cHN0cmVhbSwgaWYgYW55ICovCisgIHV0YWdzID0gZ3N0X3dhdnBhcnNlX2dldF91cHN0cmVhbV90YWdzICh3YXYsIEdTVF9UQUdfU0NPUEVfR0xPQkFMKTsKKyAgaWYgKHV0YWdzID09IE5VTEwpCisgICAgdXRhZ3MgPSBnc3Rfd2F2cGFyc2VfZ2V0X3Vwc3RyZWFtX3RhZ3MgKHdhdiwgR1NUX1RBR19TQ09QRV9TVFJFQU0pOworCisgIC8qIGlmIHRoZXJlJ3MgYSB0YWcgdXBzdHJlYW0gaXQncyBwcm9iYWJseSBiZWVuIGFkZGVkIHRvIG92ZXJyaWRlIHRoZQorICAgKiB0YWdzIGZyb20gaW5zaWRlIHRoZSB3YXYgaGVhZGVyLCBzbyBrZWVwIHVwc3RyZWFtIHRhZ3MgaWYgaW4gZG91YnQgKi8KKyAgdGFncyA9IGdzdF90YWdfbGlzdF9tZXJnZSAodXRhZ3MsIHdhdi0+dGFncywgR1NUX1RBR19NRVJHRV9LRUVQKTsKKworICBpZiAod2F2LT50YWdzICE9IE5VTEwpIHsKKyAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHdhdi0+dGFncyk7CisgICAgd2F2LT50YWdzID0gTlVMTDsKKyAgfQorCisgIGlmICh1dGFncyAhPSBOVUxMKQorICAgIGdzdF90YWdfbGlzdF91bnJlZiAodXRhZ3MpOworCisgIC8qIHNlbmQgdGFncyBkb3duc3RyZWFtLCBpZiBhbnkgKi8KKyAgaWYgKHRhZ3MgIT0gTlVMTCkKKyAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHdhdi0+c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3RhZyAodGFncykpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhIChHc3RXYXZQYXJzZSAqIHdhdikKK3sKKyAgR3N0QnVmZmVyICpidWYgPSBOVUxMOworICBHc3RGbG93UmV0dXJuIHJlcyA9IEdTVF9GTE9XX09LOworICBndWludDY0IGRlc2lyZWQsIG9idGFpbmVkOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBuZXh0X3RpbWVzdGFtcCwgZHVyYXRpb247CisgIGd1aW50NjQgcG9zLCBuZXh0cG9zOworCitpdGVyYXRlX2FkYXB0ZXI6CisgIEdTVF9MT0dfT0JKRUNUICh3YXYsCisgICAgICAib2Zmc2V0OiAlIiBHX0dJTlQ2NF9GT1JNQVQgIiAsIGVuZDogJSIgR19HSU5UNjRfRk9STUFUICIgLCBkYXRhbGVmdDogJSIKKyAgICAgIEdfR0lOVDY0X0ZPUk1BVCwgd2F2LT5vZmZzZXQsIHdhdi0+ZW5kX29mZnNldCwgd2F2LT5kYXRhbGVmdCk7CisKKyAgaWYgKCh3YXYtPmRhdGFsZWZ0ID09IDAgfHwgd2F2LT5kYXRhbGVmdCA8IHdhdi0+YmxvY2thbGlnbikpIHsKKyAgICAvKiBJbiBjYXNlIGNodW5rIHNpemUgaXMgbm90IGRlY2xhcmVkIGluIHRoZSBiZWdpbmluZyBnZXQgc2l6ZSBmcm9tIHRoZQorICAgICAqIGZpbGUgc2l6ZSBkaXJlY3RseSAqLworICAgIGlmICh3YXYtPmNodW5rX3NpemUgPT0gMCkgeworICAgICAgZ2ludDY0IHVwc3RyZWFtX3NpemUgPSAwOworCisgICAgICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIGZpbGUgICAqLworICAgICAgaWYgKCFnc3RfcGFkX3BlZXJfcXVlcnlfZHVyYXRpb24gKHdhdi0+c2lua3BhZCwgR1NUX0ZPUk1BVF9CWVRFUywKKyAgICAgICAgICAgICAgJnVwc3RyZWFtX3NpemUpKQorICAgICAgICBnb3RvIGZvdW5kX2VvczsKKworICAgICAgaWYgKHVwc3RyZWFtX3NpemUgPCB3YXYtPm9mZnNldCArIHdhdi0+ZGF0YXN0YXJ0KQorICAgICAgICBnb3RvIGZvdW5kX2VvczsKKworICAgICAgLyogSWYgZmlsZSBoYXMgdXBkYXRlZCBzaW5jZSB0aGUgYmVnZ2luaW5nIGNvbnRpbnVlIHJlYWRpbmcgdGhlIGZpbGUgKi8KKyAgICAgIHdhdi0+ZGF0YWxlZnQgPSB1cHN0cmVhbV9zaXplIC0gd2F2LT5vZmZzZXQgLSB3YXYtPmRhdGFzdGFydDsKKyAgICAgIHdhdi0+ZW5kX29mZnNldCA9IHVwc3RyZWFtX3NpemU7CisKKyAgICAgIC8qIEdldCB0aGUgbmV4dCBuIGJ5dGVzIGFuZCBvdXRwdXQgdGhlbSwgaWYgd2UgY2FuICovCisgICAgICBpZiAod2F2LT5kYXRhbGVmdCA9PSAwIHx8IHdhdi0+ZGF0YWxlZnQgPCB3YXYtPmJsb2NrYWxpZ24pCisgICAgICAgIGdvdG8gZm91bmRfZW9zOworICAgIH0gZWxzZSB7CisgICAgICBnb3RvIGZvdW5kX2VvczsKKyAgICB9CisgIH0KKworICAvKiBzY2FsZSB0aGUgYW1vdW50IG9mIGRhdGEgYnkgdGhlIHNlZ21lbnQgcmF0ZSBzbyB3ZSBnZXQgZXF1YWwKKyAgICogYW1vdW50cyBvZiBkYXRhIHJlZ2FyZGxlc3Mgb2YgdGhlIHBsYXliYWNrIHJhdGUgKi8KKyAgZGVzaXJlZCA9CisgICAgICBNSU4gKGdzdF9ndWludDY0X3RvX2dkb3VibGUgKHdhdi0+ZGF0YWxlZnQpLAorICAgICAgd2F2LT5tYXhfYnVmX3NpemUgKiBBQlMgKHdhdi0+c2VnbWVudC5yYXRlKSk7CisKKyAgaWYgKGRlc2lyZWQgPj0gd2F2LT5ibG9ja2FsaWduICYmIHdhdi0+YmxvY2thbGlnbiA+IDApCisgICAgZGVzaXJlZCAtPSAoZGVzaXJlZCAlIHdhdi0+YmxvY2thbGlnbik7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHdhdiwgIkZldGNoaW5nICUiIEdfR0lOVDY0X0ZPUk1BVCAiIGJ5dGVzIG9mIGRhdGEgIgorICAgICAgImZyb20gdGhlIHNpbmtwYWQiLCBkZXNpcmVkKTsKKworICBpZiAod2F2LT5zdHJlYW1pbmcpIHsKKyAgICBndWludCBhdmFpbCA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAod2F2LT5hZGFwdGVyKTsKKyAgICBndWludCBleHRyYTsKKworICAgIC8qIGZsdXNoIHNvbWUgYnl0ZXMgaWYgZXZpbCB1cHN0cmVhbSBzZW5kcyBzZWdtZW50IHRoYXQgc3RhcnRzCisgICAgICogYmVmb3JlIGRhdGEgb3IgZG9lcyBpcyBub3Qgc2VuZCBzYW1wbGUgYWxpZ25lZCBzZWdtZW50ICovCisgICAgaWYgKEdfTElLRUxZICh3YXYtPm9mZnNldCA+PSB3YXYtPmRhdGFzdGFydCkpIHsKKyAgICAgIGV4dHJhID0gKHdhdi0+b2Zmc2V0IC0gd2F2LT5kYXRhc3RhcnQpICUgd2F2LT5ieXRlc19wZXJfc2FtcGxlOworICAgIH0gZWxzZSB7CisgICAgICBleHRyYSA9IHdhdi0+ZGF0YXN0YXJ0IC0gd2F2LT5vZmZzZXQ7CisgICAgfQorCisgICAgaWYgKEdfVU5MSUtFTFkgKGV4dHJhKSkgeworICAgICAgZXh0cmEgPSB3YXYtPmJ5dGVzX3Blcl9zYW1wbGUgLSBleHRyYTsKKyAgICAgIGlmIChleHRyYSA8PSBhdmFpbCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJmbHVzaGluZyAldSBieXRlcyB0byBzYW1wbGUgYm91bmRhcnkiLCBleHRyYSk7CisgICAgICAgIGdzdF9hZGFwdGVyX2ZsdXNoICh3YXYtPmFkYXB0ZXIsIGV4dHJhKTsKKyAgICAgICAgd2F2LT5vZmZzZXQgKz0gZXh0cmE7CisgICAgICAgIHdhdi0+ZGF0YWxlZnQgLT0gZXh0cmE7CisgICAgICAgIGdvdG8gaXRlcmF0ZV9hZGFwdGVyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAiZmx1c2hpbmcgJXUgYnl0ZXMiLCBhdmFpbCk7CisgICAgICAgIGdzdF9hZGFwdGVyX2NsZWFyICh3YXYtPmFkYXB0ZXIpOworICAgICAgICB3YXYtPm9mZnNldCArPSBhdmFpbDsKKyAgICAgICAgd2F2LT5kYXRhbGVmdCAtPSBhdmFpbDsKKyAgICAgICAgcmV0dXJuIEdTVF9GTE9XX09LOworICAgICAgfQorICAgIH0KKworICAgIGlmIChhdmFpbCA8IGRlc2lyZWQpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUICh3YXYsICJHb3Qgb25seSAldSBieXRlcyBvZiBkYXRhIGZyb20gdGhlIHNpbmtwYWQiLCBhdmFpbCk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfT0s7CisgICAgfQorCisgICAgYnVmID0gZ3N0X2FkYXB0ZXJfdGFrZV9idWZmZXIgKHdhdi0+YWRhcHRlciwgZGVzaXJlZCk7CisgIH0gZWxzZSB7CisgICAgaWYgKChyZXMgPSBnc3RfcGFkX3B1bGxfcmFuZ2UgKHdhdi0+c2lua3BhZCwgd2F2LT5vZmZzZXQsCisgICAgICAgICAgICAgICAgZGVzaXJlZCwgJmJ1ZikpICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBwdWxsX2Vycm9yOworCisgICAgLyogd2UgbWF5IGdldCBhIHNob3J0IGJ1ZmZlciBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlICovCisgICAgaWYgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikgPCBkZXNpcmVkKSB7CisgICAgICBnc2l6ZSBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHdhdiwgIkdvdCBvbmx5ICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMgb2YgZGF0YSIsIHNpemUpOworICAgICAgaWYgKHNpemUgPj0gd2F2LT5ibG9ja2FsaWduKSB7CisgICAgICAgIGlmICh3YXYtPmJsb2NrYWxpZ24gPiAwKSB7CisgICAgICAgICAgYnVmID0gZ3N0X2J1ZmZlcl9tYWtlX3dyaXRhYmxlIChidWYpOworICAgICAgICAgIGdzdF9idWZmZXJfcmVzaXplIChidWYsIDAsIHNpemUgLSAoc2l6ZSAlIHdhdi0+YmxvY2thbGlnbikpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgICAgICBnb3RvIGZvdW5kX2VvczsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBvYnRhaW5lZCA9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1Zik7CisKKyAgLyogb3VyIHBvc2l0aW9ucyBpbiBieXRlcyAqLworICBwb3MgPSB3YXYtPm9mZnNldCAtIHdhdi0+ZGF0YXN0YXJ0OworICBuZXh0cG9zID0gcG9zICsgb2J0YWluZWQ7CisKKyAgLyogdXBkYXRlIG9mZnNldHMsIGRvZXMgbm90IG92ZXJmbG93LiAqLworICBidWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKGJ1Zik7CisgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpID0gcG9zIC8gd2F2LT5ieXRlc19wZXJfc2FtcGxlOworICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZikgPSBuZXh0cG9zIC8gd2F2LT5ieXRlc19wZXJfc2FtcGxlOworCisgIC8qIGZpcnN0IGNodW5rIG9mIGRhdGE/IGNyZWF0ZSB0aGUgc291cmNlIHBhZC4gV2UgZG8gdGhpcyBvbmx5IGhlcmUgc28KKyAgICogd2UgY2FuIGRldGVjdCBicm9rZW4gLndhdiBmaWxlcyB3aXRoIGR0cyBkaXNndWlzZWQgYXMgcmF3IFBDTSAoc2lnaCkgKi8KKyAgaWYgKEdfVU5MSUtFTFkgKHdhdi0+Zmlyc3QpKSB7CisgICAgd2F2LT5maXJzdCA9IEZBTFNFOworICAgIC8qIHRoaXMgd2lsbCBhbHNvIHB1c2ggdGhlIHNlZ21lbnQgZXZlbnRzICovCisgICAgZ3N0X3dhdnBhcnNlX2FkZF9zcmNfcGFkICh3YXYsIGJ1Zik7CisgIH0gZWxzZSB7CisgICAgLyogSWYgd2UgaGF2ZSBhIHBlbmRpbmcgc3RhcnQgc2VnbWVudCwgc2VuZCBpdCBub3cuICovCisgICAgaWYgKEdfVU5MSUtFTFkgKHdhdi0+c3RhcnRfc2VnbWVudCAhPSBOVUxMKSkgeworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50ICh3YXYtPnNyY3BhZCwgd2F2LT5zdGFydF9zZWdtZW50KTsKKyAgICAgIHdhdi0+c3RhcnRfc2VnbWVudCA9IE5VTEw7CisgICAgfQorICB9CisKKyAgaWYgKHdhdi0+YnBzID4gMCkgeworICAgIC8qIGFuZCB0aW1lc3RhbXBzIGlmIHdlIGhhdmUgYSBiaXRyYXRlLCBiZSBjYXJlZnVsIGZvciBvdmVyZmxvd3MgKi8KKyAgICB0aW1lc3RhbXAgPQorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfY2VpbCAocG9zLCBHU1RfU0VDT05ELCAoZ3VpbnQ2NCkgd2F2LT5icHMpOworICAgIG5leHRfdGltZXN0YW1wID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2NlaWwgKG5leHRwb3MsIEdTVF9TRUNPTkQsIChndWludDY0KSB3YXYtPmJwcyk7CisgICAgZHVyYXRpb24gPSBuZXh0X3RpbWVzdGFtcCAtIHRpbWVzdGFtcDsKKworICAgIC8qIHVwZGF0ZSBjdXJyZW50IHJ1bm5pbmcgc2VnbWVudCBwb3NpdGlvbiAqLworICAgIGlmIChHX0xJS0VMWSAobmV4dF90aW1lc3RhbXAgPj0gd2F2LT5zZWdtZW50LnN0YXJ0KSkKKyAgICAgIHdhdi0+c2VnbWVudC5wb3NpdGlvbiA9IG5leHRfdGltZXN0YW1wOworICB9IGVsc2UgaWYgKHdhdi0+ZmFjdCkgeworICAgIGd1aW50NjQgYnBzID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAod2F2LT5kYXRhc2l6ZSwgd2F2LT5yYXRlLCB3YXYtPmZhY3QpOworICAgIC8qIGFuZCB0aW1lc3RhbXBzIGlmIHdlIGhhdmUgYSBiaXRyYXRlLCBiZSBjYXJlZnVsIGZvciBvdmVyZmxvd3MgKi8KKyAgICB0aW1lc3RhbXAgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfY2VpbCAocG9zLCBHU1RfU0VDT05ELCBicHMpOworICAgIG5leHRfdGltZXN0YW1wID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2NlaWwgKG5leHRwb3MsIEdTVF9TRUNPTkQsIGJwcyk7CisgICAgZHVyYXRpb24gPSBuZXh0X3RpbWVzdGFtcCAtIHRpbWVzdGFtcDsKKyAgfSBlbHNlIHsKKyAgICAvKiBubyBiaXRyYXRlLCBhbGwgd2Uga25vdyBpcyB0aGF0IHRoZSBmaXJzdCBzYW1wbGUgaGFzIHRpbWVzdGFtcCAwLCBhbGwKKyAgICAgKiBvdGhlciBwb3NpdGlvbnMgYW5kIGR1cmF0aW9ucyBoYXZlIHVua25vd24gdGltZXN0YW1wLiAqLworICAgIGlmIChwb3MgPT0gMCkKKyAgICAgIHRpbWVzdGFtcCA9IDA7CisgICAgZWxzZQorICAgICAgdGltZXN0YW1wID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICBkdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgLyogdXBkYXRlIGN1cnJlbnQgcnVubmluZyBzZWdtZW50IHBvc2l0aW9uIHdpdGggYnl0ZSBvZmZzZXQgKi8KKyAgICBpZiAoR19MSUtFTFkgKG5leHRwb3MgPj0gd2F2LT5zZWdtZW50LnN0YXJ0KSkKKyAgICAgIHdhdi0+c2VnbWVudC5wb3NpdGlvbiA9IG5leHRwb3M7CisgIH0KKyAgaWYgKChwb3MgPiAwKSAmJiB3YXYtPnZicikgeworICAgIC8qIGRvbid0IHNldCB0aW1lc3RhbXBzIGZvciBWQlIgZmlsZXMgaWYgaXQncyBub3QgdGhlIGZpcnN0IGJ1ZmZlciAqLworICAgIHRpbWVzdGFtcCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgICAgZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9CisgIGlmICh3YXYtPmRpc2NvbnQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJtYXJraW5nIERJU0NPTlQiKTsKKyAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKyAgICB3YXYtPmRpc2NvbnQgPSBGQUxTRTsKKyAgfQorCisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpID0gdGltZXN0YW1wOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpID0gZHVyYXRpb247CisKKyAgR1NUX0xPR19PQkpFQ1QgKHdhdiwKKyAgICAgICJHb3QgYnVmZmVyLiB0aW1lc3RhbXA6JSIgR1NUX1RJTUVfRk9STUFUICIgLCBkdXJhdGlvbjolIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICIsIHNpemU6JSIgR19HU0laRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCksCisgICAgICBHU1RfVElNRV9BUkdTIChkdXJhdGlvbiksIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikpOworCisgIGlmICgocmVzID0gZ3N0X3BhZF9wdXNoICh3YXYtPnNyY3BhZCwgYnVmKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBwdXNoX2Vycm9yOworCisgIGlmIChvYnRhaW5lZCA8IHdhdi0+ZGF0YWxlZnQpIHsKKyAgICB3YXYtPm9mZnNldCArPSBvYnRhaW5lZDsKKyAgICB3YXYtPmRhdGFsZWZ0IC09IG9idGFpbmVkOworICB9IGVsc2UgeworICAgIHdhdi0+b2Zmc2V0ICs9IHdhdi0+ZGF0YWxlZnQ7CisgICAgd2F2LT5kYXRhbGVmdCA9IDA7CisgIH0KKworICAvKiBJdGVyYXRlIHVudGlsIG5lZWQgbW9yZSBkYXRhLCBzbyBhZGFwdGVyIHNpemUgd29uJ3QgZ3JvdyAqLworICBpZiAod2F2LT5zdHJlYW1pbmcpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAod2F2LAorICAgICAgICAib2Zmc2V0OiAlIiBHX0dJTlQ2NF9GT1JNQVQgIiAsIGVuZDogJSIgR19HSU5UNjRfRk9STUFULCB3YXYtPm9mZnNldCwKKyAgICAgICAgd2F2LT5lbmRfb2Zmc2V0KTsKKyAgICBnb3RvIGl0ZXJhdGVfYWRhcHRlcjsKKyAgfQorICByZXR1cm4gcmVzOworCisgIC8qIEVSUk9SICovCitmb3VuZF9lb3M6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJmb3VuZCBFT1MiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworICB9CitwdWxsX2Vycm9yOgorICB7CisgICAgLyogY2hlY2sgaWYgd2UgZ290IEVPUyAqLworICAgIGlmIChyZXMgPT0gR1NUX0ZMT1dfRU9TKQorICAgICAgZ290byBmb3VuZF9lb3M7CisKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHdhdiwKKyAgICAgICAgIkVycm9yIGdldHRpbmcgJSIgR19HSU5UNjRfRk9STUFUICIgYnl0ZXMgZnJvbSB0aGUgIgorICAgICAgICAic2lua3BhZCAoZGF0YWxlZnQgPSAlIiBHX0dJTlQ2NF9GT1JNQVQgIikiLCBkZXNpcmVkLCB3YXYtPmRhdGFsZWZ0KTsKKyAgICByZXR1cm4gcmVzOworICB9CitwdXNoX2Vycm9yOgorICB7CisgICAgR1NUX0lORk9fT0JKRUNUICh3YXYsCisgICAgICAgICJFcnJvciBwdXNoaW5nIG9uIHNyY3BhZCAlczolcywgcmVhc29uICVzLCBpcyBsaW5rZWQ/ID0gJWQiLAorICAgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKHdhdi0+c3JjcGFkKSwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJlcyksCisgICAgICAgIGdzdF9wYWRfaXNfbGlua2VkICh3YXYtPnNyY3BhZCkpOworICAgIHJldHVybiByZXM7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF93YXZwYXJzZV9sb29wIChHc3RQYWQgKiBwYWQpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RXYXZQYXJzZSAqd2F2ID0gR1NUX1dBVlBBUlNFIChHU1RfUEFEX1BBUkVOVCAocGFkKSk7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgZ2NoYXIgKnN0cmVhbV9pZDsKKworICBHU1RfTE9HX09CSkVDVCAod2F2LCAicHJvY2VzcyBkYXRhIik7CisKKyAgc3dpdGNoICh3YXYtPnN0YXRlKSB7CisgICAgY2FzZSBHU1RfV0FWUEFSU0VfU1RBUlQ6CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHdhdiwgIkdTVF9XQVZQQVJTRV9TVEFSVCIpOworICAgICAgaWYgKChyZXQgPSBnc3Rfd2F2cGFyc2Vfc3RyZWFtX2luaXQgKHdhdikpICE9IEdTVF9GTE9XX09LKQorICAgICAgICBnb3RvIHBhdXNlOworCisgICAgICBzdHJlYW1faWQgPQorICAgICAgICAgIGdzdF9wYWRfY3JlYXRlX3N0cmVhbV9pZCAod2F2LT5zcmNwYWQsIEdTVF9FTEVNRU5UX0NBU1QgKHdhdiksIE5VTEwpOworICAgICAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoc3RyZWFtX2lkKTsKKyAgICAgIGdzdF9ldmVudF9zZXRfZ3JvdXBfaWQgKGV2ZW50LCBnc3RfdXRpbF9ncm91cF9pZF9uZXh0ICgpKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAod2F2LT5zcmNwYWQsIGV2ZW50KTsKKyAgICAgIGdfZnJlZSAoc3RyZWFtX2lkKTsKKworICAgICAgd2F2LT5zdGF0ZSA9IEdTVF9XQVZQQVJTRV9IRUFERVI7CisgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKworICAgIGNhc2UgR1NUX1dBVlBBUlNFX0hFQURFUjoKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAod2F2LCAiR1NUX1dBVlBBUlNFX0hFQURFUiIpOworICAgICAgaWYgKChyZXQgPSBnc3Rfd2F2cGFyc2Vfc3RyZWFtX2hlYWRlcnMgKHdhdikpICE9IEdTVF9GTE9XX09LKQorICAgICAgICBnb3RvIHBhdXNlOworCisgICAgICB3YXYtPnN0YXRlID0gR1NUX1dBVlBBUlNFX0RBVEE7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHdhdiwgIkdTVF9XQVZQQVJTRV9EQVRBIik7CisgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKworICAgIGNhc2UgR1NUX1dBVlBBUlNFX0RBVEE6CisgICAgICBpZiAoKHJldCA9IGdzdF93YXZwYXJzZV9zdHJlYW1fZGF0YSAod2F2KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gcGF1c2U7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgIH0KKyAgcmV0dXJuOworCisgIC8qIEVSUk9SUyAqLworcGF1c2U6CisgIHsKKyAgICBjb25zdCBnY2hhciAqcmVhc29uID0gZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJwYXVzaW5nIHRhc2ssIHJlYXNvbiAlcyIsIHJlYXNvbik7CisgICAgZ3N0X3BhZF9wYXVzZV90YXNrIChwYWQpOworCisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19FT1MpIHsKKyAgICAgIC8qIGhhbmRsZSBlbmQtb2Ytc3RyZWFtL3NlZ21lbnQgKi8KKyAgICAgIC8qIHNvIGFsaWduIG91ciBwb3NpdGlvbiB3aXRoIHRoZSBlbmQgb2YgaXQsIGlmIHRoZXJlIGlzIG9uZQorICAgICAgICogdGhpcyBlbnN1cmVzIGEgc3Vic2VxdWVudCB3aWxsIGFycml2ZSBhdCBjb3JyZWN0IGJhc2UvYWNjIHRpbWUgKi8KKyAgICAgIGlmICh3YXYtPnNlZ21lbnQuZm9ybWF0ID09IEdTVF9GT1JNQVRfVElNRSkgeworICAgICAgICBpZiAod2F2LT5zZWdtZW50LnJhdGUgPiAwLjAgJiYKKyAgICAgICAgICAgIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEICh3YXYtPnNlZ21lbnQuc3RvcCkpCisgICAgICAgICAgd2F2LT5zZWdtZW50LnBvc2l0aW9uID0gd2F2LT5zZWdtZW50LnN0b3A7CisgICAgICAgIGVsc2UgaWYgKHdhdi0+c2VnbWVudC5yYXRlIDwgMC4wKQorICAgICAgICAgIHdhdi0+c2VnbWVudC5wb3NpdGlvbiA9IHdhdi0+c2VnbWVudC5zdGFydDsKKyAgICAgIH0KKyAgICAgIGlmICh3YXYtPnN0YXRlID09IEdTVF9XQVZQQVJTRV9TVEFSVCB8fCAhd2F2LT5jYXBzKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SICh3YXYsIFNUUkVBTSwgV1JPTkdfVFlQRSwgKE5VTEwpLAorICAgICAgICAgICAgKCJObyB2YWxpZCBpbnB1dCBmb3VuZCBiZWZvcmUgZW5kIG9mIHN0cmVhbSIpKTsKKyAgICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50ICh3YXYtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogYWRkIHBhZCBiZWZvcmUgd2UgcGVyZm9ybSBFT1MgKi8KKyAgICAgICAgaWYgKEdfVU5MSUtFTFkgKHdhdi0+Zmlyc3QpKSB7CisgICAgICAgICAgd2F2LT5maXJzdCA9IEZBTFNFOworICAgICAgICAgIGdzdF93YXZwYXJzZV9hZGRfc3JjX3BhZCAod2F2LCBOVUxMKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHBlcmZvcm0gRU9TIGxvZ2ljICovCisgICAgICAgIGlmICh3YXYtPnNlZ21lbnQuZmxhZ3MgJiBHU1RfU0VFS19GTEFHX1NFR01FTlQpIHsKKyAgICAgICAgICBHc3RDbG9ja1RpbWUgc3RvcDsKKworICAgICAgICAgIGlmICgoc3RvcCA9IHdhdi0+c2VnbWVudC5zdG9wKSA9PSAtMSkKKyAgICAgICAgICAgIHN0b3AgPSB3YXYtPnNlZ21lbnQuZHVyYXRpb247CisKKyAgICAgICAgICBnc3RfZWxlbWVudF9wb3N0X21lc3NhZ2UgKEdTVF9FTEVNRU5UX0NBU1QgKHdhdiksCisgICAgICAgICAgICAgIGdzdF9tZXNzYWdlX25ld19zZWdtZW50X2RvbmUgKEdTVF9PQkpFQ1RfQ0FTVCAod2F2KSwKKyAgICAgICAgICAgICAgICAgIHdhdi0+c2VnbWVudC5mb3JtYXQsIHN0b3ApKTsKKyAgICAgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHdhdi0+c3JjcGFkLAorICAgICAgICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZ21lbnRfZG9uZSAod2F2LT5zZWdtZW50LmZvcm1hdCwgc3RvcCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAod2F2LT5zcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAocmV0ID09IEdTVF9GTE9XX05PVF9MSU5LRUQgfHwgcmV0IDwgR1NUX0ZMT1dfRU9TKSB7CisgICAgICAvKiBmb3IgZmF0YWwgZXJyb3JzIHdlIHBvc3QgYW4gZXJyb3IgbWVzc2FnZSwgcG9zdCB0aGUgZXJyb3IKKyAgICAgICAqIGZpcnN0IHNvIHRoZSBhcHAga25vd3MgYWJvdXQgdGhlIGVycm9yIGZpcnN0LiAqLworICAgICAgR1NUX0VMRU1FTlRfRkxPV19FUlJPUiAod2F2LCByZXQpOworICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50ICh3YXYtPnNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF93YXZwYXJzZV9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdFdhdlBhcnNlICp3YXYgPSBHU1RfV0FWUEFSU0UgKHBhcmVudCk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHdhdiwgImFkYXB0ZXJfcHVzaCAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikpOworCisgIGdzdF9hZGFwdGVyX3B1c2ggKHdhdi0+YWRhcHRlciwgYnVmKTsKKworICBzd2l0Y2ggKHdhdi0+c3RhdGUpIHsKKyAgICBjYXNlIEdTVF9XQVZQQVJTRV9TVEFSVDoKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAod2F2LCAiR1NUX1dBVlBBUlNFX1NUQVJUIik7CisgICAgICBpZiAoKHJldCA9IGdzdF93YXZwYXJzZV9wYXJzZV9zdHJlYW1faW5pdCAod2F2KSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgaWYgKHdhdi0+c3RhdGUgIT0gR1NUX1dBVlBBUlNFX0hFQURFUikKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIG90aGVyd2lzZSBmYWxsLXRocm91Z2ggKi8KKyAgICBjYXNlIEdTVF9XQVZQQVJTRV9IRUFERVI6CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHdhdiwgIkdTVF9XQVZQQVJTRV9IRUFERVIiKTsKKyAgICAgIGlmICgocmV0ID0gZ3N0X3dhdnBhcnNlX3N0cmVhbV9oZWFkZXJzICh3YXYpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBkb25lOworCisgICAgICBpZiAoIXdhdi0+Z290X2ZtdCB8fCB3YXYtPmRhdGFzdGFydCA9PSAwKQorICAgICAgICBicmVhazsKKworICAgICAgd2F2LT5zdGF0ZSA9IEdTVF9XQVZQQVJTRV9EQVRBOworICAgICAgR1NUX0lORk9fT0JKRUNUICh3YXYsICJHU1RfV0FWUEFSU0VfREFUQSIpOworCisgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICBjYXNlIEdTVF9XQVZQQVJTRV9EQVRBOgorICAgICAgaWYgKGJ1ZiAmJiBHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKSkKKyAgICAgICAgd2F2LT5kaXNjb250ID0gVFJVRTsKKyAgICAgIGlmICgocmV0ID0gZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhICh3YXYpKSAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgZ290byBkb25lOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfcmV0dXJuX3ZhbF9pZl9yZWFjaGVkIChHU1RfRkxPV19FUlJPUik7CisgIH0KK2RvbmU6CisgIGlmIChHX1VOTElLRUxZICh3YXYtPmFib3J0X2J1ZmZlcmluZykpIHsKKyAgICB3YXYtPmFib3J0X2J1ZmZlcmluZyA9IEZBTFNFOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIC8qIHNvcnQgb2YgZGVtdXgvcGFyc2UgZXJyb3IgKi8KKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAod2F2LCBTVFJFQU0sIERFTVVYLCAoTlVMTCksICgidW5oYW5kbGVkIGJ1ZmZlciBzaXplIikpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF93YXZwYXJzZV9mbHVzaF9kYXRhIChHc3RXYXZQYXJzZSAqIHdhdikKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ3VpbnQgYXY7CisKKyAgaWYgKChhdiA9IGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAod2F2LT5hZGFwdGVyKSkgPiAwKSB7CisgICAgcmV0ID0gZ3N0X3dhdnBhcnNlX3N0cmVhbV9kYXRhICh3YXYpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2cGFyc2Vfc2lua19ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFdhdlBhcnNlICp3YXYgPSBHU1RfV0FWUEFSU0UgKHBhcmVudCk7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHdhdiwgImhhbmRsaW5nICVzIGV2ZW50IiwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOgorICAgIHsKKyAgICAgIC8qIGRpc2NhcmQsIHdlJ2xsIGNvbWUgdXAgd2l0aCBwcm9wZXIgc3JjIGNhcHMgKi8KKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6CisgICAgeworICAgICAgZ2ludDY0IHN0YXJ0LCBzdG9wLCBvZmZzZXQgPSAwLCBlbmRfb2Zmc2V0ID0gLTE7CisgICAgICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgICAgIC8qIHNvbWUgZGVidWcgb3V0cHV0ICovCisgICAgICBnc3RfZXZlbnRfY29weV9zZWdtZW50IChldmVudCwgJnNlZ21lbnQpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2LCAicmVjZWl2ZWQgbmV3c2VnbWVudCAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsCisgICAgICAgICAgJnNlZ21lbnQpOworCisgICAgICBpZiAod2F2LT5zdGF0ZSAhPSBHU1RfV0FWUEFSU0VfREFUQSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJzdGlsbCBzdGFydGluZywgZWF0aW5nIGV2ZW50Iik7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgIH0KKworICAgICAgLyogbm93IHdlIGFyZSBlaXRoZXIgY29tbWl0dGVkIHRvIFRJTUUgb3IgQllURSBmb3JtYXQsCisgICAgICAgKiBhbmQgd2Ugb25seSBleHBlY3QgYSBCWVRFIHNlZ21lbnQsIGUuZy4gZm9sbG93aW5nIGEgc2VlayAqLworICAgICAgaWYgKHNlZ21lbnQuZm9ybWF0ID09IEdTVF9GT1JNQVRfQllURVMpIHsKKyAgICAgICAgLyogaGFuZGxlICh1bilzaWduZWQgaXNzdWVzICovCisgICAgICAgIHN0YXJ0ID0gc2VnbWVudC5zdGFydDsKKyAgICAgICAgc3RvcCA9IHNlZ21lbnQuc3RvcDsKKyAgICAgICAgaWYgKHN0YXJ0ID4gMCkgeworICAgICAgICAgIG9mZnNldCA9IHN0YXJ0OworICAgICAgICAgIHN0YXJ0IC09IHdhdi0+ZGF0YXN0YXJ0OworICAgICAgICAgIHN0YXJ0ID0gTUFYIChzdGFydCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0b3AgPiAwKSB7CisgICAgICAgICAgZW5kX29mZnNldCA9IHN0b3A7CisgICAgICAgICAgc3RvcCAtPSB3YXYtPmRhdGFzdGFydDsKKyAgICAgICAgICBzdG9wID0gTUFYIChzdG9wLCAwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod2F2LT5zZWdtZW50LmZvcm1hdCA9PSBHU1RfRk9STUFUX1RJTUUpIHsKKyAgICAgICAgICBndWludDY0IGJwcyA9IHdhdi0+YnBzOworCisgICAgICAgICAgLyogb3BlcmF0aW5nIGluIGZvcm1hdCBUSU1FLCBzbyB3ZSBjYW4gY29udmVydCAqLworICAgICAgICAgIGlmICghYnBzICYmIHdhdi0+ZmFjdCkKKyAgICAgICAgICAgIGJwcyA9CisgICAgICAgICAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAod2F2LT5kYXRhc2l6ZSwgd2F2LT5yYXRlLCB3YXYtPmZhY3QpOworICAgICAgICAgIGlmIChicHMpIHsKKyAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKQorICAgICAgICAgICAgICBzdGFydCA9CisgICAgICAgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfY2VpbCAoc3RhcnQsIEdTVF9TRUNPTkQsCisgICAgICAgICAgICAgICAgICAoZ3VpbnQ2NCkgd2F2LT5icHMpOworICAgICAgICAgICAgaWYgKHN0b3AgPj0gMCkKKyAgICAgICAgICAgICAgc3RvcCA9CisgICAgICAgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfY2VpbCAoc3RvcCwgR1NUX1NFQ09ORCwKKyAgICAgICAgICAgICAgICAgIChndWludDY0KSB3YXYtPmJwcyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJ1bnN1cHBvcnRlZCBzZWdtZW50IGZvcm1hdCwgaWdub3JpbmciKTsKKyAgICAgICAgZ290byBleGl0OworICAgICAgfQorCisgICAgICBzZWdtZW50LnN0YXJ0ID0gc3RhcnQ7CisgICAgICBzZWdtZW50LnN0b3AgPSBzdG9wOworCisgICAgICAvKiBhY2NlcHQgdXBzdHJlYW0ncyBub3Rpb24gb2Ygc2VnbWVudCBhbmQgZGlzdHJpYnV0ZSBhbG9uZyAqLworICAgICAgc2VnbWVudC5mb3JtYXQgPSB3YXYtPnNlZ21lbnQuZm9ybWF0OworICAgICAgc2VnbWVudC50aW1lID0gc2VnbWVudC5wb3NpdGlvbiA9IHNlZ21lbnQuc3RhcnQ7CisgICAgICBzZWdtZW50LmR1cmF0aW9uID0gd2F2LT5zZWdtZW50LmR1cmF0aW9uOworICAgICAgc2VnbWVudC5iYXNlID0gZ3N0X3NlZ21lbnRfdG9fcnVubmluZ190aW1lICgmd2F2LT5zZWdtZW50LAorICAgICAgICAgIEdTVF9GT1JNQVRfVElNRSwgd2F2LT5zZWdtZW50LnBvc2l0aW9uKTsKKworICAgICAgZ3N0X3NlZ21lbnRfY29weV9pbnRvICgmc2VnbWVudCwgJndhdi0+c2VnbWVudCk7CisKKyAgICAgIC8qIGFsc28gc3RvcmUgdGhlIG5ld3NlZ21lbnQgZXZlbnQgZm9yIHRoZSBzdHJlYW1pbmcgdGhyZWFkICovCisgICAgICBpZiAod2F2LT5zdGFydF9zZWdtZW50KQorICAgICAgICBnc3RfZXZlbnRfdW5yZWYgKHdhdi0+c3RhcnRfc2VnbWVudCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUICh3YXYsICJTdG9yaW5nIG5ld3NlZyAlIiBHU1RfU0VHTUVOVF9GT1JNQVQsICZzZWdtZW50KTsKKyAgICAgIHdhdi0+c3RhcnRfc2VnbWVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpOworCisgICAgICAvKiBzdHJlYW0gbGVmdG92ZXIgZGF0YSBpbiBjdXJyZW50IHNlZ21lbnQgKi8KKyAgICAgIGdzdF93YXZwYXJzZV9mbHVzaF9kYXRhICh3YXYpOworICAgICAgLyogYW5kIHNldCB1cCBzdHJlYW1pbmcgdGhyZWFkIGZvciBuZXh0IG9uZSAqLworICAgICAgd2F2LT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICB3YXYtPmVuZF9vZmZzZXQgPSBlbmRfb2Zmc2V0OworCisgICAgICBpZiAod2F2LT5kYXRhc2l6ZSA+IDAgJiYgKHdhdi0+ZW5kX29mZnNldCA9PSAtMQorICAgICAgICAgICAgICB8fCB3YXYtPmVuZF9vZmZzZXQgPiB3YXYtPmRhdGFzdGFydCArIHdhdi0+ZGF0YXNpemUpKQorICAgICAgICB3YXYtPmVuZF9vZmZzZXQgPSB3YXYtPmRhdGFzdGFydCArIHdhdi0+ZGF0YXNpemU7CisKKyAgICAgIGlmICh3YXYtPmVuZF9vZmZzZXQgIT0gLTEpIHsKKyAgICAgICAgd2F2LT5kYXRhbGVmdCA9IHdhdi0+ZW5kX29mZnNldCAtIHdhdi0+b2Zmc2V0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogaW5maW5pdHk7IHVwc3RyZWFtIHdpbGwgRU9TIHdoZW4gZG9uZSAqLworICAgICAgICB3YXYtPmRhdGFsZWZ0ID0gR19NQVhVSU5UNjQ7CisgICAgICB9CisgICAgZXhpdDoKKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0VPUzoKKyAgICAgIGlmICh3YXYtPnN0YXRlID09IEdTVF9XQVZQQVJTRV9TVEFSVCB8fCAhd2F2LT5jYXBzKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SICh3YXYsIFNUUkVBTSwgV1JPTkdfVFlQRSwgKE5VTEwpLAorICAgICAgICAgICAgKCJObyB2YWxpZCBpbnB1dCBmb3VuZCBiZWZvcmUgZW5kIG9mIHN0cmVhbSIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGFkZCBwYWQgaWYgbmVlZGVkIHNvIEVPUyBpcyBzZWVuIGRvd25zdHJlYW0gKi8KKyAgICAgICAgaWYgKEdfVU5MSUtFTFkgKHdhdi0+Zmlyc3QpKSB7CisgICAgICAgICAgd2F2LT5maXJzdCA9IEZBTFNFOworICAgICAgICAgIGdzdF93YXZwYXJzZV9hZGRfc3JjX3BhZCAod2F2LCBOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBzdHJlYW0gbGVmdG92ZXIgZGF0YSBpbiBjdXJyZW50IHNlZ21lbnQgKi8KKyAgICAgICAgICBnc3Rfd2F2cGFyc2VfZmx1c2hfZGF0YSAod2F2KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVE9QOgorICAgIHsKKyAgICAgIEdzdENsb2NrVGltZSBkdXI7CisKKyAgICAgIGlmICh3YXYtPmFkYXB0ZXIpCisgICAgICAgIGdzdF9hZGFwdGVyX2NsZWFyICh3YXYtPmFkYXB0ZXIpOworICAgICAgd2F2LT5kaXNjb250ID0gVFJVRTsKKyAgICAgIGR1ciA9IHdhdi0+c2VnbWVudC5kdXJhdGlvbjsKKyAgICAgIGdzdF9zZWdtZW50X2luaXQgKCZ3YXYtPnNlZ21lbnQsIHdhdi0+c2VnbWVudC5mb3JtYXQpOworICAgICAgd2F2LT5zZWdtZW50LmR1cmF0aW9uID0gZHVyOworICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBnc3RfcGFkX2V2ZW50X2RlZmF1bHQgKHdhdi0+c2lua3BhZCwgcGFyZW50LCBldmVudCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKyNpZiAwCisvKiBjb252ZXJ0IGFuZCBxdWVyeSBzdHVmZiAqLworc3RhdGljIGNvbnN0IEdzdEZvcm1hdCAqCitnc3Rfd2F2cGFyc2VfZ2V0X2Zvcm1hdHMgKEdzdFBhZCAqIHBhZCkKK3sKKyAgc3RhdGljIGNvbnN0IEdzdEZvcm1hdCBmb3JtYXRzW10gPSB7CisgICAgR1NUX0ZPUk1BVF9USU1FLAorICAgIEdTVF9GT1JNQVRfQllURVMsCisgICAgR1NUX0ZPUk1BVF9ERUZBVUxULCAgICAgICAgIC8qIGEgImZyYW1lIiwgaWUgYSBzZXQgb2Ygc2FtcGxlcyBwZXIgSHogKi8KKyAgICAwCisgIH07CisKKyAgcmV0dXJuIGZvcm1hdHM7Cit9CisjZW5kaWYKKworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2cGFyc2VfcGFkX2NvbnZlcnQgKEdzdFBhZCAqIHBhZCwKKyAgICBHc3RGb3JtYXQgc3JjX2Zvcm1hdCwgZ2ludDY0IHNyY192YWx1ZSwKKyAgICBHc3RGb3JtYXQgKiBkZXN0X2Zvcm1hdCwgZ2ludDY0ICogZGVzdF92YWx1ZSkKK3sKKyAgR3N0V2F2UGFyc2UgKndhdnBhcnNlOworICBnYm9vbGVhbiByZXMgPSBUUlVFOworCisgIHdhdnBhcnNlID0gR1NUX1dBVlBBUlNFIChHU1RfUEFEX1BBUkVOVCAocGFkKSk7CisKKyAgaWYgKCpkZXN0X2Zvcm1hdCA9PSBzcmNfZm9ybWF0KSB7CisgICAgKmRlc3RfdmFsdWUgPSBzcmNfdmFsdWU7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBpZiAoKHdhdnBhcnNlLT5icHMgPT0gMCkgJiYgIXdhdnBhcnNlLT5mYWN0KQorICAgIGdvdG8gbm9fYnBzX2ZhY3Q7CisKKyAgR1NUX0lORk9fT0JKRUNUICh3YXZwYXJzZSwgImNvbnZlcnRpbmcgdmFsdWUgZnJvbSAlcyB0byAlcyIsCisgICAgICBnc3RfZm9ybWF0X2dldF9uYW1lIChzcmNfZm9ybWF0KSwgZ3N0X2Zvcm1hdF9nZXRfbmFtZSAoKmRlc3RfZm9ybWF0KSk7CisKKyAgc3dpdGNoIChzcmNfZm9ybWF0KSB7CisgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgc3dpdGNoICgqZGVzdF9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0RFRkFVTFQ6CisgICAgICAgICAgKmRlc3RfdmFsdWUgPSBzcmNfdmFsdWUgLyB3YXZwYXJzZS0+Ynl0ZXNfcGVyX3NhbXBsZTsKKyAgICAgICAgICAvKiBtYWtlIHN1cmUgd2UgZW5kIHVwIG9uIGEgc2FtcGxlIGJvdW5kYXJ5ICovCisgICAgICAgICAgKmRlc3RfdmFsdWUgLT0gKmRlc3RfdmFsdWUgJSB3YXZwYXJzZS0+Ynl0ZXNfcGVyX3NhbXBsZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICAgICAgLyogc3JjX3ZhbHVlICsgZGF0YXN0YXJ0ID0gb2Zmc2V0ICovCisgICAgICAgICAgR1NUX0lORk9fT0JKRUNUICh3YXZwYXJzZSwKKyAgICAgICAgICAgICAgInNyYz0lIiBHX0dJTlQ2NF9GT1JNQVQgIiwgb2Zmc2V0PSUiIEdfR0lOVDY0X0ZPUk1BVCwgc3JjX3ZhbHVlLAorICAgICAgICAgICAgICB3YXZwYXJzZS0+b2Zmc2V0KTsKKyAgICAgICAgICBpZiAod2F2cGFyc2UtPmJwcyA+IDApCisgICAgICAgICAgICAqZGVzdF92YWx1ZSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9jZWlsIChzcmNfdmFsdWUsIEdTVF9TRUNPTkQsCisgICAgICAgICAgICAgICAgKGd1aW50NjQpIHdhdnBhcnNlLT5icHMpOworICAgICAgICAgIGVsc2UgaWYgKHdhdnBhcnNlLT5mYWN0KSB7CisgICAgICAgICAgICBndWludDY0IGJwcyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnRfY2VpbCAod2F2cGFyc2UtPmRhdGFzaXplLAorICAgICAgICAgICAgICAgIHdhdnBhcnNlLT5yYXRlLCB3YXZwYXJzZS0+ZmFjdCk7CisKKyAgICAgICAgICAgICpkZXN0X3ZhbHVlID0KKyAgICAgICAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50X2NlaWwgKHNyY192YWx1ZSwgR1NUX1NFQ09ORCwgYnBzKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJlcyA9IEZBTFNFOworICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHU1RfRk9STUFUX0RFRkFVTFQ6CisgICAgICBzd2l0Y2ggKCpkZXN0X2Zvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfQllURVM6CisgICAgICAgICAgKmRlc3RfdmFsdWUgPSBzcmNfdmFsdWUgKiB3YXZwYXJzZS0+Ynl0ZXNfcGVyX3NhbXBsZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX1RJTUU6CisgICAgICAgICAgKmRlc3RfdmFsdWUgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNyY192YWx1ZSwgR1NUX1NFQ09ORCwKKyAgICAgICAgICAgICAgKGd1aW50NjQpIHdhdnBhcnNlLT5yYXRlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgR1NUX0ZPUk1BVF9USU1FOgorICAgICAgc3dpdGNoICgqZGVzdF9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHU1RfRk9STUFUX0JZVEVTOgorICAgICAgICAgIGlmICh3YXZwYXJzZS0+YnBzID4gMCkKKyAgICAgICAgICAgICpkZXN0X3ZhbHVlID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzcmNfdmFsdWUsCisgICAgICAgICAgICAgICAgKGd1aW50NjQpIHdhdnBhcnNlLT5icHMsIEdTVF9TRUNPTkQpOworICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZ3VpbnQ2NCBicHMgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50ICh3YXZwYXJzZS0+ZGF0YXNpemUsCisgICAgICAgICAgICAgICAgd2F2cGFyc2UtPnJhdGUsIHdhdnBhcnNlLT5mYWN0KTsKKworICAgICAgICAgICAgKmRlc3RfdmFsdWUgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHNyY192YWx1ZSwgYnBzLCBHU1RfU0VDT05EKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogbWFrZSBzdXJlIHdlIGVuZCB1cCBvbiBhIHNhbXBsZSBib3VuZGFyeSAqLworICAgICAgICAgICpkZXN0X3ZhbHVlIC09ICpkZXN0X3ZhbHVlICUgd2F2cGFyc2UtPmJsb2NrYWxpZ247CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICAgICpkZXN0X3ZhbHVlID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChzcmNfdmFsdWUsCisgICAgICAgICAgICAgIChndWludDY0KSB3YXZwYXJzZS0+cmF0ZSwgR1NUX1NFQ09ORCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgICAgZ290byBkb25lOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gRkFMU0U7CisgICAgICBnb3RvIGRvbmU7CisgIH0KKworZG9uZToKKyAgcmV0dXJuIHJlczsKKworICAvKiBFUlJPUlMgKi8KK25vX2Jwc19mYWN0OgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2cGFyc2UsICJicHMgMCBvciBubyBmYWN0IGNodW5rLCBjYW5ub3QgY29udmVydCIpOworICAgIHJlcyA9IEZBTFNFOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCisvKiBoYW5kbGUgcXVlcmllcyBmb3IgbG9jYXRpb24gYW5kIGxlbmd0aCBpbiByZXF1ZXN0ZWQgZm9ybWF0ICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZwYXJzZV9wYWRfcXVlcnkgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXMgPSBUUlVFOworICBHc3RXYXZQYXJzZSAqd2F2ID0gR1NUX1dBVlBBUlNFIChwYXJlbnQpOworCisgIC8qIG9ubHkgaWYgd2Uga25vdyAqLworICBpZiAod2F2LT5zdGF0ZSAhPSBHU1RfV0FWUEFSU0VfREFUQSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChwYWQsICIlcyBxdWVyeSIsIEdTVF9RVUVSWV9UWVBFX05BTUUgKHF1ZXJ5KSk7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfUE9TSVRJT046CisgICAgeworICAgICAgZ2ludDY0IGN1cmI7CisgICAgICBnaW50NjQgY3VyOworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKworICAgICAgLyogdGhpcyBpcyBub3QgdmVyeSBwcmVjaXNlLCBhcyB3ZSBoYXZlIHB1c2hlZCBzZXZlcmxhIGJ1ZmZlciB1cHN0cmVhbSBmb3IgcHJlcm9sbGluZyAqLworICAgICAgY3VyYiA9IHdhdi0+b2Zmc2V0IC0gd2F2LT5kYXRhc3RhcnQ7CisgICAgICBnc3RfcXVlcnlfcGFyc2VfcG9zaXRpb24gKHF1ZXJ5LCAmZm9ybWF0LCBOVUxMKTsKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAod2F2LCAicG9zIHF1ZXJ5IGF0ICUiIEdfR0lOVDY0X0ZPUk1BVCwgY3VyYik7CisKKyAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9CWVRFUzoKKyAgICAgICAgICBmb3JtYXQgPSBHU1RfRk9STUFUX0JZVEVTOworICAgICAgICAgIGN1ciA9IGN1cmI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmVzID0gZ3N0X3dhdnBhcnNlX3BhZF9jb252ZXJ0IChwYWQsIEdTVF9GT1JNQVRfQllURVMsIGN1cmIsCisgICAgICAgICAgICAgICZmb3JtYXQsICZjdXIpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHJlcykKKyAgICAgICAgZ3N0X3F1ZXJ5X3NldF9wb3NpdGlvbiAocXVlcnksIGZvcm1hdCwgY3VyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9EVVJBVElPTjoKKyAgICB7CisgICAgICBnaW50NjQgZHVyYXRpb24gPSAwOworICAgICAgR3N0Rm9ybWF0IGZvcm1hdDsKKworICAgICAgaWYgKHdhdi0+aWdub3JlX2xlbmd0aCkgeworICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9kdXJhdGlvbiAocXVlcnksICZmb3JtYXQsIE5VTEwpOworCisgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEdTVF9GT1JNQVRfQllURVM6eworICAgICAgICAgIGZvcm1hdCA9IEdTVF9GT1JNQVRfQllURVM7CisgICAgICAgICAgZHVyYXRpb24gPSB3YXYtPmRhdGFzaXplOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgR1NUX0ZPUk1BVF9USU1FOgorICAgICAgICAgIGlmICgocmVzID0gZ3N0X3dhdnBhcnNlX2NhbGN1bGF0ZV9kdXJhdGlvbiAod2F2KSkpIHsKKyAgICAgICAgICAgIGR1cmF0aW9uID0gd2F2LT5kdXJhdGlvbjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAocmVzKQorICAgICAgICBnc3RfcXVlcnlfc2V0X2R1cmF0aW9uIChxdWVyeSwgZm9ybWF0LCBkdXJhdGlvbik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfUVVFUllfQ09OVkVSVDoKKyAgICB7CisgICAgICBnaW50NjQgc3JjdmFsdWUsIGRzdHZhbHVlOworICAgICAgR3N0Rm9ybWF0IHNyY2Zvcm1hdCwgZHN0Zm9ybWF0OworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY29udmVydCAocXVlcnksICZzcmNmb3JtYXQsICZzcmN2YWx1ZSwKKyAgICAgICAgICAmZHN0Zm9ybWF0LCAmZHN0dmFsdWUpOworICAgICAgcmVzID0gZ3N0X3dhdnBhcnNlX3BhZF9jb252ZXJ0IChwYWQsIHNyY2Zvcm1hdCwgc3JjdmFsdWUsCisgICAgICAgICAgJmRzdGZvcm1hdCwgJmRzdHZhbHVlKTsKKyAgICAgIGlmIChyZXMpCisgICAgICAgIGdzdF9xdWVyeV9zZXRfY29udmVydCAocXVlcnksIHNyY2Zvcm1hdCwgc3JjdmFsdWUsIGRzdGZvcm1hdCwgZHN0dmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1FVRVJZX1NFRUtJTkc6eworICAgICAgR3N0Rm9ybWF0IGZtdDsKKyAgICAgIGdib29sZWFuIHNlZWthYmxlID0gRkFMU0U7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9zZWVraW5nIChxdWVyeSwgJmZtdCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICBpZiAoZm10ID09IHdhdi0+c2VnbWVudC5mb3JtYXQpIHsKKyAgICAgICAgaWYgKHdhdi0+c3RyZWFtaW5nKSB7CisgICAgICAgICAgR3N0UXVlcnkgKnE7CisKKyAgICAgICAgICBxID0gZ3N0X3F1ZXJ5X25ld19zZWVraW5nIChHU1RfRk9STUFUX0JZVEVTKTsKKyAgICAgICAgICBpZiAoKHJlcyA9IGdzdF9wYWRfcGVlcl9xdWVyeSAod2F2LT5zaW5rcGFkLCBxKSkpIHsKKyAgICAgICAgICAgIGdzdF9xdWVyeV9wYXJzZV9zZWVraW5nIChxLCAmZm10LCAmc2Vla2FibGUsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHdhdiwgInVwc3RyZWFtIEJZVEUgc2Vla2FibGUgJWQiLCBzZWVrYWJsZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGdzdF9xdWVyeV91bnJlZiAocSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHdhdiwgImxvb3BpbmcgPT4gc2Vla2FibGUiKTsKKyAgICAgICAgICBzZWVrYWJsZSA9IFRSVUU7CisgICAgICAgICAgcmVzID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChmbXQgPT0gR1NUX0ZPUk1BVF9USU1FKSB7CisgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICB9CisgICAgICBpZiAocmVzKSB7CisgICAgICAgIGdzdF9xdWVyeV9zZXRfc2Vla2luZyAocXVlcnksIGZtdCwgc2Vla2FibGUsIDAsIHdhdi0+c2VnbWVudC5kdXJhdGlvbik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcXVlcnlfZGVmYXVsdCAocGFkLCBwYXJlbnQsIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhcnNlX3NyY3BhZF9ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFdhdlBhcnNlICp3YXZwYXJzZSA9IEdTVF9XQVZQQVJTRSAocGFyZW50KTsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAod2F2cGFyc2UsICIlcyBldmVudCIsIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU0VFSzoKKyAgICAgIC8qIGNhbiBvbmx5IGhhbmRsZSBldmVudHMgd2hlbiB3ZSBhcmUgaW4gdGhlIGRhdGEgc3RhdGUgKi8KKyAgICAgIGlmICh3YXZwYXJzZS0+c3RhdGUgPT0gR1NUX1dBVlBBUlNFX0RBVEEpIHsKKyAgICAgICAgcmVzID0gZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayAod2F2cGFyc2UsIGV2ZW50KTsKKyAgICAgIH0KKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdTVF9FVkVOVF9UT0NfU0VMRUNUOgorICAgIHsKKyAgICAgIGNoYXIgKnVpZCA9IE5VTEw7CisgICAgICBHc3RUb2NFbnRyeSAqZW50cnkgPSBOVUxMOworICAgICAgR3N0RXZlbnQgKnNlZWtfZXZlbnQ7CisgICAgICBnaW50NjQgc3RhcnRfcG9zOworCisgICAgICBpZiAoIXdhdnBhcnNlLT50b2MpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAod2F2cGFyc2UsICJubyBUT0MgdG8gc2VsZWN0Iik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9ldmVudF9wYXJzZV90b2Nfc2VsZWN0IChldmVudCwgJnVpZCk7CisgICAgICAgIGlmICh1aWQgIT0gTlVMTCkgeworICAgICAgICAgIEdTVF9PQkpFQ1RfTE9DSyAod2F2cGFyc2UpOworICAgICAgICAgIGVudHJ5ID0gZ3N0X3RvY19maW5kX2VudHJ5ICh3YXZwYXJzZS0+dG9jLCB1aWQpOworICAgICAgICAgIGlmIChlbnRyeSA9PSBOVUxMKSB7CisgICAgICAgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAod2F2cGFyc2UpOworICAgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh3YXZwYXJzZSwgIm5vIFRPQyBlbnRyeSB3aXRoIGdpdmVuIFVJRDogJXMiLAorICAgICAgICAgICAgICAgIHVpZCk7CisgICAgICAgICAgICByZXMgPSBGQUxTRTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ3N0X3RvY19lbnRyeV9nZXRfc3RhcnRfc3RvcF90aW1lcyAoZW50cnksICZzdGFydF9wb3MsIE5VTEwpOworICAgICAgICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHdhdnBhcnNlKTsKKyAgICAgICAgICAgIHNlZWtfZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZWsgKDEuMCwKKyAgICAgICAgICAgICAgICBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgICAgICAgR1NUX1NFRUtfRkxBR19GTFVTSCwKKyAgICAgICAgICAgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgc3RhcnRfcG9zLCBHU1RfU0VFS19UWVBFX1NFVCwgLTEpOworICAgICAgICAgICAgcmVzID0gZ3N0X3dhdnBhcnNlX3BlcmZvcm1fc2VlayAod2F2cGFyc2UsIHNlZWtfZXZlbnQpOworICAgICAgICAgICAgZ3N0X2V2ZW50X3VucmVmIChzZWVrX2V2ZW50KTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ19mcmVlICh1aWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAod2F2cGFyc2UsICJyZWNlaXZlZCBlbXB0eSBUT0Mgc2VsZWN0IGV2ZW50Iik7CisgICAgICAgICAgcmVzID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAod2F2cGFyc2UtPnNpbmtwYWQsIGV2ZW50KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhcnNlX3NpbmtfYWN0aXZhdGUgKEdzdFBhZCAqIHNpbmtwYWQsIEdzdE9iamVjdCAqIHBhcmVudCkKK3sKKyAgR3N0V2F2UGFyc2UgKndhdiA9IEdTVF9XQVZQQVJTRSAocGFyZW50KTsKKyAgR3N0UXVlcnkgKnF1ZXJ5OworICBnYm9vbGVhbiBwdWxsX21vZGU7CisKKyAgaWYgKHdhdi0+YWRhcHRlcikgeworICAgIGdzdF9hZGFwdGVyX2NsZWFyICh3YXYtPmFkYXB0ZXIpOworICAgIGdfb2JqZWN0X3VucmVmICh3YXYtPmFkYXB0ZXIpOworICAgIHdhdi0+YWRhcHRlciA9IE5VTEw7CisgIH0KKworICBxdWVyeSA9IGdzdF9xdWVyeV9uZXdfc2NoZWR1bGluZyAoKTsKKworICBpZiAoIWdzdF9wYWRfcGVlcl9xdWVyeSAoc2lua3BhZCwgcXVlcnkpKSB7CisgICAgZ3N0X3F1ZXJ5X3VucmVmIChxdWVyeSk7CisgICAgZ290byBhY3RpdmF0ZV9wdXNoOworICB9CisKKyAgcHVsbF9tb2RlID0gZ3N0X3F1ZXJ5X2hhc19zY2hlZHVsaW5nX21vZGVfd2l0aF9mbGFncyAocXVlcnksCisgICAgICBHU1RfUEFEX01PREVfUFVMTCwgR1NUX1NDSEVEVUxJTkdfRkxBR19TRUVLQUJMRSk7CisgIGdzdF9xdWVyeV91bnJlZiAocXVlcnkpOworCisgIGlmICghcHVsbF9tb2RlKQorICAgIGdvdG8gYWN0aXZhdGVfcHVzaDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzaW5rcGFkLCAiYWN0aXZhdGluZyBwdWxsIik7CisgIHdhdi0+c3RyZWFtaW5nID0gRkFMU0U7CisgIHJldHVybiBnc3RfcGFkX2FjdGl2YXRlX21vZGUgKHNpbmtwYWQsIEdTVF9QQURfTU9ERV9QVUxMLCBUUlVFKTsKKworYWN0aXZhdGVfcHVzaDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmtwYWQsICJhY3RpdmF0aW5nIHB1c2giKTsKKyAgICB3YXYtPnN0cmVhbWluZyA9IFRSVUU7CisgICAgd2F2LT5hZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICAgIHJldHVybiBnc3RfcGFkX2FjdGl2YXRlX21vZGUgKHNpbmtwYWQsIEdTVF9QQURfTU9ERV9QVVNILCBUUlVFKTsKKyAgfQorfQorCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdnBhcnNlX3NpbmtfYWN0aXZhdGVfbW9kZSAoR3N0UGFkICogc2lua3BhZCwgR3N0T2JqZWN0ICogcGFyZW50LAorICAgIEdzdFBhZE1vZGUgbW9kZSwgZ2Jvb2xlYW4gYWN0aXZlKQoreworICBnYm9vbGVhbiByZXM7CisKKyAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBHU1RfUEFEX01PREVfUFVTSDoKKyAgICAgIHJlcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9QQURfTU9ERV9QVUxMOgorICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICAvKiBpZiB3ZSBoYXZlIGEgc2NoZWR1bGVyIHdlIGNhbiBzdGFydCB0aGUgdGFzayAqLworICAgICAgICByZXMgPSBnc3RfcGFkX3N0YXJ0X3Rhc2sgKHNpbmtwYWQsIChHc3RUYXNrRnVuY3Rpb24pIGdzdF93YXZwYXJzZV9sb29wLAorICAgICAgICAgICAgc2lua3BhZCwgTlVMTCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXMgPSBnc3RfcGFkX3N0b3BfdGFzayAoc2lua3BhZCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF93YXZwYXJzZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdFdhdlBhcnNlICp3YXYgPSBHU1RfV0FWUEFSU0UgKGVsZW1lbnQpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGdzdF93YXZwYXJzZV9yZXNldCAod2F2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUExBWUlORzoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QTEFZSU5HX1RPX1BBVVNFRDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBnc3Rfd2F2cGFyc2VfcmVzZXQgKHdhdik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3dhdnBhcnNlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RXYXZQYXJzZSAqc2VsZjsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfV0FWUEFSU0UgKG9iamVjdCkpOworICBzZWxmID0gR1NUX1dBVlBBUlNFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9JR05PUkVfTEVOR1RIOgorICAgICAgc2VsZi0+aWdub3JlX2xlbmd0aCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKHNlbGYsIHByb3BfaWQsIHBzcGVjKTsKKyAgfQorCit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2cGFyc2VfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFdhdlBhcnNlICpzZWxmOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19XQVZQQVJTRSAob2JqZWN0KSk7CisgIHNlbGYgPSBHU1RfV0FWUEFSU0UgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0lHTk9SRV9MRU5HVEg6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgc2VsZi0+aWdub3JlX2xlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChzZWxmLCBwcm9wX2lkLCBwc3BlYyk7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBnc3RfcmlmZl9pbml0ICgpOworCisgIHJldHVybiBnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAid2F2cGFyc2UiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgR1NUX1RZUEVfV0FWUEFSU0UpOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgd2F2cGFyc2UsCisgICAgIlBhcnNlIGEgLndhdiBmaWxlIGludG8gcmF3IGF1ZGlvIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oIGIvZ3N0L3dhdnBhcnNlL2dzdHdhdnBhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ0OWUzMAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC93YXZwYXJzZS9nc3R3YXZwYXJzZS5oCkBAIC0wLDAgKzEsMTM4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDE5OTk+IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBOb2tpYSBDb3Jwb3JhdGlvbiwgU3RlZmFuIEtvc3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworCisjaWZuZGVmIF9fR1NUX1dBVlBBUlNFX0hfXworI2RlZmluZSBfX0dTVF9XQVZQQVJTRV9IX18KKworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgImdzdC9yaWZmL3JpZmYtaWRzLmgiCisjaW5jbHVkZSAiZ3N0L3JpZmYvcmlmZi1yZWFkLmgiCisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YWRhcHRlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfV0FWUEFSU0UgXAorICAoZ3N0X3dhdnBhcnNlX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9XQVZQQVJTRShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1dBVlBBUlNFLEdzdFdhdlBhcnNlKSkKKyNkZWZpbmUgR1NUX1dBVlBBUlNFX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1dBVlBBUlNFLEdzdFdhdlBhcnNlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfV0FWUEFSU0Uob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9XQVZQQVJTRSkpCisjZGVmaW5lIEdTVF9JU19XQVZQQVJTRV9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9XQVZQQVJTRSkpCisKK3R5cGVkZWYgZW51bSB7CisgIEdTVF9XQVZQQVJTRV9TVEFSVCwKKyAgR1NUX1dBVlBBUlNFX0hFQURFUiwKKyAgR1NUX1dBVlBBUlNFX0RBVEEKK30gR3N0V2F2UGFyc2VTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFdhdlBhcnNlIEdzdFdhdlBhcnNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFdhdlBhcnNlQ2xhc3MgR3N0V2F2UGFyc2VDbGFzczsKKworLyoqCisgKiBHc3RXYXZQYXJzZToKKyAqCisgKiBPcGFxdWUgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBfR3N0V2F2UGFyc2UgeworICBHc3RFbGVtZW50IHBhcmVudDsKKworICAvKiBwYWRzICovCisgIEdzdFBhZCAqc2lua3BhZCwqc3JjcGFkOworCisgIC8qIGZvciBkZWxheWVkIHNvdXJjZSBwYWQgY3JlYXRpb24gZm9yIHdoZW4KKyAgICogd2UgaGF2ZSB0aGUgZmlyc3QgY2h1bmsgb2YgZGF0YSBhbmQga25vdworICAgKiB0aGUgZm9ybWF0IGZvciBzdXJlICovCisgIEdzdENhcHMgICAgICpjYXBzOworICBHc3RUYWdMaXN0ICAqdGFnczsKKyAgR3N0VG9jICAgICAgKnRvYzsKKyAgR0xpc3QgICAgICAgKmN1ZXM7CisgIEdMaXN0ICAgICAgICpsYWJsczsKKyAgR0xpc3QgICAgICAgKm5vdGVzOworICBHc3RFdmVudCAgICAqc3RhcnRfc2VnbWVudDsKKworICAvKiBXQVZFIGRlY29kaW5nIHN0YXRlICovCisgIEdzdFdhdlBhcnNlU3RhdGUgc3RhdGU7CisgIGdib29sZWFuIGFib3J0X2J1ZmZlcmluZzsKKworICAvKiBmb3JtYXQgb2YgYXVkaW8sIHNlZSBkZWZpbmVzIGJlbG93ICovCisgIGdpbnQgZm9ybWF0OworCisgIC8qIHVzZWZ1bCBhdWRpbyBkYXRhICovCisgIGd1aW50MTYgZGVwdGg7CisgIGd1aW50MzIgcmF0ZTsKKyAgZ3VpbnQxNiBjaGFubmVsczsKKyAgZ3VpbnQxNiBibG9ja2FsaWduOworICBndWludDE2IHdpZHRoOworICBndWludDMyIGF2X2JwczsKKyAgZ3VpbnQ2NCBmYWN0OworCisgIC8qIHJlYWwgYnBzIHVzZWQgb3IgMCB3aGVuIG5vIGJpdHJhdGUgaXMga25vd24gKi8KKyAgZ3VpbnQzMiBicHM7CisgIGdib29sZWFuIHZicjsKKworICBndWludCBieXRlc19wZXJfc2FtcGxlOworICBndWludCBtYXhfYnVmX3NpemU7CisKKyAgLyogcG9zaXRpb24gaW4gZGF0YSBwYXJ0ICovCisgIGd1aW50NjQJb2Zmc2V0OworICBndWludDY0CWVuZF9vZmZzZXQ7CisgIGd1aW50NjQgCWRhdGFsZWZ0OworICAvKiBvZmZzZXQvbGVuZ3RoIG9mIGRhdGEgcGFydCAqLworICBndWludDY0IAlkYXRhc3RhcnQ7CisgIGd1aW50NjQgCWRhdGFzaXplOworICAvKiBkdXJhdGlvbiBpbiB0aW1lICovCisgIGd1aW50NjQgCWR1cmF0aW9uOworCisgIC8qIHBlbmRpbmcgc2VlayAqLworICBHc3RFdmVudCAqc2Vla19ldmVudDsKKworICAvKiBGb3Igc3RyZWFtaW5nICovCisgIEdzdEFkYXB0ZXIgKmFkYXB0ZXI7CisgIGdib29sZWFuIGdvdF9mbXQ7CisgIGdib29sZWFuIHN0cmVhbWluZzsKKworICAvKiBjb25maWd1cmVkIHNlZ21lbnQsIHN0YXJ0L3N0b3AgZXhwcmVzc2VkIGluIHRpbWUgb3IgYnl0ZXMgKi8KKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIC8qIGZvciBsYXRlIHBhZCBjb25maWd1cmF0aW9uICovCisgIGdib29sZWFuIGZpcnN0OworICAvKiBkaXNjb250IGFmdGVyIHNlZWsgKi8KKyAgZ2Jvb2xlYW4gZGlzY29udDsKKworICBnYm9vbGVhbiBpZ25vcmVfbGVuZ3RoOworCisgIC8qIFNpemUgb2YgdGhlIGRhdGEgYXMgd3JpdHRlbiBpbiB0aGUgY2h1bmsgc2l6ZSAqLworICBndWludDMyIGNodW5rX3NpemU7Cit9OworCitzdHJ1Y3QgX0dzdFdhdlBhcnNlQ2xhc3MgeworICBHc3RFbGVtZW50Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3dhdnBhcnNlX2dldF90eXBlKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfV0FWUEFSU0VfSF9fICovCmRpZmYgLS1naXQgYS9nc3Qvd2F2cGFyc2UvbWVzb24uYnVpbGQgYi9nc3Qvd2F2cGFyc2UvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNlYmEzNAotLS0gL2Rldi9udWxsCisrKyBiL2dzdC93YXZwYXJzZS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDkgQEAKK2dzdHdhd3BhcnNlID0gbGlicmFyeSgnZ3N0d2F2cGFyc2UnLAorICAnZ3N0d2F2cGFyc2UuYycsCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0YmFzZV9kZXAsIGdzdHBidXRpbHNfZGVwLCBnc3RyaWZmX2RlcCwgZ3N0YXVkaW9fZGVwLAorCQkgIGdzdHRhZ19kZXAsIGxpYm1dLAorICBpbnN0YWxsIDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyLAorKQpkaWZmIC0tZ2l0IGEvZ3N0L3k0bS9NYWtlZmlsZS5hbSBiL2dzdC95NG0vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlYjM3YgotLS0gL2Rldi9udWxsCisrKyBiL2dzdC95NG0vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw5IEBACisKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdHk0bWVuYy5sYQorCitsaWJnc3R5NG1lbmNfbGFfU09VUkNFUyA9IGdzdHk0bWVuY29kZS5jCitsaWJnc3R5NG1lbmNfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQorbGliZ3N0eTRtZW5jX2xhX0xJQkFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEdTVF9MSUJTKQorbGliZ3N0eTRtZW5jX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKKworbm9pbnN0X0hFQURFUlMgPSBnc3R5NG1lbmNvZGUuaApkaWZmIC0tZ2l0IGEvZ3N0L3k0bS9nc3R5NG1lbmNvZGUuYyBiL2dzdC95NG0vZ3N0eTRtZW5jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExMTNiYwotLS0gL2Rldi9udWxsCisrKyBiL2dzdC95NG0vZ3N0eTRtZW5jb2RlLmMKQEAgLTAsMCArMSwzMTUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQteTRtZW5jCisgKgorICogPHJlZnNlY3QyPgorICogPHBhcmE+CisgKiBDcmVhdGVzIGEgWVU0TVBFRzIgcmF3IHZpZGVvIHN0cmVhbSBhcyBkZWZpbmVkIGJ5IHRoZSBtanBlZ3Rvb2xzIHByb2plY3QuCisgKiA8L3BhcmE+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZTwvdGl0bGU+CisgKiA8cGFyYT4KKyAqICh3cml0ZSBldmVyeXRoaW5nIGluIG9uZSBsaW5lLCB3aXRob3V0IHRoZSBiYWNrc2xhc2ggY2hhcmFjdGVycykKKyAqIDxwcm9ncmFtbGlzdGluZz4KKyAqIGdzdC1sYXVuY2gtMS4wIHZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0yNTAgXAorICogISAndmlkZW8veC1yYXcsZm9ybWF0PShzdHJpbmcpSTQyMCx3aWR0aD0zMjAsaGVpZ2h0PTI0MCxmcmFtZXJhdGU9KGZyYWN0aW9uKTI1LzEnIFwKKyAqICEgeTRtZW5jICEgZmlsZXNpbmsgbG9jYXRpb249dGVzdC55dXYKKyAqIDwvcHJvZ3JhbWxpc3Rpbmc+CisgKiA8L3BhcmE+CisgKiA8L3JlZnNlY3QyPgorICoKKyAqLworCisvKiBzZWUgbWpwZWd0b29scy95dXY0bXBlZy5oIGZvciB5dXY0bXBlZyBmb3JtYXQgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlICJnc3R5NG1lbmNvZGUuaCIKKworLyogRmlsdGVyIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBQUk9QXzAKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSB5NG1lbmNvZGVfc3JjX2ZhY3RvcnkgPQorR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gteXV2NG1wZWcsICIgInk0bXZlcnNpb24gPSAoaW50KSAyIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgeTRtZW5jb2RlX3NpbmtfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9WSURFT19DQVBTX01BS0UgKCJ7IElZVVYsIEk0MjAsIFk0MkIsIFk0MUIsIFk0NDQgfSIpKQorICAgICk7CisKKworc3RhdGljIHZvaWQgZ3N0X3k0bV9lbmNvZGVfcmVzZXQgKEdzdFk0bUVuY29kZSAqIGZpbHRlcik7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybiBnc3RfeTRtX2VuY29kZV9jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3k0bV9lbmNvZGVfaGFuZGxlX2ZyYW1lIChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyLAorICAgIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfeTRtX2VuY29kZV9zZXRfZm9ybWF0IChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyLAorICAgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqIHN0YXRlKTsKKworI2RlZmluZSBnc3RfeTRtX2VuY29kZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RZNG1FbmNvZGUsIGdzdF95NG1fZW5jb2RlLCBHU1RfVFlQRV9WSURFT19FTkNPREVSKTsKKworCitzdGF0aWMgdm9pZAorZ3N0X3k0bV9lbmNvZGVfY2xhc3NfaW5pdCAoR3N0WTRtRW5jb2RlQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0VmlkZW9FbmNvZGVyQ2xhc3MgKnZlbmNfY2xhc3MgPSBHU1RfVklERU9fRU5DT0RFUl9DTEFTUyAoa2xhc3MpOworCisgIGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfeTRtX2VuY29kZV9jaGFuZ2Vfc3RhdGUpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJnk0bWVuY29kZV9zcmNfZmFjdG9yeSk7CisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgJnk0bWVuY29kZV9zaW5rX2ZhY3RvcnkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiWVVWNE1QRUcgdmlkZW8gZW5jb2RlciIsICJDb2RlYy9FbmNvZGVyL1ZpZGVvIiwKKyAgICAgICJFbmNvZGVzIGEgWVVWIGZyYW1lIGludG8gdGhlIHl1djRtcGVnIGZvcm1hdCAobWpwZWd0b29scykiLAorICAgICAgIldpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+Iik7CisgIHZlbmNfY2xhc3MtPnNldF9mb3JtYXQgPSBnc3RfeTRtX2VuY29kZV9zZXRfZm9ybWF0OworICB2ZW5jX2NsYXNzLT5oYW5kbGVfZnJhbWUgPSBnc3RfeTRtX2VuY29kZV9oYW5kbGVfZnJhbWU7CisKK30KKworc3RhdGljIHZvaWQKK2dzdF95NG1fZW5jb2RlX2luaXQgKEdzdFk0bUVuY29kZSAqIGZpbHRlcikKK3sKKyAgR1NUX1BBRF9TRVRfQUNDRVBUX1RFTVBMQVRFIChHU1RfVklERU9fRU5DT0RFUl9TSU5LX1BBRCAoZmlsdGVyKSk7CisKKyAgLyogaW5pdCBwcm9wZXJ0aWVzICovCisgIGdzdF95NG1fZW5jb2RlX3Jlc2V0IChmaWx0ZXIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3k0bV9lbmNvZGVfcmVzZXQgKEdzdFk0bUVuY29kZSAqIGZpbHRlcikKK3sKKyAgZmlsdGVyLT5oZWFkZXIgPSBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfeTRtX2VuY29kZV9zZXRfZm9ybWF0IChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyLAorICAgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqIHN0YXRlKQoreworICBHc3RZNG1FbmNvZGUgKnk0bWVuYzsKKyAgR3N0VmlkZW9JbmZvICppbmZvOworICBHc3RWaWRlb0NvZGVjU3RhdGUgKm91dHB1dF9zdGF0ZTsKKworICB5NG1lbmMgPSBHU1RfWTRNX0VOQ09ERSAoZW5jb2Rlcik7CisgIGluZm8gPSAmc3RhdGUtPmluZm87CisKKyAgc3dpdGNoIChHU1RfVklERU9fSU5GT19GT1JNQVQgKGluZm8pKSB7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0k0MjA6CisgICAgICB5NG1lbmMtPmNvbG9yc3BhY2UgPSAiNDIwIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOgorICAgICAgeTRtZW5jLT5jb2xvcnNwYWNlID0gIjQyMiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQxQjoKKyAgICAgIHk0bWVuYy0+Y29sb3JzcGFjZSA9ICI0MTEiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1k0NDQ6CisgICAgICB5NG1lbmMtPmNvbG9yc3BhY2UgPSAiNDQ0IjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIGludmFsaWRfZm9ybWF0OworICB9CisKKyAgeTRtZW5jLT5pbmZvID0gKmluZm87CisKKyAgb3V0cHV0X3N0YXRlID0KKyAgICAgIGdzdF92aWRlb19lbmNvZGVyX3NldF9vdXRwdXRfc3RhdGUgKGVuY29kZXIsCisgICAgICBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXRfY2FwcyAoJnk0bWVuY29kZV9zcmNfZmFjdG9yeSksIHN0YXRlKTsKKyAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChvdXRwdXRfc3RhdGUpOworCisgIHJldHVybiBUUlVFOworCitpbnZhbGlkX2Zvcm1hdDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHk0bWVuYywgIkludmFsaWQgZm9ybWF0Iik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKK30KKworc3RhdGljIGlubGluZSBHc3RCdWZmZXIgKgorZ3N0X3k0bV9lbmNvZGVfZ2V0X3N0cmVhbV9oZWFkZXIgKEdzdFk0bUVuY29kZSAqIGZpbHRlciwgZ2Jvb2xlYW4gdGZmKQoreworICBncG9pbnRlciBoZWFkZXI7CisgIEdzdEJ1ZmZlciAqYnVmOworICBnY2hhciBpbnRlcmxhY2VkOworICBnc2l6ZSBsZW47CisKKyAgaWYgKEdTVF9WSURFT19JTkZPX0lTX0lOVEVSTEFDRUQgKCZmaWx0ZXItPmluZm8pKSB7CisgICAgaWYgKHRmZikKKyAgICAgIGludGVybGFjZWQgPSAndCc7CisgICAgZWxzZQorICAgICAgaW50ZXJsYWNlZCA9ICdiJzsKKyAgfSBlbHNlIHsKKyAgICBpbnRlcmxhY2VkID0gJ3AnOworICB9CisKKyAgaGVhZGVyID0gZ19zdHJkdXBfcHJpbnRmICgiWVVWNE1QRUcyIEMlcyBXJWQgSCVkIEklYyBGJWQ6JWQgQSVkOiVkXG4iLAorICAgICAgZmlsdGVyLT5jb2xvcnNwYWNlLCBHU1RfVklERU9fSU5GT19XSURUSCAoJmZpbHRlci0+aW5mbyksCisgICAgICBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZmaWx0ZXItPmluZm8pLCBpbnRlcmxhY2VkLAorICAgICAgR1NUX1ZJREVPX0lORk9fRlBTX04gKCZmaWx0ZXItPmluZm8pLAorICAgICAgR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZmaWx0ZXItPmluZm8pLAorICAgICAgR1NUX1ZJREVPX0lORk9fUEFSX04gKCZmaWx0ZXItPmluZm8pLAorICAgICAgR1NUX1ZJREVPX0lORk9fUEFSX0QgKCZmaWx0ZXItPmluZm8pKTsKKyAgbGVuID0gc3RybGVuIChoZWFkZXIpOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3ICgpOworICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKGJ1ZiwKKyAgICAgIGdzdF9tZW1vcnlfbmV3X3dyYXBwZWQgKDAsIGhlYWRlciwgbGVuLCAwLCBsZW4sIGhlYWRlciwgZ19mcmVlKSk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGlubGluZSBHc3RCdWZmZXIgKgorZ3N0X3k0bV9lbmNvZGVfZ2V0X2ZyYW1lX2hlYWRlciAoR3N0WTRtRW5jb2RlICogZmlsdGVyKQoreworICBncG9pbnRlciBoZWFkZXI7CisgIEdzdEJ1ZmZlciAqYnVmOworICBnc2l6ZSBsZW47CisKKyAgaGVhZGVyID0gZ19zdHJkdXBfcHJpbnRmICgiRlJBTUVcbiIpOworICBsZW4gPSBzdHJsZW4gKGhlYWRlcik7CisKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAoYnVmLAorICAgICAgZ3N0X21lbW9yeV9uZXdfd3JhcHBlZCAoMCwgaGVhZGVyLCBsZW4sIDAsIGxlbiwgaGVhZGVyLCBnX2ZyZWUpKTsKKworICByZXR1cm4gYnVmOworfQorCisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfeTRtX2VuY29kZV9oYW5kbGVfZnJhbWUgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsCisgICAgR3N0VmlkZW9Db2RlY0ZyYW1lICogZnJhbWUpCit7CisgIEdzdFk0bUVuY29kZSAqZmlsdGVyID0gR1NUX1k0TV9FTkNPREUgKGVuY29kZXIpOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworCisgIC8qIGNoZWNrIHdlIGdvdCBzb21lIGRlY2VudCBpbmZvIGZyb20gY2FwcyAqLworICBpZiAoR1NUX1ZJREVPX0lORk9fRk9STUFUICgmZmlsdGVyLT5pbmZvKSA9PSBHU1RfVklERU9fRk9STUFUX1VOS05PV04pCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoZnJhbWUtPmlucHV0X2J1ZmZlcik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFmaWx0ZXItPmhlYWRlcikpIHsKKyAgICBnYm9vbGVhbiB0ZmYgPSBGQUxTRTsKKworICAgIGlmIChHU1RfVklERU9fSU5GT19JU19JTlRFUkxBQ0VEICgmZmlsdGVyLT5pbmZvKSkgeworICAgICAgdGZmID0KKyAgICAgICAgICBHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChmcmFtZS0+aW5wdXRfYnVmZmVyLAorICAgICAgICAgIEdTVF9WSURFT19CVUZGRVJfRkxBR19URkYpOworICAgIH0KKyAgICBmcmFtZS0+b3V0cHV0X2J1ZmZlciA9IGdzdF95NG1fZW5jb2RlX2dldF9zdHJlYW1faGVhZGVyIChmaWx0ZXIsIHRmZik7CisgICAgZmlsdGVyLT5oZWFkZXIgPSBUUlVFOworICAgIGZyYW1lLT5vdXRwdXRfYnVmZmVyID0KKyAgICAgICAgZ3N0X2J1ZmZlcl9hcHBlbmQgKGZyYW1lLT5vdXRwdXRfYnVmZmVyLAorICAgICAgICBnc3RfeTRtX2VuY29kZV9nZXRfZnJhbWVfaGVhZGVyIChmaWx0ZXIpKTsKKyAgfSBlbHNlIHsKKyAgICBmcmFtZS0+b3V0cHV0X2J1ZmZlciA9IGdzdF95NG1fZW5jb2RlX2dldF9mcmFtZV9oZWFkZXIgKGZpbHRlcik7CisgIH0KKworICBmcmFtZS0+b3V0cHV0X2J1ZmZlciA9CisgICAgICBnc3RfYnVmZmVyX2FwcGVuZCAoZnJhbWUtPm91dHB1dF9idWZmZXIsCisgICAgICBnc3RfYnVmZmVyX2NvcHkgKGZyYW1lLT5pbnB1dF9idWZmZXIpKTsKKworICAvKiBkZWNvcmF0ZSAqLworICBmcmFtZS0+b3V0cHV0X2J1ZmZlciA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoZnJhbWUtPm91dHB1dF9idWZmZXIpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoZnJhbWUtPm91dHB1dF9idWZmZXIpID0gdGltZXN0YW1wOworCisgIHJldHVybiBnc3RfdmlkZW9fZW5jb2Rlcl9maW5pc2hfZnJhbWUgKGVuY29kZXIsIGZyYW1lKTsKKworbm90X25lZ290aWF0ZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZmlsdGVyLCBDT1JFLCBORUdPVElBVElPTiwgKE5VTEwpLAorICAgICAgICAoImZvcm1hdCB3YXNuJ3QgbmVnb3RpYXRlZCIpKTsKKworICAgIHJldHVybiBHU1RfRkxPV19OT1RfTkVHT1RJQVRFRDsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF95NG1fZW5jb2RlX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFk0bUVuY29kZSAqZmlsdGVyID0gR1NUX1k0TV9FTkNPREUgKGVsZW1lbnQpOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9DQUxMX1BBUkVOVF9XSVRIX0RFRkFVTFQgKEdTVF9FTEVNRU5UX0NMQVNTLCBjaGFuZ2Vfc3RhdGUsCisgICAgICAoZWxlbWVudCwgdHJhbnNpdGlvbiksIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgIGlmIChyZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKQorICAgIHJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIGdzdF95NG1fZW5jb2RlX3Jlc2V0IChmaWx0ZXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUzsKK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInk0bWVuYyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICBHU1RfVFlQRV9ZNE1fRU5DT0RFKTsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHk0bWVuYywKKyAgICAiRW5jb2RlcyBhIFlVViBmcmFtZSBpbnRvIHRoZSB5dXY0bXBlZyBmb3JtYXQgKG1qcGVndG9vbHMpIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL2dzdC95NG0vZ3N0eTRtZW5jb2RlLmggYi9nc3QveTRtL2dzdHk0bWVuY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYTdhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QveTRtL2dzdHk0bWVuY29kZS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MTk5OT4gRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfWTRNRU5DT0RFX0hfXworI2RlZmluZSBfX0dTVF9ZNE1FTkNPREVfSF9fCisKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1k0TV9FTkNPREUgXAorICAoZ3N0X3k0bV9lbmNvZGVfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX1k0TV9FTkNPREUob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSwgR1NUX1RZUEVfWTRNX0VOQ09ERSwgR3N0WTRtRW5jb2RlKSkKKyNkZWZpbmUgR1NUX1k0TV9FTkNPREVfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksIEdTVF9UWVBFX1k0TV9FTkNPREUsIEdzdFk0bUVuY29kZUNsYXNzKSkKKyNkZWZpbmUgR1NUX1k0TV9FTkNPREVfR0VUX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUygob2JqKSwgR1NUX1RZUEVfWTRNX0VOQ09ERSwgR3N0WTRtRW5jb2RlQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfWTRNX0VOQ09ERShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLCBHU1RfVFlQRV9ZNE1fRU5DT0RFKSkKKyNkZWZpbmUgR1NUX0lTX1k0TV9FTkNPREVfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksIEdTVF9UWVBFX1k0TV9FTkNPREUpKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0WTRtRW5jb2RlIEdzdFk0bUVuY29kZTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RZNG1FbmNvZGVDbGFzcyBHc3RZNG1FbmNvZGVDbGFzczsKKworc3RydWN0IF9Hc3RZNG1FbmNvZGUgeworICBHc3RWaWRlb0VuY29kZXIgcGFyZW50OworCisgIC8qIGNhcHMgaW5mb3JtYXRpb24gKi8KKyAgR3N0VmlkZW9JbmZvIGluZm87CisKKyAgY29uc3QgZ2NoYXIgKmNvbG9yc3BhY2U7CisgIC8qIHN0YXRlIGluZm9ybWF0aW9uICovCisgIGdib29sZWFuIGhlYWRlcjsKK307CisKK3N0cnVjdCBfR3N0WTRtRW5jb2RlQ2xhc3MgeworICBHc3RWaWRlb0VuY29kZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfeTRtX2VuY29kZV9nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1k0TUVOQ09ERV9IX18gKi8KZGlmZiAtLWdpdCBhL2dzdC95NG0vbWVzb24uYnVpbGQgYi9nc3QveTRtL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ODBlN2UKLS0tIC9kZXYvbnVsbAorKysgYi9nc3QveTRtL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsOCBAQAorZ3N0eTRtZW5jID0gbGlicmFyeSgnZ3N0eTRtZW5jJywKKyAgJ2dzdHk0bWVuY29kZS5jJywKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0dmlkZW9fZGVwXSwKKyAgaW5zdGFsbCA6IHRydWUsCisgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKykKZGlmZiAtLWdpdCBhL2hvb2tzL3ByZS1jb21taXQuaG9vayBiL2hvb2tzL3ByZS1jb21taXQuaG9vawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYzEwNjJiCi0tLSAvZGV2L251bGwKKysrIGIvaG9va3MvcHJlLWNvbW1pdC5ob29rCkBAIC0wLDAgKzEsODMgQEAKKyMhL2Jpbi9zaAorIworIyBDaGVjayB0aGF0IHRoZSBjb2RlIGZvbGxvd3MgYSBjb25zaXN0YW50IGNvZGUgc3R5bGUKKyMKKworIyBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIGluZGVudCwgYW5kIGVycm9yIG91dCBpZiBub3QgcHJlc2VudC4KKyMgT24gc29tZSAqYnNkIHN5c3RlbXMgdGhlIGJpbmFyeSBzZWVtcyB0byBiZSBjYWxsZWQgZ251bmluZGVudCwKKyMgc28gY2hlY2sgZm9yIHRoYXQgZmlyc3QuCisKK3ZlcnNpb249YGdudWluZGVudCAtLXZlcnNpb24gMj4vZGV2L251bGxgCitpZiB0ZXN0ICJ4JHZlcnNpb24iID0gIngiOyB0aGVuCisgIHZlcnNpb249YGdpbmRlbnQgLS12ZXJzaW9uIDI+L2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHZlcnNpb24iID0gIngiOyB0aGVuCisgICAgdmVyc2lvbj1gaW5kZW50IC0tdmVyc2lvbiAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JHZlcnNpb24iID0gIngiOyB0aGVuCisgICAgICBlY2hvICJHU3RyZWFtZXIgZ2l0IHByZS1jb21taXQgaG9vazoiCisgICAgICBlY2hvICJEaWQgbm90IGZpbmQgR05VIGluZGVudCwgcGxlYXNlIGluc3RhbGwgaXQgYmVmb3JlIGNvbnRpbnVpbmcuIgorICAgICAgZXhpdCAxCisgICAgZWxzZQorICAgICAgSU5ERU5UPWluZGVudAorICAgIGZpCisgIGVsc2UKKyAgICBJTkRFTlQ9Z2luZGVudAorICBmaQorZWxzZQorICBJTkRFTlQ9Z251aW5kZW50CitmaQorCitjYXNlIGAkSU5ERU5UIC0tdmVyc2lvbmAgaW4KKyAgR05VKikKKyAgICAgIDs7CisgIGRlZmF1bHQpCisgICAgICBlY2hvICJHU3RyZWFtZXIgZ2l0IHByZS1jb21taXQgaG9vazoiCisgICAgICBlY2hvICJEaWQgbm90IGZpbmQgR05VIGluZGVudCwgcGxlYXNlIGluc3RhbGwgaXQgYmVmb3JlIGNvbnRpbnVpbmcuIgorICAgICAgZWNobyAiKEZvdW5kICRJTkRFTlQsIGJ1dCBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgR05VIGluZGVudCkiCisgICAgICBleGl0IDEKKyAgICAgIDs7Citlc2FjCisKK0lOREVOVF9QQVJBTUVURVJTPSItLWJyYWNlcy1vbi1pZi1saW5lIFwKKwktLWNhc2UtYnJhY2UtaW5kZW50YXRpb24wIFwKKwktLWNhc2UtaW5kZW50YXRpb24yIFwKKwktLWJyYWNlcy1hZnRlci1zdHJ1Y3QtZGVjbC1saW5lIFwKKwktLWxpbmUtbGVuZ3RoODAgXAorCS0tbm8tdGFicyBcCisJLS1jdWRkbGUtZWxzZSBcCisJLS1kb250LWxpbmUtdXAtcGFyZW50aGVzZXMgXAorCS0tY29udGludWF0aW9uLWluZGVudGF0aW9uNCBcCisJLS1ob25vdXItbmV3bGluZXMgXAorCS0tdGFiLXNpemU4IFwKKwktLWluZGVudC1sZXZlbDIgXAorCS0tbGVhdmUtcHJlcHJvY2Vzc29yLXNwYWNlIgorCitlY2hvICItLUNoZWNraW5nIHN0eWxlLS0iCitmb3IgZmlsZSBpbiBgZ2l0IGRpZmYtaW5kZXggLS1jYWNoZWQgLS1uYW1lLW9ubHkgSEVBRCAtLWRpZmYtZmlsdGVyPUFDTVJ8IGdyZXAgIlwuYyQiYCA7IGRvCisgICAgIyBuZiBpcyB0aGUgdGVtcG9yYXJ5IGNoZWNrb3V0LiBUaGlzIG1ha2VzIHN1cmUgd2UgY2hlY2sgYWdhaW5zdCB0aGUKKyAgICAjIHJldmlzaW9uIGluIHRoZSBpbmRleCAoYW5kIG5vdCB0aGUgY2hlY2tlZCBvdXQgdmVyc2lvbikuCisgICAgbmY9YGdpdCBjaGVja291dC1pbmRleCAtLXRlbXAgJHtmaWxlfSB8IGN1dCAtZiAxYAorICAgIG5ld2ZpbGU9YG1rdGVtcCAvdG1wLyR7bmZ9LlhYWFhYWGAgfHwgZXhpdCAxCisgICAgJElOREVOVCAke0lOREVOVF9QQVJBTUVURVJTfSBcCisJJG5mIC1vICRuZXdmaWxlIDI+PiAvZGV2L251bGwKKyAgICAjIEZJWE1FOiBDYWxsIGluZGVudCB0d2ljZSBhcyBpdCB0ZW5kcyB0byBkbyBsaW5lLWJyZWFrcworICAgICMgZGlmZmVyZW50IGZvciBldmVyeSBzZWNvbmQgY2FsbC4KKyAgICAkSU5ERU5UICR7SU5ERU5UX1BBUkFNRVRFUlN9IFwKKyAgICAgICAgJG5ld2ZpbGUgMj4+IC9kZXYvbnVsbAorICAgIGRpZmYgLXUgLXAgIiR7bmZ9IiAiJHtuZXdmaWxlfSIKKyAgICByPSQ/CisgICAgcm0gIiR7bmV3ZmlsZX0iCisgICAgcm0gIiR7bmZ9IgorICAgIGlmIFsgJHIgIT0gMCBdIDsgdGhlbgorZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKK2VjaG8gIiBDb2RlIHN0eWxlIGVycm9yIGluOiAkZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCitlY2hvICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorZWNobyAiIFBsZWFzZSBmaXggYmVmb3JlIGNvbW1pdHRpbmcuIERvbid0IGZvcmdldCB0byBydW4gZ2l0IGFkZCBiZWZvcmUgdHJ5aW5nIHRvIGNvbW1pdCBhZ2Fpbi4gICAgICAgICIKK2VjaG8gIiBJZiB0aGUgd2hvbGUgZmlsZSBpcyB0byBiZSBjb21taXR0ZWQsIHRoaXMgc2hvdWxkIHdvcmsgKHJ1biBmcm9tIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5KTogICAgICAiCitlY2hvICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorZWNobyAiICAgZ3N0LWluZGVudCAkZmlsZTsgZ2l0IGFkZCAkZmlsZTsgZ2l0IGNvbW1pdCIKK2VjaG8gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCitlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorICAgICAgICBleGl0IDEKKyAgICBmaQorZG9uZQorZWNobyAiLS1DaGVja2luZyBzdHlsZSBwYXNzLS0iCmRpZmYgLS1naXQgYS9tNC8uZ2l0aWdub3JlIGIvbTQvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTJmNmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbTQvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDE3IEBACitjb2Rlc2V0Lm00CitnZXR0ZXh0Lm00CitnbGliYzIxLm00CitpY29udi5tNAoraW50ZGl2MC5tNAoraW50dHlwZXMtcHJpLm00CitpbnR0eXBlcy5tNAoraW50dHlwZXNfaC5tNAoraXNjLXBvc2l4Lm00CitsY21lc3NhZ2UubTQKK2xpYi1sZC5tNAorbGliLWxpbmsubTQKK2xpYi1wcmVmaXgubTQKK3Byb2d0ZXN0Lm00CitzdGRpbnRfaC5tNAordWludG1heF90Lm00Cit1bG9uZ2xvbmcubTQKZGlmZiAtLWdpdCBhL200L01ha2VmaWxlLmFtIGIvbTQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM3MzhjYQotLS0gL2Rldi9udWxsCisrKyBiL200L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzUgQEAKK0VYVFJBX0RJU1QgPSBcCisJYTUyLm00IFwKKwlhYWxpYi5tNCBcCisJYXMtZmZtcGVnLm00IFwKKwlhcy1saWJsYW1lLm00IFwKKwlhcy1zbHVycC1mZm1wZWcubTQgXAorCWNoZWNrLWxpYmhlYWRlci5tNCBcCisJY29kZXNldC5tNCBcCisJZnJlZXR5cGUyLm00IFwKKwlnZXR0ZXh0Lm00IFwKKwlnbGliYzIxLm00IFwKKwlnbGliLm00IFwKKwlnc3QtYWxzYS5tNCBcCisJZ3N0LWFydHNjLm00IFwKKwlnc3QtZmlvbnJlYWQubTQgXAorCWdzdC1pdm9yYmlzLm00IFwKKwlnc3QtbWF0cm9za2EubTQgXAorCWdzdC1zZGwubTQgXAorCWdzdC1zaG91dDIubTQgXAorCWdzdC1zaWQubTQgXAorCWd0ay5tNCBcCisJaWNvbnYubTQgXAorCWludGRpdjAubTQgXAorCWludHR5cGVzX2gubTQgXAorCWludHR5cGVzLXByaS5tNCBcCisJbGNtZXNzYWdlLm00IFwKKwlsaWJmYW1lLm00IFwKKwlsaWItbGQubTQgXAorCWxpYi1saW5rLm00IFwKKwlsaWItcHJlZml4Lm00IFwKKwlvZ2cubTQgXAorCXByb2d0ZXN0Lm00IFwKKwlzdGRpbnRfaC5tNCBcCisJdWludG1heF90Lm00IFwKKwl2b3JiaXMubTQKZGlmZiAtLWdpdCBhL200L1JFQURNRSBiL200L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDQ0NTk4Ci0tLSAvZGV2L251bGwKKysrIGIvbTQvUkVBRE1FCkBAIC0wLDAgKzEsMyBAQAorQWxsIGFjbG9jYWwgLm00IGZpbGVzIHdlIG5lZWQgYXJlIHB1dCBoZXJlIGFuZCBjYXQnZCB0byBhY2luY2x1ZGUubTQgaW4gCit0aGUgc291cmNlIHJvb3QuICBPZmZpY2lhbCBvbmVzICh0YWtlbiBmcm9tIHRoZSByZWxldmFudCBkZXZlbCBwYWNrYWdlcykgCithcmUgbmFtZWQgYXMtaXMsIHVub2ZmaWNpYWwgb25lcyAob3IgY2hhbmdlZCBvbmVzKSBnZXQgYSBnc3QtcHJlZml4LgpkaWZmIC0tZ2l0IGEvbTQvYTUyLm00IGIvbTQvYTUyLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNjVkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9hNTIubTQKQEAgLTAsMCArMSwxMjUgQEAKK2RubAorZG5sIEE1Ml9DSEVDSy1MSUJIRUFERVIoRkVBVFVSRS1OQU1FLCBMSUItTkFNRSwgTElCLUZVTkNUSU9OLCBIRUFERVItTkFNRSwKK2RubCAgICAgICAgICAgICAgICAgICAgIEFDVElPTi1JRi1GT1VORCwgQUNUSU9OLUlGLU5PVC1GT1VORCwKK2RubCAgICAgICAgICAgICAgICAgICAgIEVYVFJBLUxERkxBR1MsIEVYVFJBLUNQUEZMQUdTKQorZG5sCitkbmwgRkVBVFVSRS1OQU1FICAgICAgICAtIGZlYXR1cmUgbmFtZTsgbGlicmFyeSBhbmQgaGVhZGVyIGZpbGVzIGFyZSB0cmVhdGVkCitkbmwgICAgICAgICAgICAgICAgICAgICAgIGFzIGZlYXR1cmUsIHdoaWNoIHdlIGxvb2sgZm9yCitkbmwgTElCLU5BTUUgICAgICAgICAgICAtIGxpYnJhcnkgbmFtZSBhcyBpbiBBQ19DSEVDS19MSUIgbWFjcm8KK2RubCBMSUItRlVOQ1RJT04gICAgICAgIC0gbGlicmFyeSBzeW1ib2wgYXMgaW4gQUNfQ0hFQ0tfTElCIG1hY3JvCitkbmwgSEVBREVSLU5BTUUgICAgICAgICAtIGhlYWRlciBmaWxlIG5hbWUgYXMgaW4gQUNfQ0hFQ0tfSEVBREVSCitkbmwgQUNUSU9OLUlGLUZPVU5EICAgICAtIHdoZW4gZmVhdHVyZSBpcyBmb3VuZCB0aGVuIGV4ZWN1dGUgZ2l2ZW4gYWN0aW9uCitkbmwgQUNUSU9OLUlGLU5PVC1GT1VORCAtIHdoZW4gZmVhdHVyZSBpcyBub3QgZm91bmQgdGhlbiBleGVjdXRlIGdpdmVuIGFjdGlvbgorZG5sIEVYVFJBLUxERkxBR1MgICAgICAgLSBleHRyYSBsaW5rZXIgZmxhZ3MgKC1MIG9yIC1sKQorZG5sIEVYVFJBLUNQUEZMQUdTICAgICAgLSBleHRyYSBDIHByZXByb2Nlc3NvciBmbGFncywgaS5lLiAtSS91c3IvWDExUjYvaW5jbHVkZQorZG5sCitkbmwgQmFzZWQgb24gR1NUX0NIRUNLX0xJQkhFQURFUiBmcm9tIGdzdHJlYW1lciBwbHVnaW5zIDAuMy4xLgorZG5sCitBQ19ERUZVTihbQTUyX0NIRUNLX0xJQkhFQURFUl0sCitbCisgIEFDX0NIRUNLX0xJQihbJDJdLCBbJDNdLCBIQVZFX1skMV09eWVzLCBIQVZFX1skMV09bm8sIFskN10pCisgIGNoZWNrX2xpYmhlYWRlcl9mZWF0dXJlX25hbWU9dHJhbnNsaXQoWyQxXSwgQS1aLCBhLXopCisKKyAgaWYgdGVzdCAieCRIQVZFX1skMV0iID0gInh5ZXMiOyB0aGVuCisgICAgY2hlY2tfbGliaGVhZGVyX3NhdmVfQ1BQRkxBR1M9JENQUEZMQUdTCisgICAgQ1BQRkxBR1M9IlskOF0gJENQUEZMQUdTIgorICAgIEFDX0NIRUNLX0hFQURFUihbJDRdLCA6LCBIQVZFX1skMV09bm8pCisgICAgQ1BQRkxBR1M9JGNoZWNrX2xpYmhlYWRlcl9zYXZlX0NQUEZMQUdTCisgIGZpCisKKyAgaWYgdGVzdCAieCRIQVZFX1skMV0iID0gInh5ZXMiOyB0aGVuCisgICAgaWZlbHNlKFskNV0sICwgOiwgWyQ1XSkKKyAgZWxzZQorICAgIGlmZWxzZShbJDZdLCAsIDosIFskNl0pCisgIGZpCitdCispCisKK2RubAorZG5sIEFDX0NIRUNLX0E1MkRFQyhBQ1RJT04tSUYtRk9VTkQsIEFDVElPTi1JRi1OT1QtRk9VTkQpCitkbmwKK2RubCBBQ1RJT04tSUYtRk9VTkQgICAgIC0gd2hlbiBmZWF0dXJlIGlzIGZvdW5kIHRoZW4gZXhlY3V0ZSBnaXZlbiBhY3Rpb24KK2RubCBBQ1RJT04tSUYtTk9ULUZPVU5EIC0gd2hlbiBmZWF0dXJlIGlzIG5vdCBmb3VuZCB0aGVuIGV4ZWN1dGUgZ2l2ZW4gYWN0aW9uCitkbmwKK2RubCBEZWZpbmVzIEhBVkVfQTUyREVDIHRvIHllcyBpZiBsaWJhNTIgaXMgZm91bmQKK2RubAorZG5sIENGTEFHUyBhbmQgTERGTEFHUyBmb3IgdGhlIGxpYnJhcnkgYXJlIHN0b3JlZCBpbiBBNTJERUNfQ0ZMQUdTIGFuZAorZG5sIEE1MkRFQ19MSUJTLCByZXNwZWN0aXZlbHkKK2RubAorZG5sIEJhc2VkIG9uIEdTVF9DSEVDS19BNTJERUMgZnJvbSBnc3RyZWFtZXIgcGx1Z2lucyAwLjMuMy4xCitkbmwgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+LCBBbmR5IFdpbmdvIDx3aW5nb0Bwb2JveC5jb20+CitkbmwKK0FDX0RFRlVOKFtBQ19DSEVDS19BNTJERUNdLCAKK1tkbmwKK0FDX0FSR19XSVRIKGE1MmRlYy1wcmVmaXgsCisgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1hNTJkZWMtcHJlZml4PVBGWF0sCisgICAgICAgICAgICAgICAgICAgW3ByZWZpeCB3aGVyZSBhNTJkZWMgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldKSwKKyAgICBhNTJkZWNfY29uZmlnX3ByZWZpeD0iJHdpdGh2YWwiLCBhNTJkZWNfY29uZmlnX3ByZWZpeD0iIikKKworaWYgdGVzdCB4JGE1MmRlY19jb25maWdfcHJlZml4ID0geCA7IHRoZW4KKyAgICBBNTJfQ0hFQ0tfTElCSEVBREVSKEE1MkRFQywgYTUyLCBhNTJfaW5pdCwgYTUyZGVjL2E1Mi5oLAorICAgICAgICBBNTJERUNfTElCUz0iLWxhNTIgLWxtIiwgLCAtbG0pCitlbHNlCisgICAgQTUyX0NIRUNLX0xJQkhFQURFUihBNTJERUMsIGE1MiwgYTUyX2luaXQsIGE1MmRlYy9hNTIuaCwgWworICAgICAgICAgICAgQTUyREVDX0xJQlM9Ii1sYTUyIC1MJGE1MmRlY19jb25maWdfcHJlZml4L2xpYiAtbG0iCisgICAgICAgICAgICBBNTJERUNfQ0ZMQUdTPSItSSRhNTJkZWNfY29uZmlnX3ByZWZpeC9pbmNsdWRlIgorICAgICAgICBdLCAsIC1MJGE1MmRlY19jb25maWdfcHJlZml4L2xpYiwgLUkkYTUyZGVjX2NvbmZpZ19wcmVmaXgvaW5jbHVkZSkKK2ZpCisKK2lmIHRlc3QgJEhBVkVfQTUyREVDID0gInllcyI7IHRoZW4KKyAgICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICBhY19zYXZlX0xJQlM9IiRMSUJTIgorICAgIENGTEFHUz0iJENGTEFHUyAkQTUyREVDX0NGTEFHUyIKKyAgICBMSUJTPSIkQTUyREVDX0xJQlMgJExJQlMiCisgICAgQUNfVFJZX1JVTihbCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxhNTJkZWMvYTUyLmg+CisKK2ludCAKK21haW4gKCkKK3sKKyAgYTUyX3N0YXRlX3QgKnN0YXRlOworICBzdGF0ZSA9IGE1Ml9pbml0ICgwKTsKKyAgYTUyX2ZyZWUgKHN0YXRlKTsKKyAgcmV0dXJuIDA7Cit9CisgICAgICAgIF0sLCBIQVZFX0E1MkRFQz1ubywgW2VjaG8gJGFjX24gImNyb3NzIGNvbXBpbGluZzsgYXNzdW1lZCBPSy4uLiAkYWNfYyJdKQorCisgICAgaWYgdGVzdCBIQVZFX0E1MkRFQyA9ICJubyI7IHRoZW4KKyAgICAgICAgZWNobyAiKioqIFlvdXIgYTUyZGVjIGlzIGJvcmtlZCBzb21laG93LiBQbGVhc2UgdXBkYXRlIHRvIDAuNy40LiIKKyAgICBlbHNlCisgICAgICAgIEFDX1RSWV9SVU4oWworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8YTUyZGVjL2E1Mi5oPgorCitpbnQgCittYWluICgpCit7CisgIGludCBpID0gc2l6ZW9mIChhNTJfc3RhdGVfdCk7CisgIGlmICggaSApCisgICAgcmV0dXJuIDA7Cit9CisgICAgICAgICAgICBdLCBIQVZFX0E1MkRFQz1ubywsIFtlY2hvICRhY19uICJjcm9zcyBjb21waWxpbmc7IGFzc3VtZWQgT0suLi4gJGFjX2MiXSkKKworICAgICAgICBpZiB0ZXN0IEhBVkVfQTUyREVDID0gIm5vIjsgdGhlbgorICAgICAgICAgICAgZWNobyAiKioqIFlvdXIgYTUyZGVjIGlzIHRvbyBvbGQuIFBsZWFzZSB1cGRhdGUgdG8gMC43LjQuIgorICAgICAgICBmaQorICAgIGZpCisgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKK2ZpCisKK2lmIHRlc3QgSEFWRV9BNTJERUMgPSAibm8iOyB0aGVuCisgICAgQTUyREVDX0NGTEFHUz0iIgorICAgIEE1MkRFQ19MSUJTPSIiCitmaQorCitpZiB0ZXN0ICJ4JEhBVkVfQTUyREVDIiA9ICJ4eWVzIjsgdGhlbgorICBpZmVsc2UoWyQxXSwgLCA6LCBbJDFdKQorZWxzZQorICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKQorZmkKKworQUNfU1VCU1QoQTUyREVDX0NGTEFHUykKK0FDX1NVQlNUKEE1MkRFQ19MSUJTKQorXSkKZGlmZiAtLWdpdCBhL200L2FhbGliLm00IGIvbTQvYWFsaWIubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlMGE2NAotLS0gL2Rldi9udWxsCisrKyBiL200L2FhbGliLm00CkBAIC0wLDAgKzEsMTc4IEBACisjIENvbmZpZ3VyZSBwYXRocyBmb3IgQUFMSUIKKyMgdG91Y2hlZCB1cCBmb3IgY2xlYW4gb3V0cHV0IGJ5IFRob21hcyBWYW5kZXIgU3RpY2hlbGUKKyMgSmFuIEh1Ymlja2EgNC8yMi8yMDAxCisjIHN0b2xlbiBmcm9tIFNhbSBMYW50aW5nYSA5LzIxLzk5CisjIHN0b2xlbiBmcm9tIE1hbmlzaCBTaW5naAorIyBzdG9sZW4gYmFjayBmcm9tIEZyYW5rIEJlbGV3CisjIHN0b2xlbiBmcm9tIE1hbmlzaCBTaW5naAorIyBTaGFtZWxlc3NseSBzdG9sZW4gZnJvbSBPd2VuIFRheWxvcgorCitkbmwgQU1fUEFUSF9BQUxJQihbTUlOSU1VTS1WRVJTSU9OLCBbQUNUSU9OLUlGLUZPVU5EIFssIEFDVElPTi1JRi1OT1QtRk9VTkRdXV0pCitkbmwgVGVzdCBmb3IgQUFMSUIsIGFuZCBkZWZpbmUgQUFMSUJfQ0ZMQUdTIGFuZCBBQUxJQl9MSUJTCitkbmwKK0FDX0RFRlVOKFtBTV9QQVRIX0FBTElCXSwKK1tkbmwgCitkbmwgR2V0IHRoZSBjZmxhZ3MgYW5kIGxpYnJhcmllcyBmcm9tIHRoZSBhYWxpYi1jb25maWcgc2NyaXB0CitkbmwKK0FDX0FSR19XSVRIKGFhbGliLXByZWZpeCwKKyAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1hYWxpYi1wcmVmaXg9UEZYXSwKKyAgICAgICAgICAgICAgICAgW3ByZWZpeCB3aGVyZSBBQUxJQiBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0pLAorICBhYWxpYl9wcmVmaXg9IiR3aXRodmFsIiwgYWFsaWJfcHJlZml4PSIiKQorCitBQ19BUkdfV0lUSChhYWxpYi1leGVjLXByZWZpeCwKKyAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1hYWxpYi1leGVjLXByZWZpeD1QRlhdLAorICAgICAgICAgICAgICAgICBbZXhlYyBwcmVmaXggd2hlcmUgQUFMSUIgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldKSwKKyAgYWFsaWJfZXhlY19wcmVmaXg9IiR3aXRodmFsIiwgYWFsaWJfZXhlY19wcmVmaXg9IiIpCisKK0FDX0FSR19FTkFCTEUoYWFsaWJ0ZXN0LCAKKyAgQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1hYWxpYnRlc3RdLAorICAgICAgICAgICAgICAgICBbZG8gbm90IHRyeSB0byBjb21waWxlIGFuZCBydW4gYSB0ZXN0IEFBTElCIHByb2dyYW1dKSwKKyAgLCBlbmFibGVfYWFsaWJ0ZXN0PXllcykKKworICBpZiB0ZXN0IHgkYWFsaWJfZXhlY19wcmVmaXggIT0geCA7IHRoZW4KKyAgICAgYWFsaWJfYXJncz0iJGFhbGliX2FyZ3MgLS1leGVjLXByZWZpeD0kYWFsaWJfZXhlY19wcmVmaXgiCisgICAgIGlmIHRlc3QgeCR7QUFMSUJfQ09ORklHK3NldH0gIT0geHNldCA7IHRoZW4KKyAgICAgICAgQUFMSUJfQ09ORklHPSRhYWxpYl9leGVjX3ByZWZpeC9iaW4vYWFsaWItY29uZmlnCisgICAgIGZpCisgIGZpCisgIGlmIHRlc3QgeCRhYWxpYl9wcmVmaXggIT0geCA7IHRoZW4KKyAgICAgYWFsaWJfYXJncz0iJGFhbGliX2FyZ3MgLS1wcmVmaXg9JGFhbGliX3ByZWZpeCIKKyAgICAgaWYgdGVzdCB4JHtBQUxJQl9DT05GSUcrc2V0fSAhPSB4c2V0IDsgdGhlbgorICAgICAgICBBQUxJQl9DT05GSUc9JGFhbGliX3ByZWZpeC9iaW4vYWFsaWItY29uZmlnCisgICAgIGZpCisgIGZpCisKKyAgQUNfUEFUSF9QUk9HKEFBTElCX0NPTkZJRywgYWFsaWItY29uZmlnLCBubykKKyAgbWluX2FhbGliX3ZlcnNpb249aWZlbHNlKFskMV0sICwwLjExLjAsJDEpCisgIEFDX01TR19DSEVDS0lORyhmb3IgQUFMSUIgLSB2ZXJzaW9uID49ICRtaW5fYWFsaWJfdmVyc2lvbikKKyAgbm9fYWFsaWI9IiIKKyAgaWYgdGVzdCAiJEFBTElCX0NPTkZJRyIgPSAibm8iIDsgdGhlbgorICAgIG5vX2FhbGliPXllcworICBlbHNlCisgICAgQUFMSUJfQ0ZMQUdTPWAkQUFMSUJfQ09ORklHICRhYWxpYmNvbmZfYXJncyAtLWNmbGFnc2AKKyAgICBBQUxJQl9MSUJTPWAkQUFMSUJfQ09ORklHICRhYWxpYmNvbmZfYXJncyAtLWxpYnNgCisKKyAgICBhYWxpYl9tYWpvcl92ZXJzaW9uPWAkQUFMSUJfQ09ORklHICRhYWxpYl9hcmdzIC0tdmVyc2lvbiB8IFwKKyAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wxLydgCisgICAgYWFsaWJfbWlub3JfdmVyc2lvbj1gJEFBTElCX0NPTkZJRyAkYWFsaWJfYXJncyAtLXZlcnNpb24gfCBcCisgICAgICAgICAgIHNlZCAncy9cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS9cMi8nYAorICAgIGFhbGliX21pY3JvX3ZlcnNpb249YCRBQUxJQl9DT05GSUcgJGFhbGliX2NvbmZpZ19hcmdzIC0tdmVyc2lvbiB8IFwKKyAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wzLydgCisgICAgaWYgdGVzdCAieCRlbmFibGVfYWFsaWJ0ZXN0IiA9ICJ4eWVzIiA7IHRoZW4KKyAgICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgIENGTEFHUz0iJENGTEFHUyAkQUFMSUJfQ0ZMQUdTIgorICAgICAgTElCUz0iJExJQlMgJEFBTElCX0xJQlMiCitkbmwKK2RubCBOb3cgY2hlY2sgaWYgdGhlIGluc3RhbGxlZCBBQUxJQiBpcyBzdWZmaWNpZW50bHkgbmV3LiAoQWxzbyBzYW5pdHkKK2RubCBjaGVja3MgdGhlIHJlc3VsdHMgb2YgYWFsaWItY29uZmlnIHRvIHNvbWUgZXh0ZW50CitkbmwKKyAgICAgIHJtIC1mIGNvbmYuYWFsaWJ0ZXN0CisgICAgICBBQ19UUllfUlVOKFsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImFhbGliLmgiCisKK2NoYXIqCitteV9zdHJkdXAgKGNoYXIgKnN0cikKK3sKKyAgY2hhciAqbmV3X3N0cjsKKyAgCisgIGlmIChzdHIpCisgICAgeworICAgICAgbmV3X3N0ciA9IChjaGFyICopbWFsbG9jICgoc3RybGVuIChzdHIpICsgMSkgKiBzaXplb2YoY2hhcikpOworICAgICAgc3RyY3B5IChuZXdfc3RyLCBzdHIpOworICAgIH0KKyAgZWxzZQorICAgIG5ld19zdHIgPSBOVUxMOworICAKKyAgcmV0dXJuIG5ld19zdHI7Cit9CisKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgbWFqb3IsIG1pbm9yLCBtaWNybzsKKyAgY2hhciAqdG1wX3ZlcnNpb247CisKKyAgLyogVGhpcyBoYW5ncyBvbiBzb21lIHN5c3RlbXMgKD8pCisgIHN5c3RlbSAoInRvdWNoIGNvbmYuYWFsaWJ0ZXN0Iik7CisgICovCisgIHsgRklMRSAqZnAgPSBmb3BlbigiY29uZi5hYWxpYnRlc3QiLCAiYSIpOyBpZiAoIGZwICkgZmNsb3NlKGZwKTsgfQorCisgIC8qIEhQL1VYIDkgKCVAIyEpIHdyaXRlcyB0byBzc2NhbmYgc3RyaW5ncyAqLworICB0bXBfdmVyc2lvbiA9IG15X3N0cmR1cCgiJG1pbl9hYWxpYl92ZXJzaW9uIik7CisgIGlmIChzc2NhbmYodG1wX3ZlcnNpb24sICIlZC4lZC4lZCIsICZtYWpvciwgJm1pbm9yLCAmbWljcm8pICE9IDMpIHsKKyAgICAgcHJpbnRmKCIlcywgYmFkIHZlcnNpb24gc3RyaW5nXG4iLCAiJG1pbl9hYWxpYl92ZXJzaW9uIik7CisgICAgIGV4aXQoMSk7CisgICB9CisKKyAgIGlmICgoJGFhbGliX21ham9yX3ZlcnNpb24gPiBtYWpvcikgfHwKKyAgICAgICgoJGFhbGliX21ham9yX3ZlcnNpb24gPT0gbWFqb3IpICYmICgkYWFsaWJfbWlub3JfdmVyc2lvbiA+IG1pbm9yKSkgfHwKKyAgICAgICgoJGFhbGliX21ham9yX3ZlcnNpb24gPT0gbWFqb3IpICYmICgkYWFsaWJfbWlub3JfdmVyc2lvbiA9PSBtaW5vcikgJiYgKCRhYWxpYl9taWNyb192ZXJzaW9uID49IG1pY3JvKSkpCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRmKCJcbioqKiAnYWFsaWItY29uZmlnIC0tdmVyc2lvbicgcmV0dXJuZWQgJWQuJWQuJWQsIGJ1dCB0aGUgbWluaW11bSB2ZXJzaW9uXG4iLCAkYWFsaWJfbWFqb3JfdmVyc2lvbiwgJGFhbGliX21pbm9yX3ZlcnNpb24sICRhYWxpYl9taWNyb192ZXJzaW9uKTsKKyAgICAgIHByaW50ZigiKioqIG9mIEFBTElCIHJlcXVpcmVkIGlzICVkLiVkLiVkLiBJZiBhYWxpYi1jb25maWcgaXMgY29ycmVjdCwgdGhlbiBpdCBpc1xuIiwgbWFqb3IsIG1pbm9yLCBtaWNybyk7CisgICAgICBwcmludGYoIioqKiBiZXN0IHRvIHVwZ3JhZGUgdG8gdGhlIHJlcXVpcmVkIHZlcnNpb24uXG4iKTsKKyAgICAgIHByaW50ZigiKioqIElmIGFhbGliLWNvbmZpZyB3YXMgd3JvbmcsIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQUFMSUJfQ09ORklHXG4iKTsKKyAgICAgIHByaW50ZigiKioqIHRvIHBvaW50IHRvIHRoZSBjb3JyZWN0IGNvcHkgb2YgYWFsaWItY29uZmlnLCBhbmQgcmVtb3ZlIHRoZSBmaWxlXG4iKTsKKyAgICAgIHByaW50ZigiKioqIGNvbmZpZy5jYWNoZSBiZWZvcmUgcmUtcnVubmluZyBjb25maWd1cmVcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCitdLCwgbm9fYWFsaWI9eWVzLFtlY2hvICRhY19uICJjcm9zcyBjb21waWxpbmc7IGFzc3VtZWQgT0suLi4gJGFjX2MiXSkKKyAgICAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKyAgICAgICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorICAgICBmaQorICBmaQorICBpZiB0ZXN0ICJ4JG5vX2FhbGliIiA9IHggOyB0aGVuCisgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKSAgICAgCisgIGVsc2UKKyAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgaWYgdGVzdCAiJEFBTElCX0NPTkZJRyIgPSAibm8iIDsgdGhlbgorICAgICAgIGVjaG8gIioqKiBUaGUgYWFsaWItY29uZmlnIHNjcmlwdCBpbnN0YWxsZWQgYnkgQUFMSUIgY291bGQgbm90IGJlIGZvdW5kIgorICAgICAgIGVjaG8gIioqKiBJZiBBQUxJQiB3YXMgaW5zdGFsbGVkIGluIFBSRUZJWCwgbWFrZSBzdXJlIFBSRUZJWC9iaW4gaXMgaW4iCisgICAgICAgZWNobyAiKioqIHlvdXIgcGF0aCwgb3Igc2V0IHRoZSBBQUxJQl9DT05GSUcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIgorICAgICAgIGVjaG8gIioqKiBmdWxsIHBhdGggdG8gYWFsaWItY29uZmlnLiIKKyAgICAgZWxzZQorICAgICAgIGlmIHRlc3QgLWYgY29uZi5hYWxpYnRlc3QgOyB0aGVuCisgICAgICAgIDoKKyAgICAgICBlbHNlCisgICAgICAgICAgZWNobyAiKioqIENvdWxkIG5vdCBydW4gQUFMSUIgdGVzdCBwcm9ncmFtLCBjaGVja2luZyB3aHkuLi4iCisgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRBQUxJQl9DRkxBR1MiCisgICAgICAgICAgTElCUz0iJExJQlMgJEFBTElCX0xJQlMiCisgICAgICAgICAgQUNfVFJZX0xJTksoWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiQUFMSUIuaCIKK10sICAgICAgWyByZXR1cm4gMDsgXSwKKyAgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBjb21waWxlZCwgYnV0IGRpZCBub3QgcnVuLiBUaGlzIHVzdWFsbHkgbWVhbnMiCisgICAgICAgICAgZWNobyAiKioqIHRoYXQgdGhlIHJ1bi10aW1lIGxpbmtlciBpcyBub3QgZmluZGluZyBBQUxJQiBvciBmaW5kaW5nIHRoZSB3cm9uZyIKKyAgICAgICAgICBlY2hvICIqKiogdmVyc2lvbiBvZiBBQUxJQi4gSWYgaXQgaXMgbm90IGZpbmRpbmcgQUFMSUIsIHlvdSdsbCBuZWVkIHRvIHNldCB5b3VyIgorICAgICAgICAgIGVjaG8gIioqKiBMRF9MSUJSQVJZX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGVkaXQgL2V0Yy9sZC5zby5jb25mIHRvIHBvaW50IgorICAgICAgICAgIGVjaG8gIioqKiB0byB0aGUgaW5zdGFsbGVkIGxvY2F0aW9uICBBbHNvLCBtYWtlIHN1cmUgeW91IGhhdmUgcnVuIGxkY29uZmlnIGlmIHRoYXQiCisgICAgICAgICAgZWNobyAiKioqIGlzIHJlcXVpcmVkIG9uIHlvdXIgc3lzdGVtIgorCSAgZWNobyAiKioqIgorICAgICAgICAgIGVjaG8gIioqKiBJZiB5b3UgaGF2ZSBhbiBvbGQgdmVyc2lvbiBpbnN0YWxsZWQsIGl0IGlzIGJlc3QgdG8gcmVtb3ZlIGl0LCBhbHRob3VnaCIKKyAgICAgICAgICBlY2hvICIqKiogeW91IG1heSBhbHNvIGJlIGFibGUgdG8gZ2V0IHRoaW5ncyB0byB3b3JrIGJ5IG1vZGlmeWluZyBMRF9MSUJSQVJZX1BBVEgiXSwKKyAgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBmYWlsZWQgdG8gY29tcGlsZSBvciBsaW5rLiBTZWUgdGhlIGZpbGUgY29uZmlnLmxvZyBmb3IgdGhlIgorICAgICAgICAgIGVjaG8gIioqKiBleGFjdCBlcnJvciB0aGF0IG9jY3VyZWQuIFRoaXMgdXN1YWxseSBtZWFucyBBQUxJQiB3YXMgaW5jb3JyZWN0bHkgaW5zdGFsbGVkIgorICAgICAgICAgIGVjaG8gIioqKiBvciB0aGF0IHlvdSBoYXZlIG1vdmVkIEFBTElCIHNpbmNlIGl0IHdhcyBpbnN0YWxsZWQuIEluIHRoZSBsYXR0ZXIgY2FzZSwgeW91IgorICAgICAgICAgIGVjaG8gIioqKiBtYXkgd2FudCB0byBlZGl0IHRoZSBhYWxpYi1jb25maWcgc2NyaXB0OiAkQUFMSUJfQ09ORklHIiBdKQorICAgICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgICAgZmkKKyAgICAgZmkKKyAgICAgQUFMSUJfQ0ZMQUdTPSIiCisgICAgIEFBTElCX0xJQlM9IiIKKyAgICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKKyAgZmkKKyAgQUNfU1VCU1QoQUFMSUJfQ0ZMQUdTKQorICBBQ19TVUJTVChBQUxJQl9MSUJTKQorICBybSAtZiBjb25mLmFhbGlidGVzdAorXSkKZGlmZiAtLWdpdCBhL200L2FzLWZmbXBlZy5tNCBiL200L2FzLWZmbXBlZy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTBjMzhkCi0tLSAvZGV2L251bGwKKysrIGIvbTQvYXMtZmZtcGVnLm00CkBAIC0wLDAgKzEsOTkgQEAKKyMgQ0ZMQUdTIGFuZCBsaWJyYXJ5IHBhdGhzIGZvciBGRk1QRUcKKyMgdGFrZW4gZnJvbSBBdXRvc3RhciBTYW5kYm94LCBodHRwOi8vYXV0b3N0YXJzLnNvdXJjZWZvcmdlLm5ldC8KKworZG5sIFVzYWdlOgorZG5sIEFNX1BBVEhfRkZNUEVHKFtNSU5JTVVNLVZFUlNJT04sIFtBQ1RJT04tSUYtRk9VTkQgWywgQUNUSU9OLUlGLU5PVC1GT1VORF1dXSkKK2RubCBGSVhNRTogdmVyc2lvbiBjaGVja2luZyBkb2VzIG5vdCB3b3JrIGN1cnJlbnRseQorZG5sCitkbmwgRXhhbXBsZToKK2RubCBBTV9QQVRIX0ZGTVBFRygwLjQuNiwgLCBBQ19NU0dfRVJST1IoWyoqKiBGRk1QRUcgPj0gMC40LjYgbm90IGluc3RhbGxlZCkpIAorZG5sCitkbmwgRGVmaW5lcyBGRk1QRUdfTElCUworZG5sIEZJWE1FOiBzaG91bGQgZGVmaW5lIEZGTVBFR19WRVJTSU9OCitkbmwKKworQUNfREVGVU4oW0FNX1BBVEhfRkZNUEVHXSwKK1sKKyAgZG5sIGFsbG93IGZvciBzcGVjaWZpY2F0aW9uIG9mIGEgc291cmNlIHBhdGggKGZvciB1bmluc3RhbGxlZCkKKyAgQUNfQVJHX1dJVEgoZmZtcGVnLXNvdXJjZSwKKyAgICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWZmbXBlZy1zb3VyY2U9RElSXSwKKyAgICAgICAgICAgICAgICAgICBbRGlyZWN0b3J5IHdoZXJlIEZGbXBlZyBzb3VyY2UgaXMgKG9wdGlvbmFsKV0pLAorICAgIGZmbXBlZ19zb3VyY2U9IiR3aXRodmFsIikKKworICBkbmwgc2F2ZSBDRkxBR1MgYW5kIExJQlMgaGVyZQorICBDRkxBR1Nfc2F2ZT0kQ0ZMQUdTCisgIExJQlNfc2F2ZT0kTElCUworICBpZiB0ZXN0ICJ4JGZmbXBlZ19zb3VyY2UiICE9ICJ4IjsgdGhlbgorICAgIGRubCB1bmluc3RhbGxlZCBGRm1wZWcgY29weQorICAgIEFDX01TR19OT1RJQ0UoW0xvb2tpbmcgZm9yIEZGbXBlZyBzb3VyY2UgaW4gJGZmbXBlZ19zb3VyY2VdKQorICAgIENGTEFHUz0iLUkkZmZtcGVnX3NvdXJjZS9saWJhdiAtSSRmZm1wZWdfc291cmNlL2xpYmF2Y29kZWMiCisgICAgTElCUz0iLUwkZmZtcGVnX3NvdXJjZS9saWJhdiAtTCRmZm1wZWdfc291cmNlL2xpYmF2Y29kZWMiCisgICAgQUNfREVGSU5FX1VOUVVPVEVEKEhBVkVfRkZNUEVHX1VOSU5TVEFMTEVELCAxLAorICAgICAgICAgICAgICAgICAgICAgICBbZGVmaW5lZCBpZiB3ZSBjb21waWxlIGFnYWluc3QgdW5pbnN0YWxsZWQgRkZtcGVnXSkKKyAgICBGRk1QRUdfQ09NTU9OX0lOQ0xVREU9IiNpbmNsdWRlIDxjb21tb24uaD4iCisgIGVsc2UKKyAgICBGRk1QRUdfQ09NTU9OX0lOQ0xVREU9IiNpbmNsdWRlIDxmZm1wZWcvY29tbW9uLmg+IgorICBmaQorICAKKyAgZG5sIGNoZWNrIGZvciBsaWJhdmNvZGVjCisgIEFDX0NIRUNLX0xJQihhdmNvZGVjLCBhdmNvZGVjX2luaXQsIEhBVkVfRkZNUEVHPXllcywgSEFWRV9GRk1QRUc9bm8pCisgIAorICBkbmwgY2hlY2sgZm9yIGF2Y29kZWMuaCBhbmQgYXZmb3JtYXQuaAorICBpZiB0ZXN0ICJ4JGZmbXBlZ19zb3VyY2UiICE9ICJ4IjsgdGhlbgorICAgIGRubCB1bmluc3RhbGxlZAorICAgIEFDX0NIRUNLX0hFQURFUihhdmNvZGVjLmgsICwgSEFWRV9GRk1QRUc9bm8sIFsvKiBvbmx5IGNvbXBpbGUgKi9dKQorICAgIEFDX0NIRUNLX0hFQURFUihhdmZvcm1hdC5oLCAsIEhBVkVfRkZNUEVHPW5vLCBbLyogb25seSBjb21waWxlICovXSkKKyAgZWxzZQorICAgIEFDX0NIRUNLX0hFQURFUihmZm1wZWcvYXZjb2RlYy5oLCAsIEhBVkVfRkZNUEVHPW5vKQorICAgIEFDX0NIRUNLX0hFQURFUihmZm1wZWcvYXZmb3JtYXQuaCwgLCBIQVZFX0ZGTVBFRz1ubykKKyAgZmkKKworZG5sIG5vdyBjaGVjayBpZiBpdCdzIHN1ZmZpY2llbnRseSBuZXcKKworICBBQ19MQU5HX1NBVkUoKQorICBBQ19MQU5HX0MoKQorCisgIGRubCBGSVhNRTogd2UgdXNlIHN0cmNtcCwgd2hpY2ggd2Uga25vdyBpcyBnb2luZyB0byBicmVhayBpZiBmZm1wZWcgZXZlciB1c2VzCisgIGRubCB0d28gZGlnaXRzIGZvciBhbnkgb2YgdGhlaXIgdmVyc2lvbiBudW1iZXJzLiAgSXQgbWFrZXMgdGhlIHRlc3Qgc28gbXVjaAorICBkbmwgZWFzaWVyIHRob3VnaCBzbyBsZXQncyBpZ25vcmUgdGhhdAorICBBQ19UUllfUlVOKFsKKyRGRk1QRUdfQ09NTU9OX0lOQ0xVREUKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitpbnQKK21haW4gKCkKK3sKKyAgaWYgKHN0cmNtcCAoRkZNUEVHX1ZFUlNJT04sICIkMSIpID09IC0xKQorICB7CisgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICAgICJFUlJPUjogeW91ciBjb3B5IG9mIGZmbXBlZyBpcyB0b28gb2xkICglcylcbiIsIEZGTVBFR19WRVJTSU9OKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CitdLCAsIEhBVkVfRkZNUEVHPW5vKQorCitkbmwgbm93IGRvIHRoZSBhY3R1YWwgImRvIHdlIGhhdmUgaXQgPyIgdGVzdAorICBpZiB0ZXN0ICJ4JEhBVkVfRkZNUEVHIiA9ICJ4eWVzIjsgdGhlbgorICAgIEZGTVBFR19MSUJTPSIkTElCUyAtbGF2Y29kZWMgLWxhdmZvcm1hdCIKKyAgICBGRk1QRUdfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgIEFDX01TR19OT1RJQ0Uod2UgaGF2ZSBmZm1wZWcpCisgICAgZG5sIGV4ZWN1dGUgd2hhdCB3ZSBoYXZlIHRvIGJlY2F1c2UgaXQncyBmb3VuZAorICAgIGlmZWxzZShbJDJdLCAsIDosIFskMl0pCisgIGVsc2UKKyAgICBGRk1QRUdfTElCUz0iIgorICAgIEZGTVBFR19DRkxBR1M9IiIKKyAgICBkbmwgZXhlY3V0ZSB3aGF0IHdlIGhhdmUgdG8gYmVjYXVzZSBpdCdzIG5vdCBmb3VuZAorICAgIGlmZWxzZShbJDNdLCAsIDosIFskM10pCisgIGZpCisKK2RubCBtYWtlIHZhcmlhYmxlcyBhdmFpbGFibGUKKyAgQUNfU1VCU1QoRkZNUEVHX0xJQlMpCisgIEFDX1NVQlNUKEZGTVBFR19DRkxBR1MpCisgIEFDX1NVQlNUKEhBVkVfRkZNUEVHKQorICBBQ19MQU5HX1JFU1RPUkUoKQorICBDRkxBR1M9JENGTEFHU19zYXZlCisgIExJQlM9JExJQlNfc2F2ZQorXSkKZGlmZiAtLWdpdCBhL200L2FzLWxpYmxhbWUubTQgYi9tNC9hcy1saWJsYW1lLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNzA3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9hcy1saWJsYW1lLm00CkBAIC0wLDAgKzEsNTAgQEAKKyMgQ0ZMQUdTIGFuZCBsaWJyYXJ5IHBhdGhzIGZvciBMSUJMQU1FCisjIHRha2VuIGZyb20gQXV0b3N0YXIgU2FuZGJveCwgaHR0cDovL2F1dG9zdGFycy5zb3VyY2Vmb3JnZS5uZXQvCisjIGluc3BpcmVkIGJ5IHhtbXMubTQKKworZG5sIFVzYWdlOgorZG5sIEFNX1BBVEhfTElCTEFNRShbTUlOSU1VTS1WRVJTSU9OLCBbQUNUSU9OLUlGLUZPVU5EIFssIEFDVElPTi1JRi1OT1QtRk9VTkRdXV0pCitkbmwgRklYTUU6IHZlcnNpb24gY2hlY2tpbmcgZG9lcyBub3Qgd29yayBjdXJyZW50bHkKK2RubAorZG5sIEV4YW1wbGU6CitkbmwgQU1fUEFUSF9MSUJMQU1FKDMuODksICwgQUNfTVNHX0VSUk9SKFsqKiogTElCTEFNRSA+PSAzLjg5IG5vdCBpbnN0YWxsZWQpKSAKK2RubAorZG5sIERlZmluZXMgTElCTEFNRV9MSUJTCitkbmwgRklYTUU6IHNob3VsZCBkZWZpbmUgTElCTEFNRV9WRVJTSU9OCitkbmwKKworQUNfREVGVU4oW0FNX1BBVEhfTElCTEFNRV0sCitbCisgIGRubCBjaGVjayBmb3IgdGhlIGxpYnJhcnkKKyAgQUNfQ0hFQ0tfTElCKG1wM2xhbWUsIGxhbWVfaW5pdCwgSEFWRV9MSUJMQU1FPXllcywgSEFWRV9MSUJMQU1FPW5vLCAtbG0pCisgIGRubCBjaGVjayBpZiBsYW1lLmggaXMgYXZhaWxhYmxlIGluIHRoZSBzdGFuZGFyZCBsb2NhdGlvbiBvciBub3QKKyAgSEFWRV9MQU1FX0hfU1REPW5vCisgIEFDX0NIRUNLX0hFQURFUihsYW1lLmgsIEhBVkVfTEFNRV9IX1NURD1ubywgOikKKyAgQUNfQ0hFQ0tfSEVBREVSKGxhbWUvbGFtZS5oLCBIQVZFX0xBTUVfSF9TVEQ9eWVzLCA6KQorICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGxhbWUuaCBpbiByaWdodCBsb2NhdGlvbikKKyAgaWYgdGVzdCAieCRIQVZFX0xBTUVfSF9TVEQiID0gInh5ZXMiOyB0aGVuCisgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgIGVsc2UKKyAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgIEhBVkVfTElCTEFNRT1ubworICAgIGlmIHRlc3QgIngkSEFWRV9MQU1FX0hfU1REIj0ieG5vIjsgdGhlbgorICAgICAgQUNfTVNHX1dBUk4obGFtZS5oIGZvdW5kIGluIGluY2x1ZGUgZGlyLCkKKyAgICAgIEFDX01TR19XQVJOKCB3aGlsZSBpdCBzaG91bGQgYmUgaW4gaXQncyBvd24gbGFtZS8gZGlyICEpCisgICAgZmkKKyBmaQorCisgIGRubCBub3cgZG8gdGhlIGFjdHVhbCAiZG8gd2UgaGF2ZSBpdCA/IiB0ZXN0CisgIGlmIHRlc3QgIngkSEFWRV9MSUJMQU1FIiA9ICJ4eWVzIjsgdGhlbgorICAgIExJQkxBTUVfTElCUz0iLWxtcDNsYW1lIC1sbSIKKyAgICBkbmwgZXhlY3V0ZSB3aGF0IHdlIGhhdmUgdG8gYmVjYXVzZSBpdCdzIGZvdW5kCisgICAgaWZlbHNlKFskMl0sICwgOiwgWyQyXSkKKyAgZWxzZQorICAgIExJQkxBTUVfTElCUz0iIgorICAgIGRubCBleGVjdXRlIHdoYXQgd2UgaGF2ZSB0byBiZWNhdXNlIGl0J3Mgbm90IGZvdW5kCisgICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKKyAgZmkKKworICBkbmwgbWFrZSB2YXJpYWJsZXMgYXZhaWxhYmxlCisgIEFDX1NVQlNUKExJQkxBTUVfTElCUykKKyAgQUNfU1VCU1QoSEFWRV9MSUJMQU1FKQorXSkKZGlmZiAtLWdpdCBhL200L2FzLXNsdXJwLWZmbXBlZy5tNCBiL200L2FzLXNsdXJwLWZmbXBlZy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDU0YjQyCi0tLSAvZGV2L251bGwKKysrIGIvbTQvYXMtc2x1cnAtZmZtcGVnLm00CkBAIC0wLDAgKzEsNTkgQEAKK2RubCBzbHVycC1mZm1wZWcubTQgMC4xLjEKK2RubCBhIG1hY3JvIHRvIHNsdXJwIGluIGZmbXBlZydzIGN2cyBzb3VyY2UgaW5zaWRlIGEgcHJvamVjdCB0cmVlCitkbmwgdGFrZW4gZnJvbSBBdXRvc3RhciBTYW5kYm94LCBodHRwOi8vYXV0b3N0YXJzLnNvdXJjZWZvcmdlLm5ldC8KKworZG5sIFVzYWdlOgorZG5sIEFTX1NMVVJQX0ZGTVBFRyhESVJFQ1RPUlksIERBVEUsIFtBQ1RJT04tSUYtV09SS0VEIFssIEFDVElPTi1JRi1OT1QtV09SS0VEXV1dKQorZG5sCitkbmwgRXhhbXBsZToKK2RubCBBTV9QQVRIX0ZGTVBFRyhsaWIvZmZtcGVnLCAyMDAyLTEyLTE0IDEyOjAwIEdNVCkKK2RubAorZG5sIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhIFRhZyBmaWxlIGluIHRoZSBkaXIgd2hlcmUgeW91IGNoZWNrIG91dCB0aGF0CitkbmwgaXMgdGhlIFRhZyBvZiBDVlMgeW91IHdhbnQgdG8gaGF2ZSBjaGVja2VkIG91dAorZG5sIGl0IHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZSBEQVRFIGFyZ3VtZW50IHlvdSBzdXBwbHksIGllIHJlc29sdmUgdG8KK2RubCB0aGUgc2FtZSBkYXRlCitkbmwgKGluIGFuIGlkZWFsIHdvcmxkLCBjdnMgd291bGQgdW5kZXJzdGFuZCBpdCdzIG93biBUYWcgZmlsZSBmb3JtYXQgYXMKK2RubCBhIGRhdGUgc3BlYykKKworQUNfREVGVU4oW0FTX1NMVVJQX0ZGTVBFR10sCitbCisgICMgc2F2ZSBvcmlnaW5hbCBkaXIKKyAgRkFJTEVEPSIiCisgIERJUkVDVE9SWT1gcHdkYAorICAjIGdldC91cGRhdGUgY3ZzCisgIGlmIHRlc3QgISAtZCAkMTsgdGhlbiBta2RpciAtcCAkMTsgZmkKKyAgZG5sIHdlIG5lZWQgdG8gY2hlY2sgJHNyY2Rpci8kMSBvciBpdCB3aWxsIGFsd2F5cyBjaGVja291dCBmZm1wZWcgZXZlbiBpZiBpdCBpcyB0aGVyZQorICBkbmwgYXQgbGVhc3Qgd2hlbiB0b3Bfc3JjZGlyICE9IHRvcF9idWlsZGRpci4KKyAgZG5sIEZJWE1FOiB1bmZvcnR1bmF0ZWx5IHRoaXMgbWFrZXMgdGhlIGNoZWNrb3V0IGdvIGludG8gdG9wX3NyY2RpcgorICBjZCAkc3JjZGlyLyQxCisKKyAgaWYgdGVzdCAhIC1lIGZmbXBlZy9SRUFETUU7IHRoZW4KKyAgICAjIGNoZWNrIG91dCBjdnMgY29kZQorICAgIEFDX01TR19OT1RJQ0UoY2hlY2tpbmcgb3V0IGZmbXBlZyBjdnMgY29kZSBmcm9tICQyIGludG8gJDEpCisgICAgY3ZzIC1RIC16NCAtZDpwc2VydmVyOmFub255bW91c0BtcGxheWVyaHEuaHU6L2N2c3Jvb3QvZmZtcGVnIGNvIC1EICckMicgZmZtcGVnIHx8IEZBSUxFRD15ZXMKKyAgZWxzZQorICAgICMgY29tcGFyZSBhZ2FpbnN0IFRhZyBmaWxlIGFuZCBzZWUgaWYgaXQgbmVlZHMgdXBkYXRpbmcKKyAgICBpZiB0ZXN0ICJgY2F0IFRhZ2AiID09ICIkMiI7IHRoZW4KKyAgICAgIEFDX01TR19OT1RJQ0UoZmZtcGVnIGN2cyBjb2RlIGluIHN5bmMpCisgICAgZWxzZQorICAgICAgY2QgZmZtcGVnIAorICAgICAgQUNfTVNHX05PVElDRSh1cGRhdGluZyBmZm1wZWcgY3ZzIGNvZGUgdG8gJDIpCisgICAgICBjdnMgLVEgLXo0IHVwZGF0ZSAtZFAgLUQgJyQyJyB8fCBGQUlMRUQ9eWVzCisgICAgICBjZCAuLgorICAgIGZpCisgIGZpCisgIGlmIHRlc3QgIngkRkFJTEVEIiAhPSAieHllcyI7IHRoZW4KKyAgICBlY2hvICIkMiIgPiBUYWcgCisgIGZpCisgIAorICAjIG5vdyBnbyBiYWNrCisgIGNkICRESVJFQ1RPUlkKKworICBpZiB0ZXN0ICJ4JEZBSUxFRCIgPT0gInh5ZXMiOyB0aGVuCisgICAgWyQ0XQorICAgIGZhbHNlCisgIGVsc2UKKyAgICBbJDNdCisgICAgdHJ1ZQorICBmaQorXSkKZGlmZiAtLWdpdCBhL200L2NoZWNrLWxpYmhlYWRlci5tNCBiL200L2NoZWNrLWxpYmhlYWRlci5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2ZjNWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbTQvY2hlY2stbGliaGVhZGVyLm00CkBAIC0wLDAgKzEsMzkgQEAKK2RubAorZG5sIENIRUNLLUxJQkhFQURFUihGRUFUVVJFLU5BTUUsIExJQi1OQU1FLCBMSUItRlVOQ1RJT04sIEhFQURFUi1OQU1FLAorZG5sICAgICAgICAgICAgICAgICBBQ1RJT04tSUYtRk9VTkQsIEFDVElPTi1JRi1OT1QtRk9VTkQsCitkbmwgICAgICAgICAgICAgICAgIEVYVFJBLUxERkxBR1MsIEVYVFJBLUNQUEZMQUdTKQorZG5sCitkbmwgRkVBVFVSRS1OQU1FICAgICAgICAtIGZlYXR1cmUgbmFtZTsgbGlicmFyeSBhbmQgaGVhZGVyIGZpbGVzIGFyZSB0cmVhdGVkCitkbmwgICAgICAgICAgICAgICAgICAgICAgIGFzIGZlYXR1cmUsIHdoaWNoIHdlIGxvb2sgZm9yCitkbmwgTElCLU5BTUUgICAgICAgICAgICAtIGxpYnJhcnkgbmFtZSBhcyBpbiBBQ19DSEVDS19MSUIgbWFjcm8KK2RubCBMSUItRlVOQ1RJT04gICAgICAgIC0gbGlicmFyeSBzeW1ib2wgYXMgaW4gQUNfQ0hFQ0tfTElCIG1hY3JvCitkbmwgSEVBREVSLU5BTUUgICAgICAgICAtIGhlYWRlciBmaWxlIG5hbWUgYXMgaW4gQUNfQ0hFQ0tfSEVBREVSCitkbmwgQUNUSU9OLUlGLUZPVU5EICAgICAtIHdoZW4gZmVhdHVyZSBpcyBmb3VuZCB0aGVuIGV4ZWN1dGUgZ2l2ZW4gYWN0aW9uCitkbmwgQUNUSU9OLUlGLU5PVC1GT1VORCAtIHdoZW4gZmVhdHVyZSBpcyBub3QgZm91bmQgdGhlbiBleGVjdXRlIGdpdmVuIGFjdGlvbgorZG5sIEVYVFJBLUxERkxBR1MgICAgICAgLSBleHRyYSBsaW5rZXIgZmxhZ3MgKC1MIG9yIC1sKQorZG5sIEVYVFJBLUNQUEZMQUdTICAgICAgLSBleHRyYSBDIHByZXByb2Nlc3NvciBmbGFncywgaS5lLiAtSS91c3IvWDExUjYvaW5jbHVkZQorZG5sCitkbmwgQmFzZWQgb24gR1NUX0NIRUNLX0xJQkhFQURFUiBmcm9tIGdzdHJlYW1lciBwbHVnaW5zIDAuMy4xLgorZG5sCitBQ19ERUZVTihbQ0hFQ0tfTElCSEVBREVSXSwKK1sKKyAgQUNfQ0hFQ0tfTElCKFskMl0sIFskM10sIEhBVkVfWyQxXT15ZXMsIEhBVkVfWyQxXT1ubywgWyQ3XSkKKyAgY2hlY2tfbGliaGVhZGVyX2ZlYXR1cmVfbmFtZT10cmFuc2xpdChbJDFdLCBBLVosIGEteikKKworICBpZiB0ZXN0ICJ4JEhBVkVfWyQxXSIgPSAieHllcyI7IHRoZW4KKyAgICBjaGVja19saWJoZWFkZXJfc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKKyAgICBDUFBGTEFHUz0iWyQ4XSAkQ1BQRkxBR1MiCisgICAgQUNfQ0hFQ0tfSEVBREVSKFskNF0sIDosIEhBVkVfWyQxXT1ubykKKyAgICBDUFBGTEFHUz0kY2hlY2tfbGliaGVhZGVyX3NhdmVfQ1BQRkxBR1MKKyAgZmkKKworICBpZiB0ZXN0ICJ4JEhBVkVfWyQxXSIgPSAieHllcyI7IHRoZW4KKyAgICBpZmVsc2UoWyQ1XSwgLCA6LCBbJDVdKQorICAgIEFDX01TR19OT1RJQ0UoJGNoZWNrX2xpYmhlYWRlcl9mZWF0dXJlX25hbWUgd2FzIGZvdW5kKQorICBlbHNlCisgICAgaWZlbHNlKFskNl0sICwgOiwgWyQ2XSkKKyAgICBBQ19NU0dfV0FSTigkY2hlY2tfbGliaGVhZGVyX2ZlYXR1cmVfbmFtZSBub3QgZm91bmQpCisgIGZpCisgIEFDX1NVQlNUKEhBVkVfWyQxXSkKK10KKykKZGlmZiAtLWdpdCBhL200L2ZyZWV0eXBlMi5tNCBiL200L2ZyZWV0eXBlMi5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTk5MDcxCi0tLSAvZGV2L251bGwKKysrIGIvbTQvZnJlZXR5cGUyLm00CkBAIC0wLDAgKzEsMTQzIEBACisjIENvbmZpZ3VyZSBwYXRocyBmb3IgRnJlZVR5cGUyCisjIE1hcmNlbG8gTWFnYWxsb24gMjAwMS0xMC0yNiwgYmFzZWQgb24gZ3RrLm00IGJ5IE93ZW4gVGF5bG9yCisKK2RubCBBQ19DSEVDS19GVDIoW01JTklNVU0tVkVSU0lPTiwgW0FDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EXV1dKQorZG5sIFRlc3QgZm9yIEZyZWVUeXBlMiwgYW5kIGRlZmluZSBGVDJfQ0ZMQUdTIGFuZCBGVDJfTElCUworZG5sCitBQ19ERUZVTihbQUNfQ0hFQ0tfRlQyXSwKK1tkbmwKK2RubCBHZXQgdGhlIGNmbGFncyBhbmQgbGlicmFyaWVzIGZyb20gdGhlIGZyZWV0eXBlLWNvbmZpZyBzY3JpcHQKK2RubAorQUNfQVJHX1dJVEgoZnQtcHJlZml4LAorWyAgLS13aXRoLWZ0LXByZWZpeD1QUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZml4IHdoZXJlIEZyZWVUeXBlIGlzIGluc3RhbGxlZCAob3B0aW9uYWwpXSwKKyAgICAgICAgICAgIGZ0X2NvbmZpZ19wcmVmaXg9IiR3aXRodmFsIiwgZnRfY29uZmlnX3ByZWZpeD0iIikKK0FDX0FSR19XSVRIKGZ0LWV4ZWMtcHJlZml4LAorWyAgLS13aXRoLWZ0LWV4ZWMtcHJlZml4PVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjIHByZWZpeCB3aGVyZSBGcmVlVHlwZSBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sCisgICAgICAgICAgICBmdF9jb25maWdfZXhlY19wcmVmaXg9IiR3aXRodmFsIiwgZnRfY29uZmlnX2V4ZWNfcHJlZml4PSIiKQorQUNfQVJHX0VOQUJMRShmcmVldHlwZXRlc3QsCitbICAtLWRpc2FibGUtZnJlZXR5cGV0ZXN0ICBEbyBub3QgdHJ5IHRvIGNvbXBpbGUgYW5kIHJ1bgorICAgICAgICAgICAgICAgICAgICAgICAgICBhIHRlc3QgRnJlZVR5cGUgcHJvZ3JhbV0sCisgICAgICAgICAgICAgIFtdLCBlbmFibGVfZnR0ZXN0PXllcykKKworaWYgdGVzdCB4JGZ0X2NvbmZpZ19leGVjX3ByZWZpeCAhPSB4IDsgdGhlbgorICBmdF9jb25maWdfYXJncz0iJGZ0X2NvbmZpZ19hcmdzIC0tZXhlYy1wcmVmaXg9JGZ0X2NvbmZpZ19leGVjX3ByZWZpeCIKKyAgaWYgdGVzdCB4JHtGVDJfQ09ORklHK3NldH0gIT0geHNldCA7IHRoZW4KKyAgICBGVDJfQ09ORklHPSRmdF9jb25maWdfZXhlY19wcmVmaXgvYmluL2ZyZWV0eXBlLWNvbmZpZworICBmaQorZmkKK2lmIHRlc3QgeCRmdF9jb25maWdfcHJlZml4ICE9IHggOyB0aGVuCisgIGZ0X2NvbmZpZ19hcmdzPSIkZnRfY29uZmlnX2FyZ3MgLS1wcmVmaXg9JGZ0X2NvbmZpZ19wcmVmaXgiCisgIGlmIHRlc3QgeCR7RlQyX0NPTkZJRytzZXR9ICE9IHhzZXQgOyB0aGVuCisgICAgRlQyX0NPTkZJRz0kZnRfY29uZmlnX3ByZWZpeC9iaW4vZnJlZXR5cGUtY29uZmlnCisgIGZpCitmaQorQUNfUEFUSF9QUk9HKEZUMl9DT05GSUcsIGZyZWV0eXBlLWNvbmZpZywgbm8pCisKK21pbl9mdF92ZXJzaW9uPWlmZWxzZShbJDFdLCAsNi4xLjAsJDEpCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIEZyZWVUeXBlIC0gdmVyc2lvbiA+PSAkbWluX2Z0X3ZlcnNpb24pCitub19mdD0iIgoraWYgdGVzdCAiJEZUMl9DT05GSUciID0gIm5vIiA7IHRoZW4KKyAgbm9fZnQ9eWVzCitlbHNlCisgIEZUMl9DRkxBR1M9YCRGVDJfQ09ORklHICRmdF9jb25maWdfYXJncyAtLWNmbGFnc2AKKyAgRlQyX0xJQlM9YCRGVDJfQ09ORklHICRmdF9jb25maWdfYXJncyAtLWxpYnNgCisgIGZ0X2NvbmZpZ19tYWpvcl92ZXJzaW9uPWAkRlQyX0NPTkZJRyAkZnRfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wxLydgCisgIGZ0X2NvbmZpZ19taW5vcl92ZXJzaW9uPWAkRlQyX0NPTkZJRyAkZnRfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wyLydgCisgIGZ0X2NvbmZpZ19taWNyb192ZXJzaW9uPWAkRlQyX0NPTkZJRyAkZnRfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wzLydgCisgIGZ0X21pbl9tYWpvcl92ZXJzaW9uPWBlY2hvICRtaW5fZnRfdmVyc2lvbiB8IFwKKyAgICAgICAgIHNlZCAncy9cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS9cMS8nYAorICBmdF9taW5fbWlub3JfdmVyc2lvbj1gZWNobyAkbWluX2Z0X3ZlcnNpb24gfCBcCisgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDIvJ2AKKyAgZnRfbWluX21pY3JvX3ZlcnNpb249YGVjaG8gJG1pbl9mdF92ZXJzaW9uIHwgXAorICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wzLydgCisgIGlmIHRlc3QgeCRlbmFibGVfZnR0ZXN0ID0geHllcyA7IHRoZW4KKyAgICBmdF9jb25maWdfaXNfbHQ9IiIKKyAgICBpZiB0ZXN0ICRmdF9jb25maWdfbWFqb3JfdmVyc2lvbiAtbHQgJGZ0X21pbl9tYWpvcl92ZXJzaW9uIDsgdGhlbgorICAgICAgZnRfY29uZmlnX2lzX2x0PXllcworICAgIGVsc2UKKyAgICAgIGlmIHRlc3QgJGZ0X2NvbmZpZ19tYWpvcl92ZXJzaW9uIC1lcSAkZnRfbWluX21ham9yX3ZlcnNpb24gOyB0aGVuCisgICAgICAgIGlmIHRlc3QgJGZ0X2NvbmZpZ19taW5vcl92ZXJzaW9uIC1sdCAkZnRfbWluX21pbm9yX3ZlcnNpb24gOyB0aGVuCisgICAgICAgICAgZnRfY29uZmlnX2lzX2x0PXllcworICAgICAgICBlbHNlCisgICAgICAgICAgaWYgdGVzdCAkZnRfY29uZmlnX21pbm9yX3ZlcnNpb24gLWVxICRmdF9taW5fbWlub3JfdmVyc2lvbiA7IHRoZW4KKyAgICAgICAgICAgIGlmIHRlc3QgJGZ0X2NvbmZpZ19taWNyb192ZXJzaW9uIC1sdCAkZnRfbWluX21pY3JvX3ZlcnNpb24gOyB0aGVuCisgICAgICAgICAgICAgIGZ0X2NvbmZpZ19pc19sdD15ZXMKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgZmkKKyAgICBpZiB0ZXN0IHgkZnRfY29uZmlnX2lzX2x0ID0geHllcyA7IHRoZW4KKyAgICAgIG5vX2Z0PXllcworICAgIGVsc2UKKyAgICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgIENGTEFHUz0iJENGTEFHUyAkRlQyX0NGTEFHUyIKKyAgICAgIExJQlM9IiRGVDJfTElCUyAkTElCUyIKK2RubAorZG5sIFNhbml0eSBjaGVja3MgZm9yIHRoZSByZXN1bHRzIG9mIGZyZWV0eXBlLWNvbmZpZyB0byBzb21lIGV4dGVudAorZG5sCisgICAgICBBQ19UUllfUlVOKFsKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2ludAorbWFpbigpCit7CisgIEZUX0xpYnJhcnkgbGlicmFyeTsKKyAgRlRfRXJyb3IgZXJyb3I7CisKKyAgZXJyb3IgPSBGVF9Jbml0X0ZyZWVUeXBlKCZsaWJyYXJ5KTsKKworICBpZiAoZXJyb3IpCisgICAgcmV0dXJuIDE7CisgIGVsc2UKKyAgeworICAgIEZUX0RvbmVfRnJlZVR5cGUobGlicmFyeSk7CisgICAgcmV0dXJuIDA7CisgIH0KK30KK10sLCBub19mdD15ZXMsW2VjaG8gJGFjX24gImNyb3NzIGNvbXBpbGluZzsgYXNzdW1lZCBPSy4uLiAkYWNfYyJdKQorICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgICAgICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorICAgIGZpICAgICAgICAgICAgICMgdGVzdCAkZnRfY29uZmlnX3ZlcnNpb24gLWx0ICRmdF9taW5fdmVyc2lvbgorICBmaSAgICAgICAgICAgICAgICMgdGVzdCB4JGVuYWJsZV9mdHRlc3QgPSB4eWVzCitmaSAgICAgICAgICAgICAgICAgIyB0ZXN0ICIkRlQyX0NPTkZJRyIgPSAibm8iCitpZiB0ZXN0IHgkbm9fZnQgPSB4IDsgdGhlbgorICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKQorZWxzZQorICAgQUNfTVNHX1JFU1VMVChubykKKyAgIGlmIHRlc3QgIiRGVDJfQ09ORklHIiA9ICJubyIgOyB0aGVuCisgICAgIGVjaG8gIioqKiBUaGUgZnJlZXR5cGUtY29uZmlnIHNjcmlwdCBpbnN0YWxsZWQgYnkgRnJlZVR5cGUgMiBjb3VsZCBub3QgYmUgZm91bmQuIgorICAgICBlY2hvICIqKiogSWYgRnJlZVR5cGUgMiB3YXMgaW5zdGFsbGVkIGluIFBSRUZJWCwgbWFrZSBzdXJlIFBSRUZJWC9iaW4gaXMgaW4iCisgICAgIGVjaG8gIioqKiB5b3VyIHBhdGgsIG9yIHNldCB0aGUgRlQyX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUiCisgICAgIGVjaG8gIioqKiBmdWxsIHBhdGggdG8gZnJlZXR5cGUtY29uZmlnLiIKKyAgIGVsc2UKKyAgICAgaWYgdGVzdCB4JGZ0X2NvbmZpZ19pc19sdCA9IHh5ZXMgOyB0aGVuCisgICAgICAgZWNobyAiKioqIFlvdXIgaW5zdGFsbGVkIHZlcnNpb24gb2YgdGhlIEZyZWVUeXBlIDIgbGlicmFyeSBpcyB0b28gb2xkLiIKKyAgICAgICBlY2hvICIqKiogSWYgeW91IGhhdmUgZGlmZmVyZW50IHZlcnNpb25zIG9mIEZyZWVUeXBlIDIsIG1ha2Ugc3VyZSB0aGF0IgorICAgICAgIGVjaG8gIioqKiBjb3JyZWN0IHZhbHVlcyBmb3IgLS13aXRoLWZ0LXByZWZpeCBvciAtLXdpdGgtZnQtZXhlYy1wcmVmaXgiCisgICAgICAgZWNobyAiKioqIGFyZSB1c2VkLCBvciBzZXQgdGhlIEZUMl9DT05GSUcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIgorICAgICAgIGVjaG8gIioqKiBmdWxsIHBhdGggdG8gZnJlZXR5cGUtY29uZmlnLiIKKyAgICAgZWxzZQorICAgICAgIGVjaG8gIioqKiBUaGUgRnJlZVR5cGUgdGVzdCBwcm9ncmFtIGZhaWxlZCB0byBydW4uICBJZiB5b3VyIHN5c3RlbSB1c2VzIgorICAgICAgIGVjaG8gIioqKiBzaGFyZWQgbGlicmFyaWVzIGFuZCB0aGV5IGFyZSBpbnN0YWxsZWQgb3V0c2lkZSB0aGUgbm9ybWFsIgorICAgICAgIGVjaG8gIioqKiBzeXN0ZW0gbGlicmFyeSBwYXRoLCBtYWtlIHN1cmUgdGhlIHZhcmlhYmxlIExEX0xJQlJBUllfUEFUSCIKKyAgICAgICBlY2hvICIqKiogKG9yIHdoYXRldmVyIGlzIGFwcHJvcGlhdGUgZm9yIHlvdXIgc3lzdGVtKSBpcyBjb3JyZWN0bHkgc2V0LiIKKyAgICAgZmkKKyAgIGZpCisgICBGVDJfQ0ZMQUdTPSIiCisgICBGVDJfTElCUz0iIgorICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKK2ZpCitBQ19TVUJTVChGVDJfQ0ZMQUdTKQorQUNfU1VCU1QoRlQyX0xJQlMpCitdKQpkaWZmIC0tZ2l0IGEvbTQvZ2xpYi5tNCBiL200L2dsaWIubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNjNjMyYgotLS0gL2Rldi9udWxsCisrKyBiL200L2dsaWIubTQKQEAgLTAsMCArMSwxOTYgQEAKKyMgQ29uZmlndXJlIHBhdGhzIGZvciBHTElCCisjIE93ZW4gVGF5bG9yICAgICA5Ny0xMS0zCisKK2RubCBBTV9QQVRIX0dMSUIoW01JTklNVU0tVkVSU0lPTiwgW0FDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EIFssIE1PRFVMRVNdXV1dKQorZG5sIFRlc3QgZm9yIEdMSUIsIGFuZCBkZWZpbmUgR0xJQl9DRkxBR1MgYW5kIEdMSUJfTElCUywgaWYgImdtb2R1bGUiIG9yIAorZG5sIGd0aHJlYWQgaXMgc3BlY2lmaWVkIGluIE1PRFVMRVMsIHBhc3MgdG8gZ2xpYi1jb25maWcKK2RubAorQUNfREVGVU4oW0FNX1BBVEhfR0xJQl0sCitbZG5sIAorZG5sIEdldCB0aGUgY2ZsYWdzIGFuZCBsaWJyYXJpZXMgZnJvbSB0aGUgZ2xpYi1jb25maWcgc2NyaXB0CitkbmwKK0FDX0FSR19XSVRIKGdsaWItcHJlZml4LFsgIC0td2l0aC1nbGliLXByZWZpeD1QRlggICBQcmVmaXggd2hlcmUgR0xJQiBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sCisgICAgICAgICAgICBnbGliX2NvbmZpZ19wcmVmaXg9IiR3aXRodmFsIiwgZ2xpYl9jb25maWdfcHJlZml4PSIiKQorQUNfQVJHX1dJVEgoZ2xpYi1leGVjLXByZWZpeCxbICAtLXdpdGgtZ2xpYi1leGVjLXByZWZpeD1QRlggRXhlYyBwcmVmaXggd2hlcmUgR0xJQiBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sCisgICAgICAgICAgICBnbGliX2NvbmZpZ19leGVjX3ByZWZpeD0iJHdpdGh2YWwiLCBnbGliX2NvbmZpZ19leGVjX3ByZWZpeD0iIikKK0FDX0FSR19FTkFCTEUoZ2xpYnRlc3QsIFsgIC0tZGlzYWJsZS1nbGlidGVzdCAgICAgICBEbyBub3QgdHJ5IHRvIGNvbXBpbGUgYW5kIHJ1biBhIHRlc3QgR0xJQiBwcm9ncmFtXSwKKwkJICAgICwgZW5hYmxlX2dsaWJ0ZXN0PXllcykKKworICBpZiB0ZXN0IHgkZ2xpYl9jb25maWdfZXhlY19wcmVmaXggIT0geCA7IHRoZW4KKyAgICAgZ2xpYl9jb25maWdfYXJncz0iJGdsaWJfY29uZmlnX2FyZ3MgLS1leGVjLXByZWZpeD0kZ2xpYl9jb25maWdfZXhlY19wcmVmaXgiCisgICAgIGlmIHRlc3QgeCR7R0xJQl9DT05GSUcrc2V0fSAhPSB4c2V0IDsgdGhlbgorICAgICAgICBHTElCX0NPTkZJRz0kZ2xpYl9jb25maWdfZXhlY19wcmVmaXgvYmluL2dsaWItY29uZmlnCisgICAgIGZpCisgIGZpCisgIGlmIHRlc3QgeCRnbGliX2NvbmZpZ19wcmVmaXggIT0geCA7IHRoZW4KKyAgICAgZ2xpYl9jb25maWdfYXJncz0iJGdsaWJfY29uZmlnX2FyZ3MgLS1wcmVmaXg9JGdsaWJfY29uZmlnX3ByZWZpeCIKKyAgICAgaWYgdGVzdCB4JHtHTElCX0NPTkZJRytzZXR9ICE9IHhzZXQgOyB0aGVuCisgICAgICAgIEdMSUJfQ09ORklHPSRnbGliX2NvbmZpZ19wcmVmaXgvYmluL2dsaWItY29uZmlnCisgICAgIGZpCisgIGZpCisKKyAgZm9yIG1vZHVsZSBpbiAuICQ0CisgIGRvCisgICAgICBjYXNlICIkbW9kdWxlIiBpbgorICAgICAgICAgZ21vZHVsZSkgCisgICAgICAgICAgICAgZ2xpYl9jb25maWdfYXJncz0iJGdsaWJfY29uZmlnX2FyZ3MgZ21vZHVsZSIKKyAgICAgICAgIDs7CisgICAgICAgICBndGhyZWFkKSAKKyAgICAgICAgICAgICBnbGliX2NvbmZpZ19hcmdzPSIkZ2xpYl9jb25maWdfYXJncyBndGhyZWFkIgorICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgZG9uZQorCisgIEFDX1BBVEhfUFJPRyhHTElCX0NPTkZJRywgZ2xpYi1jb25maWcsIG5vKQorICBtaW5fZ2xpYl92ZXJzaW9uPWlmZWxzZShbJDFdLCAsMC45OS43LCQxKQorICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIEdMSUIgLSB2ZXJzaW9uID49ICRtaW5fZ2xpYl92ZXJzaW9uKQorICBub19nbGliPSIiCisgIGlmIHRlc3QgIiRHTElCX0NPTkZJRyIgPSAibm8iIDsgdGhlbgorICAgIG5vX2dsaWI9eWVzCisgIGVsc2UKKyAgICBHTElCX0NGTEFHUz1gJEdMSUJfQ09ORklHICRnbGliX2NvbmZpZ19hcmdzIC0tY2ZsYWdzYAorICAgIEdMSUJfTElCUz1gJEdMSUJfQ09ORklHICRnbGliX2NvbmZpZ19hcmdzIC0tbGlic2AKKyAgICBnbGliX2NvbmZpZ19tYWpvcl92ZXJzaW9uPWAkR0xJQl9DT05GSUcgJGdsaWJfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDEvJ2AKKyAgICBnbGliX2NvbmZpZ19taW5vcl92ZXJzaW9uPWAkR0xJQl9DT05GSUcgJGdsaWJfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDIvJ2AKKyAgICBnbGliX2NvbmZpZ19taWNyb192ZXJzaW9uPWAkR0xJQl9DT05GSUcgJGdsaWJfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDMvJ2AKKyAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9nbGlidGVzdCIgPSAieHllcyIgOyB0aGVuCisgICAgICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgIGFjX3NhdmVfTElCUz0iJExJQlMiCisgICAgICBDRkxBR1M9IiRDRkxBR1MgJEdMSUJfQ0ZMQUdTIgorICAgICAgTElCUz0iJEdMSUJfTElCUyAkTElCUyIKK2RubAorZG5sIE5vdyBjaGVjayBpZiB0aGUgaW5zdGFsbGVkIEdMSUIgaXMgc3VmZmljaWVudGx5IG5ldy4gKEFsc28gc2FuaXR5CitkbmwgY2hlY2tzIHRoZSByZXN1bHRzIG9mIGdsaWItY29uZmlnIHRvIHNvbWUgZXh0ZW50CitkbmwKKyAgICAgIHJtIC1mIGNvbmYuZ2xpYnRlc3QKKyAgICAgIEFDX1RSWV9SVU4oWworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitpbnQgCittYWluICgpCit7CisgIGludCBtYWpvciwgbWlub3IsIG1pY3JvOworICBjaGFyICp0bXBfdmVyc2lvbjsKKworICBzeXN0ZW0gKCJ0b3VjaCBjb25mLmdsaWJ0ZXN0Iik7CisKKyAgLyogSFAvVVggOSAoJUAjISkgd3JpdGVzIHRvIHNzY2FuZiBzdHJpbmdzICovCisgIHRtcF92ZXJzaW9uID0gZ19zdHJkdXAoIiRtaW5fZ2xpYl92ZXJzaW9uIik7CisgIGlmIChzc2NhbmYodG1wX3ZlcnNpb24sICIlZC4lZC4lZCIsICZtYWpvciwgJm1pbm9yLCAmbWljcm8pICE9IDMpIHsKKyAgICAgcHJpbnRmKCIlcywgYmFkIHZlcnNpb24gc3RyaW5nXG4iLCAiJG1pbl9nbGliX3ZlcnNpb24iKTsKKyAgICAgZXhpdCgxKTsKKyAgIH0KKworICBpZiAoKGdsaWJfbWFqb3JfdmVyc2lvbiAhPSAkZ2xpYl9jb25maWdfbWFqb3JfdmVyc2lvbikgfHwKKyAgICAgIChnbGliX21pbm9yX3ZlcnNpb24gIT0gJGdsaWJfY29uZmlnX21pbm9yX3ZlcnNpb24pIHx8CisgICAgICAoZ2xpYl9taWNyb192ZXJzaW9uICE9ICRnbGliX2NvbmZpZ19taWNyb192ZXJzaW9uKSkKKyAgICB7CisgICAgICBwcmludGYoIlxuKioqICdnbGliLWNvbmZpZyAtLXZlcnNpb24nIHJldHVybmVkICVkLiVkLiVkLCBidXQgR0xJQiAoJWQuJWQuJWQpXG4iLCAKKyAgICAgICAgICAgICAkZ2xpYl9jb25maWdfbWFqb3JfdmVyc2lvbiwgJGdsaWJfY29uZmlnX21pbm9yX3ZlcnNpb24sICRnbGliX2NvbmZpZ19taWNyb192ZXJzaW9uLAorICAgICAgICAgICAgIGdsaWJfbWFqb3JfdmVyc2lvbiwgZ2xpYl9taW5vcl92ZXJzaW9uLCBnbGliX21pY3JvX3ZlcnNpb24pOworICAgICAgcHJpbnRmICgiKioqIHdhcyBmb3VuZCEgSWYgZ2xpYi1jb25maWcgd2FzIGNvcnJlY3QsIHRoZW4gaXQgaXMgYmVzdFxuIik7CisgICAgICBwcmludGYgKCIqKiogdG8gcmVtb3ZlIHRoZSBvbGQgdmVyc2lvbiBvZiBHTElCLiBZb3UgbWF5IGFsc28gYmUgYWJsZSB0byBmaXggdGhlIGVycm9yXG4iKTsKKyAgICAgIHByaW50ZigiKioqIGJ5IG1vZGlmeWluZyB5b3VyIExEX0xJQlJBUllfUEFUSCBlbnZpcm9tZW50IHZhcmlhYmxlLCBvciBieSBlZGl0aW5nXG4iKTsKKyAgICAgIHByaW50ZigiKioqIC9ldGMvbGQuc28uY29uZi4gTWFrZSBzdXJlIHlvdSBoYXZlIHJ1biBsZGNvbmZpZyBpZiB0aGF0IGlzXG4iKTsKKyAgICAgIHByaW50ZigiKioqIHJlcXVpcmVkIG9uIHlvdXIgc3lzdGVtLlxuIik7CisgICAgICBwcmludGYoIioqKiBJZiBnbGliLWNvbmZpZyB3YXMgd3JvbmcsIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgR0xJQl9DT05GSUdcbiIpOworICAgICAgcHJpbnRmKCIqKiogdG8gcG9pbnQgdG8gdGhlIGNvcnJlY3QgY29weSBvZiBnbGliLWNvbmZpZywgYW5kIHJlbW92ZSB0aGUgZmlsZSBjb25maWcuY2FjaGVcbiIpOworICAgICAgcHJpbnRmKCIqKiogYmVmb3JlIHJlLXJ1bm5pbmcgY29uZmlndXJlXG4iKTsKKyAgICB9IAorICBlbHNlIGlmICgoZ2xpYl9tYWpvcl92ZXJzaW9uICE9IEdMSUJfTUFKT1JfVkVSU0lPTikgfHwKKwkgICAoZ2xpYl9taW5vcl92ZXJzaW9uICE9IEdMSUJfTUlOT1JfVkVSU0lPTikgfHwKKyAgICAgICAgICAgKGdsaWJfbWljcm9fdmVyc2lvbiAhPSBHTElCX01JQ1JPX1ZFUlNJT04pKQorICAgIHsKKyAgICAgIHByaW50ZigiKioqIEdMSUIgaGVhZGVyIGZpbGVzICh2ZXJzaW9uICVkLiVkLiVkKSBkbyBub3QgbWF0Y2hcbiIsCisJICAgICBHTElCX01BSk9SX1ZFUlNJT04sIEdMSUJfTUlOT1JfVkVSU0lPTiwgR0xJQl9NSUNST19WRVJTSU9OKTsKKyAgICAgIHByaW50ZigiKioqIGxpYnJhcnkgKHZlcnNpb24gJWQuJWQuJWQpXG4iLAorCSAgICAgZ2xpYl9tYWpvcl92ZXJzaW9uLCBnbGliX21pbm9yX3ZlcnNpb24sIGdsaWJfbWljcm9fdmVyc2lvbik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKChnbGliX21ham9yX3ZlcnNpb24gPiBtYWpvcikgfHwKKyAgICAgICAgKChnbGliX21ham9yX3ZlcnNpb24gPT0gbWFqb3IpICYmIChnbGliX21pbm9yX3ZlcnNpb24gPiBtaW5vcikpIHx8CisgICAgICAgICgoZ2xpYl9tYWpvcl92ZXJzaW9uID09IG1ham9yKSAmJiAoZ2xpYl9taW5vcl92ZXJzaW9uID09IG1pbm9yKSAmJiAoZ2xpYl9taWNyb192ZXJzaW9uID49IG1pY3JvKSkpCisgICAgICB7CisgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKyAgICAgZWxzZQorICAgICAgeworICAgICAgICBwcmludGYoIlxuKioqIEFuIG9sZCB2ZXJzaW9uIG9mIEdMSUIgKCVkLiVkLiVkKSB3YXMgZm91bmQuXG4iLAorICAgICAgICAgICAgICAgZ2xpYl9tYWpvcl92ZXJzaW9uLCBnbGliX21pbm9yX3ZlcnNpb24sIGdsaWJfbWljcm9fdmVyc2lvbik7CisgICAgICAgIHByaW50ZigiKioqIFlvdSBuZWVkIGEgdmVyc2lvbiBvZiBHTElCIG5ld2VyIHRoYW4gJWQuJWQuJWQuIFRoZSBsYXRlc3QgdmVyc2lvbiBvZlxuIiwKKwkgICAgICAgbWFqb3IsIG1pbm9yLCBtaWNybyk7CisgICAgICAgIHByaW50ZigiKioqIEdMSUIgaXMgYWx3YXlzIGF2YWlsYWJsZSBmcm9tIGZ0cDovL2Z0cC5ndGsub3JnLlxuIik7CisgICAgICAgIHByaW50ZigiKioqXG4iKTsKKyAgICAgICAgcHJpbnRmKCIqKiogSWYgeW91IGhhdmUgYWxyZWFkeSBpbnN0YWxsZWQgYSBzdWZmaWNpZW50bHkgbmV3IHZlcnNpb24sIHRoaXMgZXJyb3JcbiIpOworICAgICAgICBwcmludGYoIioqKiBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB3cm9uZyBjb3B5IG9mIHRoZSBnbGliLWNvbmZpZyBzaGVsbCBzY3JpcHQgaXNcbiIpOworICAgICAgICBwcmludGYoIioqKiBiZWluZyBmb3VuZC4gVGhlIGVhc2llc3Qgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIHJlbW92ZSB0aGUgb2xkIHZlcnNpb25cbiIpOworICAgICAgICBwcmludGYoIioqKiBvZiBHTElCLCBidXQgeW91IGNhbiBhbHNvIHNldCB0aGUgR0xJQl9DT05GSUcgZW52aXJvbm1lbnQgdG8gcG9pbnQgdG8gdGhlXG4iKTsKKyAgICAgICAgcHJpbnRmKCIqKiogY29ycmVjdCBjb3B5IG9mIGdsaWItY29uZmlnLiAoSW4gdGhpcyBjYXNlLCB5b3Ugd2lsbCBoYXZlIHRvXG4iKTsKKyAgICAgICAgcHJpbnRmKCIqKiogbW9kaWZ5IHlvdXIgTERfTElCUkFSWV9QQVRIIGVudmlyb21lbnQgdmFyaWFibGUsIG9yIGVkaXQgL2V0Yy9sZC5zby5jb25mXG4iKTsKKyAgICAgICAgcHJpbnRmKCIqKiogc28gdGhhdCB0aGUgY29ycmVjdCBsaWJyYXJpZXMgYXJlIGZvdW5kIGF0IHJ1bi10aW1lKSlcbiIpOworICAgICAgfQorICAgIH0KKyAgcmV0dXJuIDE7Cit9CitdLCwgbm9fZ2xpYj15ZXMsW2VjaG8gJGFjX24gImNyb3NzIGNvbXBpbGluZzsgYXNzdW1lZCBPSy4uLiAkYWNfYyJdKQorICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgIGZpCisgIGZpCisgIGlmIHRlc3QgIngkbm9fZ2xpYiIgPSB4IDsgdGhlbgorICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgaWZlbHNlKFskMl0sICwgOiwgWyQyXSkgICAgIAorICBlbHNlCisgICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgIGlmIHRlc3QgIiRHTElCX0NPTkZJRyIgPSAibm8iIDsgdGhlbgorICAgICAgIGVjaG8gIioqKiBUaGUgZ2xpYi1jb25maWcgc2NyaXB0IGluc3RhbGxlZCBieSBHTElCIGNvdWxkIG5vdCBiZSBmb3VuZCIKKyAgICAgICBlY2hvICIqKiogSWYgR0xJQiB3YXMgaW5zdGFsbGVkIGluIFBSRUZJWCwgbWFrZSBzdXJlIFBSRUZJWC9iaW4gaXMgaW4iCisgICAgICAgZWNobyAiKioqIHlvdXIgcGF0aCwgb3Igc2V0IHRoZSBHTElCX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUiCisgICAgICAgZWNobyAiKioqIGZ1bGwgcGF0aCB0byBnbGliLWNvbmZpZy4iCisgICAgIGVsc2UKKyAgICAgICBpZiB0ZXN0IC1mIGNvbmYuZ2xpYnRlc3QgOyB0aGVuCisgICAgICAgIDoKKyAgICAgICBlbHNlCisgICAgICAgICAgZWNobyAiKioqIENvdWxkIG5vdCBydW4gR0xJQiB0ZXN0IHByb2dyYW0sIGNoZWNraW5nIHdoeS4uLiIKKyAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJEdMSUJfQ0ZMQUdTIgorICAgICAgICAgIExJQlM9IiRMSUJTICRHTElCX0xJQlMiCisgICAgICAgICAgQUNfVFJZX0xJTksoWworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorXSwgICAgICBbIHJldHVybiAoKGdsaWJfbWFqb3JfdmVyc2lvbikgfHwgKGdsaWJfbWlub3JfdmVyc2lvbikgfHwgKGdsaWJfbWljcm9fdmVyc2lvbikpOyBdLAorICAgICAgICBbIGVjaG8gIioqKiBUaGUgdGVzdCBwcm9ncmFtIGNvbXBpbGVkLCBidXQgZGlkIG5vdCBydW4uIFRoaXMgdXN1YWxseSBtZWFucyIKKyAgICAgICAgICBlY2hvICIqKiogdGhhdCB0aGUgcnVuLXRpbWUgbGlua2VyIGlzIG5vdCBmaW5kaW5nIEdMSUIgb3IgZmluZGluZyB0aGUgd3JvbmciCisgICAgICAgICAgZWNobyAiKioqIHZlcnNpb24gb2YgR0xJQi4gSWYgaXQgaXMgbm90IGZpbmRpbmcgR0xJQiwgeW91J2xsIG5lZWQgdG8gc2V0IHlvdXIiCisgICAgICAgICAgZWNobyAiKioqIExEX0xJQlJBUllfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgZWRpdCAvZXRjL2xkLnNvLmNvbmYgdG8gcG9pbnQiCisgICAgICAgICAgZWNobyAiKioqIHRvIHRoZSBpbnN0YWxsZWQgbG9jYXRpb24gIEFsc28sIG1ha2Ugc3VyZSB5b3UgaGF2ZSBydW4gbGRjb25maWcgaWYgdGhhdCIKKyAgICAgICAgICBlY2hvICIqKiogaXMgcmVxdWlyZWQgb24geW91ciBzeXN0ZW0iCisJICBlY2hvICIqKioiCisgICAgICAgICAgZWNobyAiKioqIElmIHlvdSBoYXZlIGFuIG9sZCB2ZXJzaW9uIGluc3RhbGxlZCwgaXQgaXMgYmVzdCB0byByZW1vdmUgaXQsIGFsdGhvdWdoIgorICAgICAgICAgIGVjaG8gIioqKiB5b3UgbWF5IGFsc28gYmUgYWJsZSB0byBnZXQgdGhpbmdzIHRvIHdvcmsgYnkgbW9kaWZ5aW5nIExEX0xJQlJBUllfUEFUSCIKKyAgICAgICAgICBlY2hvICIqKioiCisgICAgICAgICAgZWNobyAiKioqIElmIHlvdSBoYXZlIGEgUmVkSGF0IDUuMCBzeXN0ZW0sIHlvdSBzaG91bGQgcmVtb3ZlIHRoZSBHVEsgcGFja2FnZSB0aGF0IgorICAgICAgICAgIGVjaG8gIioqKiBjYW1lIHdpdGggdGhlIHN5c3RlbSB3aXRoIHRoZSBjb21tYW5kIgorICAgICAgICAgIGVjaG8gIioqKiIKKyAgICAgICAgICBlY2hvICIqKiogICAgcnBtIC0tZXJhc2UgLS1ub2RlcHMgZ3RrIGd0ay1kZXZlbCIgXSwKKyAgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBmYWlsZWQgdG8gY29tcGlsZSBvciBsaW5rLiBTZWUgdGhlIGZpbGUgY29uZmlnLmxvZyBmb3IgdGhlIgorICAgICAgICAgIGVjaG8gIioqKiBleGFjdCBlcnJvciB0aGF0IG9jY3VyZWQuIFRoaXMgdXN1YWxseSBtZWFucyBHTElCIHdhcyBpbmNvcnJlY3RseSBpbnN0YWxsZWQiCisgICAgICAgICAgZWNobyAiKioqIG9yIHRoYXQgeW91IGhhdmUgbW92ZWQgR0xJQiBzaW5jZSBpdCB3YXMgaW5zdGFsbGVkLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHlvdSIKKyAgICAgICAgICBlY2hvICIqKiogbWF5IHdhbnQgdG8gZWRpdCB0aGUgZ2xpYi1jb25maWcgc2NyaXB0OiAkR0xJQl9DT05GSUciIF0pCisgICAgICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgICAgICAgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyAgICAgICBmaQorICAgICBmaQorICAgICBHTElCX0NGTEFHUz0iIgorICAgICBHTElCX0xJQlM9IiIKKyAgICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKKyAgZmkKKyAgQUNfU1VCU1QoR0xJQl9DRkxBR1MpCisgIEFDX1NVQlNUKEdMSUJfTElCUykKKyAgcm0gLWYgY29uZi5nbGlidGVzdAorXSkKZGlmZiAtLWdpdCBhL200L2dzdC1hbHNhLm00IGIvbTQvZ3N0LWFsc2EubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0MWQwNgotLS0gL2Rldi9udWxsCisrKyBiL200L2dzdC1hbHNhLm00CkBAIC0wLDAgKzEsMTUwIEBACitkbmwgQ29uZmlndXJlIFBhdGhzIGZvciBBbHNhCitkbmwgU29tZSBtb2RpZmljYXRpb25zIGJ5IFJpY2hhcmQgQm91bHRvbiA8cmljaGFyZC1hbHNhQHRhcnRhcnVzLm9yZz4KK2RubCBDaHJpc3RvcGhlciBMYW5zZG93biA8bGFuc2RvY3RAY3MuYWxmcmVkLmVkdT4KK2RubCBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CitkbmwgTGFzdCBtb2RpZmljYXRpb246IGFsc2EubTQsdiAxLjIzIDIwMDQvMDEvMTYgMTg6MTQ6MjIgdGl3YWkgRXhwCitkbmwgQU1fUEFUSF9BTFNBKFtNSU5JTVVNLVZFUlNJT04gWywgQUNUSU9OLUlGLUZPVU5EIFssIEFDVElPTi1JRi1OT1QtRk9VTkRdXV0pCitkbmwgVGVzdCBmb3IgbGliYXNvdW5kLCBhbmQgZGVmaW5lIEFMU0FfQ0ZMQUdTIGFuZCBBTFNBX0xJQlMgYXMgYXBwcm9wcmlhdGUuCitkbmwgZW5hYmxlcyBhcmd1bWVudHMgLS13aXRoLWFsc2EtcHJlZml4PQorZG5sICAgICAgICAgICAgICAgICAgIC0td2l0aC1hbHNhLWVuYy1wcmVmaXg9CitkbmwgICAgICAgICAgICAgICAgICAgLS1kaXNhYmxlLWFsc2F0ZXN0CitkbmwKK2RubCBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGlmIEFDVElPTl9JRl9OT1RfRk9VTkQgaXMgbm90IHNwZWNpZmllZCwKK2RubCBhbmQgdGhlIGFsc2EgbGlicmFyaWVzIGFyZSBub3QgZm91bmQsIGEgZmF0YWwgQUNfTVNHX0VSUk9SKCkgd2lsbCByZXN1bHQuCitkbmwKK0FDX0RFRlVOKFtBTV9QQVRIX0FMU0FdLAorW2RubCBTYXZlIHRoZSBvcmlnaW5hbCBDRkxBR1MsIExERkxBR1MsIGFuZCBMSUJTCithbHNhX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorYWxzYV9zYXZlX0xERkxBR1M9IiRMREZMQUdTIgorYWxzYV9zYXZlX0xJQlM9IiRMSUJTIgorYWxzYV9mb3VuZD15ZXMKKworZG5sCitkbmwgR2V0IHRoZSBjZmxhZ3MgYW5kIGxpYnJhcmllcyBmb3IgYWxzYQorZG5sCitBQ19BUkdfV0lUSChhbHNhLXByZWZpeCwKKyAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1hbHNhLXByZWZpeD1QRlhdLAorICAgICAgICAgICAgICAgICBbcHJlZml4IHdoZXJlIEFsc2EgbGlicmFyeSBpcyBpbnN0YWxsZWQob3B0aW9uYWwpXSksCisgIFthbHNhX3ByZWZpeD0iJHdpdGh2YWwiXSwgW2Fsc2FfcHJlZml4PSIiXSkKKworQUNfQVJHX1dJVEgoYWxzYS1pbmMtcHJlZml4LAorICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWFsc2EtaW5jLXByZWZpeD1QRlhdLAorICAgICAgICAgICAgICAgICBbcHJlZml4IHdoZXJlIGluY2x1ZGUgbGlicmFyaWVzIGFyZSAob3B0aW9uYWwpXSksCisgIFthbHNhX2luY19wcmVmaXg9IiR3aXRodmFsIl0sIFthbHNhX2luY19wcmVmaXg9IiJdKQorCitkbmwgRklYTUU6IHRoaXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZAorZG5sIEFDX0FSR19FTkFCTEUoYWxzYXRlc3QsCitkbmwgIEFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtYWxzYXRlc3RdLAorZG5sICAgICAgICAgICAgICAgICBbZG8gbm90IHRyeSB0byBjb21waWxlIGFuZCBydW4gYSB0ZXN0IEFsc2EgcHJvZ3JhbV0sCitkbmwgICAgICAgICAgICAgICAgIFtlbmFibGVfYWxzYXRlc3Q9bm9dLCBbZW5hYmxlX2Fsc2F0ZXN0PXllc10pCisKK2RubCBBZGQgYW55IHNwZWNpYWwgaW5jbHVkZSBkaXJlY3RvcmllcworQUNfTVNHX0NIRUNLSU5HKGZvciBBTFNBIENGTEFHUykKK2lmIHRlc3QgIiRhbHNhX2luY19wcmVmaXgiICE9ICIiIDsgdGhlbgorCUFMU0FfQ0ZMQUdTPSIkQUxTQV9DRkxBR1MgLUkkYWxzYV9pbmNfcHJlZml4IgorCUNGTEFHUz0iJENGTEFHUyAtSSRhbHNhX2luY19wcmVmaXgiCitmaQorQUNfTVNHX1JFU1VMVCgkQUxTQV9DRkxBR1MpCisKK2RubCBhZGQgYW55IHNwZWNpYWwgbGliIGRpcnMKK0FDX01TR19DSEVDS0lORyhmb3IgQUxTQSBMREZMQUdTKQoraWYgdGVzdCAiJGFsc2FfcHJlZml4IiAhPSAiIiA7IHRoZW4KKwlBTFNBX0xJQlM9IiRBTFNBX0xJQlMgLUwkYWxzYV9wcmVmaXgiCisJTERGTEFHUz0iJExERkxBR1MgJEFMU0FfTElCUyIKK2ZpCisKK2RubCBhZGQgdGhlIGFsc2EgbGlicmFyeQorQUxTQV9MSUJTPSIkQUxTQV9MSUJTIC1sYXNvdW5kIC1sbSAtbGRsIC1scHRocmVhZCIKK0xJQlM9YGVjaG8gJExJQlMgfCBzZWQgJ3MvLWxtLy8nYAorTElCUz1gZWNobyAkTElCUyB8IHNlZCAncy8tbGRsLy8nYAorTElCUz1gZWNobyAkTElCUyB8IHNlZCAncy8tbHB0aHJlYWQvLydgCitMSUJTPWBlY2hvICRMSUJTIHwgc2VkICdzLyAgLy8nYAorTElCUz0iJEFMU0FfTElCUyAkTElCUyIKK0FDX01TR19SRVNVTFQoJEFMU0FfTElCUykKKworZG5sIENoZWNrIGZvciBhIHdvcmtpbmcgdmVyc2lvbiBvZiBsaWJhc291bmQgdGhhdCBpcyBvZiB0aGUgcmlnaHQgdmVyc2lvbi4KK21pbl9hbHNhX3ZlcnNpb249aWZlbHNlKFskMV0sICwwLjEuMSwkMSkKK0FDX01TR19DSEVDS0lORyhmb3IgbGliYXNvdW5kIGhlYWRlcnMgdmVyc2lvbiA+PSAkbWluX2Fsc2FfdmVyc2lvbikKK25vX2Fsc2E9IiIKKyAgICBhbHNhX21pbl9tYWpvcl92ZXJzaW9uPWBlY2hvICRtaW5fYWxzYV92ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDEvJ2AKKyAgICBhbHNhX21pbl9taW5vcl92ZXJzaW9uPWBlY2hvICRtaW5fYWxzYV92ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDIvJ2AKKyAgICBhbHNhX21pbl9taWNyb192ZXJzaW9uPWBlY2hvICRtaW5fYWxzYV92ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDMvJ2AKKworQUNfTEFOR19TQVZFCitBQ19MQU5HX0MKK0FDX1RSWV9DT01QSUxFKFsKKyNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgorXSwgWwordm9pZCBtYWluKHZvaWQpCit7CisvKiBlbnN1cmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworI2lmICFkZWZpbmVkKFNORF9MSUJfTUFKT1IpICYmIGRlZmluZWQoU09VTkRMSUJfVkVSU0lPTl9NQUpPUikKKyNkZWZpbmUgU05EX0xJQl9NQUpPUiBTT1VORExJQl9WRVJTSU9OX01BSk9SCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTTkRfTElCX01JTk9SKSAmJiBkZWZpbmVkKFNPVU5ETElCX1ZFUlNJT05fTUlOT1IpCisjZGVmaW5lIFNORF9MSUJfTUlOT1IgU09VTkRMSUJfVkVSU0lPTl9NSU5PUgorI2VuZGlmCisjaWYgIWRlZmluZWQoU05EX0xJQl9TVUJNSU5PUikgJiYgZGVmaW5lZChTT1VORExJQl9WRVJTSU9OX1NVQk1JTk9SKQorI2RlZmluZSBTTkRfTElCX1NVQk1JTk9SIFNPVU5ETElCX1ZFUlNJT05fU1VCTUlOT1IKKyNlbmRpZgorCisjICBpZihTTkRfTElCX01BSk9SID4gJGFsc2FfbWluX21ham9yX3ZlcnNpb24pCisgIGV4aXQoMCk7CisjICBlbHNlCisjICAgIGlmKFNORF9MSUJfTUFKT1IgPCAkYWxzYV9taW5fbWFqb3JfdmVyc2lvbikKKyMgICAgICAgZXJyb3Igbm90IHByZXNlbnQKKyMgICAgZW5kaWYKKworIyAgIGlmKFNORF9MSUJfTUlOT1IgPiAkYWxzYV9taW5fbWlub3JfdmVyc2lvbikKKyAgZXhpdCgwKTsKKyMgICBlbHNlCisjICAgICBpZihTTkRfTElCX01JTk9SIDwgJGFsc2FfbWluX21pbm9yX3ZlcnNpb24pCisjICAgICAgICAgIGVycm9yIG5vdCBwcmVzZW50CisjICAgICAgZW5kaWYKKworIyAgICAgIGlmKFNORF9MSUJfU1VCTUlOT1IgPCAkYWxzYV9taW5fbWljcm9fdmVyc2lvbikKKyMgICAgICAgIGVycm9yIG5vdCBwcmVzZW50CisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCitleGl0KDApOworfQorXSwKKyAgW0FDX01TR19SRVNVTFQoZm91bmQuKV0sCisgIFtBQ19NU0dfUkVTVUxUKG5vdCBwcmVzZW50LikKKyAgIGlmZWxzZShbJDNdLCAsIFtBQ19NU0dfRVJST1IoU3VmZmljaWVudGx5IG5ldyB2ZXJzaW9uIG9mIGxpYmFzb3VuZCBub3QgZm91bmQuKV0pCisgICBhbHNhX2ZvdW5kPW5vXQorKQorQUNfTEFOR19SRVNUT1JFCisKK2RubCBOb3cgdGhhdCB3ZSBrbm93IHRoYXQgd2UgaGF2ZSB0aGUgcmlnaHQgdmVyc2lvbiwgbGV0J3Mgc2VlIGlmIHdlIGhhdmUgdGhlIGxpYnJhcnkgYW5kIG5vdCBqdXN0IHRoZSBoZWFkZXJzLgoraWYgdGVzdCAieCRlbmFibGVfYWxzYXRlc3QiID0gInh5ZXMiOyB0aGVuCitBQ19DSEVDS19MSUIoW2Fzb3VuZF0sIFtzbmRfY3RsX29wZW5dLCwKKwlbaWZlbHNlKFskM10sICwgW0FDX01TR19FUlJPUihObyBsaW5rYWJsZSBsaWJhc291bmQgd2FzIGZvdW5kLildKQorCSBhbHNhX2ZvdW5kPW5vXQorKQorZmkKKworaWYgdGVzdCAieCRhbHNhX2ZvdW5kIiA9ICJ4eWVzIiA7IHRoZW4KKyAgIGlmZWxzZShbJDJdLCAsIDosIFskMl0pCisgICBMSUJTPWBlY2hvICRMSUJTIHwgc2VkICdzLy1sYXNvdW5kLy9nJ2AKKyAgIExJQlM9YGVjaG8gJExJQlMgfCBzZWQgJ3MvICAvLydgCisgICBMSUJTPSItbGFzb3VuZCAkTElCUyIKK2ZpCitpZiB0ZXN0ICJ4JGFsc2FfZm91bmQiID0gInhubyIgOyB0aGVuCisgICBpZmVsc2UoWyQzXSwgLCA6LCBbJDNdKQorICAgQ0ZMQUdTPSIkYWxzYV9zYXZlX0NGTEFHUyIKKyAgIExERkxBR1M9IiRhbHNhX3NhdmVfTERGTEFHUyIKKyAgIExJQlM9IiRhbHNhX3NhdmVfTElCUyIKKyAgIEFMU0FfQ0ZMQUdTPSIiCisgICBBTFNBX0xJQlM9IiIKK2ZpCisKK2RubCBUaGF0IHNob3VsZCBiZSBpdC4gIE5vdyBqdXN0IGV4cG9ydCBvdXQgc3ltYm9sczoKK0FDX1NVQlNUKEFMU0FfQ0ZMQUdTKQorQUNfU1VCU1QoQUxTQV9MSUJTKQorXSkKKwpkaWZmIC0tZ2l0IGEvbTQvZ3N0LWFydHNjLm00IGIvbTQvZ3N0LWFydHNjLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTk5NjAKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9nc3QtYXJ0c2MubTQKQEAgLTAsMCArMSwyOCBAQAorZG5sIFBlcmZvcm0gYSBjaGVjayBmb3IgZXhpc3RlbmNlIG9mIEFSVFNDCitkbmwgUmljaGFyZCBCb3VsdG9uIDxyaWNoYXJkLWFsc2FAdGFydGFydXMub3JnPgorZG5sIExhc3QgbW9kaWZpY2F0aW9uOiAyNi8wNi8yMDAxCitkbmwgR1NUX0NIRUNLX0FSVFNDKCkKK2RubAorZG5sIFRoaXMgY2hlY2sgd2FzIHdyaXR0ZW4gZm9yIEdTdHJlYW1lcjogaXQgc2hvdWxkIGJlIHJlbmFtZWQgYW5kIGNoZWNrZWQKK2RubCBmb3IgcG9ydGFiaWxpdHkgaWYgeW91IGRlY2lkZSB0byB1c2UgaXQgZWxzZXdoZXJlLgorZG5sCitBQ19ERUZVTihbR1NUX0NIRUNLX0FSVFNDXSwKK1sgCisgIEFDX1BBVEhfUFJPRyhBUlRTQ19DT05GSUcsIGFydHNjLWNvbmZpZywgbm8pCisgIGlmIHRlc3QgIngkQVJUU0NfQ09ORklHIiA9ICJ4bm8iOyB0aGVuCisgICAgQUNfTVNHX1dBUk4oW0NvdWxkbid0IGZpbmQgYXJ0c2MtY29uZmlnXSkKKyAgICBIQVZFX0FSVFNDPW5vCisgICAgQVJUU0NfTElCUz0KKyAgICBBUlRTQ19DRkxBR1M9CisgIGVsc2UKKyAgICBBUlRTQ19MSUJTPWBhcnRzYy1jb25maWcgLS1saWJzYAorICAgIEFSVFNDX0NGTEFHUz1gYXJ0c2MtY29uZmlnIC0tY2ZsYWdzYAorICAgIGRubCBBQ19DSEVDS19IRUFERVIgdXNlcyBDUFBGTEFHUywgYnV0IG5vdCBDRkxBR1MuICAKKyAgICBkbmwgRklYTUU6IEVuc3VyZSBvbmx5IHN1aXRhYmxlIGZsYWdzIHJlc3VsdCBmcm9tIGFydHNjLWNvbmZpZyAtLWNmbGFncworICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJEFSVFNDX0NGTEFHUyIKKyAgICBBQ19DSEVDS19IRUFERVIoYXJ0c2MuaCwgSEFWRV9BUlRTQz15ZXMsIEhBVkVfQVJUU0M9bm8pCisgIGZpCisgIEFDX1NVQlNUKEFSVFNDX0xJQlMpCisgIEFDX1NVQlNUKEFSVFNDX0NGTEFHUykgCitdKQorCmRpZmYgLS1naXQgYS9tNC9nc3QtZmlvbnJlYWQubTQgYi9tNC9nc3QtZmlvbnJlYWQubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAzYWE0NQotLS0gL2Rldi9udWxsCisrKyBiL200L2dzdC1maW9ucmVhZC5tNApAQCAtMCwwICsxLDQyIEBACitBQ19ERUZVTihbR1NUX0NIRUNLX0ZJT05SRUFEXSwgWworCisgIEFDX01TR19DSEVDS0lORyhmb3IgRklPTlJFQUQgaW4gc3lzL2lvY3RsLmgpCisgIEFDX0NBQ0hFX1ZBTChfY3ZfZ3N0X2Zpb25yZWFkX2luX3N5c19pb2N0bCwgWworICAgIEFDX1RSWV9DT01QSUxFKFsKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KK10sIFsKK2ludCB4ID0gRklPTlJFQUQ7CitpZiAoIHggKQorICByZXR1cm4gMDsKKyAgICBdLCBfY3ZfZ3N0X2Zpb25yZWFkX2luX3N5c19pb2N0bD0ieWVzIixfY3ZfZ3N0X2Zpb25yZWFkX2luX3N5c19pb2N0bD0ibm8iKQorICBdKQorCisgIEFDX01TR19SRVNVTFQoJF9jdl9nc3RfZmlvbnJlYWRfaW5fc3lzX2lvY3RsKQorCisgIGlmIHRlc3QgIiRfY3ZfZ3N0X2Zpb25yZWFkX2luX3N5c19pb2N0bCIgPSAieWVzIjsgdGhlbgorICAgIEFDX0RFRklORShbSEFWRV9GSU9OUkVBRF9JTl9TWVNfSU9DVExdLCAxLCBbRklPTlJFQUQgaW9jdGwgZm91bmQgaW4gc3lzL2lvY2x0LmhdKQorCisgIGVsc2UKKworICAgIEFDX01TR19DSEVDS0lORyhmb3IgRklPTlJFQUQgaW4gc3lzL2ZpbGlvLmgpCisgICAgQUNfQ0FDSEVfVkFMKF9jdl9nc3RfZmlvbnJlYWRfaW5fc3lzX2ZpbGlvLCBbCisgICAgICBBQ19UUllfQ09NUElMRShbCisgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgI2luY2x1ZGUgPHN5cy9maWxpby5oPgorICBdLCBbCisgIGludCB4ID0gRklPTlJFQUQ7CisgIGlmICggeCApCisgICAgcmV0dXJuIDA7CisgICAgICBdLCBfY3ZfZ3N0X2Zpb25yZWFkX2luX3N5c19maWxpbz0ieWVzIixfY3ZfZ3N0X2Zpb25yZWFkX2luX3N5c19maWxpbz0ibm8iKQorICAgIF0pCisKKyAgICBBQ19NU0dfUkVTVUxUKCRfY3ZfZ3N0X2Zpb25yZWFkX2luX3N5c19maWxpbykKKworICAgIGlmIHRlc3QgIiRfY3ZfZ3N0X2Zpb25yZWFkX2luX3N5c19maWxpbyIgPSAieWVzIjsgdGhlbgorICAgICAgQUNfREVGSU5FKFtIQVZFX0ZJT05SRUFEX0lOX1NZU19GSUxJT10sIDEsIFtGSU9OUkVBRCBpb2N0bCBmb3VuZCBpbiBzeXMvZmlsaW8uaF0pCisgICAgZmkKKworICBmaQorCitdKQpkaWZmIC0tZ2l0IGEvbTQvZ3N0LWl2b3JiaXMubTQgYi9tNC9nc3QtaXZvcmJpcy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTM1YmJiCi0tLSAvZGV2L251bGwKKysrIGIvbTQvZ3N0LWl2b3JiaXMubTQKQEAgLTAsMCArMSw2OCBAQAorIyBDb25maWd1cmUgcGF0aHMgZm9yIFRyZW1vcgorCitkbmwgWElQSF9QQVRIX0lWT1JCSVMoW0FDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EXV0pCitkbmwgVGVzdCBmb3IgbGliaXZvcmJpcywgYW5kIGRlZmluZSBJVk9SQklTX0NGTEFHUyBhbmQgSVZPUkJJU19MSUJTCitkbmwKK0FDX0RFRlVOKFtYSVBIX1BBVEhfSVZPUkJJU10sCitbZG5sIAorZG5sIEdldCB0aGUgY2ZsYWdzIGFuZCBsaWJyYXJpZXMKK2RubAorQUNfQVJHX1dJVEgoaXZvcmJpcyxbICAtLXdpdGgtaXZvcmJpcz1QRlggICBQcmVmaXggd2hlcmUgbGliaXZvcmJpcyBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sIGl2b3JiaXNfcHJlZml4PSIkd2l0aHZhbCIsIGl2b3JiaXNfcHJlZml4PSIiKQorQUNfQVJHX1dJVEgoaXZvcmJpcy1saWJyYXJpZXMsWyAgLS13aXRoLWl2b3JiaXMtbGlicmFyaWVzPURJUiAgIERpcmVjdG9yeSB3aGVyZSBsaWJpdm9yYmlzIGxpYnJhcnkgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldLCBpdm9yYmlzX2xpYnJhcmllcz0iJHdpdGh2YWwiLCBpdm9yYmlzX2xpYnJhcmllcz0iIikKK0FDX0FSR19XSVRIKGl2b3JiaXMtaW5jbHVkZXMsWyAgLS13aXRoLWl2b3JiaXMtaW5jbHVkZXM9RElSICAgRGlyZWN0b3J5IHdoZXJlIGxpYml2b3JiaXMgaGVhZGVyIGZpbGVzIGFyZSBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sIGl2b3JiaXNfaW5jbHVkZXM9IiR3aXRodmFsIiwgaXZvcmJpc19pbmNsdWRlcz0iIikKK0FDX0FSR19FTkFCTEUoaXZvcmJpc3Rlc3QsIFsgIC0tZGlzYWJsZS1pdm9yYmlzdGVzdCAgICAgICBEbyBub3QgdHJ5IHRvIGNvbXBpbGUgYW5kIHJ1biBhIHRlc3QgSXZvcmJpcyBwcm9ncmFtXSwsIGVuYWJsZV9pdm9yYmlzdGVzdD15ZXMpCisKKyAgaWYgdGVzdCAieCRpdm9yYmlzX2xpYnJhcmllcyIgIT0gIngiIDsgdGhlbgorICAgIElWT1JCSVNfTElCUz0iLUwkaXZvcmJpc19saWJyYXJpZXMiCisgIGVsaWYgdGVzdCAieCRpdm9yYmlzX3ByZWZpeCIgIT0gIngiIDsgdGhlbgorICAgIElWT1JCSVNfTElCUz0iLUwkaXZvcmJpc19wcmVmaXgvbGliIgorICBlbGlmIHRlc3QgIngkcHJlZml4IiAhPSAieE5PTkUiOyB0aGVuCisgICAgSVZPUkJJU19MSUJTPSItTCRwcmVmaXgvbGliIgorICBmaQorCisgIElWT1JCSVNfTElCUz0iJElWT1JCSVNfTElCUyAtbHZvcmJpc2lkZWMgLWxtIgorCisgIGlmIHRlc3QgIngkaXZvcmJpc19pbmNsdWRlcyIgIT0gIngiIDsgdGhlbgorICAgIElWT1JCSVNfQ0ZMQUdTPSItSSRpdm9yYmlzX2luY2x1ZGVzIgorICBlbGlmIHRlc3QgIngkaXZvcmJpc19wcmVmaXgiICE9ICJ4IiA7IHRoZW4KKyAgICBJVk9SQklTX0NGTEFHUz0iLUkkaXZvcmJpc19wcmVmaXgvaW5jbHVkZSIKKyAgZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0gInhOT05FIjsgdGhlbgorICAgIElWT1JCSVNfQ0ZMQUdTPSItSSRwcmVmaXgvaW5jbHVkZSIKKyAgZmkKKworICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIFRyZW1vcikKKyAgbm9faXZvcmJpcz0iIgorCisgIGlmIHRlc3QgIngkZW5hYmxlX2l2b3JiaXN0ZXN0IiA9ICJ4eWVzIiA7IHRoZW4KKyAgICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICBhY19zYXZlX0xJQlM9IiRMSUJTIgorICAgIENGTEFHUz0iJENGTEFHUyAkSVZPUkJJU19DRkxBR1MgJE9HR19DRkxBR1MiCisgICAgTElCUz0iJExJQlMgJElWT1JCSVNfTElCUyAkT0dHX0xJQlMiCitkbmwKK2RubCBOb3cgY2hlY2sgaWYgdGhlIGluc3RhbGxlZCBUcmVtb3IgaXMgc3VmZmljaWVudGx5IG5ldy4KK2RubAorICAgICAgcm0gLWYgY29uZi5pdm9yYmlzdGVzdAorICAgICAgQUNfVFJZX0NPTVBJTEUoWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dHJlbW9yL2NvZGVjLmg+CitdLCwsIG5vX2l2b3JiaXM9eWVzKQorICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgIGZpCisKKyAgaWYgdGVzdCAieCRub19pdm9yYmlzIiA9ICJ4IiA7IHRoZW4KKyAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgIGlmZWxzZShbJDFdLCAsIDosIFskMV0pICAgICAKKyAgZWxzZQorICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICBJVk9SQklTX0NGTEFHUz0iIgorICAgICBJVk9SQklTX0xJQlM9IiIKKyAgICAgSVZPUkJJU0ZJTEVfTElCUz0iIgorICAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKQorICBmaQorICBBQ19TVUJTVChJVk9SQklTX0NGTEFHUykKKyAgQUNfU1VCU1QoSVZPUkJJU19MSUJTKQorICBBQ19TVUJTVChJVk9SQklTRklMRV9MSUJTKQorXSkKZGlmZiAtLWdpdCBhL200L2dzdC1tYXRyb3NrYS5tNCBiL200L2dzdC1tYXRyb3NrYS5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTBjYWFhCi0tLSAvZGV2L251bGwKKysrIGIvbTQvZ3N0LW1hdHJvc2thLm00CkBAIC0wLDAgKzEsMjYyIEBACisjIENvbmZpZ3VyZSBwYXRocyBmb3IgbGliZWJtbAorCitkbmwgUEFUSF9FQk1MKFtBQ1RJT04tSUYtRk9VTkQgWywgQUNUSU9OLUlGLU5PVC1GT1VORF1dKQorZG5sIFRlc3QgZm9yIGxpYmVibWwsIGFuZCBkZWZpbmUgRUJNTF9DRkxBR1MgYW5kIEVCTUxfTElCUworZG5sCitBQ19ERUZVTihbUEFUSF9FQk1MXSwKK1tkbmwgCitkbmwgR2V0IHRoZSBjZmxhZ3MgYW5kIGxpYnJhcmllcworZG5sCitBQ19BUkdfV0lUSChlYm1sLXByZWZpeCxbICAtLXdpdGgtZWJtbC1wcmVmaXg9UEZYICAgICAgICBQcmVmaXggd2hlcmUgbGliZWJtbCBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sIGVibWxfcHJlZml4PSIkd2l0aHZhbCIsIGVibWxfcHJlZml4PSIiKQorQUNfQVJHX1dJVEgoZWJtbC1pbmNsdWRlLFsgIC0td2l0aC1lYm1sLWluY2x1ZGU9RElSICAgICAgIFBhdGggdG8gd2hlcmUgdGhlIGxpYmVibWwgaW5jbHVkZSBmaWxlcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sIGVibWxfaW5jbHVkZT0iJHdpdGh2YWwiLCBlYm1sX2luY2x1ZGU9IiIpCitBQ19BUkdfV0lUSChlYm1sLWxpYixbICAtLXdpdGgtZWJtbC1saWI9RElSICAgICAgICAgICBQYXRoIHRvIHdoZXJlIHRoZSBsaWJlYm1sIGxpYnJhcnkgaW5zdGFsbGVkIChvcHRpb25hbCldLCBlYm1sX2xpYj0iJHdpdGh2YWwiLCBlYm1sX2xpYj0iIikKK0FDX0FSR19FTkFCTEUoZWJtbHRlc3QsIFsgIC0tZGlzYWJsZS1lYm1sdGVzdCAgICAgICAgICAgIERvIG5vdCB0cnkgdG8gY29tcGlsZSBhbmQgcnVuIGEgdGVzdCBFQk1MIHByb2dyYW1dLCwgZW5hYmxlX2VibWx0ZXN0PXllcykKKworICBpZiB0ZXN0ICJ4JGVibWxfcHJlZml4IiAhPSAieCI7IHRoZW4KKyAgICBlYm1sX2FyZ3M9IiRlYm1sX2FyZ3MgLS1wcmVmaXg9JGVibWxfcHJlZml4IgorICAgIGlmIHRlc3QgIngkZWJtbF9pbmNsdWRlIiAhPSAieCI7IHRoZW4KKyAgICAgIEVCTUxfQ0ZMQUdTPSItSSRlYm1sX2luY2x1ZGUiCisgICAgZWxzZQorICAgICAgRUJNTF9DRkxBR1M9Ii1JJGVibWxfcHJlZml4L2luY2x1ZGUvZWJtbCIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkZWJtbF9saWIiICE9ICJ4IjsgdGhlbgorICAgICAgRUJNTF9MSUJTPSItTCRlYm1sX2xpYiIKKyAgICBlbHNlCisgICAgICBFQk1MX0xJQlM9Ii1MJGVibWxfcHJlZml4L2xpYiIKKyAgICBmaQorICBlbGlmIHRlc3QgIngkcHJlZml4IiAhPSAieE5PTkUiOyB0aGVuCisgICAgZWJtbF9hcmdzPSIkZWJtbF9hcmdzIC0tcHJlZml4PSRwcmVmaXgiCisgICAgaWYgdGVzdCAieCRlYm1sX2luY2x1ZGUiICE9ICJ4IjsgdGhlbgorICAgICAgRUJNTF9DRkxBR1M9Ii1JJGVibWxfaW5jbHVkZSIKKyAgICBlbHNlCisgICAgICBFQk1MX0NGTEFHUz0iLUkkcHJlZml4L2luY2x1ZGUvZWJtbCIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkZWJtbF9saWIiICE9ICJ4IjsgdGhlbgorICAgICAgRUJNTF9MSUJTPSItTCRlYm1sX2xpYiIKKyAgICBlbHNlCisgICAgICBFQk1MX0xJQlM9Ii1MJHByZWZpeC9saWIiCisgICAgZmkKKyAgZWxzZQorICAgIGlmIHRlc3QgIngkZWJtbF9pbmNsdWRlIiAhPSAieCI7IHRoZW4KKyAgICAgIEVCTUxfQ0ZMQUdTPSItSSRlYm1sX2luY2x1ZGUiCisgICAgZWxzZQorICAgICAgRUJNTF9DRkxBR1M9Ii1JL3Vzci9pbmNsdWRlL2VibWwgLUkvdXNyL2xvY2FsL2luY2x1ZGUvZWJtbCIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkZWJtbF9saWIiICE9ICJ4IjsgdGhlbgorICAgICAgRUJNTF9MSUJTPSItTCRlYm1sX2xpYiIKKyAgICBlbHNlCisgICAgICBFQk1MX0xJQlM9Ii1ML3Vzci9sb2NhbC9saWIiCisgICAgZmkKKyAgZmkKKworICBFQk1MX0xJQlM9IiRFQk1MX0xJQlMgLWxlYm1sIgorCisgIEFDX01TR19DSEVDS0lORyhmb3IgRUJNTCkKKyAgbm9fZWJtbD0iIgorCisKKyAgaWYgdGVzdCAieCRlbmFibGVfZWJtbHRlc3QiID0gInh5ZXMiIDsgdGhlbgorICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgIGFjX3NhdmVfTElCUz0iJExJQlMiCisgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRFQk1MX0NGTEFHUyIKKyAgICBMSUJTPSIkTElCUyAkRUJNTF9MSUJTIgorZG5sCitkbmwgTm93IGNoZWNrIGlmIHRoZSBpbnN0YWxsZWQgRUJNTCBpcyBzdWZmaWNpZW50bHkgbmV3LgorZG5sCisgICAgICBybSAtZiBjb25mLmVibWx0ZXN0CisgICAgICBBQ19UUllfUlVOKFsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPEVibWxDb25maWcuaD4KKworaW50IG1haW4gKCkKK3sKKyAgc3lzdGVtKCJ0b3VjaCBjb25mLmVibWx0ZXN0Iik7CisgIHJldHVybiAwOworfQorCitdLCwgbm9fZWJtbD15ZXMsW2VjaG8gJGFjX24gImNyb3NzIGNvbXBpbGluZzsgYXNzdW1lZCBPSy4uLiAkYWNfYyJdKQorICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgIGZpCisKKyAgaWYgdGVzdCAieCRub19lYm1sIiA9ICJ4IiA7IHRoZW4KKyAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgIGlmZWxzZShbJDFdLCAsIDosIFskMV0pICAgICAKKyAgZWxzZQorICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICBpZiB0ZXN0IC1mIGNvbmYuZWJtbHRlc3QgOyB0aGVuCisgICAgICAgOgorICAgICBlbHNlCisgICAgICAgZWNobyAiKioqIENvdWxkIG5vdCBydW4gRWJtbCB0ZXN0IHByb2dyYW0sIGNoZWNraW5nIHdoeS4uLiIKKyAgICAgICBDRkxBR1M9IiRDRkxBR1MgJEVCTUxfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRMSUJTICRFQk1MX0xJQlMiCisgICAgICAgQUNfVFJZX0xJTksoWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8RWJtbENvbmZpZy5oPgorXSwgICAgIFsgcmV0dXJuIDA7IF0sCisgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBjb21waWxlZCwgYnV0IGRpZCBub3QgcnVuLiBUaGlzIHVzdWFsbHkgbWVhbnMiCisgICAgICAgZWNobyAiKioqIHRoYXQgdGhlIHJ1bi10aW1lIGxpbmtlciBpcyBub3QgZmluZGluZyBFQk1MIG9yIGZpbmRpbmcgdGhlIHdyb25nIgorICAgICAgIGVjaG8gIioqKiB2ZXJzaW9uIG9mIEVCTUwuIElmIGl0IGlzIG5vdCBmaW5kaW5nIEVCTUwsIHlvdSdsbCBuZWVkIHRvIHNldCB5b3VyIgorICAgICAgIGVjaG8gIioqKiBMRF9MSUJSQVJZX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGVkaXQgL2V0Yy9sZC5zby5jb25mIHRvIHBvaW50IgorICAgICAgIGVjaG8gIioqKiB0byB0aGUgaW5zdGFsbGVkIGxvY2F0aW9uICBBbHNvLCBtYWtlIHN1cmUgeW91IGhhdmUgcnVuIGxkY29uZmlnIGlmIHRoYXQiCisgICAgICAgZWNobyAiKioqIGlzIHJlcXVpcmVkIG9uIHlvdXIgc3lzdGVtIgorICAgICAgIGVjaG8gIioqKiIKKyAgICAgICBlY2hvICIqKiogSWYgeW91IGhhdmUgYW4gb2xkIHZlcnNpb24gaW5zdGFsbGVkLCBpdCBpcyBiZXN0IHRvIHJlbW92ZSBpdCwgYWx0aG91Z2giCisgICAgICAgZWNobyAiKioqIHlvdSBtYXkgYWxzbyBiZSBhYmxlIHRvIGdldCB0aGluZ3MgdG8gd29yayBieSBtb2RpZnlpbmcgTERfTElCUkFSWV9QQVRIIl0sCisgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBmYWlsZWQgdG8gY29tcGlsZSBvciBsaW5rLiBTZWUgdGhlIGZpbGUgY29uZmlnLmxvZyBmb3IgdGhlIgorICAgICAgIGVjaG8gIioqKiBleGFjdCBlcnJvciB0aGF0IG9jY3VyZWQuIFRoaXMgdXN1YWxseSBtZWFucyBFQk1MIHdhcyBpbmNvcnJlY3RseSBpbnN0YWxsZWQiCisgICAgICAgZWNobyAiKioqIG9yIHRoYXQgeW91IGhhdmUgbW92ZWQgRUJNTCBzaW5jZSBpdCB3YXMgaW5zdGFsbGVkLiIgXSkKKyAgICAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKyAgICAgICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorICAgICBmaQorICAgICBFQk1MX0NGTEFHUz0iIgorICAgICBFQk1MX0xJQlM9IiIKKyAgICAgaWZlbHNlKFskMl0sICwgOiwgWyQyXSkKKyAgZmkKKyAgQUNfU1VCU1QoRUJNTF9DRkxBR1MpCisgIEFDX1NVQlNUKEVCTUxfTElCUykKKyAgcm0gLWYgY29uZi5lYm1sdGVzdAorXSkKKworIyBDb25maWd1cmUgcGF0aHMgZm9yIGxpYm1hdHJvc2thCisKK2RubCBQQVRIX01BVFJPU0tBKE1JTl9WRVJTSU9OLCBbQUNUSU9OLUlGLUZPVU5EIFssIEFDVElPTi1JRi1OT1QtRk9VTkRdXSkKK2RubCBUZXN0IGZvciBsaWJtYXRyb3NrYSwgYW5kIGRlZmluZSBNQVRST1NLQV9DRkxBR1MgYW5kIE1BVFJPU0tBX0xJQlMKK2RubAorQUNfREVGVU4oW1BBVEhfTUFUUk9TS0FdLAorW2RubCAKK2RubCBHZXQgdGhlIGNmbGFncyBhbmQgbGlicmFyaWVzCitkbmwKK0FDX0FSR19XSVRIKG1hdHJvc2thLXByZWZpeCxbICAtLXdpdGgtbWF0cm9za2EtcHJlZml4PVBGWCAgICBQcmVmaXggd2hlcmUgbGlibWF0cm9za2EgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldLCBtYXRyb3NrYV9wcmVmaXg9IiR3aXRodmFsIiwgbWF0cm9za2FfcHJlZml4PSIiKQorQUNfQVJHX1dJVEgobWF0cm9za2EtaW5jbHVkZSxbICAtLXdpdGgtbWF0cm9za2EtaW5jbHVkZT1ESVIgICBQYXRoIHRvIHdoZXJlIHRoZSBsaWJtYXRyb3NrYSBpbmNsdWRlIGZpbGVzIGluc3RhbGxlZCAob3B0aW9uYWwpXSwgbWF0cm9za2FfaW5jbHVkZT0iJHdpdGh2YWwiLCBtYXRyb3NrYV9pbmNsdWRlPSIiKQorQUNfQVJHX1dJVEgobWF0cm9za2EtbGliLFsgIC0td2l0aC1tYXRyb3NrYS1saWI9RElSICAgICAgIFBhdGggdG8gd2hlcmUgdGhlIGxpYm1hdHJvc2thIGxpYnJhcnkgaW5zdGFsbGVkIChvcHRpb25hbCldLCBtYXRyb3NrYV9saWI9IiR3aXRodmFsIiwgbWF0cm9za2FfbGliPSIiKQorQUNfQVJHX0VOQUJMRShtYXRyb3NrYXRlc3QsIFsgIC0tZGlzYWJsZS1tYXRyb3NrYXRlc3QgICAgICAgIERvIG5vdCB0cnkgdG8gY29tcGlsZSBhbmQgcnVuIGEgdGVzdCBNYXRyb3NrYSBwcm9ncmFtXSwsIGVuYWJsZV9tYXRyb3NrYXRlc3Q9eWVzKQorCisgIGlmIHRlc3QgIngkbWF0cm9za2FfcHJlZml4IiAhPSAieCI7IHRoZW4KKyAgICBtYXRyb3NrYV9hcmdzPSIkbWF0cm9za2FfYXJncyAtLXByZWZpeD0kbWF0cm9za2FfcHJlZml4IgorICAgIGlmIHRlc3QgIngkbWF0cm9za2FfaW5jbHVkZSIgIT0gIngiOyB0aGVuCisgICAgICBNQVRST1NLQV9DRkxBR1M9Ii1JJG1hdHJvc2thX2luY2x1ZGUiCisgICAgZWxzZQorICAgICAgTUFUUk9TS0FfQ0ZMQUdTPSItSSRtYXRyb3NrYV9wcmVmaXgvaW5jbHVkZS9tYXRyb3NrYSIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbWF0cm9za2FfbGliIiAhPSAieCI7IHRoZW4KKyAgICAgIE1BVFJPU0tBX0xJQlM9Ii1MJG1hdHJvc2thX2xpYiIKKyAgICBlbHNlCisgICAgICBNQVRST1NLQV9MSUJTPSItTCRtYXRyb3NrYV9wcmVmaXgvbGliIgorICAgIGZpCisgIGVsaWYgdGVzdCAieCRwcmVmaXgiICE9ICJ4Tk9ORSI7IHRoZW4KKyAgICBtYXRyb3NrYV9hcmdzPSIkbWF0cm9za2FfYXJncyAtLXByZWZpeD0kcHJlZml4IgorICAgIGlmIHRlc3QgIngkbWF0cm9za2FfaW5jbHVkZSIgIT0gIngiOyB0aGVuCisgICAgICBNQVRST1NLQV9DRkxBR1M9Ii1JJG1hdHJvc2thX2luY2x1ZGUiCisgICAgZWxzZQorICAgICAgTUFUUk9TS0FfQ0ZMQUdTPSItSSRwcmVmaXgvaW5jbHVkZS9tYXRyb3NrYSIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbWF0cm9za2FfbGliIiAhPSAieCI7IHRoZW4KKyAgICAgIE1BVFJPU0tBX0xJQlM9Ii1MJG1hdHJvc2thX2xpYiIKKyAgICBlbHNlCisgICAgICBNQVRST1NLQV9MSUJTPSItTCRwcmVmaXgvbGliIgorICAgIGZpCisgIGVsc2UKKyAgICBpZiB0ZXN0ICJ4JG1hdHJvc2thX2luY2x1ZGUiICE9ICJ4IjsgdGhlbgorICAgICAgTUFUUk9TS0FfQ0ZMQUdTPSItSSRtYXRyb3NrYV9pbmNsdWRlIgorICAgIGVsc2UKKyAgICAgIE1BVFJPU0tBX0NGTEFHUz0iLUkvdXNyL2luY2x1ZGUvbWF0cm9za2EgLUkvdXNyL2xvY2FsL2luY2x1ZGUvbWF0cm9za2EiCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG1hdHJvc2thX2xpYiIgIT0gIngiOyB0aGVuCisgICAgICBNQVRST1NLQV9MSUJTPSItTCRtYXRyb3NrYV9saWIiCisgICAgZWxzZQorICAgICAgTUFUUk9TS0FfTElCUz0iLUwvdXNyL2xvY2FsL2xpYiIKKyAgICBmaQorICBmaQorCisgIE1BVFJPU0tBX0xJQlM9IiRNQVRST1NLQV9MSUJTIC1sbWF0cm9za2EiCisKKyAgQUNfTVNHX0NIRUNLSU5HKGZvciBNYXRyb3NrYSkKKyAgbm9fbWF0cm9za2E9IiIKKworCisgIGlmIHRlc3QgIngkZW5hYmxlX21hdHJvc2thdGVzdCIgPSAieHllcyIgOyB0aGVuCisgICAgYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgorICAgIGFjX3NhdmVfTElCUz0iJExJQlMiCisgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAkTUFUUk9TS0FfQ0ZMQUdTICRFQk1MX0NGTEFHUyIKKyAgICBMSUJTPSIkTElCUyAkTUFUUk9TS0FfTElCUyAkRUJNTF9MSUJTIgorZG5sCitkbmwgTm93IGNoZWNrIGlmIHRoZSBpbnN0YWxsZWQgTWF0cm9za2EgaXMgc3VmZmljaWVudGx5IG5ldy4KK2RubAorICAgICAgcm0gLWYgY29uZi5tYXRyb3NrYXRlc3QKKyAgICAgIEFDX0xBTkdfQ1BMVVNQTFVTCisgICAgICBBQ19UUllfUlVOKFsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPEVibWxDb25maWcuaD4KKyNpbmNsdWRlIDxLYXhWZXJzaW9uLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBMSUJNQVRST1NLQV9OQU1FU1BBQ0U7CisKK2ludCBtYWluICgpCit7CisgIEZJTEUgKmY7CisgIGYgPSBmb3BlbigiY29uZi5tYXRyb3NrYXRlc3QiLCAid2IiKTsKKyAgaWYgKGYgPT0gTlVMTCkKKyAgICByZXR1cm4gMTsKKyAgZnByaW50ZihmLCAiJXNcbiIsIEtheENvZGVWZXJzaW9uLmNfc3RyKCkpOworICBmY2xvc2UoZik7CisgIHJldHVybiAwOworfQorCitdLCwgbm9fbWF0cm9za2E9eWVzLFtlY2hvICRhY19uICJjcm9zcyBjb21waWxpbmc7IGFzc3VtZWQgT0suLi4gJGFjX2MiXSkKKyAgICAgIEFDX0xBTkdfQworICAgICAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIgorICAgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JG5vX21hdHJvc2thIiA9ICJ4IiAtYSAtZiBjb25mLm1hdHJvc2thdGVzdCA7IHRoZW4KKyAgICBBQ19NU0dfUkVTVUxUKHllcykKKworICAgIEFDX01TR19DSEVDS0lORyhNYXRyb3NrYSB2ZXJzaW9uKQorCisgICAgbWF0cm9za2FfdmVyc2lvbj1gY2F0IGNvbmYubWF0cm9za2F0ZXN0YAorICAgIG1rX01BSlZFUj1gZWNobyAkMSB8IGN1dCAtZCIuIiAtZjFgCisgICAgbWtfTUlOVkVSPWBlY2hvICQxIHwgY3V0IC1kIi4iIC1mMmAKKyAgICBta19SRUxWRVI9YGVjaG8gJDEgfCBjdXQgLWQiLiIgLWYzYAorICAgIG12ZXJfb2s9YHNlZCAncztcLjtcIDtnJyA8IGNvbmYubWF0cm9za2F0ZXN0IHwgKHJlYWQgLWEgbXZlcgorICAgIGlmIHRlc3QgJHttdmVyW1swXV19IC1ndCAkbWtfTUFKVkVSIDsgdGhlbgorICAgICAgbXZlcl9vaz0xCisgICAgZWxpZiB0ZXN0ICR7bXZlcltbMF1dfSAtbHQgJG1rX01BSlZFUiA7IHRoZW4KKyAgICAgIG12ZXJfb2s9MAorICAgIGVsc2UKKyAgICAgIGlmIHRlc3QgJHttdmVyW1sxXV19IC1ndCAkbWtfTUlOVkVSIDsgdGhlbgorICAgICAgICBtdmVyX29rPTEKKyAgICAgIGVsaWYgdGVzdCAke212ZXJbWzFdXX0gLWx0ICRta19NSU5WRVIgOyB0aGVuCisgICAgICAgIG12ZXJfb2s9MAorICAgICAgZWxzZQorICAgICAgICBpZiB0ZXN0ICR7bXZlcltbMl1dfSAtZ2UgJG1rX1JFTFZFUiA7IHRoZW4KKyAgICAgICAgICBtdmVyX29rPTEKKyAgICAgICAgZWxzZQorICAgICAgICAgIG12ZXJfb2s9MAorICAgICAgICBmaQorICAgICAgZmkKKyAgICBmaQorICAgIGVjaG8gJG12ZXJfb2sgKWAKKyAgICBpZiB0ZXN0ICIkbXZlcl9vayIgPSAiMSIgOyB0aGVuCisgICAgICBBQ19NU0dfUkVTVUxUKCRtYXRyb3NrYV92ZXJzaW9uIG9rKQorICAgICAgIGlmZWxzZShbJDJdLCAsIDosIFskMl0pICAgICAKKyAgICBlbHNlCisgICAgICBBQ19NU0dfUkVTVUxUKCRtYXRyb3NrYV92ZXJzaW9uIHRvbyBvbGQpCisgICAgICBlY2hvICcqKiogWW91ciBNYXRyb3NrYSB2ZXJzaW9uIGlzIHRvbyBvbGQuIFVwZ3JhZGUgdG8gYXQgbGVhc3QgdmVyc2lvbicKKyAgICAgIGVjaG8gJyoqKiAkMSBhbmQgcmUtcnVuIGNvbmZpZ3VyZS4nCisgICAgICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkgICAgIAorICAgIGZpCisKKyAgZWxzZQorICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICBpZmVsc2UoWyQzXSwgLCA6LCBbJDNdKQorICBmaQorCisgIEFDX1NVQlNUKE1BVFJPU0tBX0NGTEFHUykKKyAgQUNfU1VCU1QoTUFUUk9TS0FfTElCUykKKyAgcm0gLWYgY29uZi5tYXRyb3NrYXRlc3QKK10pCmRpZmYgLS1naXQgYS9tNC9nc3Qtc2RsLm00IGIvbTQvZ3N0LXNkbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmMzMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbTQvZ3N0LXNkbC5tNApAQCAtMCwwICsxLDE4NCBAQAorIyBzdHVmZiBmb3IgU0RMLCBob3BlIHRoaXMgaGVscHMgaWYgd2UgcHV0IGl0IGhlcmUKKworIyBDb25maWd1cmUgcGF0aHMgZm9yIFNETAorIyBTYW0gTGFudGluZ2EgOS8yMS85OQorIyBzdG9sZW4gZnJvbSBNYW5pc2ggU2luZ2gKKyMgc3RvbGVuIGJhY2sgZnJvbSBGcmFuayBCZWxldworIyBzdG9sZW4gZnJvbSBNYW5pc2ggU2luZ2gKKyMgU2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gT3dlbiBUYXlsb3IKKworZG5sIEFNX1BBVEhfU0RMKFtNSU5JTVVNLVZFUlNJT04sIFtBQ1RJT04tSUYtRk9VTkQgWywgQUNUSU9OLUlGLU5PVC1GT1VORF1dXSkKK2RubCBUZXN0IGZvciBTREwsIGFuZCBkZWZpbmUgU0RMX0NGTEFHUyBhbmQgU0RMX0xJQlMKK2RubAorQUNfREVGVU4oW0FNX1BBVEhfU0RMXSwKK1tkbmwgCitkbmwgR2V0IHRoZSBjZmxhZ3MgYW5kIGxpYnJhcmllcyBmcm9tIHRoZSBzZGwtY29uZmlnIHNjcmlwdAorZG5sCitBQ19BUkdfV0lUSChzZGwtcHJlZml4LAorICBBQ19IRUxQX1NUUklORyhbLS13aXRoLXNkbC1wcmVmaXg9UEZYXSwKKyAgICAgICAgICAgICAgICAgW3ByZWZpeCB3aGVyZSBTREwgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldKSwKKyAgc2RsX3ByZWZpeD0iJHdpdGh2YWwiLCBzZGxfcHJlZml4PSIiKQorCitBQ19BUkdfV0lUSChzZGwtZXhlYy1wcmVmaXgsCisgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtc2RsLWV4ZWMtcHJlZml4PVBGWF0sCisgICAgICAgICAgICAgICAgIFtleGVjIHByZWZpeCB3aGVyZSBTREwgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldKSwKKyAgc2RsX2V4ZWNfcHJlZml4PSIkd2l0aHZhbCIsIHNkbF9leGVjX3ByZWZpeD0iIikKKworQUNfQVJHX0VOQUJMRShzZGx0ZXN0LAorICBBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXNkbHRlc3RdLAorICAgICAgICAgICAgICAgICBbZG8gbm90IHRyeSB0byBjb21waWxlIGFuZCBydW4gYSB0ZXN0IFNETCBwcm9ncmFtXSksCisgICwgZW5hYmxlX3NkbHRlc3Q9eWVzKQorCisgIGlmIHRlc3QgeCRzZGxfZXhlY19wcmVmaXggIT0geCA7IHRoZW4KKyAgICAgc2RsX2FyZ3M9IiRzZGxfYXJncyAtLWV4ZWMtcHJlZml4PSRzZGxfZXhlY19wcmVmaXgiCisgICAgIGlmIHRlc3QgeCR7U0RMX0NPTkZJRytzZXR9ICE9IHhzZXQgOyB0aGVuCisgICAgICAgIFNETF9DT05GSUc9JHNkbF9leGVjX3ByZWZpeC9iaW4vc2RsLWNvbmZpZworICAgICBmaQorICBmaQorICBpZiB0ZXN0IHgkc2RsX3ByZWZpeCAhPSB4IDsgdGhlbgorICAgICBzZGxfYXJncz0iJHNkbF9hcmdzIC0tcHJlZml4PSRzZGxfcHJlZml4IgorICAgICBpZiB0ZXN0IHgke1NETF9DT05GSUcrc2V0fSAhPSB4c2V0IDsgdGhlbgorICAgICAgICBTRExfQ09ORklHPSRzZGxfcHJlZml4L2Jpbi9zZGwtY29uZmlnCisgICAgIGZpCisgIGZpCisKKyAgQUNfUEFUSF9QUk9HKFNETF9DT05GSUcsIHNkbC1jb25maWcsIG5vKQorICBtaW5fc2RsX3ZlcnNpb249aWZlbHNlKFskMV0sICwwLjExLjAsJDEpCisgIEFDX01TR19DSEVDS0lORyhmb3IgU0RMIC0gdmVyc2lvbiA+PSAkbWluX3NkbF92ZXJzaW9uKQorICBub19zZGw9IiIKKyAgaWYgdGVzdCAiJFNETF9DT05GSUciID0gIm5vIiA7IHRoZW4KKyAgICBub19zZGw9eWVzCisgIGVsc2UKKyAgICBTRExfQ0ZMQUdTPWAkU0RMX0NPTkZJRyAkc2RsY29uZl9hcmdzIC0tY2ZsYWdzYAorICAgIFNETF9MSUJTPWAkU0RMX0NPTkZJRyAkc2RsY29uZl9hcmdzIC0tbGlic2AKKworICAgIHNkbF9tYWpvcl92ZXJzaW9uPWAkU0RMX0NPTkZJRyAkc2RsX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDEvJ2AKKyAgICBzZGxfbWlub3JfdmVyc2lvbj1gJFNETF9DT05GSUcgJHNkbF9hcmdzIC0tdmVyc2lvbiB8IFwKKyAgICAgICAgICAgc2VkICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wyLydgCisgICAgc2RsX21pY3JvX3ZlcnNpb249YCRTRExfQ09ORklHICRzZGxfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDMvJ2AKKyAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9zZGx0ZXN0IiA9ICJ4eWVzIiA7IHRoZW4KKyAgICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgIENGTEFHUz0iJENGTEFHUyAkU0RMX0NGTEFHUyIKKyAgICAgIExJQlM9IiRMSUJTICRTRExfTElCUyIKK2RubAorZG5sIE5vdyBjaGVjayBpZiB0aGUgaW5zdGFsbGVkIFNETCBpcyBzdWZmaWNpZW50bHkgbmV3LiAoQWxzbyBzYW5pdHkKK2RubCBjaGVja3MgdGhlIHJlc3VsdHMgb2Ygc2RsLWNvbmZpZyB0byBzb21lIGV4dGVudAorZG5sCisgICAgICBybSAtZiBjb25mLnNkbHRlc3QKKyAgICAgIEFDX1RSWV9SVU4oWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiU0RMLmgiCisKK2NoYXIqCitteV9zdHJkdXAgKGNoYXIgKnN0cikKK3sKKyAgY2hhciAqbmV3X3N0cjsKKyAgCisgIGlmIChzdHIpCisgICAgeworICAgICAgbmV3X3N0ciA9IChjaGFyICopbWFsbG9jICgoc3RybGVuIChzdHIpICsgMSkgKiBzaXplb2YoY2hhcikpOworICAgICAgc3RyY3B5IChuZXdfc3RyLCBzdHIpOworICAgIH0KKyAgZWxzZQorICAgIG5ld19zdHIgPSBOVUxMOworICAKKyAgcmV0dXJuIG5ld19zdHI7Cit9CisKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgbWFqb3IsIG1pbm9yLCBtaWNybzsKKyAgY2hhciAqdG1wX3ZlcnNpb247CisKKyAgLyogVGhpcyBoYW5ncyBvbiBzb21lIHN5c3RlbXMgKD8pCisgIHN5c3RlbSAoInRvdWNoIGNvbmYuc2RsdGVzdCIpOworICAqLworICB7IEZJTEUgKmZwID0gZm9wZW4oImNvbmYuc2RsdGVzdCIsICJhIik7IGlmICggZnAgKSBmY2xvc2UoZnApOyB9CisKKyAgLyogSFAvVVggOSAoJUAjISkgd3JpdGVzIHRvIHNzY2FuZiBzdHJpbmdzICovCisgIHRtcF92ZXJzaW9uID0gbXlfc3RyZHVwKCIkbWluX3NkbF92ZXJzaW9uIik7CisgIGlmIChzc2NhbmYodG1wX3ZlcnNpb24sICIlZC4lZC4lZCIsICZtYWpvciwgJm1pbm9yLCAmbWljcm8pICE9IDMpIHsKKyAgICAgcHJpbnRmKCIlcywgYmFkIHZlcnNpb24gc3RyaW5nXG4iLCAiJG1pbl9zZGxfdmVyc2lvbiIpOworICAgICBleGl0KDEpOworICAgfQorCisgICBpZiAoKCRzZGxfbWFqb3JfdmVyc2lvbiA+IG1ham9yKSB8fAorICAgICAgKCgkc2RsX21ham9yX3ZlcnNpb24gPT0gbWFqb3IpICYmICgkc2RsX21pbm9yX3ZlcnNpb24gPiBtaW5vcikpIHx8CisgICAgICAoKCRzZGxfbWFqb3JfdmVyc2lvbiA9PSBtYWpvcikgJiYgKCRzZGxfbWlub3JfdmVyc2lvbiA9PSBtaW5vcikgJiYgKCRzZGxfbWljcm9fdmVyc2lvbiA+PSBtaWNybykpKQorICAgIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50ZigiXG4qKiogJ3NkbC1jb25maWcgLS12ZXJzaW9uJyByZXR1cm5lZCAlZC4lZC4lZCwgYnV0IHRoZSBtaW5pbXVtIHZlcnNpb25cbiIsICRzZGxfbWFqb3JfdmVyc2lvbiwgJHNkbF9taW5vcl92ZXJzaW9uLCAkc2RsX21pY3JvX3ZlcnNpb24pOworICAgICAgcHJpbnRmKCIqKiogb2YgU0RMIHJlcXVpcmVkIGlzICVkLiVkLiVkLiBJZiBzZGwtY29uZmlnIGlzIGNvcnJlY3QsIHRoZW4gaXQgaXNcbiIsIG1ham9yLCBtaW5vciwgbWljcm8pOworICAgICAgcHJpbnRmKCIqKiogYmVzdCB0byB1cGdyYWRlIHRvIHRoZSByZXF1aXJlZCB2ZXJzaW9uLlxuIik7CisgICAgICBwcmludGYoIioqKiBJZiBzZGwtY29uZmlnIHdhcyB3cm9uZywgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBTRExfQ09ORklHXG4iKTsKKyAgICAgIHByaW50ZigiKioqIHRvIHBvaW50IHRvIHRoZSBjb3JyZWN0IGNvcHkgb2Ygc2RsLWNvbmZpZywgYW5kIHJlbW92ZSB0aGUgZmlsZVxuIik7CisgICAgICBwcmludGYoIioqKiBjb25maWcuY2FjaGUgYmVmb3JlIHJlLXJ1bm5pbmcgY29uZmlndXJlXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KK30KKworXSwsIG5vX3NkbD15ZXMsW2VjaG8gJGFjX24gImNyb3NzIGNvbXBpbGluZzsgYXNzdW1lZCBPSy4uLiAkYWNfYyJdKQorICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgIGZpCisgIGZpCisgIGlmIHRlc3QgIngkbm9fc2RsIiA9IHggOyB0aGVuCisgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKSAgICAgCisgIGVsc2UKKyAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgaWYgdGVzdCAiJFNETF9DT05GSUciID0gIm5vIiA7IHRoZW4KKyAgICAgICBlY2hvICIqKiogVGhlIHNkbC1jb25maWcgc2NyaXB0IGluc3RhbGxlZCBieSBTREwgY291bGQgbm90IGJlIGZvdW5kIgorICAgICAgIGVjaG8gIioqKiBJZiBTREwgd2FzIGluc3RhbGxlZCBpbiBQUkVGSVgsIG1ha2Ugc3VyZSBQUkVGSVgvYmluIGlzIGluIgorICAgICAgIGVjaG8gIioqKiB5b3VyIHBhdGgsIG9yIHNldCB0aGUgU0RMX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUiCisgICAgICAgZWNobyAiKioqIGZ1bGwgcGF0aCB0byBzZGwtY29uZmlnLiIKKyAgICAgZWxzZQorICAgICAgIGlmIHRlc3QgLWYgY29uZi5zZGx0ZXN0IDsgdGhlbgorICAgICAgICA6CisgICAgICAgZWxzZQorICAgICAgICAgIGVjaG8gIioqKiBDb3VsZCBub3QgcnVuIFNETCB0ZXN0IHByb2dyYW0sIGNoZWNraW5nIHdoeS4uLiIKKyAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFNETF9DRkxBR1MiCisgICAgICAgICAgTElCUz0iJExJQlMgJFNETF9MSUJTIgorICAgICAgICAgIEFDX1RSWV9MSU5LKFsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIlNETC5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreyByZXR1cm4gMDsgfQorI3VuZGVmICBtYWluCisjZGVmaW5lIG1haW4gS19hbmRfUl9DX21haW4KK10sICAgICAgWyByZXR1cm4gMDsgXSwKKyAgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBjb21waWxlZCwgYnV0IGRpZCBub3QgcnVuLiBUaGlzIHVzdWFsbHkgbWVhbnMiCisgICAgICAgICAgZWNobyAiKioqIHRoYXQgdGhlIHJ1bi10aW1lIGxpbmtlciBpcyBub3QgZmluZGluZyBTREwgb3IgZmluZGluZyB0aGUgd3JvbmciCisgICAgICAgICAgZWNobyAiKioqIHZlcnNpb24gb2YgU0RMLiBJZiBpdCBpcyBub3QgZmluZGluZyBTREwsIHlvdSdsbCBuZWVkIHRvIHNldCB5b3VyIgorICAgICAgICAgIGVjaG8gIioqKiBMRF9MSUJSQVJZX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGVkaXQgL2V0Yy9sZC5zby5jb25mIHRvIHBvaW50IgorICAgICAgICAgIGVjaG8gIioqKiB0byB0aGUgaW5zdGFsbGVkIGxvY2F0aW9uICBBbHNvLCBtYWtlIHN1cmUgeW91IGhhdmUgcnVuIGxkY29uZmlnIGlmIHRoYXQiCisgICAgICAgICAgZWNobyAiKioqIGlzIHJlcXVpcmVkIG9uIHlvdXIgc3lzdGVtIgorCSAgZWNobyAiKioqIgorICAgICAgICAgIGVjaG8gIioqKiBJZiB5b3UgaGF2ZSBhbiBvbGQgdmVyc2lvbiBpbnN0YWxsZWQsIGl0IGlzIGJlc3QgdG8gcmVtb3ZlIGl0LCBhbHRob3VnaCIKKyAgICAgICAgICBlY2hvICIqKiogeW91IG1heSBhbHNvIGJlIGFibGUgdG8gZ2V0IHRoaW5ncyB0byB3b3JrIGJ5IG1vZGlmeWluZyBMRF9MSUJSQVJZX1BBVEgiXSwKKyAgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBmYWlsZWQgdG8gY29tcGlsZSBvciBsaW5rLiBTZWUgdGhlIGZpbGUgY29uZmlnLmxvZyBmb3IgdGhlIgorICAgICAgICAgIGVjaG8gIioqKiBleGFjdCBlcnJvciB0aGF0IG9jY3VyZWQuIFRoaXMgdXN1YWxseSBtZWFucyBTREwgd2FzIGluY29ycmVjdGx5IGluc3RhbGxlZCIKKyAgICAgICAgICBlY2hvICIqKiogb3IgdGhhdCB5b3UgaGF2ZSBtb3ZlZCBTREwgc2luY2UgaXQgd2FzIGluc3RhbGxlZC4gSW4gdGhlIGxhdHRlciBjYXNlLCB5b3UiCisgICAgICAgICAgZWNobyAiKioqIG1heSB3YW50IHRvIGVkaXQgdGhlIHNkbC1jb25maWcgc2NyaXB0OiAkU0RMX0NPTkZJRyIgXSkKKyAgICAgICAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKyAgICAgICAgICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorICAgICAgIGZpCisgICAgIGZpCisgICAgIFNETF9DRkxBR1M9IiIKKyAgICAgU0RMX0xJQlM9IiIKKyAgICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKKyAgZmkKKyAgQUNfU1VCU1QoU0RMX0NGTEFHUykKKyAgQUNfU1VCU1QoU0RMX0xJQlMpCisgIHJtIC1mIGNvbmYuc2RsdGVzdAorXSkKKwpkaWZmIC0tZ2l0IGEvbTQvZ3N0LXNob3V0Mi5tNCBiL200L2dzdC1zaG91dDIubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1YTc2NwotLS0gL2Rldi9udWxsCisrKyBiL200L2dzdC1zaG91dDIubTQKQEAgLTAsMCArMSwxMDIgQEAKKyMgQ29uZmlndXJlIHBhdGhzIGZvciBsaWJzaG91dAorIyBKYWNrIE1vZmZpdHQgPGphY2tAaWNlY2FzdC5vcmc+IDA4LTA2LTIwMDEKKyMgU2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gT3dlbiBUYXlsb3IgYW5kIE1hbmlzaCBTaW5naAorCitkbmwgQU1fUEFUSF9TSE9VVDIoW0FDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EXV0pCitkbmwgVGVzdCBmb3IgbGlic2hvdXQgMiwgYW5kIGRlZmluZSBTSE9VVDJfQ0ZMQUdTIGFuZCBTSE9VVDJfTElCUworZG5sCitBQ19ERUZVTihbQU1fUEFUSF9TSE9VVDJdLAorW2RubCAKK2RubCBHZXQgdGhlIGNmbGFncyBhbmQgbGlicmFyaWVzCitkbmwKK0FDX0FSR19XSVRIKHNob3V0Mi1wcmVmaXgsWyAgLS13aXRoLXNob3V0Mi1wcmVmaXg9UEZYICAgUHJlZml4IHdoZXJlIGxpYnNob3V0MiBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sIHNob3V0Ml9wcmVmaXg9IiR3aXRodmFsIiwgc2hvdXQyX3ByZWZpeD0iIikKK0FDX0FSR19FTkFCTEUoc2hvdXQydGVzdCwgWyAgLS1kaXNhYmxlLXNob3V0MnRlc3QgICAgICAgRG8gbm90IHRyeSB0byBjb21waWxlIGFuZCBydW4gYSB0ZXN0IHNob3V0MiBwcm9ncmFtXSwsIGVuYWJsZV9zaG91dDJ0ZXN0PXllcykKKworICBpZiB0ZXN0ICJ4JHNob3V0Ml9wcmVmaXgiICE9ICJ4Tk9ORSIgOyB0aGVuCisgICAgU0hPVVQyX0NGTEFHUz0iLUkkc2hvdXQyX3ByZWZpeC9pbmNsdWRlIgorICAgIFNIT1VUMl9MSUJTPSItTCRzaG91dDJfcHJlZml4L2xpYiIKKyAgZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0gIngiOyB0aGVuCisgICAgU0hPVVQyX0NGTEFHUz0iLUkkcHJlZml4L2luY2x1ZGUiCisgICAgU0hPVVQyX0xJQlM9Ii1MJHByZWZpeC9saWIiCisgIGZpCisKKyAgU0hPVVQyX0xJQlM9IiRTSE9VVDJfTElCUyAtbHNob3V0IC1scHRocmVhZCIKKworICBjYXNlICRob3N0IGluCisgICotKi1zb2xhcmlzKikKKyAgCVNIT1VUMl9MSUJTPSIkU0hPVVQyX0xJQlMgLWxuc2wgLWxzb2NrZXQgLWxyZXNvbHYiCisgIGVzYWMKKworICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIHNob3V0MikKKyAgbm9fc2hvdXQyPSIiCisKKyAgaWYgdGVzdCAieCRlbmFibGVfc2hvdXQydGVzdCIgPSAieHllcyIgOyB0aGVuCisgICAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICBDRkxBR1M9IiRDRkxBR1MgJFNIT1VUMl9DRkxBR1MgJE9HR19DRkxBR1MgJFZPUkJJU19DRkxBR1MiCisgICAgTElCUz0iJExJQlMgJFNIT1VUMl9MSUJTICRPR0dfTElCUyAkVk9SQklTX0xJQlMiCitkbmwKK2RubCBOb3cgY2hlY2sgaWYgdGhlIGluc3RhbGxlZCBzaG91dDIgaXMgc3VmZmljaWVudGx5IG5ldy4KK2RubAorICAgICAgcm0gLWYgY29uZi5zaG91dDJ0ZXN0CisgICAgICBBQ19UUllfUlVOKFsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNob3V0L3Nob3V0Lmg+CisKK2ludCBtYWluICgpCit7CisgIGludCBtYWpvciwgbWlub3IsIHBhdGNoOworCisgIHN5c3RlbSgidG91Y2ggY29uZi5zaG91dDJ0ZXN0Iik7CisgIHNob3V0X3ZlcnNpb24oJm1ham9yLCAmbWlub3IsICZwYXRjaCk7CisgIGlmIChtYWpvciA8IDIpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitdLCwgbm9fc2hvdXQyPXllcyxbZWNobyAkYWNfbiAiY3Jvc3MgY29tcGlsaW5nOyBhc3N1bWVkIE9LLi4uICRhY19jIl0pCisgICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgICAgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JG5vX3Nob3V0MiIgPSAieCIgOyB0aGVuCisgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICBpZmVsc2UoWyQxXSwgLCA6LCBbJDFdKSAgICAgCisgIGVsc2UKKyAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgaWYgdGVzdCAtZiBjb25mLnNob3V0MnRlc3QgOyB0aGVuCisgICAgICAgOgorICAgICBlbHNlCisgICAgICAgZWNobyAiKioqIENvdWxkIG5vdCBydW4gU2hvdXQyIHRlc3QgcHJvZ3JhbSwgY2hlY2tpbmcgd2h5Li4uIgorICAgICAgIENGTEFHUz0iJENGTEFHUyAkU0hPVVQyX0NGTEFHUyAkT0dHX0NGTEFHUyAkVk9SQklTX0NGTEFHUyIKKyAgICAgICBMSUJTPSIkTElCUyAkU0hPVVQyX0xJQlMgJE9HR19MSUJTICRWT1JCSVNfTElCUyIKKyAgICAgICBBQ19UUllfTElOSyhbCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzaG91dC9zaG91dC5oPgorXSwgICAgIFsgcmV0dXJuIDA7IF0sCisgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBjb21waWxlZCwgYnV0IGRpZCBub3QgcnVuLiBUaGlzIHVzdWFsbHkgbWVhbnMiCisgICAgICAgZWNobyAiKioqIHRoYXQgdGhlIHJ1bi10aW1lIGxpbmtlciBpcyBub3QgZmluZGluZyBTaG91dDIgb3IgZmluZGluZyB0aGUgd3JvbmciCisgICAgICAgZWNobyAiKioqIHZlcnNpb24gb2YgU2hvdXQyLiBJZiBpdCBpcyBub3QgZmluZGluZyBTaG91dDIsIHlvdSdsbCBuZWVkIHRvIHNldCB5b3VyIgorICAgICAgIGVjaG8gIioqKiBMRF9MSUJSQVJZX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGVkaXQgL2V0Yy9sZC5zby5jb25mIHRvIHBvaW50IgorICAgICAgIGVjaG8gIioqKiB0byB0aGUgaW5zdGFsbGVkIGxvY2F0aW9uICBBbHNvLCBtYWtlIHN1cmUgeW91IGhhdmUgcnVuIGxkY29uZmlnIGlmIHRoYXQiCisgICAgICAgZWNobyAiKioqIGlzIHJlcXVpcmVkIG9uIHlvdXIgc3lzdGVtIgorICAgICAgIGVjaG8gIioqKiIKKyAgICAgICBlY2hvICIqKiogSWYgeW91IGhhdmUgYW4gb2xkIHZlcnNpb24gaW5zdGFsbGVkLCBpdCBpcyBiZXN0IHRvIHJlbW92ZSBpdCwgYWx0aG91Z2giCisgICAgICAgZWNobyAiKioqIHlvdSBtYXkgYWxzbyBiZSBhYmxlIHRvIGdldCB0aGluZ3MgdG8gd29yayBieSBtb2RpZnlpbmcgTERfTElCUkFSWV9QQVRIIl0sCisgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBmYWlsZWQgdG8gY29tcGlsZSBvciBsaW5rLiBTZWUgdGhlIGZpbGUgY29uZmlnLmxvZyBmb3IgdGhlIgorICAgICAgIGVjaG8gIioqKiBleGFjdCBlcnJvciB0aGF0IG9jY3VyZWQuIFRoaXMgdXN1YWxseSBtZWFucyBTaG91dDIgd2FzIGluY29ycmVjdGx5IGluc3RhbGxlZCIKKyAgICAgICBlY2hvICIqKiogb3IgdGhhdCB5b3UgaGF2ZSBtb3ZlZCBTaG91dDIgc2luY2UgaXQgd2FzIGluc3RhbGxlZC4gSW4gdGhlIGxhdHRlciBjYXNlLCB5b3UiCisgICAgICAgZWNobyAiKioqIG1heSB3YW50IHRvIGVkaXQgdGhlIHNob3V0LWNvbmZpZyBzY3JpcHQ6ICRTSE9VVDJfQ09ORklHIiBdKQorICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgIGZpCisgICAgIFNIT1VUMl9DRkxBR1M9IiIKKyAgICAgU0hPVVQyX0xJQlM9IiIKKyAgICAgaWZlbHNlKFskMl0sICwgOiwgWyQyXSkKKyAgZmkKKyAgQUNfU1VCU1QoU0hPVVQyX0NGTEFHUykKKyAgQUNfU1VCU1QoU0hPVVQyX0xJQlMpCisgIHJtIC1mIGNvbmYuc2hvdXQydGVzdAorXSkKZGlmZiAtLWdpdCBhL200L2dzdC1zaWQubTQgYi9tNC9nc3Qtc2lkLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZTI4NzcKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9nc3Qtc2lkLm00CkBAIC0wLDAgKzEsMzkgQEAKK2RubCBjaGVjayBmb3Igc2lkcGxheQorCitBQ19ERUZVTihbR1NUX1BBVEhfU0lEUExBWV0sCitbCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsaWJzaWRwbGF5IDEuMzYueF0pCisKK0FDX0xBTkdfUFVTSChDKyspCisKK0FDX0NIRUNLX0hFQURFUihzaWRwbGF5L3BsYXllci5oLCBIQVZFX1NJRFBMQVk9InllcyIsIEhBVkVfU0lEUExBWT0ibm8iKQorCitpZiB0ZXN0ICRIQVZFX1NJRFBMQVkgPSAieWVzIjsgdGhlbgorICBTSURQTEFZX0xJQlM9Ii1sc2lkcGxheSIKKworICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgLWxzaWRwbGF5IHdvcmtzXSkKKyAgYWNfbGlic19zYWZlPSRMSUJTCisKKyAgTElCUz0iLWxzaWRwbGF5IgorCisgIEFDX1RSWV9SVU4oWworICAgICNpbmNsdWRlIDxzaWRwbGF5L3BsYXllci5oPgorICAgIGludCBtYWluKCkKKyAgICB7IHNpZFR1bmUgdHVuZSA9IHNpZFR1bmUoMCk7ICB9CisgICAgXSwKKyAgICBIQVZFX1NJRFBMQVk9InllcyIsCisgICAgSEFWRV9TSURQTEFZPSJubyIsCisgICAgSEFWRV9TSURQTEFZPSJubyIpCisKKyAgTElCUz0iJGFjX2xpYnNfc2FmZSIKKworICBBQ19NU0dfUkVTVUxUKFskSEFWRV9TSURQTEFZXSkKK2ZpCisKK1NJRFBMQVlfQ0ZMQUdTPQorU0lEUExBWV9MSUJTPSItbHNpZHBsYXkiCitBQ19TVUJTVChTSURQTEFZX0NGTEFHUykKK0FDX1NVQlNUKFNJRFBMQVlfTElCUykKKworQUNfTEFOR19QT1AoQysrKQorXSkKZGlmZiAtLWdpdCBhL200L2d0ay5tNCBiL200L2d0ay5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmRkNDcyCi0tLSAvZGV2L251bGwKKysrIGIvbTQvZ3RrLm00CkBAIC0wLDAgKzEsMTk0IEBACisjIENvbmZpZ3VyZSBwYXRocyBmb3IgR1RLKworIyBPd2VuIFRheWxvciAgICAgOTctMTEtMworCitkbmwgQU1fUEFUSF9HVEsoW01JTklNVU0tVkVSU0lPTiwgW0FDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EIFssIE1PRFVMRVNdXV1dKQorZG5sIFRlc3QgZm9yIEdUSywgYW5kIGRlZmluZSBHVEtfQ0ZMQUdTIGFuZCBHVEtfTElCUworZG5sCitBQ19ERUZVTihbQU1fUEFUSF9HVEtdLAorW2RubCAKK2RubCBHZXQgdGhlIGNmbGFncyBhbmQgbGlicmFyaWVzIGZyb20gdGhlIGd0ay1jb25maWcgc2NyaXB0CitkbmwKK0FDX0FSR19XSVRIKGd0ay1wcmVmaXgsWyAgLS13aXRoLWd0ay1wcmVmaXg9UEZYICAgUHJlZml4IHdoZXJlIEdUSyBpcyBpbnN0YWxsZWQgKG9wdGlvbmFsKV0sCisgICAgICAgICAgICBndGtfY29uZmlnX3ByZWZpeD0iJHdpdGh2YWwiLCBndGtfY29uZmlnX3ByZWZpeD0iIikKK0FDX0FSR19XSVRIKGd0ay1leGVjLXByZWZpeCxbICAtLXdpdGgtZ3RrLWV4ZWMtcHJlZml4PVBGWCBFeGVjIHByZWZpeCB3aGVyZSBHVEsgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldLAorICAgICAgICAgICAgZ3RrX2NvbmZpZ19leGVjX3ByZWZpeD0iJHdpdGh2YWwiLCBndGtfY29uZmlnX2V4ZWNfcHJlZml4PSIiKQorQUNfQVJHX0VOQUJMRShndGt0ZXN0LCBbICAtLWRpc2FibGUtZ3RrdGVzdCAgICAgICBEbyBub3QgdHJ5IHRvIGNvbXBpbGUgYW5kIHJ1biBhIHRlc3QgR1RLIHByb2dyYW1dLAorCQkgICAgLCBlbmFibGVfZ3RrdGVzdD15ZXMpCisKKyAgZm9yIG1vZHVsZSBpbiAuICQ0CisgIGRvCisgICAgICBjYXNlICIkbW9kdWxlIiBpbgorICAgICAgICAgZ3RocmVhZCkgCisgICAgICAgICAgICAgZ3RrX2NvbmZpZ19hcmdzPSIkZ3RrX2NvbmZpZ19hcmdzIGd0aHJlYWQiCisgICAgICAgICA7OworICAgICAgZXNhYworICBkb25lCisKKyAgaWYgdGVzdCB4JGd0a19jb25maWdfZXhlY19wcmVmaXggIT0geCA7IHRoZW4KKyAgICAgZ3RrX2NvbmZpZ19hcmdzPSIkZ3RrX2NvbmZpZ19hcmdzIC0tZXhlYy1wcmVmaXg9JGd0a19jb25maWdfZXhlY19wcmVmaXgiCisgICAgIGlmIHRlc3QgeCR7R1RLX0NPTkZJRytzZXR9ICE9IHhzZXQgOyB0aGVuCisgICAgICAgIEdUS19DT05GSUc9JGd0a19jb25maWdfZXhlY19wcmVmaXgvYmluL2d0ay1jb25maWcKKyAgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCB4JGd0a19jb25maWdfcHJlZml4ICE9IHggOyB0aGVuCisgICAgIGd0a19jb25maWdfYXJncz0iJGd0a19jb25maWdfYXJncyAtLXByZWZpeD0kZ3RrX2NvbmZpZ19wcmVmaXgiCisgICAgIGlmIHRlc3QgeCR7R1RLX0NPTkZJRytzZXR9ICE9IHhzZXQgOyB0aGVuCisgICAgICAgIEdUS19DT05GSUc9JGd0a19jb25maWdfcHJlZml4L2Jpbi9ndGstY29uZmlnCisgICAgIGZpCisgIGZpCisKKyAgQUNfUEFUSF9QUk9HKEdUS19DT05GSUcsIGd0ay1jb25maWcsIG5vKQorICBtaW5fZ3RrX3ZlcnNpb249aWZlbHNlKFskMV0sICwwLjk5LjcsJDEpCisgIEFDX01TR19DSEVDS0lORyhmb3IgR1RLIC0gdmVyc2lvbiA+PSAkbWluX2d0a192ZXJzaW9uKQorICBub19ndGs9IiIKKyAgaWYgdGVzdCAiJEdUS19DT05GSUciID0gIm5vIiA7IHRoZW4KKyAgICBub19ndGs9eWVzCisgIGVsc2UKKyAgICBHVEtfQ0ZMQUdTPWAkR1RLX0NPTkZJRyAkZ3RrX2NvbmZpZ19hcmdzIC0tY2ZsYWdzYAorICAgIEdUS19MSUJTPWAkR1RLX0NPTkZJRyAkZ3RrX2NvbmZpZ19hcmdzIC0tbGlic2AKKyAgICBndGtfY29uZmlnX21ham9yX3ZlcnNpb249YCRHVEtfQ09ORklHICRndGtfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDEvJ2AKKyAgICBndGtfY29uZmlnX21pbm9yX3ZlcnNpb249YCRHVEtfQ09ORklHICRndGtfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDIvJ2AKKyAgICBndGtfY29uZmlnX21pY3JvX3ZlcnNpb249YCRHVEtfQ09ORklHICRndGtfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorICAgICAgICAgICBzZWQgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDMvJ2AKKyAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9ndGt0ZXN0IiA9ICJ4eWVzIiA7IHRoZW4KKyAgICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgIENGTEFHUz0iJENGTEFHUyAkR1RLX0NGTEFHUyIKKyAgICAgIExJQlM9IiRHVEtfTElCUyAkTElCUyIKK2RubAorZG5sIE5vdyBjaGVjayBpZiB0aGUgaW5zdGFsbGVkIEdUSyBpcyBzdWZmaWNpZW50bHkgbmV3LiAoQWxzbyBzYW5pdHkKK2RubCBjaGVja3MgdGhlIHJlc3VsdHMgb2YgZ3RrLWNvbmZpZyB0byBzb21lIGV4dGVudAorZG5sCisgICAgICBybSAtZiBjb25mLmd0a3Rlc3QKKyAgICAgIEFDX1RSWV9SVU4oWworI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitpbnQgCittYWluICgpCit7CisgIGludCBtYWpvciwgbWlub3IsIG1pY3JvOworICBjaGFyICp0bXBfdmVyc2lvbjsKKworICBzeXN0ZW0gKCJ0b3VjaCBjb25mLmd0a3Rlc3QiKTsKKworICAvKiBIUC9VWCA5ICglQCMhKSB3cml0ZXMgdG8gc3NjYW5mIHN0cmluZ3MgKi8KKyAgdG1wX3ZlcnNpb24gPSBnX3N0cmR1cCgiJG1pbl9ndGtfdmVyc2lvbiIpOworICBpZiAoc3NjYW5mKHRtcF92ZXJzaW9uLCAiJWQuJWQuJWQiLCAmbWFqb3IsICZtaW5vciwgJm1pY3JvKSAhPSAzKSB7CisgICAgIHByaW50ZigiJXMsIGJhZCB2ZXJzaW9uIHN0cmluZ1xuIiwgIiRtaW5fZ3RrX3ZlcnNpb24iKTsKKyAgICAgZXhpdCgxKTsKKyAgIH0KKworICBpZiAoKGd0a19tYWpvcl92ZXJzaW9uICE9ICRndGtfY29uZmlnX21ham9yX3ZlcnNpb24pIHx8CisgICAgICAoZ3RrX21pbm9yX3ZlcnNpb24gIT0gJGd0a19jb25maWdfbWlub3JfdmVyc2lvbikgfHwKKyAgICAgIChndGtfbWljcm9fdmVyc2lvbiAhPSAkZ3RrX2NvbmZpZ19taWNyb192ZXJzaW9uKSkKKyAgICB7CisgICAgICBwcmludGYoIlxuKioqICdndGstY29uZmlnIC0tdmVyc2lvbicgcmV0dXJuZWQgJWQuJWQuJWQsIGJ1dCBHVEsrICglZC4lZC4lZClcbiIsIAorICAgICAgICAgICAgICRndGtfY29uZmlnX21ham9yX3ZlcnNpb24sICRndGtfY29uZmlnX21pbm9yX3ZlcnNpb24sICRndGtfY29uZmlnX21pY3JvX3ZlcnNpb24sCisgICAgICAgICAgICAgZ3RrX21ham9yX3ZlcnNpb24sIGd0a19taW5vcl92ZXJzaW9uLCBndGtfbWljcm9fdmVyc2lvbik7CisgICAgICBwcmludGYgKCIqKiogd2FzIGZvdW5kISBJZiBndGstY29uZmlnIHdhcyBjb3JyZWN0LCB0aGVuIGl0IGlzIGJlc3RcbiIpOworICAgICAgcHJpbnRmICgiKioqIHRvIHJlbW92ZSB0aGUgb2xkIHZlcnNpb24gb2YgR1RLKy4gWW91IG1heSBhbHNvIGJlIGFibGUgdG8gZml4IHRoZSBlcnJvclxuIik7CisgICAgICBwcmludGYoIioqKiBieSBtb2RpZnlpbmcgeW91ciBMRF9MSUJSQVJZX1BBVEggZW52aXJvbWVudCB2YXJpYWJsZSwgb3IgYnkgZWRpdGluZ1xuIik7CisgICAgICBwcmludGYoIioqKiAvZXRjL2xkLnNvLmNvbmYuIE1ha2Ugc3VyZSB5b3UgaGF2ZSBydW4gbGRjb25maWcgaWYgdGhhdCBpc1xuIik7CisgICAgICBwcmludGYoIioqKiByZXF1aXJlZCBvbiB5b3VyIHN5c3RlbS5cbiIpOworICAgICAgcHJpbnRmKCIqKiogSWYgZ3RrLWNvbmZpZyB3YXMgd3JvbmcsIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgR1RLX0NPTkZJR1xuIik7CisgICAgICBwcmludGYoIioqKiB0byBwb2ludCB0byB0aGUgY29ycmVjdCBjb3B5IG9mIGd0ay1jb25maWcsIGFuZCByZW1vdmUgdGhlIGZpbGUgY29uZmlnLmNhY2hlXG4iKTsKKyAgICAgIHByaW50ZigiKioqIGJlZm9yZSByZS1ydW5uaW5nIGNvbmZpZ3VyZVxuIik7CisgICAgfSAKKyNpZiBkZWZpbmVkIChHVEtfTUFKT1JfVkVSU0lPTikgJiYgZGVmaW5lZCAoR1RLX01JTk9SX1ZFUlNJT04pICYmIGRlZmluZWQgKEdUS19NSUNST19WRVJTSU9OKQorICBlbHNlIGlmICgoZ3RrX21ham9yX3ZlcnNpb24gIT0gR1RLX01BSk9SX1ZFUlNJT04pIHx8CisJICAgKGd0a19taW5vcl92ZXJzaW9uICE9IEdUS19NSU5PUl9WRVJTSU9OKSB8fAorICAgICAgICAgICAoZ3RrX21pY3JvX3ZlcnNpb24gIT0gR1RLX01JQ1JPX1ZFUlNJT04pKQorICAgIHsKKyAgICAgIHByaW50ZigiKioqIEdUSysgaGVhZGVyIGZpbGVzICh2ZXJzaW9uICVkLiVkLiVkKSBkbyBub3QgbWF0Y2hcbiIsCisJICAgICBHVEtfTUFKT1JfVkVSU0lPTiwgR1RLX01JTk9SX1ZFUlNJT04sIEdUS19NSUNST19WRVJTSU9OKTsKKyAgICAgIHByaW50ZigiKioqIGxpYnJhcnkgKHZlcnNpb24gJWQuJWQuJWQpXG4iLAorCSAgICAgZ3RrX21ham9yX3ZlcnNpb24sIGd0a19taW5vcl92ZXJzaW9uLCBndGtfbWljcm9fdmVyc2lvbik7CisgICAgfQorI2VuZGlmIC8qIGRlZmluZWQgKEdUS19NQUpPUl9WRVJTSU9OKSAuLi4gKi8KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICgoZ3RrX21ham9yX3ZlcnNpb24gPiBtYWpvcikgfHwKKyAgICAgICAgKChndGtfbWFqb3JfdmVyc2lvbiA9PSBtYWpvcikgJiYgKGd0a19taW5vcl92ZXJzaW9uID4gbWlub3IpKSB8fAorICAgICAgICAoKGd0a19tYWpvcl92ZXJzaW9uID09IG1ham9yKSAmJiAoZ3RrX21pbm9yX3ZlcnNpb24gPT0gbWlub3IpICYmIChndGtfbWljcm9fdmVyc2lvbiA+PSBtaWNybykpKQorICAgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcHJpbnRmKCJcbioqKiBBbiBvbGQgdmVyc2lvbiBvZiBHVEsrICglZC4lZC4lZCkgd2FzIGZvdW5kLlxuIiwKKyAgICAgICAgICAgICAgIGd0a19tYWpvcl92ZXJzaW9uLCBndGtfbWlub3JfdmVyc2lvbiwgZ3RrX21pY3JvX3ZlcnNpb24pOworICAgICAgICBwcmludGYoIioqKiBZb3UgbmVlZCBhIHZlcnNpb24gb2YgR1RLKyBuZXdlciB0aGFuICVkLiVkLiVkLiBUaGUgbGF0ZXN0IHZlcnNpb24gb2ZcbiIsCisJICAgICAgIG1ham9yLCBtaW5vciwgbWljcm8pOworICAgICAgICBwcmludGYoIioqKiBHVEsrIGlzIGFsd2F5cyBhdmFpbGFibGUgZnJvbSBmdHA6Ly9mdHAuZ3RrLm9yZy5cbiIpOworICAgICAgICBwcmludGYoIioqKlxuIik7CisgICAgICAgIHByaW50ZigiKioqIElmIHlvdSBoYXZlIGFscmVhZHkgaW5zdGFsbGVkIGEgc3VmZmljaWVudGx5IG5ldyB2ZXJzaW9uLCB0aGlzIGVycm9yXG4iKTsKKyAgICAgICAgcHJpbnRmKCIqKiogcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgd3JvbmcgY29weSBvZiB0aGUgZ3RrLWNvbmZpZyBzaGVsbCBzY3JpcHQgaXNcbiIpOworICAgICAgICBwcmludGYoIioqKiBiZWluZyBmb3VuZC4gVGhlIGVhc2llc3Qgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIHJlbW92ZSB0aGUgb2xkIHZlcnNpb25cbiIpOworICAgICAgICBwcmludGYoIioqKiBvZiBHVEsrLCBidXQgeW91IGNhbiBhbHNvIHNldCB0aGUgR1RLX0NPTkZJRyBlbnZpcm9ubWVudCB0byBwb2ludCB0byB0aGVcbiIpOworICAgICAgICBwcmludGYoIioqKiBjb3JyZWN0IGNvcHkgb2YgZ3RrLWNvbmZpZy4gKEluIHRoaXMgY2FzZSwgeW91IHdpbGwgaGF2ZSB0b1xuIik7CisgICAgICAgIHByaW50ZigiKioqIG1vZGlmeSB5b3VyIExEX0xJQlJBUllfUEFUSCBlbnZpcm9tZW50IHZhcmlhYmxlLCBvciBlZGl0IC9ldGMvbGQuc28uY29uZlxuIik7CisgICAgICAgIHByaW50ZigiKioqIHNvIHRoYXQgdGhlIGNvcnJlY3QgbGlicmFyaWVzIGFyZSBmb3VuZCBhdCBydW4tdGltZSkpXG4iKTsKKyAgICAgIH0KKyAgICB9CisgIHJldHVybiAxOworfQorXSwsIG5vX2d0az15ZXMsW2VjaG8gJGFjX24gImNyb3NzIGNvbXBpbGluZzsgYXNzdW1lZCBPSy4uLiAkYWNfYyJdKQorICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgIGZpCisgIGZpCisgIGlmIHRlc3QgIngkbm9fZ3RrIiA9IHggOyB0aGVuCisgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKSAgICAgCisgIGVsc2UKKyAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgaWYgdGVzdCAiJEdUS19DT05GSUciID0gIm5vIiA7IHRoZW4KKyAgICAgICBlY2hvICIqKiogVGhlIGd0ay1jb25maWcgc2NyaXB0IGluc3RhbGxlZCBieSBHVEsgY291bGQgbm90IGJlIGZvdW5kIgorICAgICAgIGVjaG8gIioqKiBJZiBHVEsgd2FzIGluc3RhbGxlZCBpbiBQUkVGSVgsIG1ha2Ugc3VyZSBQUkVGSVgvYmluIGlzIGluIgorICAgICAgIGVjaG8gIioqKiB5b3VyIHBhdGgsIG9yIHNldCB0aGUgR1RLX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUiCisgICAgICAgZWNobyAiKioqIGZ1bGwgcGF0aCB0byBndGstY29uZmlnLiIKKyAgICAgZWxzZQorICAgICAgIGlmIHRlc3QgLWYgY29uZi5ndGt0ZXN0IDsgdGhlbgorICAgICAgICA6CisgICAgICAgZWxzZQorICAgICAgICAgIGVjaG8gIioqKiBDb3VsZCBub3QgcnVuIEdUSyB0ZXN0IHByb2dyYW0sIGNoZWNraW5nIHdoeS4uLiIKKyAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJEdUS19DRkxBR1MiCisgICAgICAgICAgTElCUz0iJExJQlMgJEdUS19MSUJTIgorICAgICAgICAgIEFDX1RSWV9MSU5LKFsKKyNpbmNsdWRlIDxndGsvZ3RrLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KK10sICAgICAgWyByZXR1cm4gKChndGtfbWFqb3JfdmVyc2lvbikgfHwgKGd0a19taW5vcl92ZXJzaW9uKSB8fCAoZ3RrX21pY3JvX3ZlcnNpb24pKTsgXSwKKyAgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBjb21waWxlZCwgYnV0IGRpZCBub3QgcnVuLiBUaGlzIHVzdWFsbHkgbWVhbnMiCisgICAgICAgICAgZWNobyAiKioqIHRoYXQgdGhlIHJ1bi10aW1lIGxpbmtlciBpcyBub3QgZmluZGluZyBHVEsgb3IgZmluZGluZyB0aGUgd3JvbmciCisgICAgICAgICAgZWNobyAiKioqIHZlcnNpb24gb2YgR1RLLiBJZiBpdCBpcyBub3QgZmluZGluZyBHVEssIHlvdSdsbCBuZWVkIHRvIHNldCB5b3VyIgorICAgICAgICAgIGVjaG8gIioqKiBMRF9MSUJSQVJZX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGVkaXQgL2V0Yy9sZC5zby5jb25mIHRvIHBvaW50IgorICAgICAgICAgIGVjaG8gIioqKiB0byB0aGUgaW5zdGFsbGVkIGxvY2F0aW9uICBBbHNvLCBtYWtlIHN1cmUgeW91IGhhdmUgcnVuIGxkY29uZmlnIGlmIHRoYXQiCisgICAgICAgICAgZWNobyAiKioqIGlzIHJlcXVpcmVkIG9uIHlvdXIgc3lzdGVtIgorCSAgZWNobyAiKioqIgorICAgICAgICAgIGVjaG8gIioqKiBJZiB5b3UgaGF2ZSBhbiBvbGQgdmVyc2lvbiBpbnN0YWxsZWQsIGl0IGlzIGJlc3QgdG8gcmVtb3ZlIGl0LCBhbHRob3VnaCIKKyAgICAgICAgICBlY2hvICIqKiogeW91IG1heSBhbHNvIGJlIGFibGUgdG8gZ2V0IHRoaW5ncyB0byB3b3JrIGJ5IG1vZGlmeWluZyBMRF9MSUJSQVJZX1BBVEgiCisgICAgICAgICAgZWNobyAiKioqIgorICAgICAgICAgIGVjaG8gIioqKiBJZiB5b3UgaGF2ZSBhIFJlZEhhdCA1LjAgc3lzdGVtLCB5b3Ugc2hvdWxkIHJlbW92ZSB0aGUgR1RLIHBhY2thZ2UgdGhhdCIKKyAgICAgICAgICBlY2hvICIqKiogY2FtZSB3aXRoIHRoZSBzeXN0ZW0gd2l0aCB0aGUgY29tbWFuZCIKKyAgICAgICAgICBlY2hvICIqKioiCisgICAgICAgICAgZWNobyAiKioqICAgIHJwbSAtLWVyYXNlIC0tbm9kZXBzIGd0ayBndGstZGV2ZWwiIF0sCisgICAgICAgIFsgZWNobyAiKioqIFRoZSB0ZXN0IHByb2dyYW0gZmFpbGVkIHRvIGNvbXBpbGUgb3IgbGluay4gU2VlIHRoZSBmaWxlIGNvbmZpZy5sb2cgZm9yIHRoZSIKKyAgICAgICAgICBlY2hvICIqKiogZXhhY3QgZXJyb3IgdGhhdCBvY2N1cmVkLiBUaGlzIHVzdWFsbHkgbWVhbnMgR1RLIHdhcyBpbmNvcnJlY3RseSBpbnN0YWxsZWQiCisgICAgICAgICAgZWNobyAiKioqIG9yIHRoYXQgeW91IGhhdmUgbW92ZWQgR1RLIHNpbmNlIGl0IHdhcyBpbnN0YWxsZWQuIEluIHRoZSBsYXR0ZXIgY2FzZSwgeW91IgorICAgICAgICAgIGVjaG8gIioqKiBtYXkgd2FudCB0byBlZGl0IHRoZSBndGstY29uZmlnIHNjcmlwdDogJEdUS19DT05GSUciIF0pCisgICAgICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgICAgICAgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyAgICAgICBmaQorICAgICBmaQorICAgICBHVEtfQ0ZMQUdTPSIiCisgICAgIEdUS19MSUJTPSIiCisgICAgIGlmZWxzZShbJDNdLCAsIDosIFskM10pCisgIGZpCisgIEFDX1NVQlNUKEdUS19DRkxBR1MpCisgIEFDX1NVQlNUKEdUS19MSUJTKQorICBybSAtZiBjb25mLmd0a3Rlc3QKK10pCmRpZmYgLS1naXQgYS9tNC9saWJmYW1lLm00IGIvbTQvbGliZmFtZS5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTcwNTg0Ci0tLSAvZGV2L251bGwKKysrIGIvbTQvbGliZmFtZS5tNApAQCAtMCwwICsxLDE4MiBAQAorZG5sIEFNX1BBVEhfTElCRkFNRShbTUlOSU1VTS1WRVJTSU9OLCBbQUNUSU9OLUlGLUZPVU5EIFssIEFDVElPTi1JRi1OT1QtRk9VTkQgWywgTU9EVUxFU11dXV0pCitkbmwgVGVzdCBmb3IgbGliZmFtZSwgYW5kIGRlZmluZSBMSUJGQU1FX0NGTEFHUyBhbmQgTElCRkFNRV9MSUJTCitkbmwgVml2aWVuIENoYXBwZWxpZXIgMTIvMTEvMDAKK2RubCBzdG9sZW4gZnJvbSBPUkJpdCBhdXRvY29uZgorZG5sCitBQ19ERUZVTihbQU1fUEFUSF9MSUJGQU1FXSwKK1tkbmwgCitkbmwgR2V0IHRoZSBjZmxhZ3MgYW5kIGxpYnJhcmllcyBmcm9tIHRoZSBsaWJmYW1lLWNvbmZpZyBzY3JpcHQKK2RubAorQUNfQVJHX1dJVEgobGliZmFtZS1wcmVmaXgsWyAgLS13aXRoLWxpYmZhbWUtcHJlZml4PVBGWCAgIFByZWZpeCB3aGVyZSBsaWJmYW1lIGlzIGluc3RhbGxlZCAob3B0aW9uYWwpXSwKKyAgICAgICAgICAgIGxpYmZhbWVfY29uZmlnX3ByZWZpeD0iJHdpdGh2YWwiLCBsaWJmYW1lX2NvbmZpZ19wcmVmaXg9IiIpCitBQ19BUkdfV0lUSChsaWJmYW1lLWV4ZWMtcHJlZml4LFsgIC0td2l0aC1saWJmYW1lLWV4ZWMtcHJlZml4PVBGWCBFeGVjIHByZWZpeCB3aGVyZSBsaWJmYW1lIGlzIGluc3RhbGxlZCAob3B0aW9uYWwpXSwKKyAgICAgICAgICAgIGxpYmZhbWVfY29uZmlnX2V4ZWNfcHJlZml4PSIkd2l0aHZhbCIsIGxpYmZhbWVfY29uZmlnX2V4ZWNfcHJlZml4PSIiKQorQUNfQVJHX0VOQUJMRShsaWJmYW1ldGVzdCwgWyAgLS1kaXNhYmxlLWxpYmZhbWV0ZXN0ICAgICAgIERvIG5vdCB0cnkgdG8gY29tcGlsZSBhbmQgcnVuIGEgdGVzdCBsaWJmYW1lIHByb2dyYW1dLAorCQkgICAgLCBlbmFibGVfbGliZmFtZXRlc3Q9eWVzKQorCisgIGlmIHRlc3QgeCRsaWJmYW1lX2NvbmZpZ19leGVjX3ByZWZpeCAhPSB4IDsgdGhlbgorICAgICBsaWJmYW1lX2NvbmZpZ19hcmdzPSIkbGliZmFtZV9jb25maWdfYXJncyAtLWV4ZWMtcHJlZml4PSRsaWJmYW1lX2NvbmZpZ19leGVjX3ByZWZpeCIKKyAgICAgaWYgdGVzdCB4JHtMSUJGQU1FX0NPTkZJRytzZXR9ICE9IHhzZXQgOyB0aGVuCisgICAgICAgIExJQkZBTUVfQ09ORklHPSRsaWJmYW1lX2NvbmZpZ19leGVjX3ByZWZpeC9iaW4vbGliZmFtZS1jb25maWcKKyAgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCB4JGxpYmZhbWVfY29uZmlnX3ByZWZpeCAhPSB4IDsgdGhlbgorICAgICBsaWJmYW1lX2NvbmZpZ19hcmdzPSIkbGliZmFtZV9jb25maWdfYXJncyAtLXByZWZpeD0kbGliZmFtZV9jb25maWdfcHJlZml4IgorICAgICBpZiB0ZXN0IHgke0xJQkZBTUVfQ09ORklHK3NldH0gIT0geHNldCA7IHRoZW4KKyAgICAgICAgTElCRkFNRV9DT05GSUc9JGxpYmZhbWVfY29uZmlnX3ByZWZpeC9iaW4vbGliZmFtZS1jb25maWcKKyAgICAgZmkKKyAgZmkKKworICBBQ19QQVRIX1BST0coTElCRkFNRV9DT05GSUcsIGxpYmZhbWUtY29uZmlnLCBubykKKyAgbWluX2xpYmZhbWVfdmVyc2lvbj1pZmVsc2UoWyQxXSwgLCAwLjkuMCwgJDEpCisgIEFDX01TR19DSEVDS0lORyhmb3IgbGliZmFtZSAtIHZlcnNpb24gPj0gJG1pbl9saWJmYW1lX3ZlcnNpb24pCisgIG5vX2xpYmZhbWU9IiIKKyAgaWYgdGVzdCAiJExJQkZBTUVfQ09ORklHIiA9ICJubyIgOyB0aGVuCisgICAgbm9fbGliZmFtZT15ZXMKKyAgZWxzZQorICAgIExJQkZBTUVfQ0ZMQUdTPWAkTElCRkFNRV9DT05GSUcgJGxpYmZhbWVfY29uZmlnX2FyZ3MgLS1jZmxhZ3NgCisgICAgTElCRkFNRV9MSUJTPWAkTElCRkFNRV9DT05GSUcgJGxpYmZhbWVfY29uZmlnX2FyZ3MgLS1saWJzYAorICAgIGxpYmZhbWVfY29uZmlnX21ham9yX3ZlcnNpb249YCRMSUJGQU1FX0NPTkZJRyAkbGliZmFtZV9jb25maWdfYXJncyAtLXZlcnNpb24gfCBcCisJICAgc2VkIC1lICdzLFtbXjAtOS5dXSwsZycgLWUgJ3MvXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS5cKFtbMC05XV0qXCkvXDEvJ2AKKyAgICBsaWJmYW1lX2NvbmZpZ19taW5vcl92ZXJzaW9uPWAkTElCRkFNRV9DT05GSUcgJGxpYmZhbWVfY29uZmlnX2FyZ3MgLS12ZXJzaW9uIHwgXAorCSAgIHNlZCAtZSAncyxbW14wLTkuXV0sLGcnIC1lICdzL1woW1swLTldXSpcKS5cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpL1wyLydgCisgICAgbGliZmFtZV9jb25maWdfbWljcm9fdmVyc2lvbj1gJExJQkZBTUVfQ09ORklHICRsaWJmYW1lX2NvbmZpZ19hcmdzIC0tdmVyc2lvbiB8IFwKKwkgICBzZWQgLWUgJ3MsW1teMC05Ll1dLCxnJyAtZSAncy9cKFtbMC05XV0qXCkuXChbWzAtOV1dKlwpLlwoW1swLTldXSpcKS9cMy8nYAorICAgIGlmIHRlc3QgIngkZW5hYmxlX2xpYmZhbWV0ZXN0IiA9ICJ4eWVzIiA7IHRoZW4KKyAgICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgIENGTEFHUz0iJENGTEFHUyAkTElCRkFNRV9DRkxBR1MiCisgICAgICBMSUJTPSIkTElCRkFNRV9MSUJTICRMSUJTIgorZG5sCitkbmwgTm93IGNoZWNrIGlmIHRoZSBpbnN0YWxsZWQgTElCRkFNRSBpcyBzdWZmaWNpZW50bHkgbmV3LiAoQWxzbyBzYW5pdHkKK2RubCBjaGVja3MgdGhlIHJlc3VsdHMgb2YgbGliZmFtZS1jb25maWcgdG8gc29tZSBleHRlbnQKK2RubAorICAgICAgcm0gLWYgY29uZi5saWJmYW1ldGVzdAorICAgICAgQUNfVFJZX1JVTihbCisjaW5jbHVkZSA8ZmFtZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludCAKK21haW4gKCkKK3sKKyAgaW50IG1ham9yLCBtaW5vciwgbWljcm87CisgIGNoYXIgKnRtcF92ZXJzaW9uOworCisgIHN5c3RlbSAoInRvdWNoIGNvbmYubGliZmFtZXRlc3QiKTsKKworICAvKiBIUC9VWCA5ICglQCMhKSB3cml0ZXMgdG8gc3NjYW5mIHN0cmluZ3MgKi8KKyAgdG1wX3ZlcnNpb24gPSBzdHJkdXAoIiRtaW5fbGliZmFtZV92ZXJzaW9uIik7CisgIGlmIChzc2NhbmYodG1wX3ZlcnNpb24sICIlZC4lZC4lZCIsICZtYWpvciwgJm1pbm9yLCAmbWljcm8pICE9IDMpIHsKKyAgICAgcHJpbnRmKCIlcywgYmFkIHZlcnNpb24gc3RyaW5nXG4iLCAiJG1pbl9saWJmYW1lX3ZlcnNpb24iKTsKKyAgICAgZXhpdCgxKTsKKyAgIH0KKworICBpZiAoKGxpYmZhbWVfbWFqb3JfdmVyc2lvbiAhPSAkbGliZmFtZV9jb25maWdfbWFqb3JfdmVyc2lvbikgfHwKKyAgICAgIChsaWJmYW1lX21pbm9yX3ZlcnNpb24gIT0gJGxpYmZhbWVfY29uZmlnX21pbm9yX3ZlcnNpb24pIHx8CisgICAgICAobGliZmFtZV9taWNyb192ZXJzaW9uICE9ICRsaWJmYW1lX2NvbmZpZ19taWNyb192ZXJzaW9uKSkKKyAgICB7CisgICAgICBwcmludGYoIlxuKioqICdsaWJmYW1lLWNvbmZpZyAtLXZlcnNpb24nIHJldHVybmVkICVkLiVkLiVkLCBidXQgTGliZmFtZSAoJWQuJWQuJWQpXG4iLCAKKyAgICAgICAgICAgICAkbGliZmFtZV9jb25maWdfbWFqb3JfdmVyc2lvbiwgJGxpYmZhbWVfY29uZmlnX21pbm9yX3ZlcnNpb24sICRsaWJmYW1lX2NvbmZpZ19taWNyb192ZXJzaW9uLAorICAgICAgICAgICAgIGxpYmZhbWVfbWFqb3JfdmVyc2lvbiwgbGliZmFtZV9taW5vcl92ZXJzaW9uLCBsaWJmYW1lX21pY3JvX3ZlcnNpb24pOworICAgICAgcHJpbnRmICgiKioqIHdhcyBmb3VuZCEgSWYgbGliZmFtZS1jb25maWcgd2FzIGNvcnJlY3QsIHRoZW4gaXQgaXMgYmVzdFxuIik7CisgICAgICBwcmludGYgKCIqKiogdG8gcmVtb3ZlIHRoZSBvbGQgdmVyc2lvbiBvZiBsaWJmYW1lLiBZb3UgbWF5IGFsc28gYmUgYWJsZSB0byBmaXggdGhlIGVycm9yXG4iKTsKKyAgICAgIHByaW50ZigiKioqIGJ5IG1vZGlmeWluZyB5b3VyIExEX0xJQlJBUllfUEFUSCBlbnZpcm9tZW50IHZhcmlhYmxlLCBvciBieSBlZGl0aW5nXG4iKTsKKyAgICAgIHByaW50ZigiKioqIC9ldGMvbGQuc28uY29uZi4gTWFrZSBzdXJlIHlvdSBoYXZlIHJ1biBsZGNvbmZpZyBpZiB0aGF0IGlzXG4iKTsKKyAgICAgIHByaW50ZigiKioqIHJlcXVpcmVkIG9uIHlvdXIgc3lzdGVtLlxuIik7CisgICAgICBwcmludGYoIioqKiBJZiBsaWJmYW1lLWNvbmZpZyB3YXMgd3JvbmcsIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTElCRkFNRV9DT05GSUdcbiIpOworICAgICAgcHJpbnRmKCIqKiogdG8gcG9pbnQgdG8gdGhlIGNvcnJlY3QgY29weSBvZiBsaWJmYW1lLWNvbmZpZywgYW5kIHJlbW92ZSB0aGUgZmlsZSBjb25maWcuY2FjaGVcbiIpOworICAgICAgcHJpbnRmKCIqKiogYmVmb3JlIHJlLXJ1bm5pbmcgY29uZmlndXJlXG4iKTsKKyAgICB9IAorI2lmIGRlZmluZWQgKExJQkZBTUVfTUFKT1JfVkVSU0lPTikgJiYgZGVmaW5lZCAoTElCRkFNRV9NSU5PUl9WRVJTSU9OKSAmJiBkZWZpbmVkIChMSUJGQU1FX01JQ1JPX1ZFUlNJT04pCisgIGVsc2UgaWYgKChsaWJmYW1lX21ham9yX3ZlcnNpb24gIT0gTElCRkFNRV9NQUpPUl9WRVJTSU9OKSB8fAorCSAgIChsaWJmYW1lX21pbm9yX3ZlcnNpb24gIT0gTElCRkFNRV9NSU5PUl9WRVJTSU9OKSB8fAorICAgICAgICAgICAobGliZmFtZV9taWNyb192ZXJzaW9uICE9IExJQkZBTUVfTUlDUk9fVkVSU0lPTikpCisgICAgeworICAgICAgcHJpbnRmKCIqKiogbGliZmFtZSBoZWFkZXIgZmlsZXMgKHZlcnNpb24gJWQuJWQuJWQpIGRvIG5vdCBtYXRjaFxuIiwKKwkgICAgIExJQkZBTUVfTUFKT1JfVkVSU0lPTiwgTElCRkFNRV9NSU5PUl9WRVJTSU9OLCBMSUJGQU1FX01JQ1JPX1ZFUlNJT04pOworICAgICAgcHJpbnRmKCIqKiogbGlicmFyeSAodmVyc2lvbiAlZC4lZC4lZClcbiIsCisJICAgICBsaWJmYW1lX21ham9yX3ZlcnNpb24sIGxpYmZhbWVfbWlub3JfdmVyc2lvbiwgbGliZmFtZV9taWNyb192ZXJzaW9uKTsKKyAgICB9CisjZW5kaWYgLyogZGVmaW5lZCAoTElCRkFNRV9NQUpPUl9WRVJTSU9OKSAuLi4gKi8KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICgobGliZmFtZV9tYWpvcl92ZXJzaW9uID4gbWFqb3IpIHx8CisgICAgICAgICgobGliZmFtZV9tYWpvcl92ZXJzaW9uID09IG1ham9yKSAmJiAobGliZmFtZV9taW5vcl92ZXJzaW9uID4gbWlub3IpKSB8fAorICAgICAgICAoKGxpYmZhbWVfbWFqb3JfdmVyc2lvbiA9PSBtYWpvcikgJiYgKGxpYmZhbWVfbWlub3JfdmVyc2lvbiA9PSBtaW5vcikgJiYgKGxpYmZhbWVfbWljcm9fdmVyc2lvbiA+PSBtaWNybykpKQorICAgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcHJpbnRmKCJcbioqKiBBbiBvbGQgdmVyc2lvbiBvZiBsaWJmYW1lICglZC4lZC4lZCkgd2FzIGZvdW5kLlxuIiwKKyAgICAgICAgICAgICAgIGxpYmZhbWVfbWFqb3JfdmVyc2lvbiwgbGliZmFtZV9taW5vcl92ZXJzaW9uLCBsaWJmYW1lX21pY3JvX3ZlcnNpb24pOworICAgICAgICBwcmludGYoIioqKiBZb3UgbmVlZCBhIHZlcnNpb24gb2YgbGliZmFtZSBuZXdlciB0aGFuICVkLiVkLiVkLiBUaGUgbGF0ZXN0IHZlcnNpb24gb2ZcbiIsCisJICAgICAgIG1ham9yLCBtaW5vciwgbWljcm8pOworICAgICAgICBwcmludGYoIioqKiBsaWJmYW1lIGlzIGFsd2F5cyBhdmFpbGFibGUgZnJvbSBodHRwOi8vd3d3LWVsZXZlcy5lbnN0LWJyZXRhZ25lLmZyL35jaGFwcGVsaS9mYW1lXG4iKTsKKyAgICAgICAgcHJpbnRmKCIqKipcbiIpOworICAgICAgICBwcmludGYoIioqKiBJZiB5b3UgaGF2ZSBhbHJlYWR5IGluc3RhbGxlZCBhIHN1ZmZpY2llbnRseSBuZXcgdmVyc2lvbiwgdGhpcyBlcnJvclxuIik7CisgICAgICAgIHByaW50ZigiKioqIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHdyb25nIGNvcHkgb2YgdGhlIGxpYmZhbWUtY29uZmlnIHNoZWxsIHNjcmlwdCBpc1xuIik7CisgICAgICAgIHByaW50ZigiKioqIGJlaW5nIGZvdW5kLiBUaGUgZWFzaWVzdCB3YXkgdG8gZml4IHRoaXMgaXMgdG8gcmVtb3ZlIHRoZSBvbGQgdmVyc2lvblxuIik7CisgICAgICAgIHByaW50ZigiKioqIG9mIGxpYmZhbWUsIGJ1dCB5b3UgY2FuIGFsc28gc2V0IHRoZSBMSUJGQU1FX0NPTkZJRyBlbnZpcm9ubWVudCB0byBwb2ludCB0byB0aGVcbiIpOworICAgICAgICBwcmludGYoIioqKiBjb3JyZWN0IGNvcHkgb2YgbGliZmFtZS1jb25maWcuIChJbiB0aGlzIGNhc2UsIHlvdSB3aWxsIGhhdmUgdG9cbiIpOworICAgICAgICBwcmludGYoIioqKiBtb2RpZnkgeW91ciBMRF9MSUJSQVJZX1BBVEggZW52aXJvbWVudCB2YXJpYWJsZSwgb3IgZWRpdCAvZXRjL2xkLnNvLmNvbmZcbiIpOworICAgICAgICBwcmludGYoIioqKiBzbyB0aGF0IHRoZSBjb3JyZWN0IGxpYnJhcmllcyBhcmUgZm91bmQgYXQgcnVuLXRpbWUpKVxuIik7CisgICAgICB9CisgICAgfQorICByZXR1cm4gMTsKK30KK10sLCBub19saWJmYW1lPXllcyxbZWNobyAkYWNfbiAiY3Jvc3MgY29tcGlsaW5nOyBhc3N1bWVkIE9LLi4uICRhY19jIl0pCisgICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgICAgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyAgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCAieCRub19saWJmYW1lIiA9IHggOyB0aGVuCisgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKSAgICAgCisgIGVsc2UKKyAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgaWYgdGVzdCAiJExJQkZBTUVfQ09ORklHIiA9ICJubyIgOyB0aGVuCisgICAgICAgZWNobyAiKioqIFRoZSBsaWJmYW1lLWNvbmZpZyBzY3JpcHQgaW5zdGFsbGVkIGJ5IGxpYmZhbWUgY291bGQgbm90IGJlIGZvdW5kIgorICAgICAgIGVjaG8gIioqKiBJZiBsaWJmYW1lIHdhcyBpbnN0YWxsZWQgaW4gUFJFRklYLCBtYWtlIHN1cmUgUFJFRklYL2JpbiBpcyBpbiIKKyAgICAgICBlY2hvICIqKiogeW91ciBwYXRoLCBvciBzZXQgdGhlIExJQkZBTUVfQ09ORklHIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSIKKyAgICAgICBlY2hvICIqKiogZnVsbCBwYXRoIHRvIGxpYmZhbWUtY29uZmlnLiIKKyAgICAgZWxzZQorICAgICAgIGlmIHRlc3QgLWYgY29uZi5saWJmYW1ldGVzdCA7IHRoZW4KKyAgICAgICAgOgorICAgICAgIGVsc2UKKyAgICAgICAgICBlY2hvICIqKiogQ291bGQgbm90IHJ1biBsaWJmYW1lIHRlc3QgcHJvZ3JhbSwgY2hlY2tpbmcgd2h5Li4uIgorICAgICAgICAgIENGTEFHUz0iJENGTEFHUyAkTElCRkFNRV9DRkxBR1MiCisgICAgICAgICAgTElCUz0iJExJQlMgJExJQkZBTUVfTElCUyIKKyAgICAgICAgICBBQ19UUllfTElOSyhbCisjaW5jbHVkZSA8ZmFtZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CitdLCAgICAgIFsgcmV0dXJuICgobGliZmFtZV9tYWpvcl92ZXJzaW9uKSB8fCAobGliZmFtZV9taW5vcl92ZXJzaW9uKSB8fCAobGliZmFtZV9taWNyb192ZXJzaW9uKSk7IF0sCisgICAgICAgIFsgZWNobyAiKioqIFRoZSB0ZXN0IHByb2dyYW0gY29tcGlsZWQsIGJ1dCBkaWQgbm90IHJ1bi4gVGhpcyB1c3VhbGx5IG1lYW5zIgorICAgICAgICAgIGVjaG8gIioqKiB0aGF0IHRoZSBydW4tdGltZSBsaW5rZXIgaXMgbm90IGZpbmRpbmcgbGliZmFtZSBvciBmaW5kaW5nIHRoZSB3cm9uZyIKKyAgICAgICAgICBlY2hvICIqKiogdmVyc2lvbiBvZiBMSUJGQU1FLiBJZiBpdCBpcyBub3QgZmluZGluZyBsaWJmYW1lLCB5b3UnbGwgbmVlZCB0byBzZXQgeW91ciIKKyAgICAgICAgICBlY2hvICIqKiogTERfTElCUkFSWV9QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBvciBlZGl0IC9ldGMvbGQuc28uY29uZiB0byBwb2ludCIKKyAgICAgICAgICBlY2hvICIqKiogdG8gdGhlIGluc3RhbGxlZCBsb2NhdGlvbiAgQWxzbywgbWFrZSBzdXJlIHlvdSBoYXZlIHJ1biBsZGNvbmZpZyBpZiB0aGF0IgorICAgICAgICAgIGVjaG8gIioqKiBpcyByZXF1aXJlZCBvbiB5b3VyIHN5c3RlbSIKKwkgIGVjaG8gIioqKiIKKyAgICAgICAgICBlY2hvICIqKiogSWYgeW91IGhhdmUgYW4gb2xkIHZlcnNpb24gaW5zdGFsbGVkLCBpdCBpcyBiZXN0IHRvIHJlbW92ZSBpdCwgYWx0aG91Z2giCisgICAgICAgICAgZWNobyAiKioqIHlvdSBtYXkgYWxzbyBiZSBhYmxlIHRvIGdldCB0aGluZ3MgdG8gd29yayBieSBtb2RpZnlpbmcgTERfTElCUkFSWV9QQVRIIgorICAgICAgICAgIGVjaG8gIioqKiIgXSwKKyAgICAgICAgWyBlY2hvICIqKiogVGhlIHRlc3QgcHJvZ3JhbSBmYWlsZWQgdG8gY29tcGlsZSBvciBsaW5rLiBTZWUgdGhlIGZpbGUgY29uZmlnLmxvZyBmb3IgdGhlIgorICAgICAgICAgIGVjaG8gIioqKiBleGFjdCBlcnJvciB0aGF0IG9jY3VyZWQuIFRoaXMgdXN1YWxseSBtZWFucyBsaWJmYW1lIHdhcyBpbmNvcnJlY3RseSBpbnN0YWxsZWQiCisgICAgICAgICAgZWNobyAiKioqIG9yIHRoYXQgeW91IGhhdmUgbW92ZWQgbGliZmFtZSBzaW5jZSBpdCB3YXMgaW5zdGFsbGVkLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHlvdSIKKyAgICAgICAgICBlY2hvICIqKiogbWF5IHdhbnQgdG8gZWRpdCB0aGUgbGliZmFtZS1jb25maWcgc2NyaXB0OiAkTElCRkFNRV9DT05GSUciIF0pCisgICAgICAgICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCisgICAgICAgICAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyAgICAgICBmaQorICAgICBmaQorICAgICBMSUJGQU1FX0NGTEFHUz0iIgorICAgICBMSUJGQU1FX0xJQlM9IiIKKyAgICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKKyAgZmkKKworICBBQ19TVUJTVChMSUJGQU1FX0NGTEFHUykKKyAgQUNfU1VCU1QoTElCRkFNRV9MSUJTKQorICBybSAtZiBjb25mLmxpYmZhbWV0ZXN0CitdKQpkaWZmIC0tZ2l0IGEvbTQvb2dnLm00IGIvbTQvb2dnLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMWYxYWIKLS0tIC9kZXYvbnVsbAorKysgYi9tNC9vZ2cubTQKQEAgLTAsMCArMSwxMDIgQEAKKyMgQ29uZmlndXJlIHBhdGhzIGZvciBsaWJvZ2cKKyMgSmFjayBNb2ZmaXR0IDxqYWNrQGljZWNhc3Qub3JnPiAxMC0yMS0yMDAwCisjIFNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIE93ZW4gVGF5bG9yIGFuZCBNYW5pc2ggU2luZ2gKKworZG5sIFhJUEhfUEFUSF9PR0coW0FDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EXV0pCitkbmwgVGVzdCBmb3IgbGlib2dnLCBhbmQgZGVmaW5lIE9HR19DRkxBR1MgYW5kIE9HR19MSUJTCitkbmwKK0FDX0RFRlVOKFtYSVBIX1BBVEhfT0dHXSwKK1tkbmwgCitkbmwgR2V0IHRoZSBjZmxhZ3MgYW5kIGxpYnJhcmllcworZG5sCitBQ19BUkdfV0lUSChvZ2csWyAgLS13aXRoLW9nZz1QRlggICBQcmVmaXggd2hlcmUgbGlib2dnIGlzIGluc3RhbGxlZCAob3B0aW9uYWwpXSwgb2dnX3ByZWZpeD0iJHdpdGh2YWwiLCBvZ2dfcHJlZml4PSIiKQorQUNfQVJHX1dJVEgob2dnLWxpYnJhcmllcyxbICAtLXdpdGgtb2dnLWxpYnJhcmllcz1ESVIgICBEaXJlY3Rvcnkgd2hlcmUgbGlib2dnIGxpYnJhcnkgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldLCBvZ2dfbGlicmFyaWVzPSIkd2l0aHZhbCIsIG9nZ19saWJyYXJpZXM9IiIpCitBQ19BUkdfV0lUSChvZ2ctaW5jbHVkZXMsWyAgLS13aXRoLW9nZy1pbmNsdWRlcz1ESVIgICBEaXJlY3Rvcnkgd2hlcmUgbGlib2dnIGhlYWRlciBmaWxlcyBhcmUgaW5zdGFsbGVkIChvcHRpb25hbCldLCBvZ2dfaW5jbHVkZXM9IiR3aXRodmFsIiwgb2dnX2luY2x1ZGVzPSIiKQorQUNfQVJHX0VOQUJMRShvZ2d0ZXN0LCBbICAtLWRpc2FibGUtb2dndGVzdCAgICAgICBEbyBub3QgdHJ5IHRvIGNvbXBpbGUgYW5kIHJ1biBhIHRlc3QgT2dnIHByb2dyYW1dLCwgZW5hYmxlX29nZ3Rlc3Q9eWVzKQorCisgIGlmIHRlc3QgIngkb2dnX2xpYnJhcmllcyIgIT0gIngiIDsgdGhlbgorICAgIE9HR19MSUJTPSItTCRvZ2dfbGlicmFyaWVzIgorICBlbGlmIHRlc3QgIngkb2dnX3ByZWZpeCIgIT0gIngiIDsgdGhlbgorICAgIE9HR19MSUJTPSItTCRvZ2dfcHJlZml4L2xpYiIKKyAgZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0gInhOT05FIiA7IHRoZW4KKyAgICBPR0dfTElCUz0iLUwkcHJlZml4L2xpYiIKKyAgZmkKKworICBPR0dfTElCUz0iJE9HR19MSUJTIC1sb2dnIgorCisgIGlmIHRlc3QgIngkb2dnX2luY2x1ZGVzIiAhPSAieCIgOyB0aGVuCisgICAgT0dHX0NGTEFHUz0iLUkkb2dnX2luY2x1ZGVzIgorICBlbGlmIHRlc3QgIngkb2dnX3ByZWZpeCIgIT0gIngiIDsgdGhlbgorICAgIE9HR19DRkxBR1M9Ii1JJG9nZ19wcmVmaXgvaW5jbHVkZSIKKyAgZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0gInhOT05FIjsgdGhlbgorICAgIE9HR19DRkxBR1M9Ii1JJHByZWZpeC9pbmNsdWRlIgorICBmaQorCisgIEFDX01TR19DSEVDS0lORyhmb3IgT2dnKQorICBub19vZ2c9IiIKKworCisgIGlmIHRlc3QgIngkZW5hYmxlX29nZ3Rlc3QiID0gInh5ZXMiIDsgdGhlbgorICAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgIGFjX3NhdmVfTElCUz0iJExJQlMiCisgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRPR0dfQ0ZMQUdTIgorICAgIExJQlM9IiRMSUJTICRPR0dfTElCUyIKK2RubAorZG5sIE5vdyBjaGVjayBpZiB0aGUgaW5zdGFsbGVkIE9nZyBpcyBzdWZmaWNpZW50bHkgbmV3LgorZG5sCisgICAgICBybSAtZiBjb25mLm9nZ3Rlc3QKKyAgICAgIEFDX1RSWV9SVU4oWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8b2dnL29nZy5oPgorCitpbnQgbWFpbiAoKQoreworICBzeXN0ZW0oInRvdWNoIGNvbmYub2dndGVzdCIpOworICByZXR1cm4gMDsKK30KKworXSwsIG5vX29nZz15ZXMsW2VjaG8gJGFjX24gImNyb3NzIGNvbXBpbGluZzsgYXNzdW1lZCBPSy4uLiAkYWNfYyJdKQorICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgIGZpCisKKyAgaWYgdGVzdCAieCRub19vZ2ciID0gIngiIDsgdGhlbgorICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgaWZlbHNlKFskMV0sICwgOiwgWyQxXSkgICAgIAorICBlbHNlCisgICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgIGlmIHRlc3QgLWYgY29uZi5vZ2d0ZXN0IDsgdGhlbgorICAgICAgIDoKKyAgICAgZWxzZQorICAgICAgIGVjaG8gIioqKiBDb3VsZCBub3QgcnVuIE9nZyB0ZXN0IHByb2dyYW0sIGNoZWNraW5nIHdoeS4uLiIKKyAgICAgICBDRkxBR1M9IiRDRkxBR1MgJE9HR19DRkxBR1MiCisgICAgICAgTElCUz0iJExJQlMgJE9HR19MSUJTIgorICAgICAgIEFDX1RSWV9MSU5LKFsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9nZy9vZ2cuaD4KK10sICAgICBbIHJldHVybiAwOyBdLAorICAgICAgIFsgZWNobyAiKioqIFRoZSB0ZXN0IHByb2dyYW0gY29tcGlsZWQsIGJ1dCBkaWQgbm90IHJ1bi4gVGhpcyB1c3VhbGx5IG1lYW5zIgorICAgICAgIGVjaG8gIioqKiB0aGF0IHRoZSBydW4tdGltZSBsaW5rZXIgaXMgbm90IGZpbmRpbmcgT2dnIG9yIGZpbmRpbmcgdGhlIHdyb25nIgorICAgICAgIGVjaG8gIioqKiB2ZXJzaW9uIG9mIE9nZy4gSWYgaXQgaXMgbm90IGZpbmRpbmcgT2dnLCB5b3UnbGwgbmVlZCB0byBzZXQgeW91ciIKKyAgICAgICBlY2hvICIqKiogTERfTElCUkFSWV9QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBvciBlZGl0IC9ldGMvbGQuc28uY29uZiB0byBwb2ludCIKKyAgICAgICBlY2hvICIqKiogdG8gdGhlIGluc3RhbGxlZCBsb2NhdGlvbiAgQWxzbywgbWFrZSBzdXJlIHlvdSBoYXZlIHJ1biBsZGNvbmZpZyBpZiB0aGF0IgorICAgICAgIGVjaG8gIioqKiBpcyByZXF1aXJlZCBvbiB5b3VyIHN5c3RlbSIKKyAgICAgICBlY2hvICIqKioiCisgICAgICAgZWNobyAiKioqIElmIHlvdSBoYXZlIGFuIG9sZCB2ZXJzaW9uIGluc3RhbGxlZCwgaXQgaXMgYmVzdCB0byByZW1vdmUgaXQsIGFsdGhvdWdoIgorICAgICAgIGVjaG8gIioqKiB5b3UgbWF5IGFsc28gYmUgYWJsZSB0byBnZXQgdGhpbmdzIHRvIHdvcmsgYnkgbW9kaWZ5aW5nIExEX0xJQlJBUllfUEFUSCJdLAorICAgICAgIFsgZWNobyAiKioqIFRoZSB0ZXN0IHByb2dyYW0gZmFpbGVkIHRvIGNvbXBpbGUgb3IgbGluay4gU2VlIHRoZSBmaWxlIGNvbmZpZy5sb2cgZm9yIHRoZSIKKyAgICAgICBlY2hvICIqKiogZXhhY3QgZXJyb3IgdGhhdCBvY2N1cmVkLiBUaGlzIHVzdWFsbHkgbWVhbnMgT2dnIHdhcyBpbmNvcnJlY3RseSBpbnN0YWxsZWQiCisgICAgICAgZWNobyAiKioqIG9yIHRoYXQgeW91IGhhdmUgbW92ZWQgT2dnIHNpbmNlIGl0IHdhcyBpbnN0YWxsZWQuIiBdKQorICAgICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRhY19zYXZlX0xJQlMiCisgICAgIGZpCisgICAgIE9HR19DRkxBR1M9IiIKKyAgICAgT0dHX0xJQlM9IiIKKyAgICAgaWZlbHNlKFskMl0sICwgOiwgWyQyXSkKKyAgZmkKKyAgQUNfU1VCU1QoT0dHX0NGTEFHUykKKyAgQUNfU1VCU1QoT0dHX0xJQlMpCisgIHJtIC1mIGNvbmYub2dndGVzdAorXSkKZGlmZiAtLWdpdCBhL200L3ZvcmJpcy5tNCBiL200L3ZvcmJpcy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTI4ODkzCi0tLSAvZGV2L251bGwKKysrIGIvbTQvdm9yYmlzLm00CkBAIC0wLDAgKzEsMTI4IEBACisjIENvbmZpZ3VyZSBwYXRocyBmb3IgbGlidm9yYmlzCisjIEphY2sgTW9mZml0dCA8amFja0BpY2VjYXN0Lm9yZz4gMTAtMjEtMjAwMAorIyBTaGFtZWxlc3NseSBzdG9sZW4gZnJvbSBPd2VuIFRheWxvciBhbmQgTWFuaXNoIFNpbmdoCisjIHRob21hc3ZzIGFkZGVkIGNoZWNrIGZvciB2b3JiaXNfYml0cmF0ZV9hZGRibG9jayB3aGljaCBpcyBuZXcgaW4gcmMzCisjIHRob21hc3ZzIGFkZGVkIGNoZWNrIGZvciBPVl9FQ1RMX1JBVEVNQU5BR0VfU0VUIHdoaWNoIGlzIG5ldyBpbiAxLjAgZmluYWwKKworZG5sIFhJUEhfUEFUSF9WT1JCSVMoW0FDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EXV0pCitkbmwgVGVzdCBmb3IgbGlidm9yYmlzLCBhbmQgZGVmaW5lIFZPUkJJU19DRkxBR1MgYW5kIFZPUkJJU19MSUJTCitkbmwKK0FDX0RFRlVOKFtYSVBIX1BBVEhfVk9SQklTXSwKK1tkbmwgCitkbmwgR2V0IHRoZSBjZmxhZ3MgYW5kIGxpYnJhcmllcworZG5sCitBQ19BUkdfV0lUSCh2b3JiaXMsWyAgLS13aXRoLXZvcmJpcz1QRlggICBQcmVmaXggd2hlcmUgbGlidm9yYmlzIGlzIGluc3RhbGxlZCAob3B0aW9uYWwpXSwgdm9yYmlzX3ByZWZpeD0iJHdpdGh2YWwiLCB2b3JiaXNfcHJlZml4PSIiKQorQUNfQVJHX1dJVEgodm9yYmlzLWxpYnJhcmllcyxbICAtLXdpdGgtdm9yYmlzLWxpYnJhcmllcz1ESVIgICBEaXJlY3Rvcnkgd2hlcmUgbGlidm9yYmlzIGxpYnJhcnkgaXMgaW5zdGFsbGVkIChvcHRpb25hbCldLCB2b3JiaXNfbGlicmFyaWVzPSIkd2l0aHZhbCIsIHZvcmJpc19saWJyYXJpZXM9IiIpCitBQ19BUkdfV0lUSCh2b3JiaXMtaW5jbHVkZXMsWyAgLS13aXRoLXZvcmJpcy1pbmNsdWRlcz1ESVIgICBEaXJlY3Rvcnkgd2hlcmUgbGlidm9yYmlzIGhlYWRlciBmaWxlcyBhcmUgaW5zdGFsbGVkIChvcHRpb25hbCldLCB2b3JiaXNfaW5jbHVkZXM9IiR3aXRodmFsIiwgdm9yYmlzX2luY2x1ZGVzPSIiKQorQUNfQVJHX0VOQUJMRSh2b3JiaXN0ZXN0LCBbICAtLWRpc2FibGUtdm9yYmlzdGVzdCAgICAgICBEbyBub3QgdHJ5IHRvIGNvbXBpbGUgYW5kIHJ1biBhIHRlc3QgVm9yYmlzIHByb2dyYW1dLCwgZW5hYmxlX3ZvcmJpc3Rlc3Q9eWVzKQorCisgIGlmIHRlc3QgIngkdm9yYmlzX2xpYnJhcmllcyIgIT0gIngiIDsgdGhlbgorICAgIFZPUkJJU19MSUJTPSItTCR2b3JiaXNfbGlicmFyaWVzIgorICBlbGlmIHRlc3QgIngkdm9yYmlzX3ByZWZpeCIgIT0gIngiIDsgdGhlbgorICAgIFZPUkJJU19MSUJTPSItTCR2b3JiaXNfcHJlZml4L2xpYiIKKyAgZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0gInhOT05FIjsgdGhlbgorICAgIFZPUkJJU19MSUJTPSItTCRwcmVmaXgvbGliIgorICBmaQorCisgIFZPUkJJU19MSUJTPSIkVk9SQklTX0xJQlMgLWx2b3JiaXMgLWxtIgorICBWT1JCSVNGSUxFX0xJQlM9Ii1sdm9yYmlzZmlsZSIKKyAgVk9SQklTRU5DX0xJQlM9Ii1sdm9yYmlzZW5jIgorCisgIGlmIHRlc3QgIngkdm9yYmlzX2luY2x1ZGVzIiAhPSAieCIgOyB0aGVuCisgICAgVk9SQklTX0NGTEFHUz0iLUkkdm9yYmlzX2luY2x1ZGVzIgorICBlbGlmIHRlc3QgIngkdm9yYmlzX3ByZWZpeCIgIT0gIngiIDsgdGhlbgorICAgIFZPUkJJU19DRkxBR1M9Ii1JJHZvcmJpc19wcmVmaXgvaW5jbHVkZSIKKyAgZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0gInhOT05FIjsgdGhlbgorICAgIFZPUkJJU19DRkxBR1M9Ii1JJHByZWZpeC9pbmNsdWRlIgorICBmaQorCisKKyAgQUNfTVNHX0NIRUNLSU5HKGZvciBWb3JiaXMpCisgIG5vX3ZvcmJpcz0iIgorCisKKyAgaWYgdGVzdCAieCRlbmFibGVfdm9yYmlzdGVzdCIgPSAieHllcyIgOyB0aGVuCisgICAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICBDRkxBR1M9IiRDRkxBR1MgJFZPUkJJU19DRkxBR1MgJE9HR19DRkxBR1MiCisgICAgTElCUz0iJExJQlMgJFZPUkJJU19MSUJTICRWT1JCSVNFTkNfTElCUyAkT0dHX0xJQlMiCitkbmwKK2RubCBOb3cgY2hlY2sgaWYgdGhlIGluc3RhbGxlZCBWb3JiaXMgaXMgc3VmZmljaWVudGx5IG5ldy4KK2RubAorICAgICAgcm0gLWYgY29uZi52b3JiaXN0ZXN0CisgICAgICBBQ19UUllfUlVOKFsKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHZvcmJpcy9jb2RlYy5oPgorI2luY2x1ZGUgPHZvcmJpcy92b3JiaXNlbmMuaD4KKworaW50IG1haW4gKCkKK3sKKyAgICB2b3JiaXNfYmxvY2sgCXZiOworICAgIHZvcmJpc19kc3Bfc3RhdGUJdmQ7CisgICAgdm9yYmlzX2luZm8JCXZpOworCisgICAgdm9yYmlzX2luZm9faW5pdCAoJnZpKTsKKyAgICB2b3JiaXNfZW5jb2RlX2luaXQgKCZ2aSwgMiwgNDQxMDAsIC0xLCAxMjgwMDAsIC0xKTsKKyAgICB2b3JiaXNfYW5hbHlzaXNfaW5pdCAoJnZkLCAmdmkpOworICAgIHZvcmJpc19ibG9ja19pbml0ICgmdmQsICZ2Yik7CisgICAgLyogdGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgaW4gMS4wcmMzLCBzbyB0aGlzIGlzIHdoYXQgd2UncmUgdGVzdGluZyBmb3IgKi8KKyAgICB2b3JiaXNfYml0cmF0ZV9hZGRibG9jayAoJnZiKTsKKworICAgIC8qIHRoaXMgZGVmaW5lIHdhcyBhZGRlZCBpbiAxLjAgZmluYWwgKi8KKyNpZmRlZiBPVl9FQ1RMX1JBVEVNQU5BR0VfU0VUCisgICAgc3lzdGVtKCJ0b3VjaCBjb25mLnZvcmJpc3Rlc3QiKTsKKyAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgcmV0dXJuIC0xOworI2VuZGlmCit9CisKK10sLCBub192b3JiaXM9eWVzLFtlY2hvICRhY19uICJjcm9zcyBjb21waWxpbmc7IGFzc3VtZWQgT0suLi4gJGFjX2MiXSkKKyAgICAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKyAgICAgICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorICBmaQorCisgIGlmIHRlc3QgIngkbm9fdm9yYmlzIiA9ICJ4IiA7IHRoZW4KKyAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgIGlmZWxzZShbJDFdLCAsIDosIFskMV0pICAgICAKKyAgZWxzZQorICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICBpZiB0ZXN0IC1mIGNvbmYudm9yYmlzdGVzdCA7IHRoZW4KKyAgICAgICA6CisgICAgIGVsc2UKKyAgICAgICBlY2hvICIqKiogQ291bGQgbm90IHJ1biBWb3JiaXMgdGVzdCBwcm9ncmFtLCBjaGVja2luZyB3aHkuLi4iCisgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRWT1JCSVNfQ0ZMQUdTIgorICAgICAgIExJQlM9IiRMSUJTICRWT1JCSVNfTElCUyAkT0dHX0xJQlMiCisgICAgICAgQUNfVFJZX0xJTksoWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dm9yYmlzL2NvZGVjLmg+CitdLCAgICAgWyByZXR1cm4gMDsgXSwKKyAgICAgICBbIGVjaG8gIioqKiBUaGUgdGVzdCBwcm9ncmFtIGNvbXBpbGVkLCBidXQgZGlkIG5vdCBydW4uIFRoaXMgdXN1YWxseSBtZWFucyIKKyAgICAgICBlY2hvICIqKiogdGhhdCB0aGUgcnVuLXRpbWUgbGlua2VyIGlzIG5vdCBmaW5kaW5nIFZvcmJpcyBvciBmaW5kaW5nIHRoZSB3cm9uZyIKKyAgICAgICBlY2hvICIqKiogdmVyc2lvbiBvZiBWb3JiaXMuIElmIGl0IGlzIG5vdCBmaW5kaW5nIFZvcmJpcywgeW91J2xsIG5lZWQgdG8gc2V0IHlvdXIiCisgICAgICAgZWNobyAiKioqIExEX0xJQlJBUllfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgZWRpdCAvZXRjL2xkLnNvLmNvbmYgdG8gcG9pbnQiCisgICAgICAgZWNobyAiKioqIHRvIHRoZSBpbnN0YWxsZWQgbG9jYXRpb24gIEFsc28sIG1ha2Ugc3VyZSB5b3UgaGF2ZSBydW4gbGRjb25maWcgaWYgdGhhdCIKKyAgICAgICBlY2hvICIqKiogaXMgcmVxdWlyZWQgb24geW91ciBzeXN0ZW0iCisgICAgICAgZWNobyAiKioqIgorICAgICAgIGVjaG8gIioqKiBJZiB5b3UgaGF2ZSBhbiBvbGQgdmVyc2lvbiBpbnN0YWxsZWQsIGl0IGlzIGJlc3QgdG8gcmVtb3ZlIGl0LCBhbHRob3VnaCIKKyAgICAgICBlY2hvICIqKiogeW91IG1heSBhbHNvIGJlIGFibGUgdG8gZ2V0IHRoaW5ncyB0byB3b3JrIGJ5IG1vZGlmeWluZyBMRF9MSUJSQVJZX1BBVEgiXSwKKyAgICAgICBbIGVjaG8gIioqKiBUaGUgdGVzdCBwcm9ncmFtIGZhaWxlZCB0byBjb21waWxlIG9yIGxpbmsuIFNlZSB0aGUgZmlsZSBjb25maWcubG9nIGZvciB0aGUiCisgICAgICAgZWNobyAiKioqIGV4YWN0IGVycm9yIHRoYXQgb2NjdXJlZC4gVGhpcyB1c3VhbGx5IG1lYW5zIFZvcmJpcyB3YXMgaW5jb3JyZWN0bHkgaW5zdGFsbGVkIgorICAgICAgIGVjaG8gIioqKiBvciB0aGF0IHlvdSBoYXZlIG1vdmVkIFZvcmJpcyBzaW5jZSBpdCB3YXMgaW5zdGFsbGVkLiIgXSkKKyAgICAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKyAgICAgICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorICAgICBmaQorICAgICBWT1JCSVNfQ0ZMQUdTPSIiCisgICAgIFZPUkJJU19MSUJTPSIiCisgICAgIFZPUkJJU0ZJTEVfTElCUz0iIgorICAgICBWT1JCSVNFTkNfTElCUz0iIgorICAgICBpZmVsc2UoWyQyXSwgLCA6LCBbJDJdKQorICBmaQorICBBQ19TVUJTVChWT1JCSVNfQ0ZMQUdTKQorICBBQ19TVUJTVChWT1JCSVNfTElCUykKKyAgQUNfU1VCU1QoVk9SQklTRklMRV9MSUJTKQorICBBQ19TVUJTVChWT1JCSVNFTkNfTElCUykKKyAgcm0gLWYgY29uZi52b3JiaXN0ZXN0CitdKQpkaWZmIC0tZ2l0IGEvbWVzb24uYnVpbGQgYi9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGYwNWFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwyOTYgQEAKK3Byb2plY3QoJ2dzdC1wbHVnaW5zLWdvb2QnLCAnYycsCisgIHZlcnNpb24gOiAnMS4xMy4wLjEnLAorICBtZXNvbl92ZXJzaW9uIDogJz49IDAuMzYuMCcsCisgIGRlZmF1bHRfb3B0aW9ucyA6IFsgJ3dhcm5pbmdfbGV2ZWw9MScsCisgICAgICAgICAgICAgICAgICAgICAgJ2J1aWxkdHlwZT1kZWJ1Z29wdGltaXplZCcgXSkKKworZ3N0X3ZlcnNpb24gPSBtZXNvbi5wcm9qZWN0X3ZlcnNpb24oKQordmVyc2lvbl9hcnIgPSBnc3RfdmVyc2lvbi5zcGxpdCgnLicpCitnc3RfdmVyc2lvbl9tYWpvciA9IHZlcnNpb25fYXJyWzBdLnRvX2ludCgpCitnc3RfdmVyc2lvbl9taW5vciA9IHZlcnNpb25fYXJyWzFdLnRvX2ludCgpCitnc3RfdmVyc2lvbl9taWNybyA9IHZlcnNpb25fYXJyWzJdLnRvX2ludCgpCisgaWYgdmVyc2lvbl9hcnIubGVuZ3RoKCkgPT0gNAorICBnc3RfdmVyc2lvbl9uYW5vID0gdmVyc2lvbl9hcnJbM10udG9faW50KCkKK2Vsc2UKKyAgZ3N0X3ZlcnNpb25fbmFubyA9IDAKK2VuZGlmCisKK2dsaWJfcmVxID0gJz49IDIuNDAuMCcKK2dzdF9yZXEgPSAnPj0gQDBALkAxQC4wJy5mb3JtYXQoZ3N0X3ZlcnNpb25fbWFqb3IsIGdzdF92ZXJzaW9uX21pbm9yKQorCithcGlfdmVyc2lvbiA9ICcxLjAnCisKK3BsdWdpbnNfaW5zdGFsbF9kaXIgPSAnQDBAL2dzdHJlYW1lci0xLjAnLmZvcm1hdChnZXRfb3B0aW9uKCdsaWJkaXInKSkKKworY2MgPSBtZXNvbi5nZXRfY29tcGlsZXIoJ2MnKQorCitpZiBjYy5nZXRfaWQoKSA9PSAnbXN2YycKKyAgIyBJZ25vcmUgc2V2ZXJhbCBzcHVyaW91cyB3YXJuaW5ncyBmb3IgdGhpbmdzIGdzdHJlYW1lciBkb2VzIHZlcnkgY29tbW9ubHkKKyAgIyBJZiBhIHdhcm5pbmcgaXMgY29tcGxldGVseSB1c2VsZXNzIGFuZCBzcGFtbXksIHVzZSAnL3dkWFhYWCcgdG8gc3VwcHJlc3MgaXQKKyAgIyBJZiBhIHdhcm5pbmcgaXMgaGFybWxlc3MgYnV0IGhhcmQgdG8gZml4LCB1c2UgJy93b1hYWFgnIHNvIGl0J3Mgc2hvd24gb25jZQorICAjIE5PVEU6IE9ubHkgYWRkIHdhcm5pbmdzIGhlcmUgaWYgeW91IGFyZSBzdXJlIHRoZXkncmUgc3B1cmlvdXMKKyAgYWRkX3Byb2plY3RfYXJndW1lbnRzKAorICAgICAgJy93ZDQwMTgnLCAjIGltcGxpY2l0IHNpZ25lZC91bnNpZ25lZCBjb252ZXJzaW9uCisgICAgICAnL3dkNDE0NicsICMgdW5hcnkgbWludXMgb24gdW5zaWduZWQgKGJld2FyZSBJTlRfTUlOKQorICAgICAgJy93ZDQyNDQnLCAjIGxvc3N5IHR5cGUgY29udmVyc2lvbiAoZS5nLiBkb3VibGUgLT4gaW50KQorICAgICAgJy93ZDQzMDUnLCAjIHRydW5jYXRpbmcgdHlwZSBjb252ZXJzaW9uIChlLmcuIGRvdWJsZSAtPiBmbG9hdCkKKyAgICAgIGxhbmd1YWdlIDogJ2MnKQorICAjIERpc2FibGUgU0FGRVNFSCB3aXRoIE1TVkMgZm9yIHBsdWdpbnMgYW5kIGxpYnMgdGhhdCB1c2UgZXh0ZXJuYWwgZGVwcyB0aGF0CisgICMgYXJlIGJ1aWx0IHdpdGggTWluR1cKKyAgbm9zZWhfbGlua19hcmdzID0gWycvU0FGRVNFSDpOTyddCitlbHNlCisgIG5vc2VoX2xpbmtfYXJncyA9IFtdCitlbmRpZgorCisjIFN5bWJvbCB2aXNpYmlsaXR5CitpZiBjYy5oYXNfYXJndW1lbnQoJy1mdmlzaWJpbGl0eT1oaWRkZW4nKQorICBhZGRfcHJvamVjdF9hcmd1bWVudHMoJy1mdmlzaWJpbGl0eT1oaWRkZW4nLCBsYW5ndWFnZTogJ2MnKQorZW5kaWYKKworIyBEaXNhYmxlIHN0cmljdCBhbGlhc2luZworaWYgY2MuaGFzX2FyZ3VtZW50KCctZm5vLXN0cmljdC1hbGlhc2luZycpCisgIGFkZF9wcm9qZWN0X2FyZ3VtZW50cygnLWZuby1zdHJpY3QtYWxpYXNpbmcnLCBsYW5ndWFnZTogJ2MnKQorZW5kaWYKKworY2RhdGEgPSBjb25maWd1cmF0aW9uX2RhdGEoKQorCitjaGVja19oZWFkZXJzID0gWworICBbJ0hBVkVfRExGQ05fSCcsICdkbGZjbi5oJ10sCisgIFsnSEFWRV9GQ05UTF9IJywgJ2ZjbnRsLmgnXSwKKyAgWydIQVZFX0lOVFRZUEVTX0gnLCAnaW50dHlwZXMuaCddLAorICBbJ0hBVkVfTUVNT1JZX0gnLCAnbWVtb3J5LmgnXSwKKyAgWydIQVZFX1BST0NFU1NfSCcsICdwcm9jZXNzLmgnXSwKKyAgWydIQVZFX1NURElOVF9IJywgJ3N0ZGludC5oJ10sCisgIFsnSEFWRV9TVERMSUJfSCcsICdzdGRsaWIuaCddLAorICBbJ0hBVkVfU1RSSU5HU19IJywgJ3N0cmluZ3MuaCddLAorICBbJ0hBVkVfU1RSSU5HX0gnLCAnc3RyaW5nLmgnXSwKKyAgWydIQVZFX1NZU19JT0NUTF9IJywgJ3N5cy9pb2N0bC5oJ10sCisgIFsnSEFWRV9TWVNfUEFSQU1fSCcsICdzeXMvcGFyYW0uaCddLAorICBbJ0hBVkVfU1lTX1NPQ0tFVF9IJywgJ3N5cy9zb2NrZXQuaCddLAorICBbJ0hBVkVfU1lTX1NUQVRfSCcsICdzeXMvc3RhdC5oJ10sCisgIFsnSEFWRV9TWVNfVElNRV9IJywgJ3N5cy90aW1lLmgnXSwKKyAgWydIQVZFX1NZU19UWVBFU19IJywgJ3N5cy90eXBlcy5oJ10sCisgIFsnSEFWRV9VTklTVERfSCcsICd1bmlzdGQuaCddLAorXQorCitmb3JlYWNoIGggOiBjaGVja19oZWFkZXJzCisgIGlmIGNjLmhhc19oZWFkZXIoaC5nZXQoMSkpCisgICAgY2RhdGEuc2V0KGguZ2V0KDApLCAxKQorICBlbmRpZgorZW5kZm9yZWFjaAorCitjaGVja19mdW5jdGlvbnMgPSBbCisgIFsnSEFWRV9BU0lOSCcsICdhc2luaCcsICcjaW5jbHVkZTxtYXRoLmg+J10sCisgIFsnSEFWRV9DTE9DS19HRVRUSU1FJywgJ2Nsb2NrX2dldHRpbWUnLCAnI2luY2x1ZGU8dGltZS5oPiddLAorICBbJ0hBVkVfQ09TSCcsICdjb3NoJywgJyNpbmNsdWRlPG1hdGguaD4nXSwKKyMgY2hlY2sgdG9rZW4gSEFWRV9DUFVfQUxQSEEKKyMgY2hlY2sgdG9rZW4gSEFWRV9DUFVfQVJNCisjIGNoZWNrIHRva2VuIEhBVkVfQ1BVX0NSSVMKKyMgY2hlY2sgdG9rZW4gSEFWRV9DUFVfQ1JJU1YzMgorIyBjaGVjayB0b2tlbiBIQVZFX0NQVV9IUFBBCisjIGNoZWNrIHRva2VuIEhBVkVfQ1BVX0kzODYKKyMgY2hlY2sgdG9rZW4gSEFWRV9DUFVfSUE2NAorIyBjaGVjayB0b2tlbiBIQVZFX0NQVV9NNjhLCisjIGNoZWNrIHRva2VuIEhBVkVfQ1BVX01JUFMKKyMgY2hlY2sgdG9rZW4gSEFWRV9DUFVfUFBDCisjIGNoZWNrIHRva2VuIEhBVkVfQ1BVX1BQQzY0CisjIGNoZWNrIHRva2VuIEhBVkVfQ1BVX1MzOTAKKyMgY2hlY2sgdG9rZW4gSEFWRV9DUFVfU1BBUkMKKyMgY2hlY2sgdG9rZW4gSEFWRV9DUFVfWDg2XzY0CisgIFsnSEFWRV9EQ0dFVFRFWFQnLCAnZGNnZXR0ZXh0JywgJyNpbmNsdWRlPGxpYmludGwuaD4nXSwKKyMgY2hlY2sgdG9rZW4gSEFWRV9ESVJFQ1RTT1VORAorIyBjaGVjayB0b2tlbiBIQVZFX0VYUEVSSU1FTlRBTAorIyBjaGVjayB0b2tlbiBIQVZFX0VYVEVSTkFMCisjIGNoZWNrIHRva2VuIEhBVkVfRlBDTEFTUworIyBjaGVjayB0b2tlbiBIQVZFX0dDQ19BU00KKyAgWydIQVZFX0dFVFBBR0VTSVpFJywgJ2dldHBhZ2VzaXplJywgJyNpbmNsdWRlPHVuaXN0ZC5oPiddLAorIyBjaGVjayB0b2tlbiBIQVZFX0dFVFRFWFQKKyMgY2hlY2sgdG9rZW4gSEFWRV9HU1RfVjRMMgorIyBjaGVjayB0b2tlbiBIQVZFX0lPUworICBbJ0hBVkVfSVNJTkYnLCAnaXNpbmYnLCAnI2luY2x1ZGU8bWF0aC5oPiddLAorIyBjaGVjayB0b2tlbiBIQVZFX0xJQlY0TDIKKyAgWydIQVZFX01NQVAnLCAnbW1hcCcsICcjaW5jbHVkZTxzeXMvbW1hbi5oPiddLAorICBbJ0hBVkVfTU1BUDY0JywgJ21tYXA2NCcsICcjaW5jbHVkZTxzeXMvbW1hbi5oPiddLAorIyBjaGVjayB0b2tlbiBIQVZFX09TWF9BVURJTworIyBjaGVjayB0b2tlbiBIQVZFX09TWF9WSURFTworIyBjaGVjayB0b2tlbiBIQVZFX1JEVFNDCisgIFsnSEFWRV9TSU5IJywgJ3NpbmgnLCAnI2luY2x1ZGU8bWF0aC5oPiddLAorIyBjaGVjayB0b2tlbiBIQVZFX1dBVkVGT1JNCitdCisKK2xpYm0gPSBjYy5maW5kX2xpYnJhcnkoJ20nLCByZXF1aXJlZCA6IGZhbHNlKQorCitmb3JlYWNoIGYgOiBjaGVja19mdW5jdGlvbnMKKyAgaWYgY2MuaGFzX2Z1bmN0aW9uKGYuZ2V0KDEpLCBwcmVmaXggOiBmLmdldCgyKSwgZGVwZW5kZW5jaWVzIDogbGlibSkKKyAgICBjZGF0YS5zZXQoZi5nZXQoMCksIDEpCisgIGVuZGlmCitlbmRmb3JlYWNoCisKK2NkYXRhLnNldCgnU0laRU9GX0NIQVInLCBjYy5zaXplb2YoJ2NoYXInKSkKK2NkYXRhLnNldCgnU0laRU9GX0lOVCcsIGNjLnNpemVvZignaW50JykpCitjZGF0YS5zZXQoJ1NJWkVPRl9MT05HJywgY2Muc2l6ZW9mKCdsb25nJykpCitjZGF0YS5zZXQoJ1NJWkVPRl9TSE9SVCcsIGNjLnNpemVvZignc2hvcnQnKSkKK2NkYXRhLnNldCgnU0laRU9GX1ZPSURQJywgY2Muc2l6ZW9mKCd2b2lkKicpKQorY2RhdGEuc2V0KCdTSVpFT0ZfT0ZGX1QnLCBjYy5zaXplb2YoJ29mZl90JykpCisKKyMgSGVyZSBiZSBmaXhtZXMuCisjIEZJWE1FOiBjaGVjayBpZiB0aGlzIGlzIGNvcnJlY3QKK2NkYXRhLnNldCgnSEFWRV9DUFVfWDg2XzY0JywgaG9zdF9tYWNoaW5lLmNwdSgpID09ICdhbWQ2NCcpCitjZGF0YS5zZXQoJ0hBVkVfR0NDX0FTTScsIGNjLmdldF9pZCgpICE9ICdtc3ZjJykKK2NkYXRhLnNldCgnVkVSU0lPTicsICciQDBAIicuZm9ybWF0KGdzdF92ZXJzaW9uKSkKK2NkYXRhLnNldCgnUEFDS0FHRV9WRVJTSU9OJywgJyJAMEAiJy5mb3JtYXQoZ3N0X3ZlcnNpb24pKQorY2RhdGEuc2V0KCdHU1RfTElDRU5TRScsICciTEdQTCInKQorY2RhdGEuc2V0KCdQQUNLQUdFJywgJyJnc3QtcGx1Z2lucy1nb29kIicpCitjZGF0YS5zZXQoJ0dFVFRFWFRfUEFDS0FHRScsICciZ3N0LXBsdWdpbnMtZ29vZC0xLjAiJykKKworIyBHU3RyZWFtZXIgcGFja2FnZSBuYW1lIGFuZCBvcmlnaW4gdXJsCitnc3RfcGFja2FnZV9uYW1lID0gZ2V0X29wdGlvbignd2l0aC1wYWNrYWdlLW5hbWUnKQoraWYgZ3N0X3BhY2thZ2VfbmFtZSA9PSAnJworICBpZiBnc3RfdmVyc2lvbl9uYW5vID09IDAKKyAgICBnc3RfcGFja2FnZV9uYW1lID0gJ0dTdHJlYW1lciBHb29kIFBsdWctaW5zIHNvdXJjZSByZWxlYXNlJworICBlbGlmIGdzdF92ZXJzaW9uX25hbm8gPT0gMQorICAgIGdzdF9wYWNrYWdlX25hbWUgPSAnR1N0cmVhbWVyIEdvb2QgUGx1Zy1pbnMgZ2l0JworICBlbHNlCisgICAgZ3N0X3BhY2thZ2VfbmFtZSA9ICdHU3RyZWFtZXIgR29vZCBQbHVnLWlucyBwcmVyZWxlYXNlJworICBlbmRpZgorZW5kaWYKK2NkYXRhLnNldF9xdW90ZWQoJ0dTVF9QQUNLQUdFX05BTUUnLCBnc3RfcGFja2FnZV9uYW1lKQorY2RhdGEuc2V0X3F1b3RlZCgnR1NUX1BBQ0tBR0VfT1JJR0lOJywgZ2V0X29wdGlvbignd2l0aC1wYWNrYWdlLW9yaWdpbicpKQorCisjIE1hbmRhdG9yeSBHU1QgZGVwcworZ3N0X2RlcCA9IGRlcGVuZGVuY3koJ2dzdHJlYW1lci0xLjAnLCB2ZXJzaW9uIDogZ3N0X3JlcSwKKyAgZmFsbGJhY2sgOiBbJ2dzdHJlYW1lcicsICdnc3RfZGVwJ10pCitnc3RiYXNlX2RlcCA9IGRlcGVuZGVuY3koJ2dzdHJlYW1lci1iYXNlLTEuMCcsIHZlcnNpb24gOiBnc3RfcmVxLAorICBmYWxsYmFjayA6IFsnZ3N0cmVhbWVyJywgJ2dzdF9iYXNlX2RlcCddKQorZ3N0bmV0X2RlcCA9IGRlcGVuZGVuY3koJ2dzdHJlYW1lci1uZXQtMS4wJywgdmVyc2lvbiA6IGdzdF9yZXEsCisgIGZhbGxiYWNrIDogWydnc3RyZWFtZXInLCAnZ3N0X25ldF9kZXAnXSkKK2lmIGhvc3RfbWFjaGluZS5zeXN0ZW0oKSAhPSAnd2luZG93cycKKyAgZ3N0Y2hlY2tfZGVwID0gZGVwZW5kZW5jeSgnZ3N0cmVhbWVyLWNoZWNrLTEuMCcsIHZlcnNpb24gOiBnc3RfcmVxLAorICAgIGZhbGxiYWNrIDogWydnc3RyZWFtZXInLCAnZ3N0X2NoZWNrX2RlcCddKQorZW5kaWYKK2dzdGNvbnRyb2xsZXJfZGVwID0gZGVwZW5kZW5jeSgnZ3N0cmVhbWVyLWNvbnRyb2xsZXItMS4wJywgdmVyc2lvbiA6IGdzdF9yZXEsCisgIGZhbGxiYWNrIDogWydnc3RyZWFtZXInLCAnZ3N0X2NvbnRyb2xsZXJfZGVwJ10pCisKK2dzdHBidXRpbHNfZGVwID0gZGVwZW5kZW5jeSgnZ3N0cmVhbWVyLXBidXRpbHMtMS4wJywgdmVyc2lvbiA6IGdzdF9yZXEsCisgICAgZmFsbGJhY2sgOiBbJ2dzdC1wbHVnaW5zLWJhc2UnLCAncGJ1dGlsc19kZXAnXSkKK2dzdGFsbG9jYXRvcnNfZGVwID0gZGVwZW5kZW5jeSgnZ3N0cmVhbWVyLWFsbG9jYXRvcnMtMS4wJywgdmVyc2lvbiA6IGdzdF9yZXEsCisgICAgZmFsbGJhY2sgOiBbJ2dzdC1wbHVnaW5zLWJhc2UnLCAnYWxsb2NhdG9yc19kZXAnXSkKK2dzdGFwcF9kZXAgPSBkZXBlbmRlbmN5KCdnc3RyZWFtZXItYXBwLTEuMCcsIHZlcnNpb24gOiBnc3RfcmVxLAorICAgIGZhbGxiYWNrIDogWydnc3QtcGx1Z2lucy1iYXNlJywgJ2FwcF9kZXAnXSkKK2dzdGF1ZGlvX2RlcCA9IGRlcGVuZGVuY3koJ2dzdHJlYW1lci1hdWRpby0xLjAnLCB2ZXJzaW9uIDogZ3N0X3JlcSwKKyAgICBmYWxsYmFjayA6IFsnZ3N0LXBsdWdpbnMtYmFzZScsICdhdWRpb19kZXAnXSkKK2dzdGZmdF9kZXAgPSBkZXBlbmRlbmN5KCdnc3RyZWFtZXItZmZ0LTEuMCcsIHZlcnNpb24gOiBnc3RfcmVxLAorICAgIGZhbGxiYWNrIDogWydnc3QtcGx1Z2lucy1iYXNlJywgJ2ZmdF9kZXAnXSkKK2dzdHJpZmZfZGVwID0gZGVwZW5kZW5jeSgnZ3N0cmVhbWVyLXJpZmYtMS4wJywgdmVyc2lvbiA6IGdzdF9yZXEsCisgICAgZmFsbGJhY2sgOiBbJ2dzdC1wbHVnaW5zLWJhc2UnLCAncmlmZl9kZXAnXSkKK2dzdHJ0cF9kZXAgPSBkZXBlbmRlbmN5KCdnc3RyZWFtZXItcnRwLTEuMCcsIHZlcnNpb24gOiBnc3RfcmVxLAorICAgIGZhbGxiYWNrIDogWydnc3QtcGx1Z2lucy1iYXNlJywgJ3J0cF9kZXAnXSkKK2dzdHJ0c3BfZGVwID0gZGVwZW5kZW5jeSgnZ3N0cmVhbWVyLXJ0c3AtMS4wJywgdmVyc2lvbiA6IGdzdF9yZXEsCisgICAgZmFsbGJhY2sgOiBbJ2dzdC1wbHVnaW5zLWJhc2UnLCAncnRzcF9kZXAnXSkKK2dzdHNkcF9kZXAgPSBkZXBlbmRlbmN5KCdnc3RyZWFtZXItc2RwLTEuMCcsIHZlcnNpb24gOiBnc3RfcmVxLAorICAgIGZhbGxiYWNrIDogWydnc3QtcGx1Z2lucy1iYXNlJywgJ3NkcF9kZXAnXSkKK2dzdHRhZ19kZXAgPSBkZXBlbmRlbmN5KCdnc3RyZWFtZXItdGFnLTEuMCcsIHZlcnNpb24gOiBnc3RfcmVxLAorICAgIGZhbGxiYWNrIDogWydnc3QtcGx1Z2lucy1iYXNlJywgJ3RhZ19kZXAnXSkKK2dzdHZpZGVvX2RlcCA9IGRlcGVuZGVuY3koJ2dzdHJlYW1lci12aWRlby0xLjAnLCB2ZXJzaW9uIDogZ3N0X3JlcSwKKyAgICBmYWxsYmFjayA6IFsnZ3N0LXBsdWdpbnMtYmFzZScsICd2aWRlb19kZXAnXSkKKworemxpYl9kZXAgPSBkZXBlbmRlbmN5KCd6bGliJywgcmVxdWlyZWQgOiBmYWxzZSkKK2J6MmxpYiA9IGNjLmZpbmRfbGlicmFyeSgnYnoyJywgcmVxdWlyZWQgOiBmYWxzZSkKK2dsaWJfZGVwcyA9IFtkZXBlbmRlbmN5KCdnbGliLTIuMCcsIHZlcnNpb24gOiBnbGliX3JlcSwgZmFsbGJhY2s6IFsnZ2xpYicsICdsaWJnbGliX2RlcCddKSwKKyAgICAgICAgICAgICBkZXBlbmRlbmN5KCdnb2JqZWN0LTIuMCcsIGZhbGxiYWNrOiBbJ2dsaWInLCAnbGliZ29iamVjdF9kZXAnXSldCitnaW9fZGVwID0gZGVwZW5kZW5jeSgnZ2lvLTIuMCcsIGZhbGxiYWNrOiBbJ2dsaWInLCAnbGliZ2lvX2RlcCddKQorCitjZGF0YS5zZXQoJ0hBVkVfWkxJQicsIHpsaWJfZGVwLmZvdW5kKCkpCitjZGF0YS5zZXQoJ0hBVkVfQloyJywgYnoybGliLmZvdW5kKCkpCisKKyMgQ2hlY2sgYWxsIG9mIHRoZSB0aGluZ3MuCisjIFRPRE86IE5vbmUgb2YgdGhlc2UgYXJlIGFjdHVhbGx5IHVzZWQgeWV0IGJlY2F1c2UKKyMgdGhlIGJ1aWxkIGZpbGVzIGhhdmVuJ3QgYmVlbiB3cml0dGVuCitkZXBzID0gWworICBbJ2d0a19kZXAnLCdndGsrLTMuMCcsICcnLCAnJ10sCisgIFsnZ3RreF9kZXAnLCdndGsrLXgxMS0zLjAnLCAnJywgJyddLAorICBbJ2NhY2FfZGVwJywnY2FjYScsICcnLCAnJ10sCisgIFsnbGlicmF3MTM5NF9kZXAnLCdsaWJyYXcxMzk0JywgJz49Mi4wLjAnLCAnJ10sCisgIFsnbGliaWVjNjE4ODNfZGVwJywnbGliaWVjNjE4ODMnLCAnPj0xLjAuMCcsICcnXSwKK10KKworZm9yZWFjaCBkIDogZGVwcworICB2YXJuYW1lID0gZFswXQorICBkZXBuYW1lID0gZFsxXQorICB2ZXJzaW9uID0gZFsyXQorICBjb25maG5hbWUgPSBkWzNdCisgIGlmIHZlcnNpb24gPT0gJycKKyAgICBjdXJkZXAgPSBkZXBlbmRlbmN5KGRlcG5hbWUsIHJlcXVpcmVkIDogZmFsc2UpCisgIGVsc2UKKyAgICBjdXJkZXAgPSBkZXBlbmRlbmN5KGRlcG5hbWUsIHJlcXVpcmVkIDogZmFsc2UsIHZlcnNpb24gOiB2ZXJzaW9uKQorICBlbmRpZgorICBzZXRfdmFyaWFibGUodmFybmFtZSwgY3VyZGVwKQorICBpZiBjdXJkZXAuZm91bmQoKSBhbmQgY29uZmhuYW1lICE9ICcnCisgICAgY2RhdGEuc2V0KGNvbmZobmFtZSwgMSkKKyAgZW5kaWYKK2VuZGZvcmVhY2gKKworZ3N0X3BsdWdpbnNfZ29vZF9hcmdzID0gWyctREhBVkVfQ09ORklHX0gnXQorY29uZmlnaW5jID0gaW5jbHVkZV9kaXJlY3RvcmllcygnLicpCitsaWJzaW5jID0gaW5jbHVkZV9kaXJlY3RvcmllcygnZ3N0LWxpYnMnKQorCitoYXZlX29yY2MgPSBmYWxzZQorb3JjY19hcmdzID0gW10KK2lmIGdldF9vcHRpb24oJ3VzZV9vcmMnKSAhPSAnbm8nCisgIG5lZWRfb3JjID0gZ2V0X29wdGlvbigndXNlX29yYycpID09ICd5ZXMnCisgICMgVXNlZCBieSB2YXJpb3VzIGxpYnJhcmllcy9lbGVtZW50cyB0aGF0IHVzZSBPcmMgY29kZQorICBvcmNfZGVwID0gZGVwZW5kZW5jeSgnb3JjLTAuNCcsIHZlcnNpb24gOiAnPj0gMC40LjE3JywgcmVxdWlyZWQgOiBuZWVkX29yYykKKyAgb3JjYyA9IGZpbmRfcHJvZ3JhbSgnb3JjYycsIHJlcXVpcmVkIDogbmVlZF9vcmMpCisgIGlmIG9yY19kZXAuZm91bmQoKSBhbmQgb3JjYy5mb3VuZCgpCisgICAgaGF2ZV9vcmNjID0gdHJ1ZQorICAgIG9yY2NfYXJncyA9IFtvcmNjLCAnLS1pbmNsdWRlJywgJ2dsaWIuaCddCisgICAgY2RhdGEuc2V0KCdIQVZFX09SQycsIDEpCisgIGVsc2UKKyAgICBtZXNzYWdlKCdPcmMgQ29tcGlsZXIgbm90IGZvdW5kLCB3aWxsIHVzZSBiYWNrdXAgQyBjb2RlJykKKyAgICBjZGF0YS5zZXQoJ0RJU0FCTEVfT1JDJywgMSkKKyAgZW5kaWYKK2Vsc2UKKyAgY2RhdGEuc2V0KCdESVNBQkxFX09SQycsIDEpCitlbmRpZgorCitpZiBnc3RfZGVwLnR5cGVfbmFtZSgpID09ICdpbnRlcm5hbCcKKyAgICBnc3RfcHJvaiA9IHN1YnByb2plY3QoJ2dzdHJlYW1lcicpCisKKyAgICBpZiBnc3RfcHJvai5nZXRfdmFyaWFibGUoJ2Rpc2FibGVfZ3N0X2RlYnVnJykKKyAgICAgICAgbWVzc2FnZSgnR1N0cmVhbWVyIGRlYnVnIHN5c3RlbSBpcyBkaXNhYmxlZCcpCisgICAgICAgIGFkZF9wcm9qZWN0X2FyZ3VtZW50cygnLVduby11bnVzZWQnLCBsYW5ndWFnZTogJ2MnKQorICAgIGVsc2UKKyAgICAgICAgbWVzc2FnZSgnR1N0cmVhbWVyIGRlYnVnIHN5c3RlbSBpcyBlbmFibGVkJykKKyAgICBlbmRpZgorZWxzZQorICAgICMgV2UgY2FuJ3QgY2hlY2sgdGhhdCBpbiB0aGUgY2FzZSBvZiBzdWJwcm9qZWN0cyBhcyB3ZSB3b24ndAorICAgICMgYmUgYWJsZSB0byBidWlsZCBhZ2FpbnN0IGFuIGludGVybmFsIGRlcGVuZGVuY3kgKHdoaWNoIGlzIG5vdCBidWlsdCB5ZXQpCisgICAgaWYgbm90IGNjLmNvbXBpbGVzKCcnJworI2luY2x1ZGUgPGdzdC9nc3Rjb25maWcuaD4KKyNpZmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyNlcnJvciAiZGVidWdnaW5nIGRpc2FibGVkLCBtYWtlIGNvbXBpbGVyIGZhaWwiCisjZW5kaWYnJycgLCBkZXBlbmRlbmNpZXM6IGdzdF9kZXApCisgICAgICAgIG1lc3NhZ2UoJ0dTdHJlYW1lciBkZWJ1ZyBzeXN0ZW0gaXMgZGlzYWJsZWQnKQorICAgICAgICBhZGRfcHJvamVjdF9hcmd1bWVudHMoJy1Xbm8tdW51c2VkJywgbGFuZ3VhZ2U6ICdjJykKKyAgICBlbHNlCisgICAgICAgIG1lc3NhZ2UoJ0dTdHJlYW1lciBkZWJ1ZyBzeXN0ZW0gaXMgZW5hYmxlZCcpCisgICAgZW5kaWYKK2VuZGlmCisKK3ByZXNldGRpciA9IGpvaW5fcGF0aHMoZ2V0X29wdGlvbignZGF0YWRpcicpLCAnZ3N0cmVhbWVyLScgKyBhcGlfdmVyc2lvbiwgJ3ByZXNldHMnKQorCitzdWJkaXIoJ2dzdCcpCitzdWJkaXIoJ3N5cycpCitzdWJkaXIoJ2V4dCcpCitzdWJkaXIoJ3Rlc3RzJykKK3N1YmRpcigncGtnY29uZmlnJykKKworIyB4Z2V0dGV4dCBpcyBvcHRpb25hbCAob24gV2luZG93cyBmb3IgaW5zdGFuY2UpCitpZiBmaW5kX3Byb2dyYW0oJ3hnZXR0ZXh0JywgcmVxdWlyZWQgOiBmYWxzZSkuZm91bmQoKQorICBzdWJkaXIoJ3BvJykKK2VuZGlmCisKK2NvbmZpZ3VyZV9maWxlKG91dHB1dCA6ICdjb25maWcuaCcsIGNvbmZpZ3VyYXRpb24gOiBjZGF0YSkKKworcHl0aG9uMyA9IGltcG9ydCgncHl0aG9uMycpLmZpbmRfcHl0aG9uKCkKK3J1bl9jb21tYW5kKHB5dGhvbjMsICctYycsICdpbXBvcnQgc2h1dGlsOyBzaHV0aWwuY29weSgiaG9va3MvcHJlLWNvbW1pdC5ob29rIiwgIi5naXQvaG9va3MvcHJlLWNvbW1pdCIpJykKZGlmZiAtLWdpdCBhL21lc29uX29wdGlvbnMudHh0IGIvbWVzb25fb3B0aW9ucy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjZjQyZQotLS0gL2Rldi9udWxsCisrKyBiL21lc29uX29wdGlvbnMudHh0CkBAIC0wLDAgKzEsMTAgQEAKKyMgRW5hYmxlIFY0TDIgcGx1Z2luIHRvIHByb2JlIGRldmljZXMgYXQgcGx1Z2luIGxvYWQKK29wdGlvbigndjRsMi1wcm9iZScsIHR5cGUgOiAnYm9vbGVhbicsIHZhbHVlIDogdHJ1ZSkKKyMgVXNlIGxpYnY0bDIgZm9yIHNvbWUgb2JzY3VyZSBmb3JtYXQgY29udmVyc2lvbnMKK29wdGlvbignd2l0aC1saWJ2NGwyJywgdHlwZSA6ICdib29sZWFuJywgdmFsdWUgOiB0cnVlKQorIyBXaGV0aGVyIHRvIHVzZSBvcmMgb3Igbm90IChhdXRvIHdpbGwgYXV0b2RldGVjdCwgeWVzIHdpbGwgZXJyb3Igb3V0IGlmIG5vdCBmb3VuZCkKK29wdGlvbigndXNlX29yYycsIHR5cGUgOiAnY29tYm8nLCBjaG9pY2VzIDogWyd5ZXMnLCAnbm8nLCAnYXV0byddLCB2YWx1ZSA6ICdhdXRvJykKK29wdGlvbignd2l0aC1wYWNrYWdlLW5hbWUnLCB0eXBlIDogJ3N0cmluZycsCisgICAgICAgZGVzY3JpcHRpb24gOiAncGFja2FnZSBuYW1lIHRvIHVzZSBpbiBwbHVnaW5zJykKK29wdGlvbignd2l0aC1wYWNrYWdlLW9yaWdpbicsIHR5cGUgOiAnc3RyaW5nJywgdmFsdWUgOiAnVW5rbm93biBwYWNrYWdlIG9yaWdpbicsCisgICAgICAgZGVzY3JpcHRpb24gOiAncGFja2FnZSBvcmlnaW4gVVJMIHRvIHVzZSBpbiBwbHVnaW5zJykKZGlmZiAtLWdpdCBhL3BrZ2NvbmZpZy8uZ2l0aWdub3JlIGIvcGtnY29uZmlnLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkMGVmMAotLS0gL2Rldi9udWxsCisrKyBiL3BrZ2NvbmZpZy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKKyoucGMKZGlmZiAtLWdpdCBhL3BrZ2NvbmZpZy9NYWtlZmlsZS5hbSBiL3BrZ2NvbmZpZy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDc5MTdiCi0tLSAvZGV2L251bGwKKysrIGIvcGtnY29uZmlnL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzEgQEAKKyMjIyBhbGwgb2YgdGhlIHN0YW5kYXJkIHBjIGZpbGVzIHdlIG5lZWQgdG8gZ2VuZXJhdGUKK3BjdmVyZmlsZXMgPSAgXAorCWdzdHJlYW1lci1wbHVnaW5zLWdvb2QtQEdTVF9BUElfVkVSU0lPTkAucGMKK3BjdmVyZmlsZXNfdW5pbnN0YWxsZWQgPSBcCisJZ3N0cmVhbWVyLXBsdWdpbnMtZ29vZC1AR1NUX0FQSV9WRVJTSU9OQC11bmluc3RhbGxlZC5wYworCisjIyMgYWxsLWxvY2FsOiAkKHBjdmVyZmlsZXMpICQocGN2ZXJmaWxlc191bmluc3RhbGxlZCkKK2FsbC1sb2NhbDogJChwY3ZlcmZpbGVzX3VuaW5zdGFsbGVkKQorCitjcF92ZXJib3NlID0gJChjcF92ZXJib3NlXyQoVikpCitjcF92ZXJib3NlXyA9ICQoY3BfdmVyYm9zZV8kKEFNX0RFRkFVTFRfVkVSQk9TSVRZKSkKK2NwX3ZlcmJvc2VfMCA9IEBlY2hvICIgIENQICAgICAkQCI7CisKKyMjIyBob3cgdG8gZ2VuZXJhdGUgdmVyc2lvbmVkIC5wYyBmaWxlcyBmcm9tIC5wYyBmaWxlcyBpbiB0aGlzIGRpcgorJS1AR1NUX0FQSV9WRVJTSU9OQC5wYzogJS5wYworCSQoY3BfdmVyYm9zZSljcCAkPCAkQAorJS1AR1NUX0FQSV9WRVJTSU9OQC11bmluc3RhbGxlZC5wYzogJS11bmluc3RhbGxlZC5wYworCSQoY3BfdmVyYm9zZSljcCAkPCAkQAorCisjIGRvIG5vdCBpbnN0YWxsIGZvciBub3cKKyMgcGtnY29uZmlnZGlyID0gJChsaWJkaXIpL3BrZ2NvbmZpZworIyBwa2djb25maWdfREFUQSA9ICQocGN2ZXJmaWxlcykKKworQ0xFQU5GSUxFUyA9ICQocGN2ZXJmaWxlcykgJChwY3ZlcmZpbGVzX3VuaW5zdGFsbGVkKQorIyBwY2luZmlsZXMgPSBcCisjICAgICAgICAgICBnc3RyZWFtZXItcGx1Z2lucy1nb29kLnBjLmluIGdzdHJlYW1lci1wbHVnaW5zLWdvb2QtdW5pbnN0YWxsZWQucGMuaW4KK3BjaW5maWxlcyA9IFwKKyAgICAgICAgICAgZ3N0cmVhbWVyLXBsdWdpbnMtZ29vZC11bmluc3RhbGxlZC5wYy5pbgorCitESVNUQ0xFQU5GSUxFUyA9ICQocGNpbmZpbGVzOi5pbj0pCitFWFRSQV9ESVNUID0gJChwY2luZmlsZXMpCmRpZmYgLS1naXQgYS9wa2djb25maWcvZ3N0cmVhbWVyLXBsdWdpbnMtZ29vZC11bmluc3RhbGxlZC5wYy5pbiBiL3BrZ2NvbmZpZy9nc3RyZWFtZXItcGx1Z2lucy1nb29kLXVuaW5zdGFsbGVkLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyN2EzMmIKLS0tIC9kZXYvbnVsbAorKysgYi9wa2djb25maWcvZ3N0cmVhbWVyLXBsdWdpbnMtZ29vZC11bmluc3RhbGxlZC5wYy5pbgpAQCAtMCwwICsxLDEzIEBACitwcmVmaXg9CitleGVjX3ByZWZpeD0KK2xpYmRpcj1AYWJzX3RvcF9idWlsZGRpckAvZ3N0LWxpYnMvZ3N0CitpbmNsdWRlZGlyPUBhYnNfdG9wX2J1aWxkZGlyQC9nc3QtbGlicworcGx1Z2luc2Rpcj1AYWJzX3RvcF9idWlsZGRpckAKKworTmFtZTogR1N0cmVhbWVyIEdvb2QgUGx1Z2lucywgVW5pbnN0YWxsZWQKK0Rlc2NyaXB0aW9uOiBTdHJlYW1pbmcgbWVkaWEgZnJhbWV3b3JrLCBnb29kIHBsdWdpbnMsIHVuaW5zdGFsbGVkCitWZXJzaW9uOiBAVkVSU0lPTkAKK1JlcXVpcmVzOiBnc3RyZWFtZXItQEdTVF9BUElfVkVSU0lPTkAgZ3N0cmVhbWVyLXBsdWdpbnMtYmFzZS1AR1NUX0FQSV9WRVJTSU9OQAorCitMaWJzOiAKK0NmbGFnczogCmRpZmYgLS1naXQgYS9wa2djb25maWcvbWVzb24uYnVpbGQgYi9wa2djb25maWcvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiZjBkNAotLS0gL2Rldi9udWxsCisrKyBiL3BrZ2NvbmZpZy9tZXNvbi5idWlsZApAQCAtMCwwICsxLDI0IEBACitwa2djb25mID0gY29uZmlndXJhdGlvbl9kYXRhKCkKKworcGtnY29uZi5zZXQoJ3ByZWZpeCcsIGdldF9vcHRpb24oJ3ByZWZpeCcpKQorcGtnY29uZi5zZXQoJ2V4ZWNfcHJlZml4JywgJyR7cHJlZml4fScpCitwa2djb25mLnNldCgnbGliZGlyJywgJyR7cHJlZml4fS9AMEAnLmZvcm1hdChnZXRfb3B0aW9uKCdsaWJkaXInKSkpCitwa2djb25mLnNldCgnaW5jbHVkZWRpcicsICcke3ByZWZpeH0vQDBAJy5mb3JtYXQoZ2V0X29wdGlvbignaW5jbHVkZWRpcicpKSkKK3BrZ2NvbmYuc2V0KCdHU1RfQVBJX1ZFUlNJT04nLCBhcGlfdmVyc2lvbikKK3BrZ2NvbmYuc2V0KCdWRVJTSU9OJywgZ3N0X3ZlcnNpb24pCisKKyMgbmVlZGVkIGZvciBnZW5lcmF0aW5nIC11bmluc3RhbGxlZC5wYyBmaWxlcworcGtnY29uZi5zZXQoJ2Fic190b3BfYnVpbGRkaXInLCBqb2luX3BhdGhzKG1lc29uLmN1cnJlbnRfYnVpbGRfZGlyKCksICcuLicpKQorcGtnY29uZi5zZXQoJ2Fic190b3Bfc3JjZGlyJywgam9pbl9wYXRocyhtZXNvbi5jdXJyZW50X3NvdXJjZV9kaXIoKSwgJy4uJykpCisKK3BrZ19pbnN0YWxsX2RpciA9ICdAMEAvcGtnY29uZmlnJy5mb3JtYXQoZ2V0X29wdGlvbignbGliZGlyJykpCisKK3BrZ19maWxlcyA9IFsnZ3N0cmVhbWVyLXBsdWdpbnMtZ29vZCddCisKK2ZvcmVhY2ggcCA6IHBrZ19maWxlcworICBpbmZpbGUgPSBwICsgJy11bmluc3RhbGxlZC5wYy5pbicKKyAgb3V0ZmlsZSA9IHAgKyAnLTEuMC11bmluc3RhbGxlZC5wYycKKyAgY29uZmlndXJlX2ZpbGUoaW5wdXQgOiBpbmZpbGUsCisgICAgb3V0cHV0IDogb3V0ZmlsZSwKKyAgICBjb25maWd1cmF0aW9uIDogcGtnY29uZikKK2VuZGZvcmVhY2gKZGlmZiAtLWdpdCBhL3BvLy5naXRpZ25vcmUgYi9wby8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZDAwYmUKLS0tIC9kZXYvbnVsbAorKysgYi9wby8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMTcgQEAKKyouZ21vCityZW1vdmUtcG90Y2RhdGUuc2VkCityZW1vdmUtcG90Y2RhdGUuc2luCitzdGFtcC1wbworUE9URklMRVMKK2NhdC1pZC10YmwuYworKi5wb3QKK01ha2VmaWxlLmluLmluCitNYWtlZmlsZS5pbi5pbi5vcmlnCitNYWtldmFycy50ZW1wbGF0ZQorUnVsZXMtcXVvdAorYm9sZHF1b3Quc2VkCitlbkBib2xkcXVvdC5oZWFkZXIKK2VuQHF1b3QuaGVhZGVyCitpbnNlcnQtaGVhZGVyLnNpbgorcXVvdC5zZWQKKy5wb3QKZGlmZiAtLWdpdCBhL3BvL0xJTkdVQVMgYi9wby9MSU5HVUFTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0N2ViNGMKLS0tIC9kZXYvbnVsbAorKysgYi9wby9MSU5HVUFTCkBAIC0wLDAgKzEgQEAKK2FmIGF6IGJnIGNhIGNzIGRhIGRlIGVsIGVuX0dCIGVvIGVzIGV1IGZpIGZyIGZ1ciBnbCBociBodSBpZCBpdCBqYSBsdCBsdiBtdCBuYiBubCBvciBwbCBwdF9CUiBybyBydSBzayBzbCBzcSBzciBzdiB0ciB1ayB2aSB6aF9DTiB6aF9ISyB6aF9UVwpkaWZmIC0tZ2l0IGEvcG8vTWFrZXZhcnMgYi9wby9NYWtldmFycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTZmZGUzCi0tLSAvZGV2L251bGwKKysrIGIvcG8vTWFrZXZhcnMKQEAgLTAsMCArMSw0NiBAQAorIyBNYWtlZmlsZSB2YXJpYWJsZXMgZm9yIFBPIGRpcmVjdG9yeSBpbiBhbnkgcGFja2FnZSB1c2luZyBHTlUgZ2V0dGV4dC4KKworIyBVc3VhbGx5IHRoZSBtZXNzYWdlIGRvbWFpbiBpcyB0aGUgc2FtZSBhcyB0aGUgcGFja2FnZSBuYW1lLgorRE9NQUlOID0gZ3N0LXBsdWdpbnMtZ29vZC0xLjAKKworIyBUaGVzZSB0d28gdmFyaWFibGVzIGRlcGVuZCBvbiB0aGUgbG9jYXRpb24gb2YgdGhpcyBkaXJlY3RvcnkuCitzdWJkaXIgPSBwbwordG9wX2J1aWxkZGlyID0gLi4KKworIyBUaGVzZSBvcHRpb25zIGdldCBwYXNzZWQgdG8geGdldHRleHQuCitYR0VUVEVYVF9PUFRJT05TID0gLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fCisKKyMgVGhpcyBpcyB0aGUgY29weXJpZ2h0IGhvbGRlciB0aGF0IGdldHMgaW5zZXJ0ZWQgaW50byB0aGUgaGVhZGVyIG9mIHRoZQorIyAkKERPTUFJTikucG90IGZpbGUuICBTZXQgdGhpcyB0byB0aGUgY29weXJpZ2h0IGhvbGRlciBvZiB0aGUgc3Vycm91bmRpbmcKKyMgcGFja2FnZS4gIChOb3RlIHRoYXQgdGhlIG1zZ3N0ciBzdHJpbmdzLCBleHRyYWN0ZWQgZnJvbSB0aGUgcGFja2FnZSdzCisjIHNvdXJjZXMsIGJlbG9uZyB0byB0aGUgY29weXJpZ2h0IGhvbGRlciBvZiB0aGUgcGFja2FnZS4pICBUcmFuc2xhdG9ycyBhcmUKKyMgZXhwZWN0ZWQgdG8gdHJhbnNmZXIgdGhlIGNvcHlyaWdodCBmb3IgdGhlaXIgdHJhbnNsYXRpb25zIHRvIHRoaXMgcGVyc29uCisjIG9yIGVudGl0eSwgb3IgdG8gZGlzY2xhaW0gdGhlaXIgY29weXJpZ2h0LiAgVGhlIGVtcHR5IHN0cmluZyBzdGFuZHMgZm9yCisjIHRoZSBwdWJsaWMgZG9tYWluOyBpbiB0aGlzIGNhc2UgdGhlIHRyYW5zbGF0b3JzIGFyZSBleHBlY3RlZCB0byBkaXNjbGFpbQorIyB0aGVpciBjb3B5cmlnaHQuCitDT1BZUklHSFRfSE9MREVSID0KKworIyBUaGlzIGlzIHRoZSBlbWFpbCBhZGRyZXNzIG9yIFVSTCB0byB3aGljaCB0aGUgdHJhbnNsYXRvcnMgc2hhbGwgcmVwb3J0CisjIGJ1Z3MgaW4gdGhlIHVudHJhbnNsYXRlZCBzdHJpbmdzOgorIyAtIFN0cmluZ3Mgd2hpY2ggYXJlIG5vdCBlbnRpcmUgc2VudGVuY2VzLCBzZWUgdGhlIG1haW50YWluZXIgZ3VpZGVsaW5lcworIyAgIGluIHRoZSBHTlUgZ2V0dGV4dCBkb2N1bWVudGF0aW9uLCBzZWN0aW9uICdQcmVwYXJpbmcgU3RyaW5ncycuCisjIC0gU3RyaW5ncyB3aGljaCB1c2UgdW5jbGVhciB0ZXJtcyBvciByZXF1aXJlIGFkZGl0aW9uYWwgY29udGV4dCB0byBiZQorIyAgIHVuZGVyc3Rvb2QuCisjIC0gU3RyaW5ncyB3aGljaCBtYWtlIGludmFsaWQgYXNzdW1wdGlvbnMgYWJvdXQgbm90YXRpb24gb2YgZGF0ZSwgdGltZSBvcgorIyAgIG1vbmV5LgorIyAtIFBsdXJhbGlzYXRpb24gcHJvYmxlbXMuCisjIC0gSW5jb3JyZWN0IEVuZ2xpc2ggc3BlbGxpbmcuCisjIC0gSW5jb3JyZWN0IGZvcm1hdHRpbmcuCisjIEl0IGNhbiBiZSB5b3VyIGVtYWlsIGFkZHJlc3MsIG9yIGEgbWFpbGluZyBsaXN0IGFkZHJlc3Mgd2hlcmUgdHJhbnNsYXRvcnMKKyMgY2FuIHdyaXRlIHRvIHdpdGhvdXQgYmVpbmcgc3Vic2NyaWJlZCwgb3IgdGhlIFVSTCBvZiBhIHdlYiBwYWdlIHRocm91Z2gKKyMgd2hpY2ggdGhlIHRyYW5zbGF0b3JzIGNhbiBjb250YWN0IHlvdS4KK01TR0lEX0JVR1NfQUREUkVTUyA9IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvCisKKyMgVGhpcyBpcyB0aGUgbGlzdCBvZiBsb2NhbGUgY2F0ZWdvcmllcywgYmV5b25kIExDX01FU1NBR0VTLCBmb3Igd2hpY2ggdGhlCisjIG1lc3NhZ2UgY2F0YWxvZ3Mgc2hhbGwgYmUgdXNlZC4gIEl0IGlzIHVzdWFsbHkgZW1wdHkuCitFWFRSQV9MT0NBTEVfQ0FURUdPUklFUyA9CisKKyMgQXZvaWQgbGluZSBudW1iZXJzIGluICoucG8sIGJ1dCBrZWVwIHRoZW0gaW4gKi5wb3QuCitNU0dNRVJHRSA9IG1zZ21lcmdlIC0tbm8tbG9jYXRpb24KK01TR01FUkdFX1VQREFURSA9IG1zZ21lcmdlIC0tbm8tbG9jYXRpb24gLS11cGRhdGUgLS1iYWNrdXA9b2ZmCitNU0dGSUxURVIgPSBtc2dmaWx0ZXIgLS1uby1sb2NhdGlvbgpkaWZmIC0tZ2l0IGEvcG8vUE9URklMRVMuaW4gYi9wby9QT1RGSUxFUy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTlkZmRlCi0tLSAvZGV2L251bGwKKysrIGIvcG8vUE9URklMRVMuaW4KQEAgLTAsMCArMSwzMiBAQAorZXh0L2ZsYWMvZ3N0ZmxhY2RlYy5jCitleHQvamFjay9nc3RqYWNrYXVkaW9zaW5rLmMKK2V4dC9qYWNrL2dzdGphY2thdWRpb3NyYy5jCitleHQvanBlZy9nc3RqcGVnZGVjLmMKK2V4dC9sYW1lL2dzdGxhbWVtcDNlbmMuYworZXh0L2xpYnBuZy9nc3RwbmdkZWMuYworZXh0L3B1bHNlL3B1bHNlc2luay5jCitleHQvc2hvdXQyL2dzdHNob3V0Mi5jCitleHQvc291cC9nc3Rzb3VwaHR0cHNyYy5jCitleHQvdHdvbGFtZS9nc3R0d29sYW1lbXAyZW5jLmMKK2dzdC9hdWRpb3BhcnNlcnMvZ3N0d2F2cGFja3BhcnNlLmMKK2dzdC9hdmkvZ3N0YXZpZGVtdXguYworZ3N0L2F2aS9nc3RhdmltdXguYworZ3N0L2lzb21wNC9xdGRlbXV4LmMKK2dzdC9tdWx0aWZpbGUvZ3N0c3BsaXRtdXhzcmMuYworZ3N0L3J0c3AvZ3N0cnRzcHNyYy5jCitnc3Qvd2F2cGFyc2UvZ3N0d2F2cGFyc2UuYworc3lzL29zczQvb3NzNC1zaW5rLmMKK3N5cy9vc3M0L29zczQtc291cmNlLmMKK3N5cy9vc3MvZ3N0b3Nzc2luay5jCitzeXMvb3NzL2dzdG9zc3NyYy5jCitzeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9yaW5nYnVmZmVyLmMKK3N5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmMKK3N5cy92NGwyL2dzdHY0bDJvYmplY3QuYworc3lzL3Y0bDIvZ3N0djRsMnJhZGlvLmMKK3N5cy92NGwyL2dzdHY0bDJzaW5rLmMKK3N5cy92NGwyL2dzdHY0bDJzcmMuYworc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5jCitzeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYworc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZW5jLmMKK3N5cy92NGwyL3Y0bDJfY2FsbHMuYworc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYwpkaWZmIC0tZ2l0IGEvcG8vUE9URklMRVMuc2tpcCBiL3BvL1BPVEZJTEVTLnNraXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdmMzBlNQotLS0gL2Rldi9udWxsCisrKyBiL3BvL1BPVEZJTEVTLnNraXAKQEAgLTAsMCArMSw0IEBACitnc3QvZ29vbS9jb252b2x2ZV9meC5jCitnc3QvZ29vbS9tbXguYworZ3N0L2dvb20veG1teC5jCitnc3Qvb2xkY29yZS9nc3RtdWx0aWZpbGVzcmMuYwpkaWZmIC0tZ2l0IGEvcG8vYWYucG8gYi9wby9hZi5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjc1NjUyCi0tLSAvZGV2L251bGwKKysrIGIvcG8vYWYucG8KQEAgLTAsMCArMSw2MjEgQEAKKyMgVHJhbnNsYXRpb24gb2YgZ3N0cmVhbWVyIHBsdWdpbiBtZXNzYWdlcyB0byBBZnJpa2FhbnMuIAorIyBDb3B5cmlnaHQgKEMpIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgZmlsZSBpcyBwdXQgaW4gdGhlIHB1YmxpYyBkb21haW4uCisjIFBldHJpIEpvb3N0ZSA8cmt3anBqQHB1ay5hYy56YT4sIDIwMDQuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucyAwLjcuNlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA0LTAzLTE4IDE0OjE2KzAyMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IFBldHJpIEpvb3N0ZSA8cmt3anBqQHB1ay5hYy56YT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBBZnJpa2FhbnMgPGkxOG5AYWYub3JnLnphPlxuIgorIkxhbmd1YWdlOiBhZlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIiIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiS29uIG5pZSBiZWhlZXJ0b2VzdGVsIFwiJXNcIiB0b2VtYWFrIG5pZS4iCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiS29uIG5pZSBiZWhlZXJ0b2VzdGVsIFwiJXNcIiB0b2VtYWFrIG5pZS4iCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIktvbiBuaWUgYmVoZWVydG9lc3RlbCBcIiVzXCIgdG9lbWFhayBuaWUuIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICIiCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICJHZWVuIG9mIG9uZ2VsZGlnZSBrbGFua3RvZXZvZXIsIEFWSS1zdHJvb20gc2FsIGtvcnJ1cCB3ZWVzLiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiS29uIG5pZSBvdWRpby10b2VzdGVsIFwiJXNcIiBvb3BtYWFrIHZpciBza3J5ZiBuaWUuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICIiCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIktvbiBuaWUgQ0QtdG9lc3RlbCBvb3BtYWFrIG9tIHRlIGxlZXMgbmllLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICJOZWVtIG9wIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWlrcm9mb29uIgorCisjLCBmdXp6eQorbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIkx5bi1pbiIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICIiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICIiCisKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICIiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIlZvbHVtZSIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIiIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIk1vbml0b3IiCisKKyMsIGZ1enp5Cittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiTHVpZHNwcmVrZXIiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIiIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICIiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIktvbiBuaWUgYnVmZmVycyB2YW5hZiB0b2VzdGVsIFwiJXNcIiB2ZXJrcnkgbmllLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiS29uIG5pZSBidWZmZXJzIHZhbmFmIHRvZXN0ZWwgXCIlc1wiIHZlcmtyeSBuaWUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIlRvZXN0ZWwgXCIlc1wiIGlzIG5pZSAnbiB2YXNsZWdnaW5ndG9lc3RlbCBuaWUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiVG9lc3RlbCBcIiVzXCIgaXMgbmllICduIHZhc2xlZ2dpbmd0b2VzdGVsIG5pZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJUb2VzdGVsIFwiJXNcIiBpcyBuaWUgJ24gdmFzbGVnZ2luZ3RvZXN0ZWwgbmllLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiVG9lc3RlbCBcIiVzXCIgaXMgbmllICduIHZhc2xlZ2dpbmd0b2VzdGVsIG5pZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiS29uIG5pZSBidWZmZXJzIHZhbmFmIHRvZXN0ZWwgXCIlc1wiIHZlcmtyeSBuaWUuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS29uIG5pZSBnZW5vZWcgYnVmZmVycyB2YW5hZiB0b2VzdGVsIFwiJXNcIiBrcnkgbmllLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS29uIG5pZSBidWZmZXJzIHZhbmFmIHRvZXN0ZWwgXCIlc1wiIHZlcmtyeSBuaWUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIlRvZXN0ZWwgXCIlc1wiIGlzIG5pZSAnbiB2YXNsZWdnaW5ndG9lc3RlbCBuaWUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIktvbiBuaWUgb3VkaW8tdG9lc3RlbCBcIiVzXCIgdG9lbWFhayBuaWUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIktvbiBuaWUgb3VkaW8tdG9lc3RlbCBcIiVzXCIgdG9lbWFhayBuaWUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS29uIG5pZSBidWZmZXJzIHZhbmFmIHRvZXN0ZWwgXCIlc1wiIHZlcmtyeSBuaWUuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIktvbiBuaWUgZ2Vub2VnIGJ1ZmZlcnMgdmFuYWYgdG9lc3RlbCBcIiVzXCIga3J5IG5pZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS29uIG5pZSBza3J5ZiBuYSB0b2VzdGVsIFwiJXNcIiBuaWUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJLb24gbmllIHRvZXN0ZWwgXCIlc1wiIG9vcG1hYWsgdmlyIGxlZXMgZW4gc2tyeWYgbmllLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJUb2VzdGVsIFwiJXNcIiBpcyBuaWUgJ24gdmFzbGVnZ2luZ3RvZXN0ZWwgbmllLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIlRvZXN0ZWwgXCIlc1wiIGlzIG5pZSAnbiB2YXNsZWdnaW5ndG9lc3RlbCBuaWUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiVG9lc3RlbCBcIiVzXCIgaXMgbmllICduIHZhc2xlZ2dpbmd0b2VzdGVsIG5pZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJLb24gbmllIHRvZXN0ZWwgXCIlc1wiIG9vcG1hYWsgdmlyIGxlZXMgZW4gc2tyeWYgbmllLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIktvbiBuaWUgYnVmZmVycyB2YW5hZiB0b2VzdGVsIFwiJXNcIiB2ZXJrcnkgbmllLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJLb24gbmllIGdlbm9lZyBidWZmZXJzIHZhbmFmIHRvZXN0ZWwgXCIlc1wiIGtyeSBuaWUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJLb24gbmllIGJlaGVlcnRvZXN0ZWwgXCIlc1wiIHRvZW1hYWsgbmllLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIktvbiBuaWUgYmVoZWVydG9lc3RlbCBcIiVzXCIgdG9lbWFhayBuaWUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIktvbiBuaWUgZ2Vub2VnIGJ1ZmZlcnMgdmFuYWYgdG9lc3RlbCBcIiVzXCIga3J5IG5pZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIktvbiBuaWUgb3VkaW8tdG9lc3RlbCBcIiVzXCIgdG9lbWFhayBuaWUuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICIiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBjYXB0dXJlIgorI34gbXNnc3RyICJUb2VzdGVsIFwiJXNcIiBpcyBuaWUgJ24gdmFzbGVnZ2luZ3RvZXN0ZWwgbmllLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIktvbiBuaWUgZ2Vub2VnIGJ1ZmZlcnMgdmFuYWYgdG9lc3RlbCBcIiVzXCIga3J5IG5pZS4iCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICJCYXMiCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgIlRyZWJsZSIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICJTaW50ZXRpc2VlcmRlciIKKworI34gbXNnaWQgIlBDTSIKKyN+IG1zZ3N0ciAiUENNIgorCisjfiBtc2dpZCAiU3BlYWtlciIKKyN+IG1zZ3N0ciAiTHVpZHNwcmVrZXIiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICJMeW4taW4iCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiQ0QiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAiTWVuZ2VyIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICJOZWVtIG9wIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAiSW4tdmVyc3RlcmtpbmciCisKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAiVWl0LXZlcnN0ZXJraW5nIgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICJMeW4tMSIKKworI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAiTHluLTIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIkx5bi0zIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICJEaWdpdGFhbC0xIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICJEaWdpdGFhbC0yIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICJEaWdpdGFhbC0zIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIlRlbGVmb29uLWluIgorCisjfiBtc2dpZCAiUGhvbmUtb3V0IgorI34gbXNnc3RyICJUZWxlZm9vbi11aXQiCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAiVmlkZW8iCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAiUmFkaW8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiS29uIG5pZSBvdWRpby10b2VzdGVsIFwiJXNcIiBvb3BtYWFrIHZpciBza3J5ZiBuaWUuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIk5lZW0gb3AiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAiVmlkZW8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgIlZpZGVvIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlJlY29yZCBHYWluIgorI34gbXNnc3RyICJOZWVtIG9wIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICJVaXQtdmVyc3RlcmtpbmciCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiTWlrcm9mb29uIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1vbml0b3IgU291cmNlIgorI34gbXNnc3RyICJNb25pdG9yIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAiTWlrcm9mb29uIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICJMdWlkc3ByZWtlciIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTWlrcm9mb29uIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAiTWlrcm9mb29uIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiTWlrcm9mb29uIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICJEaWdpdGFhbC0xIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgIkRpZ2l0YWFsLTEiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTWljcm9waG9uZSIKKyN+IG1zZ3N0ciAiTWlrcm9mb29uIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkNvdWxkIG5vdCBlbnF1ZXVlIGJ1ZmZlcnMgaW4gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJLb24gbmllIGJ1ZmZlcnMgdmFuYWYgdG9lc3RlbCBcIiVzXCIgdmVya3J5IG5pZS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBmaWxlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisjfiBtc2dzdHIgIktvbiBuaWUgbMOqZXIgXCIlc1wiIG9vcG1hYWsgb20gaW4gdGUgc2tyeWYgbmllLiIKKworI34gbXNnaWQgIkVycm9yIGNsb3NpbmcgZmlsZSBcIiVzXCIuIgorI34gbXNnc3RyICJGb3V0IHR5ZGVucyB0b2VtYWFrIHZhbiBsw6plciBcIiVzXCIuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gZmlsZSBcIiVzXCIgZm9yIHJlYWRpbmcuIgorI34gbXNnc3RyICJLb24gbmllIGzDqmVyIFwiJXNcIiBvb3BtYWFrIG9tIHRlIGxlZXMgbmllLiIKKworI34gbXNnaWQgIk5vIGZpbGVuYW1lIHNwZWNpZmllZC4iCisjfiBtc2dzdHIgIkdlZW4gbMOqZXJuYWFtIGdlc3Blc2lmaXNlZXIuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgXCIlc1wiLiIKKyN+IG1zZ3N0ciAiS29uIG5pZSBza3J5ZiBuYSBsw6plciBcIiVzXCIgbmllLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGNvbnRyb2wgZGV2aWNlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisjfiBtc2dzdHIgIktvbiBuaWUgYmVoZWVydG9lc3RlbCBcIiVzXCIgb29wbWFhayB2aXIgc2tyeWYgbmllLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBjb25maWd1cmUgYXVkaW8gZGV2aWNlIFwiJXNcIi4iCisjfiBtc2dzdHIgIktvbiBuaWUgb3VkaW8tdG9lc3RlbCBcIiVzXCIga29uZmlndXJlZXIgbmllLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBzZXQgYXVkaW8gZGV2aWNlIFwiJXNcIiB0byAlZCBIei4iCisjfiBtc2dzdHIgIktvbiBuaWUga2xhbmt0b2VzdGVsIFwiJXNcIiB2ZXJzdGVsIG5hICVkIEh6IG5pZS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiB2aWRlbyBkZXZpY2UgXCIlc1wiIGZvciB3cml0aW5nLiIKKyN+IG1zZ3N0ciAiS29uIG5pZSB2aWRlby10b2VzdGVsIFwiJXNcIiBvb3BtYWFrIHZpciBza3J5ZiBuaWUuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGNsb3NlIHZpZGVvIGRldmljZSBcIiVzXCIuIgorI34gbXNnc3RyICJLb24gbmllIHZpZGVvLXRvZXN0ZWwgXCIlc1wiIHRvZW1hYWsgbmllLiIKKworI34gbXNnaWQgIk9TUyBkZXZpY2UgXCIlc1wiIGlzIGFscmVhZHkgaW4gdXNlIGJ5IGFub3RoZXIgcHJvZ3JhbS4iCisjfiBtc2dzdHIgIk9TUy10b2VzdGVsIFwiJXNcIiBpcyByZWVkcyBpbiBnZWJydWlrIGRldXIgJ24gYW5kZXIgcHJvZ3JhbS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgYWNjZXNzIGRldmljZSBcIiVzXCIsIGNoZWNrIGl0cyBwZXJtaXNzaW9ucy4iCisjfiBtc2dzdHIgIktvbiBuaWUgdG9lZ2FuZyBrcnkgdG90IHRvZXN0ZWwgXCIlc1wiIG5pZSwga3lrIG5hIHRvZWdhbmdzcmVndGUuIgorCisjfiBtc2dpZCAiRGV2aWNlIFwiJXNcIiBkb2VzIG5vdCBleGlzdC4iCisjfiBtc2dzdHIgIlRvZXN0ZWwgXCIlc1wiIGJlc3RhYW4gbmllLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSBcIiVzXCIgZm9yIHdyaXRpbmcuIgorI34gbXNnc3RyICJLb24gbmllIHRvZXN0ZWwgXCIlc1wiIG9vcG1hYWsgdmlyIHNrcnlmIG5pZS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgXCIlc1wiIGZvciByZWFkaW5nLiIKKyN+IG1zZ3N0ciAiS29uIG5pZSB0b2VzdGVsIFwiJXNcIiBvb3BtYWFrIHZpciBsZWVzIG5pZS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiB2ZnMgZmlsZSBcIiVzXCIgZm9yIHJlYWRpbmcuIgorI34gbXNnc3RyICJLb24gbmllIHZmcy1sw6plciBcIiVzXCIgb29wbWFhayB2aXIgbGVlcyBuaWUuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk5vIGZpbGVuYW1lIGdpdmVuLiIKKyN+IG1zZ3N0ciAiR2VlbiBsw6plcm5hYW0gZ2VzcGVzaWZpc2Vlci4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gdmZzIGZpbGUgXCIlc1wiIGZvciB3cml0aW5nOiAlcy4iCisjfiBtc2dzdHIgIktvbiBuaWUgdmZzLWzDqmVyIFwiJXNcIiBvb3BtYWFrIHZpciBza3J5ZiBuaWUuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk5vIGZpbGVuYW1lIGdpdmVuIgorI34gbXNnc3RyICJHZWVuIGzDqmVybmFhbSBnZXNwZXNpZmlzZWVyLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBjbG9zZSB2ZnMgZmlsZSBcIiVzXCIuIgorI34gbXNnc3RyICJLb24gbmllIHZmcy1sw6plciBcIiVzXCIgdG9lbWFhayBuaWUuIgorCisjfiBtc2dpZCAiTm8gZGV2aWNlIHNwZWNpZmllZC4iCisjfiBtc2dzdHIgIkdlZW4gdG9lc3RlbCBnZXNwZXNpZmlzZWVyIgorCisjfiBtc2dpZCAiRGV2aWNlIGlzIG5vdCBvcGVuLiIKKyN+IG1zZ3N0ciAiVG9lc3RlbCBpcyBuaWUgb29wIG5pZS4iCisKKyN+IG1zZ2lkICJEZXZpY2UgaXMgb3Blbi4iCisjfiBtc2dzdHIgIlRvZXN0ZWwgaXMgb29wLiIKZGlmZiAtLWdpdCBhL3BvL2F6LnBvIGIvcG8vYXoucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiYTRlOAotLS0gL2Rldi9udWxsCisrKyBiL3BvL2F6LnBvCkBAIC0wLDAgKzEsNjIyIEBACisjIFRyYW5zbGF0aW9uIG9mICdnc3QtcGx1Z2lucycgbWVzc2FnZXMgdG8gQXplcmJhaWphbmkuCisjIENvcHlyaWdodCAoQykgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIHB1dCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMgTcmZdGluIMaPbWlyb3YgPG1ldGluQGthcmVnZW4uY29tPiwgMjAwNC4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLTAuOC4wXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDQtMDMtMTkgMTg6MjkrMDIwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogTWV0aW4gQW1pcm9mZiA8bWV0aW5Aa2FyZWdlbi5jb20+XG4iCisiTGFuZ3VhZ2UtVGVhbTogQXplcmJhaWphbmkgPHRyYW5zbGF0aW9uLXRlYW0tYXpAbGlzdHMuc291cmNlZm9yZ2UubmV0PlxuIgorIkxhbmd1YWdlOiBhelxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlgtR2VuZXJhdG9yOiBLQmFiZWwgMS4wLjJcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICIiCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIlwiJXNcIiBpZGFyyZkgYXZhZGFubMSxxJ/EsSBiYcSfbGFuYSBiaWxtyZlkaS4iCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiXCIlc1wiIGlkYXLJmSBhdmFkYW5sxLHEn8SxIGJhxJ9sYW5hIGJpbG3JmWRpLiIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiXCIlc1wiIGlkYXLJmSBhdmFkYW5sxLHEn8SxIGJhxJ9sYW5hIGJpbG3JmWRpLiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiU8mZaHYgeWEgZGEgb2xtYXlhbiBhdWRpbyBnaXJpxZ9pLCBBVkkgeWF5xLFtxLEgcG96dWxhY2FxZMSxci4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIlwiJXNcIiBhdWRpbyBhdmFkYW5sxLHEn8SxIHlhem1hIMO8w6fDvG4gYcOnxLFsYSBiaWxtyZlkaS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICIiCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiQ0QgYXZhZGFubMSxxJ/EsSBveHVtYSDDvMOnw7xuIGHDp8SxbGEgYmlsbcmZZGkuIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIlFleWQiCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWtyb2ZvbiIKKworIywgZnV6enkKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJYyZl0ZC1naXJpxZ8iCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIiIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJTyZlzIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiTW9uaXRvciIKKworIywgZnV6enkKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJTcGlrZXIiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIiIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICIiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlwiJXNcIiBhdmFkYW5sxLHEn8SxbmRhbiBidWZmZXJsyZlyIGFsxLFuYSBiaWxtyZlkaS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIlwiJXNcIiBhdmFkYW5sxLHEn8SxbmRhbiBidWZmZXJsyZlyIGFsxLFuYSBiaWxtyZlkaS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiXCIlc1wiIGF2YWRhbmzEscSfxLEgY2FwdHVyZSBhdmFkYW5sxLHEn8SxIGRleWlsLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIlwiJXNcIiBhdmFkYW5sxLHEn8SxIGNhcHR1cmUgYXZhZGFubMSxxJ/EsSBkZXlpbC4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsSBjYXB0dXJlIGF2YWRhbmzEscSfxLEgZGV5aWwuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsSBjYXB0dXJlIGF2YWRhbmzEscSfxLEgZGV5aWwuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIlwiJXNcIiBhdmFkYW5sxLHEn8SxbmRhbiBidWZmZXJsyZlyIGFsxLFuYSBiaWxtyZlkaS4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICIiCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsW5kYW4ga2lmYXnJmXQgccmZZMmZciBidWZmZXJsyZlyIGFsxLFuYSBiaWxtyZlkaS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlwiJXNcIiBhdmFkYW5sxLHEn8SxbmRhbiBidWZmZXJsyZlyIGFsxLFuYSBiaWxtyZlkaS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiXCIlc1wiIGF2YWRhbmzEscSfxLEgY2FwdHVyZSBhdmFkYW5sxLHEn8SxIGRleWlsLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJcIiVzXCIgYXVkaW8gYXZhZGFubMSxxJ/EsSBiYcSfbGFuYSBiaWxtyZlkaS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiXCIlc1wiIGF1ZGlvIGF2YWRhbmzEscSfxLEgYmHEn2xhbmEgYmlsbcmZZGkuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiXCIlc1wiIGF2YWRhbmzEscSfxLFuZGFuIGJ1ZmZlcmzJmXIgYWzEsW5hIGJpbG3JmWRpLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsW5kYW4ga2lmYXnJmXQgccmZZMmZciBidWZmZXJsyZlyIGFsxLFuYSBiaWxtyZlkaS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiXCIlc1wiIGF2YWRhbmzEscSfxLFuYSB5YXrEsWxhIGJpbG3JmWRpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiXCIlc1wiIGF2YWRhbmzEscSfxLEgb3h1bWEgdsmZIHlhem1hIMO8w6fDvG4gYcOnxLFsYSBiaWxtyZlkaS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiXCIlc1wiIGF2YWRhbmzEscSfxLEgY2FwdHVyZSBhdmFkYW5sxLHEn8SxIGRleWlsLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIlwiJXNcIiBhdmFkYW5sxLHEn8SxIGNhcHR1cmUgYXZhZGFubMSxxJ/EsSBkZXlpbC4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsSBjYXB0dXJlIGF2YWRhbmzEscSfxLEgZGV5aWwuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiXCIlc1wiIGF2YWRhbmzEscSfxLEgb3h1bWEgdsmZIHlhem1hIMO8w6fDvG4gYcOnxLFsYSBiaWxtyZlkaS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsW5kYW4gYnVmZmVybMmZciBhbMSxbmEgYmlsbcmZZGkuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlwiJXNcIiBhdmFkYW5sxLHEn8SxbmRhbiBraWZhecmZdCBxyZlkyZlyIGJ1ZmZlcmzJmXIgYWzEsW5hIGJpbG3JmWRpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiXCIlc1wiIGlkYXLJmSBhdmFkYW5sxLHEn8SxIGJhxJ9sYW5hIGJpbG3JmWRpLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlwiJXNcIiBpZGFyyZkgYXZhZGFubMSxxJ/EsSBiYcSfbGFuYSBiaWxtyZlkaS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiXCIlc1wiIGF2YWRhbmzEscSfxLFuZGFuIGtpZmF5yZl0IHHJmWTJmXIgYnVmZmVybMmZciBhbMSxbmEgYmlsbcmZZGkuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJcIiVzXCIgYXVkaW8gYXZhZGFubMSxxJ/EsSBiYcSfbGFuYSBiaWxtyZlkaS4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIlwiJXNcIiBhdmFkYW5sxLHEn8SxIGNhcHR1cmUgYXZhZGFubMSxxJ/EsSBkZXlpbC4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsW5kYW4ga2lmYXnJmXQgccmZZMmZciBidWZmZXJsyZlyIGFsxLFuYSBiaWxtyZlkaS4iCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICJCYXMiCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgIsSwbmPJmSIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICJTaW50IgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJTcGlrZXIiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICJYyZl0ZC1naXJpxZ8iCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiQ0QiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAiTWlrc2VyIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICJRZXlkIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAiR2lyacWfLWdhaW4iCisKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAiw4fEsXjEscWfLWdhaW4iCisKKyN+IG1zZ2lkICJMaW5lLTEiCisjfiBtc2dzdHIgIljJmXRkLTEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIljJmXRkLTIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIljJmXRkLTMiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTEiCisjfiBtc2dzdHIgIkRpaml0YWwtMSIKKworI34gbXNnaWQgIkRpZ2l0YWwtMiIKKyN+IG1zZ3N0ciAiRGlqaXRhbC0yIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICJEaWppdGFsLTMiCisKKyN+IG1zZ2lkICJQaG9uZS1pbiIKKyN+IG1zZ3N0ciAiVGVsZWZvbi1naXJpxZ9pIgorCisjfiBtc2dpZCAiUGhvbmUtb3V0IgorI34gbXNnc3RyICJUZWxlZm9uLcOnxLF4xLHFn8SxIgorCisjfiBtc2dpZCAiVmlkZW8iCisjfiBtc2dzdHIgIlZpZGVvIgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgIlJhZGlvIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIlwiJXNcIiBhdWRpbyBhdmFkYW5sxLHEn8SxIHlhem1hIMO8w6fDvG4gYcOnxLFsYSBiaWxtyZlkaS4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAiUWV5ZCIKKworIywgZnV6enkKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICJWaWRlbyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAiVmlkZW8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIlFleWQiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiT3V0cHV0IEdhaW4iCisjfiBtc2dzdHIgIsOHxLF4xLHFny1nYWluIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgQm9vc3QiCisjfiBtc2dzdHIgIk1pa3JvZm9uIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1vbml0b3IgU291cmNlIgorI34gbXNnc3RyICJNb25pdG9yIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAiTWlrcm9mb24iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiU3BlYWtlciBTb3VyY2UiCisjfiBtc2dzdHIgIlNwaWtlciIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTWlrcm9mb24iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICJNaWtyb2ZvbiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDIiCisjfiBtc2dzdHIgIk1pa3JvZm9uIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICJEaWppdGFsLTEiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAiRGlqaXRhbC0xIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIk1pa3JvZm9uIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkNvdWxkIG5vdCBlbnF1ZXVlIGJ1ZmZlcnMgaW4gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsW5kYW4gYnVmZmVybMmZciBhbMSxbmEgYmlsbcmZZGkuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gZmlsZSBcIiVzXCIgZm9yIHdyaXRpbmcuIgorI34gbXNnc3RyICJcIiVzXCIgZmF5bMSxIHlhem1hIMO8w6fDvG4gYcOnxLFsYSBiaWxtyZlkaS4iCisKKyN+IG1zZ2lkICJFcnJvciBjbG9zaW5nIGZpbGUgXCIlc1wiLiIKKyN+IG1zZ3N0ciAiXCIlc1wiIGZheWzEsSBiYcSfbGFuYSBiaWxtyZlkaS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBmaWxlIFwiJXNcIiBmb3IgcmVhZGluZy4iCisjfiBtc2dzdHIgIlwiJXNcIiBmYXlsxLEgb3h1bWEgw7zDp8O8biBhw6fEsWxhIGJpbG3JmWRpLiIKKworI34gbXNnaWQgIk5vIGZpbGVuYW1lIHNwZWNpZmllZC4iCisjfiBtc2dzdHIgIkZheWwgYWTEsSB2ZXJpbG3JmXlpYi4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSBcIiVzXCIuIgorI34gbXNnc3RyICJcIiVzXCIgZmF5bMSxbmEgeWF6xLFsYSBiaWxtyZlkaS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBjb250cm9sIGRldmljZSBcIiVzXCIgZm9yIHdyaXRpbmcuIgorI34gbXNnc3RyICJcIiVzXCIgaWRhcsmZIGF2YWRhbmzEscSfxLEgeWF6bWEgw7zDp8O8biBhw6fEsWxhIGJpbG3JmWRpLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBjb25maWd1cmUgYXVkaW8gZGV2aWNlIFwiJXNcIi4iCisjfiBtc2dzdHIgIlwiJXNcIiBhdWRpbyBhdmFkYW5sxLHEn8SxIHF1cmHFn2TEsXLEsWxhIGJpbG3JmWRpLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBzZXQgYXVkaW8gZGV2aWNlIFwiJXNcIiB0byAlZCBIei4iCisjfiBtc2dzdHIgIlwiJXNcIiBhdWRpbyBhdmFkYW5sxLHEn8SxICVkIEh6LcmZIGtlw6dpcmlsyZkgYmlsbcmZZGkuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gdmlkZW8gZGV2aWNlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisjfiBtc2dzdHIgIlwiJXNcIiB2aWRlbyBhdmFkYW5sxLHEn8SxIHlhem1hIMO8w6fDvG4gYcOnxLFsYSBiaWxtyZlkaS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgY2xvc2UgdmlkZW8gZGV2aWNlIFwiJXNcIi4iCisjfiBtc2dzdHIgIlwiJXNcIiB2aWRlbyBhdmFkYW5sxLHEn8SxIGJhxJ9sYW5hIGJpbG3JmWRpLiIKKworI34gbXNnaWQgIk9TUyBkZXZpY2UgXCIlc1wiIGlzIGFscmVhZHkgaW4gdXNlIGJ5IGFub3RoZXIgcHJvZ3JhbS4iCisjfiBtc2dzdHIgIlwiJXNcIiBPU1MgYXZhZGFubMSxxJ/EsSBiYcWfcWEgYmlyIHByb3FyYW0gdMmZcsmZZmluZMmZbiBpc3RpZmFkyZlkyZlkaXIuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGFjY2VzcyBkZXZpY2UgXCIlc1wiLCBjaGVjayBpdHMgcGVybWlzc2lvbnMuIgorI34gbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsW5hIHlldGnFn8mZIGJpbG3JmWRpLCBzyZlsYWhpeXnJmXRsyZlyaW5pIHlveGxhecSxbi4iCisKKyN+IG1zZ2lkICJEZXZpY2UgXCIlc1wiIGRvZXMgbm90IGV4aXN0LiIKKyN+IG1zZ3N0ciAiXCIlc1wiIGF2YWRhbmzEscSfxLEgbcO2dmN1ZCBkZXlpbC4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgXCIlc1wiIGZvciB3cml0aW5nLiIKKyN+IG1zZ3N0ciAiXCIlc1wiIGF2YWRhbmzEscSfxLEgeWF6bWEgw7zDp8O8biBhw6fEsWxhIGJpbG3JmWRpLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSBcIiVzXCIgZm9yIHJlYWRpbmcuIgorI34gbXNnc3RyICJcIiVzXCIgYXZhZGFubMSxxJ/EsSBveHVtYSDDvMOnw7xuIGHDp8SxbGEgYmlsbcmZZGkuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gdmZzIGZpbGUgXCIlc1wiIGZvciByZWFkaW5nLiIKKyN+IG1zZ3N0ciAiXCIlc1wiIHZmcyBmYXlsxLEgb3h1bWEgw7zDp8O8biBhw6fEsWxhIGJpbG3JmWRpLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJObyBmaWxlbmFtZSBnaXZlbi4iCisjfiBtc2dzdHIgIkZheWwgYWTEsSB2ZXJpbG3JmXlpYi4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gdmZzIGZpbGUgXCIlc1wiIGZvciB3cml0aW5nOiAlcy4iCisjfiBtc2dzdHIgIlwiJXNcIiB2ZnMgZmF5bMSxIHlhem1hIMO8w6fDvG4gYcOnxLFsYSBiaWxtyZlkaS4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTm8gZmlsZW5hbWUgZ2l2ZW4iCisjfiBtc2dzdHIgIkZheWwgYWTEsSB2ZXJpbG3JmXlpYi4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgY2xvc2UgdmZzIGZpbGUgXCIlc1wiLiIKKyN+IG1zZ3N0ciAiXCIlc1wiIHZmcyBmYXlsxLEgYmHEn2xhbmEgYmlsbcmZZGkuIgorCisjfiBtc2dpZCAiTm8gZGV2aWNlIHNwZWNpZmllZC4iCisjfiBtc2dzdHIgIkF2YWRhbmzEsXEgYmlsZGlyaWxtyZl5aWIuIgorCisjfiBtc2dpZCAiRGV2aWNlIGlzIG5vdCBvcGVuLiIKKyN+IG1zZ3N0ciAiQXZhZGFubMSxcSBhw6fEsXEgZGV5aWwuIgorCisjfiBtc2dpZCAiRGV2aWNlIGlzIG9wZW4uIgorI34gbXNnc3RyICJBdmFkYW5sxLFxIGHDp8SxcWTEsXIuIgpkaWZmIC0tZ2l0IGEvcG8vYmcucG8gYi9wby9iZy5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2E0NWNmCi0tLSAvZGV2L251bGwKKysrIGIvcG8vYmcucG8KQEAgLTAsMCArMSw0MzEgQEAKKyMgQnVsZ2FyaWFuIHRyYW5zbGF0aW9uIG9mIGdzdC1wbHVnaW5zLWdvb2QuCisjIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdzdC1wbHVnaW5zLWdvb2QgcGFja2FnZS4KKyMgQWxleGFuZGVyIFNob3BvdiA8YXNoQGthbWJhbmFyaWEub3JnPiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxNi4KKyMKKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QgMS43LjJcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxNi0wMi0yMSAyMTowMyswMjAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBBbGV4YW5kZXIgU2hvcG92IDxhc2hAa2FtYmFuYXJpYS5vcmc+XG4iCisiTGFuZ3VhZ2UtVGVhbTogQnVsZ2FyaWFuIDxkaWN0QGx1ZG9zdC5uZXQ+XG4iCisiTGFuZ3VhZ2U6IGJnXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0yOyBwbHVyYWw9biAhPSAxO1xuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICLQodGK0YDQstGK0YDRitGCIEphY2sg0L3QtSDQtSDQvtGC0LrRgNC40YIuIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICLQndC10YPRgdC/0LXRiNC90L4g0LTQtdC60L7QtNC40YDQsNC90LUg0L3QsCDQuNC30L7QsdGA0LDQttC10L3QuNC1LCDRhNC+0YDQvNCw0YIgSlBFRy4iCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIuKAniVz4oCcINC+0YIg4oCeJXPigJwiCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgItCd0LUg0LzQvtC20LUg0LTQsCDRgdC1INC+0YHRitGJ0LXRgdGC0LLQuCDQstGA0YrQt9C60LAg0LrRitC8INGB0YrRgNCy0YrRgC4iCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAi0J3QtSDQtSDQt9Cw0LTQsNC00LXQvSDQsNC00YDQtdGBLiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAi0KHRitGA0LLRitGA0YrRgiDQvdC1INC80L7QttC1INC00LAg0YHQtSDQvtGC0LrRgNC40LUg0L/QviDQuNC80LUuIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgItCd0LUg0LzQvtC20LUg0LTQsCDRgdC1INC+0YHRitGJ0LXRgdGC0LLQuCDQstGA0YrQt9C60LAg0LrRitC8INGB0YrRgNCy0YrRgNCwLiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgItCd0LXRg9GB0L/QtdGI0L3QviDQvtGB0YrRidC10YHRgtCy0Y/QstCw0L3QtSDQvdCwINGI0LjRhNGA0LjRgNCw0L3QsCDQstGA0YrQt9C60LAuIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAi0JLRitC30L3QuNC60L3QsCDQvNGA0LXQttC+0LLQsCDQs9GA0LXRiNC60LAg0LjQu9C4INGB0YrRgNCy0YrRgNGK0YIg0L3QtdC+0YfQsNC60LLQsNC90L4g0L/RgNC10LrRitGB0L3QsCDQstGA0YrQt9C60LDRgtCwLiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAi0KHRitGA0LLRitGA0YrRgiDQuNC30L/RgNCw0YLQuCDQu9C+0YjQuCDQtNCw0L3QvdC4LiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICLQodGK0YDQstGK0YDRitGCINC90LUg0L/QvtC00LTRitGA0LbQsCDRgtGK0YDRgdC10L3QtS4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgItCQ0YPQtNC40L4g0LLRhdC+0LTRitGCINC70LjQv9GB0LLQsCDQuNC70Lgg0LUg0LPRgNC10YjQtdC9LiDQn9C+0YLQvtC60YrRgiDRgSBBVkkg0YnQtSDQsdGK0LTQtSDQv9C+0LLRgNC10LTQtdC9LiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAi0KLQvtC30Lgg0YTQsNC50Lsg0L3QtSDRgdGK0LTRitGA0LbQsCDQuNC30L/RitC70L3QuNC80Lgg0L/QvtGC0L7RhtC4LiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAi0KLQvtC30Lgg0YTQsNC50Lsg0LUg0L/QvtCy0YDQtdC00LXQvSDQuCDQvdC1INC80L7QttC1INC00LAg0LHRitC00LUg0LjQt9C/0YrQu9C90LXQvS4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAi0J/QvtGC0L7QutGK0YIg0L3QtSDQvNC+0LbQtSDQtNCwINGB0LUg0LjQt9C/0YrQu9C90LgsINC30LDRidC+0YLQviDQtSDRiNC40YTRgNC40YDQsNC9INGBIFBsYXlSZWFkeSBEUk0uIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICLQotC+0LfQuCDRhNCw0LnQuyDQtSDQv9C+0LLRgNC10LTQtdC9INC4INC90LUg0LzQvtC20LUg0LTQsCDQsdGK0LTQtSDQuNC30L/RitC70L3QtdC9LiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAi0J3QtdC/0YDQsNCy0LjQu9C10L0g0YDQsNC30LzQtdGAINC90LAg0LDRgtC+0LwuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICLQotC+0LfQuCDRhNCw0LnQuyDQtSDQvdC10L/RitC70LXQvSDQuCDQvdC1INC80L7QttC1INC00LAg0LHRitC00LUg0LjQt9C/0YrQu9C90LXQvS4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgItCS0LjQtNC10L4g0L/QvtGC0L7QutGK0YIg0LIg0YLQvtC30Lgg0YTQsNC50Lsg0LzQvtC20LUg0LTQsCDQvdC1INGB0LUg0L/QvtC60LDQttC1INC/0YDQsNCy0LjQu9C90L4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIiIKKyLQotC+0LfQuCDRhNCw0LnQuyDRgdGK0LTRitGA0LbQsCDQv9GA0LXQutCw0LvQtdC90L4g0LzQvdC+0LPQviDQv9C+0YLQvtGG0LguINCY0LfQv9GK0LvQvdGP0LLQsNGCINGB0LUg0YHQsNC80L4g0L/RitGA0LLQuNGC0LUgJWQiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorItCd0LUg0LUg0L7RgtC60YDQuNGCINC/0L7QtNC00YrRgNC20LDQvSDQv9C+0YLQvtC6LiDQnNC+0LbQtSDQtNCwINGC0YDRj9Cx0LLQsCDQtNCwINC40L3RgdGC0LDQu9C40YDQsNGC0LUg0L/RgNC40YHRgtCw0LLQutCw0YLQsCDQvdCwICIKKyJHU3RyZWFtZXIg4oCUIFJUU1AsINC60L7QudGC0L4g0L/QvtC00LTRitGA0LbQsCDQv9C+0YLQvtGG0Lgg0L3QsCBSZWFsLiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorItCd0LUg0LUg0L7RgtC60YDQuNGCINC/0L7QtNC00YrRgNC20LDQvSDQv9C+0YLQvtC6LiDQnNC+0LbQtSDQsdC4INGC0YDRj9Cx0LLQsCDQtNCwINGA0LDQt9GA0LXRiNC40YLQtSDQv9C+0LLQtdGH0LUg0YLRgNCw0L3RgdC/0L7RgNGC0L3QuCAiCisi0L/RgNC+0YLQvtC60L7Qu9C4INC40LvQuCDQstC4INC70LjQv9GB0LLQsCDQv9GA0LDQstC40LvQvdCw0YLQsCDQv9GA0LjRgdGC0LDQstC60LAg0L3QsCBHU3RyZWFtZXIg0LfQsCBSVFNQLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyLQkNGD0LTQuNC+INGD0YHRgtGA0L7QudGB0YLQstC+0YLQviDQvdC1INC80L7QttC1INC00LAg0YHQtSDQvtGC0LLQvtGA0Lgg0LfQsCDQuNC30L/RitC70L3QtdC90LjQtSwg0LjQt9C/0L7Qu9C30LLQsCDRgdC1INC+0YIg0LTRgNGD0LPQviAiCisi0L/RgNC40LvQvtC20LXQvdC40LUuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyLQkNGD0LTQuNC+INGD0YHRgtGA0L7QudGB0YLQstC+0YLQviDQvdC1INC80L7QttC1INC00LAg0YHQtSDQvtGC0LLQvtGA0Lgg0LfQsCDQuNC30L/RitC70L3QtdC90LjQtSwg0L3Rj9C80LDRgtC1INC/0YDQsNCy0LAg0LfQsCDRgtC+0LLQsC4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAi0KPRgdGC0YDQvtC50YHRgtCy0L7RgtC+INC90LUg0LzQvtC20LUg0LTQsCDRgdC1INC+0YLQstC+0YDQuCDQt9CwINC40LfQv9GK0LvQvdC10L3QuNC1LiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyLQkNGD0LTQuNC+INGD0YHRgtGA0L7QudGB0YLQstC+0YLQviDQvdC1INC80L7QttC1INC00LAg0YHQtSDQvtGC0LLQvtGA0Lgg0LfQsCDQuNC30L/RitC70L3QtdC90LjQtS4g0JXQu9C10LzQtdC90YLRitGCINC90LUg0L/QvtC00LTRitGA0LbQsCAiCisi0YLQsNC30Lgg0LLQtdGA0YHQuNGPINC90LAgT1NTLiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLQotC+0LLQsCDQsNGD0LTQuNC+INGD0YHRgtGA0L7QudGB0YLQstC+INC90LUg0L/QvtC00LTRitGA0LbQsCDQuNC30L/RitC70L3QtdC90LjQtS4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgItCT0YDQtdGI0LrQsCDQv9GA0Lgg0LjQt9C/0YrQu9C90LXQvdC40LUg0L3QsCDQsNGD0LTQuNC+0YLQvi4iCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgItCi0L7QstCwINCw0YPQtNC40L4g0YPRgdGC0YDQvtC50YHRgtCy0L4g0L3QtSDQv9C+0LTQtNGK0YDQttCwINC30LDQv9C40YEuIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAi0JPRgNC10YjQutCwINC/0YDQuCDQt9Cw0L/QuNGB0LAg0L7RgiDQsNGD0LTQuNC+INGD0YHRgtGA0L7QudGB0YLQstC+0YLQvi4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyLQkNGD0LTQuNC+INGD0YHRgtGA0L7QudGB0YLQstC+0YLQviDQvdC1INC80L7QttC1INC00LAg0YHQtSDQvtGC0LLQvtGA0Lgg0LfQsCDQt9Cw0L/QuNGBLCDQvdGP0LzQsNGC0LUg0L/RgNCw0LLQsCDQt9CwINGC0L7QstCwLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAi0JDRg9C00LjQviDRg9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g0L3QtSDQvNC+0LbQtSDQtNCwINGB0LUg0L7RgtCy0L7RgNC4INC30LAg0LfQsNC/0LjRgS4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAi0KPRgdGC0YDQvtC50YHRgtCy0L7RgtC+IENvcmVBdWRpbyDQvdC1INC1INC+0YLQutGA0LjRgtC+IgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4gQ29yZUF1ZGlvINC90LUg0LzQvtC20LUg0LTQsCDRgdC1INC+0YLQstC+0YDQuCIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgItCY0LfRgtC+0YfQvdC40Log0LfQsCDQt9Cw0L/QuNGBIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAi0JzQuNC60YDQvtGE0L7QvSIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgItCS0YXQvtC0IgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgItCS0YrRgtGA0LXRiNC90L4gQ0QiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAi0JLRhdC+0LQgU1BESUYiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAi0JLRhdC+0LQgQVVYIDEiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAi0JLRhdC+0LQgQVVYIDIiCisKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAi0J7QsdGA0LDRgtC90LAg0LLRgNGK0LfQutCwINC90LAg0LrQvtC00LXQutCwIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICLQntCx0YDQsNGC0L3QsCDQstGA0YrQt9C60LAg0L3QsCBTdW5WVFMiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgItCh0LjQu9CwINC90LAg0LfQstGD0LrQsCIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgItCj0YHQuNC70LLQsNC90LUiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICLQnNC+0L3QuNGC0L7RgCIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgItCS0LPRgNCw0LTQtdC9INCy0LjRgdC+0LrQvtCz0L7QstC+0YDQuNGC0LXQuyIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAi0KHQu9GD0YjQsNC70LrQuCIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICLQmNC30YXQvtC0IgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICLQmNC30YXQvtC0IFNQRElGIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICLQmNC30YXQvtC0IEFVWCAxIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICLQmNC30YXQvtC0IEFVWCAyIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCT0YDQtdGI0LrQsCDQv9GA0Lgg0L/RgNC+0YfQuNGC0LDQvdC1ICVkINCx0LDQudGC0LAg0L7RgiDRg9GB0YLRgNC+0LnRgdGC0LLQviDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKyLQndC10YPRgdC/0LXRiNC90L4g0LjQt9Cx0YDQvtGP0LLQsNC90LUg0L3QsCDQv9C+0LTQtNGK0YDQttCw0L3QuNGC0LUg0L7RgiDRg9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g4oCeJXPigJwg0LLQuNC00LXQviDRhNC+0YDQvNCw0YLQuCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAi0J3QtSDQvNC+0LPQsNGCINC00LAg0YHQtSDQv9C+0LvRg9GH0LDRgiDQsdGD0YTQtdGA0LjRgtC1INC+0YIg0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+IOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAi0JTRgNCw0LnQstC10YDRitGCINC30LAg0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+IOKAniVz4oCcINC90LUg0L/QvtC00LTRitGA0LbQsCDQv9C+0LfQvdCw0YLQuCDQvNC10YLQvtC00LAg0LfQsCDQki/QmCAlZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgItCU0YDQsNC50LLQtdGA0YrRgiDQt9CwINGD0YHRgtGA0L7QudGB0YLQstC+0YLQviDigJ4lc+KAnCDQvdC1INC/0L7QtNC00YrRgNC20LAg0L/QvtC30L3QsNGCINC80LXRgtC+0LQg0LfQsCDQki/QmC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAi0KPRgdGC0YDQvtC50YHRgtCy0L7RgtC+IOKAniVz4oCcINC1INC30LDQtdGC0L4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgItCj0YHRgtGA0L7QudGB0YLQstC+0YLQviDigJ4lc+KAnCDQvdC1INC80L7QttC1INC00LAg0LfQsNC/0LjRgdCy0LAg0YEg0YDQsNC30LTQtdC70LjRgtC10LvQvdCwINGB0L/QvtGB0L7QsdC90L7RgdGCICVkw5clZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAi0KPRgdGC0YDQvtC50YHRgtCy0L7RgtC+IOKAniVz4oCcINC90LUg0LzQvtC20LUg0LTQsCDQt9Cw0L/QuNGB0LLQsCDQsiDRg9C60LDQt9Cw0L3QuNGPINGE0L7RgNC80LDRgi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAi0KPRgdGC0YDQvtC50YHRgtCy0L7RgtC+IOKAniVz4oCcINC90LUg0L/QvtC00LTRitGA0LbQsCDQvdC10YHRitGB0LXQtNC90Lgg0YDQsNCy0L3QuNC90LgiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICLQndC1INC80L7Qs9Cw0YIg0LTQsCDRgdC1INC/0L7Qu9GD0YfQsNGCINC/0LDRgNCw0LzQtdGC0YDQuNGC0LUg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g4oCeJXPigJwuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICIiCisi0KPRgdGC0YDQvtC50YHRgtCy0L7RgtC+INC30LAg0LLQuNC00LXQviDQvdC1INC/0YDQuNC10LzQsCDQvdC+0LLQuNGC0LUg0L3QsNGB0YLRgNC+0LnQutC4INC30LAg0YfQtdGB0YLQvtGC0LDRgtCwINC90LAg0LrQsNC00YDQuC4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICLQktC40LTQtdC+INGD0YHRgtGA0L7QudGB0YLQstC+0YLQviDQvdC1INGD0LrQsNC30LLQsCDRhNC+0YDQvNCw0YIuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgItCS0LjQtNC10L4g0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+INCy0YrRgNC90LAg0L3QtdC/0YDQsNCy0LjQu9C90Lgg0YDQsNC30LzQtdGA0LgiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAi0JLQuNC00LXQviDRg9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g0LjQt9C/0L7Qu9C30LLQsCDQvdC10L/QvtC00LTRitGA0LbQsNC90LAg0L/RgNC10LfRgNC10LTQvtCy0LAg0YDQsNC30LLQuNCy0LrQsC4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAi0JLQuNC00LXQviDRg9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g0LjQt9C/0L7Qu9C30LLQsCDQvdC10L/QvtC00LTRitGA0LbQsNC9INGE0L7RgNC80LDRgiDQvdCwINC/0LjQutGB0LXQu9C40YLQtS4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAi0J3QtdGD0YHQv9C10YjQvdC+INC90LDRgdGC0YDQvtC50LLQsNC90LUg0L3QsCDQstGK0YLRgNC10YjQvdC40YLQtSDQsdGD0YTQtdGA0LguIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICLQktC40LTQtdC+INGD0YHRgtGA0L7QudGB0YLQstC+0YLQviDQvdC1INGD0LrQsNC30LLQsCDRgNCw0LfQvNC10YAg0L3QsCDQsdGD0YTQtdGA0LAuIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAi0J3Rj9C80LAg0LHRg9GE0LXRgNC4LCDQutC+0LjRgtC+INC00LAg0YHQtSDQstC90LXRgdCw0YIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLQndC10YPRgdC/0LXRiNC90L4g0L/QvtC70YPRh9Cw0LLQsNC90LUg0L3QsCDQvdCw0YHRgtGA0L7QudC60LjRgtC1INC90LAg0YLRg9C90LXRgCAlZCDQvdCwINGD0YHRgtGA0L7QudGB0YLQstC+IOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLQk9GA0LXRiNC60LAg0L/RgNC4INC/0L7Qu9GD0YfQsNCy0LDQvdC1INC90LAg0LLRitC30LzQvtC20L3QvtGB0YLQuNGC0LUg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQviDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g4oCeJXPigJwg0L3QtSDQtSDRgtGD0L3QtdGALiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgItCd0LXRg9GB0L/QtdGI0L3QviDQv9C+0LvRg9GH0LDQstCw0L3QtSDQvdCwINGA0LDQtNC40L4g0LLRhdC+0LTQsCDQvdCwINGD0YHRgtGA0L7QudGB0YLQstC+IOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgItCd0LXRg9GB0L/QtdGI0L3QviDQt9Cw0LTQsNCy0LDQvdC1INC90LAg0LLRhdC+0LQgJWQg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQviDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LXRg9GB0L/QtdGI0L3QsCDRgdC80Y/QvdCwINC90LAg0LfQsNCz0LvRg9GI0LDQstCw0L3QtdGC0L4g0YPRgdGC0YDQvtC50YHRgtCy0L4g4oCeJXPigJwuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICLQndC10YPRgdC/0LXRiNC90L4g0LfQsNC00LXQu9GP0L3QtSDQvdCwINC90LXQvtCx0YXQvtC00LjQvNCw0YLQsCDQv9Cw0LzQtdGCLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICLQndC10YPRgdC/0LXRiNC90L4g0LfQsNC00LXQu9GP0L3QtSDQvdCwINC90LXQvtCx0YXQvtC00LjQvNCw0YLQsCDQv9Cw0LzQtdGCLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICLQmtC+0L3QstC10YDRgtC+0YDRitGCINC90LAg0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+IOKAniVz4oCcINC90LUg0L/QvtC00LTRitGA0LbQsCDQv9C+0LfQvdCw0YLQuCDQvNC10YLQvtC0INC30LAg0LLRhdC+0LQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICLQmtC+0L3QstC10YDRgtC+0YDRitGCINC90LAg0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+IOKAniVz4oCcINC90LUg0L/QvtC00LTRitGA0LbQsCDQv9C+0LfQvdCw0YLQuCDQvNC10YLQvtC0INC30LAg0LjQt9GF0L7QtC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgItCa0L7QtNC10YDRitGCINGD0YHRgtGA0L7QudGB0YLQstC+0YLQviDigJ4lc+KAnCDQvdC1INC/0L7QtNC00YrRgNC20LAg0L/QvtC30L3QsNGC0Lgg0LzQtdGC0L7QtCDQt9CwINCy0YXQvtC0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgItCa0L7QtNC10YDRitGCINC90LAg0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+IOKAniVz4oCcINC90LUg0L/QvtC00LTRitGA0LbQsCDQv9C+0LfQvdCw0YLQuCDQvNC10YLQvtC0INC30LAg0LjQt9GF0L7QtC4iCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAi0J3QtdGD0YHQv9C10YjQvdC+INGB0YLQsNGA0YLQuNGA0LDQvdC1INC90LAg0L3QuNGI0LrQsNGC0LAg0LfQsCDQtNC10LrQvtC00LjRgNCw0L3QtS4iCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgItCd0LXRg9GB0L/QtdGI0L3QsCDQvtCx0YDQsNCx0L7RgtC60LAg0L3QsCDQutCw0LTRitGALiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyLQk9GA0LXRiNC60LAg0L/RgNC4INC/0L7Qu9GD0YfQsNCy0LDQvdC10YLQviDQvdCwINCy0YrQt9C80L7QttC90L7RgdGC0LjRgtC1INC90LAg0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+IOKAniVz4oCcOiDQvdC1INC1INC00YDQsNC50LLQtdGAICIKKyJ2NGwyLiDQn9GA0L7QstC10YDQtdGC0LUg0LTQsNC70Lgg0LLRgdGK0YnQvdC+0YHRgiDQvdC1INC1INC00YDQsNC50LLQtdGAIHY0bDEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAi0J3QtdGD0YHQv9C10YjQvdC+INC30LDQv9C40YLQstCw0L3QtSDQt9CwINCw0YLRgNC40LHRg9GC0LjRgtC1INC30LAg0LLRhdC+0LQgJWQg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQviDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J3QtdGD0YHQv9C10YjQvdC+INC/0L7Qu9GD0YfQsNCy0LDQvdC1INC90LAg0L3QsNGB0YLRgNC+0LnQutC40YLQtSDQvdCwINGC0YPQvdC10YAgJWQg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQviDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICLQndC10YPRgdC/0LXRiNC90L4g0LfQsNC/0LjRgtCy0LDQvdC1INC30LAg0L3QvtGA0LzQsNGC0LAg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQviDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LXRg9GB0L/QtdGI0L3QviDQv9C+0LvRg9GH0LDQstCw0L3QtSDQvdCwINC60L7QvdGC0YDQvtC70L3QuNGC0LUg0LDRgtGA0LjQsdGD0YLQuCDQvdCwINGD0YHRgtGA0L7QudGB0YLQstC+0YLQviDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0KPRgdGC0YDQvtC50YHRgtCy0L7RgtC+IOKAniVz4oCcINC90LUg0LzQvtC20LUg0LTQsCDRgdC1INC40LTQtdC90YLQuNGE0LjRhtC40YDQsC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi4oCeJXPigJwg0L3QtSDQtSDRg9GB0YLRgNC+0LnRgdGC0LLQvi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g4oCeJXPigJwg0L3QtSDQvNC+0LbQtSDQtNCwINGB0LUg0L7RgtCy0L7RgNC4INC30LAg0YfQtdGC0LXQvdC1INC4INC30LDQv9C40YEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAi0KPRgdGC0YDQvtC50YHRgtCy0L7RgtC+IOKAniVz4oCcINC90LUg0LUg0YPRgdGC0YDQvtC50YHRgtCy0L4g0LfQsCDQt9Cw0L/QuNGBLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAi0KPRgdGC0YDQvtC50YHRgtCy0L7RgtC+IOKAniVz4oCcINC90LUg0LUg0LjQt9GF0L7QtNC90L4g0YPRgdGC0YDQvtC50YHRgtCy0L4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g4oCeJXPigJwg0L3QtSDQtSBNMk0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQvtGC0L4g4oCeJXPigJwg0L3QtSDQvNC+0LbQtSDQtNCwINGB0LUg0LTRg9C/0LvQtdC60YHQuNGA0LAg0LfQsCDRh9C10YLQtdC90LUg0Lgg0LfQsNC/0LjRgS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LXRg9GB0L/QtdGI0L3QviDQt9Cw0LTQsNCy0LDQvdC1INC90LAg0L3QvtGA0LzQsNGC0LAg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQviDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisi0J3QtdGD0YHQv9C10YjQvdC+INC/0L7Qu9GD0YfQsNCy0LDQvdC1INC90LAg0YLQtdC60YPRidCw0YLQsCDQvdCw0YHRgtGA0L7QudC60LAg0L3QsCDRh9C10YHRgtC+0YLQsNGC0LAg0LfQsCDRg9GB0YLRgNC+0LnRgdGC0LLQviDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorItCd0LXRg9GB0L/QtdGI0L3QviDQt9Cw0LTQsNCy0LDQvdC1INC90LAg0YLQtdC60YPRidCw0YLQsCDQvdCw0YHRgtGA0L7QudC60LAg0L3QsCDRh9C10YHRgtC+0YLQsNGC0LAg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQviDigJ4lc+KAnCDQtNCwICIKKyLQtSAlbHUgSHouIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LXRg9GB0L/QtdGI0L3QviDQv9C+0LvRg9GH0LDQstCw0L3QtSDQvdCwINGB0LjQu9Cw0YLQsCDQvdCwINGB0LjQs9C90LDQu9CwINC90LAg0YPRgdGC0YDQvtC50YHRgtCy0L4g4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLQndC10YPRgdC/0LXRiNC90L4g0L/QvtC70YPRh9Cw0LLQsNC90LUg0L3QsCDRgdGC0L7QudC90L7RgdGC0YLQsCDQvdCwINC60L7QvdGC0YDQvtC7ICVkINC90LAg0YPRgdGC0YDQvtC50YHRgtCy0L4g4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLQndC10YPRgdC/0LXRiNC90L4g0LfQsNC00LDQstCw0L3QtSDQvdCwINGB0YLQvtC50L3QvtGB0YLRgtCwICVkINC90LAg0LrQvtC90YLRgNC+0LsgJWQg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQviDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyLQndC10YPRgdC/0LXRiNC90L4g0L/QvtC70YPRh9Cw0LLQsNC90LUg0L3QsCDRgtC10LrRg9GJ0LjRjyDQstGF0L7QtCDQvdCwINGD0YHRgtGA0L7QudGB0YLQstC+IOKAniVz4oCcLiDQnNC+0LbQtSDQsdC4INC1INGA0LDQtNC40L4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyLQndC10YPRgdC/0LXRiNC90L4g0L/QvtC70YPRh9Cw0LLQsNC90LUg0L3QsCDRgtC10LrRg9GJ0LjRjyDQuNC30YXQvtC0INC90LAg0YPRgdGC0YDQvtC50YHRgtCy0L4g4oCeJXPigJwuINCc0L7QttC1INCx0Lgg0LUg0YDQsNC00LjQvi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAi0J3QtdGD0YHQv9C10YjQvdC+INC30LDQtNCw0LLQsNC90LUg0L3QsCDQuNC30YXQvtC0ICVkINC90LAg0YPRgdGC0YDQvtC50YHRgtCy0L4g4oCeJXPigJwuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiIgorItCf0YDQvtC80Y/QvdCw0YLQsCDQvdCwINGA0LDQt9C00LXQu9C40YLQtdC70L3QsNGC0LAg0YHQv9C+0YHQvtCx0L3QvtGB0YIg0L/QviDQstGA0LXQvNC1INC90LAg0YDQsNCx0L7RgtCwINCy0YHQtSDQvtGJ0LUg0L3QtSDRgdC1ICIKKyLQv9C+0LTQtNGK0YDQttCwLiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAi0KDQsNCx0L7RgtCw0YLQsCDQsdC10Lcg0YfQsNGB0L7QstC90LjQuiDQtSDQvdC10LLRitC30LzQvtC20L3QsC4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgItCS0YrRgtGA0LXRiNC90LAg0LPRgNC10YjQutCwINC90LAg0L/QvtGC0L7QutCwINC+0YIg0LTQsNC90L3QuC4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICLQktGK0YLRgNC10YjQvdCwINCz0YDQtdGI0LrQsCDQsiDQv9C+0YLQvtC60LAg0YEg0LTQsNC90L3QuC4iCmRpZmYgLS1naXQgYS9wby9jYS5wbyBiL3BvL2NhLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMmM3NTMKLS0tIC9kZXYvbnVsbAorKysgYi9wby9jYS5wbwpAQCAtMCwwICsxLDkzNSBAQAorIyBDYXRhbGFuIHRyYW5zbGF0aW9uIG9mIGdzdC1wbHVnaW5zLWdvb2QKKyMgQ29weXJpZ2h0IMKpIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgZmlsZSBpcyBwdXQgaW4gdGhlIHB1YmxpYyBkb21haW4uCisjIEpvcmRpIE1hbGxhY2ggPGpvcmRpQHNpbmRvbWluaW8ubmV0PiwgMjAwNS4KKyMgSm9yZGkgRXN0cmFkYSA8am9yZGkuZXN0cmFkYUB5YW1haGEtbW90b3IuZXM+LCAyMDExLgorIyBHaWwgRm9yY2FkYSA8Z2ZvcmNhZGFAZ25vbWUub3JnPiwgMjAxMi4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QgMC4xMC4yOC4yXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTItMDEtMDEgMTQ6MTkrMDEwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogR2lsIEZvcmNhZGEgPGdmb3JjYWRhQGdub21lLm9yZz5cbiIKKyJMYW5ndWFnZS1UZWFtOiBDYXRhbGFuIDxjYUBkb2Rkcy5uZXQ+XG4iCisiTGFuZ3VhZ2U6IGNhXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0yOyBwbHVyYWw9biAhPSAxO1xuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIkhhIGZhbGxhdCBlbiBkZXNjb2RpZmljYXIgbGEgaW1hdGdlIEpQRUciCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIsKrJXPCuyBwZXIgwqslc8K7IgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJObyBzJ2hhIHBvZ3V0IGNvbm5lY3RhciBhbCBzZXJ2aWRvciIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJObyBzJ2hhIGluZGljYXQgY2FwIFVSTC4iCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIk5vIHMnaGEgcG9ndXQgcmVzb2xkcmUgZWwgbm9tIGRlbCBzZXJ2aWRvci4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiTm8gcydoYSBwb2d1dCBlc3RhYmxpciBsYSBjb25uZXhpw7MgYWwgc2Vydmlkb3IuIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiSGEgZmFsbGF0IGxhIGNvbmZpZ3VyYWNpw7MgZGUgY29ubmV4acOzIHNlZ3VyYS4iCisKKyMsIGZ1enp5Cittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorIlMnaGEgcHJvZHXDr3QgdW4gZXJyb3IgZGUgeGFyeGEsIG8gZWwgc2Vydmlkb3IgaGEgdGFuY2F0IGxhIGNvbm5leGnDsyAiCisiaW5lc3BlcmFkYW1lbnQuIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICJFbCBzZXJ2aWRvciBoYSBlbnZpYXQgZGFkZXMgZXJyw7JuaWVzLiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICJFbCBzZXJ2aWRvciBubyBhZGVtZXQgbGVzIGNlcnF1ZXMuIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICJNYW5jYSBvIG5vIMOpcyB2w6BsaWRhIGwnZW50cmFkYSBkJ8OgdWRpbywgZWwgZmx1eCBBVkkgZXN0YXLDoCBtYWxtw6hzLiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAiQXF1ZXN0IGZpdHhlciBubyBjb250w6kgY2FwIGZsdXggcmVwcm9kdcOvYmxlLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiQXF1ZXN0IGZpdHhlciBubyDDqXMgdsOgbGlkIGkgbm8gZXMgcG90IHJlcHJvZHVpci4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJBcXVlc3QgZml0eGVyIGVzdMOgIG1hbG3DqHMgaSBubyBlcyBwb3QgcmVwcm9kdWlyLiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiTGEgbWlkYSBkZSBsJ8OgdG9tIG5vIMOpcyB2w6BsaWRhLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiQXF1ZXN0IGZpdHhlciBubyBlc3TDoCBjb21wbGV0IGkgbm8gZXMgcG90IHJlcHJvZHVpci4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIkVsIHbDrWRlbyBlbiBhcXVlc3QgZml0eGVyIHBvZHJpYSBubyByZXByb2R1aXItc2UgY29ycmVjdGFtZW50LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICIiCisiQXF1ZXN0IGZpdHhlciBjb250w6kgbWFzc2EgZmx1eG9zLiBOb23DqXMgcydlc3RhbiByZXByb2R1aW50IGVscyBwcmltZXJzICVkIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJObyBzJ2hhIHRyb2JhdCBjYXAgZmx1eCBjb21wYXRpYmxlLiBQb2Ryw61ldSBuZWNlc3NpdGFyIGluc3RhbMK3bGFyIHVuICIKKyJjb25uZWN0b3IgZCdleHRlbnNpw7MgUlRTUCBkZWwgR1N0cmVhbWVyIHBlciBhIGZsdXhvcyBkZSBtdWx0aW3DqGRpYSBSZWFsLiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorIk5vIHMnaGEgdHJvYmF0IGNhcCBmbHV4IGNvbXBhdGlibGUuIFBvZHLDrWV1IG5lY2Vzc2l0YXIgcGVybWV0cmUgbcOpcyAiCisicHJvdG9jb2xzIGRlIHRyYW5zcG9ydCBvIGLDqSBwb3RzZXIgbWFuY2EgZWwgY29ubmVjdG9yIGQnZXh0ZW5zacOzIFJUU1AgZGVsICIKKyJHU3RyZWFtZXIgY29ycmVjdGUuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIk5vIHMnaGEgcG9ndXQgb2JyaXIgZWwgZGlzcG9zaXRpdSBkJ8OgdWRpbyBwZXIgYSBsYSByZXByb2R1Y2Npw7MuIFVuYSBhbHRyYSAiCisiYXBsaWNhY2nDsyBlc3TDoCB1dGlsaXR6YW50IGVsIGRpc3Bvc2l0aXUuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJObyBzJ2hhIHBvZ3V0IG9icmlyIGVsIGRpc3Bvc2l0aXUgZCfDoHVkaW8gcGVyIGEgbGEgcmVwcm9kdWNjacOzLiBObyB0ZW5pdSAiCisicGVybcOtcyBwZXIgb2JyaXIgZWwgZGlzcG9zaXRpdS4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiTm8gcydoYSBwb2d1dCBvYnJpciBlbCBkaXNwb3NpdGl1IGQnYcyAdWRpbyBwZXIgYSBsYSByZXByb2R1Y2Npw7MuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIk5vIHMnaGEgcG9ndXQgb2JyaXIgZWwgZGlzcG9zaXRpdSBkJ2HMgHVkaW8gcGVyIGEgbGEgcmVwcm9kdWNjacOzLiBBcXVlc3RhICIKKyJ2ZXJzaW/MgSBkZSBsJ09wZW4gU291bmQgU3lzdGVtIG5vIGXMgXMgY29tcGF0aWJsZSBhbWIgYXF1ZXN0IGVsZW1lbnQuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkFxdWVzdCBkaXNwb3NpdGl1IGQnw6B1ZGlvIG5vIHBlcm1ldCBsYSByZXByb2R1Y2Npw7MuIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICJTJ2hhIHByb2R1w690IHVuIGVycm9yIGFsIHJlcHJvZHVpciBsJ8OgdWRpby4iCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkFxdWVzdCBkaXNwb3NpdGl1IGQnw6B1ZGlvIG5vIHBlcm1ldCBsJ2VucmVnaXN0cmFtZW50LiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIlMnaGEgcHJvZHXDr3QgdW4gZXJyb3IgYSBsJ2VucmVnaXN0cmFyIGRlcyBkZWwgZGlzcG9zaXRpdSBkJ8OgdWRpby4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJObyBzJ2hhIHBvZ3V0IG9icmlyIGVsIGRpc3Bvc2l0aXUgZCdhzIB1ZGlvIHBlciBhIGwnZW5yZWdpc3RyYW1lbnQuIE5vIHRlbml1ICIKKyJwZXJtacyBcyBwZXIgb2JyaXIgZWwgZGlzcG9zaXRpdS4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIk5vIHMnaGEgcG9ndXQgb2JyaXIgZWwgZGlzcG9zaXRpdSBkJ2HMgHVkaW8gcGVyIGEgbCdlbnJlZ2lzdHJhbWVudC4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICIiCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICJGb250IGQnZW5yZWdpc3RyYW1lbnQiCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWNyw7Jmb24iCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJMw61uaWEgZCdlbnRyYWRhIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIkNEIGludGVybiIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJFbnRyYWRhIFNQRElGIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIkVudHJhZGEgQVVYIDEiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiRW50cmFkYSBBVVggMiIKKworIywgZnV6enkKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiQnVjbGUgbG9jYWwiCisKKyMsIGZ1enp5Cittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJCdWNsZSBsb2NhbCIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiVm9sdW0iCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJHdWFueSIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIk1vbml0b3IiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJBbHRhdmV1IGluY29ycG9yYXQiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIkF1cmljdWxhcnMiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiTMOtbmlhIGRlIHNvcnRpZGEiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNvcnRpZGEgU1BESUYiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIlNvcnRpZGEgQVVYIDEiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIlNvcnRpZGEgQVVYIDIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiUydoYSBwcm9kdcOvdCB1biBlcnJvciBhbCBsbGVnaXIgJWQgYnl0ZXMgZGVzIGRlbCBkaXNwb3NpdGl1IMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTm8gcydoYW4gcG9ndXQgbWFwZWphciBsZXMgbWVtw7JyaWVzIGludGVybcOoZGllcyBkZWwgZGlzcG9zaXRpdSDCqyVzwrsiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICIiCisiRWwgY29udHJvbGFkb3IgZGVsIGRpc3Bvc2l0aXUgwqslc8K7IG5vIMOpcyBjb21wYXRpYmxlIGFtYiBjYXAgbcOodG9kZSBkZSAiCisiY2FwdHVyYSBjb25lZ3V0LiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICIiCisiRWwgY29udHJvbGFkb3IgZGVsIGRpc3Bvc2l0aXUgwqslc8K7IG5vIMOpcyBjb21wYXRpYmxlIGFtYiBjYXAgbcOodG9kZSBkZSAiCisiY2FwdHVyYSBjb25lZ3V0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJFbCBkaXNwb3NpdGl1IMKrJXPCuyBubyDDqXMgdW4gZGlzcG9zaXRpdSBkZSBjYXB0dXJhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIkVsIGRpc3Bvc2l0aXUgwqslc8K7IG5vIMOpcyB1biBkaXNwb3NpdGl1IGRlIGNhcHR1cmEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICJFbCBkaXNwb3NpdGl1IMKrJXPCuyBubyDDqXMgdW4gZGlzcG9zaXRpdSBkZSBzb3J0aWRhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIk5vIHMnaGFuIHBvZ3V0IG9idGVuaXIgZWxzIHBhcsOgbWV0cmVzIGRlbCBkaXNwb3NpdGl1IMKrJXPCuyIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIiIKKyJFbCBkaXNwb3NpdGl1IGQnZW50cmFkYSBkZSB2w61kZW8gbm8gaGEgYWNjZXB0YXQgZWwgcGFyw6BtZXRyZSBub3UgZGUgIgorImZvdG9ncmFtZXMgcGVyIHNlZ29uLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICIiCisiRWwgZGlzcG9zaXRpdSBkJ2VudHJhZGEgZGUgdsOtZGVvIG5vIGhhIGFjY2VwdGF0IGVsIHBhcsOgbWV0cmUgbm91IGRlICIKKyJmb3RvZ3JhbWVzIHBlciBzZWdvbi4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIiIKKyJFbCBjb250cm9sYWRvciBkZWwgZGlzcG9zaXRpdSDCqyVzwrsgbm8gw6lzIGNvbXBhdGlibGUgYW1iIGNhcCBtw6h0b2RlIGRlICIKKyJjYXB0dXJhIGNvbmVndXQuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIiIKKyJFbCBjb250cm9sYWRvciBkZWwgZGlzcG9zaXRpdSDCqyVzwrsgbm8gw6lzIGNvbXBhdGlibGUgYW1iIGNhcCBtw6h0b2RlIGRlICIKKyJjYXB0dXJhIGNvbmVndXQuIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIiIKKyJFbCBkaXNwb3NpdGl1IGQnZW50cmFkYSBkZSB2w61kZW8gbm8gaGEgYWNjZXB0YXQgZWwgcGFyw6BtZXRyZSBub3UgZGUgIgorImZvdG9ncmFtZXMgcGVyIHNlZ29uLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJObyBzJ2hhbiBwb2d1dCBvYnRlbmlyIGVscyBwYXLDoG1ldHJlcyBkZWwgc2ludG9uaXR6YWRvciAlZCBlbiBlbCBkaXNwb3NpdGl1ICIKKyLCqyVzwrsuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJTJ2hhIHByb2R1w690IHVuIGVycm9yIGFsIGxsZWdpciAlZCBieXRlcyBkZXMgZGVsIGRpc3Bvc2l0aXUgwqslc8K7LiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJFbCBkaXNwb3NpdGl1IMKrJXPCuyBubyDDqXMgdW4gZGlzcG9zaXRpdSBkZSBzb3J0aWRhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJObyBzJ2hhIHBvZ3V0IGVzdGFibGlyIGwnZW50cmFkYSAlZCBlbiBlbCBkaXNwb3NpdGl1ICVzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIk5vIHMnaGEgcG9ndXQgZXN0YWJsaXIgbCdlbnRyYWRhICVkIGVuIGVsIGRpc3Bvc2l0aXUgJXMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTm8gcydoYSBwb2d1dCBvYnRlbmlyIGxhIGludGVuc2l0YXQgZGVsIHNlbnlhbCBwZXIgYWwgZGlzcG9zaXRpdSDCqyVzwrsuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisiRWwgY29udHJvbGFkb3IgZGVsIGRpc3Bvc2l0aXUgwqslc8K7IG5vIMOpcyBjb21wYXRpYmxlIGFtYiBjYXAgbcOodG9kZSBkZSAiCisiY2FwdHVyYSBjb25lZ3V0LiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJFbCBkaXNwb3NpdGl1IGQnZW50cmFkYSBkZSB2w61kZW8gbm8gaGEgYWNjZXB0YXQgZWwgcGFyw6BtZXRyZSBub3UgZGUgIgorImZvdG9ncmFtZXMgcGVyIHNlZ29uLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJFbCBkaXNwb3NpdGl1IGQnZW50cmFkYSBkZSB2w61kZW8gbm8gaGEgYWNjZXB0YXQgZWwgcGFyw6BtZXRyZSBub3UgZGUgIgorImZvdG9ncmFtZXMgcGVyIHNlZ29uLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisiRWwgZGlzcG9zaXRpdSBkJ2VudHJhZGEgZGUgdsOtZGVvIG5vIGhhIGFjY2VwdGF0IGVsIHBhcsOgbWV0cmUgbm91IGRlICIKKyJmb3RvZ3JhbWVzIHBlciBzZWdvbi4iCisKKyMsIGZ1enp5Cittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIkhhIGZhbGxhdCBlbiBkZXNjb2RpZmljYXIgbGEgaW1hdGdlIEpQRUciCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJTJ2hhIHByb2R1w690IHVuIGVycm9yIGVuIG9idGVuaXIgbGVzIGNhcGFjaXRhdHMgZGVsIGRpc3Bvc2l0aXUgwqslc8K7OiBubyDDqXMgIgorInVuIGNvbnRyb2xhZG9yIHY0bDIuIENvbXByb3ZldSBzaSDDqXMgdW4gY29udHJvbGFkb3IgdjRsMS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICIiCisiUydoYSBwcm9kdcOvdCB1biBlcnJvciBlbiBjb25zdWx0YXIgZWxzIGF0cmlidXRzIGRlIGwnZW50cmFkYSAlZCBlbiBlbCAiCisiZGlzcG9zaXRpdSAlcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiTm8gcydoYW4gcG9ndXQgb2J0ZW5pciBlbHMgcGFyw6BtZXRyZXMgZGVsIHNpbnRvbml0emFkb3IgJWQgZW4gZWwgZGlzcG9zaXRpdSAiCisiwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlMnaGEgcHJvZHXDr3QgdW4gZXJyb3IgZW4gY29uc3VsdGFyIGxhIG5vcm1hIGVuIGVsIGRpc3Bvc2l0aXUgwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIk5vIHMnaGEgcG9ndXQgb2J0ZW5pciBlbHMgYXRyaWJ1dHMgZGVscyBjb250cm9scyBlbiBlbCBkaXNwb3NpdGl1IMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTm8gZXMgcG90IGlkZW50aWZpY2FyIGVsIGRpc3Bvc2l0aXUgwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJBaXjDsiBubyDDqXMgdW4gZGlzcG9zaXRpdSDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiTm8gcydoYSBwb2d1dCBvYnJpciBlbCBkaXNwb3NpdGl1IMKrJXPCuyBwZXIgYSBsZWN0dXJhIGkgbCdlc2NyaXB0dXJhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIkVsIGRpc3Bvc2l0aXUgwqslc8K7IG5vIMOpcyB1biBkaXNwb3NpdGl1IGRlIGNhcHR1cmEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJFbCBkaXNwb3NpdGl1IMKrJXPCuyBubyDDqXMgdW4gZGlzcG9zaXRpdSBkZSBzb3J0aWRhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIkVsIGRpc3Bvc2l0aXUgwqslc8K7IG5vIMOpcyB1biBkaXNwb3NpdGl1IGRlIHNvcnRpZGEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiTm8gcydoYSBwb2d1dCBvYnJpciBlbCBkaXNwb3NpdGl1IMKrJXPCuyBwZXIgYSBsZWN0dXJhIGkgbCdlc2NyaXB0dXJhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTm8gcydoYSBwb2d1dCBlc3RhYmxpciBsYSBub3JtYSBwZXIgYWwgZGlzcG9zaXRpdSDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIk5vIHMnaGEgcG9ndXQgb2J0ZW5pciBsYSBmcmVxw7zDqG5jaWEgYWN0dWFsIGRlbCBzaW50b25pdHphZG9yIHBlciBhbCAiCisiZGlzcG9zaXRpdSDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIiIKKyJObyBzJ2hhIHBvZ3V0IGVzdGFibGlyIGxhIGZyZXHDvMOobmNpYSBhY3R1YWwgZGVsIHNpbnRvbml0emFkb3IgcGVyIGFsICIKKyJkaXNwb3NpdGl1IMKrJXPCuyBhICVsdSBIei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTm8gcydoYSBwb2d1dCBvYnRlbmlyIGxhIGludGVuc2l0YXQgZGVsIHNlbnlhbCBwZXIgYWwgZGlzcG9zaXRpdSDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiTm8gcydoYSBwb2d1dCBvYnRlbmlyIGVsIHZhbG9yIHBlciBhbCBjb250cm9sICVkIGVuIGVsIGRpc3Bvc2l0aXUgwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIk5vIHMnaGEgcG9ndXQgZXN0YWJsaXIgZWwgdmFsb3IgJWQgcGVyIGFsIGNvbnRyb2wgJWQgZW4gZWwgZGlzcG9zaXRpdSDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiTm8gcydoYSBwb2d1dCBvYnRlbmlyIGwnZW50cmFkYSBhY3R1YWwgZW4gZWwgZGlzcG9zaXRpdSDCqyVzwrsuIFBvdHNlciDDqXMgdW4gIgorImRpc3Bvc2l0aXUgZGUgcsOgZGlvIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJObyBzJ2hhIHBvZ3V0IG9idGVuaXIgbGEgc29ydGlkYSBhY3R1YWwgZW4gZWwgZGlzcG9zaXRpdSDCqyVzwrsuIFBvdHNlciDDqXMgdW4gIgorImRpc3Bvc2l0aXUgZGUgcsOgZGlvIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIk5vIHMnaGEgcG9ndXQgZXN0YWJsaXIgbGEgc29ydGlkYSAlZCBlbiBlbCBkaXNwb3NpdGl1ICVzLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIkVuY2FyYSBubyBlcyBwZXJtZXQgZWwgY2FudmkgZGUgbGEgcmVzb2x1Y2nDsyBlbiB0ZW1wcyBkJ2V4ZWN1Y2nDsy4iCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIk5vIGVzIHBvdCBvcGVyYXIgc2Vuc2UgdW4gcmVsbG90Z2UiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIlMnaGEgcHJvZHXDr3QgdW4gZXJyb3IgaW50ZXJuIGRlIGZsdXggZGUgZGFkZXMuIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAiUydoYSBwcm9kdcOvdCB1biBlcnJvciBpbnRlcm4gZGUgZmx1eCBkZSBkYWRlcy4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBjYXB0dXJlIgorI34gbXNnc3RyICJFbCBkaXNwb3NpdGl1IMKrJXPCuyBubyDDqXMgdW4gZGlzcG9zaXRpdSBkZSBzb3J0aWRhLiIKKworI34gbXNnaWQgIkdvdCB1bmV4cGVjdGVkIGZyYW1lIHNpemUgb2YgJXUgaW5zdGVhZCBvZiAldS4iCisjfiBtc2dzdHIgIlMnaGEgb2J0aW5ndXQgdW5hIG1pZGEgZGUgZm90b2dyYW1hIGluZXNwZXJhZGEgZGUgJXUgZW4gbGxvYyBkZSAldS4iCisKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIiIKKyN+ICJTJ2hhIHByb2R1w690IHVuIGVycm9yIGVuIHByb3ZhciBkJ29idGVuaXIgZm90b2dyYW1lcyBkZSB2w61kZW8gZGVzIGRlbCAiCisjfiAiZGlzcG9zaXRpdSDCqyVzwrsuIgorCisjfiBtc2dpZCAiRmFpbGVkIGFmdGVyICVkIHRyaWVzLiBkZXZpY2UgJXMuIHN5c3RlbSBlcnJvcjogJXMiCisjfiBtc2dzdHIgIiIKKyN+ICJIYSBmYWxsYXQgZGVzcHLDqXMgZGUgJWQgaW50ZW50cy4gRGlzcG9zaXRpdSAlcy4gRXJyb3IgZGUgc2lzdGVtYTogJXMiCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICJCYWl4b3MiCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgIkFndXRzIgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIlNpbnRldGl0emFkb3IiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIlBDTSIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIkFsdGF2ZXUiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICJMw61uaWEgZCdlbnRyYWRhIgorCisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgIkNEIgorCisjfiBtc2dpZCAiTWl4ZXIiCisjfiBtc2dzdHIgIk1lc2NsYWRvciIKKworI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICJQQ00tMiIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAiRW5yZWdpc3RyYW1lbnQiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICJHdWFueSBkJ2VudHJhZGEiCisKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAiR3VhbnkgZGUgc29ydGlkYSIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAiTMOtbmlhLTEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIkzDrW5pYS0yIgorCisjfiBtc2dpZCAiTGluZS0zIgorI34gbXNnc3RyICJMw61uaWEtMyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAiRGlnaXRhbC0xIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICJEaWdpdGFsLTIiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIkRpZ2l0YWwtMyIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICJFbnRyYWRhIGRlbCB0ZWzDqGZvbiIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAiU29ydGlkYSBkZWwgdGVsw6hmb24iCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAiVsOtZGVvIgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgIlLDoGRpbyIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIiIKKyN+ICJObyBzJ2hhIHBvZ3V0IG9icmlyIGVsIGRpc3Bvc2l0aXUgZCfDoHVkaW8gcGVyIGEgbGEgZ2VzdGnDsyBkZWwgY29udHJvbCBkZWwgIgorI34gIm1lc2NsYWRvci4iCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJObyBzJ2hhIHBvZ3V0IG9icmlyIGVsIGRpc3Bvc2l0aXUgZCfDoHVkaW8gcGVyIGEgbGEgZ2VzdGnDsyBkZWwgY29udHJvbCBkZWwgIgorI34gIm1lc2NsYWRvci4gQXF1ZXN0YSB2ZXJzacOzIGRlIGwnT3BlbiBTb3VuZCBTeXN0ZW0gbm8gw6lzIGNvbXBhdGlibGUgYW1iICIKKyN+ICJhcXVlc3QgZWxlbWVudC4iCisKKyN+IG1zZ2lkICJNYXN0ZXIiCisjfiBtc2dzdHIgIk1lc3RyZSIKKworI34gbXNnaWQgIkZyb250IgorI34gbXNnc3RyICJGcm9udGFsIgorCisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAiUG9zdGVyaW9yIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiQXVyaWN1bGFycyIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAiQ2VudHJhbCIKKworI34gbXNnaWQgIkxGRSIKKyN+IG1zZ3N0ciAiTEZFIChlZmVjdGVzIGRlIGJhaXhhIGZyZXHDvMOobmNpYSkiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAiU28gZW52b2x0YW50IgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAiTGF0ZXJhbCIKKworI34gbXNnaWQgIkFVWCBPdXQiCisjfiBtc2dzdHIgIlNvcnRpZGEgQVVYIgorCisjfiBtc2dpZCAiM0QgRGVwdGgiCisjfiBtc2dzdHIgIlByb2Z1bmRpdGF0IDNEIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICJDZW50cmUgM0QiCisKKyN+IG1zZ2lkICIzRCBFbmhhbmNlIgorI34gbXNnc3RyICJNaWxsb3JhIDNEIgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICJUZWzDqGZvbiIKKworI34gbXNnaWQgIlZpZGVvIEluIgorI34gbXNnc3RyICJFbnRyYWRhIGRlIHbDrWRlbyIKKworI34gbXNnaWQgIkFVWCBJbiIKKyN+IG1zZ3N0ciAiRW50cmFkYSBBVVgiCisKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAiR3VhbnkgZCdlbnJlZ2lzdHJhbWVudCIKKworI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICJHdWFueSBkZSBzb3J0aWRhIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiQW1wbGlmaWNhY2nDsyBkZWwgbWljcsOyZm9uIgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAiRGlhZ27DsnN0aWMiCisKKyN+IG1zZ2lkICJCYXNzIEJvb3N0IgorI34gbXNnc3RyICJBbXBsaWZpY2FjacOzIGRlbHMgYmFpeG9zIgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgIlBvcnRzIGRlIHJlcHJvZHVjY2nDsyIKKworI34gbXNnaWQgIklucHV0IgorI34gbXNnc3RyICJFbnRyYWRhIgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIkZvbnQgZGVsIG1vbml0b3IiCisKKyN+IG1zZ2lkICJLZXlib2FyZCBCZWVwIgorI34gbXNnc3RyICJTbyBkZWwgdGVjbGF0IgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICJFc3TDqHJlbyBzaW11bGF0IgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICJFc3TDqHJlbyIKKworI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICJTbyBlbnZvbHRhbnQiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIkd1YW55IGRlbCBtaWNyw7Jmb24iCisKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAiRm9udCBkZSBsJ2FsdGF2ZXUiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiRm9udCBkZWwgbWljcsOyZm9uIgorCisjfiBtc2dpZCAiSmFjayIKKyN+IG1zZ3N0ciAiSmFjayIKKworI34gbXNnaWQgIkNlbnRlciAvIExGRSIKKyN+IG1zZ3N0ciAiQ2VudHJlIC8gTEZFIChlZmVjdGVzIGRlIGJhaXhhIGZyZXHDvMOobmNpYSkiCisKKyN+IG1zZ2lkICJTdGVyZW8gTWl4IgorI34gbXNnc3RyICJNZXNjbGEgZXN0w6hyZW8iCisKKyN+IG1zZ2lkICJNb25vIE1peCIKKyN+IG1zZ3N0ciAiTWVzY2xhIG1vbm8iCisKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgIk1lc2NsYSBkJ2VudHJhZGEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDEiCisjfiBtc2dzdHIgIk1pY3LDsmZvbiAxIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICJNaWNyw7Jmb24gMiIKKworI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICJTb3J0aWRhIGRpZ2l0YWwiCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICJFbnRyYWRhIGRpZ2l0YWwiCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk3DsmRlbSIKKworI34gbXNnaWQgIkhhbmRzZXQiCisjfiBtc2dzdHIgIkNvbWFuZGFtZW50IGEgZGlzdMOgbmNpYSIKKworI34gbXNnaWQgIk90aGVyIgorI34gbXNnc3RyICJBbHRyZXMiCisKKyN+IG1zZ2lkICJOb25lIgorI34gbXNnc3RyICJDYXAiCisKKyN+IG1zZ2lkICJPbiIKKyN+IG1zZ3N0ciAiRW5jw6hzIgorCisjfiBtc2dpZCAiT2ZmIgorI34gbXNnc3RyICJBcGFnYXQiCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICJTaWxlbmNpIgorCisjfiBtc2dpZCAiRmFzdCIKKyN+IG1zZ3N0ciAiUsOgcGlkIgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgIk1vbHQgYmFpeGEiCisKKyN+IG1zZ2lkICJMb3ciCisjfiBtc2dzdHIgIkJhaXhhIgorCisjfiBtc2dpZCAiTWVkaXVtIgorI34gbXNnc3RyICJNaXRqYW5hIgorCisjfiBtc2dpZCAiSGlnaCIKKyN+IG1zZ3N0ciAiQWx0YSIKKworI34gbXNnaWQgIlZlcnkgSGlnaCIKKyN+IG1zZ3N0ciAiTW9sdCBhbHRhIgorCisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAiUHJvZHVjY2nDsyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIk1pY3LDsmZvbiBkZWwgcXVhZHJlIGZyb250YWwiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICJMw61uaWEgZCdlbnRyYWRhIGRlbCBxdWFkcmUgZnJvbnRhbCIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIEhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkF1cmljdWxhcnMgZGVsIHF1YWRyZSBmcm9udGFsIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBPdXQiCisjfiBtc2dzdHIgIkzDrW5pYSBkZSBzb3J0aWRhIGRlbCBxdWFkcmUgZnJvbnRhbCIKKworI34gbXNnaWQgIkdyZWVuIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIHZlcmQiCisKKyN+IG1zZ2lkICJQaW5rIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIHJvc2EiCisKKyN+IG1zZ2lkICJCbHVlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIGJsYXUiCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5lY3RvciBibGFuYyIKKworI34gbXNnaWQgIkJsYWNrIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIG5lZ3JlIgorCisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5lY3RvciBncmlzIgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIHRhcm9uamEiCisKKyN+IG1zZ2lkICJSZWQgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3IgdmVybWVsbCIKKworI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5lY3RvciBncm9jIgorCisjfiBtc2dpZCAiR3JlZW4gRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3IgdmVyZCBkZWwgcXVhZHJlIGZyb250YWwiCisKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIHJvc2EgZGVsIHF1YWRyZSBmcm9udGFsIgorCisjfiBtc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5lY3RvciBibGF1IGRlbCBxdWFkcmUgZnJvbnRhbCIKKworI34gbXNnaWQgIldoaXRlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIGJsYW5jIGRlbCBxdWFkcmUgZnJvbnRhbCIKKworI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIG5lZ3JlIGRlbCBxdWFkcmUgZnJvbnRhbCIKKworI34gbXNnaWQgIkdyYXkgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3IgZ3JpcyBkZWwgcXVhZHJlIGZyb250YWwiCisKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3IgdGFyb25qYSBkZWwgcXVhZHJlIGZyb250YWwiCisKKyN+IG1zZ2lkICJSZWQgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3IgdmVybWVsbCBkZWwgcXVhZHJlIGZyb250YWwiCisKKyN+IG1zZ2lkICJZZWxsb3cgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3IgZ3JvYyBkZWwgcXVhZHJlIGZyb250YWwiCisKKyN+IG1zZ2lkICJTcHJlYWQgT3V0cHV0IgorI34gbXNnc3RyICJTb3J0aWRhIGRlIHByb3BhZ2FjacOzIgorCisjfiBtc2dpZCAiRG93bm1peCIKKyN+IG1zZ3N0ciAiRG93bm1peCIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIkVudHJhZGEgZGVsIG1lc2NsYWRvciB2aXJ0dWFsIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBPdXRwdXQiCisjfiBtc2dzdHIgIlNvcnRpZGEgZGVsIG1lc2NsYWRvciB2aXJ0dWFsIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBDaGFubmVscyIKKyN+IG1zZ3N0ciAiQ2FuYWxzIGRlbCBtZXNjbGFkb3IgdmlydHVhbCIKKworI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICJGdW5jacOzICVzICVkIgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgIkZ1bmNpw7MgJXMiCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc291bmQgc2VydmVyIgorI34gbXNnc3RyICJObyBzJ2hhIHBvZ3V0IGVzdGFibGlyIGxhIGNvbm5leGnDsyBhbCBzZXJ2aWRvciBkZSBzbyIKKworI34gbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBzb3VuZCBzZXJ2ZXIgY2FwYWJpbGl0aWVzIgorI34gbXNnc3RyICJIYSBmYWxsYXQgZW4gY29uc3VsdGFyIGxlcyBjYXBhY2l0YXRzIGRlbCBzZXJ2aWRvciBkZSBzbyIKKworI34gbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgb24gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJTJ2hhIHByb2R1acyIdCB1biBlcnJvciBhbCBsbGVnaXIgJWQgYnl0ZXMgZW4gZWwgZGlzcG9zaXRpdSDCqyVzwrsuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIiIKKyN+ICJObyBzJ2hhbiBwb2d1dCBlbnZpYXIgYSBsYSBjdWEgbGVzIG1lbcOycmllcyBpbnRlcm3DqGRpZXMgZW4gZWwgZGlzcG9zaXRpdSAiCisjfiAiwqslc8K7LiIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgaW5wdXQgZWxlbWVudC4iCisjfiBtc2dzdHIgIkRlc2NyaXUgbCdlbGVtZW50IGQnZW50cmFkYSBzZWxlY2Npb25hdC4iCisKKyN+IG1zZ2lkICJEZXNjcmliZXMgdGhlIHNlbGVjdGVkIG91dHB1dCBlbGVtZW50IGZvciBBdWRpby9WaWRlbyBDb25mZXJlbmNpbmcuIgorI34gbXNnc3RyICIiCisjfiAiRGVzY3JpdSBsJ2VsZW1lbnQgZGUgc29ydGlkYSBzZWxlY2Npb25hdCBwZXIgYSBsZXMgY29uZmVyw6huY2llcyBkJ8OgdWRpby8iCisjfiAidsOtZGVvLiIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgb3V0cHV0IGVsZW1lbnQgZm9yIE11c2ljIGFuZCBNb3ZpZXMuIgorI34gbXNnc3RyICIiCisjfiAiRGVzY3JpdSBsJ2VsZW1lbnQgZGUgc29ydGlkYSBzZWxlY2Npb25hdCBwZXIgYSBsYSBtw7pzaWNhIGkgbGVzICIKKyN+ICJwZWzCt2zDrWN1bGVzLiIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgb3V0cHV0IGVsZW1lbnQuIgorI34gbXNnc3RyICJEZXNjcml1IGwnZWxlbWVudCBkZSBzb3J0aWRhIHNlbGVjY2lvbmF0LiIKKworI34gbXNnaWQgIkdTdHJlYW1lciBhdWRpb3NpbmsgZm9yIEF1ZGlvL1ZpZGVvIENvbmZlcmVuY2luZyIKKyN+IG1zZ3N0ciAiTCdhdWRpb3NpbmsgZGVsIEdTdHJlYW1lciBwZXIgYSBsZXMgY29uZmVyw6huY2llcyBkJ8OgdWRpby92w61kZW8iCisKKyN+IG1zZ2lkICJHU3RyZWFtZXIgYXVkaW9zaW5rIGZvciBNdXNpYyBhbmQgTW92aWVzIgorI34gbXNnc3RyICJMJ2F1ZGlvc2luayBkZWwgR1N0cmVhbWVyIHBlciBhIGxhIG3DunNpY2EgaSBsZXMgcGVswrdsw61jdWxlcyIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHBsYXkgYXVkaW8gdXNpbmcgYW55IG51bWJlciBvZiBvdXRwdXQgZWxlbWVudHMuIFNvbWUgIgorI34gInBvc3NpYmxlIGNob2ljZXMgYXJlIG9zc3NpbmssIGVzZHNpbmsgYW5kIGFsc2FzaW5rLiBUaGUgYXVkaW9zaW5rIGNhbiBiZSAiCisjfiAiYSBwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJFbCBHU3RyZWFtZXIgcG90IHJlcHJvZHVpciBsJ8OgdWRpbyB1dGlsaXR6YW50IHF1YWxzZXZvbCBub21icmUgZCdlbGVtZW50cyAiCisjfiAiZGUgc29ydGlkYS4gQWxndW5lcyBvcGNpb25zIHBvc3NpYmxlcyBzw7NuIGwnb3Nzc2luaywgbCdlc2RzaW5rIGkgIgorI34gImwnYWxzYXNpbmsuIEwnYXVkaW9zaW5rIHBvdCBzZXIgdW4gY29uZHVjdGUgcGFyY2lhbCBlbiBsbG9jIGQndW4gc29sICIKKyN+ICJlbGVtZW50LiIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHBsYXkgdmlkZW8gdXNpbmcgYW55IG51bWJlciBvZiBvdXRwdXQgZWxlbWVudHMuIFNvbWUgIgorI34gInBvc3NpYmxlIGNob2ljZXMgYXJlIHh2aW1hZ2VzaW5rLCB4aW1hZ2VzaW5rLCBzZGx2aWRlb3NpbmsgYW5kIGFhc2luay4gIgorI34gIlRoZSB2aWRlb3NpbmsgY2FuIGJlIGEgcGFydGlhbCBwaXBlbGluZSBpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiRWwgR1N0cmVhbWVyIHBvdCByZXByb2R1aXIgZWwgdsOtZGVvIHV0aWxpdHphbnQgcXVhbHNldm9sIG5vbWJyZSAiCisjfiAiZCdlbGVtZW50cyBkZSBzb3J0aWRhLiBBbGd1bmVzIG9wY2lvbnMgcG9zc2libGVzIHPDs24gZWwgeHZpbWFnZXNpbmssIGVsICIKKyN+ICJ4aW1hZ2VzaW5rLCBlbCBzZGx2aWRlb3NpbmsgaSBsJ2Fhc2luay4gRWwgdmlkZW9zaW5rIHBvdCBzZXIgdW4gY29uZHVjdGUgIgorI34gInBhcmNpYWwgZW4gbGxvYyBkJ3VuIHNvbCBlbGVtZW50LiIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHB1dCB2aXN1YWxpemF0aW9uIHBsdWdpbnMgaW4gYSBwaXBlbGluZSB0byB0cmFuc2Zvcm0gYXVkaW8gIgorI34gInN0cmVhbSBpbiB2aWRlbyBmcmFtZXMuIERlZmF1bHQgaXMgZ29vbSBidXQgbW9yZSB2aXN1YWxpemF0aW9uIHBsdWdpbnMgIgorI34gIndpbGwgYmUgcG9ydGVkIHNvb24uIFRoZSB2aXN1YWxpemF0aW9uIHBsdWdpbiBjYW4gYmUgYSBwYXJ0aWFsIHBpcGVsaW5lICIKKyN+ICJpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiRWwgR1N0cmVhbWVyIHBvdCBwb3NhciBlbHMgY29ubmVjdG9ycyBkZSB2aXN1YWxpdHphY2nDsyBlbiB1biBjb25kdWN0ZSBwZXIgIgorI34gInRyYW5zZm9ybWFyIGVsIGZsdXggZCfDoHVkaW8gZW4gZWxzIGZvdG9ncmFtZXMgZGVsIHbDrWRlby4gUGVyIGRlZmVjdGUgw6lzICIKKyN+ICJlbCBnb29tIHBlcsOyIGF2aWF0IHMnaW1wb3J0YXJhbiBtw6lzIGNvbm5lY3RvcnMgZGUgdmlzdWFsaXR6YWNpw7MuIEVsICIKKyN+ICJjb25uZWN0b3IgZGUgdmlzdWFsaXR6YWNpw7MgcG90IHNlciB1biBjb25kdWN0ZSBwYXJjaWFsIGVuIGxsb2MgZCd1biBzb2wgIgorI34gImVsZW1lbnQuIgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcmVjb3JkIGF1ZGlvIHVzaW5nIGFueSBudW1iZXIgb2YgaW5wdXQgZWxlbWVudHMuIFNvbWUgIgorI34gInBvc3NpYmxlIGNob2ljZXMgYXJlIG9zc3NyYywgZXNkc3JjIGFuZCBhbHNhc3JjLiBUaGUgYXVkaW8gc291cmNlIGNhbiBiZSAiCisjfiAiYSBwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJFbCBHU3RyZWFtZXIgcG90IGVucmVnaXN0cmFyIGwnw6B1ZGlvIHV0aWxpdHphbnQgcXVhbHNldm9sIG5vbWJyZSAiCisjfiAiZCdlbGVtZW50cyBkJ2VudHJhZGEuIEFsZ3VuZXMgb3BjaW9ucyBwb3NzaWJsZXMgc8OzbiBsJ29zc3NyYywgbCdlc2RzcmMgaSAiCisjfiAibCdhbHNhc3JjLiBMYSBmb250IGQnw6B1ZGlvIHBvdCBzZXIgdW4gY29uZHVjdGUgcGFyY2lhbCBlbiBsbG9jIGQndW4gc29sICIKKyN+ICJlbGVtZW50LiIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHJlY29yZCB2aWRlbyBmcm9tIGFueSBudW1iZXIgb2YgaW5wdXQgZWxlbWVudHMuIFNvbWUgIgorI34gInBvc3NpYmxlIGNob2ljZXMgYXJlIHY0bHNyYyBhbmQgdmlkZW90ZXN0c3JjLiBUaGUgdmlkZW8gc291cmNlIGNhbiBiZSBhICIKKyN+ICJwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJFbCBHU3RyZWFtZXIgcG90IGVucmVnaXN0cmFyIGVsIHbDrWRlbyBkZSBxdWFsc2V2b2wgbm9tYnJlIGQnZWxlbWVudHMgIgorI34gImQnZW50cmFkYS4gQWxndW5lcyBvcGNpb25zIHBvc3NpYmxlcyBzw7NuIGVsIHY0bHNyYyBpIGVsIHZpZGVvdGVzdHNyYy4gTGEgIgorI34gImZvbnQgZGVsIHbDrWRlbyBwb3Qgc2VyIHVuIGNvbmR1Y3RlIHBhcmNpYWwgZW4gbGxvYyBkJ3VuIHNvbCBlbGVtZW50LiIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIGF1ZGlvIHNvdXJjZSIKKyN+IG1zZ3N0ciAiZm9udCBkJ8OgdWRpbyBkZWwgR1N0cmVhbWVyIHBlciBkZWZlY3RlIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW9zaW5rIgorI34gbXNnc3RyICJhdWRpb3NpbmsgZGVsIEdTdHJlYW1lciBwZXIgZGVmZWN0ZSIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIHZpZGVvIHNvdXJjZSIKKyN+IG1zZ3N0ciAiZm9udCBkZSB2w61kZW8gZGVsIEdTdHJlYW1lciBwZXIgZGVmZWN0ZSIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIHZpZGVvc2luayIKKyN+IG1zZ3N0ciAidmlkZW9zaW5rIGRlbCBHU3RyZWFtZXIgcGVyIGRlZmVjdGUiCisKKyN+IG1zZ2lkICJkZWZhdWx0IEdTdHJlYW1lciB2aXN1YWxpemF0aW9uIHBsdWdpbiIKKyN+IG1zZ3N0ciAiY29ubmVjdG9yIGRlIHZpc3VhbGl0emFjacOzIGRlbCBHU3RyZWFtZXIgcGVyIGRlZmVjdGUiCisKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgR1N0cmVhbWVyIGF1ZGlvc2luayBmb3IgQXVkaW8vVmlkZW8gQ29uZmVyZW5jaW5nIgorI34gbXNnc3RyICIiCisjfiAiZGVzY3JpcGNpw7MgZGUgbCdhdWRpb3NpbmsgZGVsIEdTdHJlYW1lciBwZXIgYSBsZXMgY29uZmVyw6huY2llcyBkJ8OgdWRpby8iCisjfiAidsOtZGVvIgorCisjfiBtc2dpZCAiZGVzY3JpcHRpb24gZm9yIEdTdHJlYW1lciBhdWRpb3NpbmsgZm9yIE11c2ljIGFuZCBNb3ZpZXMiCisjfiBtc2dzdHIgIiIKKyN+ICJkZXNjcmlwY2nDsyBkZSBsJ2F1ZGlvc2luayBkZWwgR1N0cmVhbWVyIHBlciBhIGxhIG3DunNpY2EgaSBsZXMgcGVswrdsw61jdWxlcyIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBkZWZhdWx0IEdTdHJlYW1lciBhdWRpb3NpbmsiCisjfiBtc2dzdHIgImRlc2NyaXBjacOzIGRlIGwnYXVkaW9zaW5rIGRlbCBHU3RyZWFtZXIgcGVyIGRlZmVjdGUiCisKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW9zcmMiCisjfiBtc2dzdHIgImRlc2NyaXBjacOzIGRlIGwnYXVkaW9zcmMgZGVsIEdTdHJlYW1lciBwZXIgZGVmZWN0ZSIKZGlmZiAtLWdpdCBhL3BvL2NzLnBvIGIvcG8vY3MucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ3MWI1MAotLS0gL2Rldi9udWxsCisrKyBiL3BvL2NzLnBvCkBAIC0wLDAgKzEsNDMzIEBACisjIEN6ZWNoIHRyYW5zbGF0aW9uIG9mIGdzdC1wbHVnaW5zLWdvb2QuCisjIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSB0aGUgYXV0aG9yKHMpIG9mIGdzdC1wbHVnaW5zLWdvb2QuCisjIFRoaXMgZmlsZSBpcyBwdXQgaW4gdGhlIHB1YmxpYyBkb21haW4uCisjCisjIE1pbG9zbGF2IFRybWFjIDxtaXRyQHZvbG55LmN6PiwgMjAwNC4KKyMgUGV0ciBLb3ZhciA8cGtuYmVAdm9sbnkuY3o+LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLgorIyBNYXJlayDEjGVybm9ja8O9IDxtYXJla0BtYW5ldC5jej4sIDIwMTMsIDIwMTUsIDIwMTYuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kLTEuNy4yXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTYtMDItMjcgMTY6NDArMDEwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogTWFyZWsgxIxlcm5vY2vDvSA8bWFyZWtAbWFuZXQuY3o+XG4iCisiTGFuZ3VhZ2UtVGVhbTogQ3plY2ggPHRyYW5zbGF0aW9uLXRlYW0tY3NAbGlzdHMuc291cmNlZm9yZ2UubmV0PlxuIgorIkxhbmd1YWdlOiBjc1xuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlBsdXJhbC1Gb3JtczogbnBsdXJhbHM9MzsgcGx1cmFsPShuPT0xKSA/IDAgOiAobj49MiAmJiBuPD00KSA/IDEgOiAyO1xuIgorIlgtR2VuZXJhdG9yOiBHdHJhbnNsYXRvciAyLjkxLjZcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiU2VydmVyIEphY2sgbmVieWwgbmFsZXplbiIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiU2VsaGFsbyBkZWvDs2RvdsOhbsOtIG9icsOhemt1IEpQRUciCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIuKAniVz4oCcIG9kIOKAniVz4oCcIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJOZXpkYcWZaWxvIHNlIHNwb2plbsOtIHNlIHNlcnZlcmVtIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIk5lbsOtIG5hc3RhdmVuYSDFvsOhZG7DoSBhZHJlc2EgVVJMLiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiTmV6ZGHFmWlsIHNlIHDFmWVrbGFkIG7DoXp2dSBzZXJ2ZXJ1LiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJOZXpkYcWZaWxvIHNlIG5hdsOhesOhbsOtIHNwb2plbsOtIHNlIHNlcnZlcmVtLiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIlNlbGhhbG8gbmFzdGF2ZW7DrSB6YWJlenBlxI1lbsOpaG8gcMWZaXBvamVuw60uIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiRG/FoWxvIGsgY2h5YsSbIHPDrXTEmyBuZWJvIHNlcnZlciBuZW/EjWVrw6F2YW7EmyB1a29uxI1pbCBzcG9qZW7DrS4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIlNlcnZlciBvZGVzbGFsIGNoeWJuw6EgZGF0YS4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiU2VydmVyIG5lcG9kcG9ydWplIHDFmWVza2Frb3bDoW7DrS4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIsW9w6FkbsO9IG5lYm8gbmVwbGF0bsO9IHp2dWtvdsO9IHZzdHVwLCBwcm91ZCBBVkkgYnVkZSBwb8Wha296ZW4uIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJUZW50byBzb3Vib3IgbmVvYnNhaHVqZSBocmF0ZWxuw6kgcHJvdWR5LiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiVGVudG8gc291Ym9yIGplIG5lcGxhdG7DvSBhIG5lbHplIGplaiBwxZllaHLDoXQuIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIk5lbHplIHDFmWVocsOhdCBwcm91ZCwgcHJvdG/FvmUgamUgxaFpZnJvdsOhbiBwb21vY8OtIERSTSBQbGF5UmVhZHkuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJUZW50byBzb3Vib3IgamUgcG/FoWtvemVuIGEgbmVsemUgamVqIHDFmWVocsOhdC4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIk5lcGxhdG7DoSBhdG9taWNrw6EgdmVsaWtvc3QuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJUZW50byBzb3Vib3IgbmVuw60gw7pwbG7DvSBhIG5lbHplIGplaiBwxZllaHLDoXQuIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICJWaWRlbyB2IHRvbXRvIHNvdWJvcnUgc2UgbmVtdXPDrSBwxZllaHLDoXQgc3Byw6F2bsSbLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICJUZW50byBzb3Vib3Igb2JzYWh1amUgcMWZw61sacWhIG1ub2hvIHByb3Vkxa8uIFDFmWVocsOhdsOhIHNlIHBvdXplIHBydm7DrSAlZCIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisiTmVieWwgbmFsZXplbiDFvsOhZG7DvSBwb2Rwb3JvdmFuw70gcHJvdWQuIEJ1ZGUgcGF0cm7EmyBudXRuw6kgbmFpbnN0YWxvdmF0ICIKKyJ6w6FzdXZuw70gbW9kdWwgcm96xaHDrcWZZW7DrSBHU3RyZWFtZXIgUlRTUCBwcm8gbXVsdGltZWRpw6FsbsOtIHByb3VkeSBSZWFsLiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorIk5lYnlsIG5hbGV6ZW4gxb7DoWRuw70gcG9kcG9yb3ZhbsO9IHByb3VkLiBQYXRybsSbIGJ1ZGUgbnV0bsOpIHBvdm9saXQgdsOtY2UgIgorInDFmWVub3NvdsO9Y2ggcHJvdG9rb2zFrywgamluYWsgbmVqc3DDrcWhIGJ1ZGUgc2Now6F6ZXQgcG90xZllYm7DvSB6w6FzdXZuw70gbW9kdWwgIgorInJvesWhw63FmWVuw60gR1N0cmVhbWVyIFJUU1AuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIlp2dWtvdsOpIHphxZnDrXplbsOtIG5lbHplIG90ZXbFmcOtdCBwcm8gcMWZZWhyw6F2w6Fuw60uIFphxZnDrXplbsOtIGplIHBvdcW+w612w6FubyBqaW5vdSAiCisiYXBsaWthY8OtLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiWnZ1a292w6kgemHFmcOtemVuw60gbmVsemUgb3RldsWZw610IHBybyBwxZllaHLDoXbDoW7DrS4gTmVtw6F0ZSBvcHLDoXZuxJtuw60gayBvdGV2xZllbsOtICIKKyJ6YcWZw616ZW7DrS4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiWnZ1a292w6kgemHFmcOtemVuw60gbmVsemUgb3RldsWZw610IHBybyDEjXRlbsOtLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyJOZXpkYcWZaWxvIHNlIG90ZXbFmWVuw60genZ1a292w6lobyB6YcWZw616ZW7DrSBwcm8gcMWZZWhyw6F2w6Fuw60uIFRhdG8gdmVyemUgT3BlbiAiCisiU291bmQgU3lzdGVtIG5lbsOtIHDFmcOtc2x1xaFuw71tIHBydmtlbSBwb2Rwb3JvdsOhbmEuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIlDFmWVocsOhdsOhbsOtIG5lbsOtIHTDrW10byB6dnVrb3bDvW0gemHFmcOtemVuw61tIHBvZHBvcm92w6Fuby4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIkNoeWJhIHDFmWVocsOhdsOhbsOtIHp2dWt1LiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiVG90byB6dnVrb3bDqSB6YcWZw616ZW7DrSBuZXBvZHBvcnVqZSBuYWhyw6F2w6Fuw60uIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiQ2h5YmEgcMWZaSBuYWhyw6F2w6Fuw60gemUgenZ1a292w6lobyB6YcWZw616ZW7DrS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJadnVrb3bDqSB6YcWZw616ZW7DrSBuZWx6ZSBvdGV2xZnDrXQgcHJvIG5haHLDoXbDoW7DrS4gTmVtw6F0ZSBvcHLDoXZuxJtuw60gayBvdGV2xZllbsOtICIKKyJ6YcWZw616ZW7DrS4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIlp2dWtvdsOpIHphxZnDrXplbsOtIG5lbHplIG90ZXbFmcOtdCBwcm8gbmFocsOhdsOhbsOtLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICJOZWJ5bG8gbmFsZXplbm8gemHFmcOtemVuw60gQ29yZUF1ZGlvIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICJOZWx6ZSBvdGV2xZnDrXQgemHFmcOtemVuw60gQ29yZUF1ZGlvIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAiWmRyb2ogbmFocsOhdsOhbsOtIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWlrcm9mb24iCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJMaW5rb3bDvSB2c3R1cCIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICJJbnRlcm7DrSBDRCIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJWc3R1cCBTUERJRiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJWc3R1cCBBVVggMSIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJWc3R1cCBBVVggMiIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJLb2Rla292w6Egc215xI1rYSIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiU215xI1rYSBTdW5WVFMiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIkhsYXNpdG9zdCIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIlplc8OtbGVuw60iCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJNb25pdG9yIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiWmFidWRvdmFuw70gcmVwcm9kdWt0b3IiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIlNsdWNow6F0a28iCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiTGlua292w70gdsO9c3R1cCIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiVsO9c3R1cCBTUERJRiIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiVsO9c3R1cCBBVVggMSIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiVsO9c3R1cCBBVVggMiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICJDaHliYSBwxZlpIMSNdGVuw60gJWQgYmFqdMWvIG5hIHphxZnDrXplbsOtIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorIlNlbGhhbG8gdnl0dm/FmWVuw60gc2V6bmFtdSBtb8W+bsO9Y2ggZm9ybcOhdMWvIHZpZGVhLCBzZSBrdGVyw71taSB1bcOtIHphxZnDrXplbsOtICIKKyLigJ4lc+KAnCBwcmFjb3ZhdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTmV6ZGHFmWlsbyBzZSBtYXBvdsOhbsOtIHZ5cm92bsOhdmFjw60gcGFtxJt0aSB6ZSB6YcWZw616ZW7DrSDigJ4lc+KAnCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiT3ZsYWRhxI0gemHFmcOtemVuw60g4oCeJXPigJwgbmVwb2Rwb3J1amUgVi9WIG1ldG9kdSAlZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIk92bGFkYcSNIHphxZnDrXplbsOtIOKAniVz4oCcIG5lcG9kcG9ydWplIMW+w6Fkbm91IHpuw6Ftb3UgVi9WIG1ldG9kdS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiWmHFmcOtemVuw60g4oCeJXPigJwgamUgemFuZXByw6F6ZG7Em25vIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJaYcWZw616ZW7DrSDigJ4lc+KAnCBuZXVtw60gemFjaHl0w6F2YXQgdiByb3ptxJtydSAlZOKAr8OX4oCvJWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIlphxZnDrXplbsOtIOKAniVz4oCcIG5ldW3DrSB6YWNoeXTDoXZhdCB2IHRvbXRvIGtvbmtyw6l0bsOtbSBmb3Jtw6F0dSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICJaYcWZw616ZW7DrSDigJ4lc+KAnCBuZXBvZHBvcnVqZSBuZXNvdXNlZMOtY8OtIHNsb8W+a3kgb2JyYXp1IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTmV6ZGHFmWlsbyBzZSB6amnFoXTEm27DrSBwYXJhbWV0csWvIG5hIHphxZnDrXplbsOtIOKAniVz4oCcIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICJWaWRlb3phxZnDrXplbsOtIG5lcMWZaWphbG8gbm92w6kgbmFzdGF2ZW7DrSBzbsOtbWtvdsOpIHJ5Y2hsb3N0aS4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICJWaWRlb3phxZnDrXplbsOtIG5lcG9za3l0dWplIHbDvXN0dXBuw60gZm9ybcOhdC4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiVmlkZW96YcWZw616ZW7DrSBzZMSbbGlsbyBuZXBsYXRuw6kgcm96bcSbcnkuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIlZpZGVvemHFmcOtemVuw60gcG91xb7DrXbDoSBuZXBvZHBvcm92YW5vdSBtZXRvZHUgcHJva2zDoWTDoW7DrS4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiVmlkZW96YcWZw616ZW7DrSBwb3XFvsOtdsOhIG5lcG9kcG9yb3ZhbsO9IHJhc3Ryb3bDvSBmb3Jtw6F0LiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICJTZWxoYWxvIG5hc3RhdmVuw60gdm5pdMWZbsOtIHNwb2xlxI1uw6kgdnlyb3Zuw6F2YWPDrSBwYW3Em3RpLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiVmlkZW96YcWZw616ZW7DrSBuZWRvcG9ydcSNdWplIG5pamFrb3UgdmVsaWtvc3Qgdnlyb3Zuw6F2YWPDrSBwYW3Em3RpLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIk5lZXhpc3R1amUgxb7DoWRuw70gc3BvbGXEjW7DvSBwcm91ZCBkYXQsIHplIGt0ZXLDqWhvIGJ5IMWhbG8gaW1wb3J0b3ZhdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlNlbGhhbG8gemppxaF0xJtuw60gbmFzdGF2ZW7DrSB0dW5lcnUgJWQgdSB6YcWZw616ZW7DrSDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQ2h5YmEgcMWZaSB6amnFocWlb3bDoW7DrSBzY2hvcG5vc3TDrSB6YcWZw616ZW7DrSDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJaYcWZw616ZW7DrSDigJ4lc+KAnCBuZW7DrSB0dW5lci4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJTZWxoYWxvIHrDrXNrw6Fuw60gcsOhZGlvdsOpaG8gdnN0dXB1IHUgemHFmcOtemVuw60g4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiTmV6ZGHFmWlsbyBzZSBuYXN0YXZlbsOtIHZzdHVwdSAlZCB1IHphxZnDrXplbsOtIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiU2VsaGFsYSB6bcSbbmEgc3RhdnUgemFwbnV0w60vdnlwbnV0w60genZ1a3UgdSB6YcWZw616ZW7DrSDigJ4lc+KAnC4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIlNlbGhhbG8gcMWZaWTEm2xlbsOtIHBvxb5hZG92YW7DqSBwYW3Em3RpLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJTZWxoYWxvIHDFmWlkxJtsZW7DrSBwb8W+YWRvdmFuw6kgcGFtxJt0aS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiUMWZZXZvZG7DrWsgbmEgemHFmcOtemVuw60g4oCeJXPigJwgbmVwb2Rwb3J1amUgdnN0dXBuw60gZm9ybcOhdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiUMWZZXZvZG7DrWsgbmEgemHFmcOtemVuw60g4oCeJXPigJwgbmVwb2Rwb3J1amUgdsO9c3R1cG7DrSBmb3Jtw6F0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJLb2TDqXIgbmEgemHFmcOtemVuw60g4oCeJXPigJwgbmVwb2Rwb3J1amUgdnN0dXBuw60gZm9ybcOhdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIktvZMOpciBuYSB6YcWZw616ZW7DrSDigJ4lc+KAnCBuZXBvZHBvcnVqZSB2w71zdHVwbsOtIGZvcm3DoXQiCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiU2VsaGFsbyBzcHXFoXTEm27DrSB2bMOha25hIGRla29kw6lydS4iCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIlNlbGhhbG8genByYWNvdsOhbsOtIHNuw61ta3UuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIkNoeWJhIHDFmWkgesOtc2vDoXbDoW7DrSBpbmZvcm1hY8OtIG8gc2Nob3Bub3N0ZWNoIHUgemHFmcOtemVuw60g4oCeJXPigJw6IE5lamVkbsOhIHNlIG8gIgorIm92bGFkYcSNIHY0bDIuIFprb250cm9sdWp0ZSwgemRhIHNlIG5lamVkbsOhIG8gb3ZsYWRhxI0gdjRsMS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICJOZXpkYcWZaWxvIHNlIGRvdMOhesOhbsOtIG5hIHZsYXN0bm9zdGkgdnN0dXB1ICVkIHUgemHFmcOtemVuw60g4oCeJXPigJwiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiU2VsaGFsbyB6amnFoXTEm27DrSBuYXN0YXZlbsOtIHR1bmVydSAlZCB1IHphxZnDrXplbsOtIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5lemRhxZlpbG8gc2UgZG90w6F6w6Fuw60gbmEgbm9ybXUgbmEgemHFmcOtemVuw60g4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOZXpkYcWZaWxvIHNlIHpqacWhdMSbbsOtIHZsYXN0bm9zdMOtIG92bMOhZGFjw61jaCBwcnZrxa8gdSB6YcWZw616ZW7DrSDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmV6ZGHFmWlsbyBzZSByb3pwb3puYXQgemHFmcOtemVuw60g4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlRvdG8gbmVuw60gemHFmcOtemVuw60g4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiTmV6ZGHFmWlsbyBzZSBvdGV2xZnDrXQgemHFmcOtemVuw60g4oCeJXPigJwgcHJvIMSNdGVuw60gYSB6w6FwaXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiWmHFmcOtemVuw60g4oCeJXPigJwgbmVuw60gemFjaHl0w6F2YWPDrW0gemHFmcOtemVuw61tLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiWmHFmcOtemVuw60g4oCeJXPigJwgbmVuw60gdsO9c3R1cG7DrW0gemHFmcOtemVuw61tLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiWmHFmcOtemVuw60g4oCeJXPigJwgbmVuw60gemHFmcOtemVuw61tIE0yTS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIk5lemRhxZlpbG8gc2UgZHVwbGlrb3ZhdCB6YcWZw616ZW7DrSDigJ4lc+KAnCBwcm8gxI10ZW7DrSBhIHrDoXBpcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlNlbGhhbG8gbmFzdGF2ZW7DrSBub3JteSB1IHphxZnDrXplbsOtIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlNlbGhhbG8gemppxaF0xJtuw60gYWt0dcOhbG7DrSBmcmVrdmVuY2UgdHVuZXJ1IHUgemHFmcOtemVuw60g4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIlNlbGhhbG8gbmFzdGF2ZW7DrSBha3R1w6FsbsOtIGZyZWt2ZW5jZSB0dW5lcnUgdSB6YcWZw616ZW7DrSDigJ4lc+KAnCBuYSAlbHUgSHouIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlNlbGhhbG8gemppxaF0xJtuw60gc8OtbHkgc2lnbsOhbHUgdSB6YcWZw616ZW7DrSDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlNlbGhhbG8gemppxaF0xJtuw60gaG9kbm90eSB1IG92bMOhZGFjw61obyBwcnZrdSAlZCBuYSB6YcWZw616ZW7DrSDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlNlbGhhbG8gbmFzdGF2ZW7DrSBob2Rub3R5ICVkIHUgb3Zsw6FkYWPDrWhvIHBydmt1ICVkIG5hIHphxZnDrXplbsOtIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIlNlbGhhbG8gesOtc2vDoW7DrSBha3R1w6FsbsOtaG8gdnN0dXB1IG5hIHphxZnDrXplbsOtIOKAniVz4oCcLiBNb8W+bsOhIHNlIGplZG7DoSBvICIKKyJyYWRpb3DFmWlqw61tYcSNLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiU2VsaGFsbyB6w61za8OhbsOtIGFrdHXDoWxuw61obyB2w71zdHVwdSBuYSB6YcWZw616ZW7DrSDigJ4lc+KAnC4gTW/Fvm7DoSBzZSBqZWRuw6EgbyAiCisicmFkaW9wxZlpasOtbWHEjSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJTZWxoYWxvIG5hc3RhdmVuw60gdsO9c3R1cHUgJWQgbmEgemHFmcOtemVuw60gJXMuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiWm3Em25hIHJvemxpxaFlbsOtIHphIGLEm2h1IHphdMOtbSBuZW7DrSBwb2Rwb3JvdsOhbmEuIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJOZW7DrSBtb8W+bsOpIGZ1bmdvdmF0IGJleiBob2RpbiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiVm5pdMWZbsOtIGNoeWJhIGRhdG92w6lobyBwcm91ZHUuIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAiVm5pdMWZbsOtIGNoeWJhIGRhdG92w6lobyB0b2t1LiIKZGlmZiAtLWdpdCBhL3BvL2RhLnBvIGIvcG8vZGEucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3MmMyMQotLS0gL2Rldi9udWxsCisrKyBiL3BvL2RhLnBvCkBAIC0wLDAgKzEsNDM4IEBACisjIERhbmlzaCB0cmFuc2xhdGlvbiBvZiBnc3QtcGx1Z2lucy1nb29kLgorIyBDb3B5cmlnaHQgKEMpIDIwMTYgZ3N0LgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIyBNb2dlbnMgSmFlZ2VyIDxtb2dlbnNAamFlZ2VyLnRmPiwgMjAwNy4KKyMgSm9lIEhhbnNlbiA8am9lZGFsdG9uMkB5YWhvby5kaz4sIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIsIDIwMTMsIDIwMTQsIDIwMTUsIDIwMTYuCisjCisjIGdhaW4gLT4gZm9yaMO4amVsc2UKKyMgYm9vc3QgLT4gw7hnbmluZz8KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QtMS43LjJcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxNi0wMy0yNyAyMzo1NCswMjAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBKb2UgSGFuc2VuIDxqb2VkYWx0b24yQHlhaG9vLmRrPlxuIgorIkxhbmd1YWdlLVRlYW06IERhbmlzaCA8ZGFuc2tAZGFuc2stZ3J1cHBlbi5kaz5cbiIKKyJMYW5ndWFnZTogZGFcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiSmFjay1zZXJ2ZXIgYmxldiBpa2tlIGZ1bmRldCIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiTWlzbHlra2VkZXMgaSBhdCBhZmtvZGUgSlBFRy1iaWxsZWRlIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICLCuyVzwqsgYWYgwrslc8KrIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJLdW5uZSBpa2tlIGZvcmJpbmRlIHRpbCBzZXJ2ZXIiCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiSW5nZW4gYWRyZXNzZSBhbmdpdmV0LiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiS3VubmUgaWtrZSBzbMOlIHNlcnZlcm5hdm4gb3AuIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIkt1bm5lIGlra2Ugc2thYmUga29udGFrdCB0aWwgc2VydmVyZW4uIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiT3Bzw6Z0bmluZyBhZiBzaWtrZXIgZm9yYmluZGVsc2UgbWlzbHlra2VkZXMuIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorIkRlciBvcHN0b2QgZW4gbmV0dsOmcmtzZmVqbCwgZWxsZXIgc2VydmVyZW4gbHVra2VkZSB1dmVudGV0IGZvcmJpbmRlbHNlbi4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIlNlcnZlciBzZW5kdGUgdWd5bGRpZ2UgZGF0YS4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiU2VydmVyIHVuZGVyc3TDuHR0ZXIgaWtrZSBzw7hnbmluZy4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIkluZ2VuIGVsbGVyIGRlZmVrdCBpbmRkYXRhbHlkLCBBVkktc2VrdmVucyB2aWwgYmxpdmUgw7hkZWxhZ3QuIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJEZW5uZSBmaWwgaW5kZWhvbGRlciBpbmdlbiBzcGlsYmFyIHN0csO4bS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkRlbm5lIGZpbCBlciB1ZnVsZHN0w6ZuZGlnIG9nIGthbiBpa2tlIGFmc3BpbGxlcy4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiS2FuIGlra2UgYWZzcGlsbGUgc3Ryw7htLCBkYSBkZW4gZXIga3J5cHRlcmV0IG1lZCBQbGF5UmVhZHkgRFJNLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRGVubmUgZmlsIGVyIMO4ZGVsYWd0IG9nIGthbiBpa2tlIGFmc3BpbGxlcy4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIlVneWxkaWcgYXRvbXN0w7hycmVsc2UuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJEZW5uZSBmaWwgZXIgdWZ1bGRzdMOmbmRpZyBvZyBrYW4gaWtrZSBhZnNwaWxsZXMuIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICJWaWRlb2VuIGkgZGVubmUgZmlsIGFmc3BpbGxlcyBtw6Vza2UgaWtrZSBrb3JyZWt0LiIKKworIyBodmFkIGVyICVkIGkgZGV0dGUgcHJvZ3JhbT8gVW1pZGRlbGJhcnQgdmlsbGUgamVnIHRybyBkZXQgc2t1bGxlCisjIGhlZGRlLCAiQWZwaWxsZXIga3VuIGbDuHJzdGUgJWQiIG1lbiBkZXQga29tbWVyIHNlbHZmw7hsZ2VsaWcgYW4gcMOlIAorIyBzYW1tZW5ow6ZuZ2VuLgorIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICJEZW5uZSBmaWwgaW5kZWhvbGRlciBmb3IgbWFuZ2Ugc3Ryw7htbWUuIEFmc3BpbCBmw7hyc3Qga3VuICVkIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJJbmdlbiB1bmRlcnN0w7h0dGV0IHN0csO4bSBibGV2IGZ1bmRldC4gRHUgc2thbCBtw6Vza2UgaW5zdGFsbGVyZSBldCAiCisidWR2aWRlbHNlc21vZHVsIGZvciBHU3RyZWFtZXIgUlRTUCB0aWwgUmVhbCBtZWRpYS1zdHLDuG1tZS4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyJJbmdlbiB1bmRlcnN0w7h0dGV0IHN0csO4bSBibGV2IGZ1bmRldC4gRHUgbWFuZ2xlciBtw6Vza2UgYXQgdGlsbGFkZSB5ZGVybGlnZXJlICIKKyJ0cmFuc3BvcnRwcm90b2tvbGxlciBlbGxlciBtYW5nbGVyIG3DpXNrZSBkZXQga29ycmVrdGUgdWR2aWRlbHNlc21vZHVsIHRpbCAiCisiR1N0cmVhbWVyIFJUU1AuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIkt1bm5lIGlra2Ugw6VibmUgbHlkZW5oZWQgdGlsIGFmc3BpbG5pbmcuIEVuaGVkZW4gYW52ZW5kZXMgYWYgZXQgYW5kZXQgIgorInByb2dyYW0uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJLdW5uZSBpa2tlIMOlYm5lIGx5ZGVuaGVkIHRpbCBhZnNwaWxuaW5nLiBEdSBoYXIgaWtrZSByZXR0aWdoZWQgdGlsIGF0IMOlYm5lICIKKyJlbmhlZGVuLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJLdW5uZSBpa2tlIMOlYm5lIGVuaGVkIHRpbCBhZnNwaWxuaW5nLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyJLdW5uZSBpa2tlIMOlYm5lIGx5ZGVuaGVkIHRpbCBhZnNwaWxuaW5nLiBEZW5uZSB2ZXJzaW9uIGFmIE9wZW4gU291bmQgU3lzdGVtICIKKyJlciBpa2tlIHVuZGVyc3TDuHR0ZXQgYWYgZGV0dGUgZWxlbWVudC4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiQWZzcGlsbmluZyBlciBpa2tlIHVuZGVyc3TDuHR0ZXQgYWYgZGVubmUgbHlkZW5oZWQuIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICJGZWpsIHZlZCBseWRhZnNwaWxuaW5nLiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiT3B0YWdlbHNlIGVyIGlra2UgdW5kZXJzdMO4dHRldCBhZiBkZW5uZSBseWRlbmhlZC4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJGZWpsIHZlZCBvcHRhZ2Vsc2UgZnJhIGx5ZGVuaGVkLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIkt1bm5lIGlra2Ugw6VibmUgbHlkZW5oZWQgdGlsIG9wdGFnZWxzZS4gRHUgaGFyIGlra2UgcmV0dGlnaGVkIHRpbCBhdCDDpWJuZSAiCisiZW5oZWRlbi4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIkt1bm5lIGlra2Ugw6VibmUgbHlkZW5oZWQgdGlsIG9wdGFnZWxzZS4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiQ29yZUF1ZGlvLWVuaGVkIGJsZXYgaWtrZSBmdW5kZXQiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIkNvcmVBdWRpby1lbmhlZCBrdW5uZSBpa2tlIMOlYm5lcyIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIk9wdGFnZWxzZXNraWxkZSIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pa3JvZm9uIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiTGluamUgaW5kIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIkludGVybiBjZCIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJTUERJRiBpbmQiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiQVVYIDEgaW5kIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIkFVWCAyIGluZCIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJDb2RlYy1sb29wYmFjayIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiU3VuVlRTLWxvb3BiYWNrIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJMeWRzdHlya2UiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJGb3Jow7hqZWxzZSIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIk1vbml0b3IiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJJbmRieWdnZXQgaMO4anRhbGVyIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICJIb3ZlZHRlbGVmb24iCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiTGluamUgdWQiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNQRElGIHVkIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICJBVVggMSB1ZCIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiQVVYIDIgdWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRmVqbCB2ZWQgbMOmc25pbmcgYWYgJWQgYnl0ZSBww6UgZW5oZWQgwrslc8KrLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorIkt1bm5lIGlra2UgbnVtbWVyZXJlIG11bGlnIHZpZGVvZm9ybWF0ZXIgc29tIGVuaGVkIMK7JXPCqyBrYW4gZnVuZ2VyZSBtZWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIkt1bm5lIGlra2UgYWZiaWxkZSBtZWxsZW1sYWdlciBmcmEgZW5oZWQgwrslc8KrIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICJEcml2ZXJlbiB0aWwgZW5oZWQgwrslc8KrIHVuZGVyc3TDuHR0ZXIgaWtrZSBJTy1tZXRvZGVuICVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiRHJpdmVyZW4gdGlsIGVuaGVkIMK7JXPCqyB1bmRlcnN0w7h0dGVyIGluZ2VuIGtlbmR0IElPLW1ldG9kZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiRW5oZWRlbiDCuyVzwqsgZXIgb3B0YWdldCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiRW5oZWRlbiDCuyVzwqsga2FuIGlra2Ugb3B0YWdlIG1lZCAlZHglZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiRW5oZWRlbiDCuyVzwqsga2FuIGlra2Ugb3B0YWdlIGkgZGV0IGFuZ2l2bmUgZm9ybWF0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIkVuaGVkZW4gwrslc8KrIHVuZGVyc3TDuHR0ZXIgaWtrZSBwbGFuZXIsIGRlciBpa2tlIGjDpm5nZXIgc2FtbWVuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiS3VubmUgaWtrZSBoZW50ZSBwYXJhbWV0cmUgZnJhIGVuaGVkIMK7JXPCqyIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiVmlkZW9lbmhlZGVuIGFjY2VwdGVyZWRlIGlra2UgbnkgaW5kc3RpbGxpbmcgZm9yIGJpbGxlZHJhdGUuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiVmlkZW9lbmhlZGVuIGFuZ2F2IGlra2UgdWRkYXRhZm9ybWF0LiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICJWaWRlb2VuaGVkIHJldHVybmVyZWRlIHVneWxkaWdlIGRpbWVuc2lvbmVyLiIKKworIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ludGVybGFjZWRfdmlkZW8KKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiVmlkZW9lbmhlZGVyIGJydWdlciBlbiBpbnRlcmxhY2UtbWV0b2RlLCBkZXIgaWtrZSBlciB1bmRlcnN0w7h0dGV0LiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICJWaWRlb2VuaGVkZXIgYnJ1Z2VyIGV0IGJpbGxlZHB1bmt0c2Zvcm1hdCwgZGVyIGlra2UgZXIgdW5kZXJzdMO4dHRldC4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiS3VubmUgaWtrZSBrb25maWd1cmVyZSBpbnRlcm4gbWVsbGVtbGFnZXJrw7guIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICJWaWRlb2VuaGVkIGZvcmVzbG9nIGlra2UgZW4gbWVsbGVtbGFnZXJzdMO4cnJlbHNlLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIkluZ2VuIG5lZHN0csO4bXNrw7ggYXQgaW1wb3J0ZXJlIGZyYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkhlbnRuaW5nIGFmIGluZHN0aWxsaW5nZXIgZm9yIHR1bmVyICVkIHDDpSBlbmhlZCDCuyVzwqsgZmVqbGVkZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRmVqbCB1bmRlciBoZW50bmluZyBhZiBrYXBhY2l0ZXRlciBmb3IgZW5oZWQgwrslc8KrLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIkVuaGVkIMK7JXPCqyBlciBpa2tlIGVuIHR1bmVyLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIkt1bm5lIGlra2UgaGVudGUgcmFkaW9pbmRkYXRhIGZvciBlbmhlZCDCuyVzwqsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiS3VubmUgaWtrZSBzw6Z0dGUgaW5kZGF0YSAlZCBmb3IgZW5oZWQgJXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJLdW5uZSBpa2tlIMOmbmRyZSB0aWxzdGFuZCBmb3IgdMOmbmsvc2x1dCBmb3IgZW5oZWQgwrslc8KrLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiS3VubmUgaWtrZSBhbGxva2VyZSBkZW4ga3LDpnZlZGUgaHVrb21tZWxzZS4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiS3VubmUgaWtrZSBhbGxva2VyZSBkZW4ga3LDpnZlZGUgaHVrb21tZWxzZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIktvbnZlcnRlcmluZ3Nwcm9ncmFtIHDDpSBlbmhlZCAlcyBoYXIgaWtrZSBldCB1bmRlcnN0w7h0dGV0IGluZGRhdGFmb3JtYXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIktvbnZlcnRlcmluZ3Nwcm9ncmFtIHDDpSBlbmhlZCAlcyBoYXIgaWtrZSBldCB1bmRlcnN0w7h0dGV0IHVkZGF0YWZvcm1hdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiS29kZXIgcMOlIGVuaGVkICVzIGhhciBpa2tlIGV0IHVuZGVyc3TDuHR0ZXQgaW5kZGF0YWZvcm1hdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIktvZGVyIHDDpSBlbmhlZCAlcyBoYXIgaWtrZSBldCB1bmRlcnN0w7h0dGV0IHVkZGF0YWZvcm1hdCIKKworbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICJLdW5uZSBpa2tlIHN0YXJ0ZSBhZmtvZG5pbmcgYWYgdHLDpWQuIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICJLdW5uZSBpa2tlIGJlaGFuZGxlIGJpbGxlZC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisiRmVqbCB2ZWQgaGVudG5pbmcgYWYgZWdlbnNrYWJlciBmb3IgZW5oZWQgwrslc8KrOiBEZXQgZXIgaWtrZSBlbiB2NDEyIGRyaXZlci4gIgorIktvbnRyb2xsZXIgb20gZGV0IGVyIGVuIHY0MTEgZHJpdmVyLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIkxpc3RuaW5nIGFmIGluZGRhdGEtYXR0cmlidXR0ZXIgZm9yICVkIGkgZW5oZWQgJXMgZmVqbGVkZSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJIZW50bmluZyBhZiBpbmRzdGlsbGluZ2VyIGZvciB0dW5lciAlZCBww6UgZW5oZWQgwrslc8KrIGZlamxlZGUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTGlzdG5pbmcgYWYgc3RhbmRhcmQgcMOlIGVuaGVkIMK7JXPCqyBmZWpsZWRlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiSGVudG5pbmcgYWYga29udHJvbGF0dHJpYnV0dGVyIGZvciBlbmhlZCDCuyVzwqsgZmVqbGVkZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS2FuIGlra2UgaWRlbnRpZmljZXJlIGVuaGVkIMK7JXPCqy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRGV0dGUgZXIgaWtrZSBlbiBlbmhlZHMgwrslc8KrLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIkt1bm5lIGlra2UgdGlsZ8OlIGVuaGVkIMK7JXPCqy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJFbmhlZCDCuyVzwqsgZXIgaWtrZSBlbiBvcHRhZ2VlbmhlZC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIkVuaGVkIMK7JXPCqyBlciBpa2tlIGVuIHVkZGF0YWVuaGVkLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiRW5oZWQgwrslc8KrIGVyIGlra2UgZW4gTTJNLWVuaGVkLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiS3VubmUgaWtrZSBkdXAgZW5oZWQgwrslc8KrIGZvciBsw6ZzbmluZyBvZyBza3Jpdm5pbmcuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJJbmRzdGlsbGluZyBhZiBzdGFuZGFyZCBmb3IgZW5oZWQgwrslc8KrIGZlamxlZGUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS3VubmUgaWtrZSBoZW50ZSBudXbDpnJlbmRlIHR1bmVyLWZyZWt2ZW5zIGZvciBlbmhlZCDCuyVzwqsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIkt1bm5lIGlra2Ugc8OmdHRlIG51dsOmcmVuZGUgdHVuZXItZnJla3ZlbnMgZm9yIGVuaGVkIMK7JXPCqyB0aWwgJWx1IEh6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJLdW5uZSBpa2tlIGhlbnRlIHNpZ25hbHN0eXJrZSBmb3IgZW5oZWQgwrslc8KrLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS3VubmUgaWtrZSBoZW50ZSB2w6ZyZGkgYWYga29udHJvbCAlZCBmb3IgZW5oZWQgwrslc8KrLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS3VubmUgaWtrZSBzw6Z0dGUgdsOmcmRpICVkIHDDpSBrb250cm9sICVkIGZvciBlbmhlZCDCuyVzwqsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiS3VubmUgaWtrZSBoZW50ZSBudXbDpnJlbmRlIGluZGRhdGEgZm9yIGVuaGVkIMK7JXPCqy4gTcOlc2tlIGVyIGRldCBlbiByYWRpb2VuaGVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJLdW5uZSBpa2tlIGhlbnRlIG51dsOmcmVuZGUgdWRkYXRhIGZvciBlbmhlZCDCuyVzwqsuIE3DpXNrZSBlciBkZXQgZW4gcmFkaW9lbmhlZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJLdW5uZSBpa2tlIHPDpnR0ZSB1ZGRhdGEgJWQgZm9yIGVuaGVkICVzLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIsOGbmRyaW5nIGFmIG9wbMO4c25pbmcgdW5kZXIga8O4cnNlbCBlciBlbmRudSBpa2tlIHVuZGVyc3TDuHR0ZXQuIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJLYW4gaWtrZSBmdW5nZXJlIHVkZW4gZXQgdXIiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIkludGVybiBkYXRhc3Ryw7htc2ZlamwuIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAiSW50ZXJuIGRhdGFzdHLDuG1zZmVqbC4iCisKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIkVuaGVkZW4gwrslc8KrIHVuZGVyc3TDuHR0ZXIgaWtrZSB2aWRlb29wdGFnZWxzZSIKZGlmZiAtLWdpdCBhL3BvL2RlLnBvIGIvcG8vZGUucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQzZTJjNgotLS0gL2Rldi9udWxsCisrKyBiL3BvL2RlLnBvCkBAIC0wLDAgKzEsODM3IEBACisjIEdlcm1hbiB0cmFuc2xhdGlvbnMgZm9yIGdzdC1wbHVnaW5zLWdvb2QgMS4zLjkwCisjIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdzdC1wbHVnaW5zLWdvb2QgcGFja2FnZS4KKyMKKyMgUENNID0gUENNCisjIExpbmUtaW4gPSBMaW5lLUVpbmdhbmcKKyMgTGluZS1vdXQgPSBMaW5lLUF1c2dhbmcKKyMgUGlwZWxpbmUgPSBXZWl0ZXJsZWl0dW5nCisjIFN0cmVhbSA9IFN0cm9tCisjIG1peGVyICA9IE1pc2NoZXIKKyMgQ2hyaXN0aWFuIEtpcmJhY2ggPGNocmlzdGlhbi5raXJiYWNoQGdtYWlsLmNvbT4sIDIwMTAsIDIwMTEsIDIwMTIsIDIwMTMsIDIwMTQuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDEuNy4yXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTYtMDItMjIgMjM6NDIrMDEwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogQ2hyaXN0aWFuIEtpcmJhY2ggPGNocmlzdGlhbi5raXJiYWNoQGdtYWlsLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBHZXJtYW4gPHRyYW5zbGF0aW9uLXRlYW0tZGVAbGlzdHMuc291cmNlZm9yZ2UubmV0PlxuIgorIkxhbmd1YWdlOiBkZVxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlBsdXJhbC1Gb3JtczogbnBsdXJhbHM9MjsgcGx1cmFsPShuICE9IDEpO1xuIgorIlgtR2VuZXJhdG9yOiBQb2VkaXQgMS44LjdcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiSmFjay1TZXJ2ZXIgbmljaHQgZ2VmdW5kZW4iCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIkRla29kaWVyZW4gZGVzIEpQRUctQmlsZGVzIHNjaGx1ZyBmZWhsIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICLCuyVzwqsgZHVyY2ggwrslc8KrIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJWZXJiaW5kdW5nIHp1bSBTZXJ2ZXIga29ubnRlIG5pY2h0IGhlcmdlc3RlbGx0IHdlcmRlbiIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJLZWluZSBBZHJlc3NlIGZlc3RnZWxlZ3QuIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJTZXJ2ZXJuYW1lIGtvbm50ZSBuaWNodCBhdWZnZWzDtnN0IHdlcmRlbi4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiRXMga29ubnRlIGtlaW5lIFZlcmJpbmR1bmcgenVtIFNlcnZlciBoZXJnZXN0ZWxsdCB3ZXJkZW4uIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiQXVmYmF1IGVpbmVyIHNpY2hlcm4gVmVyYmluZHVuZyBpc3QgZ2VzY2hlaXRlcnQuIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorIkVpbiBOZXR6d2Vya2ZlaGxlciBpc3QgYXVmZ2V0cmV0ZW4sIG9kZXIgZGVyIFNlcnZlciBzY2hsb3NzIGRpZSBWZXJiaW5kdW5nICIKKyJ1bmVyd2FydGV0LiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiU2VydmVyIGdhYiB1bmVyd2FydGV0ZSBEYXRlbiB6dXJ1zIhjay4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiU3VjaGxhdWYgd2lyZCBuaWNodCB2b20gU2VydmVyIHVudGVyc3TDvHR6dC4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIktlaW4gb2RlciB1bmfDvGx0aWdlciBFaW5nYWJldG9uLCBkZXIgQVZJLVN0cm9tIHdpcmQgZmVobGVyaGFmdCBzZWluLiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAiRGllc2UgRGF0ZWkgZW50aMOkbHQga2VpbmUgYWJzcGllbGJhcmVuIFN0csO2bWUuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJEaWVzZSBEYXRlaSBpc3QgdW5nw7xsdGlnIHVuZCBrYW5uIG5pY2h0IHdpZWRlcmdlZ2ViZW4gd2VyZGVuLiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisiRGVyIFN0cm9tIGthbm4gbmljaHQgd2llZGVyZ2VnZWJlbiB3ZXJkZW4sIHdlaWwgZXIgbWl0IFBsYXlSZWFkeSBEUk0gIgorInZlcnNjaGzDvHNzZWx0IGlzdC4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkRpZXNlIERhdGVpIGlzdCBiZXNjaMOkZGlndCB1bmQga2FubiBuaWNodCB3aWVkZXJnZWdlYmVuIHdlcmRlbi4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIlVuZ8O8bHRpZ2UgQXRvbS1HcsO2w59lLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRGllc2UgRGF0ZWkgaXN0IHVudm9sbHN0w6RuZGlnIHVuZCBrYW5uIG5pY2h0IHdpZWRlcmdlZ2ViZW4gd2VyZGVuLiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiRGFzIFZpZGVvIGluIGRpZXNlciBEYXRlaSB3aXJkIHZpZWxsZWljaHQgbmljaHQga29ycmVrdCB3aWVkZXJnZWdlYmVuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICIiCisiRGllc2UgRGF0ZWkgZW50aMOkbHQgenUgdmllbGUgU3Ryw7ZtZS4gRXMgd2VyZGVuIG51ciBkaWUgZXJzdGVuICVkICIKKyJ3aWVkZXJnZWdlYmVuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJFcyB3dXJkZSBrZWluIHVudGVyc3TDvHR6dGVyIFN0cm9tIGdlZnVuZGVuLiBTaWUgbcO8c3NlbiB2aWVsbGVpY2h0IGVpbiBQbHVnaW4gIgorInp1ciBSVFNQLUVyd2VpdGVydW5nIHZvbiBHU3RyZWFtZXIgZsO8ciDCu1JlYWzCqy1NZWRpZW5zdHLDtm1lIGluc3RhbGxpZXJlbi4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyJFcyB3dXJkZSBrZWluIHVudGVyc3TDvHR6dGVyIFN0cm9tIGdlZnVuZGVuLiBTaWUgbcO8c3NlbiBldmVudHVlbGwgenVzw6R0emxpY2hlICIKKyJUcmFuc3BvcnQtUHJvdG9rb2xsZSBlcmxhdWJlbiBvZGVyIGVzIGZlaGx0IHZpZWxsZWljaHQgZGFzIHJpY2h0aWdlIFBsdWdpbiAiCisienVyIFJUU1AtRXJ3ZWl0ZXJ1bmcuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIkRhcyBBdWRpby1HZXLDpHQga29ubnRlIG5pY2h0IHp1ciBXaWVkZXJnYWJlIGdlw7ZmZm5ldCB3ZXJkZW4uIERhcyBHZXLDpHQgd2lyZCAiCisidm9uIGVpbmVyIGFuZGVyZW4gQW53ZW5kdW5nIHZlcndlbmRldC4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIkRhcyBBdWRpby1HZXLDpHQga29ubnRlIG5pY2h0IHp1ciBXaWVkZXJnYWJlIGdlw7ZmZm5ldCB3ZXJkZW4uIFNpZSBoYWJlbiBuaWNodCAiCisiZGllIEJlcmVjaHRpZ3VuZ2VuIHp1bSDDlmZmbmVuIGRlcyBHZXLDpHRlcy4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiRGFzIEF1ZGlvLUdlcsOkdCBrb25udGUgbmljaHQgenVyIFdpZWRlcmdhYmUgZ2XDtmZmbmV0IHdlcmRlbi4gIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIkRhcyBBdWRpby1HZXLDpHQga29ubnRlIG5pY2h0IHp1ciBXaWVkZXJnYWJlIGdlw7ZmZm5ldCB3ZXJkZW4uIERpZXNlIFZlcnNpb24gIgorImRlcyBPcGVuIFNvdW5kIFN5c3RlbSAoT1NTKSB3aXJkIG5pY2h0IHZvbiBkaWVzZW0gRWxlbWVudCB1bnRlcnN0w7x0enQuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIldpZWRlcmdhYmUgd2lyZCB2b24gZGllc2VtIEF1ZGlvLUdlcsOkdCBuaWNodCB1bnRlcnN0w7x0enQuIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICJGZWhsZXIgYmVpIEF1ZGlvLVdpZWRlcmdhYmUuIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJBdWZuYWhtZSB3aXJkIHZvbiBkaWVzZW0gQXVkaW8tR2Vyw6R0IG5pY2h0IHVudGVyc3TDvHR6dC4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJGZWhsZXIgYmVpbSBBdWZuZWhtZW4gdm9tIEF1ZGlvLUdlcsOkdC4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJEYXMgQXVkaW8tR2Vyw6R0IGtvbm50ZSBuaWNodCB6dXIgQXVmbmFobWUgZ2XDtmZmbmV0IHdlcmRlbi4gU2llIGhhYmVuIG5pY2h0ICIKKyJkaWUgQmVyZWNodGlndW5nZW4genVtIMOWZmZuZW4gZGVzIEdlcsOkdGVzLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiRGFzIEF1ZGlvLUdlcsOkdCBrb25udGUgbmljaHQgenVyIEF1Zm5haG1lIGdlw7ZmZm5ldCB3ZXJkZW4uICIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICJDb3JlQXVkaW8tR2Vyw6R0IG5pY2h0IGdlZnVuZGVuIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICJDb3JlQXVkaW8tR2Vyw6R0IGtvbm50ZSBuaWNodCBnZcO2ZmZuZXQgd2VyZGVuIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAiQXVmbmFobWVxdWVsbGUiCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWtyb2ZvbiIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIkxpbmUtRWluZ2FuZyIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICJJbnRlcm5lIENEIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIlNQRElGLUVpbmdhbmciCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiQVVYLUVpbmdhbmcgMSIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJBVVgtRWluZ2FuZyAyIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIkNvZGVjLVLDvGNrc2NobGVpZmUiCisKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIlN1blZUUy1Sw7xja3NjaGxlaWZlIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJMYXV0c3TDpHJrZSIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIlBlZ2VsIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiTW9uaXRvciIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIkVpbmdlYmF1dGVyIExhdXRzcHJlY2hlciIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiS29wZmjDtnJlciIKKworIyBIaWVyIGlzdCBtaXIgbm9jaCBuaWNodHMgQmVzc2VyZXMgZWluZ2VmYWxsZW4uCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIkF1c2dhbmciCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNQRElGLUF1c2dhbmciCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIkFVWC1BdXNnYW5nIDEiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIkFVWC1BdXNnYW5nIDIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRmVobGVyIGJlaW0gTGVzZW4gdm9uICVkIEJ5dGVzIHZvbiBHZXLDpHQgwrslc8KrLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorIkF1ZnrDpGhsZW4gbcO2Z2xpY2hlciBWaWRlb2Zvcm1hdGUsIG1pdCBkZW5lbiBHZXLDpHQgwrslc8KrIGFyYmVpdGVuIGthbm4sIHNjaGx1ZyAiCisiZmVobCIKKworIyDCu0dlaG9sdMKrIGlzdCBhdWNoIG5vY2ggbmljaHQgb3B0aW1hbCwgYWJlciDCu2FiZ2ViaWxkZXTCqyBnZWh0IGF1Y2ggbmljaHQgd2lya2xpY2guCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJEaWUgUHVmZmVyIGRlcyBHZXLDpHRlcyDCuyVzwqsga29ubnRlbiBuaWNodCBnZWhvbHQgd2VyZGVuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiRGVyIFRyZWliZXIgdm9uIEdlcsOkdCDCuyVzwqsgdW50ZXJzdMO8dHp0IG5pY2h0IGRpZSBFQS1NZXRob2RlICVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiRGVyIFRyZWliZXIgdm9uIEdlcsOkdCDCuyVzwqsgdW50ZXJzdMO8dHp0IGtlaW5lIGJla2FubnRlIEVBLU1ldGhvZGUiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiR2Vyw6R0IMK7JXPCqyBpc3QgYmVsZWd0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJEYXMgR2Vyw6R0IMK7JXPCqyBrYW5uIG5pY2h0IGJlaSAlZHglZCBhdWZuZWhtZW4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIkRhcyBhbmdlZ2ViZW5lIEZvcm1hdCBrYW5uIG5pY2h0IHZvbSBHZXLDpHQgwrslc8KrIGF1c2dlbGVzZW4gd2VyZGVuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIkdlcsOkdCDCuyVzwqsgdW50ZXJzdMO8dHp0IGdldHJlbm50ZSBFYmVuZW4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICJQYXJhbWV0ZXIga29ubnRlbiBuaWNodCB2b24gR2Vyw6R0IMK7JXPCqyBhdXNnZWxlc2VuIHdlcmRlbiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiIgorIkRhcyBWaWRlby1FaW5nYWJlZ2Vyw6R0IGFremVwdGllcnRlIG5pY2h0IGRpZSBuZXVlIEVpbnN0ZWxsdW5nIHp1ciAiCisiQmlsZHdpZWRlcmhvbHVuZ3NyYXRlLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIkRhcyBWaWRlby1HZXLDpHQgZ2FiIGtlaW4gQXVzZ2FiZWZvcm1hdCBhbi4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiRGFzIFZpZGVvLUdlcsOkdCBnYWIgdW5nw7xsdGlnZSBBYm1lc3N1bmdlbiB6dXLDvGNrLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICIiCisiVmlkZW8tR2Vyw6R0ZSB2ZXJ3ZW5kZXQgZWluZSBuaWNodCB1bnRlcnN0w7x0enQgTWV0aG9kZSBkZXIgIgorIlplaWxlbnZlcnNjaGFjaHRlbHVuZy4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiRGFzIFZpZGVvLUdlcsOkdCB2ZXJ3ZW5kZXQgZWluIG5pY2h0IHVudGVyc3TDvHR6dGVzIFBpeGVsZm9ybWF0LiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICJFaW5yaWNodGVuIGRlcyBpbnRlcm5lbiBQdWZmZXItUG9vbHMgaXN0IGZlaGxnZXNjaGxhZ2VuLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiRGFzIFZpZGVvZ2Vyw6R0IGdhYiBrZWluZSBQdWZmZXItR3LDtsOfZSBhbi4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICJFcyBnaWJ0IGtlaW5lbiBEb3duc3RyZWFtLVBvb2wsIGF1cyBkZW0gaW1wb3J0aWVydCB3ZXJkZW4ga2Fubi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJBdXNsZXNlbiBkZXIgRWluc3RlbGx1bmdlbiB2b24gRW1wZsOkbmdlciDCuyVkwqsgYXVmIEdlcsOkdCDCuyVzwqsgc2NobHVnIGZlaGwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZlaGxlciBiZWltIEVybWl0dGVsbiBkZXIgRnVua3Rpb25zbWVya21hbGUgdm9uIEdlcsOkdCDCuyVzwqsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiwrslc8KrIGlzdCBrZWluIEVtcGbDpG5nZXIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiRW1wZmFuZ2VuIGVpbmVzIEZ1bmtzaWduYWxzIGF1ZiBHZXLDpHQgwrslc8KrIHNjaGx1ZyBmZWhsLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkZlc3RsZWdlbiBkZXIgRWluZ2FiZSDCuyVkwqsgZGVzIEdlcsOkdHMgwrslc8KrIHNjaGx1ZyBmZWhsLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiw4RuZGVybiBkZXMgU3R1bW16dXN0YW5kcyB2b24gR2Vyw6R0IMK7JXPCqyBzY2hsdWcgZmVobC4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIkFuZm9yZGVybiBkZXMgYmVuw7Z0aWdlbiBBcmJlaXRzc3BlaWNoZXJzIHNjaGx1ZyBmZWhsLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJBbmZvcmRlcm4gZGVzIGJlbsO2dGlnZW4gQXJiZWl0c3NwZWljaGVycyBzY2hsdWcgZmVobC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiRGVyIFVtd2FuZGxlciBhdWYgR2Vyw6R0ICVzIGhhdCBrZWluIHVudGVyc3TDvHR6dGVzIEVpbmdhYmVmb3JtYXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIkRlciBVbXdhbmRsZXIgYXVmIEdlcsOkdCAlcyBoYXQga2VpbiB1bnRlcnN0w7x0enRlcyBBdXNnYWJlZm9ybWF0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJEZXIgS29kaWVyZXIgYXVmIEdlcsOkdCAlcyBoYXQga2VpbiB1bnRlcnN0w7x0enRlcyBFaW5nYWJlZm9ybWF0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiRGVyIEtvZGllcmVyIGF1ZiBHZXLDpHQgJXMgaGF0IGtlaW4gdW50ZXJzdMO8dHp0ZXMgQXVzZ2FiZWZvcm1hdCIKKworbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICJCZWdpbm4gZGVyIERla29kaWVydW5nIGRlcyBKUEVHLUJpbGRlcyBzY2hsdWcgZmVobCIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiVmVyYXJiZWl0ZW4gZGVzIEVpbnplbGJpbGRzIHNjaGx1ZyBmZWhsLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJGZWhsZXIgYmVpbSBCZXN0aW1tZW4gZGVyIEbDpGhpZ2tlaXRlbiBkZXMgR2Vyw6R0cyDCuyVzwqs6IEVzIGlzdCBrZWluIMK7djRsMsKrLSIKKyJUcmVpYmVyLiDDnGJlcnByw7xmZW4gU2llLCBvYiBlcyBlaW4gwrt2NGwxwqstVHJlaWJlciBpc3QuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiQWJmcmFnZSBkZXIgQXR0cmlidXRlIGRlciBFaW5nYWJlIMK7JWTCqyBpbSBHZXLDpHQgwrslc8KrIHNjaGx1ZyBmZWhsIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJBdXNsZXNlbiBkZXIgRWluc3RlbGx1bmdlbiBkZXIgU2VuZGVyd2FobCDCuyVkwqsgYXVmIEdlcsOkdCDCuyVzwqsgc2NobHVnIGZlaGwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQWJmcmFnZW4gZGVyIE5vcm0gYXVmIEdlcsOkdCDCuyVzwqsgc2NobHVnIGZlaGwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJBYmZyYWdlIGRlciBLb250cm9sbGF0dHJpYnV0ZSBhdWYgR2Vyw6R0IMK7JXPCqyBzY2hsdWcgZmVobC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR2Vyw6R0IMK7JXPCqyBrYW5uIG5pY2h0IGlkZW50aWZpemllcnQgd2VyZGVuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICLCuyVzwqsgaXN0IGtlaW4gR2Vyw6R0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIkdlcsOkdCDCuyVzwqsga29ubnRlIG5pY2h0IHp1bSBMZXNlbiBvZGVyIFNjaHJlaWJlbiBnZcO2ZmZuZXQgd2VyZGVuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIsK7JXPCqyBpc3Qga2VpbiBBdWZuYWhtZWdlcsOkdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIsK7JXPCqyBpc3Qga2VpbiBXaWVkZXJnYWJlZ2Vyw6R0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiR2Vyw6R0IMK7JXPCqyBpc3Qga2VpbiBNMk0tR2Vyw6R0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiR2Vyw6R0IMK7JXPCqyBrb25udGUgbmljaHQgenVtIExlc2VuIG9kZXIgU2NocmVpYmVuIGdlw7ZmZm5ldCB3ZXJkZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJGZXN0bGVnZW4gZGVyIE5vcm0gYXVmIEdlcsOkdCDCuyVzwqsgc2NobHVnIGZlaGwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQXVzbGVzZW4gZGVyIGFrdHVlbGxlbiBTZW5kZWZyZXF1ZW56IGRlcyBHZXLDpHRzIMK7JXPCqyBzY2hsdWcgZmVobC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorIkZlc3RsZWdlbiBkZXIgYWt0dWVsbGVuIFNlbmRlZnJlcXVlbnogZGVzIEdlcsOkdHMgwrslc8KrIGF1ZiAlbHUgSHogc2NobHVnIGZlaGwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkF1c2xlc2VuIGRlciBha3R1ZWxsZW4gU2lnbmFsc3TDpHJrZSBkZXMgR2Vyw6R0cyDCuyVzwqsgc2NobHVnIGZlaGwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJBdXNsZXNlbiBkZXMgV2VydGVzIGRlciBFaW5zdGVsbHVuZyDCuyVkwqsgZGVzIEdlcsOkdHMgwrslc8KrIHNjaGx1ZyBmZWhsLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIkZlc3RsZWdlbiBkZXMgV2VydGVzIMK7JWTCqyBkZXIgRWluc3RlbGx1bmcgwrslZMKrIGRlcyBHZXLDpHRzIMK7JXPCqyBzY2hsdWcgZmVobC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJBdXNsZXNlbiBkZXIgYWt0dWVsbGVuIEVpbmdhYmUgYXVmIGRlbSBHZXLDpHQgwrslc8KrIHNjaGx1ZyBmZWhsLiBWaWVsbGVpY2h0ICIKKyJpc3QgZXMgZWluIEZ1bmtnZXLDpHQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJBdXNsZXNlbiBkZXIgYWt0dWVsbGVuIEF1c2dhYmUgZGVzIEdlcmHMiHRzIMK7JXPCqyBzY2hsdWcgZmVobC4gVmllbGxlaWNodCBpc3QgIgorImVzIGVpbiBGdW5rZ2Vyw6R0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJGZXN0bGVnZW4gZGVyIEF1c2dhYmUgwrslZMKrIGRlcyBHZXJhzIh0cyDCuyVzwqsgc2NobHVnIGZlaGwuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiRWluIFdlY2hzZWwgZGVyIEF1ZmzDtnN1bmcgenVyIExhdWZ6ZWl0IHdpcmQgbm9jaCBuaWNodCB1bnRlcnN0w7x0enQuIgorCisjIFRha3RnZWJlciBrbGluZ3QgZ3V0LgorbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiRXMga2FubiBuaWNodCBvaG5lIGVpbmVuIFRha3RnZWJlciBnZWFyYmVpdGV0IHdlcmRlbi4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIkludGVybmVyIERhdGVuc3Ryb21mZWhsZXIuIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAiSW50ZXJuZXIgRGF0ZW5zdHJvbWZlaGxlci4iCisKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIkdlcsOkdCDCuyVzwqsgdW50ZXJzdMO8dHp0IGtlaW5lIFZpZGVvYXVmbmFobWUiCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc291bmQgc2VydmVyIgorI34gbXNnc3RyICJFcyBrb25udGUga2VpbmUgVmVyYmluZHVuZyB6dW0gQXVkaW8tU2VydmVyIGhlcmdlc3RlbGx0IHdlcmRlbiIKKworI34gbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBzb3VuZCBzZXJ2ZXIgY2FwYWJpbGl0aWVzIgorI34gbXNnc3RyICJBYmZyYWdlIGRlciBGw6RoaWdrZWl0ZW4gZGVzIEF1ZGlvLVNlcnZlcnMgaXN0IGZlaGxnZXNjaGxhZ2VuIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAiQmFzcyIKKworI34gbXNnaWQgIlRyZWJsZSIKKyN+IG1zZ3N0ciAiSMO2aGVuIgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIlN5bnRoIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJMYXV0c3ByZWNoZXIiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICJMaW5lLUVpbmdhbmciCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiQ0QiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAiTWlzY2hlciIKKworI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICJQQ00gMiIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAiQXVmbmFobWUiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICJFaW5nYW5nc3BlZ2VsIgorCisjfiBtc2dpZCAiT3V0LWdhaW4iCisjfiBtc2dzdHIgIkF1c2dhbmdzcGVnZWwiCisKKyN+IG1zZ2lkICJMaW5lLTEiCisjfiBtc2dzdHIgIkVpbmdhbmctMSIKKworI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAiRWluZ2FuZy0yIgorCisjfiBtc2dpZCAiTGluZS0zIgorI34gbXNnc3RyICJFaW5nYW5nLTMiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTEiCisjfiBtc2dzdHIgIkRpZ2l0YWwtMSIKKworI34gbXNnaWQgIkRpZ2l0YWwtMiIKKyN+IG1zZ3N0ciAiRGlnaXRhbC0yIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICJEaWdpdGFsLTMiCisKKyMgTWlrcm9mb24/IFp3ZWlmZWxoYWZ0LiBFaGVyIEtvcGZow7ZyZXIgb2RlciBUZWxlZm9uLgorI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICJNaWtyb2ZvbmVpbmdhbmciCisKKyMgSXN0IGhpZXIgS29wZmjDtnJlciBvZGVyIFRlbGVmb24gZ2VtZWludD8KKyN+IG1zZ2lkICJQaG9uZS1vdXQiCisjfiBtc2dzdHIgIk1pa3JvZm9uYXVzZ2FuZyIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICJWaWRlbyIKKworI34gbXNnaWQgIlJhZGlvIgorI34gbXNnc3RyICJSYWRpbyIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIkRhcyBBdWRpby1HZXLDpHQga29ubnRlIG5pY2h0IGbDvHIgZGFzIE1pc2NocHVsdCBnZcO2ZmZuZXQgd2VyZGVuLiIKKworI34gbXNnaWQgIiIKKyN+ICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIFRoaXMgdmVyc2lvbiBvZiAiCisjfiAidGhlIE9wZW4gU291bmQgU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkRhcyBBdWRpby1HZXLDpHQga29ubnRlIG5pY2h0IGbDvHIgZGFzIE1pc2NocHVsdCBnZcO2ZmZuZXQgd2VyZGVuLiBEaWVzZSAiCisjfiAiVmVyc2lvbiBkZXMgT3BlbiBTb3VuZCBTeXN0ZW0gKE9TUykgd2lyZCBuaWNodCB1bnRlcnN0w7x0enQuIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICJIYXVwdHJlZ2xlciIKKworI34gbXNnaWQgIkZyb250IgorI34gbXNnc3RyICJGcm9udCIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIkF1Zm5haG1lUsO8Y2tzZWl0ZSIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIktvcGZow7ZyZXIiCisKKyN+IG1zZ2lkICJDZW50ZXIiCisjfiBtc2dzdHIgIk1pdHRlIgorCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICJMRkUiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAiU3Vycm91bmQiCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICJTZWl0ZSIKKworI34gbXNnaWQgIkFVWCBPdXQiCisjfiBtc2dzdHIgIkFVWC1BdXNnYW5nIgorCisjfiBtc2dpZCAiM0QgRGVwdGgiCisjfiBtc2dzdHIgIjNELVRpZWZlIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICIzRC1NaXR0ZSIKKworI34gbXNnaWQgIjNEIEVuaGFuY2UiCisjfiBtc2dzdHIgIkVyd2VpdGVydGVzIDNEIgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICJUZWxlZm9uIgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgIlZpZGVvLUVpbmdhbmciCisKKyN+IG1zZ2lkICJBVVggSW4iCisjfiBtc2dzdHIgIkFVWC1FaW5nYW5nIgorCisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIkF1Zm5haG1lcGVnZWwiCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAiQXVzZ2FuZ3NwZWdlbCIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgQm9vc3QiCisjfiBtc2dzdHIgIk1pa3JvZm9udmVyc3TDpHJrdW5nIgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAiWnVyIERpYWdub3NlIgorCisjfiBtc2dpZCAiQmFzcyBCb29zdCIKKyN+IG1zZ3N0ciAiQmFzc3ZlcnN0w6Rya3VuZyIKKworI34gbXNnaWQgIlBsYXliYWNrIFBvcnRzIgorI34gbXNnc3RyICJXaWVkZXJnYWJlLVBvcnRzIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIkVpbmdhbmciCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAiw5xiZXJ3YWNodW5nc3F1ZWxsZSIKKworI34gbXNnaWQgIktleWJvYXJkIEJlZXAiCisjfiBtc2dzdHIgIlRhc3RhdHVyLVBpZXBzZW4iCisKKyN+IG1zZ2lkICJTaW11bGF0ZSBTdGVyZW8iCisjfiBtc2dzdHIgIlN0ZXJlbyBzaW11bGllcmVuIgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICJTdGVyZW8iCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAiU3Vycm91bmQtQXVkaW8iCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIk1pa3JvZm9ucGVnZWwiCisKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTGF1dHNwcmVjaGVycXVlbGxlIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgIk1pa3JvZm9ucXVlbGxlIgorCisjfiBtc2dpZCAiSmFjayIKKyN+IG1zZ3N0ciAiU3RlY2tlciIKKworI34gbXNnaWQgIkNlbnRlciAvIExGRSIKKyN+IG1zZ3N0ciAiTWl0dGUgLyBMRkUiCisKKyN+IG1zZ2lkICJTdGVyZW8gTWl4IgorI34gbXNnc3RyICJTdGVyZW8tTWlzY2hwdWx0IgorCisjfiBtc2dpZCAiTW9ubyBNaXgiCisjfiBtc2dzdHIgIk1vbm8tTWlzY2hwdWx0IgorCisjfiBtc2dpZCAiSW5wdXQgTWl4IgorI34gbXNnc3RyICJFaW5nYW5ncy1NaXNjaHB1bHQiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDEiCisjfiBtc2dzdHIgIk1pa3JvZm9uIDEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDIiCisjfiBtc2dzdHIgIk1pa3JvZm9uIDIiCisKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAiRGlnaXRhbC1BdXNnYW5nIgorCisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAiRGlnaXRhbC1FaW5nYW5nIgorCisjfiBtc2dpZCAiSERNSSIKKyN+IG1zZ3N0ciAiSERNSSIKKworI34gbXNnaWQgIk1vZGVtIgorI34gbXNnc3RyICJNb2RlbSIKKworI34gbXNnaWQgIkhhbmRzZXQiCisjfiBtc2dzdHIgIkjDtnJlciIKKworI34gbXNnaWQgIk90aGVyIgorI34gbXNnc3RyICJBbmRlcmVzIgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAiS2VpbiIKKworI34gbXNnaWQgIk9uIgorI34gbXNnc3RyICJBa3RpdmllcnQiCisKKyN+IG1zZ2lkICJPZmYiCisjfiBtc2dzdHIgIkRlYWt0aXZpZXJ0IgorCisjfiBtc2dpZCAiTXV0ZSIKKyN+IG1zZ3N0ciAiU3R1bW0iCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICJTY2huZWxsIgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgIlNlaHIgbmllZHJpZyIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAiTmllZHJpZyIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAiTWVkaXVtIgorCisjfiBtc2dpZCAiSGlnaCIKKyN+IG1zZ3N0ciAiSG9jaCIKKworI34gbXNnaWQgIlZlcnkgSGlnaCIKKyN+IG1zZ3N0ciAiU2VociBob2NoIgorCisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAiUHJvZHVrdGlvbiIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIk1pa3JvZm9uIGFtIFZvcmRlcmVpbmdhbmciCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICJMaW5lLUVpbmdhbmcgYW0gVm9yZGVyZWluZ2FuZyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIEhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIktvcGZow7ZyZXIgYW0gVm9yZGVyZWluZ2FuZyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICJMaW5lLUF1c2dhbmcgYW0gVm9yZGVyZWluZ2FuZyIKKworI34gbXNnaWQgIkdyZWVuIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiR3LDvG5lciBTdGVja2VyIgorCisjfiBtc2dpZCAiUGluayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlJvc2EgU3RlY2tlciIKKworI34gbXNnaWQgIkJsdWUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJCbGF1ZXIgU3RlY2tlciIKKworI34gbXNnaWQgIldoaXRlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiV2Vpw59lciBTdGVja2VyIgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICJTY2h3YXJ6ZXIgU3RlY2tlciIKKworI34gbXNnaWQgIkdyYXkgQ29ubmVjdG9yIgorI34gbXNnc3RyICJHcmF1ZXIgU3RlY2tlciIKKworI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk9yYW5nZXIgU3RlY2tlciIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlJvdGVyIFN0ZWNrZXIiCisKKyN+IG1zZ2lkICJZZWxsb3cgQ29ubmVjdG9yIgorI34gbXNnc3RyICJHZWxiZXIgU3RlY2tlciIKKworI34gbXNnaWQgIkdyZWVuIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiR3LDvG5lciBTdGVja2VyIGFtIFZvcmRlcmVpbmdhbmciCisKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUm9zYSBTdGVja2VyIGFtIFZvcmRlcmVpbmdhbmciCisKKyN+IG1zZ2lkICJCbHVlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQmxhdWVyIFN0ZWNrZXIgYW0gVm9yZGVyZWluZ2FuZyIKKworI34gbXNnaWQgIldoaXRlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiV2Vpw59lciBTdGVja2VyIGFtIFZvcmRlcmVpbmdhbmciCisKKyN+IG1zZ2lkICJCbGFjayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlNjaHdhcnplciBTdGVja2VyIGFtIFZvcmRlcmVpbmdhbmciCisKKyN+IG1zZ2lkICJHcmF5IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiR3JhdWVyIFN0ZWNrZXIgYW0gVm9yZGVyZWluZ2FuZyIKKworI34gbXNnaWQgIk9yYW5nZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk9yYW5nZXIgU3RlY2tlciBhbSBWb3JkZXJlaW5nYW5nIgorCisjfiBtc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUm90ZXIgU3RlY2tlciBhbSBWb3JkZXJlaW5nYW5nIgorCisjfiBtc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiR2VsYmVyIFN0ZWNrZXIgYW0gVm9yZGVyZWluZ2FuZyIKKworI34gbXNnaWQgIlNwcmVhZCBPdXRwdXQiCisjfiBtc2dzdHIgIkF1c2dhYmUgdmVyc3RyZXVlbiIKKworI34gbXNnaWQgIkRvd25taXgiCisjfiBtc2dzdHIgIkhlcnVudGVybWlzY2hlbiIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIkVpbmdhbmcgZGVzIHZpcnR1ZWxsZW4gTWlzY2hwdWx0cyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgT3V0cHV0IgorI34gbXNnc3RyICJBdXNnYW5nIGRlcyB2aXJ0dWVsbGVuIE1pc2NocHVsdHMiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICJLYW7DpGxlIGRlcyB2aXJ0dWVsbGVuIE1pc2NocHVsdHMiCisKKyN+IG1zZ2lkICIlcyAlZCBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMgJWQgRnVuY3Rpb24iCisKKyN+IG1zZ2lkICIlcyBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMtRnVua3Rpb24iCisKKyMgwrtGcmFtZcKrIHNvbGx0ZW4gd2lyIGltIFp1c2FtbWVuaGFuZyBtaXQgVmlkZW9zIHZpZWxsZWljaHQgYmVzc2VyIHNvIGJlbGFzc2VuLiBIYWJlIGljaCBpbiBnbm9tZS1zdWJ0aXRsZXMgYXVjaCBzbyBnZW1hY2h0LgorI34gbXNnaWQgIkdvdCB1bmV4cGVjdGVkIGZyYW1lIHNpemUgb2YgJXUgaW5zdGVhZCBvZiAldS4iCisjfiBtc2dzdHIgIlVuZXJ3YXJ0ZXRlIEZyYW1lLUdyw7bDn2Ugdm9uICV1IGFuc3RhdHQgJXUgd3VyZGUgZXJoYWx0ZW4uIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkZlaGxlciBiZWltIExlc2VuIHZvbiAlZCBCeXRlcyBhdWYgR2Vyw6R0IMK7JXPCqy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZW5xdWV1ZSBidWZmZXJzIGluIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiQXVmIEdlcsOkdCDCuyVzwqsga29ubnRlbiBrZWluZSBQdWZmZXIgZWluZ2VyZWlodCB3ZXJkZW4uIgorCisjfiBtc2dpZCAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJEZXIgVmVyc3VjaCBWaWRlb2JpbGRlciB2b24gR2Vyw6R0IMK7JXPCqyBhdXN6dWxlc2VuIHNjaGx1ZyBmZWhsLiIKKworI34gbXNnaWQgIkZhaWxlZCBhZnRlciAlZCB0cmllcy4gZGV2aWNlICVzLiBzeXN0ZW0gZXJyb3I6ICVzIgorI34gbXNnc3RyICIlZCBWZXJzdWNoZSBzaW5kIGZlaGxnZXNjaGxhZ2VuLiBHZXLDpHQgwrslc8KrLiBTeXN0ZW1mZWhsZXI6ICVzIgorCisjfiBtc2dpZCAiIgorI34gIlRoZSBidWZmZXIgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCBvciB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcywgb3Igbm8gIgorI34gImJ1ZmZlcnMgaGF2ZSBiZWVuIGFsbG9jYXRlZCB5ZXQsIG9yIHRoZSB1c2VycHRyIG9yIGxlbmd0aCBhcmUgaW52YWxpZC4gIgorI34gImRldmljZSAlcyIKKyN+IG1zZ3N0ciAiIgorI34gIkRlciBQdWZmZXJ0eXAgd2lyZCBuaWNodCB1bnRlcnN0w7x0enQsIGRlciBJbmRleCBpc3QgYXXDn2VyaGFsYiBzZWluZXIgIgorI34gIkdyZW56d2VydGUsIGVzIHNpbmQgYmlzaGVyIG5vY2gga2VpbmUgUHVmZmVyIGFuZ2Vmb3JkZXJ0IHdvcmRlbiBvZGVyICIKKyN+ICLCu3VzZXJwdHLCqyBvZGVyIGRpZSBMw6RuZ2Ugc2luZCB1bmfDvGx0aWcuIEdlcsOkdCDCuyVzwqsiCisKKyN+IG1zZ2lkICIiCisjfiAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIE5vdCBlbm91Z2ggbWVtb3J5LiIKKyN+IG1zZ3N0ciAiIgorI34gIkRlciBWZXJzdWNoIFZpZGVvYmlsZGVyIHZvbiBHZXLDpHQgwrslc8KrIGF1c3p1bGVzZW4gc2NobHVnIGZlaGwuIE5pY2h0ICIKKyN+ICJnZW51ZyBBcmJlaXRzc3BlaWNoZXIuIgorCisjIFdhcyBpc3QgZWluIFplaWdlcnB1ZmZlcj8KKyMsIGZ1enp5CisjfiBtc2dpZCAiaW5zdWZmaWNpZW50IG1lbW9yeSB0byBlbnF1ZXVlIGEgdXNlciBwb2ludGVyIGJ1ZmZlci4gZGV2aWNlICVzLiIKKyN+IG1zZ3N0ciAiIgorI34gIlVuZ2Vuw7xnZW5kIEFyYmVpdHNzcGVpY2hlciwgdW0gZWluZW4gWmVpZ2VycHVmZmVyIGVpbmVzIEJlbnV0emVycyAiCisjfiAiZWluenVyZWloZW4uIEdlcsOkdCDCuyVzwqsuIgorCisjfiBtc2dpZCAiTm8gZnJlZSBidWZmZXJzIGZvdW5kIGluIHRoZSBwb29sIGF0IGluZGV4ICVkLiIKKyN+IG1zZ3N0ciAiRXMgd3VyZGVuIGtlaW5lIGZyZWllbiBQdWZmZXIgaW0gVm9ycmF0IGJlaSBJbmRleCAlZCBnZWZ1bmRlbi4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZ2V0IGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkRpZSBQdWZmZXIga29ubnRlbiBuaWNodCB2b24gR2Vyw6R0IMK7JXPCqyBhdXNnZWxlc2VuIHdlcmRlbi4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZ2V0IGVub3VnaCBidWZmZXJzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJFcyBrb25udGVuIG5pY2h0IGdlbnVnIFB1ZmZlciB2b24gR2Vyw6R0IMK7JXPCqyBhdXNnZWxlc2VuIHdlcmRlbi4iCmRpZmYgLS1naXQgYS9wby9lbC5wbyBiL3BvL2VsLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNTAxNzkKLS0tIC9kZXYvbnVsbAorKysgYi9wby9lbC5wbwpAQCAtMCwwICsxLDgwNiBAQAorIyBHcmVlayB0cmFuc2xhdGlvbiBmb3IgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlIG9mIEdTdHJlYW1lciBwcm9qZWN0LgorIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgR1N0cmVhbWVyIGNvcmUgdGVhbQorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIyBTaW1vcyBYZW5pdGVsbGlzIDxzaW1vcy5saXN0c0Bnb29nbGVtYWlsLmNvbT4sIDIwMDkuCisjIE1pY2hhZWwgS290c2FyaW5pcyA8bWs3MzYyOEBnbWFpbC5jb20+LCAyMDEwCisjIFNhdnZhcyBSYWRldmljIDx2aWNlZGFyQGdtYWlsLmNvbT4sIDIwMTIuCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDAuMTAuMjguMlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDEyLTA1LTA1IDE5OjA1KzAxMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IFNhdnZhcyBSYWRldmljIDx2aWNlZGFyQGdtYWlsLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBHcmVlayA8dGVhbUBsaXN0cy5nbm9tZS5ncj5cbiIKKyJMYW5ndWFnZTogZWxcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJYLUJ1Z3M6IFJlcG9ydCB0cmFuc2xhdGlvbiBlcnJvcnMgdG8gdGhlIExhbmd1YWdlLVRlYW0gYWRkcmVzcy5cbiIKKyJYLUdlbmVyYXRvcjogTG9rYWxpemUgMC4zXG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0yOyBwbHVyYWw9KG4gIT0gMSk7XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAizpHPgM6/z4TPhc+Hzq/OsSDOsc+Azr/Ous+JzrTOuc66zr/PgM6/zq/Ot8+DzrfPgiDPhM63z4IgzrXOuc66z4zOvc6xz4IgSlBFRyIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiJyVzJyDOsc+Az4wgJyVzJyIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAizpTOtc69IM6uz4TOsc69IM60z4XOvc6xz4TOriDOtyDPg8+Nzr3OtM61z4POtyDOvM61IM+Ezr/OvSDOtM65zrHOus6/zrzOuc+Dz4TOriIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICLOlM61zr0gzr/Pgc6vz4POuM63zrrOtSBVUkwuIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICLOlM61zr0gzq7PhM6xzr0gzrTPhc69zrHPhM+Mz4Igzr8gz4DPgc6/z4POtM65zr/Pgc65z4POvM+Mz4Igz4TOv8+FIM6/zr3PjM68zrHPhM6/z4Igz4TOv8+FIM60zrnOsc66zr/OvM65z4PPhM6uLiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICLOlM61zr0gzq7PhM6xzr0gzrTPhc69zrHPhM6uIM63IM+Dz43Ovc60zrXPg863IM68zrUgz4TOv869IM60zrnOsc66zr/OvM65z4PPhM6uLiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIs6Rz4DOv8+Ez4XPh86vzrEgzrXOus66zq/Ovc63z4POt8+CIM6xz4PPhs6xzrvOv8+Nz4Igz4PPjc69zrTOtc+DzrfPgi4iCisKKyMsIGZ1enp5Cittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorIs6gz4HOv86tzrrPhc+IzrUgzq3Ovc6xIM+Dz4bOrM67zrzOsSDOtM65zrrPhM+Nzr/PhSDOriDOvyDOtM65zrHOus6/zrzOuc+Dz4TOrs+CIM6tzrrOu861zrnPg861IM6+zrHPhs69zrnOus6sIM+Ezrcgz4PPjc69zrTOtc+DzrcuIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICLOnyDOtM65zrHOus6/zrzOuc+Dz4TOrs+CIM6tz4PPhM61zrnOu861IM67zqzOuM6/z4IgzrTOtc60zr/OvM6tzr3OsS4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAizp8gzrTOuc6xzrrOv868zrnPg8+Ezq7PgiDOtM61zr0gz4XPgM6/z4PPhM63z4HOr862zrXOuSDOsc69zrHOts6uz4TOt8+DzrcuIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICLOms6xzrzOr86xIM6uIM6szrrPhc+BzrcgzrXOuc+DzrHOs8+JzrPOriDOrs+Hzr/PhSwgzrcgQVZJIM+Bzr/OriDOuM6xIM66zrHPhM6xz4HPgc61z43Pg861zrkuIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICLOkc+Fz4TPjCDPhM6/IM6xz4HPh861zq/OvyDOtM61zr0gz4DOtc+BzrnOrc+HzrXOuSDOsc69zrHPgM6xz4HOsc6zz47Os865zrzOtc+CIM+Bzr/Orc+CLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAizqTOvyDOsc+Bz4fOtc6vzr8gzrHPhc+Ez4wgzrTOtc69IM61zq/Ovc6xzrkgzq3Os866z4XPgc6/IM66zrHOuSDOtM61zr0gzrzPgM6/z4HOtc6vIM69zrEgzrHOvc6xz4DOsc+BzrHPh864zrXOry4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICLOpM6/IM6xz4HPh861zq/OvyDOsc+Fz4TPjCDOtc6vzr3Osc65IM66zrHPhM61z4PPhM+BzrHOvM68zq3Ovc6/IM66zrHOuSDOtM61zr0gzrzPgM6/z4HOtc6vIM69zrEgzrHOvc6xz4DOsc+BzrHPh864zrXOry4gIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICLOhs66z4XPgc6/IM68zq3Os861zrjOv8+CIM6xz4TPjM68zr/PhS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIs6kzr8gzrHPgc+HzrXOr86/IM6xz4XPhM+MIM61zq/Ovc6xzrkgzrHOvc6/zrvOv866zrvOrs+Bz4nPhM6/IM66zrHOuSDOtM61zr0gzrzPgM6/z4HOtc6vIM69zrEgzrHOvc6xz4DOsc+BzrHPh864zrXOry4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIs6kzr8gzrLOr869z4TOtc6/IM+DzrUgzrHPhc+Ez4wgz4TOvyDOsc+Bz4fOtc6vzr8gzrzPgM6/z4HOtc6vIM69zrEgzrzOt869IM6xzr3Osc+AzrHPgc6xz4fOuM61zq8gz4PPic+Dz4TOrC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAizpHPhc+Ez4wgz4TOvyDOsc+Bz4fOtc6vzr8gz4DOtc+BzrnOrc+HzrXOuSDPgM6/zrvOu86tz4Igz4HOv86tz4IuIM6Rzr3Osc+AzrHPgc6szrPOtc+EzrHOuSDOvM+Mzr3OvyDOtyDPgM+Bz47PhM63ICVkIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyLOlM61zr0gzrLPgc6tzrjOt866zrUgzrrOsc68zq/OsSDPhc+Azr/Pg8+EzrfPgc65zrbPjM68zrXOvc63IM+Bzr/Ori4gzpXOr869zrHOuSDPgM65zrjOsc69z4zOvSDOvc6xIM+Az4HOrc+AzrXOuSDOvc6xIM66zqzOvc61z4TOtSAiCisizrXOs866zrHPhM6sz4PPhM6xz4POtyDOrc69zrEgz4DPgc+Mz4POuM61z4TOvyBHU3RyZWFtZXIgUlRTUCDOs865zrEgz4TOuc+CIM+Bzr/Orc+CIFJlYWwgzrzOrc+Dz4nOvS4gIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisizpTOtc69IM6yz4HOrc64zrfOus61IM66zrHOvM6vzrEgz4XPgM6/z4PPhM63z4HOuc62z4zOvM61zr3OtyDPgc6/zq4uIM6Vzq/Ovc6xzrkgz4DOuc64zrHOvc+Mzr0gzr3OsSDPh8+BzrXOuc6xz4POuM61zq8gzr3OsSAiCisizrXPgM65z4TPgc6tz4jOtc+EzrUgz4DOtc+BzrnPg8+Dz4zPhM61z4HOsSDPgM+Bz4nPhM+MzrrOv867zrvOsSDOvM61z4TOsc6zz4nOs86uz4Igzq4gzrHOu867zrnPjs+CIM69zrEgz4POsc+CIM67zrXOr8+AzrXOuSDPhM6/IM+Dz4nPg8+Ez4wgIgorIs+Az4HPjM+DzrjOtc+Ezr8gUlRTUCDPhM6/z4UgR1N0cmVhbWVyLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyLOlM61zr0gzq7PhM6xzr0gzrTPhc69zrHPhM+MIM+Ezr8gzqzOvc6/zrnOs868zrEgz4TOt8+CIM+Dz4XPg866zrXPhc6uz4Igzq7Ph86/z4UgzrPOuc6xIM6xzr3Osc+AzrHPgc6xzrPPic6zzq4uIM6XIM+Dz4XPg866zrXPhc6uICIKKyLPh8+BzrfPg865zrzOv8+Azr/Ouc61zq/PhM6xzrkgzrHPgM+MIM68zrnOsSDOrM67zrvOtyDOtc+GzrHPgc68zr/Os86uLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisizpTOtc69IM6uz4TOsc69IM60z4XOvc6xz4TPjCDPhM6/IM6szr3Ov865zrPOvM6xIM+EzrfPgiDPg8+Fz4POus61z4XOrs+CIM6uz4fOv8+FIM6zzrnOsSDOsc69zrHPgM6xz4HOsc6zz4nOs86uLiDOlM61zr0gzq3Ph861z4TOtSDPhM6xICIKKyLOtM65zrrOsc65z47OvM6xz4TOsSDOvc6xIM6xzr3Ov86vzr7Otc+EzrUgz4TOt869IM+Dz4XPg866zrXPhc6uLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICLOlM61zr0gzq7PhM6xzr0gzrTPhc69zrHPhM+MIM+Ezr8gzqzOvc6/zrnOs868zrEgz4TOt8+CIM+Dz4XPg866zrXPhc6uz4Igzq7Ph86/z4UgzrPOuc6xIM6xzr3Osc+AzrHPgc6xzrPPic6zzq4uICIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyLOlM61zr0gzq7PhM6xzr0gzrTPhc69zrHPhM+MIM+Ezr8gzqzOvc6/zrnOs868zrEgz4TOt8+CIM+Dz4XPg866zrXPhc6uz4Igzq7Ph86/z4UgzrPOuc6xIM6xzr3Osc+AzrHPgc6xzrPPic6zzq4uIM6Rz4XPhM6uIM63IM6tzrrOtM6/z4POtyAiCisiz4TOv8+FIE9wZW4gU291bmQgU3lzdGVtIM60zrXOvSDPhc+Azr/Pg8+EzrfPgc6vzrbOtc+EzrHOuSDOsc+Az4wgzrHPhc+Ez4wgz4TOvyDPg8+Ezr/Ouc+HzrXOr86/LiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLOkc+Fz4TOriDOtyDPg8+Fz4POus61z4XOriDOrs+Hzr/PhSDOtM61zr0gz4XPgM6/z4PPhM63z4HOr862zrXOuSDOsc69zrHPgM6xz4HOsc6zz4nOs86uLiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAizqPPhs6szrvOvM6xIM6xzr3Osc+AzrHPgc6xzrPPic6zzq7PgiDOrs+Hzr/PhSIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAizpHPhc+Ezq4gzrcgz4PPhc+DzrrOtc+Fzq4gzq7Ph86/z4UgzrTOtc69IM+Fz4DOv8+Dz4TOt8+Bzq/Ots61zrkgzrXOs86zz4HOsc+Gzq4uIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAizqPPhs6szrvOvM6xIM66zrHPhM6sIM+EzrfOvSDOtc6zzrPPgc6xz4bOriDOsc+Az4wgz4TOtyDPg8+Fz4POus61z4XOriDOrs+Hzr/PhS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyLOlM61zr0gzq7PhM6xzr0gzrTPhc69zrHPhM+MIM+Ezr8gzqzOvc6/zrnOs868zrEgz4TOt8+CIM+Dz4XPg866zrXPhc6uz4Igzq7Ph86/z4UgzrPOuc6xIM61zrPOs8+BzrHPhs6uLiDOlM61zr0gzq3Ph861z4TOtSDPhM6xICIKKyLOtM65zrrOsc65z47OvM6xz4TOsSDOvc6xIM6xzr3Ov86vzr7Otc+EzrUgz4TOt869IM+Dz4XPg866zrXPhc6uLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAizpTOtc69IM6uz4TOsc69IM60z4XOvc6xz4TPjCDPhM6/IM6szr3Ov865zrPOvM6xIM+EzrfPgiDPg8+Fz4POus61z4XOrs+CIM6uz4fOv8+FIM6zzrnOsSDOtc6zzrPPgc6xz4bOri4gIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAizqDOt86zzq4gzrXOs86zz4HOsc+Gzq7PgiIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIs6czrnOus+Bz4zPhs+Jzr3OvyIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIs6Vzq/Pg86/zrTOv8+CIM6zz4HOsc68zrzOrs+CIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIs6Vz4PPic+EzrXPgc65zrrPjCBDRCIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICLOlc6vz4POtM6/z4IgU1BESUYiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAizpXOr8+Dzr/OtM65z4IgQVVYIDEiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAizpXOr8+Dzr/OtM6/z4IgQVVYIDIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIs6Rzr3Osc+Ez4HOv8+Gzr/OtM+Mz4TOt8+DzrciCisKKyMsIGZ1enp5Cittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICLOkc69zrHPhM+Bzr/Phs6/zrTPjM+EzrfPg863IgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICLOiM69z4TOsc+DzrciCisKK21zZ2lkICJHYWluIgorbXNnc3RyICLOms6tz4HOtM6/z4IiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICLOn864z4zOvc63IgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAizpXOvc+Dz4nOvM6xz4TPic68zq3Ovc6/IM68zrXOs86sz4bPic69zr8iCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIs6RzrrOv8+Fz4PPhM65zrrPjCIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICLOk8+BzrHOvM68zq4gzrXOvs+MzrTOv8+FIgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJTUERJRiBPdXQiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIkFVWCAxIE91dCIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiQVVYIDIgT3V0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIs6jz4bOrM67zrzOsSDOus6xz4TOrCDPhM63zr0gzrHOvc6szrPOvc+Jz4POtyAlZCBieXRlcyDOsc+Azr8gz4TOt869IM+Dz4XPg866zrXPhc6uICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIs6RzrTPhc69zrHOvM6vzrEgz4fOsc+Bz4TOv86zz4HOrM+GzrfPg863z4IgYnVmZmVyIM6zzrnOsSDPhM63IM+Dz4XPg866zrXPhc6uICclcyciCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICLOnyDOv860zrfOs8+Mz4Igz4TOt8+CIM+Dz4XPg866zrXPhc6uz4IgJyVzJyDOtM61zr0gz4XPgM6/z4PPhM63z4HOr862zrXOuSDOus6sz4DOv865zrEgzrPOvc+Jz4PPhM6uIM68zq3OuM6/zrTOvyDOu86uz4jOt8+CLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICLOnyDOv860zrfOs8+Mz4Igz4TOt8+CIM+Dz4XPg866zrXPhc6uz4IgJyVzJyDOtM61zr0gz4XPgM6/z4PPhM63z4HOr862zrXOuSDOus6sz4DOv865zrEgzrPOvc+Jz4PPhM6uIM68zq3OuM6/zrTOvyDOu86uz4jOt8+CLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICLOlyDPg8+Fz4POus61z4XOriAnJXMnIM60zrXOvSDOtc6vzr3Osc65IM68zrnOsSDPg8+Fz4POus61z4XOriDOu86uz4jOt8+CLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIs6XIM+Dz4XPg866zrXPhc6uICclcycgzrTOtc69IM61zq/Ovc6xzrkgzrzOuc6xIM+Dz4XPg866zrXPhc6uIM67zq7PiM63z4IuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIs6UzrXOvSDOrs+EzrHOvSDOtM+Fzr3Osc+Ezq4gzrcgzrHOvc6szrPOvc+Jz4POtyDPhM+Jzr0gz4DOsc+BzrHOvM6tz4TPgc+Jzr0gz4PPhM63zr0gz4PPhc+DzrrOtc+Fzq4gJyVzJyIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIs6XIM+Dz4XPg866zrXPhc6uIM61zrnPg8+MzrTOv8+FIM6yzq/Ovc+EzrXOvyDOtM61zr0gzrHPgM6/zrTOrc+HzrjOt866zrUgz4TOtyDOvc6tzrEgz4HPjc64zrzOuc+Dzrcgz4TOsc+Hz43PhM63z4TOsc+CIM66zrHPgc6tLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICLOlyDPg8+Fz4POus61z4XOriDOtc65z4PPjM60zr/PhSDOss6vzr3PhM61zr8gzrTOtc69IM6xz4DOv860zq3Ph864zrfOus61IM+Ezrcgzr3Orc6xIM+Bz43OuM68zrnPg863IM+EzrHPh8+Nz4TOt8+EzrHPgiDOus6xz4HOrS4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIs6fIM6/zrTOt86zz4zPgiDPhM63z4Igz4PPhc+DzrrOtc+Fzq7PgiAnJXMnIM60zrXOvSDPhc+Azr/Pg8+EzrfPgc6vzrbOtc65IM66zqzPgM6/zrnOsSDOs869z4nPg8+Ezq4gzrzOrc64zr/OtM6/IM67zq7PiM63z4IuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIs6XIM+Dz4XPg866zrXPhc6uIM61zrnPg8+MzrTOv8+FIM6yzq/Ovc+EzrXOvyDOtM61zr0gzrHPgM6/zrTOrc+HzrjOt866zrUgz4TOtyDOvc6tzrEgz4HPjc64zrzOuc+Dzrcgz4TOsc+Hz43PhM63z4TOsc+CIM66zrHPgc6tLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIs6Rz4DOv8+Ez4XPh86vzrEgzrHOvc6szrPOvc+Jz4POt8+CIM+Ez4nOvSDPgc+FzrjOvM6vz4POtc+Jzr0gzrTOrc66z4TOtyAlZCDPg8+EzrfOvSDPg8+Fz4POus61z4XOriAnJXMnLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAizqPPhs6szrvOvM6xIM66zrHPhM6sIM+EzrfOvSDOsc69zqzOs869z4nPg863ICVkIGJ5dGVzIM6xz4DOvyDPhM63zr0gz4PPhc+DzrrOtc+Fzq4gJyVzJy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAizpcgz4PPhc+DzrrOtc+Fzq4gJyVzJyDOtM61zr0gzrXOr869zrHOuSDPg8+Fz4POus61z4XOriDOtc6+z4zOtM6/z4UuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIs6Rz4DOv8+Ez4XPh86vzrEgz4HPjc64zrzOuc+DzrfPgiDOtc65z4POsc6zz4nOs86uz4IgJWQgz4PPhM63zr0gz4PPhc+DzrrOtc+Fzq4gJXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAizpHPgM6/z4TPhc+Hzq/OsSDPgc+NzrjOvM65z4POt8+CIM61zrnPg86xzrPPic6zzq7PgiAlZCDPg8+EzrfOvSDPg8+Fz4POus61z4XOriAlcy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLOkc+Azr/PhM+Fz4fOr86xIM6xzr3OrM6zzr3Pic+DzrfPgiDOuc+Dz4fPjc+CIM+Dzq7OvM6xz4TOv8+CIM6zzrnOsSDPhM63zr0gz4PPhc+DzrrOtc+Fzq4gJyVzJy4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIs6fIM6/zrTOt86zz4zPgiDPhM63z4Igz4PPhc+DzrrOtc+Fzq7PgiAnJXMnIM60zrXOvSDPhc+Azr/Pg8+EzrfPgc6vzrbOtc65IM66zqzPgM6/zrnOsSDOs869z4nPg8+Ezq4gzrzOrc64zr/OtM6/IM67zq7PiM63z4IuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAizpHPgM6/z4TPhc+Hzq/OsSDOsc+Azr/Ous+JzrTOuc66zr/PgM6/zq/Ot8+DzrfPgiDPhM63z4IgzrXOuc66z4zOvc6xz4IgSlBFRyIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIs6jz4bOrM67zrzOsSDOus6xz4TOrCDPhM63IM67zq7PiM63IM60z4XOvc6xz4TOv8+Ezq7PhM+Jzr0gz4TOt8+CIM+Dz4XPg866zrXPhc6uz4IgJyVzJzogzpTOtc69IM61zq/Ovc6xzrkgzr/OtM63zrPPjM+CIHY0bDIuICIKKyLOlc67zq3Os86+z4TOtSDOsc69IM61zq/Ovc6xzrkgzr/OtM63zrPPjM+CIHY0bDIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAizpHPgM6/z4TPhc+Hzq/OsSDOsc69zq/Ph869zrXPhc+DzrfPgiDOuc60zrnOv8+Ezq7PhM+Jzr0gz4TOt8+CIM61zrnPg8+MzrTOv8+FICVkIM+Dz4TOtyDPg8+Fz4POus61z4XOriAlcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLOkc+Azr/PhM+Fz4fOr86xIM6xzr3OrM6zzr3Pic+DzrfPgiDPhM+Jzr0gz4HPhc64zrzOr8+DzrXPic69IM60zq3Ous+EzrcgJWQgz4PPhM63zr0gz4PPhc+DzrrOtc+Fzq4gJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICLOkc+Azr/PhM+Fz4fOr86xIM6xzr3Or8+Hzr3Otc+Fz4POt8+CIM66zrHOvc6/zr3Ouc66zr/PgM6/zq/Ot8+DzrfPgiDPg8+Ezrcgz4PPhc+DzrrOtc+Fzq4gJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyLOkc+Azr/PhM+Fz4fOr86xIM66zrHPhM6sIM+EzrfOvSDOsc69zqzOs869z4nPg863IM+Ez4nOvSDPh86xz4HOsc66z4TOt8+BzrnPg8+EzrnOus+Ozr0gzrXOu86tzrPPh86/z4Ugz4PPhM63zr0gz4PPhc+DzrrOtc+Fzq4gJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAizpTOtc69IM6uz4TOsc69IM60z4XOvc6xz4TOriDOtyDPhM6xz4XPhM6/z4DOv86vzrfPg863IM+EzrfPgiDPg8+Fz4POus61z4XOrs+CICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIs6Rz4XPhM6uIM60zrXOvSDOtc6vzr3Osc65IM68zrnOsSDPg8+FzrrOtc+Fzq4gJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICIiCisizpTOtc69IM6uz4TOsc69IM60z4XOvc6xz4TPjCDPhM6/IM6szr3Ov865zrPOvM6xIM+EzrfPgiDPg8+Fz4POus61z4XOrs+CICclcycgzrPOuc6xIM6xzr3OrM6zzr3Pic+DzrcgzrrOsc65IM6zz4HOrM+IzrnOvM6/LiAiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICLOlyDPg8+Fz4POus61z4XOriAnJXMnIM60zrXOvSDOtc6vzr3Osc65IM68zrnOsSDPg8+Fz4POus61z4XOriDOu86uz4jOt8+CLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAizpcgz4PPhc+DzrrOtc+Fzq4gJyVzJyDOtM61zr0gzrXOr869zrHOuSDPg8+Fz4POus61z4XOriDOtc6+z4zOtM6/z4UuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAizpcgz4PPhc+DzrrOtc+Fzq4gJyVzJyDOtM61zr0gzrXOr869zrHOuSDPg8+Fz4POus61z4XOriDOtc6+z4zOtM6/z4UuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiIgorIs6UzrXOvSDOrs+EzrHOvSDOtM+Fzr3Osc+Ez4wgz4TOvyDOrM69zr/Ouc6zzrzOsSDPhM63z4Igz4PPhc+DzrrOtc+Fzq7PgiAnJXMnIM6zzrnOsSDOsc69zqzOs869z4nPg863IM66zrHOuSDOs8+BzqzPiM65zrzOvy4gIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLOkc+Azr/PhM+Fz4fOr86xIM+Bz43OuM68zrnPg863z4IgzrrOsc69z4zOvc6xIM6zzrnOsSDPhM63zr0gz4PPhc+DzrrOtc+Fzq4gJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisizpHPgM6/z4TPhc+Hzq/OsSDOsc69zqzOs869z4nPg863z4Igz4TOt8+CIM+Ez4HOrc+Hzr/Phc+DzrHPgiDPg8+Fz4fOvc+Mz4TOt8+EzrHPgiDOtM6tzrrPhM63IM6zzrnOsSDPhM63zr0gz4PPhc+DzrrOtc+Fzq4gJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorIs6Rz4DOv8+Ez4XPh86vzrEgz4HPjc64zrzOuc+DzrfPgiDPhM+Bzq3Ph86/z4XPg86xz4Igz4PPhc+Hzr3PjM+EzrfPhM6xz4IgzrTOrc66z4TOtyDOs865zrEgz4TOt869IM+Dz4XPg866zrXPhc6uICclcycgz4PPhM6xICVsdSBIeiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLOkc+Azr/PhM+Fz4fOr86xIM6xzr3OrM6zzr3Pic+DzrfPgiDOuc+Dz4fPjc+CIM+Dzq7OvM6xz4TOv8+CIM6zzrnOsSDPhM63zr0gz4PPhc+DzrrOtc+Fzq4gJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIs6Rz4DOv8+Ez4XPh86vzrEgzrHOvc6szrPOvc+Jz4POt8+CIM+EzrnOvM6uz4IgzrPOuc6xIM+Ezr/OvSDOrc67zrXOs8+Hzr8gJWQgz4PPhM63zr0gz4PPhc+DzrrOtc+Fzq4gJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIs6Rz4DOv8+Ez4XPh86vzrEgz4HPjc64zrzOuc+DzrfPgiDPhM65zrzOrs+CICVkIM6zzrnOsSDPhM6/zr0gzq3Ou861zrPPh86/ICVkIM+Dz4TOt869IM+Dz4XPg866zrXPhc6uICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisizpHPgM6/z4TPhc+Hzq/OsSDOsc69zqzOs869z4nPg863z4Igz4TOt8+CIM+Ez4HOrc+Hzr/Phc+DzrHPgiDOtc65z4POsc6zz4nOs86uz4Igz4PPhM63zr0gz4PPhc+DzrrOtc+Fzq4gJyVzJy4gzqDOuc64zrHOvc+Mzr0gzr3OsSAiCisizrXOr869zrHOuSDOvM65zrEgz4PPhc+DzrrOtc+Fzq4gz4HOrM60zrnOvyIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisizpHPgM6/z4TPhc+Hzq/OsSDOsc69zqzOs869z4nPg863z4Igz4TOt8+CIM+Ez4HOrc+Hzr/Phc+DzrHPgiDOtc6+z4zOtM6/z4Ugz4PPhM63zr0gz4PPhc+DzrrOtc+Fzq4gJyVzJy4gzqDOuc64zrHOvc+Mzr0gzr3OsSDOtc6vzr3Osc65ICIKKyLOvM65zrEgz4PPhc+DzrrOtc+Fzq4gz4HOrM60zrnOvyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICLOkc+Azr/PhM+Fz4fOr86xIM6/z4HOuc+DzrzOv8+NIM61zr7PjM60zr/PhSAlZCDPg8+EzrfOvSDPg8+Fz4POus61z4XOriAlcy4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICIiCisizpcgzrHOu867zrHOs86uIM+EzrfPgiDOsc69zqzOu8+Fz4POt8+CIM66zrHPhM6sIM+EzrcgzrTOuc6sz4HOus61zrnOsSDOu861zrnPhM6/z4XPgc6zzq/Osc+CIM60zrXOvSDPhc+Azr/Pg8+EzrfPgc6vzrbOtc+EzrHOuSDOsc66z4zOvM6xLiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAizpTOtc69IM61zq/Ovc6xzrkgzrTPhc69zrHPhM6uIM63IM67zrXOuc+Ezr/Phc+BzrPOr86xIM+Hz4nPgc6vz4Igz4HOv867z4zOuSAiCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc291bmQgc2VydmVyIgorI34gbXNnc3RyICLOlM61zr0gzq7PhM6xzr0gzrTPhc69zrHPhM6uIM63IM+Dz43Ovc60zrXPg863IM68zrUgz4TOv869IM60zrnOsc66zr/OvM65z4PPhM6uIM6uz4fOv8+FIgorCisjfiBtc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IHNvdW5kIHNlcnZlciBjYXBhYmlsaXRpZXMiCisjfiBtc2dzdHIgIs6Rz4DOv8+Ez4XPh86vzrEgzrHOvc6xzrbOrs+EzrfPg863z4Igz4TPic69IM60z4XOvc6xz4TOv8+Ezq7PhM+Jzr0gz4TOv8+FIM60zrnOsc66zr/OvM65z4PPhM6uIM6uz4fOv8+FIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICLOlc+Dz4nPhM61z4HOuc66z4wgz4PPhs6szrvOvM6xIM+Bzr/Ors+CIM60zrXOtM6/zrzOrc69z4nOvS4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICLOlc+Dz4nPhM61z4HOuc66z4wgz4PPhs6szrvOvM6xIM+Bzr/Ors+CIM60zrXOtM6/zrzOrc69z4nOvS4iCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICLOnM+AzqzPg86xIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICLOoM+Bzq/OvM6xICh0cmVibGUpIgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIlN5bnRoIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICLOnM61zrPOrM+Gz4nOvc6/IgorCisjfiBtc2dpZCAiTGluZS1pbiIKKyN+IG1zZ3N0ciAizpPPgc6xzrzOvM6uLc61zrnPg8+MzrTOv8+FIgorCisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgIkNEIgorCisjfiBtc2dpZCAiTWl4ZXIiCisjfiBtc2dzdHIgIs6czrXOr866z4TOt8+CIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICLOlc6zzrPPgc6xz4bOriIKKworI34gbXNnaWQgIkluLWdhaW4iCisjfiBtc2dzdHIgIs6azq3Pgc60zr/PgiDOtc65z4PPjM60zr/PhSIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICLOms6tz4HOtM6/z4IgzrXOvs+MzrTOv8+FIgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICLOk8+BzrHOvM68zq4tMSIKKworI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAizpPPgc6xzrzOvM6uLTIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIs6Tz4HOsc68zrzOri0zIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICLOqM63z4bOuc6xzrrPjC0xIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICLOqM63z4bOuc6xzrrPjC0yIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICLOqM63z4bOuc6xzrrPjC0zIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIs6Vzq/Pg86/zrTOv8+CIM+EzrfOu861z4bPjs69zr/PhSIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAizojOvs6/zrTOv8+CIM+EzrfOu861z4bPjs69zr/PhSIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICLOks6vzr3PhM61zr8iCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAizqHOrM60zrnOvyIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIiIKKyN+ICLOlM61zr0gzq7PhM6xzr0gzrTPhc69zrHPhM+MIM+Ezr8gzqzOvc6/zrnOs868zrEgz4TOt8+CIM+Dz4XPg866zrXPhc6uz4Igzq7Ph86/z4UgzrPOuc6xIM+HzrXOuc+BzrnPg868z4wgz4TOv8+FIM61zrvOrc6zz4fOv8+FIM+Ezr/PhSAiCisjfiAizrzOr866z4TOty4gIgorCisjfiBtc2dpZCAiIgorI34gIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4gVGhpcyB2ZXJzaW9uIG9mICIKKyN+ICJ0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAizpTOtc69IM6uz4TOsc69IM60z4XOvc6xz4TPjCDPhM6/IM6szr3Ov865zrPOvM6xIM+EzrfPgiDPg8+Fz4POus61z4XOrs+CIM6uz4fOv8+FIM6zzrnOsSDPh861zrnPgc65z4POvM+MIM+Ezr/PhSDOtc67zq3Os8+Hzr/PhSDPhM6/z4UgIgorI34gIs68zq/Ous+EzrcuIM6Rz4XPhM6uIM63IM6tzrrOtM6/z4POtyDPhM6/z4UgT3BlbiBTb3VuZCBTeXN0ZW0gzrTOtc69IM+Fz4DOv8+Dz4TOt8+Bzq/Ots61z4TOsc65IM6xz4DPjCDOsc+Fz4TPjCDOv8+EICIKKyN+ICLPg8+Ezr/Ouc+HzrXOr86/LiIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAizpPOtc69zrnOus+Mz4IgKE1hc3RlcikiCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAizpzPgM+Bzr/Pg8+EzqwiCisKKyN+IG1zZ2lkICJSZWFyIgorI34gbXNnc3RyICLOoM6vz4PPiSIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIs6RzrrOv8+Fz4PPhM65zrrOrCIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAizprOrc69z4TPgc6/IgorCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICLOp86xzrzOt867z47OvSDPg8+Fz4fOvc6/z4TOrs+Ez4nOvSAoTEZFKSIKKworI34gbXNnaWQgIlN1cnJvdW5kIgorI34gbXNnc3RyICLOoM61z4HOuc6yzqzOu867z4nOvSAoU3Vycm91bmQpIgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAizqDOu861z4XPgc65zrrPjCIKKworI34gbXNnaWQgIkFVWCBPdXQiCisjfiBtc2dzdHIgIs6Izr7Ov860zr/PgiBBVVgiCisKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAizpLOrM64zr/PgiAzRCIKKworI34gbXNnaWQgIjNEIENlbnRlciIKKyN+IG1zZ3N0ciAizprOrc69z4TPgc6/IDNEIgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAizpXOvc6vz4PPh8+Fz4POtyAzRCIKKworI34gbXNnaWQgIlRlbGVwaG9uZSIKKyN+IG1zZ3N0ciAizqTOt867zq3Phs+Jzr3OvyIKKworI34gbXNnaWQgIlZpZGVvIEluIgorI34gbXNnc3RyICLOlc6vz4POv860zr/PgiDOss6vzr3PhM61zr8iCisKKyN+IG1zZ2lkICJBVVggSW4iCisjfiBtc2dzdHIgIs6Vzq/Pg86/zrTOv8+CIEFVWCIKKworI34gbXNnaWQgIlJlY29yZCBHYWluIgorI34gbXNnc3RyICLOms6tz4HOtM6/z4IgzpXOs86zz4HOsc+Gzq7PgiIKKworI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICLOms6tz4HOtM6/z4IgzrXOvs+MzrTOv8+FIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAizpXOvc6vz4PPh8+Fz4POtyDOvM65zrrPgc6/z4bPjs69zr/PhSIKKworI34gbXNnaWQgIkRpYWdub3N0aWMiCisjfiBtc2dzdHIgIs6UzrnOsc6zzr3Pic+Dz4TOuc66z4wiCisKKyN+IG1zZ2lkICJCYXNzIEJvb3N0IgorI34gbXNnc3RyICLOlc69zq/Pg8+Hz4XPg863IM+HzrHOvM63zrvPjs69IgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgIs6Yz43Pgc61z4IgzpHOvc6xz4DOsc+BzrHOs8+JzrPOrs+CIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIs6Vzq/Pg86/zrTOv8+CIgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIs6gzrHPgc6xzrrOv867zr/Pjc64zrfPg863IM+AzrfOs86uz4IiCisKKyN+IG1zZ2lkICJLZXlib2FyZCBCZWVwIgorI34gbXNnc3RyICLOic+Hzr/PgiDPgM67zrfOus+Ez4HOv867zr/Os86vzr/PhSIKKworI34gbXNnaWQgIlNpbXVsYXRlIFN0ZXJlbyIKKyN+IG1zZ3N0ciAizqDPgc6/z4POv868zr/Or8+Jz4POtyDPg8+Ezq3Pgc61zr8iCisKKyN+IG1zZ2lkICJTdGVyZW8iCisjfiBtc2dzdHIgIs6jz4TOrc+BzrXOvyIKKworI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICLOic+Hzr/PgiBTdXJyb3VuZCIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAizprOrc+BzrTOv8+CIM68zrnOus+Bzr/Phs+Ozr3Ov8+FIgorCisjfiBtc2dpZCAiU3BlYWtlciBTb3VyY2UiCisjfiBtc2dzdHIgIs6gzrfOs86uIM68zrXOs86xz4bPjs69zr/PhSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgU291cmNlIgorI34gbXNnc3RyICLOoM63zrPOriDOvM65zrrPgc6/z4bPjs69zr/PhSIKKworI34gbXNnaWQgIkphY2siCisjfiBtc2dzdHIgIs6Sz43Pg868zrEiCisKKyN+IG1zZ2lkICJDZW50ZXIgLyBMRkUiCisjfiBtc2dzdHIgIs6azrXOvc+Ez4HOuc66z4wgLyDOp86xzrzOt867z47OvSDPg8+Fz4fOvc6/z4TOrs+Ez4nOvSIKKworI34gbXNnaWQgIlN0ZXJlbyBNaXgiCisjfiBtc2dzdHIgIs6jz4TOtc+BzrXOv8+Gz4nOvc65zrrOriDOvM6vzr7OtyIKKworI34gbXNnaWQgIk1vbm8gTWl4IgorI34gbXNnc3RyICLOnM6/zr3Ov8+Gz4nOvc65zrrOriDOvM6vzr7OtyIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAizpzOr86+zrcgzrXOuc+Dz4zOtM6/z4UiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDEiCisjfiBtc2dzdHIgIs6czrnOus+Bz4zPhs+Jzr3OvyAxIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICLOnM65zrrPgc+Mz4bPic69zr8gMiIKKworI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICLOqM63z4bOuc6xzrrOriDOrc6+zr/OtM6/z4IiCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICLOqM63z4bOuc6xzrrOriDOtc6vz4POv860zr/PgiIKKworI34gbXNnaWQgIkhETUkiCisjfiBtc2dzdHIgIkhETUkiCisKKyN+IG1zZ2lkICJNb2RlbSIKKyN+IG1zZ3N0ciAiTW9kZW0iCisKKyN+IG1zZ2lkICJIYW5kc2V0IgorI34gbXNnc3RyICLOpM63zrvOtc+Gz4nOvc65zrrOriDPg8+Fz4POus61z4XOriIKKworI34gbXNnaWQgIk90aGVyIgorI34gbXNnc3RyICLOhs67zrvOvyIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgIs6azrHOvc6tzr3OsSIKKworI34gbXNnaWQgIk9uIgorI34gbXNnc3RyICJPbiIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAiT2ZmIgorCisjfiBtc2dpZCAiTXV0ZSIKKyN+IG1zZ3N0ciAizqPOr86zzrHPg863IgorCisjfiBtc2dpZCAiRmFzdCIKKyN+IG1zZ3N0ciAizpPPgc6uzrPOv8+BzrEiCisKKyN+IG1zZ2lkICJWZXJ5IExvdyIKKyN+IG1zZ3N0ciAizqDOv867z40gz4fOsc68zrfOu86uIgorCisjfiBtc2dpZCAiTG93IgorI34gbXNnc3RyICLOp86xzrzOt867zq4iCisKKyN+IG1zZ2lkICJNZWRpdW0iCisjfiBtc2dzdHIgIs6czrXPg86xzq/OsSIKKworI34gbXNnaWQgIkhpZ2giCisjfiBtc2dzdHIgIs6lz4jOt867zq4iCisKKyN+IG1zZ2lkICJWZXJ5IEhpZ2giCisjfiBtc2dzdHIgIs6gzr/Ou8+NIM+Fz4jOt867zq4iCisKKyN+IG1zZ2lkICJQcm9kdWN0aW9uIgorI34gbXNnc3RyICLOoM6xz4HOsc6zz4nOs86uz4IiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICLOnM65zrrPgc+Mz4bPic69zr8gzrzPgM+Bzr/Pg8+EzrnOvc6/z40gz4DOrM69zrXOuyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgSW4iCisjfiBtc2dzdHIgIs6Vzq/Pg86/zrTOv8+CIM6zz4HOsc68zrzOrs+CIM68z4DPgc6/z4PPhM65zr3Ov8+NIM+AzqzOvc61zrsiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICLOkc66zr/Phc+Dz4TOuc66zqwgzrzPgM+Bzr/Pg8+EzrnOvc6/z40gz4DOrM69zrXOuyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICLOiM6+zr/OtM6/z4IgzrPPgc6xzrzOvM6uz4IgzrzPgM+Bzr/Pg8+EzrnOvc6/z40gz4DOrM69zrXOuyIKKworI34gbXNnaWQgIkdyZWVuIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAizqDPgc6sz4POuc69zrcgz4XPgM6/zrTOv8+Hzq4iCisKKyN+IG1zZ2lkICJQaW5rIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAizqHOv862IM+Fz4DOv860zr/Ph86uIgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIs6cz4DOu861IM+Fz4DOv860zr/Ph86uIgorCisjfiBtc2dpZCAiV2hpdGUgQ29ubmVjdG9yIgorI34gbXNnc3RyICLOm861z4XOus6uIM+Fz4DOv860zr/Ph86uIgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICLOnM6xz43Pgc63IM+Fz4DOv860zr/Ph86uIgorCisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIs6TzrrPgc65IM+Fz4DOv860zr/Ph86uIgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAizqDOv8+Bz4TOv866zrHOu86vIM+Fz4DOv860zr/Ph86uIgorCisjfiBtc2dpZCAiUmVkIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAizprPjM66zrrOuc69zrcgz4XPgM6/zrTOv8+Hzq4iCisKKyN+IG1zZ2lkICJZZWxsb3cgQ29ubmVjdG9yIgorI34gbXNnc3RyICLOms6vz4TPgc65zr3OtyDPhc+Azr/OtM6/z4fOriIKKworI34gbXNnaWQgIkdyZWVuIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAizqDPgc6sz4POuc69zrcgz4XPgM6/zrTOv8+Hzq4gzrzPgM+Bzr/Pg8+EzrnOvc6/z40gz4DOrM69zrXOuyIKKworI34gbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLOoc6/zrYgz4XPgM6/zrTOv8+Hzq4gzrzPgM+Bzr/Pg8+EzrnOvc6/z40gz4DOrM69zrXOuyIKKworI34gbXNnaWQgIkJsdWUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLOnM+AzrvOtSDPhc+Azr/OtM6/z4fOriDOvM+Az4HOv8+Dz4TOuc69zr/PjSDPgM6szr3Otc67IgorCisjfiBtc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLOm861z4XOus6uIM+Fz4DOv860zr/Ph86uIM68z4DPgc6/z4PPhM65zr3Ov8+NIM+AzqzOvc61zrsiCisKKyN+IG1zZ2lkICJCbGFjayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIs6czrHPjc+Bzrcgz4XPgM6/zrTOv8+Hzq4gzrzPgM+Bzr/Pg8+EzrnOvc6/z40gz4DOrM69zrXOuyIKKworI34gbXNnaWQgIkdyYXkgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLOk866z4HOuSDPhc+Azr/OtM6/z4fOriDOvM+Az4HOv8+Dz4TOuc69zr/PjSDPgM6szr3Otc67IgorCisjfiBtc2dpZCAiT3JhbmdlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAizqDOv8+Bz4TOv866zrHOu86vIM+Fz4DOv860zr/Ph86uIM68z4DPgc6/z4PPhM65zr3Ov8+NIM+AzqzOvc61zrsiCisKKyN+IG1zZ2lkICJSZWQgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLOms+MzrrOus65zr3OtyDPhc+Azr/OtM6/z4fOriDOvM+Az4HOv8+Dz4TOuc69zr/PjSDPgM6szr3Otc67IgorCisjfiBtc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAizprOr8+Ez4HOuc69zrcgz4XPgM6/zrTOv8+Hzq4gzrzPgM+Bzr/Pg8+EzrnOvc6/z40gz4DOrM69zrXOuyIKKworI34gbXNnaWQgIlNwcmVhZCBPdXRwdXQiCisjfiBtc2dzdHIgIs6Vz4XPgc61zq/OsSDOrc6+zr/OtM6/z4IiCisKKyN+IG1zZ2lkICJEb3dubWl4IgorI34gbXNnc3RyICLOnM6vzr7OtyDPg8+FzrPPh8+Ozr3Otc+Fz4POt8+CIChEb3dubWl4KSIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIs6Vzq/Pg86/zrTOv8+CIM61zrnOus6/zr3Ouc66zr/PjSDOvM6vzrrPhM63IgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBPdXRwdXQiCisjfiBtc2dzdHIgIs6Izr7Ov860zr/PgiDOtc65zrrOv869zrnOus6/z40gzrzOr866z4TOtyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCisjfiBtc2dzdHIgIs6azrHOvc6szrvOuc6xIM61zrnOus6/zr3Ouc66zr/PjSDOvM6vzrrPhM63IgorCisjfiBtc2dpZCAiJXMgJWQgRnVuY3Rpb24iCisjfiBtc2dzdHIgIs6bzrXOuc+Ezr/Phc+BzrPOr86xICVzICVkIgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgIs6bzrXOuc+Ezr/Phc+BzrPOr86xICVzIgorCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAizpHPgM+Bzr/Pg860z4zOus63z4TOvyDOvM6tzrPOtc64zr/PgiDPgM67zrHOuc+Dzq/Ov8+FIM6xz4DPjCAldSDOsc69z4TOryDPhM6/z4UgJXUiCisKKyN+IG1zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIG9uIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAizqPPhs6szrvOvM6xIM66zrHPhM6sIM+EzrfOvSDOsc69zqzOs869z4nPg863ICVkIGJ5dGVzIM+Dz4TOt869IM+Dz4XPg866zrXPhc6uICclcycuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIs6RzrTPhc69zrHOvM6vzrEgzrjOrc+DzrfPgiDPg861IM+DzrXOuc+Bzqwgz4TPic69IGJ1ZmZlciDPg8+Ezrcgz4PPhc+DzrrOtc+Fzq4gJyVzJy4iCisKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIs6Rz4DOv8+Ez4XPh86vzrEgzrHOvc6szrPOvc+Jz4POt8+CIM+AzrvOsc65z4POr8+Jzr0gzrLOr869z4TOtc6/IM6xz4DPjCDPhM63zr0gz4PPhc+DzrrOtc+Fzq4gJyVzJy4iCisKKyN+IG1zZ2lkICJGYWlsZWQgYWZ0ZXIgJWQgdHJpZXMuIGRldmljZSAlcy4gc3lzdGVtIGVycm9yOiAlcyIKKyN+IG1zZ3N0ciAiIgorI34gIs6Rz4DOv8+Ez4XPh86vzrEgzq3PgM61zrnPhM6xIM6xz4DPjCAlZCDPgM+Bzr/Pg8+AzqzOuM61zrnOtc+CLiDPg8+Fz4POus61z4XOriAlcy4gz4PPhs6szrvOvM6xIM+Dz4XPg8+Ezq7OvM6xz4TOv8+COiAlcyIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgaW5wdXQgZWxlbWVudC4iCisjfiBtc2dzdHIgIs6gzrXPgc65zrPPgc6sz4bOtc65IM+Ezr8gzrXPgM65zrvOtc6zzrzOrc69zr8gz4PPhM6/zrnPh861zq/OvyDOtc65z4POsc6zz4nOs86uz4IuIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBvdXRwdXQgZWxlbWVudCBmb3IgQXVkaW8vVmlkZW8gQ29uZmVyZW5jaW5nLiIKKyN+IG1zZ3N0ciAiIgorI34gIs6gzrXPgc65zrPPgc6sz4bOtc65IM+Ezr8gzrXPgM65zrvOtc6zzrzOrc69zr8gz4PPhM6/zrnPh861zq/OvyDOtc6+z4zOtM6/z4UgzrPOuc6xIM+Ezr8gQXVkaW8vVmlkZW8gQ29uZmVyZW5jaW5nLiIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgb3V0cHV0IGVsZW1lbnQgZm9yIE11c2ljIGFuZCBNb3ZpZXMuIgorI34gbXNnc3RyICLOoM61z4HOuc6zz4HOrM+GzrXOuSDPhM6/IM61z4DOuc67zrXOs868zq3Ovc6/IM+Dz4TOv865z4fOtc6vzr8gzrXOvs+MzrTOv8+FIM6zzrnOsSDOvM6/z4XPg865zrrOriDOus6xzrkgz4TOsc65zr3Or861z4IuIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBvdXRwdXQgZWxlbWVudC4iCisjfiBtc2dzdHIgIs6gzrXPgc65zrPPgc6sz4bOtc65IM+Ezr8gzrXPgM65zrvOtc6zzrzOrc69zr8gz4PPhM6/zrnPh861zq/OvyDOtc6+zrHOs8+JzrPOrs+CLiIKZGlmZiAtLWdpdCBhL3BvL2VuX0dCLnBvIGIvcG8vZW5fR0IucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliZGU4MQotLS0gL2Rldi9udWxsCisrKyBiL3BvL2VuX0dCLnBvCkBAIC0wLDAgKzEsNjIxIEBACisjIEVuZ2xpc2ggKEJyaXRpc2gpIHRyYW5zbGF0aW9uLgorIyBDb3B5cmlnaHQgKEMpIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIEdhcmV0aCBPd2VuIDxnb3dlbjcyQHlhaG9vLmNvbT4sIDIwMDQuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucyAwLjguMVxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA0LTA0LTI2IDEwOjQxLTA0MDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEdhcmV0aCBPd2VuIDxnb3dlbjcyQHlhaG9vLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBFbmdsaXNoIChCcml0aXNoKSA8ZW5fZ2JAbGkub3JnPlxuIgorIkxhbmd1YWdlOiBlbl9HQlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIiIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiQ291bGQgbm90IGNsb3NlIGNvbnRyb2wgZGV2aWNlIFwiJXNcIi4iCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiQ291bGQgbm90IGNsb3NlIGNvbnRyb2wgZGV2aWNlIFwiJXNcIi4iCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIkNvdWxkIG5vdCBjbG9zZSBjb250cm9sIGRldmljZSBcIiVzXCIuIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIllvdXIgb3NzIGRldmljZSBjb3VsZCBub3QgYmUgcHJvYmVkIGNvcnJlY3RseSIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgXCIlc1wiIGZvciB3cml0aW5nLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICIiCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICJDb3VsZCBub3Qgb3BlbiBDRCBkZXZpY2UgZm9yIHJlYWRpbmcuIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIllvdXIgb3NzIGRldmljZSBjb3VsZCBub3QgYmUgcHJvYmVkIGNvcnJlY3RseSIKKworIywgZnV6enkKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICJSZWNvcmQiCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWNyb3Bob25lIgorCisjLCBmdXp6eQorbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIkxpbmUtaW4iCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIiIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJWb2x1bWUiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICIiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJNb25pdG9yIgorCisjLCBmdXp6eQorbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIlNwZWFrZXIiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIiIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICIiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkNvdWxkIG5vdCBnZXQgYnVmZmVycyBmcm9tIGRldmljZSBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJDb3VsZCBub3QgZ2V0IGJ1ZmZlcnMgZnJvbSBkZXZpY2UgXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJEZXZpY2UgXCIlc1wiIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIkRldmljZSBcIiVzXCIgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiRGV2aWNlIFwiJXNcIiBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIkRldmljZSBcIiVzXCIgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIkNvdWxkIG5vdCBnZXQgYnVmZmVycyBmcm9tIGRldmljZSBcIiVzXCIuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQ291bGQgbm90IGdldCBlbm91Z2ggYnVmZmVycyBmcm9tIGRldmljZSBcIiVzXCIuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJDb3VsZCBub3QgZ2V0IGJ1ZmZlcnMgZnJvbSBkZXZpY2UgXCIlc1wiLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJEZXZpY2UgXCIlc1wiIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJDb3VsZCBub3QgY2xvc2UgYXVkaW8gZGV2aWNlIFwiJXNcIi4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiQ291bGQgbm90IGNsb3NlIGF1ZGlvIGRldmljZSBcIiVzXCIuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQ291bGQgbm90IGdldCBidWZmZXJzIGZyb20gZGV2aWNlIFwiJXNcIi4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQ291bGQgbm90IGdldCBlbm91Z2ggYnVmZmVycyBmcm9tIGRldmljZSBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkNvdWxkIG5vdCB3cml0ZSB0byBkZXZpY2UgXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiQ291bGQgbm90IG9wZW4gZGV2aWNlIFwiJXNcIiBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiRGV2aWNlIFwiJXNcIiBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJEZXZpY2UgXCIlc1wiIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIkRldmljZSBcIiVzXCIgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiQ291bGQgbm90IG9wZW4gZGV2aWNlIFwiJXNcIiBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJDb3VsZCBub3QgZ2V0IGJ1ZmZlcnMgZnJvbSBkZXZpY2UgXCIlc1wiLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJDb3VsZCBub3QgZ2V0IGVub3VnaCBidWZmZXJzIGZyb20gZGV2aWNlIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkNvdWxkIG5vdCBjbG9zZSBjb250cm9sIGRldmljZSBcIiVzXCIuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQ291bGQgbm90IGNsb3NlIGNvbnRyb2wgZGV2aWNlIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiQ291bGQgbm90IGdldCBlbm91Z2ggYnVmZmVycyBmcm9tIGRldmljZSBcIiVzXCIuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJDb3VsZCBub3QgY2xvc2UgYXVkaW8gZGV2aWNlIFwiJXNcIi4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIkRldmljZSBcIiVzXCIgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiQ291bGQgbm90IGdldCBlbm91Z2ggYnVmZmVycyBmcm9tIGRldmljZSBcIiVzXCIuIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAiQmFzcyIKKworI34gbXNnaWQgIlRyZWJsZSIKKyN+IG1zZ3N0ciAiVHJlYmxlIgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIlN5bnRoIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJTcGVha2VyIgorCisjfiBtc2dpZCAiTGluZS1pbiIKKyN+IG1zZ3N0ciAiTGluZS1pbiIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJNaXhlciIKKworI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICJQQ00tMiIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAiUmVjb3JkIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAiSW4tZ2FpbiIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICJPdXQtZ2FpbiIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAiTGluZS0xIgorCisjfiBtc2dpZCAiTGluZS0yIgorI34gbXNnc3RyICJMaW5lLTIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIkxpbmUtMyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAiRGlnaXRhbC0xIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICJEaWdpdGFsLTIiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIkRpZ2l0YWwtMyIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICJQaG9uZS1pbiIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAiUGhvbmUtb3V0IgorCisjfiBtc2dpZCAiVmlkZW8iCisjfiBtc2dzdHIgIlZpZGVvIgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgIlJhZGlvIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBcIiVzXCIgZm9yIHdyaXRpbmcuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIlJlY29yZCIKKworIywgZnV6enkKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICJWaWRlbyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAiVmlkZW8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIlJlY29yZCIKKworIywgZnV6enkKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAiT3V0LWdhaW4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiTWljcm9waG9uZSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTW9uaXRvciIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIk1pY3JvcGhvbmUiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiU3BlYWtlciBTb3VyY2UiCisjfiBtc2dzdHIgIlNwZWFrZXIiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgIk1pY3JvcGhvbmUiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICJNaWNyb3Bob25lIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiTWljcm9waG9uZSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAiRGlnaXRhbC0xIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgIkRpZ2l0YWwtMSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICJNaWNyb3Bob25lIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkNvdWxkIG5vdCBlbnF1ZXVlIGJ1ZmZlcnMgaW4gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJDb3VsZCBub3QgZ2V0IGJ1ZmZlcnMgZnJvbSBkZXZpY2UgXCIlc1wiLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGZpbGUgXCIlc1wiIGZvciB3cml0aW5nLiIKKyN+IG1zZ3N0ciAiQ291bGQgbm90IG9wZW4gZmlsZSBcIiVzXCIgZm9yIHdyaXRpbmcuIgorCisjfiBtc2dpZCAiRXJyb3IgY2xvc2luZyBmaWxlIFwiJXNcIi4iCisjfiBtc2dzdHIgIkVycm9yIGNsb3NpbmcgZmlsZSBcIiVzXCIuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gZmlsZSBcIiVzXCIgZm9yIHJlYWRpbmcuIgorI34gbXNnc3RyICJDb3VsZCBub3Qgb3BlbiBmaWxlIFwiJXNcIiBmb3IgcmVhZGluZy4iCisKKyN+IG1zZ2lkICJObyBmaWxlbmFtZSBzcGVjaWZpZWQuIgorI34gbXNnc3RyICJObyBmaWxlbmFtZSBzcGVjaWZpZWQuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgXCIlc1wiLiIKKyN+IG1zZ3N0ciAiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgXCIlc1wiLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGNvbnRyb2wgZGV2aWNlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisjfiBtc2dzdHIgIkNvdWxkIG5vdCBvcGVuIGNvbnRyb2wgZGV2aWNlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgY29uZmlndXJlIGF1ZGlvIGRldmljZSBcIiVzXCIuIgorI34gbXNnc3RyICJDb3VsZCBub3QgY29uZmlndXJlIGF1ZGlvIGRldmljZSBcIiVzXCIuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IHNldCBhdWRpbyBkZXZpY2UgXCIlc1wiIHRvICVkIEh6LiIKKyN+IG1zZ3N0ciAiQ291bGQgbm90IHNldCBhdWRpbyBkZXZpY2UgXCIlc1wiIHRvICVkIEh6LiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIHZpZGVvIGRldmljZSBcIiVzXCIgZm9yIHdyaXRpbmcuIgorI34gbXNnc3RyICJDb3VsZCBub3Qgb3BlbiB2aWRlbyBkZXZpY2UgXCIlc1wiIGZvciB3cml0aW5nLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBjbG9zZSB2aWRlbyBkZXZpY2UgXCIlc1wiLiIKKyN+IG1zZ3N0ciAiQ291bGQgbm90IGNsb3NlIHZpZGVvIGRldmljZSBcIiVzXCIuIgorCisjfiBtc2dpZCAiT1NTIGRldmljZSBcIiVzXCIgaXMgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciBwcm9ncmFtLiIKKyN+IG1zZ3N0ciAiT1NTIGRldmljZSBcIiVzXCIgaXMgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciBwcm9ncmFtLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBhY2Nlc3MgZGV2aWNlIFwiJXNcIiwgY2hlY2sgaXRzIHBlcm1pc3Npb25zLiIKKyN+IG1zZ3N0ciAiQ291bGQgbm90IGFjY2VzcyBkZXZpY2UgXCIlc1wiLCBjaGVjayBpdHMgcGVybWlzc2lvbnMuIgorCisjfiBtc2dpZCAiRGV2aWNlIFwiJXNcIiBkb2VzIG5vdCBleGlzdC4iCisjfiBtc2dzdHIgIkRldmljZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisjfiBtc2dzdHIgIkNvdWxkIG5vdCBvcGVuIGRldmljZSBcIiVzXCIgZm9yIHdyaXRpbmcuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlIFwiJXNcIiBmb3IgcmVhZGluZy4iCisjfiBtc2dzdHIgIkNvdWxkIG5vdCBvcGVuIGRldmljZSBcIiVzXCIgZm9yIHJlYWRpbmcuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gdmZzIGZpbGUgXCIlc1wiIGZvciByZWFkaW5nLiIKKyN+IG1zZ3N0ciAiQ291bGQgbm90IG9wZW4gdmZzIGZpbGUgXCIlc1wiIGZvciByZWFkaW5nLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJObyBmaWxlbmFtZSBnaXZlbi4iCisjfiBtc2dzdHIgIk5vIGZpbGVuYW1lIGdpdmVuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIHZmcyBmaWxlIFwiJXNcIiBmb3Igd3JpdGluZzogJXMuIgorI34gbXNnc3RyICJDb3VsZCBub3Qgb3BlbiB2ZnMgZmlsZSBcIiVzXCIgZm9yIHdyaXRpbmcuIgorCisjfiBtc2dpZCAiTm8gZmlsZW5hbWUgZ2l2ZW4iCisjfiBtc2dzdHIgIk5vIGZpbGVuYW1lIGdpdmVuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGNsb3NlIHZmcyBmaWxlIFwiJXNcIi4iCisjfiBtc2dzdHIgIkNvdWxkIG5vdCBjbG9zZSB2ZnMgZmlsZSBcIiVzXCIuIgorCisjfiBtc2dpZCAiTm8gZGV2aWNlIHNwZWNpZmllZC4iCisjfiBtc2dzdHIgIk5vIGRldmljZSBzcGVjaWZpZWQuIgorCisjfiBtc2dpZCAiRGV2aWNlIGlzIG5vdCBvcGVuLiIKKyN+IG1zZ3N0ciAiRGV2aWNlIGlzIG5vdCBvcGVuLiIKKworI34gbXNnaWQgIkRldmljZSBpcyBvcGVuLiIKKyN+IG1zZ3N0ciAiRGV2aWNlIGlzIG9wZW4uIgpkaWZmIC0tZ2l0IGEvcG8vZW8ucG8gYi9wby9lby5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWEzZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcG8vZW8ucG8KQEAgLTAsMCArMSw1MDUgQEAKKyMgRXNwZXJhbnRvIHRyYW5zbGF0aW9uIGZvciBnc3QtcGx1Z2lucy1nb29kLgorIyBDb3B5cmlnaHQgKEMpIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBnc3QtcGx1Z2lucy1nb29kIHBhY2thZ2UuCisjIEtyaXN0amFuIFNDSE1JRFQgPGtyaXN0amFuLnNjaG1pZHRAZ29vZ2xlbWFpbC5jb20+LCAyMDExLgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZCAwLjEwLjI4LjJcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxMS0wNi0wNCAyMTo0OCswMTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBLcmlzdGphbiBTQ0hNSURUIDxrcmlzdGphbi5zY2htaWR0QGdvb2dsZW1haWwuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IEVzcGVyYW50byA8dHJhbnNsYXRpb24tdGVhbS1lb0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+XG4iCisiTGFuZ3VhZ2U6IGVvXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0yOyBwbHVyYWw9KG4gIT0gMSk7XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICInJXMnIGRlICclcyciCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIk5lIGVibGlzIGtvbmVrdGkgYWwgc2VydmlsbyIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICIiCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICIiCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIk5lIGVibGlzIG1hbGZlcm1pIGxhIHNvbmFwYXJhdG9uIHBvciByZXByb2R1a3RhZG8uIMScaSBlc3RhcyB1emF0ZSBkZSBhbGlhICIKKyJhcGxpa2HEtW8uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJOZSBlYmxpcyBtYWxmZXJtaSBsYSBzb25hcGFyYXRvbiBwb3IgcmVwcm9kdWt0YWRvLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICIiCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIk5lIGVibGlzIG1hbGZlcm1pIHNvbmFwYXJhdG9uIHBvciByZWdpc3RyYWRvLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICJSZWdpc3RyaSIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pa3JvZm9ubyIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIiIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICIiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICIiCisKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICIiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIkxhxa10ZWNvIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiRWtyYW5vIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICIiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiIgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlRpbyBuZSBlc3RhcyAnJXMnLWFwYXJhdG8uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIk5lIGVibGlzIG1hbGZlcm1pIHNvbmFwYXJhdG9uIHBvciByZWdpc3RyYWRvLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICJJbnRlcm5hIGRhdHVtZmx1LWVyYXJvLiIKKworI34gbXNnaWQgIkJhc3MiCisjfiBtc2dzdHIgIkJhc28iCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAiU2ludGV6aWxvIgorCisjfiBtc2dpZCAiU3BlYWtlciIKKyN+IG1zZ3N0ciAiUGFyb2xpbG8iCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiS0QiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAiTWlrc2lsbyIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICJWaWRlbyIKKworI34gbXNnaWQgIlJhZGlvIgorI34gbXNnc3RyICJSYWRpbyIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAixIhlZmUiCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAiQW50YcWtZSIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIk1hbGFudGHFrWUiCisKKyN+IG1zZ2lkICJIZWFkcGhvbmVzIgorI34gbXNnc3RyICJLYXB0ZWxlZm9ubyIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAiQ2VudHJlIgorCisjfiBtc2dpZCAiU3Vycm91bmQiCisjfiBtc2dzdHIgIsSIaXJrYcWtZSIKKworI34gbXNnaWQgIlNpZGUiCisjfiBtc2dzdHIgIkZsYW5rZSIKKworI34gbXNnaWQgIklucHV0IgorI34gbXNnc3RyICJFbmlnbyIKKworI34gbXNnaWQgIlN0ZXJlbyIKKyN+IG1zZ3N0ciAiRHVrYW5hbGUiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAixIhpcmthxa1hIHNvbm8iCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDEiCisjfiBtc2dzdHIgIk1pa3JvZm9ubyAxIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICJNaWtyb2Zvbm8gMiIKKworI34gbXNnaWQgIk1vZGVtIgorI34gbXNnc3RyICJNb2RlbW8iCisKKyN+IG1zZ2lkICJPdGhlciIKKyN+IG1zZ3N0ciAiQWxpYSIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgIk5lbml1IgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgIkVuxZ1hbHRpdGUiCisKKyN+IG1zZ2lkICJPZmYiCisjfiBtc2dzdHIgIkVsxZ1hbHRpdGUiCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICJTaWxlbnRpZ2kiCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICJSYXBpZGUiCisKKyN+IG1zZ2lkICJWZXJ5IExvdyIKKyN+IG1zZ3N0ciAiVHJlIG1hbGFsdGUiCisKKyN+IG1zZ2lkICJMb3ciCisjfiBtc2dzdHIgIk1hbGFsdGUiCisKKyN+IG1zZ2lkICJNZWRpdW0iCisjfiBtc2dzdHIgIk1lemUiCisKKyN+IG1zZ2lkICJIaWdoIgorI34gbXNnc3RyICJBbHRlIgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICJUcmUgYWx0ZSIKKworI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyAlZCBmdW5rY2lvIgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzIGZ1bmNpbyIKZGlmZiAtLWdpdCBhL3BvL2VzLnBvIGIvcG8vZXMucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU5ZDgzMgotLS0gL2Rldi9udWxsCisrKyBiL3BvL2VzLnBvCkBAIC0wLDAgKzEsODcwIEBACisjIHRyYW5zbGF0aW9uIG9mIGdzdC1wbHVnaW5zLWdvb2QtMC4xMC4yNi4yLnBvIHRvIEVzcGHDsW9sCisjIHNwYW5pc2ggdHJhbnNsYXRpb24gZm9yIGdzdC1wbHVnaW5zLWdvb2QKKyMgVGhpcyBmaWxlIGlzIHB1dCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMgSm9yZ2UgR29uesOhbGV6IEdvbnrDoWxleiA8YWxvcmllbEBnbWFpbC5jb20+LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZCAwLjEwLjI2LjJcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxMS0wMi0xMiAxODozMCswMTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBKb3JnZSBHb256w6FsZXogR29uesOhbGV6IDxhbG9yaWVsQGdtYWlsLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBTcGFuaXNoIDxlc0BsaS5vcmc+XG4iCisiTGFuZ3VhZ2U6IGVzXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiWC1HZW5lcmF0b3I6IEtCYWJlbCAxLjExLjRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD0obiAhPSAxKTtcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICJGYWxsw7MgYWwgZGVjb2RpZmljYXIgbGEgaW1hZ2VuIEpQRUciCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIsKrJXPCuyBwb3Igwqslc8K7IgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJObyBzZSBwdWRvIGNvbmVjdGFyIGNvbiBlbCBzZXJ2aWRvciIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJObyBleGlzdGUgdW4gVVJMIGVzdGFibGVjaWRvLiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiTm8gc2UgcHVkbyByZXNvbHZlciBlbCBub21icmUgZGVsIHNlcnZpZG9yLiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJObyBzZSBwdWRvIGVzdGFibGVjZXIgbGEgY29uZXhpw7NuIGNvbiBlbCBzZXJ2aWRvci4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICJGYWxsw7MgbGEgY29uZmlndXJhY2nDs24gZGUgbGEgY29uZXhpw7NuIHNlZ3VyYS4iCisKKyMsIGZ1enp5Cittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorIk9jdXJyacOzIHVuIGVycm9yIGRlIHJlZCBvIGVsIHNlcnZpZG9yIGNlcnLDsyBsYSBjb25leGnDs24gZGUgZm9ybWEgaW5lc3BlcmFkYS4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIkVsIHNlcnZpZG9yIGVudmnDsyBkYXRvcyBlcnLDs25lb3MuIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIkVsIHNlcnZpZG9yIG5vIHNvcG9ydGEgbGEgYsO6c3F1ZWRhLiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiRWwgYXVkaW8gbm8gZXhpc3RlIG8gbm8gZXMgdsOhbGlkbywgZWwgZmx1am8gQVZJIGVzdGFyw6EgY29ycnVwdG8uIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJFc3RlIGFyY2hpdm8gbm8gY29udGllbmUgZmx1am9zIHJlcHJvZHVjaWJsZXMuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJFc3RlIGFyY2hpdm8gbm8gZXMgdsOhbGlkbyB5IG5vIHNlIHB1ZWRlIHJlcHJvZHVjaXIuIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRXN0ZSBhcmNoaXZvIGVzdMOhIGNvcnJ1cHRvIHkgbm8gc2UgcHVlZGUgcmVwcm9kdWNpci4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIkVsIHRhbWHDsW8gYXRvbSBubyBlcyB2w6FsaWRvLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRXN0ZSBhcmNoaXZvIGVzdMOhIGluY29tcGxldG8geSBubyBzZSBwdWVkZSByZXByb2R1Y2lyLiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiIgorIlB1ZWRlIHF1ZSBlbCB2w61kZW8gZW4gZXN0ZSBhcmNoaXZvIG5vIHNlIHB1ZWRhIHJlcHJvZHVjaXIgY29ycmVjdGFtZW50ZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiIgorIkVzdGUgYXJjaGl2byBjb250aWVuZSBkZW1hc2lhZG9zIGZsdWpvcy4gU8OzbG8gc2UgcmVwcm9kdWNpcsOhIGVsIHByaW1lciAlZCIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisiTm8gc2UgZW5jb250csOzIHVuIGZsdWpvIHNvcG9ydGFkby4gUHVlZGUgcXVlIG5lY2VzaXRlIGluc3RhbGFyIHVuYSBleHRlbnNpw7NuICIKKyJSVFNQIGRlIEdTdHJlYW1lciBwYXJhIGxvcyBmb3JtYXRvcyBkZSBmbHVqbyBSZWFsLiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorIk5vIHNlIGVuY29udHLDsyB1biBmbHVqbyBzb3BvcnRhZG8uIFB1ZWRlIHF1ZSBuZWNlc2l0ZSBwZXJtaXRpciBtw6FzICIKKyJwcm90b2NvbG9zIGRlIHRyYW5zcG9ydGUgbyBkZSBvdHJhIGZvcm1hIHB1ZWRlIHF1ZSBsZSBmYWx0ZSBsYSBleHRlbnNpw7NuICIKKyJjb3JyZWN0YSBkZSBSVFNQIGRlIEdTdHJlYW1lci4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiTm8gc2UgcHVkbyBhYnJpciBlbCBkaXNwb3NpdGl2byBwYXJhIHJlcHJvZHVjaXIuIE90cmEgYXBsaWNhY2nDs24gZXN0w6EgdXNhbmRvICIKKyJlbCBkaXNwb3NpdGl2by4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIk5vIHNlIHB1ZG8gYWJyaXIgZWwgZGlzcG9zaXRpdm8gZGUgc29uaWRvIHBhcmEgcmVwcm9kdWNpci4gTm8gdGllbmUgcGVybWlzb3MgIgorInBhcmEgYWJyaXIgZWwgZGlzcG9zaXRpdm8uIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIk5vIHNlIHB1ZG8gYWJyaXIgZWwgZGlzcG9zaXRpdm8gcGFyYSByZXByb2R1Y2lyLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyJObyBzZSBwdWRvIGFicmlyIGVsIGRpc3Bvc2l0aXZvIGRlIHNvbmlkbyBwYXJhIHN1IGdlc3Rpw7NuIHBvciBlbCBjb250cm9sIGRlICIKKyJtZXpjbGFkby4gRXN0ZSBlbGVtZW50byBubyBzb3BvcnRhIGVzdGEgdmVyc2nDs24gZGVsIFNpc3RlbWEgZGUgc29uaWRvICIKKyJhYmllcnRvIChPU1MpLiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJFc3RlIGRpc3Bvc2l0aXZvIGRlIHNvbmlkbyBubyBzb3BvcnRhIGxhIHJlcHJvZHVjY2nDs24uIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICJFcnJvciBkZSByZXByb2R1Y2Npw7NuIGRlIHNvbmlkby4iCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkVzdGUgZGlzcG9zaXRpdm8gZGUgc29uaWRvIG5vIHNvcG9ydGEgbGEgZ3JhYmFjacOzbi4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJFcnJvciBhbCBncmFiYXIgZGVsIGRpc3Bvc2l0aXZvIGRlIHNvbmlkby4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJObyBzZSBwdWRvIGFicmlyIGVsIGRpc3Bvc2l0aXZvIGRlIHNvbmlkbyBwYXJhIGdyYWJhci4gTm8gdGllbmUgcGVybWlzb3MgIgorInBhcmEgYWJyaXIgZWwgZGlzcG9zaXRpdm8uIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICJObyBzZSBwdWRvIGFicmlyIGVsIGRpc3Bvc2l0aXZvIHBhcmEgZ3JhYmFyLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIiIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIk9yaWdlbiBkZSBsYSBncmFiYWNpw7NuIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWljcsOzZm9ubyIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIkzDrW5lYSBkZSBlbnRyYWRhIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIkNEIGludGVybm8iCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiRW50cmFkYSBTL1BESUYiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiRW50cmFkYSBBVVggMSIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJFbnRyYWRhIEFVWCAyIgorCisjLCBmdXp6eQorbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJCdWNsZSBsb2NhbCIKKworIywgZnV6enkKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIkJ1Y2xlIGxvY2FsIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJWb2x1bWVuIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiR2FuYW5jaWEiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJNb25pdG9yIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiQWx0YXZveiBpbnRlZ3JhZG8iCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIkF1cmljdWxhcmVzIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIkzDrW5lYSBkZSBzYWxpZGEiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNhbGlkYSBTL1BESUYiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIlNhbGlkYSBBVVggMSIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiU2FsaWRhIEFVWCAyIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkVycm9yIGFsIGxlZXIgJWQgYnl0ZXMgZGVsIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKyJGYWxsw7MgYWwgZW51bWVyYXIgbG9zIHBvc2libGVzIGZvcm1hdG9zIGRlIHbDrWRlbyBjb24gbG9zIHF1ZSBlbCBkaXNwb3NpdGl2byAiCisiwqslc8K7IHB1ZWRlIHRyYWJhamFyIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJObyBzZSBwdWRpZXJvbiBtYXBlYXIgbG9zIGLDumZlcmVzIGRlbCBkaXNwb3NpdGl2byDCqyVzwrsiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICIiCisiRWwgY29udHJvbGFkb3IgZGVsIGRpc3Bvc2l0aXZvIMKrJXPCuyBubyBzb3BvcnRhIG5pbmfDum4gbcOpdG9kbyBkZSBjYXB0dXJhICIKKyJjb25vY2lkby4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiIgorIkVsIGNvbnRyb2xhZG9yIGRlbCBkaXNwb3NpdGl2byDCqyVzwrsgbm8gc29wb3J0YSBuaW5nw7puIG3DqXRvZG8gZGUgY2FwdHVyYSAiCisiY29ub2NpZG8uIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJFbCBkaXNwb3NpdGl2byDCqyVzwrsgbm8gZXMgdW4gZGlzcG9zaXRpdm8gZGUgc2FsaWRhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiRWwgZGlzcG9zaXRpdm8gwqslc8K7IG5vIHB1ZWRlIGNhcHR1cmFyIGEgJWR4JWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIkVsIGRpc3Bvc2l0aXZvIMKrJXPCuyBubyBwdWVkZSBjYXB0dXJhciBlbiBlbCBmb3JtYXRvIGVzcGVjaWZpY2FkbyIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiRWwgZGlzcG9zaXRpdm8gwqslc8K7IG5vIGVzIHVuIGRpc3Bvc2l0aXZvIGRlIHNhbGlkYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICJObyBzZSBwdWRpZXJvbiBvYnRlbmVyIGxvcyBwYXLDoW1ldHJvcyBwYXJhIGVsIGRpc3Bvc2l0aXZvIMKrJXPCuyIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIiIKKyJFbCBkaXNwb3NpdGl2byBkZSBlbnRyYWRhIGRlIHbDrWRlbyBubyBhY2VwdMOzIGVsIGFqdXN0ZSBkZSBsYSBudWV2YSB0YXNhIGRlICIKKyJmb3RvZ3JhbWFzLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICIiCisiRWwgZGlzcG9zaXRpdm8gZGUgZW50cmFkYSBkZSB2w61kZW8gbm8gYWNlcHTDsyBlbCBhanVzdGUgZGUgbGEgbnVldmEgdGFzYSBkZSAiCisiZm90b2dyYW1hcy4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIiIKKyJFbCBjb250cm9sYWRvciBkZWwgZGlzcG9zaXRpdm8gwqslc8K7IG5vIHNvcG9ydGEgbmluZ8O6biBtw6l0b2RvIGRlIGNhcHR1cmEgIgorImNvbm9jaWRvLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICIiCisiRWwgY29udHJvbGFkb3IgZGVsIGRpc3Bvc2l0aXZvIMKrJXPCuyBubyBzb3BvcnRhIG5pbmfDum4gbcOpdG9kbyBkZSBjYXB0dXJhICIKKyJjb25vY2lkby4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiIgorIkVsIGRpc3Bvc2l0aXZvIGRlIGVudHJhZGEgZGUgdsOtZGVvIG5vIGFjZXB0w7MgZWwgYWp1c3RlIGRlIGxhIG51ZXZhIHRhc2EgZGUgIgorImZvdG9ncmFtYXMuIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIkZhbGzDsyBhbCBvYnRlbmVyIGxhIHBvc2ljacOzbiBkZWwgc2ludG9uaXphZG9yICVkIGVuIGVsIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkVycm9yIGFsIGxlZXIgJWQgYnl0ZXMgZGVsIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiRWwgZGlzcG9zaXRpdm8gwqslc8K7IG5vIGVzIHVuIGRpc3Bvc2l0aXZvIGRlIHNhbGlkYS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiRmFsbMOzIGFsIGVzdGFibGVjZXIgbGEgZW50cmFkYSAlZCBlbiBlbCBkaXNwb3NpdGl2byAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJGYWxsw7MgYWwgZXN0YWJsZWNlciBsYSBlbnRyYWRhICVkIGVuIGVsIGRpc3Bvc2l0aXZvICVzLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZhbGzDsyBhbCBvYnRlbmVyIGxhIHBvdGVuY2lhIGRlIGxhIHNlw7FhbCBwYXJhIGVsIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJFbCBjb250cm9sYWRvciBkZWwgZGlzcG9zaXRpdm8gwqslc8K7IG5vIHNvcG9ydGEgbmluZ8O6biBtw6l0b2RvIGRlIGNhcHR1cmEgIgorImNvbm9jaWRvLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJFbCBkaXNwb3NpdGl2byBkZSBlbnRyYWRhIGRlIHbDrWRlbyBubyBhY2VwdMOzIGVsIGFqdXN0ZSBkZSBsYSBudWV2YSB0YXNhIGRlICIKKyJmb3RvZ3JhbWFzLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJFbCBkaXNwb3NpdGl2byBkZSBlbnRyYWRhIGRlIHbDrWRlbyBubyBhY2VwdMOzIGVsIGFqdXN0ZSBkZSBsYSBudWV2YSB0YXNhIGRlICIKKyJmb3RvZ3JhbWFzLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisiRWwgZGlzcG9zaXRpdm8gZGUgZW50cmFkYSBkZSB2w61kZW8gbm8gYWNlcHTDsyBlbCBhanVzdGUgZGUgbGEgbnVldmEgdGFzYSBkZSAiCisiZm90b2dyYW1hcy4iCisKKyMsIGZ1enp5Cittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIkZhbGzDsyBhbCBkZWNvZGlmaWNhciBsYSBpbWFnZW4gSlBFRyIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIkVycm9yIGFsIG9idGVuZXIgbGFzIGNhcGFjaWRhZGVzIGRlbCBkaXNwb3NpdGl2byDCqyVzwrs6IE5vIGVzIHVuIGNvbnRyb2xhZG9yICIKKyJwYXJhIHY0bDIuIENvbXBydWViZSBzaSBlcyB1biBjb250cm9sYWRvciBwYXJhIHY0bDEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiRmFsbMOzIGFsIGNvbnN1bHRhciBsb3MgYXRyaWJ1dG9zIGRlIGxhIGVudHJhZGEgJWQgZW4gZWwgZGlzcG9zaXRpdm8gJXMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIkZhbGzDsyBhbCBvYnRlbmVyIGxhIHBvc2ljacOzbiBkZWwgc2ludG9uaXphZG9yICVkIGVuIGVsIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICJGYWxsw7MgYWwgY29uc3VsdGFyIGxhIG5vcm1hIHBhcmEgZWwgZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRmFsbMOzIGFsIG9idGVuZXIgbG9zIGF0cmlidXRvcyBkZSBjb250cm9sIGVuIGVsIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTm8gc2UgcHVlZGUgaWRlbnRpZmljYXIgZWwgZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJFc3RvIG5vIGVzIHVuIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJObyBzZSBwdWRvIGFicmlyIGVsIGRpc3Bvc2l0aXZvIMKrJXPCuyBwYXJhIGxlY3R1cmEgeSBlc2NyaXR1cmEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiRWwgZGlzcG9zaXRpdm8gwqslc8K7IG5vIGVzIHVuIGRpc3Bvc2l0aXZvIGRlIGNhcHR1cmEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJFbCBkaXNwb3NpdGl2byDCqyVzwrsgbm8gZXMgdW4gZGlzcG9zaXRpdm8gZGUgc2FsaWRhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIkVsIGRpc3Bvc2l0aXZvIMKrJXPCuyBubyBlcyB1biBkaXNwb3NpdGl2byBkZSBzYWxpZGEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiTm8gc2UgcHVkbyBhYnJpciBlbCBkaXNwb3NpdGl2byDCqyVzwrsgcGFyYSBsZWN0dXJhIHkgZXNjcml0dXJhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRmFsbMOzIGFsIGVzdGFibGVjZXIgbGEgbm9ybWEgcGFyYSBlbCBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIkZhbGzDsyBhbCBvYnRlbmVyIGxhIGZyZWN1ZW5jaWEgYWN0dWFsIGRlbCBzaW50b25pemFkb3IgcGFyYSBlbCBkaXNwb3NpdGl2byAiCisiwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisiRmFsbMOzIGFsIGVzdGFibGVjZXIgbGEgZnJlY3VlbmNpYSBhY3R1YWwgZGVsIHNpbnRvbml6YWRvciBwYXJhIGVsICIKKyJkaXNwb3NpdGl2byDCqyVzwrsgYSAlbHUgSHouIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZhbGzDsyBhbCBvYnRlbmVyIGxhIHBvdGVuY2lhIGRlIGxhIHNlw7FhbCBwYXJhIGVsIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZhbGzDsyBhbCBvYnRlbmVyIGVsIHZhbG9yIHBhcmEgZWwgY29udHJvbCAlZCBkZWwgZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIkZhbGzDsyBhbCBlc3RhYmxlY2VyIGVsIHZhbG9yICVkcyBwYXJhIGVsIGNvbnRyb2wgJWQgZGVsIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJGYWxsw7MgYWwgb2J0ZW5lciBsYSBlbnRyYWRhIGFjdHVhbCBlbiBlbCBkaXNwb3NpdGl2byDCqyVzwrsuIFF1aXrDoSBzZWEgdW4gIgorImRpc3Bvc2l0aXZvIGRlIHJhZGlvLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiRmFsbMOzIGFsIG9idGVuZXIgbGEgc2FsaWRhIGFjdHVhbCBlbiBlbCBkaXNwb3NpdGl2byDCqyVzwrsuIFF1aXrDoSBzZWEgdW4gIgorImRpc3Bvc2l0aXZvIGRlIHJhZGlvLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJGYWxsw7MgYWwgZXN0YWJsZWNlciBsYSBzYWxpZGEgJWQgZW4gZWwgZGlzcG9zaXRpdm8gJXMuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiRWwgY2FtYmlvIGRlIHJlc29sdWNpw7NuIGR1cmFudGUgbGEgcmVwcm9kdWNjacOzbiBhw7puIG5vIGVzdMOhIHNvcG9ydGFkby4iCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIk5vIHNlIHB1ZWRlIG9wZXJhciBzaW4gcmVsb2oiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIkVycm9yIGludGVybm8gZGUgZmx1am8gZGUgZGF0b3MuIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAiRXJyb3IgZW4gZWwgZmx1am8gZGUgZGF0b3MgaW50ZXJuby4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBjYXB0dXJlIgorI34gbXNnc3RyICJFbCBkaXNwb3NpdGl2byDCqyVzwrsgbm8gZXMgdW4gZGlzcG9zaXRpdm8gZGUgc2FsaWRhLiIKKworI34gbXNnaWQgIkdvdCB1bmV4cGVjdGVkIGZyYW1lIHNpemUgb2YgJXUgaW5zdGVhZCBvZiAldS4iCisjfiBtc2dzdHIgIlNlIG9idHV2byB1biB0YW1hw7FvIGRlIGN1YWRybyBpbmVzcGVyYWRvICV1IGVuIGx1Z2FyIGRlICV1LiIKKworI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiRmFsbMOzIGFsIGludGVudGFyIG9idGVuZXIgY3VhZHJvcyBkZSB2w61kZW8gZGVsIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyN+IG1zZ2lkICJGYWlsZWQgYWZ0ZXIgJWQgdHJpZXMuIGRldmljZSAlcy4gc3lzdGVtIGVycm9yOiAlcyIKKyN+IG1zZ3N0ciAiRmFsbMOzIGRlc3B1w6lzIGRlICVkIGludGVudG9zLiBEaXNwb3NpdGl2byAlcy4gRXJyb3IgZGVsIHNpc3RlbWE6ICVzIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAiQmFzcyIKKworI34gbXNnaWQgIlRyZWJsZSIKKyN+IG1zZ3N0ciAiQWd1ZG9zIgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIlNpbnRldGl6YWRvciIKKworI34gbXNnaWQgIlBDTSIKKyN+IG1zZ3N0ciAiUENNIgorCisjfiBtc2dpZCAiU3BlYWtlciIKKyN+IG1zZ3N0ciAiQWx0YXZveiIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIkzDrW5lYSBkZSBlbnRyYWRhIgorCisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgIkNEIgorCisjfiBtc2dpZCAiTWl4ZXIiCisjfiBtc2dzdHIgIk1lemNsYWRvciIKKworI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICJQQ00tMiIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAiR3JhYmFjacOzbiIKKworI34gbXNnaWQgIkluLWdhaW4iCisjfiBtc2dzdHIgIkdhbmFuY2lhIGRlIGVudHJhZGEiCisKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAiR2FuYW5jaWEgZGUgc2FsaWRhIgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICJMw61uZWEtMSIKKworI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAiTMOtbmVhLTIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIkzDrW5lYS0zIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICJEaWdpdGFsLTEiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgIkRpZ2l0YWwtMiIKKworI34gbXNnaWQgIkRpZ2l0YWwtMyIKKyN+IG1zZ3N0ciAiRGlnaXRhbC0zIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIkVudHJhZGEgZGUgdGVsw6lmb25vIgorCisjfiBtc2dpZCAiUGhvbmUtb3V0IgorI34gbXNnc3RyICJTYWxpZGEgZGUgdGVsw6lmb25vIgorCisjfiBtc2dpZCAiVmlkZW8iCisjfiBtc2dzdHIgIlbDrWRlbyIKKworI34gbXNnaWQgIlJhZGlvIgorI34gbXNnc3RyICJSYWRpbyIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIiIKKyN+ICJObyBzZSBwdWRvIGFicmlyIGVsIGRpc3Bvc2l0aXZvIGRlIHNvbmlkbyBwYXJhIHN1IGdlc3Rpw7NuIHBvciBlbCBjb250cm9sICIKKyN+ICJkZSBtZXpjbGFkby4iCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJObyBzZSBwdWRvIGFicmlyIGVsIGRpc3Bvc2l0aXZvIGRlIHNvbmlkbyBwYXJhIHN1IGdlc3Rpw7NuIHBvciBlbCBjb250cm9sICIKKyN+ICJkZSBtZXpjbGFkby4gRXN0ZSBlbGVtZW50byBubyBzb3BvcnRhIGVzdGEgdmVyc2nDs24gZGVsIFNpc3RlbWEgZGUgc29uaWRvICIKKyN+ICJhYmllcnRvIChPU1MpLiIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAiTWFlc3RybyIKKworI34gbXNnaWQgIkZyb250IgorI34gbXNnc3RyICJGcm9udGFsIgorCisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAiVHJhc2VybyIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkF1cmljdWxhcmVzIgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICJDZW50cm8iCisKKyN+IG1zZ2lkICJMRkUiCisjfiBtc2dzdHIgIkxGRSIKKworI34gbXNnaWQgIlN1cnJvdW5kIgorI34gbXNnc3RyICJFbnZvbHZlbnRlIgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAiTGF0ZXJhbCIKKworI34gbXNnaWQgIkFVWCBPdXQiCisjfiBtc2dzdHIgIlNhbGlkYSBBVVgiCisKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAiUHJvZnVuZGlkYWQgM0QiCisKKyN+IG1zZ2lkICIzRCBDZW50ZXIiCisjfiBtc2dzdHIgIkNlbnRybyAzRCIKKworI34gbXNnaWQgIjNEIEVuaGFuY2UiCisjfiBtc2dzdHIgIk1lam9yYSAzRCIKKworI34gbXNnaWQgIlRlbGVwaG9uZSIKKyN+IG1zZ3N0ciAiVGVsZcyBZm9ubyIKKworI34gbXNnaWQgIlZpZGVvIEluIgorI34gbXNnc3RyICJFbnRyYWRhIGRlIHbDrWRlbyIKKworI34gbXNnaWQgIkFVWCBJbiIKKyN+IG1zZ3N0ciAiRW50cmFkYSBBVVgiCisKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAiR2FuYW5jaWEgZGUgZ3JhYmFjacOzbiIKKworI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICJHYW5hbmNpYSBkZSBzYWxpZGEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICJBdW1lbnRvIGRlbCBtaWNyw7Nmb25vIgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAiRGlhZ25vzIFzdGljbyIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgIkF1bWVudG8gZGUgYmFqb3MiCisKKyN+IG1zZ2lkICJQbGF5YmFjayBQb3J0cyIKKyN+IG1zZ3N0ciAiUHVlcnRvcyBkZSByZXByb2R1Y2Npw7NuIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIkVudHJhZGEiCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTW9uaXRvciBkZSBvcmlnZW4iCisKKyN+IG1zZ2lkICJLZXlib2FyZCBCZWVwIgorI34gbXNnc3RyICJQaXRpZG8gZGUgdGVjbGFkbyIKKworI34gbXNnaWQgIlNpbXVsYXRlIFN0ZXJlbyIKKyN+IG1zZ3N0ciAiU2ltdWxhciBlc3TDqXJlbyIKKworI34gbXNnaWQgIlN0ZXJlbyIKKyN+IG1zZ3N0ciAiRXN0ZcyBcmVvIgorCisjfiBtc2dpZCAiU3Vycm91bmQgU291bmQiCisjfiBtc2dzdHIgIlNvbmlkbyBlbnZvbHZlbnRlIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBHYWluIgorI34gbXNnc3RyICJHYW5hbmNpYSBkZWwgbWljcsOzZm9ubyIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICJBbHRhdm96IGRlIG9yaWdlbiIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgU291cmNlIgorI34gbXNnc3RyICJNaWNyb8yBZm9ubyBkZSBvcmlnZW4iCisKKyN+IG1zZ2lkICJKYWNrIgorI34gbXNnc3RyICJKYWNrIgorCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICJDZW50cmFkbyAvIExGRSIKKworI34gbXNnaWQgIlN0ZXJlbyBNaXgiCisjfiBtc2dzdHIgIk1lemNsYWRvciBlc3TDqXJlbyIKKworI34gbXNnaWQgIk1vbm8gTWl4IgorI34gbXNnc3RyICJNZXpjbGFkb3IgbW9ubyIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAiTWV6Y2xhZG9yIGRlIGVudHJhZGEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDEiCisjfiBtc2dzdHIgIk1pY3LDs2Zvbm8gMSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiTWljcsOzZm9ubyAyIgorCisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIlNhbGlkYSBkaWdpdGFsIgorCisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAiRW50cmFkYSBkaWdpdGFsIgorCisjfiBtc2dpZCAiSERNSSIKKyN+IG1zZ3N0ciAiSERNSSIKKworI34gbXNnaWQgIk1vZGVtIgorI34gbXNnc3RyICJNb8yBZGVtIgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAiQXVyaWN1bGFyZXMiCisKKyN+IG1zZ2lkICJPdGhlciIKKyN+IG1zZ3N0ciAiT3RybyIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgIk5pbmd1bm8iCisKKyN+IG1zZ2lkICJPbiIKKyN+IG1zZ3N0ciAiRW5jZW5kaWRvIgorCisjfiBtc2dpZCAiT2ZmIgorI34gbXNnc3RyICJBcGFnYWRvIgorCisjfiBtc2dpZCAiTXV0ZSIKKyN+IG1zZ3N0ciAiU2lsZW5jaWFyIgorCisjfiBtc2dpZCAiRmFzdCIKKyN+IG1zZ3N0ciAiUsOhcGlkbyIKKworI34gbXNnaWQgIlZlcnkgTG93IgorI34gbXNnc3RyICJNdXkgYmFqbyIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAiQmFqbyIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAiTWVkaW8iCisKKyN+IG1zZ2lkICJIaWdoIgorI34gbXNnc3RyICJBbHRvIgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICJNdXkgYWx0byIKKworI34gbXNnaWQgIlByb2R1Y3Rpb24iCisjfiBtc2dzdHIgIlByb2R1Y2Npw7NuIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTWljcm9waG9uZSIKKyN+IG1zZ3N0ciAiTWljcm/MgWZvbm8gZGVsIHBhbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICJFbnRyYWRhIGRlbCBwYW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiQXVyaWN1bGFyZXMgZGVsIHBhbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIE91dCIKKyN+IG1zZ3N0ciAiU2FsaWRhIGRlbCBwYW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciB2ZXJkZSIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciByb3NhIgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIGF6dWwiCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIGJsYW5jbyIKKworI34gbXNnaWQgIkJsYWNrIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgbmVncm8iCisKKyN+IG1zZ2lkICJHcmF5IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgZ3JpcyIKKworI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIG5hcmFuamEiCisKKyN+IG1zZ2lkICJSZWQgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciByb2pvIgorCisjfiBtc2dpZCAiWWVsbG93IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgYW1hcmlsbG8iCisKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIHZlcmRlIGRlbCBwYW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiUGluayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIHJvc2EgZGVsIHBhbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJCbHVlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgYXp1bCBkZWwgcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIldoaXRlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgYmxhbmNvIGRlbCBwYW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiQmxhY2sgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBuZWdybyBkZWwgcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIkdyYXkgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBncmlzIGRlbCBwYW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiT3JhbmdlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgbmFyYW5qYSBkZWwgcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIlJlZCBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIHJvam8gZGVsIHBhbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJZZWxsb3cgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBhbWFyaWxsbyBkZWwgcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIlNwcmVhZCBPdXRwdXQiCisjfiBtc2dzdHIgIkV4cGFuZGlyIHNhbGlkYSIKKworI34gbXNnaWQgIkRvd25taXgiCisjfiBtc2dzdHIgIlJlZHVjY2nDs24gZGUgY2FuYWxlcyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIkVudHJhZGEgZGVsIG1lemNsYWRvciB2aXJ0dWFsIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBPdXRwdXQiCisjfiBtc2dzdHIgIlNhbGlkYSBkZWwgbWV6Y2xhZG9yIHZpcnR1YWwiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICJDYW5hbGVzIGRlbCBtZXpjbGFkb3IgdmlydHVhbCIKKworI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICJGdW5jacOzbiAlcyAlZCIKKworI34gbXNnaWQgIiVzIEZ1bmN0aW9uIgorI34gbXNnc3RyICJGdW5jacOzbiAlcyIKKworI34gbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgb24gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJFcnJvciBhbCBsZWVyICVkIGJ5dGVzIGRlbCBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIk5vIHNlIHB1ZWRlbiBlbmNvbGFyIGxvcyBiw7pmZXJlcyBlbiBlbCBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNvdW5kIHNlcnZlciIKKyN+IG1zZ3N0ciAiTm8gc2UgcHVkbyBlc3RhYmxlY2VyIGxhIGNvbmV4acOzbiBjb24gZWwgc2Vydmlkb3IgZGUgc29uaWRvIgorCisjfiBtc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IHNvdW5kIHNlcnZlciBjYXBhYmlsaXRpZXMiCisjfiBtc2dzdHIgIkZhbGzDsyBhbCBwcmVndW50YXIgYWwgc2Vydmlkb3IgZGUgc29uaWRvIHN1cyBjYXBhY2lkYWRlcyIKKworI34gbXNnaWQgIiIKKyN+ICJUaGUgYnVmZmVyIHR5cGUgaXMgbm90IHN1cHBvcnRlZCwgb3IgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMsIG9yIG5vICIKKyN+ICJidWZmZXJzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgeWV0LCBvciB0aGUgdXNlcnB0ciBvciBsZW5ndGggYXJlIGludmFsaWQuICIKKyN+ICJkZXZpY2UgJXMiCisjfiBtc2dzdHIgIiIKKyN+ICJFbCB0aXBvIGRlIGLDumZlciBubyBlc3TDoSBzb3BvcnRhZG8gbyBlbCDDrW5kaWNlIGVzdMOhIGZ1ZXJhIGRlIGxvcyBsw61taXRlcyAiCisjfiAibyBubyBzZSBoYW4gcmVnaXN0cmFkbyBiw7pmZXJlcyB0b2RhdsOtYSBvIGxhIGxvbmdpdHVkIG8gZWwgdXNlcnB0ciBzb24gIgorI34gImludsOhbGlkb3MuIERpc3Bvc2l0aXZvICVzIgorCisjfiBtc2dpZCAiIgorI34gIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiBOb3QgZW5vdWdoIG1lbW9yeS4iCisjfiBtc2dzdHIgIiIKKyN+ICJGYWxsw7MgYWwgaW50ZW50YXIgb2J0ZW5lciBjdWFkcm9zIGRlIHbDrWRlbyBkZWwgZGlzcG9zaXRpdm8gwqslc8K7LiBObyBoYXkgIgorI34gIm1lbW9yaWEgc3VmaWNpZW50ZS4iCisKKyN+IG1zZ2lkICJpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGVucXVldWUgYSB1c2VyIHBvaW50ZXIgYnVmZmVyLiBkZXZpY2UgJXMuIgorI34gbXNnc3RyICIiCisjfiAiTWVtb3JpYSBpbnN1ZmljaWVudGUgcGFyYSBlbmNvbGFyIHVuIGLDumZlciBwdW50ZXJvIGRlIHVzdWFyaW8uICIKKyN+ICJEaXNwb3NpdGl2byAlcy4iCisKKyN+IG1zZ2lkICJObyBmcmVlIGJ1ZmZlcnMgZm91bmQgaW4gdGhlIHBvb2wgYXQgaW5kZXggJWQuIgorI34gbXNnc3RyICJObyBzZSBlbmNvbnRyYXJvbiBiw7pmZXJlcyBsaWJyZXMgZW4gZWwgw61uZGljZSAlZCBkZWwgwqtwb29swrsuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGdldCBidWZmZXJzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJObyBzZSBwdWRpZXJvbiBvYnRlbmVyIGLDumZlcmVzIGRlbCBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGdldCBlbm91Z2ggYnVmZmVycyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiTm8gc2UgcHVkaWVyb24gb2J0ZW5lciBiw7pmZXJlcyBzdWZpY2llbnRlcyBkZWwgZGlzcG9zaXRpdm8gwqslc8K7LiIKKworI34gbXNnaWQgIkVycm9yIHN0YXJ0aW5nIHN0cmVhbWluZyBjYXB0dXJlIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJFcnJvciBhbCBpbmljaWFyIGVsIGZsdWpvIGRlIGNhcHR1cmEgZGVsIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyN+IG1zZ2lkICJFcnJvciBzdG9wcGluZyBzdHJlYW1pbmcgY2FwdHVyZSBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiRXJyb3IgYWwgcGFyYXIgZWwgZmx1am8gZGUgY2FwdHVyYSBkZWwgZGlzcG9zaXRpdm8gwqslc8K7LiIKKworI34gbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcy4nIgorI34gbXNnc3RyICJGYWxsw7MgYWwgb2J0ZW5lciBsb3MgYXRyaWJ1dG9zIGRlIGNvbnRyb2wgZW4gZWwgZGlzcG9zaXRpdm8gwqslc8K7LiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCByZWFkIGZyb20gQ0QuIgorI34gbXNnc3RyICJObyBzZSBwdWRvIGxlZXIgZGVsIENELiIKKworI34gbXNnaWQgIkRpc2MgaXMgbm90IGFuIEF1ZGlvIENELiIKKyN+IG1zZ3N0ciAiRWwgZGlzY28gbm8gZXMgdW4gQ0QgZGUgc29uaWRvLiIKKworI34gbXNnaWQgIlRoaXMgZmlsZSBpcyBlbmNyeXB0ZWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorI34gbXNnc3RyICJFc3RlIGFyY2hpdm8gZXN0w6EgY2lmcmFkbyB5IG5vIHNlIHB1ZWRlIHJlcHJvZHVjaXIuIgpkaWZmIC0tZ2l0IGEvcG8vZXUucG8gYi9wby9ldS5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODNiOTA2Ci0tLSAvZGV2L251bGwKKysrIGIvcG8vZXUucG8KQEAgLTAsMCArMSw5MTIgQEAKKyMgdHJhbnNsYXRpb24gb2YgZ3N0LXBsdWdpbnMtZ29vZC5tYXN0ZXIucG8gdG8gQmFzcXVlCisjIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiwgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdzdC1wbHVnaW5zLWdvb2QgcGFja2FnZS4KKyMKKyMgScOxYWtpIExhcnJhw7FhZ2EgTXVyZ29pdGlvIDxkb290ZW9AZXVza2FsZ251Lm9yZz4sIDIwMDksIDIwMTAuCisjIE1pa2VsIE9sYXNhZ2FzdGkgVXJhbmdhIDxoZXlfbmVrZW5AbXVuZHVyYXQubmV0PiwgMjAwOSwgMjAxMC4KK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QtMC4xMC4xOC4yXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTAtMDMtMjUgMTI6MzcrMDEwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogTWlrZWwgT2xhc2FnYXN0aSBVcmFuZ2EgPGhleV9uZWtlbkBtdW5kdXJhdC5uZXQ+XG4iCisiTGFuZ3VhZ2UtVGVhbTogQmFzcXVlIDx0cmFuc2xhdGlvbi10ZWFtLWV1QGxpc3RzLnNvdXJjZWZvcmdlLm5ldD5cbiIKKyJMYW5ndWFnZTogZXVcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJYLUdlbmVyYXRvcjogS0JhYmVsIDEuMTEuNFxuIgorIlBsdXJhbC1Gb3JtczogbnBsdXJhbHM9MjsgcGx1cmFsPShuICE9IDEpO1xuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIkh1dHMgZWdpbiBkdSBKUEVHIGlydWRpYSBkZXNrb2RldHplYW4iCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIiclcycgLSAnJXMnIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJFemluIGl6YW4gZGEga29uZWt0YXR1IHplcmJpdHphcmlhcmVraW4iCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiRXppbiBpemFuIGRhIGtvbmVrdGF0dSB6ZXJiaXR6YXJpYXJla2luIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJFemluIGl6YW4gZGEga29uZXhpb2EgZXphcnJpIHNvaW51LXplcmJpdHphcmlhcmVraW4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICIiCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIiIKKyJFeiBkYWdvIGF1ZGlvLXNhcnJlcmFyaWssIGVkbyBiYWxpb2dhYmVhIGRhLiBBVkkga29ycm9udGVhIGhvbmRhdHVhIGVnb25nbyAiCisiZGEuIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJGaXR4YXRlZ2kgaG9ycmV0YW4gZXogZGFnbyBlcnJlcHJvZHV6aSBkYWl0ZWtlZW4ga29ycm9udGVyaWsuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJGaXR4YXRlZ2kgaGF1IGV6IGRhIGJhbGlvemtvYSBldGEgZXppbiBkYSBlcnJlcHJvZHV6aXR1LiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkZpdHhhdGVnaSBoYXUgaG9uZGF0dWEgZGFnbywgZXRhIGV6aW4gZGEgZXJyZXByb2R1eml0dS4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRml0eGF0ZWdpIGhhdSBvc2F0dSBnYWJlYSBkYWdvLCBldGEgZXppbiBkYSBlcnJlcHJvZHV6aXR1LiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiIgorIkxpdGVrZWVuYSBkYSBmaXR4YXRlZ2kgaG9uZXRha28gYmlkZW9hIGV6IGJlaGFyIGJlemFsYSBlcnJlcHJvZHV6aXR6ZWEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIiIKKyJGaXR4YXRlZ2kgaG9ycmVrIGtvcnJvbnRlIGdlaGllZ2kgZGl0dS4gRXJyZXByb2R1eml0dSBzb2lsaWsgbGVoZW4gJWQocilhayIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisiRXogZGEgb25hcnR1dGFrbyBrb3Jyb250ZXJpayBhdXJraXR1LiBHU3RyZWFtZXIgUlRTUCBoZWRhcGVuYSBpbnN0YWxhdHUgIgorImJlaGFya28gZHV6dSBSZWFsIG11bHRpbWVkaWFrbyBrb3Jyb250ZWVudHpha28uIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiRXogZGEgb25hcnR1dGFrbyBrb3Jyb250ZXJpayBhdXJraXR1LiBHYXJyYWlva28gcHJvdG9rb2xvIGdlaGlhZ28gYmFpbWVudHplYSAiCisiYmVoYXIgZGEgZWRvIEdTdHJlYW1lciBSVFNQIGhlZGFwZW4gZWdva2lhIGZhbHRhIHphaXp1LiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyJFemluIGl6YW4gZGEgYXVkaW9hcmVuIGdhaWx1YSBpcmVraSBlcnJlcHJvZHV6aXR6ZWtvLiBCZXN0ZSBhcGxpa2F6aW8gYmF0ZWsgIgorImRhcmFiaWwgZ2FpbHVhLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiRXppbiBpemFuIGRhIGF1ZGlvYXJlbiBnYWlsdWEgaXJla2kgZXJyZXByb2R1eml0emVrby4gRXogZHV6dSBiYWltZW5payAiCisiZ2FpbHVhIGlyZWtpdHpla28uIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIkV6aW4gaXphbiBkYSBhdWRpb2FyZW4gZ2FpbHVhIGlyZWtpIGVycmVwcm9kdXppdHpla28uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIkV6aW4gaXphbiBkYSBhdWRpb2FyZW4gZ2FpbHVhIGlyZWtpIGVycmVwcm9kdXppdHpla28uIEVsZW1lbnR1IGhvbmVrIGV6IGR1ICIKKyJvbmFydHplbiBPcGVuIFNvdW5kIFN5c3RlbS1lbiBiZXJ0c2lvIGhhdS4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiQXVkaW8gZ2FpbHUgaG9uZWsgZXogZHUgZXJyZXByb2R1eml0emVhIG9uYXJ0emVuLiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiRXJyb3JlYSBhdWRpb2EgZXJyZXByb2R1eml0emVhbi4iCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkF1ZGlvIGdhaWx1IGhvbmVrIGV6IGR1IGdyYWJhdHplYSBvbmFydHplbi4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJFcnJvcmVhIGF1ZGlva28gZ2FpbHV0aWsgZ3JhYmF0emVhbi4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJFemluIGl6YW4gZGEgYXVkaW9hcmVuIGdhaWx1YSBpcmVraSBncmFiYXR6ZWtvLiBFeiBkdXp1IGJhaW1lbmlrIGdhaWx1YSAiCisiaXJla2l0emVrby4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIkV6aW4gaXphbiBkYSBhdWRpb2FyZW4gZ2FpbHVhIGlyZWtpIGdyYWJhdHpla28uIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAiR3JhYmF6aW9hcmVuIGl0dXJidXJ1YSIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pa3JvZm9ub2EiCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJTYXJyZXJha28gbGluZWEiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiQmFybmVrbyBDRGEiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiU1BESUYgc2FycmVyYSIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICIxLiBzYXJyZXJhIGxhZ3VuZ2FycmlhIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIjIuIHNhcnJlcmEgbGFndW5nYXJyaWEiCisKKyMsIGZ1enp5Cittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIkF0emVyYS1iZWdpenRhIgorCisjLCBmdXp6eQorbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiQXR6ZXJhLWJlZ2l6dGEiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIkJvbHVtZW5hIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiSXJhYmF6aWEiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJNb25pdG9yZWEiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJCYXJuZWtvIGJvemdvcmFpbHVhIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICJFbnR6dW5nYWlsdWEiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiSXJ0ZWVyYWtvIGxpbmVhIgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJTUERJRiBpcnRlZXJhIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICIxLiBpcnRlZXJhIGxhZ3VuZ2FycmlhIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICIyLiBpcnRlZXJhIGxhZ3VuZ2FycmlhIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkVycm9yZWEgZ2VydGF0dSBkYSAnJTIkcycgZ2FpbHVhbiAlMSRkIGJ5dGUgaXJha3VydHplYW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIkV6aW4gaXphbiBkaXJhICclcycgZ2FpbHVhcmVuIGJ1ZmZlcnJhayBtYXBhdHUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiIgorIiclcycgZ2FpbHVhcmVuIGtvbnRyb2xhdHphaWxlYWsgZXogZHUgb25hcnR6ZW4ga2FwdHVyYS1tZXRvZG8gZXphZ3VuaWsuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIiIKKyInJXMnIGdhaWx1YXJlbiBrb250cm9sYXR6YWlsZWFrIGV6IGR1IG9uYXJ0emVuIGthcHR1cmEtbWV0b2RvIGV6YWd1bmlrLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiJyVzJyBnYWlsdWEgZXogZGEgaXJ0ZWVyYWtvIGdhaWx1IGJhdC4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICInJXMnIGdhaWx1YSBleiBkYSBrYXB0dXJhLWdhaWx1IGJhdC4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICInJXMnIGdhaWx1YSBleiBkYSBrYXB0dXJhLWdhaWx1IGJhdC4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIiclcycgZ2FpbHVhIGV6IGRhIGlydGVlcmFrbyBnYWlsdSBiYXQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiRXppbiBpemFuIGRpcmEgJyVzJyBnYWlsdWFyZW4gcGFyYW1ldHJvYWsgZXNrdXJhdHUiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICIiCisiQmlkZW9hcmVuIHNhcnJlcmFrbyBnYWlsdWFrIGV6IGR1IGZvdG9ncmFtYS10YW1haW5hcmVuIGV6YXJwZW4gYmVycmlhICIKKyJvbmFydHplbi4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiIgorIkJpZGVvYXJlbiBzYXJyZXJha28gZ2FpbHVhayBleiBkdSBmb3RvZ3JhbWEtdGFtYWluYXJlbiBlemFycGVuIGJlcnJpYSAiCisib25hcnR6ZW4uIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICIiCisiJyVzJyBnYWlsdWFyZW4ga29udHJvbGF0emFpbGVhayBleiBkdSBvbmFydHplbiBrYXB0dXJhLW1ldG9kbyBlemFndW5pay4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiIgorIiclcycgZ2FpbHVhcmVuIGtvbnRyb2xhdHphaWxlYWsgZXogZHUgb25hcnR6ZW4ga2FwdHVyYS1tZXRvZG8gZXphZ3VuaWsuIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIiIKKyJCaWRlb2FyZW4gc2FycmVyYWtvIGdhaWx1YWsgZXogZHUgZm90b2dyYW1hLXRhbWFpbmFyZW4gZXphcnBlbiBiZXJyaWEgIgorIm9uYXJ0emVuLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJIdXRzIGVnaW4gZHUgJyUyJHMnIGdhaWx1a28gJTEkZC4gc2ludG9uaXphZG9yZWFyZW4gZXphcnBlbmFrIGVza3VyYXR6ZWFuLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRXJyb3JlYSBnZXJ0YXR1IGRhICclMiRzJyBnYWlsdWFuICUxJGQgYnl0ZSBpcmFrdXJ0emVhbi4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiJyVzJyBnYWlsdWEgZXogZGEgaXJ0ZWVyYWtvIGdhaWx1IGJhdC4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiSHV0cyBlZ2luIGR1ICclMiRzJyBnYWlsdWtvICUxJGQuIHNhcnJlcmEgZXphcnR6ZWFuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkh1dHMgZWdpbiBkdSAnJTIkcycgZ2FpbHVrbyAlMSRkLiBzYXJyZXJhIGV6YXJ0emVhbi4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJIdXRzIGVnaW4gZHUgJyVzJyBnYWlsdWFyZW4gc2VpbmFsZWFyZW4gaW5kYXJyYSBlc2t1cmF0emVhbi4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyInJXMnIGdhaWx1YXJlbiBrb250cm9sYXR6YWlsZWFrIGV6IGR1IG9uYXJ0emVuIGthcHR1cmEtbWV0b2RvIGV6YWd1bmlrLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJCaWRlb2FyZW4gc2FycmVyYWtvIGdhaWx1YWsgZXogZHUgZm90b2dyYW1hLXRhbWFpbmFyZW4gZXphcnBlbiBiZXJyaWEgIgorIm9uYXJ0emVuLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJCaWRlb2FyZW4gc2FycmVyYWtvIGdhaWx1YWsgZXogZHUgZm90b2dyYW1hLXRhbWFpbmFyZW4gZXphcnBlbiBiZXJyaWEgIgorIm9uYXJ0emVuLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisiQmlkZW9hcmVuIHNhcnJlcmFrbyBnYWlsdWFrIGV6IGR1IGZvdG9ncmFtYS10YW1haW5hcmVuIGV6YXJwZW4gYmVycmlhICIKKyJvbmFydHplbi4iCisKKyMsIGZ1enp5Cittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIkh1dHMgZWdpbiBkdSBKUEVHIGlydWRpYSBkZXNrb2RldHplYW4iCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJFcnJvcmVhIGdlcnRhdHUgZGEgJyVzJyBnYWlsdWFyZW4gYWhhbG1lbmEgZXNrdXJhdHplYW46IEV6IGRhIHY0bDIgIgorImtvbnRyb2xhdHphaWxlIGJhdC4gQmVnaXJhdHUgdjRsMSBrb250cm9sYXR6YWlsZSBiYXQgZGVuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIkh1dHMgZWdpbiBkdSAlMiRzIGdhaWx1a28gJTEkZC4gc2FycmVyYXJlbiBhdHJpYnV0dWFrIGtvbnRzdWx0YXR6ZWFuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJIdXRzIGVnaW4gZHUgJyUyJHMnIGdhaWx1a28gJTEkZC4gc2ludG9uaXphZG9yZWFyZW4gZXphcnBlbmFrIGVza3VyYXR6ZWFuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkh1dHMgZWdpbiBkdSAnJXMnIGdhaWx1YXJlbiBhcmF1YSBrb250c3VsdGF0emVhbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkh1dHMgZWdpbiBkdXQgJyVzJyBnYWlsdWFyZW4ga29udHJvbC1hdHJpYnV0dWFrIGVza3VyYXR6ZWFuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJFemluIGRhICclcycgZ2FpbHVhIGlkZW50aWZpa2F0dS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiSGF1IGV6IGRhICclcycgZ2FpbHUgYmF0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIkV6aW4gaXphbiBkYSAnJXMnIGdhaWx1YSBpcmVraSBpcmFrdXJ0emVrbyBldGEgaWRhenRla28uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiJyVzJyBnYWlsdWEgZXogZGEga2FwdHVyYS1nYWlsdSBiYXQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICInJXMnIGdhaWx1YSBleiBkYSBpcnRlZXJha28gZ2FpbHUgYmF0LiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIiclcycgZ2FpbHVhIGV6IGRhIGlydGVlcmFrbyBnYWlsdSBiYXQuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiRXppbiBpemFuIGRhICclcycgZ2FpbHVhIGlyZWtpIGlyYWt1cnR6ZWtvIGV0YSBpZGF6dGVrby4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkh1dHMgZWdpbiBkdSAnJXMnIGdhaWx1YXJlbiBhcmF1YSBlemFydHplYW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIkh1dHMgZWdpbiBkdSAnJXMnIGdhaWx1YXJlbiB1bmVrbyBzaW50b25pemF6aW8tZnJla3VlbnR6aWEgZXNrdXJhdHplYW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIiIKKyJIdXRzIGVnaW4gZHUgJyVzJyBnYWlsdWFyZW4gdW5la28gc2ludG9uaXphemlvLWZyZWt1ZW50emlhICVsdSBIei10YW4gIgorImV6YXJ0emVhbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiSHV0cyBlZ2luIGR1ICclcycgZ2FpbHVhcmVuIHNlaW5hbGVhcmVuIGluZGFycmEgZXNrdXJhdHplYW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJIdXRzIGVnaW4gZHUgJyUyJHMnIGdhaWx1a28gJTEkZC4ga29udHJvbGFyZW4gYmFsaW9hIGVza3VyYXR6ZWFuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIkh1dHMgZWdpbiBkdSAnJTMkcycgZ2FpbHVrbyAlMiRkLiBrb250cm9sYXJlbiAlMSRkLiBiYWxpb2EgZXNrdXJhdHplYW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiSHV0cyBlZ2luIGR1ICclcycgZ2FpbHVrbyB1bmVrbyBzYXJyZXJhIGVza3VyYXR6ZWFuLiBMaXRla2VlbmEgZGEgaXJyYXRpLSIKKyJnYWlsdSBiYXQgaXphdGVhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIkh1dHMgZWdpbiBkdSAnJXMnIGdhaWx1a28gdW5la28gc2FycmVyYSBlc2t1cmF0emVhbi4gTGl0ZWtlZW5hIGRhIGlycmF0aS0iCisiZ2FpbHUgYmF0IGl6YXRlYS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkh1dHMgZWdpbiBkdSAnJTIkcycgZ2FpbHVrbyAlMSRkLiBzYXJyZXJhIGV6YXJ0emVhbi4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICJPcmFpbmRpayBleiBkYWdvIG9uYXJ0dWEgZXhla3V0YXR1IGJpdGFydGVhbiBiZXJlaXptZW5hIGFsZGF0emVhLiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiRXppbiBkdSBmdW50emlvbmF0dSBlcmxvanVyaWsgZ2FiZSIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiRGF0dS1rb3Jyb250ZWFyZW4gYmFybmUtZXJyb3JlYS4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJEYXR1LWZsdXh1YXJlbiBiYXJuZS1lcnJvcmVhLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIiclcycgZ2FpbHVhIGV6IGRhIGlydGVlcmFrbyBnYWlsdSBiYXQuIgorCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAiVXN0ZWthYmVrbyBmb3RvZ3JhbWEtdGFtYWluYSBqYXNvIGRhICgldSksICV1IG9yZGV6LiIKKworI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiSHV0cyBlZ2luIGR1ICclcycgZ2FpbHV0aWsgYmlkZW8tZm90b2dyYW1hayBlc2t1cmF0emVuIHNhaWF0emVhbi4iCisKKyN+IG1zZ2lkICJGYWlsZWQgYWZ0ZXIgJWQgdHJpZXMuIGRldmljZSAlcy4gc3lzdGVtIGVycm9yOiAlcyIKKyN+IG1zZ3N0ciAiSHV0cyBlZ2luIGR1ICVkIHNhaW8gZXRhIGdlcm8uICVzIGdhaWx1YS4gU2lzdGVtYS1lcnJvcmVhOiAlcyIKKworI34gbXNnaWQgIkJhc3MiCisjfiBtc2dzdHIgIkJheHVhIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICJBbHR1YSIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICJTaW50ZXRpemFkb3JlYSIKKworI34gbXNnaWQgIlBDTSIKKyN+IG1zZ3N0ciAiUENNIgorCisjfiBtc2dpZCAiU3BlYWtlciIKKyN+IG1zZ3N0ciAiQm96Z29yYWlsdWEiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICJMaW5lYS1zYXJyZXJhIgorCisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgIkNEYSIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJOYWhhc3RhaWxlYSIKKworI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICJQQ00tMiIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAiR3JhYmF6aW9hIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAiU2FycmVyYWtvIGlyYWJhemlhIgorCisjfiBtc2dpZCAiT3V0LWdhaW4iCisjfiBtc2dzdHIgIklydGVlcmFrbyBpcmFiYXppYSIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAiMS4gbGluZWEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIjIuIGxpbmVhIgorCisjfiBtc2dpZCAiTGluZS0zIgorI34gbXNnc3RyICIzLiBsaW5lYSIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAiMS4gZGlnaXRhbGEiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgIjIuIGRpZ2l0YWxhIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICIzLiBkaWdpdGFsYSIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICJBdXJpa3VsYXJyZW4gc2FycmVyYSIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAiQXVyaWt1bGFycmVuIGlydGVlcmEiCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAiQmlkZW9hIgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgIklycmF0aWEiCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIgorI34gbXNnc3RyICIiCisjfiAiRXppbiBpemFuIGRhIGF1ZGlva28gZ2FpbHVhIGlyZWtpIG5haGFzdGFpbGVhcmVuIGtvbnRyb2xhIGt1ZGVhdHpla28uIgorCisjfiBtc2dpZCAiIgorI34gIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4gVGhpcyB2ZXJzaW9uIG9mICIKKyN+ICJ0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiRXppbiBpemFuIGRhIGF1ZGlva28gZ2FpbHVhIGlyZWtpIG5haGFzdGFpbGVhcmVuIGtvbnRyb2xhIGt1ZGVhdHpla28uICIKKyN+ICJFbGVtZW50dSBob25layBleiBkdSBvbmFydHplbiBPcGVuIFNvdW5kIFN5c3RlbS1lbiBiZXJ0c2lvIGhhdS4iCisKKyN+IG1zZ2lkICJNYXN0ZXIiCisjfiBtc2dzdHIgIk1haXN1YSIKKworI34gbXNnaWQgIkZyb250IgorI34gbXNnc3RyICJBdXJyZWFsZGVrb2EiCisKKyN+IG1zZ2lkICJSZWFyIgorI34gbXNnc3RyICJBdHplYWxkZWtvYSIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkF1cmlrdWxhcnJhayIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAiRXJkaWtvYSIKKworI34gbXNnaWQgIkxGRSIKKyN+IG1zZ3N0ciAiTEZFIgorCisjfiBtc2dpZCAiU3Vycm91bmQiCisjfiBtc2dzdHIgIkluZ3VyYXR6YWlsZWEiCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICJBbGJva29hIgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAiSXJ0ZWVyYSBsYWd1bmdhcnJpYSIKKworI34gbXNnaWQgIjNEIERlcHRoIgorI34gbXNnc3RyICIzRCBzYWtvbmVyYSIKKworI34gbXNnaWQgIjNEIENlbnRlciIKKyN+IG1zZ3N0ciAiM0QgemVudHJ1YSIKKworI34gbXNnaWQgIjNEIEVuaGFuY2UiCisjfiBtc2dzdHIgIjNEIGhvYmV0dWEiCisKKyN+IG1zZ2lkICJUZWxlcGhvbmUiCisjfiBtc2dzdHIgIlRlbGVmb25vYSIKKworI34gbXNnaWQgIlZpZGVvIEluIgorI34gbXNnc3RyICJCaWRlby1zYXJyZXJhIgorCisjfiBtc2dpZCAiQVVYIEluIgorI34gbXNnc3RyICJTYXJyZXJhIGxhZ3VuZ2FycmlhIgorCisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIkdyYWJhemlvYXJlbiBpcmFiYXppYSIKKworI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICJJcnRlZXJhcmVuIGlyYWJhemlhIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiTWlrcm9mb25vYXJlbiBidWx0emFkYSIKKworI34gbXNnaWQgIkRpYWdub3N0aWMiCisjfiBtc2dzdHIgIkRpYWdub3N0aWtvYSIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgIkJheHVhcmVuIGJ1bHR6YWRhIgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgIkVycmVwcm9kdWt6aW9hcmVuIGF0YWthayIKKworI34gbXNnaWQgIklucHV0IgorI34gbXNnc3RyICJTYXJyZXJhIgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIk1vbml0b3JlYXJlbiBpdHVyYnVydWEiCisKKyN+IG1zZ2lkICJLZXlib2FyZCBCZWVwIgorI34gbXNnc3RyICJUZWtsYXR1YXJlbiBzb2ludWEiCisKKyN+IG1zZ2lkICJTaW11bGF0ZSBTdGVyZW8iCisjfiBtc2dzdHIgIlNpbXVsYXR1IGVzdGVyZW9hIgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICJFc3RlcmVvYSIKKworI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICJTb2ludSBpbmd1cmF0emFpbGVhIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBHYWluIgorI34gbXNnc3RyICJNaWtyb2Zvbm9hcmVuIGlyYWJhemlhIgorCisjfiBtc2dpZCAiU3BlYWtlciBTb3VyY2UiCisjfiBtc2dzdHIgIkJvemdvcmFpbHVhcmVuIGl0dXJidXJ1YSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgU291cmNlIgorI34gbXNnc3RyICJNaWtyb2Zvbm9hcmVuIGl0dXJidXJ1YSIKKworI34gbXNnaWQgIkphY2siCisjfiBtc2dzdHIgIkphY2siCisKKyN+IG1zZ2lkICJDZW50ZXIgLyBMRkUiCisjfiBtc2dzdHIgIlplbnRyYXR1YSAvIExGRSIKKworI34gbXNnaWQgIlN0ZXJlbyBNaXgiCisjfiBtc2dzdHIgIkVzdGVyZW96a28gbmFoYXNrZXRhIgorCisjfiBtc2dpZCAiTW9ubyBNaXgiCisjfiBtc2dzdHIgIk1vbm96a28gbmFoYXNrZXRhIgorCisjfiBtc2dpZCAiSW5wdXQgTWl4IgorI34gbXNnc3RyICJTYXJyZXJha28gbmFoYXNrZXRhIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICIxLiBtaWtyb2Zvbm9hIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICIyLiBtaWtyb2Zvbm9hIgorCisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIklydGVlcmEgZGlnaXRhbGEiCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICJTYXJyZXJhIGRpZ2l0YWxhIgorCisjfiBtc2dpZCAiSERNSSIKKyN+IG1zZ3N0ciAiSERNSSIKKworI34gbXNnaWQgIk1vZGVtIgorI34gbXNnc3RyICJNb2RlbWEiCisKKyN+IG1zZ2lkICJIYW5kc2V0IgorI34gbXNnc3RyICJBdXJpa3VsYXIrbWlrcm9mb25vYSIKKworI34gbXNnaWQgIk90aGVyIgorI34gbXNnc3RyICJCZXN0ZWxha29hIgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAiQmF0IGVyZSBleiIKKworI34gbXNnaWQgIk9uIgorI34gbXNnc3RyICJQaXp0dSIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAiSXR6YWxpIgorCisjfiBtc2dpZCAiTXV0ZSIKKyN+IG1zZ3N0ciAiTXV0dXR1IgorCisjfiBtc2dpZCAiRmFzdCIKKyN+IG1zZ3N0ciAiQml6a29ycmEiCisKKyN+IG1zZ2lkICJWZXJ5IExvdyIKKyN+IG1zZ3N0ciAiT3NvIG1vdGVsYSIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAiTW90ZWxhIgorCisjfiBtc2dpZCAiTWVkaXVtIgorI34gbXNnc3RyICJUYXJ0ZWtvYSIKKworI34gbXNnaWQgIkhpZ2giCisjfiBtc2dzdHIgIkFsdHVhIgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICJPc28gYWx0dWEiCisKKyN+IG1zZ2lkICJQcm9kdWN0aW9uIgorI34gbXNnc3RyICJFa29penBlbmEiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICJBdXJyZWFsZGVrbyBwYW5lbGVrbyBtaWtyb2Zvbm9hIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBJbiIKKyN+IG1zZ3N0ciAiQXVycmVhbGRla28gcGFuZWxla28gc2FycmVyYWtvIGxpbmVhIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiQXVycmVhbGRla28gcGFuZWxla28gYXVyaWt1bGFycmFrIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBPdXQiCisjfiBtc2dzdHIgIkF1cnJlYWxkZWtvIHBhbmVsZWtvIGlydGVlcmFrbyBsaW5lYSIKKworI34gbXNnaWQgIkdyZWVuIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiS29uZWt0b3JlIGJlcmRlYSIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICJLb25la3RvcmUgYXJyb3NhIgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIktvbmVrdG9yZSB1cmRpbmEiCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIktvbmVrdG9yZSB6dXJpYSIKKworI34gbXNnaWQgIkJsYWNrIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiS29uZWt0b3JlIGJlbHR6YSIKKworI34gbXNnaWQgIkdyYXkgQ29ubmVjdG9yIgorI34gbXNnc3RyICJLb25la3RvcmUgZ3Jpc2EiCisKKyN+IG1zZ2lkICJPcmFuZ2UgQ29ubmVjdG9yIgorI34gbXNnc3RyICJLb25la3RvcmUgbGFyYW5qYSIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIktvbmVrdG9yZSBnb3JyaWEiCisKKyN+IG1zZ2lkICJZZWxsb3cgQ29ubmVjdG9yIgorI34gbXNnc3RyICJLb25la3RvcmUgaG9yaWEiCisKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkF1cnJlYWxkZWtvIHBhbmVsZWtvIGtvbmVrdG9yZSBiZXJkZWEiCisKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQXVycmVhbGRla28gcGFuZWxla28ga29uZWt0b3JlIGFycm9zYSIKKworI34gbXNnaWQgIkJsdWUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJBdXJyZWFsZGVrbyBwYW5lbGVrbyBrb25la3RvcmUgdXJkaW5hIgorCisjfiBtc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJBdXJyZWFsZGVrbyBwYW5lbGVrbyBrb25la3RvcmUgenVyaWEiCisKKyN+IG1zZ2lkICJCbGFjayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkF1cnJlYWxkZWtvIHBhbmVsZWtvIGtvbmVrdG9yZSBiZWx0emEiCisKKyN+IG1zZ2lkICJHcmF5IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQXVycmVhbGRla28gcGFuZWxla28ga29uZWt0b3JlIGdyaXNhIgorCisjfiBtc2dpZCAiT3JhbmdlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQXVycmVhbGRla28gcGFuZWxla28ga29uZWt0b3JlIGxhcmFuamEiCisKKyN+IG1zZ2lkICJSZWQgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJBdXJyZWFsZGVrbyBwYW5lbGVrbyBrb25la3RvcmUgZ29ycmlhIgorCisjfiBtc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQXVycmVhbGRla28gcGFuZWxla28ga29uZWt0b3JlIGhvcmlhIgorCisjfiBtc2dpZCAiU3ByZWFkIE91dHB1dCIKKyN+IG1zZ3N0ciAiWmFiYWxkdSBpcnRlZXJhIgorCisjfiBtc2dpZCAiRG93bm1peCIKKyN+IG1zZ3N0ciAiVG9sZXN0dSBuYWhhc2tldGEiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIElucHV0IgorI34gbXNnc3RyICJOYWhhc3RhaWxlIGJpcnR1YWxhcmVuIHNhcnJlcmEiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKKyN+IG1zZ3N0ciAiTmFoYXN0YWlsZSBiaXJ0dWFsYXJlbiBpcnRlZXJhIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBDaGFubmVscyIKKyN+IG1zZ3N0ciAiTmFoYXN0YWlsZSBiaXJ0dWFsYXJlbiBrYW5hbGFrIgorCisjLCBmdXp6eQorI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyBmdW50emlvYSIKKworI34gbXNnaWQgIiVzIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyBmdW50emlvYSIKKworI34gbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgb24gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJFcnJvcmVhIGdlcnRhdHUgZGEgJyUyJHMnIGdhaWx1YW4gJTEkZCBieXRlIGlyYWt1cnR6ZWFuLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlbnF1ZXVlIGJ1ZmZlcnMgaW4gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJFemluIGl6YW4gZGlyYSBidWZmZXJyYWsgaWxhcmFuIGphcnJpICclcycgZ2FpbHVhbi4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc291bmQgc2VydmVyIgorI34gbXNnc3RyICJFemluIGl6YW4gZGEga29uZXhpb2EgZXphcnJpIHNvaW51LXplcmJpdHphcmlhcmVraW4iCisKKyN+IG1zZ2lkICJGYWlsZWQgdG8gcXVlcnkgc291bmQgc2VydmVyIGNhcGFiaWxpdGllcyIKKyN+IG1zZ3N0ciAiSHV0cyBlZ2luIGR1IHNvaW51LXplcmJpdHphcmlhcmVuIGFoYWxtZW5hIGtvbnRzdWx0YXR6ZWFuIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBpbnB1dCBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiU2FycmVyYWtvIGVsZW1lbnR1IGhhdXRhdHVhIGRlc2tyaWJhdHplbiBkdS4iCisKKyN+IG1zZ2lkICJEZXNjcmliZXMgdGhlIHNlbGVjdGVkIG91dHB1dCBlbGVtZW50IGZvciBBdWRpby9WaWRlbyBDb25mZXJlbmNpbmcuIgorI34gbXNnc3RyICIiCisjfiAiQXVkaW8tL0JpZGVvLWtvbmZlcmVudHppYWsgZWdpdGVrbyBpcnRlZXJha28gZWxlbWVudHUgaGF1dGF0dWEgIgorI34gImRlc2tyaWJhdHplbiBkdS4iCisKKyN+IG1zZ2lkICJEZXNjcmliZXMgdGhlIHNlbGVjdGVkIG91dHB1dCBlbGVtZW50IGZvciBNdXNpYyBhbmQgTW92aWVzLiIKKyN+IG1zZ3N0ciAiTXVzaWthcmVuIGV0YSBmaWxtZW4gaXJ0ZWVyYWtvIGVsZW1lbnR1IGhhdXRhdHVhIGRlc2tyaWJhdHplbiBkdS4iCisKKyN+IG1zZ2lkICJEZXNjcmliZXMgdGhlIHNlbGVjdGVkIG91dHB1dCBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiSXJ0ZWVyYWtvIGVsZW1lbnR1IGhhdXRhdHVhIGRlc2tyaWJhdHplbiBkdS4iCisKKyN+IG1zZ2lkICJHU3RyZWFtZXIgYXVkaW9zaW5rIGZvciBBdWRpby9WaWRlbyBDb25mZXJlbmNpbmciCisjfiBtc2dzdHIgIkF1ZGlvLS9CaWRlby1rb25mZXJlbnR6aWFrIGVnaXRla28gR1N0cmVhbWVuIGF1ZGlvLWtvbGVrdG9yZWEiCisKKyN+IG1zZ2lkICJHU3RyZWFtZXIgYXVkaW9zaW5rIGZvciBNdXNpYyBhbmQgTW92aWVzIgorI34gbXNnc3RyICJNdXNpa2FyZW4gZXRhIGZpbG1lbiBHU3RyZWFtZXIgYXVkaW8ta29sZWt0b3JlYSIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHBsYXkgYXVkaW8gdXNpbmcgYW55IG51bWJlciBvZiBvdXRwdXQgZWxlbWVudHMuIFNvbWUgIgorI34gInBvc3NpYmxlIGNob2ljZXMgYXJlIG9zc3NpbmssIGVzZHNpbmsgYW5kIGFsc2FzaW5rLiBUaGUgYXVkaW9zaW5rIGNhbiBiZSAiCisjfiAiYSBwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJIYWluYmF0IGlydGVlcmFrbyBlbGVtZW50dSBlcmFiaWxpeiBlcnJlcHJvZHV6aSBkZXpha2UgYXVkaW9hIEdTdHJlYW1lci0iCisjfiAiZWsuIEhhbGEgbm9sYSBvc3NzaW5rLCBlc2RzaW5rIGV0YSBhbHNhc2luay4gQXVkaW8ta29sZWt0b3JlYSBrYW5hbGl6YXppbyAiCisjfiAicGFydHppYWwgYmF0IGl6YW4gZGFpdGVrZSwgZWxlbWVudHUgYmF0IGl6YW4gYmVoYXJyZWFuLiIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHBsYXkgdmlkZW8gdXNpbmcgYW55IG51bWJlciBvZiBvdXRwdXQgZWxlbWVudHMuIFNvbWUgIgorI34gInBvc3NpYmxlIGNob2ljZXMgYXJlIHh2aW1hZ2VzaW5rLCB4aW1hZ2VzaW5rLCBzZGx2aWRlb3NpbmsgYW5kIGFhc2luay4gIgorI34gIlRoZSB2aWRlb3NpbmsgY2FuIGJlIGEgcGFydGlhbCBwaXBlbGluZSBpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiSGFpbmJhdCBpcnRlZXJha28gZWxlbWVudHUgZXJhYmlsaXogZXJyZXByb2R1emkgZGV6YWtlIGJpZGVvYSBHU3RyZWFtZXItIgorI34gImVrLiBIYWxhIG5vbGEgeHZpbWFnZXNpbmssIHhpbWFnZXNpbmssIHNkbHZpZGVvc2luayBldGEgYWFzaW5rLiBCaWRlby0iCisjfiAia29sZWt0b3JlYSBrYW5hbGl6YXppbyBwYXJ0emlhbCBiYXQgaXphbiBkYWl0ZWtlLCBlbGVtZW50dSBiYXQgaXphbiAiCisjfiAiYmVoYXJyZWFuLiIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHB1dCB2aXN1YWxpemF0aW9uIHBsdWdpbnMgaW4gYSBwaXBlbGluZSB0byB0cmFuc2Zvcm0gYXVkaW8gIgorI34gInN0cmVhbSBpbiB2aWRlbyBmcmFtZXMuIERlZmF1bHQgaXMgZ29vbSBidXQgbW9yZSB2aXN1YWxpemF0aW9uIHBsdWdpbnMgIgorI34gIndpbGwgYmUgcG9ydGVkIHNvb24uIFRoZSB2aXN1YWxpemF0aW9uIHBsdWdpbiBjYW4gYmUgYSBwYXJ0aWFsIHBpcGVsaW5lICIKKyN+ICJpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiS2FuYWxpemF6aW9ldGFuIGJpc3RhcmF0emVrbyBwbHVnaW5hayBqYXIgZGl0emFrZSBHU3RyZWFtZXItZWssIGF1ZGlvLSIKKyN+ICJrb3Jyb250ZWFrIGJpZGVvLWZvdG9ncmFtYSBiaWh1cnR6ZWtvLiBHb29tIGRhIGxlaGVuZXRzaWEsIGJhaW5hIGxhc3RlciAiCisjfiAiaXphbmdvIGRhIGJpc3RhcmF0emVrbyBwbHVnaW4gZ2VoaWFnby4gQmlzdGFyYXR6ZWtvIHBsdWdpbmEga2FuYWxpemF6aW8gIgorI34gInBhcnR6aWFsIGJhdCBpemFuIGRhaXRla2UsIGVsZW1lbnR1IGJhdCBpemFuIGJlaGFycmVhbi4iCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiByZWNvcmQgYXVkaW8gdXNpbmcgYW55IG51bWJlciBvZiBpbnB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgb3Nzc3JjLCBlc2RzcmMgYW5kIGFsc2FzcmMuIFRoZSBhdWRpbyBzb3VyY2UgY2FuIGJlICIKKyN+ICJhIHBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkhhaW5iYXQgc2FycmVyYWtvIGVsZW1lbnR1IGVyYWJpbGl6IGdyYWJhIGRlemFrZSBhdWRpb2EgR1N0cmVhbWVyLWVrLiAiCisjfiAiSGFsYSBub2xhIG9zc3NyYywgZXNkc3JjIGV0YSBhbHNhc3JjLiBBdWRpby1pdHVyYnVydWEga2FuYWxpemF6aW8gIgorI34gInBhcnR6aWFsIGJhdCBpemFuIGRhaXRla2UsIGVsZW1lbnR1IGJhdCBpemFuIGJlaGFycmVhbi4iCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiByZWNvcmQgdmlkZW8gZnJvbSBhbnkgbnVtYmVyIG9mIGlucHV0IGVsZW1lbnRzLiBTb21lICIKKyN+ICJwb3NzaWJsZSBjaG9pY2VzIGFyZSB2NGxzcmMgYW5kIHZpZGVvdGVzdHNyYy4gVGhlIHZpZGVvIHNvdXJjZSBjYW4gYmUgYSAiCisjfiAicGFydGlhbCBwaXBlbGluZSBpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiSGFpbmJhdCBzYXJyZXJha28gZWxlbWVudHUgZXJhYmlsaXogZ3JhYmEgZGV6YWtlIGJpZGVvYSBHU3RyZWFtZXItZWsuICIKKyN+ICJIYWxhIG5vbGEgdjRsc3JjIGV0YSB2aWRlb3Rlc3RzcmMuIEJpZGVvLWl0dXJidXJ1YSBrYW5hbGl6YXppbyBwYXJ0emlhbCAiCisjfiAiYmF0IGl6YW4gZGFpdGVrZSwgZWxlbWVudHUgYmF0IGl6YW4gYmVoYXJyZWFuLiIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIGF1ZGlvIHNvdXJjZSIKKyN+IG1zZ3N0ciAiR1N0cmVhbWVyIGF1ZGlvLWl0dXJidXJ1IGxlaGVuZXRzaWEiCisKKyN+IG1zZ2lkICJkZWZhdWx0IEdTdHJlYW1lciBhdWRpb3NpbmsiCisjfiBtc2dzdHIgIkdTdHJlYW1lciBhdWRpby1rb2xla3RvcmUgbGVoZW5ldHNpYSIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIHZpZGVvIHNvdXJjZSIKKyN+IG1zZ3N0ciAiR1N0cmVhbWVyIGJpZGVvLWl0dXJidXJ1IGxlaGVuZXRzaWEiCisKKyN+IG1zZ2lkICJkZWZhdWx0IEdTdHJlYW1lciB2aWRlb3NpbmsiCisjfiBtc2dzdHIgIkdTdHJlYW1lciBiaWRlby1rb2xla3RvcmUgbGVoZW5ldHNpYSIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIHZpc3VhbGl6YXRpb24gcGx1Z2luIgorI34gbXNnc3RyICJHU3RyZWFtZXIgYmlzdGFyYXR6ZWtvIHBsdWdpbiBsZWhlbmV0c2lhIgorCisjfiBtc2dpZCAiZGVzY3JpcHRpb24gZm9yIEdTdHJlYW1lciBhdWRpb3NpbmsgZm9yIEF1ZGlvL1ZpZGVvIENvbmZlcmVuY2luZyIKKyN+IG1zZ3N0ciAiIgorI34gIkF1ZGlvLS9CaWRlby1rb25mZXJlbnR6aWFrIGVnaXRla28gR1N0cmVhbWVuIGF1ZGlvLWtvbGVrdG9yZWFyZW4gIgorI34gImRlc2tyaWJhcGVuYSIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBHU3RyZWFtZXIgYXVkaW9zaW5rIGZvciBNdXNpYyBhbmQgTW92aWVzIgorI34gbXNnc3RyICJNdXNpa2FyZW4gZXRhIGZpbG1lbiBHU3RyZWFtZXIgYXVkaW8ta29sZWt0b3JlYXJlbiBkZXNrcmliYXBlbmEiCisKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW9zaW5rIgorI34gbXNnc3RyICJHU3RyZWFtZXIgYXVkaW8ta29sZWt0b3JlIGxlaGVuZXRzaWFyZW4gZGVza3JpYmFwZW5hIgorCisjfiBtc2dpZCAiZGVzY3JpcHRpb24gZm9yIGRlZmF1bHQgR1N0cmVhbWVyIGF1ZGlvc3JjIgorI34gbXNnc3RyICJHU3RyZWFtZXIgYXVkaW9zcmMgbGVoZW5ldHNpYXJlbiBkZXNrcmliYXBlbmEiCmRpZmYgLS1naXQgYS9wby9maS5wbyBiL3BvL2ZpLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOWE5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9wby9maS5wbwpAQCAtMCwwICsxLDkwNyBAQAorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIyBGaW5uaXNoIG1lc3NhZ2VzIGZvciBnc3QtcGx1Z2lucy1nb29kLgorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBUb21taSBWYWluaWthaW5lbi4KKyMgQ29weXJpZ2h0IChDKSAyMDA3IElsa2thIFR1b2hlbGEuCisjIFN1b21lbm5vczogaHR0cDovL2dub21lLmZpLworIworIyBUb21taSBWYWluaWthaW5lbiA8dGh2QGlraS5maT4sIDIwMDktMjAxMC4KKyMgSWxra2EgVHVvaGVsYSA8aGlsZUBpa2kuZmk+LCAyMDA3LgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZCAwLjEwLjI1LjNcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxMC0xMS0xNyAyMzowMyswMjAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBUb21taSBWYWluaWthaW5lbiA8VG9tbWkuVmFpbmlrYWluZW5AaWtpLmZpPlxuIgorIkxhbmd1YWdlLVRlYW06IEZpbm5pc2ggPHRyYW5zbGF0aW9uLXRlYW0tZmlAbGlzdHMuc291cmNlZm9yZ2UubmV0PlxuIgorIkxhbmd1YWdlOiBmaVxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlBsdXJhbC1Gb3JtczogbnBsdXJhbHM9MjsgcGx1cmFsPShuICE9IDEpO1xuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIkpQRUcta3V2YW4gcHVya3UgZXDDpG9ubmlzdHVpIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICLigJ0lc+KAnSBhcnRpc3RpbHRhIOKAnSVz4oCdIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJQYWx2ZWxpbWVlbiBlaSBzYWF0dSB5aHRleXR0w6QiCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiRWkgVVJMOsOkw6QgYXNldGV0dHVuYS4iCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIlBhbHZlbGltZW4gbmltZcOkIGVpIHNhYXR1IHNlbHZpdGV0dHnDpC4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiWWh0ZXl0dMOkIHBhbHZlbGltZWVuIGVpIHZvaXR1IGF2YXRhLiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIlR1cnZhbGxpc2VuIHlodGV5ZGVuIGF2YXVzIGVww6Rvbm5pc3R1aS4iCisKKyMsIGZ1enp5Cittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiVGFwYWh0dWkgdmVya2tvdmlyaGUgdGFpIHBhbHZlbGluIHN1bGtpIHlodGV5ZGVuIHlsbMOkdHTDpGVuLiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiUGFsdmVsaW4gbMOkaGV0dGkgdmlyaGVlbGxpc3TDpCBkYXRhYS4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiUGF2ZWxpbiBlaSB0dWUga2VsYXVzdGEuIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICIiCisiw4TDpG50w6QgZWkgb2xlIHRhaSDDpMOkbmlsw6RoZGUgb24gdmlhbGxpbmVuLCBBVkktdmlydGEgdHVsZWUgb2xlbWFhbiAiCisidmF1cmlvaXR1bnV0LiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAiVGllZG9zdG8gZWkgc2lzw6RsbMOkIHNvaXRldHRhdmlhIHZpcnRvamEuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJUaWVkb3N0byBvbiB2aXJoZWVsbGluZW4gZWlrw6Qgc2l0w6Qgdm9pZGEgZXNpdHTDpMOkLiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIlRpZWRvc3RvIG9uIHZpb2l0dHVudXQgZWlrw6Qgc2l0w6Qgdm9pZGEgbsOkeXR0w6TDpC4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiVGllZG9zdG8gb24gdmFqYWEgZWlrw6Qgc2l0w6Qgdm9pZGEgZXNpdHTDpMOkLiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiVGllZG9zdG9zc2Egb2xldmFhIHZpZGVvdGEgZWkgZWhrw6Qgdm9pZGEgbsOkeXR0w6TDpCBvaWtlaW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIlRpZWRvc3RvIHNpc8OkbHTDpMOkIHVzZWl0YSB2aXJ0b2phLiBTb2l0ZXRhYW4gdmFpbiBlbnNpbW3DpGlzZXQgJWQiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIlR1ZXR0dWEgdmlydGFhIGVpIGzDtnl0eW55dC4gS2VudGllcyBzaW51biB0YXJ2aXRzZWUgYXNlbnRhYSBHU3RyZWFtZXItUlRTUC0iCisibGFhamVubnVzIGvDpHl0dMOkw6Rrc2VzaSBSZWFsLW1lZGlhLXZpcnRvamEuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiVHVldHR1YSB2aXJ0YWEgZWkgbMO2eXR5bnl0LiBTaW51biBrZW50aWVzIHRhcnZpdHNlZSBzYWxsaWEgdXNlYW1waWEgIgorInNpaXJ0b3Byb3Rva29sbGlhLCB0YWkgdmFpaHRvZWh0b2lzZXN0aSBzaW51bHRhIHNhYXR0YWEgcHV1dHR1YSBvaWtlYSAiCisiR1N0cmVhbWVyLVJUU1AtbGFhamVubnVzbGlpdMOkbm7DpGluZW4uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIsOEw6RuaWxhaXRldHRhIGVpIHZvaXR1IGF2YXRhIHRvaXN0ZXR0YXZha3NpLiBMYWl0ZSBvbiB0b2lzZW4gc292ZWxsdWtzZW4gIgorImvDpHl0w7Zzc8OkLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiw4TDpG5pbGFpdGV0dGEgZWkgdm9pdHUgYXZhdGEgdG9pc3RhbWlzdGEgdmFydGVuLiBMYWl0dGVlbiBhdmFhbWlzZWVuIGVpIG9sZSAiCisib2lrZXVrc2lhLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICLDhMOkbmlsYWl0ZXR0YSBlaSB2b2l0dSBhdmF0YSB0b2lzdGV0dGF2YWtzaS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiw4TDpG5pbGFpdGV0dGEgZWkgdm9pdHUgYXZhdGEgdG9pc3RhbWlzdGEgdmFydGVuLiBUw6Rtw6QgZWxlbWVudHRpIGVpIHR1ZSB0w6R0w6QgIgorInZlcnNpb3RhIE9wZW4gU291bmQgU3lzdGVtaXN0w6QuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIlTDpG3DpCDDpMOkbmlsYWl0ZSBlaSB0dWUgdG9pc3RhbWlzdGEuIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICLDhMOkbmVudG9pc3RvdmlyaGUuIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJUw6Rtw6Qgw6TDpG5pbGFpdGUgZWkgdHVlIG5hdWhvaXR1c3RhLiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIlZpcmhlIGx1ZXR0YWVzc2Egw6TDpG5pbGFpdHRlZWx0YS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyLDhMOkbmlsYWl0ZXR0YSBlaSB2b2l0dSBhdmF0YSBuYXVob2l0dXN0YSB2YXJ0ZW4uIExhaXR0ZWVuIGF2YWFtaXNlZW4gZWkgb2xlICIKKyJvaWtldWtzaWEuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICLDhMOkbmlsYWl0ZXR0YSBlaSB2b2l0dSBhdmF0YSBuYXVob2l0dXN0YSB2YXJ0ZW4uIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAiTmF1aG9pdHVzbMOkaGRlIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWlrcm9mb25pIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiTGluamF0dWxvIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIlNpc8OkaW5lbiBDRCIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJTUERJRiBzaXPDpMOkbiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJBVVggMSBzaXPDpMOkbiIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJBVVggMiBzaXPDpMOkbiIKKworIywgZnV6enkKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiVGFrYWlzaW5reXRrZW50w6QiCisKKyMsIGZ1enp5Cittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJUYWthaXNpbmt5dGtlbnTDpCIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiw4TDpG5lbnZvaW1ha2t1dXMiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJIZXJra3l5cyIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIlRhcmtrYWlsdSIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIlNpc8Okw6RucmFrZW5uZXR0dSBrYWl1dGluIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICJLdXVsb2trZWV0IgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIkxpbmphIHVsb3MiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNQRElGIHVsb3MiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIkFVWCAxIHVsb3MiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIkFVWCAyIHVsb3MiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiVmlyaGUgbHVldHRhZXNzYSAlZCB0YXZ1YSBsYWl0dGVlbHRhIOKAnSVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJQdXNrZXJlaXRhIGxhaXR0ZWVsdGEg4oCdJXPigJ0gZWkgdm9pdHUga2FydG9pdHRhYSIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIkxhaXR0ZWVuIOKAnSVz4oCdIGFqdXJpIGVpIHR1ZSBtaXTDpMOkbiB0dW5uZXR0dWEga2FhcHBhdXN0YXBhYS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiTGFpdHRlZW4g4oCdJXPigJ0gYWp1cmkgZWkgdHVlIG1pdMOkw6RuIHR1bm5ldHR1YSBrYWFwcGF1c3RhcGFhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiTGFpdGUg4oCdJXPigJ0gZWkgb2xlIHVsb3N0dWxvbGFpdGUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiTGFpdHRlZWx0YSDigJ0lc+KAnSBlaSB2b2kga2FhcGF0YS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJMYWl0dGVlbHRhIOKAnSVz4oCdIGVpIHZvaSBrYWFwYXRhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiTGFpdGUg4oCdJXPigJ0gZWkgb2xlIHVsb3N0dWxvbGFpdGUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTGFpdHRlZWx0YSDigJ0lc+KAnSBlaSB2b2l0dSBzYWFkYSBwYXJhbWV0cmVqYSIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIlZpZGVvc3nDtnRlbGFpdGUgZWkgaHl2w6Rrc3kgdXV0dGEga2VoeXNub3BldXNhc2V0dXN0YS4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiVmlkZW9zecO2dGVsYWl0ZSBlaSBoeXbDpGtzeSB1dXR0YSBrZWh5c25vcGV1c2FzZXR1c3RhLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiTGFpdHRlZW4g4oCdJXPigJ0gYWp1cmkgZWkgdHVlIG1pdMOkw6RuIHR1bm5ldHR1YSBrYWFwcGF1c3RhcGFhLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICJMYWl0dGVlbiDigJ0lc+KAnSBhanVyaSBlaSB0dWUgbWl0w6TDpG4gdHVubmV0dHVhIGthYXBwYXVzdGFwYWEuIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIlZpZGVvc3nDtnRlbGFpdGUgZWkgaHl2w6Rrc3kgdXV0dGEga2VoeXNub3BldXNhc2V0dXN0YS4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJWaXJpdHRpbWVuICVkIGFzZXR1a3NpYSBlaSB2b2l0dSBsdWtlYSBsYWl0dGVlbHRhIOKAnSVz4oCdLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiVmlyaGUgbHVldHRhZXNzYSAlZCB0YXZ1YSBsYWl0dGVlbHRhIOKAnSVz4oCdLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJMYWl0ZSDigJ0lc+KAnSBlaSBvbGUgdWxvc3R1bG9sYWl0ZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiU2lzw6TDpG50dWxvYSAlZCBlaSB2b2l0dSBhc2V0dGFhIGxhaXR0ZWVsbGUgJXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiU2lzw6TDpG50dWxvYSAlZCBlaSB2b2l0dSBhc2V0dGFhIGxhaXR0ZWVsbGUgJXMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTGFpdHRlZWx0YSDigJ0lc+KAnSBlaSBzYWF0dSBzaWduYWFsaW52b2ltYWtrdXV0dGEuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJMYWl0dGVlbiDigJ0lc+KAnSBhanVyaSBlaSB0dWUgbWl0w6TDpG4gdHVubmV0dHVhIGthYXBwYXVzdGFwYWEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiVmlkZW9zecO2dGVsYWl0ZSBlaSBoeXbDpGtzeSB1dXR0YSBrZWh5c25vcGV1c2FzZXR1c3RhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIlZpZGVvc3nDtnRlbGFpdGUgZWkgaHl2w6Rrc3kgdXV0dGEga2VoeXNub3BldXNhc2V0dXN0YS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiVmlkZW9zecO2dGVsYWl0ZSBlaSBoeXbDpGtzeSB1dXR0YSBrZWh5c25vcGV1c2FzZXR1c3RhLiIKKworIywgZnV6enkKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiSlBFRy1rdXZhbiBwdXJrdSBlcMOkb25uaXN0dWkiCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJWaXJoZSBoYWV0dGFlc3NhIGxhaXR0ZWVuIOKAnSVz4oCdIG9taW5haXN1dWtzaWE6IHNlIGVpIG9sZSB2NGwyLWFqdXJpLlRhcmtpc3RhLCAiCisib25rbyBzZSB2NGwxLWFqdXJpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIkzDpGh0ZWVuICVkIG9taW5haXN1dWtzaWEgbGFpdHRlZWx0YSAlcyBlaSB2b2l0dSBreXN5w6QiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiVmlyaXR0aW1lbiAlZCBhc2V0dWtzaWEgZWkgdm9pdHUgbHVrZWEgbGFpdHRlZWx0YSDigJ0lc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICJMYWl0dGVlbiDigJ0lc+KAnSB2aWRlb3N0YW5kYXJkaWEgZWkgdm9pdHUga3lzecOkLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTGFpdHRlZW4g4oCdJXPigJ0gb2hqYWluYXR0cmlidXV0dGVqYSBlaSB2b2l0dSBsdWtlYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTGFpdGV0dGEg4oCdJXPigJ0gZWkgdm9pIHR1bm5pc3RhYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiVMOkbcOkIGVpIG9sZSBsYWl0ZSDigJ0lc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJMYWl0ZXR0YSDigJ0lc+KAnSBlaSB2b2l0dSBhdmF0YSBsdWV0dGF2YWtzaSBqYSBraXJqb2l0ZXR0YXZha3NpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIkxhaXR0ZWVsdGEg4oCdJXPigJ0gZWkgdm9pIGthYXBhdGEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJMYWl0ZSDigJ0lc+KAnSBlaSBvbGUgdWxvc3R1bG9sYWl0ZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICJMYWl0ZSDigJ0lc+KAnSBlaSBvbGUgdWxvc3R1bG9sYWl0ZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJMYWl0ZXR0YSDigJ0lc+KAnSBlaSB2b2l0dSBhdmF0YSBsdWV0dGF2YWtzaSBqYSBraXJqb2l0ZXR0YXZha3NpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTGFpdHRlZW4g4oCdJXPigJ0gdmlkZW9zdGFuZGFyZGlhIGVpIHZvaXR1IGFzZXR0YWEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTnl0IHZpcml0ZXR0ecOkIHRhYWp1dXR0YSBlaSB2b2l0dSBsdWtlYSBsYWl0dGVlbHRhIOKAnSVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICJMYWl0dGVlbiDigJ0lc+KAnSB2aXJpdHRpbWVuIHRhYWp1dHRhIGVpIHZvaXR1IGFzZXR0YWEgYXJ2b29uICVsdSBIei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTGFpdHRlZWx0YSDigJ0lc+KAnSBlaSBzYWF0dSBzaWduYWFsaW52b2ltYWtrdXV0dGEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJPaGphaW1lbGxlICVkIGVpIHNhYXR1IGFydm9hIGxhaXR0ZWVsdGEg4oCdJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJBcnZvYSAlZCBlaSB2b2l0dSBhc2V0dGFhIG9oamFpbWVsbGUgJWQgbGFpdHRlZWxsYSDigJ0lc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJMYWl0dGVlbiDigJ0lc+KAnSB0w6Rtw6RuaGV0a2lzdMOkIHNpc8Okw6RudHVsb2EgZWkgdm9pdHUgbHVrZWEsIHNlIGVpIGVoa8OkIG9sZSAiCisicmFkaW9sYWl0ZSIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIkxhaXR0ZWVuIOKAnSVz4oCdIHTDpG3DpG5oZXRraXN0w6Qgc2lzw6TDpG50dWxvYSBlaSB2b2l0dSBsdWtlYSwgc2UgZWkgZWhrw6Qgb2xlICIKKyJyYWRpb2xhaXRlIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJTaXPDpMOkbnR1bG9hICVkIGVpIHZvaXR1IGFzZXR0YWEgbGFpdHRlZWxsZSAlcy4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICJSZXNvbHV1dGlvbiB2YWlodG8ga8OkeXTDtm4gYWlrYW5hIGVpIG9sZSB2aWVsw6QgbWFoZG9sbGlzdGEuIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJFaSB2b2l0dSB0b2ltaWEgaWxtYW4ga2VsbG9hIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICJTaXPDpGlzZW4gdGlldG92aXJyYW4gdmlyaGUuIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAiU2lzw6Rpc2VuIHRpZXRvdmlycmFuIHZpcmhlLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIkxhaXRlIOKAnSVz4oCdIGVpIG9sZSB1bG9zdHVsb2xhaXRlLiIKKworI34gbXNnaWQgIkdvdCB1bmV4cGVjdGVkIGZyYW1lIHNpemUgb2YgJXUgaW5zdGVhZCBvZiAldS4iCisjfiBtc2dzdHIgIlNhYXRpaW4gb2RvdHRhbWF0b24ga2VoeXMga29vbHRhYW4gJXUgb2RvdGV0dW4gJXUgc2lqYWFuLiIKKworI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiVmlkZW9ydXV0dWplbiBub3V0YW1pbmVuIGxhaXR0ZWVsdGEg4oCdJXPigJ0gZXDDpG9ubmlzdHVpLiIKKworI34gbXNnaWQgIkZhaWxlZCBhZnRlciAlZCB0cmllcy4gZGV2aWNlICVzLiBzeXN0ZW0gZXJyb3I6ICVzIgorI34gbXNnc3RyICJFcMOkb25uaXN0dWkgJWQgeXJpdHlrc2VuIGrDpGxrZWVuOiBsYWl0ZSAlcywgasOkcmplc3RlbG3DpHZpcmhlOiAlcyIKKworI34gbXNnaWQgIkJhc3MiCisjfiBtc2dzdHIgIkJhc3NvIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICJZbMOkLcOkw6RuZXQiCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAiU3ludGgiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIlBDTSIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIkthaXV0aW4iCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICJMaW5qYXR1bG8iCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiQ0QiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAiTWlrc2VyaSIKKworI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICJQQ00tMiIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAiTmF1aG9pdHVzIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAiR2Fpbi1zaXPDpMOkbiIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICJHYWluLXVsb3MiCisKKyN+IG1zZ2lkICJMaW5lLTEiCisjfiBtc2dzdHIgIkxpbmphLTEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIkxpbmphLTIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIkxpbmphLTMiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTEiCisjfiBtc2dzdHIgIkRpZ2l0YWFsaW5lbi0xIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICJEaWdpdGFhbGluZW4tMiIKKworI34gbXNnaWQgIkRpZ2l0YWwtMyIKKyN+IG1zZ3N0ciAiRGlnaXRhYWxpbmVuLTMiCisKKyN+IG1zZ2lkICJQaG9uZS1pbiIKKyN+IG1zZ3N0ciAiTGV2eXNvaXRpbnR1bG8iCisKKyN+IG1zZ2lkICJQaG9uZS1vdXQiCisjfiBtc2dzdHIgIkxldnlzb2l0aW5sw6RodMO2IgorCisjfiBtc2dpZCAiVmlkZW8iCisjfiBtc2dzdHIgIlZpZGVvIgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgIlJhZGlvIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiw4TDpG5pbGFpdGV0dGEgZWkgdm9pdHUgYXZhdGEgbWlrc2VyaW5oYWxsaW50YWEgdmFydGVuLiIKKworI34gbXNnaWQgIiIKKyN+ICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIFRoaXMgdmVyc2lvbiBvZiAiCisjfiAidGhlIE9wZW4gU291bmQgU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIsOEw6RuaWxhaXRldHRhIGVpIHZvaXR1IGF2YXRhIG1pa3NlcmluaGFsbGludGFhIHZhcnRlbi4gVMOkbcOkIGVsZW1lbnR0aSBlaSAiCisjfiAidHVlIHTDpHTDpCB2ZXJzaW90YSBPcGVuIFNvdW5kIFN5c3RlbWlzdMOkLiIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAiUMOkw6QiCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAiRXR1IgorCisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAiVGFrYSIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkt1dWxva2tlZXQiCisKKyN+IG1zZ2lkICJDZW50ZXIiCisjfiBtc2dzdHIgIktlc2tpIgorCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICJMRkUiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAiU3Vycm91bmQiCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICJTaXZ1IgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAiQVVYIHVsb3MiCisKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAiM0Qtc3l2eXlzIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICIzRC1rZXNraSIKKworI34gbXNnaWQgIjNEIEVuaGFuY2UiCisjfiBtc2dzdHIgIjNELXRlaG9zdHVzIgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICJQdWhlbGluIgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgIlZpZGVvdHVsbyIKKworI34gbXNnaWQgIkFVWCBJbiIKKyN+IG1zZ3N0ciAiQVVYIHNpc8Okw6RuIgorCisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIk5hdWhvaXR1c2dhaW4iCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAiR2Fpbi11bG9zIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiTWlrcm9mb25pdGVob3N0aW4iCisKKyN+IG1zZ2lkICJEaWFnbm9zdGljIgorI34gbXNnc3RyICJEaWFnbm9zb2ludGkiCisKKyN+IG1zZ2lkICJCYXNzIEJvb3N0IgorI34gbXNnc3RyICJCYXNzb3RlaG9zdGluIgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgIlRvaXN0b3BvcnRpdCIKKworI34gbXNnaWQgIklucHV0IgorI34gbXNnc3RyICJTaXPDpMOkbiIKKworI34gbXNnaWQgIk1vbml0b3IgU291cmNlIgorI34gbXNnc3RyICJUYXJra2FpbHVsw6RoZGUiCisKKyN+IG1zZ2lkICJLZXlib2FyZCBCZWVwIgorI34gbXNnc3RyICJOw6RwcMOkaW1pc3TDtnBpaXBwYXVzIgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICJTaW11bG9pdHUgc3RlcmVvIgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICJTdGVyZW8iCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAiU3Vycm91bmQtw6TDpG5pIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBHYWluIgorI34gbXNnc3RyICJNaWtyb2ZvbmktZ2FpbiIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICJLYWl1dGlubMOkaGRlIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgIk1pa3JvZm9uaWzDpGhkZSIKKworI34gbXNnaWQgIkphY2siCisjfiBtc2dzdHIgIlBpc3Rva2UiCisKKyN+IG1zZ2lkICJDZW50ZXIgLyBMRkUiCisjfiBtc2dzdHIgIktlc2tpIC8gTEZFIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAiU3RlcmVvIE1peCIKKworI34gbXNnaWQgIk1vbm8gTWl4IgorI34gbXNnc3RyICJNb25vIE1peCIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAiU2lzw6TDpG4gTWl4IgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICJNaWtyb2ZvbmkgMSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiTWlrcm9mb25pIDIiCisKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAiRGlnaXRhYWxpbmVuIHVsb3MiCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICJEaWdpdGFhbGluZW4gc2lzw6TDpG4iCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk1vZGVlbWkiCisKKyN+IG1zZ2lkICJIYW5kc2V0IgorI34gbXNnc3RyICJLdXVsb2trZWV0IgorCisjfiBtc2dpZCAiT3RoZXIiCisjfiBtc2dzdHIgIk11dSIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgIkVpIG1pa8Okw6RuIgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgIlDDpMOkbGzDpCIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAiUG9pc3NhIgorCisjfiBtc2dpZCAiTXV0ZSIKKyN+IG1zZ3N0ciAiVmFpbWVubmV0dHUiCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICJOb3BlYSIKKworI34gbXNnaWQgIlZlcnkgTG93IgorI34gbXNnc3RyICJFcml0dMOkaW4gbWF0YWxhIgorCisjfiBtc2dpZCAiTG93IgorI34gbXNnc3RyICJNYXRhbGEiCisKKyN+IG1zZ2lkICJNZWRpdW0iCisjfiBtc2dzdHIgIk1lZGl1bSIKKworI34gbXNnaWQgIkhpZ2giCisjfiBtc2dzdHIgIktvcmtlYSIKKworI34gbXNnaWQgIlZlcnkgSGlnaCIKKyN+IG1zZ3N0ciAiRXJpdHTDpGluIGtvcmtlYSIKKworI34gbXNnaWQgIlByb2R1Y3Rpb24iCisjfiBtc2dzdHIgIlR1b3RhbnRvIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTWljcm9waG9uZSIKKyN+IG1zZ3N0ciAiRXR1cGFuZWVsaW4gbWlrcm9mb25pIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBJbiIKKyN+IG1zZ3N0ciAiRXR1cGFuZWVsaW4gbGluamF0dWxvIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiRXR1cGFuZWVsaW4ga3V1bG9ra2VldCIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICJFdHVwYW5lZWxpbiBsaW5qYSB1bG9zIgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICJWaWhyZcOkIGxpaXRpbiIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICJWYWFsZWFucHVuYWluZW4gbGlpdGluIgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlNpbmluZW4gbGlpdGluIgorCisjfiBtc2dpZCAiV2hpdGUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJWYWxrb2luZW4gbGlpdGluIgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICJNdXN0YSBsaWl0aW4iCisKKyN+IG1zZ2lkICJHcmF5IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiSGFybWFhIGxpaXRpbiIKKworI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk9yYW5zc2kgbGlpdGluIgorCisjfiBtc2dpZCAiUmVkIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUHVuYWluZW4gbGlpdGluIgorCisjfiBtc2dpZCAiWWVsbG93IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiS2VsdGFpbmVuIGxpaXRpbiIKKworI34gbXNnaWQgIkdyZWVuIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiVmlocmXDpCBldHVwYW5lZWxpbGlpdGluIgorCisjfiBtc2dpZCAiUGluayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlZhYWxlYW5wdW5haW5lbiBldHVwYW5lZWxpbGlpdGluIgorCisjfiBtc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlNpbmluZW4gZXR1cGFuZWVsaWxpaXRpbiIKKworI34gbXNnaWQgIldoaXRlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiVmFsa29pbmVuIGV0dXBhbmVlbGlsaWl0aW4iCisKKyN+IG1zZ2lkICJCbGFjayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk11c3RhIGV0dXBhbmVlbGlsaWl0aW4iCisKKyN+IG1zZ2lkICJHcmF5IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiSGFybWFhIGV0dXBhbmVlbGlsaWl0aW4iCisKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJPcmFuc3NpIGV0dXBhbmVlbGlsaWl0aW4iCisKKyN+IG1zZ2lkICJSZWQgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJQdW5haW5lbiBldHVwYW5lZWxpbGlpdGluIgorCisjfiBtc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiS2VsdGFpbmVuIGV0dXBhbmVlbGlsaWl0aW4iCisKKyN+IG1zZ2lkICJTcHJlYWQgT3V0cHV0IgorI34gbXNnc3RyICJMZXZpdGV0dHkgdWxvcyIKKworI34gbXNnaWQgIkRvd25taXgiCisjfiBtc2dzdHIgIkFsYXNtaWtzYXVzIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBJbnB1dCIKKyN+IG1zZ3N0ciAiVmlydHVhYWxpbmVuIG1pa3Nlcml0dWxvIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBPdXRwdXQiCisjfiBtc2dzdHIgIlZpcnR1YWFsaW5lbiBtaWtzZXJpIHVsb3MiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICJWaXJ0dWFhbGlzZXQgbWlrc2VyaWthbmF2YXQiCisKKyN+IG1zZ2lkICIlcyAlZCBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMgJWQgLXRvaW1pbnRvIgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzIC10b2ltaW50byIKKworI34gbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgb24gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJWaXJoZSBsdWV0dGFlc3NhICVkIHRhdnVhIGxhaXR0ZWVsdGEg4oCdJXPigJ0uIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIlB1c2t1cmVpdGEgZWkgdm9pdHUgbGFpdHRhYSBqb25vb24gbGFpdHRlZWxsYSDigJ0lc+KAnS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc291bmQgc2VydmVyIgorI34gbXNnc3RyICJZaHRleXR0w6Qgw6TDpG5pcGFsdmVsaW1lZW4gZWkgdm9pdHUgYXZhdGEiCisKKyN+IG1zZ2lkICJGYWlsZWQgdG8gcXVlcnkgc291bmQgc2VydmVyIGNhcGFiaWxpdGllcyIKKyN+IG1zZ3N0ciAiw4TDpG5pcGFsdmVsaW1lbiBvbWluYWlzdXVrc2lhIGVpIHZvaXR1IHNlbHZpdHTDpMOkIgorCisjfiBtc2dpZCAiIgorI34gIlRoZSBidWZmZXIgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCBvciB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcywgb3Igbm8gIgorI34gImJ1ZmZlcnMgaGF2ZSBiZWVuIGFsbG9jYXRlZCB5ZXQsIG9yIHRoZSB1c2VycHRyIG9yIGxlbmd0aCBhcmUgaW52YWxpZC4gIgorI34gImRldmljZSAlcyIKKyN+IG1zZ3N0ciAiIgorI34gIlB1c2t1cml0eXlwcGkgZWkgb2xlIHR1ZXR0dSwgaW5kZWtzaSBvbiByYWpvamVuIHVsa29wdW9sZWxsYSwgcHVza3VyZWl0YSAiCisjfiAiZWkgb2xlIHZpZWzDpCB2YXJhdHR1IHRhaSBrw6R5dHTDpGrDpG4gb3NvaXRpbiB0YWkgcGl0dXVzIG92YXQgdmlyaGVlbGxpc2V0LiAiCisjfiAibGFpdGUgJXMiCisKKyN+IG1zZ2lkICJpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGVucXVldWUgYSB1c2VyIHBvaW50ZXIgYnVmZmVyLiBkZXZpY2UgJXMuIgorI34gbXNnc3RyICIiCisjfiAibXVpc3RpIGVpIHJpaXTDpCBrw6R5dHTDpGrDpG4gb3NvaXRpbnB1c2t1cmluIGpvbm9vbiBsaXPDpMOkbWlzZWVuLiBsYWl0ZSAlcyIKKworI34gbXNnaWQgIk5vIGZyZWUgYnVmZmVycyBmb3VuZCBpbiB0aGUgcG9vbCBhdCBpbmRleCAlZC4iCisjfiBtc2dzdHIgIlZhcGFpdGEgcHVza3VyZWl0YSBlaSBsw7Z5dHlueXQgaW5kZWtzaWxsw6QgJWQuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IHJlYWQgZnJvbSBDRC4iCisjfiBtc2dzdHIgIkNELWxldnlsdMOkIGVpIHZvaXR1IGx1a2VhLiIKKworI34gbXNnaWQgIkRpc2MgaXMgbm90IGFuIEF1ZGlvIENELiIKKyN+IG1zZ3N0ciAiTGV2eSBlaSBvbGUgw6TDpG5pLUNELiIKKworI34gbXNnaWQgIlRoaXMgZmlsZSBpcyBlbmNyeXB0ZWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorI34gbXNnc3RyICJUaWVkb3N0byBvbiBzYWxhdHR1IGVpa8OkIHNpdMOkIHZvaWRhIG7DpHl0dMOkw6QuIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBpbnB1dCBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiS3V2YWEgdmFsaXR1biBsw6RoZGUtZWxlbWVudGluLiIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgb3V0cHV0IGVsZW1lbnQgZm9yIEF1ZGlvL1ZpZGVvIENvbmZlcmVuY2luZy4iCisjfiBtc2dzdHIgIkt1dmFhIMOkw6RuaS0gamEgdmlkZW9uZXV2b3R0ZWx1aWxsZSB2YWxpdHVuIHVsb3N0dWxvZWxlbWVudGluLiIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgb3V0cHV0IGVsZW1lbnQgZm9yIE11c2ljIGFuZCBNb3ZpZXMuIgorI34gbXNnc3RyICJLdXZhYSBtdXNpaWtpbGxlIGphIGVsb2t1dmlsbGUgdmFsaXR1biB1bG9zdHVsb2VsZW1lbnRpbi4iCisKKyN+IG1zZ2lkICJEZXNjcmliZXMgdGhlIHNlbGVjdGVkIG91dHB1dCBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiS3V2YWEgdmFsaXR1biB1bG9zdHVsb2VsZW1lbnRpbi4iCisKKyN+IG1zZ2lkICJHU3RyZWFtZXIgYXVkaW9zaW5rIGZvciBBdWRpby9WaWRlbyBDb25mZXJlbmNpbmciCisjfiBtc2dzdHIgIkdTdHJlYW1lci3DpMOkbmluaWVsdSDDpMOkbmktIGphIHZpZGVvbmV1dm90dGVsdWlsbGUiCisKKyN+IG1zZ2lkICJHU3RyZWFtZXIgYXVkaW9zaW5rIGZvciBNdXNpYyBhbmQgTW92aWVzIgorI34gbXNnc3RyICJHU3RyZWFtZXItw6TDpG5pbmllbHUgw6TDpG5lbGxlIGphIGVsb2t1dmlsbGUiCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiBwbGF5IGF1ZGlvIHVzaW5nIGFueSBudW1iZXIgb2Ygb3V0cHV0IGVsZW1lbnRzLiBTb21lICIKKyN+ICJwb3NzaWJsZSBjaG9pY2VzIGFyZSBvc3NzaW5rLCBlc2RzaW5rIGFuZCBhbHNhc2luay4gVGhlIGF1ZGlvc2luayBjYW4gYmUgIgorI34gImEgcGFydGlhbCBwaXBlbGluZSBpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiR1N0cmVhbWVyIHZvaSBzb2l0dGFhIMOkw6RudMOkIGvDpHl0dMOkZW4gdXNlaXRhIGVyaSBuaWVsdWVsZW1lbnR0ZWrDpC4gIgorI34gIk11dXRhbWlhIHZhaWh0b2VodG9qYSBvdmF0IG9zc3NpbmssIGVzZHNpbmsgamEgYWxzYXNpbmsuIMOEw6RuaW5pZWx1IHZvaSAiCisjfiAib2xsYSBtecO2cyBsaXVrdWhpaG5hbiBvc2EgZWlrw6QgdmFpbiB5a3NpIGVsZW1lbnR0aS4iCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiBwbGF5IHZpZGVvIHVzaW5nIGFueSBudW1iZXIgb2Ygb3V0cHV0IGVsZW1lbnRzLiBTb21lICIKKyN+ICJwb3NzaWJsZSBjaG9pY2VzIGFyZSB4dmltYWdlc2luaywgeGltYWdlc2luaywgc2RsdmlkZW9zaW5rIGFuZCBhYXNpbmsuICIKKyN+ICJUaGUgdmlkZW9zaW5rIGNhbiBiZSBhIHBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkdTdHJlYW1lciB2b2kgdG9pc3RhYSB2aWRlb3RhIGvDpHl0dMOkZW4gdXNlaXRhIGVyaSBuaWVsdWVsZW1lbnR0ZWrDpC4gIgorI34gIk11dXRhbWlhIHZhaWh0b2VodG9qYSBvdmF0IHh2aW1hZ2VzaW5rLCB4aW1hZ2VzaW5rLCBzZGx2aWRlb3NpbmsgamEgIgorI34gImFhc2luay4gVmlkZW9uaWVsdSB2b2kgb2xsYSBtecO2cyBsaXVrdWhpaG5hbiBvc2EgZWlrw6QgdmFpbiB5a3NpIGVsZW1lbnR0aS4iCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiBwdXQgdmlzdWFsaXphdGlvbiBwbHVnaW5zIGluIGEgcGlwZWxpbmUgdG8gdHJhbnNmb3JtIGF1ZGlvICIKKyN+ICJzdHJlYW0gaW4gdmlkZW8gZnJhbWVzLiBEZWZhdWx0IGlzIGdvb20gYnV0IG1vcmUgdmlzdWFsaXphdGlvbiBwbHVnaW5zICIKKyN+ICJ3aWxsIGJlIHBvcnRlZCBzb29uLiBUaGUgdmlzdWFsaXphdGlvbiBwbHVnaW4gY2FuIGJlIGEgcGFydGlhbCBwaXBlbGluZSAiCisjfiAiaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkdzdHJlYW1lciB2b2kgbGFpdHRhYSB2aXN1YWxpc29pbnRpbGlpdMOkbm7DpGlzacOkIGxpdWt1aGlobmFsbGUsIGpvbGxlIHNlICIKKyN+ICJtdXVudGFhIMOkw6RuaXZpcnJhbiB2aWRlb3J1dWR1aWtzaS4gT2xldHVzbGlpdMOkbm7DpGluZW4gb24gZ29vbSwgbXV0dGEgIgorI34gIm11aXRhIG9sbGFhbiBsaXPDpMOkbcOkc3PDpCBwaWFuLiBWaXN1YWxpc29pbm5pbiBsaWl0w6RubsOkaW5lbiB2b2kgb2xsYSBtecO2cyAiCisjfiAibGl1a3VoaWhuYW4gb3NhIGVpa8OkIHZhaW4geWtzaSBlbGVtZW50dGkuIgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcmVjb3JkIGF1ZGlvIHVzaW5nIGFueSBudW1iZXIgb2YgaW5wdXQgZWxlbWVudHMuIFNvbWUgIgorI34gInBvc3NpYmxlIGNob2ljZXMgYXJlIG9zc3NyYywgZXNkc3JjIGFuZCBhbHNhc3JjLiBUaGUgYXVkaW8gc291cmNlIGNhbiBiZSAiCisjfiAiYSBwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJHU3RyZWFtZXIgdm9pIG5hdWhvaXR0YWEgw6TDpG50w6Qga8OkeXR0w6RlbiB1c2VpdGEgZXJpIGzDpGhkZS1lbGVtZW50dGVqw6QuICIKKyN+ICJNdXV0YW1pYSB2YWlodG9laHRvamEgb3ZhdCBvc3NzcmMsIGVzZHNyYyBqYSBhbHNhc3JjLiDDhMOkbmlsw6RoZGUgdm9pIG9sbGEgIgorI34gIm15w7ZzIGxpdWt1aGlobmFuIG9zYSBlaWvDpCB2YWluIHlrc2kgZWxlbWVudHRpLiIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHJlY29yZCB2aWRlbyBmcm9tIGFueSBudW1iZXIgb2YgaW5wdXQgZWxlbWVudHMuIFNvbWUgIgorI34gInBvc3NpYmxlIGNob2ljZXMgYXJlIHY0bHNyYyBhbmQgdmlkZW90ZXN0c3JjLiBUaGUgdmlkZW8gc291cmNlIGNhbiBiZSBhICIKKyN+ICJwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJHU3RyZWFtZXIgdm9pIG5hdWhvaXR0YWEgdmlkZW90YSBrw6R5dHTDpGVuIHVzZWl0YSBlcmkgbMOkaGRlLWVsZW1lbnR0ZWrDpC4gIgorI34gIk11dXRhbWlhIHZhaWh0b2VodG9qYSBvdmF0IHY0bHNyYyBqYSB2aWRlb3Rlc3RzcmMuLiBWaWRlb2zDpGhkZSB2b2kgb2xsYSAiCisjfiAibXnDtnMgbGl1a3VoaWhuYW4gb3NhIGVpa8OkIHZhaW4geWtzaSBlbGVtZW50dGkuIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW8gc291cmNlIgorI34gbXNnc3RyICJHU3RyZWFtZXJpbiBvbGV0dXPDpMOkbmlsw6RoZGUiCisKKyN+IG1zZ2lkICJkZWZhdWx0IEdTdHJlYW1lciBhdWRpb3NpbmsiCisjfiBtc2dzdHIgIkdTdHJlYW1lcmluIG9sZXR1c8Okw6RuaW5pZWx1IgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgdmlkZW8gc291cmNlIgorI34gbXNnc3RyICJHU3RyZWFtZXJpbiBvbGV0dXN2aWRlb2zDpGhkZSIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIHZpZGVvc2luayIKKyN+IG1zZ3N0ciAiR1N0cmVhbWVyaW4gb2xldHVzdmlkZW9uaWVsdSIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIHZpc3VhbGl6YXRpb24gcGx1Z2luIgorI34gbXNnc3RyICJHc3RyZWFtZXJpbiB2aXN1YWxpc29pbnRpZW4gb2xldHVzbGlpdMOkbm7DpGluZW4iCisKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgR1N0cmVhbWVyIGF1ZGlvc2luayBmb3IgQXVkaW8vVmlkZW8gQ29uZmVyZW5jaW5nIgorI34gbXNnc3RyICJrdXZhdXMgw6TDpG5pLSBqYSB2aWRlb25ldXZvdHRlbHVuIEdTdHJlYW1lci3DpMOkbmluaWVsdWxsZSIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBHU3RyZWFtZXIgYXVkaW9zaW5rIGZvciBNdXNpYyBhbmQgTW92aWVzIgorI34gbXNnc3RyICJrdXZhdXMgbXVzaWlraW4gamEgZWxva3V2aWVuIEdTdHJlYW1lci3DpMOkbmluaWVsdWxsZSIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBkZWZhdWx0IEdTdHJlYW1lciBhdWRpb3NpbmsiCisjfiBtc2dzdHIgIkdTdHJlYW1lcmluIG9sZXR1c8Okw6RuaW5pZWx1biBrdXZhdXMiCisKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW9zcmMiCisjfiBtc2dzdHIgIkdTdHJlYW1lcmluIG9sZXR1c8Okw6RuaWzDpGh0ZWVuIGt1dmF1cyIKZGlmZiAtLWdpdCBhL3BvL2ZyLnBvIGIvcG8vZnIucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjZDg4MQotLS0gL2Rldi9udWxsCisrKyBiL3BvL2ZyLnBvCkBAIC0wLDAgKzEsNDYzIEBACisjIFRyYW5zbGF0aW9uIG9mIGdzdC1wbHVnaW5zLWdvb2QgdG8gRnJlbmNoCisjIENvcHlyaWdodCAoQykgMjAwMy0yMDExIEdTdHJlYW1lciBjb3JlIHRlYW0KKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdzdC1wbHVnaW5zLWdvb2QgcGFja2FnZS4KKyMKKyMgTmljb2xhcyBWZWxpbiA8bmljb2xhc0B2ZWxpbi5mcj4sIDIwMDguCisjIENsYXVkZSBQYXJveiA8Y2xhdWRlQDJ4bGlicmUubmV0PiwgMjAwOC0yMDExLgorIyBTdMOpcGhhbmUgQXVsZXJ5IDxsa3Bwb0BmcmVlLmZyPiwgMjAxNS4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QgMS43LjJcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxNi0wMi0yMCAxNjoyNyswMTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBTdMOpcGhhbmUgQXVsZXJ5IDxsa3Bwb0BmcmVlLmZyPlxuIgorIkxhbmd1YWdlLVRlYW06IEZyZW5jaCA8dHJhZHVjQHRyYWR1Yy5vcmc+XG4iCisiTGFuZ3VhZ2U6IGZyXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgInNlcnZldXIgSmFjayBpbnRyb3V2YWJsZSIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiw4ljaGVjIGRlIGTDqWNvZGFnZSBkZSBs4oCZaW1hZ2UgSlBFRyIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiwqvCoCVzwqDCuyBwYXIgwqvCoCVzwqDCuyIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiSW1wb3NzaWJsZSBkZSBzZSBjb25uZWN0ZXIgYXUgc2VydmV1ciIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJBdWN1biBVUkwgZMOpZmluaS4iCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIkltcG9zc2libGUgZGUgcsOpc291ZHJlIGxlIG5vbSBkdSBzZXJ2ZXVyLiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJJbXBvc3NpYmxlIGTigJnDqXRhYmxpciB1bmUgY29ubmV4aW9uIHZlcnMgbGUgc2VydmV1ci4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICJMYSBjb25maWd1cmF0aW9uIGTigJl1bmUgY29ubmV4aW9uIHPDqWN1cmlzw6llIGEgw6ljaG91w6kuIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorIlVuZSBlcnJldXIgcsOpc2VhdSBz4oCZZXN0IHByb2R1aXRlIG91IGxlIHNlcnZldXIgYSBmZXJtw6kgYWJydXB0ZW1lbnQgbGEgIgorImNvbm5leGlvbi4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIkxlIHNlcnZldXIgYSBlbnZvecOpIGRlIG1hdXZhaXNlcyBkb25uw6llcy4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiTGUgc2VydmV1ciBuZSBnw6hyZSBwYXMgbGEgcmVjaGVyY2hlLiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiRW50csOpZSBhdWRpbyBhYnNlbnRlIG91IG5vbiB2YWxpZGUsIGxlIGZsdXggQVZJIHNlcmEgY29ycm9tcHUuIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJDZSBmaWNoaWVyIG5lIGNvbnRpZW50IGF1Y3VuIGZsdXggZXhwbG9pdGFibGUuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJDZSBmaWNoaWVyIG4nZXN0IHBhcyB2YWxpZGUgZXQgbmUgcGV1dCBkb25jIHBhcyDDqnRyZSBsdS4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiSW1wb3NzaWJsZSBkZSBsaXJlIGxlIGZsdXggY2FyIGlsIGVzdCBjaGlmZnLDqSBwYXIgdW4gRFJNIFBsYXlSZWFkeS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkNlIGZpY2hpZXIgZXN0IGNvcnJvbXB1IGV0IG5lIHBldXQgcGFzIMOqdHJlIGx1LiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiVGFpbGxlIGTigJlhdG9tZSBub24gdmFsaWRlLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiQ2UgZmljaGllciBu4oCZZXN0IHBhcyBjb21wbGV0IGV0IG5lIHBldXQgZG9uYyBwYXMgw6p0cmUgbHUuIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICIiCisiSWwgZXN0IHBvc3NpYmxlIHF1ZSBsYSB2aWTDqW8gZGFucyBjZSBmaWNoaWVyIG5lIHB1aXNzZSBwYXMgw6p0cmUgbHVlICIKKyJjb3JyZWN0ZW1lbnQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIkNlIGZpY2hpZXIgY29udGllbnQgdHJvcCBkZSBmbHV4LiBTZXVscyBsZXMgJWQgcHJlbWllcnMgc2Vyb250IGx1cyIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisiQXVjdW4gZmx1eCBwcmlzIGVuIGNoYXJnZSBu4oCZYSDDqXTDqSB0cm91dsOpLiBJbCBmYXV0IHBldXQtw6p0cmUgaW5zdGFsbGVyIHVuICIKKyJncmVmZm9uIGTigJlleHRlbnNpb24gR1N0cmVhbWVyIFJUU1AgcG91ciBsZXMgZmx1eCBSZWFsIG1lZGlhLiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorIkF1Y3VuIGZsdXggcHJpcyBlbiBjaGFyZ2UgbuKAmWEgw6l0w6kgdHJvdXbDqS4gSWwgZmF1dCBwZXV0LcOqdHJlIGF1dG9yaXNlciAiCisiZGF2YW50YWdlIGRlIHByb3RvY29sZXMgZGUgdHJhbnNwb3J0IG91IGlsIG1hbnF1ZSBwZXV0LcOqdHJlIGxlIGJvbiBncmVmZm9uICIKKyJk4oCZZXh0ZW5zaW9uIEdTdHJlYW1lciBSVFNQLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyJJbXBvc3NpYmxlIGTigJlvdXZyaXIgbGUgcMOpcmlwaMOpcmlxdWUgYXVkaW8gZW4gbGVjdHVyZS4gTGUgcMOpcmlwaMOpcmlxdWUgZXN0ICIKKyJ1dGlsaXPDqSBwYXIgdW5lIGF1dHJlIGFwcGxpY2F0aW9uLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiSW1wb3NzaWJsZSBk4oCZb3V2cmlyIGxlIHDDqXJpcGjDqXJpcXVlIGF1ZGlvIGVuIGxlY3R1cmUuIFZvdXMgbuKAmWF2ZXogcGFzIGxlcyAiCisiZHJvaXRzIG7DqWNlc3NhaXJlcyBwb3VyIG91dnJpciBsZSBww6lyaXBow6lyaXF1ZS4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiSW1wb3NzaWJsZSBk4oCZb3V2cmlyIGxlIHDDqXJpcGjDqXJpcXVlIGF1ZGlvIGVuIGxlY3R1cmUuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIkltcG9zc2libGUgZOKAmW91dnJpciBsZSBww6lyaXBow6lyaXF1ZSBhdWRpbyBlbiBsZWN0dXJlLiBDZXR0ZSB2ZXJzaW9uIGTigJlPU1MgIgorIihPcGVuIFNvdW5kIFN5c3RlbSkgbuKAmWVzdCBwYXMgcHJpc2UgZW4gY2hhcmdlIHBhciBjZXQgw6lsw6ltZW50LiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJMYSBsZWN0dXJlIG7igJllc3QgcGFzIHByaXNlIGVuIGNoYXJnZSBwYXIgY2UgcMOpcmlwaMOpcmlxdWUgYXVkaW8uIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICJFcnJldXIgZGUgbGVjdHVyZSBhdWRpby4iCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkzigJllbnJlZ2lzdHJlbWVudCBu4oCZZXN0IHBhcyBwcmlzIGVuIGNoYXJnZSBwYXIgY2UgcMOpcmlwaMOpcmlxdWUgYXVkaW8uIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiRXJyZXVyIGxvcnMgZGUgbOKAmWVucmVnaXN0cmVtZW50IMOgIHBhcnRpciBkdSBww6lyaXBow6lyaXF1ZSBhdWRpby4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJJbXBvc3NpYmxlIGTigJlvdXZyaXIgbGUgcMOpcmlwaMOpcmlxdWUgYXVkaW8gcG91ciBs4oCZZW5yZWdpc3RyZW1lbnQuIFZvdXMgbuKAmWF2ZXogIgorInBhcyBsZXMgZHJvaXRzIG7DqWNlc3NhaXJlcyBwb3VyIG91dnJpciBsZSBww6lyaXBow6lyaXF1ZS4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIkltcG9zc2libGUgZOKAmW91dnJpciBsZSBww6lyaXBow6lyaXF1ZSBhdWRpbyBwb3VyIGzigJllbnJlZ2lzdHJlbWVudC4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiUMOpcmlwaMOocmlxdWUgQ29yZUF1ZGlvIGludHJvdXZhYmxlIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICJMZSBww6lyaXBow6hyaXF1ZSBDb3JlQXVkaW8gbuKAmWEgcGFzIHB1IMOqdHJlIG91dmVydCIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIlNvdXJjZSBk4oCZZW5yZWdpc3RyZW1lbnQiCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWNybyIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIkVudHLDqWUgbGlnbmUiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiQ0QgaW50ZXJuZSIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJFbnRyw6llIFNQRElGIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIkVudHLDqWUgQVVYIDEiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiRW50csOpZSBBVVggMiIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJDb2RlYyBib3VjbGUgaW50ZXJuZSIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiU3VuVlRTIGJvdWNsZSBpbnRlcm5lIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJWb2x1bWUiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJHYWluIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiTW9uaXRldXIiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJIYXV0LXBhcmxldXIgaW50ZXJuZSIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiw4ljb3V0ZXVycyIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICJTb3J0aWUgbGlnbmUiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNvcnRpZSBTUERJRiIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiU29ydGllIEFVWCAxIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICJTb3J0aWUgQVVYIDIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRXJyZXVyIGRlIGxlY3R1cmUgZGUgJWQgb2N0ZXRzIHN1ciBsZSBww6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorIkltcG9zc2libGUgZOKAmcOpbnVtw6lyZXIgbGVzIGZvcm1hdHMgdmlkw6lvIGNvbXBhdGlibGVzIGF2ZWMgbGUgcMOpcmlwaMOpcmlxdWUgIgorIsKrwqAlc8KgwrsiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIkltcG9zc2libGUgZGUgbWFwcGVyIGxlcyB0YW1wb25zIGR1IHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICIiCisiTGUgcGlsb3RlIGR1IHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsgbmUgcHJlbmQgZW4gY2hhcmdlIGxhIG3DqXRob2RlIGTigJllbnRyw6llLSIKKyJzb3J0aWUgJWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICIiCisiTGUgcGlsb3RlIGR1IHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsgbmUgcHJlbmQgZW4gY2hhcmdlIGF1Y3VuZSBtw6l0aG9kZSBk4oCZZW50csOpZS0iCisic29ydGllIGNvbm51ZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiUMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuyBvY2N1cMOpIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICIiCisiTGUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuyBuZSBwZXV0IHBhcyBjYXB0dXJlciBhdmVjIHVuZSByw6lzb2x1dGlvbiBkZSAlZCB4ICVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJMZSBww6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7IG5lIHBldXQgcGFzIGNhcHR1cmVyIGRhbnMgbGUgZm9ybWF0IHNww6ljaWZpw6kiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiTGUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuyBuZSBwcmVuZCBwYXMgZW4gY2hhcmdlIGxlcyBwbGFucyBub24gY29udGlndcOrcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIkltcG9zc2libGUgZOKAmW9idGVuaXIgbGVzIHBhcmFtw6h0cmVzIGR1IHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIiIKKyJMZSBww6lyaXBow6lyaXF1ZSB2aWTDqW8gbuKAmWEgcGFzIGFjY2VwdMOpIGxlIG5vdXZlYXUgcGFyYW3DqHRyZSBkZSBmcsOpcXVlbmNlICIKKyJk4oCZaW1hZ2UuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiTGUgcMOpcmlwaMOpcmlxdWUgdmlkw6lvIG7igJlhIHBhcyBmb3VybmkgZGUgZm9ybWF0IGRlIHNvcnRpZS4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiTGUgcMOpcmlwaMOpcmlxdWUgdmlkw6lvIGEgcmV0b3VybsOpIHVuZSBkaW1lbnNpb25zIGluY29ycmVjdGUuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIiIKKyJMZSBww6lyaXBow6lyaXF1ZSB2aWTDqW8gdXRpbGlzZSB1bmUgbcOpdGhvZGUgZOKAmWVudHJlbGFjZW1lbnQgbm9uIHByaXNlIGVuICIKKyJjaGFyZ2UuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIkxlIHDDqXJpcGjDqXJpcXVlIHZpZMOpbyB1dGlsaXNlIHVuIGZvcm1hdCBkZSBwaXhlbCBub24gcHJpcyBlbiBjaGFyZ2UuIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIkltcG9zc2libGUgZGUgY29uZmlndXJlciBsZSBzcG9vbGVyIGludGVybmUgZGUgdGFtcG9ucy4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIkxlIHDDqXJpcGjDqXJpcXVlIHZpZMOpbyBu4oCZYSBzdWdnw6lyw6kgYXVjdW5lIHRhaWxsZSBkZSBjYWNoZS4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiSW1wb3NzaWJsZSBk4oCZb2J0ZW5pciBsZXMgcGFyYW3DqHRyZXMgZHUgc3ludG9uaXNldXIgJWQgZHUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRXJyZXVyIGTigJlpbnRlcnJvZ2F0aW9uIGRlcyBjYXBhY2l0w6lzIGR1IHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiTGUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuyBuJ2VzdCBwYXMgdW4gc3ludG9uaXNldXIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiSW1wb3NzaWJsZSBk4oCZb2J0ZW5pciB1biBmbHV4IHJhZGlvIGRlcHVpcyBsZSBww6lyaXBow6lyaXF1ZSAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJJbXBvc3NpYmxlIGRlIGTDqWZpbmlyIGzigJllbnRyw6llICVkIHN1ciBsZSBww6lyaXBow6lyaXF1ZSAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkltcG9zc2libGUgZGUgbW9kaWZpZXIgbGEgc291cmRpbmUgZHUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuy4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIkltcG9zc2libGUgZOKAmWFsbG91ZXIgbGEgbcOpbW9pcmUgbsOpY2Vzc2FpcmUuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIkltcG9zc2libGUgZOKAmWFsbG91ZXIgbGEgbcOpbW9pcmUgbsOpY2Vzc2FpcmUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJMZSBjb252ZXJ0aXNzZXVyIGR1IHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsgbmUgcHJlbmQgZW4gY2hhcmdlIGF1Y3VuIGZvcm1hdCAiCisiZOKAmWVudHLDqWUiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJMZSBjb252ZXJ0aXNzZXVyIGR1IHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsgbmUgcHJlbmQgZW4gY2hhcmdlIGF1Y3VuIGZvcm1hdCBkZSAiCisic29ydGllIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisiTOKAmWVuY29kZXVyIGR1IHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsgbmUgcHJlbmQgZW4gY2hhcmdlIGF1Y3VuIGZvcm1hdCBk4oCZZW50csOpZSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJM4oCZZW5jb2RldXIgZHUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuyBuZSBwcmVuZCBlbiBjaGFyZ2UgYXVjdW4gZm9ybWF0IGRlIHNvcnRpZSIKKworbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICLDiWNoZWMgZGUgZMOpbWFycmFnZSBkdSBwcm9jZXNzdXMgZGUgZMOpY29kYWdlLiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiw4ljaGVjIGR1IHRyYWl0ZW1lbnQgZGUgZnJhbWUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIkVycmV1ciBkZSByw6ljdXDDqXJhdGlvbiBkZXMgY2FwYWNpdMOpcyBwb3VyIGxlIHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrvCoDogY2UgbuKAmWVzdCAiCisicGFzIHVuIHBpbG90ZSB2NGwyLiBWw6lyaWZpZXogc2kgY+KAmWVzdCB1biBwaWxvdGUgdjRsMS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICIiCisiSW1wb3NzaWJsZSBkZSByw6ljdXDDqXJlciBsZXMgYXR0cmlidXRzIGRlIGzigJllbnRyw6llICVkIGR1IHDDqXJpcGjDqXJpcXVlICVzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJJbXBvc3NpYmxlIGRlIHLDqWN1cMOpcmVyIGxlcyBwYXJhbcOodHJlcyBkdSBzeW50b25pc2V1ciAlZCBkdSBww6lyaXBow6lyaXF1ZSAiCisiwqvCoCVzwqDCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICJJbXBvc3NpYmxlIGRlIHLDqWN1cMOpcmVyIGxhIG5vcm1lIGR1IHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiSW1wb3NzaWJsZSBkZSByw6ljdXDDqXJlciBsZXMgYXR0cmlidXRzIGRlIGNvbnRyw7RsZSBkdSBww6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJJbXBvc3NpYmxlIGTigJlpZGVudGlmaWVyIGxlIHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkNlY2kgbuKAmWVzdCBwYXMgdW4gcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJJbXBvc3NpYmxlIGTigJlvdXZyaXIgbGUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuyBlbiBsZWN0dXJlIGV0IMOpY3JpdHVyZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJMZSBww6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7IG7igJllc3QgcGFzIHVuIHDDqXJpcGjDqXJpcXVlIGTigJllbnJlZ2lzdHJlbWVudC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIkxlIHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsgbuKAmWVzdCBwYXMgdW4gcMOpcmlwaMOpcmlxdWUgZGUgc29ydGllLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiTGUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuyBu4oCZZXN0IHBhcyB1biBww6lyaXBow6lyaXF1ZSBNMk0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJJbXBvc3NpYmxlIGRlIGR1cGxpcXVlciBsZSBww6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7IGVuIGxlY3R1cmUgZXQgw6ljcml0dXJlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTGEgZMOpZmluaXRpb24gZGUgbGEgbm9ybWUgZHUgcMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuyBhIMOpY2hvdcOpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJJbXBvc3NpYmxlIGRlIHLDqWN1cMOpcmVyIGxhIGZyw6lxdWVuY2UgYWN0dWVsbGUgZGUgc3ludG9uaXNhdGlvbiBkdSAiCisicMOpcmlwaMOpcmlxdWUgwqvCoCVzwqDCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorIkltcG9zc2libGUgZGUgZMOpZmluaXIgbGEgZnLDqXF1ZW5jZSBkZSBzeW50b25pc2F0aW9uIGR1IHDDqXJpcGjDqXJpcXVlIMKrwqAlc8Kgwrsgw6AgIgorIiVsdcKgSHouIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkltcG9zc2libGUgZOKAmW9idGVuaXIgbGEgZm9yY2UgZHUgc2lnbmFsIGR1IHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiSW1wb3NzaWJsZSBkZSByw6ljdXDDqXJlciBsYSB2YWxldXIgZHUgY29udHLDtGxlICVkIGR1IHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiSW1wb3NzaWJsZSBkZSByw6ljdXDDqXJlciBsYSB2YWxldXIgJWQgZHUgY29udHLDtGxlICVkIGR1IHDDqXJpcGjDqXJpcXVlIMKrwqAlc8KgwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiSW1wb3NzaWJsZSBkZSByw6ljdXDDqXJlciBs4oCZZW50csOpZSBhY3R1ZWxsZSBkdSBww6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7LiBD4oCZZXN0IHBldXQtIgorIsOqdHJlIHVuIHDDqXJpcGjDqXJpcXVlIHJhZGlvIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJJbXBvc3NpYmxlIGRlIHLDqWN1cMOpcmVyIGxhIHNvcnRpZSBhY3R1ZWxsZSBkdSBww6lyaXBow6lyaXF1ZSDCq8KgJXPCoMK7LiBD4oCZZXN0ICIKKyJwZXV0LcOqdHJlIHVuIHDDqXJpcGjDqXJpcXVlIHJhZGlvIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkltcG9zc2libGUgZGUgZMOpZmluaXIgbGEgc29ydGllICVkIGR1IHDDqXJpcGjDqXJpcXVlICVzLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIiIKKyJMYSBtb2RpZmljYXRpb24gZGUgbGEgcsOpc29sdXRpb24gYXUgY291cnMgZGUgbOKAmWV4w6ljdXRpb24gbuKAmWVzdCBwYXMgZW5jb3JlICIKKyJwcmlzZSBlbiBjaGFyZ2UuIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJJbXBvc3NpYmxlIGRlIGZvbmN0aW9ubmVyIHNhbnMgaG9ybG9nZSIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiRXJyZXVyIGR1IGZsdXggZGUgZG9ubsOpZXMgaW50ZXJuZS4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJFcnJldXIgZHUgZmx1eCBkZSBkb25uw6llcyBpbnRlcm5lLiIKZGlmZiAtLWdpdCBhL3BvL2Z1ci5wbyBiL3BvL2Z1ci5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmZjMWUzCi0tLSAvZGV2L251bGwKKysrIGIvcG8vZnVyLnBvCkBAIC0wLDAgKzEsNDM2IEBACisjIFNPTUUgREVTQ1JJUFRJVkUgVElUTEUuCisjIFRoaXMgZmlsZSBpcyBwdXQgaW4gdGhlIHB1YmxpYyBkb21haW4uCisjIEZBQklPIFRPTUFUIDxmLnQucHVibGljQGdtYWlsLmNvbT4sIDIwMTcuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDEuMTAuMFxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDE3LTAyLTE3IDEwOjU0KzAxMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEZhYmlvIFRvbWF0IDxmLnQucHVibGljQGdtYWlsLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBGcml1bGlhbiA8Zi50LnB1YmxpY0BnbWFpbC5jb20+XG4iCisiTGFuZ3VhZ2U6IGZ1clxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlgtQnVnczogUmVwb3J0IHRyYW5zbGF0aW9uIGVycm9ycyB0byB0aGUgTGFuZ3VhZ2UtVGVhbSBhZGRyZXNzLlxuIgorIlgtR2VuZXJhdG9yOiBQb2VkaXQgMS44LjExXG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0yOyBwbHVyYWw9KG4gIT0gMSk7XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIlNlcnZpZMO0ciBKYWNrIG5vIGNqYXTDonQiCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIk5vIHNpIMOoIHJpdsOidHMgYSBkZWNvZGlmaWPDoiBsYSBpbWFnamluIEpQRUciCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIiclcycgZGkgJyVzJyIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiSW1wdXNzaWJpbCBjb25ldGlzaSBhbCBzZXJ2aWTDtHIiCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiTmlzc3VuIFVSTCBzdGFiaWzDrnQuIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJJbXB1c3NpYmlsIHJpc29sdmkgaWwgbm9uIGRhbCBzZXJ2aWTDtHIuIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIkltcHVzc2liaWwgc3RhYmlsw64gbGEgY29uZXNzaW9uIGFsIHNlcnZpZMO0ci4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICJObyBzaSDDqCByaXbDonRzIGEgY29uZmlndXLDoiBsYSBjb25lc3Npb24gc2lndXJlLiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIiIKKyJBbCDDqCBjYXBpdMOidCB1biBlcsO0ciBkaSByw6p0IG8gaWwgc2Vydmlkw7RyIGFsIMOgIHNpZXLDonQgbGEgY29uZXNzaW9uIGluICIKKyJtYW5pZXJlIGluc3BpZXRhZGUuIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICJJbCBzZXJ2aWTDtHIgYWwgw6AgaW52acOidCBkw6J0cyBzYmFsacOidHMuIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIklsIHNlcnZpZMO0ciBub2wgc3VwdWFydGUgbGEgcmljZXJjamUuIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICJOaXNzdW4gbyBpbnZhbGl0IGF1ZGlvIGluIGplbnRyYWRlLCBpbCBmbHVzIEFWSSBhbCBzYXLDoCBydXZpbsOidC4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIkNoZXN0IGZpbGUgbm9sIGNvbnRlbiBmbHVzIHJpcHJvZHVzaWJpaS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkNoZXN0IGZpbGUgbm9sIMOoIHZhbGl0IGUgbm9sIHB1ZXMgamVzc2kgcmlwcm9kb3QuIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKyJJbXB1c3NpYmlsIHJpcHJvZHVzaSBpbCBmbHVzIHBhciB2aWUgY2hlIGFsIMOoIGNpZnLDonQgY3VuIFBsYXlSZWFkeSBEUk0uIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJDaGVzdCBmaWxlIGFsIMOoIHJ1dmluw6J0IGUgbm9sIHB1ZXMgamVzc2kgcmlwcm9kb3QuIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICJEaW1lbnNpb24gYXRvbSBubyB2YWxpZGUuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJDaGVzdCBmaWxlIG5vbCDDqCBjb21wbGV0IGUgbm9sIHB1ZXMgamVzc2kgcmlwcm9kb3QuIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICJpbCB2aWRlbyBpbiBjaGVzdCBmaWxlIGFsIHBvZGFyw6hzIG5vIGZ1bnppb27DoiBiZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIkNoZXN0IGZpbGUgYWwgY29udGVuIG1hc3NlIGZsdXMuIFNpIHJpcHJvZHVzYXLDoCBub21lIGkgcHJpbnMgJWQiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIk5pc3N1biBmbHVzIHN1cHVhcnTDonQgYWwgw6ggc3TDonQgY2phdMOidC4gQWwgcG9kYXLDqHMgY292ZW50w6IgZGkgaW5zdGFsw6IgdW4gIgorInBsdWdpbiBkaSBlc3RlbnNpb24gUlRTUCBwYXIgR1N0cmVhbWVyIHBhaSBmbHVzIFJlYWwgbWVkaWEuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiTmlzc3VuIGZsdXMgc3VwdWFydMOidCBhbCDDqCBzdMOidCBjamF0w6J0LiBBbCBwb2RhcsOocyBjb3ZlbnTDoiBkaSBwZXJtZXRpIHBsdWkgIgorInByb3RvY29pIGRpIHRyYXNwdWFydCBvIGluIGFsdGVybmF0aXZlIGFsIHBvZGFyw6hzIG1hbmNqw6IgaWwganVzdCBwbHVnaW4gZGkgIgorImVzdGVuc2lvbiBSVFNQIHBhciBHU3RyZWFtZXIuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIkltcHVzc2liaWwgdmllcnppIGlsIGRpc3Bvc2l0w65mIGF1ZGlvIHBlIHJpcHJvZHV6aW9uLiBJbCBkaXNwb3NpdMOuZiBhbCDDqCAiCisiZG9wcsOidCBkaSB1bmUgYWx0cmUgYXBsaWNhemlvbi4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIkltcHVzc2liaWwgdmllcnppIGlsIGRpc3Bvc2l0w65mIGF1ZGlvIHBlIHJpcHJvZHV6aW9uLiBObyBzaSDDoCBpIHBlcm3DqHMgcGFyICIKKyJ2aWVyemkgaWwgZGlzcG9zaXTDrmYuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIkltcHVzc2liaWwgdmllcnppIGlsIGRpc3Bvc2l0w65mIGF1ZGlvIHBlIHJpcHJvZHV6aW9uLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyJJbXB1c3NpYmlsIHZpZXJ6aSBpbCBkaXNwb3NpdMOuZiBhdWRpbyBwZSByaXByb2R1emlvbi4gQ2hlc3RlIHZlcnNpb24gZGkgT3BlbiAiCisiU291bmQgU3lzdGVtIG5vIGplIHN1cHVhcnRhZGUgZGkgY2hlc3QgZWxlbWVudC4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiTGEgcmlwcm9kdXppb24gbm8gamUgc3VwdWFydGFkZSBkaSBjaGVzdCBkaXNwb3NpdMOuZiBhdWRpby4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIkVyw7RyIGRpIHJpcHJvZHV6aW9uIGF1ZGlvLiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiTGEgcmVnamlzdHJhemlvbiBubyBqZSBzdXB1YXJ0YWRlIGRpIGNoZXN0IGRpc3Bvc2l0w65mIGF1ZGlvLiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkVyw7RyIHRhbCByZWdqaXN0csOiIGRhbCBkaXNwb3NpdMOuZiBhdWRpby4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJJbXB1c3NpYmlsIHZpZXJ6aSBpbCBkaXNwb3NpdMOuZiBhdWRpbyBwZSByZWdqaXN0cmF6aW9uLiBObyBzaSDDoCBpIHBlcm3DqHMgcGFyICIKKyJ2aWVyemkgaWwgZGlzcG9zaXTDrmYuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICJJbXB1c3NpYmlsIHZpZXJ6aSBpbCBkaXNwb3NpdMOuZiBhdWRpbyBwZSByZWdqaXN0cmF6aW9uLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICJEaXNwb3NpdMOuZiBDb3JlQXVkaW8gbm8gY2phdMOidCIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiTm9sIMOoIHN0w6J0IHB1c3NpYmlsIHZpZXJ6aSBpbCBkaXNwb3NpdMOuZiBDb3JlQXVkaW8iCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICJTb3J6aW50IHJlZ2ppc3RyYXppb24iCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWNyb2ZvbiIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIkxpbmllIGRpIGplbnRyYWRlIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIkNEIGludGVybmkiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiU1BESUYgamVudHJhZGUiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiQVVYIDEgamVudHJhZGUiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiQVVYIDIgamVudHJhZGUiCisKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiTG9vcGJhY2sgQ29kZWMiCisKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIkxvb3BiYWNrIFN1blZUUyIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiVm9sdW0iCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJWdWFkYWduIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiTW9uaXRvciIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIkNhc3NlIGluY29ycG9yYWRlIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICJDdWZpcyIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICJMaW5pZSBkaSBqZXNzdWRlIgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJTUERJRiBqZXNzdWRlIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICJBVVggMSBqZXNzdWRlIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICJBVVggMiBqZXNzdWRlIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkVyw7RyIHRhbCBsZWkgJWQgYnl0ZSBkYWwgZGlzcG9zaXTDrmYgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKyJObyBzaSDDqCByaXbDonRzIGEgZsOiIGxhIGxpc3RlIGRhaSBwdXNzaWJpaSBmb3Jtw6J0cyB2aWRlbyBjdWkgY3VhaSBpbCAiCisiZGlzcG9zaXTDrmYgJyVzJyBhbCBwdWVzIGxhdm9yw6IiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIkltcHVzc2liaWwgbWFww6IgaSBidWZmZXIgZGFsIGRpc3Bvc2l0w65mICAnJXMnIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICJJbCBkcml2ZXIgZGFsIGRpc3Bvc2l0w65mICclcycgbm9sIHN1cHVhcnRlIGlsIG1ldG9kaSBJTyAlZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIklsIGRyaXZlciBkYWwgZGlzcG9zaXTDrmYgJyVzJyBub2wgc3VwdWFydGUgbmlzc3VuIG1ldG9kaSBJTyBjb2dub3Nzw7t0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJJbCBkaXNwb3NpdMOuZiAnJXMnIGFsIMOoIG9jdXDDonQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIklsIGRpc3Bvc2l0w65mICclcycgbm9sIHB1ZXMgY2F0dXLDoiBhICVkeCVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJJbCBkaXNwb3NpdMOuZiAnJXMnIG5vbCBwdWVzIGNhdHVyw6IgdGFsIGZvcm3DonQgc3BlY2lmaWPDonQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiSW1wdXNzaWJpbCBvdGlnbsOuIGkgcGFyYW1ldHJpcyBzdWwgZGlzcG9zaXTDrmYgJyVzJyIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiIgorIklsIGRpc3Bvc2l0w65mIHZpZGVvIG5vbCDDoCBhY2V0w6J0IGxhIGdub3ZlIGltcG9zdGF6aW9uIGRlIGZyZWN1ZW5jZSBkaSAiCisiZm90b2dyYW1zLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIklsIGRpc3Bvc2l0w65mIHZpZGVvIG5vbCDDoCBmdXJuw650IHVuIGZvcm3DonQgZGkgamVzc3VkZS4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiSWwgZGlzcG9zaXTDrmYgdmlkZW8gYWwgw6AgdG9ybsOidCBkaW1lbnNpb25zIG5vIHZhbGlkaXMuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIklsIGRpc3Bvc2l0w65mIHZpZGVvIGFsIGRvcHJlIHVuIG1ldG9kaSBkaSBpbnRlcmxhemFtZW50IG5vIHN1cHVhcnTDonQiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiSWwgZGlzcG9zaXTDrmYgdmlkZW8gYWwgZG9wcmUgdW4gZm9ybcOidCBwaXhlbCBubyBzdXB1YXJ0w6J0LiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIklsIGRpc3Bvc2l0w65mIHZpZGVvIG5vbCDDoCBzdWdqZXLDrnQgbmlzc3VuZSBkaW1lbnNpb24gZGkgYnVmZmVyLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIk5vIHNpIMOoIHJpdsOidHMgYSB2w6ogaW1wb3N0YXppb25zIGRhbCBzaW50b25pemFkw7RyICVkIHN1bCBkaXNwb3NpdMOuZiAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJFcsO0ciB0YWwgb3RpZ27DriBsaSBmdW56aW9uYWxpdMOidHMgcGFsIGRpc3Bvc2l0w65mICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiSWwgZGlzcG9zaXTDrmYgJyVzJyBub2wgw6ggdW4gc2ludG9uaXphZMO0ci4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJObyBzaSDDqCByaXbDonRzIGEgdsOqIGxpcyBqZW50cmFkaXMgcmFkaW8gc3VsIGRpc3Bvc2l0w65mICclcycuICIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIk5vIHNpIMOoIHJpdsOidHMgYSBzdGFiaWzDriBsYSBqZW50cmFkZSAlZCBzdWwgZGlzcG9zaXTDrmYgJXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJObyBzaSDDqCByaXbDonRzIGEgY2FtYmnDoiBpbCBzdMOidCBkaSBjaWRpbiBwYWwgZGlzcG9zaXTDrmYgJyVzJy4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJObyBzaSDDqCByaXbDonRzIGEgYXNzZWduw6IgbGEgbWVtb3JpZSBkb21hbmRhZGUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIklsIGNvbnZlcnRpZMO0ciBzdWwgZGlzcG9zaXTDrmYgJXMgbm9sIMOgIGZvcm3DonRzIGRpIGplbnRyYWRlIHN1cHVhcnTDonRzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJJbCBjb252ZXJ0aWTDtHIgc3VsIGRpc3Bvc2l0w65mICVzIG5vbCDDoCBmb3Jtw6J0cyBkaSBqZXNzdWRlIHN1cHVhcnTDonRzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJJbCBjb2RpZmljYWTDtHIgc3VsIGRpc3Bvc2l0w65mICVzIG5vbCDDoCBmb3Jtw6J0cyBkaSBqZW50cmFkZSBzdXB1YXJ0w6J0cyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIklsIGNvZGlmaWNhZMO0ciBzdWwgZGlzcG9zaXTDrmYgJXMgbm9sIMOgIGZvcm3DonRzIGRpIGplc3N1ZGUgc3VwdWFydMOidHMiCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICJJbXB1c3NpYmlsIHByb2Nlc3PDoiBmb3RvZ3JhbS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisiRXLDtHIgdGFsIG90aWduw64gbGlzIGZ1bnppb25hbGl0w6J0cyBwYWwgZGlzcG9zaXTDrmYgJyVzJzogbm9sIMOoIHVuIGRyaXZlciAiCisidjRsMi4gQ29udHJvbGUgc2UgYWwgw6ggdW4gZHJpdmVyIHY0bDEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiTm8gc2kgw6ggcml2w6J0cyBhIGludGVyb2fDoiBpIGF0cmliw7t0cyBkaSBqZW50cmFkZSAlZCB0YWwgZGlzcG9zaXTDrmYgJXMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIk5vIHNpIMOoIHJpdsOidHMgYSBvdGlnbsOuIGxhIGltcG9zdGF6aW9uIGRhbCBzaW50b25pemFkw7RyICVkIHN1bCBkaXNwb3NpdMOuZiAiCisiJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICJObyBzaSDDqCByaXbDonRzIGEgaW50ZXJvZ8OiIGxhIG5vcm1lIHN1bCBkaXNwb3NpdMOuZiAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTm8gc2kgw6ggcml2w6J0cyBhIHbDqiBpIGF0cmliw7t0cyBkYWkgY29udHJvaSBzdWwgZGlzcG9zaXTDrmYgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiSW1wdXNzaWJpbCBpZGVudGlmaWPDoiBpbCBkaXNwb3NpdMOuZiAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJDaGVzdCBub2wgw6ggdW4gZGlzcG9zaXTDrmYgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJJbXB1c3NpYmlsIHZpZXJ6aSBpbCBkaXNwb3NpdMOuZiAnJXMnIHBhciBsZWkgZSBzY3JpdmkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiSWwgZGlzcG9zaXTDrmYgJyVzJyBub2wgw6ggdW4gZGlzcG9zaXTDrmYgZGkgY2F0dXJlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiSWwgZGlzcG9zaXTDrmYgJyVzJyBub2wgw6ggdW4gZGlzcG9zaXTDrmYgZGkgamVzc3VkZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIklsIGRpc3Bvc2l0w65mICclcycgbm9sIMOoIHVuIGRpc3Bvc2l0w65mIE0yTS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTm8gc2kgw6ggcml2w6J0cyBhIHN0YWJpbMOuIGxhIG5vcm1lIHBhbCBkaXNwb3NpdMOuZiAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJObyBzaSDDqCByaXbDonRzIGEgb3RpZ27DriBsYSBmcmVjdWVuY2UgYXR1w6JsIGRhbCBzaW50b25pemFkw7RyIHBhbCBkaXNwb3NpdMOuZiAiCisiJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorIk5vIHNpIMOoIHJpdsOidHMgYSBtZXRpIGxhIGZyZWN1ZW5jZSBhdHXDomwgZGFsIHNpbnRvbml6YWTDtHIgcGFsIGRpc3Bvc2l0w65mICIKKyInJXMnIGEgJWx1IEh6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJObyBzaSDDqCByaXbDonRzIGEgdsOqIGxhIGZ1YXJjZSBkYWwgc2VnbsOibCBwYWwgZGlzcG9zaXTDrmYgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5vIHNpIMOoIHJpdsOidHMgYSB2w6ogaWwgdmFsw7RyIHBhbCBjb250cm9sICVkIHN1bCBkaXNwb3NpdMOuZiAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTm8gc2kgw6ggcml2w6J0cyBhIG1ldGkgaWwgdmFsw7RyICVkIHBhbCBjb250cm9sICVkIHN1bCBkaXNwb3NpdMOuZiAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIk5vIHNpIMOoIHJpdsOidHMgYSB2w6ogbGEgamVudHJhZGUgYXR1w6JsIHN1bCBkaXNwb3NpdMOuZiAnJXMnLiBBbCBwb2RhcsOocyBqZXNzaSAiCisidW4gZGlzcG9zaXTDrmYgcmFkaW8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIk5vIHNpIMOoIHJpdsOidHMgYSB2w6ogbGEgamVzc3VkZSBhdHXDomwgc3VsIGRpc3Bvc2l0w65mICclcycuIEFsIHBvZGFyw6hzIGplc3NpICIKKyJ1biBkaXNwb3NpdMOuZiByYWRpbyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJObyBzaSDDqCByaXbDonRzIGEgc3RhYmlsw64gbGEgamVzc3VkZSAlZCBzdWwgZGlzcG9zaXTDrmYgJXMuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiSWwgY2FtYmnDoiBsYSByaXNvbHV6aW9uIGRpbHVuYyBsYSB2b3JlIG5vbCDDqCBhbmNqZW3DsiBzdXB1YXJ0w6J0LiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiSW1wdXNzaWJpbCBvcGVyw6IgY2VuY2UgdW4gb3Jsb2kiCmRpZmYgLS1naXQgYS9wby9nbC5wbyBiL3BvL2dsLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMzUwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9wby9nbC5wbwpAQCAtMCwwICsxLDkxMyBAQAorIyBHYWxpY2lhbiB0cmFuc2xhdGlvbiBvZiBnc3QtcGx1Z2lucy1nb29kLgorIyBDb3B5cmlnaHQgKEMpIDIwMDkgZ3N0LXBsdWdpbnMtZ29vZCdzIENPUFlSSUdIVCBIT0xERVIKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdzdC1wbHVnaW5zLWdvb2QgcGFja2FnZS4KKyMgRnJhbiBEacOpZ3VleiA8ZnJhbmRpZWd1ZXpAdWJ1bnR1LmNvbT4sIDIwMDksIDIwMTAsIDIwMTEuCisjIEZyYW4gRGllZ3VleiA8ZnJhbmRpZWd1ZXpAZ25vbWUub3JnPiwgMjAxMi4KK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QgMS4wLjNcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxMi0xMi0xNSAwMzo0NiswMjAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBGcmFuIERpZWd1ZXogPGZyYW5kaWVndWV6QHVidW50dS5jb20+XG4iCisiTGFuZ3VhZ2UtVGVhbTogR2FsaWNpYW4gPHByb3hlY3RvQHRyYXNuby5uZXQ+XG4iCisiTGFuZ3VhZ2U6IGdsXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0yOyBwbHVyYWw9KG4gIT0gMSk7XG4iCisiWC1HZW5lcmF0b3I6IFZpcnRhYWwgMC43LjFcbiIKKyJYLVByb2plY3QtU3R5bGU6IGdub21lXG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiUHJvZHVjaXVzZSB1biBlcnJvIGFvIGRlc2NvZGlmaWNhciBhIGltYXhlIEpQRUciCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIsKrJXPCuyBwb3Igwqslc8K7IgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJOb24gZm9pIHBvc8OtYmVsIGNvbmVjdGFyc2UgYW8gc2Vydmlkb3IiCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiTm8gZXhpc3RlIHVuIFVSTCBlc3RhYmVsZWNpZG8uIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJOb24gZm9pIHBvc8OtYmVsIHJlc29sdmVyIG8gbm9tZSBkbyBzZXJ2aWRvci4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiTm9uIGZvaSBwb3PDrWJlbCBlc3RhYmVsZWNlciBhIGNvbmV4acOzbiBjbyBzZXJ2aWRvci4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICJQcm9kdWNpdXNlIHVuIGZhbGxvIGRlIGNvbmZpZ3VyYWNpw7NuIGRhIGNvbmV4acOzbiBzZWd1cmEuIgorCisjLCBmdXp6eQorbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIiIKKyJQcm9kdWNpdXNlIHVuIGVycm8gZGUgcmVkZSBvdSBvIHNlcnZpZG9yIHBlY2hvdSBhIGNvbmV4acOzbiBkZSBmb3JtYSAiCisiaW5lc3BlcmFkYS4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIk8gc2Vydmlkb3IgZW52aW91IGRhdG9zIGVycsOzbmVvcy4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiTyBzZXJ2aWRvciBub24gYWRtaXRlIGEgYnVzY2EuIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICJPIGF1ZGlvIG5vbiBleGlzdGUgb3Ugbm9uIMOpIHbDoWxpZG8sIG8gZmx1eG8gQVZJIGVzdMOhIGNvcnJvbXBpZG8uIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJFc3RlIGZpY2hlaXJvIG5vbiBjb250w6luIG5pbmfDum4gZmx1eG8gcmVwcm9kdWPDrWJlbC4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkVzdGUgZmljaGVpcm8gw6kgaW5jb3JyZWN0byBlIG5vbiBwb2RlIHJlcHJvZHVjaXJzZS4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJFc3RlIGZpY2hlaXJvIGVzdMOhIGRhbmFkbyBlIG5vbiBwb2RlIHJlcHJvZHVjaXJzZS4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIlRhbWHDsW8gYXRvbSBub24gdsOhbGlkby4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkVzdGUgZmljaGVpcm8gZXN0w6EgaW5jb21wbGV0byBlIG5vbiBwb2RlIHJlcHJvZHVjaXJzZS4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIkVzdGUgdsOtZGVvIG5lc3RlIGZpY2hlaXJvIHBvZGVyw61hIG5vbiByZXByb2R1Y2lyc2UgY29ycmVjdGFtZW50ZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiIgorIkVzdGUgZmljaGVpcm8gY29udMOpbiBkZW1hc2lhZG9zIGZsdXhvcy4gU8OzIHNlIHJlcHJvZHVjaXLDoSBvIHByaW1laXJvICVkIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJOb24gc2UgZW5jb250cm91IHVuIGZsdXhvIGNvbXBhdMOtYmVsLiBQb2RlIHF1ZSBuZWNlc2l0ZSBpbnN0YWxhciB1bmhhICIKKyJleHRlbnNpw7NuIFJUU1AgZGUgR1N0cmVhbWVyIHBhcmEgb3MgZm9ybWF0b3MgZGUgZmx1eG8gUmVhbC4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyJOb24gc2UgZW5jb250cm91IHVuIGZsdXhvIGNvbXBhdMOtYmVsLiBQb2RlIHF1ZSBuZWNlc2l0ZSBwZXJtaXRpciBtw6FpcyAiCisicHJvdG9jb2xvcyBkZSB0cmFuc3BvcnRlIG91IGRlIG91dHJhIGZvcm1hIHBvZGUgcXVlIGxsZSBmYWx0ZSBhIGV4dGVuc2nDs24gIgorImNvcnJlY3RhIGRlIFJUU1AgZGUgR1N0cmVhbWVyLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyJOb24gZm9pIHBvc8OtYmVsIGFicmlyIG8gZGlzcG9zaXRpdm8gZGUgc29uIHBhcmEgYSByZXByb2R1Y2nDs24uIE8gZGlzcG9zaXRpdm8gIgorImVzdMOhIHNlbmRvIGVtcHJlZ2FkbyBwb3Igb3V0cm8gYXBsaWNhdGl2by4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIk5vbiBmb2kgcG9zw61iZWwgYWJyaXIgbyBkaXNwb3NpdGl2byBkZSBzb24uIFZvc3RlZGUgbm9uIHRlbiBwZXJtaXNvcyBwYXJhICIKKyJhYnJpciBvIGRpc3Bvc2l0aXZvLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJOb24gZm9pIHBvc8OtYmVsIGFicmlyIG8gZGlzcG9zaXRpdm8gZGUgc29uIHBhcmEgYSByZXByb2R1Y2nDs24uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIk5vbiBmb2kgcG9zw61iZWwgYWJyaXIgbyBkaXNwb3NpdGl2byBkZSBzb24gcGFyYSBhIHJlcHJvZHVjacOzbi4gRXN0YSB2ZXJzacOzbiAiCisiZG8gT3BlbiBTb3VuZCBTeXN0ZW0gbm9uIGVzdMOhIGFkbWl0aWRhIHBvciBlc3RlIGVsZW1lbnRvLiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJFc3RlIGRpc3Bvc2l0aXZvIGRlIHNvbiBub24gYWRtaXRlIGEgcmVwcm9kdWNpw7NuLiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiRXJybyBkZSByZXByb2R1Y2nDs24gZGUgc29uLiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiRXN0ZSBkaXNwb3NpdGl2byBkZSBzb24gbm9uIGFkbWl0ZSBhIGdyYXZhY2nDs24uIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiRXJybyBhbyBncmF2YXIgZG8gZGlzcG9zaXRpdm8gZGUgc29uLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIk5vbiBmb2kgcG9zw61iZWwgYWJyaXIgbyBkaXNwb3NpdGl2byBkZSBzb24gcGFyYSBhIGdyYXZhY2nDs24uIFZvc3RlZGUgbm9uIHRlbiAiCisicGVybWlzb3MgcGFyYSBhYnJpciBvIGRpc3Bvc2l0aXZvLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiTm9uIGZvaSBwb3PDrWJlbCBhYnJpciBvIGRpc3Bvc2l0aXZvIGRlIHNvbiBwYXJhIGEgZ3JhdmFjacOzbi4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICIiCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICJPcml4ZSBkYSBncmF2YWNpw7NuIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWljcsOzZm9ubyIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIkxpw7FhIGRlIGVudHJhZGEiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiQ0QgaW50ZXJubyIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJFbnRyYWRhIFNQRElGIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIkVudHJhZGEgQVVYIDEiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiRW50cmFkYSBBVVggMiIKKworIywgZnV6enkKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiQnVjbGUgbG9jYWwiCisKKyMsIGZ1enp5Cittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJCdWNsZSBsb2NhbCIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiVm9sdW1lIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiR2FuYW5jaWEiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJNb25pdG9yIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiQWx0b2ZhbGFudGUgaW50ZXJubyIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiQ2FzY29zIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIkxpw7FhIGRlIHNhw61kYSIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiU2HDrWRhIFNQRElGIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICJTYcOtZGEgQVVYIDEiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIlNhw61kYSBBVVggMiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICJQcm9kdWNpdXNlIHVuIGVycm8gYW8gbGVyICVkIGJ5dGVzIGRlc2RlIG8gZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorIlByb2R1Y2l1c2UgdW4gZmFsbG8gYW8gZW51bWVyYXIgb3MgZm9ybWF0b3MgZGUgdsOtZGVvIHBvc8OtYmVpcyBjb3MgcXVlIG8gIgorImRpc3Bvc2l0aXZvIMKrJXPCuyBwb2RlIHJlcHJvZHVjaXIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIk5vbiBmb2kgcG9zw61iZWwgbWFwZWFyIG9zIGLDumZlcmVzIGRvIGRpc3Bvc2l0aXZvIMKrJXPCuyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiTyBjb250cm9sYWRvciBkbyBkaXNwb3NpdGl2byDCqyVzwrsgbm9uIGFkbWl0ZSBvIG3DqXRvZG8gSU8gJWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICIiCisiTyBjb250cm9sYWRvciBkbyBkaXNwb3NpdGl2byDCqyVzwrsgbm9uIGFkbWl0ZSBjYWxxdWVyYSBtw6l0b2RvIElPIGNvw7FlY2lkby4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byDCqyVzwrsgZXN0w6Egb2N1cGFkbyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byDCqyVzwrsgbm9uIHBvZGUgY2FwdHVyYXIgYSAlZHglZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byDCqyVzwrsgbm9uIHBvZGUgY2FwdHVyYXIgbyBmb3JtYXRvIGVzcGVjaWZpY2FkbyIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byDCqyVzwrsgbm9uIGFkbWl0ZSBhIGNhcHR1cmEgZGUgdsOtZGVvLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIk5vbiBmb2kgcG9zw61iZWwgb2J0ZXIgb3MgcGFyw6FtZXRyb3MgcGFyYSBvIGRpc3Bvc2l0aXZvIMKrJXPCuyIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiIgorIk8gZGlzcG9zaXRpdm8gZGUgdsOtZGVvIG5vbiBhY2VwdGEgYSBub3ZhIGNvbmZpZ3VyYWNpw7NuIGRlIHRheGEgZGUgbWFyY29zLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICIiCisiTyBkaXNwb3NpdGl2byBkZSB2w61kZW8gbm9uIGFjZXB0YSBhIG5vdmEgY29uZmlndXJhY2nDs24gZGUgdGF4YSBkZSBtYXJjb3MuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICJPIGNvbnRyb2xhZG9yIGRvIGRpc3Bvc2l0aXZvIMKrJXPCuyBub24gYWRtaXRlIG8gbcOpdG9kbyBJTyAlZCIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICJPIGNvbnRyb2xhZG9yIGRvIGRpc3Bvc2l0aXZvIMKrJXPCuyBub24gYWRtaXRlIG8gbcOpdG9kbyBJTyAlZCIKKworIywgZnV6enkKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byBkZSB2w61kZW8gbm9uIHBvZGUgY3JlYXIgdW4gcG9vbCBkZSBiw7pmZXIuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byBkZSB2w61kZW8gbm9uIHBvZGUgY3JlYXIgdW4gcG9vbCBkZSBiw7pmZXIuIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiUHJvZHVjaXVzZSB1biBlcnJvIGFvIG9idGVyIGFzIGNvbmZpZ3VyYWNpw7NucyBkbyBzaW50b25pemFkb3IgJWQgbm8gIgorImRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiUHJvZHVjaXVzZSB1biBlcnJvIGFvIGxlciBhcyBjYXBhY2lkYWRlcyBwYXJhIG8gZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIk8gZGlzcG9zaXRpdm8gwqslc8K7IG5vbiDDqSB1biBzaW50b25pemFkb3IuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiUHJvZHVjaXVzZSB1biBmYWxsbyBhbyBvYnRlciBhIGVudHJhZGEgZG8gcmFkaW8gbm8gZGlzcG9zaXRpdm8gJXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiUHJvZHVjaXVzZSB1biBmYWxsbyBhbyBlc3RhYmVsZWNlciBhIGVudHJhZGEgJWQgbm8gZGlzcG9zaXRpdm8gJXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiUHJvZHVjaXVzZSB1biBlcnJvIGFvIGNhbWJpYXIgbyBlc3RhZG8gZGUgZW5tdWRlY2lkbyBwYXJhIG8gZGlzcG9zaXRpdm8gwqslc8K7LiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiTyBjb250cm9sYWRvciBkbyBkaXNwb3NpdGl2byDCqyVzwrsgbm9uIGFkbWl0ZSBvIG3DqXRvZG8gSU8gJWQiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisiTyBkaXNwb3NpdGl2byBkZSB2w61kZW8gbm9uIGFjZXB0YSBhIG5vdmEgY29uZmlndXJhY2nDs24gZGUgdGF4YSBkZSBtYXJjb3MuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIk8gZGlzcG9zaXRpdm8gZGUgdsOtZGVvIG5vbiBhY2VwdGEgYSBub3ZhIGNvbmZpZ3VyYWNpw7NuIGRlIHRheGEgZGUgbWFyY29zLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisiTyBkaXNwb3NpdGl2byBkZSB2w61kZW8gbm9uIGFjZXB0YSBhIG5vdmEgY29uZmlndXJhY2nDs24gZGUgdGF4YSBkZSBtYXJjb3MuIgorCisjLCBmdXp6eQorbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICJQcm9kdWNpdXNlIHVuIGVycm8gYW8gZGVzY29kaWZpY2FyIGEgaW1heGUgSlBFRyIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIlByb2R1Y2l1c2UgdW4gZXJybyBhbyBvYnRlciBhcyBjYXBhY2lkYWRlcyBkbyBkaXNwb3NpdGl2byDCqyVzwrs6IE5vbiDDqSB1biAiCisiY29udHJvbGFkb3IgdjRsMi4gQ29tcHJvYmUgc2Ugw6kgdW4gY29udHJvbGFkb3IgdjRsMS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICIiCisiUHJvZHVjaXVzZSB1biBlcnJvIGFvIGNvbnN1bHRhciBvcyBhdHJpYnV0b3MgZGUgZW50cmFkYSAlZCBubyBkaXNwb3NpdGl2byAlcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiUHJvZHVjaXVzZSB1biBlcnJvIGFvIGNvbmZpZ3VyYXIgbyBzaW50b25pemFkb3IgJWQgbm8gZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlByb2R1Y2l1c2UgdW4gZXJybyBhbyBjb25zdWx0YXIgYSBub3JtYSBubyBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiUHJvZHVjaXVzZSB1biBlcnJvIGFvIG9idGVyIG9zIGF0cmlidXRvcyBkZSBjb250cm9sIGRvIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTm9uIGZvaSBwb3PDrWJlbCBpZGVudGlmaWNhciBvIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRXN0ZSBub24gw6kgdW4gZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIk5vbiBmb2kgcG9zw61iZWwgYWJyaXIgbyBkaXNwb3NpdGl2byDCqyVzwrsgcGFyYSBsZWN0dXJhIGUgZXNjcml0dXJhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIk8gZGlzcG9zaXRpdm8gwqslc8K7IG5vbiDDqSB1biBkaXNwb3NpdGl2byBkZSBjYXB0dXJhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byDCqyVzwrsgbm9uIMOpIHVuIGRpc3Bvc2l0aXZvIGRlIGNhcHR1cmEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byDCqyVzwrsgbm9uIMOpIHVuIGRpc3Bvc2l0aXZvIGRlIGNhcHR1cmEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiTm9uIGZvaSBwb3PDrWJlbCBhYnJpciBvIGRpc3Bvc2l0aXZvIMKrJXPCuyBwYXJhIGxlY3R1cmEgZSBlc2NyaXR1cmEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJQcm9kdWNpdXNlIHVuIGZhbGxvIGFvIGVzdGFiZWxlY2VyIGEgbm9ybWEgbm8gZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJQcm9kdWNpdXNlIHVuIGZhbGxvICBhbyBvYnRlciBhIGZyZWN1ZW5jaWEgYWN0dWFsIGRvIHNpbnRvbml6YWRvciBwYXJhIG8gIgorImRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorIlByb2R1Y2l1c2UgdW4gZXJybyBhbyBlc3RhYmVsZWNlciBhIGZyZWN1ZW5jaWEgYWN0dWFsIGRvIHNpbnRvbml6YWRvciBwYXJhIG8gIgorImRpc3Bvc2l0aXZvIMKrJXPCuyBhICVsdSBIei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIlByb2R1Y2l1c2UgdW4gZXJybyBhbyBvYnRlciBhIHBvdGVuY2lhIGRvIHNpbmFsIHBhcmEgbyBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiUHJvZHVjaXVzZSB1biBlcnJvIGFvIG9idGVyIG8gdmFsb3IgcGFyYSBvIGNvbnRyb2wgJWQgZG8gZGlzcG9zaXRpdm8gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIlByb2R1Y2l1c2UgdW4gZmFsbG8gYW8gZXN0YWJlbGVjZXIgbyB2YWxvciAlZHMgcGFyYSBvIGNvbnRyb2wgJWQgZG8gIgorImRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJQcm9kdWNpdXNlIHVuIGZhbGxvIGFvIG9idGVyIGEgZW50cmFkYSBhY3R1YWwgbm8gZGlzcG9zaXRpdm8gwqslc8K7LiBDaWPDoWlzICIKKyJzZXhhIHVuIGRpc3Bvc2l0aXZvIGRlIHJhZGlvLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiUHJvZHVjaXVzZSB1biBmYWxsbyBhbyBvYnRlciBhIGVudHJhZGEgYWN0dWFsIG5vIGRpc3Bvc2l0aXZvIMKrJXPCuy4gUXVpemFpcyAiCisic2V4YSB1biBkaXNwb3NpdGl2byBkZSByYWRpbyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJQcm9kdWNpdXNlIHVuIGZhbGxvIGFvIGVzdGFiZWxlY2VyIGEgc2HDrWRhICVkIG5vIGRpc3Bvc2l0aXZvICVzLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIkHDrW5kYSBub24gc2UgYWRtaXRlIG8gY2FtYmlvIGRlIHJlc29sdWNpw7NuIGR1cmFudGUgYSByZXByb2R1Y2nDs24uIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJOb24gw6kgcG9zw61iZWwgb3BlcmFyIHNlbiByZWxveG8iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIlByb2R1Y2l1c2UgdW4gZXJybyBubyBmbHV4byBkZSBkYXRvcyBpbnRlcm5vLiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgIlByb2R1Y2l1c2UgdW4gZXJybyBpbnRlcm5vIG5vIGZsdXhvIGRlIGRhdG9zLiIKKworI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAiTyBkaXNwb3NpdGl2byDCqyVzwrsgbm9uIGFkbWl0ZSBhIGNhcHR1cmEgZGUgdsOtZGVvLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIk5vbiBmb2kgcG9zw61iZWwgZXN0YWJlbGVjZXIgYSBjb25leGnDs24gY28gc2Vydmlkb3IgZGUgc29uIgorCisjfiBtc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IHNvdW5kIHNlcnZlciBjYXBhYmlsaXRpZXMiCisjfiBtc2dzdHIgIlByb2R1Y2l1c2UgdW4gZXJybyBhbyBjb25zdWx0YXIgYXMgY2FwYWNpZGFkZXMgZG8gc2Vydmlkb3IgZGUgc29uIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAiQmFpeG9zIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICJBZ3Vkb3MiCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAiU2ludGV0aXphZG9yIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJBbHRvZmFsYW50ZSIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIkxpw7FhIGRlIGVudHJhZGEiCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiQ0QiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAiTWlzdHVyYWRvciIKKworI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICJQQ00tMiIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAiR3JhdmFyIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAiR2FuYW5jaWEgZGUgZW50cmFkYSIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICJHYW5hbmNpYSBkZSBzYcOtZGEiCisKKyN+IG1zZ2lkICJMaW5lLTEiCisjfiBtc2dzdHIgIkxpw7FhIDEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIkxpw7FhIDIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIkxpw7FhIDMiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTEiCisjfiBtc2dzdHIgIkRpeGl0YWwgMSIKKworI34gbXNnaWQgIkRpZ2l0YWwtMiIKKyN+IG1zZ3N0ciAiRGl4aXRhbCAyIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICJEaXhpdGFsIDMiCisKKyN+IG1zZ2lkICJQaG9uZS1pbiIKKyN+IG1zZ3N0ciAiRW50cmFkYSB0ZWzDqWZvbm8iCisKKyN+IG1zZ2lkICJQaG9uZS1vdXQiCisjfiBtc2dzdHIgIlNhw61kYSB0ZWzDqWZvbm8iCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAiVsOtZGVvIgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgIlJhZGlvIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiIgorI34gIk5vbiBmb2kgcG9zw61iZWwgYWJyaXIgbyBkaXNwb3NpdGl2byBkZSBzb24gcGFyYSBhIHPDumEgeGVzdGnDs24gcG9sbyAiCisjfiAiY29udHJvbCBkZSBtaXN0dXJhZG8uIgorCisjfiBtc2dpZCAiIgorI34gIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4gVGhpcyB2ZXJzaW9uIG9mICIKKyN+ICJ0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiTm9uIGZvaSBwb3PDrWJlbCBhYnJpciBvIGRpc3Bvc2l0aXZvIGRlIHNvbiBwYXJhIGEgc8O6YSB4ZXN0acOzbiBwb2xvICIKKyN+ICJjb250cm9sIGRlIG1pc3R1cmFkby4gRXN0ZSBlbGVtZW50byBub24gYWRtaXRlIGVzdGEgdmVyc2nDs24gZG8gT3BlbiBTb3VuZCAiCisjfiAiU3lzdGVtLiIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAiTWVzdHJlIgorCisjfiBtc2dpZCAiRnJvbnQiCisjfiBtc2dzdHIgIkZyb250YWwiCisKKyN+IG1zZ2lkICJSZWFyIgorI34gbXNnc3RyICJUcmVzZWlybyIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkF1cmljdWxhcmVzIgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICJDZW50cm8iCisKKyN+IG1zZ2lkICJMRkUiCisjfiBtc2dzdHIgIkxGRSIKKworI34gbXNnaWQgIlN1cnJvdW5kIgorI34gbXNnc3RyICJFbnZvbHZlbnRlIgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAiTGF0ZXJhbCIKKworI34gbXNnaWQgIkFVWCBPdXQiCisjfiBtc2dzdHIgIlNhw61kYSBBVVgiCisKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAiUHJvZnVuZGlkYWRlIDNEIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICJDZW50cm8gM0QiCisKKyN+IG1zZ2lkICIzRCBFbmhhbmNlIgorI34gbXNnc3RyICJNZWxsb3JhIDNEIgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICJUZWzDqWZvbm8iCisKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAiRW50cmFkYSBkZSB2w61kZW8iCisKKyN+IG1zZ2lkICJBVVggSW4iCisjfiBtc2dzdHIgIkVudHJhZGEgQVVYIgorCisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIkdhbmFuY2lhIGRlIGdyYXZhY2nDs24iCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAiR2FuYW5jaWEgZGUgc2HDrWRhIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiQXVtZW50byBkbyBtaWNyw7Nmb25vIgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAiRGlhZ27Ds3N0aWNvIgorCisjfiBtc2dpZCAiQmFzcyBCb29zdCIKKyN+IG1zZ3N0ciAiQXVtZW50byBkZSBiYWl4b3MiCisKKyN+IG1zZ2lkICJQbGF5YmFjayBQb3J0cyIKKyN+IG1zZ3N0ciAiUG9ydG9zIGRlIHJlcHJvZHVjacOzbiIKKworI34gbXNnaWQgIklucHV0IgorI34gbXNnc3RyICJFbnRyYWRhIgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIk1vbml0b3IgZGUgb3JpeGUiCisKKyN+IG1zZ2lkICJLZXlib2FyZCBCZWVwIgorI34gbXNnc3RyICJQaXRpZG8gZGUgdGVjbGFkbyIKKworI34gbXNnaWQgIlNpbXVsYXRlIFN0ZXJlbyIKKyN+IG1zZ3N0ciAiU2ltdWxhciBlc3TDqXJlbyIKKworI34gbXNnaWQgIlN0ZXJlbyIKKyN+IG1zZ3N0ciAiRXN0w6lyZW8iCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAiU29uIGVudm9sdmVudGUiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIkdhbmFuY2lhIGRvIG1pY3LDs2Zvbm8iCisKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAiQWx0b2ZhbGFudGUgZGUgb3JpeGUiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTWljcsOzZm9ubyBkZSBvcml4ZSIKKworI34gbXNnaWQgIkphY2siCisjfiBtc2dzdHIgIkphY2siCisKKyN+IG1zZ2lkICJDZW50ZXIgLyBMRkUiCisjfiBtc2dzdHIgIkNlbnRybyAvIExGRSIKKworI34gbXNnaWQgIlN0ZXJlbyBNaXgiCisjfiBtc2dzdHIgIk1pc3R1cmFkb3IgZXN0w6lyZW8iCisKKyN+IG1zZ2lkICJNb25vIE1peCIKKyN+IG1zZ3N0ciAiTWlzdHVyYWRvciBtb25vIgorCisjfiBtc2dpZCAiSW5wdXQgTWl4IgorI34gbXNnc3RyICJNaXN0dXJhZG9yIGRlIGVudHJhZGEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDEiCisjfiBtc2dzdHIgIk1pY3LDs2Zvbm8gMSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiTWljcsOzZm9ubyAyIgorCisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIlNhw61kYSBkaXhpdGFsIgorCisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAiRW50cmFkYSBkaXhpdGFsIgorCisjfiBtc2dpZCAiSERNSSIKKyN+IG1zZ3N0ciAiSERNSSIKKworI34gbXNnaWQgIk1vZGVtIgorI34gbXNnc3RyICJNw7NkZW0iCisKKyN+IG1zZ2lkICJIYW5kc2V0IgorI34gbXNnc3RyICJBdXJpY3VsYXJlcyIKKworI34gbXNnaWQgIk90aGVyIgorI34gbXNnc3RyICJPdXRybyIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgIk5pbmfDum4iCisKKyN+IG1zZ2lkICJPbiIKKyN+IG1zZ3N0ciAiQWNlbmRpZG8iCisKKyN+IG1zZ2lkICJPZmYiCisjfiBtc2dzdHIgIkFwYWdhZG8iCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICJTaWxlbmNpYXIiCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICJSw6FwaWRvIgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgIk1vaSBiYWl4byIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAiQmFpeG8iCisKKyN+IG1zZ2lkICJNZWRpdW0iCisjfiBtc2dzdHIgIk1lZGlvIgorCisjfiBtc2dpZCAiSGlnaCIKKyN+IG1zZ3N0ciAiQWx0byIKKworI34gbXNnaWQgIlZlcnkgSGlnaCIKKyN+IG1zZ3N0ciAiTW9pIGFsdG8iCisKKyN+IG1zZ2lkICJQcm9kdWN0aW9uIgorI34gbXNnc3RyICJQcm9kdWNpw7NuIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTWljcm9waG9uZSIKKyN+IG1zZ3N0ciAiTWljcsOzZm9ubyBkbyBwYW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBJbiIKKyN+IG1zZ3N0ciAiRW50cmFkYSBkbyBwYW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiQXVyaWN1bGFyZXMgZG8gcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICJTYcOtZGEgZG8gcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIkdyZWVuIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0YWRvciB2ZXJkZSIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RhZG9yIHJvc2EiCisKKyN+IG1zZ2lkICJCbHVlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0YWRvciBhenVsIgorCisjfiBtc2dpZCAiV2hpdGUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RhZG9yIGJyYW5jbyIKKworI34gbXNnaWQgIkJsYWNrIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0YWRvciBuZWdybyIKKworI34gbXNnaWQgIkdyYXkgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RhZG9yIGdyaXMiCisKKyN+IG1zZ2lkICJPcmFuZ2UgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RhZG9yIGxhcmFueGEiCisKKyN+IG1zZ2lkICJSZWQgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RhZG9yIHZlcm1lbGxvIgorCisjfiBtc2dpZCAiWWVsbG93IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0YWRvciBhbWFyZWxvIgorCisjfiBtc2dpZCAiR3JlZW4gRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RhZG9yIHZlcmRlIGRvIHBhbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0YWRvciByb3NhIGRvIHBhbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJCbHVlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0YWRvciBhenVsIGRvIHBhbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJXaGl0ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdGFkb3IgYnJhbmNvIGRvIHBhbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJCbGFjayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdGFkb3IgbmVncm8gZG8gcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIkdyYXkgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RhZG9yIGdyaXMgZG8gcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIk9yYW5nZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdGFkb3IgbGFyYW54YWRvIHBhbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJSZWQgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RhZG9yIHZlcm1lbGxvIGRvIHBhbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJZZWxsb3cgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RhZG9yIGFtYXJlbG8gZG8gcGFuZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIlNwcmVhZCBPdXRwdXQiCisjfiBtc2dzdHIgIkV4cGFuZGlyIHNhw61kYSIKKworI34gbXNnaWQgIkRvd25taXgiCisjfiBtc2dzdHIgIlJlZHVjacOzbiBkZSBjYW5sZXMiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIElucHV0IgorI34gbXNnc3RyICJFbnRyYWRhIGRvIG1pc3R1cmFkb3IgdmlydHVhbCIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgT3V0cHV0IgorI34gbXNnc3RyICJTYcOtZGEgZG8gbWlzdHVyYWRvciB2aXJ0dWFsIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBDaGFubmVscyIKKyN+IG1zZ3N0ciAiQ2FubGVzIGRvIG1pc3R1cmFkb3IgdmlydHVhbCIKKworI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICJGdW5jacOzbiAlcyAlZCIKKworI34gbXNnaWQgIiVzIEZ1bmN0aW9uIgorI34gbXNnc3RyICJGdW5jacOzbiAlcyIKKworI34gbXNnaWQgIkdvdCB1bmV4cGVjdGVkIGZyYW1lIHNpemUgb2YgJXUgaW5zdGVhZCBvZiAldS4iCisjfiBtc2dzdHIgIk9idMOtdm9zZSB1biB0YW1hw7FvIGRlIG1hcmNvIGRlICV1IG5vbiBlc3BlcmFkbyBubyBsdWdhciBkZSAldS4iCisKKyN+IG1zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIG9uIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiUHJvZHVjaXVzZSB1biBlcnJvIGFvIGxlciAlZCBieXRlcyBkbyBkaXNwb3NpdGl2byDCqyVzwrsuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIk5vbiDDqSBwb3PDrWJlbCBtZXRlciBuYSBjb2xhIG9zIGLDumZlcmVzIG5vIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIiIKKyN+ICJQcm9kdWNpdXNlIHVuIGZhbGxvIGFvIHRlbnRhciBvYnRlciBjYWRyb3MgZGUgdsOtZGVvIGRvIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyN+IG1zZ2lkICJGYWlsZWQgYWZ0ZXIgJWQgdHJpZXMuIGRldmljZSAlcy4gc3lzdGVtIGVycm9yOiAlcyIKKyN+IG1zZ3N0ciAiIgorI34gIlByb3VjaXVzZSB1biBmYWxsbyBkZXNwb2lzIGRlICVkIGludGVudG9zLiBEaXNwb3NpdGl2byAlcy4gRXJyb3IgZG8gIgorI34gInNpc3RlbWE6ICVzIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBpbnB1dCBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiRGVzY3JpYmUgbyBlbGVtZW50byBkZSBlbnRyYWRhIHNlbGVjY2lvbmFkby4iCisKKyN+IG1zZ2lkICJEZXNjcmliZXMgdGhlIHNlbGVjdGVkIG91dHB1dCBlbGVtZW50IGZvciBBdWRpby9WaWRlbyBDb25mZXJlbmNpbmcuIgorI34gbXNnc3RyICIiCisjfiAiRGVzY3JpYmUgbyBlbGVtZW50byBkZSBzYcOtZGEgc2VsZWNjaW9uYWRvIHBhcmEgYSBDb25mZXJlbmNpYSBkZSBBdWRpby8iCisjfiAiVsOtZGVvLiIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgb3V0cHV0IGVsZW1lbnQgZm9yIE11c2ljIGFuZCBNb3ZpZXMuIgorI34gbXNnc3RyICIiCisjfiAiRGVzY3JpYmUgbyBlbGVtZW50byBkZSBzYcOtZGEgc2VsZWNjaW9uYWRvIHBhcmEgYSBNw7pzaWNhIGUgUGVsw61jdWxhcy4iCisKKyN+IG1zZ2lkICJEZXNjcmliZXMgdGhlIHNlbGVjdGVkIG91dHB1dCBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiRGVzY3JpYmUgbyBlbGVtZW50byBkZSBzYcOtZGEgc2VsZWNjaW9uYWRvLiIKKworI34gbXNnaWQgIkdTdHJlYW1lciBhdWRpb3NpbmsgZm9yIEF1ZGlvL1ZpZGVvIENvbmZlcmVuY2luZyIKKyN+IG1zZ3N0ciAiR1N0cmVhbWVyIGF1ZGlvc2luayBwYXJhIGEgQ29uZmVyZW5jaWEgZGUgQXVkaW8vVmlkZW8iCisKKyN+IG1zZ2lkICJHU3RyZWFtZXIgYXVkaW9zaW5rIGZvciBNdXNpYyBhbmQgTW92aWVzIgorI34gbXNnc3RyICJHU3RyZWFtZXIgYXVkaW9zaW5rIHBhcmEgTcO6c2ljYSBlIEZpbG1lcyIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHBsYXkgYXVkaW8gdXNpbmcgYW55IG51bWJlciBvZiBvdXRwdXQgZWxlbWVudHMuIFNvbWUgIgorI34gInBvc3NpYmxlIGNob2ljZXMgYXJlIG9zc3NpbmssIGVzZHNpbmsgYW5kIGFsc2FzaW5rLiBUaGUgYXVkaW9zaW5rIGNhbiBiZSAiCisjfiAiYSBwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJHU3RyZWFtZXIgcG9kZSByZXByb2R1Y2lyIGF1ZGlvIGVtcHJlZ2FuZG8gY2FscXVlcmEgbsO6bWVybyBkZSBlbGVtZW50b3MgIgorI34gImRlIHNhw61kYS4gQWxndW5oYSBlbGVjY2nDs24gcG9zw61iZWwgw6kgb3NzaW5rLCBlc2RzaW5rIGUgYWxzYXNpbmsuIE8gIgorI34gImF1ZGlvc2luayBwb2RlIHNlciB1biBwaXBlbGluZSBwYXJjaWFsIG5vIGNhbmRvIGRlIHPDsyB1biBlbGVtZW50byDDum5pY28uIgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcGxheSB2aWRlbyB1c2luZyBhbnkgbnVtYmVyIG9mIG91dHB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgeHZpbWFnZXNpbmssIHhpbWFnZXNpbmssIHNkbHZpZGVvc2luayBhbmQgYWFzaW5rLiAiCisjfiAiVGhlIHZpZGVvc2luayBjYW4gYmUgYSBwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJHU3RyZWFtZXIgcG9kZSByZXByb2R1Y2lyIHbDrWRlbyB1c2FuZG8gY2FscXVlcmEgbsO6bWVybyBkZSBlbGVtZW50b3MgZGUgIgorI34gInNhw61kYS4gQXMgcG9zw61iZWlzIGVsZWNjacOzbnMgc29uIHh2aW1hZ2VzaW5rLCB4aW1hZ2VzaW5rLCBzZGx2aWRlb3NpbmsgZSAiCisjfiAiYWFzaW5rLiBPIHZpZGVvc2luayBwb2RlIHNlciB1biBwaXBlbGluZSBwYXJjaWFsIG5vIGx1Z2FyIGRlIHVuIGVsZW1lbnRvICIKKyN+ICLDum5pY28uIgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcHV0IHZpc3VhbGl6YXRpb24gcGx1Z2lucyBpbiBhIHBpcGVsaW5lIHRvIHRyYW5zZm9ybSBhdWRpbyAiCisjfiAic3RyZWFtIGluIHZpZGVvIGZyYW1lcy4gRGVmYXVsdCBpcyBnb29tIGJ1dCBtb3JlIHZpc3VhbGl6YXRpb24gcGx1Z2lucyAiCisjfiAid2lsbCBiZSBwb3J0ZWQgc29vbi4gVGhlIHZpc3VhbGl6YXRpb24gcGx1Z2luIGNhbiBiZSBhIHBhcnRpYWwgcGlwZWxpbmUgIgorI34gImluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJHU3RyZWFtZXIgcG9kZSBwb8OxZXIgZW5nYWRpZG9zIGRlIHZpc3VhbGl6YWNpw7NuIG51biBwaXBlbGluZSBwYXJhICIKKyN+ICJ0cmFuc2Zvcm1hciB1biBmbHV4byBkZSBhdWRpbyBlbiBtYXJjb3MgZGUgdsOtZGVvLiBQb3Igb21pc2nDs24gw6kgZ29vbSBwZXJvICIKKyN+ICJwcm9udG8gY29udmVydGlyw6Fuc2UgbcOhaXMgdmlzdWFsaXphY2nDs25zLiBPIGVuZ2FkaWRvIGRlIHZpc3VhbGl6YWNpw7NuICIKKyN+ICJwb2RlIHNlciB1biBwaXBlbGluZSBwYXJjaWFsIG5vIGx1Z2FyIGRlIHPDsyB1biBlbGVtZW50by4iCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiByZWNvcmQgYXVkaW8gdXNpbmcgYW55IG51bWJlciBvZiBpbnB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgb3Nzc3JjLCBlc2RzcmMgYW5kIGFsc2FzcmMuIFRoZSBhdWRpbyBzb3VyY2UgY2FuIGJlICIKKyN+ICJhIHBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkdTdHJlYW1lciBwb2RlIGdyYXZhciBhdWRpbyB1c2FuZG8gY2FscXVlcmEgbsO6bWVybyBkZSBlbGVtZW50b3MgZGUgIgorI34gImVudHJhZGEuIEFsZ3VuaGFzIGRhcyBwb3PDrWJlaXMgZWxlY2Npw7NucyBzb24gb3Nzc3JjLCBlc2RzcmMgZSBhbHNhc3JjLiBBICIKKyN+ICJvcml4ZSBkbyBhdWRpbyBwb2RlIHNlciB1biBwaXBlbGluZSBwYXJjaWFsIG5vIGx1Z2FyIGRlIHVuIHPDsyBlbGVtZW50by4iCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiByZWNvcmQgdmlkZW8gZnJvbSBhbnkgbnVtYmVyIG9mIGlucHV0IGVsZW1lbnRzLiBTb21lICIKKyN+ICJwb3NzaWJsZSBjaG9pY2VzIGFyZSB2NGxzcmMgYW5kIHZpZGVvdGVzdHNyYy4gVGhlIHZpZGVvIHNvdXJjZSBjYW4gYmUgYSAiCisjfiAicGFydGlhbCBwaXBlbGluZSBpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiR1N0cmVhbWVyIHBvZGUgZ3JhdmFyIGF1ZGlvIHVzYW5kbyBjYWxxdWVyYSBuw7ptZXJvIGRlIGVsZW1lbnRvcyBkZSAiCisjfiAiZW50cmFkYS4gQWxndW5oYXMgZGFzIHBvc8OtYmVpcyBlbGVjY2nDs25zIHNvbiB2NGxzcmMgZSB2aWRlb3Rlc3RzcmMuIEEgIgorI34gIm9yaXhlIGRvIGF1ZGlvIHBvZGUgc2VyIHVuIHBpcGVsaW5lIHBhcmNpYWwgbm8gbHVnYXIgZGUgdW4gc8OzIGVsZW1lbnRvLiIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIGF1ZGlvIHNvdXJjZSIKKyN+IG1zZ3N0ciAib3JpeGUgZGUgc29uIGRlIEdTdHJlYW1lciBwcmVkZWZpbmlkYSIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIGF1ZGlvc2luayIKKyN+IG1zZ3N0ciAib3JpeGUgZG8gYXVkaW9zaW5rIEdTdHJlYW1lciBwcmVkZWZpbmlkYSIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIHZpZGVvIHNvdXJjZSIKKyN+IG1zZ3N0ciAib3JpeGUgZG8gdsOtZGVvIGRlIEdTdHJlYW1lciBwcmVkZWZpbmlkbyIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIHZpZGVvc2luayIKKyN+IG1zZ3N0ciAidmlkZW9zaW5rIGRlIEdTdHJlYW1lciBwcmVkZWZpbmlkbyIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIHZpc3VhbGl6YXRpb24gcGx1Z2luIgorI34gbXNnc3RyICJlbmdhZGlkbyBkZSB2aXN1YWxpemFjacOzbiBHU3RyZWFtZXIgcHJlZGVmaW5pZG8iCisKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgR1N0cmVhbWVyIGF1ZGlvc2luayBmb3IgQXVkaW8vVmlkZW8gQ29uZmVyZW5jaW5nIgorI34gbXNnc3RyICIiCisjfiAiZGVzY3JpY2nDs24gcGFyYSBvIGF1ZGlvc2luayBHU3RyZWFtZXIgcGFyYSBhIGNvbmZlcmVuY2lhIGRlIGF1ZGlvL3bDrWRlbyIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBHU3RyZWFtZXIgYXVkaW9zaW5rIGZvciBNdXNpYyBhbmQgTW92aWVzIgorI34gbXNnc3RyICJkZXNjcmljacOzbiBwYXJhIG8gYXVkaW9zaW5rIGRlIEdTdHJlYW1lciBwYXJhIE3DunNpY2EgZSBGaWxtZXMiCisKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW9zaW5rIgorI34gbXNnc3RyICJkZXNjcmljacOzbiBwYXJhIG8gYXVkaW9zaW5rIGRlIEdTdHJlYW1lciBwcmVkZWZpbmlkbyIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBkZWZhdWx0IEdTdHJlYW1lciBhdWRpb3NyYyIKKyN+IG1zZ3N0ciAiZGVzY3JpY2nDs24gcGFyYSBvIGF1ZGlvc3JjIGRlIEdTdHJlYW1lciBwcmVkZWZpbmlkbyIKZGlmZiAtLWdpdCBhL3BvL2hyLnBvIGIvcG8vaHIucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4N2MxNwotLS0gL2Rldi9udWxsCisrKyBiL3BvL2hyLnBvCkBAIC0wLDAgKzEsNzg2IEBACisjIFRyYW5zbGF0aW9uIG9mIGdzdC1wbHVnaW5zLWdvb2QgdG8gQ3JvYXRpYW4uCisjIFRoaXMgZmlsZSBpcyBwdXQgaW4gdGhlIHB1YmxpYyBkb21haW4uCisjCisjIFRvbWlzbGF2IEtyem5hciA8dG9taXNsYXYua3J6bmFyQGdtYWlsLmNvbT4sIDIwMTIuCisjIEJvxb5pZGFyIFB1dGFuZWMgPGJvemlkYXJwQHlhaG9vLmNvbT4sIDIwMTYuCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kLTEuMTAuMFxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDE2LTExLTE5IDEwOjIyLTA4MDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEJvxb5pZGFyIFB1dGFuZWMgPGJvemlkYXJwQHlhaG9vLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBDcm9hdGlhbiA8bG9rYWxpemFjaWphQGxpbnV4LmhyPlxuIgorIkxhbmd1YWdlOiBoclxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlgtQnVnczogUmVwb3J0IHRyYW5zbGF0aW9uIGVycm9ycyB0byB0aGUgTGFuZ3VhZ2UtVGVhbSBhZGRyZXNzLlxuIgorIlBsdXJhbC1Gb3JtczogbnBsdXJhbHM9MzsgcGx1cmFsPShuJTEwPT0xICYmIG4lMTAwIT0xMSA/IDAgOiBuJTEwPj0yICYmIG4iCisiJTEwPD00ICYmIChuJTEwMDwxMCB8fCBuJTEwMD49MjApID8gMSA6IDIpO1xuIgorIlgtR2VuZXJhdG9yOiBQb2VkaXQgMS44LjcuMVxuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICLigJhKYWNr4oCZIHBvc2x1xb5pdGVsaiBuaWplIHByb25hxJFlbiIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiTmlqZSB1c3BqZWxvIGRla29kaXJhdGkgSlBFRyBzbGlrdSIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAi4oCYJXPigJkgKOKAmCVz4oCZKSIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiU3BhamFuamUgbmEgcG9zbHXFvml0ZWxqIG5pamUgbW9ndcSHZSIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJVUkwgYWRyZXNhIG5pamUgaW1lbm92YW5hLiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiTmlqZSBtb2d1xIdlIHJhenJpamXFoWl0aSBpbWUgcG9zbHXFvml0ZWxqYS4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiTmlqZSBtb2d1xIdlIHVzcG9zdGF2aXRpIHZlenUgcyBwb3NsdcW+aXRlbGplbS4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICJVc3Bvc3RhdmxqYW5qZSBzaWd1cm5lIHZlemUgbmlqZSB1c3BqZWxvLiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIiIKKyJEb2dvZGlsYSBzZSBtcmXFvm5hIGdyZcWha2EsIGlsaSBqZSBwb3NsdcW+aXRlbGogbmVvxI1la2l2YW5vIHphdHZvcmlvIHZlenUuIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICJQb3NsdcW+aXRlbGogamUgcG9zbGFvIG5laXNwcmF2bmUgcG9kYXRrZS4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiUG9zbHXFvml0ZWxqIG5lIHBvZHLFvmF2YSB0cmHFvmVuamUuIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICJOZW1hIGF1ZGlvIHVsYXphIGlsaSBqZSBuZWlzcHJhdmFuLCBBVkkgc3RyZWFtIMSHZSBiaXRpIGlza3ZhcmVuLiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAiT3ZhIGRhdG90ZWthIG5lIHNhZHLFvmkgbmlqZWRhbiB1cG90cmVibGppdmkgc3RyZWFtICh0b2sgcG9kYXRha2EpLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRGF0b3Rla2EgamUgbmVpc3ByYXZuYSBpIG5lIG1vxb5lIHNlIHJlcHJvZHVjaXJhdGkuIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKyJPdmFqIHN0cmVhbSBuaWplIG1vZ3XEh2UgcmVwcm9kdWNpcmF0aSBqZXIgamUga3JpcHRpcmFuIHMgUGxheVJlYWR5IERSTS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkRhdG90ZWthIGplIGlza3ZhcmVuYSBpIG5lIG1vxb5lIHNlIHJlcHJvZHVjaXJhdGkuIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICJWZWxpxI1pbmEgYXRvbWEgamUgbmVpc3ByYXZuYS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkRhdG90ZWthIGplIG5lcG90cHVuYSBpIG5lIG1vxb5lIHNlIHJlcHJvZHVjaXJhdGkuIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICJWaWRlbyBpeiBvdmUgZGF0b3Rla2Ugc2UgbW/FvmRhIG5lxIdlIGlzcHJhdm5vIHJlcHJvZHVjaXJhdGkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIiIKKyJVIG92b2ogZGF0b3RlY2kgaW1hIHByZXZpxaFlIHN0cmVhbW92YSAoc3RyZWFtcykuIFNhbW8gcHJ2aWggJWQgxIdlIHNlICIKKyJyZXByb2R1Y2lyYXRpIgorCisjIGh0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kb2N1bWVudGF0aW9uL3J0cC5odG1sCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJOaWplZGFuIHBvZHLFvmFuaSBzdHJlYW0gbmlqZSBuYcSRZW4uIE1vxb5kYSDEh2V0ZSBtb3JhdGkgaW5zdGFsaXJhdGkgR1N0cmVhbWVyICIKKyJSVFNQIGRvZGF0bmkgcGx1Z2luIHphIFJlYWwgbWVkaWpza2Ugc3RyZWFtb3ZlLiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorIk5pamVkYW4gcG9kcsW+YW5pIHN0cmVhbSBuaWplIG5hxJFlbi4gTW/FvmRhIMSHZXRlIG1vcmF0aSBkb3B1c3RpdGkgdmnFoWUgIgorInByaWplbm9zbmloIHByb3Rva29sYSBpbGkgbW/FvmRhIHZhbSBuZWRvc3RhamUgb2Rnb3ZhcmFqdcSHaSBHU3RyZWFtZXIgUlRTUCAiCisiZG9kYXRuaSBwbHVnaW4uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIkF1ZGlvdXJlxJFhaiBuaWplIG1vZ3XEh2Ugb3R2b3JpdGkgemEgcmVwcm9kdWtjaWp1LiBVcmXEkWFqIHRyZW51dGHEjW5vIGtvcmlzdGkgIgorIm5la2EgZHJ1Z2EgYXBsaWthY2lqYS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIkF1ZGlvdXJlxJFhaiBuaWplIG1vZ3XEh2Ugb3R2b3JpdGkgemEgcmVwcm9kdWtjaWp1LiBOZW1hdGUgZG9wdcWhdGVuamUgemEgIgorIm90dmFyYW5qZSB1cmXEkWFqYS4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiQXVkaW91cmXEkWFqIG5pamUgbW9ndcSHZSBvdHZvcml0aSB6YSByZXByb2R1a2NpanUuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIkF1ZGlvdXJlxJFhaiBuaWplIG1vZ3XEh2Ugb3R2b3JpdGkgemEgcmVwcm9kdWtjaWp1LiBPdmFqIGVsZW1lbnQgbmUgcG9kcsW+YXZhICIKKyJvdnUgaW5hxI1pY3UgT3BlbiBTb3VuZCBTeXN0ZW0uIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIk92YWogYXVkaW91cmXEkWFqIG5lIHBvZHLFvmF2YSByZXByb2R1a2NpanUuIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICJHcmXFoWthIHUgYXVkaW8gcmVwcm9kdWtjaWppLiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiT3ZhaiBhdWRpb3VyZcSRYWogbmUgcG9kcsW+YXZhIHNuaW1hbmplLiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkdyZcWha2Egc25pbWFuamEgcyBhdWRpb3VyZcSRYWphLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIkF1ZGlvdXJlxJFhaiBuaWplIG1vZ3XEh2Ugb3R2b3JpdGkgemEgc25pbWFuamUuIE5lbWF0ZSBkb3B1xaF0ZW5qZSB6YSBvdHZhcmFuamUgIgorInVyZcSRYWphLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiQXVkaW91cmXEkWFqIG5pamUgbW9ndcSHZSBvdHZvcml0aSB6YSBzbmltYW5qZS4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiQ29yZUF1ZGlvIHVyZcSRYWogbmlqZSBwcm9uYcSRZW4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIkNvcmVBdWRpbyB1cmXEkWFqIG5pamUgbW9ndcSHZSBvdHZvcml0aSIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIkl6dm9yIHNuaW1hbmphIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWlrcm9mb24iCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJMaW5panNraSB1bGF6IgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIkludGVybmkgQ0QiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiU1BESUYgdWxheiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJBVVggMSB1bGF6IgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIkFVWCAyIHVsYXoiCisKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiS29kZWstcG92cmF0bmEgcGV0bGphIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJTdW5WVFMtcG92cmF0bmEgcGV0bGphIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJHbGFzbm/Eh2EiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJQb2phxI1hbmplIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiTmFkem9yIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiVWdyYcSRZW5pIHp2dcSNbmlrIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICJTbHXFoWFsaWNhIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIkxpbmlqc2tpIGl6bGF6IgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJTUERJRiBpemxheiIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiQVVYIDEgaXpsYXoiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIkFVWCAyIGl6bGF6IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkdyZcWha2EgxI1pdGFuamEgJWQgYmFqdG92YSBzIHVyZcSRYWphIOKAmCVz4oCZLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorIk5pamUgdXNwamVsbyBuYWJyb2phdGkgc3ZlIG1vZ3XEh2UgdmlkZW8gZm9ybWF0ZSBzIGtvamltYSB1cmXEkWFqIOKAmCVz4oCZIG1vxb5lICIKKyJyYWRpdGkiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIk5pamUgbW9ndcSHZSBwcmVzbGlrYXRpIChtYXApIG1lxJF1c3ByZW1uaWtlIGl6IHVyZcSRYWphIOKAmCVz4oCZIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICJVcHJhdmxqYcSNa2kgcHJvZ3JhbSB1cmXEkWFqYSDigJglc+KAmSBuZSBwb2Ryxb5hdmEgSU8gbWV0b2R1ICVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiIgorIlVwcmF2bGphxI1raSBwcm9ncmFtIHVyZcSRYWphIOKAmCVz4oCZIG5lIHBvZHLFvmF2YSBuaWplZG51IHBvem5hdHUgSU8gbWV0b2R1LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJVcmXEkWFqIOKAmCVz4oCZIGplIHphdXpldCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiVXJlxJFhaiDigJglc+KAmSBuZSBtb8W+ZSBzbmltYXRpIHMgcmF6bHXEjWl2b3N0aSBvZCAlZHglZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiVXJlxJFhaiDigJglc+KAmSBuZSBtb8W+ZSBzbmltYXRpIHUgc3BlY2lmaWNpcmFub20gZm9ybWF0dS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiRGV2aWNlIOKAmCVz4oCZIG5lIHBvZHLFvmF2YSBwcmVraW51dGUgcmF2bmluZSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIlBhcmFtZXRyZSB1cmXEkWFqYSDigJglc+KAmSBuaWplIG1vZ3XEh2UgZG9iaXRpIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICJWaWRlb3VyZcSRYWogbmlqZSBwcmlodmF0aW8gbm92dSBmcmVrdmVuY2lqdSBzbGlrYSAoaWxpIHBvbHVzbGlrYSkuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiVmlkZW91cmXEkWFqIG5pamUgcHJlZG/EjWlvIGl6bGF6bmkgZm9ybWF0LiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICJWaWRlb3VyZcSRYWogamUgdXp2cmF0aW8gcyBuZWlzcHJhdm5pbSBkaW1lbnppamFtYS4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiIgorIlZpZGVvdXJlxJFhaiBrb3Jpc3RpIG5lcG9kcsW+YW51IG1ldG9kdSBwb2x1c2xpa2EgKHByb3JlZCBpIGZyZWt2ZW5jaWp1KS4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiVmlkZW91cmXEkWFqIGtvcmlzdGkgbmVwb2Ryxb5hbmkgZm9ybWF0IHBpa3NlbGEuIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIk5pamUgdXNwamVsbyBrb25maWd1cmlyYXRpIGludGVybnUgemFsaWh1IG1lxJF1c3ByZW1uaWthLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiVmlkZW91cmXEkWFqIG5pamUgcHJlZGxvxb5pbyBuaWplZG51IHZlbGnEjWludSBtZcSRdXNwcmVtbmlrYS4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICJOZW1hIHNlIG9kIG5pa3VkYSB1dmVzdGkg4oCYZG93bnN0cmVhbeKAmSB6YWxpaGEuIgorCisjIHR1bmVyID4gxaF0ZWxhbmplIGZyZWt2ZW5jaWplLCBtaWplbmphbmplIChiaXJhbmplKSBrYW5hbGEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5pamUgdXNwamVsbyBkb2JpdGkgcG9zdGF2a2UgdHVuZXJhICVkIG5hIHVyZcSRYWog4oCYJXPigJkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkdyZcWha2EgcHJpIGRvYml2YW5qdSBwb2RhdGFrYSBvIG1vZ3XEh25vc3RpbWEgdXJlxJFhamEg4oCYJXPigJkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiVXJlxJFhaiDigJglc+KAmSBuaWplIHR1bmVyLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIk5pamUgdXNwamVsbyBkb2JpdGkgcmFkaWpza2kgdWxheiBuYSB1cmXEkWFqdSDigJglc+KAmS4gIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiTmlqZSB1c3BqZWxvIHBvc3Rhdml0aSB1bGF6ICVkIG5hIHVyZcSRYWogJXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJOaWplIHVzcGplbG8gcHJvbWlqZW5pdGkgc3RhdHVzIG11dGUgKFp2w7trIChkYS9uZSkgemEgdXJlxJFhaiDigJglc+KAmS4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIk5pamUgdXNwamVsbyBpemR2b2ppdGkgcG90cmVibnUgbWVtb3JpanUuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIk5pamUgdXNwamVsbyBkb2RpamVsaXRpIHBvdHJlYm51IG1lbW9yaWp1LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJLb252ZXJ0ZXIgbmEgdXJlxJFhanUgJXMgbmVtYSBwb2Ryxb5hbmkgdWxhem5pIGZvcm1hdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiS29udmVydGVyIG5hIHVyZcSRYWp1ICVzIG5lbWEgcG9kcsW+YW5pIGl6bGF6bmkgZm9ybWF0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJLb2RlciBuYSB1cmXEkWFqdSAlcyBuZW1hIHBvZHLFvmFuaSB1bGF6bmkgZm9ybWF0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiS29kZXIgbmEgdXJlxJFhanUgJXMgbmVtYSBwb2Ryxb5hbmkgaXpsYXpuaSBmb3JtYXQiCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiTmlqZSB1c3BqZWxvIHphcG/EjWV0aSBkZWtvZGlyYW5qZSBuaXRpICh0aHJlYWQpLiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiTmlqZSB1c3BqZWxvIG9icmFkaXRpIHNsaWt1IChwb2x1c2xpa3UpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJHcmXFoWthIHByaSBkb2JpdmFuamEgbW9ndcSHbm9zdGkgemEgdXJlxJFhaiDigJglc+KAmTogVG8gbmlqZSB2NGwyIHVwcmF2bGphxI1raSAiCisicHJvZ3JhbS4gUHJvdmplcml0ZSBkYSBsaSBqZSB2NGwxIHVwcmF2bGphxI1raSBwcm9ncmFtLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIk5pamUgdXNwamVsbyBpc3BpdGF0aSBzdm9qc3R2YSB1bGF6YSAlZCB1cmXEkWFqYSAlcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOaWplIHVzcGplbG8gZG9iaXRpIHBvc3RhdmtlIHR1bmVyYSAlZCB1cmXEkWFqYSDigJglc+KAmS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOaWplIHVzcGplbG8gaXNwaXRhdGkgbm9ybXUgKHN0YW5kYXJkKSBuYSB1cmXEkWFqdSDigJglc+KAmS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5pamUgdXNwamVsbyBkb2JpdGkgdXByYXZsamHEjWthIHN2b2pzdHZhIHVyZcSRYWphIOKAmCVz4oCZLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJOZSBtb8W+ZSBzZSBpZGVudGlmaWNpcmF0aSB1cmXEkWFqIOKAmCVz4oCZLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJPdm8gbmlqZSB1cmXEkWFqIOKAmCVz4oCZLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIlVyZcSRYWog4oCYJXPigJluaWplIG1vZ3XEh2Ugb3R2b3JpdGkgemEgxI1pdGFuamUgaSBwaXNhbmplLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIlVyZcSRYWog4oCYJXPigJkgbmlqZSB1cmXEkWFqIHphIHNuaW1hbmplLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiVXJlxJFhaiDigJglc+KAmSBuaWplIGl6bGF6bmkgdXJlxJFhai4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIlVyZcSRYWog4oCYJXPigJkgbmlqZSBNMk0gdXJlxJFhai4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIlVyZcSRYWog4oCYJXPigJluaWplIG1vZ3XEh2UgZHVwbGljaXJhdGkgemEgxI1pdGFuamUgaSBwaXNhbmplLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmlqZSB1c3BqZWxvIHBvc3Rhdml0aSBub3JtdSAoc3RhbmRhcmQpIHphIHVyZcSRYWog4oCYJXPigJkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmlqZSB1c3BqZWxvIGRvYml0aSB0cmVudXRhxI1udSBmcmVrdmVuY2lqdSB0dW5lcmEgemEgdXJlxJFhaiDigJglc+KAmS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorIk5pamUgdXNwamVsbyBwb3N0YXZpdGkgdHJlbnV0YcSNbnUgZnJla3ZlbmNpanUgdHVuZXJhIHphIHVyZcSRYWog4oCYJXPigJkgbmEgJWx1ICIKKyJIei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmlqZSB1c3BqZWxvIGRvYml0aSBzbmFndSBzaWduYWxhIHphIHVyZcSRYWog4oCYJXPigJkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOaWplIHVzcGplbG8gZG9iaXRpIHZyaWplZG5vc3QgemEga29udHJvbHUgJWQgbmEgdXJlxJFhanUg4oCYJXPigJkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOaWplIHVzcGplbG8gcG9zdGF2aXRpIHZyaWplZG5vc3QgJWQgemEga29udHJvbHUgJWQgbmEgdXJlxJFhanUg4oCYJXPigJkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiTmlqZSB1c3BqZWxvIGRvYml0aSB0cmVudXRhxI1uaSB1bGF6IG5hIHVyZcSRYWp1IOKAmCVz4oCZLiBNb8W+ZGEgamUgdG8gcmFkaW91cmXEkWFqIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJOaWplIHVzcGplbG8gZG9iaXRpIHRyZW51dGHEjW5pIGl6bGF6IG5hIHVyZcSRYWp1IOKAmCVz4oCZLiBNb8W+ZGEgamUgdG8gcmFkaW91cmXEkWFqIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIk5pamUgdXNwamVsbyBwb3N0YXZpdGkgaXpsYXogJWQgbmEgdXJlxJFhaiAlcy4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICJQcm9tamVuYSByZXpvbHVjaWplIHUgdGlqZWt1IHJhZGEgKHJ1bnRpbWUpIGpvxaEgbmlqZSBwb2Ryxb5hbmEuIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJOZSBtb2d1IHJhZGl0aSBiZXogdGFrdGEgKHNhdGEpIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICJJbnRlcm5hIGdyZcWha2EgdG9rYSAoc3RyZWFtKSBwb2RhdGFrYS4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJJbnRlcm5hIGdyZcWha2EgcHJvdG9rYSBwb2RhdGFrYS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc291bmQgc2VydmVyIgorI34gbXNnc3RyICJOZSBtb2d1IG9zdHZhcml0aSB2ZXp1IHByZW1hIHBvc2x1xb5pdGVsanUgenZ1a2EiCisKKyN+IG1zZ2lkICJGYWlsZWQgdG8gcXVlcnkgc291bmQgc2VydmVyIGNhcGFiaWxpdGllcyIKKyN+IG1zZ3N0ciAiTmlzYW0gdXNwaW8gaXNwaXRhdGkgbW9ndcSHbm9zdGkgcG9zbHXFvml0ZWxqYSB6dnVrYSIKKworI34gbXNnaWQgIkJhc3MiCisjfiBtc2dzdHIgIk5pc2tpIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICJWaXNva2kiCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAiU2ludGV0aXphdG9yIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJadnXEjW5payIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIlVsYXpuYSBsaW5pamEiCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiQ0QiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAiTWlrc2VyIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICJTbmltYW5qZSIKKworI34gbXNnaWQgIkluLWdhaW4iCisjfiBtc2dzdHIgIlVsYXpubyBwb2phxI1hbmplIgorCisjfiBtc2dpZCAiT3V0LWdhaW4iCisjfiBtc2dzdHIgIkl6bGF6bm8gcG9qYcSNYW5qZSIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAiTGluaWphIDEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIkxpbmlqYSAyIgorCisjfiBtc2dpZCAiTGluZS0zIgorI34gbXNnc3RyICJMaW5pamEgMyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAiRGlnaXRhbG5pIDEiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgIkRpZ2l0YWxuaSAyIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICJEaWdpdGFsbmkgMyIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICJUZWxlZm9uc2tpIHVsYXoiCisKKyN+IG1zZ2lkICJQaG9uZS1vdXQiCisjfiBtc2dzdHIgIlRlbGVmb25za2kgaXpsYXoiCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAiVmlkZW8iCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAiUmFkaW8iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIgorI34gbXNnc3RyICJOZSBtb2d1IG90dm9yaXRpIHp2dcSNbmkgdXJlxJFhaiB6YSB1cHJhdmxqYW5qZSBtaWtzZXJvbS4iCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJOZSBtb2d1IG90dm9yaXRpIHp2dcSNbmkgdXJlxJFhaiB6YSB1cHJhdmxqYW5qZSBtaWtzZXJvbS4gT3ZhaiBlbGVtZW50IG5lICIKKyN+ICJwb2Ryxb5hdmEgb3Z1IGluYcSNaWN1IE9wZW4gU291bmQgU3lzdGVtIHN1c3RhdmEuIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICJHbGF2bmkiCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAiUHJlZG5qaSIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIlN0cmHFvm5qaSIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIlNsdcWhYWxpY2UiCisKKyN+IG1zZ2lkICJDZW50ZXIiCisjfiBtc2dzdHIgIlNyZWRuamkiCisKKyN+IG1zZ2lkICJMRkUiCisjfiBtc2dzdHIgIkxGRSIKKworI34gbXNnaWQgIlN1cnJvdW5kIgorI34gbXNnc3RyICJTdXJyb3VuZCIKKworI34gbXNnaWQgIlNpZGUiCisjfiBtc2dzdHIgIkJvxI1uaSIKKworI34gbXNnaWQgIkFVWCBPdXQiCisjfiBtc2dzdHIgIkFVWCBpemxheiIKKworI34gbXNnaWQgIjNEIERlcHRoIgorI34gbXNnc3RyICIzRCBkdWJpbmEiCisKKyN+IG1zZ2lkICIzRCBDZW50ZXIiCisjfiBtc2dzdHIgIjNEIHNyZWRpxaF0ZSIKKworI34gbXNnaWQgIjNEIEVuaGFuY2UiCisjfiBtc2dzdHIgIjNEIGRvcHVuYSIKKworI34gbXNnaWQgIlRlbGVwaG9uZSIKKyN+IG1zZ3N0ciAiVGVsZWZvbiIKKworI34gbXNnaWQgIlZpZGVvIEluIgorI34gbXNnc3RyICJWaWRlbyB1bGF6IgorCisjfiBtc2dpZCAiQVVYIEluIgorI34gbXNnc3RyICJBVVggdWxheiIKKworI34gbXNnaWQgIlJlY29yZCBHYWluIgorI34gbXNnc3RyICJQb2phxI1hbmplIHNuaW1hbmphIgorCisjfiBtc2dpZCAiT3V0cHV0IEdhaW4iCisjfiBtc2dzdHIgIlBvamHEjWFuamUgaXpsYXphIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiUG9qYcSNYW5qZSBtaWtyb2ZvbmEiCisKKyN+IG1zZ2lkICJEaWFnbm9zdGljIgorI34gbXNnc3RyICJEaWphZ25vc3Rpa2EiCisKKyN+IG1zZ2lkICJCYXNzIEJvb3N0IgorI34gbXNnc3RyICJQb2phxI1hbmplIG5pc2tpaCIKKworI34gbXNnaWQgIlBsYXliYWNrIFBvcnRzIgorI34gbXNnc3RyICJQb3J0b3ZpIHJlcHJvZHVrY2lqZSIKKworI34gbXNnaWQgIklucHV0IgorI34gbXNnc3RyICJVbGF6IgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIkl6dm9yIG5hZHppcmFuamEiCisKKyN+IG1zZ2lkICJLZXlib2FyZCBCZWVwIgorI34gbXNnc3RyICJUaXBrb3ZuacSNa2kgenZ1ayIKKworI34gbXNnaWQgIlNpbXVsYXRlIFN0ZXJlbyIKKyN+IG1zZ3N0ciAiU2ltdWxpcmFqIHN0ZXJlbyIKKworI34gbXNnaWQgIlN0ZXJlbyIKKyN+IG1zZ3N0ciAiU3RlcmVvIgorCisjfiBtc2dpZCAiU3Vycm91bmQgU291bmQiCisjfiBtc2dzdHIgIlN1cnJvdW5kIHp2dWsiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIlBvamHEjWFuamUgbWlrcm9mb25hIgorCisjfiBtc2dpZCAiU3BlYWtlciBTb3VyY2UiCisjfiBtc2dzdHIgIkl6dm9yIHp2dcSNbmlrYSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgU291cmNlIgorI34gbXNnc3RyICJJenZvciBtaWtyb2ZvbmEiCisKKyN+IG1zZ2lkICJKYWNrIgorI34gbXNnc3RyICJQcmlrbGp1xI1hayIKKworI34gbXNnaWQgIkNlbnRlciAvIExGRSIKKyN+IG1zZ3N0ciAiU3JlZG5qaSAvIExGRSIKKworI34gbXNnaWQgIlN0ZXJlbyBNaXgiCisjfiBtc2dzdHIgIlN0ZXJlbyBtaWtzZXIiCisKKyN+IG1zZ2lkICJNb25vIE1peCIKKyN+IG1zZ3N0ciAiTW9ubyBtaWtzZXIiCisKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgIlVsYXpuaSBtaWtzZXIiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDEiCisjfiBtc2dzdHIgIk1pa3JvZm9uIDEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDIiCisjfiBtc2dzdHIgIk1pa3JvZm9uIDIiCisKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAiRGlnaXRhbG5pIGl6bGF6IgorCisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAiRGlnaXRhbG5pIHVsYXoiCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk1vZGVtIgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAiU2x1xaFhbGljZSBzIG1pa3JvZm9ub20iCisKKyN+IG1zZ2lkICJPdGhlciIKKyN+IG1zZ3N0ciAiT3N0YWxvIgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAiTmlqZWRhbiIKKworI34gbXNnaWQgIk9uIgorI34gbXNnc3RyICJVa2xqdcSNZW4iCisKKyN+IG1zZ2lkICJPZmYiCisjfiBtc2dzdHIgIklza2xqdcSNZW4iCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICJVdGnFoWFuIgorCisjfiBtc2dpZCAiRmFzdCIKKyN+IG1zZ3N0ciAiQnJ6byIKKworI34gbXNnaWQgIlZlcnkgTG93IgorI34gbXNnc3RyICJWcmxvIG5pc2thIgorCisjfiBtc2dpZCAiTG93IgorI34gbXNnc3RyICJOaXNrYSIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAiU3JlZG5qYSIKKworI34gbXNnaWQgIkhpZ2giCisjfiBtc2dzdHIgIlZpc29rYSIKKworI34gbXNnaWQgIlZlcnkgSGlnaCIKKyN+IG1zZ3N0ciAiVnJsbyB2aXNva2EiCisKKyN+IG1zZ2lkICJQcm9kdWN0aW9uIgorI34gbXNnc3RyICJQcm9kdWtjaWpza2EiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICJNaWtyb2ZvbiBuYSBwcmVkbmpvaiBwbG/EjWkiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICJMaW5panNraSB1bGF6IG5hIHByZWRuam9qIHBsb8SNaSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIEhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIlNsdcWhYWxpY2UgbmEgcHJlZG5qb2ogcGxvxI1pIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBPdXQiCisjfiBtc2dzdHIgIkxpbmlqc2tpIGl6bGF6IG5hIHByZWRuam9qIHBsb8SNaSIKKworI34gbXNnaWQgIkdyZWVuIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiWmVsZW5hIHByaWtsanXEjW5pY2EiCisKKyN+IG1zZ2lkICJQaW5rIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUnXFvmnEjWFzdGEgcHJpa2xqdcSNbmljYSIKKworI34gbXNnaWQgIkJsdWUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJQbGF2YSBwcmlrbGp1xI1uaWNhIgorCisjfiBtc2dpZCAiV2hpdGUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJCaWplbGEgcHJpa2xqdcSNbmljYSIKKworI34gbXNnaWQgIkJsYWNrIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ3JuYSBwcmlrbGp1xI1uaWNhIgorCisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlNpdmEgcHJpa2xqdcSNbmljYSIKKworI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk5hcmFuxI1hc3RhIHByaWtsanXEjW5pY2EiCisKKyN+IG1zZ2lkICJSZWQgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDcnZlbmEgcHJpa2xqdcSNbmljYSIKKworI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgIsW9dXRhIHByaWtsanXEjW5pY2EiCisKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlplbGVuYSBwcmlrbGp1xI1uaWNhIG5hIHByZWRuam9qIHBsb8SNaSIKKworI34gbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJSdcW+acSNYXN0YSBwcmlrbGp1xI1uaWNhIG5hIHByZWRuam9qIHBsb8SNaSIKKworI34gbXNnaWQgIkJsdWUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJQbGF2YSBwcmlrbGp1xI1uaWNhIG5hIHByZWRuam9qIHBsb8SNaSIKKworI34gbXNnaWQgIldoaXRlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQmlqZWxhIHByaWtsanXEjW5pY2EgbmEgcHJlZG5qb2ogcGxvxI1pIgorCisjfiBtc2dpZCAiQmxhY2sgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDcm5hIHByaWtsanXEjW5pY2EgbmEgcHJlZG5qb2ogcGxvxI1pIgorCisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlNpdmEgcHJpa2xqdcSNbmljYSBuYSBwcmVkbmpvaiBwbG/EjWkiCisKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJOYXJhbsSNYXN0YSBwcmlrbGp1xI1uaWNhIG5hIHByZWRuam9qIHBsb8SNaSIKKworI34gbXNnaWQgIlJlZCBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNydmVuYSBwcmlrbGp1xI1uaWNhIG5hIHByZWRuam9qIHBsb8SNaSIKKworI34gbXNnaWQgIlllbGxvdyBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIsW9dXRhIHByaWtsanXEjW5pY2EgbmEgcHJlZG5qb2ogcGxvxI1pIgorCisjfiBtc2dpZCAiU3ByZWFkIE91dHB1dCIKKyN+IG1zZ3N0ciAiUmHFoWlyZW5pIGl6bGF6IgorCisjfiBtc2dpZCAiRG93bm1peCIKKyN+IG1zZ3N0ciAiU21hbmplbmplIGJyb2phIGthbmFsYSIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIlVsYXogdmlydHVhbG5vZyBtaWtzZXJhIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBPdXRwdXQiCisjfiBtc2dzdHIgIkl6bGF6IHZpcnR1YWxub2cgbWlrc2VyYSIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCisjfiBtc2dzdHIgIkthbmFsaSB2aXJ0dWFsbm9nIG1pa3NlcmEiCisKKyN+IG1zZ2lkICIlcyAlZCBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMgJWQgZnVua2NpamEiCisKKyN+IG1zZ2lkICIlcyBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMgZnVua2NpamEiCisKKyN+IG1zZ2lkICJHb3QgdW5leHBlY3RlZCBmcmFtZSBzaXplIG9mICV1IGluc3RlYWQgb2YgJXUuIgorI34gbXNnc3RyICJEb2JpdmVuYSBuZW/EjWVraXZhbmEgdmVsacSNaW5hIG9rdmlyYSAldSB1bWplc3RvICV1LiIKKworI34gbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgb24gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJHcmXFoWthIMSNaXRhbmphICVkIGJhanRvdmEgbmEgdXJlxJFhanUg4oCeJXPigJ0uIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIk5pc2FtIHVzcGlvIGRvZGF0aSB1IHJlZCBtZcSRdXNwcmVtbmlrZSB1IHVyZcSRYWog4oCeJXPigJ0uIgorCisjfiBtc2dpZCAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJOaXNhbSB1c3BpbyBwb2t1xaFhdmFqdcSHaSBkb2JpdGkgdmlkZW8gb2t2aXJlIGl6IHVyZcSRYWphIOKAniVz4oCdLiIKKworI34gbXNnaWQgIkZhaWxlZCBhZnRlciAlZCB0cmllcy4gZGV2aWNlICVzLiBzeXN0ZW0gZXJyb3I6ICVzIgorI34gbXNnc3RyICJOaXNhbSB1c3BpbyBuYWtvbiAlZCBwb2t1xaFhamEuIHVyZcSRYWogJXMuIGdyZcWha2Egc3VzdGF2YTogJXMiCmRpZmYgLS1naXQgYS9wby9odS5wbyBiL3BvL2h1LnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiODhlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9wby9odS5wbwpAQCAtMCwwICsxLDc5MCBAQAorIyBIdW5nYXJpYW4gdHJhbnNsYXRpb24gZm9yIGdzdC1wbHVnaW5zLWdvb2QuCisjIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdzdC1wbHVnaW5zLWdvb2QgcGFja2FnZS4KKyMKKyMgTGFzemxvIER2b3JuaWsgPGR2b3JuaWtAaW52aXRlbC5odT4sIDIwMDQuCisjIEdhYm9yIEtlbGVtZW4gPGtlbGVtZW5nQGdub21lLmh1PiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMiwgMjAxNCwgMjAxNi4KKyMgQmFsw6F6cyDDmnIgPHVyYmFsYXpzQGdtYWlsLmNvbT4sIDIwMTQsIDIwMTUuCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDEuNy4yXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTYtMDMtMTQgMTg6MzUrMDEwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogR2Fib3IgS2VsZW1lbiA8a2VsZW1lbmdAZ25vbWUuaHU+XG4iCisiTGFuZ3VhZ2UtVGVhbTogSHVuZ2FyaWFuIDx0cmFuc2xhdGlvbi10ZWFtLWh1QGxpc3RzLnNvdXJjZWZvcmdlLm5ldD5cbiIKKyJMYW5ndWFnZTogaHVcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJYLVJvc2V0dGEtRXhwb3J0LURhdGU6IDIwMDctMDctMjcgMTk6MTg6MTUrMDAwMFxuIgorIlgtR2VuZXJhdG9yOiBMb2thbGl6ZSAxLjVcbiIKKyJYLVJvc2V0dGEtRXhwb3J0LURhdGU6IDIwMDctMDctMjcgMTk6MTg6MTUrMDAwMFxuIgorIlBsdXJhbC1Gb3JtczogIG5wbHVyYWxzPTI7IHBsdXJhbD0obiAhPSAxKTtcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiSmFjayBraXN6b2xnw6Fsw7MgbmVtIHRhbMOhbGhhdMOzIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICJBIEpQRUcga8OpcCB2aXNzemFmZWp0w6lzZSBtZWdoacO6c3VsdCIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAi4oCeJXPigJ0gZXR0xZFsOiDigJ4lc+KAnSIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiTmVtIHNpa2Vyw7xsdCBjc2F0bGFrb3puaSBhIGtpc3pvbGfDoWzDs2hveiIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJOaW5jcyBiZcOhbGzDrXR2YSBVUkwuIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJOZW0gc2lrZXLDvGx0IGZlbG9sZGFuaSBhIGtpc3pvbGfDoWzDsyBuZXbDqXQuIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIk5lbSBob3poYXTDsyBsw6l0cmUga2FwY3NvbGF0IGEga2lzem9sZ8OhbMOzaG96LiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIkEgYml6dG9uc8OhZ29zIGthcGNzb2xhdCBraWFsYWvDrXTDoXNhIG1lZ2hpw7pzdWx0LiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIiIKKyJIw6Fsw7N6YXRpIGhpYmEgdMO2cnTDqW50LCB2YWd5IGEga2lzem9sZ8OhbMOzIHbDoXJhdGxhbnVsIGxlesOhcnRhIGEga2FwY3NvbGF0b3QuIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICJBIGtpc3pvbGfDoWzDsyBoaWLDoXMgYWRhdG9rYXQga8O8bGTDtnR0LiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICJBIGtpc3pvbGfDoWzDsyBuZW0gdMOhbW9nYXRqYSBhIHRla2Vyw6lzdC4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIk5pbmNzIHZhZ3kgw6lydsOpbnl0ZWxlbiBiZW1lbmV0aSBoYW5nLCBheiBBVkktZm9seWFtIHPDqXLDvGx0IGxlc3ouIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJBIGbDoWpsIG5lbSB0YXJ0YWxtYXogbGVqw6F0c3poYXTDsyBhZGF0Zm9seWFtb2thdC4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkEgZsOhamwgbmVtIMOpcnbDqW55ZXMgw6lzIG5lbSBqw6F0c3poYXTDsyBsZS4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiIgorIk5lbSBsZWhldCBsZWrDoXRzemFuaSBhIGZvbHlhbW90LCBtZXJ0IFBsYXlSZWFkeSBEUk0gdGl0a29zw610w6FzIHZhbiByYWp0YS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkEgZsOhamwgc8OpcsO8bHQgw6lzIG5lbSBqw6F0c3poYXTDsyBsZS4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIsOJcnbDqW55dGVsZW4gYXRvbSBtw6lyZXQuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJBIGbDoWpsIG5lbSB0ZWxqZXMgw6lzIG5lbSBqw6F0c3poYXTDsyBsZS4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIkEgZsOhamxiYW4gdGFsw6FsaGF0w7MgdmlkZcOzIGxlaGV0LCBob2d5IG5lbSBqw6F0c3poYXTDsyBsZSBtZWdmZWxlbMWRZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIiIKKyJBIGbDoWpsIHTDumwgc29rIGFkYXRmb2x5YW1vdCB0YXJ0YWxtYXouIENzYWsgYXogZWxzxZEgJWQga2Vyw7xsIGxlasOhdHN6w6FzcmEuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJOZW0gdGFsw6FsaGF0w7MgdMOhbW9nYXRvdHQgYWRhdGZvbHlhbS4gVGVsZXDDrXRzZSBhIEdTdHJlYW1lciBSVFNQIGLFkXbDrXRtw6lueXQgYSAiCisiUmVhbCBtZWRpYSBhZGF0Zm9seWFtb2tob3ouIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiTmVtIHRhbMOhbGhhdMOzIHTDoW1vZ2F0b3R0IGFkYXRmb2x5YW0uIExlaGV0LCBob2d5IHTDtmJiIMOhdHZpdGVsaSBwcm90b2tvbGx0ICIKKyJrZWxsIGVuZ2Vkw6lseWV6bmksIHZhZ3kgaGnDoW55emlrIGEgbWVnZmVsZWzFkSBHU3RyZWFtZXIgUlRTUCBixZF2w610bcOpbnkuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIk5lbSBueWl0aGF0w7MgbWVnIGhhbmdlc3prw7Z6IGEgbGVqw6F0c3rDoXNob3ouIEF6IGVzemvDtnp0IG3DoXNpayBhbGthbG1hesOhcyAiCisiaGFzem7DoWxqYS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIk5lbSBueWl0aGF0w7MgbWVnIGhhbmdlc3prw7Z6IGEgbGVqw6F0c3rDoXNob3ouIE5pbmNzIGpvZ29zdWx0c8OhZ2EgYXogZXN6a8O2eiAiCisibWVnbnlpdMOhc8OhcmEuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIk5lbSBueWl0aGF0w7MgbWVnIGhhbmdlc3prw7Z6IGEgbGVqw6F0c3rDoXNob3ouIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIk5lbSBueWl0aGF0w7MgbWVnIGhhbmdlc3prw7Z6IGEgbGVqw6F0c3rDoXNob3ouIEF6IE9wZW4gU291bmQgU3lzdGVtIGV6ZW4gIgorInZlcnppw7Nqw6F0IGF6IGVsZW0gbmVtIHTDoW1vZ2F0amEuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkV6IGEgaGFuZ2VzemvDtnogbmVtIHTDoW1vZ2F0amEgYSBsZWrDoXRzesOhc3QuIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICJIYW5nbGVqw6F0c3rDoXNpIGhpYmEuIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJFeiBhIGhhbmdlc3prw7Z6IG5lbSB0w6Ftb2dhdGphIGEgZmVsdsOpdGVsdC4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJIaWJhIGEgaGFuZ2VzemvDtnpyxZFsIHZhbMOzIGZlbHbDqXRlbGtvci4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJOZW0gbnlpdGhhdMOzIG1lZyBoYW5nZXN6a8O2eiBhIGZlbHbDqXRlbGhlei4gTmluY3Mgam9nb3N1bHRzw6FnYSBheiBlc3prw7Z6ICIKKyJtZWdueWl0w6Fzw6FyYS4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIk5lbSBueWl0aGF0w7MgbWVnIGhhbmdlc3prw7Z6IGEgZmVsdsOpdGVsaGV6LiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICJBIENvcmVBdWRpbyBlc3prw7Z6IG5lbSB0YWzDoWxoYXTDsyIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiQSBDb3JlQXVkaW8gZXN6a8O2eiBuZW0gbnlpdGhhdMOzIG1lZyIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIkZlbHbDqXRlbCBmb3Jyw6FzYSIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pa3JvZm9uIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiVm9uYWxiZW1lbmV0IgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIkJlbHPFkSBDRCIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJTUERJRiBiZSIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICIxLiBBVVggYmUiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiMi4gQVVYIGJlIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIktvZGVrIHZpc3N6YWNzYXRvbMOhcyIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiU3VuVlRTIHZpc3N6YWNzYXRvbMOhcyIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiSGFuZ2VyxZEiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJFcsWRc8OtdMOpcyIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIk1vbml0b3IiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJCZcOpcMOtdGV0dCBoYW5nc3rDs3LDsyIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiRmVqaGFsbGdhdMOzIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIlZvbmFsa2ltZW5ldCIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiU1BESUYga2kiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIjEuIEFVWCBraSIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiMi4gQVVYIGtpIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkhpYmEgJWQgYsOhanQgb2x2YXPDoXNha29yIGEga8O2dmV0a2V6xZEgZXN6a8O2enLFkWw6IOKAniVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorIkEoeikg4oCeJXPigJ0gZXN6a8O2eiDDoWx0YWwga2V6ZWxoZXTFkSBsZWhldHPDqWdlcyB2aWRlb2Zvcm3DoXR1bW9rIGZlbHNvcm9sw6FzYSAiCisic2lrZXJ0ZWxlbiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTmVtIGvDqXBlemhldMWRayBsZSBhKHopIOKAniVz4oCdIGVzemvDtnogcHVmZmVyZWkiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIkEoeikg4oCeJXPigJ0gZXN6a8O2eiBpbGxlc3p0xZFwcm9ncmFtamEgbmVtIHTDoW1vZ2F0amEgYSh6KSAlZC4gSU8gbcOzZG90IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiIgorIkEoeikg4oCeJXPigJ0gZXN6a8O2eiBpbGxlc3p0xZFwcm9ncmFtamEgbmVtIHTDoW1vZ2F0IGVneWV0bGVuIGlzbWVydCBJTyBtw7Nkb3Qgc2VtLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJBKHopIOKAniVz4oCdIGVzemvDtnogZm9nbGFsdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiQSh6KSDigJ4lc+KAnSBlc3prw7Z6IG5lbSBrw6lwZXMgZmVsdmVubmkgJWR4JWQgZmVsYm9udMOhc2JhbiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiQSh6KSDigJ4lc+KAnSBlc3prw7Z6IG5lbSBrw6lwZXMgZmVsdmVubmkgYSBtZWdhZG90dCBmb3Jtw6F0dW1iYW4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiQSh6KSDigJ4lc+KAnSBlc3prw7Z6IG5lbSB0w6Ftb2dhdGphIGEgbmVtIHN6b21zesOpZG9zIHPDrWtva2F0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTmVtIGvDqXJoZXTFkWsgbGUgYSh6KSDigJ4lc+KAnSBlc3prw7Z6IHBhcmFtw6l0ZXJlaSIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiQSB2aWRlb2VzemvDtnogbmVtIGZvZ2FkdGEgZWwgYXogw7pqIGvDqXBrb2NrYXNlYmVzc8OpZy1iZcOhbGzDrXTDoXN0LiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIkEgdmlkZW9lc3prw7Z6IG5lbSBzem9sZ8OhbHRhdG90dCBraW1lbmV0aSBmb3Jtw6F0dW1vdC4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiQSB2aWRlb2VzemvDtnogw6lydsOpbnl0ZWxlbiBkaW1lbnppw7Nra2FsIHTDqXJ0IHZpc3N6YS4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiQSB2aWRlb2VzemvDtnrDtmsgbmVtIHTDoW1vZ2F0b3R0IHbDoWx0b3R0c29yb3MgbcOzZG90IGhhc3puw6FsbmFrLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICJBIHZpZGVvZXN6a8O2esO2ayBuZW0gdMOhbW9nYXRvdHQga8OpcHBvbnRmb3Jtw6F0dW1vdCBoYXN6bsOhbG5hay4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiTmVtIHNpa2Vyw7xsdCBiZcOhbGzDrXRhbmkgYSBiZWxzxZEgcHVmZmVydMOhcm9sw7N0LiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiQSB2aWRlb2VzemvDtnogbmVtIGphdmFzb2x0IHNlbW1pbHllbiBwdWZmZXJtw6lyZXRldC4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICJOaW5jcyBpbXBvcnTDoWzDoXNpIGZvcnLDoXNrw6ludCBoYXN6bsOhbGhhdMOzIGFsw6FyZW5kZWx0IHTDoXJvbMOzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQSh6KSAlZC4gdHVuZXIgYmXDoWxsw610w6Fzw6FuYWsgbGVrw6lyw6lzZSBhKHopIOKAniVz4oCdIGVzemvDtnrDtm4gbWVnaGnDunN1bHQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkhpYmEgYSh6KSDigJ4lc+KAnSBlc3prw7Z6IGvDqXBlc3PDqWdlaW5layBsZWvDqXLDqXNla29yLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIkEoeikg4oCeJXPigJ0gZXN6a8O2eiBuZW0gdHVuZXIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiQSByw6FkacOzYmVtZW5ldCBsZWvDqXLDqXNlIG1lZ2hpw7pzdWx0IGEoeikg4oCeJXPigJ0gZXN6a8O2esO2bi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJBKHopICVkLiBiZW1lbmV0IGJlw6FsbMOtdMOhc2EgbWVnaGnDunN1bHQgYSh6KSDigJ4lc+KAnSBlc3prw7Z6w7ZuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQSBuw6ltw610w6FzaSDDoWxsYXBvdCBtw7Nkb3PDrXTDoXNhIG1lZ2hpw7pzdWx0IGEoeikg4oCeJXPigJ0gZXN6a8O2esO2bi4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIk5lbSBzaWtlcsO8bHQgbGVmb2dsYWxuaSBhIHN6w7xrc8OpZ2VzIG1lbcOzcmnDoXQuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIk5lbSBzaWtlcsO8bHQgbGVmb2dsYWxuaSBhIHN6w7xrc8OpZ2VzIG1lbcOzcmnDoXQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIkEoeikgJXMgZXN6a8O2esO2biBsw6l2xZEgw6F0YWxha8OtdMOzbmFrIG5pbmNzIHTDoW1vZ2F0b3R0IGJlbWVuZXRpIGZvcm3DoXR1bWEiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIkEoeikgJXMgZXN6a8O2esO2biBsw6l2xZEgw6F0YWxha8OtdMOzbmFrIG5pbmNzIHTDoW1vZ2F0b3R0IGtpbWVuZXRpIGZvcm3DoXR1bWEiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIkEoeikgJXMgZXN6a8O2esO2biBsw6l2xZEga8OzZG9sw7NuYWsgbmluY3MgdMOhbW9nYXRvdHQgYmVtZW5ldGkgZm9ybcOhdHVtYSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIkEoeikgJXMgZXN6a8O2esO2biBsw6l2xZEga8OzZG9sw7NuYWsgbmluY3MgdMOhbW9nYXRvdHQga2ltZW5ldGkgZm9ybcOhdHVtYSIKKworbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICJOZW0gc2lrZXLDvGx0IGVsaW5kw610YW5pIGEgZGVrw7Nkb2zDoXNpIHN6w6FsYXQuIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICJOZW0gc2lrZXLDvGx0IGZlbGRvbGdvem5pIGEga2VyZXRldC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisiSGliYSBhKHopIOKAniVz4oCdIGVzemvDtnoga8OpcGVzc8OpZ2VpbmVrIGxla8OpcsOpc2Vrb3IuIEV6IG5lbSBlZ3kgdjRsMiBtZWdoYWp0w7MuICIKKyJFbGxlbsWRcml6emUsIGhvZ3kgbmVtIHY0bDEgbWVnaGFqdMOzLWUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiQSh6KSAlZCBiZW1lbmV0IGF0dHJpYsO6dHVtYWluYWsgbGVrw6lyw6lzZSBtZWdoacO6c3VsdCBhKHopICVzIGVzemvDtnrDtm4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQSh6KSAlZC4gdHVuZXIgYmXDoWxsw610w6Fzw6FuYWsgbGVrw6lyw6lzZSBhKHopIOKAniVz4oCdIGVzemvDtnrDtm4gbWVnaGnDunN1bHQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQSBub3JtYSBsZWvDqXJkZXrDqXNlIG1lZ2hpw7pzdWx0IGEoeikg4oCeJXPigJ0gZXN6a8O2enTFkWwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJBIHZlesOpcmzFkWF0dHJpYsO6dHVtb2sgbGVrw6lyw6lzZSBtZWdoacO6c3VsdCBhKHopIOKAniVz4oCdIGVzemvDtnrDtm4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5lbSBhem9ub3PDrXRoYXTDsyBhKHopIOKAniVz4oCdIGVzemvDtnouIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkV6IG5lbSBlZ3kgZXN6a8O2ejog4oCeJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiTmVtIHNpa2Vyw7xsdCBvbHZhc8Ohc3JhIMOpcyDDrXLDoXNyYSBtZWdueWl0bmkgYSh6KSDigJ4lc+KAnSBlc3prw7Z6dC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJBKHopIOKAniVz4oCdIGVzemvDtnogbmVtIHLDtmd6w610xZFlc3prw7Z6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiQSh6KSDigJ4lc+KAnSBlc3prw7Z6IG5lbSBraW1lbmV0aSBlc3prw7Z6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiQSh6KSDigJ4lc+KAnSBlc3prw7Z6IG5lbSBNMk0gZXN6a8O2ei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIk5lbSBzaWtlcsO8bHQgZHVwbGlrw6FsbmkgYSh6KSDigJ4lc+KAnSBlc3prw7Z6dCBvbHZhc8Ohc3JhIMOpcyDDrXLDoXNyYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkEgbm9ybWEgYmXDoWxsw610w6FzYSBtZWdoacO6c3VsdCBhKHopIOKAniVz4oCdIGVzemvDtnrDtm4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIkEgdHVuZXIgYWt0dcOhbGlzIGZyZWt2ZW5jacOhasOhbmFrIGxla8OpcmRlesOpc2UgbWVnaGnDunN1bHQgYSh6KSDigJ4lc+KAnSBlc3prw7Z6dMWRbC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorIkEgdHVuZXIgYWt0dcOhbGlzIGZyZWt2ZW5jacOhasOhbmFrIGJlw6FsbMOtdMOhc2EgbWVnaGnDunN1bHQgYSh6KSDigJ4lc+KAnSBlc3prw7Z6w7ZuICIKKyIlbHUgSHotcmUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkEgamVsZXLFkXNzw6lnIGxla8OpcmRlesOpc2UgbWVnaGnDunN1bHQgYSh6KSDigJ4lc+KAnSBlc3prw7Z6w7ZuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQSh6KSAlZC4gdmV6w6lybMWRZWxlbSDDqXJ0w6lrw6luZWsgbGVrw6lyw6lzZSBtZWdoacO6c3VsdCBhKHopIOKAniVz4oCdIGVzemvDtnrDtm4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiQSh6KSAkJTJkIMOpcnTDqWsgYmXDoWxsw610w6FzYSAkJTFkIHZlesOpcmzFkWVsZW1oZXogbWVnaGnDunN1bHQgYSh6KSDigJ4lc+KAnSBlc3prw7Z6w7ZuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIkF6IGFrdHXDoWxpcyBiZW1lbmV0IGxla8OpcsOpc2UgbWVnaGnDunN1bHQgYSh6KSDigJ4lc+KAnSBlc3prw7Z6csWRbC4gTGVoZXQsIGhvZ3kgZXogIgorImVneSByw6FkacOzZXN6a8O2ei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIkF6IGFrdHXDoWxpcyBraW1lbmV0IGxla8OpcsOpc2UgbWVnaGnDunN1bHQgYSh6KSDigJ4lc+KAnSBlc3prw7Z6csWRbC4gTGVoZXQsIGhvZ3kgZXogIgorImVneSByw6FkacOzZXN6a8O2ei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiQSh6KSAlZC4ga2ltZW5ldCBiZcOhbGzDrXTDoXNhIG1lZ2hpw7pzdWx0IGEoeikg4oCeJXPigJ0gZXN6a8O2esO2bi4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICJBIGZlbGJvbnTDoXMgbcOzZG9zw610w6FzYSBmdXTDoXMga8O2emJlbiBtw6lnIG5lbSB0w6Ftb2dhdG90dC4iCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIsOTcmEgbsOpbGvDvGwgbGVoZXRldGxlbiBhIG3FsWvDtmTDqXMiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIkJlbHPFkSBhZGF0Zm9seWFtLWhpYmEuIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAiQmVsc8WRIGFkYXRmb2x5YW0taGliYS4iCisKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIkEoeikg4oCeJXPigJ0gZXN6a8O2eiBuZW0gdMOhbW9nYXRqYSBhIHZpZGVvZmVsdsOpdGVsdCIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIk5lbSBob3poYXTDsyBsw6l0cmUga2FwY3NvbGF0IGEgaGFuZ2tpc3pvbGfDoWzDs2hveiIKKworI34gbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBzb3VuZCBzZXJ2ZXIgY2FwYWJpbGl0aWVzIgorI34gbXNnc3RyICJBIGhhbmdraXN6b2xnw6Fsw7Mga8OpcGVzc8OpZ2VpbmVrIGxla8OpcmRlesOpc2UgbWVnaGnDunN1bHQiCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICJCYXNzenVzIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICJNYWdhcyIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICJTemludGV0LiIKKworI34gbXNnaWQgIlBDTSIKKyN+IG1zZ3N0ciAiUENNIgorCisjfiBtc2dpZCAiU3BlYWtlciIKKyN+IG1zZ3N0ciAiSGFuZ2ZhbCIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIlZvbmFsYmVtZW5ldCIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJLZXZlcsWRIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIjIuIFBDTSIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAiRmVsdsOpdGVsIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAiQmUtZXLFkXPDrXTDqXMiCisKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAiS2ktZXLFkXPDrXTDqXMiCisKKyN+IG1zZ2lkICJMaW5lLTEiCisjfiBtc2dzdHIgIjEuIHZvbmFsIgorCisjfiBtc2dpZCAiTGluZS0yIgorI34gbXNnc3RyICIyLiB2b25hbCIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAiMy4gdm9uYWwiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTEiCisjfiBtc2dzdHIgIjEuIGRpZ2l0w6FsaXMiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgIjIuIGRpZ2l0w6FsaXMiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIjMuIGRpZ2l0w6FsaXMiCisKKyN+IG1zZ2lkICJQaG9uZS1pbiIKKyN+IG1zZ3N0ciAiSGFuZy1iZSIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAiSGFuZy1raSIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICJWaWRlbyIKKworI34gbXNnaWQgIlJhZGlvIgorI34gbXNnc3RyICJSw6FkacOzIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiTmVtIG55aXRoYXTDsyBtZWcgaGFuZ2VzemvDtnogYSBrZXZlcsWRdmV6w6lybMWRIGtlemVsw6lzw6loZXouIgorCisjfiBtc2dpZCAiIgorI34gIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4gVGhpcyB2ZXJzaW9uIG9mICIKKyN+ICJ0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiTmVtIG55aXRoYXTDsyBtZWcgaGFuZ2VzemvDtnogYSBrZXZlcsWRdmV6w6lybMWRIGtlemVsw6lzw6loZXouIEF6IE9wZW4gU291bmQgIgorI34gIlN5c3RlbSBlemVuIHZlcnppw7Nqw6F0IGF6IGVsZW0gbmVtIHTDoW1vZ2F0amEuIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICJGxZEgaGFuZ2VyxZEiCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAiRWzDvGxzxZEiCisKKyN+IG1zZ2lkICJSZWFyIgorI34gbXNnc3RyICJIw6F0c8OzIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiRsO8bGhhbGxnYXTDsyIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAiS8O2esOpcHPFkSIKKworI34gbXNnaWQgIkxGRSIKKyN+IG1zZ3N0ciAiTEZFIgorCisjfiBtc2dpZCAiU3Vycm91bmQiCisjfiBtc2dzdHIgIlTDqXJoYXTDoXPDuiIKKworI34gbXNnaWQgIlNpZGUiCisjfiBtc2dzdHIgIk9sZGFsc8OzIgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAiQVVYIGtpIgorCisjfiBtc2dpZCAiM0QgRGVwdGgiCisjfiBtc2dzdHIgIjNEIG3DqWx5IgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICIzRCBrw7Z6w6lwc8WRIgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAiM0QgamF2w610w6FzIgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICJUZWxlZm9uIgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgIlZpZGVvIGJlIgorCisjfiBtc2dpZCAiQVVYIEluIgorI34gbXNnc3RyICJBVVggYmUiCisKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAiRmVsdsOpdGVsZXLFkXPDrXTDqXMiCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAiS2ltZW5ldGVyxZFzw610w6lzIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiTWlrcm9mb25lcsWRc8OtdMOpcyIKKworI34gbXNnaWQgIkRpYWdub3N0aWMiCisjfiBtc2dzdHIgIkRpYWdub3N6dGlrYSIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgIkJhc3N6dXNraWVtZWzDqXMiCisKKyN+IG1zZ2lkICJQbGF5YmFjayBQb3J0cyIKKyN+IG1zZ3N0ciAiTGVqw6F0c3rDoXNpIHBvcnRvayIKKworI34gbXNnaWQgIklucHV0IgorI34gbXNnc3RyICJCZW1lbmV0IgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIk1vbml0b3IgZm9ycsOhc2EiCisKKyN+IG1zZ2lkICJLZXlib2FyZCBCZWVwIgorI34gbXNnc3RyICJCaWxsZW50ecWxemV0Y3NlbmfFkSIKKworI34gbXNnaWQgIlNpbXVsYXRlIFN0ZXJlbyIKKyN+IG1zZ3N0ciAiU3p0ZXJlw7Mgc3ppbXVsw6Fsw6FzYSIKKworI34gbXNnaWQgIlN0ZXJlbyIKKyN+IG1zZ3N0ciAiU3p0ZXJlw7MiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAiVMOpcmhhdMOhc8O6IGhhbmciCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIk1pa3JvZm9uZXLFkXPDrXTDqXMiCisKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAiSGFuZ2ZhbGZvcnLDoXMiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTWlrcm9mb25mb3Jyw6FzIgorCisjfiBtc2dpZCAiSmFjayIKKyN+IG1zZ3N0ciAiSmFjayIKKworI34gbXNnaWQgIkNlbnRlciAvIExGRSIKKyN+IG1zZ3N0ciAiS8O2esOpcHPFkSAvIExGRSIKKworI34gbXNnaWQgIlN0ZXJlbyBNaXgiCisjfiBtc2dzdHIgIlN6dGVyZcOzIGtldmVyw6lzIgorCisjfiBtc2dpZCAiTW9ubyBNaXgiCisjfiBtc2dzdHIgIk1vbsOzIGtldmVyw6lzIgorCisjfiBtc2dpZCAiSW5wdXQgTWl4IgorI34gbXNnc3RyICJCZW1lbmV0aSBrZXZlcsOpcyIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAiMS4gbWlrcm9mb24iCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDIiCisjfiBtc2dzdHIgIjIuIG1pa3JvZm9uIgorCisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIkRpZ2l0w6FsaXMga2kiCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICJEaWdpdMOhbGlzIGJlIgorCisjfiBtc2dpZCAiSERNSSIKKyN+IG1zZ3N0ciAiSERNSSIKKworI34gbXNnaWQgIk1vZGVtIgorI34gbXNnc3RyICJNb2RlbSIKKworI34gbXNnaWQgIkhhbmRzZXQiCisjfiBtc2dzdHIgIk1vYmlsdGVsZWZvbiIKKworI34gbXNnaWQgIk90aGVyIgorI34gbXNnc3RyICJFZ3nDqWIiCisKKyN+IG1zZ2lkICJOb25lIgorI34gbXNnc3RyICJOaW5jcyIKKworI34gbXNnaWQgIk9uIgorI34gbXNnc3RyICJCZSIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAiS2kiCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICJOw6ltw610w6FzIgorCisjfiBtc2dpZCAiRmFzdCIKKyN+IG1zZ3N0ciAiR3lvcnMiCisKKyN+IG1zZ2lkICJWZXJ5IExvdyIKKyN+IG1zZ3N0ciAiTmFneW9uIGFsYWNzb255IgorCisjfiBtc2dpZCAiTG93IgorI34gbXNnc3RyICJBbGFjc29ueSIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAiS8O2emVwZXMiCisKKyN+IG1zZ2lkICJIaWdoIgorI34gbXNnc3RyICJNYWdhcyIKKworI34gbXNnaWQgIlZlcnkgSGlnaCIKKyN+IG1zZ3N0ciAiTmFneW9uIG1hZ2FzIgorCisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAiw4lsZXMiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICJFbMWRbGFwaSBtaWtyb2ZvbiIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgSW4iCisjfiBtc2dzdHIgIkVsxZFsYXBpIHZvbmFsYmVtZW5ldCIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIEhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkVsxZFsYXBpIGbDvGxoYWxsZ2F0w7MiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIE91dCIKKyN+IG1zZ3N0ciAiRWzFkWxhcGkgdm9uYWxraW1lbmV0IgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICJaw7ZsZCBjc2F0bGFrb3rDsyIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICJSw7N6c2FzesOtbiBjc2F0bGFrb3rDsyIKKworI34gbXNnaWQgIkJsdWUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJLw6lrIGNzYXRsYWtvesOzIgorCisjfiBtc2dpZCAiV2hpdGUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJGZWjDqXIgY3NhdGxha296w7MiCisKKyN+IG1zZ2lkICJCbGFjayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkZla2V0ZSBjc2F0bGFrb3rDsyIKKworI34gbXNnaWQgIkdyYXkgQ29ubmVjdG9yIgorI34gbXNnc3RyICJTesO8cmtlIGNzYXRsYWtvesOzIgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiTmFyYW5jcyBjc2F0bGFrb3rDsyIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlbDtnLDtnMgY3NhdGxha296w7MiCisKKyN+IG1zZ2lkICJZZWxsb3cgQ29ubmVjdG9yIgorI34gbXNnc3RyICJTw6FyZ2EgY3NhdGxha296w7MiCisKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlrDtmxkIGVsxZFvbGRhbGkgY3NhdGxha296w7MiCisKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUsOzenNhc3rDrW4gZWzFkW9sZGFsaSBjc2F0bGFrb3rDsyIKKworI34gbXNnaWQgIkJsdWUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJLw6lrIGVsxZFvbGRhbGkgY3NhdGxha296w7MiCisKKyN+IG1zZ2lkICJXaGl0ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkZlaMOpciBlbMWRb2xkYWxpIGNzYXRsYWtvesOzIgorCisjfiBtc2dpZCAiQmxhY2sgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJGZWtldGUgZWzFkW9sZGFsaSBjc2F0bGFrb3rDsyIKKworI34gbXNnaWQgIkdyYXkgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJTesO8cmtlIGVsxZFvbGRhbGkgY3NhdGxha296w7MiCisKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJOYXJhbmNzIGVsxZFvbGRhbGkgY3NhdGxha296w7MiCisKKyN+IG1zZ2lkICJSZWQgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJWw7Zyw7ZzIGVsxZFvbGRhbGkgY3NhdGxha296w7MiCisKKyN+IG1zZ2lkICJZZWxsb3cgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJTw6FyZ2EgZWzFkW9sZGFsaSBjc2F0bGFrb3rDsyIKKworI34gbXNnaWQgIlNwcmVhZCBPdXRwdXQiCisjfiBtc2dzdHIgIlN6w7Nyw6Fza2ltZW5ldCIKKworI34gbXNnaWQgIkRvd25taXgiCisjfiBtc2dzdHIgIkxla2V2ZXLDqXMiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIElucHV0IgorI34gbXNnc3RyICJWaXJ0dcOhbGlzIGtldmVyxZFiZW1lbmV0IgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBPdXRwdXQiCisjfiBtc2dzdHIgIlZpcnR1w6FsaXMga2V2ZXLFkWtpbWVuZXQiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICJWaXJ0dcOhbGlzIGtldmVyxZFjc2F0b3Juw6FrIgorCisjfiBtc2dpZCAiJXMgJWQgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzICVkIGZ1bmtjacOzIgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzIGZ1bmtjacOzIgorCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAiVsOhcmF0bGFuIGtlcmV0bcOpcmV0ICgldSkgw6lya2V6ZXR0ICV1IGhlbHlldHQuIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkhpYmEgJWQgYsOhanQgb2x2YXPDoXNha29yIGEga8O2dmV0a2V6xZEgZXN6a8O2enLFkWw6IOKAniVz4oCdLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlbnF1ZXVlIGJ1ZmZlcnMgaW4gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJOZW0gw6FsbMOtdGhhdMOzayBzb3JiYSBhIHB1ZmZlcmVrIGEoeikg4oCeJXPigJ0gZXN6a8O2emJlbi4iCisKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIk5lbSBzaWtlcsO8bHQgdmlkZW9rb2Nrw6FrYXQgbGVrw6lybmkgYSh6KSDigJ4lc+KAnSBlc3prw7Z6dMWRbC4iCisKKyN+IG1zZ2lkICJGYWlsZWQgYWZ0ZXIgJWQgdHJpZXMuIGRldmljZSAlcy4gc3lzdGVtIGVycm9yOiAlcyIKKyN+IG1zZ3N0ciAiSGliYSAlZCBwcsOzYsOhbGtvesOhcyB1dMOhbi4gRXN6a8O2ejogJXMuIFJlbmRzemVyaGliYTogJXMuIgpkaWZmIC0tZ2l0IGEvcG8vaWQucG8gYi9wby9pZC5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjQwZjgzCi0tLSAvZGV2L251bGwKKysrIGIvcG8vaWQucG8KQEAgLTAsMCArMSw0MzMgQEAKKyMgSW5kb25lc2lhbiB0cmFuc2xhdGlvbnMgZm9yIGdzdC1wbHVnaW5zLWdvb2QgcGFja2FnZS4KKyMgVGhpcyBmaWxlIGlzIHB1dCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMKKyMgQW5kaGlrYSBQYWRtYXdhbiA8YW5kaGlrYS5wYWRtYXdhbkBnbWFpbC5jb20+LCAyMDExLTIwMTYuCisjIEFuZGlrYSBUcml3aWRhZGEgPGFuZGlrYUBnbWFpbC5jb20+LCAyMDEzLgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZCAxLjEwLjBcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxNi0xMS0xMCAyMjowNiswNzAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBBbmRoaWthIFBhZG1hd2FuIDxhbmRoaWthLnBhZG1hd2FuQGdtYWlsLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBJbmRvbmVzaWFuIDx0cmFuc2xhdGlvbi10ZWFtLWlkQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD5cbiIKKyJMYW5ndWFnZTogaWRcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJYLUJ1Z3M6IFJlcG9ydCB0cmFuc2xhdGlvbiBlcnJvcnMgdG8gdGhlIExhbmd1YWdlLVRlYW0gYWRkcmVzcy5cbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTE7IHBsdXJhbD0wO1xuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICJTZXJ2ZXIgSmFjayB0YWsgZGl0ZW11a2FuIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICJHYWdhbCB1bnR1ayBtZW5nYXdhc2FuZGkgY2l0cmEgSlBFRyIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiJyVzJyBvbGVoICclcyciCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIlRhayBkYXBhdCBtZW5naHVidW5naSBzZXJ2ZXIiCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiVGFrIGFkYSBVUkwgeWFuZyBkaXRlbnR1a2FuLiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiVGFrIGRhcGF0IG1lbmVtdWthbiBuYW1hIHNlcnZlci4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiVGFrIGRhcGF0IG1lbWJhbmd1biBrb25la3NpIGtlIHNlcnZlci4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICJQZW5nYXR1cmFuIGtvbmVrc2kgYW1hbiBnYWdhbC4iCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisiVGVyamFkaSBzZWJ1YWggZ2FsYXQgamFyaW5nYW4sIGF0YXUgc2VydmVyIG1lbnV0dXAga29uZWtzaSBzZWNhcmEgdGliYS10aWJhLiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiU2VydmVyIG1lbmdpcmltIGRhdGEgcnVzYWsuIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIlNlcnZlciB0aWRhayBtZW5kdWt1bmcgcGVuY2FyaWFuLiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiTWFzdWthbiBhdWRpbyB0aWRhayBhZGEgYXRhdSB0aWRhayBzYWgsIGFydXMgQVZJIGFrYW4gcnVzYWsuIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJCZXJrYXMgaW5pIHRpZGFrIGJlcmlzaSBhcnVzIHlhbmcgZGFwYXQgZGlwdXRhci4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkJlcmthcyBpbmkgdGlkYWsgc2FoIGRhbiB0YWsgZGFwYXQgZGlwdXRhci4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiVGFrIGJpc2EgbWVtYWlua2FuIHN0cmVhbSBrYXJlbmEgZGllbmtyaXBzaSBtZW1ha2FpIERSTSBQbGF5UmVhZHkuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJCZXJrYXMgaW5pIHJ1c2FrIGRhbiB0YWsgZGFwYXQgZGlwdXRhci4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIlVrdXJhbiBhdG9tIHRpZGFrIHNhaC4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkJlcmthcyBpbmkgdGlkYWsgbGVuZ2thcCBkYW4gdGFrIGRhcGF0IGRpcHV0YXIuIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICJWaWRlbyBkaSBiZXJrYXMgaW5pIG11bmdraW4gdGFrIGRhcGF0IGRpcHV0YXIgZGVuZ2FuIGJlbmFyLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICJCZXJrYXMgaW5pIGJlcmlzaSB0ZXJsYWx1IGJhbnlhayBhcnVzLiBIYW55YSBtZW11dGFyICVkIHBlcnRhbWEiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIlRhayBhZGEgYXJ1cyBkaWR1a3VuZyB5YW5nIGRpdGVtdWthbi4gQW5kYSBtdW5na2luIHBlcmx1IG1lbmdpbnN0YWwgcGx1Z2luICIKKyJla3N0ZW5zaSBHU3RyZWFtZXIgUlRTUCB1bnR1ayBhcnVzIFJlYWwgbWVkaWEuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiVGFrIGFkYSBhcnVzIGRpZHVrdW5nIHlhbmcgZGl0ZW11a2FuLiBBbmRhIG11bmdraW4gaW5naW4gbWVuZ2l6aW5rYW4gbGViaWggIgorImJhbnlhayB0cmFuc3BvcnRhc2kgYXRhdSBrZWhpbGFuZ2FuIHBsdWdpbiBla3N0ZW5zaSBHU3RyZWFtZXIgUlRTUCB5YW5nICIKKyJiZW5hci4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiVGFrIGRhcGF0IG1lbWJ1a2EgZGl2YWlzIGF1ZGlvIHVudHVrIHB1dGFyIGtlbWJhbGkuIERpdmFpcyBzZWRhbmcgZGlndW5ha2FuICIKKyJvbGVoIGFwbGlrYXNpIGxhaW4uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJUYWsgZGFwYXQgbWVtYnVrYSBkaXZhaXMgYXVkaW8gdW50dWsgcHV0YXIga2VtYmFsaS4gQW5kYSB0YWsgbWVtaWxpa2kgaGFrICIKKyJha3NlcyB1bnR1ayBtZW1idWthIGRpdmFpcy4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiVGFrIGRhcGF0IG1lbWJ1a2EgZGl2YWlzIGF1ZGlvIHVudHVrIHB1dGFyIGtlbWJhbGkuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIlRhayBkYXBhdCBtZW1idWthIGRpdmFpcyBhdWRpbyB1bnR1ayBwdXRhciBrZW1iYWxpLiBWZXJzaSBPcGVuIFNvdW5kIFN5c3RlbSAiCisiaW5pIHRpZGFrIGRpZHVrdW5nIG9sZWggZWxlbWVuIGluaS4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiUHV0YXIgYmFsaWsgdGlkYWsgZGlkdWt1bmcgb2xlaCBkaXZhaXMgYXVkaW8gaW5pLiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiR2FsYXQgcHV0YXIgYmFsaWsgYXVkaW8uIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJQZXJla2FtYW4gdGlkYWsgZGlkdWt1bmcgb2xlaCBkaXZhaXMgYXVkaW8gaW5pLiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkdhbGF0IG1lcmVrYW0gZGFyaSBkaXZhaXMgYXVkaW8uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiVGFrIGRhcGF0IG1lbWJ1a2EgZGl2YWlzIGF1ZGlvIHVudHVrIG1lcmVrYW0uIEFuZGEgdGFrIG1lbWlsaWtpIGhhayBha3NlcyAiCisidW50dWsgbWVtYnVrYSBkaXZhaXMuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICJUYWsgZGFwYXQgbWVtYnVrYSBkaXZhaXMgYXVkaW8gdW50dWsgbWVyZWthbS4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiRGl2YWlzIENvcmVBdWRpbyB0aWRhayBkaXRlbXVrYW4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIkRpdmFpcyBDb3JlQXVkaW8gdGlkYWsgZGFwYXQgYnVrYSIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIlN1bWJlciBSZWthbWFuIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWlrcm9mb24iCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJKYWx1ciBNYXN1ayIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICJDRCBJbnRlcm5hbCIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJTUERJRiBNYXN1ayIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJBVVggMSBNYXN1ayIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJBVVggMiBNYXN1ayIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJMb29wYmFjayBLb2RlayIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiTG9vcGJhY2sgU3VuVlRTIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJWb2x1bWUiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJHYWluIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiTW9uaXRvciIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIlBlbmdlcmFzIFN1YXJhIFRlcmJpbmEiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIkhlYWRwaG9uZSIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICJKYWx1ciBLZWx1YXIiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNQRElGIEtlbHVhciIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiQVVYIDEgS2VsdWFyIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICJBVVggMiBLZWx1YXIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR2FsYXQgbWVtYmFjYSAlZCBiaXRhIGRhcmkgZGl2YWlzICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisiR2FnYWwgbWVueWVidXRrYW4ga2VtdW5na2luYW4gZm9ybWF0IHZpZGVvIHlhbmcgZGFwYXQgYmVrZXJqYSBkZW5nYW4gZGl2YWlzICIKKyInJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiVGFrIGRhcGF0IG1lbWV0YWthbiBwZW55YW5nZ2EgZGFyaSBkaXZhaXMgJyVzJyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiRHJpdmVyIGRhcmkgZGl2YWlzICclcycgdGFrIG1lbmR1a3VuZyBtZXRvZGUgSU8gJWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICJEcml2ZXIgZGFyaSBkaXZhaXMgJyVzJyB0YWsgbWVuZHVrdW5nIG1ldG9kZSBJTyBhcGFwdW4geWFuZyBkaWtlbmFsLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJEaXZhaXMgJyVzJyBzaWJ1ayIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiRGl2YWlzICclcycgdGFrIGRhcGF0IG1lbmFuZ2thcCBkaSAlZHglZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiRGl2YWlzICclcycgdGFrIGRhcGF0IG1lbmFuZ2thcCBkYWxhbSBmb3JtYXQgeWFuZyBkaXRlbnR1a2FuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIkRpdmFpcyAnJXMnIHRhayBtZW5kdWt1bmcgcGVzYXdhdCB0YWsgYmVyc2luZ2d1bmdhbiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIlRhayBiaXNhIG1lbmRhcGF0a2FuIHBhcmFtZXRlciBkaSBkaXZhaXMgJyVzJyIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiRGl2YWlzIHZpZGVvIHRhayBtZW5lcmltYSBwZW5nYXR1cmFuIGxhanUgYmluZ2thaSBiYXJ1LiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIkRpdmFpcyB2aWRlbyB0YWsgbWVueWVkaWFrYW4gZm9ybWF0IGtlbHVhcmFuLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICJEaXZhaXMgdmlkZW8gbWVuZ2VtYmFsaWthbiBkaW1lbnNpIHRpZGFrIHNhaC4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiRGl2YWlzIHZpZGVvIG1lbmdndW5ha2FuIG1ldG9kZSBwZW55aWxhbmdhbiB5YW5nIHRpZGFrIGRpZHVrdW5nLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICJEaXZhaXMgdmlkZW8gbWVuZ2d1bmFrYW4gZm9ybWF0IHBpeGVsIHlhbmcgdGlkYWsgZGlkdWt1bmcuIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIkdhZ2FsIG1lbmdhdHVyIHB1bCBzaW5nZ2FoYW4gaW50ZXJuYWwuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICJEaXZhaXMgdmlkZW8gdGFrIG1lbnlhcmFua2FuIHVrdXJhbiBzaW5nZ2FoYW4gYXBhcHVuLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIlRhayBhZGEgcHVsIGRvd25zdHJlYW0gdW50dWsgZGlpbXBvci4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkdhZ2FsIG1lbmRhcGF0a2FuIHBlbmdhdHVyYW4gdHVuZXIgJWQgZGkgZGl2YWlzICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkdhbGF0IHNhYXQgbWVuZ2FtYmlsIGthcGFiaWxpdGFzIGJhZ2kgZGl2YWlzICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiRGl2YWlzICclcycgYnVrYW4gdHVuZXIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiR2FnYWwgbWVuZGFwYXQgbWFzdWthbiByYWRpbyBwYWRhIGRpdmFpcyAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkdhZ2FsIG1lbmdhdHVyIG1hc3VrYW4gJWQgZGkgZGl2YWlzICVzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR2FnYWwgbWVuZ3ViYWgga2VhZGFhbiBiaXN1IHVudHVrIGRpdmFpcyAnJXMnLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiR2FnYWwgbWVuZ2Fsb2thc2lrYW4gbWVtb3JpIHlhbmcgZGlwZXJsdWthbi4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiR2FnYWwgbWVuZ2Fsb2thc2lrYW4gbWVtb3JpIHlhbmcgZGlwZXJsdWthbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiS29udmVydGVyIGRpIGRpdmFpcyAlcyB0aWRhayBtZW1wdW55YWkgZm9ybWF0IG1hc3VrYW4geWFuZyBkaWR1a3VuZyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiS29udmVydGVyIGRpIGRpdmFpcyAlcyB0aWRhayBtZW1wdW55YWkgZm9ybWF0IGtlbHVhcmFuIHlhbmcgZGlkdWt1bmciCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIlBlbnlhbmRpIGRpIGRpdmFpcyAlcyB0aWRhayBtZW1wdW55YWkgZm9ybWF0IG1hc3VrYW4geWFuZyBkaWR1a3VuZyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIlBlbnlhbmRpIGRpIGRpdmFpcyAlcyB0aWRhayBtZW1wdW55YWkgZm9ybWF0IGtlbHVhcmFuIHlhbmcgZGlkdWt1bmciCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiR2FnYWwgdW50dWsgbWVuamFsYW5rYW4gdGFsaSBhd2FzYW5kaS4iCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIkdhZ2FsIG1lbXByb3NlcyBiaW5na2FpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJHYWxhdCBtZW5kYXBhdGthbiBrZW1hbXB1YW4gdW50dWsgZGl2YWlzICclcyc6IEl0dSBidWthbiBkaXZlciB2NGwyLiBDZWsgIgorImFwYWthaCBpdHUgbWVydXBha2FuIGRyaXZlciB2NGwxLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIkdhZ2FsIGt1ZXJpIGF0cmlidXQgbWFzdWthbiAlZCBkaSBkaXZhaXMgJXMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR2FnYWwgbWVuZGFwYXRrYW4gcGVuZ2F0dXJhbiB0dW5lciAlZCBkaSBkaXZhaXMgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICJHYWdhbCBrdWVyaSBzdGFuZGFyIGRpIGRpdmFpcyAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR2FnYWwgbWVuZGFwYXRrYW4ga2VuZGFsaSBhdHJpYnV0IGRpIGRpdmFpcyAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJUYWsgZGFwYXQgbWVuZ2lkZW50aWZpa2FzaSBkaXZhaXMgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiSW5pIGJ1a2FuIGRpdmFpcyAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIlRhayBkYXBhdCBtZW1idWthIGRpdmFpcyAnJXMnIHVudHVrIGRpYmFjYSBkYW4gZGl0dWxpcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJEaXZhaXMgJyVzJyBidWthbiBkaXZhaXMgcGVuYW5na2FwLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiRGl2YWlzICclcycgYnVrYW4gZGl2YWlzIGtlbHVhcmFuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiRGl2YWlzICclcycgYnVrYW4gZGl2YWlzIE0yTS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIlRhayBkYXBhdCBtZW1idWthIGRpdmFpcyAnJXMnIHVudHVrIGRpYmFjYSBkYW4gZGl0dWxpcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkdhZ2FsIG1lbmdhdHVyIHN0YW5kYXIgdW50dWsgZGl2YWlzICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR2FnYWwgdW50dWsgbWVuZGFwYXRrYW4gZnJla3VlbnNpIHR1bmVyIHRlcmtpbmkgdW50dWsgZGl2YWlzICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIkdhZ2FsIG1lbmdhdHVyIGZyZWt1ZW5zaSB0dW5lciB0ZXJraW5pIHVudHVrIGRpdmFpcyAnJXMnIGtlICVsdSBIei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR2FnYWwgbWVuZGFwYXRrYW4ga2VrdWF0YW4gc2lueWFsIHVudHVrIGRpdmFpcyAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR2FnYWwgbWVuZGFwYXRrYW4gbmlsYWkgdW50dWsga2VuZGFsaSAlZCBkaSBkaXZhaXMgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkdhZ2FsIG1lbmdhdHVyIG5pbGFpICVkIHVudHVrIGtlbmRhbGkgJWQgZGkgZGl2YWlzICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiR2FnYWwgbWVuZGFwYXRrYW4gbWFzdWthbiB0ZXJraW5pIGRpIGRpdmFpcyAnJXMnLiBNdW5na2luIGl0dSBkaXZhaXMgcmFkaW8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIkdhZ2FsIG1lbmRhcGF0a2FuIGtlbHVhcmFuIHRlcmtpbmkgZGkgZGl2YWlzICclcycuIE11bmdraW4gaXR1IGRpdmFpcyByYWRpbyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJHYWdhbCBtZW5nYXR1ciBrZWx1YXJhbiAlZCBkaSBkaXZhaXMgJXMuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiTWVuZ3ViYWggcmVzb2x1c2kgc2FhdCB3YWt0dSBiZXJqYWxhbiBiZWx1bSBkaWR1a3VuZy4iCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIlRhayBkYXBhdCBiZXJvcGVyYXNpIHRhbnBhIGphbSIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiR2FsYXQgYXJ1cyBkYXRhIGludGVybmFsLiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgIkdhbGF0IGFsaXJhbiBkYXRhIGludGVybmFsLiIKKworI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAiRGl2YWlzICclcycgdGFrIG1lbmR1a3VuZyBwZW5hbmdrYXBhbiB2aWRlbyIKZGlmZiAtLWdpdCBhL3BvL2l0LnBvIGIvcG8vaXQucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQwYjU5MgotLS0gL2Rldi9udWxsCisrKyBiL3BvL2l0LnBvCkBAIC0wLDAgKzEsODE3IEBACisjIEl0YWxpYW4gdHJhbnNsYXRpb24gZm9yIGdzdC1wbHVnaW5zLWdvb2QgcGFja2FnZSBvZiBHU3RyZWFtZXIgcHJvamVjdC4KKyMgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwIEdTdHJlYW1lciBjb3JlIHRlYW0KKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdzdC1wbHVnaW5zLWdvb2QgcGFja2FnZS4KKyMKKyMgTHVjYSBGZXJyZXR0aSA8ZWxsZS51Y2FAaW5maW5pdG8uaXQ+LCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLgorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZCAwLjEwLjI1LjNcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxMC0xMC0yNSAxMDoxMSswMjAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBMdWNhIEZlcnJldHRpIDxlbGxlLnVjYUBpbmZpbml0by5pdD5cbiIKKyJMYW5ndWFnZS1UZWFtOiBJdGFsaWFuIDx0cEBsaXN0cy5saW51eC5pdD5cbiIKKyJMYW5ndWFnZTogaXRcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICJEZWNvZGlmaWNhIGRlbGwnaW1tYWdpbmUgSlBFRyBub24gcml1c2NpdGEiCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIsKrJXPCuyBkaSDCqyVzwrsiCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIkltcG9zc2liaWxlIGNvbm5ldHRlcnNpIGFsIHNlcnZlciIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJOZXNzdW4gVVJMIGltcG9zdGF0by4iCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIkltcG9zc2liaWxlIHJpc29sdmVyZSBpbCBub21lIGRlbCBzZXJ2ZXIuIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIkltcG9zc2liaWxlIHN0YWJpbGlyZSBsYSBjb25uZXNzaW9uZSBhbCBzZXJ2ZXIuIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiSW1wb3N0YXppb25lIGRlbGxhIGNvbm5lc3Npb25lIHNpY3VyYSBub24gcml1c2NpdGEuIgorCisjLCBmdXp6eQorbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIiIKKyJTaSDDqCB2ZXJpZmljYXRvIHVuIGVycm9yZSBkaSByZXRlLCBvcHB1cmUgaWwgc2VydmVyIGhhIGNoaXVzbyBsYSBjb25uZXNzaW9uZSAiCisiaW4gbW9kbyBpbmF0dGVzby4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIkluIHNlcnZlciBoYSBpbnZpYXRvIGRhdGkgZXJyYXRpLiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICJJbCBzZXJ2ZXIgbm9uIHN1cHBvcnRhIGlsIHBvc2l6aW9uYW1lbnRvLiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiIgorIkluZ3Jlc3NvIGF1ZGlvIGFzc2VudGUgbyBub24gdmFsaWRvLiBMbyBzdHJlYW0gQVZJIHJpc3VsdGVyw6AgZGFubmVnZ2lhdG8uIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJRdWVzdG8gZmlsZSBub24gY29udGllbmUgYWxjdW5vIHN0cmVhbSByaXByb2R1Y2liaWxlLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiUXVlc3RvIGZpbGUgbm9uIMOoIHZhbGlkbyBlIG5vbiBwdcOyIGVzc2VyZSByaXByb2RvdHRvLiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIlF1ZXN0byBmaWxlIMOoIGFsdGVyYXRvIGUgbm9uIHB1w7IgZXNzZXJlIHJpcHJvZG90dG8uIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIlF1ZXN0byBmaWxlIMOoIGluY29tcGxldG8gZSBub24gcHXDsiBlc3NlcmUgcmlwcm9kb3R0by4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIklsIHZpZGVvIGluIHF1ZXN0byBmaWxlIHBvdHJlYmJlIG5vbiBlc3NlcmUgcmlwcm9kb3R0byBjb3JyZXR0YW1lbnRlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICJRdWVzdG8gZmlsZSBjb250aWVuZSB0cm9wcGkgc3RyZWFtLiBSaXByb2RvdHRpIHNvbG8gaSBwcmltaSAlZCIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisiTm9uIMOoIHN0YXRvIHRyb3ZhdG8gYWxjdW5vIHN0cmVhbSBzdXBwb3J0YXRvLiBQb3RyZWJiZSBlc3NlcmUgbmVjZXNzYXJpbyAiCisiaW5zdGFsbGFyZSB1biBwbHVnaW4gR1N0cmVhbWVyIGRpIHRpcG8gZXN0ZW5zaW9uZSBSVFNQIHBlciBnbGkgc3RyZWFtIFJlYWwgIgorIm1lZGlhLiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorIk5vbiDDqCBzdGF0byB0cm92YXRvIGFsY3VubyBzdHJlYW0gc3VwcG9ydGF0by4gUG90cmViYmUgZXNzZXJlIG5lY2Vzc2FyaW8gIgorImFiaWxpdGFyZSBhbHRyaSBwcm90b2NvbGxpIGRpIHRyYXNwb3J0byBvcHB1cmUgaW4gYWx0ZXJuYXRpdmEgcG90cmViYmUgIgorIm1hbmNhcmUgaWwgY29ycmV0dG8gcGx1Z2luIEdTdHJlYW1lciBkaSB0aXBvIGVzdGVuc2lvbmUgUlRTUC4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiSW1wb3NzaWJpbGUgYXByaXJlIGlsIGRpc3Bvc2l0aXZvIGF1ZGlvIHBlciBsYSByaXByb2R1emlvbmUuIElsIGRpc3Bvc2l0aXZvICIKKyLDqCBhdHR1YWxtZW50ZSB1c2F0byBkYSB1bidhbHRyYSBhcHBsaWNhemlvbmUuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJJbXBvc3NpYmlsZSBhcHJpcmUgaWwgZGlzcG9zaXRpdm8gYXVkaW8gcGVyIGxhIHJpcHJvZHV6aW9uZS4gUGVybWVzc2kgbm9uICIKKyJzdWZmaWNpZW50aSBwZXIgYXByaXJlIGlsIGRpc3Bvc2l0aXZvLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJJbXBvc3NpYmlsZSBhcHJpcmUgaWwgZGlzcG9zaXRpdm8gYXVkaW8gcGVyIGxhIHJpcHJvZHV6aW9uZS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiSW1wb3NzaWJpbGUgYXByaXJlIGlsIGRldmljZSBhdWRpbyBwZXIgbGEgcmlwcm9kdXppb25lLiBRdWVzdGEgdmVyc2lvbmUgZGkgIgorIk9wZW4gU291bmQgU3lzdGVtIG5vbiDDqCBzdXBwb3J0YXRhIGRhIHF1ZXN0byBlbGVtZW50by4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiUXVlc3RvIGRldmljZSBhdWRpbyBub24gc3VwcG9ydGEgbGEgcmlwcm9kdXppb25lLiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiRXJyb3JlIG5lbCByaXByb2R1cnJlIGwnYXVkaW8uIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJRdWVzdG8gZGlzcG9zaXRpdm8gYXVkaW8gbm9uIHN1cHBvcnRhIGxhIHJlZ2lzdHJhemlvbmUuIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiRXJyb3JlIG5lbCByZWdpc3RyYXJlIGRhbCBkaXNwb3NpdGl2byBhdWRpby4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJJbXBvc3NpYmlsZSBhcHJpcmUgaWwgZGlzcG9zaXRpdm8gYXVkaW8gcGVyIGxhIHJlZ2lzdHJhemlvbmUuIFBlcm1lc3NpIG5vbiAiCisic3VmZmljaWVudGkgcGVyIGFwcmlyZSBpbCBkaXNwb3NpdGl2by4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIkltcG9zc2liaWxlIGFwcmlyZSBpbCBkaXNwb3NpdGl2byBhdWRpbyBwZXIgbGEgcmVnaXN0cmF6aW9uZS4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICIiCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICJTb3JnZW50ZSByZWdpc3RyYXppb25lIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWljcm9mb25vIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiTGluZWEgaW4iCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiQ0QgaW50ZXJubyIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJTUERJRiBpbiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJBVVggMSBpbiIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJBVVggMiBpbiIKKworIywgZnV6enkKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiTG9vcGJhY2siCisKKyMsIGZ1enp5Cittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJMb29wYmFjayIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiVm9sdW1lIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiR3VhZGFnbm8iCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJNb25pdG9yIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiQWx0b3AuIGluY29ycG9yYXRvIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICJDdWZmaWEiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiTGluZWEgb3V0IgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJTUERJRiBvdXQiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIkFVWCAxIG91dCIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiQVVYIDIgb3V0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkVycm9yZSBuZWwgbGVnZ2VyZSAlZCBieXRlIGRhbCBkZXZpY2Ugwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJJbXBvc3NpYmlsZSBtYXBwYXJlIGRlaSBidWZmZXIgZGFsIGRldmljZSDCqyVzwrsuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiSWwgZHJpdmVyIGRlbCBkZXZpY2Ugwqslc8K7IG5vbiBzdXBwb3J0YSBhbGN1biBtZXRvZG8gZGkgY2F0dHVyYSBub3RvLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICJJbCBkcml2ZXIgZGVsIGRldmljZSDCqyVzwrsgbm9uIHN1cHBvcnRhIGFsY3VuIG1ldG9kbyBkaSBjYXR0dXJhIG5vdG8uIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJJbCBkZXZpY2Ugwqslc8K7IG5vbiDDqCB1biBkaXNwb3NpdGl2byBkaSB1c2NpdGEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiSWwgZGV2aWNlIMKrJXPCuyBub24gw6ggdW4gZGlzcG9zaXRpdm8gZGkgY2F0dHVyYS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJJbCBkZXZpY2Ugwqslc8K7IG5vbiDDqCB1biBkaXNwb3NpdGl2byBkaSBjYXR0dXJhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiSWwgZGV2aWNlIMKrJXPCuyBub24gw6ggdW4gZGlzcG9zaXRpdm8gZGkgdXNjaXRhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIkltcG9zc2liaWxlIG90dGVuZXJlIGkgcGFyYW1ldHJpIHN1bCBkZXZpY2Ugwqslc8K7IgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiIgorIklsIGRldmljZSBkaSBpbmdyZXNzbyB2aWRlbyBub24gYWNjZXR0YSBsYSBudW92YSBpbXBvc3RhemlvbmUgc3VsIGZyYW1lIHJhdGUuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIiIKKyJJbCBkZXZpY2UgZGkgaW5ncmVzc28gdmlkZW8gbm9uIGFjY2V0dGEgbGEgbnVvdmEgaW1wb3N0YXppb25lIHN1bCBmcmFtZSByYXRlLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiSWwgZHJpdmVyIGRlbCBkZXZpY2Ugwqslc8K7IG5vbiBzdXBwb3J0YSBhbGN1biBtZXRvZG8gZGkgY2F0dHVyYSBub3RvLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICJJbCBkcml2ZXIgZGVsIGRldmljZSDCqyVzwrsgbm9uIHN1cHBvcnRhIGFsY3VuIG1ldG9kbyBkaSBjYXR0dXJhIG5vdG8uIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIiIKKyJJbCBkZXZpY2UgZGkgaW5ncmVzc28gdmlkZW8gbm9uIGFjY2V0dGEgbGEgbnVvdmEgaW1wb3N0YXppb25lIHN1bCBmcmFtZSByYXRlLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJSZWN1cGVybyBkZWxsZSBpbXBvc3RhemlvbmkgZGVsIHNpbnRvbml6emF0b3JlICVkIHN1bCBkZXZpY2Ugwqslc8K7IG5vbiAiCisicml1c2NpdG8uIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJFcnJvcmUgbmVsIGxlZ2dlcmUgJWQgYnl0ZSBkYWwgZGV2aWNlIMKrJXPCuy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiSWwgZGV2aWNlIMKrJXPCuyBub24gw6ggdW4gZGlzcG9zaXRpdm8gZGkgdXNjaXRhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJJbXBvc3RhemlvbmUgZGVsbCdpbmdyZXNzbyAlZCBzdWwgZGV2aWNlIMKrJXPCuyBub24gcml1c2NpdGEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiSW1wb3N0YXppb25lIGRlbGwnaW5ncmVzc28gJWQgc3VsIGRldmljZSDCqyVzwrsgbm9uIHJpdXNjaXRhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlJlY3VwZXJvIGRlbGwnaW50ZW5zaXTDoCBkZWwgc2VnbmFsZSBwZXIgaWwgZGV2aWNlIMKrJXPCuyBub24gcml1c2NpdG8uIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJJbCBkcml2ZXIgZGVsIGRldmljZSDCqyVzwrsgbm9uIHN1cHBvcnRhIGFsY3VuIG1ldG9kbyBkaSBjYXR0dXJhIG5vdG8uIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIklsIGRldmljZSBkaSBpbmdyZXNzbyB2aWRlbyBub24gYWNjZXR0YSBsYSBudW92YSBpbXBvc3RhemlvbmUgc3VsIGZyYW1lIHJhdGUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIklsIGRldmljZSBkaSBpbmdyZXNzbyB2aWRlbyBub24gYWNjZXR0YSBsYSBudW92YSBpbXBvc3RhemlvbmUgc3VsIGZyYW1lIHJhdGUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJJbCBkZXZpY2UgZGkgaW5ncmVzc28gdmlkZW8gbm9uIGFjY2V0dGEgbGEgbnVvdmEgaW1wb3N0YXppb25lIHN1bCBmcmFtZSByYXRlLiIKKworIywgZnV6enkKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiRGVjb2RpZmljYSBkZWxsJ2ltbWFnaW5lIEpQRUcgbm9uIHJpdXNjaXRhIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisiRXJyb3JlIG5lbGwnb3R0ZW5lcmUgbGUgZnVuemlvbmFsaXTDoCBwZXIgaWwgZGV2aWNlIMKrJXPCuzogbm9uIMOoIHVuIGRyaXZlciAiCisidjRsMi4gQ29udHJvbGxhcmUgc2Ugc2kgdHJhdHRhIGRpIHVuIGRyaXZlciB2NGwxLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIiIKKyJJbnRlcnJvZ2F6aW9uZSBkZWdsaSBhdHRyaWJ1dGkgZGVsbCdpbnB1dCAlZCBuZWwgZGV2aWNlICVzIG5vbiByaXVzY2l0YSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiUmVjdXBlcm8gZGVsbGUgaW1wb3N0YXppb25pIGRlbCBzaW50b25penphdG9yZSAlZCBzdWwgZGV2aWNlIMKrJXPCuyBub24gIgorInJpdXNjaXRvLiIKKworIyAgbm9ybSDDqCB1biBwYXJhbWVudHJvIHBhcmkgYSBudHNjIG8gcGFsIChlIGZvcnNlIGFsdHJvLiBTaSBldmluY2UgYWQgZXNlbXBpbworIyAgZGFsIGNvbWFuZG8gZGkgVmlkZW8gTGFuIENsaWVuCisjCisjICAgICB2bGMgLS1jb2xvciAgIyAgICB2NGw6L2Rldi92aWRlbzI6bm9ybT1udHNjOmZyZXF1ZW5jeT03NzI1MDpzaXplPTY0MHg0ODA6IyAgICBhZGV2PS9kZXYvZHNwMjphdWRpbz0wICguLi4pCisjCisjICBRdWFsY2hlIGlkZWEgZGl2ZXJzYSBkYSBub3JtYT8gIC1MdWNhCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiSW50ZXJyb2dhemlvbmUgZGkgbm9ybSBzdWwgZGV2aWNlIMKrJXPCuyBub24gcml1c2NpdGEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJSZWN1cGVybyBkZWdsaSBhdHRyaWJ1dGkgZGVpIGNvbnRyb2xsaSBzdWwgZGV2aWNlIMKrJXPCuyBub24gcml1c2NpdG8uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkltcG9zc2liaWxlIGlkZW50aWZpY2FyZSBpbCBkZXZpY2Ugwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJRdWVzdG8gbm9uIMOoIHVuIGRpc3Bvc2l0aXZvIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJJbXBvc3NpYmlsZSBhcHJpcmUgaWwgZGV2aWNlIMKrJXPCuyBpbiBsZXR0dXJhIGUgc2NyaXR0dXJhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIklsIGRldmljZSDCqyVzwrsgbm9uIMOoIHVuIGRpc3Bvc2l0aXZvIGRpIGNhdHR1cmEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJJbCBkZXZpY2Ugwqslc8K7IG5vbiDDqCB1biBkaXNwb3NpdGl2byBkaSB1c2NpdGEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiSWwgZGV2aWNlIMKrJXPCuyBub24gw6ggdW4gZGlzcG9zaXRpdm8gZGkgdXNjaXRhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIkltcG9zc2liaWxlIGFwcmlyZSBpbCBkZXZpY2Ugwqslc8K7IGluIGxldHR1cmEgZSBzY3JpdHR1cmEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJJbXBvc3RhemlvbmUgZGkgbm9ybSBwZXIgaWwgZGV2aWNlIMKrJXPCuyBub24gcml1c2NpdGEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIlJlY3VwZXJvIGRlbGwnYXR0dWFsZSBmcmVxdWVuemEgZGkgc2ludG9uaXp6YXppb25lIHBlciBpbCBkZXZpY2Ugwqslc8K7IG5vbiAiCisicml1c2NpdGEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIiIKKyJJbXBvc3RhemlvbmUgZGVsbCdhdHR1YWxlIGZyZXF1ZW56YSBkaSBzaW50b25penphemlvbmUgcGVyIGlsIGRldmljZSDCqyVzwrsgYSAiCisiJWx1IEh6IG5vbiByaXVzY2l0YS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiUmVjdXBlcm8gZGVsbCdpbnRlbnNpdMOgIGRlbCBzZWduYWxlIHBlciBpbCBkZXZpY2Ugwqslc8K7IG5vbiByaXVzY2l0by4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlJlY3VwZXJvIGRlbCB2YWxvcmUgcGVyIGlsIGNvbnRyb2xsbyAlZCBzdWwgZGV2aWNlIMKrJXPCuyBub24gcml1c2NpdG8uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiSW1wb3N0YXppb25lIGFsIHZhbG9yZSAlZCBwZXIgaWwgY29udHJvbGxvICVkIHN1bCBkZXZpY2Ugwqslc8K7IG5vbiByaXVzY2l0by4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJSZWN1cGVybyBkZWxsJ2F0dHVhbGUgaW5ncmVzc28gc3VsIGRldmljZSDCqyVzwrsgbm9uIHJpdXNjaXRvLiBGb3JzZSDDqCB1biAiCisiZGlzcG9zaXRpdm8gcmFkaW8iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJSZWN1cGVybyBkZWxsJ2F0dHVhbGUgaW5ncmVzc28gc3VsIGRldmljZSDCqyVzwrsgbm9uIHJpdXNjaXRvLiBGb3JzZSDDqCB1biAiCisiZGlzcG9zaXRpdm8gcmFkaW8iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkltcG9zdGF6aW9uZSBkZWxsJ2luZ3Jlc3NvICVkIHN1bCBkZXZpY2Ugwqslc8K7IG5vbiByaXVzY2l0YS4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICIiCisiSWwgY2FtYmlvIGRlbGxhIHJpc29sdXppb25lIGR1cmFudGUgbCdlc2VjdXppb25lIG5vbiDDqCBhbmNvcmEgc3VwcG9ydGF0by4iCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIkltcG9zc2liaWxlIG9wZXJhcmUgc2VuemEgdW4gY2xvY2siCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIkVycm9yZSBpbnRlcm5vIG5lbGxvIHN0cmVhbSBkZWkgZGF0aS4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJFcnJvcmUgaW50ZXJubyBuZWwgZmx1c3NvIGRpIGRhdGkuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAiSWwgZGV2aWNlIMKrJXPCuyBub24gw6ggdW4gZGlzcG9zaXRpdm8gZGkgdXNjaXRhLiIKKworI34gbXNnaWQgIkdvdCB1bmV4cGVjdGVkIGZyYW1lIHNpemUgb2YgJXUgaW5zdGVhZCBvZiAldS4iCisjfiBtc2dzdHIgIk90dGVudXRhIGRpbWVuc2lvbmUgaW5hdHRlc2EgZGVsIGZvdG9ncmFtbWE6ICV1IGludmVjZSBkaSAldS4iCisKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIiIKKyN+ICJUZW50YXRpdm8gZGkgb3R0ZW5lcmUgZm90b2dyYW1taSB2aWRlbyBkYWwgZGV2aWNlIMKrJXPCuyBub24gcml1c2NpdG8uIgorCisjfiBtc2dpZCAiRmFpbGVkIGFmdGVyICVkIHRyaWVzLiBkZXZpY2UgJXMuIHN5c3RlbSBlcnJvcjogJXMiCisjfiBtc2dzdHIgIkZhbGxpdG8gZG9wbyAlZCB0ZW50YXRpdmkuIERldmljZSAlcy4gRXJyb3JlIGRpIHNpc3RlbWE6ICVzIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAiQmFzc2kiCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgIkFjdXRpIgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIlNpbnRldGl6IgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJBbHRvcGFybCIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIkxpbmVhIGluIgorCisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgIkNEIgorCisjfiBtc2dpZCAiTWl4ZXIiCisjfiBtc2dzdHIgIk1peGVyIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICJSZWdpc3RyIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAiR3VhZCBpbiIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICJHdWFkIG91dCIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAiQ2FuYWxlIDEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIkNhbmFsZSAyIgorCisjfiBtc2dpZCAiTGluZS0zIgorI34gbXNnc3RyICJDYW5hbGUgMyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAiRGlnaXRhbCAxIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICJEaWdpdGFsIDIiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIkRpZ2l0YWwgMyIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICJUZWxlZm9ubyBpbiIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAiVGVsZWZvbm8gb3V0IgorCisjfiBtc2dpZCAiVmlkZW8iCisjfiBtc2dzdHIgIlZpZGVvIgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgIlJhZGlvIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiIgorI34gIkltcG9zc2liaWxlIGFwcmlyZSBpbCBkZXZpY2UgYXVkaW8gcGVyIGxhIGdlc3Rpb25lIGRlbGxhIHJlZ29sYXppb25lIGRlbCAiCisjfiAibWl4ZXIuIgorCisjfiBtc2dpZCAiIgorI34gIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4gVGhpcyB2ZXJzaW9uIG9mICIKKyN+ICJ0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiSW1wb3NzaWJpbGUgYXByaXJlIGlsIGRldmljZSBhdWRpbyBwZXIgbGEgZ2VzdGlvbmUgZGVsbGEgcmVnb2xhemlvbmUgZGVsICIKKyN+ICJtaXhlci4gUXVlc3RhIHZlcnNpb25lIGRpIE9wZW4gU291bmQgU3lzdGVtIG5vbiDDqCBzdXBwb3J0YXRhIGRhIHF1ZXN0byAiCisjfiAiZWxlbWVudG8uIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICJQcmluY2lwYWxlIgorCisjfiBtc2dpZCAiRnJvbnQiCisjfiBtc2dzdHIgIkZyb250ZSIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIkRpZXRybyIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkN1ZmZpZSIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAiQ2VudHJhbGUiCisKKyMgTmRUOiBsZmUgYW5kcmViYmUgdHJhZG90dG8gY29tZSBlZmZldHRpIGEgYmFzc2EgZnJlcXVlbnphIGUgYW5kcmViYmUgYXBlcnRvIHVuIGJ1ZyBwZXIgbG93IGZyZXF1ZW5jeSBlbWl0dGVyIGNoZSBhbCBsaW1pdGUgw6ggbGEgY2Fzc2EgbWEgbm9uIGlsIGNhbmFsZQorI34gbXNnaWQgIkxGRSIKKyN+IG1zZ3N0ciAiTEZFIgorCisjfiBtc2dpZCAiU3Vycm91bmQiCisjfiBtc2dzdHIgIlN1cnJvdW5kIgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAiTGF0ZXJhbGUiCisKKyN+IG1zZ2lkICJBVVggT3V0IgorI34gbXNnc3RyICJBVVggb3V0IgorCisjfiBtc2dpZCAiM0QgRGVwdGgiCisjfiBtc2dzdHIgIlByb2ZvbmRpdMOgIDNEIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICJDZW50cm8gM0QiCisKKyN+IG1zZ2lkICIzRCBFbmhhbmNlIgorI34gbXNnc3RyICJQcm9mb25kaXTDoCAzRCIKKworI34gbXNnaWQgIlRlbGVwaG9uZSIKKyN+IG1zZ3N0ciAiVGVsZWZvbm8iCisKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAiVmlkZW8gaW4iCisKKyN+IG1zZ2lkICJBVVggSW4iCisjfiBtc2dzdHIgIkFVWCBpbiIKKworI34gbXNnaWQgIlJlY29yZCBHYWluIgorI34gbXNnc3RyICJHdWFkYWdubyByZWdpc3RyYXppb25lIgorCisjfiBtc2dpZCAiT3V0cHV0IEdhaW4iCisjfiBtc2dzdHIgIkd1YWRhZ25vIHVzY2l0YSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgQm9vc3QiCisjfiBtc2dzdHIgIkluY3JlbWVudG8gbWljcm9mb25vIgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAiRGlhZ25vc3RpY2EiCisKKyN+IG1zZ2lkICJCYXNzIEJvb3N0IgorI34gbXNnc3RyICJJbmNyZW1lbnRvIGJhc3NpIgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgIlBvcnRlIHJpcHJvZHV6aW9uZSIKKworI34gbXNnaWQgIklucHV0IgorI34gbXNnc3RyICJJbnB1dCIKKworI34gbXNnaWQgIk1vbml0b3IgU291cmNlIgorI34gbXNnc3RyICJTb3JnZW50ZSBtb25pdG9yIgorCisjfiBtc2dpZCAiS2V5Ym9hcmQgQmVlcCIKKyN+IG1zZ3N0ciAiQmVlcCB0YXN0aWVyYSIKKworI34gbXNnaWQgIlNpbXVsYXRlIFN0ZXJlbyIKKyN+IG1zZ3N0ciAiU2ltdWxhIHN0ZXJlbyIKKworI34gbXNnaWQgIlN0ZXJlbyIKKyN+IG1zZ3N0ciAiU3RlcmVvIgorCisjfiBtc2dpZCAiU3Vycm91bmQgU291bmQiCisjfiBtc2dzdHIgIlN1b25vIHN1cnJvdW5kIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBHYWluIgorI34gbXNnc3RyICJHdWFkYWdubyBtaWNyb2Zvbm8iCisKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAiU29yZ2VudGUgYWx0b3BhcmxhbnRlIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgIlNvcmdlbnRlIG1pY3JvZm9ubyIKKworI34gbXNnaWQgIkphY2siCisjfiBtc2dzdHIgIkphY2siCisKKyMgdmVkaSBwcmltYSBwZXIgTEZFCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICJDZW50cmFsZSAvIExGRSIKKworI34gbXNnaWQgIlN0ZXJlbyBNaXgiCisjfiBtc2dzdHIgIk1peCBzdGVyZW8iCisKKyN+IG1zZ2lkICJNb25vIE1peCIKKyN+IG1zZ3N0ciAiTWl4IG1vbm8iCisKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgIk1peCBpbmdyZXNzbyIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAiTWljcm9mb25vIDEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDIiCisjfiBtc2dzdHIgIk1pY3JvZm9ubyAyIgorCisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIlVzY2l0YSBkaWdpdGFsZSIKKworI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgIkluZ3Jlc3NvIGRpZ2l0YWxlIgorCisjfiBtc2dpZCAiSERNSSIKKyN+IG1zZ3N0ciAiSERNSSIKKworI34gbXNnaWQgIk1vZGVtIgorI34gbXNnc3RyICJNb2RlbSIKKworI34gbXNnaWQgIkhhbmRzZXQiCisjfiBtc2dzdHIgIkF1cmljb2xhcmUiCisKKyN+IG1zZ2lkICJPdGhlciIKKyN+IG1zZ3N0ciAiQWx0cm8iCisKKyN+IG1zZ2lkICJOb25lIgorI34gbXNnc3RyICJOZXNzdW5vIgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgIkFjY2VzbyIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAiU3BlbnRvIgorCisjfiBtc2dpZCAiTXV0ZSIKKyN+IG1zZ3N0ciAiRXNjbHVzbyIKKworI34gbXNnaWQgIkZhc3QiCisjfiBtc2dzdHIgIlZlbG9jZSIKKworI34gbXNnaWQgIlZlcnkgTG93IgorI34gbXNnc3RyICJNb2x0byBsZW50byIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAiTGVudG8iCisKKyN+IG1zZ2lkICJNZWRpdW0iCisjfiBtc2dzdHIgIk1lZGlvIgorCisjfiBtc2dpZCAiSGlnaCIKKyN+IG1zZ3N0ciAiQWx0byIKKworI34gbXNnaWQgIlZlcnkgSGlnaCIKKyN+IG1zZ3N0ciAiTW9sdG8gYWx0byIKKworI34gbXNnaWQgIlByb2R1Y3Rpb24iCisjfiBtc2dzdHIgIlByb2R1emlvbmUiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICJNaWNyb2Zvbm8gcGFubmVsbG8gZnJvbnRhbGUiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICJMaW5lYSBpbiBwYW5uZWxsbyBmcm9udGFsZSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIEhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkN1ZmZpZSBwYW5uZWxsbyBmcm9udGFsZSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICJMaW5lYSBvdXQgcGFubmVsbG8gZnJvbnRhbGUiCisKKyN+IG1zZ2lkICJHcmVlbiBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5ldHRvcmUgdmVyZGUiCisKKyN+IG1zZ2lkICJQaW5rIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmV0dG9yZSByb3NhIgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5ldHRvcmUgYmx1IgorCisjfiBtc2dpZCAiV2hpdGUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZXR0b3JlIGJpYW5jbyIKKworI34gbXNnaWQgIkJsYWNrIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmV0dG9yZSBuZXJvIgorCisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5ldHRvcmUgZ3JpZ2lvIgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmV0dG9yZSBhcmFuY2lvbmUiCisKKyN+IG1zZ2lkICJSZWQgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZXR0b3JlIHJvc3NvIgorCisjfiBtc2dpZCAiWWVsbG93IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmV0dG9yZSBnaWFsbG8iCisKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5ldHRvcmUgdmVyZGUgcGFubmVsbG8gZnJvbnRhbGUiCisKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmV0dG9yZSByb3NhIHBhbm5lbGxvIGZyb250YWxlIgorCisjfiBtc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5ldHRvcmUgYmx1IHBhbm5lbGxvIGZyb250YWxlIgorCisjfiBtc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZXR0b3JlIGJpYW5jbyBwYW5uZWxsbyBmcm9udGFsZSIKKworI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmV0dG9yZSBuZXJvIHBhbm5lbGxvIGZyb250YWxlIgorCisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5ldHRvcmUgZ3JpZ2lvIHBhbm5lbGxvIGZyb250YWxlIgorCisjfiBtc2dpZCAiT3JhbmdlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmV0dG9yZSBhcmFuY2lvbmUgcGFubmVsbG8gZnJvbnRhbGUiCisKKyN+IG1zZ2lkICJSZWQgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZXR0b3JlIHJvc3NvIHBhbm5lbGxvIGZyb250YWxlIgorCisjfiBtc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmV0dG9yZSBnaWFsbG8gcGFubmVsbG8gZnJvbnRhbGUiCisKKyMgIGludCBzcHJlYWQ7ICAgICAgICAgLyogY29weSBmcm9udCB0byBzdXJyL2NlbnRlciBjaGFubmVscyAqLyAKKyN+IG1zZ2lkICJTcHJlYWQgT3V0cHV0IgorI34gbXNnc3RyICJVc2NpdGEgZGlmZnVzYSIKKworI34gbXNnaWQgIkRvd25taXgiCisjfiBtc2dzdHIgIkRvd25taXgiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIElucHV0IgorI34gbXNnc3RyICJJbmdyZXNzbyBtaXhlciB2aXJ0dWFsZSIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgT3V0cHV0IgorI34gbXNnc3RyICJVc2NpdGEgbWl4ZXIgdmlydHVhbGUiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICJDYW5hbGkgbWl4ZXIgdmlydHVhbGUiCisKKyN+IG1zZ2lkICIlcyAlZCBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiRnVuemlvbmUgJXMgJWQiCisKKyN+IG1zZ2lkICIlcyBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiRnVuemlvbmUgJXMiCisKKyN+IG1zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIG9uIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiRXJyb3JlIG5lbCBsZWdnZXJlICVkIGJ5dGUgc3VsIGRldmljZSDCqyVzwrsuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkltcG9zc2liaWxlIGFjY29kYXJlIGkgYnVmZmVyIG5lbCBkZXZpY2Ugwqslc8K7LiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIkltcG9zc2liaWxlIHN0YWJpbGlyZSBsYSBjb25uZXNzaW9uZSBhbCBzZXJ2ZXIgYXVkaW8iCisKKyN+IG1zZ2lkICJGYWlsZWQgdG8gcXVlcnkgc291bmQgc2VydmVyIGNhcGFiaWxpdGllcyIKKyN+IG1zZ3N0ciAiSW50ZXJyb2dhemlvbmUgZGVsbGUgZnVuemlvbmFsaXTDoCBkZWwgc2VydmVyIGF1ZGlvIG5vbiByaXVzY2l0YSIKZGlmZiAtLWdpdCBhL3BvL2phLnBvIGIvcG8vamEucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4NzEyNAotLS0gL2Rldi9udWxsCisrKyBiL3BvL2phLnBvCkBAIC0wLDAgKzEsOTMwIEBACisjIEphcGFuZXNlIHRyYW5zbGF0aW9uIGZvciBnc3QtcGx1Z2lucy1nb29kLgorIyBUaGlzIGZpbGUgaXMgcHV0IGluIHRoZSBwdWJsaWMgZG9tYWluLgorIworIyBUYWthbyBGdWppd2FyYSA8dGFrYW8uZnVqaXdhcmFAc3VuLmNvbT4sIDIwMDYuCisjIE1ha290byBLYXRvIDxtYWtvdG8ua3RAZ21haWwuY29tPiwgMjAwOS0yMDExLgorIyBUYWtlc2hpIEhhbWFzYWtpIDxobWF0cmpwQHVzZXJzLnNvdXJjZWZvcmdlLmpwPiwgMjAxMS0yMDEyCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDEuMC4zXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTItMTItMjIgMjA6MTMrMDkwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogVGFrZXNoaSBIYW1hc2FraSA8aG1hdHJqcEB1c2Vycy5zb3VyY2Vmb3JnZS5qcD5cbiIKKyJMYW5ndWFnZS1UZWFtOiBKYXBhbmVzZSA8dHJhbnNsYXRpb24tdGVhbS1qYUBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+XG4iCisiTGFuZ3VhZ2U6IGphXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiWC1HZW5lcmF0b3I6IFBvZWRpdCAxLjUuNFxuIgorIlBsdXJhbC1Gb3JtczogbnBsdXJhbHM9MTsgcGx1cmFsPTA7XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiSlBFR+eUu+WDj+OBruODh+OCs+ODvOODieOBq+WkseaVl+OBl+OBvuOBl+OBnyIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiJyVzJyAsICclcyciCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIuOCteODvOODkOODvOOBuOaOpee2muOBp+OBjeOBvuOBm+OCkyIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJVUkzjgYzmjIflrprjgZXjgozjgabjgYTjgb7jgZvjgpPjgIIiCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIuOCteODvOODkOODvOWQjeOCkuino+axuuOBp+OBjeOBvuOBm+OCk+OAgiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICLjgrXjg7zjg5Djg7zjgbjjga7mjqXntprjgpLnorrnq4vjgafjgY3jgb7jgZvjgpPjgIIiCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICLjgrvjgq3jg6XjgqLmjqXntprjga7jgrvjg4Pjg4jjgqLjg4Pjg5fjgavlpLHmlZfjgZfjgb7jgZfjgZ/jgIIiCisKKyMsIGZ1enp5Cittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAi44ON44OD44OI44Ov44O844Kv44Ko44Op44O844GM55m655Sf44GX44Gf44GL44CB44K144O844OQ44O844GM5LqI5pyf44Gb44Ga5o6l57aa44KS6ZaJ44GY44G+44GX44Gf44CCIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICLjgrXjg7zjg5DjgYzkuI3mraPjgarjg4fjg7zjgr/jgpLpgIHkv6HjgZfjgb7jgZfjgZ/jgIIiCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAi44K144O844OQ44O844Gv44K344O844Kv44KS44K144Od44O844OI44GX44Gm44GE44G+44Gb44KT44CCIgorCisjIFNVTiBSRVZJRVdFRAorbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAi5YWl5Yqb44Kq44O844OH44Kj44Kq44GM5a2Y5Zyo44GX44Gq44GE44GL54Sh5Yq544Gn44GC44KL44Gf44KB44CBQVZJIOOCueODiOODquODvOODoOOBr+WjiuOCjOOBvuOBmeOAgiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAi44GT44Gu44OV44Kh44Kk44Or44Gr44Gv5YaN55Sf5LiN5Y+v6IO944Gq44K544OI44Oq44O844Og44GM5ZCr44G+44KM44Gm44GE44G+44GZIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICLjgZPjga7jg5XjgqHjgqTjg6vjga/kuI3mraPjgarjgZ/jgoHlho3nlJ/jgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZvjgpMiCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICLjgZPjga7jg5XjgqHjgqTjg6vjga/lo4rjgozjgabjgYTjgovjgZ/jgoHlho3nlJ/jgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZvjgpMiCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIuS4jeato+OBquOCouODiOODoOOCteOCpOOCuiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAi44GT44Gu44OV44Kh44Kk44Or44Gv5q2j5bi444Gn44Gv44Gq44GE44Gf44KB44CB5YaN55Sf44GZ44KL44GT44Go44GM44Gn44GN44G+44Gb44KTIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICLjgZPjga7jg5XjgqHjgqTjg6vjga7kuK3jga7li5XnlLvjga/mraPjgZfjgY/lho3nlJ/jgafjgY3jgarjgYTjgYvjgoLjgZfjgozjgb7jgZvjgpMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiIgorIuOBk+OBruODleOCoeOCpOODq+OBq+OBr+WkmuOBj+OBruOCueODiOODquODvOODoOOBjOagvOe0jeOBleOCjOOBpuOBhOOCi+OBn+OCgeOAgeacgOWIneOBriAlZCDlgIvjga7jgb/lho3nlJ/jgZciCisi44G+44GZIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyLjgrXjg53jg7zjg4jjgZfjgabjgYTjgovjgrnjg4jjg6rjg7zjg6DjgYzopovjgaTjgYvjgorjgb7jgZvjgpPjgIJSZWFsIOODoeODh+OCo+OCouOCueODiOODquODvOODoOOBruOBn+OCgeOBriIKKyJHU3RyZWFtZXIgUlRTUCDmi6HlvLXjg5fjg6njgrDjgqTjg7PjgpLjgqTjg7Pjgrnjg4jjg7zjg6vjgZnjgovlv4XopoHjgYzjgYLjgovjgYvjgoLjgZfjgozjgb7jgZvjgpPjgIIiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyLjgrXjg53jg7zjg4jjgZfjgabjgYTjgovjgrnjg4jjg6rjg7zjg6DjgYzopovjgaTjgYvjgorjgb7jgZvjgpPjgILliKXjga7ou6LpgIHjg5fjg63jg4jjgrPjg6vjgpLjgqTjg7Pjgrnjg4jjg7zjg6siCisi44GZ44KL5b+F6KaB44GM44GC44KL44GL44KC44GX44KM44G+44Gb44KT44CC44G+44Gf44Gv44CB5q2j44GX44GEIEdTdHJlYW1lciBSVFNQIOaLoeW8teODl+ODqeOCsOOCpOODs+OBjCIKKyLjgarjgYTjga7jgYvjgoLjgZfjgozjgb7jgZvjgpPjgIIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisi5YaN55Sf55So44Gr44Kq44O844OH44Kj44Kq44OH44OQ44Kk44K544KS6ZaL44GP44GT44Go44GM44Gn44GN44G+44Gb44KT44Gn44GX44Gf44CC44OH44OQ44Kk44K544GM5LuW44Gu44Ki44OX44OqIgorIuOCseODvOOCt+ODp+ODs+OBp+WIqeeUqOOBleOCjOOBpuOBhOOBvuOBmSIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisi5YaN55Sf55So44Gr44Kq44O844OH44Kj44Kq44OH44OQ44Kk44K544KS6ZaL44GP44GT44Go44GM44Gn44GN44G+44Gb44KT44Gn44GX44Gf44CC44OH44OQ44Kk44K544KS6ZaL44GP44Gf44KB44GuIgorIuaoqemZkOOBjOOBguOCiuOBvuOBm+OCk+OAgiIKKworIyBTVU4gUkVWSUVXRUQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAi6Z+z5aOw44OH44OQ44Kk44K544KS6Kqt44G/5Y+W44KK55So44Gr6ZaL44GP44GT44Go44GM44Gn44GN44G+44Gb44KT44CCIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIuWGjeeUn+eUqOOBq+OCquODvOODh+OCo+OCquODh+ODkOOCpOOCueOCkumWi+OBj+OBk+OBqOOBjOOBp+OBjeOBvuOBm+OCk+OBp+OBl+OBn+OAguOBk+OBruODkOODvOOCuOODp+ODs+OBriAiCisiT3BlbiBTb3VuZCBTeXN0ZW0g44Gv44CB44GT44Gu44Ko44Os44Oh44Oz44OI44Gr44KI44Gj44Gm44K144Od44O844OI44GV44KM44Gm44GE44G+44Gb44KT44CCIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIuWGjeeUn+OBr+OBk+OBruOCquODvOODh+OCo+OCquODh+ODkOOCpOOCueOBp+OBr+OCteODneODvOODiOOBleOCjOOBpuOBhOOBvuOBm+OCk+OAgiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAi44Kq44O844OH44Kj44Kq5YaN55Sf44Ko44Op44O844Gn44GZ44CCIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLjgZPjga7jgqrjg7zjg4fjgqPjgqrjg4fjg5DjgqTjgrnjgavjgojjgaPjgabpjLLpn7Pjga/jgrXjg53jg7zjg4jjgZXjgozjgabjgYTjgb7jgZvjgpPjgIIiCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLjgqrjg7zjg4fjgqPjgqrjg4fjg5DjgqTjgrnjgYvjgonjga7pjLLpn7PmmYLjgavjgqjjg6njg7zjgYznmbrnlJ/jgZfjgb7jgZfjgZ/jgIIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyLpjLLpn7PnlKjjgavjgqrjg7zjg4fjgqPjgqrjg4fjg5DjgqTjgrnjgpLplovjgY/jgZPjgajjgYzjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ/jgILjg4fjg5DjgqTjgrnjgpLplovjgY/jgZ/jgoHjga4iCisi5qip6ZmQ44GM44GC44KK44G+44Gb44KT44CCIgorCisjIFNVTiBSRVZJRVdFRAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAi6Z+z5aOw44OH44OQ44Kk44K544KS6Yyy6Z+z55So44Gr6ZaL44GP44GT44Go44GM44Gn44GN44G+44Gb44KT44CCIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAi6Yyy6Z+z44K944O844K5IgorCisjIFNVTiBSRVZJRVdFRAorbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIuODnuOCpOOCr+ODreODleOCqeODsyIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIuODqeOCpOODs+WFpeWKmyIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICLlhoXolLVDRCIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJTUERJRuWFpeWKmyIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJBVVggMeWFpeWKmyIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJBVVggMuWFpeWKmyIKKworIywgZnV6enkKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAi44Or44O844OX44OQ44OD44KvIgorCisjLCBmdXp6eQorbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAi44Or44O844OX44OQ44OD44KvIgorCisjIFNVTiBSRVZJRVdFRAorbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAi6Z+z6YePIgorCisjIFNVTiBSRVZJRVdFRAorbXNnaWQgIkdhaW4iCittc2dzdHIgIuOCsuOCpOODsyIKKworIyBTVU4gUkVWSUVXRUQKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICLjg6Ljg4vjgr/jg7wiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICLjg5Pjg6vjg4jjgqTjg7Pjgrnjg5Tjg7zjgqsiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIuODmOODg+ODieODleOCqeODsyIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICLjg6njgqTjg7Plh7rlipsiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNQRElG5Ye65YqbIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICJBVVggMeWHuuWKmyIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiQVVYIDLlh7rlipsiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICUyJHMg44GL44KJ44CAJTEkZCDjg5DjgqTjg4joqq3jgb/ovrzjgb/mmYLjgavjgqjjg6njg7zjgYznmbrnlJ/jgZfjgb7jgZfjgZ/jgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIuODh+ODkOOCpOOCuSclcyfjgYzkvZzmpa3jgafjgY3jgovjg5Pjg4fjgqrlvaLlvI/jga7mlbDjgYjkuIrjgZLjgavlpLHmlZfjgZfjgb7jgZfjgZ8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIuODh+ODkOOCpOOCuSAnJXMnIOOBi+OCieODkOODg+ODleOCoeOCkuODnuODg+ODl+OBp+OBjeOBvuOBm+OCk+OAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg44Gu44OJ44Op44Kk44OQ44GvSU/jg6Hjgr3jg4Pjg4klZOOCkuOCteODneODvOODiOOBl+OBpuOBhOOBvuOBm+OCkyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIiIKKyLjg4fjg5DjgqTjgrkgJyVzJyDjga7jg4njg6njgqTjg5Djga/nn6XjgonjgozjgabjgYTjgovjgYTjgYvjgarjgotJT+ODoeOCveODg+ODieOCguOCteODneODvOODiOOBl+OBpuOBhOOBvuOBmyIKKyLjgpPjgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAi44OH44OQ44Kk44K5YCVzJ+OBr+ODk+OCuOODvOeKtuaFi+OBp+OBmSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg44GvICVkeCVkIOOBp+OCreODo+ODl+ODgeODo+OBp+OBjeOBvuOBm+OCkyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg44Gv5oyH5a6a44GV44KM44Gf44OV44Kp44O844Oe44OD44OI44Gn44Kt44Oj44OX44OB44Oj44Gn44GN44G+44Gb44KTIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJyVzJyDjga/jg5Pjg4fjgqrjgq3jg6Pjg5fjg4Hjg6PjgpLjgrXjg53jg7zjg4jjgZfjgabjgYTjgb7jgZvjgpMiCisKKyMgU1VOIFJFVklFV0VECisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg5LiK44Gu44OR44Op44Oh44O844K/44KS5Y+W5b6X44Gn44GN44G+44Gb44KT44CCIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICLjg5Pjg4fjgqrjg4fjg5DjgqTjgrnjgYzmlrDjgZfjgYTjg5Xjg6zjg7zjg6Djg6zjg7zjg4joqK3lrprjgpLlj5fjgZHku5jjgZHjgb7jgZvjgpPjgIIiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAi44OT44OH44Kq44OH44OQ44Kk44K544GM5paw44GX44GE44OV44Os44O844Og44Os44O844OI6Kit5a6a44KS5Y+X44GR5LuY44GR44G+44Gb44KT44CCIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJyVzJyDjga7jg4njg6njgqTjg5Djga9JT+ODoeOCveODg+ODiSVk44KS44K144Od44O844OI44GX44Gm44GE44G+44Gb44KTIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIuODh+ODkOOCpOOCuSAnJXMnIOOBruODieODqeOCpOODkOOBr0lP44Oh44K944OD44OJJWTjgpLjgrXjg53jg7zjg4jjgZfjgabjgYTjgb7jgZvjgpMiCisKKyMsIGZ1enp5Cittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIuODk+ODh+OCquODh+ODkOOCpOOCueOBr+ODkOODg+ODleOCoeODl+ODvOODq+OCkuS9nOaIkOOBp+OBjeOBvuOBm+OCk+OBp+OBl+OBn+OAgiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIuODk+ODh+OCquODh+ODkOOCpOOCueOBr+ODkOODg+ODleOCoeODl+ODvOODq+OCkuS9nOaIkOOBp+OBjeOBvuOBm+OCk+OBp+OBl+OBn+OAgiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclMiRzJyDkuIrjga7jg4Hjg6Xjg7zjg4rjg7wgJTEkZCDjga7oqK3lrprjga7lj5blvpfjgavlpLHmlZfjgZfjgb7jgZfjgZ/jgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi44OH44OQ44Kk44K5JyVzJyDjga7og73lipvjgpLlj5blvpfjgZnjgovmmYLjgavjgqjjg6njg7zjgYznmbrnlJ/jgZfjgb7jgZfjgZ/jgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJyVzJyDjga/jg4Hjg6Xjg7zjg4rjgafjga/jgYLjgorjgb7jgZvjgpPjgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJyVzJyDkuIrjga7jg6njgrjjgqrlhaXlipvjga7lj5blvpfjgavlpLHmlZfjgZfjgb7jgZfjgZ/jgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJyUyJHMnIOS4iuOBruWFpeWKmyUxJGQg44Gu6Kit5a6a44Gr5aSx5pWX44GX44G+44GX44Gf44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJyVzJyDjga7jg5/jg6Xjg7zjg4jnirbmhYvjga7lpInmm7TjgavlpLHmlZfjgZfjgb7jgZfjgZ8iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIuODh+ODkOOCpOOCuSAnJXMnIOOBruODieODqeOCpOODkOOBr0lP44Oh44K944OD44OJJWTjgpLjgrXjg53jg7zjg4jjgZfjgabjgYTjgb7jgZvjgpMiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICLjg5Pjg4fjgqrjg4fjg5DjgqTjgrnjgYzmlrDjgZfjgYTjg5Xjg6zjg7zjg6Djg6zjg7zjg4joqK3lrprjgpLlj5fjgZHku5jjgZHjgb7jgZvjgpPjgIIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICLjg5Pjg4fjgqrjg4fjg5DjgqTjgrnjgYzmlrDjgZfjgYTjg5Xjg6zjg7zjg6Djg6zjg7zjg4joqK3lrprjgpLlj5fjgZHku5jjgZHjgb7jgZvjgpPjgIIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAi44OT44OH44Kq44OH44OQ44Kk44K544GM5paw44GX44GE44OV44Os44O844Og44Os44O844OI6Kit5a6a44KS5Y+X44GR5LuY44GR44G+44Gb44KT44CCIgorCisjLCBmdXp6eQorbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICJKUEVH55S75YOP44Gu44OH44Kz44O844OJ44Gr5aSx5pWX44GX44G+44GX44GfIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisi44OH44OQ44Kk44K5ICclcycg44Gu6IO95Yqb44KS5Y+W5b6X44GZ44KL5pmC44Gr44Ko44Op44O844GM55m655Sf44GX44G+44GX44GfOiB2NGwyIOODieODqeOCpOODkOOBp+OBr+OBguOCiiIKKyLjgb7jgZvjgpPjgIJ2NGwxIOODieODqeOCpOODkOOBp+OBquOBhOOBi+OAgeODgeOCp+ODg+OCr+OBl+OBpuOBj+OBoOOBleOBhOOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIuODh+ODkOOCpOOCuSAlMiRzIOWGheOBruWFpeWKmyAlMSRkIOOBruWxnuaAp+OBruOCr+OCqOODquODvOOBq+WkseaVl+OBl+OBvuOBl+OBnyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLjg4fjg5DjgqTjgrkgJyUyJHMnIOS4iuOBruODgeODpeODvOODiuODvCAlMSRkIOOBruioreWumuOBruWPluW+l+OBq+WkseaVl+OBl+OBvuOBl+OBn+OAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIuODh+ODkOOCpOOCuSAnJXMnIOS4iuOBruODjuODq+ODoOOBruWPluW+l+OBq+WkseaVl+OBl+OBvuOBl+OBn+OAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg44Gu44Kz44Oz44OI44Ot44O844Or5bGe5oCn44Gu5Y+W5b6X44Gr5aSx5pWX44GX44G+44GX44GfIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIuODh+ODkOOCpOOCuSclcyfjgpLnibnlrprjgafjgY3jgb7jgZvjgpPjgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi44GT44KM44Gv44OH44OQ44Kk44K5ICclcycg44Gn44Gv44GC44KK44G+44Gb44KTIgorCisjIFNVTiBSRVZJRVdFRAorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIuODh+ODkOOCpOOCuSAnJXMnIOOCkuiqreOBv+WPluOCiueUqOOBqOabuOOBjei+vOOBv+eUqOOBq+mWi+OBj+OBk+OBqOOBjOOBp+OBjeOBvuOBm+OCkyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIuODh+ODkOOCpOOCuSAnJXMnIOOBr+OCreODo+ODl+ODgeODo+ODh+ODkOOCpOOCueOBp+OBr+OBguOCiuOBvuOBm+OCkyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg44Gv5Ye65Yqb44OH44OQ44Kk44K544Gn44Gv44GC44KK44G+44Gb44KTIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg44Gv5Ye65Yqb44OH44OQ44Kk44K544Gn44Gv44GC44KK44G+44Gb44KTIgorCisjIFNVTiBSRVZJRVdFRAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIuODh+ODkOOCpOOCuSAnJXMnIOOCkuiqreOBv+WPluOCiueUqOOBqOabuOOBjei+vOOBv+eUqOOBq+mWi+OBj+OBk+OBqOOBjOOBp+OBjeOBvuOBm+OCkyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg5LiK44Gu44OO44Or44Og44Gu6Kit5a6a44Gr5aSx5pWX44GX44G+44GX44Gf44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg44Gu54++5Zyo44Gu44OB44Ol44O844OK44O844Gu5ZGo5rOi5pWw44Gu5Y+W5b6X44Gr5aSx5pWX44GX44G+44GX44GfIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIuODh+ODkOOCpOOCuSAnJXMnIOOBruODgeODpeODvOODiuODvOOBruWRqOazouaVsOOBriAlbHUgSHog44G444Gu6Kit5a6a44Gr5aSx5pWX44GX44G+44GX44GfIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIuODh+ODkOOCpOOCuSAnJXMnIOOBruS/oeWPt+OBruW8t+OBleOBruWPluW+l+OBq+WkseaVl+OBl+OBvuOBl+OBn+OAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi44OH44OQ44Kk44K5ICclMiRzJyDkuIrjga7jgrPjg7Pjg4jjg63jg7zjg6sgJTEkZCDjga7lgKTjga7lj5blvpfjgavlpLHmlZfjgZfjgb7jgZfjgZ/jgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyLjg4fjg5DjgqTjgrkgJyUzJHMnIOS4iuOBruOCs+ODs+ODiOODreODvOODqyAlMiRkIOOBruWApOOCkiAlMSRkIOOBuOioreWumuOBmeOCi+OBk+OBqOOBq+WkseaVl+OBl+OBvuOBlyIKKyLjgZ/jgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyLjg4fjg5DjgqTjgrkgJyVzJyDkuIrjga7nj77lnKjjga7lhaXlipvjga7lj5blvpfjgavlpLHmlZfjgZfjgb7jgZfjgZ/jgILjg6njgrjjgqrjg4fjg5DjgqTjgrnjgYvjgoLjgZfjgozjgb7jgZsiCisi44KTIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyLjg4fjg5DjgqTjgrkgJyVzJyDkuIrjga7nj77lnKjjga7lh7rlipvjga7lj5blvpfjgavlpLHmlZfjgZfjgb7jgZfjgZ/jgILjg6njgrjjgqrjg4fjg5DjgqTjgrnjgYvjgoLjgZfjgozjgb7jgZsiCisi44KTIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIuWHuuWKmyVk44KS44OH44OQ44Kk44K5ICVzIOOBq+ioreWumuOBp+OBjeOBvuOBm+OCk+OBp+OBl+OBn+OAgiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIuWun+ihjOaZguOBruino+WDj+W6puWkieabtOOBr+OCteODneODvOODiOOBleOCjOOBpuOBhOOBvuOBm+OCk+OAgiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAi44Kv44Ot44OD44Kv44Gq44GX44Gn44Gv5YuV5L2c44Gn44GN44G+44Gb44KT44CCIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICLlhoXpg6jjg4fjg7zjgr/jgrnjg4jjg6rjg7zjg6Djgqjjg6njg7wiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICLlhoXpg6jjg4fjg7zjgr/jg5Xjg63jg7zjgqjjg6njg7zjgIIiCisKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIuODh+ODkOOCpOOCuSAnJXMnIOOBr+ODk+ODh+OCquOCreODo+ODl+ODgeODo+OCkuOCteODneODvOODiOOBl+OBpuOBhOOBvuOBm+OCkyIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIuOCteOCpuODs+ODieOCteODvOODkOODvOOBuOOBruaOpee2muOBq+WkseaVl+OBl+OBvuOBl+OBnyIKKworI34gbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBzb3VuZCBzZXJ2ZXIgY2FwYWJpbGl0aWVzIgorI34gbXNnc3RyICLjgrXjgqbjg7Pjg4njgrXjg7zjg5Djg7zjga7jgrHjgqTjg5Hjg5Pjg6rjg4bjgqPjga7jgq/jgqjjg6rjg7zjgavlpLHmlZfjgZfjgb7jgZfjgZ8iCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAi5L2O6Z+zIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIlRyZWJsZSIKKyN+IG1zZ3N0ciAi6auY6Z+zIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICLjgrfjg7PjgrsiCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiU3BlYWtlciIKKyN+IG1zZ3N0ciAi44K544OU44O844KrIgorCisjfiBtc2dpZCAiTGluZS1pbiIKKyN+IG1zZ3N0ciAi44Op44Kk44Oz5YWl5YqbIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAi44Of44Kt44K144O8IgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICJQQ00tMiIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICJSZWNvcmQiCisjfiBtc2dzdHIgIumMsumfsyIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICLlhaXlipvjgrLjgqTjg7MiCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiT3V0LWdhaW4iCisjfiBtc2dzdHIgIuWHuuWKm+OCsuOCpOODsyIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICJMaW5lLTEiCisjfiBtc2dzdHIgIuODqeOCpOODsyAxIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAi44Op44Kk44OzIDIiCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiTGluZS0zIgorI34gbXNnc3RyICLjg6njgqTjg7MgMyIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICJEaWdpdGFsLTEiCisjfiBtc2dzdHIgIuODh+OCuOOCv+ODqyAxIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIkRpZ2l0YWwtMiIKKyN+IG1zZ3N0ciAi44OH44K444K/44OrIDIiCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICLjg4fjgrjjgr/jg6sgMyIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICJQaG9uZS1pbiIKKyN+IG1zZ3N0ciAi44OV44Kp44Oz5YWl5YqbIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAi44OV44Kp44Oz5Ye65YqbIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICLjg5Pjg4fjgqoiCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgIuODqeOCuOOCqiIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIgorI34gbXNnc3RyICLpn7Plo7Djg4fjg5DjgqTjgrnjgpLjg5/jgq3jgrXjg7zjgrPjg7Pjg4jjg63jg7zjg6vnlKjjgavplovjgY/jgZPjgajjgYzjgafjgY3jgb7jgZvjgpPjgIIiCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICLjg5/jgq3jgrXjg7zjgrPjg7Pjg4jjg63jg7zjg6vnlKjjgavjgqrjg7zjg4fjgqPjgqrjg4fjg5DjgqTjgrnjgpLplovjgY/jgZPjgajjgYzjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ/jgIIiCisjfiAiT3BlbiBTb3VuZCBTeXN0ZW3jga7jgZPjga7jg5Djg7zjgrjjg6fjg7Pjgafjga/jgZPjga7opoHntKDjgavjgojjgaPjgabjgrXjg53jg7zjg4jjgZXjgozjgabjgYTjgb7jgZsiCisjfiAi44KT44CCIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICLjg57jgrnjgr8iCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAi44OV44Ot44Oz44OIIgorCisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAi44Oq44KiIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAi44OY44OD44OJ44OV44Kp44OzIgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICLjgrvjg7Pjgr/jg7wiCisKKyN+IG1zZ2lkICJMRkUiCisjfiBtc2dzdHIgIkxGRSIKKworI34gbXNnaWQgIlN1cnJvdW5kIgorI34gbXNnc3RyICLjgrXjg6njgqbjg7Pjg4kiCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICLjgrXjgqTjg4kiCisKKyN+IG1zZ2lkICJBVVggT3V0IgorI34gbXNnc3RyICJBVVjlh7rlipsiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiM0QgRGVwdGgiCisjfiBtc2dzdHIgIuacgOWkp+a3seW6pjogIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICIzROOCu+ODs+OCv+ODvCIKKworIywgZnV6enkKKyN+IG1zZ2lkICIzRCBFbmhhbmNlIgorI34gbXNnc3RyICLoibLjgpLlvLfoqr/jgZfjgabjgYTjgb7jgZkiCisKKyN+IG1zZ2lkICJUZWxlcGhvbmUiCisjfiBtc2dzdHIgIumbu+ipsSIKKworI34gbXNnaWQgIlZpZGVvIEluIgorI34gbXNnc3RyICLjg5Pjg4fjgqrlhaXlipsiCisKKyN+IG1zZ2lkICJBVVggSW4iCisjfiBtc2dzdHIgIkFVWOWFpeWKmyIKKworI34gbXNnaWQgIlJlY29yZCBHYWluIgorI34gbXNnc3RyICLpjLLpn7PjgrLjgqTjg7MiCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAi5Ye65Yqb44Ky44Kk44OzIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAi44Oe44Kk44Kv44Ot44OV44Kp44Oz44OW44O844K544OIIgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAi6Ki65patIgorCisjfiBtc2dpZCAiQmFzcyBCb29zdCIKKyN+IG1zZ3N0ciAi5L2O6Z+z44OW44O844K544OIIgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgIuODl+ODrOOCpOODkOODg+OCr+ODneODvOODiCIKKworI34gbXNnaWQgIklucHV0IgorI34gbXNnc3RyICLlhaXlipsiCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAi44Oi44OL44K/44O844K944O844K5IgorCisjfiBtc2dpZCAiS2V5Ym9hcmQgQmVlcCIKKyN+IG1zZ3N0ciAi44Kt44O844Oc44O844OJ44OT44O844OX6Z+zIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlNpbXVsYXRlIFN0ZXJlbyIKKyN+IG1zZ3N0ciAi5b2r6YeR44KS6KGo54++44GX44G+44GZIgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICLjgrnjg4bjg6zjgqoiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAi44K144Op44Km44Oz44OJ44K144Km44Oz44OJIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBHYWluIgorI34gbXNnc3RyICLjg57jgqTjgq/jg63jg5Xjgqnjg7PjgrLjgqTjg7MiCisKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAi44K544OU44O844Kr44K944O844K5IgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgIuODnuOCpOOCr+ODreODleOCqeODs+OCveODvOOCuSIKKworI34gbXNnaWQgIkphY2siCisjfiBtc2dzdHIgIuOCuOODo+ODg+OCryIKKworI34gbXNnaWQgIkNlbnRlciAvIExGRSIKKyN+IG1zZ3N0ciAi44K744Oz44K/44O8IC8gTEZFIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAi44K544OG44Os44Kq44Of44OD44Kv44K5IgorCisjfiBtc2dpZCAiTW9ubyBNaXgiCisjfiBtc2dzdHIgIuODouODjuODqeODq+ODn+ODg+OCr+OCuSIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAi5YWl5Yqb44Of44OD44Kv44K5IgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICLjg57jgqTjgq/jg63jg5Xjgqnjg7MxIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICLjg57jgqTjgq/jg63jg5Xjgqnjg7MyIgorCisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIuODh+OCuOOCv+ODq+WHuuWKmyIKKworI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgIuODh+OCuOOCv+ODq+WFpeWKmyIKKworI34gbXNnaWQgIkhETUkiCisjfiBtc2dzdHIgIkhETUkiCisKKyN+IG1zZ2lkICJNb2RlbSIKKyN+IG1zZ3N0ciAi44Oi44OH44OgIgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAi44OY44OD44OJ44K744OD44OIIgorCisjfiBtc2dpZCAiT3RoZXIiCisjfiBtc2dzdHIgIuOBneOBruS7liIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgIuOBquOBlyIKKworI34gbXNnaWQgIk9uIgorI34gbXNnc3RyICLjgqrjg7MiCisKKyN+IG1zZ2lkICJPZmYiCisjfiBtc2dzdHIgIuOCquODlSIKKworI34gbXNnaWQgIk11dGUiCisjfiBtc2dzdHIgIuODn+ODpeODvOODiCIKKworIywgZnV6enkKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICLpgJ/jgYQiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgIuS9juWTgeS9jSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJMb3ciCisjfiBtc2dzdHIgIuS9jumfsyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNZWRpdW0iCisjfiBtc2dzdHIgIuS4remfsyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJIaWdoIgorI34gbXNnc3RyICLpq5jpn7MiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICLpq5jlk4HkvY0iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAi44OX44Ot44OA44Kv44K344On44OzIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTWljcm9waG9uZSIKKyN+IG1zZ3N0ciAi44OV44Ot44Oz44OI44OR44ON44Or44Gu44Oe44Kk44Kv44Ot44OV44Kp44OzIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBJbiIKKyN+IG1zZ3N0ciAi44OV44Ot44Oz44OI44OR44ON44Or44Gu44Op44Kk44Oz5YWl5YqbIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAi44OV44Ot44Oz44OI44OR44ON44Or44Gu44OY44OD44OJ44OV44Kp44OzIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBPdXQiCisjfiBtc2dzdHIgIuODleODreODs+ODiOODkeODjeODq+OBruODqeOCpOODs+WHuuWKmyIKKworI34gbXNnaWQgIkdyZWVuIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi57eR6Imy44Kz44ON44Kv44K/IgorCisjfiBtc2dpZCAiUGluayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuODlOODs+OCr+iJsuOCs+ODjeOCr+OCvyIKKworI34gbXNnaWQgIkJsdWUgQ29ubmVjdG9yIgorI34gbXNnc3RyICLpnZLoibLjgrPjg43jgq/jgr8iCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIueZveiJsuOCs+ODjeOCr+OCvyIKKworI34gbXNnaWQgIkJsYWNrIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi6buS6Imy44Kz44ON44Kv44K/IgorCisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuOCsOODrOODvOiJsuOCs+ODjeOCr+OCvyIKKworI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuOCquODrOODs+OCuOiJsuOCs+ODjeOCr+OCvyIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIui1pOiJsuOCs+ODjeOCr+OCvyIKKworI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgIum7hOiJsuOCs+ODjeOCr+OCvyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJTcHJlYWQgT3V0cHV0IgorI34gbXNnc3RyICLmg4XloLHlh7rlips6XG4iCisKKyN+IG1zZ2lkICJEb3dubWl4IgorI34gbXNnc3RyICLjg4Djgqbjg7Pjg5/jg4Pjgq/jgrkiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIElucHV0IgorI34gbXNnc3RyICLku67mg7Pjg5/jgq3jgrXjg7zlhaXlipsiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKKyN+IG1zZ3N0ciAi5Luu5oOz44Of44Kt44K144O85Ye65YqbIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBDaGFubmVscyIKKyN+IG1zZ3N0ciAi5Luu5oOz44Of44Kt44K144O844OB44Oj44Oz44ON44OrIgorCisjLCBmdXp6eQorI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICLmqZ/og70iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgIuapn+iDvSIKKworI34gbXNnaWQgIkdvdCB1bmV4cGVjdGVkIGZyYW1lIHNpemUgb2YgJXUgaW5zdGVhZCBvZiAldS4iCisjfiBtc2dzdHIgIuS6iOacn+OBl+OBquOBhOODleODrOODvOODoOOCteOCpOOCuiAoJTIkdSDjgafjga/jgarjgY8gJTEkdSkg44KS5Y+W5b6X44GX44G+44GX44Gf44CCIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIiIKKyN+ICLjg4fjg5DjgqTjgrkgJyUyJHMnIOS4iuOBpyAlMSRkIOODkOOCpOODiOOBruiqreOBv+i+vOOBv+aZguOBq+OCqOODqeODvOOBjOeZuueUn+OBl+OBvuOBl+OBn+OAgiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJDb3VsZCBub3QgZW5xdWV1ZSBidWZmZXJzIGluIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAi44OH44OQ44Kk44K5ICclcycg44GL44KJ44OQ44OD44OV44Kh44KS44Oe44OD44OX44Gn44GN44G+44Gb44KT44CCIgorCisjfiBtc2dpZCAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLjg4fjg5DjgqTjgrkgJyVzJyDjgYvjgonjg5Pjg4fjgqrjg5Xjg6zjg7zjg6Djga7lj5blvpfjgavlpLHmlZfjgZfjgb7jgZfjgZ/jgIIiCisKKyN+IG1zZ2lkICJGYWlsZWQgYWZ0ZXIgJWQgdHJpZXMuIGRldmljZSAlcy4gc3lzdGVtIGVycm9yOiAlcyIKKyN+IG1zZ3N0ciAiIgorI34gIiVkIOWbnuODquODiOODqeOCpOOBl+OBvuOBl+OBn+OBjOWkseaVl+OBl+OBvuOBl+OBn+OAguODh+ODkOOCpOOCuSAlc+OAguOCt+OCueODhuODoOOCqOODqeODvDogJXMiCisKKyN+IG1zZ2lkICIiCisjfiAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIE5vdCBlbm91Z2ggbWVtb3J5LiIKKyN+IG1zZ3N0ciAiIgorI34gIuODh+ODkOOCpOOCuSAnJXMnIOOBi+OCieODk+ODh+OCquODleODrOODvOODoOOCkuWPluW+l+OBl+OCiOOBhuOBqOOBl+OBvuOBl+OBn+OBjOWkseaVl+OBl+OBvuOBl+OBn+OAguODoeODoiIKKyN+ICLjg6rjgYzljYHliIbjgavjgYLjgorjgb7jgZvjgpPjgIIiCisKKyN+IG1zZ2lkICJObyBmcmVlIGJ1ZmZlcnMgZm91bmQgaW4gdGhlIHBvb2wgYXQgaW5kZXggJWQuIgorI34gbXNnc3RyICLjgqTjg7Pjg4fjg4Pjgq/jgrkgJWQg44Gn44OX44O844Or5YaF44Gr56m644GN44OQ44OD44OV44Kh44GM44GC44KK44G+44Gb44KT44CCIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGdldCBidWZmZXJzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLjg4fjg5DjgqTjgrkgJyVzJyDjgYvjgonjg5Djg4Pjg5XjgqHjgpLlj5blvpfjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ/jgIIiCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZ2V0IGVub3VnaCBidWZmZXJzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICIiCisjfiAi44OH44OQ44Kk44K5ICclcycg44GL44KJ5Y2B5YiG44Gq44OQ44OD44OV44Kh44O86aCY5Z+f44KS5Y+W5b6X44GZ44KL44GT44Go44GM44Gn44GN44G+44Gb44KT44Gn44GX44GfIgorCisjIFNVTiBSRVZJRVdFRAorIywgZnV6enkKKyN+IG1zZ2lkICJDb3VsZCBub3QgcmVhZCBmcm9tIENELiIKKyN+IG1zZ3N0ciAi44OV44Kh44Kk44OrIFwiJXNcIiDjgavmm7jjgY3ovrzjgoDjgZPjgajjgYzjgafjgY3jgb7jgZvjgpPjgIIiCisKKyMgU1VOIFJFVklFV0VECisjLCBmdXp6eQorI34gbXNnaWQgIkRpc2MgaXMgbm90IGFuIEF1ZGlvIENELiIKKyN+IG1zZ3N0ciAi44OH44OQ44Kk44K544GM6ZaL44GE44Gm44GE44G+44Gb44KT44CCIgorCisjIFNVTiBSRVZJRVdFRAorIywgZnV6enkKKyN+IG1zZ2lkICJDb3VsZCBub3Qgc2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCisjfiBtc2dzdHIgIkNEIOODh+ODkOOCpOOCueOCkuiqreOBv+WPluOCiueUqOOBq+mWi+OBj+OBk+OBqOOBjOOBp+OBjeOBvuOBm+OCk+OAgiIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiBwbGF5IGF1ZGlvIHVzaW5nIGFueSBudW1iZXIgb2Ygb3V0cHV0IGVsZW1lbnRzLiBTb21lICIKKyN+ICJwb3NzaWJsZSBjaG9pY2VzIGFyZSBvc3NzaW5rLCBlc2RzaW5rIGFuZCBhbHNhc2luay4gVGhlIGF1ZGlvc2luayBjYW4gYmUgIgorI34gImEgcGFydGlhbCBwaXBlbGluZSBpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAi44Kq44O844OH44Kj44Kq44KS5YaN55Sf44GZ44KL44Go44GN44CBR1N0cmVhbWVyIOOBr+S7u+aEj+OBruaVsOOBruWHuuWKm+imgee0oOOCkuS9v+eUqOOBp+OBjeOBvuOBmeOAguS9vyIKKyN+ICLnlKjjgafjgY3jgovlh7rlipvopoHntKDjga/jgIFvc3NzaW5r44CBZXNkc2lua+OAgeOBiuOCiOOBsyBhbHNhc2luayDjgafjgZnjgIJhdWRpb3Npbmsg44Gv5Y2YIgorI34gIuOBquOCiyAxIOOBpOOBruimgee0oOOBp+OBr+OBquOBj+OAgeODkeOCpOODl+ODqeOCpOODs+OBruS4gOmDqOOBq+OBquOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAgiIKKworIyBTVU4gUkVWSUVXRUQKKyMsIGZ1enp5CisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcGxheSB2aWRlbyB1c2luZyBhbnkgbnVtYmVyIG9mIG91dHB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgeHZpbWFnZXNpbmssIHhpbWFnZXNpbmssIHNkbHZpZGVvc2luayBhbmQgYWFzaW5rLiAiCisjfiAiVGhlIHZpZGVvc2luayBjYW4gYmUgYSBwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICLjg5Pjg4fjgqrjgpLlho3nlJ/jgZnjgovjgajjgY3jgIFHU3RyZWFtZXIg44Gv5Lu75oSP44Gu5pWw44Gu5Ye65Yqb6KaB57Sg44KS5L2/55So44Gn44GN44G+44GZ44CC5L2/55So44GnIgorI34gIuOBjeOCi+WHuuWKm+imgee0oOOBr+OAgXh2aWRlb3NpbmvjgIFzZGx2aWRlb3NpbmvjgIHjgYrjgojjgbMgYWFzaW5rIOOBp+OBmeOAgnZpZGVvc2luayDjga8iCisjfiAi5Y2Y44Gq44KLIDEg44Gk44Gu6KaB57Sg44Gn44Gv44Gq44GP44CB44OR44Kk44OX44Op44Kk44Oz44Gu5LiA6YOo44Gr44Gq44KL44GT44Go44GM44Gn44GN44G+44GZ44CCIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHB1dCB2aXN1YWxpemF0aW9uIHBsdWdpbnMgaW4gYSBwaXBlbGluZSB0byB0cmFuc2Zvcm0gYXVkaW8gIgorI34gInN0cmVhbSBpbiB2aWRlbyBmcmFtZXMuIERlZmF1bHQgaXMgZ29vbSBidXQgbW9yZSB2aXN1YWxpemF0aW9uIHBsdWdpbnMgIgorI34gIndpbGwgYmUgcG9ydGVkIHNvb24uIFRoZSB2aXN1YWxpemF0aW9uIHBsdWdpbiBjYW4gYmUgYSBwYXJ0aWFsIHBpcGVsaW5lICIKKyN+ICJpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiR1N0cmVhbWVyIOOBr+imluimmuWMluODl+ODqeOCsOOCpOODs+OCkuODkeOCpOODl+ODqeOCpOODs+OBq+ioreWumuOBl+OBpuOAgeOCquODvOODh+OCo+OCquOCueODiOODquODvOODoCIKKyN+ICLjgpLjg5Pjg4fjgqrjg5Xjg6zjg7zjg6DjgavlpInmj5vjgafjgY3jgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jjga8gZ29vbSDjgafjgZnjgYzjgIHjgojjgorlpJrjgY/jga7oppbopprljJYiCisjfiAi44OX44Op44Kw44Kk44Oz44GM44GZ44GQ44Gr56e75qSN44GV44KM44KL5LqI5a6a44Gn44GZ44CC6KaW6Kaa5YyW44OX44Op44Kw44Kk44Oz44Gv5Y2Y44Gq44KLIDEg44Gk44Gu6KaB57SgIgorI34gIuOBp+OBr+OBquOBj+OAgeODkeOCpOODl+ODqeOCpOODs+OBruS4gOmDqOOBq+OBquOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAgiIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiByZWNvcmQgYXVkaW8gdXNpbmcgYW55IG51bWJlciBvZiBpbnB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgb3Nzc3JjLCBlc2RzcmMgYW5kIGFsc2FzcmMuIFRoZSBhdWRpbyBzb3VyY2UgY2FuIGJlICIKKyN+ICJhIHBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIuOCquODvOODh+OCo+OCquOCkuiomOmMsuOBmeOCi+OBqOOBjeOAgUdTdHJlYW1lciDjga/ku7vmhI/jga7mlbDjga7lhaXlipvopoHntKDjgpLkvb/nlKjjgafjgY3jgb7jgZnjgILkvb8iCisjfiAi55So44Gn44GN44KL5YWl5Yqb6KaB57Sg44Gv44CBb3Nzc3Jj44CBZXNkc3Jj44CB44GK44KI44GzIGFsc2FzcmMg44Gn44GZ44CC44Kq44O844OH44Kj44Kq44K944O844K5IgorI34gIuOBr+WNmOOBquOCiyAxIOOBpOOBruimgee0oOOBp+OBr+OBquOBj+OAgeODkeOCpOODl+ODqeOCpOODs+OBruS4gOmDqOOBq+OBquOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAgiIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiByZWNvcmQgdmlkZW8gZnJvbSBhbnkgbnVtYmVyIG9mIGlucHV0IGVsZW1lbnRzLiBTb21lICIKKyN+ICJwb3NzaWJsZSBjaG9pY2VzIGFyZSB2NGxzcmMgYW5kIHZpZGVvdGVzdHNyYy4gVGhlIHZpZGVvIHNvdXJjZSBjYW4gYmUgYSAiCisjfiAicGFydGlhbCBwaXBlbGluZSBpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAi44OT44OH44Kq44KS6KiY6Yyy44GZ44KL44Go44GN44CBR1N0cmVhbWVyIOOBr+S7u+aEj+OBruaVsOOBruWFpeWKm+imgee0oOOCkuS9v+eUqOOBp+OBjeOBvuOBmeOAguS9v+eUqOOBpyIKKyN+ICLjgY3jgovlhaXlipvopoHntKDjga/jgIF2NGxzcmMg44GK44KI44GzIHZpZGVvdGVzdHNyYyDjgafjgZnjgILjg5Pjg4fjgqrjgr3jg7zjgrnjga/ljZjjgarjgosgMSDjgaQiCisjfiAi44Gu6KaB57Sg44Gn44Gv44Gq44GP44CB44OR44Kk44OX44Op44Kk44Oz44Gu5LiA6YOo44Gr44Gq44KL44GT44Go44GM44Gn44GN44G+44GZ44CCIgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIGF1ZGlvIHNvdXJjZSIKKyN+IG1zZ3N0ciAi44OH44OV44Kp44Or44OI44GuIEdTdHJlYW1lciDjgqrjg7zjg4fjgqPjgqrjgr3jg7zjgrkiCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW9zaW5rIgorI34gbXNnc3RyICLjg4fjg5Xjgqnjg6vjg4jjga4gR1N0cmVhbWVyIGF1ZGlvc2luayIKKworIyBTVU4gUkVWSUVXRUQKKyN+IG1zZ2lkICJkZWZhdWx0IEdTdHJlYW1lciB2aWRlbyBzb3VyY2UiCisjfiBtc2dzdHIgIuODh+ODleOCqeODq+ODiOOBriBHU3RyZWFtZXIg44OT44OH44Kq44K944O844K5IgorCisjIFNVTiBSRVZJRVdFRAorI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIHZpZGVvc2luayIKKyN+IG1zZ3N0ciAi44OH44OV44Kp44Or44OI44GuIEdTdHJlYW1lciB2aWRlb3NpbmsiCisKKyMgU1VOIFJFVklFV0VECisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgdmlzdWFsaXphdGlvbiBwbHVnaW4iCisjfiBtc2dzdHIgIuODh+ODleOCqeODq+ODiOOBriBHU3RyZWFtZXIg6KaW6Kaa5YyW44OX44Op44Kw44Kk44OzIgorCisjIFNVTiBSRVZJRVdFRAorIywgZnV6enkKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW9zaW5rIgorI34gbXNnc3RyICLjg4fjg5Xjgqnjg6vjg4jjga4gR1N0cmVhbWVyIGF1ZGlvc2luayIKKworIyBTVU4gUkVWSUVXRUQKKyMsIGZ1enp5CisjfiBtc2dpZCAiZGVzY3JpcHRpb24gZm9yIGRlZmF1bHQgR1N0cmVhbWVyIGF1ZGlvc3JjIgorI34gbXNnc3RyICLjg4fjg5Xjgqnjg6vjg4jjga4gR1N0cmVhbWVyIOOCquODvOODh+OCo+OCquOCveODvOOCuSIKKworI34gbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcy4nIgorI34gbXNnc3RyICLjg4fjg5DjgqTjgrkgJyVzJyDjga7jgrPjg7Pjg4jjg63jg7zjg6vlsZ7mgKfjga7lj5blvpfjgavlpLHmlZfjgZfjgb7jgZfjgZ8iCmRpZmYgLS1naXQgYS9wby9reS5wbyBiL3BvL2t5LnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkM2FmZTcKLS0tIC9kZXYvbnVsbAorKysgYi9wby9reS5wbwpAQCAtMCwwICsxLDQ3NSBAQAorIyBUcmFuc2xhdGlvbiBvZiAnZ3N0LXBsdWdpbnMtZ29vZCcgbWVzc2FnZXMgdG8gS2lyZ2hpei4KKyMgQ29weXJpZ2h0IChDKSAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBJbHlhcyBCYWtpcm92IDxqdXN0X2lseWFzQHlhaG9vLmNvbT4sIDIwMDcuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDAuMTAuMjNcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxMC0wNS0xMSAxNTozNSswMTAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwNy0xMS0xMyAxNzoxNiswNjAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBJbHlhcyBCYWtpcm92IDxqdXN0X2lseWFzQHlhaG9vLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBLaXJnaGl6IDxpMThuLXRlYW0ta3kta3lyZ3l6QGxpc3RzLnNvdXJjZWZvcmdlLm5ldD5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJYLVBvZWRpdC1MYW5ndWFnZTogS3lyZ3l6XG4iCisiWC1Qb2VkaXQtQ291bnRyeTogS1lSR1laU1RBTlxuIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6MzAyCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCittc2dzdHIgIlwiJXNcIiAg0YTQsNC50LvRiyDQvtC60YPRg9Cz0LAg0LDRh9GL0LvQs9Cw0L0g0LbQvtC6LiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjMxNgorbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIFRoaXMgdmVyc2lvbiBvZiB0aGUgIgorIk9wZW4gU291bmQgU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzIyCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3MjMKK21zZ2lkICJNYXN0ZXIiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjcyNAorbXNnaWQgIkZyb250IgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3MjUKK21zZ2lkICJSZWFyIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3MjYKK21zZ2lkICJIZWFkcGhvbmVzIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3MjcKK21zZ2lkICJDZW50ZXIiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjcyOAorbXNnaWQgIkxGRSIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzI5Cittc2dpZCAiU3Vycm91bmQiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjczMAorbXNnaWQgIlNpZGUiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjczMQorbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjczMgorbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzMzCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3MzQKK21zZ2lkICJBVVggT3V0IgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3MzUKK21zZ2lkICJCYXNzIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3MzYKK21zZ2lkICJUcmVibGUiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjczNworbXNnaWQgIjNEIERlcHRoIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3MzgKK21zZ2lkICIzRCBDZW50ZXIiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjczOQorbXNnaWQgIjNEIEVuaGFuY2UiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc0MAorbXNnaWQgIlRlbGVwaG9uZSIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzQxCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzQyCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc0MyBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzQ0Cittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzQ1Cittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc0NgorbXNnaWQgIlZpZGVvIEluIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NDcKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzQ4Cittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc0OQorbXNnaWQgIkFVWCBJbiIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzUwCittc2dpZCAiUENNIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NTEgc3lzL29zczQvb3NzNC1taXhlci5jOjc1MgorbXNnaWQgIlJlY29yZCBHYWluIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NTMKK21zZ2lkICJPdXRwdXQgR2FpbiIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzU0Cittc2dpZCAiTWljcm9waG9uZSBCb29zdCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzU1Cittc2dpZCAiTG9vcGJhY2siCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc1NgorbXNnaWQgIkRpYWdub3N0aWMiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc1NworbXNnaWQgIkJhc3MgQm9vc3QiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc1OAorbXNnaWQgIlBsYXliYWNrIFBvcnRzIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NTkKK21zZ2lkICJJbnB1dCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzYwIHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NjEKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NjIKK21zZ2lkICJNb25pdG9yIFNvdXJjZSIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzYzCittc2dpZCAiS2V5Ym9hcmQgQmVlcCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzY0Cittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzY1Cittc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NjYgc3lzL29zczQvb3NzNC1taXhlci5jOjc4NgorbXNnaWQgIlN0ZXJlbyIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzY3Cittc2dpZCAiU3Vycm91bmQgU291bmQiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc2OAorbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzY5Cittc2dpZCAiU3BlYWtlciBTb3VyY2UiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc3MAorbXNnaWQgIk1pY3JvcGhvbmUgU291cmNlIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NzEKK21zZ2lkICJKYWNrIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NzIKK21zZ2lkICJDZW50ZXIgLyBMRkUiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc3MworbXNnaWQgIlN0ZXJlbyBNaXgiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc3NAorbXNnaWQgIk1vbm8gTWl4IgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NzUKK21zZ2lkICJJbnB1dCBNaXgiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc3NgorbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3NzcKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc3OAorbXNnaWQgIk1pY3JvcGhvbmUgMSIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6Nzc5Cittc2dpZCAiTWljcm9waG9uZSAyIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3ODAKK21zZ2lkICJEaWdpdGFsIE91dCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzgxCittc2dpZCAiRGlnaXRhbCBJbiIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzgyCittc2dpZCAiSERNSSIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzgzCittc2dpZCAiTW9kZW0iCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc4NAorbXNnaWQgIkhhbmRzZXQiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc4NQorbXNnaWQgIk90aGVyIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3ODcKK21zZ2lkICJOb25lIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3ODgKK21zZ2lkICJPbiIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6Nzg5Cittc2dpZCAiT2ZmIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3OTAKK21zZ2lkICJNdXRlIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3OTEKK21zZ2lkICJGYXN0IgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3OTIKK21zZ2lkICJWZXJ5IExvdyIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6NzkzCittc2dpZCAiTG93IgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3OTQKK21zZ2lkICJNZWRpdW0iCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc5NQorbXNnaWQgIkhpZ2giCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjc5NiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6Nzk3Cittc2dpZCAiVmVyeSBIaWdoIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3OTgKK21zZ2lkICJQcm9kdWN0aW9uIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo3OTkKK21zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MDAKK21zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MDEKK21zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MDIKK21zZ2lkICJGcm9udCBQYW5lbCBMaW5lIE91dCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODAzCittc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MDQKK21zZ2lkICJQaW5rIENvbm5lY3RvciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODA1Cittc2dpZCAiQmx1ZSBDb25uZWN0b3IiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjgwNgorbXNnaWQgIldoaXRlIENvbm5lY3RvciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODA3Cittc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MDgKK21zZ2lkICJHcmF5IENvbm5lY3RvciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODA5Cittc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODEwCittc2dpZCAiUmVkIENvbm5lY3RvciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODExCittc2dpZCAiWWVsbG93IENvbm5lY3RvciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODEyCittc2dpZCAiR3JlZW4gRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MTMKK21zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODE0Cittc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjgxNQorbXNnaWQgIldoaXRlIEZyb250IFBhbmVsIENvbm5lY3RvciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODE2Cittc2dpZCAiQmxhY2sgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtbWl4ZXIuYzo4MTcKK21zZ2lkICJHcmF5IEZyb250IFBhbmVsIENvbm5lY3RvciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODE4Cittc2dpZCAiT3JhbmdlIEZyb250IFBhbmVsIENvbm5lY3RvciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODE5Cittc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODIwCittc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODIxCittc2dpZCAiU3ByZWFkIE91dHB1dCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODIyCittc2dpZCAiRG93bm1peCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODY2Cittc2dpZCAiVmlydHVhbCBNaXhlciBJbnB1dCIKK21zZ3N0ciAiIgorCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6ODY4Cittc2dpZCAiVmlydHVhbCBNaXhlciBPdXRwdXQiCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1taXhlci5jOjg3MAorbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCittc2dzdHIgIiIKKworIy4gVFJBTlNMQVRPUlM6IG5hbWUgKyBudW1iZXIgb2YgYSB2b2x1bWUgbWl4ZXIgY29udHJvbAorIzogc3lzL29zczQvb3NzNC1taXhlci5jOjkyMQorIywgYy1mb3JtYXQKK21zZ2lkICIlcyAlZCBGdW5jdGlvbiIKK21zZ3N0ciAiIgorCisjLiBUUkFOU0xBVE9SUzogbmFtZSBvZiBhIHZvbHVtZSBtaXhlciBjb250cm9sCisjOiBzeXMvb3NzNC9vc3M0LW1peGVyLmM6OTI4CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIEZ1bmN0aW9uIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtc2luay5jOjQ5OCBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOjM2NworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1zaW5rLmM6NTA4IHN5cy9vc3M0L29zczQtc291cmNlLmM6Mzc3Cittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1zaW5rLmM6NTE5IHN5cy9vc3M0L29zczQtc291cmNlLmM6Mzg4CisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICLQkNC70LTRi9C9IFwiJXNcIiDQttCw0LHQtNGL0LrRgtGLINCw0YfQsNC70LPQsNC9INC20L7Qui4iCisKKyM6IHN5cy9vc3M0L29zczQtc2luay5jOjUyOCBzeXMvb3NzNC9vc3M0LXNvdXJjZS5jOjM5OAorbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1zaW5rLmM6NjQ0Cittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIiIKKworIzogc3lzL29zczQvb3NzNC1zaW5rLmM6NjUxCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtc291cmNlLmM6NTIwCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICIiCisKKyM6IHN5cy9vc3M0L29zczQtc291cmNlLmM6NTI3Cittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvcG8vbHQucG8gYi9wby9sdC5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2JkOTgwCi0tLSAvZGV2L251bGwKKysrIGIvcG8vbHQucG8KQEAgLTAsMCArMSw4ODkgQEAKKyMgTGl0aHVhbmlhbiB0cmFuc2xhdGlvbiBmb3IgZ3N0LXBsdWdpbnMtZ29vZC4KKyMgVGhpcyBmaWxlIGlzIHB1dCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMgR2ludGF1dGFzIE1pbGlhdXNrYXMgPGdpbnRhc0Bha2wubHQ+LCAyMDA4LgorIyBBdXJpbWFzIMSMZXJuaXVzIDxhdXJpc2M0QGdtYWlsLmNvbT4sIDIwMTAuCisjIMW9eWdpbWFudGFzIEJlcnXEjWthIDx1aWQwQGFrbC5sdD4sIDIwMTAuCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDAuMTAuMjMuMlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDEwLTA3LTE2IDE5OjM0KzAzMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IMW9eWdpbWFudGFzIEJlcnXEjWthIDx1aWQwQGFrbC5sdD5cbiIKKyJMYW5ndWFnZS1UZWFtOiBMaXRodWFuaWFuIDxrb21wX2x0QGtvbmZlcmVuY2lqb3MubHQ+XG4iCisiTGFuZ3VhZ2U6IGx0XG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0zOyBwbHVyYWw9KG4lMTA9PTEgJiYgbiUxMDAhPTExID8gMCA6IG4lMTA+PTIgJiYgKG4iCisiJTEwMDwxMCB8fCBuJTEwMD49MjApID8gMSA6IDIpO1xuIgorIlgtR2VuZXJhdG9yOiBWaXJ0YWFsIDAuNi4xXG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiTmVwYXZ5a28gZGVrb2R1b3RpIEpQRUcgcGF2ZWlrc2zEl2xpbyIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAi4oCeJXPigJwgYXRsaWVrYSDigJ4lc+KAnCIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiTmVwYXZ5a28gcHJpc2lqdW5ndGkgcHJpZSBzZXJ2ZXJpbyIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJOZXBhdnlrbyBwcmlzaWp1bmd0aSBwcmllIHNlcnZlcmlvIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJOZXBhdnlrbyBwcmlzaWp1bmd0aSBwcmllIGdhcnNvIHNlcnZlcmlvIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICIiCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICJOxJdyYSDEr3Zlc3RpZXMgZ2Fyc28gYXJiYSBqaXMgbmV0aW5rYW1hcywgQVZJIHNyYXV0YXMgYnVzIHN1Z2FkaW50YXMuIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICLFoGlhbWUgZmFpbGUgbsSXcmEgYXRrdXJ0aW7FsyBzcmF1dMWzLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRmFpbGFzIG5ldGlua2FtYXMgaXIgbmVnYWxpIGLFq3RpIGF0a3VydGFzLiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkZhaWxhcyBzdWdhZGludGFzIGlyIG5lZ2FsaSBixat0aSBhdGt1cnRhcy4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRmFpbGFzIG5lYmFpZ3RhcyBpciBuZWdhbGkgYsWrdGkgYXRrdXJ0YXMuIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICLFoGlhbWUgZmFpbGUgZXNhbnRpcyB2YWl6ZG8gxK9yYcWhYXMgZ2FsaSBixat0aSBhdGt1cnRhcyBuZWtvcmVrdGnFoWthaS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAixaBpYW1lIGZhaWxlIHBlciBkYXVnIHNyYXV0xbMuIEdyb2phbWkgdGlrIHBpcm1pZWppICVkIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJOZXJhc3RhIHBhbGFpa29txbMgc3JhdXTFsy4gSnVtcyBnYWxpIHJlaWvEl3RpIMSvZGllZ3RpIEdTdHJlYW1lciBSVFNQICIKKyJwYXBpbGRpbmlvIMSvc2tpZXDEryBSZWFsIG1lZGlhIHNyYXV0YW1zLiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorIk5lcmFzdGEgcGFsYWlrb23FsyBzcmF1dMWzLiBKdW1zIGdhbGkgcmVpa8SXdGkgbGVpc3RpIGRhdWdpYXUgdHJhbnNwb3J0byAiCisicHJvdG9rb2zFsywgYXJiYSBqxatzIG5ldHVyaXRlIHRpbmthbW8gR1N0cmVhbWVyIFJUU1AgcGFwaWxkaW5pbyDEr3NraWVwaW8uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIk5lcGF2eWtvIGF0dmVydGkgZ2Fyc28gxK9yZW5naW5pbyBncm9qaW11aS4gxK5yZW5naW7EryBuYXVkb2phIGtpdGEgcHJvZ3JhbWEuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJOZXBhdnlrbyBhdHZlcnRpIGdhcnNvIMSvcmVuZ2luaW8gZ3JvamltdWkuIErFq3MgbmV0dXJpdGUgbGVpZGltbyBhdHZlcnRpICIKKyLEr3JlbmdpbsSvLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJOZXBhdnlrbyBhdHZlcnRpIGdhcnNvIMSvcmVuZ2luaW8gZ3JvamltdWkuICIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyJOZXBhdnlrbyBhdHZlcnRpIGdhcnNvIMSvcmVuZ2luaW8gZ3JvamltdWkuIMWgaXMgZWxlbWVudGFzIG5lcGFsYWlrbyDFoWlvcyBPcGVuICIKKyJTb3VuZCBTeXN0ZW0gdmVyc2lqb3MuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIsWgaXMgZ2Fyc28gxK9yZW5naW55cyBuZXBhbGFpa28gZ3Jvamltby4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIkdhcnNvIGdyb2ppbW8ga2xhaWRhLiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAixaBpcyBnYXJzbyDEr3JlbmdpbnlzIG5lcGFsYWlrbyBncm9qaW1vLiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIktsYWlkYSDEr3JhxaFhbnQgacWhIGdhcnNvIMSvcmVuZ2luaW8uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiTmVwYXZ5a28gYXR2ZXJ0aSBnYXJzbyDEr3JlbmdpbmlvIMSvcmHFoXltdWkuIErFq3MgbmV0dXJpdGUgbGVpZGltbyBhdHZlcnRpICIKKyLEr3JlbmdpbsSvLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiTmVwYXZ5a28gYXR2ZXJ0aSBnYXJzbyDEr3JlbmdpbmlvIMSvcmHFoXltdWkuIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAixK5yYcWheW1vIMWhYWx0aW5pcyIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pa3JvZm9uYXMiCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICLErmVpbmFudGkgbGluaWphIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIlZpZGluaXMgQ0QiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiU1BESUYgxK92ZXN0aXMiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiQVVYIDEgxK92ZXN0aXMiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiQVVYIDIgxK92ZXN0aXMiCisKKyMsIGZ1enp5Cittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIlBlcmR1b3RpIHJhdHUiCisKKyMsIGZ1enp5Cittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJQZXJkdW90aSByYXR1IgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJHYXJzdW1hcyIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIkdhcnNpbmltYXMiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJNb25pdG9yaXVzIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiSW50ZWdydW90YXMgZ2Fyc2lha2FsYmlzIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICJBdXNpbsSXcyIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICJJxaFlaW5hbnRpIGxpbmlqYSIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiU1BESUYgacWhdmVzdGlzIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICJBVVggMSBpxaF2ZXN0aXMiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIkFVWCAyIGnFoXZlc3RpcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICJLbGFpZGEgc2thaXRhbnQgJWQgYmFpdHVzICgtxbMpIGnFoSDEr3JlbmdpbmlvIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJOZXBhdnlrbyBpxaFkxJdzdHl0aSBidWZlcmnFsyBpxaEgxK9yZW5naW5pbyDigJ4lc+KAnCIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIsSucmVuZ2luaW8g4oCeJXPigJwgdHZhcmt5a2zElyBuZXBhbGFpa28gam9racWzIMW+aW5vbcWzIMSvcmHFoXltbyBixatkxbMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIsSucmVuZ2luaW8g4oCeJXPigJwgdHZhcmt5a2zElyBuZXBhbGFpa28gam9racWzIMW+aW5vbcWzIMSvcmHFoXltbyBixatkxbMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICLErnJlbmdpbnlzIOKAniVz4oCcIG7El3JhIGnFoXZlc3RpZXMgxK9yZW5naW55cy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICLErnJlbmdpbnlzIOKAniVz4oCcIG7El3JhIMSvcmHFoXltbyDEr3JlbmdpbnlzLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIsSucmVuZ2lueXMg4oCeJXPigJwgbsSXcmEgxK9yYcWheW1vIMSvcmVuZ2lueXMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICLErnJlbmdpbnlzIOKAniVz4oCcIG7El3JhIGnFoXZlc3RpZXMgxK9yZW5naW55cy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICJOZXBhdnlrbyDEr3JlbmdpbmlvIOKAniVz4oCcIHBhcmFtZXRyxbMiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICJWYWl6ZG8gxK92ZXN0aWVzIMSvcmVuZ2lueXMgbmVwcmnEl23ElyBuYXVqxbMga2FkcsWzIGRhxb5uaW8gbnVzdGF0eW3Fsy4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiVmFpemRvIMSvdmVzdGllcyDEr3JlbmdpbnlzIG5lcHJpxJdtxJcgbmF1asWzIGthZHLFsyBkYcW+bmlvIG51c3RhdHltxbMuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICLErnJlbmdpbmlvIOKAniVz4oCcIHR2YXJreWtsxJcgbmVwYWxhaWtvIGpva2nFsyDFvmlub23FsyDEr3JhxaF5bW8gYsWrZMWzLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICLErnJlbmdpbmlvIOKAniVz4oCcIHR2YXJreWtsxJcgbmVwYWxhaWtvIGpva2nFsyDFvmlub23FsyDEr3JhxaF5bW8gYsWrZMWzLiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICJWYWl6ZG8gxK92ZXN0aWVzIMSvcmVuZ2lueXMgbmVwcmnEl23ElyBuYXVqxbMga2FkcsWzIGRhxb5uaW8gbnVzdGF0eW3Fsy4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOZXBhdnlrbyBnYXV0aSBkZXJpbnR1dm8gJWQgxK9yZW5naW55amUg4oCeJXPigJwgcGFyYW1ldHLFsy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIktsYWlkYSBza2FpdGFudCAlZCBiYWl0dXMgKC3FsykgacWhIMSvcmVuZ2luaW8g4oCeJXPigJwuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIsSucmVuZ2lueXMg4oCeJXPigJwgbsSXcmEgacWhdmVzdGllcyDEr3JlbmdpbnlzLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJOZXBhdnlrbyBudXN0YXR5dGkgxK92ZXN0aWVzICVkIMSvcmVuZ2lueWplICVzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIk5lcGF2eWtvIG51c3RhdHl0aSDEr3Zlc3RpZXMgJWQgxK9yZW5naW55amUgJXMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmVwYXZ5a28gZ2F1dGkgxK9yZW5naW5pbyDigJ4lc+KAnCBzaWduYWxvIHN0aXBydW1vLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAixK5yZW5naW5pbyDigJ4lc+KAnCB0dmFya3lrbMSXIG5lcGFsYWlrbyBqb2tpxbMgxb5pbm9txbMgxK9yYcWheW1vIGLFq2TFsy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJWYWl6ZG8gxK92ZXN0aWVzIMSvcmVuZ2lueXMgbmVwcmnEl23ElyBuYXVqxbMga2FkcsWzIGRhxb5uaW8gbnVzdGF0eW3Fsy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJWYWl6ZG8gxK92ZXN0aWVzIMSvcmVuZ2lueXMgbmVwcmnEl23ElyBuYXVqxbMga2FkcsWzIGRhxb5uaW8gbnVzdGF0eW3Fsy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiVmFpemRvIMSvdmVzdGllcyDEr3JlbmdpbnlzIG5lcHJpxJdtxJcgbmF1asWzIGthZHLFsyBkYcW+bmlvIG51c3RhdHltxbMuIgorCisjLCBmdXp6eQorbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICJOZXBhdnlrbyBkZWtvZHVvdGkgSlBFRyBwYXZlaWtzbMSXbGlvIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisiS2xhaWRhIGdhdW5hbnQgxK9yZW5naW5pbyDigJ4lc+KAnCBmdW5rY2lqYXM6IHRhaSBuxJdyYSB2NGwyIHR2YXJreWtsxJcuICIKKyJQYXRpa3JpbmtpdGUsIGFyIHRhaSB2NGwxIHR2YXJreWtsxJcuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiTmVwYXZ5a28gdcW+a2xhdXN0aSDEr3Zlc3RpZXMgJWQgxK9yZW5naW55amUgJXMgYXRyaWJ1dMWzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5lcGF2eWtvIGdhdXRpIGRlcmludHV2byAlZCDEr3JlbmdpbnlqZSDigJ4lc+KAnCBwYXJhbWV0csWzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5lcGF2eWtvIHXFvmtsYXVzdGkgbm9ybWFsxJdzIMSvcmVuZ2lueWplIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmVwYXZ5a28gZ2F1dGkgdmFsZHltbyBhdHJpYnV0xbMgxK9yZW5naW55amUg4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5lcGF2eWtvIG51c3RhdHl0aSDEr3JlbmdpbmlvIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJUYWkgbsSXcmEgxK9yZW5naW55cyDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJOZXBhdnlrbyBhdHZlcnRpIMSvcmVuZ2luaW8g4oCeJXPigJwgc2thaXR5bXVpIGlyIHJhxaF5bXVpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIsSucmVuZ2lueXMg4oCeJXPigJwgbsSXcmEgxK9yYcWheW1vIMSvcmVuZ2lueXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICLErnJlbmdpbnlzIOKAniVz4oCcIG7El3JhIGnFoXZlc3RpZXMgxK9yZW5naW55cy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICLErnJlbmdpbnlzIOKAniVz4oCcIG7El3JhIGnFoXZlc3RpZXMgxK9yZW5naW55cy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJOZXBhdnlrbyBhdHZlcnRpIMSvcmVuZ2luaW8g4oCeJXPigJwgc2thaXR5bXVpIGlyIHJhxaF5bXVpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmVwYXZ5a28gbnVzdGF0eXRpIG5vcm1hbMSXcyDEr3Jlbmdpbml1aSDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJOZXBhdnlrbyBnYXV0aSDEr3JlbmdpbmlvIOKAniVz4oCcIGRhYmFydGluaW8gZGVyaW50dXZvIGRhxb5uaW8uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIk5lcGF2eWtvIG51c3RhdHl0aSDEr3JlbmdpbmlvIOKAniVz4oCcIGRlcmludHV2byBkYcW+bmlvIMSvICVsdSBIei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmVwYXZ5a28gZ2F1dGkgxK9yZW5naW5pbyDigJ4lc+KAnCBzaWduYWxvIHN0aXBydW1vLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmVwYXZ5a28gZ2F1dGkgdmFsZGlrbGlvICVkIHJlaWvFoW3El3MgxK9yZW5naW55amUg4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOZXBhdnlrbyBudXN0YXR5dGkgdmFsZGlrbGlvICUyJGQgxK9yZW5naW55amUg4oCeJTMkc+KAnCByZWlrxaFtxJdzICUxJGQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiTmVwYXZ5a28gZ2F1dGkgZGFiYXJ0aW7El3MgxK92ZXN0aWVzIMSvcmVuZ2lueWplIOKAniVz4oCcLiBHYWxixat0IHRhaSByYWRpam8gIgorIsSvcmVuZ2lueXMiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJOZXBhdnlrbyBnYXV0aSBkYWJhcnRpbsSXcyDEr3Zlc3RpZXMgxK9yZW5naW55amUg4oCeJXPigJwuIEdhbGLFq3QgdGFpIHJhZGlqbyAiCisixK9yZW5naW55cyIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiTmVwYXZ5a28gbnVzdGF0eXRpIMSvdmVzdGllcyAlZCDEr3JlbmdpbnlqZSAlcy4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICJHYWxpbXlixJdzIGtlaXN0aSBza2lyaWFtxIVqxIUgZ2VixIUgb3BlcmFjaWpvcyB2eWtkeW1vIG1ldHUgZGFyIG7El3JhLiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiTmVnYWxpIHZlaWt0aSBiZSBsYWlrcm9kxb5pbyIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiVmlkaW7ElyBkdW9tZW7FsyBzcmF1dG8ga2xhaWRhLiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgIlZpZGluxJcgZHVvbWVuxbMgc3JhdXRvIGtsYWlkYS4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBjYXB0dXJlIgorI34gbXNnc3RyICLErnJlbmdpbnlzIOKAniVz4oCcIG7El3JhIGnFoXZlc3RpZXMgxK9yZW5naW55cy4iCisKKyN+IG1zZ2lkICJHb3QgdW5leHBlY3RlZCBmcmFtZSBzaXplIG9mICV1IGluc3RlYWQgb2YgJXUuIgorI34gbXNnc3RyICJHYXV0YXMgbmV0aWvEl3RhcyBrYWRybyBkeWRpcyAldSB2aWV0b2plICV1LiIKKworI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiTmVwYXZ5a28gZ2F1dGkgdmFpemRvIGthZHLFsyBpxaEgxK9yZW5naW5pbyDigJ4lc+KAnC4iCisKKyN+IG1zZ2lkICJGYWlsZWQgYWZ0ZXIgJWQgdHJpZXMuIGRldmljZSAlcy4gc3lzdGVtIGVycm9yOiAlcyIKKyN+IG1zZ3N0ciAiTmVwYXZ5a28gcG8gJWQgYmFuZHltxbMuIMSucmVuZ2lueXMgJXMuIFNpc3RlbW9zIGtsYWlkYTogJXMiCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICLFvWVtaSBkYcW+bmlhaSIKKworI34gbXNnaWQgIlRyZWJsZSIKKyN+IG1zZ3N0ciAiQXVrxaF0aSBkYcW+bmlhaSIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICJTaW50ZXphdG9yaXVzIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJHYXJzaWFrYWxiaWFpIgorCisjfiBtc2dpZCAiTGluZS1pbiIKKyN+IG1zZ3N0ciAixK52ZWRpbWFzIgorCisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgIkNEIgorCisjfiBtc2dpZCAiTWl4ZXIiCisjfiBtc2dzdHIgIk1hacWhaWtsaXMiCisKKyN+IG1zZ2lkICJQQ00tMiIKKyN+IG1zZ3N0ciAiUENNLTIiCisKKyN+IG1zZ2lkICJSZWNvcmQiCisjfiBtc2dzdHIgIsSucmHFoXltYXMiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICJHYXJzaW5pbW8gcmlib3NlIgorCisjfiBtc2dpZCAiT3V0LWdhaW4iCisjfiBtc2dzdHIgIlXFviBnYXJzaW5pbW8gcmlixbMiCisKKyN+IG1zZ2lkICJMaW5lLTEiCisjfiBtc2dzdHIgIkxpbmlqYS0xIgorCisjfiBtc2dpZCAiTGluZS0yIgorI34gbXNnc3RyICJMaW5pamEtMiIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAiTGluaWphLTMiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTEiCisjfiBtc2dzdHIgIlNrYWl0bWVuaW5pcy0xIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICJTa2FpdG1lbmluaXMtMiIKKworI34gbXNnaWQgIkRpZ2l0YWwtMyIKKyN+IG1zZ3N0ciAiU2thaXRtZW5pbmlzLTMiCisKKyN+IG1zZ2lkICJQaG9uZS1pbiIKKyN+IG1zZ3N0ciAiVGVsZWZvbmFzLcSvdiIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAiVGVsZWZvbmFzLWnFoXYiCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAiVmlkZW8iCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAiUmFkaWphcyIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIk5lcGF2eWtvIGF0dmVydGkgZ2Fyc28gxK9yZW5naW5pbyBtYWnFoWlrbGlvIHZhbGR5bW8gYXBkb3JvamltdWkuIgorCisjfiBtc2dpZCAiIgorI34gIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4gVGhpcyB2ZXJzaW9uIG9mICIKKyN+ICJ0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiTmVwYXZ5a28gYXR2ZXJ0aSBnYXJzbyDEr3JlbmdpbmlvIG1hacWhaWtsaW8gdmFsZHltbyBhcGRvcm9qaW11aS4gxaBpcyAiCisjfiAiZWxlbWVudGFzIG5lcGFsYWlrbyDFoWlvcyBPcGVuIFNvdW5kIFN5c3RlbSB2ZXJzaWpvcy4iCisKKyN+IG1zZ2lkICJNYXN0ZXIiCisjfiBtc2dzdHIgIlBhZ3JpbmRpbmlzIgorCisjfiBtc2dpZCAiRnJvbnQiCisjfiBtc2dzdHIgIlByaWVraW5pcyIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIkdhbGluaXMiCisKKyN+IG1zZ2lkICJIZWFkcGhvbmVzIgorI34gbXNnc3RyICJBdXNpbsSXcyIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAiVmlkdXJpbmlzIgorCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICJMRkUiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAiU3VwYW50aXMiCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICLFoG9uaW5pcyIKKworI34gbXNnaWQgIkFVWCBPdXQiCisjfiBtc2dzdHIgIkFVWCBpxaF2ZXN0aXMiCisKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAiM0QgZ2lsdW1pbmlzIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICIzRCB2aWR1cmluaXMiCisKKyN+IG1zZ2lkICIzRCBFbmhhbmNlIgorI34gbXNnc3RyICIzRCBwYWtlbHRhcyIKKworI34gbXNnaWQgIlRlbGVwaG9uZSIKKyN+IG1zZ3N0ciAiVGVsZWZvbmFzIgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgIlZhaXpkbyDEr3Zlc3RpcyIKKworI34gbXNnaWQgIkFVWCBJbiIKKyN+IG1zZ3N0ciAiQVVYIMSvdmVzdGlzIgorCisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIsSucmHFoXltbyBnYXJzaW5pbWFzIgorCisjfiBtc2dpZCAiT3V0cHV0IEdhaW4iCisjfiBtc2dzdHIgIknFoXZlc3RpZXMgZ2Fyc2luaW1hcyIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgQm9vc3QiCisjfiBtc2dzdHIgIk1pa3JvZm9ubyBwYWdhcnNpbmltYXMiCisKKyN+IG1zZ2lkICJEaWFnbm9zdGljIgorI34gbXNnc3RyICJEaWFnbm9zdGlrYSIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgIsW9ZW3Fs2rFsyBkYcW+bmnFsyBzdXN0aXByaW5pbWFzIgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgIkdyb2ppbW8gcHJpZXZhZGFpIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIsSudmVzdGlzIgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIk1vbml0b3JpYXVzIMWhYWx0aW5pcyIKKworI34gbXNnaWQgIktleWJvYXJkIEJlZXAiCisjfiBtc2dzdHIgIktsYXZpYXTFq3JvcyBweXBzxJdqaW1hcyIKKworI34gbXNnaWQgIlNpbXVsYXRlIFN0ZXJlbyIKKyN+IG1zZ3N0ciAiSW1pdHVvdGkgc3RlcmVvIgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICJTdGVyZW8iCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAiRXJkdmluaXMgZ2Fyc2FzIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBHYWluIgorI34gbXNnc3RyICJNaWtyb2Zvbm8gZ2Fyc2luaW1hcyIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICJHYXJzaWFrYWxiaW8gxaFhbHRpbmlzIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgIk1pa3JvZm9ubyDFoWFsdGluaXMiCisKKyN+IG1zZ2lkICJKYWNrIgorI34gbXNnc3RyICJKYWNrIgorCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICJDZW50cmFzIC8gTEZFIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAiU3RlcmVvIG1hacWhYSIKKworI34gbXNnaWQgIk1vbm8gTWl4IgorI34gbXNnc3RyICJNb25vIG1hacWhYSIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAixK52ZXN0aWVzIG1hacWhYSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAiTWlrcm9mb25hcyAxIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICJNaWtyb2ZvbmFzIDIiCisKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAiU2thaXRtZW5pbsSXIGnFoXZlc3RpcyIKKworI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgIlNrYWl0bWVuaW7ElyDEr3Zlc3RpcyIKKworI34gbXNnaWQgIkhETUkiCisjfiBtc2dzdHIgIkhETUkiCisKKyN+IG1zZ2lkICJNb2RlbSIKKyN+IG1zZ3N0ciAiTW9kZW1hcyIKKworI34gbXNnaWQgIkhhbmRzZXQiCisjfiBtc2dzdHIgIlJhZ2VsaXMiCisKKyN+IG1zZ2lkICJPdGhlciIKKyN+IG1zZ3N0ciAiS2l0YSIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgIk7El3JhIgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgIsSuanVuZ3RhIgorCisjfiBtc2dpZCAiT2ZmIgorI34gbXNnc3RyICJJxaFqdW5ndGEiCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICJOdXRpbGR5dGEiCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICJHcmVpdGFzIgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgIkxhYmFpIMW+ZW1hIgorCisjfiBtc2dpZCAiTG93IgorI34gbXNnc3RyICLFvWVtYSIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAiVmlkdXRpbsSXIgorCisjfiBtc2dpZCAiSGlnaCIKKyN+IG1zZ3N0ciAiQXVrxaF0YSIKKworI34gbXNnaWQgIlZlcnkgSGlnaCIKKyN+IG1zZ3N0ciAiTGFiYWkgYXVrxaF0YSIKKworI34gbXNnaWQgIlByb2R1Y3Rpb24iCisjfiBtc2dzdHIgIlN1a8WrcmltbyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIlByaWVraW5pbyBza3lkZWxpbyBtaWtyb2ZvbmFzIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBJbiIKKyN+IG1zZ3N0ciAiUHJpZWtpbmlvIHNreWRlbGlvIMSvZWluYW50aSBsaW5pamEiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICJQcmlla2luaW8gc2t5ZGVsaW8gYXVzaW7El3MiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIE91dCIKKyN+IG1zZ3N0ciAiUHJpZWtpbmlvIHNreWRlbGlvIGnFoWVpbmFudGkgbGluaWphIgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICLFvWFsaWFzIGtpxaF0dWthcyIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICJSb8W+aW5pcyBracWhdHVrYXMiCisKKyN+IG1zZ2lkICJCbHVlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiTcSXbHluYXMga2nFoXR1a2FzIgorCisjfiBtc2dpZCAiV2hpdGUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJCYWx0YXMga2nFoXR1a2FzIgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICJKdW9kYXMga2nFoXR1a2FzIgorCisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlBpbGthcyBracWhdHVrYXMiCisKKyN+IG1zZ2lkICJPcmFuZ2UgQ29ubmVjdG9yIgorI34gbXNnc3RyICJPcmFuxb5pbmlzIGtpxaF0dWthcyIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlJhdWRvbmFzIGtpxaF0dWthcyIKKworI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkdlbHRvbmFzIGtpxaF0dWthcyIKKworI34gbXNnaWQgIkdyZWVuIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAixb1hbGlhcyBwcmlla2luaW8gc2t5ZGVsaW8ga2nFoXR1a2FzIgorCisjfiBtc2dpZCAiUGluayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlJvxb5pbmlzIHByaWVraW5pbyBza3lkZWxpbyBracWhdHVrYXMiCisKKyN+IG1zZ2lkICJCbHVlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiTcSXbHluYXMgcHJpZWtpbmlvIHNreWRlbGlvIGtpxaF0dWthcyIKKworI34gbXNnaWQgIldoaXRlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQmFsdGFzIHByaWVraW5pbyBza3lkZWxpbyBracWhdHVrYXMiCisKKyN+IG1zZ2lkICJCbGFjayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkp1b2RhcyBwcmlla2luaW8gc2t5ZGVsaW8ga2nFoXR1a2FzIgorCisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlBpbGthcyBwcmlla2luaW8gc2t5ZGVsaW8ga2nFoXR1a2FzIgorCisjfiBtc2dpZCAiT3JhbmdlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiT3JhbsW+aW5pcyBwcmlla2luaW8gc2t5ZGVsaW8ga2nFoXR1a2FzIgorCisjfiBtc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUmF1ZG9uYXMgcHJpZWtpbmlvIHNreWRlbGlvIGtpxaF0dWthcyIKKworI34gbXNnaWQgIlllbGxvdyBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkdlbHRvbmFzIHByaWVraW5pbyBza3lkZWxpbyBracWhdHVrYXMiCisKKyN+IG1zZ2lkICJTcHJlYWQgT3V0cHV0IgorI34gbXNnc3RyICJTa2xlaXN0aSBpxaF2ZXN0xK8iCisKKyN+IG1zZ2lkICJEb3dubWl4IgorI34gbXNnc3RyICJTdW1hacWheXRpIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBJbnB1dCIKKyN+IG1zZ3N0ciAiVmlydHVhbGF1cyBtYWnFoWlrbGlvIMSvdmVzdGlzIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBPdXRwdXQiCisjfiBtc2dzdHIgIlZpcnR1YWxhdXMgbWFpxaFpa2xpbyBpxaF2ZXN0aXMiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICJWaXJ0dWFsYXVzIG1hacWhaWtsaW8ga2FuYWxhaSIKKworI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyAlZCBmdW5rY2lqYSIKKworI34gbXNnaWQgIiVzIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyBmdW5rY2lqYSIKKworI34gbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgb24gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJLbGFpZGEgc2thaXRhbnQgJWQgYmFpdHVzICgtxbMpIMSvcmVuZ2lueWplIOKAniVz4oCcLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlbnF1ZXVlIGJ1ZmZlcnMgaW4gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJOZXBhdnlrbyBzdXN0YXR5dGkgxK8gZWlsxJcgYnVmZXJpxbMgxK9yZW5naW55amUg4oCeJXPigJwuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNvdW5kIHNlcnZlciIKKyN+IG1zZ3N0ciAiTmVwYXZ5a28gcHJpc2lqdW5ndGkgcHJpZSBnYXJzbyBzZXJ2ZXJpbyIKKworI34gbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBzb3VuZCBzZXJ2ZXIgY2FwYWJpbGl0aWVzIgorI34gbXNnc3RyICJOZXBhdnlrbyB1xb5rbGF1c3RpIGdhcnNvIHNlcnZlcmlvIGdhbGlteWJpxbMiCisKKyN+IG1zZ2lkICJEZXNjcmliZXMgdGhlIHNlbGVjdGVkIGlucHV0IGVsZW1lbnQuIgorI34gbXNnc3RyICJBcHJhxaFvIHBhc2lyaW5rdMSFIMSvdmVzdGllcyBlbGVtZW50xIUuIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBvdXRwdXQgZWxlbWVudCBmb3IgQXVkaW8vVmlkZW8gQ29uZmVyZW5jaW5nLiIKKyN+IG1zZ3N0ciAiQXByYcWhbyBwYXNpcmlua3TEhSBpxaF2ZXN0aWVzIGVsZW1lbnTEhSBnYXJzby92YWl6ZG8ga29uZmVyZW5jaWpvbXMuIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBvdXRwdXQgZWxlbWVudCBmb3IgTXVzaWMgYW5kIE1vdmllcy4iCisjfiBtc2dzdHIgIkFwcmHFoW8gcGFzaXJpbmt0xIUgacWhdmVzdGllcyBlbGVtZW50xIUgbXV6aWthaSBpciBmaWxtYW1zLiIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgb3V0cHV0IGVsZW1lbnQuIgorI34gbXNnc3RyICJBcHJhxaFvIHBhc2lyaW5rdMSFIGnFoXZlc3RpZXMgZWxlbWVudMSFLiIKKworI34gbXNnaWQgIkdTdHJlYW1lciBhdWRpb3NpbmsgZm9yIEF1ZGlvL1ZpZGVvIENvbmZlcmVuY2luZyIKKyN+IG1zZ3N0ciAiR1N0cmVhbWVyIGdhcnNvIGnFoXZlc3RpZXMgZWxlbWVudGFzIGdhcnNvL3ZhaXpkbyBrb25mZXJlbmNpam9tcyIKKworI34gbXNnaWQgIkdTdHJlYW1lciBhdWRpb3NpbmsgZm9yIE11c2ljIGFuZCBNb3ZpZXMiCisjfiBtc2dzdHIgIkdTdHJlYW1lciBnYXJzbyBpxaF2ZXN0aWVzIGVsZW1lbnRhcyBtdXppa2FpIGlyIGZpbG1hbXMiCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiBwbGF5IGF1ZGlvIHVzaW5nIGFueSBudW1iZXIgb2Ygb3V0cHV0IGVsZW1lbnRzLiBTb21lICIKKyN+ICJwb3NzaWJsZSBjaG9pY2VzIGFyZSBvc3NzaW5rLCBlc2RzaW5rIGFuZCBhbHNhc2luay4gVGhlIGF1ZGlvc2luayBjYW4gYmUgIgorI34gImEgcGFydGlhbCBwaXBlbGluZSBpbnN0ZWFkIG9mIGp1c3Qgb25lIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiR1N0cmVhbWVyIGdhbGkgZ3JvdGkgZ2Fyc8SFIG5hdWRvZGFtYXMgYmV0IGtva8SvIGnFoXZlc3RpZXMgZWxlbWVudMWzIGtpZWvEry4gIgorI34gIktlbGV0YXMgZ2FsaW3FsyBwYXNpcmlua2ltxbM6IG9zc3NpbmssIGVzZHNpbmsgaXIgYWxzYXNpbmsuIEdhcnNvIGnFoXZlc3RpZXMgIgorI34gImVsZW1lbnTEhSBnYWxpIHN1ZGFyeXRpIGRhbGluaXMga29udmVqZXJpcywgbmUgdGlrIHZpZW5hcyBlbGVtZW50YXMuIgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcGxheSB2aWRlbyB1c2luZyBhbnkgbnVtYmVyIG9mIG91dHB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgeHZpbWFnZXNpbmssIHhpbWFnZXNpbmssIHNkbHZpZGVvc2luayBhbmQgYWFzaW5rLiAiCisjfiAiVGhlIHZpZGVvc2luayBjYW4gYmUgYSBwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJHU3RyZWFtZXIgZ2FsaSBncm90aSB2YWl6ZG8gxK9yYcWhdXMgbmF1ZG9kYW1hcyBiZXQga29rxK8gacWhdmVzdGllcyBlbGVtZW50xbMgIgorI34gImtpZWvEry4gS2VsZXRhcyBnYWxpbcWzIHBhc2lyaW5raW3FszogeHZpbWFnZXNpbmssIHhpbWFnZXNpbmssIHNkbHZpZGVvc2luayAiCisjfiAiaXIgYWFzaW5rLiBWYWl6ZG8gacWhdmVzdGllcyBlbGVtZW50xIUgZ2FsaSBzdWRhcnl0aSBkYWxpbmlzIGtvbnZlamVyaXMsIG5lICIKKyN+ICJ0aWsgdmllbmFzIGVsZW1lbnRhcy4iCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiBwdXQgdmlzdWFsaXphdGlvbiBwbHVnaW5zIGluIGEgcGlwZWxpbmUgdG8gdHJhbnNmb3JtIGF1ZGlvICIKKyN+ICJzdHJlYW0gaW4gdmlkZW8gZnJhbWVzLiBEZWZhdWx0IGlzIGdvb20gYnV0IG1vcmUgdmlzdWFsaXphdGlvbiBwbHVnaW5zICIKKyN+ICJ3aWxsIGJlIHBvcnRlZCBzb29uLiBUaGUgdmlzdWFsaXphdGlvbiBwbHVnaW4gY2FuIGJlIGEgcGFydGlhbCBwaXBlbGluZSAiCisjfiAiaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkdTdHJlYW1lciBnYWxpIMSvZMSXdGkgdmFpemRvIGVmZWt0xbMgxK9za2llcGl1cyDEryBrb252ZWplcsSvLCBrYWQgIgorI34gInRyYW5zZm9ybXVvdMWzIGdhcnNvIHNyYXV0xIUgdmFpemRvIGthZHJ1b3NlLiBOdW1hdHl0YXNpcyDEr3NraWVwaXMgeXJhICIKKyN+ICJnb29tLCB0YcSNaWF1IGdyZWl0dSBtZXR1IGJ1cyByZWFsaXp1b3RhIGRhdWdpYXUgdmFpemRvIGVmZWt0xbMgxK9za2llcGnFsy4gIgorI34gIlZhaXpkbyBlZmVrdG8gxK9za2llcMSvIGdhbGkgc3VkYXJ5dGkgZGFsaW5pcyBrb252ZWplcmlzLCBuZSB0aWsgdmllbmFzICIKKyN+ICJlbGVtZW50YXMuIgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcmVjb3JkIGF1ZGlvIHVzaW5nIGFueSBudW1iZXIgb2YgaW5wdXQgZWxlbWVudHMuIFNvbWUgIgorI34gInBvc3NpYmxlIGNob2ljZXMgYXJlIG9zc3NyYywgZXNkc3JjIGFuZCBhbHNhc3JjLiBUaGUgYXVkaW8gc291cmNlIGNhbiBiZSAiCisjfiAiYSBwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJHU3RyZWFtZXIgZ2FsaSDEr3JhxaF5dGkgZ2Fyc8SFIG5hdWRvZGFtYXMgYmV0IGtva8SvIMSvdmVzdGllcyBlbGVtZW50xbMgIgorI34gInNrYWnEjWnFsy4gS2VsZXRhcyBnYWxpbcWzIHBhc2lyaW5raW3Fszogb3Nzc3JjLCBlc2RzcmMgaXIgYWxzYXNyYy4gR2Fyc28gIgorI34gIsWhYWx0aW7EryBnYWxpIHN1ZGFyeXRpIGRhbGluaXMga29udmVqZXJpcywgbmUgdGlrIHZpZW5hcyBlbGVtZW50YXMuIgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcmVjb3JkIHZpZGVvIGZyb20gYW55IG51bWJlciBvZiBpbnB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgdjRsc3JjIGFuZCB2aWRlb3Rlc3RzcmMuIFRoZSB2aWRlbyBzb3VyY2UgY2FuIGJlIGEgIgorI34gInBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkdTdHJlYW1lciBnYWxpIMSvcmHFoXl0aSB2YWl6ZMSFIGnFoSBiZXQga29raW8gc2thacSNaWF1cyDEr3Zlc3RpZXMgZWxlbWVudMWzLiAiCisjfiAiS2VsZXRhcyBnYWxpbcWzIHBhc2lyaW5raW3FszogdjRsc3JjIGlyIHZpZGVvdGVzdHNyYy4gVmFpemRvIMWhYWx0aW7EryBnYWxpICIKKyN+ICJzdWRhcnl0aSBkYWxpbmlzIGtvbnZlamVyaXMsIG5lIHRpayB2aWVuYXMgZWxlbWVudGFzLiIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIGF1ZGlvIHNvdXJjZSIKKyN+IG1zZ3N0ciAibnVtYXR5dGFzaXMgR1N0cmVhbWVyIGdhcnNvIMWhYWx0aW5pcyIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIGF1ZGlvc2luayIKKyN+IG1zZ3N0ciAibnVtYXR5dGFzaXMgR1N0cmVhbWVyIGdhcnNvIGnFoXZlc3RpZXMgZWxlbWVudGFzIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgdmlkZW8gc291cmNlIgorI34gbXNnc3RyICJudW1hdHl0YXNpcyBHU3RyZWFtZXIgdmFpemRvIMWhYWx0aW5pcyIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIHZpZGVvc2luayIKKyN+IG1zZ3N0ciAibnVtYXR5dGFzaXMgR1N0cmVhbWVyIHZhaXpkbyBpxaF2ZXN0aWVzIGVsZW1lbnRhcyIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIHZpc3VhbGl6YXRpb24gcGx1Z2luIgorI34gbXNnc3RyICJudW1hdHl0YXNpcyBHU3RyZWFtZXIgdmFpemRvIGVmZWt0byDEr3NraWVwaXMiCisKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgR1N0cmVhbWVyIGF1ZGlvc2luayBmb3IgQXVkaW8vVmlkZW8gQ29uZmVyZW5jaW5nIgorI34gbXNnc3RyICIiCisjfiAiR1N0cmVhbWVyIGdhcnNvIGnFoXZlc3RpZXMgZWxlbWVudG8gZ2Fyc28vdmFpemRvIGtvbmZlcmVuY2lqb21zIGFwcmHFoXltYXMiCisKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgR1N0cmVhbWVyIGF1ZGlvc2luayBmb3IgTXVzaWMgYW5kIE1vdmllcyIKKyN+IG1zZ3N0ciAiR1N0cmVhbWVyIGdhcnNvIGnFoXZlc3RpZXMgZWxlbWVudG8gbXV6aWthaSBpciBmaWxtYW1zIGFwcmHFoXltYXMiCisKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW9zaW5rIgorI34gbXNnc3RyICJudW1hdHl0b2pvIEdTdHJlYW1lciBnYXJzbyBpxaF2ZXN0aWVzIGVsZW1lbnRvIGFwcmHFoXltYXMiCisKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgZGVmYXVsdCBHU3RyZWFtZXIgYXVkaW9zcmMiCisjfiBtc2dzdHIgIm51bWF0eXRvam8gR1N0cmVhbWVyIGdhcnNvIMWhYWx0aW5pbyBhcHJhxaF5bWFzIgorCisjfiBtc2dpZCAiVGhpcyBmaWxlIGlzIGVuY3J5cHRlZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCisjfiBtc2dzdHIgIsWgaXMgZmFpbGFzIHXFvsWhaWZydW90YXMgaXIgbmVnYWxpIGLFq3RpIHBhZ3JvdGFzLiIKKworI34gbXNnaWQgIkRpc2MgaXMgbm90IGFuIEF1ZGlvIENELiIKKyN+IG1zZ3N0ciAiRGlza2FzIG7El3JhIEF1ZGlvIENEIgorCisjfiBtc2dpZCAiQ291bGQgbm90IHJlYWQgZnJvbSBDRC4iCisjfiBtc2dzdHIgIk5lcGF2eWtvIHNrYWl0eXRpIGnFoSBDRC4iCmRpZmYgLS1naXQgYS9wby9sdi5wbyBiL3BvL2x2LnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZGFjNDIKLS0tIC9kZXYvbnVsbAorKysgYi9wby9sdi5wbwpAQCAtMCwwICsxLDc4NSBAQAorIyBMYXR2aWFuIHRyYW5zbGF0aW9uIG9mIGdzdC1wbHVnaW5zLgorIyBUaGlzIGZpbGUgaXMgcHV0IGluIHRoZSBwdWJsaWMgZG9tYWluLgorIworIyBBcnZpcyBMxIFjaXMgPGFydmlzLmxhY2lzQGluYm94Lmx2PiwgMjAwOS4KKyMgUmloYXJkcyBQcmllZGl0aXMgPHJwcmllZGl0aXNAZ21haWwuY29tPiwgMjAxMC4KKyMgUmloYXJkcyBQcmllZGl0aXMgPHJwcmllZGl0aXNAZ21haWwuY29tPiwgMjAxMS4KKyMgUsWrZG9sZnMgTWF6dXJzIDxydWRvbGZzLm1henVyc0BnbWFpbC5jb20+LCAyMDE0LgorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZCAxLjIuMVxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDE0LTA0LTIwIDE2OjM4KzAzMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IFJpaGFyZHMgUHJpZWRpdGlzIDxycHJpZWRpdGlzQGdtYWlsLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBMYXR2aWFuIDx0cmFuc2xhdGlvbi10ZWFtLWx2QGxpc3RzLnNvdXJjZWZvcmdlLm5ldD5cbiIKKyJMYW5ndWFnZTogbHZcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTM7IHBsdXJhbD0obiUxMD09MSAmJiBuJTEwMCE9MTEgPyAwIDogbiAhPSAwID8gMSA6ICIKKyIyKTtcbiIKKyJYLUdlbmVyYXRvcjogTG9rYWxpemUgMS41XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIk5hdiBhdHJhc3RzIEphY2sgc2VydmVyaXMiCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIk5laXpkZXbEgXMgYXRrb2TEk3QgSlBFRyBhdHTEk2x1IgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICLigJwlc+KAnSBpenBpbGRhIOKAnCVz4oCdIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJOZXZhcsSTamEgc2F2aWVub3RpZXMgYXIgc2VydmVyaSIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJVUkwgbmF2IGllc3RhdMSrdHMuIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJOZXZhciBhdHJhc3Qgc2VydmVyYSBub3NhdWt1bXUuIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIk5ldmFyIGl6dmVpZG90IHNhdmllbm9qdW11IGFyIHNlcnZlcmkuIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiTmVpemRldsSBcyBpenZlaWRvdCBkcm/FoW8gc2F2aWVub2p1bXUuIgorCisjLCBmdXp6eQorbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIk5vdGlrYSB0xKtrbGEga8S8xatkYSwgdmFpIHNlcnZlcmlzIG5lZ2FpZMSrdGkgYWl6dsSTcmEgc2F2aWVub2p1bXUuIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICJTZXJ2ZXJpcyBub3PFq3TEq2phIHNsaWt0dXMgZGF0dXMuIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIlNlcnZlcmlzIG5lYXRiYWxzdGEgbWVrbMSTxaFhbnUuIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICJOYXYgdmFpIG5lZGVyxKtncyBpZXZhZGVzIGF1ZGlvLCBBVkkgc3RyYXVtZSB0aWtzIGJvasSBdGEuIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICLFoMSrIGRhdG5lIG5lc2F0dXIgbmV2aWVudSBhdHNrYcWGb2phbXUgc3RyYXVtaS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIsWgxKsgZGF0bmUgaXIgbmVkZXLEq2dhIHVuIHRvIG5ldmFyIGF0c2thxYZvdC4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiTmV2YXIgYXRza2HFhm90IHN0cmF1bWksIGpvIHTEgSBpciDFoWlmcsSTdGEgYXIgUGxheVJlYWR5IERSTS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIsWgxKsgZGF0bmUgaXIgYm9qxIF0YSB1biB0byBuZXZhciBhdHNrYcWGb3QuIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICJOZWRlcsSrZ3MgYXRvbWEgaXptxJNycy4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIsWgxKsgZGF0bmUgaXIgbmVwYWJlaWd0YSB1biB0byBuZXZhciBhdHNrYcWGb3QuIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICJWaWRlbyDFoWFqxIEgZGF0bsSTIHZhcsSTdHUgdGlrdCBhdHNrYcWGb3RzIG5lcGFyZWl6aS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAixaDEqyBkYXRuZSBzYXR1ciBwxIFyxIFrIGRhdWR6IHN0cmF1bWp1LiBUaWVrIGF0c2thxYZvdGEgdGlrYWkgcGlybcSBICVkIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJOZXRpa2EgYXRyYXN0YSBhdGJhbHN0xKt0YSBzdHJhdW1lLiBJZXNwxJNqYW1zLCBqdW1zIGrEgWluc3RhbMSTIEdTdHJlYW1lciBSVFNQICIKKyJwYXBsYcWhaW7EgWp1bWEgc3ByYXVkbmkgUmVhbCBtZWRpYSBzdHJhdW3Ek20uIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiTmV0aWthIGF0cmFzdGEgYXRiYWxzdMSrdGEgc3RyYXVtZS4gSWVzcMSTamFtcywganVtcyBqxIFhdMS8YXVqIHZhaXLEgWsgIgorInRyYW5zcG9ydGEgcHJvdG9rb2xpIHZhaSBhcsSrIHRyxatrc3QgR1N0cmVhbWVyIFJUU1AgcGFwbGHFoWluxIFqdW1hIHNwcmF1ZG5pcy4gIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIk5ldmFyxJNqYSBhdHbEk3J0IGF1ZGlvIGllcsSrY2kgYXRza2HFhm/FoWFuYWkuIEllcsSrY2kgcGHFoWxhaWsgaXptYW50byBjaXRhICIKKyJsaWV0b3RuZS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIk5ldmFyIGF0dsSTcnQgYXVkaW8gaWVyxKtjaSBhdHNrYcWGb8WhYW5haS4gSnVtcyBuYXYgbmVwaWVjaWXFoWFtxIFzIGF0xLxhdWphcywgbGFpICIKKyJhdHbEk3J0dSBpZXLEq2NpLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJOZXZhcsSTamEgYXR2xJNydCBhdWRpbyBpZXLEq2NpIGF0c2thxYZvxaFhbmFpLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyJOZXZhciBhdHbEk3J0IGF1ZGlvIGllcsSrY2kgYXRza2HFhm/FoWFuYWkuIMWgxKsgQXR2xJNydMSBcyBTa2HFhmFzIFNpc3TEk21hcyB2ZXJzaWphICIKKyJuZWF0YmFsc3RhIMWhbyBlbGVtZW50dS4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAixaDEqyBhdWRpbyBpZXLEq2NlIG5lYXRiYWxzdGEgYXRza2HFhm/FoWFudS4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIkF1ZGlvIGF0c2thxYZvxaFhbmFzIGvEvMWrZGEuIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLFoMSrIGF1ZGlvIGllcsSrY2UgbmVhdGJhbHN0YSBpZXJha3N0xKvFoWFudS4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJLxLzFq2RhLCBpZXJha3N0b3Qgbm8gYXVkaW8gaWVyxKtjZXMuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiTmV2YXIgYXR2xJNydCBhdWRpbyBpZXLEq2NpIGllcmFrc3TEq8WhYW5haS4gSnVtcyBuYXYgbmVwaWVjaWXFoWFtbyBwaWVrxLx1dmVzICIKKyJ0aWVzxKtidSwgbGFpIGF0dsSTcnR1IGllcsSrY2kuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICJOZXZhcsSTamEgYXR2xJNydCBhdWRpbyBpZXLEq2NpIGllcmFrc3TEq8WhYW5haS4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICIiCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICJJZXJha3N0xKvFoWFuYXMgYXZvdHMiCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWtyb2ZvbnMiCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJTa2HFhmFzIGllZWphIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIklla8WhxJNqYWlzIENEIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIlNQRElGIGllZWphIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIkFVWCAxIGllZWphIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIkFVWCAyIGllZWphIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIktvZGVrYSBhdGdyaWV6ZW5pc2thaXMgY2lrbHMiCisKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIlN1blZUUyBhdGdyaWV6ZW5pc2thaXMgY2lrbHMiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIlNrYcS8dW1zIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiUGllYXVndW1zIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiTW9uaXRvcnMiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJJZWLFq3bEk3RhaXMgc2thxLxydW5pcyIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiQXVzdGnFhmFzIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIlNrYcWGYXMgaXplamEiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNQRElGIGl6ZWphIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICJBVVggMSBpemVqYSIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiQVVYIDIgaXplamEiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiUmFkxIFzIGvEvMWrZGEsIG5vbGFzb3QgJWQgYmFpdHVzIG5vIGllcsSrY2VzIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiTmVpemRldsSBcyB1enNrYWl0xKt0IGllc3DEk2phbW9zIHZpZGVvIGZvcm3EgXR1cywgYXIga28gdmFyIHN0csSBZMSBdCDigJwlc+KAnSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTmV2YXIgaXp2aWV0b3QgYnVmZXJ1cyBubyBpZXLEq2NlcyDigJwlc+KAnSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiSWVyxKtjZXMgXCIlc1wiIGRyYWl2ZXJpcyBuZWF0YmFsc3RhIElPIG1ldG9kaSAlZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIkllcsSrY2VzIOKAnCVz4oCdIGRyYWl2ZXJpcyBuZWF0YmFsc3RhIG5ldmllbnUgemluxIFtbyBpZXJha3N0xKvFoWFuYXMgbWV0b2RpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJJZXLEq2NlIOKAnCVz4oCdIGlyIGFpesWGZW10YSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiSWVyxKtjZSDigJwlc+KAnSBuZXZhciB0dmVydCBhciAlZHglZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiSWVyxKtjZSDigJwlc+KAnSBuZXZhciB0dmVydCBub3LEgWTEq3RhasSBIGZvcm3EgXTEgSIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiSWVyxKtjZSDigJwlc+KAnSBuZWF0YmFsc3RhIHZpZGVvIHR2ZXLFoWFudSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIk5ldmFyIG5vbGFzxKt0IHBhcmFtZXRydXMgbm8gaWVyxKtjZXMg4oCcJXPigJ0iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIlZpZGVvIGllcsSrY2UgbmVwaWXFhsSTbWEgamF1bm9zIGthZHJ1IMSBdHJ1bWEgaWVzdGF0xKtqdW11cy4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiVmlkZW8gaWVyxKtjZSBuZXBpZcWGxJNtYSBqYXVub3Mga2FkcnUgxIF0cnVtYSBpZXN0YXTEq2p1bXVzLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiSWVyxKtjZXMgXCIlc1wiIGRyYWl2ZXJpcyBuZWF0YmFsc3RhIElPIG1ldG9kaSAlZCIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICJJZXLEq2NlcyBcIiVzXCIgZHJhaXZlcmlzIG5lYXRiYWxzdGEgSU8gbWV0b2RpICVkIgorCisjLCBmdXp6eQorbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICJWaWRlbyBpZXLEq2NlIG5ldmFyxJNqYSBpenZlaWRvdCBidWZlcmEgcMWrbHUuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiVmlkZW8gaWVyxKtjZSBuZXZhcsSTamEgaXp2ZWlkb3QgYnVmZXJhIHDFq2x1LiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmVpemRldsSBcyBzYcWGZW10IHNrYcWGb3TEgWphICVkIGllc3RhdMSranVtdXMgbm8gaWVyxKtjZXMg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkvEvMWrZGEsIHNhxYZlbW90IGllc3DEk2phcyBubyBpZXLEq2NlcyDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJJZXLEq2NlIOKAnCVz4oCdIG5hdiBza2HFhm90xIFqcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJOZWl6ZGV2xIFzIHNhxYZlbXQgcmFkaW8gaWV2YWRpIHV6IGllcsSrY2VzIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIk5laXpkZXbEgXMgaWVzdGF0xKt0IGlldmFkaSAlZCB1eiBpZXLEq2NlcyAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5laXpkZXbEgXMgbWFpbsSrdCBhcGtsdXNpbsSBxaFhbmFzIHN0xIF2b2tsaSBpZXLEq2NlaSDigJwlc+KAnS4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIkllcsSrY2VzIFwiJXNcIiBkcmFpdmVyaXMgbmVhdGJhbHN0YSBJTyBtZXRvZGkgJWQiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJWaWRlbyBpZXLEq2NlIG5lcGllxYbEk21hIGphdW5vcyBrYWRydSDEgXRydW1hIGllc3RhdMSranVtdXMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiVmlkZW8gaWVyxKtjZSBuZXBpZcWGxJNtYSBqYXVub3Mga2FkcnUgxIF0cnVtYSBpZXN0YXTEq2p1bXVzLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJWaWRlbyBpZXLEq2NlIG5lcGllxYbEk21hIGphdW5vcyBrYWRydSDEgXRydW1hIGllc3RhdMSranVtdXMuIgorCisjLCBmdXp6eQorbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICJOZWl6ZGV2xIFzIGF0a29kxJN0IEpQRUcgYXR0xJNsdSIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIlJhZMSBcyBrxLzFq2RhLCBzYcWGZW1vdCBpZXLEq2NlcyDigJwlc+KAnSBpZXNwxJNqYXM6IGllc3DEk2phbXMgdGFzIG5hdiB2NEkyICIKKyJkcmFpdmVyaXMuIFDEgXJiYXVkaWV0IHZhaSB0YXMgaXIgdjRJMSBkcmFpdmVyaXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiTmVpemRldsSBcyBub3RlaWt0IGF0cmlixat0dXMgaWV2YWRlaSAlZCBubyBpZXLEq2NlcyAlcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOZWl6ZGV2xIFzIHNhxYZlbXQgc2thxYZvdMSBamEgJWQgaWVzdGF0xKtqdW11cyBubyBpZXLEq2NlcyDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOZWl6ZGV2xIFzIG5vc2thaWRyb3Qgbm9ybXUgaWVyxKtjZWkg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOZWl6ZGV2xIFzIGllZ8WrdCBrb250cm9sZXMgYXRyaWLFq3R1cyBpZXLEq2NlaSDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmV2YXIgYXRwYXrEq3QgaWVyxKtjaSDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAixaDEqyBuYXYgaWVyxKtjZSDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJOZXZhcsSTamEgYXR2xJNydCBpZXLEq2NpIOKAnCVz4oCdIGxhc8SrxaFhbmFpIHZhaSByYWtzdMSrxaFhbmFpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIkllcsSrY2Ug4oCcJXPigJ0gbmF2IGllcmFrc3TEq8WhYW5hcyBpZXLEq2NlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiSWVyxKtjZSDigJwlc+KAnSBuYXYgaXp2YWRlcyBpZXLEq2NlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIkllcsSrY2Ug4oCcJXPigJ0gbmF2IGl6dmFkZXMgaWVyxKtjZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJOZXZhcsSTamEgYXR2xJNydCBpZXLEq2NpIOKAnCVz4oCdIGxhc8SrxaFhbmFpIHZhaSByYWtzdMSrxaFhbmFpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmVpemRldsSBcyBpZXN0YXTEq3Qgbm9ybXUgaWVyxKtjZWkg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmVpemRldsSBcyBzYcWGZW10IHBhxaFyZWl6xJNqbyBhdHNrYcWGb8WhYW5hcyBmcmVrdmVuY2kgbm8gaWVyxKtjZXMg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIiIKKyJOZWl6ZGV2xIFzIGllc3RhdMSrdCBpZXLEq2NlcyDigJwlc+KAnSBwYcWhcmVpesSTam8gc2thxYZvdMSBamEgZnJla3ZlbmNpIHV6ICVsdSBIei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmVpemRldsSBcyBzYcWGZW10IHNpZ27EgWxhIHN0aXBydW11IG5vIGllcsSrY2VzIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmVpemRldsSBcyBzYcWGZW10IHZhZMSra2xhcyB2xJNydMSrYnUgJWQgaWVyxKtjZWkg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOZWl6ZGV2xIFzIGllc3RhdMSrdCB2xJNydMSrYnUgJWQgdmFkxKtrbGFpICVkIG5vIGllcsSrY2VzIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIk5laXpkZXbEgXMgc2HFhmVtdCBwYcWhcmVpesSTam8gaWV2YWRpIG5vIGllcsSrY2VzIOKAnCVz4oCdLiBJZXNwxJNqYW1zIHTEgSBpciByYWRpbyAiCisiaWVyxKtjZSIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiTmVpemRldsSBcyBzYcWGZW10IHBhxaFyZWl6xJNqbyBpenZhZHUgbm8gaWVyxKtjZXMg4oCcJXPigJ0uIEllc3DEk2phbXMgdMSBIGlyIHJhZGlvICIKKyJpZXLEq2NlIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIk5laXpkZXbEgXMgaWVzdGF0xKt0IGl6dmFkaSAlZCB1eiBpZXLEq2NlcyAlcy4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICJJesWhxLdpcnRzcMSTamFzIG1haW7Eq8WhYW5hIGl6cGlsZGxhaWvEgSBwYcWhbGFpayBuZXRpZWsgYXRiYWxzdMSrdGEuIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJOZXZhciB2ZWlrdCBkYXJixKtiYXMgYmV6IHB1bGtzdGXFhmEiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIklla8WhxJNqYSBkYXR1IHBsxatzbWFzIGvEvMWrZGEuIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAiSWVrxaHEk2phIGRhdHUgcGzFq3NtYXMga8S8xatkYS4iCisKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIkllcsSrY2Ug4oCcJXPigJ0gbmVhdGJhbHN0YSB2aWRlbyB0dmVyxaFhbnUiCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc291bmQgc2VydmVyIgorI34gbXNnc3RyICJOZXZhciBpenZlaWRvdCBzYXZpZW5vanVtdSBhciBza2HFhmFzIHNlcnZlcmkiCisKKyN+IG1zZ2lkICJGYWlsZWQgdG8gcXVlcnkgc291bmQgc2VydmVyIGNhcGFiaWxpdGllcyIKKyN+IG1zZ3N0ciAiTmVpemRldsSBcyBub3NrYWlkcm90IHNrYcWGYXMgc2VydmVyYSBpZXNwxJNqYXMiCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICJCYXNpIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICJEaXNrYW50cyIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICJTaW50xJN6ZSIKKworI34gbXNnaWQgIlBDTSIKKyN+IG1zZ3N0ciAiUENNIgorCisjfiBtc2dpZCAiU3BlYWtlciIKKyN+IG1zZ3N0ciAiU2thxLxydW5pcyIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIlNrYcWGYXMgaWVlamEiCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiQ0QiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAiSmF1Y8STanMiCisKKyN+IG1zZ2lkICJQQ00tMiIKKyN+IG1zZ3N0ciAiUENNLTIiCisKKyN+IG1zZ2lkICJSZWNvcmQiCisjfiBtc2dzdHIgIkllcmFrc3TEq3QiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICJJZXZhZGVzIHBpZWF1Z3VtcyIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICJJenZhZGVzIHBpZWF1Z3VtcyIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAiTMSrbmlqYS0xIgorCisjfiBtc2dpZCAiTGluZS0yIgorI34gbXNnc3RyICJMxKtuaWphLTIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIkzEq25pamEtMyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAiRGlnaXTEgWxhaXMtMSIKKworI34gbXNnaWQgIkRpZ2l0YWwtMiIKKyN+IG1zZ3N0ciAiRGlnaXTEgWxhaXMtMiIKKworI34gbXNnaWQgIkRpZ2l0YWwtMyIKKyN+IG1zZ3N0ciAiRGlnaXTEgWxhaXMtMyIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICJUZWxlZm9uYSBpZXZhZGUiCisKKyN+IG1zZ2lkICJQaG9uZS1vdXQiCisjfiBtc2dzdHIgIlRlbGVmb25hIGl6dmFkZSIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICJWaWRlbyIKKworI34gbXNnaWQgIlJhZGlvIgorI34gbXNnc3RyICJSYWRpbyIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIk5ldmFyxJNqYSBhdHbEk3J0IGF1ZGlvIGllcsSrY2kgbWlrc2VyYSBrb250cm9sZXMgdmFkxKvFoWFuYWkuIgorCisjfiBtc2dpZCAiIgorI34gIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4gVGhpcyB2ZXJzaW9uIG9mICIKKyN+ICJ0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiTmV2YXIgYXR2xJNydCBhdWRpbyBpZXLEq2NpIG1pa3NlcmEga29udHJvbGFzIHZhZMSrxaFhbmFpLiDFoMSrIEF0dmVydMSBcyBTa2HFhmFzICIKKyN+ICJTaXN0ZW1hcyB2ZXJzaWphIG5lYXRiYWxzdGEgxaFvIGVsZW1lbnR1LiIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAiR2FsdmVuYWlzIgorCisjfiBtc2dpZCAiRnJvbnQiCisjfiBtc2dzdHIgIlByaWVrxaHEk2phaXMiCisKKyN+IG1zZ2lkICJSZWFyIgorI34gbXNnc3RyICJTxIFuaSIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkF1c3RpxYZhcyIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAiQ2VudHJzIgorCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICJMRkUiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAiSWVza2F1am/FocSBIgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAiUHVzZSIKKworI34gbXNnaWQgIkFVWCBPdXQiCisjfiBtc2dzdHIgIkFVWCBpemVqYSIKKworI34gbXNnaWQgIjNEIERlcHRoIgorI34gbXNnc3RyICIzRCBkemnEvHVtcyIKKworI34gbXNnaWQgIjNEIENlbnRlciIKKyN+IG1zZ3N0ciAiM0QgY2VudHJzIgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAiM0QgdXpsYWJvanVtcyIKKworI34gbXNnaWQgIlRlbGVwaG9uZSIKKyN+IG1zZ3N0ciAiVGVsZWZvbnMiCisKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAiVmlkZW8gaWVlamEiCisKKyN+IG1zZ2lkICJBVVggSW4iCisjfiBtc2dzdHIgIkFVQyBpZWVqYSIKKworI34gbXNnaWQgIlJlY29yZCBHYWluIgorI34gbXNnc3RyICJJZXJha3N0xKt0YSBwaWVhdWd1bXMiCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAiSXp2YWRhIHBpZWF1Z3VtcyIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgQm9vc3QiCisjfiBtc2dzdHIgIk1pa3JvZm9uYSBwYXN0aXByaW7EgWp1bXMiCisKKyN+IG1zZ2lkICJEaWFnbm9zdGljIgorI34gbXNnc3RyICJEaWFnbm9zdGlrYSIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgIkJhc3NhIHBhc3RpcHJpbsSBanVtcyIKKworI34gbXNnaWQgIlBsYXliYWNrIFBvcnRzIgorI34gbXNnc3RyICJBdHNrYcWGb8WhYW5hcyBwb3J0aSIKKworI34gbXNnaWQgIklucHV0IgorI34gbXNnc3RyICJJZXZhZHMiCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTW9uaXRvcmEgYXZvdHMiCisKKyN+IG1zZ2lkICJLZXlib2FyZCBCZWVwIgorI34gbXNnc3RyICJLbGF2aWF0xatyYXMgcMSra3N0aWVuaSIKKworI34gbXNnaWQgIlNpbXVsYXRlIFN0ZXJlbyIKKyN+IG1zZ3N0ciAiU2ltdWzEk3Qgc3RlcmVvIgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICJTdGVyZW8iCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAiSWVza2F1am/FocSBIHNrYcWGYSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAiTWlrcm9mb25hIHBpZWF1Z3VtcyIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICJTa2HEvHJ1xYZhIGF2b3RzIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgIk1pa3JvZm9uYSBhdm90cyIKKworI34gbXNnaWQgIkphY2siCisjfiBtc2dzdHIgIkxpZ3pkYSIKKworI34gbXNnaWQgIkNlbnRlciAvIExGRSIKKyN+IG1zZ3N0ciAiQ2VudHJzIC8gTEZFIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAiU3RlcmVvIG1pa3NlcmlzIgorCisjfiBtc2dpZCAiTW9ubyBNaXgiCisjfiBtc2dzdHIgIk1vbm8gbWlza2VyaXMiCisKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgIkllZWphcyBtaWtzZXJpcyIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAiTWlrcm9mb25zIDEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDIiCisjfiBtc2dzdHIgIk1pa3JvZm9ucyAyIgorCisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIkRpZ2l0xIFsxIEgaXplamEiCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICJEaWdpdMSBbMSBIGllZWphIgorCisjfiBtc2dpZCAiSERNSSIKKyN+IG1zZ3N0ciAiSERNSSIKKworI34gbXNnaWQgIk1vZGVtIgorI34gbXNnc3RyICJNb2TEk21zIgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAiS2xhdXN1bGUiCisKKyN+IG1zZ2lkICJPdGhlciIKKyN+IG1zZ3N0ciAiQ2l0cyIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgIk5la2FzIgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgIkllc2zEk2d0cyIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAiSXpzbMSTZ3RzIgorCisjfiBtc2dpZCAiTXV0ZSIKKyN+IG1zZ3N0ciAiS2x1c3VtcyIKKworI34gbXNnaWQgIkZhc3QiCisjfiBtc2dzdHIgIsSAdHJzIgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgIsS7b3RpIHplbXMiCisKKyN+IG1zZ2lkICJMb3ciCisjfiBtc2dzdHIgIlplbXMiCisKKyN+IG1zZ2lkICJNZWRpdW0iCisjfiBtc2dzdHIgIlZpZMSTanMiCisKKyN+IG1zZ2lkICJIaWdoIgorI34gbXNnc3RyICJBdWdzdHMiCisKKyN+IG1zZ2lkICJWZXJ5IEhpZ2giCisjfiBtc2dzdHIgIsS7b3RpIGF1Z3N0cyIKKworI34gbXNnaWQgIlByb2R1Y3Rpb24iCisjfiBtc2dzdHIgIlByb2R1a2NpamEiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICJQcmlla8WhxJNqxIEgcGFuZcS8YSBtaWtyb2ZvbnMiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICJQcmlla8WhxJNqxIEgcGFuZcS8YSBpZWVqYXMgbMSrbmlqYSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIEhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIlByaWVrxaHEk2rEgSBwYW5lxLxhIGF1c3RpxYZhcyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICJQcmlla8WhxJNqxIEgcGFuZcS8YSBsxKtuaWphcyBpemVqYSIKKworI34gbXNnaWQgIkdyZWVuIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiWmHEvGFpcyBzYXZpZW5vdMSBanMiCisKKyN+IG1zZ2lkICJQaW5rIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUm96xIEgc2F2aWVub3TEgWpzIgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlppbGFpcyBzYXZpZW5vdMSBanMiCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkJhbHRhaXMgc2F2aWVub3TEgWpzIgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICJNZWxuYWlzIHNhdmllbm90xIFqcyIKKworI34gbXNnaWQgIkdyYXkgQ29ubmVjdG9yIgorI34gbXNnc3RyICJQZWzEgWthaXMgc2F2aWVub3TEgWpzIgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiT3JhbsW+YWlzIHNhdmllbm90xIFqcyIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlNhcmthbmFpcyBzYXZpZW5vdMSBanMiCisKKyN+IG1zZ2lkICJZZWxsb3cgQ29ubmVjdG9yIgorI34gbXNnc3RyICJEemVsdGFpbnMgc2F2aWVub3TEgWpzIgorCisjfiBtc2dpZCAiR3JlZW4gRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJaYcS8YWlzIHByaWVrxaHEk2rEgSBwYW5lxLxhIHNhdmllbm90xIFqcyIKKworI34gbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJSb3rEgSBwcmlla8WhxJNqxIEgcGFuZcS8YSBzYXZpZW5vdMSBanMiCisKKyN+IG1zZ2lkICJCbHVlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiWmlsYWlzIHByaWVrxaHEk2rEgSBwYW5lxLxhIHNhdmllbm90xIFqcyIKKworI34gbXNnaWQgIldoaXRlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQmFsdGFpcyBwcmlla8WhxJNqxIEgcGFuZcS8YSBzYXZpZW5vdMSBanMiCisKKyN+IG1zZ2lkICJCbGFjayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk1lbG5haXMgcHJpZWvFocSTasSBIHBhbmXEvGEgc2F2aWVub3TEgWpzIgorCisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlBlbMSTa2FpcyBwcmlla8WhxJNqxIEgcGFuZcS8YSBzYXZpZW5vdMSBanMiCisKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJPcmFuxb5haXMgcHJpZWvFocSTasSBIHBhbmXEvGEgc2F2aWVub3TEgWpzIgorCisjfiBtc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiU2Fya2FuYWlzIHByaWVrxaHEk2rEgSBwYW5lxLxhIHNhdmllbm90xIFqcyIKKworI34gbXNnaWQgIlllbGxvdyBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkR6ZWx0ZW5haXMgcHJpZWvFocSTasSBIHBhbmXEvGEgc2F2aWVub3TEgWpzIgorCisjfiBtc2dpZCAiU3ByZWFkIE91dHB1dCIKKyN+IG1zZ3N0ciAiSXpwbGVzdCBpenZhZHUiCisKKyN+IG1zZ2lkICJEb3dubWl4IgorI34gbXNnc3RyICJMZWp1cG1pa3PEk8WhYW5hIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBJbnB1dCIKKyN+IG1zZ3N0ciAiVmlydHXEgWzEgSBtaWtzZXJhIGlldmFkcyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgT3V0cHV0IgorI34gbXNnc3RyICJWaXJ0dcSBbMSBIG1pa3NlcmEgaXp2YWRzIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBDaGFubmVscyIKKyN+IG1zZ3N0ciAiVmlydHXEgWzEgSBtaWtzZXJhIGthbsSBbGkiCisKKyN+IG1zZ2lkICIlcyAlZCBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMgJWQgZnVua2NpamEiCisKKyN+IG1zZ2lkICIlcyBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMgZnVua2NpamEiCisKKyN+IG1zZ2lkICJHb3QgdW5leHBlY3RlZCBmcmFtZSBzaXplIG9mICV1IGluc3RlYWQgb2YgJXUuIgorI34gbXNnc3RyICJTYcWGxJNtdSBuZWdhaWTEq3R1IGthZHJhIGl6bcSTcnUgJXUsIG5ldmlzICV1LiIKKworI34gbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgb24gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJSYWTEgXMga8S8xatkYSBub2xhc290ICVkIGJhaXR1cyBubyBpZXLEq2NlcyBcIiVzXCIuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIk5ldmFyIGllcmluZG9kIGJ1ZmVydXMgaWVyxKtjxJMgXCIlc1wiLiIKKworI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiTmVpemRldsSBcyBzYcWGZW10IHZpZGVvIGthZHJ1cyBubyBpZXLEq2NlcyBcIiVzXCIuIgorCisjfiBtc2dpZCAiRmFpbGVkIGFmdGVyICVkIHRyaWVzLiBkZXZpY2UgJXMuIHN5c3RlbSBlcnJvcjogJXMiCisjfiBtc2dzdHIgIk5ldmVpa3NtZSBwxJNjICVkIG3Ek8SjaW7EgWp1bWllbS4gaWVyxKtjZSAlcy4gc2lzdMSTbWFzIGvEvMWrZGE6ICVzIgpkaWZmIC0tZ2l0IGEvcG8vbWVzb24uYnVpbGQgYi9wby9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTExYTcyCi0tLSAvZGV2L251bGwKKysrIGIvcG8vbWVzb24uYnVpbGQKQEAgLTAsMCArMSwzIEBACitpMThuID0gaW1wb3J0KCdpMThuJykKKworaTE4bi5nZXR0ZXh0KCdnc3QtcGx1Z2lucy1nb29kLTEuMCcsIHByZXNldDogJ2dsaWInKQpkaWZmIC0tZ2l0IGEvcG8vbXQucG8gYi9wby9tdC5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjQwN2I5Ci0tLSAvZGV2L251bGwKKysrIGIvcG8vbXQucG8KQEAgLTAsMCArMSw3NzEgQEAKKyMgTWFsdGVzZSB0cmFuc2xhdGlvbiBmb3IgZ3N0LXBsdWdpbnMtZ29vZC4KKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdzdC1wbHVnaW5zLWdvb2QgcGFja2FnZS4KKyMgTkFNRSBPRiBBVVRIT1IgPG1pY2hlbGJ1Z2VqYUByYWJhdG1hbHRhLmNvbT4sIDIwMDguCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kLTAuMTAuMTAuM1xuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA4LTEwLTI2IDE5OjA5KzAxMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IE1pY2hlbCBCdWdlamEgPG1pY2hlbGJ1Z2VqYUByYWJhdG1hbHRhLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBNYWx0ZXNlIDx0cmFuc2xhdGlvbi10ZWFtLW10QGxpc3RzLnNvdXJjZWZvcmdlLm5ldD5cbiIKKyJMYW5ndWFnZTogbXRcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJYLVBvZWRpdC1MYW5ndWFnZTogTWFsdGVzZVxuIgorIlgtUG9lZGl0LUNvdW50cnk6IE1BTFRBXG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiUHJvYmxlbSBmaWQtZGVjb2RpbmcgdGFsLWlzdGFtcGEgSlBFRyIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJNaHV4IHBvc3NpYmxpIG5hcWJhZCBtYXMtc2VydmVyIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIk1odXggcG9zc2libGkgbmFxYmFkIG1hcy1zZXJ2ZXIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIkt1bnRhdHQgbWFzLXNvdW5kIHNlcnZlciBtYSDEoWlleCBzdGFiYmlsaXQiCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiQXBwYXJ0ICclcycgbWEgamFnxKdtaWx4IHZpZGVvIGNhcHR1cmUiCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIklucHV0IGF1ZGlvIG1hIG5zdGFieCBqZXcgbWh1eCB2YWxpZHUuIEFWSSBzdHJlYW0gamlzdGEgamt1biBrb3Jyb3R0LiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAiSWwtZmFqbCBtYSBmacSnIGwtZWJkYSBzdHJlYW0gbGkgdGlzdGEgdGluZGFxcS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIklsLWZhamwgbWh1eCB2YWxpZHUgdSBtYSBqaXN0YXggamluZGFxcSIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIklsLWZhamwgaHV3YSBrb3Jyb3R0IHUgbWEgamlzdGF4IGppbmZldGHEpy4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiSWwtZmFqbCBtaHV4IGtvbXBsdXQgdSBtYSBqaXN0YXggamluZGFxcSwiCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIkppc3RhIGprdW4gaWxsaSBsLXZpZGpvIMShbyBkYW4gaWwtZmFqbCBtYSBqaWRoaXJ4IHNld3dhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICJJbC1mYWpsIGZpxKcgYWt0YXIgc3RyZWFtcyBtaWxsaSBzdXBwb3N0LiBTZXIgaW5kb3FxIGwtZXd3ZWwgJWQiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICJBdWRpbyBkZXZpY2UgbWEgamlzdGF4IGppbnR1xbxhLiBRZWQgamludHXFvGEgbWlubiBwcm9ncmFtbSBpZcSnb3IuIgorCisjLCBmdXp6eQorbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICJBdWRpbyBkZXZpY2UgbWEgamlzdGF4IGppbnR1xbxhLiBNJ2fEp2FuZGV4IGHEi8SLZXNzIGfEp2FsaWguIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIkF1ZGlvIGRldmljZSBtYSBqaXN0YXggamludHXFvGEuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIk1hIG5pc3RheCBuaWZ0YcSnIGFwcGFyYXQgdGFsLWF3ZGpvIGJpZXggaW5kb3FxLiBEaWwgaWwtdmVyxbxqb25pIHRhJyBPcGVuICIKKyJTb3VuZCBTeXN0ZW0gbWh1eCBpc3NhcHBvcnRqYXRoYSBtaW5uIGRhbiBsLWVsZW1lbnQuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIklkLWRhcXEgbWh1eCBpc3NhcHBhcnRqYXQgbWlubiBkYW4gbC1hcHBhcmF0IHRhbC1hd2Rqby4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIsW7YmFsbCBmaWlkLWRhcXEgdGFsLWF3ZGpvLiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiSXJyZWtvcmRqYXIgbWh1eCBpc3NhcHBvcnRqYXQgbWlubiBkYW4gbC1hcHBhcmF0IHRhbC1hd2Rqby4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLFu2JhbGwgZmwtaXJyZWtvcmRqYXIgbWlsbC1hcHBhcmF0IHRhbC1hd2Rqby4iCisKKyMsIGZ1enp5Cittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiQXVkaW8gZGV2aWNlIG1hIGppc3RheCBqaW50dcW8YSBiaWV4IHRpcnJla29yZGphLiBNJ2fEp2FuZGV4IGHEi8SLZXNzIGfEp2FsaWguIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICJBdWRpbyBkZXZpY2UgbWEgamlzdGF4IGppbnR1xbxhIGJpZXggdGlycmVrb3JkamEuIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIlJlY29yZCIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pa3JvZm9udSIKKworIywgZnV6enkKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJMaW5lLWluIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIiIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIiIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICIiCisKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIiIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiVm9sdW0iCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJHYWluIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiTW9uaXRvciIKKworIywgZnV6enkKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJTcGVha2VyIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICIiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiIgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICJQcm9ibGVtYSBmaWwtcWFyKClpICVkIGJ5dGVzIGZpZC1kZXZpY2UgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJNYSBuaXN0YXggbnFhYmJlbCBidWZmZXJzIG1pbGwtYXBwYXJhdCAnJXMnLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIiIKKyJJZC1kcml2ZXIgdGFsLWFwcGFyYXQgJyVzJyBtYSBqaXNzYXBwb3J0amEgbC1lYmRhIGNhcHR1cmUgbWV0aG9kIG1pZmh1bS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiIgorIklkLWRyaXZlciB0YWwtYXBwYXJhdCAnJXMnIG1hIGppc3NhcHBvcnRqYSBsLWViZGEgY2FwdHVyZSBtZXRob2QgbWlmaHVtLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiRGV2aWNlICclcycgbWh1eCBjYXB0dXJlIGRldmljZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIkFwcGFydCAnJXMnIG1hIGppc3RheCBqYWfEp21lbCBjYXB0dXJlIGJpICVkeCVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICJBcHBhcnQgJyVzJyBtYSBqaXN0YXggamFnxKdtZWwgY2FwdHVyZSBmJ2RhbiBpbC1mb3JtYXQiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIkRldmljZSAnJXMnIG1odXggY2FwdHVyZSBkZXZpY2UuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTWh1eCBwb3NzaWJsaSBuxKFpYiBwYXJhbWV0cmkgdGFsLWFwcGFyYXQgJyVzJyIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIiIKKyJBcHBhcmF0IGxpIGphcXJhIHZpZGVvIGlucHV0IG1hIGHEi8SLZXR0YXggaXMtc2V0dGluZ3MgxKFvZGRhIHRhbC1mcmFtZSByYXRlLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICIiCisiQXBwYXJhdCBsaSBqYXFyYSB2aWRlbyBpbnB1dCBtYSBhxIvEi2V0dGF4IGlzLXNldHRpbmdzIMShb2RkYSB0YWwtZnJhbWUgcmF0ZS4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIiIKKyJJZC1kcml2ZXIgdGFsLWFwcGFyYXQgJyVzJyBtYSBqaXNzYXBwb3J0amEgbC1lYmRhIGNhcHR1cmUgbWV0aG9kIG1pZmh1bS4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiIgorIklkLWRyaXZlciB0YWwtYXBwYXJhdCAnJXMnIG1hIGppc3NhcHBvcnRqYSBsLWViZGEgY2FwdHVyZSBtZXRob2QgbWlmaHVtLiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICIiCisiQXBwYXJhdCBsaSBqYXFyYSB2aWRlbyBpbnB1dCBtYSBhxIvEi2V0dGF4IGlzLXNldHRpbmdzIMShb2RkYSB0YWwtZnJhbWUgcmF0ZS4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJQcm9ibGVtYSBiaWV4IGluxKFpYiBzZXR0aW5ncyB0YXQtdHVuZXIgJWQgZnVxIGwtYXBwYXJ0ICclcyciCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlByb2JsZW1hIGZpbC1xYXIoKWkgJWQgYnl0ZXMgZmlkLWRldmljZSAnJXMnLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJEZXZpY2UgJyVzJyBtaHV4IGNhcHR1cmUgZGV2aWNlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJQcm9ibGVtYSBiaWV4IG5pc3NldHRqYSBpbnB1dCAlZCBmdXEgYXBwYXJhdCAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJQcm9ibGVtYSBiaWV4IG5pc3NldHRqYSBpbnB1dCAlZCBmdXEgYXBwYXJhdCAlcy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJQcm9ibGVtYSBiaWV4IGluxKFpYiBzaWduYWwgc3RyZW5ndGggZnVxIGwtYXBwYXJhdCAnJXMnLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIklkLWRyaXZlciB0YWwtYXBwYXJhdCAnJXMnIG1hIGppc3NhcHBvcnRqYSBsLWViZGEgY2FwdHVyZSBtZXRob2QgbWlmaHVtLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJBcHBhcmF0IGxpIGphcXJhIHZpZGVvIGlucHV0IG1hIGHEi8SLZXR0YXggaXMtc2V0dGluZ3MgxKFvZGRhIHRhbC1mcmFtZSByYXRlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJBcHBhcmF0IGxpIGphcXJhIHZpZGVvIGlucHV0IG1hIGHEi8SLZXR0YXggaXMtc2V0dGluZ3MgxKFvZGRhIHRhbC1mcmFtZSByYXRlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisiQXBwYXJhdCBsaSBqYXFyYSB2aWRlbyBpbnB1dCBtYSBhxIvEi2V0dGF4IGlzLXNldHRpbmdzIMShb2RkYSB0YWwtZnJhbWUgcmF0ZS4iCisKKyMsIGZ1enp5Cittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIlByb2JsZW0gZmlkLWRlY29kaW5nIHRhbC1pc3RhbXBhIEpQRUciCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJQcm9ibGVtYSBiaWV4IG7EoWliIGlsLWthcGHEi2l0YWppZXQgdGFsLWFwcGFyYXQgJyVzJzogTWh1eCB2NGwyIGRyaXZlci4gIgorIknEi8SLZWtramEgamVrayBodXggdjRsMSBkcml2ZXIuICIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIk1odXggcG9zc2libGkgdGZpdHR4amEgZ8SnYWwgYXR0cmlidXRpIHRhJyBpbnB1dCAlZCDEoW9sLWFwcGFyYXQgJXMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiUHJvYmxlbWEgYmlleCBpbsShaWIgc2V0dGluZ3MgdGF0LXR1bmVyICVkIGZ1cSBsLWFwcGFydCAnJXMnIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTWEgc3RhanggbmZpdHRleCBub3JtIGZ1cSBhcHBhcmF0ICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJMLWF0dHJpYnV0aSB0YScga29udHJvbGwgdGEnIGRldmljZSAnJXMnIG1hIG5xcmF3eC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRGV2aWNlICclcycgbWh1eCBpZGVudGlmaWthdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRGFuIG1odXggZGV2aWNlICVzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIkRldmljZSAnJXMnIG1hIG5pc3RheCBuaWZ0YcSndSBiaWV4IG5hcXJhIGpldyBuaWt0ZWIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiRGV2aWNlICclcycgbWh1eCBjYXB0dXJlIGRldmljZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJEZXZpY2UgJyVzJyBtaHV4IGNhcHR1cmUgZGV2aWNlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIkRldmljZSAnJXMnIG1odXggY2FwdHVyZSBkZXZpY2UuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiRGV2aWNlICclcycgbWEgbmlzdGF4IG5pZnRhxKd1IGJpZXggbmFxcmEgamV3IG5pa3RlYi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk1hIHN0YWp0eCBuaXNzZXRqYSBub3JtIGZ1cSBhcHBhcmF0ICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiUHJvYmxlbWEgYmlleCBpbsShaWIgaWwtZnJla3dlbnphIGxpIGppdHJhxbxtZXR0aSBmdXFoYSBhcHBhcmF0ICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIiIKKyJQcm9ibGVtYSBiaWV4IG5pc3NldHRqYSBsLWZyZWt3ZW56YSBsaSBqaXRyYcW8bWV0dGkgZnVxaGEgYXBwYXJhdCAnJXMnIGfEp2FsICIKKyIlbHUgSHouIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlByb2JsZW1hIGJpZXggaW7EoWliIHNpZ25hbCBzdHJlbmd0aCBmdXEgbC1hcHBhcmF0ICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJQcm9ibGVtYSBiaWV4IGluxKFpYiB2YWx1ciB0YScgY29udHJvbCAlZCBmdXEgbC1hcHBhcmF0ICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJQcm9ibGVtYSBiaWV4IG5pc3NldGphIHZhbHVyICVkIGxpbCBjb250cm9sICVkIGZ1cSBsLWFwcGFyYXQgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJQcm9ibGVtYSBiaWV4IGluxKFpYiBjdXJyZW50IGlucHV0IGZ1cSBhcHBhcmF0ICclcycuIEppc3RhIGprdW4gbGkgaHV3YSAiCisiYXBwYXJhdCB0YXItcmFkanUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiUHJvYmxlbWEgYmlleCBpbsShaWIgY3VycmVudCBpbnB1dCBmdXEgYXBwYXJhdCAnJXMnLiBKaXN0YSBqa3VuIGxpIGh1d2EgIgorImFwcGFyYXQgdGFyLXJhZGp1LiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiUHJvYmxlbWEgYmlleCBuaXNzZXR0amEgaW5wdXQgJWQgZnVxIGFwcGFyYXQgJXMuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiTWEgdGlzdGF4IHRpYmRlbCBpci1yZXNvbHV0aW9uIHdhcXQgcnVudGltZS4iCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIk1hIG5pc3RheCBuxKdhZGRlbSBtaW5nxKdhanIgYXJsb8ShxKEiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIlByb2JsZW1hIGludGVybmEgZmlkLWRhdGEgc3RyZWFtIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAiUHJvYmxlbWEgaW50ZXJuYSB0YScgZGF0YSBmbG93IgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAiRGV2aWNlICclcycgbWh1eCBjYXB0dXJlIGRldmljZS4iCisKKyN+IG1zZ2lkICJHb3QgdW5leHBlY3RlZCBmcmFtZSBzaXplIG9mICV1IGluc3RlYWQgb2YgJXUuIgorI34gbXNnc3RyICJJcsSLaXZlanQgZnJhbWUgc2l6ZSB0YScgJXUgbWluZmxvayBraWYga2llbiBtaXN0ZW5uaSB0YScgJXUuIgorCisjfiBtc2dpZCAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJQcm9ibGVtYSBiaWV4IGluxKFpYiB2aWRlbyBmcmFtZXMgbWlsbC1hcHBhcmF0ICclcycuIgorCisjfiBtc2dpZCAiRmFpbGVkIGFmdGVyICVkIHRyaWVzLiBkZXZpY2UgJXMuIHN5c3RlbSBlcnJvcjogJXMiCisjfiBtc2dzdHIgIiIKKyN+ICJQcm9ibGVtYSB3YXJhIGxpIHBydXZhanQgJWQgZHJhYmkuIGFwcGFyYXQgJXMuIMW8YmFsbCBmaXMtc2lzdGVtYTogJXMiCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICJCYXNzIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICJUcmVibGUiCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAiU3ludGgiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIlBDTSIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIlNwZWFrZXIiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICJMaW5lLWluIgorCisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgIkNEIgorCisjfiBtc2dpZCAiTWl4ZXIiCisjfiBtc2dzdHIgIk1peGVyIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAiSW4tZ2FpbiIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICJPdXQtZ2FpbiIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAiTGluZS0xIgorCisjfiBtc2dpZCAiTGluZS0yIgorI34gbXNnc3RyICJMaW5lLTIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIkxpbmUtMyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAiRGlnaXRhbC0xIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICJEaWdpdGFsLTIiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIkRpZ2l0YWwtMyIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICJQaG9uZS1pbiIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAiUGhvbmUtb3V0IgorCisjfiBtc2dpZCAiVmlkZW8iCisjfiBtc2dzdHIgIlZpZGpvIgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgIlJhZGp1IgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiTWEgbmlzdGF4IG5pZnRhxKcgYXBwYXJhdCB0YWwtYXdkam8gZ8SnYWwgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJNYSBuaXN0YXggbmlmdGHEpyBhcHBhcmF0IHRhbC1hd2RqbyBnxKdhbCBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBEaW4gaWwtIgorI34gInZlcnpqb25pIHRhJyBPcGVuIFNvdW5kIFN5c3RlbSBtaHV4IGlzc2FwcG9ydGphdGEgbWlubiBkaW4gbC1lbGVtZW50LiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNYXN0ZXIiCisjfiBtc2dzdHIgIkZhc3QiCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAiUXVkZGllbSIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIldhcmEiCisKKyN+IG1zZ2lkICJIZWFkcGhvbmVzIgorI34gbXNnc3RyICJIZWFkcGhvbmVzIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAiQ2VudGVyIC8gTEZFIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlN1cnJvdW5kIgorI34gbXNnc3RyICJTdXJyb3VuZCBzb3VuZCIKKworI34gbXNnaWQgIlNpZGUiCisjfiBtc2dzdHIgIsSgZW5iIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlRlbGVwaG9uZSIKKyN+IG1zZ3N0ciAiSGVhZHBob25lcyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICJNaWtyb2ZvbnUiCisKKyN+IG1zZ2lkICJJbnB1dCIKKyN+IG1zZ3N0ciAiSW5wdXQiCisKKyN+IG1zZ2lkICJTdGVyZW8iCisjfiBtc2dzdHIgIlN0ZXJlbyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAiU3Vycm91bmQgc291bmQiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTWljcm9waG9uZSBHYWluIgorI34gbXNnc3RyICJNaWtyb2ZvbnUiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgIk1pa3JvZm9udSIKKworI34gbXNnaWQgIkNlbnRlciAvIExGRSIKKyN+IG1zZ3N0ciAiQ2VudGVyIC8gTEZFIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlN0ZXJlbyBNaXgiCisjfiBtc2dzdHIgIlN0ZXJlbyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgIklucHV0IG1peCIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDEiCisjfiBtc2dzdHIgIk1pa3JvZm9udSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDIiCisjfiBtc2dzdHIgIk1pa3JvZm9udSIKKworI34gbXNnaWQgIk9uIgorI34gbXNnc3RyICJPbiIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAiT2ZmIgorCisjfiBtc2dpZCAiRmFzdCIKKyN+IG1zZ3N0ciAiRmFzdCIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAiTG93IgorCisjfiBtc2dpZCAiTWVkaXVtIgorI34gbXNnc3RyICJNZWRpdW0iCisKKyN+IG1zZ2lkICJIaWdoIgorI34gbXNnc3RyICJIaWdoIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlZlcnkgSGlnaCIKKyN+IG1zZ3N0ciAiVmVyeSBoaWdoIgorCisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAiUHJvZHVjdGlvbiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICJNaWtyb2ZvbnUgdGFsLXBhbmVsbGEgdGEnIHF1ZGRpZW0iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBJbiIKKyN+IG1zZ3N0ciAiRnJvbnQgcGFuZWwgbGluZS1pbiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICJGcm9udCBwYW5lbCBoZWFkcGhvbmVzIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICJGcm9udCBwYW5lbCBsaW5lLWluIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkdyZWVuIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIGHEp2RhciIKKworIywgZnV6enkKKyN+IG1zZ2lkICJQaW5rIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIHJvxbxhIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkJsdWUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3IgQmx1IgorCisjLCBmdXp6eQorI34gbXNnaWQgIldoaXRlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIGFiamFkIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkJsYWNrIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIGlzd2VkIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkdyYXkgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25uZWN0b3IgR3JpxbwiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIG9yYW7EoWpvIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbm5lY3RvciBhxKdtYXIiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiWWVsbG93IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29ubmVjdG9yIGlzZmFyIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkdyZWVuIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiRnJvbnQgcGFuZWwgY29ubmVjdG9yIGHEp2RhciIKKworIywgZnV6enkKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiRnJvbnQgcGFuZWwgY29ubmVjdG9yIHJvxbxhIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkJsdWUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJGcm9udCBwYW5lbCBjb25uZWN0b3IgYmx1IgorCisjLCBmdXp6eQorI34gbXNnaWQgIldoaXRlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiRnJvbnQgcGFuZWwgY29ubmVjdG9yIGFiamFkIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiRnJvbnQgcGFuZWwgY29ubmVjdG9yIGlzd2VkIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkdyYXkgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJGcm9udCBwYW5lbCBjb25uZWN0b3IgR3JpxbwiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiT3JhbmdlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiRnJvbnQgUGFuZWwgY29ubmVjdG9yIG9yYW7EoWpvIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlJlZCBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkZyb250IHBhbmVsIGNvbm5lY3RvciBhxKdtYXIiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiRnJvbnQgcGFuZWwgY29ubmVjdG9yIGlzZmFyIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIlZpcnR1YWwgbWl4ZXIgaW5wdXQiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBPdXRwdXQiCisjfiBtc2dzdHIgIlZpcnR1YWwgbWl4ZXIgb3V0cHV0IgorCisjLCBmdXp6eQorI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCisjfiBtc2dzdHIgIlZpcnR1YWwgbWl4ZXIgaW5wdXQiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIlByb2JsZW1hIGZpbC1xYXIoKWkgJWQgYnl0ZXMgZmlkLWRldmljZSAnJXMnLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlbnF1ZXVlIGJ1ZmZlcnMgaW4gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJDb3VsZCBub3QgZW5xdWV1ZSBidWZmZXJzIGluIGRldmljZSAnJXMnLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIkt1bnRhdHQgbWFzLXNvdW5kIHNlcnZlciBtYSDEoWlleCBzdGFiYmlsaXQiCisKKyN+IG1zZ2lkICJGYWlsZWQgdG8gcXVlcnkgc291bmQgc2VydmVyIGNhcGFiaWxpdGllcyIKKyN+IG1zZ3N0ciAiTWh1eCBwb3NzaWJsaSB0LXRmaXR0eGlqYSBnxKdhbGwta2FwYcSLaXRhIHRhcy1zb3VuZCBzZXJ2ZXIiCisKKyN+IG1zZ2lkICJFcnJvciBzdG9wcGluZyBzdHJlYW1pbmcgY2FwdHVyZSBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiUHJvYmxlbSBiaWV4IGlud2FxcWFmIHN0cmVhbWluZyBjYXB0dXJlIG1pbGwtYXBwYXJhdCAnJXMnLiIKKworI34gbXNnaWQgIkVycm9yIHN0YXJ0aW5nIHN0cmVhbWluZyBjYXB0dXJlIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJQcm9ibGVtIGJpZXggbmliZGEgc3RyZWFtaW5nIGNhcHR1cmUgbWlsbC1hcHBhcmF0ICclcycuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGdldCBlbm91Z2ggYnVmZmVycyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiTWEgbmlzdGF4IG5pcsSLaWV2aSBiacW8xbxlamplZCBidWZmZXJzIG1pbGwtYXBwYXJhdCAnJXMnLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBnZXQgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiTWEgbmlzdGF4IG5pcsSLaWV2aSBidWZmZXJzIG1pbGwtYXBwYXJhdCAnJXMnLiIKKworI34gbXNnaWQgIk5vIGZyZWUgYnVmZmVycyBmb3VuZCBpbiB0aGUgcG9vbCBhdCBpbmRleCAlZC4iCisjfiBtc2dzdHIgIk1hIG5zdGFiIGwtZWJkYSBidWZmZXIgZnJlZSBmbC1pbmRpxItpICVkIHRhbC1wb29sLiIKKworI34gbXNnaWQgImluc3VmZmljaWVudCBtZW1vcnkgdG8gZW5xdWV1ZSBhIHVzZXIgcG9pbnRlciBidWZmZXIuIGRldmljZSAlcy4iCisjfiBtc2dzdHIgImluc3VmZmljaWVudCBtZW1vcnkgdG8gZW5xdWV1ZSBhIHVzZXIgcG9pbnRlciBidWZmZXIuIGRldmljZSAlcy4iCisKKyN+IG1zZ2lkICIiCisjfiAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIE5vdCBlbm91Z2ggbWVtb3J5LiIKKyN+IG1zZ3N0ciAiIgorI34gIlByb2JsZW1hIGJpZXggaW7EoWliIHZpZGVvIGZyYW1lcyBtaWxsLWFwcGFyYXQgJyVzJy4gSWwtbWVtb3JqYSBhbGxva2F0YSAiCisjfiAibWhpamlleCBiacW8xbxlamplZC4iCisKKyN+IG1zZ2lkICIiCisjfiAiVGhlIGJ1ZmZlciB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzLCBvciBubyAiCisjfiAiYnVmZmVycyBoYXZlIGJlZW4gYWxsb2NhdGVkIHlldCwgb3IgdGhlIHVzZXJwdHIgb3IgbGVuZ3RoIGFyZSBpbnZhbGlkLiAiCisjfiAiZGV2aWNlICVzIgorI34gbXNnc3RyICIiCisjfiAiVGhlIGJ1ZmZlciB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzLCBvciBubyAiCisjfiAiYnVmZmVycyBoYXZlIGJlZW4gYWxsb2NhdGVkIHlldCwgb3IgdGhlIHVzZXJwdHIgb3IgbGVuZ3RoIGFyZSBpbnZhbGlkLiAiCisjfiAiZGV2aWNlICVzIgorCisjfiBtc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzLiciCisjfiBtc2dzdHIgIkwtYXR0cmlidXRpIHRhJyBrb250cm9sbCB0YScgZGV2aWNlICclcycgbWEgbnFyYXd4LiIKZGlmZiAtLWdpdCBhL3BvL25iLnBvIGIvcG8vbmIucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3ODQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL3BvL25iLnBvCkBAIC0wLDAgKzEsNzc5IEBACisjIE5vcndlZ2lhbiBib2ttYWFsIHRyYW5zbGF0aW9uIG9mIGdzdC11dGlscy4KKyMgVGhpcyBmaWxlIGlzIHB1dCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMKKyMgS2phcnRhbiBNYXJhYXMgPGttYXJhYXNAZ25vbWUub3JnPiwgMjAwNC0yMDEwLgorIyBKb2hubnkgQS4gU29sYnUgPGpvaG5ueUBzb2xidS5uZXQ+LCAyMDEyLTIwMTYKKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QgMS43LjJcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxNi0wOC0wNSAyMzo0NyswMjAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBKb2hubnkgQS4gU29sYnUgPGpvaG5ueUBzb2xidS5uZXQ+XG4iCisiTGFuZ3VhZ2UtVGVhbTogTm9yd2VnaWFuIEJva21hYWwgPGkxOG4tbmJAbGlzdGVyLnBpbmcudWlvLm5vPlxuIgorIkxhbmd1YWdlOiBuYl9OT1xuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlgtR2VuZXJhdG9yOiBQb2VkaXQgMS44LjcuMVxuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICJKYWNrLXNlcnZlciBpa2tlIGZ1bm5ldCIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiS2xhcnRlIGlra2Ugw6UgZGVrb2RlIEpQRUctYmlsZGUiCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIsKrJXPCuyBhdiDCqyVzwrsiCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIkt1bm5lIGlra2Uga29ibGUgdGlsIHRqZW5lci4iCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiSW5nZW4gVVJMIHNhdHQuIgorCittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJLdW5uZSBpa2tlIHNsw6Ugb3BwIG5hdm4gcMOlIHRqZW5lci4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiS3VubmUgaWtrZSBldGFibGVyZSB0aWxrb2JsaW5nIHRpbCB0amVuZXIuIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiT3Bwc2V0dCBhdiBzaWtrZXIgdGlsa29ibGluZyBmZWlsZXQuIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiRW4gbmV0dHZlcmtzZmVpbCBvcHBzdG9kLCBlbGxlciB0amVuZXJlbiBsdWtrZXQgdXZlbnRldCB0aWxrb2JsaW5nZW4uIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICJUamVuZXIgc2VuZHRlIHVneWxkaWdlIGRhdGEuIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIlRqZW5lciBzdMO4dHRlciBpa2tlIHPDuGtpbmcuIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICJJbmdlbiBlbGxlciB1Z3lsZGlnIGlubmRhdGFseWQsIEFWSS1zdHLDuG1tZW4gdmlsIGJsaSBza2FkZXQuIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJGaWxlbiBpbm5laG9sZGVyIGluZ2VuIHNwaWxsYmFyZSBzdHLDuG1tZXIuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJGaWxlbiBlciB1Z3lsZGlnIG9nIGthbiBpa2tlIHNwaWxsZXMuIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIkthbiBpa2tlIHNwaWxsZSBhdiBzdHLDuG1tZW4gZm9yZGkgZGVuIGVyIGtyeXB0ZXJ0IG1lZCBQbGF5UmVhZHkgRFJNLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRmlsZW4gZXIgc2thZGV0IG9nIGthbiBpa2tlIHNwaWxsZXMuIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICJVZ3lsZGlnIGF0b21zdMO4cnJlbHNlLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRmlsZW4gZXIgdWZ1bGxzdGVuZGlnIG9nIGthbiBpa2tlIHNwaWxsZXMuIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICJWaWRlb2VuIGkgZGVubmUgZmlsZW4gc3BpbGxlcyBrYW5za2plIGlra2UgYXYga29ycmVrdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiRmlsZW4gaW5uZWhvbGRlciBmb3IgbWFuZ2Ugc3Ryw7htbWVyLiBTcGlsbGVyIGJhcmUgZsO4cnN0ZSAlZCIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisiSW5nZW4gc3TDuHR0ZXQgc3Ryw7htIGJsZSBmdW5uZXQuIER1IG3DpSBrYW5za2plIGluc3RhbGxlcmUgZW4gR1N0cmVhbWVyIFJUU1AgIgorInV0dmlkZWxzZXNwcm9ncmFtdGlsbGVnZyBmb3IgUmVhbCBtZWRpZXN0csO4bW1lci4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyJJbmdlbiBzdMO4dHRldCBzdHLDuG0gYmxlIGZ1bm5ldC4gRHUgbcOlIGthbnNramUgdGlsbGF0ZSBmbGVyZSAiCisidHJhbnNwb3J0cHJvdG9rb2xsZXIgZWxsZXIgZGVuIGthbiBtYW5nbGUgZGVuIHJldHRlIEdTdHJlYW1lciBSVFNQLSIKKyJ1dHZpZGVsc2VzdGlsbGVnZ2V0LiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyJLdW5uZSBpa2tlIMOlcG5lIGx5ZGVuaGV0ZW4gZm9yIGF2c3BpbGxpbmcuIEVuaGV0ZW4gYnJ1a2VzIGF2IGV0IGFubmV0ICIKKyJwcm9ncmFtLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiS3VubmUgaWtrZSDDpXBuZSBseWRlbmhldGVuIGZvciBhdnNwaWxsaW5nLiBEdSBoYXIgaWtrZSB0aWxsYXRlbHNlIHRpbCDDpSDDpXBuZSAiCisiZW5oZXRlbi4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiS3VubmUgaWtrZSDDpXBuZSBseWRlbmhldCBmb3IgYXZzcGlsbGluZy4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiS3VubmUgaWtrZSDDpXBuZSBseWRlbmhldGVuIGZvciBhdnNwaWxsaW5nLiBEZW5uZSB2ZXJzam9uZW4gYXYgwqtPcGVuIFNvdW5kICIKKyJTeXN0ZW3CuyBzdMO4dHRlcyBpa2tlIGF2IGRldHRlIGVsZW1lbnRldC4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiQXZzcGlsbGluZyBzdMO4dHRlcyBpa2tlIGF2IGRlbm5lIGx5ZGVuaGV0ZW4uIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICJMeWRhdnNwaWxsaW5nc2ZlaWwiCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIk9wcHRhayBzdMO4dHRlcyBpa2tlIGF2IGRlbm5lIGx5ZGVuaGV0ZW4uIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiRmVpbCB2ZWQgb3BwdGFrIGZyYSBseWRlbmhldGVuLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIkt1bm5lIGlra2Ugw6VwbmUgbHlkZW5oZXRlbiBmb3Igb3BwdGFrLiBEdSBoYXIgaWtrZSB0aWxsYXRlbHNlIHRpbCDDpSDDpXBuZSAiCisiZW5oZXRlbi4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIkt1bm5lIGlra2Ugw6VwbmUgbHlkZW5oZXQgZm9yIG9wcHRhay4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiQ29yZUF1ZGlvLWVuaGV0IGlra2UgZnVubmV0IgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICJDb3JlQXVkaW8tZW5oZXQga3VuZSBpa2tlIMOlcG5lcyIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIk9wcHRha3NraWxkZSIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pa3JvZm9uIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiTGluamUgaW5uIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIkludGVybiBDRCIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJTUERJRiBJbm4iCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiQVVYIDEgaW5uIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIkFVWCAyIGlubiIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJLb2Rlay1Mb29wYmFjayIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiU3VuVlRTLUxvb3BiYWNrIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJWb2x1bSIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIlN0eXJrZSIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIk1vbml0b3IiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJJbm5lYnlnZ2V0IGjDuHl0dGFsZXIiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIkhvZGV0ZWxlZm9uIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIkxpbmplIHV0IgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJTUERJRiB1dCIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiQVVYIDEgdXQiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIkFVWCAyIHV0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZlaWwgdmVkIGxlc2luZyBhdiUgZCBieXRlcyBmcmEgZW5oZXRlbiAnJSBzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICJLdW5uZSBpa2tlIHNwZXNpZmlzZXJlIG11bGlnZSB2aWRlb2Zvcm1hdGVyIGVuaGV0IMKrJXPCuyBrYW4gYXJiZWlkZSBtZWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIkt1bm5lIGlra2UgdGlsb3JkbmUgYnVmZmVyZSBmcmEgZW5oZXRlbiDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICJEcml2ZXJlbiBhdiBlbmhldGVuIMKrJXPCuyBzdMO4dHRlciBpa2tlIElPIG1ldG9kZW4gJWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICJEcml2ZXJlbiBhdiBlbmhldGVuIMKrJXPCuyBzdMO4dHRlciBpa2tlIG5vZW4ga2plbnRlIElPLW1ldG9kZXIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIkVuaGV0ZW4gwqslc8K7IGVyIG9wcHRhdHQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIkVuaGV0IMKrJXPCuyBrYW4gaWtrZSBmYW5nZSB2ZWQgJWR4JWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIkVuaGV0IMKrJXPCuyBrYW4gaWtrZSBmYW5nZSBpIGRldCBhbmdpdHRlIGZvcm1hdGV0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIkVuaGV0IMKrJXPCuyBzdMO4dHRlciBpa2tlIGlra2Utc2FtbWVuaGVuZ2VuZGUgcGxhbiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIkt1bm5lIGlra2UgZsOlIHBhcmFtZXRlcmUgcMOlIGVuaGV0ZW4gwqslc8K7LiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiVmlkZW9lbmhldGVuIGFrc2VwdGVydGUgaWtrZSBueSBiaWxkZWZyZWt2ZW5zaW5uc3RpbGxpbmcuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiVmlkZW9lbmhldCB0aWxiw7hkIGlra2UgdXRkYXRhZm9ybWF0LiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICJWaWRlb2VuaGV0IHJldHVybmVydGUgdWd5bGRpZ2UgZGltZW5zam9uZXIuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIlZpZGVvLWVuaGV0ZXIgYnJ1a2VyIGVuIHVzdMO4dHRldCBsaW5qZWZsZXR0aW5nc21ldG9kZS4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiVmlkZW9lbmhldCBicnVrZXIgZXQgdXN0w7h0dGV0IHBpa3NlbGZvcm1hdC4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiS2xhcnRlIGlra2Ugw6Uga29uZmlndXJlcmUgaW50ZXJudCBidWZmZXJvbXLDpWRlIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICJWaWRlb2VuaGV0IGZvcmVzbG8gaWtrZSBub2VuIGJ1ZmZlcnN0w7hycmVsc2UuIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiSW5nZW4gbmVkc3Ryw7htc29tcsOlZGUgw6UgaW1wb3J0ZXJlIGZyYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkt1bm5lIGlra2UgaGVudGUgaW5uc3RpbGxpbmdlbmUgZnJhIG1vdHRha2VyZW4gJWQgcMOlIGVuaGV0ZW4gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJGZWlsIHZlZCBoZW50aW5nIGF2IGZ1bmtzam9uZXIgZm9yIGVuaGV0ZW4gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIkVuaGV0ZW4gwqslc8K7IGVyIGlra2UgZW4gdHVuZXIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiTWlzbHlrdGVzIGkgw6UgZsOlIHJhZGlvLWlubmRhdGEgcMOlIGVuaGV0ZW4gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIktsYXJ0ZSBpa2tlIMOlIHNldHRlIGlubmdhbmcgJWQgcMOlIGVuaGV0ICVzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS2xhcnRlIGlra2Ugw6UgZW5kcmUgZGVtcGUtbW9kdXMgZm9yIGVuaGV0ZW4gwqslc8K7LiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiS3VubmUgaWtrZSB0aWxkZWxlIG7DuGR2ZW5kaWdlIG1pbm5lLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJLdW5uZSBpa2tlIHRpbGRlbGUgbsO4ZHZlbmRpZ2UgbWlubmUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIktvbnZlcnRlciBww6UgZW5oZXQgwqslc8K7IGhhciBpbmdlbiBzdMO4dHRlZGUgaW5uZGF0YWZvcm1hdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiS29udmVydGVyIHDDpSBlbmhldCDCqyVzwrsgaGFyIGluZ2VuIHN0w7h0dGVkZSB1dGRhdGFmb3JtYXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIkVua29kZXIgcMOlIGVuaGV0IMKrJXPCuyBoYXIgaW5nZW4gc3TDuHR0ZWRlIGlubmRhdGFmb3JtYXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJFbmtvZGVyIHDDpSBlbmhldCDCqyVzwrsgaGFyIGluZ2VuIHN0w7h0dGVkZSB1dGRhdGFmb3JtYXQiCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiS2xhcnRlIGlra2Ugw6Ugc3RhcnRlIGRla29kaW5nIGF2IHRyw6VkZW4uIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICJLdW5uZSBpa2tlIGJlaGFuZGxlIHJhbW1lLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJGZWlsIHZlZCBoZW50aW5nIGF2IGV2bmVyIGZvciBlbmhldGVuIMKrJXPCuzogRGV0IGVyIGlra2UgZW4gdjRsMiBkcml2ZXIuICIKKyJTamVrayBvbSBkZXQgZXIgZW4gdjRsMSBkcml2ZXIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiRmVpbCB2ZWQgYXR0cmlidXR0c3DDuHJyaW5nIGF2IGlubmRhdGEgJWQgcMOlIGVuaGV0ICVzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkt1bm5lIGlra2UgaGVudGUgaW5uc3RpbGxpbmdlbiBhdiBtb3R0YWtlcmVuICVkIHDDpSBlbmhldGVuIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICJGZWlsIHZlZCBub3JtLXNww7hycmluZyBww6UgZW5oZXQgJXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJLdW5uZSBpa2tlIMOlIGbDpSBpbm4ga29udHJvbGxhdHRyaWJ1dHRlciBww6UgZW5oZXQgwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJLYW4gaWtrZSBpZGVudGlmaXNlcmUgZW5oZXQgwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJEZXR0ZSBlciBpa2tlIGVuIGVuaGV0IMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJLdW5uZSBpa2tlIMOlcG5lIGVuaGV0IMKrJXPCuyBmb3IgbGVzaW5nIG9nIHNrcml2aW5nLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIkVuaGV0IMKrJXPCuyBrYW4gaWtrZSBmYW5nZSBkYXRhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiRW5oZXQgwqslc8K7IGVyIGlra2UgZW4gdXRnYW5nc2VuaGV0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiRW5oZXRlbiDCqyVzwrsgZXIgaWtrZSBlbiBNMk0tZW5oZXQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJLdW5uZSBpa2tlIMOlcG5lIGVuaGV0IMKrJXPCuyBmb3IgbGVzaW5nIG9nIHNrcml2aW5nLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS3VubmUgaWtrZSBzZXR0ZSBub3JtZW4gZm9yIGVuaGV0IMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJLbGFydGUgaWtrZSDDpSBmw6UgZ2plbGRlbmRlIG1vdHRha2VyZnJla3ZlbnMgZm9yIGVuaGV0ZW4gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisiS2xhcnRlIGlra2Ugw6Ugc2V0dGUgZ2plbGRlbmRlIG1vdHRha2VyZnJla3ZlbnMgZm9yIGVuaGV0ZW4gwqslc8K7IHRpbCAlbHUgSHouIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIktsYXJ0ZSBpa2tlIMOlIGlubmhlbnRlIHNpZ25hbHN0eXJrZW4gZm9yIGVuaGV0ZW4gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS3VubmUgaWtrZSBoZW50ZSB2ZXJkaSBmb3Iga29udHJvbGwgJWQgcMOlIGVuaGV0ZW4gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS2xhcnRlIGlra2Ugw6Ugc2V0dGUgdmVyZGkgJWQgZm9yIGtvbnRyb2xsICVkIHDDpSBlbmhldGVuIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJLdW5uZSBpa2tlIGhlbnRlIGdqZWxkZW5kZSBpbm5kYXRhIHDDpSBlbmhldGVuIMKrJXPCuy4gS2Fuc2tqZSBkZXQgZXIgZW4gIgorInJhZGlvZW5oZXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiS3VubmUgaWtrZSBoZW50ZSB1dGRhdGEgZnJhIGVuaGV0ZW4gwqslc8K7LiBLYW5za2plIGRldCBlciBlbiByYWRpb2VuaGV0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIktsYXJ0ZSBpa2tlIMOlIHNldHRlIHV0Z2FuZyAlZCBww6UgZW5oZXQgJXMuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiRW5kcmluZyBhdiBvcHBsw7hzbmluZyB1bmRlciBrasO4cmluZyBzdMO4dHRlcyBpa2tlIGVuZGEuIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJLYW4gaWtrZSBvcGVyZXJlIHV0ZW4gZW4ga2xva2tlIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICJJbnRlcm4gZmVpbCBpIGRhdGFzdHLDuG0uIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAiSW50ZXJuIGRhdGFmbHl0ZmVpbC4iCisKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIkVuaGV0IMKrJXPCuyBzdMO4dHRlciBpa2tlIHZpZGVvb3BwdGFrIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNvdW5kIHNlcnZlciIKKyN+IG1zZ3N0ciAiS3VubmUgaWtrZSBldGFibGVyZSB0aWxrb2JsaW5nIHRpbCBseWR0amVuZXIiCisKKyN+IG1zZ2lkICJGYWlsZWQgdG8gcXVlcnkgc291bmQgc2VydmVyIGNhcGFiaWxpdGllcyIKKyN+IG1zZ3N0ciAiS2xhcnRlIGlra2Ugw6UgZXR0ZXJzcMO4cnJlIGx5ZHRqZW5lcmVucyBldm5lciIKKworI34gbXNnaWQgIkJhc3MiCisjfiBtc2dzdHIgIkJhc3MiCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgIkRpc2thbnQiCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAiU3ludGgiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIlBDTSIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIkjDuHl0dGFsZXIiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICJMaW5qZSBpbm4iCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiQ0QiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAiTWlrc2VyIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICJPcHB0YWsiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICJJbm5zdHlya2UiCisKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAiVXRzdHlya2UiCisKKyN+IG1zZ2lkICJMaW5lLTEiCisjfiBtc2dzdHIgIkxpbmplIDEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIkxpbmplIDIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIkxpbmplIDMiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTEiCisjfiBtc2dzdHIgIkRpZ2l0YWwgMSIKKworI34gbXNnaWQgIkRpZ2l0YWwtMiIKKyN+IG1zZ3N0ciAiRGlnaXRhbCAyIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICJEaWdpdGFsIDMiCisKKyN+IG1zZ2lkICJQaG9uZS1pbiIKKyN+IG1zZ3N0ciAiVGVsZWZvbiBpbm4iCisKKyN+IG1zZ2lkICJQaG9uZS1vdXQiCisjfiBtc2dzdHIgIlRlbGVmb24gdXQiCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAiVmlkZW8iCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAiUmFkaW8iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIgorI34gbXNnc3RyICJLdW5uZSBpa2tlIMOlcG5lIGx5ZGVuaGV0ZW4gZm9yIG1pa3NlcmtvbnRyb2xsaMOlbmR0ZXJpbmcuIgorCisjfiBtc2dpZCAiIgorI34gIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4gVGhpcyB2ZXJzaW9uIG9mICIKKyN+ICJ0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiS3VubmUgaWtrZSDDpXBuZSBseWRlbmhldGVuIGZvciBtaWtzZXJrb250cm9sbGjDpW5kdGVyaW5nLiBEZW5uZSB2ZXJzam9uZW4gIgorI34gImF2IMKrT3BlbiBTb3VuZCBTeXN0ZW3CuyBzdMO4dHRlcyBpa2tlIGF2IGRldHRlIGVsZW1lbnRldC4iCisKKyN+IG1zZ2lkICJNYXN0ZXIiCisjfiBtc2dzdHIgIkhvdmVkdm9sdW0iCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAiRnJvbnQiCisKKyN+IG1zZ2lkICJSZWFyIgorI34gbXNnc3RyICJCYWsiCisKKyN+IG1zZ2lkICJIZWFkcGhvbmVzIgorI34gbXNnc3RyICJIb2RldGVsZWZvbmVyIgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICJTZW50ZXIiCisKKyN+IG1zZ2lkICJMRkUiCisjfiBtc2dzdHIgIkxGRSIKKworI34gbXNnaWQgIlN1cnJvdW5kIgorI34gbXNnc3RyICJTdXJyb3VuZCIKKworI34gbXNnaWQgIlNpZGUiCisjfiBtc2dzdHIgIlNpZGUiCisKKyN+IG1zZ2lkICJBVVggT3V0IgorI34gbXNnc3RyICJBVVggdXQiCisKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAiM0QgZHliZGUiCisKKyN+IG1zZ2lkICIzRCBDZW50ZXIiCisjfiBtc2dzdHIgIjNEIHNlbnRlciIKKworI34gbXNnaWQgIjNEIEVuaGFuY2UiCisjfiBtc2dzdHIgIjNELWZvcmJlZHJpbmciCisKKyN+IG1zZ2lkICJUZWxlcGhvbmUiCisjfiBtc2dzdHIgIlRlbGVmb24iCisKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAiVmlkZW8gaW5uIgorCisjfiBtc2dpZCAiQVVYIEluIgorI34gbXNnc3RyICJBVVggaW5uIgorCisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIklubnNwaWxsaW5nc3N0eXJrZSIKKworI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICJVdGRhdGFzdHlya2UiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICJNaWtyb2ZvbmZvcnN0ZXJrbmluZyIKKworI34gbXNnaWQgIkRpYWdub3N0aWMiCisjfiBtc2dzdHIgIkRpYWdub3NlIgorCisjfiBtc2dpZCAiQmFzcyBCb29zdCIKKyN+IG1zZ3N0ciAiQmFzc0Jvb3N0IgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgIkF2c3BpbGxpbmdzcG9ydGVyOiIKKworI34gbXNnaWQgIklucHV0IgorI34gbXNnc3RyICJJbm5nYW5nIgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIk1vbml0b3JraWxkZSIKKworI34gbXNnaWQgIktleWJvYXJkIEJlZXAiCisjfiBtc2dzdHIgIlRhc3RhdHVycGlwIgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICJTaW11bGVydCBzdGVyZW8iCisKKyN+IG1zZ2lkICJTdGVyZW8iCisjfiBtc2dzdHIgIlN0ZXJlbyIKKworI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICJTdXJyb3VuZGx5ZCIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAiTWlrcm9mb25zdHlya2UiCisKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAiSMO4eXR0YWxlcmtpbGRlIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgIk1pa3JvZm9ua2lsZGUiCisKKyN+IG1zZ2lkICJKYWNrIgorI34gbXNnc3RyICJKYWNrIgorCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICJTZW50ZXIgLyBMRkUiCisKKyN+IG1zZ2lkICJTdGVyZW8gTWl4IgorI34gbXNnc3RyICJTdGVyZW9taWtzIgorCisjfiBtc2dpZCAiTW9ubyBNaXgiCisjfiBtc2dzdHIgIk1vbm9taWtzIgorCisjfiBtc2dpZCAiSW5wdXQgTWl4IgorI34gbXNnc3RyICJJbm5kYXRhbWlrcyIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAiTWlrcm9mb24gMSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiTWlrcm9mb24gMiIKKworI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICJEaWdpdGFsIHV0IgorCisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAiRGlnaXRhbCBpbm4iCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk1vZGVtIgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAiSMOlbmRzZXR0IgorCisjfiBtc2dpZCAiT3RoZXIiCisjfiBtc2dzdHIgIkFubmV0IgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAiSW5nZW4iCisKKyN+IG1zZ2lkICJPbiIKKyN+IG1zZ3N0ciAiUMOlIgorCisjfiBtc2dpZCAiT2ZmIgorI34gbXNnc3RyICJBdiIKKworI34gbXNnaWQgIk11dGUiCisjfiBtc2dzdHIgIkRlbXAiCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICJSYXNrIgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgIk1lZ2V0IGxhdiIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAiTGF2IgorCisjfiBtc2dpZCAiTWVkaXVtIgorI34gbXNnc3RyICJNaWRkZWxzIgorCisjfiBtc2dpZCAiSGlnaCIKKyN+IG1zZ3N0ciAiSMO4eSIKKworI34gbXNnaWQgIlZlcnkgSGlnaCIKKyN+IG1zZ3N0ciAiTWVnZXQgaMO4eSIKKworI34gbXNnaWQgIlByb2R1Y3Rpb24iCisjfiBtc2dzdHIgIlByb2R1a3Nqb24iCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICJGcm9ucGFuZWxtaWtyb2ZvbiIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgSW4iCisjfiBtc2dzdHIgIkZyb250cGFuZWwgaW5ubGluamUiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICJGcm9udHBhbmVsaG9kZXRlbGVmb25lciIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICJGcm9udHBhbmVsIHV0bGluamUiCisKKyN+IG1zZ2lkICJHcmVlbiBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkdyw7hubiBrb250YWt0IgorCisjfiBtc2dpZCAiUGluayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlJvc2Ega29udGFrdCIKKworI34gbXNnaWQgIkJsdWUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJCbMOlIGtvbnRha3QiCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkh2aXQga29udGFrdCIKKworI34gbXNnaWQgIkJsYWNrIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiU29ydCBrb250YWt0IgorCisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkdyw6Uga29udGFrdCIKKworI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk9yYW5zamUga29udGFrdCIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlLDuGQga29udGFrdCIKKworI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkd1bCBrb250YWt0IgorCisjfiBtc2dpZCAiR3JlZW4gRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJHcsO4bm4gZnJvbnRwYW5lbGtvbnRha3QiCisKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUm9zYSBmcm9udHBhbmVsa29udGFrdCIKKworI34gbXNnaWQgIkJsdWUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJCbMOlIGZyb250cGFuZWxrb250YWt0IgorCisjfiBtc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJIdml0IGZyb250cGFuZWxrb250YWt0IgorCisjfiBtc2dpZCAiQmxhY2sgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJTb3J0IGZyb250cGFuZWxrb250YWt0IgorCisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkdyw6UgZnJvbnRwYW5lbGtvbnRha3QiCisKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJPcmFuc2plIGZyb250cGFuZWxrb250YWt0IgorCisjfiBtc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUsO4ZCBmcm9udHBhbmVsa29udGFrdCIKKworI34gbXNnaWQgIlllbGxvdyBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkd1bCBmcm9udHBhbmVsa29udGFrdCIKKworI34gbXNnaWQgIlNwcmVhZCBPdXRwdXQiCisjfiBtc2dzdHIgIlNwcmVkbmluZ3N1dGdhbmciCisKKyN+IG1zZ2lkICJEb3dubWl4IgorI34gbXNnc3RyICJOZWRtaWtzIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBJbnB1dCIKKyN+IG1zZ3N0ciAiVmlydHVlbGwgbWlrc2VyaW5uZ2FuZyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgT3V0cHV0IgorI34gbXNnc3RyICJWaXJ0dWVsbCBtaWtzZXJ1dGdhbmciCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICJWaXJ0dWVsbGUgbWlrc2Vya2FuYWxlciIKKworI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyAlZCBGdW5rc2pvbiIKKworI34gbXNnaWQgIiVzIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyBGdW5rc2pvbiIKKworI34gbXNnaWQgIkdvdCB1bmV4cGVjdGVkIGZyYW1lIHNpemUgb2YgJXUgaW5zdGVhZCBvZiAldS4iCisjfiBtc2dzdHIgIkZpa2sgdXZlbnRldCByYW1tZXN0w7hycmVsc2VuICV1IGlzdGVkZW5mb3IgJXUuIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkZlaWwgdmVkIGxlc2luZyBhdiAlZCBieXRlIHDDpSBlbmhldGVuIMKrJXPCuy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZW5xdWV1ZSBidWZmZXJzIGluIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiS3VubmUgaWtrZSBsZWdnZSBpIGvDuCBidWZmZXJlIGkgZW5oZXRlbiDCqyVzwrsuIgorCisjfiBtc2dpZCAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJNaXNseWt0ZXMgaSDDpSBmw6UgdmlkZW9iaWxkZXIgZnJhIGVuaGV0IMKrJXPCuy4iCisKKyN+IG1zZ2lkICJGYWlsZWQgYWZ0ZXIgJWQgdHJpZXMuIGRldmljZSAlcy4gc3lzdGVtIGVycm9yOiAlcyIKKyN+IG1zZ3N0ciAiTWlzbHlrdGVzIGV0dGVyICVkIGZvcnPDuGsuIEVuaGV0ICVzLiBTeXN0ZW1mZWlsOiAlcyIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgaW5wdXQgZWxlbWVudC4iCisjfiBtc2dzdHIgIkJlc2tyaXZlciB2YWxndCBpbm5kYXRhZWxlbWVudC4iCmRpZmYgLS1naXQgYS9wby9ubC5wbyBiL3BvL25sLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYWFjMWMKLS0tIC9kZXYvbnVsbAorKysgYi9wby9ubC5wbwpAQCAtMCwwICsxLDc4MiBAQAorIyB0cmFuc2xhdGlvbiBvZiBnc3QtcGx1Z2lucy1nb29kLm5sLnBvIHRvIER1dGNoCisjIFRoaXMgZmlsZSBpcyBwdXQgaW4gdGhlIHB1YmxpYyBkb21haW4uCisjCisjIEZyZWVrIGRlIEtydWlqZiA8Zi5kZS5rcnVpamZAZ21haWwuY29tPiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiwgMjAxMywgMjAxNCwgMjAxNSwgMjAxNi4KK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QgMS43LjJcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxNi0wMi0yMCAxNjo0MCswMTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBGcmVlayBkZSBLcnVpamYgPGYuZGUua3J1aWpmQGdtYWlsLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBEdXRjaCA8dmVydGFsaW5nQHZyaWpzY2hyaWZ0Lm9yZz5cbiIKKyJMYW5ndWFnZTogbmxcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJYLUdlbmVyYXRvcjogTG9rYWxpemUgMS41XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0yOyBwbHVyYWw9biAhPSAxO1xuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICJKYWNrLXNlcnZlciBuaWV0IGdldm9uZGVuIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICJLYW4gZGUgSlBFRy1hZmJlZWxkaW5nIG5pZXQgZGVjb2RlcmVuIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICInJXMnIGRvb3IgJyVzJyIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiS2FuIGdlZW4gdmVyYmluZGluZyBtYWtlbiBtZXQgc2VydmVyIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIkdlZW4gVVJMIGluZ2VzdGVsZC4iCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIkthbiBkZSBzZXJ2ZXJuYWFtIG5pZXQgb3B6b2VrZW4uIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIkthbiBnZWVuIHZlcmJpbmRpbmcgbWFrZW4gbWV0IGRlIHNlcnZlciIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIkJldmVpbGlnZGUgdmVyYmluZGluZyBvcHpldHRlbiBpcyBtaXNsdWt0LiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIiIKKyJFciB0cmFkIGVlbiBuZXR3ZXJrZm91dCBvcCBvZiBkZSBzZXJ2ZXIgaGVlZnQgZGUgdmVyYmluZGluZyBvbnZlcndhY2h0ICIKKyJhZmdlYnJva2VuLiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiRGUgc2VydmVyIHN0dXVyZGUgb25qdWlzdGUgZ2VnZXZlbnMuIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIlpvZWtlbiB3b3JkdCBkb29yIGRlIHNlcnZlciBuaWV0IG9uZGVyc3RldW5kLiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiR2VlbiBvZiBvbmdlbGRpZyBpbnZvZXJnZWx1aWQsIEFWSS1zdHJvb20gemFsIHNsZWNodCB6aWpuLiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAiRGl0IGJlc3RhbmQgYmV2YXQgZ2VlbiBhZnNwZWVsYmFyZSBzdHJvbWVuLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRGl0IGJlc3RhbmQgaXMgb25nZWxkaWcgZW4ga2FuIG5pZXQgYWZnZXNwZWVsZCB3b3JkZW4uIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIkthbiBzdHJlYW0gbmlldCBhZnNwZWxlbiBvbWRhdCBoZXQgdmVyc2xldXRlbGQgaXMgbWV0IFBsYXlSZWFkeSBEUk0uIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJEaXQgYmVzdGFuZCBpcyBiZXNjaGFkaWdkIGVuIGthbiBuaWV0IGFmZ2VzcGVlbGQgd29yZGVuLiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiT25nZWxkaWdlIFwiYXRvbVwiLWdyb290dGUuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJEaXQgYmVzdGFuZCBpcyBpbmNvbXBsZWV0IGVuIGthbiBuaWV0IGFmZ2VzcGVlbGQgd29yZGVuLiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiRGUgdmlkZW8gaW4gZGl0IGJlc3RhbmQgemFsIG1vZ2VsaWprIG5pZXQgY29ycmVjdCBhZmdlc3BlZWxkIHdvcmRlbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiIgorIkRpdCBiZXN0YW5kIGJldmF0IHRlIHZlZWwgc3Ryb21lbi4gQWxsZWVuIGRlIGVlcnN0ZSAlZCB3b3JkZW4gYWZnZXNwZWVsZC4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIkVyIGlzIGdlZW4gb25kZXJzdGV1bmRlIHN0cm9vbSBnZXZvbmRlbi4gTWlzc2NoaWVuIG1vZXQgZXIgZWVuIEdTdHJlYW1lciAiCisiUlRTUCBleHRlbnNpZS1wbHVnaW4gdm9vciBSZWFsLW1lZGlhLXN0cmVhbXMgZ2XDr25zdGFsbGVlcmQgd29yZGVuLiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorIkVyIGlzIGdlZW4gb25kZXJzdGV1bmRlIHN0cm9vbSBnZXZvbmRlbi4gTWlzc2NoaWVuIG1vZXQgdSBtZWVyICIKKyJvdmVyZHJhY2h0c3Byb3RvY29sbGVuIHRvZXN0YWFuIG9mIGFuZGVycyBvbnRicmVla3QgZGUganVpc3RlIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpZS1wbHVnaW4uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIkthbiBoZXQgYXVkaW8tYXBwYXJhYXQgbmlldCBvcGVuZW4gdm9vciBhZnNwZWxlbi4gQXBwYXJhYXQgaXMgaW4gZ2VicnVpayBiaWogIgorImVlbiBhbmRlcmUgYXBwbGljYXRpZS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIkthbiBoZXQgYXVkaW8tYXBwYXJhYXQgbmlldCBvcGVuZW4gdm9vciBhZnNwZWxlbi4gVSBoZWJ0IGdlZW4gdG9lc3RlbW1pbmcgb20gIgorImhldCBhcHBhcmFhdCB0ZSBvcGVuZW4uIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIkthbiBoZXQgYXVkaW8tYXBwYXJhYXQgbmlldCBvcGVuZW4gdm9vciBhZnNwZWxlbi4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiS2FuIGhldCBhdWRpby1hcHBhcmFhdCBuaWV0IG9wZW5lbiB2b29yIGFmc3BlbGVuLiBEZXplIHZlcnNpZSB2YW4gaGV0IE9wZW4gIgorIlNvdW5kIFN5c3RlbSB3b3JkdCBuaWV0IG9uZGVyc3RldW50IGRvb3IgZGl0IGVsZW1lbnQuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkFmc3BlbGVuIHdvcmR0IG5pZXQgb25kZXJzdGV1bmQgZG9vciBkaXQgYXVkaW8tYXBwYXJhYXQiCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIkZvdXQgaW4gZ2VsdWlkIGFmc3BlbGVuLiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiT3BuZW1lbiB3b3JkdCBuaWV0IG9uZGVyc3RldW5kIGRvb3IgZGl0IGF1ZGlvLWFwcGFyYWF0IgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiRm91dCBiaWogb3BuZW1lbiB2YW5hZiBhdWRpby1hcHBhcmFhdC4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJLYW4gaGV0IGF1ZGlvLWFwcGFyYWF0IG5pZXQgb3BlbmVuIHZvb3Igb3BuZW1lbi4gVSBoZWJ0IGdlZW4gdG9lc3RlbW1pbmcgb20gIgorImhldCBhcHBhcmFhdCB0ZSBvcGVuZW4uIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICJLYW4gaGV0IGF1ZGlvLWFwcGFyYWF0IG5pZXQgb3BlbmVuIHZvb3Igb3BuZW1lbi4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiQ29yZUF1ZGlvIGFwcGFyYWF0IG5pZXQgZ2V2b25kZW4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIkNvcmVBdWRpbyBhcHBhcmFhdCBrb24gbmlldCBnZW9wZW5kIHdvcmRlbiIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIk9wbmFtZWJyb24iCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWNyb2Zvb24iCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJMaWpuLWluIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIkludGVybmUgY2QiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiU1BESUYtaW4iCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiQVVYIDEtaW4iCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiQVVYIDItaW4iCisKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiQ29kZWMtbG9vcGJhY2siCisKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIlN1blZUUy1sb29wYmFjayIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiVm9sdW1lIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiVmVyc3RlcmtpbmciCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJNb25pdG9yIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiSW5nZWJvdXdkZSBsdWlkc3ByZWtlciIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiSG9vZmR0ZWxlZm9vbiIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICJMaW5lLW91dCIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiU1BESUYtb3V0IgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICJBVVggMS1vdXQiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIkFVWCAyLW91dCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICJGb3V0IGJpaiBoZXQgbGV6ZW4gdmFuICVkIGJ5dGVzIHZhbiBhcHBhcmFhdCAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiT3Bub2VtZW4gdmFuIHZpZGVvZm9ybWF0ZW4gd2Fhcm1lZSBhcHBhcmFhdCAnJXMnIGthbiB3ZXJrZW4gaXMgbWlzbHVrdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiS2FuIGRlIGJ1ZmZlcnMgdmFuIGFwcGFyYWF0ICclcycgbmlldCB2aW5kZW4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIkhldCBzdHV1cnByb2dyYW1tYSB2YW4gYXBwYXJhYXQgJyVzJyBvbmRlcnN0ZXVudCBkZSBJTy1tZXRob2RlICVkIG5pZXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICIiCisiSGV0IHN0dXVycHJvZ3JhbW1hIHZhbiBhcHBhcmFhdCAnJXMnIG9uZGVyc3RldW50IGdlZW4gYmVrZW5kZSBJTy1tZXRob2RlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJBcHBhcmFhdCAnJXMnIGlzIGJlemV0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJBcHBhcmFhdCAnJXMnIGthbiBnZWVuIG9wbmFtZSBtYWtlbiBtZXQgJWR4JWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIkFwcGFyYWF0ICclcycga2FuIGdlZW4gb3BuYW1lIG1ha2VuIGluIGhldCBnZXNwZWNpZmljZWVyZGUgZm9ybWFhdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICJBcHBhcmFhdCAnJXMnIG9uZGVyc3RldW50IG5pZXQtY29udGludWUgdmxha2tlbiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIkthbiBkZSBwYXJhbWV0ZXJzIG9wIGFwcGFyYWF0ICclcycgbmlldCB2ZXJrcmlqZ2VuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICJWaWRlb2FwcGFyYWF0IGhlZWZ0IGRlIG5pZXV3ZSBmcmFtZS1zbmVsaGVpZCBuaWV0IGdlYWNjZXB0ZWVyZC4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICJWaWRlb2FwcGFyYWF0IGxldmVyZGUgZ2VlbiB1aXR2b2VyZm9ybWFhdC4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiVmlkZW8tYXBwYXJhYXQgZ2FmIG9uZ2VsZGlnZSBhZm1ldGluZ2VuIHRlcnVnLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICIiCisiVmlkZW8tYXBwYXJhYXQgZ2VicnVpa3QgZWVuIG5pZXQgb25kZXJzdGV1bmRlIG1ldGhvZGUgdm9vciBpbnRlcmxhY2luZy4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiVmlkZW8tYXBwYXJhYXQgZ2VicnVpa3QgZWVuIG5pZXQgb25kZXJzdGV1bmQgcGl4ZWxmb3JtYWF0LiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICJJbnN0ZWxsZW4gdmFuIGludGVybmUgYnVmZmVycG9vbCBpcyBtaXNsdWt0LiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiVmlkZW9hcHBhcmFhdCBnYWYgZ2VlbiBzdWdnZXN0aWUgdm9vciBlZW4gYnVmZmVyZ3Jvb3R0ZS4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICJHZWVuIGRvd25zdHJlYW0gcG9vbCBvbSB2YW4gdGUgaW1wb3J0ZXJlbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkluc3RlbGxpbmdlbiB2YW4gdHVuZXIgJWQgb3AgYXBwYXJhYXQgJyVzJyBvcGhhbGVuIGlzIG1pc2x1a3QuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZvdXQgYmlqIGhldCBvcGhhbGVuIGRlIG1vZ2VsaWpraGVkZW4gdmFuIGFwcGFyYWF0ICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiQXBwYXJhYXQgJyVzJyBpcyBnZWVuIHR1bmVyLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIlJhZGlvLWludm9lciB2YW4gYXBwYXJhYXQgJyVzJyBvcGhhbGVuIGlzIG1pc2x1a3QuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiS2FuIGludm9lciAlZCBvcCBhcHBhcmFhdCAnJXMnIG5pZXQgaW5zdGVsbGVuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRGUgZ2VkZW1wdGUgc3RhdHVzIHZhbiBhcHBhcmFhdCAnJXMnIHdpanppZ2VuIGlzIG1pc2x1a3QuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJWZXJlaXN0IGdlaGV1Z2VuIHRvZWtlbm5lbiBpcyBtaXNsdWt0LiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJWZXJlaXN0IGdlaGV1Z2VuIHRvZWtlbm5lbiBpcyBtaXNsdWt0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJDb252ZXJ0ZXIgb3AgYXBwYXJhYXQgJXMgaGVlZnQgZ2VlbiBvbmRlcnN0ZXVuZCBpbnZvZXJmb3JtYWF0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJDb252ZXJ0ZXIgb3AgYXBwYXJhYXQgJXMgaGVlZnQgZ2VlbiBvbmRlcnN0ZXVuZCB1aXR2b2VyZm9ybWFhdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiQ29kZWVyZGVyIG9wIGFwcGFyYWF0ICVzIGhlZWZ0IGdlZW4gb25kZXJzdGV1bmQgaW52b2VyZm9ybWFhdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIkNvZGVlcmRlciBvcCBhcHBhcmFhdCAlcyBoZWVmdCBnZWVuIG9uZGVyc3RldW5kIHVpdHZvZXJmb3JtYWF0IgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIkJlZ2lubmVuIG1ldCBkZWNvZGVyZW4gdmFuIHRocmVhZCBpcyBtaXNsdWt0LiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiQmV3ZXJrZW4gdmFuIGZyYW1lIGlzIG1pc2x1a3QuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIkZvdXQgYmlqIGhldCB2ZXJrcmlqZ2VuIHZhbiBkZSBlaWdlbnNjaGFwcGVuIHZhbiBhcHBhcmFhdCAnJXMnOiBoZXQgaXMgZ2VlbiAiCisidjRsMi1zdHV1cnByb2dyYW1tYS4gQ29udHJvbGVlciBvZiBoZXQgZWVuIHY0bDEtc3R1dXJwcm9ncmFtbWEgaXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiS2FuIGVpZ2Vuc2NoYXBwZW4gdmFuIGludm9lciAlZCBvcCBhcHBhcmFhdCAlcyBuaWV0IG9wdnJhZ2VuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJLYW4gZGUgaW5zdGVsbGluZyB2YW4gdHVuZXIgJWQgb3AgYXBwYXJhYXQgJyVzJyBuaWV0IHZlcmtyaWpnZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS2FuIGRlIG5vcm0gb3AgYXBwYXJhYXQgJyVzJyBuaWV0IG9wdnJhZ2VuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS2FuIGRlIGtub3BlaWdlbnNjaGFwcGVuIG9wIGFwcGFyYWF0ICclcycgbmlldCB2ZXJrcmlqZ2VuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJLYW4gYXBwYXJhYXQgJyVzJyBuaWV0IGlkZW50aWZpY2VyZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkRpdCBpcyBnZWVuIGFwcGFyYWF0ICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiS2FuIGFwcGFyYWF0ICclcycgbmlldCBvcGVuZW4gdm9vciBsZXplbiBlbiBzY2hyaWp2ZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiQXBwYXJhYXQgJyVzJyBpcyBnZWVuIG9wbmFtZWFwcGFyYWF0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiQXBwYXJhYXQgJyVzJyBpcyBnZWVuIHVpdHZvZXJhcHBhcmFhdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIkFwcGFyYWF0ICclcycgaXMgZ2VlbiBNMk0tYXBwYXJhYXQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJLYW4gZ2VlbiBkdXAgZG9lbiBvcCBhcHBhcmFhdCAnJXMnIHZvb3IgbGV6ZW4gZW4gc2NocmlqdmVuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiS2FuIG5vcm0gbmlldCBpbnN0ZWxsZW4gdm9vciBhcHBhcmFhdCAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkthbiBkZSB0dW5lcmZyZXF1ZW50aWUgdmFuIGFwcGFyYWF0ICclcycgbmlldCB2ZXJrcmlqZ2VuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisiS2FuIGRlIGh1aWRpZ2UgdHVuZXJmcmVxdWVudGllIHZvb3IgYXBwYXJhYXQgJyVzJyBuaWV0IGluc3RlbGxlbiBvcCAlbHUgSHouIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkthbiBkZSBzaWduYWFsc3Rlcmt0ZSB2YW4gYXBwYXJhYXQgJyVzJyBuaWV0IHZlcmtyaWpnZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJLYW4gZGUgd2FhcmRlIHZvb3Iga25vcCAlZCBvcCBhcHBhcmFhdCAnJXMnIG5pZXQgdmVya3Jpamdlbi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkthbiBkZSB3YWFyZGUgJWQgdm9vciBrbm9wICVkIG9wIGFwcGFyYWF0ICclcycgbmlldCBpbnN0ZWxsZW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiS2FuIGRlIGh1aWRpZ2UgaW5zdGVsbGluZ2VuIHZhbiBhcHBhcmFhdCAnJXMnIG5pZXQgdmVya3Jpamdlbi4gSGV0IGlzICIKKyJtb2dlbGlqayBlZW4gcmFkaW8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIkthbiBkZSBodWlkaWdlIHVpdHZvZXIgbmlldCBvcCBhcHBhcmFhdCAnJXMnIGtyaWpnZW4uIEhldCBpcyBtb2dlbGlqayBlZW4gIgorInJhZGlvIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkthbiB1aXR2b2VyICVkIG9wIGFwcGFyYWF0ICVzIG5pZXQgaW5zdGVsbGVuLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIlRpamRlbnMgaGV0IGRyYWFpZW4ga2FuIGRlIHJlc29sdXRpZSBub2cgbmlldCBnZXdpanppZ2Qgd29yZGVuLiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiS2FuIG5pZXQgd2Vya2VuIHpvbmRlciBlZW4ga2xvay4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIkludGVybmUgZm91dCBpbiBnZWdldmVuc3N0cm9vbS4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJJbnRlcm5lIGZvdXQgaW4gZGUgZ2VnZXZlbnNkb29ydm9lci4iCisKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIkFwcGFyYWF0ICclcycgb25kZXJzdGV1bnQgaGV0IG9wbmVtZW4gdmFuIHZpZGVvIG5pZXQiCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc291bmQgc2VydmVyIgorI34gbXNnc3RyICJLYW4gZ2VlbiB2ZXJiaW5kaW5nIG1ha2VuIG1ldCBkZSBnZWx1aWRzc2VydmVyIgorCisjfiBtc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IHNvdW5kIHNlcnZlciBjYXBhYmlsaXRpZXMiCisjfiBtc2dzdHIgIkthbiBkZSBlaWdlbnNjaGFwcGVuIHZhbiBkZSBnZWx1aWRzc2VydmVyIG5pZXQgb3B2cmFnZW4iCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICJMYWdlIHRvbmVuIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICJIb2dlIHRvbmVuIgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIlN5bnRoIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJMdWlkc3ByZWtlciIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIkxpam4taW4iCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiQ0QiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAiTWl4ZXIiCisKKyN+IG1zZ2lkICJQQ00tMiIKKyN+IG1zZ3N0ciAiUENNLTIiCisKKyN+IG1zZ2lkICJSZWNvcmQiCisjfiBtc2dzdHIgIk9wbmFtZSIKKworI34gbXNnaWQgIkluLWdhaW4iCisjfiBtc2dzdHIgIkluZ2FuZ3N2ZXJzdGVya2luZyIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICJVaXRnYW5nc3ZlcnN0ZXJraW5nIgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICJMaWpuLTEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIkxpam4tMiIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAiTGlqbi0zIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICJEaWdpdGFhbC0xIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICJEaWdpdGFhbC0yIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICJEaWdpdGFhbC0zIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIlRlbGVmb29uaW5nYW5nIgorCisjfiBtc2dpZCAiUGhvbmUtb3V0IgorI34gbXNnc3RyICJUZWxlZm9vbnVpdGdhbmciCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAiVmlkZW8iCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAiUmFkaW8iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIgorI34gbXNnc3RyICJLYW4gaGV0IGF1ZGlvLWFwcGFyYWF0IG5pZXQgb3BlbmVuIHZvb3IgaGV0IGJlc3R1cmVuIHZhbiBkZSBtaXhlci4iCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJLYW4gaGV0IGF1ZGlvLWFwcGFyYWF0IG5pZXQgb3BlbmVuIHZvb3IgYmVzdHVyZW4gdmFuIGRlIG1peGVyLiBEZXplICIKKyN+ICJ2ZXJzaWUgdmFuIGhldCBPcGVuIFNvdW5kIFN5c3RlbSB3b3JkdCBuaWV0IG9uZGVyc3RldW50IGRvb3IgZGl0IGVsZW1lbnQuIgorCisjfiBtc2dpZCAiTWFzdGVyIgorI34gbXNnc3RyICJNYXN0ZXIiCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAiVm9vcmthbnQiCisKKyN+IG1zZ2lkICJSZWFyIgorI34gbXNnc3RyICJBY2h0ZXJ6aWpkZSIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkhvb2ZkdGVsZWZvb25zIgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICJNaWRkZW4iCisKKyN+IG1zZ2lkICJMRkUiCisjfiBtc2dzdHIgIkxGRSIKKworI34gbXNnaWQgIlN1cnJvdW5kIgorI34gbXNnc3RyICJTdXJyb3VuZCIKKworI34gbXNnaWQgIlNpZGUiCisjfiBtc2dzdHIgIlppamthbnQiCisKKyN+IG1zZ2lkICJBVVggT3V0IgorI34gbXNnc3RyICJBVVgtdWl0IgorCisjfiBtc2dpZCAiM0QgRGVwdGgiCisjfiBtc2dzdHIgIjNELWRpZXB0ZSIKKworI34gbXNnaWQgIjNEIENlbnRlciIKKyN+IG1zZ3N0ciAiM0QtY2VudHJ1bSIKKworI34gbXNnaWQgIjNEIEVuaGFuY2UiCisjfiBtc2dzdHIgIjNELXZlcmJldGVyZW4iCisKKyN+IG1zZ2lkICJUZWxlcGhvbmUiCisjfiBtc2dzdHIgIlRlbGVmb29uIgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgIlZpZGVvLWluIgorCisjfiBtc2dpZCAiQVVYIEluIgorI34gbXNnc3RyICJBVVgtaW4iCisKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAiT3BuYW1ldmVyc3RlcmtpbmciCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAiVWl0Z2FuZ3N2ZXJzdGVya2luZyIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgQm9vc3QiCisjfiBtc2dzdHIgIk1pY3JvZm9vbi1ib29zdCIKKworI34gbXNnaWQgIkRpYWdub3N0aWMiCisjfiBtc2dzdHIgIkRpYWdub3NlIgorCisjfiBtc2dpZCAiQmFzcyBCb29zdCIKKyN+IG1zZ3N0ciAiQmFzLWJvb3N0IgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgIkFmc3BlZWxwb29ydGVuIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIkludm9lciIKKworI34gbXNnaWQgIk1vbml0b3IgU291cmNlIgorI34gbXNnc3RyICJNb25pdG9yYnJvbiIKKworI34gbXNnaWQgIktleWJvYXJkIEJlZXAiCisjfiBtc2dzdHIgIlRvZXRzZW5ib3JkcGllcCIKKworI34gbXNnaWQgIlNpbXVsYXRlIFN0ZXJlbyIKKyN+IG1zZ3N0ciAiU3RlcmVvIHNpbXVsZXJlbiIKKworI34gbXNnaWQgIlN0ZXJlbyIKKyN+IG1zZ3N0ciAiU3RlcmVvIgorCisjfiBtc2dpZCAiU3Vycm91bmQgU291bmQiCisjfiBtc2dzdHIgIlN1cnJvdW5kLWdlbHVpZCIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAiTWljcm9mb29udmVyc3RlcmtpbmciCisKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTHVpZHNwcmVrZXJicm9uIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgIk1pY3JvZm9vbmJyb24iCisKKyN+IG1zZ2lkICJKYWNrIgorI34gbXNnc3RyICJQbHVnIgorCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICJNaWRkZW4gLyBMRkUiCisKKyN+IG1zZ2lkICJTdGVyZW8gTWl4IgorI34gbXNnc3RyICJTdGVyZW8tbWl4IgorCisjfiBtc2dpZCAiTW9ubyBNaXgiCisjfiBtc2dzdHIgIk1vbm8tbWl4IgorCisjfiBtc2dpZCAiSW5wdXQgTWl4IgorI34gbXNnc3RyICJJbnZvZXItbWl4IgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICJNaWNyb2Zvb24tMSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiTWljcm9mb29uLTIiCisKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAiRGlnaXRhYWwtdWl0IgorCisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAiRGlnaXRhYWwtaW4iCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk1vZGVtIgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAiSGFuZHNldCIKKworI34gbXNnaWQgIk90aGVyIgorI34gbXNnc3RyICJPdmVyaWciCisKKyN+IG1zZ2lkICJOb25lIgorI34gbXNnc3RyICJHZWVuIgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgIkFhbiIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAiVWl0IgorCisjfiBtc2dpZCAiTXV0ZSIKKyN+IG1zZ3N0ciAiRGVtcGVuIgorCisjfiBtc2dpZCAiRmFzdCIKKyN+IG1zZ3N0ciAiU25lbCIKKworI34gbXNnaWQgIlZlcnkgTG93IgorI34gbXNnc3RyICJaZWVyIGxhYWciCisKKyN+IG1zZ2lkICJMb3ciCisjfiBtc2dzdHIgIkxhYWciCisKKyN+IG1zZ2lkICJNZWRpdW0iCisjfiBtc2dzdHIgIk1pZGRlbCIKKworI34gbXNnaWQgIkhpZ2giCisjfiBtc2dzdHIgIkhvb2ciCisKKyN+IG1zZ2lkICJWZXJ5IEhpZ2giCisjfiBtc2dzdHIgIlplZXIgaG9vZyIKKworI34gbXNnaWQgIlByb2R1Y3Rpb24iCisjfiBtc2dzdHIgIlByb2R1Y3RpZSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIk1pY3JvZm9vbiBpbiBmcm9udHBhbmVlbCIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgSW4iCisjfiBtc2dzdHIgIkxpam4taW4gaW4gZnJvbnRwYW5lZWwiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICJIb29mZHRlbGVmb29ucyBpbiBmcm9udHBhbmVlbCIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICJMaWpuLXVpdCBpbiBmcm9udHBhbmVlbCIKKworI34gbXNnaWQgIkdyZWVuIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiR3JvZW5lIGNvbm5lY3RvciIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICJSb3plIGNvbm5lY3RvciIKKworI34gbXNnaWQgIkJsdWUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJCbGF1d2UgY29ubmVjdG9yIgorCisjfiBtc2dpZCAiV2hpdGUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJXaXR0ZSBjb25uZWN0b3IiCisKKyN+IG1zZ2lkICJCbGFjayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlp3YXJ0ZSBjb25uZWN0b3IiCisKKyN+IG1zZ2lkICJHcmF5IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiR3JpanplIGNvbm5lY3RvciIKKworI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk9yYW5qZSBjb25uZWN0b3IiCisKKyN+IG1zZ2lkICJSZWQgQ29ubmVjdG9yIgorI34gbXNnc3RyICJSb2RlIGNvbm5lY3RvciIKKworI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkdlbGUgY29ubmVjdG9yIgorCisjfiBtc2dpZCAiR3JlZW4gRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJHcm9lbmUgY29ubmVjdG9yIGluIGZyb250cGFuZWVsIgorCisjfiBtc2dpZCAiUGluayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlJvemUgY29ubmVjdG9yIGluIGZyb250cGFuZWVsIgorCisjfiBtc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkJsYXV3ZSBjb25uZWN0b3IgaW4gZnJvbnRwYW5lZWwiCisKKyN+IG1zZ2lkICJXaGl0ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIldpdHRlIGNvbm5lY3RvciBpbiBmcm9udHBhbmVlbCIKKworI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiWndhcnRlIGNvbm5lY3RvciBpbiBmcm9udHBhbmVlbCIKKworI34gbXNnaWQgIkdyYXkgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJHcmlqemUgY29ubmVjdG9yIGluIGZyb250cGFuZWVsIgorCisjfiBtc2dpZCAiT3JhbmdlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiT3JhbmplIGNvbm5lY3RvciBpbiBmcm9udHBhbmVlbCIKKworI34gbXNnaWQgIlJlZCBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlJvZGUgY29ubmVjdG9yIGluIGZyb250cGFuZWVsIgorCisjfiBtc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiR2VsZSBjb25uZWN0b3IgaW4gZnJvbnRwYW5lZWwiCisKKyN+IG1zZ2lkICJTcHJlYWQgT3V0cHV0IgorI34gbXNnc3RyICJVaXR2b2VyIHNwcmVpZGVuIgorCisjfiBtc2dpZCAiRG93bm1peCIKKyN+IG1zZ3N0ciAiRG93bm1peCIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIlZpcnR1ZWxlIG1peGVyLWludm9lciIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgT3V0cHV0IgorI34gbXNnc3RyICJWaXJ0dWVsZSBtaXhlci11aXR2b2VyIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBDaGFubmVscyIKKyN+IG1zZ3N0ciAiVmlydHVlbGUgbWl4ZXIta2FuYWxlbiIKKworI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyAlZCBmdW5jdGllIgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzLWZ1bmN0aW9uIgorCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAiT252ZXJ3YWNodGUgZnJhbWVncm9vdHRlLCAldSBpbiBwbGFhdHMgdmFuICV1LiIKKworI34gbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgb24gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJGb3V0IGJpaiBoZXQgbGV6ZW4gdmFuICVkIGJ5dGVzIHZhbiBhcHBhcmFhdCAnJXMnLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlbnF1ZXVlIGJ1ZmZlcnMgaW4gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJLYW4gZ2VlbiBidWZmZXJzIHRvZWtlbm5lbiBpbiBhcHBhcmFhdCAnJXMnLiIKKworI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiS2FuIGdlZW4gdmlkZW9mcmFtZXMgdmVya3JpamdlbiB2YW4gYXBwYXJhYXQgJyVzJy4iCisKKyN+IG1zZ2lkICJGYWlsZWQgYWZ0ZXIgJWQgdHJpZXMuIGRldmljZSAlcy4gc3lzdGVtIGVycm9yOiAlcyIKKyN+IG1zZ3N0ciAiRm91dCBuYSAlZCBwb2dpbmdlbi4gQXBwYXJhYXQgJXMuIFN5c3RlZW1mb3V0OiAlcyIKZGlmZiAtLWdpdCBhL3BvL29yLnBvIGIvcG8vb3IucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1MzZmZAotLS0gL2Rldi9udWxsCisrKyBiL3BvL29yLnBvCkBAIC0wLDAgKzEsNjUxIEBACisjIE9yaXlhIHRyYW5zbGF0aW9uIG9mIGdzdC1wbHVnaW5zLTAuOC4zLnBvdC4KKyMgQ29weXJpZ2h0IChDKSAyMDA0LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdzdC1wbHVnaW5zLTAuOC4zIHBhY2thZ2UuCisjIEdvcmEgTW9oYW50eSA8Z29yYV9tb2hhbnR5QHlhaG9vLmNvLmluPiwgMjAwNC4KKyMgJElkOiBvci5wbyx2IDEuMzAgMjAwOC0wNC0yMyAyMzoxODo0MyB0aGF5dGFuIEV4cCAkCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy0wLjguM1xuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA0LTA5LTI3IDEzOjMyKzA1MzBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEdvcmEgTW9oYW50eSA8Z29yYV9tb2hhbnR5QHlhaG9vLmNvLmluPlxuIgorIkxhbmd1YWdlLVRlYW06IE9yaXlhIDxnb3JhX21vaGFudHlAeWFob28uY28uaW4+XG4iCisiTGFuZ3VhZ2U6IG9yXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJcIiVzXCIg4Kyo4Ky/4K2f4Kyo4K2N4Kyk4K2N4Kyw4KyjIOCsr+CsqOCtjeCspOCtjeCssCDgrKzgrKjgrY3grKYg4KyV4Kyw4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiXCIlc1wiIOCsqOCsv+Ctn+CsqOCtjeCspOCtjeCssOCsoyDgrK/grKjgrY3grKTgrY3grLAg4Kys4Kyo4K2N4KymIOCsleCssOCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJcIiVzXCIg4Kyo4Ky/4K2f4Kyo4K2N4Kyk4K2N4Kyw4KyjIOCsr+CsqOCtjeCspOCtjeCssCDgrKzgrKjgrY3grKYg4KyV4Kyw4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiXCIlc1wiIOCsr+CsqOCtjeCspOCtjeCssCDgrJfgrYvgrJ/grL/grI8g4KyF4Kyo4K2B4Kyy4Ky/4Kyq4Ky/4KyV4Ky+4KywIOCsqOCtgeCsueCth+CsgS4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIuCsqOCsv+CsrOCth+CstiDgrKfgrY3grKzgrKjgrL8g4Kyo4Ky+4Ky54Ky/4KyBIOCsrOCsviDgrIXgrKzgrYjgrKcg4KyF4Kyb4Ky/LiDgrI8u4Kyt4Ky/LuCshuCshy4g4Kyn4Ky+4Kyw4Ky+IOCsreCtjeCssOCst+CtjeCsnyDgrLngrYvgrIfgrK/grL/grKwuIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIlwiJXNcIiDgrKfgrY3grKzgrKjgrL8g4Kyv4Kyo4K2N4Kyk4K2N4KywIOCssuCth+CsluCsv+CsrOCsviDgrKrgrL7grIfgrIEg4KyW4K2L4Kyy4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIlwiJXNcIiDgrKfgrY3grKzgrKjgrL8g4Kyv4Kyo4K2N4Kyk4K2N4KywIOCssuCth+CsluCsv+CsrOCsviDgrKrgrL7grIfgrIEg4KyW4K2L4Kyy4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICIiCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIuCsuOCsvy7grKHgrL8uIOCsr+CsqOCtjeCspOCtjeCssCDgrKrgrKLgrLzgrL/grKzgrL4g4Kyq4Ky+4KyH4KyBIOCsluCti+CssuCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAi4Ky44Ky/LuCsoeCsvy4g4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsquCsouCsvOCsv+CsrOCsviDgrKrgrL7grIfgrIEg4KyW4K2L4Kyy4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAi4KyG4Kyq4Kyj4KyZ4K2N4KyV4KywIOCsky7grI/grLgu4KyP4Ky4LiDgrK/grKjgrY3grKTgrY3grLDgrLAg4Kyg4Ky/4KyVIOCsreCsvuCsrOCssOCthyDgrIXgrKjgrYHgrLjgrKjgrY3grKfgrL7grKgg4KyV4Kyw4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyMsIGZ1enp5Cittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAi4Kyq4K2N4Kyw4Kym4Kyw4K2N4Ky24Ky/4KyV4Ky+IgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAi4Kyu4Ky+4KyH4KyV4K2N4Kyw4K2L4Kyr4K2L4Kyo4K2NIgorCisjLCBmdXp6eQorbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIuCssuCsvuCsh+CsqC3grIfgrKgiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIiIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICLgrKrgrY3grLDgrKzgrLPgrKTgrL4iCisKK21zZ2lkICJHYWluIgorbXNnc3RyICIiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICLgrKrgrY3grLDgrKbgrLDgrY3grLbgrL/grJXgrL4iCisKKyMsIGZ1enp5Cittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAi4Ky44K2N4Kys4Kyw4Kys4Kyw4K2N4Kym4K2N4Kyn4KyVIOCtn+CsqOCtjeCspOCtjeCssCIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIiIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiXCIlc1wiIOCsr+CsqOCtjeCspOCtjeCssOCssOCtgSDgrIXgrLjgrY3grKXgrL7grZ/grYAg4Ky44Kye4K2N4Kya4K2fIOCsuOCtjeCspeCsvuCsqCDgrIbgrKPgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiXCIlc1wiIOCsr+CsqOCtjeCspOCtjeCssOCssOCtgSDgrIXgrLjgrY3grKXgrL7grZ/grYAg4Ky44Kye4K2N4Kya4K2fIOCsuOCtjeCspeCsvuCsqCDgrIbgrKPgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsl+Cti+Csn+Csv+CsjyDgrIXgrKjgrYHgrLLgrL/grKrgrL/grJXgrL7grLAg4Kyo4K2B4Ky54K2H4KyBLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLAg4KyX4K2L4Kyf4Ky/4KyPIOCsheCsqOCtgeCssuCsv+CsquCsv+CsleCsvuCssCDgrKjgrYHgrLngrYfgrIEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiXCIlc1wiIOCsr+CsqOCtjeCspOCtjeCssCDgrJfgrYvgrJ/grL/grI8g4KyF4Kyo4K2B4Kyy4Ky/4Kyq4Ky/4KyV4Ky+4KywIOCsqOCtgeCsueCth+CsgS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLAg4KyX4K2L4Kyf4Ky/4KyPIOCsheCsqOCtgeCssuCsv+CsquCsv+CsleCsvuCssCDgrKjgrYHgrLngrYfgrIEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLDgrLDgrYEg4KyF4Ky44K2N4Kyl4Ky+4K2f4K2AIOCsuOCsnuCtjeCsmuCtnyDgrLjgrY3grKXgrL7grKgg4KyG4Kyj4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICIiCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4Kyw4Kyw4K2BIOCsquCssOCtjeCsr+CtjeCsr+CsvuCsquCtjeCspCDgrIXgrLjgrY3grKXgrL7grZ/grYAg4Ky44Kye4K2N4Kya4K2fIOCsuOCtjeCspeCsvuCsqCDgrIbgrKPgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiXCIlc1wiIOCsr+CsqOCtjeCspOCtjeCssOCssOCtgSDgrIXgrLjgrY3grKXgrL7grZ/grYAg4Ky44Kye4K2N4Kya4K2fIOCsuOCtjeCspeCsvuCsqCDgrIbgrKPgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsl+Cti+Csn+Csv+CsjyDgrIXgrKjgrYHgrLLgrL/grKrgrL/grJXgrL7grLAg4Kyo4K2B4Ky54K2H4KyBLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJcIiVzXCIg4Kyn4K2N4Kys4Kyo4Ky/IOCsr+CsqOCtjeCspOCtjeCssCDgrKzgrKjgrY3grKYg4KyV4Kyw4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiXCIlc1wiIOCsp+CtjeCsrOCsqOCsvyDgrK/grKjgrY3grKTgrY3grLAg4Kys4Kyo4K2N4KymIOCsleCssOCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiXCIlc1wiIOCsr+CsqOCtjeCspOCtjeCssOCssOCtgSDgrIXgrLjgrY3grKXgrL7grZ/grYAg4Ky44Kye4K2N4Kya4K2fIOCsuOCtjeCspeCsvuCsqCDgrIbgrKPgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4Kyw4Kyw4K2BIOCsquCssOCtjeCsr+CtjeCsr+CsvuCsquCtjeCspCDgrIXgrLjgrY3grKXgrL7grZ/grYAg4Ky44Kye4K2N4Kya4K2fIOCsuOCtjeCspeCsvuCsqCDgrIbgrKPgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4Kyw4Kyw4K2HIOCssuCth+CsluCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsquCsouCsvOCsv+CsrOCsviDgrJMg4Kyy4K2H4KyW4Ky/4Kys4Ky+IOCsquCsvuCsh+CsgSDgrJbgrYvgrLLgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsl+Cti+Csn+Csv+CsjyDgrIXgrKjgrYHgrLLgrL/grKrgrL/grJXgrL7grLAg4Kyo4K2B4Ky54K2H4KyBLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLAg4KyX4K2L4Kyf4Ky/4KyPIOCsheCsqOCtgeCssuCsv+CsquCsv+CsleCsvuCssCDgrKjgrYHgrLngrYfgrIEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiXCIlc1wiIOCsr+CsqOCtjeCspOCtjeCssCDgrJfgrYvgrJ/grL/grI8g4KyF4Kyo4K2B4Kyy4Ky/4Kyq4Ky/4KyV4Ky+4KywIOCsqOCtgeCsueCth+CsgS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsquCsouCsvOCsv+CsrOCsviDgrJMg4Kyy4K2H4KyW4Ky/4Kys4Ky+IOCsquCsvuCsh+CsgSDgrJbgrYvgrLLgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLDgrLDgrYEg4KyF4Ky44K2N4Kyl4Ky+4K2f4K2AIOCsuOCsnuCtjeCsmuCtnyDgrLjgrY3grKXgrL7grKgg4KyG4Kyj4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiXCIlc1wiIOCsr+CsqOCtjeCspOCtjeCssOCssOCtgSDgrKrgrLDgrY3grK/grY3grK/grL7grKrgrY3grKQg4KyF4Ky44K2N4Kyl4Ky+4K2f4K2AIOCsuOCsnuCtjeCsmuCtnyDgrLjgrY3grKXgrL7grKgg4KyG4Kyj4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlwiJXNcIiDgrKjgrL/grZ/grKjgrY3grKTgrY3grLDgrKMg4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsrOCsqOCtjeCspiDgrJXgrLDgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlwiJXNcIiDgrKjgrL/grZ/grKjgrY3grKTgrY3grLDgrKMg4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsrOCsqOCtjeCspiDgrJXgrLDgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4Kyw4Kyw4K2BIOCsquCssOCtjeCsr+CtjeCsr+CsvuCsquCtjeCspCDgrIXgrLjgrY3grKXgrL7grZ/grYAg4Ky44Kye4K2N4Kya4K2fIOCsuOCtjeCspeCsvuCsqCDgrIbgrKPgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiXCIlc1wiIOCsp+CtjeCsrOCsqOCsvyDgrK/grKjgrY3grKTgrY3grLAg4Kys4Kyo4K2N4KymIOCsleCssOCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICIiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBjYXB0dXJlIgorI34gbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsl+Cti+Csn+Csv+CsjyDgrIXgrKjgrYHgrLLgrL/grKrgrL/grJXgrL7grLAg4Kyo4K2B4Ky54K2H4KyBLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLDgrLDgrYEg4Kyq4Kyw4K2N4Kyv4K2N4Kyv4Ky+4Kyq4K2N4KykIOCsheCsuOCtjeCspeCsvuCtn+CtgCDgrLjgrJ7grY3grJrgrZ8g4Ky44K2N4Kyl4Ky+4KyoIOCshuCso+Csv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAi4KyF4Kyo4K2B4Kya4K2N4KyaIOCsuOCtjeCsrOCssCIKKworI34gbXNnaWQgIlRyZWJsZSIKKyN+IG1zZ3N0ciAi4KyJ4Kya4K2N4KyaIOCsuOCtjeCsrOCssCIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICLgrLjgrL/grKjgrY3grKXgrYfgrLjgrL7grIfgrJzgrLAiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIuCsquCsvy7grLjgrL8u4KyP4KyuLiIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIuCsuOCtjeCsrOCssOCsrOCssOCtjeCspuCtjeCsp+CslSDgrZ/grKjgrY3grKTgrY3grLAiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICLgrLLgrL7grIfgrKgt4KyH4KyoIgorCisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgIuCsuOCsvy7grKHgrL8uIgorCisjfiBtc2dpZCAiTWl4ZXIiCisjfiBtc2dzdHIgIuCsruCsv+CstuCtjeCssOCsoyDgrK/grKjgrY3grKTgrY3grLAiCisKKyN+IG1zZ2lkICJQQ00tMiIKKyN+IG1zZ3N0ciAi4Kyq4Ky/LuCsuOCsvy7grI/grK4uLeCtqCIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAi4KyF4Kyo4K2B4Kyy4Ky/4Kyq4Ky/4KyV4Kyw4KyjIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAi4Kyo4Ky/4Kys4K2H4Ky2LeCsrOCtg+CspuCtjeCsp+CsvyIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICLgrKjgrL/grLDgrY3grJfgrK4t4Kys4K2D4Kym4K2N4Kyn4Ky/IgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICLgrLLgrL7grIfgrKgt4K2nIgorCisjfiBtc2dpZCAiTGluZS0yIgorI34gbXNnc3RyICLgrLLgrL7grIfgrKgt4K2oIgorCisjfiBtc2dpZCAiTGluZS0zIgorI34gbXNnc3RyICLgrLLgrL7grIfgrKgt4K2pIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICLgrLjgrL7grILgrJbgrY3grK/grL/grJUt4K2nIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICLgrLjgrL7grILgrJbgrY3grK/grL/grJUt4K2oIgorCisjfiBtc2dpZCAiRGlnaXRhbC0zIgorI34gbXNnc3RyICLgrLjgrL7grILgrJbgrY3grK/grL/grJUt4K2pIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIuCsq+Cti+CsqC3grKjgrL/grKzgrYfgrLYiCisKKyN+IG1zZ2lkICJQaG9uZS1vdXQiCisjfiBtc2dzdHIgIuCsq+Cti+CsqC3grKjgrL/grLDgrY3grJfgrK4iCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAi4Kyt4Ky/4Kyh4Ky/4KyTIgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgIuCssOCth+CsoeCsv+CskyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIgorI34gbXNnc3RyICJcIiVzXCIg4Kyn4K2N4Kys4Kyo4Ky/IOCsr+CsqOCtjeCspOCtjeCssCDgrLLgrYfgrJbgrL/grKzgrL4g4Kyq4Ky+4KyH4KyBIOCsluCti+CssuCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIiIKKyN+ICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIFRoaXMgdmVyc2lvbiBvZiAiCisjfiAidGhlIE9wZW4gU291bmQgU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiXCIlc1wiIOCsp+CtjeCsrOCsqOCsvyDgrK/grKjgrY3grKTgrY3grLAg4Kyy4K2H4KyW4Ky/4Kys4Ky+IOCsquCsvuCsh+CsgSDgrJbgrYvgrLLgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJSZWFyIgorI34gbXNnc3RyICLgrIXgrKjgrYHgrLLgrL/grKrgrL/grJXgrLDgrKMiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAi4Kyt4Ky/4Kyh4Ky/4KyTIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICLgrKjgrL/grLDgrY3grJfgrK4t4Kys4K2D4Kym4K2N4Kyn4Ky/IgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgQm9vc3QiCisjfiBtc2dzdHIgIuCsruCsvuCsh+CsleCtjeCssOCti+Csq+Cti+CsqOCtjSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIuCsruCsvuCsh+CsleCtjeCssOCti+Csq+Cti+CsqOCtjSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAi4Ky44K2N4Kys4Kyw4Kys4Kyw4K2N4Kym4K2N4Kyn4KyVIOCtn+CsqOCtjeCspOCtjeCssCIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAi4Kyu4Ky+4KyH4KyV4K2N4Kyw4K2L4Kyr4K2L4Kyo4K2NIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAi4Kyu4Ky+4KyH4KyV4K2N4Kyw4K2L4Kyr4K2L4Kyo4K2NIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAi4Kyu4Ky+4KyH4KyV4K2N4Kyw4K2L4Kyr4K2L4Kyo4K2NIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICLgrLjgrL7grILgrJbgrY3grK/grL/grJUt4K2nIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgIuCsuOCsvuCsguCsluCtjeCsr+Csv+CslS3graciCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTWljcm9waG9uZSIKKyN+IG1zZ3N0ciAi4Kyu4Ky+4KyH4KyV4K2N4Kyw4K2L4Kyr4K2L4Kyo4K2NIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkNvdWxkIG5vdCBlbnF1ZXVlIGJ1ZmZlcnMgaW4gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4Kyw4Kyw4K2BIOCsheCsuOCtjeCspeCsvuCtn+CtgCDgrLjgrJ7grY3grJrgrZ8g4Ky44K2N4Kyl4Ky+4KyoIOCshuCso+Csv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkNvdWxkIG5vdCBnZXQgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiXCIlc1wiIOCsr+CsqOCtjeCspOCtjeCssOCssOCtgSDgrIXgrLjgrY3grKXgrL7grZ/grYAg4Ky44Kye4K2N4Kya4K2fIOCsuOCtjeCspeCsvuCsqCDgrIbgrKPgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJDb3VsZCBub3QgZ2V0IGVub3VnaCBidWZmZXJzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4Kyw4Kyw4K2BIOCsquCssOCtjeCsr+CtjeCsr+CsvuCsquCtjeCspCDgrIXgrLjgrY3grKXgrL7grZ/grYAg4Ky44Kye4K2N4Kya4K2fIOCsuOCtjeCspeCsvuCsqCDgrIbgrKPgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJDb3VsZCBub3QgcmVhZCBmcm9tIENELiIKKyN+IG1zZ3N0ciAiXCIlc1wiIOCsq+CsvuCsh+CssiDgrLLgrYfgrJbgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJEaXNjIGlzIG5vdCBhbiBBdWRpbyBDRC4iCisjfiBtc2dzdHIgIuCsr+CsqOCtjeCspOCtjeCssCDgrJbgrYvgrLLgrL7grK/grL7grIcg4Kyo4Ky+4Ky54Ky/4KyBLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJDb3VsZCBub3Qgc2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCisjfiBtc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLDgrLDgrYEg4KyF4Ky44K2N4Kyl4Ky+4K2f4K2AIOCsuOCsnuCtjeCsmuCtnyDgrLjgrY3grKXgrL7grKgg4KyG4Kyj4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBmaWxlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisjfiBtc2dzdHIgIlwiJXNcIiDgrKvgrL7grIfgrLIg4Kyy4K2H4KyW4Ky/4Kys4Ky+IOCsquCsvuCsh+CsgSDgrJbgrYvgrLLgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworI34gbXNnaWQgIkVycm9yIGNsb3NpbmcgZmlsZSBcIiVzXCIuIgorI34gbXNnc3RyICJcIiVzXCIg4Kyr4Ky+4KyH4KyyIOCsrOCsqOCtjeCspiDgrJXgrLDgrL/grKzgrL7grLDgrYcg4Kyk4K2N4Kyw4K2B4Kyf4Ky/LiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGZpbGUgXCIlc1wiIGZvciByZWFkaW5nLiIKKyN+IG1zZ3N0ciAiXCIlc1wiIOCsq+CsvuCsh+CssiDgrKrgrKLgrLzgrL/grKzgrL4g4Kyq4Ky+4KyH4KyBIOCsluCti+CssuCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjfiBtc2dpZCAiTm8gZmlsZW5hbWUgc3BlY2lmaWVkLiIKKyN+IG1zZ3N0ciAi4KyV4K2M4Kyj4Ky44Ky/IOCsq+CsvuCsh+CssuCsqOCsvuCsriDgrIngrLLgrY3grLLgrYfgrJbgrL/grKQg4Ky54K2L4KyHIOCsqOCsvuCsueCsv+CsgS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBjb250cm9sIGRldmljZSBcIiVzXCIgZm9yIHdyaXRpbmcuIgorI34gbXNnc3RyICJcIiVzXCIg4Kyo4Ky/4K2f4Kyo4K2N4Kyk4K2N4Kyw4KyjIOCsr+CsqOCtjeCspOCtjeCssCDgrLLgrYfgrJbgrL/grKzgrL4g4Kyq4Ky+4KyH4KyBIOCsluCti+CssuCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGNvbmZpZ3VyZSBhdWRpbyBkZXZpY2UgXCIlc1wiLiIKKyN+IG1zZ3N0ciAiXCIlc1wiIOCsp+CtjeCsrOCsqOCsvyDgrK/grKjgrY3grKTgrY3grLAg4Kys4Ky/4Kyo4K2N4Kyv4Ky+4Ky4IOCsleCssOCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IHNldCBhdWRpbyBkZXZpY2UgXCIlc1wiIHRvICVkIEh6LiIKKyN+IG1zZ3N0ciAiXCIlc1wiIOCsp+CtjeCsrOCsqOCsvyDgrK/grKjgrY3grKTgrY3grLDgrJXgrYEgJWQg4Ky54Kyw4K2N4Kyc4Kyw4K2HIOCsrOCsv+CsqOCtjeCsr+CsvuCsuCDgrJXgrLDgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIHZpZGVvIGRldmljZSBcIiVzXCIgZm9yIHdyaXRpbmcuIgorI34gbXNnc3RyICJcIiVzXCIg4Kyt4Ky/4Kyh4Ky/4KyTIOCsr+CsqOCtjeCspOCtjeCssCDgrLLgrYfgrJbgrL/grKzgrL4g4Kyq4Ky+4KyH4KyBIOCsluCti+CssuCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGNsb3NlIHZpZGVvIGRldmljZSBcIiVzXCIuIgorI34gbXNnc3RyICJcIiVzXCIg4Kyt4Ky/4Kyh4Ky/4KyTIOCsr+CsqOCtjeCspOCtjeCssCDgrKzgrKjgrY3grKYg4KyV4Kyw4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyN+IG1zZ2lkICJPU1MgZGV2aWNlIFwiJXNcIiBpcyBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIHByb2dyYW0uIgorI34gbXNnc3RyICJcIiVzXCIg4KyTLuCsj+CsuC7grI/grLguIOCsr+CsqOCtjeCspOCtjeCssCDgrKrgrYLgrLDgrY3grKzgrLDgrYEg4KyF4Kyo4K2N4KyvIOCsleCsvuCssOCsv+CsleCsviDgrKbgrY3grKzgrL7grLDgrL4g4Kys4K2N4Kyv4Kys4Ky54Ky+4KywIOCsleCssOCsvuCsr+CsvuCsieCsm+Csvy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgYWNjZXNzIGRldmljZSBcIiVzXCIsIGNoZWNrIGl0cyBwZXJtaXNzaW9ucy4iCisjfiBtc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLAg4Kys4K2N4Kyv4Kys4Ky54Ky+4KywIOCsleCssOCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEsIOCspOCsvuCsueCsvuCssCDgrIXgrKjgrYHgrK7grKTgrL8g4Kym4K2H4KyW4Kyo4K2N4Kyk4K2BLiIKKworI34gbXNnaWQgIkRldmljZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QuIgorI34gbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsheCsrOCsuOCtjeCspeCsv+CspCDgrKjgrL7grLngrL/grIEuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisjfiBtc2dzdHIgIlwiJXNcIiDgrK/grKjgrY3grKTgrY3grLAg4Kyy4K2H4KyW4Ky/4Kys4Ky+IOCsquCsvuCsh+CsgSDgrJbgrYvgrLLgrL/grLngrYfgrLLgrL4g4Kyo4Ky+4Ky54Ky/4KyBLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSBcIiVzXCIgZm9yIHJlYWRpbmcuIgorI34gbXNnc3RyICJcIiVzXCIg4Kyv4Kyo4K2N4Kyk4K2N4KywIOCsquCsouCsvOCsv+CsrOCsviDgrKrgrL7grIfgrIEg4KyW4K2L4Kyy4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiB2ZnMgZmlsZSBcIiVzXCIgZm9yIHJlYWRpbmcuIgorI34gbXNnc3RyICLgrK3grL8u4KyP4KyrLuCsj+CsuC4g4Kyr4Ky+4KyH4KyyIFwiJXNcIiDgrKrgrKLgrLzgrL/grKzgrL4g4Kyq4Ky+4KyH4KyBIOCsluCti+CssuCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk5vIGZpbGVuYW1lIGdpdmVuLiIKKyN+IG1zZ3N0ciAi4KyV4K2M4Kyj4Ky44Ky/IOCsq+CsvuCsh+CssuCsqOCsvuCsriDgrKbgrL/grIbgrK/grL7grIcg4Kyo4Ky+4Ky54Ky/4KyBIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gdmZzIGZpbGUgXCIlc1wiIGZvciB3cml0aW5nOiAlcy4iCisjfiBtc2dzdHIgIuCsreCsvy7grI/grKsu4KyP4Ky4LiDgrKvgrL7grIfgrLIgXCIlc1wiIOCssuCth+CsluCsv+CsrOCsviDgrKrgrL7grIfgrIEg4KyW4K2L4Kyy4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgTogJXMuIgorCisjfiBtc2dpZCAiTm8gZmlsZW5hbWUgZ2l2ZW4iCisjfiBtc2dzdHIgIuCsleCtjOCso+CsuOCsvyDgrKvgrL7grIfgrLLgrKjgrL7grK4g4Kym4Ky/4KyG4Kyv4Ky+4KyHIOCsqOCsvuCsueCsv+CsgSIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBjbG9zZSB2ZnMgZmlsZSBcIiVzXCIuIgorI34gbXNnc3RyICLgrK3grL8u4KyP4KyrLuCsj+CsuC4g4Kyr4Ky+4KyH4KyyIFwiJXNcIiDgrKzgrKjgrY3grKYg4KyV4Kyw4Ky/4Ky54K2H4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiWW91ciBPU1MgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBtb25vIG9yIHN0ZXJlby4iCisjfiBtc2dzdHIgIuCshuCsquCso+CsmeCtjeCsleCssCDgrJMu4KyP4Ky4LuCsj+CsuC4g4Kyv4Kyo4K2N4Kyk4K2N4Kyw4KywIOCsoOCsv+CslSDgrK3grL7grKzgrLDgrYcg4KyF4Kyo4K2B4Ky44Kyo4K2N4Kyn4Ky+4KyoIOCsleCssOCsv+CsueCth+CssuCsviDgrKjgrL7grLngrL/grIEuIgorCisjfiBtc2dpZCAiTm8gZGV2aWNlIHNwZWNpZmllZC4iCisjfiBtc2dzdHIgIuCsleCtjOCso+CsuOCsvyDgrK/grKjgrY3grKTgrY3grLAg4KyJ4Kyy4K2N4Kyy4K2H4KyW4Ky/4KykIOCsleCssOCsvuCsr+CsvuCshyDgrKjgrL7grLngrL/grIEuIgorCisjfiBtc2dpZCAiRGV2aWNlIGlzIG9wZW4uIgorI34gbXNnc3RyICLgrK/grKjgrY3grKTgrY3grLAg4KyW4K2L4Kyy4Ky+4Kyv4Ky+4KyH4Kya4K2N4Kyb4Ky/LiIKKworI34gbXNnaWQgIiIKKyN+ICJUaGUgJXMgZWxlbWVudCBjb3VsZCBub3QgYmUgZm91bmQuIFRoaXMgZWxlbWVudCBpcyBlc3NlbnRpYWwgZm9yICIKKyN+ICJwbGF5YmFjay4gUGxlYXNlIGluc3RhbGwgdGhlIHJpZ2h0IHBsdWctaW4gYW5kIHZlcmlmeSB0aGF0IGl0IHdvcmtzIGJ5ICIKKyN+ICJydW5uaW5nICdnc3QtaW5zcGVjdCAlcyciCisjfiBtc2dzdHIgIiIKKyN+ICIlcyDgrIngrKrgrL7grKbgrL7grKgg4Kyu4Ky/4Kyz4Ky/4Kyy4Ky+IOCsqOCsvuCsueCsv+CsgS4g4Kyq4K2B4Kyo4KyD4Kyq4K2N4Kyw4Kym4Kyw4K2N4Ky24KyoIOCsquCsvuCsh+CsgSDgrI/grLngrL8g4KyJ4Kyq4Ky+4Kym4Ky+4Kyo4Kyf4Ky/IOCshuCsrOCstuCtjeCsr+CslS4g4Kym4K2f4Ky+IOCsleCssOCsvyDgrLjgrKDgrL/grJUg4Kyq4K2N4Kyy4KyX4K2N4KyH4Kyo4K2NICIKKyN+ICLgrLjgrY3grKXgrL7grKrgrL/grKQg4KyV4Kyw4Kyo4K2N4Kyk4K2BLCDgrJMgJ2dzdC1pbnNwZWN0ICVzJyDgrJrgrLPgrL7grIcg4Kyv4Ky+4Kye4K2N4KyaIOCsleCssOCsqOCtjeCspOCtgSDgrJXgrL8g4KyP4Ky54Ky+IOCsleCsvuCssOCtjeCsr+CtjeCsr+CsleCsvuCssOCtgCDgrIXgrJvgrL8iCisKKyN+IG1zZ2lkICIiCisjfiAiTm8gdXNhYmxlIGNvbG9yc3BhY2UgZWxlbWVudCBjb3VsZCBiZSBmb3VuZC5cbiIKKyN+ICJQbGVhc2UgaW5zdGFsbCBvbmUgYW5kIHJlc3RhcnQuIgorI34gbXNnc3RyICIiCisjfiAi4KyV4K2M4Kyj4Ky44Ky/IOCsrOCtjeCsr+CsrOCsueCsvuCssOCsr+Cti+Csl+CtjeCsryDgrLDgrJngrY3grJfgrJXgrY3grLfgrYfgrKTgrY3grLAg4KyJ4Kyq4Ky+4Kym4Ky+4KyoIOCsruCsv+Css+Csv+CssuCsviDgrKjgrL7grLngrL/grIEuXG4iCisjfiAi4Kym4K2f4Ky+IOCsleCssOCsvyDgrJfgrYvgrJ/grL/grI8g4KyJ4Kyq4Ky+4Kym4Ky+4KyoIOCsuOCtjeCspeCsvuCsquCsv+CspCDgrJXgrLDgrL8g4Kyq4K2B4Kyo4KyD4Kyq4K2N4Kyw4Ky+4Kyw4Kyu4K2N4KytIOCsleCssOCsqOCtjeCspOCtgS4iCmRpZmYgLS1naXQgYS9wby9wbC5wbyBiL3BvL3BsLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NTJkODEKLS0tIC9kZXYvbnVsbAorKysgYi9wby9wbC5wbwpAQCAtMCwwICsxLDQzMCBAQAorIyBQb2xpc2ggdHJhbnNsYXRpb24gZm9yIGdzdC1wbHVnaW5zLWdvb2QuCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBnc3QtcGx1Z2lucy1nb29kIHBhY2thZ2UuCisjIEpha3ViIEJvZ3VzeiA8cWJvb3NoQHBsZC1saW51eC5vcmc+LCAyMDA3LTIwMTYuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDEuNy4yXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTYtMDItMjAgMjE6NDMrMDEwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogSmFrdWIgQm9ndXN6IDxxYm9vc2hAcGxkLWxpbnV4Lm9yZz5cbiIKKyJMYW5ndWFnZS1UZWFtOiBQb2xpc2ggPHRyYW5zbGF0aW9uLXRlYW0tcGxAbGlzdHMuc291cmNlZm9yZ2UubmV0PlxuIgorIkxhbmd1YWdlOiBwbFxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICJOaWUgem5hbGV6aW9ubyBzZXJ3ZXJhIEphY2siCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSB6ZGVrb2Rvd2HEhyBvYnJhenUgSlBFRyIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiJyVzJyBhdXRvcnN0d2EgJyVzJyIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiTmllIHVkYcWCbyBzacSZIHBvxYLEhWN6ecSHIHogc2Vyd2VyZW0iCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiTmllIHVzdGF3aW9ubyBVUkwtYS4iCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSByb3p3acSFemHEhyBuYXp3eSBzZXJ3ZXJhLiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgbmF3acSFemHEhyBwb8WCxIVjemVuaWEgeiBzZXJ3ZXJlbS4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICJVc3Rhbm93aWVuaWUgYmV6cGllY3puZWdvIHBvxYLEhWN6ZW5pYSBuaWUgcG93aW9kxYJvIHNpxJkuIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiV3lzdMSFcGnFgiBixYLEhWQgc2llY2lvd3kgbHViIHNlcndlciBuaWVvY3pla2l3YW5pZSB6YW1rbsSFxYIgcG/FgsSFY3plbmllLiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiU2Vyd2VyIHByenlzxYJhxYIgYsWCxJlkbmUgZGFuZS4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiU2Vyd2VyIG5pZSBvYnPFgnVndWplIHByemV3aWphbmlhLiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiQnJhayBsdWIgbmllcG9wcmF3bmUgd2VqxZtjaWUgZMW6d2nEmWt1LCBzdHJ1bWllxYQgQVZJIGLEmWR6aWUgdXN6a29kem9ueS4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIlRlbiBwbGlrIG5pZSB6YXdpZXJhIHN0cnVtaWVuaSBuYWRhasSFY3ljaCBzacSZIGRvIG9kdHdvcnplbmlhLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiVGVuIHBsaWsgamVzdCBixYLEmWRueSBpIG5pZSBtb8W8ZSBiecSHIG9kdHdvcnpvbnkuIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKyJOaWUgbW/FvG5hIG9kdHdhcnphxIcgc3RydW1pZW5pYSwgcG9uaWV3YcW8IGplc3QgemFzenlmcm93YW55IERSTS1lbSBQbGF5UmVhZHkuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJUZW4gcGxpayBqZXN0IHVzemtvZHpvbnkgaSBuaWUgbW/FvGUgYnnEhyBvZHR3b3J6b255LiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiQsWCxJlkbnkgcm96bWlhciBhdG9tdS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIlRlbiBwbGlrIGplc3Qgbmlla29tcGxldG55IGkgbmllIG1vxbxlIGJ5xIcgb2R0d29yem9ueS4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIk9icmF6IHcgdHltIHBsaWt1IG1vxbxlIG5pZSBiecSHIG9kdHdhcnphbnkgcHJhd2lkxYJvd28uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIlRlbiBwbGlrIHphd2llcmEgemJ5dCBkdcW8byBzdHJ1bWllbmkuIE9kdHdhcnphbmllIHR5bGtvICVkIHBpZXJ3c3p5Y2giCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIk5pZSB6bmFsZXppb25vIG9ic8WCdWdpd2FuZWdvIHN0cnVtaWVuaWEuIEJ5xIcgbW/FvGUgdHJ6ZWJhIHphaW5zdGFsb3dhxIcgIgorInd0eWN6a8SZIHJvenN6ZXJ6ZW5pYSBHU3RyZWFtZXJhIFJUU1AgZGxhIHN0cnVtaWVuaSBSZWFsIG1lZGlhLiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorIk5pZSB6bmFsZXppb25vIG9ic8WCdWdpd2FuZWdvIHN0cnVtaWVuaWEuIEJ5xIcgbW/FvGUgdHJ6ZWJhIHplendvbGnEhyBuYSB3acSZY2VqICIKKyJwcm90b2tvxYLDs3cgdHJhbnNwb3J0dSwgYWxibyBtb8W8ZSBicmFrb3dhxIcgd8WCYcWbY2l3ZWogd3R5Y3praSByb3pzemVyemVuaWEgIgorIlJUU1AgR1N0cmVhbWVyYS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiTmllIHVkYcWCbyBzacSZIG90d29yennEhyB1cnrEhWR6ZW5pYSBkxbp3acSZa293ZWdvIGRvIG9kdHdhcnphbmlhLiBVcnrEhWR6ZW5pZSAiCisiamVzdCB1xbx5d2FuZSBwcnpleiBpbm7EhSBhcGxpa2FjasSZLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiTmllIHVkYcWCbyBzacSZIG90d29yennEhyB1cnrEhWR6ZW5pYSBkxbp3acSZa293ZWdvIGRvIG9kdHdhcnphbmlhLiBCcmFrIHVwcmF3bmllxYQgIgorImRvIG90d2FyY2lhIHVyesSFZHplbmlhLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgb3R3b3J6ecSHIHVyesSFZHplbmlhIGTFundpxJlrb3dlZ28gZG8gb2R0d2FyemFuaWEuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIk5pZSB1ZGHFgm8gc2nEmSBvdHdvcnp5xIcgdXJ6xIVkemVuaWEgZMW6d2nEmWtvd2VnbyBkbyBvZHR3YXJ6YW5pYS4gVGEgd2Vyc2phIE9wZW4gIgorIlNvdW5kIFN5c3RlbSBuaWUgamVzdCBvYnPFgnVnaXdhbmEgcHJ6ZXogdGVuIGVsZW1lbnQuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIk9kdHdhcnphbmllIG5pZSBqZXN0IG9ic8WCdWdpd2FuZSBwcnpleiB0byB1cnrEhWR6ZW5pZSBkxbp3acSZa293ZS4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIkLFgsSFZCBvZHR3YXJ6YW5pYSBkxbp3acSZa3UuIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJOYWdyeXdhbmllIG5pZSBqZXN0IG9ic8WCdWdpd2FuZSBwcnpleiB0byB1cnrEhWR6ZW5pZSBkxbp3acSZa293ZS4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJCxYLEhWQgbmFncnl3YW5pYSB6IHVyesSFZHplbmlhIGTFundpxJlrb3dlZ28uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiTmllIHVkYcWCbyBzacSZIG90d29yennEhyB1cnrEhWR6ZW5pYSBkxbp3acSZa293ZWdvIGRvIG5hZ3J5d2FuaWEuIEJyYWsgdXByYXduaWXFhCAiCisiZG8gb3R3YXJjaWEgdXJ6xIVkemVuaWEuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgb3R3b3J6ecSHIHVyesSFZHplbmlhIGTFundpxJlrb3dlZ28gZG8gbmFncnl3YW5pYS4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiTmllIHpuYWxlemlvbm8gdXJ6xIVkemVuaWEgQ29yZUF1ZGlvIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgb3R3b3J6ecSHIHVyesSFZHplbmlhIENvcmVBdWRpbyIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIsW5csOzZMWCbyBuYWdyeXdhbmlhIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWlrcm9mb24iCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJXZWrFm2NpZSBsaW5paSIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICJXZXduxJl0cnpueSBDRCIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJXZWrFm2NpZSBTUERJRiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJXZWrFm2NpZSBBVVggMSIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJXZWrFm2NpZSBBVVggMiIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJQxJl0bGEgendyb3RuYSBrb2Rla2EiCisKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIlDEmXRsYSB6d3JvdG5hIFN1blZUUyIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiR8WCb8Wbbm/Fm8SHIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiV3ptb2NuaWVuaWUiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJNb25pdG9yIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiV2J1ZG93YW55IGfFgm/Fm25pY3playIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiU8WCdWNoYXdraSIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICJXeWrFm2NpZSBsaW5paSIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiV3lqxZtjaWUgU1BESUYiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIld5asWbY2llIEFVWCAxIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICJXeWrFm2NpZSBBVVggMiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICJCxYLEhWQgb2Rjenl0dSAlZCBiYWp0w7N3IHogdXJ6xIVkemVuaWEgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKyJOaWUgdWRhxYJvIHNpxJkgd3lsaWN6ecSHIGRvc3TEmXBueWNoIGZvcm1hdMOzdyBvYnJhenUsIHoga3TDs3J5bWkgbW/FvGUgZHppYcWCYcSHICIKKyJ1cnrEhWR6ZW5pZSAnJXMnIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgb2R3em9yb3dhxIcgYnVmb3LDs3cgeiB1cnrEhWR6ZW5pYSAnJXMnIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICJTdGVyb3duaWsgdXJ6xIVkemVuaWEgJyVzJyBuaWUgb2JzxYJ1Z3VqZSBtZXRvZHkgd2Uvd3kgJWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICJTdGVyb3duaWsgdXJ6xIVkemVuaWEgJyVzJyBuaWUgb2JzxYJ1Z3VqZSDFvGFkbmVqIHpuYW5laiBtZXRvZHkgd2Uvd3kuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIlVyesSFZHplbmllICclcycgamVzdCB6YWrEmXRlIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJVcnrEhWR6ZW5pZSAnJXMnIG5pZSBwb3RyYWZpIHByemVjaHd5dHl3YcSHIG9icmF6dSAlZHglZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiVXJ6xIVkemVuaWUgJyVzJyBuaWUgcG90cmFmaSBwcnplY2h3eXR5d2HEhyBvYnJhenUgdyBwb2RhbnltIGZvcm1hY2llIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIlVyesSFZHplbmllICclcycgb2JzxYJ1Z3VqZSBuaWVjacSFZ8WCZSBwb3dpZXJ6Y2huaWUiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgdXp5c2thxIcgcGFyYW1ldHLDs3cgdXJ6xIVkemVuaWEgJyVzJyIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiIgorIlVyesSFZHplbmllIG9icmF6dSBuaWUgcHJ6eWrEmcWCbyBub3dlZ28gdXN0YXdpZW5pYSBjesSZc3RvdGxpd2/Fm2NpIGtsYXRlay4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIgorbXNnc3RyICJVcnrEhWR6ZW5pZSBvYnJhenUgbmllIHByemVrYXphxYJvIGZvcm1hdHUgd3lqxZtjaW93ZWdvLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICJVcnrEhWR6ZW5pZSBvYnJhenUgendyw7NjacWCbyBixYLEmWRuZSB3eW1pYXJ5LiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICJVcnrEmWR6ZW5pZSBvYnJhenUgd3lrb3J6eXN0dWplIG5pZSBvYnPFgnVnaXdhbnkgc3Bvc8OzYiBwcnplcGxvdHUuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIlVyesSFZHplbmllIG9icmF6dSB3eWtvcnp5c3R1amUgbmllIG9ic8WCdWdpd2FueSBmb3JtYXQgcGlrc2VsYS4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiTmllIHVkYcWCbyBzacSZIHNrb25maWd1cm93YcSHIHdld27EmXRyem5laiBwdWxpIGJ1Zm9yw7N3LiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiVXJ6xJlkemVuaWUgb2JyYXp1IG5pZSB6YXN1Z2Vyb3dhxYJvIMW8YWRuZWdvIHJvem1pYXJ1IGJ1Zm9yYS4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICJCcmFrIG9kZG9sbmVqIHB1bGkgZG8gemFpbXBvcnRvd2FuaWEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgdXp5c2thxIcgdXN0YXdpZcWEIHR1bmVyYSAlZCB1cnrEhWR6ZW5pYSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJCxYLEhWQgcG9kY3phcyBwb2JpZXJhbmlhIG1vxbxsaXdvxZtjaSB1esSFZHplbmlhICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiVXJ6xIVkemVuaWUgJyVzJyBuaWUgamVzdCB0dW5lcmVtLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSB1enlza2HEhyB3ZWrFm2NpYSByYWRpb3dlZ28geiB1cnrEhWR6ZW5pYSAnJXMnLiAiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgdXN0YXdpxIcgd2VqxZtjaWEgJWQgdXJ6xIVkemVuaWEgJXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgem1pZW5pxIcgc3RhbnUgd3ljaXN6ZW5pYSBkbGEgdXJ6xIVkemVuaWEgJyVzJy4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSBwcnp5ZHppZWxpxIcgd3ltYWdhbmVqIHBhbWnEmWNpLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgcHJ6eWR6aWVsacSHIHd5bWFnYW5laiBwYW1pxJljaS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiS29ud2VydGVyIHVyesSFZHplbmlhICVzIG5pZSBtYSBvYnPFgnVnaXdhbmVnbyBmb3JtYXR1IHdlasWbY2lvd2VnbyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiS29ud2VydGVyIHVyesSFZHplbmlhICVzIG5pZSBtYSBvYnPFgnVnaXdhbmVnbyBmb3JtYXR1IHd5asWbY2lvd2VnbyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiS29kZXIgdXJ6xIVkemVuaWEgJXMgbmllIG1hIG9ic8WCdWdpd2FuZWdvIGZvcm1hdHUgd2VqxZtjaW93ZWdvIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiS29kZXIgdXJ6xIVkemVuaWEgJXMgbmllIG1hIG9ic8WCdWdpd2FuZWdvIGZvcm1hdHUgd3lqxZtjaW93ZWdvIgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSB1cnVjaG9tacSHIHfEhXRrdSBkZWtvZHVqxIVjZWdvLiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiTmllIHVkYcWCbyBzacSZIHByemV0d29yennEhyByYW1raS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisiQsWCxIVkIHBvYmllcmFuaWEgbW/FvGxpd2/Fm2NpIHVyesSFZHplbmlhICclcyc6IHRvIG5pZSBqZXN0IHN0ZXJvd25payB2NGwyLiAiCisiUHJvc3rEmSBzcHJhd2R6acSHIGN6eSB0byBzdGVyb3duaWsgdjRsMS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgb2RweXRhxIcgbyBhdHJ5YnV0eSB3ZWrFm2NpYSAlZCB1cnrEhWR6ZW5pYSAlcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOaWUgdWRhxYJvIHNpxJkgdXp5c2thxIcgdXN0YXdpZcWEIHR1bmVyYSAlZCB1cnrEhWR6ZW5pYSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSBvZHB5dGHEhyBub3JtYWxpemFjamkgdXJ6xIVkemVuaWEgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSB1enlza2HEhyBhdHJ5YnV0w7N3IHN0ZXJ1asSFY3ljaCB1cnrEhWR6ZW5pYSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJOaWUgbW/FvG5hIHppZGVudHlmaWtvd2HEhyB1cnrEhWR6ZW5pYSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJUbyBuaWUgamVzdCB1cnrEhWR6ZW5pZSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSBvdHdvcnp5xIcgdXJ6xIVkemVuaWEgJyVzJyBkbyBvZGN6eXR1IGkgemFwaXN1LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iCittc2dzdHIgIlVyesSFZHplbmllICclcycgbmllIGplc3QgdXJ6xIVkemVuaWVtIHByemVjaHd5dHVqxIVjeW0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJVcnrEhWR6ZW5pZSAnJXMnIG5pZSBqZXN0IHVyesSFZHplbmllbSB3eWrFm2Npb3d5bS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIlVyesSFZHplbmllICclcycgbmllIGplc3QgdXJ6xIVkemVuaWVtIE0yTS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSB3eWtvbmHEhyBkdXAgdXJ6xIVkemVuaWEgJyVzJyBkbyBvZGN6eXR1IGkgemFwaXN1LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmllIHVkYcWCbyBzacSZIHVzdGF3acSHIG5vcm1hbGl6YWNqaSBkbGEgdXJ6xIVkemVuaWEgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiTmllIHVkYcWCbyBzacSZIHV6eXNrYcSHIGFrdHVhbG5laiBjesSZc3RvdGxpd2/Fm2NpIHR1bmVyYSBkbGEgdXJ6xIVkemVuaWEgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorIk5pZSB1ZGHFgm8gc2nEmSB1c3Rhd2nEhyBha3R1YWxuZWogY3rEmXN0b3RsaXdvxZtjaSB0dW5lcmEgZGxhIHVyesSFZHplbmlhICclcycgbmEgIgorIiVsdSBIei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmllIHVkYcWCbyBzacSZIHV6eXNrYcSHIHNpxYJ5IHN5Z25hxYJ1IGRsYSB1cnrEhWR6ZW5pYSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmllIHVkYcWCbyBzacSZIHV6eXNrYcSHIHdhcnRvxZtjaSBzdGVydWrEhWNlaiAlZCB1cnrEhWR6ZW5pYSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmllIHVkYcWCbyBzacSZIHVzdGF3acSHICVkIGpha28gd2FydG/Fm2NpIHN0ZXJ1asSFY2VqICVkIHVyesSFZHplbmlhICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiTmllIHVkYcWCbyBzacSZIHV6eXNrYcSHIGFrdHVhbG5lZ28gd2VqxZtjaWEgdXJ6xIVkemVuaWEgJyVzJy4gTW/FvGUgdG8gcmFkaW8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIk5pZSB1ZGHFgm8gc2nEmSB1enlza2HEhyBha3R1YWxuZWdvIHd5asWbY2lhIHVyesSFZHplbmlhICclcycuIE1vxbxlIHRvIHJhZGlvIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIk5pZSB1ZGHFgm8gc2nEmSB1c3Rhd2nEhyB3eWrFm2NpYSAlZCB1cnrEhWR6ZW5pYSAlcy4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICJabWlhbmEgcm96ZHppZWxjem/Fm2NpIHcgY3phc2llIGR6aWHFgmFuaWEgbmllIGplc3QgamVzemN6ZSBvYnPFgnVnaXdhbmEuIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJOaWUgbW/FvG5hIHByYWNvd2HEhyBiZXogemVnYXJhIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICJCxYLEhWQgd2V3bsSZdHJ6bnkgc3RydW1pZW5pYSBkYW55Y2guIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAiQsWCxIVkIHdld27EmXRyem55IHByemVwxYJ5d3UgZGFueWNoLiIKZGlmZiAtLWdpdCBhL3BvL3B0X0JSLnBvIGIvcG8vcHRfQlIucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBhNWNkNwotLS0gL2Rldi9udWxsCisrKyBiL3BvL3B0X0JSLnBvCkBAIC0wLDAgKzEsODAxIEBACisjIEJyYXppbGlhbiBQb3J0dWd1ZXNlIHRyYW5zbGF0aW9uIG9mIGdzdC1wbHVnaW5zLWdvb2QuCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBnc3QtcGx1Z2lucy1nb29kIHBhY2thZ2UuCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDE2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBGYWJyw61jaW8gR29kb3kgPHNrYXJsbG90QGdtYWlsLmNvbT4sIDIwMDgtMjAxNi4KKyMKKyMgZGF0YSBmbG93IC0+IGZsdXhvIGRlIGRhZG9zCisjIHN0cmVhbWluZyAtPiBmbHV4byBjb250w61udW8KKyMgY2xvY2sgLT4gdGVtcG9yaXphZG9yCisjIHBsYW5lIChvdmVybGF5IHBsYW5lKSAtPiBwbGFubyBkZSBzb2JyZXBvc2nDp8OjbworIyBwb29sIC0+IGNvbGXDp8OjbywgY29uanVudG8sIGFncnVwYW1lbnRvCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kLTEuNy4yXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTYtMDUtMDYgMTc6NDktMDMwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogRmFicsOtY2lvIEdvZG95IDxza2FybGxvdEBnbWFpbC5jb20+XG4iCisiTGFuZ3VhZ2UtVGVhbTogQnJhemlsaWFuIFBvcnR1Z3Vlc2UgPGxkcGJyLXRyYW5zbGF0aW9uQGxpc3RzLnNvdXJjZWZvcmdlLiIKKyJuZXQ+XG4iCisiTGFuZ3VhZ2U6IHB0X0JSXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0yOyBwbHVyYWw9KG4gPiAxKTtcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiU2Vydmlkb3IgSmFjayBuw6NvIGVuY29udHJhZG8iCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIkZhbGhhIGFvIGRlY29kaWZpY2FyIGEgaW1hZ2VtIEpQRUciCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIlwiJXNcIiBwb3IgXCIlc1wiIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJOw6NvIGZvaSBwb3Nzw612ZWwgY29uZWN0YXIgYW8gc2Vydmlkb3IiCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiTmVuaHVtIFVSTCBkZWZpbmlkby4iCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIk7Do28gZm9pIHBvc3PDrXZlbCByZXNvbHZlciBvIG5vbWUgZG8gc2Vydmlkb3IuIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIk7Do28gZm9pIHBvc3PDrXZlbCBlc3RhYmVsZWNlciB1bWEgY29uZXjDo28gY29tIHNlcnZpZG9yLiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIkNvbmZpZ3VyYcOnw6NvIGRlIGNvbmV4w6NvIHNlZ3VyYSBmYWxob3UuIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorIlVtIGVycm8gZGUgcmVkZSBvY29ycmV1LCBvdSBvIHNlcnZpZG9yIGZlY2hvdSBhIGNvbmV4w6NvIGluZXNwZXJhZGFtZW50ZS4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIk8gc2Vydmlkb3IgZW52aW91IGRhZG9zIHJ1aW5zLiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICJOw6JvIGjDoSBzdXBvcnRlIGEgYnVzY2EgcGVsbyBzZXJ2aWRvci4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIkVudHJhZGEgZGUgw6F1ZGlvIG51bGEgb3UgaW52w6FsaWRhLCBvIGZsdXhvIEFWSSBwb2RlIGVzdGFyIGNvcnJvbXBpZG8uIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJFc3RlIGFycXVpdm8gbsOjbyBjb250w6ptIGZsdXhvcyByZXByb2R1esOtdmVpcy4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkVzdGUgYXJxdWl2byDDqSBpbnbDoWxpZG8gZSBuw6NvIHDDtGRlIHNlciByZXByb2R1emlkby4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiIgorIk7Do28gZm9pIHBvc3PDrXZlbCByZXByb2R1emlyIG8gZmx1eG8gcG9yIGVzdGFyIGNyaXB0b2dyYWZhZG8gY29tIFBsYXlSZWFkeSAiCisiRFJNLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRXN0ZSBhcnF1aXZvIGVzdMOhIGNvcnJvbXBpZG8gZSBuw6NvIHDDtGRlIHNlciByZXByb2R1emlkby4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIlRhbWFuaG8gZGUgQXRvbSBpbnbDoWxpZG8uIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJFc3RlIGFycXVpdm8gZXN0w6EgaW5jb21wbGV0byBlIG7Do28gcMO0ZGUgc2VyIHJlcHJvZHV6aWRvLiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiTyB2w61kZW8gbmVzdGUgYXJxdWl2byBwb2RlIG7Do28gc2VyIHJlcHJvZHV6aWRvIGNvcnJldGFtZW50ZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiRXN0ZSBhcnF1aXZvIGNvbnTDqm0gbXVpdG9zIGZsdXhvcy4gQXBlbmFzIHJlcHJvZHV6aW5kbyBvIHByaW1laXJvICVkIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJOZW5odW0gZmx1eG8gY29tIHN1cG9ydGUgZm9pIGxvY2FsaXphZG8uIFZvY8OqIHBvZGUgcHJlY2lzYXIgaW5zdGFsYXIgdW0gcGx1Zy0iCisiaW4gZGUgZXh0ZW5zw6NvIEdTdHJlYW1lciBSVFNQIHBhcmEgZmx1eG9zIFJlYWwgbWVkaWEuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiTmVuaHVtIGZsdXhvIGNvbSBzdXBvcnRlIGZvaSBsb2NhbGl6YWRvLiBUYWx2ZXogaGFqYSBuZWNlc3NpZGFkZSBkZSBxdWUgbWFpcyAiCisicHJvdG9jb2xvcyBkZSB0cmFuc3BvcnRlIHNlamFtIHBlcm1pdGlkb3Mgb3Ugc2Vuw6NvIG8gcGx1Zy1pbiBkZSBleHRlbnPDo28gIgorIkdTdHJlYW1lciBSVFNQIHBvZGUgZXN0YXIgaW5jb3JyZXRvLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyJOw6NvIGZvaSBwb3Nzw612ZWwgYWJyaXIgbyBkaXNwb3NpdGl2byBkZSDDoXVkaW8gcGFyYSByZXByb2R1w6fDo28uIE8gZGlzcG9zaXRpdm8gIgorImVzdMOhIHNlbmRvIHVzYWRvIHBvciBvdXRybyBhcGxpY2F0aXZvLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiTsOjbyBmb2kgcG9zc8OtdmVsIGFicmlyIG8gZGlzcG9zaXRpdm8gZGUgw6F1ZGlvIHBhcmEgcmVwcm9kdcOnw6NvLiBWb2PDqiBuw6NvIHRlbSAiCisicGVybWlzc8OjbyBwYXJhIGFicmlyIG8gZGlzcG9zaXRpdm8uIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIk7Do28gZm9pIHBvc3PDrXZlbCBhYnJpciBvIGRpc3Bvc2l0aXZvIGRlIMOhdWRpbyBwYXJhIHJlcHJvZHXDp8Ojby4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiTsOjbyBmb2kgcG9zc8OtdmVsIGFicmlyIG8gZGlzcG9zaXRpdm8gZGUgw6F1ZGlvIHBhcmEgcmVwcm9kdcOnw6NvLiBOw6NvIGjDoSAiCisic3Vwb3J0ZSBhIGVzdGUgZWxlbWVudG8gbmVzdGEgdmVyc8OjbyBkbyBTaXN0ZW1hIEFiZXJ0byBkZSBTb20gKE9TUykuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIk7Do28gaMOhIHN1cG9ydGUgYSByZXByb2R1w6fDo28gcG9yIGVzdGUgZGlzcG9zaXRpdm8gZGUgw6F1ZGlvLiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiRXJybyBkZSByZXByb2R1w6fDo28gZGUgw6F1ZGlvLiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiTsOjbyBow6Egc3Vwb3J0ZSBhIGdyYXZhw6fDo28gcG9yIGVzdGUgZGlzcG9zaXRpdm8gZGUgw6F1ZGlvLiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkVycm8gYW8gZ3JhdmFyIGRvIGRpc3Bvc2l0aXZvIGRlIMOhdWRpby4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJOw6NvIGZvaSBwb3Nzw612ZWwgYWJyaXIgbyBkaXNwb3NpdGl2byBkZSDDoXVkaW8gcGFyYSBncmF2YcOnw6NvLiBWb2PDqiBuw6NvIHRlbSAiCisicGVybWlzc8OjbyBwYXJhIGFicmlyIG8gZGlzcG9zaXRpdm8uIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICJOw6NvIGZvaSBwb3Nzw612ZWwgYWJyaXIgbyBkaXNwb3NpdGl2byBkZSDDoXVkaW8gcGFyYSBncmF2YcOnw6NvLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICJEaXNwb3NpdGl2byBDb3JlQXVkaW8gbsOjbyBlbmNvbnRyYWRvIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICJEaXNwb3NpdGl2byBDb3JlQXVkaW8gbsOjbyBww7RkZSBzZXIgYWJlcnRvIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAiT3JpZ2VtIGRlIGdyYXZhw6fDo28iCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWNyb2ZvbmUiCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICJFbnRyYWRhIGRlIGxpbmhhIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIkNEIGludGVybm8iCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiRW50cmFkYSBTUERJRiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJFbnRyYWRhIGF1eC4gMSIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJFbnRyYWRhIGF1eC4gMiIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJDT0RFQyBMb29wYmFjayIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiU3VuVlRTIExvb3BiYWNrIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJWb2x1bWUiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJHYW5obyIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIk1vbml0b3JhZG9yIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiQWx0by1mYWxhbnRlIGludGVybm8iCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIkZvbmUgZGUgb3V2aWRvIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIlNhw61kYSBkZSBsaW5oYSIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiU2HDrWRhIFNQRElGIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICJTYcOtZGEgYXV4LiAxIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICJTYcOtZGEgYXV4LiAyIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkVycm8gYW8gbGVyICVkIGJ5dGVzIGRvIGRpc3Bvc2l0aXZvIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKyJGYWxoYSBhbyByZWxhY2lvbmFyIG9zIGZvcm1hdG9zIGRlIHbDrWRlbyBxdWUgbyBkaXNwb3NpdGl2byBcIiVzXCIgb2ZlcmVjZSAiCisic3Vwb3J0ZSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTsOjbyBmb2kgcG9zc8OtdmVsIG1hcGVhciBidWZmZXJzIGRvIGRpc3Bvc2l0aXZvIFwiJXNcIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiTyBkcml2ZXIgZG8gZGlzcG9zaXRpdm8gXCIlc1wiIG7Do28gdGVtIHN1cG9ydGUgYW8gbcOpdG9kbyAlZCBkZSBFL1MiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICIiCisiTyBkcml2ZXIgZG8gZGlzcG9zaXRpdm8gXCIlc1wiIG7Do28gdGVtIHN1cG9ydGUgYSBuZW5odW0gbcOpdG9kbyBjb25oZWNpZG8gZGUgIgorIkUvUy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byBcIiVzXCIgZXN0w6Egb2N1cGFkbyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byBcIiVzXCIgbsOjbyByZWFsaXphIGNhcHR1cmEgYSAlZHglZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byBcIiVzXCIgbsOjbyByZWFsaXphIGNhcHR1cmEgbm8gZm9ybWF0byBlc3BlY2lmaWNhZG8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiIgorIk8gZGlzcG9zaXRpdm8gXCIlc1wiIG7Do28gdGVtIHN1cG9ydGUgYSBwbGFub3MgZGUgc29icmVwb3Npw6fDo28gbsOjby1jb250w61udW9zIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTsOjbyBmb2kgcG9zc8OtdmVsIG9idGVyIG9zIHBhcsOibWV0cm9zIG5vIGRpc3Bvc2l0aXZvIFwiJXNcIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byBkZSB2w61kZW8gbsOjbyBhY2VpdGEgZGVmaW5pciB1bWEgbm92YSB0YXhhIGRlIHF1YWRyb3MuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byBkZSB2w61kZW8gbsOjbyBmb3JuZWNldSB1bSBmb3JtYXRvIGRlIHNhw61kYS4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byBkZSB2w61kZW8gcmV0b3Jub3UgZGltZW5zw7VlcyBpbnbDoWxpZGFzLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICIiCisiT3MgZGlzcG9zaXRpdm9zIGRlIHbDrWRlbyB1dGlsaXphbSB1bSBtw6l0b2RvIGRlIGVudHJlbGHDp2FtZW50byBuw6NvIHN1cG9ydGFkby4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiT3MgZGlzcG9zaXRpdm9zIGRlIHbDrWRlbyB1dGlsaXphbSB1bSBmb3JtYXRvIHBhcmEgcGl4ZWwgbsOjbyBzdXBvcnRhZG8uIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIkZhbGhhIGFvIGNvbmZpZ3VyYXIgdW1hIGNvbGXDp8OjbyBkZSBidWZmZXIgaW50ZXJuby4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIk8gZGlzcG9zaXRpdm8gZGUgdsOtZGVvIG7Do28gc3VnZXJpdSBuZW5odW0gdGFtYW5obyBkZSBidWZmZXIuIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiTmVuaHVtYSBjb2xlw6fDo28gZGUgZmx1eG8gZGUgcmVjZWJpbWVudG8gcGFyYSBpbXBvcnRhci4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZhbGhhIGFvIG9idGVyIGNvbmZpZ3VyYcOnw7VlcyBkbyBzaW50b25pemFkb3IgJWQgbm8gZGlzcG9zaXRpdm8gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJFcnJvIGFvIG9idGVyIGZ1bmNpb25hbGlkYWRlcyBkbyBkaXNwb3NpdGl2byBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byBcIiVzXCIgbsOjbyDDqSB1bSBzaW50b25pemFkb3IuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiRmFsaGEgYW8gb2J0ZXIgYSBlbnRyYWRhIGRlIHLDoWRpbyBkbyBkaXNwb3NpdGl2byBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiRmFsaGEgYW8gZGVmaW5pciBhIGVudHJhZGEgJWQgbm8gZGlzcG9zaXRpdm8gJXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJGYWxoYSBhbyBhbHRlcm5hciBlbnRyZSBjb20gZSBzZW0gw6F1ZGlvIHBhcmEgbyBkaXNwb3NpdGl2byBcIiVzXCIuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJGYWxoYSBhbyBhbG9jYXIgYSBtZW3Ds3JpYSBuZWNlc3PDoXJpYS4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiRmFsaGEgYW8gYWxvY2FyIGEgbWVtw7NyaWEgbmVjZXNzw6FyaWEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJPIGNvbnZlcnNvciBubyBkaXNwb3NpdGl2byAlcyBuw6NvIHRlbSB1bSBmb3JtYXRvIGRlIGVudHJhZGEgY29tIHN1cG9ydGUiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIk8gY29udmVyc29yIG5vIGRpc3Bvc2l0aXZvICVzIG7Do28gdGVtIHVtIGZvcm1hdG8gZGUgc2HDrWRhIGNvbSBzdXBvcnRlIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisiTyBjb2RpZmljYWRvciBubyBkaXNwb3NpdGl2byAlcyBuw6NvIHRlbSB1bSBmb3JtYXRvIGRlIGVudHJhZGEgY29tIHN1cG9ydGUiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisiTyBjb2RpZmljYWRvciBubyBkaXNwb3NpdGl2byAlcyBuw6NvIHRlbSB1bSBmb3JtYXRvIGRlIHNhw61kYSBjb20gc3Vwb3J0ZSIKKworbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICJGYWxoYSBhbyBpbmljaWFyIG8gc2VnbWVudG8gZGUgZGVjb2RpZmljYcOnw6NvLiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiRmFsaGEgYW8gcHJvY2Vzc2FyIHF1YWRyby4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisiRXJybyBhbyBvYnRlciByZWN1cnNvcyBkbyBkaXNwb3NpdGl2byBcIiVzXCI6IEVsZSBuw6NvIMOpIHVtIGRyaXZlciB2NGwyLiAiCisiVmVyaWZpcXVlIHNlIGVsZSDDqSB1bSBkcml2ZXIgdjRsMS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICJGYWxoYSBhbyBleGFtaW5hciBvcyBhdHJpYnV0b3MgZGEgZW50cmFkYSAlZCBubyBkaXNwb3NpdGl2byAlcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJGYWxoYSBhbyBvYnRlciBjb25maWd1cmHDp8O1ZXMgZG8gc2ludG9uaXphZG9yICVkIG5vIGRpc3Bvc2l0aXZvIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICJGYWxoYSBhbyBleGFtaW5hciBhcyBub3JtYXMgbm8gZGlzcG9zaXRpdm8gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRmFsaGEgYW8gb2J0ZXIgYXRyaWJ1dG9zIGRlIGNvbnRyb2xlIG5vIGRpc3Bvc2l0aXZvIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTyBkaXNwb3NpdGl2byBcIiVzXCIgbsOjbyBww7RkZSBzZXIgaWRlbnRpZmljYWRvLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJcIiVzXCIgbsOjbyDDqSB1bSBkaXNwb3NpdGl2by4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJOw6NvIGZvaSBwb3Nzw612ZWwgYWJyaXIgbyBkaXNwb3NpdGl2byBcIiVzXCIgcGFyYSBsZWl0dXJhIGUgZ3JhdmHDp8Ojby4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJPIGRpc3Bvc2l0aXZvIFwiJXNcIiBuw6NvIMOpIHVtIGRpc3Bvc2l0aXZvIGRlIGNhcHR1cmEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJPIGRpc3Bvc2l0aXZvIFwiJXNcIiBuw6NvIMOpIHVtIGRpc3Bvc2l0aXZvIGRlIHNhw61kYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIk8gZGlzcG9zaXRpdm8gXCIlc1wiIG7Do28gw6kgdW0gZGlzcG9zaXRpdm8gTTJNLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiIgorIk7Do28gZm9pIHBvc3PDrXZlbCBkdXBsaWNhciBvIGRpc3Bvc2l0aXZvIFwiJXNcIiBwYXJhIGxlaXR1cmEgZSBncmF2YcOnw6NvLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRmFsaGEgYW8gZGVmaW5pciBhcyBub3JtYXMgcGFyYSBvIGRpc3Bvc2l0aXZvIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJGYWxoYSBhbyBvYnRlciBhIGZyZXHDvMOqbmNpYSBkbyBzaW50b25pemFkb3IgcGFyYSBvIGRpc3Bvc2l0aXZvIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorIkZhbGhhIGFvIGRlZmluaXIgYSBmcmVxw7zDqm5jaWEgZG8gc2ludG9uaXphZG9yIHBhcmEgbyBkaXNwb3NpdGl2byBcIiVzXCIgw6AgIgorIiVsdSBIei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRmFsaGEgYW8gb2J0ZXIgYSBmb3LDp2EgZG8gc2luYWwgcGFyYSBvIGRpc3Bvc2l0aXZvIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZhbGhhIGFvIG9idGVyIG8gdmFsb3IgcGFyYSBvIGNvbnRyb2xlICVkIG5vIGRpc3Bvc2l0aXZvIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZhbGhhIGFvIGRlZmluaXIgbyB2YWxvciAlZCBwYXJhIG8gY29udHJvbGUgJWQgbm8gZGlzcG9zaXRpdm8gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIkZhbGhhIGFvIG9idGVyIGEgZW50cmFkYSBhdHVhbCBubyBkaXNwb3NpdGl2byBcIiVzXCIuIFRhbHZleiBzZWphIHVtICIKKyJkaXNwb3NpdGl2byBkZSByw6FkaW8iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIkZhbGhhIGFvIG9idGVyIGEgc2HDrWRhIGF0dWFsIG5vIGRpc3Bvc2l0aXZvIFwiJXNcIi4gVGFsdmV6IHNlamEgdW0gIgorImRpc3Bvc2l0aXZvIGRlIHLDoWRpbyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJGYWxoYSBhbyBkZWZpbmlyIGEgc2HDrWRhICVkIG5vIGRpc3Bvc2l0aXZvICVzLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIkFpbmRhIG7Do28gaMOhIHN1cG9ydGUgYSBtdWRhbsOnYSBkZSByZXNvbHXDp8OjbyBlbnF1YW50byBlc3TDoSBleGVjdXRhbmRvLiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiTsOjbyDDqSBwb3Nzw612ZWwgb3BlcmFyIHNlbSB1bSB0ZW1wb3JpemFkb3IiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIkVycm8gaW50ZXJubyBubyBmbHV4byBkZSBkYWRvcy4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJFcnJvIGludGVybm8gbm8gZmx1eG8gZGUgZGFkb3MuIgorCisjfiBtc2dpZCAiRGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBjYXB0dXJlIgorI34gbXNnc3RyICJPIGRpc3Bvc2l0aXZvIFwiJXNcIiBuw6NvIHRlbSBzdXBvcnRlIGEgY2FwdHVyYSBkZSB2w61kZW8iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc291bmQgc2VydmVyIgorI34gbXNnc3RyICJOw6NvIGZvaSBwb3Nzw612ZWwgZXN0YWJlbGVjZXIgdW1hIGNvbmV4w6NvIGNvbSBzZXJ2aWRvciBkZSBzb20iCisKKyN+IG1zZ2lkICJGYWlsZWQgdG8gcXVlcnkgc291bmQgc2VydmVyIGNhcGFiaWxpdGllcyIKKyN+IG1zZ3N0ciAiRmFsaGEgYW8gZXhhbWluYXIgb3MgcmVjdXJzb3MgZG8gc2Vydmlkb3IgZGUgc29tIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAiR3JhdmUiCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgIkFndWRvIgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIlNpbnRldGl6YWRvciIKKworI34gbXNnaWQgIlBDTSIKKyN+IG1zZ3N0ciAiUENNIgorCisjfiBtc2dpZCAiU3BlYWtlciIKKyN+IG1zZ3N0ciAiQWx0by1mYWxhbnRlIgorCisjfiBtc2dpZCAiTGluZS1pbiIKKyN+IG1zZ3N0ciAiRW50cmFkYSBkZSBsaW5oYSIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJNaXhlciIKKworI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICJQQ00tMiIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAiR3JhdmHDp8OjbyIKKworI34gbXNnaWQgIkluLWdhaW4iCisjfiBtc2dzdHIgIkdhbmhvIGRlIGVudHJhZGEiCisKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAiR2FuaG8gZGUgc2HDrWRhIgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICJMaW5oYSAxIgorCisjfiBtc2dpZCAiTGluZS0yIgorI34gbXNnc3RyICJMaW5oYSAyIgorCisjfiBtc2dpZCAiTGluZS0zIgorI34gbXNnc3RyICJMaW5oYSAzIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICJEaWdpdGFsIDEiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgIkRpZ2l0YWwgMiIKKworI34gbXNnaWQgIkRpZ2l0YWwtMyIKKyN+IG1zZ3N0ciAiRGlnaXRhbCAzIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIkVudHJhZGEgZGUgZm9uZSIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAiU2HDrWRhIGRlIGZvbmUiCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAiVsOtZGVvIgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgIlLDoWRpbyIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIiIKKyN+ICJOw6NvIGZvaSBwb3Nzw612ZWwgYWJyaXIgbyBkaXNwb3NpdGl2byBkZSDDoXVkaW8gcGFyYSBtYW5pcHVsYcOnw6NvIGRvICIKKyN+ICJjb250cm9sYWRvciBkbyBtaXhlci4iCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJOw6NvIGZvaSBwb3Nzw612ZWwgYWJyaXIgbyBkaXNwb3NpdGl2byBkZSDDoXVkaW8gcGFyYSBtYW5pcHVsYcOnw6NvIGRvICIKKyN+ICJjb250cm9sYWRvciBkbyBtaXhlci4gTsOjbyBow6Egc3Vwb3J0ZSBhIGVzdGUgZWxlbWVudG8gY29tIGVzdGEgdmVyc8OjbyBkbyAiCisjfiAiU2lzdGVtYSBBYmVydG8gZGUgU29tIChPU1MpLiIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAiUHJpbmNpcGFsIgorCisjfiBtc2dpZCAiRnJvbnQiCisjfiBtc2dzdHIgIkZyb250YWwiCisKKyN+IG1zZ2lkICJSZWFyIgorI34gbXNnc3RyICJUcmFzZWlyYSIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIkZvbmVzIGRlIG91dmlkbyIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAiQ2VudHJhbCIKKworI34gbXNnaWQgIkxGRSIKKyN+IG1zZ3N0ciAiTEZFIgorCisjfiBtc2dpZCAiU3Vycm91bmQiCisjfiBtc2dzdHIgIlN1cnJvdW5kIgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAiTGF0ZXJhbCIKKworI34gbXNnaWQgIkFVWCBPdXQiCisjfiBtc2dzdHIgIlNhw61kYSBhdXguIgorCisjfiBtc2dpZCAiM0QgRGVwdGgiCisjfiBtc2dzdHIgIlByb2Z1bmRpZGFkZSAzRCIKKworI34gbXNnaWQgIjNEIENlbnRlciIKKyN+IG1zZ3N0ciAiM0QgY2VudHJhbCIKKworI34gbXNnaWQgIjNEIEVuaGFuY2UiCisjfiBtc2dzdHIgIlJlYWxjZSAzRCIKKworI34gbXNnaWQgIlRlbGVwaG9uZSIKKyN+IG1zZ3N0ciAiVGVsZWZvbmUiCisKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAiRW50cmFkYSBkZSB2w61kZW8iCisKKyN+IG1zZ2lkICJBVVggSW4iCisjfiBtc2dzdHIgIkVudHJhZGEgYXV4LiIKKworI34gbXNnaWQgIlJlY29yZCBHYWluIgorI34gbXNnc3RyICJHYW5obyBkZSBncmF2YcOnw6NvIgorCisjfiBtc2dpZCAiT3V0cHV0IEdhaW4iCisjfiBtc2dzdHIgIkdhbmhvIGRlIHNhw61kYSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgQm9vc3QiCisjfiBtc2dzdHIgIkF1bWVudG8gZG8gbWljcm9mb25lIgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAiRGlhZ27Ds3N0aWNvIgorCisjfiBtc2dpZCAiQmFzcyBCb29zdCIKKyN+IG1zZ3N0ciAiQXVtZW50byBkZSBncmF2ZXMiCisKKyN+IG1zZ2lkICJQbGF5YmFjayBQb3J0cyIKKyN+IG1zZ3N0ciAiUG9ydGFzIGRlIHJlcHJvZHXDp8OjbyIKKworI34gbXNnaWQgIklucHV0IgorI34gbXNnc3RyICJFbnRyYWRhIgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIk9yaWdlbSBkZSBtb25pdG9yYcOnw6NvIgorCisjfiBtc2dpZCAiS2V5Ym9hcmQgQmVlcCIKKyN+IG1zZ3N0ciAiQmlwIGRvIHRlY2xhZG8iCisKKyN+IG1zZ2lkICJTaW11bGF0ZSBTdGVyZW8iCisjfiBtc2dzdHIgIlNpbXVsYXIgZXN0w6lyZW8iCisKKyN+IG1zZ2lkICJTdGVyZW8iCisjfiBtc2dzdHIgIkVzdMOpcmVvIgorCisjfiBtc2dpZCAiU3Vycm91bmQgU291bmQiCisjfiBtc2dzdHIgIlNvbSBzdXJyb3VuZCIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgR2FpbiIKKyN+IG1zZ3N0ciAiR2FuaG8gZG8gbWljcm9mb25lIgorCisjfiBtc2dpZCAiU3BlYWtlciBTb3VyY2UiCisjfiBtc2dzdHIgIk9yaWdlbSBkbyBhbHRvLWZhbGFudGUiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiT3JpZ2VtIGRvIG1pY3JvZm9uZSIKKworI34gbXNnaWQgIkphY2siCisjfiBtc2dzdHIgIkphY2siCisKKyN+IG1zZ2lkICJDZW50ZXIgLyBMRkUiCisjfiBtc2dzdHIgIkNlbnRyYWwvTEZFIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAiTWl4YWdlbSBlc3TDqXJlbyIKKworI34gbXNnaWQgIk1vbm8gTWl4IgorI34gbXNnc3RyICJNaXhhZ2VtIG1vbm8iCisKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgIk1peGFnZW0gZGUgZW50cmFkYSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAiTWljcm9mb25lIDEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDIiCisjfiBtc2dzdHIgIk1pY3JvZm9uZSAyIgorCisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIlNhw61kYSBkaWdpdGFsIgorCisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAiRW50cmFkYSBkaWdpdGFsIgorCisjfiBtc2dpZCAiSERNSSIKKyN+IG1zZ3N0ciAiSERNSSIKKworI34gbXNnaWQgIk1vZGVtIgorI34gbXNnc3RyICJNb2RlbSIKKworI34gbXNnaWQgIkhhbmRzZXQiCisjfiBtc2dzdHIgIk1vbm9mb25lIgorCisjfiBtc2dpZCAiT3RoZXIiCisjfiBtc2dzdHIgIk91dHJvIgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAiTmVuaHVtIgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgIkxpZ2FkbyIKKworI34gbXNnaWQgIk9mZiIKKyN+IG1zZ3N0ciAiRGVzbGlnYWRvIgorCisjfiBtc2dpZCAiTXV0ZSIKKyN+IG1zZ3N0ciAiTXVkbyIKKworI34gbXNnaWQgIkZhc3QiCisjfiBtc2dzdHIgIlLDoXBpZG8iCisKKyN+IG1zZ2lkICJWZXJ5IExvdyIKKyN+IG1zZ3N0ciAiTXVpdG8gYmFpeGEiCisKKyN+IG1zZ2lkICJMb3ciCisjfiBtc2dzdHIgIkJhaXhhIgorCisjfiBtc2dpZCAiTWVkaXVtIgorI34gbXNnc3RyICJNw6lkaWEiCisKKyN+IG1zZ2lkICJIaWdoIgorI34gbXNnc3RyICJBbHRhIgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICJNdWl0byBhbHRhIgorCisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAiUHJvZHXDp8OjbyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIk1pY3JvZm9uZSBkbyBwYWluZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgSW4iCisjfiBtc2dzdHIgIkVudHJhZGEgZGUgbGluaGEgZG8gcGFpbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICJGb25lcyBkZSBvdXZpZG8gZG8gcGFpbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIE91dCIKKyN+IG1zZ3N0ciAiU2HDrWRhIGRlIGxpbmhhIGRvIHBhaW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciB2ZXJkZSIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciByb3NhIgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIGF6dWwiCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIGJyYW5jbyIKKworI34gbXNnaWQgIkJsYWNrIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgcHJldG8iCisKKyN+IG1zZ2lkICJHcmF5IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgY2luemEiCisKKyN+IG1zZ2lkICJPcmFuZ2UgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBsYXJhbmphIgorCisjfiBtc2dpZCAiUmVkIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgdmVybWVsaG8iCisKKyN+IG1zZ2lkICJZZWxsb3cgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBhbWFyZWxvIgorCisjfiBtc2dpZCAiR3JlZW4gRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciB2ZXJkZSBkbyBwYWluZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciByb3NhIGRvIHBhaW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIGF6dWwgZG8gcGFpbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJXaGl0ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIGJyYW5jbyBkbyBwYWluZWwgZnJvbnRhbCIKKworI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgcHJldG8gZG8gcGFpbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJHcmF5IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgY2luemEgZG8gcGFpbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBsYXJhbmphIGRvIHBhaW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgdmVybWVsaG8gZG8gcGFpbmVsIGZyb250YWwiCisKKyN+IG1zZ2lkICJZZWxsb3cgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBhbWFyZWxvIGRvIHBhaW5lbCBmcm9udGFsIgorCisjfiBtc2dpZCAiU3ByZWFkIE91dHB1dCIKKyN+IG1zZ3N0ciAiU2HDrWRhIGNvbXVtIgorCisjfiBtc2dpZCAiRG93bm1peCIKKyN+IG1zZ3N0ciAiTWVzY2xhciBjYW5haXMiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIElucHV0IgorI34gbXNnc3RyICJFbnRyYWRhIGRvIG1peGVyIHZpcnR1YWwiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKKyN+IG1zZ3N0ciAiU2HDrWRhIGRvIG1peGVyIHZpcnR1YWwiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICJDYW5haXMgZG8gbWl4ZXIgdmlydHVhbCIKKworI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyAlZCIKKworI34gbXNnaWQgIiVzIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyIKKworI34gbXNnaWQgIkdvdCB1bmV4cGVjdGVkIGZyYW1lIHNpemUgb2YgJXUgaW5zdGVhZCBvZiAldS4iCisjfiBtc2dzdHIgIkZvaSBvYnRpZG8gdW0gdGFtYW5obyBkZSBxdWFkcm8gaW5lc3BlcmFkbyBkZSAldSwgYW8gaW52w6lzIGRlICV1LiIKKworI34gbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgb24gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJFcnJvIGFvIGxlciAlZCBieXRlcyBubyBkaXNwb3NpdGl2byBcIiVzXCIuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIk7Do28gcG9zc8OtdmVsIGFkaWNpb25hciBidWZmZXJzIMOgIGZpbGEgbm8gZGlzcG9zaXRpdm8gXCIlc1wiLiIKKworI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiRmFsaGEgYW8gdGVudGFyIG9idGVyIG9zIHF1YWRyb3MgZGUgdsOtZGVvIGRvIGRpc3Bvc2l0aXZvIFwiJXNcIi4iCisKKyN+IG1zZ2lkICJGYWlsZWQgYWZ0ZXIgJWQgdHJpZXMuIGRldmljZSAlcy4gc3lzdGVtIGVycm9yOiAlcyIKKyN+IG1zZ3N0ciAiRmFsaGEgYXDDs3MgJWQgdGVudGF0aXZhcy4gRGlzcG9zaXRpdm8gJXMuIEVycm8gZG8gc2lzdGVtYTogJXMiCmRpZmYgLS1naXQgYS9wby9yby5wbyBiL3BvL3JvLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Y2Y3ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9wby9yby5wbwpAQCAtMCwwICsxLDgxMSBAQAorIyBSb21hbmlhbiB0cmFuc2xhdGlvbiBmb3IgZ3N0LXBsdWdpbnMtZ29vZAorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIyBMdWNpYW4gQWRyaWFuIEdyaWppbmN1IDxsdWNpYW4uZ3JpamluY3VAZ21haWwuY29tPiwgMjAxMC4KK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QgMC4xMC4yMy4yXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTAtMDgtMTYgMDM6MjIrMDMwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogTHVjaWFuIEFkcmlhbiBHcmlqaW5jdSA8bHVjaWFuLmdyaWppbmN1QGdtYWlsLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBSb21hbmlhbiA8dHJhbnNsYXRpb24tdGVhbS1yb0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+XG4iCisiTGFuZ3VhZ2U6IHJvXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0zOyBwbHVyYWw9KG49PTEgPyAwIDogKG49PTAgfHwgKG4lMTAwID4gMCAmJiBuJTEwMCA8ICIKKyIyMCkpID8gMSA6IDIpOztcbiIKKyJYLUdlbmVyYXRvcjogVmlydGFhbCAwLjYuMVxuIgorIlgtTGF1bmNocGFkLUV4cG9ydC1EYXRlOiAyMDEwLTA4LTE2IDAwOjA4KzAwMDBcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICJOdSBzLWEgcHV0dXQgZGVjb2RhIGltYWdpbmVhIEpQRUciCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIuKAniVz4oCdIGRlIOKAniVz4oCdIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJOdSBzZSBwb2F0ZSBzdGFiaWxpIG8gY29uZXhpdW5lIGxhIHNlcnZlciIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IHJlc29sdmUgc2VydmVyIG5hbWUuIgorbXNnc3RyICJOdSBzZSBwb2F0ZSBzdGFiaWxpIG8gY29uZXhpdW5lIGxhIHNlcnZlciIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAiTnUgc2UgcG9hdGUgc3RhYmlsaSBvIGNvbmV4aXVuZSBsYSBzZXJ2ZXJ1bCBkZSBzdW5ldCIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiIgorIkludHJhcmVhIGF1ZGlvIG51IGV4aXN0xIMgc2F1IGVzdGUgbmV2YWxpZMSDLCBmbHV4dWwgZGUgZGF0ZSBBVkkgdmEgZmkgY29ydXB0LiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAiQWNlc3QgZmnImWllciBudSBjb27Im2luZSBmbHV4dXJpIGNlIHBvdCBmaSByZWRhdGUuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJGaciZaWVydWwgbnUgZXN0ZSB2YWxpZCDImWkgbnUgcG9hdGUgZmkgcmVkYXQuIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiQWNlc3QgZmnImWllciBlc3RlIGNvcnVwdCDImWkgbnUgcG9hdGUgZmkgcmVkYXQuIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkFjZXN0IGZpyJlpZXIgbnUgZXN0ZSBjb21wbGV0IMiZaSBudSBwb2F0ZSBmaSByZWRhdC4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIkVzdGUgcG9zaWJpbCBjYSBmaciZaWVydWwgdmlkZW8gc8SDIG51IGZpZSByZWRhdCBjb3JlY3QuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIkZpyJlpZXJ1bCBjb27Im2luZSBwcmVhIG11bHRlIGZsdXh1cmkuIFNlIHJlZGF1IGRvYXIgcHJpbWVsZSAlZCIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisiTnUgcy1hIGfEg3NpdCBuaWNpIHVuIGZsdXggc3Vwb3J0YXQuIFBlbnRydSBmbHV4dXJpIFJlYWwgbWVkaWEgcy1hciBwdXRlYSBzxIMgIgorImZpZSBuZXZvaWUgc8SDIGluc3RhbGHIm2kgZXh0ZW5zaWEgR1N0cmVhbWVyIFJUU1AuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiTnUgYSBmb3N0IGfEg3NpdCBuaWNpdW4gZmx1eCBzdXBvcnRhdC4gUy1hciBwdXRlYSBzxIMgbmVjZXNpdGUgcGVybWl0ZXJlYSBtYWkgIgorIm11bHRvciBwcm90b2NvYWxlIGRlIHRyYW5zcG9ydCBzYXUgZGUgYWx0ZmVsIHMtYXIgcHV0ZWEgc8SDIGxpcHNlYXNjxIMgbW9kdWx1bCAiCisiY29yZWN0IGRlIGV4dGVuc2llIEdTdHJlYW1lciBSVFNQLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyJOdSBzLWEgcHV0dXQgZGVzY2hpZGUgZGlzcG96aXRpdnVsIGF1ZGlvIHBlbnRydSByZWRhcmUuIERpc3Bveml0aXZ1bCBlc3RlICIKKyJmb2xvc2l0IGRlIG8gYWx0xIMgYXBsaWNhyJtpZS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIk51IHMtYSBwdXR1dCBkZXNjaGlkZSBkaXNwb3ppdGl2dWwgYXVkaW8gcGVudHJ1IHJlZGFyZS4gTnUgYXZlyJtpIHBlcm1pc2l1bmVhICIKKyJkZSBhIGRlc2NoaWRlIGRpc3Bveml0aXZ1bC4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiTnUgcy1hIHB1dHV0IGRlc2NoaWRlIGRpc3Bveml0aXZ1bCBhdWRpbyBwZW50cnUgcmVkYXJlLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyJOdSBzLWEgcHV0dXQgZGVzY2hpZGUgZGlzcG96aXRpdnVsIGF1ZGlvIHBlbnRydSByZWRhcmUuIFZlcnNpdW5lYSBhY2Vhc3RhIGEgIgorIk9TUyAoT3BlbiBTb3VuZCBTeXN0ZW0pIG51IGVzdGUgc3Vwb3J0YXTEgyBkZSBhY2VzdCBlbGVtZW50LiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJSZWRhcmVhIG51IGVzdGUgc3Vwb3J0YXTEgyBkZSBhY2VzdCBkaXNwb3ppdGl2IGF1ZGlvLiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiRXJvYXJlIHJlZGFyZSBhdWRpby4iCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIsOObnJlZ2lzdHJhcmVhIG51IGVzdGUgc3Vwb3J0YXTEgyBkZSBhY2VzdCBkaXNwb3ppdGl2IGF1ZGlvLiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkVyb2FyZSBsYSDDrm5yZWdpc3RyYXJlYSBkZSBsYSBkaXNwb3ppdGl2dWwgYXVkaW8uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiTnUgcy1hIHB1dHV0IGRlc2NoaWRlIGRpc3Bveml0aXZ1bCBhdWRpbyBwZW50cnUgw65ucmVnaXN0cmFyZSBOdSBhdmXIm2kgIgorInBlcm1pc2l1bmVhIGRlIGEgZGVzY2hpZGUgZGlzcG96aXRpdnVsLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiTnUgcy1hIHB1dHV0IGRlc2NoaWRlIGRpc3Bveml0aXZ1bCBhdWRpbyBwZW50cnUgw65ucmVnaXN0cmFyZS4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICIiCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICJTdXJzxIMgw65ucmVnaXN0cmFyZSIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pY3JvZm9uIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiTGluaWUgaW50cmFyZSIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICJDRCBpbnRlcm4iCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiSW50cmFyZSBTUERJRiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJJbnRyYXJlIEFVWCAxIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIkludHJhcmUgQVVYIDIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIkJ1Y2zEgyIKKworIywgZnV6enkKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIkJ1Y2zEgyIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiVm9sdW0iCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJBbXBsaWZpY2FyZSIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIk1vbml0b3IiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJCb3hlIGludGVncmF0ZSIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiQ8SDyJl0aSIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICJMaW5pZSBpZciZaXJlIgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJJZciZaXJlIFNQRElGIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICJJZciZaXJlIEFVWCAxIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICJJZciZaXJlIEFVWCAyIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkVyb2FyZSBjaXRpcmUgJWQgb2N0ZcibaSBkZSBsYSBkaXNwb3ppdGl2dWwg4oCeJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIk51IHMtYSBwdXR1dCBtYXBhIG1lbW9yaWEgdGFtcG9uIGRpbiBkaXNwb3ppdGl2dWwg4oCeJXPigJ0iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICIiCisiRHJpdmVydWwgcGVudHJ1IGRpc3Bveml0aXZ1bCDigJ4lc+KAnSBudSBzdXBvcnQgbmljaSBvIG1ldG9kxIMgZGUgY2FwdHVyxIMgIgorImN1bm9zY3V0xIMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIiIKKyJEcml2ZXJ1bCBwZW50cnUgZGlzcG96aXRpdnVsIOKAniVz4oCdIG51IHN1cG9ydCBuaWNpIG8gbWV0b2TEgyBkZSBjYXB0dXLEgyAiCisiY3Vub3NjdXTEgy4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIkRpc3Bveml0aXZ1bCDigJ4lc+KAnSBudSBlc3RlIHVuIGRpc3Bveml0aXYgZGUgaWXImWlyZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJEaXNwb3ppdGl2dWwg4oCeJXPigJ0gbnUgZXN0ZSB1biBkaXNwb3ppdGl2IGRlIGNhcHR1csSDLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIkRpc3Bveml0aXZ1bCDigJ4lc+KAnSBudSBlc3RlIHVuIGRpc3Bveml0aXYgZGUgY2FwdHVyxIMuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICJEaXNwb3ppdGl2dWwg4oCeJXPigJ0gbnUgZXN0ZSB1biBkaXNwb3ppdGl2IGRlIGllyJlpcmUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTnUgcy1hdSBwdXR1dCBvYsibaW5lIHBhcmFtZXRyaWkgcGVudHJ1IGRpc3Bveml0aXZ1bCDigJ4lc+KAnSIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIiIKKyJEaXNwb3ppdGl2dWwgZGUgaW50cmFyZSB2aWRlbyBudSBhIGFjY2VwdGF0IG5vdWEgY29uZmlndXJhcmUgZGUgcmF0ZSBjYWRyZS4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiIgorIkRpc3Bveml0aXZ1bCBkZSBpbnRyYXJlIHZpZGVvIG51IGEgYWNjZXB0YXQgbm91YSBjb25maWd1cmFyZSBkZSByYXRlIGNhZHJlLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiIgorIkRyaXZlcnVsIHBlbnRydSBkaXNwb3ppdGl2dWwg4oCeJXPigJ0gbnUgc3Vwb3J0IG5pY2kgbyBtZXRvZMSDIGRlIGNhcHR1csSDICIKKyJjdW5vc2N1dMSDLiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICIiCisiRHJpdmVydWwgcGVudHJ1IGRpc3Bveml0aXZ1bCDigJ4lc+KAnSBudSBzdXBvcnQgbmljaSBvIG1ldG9kxIMgZGUgY2FwdHVyxIMgIgorImN1bm9zY3V0xIMuIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIiIKKyJEaXNwb3ppdGl2dWwgZGUgaW50cmFyZSB2aWRlbyBudSBhIGFjY2VwdGF0IG5vdWEgY29uZmlndXJhcmUgZGUgcmF0ZSBjYWRyZS4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiQSBlyJl1YXQgb2LIm2luZXJlYSBjb25maWd1csSDcmlpIHJlY2VwdG9ydWx1aSAlZCBwZW50cnUgZGlzcG96aXRpdnVsIOKAniVz4oCdLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRXJvYXJlIGNpdGlyZSAlZCBvY3RlyJtpIGRlIGxhIGRpc3Bveml0aXZ1bCDigJ4lc+KAnS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiRGlzcG96aXRpdnVsIOKAniVz4oCdIG51IGVzdGUgdW4gZGlzcG96aXRpdiBkZSBpZciZaXJlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICJEZWZpbmlyZWEgdmFsb3JpaSAlZCBwZW50cnUgZGlzcG96aXRpdnVsIOKAniVz4oCdIGEgZciZdWF0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkRlZmluaXJlYSB2YWxvcmlpICVkIHBlbnRydSBkaXNwb3ppdGl2dWwg4oCeJXPigJ0gYSBlyJl1YXQuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiT2LIm2luZXJlYSBuaXZlbHVsdWkgc2VtbmFsdWx1aSBwZW50cnUgZGlzcG96aXRpdnVsIOKAniVz4oCdIGEgZciZdWF0LiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorIkRyaXZlcnVsIHBlbnRydSBkaXNwb3ppdGl2dWwg4oCeJXPigJ0gbnUgc3Vwb3J0IG5pY2kgbyBtZXRvZMSDIGRlIGNhcHR1csSDICIKKyJjdW5vc2N1dMSDLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJEaXNwb3ppdGl2dWwgZGUgaW50cmFyZSB2aWRlbyBudSBhIGFjY2VwdGF0IG5vdWEgY29uZmlndXJhcmUgZGUgcmF0ZSBjYWRyZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisiRGlzcG96aXRpdnVsIGRlIGludHJhcmUgdmlkZW8gbnUgYSBhY2NlcHRhdCBub3VhIGNvbmZpZ3VyYXJlIGRlIHJhdGUgY2FkcmUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyJEaXNwb3ppdGl2dWwgZGUgaW50cmFyZSB2aWRlbyBudSBhIGFjY2VwdGF0IG5vdWEgY29uZmlndXJhcmUgZGUgcmF0ZSBjYWRyZS4iCisKKyMsIGZ1enp5Cittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIk51IHMtYSBwdXR1dCBkZWNvZGEgaW1hZ2luZWEgSlBFRyIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorIkVyb2FyZSBsYSBvYsibaW5lcmVhIGNhcGFiaWxpdMSDyJtpbG9yIHBlbnRydSBkaXNwb3ppdGl2dWwg4oCeJXPigJ06IE51IGVzdGUgdW4gIgorImRyaXZlciB2NGwyLiBWZXJpZmljYcibaSBkYWPEgyBlc3RlIHVuIGRyaXZlciB2NGwxLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIkludGVyb2dhcmVhIGF0cmlidXRlbG9yIGRlIGludHJhcmUgJWQgcGVudHJ1IGRpc3Bveml0aXZ1bCAlcyBhIGXImXVhdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiQSBlyJl1YXQgb2LIm2luZXJlYSBjb25maWd1csSDcmlpIHJlY2VwdG9ydWx1aSAlZCBwZW50cnUgZGlzcG96aXRpdnVsIOKAniVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkludGVyb2dhcmVhIG5vcm1laSBwZW50cnUgZGlzcG96aXRpdnVsIOKAniVz4oCdIGEgZciZdWF0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiT2LIm2luZXJlYSBhdHJpYnV0ZWxvciBkZSBjb250cm9sIHBlbnRydSBkaXNwb3ppdGl2dWwg4oCeJXPigJ0gYSBlyJl1YXQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkRpc3Bveml0aXZ1bCDigJ4lc+KAnSBudSBwb2F0ZSBmaSBpZGVudGlmaWNhdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQWNlc3RhIG51IGVzdGUgdW4gZGlzcG96aXRpdiDigJ4lc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJOdSBzZSBwb2F0ZSBkZXNjaGlkZSBkaXNwb3ppdGl2dWwg4oCeJXPigJ0gcGVudHJ1IGNpdGlyZSDImWkgc2NyaWVyZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJEaXNwb3ppdGl2dWwg4oCeJXPigJ0gbnUgZXN0ZSB1biBkaXNwb3ppdGl2IGRlIGNhcHR1csSDLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiRGlzcG96aXRpdnVsIOKAniVz4oCdIG51IGVzdGUgdW4gZGlzcG96aXRpdiBkZSBpZciZaXJlLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIkRpc3Bveml0aXZ1bCDigJ4lc+KAnSBudSBlc3RlIHVuIGRpc3Bveml0aXYgZGUgaWXImWlyZS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJOdSBzZSBwb2F0ZSBkZXNjaGlkZSBkaXNwb3ppdGl2dWwg4oCeJXPigJ0gcGVudHJ1IGNpdGlyZSDImWkgc2NyaWVyZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkRlZmluaXJlYSBub3JtZWkgcGVudHJ1IGRpc3Bveml0aXZ1bCDigJ4lc+KAnSBhIGXImXVhdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiT2LIm2luZXJlYSBmcmVjdmVuyJtlaSBjdXJlbnQgYSByZWNlcHRvcnVsdWkgcGVudHJ1IGRpc3Bveml0aXZ1bCDigJ4lc+KAnSBhIGXImXVhdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorIkRlZmluaXJlYSBmcmVjdmVuyJtlaSBjdXJlbnQgYSByZWNlcHRvcnVsdWkgcGVudHJ1IGRpc3Bveml0aXZ1bCDigJ4lc+KAnSBsYSAlbHUgIgorIkh6IGEgZciZdWF0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJPYsibaW5lcmVhIG5pdmVsdWx1aSBzZW1uYWx1bHVpIHBlbnRydSBkaXNwb3ppdGl2dWwg4oCeJXPigJ0gYSBlyJl1YXQuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJPYsibaW5lcmVhIHZhbG9yaWkgJWQgcGVudHJ1IGRpc3Bveml0aXZ1bCDigJ4lc+KAnSBhIGXImXVhdC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkRlZmluaXJpaSB2YWxvcmlpICVkIHBlbnRydSBjb250cm9sdWwgJWQgYWwgZGlzcG96aXRpdnVsIOKAniVz4oCdIGEgZciZdWF0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIk9iyJtpbmVyZWEgaW50csSDcmkgY3VyZW50ZSBwZW50cnUgZGlzcG96aXRpdnVsIOKAniVz4oCdIGEgZciZdWF0LiBQb3NpYmlsIHPEgyBmaWUgIgorInVuIGRpc3Bveml0aXYgcmFkaW8uIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiT2LIm2luZXJlYSBpbnRyxINyaSBjdXJlbnRlIHBlbnRydSBkaXNwb3ppdGl2dWwg4oCeJXPigJ0gYSBlyJl1YXQuIFBvc2liaWwgc8SDIGZpZSAiCisidW4gZGlzcG96aXRpdiByYWRpby4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkRlZmluaXJlYSB2YWxvcmlpICVkIHBlbnRydSBkaXNwb3ppdGl2dWwg4oCeJXPigJ0gYSBlyJl1YXQuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiU2NoaW1iYXJlYSByZXpvbHXIm2llaSBwZSBkdXJhdGEgcnVsxINyaWkgbnUgZXN0ZSBpbmPEgyBzdXBvcnRhdMSDLiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiTnUgc2UgcG9hdGUgb3BlcmEgZsSDcsSDIHVuIGNlYXMiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIkVyb2FyZSBpbnRlcm7EgyBhIGZsdXh1bHVpIGRlIGRhdGUuIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAiRXJvYXJlIGludGVybsSDIGEgZmx1eHVsdWkgZGUgZGF0ZS4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiRGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBjYXB0dXJlIgorI34gbXNnc3RyICJEaXNwb3ppdGl2dWwg4oCeJXPigJ0gbnUgZXN0ZSB1biBkaXNwb3ppdGl2IGRlIGllyJlpcmUuIgorCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAiUy1hIG9iyJtpbnV0IG8gZGltZW5zaXVuZSBuZWHImXRlcHRhdMSDIHBlbnRydSBjYWRydSwgJXUgw65uIGxvYyBkZSAldS4iCisKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIk9iyJtpbmVyZWEgY2FkcmVsb3IgdmlkZW8gcGVudHJ1IGRpc3Bveml0aXZ1bCDigJ4lc+KAnSBhIGXImXVhdC4iCisKKyN+IG1zZ2lkICJGYWlsZWQgYWZ0ZXIgJWQgdHJpZXMuIGRldmljZSAlcy4gc3lzdGVtIGVycm9yOiAlcyIKKyN+IG1zZ3N0ciAiQSBlyJl1YXQgZHVwxIMgJWQgw65uY2VyY8SDcmkuIGRpc3Bveml0aXYgJXMuIGVyb2FyZSBzaXN0ZW06ICVzIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAiQmFzIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICLDjm5hbHRlIgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIlN5bnRoIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJEaWZ1em9yIgorCisjfiBtc2dpZCAiTGluZS1pbiIKKyN+IG1zZ3N0ciAiTGluaWUgaW50cmFyZSIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJNaXhlciIKKworI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICJQQ00tMiIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAiw45ucmVnaXN0cmFyZSIKKworI34gbXNnaWQgIkluLWdhaW4iCisjfiBtc2dzdHIgIkPDosiZdGlnIGludHJhcmUiCisKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAiQ8OiyJl0aWcgaWXImWlyZSIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAiTGluaWEtMSIKKworI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAiTGluaWEtMiIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAiTGluaWEtMyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAiRGlnaXRhbC0xIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICJEaWdpdGFsLTIiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIkRpZ2l0YWwtMyIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICJJbnRyYXJlIHRlbGVmb24iCisKKyN+IG1zZ2lkICJQaG9uZS1vdXQiCisjfiBtc2dzdHIgIkllyJlpcmUgdGVsZWZvbiIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICJWaWRlbyIKKworI34gbXNnaWQgIlJhZGlvIgorI34gbXNnc3RyICJSYWRpbyIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIiIKKyN+ICJOdSBzLWEgcHV0dXQgZGVzY2hpZGUgZGlzcG96aXRpdnVsIGF1ZGlvIHBlbnRydSBnZXN0aW9uYXJlYSBjb250cm9sdWx1aSAiCisjfiAiZGUgbWl4YWouIgorCisjfiBtc2dpZCAiIgorI34gIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4gVGhpcyB2ZXJzaW9uIG9mICIKKyN+ICJ0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiTnUgcy1hIHB1dHV0IGRlc2NoaWRlIGRpc3Bveml0aXZ1bCBhdWRpbyBwZW50cnUgZ2VzdGlvbmFyZWEgY29udHJvbHVsdWkgIgorI34gImRlIG1peGFqLiBBY2Vhc3TEgyB2ZXJzaXVuZSBhIE9TUyAoT3BlbiBTb3VuZCBTeXN0ZW0pIG51IGVzdGUgc3Vwb3J0YXTEgyBkZSAiCisjfiAiYWNlc3QgZWxlbWVudCIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAiUHJpbmNpcGFsIgorCisjfiBtc2dpZCAiRnJvbnQiCisjfiBtc2dzdHIgIkZhyJvEgyIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIlNwYXRlIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiQ8SDyJl0aSIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAiQ2VudHJ1IgorCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICJMRkUiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAiU3Vycm91bmQiCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICJMYXRlcmFsIgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAiSWXImWlyZSBBVVgiCisKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAiQWTDom5jaW1lIDNEIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICJDZW50cnUgM0QiCisKKyN+IG1zZ2lkICIzRCBFbmhhbmNlIgorI34gbXNnc3RyICLDjm1idW7Eg3TEg8ibaXJlIDNEIgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICJUZWxlZm9uIgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgIkludHJhcmUgdmlkZW8iCisKKyN+IG1zZ2lkICJBVVggSW4iCisjfiBtc2dzdHIgIkludHJhcmUgQVVYIgorCisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIkPDosiZdGlnIMOubnJlZ2lzdHJhcmUiCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAiQ8OiyJl0aWcgaWXImWlyZSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgQm9vc3QiCisjfiBtc2dzdHIgIkFtcGxpZmljYXJlIG1pY3JvZm9uIgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAiRGlhZ25vc3RpYyIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgIkFtcGxpZmljYXJlIGJhcyIKKworI34gbXNnaWQgIlBsYXliYWNrIFBvcnRzIgorI34gbXNnc3RyICJQb3J0dXJpIHJlZGFyZSIKKworI34gbXNnaWQgIklucHV0IgorI34gbXNnc3RyICJJbnRyYXJlIgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIlN1cnPEgyBtb25pdG9yIgorCisjfiBtc2dpZCAiS2V5Ym9hcmQgQmVlcCIKKyN+IG1zZ3N0ciAiQmlwIHRhc3RhdHVyxIMiCisKKyN+IG1zZ2lkICJTaW11bGF0ZSBTdGVyZW8iCisjfiBtc2dzdHIgIlNpbXVsZWF6xIMgc3RlcmVvIgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICJTdGVyZW8iCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAiU3VuZXQgc3Vycm91bmQiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIkPDosiZdGlnIG1pY3JvZm9uIgorCisjfiBtc2dpZCAiU3BlYWtlciBTb3VyY2UiCisjfiBtc2dzdHIgIlN1cnPEgyBkaWZ1em9yIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgIlN1cnPEgyBtaWNyb2ZvbiIKKworI34gbXNnaWQgIkphY2siCisjfiBtc2dzdHIgIkphY2siCisKKyN+IG1zZ2lkICJDZW50ZXIgLyBMRkUiCisjfiBtc2dzdHIgIkNlbnRydSAvIExGRSIKKworI34gbXNnaWQgIlN0ZXJlbyBNaXgiCisjfiBtc2dzdHIgIlN0ZXJlbyBNaXgiCisKKyN+IG1zZ2lkICJNb25vIE1peCIKKyN+IG1zZ3N0ciAiTW9ubyBNaXgiCisKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgIk1peCBpbnRyYXJlIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICJNaWNyb2ZvbiAxIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAyIgorI34gbXNnc3RyICJNaWNyb2ZvbiAyIgorCisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIkllyJlpcmUgZGlnaXRhbMSDIgorCisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAiSW50cmFyZSBkaWdpdGFsxIMiCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk1vZGVtIgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAiQ8SDyJl0aSIKKworI34gbXNnaWQgIk90aGVyIgorI34gbXNnc3RyICJBbHR1bCIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgIk5pY2l1bnVsIgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgIkFjdGl2YXQiCisKKyN+IG1zZ2lkICJPZmYiCisjfiBtc2dzdHIgIkRlemFjdGl2YXQiCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICJNdXQiCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICJSYXBpZCIKKworI34gbXNnaWQgIlZlcnkgTG93IgorI34gbXNnc3RyICJGb2FydGUgc2PEg3p1dMSDIgorCisjfiBtc2dpZCAiTG93IgorI34gbXNnc3RyICJTY8SDenV0xIMiCisKKyN+IG1zZ2lkICJNZWRpdW0iCisjfiBtc2dzdHIgIk1lZGllIgorCisjfiBtc2dpZCAiSGlnaCIKKyN+IG1zZ3N0ciAiUmlkaWNhdMSDIgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICJGb2FydGUgcmlkaWNhdMSDIgorCisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAiUHJvZHVjyJtpZSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIk1pY3JvZm9uIHBhbm91IGZyb250YWwiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICJMaW5pZSBpbnRyYXJlIHBhbm91IGZyb250YWwiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICJDxIPImXRpIHBhbm91IGZyb250YWwiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIE91dCIKKyN+IG1zZ3N0ciAiTGluaWUgaWXImWlyZSBwYW5vdSBmcm9udGFsIgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciB2ZXJkZSIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciByb3oiCisKKyN+IG1zZ2lkICJCbHVlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgYWxiYXN0cnUiCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIGFsYiIKKworI34gbXNnaWQgIkJsYWNrIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgbmVncnUiCisKKyN+IG1zZ2lkICJHcmF5IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgZ3JpIgorCisjfiBtc2dpZCAiT3JhbmdlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgcG9ydG9jYWxpdSIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIHJvyJl1IgorCisjfiBtc2dpZCAiWWVsbG93IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgZ2FsYmVuIgorCisjfiBtc2dpZCAiR3JlZW4gRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciB2ZXJkZSBwYW5vdSBmcm9udGFsIgorCisjfiBtc2dpZCAiUGluayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIHJveiBwYW5vdSBmcm9udGFsIgorCisjfiBtc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIGFsYmFzdHJ1IHBhbm91IGZyb250YWwiCisKKyN+IG1zZ2lkICJXaGl0ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIGFsYiBwYW5vdSBmcm9udGFsIgorCisjfiBtc2dpZCAiQmxhY2sgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJDb25lY3RvciBuZWdydSBwYW5vdSBmcm9udGFsIgorCisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIGdyaSBwYW5vdSBmcm9udGFsIgorCisjfiBtc2dpZCAiT3JhbmdlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3IgcG9ydG9jYWxpdSBwYW5vdSBmcm9udGFsIgorCisjfiBtc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQ29uZWN0b3Igcm/ImXUgcGFub3UgZnJvbnRhbCIKKworI34gbXNnaWQgIlllbGxvdyBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkNvbmVjdG9yIGdhbGJlbiBwYW5vdSBmcm9udGFsIgorCisjfiBtc2dpZCAiU3ByZWFkIE91dHB1dCIKKyN+IG1zZ3N0ciAiw45tcGFydGUgaWXImWlyZWEiCisKKyN+IG1zZ2lkICJEb3dubWl4IgorI34gbXNnc3RyICJNaXhhaiByZWR1cyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIkludHJhcmUgbWl4ZXIgdmlkZW8iCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKKyN+IG1zZ3N0ciAiSWXImWlyZSBtaXhlciB2aWRlbyIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCisjfiBtc2dzdHIgIkNhbmFsZSBtaXhlciB2aWRlbyIKKworI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICJGdW5jyJtpZSAlcyAlZCIKKworI34gbXNnaWQgIiVzIEZ1bmN0aW9uIgorI34gbXNnc3RyICJGdW5jyJtpZSAlcyIKKworI34gbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgb24gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJFcm9hcmUgY2l0aXJlICVkIG9jdGXIm2kgcGUgZGlzcG96aXRpdnVsIOKAniVz4oCdLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlbnF1ZXVlIGJ1ZmZlcnMgaW4gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJOdSBzLWEgcHV0dXQgcHJvZ3JhbWEgbWVtb3JpYSB0YW1wb24gw65uIGRpc3Bveml0aXZ1bCDigJ4lc+KAnS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc291bmQgc2VydmVyIgorI34gbXNnc3RyICJOdSBzZSBwb2F0ZSBzdGFiaWxpIG8gY29uZXhpdW5lIGxhIHNlcnZlcnVsIGRlIHN1bmV0IgorCisjfiBtc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IHNvdW5kIHNlcnZlciBjYXBhYmlsaXRpZXMiCisjfiBtc2dzdHIgIkludGVyb2dhcmVhIGNhcGFiaWxpdMSDyJtpbG9yIHNlcnZlcnVsdWkgZGUgc3VuZXQgYSBlyJl1YXQiCmRpZmYgLS1naXQgYS9wby9ydS5wbyBiL3BvL3J1LnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZTg2NjkKLS0tIC9kZXYvbnVsbAorKysgYi9wby9ydS5wbwpAQCAtMCwwICsxLDg0NyBAQAorIyBUcmFuc2xhdGlvbiBmb3IgZ3N0LXBsdWdpbnMtZ29vZCBtZXNzYWdlcyB0byBSdXNzaWFuCisjIFRoaXMgZmlsZSBpcyBwdXQgaW4gdGhlIHB1YmxpYyBkb21haW4uCisjCisjINCQ0YDRgtGR0Lwg0J/QvtC/0L7QsiA8YXJ0ZndvQGdtYWlsLmNvbT4sIDIwMDkuCisjIFBhdmVsIE1hcnlhbm92IDxhY2lkX2phY2tAdWtyLm5ldD4sIDIwMDkuCisjIFl1cmkgS296bG92IDx5dXJheUBrb215YWtpbm8ucnU+LCAyMDExLCAyMDEyLCAyMDEzLCAyMDE0LCAyMDE1LCAyMDE2LgorIyBQYXZlbCBNYXJ5YW5vdiA8YWNpZEBqYWNrLmtpZXYudWE+LCAyMDEzLgorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZCAxLjcuMlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDE2LTAyLTIxIDA5OjU1KzAzMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IFl1cmkgS296bG92IDx5dXJheUBrb215YWtpbm8ucnU+XG4iCisiTGFuZ3VhZ2UtVGVhbTogUnVzc2lhbiA8Z251QGQwNy5ydT5cbiIKKyJMYW5ndWFnZTogcnVcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJYLUdlbmVyYXRvcjogTG9rYWxpemUgMS41XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0zOyBwbHVyYWw9KG4lMTA9PTEgJiYgbiUxMDAhPTExID8gMCA6IG4lMTA+PTIgJiYgbiIKKyIlMTA8PTQgJiYgKG4lMTAwPDEwIHx8IG4lMTAwPj0yMCkgPyAxIDogMik7XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgItCh0LXRgNCy0LXRgCBKYWNrINC90LUg0L3QsNC50LTQtdC9IgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINC00LXQutC+0LTQuNGA0L7QstCw0YLRjCBKUEVHLdC40LfQvtCx0YDQsNC20LXQvdC40LUiCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIsKrJXPCuywgwqslc8K7IgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINGB0L7QtdC00LjQvdC40YLRjNGB0Y8g0YEg0YHQtdGA0LLQtdGA0L7QvCIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJVUkwg0L3QtSDQt9Cw0LTQsNC9LiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAi0J3QtSDRg9C00LDQu9C+0YHRjCDQvtC/0YDQtdC00LXQu9C40YLRjCDQuNC80Y8g0YHQtdGA0LLQtdGA0LAuIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0YPRgdGC0LDQvdC+0LLQuNGC0Ywg0YHQvtC10LTQuNC90LXQvdC40LUg0YEg0YHQtdGA0LLQtdGA0L7QvC4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINC90LDRgdGC0YDQvtC40YLRjCDQt9Cw0YnQuNGJ0ZHQvdC90L7QtSDRgdC+0LXQtNC40L3QtdC90LjQtS4iCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICLQn9GA0L7QuNC30L7RiNC70LAg0YHQtdGC0LXQstCw0Y8g0L7RiNC40LHQutCwINC40LvQuCDRgdC10YDQstC10YAg0L3QtdC+0LbQuNC00LDQvdC90L4g0LfQsNC60YDRi9C7INGB0L7QtdC00LjQvdC10L3QuNC1LiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAi0KHQtdGA0LLQtdGAINC/0YDQuNGB0LvQsNC7INC90LXQutC+0YDRgNC10LrRgtC90YvQtSDQtNCw0L3QvdGL0LUuIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgItCh0LXRgNCy0LXRgCDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgiDQv9C+0LjRgdC6LiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiIgorItCS0YXQvtC00Y/RidC40LUg0LDRg9C00LjQvi3QtNCw0L3QvdGL0LUg0L7RgtGB0YPRgtGB0YLQstGD0Y7RgiDQuNC70Lgg0L3QtdC00LXQudGB0YLQstC40YLQtdC70YzQvdGLLCDQv9C+0YLQvtC6IEFWSSDQsdGD0LTQtdGCICIKKyLQv9C+0LLRgNC10LbQtNGR0L0uIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICLQpNCw0LnQuyDQvdC1INGB0L7QtNC10YDQttC40YIg0LLQvtGB0L/RgNC+0LjQt9Cy0L7QtNC40LzRi9GFINC/0L7RgtC+0LrQvtCyLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAi0KTQsNC50Lsg0L3QtdC60L7RgNGA0LXQutGC0LXQvSDQuCDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0LLQvtGB0L/RgNC+0LjQt9Cy0LXQtNGR0L0uIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKyLQndC10LLQvtC30LzQvtC20L3QviDQstC+0YHQv9GA0L7QuNC30LLQtdGB0YLQuCDQv9C+0YLQvtC6LCDRgtCw0Log0LrQsNC6INC+0L0g0LfQsNGI0LjRhNGA0L7QstCw0L0g0YEg0L/QvtC80L7RidGM0Y4gUGxheVJlYWR5ICIKKyJEUk0uIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICLQpNCw0LnQuyDQv9C+0LLRgNC10LbQtNGR0L0g0Lgg0L3QtSDQvNC+0LbQtdGCINCx0YvRgtGMINCy0L7RgdC/0YDQvtC40LfQstC10LTRkdC9LiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAi0J3QtdCy0LXRgNC90YvQuSDQsNGC0L7QvNCw0YDQvdGL0Lkg0YDQsNC30LzQtdGALiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAi0KTQsNC50Lsg0L3QtSDQv9C+0LvQvtC9INC4INC90LUg0LzQvtC20LXRgiDQsdGL0YLRjCDQstC+0YHQv9GA0L7QuNC30LLQtdC00ZHQvS4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgItCS0LjQtNC10L4g0LjQtyDRjdGC0L7Qs9C+INGE0LDQudC70LAg0LzQvtC20LXRgiDQsdGL0YLRjCDQstC+0YHQv9GA0L7QuNC30LLQtdC00LXQvdC+INC90LXQutC+0YDRgNC10LrRgtC90L4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIiIKKyLQpNCw0LnQuyDRgdC+0LTQtdGA0LbQuNGCINGB0LvQuNGI0LrQvtC8INC80L3QvtCz0L4g0L/QvtGC0L7QutC+0LIuINCR0YPQtNC10YIg0LLQvtGB0L/RgNC+0LjQt9Cy0LXQtNGR0L3QviDRgtC+0LvRjNC60L4g0L/QtdGA0LLRi9GFICVkIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyLQndC4INC+0LTQuNC9INC/0L7RgtC+0Log0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YLRgdGPLiDQktC+0LfQvNC+0LbQvdC+INGC0YDQtdCx0YPQtdGC0YHRjyDRg9GB0YLQsNC90L7QstC60LAgIgorItC00L7Qv9C+0LvQvdC40YLQtdC70YzQvdC+0LPQviDQvNC+0LTRg9C70Y8gR1N0cmVhbWVyIFJUU1Ag0LTQu9GPINC/0L7RgtC+0LrQvtCyIFJlYWwgbWVkaWEuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisi0J3QuCDQvtC00LjQvSDQv9C+0YLQvtC6INC90LUg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGC0YHRjy4g0JLQvtC30LzQvtC20L3QviDRgtGA0LXQsdGD0LXRgtGB0Y8g0YDQsNC30YDQtdGI0LjRgtGMINC00L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgIgorItC/0YDQvtGC0L7QutC+0LvRiyDQv9C10YDQtdC00LDRh9C4INC40LvQuCDQttC1INC+0YLRgdGD0YLRgdGC0LLRg9C10YIg0L/RgNCw0LLQuNC70YzQvdGL0Lkg0LzQvtC00YPQu9GMIEdTdHJlYW1lciBSVFNQLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyLQndC1INGD0LTQsNC70L7RgdGMINC+0YLQutGA0YvRgtGMINCw0YPQtNC40L4t0YPRgdGC0YDQvtC50YHRgtCy0L4g0LTQu9GPINCy0L7RgdC/0YDQvtC40LfQstC10LTQtdC90LjRjy4g0KPRgdGC0YDQvtC50YHRgtCy0L4gIgorItC40YHQv9C+0LvRjNC30YPQtdGC0YHRjyDQtNGA0YPQs9C40Lwg0L/RgNC40LvQvtC20LXQvdC40LXQvC4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorItCd0LUg0YPQtNCw0LvQvtGB0Ywg0L7RgtC60YDRi9GC0Ywg0LDRg9C00LjQvi3Rg9GB0YLRgNC+0LnRgdGC0LLQviDQtNC70Y8g0LLQvtGB0L/RgNC+0LjQt9Cy0LXQtNC10L3QuNGPLiDQntGC0YHRg9GC0YHRgtCy0YPRjtGCINC/0YDQsNCy0LAgIgorItC00L7RgdGC0YPQv9CwINC6INGD0YHRgtGA0L7QudGB0YLQstGDLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINC+0YLQutGA0YvRgtGMINCw0YPQtNC40L4t0YPRgdGC0YDQvtC50YHRgtCy0L4g0LTQu9GPINCy0L7RgdC/0YDQvtC40LfQstC10LTQtdC90LjRjy4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisi0J3QtSDRg9C00LDQu9C+0YHRjCDQvtGC0LrRgNGL0YLRjCDQsNGD0LTQuNC+LdGD0YHRgtGA0L7QudGB0YLQstC+INC00LvRjyDQstC+0YHQv9GA0L7QuNC30LLQtdC00LXQvdC40Y8uINCU0LDQvdC90LDRjyDQstC10YDRgdC40Y8gT3BlbiAiCisiU291bmQgU3lzdGVtINC90LUg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGC0YHRjyDRjdGC0LjQvCDRjdC70LXQvNC10L3RgtC+0LwuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgItCS0L7RgdC/0YDQvtC40LfQstC10LTQtdC90LjQtSDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgtGB0Y8g0LTQsNC90L3Ri9C8INCw0YPQtNC40L4t0YPRgdGC0YDQvtC50YHRgtCy0L7QvC4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgItCe0YjQuNCx0LrQsCDQstC+0YHQv9GA0L7QuNC30LLQtdC00LXQvdC40Y8g0LDRg9C00LjQvi4iCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgItCX0LDQv9C40YHRjCDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgtGB0Y8g0LTQsNC90L3Ri9C8INCw0YPQtNC40L4t0YPRgdGC0YDQvtC50YHRgtCy0L7QvC4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLQntGI0LjQsdC60LAg0LfQsNC/0LjRgdC4INGBINCw0YPQtNC40L4t0YPRgdGC0YDQvtC50YHRgtCy0LAuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisi0J3QtSDRg9C00LDQu9C+0YHRjCDQvtGC0LrRgNGL0YLRjCDQsNGD0LTQuNC+LdGD0YHRgtGA0L7QudGB0YLQstC+INC00LvRjyDQt9Cw0L/QuNGB0LguINCe0YLRgdGD0YLRgdGC0LLRg9GO0YIg0L/RgNCw0LLQsCDQtNC+0YHRgtGD0L/QsCDQuiAiCisi0YPRgdGC0YDQvtC50YHRgtCy0YMuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINC+0YLQutGA0YvRgtGMINCw0YPQtNC40L4t0YPRgdGC0YDQvtC50YHRgtCy0L4g0LTQu9GPINC30LDQv9C40YHQuC4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAi0KPRgdGC0YDQvtC50YHRgtCy0L4gQ29yZUF1ZGlvINC90LUg0L3QsNC50LTQtdC90L4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgItCd0LXQstC+0LfQvNC+0LbQvdC+INC+0YLQutGA0YvRgtGMINGD0YHRgtGA0L7QudGB0YLQstC+IENvcmVBdWRpbyIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgItCj0YHRgtGA0L7QudGB0YLQstC+INC30LDQv9C40YHQuCIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgItCc0LjQutGA0L7RhNC+0L0iCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICLQm9C40L3QtdC50L3Ri9C5INCy0YXQvtC0IgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgItCS0L3Rg9GC0YDQtdC90L3QuNC5IENEIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgItCS0YXQvtC0IFNQRElGIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgItCS0YXQvtC0IEFVWCAxIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgItCS0YXQvtC0IEFVWCAyIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgItCf0LXRgtC70Y8gQ29kZWMiCisKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgItCf0LXRgtC70Y8gU3VuVlRTIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICLQo9GA0L7QstC10L3RjCIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgItCj0YDQvtCy0LXQvdGMIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAi0JzQvtC90LjRgtC+0YDQuNC90LMiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICLQktC90YPRgtGA0LXQvdC90LjQuSDQtNC40L3QsNC80LjQuiIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAi0J3QsNGD0YjQvdC40LoiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAi0JvQuNC90LXQudC90YvQuSDQstGL0YXQvtC0IgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICLQktGL0YXQvtC0IFNQRElGIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICLQktGL0YXQvtC0IEFVWCAxIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICLQktGL0YXQvtC0IEFVWCAyIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCe0YjQuNCx0LrQsCDRh9GC0LXQvdC40Y8gJWQg0LHQsNC50YIg0LjQtyDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisi0J3QtSDRg9C00LDQu9C+0YHRjCDRgdC+0LfQtNCw0YLRjCDRgdC/0LjRgdC+0Log0LLQuNC00LXQvi3RhNC+0YDQvNCw0YLQvtCyLCDRgSDQutC+0YLQvtGA0YvQvNC4INC80L7QttC10YIg0YDQsNCx0L7RgtCw0YLRjCAiCisi0YPRgdGC0YDQvtC50YHRgtCy0L4gwqslc8K7IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBtYXAgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnIgorbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINGA0LDRgdC/0YDQtdC00LXQu9C40YLRjCDQsdGD0YTQtdGA0Ysg0YPRgdGC0YDQvtC50YHRgtCy0LAgwqslc8K7IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICLQlNGA0LDQudCy0LXRgCDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsg0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YIg0LzQtdGC0L7QtCDQstCy0L7QtNCwLdCy0YvQstC+0LTQsCAlZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIiIKKyLQlNGA0LDQudCy0LXRgCDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsg0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YIg0L3QuCDQvtC00LjQvSDQuNC3INC40LfQstC10YHRgtC90YvRhSDQvNC10YLQvtC00L7QsiDQstCy0L7QtNCwLSIKKyLQstGL0LLQvtC00LAuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgItCj0YHRgtGA0L7QudGB0YLQstC+IMKrJXPCuyDQt9Cw0L3Rj9GC0L4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgItCj0YHRgtGA0L7QudGB0YLQstC+IMKrJXPCuyDQvdC1INC80L7QttC10YIg0L7RgdGD0YnQtdGB0YLQstC70Y/RgtGMINC30LDRhdCy0LDRgiDQsiDRgNCw0LfRgNC10YjQtdC90LjQuCAlZHglZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAi0KPRgdGC0YDQvtC50YHRgtCy0L4gwqslc8K7INC90LUg0LzQvtC20LXRgiDQvtGB0YPRidC10YHRgtCy0LvRj9GC0Ywg0LfQsNGF0LLQsNGCINCyINGD0LrQsNC30LDQvdC90L7QvCDRhNC+0YDQvNCw0YLQtSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICIiCisi0KPRgdGC0YDQvtC50YHRgtCy0L4gwqslc8K7INC/0L7QtNC00LXRgNC20LjQstCw0LXRgiDQv9GA0LXRgNGL0LLQuNGB0YLRi9C1INC80LDRgtGA0LjRhtGLIChub24tY29udGlndW91cyBwbGFuZXMpIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAi0J3QtSDRg9C00LDQu9C+0YHRjCDQv9C+0LvRg9GH0LjRgtGMINC/0LDRgNCw0LzQtdGC0YDRiyDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgItCS0LjQtNC10L4t0YPRgdGC0YDQvtC50YHRgtCy0L4g0L3QtSDQv9GA0LjQvdGP0LvQviDQvdC+0LLQvtC1INC30L3QsNGH0LXQvdC40LUg0L3QsNGB0YLRgNC+0LnQutC4INC60LDQtNGA0L7QstC+0Lkg0YfQsNGB0YLQvtGC0YsuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAi0JLQuNC00LXQvi3Rg9GB0YLRgNC+0LnRgdGC0LLQviDQvdC1INC/0YDQtdC00L7RgdGC0LDQstC40LvQviDQstGL0YXQvtC00L3QvtC5INGE0L7RgNC80LDRgi4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAi0JLQuNC00LXQvi3Rg9GB0YLRgNC+0LnRgdGC0LLQviDQstC10YDQvdGD0LvQviDQvdC10LrQvtGA0YDQtdC60YLQvdGL0LUg0YDQsNC30LzQtdGA0YsuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgItCS0LjQtNC10L4t0YPRgdGC0YDQvtC50YHRgtCy0LAg0LjRgdC/0L7Qu9GM0LfRg9GO0YIg0L3QtdC/0L7QtNC00LXRgNC20LjQstCw0LXQvNGL0Lkg0LzQtdGC0L7QtCDRh9C10YDQtdC30YHRgtGA0L7Rh9C90L7RgdGC0LguIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgItCS0LjQtNC10L4t0YPRgdGC0YDQvtC50YHRgtCy0LAg0LjRgdC/0L7Qu9GM0LfRg9GO0YIg0L3QtdC/0L7QtNC00LXRgNC20LjQstCw0LXQvNGL0Lkg0YTQvtGA0LzQsNGCINC/0LjQutGB0LXQu9C10LkuIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgItCe0YjQuNCx0LrQsCDQv9GA0Lgg0L3QsNGB0YLRgNC+0LnQutC1INCy0L3Rg9GC0YDQtdC90L3QtdCz0L4g0LHRg9GE0LXRgNC90L7Qs9C+INC/0YPQu9CwLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAi0JLQuNC00LXQvi3Rg9GB0YLRgNC+0LnRgdGC0LLQviDQvdC1INC/0YDQtdC00LvQvtC20LjQu9C+INC60LDQutC+0Lkt0LvQuNCx0L4g0YDQsNC30LzQtdGAINCx0YPRhNC10YDQsC4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICLQndC10L7RgtC60YPQtNCwINC40LzQv9C+0YDRgtC40YDQvtCy0LDRgtGMINC/0YPQuyDQvdC40YHRhdC+0LTRj9GJ0LXQs9C+INC/0L7RgtC+0LrQsC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0L/QvtC70YPRh9C40YLRjCDQvdCw0YHRgtGA0L7QudC60Lgg0YLRjtC90LXRgNCwICVkINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J7RiNC40LHQutCwINC/0YDQuCDQv9C+0LvRg9GH0LXQvdC40Lgg0YHQv9C40YHQutCwINCy0L7Qt9C80L7QttC90L7RgdGC0LXQuSDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAi0KPRgdGC0YDQvtC50YHRgtCy0L4gwqslc8K7INC90LUg0Y/QstC70Y/QtdGC0YHRjyDRgtGO0L3QtdGA0L7QvC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINCy0YvQsdGA0LDRgtGMINGA0LDQtNC40L4t0LLRhdC+0LQg0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQtSDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAi0J3QtSDRg9C00LDQu9C+0YHRjCDQstGL0LHRgNCw0YLRjCDQstGF0L7QtCAlZCDQtNC70Y8g0YPRgdGC0YDQvtC50YHRgtCy0LAgJXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINC40LfQvNC10L3QuNGC0Ywg0YHQvtGB0YLQvtGP0L3QuNC1INC/0YDQuNCz0LvRg9GI0LXQvdC40Y8g0LTQu9GPINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuy4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0LLRi9C00LXQu9C40YLRjCDQtNC+0YHRgtCw0YLQvtGH0L3QviDQv9Cw0LzRj9GC0LguIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0LLRi9C00LXQu9C40YLRjCDQtNC+0YHRgtCw0YLQvtGH0L3QviDQv9Cw0LzRj9GC0LguIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgItCf0YDQtdC+0LHRgNCw0LfQvtCy0LDRgtC10LvRjCDQvdCwINGD0YHRgtGA0L7QudGB0YLQstC1ICVzINC90LUg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGCINCy0YXQvtC00L3QvtC5INGE0L7RgNC80LDRgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAi0J/RgNC10L7QsdGA0LDQt9C+0LLQsNGC0LXQu9GMINC90LAg0YPRgdGC0YDQvtC50YHRgtCy0LUgJXMg0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YIg0LLRi9GF0L7QtNC90L7QuSDRhNC+0YDQvNCw0YIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgItCa0L7QtNC40YDQvtCy0YnQuNC6INC90LAg0YPRgdGC0YDQvtC50YHRgtCy0LUgJXMg0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YIg0LLRhdC+0LTQvdC+0Lkg0YTQvtGA0LzQsNGCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAi0JrQvtC00LjRgNC+0LLRidC40Log0L3QsCDRg9GB0YLRgNC+0LnRgdGC0LLQtSAlcyDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgiDQstGL0YXQvtC00L3QvtC5INGE0L7RgNC80LDRgiIKKworbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINC30LDQv9GD0YHRgtC40YLRjCDQvdC40YLRjCDQtNC10LrQvtC00LjRgNC+0LLQsNC90LjRjy4iCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0L7QsdGA0LDQsdC+0YLQsNGC0Ywg0LrQsNC00YAuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorItCe0YjQuNCx0LrQsCDQv9C+0LvRg9GH0LXQvdC40Y8g0LLQvtC30LzQvtC20L3QvtGB0YLQtdC5INGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuzog0LTRgNCw0LnQstC10YAg0YPRgdGC0YDQvtC50YHRgtCy0LAgIgorItC90LXRgdC+0LLQvNC10YHRgtC40Lwg0YEgdjRsMi4g0J/RgNC+0LLQtdGA0YzRgtC1LCDQvdC1INC40YHQv9C+0LvRjNC30YPQtdGCINC70Lgg0YPRgdGC0YDQvtC50YHRgtCy0L4g0LTRgNCw0LnQstC10YAgdjRsMS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICLQntGI0LjQsdC60LAg0LfQsNC/0YDQvtGB0LAg0LDRgtGA0LjQsdGD0YLQvtCyINCy0YXQvtC00LAgJWQg0YPRgdGC0YDQvtC50YHRgtCy0LAgJXMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J7RiNC40LHQutCwINC/0L7Qu9GD0YfQtdC90LjRjyDRg9GB0YLQsNC90L7QstC+0Log0YLRjtC90LXRgNCwICVkINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICLQntGI0LjQsdC60LAg0LfQsNC/0YDQvtGB0LAg0YHRgtCw0L3QtNCw0YDRgtCwINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCe0YjQuNCx0LrQsCDQv9C+0LvRg9GH0LXQvdC40Y8g0LDRgtGA0LjQsdGD0YLQvtCyINGD0L/RgNCw0LLQu9C10L3QuNGPINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J3QtSDRg9C00LDRkdGC0YHRjyDRgNCw0YHQv9C+0LfQvdCw0YLRjCDRg9GB0YLRgNC+0LnRgdGC0LLQviDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIsKrJXPCuyDQvdC1INGP0LLQu9GP0LXRgtGB0Y8g0YPRgdGC0YDQvtC50YHRgtCy0L7QvC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINC+0YLQutGA0YvRgtGMINGD0YHRgtGA0L7QudGB0YLQstC+IMKrJXPCuyDQtNC70Y8g0YfRgtC10L3QuNGPINC4INC30LDQv9C40YHQuC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQviDCqyVzwrsg0L3QtSDRj9Cy0LvRj9C10YLRgdGPINGD0YHRgtGA0L7QudGB0YLQstC+0Lwg0LfQsNGF0LLQsNGC0LAuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQviDCqyVzwrsg0L3QtSDRj9Cy0LvRj9C10YLRgdGPINGD0YHRgtGA0L7QudGB0YLQstC+0Lwg0LLRi9Cy0L7QtNCwLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAi0KPRgdGC0YDQvtC50YHRgtCy0L4gwqslc8K7INC90LUg0Y/QstC70Y/QtdGC0YHRjyDRg9GB0YLRgNC+0LnRgdGC0LLQvtC8IE0yTS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgItCd0LUg0YPQtNCw0LvQvtGB0Ywg0YHQtNC10LvQsNGC0Ywg0LTRg9Cx0LvQuNC60LDRgiDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsg0LTQu9GPINGH0YLQtdC90LjRjyDQuCDQt9Cw0L/QuNGB0LguIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLQntGI0LjQsdC60LAg0YPRgdGC0LDQvdC+0LLQutC4INGB0YLQsNC90LTQsNGA0YLQsCDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J7RiNC40LHQutCwINC/0L7Qu9GD0YfQtdC90LjRjyDRgtC10LrRg9GJ0LXQuSDRh9Cw0YHRgtC+0YLRiyDRgtGO0L3QtdGA0LAg0YPRgdGC0YDQvtC50YHRgtCy0LAgwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICLQntGI0LjQsdC60LAg0YPRgdGC0LDQvdC+0LLQutC4INGC0LXQutGD0YnQtdC5INGH0LDRgdGC0L7RgtGLINGC0Y7QvdC10YDQsCDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsg0LIgJWx1INCT0YYuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCe0YjQuNCx0LrQsCDQv9C+0LvRg9GH0LXQvdC40Y8g0LzQvtGJ0L3QvtGB0YLQuCDRgdC40LPQvdCw0LvQsCDQtNC70Y8g0YPRgdGC0YDQvtC50YHRgtCy0LAgwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J7RiNC40LHQutCwINC/0L7Qu9GD0YfQtdC90LjRjyDQt9C90LDRh9C10L3QuNGPINGD0L/RgNCw0LLQu9GP0Y7RidC10LPQviDQv9Cw0YDQsNC80LXRgtGA0LAgJWQg0YPRgdGC0YDQvtC50YHRgtCy0LAgwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorItCe0YjQuNCx0LrQsCDRg9GB0YLQsNC90L7QstC60Lgg0LfQvdCw0YfQtdC90LjRjyAlZCDQtNC70Y8g0YPQv9GA0LDQstC70Y/RjtGJ0LXQs9C+INC/0LDRgNCw0LzQtdGC0YDQsCAlZCDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisi0J3QtSDRg9C00LDQu9C+0YHRjCDQvtC/0YDQtdC00LXQu9C40YLRjCDQsNC60YLQuNCy0L3Ri9C5INCy0YXQvtC0INGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuy4g0JLQvtC30LzQvtC20L3Qviwg0Y3RgtC+INGA0LDQtNC40L4tIgorItGD0YHRgtGA0L7QudGB0YLQstC+IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyLQndC1INGD0LTQsNC70L7RgdGMINC+0L/RgNC10LTQtdC70LjRgtGMINCw0LrRgtC40LLQvdGL0Lkg0LLRi9GF0L7QtCDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsuINCS0L7Qt9C80L7QttC90L4sINGN0YLQviDRgNCw0LTQuNC+LSIKKyLRg9GB0YLRgNC+0LnRgdGC0LLQviIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINCy0YvQsdGA0LDRgtGMINCy0YvRhdC+0LQgJWQg0LTQu9GPINGD0YHRgtGA0L7QudGB0YLQstCwICVzLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIiIKKyLQmNC30LzQtdC90LXQvdC40LUg0YDQsNC30YDQtdGI0LXQvdC40Y8g0LLQuNC00LXQviDQstC+INCy0YDQtdC80Y8g0LLRi9C/0L7Qu9C90LXQvdC40Y8g0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YLRgdGPINCyINC90LDRgdGC0L7Rj9GJ0LjQuSAiCisi0LzQvtC80LXQvdGCLiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAi0J7Qv9C10YDQsNGG0LjRjyDQvdC10LLQvtC30LzQvtC20L3QsCDQsdC10Lcg0YfQsNGB0L7QsiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAi0JLQvdGD0YLRgNC10L3QvdGP0Y8g0L7RiNC40LHQutCwINC/0L7RgtC+0LrQsCDQtNCw0L3QvdGL0YUuIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAi0JLQvdGD0YLRgNC10L3QvdGP0Y8g0L7RiNC40LHQutCwINC/0L7RgtC+0LrQsCDQtNCw0L3QvdGL0YUuIgorCisjfiBtc2dpZCAiRGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBjYXB0dXJlIgorI34gbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQviDCqyVzwrsg0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YIg0LfQsNGF0LLQsNGCINCy0LjQtNC10L4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc291bmQgc2VydmVyIgorI34gbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINGD0YHRgtCw0L3QvtCy0LjRgtGMINGB0L7QtdC00LjQvdC10L3QuNC1INGBINGB0LXRgNCy0LXRgNC+0Lwg0LfQstGD0LrQsCIKKworI34gbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBzb3VuZCBzZXJ2ZXIgY2FwYWJpbGl0aWVzIgorI34gbXNnc3RyICLQntGI0LjQsdC60LAg0L/RgNC4INC30LDQv9GA0L7RgdC1INCy0L7Qt9C80L7QttC90L7RgdGC0LXQuSDRgdC10YDQstC10YDQsCDQt9Cy0YPQutCwIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAi0J3QuNC30LrQuNC1IgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICLQktGL0YHQvtC60LjQtSIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICLQodC40L3RgtC10LfQsNGC0L7RgCIKKworI34gbXNnaWQgIlBDTSIKKyN+IG1zZ3N0ciAiUENNIgorCisjfiBtc2dpZCAiU3BlYWtlciIKKyN+IG1zZ3N0ciAi0JLQvdGD0YLRgNC10L3QvdC40Lkg0LTQuNC90LDQvNC40LoiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICLQm9C40L3QtdC50L3Ri9C5INCy0YXQvtC0IgorCisjfiBtc2dpZCAiQ0QiCisjfiBtc2dzdHIgIkNEIgorCisjfiBtc2dpZCAiTWl4ZXIiCisjfiBtc2dzdHIgItCc0LjQutGI0LXRgCIKKworI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICJQQ00tMiIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAi0JfQsNC/0LjRgdGMIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAi0KPRgdC40LvQtdC90LjQtSDQvdCwINCy0YXQvtC00LUiCisKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAi0KPRgdC40LvQtdC90LjQtSDQvdCwINCy0YvRhdC+0LTQtSIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAi0JvQuNC90LXQudC90YvQuS0xIgorCisjfiBtc2dpZCAiTGluZS0yIgorI34gbXNnc3RyICLQm9C40L3QtdC50L3Ri9C5LTIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgItCb0LjQvdC10LnQvdGL0LktMyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAi0KbQuNGE0YDQvtCy0L7QuS0xIgorCisjfiBtc2dpZCAiRGlnaXRhbC0yIgorI34gbXNnc3RyICLQptC40YTRgNC+0LLQvtC5LTIiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgItCm0LjRhNGA0L7QstC+0LktMyIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICLQotC10LsuINCy0YXQvtC0IgorCisjfiBtc2dpZCAiUGhvbmUtb3V0IgorI34gbXNnc3RyICLQotC10LsuINCy0YvRhdC+0LQiCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAi0JLQuNC00LXQviIKKworI34gbXNnaWQgIlJhZGlvIgorI34gbXNnc3RyICLQoNCw0LTQuNC+IgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiIgorI34gItCd0LUg0YPQtNCw0LvQvtGB0Ywg0L7RgtC60YDRi9GC0Ywg0LDRg9C00LjQvi3Rg9GB0YLRgNC+0LnRgdGC0LLQviDQtNC70Y8g0L7QsdGA0LDQsdC+0YLQutC4INC/0LDRgNCw0LzQtdGC0YDQvtCyINC80LjQutGI0LXRgNCwLiIKKworI34gbXNnaWQgIiIKKyN+ICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIFRoaXMgdmVyc2lvbiBvZiAiCisjfiAidGhlIE9wZW4gU291bmQgU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gItCd0LUg0YPQtNCw0LvQvtGB0Ywg0L7RgtC60YDRi9GC0Ywg0LDRg9C00LjQvi3Rg9GB0YLRgNC+0LnRgdGC0LLQviDQtNC70Y8g0L7QsdGA0LDQsdC+0YLQutC4INC/0LDRgNCw0LzQtdGC0YDQvtCyINC80LjQutGI0LXRgNCwLiAiCisjfiAi0JTQsNC90L3QsNGPINCy0LXRgNGB0LjRjyBPcGVuIFNvdW5kIFN5c3RlbSDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgtGB0Y8g0Y3RgtC40Lwg0Y3Qu9C10LzQtdC90YLQvtC8LiIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAi0J7QsdGJ0LjQuSIKKworI34gbXNnaWQgIkZyb250IgorI34gbXNnc3RyICLQpNGA0L7QvdGC0LDQu9GM0L3Ri9C1IgorCisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAi0KLRi9C70L7QstGL0LUiCisKKyN+IG1zZ2lkICJIZWFkcGhvbmVzIgorI34gbXNnc3RyICLQndCw0YPRiNC90LjQutC4IgorCisjfiBtc2dpZCAiQ2VudGVyIgorI34gbXNnc3RyICLQptC10L3RgtGAIgorCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICLQodCw0LHQstGD0YTQtdGAIgorCisjfiBtc2dpZCAiU3Vycm91bmQiCisjfiBtc2dzdHIgItCe0LHRitGR0LzQvdGL0Lkg0LfQstGD0LoiCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICLQkdC+0LrQvtCy0YvQtSIKKworI34gbXNnaWQgIkFVWCBPdXQiCisjfiBtc2dzdHIgItCS0YvRhdC+0LQgQVVYIgorCisjfiBtc2dpZCAiM0QgRGVwdGgiCisjfiBtc2dzdHIgIjNEINCz0LvRg9Cx0LjQvdCwIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICIzRCDRhtC10L3RgtGAIgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAiM0Qg0YPQu9GD0YfRiNC10L3QuNC1IgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICLQotC10LvQtdGE0L7QvSIKKworI34gbXNnaWQgIlZpZGVvIEluIgorI34gbXNnc3RyICLQktC40LTQtdC+INCy0YXQvtC0IgorCisjfiBtc2dpZCAiQVVYIEluIgorI34gbXNnc3RyICLQktGF0L7QtCBBVVgiCisKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAi0KPRgNC+0LLQtdC90Ywg0LfQsNC/0LjRgdC4IgorCisjfiBtc2dpZCAiT3V0cHV0IEdhaW4iCisjfiBtc2dzdHIgItCS0YvRhdC+0LTQvdC+0Lkg0YPRgNC+0LLQtdC90YwiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICLQnNC40LrRgNC+0YTQvtC90L3Ri9C5INGD0YHQuNC70LjRgtC10LvRjCIKKworI34gbXNnaWQgIkRpYWdub3N0aWMiCisjfiBtc2dzdHIgItCU0LjQsNCz0L3QvtGB0YLQuNC60LAiCisKKyN+IG1zZ2lkICJCYXNzIEJvb3N0IgorI34gbXNnc3RyICLQo9GB0LjQu9C10L3QuNC1INCx0LDRgdCwIgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgItCf0L7RgNGC0Ysg0LLQvtGB0L/RgNC+0LjQt9Cy0LXQtNC10L3QuNGPIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgItCS0YXQvtC0IgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgItCj0YHRgtGA0L7QudGB0YLQstC+INCy0YvQstC+0LTQsCIKKworI34gbXNnaWQgIktleWJvYXJkIEJlZXAiCisjfiBtc2dzdHIgItCe0LfQstGD0YfQutCwINC60LvQsNCy0LjQsNGC0YPRgNGLIgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICLQmNC80LjRgtCw0YbQuNGPINGB0YLQtdGA0LXQviIKKworI34gbXNnaWQgIlN0ZXJlbyIKKyN+IG1zZ3N0ciAi0KHRgtC10YDQtdC+IgorCisjfiBtc2dpZCAiU3Vycm91bmQgU291bmQiCisjfiBtc2dzdHIgItCe0LHRitGR0LzQvdGL0Lkg0LfQstGD0LoiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgItCj0YDQvtCy0LXQvdGMINC80LjQutGA0L7RhNC+0L3QsCIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICLQo9GB0YLRgNC+0LnRgdGC0LLQviDQtNC40L3QsNC80LjQutCwIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgItCj0YHRgtGA0L7QudGB0YLQstC+INC80LjQutGA0L7RhNC+0L3QsCIKKworI34gbXNnaWQgIkphY2siCisjfiBtc2dzdHIgIkphY2siCisKKyN+IG1zZ2lkICJDZW50ZXIgLyBMRkUiCisjfiBtc2dzdHIgItCm0LXQvdGC0YAgLyDQodCw0LHQstGD0YTQtdGAIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAi0KHRgtC10YDQtdC+INC80LjQutGI0LjRgNC+0LLQsNC90LjQtSIKKworI34gbXNnaWQgIk1vbm8gTWl4IgorI34gbXNnc3RyICLQnNC+0L3QviDQvNC40LrRiNC40YDQvtCy0LDQvdC40LUiCisKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgItCc0LjQutGI0LjRgNC+0LLQsNC90LjQtSDQstGF0L7QtNCwIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSAxIgorI34gbXNnc3RyICLQnNC40LrRgNC+0YTQvtC9IDEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDIiCisjfiBtc2dzdHIgItCc0LjQutGA0L7RhNC+0L0gMiIKKworI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICLQptC40YTRgNC+0LLQvtC5INCy0YvRhdC+0LQiCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICLQptC40YTRgNC+0LLQvtC5INCy0YXQvtC0IgorCisjfiBtc2dpZCAiSERNSSIKKyN+IG1zZ3N0ciAiSERNSSIKKworI34gbXNnaWQgIk1vZGVtIgorI34gbXNnc3RyICLQnNC+0LTQtdC8IgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAi0JPQsNGA0L3QuNGC0YPRgNCwIgorCisjfiBtc2dpZCAiT3RoZXIiCisjfiBtc2dzdHIgItCU0YDRg9Cz0L7QuSIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgItCd0LjRh9C10LPQviIKKworI34gbXNnaWQgIk9uIgorI34gbXNnc3RyICLQktC60LsiCisKKyN+IG1zZ2lkICJPZmYiCisjfiBtc2dzdHIgItCS0YvQutC7IgorCisjfiBtc2dpZCAiTXV0ZSIKKyN+IG1zZ3N0ciAi0JfQsNCz0LvRg9GI0LjRgtGMIgorCisjfiBtc2dpZCAiRmFzdCIKKyN+IG1zZ3N0ciAi0KHQutC+0YDQvtGB0YLRjCIKKworI34gbXNnaWQgIlZlcnkgTG93IgorI34gbXNnc3RyICLQntGH0LXQvdGMINC90LjQt9C60L7QtSIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAi0J3QuNC30LrQvtC1IgorCisjfiBtc2dpZCAiTWVkaXVtIgorI34gbXNnc3RyICLQodGA0LXQtNC90LXQtSIKKworI34gbXNnaWQgIkhpZ2giCisjfiBtc2dzdHIgItCS0YvRgdC+0LrQvtC1IgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICLQntGH0LXQvdGMINCy0YvRgdC+0LrQvtC1IgorCisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAi0JLRi9C00LDRh9CwIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTWljcm9waG9uZSIKKyN+IG1zZ3N0ciAi0JzQuNC60YDQvtGE0L7QvSDQvdCwINC/0LXRgNC10LTQvdC10Lkg0L/QsNC90LXQu9C4IgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBJbiIKKyN+IG1zZ3N0ciAi0JvQuNC90LXQudC90YvQuSDQstGF0L7QtCDQvdCwINC/0LXRgNC10LTQvdC10Lkg0L/QsNC90LXQu9C4IgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAi0J3QsNGD0YjQvdC40LrQuCDQvdCwINC/0LXRgNC10LTQvdC10Lkg0L/QsNC90LXQu9C4IgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBPdXQiCisjfiBtc2dzdHIgItCb0LjQvdC10LnQvdGL0Lkg0LLRi9GF0L7QtCDQvdCwINC/0LXRgNC10LTQvdC10Lkg0L/QsNC90LXQu9C4IgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICLQl9C10LvRkdC90YvQuSDRgNCw0LfRitGR0LwiCisKKyN+IG1zZ2lkICJQaW5rIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0KDQvtC30L7QstGL0Lkg0YDQsNC30YrRkdC8IgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCh0LjQvdC40Lkg0YDQsNC30YrRkdC8IgorCisjfiBtc2dpZCAiV2hpdGUgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQkdC10LvRi9C5INGA0LDQt9GK0ZHQvCIKKworI34gbXNnaWQgIkJsYWNrIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0KfRkdGA0L3Ri9C5INGA0LDQt9GK0ZHQvCIKKworI34gbXNnaWQgIkdyYXkgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQodC10YDRi9C5INGA0LDQt9GK0ZHQvCIKKworI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCe0YDQsNC90LbQtdCy0YvQuSDRgNCw0LfRitGR0LwiCisKKyN+IG1zZ2lkICJSZWQgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQmtGA0LDRgdC90YvQuSDRgNCw0LfRitGR0LwiCisKKyN+IG1zZ2lkICJZZWxsb3cgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQltGR0LvRgtGL0Lkg0YDQsNC30YrRkdC8IgorCisjfiBtc2dpZCAiR3JlZW4gRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQl9C10LvRkdC90YvQuSDRgNCw0LfRitGR0Lwg0L3QsCDQv9C10YDQtdC00L3QtdC5INC/0LDQvdC10LvQuCIKKworI34gbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQoNC+0LfQvtCy0YvQuSDRgNCw0LfRitGR0Lwg0L3QsCDQv9C10YDQtdC00L3QtdC5INC/0LDQvdC10LvQuCIKKworI34gbXNnaWQgIkJsdWUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQodC40L3QuNC5INGA0LDQt9GK0ZHQvCDQvdCwINC/0LXRgNC10LTQvdC10Lkg0L/QsNC90LXQu9C4IgorCisjfiBtc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQkdC10LvRi9C5INGA0LDQt9GK0ZHQvCDQvdCwINC/0LXRgNC10LTQvdC10Lkg0L/QsNC90LXQu9C4IgorCisjfiBtc2dpZCAiQmxhY2sgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQp9GR0YDQvdGL0Lkg0YDQsNC30YrRkdC8INC90LAg0L/QtdGA0LXQtNC90LXQuSDQv9Cw0L3QtdC70LgiCisKKyN+IG1zZ2lkICJHcmF5IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0KHQtdGA0YvQuSDRgNCw0LfRitGR0Lwg0L3QsCDQv9C10YDQtdC00L3QtdC5INC/0LDQvdC10LvQuCIKKworI34gbXNnaWQgIk9yYW5nZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCe0YDQsNC90LbQtdCy0YvQuSDRgNCw0LfRitGR0Lwg0L3QsCDQv9C10YDQtdC00L3QtdC5INC/0LDQvdC10LvQuCIKKworI34gbXNnaWQgIlJlZCBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCa0YDQsNGB0L3Ri9C5INGA0LDQt9GK0ZHQvCDQvdCwINC/0LXRgNC10LTQvdC10Lkg0L/QsNC90LXQu9C4IgorCisjfiBtc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0JbRkdC70YLRi9C5INGA0LDQt9GK0ZHQvCDQvdCwINC/0LXRgNC10LTQvdC10Lkg0L/QsNC90LXQu9C4IgorCisjfiBtc2dpZCAiU3ByZWFkIE91dHB1dCIKKyN+IG1zZ3N0ciAi0KDQsNC30LLRkdGA0L3Rg9GC0YvQuSDQstGL0LLQvtC0IgorCisjfiBtc2dpZCAiRG93bm1peCIKKyN+IG1zZ3N0ciAi0J3QuNC30LLQtdC00LXQvdC40LUiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIElucHV0IgorI34gbXNnc3RyICLQktGF0L7QtCDQstC40YDRgtGD0LDQu9GM0L3QvtCz0L4g0LzQuNC60YjQtdGA0LAiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKKyN+IG1zZ3N0ciAi0JLRi9GF0L7QtCDQstC40YDRgtGD0LDQu9GM0L3QvtCz0L4g0LzQuNC60YjQtdGA0LAiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICLQmtCw0L3QsNC70Ysg0LLQuNGA0YLRg9Cw0LvRjNC90L7Qs9C+INC80LjQutGI0LXRgNCwIgorCisjfiBtc2dpZCAiJXMgJWQgRnVuY3Rpb24iCisjfiBtc2dzdHIgItCk0YPQvdC60YbQuNGPICVzICVkIgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgItCk0YPQvdC60YbQuNGPICVzIgorCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAi0J/QvtC70YPRh9C10L0g0L3QtdC+0LbQuNC00LDQvdC90YvQuSDRgNCw0LfQvNC10YAg0LrQsNC00YDQsDogJXUg0LLQvNC10YHRgtC+ICV1LiIKKworI34gbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgb24gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLQntGI0LjQsdC60LAg0YfRgtC10L3QuNGPICVkINCx0LDQudGCINC40Lcg0YPRgdGC0YDQvtC50YHRgtCy0LAgwqslc8K7LiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlbnF1ZXVlIGJ1ZmZlcnMgaW4gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINC00L7QsdCw0LLQuNGC0Ywg0LIg0L7Rh9C10YDQtdC00Ywg0LHRg9GE0LXRgNGLINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuyIKKworI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAi0J7RiNC40LHQutCwINC/0YDQuCDQv9C+0L/Ri9GC0LrQtSDQv9C+0LvRg9GH0LXQvdC40Y8g0LrQsNC00YDQvtCyINCy0LjQtNC10L4g0YEg0YPRgdGC0YDQvtC50YHRgtCy0LAgwqslc8K7LiIKKworI34gbXNnaWQgIkZhaWxlZCBhZnRlciAlZCB0cmllcy4gZGV2aWNlICVzLiBzeXN0ZW0gZXJyb3I6ICVzIgorI34gbXNnc3RyICLQntGI0LjQsdC60LAg0L/QvtGB0LvQtSAlZCDQv9C+0L/Ri9GC0L7Qui4g0KPRgdGC0YDQvtC50YHRgtCy0L46ICVzLiDQodC40YHRgtC10LzQvdCw0Y8g0L7RiNC40LHQutCwOiAlcyIKKworI34gbXNnaWQgIiIKKyN+ICJUaGUgYnVmZmVyIHR5cGUgaXMgbm90IHN1cHBvcnRlZCwgb3IgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMsIG9yIG5vICIKKyN+ICJidWZmZXJzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgeWV0LCBvciB0aGUgdXNlcnB0ciBvciBsZW5ndGggYXJlIGludmFsaWQuICIKKyN+ICJkZXZpY2UgJXMiCisjfiBtc2dzdHIgIiIKKyN+ICLQndC10L/QvtC00LTQtdGA0LbQuNCy0LDQtdC80YvQuSDRgtC40L8g0LHRg9GE0LXRgNCwLCDQu9C40LHQviDQuNC90LTQtdC60YEg0LLQvdC1INC00LjQsNC/0LDQt9C+0L3QsCwg0LvQuNCx0L4g0LHRg9GE0LXRgNGLINC90LUgIgorI34gItCx0YvQu9C4INGA0LDRgdC/0YDQtdC00LXQu9C10L3Riywg0LvQuNCx0L4g0L3QtdCy0LXRgNC90YvQtSDQt9C90LDRh9C10L3QuNGPINC00LvQuNC90Ysg0LjQu9C4IHVzZXJwdHIgKNGD0YHRgtGA0L7QudGB0YLQstC+ICIKKyN+ICIlcykiCisKKyN+IG1zZ2lkICIiCisjfiAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIE5vdCBlbm91Z2ggbWVtb3J5LiIKKyN+IG1zZ3N0ciAiIgorI34gItCe0YjQuNCx0LrQsCDQv9GA0Lgg0L/QvtC/0YvRgtC60LUg0L/QvtC70YPRh9C10L3QuNGPINC60LDQtNGA0L7QsiDQstC40LTQtdC+INGBINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuy4g0J3QtSDRhdCy0LDRgtCw0LXRgiAiCisjfiAi0L/QsNC80Y/RgtC4LiIKKworI34gbXNnaWQgImluc3VmZmljaWVudCBtZW1vcnkgdG8gZW5xdWV1ZSBhIHVzZXIgcG9pbnRlciBidWZmZXIuIGRldmljZSAlcy4iCisjfiBtc2dzdHIgIiIKKyN+ICLQvdC1INGF0LLQsNGC0LDQtdGCINC/0LDQvNGP0YLQuCDQtNC70Y8g0L/QvtGB0YLQsNC90L7QstC60Lgg0LIg0L7Rh9C10YDQtdC00Ywg0LHRg9GE0LXRgNCwINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjNGB0LrQvtCz0L4gIgorI34gItGD0LrQsNC30LDRgtC10LvRjyAo0YPRgdGC0YDQvtC50YHRgtCy0L4gJXMpIgorCisjfiBtc2dpZCAiTm8gZnJlZSBidWZmZXJzIGZvdW5kIGluIHRoZSBwb29sIGF0IGluZGV4ICVkLiIKKyN+IG1zZ3N0ciAi0JIg0L/Rg9C70LUg0L3QtSDQvdCw0LnQtNC10L3QviDRgdCy0L7QsdC+0LTQvdGL0YUg0LHRg9GE0LXRgNC+0LIg0LTQu9GPINC40L3QtNC10LrRgdCwICVkLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBnZXQgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAi0J3QtSDRg9C00LDQu9C+0YHRjCDQv9C+0LvRg9GH0LjRgtGMINCx0YPRhNC10YDRiyDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsiCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZ2V0IGVub3VnaCBidWZmZXJzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINC/0L7Qu9GD0YfQuNGC0Ywg0L3QtdC+0LHRhdC+0LTQuNC80L7QtSDQutC+0LvQuNGH0LXRgdGC0LLQviDQsdGD0YTQtdGA0L7QsiDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsiCisKKyN+IG1zZ2lkICJFcnJvciBzdGFydGluZyBzdHJlYW1pbmcgY2FwdHVyZSBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAi0J7RiNC40LHQutCwINC/0YDQuCDQt9Cw0L/Rg9GB0LrQtSDQv9C+0YLQvtC60L7QstC+0LPQviDQt9Cw0YXQstCw0YLQsCDRgSDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsuIgorCisjfiBtc2dpZCAiRXJyb3Igc3RvcHBpbmcgc3RyZWFtaW5nIGNhcHR1cmUgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgItCe0YjQuNCx0LrQsCDQv9GA0Lgg0L7RgdGC0LDQvdC+0LLQutC1INC/0L7RgtC+0LrQvtCy0L7Qs9C+INC30LDRhdCy0LDRgtCwINGBINGD0YHRgtGA0L7QudGB0YLQstCwIMKrJXPCuy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgcmVhZCBmcm9tIENELiIKKyN+IG1zZ3N0ciAi0J3QtSDRg9C00LDQu9C+0YHRjCDQv9GA0L7Rh9C40YLQsNGC0YwgQ0QuIgorCisjfiBtc2dpZCAiRGlzYyBpcyBub3QgYW4gQXVkaW8gQ0QuIgorI34gbXNnc3RyICLQlNC40YHQuiDQvdC1INGP0LLQu9GP0LXRgtGB0Y8g0LDRg9C00LjQvi1DRC4iCisKKyN+IG1zZ2lkICJUaGlzIGZpbGUgaXMgZW5jcnlwdGVkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKKyN+IG1zZ3N0ciAi0KTQsNC50Lsg0LfQsNGI0LjRhNGA0L7QstCw0L0g0Lgg0L3QtSDQvNC+0LbQtdGCINCx0YvRgtGMINCy0L7RgdC/0YDQvtC40LfQstC10LTRkdC9LiIKKworI34gbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcy4nIgorI34gbXNnc3RyICLQntGI0LjQsdC60LAg0L/QvtC70YPRh9C10L3QuNGPINCw0YLRgNC40LHRg9GC0L7QsiDRg9C/0YDQsNCy0LvQtdC90LjRjyDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IHNldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorI34gbXNnc3RyICLQndC1INGD0LTQsNC70L7RgdGMINGD0YHRgtCw0L3QvtCy0LjRgtGMINC/0LDRgNCw0LzQtdGC0YDRiyDRg9GB0YLRgNC+0LnRgdGC0LLQsCDCqyVzwrsiCisKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZC8lZCBmcmFtZXMgcGVyIHNlY29uZCIKKyN+IG1zZ3N0ciAiIgorI34gItCj0YHRgtGA0L7QudGB0YLQstC+IMKrJXPCuyDQvdC1INC80L7QttC10YIg0L7RgdGD0YnQtdGB0YLQstC40YLRjCDQt9Cw0YXQstCw0YIg0L/RgNC4ICVkLyVkINC60LDQtNGA0LDRhSDQsiDRgdC10LrRg9C90LTRgyIKZGlmZiAtLWdpdCBhL3BvL3NrLnBvIGIvcG8vc2sucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRmN2RkNwotLS0gL2Rldi9udWxsCisrKyBiL3BvL3NrLnBvCkBAIC0wLDAgKzEsOTI1IEBACisjIFNsb3ZhayB0cmFuc2xhdGlvbnMgZm9yIGdzdC1wbHVnaW5zLWdvb2QuCisjIFRoaXMgZmlsZSBpcyBwdXQgaW4gdGhlIHB1YmxpYyBkb21haW4uCisjCisjIFBldGVyIFR1aMOhcnNreSA8dHVoYXJza3lAbWlzYmIuc2s+LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDE0LCAyMDE2LgorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZCAxLjcuMlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDE2LTA1LTIwIDEyOjMxKzAxMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IFBldGVyIFR1aMOhcnNreSA8dHVoYXJza3lAbWlzYmIuc2s+XG4iCisiTGFuZ3VhZ2UtVGVhbTogU2xvdmFrIDxzay1pMThuQGxpc3RzLmxpbnV4LnNrPlxuIgorIkxhbmd1YWdlOiBza1xuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIlBsdXJhbC1Gb3JtczogbnBsdXJhbHM9MzsgcGx1cmFsPShuPT0xKSA/IDAgOiAobj49MiAmJiBuPD00KSA/IDEgOiAyO1xcbjtcbiIKKyJYLUdlbmVyYXRvcjogUG9lZGl0IDEuNi4xMFxuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICJKYWNrIHNlcnZlciBzYSBuZW5hxaFpZWwiCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIk5lcG9kYXJpbG8gc2EgZGVrw7Nkb3ZhxaUgb2Jyw6F6b2sgSlBFRyIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiJyVzJyBvZCAnJXMnIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJOZXBvZGFyaWxvIHNhIHByaXBvamnFpSBrIHNlcnZlcnUiCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiTmVib2xvIG5hc3RhdmVuw6kgVVJMLiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiTmVwb2RhcmlsbyBzYSBwcmVsb8W+acWlIG7DoXpvdiBzZXJ2ZXJhLiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJOZXBvZGFyaWxvIHNhIG5hZHZpYXphxaUgc3BvamVuaWUgc28gc2VydmVyb20uIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiTmFzdGF2ZW5pZSBiZXpwZcSNbsOpaG8gcHJpcG9qZW5pYSB6bHloYWxvLiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIlZ5c2t5dGxhIHNhIHNpZcWlb3bDoSBjaHliYSwgYWxlYm8gc2VydmVyIG5lxI1ha2FuZSB1emF2cmVsIHNwb2plbmllLiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiU2VydmVyIG9kb3NsYWwgY2h5Ym7DqSDDumRhamUuIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIlNlcnZlciBuZXBvZHBvcnVqZSB6bWVudSBwb3rDrWNpZSIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAixb1pYWRueSBhbGVibyBjaHlibsO9IHZzdHVwIHp2dWt1LCBwcsO6ZCDDumRham92IEFWSSBidWRlIHBvxaFrb2RlbsO9LiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAiVGVudG8gc8O6Ym9yIG5lb2JzYWh1amUgxb5pYWRuZSBwcmVocmF0ZcS+bsOpIHByw7pkeSDDumRham92LiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiVGVudG8gc8O6Ym9yIGplIGNoeWJuw70gYSBuZWTDoSBzYSBwcmVocmHFpS4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiIgorIlByw7pkIMO6ZGFqb3Ygc2EgbmVkw6EgcHJlaHJhxaUgcHJldG/FvmUgamUgxaFpZnJvdmFuw70gcG9tb2NvdSBQbGF5UmVhZHkgRFJNLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiVGVudG8gc8O6Ym9yIGplIHBvxaFrb2RlbsO9IGEgbmVkw6Egc2EgcHJlaHJhxaUuIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICJOZXNwcsOhdm5hIGF0b21pY2vDoSB2ZcS+a29zxaUuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJUZW50byBzw7pib3IgamUgbmXDunBsbsO9IGEgbmVkw6Egc2EgcHJlaHJhxaUuIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICJWaWRlbyB2IHRvbXRvIHPDumJvcmUgbW/Fvm5vIG5lYnVkZSBocmHFpSBrb3Jla3RuZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiVGVudG8gc8O6Ym9yIG9ic2FodWplIHByw61sacWhIG1ub2hvIHByw7pkb3Ygw7pkYWpvdi4gUHJlaHLDoXZhbSBpYmEgcHJ2w70gJWQiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIk5lbmHFoWllbCBzYSDFvmlhZGVuIHBvZHBvcm92YW7DvSBwcsO6ZCDDumRham92LiBNb8W+bm8gamUgcG90cmVibsOpIG5haW7FoXRhbG92YcWlICIKKyJ6w6FzdXZuw70gbW9kdWwgR1N0cmVhbWVyIFJUU1AgcHJlIHByw7pkeSBSZWFsIG1lZGlhLi4iCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKyJOZW5hxaFpZWwgc2Egxb5pYWRlbiBwb2Rwb3JvdmFuw70gcHLDumQgw7pkYWpvdi4gTW/Fvm5vIGJ5IHN0ZSBtYWxpIHBvdm9sacWlICIKKyJ2aWFjZXJvIHByZW5vc292w71jaCBwcm90b2tvbG92LCBhbGVibyB2w6FtIG1vxb5ubyBjaMO9YmEgc3Byw6F2bnkgesOhc3V2bsO9IG1vZHVsICIKKyJHU3RyZWFtZXIgUlRTUC4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiTmVwb2RhcmlsbyBzYSBvdHZvcmnFpSB6dnVrb3bDqSB6YXJpYWRlbmllIHYgcmXFvmltZSBwcmVocsOhdmFuaWEuIFphcmlhZGVuaWUgdcW+ICIKKyJwb3XFvsOtdmEgaW7DoSBhcGxpa8OhY2lhLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiTmVwb2RhcmlsbyBzYSBvdHZvcmnFpSB6dnVrb3bDqSB6YXJpYWRlbmllIHYgcmXFvmltZSBwcmVocsOhdmFuaWEuIE5lbcOhdGUgIgorIm9wcsOhdm5lbmllIG5hIG90dm9yZW5pZSB0b2h0byB6YXJpYWRlbmlhLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICJOZXBvZGFyaWxvIHNhIG90dm9yacWlIHp2dWtvdsOpIHphcmlhZGVuaWUgdnJlxb5pbWUgcHJlaHLDoXZhbmlhLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIiIKKyJOZXBvZGFyaWxvIHNhIG90dm9yacWlIHp2dWtvdsOpIHphcmlhZGVuaWUgdiByZcW+aW1lIHByZWhyw6F2YW5pYS4gVGVudG8gcHJ2b2sgIgorIm5lcG9kcG9ydWplIHTDunRvIHZlcnppdSBPcGVuIFNvdW5kIFN5c3RlbS4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiVG90byB6dnVrb3bDqSB6YXJpYWRlbmllIG5lcG9kcG9ydWplIHByZWhyw6F2YW5pZS4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIkNoeWJhIHByZWhyw6F2YW5pYSB6dnVrdS4iCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIlRvdG8genZ1a292w6kgemFyaWFkZW5pZSBuZXBvZHBvcnVqZSBuYWhyw6F2YW5pZS4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJDaHliYSBwcmkgbmFocsOhdmFuw60gem8genZ1a292w6lobyB6YXJpYWRlbmlhLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIk5lcG9kYXJpbG8gc2Egb3R2b3JpxaUgenZ1a292w6kgemFyaWFkZW5pZSB2IHJlxb5pbWUgbmFocsOhdmFuaWEuIE5lbcOhdGUgIgorIm9wcsOhdm5lbmllIG5hIG90dm9yZW5pZSB0b2h0byB6YXJpYWRlbmlhLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiTmVwb2RhcmlsbyBzYSBvdHZvcmnFpSB6dnVrb3bDqSB6YXJpYWRlbmllIHYgcmXFvmltZSBuYWhyw6F2YW5pYS4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICIiCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICJaZHJvaiB6w6F6bmFtdSIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pa3JvZsOzbiIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIkxpbmtvdsO9IHZzdHVwIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIlZuw7p0b3JuZSBDRCIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJTUERJRiB2c3R1cCIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICJBVVggMSB2c3R1cCIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJBVVggMiB2c3R1cCIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJTcMOkdG7DoSBzbHXEjWthIGtvZGVrdSIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiU3DDpHRuw6Egc2x1xI1rYSBTdW5WVFMiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIkhsYXNpdG9zxaUiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJaaXNrIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiTW9uaXRvciIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIlBDIHJlcHJvZHVrdG9yIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICJTbMO6Y2hhZGzDoSIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICJMaW5rb3bDvSB2w71zdHVwIgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJTUERJRiB2w71zdHVwIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICJBVVggMSB2w71zdHVwIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICJBVVggMiB2w71zdHVwIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkNoeWJhIHByaSDEjcOtdGFuw60gJWQgYmFqdG92IHpvIHphcmlhZGVuaWEgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKyJOZXBvZGFyaWxvIHNhIHppc3RpxaUgbW/Fvm7DqSB2aWRlbyBmb3Jtw6F0eSBzIGt0b3LDvW1pIGJ5IHZlZGVsbyBwcmFjb3ZhxaUgIgorInphcmlhZGVuaWUgJyVzJyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTmVwb2RhcmlsbyBzYSBuYW1hcG92YcWlIHZ5cm92bsOhdmFjaXUgcGFtw6TFpSB6YXJpYWRlbmlhICclcyciCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIlRlbnRvIG92bMOhZGHEjSB6YXJpYWRlbmlhICclcycgbmVwb2Rwb3J1amUgSU8gbWV0w7NkdSAlZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIlRlbnRvIG92bMOhZGHEjSB6YXJpYWRlbmlhICclcycgbmVwb2Rwb3J1amUgxb5pYWRudSB6bsOhbXUgSU8gbWV0w7NkdS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiWmFyaWFkZW5pZSAnJXMnIGplIHphbmVwcsOhemRuZW7DqSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiWmFyaWFkZW5pZSAnJXMnIG5ldmllIG5haHLDoXZhxaUgbmEgJWR4JWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIlphcmlhZGVuaWUgJyVzJyBuZWRva8Ohxb5lIG5haHLDoXZhxaUgdiB1dmVkZW5vbSBmb3Jtw6F0ZSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICJaYXJpYWRlbmllICclcycgcG9kcG9ydWplIG5lc3Bvaml0w6kgcm92aW55IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiTmVwb2RhcmlsbyBzYSB6w61za2HFpSBwYXJhbWV0cmUgemFyaWFkZW5pYSAnJXMnIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICJWaWRlbyB6YXJpYWRlbmllIG9kbWlldGxvIG5vdsOpIG5hc3RhdmVuaWUgZnJla3ZlbmNpZSBzbsOtbW9rLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgImlkZW8gemFyaWFkZW5pZSBuZXBvc2t5dGxvIHbDvXN0dXBuw70gZm9ybcOhdC4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAiVmlkZW8gemFyaWFkZW5pZSB1ZMOhdmEgbmVzcHLDoXZuZSByb3ptZXJ5LiIKKworIywgZnV6enkKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICJWaWRlbyB6YXJpYWRlbmllIHBvdcW+w612YSBuZXBvZHBvcm92YW7DuiBtZXTDs2R1IHByZWtsYWRhbmlhIHNuw61tb2suIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIlZpZGVvIHphcmlhZGVuaWUgcG91xb7DrXZhIG5lcG9kcG9yb3ZhbsO9IGZvcm3DoXQgcGl4ZWxvdi4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiTmVwb2RhcmlsbyBzYSBuYXN0YXZpxaUgdm7DunRvcm7DuiBvYmxhc8WlIHZ5cm92bsOhdmFjZWogcGFtw6R0ZS4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIlZpZGVvIHphcmlhZGVuaWUgbmVvZHBvcnXEjWlsbyDFvmlhZG51IHZlxL5rb3PFpSB2eXJvdm7DoXZhY2VqIHBhbcOkdGUuIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOZXBvZGFyaWxvIHNhIHrDrXNrYcWlIG5hc3RhdmVuaWUgcHJpasOtbWHEjWEgJWQgb2QgemFyaWFkZW5pYSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJDaHliYSBwcmkgbmHEjcOtdGFuw60gbW/Fvm5vc3TDrSB6YXJpYWRlbmEgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICJaYXJpYWRlbmllICclcycgbmllIGplIHByaWrDrW1hxI0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiTmVwb2RhcmlsbyBzYSB6w61za2HFpSByb3pobGFzb3bDvSB2c3R1cCBuYSB6YXJpYWRlbsOtICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiTmVwb2RhcmlsbyBzYSBuYXN0YXZpxaUgdnN0dXAgJWQgbmEgemFyaWFkZW7DrSAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5lcG9kYXJpbG8gc2Egem1lbmnFpSBzdGF2IHN0bG1lbmlhIHByZSB6YXJpYWRlbmllICclcycuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJOZXBvZGFyaWxvIHNhIHV2b8S+bmnFpSBkb3N0YXRvayBwYW3DpHRlLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJOZXBvZGFyaWxvIHNhIHV2b8S+bmnFpSBkb3N0YXRvayBwYW3DpHRlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJLb252ZXJ0b3IgbmEgemFyaWFkZW7DrSAlcyBuZXBvZHBvcnVqZSDFvmlhZG55IHZzdHVwbsO9IGZvcm3DoXQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIktvbnZlcnRvciBuYSB6YXJpYWRlbsOtICVzIG5lcG9kcG9ydWplIMW+aWFkbnkgdsO9c3R1cG7DvSBmb3Jtw6F0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJFbmtvZMOpciBuYSB6YXJpYWRlbsOtICVzIG5lcG9kcG9ydWplIMW+aWFkbnkgdnN0dXBuw70gZm9ybcOhdCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIkVua29kw6lyIG5hIHphcmlhZGVuw60gJXMgbmVwb2Rwb3J1amUgxb5pYWRueSB2w71zdHVwbsO9IGZvcm3DoXQiCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiTmVwb2RhcmlsbyBzYSBzcHVzdGnFpSBkZWvDs2RvdmFjaWUgdmzDoWtuby4iCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIk5lcG9kYXJpbG8gc2Egc3ByYWNvdmHFpSBzbsOtbW9rLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJDaHliYSBwcmkgemlzxaVvdmFuw60gc2Nob3Bub3N0w60gemFyaWFkZW5pYSAnJXMnOiBUb3RvIG5pZSBqZSBvdmzDoWRhxI0gdjRsMi4gIgorIlNrb250cm9sdWp0ZSwgxI1pIGplIHRvIG92bMOhZGHEjSB2NGwxLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIk5lcG9kYXJpbG8gc2EgesOtc2thxaUgYXRyaWLDunR5IHZzdHVwdSAlZCB6YXJpYWRlbmlhICVzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5lcG9kYXJpbG8gc2EgesOtc2thxaUgbmFzdGF2ZW5pZSBwcmlqw61tYcSNYSAlZCBvZCB6YXJpYWRlbmlhICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiWmx5aGFsYSBwb8W+aWFkYXZrYSBub3JtIG5hIHphcmlhZGVuw60gJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5lcG9kYXJpbG8gc2EgesOtc2thxaUgYXRyaWLDunR5IG92bMOhZGFjw61jaCBwcnZrb3YgbmEgemFyaWFkZW7DrSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJOZXZpZW0gaWRlbnRpZmlrb3ZhxaUgemFyaWFkZW5pZSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICJUb3RvIG5pZSBqZSB6YXJpYWRlbmllICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiTmVwb2RhcmlsbyBzYSBvdHZvcmnFpSB6YXJpYWRlbmllICclcycgcHJlIMSNw610YW5pZSBhIHrDoXBpcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJaYXJpYWRlbmllICclcycgbmllIGplIHVyxI1lbsOpIHByZSBuYWhyw6F2YW5pZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIlphcmlhZGVuaWUgJyVzJyBuaWUgamUgdXLEjWVuw6kgcHJlIHbDvXN0dXAuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICJaYXJpYWRlbmllICclcycgbmllIGplIHR5cHUgTTJNLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiTmVwb2RhcmlsbyBzYSBvdHZvcmnFpSB6YXJpYWRlbmllICclcycgcHJlIMSNw610YW5pZSBhIHrDoXBpcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIlpseWhhbG8gbmFzdGF2ZW5pZSBub3JtIG5hIHphcmlhZGVuw60gJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJOZXBvZGFyaWxvIHNhIHppc3RpxaUgc8O6xI1hc27DuiBmcmVrdmVuY2l1IHByaWrDrW1hxI1hIHByZSB6YXJpYWRlbmllICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIiIKKyJOZXBvZGFyaWxvIHNhIG5hc3RhdmnFpSBzw7rEjWFzbsO6IGZyZWt2ZW5jaXUgcHJpasOtbWHEjWEgcHJlIHphcmlhZGVuaWUgJyVzJyBuYSAiCisiJWx1IEh6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJOZXBvZGFyaWxvIHNhIHppc3RpxaUgc2lsdSBzaWduw6FsdSBwcmUgemFyaWFkZW5pZSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIk5lcG9kYXJpbG8gc2EgemlzdGnFpSBob2Rub3R1IHByZSBvdmzDoWRhY8OtIHBydm9rICVkIHByZSB6YXJpYWRlbmllICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisiTmVwb2RhcmlsbyBzYSBuYXN0YXZpxaUgaG9kbm90dSAlZCBwcmUgb3Zsw6FkYWPDrSBwcnZvayAlZCBuYSB6YXJpYWRlbsOtICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiTmVwb2RhcmlsbyBzYSB6aXN0acWlIHPDusSNYXNuw70gdnN0dXAgbmEgemFyaWFkZW7DrSAnJXMnLiBNb8W+bm8gamUgdG8gcsOhZGlvLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiTmVwb2RhcmlsbyBzYSB6aXN0acWlIHPDusSNYXNuw70gdsO9c3R1cCBuYSB6YXJpYWRlbsOtICclcycuIE1vxb5ubyBqZSB0byByw6FkaW8uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIk5lcG9kYXJpbG8gc2EgbmFzdGF2acWlIHbDvXN0dXAgJWQgbmEgemFyaWFkZW7DrSAlcy4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICJabWVuYSByb3psw63FoWVuaWEgemEgY2hvZHUgbmllIGplIHphdGlhxL4gcG9kcG9yb3ZhbsOhLiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiTmVtw7TFvmVtIGZ1bmdvdmHFpSBiZXogaG9kw61uIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICJWbsO6dG9ybsOhIGNoeWJhIHByw7pkdSDDumRham92LiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgIlZuw7p0b3Juw6EgY2h5YmEgdG9rdSDDumRham92LiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIk5lcG9kYXJpbG8gc2EgbmFkdmlhemHFpSBzcG9qZW5pZSBzbyB6dnVrb3bDvW0gc2VydmVyb20iCisKKyN+IG1zZ2lkICJGYWlsZWQgdG8gcXVlcnkgc291bmQgc2VydmVyIGNhcGFiaWxpdGllcyIKKyN+IG1zZ3N0ciAiTmVwb2RhcmlsbyBzYSB6aXN0acWlIHNjaG9wbm9zdGkgenZ1a292w6lobyBzZXJ2ZXJhIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAiQmFzeSIKKworI34gbXNnaWQgIlRyZWJsZSIKKyN+IG1zZ3N0ciAiVsO9xaFreSIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICJTeW50ZXRpesOpciIKKworI34gbXNnaWQgIlBDTSIKKyN+IG1zZ3N0ciAiUENNIgorCisjfiBtc2dpZCAiU3BlYWtlciIKKyN+IG1zZ3N0ciAiUmVwcm9kdWt0b3IiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICJMaW5rb3bDvSB2c3R1cCIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJNaXjDqXIiCisKKyN+IG1zZ2lkICJQQ00tMiIKKyN+IG1zZ3N0ciAiUENNLTIiCisKKyN+IG1zZ2lkICJSZWNvcmQiCisjfiBtc2dzdHIgIk5haHLDoXZhbmllIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAiVnN0dXBuw70gemlzayIKKworI34gbXNnaWQgIk91dC1nYWluIgorI34gbXNnc3RyICJWw71zdHVwbsO9IHppc2siCisKKyN+IG1zZ2lkICJMaW5lLTEiCisjfiBtc2dzdHIgIkxpbmthLTEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIkxpbmthLTIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIkxpbmthLTMiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTEiCisjfiBtc2dzdHIgIkRpZ2l0w6FsLTEiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgIkRpZ2l0w6FsLTIiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIkRpZ2l0w6FsLTMiCisKKyN+IG1zZ2lkICJQaG9uZS1pbiIKKyN+IG1zZ3N0ciAiVGVsZWbDs24tdnN0dXAiCisKKyN+IG1zZ2lkICJQaG9uZS1vdXQiCisjfiBtc2dzdHIgIlRlbGVmw7NuLXbDvXN0dXAiCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAiVmlkZW8iCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAiUsOhZGlvIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiTmVwb2RhcmlsbyBzYSBvdHZvcmnFpSB6dnVrb3bDqSB6YXJpYWRlbmllIHYgcmXFvmltZSBvYnNsdWh5IG1peMOpcnUuIgorCisjfiBtc2dpZCAiIgorI34gIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4gVGhpcyB2ZXJzaW9uIG9mICIKKyN+ICJ0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiTmVwb2RhcmlsbyBzYSBvdHZvcmnFpSB6dnVrb3bDqSB6YXJpYWRlbmllIHYgcmXFvmltZSBvYnNsdWh5IG1peMOpcnUuIFTDoXRvICIKKyN+ICJ2ZXJ6aWEgT3BlbiBTb3VuZCBTeXN0ZW0gbmllIGplIHBvZHBvcm92YW7DoSB0w71tdG8gcHJ2a29tLiIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAiSGxhdm7DvSIKKworI34gbXNnaWQgIkZyb250IgorI34gbXNnc3RyICJQcmVkbsO9IgorCisjfiBtc2dpZCAiUmVhciIKKyN+IG1zZ3N0ciAiWmFkbsOpIgorCisjfiBtc2dpZCAiSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiU2zDumNoYWRsw6EiCisKKyN+IG1zZ2lkICJDZW50ZXIiCisjfiBtc2dzdHIgIlN0cmVkbsO9IgorCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICJMRkUiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAiUHJpZXN0b3JvdsO9IgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAiU3RyYW5hIgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAiQVVYIHbDvXN0dXAiCisKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAiM0QgaMS6YmthIgorCisjfiBtc2dpZCAiM0QgQ2VudGVyIgorI34gbXNnc3RyICIzRCBzdHJlZCIKKworI34gbXNnaWQgIjNEIEVuaGFuY2UiCisjfiBtc2dzdHIgIjNEIHZ5bGVwxaFlbmllIgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICJUZWxlZsOzbiIKKworI34gbXNnaWQgIlZpZGVvIEluIgorI34gbXNnc3RyICJWaWRlbyB2c3R1cCIKKworI34gbXNnaWQgIkFVWCBJbiIKKyN+IG1zZ3N0ciAiQVVYIHZzdHVwIgorCisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIlppc2sgesOhem5hbXUiCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAiVsO9c3R1cG7DvSB6aXNrIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAiWm9zaWxuZW5pZSBtaWtyb2bDs251IgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAiRGlhZ25vc3Rpa2EiCisKKyN+IG1zZ2lkICJCYXNzIEJvb3N0IgorI34gbXNnc3RyICJadsO9cmF6bmVuaWUgYmFzb3YiCisKKyN+IG1zZ2lkICJQbGF5YmFjayBQb3J0cyIKKyN+IG1zZ3N0ciAiUHJlaHLDoXZhY2llIHBvcnR5IgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIlZzdHVwIgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIk1vbml0b3IgemRyb2phIgorCisjfiBtc2dpZCAiS2V5Ym9hcmQgQmVlcCIKKyN+IG1zZ3N0ciAiUMOtcG51dGllIGtsw6F2ZXNuaWNlIgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICJTaW11bG92YcWlIHN0ZXJlbyIKKworI34gbXNnaWQgIlN0ZXJlbyIKKyN+IG1zZ3N0ciAiU3RlcmVvIgorCisjfiBtc2dpZCAiU3Vycm91bmQgU291bmQiCisjfiBtc2dzdHIgIlByaWVzdG9yb3bDvSB6dnVrIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBHYWluIgorI34gbXNnc3RyICJaaXNrIG1pa3JvZsOzbnUiCisKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAiWmRyb2ogcmVwcm9kdWt0b3JhIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgIlpkcm9qIG1pa3JvZsOzbnUiCisKKyN+IG1zZ2lkICJKYWNrIgorI34gbXNnc3RyICJKYWNrIgorCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICJTdHJlZCAvIExGRSIKKworI34gbXNnaWQgIlN0ZXJlbyBNaXgiCisjfiBtc2dzdHIgIlN0ZXJlbyBNaXgiCisKKyN+IG1zZ2lkICJNb25vIE1peCIKKyN+IG1zZ3N0ciAiTW9ubyBNaXgiCisKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgIlZzdHVwIE1peCIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAiTWlrcm9mw7NuIDEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDIiCisjfiBtc2dzdHIgIk1pa3JvZsOzbiAyIgorCisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgIkRpZ2l0w6FsbnkgdsO9c3R1cCIKKworI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgIkRpZ2l0w6FsbnkgdnN0dXAiCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk1vZGVtIgorCisjfiBtc2dpZCAiT3RoZXIiCisjfiBtc2dzdHIgIkluw6kiCisKKyN+IG1zZ2lkICJOb25lIgorI34gbXNnc3RyICJOacSNIgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgIlphcG51dMOpIgorCisjfiBtc2dpZCAiT2ZmIgorI34gbXNnc3RyICJWeXBudXTDqSIKKworI34gbXNnaWQgIk11dGUiCisjfiBtc2dzdHIgIlN0bG1pxaUiCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICJSw71jaGxvIgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgIlZlxL5taSBuw616a2UiCisKKyN+IG1zZ2lkICJMb3ciCisjfiBtc2dzdHIgIk7DrXprZSIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAiU3RyZWRuw6kiCisKKyN+IG1zZ2lkICJIaWdoIgorI34gbXNnc3RyICJWeXNva8OpIgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICJWZcS+bWkgdnlzb2vDqSIKKworI34gbXNnaWQgIlByb2R1Y3Rpb24iCisjfiBtc2dzdHIgIlByb2R1a2NpYSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIE1pY3JvcGhvbmUiCisjfiBtc2dzdHIgIk1pa3JvZsOzbiBuYSBwcmVkbm9tIHBhbmVsaSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgSW4iCisjfiBtc2dzdHIgIkxpbmtvdsO9IHZzdHVwIG5hIHByZWRub20gcGFuZWxpIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiU2zDumNoYWRsw6EgbmEgcHJlZG5vbSBwYW5lbGkiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIE91dCIKKyN+IG1zZ3N0ciAiTGlua292w70gdsO9c3R1cCBuYSBwcmVkbm9tIHBhbmVsaSIKKworI34gbXNnaWQgIkdyZWVuIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiWmVsZW7DvSBrb25la3RvciIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICJSdcW+b3bDvSBrb25la3RvciIKKworI34gbXNnaWQgIkJsdWUgQ29ubmVjdG9yIgorI34gbXNnc3RyICJNb2Ryw70ga29uZWt0b3IiCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkJpZWx5IGtvbmVrdG9yIgorCisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICLEjGllcm55IGtvbmVrdG9yIgorCisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIsWgZWTDvSBrb25la3RvciIKKworI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk9yYW7Fvm92w70ga29uZWt0b3IiCisKKyN+IG1zZ2lkICJSZWQgQ29ubmVjdG9yIgorI34gbXNnc3RyICLEjGVydmVuw70ga29uZWt0b3IiCisKKyN+IG1zZ2lkICJZZWxsb3cgQ29ubmVjdG9yIgorI34gbXNnc3RyICLFvWx0w70ga29uZWt0b3IiCisKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlplbGVuw70ga29uZWt0b3IgbmEgcHJlZG5vbSBwYW5lbGkiCisKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUnXFvm92w70ga29uZWt0b3IgbmEgcHJlZG5vbSBwYW5lbGkiCisKKyN+IG1zZ2lkICJCbHVlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiTW9kcsO9IGtvbmVrdG9yIG5hIHByZWRub20gcGFuZWxpIgorCisjfiBtc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJCaWVseSBrb25la3RvciBuYSBwcmVkbm9tIHBhbmVsaSIKKworI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAixIxpZXJueSBrb25la3RvciBuYSBwcmVkbm9tIHBhbmVsaSIKKworI34gbXNnaWQgIkdyYXkgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLFoGVkw70ga29uZWt0b3IgbmEgcHJlZG5vbSBwYW5lbGkiCisKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJPcmFuxb5vdsO9IGtvbmVrdG9yIG5hIHByZWRub20gcGFuZWxpIgorCisjfiBtc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAixIxlcnZlbsO9IGtvbmVrdG9yIG5hIHByZWRub20gcGFuZWxpIgorCisjfiBtc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAixb1sdMO9IGtvbmVrdG9yIG5hIHByZWRub20gcGFuZWxpIgorCisjfiBtc2dpZCAiU3ByZWFkIE91dHB1dCIKKyN+IG1zZ3N0ciAiUm96ZGVsacWlIHbDvXN0dXAiCisKKyN+IG1zZ2lkICJEb3dubWl4IgorI34gbXNnc3RyICJabWllxaFhbmllIgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBJbnB1dCIKKyN+IG1zZ3N0ciAiVnN0dXAgdmlydHXDoWxuZWhvIG1peMOpcmEiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKKyN+IG1zZ3N0ciAiVsO9c3R1cCB2aXJ0dcOhbG5laG8gbWl4w6lyYSIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCisjfiBtc2dzdHIgIkthbsOhbHkgdmlydHXDoWxuZWhvIG1peMOpcmEiCisKKyN+IG1zZ2lkICIlcyAlZCBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMgJWQgZnVua2NpYSIKKworI34gbXNnaWQgIiVzIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyBmdW5rY2lhIgorCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAiTmFzdGFsYSBuZW/EjWFrw6F2YW7DoSB2ZcS+a29zxaUgc27DrW1reSAldSBuYW1pZXN0byAldS4iCisKKyN+IG1zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIG9uIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiQ2h5YmEgcHJpIMSNw610YW7DrSAlZCBiYWp0b3YgbmEgemFyaWFkZW7DrSAnJXMnLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlbnF1ZXVlIGJ1ZmZlcnMgaW4gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJOZXBvZGFyaWxvIHNhIHphcmFkacWlIHZ5cm92bsOhdmFjaXUgcGFtw6TFpSBuYSB6YXJpYWRlbsOtICclcycuIgorCisjfiBtc2dpZCAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJOZXBvZGFyaWxvIHNhIHrDrXNrYcWlIHZpZGVvc27DrW1reSB6byB6YXJpYWRlbmlhICclcycuIgorCisjfiBtc2dpZCAiRmFpbGVkIGFmdGVyICVkIHRyaWVzLiBkZXZpY2UgJXMuIHN5c3RlbSBlcnJvcjogJXMiCisjfiBtc2dzdHIgIk5lcG9kYXJpbG8gc2EgcG8gJWQgcG9rdXNvY2guIFphcmlhZGVuaWUgJXMuIFN5c3TDqW1vdsOhIGNoeWJhOiAlcyIKKworI34gbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcy4nIgorI34gbXNnc3RyICJOZXBvZGFyaWxvIHNhIHrDrXNrYcWlIGF0cmliw7p0eSBvdmzDoWRhY8OtY2ggcHJ2a292IG5hIHphcmlhZGVuw60gJyVzLiciCisKKyN+IG1zZ2lkICIiCisjfiAiVGhlIGJ1ZmZlciB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzLCBvciBubyAiCisjfiAiYnVmZmVycyBoYXZlIGJlZW4gYWxsb2NhdGVkIHlldCwgb3IgdGhlIHVzZXJwdHIgb3IgbGVuZ3RoIGFyZSBpbnZhbGlkLiAiCisjfiAiZGV2aWNlICVzIgorI34gbXNnc3RyICIiCisjfiAiVGVudG8gdHlwIHZ5cm92bsOhdmFjZWogcGFtw6R0ZSBuaWUgamUgcG9kcG9yb3ZhbsO9LCBhbGVibyBqZSB0ZW50byBpbmRleCAiCisjfiAibWltbyBtZWR6w60sIGFsZWJvIHphdGlhxL4gbmVib2xhIGFsb2tvdmFuw6Egxb5pYWRuYSB2eXJvdm7DoXZhY2lhIHBhbcOkxaUsICIKKyN+ICJhbGVibyB1c2VycHRyIGFsZWJvIGTEusW+a2Egc8O6IGNoeWJuw6kuIFphcmlhZGVuaWUgJXMiCisKKyN+IG1zZ2lkICIiCisjfiAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIE5vdCBlbm91Z2ggbWVtb3J5LiIKKyN+IG1zZ3N0ciAiIgorI34gIk5lcG9kYXJpbG8gc2EgesOtc2thxaUgdmlkZW9zbsOtbWt5IHpvIHphcmlhZGVuaWEgJyVzJy4gTmVkb3N0YXRvayBwYW3DpHRlLiIKKworI34gbXNnaWQgImluc3VmZmljaWVudCBtZW1vcnkgdG8gZW5xdWV1ZSBhIHVzZXIgcG9pbnRlciBidWZmZXIuIGRldmljZSAlcy4iCisjfiBtc2dzdHIgIiIKKyN+ICJuZWRvc3RhdG9rIHBhbcOkdGUgcHJlIHphcmFkZW5pZSBwb8W+aWFkYXZreSBuYSBwb3XFvsOtdmF0ZcS+c2vDuiB2eXJvdm7DoXZhY2l1ICIKKyN+ICJwYW3DpMWlIHVrYXpvdmF0ZcS+YS4gemFyaWFkZW5pZSAlcy4iCisKKyN+IG1zZ2lkICJObyBmcmVlIGJ1ZmZlcnMgZm91bmQgaW4gdGhlIHBvb2wgYXQgaW5kZXggJWQuIgorI34gbXNnc3RyICIiCisjfiAiTmVuYcWhbGkgc2Egxb5pYWRuZSB2b8S+bsOpIG9ibGFzdGkgdnlyb3Zuw6F2YWNlaSBwYW3DpHRlIHYgYmxva3UgbmEgaW5kZXhlICVkLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBnZXQgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiTmVwb2RhcmlsbyBzYSB6w61za2HFpSB2eXJvdm7DoXZhY2l1IHBhbcOkxaUgb2QgemFyaWFkZW5pYSAnJXMnLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBnZXQgZW5vdWdoIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIiIKKyN+ICJOZXBvZGFyaWxvIHNhIHrDrXNrYcWlIGRvc3RhdG9rIHZ5cm92bsOhdmFjZWogcGFtw6R0ZSBvZCB6YXJpYWRlbmlhICclcycuIgorCisjfiBtc2dpZCAiRXJyb3Igc3RhcnRpbmcgc3RyZWFtaW5nIGNhcHR1cmUgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkNoeWJhIHByaSDFoXRhcnRvdmFuw60gemFjaHl0w6F2YW5pYSBwcsO6ZHUgw7pkYWpvdiB6byB6YXJpYWRlbmlhICclcycuIgorCisjfiBtc2dpZCAiRXJyb3Igc3RvcHBpbmcgc3RyZWFtaW5nIGNhcHR1cmUgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkNoeWJhIHByaSB6YXN0YXZvdmFuw60gemFjaHl0w6F2YW5pYSBwcsO6ZHUgw7pkYWpvdiB6byB6YXJpYWRlbmlhICclcycuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IHJlYWQgZnJvbSBDRC4iCisjfiBtc2dzdHIgIk5lcG9kYXJpbG8gc2EgxI3DrXRhxaUgeiBDRC4iCisKKyN+IG1zZ2lkICJEaXNjIGlzIG5vdCBhbiBBdWRpbyBDRC4iCisjfiBtc2dzdHIgIlRlbnRvIGRpc2sgbmllIGplIHp2dWtvdsOpIENELiIKKworI34gbXNnaWQgIlRoaXMgZmlsZSBpcyBlbmNyeXB0ZWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorI34gbXNnc3RyICJUZW50byBzw7pib3IgamUgemHFoWlmcm92YW7DvSBhIG5lZMOhIHNhIHByZWhyYcWlLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBzZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKKyN+IG1zZ3N0ciAiTmVwb2RhcmlsbyBzYSBuYXN0YXZpxaUgcGFyYW1ldHJlIHphcmlhZGVuaXUgJyVzJyIKKworI34gbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkLyVkIGZyYW1lcyBwZXIgc2Vjb25kIgorI34gbXNnc3RyICJaYXJpYWRlbmllICclcycgbmVkb2vDocW+ZSB6YWNoeXTDoXZhxaUgcHJpICVkLyVkIHNuw61ta2FjaCB6YSBzZWt1bmR1IgorCisjfiBtc2dpZCAiQ291bGQgbm90IGV4Y2hhbmdlIGRhdGEgd2l0aCBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIk5lcG9kYXJpbGEgc2EgdsO9bWVuYSDDumRham92IHNvIHphcmlhZGVuw61tICclcycuIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBpbnB1dCBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiT3Bpc3VqZSB2eWJyYW7DvSB2c3R1cG7DvSBwcnZvay4iCisKKyN+IG1zZ2lkICJEZXNjcmliZXMgdGhlIHNlbGVjdGVkIG91dHB1dCBlbGVtZW50IGZvciBBdWRpby9WaWRlbyBDb25mZXJlbmNpbmcuIgorI34gbXNnc3RyICJPcGlzdWplIHZ5YnJhbsO9IHbDvXN0dXBuw70gcHJ2b2sgcHJlIGhsYXNvdsOpL3ZpZGVvIGtvbmZlcmVuY2llLiIKKworI34gbXNnaWQgIkRlc2NyaWJlcyB0aGUgc2VsZWN0ZWQgb3V0cHV0IGVsZW1lbnQgZm9yIE11c2ljIGFuZCBNb3ZpZXMuIgorI34gbXNnc3RyICJPcGlzdWplIHZ5YnJhbsO9IHbDvXN0dXBuw70gcHJ2b2sgcHJlIGh1ZGJ1IGEgZmlsbXkuIgorCisjfiBtc2dpZCAiRGVzY3JpYmVzIHRoZSBzZWxlY3RlZCBvdXRwdXQgZWxlbWVudC4iCisjfiBtc2dzdHIgIk9waXN1amUgdnlicmFuw70gdsO9c3R1cG7DvSBwcnZvay4iCisKKyN+IG1zZ2lkICJHU3RyZWFtZXIgYXVkaW9zaW5rIGZvciBBdWRpby9WaWRlbyBDb25mZXJlbmNpbmciCisjfiBtc2dzdHIgIkdTdHJlYW1lciBhdWRpb3NpbmsgcHJlIGhsYXNvdsOpL3ZpZGVvIGtvbmZlcmVuY2llIgorCisjfiBtc2dpZCAiR1N0cmVhbWVyIGF1ZGlvc2luayBmb3IgTXVzaWMgYW5kIE1vdmllcyIKKyN+IG1zZ3N0ciAiR1N0cmVhbWVyIGF1ZGlvc2luayBwcmUgaHVkYnUgYSBmaWxteSIKKworI34gbXNnaWQgIiIKKyN+ICJHU3RyZWFtZXIgY2FuIHBsYXkgYXVkaW8gdXNpbmcgYW55IG51bWJlciBvZiBvdXRwdXQgZWxlbWVudHMuIFNvbWUgIgorI34gInBvc3NpYmxlIGNob2ljZXMgYXJlIG9zc3NpbmssIGVzZHNpbmsgYW5kIGFsc2FzaW5rLiBUaGUgYXVkaW9zaW5rIGNhbiBiZSAiCisjfiAiYSBwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJHU3RyZWFtZXIgZG9rw6HFvmUgcHJlaHLDoXZhxaUgenZ1ayBwb21vY291IMS+dWJvdm/Evm7DqWhvIHBvxI10dSB2w71zdHVwbsO9Y2ggIgorI34gInBydmtvdi4gTW/Fvm5vc8WlYW1pIHPDuiBuYXByw61rbGFkIG9zc3NpbmssIGVzZHNpbmsgYSBhbHNhc2luay4gQXVkaW9zaW5rICIKKyN+ICJtw7TFvmUgYnnFpSDEjWlhc3RvxI1uZSByw7pyb3UsIG5pZWxlbiBqZWRpbsO9bSBwcnZrb20uIgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcGxheSB2aWRlbyB1c2luZyBhbnkgbnVtYmVyIG9mIG91dHB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgeHZpbWFnZXNpbmssIHhpbWFnZXNpbmssIHNkbHZpZGVvc2luayBhbmQgYWFzaW5rLiAiCisjfiAiVGhlIHZpZGVvc2luayBjYW4gYmUgYSBwYXJ0aWFsIHBpcGVsaW5lIGluc3RlYWQgb2YganVzdCBvbmUgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJHU3RyZWFtZXIgZG9rw6HFvmUgcHJlaHLDoXZhxaUgdmlkZW8gcG9tb2NvdSDEvnVib3ZvxL5uw6lobyBwb8SNdHUgdsO9c3R1cG7DvWNoICIKKyN+ICJwcnZrb3YuIE1vxb5ub3PFpWFtaSBzw7ogbmFwcsOta2xhZCB4dmltYWdlc2luaywgeGltYWdlc2luaywgc2RsdmlkZW9zaW5rIGEgIgorI34gImFhc2luay4gVmlkZW9zaW5rIG3DtMW+ZSBiecWlIMSNaWFzdG/EjW5lIHLDunJvdSwgbmllbGVuIGplZGluw71tIHBydmtvbS4iCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiBwdXQgdmlzdWFsaXphdGlvbiBwbHVnaW5zIGluIGEgcGlwZWxpbmUgdG8gdHJhbnNmb3JtIGF1ZGlvICIKKyN+ICJzdHJlYW0gaW4gdmlkZW8gZnJhbWVzLiBEZWZhdWx0IGlzIGdvb20gYnV0IG1vcmUgdmlzdWFsaXphdGlvbiBwbHVnaW5zICIKKyN+ICJ3aWxsIGJlIHBvcnRlZCBzb29uLiBUaGUgdmlzdWFsaXphdGlvbiBwbHVnaW4gY2FuIGJlIGEgcGFydGlhbCBwaXBlbGluZSAiCisjfiAiaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkdTdHJlYW1lciBkb2vDocW+ZSB2c3Vuw7rFpSB2aXp1YWxpemHEjW7DqSB6w6FzdXZuw6kgbW9kdWx5IGRvIHLDunJ5IGEgIgorI34gInRyYW5zZm9ybW92YcWlIHp2dWtvdsO9IHByw7pkIMO6ZGFqb3YgbmEgdmlkZW9zbsOtbWt5LiBQcmVkdm9sZW7DvSBqZSBnb29tLCBhbGUgIgorI34gIsSNb3Nrb3JvIGJ1ZGUgZG9zdHVwbsO9Y2ggdmlhY2VybyB2aXp1YWxpemHEjW7DvWNoIHrDoXN1dm7DvWNoIG1vZHVsb3YuICIKKyN+ICJWaXp1YWxpemHEjW7DvSB6w6FzdXZuw70gbW9kdWwgbcO0xb5lIGJ5xaUgxI1pYXN0b8SNbmUgcsO6cm91LCBuaWVsZW4gamVkaW7DvW0gIgorI34gInBydmtvbS4iCisKKyN+IG1zZ2lkICIiCisjfiAiR1N0cmVhbWVyIGNhbiByZWNvcmQgYXVkaW8gdXNpbmcgYW55IG51bWJlciBvZiBpbnB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgb3Nzc3JjLCBlc2RzcmMgYW5kIGFsc2FzcmMuIFRoZSBhdWRpbyBzb3VyY2UgY2FuIGJlICIKKyN+ICJhIHBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkdTdHJlYW1lciBkb2vDocW+ZSBuYWhyw6F2YcWlIHp2dWsgcG9tb2NvdSDEvnVib3ZvxL5uw6lobyBwb8SNdHUgdnN0dXBuw71jaCAiCisjfiAicHJ2a292LiBNb8W+bm9zxaVhbWkgc8O6IG5hcHLDrWtsYWQgb3Nzc3JjLCBlc2RzcmMsIGFsc2FzcmMuIFp2dWtvdsO9IHpkcm9qICIKKyN+ICJtw7TFvmUgYnnFpSDEjWlhc3RvxI1uZSByw7pyb3UsIG5pZWxlbiBqZWRpbsO9bSBwcnZrb20uIgorCisjfiBtc2dpZCAiIgorI34gIkdTdHJlYW1lciBjYW4gcmVjb3JkIHZpZGVvIGZyb20gYW55IG51bWJlciBvZiBpbnB1dCBlbGVtZW50cy4gU29tZSAiCisjfiAicG9zc2libGUgY2hvaWNlcyBhcmUgdjRsc3JjIGFuZCB2aWRlb3Rlc3RzcmMuIFRoZSB2aWRlbyBzb3VyY2UgY2FuIGJlIGEgIgorI34gInBhcnRpYWwgcGlwZWxpbmUgaW5zdGVhZCBvZiBqdXN0IG9uZSBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIkdTdHJlYW1lciBkb2vDocW+ZSBuYWhyYcWlIHZpZGVvIHBvbW9jb3UgxL51Ym92b8S+bsOpaG8gcG/EjXR1IHZzdHVwbsO9Y2ggcHJ2a292LiAiCisjfiAiTW/Fvm5vc8WlYW1pIHPDuiBuYXByw61rbGFkIHY0bHNyYyBhIHZpZGVvdGVzdHNyYy4gVmlkZW8gemRyb2ogbcO0xb5lIGJ5xaUgIgorI34gIsSNaWFzdG/EjW5lIHLDunJvdSwgbmllbGVuIGplZGluw71tIHBydmtvbS4iCisKKyN+IG1zZ2lkICJkZWZhdWx0IEdTdHJlYW1lciBhdWRpbyBzb3VyY2UiCisjfiBtc2dzdHIgInByZWR2b2xlbsO9IHpkcm9qIHp2dWt1IHByZSBHU3RyZWFtZXIiCisKKyN+IG1zZ2lkICJkZWZhdWx0IEdTdHJlYW1lciBhdWRpb3NpbmsiCisjfiBtc2dzdHIgInByZWR2b2xlbsO9IGF1ZGlvc2luayBwcmUgR1N0cmVhbWVyIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgdmlkZW8gc291cmNlIgorI34gbXNnc3RyICJwcmVkdm9sZW7DvSB6ZHJvaiB2aWRlYSBwcmUgR1N0cmVhbWVyIgorCisjfiBtc2dpZCAiZGVmYXVsdCBHU3RyZWFtZXIgdmlkZW9zaW5rIgorI34gbXNnc3RyICJwcmVkdm9sZW7DvSB2aWRlb3NpbmsgcHJlIEdTdHJlYW1lciIKKworI34gbXNnaWQgImRlZmF1bHQgR1N0cmVhbWVyIHZpc3VhbGl6YXRpb24gcGx1Z2luIgorI34gbXNnc3RyICJwcmVkdm9sZW7DvSB2aXp1YWxpemHEjW7DvSB6w6FzdXZuw70gbW9kdWwgcHJlIEdTdHJlYW1lciIKKworI34gbXNnaWQgImRlc2NyaXB0aW9uIGZvciBHU3RyZWFtZXIgYXVkaW9zaW5rIGZvciBBdWRpby9WaWRlbyBDb25mZXJlbmNpbmciCisjfiBtc2dzdHIgInBvcGlzIHByZSBhdWRpb3NpbmsgcHJlIEdTdHJlYW1lciBwcmUgaGxhc292w6kvdmlkZW8ga29uZmVyZW5jaWUiCisKKyN+IG1zZ2lkICJkZXNjcmlwdGlvbiBmb3IgR1N0cmVhbWVyIGF1ZGlvc2luayBmb3IgTXVzaWMgYW5kIE1vdmllcyIKKyN+IG1zZ3N0ciAicG9waXMgcHJlIGF1ZGlvc2luayBwcmUgR1N0cmVhbWVyIHByZSBodWRidSBhIGZpbG15IgorCisjfiBtc2dpZCAiZGVzY3JpcHRpb24gZm9yIGRlZmF1bHQgR1N0cmVhbWVyIGF1ZGlvc2luayIKKyN+IG1zZ3N0ciAicG9waXMgcHJlIHByZWR2b2xlbsO9IGF1ZGlvc2luayBwcmUgR1N0cmVhbWVyIgorCisjfiBtc2dpZCAiZGVzY3JpcHRpb24gZm9yIGRlZmF1bHQgR1N0cmVhbWVyIGF1ZGlvc3JjIgorI34gbXNnc3RyICJwb3BpcyBwcmUgcHJlZHZvbGVuw70gYXVkaW9zcmMgcHJlIEdTdHJlYW1lciIKZGlmZiAtLWdpdCBhL3BvL3NsLnBvIGIvcG8vc2wucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2MTVkNgotLS0gL2Rldi9udWxsCisrKyBiL3BvL3NsLnBvCkBAIC0wLDAgKzEsNDQ1IEBACisjIFNsb3ZlbmlhbiB0cmFuc2xhdGlvbiBmb3IgZ3N0LXBsdWdpbnMtZ29vZC4KKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdzdC1wbHVnaW5zLWdvb2QgcGFja2FnZS4KKyMgQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgUm9iZXJ0IEhvcnZhdCA8cm9iaUBoaXBub3MubmV0PiwgMjAxMC4KKyMgTWF0ZWogVXJiYW7EjWnEjSA8bWF0ZWoudXJiYW5AZ21haWwuY29tPiwgMjAxMCAtIDIwMTEuCisjIEtsZW1lbiBLb8WhaXIgPGtsZW1lbjkxM0BnbWFpbC5jb20+LCAyMDEyIC0gMjAxNC4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGdzdC1wbHVnaW5zLWdvb2QtMS4yLjFcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAxNC0wNC0wOSAyMjo1MiswMTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBLbGVtZW4gS2/FoWlyIDxrbGVtZW45MTNAZ21haWwuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IFNsb3ZlbmlhbiA8dHJhbnNsYXRpb24tdGVhbS1zbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+XG4iCisiTGFuZ3VhZ2U6IHNsXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz00OyBwbHVyYWw9KG4lMTAwPT0xID8gMSA6IG4lMTAwPT0yID8gMiA6IG4lMTAwPT0zIHx8IG4iCisiJTEwMD09NCA/IDMgOiAwKTtcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiU3RyZcW+bmlrYSBKQUNLIG5pIG1vZ2/EjWUgbmFqdGkiCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIk5hcGFrYSBtZWQgZGVrb2RpcmFuamVtIEpQRUcgc2xpa2UiCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIiclcycgaXp2YWphbGNhICclcyciCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIk5pIHNlIG1vZ2/EjWUgcG92ZXphdGkgcyBzdHJlxb5uaWtvbSIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJOaSBuYXN0YXZsamVuZWdhIG5hc2xvdmEgVVJMLiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiTmkgbW9nb8SNZSByYXpyZcWhaXRpIGltZW5hIHN0cmXFvm5pa2EuIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIk5pIG1vZ2/EjWUgdnpwb3N0YXZpdGkgcG92ZXphdmUgcyBzdHJlxb5uaWtvbS4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICJOYXN0YXZpdGV2IHZhcm5lIHBvdmV6YXZlIGplIHNwb2RsZXRlbGEuIgorCisjLCBmdXp6eQorbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIiIKKyJQcmnFoWxvIGplIGRvIG9tcmXFvm5lIG5hcGFrZSBhbGkgcGEgamUgcG92ZXphdmEgbmVwcmnEjWFrb3Zhbm8gcHJla2luamVuYS4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIlN0cmXFvm5payBqZSBwb3NsYWwgc2xhYmUgcG9kYXRrZS4iCisKK21zZ2lkICJTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nLiIKK21zZ3N0ciAiU3RyZcW+bmlrIG5lIHBvZHBpcmEgaXNrYW5qYS4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIk5hcGFrYSB2aG9kbmVnYSB6dm9rYSwgQVZJIHByZXRvayBibyBwb2t2YXJqZW4uIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICJEYXRvdGVrYSBuZSB2c2VidWplIHByZXRva292IHphIHByZWR2YWphbmplLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiRGF0b3Rla2EgamUgbmFwYcSNbmEsIHphdG8gamUgbmkgbW9nb8SNZSBwcmVkdmFqYXRpLiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICJQcmV0b2thIG5pIG1vZ2/EjWUgcHJlZHZhamF0aSwga2VyIGplIMWhaWZyaXJhbiBzIFBsYXlSZWFkeSBEUk0uIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJEYXRvdGVrYSBqZSBwb2t2YXJqZW5hLCB6YXRvIGplIG5pIG1vZ2/EjWUgcHJlZHZhamF0aS4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgIk5ldmVsamF2bmEgdmVsaWtvc3QgYXRvbWEuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJEYXRvdGVrYSBuaSBwb3BvbG5hLCB6YXRvIGplIG5pIG1vZ2/EjWUgcHJlZHZhamF0aS4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIlZpZGVvIHphcGlzIHYgdGVqIGRhdG90ZWtpIG1vcmRhIG5lIGJvIHByZWR2YWphbiBwcmF2aWxuby4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiRGF0b3Rla2EgdnNlYnVqZSB2ZcSNIHByZXRva292LiBQcmVkdmFqYW5vIGJvIGxlIHphxI1ldG5paCAlZCIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisiTmkgbW9nb8SNZSBuYWp0aSBwb2RwcnRlZ2EgcHJldG9rYS4gTmFqdmVyamV0bmVqZSBqZSB0cmViYSBuYW1lc3RpdGkgdnN0YXZlayAiCisiR1N0cmVhbWVyIFJUU1AgcmF6xaFpcml0dmUgemEgUmVhbE1lZGlhIHByZXRva2UuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiTmkgbW9nb8SNZSBuYWp0aSBwb2RwcnRlZ2EgcHJldG9rYS4gTmFqdmVyamV0bmVqZSBqZSB0cmViYSBvbW9nb8SNaXRpIHZlxI0gIgorInByb3Rva29sb3YgcHJlbm9zYSwgb3ppcm9tYSBtYW5qa2EgdXN0cmV6ZW4gdnN0YXZlayBHU3RyZWFtZXIgUlRTUCAiCisicmF6xaFpcml0dmUuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAiIgorIk5pIG1vZ2/EjWUgb2RwcmV0aSB6dm/EjW5lIG5hcHJhdmUgemEgcHJlZHZhamFuamUuIE5hcHJhdm8gdXBvcmFibGphIGRydWcgIgorInByb2dyYW0uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJOaSBtb2dvxI1lIG9kcHJldGkgenZvxI1uZSBuYXByYXZlIHphIHByZWR2YWphbmplLiBOaSB1c3RyZXpuaWggZG92b2xqZW5qIHphICIKKyJvZHBpcmFuamUgbmFwcmF2ZS4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiTmkgbW9nb8SNZSBvZHByZXRpIHp2b8SNbmUgbmFwcmF2ZSB6YSBwcmVkdmFqYW5qZS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiTmkgbW9nb8SNZSBvZHByZXRpIHp2b8SNbmUgbmFwcmF2ZSB6YSBwcmVkdmFqYW5qZS4gT3BlbiBTb3VuZCBTeXN0ZW0gbmkgcG9kcHJ0LiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJQcmVkdmFqYW5lIHMgdG8genZvxI1ubyBuYXByYXZvIG5pIHBvZHBydG8uIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICJNZWQgcHJlZHZhamFuamVtIHp2b2thIGplIHByacWhbG8gZG8gbmFwYWtlLiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiU25lbWFuamUgcyB0byB6dm/EjW5vIG5hcHJhdm8gbmkgcG9kcHJ0by4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJOYXBha2EgbWVkIHNocmFuamV2YW5qZW0gcHJla28genZvxI1uZSBuYXByYXZlIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisiWnZvxI1uZSBuYXByYXZlIG5pIG1vZ2/EjWUgb2RwcmV0aSB6YSBzbmVtYW5qZS4gTmkgdXN0cmV6bmloIGRvdm9samVuaiB6YSAiCisib2RwaXJhbmplIG5hcHJhdmUuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICJadm/EjW5lIG5hcHJhdmUgbmkgbW9nb8SNZSBvZHByZXRpIHphIHNuZW1hbmplLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIiIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIlZpciBzbmVtYW5qYSIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pa3JvZm9uIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiQW5hbG9nbmkgdmhvZCIKKworbXNnaWQgIkludGVybmFsIENEIgorbXNnc3RyICJOb3RyYW5qaSBDRCIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJWaG9kIFNQRElGIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIlZob2QgQVVYIDEiCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiVmhvZCBBVVggMiIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICJQb3ZyYXRuYSB6YW5rYSBrb2Rla2EiCisKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIlBvdnJhdG5hIHphbmthIFN1blZUUyIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiR2xhc25vc3QiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJPamHEjWl0ZXYiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJaYXNsb24iCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJWZ3JhamVuaSB6dm/EjW5payIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiU2x1xaFhbGtlIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIkFuYWxvZ25pIGl6aG9kIgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJJemhvZCBTUERJRiIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiSXpob2QgQVVYIDEiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIkl6aG9kIEFVWCAyIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5hcGFrYSBtZWQgYnJhbmplbSAlZCBiYWp0b3YgaXogbmFwcmF2ZSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorIk1lZCDFoXRldmlsxI1lbmplbSBvYmxpayB2aWRlYSwga2kgamloIHBvZHBpcmEgbmFwcmF2YSBcIiVzXCIsIGplIHByacWhbG8gZG8gIgorIm5hcGFrZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIk5pIG1vZ2/EjWUgcHJlc2xpa2F0aSBtZWRwb21uaWxuaWthIG5hcHJhdmUgJyVzJyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiR29uaWxuaWsgbmFwcmF2ZSBcIiVzXCIgbmUgcG9kcGlyYSBub2JlbmVnYSBuYcSNaW5hIEkvTyAlZC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICJHb25pbG5payBuYXByYXZlIFwiJXNcIiBuZSBwb2RwaXJhIG5vYmVuZWdhIHpuYW5lZ2EgbmHEjWluYSBJL08uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIk5hcHJhdmEgXCIlc1wiIGplIHphcG9zbGVuYS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIk5hcHJhdmEgXCIlc1wiIG5lIHBvZHBpcmEgemFqZW1hbmphIHYgbG/EjWxqaXZvc3RpICVkeCVkLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiTmFwcmF2YSBcIiVzXCIgbmUgcG9kcGlyYSB6YWplbWFuamEgdiBpemJyYW5pIG9ibGlraS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIk5hcHJhdmEgXCIlc1wiIG5lIHBvZHBpcmEgemFqZW1hbmphIHZpZGVhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIk5pIG1vZ2/EjWUgcHJpZG9iaXRpIHBhcmFtZXRyb3YgbmEgbmFwcmF2aSAnJXMnLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiTmFwcmF2aSBuaSBtb2dvxI1lIGRvbG/EjWl0aSBub3ZpaCBuYXN0YXZpdGV2IGhpdHJvc3RpIHNsacSNaWMuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIk5hcHJhdmkgbmkgbW9nb8SNZSBkb2xvxI1pdGkgbm92aWggbmFzdGF2aXRldiBoaXRyb3N0aSBzbGnEjWljLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiR29uaWxuaWsgbmFwcmF2ZSBcIiVzXCIgbmUgcG9kcGlyYSBub2JlbmVnYSBuYcSNaW5hIEkvTyAlZC4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiR29uaWxuaWsgbmFwcmF2ZSBcIiVzXCIgbmUgcG9kcGlyYSBub2JlbmVnYSBuYcSNaW5hIEkvTyAlZC4iCisKKyMsIGZ1enp5Cittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIk5hcHJhdmEgbmUgbW9yZSB1c3R2YXJpdGkgemFsb2dlIG1lZHBvbW5pbG5pa2EuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiTmFwcmF2YSBuZSBtb3JlIHVzdHZhcml0aSB6YWxvZ2UgbWVkcG9tbmlsbmlrYS4iCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJNZWQgcHJpZG9iaXZhbmplbSBuYXN0YXZpdGV2IHVnbGHFoWV2YWxuaWthICVkIG5hIG5hcHJhdmkgXCIlc1wiIGplIHByacWhbG8gZG8gIgorIm5hcGFrZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTWVkIHByaWRvYml2YW5qZW0gbGFzdG5vc3RpIG5hcHJhdmUgXCIlc1wiIGplIHByacWhbG8gZG8gbmFwYWtlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIk5hcHJhdmEgXCIlc1wiIG5pIHVnbGHFoWV2YWxuaWsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiTWVkIHByaWRvYml2YW5qZW0gdmhvZGEgbmEgbmFwcmF2aSBcIiVzXCIgamUgcHJpxaFsbyBkbyBuYXBha2UuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiTmFwYWthIG1lZCBkb2xvxI1hbmplbSB2aG9kYSAlZCBuYXByYXZlICVzLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIk1lZCBuYXN0YXZsamFuamVtIHN0YW5qYSBnbGFzbm9zdGkgbmEgbmFwcmF2aSBcIiVzXCIgamUgcHJpxaFsbyBkbyBuYXBha2UuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJHb25pbG5payBuYXByYXZlIFwiJXNcIiBuZSBwb2RwaXJhIG5vYmVuZWdhIG5hxI1pbmEgSS9PICVkLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIk5hcHJhdmkgbmkgbW9nb8SNZSBkb2xvxI1pdGkgbm92aWggbmFzdGF2aXRldiBoaXRyb3N0aSBzbGnEjWljLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIk5hcHJhdmkgbmkgbW9nb8SNZSBkb2xvxI1pdGkgbm92aWggbmFzdGF2aXRldiBoaXRyb3N0aSBzbGnEjWljLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJOYXByYXZpIG5pIG1vZ2/EjWUgZG9sb8SNaXRpIG5vdmloIG5hc3Rhdml0ZXYgaGl0cm9zdGkgc2xpxI1pYy4iCisKKyMsIGZ1enp5Cittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIk5hcGFrYSBtZWQgZGVrb2RpcmFuamVtIEpQRUcgc2xpa2UiCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJOYXBha2EgbWVkIHByaWRvYml2YW5qZW0gem1vxb5ub3N0aSBuYXByYXZlICclcyc6IG5pIHByYXZlZ2EgZ29uaWxuaWthIHY0bDIuICIKKyJQcmV2ZXJpdGUgbmFtZXN0aXRldi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICJOYXBha2EgbWVkIHByZWdsZWRvdmFuamVtIGF0cmlidXRvdiBwb2l6dmVkYmUgdmhvZGEgJWQgbmFwcmF2ZSAlcyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOYXBha2EgbWVkIHByaWRvYml2YW5qZW0gbmFzdGF2aXRldiB1Z2xhxaFldmFsbmlrYSAlZCBuYSBuYXByYXZpICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmFwYWthIG1lZCBwb2l6dmVkb3ZhbmplbSB1cmF2bmFub3N0aSBuYXByYXZlICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOYXBha2EgbWVkIHByaWRvYml2YW5qZW0gYXRyaWJ1dG92IG5hZHpvcmEgbmFwcmF2ZSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJOYXByYXZlIFwiJXNcIiBuaSBtb2dvxI1lIGRvbG/EjWl0aS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiVG8gbmkgbmFwcmF2YSBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiTmkgbW9nb8SNZSBvZHByZXRpIG5hcHJhdmUgJyVzJyB6YSBicmFuamUgaW4gcGlzYW5qZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICJOYXByYXZhICclcycgbmkgbmFwcmF2YSB6YSB6YWplbWFuamUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIgorbXNnc3RyICJOYXByYXZhICclcycgbmkgaXpob2RuYSBuYXByYXZhLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgIk5hcHJhdmEgJyVzJyBuaSBpemhvZG5hIG5hcHJhdmEuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiTmkgbW9nb8SNZSBvZHByZXRpIG5hcHJhdmUgJyVzJyB6YSBicmFuamUgaW4gcGlzYW5qZS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk1lZCBuYXN0YXZsamFuamVtIG5hcHJhdmUgXCIlc1wiIGplIHByacWhbG8gZG8gbmFwYWtlLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk5hcGFrYSBtZWQgcHJpZG9iaXZhbmplbSBmcmVrdmVuY2UgdWdsYcWhZXZhbG5pa2EgbmFwcmF2ZSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisiTmFwYWthIG1lZCBuYXN0YXZsamFuamVtIGZyZWt2ZW5jZSB1Z2xhxaFldmFsbmlrYSBuYXByYXZlICclcycgbmEgJWx1IEh6Li4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmFwYWthIG1lZCBwcmlkb2JpdmFuamVtIG1vxI1pIHNpZ25hbGEgemEgbmFwcmF2byAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiTmFwYWthIG1lZCBwcmlkb2JpdmFuamVtIHZyZWRub3N0aSAlZCBuYSBuYXByYXZpICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJOYXBha2EgbWVkIGRvbG/EjWFuamVtIHZyZWRub3N0aSAlZCB6YSAlZCBuYSBuYXByYXZpICclcycuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiTmFwYWthIG1lZCBwcmlkb2JpdmFuamVtIHZob2RuZWdhIHNpZ25hbGEgbmFwcmF2ZSAnJXMnLiBNb3JkYSBqZSByYWRpanNrYSAiCisibmFwcmF2YS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIk5hcGFrYSBtZWQgcHJpZG9iaXZhbmplbSBvZHZvZG5lZ2Egc2lnbmFsYSBuYXByYXZlICclcycuIE1vcmRhIGplIHJhZGlqc2thICIKKyJuYXByYXZhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJOYXBha2EgbWVkIGRvbG/EjWFuamVtIG9kdm9kYSAlZCBuYXByYXZlICVzLiIKKworbXNnaWQgIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iCittc2dzdHIgIlNwcmVtaW5qYW5qZSBsb8SNbGppdm9zdGkgbWVkIGRlbG92YW5qZW0gxaFlIG5pIHBvZHBydG8uIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICJJenZhamFuamUgb3ByYXZpbCBicmV6IHVyZSBuaSBtb2dvxI1lIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICJOb3RyYW5qYSBuYXBha2EgcHJldG9rYSBwb2RhdGtvdi4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJOb3RyYW5qYSBuYXBha2EgcHJldG9rYSBwb2RhdGtvdi4iCisKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIk5hcHJhdmEgXCIlc1wiIG5lIHBvZHBpcmEgemFqZW1hbmphIHZpZGVhLiIKZGlmZiAtLWdpdCBhL3BvL3NxLnBvIGIvcG8vc3EucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0NDdmOAotLS0gL2Rldi9udWxsCisrKyBiL3BvL3NxLnBvCkBAIC0wLDAgKzEsNjM4IEBACisjIFDDq3JrdGhpbWkgaSBtZXNhemhldmUgdMOrIGdzdC1wbHVnaW5zIG7DqyBzaHFpcC4KKyMgQ29weXJpZ2h0IChDKSAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBMYXVyZW50IERoaW1hIDxsYXVyZW50aUBhbGJsaW51eC5uZXQ+LCAyMDA0LgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMgMC44LjNcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwNC0wOC0wNyAyMDoyOSswMjAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBMYXVyZW50IERoaW1hIDxsYXVyZW50aUBhbGJsaW51eC5uZXQ+XG4iCisiTGFuZ3VhZ2UtVGVhbTogQWxiYW5pYW4gPGJlZ3JhakBob3RtYWlsLmNvbT5cbiIKKyJMYW5ndWFnZTogc3FcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICIiCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIkUgcGFtdW5kdXIgbWJ5bGxqYSBlIGRpc3Bveml0aXZpdCB0w6sga29udHJvbGxpdCBcIiVzXCIuIgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIkUgcGFtdW5kdXIgbWJ5bGxqYSBlIGRpc3Bveml0aXZpdCB0w6sga29udHJvbGxpdCBcIiVzXCIuIgorCisjLCBmdXp6eQorbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJFIHBhbXVuZHVyIG1ieWxsamEgZSBkaXNwb3ppdGl2aXQgdMOrIGtvbnRyb2xsaXQgXCIlc1wiLiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICJEaXNwb3ppdGl2aSBqdWFqIE9TUyBtdW5kIHTDqyBtb3MgcHJvdm9oZXQga29ycmVrdMOrc2lzaHQiCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIklucHV0IGF1ZGlvIGkgZ2FidWFyIG9zZSBtdW5nb24sIHN0cmVhbSBBVkkgbXVuZCB0w6sgamV0w6sgaSBkw6ttdHVhci4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGFsbG93IG1vcmUgdHJhbnNwb3J0ICIKKyJwcm90b2NvbHMgb3IgbWF5IG90aGVyd2lzZSBiZSBtaXNzaW5nIHRoZSByaWdodCBHU3RyZWFtZXIgUlRTUCBleHRlbnNpb24gIgorInBsdWdpbi4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5Cittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIkUgcGFtdW5kdXIgaGFwamEgZSBkaXNwb3ppdGl2aXQgdMOrIHrDq3JpdCBcIiVzXCIgcMOrciBzaGtyaW0uIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICIiCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKworIywgZnV6enkKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIkkgcGFtdW5kdXIgaGFwamEgZSBkaXNwb3ppdGl2aXQgQ0QgcMOrciBsZXhpbS4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiIgorCisjLCBmdXp6eQorbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiRGlzcG96aXRpdmkganVhaiBPU1MgbXVuZCB0w6sgbW9zIHByb3ZvaGV0IGtvcnJla3TDq3Npc2h0IgorCisjLCBmdXp6eQorbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIlJlZ2ppc3RyaW1pIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWlrcm9mb25pIgorCisjLCBmdXp6eQorbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIkxpbmphLWh5cmplIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIiIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIiIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICIiCisKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIiIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiVm9sdW1pIgorCittc2dpZCAiR2FpbiIKK21zZ3N0ciAiIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiRWtyYW5pIgorCisjLCBmdXp6eQorbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIlrDqyBmb2zDq3MiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIiIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICIiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIiIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkUgcGFtdW5kdXIgbWFycmphIGUgYnVmZmVycyBuZ2EgZGlzcG96aXRpdmkgXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiRSBwYW11bmR1ciBtYXJyamEgZSBidWZmZXJzIG5nYSBkaXNwb3ppdGl2aSBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIkRpc3Bveml0aXZpIFwiJXNcIiBudWsgw6tzaHTDqyBuasOrIGRpc3Bveml0aXYgbWFycmplLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgIkRpc3Bveml0aXZpIFwiJXNcIiBudWsgw6tzaHTDqyBuasOrIGRpc3Bveml0aXYgbWFycmplLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIkRpc3Bveml0aXZpIFwiJXNcIiBudWsgw6tzaHTDqyBuasOrIGRpc3Bveml0aXYgbWFycmplLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiRGlzcG96aXRpdmkgXCIlc1wiIG51ayDDq3NodMOrIG5qw6sgZGlzcG96aXRpdiBtYXJyamUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIkUgcGFtdW5kdXIgbWFycmphIGUgYnVmZmVycyBuZ2EgZGlzcG96aXRpdmkgXCIlc1wiLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkUgcGFtdW5kdXIgbWFycmphIGUgYnVmZmVycyB0w6sgbWphZnR1ZXNow6ttIG5nYSBkaXNwb3ppdGl2aSBcIiVzXCIuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJFIHBhbXVuZHVyIG1hcnJqYSBlIGJ1ZmZlcnMgbmdhIGRpc3Bveml0aXZpIFwiJXNcIi4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAiRGlzcG96aXRpdmkgXCIlc1wiIG51ayDDq3NodMOrIG5qw6sgZGlzcG96aXRpdiBtYXJyamUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIkUgcGFtdW5kdXIgbWJ5bGxqYSBlIGRpc3Bveml0aXZpdCBhdWRpbyBcIiVzXCIuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkUgcGFtdW5kdXIgbWJ5bGxqYSBlIGRpc3Bveml0aXZpdCBhdWRpbyBcIiVzXCIuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRSBwYW11bmR1ciBtYXJyamEgZSBidWZmZXJzIG5nYSBkaXNwb3ppdGl2aSBcIiVzXCIuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gc3RhcnQgZGVjb2RpbmcgdGhyZWFkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgb2YgaW5wdXQgJWQgaW4gZGV2aWNlICVzIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkUgcGFtdW5kdXIgbWFycmphIGUgYnVmZmVycyB0w6sgbWphZnR1ZXNow6ttIG5nYSBkaXNwb3ppdGl2aSBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkkgcGFtdW5kdXIgc2hrcmltaSBuw6sgZGlzcG96aXRpdmluIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIkUgcGFtdW5kdXIgaGFwamEgZSBkaXNwb3ppdGl2aXQgXCIlc1wiIHDDq3IgbGV4aW0gZGhlIHNoa3JpbS4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiRGlzcG96aXRpdmkgXCIlc1wiIG51ayDDq3NodMOrIG5qw6sgZGlzcG96aXRpdiBtYXJyamUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAiRGlzcG96aXRpdmkgXCIlc1wiIG51ayDDq3NodMOrIG5qw6sgZGlzcG96aXRpdiBtYXJyamUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiRGlzcG96aXRpdmkgXCIlc1wiIG51ayDDq3NodMOrIG5qw6sgZGlzcG96aXRpdiBtYXJyamUuIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAiRSBwYW11bmR1ciBoYXBqYSBlIGRpc3Bveml0aXZpdCBcIiVzXCIgcMOrciBsZXhpbSBkaGUgc2hrcmltLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkUgcGFtdW5kdXIgbWFycmphIGUgYnVmZmVycyBuZ2EgZGlzcG96aXRpdmkgXCIlc1wiLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJFIHBhbXVuZHVyIG1hcnJqYSBlIGJ1ZmZlcnMgdMOrIG1qYWZ0dWVzaMOrbSBuZ2EgZGlzcG96aXRpdmkgXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRSBwYW11bmR1ciBtYnlsbGphIGUgZGlzcG96aXRpdml0IHTDqyBrb250cm9sbGl0IFwiJXNcIi4iCisKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJFIHBhbXVuZHVyIG1ieWxsamEgZSBkaXNwb3ppdGl2aXQgdMOrIGtvbnRyb2xsaXQgXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICJFIHBhbXVuZHVyIG1hcnJqYSBlIGJ1ZmZlcnMgdMOrIG1qYWZ0dWVzaMOrbSBuZ2EgZGlzcG96aXRpdmkgXCIlc1wiLiIKKworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiRSBwYW11bmR1ciBtYnlsbGphIGUgZGlzcG96aXRpdml0IGF1ZGlvIFwiJXNcIi4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIkRpc3Bveml0aXZpIFwiJXNcIiBudWsgw6tzaHTDqyBuasOrIGRpc3Bveml0aXYgbWFycmplLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkUgcGFtdW5kdXIgbWFycmphIGUgYnVmZmVycyB0w6sgbWphZnR1ZXNow6ttIG5nYSBkaXNwb3ppdGl2aSBcIiVzXCIuIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAiQmFzIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICJUcmVibGUiCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAiU2ludGV0aXp1ZXNpIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJaw6sgZm9sw6tzIgorCisjfiBtc2dpZCAiTGluZS1pbiIKKyN+IG1zZ3N0ciAiTGluamEtaHlyamUiCisKKyN+IG1zZ2lkICJDRCIKKyN+IG1zZ3N0ciAiQ0QiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAiS29udHJvbGxpIGkgdm9sdW1pdCIKKworI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICJQQ00tMiIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAiUmVnamlzdHJpbWkiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICJJbi1nYWluIgorCisjfiBtc2dpZCAiT3V0LWdhaW4iCisjfiBtc2dzdHIgIk91dC1nYWluIgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICJMaW5qYS0xIgorCisjfiBtc2dpZCAiTGluZS0yIgorI34gbXNnc3RyICJMaW5qYS0yIgorCisjfiBtc2dpZCAiTGluZS0zIgorI34gbXNnc3RyICJMaW5qYS0zIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICJEaXhoaXRhbGUtMSIKKworI34gbXNnaWQgIkRpZ2l0YWwtMiIKKyN+IG1zZ3N0ciAiRGl4aGl0YWxlLTIiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTMiCisjfiBtc2dzdHIgIkRpeGhpdGFsZS0zIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgIlBob25lLWh5cmphIgorCisjfiBtc2dpZCAiUGhvbmUtb3V0IgorI34gbXNnc3RyICJQaG9uZS1kYWxqYSIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICJWaWRlbyIKKworI34gbXNnaWQgIlJhZGlvIgorI34gbXNnc3RyICJSYWRpbyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIgorI34gbXNnc3RyICJFIHBhbXVuZHVyIGhhcGphIGUgZGlzcG96aXRpdml0IHTDqyB6w6tyaXQgXCIlc1wiIHDDq3Igc2hrcmltLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJSZWFyIgorI34gbXNnc3RyICJSZWdqaXN0cmltaSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICJWaWRlbyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAiVmlkZW8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiUmVjb3JkIEdhaW4iCisjfiBtc2dzdHIgIlJlZ2ppc3RyaW1pIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk91dHB1dCBHYWluIgorI34gbXNnc3RyICJPdXQtZ2FpbiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEJvb3N0IgorI34gbXNnc3RyICJNaWtyb2ZvbmkiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIkVrcmFuaSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIk1pa3JvZm9uaSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAiWsOrIGZvbMOrcyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTWlrcm9mb25pIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAiTWlrcm9mb25pIgorCisjLCBmdXp6eQorI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiTWlrcm9mb25pIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICJEaXhoaXRhbGUtMSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICJEaXhoaXRhbGUtMSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICJNaWtyb2ZvbmkiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkUgcGFtdW5kdXIgbWFycmphIGUgYnVmZmVycyBuZ2EgZGlzcG96aXRpdmkgXCIlc1wiLiIKKworI34gbXNnaWQgIiIKKyN+ICJObyB1c2FibGUgY29sb3JzcGFjZSBlbGVtZW50IGNvdWxkIGJlIGZvdW5kLlxuIgorI34gIlBsZWFzZSBpbnN0YWxsIG9uZSBhbmQgcmVzdGFydC4iCisjfiBtc2dzdHIgIiIKKyN+ICJOdWsgYXJyaW4gdMOrIGdqZWhldCBhc25qw6sgZWxlbWVudCBuZ2p5cmEgZSBoYXDDq3NpcsOrcy5cbiIKKyN+ICJKdSBsdXRlbSBpbnN0YWxvbmkgbmrDqyBkaGUgcmluaXNuaS4iCisKKyN+IG1zZ2lkICIiCisjfiAiVGhlICVzIGVsZW1lbnQgY291bGQgbm90IGJlIGZvdW5kLiBUaGlzIGVsZW1lbnQgaXMgZXNzZW50aWFsIGZvciAiCisjfiAicGxheWJhY2suIFBsZWFzZSBpbnN0YWxsIHRoZSByaWdodCBwbHVnLWluIGFuZCB2ZXJpZnkgdGhhdCBpdCB3b3JrcyBieSAiCisjfiAicnVubmluZyAnZ3N0LWluc3BlY3QgJXMnIgorI34gbXNnc3RyICIiCisjfiAiRSBwYW11bmR1ciBnamV0amEgZSBlbGVtZW50aXQgJXMuIEt5IGVsZW1lbnQgw6tzaHTDqyB0aGVsYsOrc29yIHDDq3IgIgorI34gInBsYXliYWNrLiBKdSBsdXRlbSBpbnN0YWxvbmkgcGx1Zy1pbiBlIGR1aHVyIGRoZSBrb250cm9sbG8gZnVua3Npb25pbWluICIKKyN+ICJkdWtlIGVremVrdXR1YXIgJ2dzdC1pbnNwZWN0ICVzJyIKKworI34gbXNnaWQgIkRldmljZSBpcyBvcGVuLiIKKyN+IG1zZ3N0ciAiRGlzcG96aXRpdmkgw6tzaHTDqyBpIGhhcHVyLiIKKworI34gbXNnaWQgIkRldmljZSBpcyBub3Qgb3Blbi4iCisjfiBtc2dzdHIgIkRpc3Bveml0aXZpIG51ayDDq3NodMOrIGhhcHVyLiIKKworI34gbXNnaWQgIk5vIGRldmljZSBzcGVjaWZpZWQuIgorI34gbXNnc3RyICJOdWsgw6tzaHTDqyBww6tyY2FrdHVhciBhc25qw6sgZGlzcG96aXRpdi4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgY2xvc2UgdmZzIGZpbGUgXCIlc1wiLiIKKyN+IG1zZ3N0ciAiRSBwYW11bmR1ciBtYnlsbGphIGUgZmlsZSB2ZnMgXCIlc1wiLiIKKworI34gbXNnaWQgIk5vIGZpbGVuYW1lIGdpdmVuIgorI34gbXNnc3RyICJOdWsgw6tzaHTDqyBkaMOrbsOrIGFzbmrDqyBlbcOrciBmaWxlIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gdmZzIGZpbGUgXCIlc1wiIGZvciB3cml0aW5nOiAlcy4iCisjfiBtc2dzdHIgIkUgcGFtdW5kdXIgaGFwamEgZSBmaWxlIHZmcyBcIiVzXCIgcMOrciBzaGtyaW06ICVzLiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJObyBmaWxlbmFtZSBnaXZlbi4iCisjfiBtc2dzdHIgIk51ayDDq3NodMOrIGRow6tuw6sgYXNuasOrIGVtw6tyIGZpbGUiCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiB2ZnMgZmlsZSBcIiVzXCIgZm9yIHJlYWRpbmcuIgorI34gbXNnc3RyICJFIHBhbXVuZHVyIGhhcGphIGUgZmlsZSB2ZnMgXCIlc1wiIHDDq3IgbGV4aW0uIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlIFwiJXNcIiBmb3IgcmVhZGluZy4iCisjfiBtc2dzdHIgIkUgcGFtdW5kdXIgaGFwamEgZSBkaXNwb3ppdGl2aXQgXCIlc1wiIHDDq3IgbGV4aW0uIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlIFwiJXNcIiBmb3Igd3JpdGluZy4iCisjfiBtc2dzdHIgIkUgcGFtdW5kdXIgaGFwamEgZSBkaXNwb3ppdGl2aXQgXCIlc1wiIHDDq3Igc2hrcmltLiIKKworI34gbXNnaWQgIkRldmljZSBcIiVzXCIgZG9lcyBub3QgZXhpc3QuIgorI34gbXNnc3RyICJEaXNwb3ppdGl2aSBcIiVzXCIgbnVrIGVremlzdG9uLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBhY2Nlc3MgZGV2aWNlIFwiJXNcIiwgY2hlY2sgaXRzIHBlcm1pc3Npb25zLiIKKyN+IG1zZ3N0ciAiIgorI34gIkUgcGFtdW5kdXIgZnV0amEgbsOrIGRpc3Bveml0aXZpbiBcIiVzXCIsIGtvbnRyb2xsbyB0w6sgZHJlanRhdCBlIHRpai4iCisKKyN+IG1zZ2lkICJPU1MgZGV2aWNlIFwiJXNcIiBpcyBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIHByb2dyYW0uIgorI34gbXNnc3RyICIiCisjfiAiRGlzcG96aXRpdmkgT1NTIFwiJXNcIiDDq3NodMOrIGR1a2UgdSBww6tyZG9ydXIgbmdhIG5qw6sgdGpldMOrciBwcm9ncmFtLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBjbG9zZSB2aWRlbyBkZXZpY2UgXCIlc1wiLiIKKyN+IG1zZ3N0ciAiRSBwYW11bmR1ciBtYnlsbGphIGUgZGlzcG96aXRpdml0IHZpZGVvIFwiJXNcIi4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiB2aWRlbyBkZXZpY2UgXCIlc1wiIGZvciB3cml0aW5nLiIKKyN+IG1zZ3N0ciAiRSBwYW11bmR1ciBoYXBqYSBlIGRpc3Bveml0aXZpdCB2aWRlbyBcIiVzXCIgcMOrciBzaGtyaW0uIgorCisjfiBtc2dpZCAiQ291bGQgbm90IHNldCBhdWRpbyBkZXZpY2UgXCIlc1wiIHRvICVkIEh6LiIKKyN+IG1zZ3N0ciAiSSBwYW11bmR1ciBycmVndWxsaW1pIGkgZGlzcG96aXRpdml0IGF1ZGlvIFwiJXNcIiBuw6sgJWQgSHouIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGNvbmZpZ3VyZSBhdWRpbyBkZXZpY2UgXCIlc1wiLiIKKyN+IG1zZ3N0ciAiSSBwYW11bmR1ciBrb25maWd1cmltaSBpIGRpc3Bveml0aXZpdCB0w6sgesOrcml0IFwiJXNcIi4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBjb250cm9sIGRldmljZSBcIiVzXCIgZm9yIHdyaXRpbmcuIgorI34gbXNnc3RyICJFIHBhbXVuZHVyIGhhcGphIGUgZGlzcG96aXRpdml0IHTDqyBrb250cm9sbGl0IFwiJXNcIiBww6tyIHNoa3JpbS4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSBcIiVzXCIuIgorI34gbXNnc3RyICJJIHBhbXVuZHVyIHNoa3JpbWkgdGVrIGZpbGUgXCIlc1wiLiIKKworI34gbXNnaWQgIk5vIGZpbGVuYW1lIHNwZWNpZmllZC4iCisjfiBtc2dzdHIgIk51ayDDq3NodMOrIHDDq3JjYWt0dWFyIGVtcmkgaSBmaWxlLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGZpbGUgXCIlc1wiIGZvciByZWFkaW5nLiIKKyN+IG1zZ3N0ciAiRSBwYW11bmR1ciBoYXBqYSBlIGZpbGUgXCIlc1wiIHDDq3IgbGV4aW0uIgorCisjfiBtc2dpZCAiRXJyb3IgY2xvc2luZyBmaWxlIFwiJXNcIi4iCisjfiBtc2dzdHIgIkdhYmltIGdqYXTDqyBtYnlsbGplcyBzw6sgZmlsZSBcIiVzXCIuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gZmlsZSBcIiVzXCIgZm9yIHdyaXRpbmcuIgorI34gbXNnc3RyICJFIHBhbXVuZHVyIGhhcGphIGUgZmlsZSBcIiVzXCIgbsOrIHNoa3JpbS4iCmRpZmYgLS1naXQgYS9wby9zci5wbyBiL3BvL3NyLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZDI0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9wby9zci5wbwpAQCAtMCwwICsxLDQzNCBAQAorIyBTZXJiaWFuIHRyYW5zbGF0aW9uIG9mIGdzdC1wbHVnaW5zCisjIENvcHlyaWdodCAoQykgMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdzdC1wbHVnaW5zLWdvb2QgcGFja2FnZS4KKyMgRGFuaWxvIFNlZ2FuIDxkc2VnYW5AZ214Lm5ldD4sIDIwMDQuCisjINCc0LjRgNC+0YHQu9Cw0LIg0J3QuNC60L7Qu9C40ZsgPG1pcm9zbGF2bmlrb2xpY0Byb2NrZXRtYWlsLmNvbT4sIDIwMTHigJQyMDE2LgorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZC0xLjcuMlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDE2LTAzLTA1IDA5OjUyKzAyMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6INCc0LjRgNC+0YHQu9Cw0LIg0J3QuNC60L7Qu9C40ZsgPG1pcm9zbGF2bmlrb2xpY0Byb2NrZXRtYWlsLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBTZXJiaWFuIDwobm90aGluZyk+XG4iCisiTGFuZ3VhZ2U6IHNyXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0zOyBwbHVyYWw9KG4lMTA9PTEgJiYgbiUxMDAhPTExID8gMCA6IG4lMTA+PTIgJiYgbiIKKyIlMTA8PTQgJiYgKG4lMTAwPDEwIHx8IG4lMTAwPj0yMCkgPyAxIDogMik7XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgItCd0LjRgdCw0Lwg0L/RgNC+0L3QsNGI0LDQviDRgdC10YDQstC10YAg0YPRgtC40YfQvdC40YbQtSIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAi0J3QuNGB0LDQvCDRg9GB0L/QtdC+INC00LAg0LTQtdC60L7QtNC40YDQsNC8INCI0J/QldCTINGB0LvQuNC60YMiCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIuKAniVz4oCcINC40LfQstC+0LTQuCDigJ4lc+KAnCIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAi0J3QtSDQvNC+0LPRgyDQtNCwINGB0LUg0L/QvtCy0LXQttC10Lwg0YHQsCDRgdC10YDQstC10YDQvtC8IgorCittc2dpZCAiTm8gVVJMIHNldC4iCittc2dzdHIgItCd0LjRmNC1INC/0L7QtNC10YjQtdC90LAg0LDQtNGA0LXRgdCwLiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAi0J3QtSDQvNC+0LPRgyDQtNCwINGA0LXRiNC40Lwg0L3QsNC30LjQsiDRgdC10YDQstC10YDQsC4iCisKK21zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc2VydmVyLiIKK21zZ3N0ciAi0J3QtSDQvNC+0LPRgyDQtNCwINGD0YHQv9C+0YHRgtCw0LLQuNC8INCy0LXQt9GDINGB0LAg0YHQtdGA0LLQtdGA0L7QvC4iCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICLQn9C+0LTQtdGI0LDQstCw0ZrQtSDQsdC10LfQsdC10LTQvdC1INCy0LXQt9C1INC90LjRmNC1INGD0YHQv9C10LvQvi4iCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICLQlNC+0YjQu9C+INGY0LUg0LTQviDQs9GA0LXRiNC60LUg0L3QsCDQvNGA0LXQttC4LCDQuNC70Lgg0ZjQtSDRgdC10YDQstC10YAg0L3QtdC+0YfQtdC60LjQstCw0L3QviDQt9Cw0YLQstC+0YDQuNC+INCy0LXQt9GDLiIKKworbXNnaWQgIlNlcnZlciBzZW50IGJhZCBkYXRhLiIKK21zZ3N0ciAi0KHQtdGA0LLQtdGAINGY0LUg0L/QvtGB0LvQsNC+INC70L7RiNC1INC/0L7QtNCw0YLQutC1LiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICLQodC10YDQstC10YAg0L3QtSDQv9C+0LTRgNC20LDQstCwINC/0L7Qt9C40YbQuNC+0L3QuNGA0LDRmtC1LiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAi0KPQu9Cw0LfQvdC+0LMg0LfQstGD0LrQsCDQvdC10LzQsCDQuNC70Lgg0ZjQtSDQvdC10LjRgdC/0YDQsNCy0LDQvSwg0JDQktCYINGC0L7QuiDRm9C1INCx0LjRgtC4INC+0YjRgtC10ZvQtdC9LiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAi0J7QstCwINC00LDRgtC+0YLQtdC60LAg0L3QtSDRgdCw0LTRgNC20Lgg0YLQvtC60L7QstC1INC30LAg0L/Rg9GI0YLQsNGa0LUuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICLQntCy0LAg0LTQsNGC0L7RgtC10LrQsCDRmNC1INC90LXQuNGB0L/RgNCw0LLQvdCwINC4INC90LUg0LzQvtC20LUg0LHQuNGC0Lgg0L/Rg9GI0YLQtdC90LAuIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIiIKKyLQndC1INC80L7Qs9GDINC00LAg0L/Rg9GB0YLQuNC8INGC0L7QuiDQt9Cw0YLQviDRiNGC0L4g0ZjQtSDRiNC40YTRgNC+0LLQsNC9INCj0JTQny3QvtC8IOKAntCh0L/RgNC10LzQsNC9INC30LAg0L/Rg9GI0YLQsNGa0LXigJwuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICLQntCy0LAg0LTQsNGC0L7RgtC10LrQsCDRmNC1INC+0YjRgtC10ZvQtdC90LAg0Lgg0L3QtSDQvNC+0LbQtSDQsdC40YLQuCDQv9GD0YjRgtC10L3QsC4iCisKK21zZ2lkICJJbnZhbGlkIGF0b20gc2l6ZS4iCittc2dzdHIgItCd0LXQuNGB0L/RgNCw0LLQvdCwINCy0LXQu9C40YfQuNC90LAg0LDRgtC+0LzQsC4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgItCe0LLQsCDQtNCw0YLQvtGC0LXQutCwINGY0LUg0L3QtdC/0L7RgtC/0YPQvdCwINC4INC90LUg0LzQvtC20LUg0LHQuNGC0Lgg0L/Rg9GI0YLQtdC90LAuIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICLQktC40LTQtdC+INGDINC+0LLQvtGYINC00LDRgtC+0YLQtdGG0Lgg0LzQvtC20LTQsCDQvdC10ZvQtSDQsdC40YLQuCDQv9GD0YjRgtC10L0g0LjRgdC/0YDQsNCy0L3Qvi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAi0J7QstCwINC00LDRgtC+0YLQtdC60LAg0YHQsNC00YDQttC4INC/0YDQtdCy0LjRiNC1INGC0L7QutC+0LLQsC4g0J/Rg9GI0YLQsNC8INGB0LDQvNC+INC/0YDQstC4ICVkIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyLQndC40ZjQtSDQv9GA0L7QvdCw0ZLQtdC9INC90LjRmNC10LTQsNC9INC/0L7QtNGA0LbQsNC90Lgg0YLQvtC6LiDQnNC+0LbQtNCwINGb0LXRgtC1INC80L7RgNCw0YLQuCDQtNCwINC40L3RgdGC0LDQu9C40YDQsNGC0LUgIgorItC/0YDQuNC60ZnRg9GH0LDQuiDQoNCi0KHQnyDQv9GA0L7RiNC40YDQtdGa0LAg0JPRgdGC0YDQuNC80LXRgNCwINC30LAg0YLQvtC60L7QstC1INCh0YLQstCw0YDQvdC+0LMg0LzQtdC00LjRmNCwLiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorItCd0LjRmNC1INC/0YDQvtC90LDRktC10L0g0L3QuNGY0LXQtNCw0L0g0L/QvtC00YDQttCw0L3QuCDRgtC+0LouINCc0L7QttC00LAg0ZvQtdGC0LUg0LzQvtGA0LDRgtC4INC00LAg0L7QvNC+0LPRg9Gb0LjRgtC1INCy0LjRiNC1ICIKKyLQv9GA0L7RgtC+0LrQvtC70LAg0L/RgNC10L3QvtGB0LAg0LjQu9C4INC80L7QttC00LAg0L3QsCDQvdC10LrQuCDQtNGA0YPQs9C4INC90LDRh9C40L0g0L3QtdC00L7RgdGC0LDRmNC1INC/0YDQsNCy0Lgg0L/RgNC40LrRmdGD0YfQsNC6ICIKKyLQoNCi0KHQnyDQv9GA0L7RiNC40YDQtdGa0LAg0JPQodGC0YDQuNC80LXRgNCwLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyLQndC1INC80L7Qs9GDINC00LAg0L/QvtC60YDQtdC90LXQvCDQt9Cy0YPRh9C90Lgg0YPRgNC10ZLQsNGYINGA0LDQtNC4INC/0YPRiNGC0LDRmtCwLiDQo9GA0LXRktCw0Zgg0LrQvtGA0LjRgdGC0Lgg0L3QtdC60LAg0LTRgNGD0LPQsCAiCisi0LDQv9C70LjQutCw0YbQuNGY0LAuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyLQndC1INC80L7Qs9GDINC00LAg0L/QvtC60YDQtdC90LXQvCDQsNGD0LTQuNC+INGD0YDQtdGS0LDRmCDRgNCw0LTQuCDQv9GD0YjRgtCw0ZrQsC4g0J3QtdC80LDRgtC1INC+0LLQu9Cw0YjRm9C10ZrQtSDQt9CwINC/0L7QutGA0LXRgtCw0ZrQtSAiCisi0YPRgNC10ZLQsNGY0LAuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgItCd0LUg0LzQvtCz0YMg0LTQsCDQv9C+0LrRgNC10L3QtdC8INC30LLRg9GH0L3QuCDRg9GA0LXRktCw0Zgg0YDQsNC00Lgg0L/Rg9GI0YLQsNGa0LAuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorItCd0LUg0LzQvtCz0YMg0LTQsCDQv9C+0LrRgNC10L3QtdC8INC30LLRg9GH0L3QuCDRg9GA0LXRktCw0Zgg0YDQsNC00Lgg0L/Rg9GI0YLQsNGa0LAuINCe0LLQviDQuNC30LTQsNGa0LUg0YHQuNGB0YLQtdC80LAg0L7RgtCy0L7RgNC10L3QvtCzICIKKyLQt9Cy0YPQutCwINC90LjRmNC1INC/0L7QtNGA0LbQsNC90L4g0L7QstC40Lwg0LXQu9C10LzQtdC90YLQvtC8LiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLQn9GD0YjRgtCw0ZrQtSDQvdC40ZjQtSDQv9C+0LTRgNC20LDQvdC+INC+0LQg0YHRgtGA0LDQvdC1INC+0LLQvtCzINC30LLRg9GH0L3QvtCzINGD0YDQtdGS0LDRmNCwLiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAi0JPRgNC10YjQutCwINC/0YDQuNC70LjQutC+0Lwg0L/Rg9GI0YLQsNGa0LAg0LfQstGD0LrQsC4iCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgItCh0L3QuNC80LDRmtC1INC90LjRmNC1INC/0L7QtNGA0LbQsNC90L4g0L7QtCDRgdGC0YDQsNC90LUg0L7QstC+0LMg0LfQstGD0YfQvdC+0LMg0YPRgNC10ZLQsNGY0LAuIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAi0JPRgNC10YjQutCwINC/0YDQuNC70LjQutC+0Lwg0YHQvdC40LzQsNGa0LAg0YHQsCDQt9Cy0YPRh9C90L7QsyDRg9GA0LXRktCw0ZjQsC4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyLQndC1INC80L7Qs9GDINC00LAg0L/QvtC60YDQtdC90LXQvCDQsNGD0LTQuNC+INGD0YDQtdGS0LDRmCDRgNCw0LTQuCDRgdC90LjQvNCw0ZrQsC4g0J3QtdC80LDRgtC1INC+0LLQu9Cw0YjRm9C10ZrQtSDQt9CwINC/0L7QutGA0LXRgtCw0ZrQtSAiCisi0YPRgNC10ZLQsNGY0LAuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICLQndC1INC80L7Qs9GDINC00LAg0L/QvtC60YDQtdC90LXQvCDQt9Cy0YPRh9C90Lgg0YPRgNC10ZLQsNGYINGA0LDQtNC4INGB0L3QuNC80LDRmtCwLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICLQndC40YHQsNC8INC90LDRiNCw0L4g0LrRmdGD0YfQvdC4INGD0YDQtdGS0LDRmCDQt9Cy0YPQutCwIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICLQndC1INC80L7Qs9GDINC00LAg0L7RgtCy0L7RgNC40Lwg0LrRmdGD0YfQvdC4INGD0YDQtdGS0LDRmCDQt9Cy0YPQutCwIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAi0JjQt9Cy0L7RgCDRgdC90LjQvNCw0ZrQsCIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgItCc0LjQutGA0L7RhNC+0L0iCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICLQm9C40L3QuNGY0YHQutC4INGD0LvQsNC3IgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgItCj0L3Rg9GC0YDQsNGI0ZrQuCDQptCUIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgItCh0J/QlNCY0KQg0YPQu9Cw0LciCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAi0JDQo9ClIDEg0YPQu9Cw0LciCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAi0JDQo9ClIDIg0YPQu9Cw0LciCisKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAi0J/QvtCy0YDQsNGC0L3QsCDQv9C10YLRmdCwINC60L7QtNC10LrQsCIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAi0J/QvtCy0YDQsNGC0L3QsCDQv9C10YLRmdCwINCh0LDQvdCS0KLQoS3QsCIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAi0IjQsNGH0LjQvdCwINC30LLRg9C60LAiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICLQn9C+0ZjQsNGH0LDRmtC1IgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAi0J/RgNCw0ZvQtdGa0LUiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICLQo9Cz0YDQsNGS0LXQvdC4INC30LLRg9GH0L3QuNC6IgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICLQodC70YPRiNCw0LvQuNGG0LUiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAi0JvQuNC90LjRmNGB0LrQuCDQuNC30LvQsNC3IgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICLQodCf0JTQmNCkINC40LfQu9Cw0LciCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgItCQ0KPQpSAxINC40LfQu9Cw0LciCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgItCQ0KPQpSAyINC40LfQu9Cw0LciCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0JPRgNC10YjQutCwINC/0YDQuNC70LjQutC+0Lwg0YfQuNGC0LDRmtCwICVkINCx0LDRmNGC0L7QstCwINGB0LAg0YPRgNC10ZLQsNGY0LAg4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisi0J3QuNGB0LDQvCDRg9GB0L/QtdC+INC00LAg0L3Rg9C80LXRgNC40YjQtdC8INC80L7Qs9GD0ZvQuCDRg9GA0LXRktCw0Zgg0LfQsNC/0LjRgdCwINGB0L3QuNC80LrQsCDigJ4lc+KAnCDRgdCwINC60L7RmNC40Lwg0LzQvtC20LUg0LTQsCAiCisi0YDQsNC00LgiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgItCd0LUg0LzQvtCz0YMg0LTQsCDQvNCw0L/QuNGA0LDQvCDQv9C+0LzQvtGb0L3QtSDQvNC10LzQvtGA0LjRmNC1INGB0LAg0YPRgNC10ZLQsNGY0LAg4oCeJXPigJwiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgItCj0L/RgNCw0LLRmdCw0YfQutC4INC/0YDQvtCz0YDQsNC8INGD0YDQtdGS0LDRmNCwIOKAniVz4oCcINC90LUg0L/QvtC00YDQttCw0LLQsCDQo9CYINC90LDRh9C40L0gJWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICLQo9C/0YDQsNCy0ZnQsNGH0LrQuCDQv9GA0L7Qs9GA0LDQvCDRg9GA0LXRktCw0ZjQsCDigJ4lc+KAnCDQvdC1INC/0L7QtNGA0LbQsNCy0LAg0L3QuNGY0LXQtNCw0L0g0L/QvtC30L3QsNGC0Lgg0KPQmCDQvdCw0YfQuNC9LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICLQo9GA0LXRktCw0Zgg4oCeJXPigJwg0ZjQtSDQt9Cw0YPQt9C10YIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiCittc2dzdHIgItCj0YDQtdGS0LDRmCDigJ4lc+KAnCDQvdC1INC80L7QttC1INC00LAg0YHQvdC40LzQsCDQvdCwICVkeCVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorbXNnc3RyICLQo9GA0LXRktCw0Zgg4oCeJXPigJwg0L3QtSDQvNC+0LbQtSDQtNCwINGB0L3QuNC80LAg0YMg0L3QsNCy0LXQtNC10L3QvtC8INC30LDQv9C40YHRgyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICLQo9GA0LXRktCw0Zgg4oCeJXPigJwg0L3QtSDQv9C+0LTRgNC20LDQstCwINC90LUt0L3QtdC/0YDQtdC60LjQtNC90LUg0YDQsNCy0L3QuCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgItCd0LUg0LzQvtCz0YMg0LTQsCDQtNC+0LHQsNCy0LjQvCDQv9Cw0YDQsNC80LXRgtGA0LUg0L3QsCDRg9GA0LXRktCw0ZjRgyDigJ4lc+KAnCIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAi0JLQuNC00LXQviDRg9GA0LXRktCw0Zgg0L3QtSDQv9GA0LjRhdCy0LDRgtCwINC90L7QstC1INC/0L7RgdGC0LDQstC60LUg0L/RgNC+0YLQvtC60LAg0LrQsNC00YDQvtCy0LAuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAi0JLQuNC00LXQviDRg9GA0LXRktCw0Zgg0L3QtSDQvtCx0LXQt9Cx0LXRktGD0ZjQtSDQuNC30LvQsNC30L3QuCDQt9Cw0L/QuNGBLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICLQktC40LTQtdC+INGD0YDQtdGS0LDRmCDRmNC1INCy0YDQsNGC0LjQviDQvdC10LjRgdC/0YDQsNCy0L3QtSDQtNC40LzQtdC90LfQuNGY0LUuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgItCS0LjQtNC10L4g0YPRgNC10ZLQsNGY0Lgg0LrQvtGA0LjRgdGC0LUg0L3QtdC/0L7QtNGA0LbQsNC90Lgg0LzQtdGC0L7QtCDQv9GA0LXQv9C70LjRgtCw0ZrQsC4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAi0JLQuNC00LXQviDRg9GA0LXRktCw0ZjQuCDQutC+0YDQuNGB0YLQtSDQvdC10L/QvtC00YDQttCw0L3QuCDQt9Cw0L/QuNGBINGB0LvQuNGH0LjRhtC1LiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICLQndC40YHQsNC8INGD0YHQv9C10L4g0LTQsCDQv9C+0LTQtdGB0LjQvCDRg9C90YPRgtGA0LDRiNGa0Lgg0YHQvNC10YjRgtCw0Zgg0LzQtdGS0YPQvNC10LzQvtGA0LjRmNC1LiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAi0JLQuNC00LXQviDRg9GA0LXRktCw0Zgg0L3QtSDQv9GA0LXQtNC70LDQttC1INCy0LXQu9C40YfQuNC90YMg0LzQtdGS0YPQvNC10LzQvtGA0LjRmNC1LiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgItCd0LXQvNCwINGB0LzQtdGI0YLQsNGY0LAg0LTQvtGa0LXQsyDRgtC+0LrQsCDQuNC3INC60L7Qs9CwINGD0LLQtdGB0YLQuC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LjRgdCw0Lwg0YPRgdC/0LXQviDQtNCwINC00L7QsdCw0LLQuNC8INC/0L7QtNC10YjQsNCy0LDRmtCwINGC0ZjRg9C90LXRgNCwICVkINC90LAg0YPRgNC10ZLQsNGY0YMg4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCT0YDQtdGI0LrQsCDQtNC+0LHQsNCy0ZnQsNGa0LAg0LzQvtCz0YPRm9C90L7RgdGC0Lgg0LfQsCDRg9GA0LXRktCw0Zgg4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAi0KPRgNC10ZLQsNGYIOKAniVz4oCcINC90LjRmNC1INGC0ZjRg9C90LXRgC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICLQndC40YHQsNC8INGD0YHQv9C10L4g0LTQsCDQtNC+0LHQsNCy0LjQvCDRgNCw0LTQuNC+INGD0LvQsNC3INC90LAg0YPRgNC10ZLQsNGY0YMg4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAi0J3QuNGB0LDQvCDRg9GB0L/QtdC+INC00LAg0L/QvtC00LXRgdC40Lwg0YPQu9Cw0LcgJWQg0L3QsCDRg9GA0LXRktCw0ZjRgyAlcy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LjRgdCw0Lwg0YPRgdC/0LXQviDQtNCwINC40LfQvNC10L3QuNC8INGB0YLQsNGa0LUg0YPRgtC40YjQsNC90L7RgdGC0Lgg0LfQsCDRg9GA0LXRktCw0Zgg4oCeJXPigJwuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICLQndC40YHQsNC8INGD0YHQv9C10L4g0LTQsCDQtNC+0LTQtdC70LjQvCDQt9Cw0YLRgNCw0LbQtdC90YMg0LzQtdC80L7RgNC40ZjRgy4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAi0J3QuNGB0LDQvCDRg9GB0L/QtdC+INC00LAg0LTQvtC00LXQu9C40Lwg0LfQsNGC0YDQsNC20LXQvdGDINC80LXQvNC+0YDQuNGY0YMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgItCf0YDQtdGC0LLQsNGA0LDRhyDQvdCwINGD0YDQtdGS0LDRmNGDIOKAniVz4oCcINC90LXQvNCwINC/0L7QtNGA0LbQsNC90Lgg0YPQu9Cw0LfQvdC4INC30LDQv9C40YEiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgItCf0YDQtdGC0LLQsNGA0LDRhyDQvdCwINGD0YDQtdGS0LDRmNGDIOKAniVz4oCcINC90LXQvNCwINC/0L7QtNGA0LbQsNC90Lgg0LjQt9C70LDQt9C90Lgg0LfQsNC/0LjRgSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAi0JrQvtC00LXRgCDQvdCwINGD0YDQtdGS0LDRmNGDIOKAniVz4oCcINC90LXQvNCwINC/0L7QtNGA0LbQsNC90Lgg0YPQu9Cw0LfQvdC4INC30LDQv9C40YEiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICLQmtC+0LTQtdGAINC90LAg0YPRgNC10ZLQsNGY0YMg4oCeJXPigJwg0L3QtdC80LAg0L/QvtC00YDQttCw0L3QuCDQuNC30LvQsNC30L3QuCDQt9Cw0L/QuNGBIgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgItCd0LjRgdCw0Lwg0YPRgdC/0LXQviDQtNCwINC/0L7QutGA0LXQvdC10Lwg0L3QuNGCINC00LXQutC+0LTQuNGA0LDRmtCwLiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAi0J3QuNGB0LDQvCDRg9GB0L/QtdC+INC00LAg0L7QsdGA0LDQtNC40Lwg0LrQsNC00LDRgC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisi0JPRgNC10YjQutCwINC/0YDQuNC70LjQutC+0Lwg0LTQvtCx0LDQstGZ0LDRmtCwINC80L7Qs9GD0ZvQvdC+0YHRgtC4INC30LAg0YPRgNC10ZLQsNGYIOKAniVz4oCcOiDQndC40ZjQtSDQsjTQuzIg0YPQv9GA0LDQstGZ0LDRh9C60LggIgorItC/0YDQvtCz0YDQsNC8LiDQn9GA0L7QstC10YDQuNGC0LUg0LTQsCDQu9C4INGY0LUg0YLQviDQsjTQuzEg0YPQv9GA0LDQstGZ0LDRh9C60Lgg0L/RgNC+0LPRgNCw0LwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAi0J3QuNGB0LDQvCDRg9GB0L/QtdC+INC00LAg0L/RgNC+0L/QuNGC0LDQvCDRgdCy0L7RmNGB0YLQstCwINGD0L3QvtGB0LAgJWQg0YMg0YPRgNC10ZLQsNGY0YMgJXMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J3QuNGB0LDQvCDRg9GB0L/QtdC+INC00LAg0LTQvtCx0LDQstC40Lwg0L/QvtC00LXRiNCw0LLQsNGa0LAg0YLRmNGD0L3QtdGA0LAgJWQg0L3QsCDRg9GA0LXRktCw0ZjRgyDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICLQndC40YHQsNC8INGD0YHQv9C10L4g0LTQsCDQv9GA0L7Qv9C40YLQsNC8INC90L7RgNC80YMg0L3QsCDRg9GA0LXRktCw0ZjRgyDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LjRgdCw0Lwg0YPRgdC/0LXQviDQtNCwINC00L7QsdCw0LLQuNC8INGB0LLQvtGY0YHRgtCy0LAg0LrQvtC90YLRgNC+0LvQsCDQvdCwINGD0YDQtdGS0LDRmNGDIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICLQndC1INC80L7Qs9GDINC00LAg0YDQsNGB0L/QvtC30L3QsNC8INGD0YDQtdGS0LDRmCDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J7QstC+INC90LjRmNC1INGD0YDQtdGS0LDRmCDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICLQndC1INC80L7Qs9GDINC00LAg0L/QvtC60YDQtdC90LXQvCDRg9GA0LXRktCw0Zgg4oCeJXPigJwg0YDQsNC00Lgg0YfQuNGC0LDRmtCwINC4INGD0L/QuNGB0LAuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAi0KPRgNC10ZLQsNGYIOKAniVz4oCcINC90LjRmNC1INGD0YDQtdGS0LDRmCDQt9CwINGB0L3QuNC80LDRmtC1LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBvdXRwdXQgZGV2aWNlLiIKK21zZ3N0ciAi0KPRgNC10ZLQsNGYIOKAniVz4oCcINC90LjRmNC1INC40LfQu9Cw0LfQvdC4INGD0YDQtdGS0LDRmC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgTTJNIGRldmljZS4iCittc2dzdHIgItCj0YDQtdGS0LDRmCDigJ4lc+KAnCDQvdC40ZjQtSDQnDLQnCDRg9GA0LXRktCw0ZguIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICLQndC1INC80L7Qs9GDINC00LAg0YPQtNCy0L7RgdGC0YDRg9GH0LjQvCDRg9GA0LXRktCw0Zgg4oCeJXPigJwg0YDQsNC00Lgg0YfQuNGC0LDRmtCwINC4INGD0L/QuNGB0LAuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLQndC40YHQsNC8INGD0YHQv9C10L4g0LTQsCDQv9C+0LTQtdGB0LjQvCDQvdC+0YDQvNGDINC30LAg0YPRgNC10ZLQsNGYIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LjRgdCw0Lwg0YPRgdC/0LXQviDQtNCwINC00L7QsdCw0LLQuNC8INGC0LXQutGD0ZvRgyDRg9GH0LXRgdGC0LDQvdC+0YHRgiDRgtGY0YPQvdC10YDQsCDQt9CwINGD0YDQtdGS0LDRmCDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorItCd0LjRgdCw0Lwg0YPRgdC/0LXQviDQtNCwINC/0L7QtNC10YHQuNC8INGC0LXQutGD0ZvRgyDRg9GH0LXRgdGC0LDQvdC+0YHRgiDRgtGY0YPQvdC10YDQsCDQt9CwINGD0YDQtdGS0LDRmCDigJ4lc+KAnCDQvdCwICVsdSBIei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J3QuNGB0LDQvCDRg9GB0L/QtdC+INC00LAg0LTQvtCx0LDQstC40Lwg0ZjQsNGH0LjQvdGDINGB0LjQs9C90LDQu9CwINC30LAg0YPRgNC10ZLQsNGYIOKAniVz4oCcLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J3QuNGB0LDQvCDRg9GB0L/QtdC+INC00LAg0LTQvtCx0LDQstC40Lwg0LLRgNC10LTQvdC+0YHRgiDQt9CwINC60L7QvdGC0YDQvtC70YMgJWQg0L3QsCDRg9GA0LXRktCw0ZjRgyDigJ4lc+KAnC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LjRgdCw0Lwg0YPRgdC/0LXQviDQtNCwINC/0L7QtNC10YHQuNC8INCy0YDQtdC00L3QvtGB0YIgJWQg0LfQsCDQutC+0L3RgtGA0L7Qu9GDICVkINC90LAg0YPRgNC10ZLQsNGY0YMg4oCeJXPigJwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisi0J3QuNGB0LDQvCDRg9GB0L/QtdC+INC00LAg0LTQvtCx0LDQstC40Lwg0YLQtdC60YPRm9C4INGD0LvQsNC3INC90LAg0YPRgNC10ZLQsNGY0YMg4oCeJXPigJwuINCc0L7QttC00LAg0ZjQtSDRgtC+INGA0LDQtNC40L4g0YPRgNC10ZLQsNGYLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisi0J3QuNGB0LDQvCDRg9GB0L/QtdC+INC00LAg0LTQvtCx0LDQstC40Lwg0YLQtdC60YPRm9C4INC40LfQu9Cw0Lcg0L3QsCDRg9GA0LXRktCw0ZjRgyDigJ4lc+KAnC4g0JzQvtC20LTQsCDRmNC1INGC0L4g0YDQsNC00LjQviAiCisi0YPRgNC10ZLQsNGYLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICLQndC40YHQsNC8INGD0YHQv9C10L4g0LTQsCDQv9C+0LTQtdGB0LjQvCDQuNC30LvQsNC3ICVkINC90LAg0YPRgNC10ZLQsNGY0YMgJXMuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAi0J/RgNC+0LzQtdC90LAg0YDQtdC30L7Qu9GD0YbQuNGY0LUg0L/RgNC40LvQuNC60L7QvCDQuNC30LLRgNGI0LDQstCw0ZrQsCDRmNC+0Ygg0YPQstC10Log0L3QuNGY0LUg0L/QvtC00YDQttCw0L3QsC4iCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgItCd0LUg0LzQvtCz0YMg0LTQsCDRgNCw0LTQuNC8INCx0LXQtyDRgdCw0YLQsCIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAi0KPQvdGD0YLRgNCw0YjRmtCwINCz0YDQtdGI0LrQsCDRgtC+0LrQsCDQv9C+0LTQsNGC0LDQutCwLiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgItCj0L3Rg9GC0YBh0YjRmtCwINCz0YDQtdGI0LrQsCDQv9GA0L7RgtC+0LrQsCDQv9C+0LTQsNGC0LDQutCwLiIKKworI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAi0KPRgNC10ZLQsNGYIOKAniVz4oCcINC90LUg0L/QvtC00YDQttCw0LLQsCDQstC40LTQtdC+INGB0L3QuNC80LDRmtC1IgpkaWZmIC0tZ2l0IGEvcG8vc3YucG8gYi9wby9zdi5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTcyNjI3Ci0tLSAvZGV2L251bGwKKysrIGIvcG8vc3YucG8KQEAgLTAsMCArMSw0NDMgQEAKKyMgU3dlZGlzaCBtZXNzYWdlcyBmb3IgZ3N0LXBsdWdpbnMtZ29vZC4KKyMgQ29weXJpZ2h0IMKpIDIwMDctMjAxNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdzdC1wbHVnaW5zLWdvb2QgcGFja2FnZS4KKyMgQ2hyaXN0aWFuIFJvc2UgPG1lbnRob3NAbWVudGhvcy5jb20+LCAyMDA0LgorIyBEYW5pZWwgTnlsYW5kZXIgPHBvQGRhbmllbG55bGFuZGVyLnNlPiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMS4KKyMgU2ViYXN0aWFuIFJhc211c3NlbiA8c2VicmFzQGdtYWlsLmNvbT4sIDIwMTQsIDIwMTUsIDIwMTYuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDEuNy4yXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMTYtMDItMjAgMTY6MTMrMDEwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogU2ViYXN0aWFuIFJhc211c3NlbiA8c2VicmFzQGdtYWlsLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiBTd2VkaXNoIDx0cC1zdkBsaXN0b3IudHAtc3Yuc2U+XG4iCisiTGFuZ3VhZ2U6IHN2XG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiWC1HZW5lcmF0b3I6IFBvZWRpdCAxLjguN1xuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICJKYWNrLXNlcnZlciBoaXR0YWRlcyBlaiIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiTWlzc2x5Y2thZGVzIG1lZCBhdHQgYXZrb2RhIEpQRUctYmlsZCIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAiXCIlc1wiIGF2IFwiJXNcIiIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiS3VuZGUgaW50ZSBhbnNsdXRhIHRpbGwgc2VydmVybiIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJJbmdlbiBVUkwgaW5zdMOkbGxkLiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiS3VuZGUgaW50ZSBzbMOlIHVwcCBzZXJ2ZXJuYW1uZXQuIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIkt1bmRlIGludGUgZXRhYmxlcmEgYW5zbHV0bmluZyB0aWxsIHNlcnZlcm4uIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAiU8Oka2VyIGFuc2x1dG5pbmcgbWlzc2x5Y2thZGVzLiIKKworbXNnaWQgIiIKKyJBIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQsIG9yIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS4iCittc2dzdHIgIkV0dCBuw6R0dmVya3NmZWwgaW50csOkZmZhZGUgZWxsZXIgc2VydmVybiBzdMOkbmdkZSBhbnNsdXRuaW5nZW4gb3bDpG50YXQuIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICJTZXJ2ZXJuIHNraWNrYWRlIGZlbGFrdGlndCBkYXRhLiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICJTZXJ2ZXJuIHN0w7ZkZXIgaW50ZSBzw7ZrbmluZy9zcG9sbmluZy4iCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIkluZ2V0IGVsbGVyIG9naWx0aWd0IGluZ8OlbmdzbGp1ZC4gQVZJLXN0csO2bW1lbiBrb21tZXIgYXR0IHNrYWRhcy4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIkRlbiBow6RyIGZpbGVuIGlubmVow6VsbGVyIGluZ2EgdXBwc3BlbG5pbmdzYmFyYSBzdHLDtm1tYXIuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGludmFsaWQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJEZW4gaMOkciBmaWxlbiDDpHIgb2dpbHRpZyBvY2gga2FuIGludGUgc3BlbGFzIHVwcC4iCisKK21zZ2lkICJDYW5ub3QgcGxheSBzdHJlYW0gYmVjYXVzZSBpdCBpcyBlbmNyeXB0ZWQgd2l0aCBQbGF5UmVhZHkgRFJNLiIKK21zZ3N0ciAiS2FuIGVqIHNwZWxhIHN0csO2bSBkw6UgZGVuIMOkciBrcnlwdGVyYWQgbWVkIFBsYXlSZWFkeSBEUk0uIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJEZW4gaMOkciBmaWxlbiDDpHIgc2thZGFkIG9jaCBrYW4gaW50ZSBzcGVsYXMgdXBwLiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiT2dpbHRpZyBhdG9tc3Rvcmxlay4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkRlbiBow6RyIGZpbGVuIMOkciBpbnRlIGZ1bGxzdMOkbmRpZyBvY2gga2FuIGludGUgc3BlbGFzIHVwcC4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIlZpZGVvbiBpIGRlbiBow6RyIGZpbGVuIGthbnNrZSBpbnRlIGthbiBzcGVsYXMgdXBwIGtvcnJla3QuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyB0b28gbWFueSBzdHJlYW1zLiBPbmx5IHBsYXlpbmcgZmlyc3QgJWQiCittc2dzdHIgIiIKKyJEZW4gaMOkciBmaWxlbiBpbm5laMOlbGxlciBmw7ZyIG3DpW5nYSBzdHLDtm1tYXIuIFNwZWxhciBlbmRhc3QgdXBwIGRlIGbDtnJzdGEgJWQiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorIkluZ2VuIHN0csO2bSBzb20gc3TDtmRzIGhpdHRhZGVzLiBEdSBrYW5za2UgYmVow7Z2ZXIgaW5zdGFsbGVyYSBlbiBHU3RyZWFtZXItIgorImluc3RpY2tzbW9kdWwgZsO2ciBSVFNQIGbDtnIgUmVhbCBNZWRpYS1zdHLDtm1tYXIuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiSW5nZW4gc3Ryw7ZtIHNvbSBzdMO2ZHMgaGl0dGFkZXMuIER1IGthbnNrZSBiZWjDtnZlciB0aWxsw6V0YSBmbGVyICIKKyJ0cmFuc3BvcnRwcm90b2tvbGwgZWxsZXIgc8OlIHNha25hciBkdSBrYW5za2UgZGV0IHLDpHR0YSBHU3RyZWFtZXItdGlsbMOkZ2dldCAiCisiZsO2ciBSVFNQLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyJLdW5kZSBpbnRlIMO2cHBuYSBsanVkZW5oZXRlbiBmw7ZyIHVwcHNwZWxuaW5nLiBFbmhldGVuIGFudsOkbmRzIGF2IGV0dCBhbm5hdCAiCisicHJvZ3JhbS4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIkt1bmRlIGludGUgw7ZwcG5hIGxqdWRlbmhldGVuIGbDtnIgdXBwc3BlbG5pbmcuIER1IGhhciBpbnRlIGJlaMO2cmlnaGV0IGF0dCAiCisiw7ZwcG5hIGVuaGV0ZW4uIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIkt1bmRlIGludGUgw7ZwcG5hIGxqdWRlbmhldGVuIGbDtnIgdXBwc3BlbG5pbmcuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIkt1bmRlIGludGUgw7ZwcG5hIGxqdWRlbmhldGVuIGbDtnIgdXBwc3BlbG5pbmcuIERlbm5hIHZlcnNpb24gYXYgT3BlbiBTb3VuZCAiCisiU3lzdGVtIHN0w7ZkcyBpbnRlIGF2IGRldHRhIGVsZW1lbnQuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIlVwcHNwZWxuaW5nIHN0w7ZkcyBpbnRlIGF2IGRlbm5hIGxqdWRlbmhldC4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIkZlbCB2aWQgbGp1ZHVwcHNwZWxuaW5nLiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiSW5zcGVsbmluZyBzdMO2ZHMgaW50ZSBhdiBkZW5uYSBsanVkZW5oZXQuIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiRmVsIHZpZCBpbnNwZWxuaW5nIGZyw6VuIGxqdWRlbmhldGVuLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIkt1bmRlIGludGUgw7ZwcG5hIGxqdWRlbmhldGVuIGbDtnIgaW5zcGVsbmluZy4gRHUgaGFyIGludGUgYmVow7ZyaWdoZXQgYXR0ICIKKyLDtnBwbmEgZW5oZXRlbi4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIkt1bmRlIGludGUgw7ZwcG5hIGxqdWRlbmhldGVuIGbDtnIgaW5zcGVsbmluZy4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiQ29yZUF1ZGlvLWVuaGV0IGhpdHRhZGVzIGludGUiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIkNvcmVBdWRpby1lbmhldCBrdW5kZSBpbnRlIMO2cHBuYXMiCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICJJbnNwZWxuaW5nc2vDpGxsYSIKKworbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIk1pa3JvZm9uIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAiTGluamUtSW4iCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiSW50ZXJuIGNkLXNwZWxhcmUiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiU1BESUYgSW4iCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiQVVYIDEgSW4iCisKK21zZ2lkICJBVVggMiBJbiIKK21zZ3N0ciAiQVVYIDIgSW4iCisKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiT21rb2Rhci3DpXRlcmtvcHBsaW5nc3NsaW5nYSIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiU3VuVlRTLcOldGVya29wcGxpbmdzc2xpbmdhIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICJWb2x5bSIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIkbDtnJzdMOkcmsiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICJNb25pdG9yIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiSW5ieWdnZCBow7ZndGFsYXJlIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICJIw7ZybHVyIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIkxpbmplIHV0IgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJTUERJRiB1dCIKKworbXNnaWQgIkFVWCAxIE91dCIKK21zZ3N0ciAiQVVYIDEgdXQiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIkFVWCAyIHV0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZlbCB2aWQgbMOkc25pbmcgYXYgJWQgYnl0ZSBmcsOlbiBlbmhldGVuIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKyJNaXNzbHlja2FkZXMgbWVkIGF0dCByw6RrbmEgdXBwIG3DtmpsaWdhIHZpZGVvZm9ybWF0IHNvbSBlbmhldGVuIFwiJXNcIiBrYW4gIgorImFyYmV0YSBtZWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIkt1bmRlIGludGUgbWFwcGEgYnVmZmVydGFyIGZyw6VuIGVuaGV0ZW4gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIElPIG1ldGhvZCAlZCIKK21zZ3N0ciAiRHJpdnJ1dGluZW4gZsO2ciBlbmhldGVuIFwiJXNcIiBzdMO2ZGVyIGludGUgSU8tbWV0b2QgJWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICJEcml2cnV0aW5lbiBmw7ZyIGVuaGV0ZW4gXCIlc1wiIHN0w7ZkZXIgaW50ZSBuw6Vnb24ga8OkbmQgSU8tbWV0b2QuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIkVuaGV0ZW4gXCIlc1wiIMOkciB1cHB0YWdlbiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiRW5oZXRlbiBcIiVzXCIga2FuIGludGUgZsOlbmdhIGkgJWR4JWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIkVuaGV0ZW4gXCIlc1wiIGthbiBpbnRlIGbDpW5nYSBpIGRldCBhbmdpdm5hIGZvcm1hdGV0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIkVuaGV0ZW4gXCIlc1wiIHN0w7ZkZXIgaW50ZSBpY2tlLWtvbnRpbnVlcmxpZ2EgcGxhbiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIkt1bmRlIGludGUgZsOlIHRhZyBpIHBhcmFtZXRyYXIgcMOlIGVuaGV0ZW4gXCIlc1wiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgYWNjZXB0IG5ldyBmcmFtZSByYXRlIHNldHRpbmcuIgorbXNnc3RyICJWaWRlb2VuaGV0ZW4gYWNjZXB0ZXJhZGUgaW50ZSBueSBpbnN0w6RsbG5pbmcgZsO2ciBiaWxkZnJla3ZlbnMuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiVmlkZW9lbmhldGVuIHRpbGxoYW5kYWjDtmxsIGluZ2V0IHV0Z8OlbmdzZm9ybWF0LiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICJWaWRlb2VuaGV0ZW4gcmV0dXJuZXJhZGUgb2dpbHRpZ2EgZGltZW5zaW9uZXIuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIlZpZGVvZW5oZXRlciBhbnbDpG5kZXIgZW4gc2FtbWFuZmzDpHRuaW5nc21ldG9kIHNvbSBlaiBzdMO2ZHMuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIlZpZGVvZW5oZXRlciBhbnbDpG5kZXIgZXR0IHBpeGVsLWZvcm1hdCBzb20gZWogc3TDtmRzLiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICJNaXNzbHlja2FkZXMgbWVkIGF0dCBrb25maWd1cmVyYSBpbnRlcm4gYnVmZmVydC1wb29sLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiVmlkZW9lbmhldGVuIGbDtnJlc2xvZyBpbnRlIG55IGJ1ZmZlcnRzdG9ybGVrLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIkluZ2VuIG5lZHN0csO2bXMtcG9vbCBhdHQgaW1wb3J0ZXJhIGZyw6VuLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIk1pc3NseWNrYWRlcyBtZWQgYXR0IGbDpSB0YWcgaSBpbnN0w6RsbG5pbmdhcm5hIGbDtnIgbW90dGFnYXJlICVkIHDDpSBlbmhldGVuICIKKyJcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkZlbCB2aWQgbMOkc25pbmcgYXYgZsO2cm3DpWdvciBmw7ZyIGVuaGV0ZW4gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIkVuaGV0ZW4gXCIlc1wiIMOkciBpbmdlbiBtb3R0YWdhcmUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiS3VuZGUgaW50ZSBzdMOkbGxhIGluIHJhZGlvaW5nw6VuZyBww6UgZW5oZXRlbiBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiS3VuZGUgaW50ZSBzdMOkbGxhIGluIGluZ8OlbmcgJWQgcMOlIGVuaGV0ZW4gJXMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJNaXNzbHlja2FkZXMgbWVkIGF0dCDDpG5kcmEgcMOlIGxqdWRsw7ZzLWzDpGdlIGbDtnIgZW5oZXRlbiBcIiVzXCIuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJNaXNzbHlja2FkZXMgYXR0IGFsbG9rZXJhIGJlZ8OkcnQgbWlubmUuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIk1pc3NseWNrYWRlcyBtZWQgYXR0IGFsbG9rZXJhIGJlZ8OkcnQgbWlubmUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIktvbnZlcnRvcm4gcMOlIGVuaGV0ZW4gJXMgaGFyIGluZ2V0IGluZ8OlbmdzZm9ybWF0IHNvbSBzdMO2ZHMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIktvbnZlcnRvcm4gcMOlIGVuaGV0ZW4gJXMgaGFyIGluZ2V0IHV0Z8OlbmdzZm9ybWF0IHNvbSBzdMO2ZHMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIktvZGFyZW4gcMOlIGVuaGV0ZW4gJXMgaGFyIGluZ2V0IGluZ8OlbmdzZm9ybWF0IHNvbSBzdMO2ZHMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJLb2RhcmVuIHDDpSBlbmhldGVuICVzIGhhciBpbmdldCB1dGfDpW5nc2Zvcm1hdCBzb20gc3TDtmRzIgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIk1pc3NseWNrYWRlcyBtZWQgYXR0IHN0YXJ0YSBhdmtvZG5pbmdzdHLDpWQuIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICJNaXNzbHlja2FkZXMgYXR0IGJlaGFuZGxhIHJhbS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisiRmVsIHZpZCBsw6RzbmluZyBhdiBmw7ZybcOlZ29yIGbDtnIgZW5oZXRlbiBcIiVzXCI6IERldCDDpHIgaW50ZSBlbiB2NGwyLSIKKyJkcml2cnV0aW4uIEtvbnRyb2xsZXJhIG9tIGRldCDDpHIgZW4gdjRsMS1kcml2cnV0aW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiTWlzc2x5Y2thZGVzIG1lZCBhdHQgZnLDpWdhIGVmdGVyIGF0dHJpYnV0IGbDtnIgaW5nw6VuZyAlZCBpIGVuaGV0ZW4gJXMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIk1pc3NseWNrYWRlcyBtZWQgYXR0IGbDpSB0YWcgaSBpbnN0w6RsbG5pbmdlbiBmw7ZyIG1vdHRhZ2FyZSAlZCBww6UgZW5oZXRlbiBcIiVzIgorIlwiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk1pc3NseWNrYWRlcyBtZWQgYXR0IGZyw6VnYSBlZnRlciBub3JtIHDDpSBlbmhldGVuIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk1pc3NseWNrYWRlcyBtZWQgYXR0IGbDpSB0YWcgcMOlIGtvbnRyb2xsYXR0cmlidXRlbiBww6UgZW5oZXRlbiBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkt1bmRlIGludGUgaWRlbnRpZmllcmEgZW5oZXRlbiBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkRldCBow6RyIMOkciBpbnRlIGVuIGVuaGV0IFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJLdW5kZSBpbnRlIMO2cHBuYSBlbmhldGVuIFwiJXNcIiBmw7ZyIGzDpHNuaW5nIG9jaCBza3Jpdm5pbmcuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiRW5oZXRlbiBcIiVzXCIgw6RyIGluZ2VuIGbDpW5nc3RlbmhldC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIkVuaGV0ZW4gXCIlc1wiIMOkciBpbmdlbiB1dGfDpW5nc2VuaGV0LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiRW5oZXRlbiBcIiVzXCIgw6RyIGluZ2VuIE0yTS1lbmhldC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGR1cCBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIkt1bmRlIGludGUgZHVwbGljZXJhIGVuaGV0ZW4gXCIlc1wiIGbDtnIgbMOkc25pbmcgb2NoIHNrcml2bmluZy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIk1pc3NseWNrYWRlcyBtZWQgYXR0IHN0w6RsbGEgaW4gbm9ybSBmw7ZyIGVuaGV0ZW4gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJNaXNzbHlja2FkZXMgbWVkIGF0dCBnw6UgdGFnIHDDpSBha3R1ZWxsIG1vdHRhZ2FyZnJla3ZlbnMgZsO2ciBlbmhldGVuIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorIk1pc3NseWNrYWRlcyBtZWQgYXR0IHN0w6RsbGEgaW4gYWt0dWVsbCBtb3R0YWdhcmZyZWt2ZW5zIGbDtnIgZW5oZXRlbiBcIiVzXCIgIgorInRpbGwgJWx1IEh6LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJNaXNzbHlja2FkZXMgbWVkIGF0dCBmw6UgdGFnIHDDpSBzaWduYWxzdHlya2EgZsO2ciBlbmhldGVuIFwiJXNcIi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJNaXNzbHlja2FkZXMgbWVkIGF0dCBmw6UgdGFnIHDDpSB2w6RyZGV0IGbDtnIga29udHJvbGxlbiAlZCBww6UgZW5oZXRlbiBcIiVzXCIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJLdW5kZSBpbnRlIHN0w6RsbGEgaW4gdsOkcmRldCAlZCBmw7ZyIGtvbnRyb2xsZW4gJWQgcMOlIGVuaGV0ZW4gXCIlc1wiLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIk1pc3NseWNrYWRlcyBtZWQgYXR0IGbDpSB0YWcgcMOlIGFrdHVlbGwgaW5nw6VuZyBww6UgZW5oZXRlbiBcIiVzXCIuIEthbiB2YXJhIGVuICIKKyJyYWRpb2VuaGV0IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyJNaXNzbHlja2FkZXMgbWVkIGF0dCBmw6UgdGFnIHDDpSBha3R1ZWxsIHV0Z8OlbmcgcMOlIGVuaGV0ZW4gXCIlc1wiLiBLYW4gdmFyYSBlbiAiCisicmFkaW9lbmhldCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJNaXNzbHlja2FkZXMgbWVkIGF0dCBzdMOkbGxhIGluIHV0Z8OlbmcgJWQgcMOlIGVuaGV0ZW4gJXMuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiw4RuZHJpbmcgYXYgdXBwbMO2c25pbmcgdmlkIGvDtnJ0aWQgc3TDtmRzIGludGUgw6RuLiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiS2FuIGludGUgZnVuZ2VyYSB1dGFuIGVuIGtsb2NrYSIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAiSW50ZXJudCBmZWwgaSBkYXRhc3Ryw7ZtLiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgZmxvdyBlcnJvci4iCisjfiBtc2dzdHIgIkludGVybnQgZmVsIGkgZGF0YWZsw7ZkZS4iCisKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgIkVuaGV0ZW4gXCIlc1wiIHN0w7ZkZXIgaW50ZSB2aWRlb2luZsOlbmduaW5nLiIKZGlmZiAtLWdpdCBhL3BvL3RyLnBvIGIvcG8vdHIucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiYmE2MgotLS0gL2Rldi9udWxsCisrKyBiL3BvL3RyLnBvCkBAIC0wLDAgKzEsODA4IEBACisjIHRyYW5zbGF0aW9uIG9mIGdzdC1wbHVnaW5zLWdvb2QtMS4wLjMucG8gdG8gVHVya2lzaAorIyBUaGlzIGZpbGUgaXMgcHV0IGluIHRoZSBwdWJsaWMgZG9tYWluLgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgZ3N0LXBsdWdpbnMtZ29vZCBwYWNrYWdlLgorIyBTZXJ2ZXIgQWNpbSA8c2VydmVyYWNpbUBnbWFpbC5jb20+LCAyMDEwLgorIyBTZXJ2ZXIgQWNpbSA8c2VydmVyYWNpbUBnbWFpbC5jb20+LCAyMDExLgorIyBTZXJ2ZXIgQWNpbSA8c2VydmVyYWNpbUBnbWFpbC5jb20+LCAyMDEzLCAyMDE1LgorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZCAxLjQuMVxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDE1LTAxLTEwIDIxOjA3KzAxMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IFZvbGthbiBHZXplciA8dm9sa2FuZ2V6ZXJAZ21haWwuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IFR1cmtpc2ggPGdudS10ci11MTJhQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD5cbiIKKyJMYW5ndWFnZTogdHJcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD0obiA+IDEpO1xuIgorIlgtR2VuZXJhdG9yOiBMb2thbGl6ZSAxLjVcbiIKKworbXNnaWQgIkphY2sgc2VydmVyIG5vdCBmb3VuZCIKK21zZ3N0ciAiSmFjayBzdW51Y3VzdSBidWx1bmFtYWTEsSIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiSlBFRyBnw7Zyw7xudMO8c8O8bsO8IMOnw7Z6w7xtbGVuZW1lZGkiCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIiclcycgdGFyYWbEsW5kYW4gJyVzJyIKKworbXNnaWQgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciIKK21zZ3N0ciAiU3VudWN1eWEgYmHEn2xhbmFtxLF5b3IiCisKK21zZ2lkICJObyBVUkwgc2V0LiIKK21zZ3N0ciAiSGnDpyBiaXIgVVJMIGF5YXJsYW5tYW3EscWfLiIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAiU3VudWN1IGFkxLEgw6fDtnrDvG1sZW5lbWl5b3IuIgorCittc2dpZCAiQ291bGQgbm90IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHNlcnZlci4iCittc2dzdHIgIlN1bnVjdXlsYSBiYcSfbGFudMSxIGt1cnVsdW1heW9yLiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIkfDvHZlbmxpIGJhxJ9sYW50xLEgYXlhcsSxIHlhcMSxbGFtYWTEsS4iCisKKyMsIGZ1enp5Cittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorIkJpciBhxJ8gaGF0YXPEsSBtZXlkYW5hIGdlbGRpLCB2ZXlhIHN1bnVjdSBiYcSfbGFudMSxecSxIGJla2xlbm1leWVuIGJpciDFn2VraWxkZSAiCisia2VzdGkuIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICJTdW51Y3UgeWV0ZXJzaXogdmVyaSBnw7ZuZGVyZGkuIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgIlN1bnVjdSBhcmFtYXnEsSBkZXN0ZWtsZW1peW9yLiIKKworbXNnaWQgIk5vIG9yIGludmFsaWQgaW5wdXQgYXVkaW8sIEFWSSBzdHJlYW0gd2lsbCBiZSBjb3JydXB0LiIKK21zZ3N0ciAiR2XDp2VybGkgYmlyIHNlcyBnaXJpxZ9pIGJ1bHVuYW1hZMSxLiBBVkkgYWvEscWfxLEga2VzaWxlY2VrLiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAiRG9zeWEgw6dhbMSxbmFiaWxpciBha8SxxZ9sYXIgacOnZXJtaXlvci4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkJ1IGRvc3lhIGdlw6dlcnNpeiB2ZSBveW5hdMSxbGFtYXouIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIkFrxLHFnyDDp2FsxLFuYW1hZMSxIMOnw7xua8O8IFBsYXlSZWFkeSBEUk0gaWxlIMWfaWZyZWxlbm1pxZ8uIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGNvcnJ1cHQgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICJCdSBkb3N5YSBib3p1ayB2ZSBveW5hdMSxbGFtYXouIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICJHZcOnZXJzaXogYXRvbSBib3l1dHUiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW5jb21wbGV0ZSBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIkRvc3lhIGVrc2lrIHZlIG95bmF0xLFsYW1hei4iCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIkJ1IGRvc3lhZGFraSB2aWR5byBkb8SfcnUgb3luYXTEsWxhbcSxeWFiaWxpci4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiQnUgZG9zeWEgw6dvayBmYXpsYSBha8SxxZ8gacOnZXJpeW9yLiBTYWRlY2UgaWxraSBveW5hdMSxbMSxeW9yICVkIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJEZXN0ZWtsZW5lbiBiaXIgYWvEscWfIGJ1bHVuYW1hZMSxLiBSZWFsIE1lZGlhIGFrxLHFn2xhcsSxIGnDp2luIGJpciBHU3RyZWFtZXIgUlRTUCAiCisidXphbnTEsSBla2xlbnRpc2kga3VybWFsxLFzxLFuxLF6LiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorIkRlc3Rla2xlbmVuIGFrxLHFnyBidWx1bmFtYWTEsS4gRGFoYSBmYXpsYSBha3RhcsSxbSBwcm90b2tvbMO8bmUgaXppbiB2ZXJtZW5peiAiCisidmV5YSBkb8SfcnUgR1N0cmVhbWVyIFJUU1AgdXphbnTEsSBla2xlbnRpc2luZSBvbmF5IHZlcm1lbml6IGdlcmVrZWJpbGlyLiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyICIKKyJhcHBsaWNhdGlvbi4iCittc2dzdHIgIiIKKyLDh2FsbWFrIGnDp2luIHNlcyBheWfEsXTEsSBhw6fEsWxhbcSxeW9yLiBBeWfEsXQgYmHFn2thIGJpciB1eWd1bGFtYSB0YXJhZsSxbmRhbiAiCisia3VsbGFuxLFsxLF5b3IuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIsOHYWxtYWsgacOnaW4gc2VzIGF5Z8SxdMSxIGHDp8SxbGFtxLF5b3IuIEF5Z8SxdMSxIGHDp21hIGl6bmluaXogYnVsdW5tdXlvci4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiIKK21zZ3N0ciAiw4dhbG1hayBpw6dpbiBzZXMgYXlnxLF0xLEgYcOnxLFsYW3EsXlvci4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisiw4dhbG1hIGnDp2luIHNlcyBheWfEsXTEsSBhw6fEsWxhbcSxeW9yLiBBw6fEsWsgU2VzIFNpc3RlbWknbmluIGJ1IHPDvHLDvG3DvCwgYnUgw7bEn2V5aSAiCisiZGVzdGVrbGVtaXlvci4iCisKK21zZ2lkICJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiQnUgc2VzIGF5Z8SxdMSxIMOnYWxtYXnEsSBkZXN0ZWtsZW1peW9yLiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAiU2VzIMOnYWxtYSBoYXRhc8SxLiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAiQnUgc2VzIGF5Z8SxdMSxIGtheWRldG1leWkgZGVzdGVrbGVtaXlvci4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJTZXMgYXlnxLF0xLFuZGFuIGtheWRldG1la3RlIGhhdGEuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICJLYXnEsXQgacOnaW4gYXlnxLF0xLEgYcOnYW3EsXlvci4gQXlnxLF0xLEgYcOnbWFrIGnDp2luIHlldGtpbml6IHlvay4iCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIkF5Z8SxdMSxIGthecSxdCBpw6dpbiBhw6dhbcSxeW9yLiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIiIKKworbXNnaWQgIlJlY29yZCBTb3VyY2UiCittc2dzdHIgIkthecSxdCBLYXluYcSfxLEiCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICJNaWtyb2ZvbiIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgIkhhdCBHaXJpxZ9pIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIkRhaGlsaSBDRCIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICJTUERJRiBHaXJpxZ9pIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIkFVWCAxIEdpcmnFnyIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJBVVggMiBHaXJpxZ8iCisKK21zZ2lkICJDb2RlYyBMb29wYmFjayIKK21zZ3N0ciAiS29kZWsgR2VyaWTDtm7DvMWfw7wiCisKK21zZ2lkICJTdW5WVFMgTG9vcGJhY2siCittc2dzdHIgIlN1blZUUyBHZXJpZMO2bsO8xZ/DvCIKKworbXNnaWQgIlZvbHVtZSIKK21zZ3N0ciAiU2VzIEdpcmnFn2kiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICJLYXphbsOnIgorCittc2dpZCAiTW9uaXRvciIKK21zZ3N0ciAiSG9wYXJsw7ZyIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAiVmFyc2F5xLFsYW4gSG9wYXJsw7ZyIgorCittc2dpZCAiSGVhZHBob25lIgorbXNnc3RyICJLdWxha2zEsWsiCisKK21zZ2lkICJMaW5lIE91dCIKK21zZ3N0ciAiSGF0IMOHxLFrxLHFn8SxIgorCittc2dpZCAiU1BESUYgT3V0IgorbXNnc3RyICJTUERJRiDDh8Sxa8SxxZ8iCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIkFVWCAxIMOHxLFrxLHFnyIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAiQVVYIDIgw4fEsWvEscWfIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiVkIGJheXQgYmlsZ2lsaSAnJXMnIGF5Z8SxdMSxbmRhbiBva3VtYWRhIGhhdGEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICJBeWfEsXTEsW4gJyVzJyBiaXJsaWt0ZSDDp2FsxLHFn2FiaWxlY2XEn2kgdmlkeW8ga2lwbGVyaW5pIHPEsXJhbGFtYWRhIGhhdGEiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIkF5Z8SxdHRhbiAnJXMnIGJlbGxla2xlciBlxZ9sZW5lbWl5b3IiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIkJ1IGF5Z8SxdMSxbiBzw7xyw7xjw7xzw7wgJyVzJyBJTyB5w7ZudGVtaW5pIGRlc3Rla2xlbWl5b3IgJWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICIiCisiQnUgYXlnxLF0xLFuIHPDvHLDvGPDvHPDvCAnJXMnIGJpbGluZW4gSU8gecO2bnRlbWxlcmluZGVuIGhlcmhhbmdpIGJpcmlzaW5pICIKKyJkZXN0ZWtsZW1peW9yLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBidXN5IgorbXNnc3RyICJBeWfEsXQgJyVzJyBtZcWfZ3VsIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICJBeWfEsXQgJyVzJyBnw7Zyw7xudMO8IHlha2FsYXlhbWFkxLElZHglZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAiQXlnxLF0ICclcycgYmVsaXJ0aWxlbiBraXB0ZSBnw7Zyw7xudMO8IHlha2FsYXlhbWFkxLEiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgZG9lcyBzdXBwb3J0IG5vbi1jb250aWd1b3VzIHBsYW5lcyIKK21zZ3N0ciAiQXlnxLF0ICclcycgYml0acWfaWsgb2xtYXlhbiBkw7x6bGVtbGVyaSBkZXN0ZWtsZW1peW9yIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiRGXEn2nFn3RpcmdlbGVyIGF5Z8SxdHRhbiAnJXMnIGFsxLFuYW3EsXlvciIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiVmlkeW8gYXlnxLF0xLEgeWVuaSDDp2Vyw6dldmUgb3JhbsSxIGF5YXJsYXLEsW7EsSBrYWJ1bCBldG1lZGkuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAiVmlkZW8gYXlnxLF0xLEgw6fEsWt0xLEgYmnDp2ltaW5pIHNhxJ9sYW1hZMSxLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICJWaWRlbyBheWfEsXTEsSBnZcOnZXJzaXogYm95dXRsYXIgZMO2bmTDvC4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAiVmlkZW8gYXlnxLF0bGFyxLEgZGVzdGVrbGVubWV5ZW4gYmlyIGJpcmJpcmluZSBnZcOnbWUgecO2bnRlbWkga3VsbGFuxLF5b3IuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIlZpZGVvIGF5Z8SxdGxhcsSxIGRlc3Rla2xlbm1leWVuIGJpciBwaWtzZWwgYmnDp2ltaW5pIGt1bGxhbsSxeW9yLiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICLEsMOnIHRhbXBvbiBiZWxsZWsgaGF2dXp1IHlhcMSxbGFuZMSxcsSxbGFtxLF5b3IuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICJWaWRlbyBheWfEsXTEsSBoZXJoYW5naSBiaXIgdGFtcG9uIGJlbGxlayBib3l1dHUgw7ZuZXJtZWRpLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIsSww6dlcmkgYWt0YXLEsWxhY2FrIGFrxLFudMSxIGhhdnV6dSB5b2suIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZ3Mgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLEsHN0YXN5b24gYXlhcmxhcsSxbsSxIGJ1bG1hIGnFn2xlbWkgJWQgxZ91IGF5Z8SxdHRhICclcycgYmHFn2FyxLFsYW1hZMSxLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJCdSBheWfEsXQgacOnaW4ga2FwYXNpdGUgYmlsZ2lzaSBhbMSxbmFtYWTEsSAnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIkF5Z8SxdCAnJXMnIGJpciByYWR5byBkZcSfaWwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAiUmFkeW8gZ2lyacWfIGRlxJ9lcmkgxZ91IGF5Z8SxdHRhICclcycgYXlhcmxhbmFtYWTEsS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICJHaXJpxZ8gZGXEn2VyaSBvbGFyYWsgYnUgJWQgxZ91IGF5Z8SxdHRhICVzIGF5YXJsYW5hbWFkxLEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJBeWfEsXQgJyVzJyBzdXN0dXJ1bG1heWEgYXlhcmxhbmFtYWTEsS4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGVkIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIkdlcmVrbGkgYmVsbGVrIGF5csSxbGFtYWTEsS4iCisKK21zZ2lkICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiR2VyZWtsaSBiZWxsZWsgYXlyxLFsYW3EsXlvci4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiQXlnxLF0ICVzIMO8emVyaW5kZWtpIGTDtm7DvMWfdMO8csO8Y8O8IGdpcmRpIGJpw6dpbWluaSBkZXN0ZWtsZW1peW9yIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJBeWfEsXQgJXMgw7x6ZXJpbmRla2kgZMO2bsO8xZ90w7xyw7xjw7wgw6fEsWt0xLEgYmnDp2ltaW5pIGRlc3Rla2xlbWl5b3IiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIkF5Z8SxdCAlcyDDvHplcmluZGVraSBrb2RsYXnEsWPEsSBnaXJkaSBiacOnaW1pbmkgZGVza3Rla2xlbWl5b3IiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICJBeWfEsXQgJXMgw7x6ZXJpbmRla2kga29kbGF5xLFjxLEgw6fEsWt0xLEgYmnDp2ltaW5pIGRlc2t0ZWtsZW1peW9yIgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIsOHw7Z6bWUgacWfaSBiYcWfbGFtYXPEsSBiYcWfYXLEsXPEsXouIgorCittc2dpZCAiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIgorbXNnc3RyICLEsMWfbGVtIMOnZXLDp2V2ZXNpIGJhxZ9hcsSxc8Sxei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJzogSXQgaXNuJ3QgYSB2NGwyIGRyaXZlci4gQ2hlY2sgaWYgIgorIml0IGlzIGEgdjRsMSBkcml2ZXIuIgorbXNnc3RyICIiCisixZ51IGF5Z8SxdMSxbiAnJXMnIMO2emVsbGlrbGVyaW5pIGFsbWFkYSBoYXRhOiBPIGJpciB2NGwyIHPDvHLDvGPDvHPDvCBkZcSfaWwuIE9udW4gIgorImJpciB2NGwxIHPDvHLDvGPDvHPDvCBvbHVwIG9sbWFkxLHEn8SxbsSxIGRlbmV0bGV5aW4uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiR2lyacWfIGRhdnJhbsSxxZ9sYXLEsSBzb3JndXN1ICVkIMWfdSBheWfEsXR0YSAlcyBiYcWfYXLEsWxhbWFkxLEiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiUmFkeW8gaXN0YXN5b251IGF5YXJsYXLEsW7EsSBidWxtYSAlZCDFn3UgYXlnxLF0dGEgJyVzJyBiYcWfYXLEsWxhbWFkxLEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAixZ51IGF5Z8SxdHRhICclcycgc29yZ3Ugbm9ybXVuYSBlcmnFn2lsZW1lZGkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJEZW5ldGltIGRhdnJhbsSxxZ9sYXLEsSDFn3UgYXlnxLF0dGEgJyVzJyBidWx1bmFtYWTEsS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQXlnxLF0IHRhbsSxbWxhbmFtxLF5b3IgJyVzJy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBpc24ndCBhIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQnUgYmlyIGF5Z8SxdCBkZcSfaWwnJXMnLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIsWedSBheWfEsXTEsSAnJXMnIG9rdW1hIHZlIHlhem1hIGnDp2luIGHDp2FtxLF5b3IuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiQXlnxLF0ICclcycgYmlyIHlha2FsYW1hIGF5Z8SxdMSxIGRlxJ9pbC4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIkF5Z8SxdCAnJXMnIGJpciDDp8Sxa8SxxZ8gYXlnxLF0xLEgZGXEn2lsLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiQXlnxLF0ICclcycgYmlyIE0yTSBheWfEsXTEsSBkZcSfaWwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJPa3VtYSB2ZSB5YXptYSBpw6dpbiAnJXMnIGF5Z8SxdMSxIGtvcHlhbGFuYW1hZMSxLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQXlnxLF0IGnDp2luICclcycgbm9ybSBkZcSfZXJsZXJpIGF5YXJsYW5hbWFkxLEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiQXlnxLF0IGnDp2luICclcycgcmFkeW8gZnJla2Fuc2xhcsSxIGF5YXJsYW5hbWFkxLEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgIkF5Z8SxdCBpw6dpbiAnJXMnIHJhZHlvIGZyZWthbnPEsSAlbHUgSHogacOnaW4geWFwxLFsYW1hZMSxLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJBeWfEsXQgacOnaW4gJyVzJyBnw7zDp2zDvCBzaW55YWwgYWzEsW3EsSBnZXLDp2VrbGXFn2VtZWRpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiRGVuZXRpbSBkZcSfZXJpIMWfdW5hICVkIGJ1IGF5Z8SxdHRhICclcycgYXlhcmxhbmFtYWTEsS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkRlxJ9lciAlZCBkZW5ldGltIGnDp2luICVkIMWfdSBheWfEsXR0YSAnJXMnIGF5YXJsYW5hbWFkxLEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisixZ51IGF5Z8SxdHRhICclcycgZ2XDp2VybGkgZ2lyacWfIGVsZGUgZWRpbGVtZWRpLiBPIGJpciByYWR5byBheWfEsXTEsSBvbGFiaWxpci4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIsWedSBheWfEsXR0YSAnJXMnIGdlw6dlcmxpIGdpcmnFnyBlbGRlIGVkaWxlbWVkaS4gTyBiaXIgcmFkeW8gYXlnxLF0xLEgb2xhYmlsaXIuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIsOHxLFrxLHFnyBkZcSfZXJpIG9sYXJhayAlZCDFn3UgYXlnxLF0dGEgJXMgZWxkZSBlZGlsZW1lZGkuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiw4dhbMSxxZ/EsXJrZW4gw6fDtnrDvG7DvHJsw7zEn8O8IGRlxJ9pxZ90aXJtZWsgaGVuw7x6IGRlc3Rla2xlbm1peW9yLiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiU2FhdCBvbG1hZGFuIMOnYWzEscWfYW1heiIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAixLDDpyB2ZXJpIGFrxLFtIGhhdGFzxLEuIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAixLDDpyB2ZXJpIGFrxLHFnyBoYXRhc8SxLiIKKworI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAiQXlnxLF0ICclcycgdmlkZW8geWFrYWxhbWF5xLEgZGVzdGVrbGVtaXlvciIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIlNlcyBzdW51Y3VzdXlsYSBiYcSfbGFudMSxIGt1cnVsdW1heW9yIgorCisjfiBtc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IHNvdW5kIHNlcnZlciBjYXBhYmlsaXRpZXMiCisjfiBtc2dzdHIgIlNlcyBzdW51Y3VzdSBvbGFuYWtsYXLEsSBzb3JndWxhbmFtYWTEsSIKKworI34gbXNnaWQgIkJhc3MiCisjfiBtc2dzdHIgIkJhcyIKKworI34gbXNnaWQgIlRyZWJsZSIKKyN+IG1zZ3N0ciAiVGl6IgorCisjfiBtc2dpZCAiU3ludGgiCisjfiBtc2dzdHIgIlN5bnRoaXNpemVyIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICJQQ00iCisKKyN+IG1zZ2lkICJTcGVha2VyIgorI34gbXNnc3RyICJIb3BhcmzDtnIiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICJIYXQgZ2lyacWfaSIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJLYXLEscWfdMSxcsSxY8SxIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiUmVjb3JkIgorI34gbXNnc3RyICJLYXnEsXQiCisKKyN+IG1zZ2lkICJJbi1nYWluIgorI34gbXNnc3RyICJLYXphbsOnLWdpcmnFn2kiCisKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAiS2F6YW7Dpy3Dp8Sxa8SxxZ/EsSIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAiSGF0LTEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgIkhhdC0yIgorCisjfiBtc2dpZCAiTGluZS0zIgorI34gbXNnc3RyICJIYXQtMyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAiU2F5xLFzYWwtMSIKKworI34gbXNnaWQgIkRpZ2l0YWwtMiIKKyN+IG1zZ3N0ciAiU2F5xLFzYWwtMiIKKworI34gbXNnaWQgIkRpZ2l0YWwtMyIKKyN+IG1zZ3N0ciAiU2F5xLFzYWwtMyIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICJGb25vLWdpcmnFnyIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAiRm9uby3Dp8Sxa8SxxZ8iCisKKyN+IG1zZ2lkICJWaWRlbyIKKyN+IG1zZ3N0ciAiVmlkeW8iCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAiUmFkeW8iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIgorI34gbXNnc3RyICJNaWtzZXIgZGVuZXRpbWkgacOnaW4gc2VzIGF5Z8SxdMSxIGHDp8SxbGFtxLF5b3IuIgorCisjfiBtc2dpZCAiIgorI34gIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4gVGhpcyB2ZXJzaW9uIG9mICIKKyN+ICJ0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorI34gbXNnc3RyICIiCisjfiAiTWlrc2VyIGRlbmV0aW1pIGnDp2luIHNlcyBheWfEsXTEsSBhw6fEsWxhbcSxeW9yLiBBw6fEsWsgU2VzIFNpc3RlbWluaW4gYnUgIgorI34gInPDvHLDvG3DvCwgYnUgw7bEn2V5aSBkZXN0ZWtsZW1peW9yLiIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAiTWFzdGVyIgorCisjfiBtc2dpZCAiRnJvbnQiCisjfiBtc2dzdHIgIsOWbiIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIkFya2EiCisKKyN+IG1zZ2lkICJIZWFkcGhvbmVzIgorI34gbXNnc3RyICJLdWxha2zEsWtsYXIiCisKKyN+IG1zZ2lkICJDZW50ZXIiCisjfiBtc2dzdHIgIk1lcmtleiIKKworI34gbXNnaWQgIkxGRSIKKyN+IG1zZ3N0ciAiTEZFIgorCisjfiBtc2dpZCAiU3Vycm91bmQiCisjfiBtc2dzdHIgIlN1cnJvdW5kIgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAiWWFuIgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAiQVVYIMOHxLFrxLHFnyIKKworI34gbXNnaWQgIjNEIERlcHRoIgorI34gbXNnc3RyICIzRCBEZXJpbmxpayIKKworI34gbXNnaWQgIjNEIENlbnRlciIKKyN+IG1zZ3N0ciAiM0QgTWVya2V6IgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAiM0QgR2VuacWfbGlrIgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICJUZWxlZm9uIgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgIlZpZHlvIEdpcmnFn2kiCisKKyN+IG1zZ2lkICJBVVggSW4iCisjfiBtc2dzdHIgIkFVWCBHaXJpxZ8iCisKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAiS2F5xLF0IEthemFuY8SxIgorCisjfiBtc2dpZCAiT3V0cHV0IEdhaW4iCisjfiBtc2dzdHIgIsOHxLFrxLHFnyBLYXphbmPEsSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgQm9vc3QiCisjfiBtc2dzdHIgIk1pa3JvZm9uIFNldml5ZSBZw7xrc2VsdG1lIgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAiQXlhcmxhciIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgIkJhc3MgQXJ0dMSxcsSxbSIKKworI34gbXNnaWQgIlBsYXliYWNrIFBvcnRzIgorI34gbXNnc3RyICLDh2FsbWEgUG9ydGxhcsSxIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgIkdpcmnFnyIKKworI34gbXNnaWQgIk1vbml0b3IgU291cmNlIgorI34gbXNnc3RyICJIb3BhcmzDtnIgS2F5bmHEn8SxIgorCisjfiBtc2dpZCAiS2V5Ym9hcmQgQmVlcCIKKyN+IG1zZ3N0ciAiS2xhdnllIEJpcGxlbWVzaSIKKworI34gbXNnaWQgIlNpbXVsYXRlIFN0ZXJlbyIKKyN+IG1zZ3N0ciAiU3RlcmVvIFNpbcO8bGFzeW9udSIKKworI34gbXNnaWQgIlN0ZXJlbyIKKyN+IG1zZ3N0ciAiU3RlcmVvIgorCisjfiBtc2dpZCAiU3Vycm91bmQgU291bmQiCisjfiBtc2dzdHIgIlN1cnJvdW5kIFNlc2kiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIk1pa3JvZm9uIEthemFuY8SxIgorCisjfiBtc2dpZCAiU3BlYWtlciBTb3VyY2UiCisjfiBtc2dzdHIgIkhvcGFybMO2ciBLYXluYcSfxLEiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAiTWlrcm9mb24gS2F5bmHEn8SxIgorCisjfiBtc2dpZCAiSmFjayIKKyN+IG1zZ3N0ciAiSmFjayIKKworI34gbXNnaWQgIkNlbnRlciAvIExGRSIKKyN+IG1zZ3N0ciAiTWVya2V6IC8gTEZFIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAiU3RlcmVvIE1peCIKKworI34gbXNnaWQgIk1vbm8gTWl4IgorI34gbXNnc3RyICJNb25vIE1peCIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAiR2lyacWfIE1peCIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAiTWlrcm9mb24gMSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiTWlrcm9mb24gMiIKKworI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICJTYXnEsXNhbCDDh8Sxa8SxxZ8iCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICJTYXnEsXNhbCBHaXJpxZ8iCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk1vZGVtIgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAiQWhpemUiCisKKyN+IG1zZ2lkICJPdGhlciIKKyN+IG1zZ3N0ciAiRGnEn2VyIgorCisjfiBtc2dpZCAiTm9uZSIKKyN+IG1zZ3N0ciAiSGnDp2JpcmkiCisKKyN+IG1zZ2lkICJPbiIKKyN+IG1zZ3N0ciAiQcOnxLFrIgorCisjfiBtc2dpZCAiT2ZmIgorI34gbXNnc3RyICJLYXBhbMSxIgorCisjfiBtc2dpZCAiTXV0ZSIKKyN+IG1zZ3N0ciAiU3VzdHVsdXJtdcWfIgorCisjfiBtc2dpZCAiRmFzdCIKKyN+IG1zZ3N0ciAiSMSxemzEsSIKKworI34gbXNnaWQgIlZlcnkgTG93IgorI34gbXNnc3RyICLDh29rIEthbMSxbiIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAiRCIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAiT3J0YSIKKworI34gbXNnaWQgIkhpZ2giCisjfiBtc2dzdHIgIlRpeiIKKworI34gbXNnaWQgIlZlcnkgSGlnaCIKKyN+IG1zZ3N0ciAiw4dvayBUaXoiCisKKyN+IG1zZ2lkICJQcm9kdWN0aW9uIgorI34gbXNnc3RyICJZYXDEsW0iCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICLDlm4gUGFuZWwgTWlrcm9mb251IgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBJbiIKKyN+IG1zZ3N0ciAiw5ZuIFBhbmVsIEhhdCBHaXJpxZ9pIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAiw5ZuIFBhbmVsIEt1bGFrbMSxa2xhciIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICLDlm4gUGFuZWwgSGF0IMOHxLFrxLHFn8SxIgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICJZZcWfaWwgS29ubmVrdMO2ciIKKworI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICJQZW1iZSBLb25uZWt0w7ZyIgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk1hdmkgS29ubmVrdMO2ciIKKworI34gbXNnaWQgIldoaXRlIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQmV5YXogS29ubmVrdMO2ciIKKworI34gbXNnaWQgIkJsYWNrIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiU2l5YWggS29ubmVrdMO2ciIKKworI34gbXNnaWQgIkdyYXkgQ29ubmVjdG9yIgorI34gbXNnc3RyICJHcmkgS29ubmVrdMO2ciIKKworI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlBvcnRha2FsIEtvbm5la3TDtnIiCisKKyN+IG1zZ2lkICJSZWQgQ29ubmVjdG9yIgorI34gbXNnc3RyICJLxLFybcSxesSxIEtvbm5la3TDtnIiCisKKyN+IG1zZ2lkICJZZWxsb3cgQ29ubmVjdG9yIgorI34gbXNnc3RyICJTYXLEsSBLb25uZWt0w7ZyIgorCisjfiBtc2dpZCAiR3JlZW4gRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJZZcWfaWwgw5ZuIFBhbmVsIEtvbm5la3TDtnIiCisKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiUGVtYmUgw5ZuIFBhbmVsIEtvbm5la3TDtnIiCisKKyN+IG1zZ2lkICJCbHVlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiTWF2aSDDlm4gUGFuZWwgS29ubmVrdMO2ciIKKworI34gbXNnaWQgIldoaXRlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiQmV5YXogw5ZuIFBhbmVsIEtvbm5la3TDtnIiCisKKyN+IG1zZ2lkICJCbGFjayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlNpeWFoIMOWbiBQYW5lbCBLb25uZWt0w7ZyIgorCisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIkdyaSDDlm4gUGFuZWwgS29ubmVrdMO2ciIKKworI34gbXNnaWQgIk9yYW5nZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlBvcnRha2FsIMOWbiBQYW5lbCBLb25uZWt0w7ZyIgorCisjfiBtc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiS8Sxcm3EsXrEsSDDlm4gUGFuZWwgS29ubmVrdMO2ciIKKworI34gbXNnaWQgIlllbGxvdyBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIlNhcsSxIMOWbiBQYW5lbCBLb25uZWt0w7ZyIgorCisjfiBtc2dpZCAiU3ByZWFkIE91dHB1dCIKKyN+IG1zZ3N0ciAiw4fEsWvEscWfxLEgRGHEn8SxdCIKKworI34gbXNnaWQgIkRvd25taXgiCisjfiBtc2dzdHIgIk1pa3MgRWRpbG1pxZ8iCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIElucHV0IgorI34gbXNnc3RyICJTYW5hbCBNaWtzZXIgR2lyacWfaSIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgT3V0cHV0IgorI34gbXNnc3RyICJTYW5hbCBNaWtzZXIgw4fEsWvEscWfxLEiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICJTYW5hbCBNaWtzZXIgS2FuYWxsYXLEsSIKKworI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyAlZCDEsMWfbGV2IgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzIMSwxZ9sZXYiCisKKyN+IG1zZ2lkICJHb3QgdW5leHBlY3RlZCBmcmFtZSBzaXplIG9mICV1IGluc3RlYWQgb2YgJXUuIgorI34gbXNnc3RyICJCZWtsZW5tZXllbiBiaXIgw6dlcsOnZXZlY2UgYm95dXR1ICV1IGJ1bnVuIHllcmluZSAldSBnw7Zyw7xudMO8bGVuZGkuIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIiVkIGJheXTEsSDFn3UgYXlnxLF0dGEgJyVzJyBva3VtYWRhIGhhdGEuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkF5Z8SxdHRhICclcycgYXJhYmVsbGVrIGt1eXJ1xJ9hIHNva3VsYW3EsXlvci4iCisKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkF5Z8SxdHRhbiBkZXZpY2UgJyVzJyB2aWR5byDDp2Vyw6dldmVsZXJpIGFsxLFuYW1hZMSxLiIKKworI34gbXNnaWQgIkZhaWxlZCBhZnRlciAlZCB0cmllcy4gZGV2aWNlICVzLiBzeXN0ZW0gZXJyb3I6ICVzIgorI34gbXNnc3RyICLFnnUgZGVuZW1lZGVuIHNvbnJhICVkIGJhxZ9hcsSxbGFtYWTEsS4gYXlnxLF0ICVzLiBzaXN0ZW0gaGF0YXPEsTogJXMiCisKKyN+IG1zZ2lkICIiCisjfiAiVGhlIGJ1ZmZlciB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzLCBvciBubyAiCisjfiAiYnVmZmVycyBoYXZlIGJlZW4gYWxsb2NhdGVkIHlldCwgb3IgdGhlIHVzZXJwdHIgb3IgbGVuZ3RoIGFyZSBpbnZhbGlkLiAiCisjfiAiZGV2aWNlICVzIgorI34gbXNnc3RyICIiCisjfiAiQXJhYmVsbGVrIHTDvHLDvCBkZXN0ZWtsZW5taXlvciwgdmV5YSBpw6dlcmlrIGJpciB5ZXJlIGFpdCBkZcSfaWwsIHZleWEgIgorI34gImFyYWJlbGxla2xlciBoZW7DvHogYXlyxLFsbWFtxLHFnywgdmV5YSB1c2VycHRyIHZleWEgdXp1bmx1ayBnZcOnZXJzaXouIGF5Z8SxdC4gIgorI34gIiVzIgorCisjfiBtc2dpZCAiIgorI34gIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiBOb3QgZW5vdWdoIG1lbW9yeS4iCisjfiBtc2dzdHIgIlZpZHlvIMOnZXJ2ZXZlc2kgYXlnxLF0dGFuICclcycgYWzEsW5hbWFkxLEuIFlldGVyc2l6IGJlbGxlay4iCisKKyN+IG1zZ2lkICJpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGVucXVldWUgYSB1c2VyIHBvaW50ZXIgYnVmZmVyLiBkZXZpY2UgJXMuIgorI34gbXNnc3RyICIiCisjfiAia3VsbGFuxLFjxLEgYXJhYmVsbGXEn2luaSBrdXlydcSfYSBzb2ttYWsgacOnaW4geWV0ZXJzaXogYmVsbGVrLiBheWfEsXQgJXMuIgorCisjfiBtc2dpZCAiTm8gZnJlZSBidWZmZXJzIGZvdW5kIGluIHRoZSBwb29sIGF0IGluZGV4ICVkLiIKKyN+IG1zZ3N0ciAiRGl6aW5kZWtpICVkIGhhdnV6ZGEgYm/FnyBiZWxsZWsgYnVsdW5hbWFkxLEuIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGdldCBidWZmZXJzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICJBcmFiZWxsZWsgYXlnxLF0dGFuICclcycgYWzEsW5hbcSxeW9yLiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBnZXQgZW5vdWdoIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIllldGVybGkgYmVsbGVrIGF5Z8SxdHRhbiAnJXMnIGFsxLFuYW3EsXlvci4iCisKKyN+IG1zZ2lkICJFcnJvciBzdGFydGluZyBzdHJlYW1pbmcgY2FwdHVyZSBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAiQXlnxLF0dGFuICclcycgYWthbiBnw7Zyw7xudMO8IGJhxZ9sYXTEsWxhbWFkxLEuIgorCisjfiBtc2dpZCAiRXJyb3Igc3RvcHBpbmcgc3RyZWFtaW5nIGNhcHR1cmUgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkF5Z8SxdHRhbiAnJXMnIGFrYW4gZ8O2csO8bnTDvCBkdXJkdXJ1bGFtYWTEsS4iCmRpZmYgLS1naXQgYS9wby91ay5wbyBiL3BvL3VrLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMWNmNzkKLS0tIC9kZXYvbnVsbAorKysgYi9wby91ay5wbwpAQCAtMCwwICsxLDg1MCBAQAorIyBVa3JhaW5pYW4gdHJhbnNsYXRpb24gdG8gZ3N0LXBsdWdpbnMuCisjIENvcHlyaWdodCAoQykgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdzdC1wbHVnaW5zLWdvb2QgcGFja2FnZS4KKyMKKyMgTWF4aW0gVi4gRHppdW1hbmVua28gPGR6aXVtYW5lbmtvQGdtYWlsLmNvbT4sIDIwMDQtMjAwNy4KKyMgWXVyaSBDaG9ybm9pdmFuIDx5dXJjaG9yQHVrci5uZXQ+LCAyMDExLCAyMDEyLCAyMDEzLCAyMDE0LCAyMDE1LCAyMDE2LgorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZCAxLjcuMlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDE2LTAyLTIwIDE3OjI3KzAyMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IFl1cmkgQ2hvcm5vaXZhbiA8eXVyY2hvckB1a3IubmV0PlxuIgorIkxhbmd1YWdlLVRlYW06IFVrcmFpbmlhbiA8dHJhbnNsYXRpb24tdGVhbS11a0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+XG4iCisiTGFuZ3VhZ2U6IHVrXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiWC1HZW5lcmF0b3I6IExva2FsaXplIDEuNVxuIgorIlBsdXJhbC1Gb3JtczogbnBsdXJhbHM9MTsgcGx1cmFsPTA7XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgItCd0LUg0LfQvdCw0LnQtNC10L3QviDRgdC10YDQstC10YDQsCBKYWNrIgorCittc2dpZCAiRmFpbGVkIHRvIGRlY29kZSBKUEVHIGltYWdlIgorbXNnc3RyICLQn9C+0LzQuNC70LrQsCDQv9GA0Lgg0LTQtdC60L7QtNGD0LLQsNC90L3RliDQt9C+0LHRgNCw0LbQtdC90L3RjyBKUEVHIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICLCqyVzwrssICVzIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINC3J9GU0LTQvdCw0YLQuNGB0Ywg0Lcg0YHQtdGA0LLQtdGA0L7QvCIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICLQndC1INCy0LrQsNC30LDQvdC+INCw0LTRgNC10YHRgyIKKworbXNnaWQgIkNvdWxkIG5vdCByZXNvbHZlIHNlcnZlciBuYW1lLiIKK21zZ3N0ciAi0J3QtSDQstC00LDQu9C+0YHRjyDQstC40LfQvdCw0YfQuNGC0Lgg0LDQtNGA0LXRgdGDINGB0LXRgNCy0LXRgNCwINC30LAg0L3QsNC30LLQvtGOLiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINCy0YHRgtCw0L3QvtCy0LjRgtC4INC3J9GU0LTQvdCw0L3QvdGPINC3INGB0LXRgNCy0LXRgNC+0LwuIgorCittc2dpZCAiU2VjdXJlIGNvbm5lY3Rpb24gc2V0dXAgZmFpbGVkLiIKK21zZ3N0ciAi0J/QvtC80LjQu9C60LAg0L/RltC0INGH0LDRgSDRgdC/0YDQvtCx0Lgg0L3QsNC70LDRiNGC0YPQstCw0L3QvdGPINCx0LXQt9C/0LXRh9C90L7Qs9C+INC34oCZ0ZTQtNC90LDQvdC90Y8uIgorCittc2dpZCAiIgorIkEgbmV0d29yayBlcnJvciBvY2N1cnJlZCwgb3IgdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LiIKK21zZ3N0ciAiIgorItCh0YLQsNC70LDRgdGPINC/0L7QvNC40LvQutCwINGA0L7QsdC+0YLQuCDQtyDQvNC10YDQtdC20LXRjiDQsNCx0L4g0LfigJnRlNC00L3QsNC90L3RjyDQsdGD0LvQviDQvdC10YHQv9C+0LTRltCy0LDQvdC+INGA0L7Qt9GW0YDQstCw0L3QviDQtyAiCisi0LHQvtC60YMg0YHQtdGA0LLQtdGA0LAuIgorCittc2dpZCAiU2VydmVyIHNlbnQgYmFkIGRhdGEuIgorbXNnc3RyICLQodC10YDQstC10YDQvtC8INC90LDQtNGW0YHQu9Cw0L3QviDQv9C+0LzQuNC70LrQvtCy0ZYg0LTQsNC90ZYuIgorCittc2dpZCAiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZy4iCittc2dzdHIgItCh0LXRgNCy0LXRgNC+0Lwg0L3QtSDQv9GW0LTRgtGA0LjQvNGD0ZTRgtGM0YHRjyDQv9C+0LfQuNGG0ZbRjtCy0LDQvdC90Y8uIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICIiCisi0J3QtSDQstC60LDQt9Cw0L3QviDQsNCx0L4g0LLQutCw0LfQsNC90L4g0L3QtdC60L7RgNC10LrRgtC90LjQuSDQstGF0ZbQtCDQt9Cy0YPQutC+0LLQuNGFINC00LDQvdC40YUsIEFWSS3Qv9C+0YLRltC6INCx0YPQtNC1ICIKKyLQv9C+0YjQutC+0LTQttC10L3Qvi4iCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgItCk0LDQudC7INC90LUg0LzRltGB0YLQuNGC0Ywg0L/QvtGC0L7QutGW0LIsINGP0LrRliDQvNC+0LbQvdCwINCy0ZbQtNGC0LLQvtGA0LjRgtC4LiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAi0KTQsNC50Lsg0ZQg0L3QtdC60L7RgNC10LrRgtC90LjQvCwg0LnQvtCz0L4g0L3QtSDQvNC+0LbQvdCwINCy0ZbQtNGC0LLQvtGA0LjRgtC4LiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisi0JLRltC00YLQstC+0YDQtdC90L3RjyDQv9C+0YLQvtC60YMg0LTQsNC90LjRhSDQvdC10LzQvtC20LvQuNCy0LUsINC+0YHQutGW0LvRjNC60Lgg0LTQsNC90ZYg0LfQsNGI0LjRhNGA0L7QstCw0L3QviDQt9CwINC00L7Qv9C+0LzQvtCz0L7RjiAiCisiUGxheVJlYWR5IERSTS4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgItCk0LDQudC7INC/0L7RiNC60L7QtNC20LXQvdC+LCDQudC+0LPQviDQvdC1INC80L7QttC90LAg0LLRltC00YLQstC+0YDQuNGC0LguIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICLQndC10LrQvtGA0LXQutGC0L3QuNC5INGA0L7Qt9C80ZbRgCDQtdC70LXQvNC10L3RgtCw0YDQvdC+0LPQviDRhNGA0LDQs9C80LXQvdGC0LAuIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICLQpNCw0LnQuyDQvdC10L/QvtCy0L3QuNC5LCDQudC+0LPQviDQvdC1INC80L7QttC90LAg0LLRltC00YLQstC+0YDQuNGC0LguIgorCittc2dpZCAiVGhlIHZpZGVvIGluIHRoaXMgZmlsZSBtaWdodCBub3QgcGxheSBjb3JyZWN0bHkuIgorbXNnc3RyICIiCisi0JnQvNC+0LLRltGA0L3Qviwg0LLRltC00LXQvtC00LDQvdGWINGG0YzQvtCz0L4g0YTQsNC50LvQsCDQvdC1INC80L7QttC90LAg0LHRg9C00LUg0LLRltC00YLQstC+0YDQuNGC0Lgg0L3QsNC70LXQttC90LjQvCDRh9C40L3QvtC8LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICLQpNCw0LnQuyDQvNGW0YHRgtC40YLRjCDQvdCw0LTRgtC+INCx0LDQs9Cw0YLQviDQv9C+0YLQvtC60ZbQsi4g0JLRltC00YLQstC+0YDRjtGO0YLRjNGB0Y8g0LvQuNGI0LUg0L/QtdGA0YjRliAlZCIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBhIEdTdHJlYW1lciBSVFNQICIKKyJleHRlbnNpb24gcGx1Z2luIGZvciBSZWFsIG1lZGlhIHN0cmVhbXMuIgorbXNnc3RyICIiCisi0J3QtSDQt9C90LDQudC00LXQvdC+INC/0ZbQtNGC0YDQuNC80YPQstCw0L3QuNGFINC/0L7RgtC+0LrRltCyLiDQmdC80L7QstGW0YDQvdC+LCDQstCw0Lwg0YHQu9GW0LQg0LLRgdGC0LDQvdC+0LLQuNGC0Lgg0LzQvtC00YPQu9GMIFJUU1AgIgorIkdTdHJlYW1lciDQtNC70Y8g0LLRltC00YLQstC+0YDQtdC90L3RjyDQv9C+0YLQvtC60ZbQsiBSZWFsIG1lZGlhLiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorItCd0LUg0LfQvdCw0LnQtNC10L3QviDQv9GW0LTRgtGA0LjQvNGD0LLQsNC90LjRhSDQv9C+0YLQvtC60ZbQsi4g0JnQvNC+0LLRltGA0L3Qviwg0LLQsNC8INGB0LvRltC0INGD0LLRltC80LrQvdGD0YLQuCDQtNC+0LTQsNGC0LrQvtCy0ZYgIgorItC/0YDQvtGC0L7QutC+0LvQuCDQv9C10YDQtdC00LDQstCw0L3QvdGPINC00LDQvdC40YUg0LDQsdC+INCy0YHRgtCw0L3QvtCy0LjRgtC4INC00L7QtNCw0YLQutC+0LLQuNC5INC80L7QtNGD0LvRjCBSVFNQIEdTdHJlYW1lci4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisi0J3QtSDQstC00LDQu9C+0YHRjyDQstGW0LTQutGA0LjRgtC4INC/0YDQuNGB0YLRgNGW0Lkg0LTQu9GPINCy0ZbQtNGC0LLQvtGA0LXQvdC90Y8uINCf0YDQuNGB0YLRgNGW0Lkg0LLQuNC60L7RgNC40YHRgtC+0LLRg9GU0YLRjNGB0Y8gIgorItGB0YLQvtGA0L7QvdC90YzQvtGOINC/0YDQvtCz0YDQsNC80L7Rji4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorItCd0LUg0LLQtNCw0LvQvtGB0Y8g0LLRltC00LrRgNC40YLQuCDQv9GA0LjRgdGC0YDRltC5INC00LvRjyDQstGW0LTRgtCy0L7RgNC10L3QvdGPLiDQoyDQstCw0YEg0L3QtdC00L7RgdGC0LDRgtC90YzQviDQv9GA0LDQsiDQtNC70Y8gIgorItCy0ZbQtNC60YDQuNGC0YLRjyDQv9GA0LjRgdGC0YDQvtGOLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINCy0ZbQtNC60YDQuNGC0Lgg0L/RgNC40YHRgtGA0ZbQuSDQtNC70Y8g0LLRltC00YLQstC+0YDQtdC90L3Rjy4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICIiCisi0J3QtSDQstC00LDQu9C+0YHRjyDQstGW0LTQutGA0LjRgtC4INC/0YDQuNGB0YLRgNGW0Lkg0LTQu9GPINCy0ZbQtNGC0LLQvtGA0LXQvdC90Y8uINCm0Y8g0LLQtdGA0YHRltGPIE9wZW4gU291bmQgU3lzdGVtINC90LUgIgorItC/0ZbQtNGC0YDQuNC80YPRlNGC0YzRgdGPINGG0LjQvCDQtdC70LXQvNC10L3RgtC+0LwuIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgItCS0ZbQtNGC0LLQvtGA0LXQvdC90Y8g0L3QtSDQv9GW0LTRgtGA0LjQvNGD0ZTRgtGM0YHRjyDRhtC40Lwg0LfQstGD0LrQvtCy0LjQvCDQv9GA0LjRgdGC0YDQvtGU0LwuIgorCittc2dpZCAiQXVkaW8gcGxheWJhY2sgZXJyb3IuIgorbXNnc3RyICLQn9C+0LzQuNC70LrQsCDQstGW0LTRgtCy0L7RgNC10L3QvdGPINC30LLRg9C60YMuIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLQl9Cw0L/QuNGBINC90LUg0L/RltC00YLRgNC40LzRg9GU0YLRjNGB0Y8g0YbQuNC8INC30LLRg9C60L7QstC40Lwg0L/RgNC40YHRgtGA0L7RlNC8LiIKKworbXNnaWQgIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iCittc2dzdHIgItCf0L7QvNC40LvQutCwINC30LDQv9C40YHRg9Cy0LDQvdC90Y8g0LfRliDQt9Cy0YPQutC+0LLQvtCz0L4g0L/RgNC40YHRgtGA0L7Rji4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyLQndC1INCy0LTQsNC70L7RgdGPINCy0ZbQtNC60YDQuNGC0Lgg0L/RgNC40YHRgtGA0ZbQuSDQtNC70Y8g0LfQsNC/0LjRgdGDLiDQoyDQstCw0YEg0L3QtdC00L7RgdGC0LDRgtC90YzQviDQv9GA0LDQsiDQtNC70Y8gIgorItCy0ZbQtNC60YDQuNGC0YLRjyDQv9GA0LjRgdGC0YDQvtGOLiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAi0J3QtSDQstC00LDQu9C+0YHRjyDQstGW0LTQutGA0LjRgtC4INC/0YDQuNGB0YLRgNGW0Lkg0LTQu9GPINC30LDQv9C40YHRgy4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAi0J/RgNC40YHRgtGA0ZbQuSBDb3JlQXVkaW8g0L3QtSDQt9C90LDQudC00LXQvdC+IgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINCy0ZbQtNC60YDQuNGC0Lgg0L/RgNC40YHRgtGA0ZbQuSBDb3JlQXVkaW8iCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICLQl9Cw0L/QuNGBINC00LbQtdGA0LXQu9CwIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAi0JzRltC60YDQvtGE0L7QvSIKKworbXNnaWQgIkxpbmUgSW4iCittc2dzdHIgItCb0ZbQvdGW0LnQvdC40Lkg0LLRhdGW0LQiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAi0JLQsdGD0LTQvtCy0LDQvdC40Lkg0JrQlCIKKworbXNnaWQgIlNQRElGIEluIgorbXNnc3RyICLQktGF0ZbQtCBTUERJRiIKKworbXNnaWQgIkFVWCAxIEluIgorbXNnc3RyICLQktGF0ZbQtCBBVVggMSIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICLQktGF0ZbQtCBBVVggMiIKKworbXNnaWQgIkNvZGVjIExvb3BiYWNrIgorbXNnc3RyICLQn9C10YLQu9GPINC60L7QtNC10LrQsCIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAi0J/QtdGC0LvRjyBTdW5WVFMiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgItCT0YPRh9C90ZbRgdGC0YwiCisKK21zZ2lkICJHYWluIgorbXNnc3RyICLQn9GW0LTRgdC40LvQtdC90L3RjyIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgItCc0L7QvdGW0YLQvtGAIgorCittc2dpZCAiQnVpbHQtaW4gU3BlYWtlciIKK21zZ3N0ciAi0JLQsdGD0LTQvtCy0LDQvdC40Lkg0LTQuNC90LDQvNGW0LoiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgItCd0LDQstGD0YjQvdC40LrQuCIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICLQm9GW0L3RltC50L3QuNC5INCy0LjRhdGW0LQiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgItCS0LjRhdGW0LQgU1BESUYiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgItCS0LjRhdGW0LQgQVVYIDEiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgItCS0LjRhdGW0LQgQVVYIDIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J/QvtC80LjQu9C60LAg0L/RltC0INGH0LDRgSDRgdC/0YDQvtCx0Lgg0YfQuNGC0LDQvdC90Y8gJWQg0LHQsNC50YLRltCyINC3INC/0YDQuNGB0YLRgNC+0Y4gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAiIgorItCd0LUg0LLQtNCw0ZTRgtGM0YHRjyDQvtGC0YDQuNC80LDRgtC4INGB0L/QuNGB0L7QuiDRg9GB0ZbRhSDQvNC+0LbQu9C40LLQuNGFINCy0ZbQtNC10L7RhNC+0YDQvNCw0YLRltCyLCDRj9C60ZYg0L/RltC00YLRgNC40LzRg9GUICIKKyLQv9GA0LjRgdGC0YDRltC5IFwiJXNcIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAi0J3QtSDQstC00LDQu9C+0YHRjyDQv9C+0LLigJnRj9C30LDRgtC4INCx0YPRhNC10YDQuCDQtyDQv9GA0LjRgdGC0YDQvtGOIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgItCU0YDQsNC50LLQtdGAINC/0YDQuNGB0YLRgNC+0Y4gwqslc8K7INC90LUg0L/RltC00YLRgNC40LzRg9GUINC80LXRgtC+0LQg0LLQstC10LTQtdC90L3Rjy3QstC40LLQtdC00LXQvdC90Y8g0LTQsNC90LjRhSAlZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIiIKKyLQlNGA0LDQudCy0LXRgCDQv9GA0LjRgdGC0YDQvtGOIMKrJXPCuyDQvdC1INC/0ZbQtNGC0YDQuNC80YPRlCDQttC+0LTQtdC9INCy0ZbQtNC+0LzQuNC5INC80LXRgtC+0LQg0LLQstC10LTQtdC90L3Rjy3QstC40LLQtdC00LXQvdC90Y8gIgorItC00LDQvdC40YUuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgItCf0YDQuNGB0YLRgNGW0Lkgwqslc8K7INC30LDQudC90Y/RgtC+IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICLQn9GA0LjRgdGC0YDRltC5IFwiJXNcIiDQvdC1INC30LTQsNGC0L3QuNC5INC30LDRhdC+0L/Qu9GO0LLQsNGC0Lgg0LLRltC00LXQviDRgyDRhNC+0YDQvNCw0YLRliAlZHglZCIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCIKK21zZ3N0ciAi0J/RgNC40YHRgtGA0ZbQuSBcIiVzXCIg0L3QtSDQt9C00LDRgtC90LjQuSDQt9Cw0YXQvtC/0LvRjtCy0LDRgtC4INCy0ZbQtNC10L4g0YMg0LLQutCw0LfQsNC90L7QvNGDINGE0L7RgNC80LDRgtGWIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIiIKKyLQoyDQv9GA0LjRgdGC0YDQvtGXIMKrJXPCuyDQvdC1INC/0LXRgNC10LTQsdCw0YfQtdC90L4g0LzQvtC20LvQuNCy0L7RgdGC0ZYg0LLQuNC60L7RgNC40YHRgtCw0L3QvdGPINGA0L7Qt9GA0LjQstC90LjRhSDQv9C70L7RidC40L0iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0L/QsNGA0LDQvNC10YLRgNC4INC/0YDQuNGB0YLRgNC+0Y4gwqslc8K7LiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIKK21zZ3N0ciAiIgorItCS0ZbQtNC10L7Qv9GA0LjRgdGC0YDQvtGU0Lwg0L3QtSDQv9GW0LTRgtGA0LjQvNGD0ZTRgtGM0YHRjyDQvdC+0LLQtSDQt9C90LDRh9C10L3QvdGPINC/0LDRgNCw0LzQtdGC0YDQsCDRh9Cw0YHRgtC+0YLQuCDQutCw0LTRgNGW0LIuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3QgcHJvdmlkZSBvdXRwdXQgZm9ybWF0LiIKK21zZ3N0ciAi0JLRltC00LXQvtC/0YDQuNGB0YLRgNC+0ZTQvCDQvdC1INC90LDQtNCw0L3QviDQtNCw0L3QuNGFINGJ0L7QtNC+INGE0L7RgNC80LDRgtGDINCy0LjQstC10LTQtdC90L3Rjy4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgcmV0dXJuZWQgaW52YWxpZCBkaW1lbnNpb25zLiIKK21zZ3N0ciAi0JLRltC00LXQvtC/0YDQuNGB0YLRgNC+0ZTQvCDQv9C+0LLQtdGA0L3Rg9GC0L4g0L3QtdC60L7RgNC10LrRgtC90ZYg0YDQvtC30LzRltGA0L3QvtGB0YLRli4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAi0JTRgNCw0LnQstC10YAg0L/RgNC40YHRgtGA0L7RjiDCqyVzwrsg0L3QtSDQv9GW0LTRgtGA0LjQvNGD0ZQg0LzQtdGC0L7QtCDRh9C10YDQtdC30YDRj9C00LrQvtCy0L7Qs9C+INCy0LjQstC10LTQtdC90L3Rjy4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAi0JLRltC00LXQvtC/0YDQuNGB0YLRgNGW0Lkg0LLQuNC60L7RgNC40YHRgtC+0LLRg9GUINC90LXQv9GW0LTRgtGA0LjQvNGD0LLQsNC90LjQuSDRhNC+0YDQvNCw0YIg0L/RltC60YHQtdC70ZbQsi4iCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAi0J3QtSDQstC00LDQu9C+0YHRjyDQvdCw0LvQsNGI0YLRg9Cy0LDRgtC4INCy0LHRg9C00L7QstCw0L3QuNC5INCx0YPRhNC10YAuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICLQktGW0LTQtdC+0L/RgNC40YHRgtGA0L7RlNC8INC90LUg0LfQsNC/0YDQvtC/0L7QvdC+0LLQsNC90L4g0LbQvtC00L3QvtCz0L4g0YDQvtC30LzRltGA0YMg0LHRg9GE0LXRgNCwLiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgItCd0LXQvNCw0ZQg0L/RltC00LvQtdCz0LvQvtCz0L4g0LHRg9GE0LXRgNCwINC00LvRjyDRltC80L/QvtGA0YLRg9Cy0LDQvdC90Y8g0LTQsNC90LjRhS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCf0L7QvNC40LvQutCwINC/0ZbQtCDRh9Cw0YEg0YHQv9GA0L7QsdC4INC+0YLRgNC40LzQsNC90L3RjyDQtNCw0L3QuNGFINGJ0L7QtNC+INC/0YDQuNC50LzQsNGH0LAgJWQg0L/RgNC40YHRgtGA0L7RjiDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIGdldHRpbmcgY2FwYWJpbGl0aWVzIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCf0L7QvNC40LvQutCwINC/0ZbQtCDRh9Cw0YEg0YHQv9GA0L7QsdC4INC+0YLRgNC40LzQsNC90L3RjyDQtNCw0L3QuNGFINGJ0L7QtNC+INC80L7QttC70LjQstC+0YHRgtC10Lkg0L/RgNC40YHRgtGA0L7RjiDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIHR1bmVyLiIKK21zZ3N0ciAi0J/RgNC40YHRgtGA0ZbQuSDCqyVzwrsg0L3QtSDRlCDQv9GA0LjQudC80LDRh9C10LwuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgcmFkaW8gaW5wdXQgb24gZGV2aWNlICclcycuICIKK21zZ3N0ciAi0J3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC/0YDQuNC50L3Rj9GC0ZYg0YDQsNC00ZbQvtC00LDQvdGWINC3INC/0YDQuNGB0YLRgNC+0Y4gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGlucHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0LLRgdGC0LDQvdC+0LLQuNGC0Lgg0LLQstGW0LQgJWQg0L/RgNC40YHRgtGA0L7RjiDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINC30LzRltC90LjRgtC4INGB0YLQsNC9INCy0LjQvNC40LrQsNC90L3RjyDQt9Cy0YPQutGDINC90LAg0L/RgNC40YHRgtGA0L7RlyDCqyVzwrsuIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlZCByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0L/QvtGC0YDRltCx0L3QuNC5INC+0LHRgdGP0LMg0L/QsNC84oCZ0Y/RgtGWLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0L/QvtGC0YDRltCx0L3QuNC5INC+0LHRgdGP0LMg0L/QsNC84oCZ0Y/RgtGWLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisi0JfQsNGB0ZbQsSDQv9C10YDQtdGC0LLQvtGA0LXQvdC90Y8g0L3QsCDQv9GA0LjRgdGC0YDQvtGXICVzINC90LUg0LzQvtC20LUg0L7RgtGA0LjQvNGD0LLQsNGC0Lgg0LTQsNC90ZYg0YMg0L/RltC00YLRgNC40LzRg9Cy0LDQvdC+0LzRgyAiCisi0YTQvtGA0LzQsNGC0ZYiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKyLQl9Cw0YHRltCxINC/0LXRgNC10YLQstC+0YDQtdC90L3RjyDQvdCwINC/0YDQuNGB0YLRgNC+0ZcgJXMg0L3QtSDQvNC+0LbQtSDQstC40LLQvtC00LjRgtC4INC00LDQvdGWINGDINC/0ZbQtNGC0YDQuNC80YPQstCw0L3QvtC80YMgIgorItGE0L7RgNC80LDRgtGWIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisi0JfQsNGB0ZbQsSDQutC+0LTRg9Cy0LDQvdC90Y8g0L3QsCDQv9GA0LjRgdGC0YDQvtGXICVzINC90LUg0LzQvtC20LUg0L7RgtGA0LjQvNGD0LLQsNGC0Lgg0LTQsNC90ZYg0YMg0L/RltC00YLRgNC40LzRg9Cy0LDQvdC+0LzRgyAiCisi0YTQvtGA0LzQsNGC0ZYiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICIiCisi0JfQsNGB0ZbQsSDQutC+0LTRg9Cy0LDQvdC90Y8g0L3QsCDQv9GA0LjRgdGC0YDQvtGXICVzINC90LUg0LzQvtC20LUg0LLQuNCy0L7QtNC40YLQuCDQtNCw0L3RliDRgyDQv9GW0LTRgtGA0LjQvNGD0LLQsNC90L7QvNGDINGE0L7RgNC80LDRgtGWIgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0LfQsNC/0L7Rh9Cw0YLQutGD0LLQsNGC0Lgg0L/QvtGC0ZbQuiDQtNC10LrQvtC00YPQstCw0L3QvdGPLiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAi0J3QtSDQstC00LDQu9C+0YHRjyDQvtCx0YDQvtCx0LjRgtC4INC60LDQtNGALiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyLQn9C+0LzQuNC70LrQsCDQv9GA0Lgg0L7RgtGA0LjQvNCw0L3QvdGWINC80L7QttC70LjQstC+0YHRgtC10Lkg0L/RgNC40YHRgtGA0L7RjiDCqyVzwrs6INC00YDQsNC50LLQtdGAINC90LUg0ZQg0LTRgNCw0LnQstC10YDQvtC8INC00LvRjyAiCisidjRsMi4g0J/QtdGA0LXQstGW0YDRgtC1LCDQvNC+0LbQtSDRhtC1INC00YDQsNC50LLQtdGAINGC0LjQv9GDIHY0bDEuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAi0J/QvtC80LjQu9C60LAg0L/RgNC4INC30LDQv9C40YLRliDQsNGC0YDQuNCx0YPRgtGW0LIg0LLQstC+0LTRgyAlZCDQv9GA0LjRgdGC0YDQvtGOICVzIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCf0L7QvNC40LvQutCwINC/0YDQuCDQstGB0YLQsNC90L7QstC70LXQvdC90ZYg0L/RgNC40LnQvNCw0YfQsCAlZCDQv9GA0LjRgdGC0YDQvtGOIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IG5vcm0gb24gZGV2aWNlICclcycuIgorbXNnc3RyICLQn9C+0LzQuNC70LrQsCDQv9GA0Lgg0LfQsNC/0LjRgtGWINC90L7RgNC80Lgg0L/RgNC40YHRgtGA0L7RjiDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0LDRgtGA0LjQsdGD0YLQuCDRgNC10LPRg9C70Y/RgtC+0YDRltCyINC60LXRgNGD0LLQsNC90L3RjyDQv9GA0LjRgdGC0YDQvtGOIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IGlkZW50aWZ5IGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J3QtSDQstC00LDQu9C+0YHRjyDRltC00LXQvdGC0LjRhNGW0LrRg9Cy0LDRgtC4INC/0YDQuNGB0YLRgNGW0Lkgwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICLQptC1INC90LUg0L/RgNC40YHRgtGA0ZbQuSDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAi0J3QtSDQstC00LDQu9C+0YHRjyDQstGW0LTQutGA0LjRgtC4INC/0YDQuNGB0YLRgNGW0Lkgwqslc8K7INC00LvRjyDRh9C40YLQsNC90L3RjyDRgtCwINC30LDQv9C40YHRgy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICLQn9GA0LjRgdGC0YDRltC5IMKrJXPCuyDQvdC1INGUINC/0YDQuNGB0YLRgNC+0ZTQvCDQt9Cw0YXQvtC/0LvQtdC90L3Rjy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgItCf0YDQuNGB0YLRgNGW0Lkgwqslc8K7INC90LUg0ZQg0L/RgNC40YHRgtGA0L7RlNC8INCy0LjQstC10LTQtdC90L3RjyDQtNCw0L3QuNGFLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAi0J/RgNC40YHRgtGA0ZbQuSDCqyVzwrsg0L3QtSDRlCDQv9GA0LjRgdGC0YDQvtGU0LwgTTJNLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAi0J3QtSDQstC00LDQu9C+0YHRjyDQt9C00YPQsdC70Y7QstCw0YLQuCDQv9GA0LjRgdGC0YDRltC5IMKrJXPCuyDQtNC70Y8g0YfQuNGC0LDQvdC90Y8g0YLQsCDQt9Cw0L/QuNGB0YMuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINCy0YHRgtCw0L3QvtCy0LjRgtC4INC90L7RgNC80YMg0L/RgNC40YHRgtGA0L7RjiDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC/0L7RgtC+0YfQvdGDINGH0LDRgdGC0L7RgtGDINC/0YDQuNC50LzQsNGH0LAg0L/RgNC40YHRgtGA0L7RjiDCqyVzwrsuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iCittc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0LLRgdGC0LDQvdC+0LLQuNGC0Lgg0L/QvtGC0L7Rh9C90YMg0YfQsNGB0YLQvtGC0YMg0L/RgNC40LnQvNCw0YfQsCDQv9GA0LjRgdGC0YDQvtGOIMKrJXPCuyDRgyAlbHUg0JPRhi4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi0J/QvtC80LjQu9C60LAg0L/RgNC4INC+0YLRgNC40LzQsNC90L3RliDRgdC40LvQuCDRgdC40LPQvdCw0LvRgyDQv9GA0LjRgdGC0YDQvtGOIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCB2YWx1ZSBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgItCd0LUg0LLQtNCw0LvQvtGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQt9C90LDRh9C10L3QvdGPINCy0ZbQtCDQvtGA0LPQsNC90YMg0LrQtdGA0YPQstCw0L3QvdGPICVkINC/0YDQuNGB0YLRgNC+0Y4gwqslc8K7LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorItCd0LUg0LLQtNCw0LvQvtGB0Y8g0LLRgdGC0LDQvdC+0LLQuNGC0Lgg0LfQvdCw0YfQtdC90L3RjyAlZCDQtNC70Y8g0L7RgNCz0LDQvdGDINC60LXRgNGD0LLQsNC90L3RjyAlZCDQv9GA0LjRgdGC0YDQvtGOIMKrJXPCuy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKyLQndC1INCy0LTQsNC70L7RgdGPINC+0YLRgNC40LzQsNGC0Lgg0L/QvtGC0L7Rh9C90LjQuSDQstCy0ZbQtCDQv9GA0LjRgdGC0YDQvtGOIMKrJXPCuy4g0JzQvtC20LvQuNCy0L4g0YbQtdC5INC/0YDQuNGB0YLRgNGW0Lkg4oCUICIKKyLRgNCw0LTRltC+LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisi0J3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INC/0L7RgtC+0YfQvdC40Lkg0LLQuNGF0ZbQtCDQv9GA0LjRgdGC0YDQvtGOIMKrJXPCuy4g0JzQvtC20LvQuNCy0L4g0YbQtdC5INC/0YDQuNGB0YLRgNGW0Lkg4oCUICIKKyLRgNCw0LTRltC+LiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG91dHB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINCy0YHRgtCw0L3QvtCy0LjRgtC4INCy0LjRhdGW0LQgJWQg0L/RgNC40YHRgtGA0L7RjiDCqyVzwrsuIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAi0JfQvNGW0L3QsCDRgNC+0LfQtNGW0LvRjNC90L7RlyDQt9C00LDRgtC90L7RgdGC0ZYg0L/RgNC4INCy0ZbQtNGC0LLQvtGA0LXQvdC90ZYg0YnQtSDQvdC1INC/0ZbQtNGC0YDQuNC80YPRlNGC0YzRgdGPLiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAi0KDQvtCx0L7RgtCwINCx0LXQtyDQs9C+0LTQuNC90L3QuNC60LAg0L3QtdC80L7QttC70LjQstCwIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBzdHJlYW0gZXJyb3IuIgorI34gbXNnc3RyICLQktC90YPRgtGA0ZbRiNC90Y8g0L/QvtC80LjQu9C60LAg0L/QvtGC0L7QutGDINC00LDQvdC40YUuIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAi0J/QvtC80LjQu9C60LAg0LLQvdGD0YLRgNGW0YjQvdGM0L7Qs9C+INC/0LXRgNC10L3QtdGB0LXQvdC90Y8g0LTQsNC90LjRhS4iCisKKyN+IG1zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNhcHR1cmUiCisjfiBtc2dzdHIgItCf0YDQuNGB0YLRgNGW0Lkgwqslc8K7INC90LUg0LzQvtC20LUg0LfQsNGF0L7Qv9C70Y7QstCw0YLQuCDQstGW0LTQtdC+0LTQsNC90ZYiCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc291bmQgc2VydmVyIgorI34gbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINCy0YHRgtCw0L3QvtCy0LjRgtC4INC3J9GU0LTQvdCw0L3QvdGPINGW0Lcg0LfQstGD0LrQvtCy0LjQvCDRgdC10YDQstC10YDQvtC8LiIKKworI34gbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBzb3VuZCBzZXJ2ZXIgY2FwYWJpbGl0aWVzIgorI34gbXNnc3RyICLQn9C+0LzQuNC70LrQsCDQv9GA0Lgg0LfQsNC/0LjRgtGWINC80L7QttC70LjQstC+0YHRgtC10Lkg0LfQstGD0LrQvtCy0L7Qs9C+INGB0LXRgNCy0LXRgNCwIgorCisjfiBtc2dpZCAiQmFzcyIKKyN+IG1zZ3N0ciAi0J3QuNC30YzQutGWIgorCisjfiBtc2dpZCAiVHJlYmxlIgorI34gbXNnc3RyICLQktC40YHQvtC60ZYiCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAi0KHQuNC90YLQtdC30LDRgtC+0YAiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgItCa0IbQnCIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgItCU0LjQvdCw0LzRltC6IgorCisjfiBtc2dpZCAiTGluZS1pbiIKKyN+IG1zZ3N0ciAi0JvRltC90ZbQudC90LjQuSDQstGF0ZbQtCIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICLQmtCUIgorCisjfiBtc2dpZCAiTWl4ZXIiCisjfiBtc2dzdHIgItCc0ZbQutGI0LXRgCIKKworI34gbXNnaWQgIlBDTS0yIgorI34gbXNnc3RyICLQmtCG0JwtMiIKKworI34gbXNnaWQgIlJlY29yZCIKKyN+IG1zZ3N0ciAi0JfQsNC/0LjRgSIKKworI34gbXNnaWQgIkluLWdhaW4iCisjfiBtc2dzdHIgItCS0YUu0L/RltC00YHQuNC70LXQvdC90Y8iCisKKyN+IG1zZ2lkICJPdXQtZ2FpbiIKKyN+IG1zZ3N0ciAi0JLQuNGFLtC/0ZbQtNGB0LjQu9C10L3QvdGPIgorCisjfiBtc2dpZCAiTGluZS0xIgorI34gbXNnc3RyICLQm9GW0L3RltC50L3QuNC5LTEiCisKKyN+IG1zZ2lkICJMaW5lLTIiCisjfiBtc2dzdHIgItCb0ZbQvdGW0LnQvdC40LktMiIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAi0JvRltC90ZbQudC90LjQuS0zIgorCisjfiBtc2dpZCAiRGlnaXRhbC0xIgorI34gbXNnc3RyICLQptC40YTRgNC+0LLQuNC5LTEiCisKKyN+IG1zZ2lkICJEaWdpdGFsLTIiCisjfiBtc2dzdHIgItCm0LjRhNGA0L7QstC40LktMiIKKworI34gbXNnaWQgIkRpZ2l0YWwtMyIKKyN+IG1zZ3N0ciAi0KbQuNGE0YDQvtCy0LjQuS0zIgorCisjfiBtc2dpZCAiUGhvbmUtaW4iCisjfiBtc2dzdHIgItCS0YUu0YLQtdC70LXRhNC+0L0iCisKKyN+IG1zZ2lkICJQaG9uZS1vdXQiCisjfiBtc2dzdHIgItCS0LjRhS7RgtC10LvQtdGE0L7QvSIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICLQktGW0LTQtdC+IgorCisjfiBtc2dpZCAiUmFkaW8iCisjfiBtc2dzdHIgItCg0LDQtNGW0L4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIgorI34gbXNnc3RyICLQndC1INCy0LTQsNC70L7RgdGPINCy0ZbQtNC60YDQuNGC0Lgg0L/RgNC40YHRgtGA0ZbQuSDQtNC70Y8g0LrQtdGA0YPQstCw0L3QvdGPINGA0LXQs9GD0LvRj9GC0L7RgNCw0LzQuCDQvNGW0LrRiNC10YDQsC4iCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICLQndC1INCy0LTQsNC70L7RgdGPINCy0ZbQtNC60YDQuNGC0Lgg0L/RgNC40YHRgtGA0ZbQuSDQtNC70Y8g0LrQtdGA0YPQstCw0L3QvdGPINGA0LXQs9GD0LvRj9GC0L7RgNCw0LzQuCDQvNGW0LrRiNC10YDQsC4g0KbRjyAiCisjfiAi0LLQtdGA0YHRltGPIE9wZW4gU291bmQgU3lzdGVtINC90LUg0L/RltC00YLRgNC40LzRg9GU0YLRjNGB0Y8g0YbQuNC8INC10LvQtdC80LXQvdGC0L7QvC4iCisKKyN+IG1zZ2lkICJNYXN0ZXIiCisjfiBtc2dzdHIgItCe0YHQvdC+0LLQvdC40LkiCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAi0J/QtdGA0LXQtNC90ZbQuSIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgItCX0LDQtNC90ZbQuSIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgItCd0LDQstGD0YjQvdC40LrQuCIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAi0KbQtdC90YLRgNCw0LvRjNC90LjQuSIKKworI34gbXNnaWQgIkxGRSIKKyN+IG1zZ3N0ciAiTEZFIgorCisjfiBtc2dpZCAiU3Vycm91bmQiCisjfiBtc2dzdHIgItCe0LEn0ZTQvNC90LjQuSIKKworI34gbXNnaWQgIlNpZGUiCisjfiBtc2dzdHIgItCR0L7QutC+0LLQuNC5IgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAi0JLQuNGF0ZbQtCBBVVgiCisKKyN+IG1zZ2lkICIzRCBEZXB0aCIKKyN+IG1zZ3N0ciAi0J/RgNC+0YHRgtC+0YDQvtCy0LAg0LPQu9C40LHQuNC90LAiCisKKyN+IG1zZ2lkICIzRCBDZW50ZXIiCisjfiBtc2dzdHIgItCf0YDQvtGB0YLQvtGA0L7QstC40Lkg0YbQtdC90YLRgCIKKworI34gbXNnaWQgIjNEIEVuaGFuY2UiCisjfiBtc2dzdHIgItCf0YDQvtGB0YLQvtGA0L7QstC1INC/0L7QutGA0LDRidC10L3QvdGPIgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICLQotC10LvQtdGE0L7QvSIKKworI34gbXNnaWQgIlZpZGVvIEluIgorI34gbXNnc3RyICLQktGW0LTQtdC+0LLRhdGW0LQiCisKKyN+IG1zZ2lkICJBVVggSW4iCisjfiBtc2dzdHIgItCS0YXRltC0IEFVWCIKKworI34gbXNnaWQgIlJlY29yZCBHYWluIgorI34gbXNnc3RyICLQn9GW0LTRgdC40LvQtdC90L3RjyDQt9Cw0L/QuNGB0YMiCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAi0J/RltC00YHQuNC70LXQvdC90Y8g0LLQuNGF0L7QtNGDIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAi0J/RltC00YHQuNC70LXQvdC90Y8g0LzRltC60YDQvtGE0L7QvdCwIgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAi0JTRltCw0LPQvdC+0YHRgtC40LrQsCIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgItCf0ZbQtNGB0LjQu9C10L3QvdGPINCx0LDRgdGW0LIiCisKKyN+IG1zZ2lkICJQbGF5YmFjayBQb3J0cyIKKyN+IG1zZ3N0ciAi0J/QvtGA0YLQuCDQstGW0LTRgtCy0L7RgNC10L3QvdGPIgorCisjfiBtc2dpZCAiSW5wdXQiCisjfiBtc2dzdHIgItCS0YXRltC0IgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgItCh0L/QvtGB0YLQtdGA0LXQttC10L3QvdGPINC30LAg0LTQttC10YDQtdC70L7QvCIKKworI34gbXNnaWQgIktleWJvYXJkIEJlZXAiCisjfiBtc2dzdHIgItCT0YPQtNC+0Log0LrQu9Cw0LLRltCw0YLRg9GA0LgiCisKKyN+IG1zZ2lkICJTaW11bGF0ZSBTdGVyZW8iCisjfiBtc2dzdHIgItCG0LzRltGC0LDRhtGW0Y8g0YHRgtC10YDQtdC+IgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICLQodGC0LXRgNC10L4iCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAi0J7QsSfRlNC80L3QuNC5INC30LLRg9C6IgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBHYWluIgorI34gbXNnc3RyICLQn9GW0LTRgdC40LvQtdC90L3RjyDQvNGW0LrRgNC+0YTQvtC90LAiCisKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAi0J7RgdC90L7QstC90LjQuSDQtNC40L3QsNC80ZbQuiIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgU291cmNlIgorI34gbXNnc3RyICLQntGB0L3QvtCy0L3QuNC5INC80ZbQutGA0L7RhNC+0L0iCisKKyN+IG1zZ2lkICJKYWNrIgorI34gbXNnc3RyICJKYWNrIgorCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICLQptC10L3RgtGA0LDQu9GM0L3QuNC5L0xGRSIKKworI34gbXNnaWQgIlN0ZXJlbyBNaXgiCisjfiBtc2dzdHIgItCh0YLQtdGA0LXQvtC80ZbQutGI0LXRgCIKKworI34gbXNnaWQgIk1vbm8gTWl4IgorI34gbXNnc3RyICLQnNC+0L3QvtC80ZbQutGI0LXRgCIKKworI34gbXNnaWQgIklucHV0IE1peCIKKyN+IG1zZ3N0ciAi0JzRltC60YjQtdGAINCy0YUuINC00LDQvdC40YUiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIDEiCisjfiBtc2dzdHIgItCc0ZbQutGA0L7RhNC+0L0gMSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAi0JzRltC60YDQvtGE0L7QvSAyIgorCisjfiBtc2dpZCAiRGlnaXRhbCBPdXQiCisjfiBtc2dzdHIgItCm0LjRhNGA0L7QstC40Lkg0LLQuNGF0ZbQtCIKKworI34gbXNnaWQgIkRpZ2l0YWwgSW4iCisjfiBtc2dzdHIgItCm0LjRhNGA0L7QstC40Lkg0LLRhdGW0LQiCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgItCc0L7QtNC10LwiCisKKyN+IG1zZ2lkICJIYW5kc2V0IgorI34gbXNnc3RyICLQk9Cw0YDQvdGW0YLRg9GA0LAiCisKKyN+IG1zZ2lkICJPdGhlciIKKyN+IG1zZ3N0ciAi0IbQvdGI0LUiCisKKyN+IG1zZ2lkICJOb25lIgorI34gbXNnc3RyICLQndC10LzQsNGUIgorCisjfiBtc2dpZCAiT24iCisjfiBtc2dzdHIgItCj0LLRltC80LrQvS4iCisKKyN+IG1zZ2lkICJPZmYiCisjfiBtc2dzdHIgItCS0LjQvNC60L0uIgorCisjfiBtc2dpZCAiTXV0ZSIKKyN+IG1zZ3N0ciAi0JLQuNC80LrQvdGD0YLQuCDQt9Cy0YPQuiIKKworI34gbXNnaWQgIkZhc3QiCisjfiBtc2dzdHIgItCo0LLQuNC00LrQviIKKworI34gbXNnaWQgIlZlcnkgTG93IgorI34gbXNnc3RyICLQlNGD0LbQtSDQvdC40LfRjNC60LAiCisKKyN+IG1zZ2lkICJMb3ciCisjfiBtc2dzdHIgItCd0LjQt9GM0LrQsCIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAi0KHQtdGA0LXQtNC90Y8iCisKKyN+IG1zZ2lkICJIaWdoIgorI34gbXNnc3RyICLQktC40YHQvtC60LAiCisKKyN+IG1zZ2lkICJWZXJ5IEhpZ2giCisjfiBtc2dzdHIgItCU0YPQttC1INCy0LjRgdC+0LrQsCIKKworI34gbXNnaWQgIlByb2R1Y3Rpb24iCisjfiBtc2dzdHIgItCf0YDQvtC80LjRgdC70L7QstCwIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTWljcm9waG9uZSIKKyN+IG1zZ3N0ciAi0JzRltC60YDQvtGE0L7QvSDQv9C10YDQtdC00L3RjNC+0Zcg0L/QsNC90LXQu9GWIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBJbiIKKyN+IG1zZ3N0ciAi0JvRltC90ZbQudC90LjQuSDQstGF0ZbQtCDQv9C10YDQtdC00L3RjNC+0Zcg0L/QsNC90LXQu9GWIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAi0JLQuNGF0ZbQtCDQvdCw0LLRg9GI0L3QuNC60ZbQsiDQv9C10YDQtdC00L3RjNC+0Zcg0L/QsNC90LXQu9GWIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBPdXQiCisjfiBtc2dzdHIgItCb0ZbQvdGW0LnQvdC40Lkg0LLQuNGF0ZbQtCDQv9C10YDQtdC00L3RjNC+0Zcg0L/QsNC90LXQu9GWIgorCisjfiBtc2dpZCAiR3JlZW4gQ29ubmVjdG9yIgorI34gbXNnc3RyICLQl9C10LvQtdC90LjQuSDRgNC+0LfQvdGW0LwiCisKKyN+IG1zZ2lkICJQaW5rIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0KDQvtC20LXQstC40Lkg0YDQvtC30L3RltC8IgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCh0LjQvdGW0Lkg0YDQvtC30L3RltC8IgorCisjfiBtc2dpZCAiV2hpdGUgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQkdGW0LvQuNC5INGA0L7Qt9C90ZbQvCIKKworI34gbXNnaWQgIkJsYWNrIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0KfQvtGA0L3QuNC5INGA0L7Qt9C90ZbQvCIKKworI34gbXNnaWQgIkdyYXkgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQodGW0YDQuNC5INGA0L7Qt9C90ZbQvCIKKworI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCf0L7QvNCw0YDQsNC90YfQtdCy0LjQuSDRgNC+0LfQvdGW0LwiCisKKyN+IG1zZ2lkICJSZWQgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQp9C10YDQstC+0L3QuNC5INGA0L7Qt9C90ZbQvCIKKworI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCW0L7QstGC0LjQuSDRgNC+0LfQvdGW0LwiCisKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCX0LXQu9C10L3QuNC5INGA0L7Qt9C90ZbQvCDQv9C10YDQtdC00L3RjNC+0Zcg0L/QsNC90LXQu9GWIgorCisjfiBtc2dpZCAiUGluayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCg0L7QttC10LLQuNC5INGA0L7Qt9C90ZbQvCDQv9C10YDQtdC00L3RjNC+0Zcg0L/QsNC90LXQu9GWIgorCisjfiBtc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCh0LjQvdGW0Lkg0YDQvtC30L3RltC8INC/0LXRgNC10LTQvdGM0L7RlyDQv9Cw0L3QtdC70ZYiCisKKyN+IG1zZ2lkICJXaGl0ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCR0ZbQu9C40Lkg0YDQvtC30L3RltC8INC/0LXRgNC10LTQvdGM0L7RlyDQv9Cw0L3QtdC70ZYiCisKKyN+IG1zZ2lkICJCbGFjayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCn0L7RgNC90LjQuSDRgNC+0LfQvdGW0Lwg0L/QtdGA0LXQtNC90YzQvtGXINC/0LDQvdC10LvRliIKKworI34gbXNnaWQgIkdyYXkgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLQodGW0YDQuNC5INGA0L7Qt9C90ZbQvCDQv9C10YDQtdC00L3RjNC+0Zcg0L/QsNC90LXQu9GWIgorCisjfiBtc2dpZCAiT3JhbmdlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0J/QvtC80LDRgNCw0L3Rh9C10LLQuNC5INGA0L7Qt9C90ZbQvCDQv9C10YDQtdC00L3RjNC+0Zcg0L/QsNC90LXQu9GWIgorCisjfiBtc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi0KfQtdGA0LLQvtC90LjQuSDRgNC+0LfQvdGW0Lwg0L/QtdGA0LXQtNC90YzQvtGXINC/0LDQvdC10LvRliIKKworI34gbXNnaWQgIlllbGxvdyBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgItCW0L7QstGC0LjQuSDRgNC+0LfQvdGW0Lwg0L/QtdGA0LXQtNC90YzQvtGXINC/0LDQvdC10LvRliIKKworI34gbXNnaWQgIlNwcmVhZCBPdXRwdXQiCisjfiBtc2dzdHIgItCg0L7Qt9Cz0L7RgNC90YPRgtC4INCy0LjRhdGW0LQiCisKKyN+IG1zZ2lkICJEb3dubWl4IgorI34gbXNnc3RyICLQntCx4oCZ0ZTQtNC90LDQvdC90Y8g0LrQsNC90LDQu9GW0LIiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIElucHV0IgorI34gbXNnc3RyICLQktGF0ZbQtCDQstGW0YDRgtGD0LDQu9GM0L3QvtCz0L4g0LzRltC60YjQtdGA0LAiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKKyN+IG1zZ3N0ciAi0JLQuNGF0ZbQtCDQstGW0YDRgtGD0LDQu9GM0L3QvtCz0L4g0LzRltC60YjQtdGA0LAiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICLQmtCw0L3QsNC70Lgg0LLRltGA0YLRg9Cw0LvRjNC90L7Qs9C+INC80ZbQutGI0LXRgNCwIgorCisjfiBtc2dpZCAiJXMgJWQgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzLCDRhNGD0L3QutGG0ZbRjyAlZCIKKworI34gbXNnaWQgIiVzIEZ1bmN0aW9uIgorI34gbXNnc3RyICLQpNGD0L3QutGG0ZbRjyAlcyIKKworI34gbXNnaWQgIkdvdCB1bmV4cGVjdGVkIGZyYW1lIHNpemUgb2YgJXUgaW5zdGVhZCBvZiAldS4iCisjfiBtc2dzdHIgItCe0YLRgNC40LzQsNC90L4g0L3QtdC+0YfRltC60YPQstCw0L3QuNC5INGA0L7Qt9C80ZbRgCDQsdC70L7QutGDICV1INC30LDQvNGW0YHRgtGMICV1LiIKKworI34gbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgb24gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLQn9C+0LzQuNC70LrQsCDQv9GW0LQg0YfQsNGBINGB0L/RgNC+0LHQuCDRh9C40YLQsNC90L3RjyAlZCDQsdCw0LnRgtGW0LIg0L3QsCDQv9GA0LjRgdGC0YDQvtGXIMKrJXPCuy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZW5xdWV1ZSBidWZmZXJzIGluIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAi0J3QtSDQstC00LDQu9C+0YHRjyDQvtC/0LjRgtCw0YLQuCDQsdGD0YTQtdGA0Lgg0LLRltC0INC/0YDQuNGB0YLRgNC+0Y4gwqslc8K7LiIKKworI34gbXNnaWQgIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAi0J3QtSDQstC00LDQu9C+0YHRjyDQvtGC0YDQuNC80LDRgtC4INCy0ZbQtNC10L7QutCw0LTRgNC4INC3INC/0YDQuNGB0YLRgNC+0Y4gwqslc8K7LiIKKworI34gbXNnaWQgIkZhaWxlZCBhZnRlciAlZCB0cmllcy4gZGV2aWNlICVzLiBzeXN0ZW0gZXJyb3I6ICVzIgorI34gbXNnc3RyICLQn9C+0LzQuNC70LrQsCDQv9GW0YHQu9GPICVkINGB0L/RgNC+0LEuINCf0YDQuNGB0YLRgNGW0LkgJXMuINCh0LjRgdGC0LXQvNC90LAg0L/QvtC80LjQu9C60LA6ICVzIgorCisjfiBtc2dpZCAiQ291bGQgbm90IHJlYWQgZnJvbSBDRC4iCisjfiBtc2dzdHIgItCd0LUg0LLQtNCw0ZTRgtGM0YHRjyDQv9GA0L7Rh9C40YLQsNGC0Lgg0Lcg0LrQvtC80L/QsNC60YIt0LTQuNGB0LrRgy4iCisKKyN+IG1zZ2lkICJEaXNjIGlzIG5vdCBhbiBBdWRpbyBDRC4iCisjfiBtc2dzdHIgItCU0LjRgdC6INC90LUg0ZQg0LDRg9C00ZbQviDQutC+0LzQv9Cw0LrRgi3QtNC40YHQutC+0LwuIgorCisjfiBtc2dpZCAiVGhpcyBmaWxlIGlzIGVuY3J5cHRlZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCisjfiBtc2dzdHIgItCk0LDQudC7INC30LDRiNC40YTRgNC+0LLQsNC90LjQuSDRgtCwINC90LUg0LzQvtC20LUg0LHRg9GC0Lgg0LLRltC00YLQstC+0YDQtdC90LjQuS4iCisKKyN+IG1zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMuJyIKKyN+IG1zZ3N0ciAi0J3QtSDQstC00LDRlNGC0YzRgdGPINC+0YLRgNC40LzQsNGC0Lgg0LDRgtGA0LjQsdGD0YLQuCDQvtGA0LPQsNC90ZbQsiDQutC10YDRg9Cy0LDQvdC90Y8g0L/RgNC40YHRgtGA0L7RjiBcIiVzXCIuIgorCisjfiBtc2dpZCAiIgorI34gIlRoZSBidWZmZXIgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCBvciB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcywgb3Igbm8gIgorI34gImJ1ZmZlcnMgaGF2ZSBiZWVuIGFsbG9jYXRlZCB5ZXQsIG9yIHRoZSB1c2VycHRyIG9yIGxlbmd0aCBhcmUgaW52YWxpZC4gIgorI34gImRldmljZSAlcyIKKyN+IG1zZ3N0ciAiIgorI34gItCR0YPRhNC10YAg0YbRjNC+0LPQviDRgtC40L/RgyDQvdC1INC/0ZbQtNGC0YDQuNC80YPRlNGC0YzRgdGPLCDQsNCx0L4g0ZbQvdC00LXQutGBINC/0L7Qt9CwINC80LXQttCw0LzQuCDQtNGW0LDQv9Cw0LfQvtC90YMsINCw0LHQviAiCisjfiAi0LHRg9GE0LXRgNC4INGJ0LUg0L3QtSDQsdGD0LvQuCDQstC40LTRltC70LXQvdGWLCDQsNCx0L4g0L3QtdC/0YDQsNCy0LjQu9GM0L3RliDQv9Cw0YDQsNC80LXRgtGA0LggdXNlcnB0ciDRh9C4INC00L7QstC20LjQvdCwLiAiCisjfiAi0J/RgNC40YHRgtGA0ZbQuSAlcyIKKworI34gbXNnaWQgIiIKKyN+ICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4gTm90IGVub3VnaCBtZW1vcnkuIgorI34gbXNnc3RyICIiCisjfiAi0J3QtSDQstC00LDRlNGC0YzRgdGPINC+0YLRgNC40LzQsNGC0Lgg0LLRltC00LXQvtC60LDQtNGA0Lgg0Lcg0L/RgNC40YHRgtGA0L7RjiBcIiVzXCIuINCd0LXQtNC+0YHRgtCw0YLQvdGM0L4g0L/QsNC8J9GP0YLRli4iCisKKyN+IG1zZ2lkICJpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGVucXVldWUgYSB1c2VyIHBvaW50ZXIgYnVmZmVyLiBkZXZpY2UgJXMuIgorI34gbXNnc3RyICIiCisjfiAi0J3QtdC00L7RgdGC0LDRgtC90YzQviDQv9Cw0Lwn0Y/RgtGWINC00LvRjyDQstGB0YLQsNCy0LvRj9C90L3RjyDRgyDRh9C10YDQs9GDINCy0LrQsNC30ZbQstC90LjQutCwINC90LAg0LHRg9GE0LXRgCAiCisjfiAi0LrQvtGA0LjRgdGC0YPQstCw0YfQsC4g0J/RgNC40YHRgtGA0ZbQuSAlcy4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZXhjaGFuZ2UgZGF0YSB3aXRoIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAi0J/QvtC80LjQu9C60LAg0L/RgNC4INC+0LHQvNGW0L3RliDQtNCw0L3QuNC80Lgg0Lcg0L/RgNC40YHRgtGA0L7RlNC8IFwiJXNcIi4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3Qgc2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCisjfiBtc2dzdHIgItCd0LUg0LLQtNCw0ZTRgtGM0YHRjyDQstGB0YLQsNC90L7QstC40YLQuCDQv9Cw0YDQsNC80LXRgtGA0Lgg0L/RgNC40YHRgtGA0L7RjiBcIiVzXCIuIgorCisjfiBtc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWQvJWQgZnJhbWVzIHBlciBzZWNvbmQiCisjfiBtc2dzdHIgItCf0YDQuNGB0YLRgNGW0LkgXCIlc1wiINC90LUg0LfQtNCw0YLQvdC40Lkg0LfQsNGF0L7Qv9C70Y7QstCw0YLQuCAlZC8lZCDQutCw0LTRgNGW0LIg0LfQsCDRgdC10LrRg9C90LTRgyIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBnZXQgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAi0J3QtSDQstC00LDRlNGC0YzRgdGPINC+0YLRgNC40LzQsNGC0Lgg0LHRg9GE0LXRgNC4INCy0ZbQtCDQv9GA0LjRgdGC0YDQvtGOIFwiJXNcIi4iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZ2V0IGVub3VnaCBidWZmZXJzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLQndC1INCy0LTQsNGU0YLRjNGB0Y8g0L7RgtGA0LjQvNCw0YLQuCDQtNC+0YHRgtCw0YLQvdGM0L4g0LHRg9GE0LXRgNGW0LIg0LLRltC0INC/0YDQuNGB0YLRgNC+0Y4gXCIlc1wiLiIKKworI34gbXNnaWQgIkVycm9yIHN0YXJ0aW5nIHN0cmVhbWluZyBjYXB0dXJlIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLQndC1INCy0LTQsNGU0YLRjNGB0Y8g0YDQvtC30L/QvtGH0LDRgtC4INC30LDRhdC+0L/Qu9C10L3QvdGPINC60LDQtNGA0ZbQsiDQtyDQv9GA0LjRgdGC0YDQvtGOIFwiJXNcIi4iCisKKyN+IG1zZ2lkICJFcnJvciBzdG9wcGluZyBzdHJlYW1pbmcgY2FwdHVyZSBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAi0J/QvtC80LjQu9C60LAg0L/RgNC4INC30YPQv9C40L3QtdC90L3RliDQt9Cw0YXQvtC/0LvQtdC90L3RjyDQutCw0LTRgNGW0LIg0Lcg0L/RgNC40YHRgtGA0L7RjiBcIiVzXCIuIgpkaWZmIC0tZ2l0IGEvcG8vdmkucG8gYi9wby92aS5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjJkZjdmCi0tLSAvZGV2L251bGwKKysrIGIvcG8vdmkucG8KQEAgLTAsMCArMSw3OTEgQEAKKyMgVmlldG5hbWVzZSBUcmFuc2xhdGlvbiBmb3IgR1NUIFBsdWdpbnMgR29vZC4KKyMgQuG6o24gZOG7i2NoIHRp4bq/bmcgVmnhu4d0IGTDoG5oIGNobyBHU1QgUGx1Z2lucyBHb29kLgorIyBDb3B5cmlnaHQgwqkgMjAxNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGdzdC1wbHVnaW5zLWdvb2QgcGFja2FnZS4KKyMgQ2x5dGllIFNpZGRhbGwgPGNseXRpZUByaXZlcmxhbmQubmV0LmF1PiwgMjAwNS0yMDEwLgorIyBUcuG6p24gTmfhu41jIFF1w6JuIDx2bndpbGRtYW5AZ21haWwuY29tPiwgMjAxMi0yMDE0LCAyMDE1LCAyMDE2LgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZCAxLjcuMlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDE2LTAyLTIxIDA3OjI1KzA3MDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IFRy4bqnbiBOZ+G7jWMgUXXDom4gPHZud2lsZG1hbkBnbWFpbC5jb20+XG4iCisiTGFuZ3VhZ2UtVGVhbTogVmlldG5hbWVzZSA8dHJhbnNsYXRpb24tdGVhbS12aUBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+XG4iCisiTGFuZ3VhZ2U6IHZpXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0xOyBwbHVyYWw9MDtcbiIKKyJYLUxhbmd1YWdlLVRlYW0tV2Vic2l0ZTogPGh0dHA6Ly90cmFuc2xhdGlvbnByb2plY3Qub3JnL3RlYW0vdmkuaHRtbD5cbiIKKyJYLUdlbmVyYXRvcjogR3RyYW5zbGF0b3IgMi45MS43XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIktow7RuZyB0w6xtIHRo4bqleSBtw6F5IHBo4bulYyB24bulIEphY2siCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIkfhurdwIGzhu5dpIGtoaSBnaeG6o2kgbcOjIOG6o25oIEpQRUciCisKKyMuIFRSQU5TTEFUT1JTOiAnc29uZyB0aXRsZScgYnkgJ2FydGlzdCBuYW1lJworIywgYy1mb3JtYXQKK21zZ2lkICInJXMnIGJ5ICclcyciCittc2dzdHIgIuKAnCVz4oCdIGLhu59pIOKAnCVz4oCdIgorCittc2dpZCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIgorbXNnc3RyICJLaMO0bmcgdGjhu4Mga+G6v3QgbuG7kWkgdOG7m2kgbcOheSBwaOG7pWMgduG7pSIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICJLaMO0bmcgY8OzIFVSTCBuw6BvIMSRxrDhu6NjIMSR4bq3dC4iCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIktow7RuZyB0aOG7gyBwaMOibiBnaeG6o2kgdMOqbiBtw6F5IHBo4bulYyB24bulLiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICJLaMO0bmcgdGjhu4MgdGhp4bq/dCBs4bqtcCBr4bq/dCBu4buRaSB04bubaSBtw6F5IGNo4bunLiIKKworbXNnaWQgIlNlY3VyZSBjb25uZWN0aW9uIHNldHVwIGZhaWxlZC4iCittc2dzdHIgIkfhurdwIGzhu5dpIGtoaSBjw6BpIMSR4bq3dCBr4bq/dCBu4buRaSBhbiB0b8Ogbi4iCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICJDw7MgbOG7l2kgbeG6oW5nIMSRw6MgeOG6o3kgcmEsIGhv4bq3YyBtw6F5IGNo4bunIMSRw7NuZyBr4bq/dCBu4buRaSBi4bqldCBuZ+G7nS4iCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIk3DoXkgY2jhu6cgZ+G7rWkgZOG7ryBsaeG7h3Ugc2FpLiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICJNw6F5IHBo4bulYyB24bulIGtow7RuZyBo4buXIHRy4bujIGRpIGNodXnhu4NuIHbhu4sgdHLDrSDEkeG7jWMuIgorCittc2dpZCAiTm8gb3IgaW52YWxpZCBpbnB1dCBhdWRpbywgQVZJIHN0cmVhbSB3aWxsIGJlIGNvcnJ1cHQuIgorbXNnc3RyICIiCisiQ2jGsGEgY8OzIGThu68gbGnhu4d1IMOibSB0aGFuaCBuaOG6rXAsIGhv4bq3YyBk4buvIGxp4buHdSDDom0gdGhhbmggbmjhuq1wIGtow7RuZyBo4bujcCBs4buHLiBWw6wgIgorInRo4bq/IGx14buTbmcgQVZJIHPhur0gaOG7j25nLiIKKworbXNnaWQgIlRoaXMgZmlsZSBjb250YWlucyBubyBwbGF5YWJsZSBzdHJlYW1zLiIKK21zZ3N0ciAiVOG6rXAgdGluIG7DoHkga2jDtG5nIGNo4bupYSBsdeG7k25nIGPDsyB0aOG7gyBwaMOhdC4iCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIlThuq1wIHRpbiBuw6B5IGtow7RuZyBo4bujcCBs4buHIG7Dqm4ga2jDtG5nIHRo4buDIHBow6F0IMSRxrDhu6NjLiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICJLaMO0bmcgdGjhu4MgcGjDoXQgbHXhu5NuZyBk4buvIGxp4buHdSBi4bufaSB2w6wgbsOzIMSRxrDhu6NjIG3DoyBow7NhIGLhurFuZyBQbGF5UmVhZHkgRFJNLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiVOG6rXAgdGluIG7DoHkgYuG7iyBo4buPbmcgbsOqbiBraMO0bmcgdGjhu4MgcGjDoXQuIgorCittc2dpZCAiSW52YWxpZCBhdG9tIHNpemUuIgorbXNnc3RyICJLw61jaCB0aMaw4bubYyBuZ3V5w6puIHThu60gKGF0b20pIGtow7RuZyBo4bujcCBs4buHLiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbmNvbXBsZXRlIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAiVOG6rXAgdGluIG7DoHkgY2jGsGEgaG/DoG4gdGjDoG5oIG7Dqm4ga2jDtG5nIHRo4buDIMSRxrDhu6NjIHBow6F0LiIKKworbXNnaWQgIlRoZSB2aWRlbyBpbiB0aGlzIGZpbGUgbWlnaHQgbm90IHBsYXkgY29ycmVjdGx5LiIKK21zZ3N0ciAi4bqibmggxJHhu5luZyB0cm9uZyB04bqtcCB0aW4gbsOgeSBjw7MgdGjhu4Mga2jDtG5nIHBow6F0IMSRw7puZy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IHN0cmVhbXMuIE9ubHkgcGxheWluZyBmaXJzdCAlZCIKK21zZ3N0ciAiVOG6rXAgdGluIG7DoHkgY2jhu6lhIHF1w6Egbmhp4buBdSBsdeG7k25nIG7Dqm4gY2jhu4kgcGjDoXQgJWQgxJHhuqd1IHRpw6puIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyJLaMO0bmcgdMOsbSB0aOG6pXkgbHXhu5NuZyDEkcaw4bujYyBo4buXIHRy4bujLiBOZ8aw4budaSBkw7luZyBjw7MgdGjhu4MgY+G6p24gcGjhuqNpIGPDoGkgxJHhurd0IG3hu5l0ICIKKyJwaOG6p24gYuG7lSBzdW5nIFJUU1AgR3N0cmVhbWVyIMSR4buDIHjhu60gbMO9IGx14buTbmcgbmjhuqFjL3BoaW0gbG/huqFpIFJlYWwuIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisiS2jDtG5nIHTDrG0gdGjhuqV5IGx14buTbmcgZOG7ryBsaeG7h3UgxJHGsOG7o2MgaOG7lyB0cuG7oy4gTmfGsOG7nWkgZMO5bmcgY8OzIHRo4buDIGPhuqduIGNobyBwaMOpcCAiCisidGjDqm0gZ2lhbyB0aOG7qWMgdHJ1eeG7gW4sIGhv4bq3YyBjaMawYSBjw6BpIMSR4bq3dCBwaOG6p24gYuG7lSBzdW5nIFJUU1AgR3N0cmVhbWVyIMSRw7puZy4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisiS2jDtG5nIHRo4buDIG3hu58gdGhp4bq/dCBi4buLIMOibSB0aGFuaCDEkeG7gyBwaMOhdCBs4bqhaS4gVGhp4bq/dCBi4buLIG7DoHkgxJFhbmcgxJHGsOG7o2MgbeG7mXQg4bupbmcgIgorImThu6VuZyBraMOhYyBz4butIGThu6VuZy4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorIktow7RuZyB0aOG7gyBt4bufIHRoaeG6v3QgYuG7iyDDom0gdGhhbmggxJHhu4MgcGjDoXQgbOG6oWkuIELhuqFuIGtow7RuZyBjw7MgxJHhu6cgdGjhuqltIHF1eeG7gW4gxJHhu4MgbeG7nyAiCisidGhp4bq/dCBi4buLIG7DoHkuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIktow7RuZyB0aOG7gyBt4bufIHRoaeG6v3QgYuG7iyDDom0gdGhhbmggxJHhu4MgcGjDoXQgbOG6oWkuIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCAiCisiU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKK21zZ3N0ciAiIgorIktow7RuZyB0aOG7gyBt4bufIHRoaeG6v3QgYuG7iyDDom0gdGhhbmggxJHhu4MgcGjDoXQgbOG6oWkuIFBoacOqbiBi4bqjbiBI4buHIHRo4buRbmcgw4JtIHRoYW5oIE3hu58gIgorIm7DoHkga2jDtG5nIMSRxrDhu6NjIHnhur91IHThu5EgbsOgeSBo4buXIHRy4bujLiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJDaOG7qWMgbsSDbmcgcGjDoXQgbOG6oWkga2jDtG5nIHBo4bqjaSDEkcaw4bujYyB0aGnhur90IGLhu4sgw6JtIHRoYW5oIG7DoHkgaOG7lyB0cuG7oy4iCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIkzhu5dpIHBow6F0IGzhuqFpIMOibSB0aGFuaC4iCisKK21zZ2lkICJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIkNo4bupYyBuxINuZyB0aHUga2jDtG5nIHBo4bqjaSDEkcaw4bujYyB0aGnhur90IGLhu4sgw6JtIHRoYW5oIG7DoHkgaOG7lyB0cuG7oy4iCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICJH4bq3cCBs4buXaSBraGkgdGh1IHThu6sgdGhp4bq/dCBi4buLIMOibSB0aGFuaC4iCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKyJLaMO0bmcgdGjhu4MgbeG7nyB0aGnhur90IGLhu4sgw6JtIHRoYW5oIMSR4buDIHRodS4gQuG6oW4ga2jDtG5nIGPDsyBxdXnhu4FuIG3hu58gdGhp4bq/dCBi4buLIG7DoHkuIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIgorbXNnc3RyICJLaMO0bmcgdGjhu4MgbeG7nyB0aGnhur90IGLhu4sgw6JtIHRoYW5oIMSR4buDIHRodS4iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIG5vdCBmb3VuZCIKK21zZ3N0ciAiS2jDtG5nIHTDrG0gdGjhuqV5IHRoaeG6v3QgYuG7iyBDb3JlQXVkaW8iCisKK21zZ2lkICJDb3JlQXVkaW8gZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQiCittc2dzdHIgIktow7RuZyB0aOG7gyBt4bufIHRoaeG6v3QgYuG7iyBDb3JlQXVkaW8iCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICJHaGkgbMawdSBuZ3Xhu5NuIgorCittc2dpZCAiTWljcm9waG9uZSIKK21zZ3N0ciAiTWljcsO0IgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAixJDhuqd1IHbDoG8iCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAiQ0Qg4bufIHRyb25nIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIlNQRElGIFbDoG8iCisKK21zZ2lkICJBVVggMSBJbiIKK21zZ3N0ciAiQVVYIDEgVsOgbyIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJBVVggMiBWw6BvIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIlbDsm5nIG5nxrDhu6NjIENvZGVjIgorCittc2dpZCAiU3VuVlRTIExvb3BiYWNrIgorbXNnc3RyICJWw7JuZyBuZ8aw4bujYyBTdW5WVFMiCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIsOCbSBsxrDhu6NuZyIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIktodeG6v2NoIMSR4bqhaSIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIk3DoG4gaMOsbmgiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICJMb2EgdMOtY2ggaOG7o3AiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIlRhaSBuZ2hlIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIsSQ4bqndSByYSIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiU1BESUYgUmEiCisKK21zZ2lkICJBVVggMSBPdXQiCittc2dzdHIgIkFVWCAxIFJhIgorCittc2dpZCAiQVVYIDIgT3V0IgorbXNnc3RyICJBVVggMiBSYSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICJH4bq3cCBs4buXaSBraGkgxJHhu41jICVkIGJ5dGUgdOG7qyB0aGnhur90IGLhu4sg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayB3aXRoIgorbXNnc3RyICIiCisiR+G6t3AgbOG7l2kga2hpIMSRw6FuaCBz4buRIGPDoWMgxJHhu4tuaCBk4bqhbmcgdmlkZW8gY8OzIHRo4buDLCBtw6AgdGhp4bq/dCBi4buLIOKAnCVz4oCdIGPDsyB0aOG7gyBsw6BtICIKKyJ2aeG7h2MgY8O5bmciCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIktow7RuZyB0aOG7gyDDoW5oIHjhuqEgY8OhYyBi4buZIMSR4buHbSB04burIHRoaeG6v3QgYuG7iyDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJTyBtZXRob2QgJWQiCittc2dzdHIgIlRyw6xuaCDEkWnhu4F1IGtoaeG7g24gY+G7p2EgdGhp4bq/dCBi4buLIOKAnCVz4oCdIGtow7RuZyBo4buXIHRy4bujIHBoxrDGoW5nIHBow6FwIFZSICVkIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkga25vd24gSU8gbWV0aG9kLiIKK21zZ3N0ciAiIgorIlRyw6xuaCDEkWnhu4F1IGtoaeG7g24gY+G7p2EgdGhp4bq/dCBi4buLIOKAnCVz4oCdIGtow7RuZyBo4buXIHRy4bujIHBoxrDGoW5nIHBow6FwIFZSIMSRw6MgYmnhur90IG7DoG8uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIlRoaeG6v3QgYuG7iyDigJwlc+KAnSDEkWFuZyBi4bqtbiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBjYW5ub3QgY2FwdHVyZSBhdCAlZHglZCIKK21zZ3N0ciAiVGhp4bq/dCBi4buLIOKAnCVz4oCdIGtow7RuZyB0aOG7gyBjaOG7pXAgdOG6oWkgJWR4JWQiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIlRoaeG6v3QgYuG7iyDigJwlc+KAnSBraMO0bmcgdGjhu4MgY2jhu6VwIOG7nyDEkeG7i25oIGThuqFuZyDEkcOjIGNobyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICJUaGnhur90IGLhu4sg4oCcJXPigJ0ga2jDtG5nIGjhu5cgdHLhu6MgY2jhu6ljIG7Eg25nIOKAnG5vbi1jb250aWd1b3VzIHBsYW5lc+KAnSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciCittc2dzdHIgIktow7RuZyB0aOG7gyBs4bqleSBjw6FjIHRoYW0gc+G7kSB24buBIHRoaeG6v3QgYuG7iyDigJwlc+KAnS4iCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIlRoaeG6v3QgYuG7iyB2aWRlbyBraMO0bmcgY2jhuqVwIG5o4bqtbiBjw6BpIMSR4bq3dCB24buBIHThu5FjIMSR4buZIGtodW5nIGjDrG5oIG3hu5tpLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIlRoaeG6v3QgYuG7iyB2aWRlbyBraMO0bmcgY3VuZyBj4bqlcCDEkeG7i25oIGThuqFuZyB4deG6pXQuIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIHJldHVybmVkIGludmFsaWQgZGltZW5zaW9ucy4iCittc2dzdHIgIlRoaeG6v3QgYuG7iyB2aWRlbyB0cuG6oyB2w6Aga8OtY2ggdGjGsOG7m2Mga2jDtG5nIGjhu6NwIGzhu4cuIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIGludGVybGFjaW5nIG1ldGhvZC4iCittc2dzdHIgIlRoaeG6v3QgYuG7iyBkw7luZyBwaMawxqFuZyBwaMOhcCB4ZW4ga+G6vSBraMO0bmcgxJHGsOG7o2MgaOG7lyB0cuG7oy4iCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiIKK21zZ3N0ciAiVGhp4bq/dCBi4buLIHZpZGVvIGTDuW5nIMSR4buLbmggZOG6oW5nIMSRaeG7g20g4bqjbmgga2jDtG5nIMSRxrDhu6NjIGjhu5cgdHLhu6MuIgorCittc2dpZCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBidWZmZXIgcG9vbC4iCittc2dzdHIgIkfhurdwIGzhu5dpIGtoaSBj4bqldSBow6xuaCBraG8gxJHhu4dtIG7hu5lpIHThuqFpLiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHN1Z2dlc3QgYW55IGJ1ZmZlciBzaXplLiIKK21zZ3N0ciAiVGhp4bq/dCBi4buLIHZpZGVvIGtow7RuZyDEkcawYSByYSBn4bujaSDDvSBuw6BvIHbhu4EgYuG7mSDEkeG7h20uIgorCittc2dpZCAiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIKK21zZ3N0ciAiS2jDtG5nIGPDsyBi4buDIGTDsm5nIGThu68gbGnhu4d1IHThuqNpIHbhu4EgxJHhu4MgbcOgIG5o4bqtcCB2w6BvLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIkfhurdwIGzhu5dpIGtoaSBs4bqleSBjw6FjIGPDoGkgxJHhurd0IHThu6sgdGhp4bq/dCBi4buLIMSRaeG7gXUgY2jhu4luaCBj4buZbmcgaMaw4bufbmcgJWQgdHLDqm4gdGhp4bq/dCAiCisiYuG7iyDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR+G6t3AgbOG7l2kga2hpIMSR4buNYyBkdW5nIGzGsOG7o25nIHThu6sgdGhp4bq/dCBi4buLIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSB0dW5lci4iCittc2dzdHIgIlRoaeG6v3QgYuG7iyAlcyBraMO0bmcgcGjhuqNpIHRoaeG6v3QgYuG7iyDEkWnhu4F1IGNo4buJbmggY+G7mW5nIGjGsOG7n25nLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIkfhurdwIGzhu5dpIGtoaSBs4bqleSDEkeG6p3UgdsOgbyByYWRpbyB0csOqbiB0aGnhur90IGLhu4sg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiR+G6t3AgbOG7l2kga2hpIMSR4bq3dCBk4buvIGxp4buHdSBuaOG6rXAgJWQgdsOgbyB0aGnhur90IGLhu4sg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICJH4bq3cCBs4buXaSBraGkgdGhheSDEkeG7lWkgdHLhuqFuZyB0aMOhaSBuZ+G6r3QgdGnhur9uZyBjaG8gdGhp4bq/dCBi4buLIOKAnCVz4oCdLiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiR+G6t3AgbOG7l2kga2hpIGPhuqVwIHBow6F0IGLhu5kgbmjhu5sgdGhlbyB5w6p1IGPhuqd1LiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuIgorbXNnc3RyICJH4bq3cCBs4buXaSBraGkgY+G6pXAgcGjDoXQgYuG7mSBuaOG7myB0aGVvIHnDqnUgY+G6p3UuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiCittc2dzdHIgIkLhu5kgY2h1eeG7g24gxJHhu5VpIHRyw6puIHRoaeG6v3QgYuG7iyAlcyBraMO0bmcgY8OzIMSR4buLbmggZOG6oW5nIMSR4bqndSB2w6BvIMSRxrDhu6NjIGjhu5cgdHLhu6MiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIkLhu5kgY2h1eeG7g24gxJHhu5VpIHRyw6puIHRoaeG6v3QgYuG7iyAlcyBraMO0bmcgY8OzIMSR4buLbmggZOG6oW5nIHh14bqldCDEkcaw4bujYyBo4buXIHRy4bujIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICJC4buZIG3DoyBow7NhIHRyw6puIHRoaeG6v3QgYuG7iyDigJwlc+KAnSBraMO0bmcgaOG7lyB0cuG7oyDEkeG7i25oIGThuqFuZyDEkeG6p3UgdsOgbyIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIkLhu5kgZ2nhuqNpIG3DoyB0csOqbiB0aGnhur90IGLhu4sg4oCcJXPigJ0ga2jDtG5nIGjhu5cgdHLhu6MgxJHhu4tuaCBk4bqhbmcgxJHhuqd1IHJhIgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIkfhurdwIGzhu5dpIGtoaSBi4bqvdCDEkeG6p3UgdGnhur9uIHRyw6xuaCBnaeG6o2kgbcOjLiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiR+G6t3AgbOG7l2kga2hpIHjhu60gbMO9IGtodW5nLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIiIKKyJH4bq3cCBs4buXaSBraGkgbOG6pXkga2jhuqMgbsSDbmcgY+G7p2EgdGhp4bq/dCBi4buLIOKAnCVz4oCdLiBOw7Mga2jDtG5nIHBo4bqjaSBsw6AgdHLDrG5oIMSRaeG7gXUgIgorImtoaeG7g24gcGhpw6puIGLhuqNuIDRsMi4gS2nhu4NtIHRyYSB4ZW0gbsOzIGPDsyBwaOG6o2kgbMOgIHRyw6xuaCDEkWnhu4F1IGtoaeG7g24gcGhpw6puIGLhuqNuICIKKyI0bDEga2jDtG5nLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiCittc2dzdHIgIkfhurdwIGzhu5dpIGtoaSB0cnV5IHbhuqVuIGPDoWMgdGh14buZYyB0w61uaCBj4bunYSDEkeG6p3UgdsOgbyAlZCB0cm9uZyB0aGnhur90IGLhu4sgJXMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5nIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorIkfhurdwIGzhu5dpIGtoaSBs4bqleSBjw6FjIGPDoGkgxJHhurd0IGPhu6dhIGLhu5kgY2jhu4luaCBj4buZbmcgaMaw4bufbmcgJWQgdHLDqm4gdGhp4bq/dCBi4buLIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkfhurdwIGzhu5dpIGtoaSB0cnV5IHbhuqVuIGNo4buJIHRpw6p1IHRyw6puIHRoaeG6v3QgYuG7iyDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIkfhurdwIGzhu5dpIGtoaSBs4bqleSBjw6FjIHRodeG7mWMgdMOtbmggY+G7p2EgYuG7mSDEkWnhu4F1IGtoaeG7g24gdHLDqm4gdGhp4bq/dCBi4buLIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICJLaMO0bmcgdGjhu4Mgbmjhuq1uIGRp4buHbiB0aGnhur90IGLhu4sg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIktow7RuZyBwaOG6o2kgbMOgIHRoaeG6v3QgYuG7iyDigJwlc+KAnS4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJLaMO0bmcgdGjhu4MgbeG7nyB0aGnhur90IGLhu4sg4oCcJXPigJ0gxJHhu4MgxJHhu41jIHbDoCBnaGkuIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAiVGhp4bq/dCBi4buLIOKAnCVz4oCdIGtow7RuZyBwaOG6o2kgbMOgIHRoaeG6v3QgYuG7iyBnaGkgaMOsbmgvdGnhur9uZy4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIlRoaeG6v3QgYuG7iyDigJwlc+KAnSBraMO0bmcgcGjhuqNpIGzDoCB0aGnhur90IGLhu4sgeHXhuqV0IHJhLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiVGhp4bq/dCBi4buLIOKAnCVz4oCdIGtow7RuZyBwaOG6o2kgbMOgIHRoaeG6v3QgYuG7iyBNMk0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICJLaMO0bmcgdGjhu4MgbmjDom4gYuG6o24gdGhp4bq/dCBi4buLIOKAnCVz4oCdIMSR4buDIMSR4buNYyB2w6AgZ2hpLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR+G6t3AgbOG7l2kga2hpIMSR4bq3dCBjaOG7iSB0acOqdSBjaG8gdGhp4bq/dCBi4buLIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKyJH4bq3cCBs4buXaSBraGkgbOG6pXkgdOG6p24gc+G7kSBoaeG7h24gdGjhu51pIGPhu6dhIHRoaeG6v3QgYuG7iyDEkWnhu4F1IGNo4buJbmggY+G7mW5nIGjGsOG7n25nIGNobyAiCisidGhp4bq/dCBi4buLIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IGN1cnJlbnQgdHVuZXIgZnJlcXVlbmN5IGZvciBkZXZpY2UgJyVzJyB0byAlbHUgSHouIgorbXNnc3RyICIiCisiR+G6t3AgbOG7l2kga2hpIMSR4bq3dCB04bqnbiBz4buRIGhp4buHbiB0aOG7nWkgY+G7p2EgdGhp4bq/dCBi4buLIMSRaeG7gXUgY2jhu4luaCBj4buZbmcgaMaw4bufbmcgY2hvICIKKyJ0aGnhur90IGLhu4sg4oCcJXPigJ0gbMOgICVsdSBIei4iCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzaWduYWwgc3RyZW5ndGggZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiR+G6t3AgbOG7l2kga2hpIGzhuqV5IGJpw6puIMSR4buZIHTDrW4gaGnhu4d1IGNobyB0aGnhur90IGLhu4sg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJH4bq3cCBs4buXaSBraGkgbOG6pXkgZ2nDoSB0cuG7iyBj4bunYSBi4buZIMSRaeG7gXUga2hp4buDbiAlZCB0csOqbiB0aGnhur90IGLhu4sg4oCcJXPigJ0uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICJH4bq3cCBs4buXaSBraGkgxJHhurd0IGdpw6EgdHLhu4sgJWQgY+G7p2EgYuG7mSDEkWnhu4F1IGtoaeG7g24gJWQgdHLDqm4gdGhp4bq/dCBi4buLIOKAnCVz4oCdLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAiIgorIkfhurdwIGzhu5dpIGtoaSBs4bqleSDEkeG6p3UgdsOgbyBoaeG7h24gdGjhu51pIHbDoG8gdGhp4bq/dCBi4buLIOKAnCVz4oCdLiBDw7MgdGjhu4MgbMOgIHRoaeG6v3QgYuG7iyB0aHUgIgorInRoYW5oLiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisiR+G6t3AgbOG7l2kga2hpIGzhuqV5IMSR4bqndSB2w6BvIGhp4buHbiBow6BuaCB0csOqbiB0aGnhur90IGLhu4sg4oCcJXPigJ0uIEPDsyB0aOG7gyBuw7MgbMOgIHRoaeG6v3QgYuG7iyAiCisidsO0IHR1eeG6v24uIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iCittc2dzdHIgIkfhurdwIGzhu5dpIGtoaSDEkeG6t3QgZOG7ryBsaeG7h3Ugbmjhuq1wICVkIHRyw6puIHRoaeG6v3QgYuG7iyAlcy4iCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICJDaMawYSBo4buXIHRy4bujIGto4bqjIG7Eg25nIHRoYXkgxJHhu5VpIMSR4buZIHBow6JuIGdp4bqjaSB0cm9uZyBraGkgY2jhuqF5LiIKKworbXNnaWQgIkNhbm5vdCBvcGVyYXRlIHdpdGhvdXQgYSBjbG9jayIKK21zZ3N0ciAiS2jDtG5nIHRo4buDIHRoYW8gdMOhYyBraGkga2jDtG5nIGPDsyDEkeG7k25nIGjhu5MiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIkzhu5dpIGx14buTbmcgZOG7ryBsaeG7h3UgbuG7mWkgYuG7mS4iCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICJM4buXaSBsdeG7k25nIGThu68gbGnhu4d1IG7hu5lpIGLhu5kuIgorCisjfiBtc2dpZCAiRGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBjYXB0dXJlIgorI34gbXNnc3RyICJUaGnhur90IGLhu4sg4oCcJXPigJ0ga2jDtG5nIGjhu5cgdHLhu6MgY2jhu6ljIG7Eg25nIHF1YXkgdmlkZW8iCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gc291bmQgc2VydmVyIgorI34gbXNnc3RyICJLaMO0bmcgdGjhu4MgdGhp4bq/dCBs4bqtcCBz4buxIGvhur90IG7hu5FpIHThu5tpIG3DoXkgcGjhu6VjIHbhu6Ugw6JtIHRoYW5oIgorCisjfiBtc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IHNvdW5kIHNlcnZlciBjYXBhYmlsaXRpZXMiCisjfiBtc2dzdHIgIkzhu5dpIHRydXkgduG6pW4ga2hhzIkgbsSDbmcgY+G7p2EgbcOheSBwaOG7pWMgduG7pSDDom0gdGhhbmgiCisKKyN+IG1zZ2lkICJCYXNzIgorI34gbXNnc3RyICJUcuG6p20iCisKKyN+IG1zZ2lkICJUcmVibGUiCisjfiBtc2dzdHIgIkNhbyIKKworI34gbXNnaWQgIlN5bnRoIgorI34gbXNnc3RyICJU4buVbmcgaOG7o3AiCisKKyN+IG1zZ2lkICJQQ00iCisjfiBtc2dzdHIgIlBDTSIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIkxvYSIKKworI34gbXNnaWQgIkxpbmUtaW4iCisjfiBtc2dzdHIgIkTDonktdsOgbyIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCIKKworI34gbXNnaWQgIk1peGVyIgorI34gbXNnc3RyICJUcuG7mW4iCisKKyN+IG1zZ2lkICJQQ00tMiIKKyN+IG1zZ3N0ciAiUENNLTIiCisKKyN+IG1zZ2lkICJSZWNvcmQiCisjfiBtc2dzdHIgIkdoaSIKKworI34gbXNnaWQgIkluLWdhaW4iCisjfiBtc2dzdHIgIlbDoG8tZ2lhIGzGsOG7o25nIgorCisjfiBtc2dpZCAiT3V0LWdhaW4iCisjfiBtc2dzdHIgIlJhLWdpYSBsxrDhu6NuZyIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAiRMOieS0xIgorCisjfiBtc2dpZCAiTGluZS0yIgorI34gbXNnc3RyICJEw6J5LTIiCisKKyN+IG1zZ2lkICJMaW5lLTMiCisjfiBtc2dzdHIgIkTDonktMyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAixJBv4bqhbiBiaeG6v24tMSIKKworI34gbXNnaWQgIkRpZ2l0YWwtMiIKKyN+IG1zZ3N0ciAixJBv4bqhbiBiaeG6v24tMiIKKworI34gbXNnaWQgIkRpZ2l0YWwtMyIKKyN+IG1zZ3N0ciAixJBv4bqhbiBiaeG6v24tMyIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICLEkGnhu4duIHRob+G6oWktdsOgbyIKKworI34gbXNnaWQgIlBob25lLW91dCIKKyN+IG1zZ3N0ciAixJBp4bqhbiB0aG/huqFpLXJhIgorCisjfiBtc2dpZCAiVmlkZW8iCisjfiBtc2dzdHIgIuG6om5oIMSR4buZbmciCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAiVGh1IHRoYW5oIgorCisjfiBtc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiIKKyN+IG1zZ3N0ciAiS2jDtG5nIHRo4buDIG3hu58gdGhp4bq/dCBi4buLIMOibSB0aGFuaCDEkeG7gyBxdeG6o24gbMO9IMSRaeG7gXUga2hp4buDbiBtw6F5IGjDsmEgdGnhur9uZy4iCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICJLaMO0bmcgdGjhu4MgbeG7nyB0aGnhur90IGLhu4sgw6JtIHRoYW5oIMSR4buDIHF14bqjbiBsw70gxJFp4buBdSBraGnhu4NuIG3DoXkgaMOyYSB0aeG6v25nLiBQaGnDqm4gIgorI34gImLhuqNuIEjhu4cgdGjhu5FuZyDDgm0gdGhhbmggTeG7nyBraMO0bmcgcGjhuqNpIMSRxrDhu6NjIHnhur91IHThu5EgbsOgeSBo4buXIHRy4bujLiIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAiQ2jhu6ciCisKKyN+IG1zZ2lkICJGcm9udCIKKyN+IG1zZ3N0ciAiVHLGsOG7m2MiCisKKyN+IG1zZ2lkICJSZWFyIgorI34gbXNnc3RyICJTYXUiCisKKyN+IG1zZ2lkICJIZWFkcGhvbmVzIgorI34gbXNnc3RyICJUYWkgbmdoZSIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAiVMOibSIKKworI34gbXNnaWQgIkxGRSIKKyN+IG1zZ3N0ciAiTEZFIgorCisjfiBtc2dpZCAiU3Vycm91bmQiCisjfiBtc2dzdHIgIlbDsm0iCisKKyN+IG1zZ2lkICJTaWRlIgorI34gbXNnc3RyICJCw6puIgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAiQVVYIFJhIgorCisjfiBtc2dpZCAiM0QgRGVwdGgiCisjfiBtc2dzdHIgIlPDonUgYmEgY2hp4buBdSIKKworI34gbXNnaWQgIjNEIENlbnRlciIKKyN+IG1zZ3N0ciAiVMOibSBiYSBjaGnhu4F1IgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAiVMSDbmcgY8aw4budbmcgYmEgY2hp4buBdSIKKworI34gbXNnaWQgIlRlbGVwaG9uZSIKKyN+IG1zZ3N0ciAixJBp4buHbiB0aG/huqFpIgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgIuG6om5oIMSR4buZbmcgVsOgbyIKKworI34gbXNnaWQgIkFVWCBJbiIKKyN+IG1zZ3N0ciAiQVVYIFbDoG8iCisKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAiR2hpIGzGsHUga2h14bq/Y2ggxJHhuqFpIgorCisjfiBtc2dpZCAiT3V0cHV0IEdhaW4iCisjfiBtc2dzdHIgIktodeG6v2NoIMSR4bqhaSBSYSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgQm9vc3QiCisjfiBtc2dzdHIgIlTEg25nIG3DoXkgdmkgw6JtIgorCisjfiBtc2dpZCAiRGlhZ25vc3RpYyIKKyN+IG1zZ3N0ciAiQ2jhuqluIMSRb8OhbiIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgIlTEg25nIHRy4bqnbSIKKworI34gbXNnaWQgIlBsYXliYWNrIFBvcnRzIgorI34gbXNnc3RyICJD4buVbmcgcGjDoXQgbOG6oWkiCisKKyN+IG1zZ2lkICJJbnB1dCIKKyN+IG1zZ3N0ciAiVsOgbyIKKworI34gbXNnaWQgIk1vbml0b3IgU291cmNlIgorI34gbXNnc3RyICJUaGVvIGTDtWkgbmd14buTbiIKKworI34gbXNnaWQgIktleWJvYXJkIEJlZXAiCisjfiBtc2dzdHIgIkLDrXAgYsOgbiBwaMOtbSIKKworI34gbXNnaWQgIlNpbXVsYXRlIFN0ZXJlbyIKKyN+IG1zZ3N0ciAiTcO0IHBo4buPbmcgw6JtIGzhuq1wIHRo4buDIgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICLDgm0gbOG6rXAgdGjhu4MiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAiw4JtIHRoYW5oIHbDsm0iCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIktodeG6v2NoIMSR4bqhaSBtw6F5IHZpIMOibSIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICJOZ3Xhu5NuIGxvYSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgU291cmNlIgorI34gbXNnc3RyICJOZ3Xhu5NuIG3DoXkgdmkgw6JtIgorCisjfiBtc2dpZCAiSmFjayIKKyN+IG1zZ3N0ciAi4buUIGPhuq9tIgorCisjfiBtc2dpZCAiQ2VudGVyIC8gTEZFIgorI34gbXNnc3RyICJUw6JtIC8gTEZFIgorCisjfiBtc2dpZCAiU3RlcmVvIE1peCIKKyN+IG1zZ3N0ciAiSOG7j2EgdGnhur9uZyDDom0gbOG6rXAgdGjhu4MiCisKKyN+IG1zZ2lkICJNb25vIE1peCIKKyN+IG1zZ3N0ciAiSMOyYSB0aeG6v25nIMSRxqFuIG5ndeG7k24iCisKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgIkjDsmEgdGnhur9uZyDEkeG6p3UgdsOgbyIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAiTcOheSB2aSDDom0gMSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAiTcOheSB2aSDDom0gMiIKKworI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICLEkGnhu4duIHPhu5EgUmEiCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICLEkGnhu4duIHPhu5EgVsOgbyIKKworI34gbXNnaWQgIkhETUkiCisjfiBtc2dzdHIgIkhETUkiCisKKyN+IG1zZ2lkICJNb2RlbSIKKyN+IG1zZ3N0ciAiQuG7mSDEkWnhu4F1IGdp4bqjaSIKKworI34gbXNnaWQgIkhhbmRzZXQiCisjfiBtc2dzdHIgIkPhuqdtIHRheSIKKworI34gbXNnaWQgIk90aGVyIgorI34gbXNnc3RyICJLaMOhYyIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgIktow7RuZyBjw7MiCisKKyN+IG1zZ2lkICJPbiIKKyN+IG1zZ3N0ciAiQuG6rXQiCisKKyN+IG1zZ2lkICJPZmYiCisjfiBtc2dzdHIgIlThuq90IgorCisjfiBtc2dpZCAiTXV0ZSIKKyN+IG1zZ3N0ciAiQ8OibSIKKworI34gbXNnaWQgIkZhc3QiCisjfiBtc2dzdHIgIk5oYW5oIgorCisjfiBtc2dpZCAiVmVyeSBMb3ciCisjfiBtc2dzdHIgIlLhuqV0IHRo4bqlcCIKKworI34gbXNnaWQgIkxvdyIKKyN+IG1zZ3N0ciAiVGjhuqVwIgorCisjfiBtc2dpZCAiTWVkaXVtIgorI34gbXNnc3RyICJW4burYSIKKworI34gbXNnaWQgIkhpZ2giCisjfiBtc2dzdHIgIkNhbyIKKworI34gbXNnaWQgIlZlcnkgSGlnaCIKKyN+IG1zZ3N0ciAiUuG6pXQgY2FvIgorCisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAiU+G6o24geHXhuqV0IgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTWljcm9waG9uZSIKKyN+IG1zZ3N0ciAiTeG6t3QgdHLGsOG7m2M6IE3DoXkgdmkgw6JtIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBJbiIKKyN+IG1zZ3N0ciAiTeG6t3QgdHLGsOG7m2M6IETDonkgVsOgbyIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIEhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIk3hurd0IHRyxrDhu5tjOiBUYWkgbmdoZSIKKworI34gbXNnaWQgIkZyb250IFBhbmVsIExpbmUgT3V0IgorI34gbXNnc3RyICJN4bq3dCB0csaw4bubYzogRMOieSBSYSIKKworI34gbXNnaWQgIkdyZWVuIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAixJDhuqd1IG7hu5FpIG3DoHUgbOG7pWMiCisKKyN+IG1zZ2lkICJQaW5rIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAixJDhuqd1IG7hu5FpIG3DoHUgaOG7k25nIgorCisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIsSQ4bqndSBu4buRaSBtw6B1IHhhbmgiCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIsSQ4bqndSBu4buRaSBtw6B1IHRy4bqvbmciCisKKyN+IG1zZ2lkICJCbGFjayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIsSQ4bqndSBu4buRaSBtw6B1IMSRZW4iCisKKyN+IG1zZ2lkICJHcmF5IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAixJDhuqd1IG7hu5FpIG3DoHUgeMOhbSIKKworI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIsSQ4bqndSBu4buRaSBtw6B1IGNhbSIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIsSQ4bqndSBu4buRaSBtw6B1IMSR4buPIgorCisjfiBtc2dpZCAiWWVsbG93IENvbm5lY3RvciIKKyN+IG1zZ3N0ciAixJDhuqd1IG7hu5FpIG3DoHUgdsOgbmciCisKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk3hurd0IHRyxrDhu5tjOiDEkeG6p3UgbuG7kWkgbcOgdSBs4bulYyIKKworI34gbXNnaWQgIlBpbmsgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJN4bq3dCB0csaw4bubYzogxJHhuqd1IG7hu5FpIG3DoHUgaOG7k25nIgorCisjfiBtc2dpZCAiQmx1ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk3hurd0IHRyxrDhu5tjOiDEkeG6p3UgbuG7kWkgbcOgdSB4YW5oIgorCisjfiBtc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJN4bq3dCB0csaw4bubYzogxJHhuqd1IG7hu5FpIG3DoHUgdHLhuq9uZyIKKworI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiTeG6t3QgdHLGsOG7m2M6IMSR4bqndSBu4buRaSBtw6B1IMSRZW4iCisKKyN+IG1zZ2lkICJHcmF5IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiTeG6t3QgdHLGsOG7m2M6IMSR4bqndSBu4buRaSBtw6B1IHjDoW0iCisKKyN+IG1zZ2lkICJPcmFuZ2UgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJN4bq3dCB0csaw4bubYzogxJHhuqd1IG7hu5FpIG3DoHUgY2FtIgorCisjfiBtc2dpZCAiUmVkIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiTeG6t3QgdHLGsOG7m2M6IMSR4bqndSBu4buRaSBtw6B1IMSR4buPIgorCisjfiBtc2dpZCAiWWVsbG93IEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAiTeG6t3QgdHLGsOG7m2M6IMSR4bqndSBu4buRaSBtw6B1IHbDoG5nIgorCisjfiBtc2dpZCAiU3ByZWFkIE91dHB1dCIKKyN+IG1zZ3N0ciAiTeG7nyBy4buZbmcga+G6v3QgeHXhuqV0IgorCisjfiBtc2dpZCAiRG93bm1peCIKKyN+IG1zZ3N0ciAiSOG6oSBow7JhIHRp4bq/bmciCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIElucHV0IgorI34gbXNnc3RyICJIw7JhIHRp4bq/bmcg4bqjbyA6IFbDoG8iCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKKyN+IG1zZ3N0ciAiSMOyYSB0aeG6v25nIOG6o28gOiBSYSIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgQ2hhbm5lbHMiCisjfiBtc2dzdHIgIkjDsmEgdGnhur9uZyDhuqNvIDogS8OqbmgiCisKKyN+IG1zZ2lkICIlcyAlZCBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiQ2jhu6ljIG7Eg25nICVzICVkIgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgIkNo4bupYyBuxINuZyAlcyIKKworI34gbXNnaWQgIkdvdCB1bmV4cGVjdGVkIGZyYW1lIHNpemUgb2YgJXUgaW5zdGVhZCBvZiAldS4iCisjfiBtc2dzdHIgIk5o4bqtbiDEkcaw4bujYyBrw61jaCBj4buhIGtodW5nIGLhuqV0IHRoxrDhu51uZyAldSwgdGhheSBjaG8gJXUuIgorCisjfiBtc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBvbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkfhurdwIGzhu5dpIGtoaSDEkeG7jWMgJWQgYnl0ZSB0csOqbiB0aGnhur90IGLhu4sg4oCcJXPigJ0uIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIktow7RuZyB0aOG7gyBwaOG7pSB0aMOqbSBjw6FjIGLhu5kgxJHhu4dtIHbDoG8gaMOgbmcgxJHhu6NpIHRyw6puIHRoaeG6v3QgYuG7iyDigJwlc+KAnS4iCisKKyN+IG1zZ2lkICJGYWlsZWQgdHJ5aW5nIHRvIGdldCB2aWRlbyBmcmFtZXMgZnJvbSBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIkzhu5dpIGtoaSB0aOG7rSBs4bqleSBjw6FjIGtodW5nIOG6o25oIMSR4buZbmcgdOG7qyB0aGnhur90IGLhu4sg4oCcJXPigJ0uIgorCisjfiBtc2dpZCAiRmFpbGVkIGFmdGVyICVkIHRyaWVzLiBkZXZpY2UgJXMuIHN5c3RlbSBlcnJvcjogJXMiCisjfiBtc2dzdHIgIkzhu5dpIHNhdSAlZCBs4bqnbiB0aOG7rS4gVGhp4bq/dCBi4buLICVzLiBM4buXaSBo4buHIHRo4buRbmc6ICVzIgpkaWZmIC0tZ2l0IGEvcG8vemhfQ04ucG8gYi9wby96aF9DTi5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTE4NTMyCi0tLSAvZGV2L251bGwKKysrIGIvcG8vemhfQ04ucG8KQEAgLTAsMCArMSw4MDQgQEAKKyMgQ2hpbmVzZSAoc2ltcGxpZmllZCkgdHJhbnNsYXRpb24gYWJvdXQgZ3N0LXBsdWdpbnMtZ29vZC4KKyMgVGhpcyBmaWxlIGlzIHB1dCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMgRnVuZGEgV2FuZyA8ZnVuZGF3YW5nQGxpbnV4Lm5ldC5jbj4sIDIwMDUuCisjIEppIFpoZW5nWXUgPHpoZW5neXVqaUBnbWFpbC5jb20+LCAyMDA4LCAyMDA5LgorIyB6d3B3and0eiA8endwd2p3dHpAMTI2LmNvbT4sIDIwMTUuCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kIDEuMTAuMFxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBodHRwOi8vYnVnemlsbGEuZ25vbWUub3JnL1xuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE3LTA1LTA0IDE1OjA1KzAzMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDE2LTExLTAyIDEzOjM5KzA4MDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IFRpYW56ZSBXYW5nIDx6d3B3and0ekAxMjYuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IENoaW5lc2UgKHNpbXBsaWZpZWQpIDxpMThuLXpoQGdvb2dsZWdyb3Vwcy5jb20+XG4iCisiTGFuZ3VhZ2U6IHpoX0NOXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiWC1CdWdzOiBSZXBvcnQgdHJhbnNsYXRpb24gZXJyb3JzIHRvIHRoZSBMYW5ndWFnZS1UZWFtIGFkZHJlc3MuXG4iCisiWC1HZW5lcmF0b3I6IFBvZWRpdCAxLjguOVxuIgorCittc2dpZCAiSmFjayBzZXJ2ZXIgbm90IGZvdW5kIgorbXNnc3RyICLmnKrmib7liLDmj5Llj6Porr7lpIciCisKK21zZ2lkICJGYWlsZWQgdG8gZGVjb2RlIEpQRUcgaW1hZ2UiCittc2dzdHIgIuino+eggSBKUEVHIOWbvuWDj+WHuumUmSIKKworIy4gVFJBTlNMQVRPUlM6ICdzb25nIHRpdGxlJyBieSAnYXJ0aXN0IG5hbWUnCisjLCBjLWZvcm1hdAorbXNnaWQgIiclcycgYnkgJyVzJyIKK21zZ3N0ciAi4oCcJTIkc+KAneeahOKAnCUxJHPigJ0iCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIuaXoOazlei/nuaOpeiHs+acjeWKoeWZqCIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICLmnKrorr7nva5VUkzjgIIiCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIuaXoOazleino+aekOacjeWKoeWZqOWQjeOAgiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICLml6Dms5Xlu7rnq4vkuI7pn7PpopHmnI3liqHlmajnmoTov57mjqUiCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICLlronlhajov57mjqXlpLHotKXjgIIiCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICLlj5HnlJ/kuobnvZHnu5zplJnor6/vvIzmiJbmnI3liqHlmajmhI/lpJblnLDlhbPpl63kuobov57mjqXjgIIiCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIuacjeWKoeWZqOWPkemAgeS6humUmeivr+eahOaVsOaNruOAgiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICLorr7lpIfkuI3mlK/mjIHlrprkvY3jgIIiCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIuayoeacieaIluaXoOaViOeahOi+k+WFpemfs+mike+8jEFWSSDmtYHlsIbmjZ/lnY/jgIIiCisKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgbm8gcGxheWFibGUgc3RyZWFtcy4iCittc2dzdHIgIuatpOaWh+S7tuS4jeWMheWQq+WPr+aSreaUvueahOa1geOAgiIKKworbXNnaWQgIlRoaXMgZmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcGxheWVkLiIKK21zZ3N0ciAi5q2k5paH5Lu25peg5pWI77yM5peg5rOV5pKt5pS+44CCIgorCittc2dpZCAiQ2Fubm90IHBsYXkgc3RyZWFtIGJlY2F1c2UgaXQgaXMgZW5jcnlwdGVkIHdpdGggUGxheVJlYWR5IERSTS4iCittc2dzdHIgIuaXoOazleaSreaUvua1ge+8jOWboOS4uuWug+W3suiiq1BsYXlSZWFkeSBEUk3liqDlr4bjgIIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIuatpOaWh+S7tuW3suaNn+Wdj++8jOaXoOazleaSreaUvuOAgiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAi5peg5pWI55qE5Y6f5a2Q5bC65a+444CCIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICLmraTmlofku7bkuI3lrozmlbTkuJTml6Dms5Xmkq3mlL7jgIIiCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIuatpOaWh+S7tuS4reeahOinhumikeWPr+iDveaXoOazleato+ehruaSreaUvuOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICLmraTmlofku7bljIXlkKvkuoblpKrlpJrnmoTmtYHjgILlj6rmkq3mlL7liY3pnaIgJWQg5LiqIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBpbnN0YWxsIGEgR1N0cmVhbWVyIFJUU1AgIgorImV4dGVuc2lvbiBwbHVnaW4gZm9yIFJlYWwgbWVkaWEgc3RyZWFtcy4iCittc2dzdHIgIiIKKyLmnKrmib7liLDmlK/mjIHnmoTmtYHlqpLkvZPjgILmgqjlj6/og73pnIDopoHlronoo4XkuIDkuKogR1N0cmVhbWVyIFJUU1Ag5omp5bGV5o+S5Lu25p2l5pKt5pS+IFJlYWwg5aqSIgorIuS9k+a1geOAgiIKKworbXNnaWQgIiIKKyJObyBzdXBwb3J0ZWQgc3RyZWFtIHdhcyBmb3VuZC4gWW91IG1pZ2h0IG5lZWQgdG8gYWxsb3cgbW9yZSB0cmFuc3BvcnQgIgorInByb3RvY29scyBvciBtYXkgb3RoZXJ3aXNlIGJlIG1pc3NpbmcgdGhlIHJpZ2h0IEdTdHJlYW1lciBSVFNQIGV4dGVuc2lvbiAiCisicGx1Z2luLiIKK21zZ3N0ciAiIgorIuacquaJvuWIsOaUr+aMgeeahOa1geWqkuS9k+OAguaCqOWPr+iDvemcgOimgeWQr+eUqOabtOWkmueahOS8oOmAgeWNj+iuru+8jOaIluiAheS5n+acieWPr+iDveaYr+e8uuWwkeato+ehrueahCAiCisiR1N0cmVhbWVyIFJUU1Ag5omp5bGV5o+S5Lu244CCIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIERldmljZSBpcyBiZWluZyB1c2VkIGJ5IGFub3RoZXIgIgorImFwcGxpY2F0aW9uLiIKK21zZ3N0ciAi5peg5rOV5omT5byA6Z+z6aKR6K6+5aSH5pKt5pS+6Z+z6aKR44CC6K6+5aSH5b2T5YmN55Sx5Y+m5LiA5Liq56iL5bqP5L2/55So44CCIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIuaXoOazleaJk+W8gOmfs+mikeiuvuWkh+aSreaUvumfs+mikeOAguaCqOaXoOadg+S9v+eUqOi/meS4gOiuvuWkh+OAgiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIgorbXNnc3RyICLml6Dms5XmiZPlvIDpn7PpopHorr7lpIfmkq3mlL7pn7PpopHjgIIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kICIKKyJTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGVsZW1lbnQuIgorbXNnc3RyICLml6Dms5XmiZPlvIDpn7PpopHorr7lpIfov5vooYzlm57mlL7jgILov5nkuIDniYjmnKznmoRPcGVuIFNvdW5kIFN5c3RlbeS4jeaUr+aMgeatpOe7hOS7tuOAgiIKKworbXNnaWQgIlBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLmraTpn7PpopHorr7lpIfkuI3mlK/mjIHlm57mlL7jgIIiCisKK21zZ2lkICJBdWRpbyBwbGF5YmFjayBlcnJvci4iCittc2dzdHIgIumfs+mikeWbnuaUvumUmeivr+OAgiIKKworbXNnaWQgIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAi5q2k6Z+z6aKR6K6+5aSH5LiN5pSv5oyB5b2V6Z+z44CCIgorCittc2dpZCAiRXJyb3IgcmVjb3JkaW5nIGZyb20gYXVkaW8gZGV2aWNlLiIKK21zZ3N0ciAi6Z+z6aKR6K6+5aSH5b2V6Z+z6ZSZ6K+v44CCIgorCittc2dpZCAiIgorIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gIgorInRoZSBkZXZpY2UuIgorbXNnc3RyICLml6Dms5XmiZPlvIDpn7PpopHorr7lpIflvZXpn7PjgILmgqjml6DmnYPkvb/nlKjov5nkuIDorr7lpIfjgIIiCisKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHJlY29yZGluZy4iCittc2dzdHIgIuaXoOazleaJk+W8gOmfs+mikeiuvuWkh+W9lemfs+OAgiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2Ugbm90IGZvdW5kIgorbXNnc3RyICLmnKrmib7liLAgQ29yZUF1ZGlvIOiuvuWkhyIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAi5peg5rOV5omT5byAIENvcmVBdWRpbyDorr7lpIciCisKK21zZ2lkICJSZWNvcmQgU291cmNlIgorbXNnc3RyICLlvZXpn7PmupAiCisKK21zZ2lkICJNaWNyb3Bob25lIgorbXNnc3RyICLor53nrZIiCisKK21zZ2lkICJMaW5lIEluIgorbXNnc3RyICLnur/ot6/ovpPlhaUiCisKK21zZ2lkICJJbnRlcm5hbCBDRCIKK21zZ3N0ciAi5YaF6YOoIENEIgorCittc2dpZCAiU1BESUYgSW4iCittc2dzdHIgIlNQRElG6L6T5YWlIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIui+heWKqei+k+WFpSAxIgorCittc2dpZCAiQVVYIDIgSW4iCittc2dzdHIgIui+heWKqei+k+WHuiAyIgorCittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIue8lueggeWZqOWbnueOryIKKworbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiU3VuVlRT5Zue546vIgorCittc2dpZCAiVm9sdW1lIgorbXNnc3RyICLpn7Pph48iCisKK21zZ2lkICJHYWluIgorbXNnc3RyICLlop7nm4oiCisKK21zZ2lkICJNb25pdG9yIgorbXNnc3RyICLnm5HmjqflmagiCisKK21zZ2lkICJCdWlsdC1pbiBTcGVha2VyIgorbXNnc3RyICLlhoXlu7rmiazlo7DlmagiCisKK21zZ2lkICJIZWFkcGhvbmUiCittc2dzdHIgIuWktOaItOW8j+iAs+acuiIKKworbXNnaWQgIkxpbmUgT3V0IgorbXNnc3RyICLnur/ot6/ovpPlh7oiCisKK21zZ2lkICJTUERJRiBPdXQiCittc2dzdHIgIlNQRElG6L6T5Ye6IgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICLovoXliqnovpPlh7ogMSIKKworbXNnaWQgIkFVWCAyIE91dCIKK21zZ3N0ciAi6L6F5Yqp6L6T5Ye6IDIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcmVhZGluZyAlZCBieXRlcyBmcm9tIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi5LuO6K6+5aSH4oCcJTIkc+KAneS4reivu+WPliAlMSRkIOS4quWtl+iKguaXtuWHuumUmeOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZW51bWVyYXRlIHBvc3NpYmxlIHZpZGVvIGZvcm1hdHMgZGV2aWNlICclcycgY2FuIHdvcmsgd2l0aCIKK21zZ3N0ciAi5p6a5Li+6K6+5aSH4oCcJXPigJ3lj6/og73mlK/mjIHnmoTop4bpopHmoLzlvI/ml7blh7rplJkiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG1hcCBidWZmZXJzIGZyb20gZGV2aWNlICclcyciCittc2dzdHIgIuaXoOazleS7juiuvuWkh+KAnCVz4oCd5Lit5pig5bCE5Ye657yT5Yay5Yy6IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICLorr7lpIfigJwlc+KAneeahOmpseWKqOS4jeaUr+aMgUkvT+aWueW8jyAlZOOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPIG1ldGhvZC4iCittc2dzdHIgIuiuvuWkh+KAnCVz4oCd55qE6amx5Yqo5LiN5pSv5oyB5Lu75L2V5bey55+l55qESS9P5pa55byP44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIGJ1c3kiCittc2dzdHIgIuiuvuWkh+KAnCVz4oCd5q2j5b+ZIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICLorr7lpIfigJwlc+KAneS4jeiDveWcqCAlZHglZCDlpITmjZXojrciCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIuiuvuWkh+KAnCVz4oCd5peg5rOV5Lul5oyH5a6a5qC85byP5o2V6I63IgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgc3VwcG9ydCBub24tY29udGlndW91cyBwbGFuZXMiCittc2dzdHIgIuiuvuWkh+KAnCVz4oCd5LiN5pSv5oyB6Z2e6L+e57ut5bmz6Z2iIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVycyBvbiBkZXZpY2UgJyVzJyIKK21zZ3N0ciAi5peg5rOV6I635Y+W6K6+5aSH4oCcJXPigJ3nmoTlj4LmlbAiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIuinhumikeiuvuWkh+S4jeaOpeWPl+aWsOeahOW4p+eOh+iuvue9ruOAgiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIuinhumikeiuvuWkh+acquaPkOS+m+i+k+WHuuagvOW8j+OAgiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICLop4bpopHorr7lpIfov5Tlm57kuobml6DmlYjnmoTnu7TluqbjgIIiCisKKyMsIGZ1enp5Cittc2dpZCAiVmlkZW8gZGV2aWNlIHVzZXMgYW4gdW5zdXBwb3J0ZWQgaW50ZXJsYWNpbmcgbWV0aG9kLiIKK21zZ3N0ciAi6KeG6aKR6K6+5aSH5L2/55So5LqG5LiN5pSv5oyB55qE6ZqU6KGM5omr5o+P5pa55byP44CCIgorCisjLCBmdXp6eQorbXNnaWQgIlZpZGVvIGRldmljZSB1c2VzIGFuIHVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC4iCittc2dzdHIgIuinhumikeiuvuWkh+S9v+eUqOS6huS4jeaUr+aMgeeahOWDj+e0oOagvOW8j+OAgiIKKworbXNnaWQgIkZhaWxlZCB0byBjb25maWd1cmUgaW50ZXJuYWwgYnVmZmVyIHBvb2wuIgorbXNnc3RyICLml6Dms5XphY3nva7lhoXpg6jnvJPlhrLmsaDjgIIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iCittc2dzdHIgIuinhumikeiuvuWkh+acquaPkOS+m+S7u+S9lee8k+WGsuWkp+Wwj+OAgiIKKworbXNnaWQgIk5vIGRvd25zdHJlYW0gcG9vbCB0byBpbXBvcnQgZnJvbS4iCittc2dzdHIgIuayoeacieWPr+S7peeUqOS6juWvvOWFpeeahOS4i+a4uOaxoOOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNldHRpbmdzIG9mIHR1bmVyICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi6I635Y+W6K6+5aSH4oCcJTIkc+KAneS4iuW+ruiwg+mSruKAnCUxJGTigJ3nmoTorr7nva7ml7blh7rplJnjgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi6I635Y+W6K6+5aSH4oCcJXPigJ3mnInlhbPkv6Hmga/ml7blh7rplJnjgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICLorr7lpIfigJwlc+KAneS4jeaYr+W+ruiwg+mSruOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiCittc2dzdHIgIuiuvue9ruiuvuWkh+KAnCVz4oCd5LiK55qE5bm/5pKt6L6T5Ye65pe25Ye66ZSZ44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgaW5wdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAi6K6+572u6K6+5aSHICUyJHMg5LiK55qE6L6T5YWlICUxJGQg5pe25Ye66ZSZ44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBjaGFuZ2UgbXV0ZSBzdGF0ZSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLmlLnlj5jorr7lpIfigJwlc+KAneeahOmdmemfs+eKtuaAgeaXtuWHuumUmeOAgiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAi5YiG6YWN6K+35rGC55qE5YaF5a2Y5aSx6LSl44CCIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIuWIhumFjeivt+axgueahOWGheWtmOWksei0peOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICLorr7lpIcgJXMg5LiK55qE6L2s5o2i5Zmo5rKh5pyJ5pSv5oyB55qE6L6T5YWl5qC85byPIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvbnZlcnRlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0IgorbXNnc3RyICLorr7lpIcgJXMg5LiK55qE6L2s5o2i5Zmo5rKh5pyJ5pSv5oyB55qE6L6T5Ye65qC85byPIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICLorr7lpIcgJXMg5LiK55qE57yW56CB5Zmo5rKh5pyJ5pSv5oyB55qE6L6T5YWl5qC85byPIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAi6K6+5aSHICVzIOS4iueahOe8lueggeWZqOayoeacieaUr+aMgeeahOi+k+WHuuagvOW8jyIKKworbXNnaWQgIkZhaWxlZCB0byBzdGFydCBkZWNvZGluZyB0aHJlYWQuIgorbXNnc3RyICLlkK/liqjop6PnoIHnur/nqIvlpLHotKXjgIIiCisKK21zZ2lkICJGYWlsZWQgdG8gcHJvY2VzcyBmcmFtZS4iCittc2dzdHIgIuWkhOeQhuW4p+Wksei0peOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiBJdCBpc24ndCBhIHY0bDIgZHJpdmVyLiBDaGVjayBpZiAiCisiaXQgaXMgYSB2NGwxIGRyaXZlci4iCittc2dzdHIgIuiOt+WPluiuvuWkh+KAnCVz4oCd55qE5L+h5oGv5pe25Ye66ZSZOuWug+S4jeaYr+S4gOS4qiB2NGwyIOmpseWKqOWZqO+8jOivt+ajgOafpeaYr+WQpuS4uiB2NGwx44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAi5p+l5a+76K6+5aSHICUyJHMg5Lit55qE6L6T5YWlICUxJGQg55qE5bGe5oCn5pe25Ye66ZSZIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIuiOt+WPluiuvuWkhyAlMiRzIOS4iueahOW+ruiwg+mSriAlMSRkIOeahOiuvue9ruaXtuWHuumUmSIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIuiOt+WPluiuvuWkh+KAnCVz4oCd55qE5Z+65YeG5pe25Ye66ZSZ44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcycuIgorbXNnc3RyICLojrflj5borr7lpIfigJwlc+KAneS4iueahOaOp+WItuWxnuaAp+aXtuWHuumUmeOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgaWRlbnRpZnkgZGV2aWNlICclcycuIgorbXNnc3RyICLml6Dms5Xnoa7orqTorr7lpIfigJwlc+KAneOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICLkuI3mmK/orr7lpIfigJwlc+KAneOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgJyVzJyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iCittc2dzdHIgIuaXoOazleaJk+W8gOiuvuWkh+KAnCVz4oCd6K+75YaZ44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIGNhcHR1cmUgZGV2aWNlLiIKK21zZ3N0ciAi4oCcJXPigJ3kuI3mmK/kuIDkuKrmjZXojrforr7lpIfjgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIuKAnCVz4oCd5LiN5piv6L6T5Ye66K6+5aSH44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGlzIG5vdCBhIE0yTSBkZXZpY2UuIgorbXNnc3RyICLorr7lpIfigJwlc+KAneS4jeaYr00yTeiuvuWkh+OAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAi5peg5rOV5aSN5Yi26K6+5aSH4oCcJXPigJ3mnaXor7vlj5blkozlhpnlhaXjgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBub3JtIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIuiuvue9ruiuvuWkh+KAnCVz4oCd55qE5Z+65YeG5pe25Ye66ZSZ44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi6I635Y+W6K6+5aSH4oCcJXPigJ3nmoTlvZPliY3lvq7osIPpkq7popHnjofml7blh7rplJnjgIIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAi6K6+572u6K6+5aSH4oCcJXPigJ3nmoTlvZPliY3lvq7osIPpkq7popHnjofkuLogJWx1IEh6IOaXtuWHuumUmeOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHNpZ25hbCBzdHJlbmd0aCBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICLojrflj5borr7lpIfigJwlc+KAneeahOS/oeWPt+mVv+W6puaXtuWHuumUmeOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi6I635Y+W6K6+5aSH4oCcJTIkc+KAneeahOaOp+WItuWZqCAlMSRkIOeahOWAvOWHuumUmeOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gc2V0IHZhbHVlICVkIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAi6K6+572u6K6+5aSH4oCcJTMkc+KAneeahOaOp+WItuWZqCAlMiRkIOeahOWAvOS4uiAlMSRkIOaXtuWHuumUmeOAgiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgaW5wdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAi6I635Y+W6K6+5aSH4oCcJXPigJ3kuIrnmoTlvZPliY3ovpPlhaXlh7rplJnjgILkuZ/orrjlroPmmK/kuIDkuKrlub/mkq3orr7lpIciCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZhaWxlZCB0byBnZXQgY3VycmVudCBvdXRwdXQgb24gZGV2aWNlICclcycuIE1heSBiZSBpdCBpcyBhIHJhZGlvIGRldmljZSIKK21zZ3N0ciAi6I635Y+W6K6+5aSH4oCcJXPigJ3kuIrnmoTlvZPliY3ovpPlhaXlh7rplJnjgILlroPlj6/og73mmK/kuIDkuKrlub/mkq3orr7lpIciCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAi5bCG6L6T5Ye6ICVkIOiuvue9ruWIsOiuvuWkhyAlcyDkuIrlpLHotKXjgIIiCisKK21zZ2lkICJDaGFuZ2luZyByZXNvbHV0aW9uIGF0IHJ1bnRpbWUgaXMgbm90IHlldCBzdXBwb3J0ZWQuIgorbXNnc3RyICLlsJrkuI3mlK/mjIHlnKjov5DooYzml7bmm7TmlLnliIbovqjnjofjgIIiCisKK21zZ2lkICJDYW5ub3Qgb3BlcmF0ZSB3aXRob3V0IGEgY2xvY2siCittc2dzdHIgIuayoeacieaXtumSn+eahOivneaXoOazleaTjeS9nCIKKworI34gbXNnaWQgIkludGVybmFsIGRhdGEgc3RyZWFtIGVycm9yLiIKKyN+IG1zZ3N0ciAi5YaF6YOo5pWw5o2u5rWB6ZSZ6K+v44CCIgorCisjfiBtc2dpZCAiSW50ZXJuYWwgZGF0YSBmbG93IGVycm9yLiIKKyN+IG1zZ3N0ciAi5YaF6YOo5pWw5o2u5rWB6ZSZ6K+v44CCIgorCisjfiBtc2dpZCAiRmFpbGVkIHRvIHF1ZXJ5IHNvdW5kIHNlcnZlciBjYXBhYmlsaXRpZXMiCisjfiBtc2dzdHIgIuafpeWvu+mfs+mikeacjeWKoeWZqOeahOacjeWKoeWksei0pSIKKworI34gbXNnaWQgIkJhc3MiCisjfiBtc2dzdHIgIuS9jumfsyhCYXNzKSIKKworI34gbXNnaWQgIlRyZWJsZSIKKyN+IG1zZ3N0ciAi6auY6Z+zKFRyZWJsZSkiCisKKyN+IG1zZ2lkICJTeW50aCIKKyN+IG1zZ3N0ciAi5ZCI5oiQ5ZmoIgorCisjfiBtc2dpZCAiUENNIgorI34gbXNnc3RyICLms6LlvaIoUENNKSIKKworI34gbXNnaWQgIlNwZWFrZXIiCisjfiBtc2dzdHIgIuaJrOWjsOWZqCIKKworI34gbXNnaWQgIkNEIgorI34gbXNnc3RyICJDRCDpn7PpopEiCisKKyN+IG1zZ2lkICJNaXhlciIKKyN+IG1zZ3N0ciAi5re36Z+z5ZmoIgorCisjfiBtc2dpZCAiUENNLTIiCisjfiBtc2dzdHIgIlBDTS0yIgorCisjfiBtc2dpZCAiSW4tZ2FpbiIKKyN+IG1zZ3N0ciAi6L6T5YWl5aKe55uKIgorCisjfiBtc2dpZCAiT3V0LWdhaW4iCisjfiBtc2dzdHIgIui+k+WHuuWinuebiiIKKworI34gbXNnaWQgIkxpbmUtMSIKKyN+IG1zZ3N0ciAi57q/6LevMSIKKworI34gbXNnaWQgIkxpbmUtMiIKKyN+IG1zZ3N0ciAi57q/6LevMiIKKworI34gbXNnaWQgIkxpbmUtMyIKKyN+IG1zZ3N0ciAi57q/6LevMyIKKworI34gbXNnaWQgIkRpZ2l0YWwtMSIKKyN+IG1zZ3N0ciAi5pWw5a2X57q/6LevMSIKKworI34gbXNnaWQgIkRpZ2l0YWwtMiIKKyN+IG1zZ3N0ciAi5pWw5a2X57q/6LevMiIKKworI34gbXNnaWQgIkRpZ2l0YWwtMyIKKyN+IG1zZ3N0ciAi5pWw5a2X57q/6LevMyIKKworI34gbXNnaWQgIlBob25lLWluIgorI34gbXNnc3RyICLor53nrZLovpPlhaUiCisKKyN+IG1zZ2lkICJQaG9uZS1vdXQiCisjfiBtc2dzdHIgIuivneetkui+k+WHuiIKKworI34gbXNnaWQgIlZpZGVvIgorI34gbXNnc3RyICLop4bpopEiCisKKyN+IG1zZ2lkICJSYWRpbyIKKyN+IG1zZ3N0ciAi5bm/5pKtIgorCisjfiBtc2dpZCAiR290IHVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSBvZiAldSBpbnN0ZWFkIG9mICV1LiIKKyN+IG1zZ3N0ciAi5Y+W5b6X5LqGICV1IOeahOS4jemcgOimgeeahOW4p+Wkp+Wwj++8jOiAjOS4jeaYryAldeOAgiIKKworI34gbXNnaWQgIkVycm9yIHJlYWRpbmcgJWQgYnl0ZXMgb24gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLor7vlj5borr7lpIfigJglMiRz4oCZ5Lit55qEICUxJGQg5a2X6IqC5pe25Ye66ZSZ44CCIgorCisjfiBtc2dpZCAiQ291bGQgbm90IGVucXVldWUgYnVmZmVycyBpbiBkZXZpY2UgJyVzJy4iCisjfiBtc2dzdHIgIuaXoOazleWvueiuvuWkh+KAmCVz4oCZ5Lit55qE57yT5Yay5Yy66L+b6KGM5o6S5bqP44CCIgorCisjfiBtc2dpZCAiRmFpbGVkIHRyeWluZyB0byBnZXQgdmlkZW8gZnJhbWVzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLku47orr7lpIfigJglc+KAmeS4iuiOt+WPluinhumikeeahOWwneivleWksei0peS6huOAgiIKKworI34gbXNnaWQgIkZhaWxlZCBhZnRlciAlZCB0cmllcy4gZGV2aWNlICVzLiBzeXN0ZW0gZXJyb3I6ICVzIgorI34gbXNnc3RyICLlnKggJWQg5qyh5bCd6K+V5ZCO5aSx6LSl44CC6K6+5aSHICVz44CC57O757uf6ZSZ6K+vOiAlcyIKKworI34gbXNnaWQgIiIKKyN+ICJUaGUgYnVmZmVyIHR5cGUgaXMgbm90IHN1cHBvcnRlZCwgb3IgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMsIG9yIG5vICIKKyN+ICJidWZmZXJzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgeWV0LCBvciB0aGUgdXNlcnB0ciBvciBsZW5ndGggYXJlIGludmFsaWQuICIKKyN+ICJkZXZpY2UgJXMiCisjfiBtc2dzdHIgIiIKKyN+ICLkuI3mlK/mjIHnmoTnvJPlhrLljLrnsbvlnovvvIzmiJbogIXntKLlvJXotoXlh7rojIPlm7TkuobvvIzmiJbmmK/ov5jmnKrliIbphY3nvJPlhrLljLrvvIzmiJbpnZ7ms5XnmoTnlKjmiLfmjIciCisjfiAi6ZKI5oiW6ZW/5bqm44CC6K6+5aSHICVzIgorCisjfiBtc2dpZCAiIgorI34gIkZhaWxlZCB0cnlpbmcgdG8gZ2V0IHZpZGVvIGZyYW1lcyBmcm9tIGRldmljZSAnJXMnLiBOb3QgZW5vdWdoIG1lbW9yeS4iCisjfiBtc2dzdHIgIuS7juiuvuWkh+KAmCVz4oCZ5LiK6I635Y+W6KeG6aKR55qE5bCd6K+V5aSx6LSl5LqG44CC5rKh5pyJ6Laz5aSf55qE5YaF5a2Y44CCIgorCisjfiBtc2dpZCAiaW5zdWZmaWNpZW50IG1lbW9yeSB0byBlbnF1ZXVlIGEgdXNlciBwb2ludGVyIGJ1ZmZlci4gZGV2aWNlICVzLiIKKyN+IG1zZ3N0ciAi5YaF5a2Y5LiN6Laz5peg5rOV5a+555So5oi35oyH6ZKI57yT5Yay5Yy66L+b6KGM5o6S5bqP44CC6K6+5aSHICVz44CCIgorCisjfiBtc2dpZCAiTm8gZnJlZSBidWZmZXJzIGZvdW5kIGluIHRoZSBwb29sIGF0IGluZGV4ICVkLiIKKyN+IG1zZ3N0ciAi5Zyo5YaF5a2Y5rGg5LitICVkIOWkhOayoeacieWPr+WIhumFjeeahOe8k+WGsuWMuuOAgiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBnZXQgYnVmZmVycyBmcm9tIGRldmljZSAnJXMnLiIKKyN+IG1zZ3N0ciAi5peg5rOV5LuO6K6+5aSH4oCYJXPigJnkuK3ojrflj5bnvJPlhrLljLrjgIIiCisKKyN+IG1zZ2lkICJDb3VsZCBub3QgZ2V0IGVub3VnaCBidWZmZXJzIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLml6Dms5Xku47orr7lpIfigJglc+KAmeS4reiOt+WPlui2s+Wkn+eahOe8k+WGsuWMuuOAgiIKKworI34gbXNnaWQgIkVycm9yIHN0YXJ0aW5nIHN0cmVhbWluZyBjYXB0dXJlIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLku47orr7lpIfigJglc+KAmeS4reWQr+eUqOa1geaNleiOt+aXtuWHuumUmeOAgiIKKworI34gbXNnaWQgIkVycm9yIHN0b3BwaW5nIHN0cmVhbWluZyBjYXB0dXJlIGZyb20gZGV2aWNlICclcycuIgorI34gbXNnc3RyICLku47orr7lpIfigJglc+KAmeS4reWBnOatoua1geaNleiOt+aXtuWHuumUmeOAgiIKKworI34gbXNnaWQgIkZhaWxlZCBnZXR0aW5nIGNvbnRyb2xzIGF0dHJpYnV0ZXMgb24gZGV2aWNlICclcy4nIgorI34gbXNnc3RyICLojrflj5borr7lpIfigJglc+KAmeS4iueahOaOp+WItuWxnuaAp+aXtuWHuumUmeOAgiIKKworI34gbXNnaWQgIkNvdWxkIG5vdCByZWFkIGZyb20gQ0QuIgorI34gbXNnc3RyICLml6Dms5Xku44gQ0Qg5Lit6K+75Y+W44CCIgorCisjfiBtc2dpZCAiRGlzYyBpcyBub3QgYW4gQXVkaW8gQ0QuIgorI34gbXNnc3RyICLpnZ7pn7PpopEgQ0Qg55uY44CCIgorCisjfiBtc2dpZCAiVGhpcyBmaWxlIGlzIGVuY3J5cHRlZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCisjfiBtc2dzdHIgIuatpOaWh+S7tuW3suWKoOWvhu+8jOaXoOazleaSreaUvuOAgiIKKworI34gbXNnaWQgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gY2FwdHVyZSIKKyN+IG1zZ3N0ciAi6K6+5aSH4oCcJXPigJ3kuI3mlK/mjIHop4bpopHmjZXmjYkiCisKKyN+IG1zZ2lkICJMaW5lLWluIgorI34gbXNnc3RyICLnur/ot6/ovpPlhaUiCisKKyN+IG1zZ2lkICJSZWNvcmQiCisjfiBtc2dzdHIgIuW9lemfsyIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzb3VuZCBzZXJ2ZXIiCisjfiBtc2dzdHIgIuaXoOazleW7uueri+S4jumfs+mikeacjeWKoeWZqOeahOi/nuaOpSIKKworI34gbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgbWl4ZXIgY29udHJvbCBoYW5kbGluZy4iCisjfiBtc2dzdHIgIuaXoOazleaJk+W8gOmfs+mikeiuvuWkh+adpei/m+ihjOa3t+mfs+WZqOaOp+WItuOAgiIKKworI34gbXNnaWQgIiIKKyN+ICJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIG1peGVyIGNvbnRyb2wgaGFuZGxpbmcuIFRoaXMgdmVyc2lvbiBvZiAiCisjfiAidGhlIE9wZW4gU291bmQgU3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBlbGVtZW50LiIKKyN+IG1zZ3N0ciAiIgorI34gIuaXoOazleaJk+W8gOmfs+mikeiuvuWkh+adpei/m+ihjOa3t+mfs+WZqOaOp+WItuOAgui/meS4gOeJiOacrOeahE9wZW4gU291bmQgU3lzdGVt5LiN5pSv5oyB5q2k57uEIgorI34gIuS7tuOAgiIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAi5Li7IgorCisjfiBtc2dpZCAiRnJvbnQiCisjfiBtc2dzdHIgIuWJjSIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIuWQjiIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIuWktOaItOW8j+iAs+acuiIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAi5LitIgorCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICLph43kvY7pn7MiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAi546v57uVIgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAi5L6nIgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAi6L6F5Yqp6L6T5Ye6IgorCisjfiBtc2dpZCAiM0QgRGVwdGgiCisjfiBtc2dzdHIgIjNEIOa3seW6piIKKworI34gbXNnaWQgIjNEIENlbnRlciIKKyN+IG1zZ3N0ciAiM0Qg5Lit5aSuIgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAiM0Qg5aKe5by6IgorCisjfiBtc2dpZCAiVGVsZXBob25lIgorI34gbXNnc3RyICLnlLXor50iCisKKyN+IG1zZ2lkICJWaWRlbyBJbiIKKyN+IG1zZ3N0ciAi6KeG6aKR6L6T5YWlIgorCisjfiBtc2dpZCAiQVVYIEluIgorI34gbXNnc3RyICLovoXliqnovpPlh7oiCisKKyN+IG1zZ2lkICJSZWNvcmQgR2FpbiIKKyN+IG1zZ3N0ciAi5b2V6Z+z5aKe55uKIgorCisjfiBtc2dpZCAiT3V0cHV0IEdhaW4iCisjfiBtc2dzdHIgIui+k+WHuuWinuebiiIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgQm9vc3QiCisjfiBtc2dzdHIgIum6puWFi+mjjuWinuW8uiIKKworI34gbXNnaWQgIkRpYWdub3N0aWMiCisjfiBtc2dzdHIgIuiviuaWrSIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgIui0neWPuOWinuW8uiIKKworI34gbXNnaWQgIlBsYXliYWNrIFBvcnRzIgorI34gbXNnc3RyICLlm57mlL7nq6/lj6MiCisKKyN+IG1zZ2lkICJJbnB1dCIKKyN+IG1zZ3N0ciAi6L6T5YWlIgorCisjfiBtc2dpZCAiTW9uaXRvciBTb3VyY2UiCisjfiBtc2dzdHIgIuebkeaOp+a6kCIKKworI34gbXNnaWQgIktleWJvYXJkIEJlZXAiCisjfiBtc2dzdHIgIumUruebmOicgum4oyIKKworI34gbXNnaWQgIlNpbXVsYXRlIFN0ZXJlbyIKKyN+IG1zZ3N0ciAi5qih5ouf56uL5L2T5aOwIgorCisjfiBtc2dpZCAiU3RlcmVvIgorI34gbXNnc3RyICLnq4vkvZPlo7AiCisKKyN+IG1zZ2lkICJTdXJyb3VuZCBTb3VuZCIKKyN+IG1zZ3N0ciAi546v57uV5aOwIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBHYWluIgorI34gbXNnc3RyICLor53nrZLlop7nm4oiCisKKyN+IG1zZ2lkICJTcGVha2VyIFNvdXJjZSIKKyN+IG1zZ3N0ciAi5oms5aOw5Zmo5rqQIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBTb3VyY2UiCisjfiBtc2dzdHIgIuivneetkua6kCIKKworI34gbXNnaWQgIkphY2siCisjfiBtc2dzdHIgIuaPkuWPoyIKKworI34gbXNnaWQgIkNlbnRlciAvIExGRSIKKyN+IG1zZ3N0ciAi5LitL+mHjeS9jumfsyIKKworI34gbXNnaWQgIlN0ZXJlbyBNaXgiCisjfiBtc2dzdHIgIueri+S9k+WjsOa3t+mfsyIKKworI34gbXNnaWQgIk1vbm8gTWl4IgorI34gbXNnc3RyICLljZXlo7DpgZPmt7fpn7MiCisKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgIui+k+WFpea3t+mfsyIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMSIKKyN+IG1zZ3N0ciAi6K+d562SMSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAi6K+d562SMiIKKworI34gbXNnaWQgIkRpZ2l0YWwgT3V0IgorI34gbXNnc3RyICLmlbDlrZfovpPlh7oiCisKKyN+IG1zZ2lkICJEaWdpdGFsIEluIgorI34gbXNnc3RyICLmlbDlrZfovpPlhaUiCisKKyN+IG1zZ2lkICJIRE1JIgorI34gbXNnc3RyICJIRE1JIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk1vZGVtIgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAiSGFuZHNldCIKKworI34gbXNnaWQgIk90aGVyIgorI34gbXNnc3RyICLlhbbku5YiCisKKyN+IG1zZ2lkICJOb25lIgorI34gbXNnc3RyICLml6AiCisKKyN+IG1zZ2lkICJPbiIKKyN+IG1zZ3N0ciAi5byAIgorCisjfiBtc2dpZCAiT2ZmIgorI34gbXNnc3RyICLlhbMiCisKKyN+IG1zZ2lkICJNdXRlIgorI34gbXNnc3RyICLpnZnpn7MiCisKKyN+IG1zZ2lkICJGYXN0IgorI34gbXNnc3RyICLlv6siCisKKyN+IG1zZ2lkICJWZXJ5IExvdyIKKyN+IG1zZ3N0ciAi6Z2e5bi45L2OIgorCisjfiBtc2dpZCAiTG93IgorI34gbXNnc3RyICLkvY4iCisKKyN+IG1zZ2lkICJNZWRpdW0iCisjfiBtc2dzdHIgIuS4rSIKKworI34gbXNnaWQgIkhpZ2giCisjfiBtc2dzdHIgIumrmCIKKworI34gbXNnaWQgIlZlcnkgSGlnaCIKKyN+IG1zZ3N0ciAi6Z2e5bi46auYIgorCisjfiBtc2dpZCAiUHJvZHVjdGlvbiIKKyN+IG1zZ3N0ciAi5Lqn5ZOBIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTWljcm9waG9uZSIKKyN+IG1zZ3N0ciAi5YmN6Z2i5p2/6K+d562SIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBJbiIKKyN+IG1zZ3N0ciAi5YmN6Z2i5p2/57q/6Lev6L6T5YWlIgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgSGVhZHBob25lcyIKKyN+IG1zZ3N0ciAi5YmN6Z2i5p2/5aS05oi05byP6ICz5py6IgorCisjfiBtc2dpZCAiRnJvbnQgUGFuZWwgTGluZSBPdXQiCisjfiBtc2dzdHIgIuWJjemdouadv+e6v+i3r+i+k+WHuiIKKworI34gbXNnaWQgIkdyZWVuIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi57u/6Imy5o+S5Y+jIgorCisjfiBtc2dpZCAiUGluayBDb25uZWN0b3IiCisjfiBtc2dzdHIgIueyieiJsuaPkuWPoyIKKworI34gbXNnaWQgIkJsdWUgQ29ubmVjdG9yIgorI34gbXNnc3RyICLok53oibLmj5Llj6MiCisKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIueZveiJsuaPkuWPoyIKKworI34gbXNnaWQgIkJsYWNrIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi6buR6Imy5o+S5Y+jIgorCisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIueBsOiJsuaPkuWPoyIKKworI34gbXNnaWQgIk9yYW5nZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuapmeiJsuaPkuWPoyIKKworI34gbXNnaWQgIlJlZCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIue6ouiJsuaPkuWPoyIKKworI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgIum7hOiJsuaPkuWPoyIKKworI34gbXNnaWQgIkdyZWVuIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5YmN6Z2i5p2/57u/6Imy5o+S5Y+jIgorCisjfiBtc2dpZCAiUGluayBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuWJjemdouadv+eyieiJsuaPkuWPoyIKKworI34gbXNnaWQgIkJsdWUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLliY3pnaLmnb/ok53oibLmj5Llj6MiCisKKyN+IG1zZ2lkICJXaGl0ZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuWJjemdouadv+eZveiJsuaPkuWPoyIKKworI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5YmN6Z2i5p2/6buR6Imy5o+S5Y+jIgorCisjfiBtc2dpZCAiR3JheSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuWJjemdouadv+eBsOiJsuaPkuWPoyIKKworI34gbXNnaWQgIk9yYW5nZSBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuWJjemdouadv+apmeiJsuaPkuWPoyIKKworI34gbXNnaWQgIlJlZCBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuWJjemdouadv+e6ouiJsuaPkuWPoyIKKworI34gbXNnaWQgIlllbGxvdyBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuWJjemdouadv+m7hOiJsuaPkuWPoyIKKworI34gbXNnaWQgIlNwcmVhZCBPdXRwdXQiCisjfiBtc2dzdHIgIuWIhuaVo+W8j+i+k+WHuiIKKworI34gbXNnaWQgIkRvd25taXgiCisjfiBtc2dzdHIgIua3t+e8qSIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIuiZmuaLn+a3t+mfs+i+k+WFpSIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgT3V0cHV0IgorI34gbXNnc3RyICLomZrmi5/mt7fpn7PovpPlh7oiCisKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIENoYW5uZWxzIgorI34gbXNnc3RyICLomZrmi5/mt7fpn7PpgJrpgZMiCisKKyN+IG1zZ2lkICIlcyAlZCBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMgJWQg5Yqf6IO9IgorCisjfiBtc2dpZCAiJXMgRnVuY3Rpb24iCisjfiBtc2dzdHIgIiVzIOWKn+iDvSIKZGlmZiAtLWdpdCBhL3BvL3poX0hLLnBvIGIvcG8vemhfSEsucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUwNGM3ZQotLS0gL2Rldi9udWxsCisrKyBiL3BvL3poX0hLLnBvCkBAIC0wLDAgKzEsNjgxIEBACisjIENoaW5lc2UgKEhvbmcgS29uZykgdHJhbnNsYXRpb24gb2YgZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjIuCisjIFRoaXMgZmlsZSBpcyBwdXQgaW4gdGhlIHB1YmxpYyBkb21haW4uCisjIEFiZWwgQ2hldW5nIDxhYmVsY2hldW5nQGdtYWlsLmNvbT4sIDIwMDYuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBnc3QtcGx1Z2lucy1nb29kLTAuMTAuMiAwLjEwLjJcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogaHR0cDovL2J1Z3ppbGxhLmdub21lLm9yZy9cbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxNy0wNS0wNCAxNTowNSswMzAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwNi0wOC0yOSAwMTowOCswODAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBBYmVsIENoZXVuZyA8YWJlbGNoZXVuZ0BnbWFpbC5jb20+XG4iCisiTGFuZ3VhZ2UtVGVhbTogQ2hpbmVzZSAoSG9uZyBLb25nKSA8Y29tbXVuaXR5QGxpbnV4aGFsbC5vcmc+XG4iCisiTGFuZ3VhZ2U6IHpoX0hLXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIiIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICIiCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICIiCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIuaykuacieS7u+S9lei8uOWFpeeahOmfs+aViOizh+aWmeaIluiAheizh+aWmeeEoeaViO+8jOihqOekuiBBVkkg5Liy5rWB5Ye654++6Yyv6Kqk44CCIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIuaXoOazleaJk+W8gOmfs+mikeiuvuWkh+aSreaUvumfs+mikeOAguatpOe7hOS7tuS4jeaUr+aMgeW8gOaUvuWjsOmfs+ezu+e7nyhPU1Mp54mI5pys44CCIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIuatpOmfs+mikeiuvuWkh+S4jeaUr+aMgemfs+mikeaSreaUvuOAgiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAi6Z+z6aKR5pKt5pS+6ZSZ6K+v44CCIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLmraTpn7PpopHorr7lpIfkuI3mlK/mjIHlvZXpn7PjgIIiCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLku47pn7PpopHorr7lpIflvZXpn7Pml7blj5HnlJ/plJnor6/jgIIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAi5b2V6Z+z5p2l5rqQIgorCisjLCBmdXp6eQorbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIum6puWFi+mjjiAxIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAi57q/6Lev6L6T5YWlIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIuWGhemDqCBDRCDpn7PpopEiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiU1BESUYg6L6T5YWlIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIkFVWCAxIOi+k+WFpSIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJBVVggMiDovpPlhaUiCisKKyMsIGZ1enp5Cittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIkxvb3BiYWNrIgorCisjLCBmdXp6eQorbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiTG9vcGJhY2siCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIiIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIiIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIiIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIiIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIiIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICIiCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAi5peg5rOV5omT5byA6Z+z6aKR5paH5Lu26L+b6KGM5re36Z+z5o6n5Yi25pON5L2c44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICIiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIuWFp+mDqOizh+aWmeS4sua1geeZvOeUn+mMr+iqpOOAgiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICLlhafpg6jos4fmlpnkuLLmtYHnmbznlJ/pjK/oqqTjgIIiCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICLml6Dms5XmiZPlvIDpn7PpopHorr7lpIfov5vooYzpn7Pph4/mjqfliLbmk43kvZzjgILmraTpg6jku7bkuI3mlK/mjIHlvIDmlL7lo7Dpn7Pns7vnu58oT1NTKeeahOeJiOacrOOAgiIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAi5Li75aOw6YGTIgorCisjfiBtc2dpZCAiRnJvbnQiCisjfiBtc2dzdHIgIuWJjee9ruWjsOmBkyIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIuWQjue9ruWjsOmBkyIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIuWktOaItOW8j+iAs+acuiIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAi5Lit572uIgorCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICLkvY7pn7Pngq4iCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAi56uL5L2T5aOw546v57uVIgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAi5bem5Y+z5aOw6YGTIgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAiQVVYIOi+k+WHuiIKKworI34gbXNnaWQgIjNEIERlcHRoIgorI34gbXNnc3RyICIzRCBEZXB0aCIKKworI34gbXNnaWQgIjNEIENlbnRlciIKKyN+IG1zZ3N0ciAiM0QgQ2VudGVyIgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAiM0QgRW5oYW5jZSIKKworI34gbXNnaWQgIlRlbGVwaG9uZSIKKyN+IG1zZ3N0ciAi6K+d562SIgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgIuinhumikei+k+WFpSIKKworI34gbXNnaWQgIkFVWCBJbiIKKyN+IG1zZ3N0ciAiQVVYIOi+k+WFpSIKKworI34gbXNnaWQgIlJlY29yZCBHYWluIgorI34gbXNnc3RyICLlvZXpn7Plop7nm4oiCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAi6L6T5Ye65aKe55uKIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAi6bqm5YWL6aOO5aKe55uKIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRpYWdub3N0aWMiCisjfiBtc2dzdHIgIumHh+agt+WIhuaekCIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgIkJhc3Mg5aKe55uKIgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgIuWbnuaUvuerr+WPoyIKKworI34gbXNnaWQgIklucHV0IgorI34gbXNnc3RyICLovpPlhaUiCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAi55uR6KeG5Zmo5p2l5rqQIgorCisjfiBtc2dpZCAiS2V5Ym9hcmQgQmVlcCIKKyN+IG1zZ3N0ciAi5oyJ6ZSu5aOw6Z+zIgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICLmqKHmi5/nq4vkvZPlo7AiCisKKyN+IG1zZ2lkICJTdGVyZW8iCisjfiBtc2dzdHIgIueri+S9k+WjsCIKKworI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICLnq4vkvZPlo7Dnjq/nu5UiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIum6puWFi+mjjuWinuebiiIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICLmiazlo7Dlmajpn7PmupAiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAi6bqm5YWL6aOO6Z+z5rqQIgorCisjfiBtc2dpZCAiSmFjayIKKyN+IG1zZ3N0ciAiSmFjayIKKworI34gbXNnaWQgIkNlbnRlciAvIExGRSIKKyN+IG1zZ3N0ciAi5Lit572uL+S9jumfs+eCriIKKworI34gbXNnaWQgIlN0ZXJlbyBNaXgiCisjfiBtc2dzdHIgIueri+S9k+WjsCIKKworI34gbXNnaWQgIk1vbm8gTWl4IgorI34gbXNnc3RyICLljZXlo7DpgZMiCisKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgIua3t+mfs+i+k+WFpSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAi6bqm5YWL6aOOIDIiCisKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAi5pWw5a2X6L6T5Ye6IgorCisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAi5pWw5a2X6L6T5YWlIgorCisjfiBtc2dpZCAiSERNSSIKKyN+IG1zZ3N0ciAiSERNSSjpq5jmuIUpIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk1vZGVtIgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAi5omL5oyB6K6+5aSHIgorCisjfiBtc2dpZCAiT3RoZXIiCisjfiBtc2dzdHIgIuWFtuWug+iuvuWkhyIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgIuaXoCIKKworI34gbXNnaWQgIk9uIgorI34gbXNnc3RyICLlvIAiCisKKyN+IG1zZ2lkICJPZmYiCisjfiBtc2dzdHIgIuWFsyIKKworI34gbXNnaWQgIk11dGUiCisjfiBtc2dzdHIgIumdmemfsyIKKworI34gbXNnaWQgIkZhc3QiCisjfiBtc2dzdHIgIuW/qyIKKworI34gbXNnaWQgIlZlcnkgTG93IgorI34gbXNnc3RyICLlvojmhaIiCisKKyN+IG1zZ2lkICJMb3ciCisjfiBtc2dzdHIgIuaFoiIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAi5Lit562JIgorCisjfiBtc2dpZCAiSGlnaCIKKyN+IG1zZ3N0ciAi6auYIgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICLlvojpq5giCisKKyN+IG1zZ2lkICJQcm9kdWN0aW9uIgorI34gbXNnc3RyICLnlJ/kuqfllYYiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICLpuqblhYvpo47pnaLmnb8iCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICLnur/ot6/ovpPlhaXpnaLmnb8iCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICLlpLTmiLTlvI/ogLPmnLrpnaLmnb8iCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIE91dCIKKyN+IG1zZ3N0ciAi57q/6Lev6L6T5Ye66Z2i5p2/IgorCisjLCBmdXp6eQorI34gbXNnaWQgIkdyZWVuIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi57q/6Lev6L6T5Ye6IgorCisjLCBmdXp6eQorI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICLor53nrZLovpPlh7oiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIueri+S9k+WjsOi+k+WFpSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuW3pi/ljZXlo7DpgZMiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICLlkI7nva7lo7DpgZPovpPlh7oiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuS4ree9ruWjsOmBk+i+k+WHuiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJPcmFuZ2UgQ29ubmVjdG9yIgorI34gbXNnc3RyICLkvY7pn7Pngq7ovpPlh7oiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiUmVkIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5Y+z5aOw6YGTIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk1pZGkg6L6T5Ye6L+a4uOaIj+aRh+adhiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIue6v+i3r+i+k+WHuumdouadvyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi6K+d562S6L6T5Ye66Z2i5p2/IgorCisjLCBmdXp6eQorI34gbXNnaWQgIkJsdWUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLnq4vkvZPlo7DovpPlhaXpnaLmnb8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLlt6Yv5Y2V5aOw6YGT6Z2i5p2/IgorCisjLCBmdXp6eQorI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5ZCO572u5aOw6YGT6L6T5Ye66Z2i5p2/IgorCisjLCBmdXp6eQorI34gbXNnaWQgIkdyYXkgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLkuK3nva7lo7DpgZPovpPlh7rpnaLmnb8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiT3JhbmdlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5L2O6Z+z54Ku6L6T5Ye66Z2i5p2/IgorCisjLCBmdXp6eQorI34gbXNnaWQgIlJlZCBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuWPs+WjsOmBk+mdouadvyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJZZWxsb3cgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJNaWRpIOi+k+WHui/muLjmiI/mkYfmnYbpnaLmnb8iCisKKyN+IG1zZ2lkICJTcHJlYWQgT3V0cHV0IgorI34gbXNnc3RyICJTcHJlYWQg6L6T5Ye6IgorCisjfiBtc2dpZCAiRG93bm1peCIKKyN+IG1zZ3N0ciAiRG93bm1peCIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIuaooeaLn+a3t+mfs+i+k+WFpSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKKyN+IG1zZ3N0ciAi5qih5ouf5re36Z+z6L6T5Ye6IgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBDaGFubmVscyIKKyN+IG1zZ3N0ciAi5qih5ouf5re36Z+z6L6T5YWlIgorCisjLCBmdXp6eQorI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyDlip/og70iCisKKyN+IG1zZ2lkICIlcyBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMg5Yqf6IO9IgpkaWZmIC0tZ2l0IGEvcG8vemhfVFcucG8gYi9wby96aF9UVy5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGFlMWVlCi0tLSAvZGV2L251bGwKKysrIGIvcG8vemhfVFcucG8KQEAgLTAsMCArMSw2ODEgQEAKKyMgQ2hpbmVzZSAodHJhZGl0aW9uYWwpIHRyYW5zbGF0aW9uIG9mIGdzdC1wbHVnaW5zLWdvb2QtMC4xMC4yLgorIyBUaGlzIGZpbGUgaXMgcHV0IGluIHRoZSBwdWJsaWMgZG9tYWluLgorIyBBYmVsIENoZXVuZyA8YWJlbGNoZXVuZ0BnbWFpbC5jb20+LCAyMDA2LgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogZ3N0LXBsdWdpbnMtZ29vZC0wLjEwLjIgMC4xMC4yXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IGh0dHA6Ly9idWd6aWxsYS5nbm9tZS5vcmcvXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTctMDUtMDQgMTU6MDUrMDMwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDYtMDgtMjkgMDE6MDgrMDgwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogQWJlbCBDaGV1bmcgPGFiZWxjaGV1bmdAZ21haWwuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IENoaW5lc2UgKHRyYWRpdGlvbmFsKSA8emgtbDEwbkBsaW51eC5vcmcudHc+XG4iCisiTGFuZ3VhZ2U6IHpoX1RXXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisKK21zZ2lkICJKYWNrIHNlcnZlciBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBkZWNvZGUgSlBFRyBpbWFnZSIKK21zZ3N0ciAiIgorCisjLiBUUkFOU0xBVE9SUzogJ3NvbmcgdGl0bGUnIGJ5ICdhcnRpc3QgbmFtZScKKyMsIGMtZm9ybWF0Cittc2dpZCAiJyVzJyBieSAnJXMnIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIiCittc2dzdHIgIiIKKworbXNnaWQgIk5vIFVSTCBzZXQuIgorbXNnc3RyICIiCisKK21zZ2lkICJDb3VsZCBub3QgcmVzb2x2ZSBzZXJ2ZXIgbmFtZS4iCittc2dzdHIgIiIKKworbXNnaWQgIkNvdWxkIG5vdCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byBzZXJ2ZXIuIgorbXNnc3RyICIiCisKK21zZ2lkICJTZWN1cmUgY29ubmVjdGlvbiBzZXR1cCBmYWlsZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLCBvciB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuIgorbXNnc3RyICIiCisKK21zZ2lkICJTZXJ2ZXIgc2VudCBiYWQgZGF0YS4iCittc2dzdHIgIiIKKworbXNnaWQgIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcuIgorbXNnc3RyICIiCisKK21zZ2lkICJObyBvciBpbnZhbGlkIGlucHV0IGF1ZGlvLCBBVkkgc3RyZWFtIHdpbGwgYmUgY29ycnVwdC4iCittc2dzdHIgIuaykuacieS7u+S9lei8uOWFpeeahOmfs+aViOizh+aWmeaIluiAheizh+aWmeeEoeaViO+8jOihqOekuiBBVkkg5Liy5rWB5Ye654++6Yyv6Kqk44CCIgorCittc2dpZCAiVGhpcyBmaWxlIGNvbnRhaW5zIG5vIHBsYXlhYmxlIHN0cmVhbXMuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkNhbm5vdCBwbGF5IHN0cmVhbSBiZWNhdXNlIGl0IGlzIGVuY3J5cHRlZCB3aXRoIFBsYXlSZWFkeSBEUk0uIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGlzIGZpbGUgaXMgY29ycnVwdCBhbmQgY2Fubm90IGJlIHBsYXllZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkludmFsaWQgYXRvbSBzaXplLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVGhpcyBmaWxlIGlzIGluY29tcGxldGUgYW5kIGNhbm5vdCBiZSBwbGF5ZWQuIgorbXNnc3RyICIiCisKK21zZ2lkICJUaGUgdmlkZW8gaW4gdGhpcyBmaWxlIG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGZpbGUgY29udGFpbnMgdG9vIG1hbnkgc3RyZWFtcy4gT25seSBwbGF5aW5nIGZpcnN0ICVkIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiTm8gc3VwcG9ydGVkIHN0cmVhbSB3YXMgZm91bmQuIFlvdSBtaWdodCBuZWVkIHRvIGluc3RhbGwgYSBHU3RyZWFtZXIgUlRTUCAiCisiZXh0ZW5zaW9uIHBsdWdpbiBmb3IgUmVhbCBtZWRpYSBzdHJlYW1zLiIKK21zZ3N0ciAiIgorCittc2dpZCAiIgorIk5vIHN1cHBvcnRlZCBzdHJlYW0gd2FzIGZvdW5kLiBZb3UgbWlnaHQgbmVlZCB0byBhbGxvdyBtb3JlIHRyYW5zcG9ydCAiCisicHJvdG9jb2xzIG9yIG1heSBvdGhlcndpc2UgYmUgbWlzc2luZyB0aGUgcmlnaHQgR1N0cmVhbWVyIFJUU1AgZXh0ZW5zaW9uICIKKyJwbHVnaW4uIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciAiCisiYXBwbGljYXRpb24uIgorbXNnc3RyICIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuICIKKyJ0aGUgZGV2aWNlLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iCittc2dzdHIgIiIKKworbXNnaWQgIiIKKyJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiBUaGlzIHZlcnNpb24gb2YgdGhlIE9wZW4gU291bmQgIgorIlN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCittc2dzdHIgIuaXoOazleaJk+W8gOmfs+mikeiuvuWkh+aSreaUvumfs+mikeOAguatpOe7hOS7tuS4jeaUr+aMgeW8gOaUvuWjsOmfs+ezu+e7nyhPU1Mp54mI5pys44CCIgorCittc2dpZCAiUGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGF1ZGlvIGRldmljZS4iCittc2dzdHIgIuatpOmfs+mikeiuvuWkh+S4jeaUr+aMgemfs+mikeaSreaUvuOAgiIKKworbXNnaWQgIkF1ZGlvIHBsYXliYWNrIGVycm9yLiIKK21zZ3N0ciAi6Z+z6aKR5pKt5pS+6ZSZ6K+v44CCIgorCittc2dpZCAiUmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLmraTpn7PpopHorr7lpIfkuI3mlK/mjIHlvZXpn7PjgIIiCisKK21zZ2lkICJFcnJvciByZWNvcmRpbmcgZnJvbSBhdWRpbyBkZXZpY2UuIgorbXNnc3RyICLku47pn7PpopHorr7lpIflvZXpn7Pml7blj5HnlJ/plJnor6/jgIIiCisKK21zZ2lkICIiCisiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuIFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiAiCisidGhlIGRldmljZS4iCittc2dzdHIgIiIKKworbXNnaWQgIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiCittc2dzdHIgIiIKKworbXNnaWQgIkNvcmVBdWRpbyBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZCIKK21zZ3N0ciAiIgorCittc2dpZCAiUmVjb3JkIFNvdXJjZSIKK21zZ3N0ciAi5b2V6Z+z5p2l5rqQIgorCisjLCBmdXp6eQorbXNnaWQgIk1pY3JvcGhvbmUiCittc2dzdHIgIum6puWFi+mjjiAxIgorCittc2dpZCAiTGluZSBJbiIKK21zZ3N0ciAi57q/6Lev6L6T5YWlIgorCittc2dpZCAiSW50ZXJuYWwgQ0QiCittc2dzdHIgIuWGhemDqCBDRCDpn7PpopEiCisKK21zZ2lkICJTUERJRiBJbiIKK21zZ3N0ciAiU1BESUYg6L6T5YWlIgorCittc2dpZCAiQVVYIDEgSW4iCittc2dzdHIgIkFVWCAxIOi+k+WFpSIKKworbXNnaWQgIkFVWCAyIEluIgorbXNnc3RyICJBVVggMiDovpPlhaUiCisKKyMsIGZ1enp5Cittc2dpZCAiQ29kZWMgTG9vcGJhY2siCittc2dzdHIgIkxvb3BiYWNrIgorCisjLCBmdXp6eQorbXNnaWQgIlN1blZUUyBMb29wYmFjayIKK21zZ3N0ciAiTG9vcGJhY2siCisKK21zZ2lkICJWb2x1bWUiCittc2dzdHIgIiIKKworbXNnaWQgIkdhaW4iCittc2dzdHIgIiIKKworbXNnaWQgIk1vbml0b3IiCittc2dzdHIgIiIKKworbXNnaWQgIkJ1aWx0LWluIFNwZWFrZXIiCittc2dzdHIgIiIKKworbXNnaWQgIkhlYWRwaG9uZSIKK21zZ3N0ciAiIgorCittc2dpZCAiTGluZSBPdXQiCittc2dzdHIgIiIKKworbXNnaWQgIlNQRElGIE91dCIKK21zZ3N0ciAiIgorCittc2dpZCAiQVVYIDEgT3V0IgorbXNnc3RyICIiCisKK21zZ2lkICJBVVggMiBPdXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGVudW1lcmF0ZSBwb3NzaWJsZSB2aWRlbyBmb3JtYXRzIGRldmljZSAnJXMnIGNhbiB3b3JrIHdpdGgiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiVGhlIGRyaXZlciBvZiBkZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBrbm93biBJTyBtZXRob2QuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgYnVzeSIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkRldmljZSAnJXMnIGNhbm5vdCBjYXB0dXJlIGF0ICVkeCVkIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGdldCBwYXJhbWV0ZXJzIG9uIGRldmljZSAnJXMnIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgZGlkIG5vdCBhY2NlcHQgbmV3IGZyYW1lIHJhdGUgc2V0dGluZy4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSBkaWQgbm90IHByb3ZpZGUgb3V0cHV0IGZvcm1hdC4iCittc2dzdHIgIiIKKworbXNnaWQgIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIgorbXNnc3RyICIiCisKK21zZ2lkICJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIgorbXNnc3RyICIiCisKK21zZ2lkICJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIKK21zZ3N0ciAiIgorCittc2dpZCAiVmlkZW8gZGV2aWNlIGRpZCBub3Qgc3VnZ2VzdCBhbnkgYnVmZmVyIHNpemUuIgorbXNnc3RyICIiCisKK21zZ2lkICJObyBkb3duc3RyZWFtIHBvb2wgdG8gaW1wb3J0IGZyb20uIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCByYWRpbyBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGNoYW5nZSBtdXRlIHN0YXRlIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ29udmVydGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJFbmNvZGVyIG9uIGRldmljZSAlcyBoYXMgbm8gc3VwcG9ydGVkIGlucHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIKK21zZ3N0ciAiIgorCittc2dpZCAiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iCittc2dzdHIgIiIKKworbXNnaWQgIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcyc6IEl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmICIKKyJpdCBpcyBhIHY0bDEgZHJpdmVyLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBxdWVyeSBhdHRyaWJ1dGVzIG9mIGlucHV0ICVkIGluIGRldmljZSAlcyIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2V0dGluZyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gcXVlcnkgbm9ybSBvbiBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgZ2V0dGluZyBjb250cm9scyBhdHRyaWJ1dGVzIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJUaGlzIGlzbid0IGEgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgY2FwdHVyZSBkZXZpY2UuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRGV2aWNlICclcycgaXMgbm90IGEgb3V0cHV0IGRldmljZS4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIKK21zZ3N0ciAiIgorCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZHVwIGRldmljZSAnJXMnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIKK21zZ3N0ciAi5peg5rOV5omT5byA6Z+z6aKR5paH5Lu26L+b6KGM5re36Z+z5o6n5Yi25pON5L2c44CCIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgbm9ybSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycgdG8gJWx1IEh6LiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICJGYWlsZWQgdG8gZ2V0IHZhbHVlIGZvciBjb250cm9sICVkIG9uIGRldmljZSAnJXMnLiIKK21zZ3N0ciAiIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkZhaWxlZCB0byBzZXQgdmFsdWUgJWQgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIGdldCBjdXJyZW50IGlucHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiCittc2dzdHIgIiIKKworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRmFpbGVkIHRvIGdldCBjdXJyZW50IG91dHB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIgorbXNnc3RyICIiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmFpbGVkIHRvIHNldCBvdXRwdXQgJWQgb24gZGV2aWNlICVzLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ2hhbmdpbmcgcmVzb2x1dGlvbiBhdCBydW50aW1lIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIKK21zZ3N0ciAiIgorCittc2dpZCAiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIgorbXNnc3RyICIiCisKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIHN0cmVhbSBlcnJvci4iCisjfiBtc2dzdHIgIuWFp+mDqOizh+aWmeS4sua1geeZvOeUn+mMr+iqpOOAgiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJJbnRlcm5hbCBkYXRhIGZsb3cgZXJyb3IuIgorI34gbXNnc3RyICLlhafpg6jos4fmlpnkuLLmtYHnmbznlJ/pjK/oqqTjgIIiCisKKyN+IG1zZ2lkICIiCisjfiAiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBtaXhlciBjb250cm9sIGhhbmRsaW5nLiBUaGlzIHZlcnNpb24gb2YgIgorI34gInRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZWxlbWVudC4iCisjfiBtc2dzdHIgIiIKKyN+ICLml6Dms5XmiZPlvIDpn7PpopHorr7lpIfov5vooYzpn7Pph4/mjqfliLbmk43kvZzjgILmraTpg6jku7bkuI3mlK/mjIHlvIDmlL7lo7Dpn7Pns7vnu58oT1NTKeeahOeJiOacrOOAgiIKKworI34gbXNnaWQgIk1hc3RlciIKKyN+IG1zZ3N0ciAi5Li75aOw6YGTIgorCisjfiBtc2dpZCAiRnJvbnQiCisjfiBtc2dzdHIgIuWJjee9ruWjsOmBkyIKKworI34gbXNnaWQgIlJlYXIiCisjfiBtc2dzdHIgIuWQjue9ruWjsOmBkyIKKworI34gbXNnaWQgIkhlYWRwaG9uZXMiCisjfiBtc2dzdHIgIuWktOaItOW8j+iAs+acuiIKKworI34gbXNnaWQgIkNlbnRlciIKKyN+IG1zZ3N0ciAi5Lit572uIgorCisjfiBtc2dpZCAiTEZFIgorI34gbXNnc3RyICLkvY7pn7Pngq4iCisKKyN+IG1zZ2lkICJTdXJyb3VuZCIKKyN+IG1zZ3N0ciAi56uL5L2T5aOw546v57uVIgorCisjfiBtc2dpZCAiU2lkZSIKKyN+IG1zZ3N0ciAi5bem5Y+z5aOw6YGTIgorCisjfiBtc2dpZCAiQVVYIE91dCIKKyN+IG1zZ3N0ciAiQVVYIOi+k+WHuiIKKworI34gbXNnaWQgIjNEIERlcHRoIgorI34gbXNnc3RyICIzRCBEZXB0aCIKKworI34gbXNnaWQgIjNEIENlbnRlciIKKyN+IG1zZ3N0ciAiM0QgQ2VudGVyIgorCisjfiBtc2dpZCAiM0QgRW5oYW5jZSIKKyN+IG1zZ3N0ciAiM0QgRW5oYW5jZSIKKworI34gbXNnaWQgIlRlbGVwaG9uZSIKKyN+IG1zZ3N0ciAi6K+d562SIgorCisjfiBtc2dpZCAiVmlkZW8gSW4iCisjfiBtc2dzdHIgIuinhumikei+k+WFpSIKKworI34gbXNnaWQgIkFVWCBJbiIKKyN+IG1zZ3N0ciAiQVVYIOi+k+WFpSIKKworI34gbXNnaWQgIlJlY29yZCBHYWluIgorI34gbXNnc3RyICLlvZXpn7Plop7nm4oiCisKKyN+IG1zZ2lkICJPdXRwdXQgR2FpbiIKKyN+IG1zZ3N0ciAi6L6T5Ye65aKe55uKIgorCisjfiBtc2dpZCAiTWljcm9waG9uZSBCb29zdCIKKyN+IG1zZ3N0ciAi6bqm5YWL6aOO5aKe55uKIgorCisjLCBmdXp6eQorI34gbXNnaWQgIkRpYWdub3N0aWMiCisjfiBtc2dzdHIgIumHh+agt+WIhuaekCIKKworI34gbXNnaWQgIkJhc3MgQm9vc3QiCisjfiBtc2dzdHIgIkJhc3Mg5aKe55uKIgorCisjfiBtc2dpZCAiUGxheWJhY2sgUG9ydHMiCisjfiBtc2dzdHIgIuWbnuaUvuerr+WPoyIKKworI34gbXNnaWQgIklucHV0IgorI34gbXNnc3RyICLovpPlhaUiCisKKyN+IG1zZ2lkICJNb25pdG9yIFNvdXJjZSIKKyN+IG1zZ3N0ciAi55uR6KeG5Zmo5p2l5rqQIgorCisjfiBtc2dpZCAiS2V5Ym9hcmQgQmVlcCIKKyN+IG1zZ3N0ciAi5oyJ6ZSu5aOw6Z+zIgorCisjfiBtc2dpZCAiU2ltdWxhdGUgU3RlcmVvIgorI34gbXNnc3RyICLmqKHmi5/nq4vkvZPlo7AiCisKKyN+IG1zZ2lkICJTdGVyZW8iCisjfiBtc2dzdHIgIueri+S9k+WjsCIKKworI34gbXNnaWQgIlN1cnJvdW5kIFNvdW5kIgorI34gbXNnc3RyICLnq4vkvZPlo7Dnjq/nu5UiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIEdhaW4iCisjfiBtc2dzdHIgIum6puWFi+mjjuWinuebiiIKKworI34gbXNnaWQgIlNwZWFrZXIgU291cmNlIgorI34gbXNnc3RyICLmiazlo7Dlmajpn7PmupAiCisKKyN+IG1zZ2lkICJNaWNyb3Bob25lIFNvdXJjZSIKKyN+IG1zZ3N0ciAi6bqm5YWL6aOO6Z+z5rqQIgorCisjfiBtc2dpZCAiSmFjayIKKyN+IG1zZ3N0ciAiSmFjayIKKworI34gbXNnaWQgIkNlbnRlciAvIExGRSIKKyN+IG1zZ3N0ciAi5Lit572uL+S9jumfs+eCriIKKworI34gbXNnaWQgIlN0ZXJlbyBNaXgiCisjfiBtc2dzdHIgIueri+S9k+WjsCIKKworI34gbXNnaWQgIk1vbm8gTWl4IgorI34gbXNnc3RyICLljZXlo7DpgZMiCisKKyN+IG1zZ2lkICJJbnB1dCBNaXgiCisjfiBtc2dzdHIgIua3t+mfs+i+k+WFpSIKKworI34gbXNnaWQgIk1pY3JvcGhvbmUgMiIKKyN+IG1zZ3N0ciAi6bqm5YWL6aOOIDIiCisKKyN+IG1zZ2lkICJEaWdpdGFsIE91dCIKKyN+IG1zZ3N0ciAi5pWw5a2X6L6T5Ye6IgorCisjfiBtc2dpZCAiRGlnaXRhbCBJbiIKKyN+IG1zZ3N0ciAi5pWw5a2X6L6T5YWlIgorCisjfiBtc2dpZCAiSERNSSIKKyN+IG1zZ3N0ciAiSERNSSjpq5jmuIUpIgorCisjfiBtc2dpZCAiTW9kZW0iCisjfiBtc2dzdHIgIk1vZGVtIgorCisjfiBtc2dpZCAiSGFuZHNldCIKKyN+IG1zZ3N0ciAi5omL5oyB6K6+5aSHIgorCisjfiBtc2dpZCAiT3RoZXIiCisjfiBtc2dzdHIgIuWFtuWug+iuvuWkhyIKKworI34gbXNnaWQgIk5vbmUiCisjfiBtc2dzdHIgIuaXoCIKKworI34gbXNnaWQgIk9uIgorI34gbXNnc3RyICLlvIAiCisKKyN+IG1zZ2lkICJPZmYiCisjfiBtc2dzdHIgIuWFsyIKKworI34gbXNnaWQgIk11dGUiCisjfiBtc2dzdHIgIumdmemfsyIKKworI34gbXNnaWQgIkZhc3QiCisjfiBtc2dzdHIgIuW/qyIKKworI34gbXNnaWQgIlZlcnkgTG93IgorI34gbXNnc3RyICLlvojmhaIiCisKKyN+IG1zZ2lkICJMb3ciCisjfiBtc2dzdHIgIuaFoiIKKworI34gbXNnaWQgIk1lZGl1bSIKKyN+IG1zZ3N0ciAi5Lit562JIgorCisjfiBtc2dpZCAiSGlnaCIKKyN+IG1zZ3N0ciAi6auYIgorCisjfiBtc2dpZCAiVmVyeSBIaWdoIgorI34gbXNnc3RyICLlvojpq5giCisKKyN+IG1zZ2lkICJQcm9kdWN0aW9uIgorI34gbXNnc3RyICLnlJ/kuqfllYYiCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBNaWNyb3Bob25lIgorI34gbXNnc3RyICLpuqblhYvpo47pnaLmnb8iCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIEluIgorI34gbXNnc3RyICLnur/ot6/ovpPlhaXpnaLmnb8iCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBIZWFkcGhvbmVzIgorI34gbXNnc3RyICLlpLTmiLTlvI/ogLPmnLrpnaLmnb8iCisKKyN+IG1zZ2lkICJGcm9udCBQYW5lbCBMaW5lIE91dCIKKyN+IG1zZ3N0ciAi57q/6Lev6L6T5Ye66Z2i5p2/IgorCisjLCBmdXp6eQorI34gbXNnaWQgIkdyZWVuIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi57q/6Lev6L6T5Ye6IgorCisjLCBmdXp6eQorI34gbXNnaWQgIlBpbmsgQ29ubmVjdG9yIgorI34gbXNnc3RyICLor53nrZLovpPlh7oiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQmx1ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIueri+S9k+WjsOi+k+WFpSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJXaGl0ZSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuW3pi/ljZXlo7DpgZMiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiQmxhY2sgQ29ubmVjdG9yIgorI34gbXNnc3RyICLlkI7nva7lo7DpgZPovpPlh7oiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiR3JheSBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuS4ree9ruWjsOmBk+i+k+WHuiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJPcmFuZ2UgQ29ubmVjdG9yIgorI34gbXNnc3RyICLkvY7pn7Pngq7ovpPlh7oiCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiUmVkIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5Y+z5aOw6YGTIgorCisjLCBmdXp6eQorI34gbXNnaWQgIlllbGxvdyBDb25uZWN0b3IiCisjfiBtc2dzdHIgIk1pZGkg6L6T5Ye6L+a4uOaIj+aRh+adhiIKKworIywgZnV6enkKKyN+IG1zZ2lkICJHcmVlbiBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIue6v+i3r+i+k+WHuumdouadvyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJQaW5rIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi6K+d562S6L6T5Ye66Z2i5p2/IgorCisjLCBmdXp6eQorI34gbXNnaWQgIkJsdWUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLnq4vkvZPlo7DovpPlhaXpnaLmnb8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiV2hpdGUgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLlt6Yv5Y2V5aOw6YGT6Z2i5p2/IgorCisjLCBmdXp6eQorI34gbXNnaWQgIkJsYWNrIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5ZCO572u5aOw6YGT6L6T5Ye66Z2i5p2/IgorCisjLCBmdXp6eQorI34gbXNnaWQgIkdyYXkgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICLkuK3nva7lo7DpgZPovpPlh7rpnaLmnb8iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiT3JhbmdlIEZyb250IFBhbmVsIENvbm5lY3RvciIKKyN+IG1zZ3N0ciAi5L2O6Z+z54Ku6L6T5Ye66Z2i5p2/IgorCisjLCBmdXp6eQorI34gbXNnaWQgIlJlZCBGcm9udCBQYW5lbCBDb25uZWN0b3IiCisjfiBtc2dzdHIgIuWPs+WjsOmBk+mdouadvyIKKworIywgZnV6enkKKyN+IG1zZ2lkICJZZWxsb3cgRnJvbnQgUGFuZWwgQ29ubmVjdG9yIgorI34gbXNnc3RyICJNaWRpIOi+k+WHui/muLjmiI/mkYfmnYbpnaLmnb8iCisKKyN+IG1zZ2lkICJTcHJlYWQgT3V0cHV0IgorI34gbXNnc3RyICJTcHJlYWQg6L6T5Ye6IgorCisjfiBtc2dpZCAiRG93bm1peCIKKyN+IG1zZ3N0ciAiRG93bm1peCIKKworI34gbXNnaWQgIlZpcnR1YWwgTWl4ZXIgSW5wdXQiCisjfiBtc2dzdHIgIuaooeaLn+a3t+mfs+i+k+WFpSIKKworIywgZnV6enkKKyN+IG1zZ2lkICJWaXJ0dWFsIE1peGVyIE91dHB1dCIKKyN+IG1zZ3N0ciAi5qih5ouf5re36Z+z6L6T5Ye6IgorCisjfiBtc2dpZCAiVmlydHVhbCBNaXhlciBDaGFubmVscyIKKyN+IG1zZ3N0ciAi5qih5ouf5re36Z+z6L6T5YWlIgorCisjLCBmdXp6eQorI34gbXNnaWQgIiVzICVkIEZ1bmN0aW9uIgorI34gbXNnc3RyICIlcyDlip/og70iCisKKyN+IG1zZ2lkICIlcyBGdW5jdGlvbiIKKyN+IG1zZ3N0ciAiJXMg5Yqf6IO9IgpkaWZmIC0tZ2l0IGEvc3lzL01ha2VmaWxlLmFtIGIvc3lzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmOGI5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1MyBAQAoraWYgVVNFX09TUworT1NTX0RJUj1vc3MKK2Vsc2UKK09TU19ESVI9CitlbmRpZgorCitpZiBVU0VfT1NTNAorT1NTNF9ESVI9b3NzNAorZWxzZQorT1NTNF9ESVI9CitlbmRpZgorCitpZiBVU0VfRElSRUNUU09VTkQKK0RJUkVDVFNPVU5EX0RJUj1kaXJlY3Rzb3VuZAorZWxzZQorRElSRUNUU09VTkRfRElSPQorZW5kaWYKKworaWYgVVNFX1dBVkVGT1JNCitXQVZFRk9STV9ESVI9d2F2ZWZvcm0KK2Vsc2UKK1dBVkVGT1JNX0RJUj0KK2VuZGlmCisKK2lmIFVTRV9PU1hfQVVESU8KK09TWF9BVURJT19ESVI9b3N4YXVkaW8KK2Vsc2UKK09TWF9BVURJT19ESVI9CitlbmRpZgorCitpZiBVU0VfT1NYX1ZJREVPCitPU1hfVklERU9fRElSPW9zeHZpZGVvCitlbHNlCitPU1hfVklERU9fRElSPQorZW5kaWYKKworaWYgVVNFX0dTVF9WNEwyCitWNEwyX0RJUj12NGwyCitlbHNlCitWNEwyX0RJUj0KK2VuZGlmCisKK2lmIFVTRV9YCitYSU1BR0VfRElSPXhpbWFnZQorZWxzZQorWElNQUdFX0RJUj0KK2VuZGlmCisKK1NVQkRJUlM9JChESVJFQ1RTT1VORF9ESVIpICQoV0FWRUZPUk1fRElSKSAkKE9TU19ESVIpICQoT1NTNF9ESVIpICQoT1NYX0FVRElPX0RJUikgJChPU1hfVklERU9fRElSKSAkKFY0TDJfRElSKSAkKFhJTUFHRV9ESVIpCisKK0RJU1RfU1VCRElSUz1kaXJlY3Rzb3VuZCBvc3Mgb3NzNCBvc3hhdWRpbyBvc3h2aWRlbyB2NGwyIHdhdmVmb3JtIHhpbWFnZQorCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL3BhcmFsbGVsLXN1YmRpcnMubWFrCmRpZmYgLS1naXQgYS9zeXMvZGlyZWN0c291bmQvTWFrZWZpbGUuYW0gYi9zeXMvZGlyZWN0c291bmQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzYTlhYQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9kaXJlY3Rzb3VuZC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIxIEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3RkaXJlY3Rzb3VuZC5sYQorCitsaWJnc3RkaXJlY3Rzb3VuZF9sYV9TT1VSQ0VTID0gIGdzdGRpcmVjdHNvdW5kc2luay5jIGdzdGRpcmVjdHNvdW5kZGV2aWNlLmMgZ3N0ZGlyZWN0c291bmRwbHVnaW4uYworbGliZ3N0ZGlyZWN0c291bmRfbGFfQ0ZMQUdTID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9CQVNFX0NGTEFHUykgXAorCSQoR1NUX0NGTEFHUykgXAorCSQoRElSRUNUU09VTkRfQ0ZMQUdTKSBcCisJLURHc3REaXJlY3RTb3VuZERldmljZVByb3ZpZGVyPUdzdERpcmVjdFNvdW5kU2lua0RldmljZVByb3ZpZGVyIFwKKwktREdzdERpcmVjdFNvdW5kRGV2aWNlUHJvdmlkZXJDbGFzcz1Hc3REaXJlY3RTb3VuZFNpbmtEZXZpY2VQcm92aWRlckNsYXNzIFwKKwktREdzdERpcmVjdFNvdW5kRGV2aWNlPUdzdERpcmVjdFNvdW5kU2lua0RldmljZSBcCisJLURHc3REaXJlY3RTb3VuZERldmljZUNsYXNzPUdzdERpcmVjdFNvdW5kU2lua0RldmljZUNsYXNzCitsaWJnc3RkaXJlY3Rzb3VuZF9sYV9MSUJBREQgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwktbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJJChHU1RfQkFTRV9MSUJTKSBcCisJJChHU1RfTElCUykgXAorCSQoRElSRUNUU09VTkRfTElCUykKK2xpYmdzdGRpcmVjdHNvdW5kX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykgJChESVJFQ1RTT1VORF9MREZMQUdTKQorCitub2luc3RfSEVBREVSUyA9IGdzdGRpcmVjdHNvdW5kc2luay5oIGdzdGRpcmVjdHNvdW5kZGV2aWNlLmgKZGlmZiAtLWdpdCBhL3N5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZGRldmljZS5jIGIvc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiMDIxZQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZGRldmljZS5jCkBAIC0wLDAgKzEsMjY2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxOCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdGRpcmVjdHNvdW5kZGV2aWNlLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8ZHNvdW5kLmg+CisjaW5jbHVkZSA8bW1zeXN0ZW0uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgR1NUX0RJUkVDVFNPVU5EX1NSQ19ERVZJQ0VfUFJPVklERVIKKyNpbmNsdWRlICJnc3RkaXJlY3Rzb3VuZHNyYy5oIgorI2Vsc2UKKyNpbmNsdWRlICJnc3RkaXJlY3Rzb3VuZHNpbmsuaCIKKyNlbmRpZgorCitHX0RFRklORV9UWVBFIChHc3REaXJlY3RTb3VuZERldmljZVByb3ZpZGVyLCBnc3RfZGlyZWN0c291bmRfZGV2aWNlX3Byb3ZpZGVyLAorICAgIEdTVF9UWVBFX0RFVklDRV9QUk9WSURFUik7CisKK3N0YXRpYyBHTGlzdCAqZ3N0X2RpcmVjdHNvdW5kX2RldmljZV9wcm92aWRlcl9wcm9iZSAoR3N0RGV2aWNlUHJvdmlkZXIgKgorICAgIHByb3ZpZGVyKTsKKworc3RhdGljIHZvaWQKK2dzdF9kaXJlY3Rzb3VuZF9kZXZpY2VfcHJvdmlkZXJfY2xhc3NfaW5pdCAoR3N0RGlyZWN0U291bmREZXZpY2VQcm92aWRlckNsYXNzICoKKyAgICBrbGFzcykKK3sKKyAgR3N0RGV2aWNlUHJvdmlkZXJDbGFzcyAqZG1fY2xhc3MgPSBHU1RfREVWSUNFX1BST1ZJREVSX0NMQVNTIChrbGFzcyk7CisKKyAgZ3N0X2RldmljZV9wcm92aWRlcl9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChkbV9jbGFzcywKKyNpZmRlZiBHU1RfRElSRUNUU09VTkRfU1JDX0RFVklDRV9QUk9WSURFUgorICAgICAgIkRpcmVjdFNvdW5kIFNvdXJjZSBEZXZpY2UgUHJvdmlkZXIiLCAiU291cmNlL0F1ZGlvIiwKKyAgICAgICJMaXN0IERpcmVjdFNvdW5kIHNvdXJjZSBkZXZpY2VzIiwKKyNlbHNlCisgICAgICAiRGlyZWN0U291bmQgU2luayBEZXZpY2UgUHJvdmlkZXIiLCAiU2luay9BdWRpbyIsCisgICAgICAiTGlzdCBEaXJlY3RTb3VuZCBzaW5rIGRldmljZXMiLAorI2VuZGlmCisgICAgICAiU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuQGNlbnRyaWN1bGFyLmNvbT4iKTsKKworICBkbV9jbGFzcy0+cHJvYmUgPSBnc3RfZGlyZWN0c291bmRfZGV2aWNlX3Byb3ZpZGVyX3Byb2JlOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2RpcmVjdHNvdW5kX2RldmljZV9wcm92aWRlcl9pbml0IChHc3REaXJlY3RTb3VuZERldmljZVByb3ZpZGVyICogcHJvdmlkZXIpCit7Cit9CisKK3N0YXRpYyBnY2hhciAqCitndWlkX3RvX3N0cmluZyAoTFBHVUlEIGd1aWQpCit7CisgIGd1bmljaGFyMiAqd3N0ciA9IE5VTEw7CisgIGdjaGFyICpzdHIgPSBOVUxMOworCisgIGlmIChTdHJpbmdGcm9tQ0xTSUQgKGd1aWQsICZ3c3RyKSA9PSBTX09LKSB7CisgICAgc3RyID0gZ191dGYxNl90b191dGY4ICh3c3RyLCAtMSwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgQ29UYXNrTWVtRnJlZSAod3N0cik7CisgIH0KKworICByZXR1cm4gc3RyOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBHc3REaXJlY3RTb3VuZERldmljZVByb3ZpZGVyICpzZWxmOworICBHTGlzdCAqKmRldmljZXM7Cit9IFByb2JlRGF0YTsKKworc3RhdGljIEJPT0wgQ0FMTEJBQ0sKK2dzdF9kaXJlY3Rzb3VuZF9lbnVtX2NhbGxiYWNrIChHVUlEICogcEdVSUQsIFRDSEFSICogc3RyRGVzYywKKyAgICBUQ0hBUiAqIHN0ckRydk5hbWUsIFZPSUQgKiBwQ29udGV4dCkKK3sKKyAgUHJvYmVEYXRhICpwcm9iZV9kYXRhID0gKFByb2JlRGF0YSAqKSAocENvbnRleHQpOworICBnY2hhciAqZHJpdmVyLCAqZGVzY3JpcHRpb24sICpndWlkX3N0cjsKKyAgR3N0U3RydWN0dXJlICpwcm9wczsKKyAgR3N0RGV2aWNlICpkZXZpY2U7CisjaWZkZWYgR1NUX0RJUkVDVFNPVU5EX1NSQ19ERVZJQ0VfUFJPVklERVIKKyAgc3RhdGljIEdzdFN0YXRpY0NhcHMgY2FwcyA9IEdTVF9TVEFUSUNfQ0FQUyAoR1NUX0RJUkVDVFNPVU5EX1NSQ19DQVBTKTsKKyNlbHNlCisgIHN0YXRpYyBHc3RTdGF0aWNDYXBzIGNhcHMgPSBHU1RfU1RBVElDX0NBUFMgKEdTVF9ESVJFQ1RTT1VORF9TSU5LX0NBUFMpOworI2VuZGlmCisKKyAgZGVzY3JpcHRpb24gPSBnX2xvY2FsZV90b191dGY4IChzdHJEZXNjLCAtMSwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIGlmICghZGVzY3JpcHRpb24pIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwcm9iZV9kYXRhLT5zZWxmLAorICAgICAgICAiRmFpbGVkIHRvIGNvbnZlcnQgZGVzY3JpcHRpb24gZnJvbSBsb2NhbGUgZW5jb2RpbmcgdG8gVVRGOCIpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgZHJpdmVyID0gZ19sb2NhbGVfdG9fdXRmOCAoc3RyRHJ2TmFtZSwgLTEsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoIWRyaXZlcikgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHByb2JlX2RhdGEtPnNlbGYsCisgICAgICAgICJGYWlsZWQgdG8gY29udmVydCBkcml2ZXIgbmFtZSBmcm9tIGxvY2FsZSBlbmNvZGluZyB0byBVVEY4Iik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICAvKiBOVUxMIGZvciB0aGUgcHJpbWFyeSBzb3VuZCBjYXJkICovCisgIGd1aWRfc3RyID0gcEdVSUQgPyBndWlkX3RvX3N0cmluZyAocEdVSUQpIDogTlVMTDsKKworICBHU1RfSU5GT19PQkpFQ1QgKHByb2JlX2RhdGEtPnNlbGYsICJzb3VuZCBkZXZpY2UgbmFtZTogJXMsICVzIChHVUlEICVzKSIsCisgICAgICBkZXNjcmlwdGlvbiwgZHJpdmVyLCBHU1RfU1RSX05VTEwgKGd1aWRfc3RyKSk7CisKKyAgcHJvcHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoImRpcmVjdHNvdW5kLXByb3BsaXN0IiwKKyAgICAgICJkZXZpY2UuYXBpIiwgR19UWVBFX1NUUklORywgImRpcmVjdHNvdW5kIiwKKyAgICAgICJkZXZpY2UuZ3VpZCIsIEdfVFlQRV9TVFJJTkcsIEdTVF9TVFJfTlVMTCAoZ3VpZF9zdHIpLAorICAgICAgImRpcmVjdHNvdW5kLmRldmljZS5kcml2ZXIiLCBHX1RZUEVfU1RSSU5HLCBkcml2ZXIsCisgICAgICAiZGlyZWN0c291bmQuZGV2aWNlLmRlc2NyaXB0aW9uIiwgR19UWVBFX1NUUklORywgZGVzY3JpcHRpb24sIE5VTEwpOworCisjaWZkZWYgR1NUX0RJUkVDVFNPVU5EX1NSQ19ERVZJQ0VfUFJPVklERVIKKyAgZGV2aWNlID0gZ19vYmplY3RfbmV3IChHU1RfVFlQRV9ESVJFQ1RTT1VORF9ERVZJQ0UsICJkZXZpY2UtZ3VpZCIsIGd1aWRfc3RyLAorICAgICAgImRpc3BsYXktbmFtZSIsIGRlc2NyaXB0aW9uLCAiY2FwcyIsIGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZjYXBzKSwKKyAgICAgICJkZXZpY2UtY2xhc3MiLCAiQXVkaW8vU291cmNlIiwgInByb3BlcnRpZXMiLCBwcm9wcywgTlVMTCk7CisjZWxzZQorICBkZXZpY2UgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX0RJUkVDVFNPVU5EX0RFVklDRSwgImRldmljZS1ndWlkIiwgZ3VpZF9zdHIsCisgICAgICAiZGlzcGxheS1uYW1lIiwgZGVzY3JpcHRpb24sICJjYXBzIiwgZ3N0X3N0YXRpY19jYXBzX2dldCAoJmNhcHMpLAorICAgICAgImRldmljZS1jbGFzcyIsICJBdWRpby9TaW5rIiwgInByb3BlcnRpZXMiLCBwcm9wcywgTlVMTCk7CisjZW5kaWYKKworICAqcHJvYmVfZGF0YS0+ZGV2aWNlcyA9IGdfbGlzdF9wcmVwZW5kICgqcHJvYmVfZGF0YS0+ZGV2aWNlcywgZGV2aWNlKTsKKworICBnX2ZyZWUgKGRlc2NyaXB0aW9uKTsKKyAgZ19mcmVlIChkcml2ZXIpOworICBnX2ZyZWUgKGd1aWRfc3RyKTsKKworICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHByb3BzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdMaXN0ICoKK2dzdF9kaXJlY3Rzb3VuZF9kZXZpY2VfcHJvdmlkZXJfcHJvYmUgKEdzdERldmljZVByb3ZpZGVyICogcHJvdmlkZXIpCit7CisgIEdzdERpcmVjdFNvdW5kRGV2aWNlUHJvdmlkZXIgKnNlbGYgPQorICAgICAgR1NUX0RJUkVDVFNPVU5EX0RFVklDRV9QUk9WSURFUiAocHJvdmlkZXIpOworICBHTGlzdCAqZGV2aWNlcyA9IE5VTEw7CisgIFByb2JlRGF0YSBwcm9iZV9kYXRhID0geyBzZWxmLCAmZGV2aWNlcyB9OworICBIUkVTVUxUIGhSZXM7CisKKyNpZmRlZiBHU1RfRElSRUNUU09VTkRfU1JDX0RFVklDRV9QUk9WSURFUgorICBoUmVzID0gRGlyZWN0U291bmRDYXB0dXJlRW51bWVyYXRlICgoTFBEU0VOVU1DQUxMQkFDSykKKyAgICAgIGdzdF9kaXJlY3Rzb3VuZF9lbnVtX2NhbGxiYWNrLCAoVk9JRCAqKSAmIHByb2JlX2RhdGEpOworI2Vsc2UKKyAgaFJlcyA9IERpcmVjdFNvdW5kRW51bWVyYXRlICgoTFBEU0VOVU1DQUxMQkFDSykKKyAgICAgIGdzdF9kaXJlY3Rzb3VuZF9lbnVtX2NhbGxiYWNrLCAoVk9JRCAqKSAmIHByb2JlX2RhdGEpOworI2VuZGlmCisKKyAgaWYgKEZBSUxFRCAoaFJlcykpCisgICAgR1NUX0VSUk9SX09CSkVDVCAoc2VsZiwgIkZhaWxlZCB0byBlbnVtZXJhdGUgZGV2aWNlcyIpOworCisgIHJldHVybiBkZXZpY2VzOworfQorCitlbnVtCit7CisgIFBST1BfREVWSUNFX0dVSUQgPSAxLAorfTsKKworR19ERUZJTkVfVFlQRSAoR3N0RGlyZWN0U291bmREZXZpY2UsIGdzdF9kaXJlY3Rzb3VuZF9kZXZpY2UsIEdTVF9UWVBFX0RFVklDRSk7CisKK3N0YXRpYyB2b2lkIGdzdF9kaXJlY3Rzb3VuZF9kZXZpY2VfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X2RpcmVjdHNvdW5kX2RldmljZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfZGlyZWN0c291bmRfZGV2aWNlX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyBHc3RFbGVtZW50ICpnc3RfZGlyZWN0c291bmRfZGV2aWNlX2NyZWF0ZV9lbGVtZW50IChHc3REZXZpY2UgKiBkZXZpY2UsCisgICAgY29uc3QgZ2NoYXIgKiBuYW1lKTsKKworc3RhdGljIHZvaWQKK2dzdF9kaXJlY3Rzb3VuZF9kZXZpY2VfY2xhc3NfaW5pdCAoR3N0RGlyZWN0U291bmREZXZpY2VDbGFzcyAqIGtsYXNzKQoreworICBHc3REZXZpY2VDbGFzcyAqZGV2X2NsYXNzID0gR1NUX0RFVklDRV9DTEFTUyAoa2xhc3MpOworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisKKyAgZGV2X2NsYXNzLT5jcmVhdGVfZWxlbWVudCA9IGdzdF9kaXJlY3Rzb3VuZF9kZXZpY2VfY3JlYXRlX2VsZW1lbnQ7CisKKyAgb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfZGlyZWN0c291bmRfZGV2aWNlX2dldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfZGlyZWN0c291bmRfZGV2aWNlX3NldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF9kaXJlY3Rzb3VuZF9kZXZpY2VfZmluYWxpemU7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAob2JqZWN0X2NsYXNzLCBQUk9QX0RFVklDRV9HVUlELAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRldmljZS1ndWlkIiwgIkRldmljZSBHVUlEIiwKKyAgICAgICAgICAiRGV2aWNlIEdVSUQiLCBOVUxMLAorICAgICAgICAgIEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kaXJlY3Rzb3VuZF9kZXZpY2VfaW5pdCAoR3N0RGlyZWN0U291bmREZXZpY2UgKiBkZXZpY2UpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGlyZWN0c291bmRfZGV2aWNlX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3REaXJlY3RTb3VuZERldmljZSAqZGV2aWNlID0gR1NUX0RJUkVDVFNPVU5EX0RFVklDRSAob2JqZWN0KTsKKworICBnX2ZyZWUgKGRldmljZS0+Z3VpZCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKGdzdF9kaXJlY3Rzb3VuZF9kZXZpY2VfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK2dzdF9kaXJlY3Rzb3VuZF9kZXZpY2VfY3JlYXRlX2VsZW1lbnQgKEdzdERldmljZSAqIGRldmljZSwgY29uc3QgZ2NoYXIgKiBuYW1lKQoreworICBHc3REaXJlY3RTb3VuZERldmljZSAqZGlyZWN0c291bmRfZGV2ID0gR1NUX0RJUkVDVFNPVU5EX0RFVklDRSAoZGV2aWNlKTsKKyAgR3N0RWxlbWVudCAqZWxlbTsKKworI2lmZGVmIEdTVF9ESVJFQ1RTT1VORF9TUkNfREVWSUNFX1BST1ZJREVSCisgIGVsZW0gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJkaXJlY3Rzb3VuZHNyYyIsIG5hbWUpOworI2Vsc2UKKyAgZWxlbSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImRpcmVjdHNvdW5kc2luayIsIG5hbWUpOworI2VuZGlmCisKKyAgZ19vYmplY3Rfc2V0IChlbGVtLCAiZGV2aWNlIiwgZGlyZWN0c291bmRfZGV2LT5ndWlkLCBOVUxMKTsKKworICByZXR1cm4gZWxlbTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kaXJlY3Rzb3VuZF9kZXZpY2VfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdERpcmVjdFNvdW5kRGV2aWNlICpkZXZpY2UgPSBHU1RfRElSRUNUU09VTkRfREVWSUNFX0NBU1QgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFVklDRV9HVUlEOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgZGV2aWNlLT5ndWlkKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9kaXJlY3Rzb3VuZF9kZXZpY2Vfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdERpcmVjdFNvdW5kRGV2aWNlICpkZXZpY2UgPSBHU1RfRElSRUNUU09VTkRfREVWSUNFX0NBU1QgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFVklDRV9HVUlEOgorICAgICAgZGV2aWNlLT5ndWlkID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9zeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRkZXZpY2UuaCBiL3N5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZGRldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MDI4OTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRkZXZpY2UuaApAQCAtMCwwICsxLDc0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxOCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfRElSRUNUU09VTkRfREVWSUNFX0hfXworI2RlZmluZSBfX0dTVF9ESVJFQ1RTT1VORF9ERVZJQ0VfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK0dfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdERpcmVjdFNvdW5kRGV2aWNlUHJvdmlkZXIgR3N0RGlyZWN0U291bmREZXZpY2VQcm92aWRlcjsKK3R5cGVkZWYgc3RydWN0IF9Hc3REaXJlY3RTb3VuZERldmljZVByb3ZpZGVyQ2xhc3MgR3N0RGlyZWN0U291bmREZXZpY2VQcm92aWRlckNsYXNzOworCisjZGVmaW5lIEdTVF9UWVBFX0RJUkVDVFNPVU5EX0RFVklDRV9QUk9WSURFUiAgICAgICAgICAgICAgICAgKGdzdF9kaXJlY3Rzb3VuZF9kZXZpY2VfcHJvdmlkZXJfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0lTX0RJUkVDVFNPVU5EX0RFVklDRV9QUk9WSURFUihvYmopICAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9ESVJFQ1RTT1VORF9ERVZJQ0VfUFJPVklERVIpKQorI2RlZmluZSBHU1RfSVNfRElSRUNUU09VTkRfREVWSUNFX1BST1ZJREVSX0NMQVNTKGtsYXNzKSAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfRElSRUNUU09VTkRfREVWSUNFX1BST1ZJREVSKSkKKyNkZWZpbmUgR1NUX0RJUkVDVFNPVU5EX0RFVklDRV9QUk9WSURFUl9HRVRfQ0xBU1Mob2JqKSAgICAgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX0RJUkVDVFNPVU5EX0RFVklDRV9QUk9WSURFUiwgR3N0RGlyZWN0U291bmREZXZpY2VQcm92aWRlckNsYXNzKSkKKyNkZWZpbmUgR1NUX0RJUkVDVFNPVU5EX0RFVklDRV9QUk9WSURFUihvYmopICAgICAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9ESVJFQ1RTT1VORF9ERVZJQ0VfUFJPVklERVIsIEdzdERpcmVjdFNvdW5kRGV2aWNlUHJvdmlkZXIpKQorI2RlZmluZSBHU1RfRElSRUNUU09VTkRfREVWSUNFX1BST1ZJREVSX0NMQVNTKGtsYXNzKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfREVWSUNFX1BST1ZJREVSLCBHc3REaXJlY3RTb3VuZERldmljZVByb3ZpZGVyQ2xhc3MpKQorI2RlZmluZSBHU1RfRElSRUNUU09VTkRfREVWSUNFX1BST1ZJREVSX0NBU1Qob2JqKSAgICAgICAgICAgICgoR3N0RGlyZWN0U291bmREZXZpY2VQcm92aWRlciAqKShvYmopKQorCitzdHJ1Y3QgX0dzdERpcmVjdFNvdW5kRGV2aWNlUHJvdmlkZXIgeworICBHc3REZXZpY2VQcm92aWRlciBwYXJlbnQ7Cit9OworCitzdHJ1Y3QgX0dzdERpcmVjdFNvdW5kRGV2aWNlUHJvdmlkZXJDbGFzcyB7CisgIEdzdERldmljZVByb3ZpZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2RpcmVjdHNvdW5kX2RldmljZV9wcm92aWRlcl9nZXRfdHlwZSAodm9pZCk7CisKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdERpcmVjdFNvdW5kRGV2aWNlIEdzdERpcmVjdFNvdW5kRGV2aWNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdERpcmVjdFNvdW5kRGV2aWNlQ2xhc3MgR3N0RGlyZWN0U291bmREZXZpY2VDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9ESVJFQ1RTT1VORF9ERVZJQ0UgICAgICAgICAgICAgICAgIChnc3RfZGlyZWN0c291bmRfZGV2aWNlX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9JU19ESVJFQ1RTT1VORF9ERVZJQ0Uob2JqKSAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfRElSRUNUU09VTkRfREVWSUNFKSkKKyNkZWZpbmUgR1NUX0lTX0RJUkVDVFNPVU5EX0RFVklDRV9DTEFTUyhrbGFzcykgICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX0RJUkVDVFNPVU5EX0RFVklDRSkpCisjZGVmaW5lIEdTVF9ESVJFQ1RTT1VORF9ERVZJQ0VfR0VUX0NMQVNTKG9iaikgICAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9ESVJFQ1RTT1VORF9ERVZJQ0UsIEdzdERpcmVjdFNvdW5kRGV2aWNlQ2xhc3MpKQorI2RlZmluZSBHU1RfRElSRUNUU09VTkRfREVWSUNFKG9iaikgICAgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX0RJUkVDVFNPVU5EX0RFVklDRSwgR3N0RGlyZWN0U291bmREZXZpY2UpKQorI2RlZmluZSBHU1RfRElSRUNUU09VTkRfREVWSUNFX0NMQVNTKGtsYXNzKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfREVWSUNFLCBHc3REaXJlY3RTb3VuZERldmljZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0RJUkVDVFNPVU5EX0RFVklDRV9DQVNUKG9iaikgICAgICAgICAgICAoKEdzdERpcmVjdFNvdW5kRGV2aWNlICopKG9iaikpCisKK3N0cnVjdCBfR3N0RGlyZWN0U291bmREZXZpY2UgeworICBHc3REZXZpY2UgcGFyZW50OworCisgIGdjaGFyICpndWlkOworfTsKKworc3RydWN0IF9Hc3REaXJlY3RTb3VuZERldmljZUNsYXNzIHsKKyAgR3N0RGV2aWNlQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X2RpcmVjdHNvdW5kX2RldmljZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9ESVJFQ1RTT1VORF9ERVZJQ0VfSF9fICovCmRpZmYgLS1naXQgYS9zeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRwbHVnaW4uYyBiL3N5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHBsdWdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYTdmMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRwbHVnaW4uYwpAQCAtMCwwICsxLDUzIEBACisvKiBHU3RyZWFtZXIKKyogQ29weXJpZ2h0IChDKSAyMDA1IFNlYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorKiBDb3B5cmlnaHQgKEMpIDIwMDcgUGlvbmVlcnMgb2YgdGhlIEluZXZpdGFibGUgPHNvbmdiaXJkQHNvbmdiaXJkbmVzdC5jb20+CisqCisqIGdzdGRpcmVjdHNvdW5kcGx1Z2luLmM6CisqCisqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisqIAorKgorKiBUaGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIHdhcyBtYWRlIHBvc3NpYmxlIGR1ZSB0byB0aGUgaW52b2x2ZW1lbnQKKyogb2YgUGlvbmVlcnMgb2YgdGhlIEluZXZpdGFibGUsIHRoZSBjcmVhdG9ycyBvZiB0aGUgU29uZ2JpcmQgTXVzaWMgcGxheWVyCisqCisqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3RkaXJlY3Rzb3VuZHNpbmsuaCIKKyNpbmNsdWRlICJnc3RkaXJlY3Rzb3VuZGRldmljZS5oIgorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImRpcmVjdHNvdW5kc2luayIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICAgR1NUX1RZUEVfRElSRUNUU09VTkRfU0lOSykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghZ3N0X2RldmljZV9wcm92aWRlcl9yZWdpc3RlciAocGx1Z2luLCAiZGlyZWN0c291bmRzaW5rZGV2aWNlcHJvdmlkZXIiLAorICAgICAgICAgIEdTVF9SQU5LX1BSSU1BUlksIEdTVF9UWVBFX0RJUkVDVFNPVU5EX0RFVklDRV9QUk9WSURFUikpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgZGlyZWN0c291bmQsCisgICAgIkRpcmVjdCBTb3VuZCBwbHVnaW4gbGlicmFyeSIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKQpkaWZmIC0tZ2l0IGEvc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jIGIvc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZGExODYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvZGlyZWN0c291bmQvZ3N0ZGlyZWN0c291bmRzaW5rLmMKQEAgLTAsMCArMSwxMDUwIEBACisvKiBHU3RyZWFtZXIKKyogQ29weXJpZ2h0IChDKSAyMDA1IFNlYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorKiBDb3B5cmlnaHQgKEMpIDIwMDcgUGlvbmVlcnMgb2YgdGhlIEluZXZpdGFibGUgPHNvbmdiaXJkQHNvbmdiaXJkbmVzdC5jb20+CisqIENvcHlyaWdodCAoQykgMjAxMCBGbHVlbmRvIFMuQS4gPHN1cHBvcnRAZmx1ZW5kby5jb20+CisqCisqIGdzdGRpcmVjdHNvdW5kc2luay5jOgorKgorKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKgorKgorKiBUaGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIHdhcyBtYWRlIHBvc3NpYmxlIGR1ZSB0byB0aGUgaW52b2x2ZW1lbnQKKyogb2YgUGlvbmVlcnMgb2YgdGhlIEluZXZpdGFibGUsIHRoZSBjcmVhdG9ycyBvZiB0aGUgU29uZ2JpcmQgTXVzaWMgcGxheWVyCisqCisqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC1kaXJlY3Rzb3VuZHNpbmsKKyAqCisgKiBUaGlzIGVsZW1lbnQgbGV0cyB5b3Ugb3V0cHV0IHNvdW5kIHVzaW5nIHRoZSBEaXJlY3RTb3VuZCBBUEkuCisgKgorICogTm90ZSB0aGF0IHlvdSBzaG91bGQgYWxtb3N0IGFsd2F5cyB1c2UgZ2VuZXJpYyBhdWRpbyBjb252ZXJzaW9uIGVsZW1lbnRzCisgKiBsaWtlIGF1ZGlvY29udmVydCBhbmQgYXVkaW9yZXNhbXBsZSBpbiBmcm9udCBvZiBhbiBhdWRpb3NpbmsgdG8gbWFrZSBzdXJlCisgKiB5b3VyIHBpcGVsaW5lIHdvcmtzIHVuZGVyIGFsbCBjaXJjdW1zdGFuY2VzICh0aG9zZSBjb252ZXJzaW9uIGVsZW1lbnRzIHdpbGwKKyAqIGFjdCBpbiBwYXNzdGhyb3VnaC1tb2RlIGlmIG5vIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5KS4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyAhIGF1ZGlvY29udmVydCAhIHZvbHVtZSB2b2x1bWU9MC4xICEgZGlyZWN0c291bmRzaW5rCisgKiBdfCB3aWxsIG91dHB1dCBhIHNpbmUgd2F2ZSAoY29udGludW91cyBiZWVwIHNvdW5kKSB0byB5b3VyIHNvdW5kIGNhcmQgKHdpdGgKKyAqIGEgdmVyeSBsb3cgdm9sdW1lIGFzIHByZWNhdXRpb24pLgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGZpbGVzcmMgbG9jYXRpb249bXVzaWMub2dnICEgZGVjb2RlYmluICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIGRpcmVjdHNvdW5kc2luaworICogXXwgd2lsbCBwbGF5IGFuIE9nZy9Wb3JiaXMgYXVkaW8gZmlsZSBhbmQgb3V0cHV0IGl0LgorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNlc2luay5oPgorI2luY2x1ZGUgImdzdGRpcmVjdHNvdW5kc2luay5oIgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2llYzYxOTM3Lmg+CisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpZmRlZiBfX0NZR1dJTl9fCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaWZuZGVmIF9zd2FiCisjZGVmaW5lIF9zd2FiIHN3YWIKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgREVGQVVMVF9NVVRFIEZBTFNFCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGRpcmVjdHNvdW5kc2lua19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBkaXJlY3Rzb3VuZHNpbmtfZGVidWcKKworc3RhdGljIHZvaWQgZ3N0X2RpcmVjdHNvdW5kX3NpbmtfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3RfZGlyZWN0c291bmRfc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfZGlyZWN0c291bmRfc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBHc3RDYXBzICpnc3RfZGlyZWN0c291bmRfc2lua19nZXRjYXBzIChHc3RCYXNlU2luayAqIGJzaW5rLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X2RpcmVjdHNvdW5kX3NpbmtfcGF5bG9hZCAoR3N0QXVkaW9CYXNlU2luayAqIHNpbmssCisgICAgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZGlyZWN0c291bmRfc2lua19wcmVwYXJlIChHc3RBdWRpb1NpbmsgKiBhc2luaywKKyAgICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2RpcmVjdHNvdW5kX3NpbmtfdW5wcmVwYXJlIChHc3RBdWRpb1NpbmsgKiBhc2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X2RpcmVjdHNvdW5kX3Npbmtfb3BlbiAoR3N0QXVkaW9TaW5rICogYXNpbmspOworc3RhdGljIGdib29sZWFuIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX2Nsb3NlIChHc3RBdWRpb1NpbmsgKiBhc2luayk7CitzdGF0aWMgZ2ludCBnc3RfZGlyZWN0c291bmRfc2lua193cml0ZSAoR3N0QXVkaW9TaW5rICogYXNpbmssCisgICAgZ3BvaW50ZXIgZGF0YSwgZ3VpbnQgbGVuZ3RoKTsKK3N0YXRpYyBndWludCBnc3RfZGlyZWN0c291bmRfc2lua19kZWxheSAoR3N0QXVkaW9TaW5rICogYXNpbmspOworc3RhdGljIHZvaWQgZ3N0X2RpcmVjdHNvdW5kX3NpbmtfcmVzZXQgKEdzdEF1ZGlvU2luayAqIGFzaW5rKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfZGlyZWN0c291bmRfcHJvYmVfc3VwcG9ydGVkX2Zvcm1hdHMgKEdzdERpcmVjdFNvdW5kU2luayAqCisgICAgZHNvdW5kc2luaywgY29uc3QgR3N0Q2FwcyAqIHRlbXBsYXRlX2NhcHMpOworc3RhdGljIGdib29sZWFuIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX3F1ZXJ5IChHc3RCYXNlU2luayAqIHBhZCwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworc3RhdGljIHZvaWQgZ3N0X2RpcmVjdHNvdW5kX3Npbmtfc2V0X3ZvbHVtZSAoR3N0RGlyZWN0U291bmRTaW5rICogc2luaywKKyAgICBnZG91YmxlIHZvbHVtZSwgZ2Jvb2xlYW4gc3RvcmUpOworc3RhdGljIGdkb3VibGUgZ3N0X2RpcmVjdHNvdW5kX3NpbmtfZ2V0X3ZvbHVtZSAoR3N0RGlyZWN0U291bmRTaW5rICogc2luayk7CitzdGF0aWMgdm9pZCBnc3RfZGlyZWN0c291bmRfc2lua19zZXRfbXV0ZSAoR3N0RGlyZWN0U291bmRTaW5rICogc2luaywKKyAgICBnYm9vbGVhbiBtdXRlKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfZGlyZWN0c291bmRfc2lua19nZXRfbXV0ZSAoR3N0RGlyZWN0U291bmRTaW5rICogc2luayk7CitzdGF0aWMgY29uc3QgZ2NoYXIgKmdzdF9kaXJlY3Rzb3VuZF9zaW5rX2dldF9kZXZpY2UgKEdzdERpcmVjdFNvdW5kU2luayAqCisgICAgZHNvdW5kc2luayk7CitzdGF0aWMgdm9pZCBnc3RfZGlyZWN0c291bmRfc2lua19zZXRfZGV2aWNlIChHc3REaXJlY3RTb3VuZFNpbmsgKiBkc291bmRzaW5rLAorICAgIGNvbnN0IGdjaGFyICogZGV2aWNlX2lkKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX2lzX3NwZGlmX2Zvcm1hdCAoR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqCisgICAgc3BlYyk7CisKK3N0YXRpYyBnY2hhciAqZ3N0X2hyZXNfdG9fc3RyaW5nIChIUkVTVUxUIGhSZXMpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZGlyZWN0c291bmRzaW5rX3NpbmtfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9ESVJFQ1RTT1VORF9TSU5LX0NBUFMpKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfVk9MVU1FLAorICBQUk9QX01VVEUsCisgIFBST1BfREVWSUNFCit9OworCisjZGVmaW5lIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3REaXJlY3RTb3VuZFNpbmssIGdzdF9kaXJlY3Rzb3VuZF9zaW5rLAorICAgIEdTVF9UWVBFX0FVRElPX1NJTkssIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfU1RSRUFNX1ZPTFVNRSwgTlVMTCkKKyAgICApOworCitzdGF0aWMgdm9pZAorZ3N0X2RpcmVjdHNvdW5kX3NpbmtfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdERpcmVjdFNvdW5kU2luayAqZHNvdW5kc2luayA9IEdTVF9ESVJFQ1RTT1VORF9TSU5LIChvYmplY3QpOworCisgIGdfZnJlZSAoZHNvdW5kc2luay0+ZGV2aWNlX2lkKTsKKyAgZHNvdW5kc2luay0+ZGV2aWNlX2lkID0gTlVMTDsKKworICBnX211dGV4X2NsZWFyICgmZHNvdW5kc2luay0+ZHNvdW5kX2xvY2spOworICBnc3Rfb2JqZWN0X3VucmVmIChkc291bmRzaW5rLT5zeXN0ZW1fY2xvY2spOworICBpZiAoZHNvdW5kc2luay0+d3JpdGVfd2FpdF9jbG9ja19pZCAhPSBOVUxMKSB7CisgICAgZ3N0X2Nsb2NrX2lkX3VucmVmIChkc291bmRzaW5rLT53cml0ZV93YWl0X2Nsb2NrX2lkKTsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kaXJlY3Rzb3VuZF9zaW5rX2NsYXNzX2luaXQgKEdzdERpcmVjdFNvdW5kU2lua0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIEdzdEJhc2VTaW5rQ2xhc3MgKmdzdGJhc2VzaW5rX2NsYXNzID0gR1NUX0JBU0VfU0lOS19DTEFTUyAoa2xhc3MpOworICBHc3RBdWRpb1NpbmtDbGFzcyAqZ3N0YXVkaW9zaW5rX2NsYXNzID0gR1NUX0FVRElPX1NJTktfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QXVkaW9CYXNlU2lua0NsYXNzICpnc3RhdWRpb2Jhc2VzaW5rX2NsYXNzID0KKyAgICAgIEdTVF9BVURJT19CQVNFX1NJTktfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZGlyZWN0c291bmRzaW5rX2RlYnVnLCAiZGlyZWN0c291bmRzaW5rIiwgMCwKKyAgICAgICJEaXJlY3RTb3VuZCBzaW5rIik7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfZGlyZWN0c291bmRfc2lua19maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X2RpcmVjdHNvdW5kX3Npbmtfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfZGlyZWN0c291bmRfc2lua19nZXRfcHJvcGVydHk7CisKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPmdldF9jYXBzID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGlyZWN0c291bmRfc2lua19nZXRjYXBzKTsKKworICBnc3RiYXNlc2lua19jbGFzcy0+cXVlcnkgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RpcmVjdHNvdW5kX3NpbmtfcXVlcnkpOworCisgIGdzdGF1ZGlvYmFzZXNpbmtfY2xhc3MtPnBheWxvYWQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kaXJlY3Rzb3VuZF9zaW5rX3BheWxvYWQpOworCisgIGdzdGF1ZGlvc2lua19jbGFzcy0+cHJlcGFyZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RpcmVjdHNvdW5kX3NpbmtfcHJlcGFyZSk7CisgIGdzdGF1ZGlvc2lua19jbGFzcy0+dW5wcmVwYXJlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGlyZWN0c291bmRfc2lua191bnByZXBhcmUpOworICBnc3RhdWRpb3NpbmtfY2xhc3MtPm9wZW4gPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RpcmVjdHNvdW5kX3Npbmtfb3Blbik7CisgIGdzdGF1ZGlvc2lua19jbGFzcy0+Y2xvc2UgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RpcmVjdHNvdW5kX3NpbmtfY2xvc2UpOworICBnc3RhdWRpb3NpbmtfY2xhc3MtPndyaXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9kaXJlY3Rzb3VuZF9zaW5rX3dyaXRlKTsKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzLT5kZWxheSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfZGlyZWN0c291bmRfc2lua19kZWxheSk7CisgIGdzdGF1ZGlvc2lua19jbGFzcy0+cmVzZXQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X2RpcmVjdHNvdW5kX3NpbmtfcmVzZXQpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1ZPTFVNRSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJ2b2x1bWUiLCAiVm9sdW1lIiwKKyAgICAgICAgICAiVm9sdW1lIG9mIHRoaXMgc3RyZWFtIiwgMC4wLCAxLjAsIDEuMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9NVVRFLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJtdXRlIiwgIk11dGUiLAorICAgICAgICAgICJNdXRlIHN0YXRlIG9mIHRoaXMgc3RyZWFtIiwgREVGQVVMVF9NVVRFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX0RFVklDRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJkZXZpY2UiLCAiRGV2aWNlIiwKKyAgICAgICAgICAiRGlyZWN0U291bmQgcGxheWJhY2sgZGV2aWNlIGFzIGEgR1VJRCBzdHJpbmciLAorICAgICAgICAgIE5VTEwsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiRGlyZWN0IFNvdW5kIEF1ZGlvIFNpbmsiLCAiU2luay9BdWRpbyIsCisgICAgICAiT3V0cHV0IHRvIGEgc291bmQgY2FyZCB2aWEgRGlyZWN0IFNvdW5kIiwKKyAgICAgICJTZWJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4iKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgICZkaXJlY3Rzb3VuZHNpbmtfc2lua19mYWN0b3J5KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kaXJlY3Rzb3VuZF9zaW5rX2luaXQgKEdzdERpcmVjdFNvdW5kU2luayAqIGRzb3VuZHNpbmspCit7CisgIGRzb3VuZHNpbmstPnZvbHVtZSA9IDEwMDsKKyAgZHNvdW5kc2luay0+bXV0ZSA9IEZBTFNFOworICBkc291bmRzaW5rLT5kZXZpY2VfaWQgPSBOVUxMOworICBkc291bmRzaW5rLT5wRFMgPSBOVUxMOworICBkc291bmRzaW5rLT5jYWNoZWRfY2FwcyA9IE5VTEw7CisgIGRzb3VuZHNpbmstPnBEU0JTZWNvbmRhcnkgPSBOVUxMOworICBkc291bmRzaW5rLT5jdXJyZW50X2NpcmN1bGFyX29mZnNldCA9IDA7CisgIGRzb3VuZHNpbmstPmJ1ZmZlcl9zaXplID0gRFNCU0laRV9NSU47CisgIGdfbXV0ZXhfaW5pdCAoJmRzb3VuZHNpbmstPmRzb3VuZF9sb2NrKTsKKyAgZHNvdW5kc2luay0+c3lzdGVtX2Nsb2NrID0gZ3N0X3N5c3RlbV9jbG9ja19vYnRhaW4gKCk7CisgIGRzb3VuZHNpbmstPndyaXRlX3dhaXRfY2xvY2tfaWQgPSBOVUxMOworICBkc291bmRzaW5rLT5maXJzdF9idWZmZXJfYWZ0ZXJfcmVzZXQgPSBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kaXJlY3Rzb3VuZF9zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3REaXJlY3RTb3VuZFNpbmsgKnNpbmsgPSBHU1RfRElSRUNUU09VTkRfU0lOSyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfVk9MVU1FOgorICAgICAgZ3N0X2RpcmVjdHNvdW5kX3Npbmtfc2V0X3ZvbHVtZSAoc2luaywgZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSksIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX01VVEU6CisgICAgICBnc3RfZGlyZWN0c291bmRfc2lua19zZXRfbXV0ZSAoc2luaywgZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERVZJQ0U6CisgICAgICBnc3RfZGlyZWN0c291bmRfc2lua19zZXRfZGV2aWNlIChzaW5rLCBnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGlyZWN0c291bmRfc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0RGlyZWN0U291bmRTaW5rICpzaW5rID0gR1NUX0RJUkVDVFNPVU5EX1NJTksgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX1ZPTFVNRToKKyAgICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAodmFsdWUsIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX2dldF92b2x1bWUgKHNpbmspKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NVVRFOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX2dldF9tdXRlIChzaW5rKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfREVWSUNFOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgZ3N0X2RpcmVjdHNvdW5kX3NpbmtfZ2V0X2RldmljZSAoc2luaykpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfZGlyZWN0c291bmRfc2lua19nZXRjYXBzIChHc3RCYXNlU2luayAqIGJzaW5rLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisgIEdzdFBhZFRlbXBsYXRlICpwYWRfdGVtcGxhdGU7CisgIEdzdERpcmVjdFNvdW5kU2luayAqZHNvdW5kc2luayA9IEdTVF9ESVJFQ1RTT1VORF9TSU5LIChic2luayk7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgaWYgKGRzb3VuZHNpbmstPnBEUyA9PSBOVUxMKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZHNvdW5kc2luaywgImRldmljZSBub3Qgb3BlbiwgdXNpbmcgdGVtcGxhdGUgY2FwcyIpOworICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBiYXNlIGNsYXNzIHdpbGwgZ2V0IHRlbXBsYXRlIGNhcHMgZm9yIHVzICovCisgIH0KKworICBpZiAoZHNvdW5kc2luay0+Y2FjaGVkX2NhcHMpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfcmVmIChkc291bmRzaW5rLT5jYWNoZWRfY2Fwcyk7CisgIH0gZWxzZSB7CisgICAgZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0dFVF9DTEFTUyAoZHNvdW5kc2luayk7CisgICAgcGFkX3RlbXBsYXRlID0gZ3N0X2VsZW1lbnRfY2xhc3NfZ2V0X3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgInNpbmsiKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCAocGFkX3RlbXBsYXRlICE9IE5VTEwsIE5VTEwpOworCisgICAgY2FwcyA9IGdzdF9kaXJlY3Rzb3VuZF9wcm9iZV9zdXBwb3J0ZWRfZm9ybWF0cyAoZHNvdW5kc2luaywKKyAgICAgICAgZ3N0X3BhZF90ZW1wbGF0ZV9nZXRfY2FwcyAocGFkX3RlbXBsYXRlKSk7CisgICAgaWYgKGNhcHMpCisgICAgICBkc291bmRzaW5rLT5jYWNoZWRfY2FwcyA9IGdzdF9jYXBzX3JlZiAoY2Fwcyk7CisgIH0KKworICBpZiAoY2FwcyAmJiBmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICp0bXAgPQorICAgICAgICBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCBjYXBzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICBjYXBzID0gdG1wOworICB9CisKKyAgaWYgKGNhcHMpIHsKKyAgICBnY2hhciAqY2Fwc19zdHJpbmcgPSBnc3RfY2Fwc190b19zdHJpbmcgKGNhcHMpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRzb3VuZHNpbmssICJyZXR1cm5pbmcgY2FwcyAlcyIsIGNhcHNfc3RyaW5nKTsKKyAgICBnX2ZyZWUgKGNhcHNfc3RyaW5nKTsKKyAgfQorCisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kaXJlY3Rzb3VuZF9zaW5rX2FjY2VwdGNhcHMgKEdzdEJhc2VTaW5rICogc2luaywgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0RGlyZWN0U291bmRTaW5rICpkc2luayA9IEdTVF9ESVJFQ1RTT1VORF9TSU5LIChzaW5rKTsKKyAgR3N0UGFkICpwYWQ7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdENhcHMgKnBhZF9jYXBzOworICBHc3RTdHJ1Y3R1cmUgKnN0OworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKyAgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyBzcGVjID0geyAwIH07CisKKyAgaWYgKEdfVU5MSUtFTFkgKGRzaW5rID09IE5VTEwpKQorICAgIHJldHVybiBGQUxTRTsKKworICBwYWQgPSBzaW5rLT5zaW5rcGFkOworCisgIGdzdF9xdWVyeV9wYXJzZV9hY2NlcHRfY2FwcyAocXVlcnksICZjYXBzKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAocGFkLCAiY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgcGFkX2NhcHMgPSBnc3RfcGFkX3F1ZXJ5X2NhcHMgKHBhZCwgTlVMTCk7CisgIGlmIChwYWRfY2FwcykgeworICAgIGdib29sZWFuIGNyZXQgPSBnc3RfY2Fwc19pc19zdWJzZXQgKGNhcHMsIHBhZF9jYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAocGFkX2NhcHMpOworICAgIGlmICghY3JldCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHNpbmssCisgICAgICAgICAgIkNhcHMgYXJlIG5vdCBhIHN1YnNldCBvZiB0aGUgcGFkIGNhcHMsIG5vdCBhY2NlcHRpbmcgY2FwcyIpOworICAgICAgZ290byBkb25lOworICAgIH0KKyAgfQorCisgIC8qIElmIHdlJ3ZlIG5vdCBnb3QgZml4ZWQgY2FwcywgY3JlYXRpbmcgYSBzdHJlYW0gbWlnaHQgZmFpbCwgc28gbGV0J3MganVzdAorICAgKiByZXR1cm4gZnJvbSBoZXJlIHdpdGggZGVmYXVsdCBhY2NlcHRjYXBzIGJlaGF2aW91ciAqLworICBpZiAoIWdzdF9jYXBzX2lzX2ZpeGVkIChjYXBzKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRzaW5rLCAiQ2FwcyBhcmUgbm90IGZpeGVkLCBub3QgYWNjZXB0aW5nIGNhcHMiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBzcGVjLmxhdGVuY3lfdGltZSA9IEdTVF9TRUNPTkQ7CisgIGlmICghZ3N0X2F1ZGlvX3JpbmdfYnVmZmVyX3BhcnNlX2NhcHMgKCZzcGVjLCBjYXBzKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRzaW5rLCAiRmFpbGVkIHRvIHBhcnNlIGNhcHMsIG5vdCBhY2NlcHRpbmciKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiBNYWtlIHN1cmUgaW5wdXQgaXMgZnJhbWVkIChvbmUgZnJhbWUgcGVyIGJ1ZmZlcikgYW5kIGNhbiBiZSBwYXlsb2FkZWQgKi8KKyAgc3dpdGNoIChzcGVjLnR5cGUpIHsKKyAgICBjYXNlIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9BQzM6CisgICAgY2FzZSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfRFRTOgorICAgIHsKKyAgICAgIGdib29sZWFuIGZyYW1lZCA9IEZBTFNFLCBwYXJzZWQgPSBGQUxTRTsKKyAgICAgIHN0ID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2Jvb2xlYW4gKHN0LCAiZnJhbWVkIiwgJmZyYW1lZCk7CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9ib29sZWFuIChzdCwgInBhcnNlZCIsICZwYXJzZWQpOworICAgICAgaWYgKCghZnJhbWVkICYmICFwYXJzZWQpIHx8IGdzdF9hdWRpb19pZWM2MTkzN19mcmFtZV9zaXplICgmc3BlYykgPD0gMCkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChkc2luaywgIldyb25nIEFDMy9EVFMgY2Fwcywgbm90IGFjY2VwdGluZyIpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXQgPSBUUlVFOworICBHU1RfREVCVUdfT0JKRUNUIChkc2luaywgIkFjY2VwdGluZyBjYXBzIik7CisKK2RvbmU6CisgIGdzdF9xdWVyeV9zZXRfYWNjZXB0X2NhcHNfcmVzdWx0IChxdWVyeSwgcmV0KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RpcmVjdHNvdW5kX3NpbmtfcXVlcnkgKEdzdEJhc2VTaW5rICogc2luaywgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgZ2Jvb2xlYW4gcmVzID0gVFJVRTsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9BQ0NFUFRfQ0FQUzoKKyAgICAgIHJlcyA9IGdzdF9kaXJlY3Rzb3VuZF9zaW5rX2FjY2VwdGNhcHMgKHNpbmssIHF1ZXJ5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXMgPSBHU1RfQkFTRV9TSU5LX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5xdWVyeSAoc2luaywgcXVlcnkpOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIExQR1VJRAorc3RyaW5nX3RvX2d1aWQgKGNvbnN0IGdjaGFyICogc3RyKQoreworICBIUkVTVUxUIHJldDsKKyAgZ3VuaWNoYXIyICp3c3RyOworICBMUEdVSUQgb3V0OworCisgIHdzdHIgPSBnX3V0ZjhfdG9fdXRmMTYgKHN0ciwgLTEsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoIXdzdHIpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgb3V0ID0gZ19uZXcgKEdVSUQsIDEpOworICByZXQgPSBDTFNJREZyb21TdHJpbmcgKChMUE9MRVNUUikgd3N0ciwgb3V0KTsKKyAgZ19mcmVlICh3c3RyKTsKKyAgaWYgKHJldCAhPSBOT0VSUk9SKSB7CisgICAgZ19mcmVlIChvdXQpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIG91dDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZGlyZWN0c291bmRfc2lua19vcGVuIChHc3RBdWRpb1NpbmsgKiBhc2luaykKK3sKKyAgR3N0RGlyZWN0U291bmRTaW5rICpkc291bmRzaW5rOworICBIUkVTVUxUIGhSZXM7CisgIExQR1VJRCBscEd1aWQgPSBOVUxMOworCisgIGRzb3VuZHNpbmsgPSBHU1RfRElSRUNUU09VTkRfU0lOSyAoYXNpbmspOworCisgIGlmIChkc291bmRzaW5rLT5kZXZpY2VfaWQpIHsKKyAgICBscEd1aWQgPSBzdHJpbmdfdG9fZ3VpZCAoZHNvdW5kc2luay0+ZGV2aWNlX2lkKTsKKyAgICBpZiAobHBHdWlkID09IE5VTEwpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkc291bmRzaW5rLCBSRVNPVVJDRSwgT1BFTl9SRUFELAorICAgICAgICAgICgiZGV2aWNlIHNldCBidXQgZ3VpZCBub3QgZm91bmQ6ICVzIiwgZHNvdW5kc2luay0+ZGV2aWNlX2lkKSwgKE5VTEwpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKworICAvKiBjcmVhdGUgYW5kIGluaXRpYWxpemUgYSBEaXJlY3RTb3VuZCBvYmplY3QgKi8KKyAgaWYgKEZBSUxFRCAoaFJlcyA9IERpcmVjdFNvdW5kQ3JlYXRlIChscEd1aWQsICZkc291bmRzaW5rLT5wRFMsIE5VTEwpKSkgeworICAgIGdjaGFyICplcnJvcl90ZXh0ID0gZ3N0X2hyZXNfdG9fc3RyaW5nIChoUmVzKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZHNvdW5kc2luaywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwKKyAgICAgICAgKCJEaXJlY3RTb3VuZENyZWF0ZTogJXMiLCBlcnJvcl90ZXh0KSwgKE5VTEwpKTsKKyAgICBnX2ZyZWUgKGxwR3VpZCk7CisgICAgZ19mcmVlIChlcnJvcl90ZXh0KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBnX2ZyZWUgKGxwR3VpZCk7CisKKyAgaWYgKEZBSUxFRCAoaFJlcyA9IElEaXJlY3RTb3VuZF9TZXRDb29wZXJhdGl2ZUxldmVsIChkc291bmRzaW5rLT5wRFMsCisgICAgICAgICAgICAgIEdldERlc2t0b3BXaW5kb3cgKCksIERTU0NMX1BSSU9SSVRZKSkpIHsKKyAgICBnY2hhciAqZXJyb3JfdGV4dCA9IGdzdF9ocmVzX3RvX3N0cmluZyAoaFJlcyk7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKGRzb3VuZHNpbmssIFJFU09VUkNFLCBPUEVOX1JFQUQsCisgICAgICAgICgiSURpcmVjdFNvdW5kX1NldENvb3BlcmF0aXZlTGV2ZWw6ICVzIiwgZXJyb3JfdGV4dCksIChOVUxMKSk7CisgICAgZ19mcmVlIChlcnJvcl90ZXh0KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfZGlyZWN0c291bmRfc2lua19pc19zcGRpZl9mb3JtYXQgKEdzdEF1ZGlvUmluZ0J1ZmZlclNwZWMgKiBzcGVjKQoreworICByZXR1cm4gc3BlYy0+dHlwZSA9PSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfQUMzIHx8CisgICAgICBzcGVjLT50eXBlID09IEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9EVFM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RpcmVjdHNvdW5kX3NpbmtfcHJlcGFyZSAoR3N0QXVkaW9TaW5rICogYXNpbmssCisgICAgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpCit7CisgIEdzdERpcmVjdFNvdW5kU2luayAqZHNvdW5kc2luazsKKyAgSFJFU1VMVCBoUmVzOworICBEU0JVRkZFUkRFU0MgZGVzY1NlY29uZGFyeTsKKyAgV0FWRUZPUk1BVEVYIHdmeDsKKworICBkc291bmRzaW5rID0gR1NUX0RJUkVDVFNPVU5EX1NJTksgKGFzaW5rKTsKKworICAvKnNhdmUgbnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUgYW5kIGJ1ZmZlciBmb3JtYXQgKi8KKyAgZHNvdW5kc2luay0+Ynl0ZXNfcGVyX3NhbXBsZSA9IHNwZWMtPmluZm8uYnBmOworICBkc291bmRzaW5rLT50eXBlID0gc3BlYy0+dHlwZTsKKworICAvKiBmaWxsIHRoZSBXQVZFRk9STUFURVggc3RydWN0dXJlIHdpdGggc3BlYyBwYXJhbXMgKi8KKyAgbWVtc2V0ICgmd2Z4LCAwLCBzaXplb2YgKHdmeCkpOworICBpZiAoIWdzdF9kaXJlY3Rzb3VuZF9zaW5rX2lzX3NwZGlmX2Zvcm1hdCAoc3BlYykpIHsKKyAgICB3ZnguY2JTaXplID0gc2l6ZW9mICh3ZngpOworICAgIHdmeC53Rm9ybWF0VGFnID0gV0FWRV9GT1JNQVRfUENNOworICAgIHdmeC5uQ2hhbm5lbHMgPSBzcGVjLT5pbmZvLmNoYW5uZWxzOworICAgIHdmeC5uU2FtcGxlc1BlclNlYyA9IHNwZWMtPmluZm8ucmF0ZTsKKyAgICB3Zngud0JpdHNQZXJTYW1wbGUgPSAoc3BlYy0+aW5mby5icGYgKiA4KSAvIHdmeC5uQ2hhbm5lbHM7CisgICAgd2Z4Lm5CbG9ja0FsaWduID0gc3BlYy0+aW5mby5icGY7CisgICAgd2Z4Lm5BdmdCeXRlc1BlclNlYyA9IHdmeC5uU2FtcGxlc1BlclNlYyAqIHdmeC5uQmxvY2tBbGlnbjsKKworICAgIC8qIENyZWF0ZSBkaXJlY3Rzb3VuZCBidWZmZXIgd2l0aCBzaXplIGJhc2VkIG9uIG91ciBjb25maWd1cmVkCisgICAgICogYnVmZmVyX3NpemUgKHdoaWNoIGlzIDIwMCBtcyBieSBkZWZhdWx0KSAqLworICAgIGRzb3VuZHNpbmstPmJ1ZmZlcl9zaXplID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAod2Z4Lm5BdmdCeXRlc1BlclNlYywgc3BlYy0+YnVmZmVyX3RpbWUsCisgICAgICAgIEdTVF9NU0VDT05EKTsKKyAgICAvKiBNYWtlIHN1cmUgd2UgbWFrZSB0aG9zZSBudW1iZXJzIG11bHRpcGxlIG9mIG91ciBzYW1wbGUgc2l6ZSBpbiBieXRlcyAqLworICAgIGRzb3VuZHNpbmstPmJ1ZmZlcl9zaXplIC09IGRzb3VuZHNpbmstPmJ1ZmZlcl9zaXplICUgc3BlYy0+aW5mby5icGY7CisKKyAgICBzcGVjLT5zZWdzaXplID0KKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAod2Z4Lm5BdmdCeXRlc1BlclNlYywgc3BlYy0+bGF0ZW5jeV90aW1lLAorICAgICAgICBHU1RfTVNFQ09ORCk7CisgICAgc3BlYy0+c2Vnc2l6ZSAtPSBzcGVjLT5zZWdzaXplICUgc3BlYy0+aW5mby5icGY7CisgICAgc3BlYy0+c2VndG90YWwgPSBkc291bmRzaW5rLT5idWZmZXJfc2l6ZSAvIHNwZWMtPnNlZ3NpemU7CisgIH0gZWxzZSB7CisjaWZkZWYgV0FWRV9GT1JNQVRfRE9MQllfQUMzX1NQRElGCisgICAgd2Z4LmNiU2l6ZSA9IDA7CisgICAgd2Z4LndGb3JtYXRUYWcgPSBXQVZFX0ZPUk1BVF9ET0xCWV9BQzNfU1BESUY7CisgICAgd2Z4Lm5DaGFubmVscyA9IDI7CisgICAgd2Z4Lm5TYW1wbGVzUGVyU2VjID0gNDgwMDA7CisgICAgd2Z4LndCaXRzUGVyU2FtcGxlID0gMTY7CisgICAgd2Z4Lm5CbG9ja0FsaWduID0gd2Z4LndCaXRzUGVyU2FtcGxlIC8gOCAqIHdmeC5uQ2hhbm5lbHM7CisgICAgd2Z4Lm5BdmdCeXRlc1BlclNlYyA9IHdmeC5uU2FtcGxlc1BlclNlYyAqIHdmeC5uQmxvY2tBbGlnbjsKKworICAgIHNwZWMtPnNlZ3NpemUgPSA2MTQ0OworICAgIHNwZWMtPnNlZ3RvdGFsID0gMTA7CisjZWxzZQorICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworI2VuZGlmCisgIH0KKworICAvLyBNYWtlIHRoZSBmaW5hbCBidWZmZXIgc2l6ZSBiZSBhbiBpbnRlZ2VyIG51bWJlciBvZiBzZWdtZW50cworICBkc291bmRzaW5rLT5idWZmZXJfc2l6ZSA9IHNwZWMtPnNlZ3NpemUgKiBzcGVjLT5zZWd0b3RhbDsKKworICBHU1RfSU5GT19PQkpFQ1QgKGRzb3VuZHNpbmssICJjaGFubmVsczogJWQsIHJhdGU6ICVkLCBieXRlc19wZXJfc2FtcGxlOiAlZCIKKyAgICAgICIgV0FWRUZPUk1BVEVYLm5TYW1wbGVzUGVyU2VjOiAlbGQsIFdBVkVGT1JNQVRFWC53Qml0c1BlclNhbXBsZTogJWQsIgorICAgICAgIiBXQVZFRk9STUFURVgubkJsb2NrQWxpZ246ICVkLCBXQVZFRk9STUFURVgubkF2Z0J5dGVzUGVyU2VjOiAlbGRcbiIKKyAgICAgICJTaXplIG9mIGRzb3VuZCBjaXJjdWxhciBidWZmZXI9PiVkXG4iLAorICAgICAgR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZzcGVjLT5pbmZvKSwgR1NUX0FVRElPX0lORk9fUkFURSAoJnNwZWMtPmluZm8pLAorICAgICAgR1NUX0FVRElPX0lORk9fQlBGICgmc3BlYy0+aW5mbyksIHdmeC5uU2FtcGxlc1BlclNlYywgd2Z4LndCaXRzUGVyU2FtcGxlLAorICAgICAgd2Z4Lm5CbG9ja0FsaWduLCB3ZngubkF2Z0J5dGVzUGVyU2VjLCBkc291bmRzaW5rLT5idWZmZXJfc2l6ZSk7CisKKyAgLyogY3JlYXRlIGEgc2Vjb25kYXJ5IGRpcmVjdHNvdW5kIGJ1ZmZlciAqLworICBtZW1zZXQgKCZkZXNjU2Vjb25kYXJ5LCAwLCBzaXplb2YgKERTQlVGRkVSREVTQykpOworICBkZXNjU2Vjb25kYXJ5LmR3U2l6ZSA9IHNpemVvZiAoRFNCVUZGRVJERVNDKTsKKyAgZGVzY1NlY29uZGFyeS5kd0ZsYWdzID0gRFNCQ0FQU19HRVRDVVJSRU5UUE9TSVRJT04yIHwgRFNCQ0FQU19HTE9CQUxGT0NVUzsKKyAgaWYgKCFnc3RfZGlyZWN0c291bmRfc2lua19pc19zcGRpZl9mb3JtYXQgKHNwZWMpKQorICAgIGRlc2NTZWNvbmRhcnkuZHdGbGFncyB8PSBEU0JDQVBTX0NUUkxWT0xVTUU7CisKKyAgZGVzY1NlY29uZGFyeS5kd0J1ZmZlckJ5dGVzID0gZHNvdW5kc2luay0+YnVmZmVyX3NpemU7CisgIGRlc2NTZWNvbmRhcnkubHB3ZnhGb3JtYXQgPSAoV0FWRUZPUk1BVEVYICopICYgd2Z4OworCisgIGhSZXMgPSBJRGlyZWN0U291bmRfQ3JlYXRlU291bmRCdWZmZXIgKGRzb3VuZHNpbmstPnBEUywgJmRlc2NTZWNvbmRhcnksCisgICAgICAmZHNvdW5kc2luay0+cERTQlNlY29uZGFyeSwgTlVMTCk7CisgIGlmIChGQUlMRUQgKGhSZXMpKSB7CisgICAgZ2NoYXIgKmVycm9yX3RleHQgPSBnc3RfaHJlc190b19zdHJpbmcgKGhSZXMpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChkc291bmRzaW5rLCBSRVNPVVJDRSwgT1BFTl9SRUFELAorICAgICAgICAoIklEaXJlY3RTb3VuZF9DcmVhdGVTb3VuZEJ1ZmZlcjogJXMiLCBlcnJvcl90ZXh0KSwgKE5VTEwpKTsKKyAgICBnX2ZyZWUgKGVycm9yX3RleHQpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGdzdF9kaXJlY3Rzb3VuZF9zaW5rX3NldF92b2x1bWUgKGRzb3VuZHNpbmssCisgICAgICBnc3RfZGlyZWN0c291bmRfc2lua19nZXRfdm9sdW1lIChkc291bmRzaW5rKSwgRkFMU0UpOworICBnc3RfZGlyZWN0c291bmRfc2lua19zZXRfbXV0ZSAoZHNvdW5kc2luaywgZHNvdW5kc2luay0+bXV0ZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2RpcmVjdHNvdW5kX3NpbmtfdW5wcmVwYXJlIChHc3RBdWRpb1NpbmsgKiBhc2luaykKK3sKKyAgR3N0RGlyZWN0U291bmRTaW5rICpkc291bmRzaW5rOworCisgIGRzb3VuZHNpbmsgPSBHU1RfRElSRUNUU09VTkRfU0lOSyAoYXNpbmspOworCisgIC8qIHJlbGVhc2Ugc2Vjb25kYXJ5IERpcmVjdFNvdW5kIGJ1ZmZlciAqLworICBpZiAoZHNvdW5kc2luay0+cERTQlNlY29uZGFyeSkgeworICAgIElEaXJlY3RTb3VuZEJ1ZmZlcl9SZWxlYXNlIChkc291bmRzaW5rLT5wRFNCU2Vjb25kYXJ5KTsKKyAgICBkc291bmRzaW5rLT5wRFNCU2Vjb25kYXJ5ID0gTlVMTDsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kaXJlY3Rzb3VuZF9zaW5rX2Nsb3NlIChHc3RBdWRpb1NpbmsgKiBhc2luaykKK3sKKyAgR3N0RGlyZWN0U291bmRTaW5rICpkc291bmRzaW5rID0gTlVMTDsKKworICBkc291bmRzaW5rID0gR1NUX0RJUkVDVFNPVU5EX1NJTksgKGFzaW5rKTsKKworICAvKiByZWxlYXNlIERpcmVjdFNvdW5kIG9iamVjdCAqLworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZHNvdW5kc2luay0+cERTICE9IE5VTEwsIEZBTFNFKTsKKyAgSURpcmVjdFNvdW5kX1JlbGVhc2UgKGRzb3VuZHNpbmstPnBEUyk7CisgIGRzb3VuZHNpbmstPnBEUyA9IE5VTEw7CisKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJmRzb3VuZHNpbmstPmNhY2hlZF9jYXBzLCBOVUxMKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdpbnQKK2dzdF9kaXJlY3Rzb3VuZF9zaW5rX3dyaXRlIChHc3RBdWRpb1NpbmsgKiBhc2luaywgZ3BvaW50ZXIgZGF0YSwgZ3VpbnQgbGVuZ3RoKQoreworICBHc3REaXJlY3RTb3VuZFNpbmsgKmRzb3VuZHNpbms7CisgIERXT1JEIGR3U3RhdHVzID0gMDsKKyAgSFJFU1VMVCBoUmVzLCBoUmVzMjsKKyAgTFBWT0lEIHBMb2NrZWRCdWZmZXIxID0gTlVMTCwgcExvY2tlZEJ1ZmZlcjIgPSBOVUxMOworICBEV09SRCBkd1NpemVCdWZmZXIxLCBkd1NpemVCdWZmZXIyOworICBEV09SRCBkd0N1cnJlbnRQbGF5Q3Vyc29yOworCisgIGRzb3VuZHNpbmsgPSBHU1RfRElSRUNUU09VTkRfU0lOSyAoYXNpbmspOworCisgIEdTVF9EU09VTkRfTE9DSyAoZHNvdW5kc2luayk7CisKKyAgLyogZ2V0IGN1cnJlbnQgYnVmZmVyIHN0YXR1cyAqLworICBoUmVzID0gSURpcmVjdFNvdW5kQnVmZmVyX0dldFN0YXR1cyAoZHNvdW5kc2luay0+cERTQlNlY29uZGFyeSwgJmR3U3RhdHVzKTsKKworICAvKiBnZXQgY3VycmVudCBwbGF5IGN1cnNvciBwb3NpdGlvbiAqLworICBoUmVzMiA9IElEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRDdXJyZW50UG9zaXRpb24gKGRzb3VuZHNpbmstPnBEU0JTZWNvbmRhcnksCisgICAgICAmZHdDdXJyZW50UGxheUN1cnNvciwgTlVMTCk7CisKKyAgaWYgKFNVQ0NFRURFRCAoaFJlcykgJiYgU1VDQ0VFREVEIChoUmVzMikgJiYgKGR3U3RhdHVzICYgRFNCU1RBVFVTX1BMQVlJTkcpKSB7CisgICAgRFdPUkQgZHdGcmVlQnVmZmVyU2l6ZSA9IDA7CisgICAgR3N0Q2xvY2tUaW1lIHNsZWVwX3RpbWVfbXMgPSAwLCBzbGVlcF91bnRpbDsKKyAgICBHc3RDbG9ja0lEIGNsb2NrX2lkOworCisgIGNhbGN1bGF0ZV9mcmVlc2l6ZToKKyAgICAvKiBDYWxjdWxhdGUgdGhlIGZyZWUgc3BhY2UgaW4gdGhlIGNpcmN1bGFyIGJ1ZmZlciAqLworICAgIGlmIChkd0N1cnJlbnRQbGF5Q3Vyc29yIDwgZHNvdW5kc2luay0+Y3VycmVudF9jaXJjdWxhcl9vZmZzZXQpCisgICAgICBkd0ZyZWVCdWZmZXJTaXplID0KKyAgICAgICAgICBkc291bmRzaW5rLT5idWZmZXJfc2l6ZSAtIChkc291bmRzaW5rLT5jdXJyZW50X2NpcmN1bGFyX29mZnNldCAtCisgICAgICAgICAgZHdDdXJyZW50UGxheUN1cnNvcik7CisgICAgZWxzZQorICAgICAgZHdGcmVlQnVmZmVyU2l6ZSA9CisgICAgICAgICAgZHdDdXJyZW50UGxheUN1cnNvciAtIGRzb3VuZHNpbmstPmN1cnJlbnRfY2lyY3VsYXJfb2Zmc2V0OworCisgICAgLyogTm90IGVub3VnaCBmcmVlIHNwYWNlLCB3YWl0IGZvciBzb21lIHNhbXBsZXMgdG8gYmUgcGxheWVkIG91dC4gV2UgY291bGQKKyAgICAgKiB3cml0ZSBvdXQgcGFydGlhbCBkYXRhLCBidXQgdGhhdCB3aWxsIHJlc3VsdCBpbiBhIHRpZ2h0IGxvb3AgaW4gdGhlCisgICAgICogYXVkaW9yaW5nYnVmZmVyIHdyaXRlIHRocmVhZCwgYW5kIGxlYWQgdG8gaGlnaCBDUFUgdXNhZ2UuICovCisgICAgaWYgKGxlbmd0aCA+IGR3RnJlZUJ1ZmZlclNpemUpIHsKKyAgICAgIGdpbnQgcmF0ZSA9IEdTVF9BVURJT19CQVNFX1NJTksgKGFzaW5rKS0+cmluZ2J1ZmZlci0+c3BlYy5pbmZvLnJhdGU7CisgICAgICAvKiBXYWl0IGZvciBhIHRpbWUgcHJvcG9ydGlvbmFsIHRvIHRoZSBzcGFjZSBuZWVkZWQuIEluIHJlYWxpdHksIHRoZQorICAgICAgICogZGlyZWN0c291bmQgc2luaydzIHBvc2l0aW9uIGRvZXMgbm90IHVwZGF0ZSBmcmVxdWVudGx5IGVub3VnaCwgc28gd2UKKyAgICAgICAqIHdpbGwgZW5kIHVwIHdhaXRpbmcgZm9yIG11Y2ggbG9uZ2VyLiBOb3RlIHRoYXQgU2xlZXAoKSBoYXMgbWlsbGlzZWNvbmQKKyAgICAgICAqIHJlc29sdXRpb24gYXQgYmVzdC4gKi8KKyAgICAgIHNsZWVwX3RpbWVfbXMgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50ICgobGVuZ3RoIC0gZHdGcmVlQnVmZmVyU2l6ZSksCisgICAgICAgICAgMTAwMCwgZHNvdW5kc2luay0+Ynl0ZXNfcGVyX3NhbXBsZSAqIHJhdGUpOworICAgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IHJ1biBpbiBhIHRpZ2h0IGxvb3AgdW5uZWNlc3NhcmlseSAqLworICAgICAgc2xlZXBfdGltZV9tcyA9IE1BWCAoc2xlZXBfdGltZV9tcywgMTApOworICAgICAgc2xlZXBfdW50aWwgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKGRzb3VuZHNpbmstPnN5c3RlbV9jbG9jaykgKworICAgICAgICAgIHNsZWVwX3RpbWVfbXMgKiBHU1RfTVNFQ09ORDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZHNvdW5kc2luaywKKyAgICAgICAgICAibGVuZ3RoOiAldSwgRnJlZUJ1ZlNpejogJWxkLCBzbGVlcF90aW1lX21zOiAlIiBHX0dVSU5UNjRfRk9STUFUCisgICAgICAgICAgIiwgYnBzOiAlaSwgcmF0ZTogJWkiLCBsZW5ndGgsIGR3RnJlZUJ1ZmZlclNpemUsIHNsZWVwX3RpbWVfbXMsCisgICAgICAgICAgZHNvdW5kc2luay0+Ynl0ZXNfcGVyX3NhbXBsZSwgcmF0ZSk7CisKKyAgICAgIGlmIChHX1VOTElLRUxZIChkc291bmRzaW5rLT53cml0ZV93YWl0X2Nsb2NrX2lkID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgZ3N0X2Nsb2NrX3NpbmdsZV9zaG90X2lkX3JlaW5pdCAoZHNvdW5kc2luay0+c3lzdGVtX2Nsb2NrLAorICAgICAgICAgICAgICAgICAgZHNvdW5kc2luay0+d3JpdGVfd2FpdF9jbG9ja19pZCwgc2xlZXBfdW50aWwpID09IEZBTFNFKSkgeworCisgICAgICAgIGlmIChkc291bmRzaW5rLT53cml0ZV93YWl0X2Nsb2NrX2lkICE9IE5VTEwpIHsKKyAgICAgICAgICBnc3RfY2xvY2tfaWRfdW5yZWYgKGRzb3VuZHNpbmstPndyaXRlX3dhaXRfY2xvY2tfaWQpOworICAgICAgICB9CisKKyAgICAgICAgZHNvdW5kc2luay0+d3JpdGVfd2FpdF9jbG9ja19pZCA9CisgICAgICAgICAgICBnc3RfY2xvY2tfbmV3X3NpbmdsZV9zaG90X2lkIChkc291bmRzaW5rLT5zeXN0ZW1fY2xvY2ssCisgICAgICAgICAgICBzbGVlcF91bnRpbCk7CisgICAgICB9CisKKyAgICAgIGNsb2NrX2lkID0gZHNvdW5kc2luay0+d3JpdGVfd2FpdF9jbG9ja19pZDsKKyAgICAgIGRzb3VuZHNpbmstPnJlc2V0X3doaWxlX3NsZWVwaW5nID0gRkFMU0U7CisKKyAgICAgIEdTVF9EU09VTkRfVU5MT0NLIChkc291bmRzaW5rKTsKKworICAgICAgLyogZG9uJ3QgYm90aGVyIHdpdGggdGhlIHJldHVybiB2YWx1ZSBhcyB3ZSdsbCBkZXRlY3QgcmVzZXQgc2VwYXJhdGVseSwKKyAgICAgICAgIGFzIHJlc2V0IGNvdWxkIGhhcHBlbiBiZXR3ZWVuIHdoZW4gdGhpcyByZXR1cm5zIGFuZCB3ZSBvYnRhaW4gdGhlIGxvY2sKKyAgICAgICAgIGFnYWluIC0tIHNvIHdlIGNhbid0IHVzZSBVTlNDSEVEVUxFRCBoZXJlICovCisgICAgICBnc3RfY2xvY2tfaWRfd2FpdCAoY2xvY2tfaWQsIE5VTEwpOworCisgICAgICBHU1RfRFNPVU5EX0xPQ0sgKGRzb3VuZHNpbmspOworCisgICAgICAvKiBpZiBhIHJlc2V0IG9jY3VycywgZXhpdCBub3cgKi8KKyAgICAgIGlmIChkc291bmRzaW5rLT5yZXNldF93aGlsZV9zbGVlcGluZyA9PSBUUlVFKSB7CisgICAgICAgIEdTVF9EU09VTkRfVU5MT0NLIChkc291bmRzaW5rKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorCisgICAgICAvKiBNYXkgd2Ugc2VuZCBvdXQ/ICovCisgICAgICBoUmVzID0gSURpcmVjdFNvdW5kQnVmZmVyX0dldEN1cnJlbnRQb3NpdGlvbiAoZHNvdW5kc2luay0+cERTQlNlY29uZGFyeSwKKyAgICAgICAgICAmZHdDdXJyZW50UGxheUN1cnNvciwgTlVMTCk7CisgICAgICBoUmVzMiA9CisgICAgICAgICAgSURpcmVjdFNvdW5kQnVmZmVyX0dldFN0YXR1cyAoZHNvdW5kc2luay0+cERTQlNlY29uZGFyeSwgJmR3U3RhdHVzKTsKKyAgICAgIGlmIChTVUNDRUVERUQgKGhSZXMpICYmIFNVQ0NFRURFRCAoaFJlczIpCisgICAgICAgICAgJiYgKGR3U3RhdHVzICYgRFNCU1RBVFVTX1BMQVlJTkcpKQorICAgICAgICBnb3RvIGNhbGN1bGF0ZV9mcmVlc2l6ZTsKKyAgICAgIGVsc2UgeworICAgICAgICBnY2hhciAqZXJyMSwgKmVycjI7CisKKyAgICAgICAgZHNvdW5kc2luay0+Zmlyc3RfYnVmZmVyX2FmdGVyX3Jlc2V0ID0gRkFMU0U7CisgICAgICAgIEdTVF9EU09VTkRfVU5MT0NLIChkc291bmRzaW5rKTsKKworICAgICAgICBlcnIxID0gZ3N0X2hyZXNfdG9fc3RyaW5nIChoUmVzKTsKKyAgICAgICAgZXJyMiA9IGdzdF9ocmVzX3RvX3N0cmluZyAoaFJlczIpOworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZHNvdW5kc2luaywgUkVTT1VSQ0UsIE9QRU5fV1JJVEUsCisgICAgICAgICAgICAoIklEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRTdGF0dXMgJXMsICIKKyAgICAgICAgICAgICAgICAiSURpcmVjdFNvdW5kQnVmZmVyX0dldEN1cnJlbnRQb3NpdGlvbjogJXMsIGR3U3RhdHVzOiAlbHUiLAorICAgICAgICAgICAgICAgIGVycjIsIGVycjEsIGR3U3RhdHVzKSwgKE5VTEwpKTsKKyAgICAgICAgZ19mcmVlIChlcnIxKTsKKyAgICAgICAgZ19mcmVlIChlcnIyKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChkd1N0YXR1cyAmIERTQlNUQVRVU19CVUZGRVJMT1NUKSB7CisgICAgaFJlcyA9IElEaXJlY3RTb3VuZEJ1ZmZlcl9SZXN0b3JlIChkc291bmRzaW5rLT5wRFNCU2Vjb25kYXJ5KTsgICAgICAvKm5lZWQgYSBsb29wIHdhaXRpbmcgdGhlIGJ1ZmZlciBpcyByZXN0b3JlZD8/ICovCisgICAgZHNvdW5kc2luay0+Y3VycmVudF9jaXJjdWxhcl9vZmZzZXQgPSAwOworICB9CisKKyAgLyogTG9jayBhIGJ1ZmZlciBvZiBsZW5ndGggQGxlbmd0aCBmb3Igd3JpdGluZyAqLworICBoUmVzID0gSURpcmVjdFNvdW5kQnVmZmVyX0xvY2sgKGRzb3VuZHNpbmstPnBEU0JTZWNvbmRhcnksCisgICAgICBkc291bmRzaW5rLT5jdXJyZW50X2NpcmN1bGFyX29mZnNldCwgbGVuZ3RoLCAmcExvY2tlZEJ1ZmZlcjEsCisgICAgICAmZHdTaXplQnVmZmVyMSwgJnBMb2NrZWRCdWZmZXIyLCAmZHdTaXplQnVmZmVyMiwgMEwpOworCisgIGlmIChTVUNDRUVERUQgKGhSZXMpKSB7CisgICAgLy8gV3JpdGUgdG8gcG9pbnRlcnMgd2l0aG91dCByZW9yZGVyaW5nLgorICAgIG1lbWNweSAocExvY2tlZEJ1ZmZlcjEsIGRhdGEsIGR3U2l6ZUJ1ZmZlcjEpOworICAgIGlmIChwTG9ja2VkQnVmZmVyMiAhPSBOVUxMKQorICAgICAgbWVtY3B5IChwTG9ja2VkQnVmZmVyMiwgKExQQllURSkgZGF0YSArIGR3U2l6ZUJ1ZmZlcjEsIGR3U2l6ZUJ1ZmZlcjIpOworCisgICAgaFJlcyA9IElEaXJlY3RTb3VuZEJ1ZmZlcl9VbmxvY2sgKGRzb3VuZHNpbmstPnBEU0JTZWNvbmRhcnksIHBMb2NrZWRCdWZmZXIxLAorICAgICAgICBkd1NpemVCdWZmZXIxLCBwTG9ja2VkQnVmZmVyMiwgZHdTaXplQnVmZmVyMik7CisKKyAgICAvLyBVcGRhdGUgd2hlcmUgdGhlIGJ1ZmZlciB3aWxsIGxvY2sgKGZvciBuZXh0IHRpbWUpCisgICAgZHNvdW5kc2luay0+Y3VycmVudF9jaXJjdWxhcl9vZmZzZXQgKz0gZHdTaXplQnVmZmVyMSArIGR3U2l6ZUJ1ZmZlcjI7CisgICAgZHNvdW5kc2luay0+Y3VycmVudF9jaXJjdWxhcl9vZmZzZXQgJT0gZHNvdW5kc2luay0+YnVmZmVyX3NpemU7ICAgICAvKiBDaXJjdWxhciBidWZmZXIgKi8KKyAgfQorCisgIC8qIGlmIHRoZSBidWZmZXIgd2FzIG5vdCBpbiBwbGF5aW5nIHN0YXRlIHlldCwgY2FsbCBwbGF5IG9uIHRoZSBidWZmZXIgCisgICAgIGV4Y2VwdCBpZiB0aGlzIGJ1ZmZlciBpcyB0aGUgZmlzdCBhZnRlciBhIHJlc2V0IChiYXNlIGNsYXNzIGNhbGwgcmVzZXQgYW5kIHdyaXRlIGEgYnVmZmVyIHdoZW4gc2V0dGluZyB0aGUgc2luayB0byBwYXVzZSkgKi8KKyAgaWYgKCEoZHdTdGF0dXMgJiBEU0JTVEFUVVNfUExBWUlORykgJiYKKyAgICAgIGRzb3VuZHNpbmstPmZpcnN0X2J1ZmZlcl9hZnRlcl9yZXNldCA9PSBGQUxTRSkgeworICAgIGhSZXMgPSBJRGlyZWN0U291bmRCdWZmZXJfUGxheSAoZHNvdW5kc2luay0+cERTQlNlY29uZGFyeSwgMCwgMCwKKyAgICAgICAgRFNCUExBWV9MT09QSU5HKTsKKyAgfQorCisgIGRzb3VuZHNpbmstPmZpcnN0X2J1ZmZlcl9hZnRlcl9yZXNldCA9IEZBTFNFOworCisgIEdTVF9EU09VTkRfVU5MT0NLIChkc291bmRzaW5rKTsKKworICByZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgZ3VpbnQKK2dzdF9kaXJlY3Rzb3VuZF9zaW5rX2RlbGF5IChHc3RBdWRpb1NpbmsgKiBhc2luaykKK3sKKyAgR3N0RGlyZWN0U291bmRTaW5rICpkc291bmRzaW5rOworICBIUkVTVUxUIGhSZXM7CisgIERXT1JEIGR3Q3VycmVudFBsYXlDdXJzb3I7CisgIERXT1JEIGR3Qnl0ZXNJblF1ZXVlID0gMDsKKyAgZ2ludCBuTmJTYW1wbGVzSW5RdWV1ZSA9IDA7CisgIERXT1JEIGR3U3RhdHVzOworCisgIGRzb3VuZHNpbmsgPSBHU1RfRElSRUNUU09VTkRfU0lOSyAoYXNpbmspOworCisgIC8qIGdldCBjdXJyZW50IGJ1ZmZlciBzdGF0dXMgKi8KKyAgaFJlcyA9IElEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRTdGF0dXMgKGRzb3VuZHNpbmstPnBEU0JTZWNvbmRhcnksICZkd1N0YXR1cyk7CisKKyAgaWYgKFNVQ0NFRURFRCAoaFJlcykgJiYgKGR3U3RhdHVzICYgRFNCU1RBVFVTX1BMQVlJTkcpKSB7CisgICAgLypldmFsdWF0ZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaW4gcXVldWUgaW4gdGhlIGNpcmN1bGFyIGJ1ZmZlciAqLworICAgIGhSZXMgPSBJRGlyZWN0U291bmRCdWZmZXJfR2V0Q3VycmVudFBvc2l0aW9uIChkc291bmRzaW5rLT5wRFNCU2Vjb25kYXJ5LAorICAgICAgICAmZHdDdXJyZW50UGxheUN1cnNvciwgTlVMTCk7CisKKyAgICBpZiAoaFJlcyA9PSBTX09LKSB7CisgICAgICBpZiAoZHdDdXJyZW50UGxheUN1cnNvciA8IGRzb3VuZHNpbmstPmN1cnJlbnRfY2lyY3VsYXJfb2Zmc2V0KQorICAgICAgICBkd0J5dGVzSW5RdWV1ZSA9CisgICAgICAgICAgICBkc291bmRzaW5rLT5jdXJyZW50X2NpcmN1bGFyX29mZnNldCAtIGR3Q3VycmVudFBsYXlDdXJzb3I7CisgICAgICBlbHNlCisgICAgICAgIGR3Qnl0ZXNJblF1ZXVlID0KKyAgICAgICAgICAgIGRzb3VuZHNpbmstPmN1cnJlbnRfY2lyY3VsYXJfb2Zmc2V0ICsgKGRzb3VuZHNpbmstPmJ1ZmZlcl9zaXplIC0KKyAgICAgICAgICAgIGR3Q3VycmVudFBsYXlDdXJzb3IpOworCisgICAgICBuTmJTYW1wbGVzSW5RdWV1ZSA9IGR3Qnl0ZXNJblF1ZXVlIC8gZHNvdW5kc2luay0+Ynl0ZXNfcGVyX3NhbXBsZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gbk5iU2FtcGxlc0luUXVldWU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGlyZWN0c291bmRfc2lua19yZXNldCAoR3N0QXVkaW9TaW5rICogYXNpbmspCit7CisgIEdzdERpcmVjdFNvdW5kU2luayAqZHNvdW5kc2luazsKKyAgTFBWT0lEIHBMb2NrZWRCdWZmZXIgPSBOVUxMOworICBEV09SRCBkd1NpemVCdWZmZXIgPSAwOworCisgIGRzb3VuZHNpbmsgPSBHU1RfRElSRUNUU09VTkRfU0lOSyAoYXNpbmspOworCisgIEdTVF9EU09VTkRfTE9DSyAoZHNvdW5kc2luayk7CisKKyAgaWYgKGRzb3VuZHNpbmstPnBEU0JTZWNvbmRhcnkpIHsKKyAgICAvKnN0b3AgcGxheWluZyAqLworICAgIEhSRVNVTFQgaFJlcyA9IElEaXJlY3RTb3VuZEJ1ZmZlcl9TdG9wIChkc291bmRzaW5rLT5wRFNCU2Vjb25kYXJ5KTsKKworICAgIC8qcmVzZXQgcG9zaXRpb24gKi8KKyAgICBoUmVzID0gSURpcmVjdFNvdW5kQnVmZmVyX1NldEN1cnJlbnRQb3NpdGlvbiAoZHNvdW5kc2luay0+cERTQlNlY29uZGFyeSwgMCk7CisgICAgZHNvdW5kc2luay0+Y3VycmVudF9jaXJjdWxhcl9vZmZzZXQgPSAwOworCisgICAgLypyZXNldCB0aGUgYnVmZmVyICovCisgICAgaFJlcyA9IElEaXJlY3RTb3VuZEJ1ZmZlcl9Mb2NrIChkc291bmRzaW5rLT5wRFNCU2Vjb25kYXJ5LAorICAgICAgICAwLCBkc291bmRzaW5rLT5idWZmZXJfc2l6ZSwKKyAgICAgICAgJnBMb2NrZWRCdWZmZXIsICZkd1NpemVCdWZmZXIsIE5VTEwsIE5VTEwsIDBMKTsKKworICAgIGlmIChTVUNDRUVERUQgKGhSZXMpKSB7CisgICAgICBtZW1zZXQgKHBMb2NrZWRCdWZmZXIsIDAsIGR3U2l6ZUJ1ZmZlcik7CisKKyAgICAgIGhSZXMgPQorICAgICAgICAgIElEaXJlY3RTb3VuZEJ1ZmZlcl9VbmxvY2sgKGRzb3VuZHNpbmstPnBEU0JTZWNvbmRhcnksIHBMb2NrZWRCdWZmZXIsCisgICAgICAgICAgZHdTaXplQnVmZmVyLCBOVUxMLCAwKTsKKyAgICB9CisgIH0KKworICBkc291bmRzaW5rLT5yZXNldF93aGlsZV9zbGVlcGluZyA9IFRSVUU7CisgIGRzb3VuZHNpbmstPmZpcnN0X2J1ZmZlcl9hZnRlcl9yZXNldCA9IFRSVUU7CisgIGlmIChkc291bmRzaW5rLT53cml0ZV93YWl0X2Nsb2NrX2lkICE9IE5VTEwpIHsKKyAgICBnc3RfY2xvY2tfaWRfdW5zY2hlZHVsZSAoZHNvdW5kc2luay0+d3JpdGVfd2FpdF9jbG9ja19pZCk7CisgIH0KKworICBHU1RfRFNPVU5EX1VOTE9DSyAoZHNvdW5kc2luayk7Cit9CisKKy8qCisgKiBnc3RfZGlyZWN0c291bmRfcHJvYmVfc3VwcG9ydGVkX2Zvcm1hdHM6CisgKgorICogVGFrZXMgdGhlIHRlbXBsYXRlIGNhcHMgYW5kIHJldHVybnMgdGhlIHN1YnNldCB3aGljaCBpcyBhY3R1YWxseQorICogc3VwcG9ydGVkIGJ5IHRoaXMgZGV2aWNlLgorICoKKyAqLworCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfZGlyZWN0c291bmRfcHJvYmVfc3VwcG9ydGVkX2Zvcm1hdHMgKEdzdERpcmVjdFNvdW5kU2luayAqIGRzb3VuZHNpbmssCisgICAgY29uc3QgR3N0Q2FwcyAqIHRlbXBsYXRlX2NhcHMpCit7CisgIEhSRVNVTFQgaFJlczsKKyAgRFNCVUZGRVJERVNDIGRlc2NTZWNvbmRhcnk7CisgIFdBVkVGT1JNQVRFWCB3Zng7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdENhcHMgKnRtcCwgKnRtcDI7CisgIExQRElSRUNUU09VTkRCVUZGRVIgdG1wQnVmZmVyOworCisgIGNhcHMgPSBnc3RfY2Fwc19jb3B5ICh0ZW1wbGF0ZV9jYXBzKTsKKworICAvKgorICAgKiBDaGVjayBhdmFpbGFiaWxpdHkgb2YgZGlnaXRhbCBvdXRwdXQgYnkgdHJ5aW5nIHRvIGNyZWF0ZSBhbiBTUERJRiBidWZmZXIKKyAgICovCisKKyNpZmRlZiBXQVZFX0ZPUk1BVF9ET0xCWV9BQzNfU1BESUYKKyAgLyogZmlsbCB0aGUgV0FWRUZPUk1BVEVYIHN0cnVjdHVyZSB3aXRoIHNvbWUgc3RhbmRhcmQgQUMzIG92ZXIgU1BESUYgcGFyYW1zICovCisgIG1lbXNldCAoJndmeCwgMCwgc2l6ZW9mICh3ZngpKTsKKyAgd2Z4LmNiU2l6ZSA9IDA7CisgIHdmeC53Rm9ybWF0VGFnID0gV0FWRV9GT1JNQVRfRE9MQllfQUMzX1NQRElGOworICB3ZngubkNoYW5uZWxzID0gMjsKKyAgd2Z4Lm5TYW1wbGVzUGVyU2VjID0gNDgwMDA7CisgIHdmeC53Qml0c1BlclNhbXBsZSA9IDE2OworICB3ZngubkJsb2NrQWxpZ24gPSA0OworICB3ZngubkF2Z0J5dGVzUGVyU2VjID0gd2Z4Lm5TYW1wbGVzUGVyU2VjICogd2Z4Lm5CbG9ja0FsaWduOworCisgIC8vIGNyZWF0ZSBhIHNlY29uZGFyeSBkaXJlY3Rzb3VuZCBidWZmZXIKKyAgbWVtc2V0ICgmZGVzY1NlY29uZGFyeSwgMCwgc2l6ZW9mIChEU0JVRkZFUkRFU0MpKTsKKyAgZGVzY1NlY29uZGFyeS5kd1NpemUgPSBzaXplb2YgKERTQlVGRkVSREVTQyk7CisgIGRlc2NTZWNvbmRhcnkuZHdGbGFncyA9IERTQkNBUFNfR0VUQ1VSUkVOVFBPU0lUSU9OMiB8IERTQkNBUFNfR0xPQkFMRk9DVVM7CisgIGRlc2NTZWNvbmRhcnkuZHdCdWZmZXJCeXRlcyA9IDYxNDQ7CisgIGRlc2NTZWNvbmRhcnkubHB3ZnhGb3JtYXQgPSAmd2Z4OworCisgIGhSZXMgPSBJRGlyZWN0U291bmRfQ3JlYXRlU291bmRCdWZmZXIgKGRzb3VuZHNpbmstPnBEUywgJmRlc2NTZWNvbmRhcnksCisgICAgICAmdG1wQnVmZmVyLCBOVUxMKTsKKyAgaWYgKEZBSUxFRCAoaFJlcykpIHsKKyAgICBnY2hhciAqZXJyb3JfdGV4dCA9IGdzdF9ocmVzX3RvX3N0cmluZyAoaFJlcyk7CisgICAgR1NUX0lORk9fT0JKRUNUIChkc291bmRzaW5rLCAiQUMzIHBhc3N0aHJvdWdoIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAiKElEaXJlY3RTb3VuZF9DcmVhdGVTb3VuZEJ1ZmZlciByZXR1cm5lZDogJXMpXG4iLCBlcnJvcl90ZXh0KTsKKyAgICBnX2ZyZWUgKGVycm9yX3RleHQpOworICAgIHRtcCA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby94LWFjMyIpOworICAgIHRtcDIgPSBnc3RfY2Fwc19zdWJ0cmFjdCAoY2FwcywgdG1wKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgY2FwcyA9IHRtcDI7CisgICAgdG1wID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtZHRzIik7CisgICAgdG1wMiA9IGdzdF9jYXBzX3N1YnRyYWN0IChjYXBzLCB0bXApOworICAgIGdzdF9jYXBzX3VucmVmICh0bXApOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICBjYXBzID0gdG1wMjsKKyAgfSBlbHNlIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKGRzb3VuZHNpbmssICJBQzMgcGFzc3Rocm91Z2ggc3VwcG9ydGVkIik7CisgICAgaFJlcyA9IElEaXJlY3RTb3VuZEJ1ZmZlcl9SZWxlYXNlICh0bXBCdWZmZXIpOworICAgIGlmIChGQUlMRUQgKGhSZXMpKSB7CisgICAgICBnY2hhciAqZXJyb3JfdGV4dCA9IGdzdF9ocmVzX3RvX3N0cmluZyAoaFJlcyk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChkc291bmRzaW5rLAorICAgICAgICAgICIoSURpcmVjdFNvdW5kQnVmZmVyX1JlbGVhc2UgcmV0dXJuZWQ6ICVzKVxuIiwgZXJyb3JfdGV4dCk7CisgICAgICBnX2ZyZWUgKGVycm9yX3RleHQpOworICAgIH0KKyAgfQorI2Vsc2UKKyAgdG1wID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoImF1ZGlvL3gtYWMzIik7CisgIHRtcDIgPSBnc3RfY2Fwc19zdWJ0cmFjdCAoY2FwcywgdG1wKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHRtcCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgY2FwcyA9IHRtcDI7CisgIHRtcCA9IGdzdF9jYXBzX25ld19lbXB0eV9zaW1wbGUgKCJhdWRpby94LWR0cyIpOworICB0bXAyID0gZ3N0X2NhcHNfc3VidHJhY3QgKGNhcHMsIHRtcCk7CisgIGdzdF9jYXBzX3VucmVmICh0bXApOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGNhcHMgPSB0bXAyOworI2VuZGlmCisKKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X2RpcmVjdHNvdW5kX3NpbmtfcGF5bG9hZCAoR3N0QXVkaW9CYXNlU2luayAqIHNpbmssIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgaWYgKGdzdF9kaXJlY3Rzb3VuZF9zaW5rX2lzX3NwZGlmX2Zvcm1hdCAoJnNpbmstPnJpbmdidWZmZXItPnNwZWMpKSB7CisgICAgZ2ludCBmcmFtZXNpemUgPSBnc3RfYXVkaW9faWVjNjE5MzdfZnJhbWVfc2l6ZSAoJnNpbmstPnJpbmdidWZmZXItPnNwZWMpOworICAgIEdzdEJ1ZmZlciAqb3V0OworICAgIEdzdE1hcEluZm8gaW5mb2J1ZiwgaW5mb291dDsKKyAgICBnYm9vbGVhbiBzdWNjZXNzOworCisgICAgaWYgKGZyYW1lc2l6ZSA8PSAwKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBvdXQgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGZyYW1lc2l6ZSk7CisKKyAgICBpZiAoIWdzdF9idWZmZXJfbWFwIChidWYsICZpbmZvYnVmLCBHU1RfTUFQX1JFQURXUklURSkpIHsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFnc3RfYnVmZmVyX21hcCAob3V0LCAmaW5mb291dCwgR1NUX01BUF9SRUFEV1JJVEUpKSB7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZpbmZvYnVmKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3VjY2VzcyA9IGdzdF9hdWRpb19pZWM2MTkzN19wYXlsb2FkIChpbmZvYnVmLmRhdGEsIGluZm9idWYuc2l6ZSwKKyAgICAgICAgaW5mb291dC5kYXRhLCBpbmZvb3V0LnNpemUsICZzaW5rLT5yaW5nYnVmZmVyLT5zcGVjLCBHX0JZVEVfT1JERVIpOworICAgIGlmICghc3VjY2VzcykgeworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0LCAmaW5mb291dCk7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZpbmZvYnVmKTsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBnc3RfYnVmZmVyX2NvcHlfaW50byAob3V0LCBidWYsIEdTVF9CVUZGRVJfQ09QWV9BTEwsIDAsIC0xKTsKKyAgICAvKiBGaXggZW5kaWFubmVzcyAqLworICAgIF9zd2FiICgoZ2NoYXIgKikgaW5mb291dC5kYXRhLCAoZ2NoYXIgKikgaW5mb291dC5kYXRhLCBpbmZvYnVmLnNpemUpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dCwgJmluZm9vdXQpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJmluZm9idWYpOworICAgIHJldHVybiBvdXQ7CisgIH0gZWxzZQorICAgIHJldHVybiBnc3RfYnVmZmVyX3JlZiAoYnVmKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9kaXJlY3Rzb3VuZF9zaW5rX3NldF92b2x1bWUgKEdzdERpcmVjdFNvdW5kU2luayAqIGRzb3VuZHNpbmssCisgICAgZ2RvdWJsZSBkdm9sdW1lLCBnYm9vbGVhbiBzdG9yZSkKK3sKKyAgZ2xvbmcgdm9sdW1lOworCisgIHZvbHVtZSA9IGR2b2x1bWUgKiAxMDA7CisgIGlmIChzdG9yZSkKKyAgICBkc291bmRzaW5rLT52b2x1bWUgPSB2b2x1bWU7CisKKyAgaWYgKGRzb3VuZHNpbmstPnBEU0JTZWNvbmRhcnkpIHsKKyAgICAvKiBEaXJlY3RTb3VuZCBjb250cm9scyB2b2x1bWUgdXNpbmcgdW5pdHMgb2YgMTAwdGggb2YgYSBkZWNpYmVsLAorICAgICAqIHJhbmdpbmcgZnJvbSAtMTAwMDAgdG8gMC4gV2UgdXNlIGEgbGluZWFyIHNjYWxlIG9mIDAgLSAxMDAKKyAgICAgKiBoZXJlLCBzbyByZW1hcC4KKyAgICAgKi8KKyAgICBsb25nIGRzVm9sdW1lOworICAgIGlmICh2b2x1bWUgPT0gMCB8fCBkc291bmRzaW5rLT5tdXRlKQorICAgICAgZHNWb2x1bWUgPSAtMTAwMDA7CisgICAgZWxzZQorICAgICAgZHNWb2x1bWUgPSAxMDAgKiAobG9uZykgKDIwICogbG9nMTAgKChkb3VibGUpIHZvbHVtZSAvIDEwMC4pKTsKKyAgICBkc1ZvbHVtZSA9IENMQU1QIChkc1ZvbHVtZSwgLTEwMDAwLCAwKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGRzb3VuZHNpbmssCisgICAgICAgICJTZXR0aW5nIHZvbHVtZSBvbiBzZWNvbmRhcnkgYnVmZmVyIHRvICVkIGZyb20gJWQiLCAoaW50KSBkc1ZvbHVtZSwKKyAgICAgICAgKGludCkgdm9sdW1lKTsKKyAgICBJRGlyZWN0U291bmRCdWZmZXJfU2V0Vm9sdW1lIChkc291bmRzaW5rLT5wRFNCU2Vjb25kYXJ5LCBkc1ZvbHVtZSk7CisgIH0KK30KKworZ2RvdWJsZQorZ3N0X2RpcmVjdHNvdW5kX3NpbmtfZ2V0X3ZvbHVtZSAoR3N0RGlyZWN0U291bmRTaW5rICogZHNvdW5kc2luaykKK3sKKyAgcmV0dXJuIChnZG91YmxlKSBkc291bmRzaW5rLT52b2x1bWUgLyAxMDA7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGlyZWN0c291bmRfc2lua19zZXRfbXV0ZSAoR3N0RGlyZWN0U291bmRTaW5rICogZHNvdW5kc2luaywgZ2Jvb2xlYW4gbXV0ZSkKK3sKKyAgaWYgKG11dGUpIHsKKyAgICBnc3RfZGlyZWN0c291bmRfc2lua19zZXRfdm9sdW1lIChkc291bmRzaW5rLCAwLCBGQUxTRSk7CisgICAgZHNvdW5kc2luay0+bXV0ZSA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgZ3N0X2RpcmVjdHNvdW5kX3Npbmtfc2V0X3ZvbHVtZSAoZHNvdW5kc2luaywKKyAgICAgICAgZ3N0X2RpcmVjdHNvdW5kX3NpbmtfZ2V0X3ZvbHVtZSAoZHNvdW5kc2luayksIEZBTFNFKTsKKyAgICBkc291bmRzaW5rLT5tdXRlID0gRkFMU0U7CisgIH0KKworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9kaXJlY3Rzb3VuZF9zaW5rX2dldF9tdXRlIChHc3REaXJlY3RTb3VuZFNpbmsgKiBkc291bmRzaW5rKQoreworICByZXR1cm4gZHNvdW5kc2luay0+bXV0ZTsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICoKK2dzdF9kaXJlY3Rzb3VuZF9zaW5rX2dldF9kZXZpY2UgKEdzdERpcmVjdFNvdW5kU2luayAqIGRzb3VuZHNpbmspCit7CisgIHJldHVybiBkc291bmRzaW5rLT5kZXZpY2VfaWQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfZGlyZWN0c291bmRfc2lua19zZXRfZGV2aWNlIChHc3REaXJlY3RTb3VuZFNpbmsgKiBkc291bmRzaW5rLAorICAgIGNvbnN0IGdjaGFyICogZGV2aWNlX2lkKQoreworICBnX2ZyZWUgKGRzb3VuZHNpbmstPmRldmljZV9pZCk7CisgIGRzb3VuZHNpbmstPmRldmljZV9pZCA9IGdfc3RyZHVwIChkZXZpY2VfaWQpOworfQorCisvKiBDb252ZXJ0cyBhIEhSRVNVTFQgZXJyb3IgdG8gYSB0ZXh0IHN0cmluZworICogTFBUU1RSIGlzIGVpdGhlciBhICovCitzdGF0aWMgZ2NoYXIgKgorZ3N0X2hyZXNfdG9fc3RyaW5nIChIUkVTVUxUIGhSZXMpCit7CisgIERXT1JEIGZsYWdzOworICBnY2hhciAqcmV0X3RleHQ7CisgIExQVFNUUiBlcnJvcl90ZXh0ID0gTlVMTDsKKworICBmbGFncyA9IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwgRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSCisgICAgICB8IEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTOworICBGb3JtYXRNZXNzYWdlIChmbGFncywgTlVMTCwgaFJlcywgTUFLRUxBTkdJRCAoTEFOR19ORVVUUkFMLCBTVUJMQU5HX0RFRkFVTFQpLAorICAgICAgKExQVFNUUikgJiBlcnJvcl90ZXh0LCAwLCBOVUxMKTsKKworI2lmZGVmIFVOSUNPREUKKyAgLyogSWYgVU5JQ09ERSBpcyBkZWZpbmVkLCBMUFRTVFIgaXMgTFBXU1RSIHdoaWNoIGlzIFVURi0xNiAqLworICByZXRfdGV4dCA9IGdfdXRmMTZfdG9fdXRmOCAoZXJyb3JfdGV4dCwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisjZWxzZQorICByZXRfdGV4dCA9IGdfc3RyZHVwIChlcnJvcl90ZXh0KTsKKyNlbmRpZgorCisgIExvY2FsRnJlZSAoZXJyb3JfdGV4dCk7CisgIHJldHVybiByZXRfdGV4dDsKK30KZGlmZiAtLWdpdCBhL3N5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuaCBiL3N5cy9kaXJlY3Rzb3VuZC9nc3RkaXJlY3Rzb3VuZHNpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDRkZmFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL2RpcmVjdHNvdW5kL2dzdGRpcmVjdHNvdW5kc2luay5oCkBAIC0wLDAgKzEsMTEyIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgIDIwMDUgU2ViYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUGlvbmVlcnMgb2YgdGhlIEluZXZpdGFibGUgPHNvbmdiaXJkQHNvbmdiaXJkbmVzdC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRmx1ZW5kbyBTLkEuIDxzdXBwb3J0QGZsdWVuZG8uY29tPgorICoKKyAqIGdzdGRpcmVjdHNvdW5kc2luay5oOiAKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBUaGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIHdhcyBtYWRlIHBvc3NpYmxlIGR1ZSB0byB0aGUgaW52b2x2ZW1lbnQKKyAqIG9mIFBpb25lZXJzIG9mIHRoZSBJbmV2aXRhYmxlLCB0aGUgY3JlYXRvcnMgb2YgdGhlIFNvbmdiaXJkIE11c2ljIHBsYXllcgorICoKKyAqIAorICovCisKKyNpZm5kZWYgX19HU1RfRElSRUNUU09VTkRTSU5LX0hfXworI2RlZmluZSBfX0dTVF9ESVJFQ1RTT1VORFNJTktfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvc2luay5oPgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPGRzb3VuZC5oPgorI2luY2x1ZGUgPG1tcmVnLmg+IAorI2luY2x1ZGUgPGtzLmg+IAorI2luY2x1ZGUgPGtzbWVkaWEuaD4gCisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfRElSRUNUU09VTkRfU0lOSyAgICAgICAgICAgIChnc3RfZGlyZWN0c291bmRfc2lua19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfRElSRUNUU09VTkRfU0lOSyhvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0RJUkVDVFNPVU5EX1NJTkssR3N0RGlyZWN0U291bmRTaW5rKSkKKyNkZWZpbmUgR1NUX0RJUkVDVFNPVU5EX1NJTktfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0RJUkVDVFNPVU5EX1NJTkssR3N0RGlyZWN0U291bmRTaW5rQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfRElSRUNUU09VTkRfU0lOSyhvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0RJUkVDVFNPVU5EX1NJTkspKQorI2RlZmluZSBHU1RfSVNfRElSRUNUU09VTkRfU0lOS19DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfRElSRUNUU09VTkRfU0lOSykpCit0eXBlZGVmIHN0cnVjdCBfR3N0RGlyZWN0U291bmRTaW5rIEdzdERpcmVjdFNvdW5kU2luazsKK3R5cGVkZWYgc3RydWN0IF9Hc3REaXJlY3RTb3VuZFNpbmtDbGFzcyBHc3REaXJlY3RTb3VuZFNpbmtDbGFzczsKKworI2RlZmluZSBHU1RfRFNPVU5EX0xPQ0sob2JqKQkoZ19tdXRleF9sb2NrICgmb2JqLT5kc291bmRfbG9jaykpCisjZGVmaW5lIEdTVF9EU09VTkRfVU5MT0NLKG9iaikJKGdfbXV0ZXhfdW5sb2NrICgmb2JqLT5kc291bmRfbG9jaykpCisKK3N0cnVjdCBfR3N0RGlyZWN0U291bmRTaW5rCit7CisgIEdzdEF1ZGlvU2luayBzaW5rOworCisKKyAgLyogZGlyZWN0c291bmQgb2JqZWN0IGludGVyZmFjZSBwb2ludGVyICovCisgIExQRElSRUNUU09VTkQgcERTOworCisgIC8qIGRpcmVjdHNvdW5kIHNvdW5kIG9iamVjdCBpbnRlcmZhY2UgcG9pbnRlciAqLworICBMUERJUkVDVFNPVU5EQlVGRkVSIHBEU0JTZWNvbmRhcnk7CisKKyAgLyogZGlyZWN0U291bmQgYnVmZmVyIHNpemUgKi8KKyAgZ3VpbnQgYnVmZmVyX3NpemU7CisKKyAgLyogb2Zmc2V0IG9mIHRoZSBjaXJjdWxhciBidWZmZXIgd2hlcmUgd2UgbXVzdCB3cml0ZSBuZXh0ICovCisgIGd1aW50IGN1cnJlbnRfY2lyY3VsYXJfb2Zmc2V0OworCisgIGd1aW50IGJ5dGVzX3Blcl9zYW1wbGU7CisKKyAgLyogY3VycmVudCB2b2x1bWUgc2V0dXAgYnkgbWl4ZXIgaW50ZXJmYWNlICovCisgIGdsb25nIHZvbHVtZTsKKyAgZ2Jvb2xlYW4gbXV0ZTsKKyAgCisgIC8qIGN1cnJlbnQgZGlyZWN0c291bmQgZGV2aWNlIElEICovCisgIGdjaGFyICogZGV2aWNlX2lkOworCisgIEdzdENhcHMgKmNhY2hlZF9jYXBzOworICAvKiBsb2NrIHVzZWQgdG8gcHJvdGVjdCB3cml0ZXMgYW5kIHJlc2V0cyAqLworICBHTXV0ZXggZHNvdW5kX2xvY2s7CisKKyAgR3N0Q2xvY2sgKnN5c3RlbV9jbG9jazsKKyAgR3N0Q2xvY2tJRCB3cml0ZV93YWl0X2Nsb2NrX2lkOworICBnYm9vbGVhbiByZXNldF93aGlsZV9zbGVlcGluZzsKKworICBnYm9vbGVhbiBmaXJzdF9idWZmZXJfYWZ0ZXJfcmVzZXQ7CisKKyAgR3N0QXVkaW9SaW5nQnVmZmVyRm9ybWF0VHlwZSB0eXBlOworfTsKKworc3RydWN0IF9Hc3REaXJlY3RTb3VuZFNpbmtDbGFzcworeworICBHc3RBdWRpb1NpbmtDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfZGlyZWN0c291bmRfc2lua19nZXRfdHlwZSAodm9pZCk7CisKKyNkZWZpbmUgR1NUX0RJUkVDVFNPVU5EX1NJTktfQ0FQUyAiYXVkaW8veC1yYXcsICIgXAorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgUzE2TEUsICIgXAorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIgImNoYW5uZWxzID0gKGludCkgWyAxLCAyIF07ICIgXAorICAgICAgICAiYXVkaW8veC1yYXcsICIgXAorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgVTgsICIgXAorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIgImNoYW5uZWxzID0gKGludCkgWyAxLCAyIF07IiBcCisgICAgICAgICJhdWRpby94LWFjMywgZnJhbWVkID0gKGJvb2xlYW4pIHRydWU7IiBcCisgICAgICAgICJhdWRpby94LWR0cywgZnJhbWVkID0gKGJvb2xlYW4pIHRydWU7IgorCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX0RJUkVDVFNPVU5EU0lOS19IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy9kaXJlY3Rzb3VuZC9tZXNvbi5idWlsZCBiL3N5cy9kaXJlY3Rzb3VuZC9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWQzZmZkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL2RpcmVjdHNvdW5kL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTYgQEAKK2RpcmVjdHNvdW5kc2lua19zb3VyY2VzID0gWworICAnZ3N0ZGlyZWN0c291bmRzaW5rLmMnLAorICAnZ3N0ZGlyZWN0c291bmRwbHVnaW4uYycsCitdCisKK2lmIGhvc3RfbWFjaGluZS5zeXN0ZW0oKSA9PSAnd2luZG93cycgYW5kIGNjLmhhc19oZWFkZXIoJ2Rzb3VuZC5oJykKKyAgZGlyZWN0c291bmRzaW5rX2RlcCA9IFtjYy5maW5kX2xpYnJhcnkoJ2Rzb3VuZCcpLCBjYy5maW5kX2xpYnJhcnkoJ3dpbm1tJyksIGNjLmZpbmRfbGlicmFyeSgnb2xlMzInKV0KKworICBnc3RkaXJlY3Rzb3VuZHNpbmsgPSBsaWJyYXJ5KCdnc3RkaXJlY3Rzb3VuZCcsCisgICAgZGlyZWN0c291bmRzaW5rX3NvdXJjZXMsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3N0YXVkaW9fZGVwXSArIGRpcmVjdHNvdW5kc2lua19kZXAsCisgICAgaW5zdGFsbCA6IHRydWUsCisgICAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyKQorZW5kaWYKZGlmZiAtLWdpdCBhL3N5cy9tZXNvbi5idWlsZCBiL3N5cy9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzFlZTc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTAgQEAKK3N1YmRpcignZGlyZWN0c291bmQnKQorc3ViZGlyKCdvc3MnKQorc3ViZGlyKCdvc3M0JykKK3N1YmRpcigndjRsMicpCitzdWJkaXIoJ3hpbWFnZScpCisKKyMgRklYTUU6IEltcGxlbWVudCB0aGVzZQorI3N1YmRpcignb3N4YXVkaW8nKQorI3N1YmRpcignb3N4dmlkZW8nKQorI3N1YmRpcignd2F2ZWZvcm0nKQpkaWZmIC0tZ2l0IGEvc3lzL29zcy8uZ2l0aWdub3JlIGIvc3lzL29zcy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOTg4ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3NzLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorb3NzX3Byb2JlCmRpZmYgLS1naXQgYS9zeXMvb3NzL01ha2VmaWxlLmFtIGIvc3lzL29zcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTA3OWE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIwIEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3Rvc3NhdWRpby5sYQorCitsaWJnc3Rvc3NhdWRpb19sYV9TT1VSQ0VTID0gZ3N0b3NzYXVkaW8uYwkgXAorCQkgICAgICAgICAgICBnc3Rvc3NoZWxwZXIuYwkgXAorCQkJICAgIGdzdG9zc3NpbmsuYwkgXAorCQkJICAgIGdzdG9zc3NyYy5jCisKK2xpYmdzdG9zc2F1ZGlvX2xhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpCitsaWJnc3Rvc3NhdWRpb19sYV9MSUJBREQgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwktbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJJChHU1RfQkFTRV9MSUJTKSBcCisJJChHU1RfTElCUykKK2xpYmdzdG9zc2F1ZGlvX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykgCisKK25vaW5zdF9IRUFERVJTID0gY29tbW9uLmggICAgICAgICAgICBcCisJCWdzdG9zc3NpbmsuaAkgICAgIFwKKwkJZ3N0b3Nzc3JjLmgJICAgICBcCisgICAgICAgICAgICAgICAgZ3N0b3NzaGVscGVyLmgJICAgICBcCisgICAgICAgICAgICAgICAgZ3N0b3NzZG1hYnVmZmVyLmgKZGlmZiAtLWdpdCBhL3N5cy9vc3MvY29tbW9uLmggYi9zeXMvb3NzL2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMzYzMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3NzL2NvbW1vbi5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgMjAwMCwyMDA1IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjZGVmaW5lIFNFVF9QQVJBTShfb3NzLCBfbmFtZSwgX3ZhbCwgX2RldGFpbCkgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBfdG1wID0gX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChpb2N0bChfb3NzLT5mZCwgX25hbWUsICZfdG1wKSA9PSAtMSkgeyAgICBcCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKF9vc3MsIFJFU09VUkNFLCBTRVRUSU5HUyxcCisgICAgICAgIChOVUxMKSwJCQkJCVwKKyAgICAgICAgKCJVbmFibGUgdG8gc2V0IHBhcmFtICIgX2RldGFpbCAiOiAlcyIsIFwKKyAgICAgICAgICAgICAgICAgICBnX3N0cmVycm9yIChlcnJubykpKTsgICAgICAgIFwKKyAgICByZXR1cm4gRkFMU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR1NUX0RFQlVHX09CSkVDVChfb3NzLCBfZGV0YWlsICIgJWQiLCBfdG1wKTsgIFwKK30gR19TVE1UX0VORAorCisjZGVmaW5lIEdFVF9QQVJBTShfb3NzLCBfbmFtZSwgX3ZhbCwgX2RldGFpbCkgICBcCitHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChpb2N0bChvc3MtPmZkLCBfbmFtZSwgX3ZhbCkgPT0gLTEpIHsgICAgICBcCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9zcywgUkVTT1VSQ0UsIFNFVFRJTkdTLCBcCisgICAgICAgIChOVUxMKSwJCQkJCVwKKyAgICAgICAgKCJVbmFibGUgdG8gZ2V0IHBhcmFtICIgX2RldGFpbCAiOiAlcyIsIFwKKyAgICAgICAgICAgICAgICAgICBnX3N0cmVycm9yIChlcnJubykpKTsgICAgICAgIFwKKyAgICByZXR1cm4gRkFMU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gR19TVE1UX0VORApkaWZmIC0tZ2l0IGEvc3lzL29zcy9nc3Rvc3NhdWRpby5jIGIvc3lzL29zcy9nc3Rvc3NhdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOTRlMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3NzL2dzdG9zc2F1ZGlvLmMKQEAgLTAsMCArMSw1OSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDwxOTk5PiBFcmlrIFdhbHRoaW5zZW4gPG9tZWdhQGNzZS5vZ2kuZWR1PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdC9nc3QtaTE4bi1wbHVnaW4uaCIKKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImdzdG9zc3NpbmsuaCIKKyNpbmNsdWRlICJnc3Rvc3NzcmMuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZIChvc3NfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgb3NzX2RlYnVnCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgaWYgKCFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAib3Nzc3JjIiwgR1NUX1JBTktfU0VDT05EQVJZLAorICAgICAgICAgIEdTVF9UWVBFX09TU19TUkMpIHx8CisgICAgICAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm9zc3NpbmsiLCBHU1RfUkFOS19TRUNPTkRBUlksCisgICAgICAgICAgR1NUX1RZUEVfT1NTU0lOSykpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAob3NzX2RlYnVnLCAib3NzIiwgMCwgIk9TUyBlbGVtZW50cyIpOworCisjaWZkZWYgRU5BQkxFX05MUworICBHU1RfREVCVUcgKCJiaW5kaW5nIHRleHQgZG9tYWluICVzIHRvIGxvY2FsZSBkaXIgJXMiLCBHRVRURVhUX1BBQ0tBR0UsCisgICAgICBMT0NBTEVESVIpOworICBiaW5kdGV4dGRvbWFpbiAoR0VUVEVYVF9QQUNLQUdFLCBMT0NBTEVESVIpOworICBiaW5kX3RleHRkb21haW5fY29kZXNldCAoR0VUVEVYVF9QQUNLQUdFLCAiVVRGLTgiKTsKKyNlbmRpZiAvKiBFTkFCTEVfTkxTICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBvc3NhdWRpbywKKyAgICAiT1NTIChPcGVuIFNvdW5kIFN5c3RlbSkgc3VwcG9ydCBmb3IgR1N0cmVhbWVyIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL3N5cy9vc3MvZ3N0b3NzZG1hYnVmZmVyLmMgYi9zeXMvb3NzL2dzdG9zc2RtYWJ1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZWU2MWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3NzL2dzdG9zc2RtYWJ1ZmZlci5jCkBAIC0wLDAgKzEsMzMzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwNSBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIGdzdG9zc2RtYWJ1ZmZlci5jOiAKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpZmRlZiBIQVZFX09TU19JTkNMVURFX0lOX1NZUworIyBpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+CisjZWxzZQorIyBpZmRlZiBIQVZFX09TU19JTkNMVURFX0lOX1JPT1QKKyMgIGluY2x1ZGUgPHNvdW5kY2FyZC5oPgorIyBlbHNlCisjICBpZmRlZiBIQVZFX09TU19JTkNMVURFX0lOX01BQ0hJTkUKKyMgICBpbmNsdWRlIDxtYWNoaW5lL3NvdW5kY2FyZC5oPgorIyAgZWxzZQorIyAgIGVycm9yICJXaGF0IHRvIGluY2x1ZGU/IgorIyAgZW5kaWYgLyogSEFWRV9PU1NfSU5DTFVERV9JTl9NQUNISU5FICovCisjIGVuZGlmIC8qIEhBVkVfT1NTX0lOQ0xVREVfSU5fUk9PVCAqLworI2VuZGlmIC8qIEhBVkVfT1NTX0lOQ0xVREVfSU5fU1lTICovCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgImdzdG9zc2RtYWJ1ZmZlci5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfRVhURVJOIChvc3NfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgb3NzX2RlYnVnCisKK3N0YXRpYyB2b2lkIGdzdF9vc3NkbWFidWZmZXJfY2xhc3NfaW5pdCAoR3N0T3NzRE1BQnVmZmVyQ2xhc3MgKiBrbGFzcyk7CitzdGF0aWMgdm9pZCBnc3Rfb3NzZG1hYnVmZmVyX2luaXQgKEdzdE9zc0RNQUJ1ZmZlciAqIG9zc2RtYWJ1ZmZlcik7CitzdGF0aWMgdm9pZCBnc3Rfb3NzZG1hYnVmZmVyX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpOworc3RhdGljIHZvaWQgZ3N0X29zc2RtYWJ1ZmZlcl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3NzZG1hYnVmZmVyX2FjcXVpcmUgKEdzdFJpbmdCdWZmZXIgKiBidWYsCisgICAgR3N0UmluZ0J1ZmZlclNwZWMgKiBzcGVjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3NzZG1hYnVmZmVyX3JlbGVhc2UgKEdzdFJpbmdCdWZmZXIgKiBidWYpOworc3RhdGljIGdib29sZWFuIGdzdF9vc3NkbWFidWZmZXJfcGxheSAoR3N0UmluZ0J1ZmZlciAqIGJ1Zik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zc2RtYWJ1ZmZlcl9zdG9wIChHc3RSaW5nQnVmZmVyICogYnVmKTsKKworc3RhdGljIEdzdFJpbmdCdWZmZXJDbGFzcyAqcGFyZW50X2NsYXNzID0gTlVMTDsKKworR1R5cGUKK2dzdF9vc3NkbWFidWZmZXJfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSBvc3NkbWFidWZmZXJfdHlwZSA9IDA7CisKKyAgaWYgKCFvc3NkbWFidWZmZXJfdHlwZSkgeworICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gb3NzZG1hYnVmZmVyX2luZm8gPSB7CisgICAgICBzaXplb2YgKEdzdE9zc0RNQUJ1ZmZlckNsYXNzKSwKKyAgICAgIE5VTEwsCisgICAgICBOVUxMLAorICAgICAgKEdDbGFzc0luaXRGdW5jKSBnc3Rfb3NzZG1hYnVmZmVyX2NsYXNzX2luaXQsCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICAgIHNpemVvZiAoR3N0T3NzRE1BQnVmZmVyKSwKKyAgICAgIDAsCisgICAgICAoR0luc3RhbmNlSW5pdEZ1bmMpIGdzdF9vc3NkbWFidWZmZXJfaW5pdCwKKyAgICAgIE5VTEwKKyAgICB9OworCisgICAgb3NzZG1hYnVmZmVyX3R5cGUgPQorICAgICAgICBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChHU1RfVFlQRV9SSU5HQlVGRkVSLCAiR3N0T3NzRE1BQnVmZmVyIiwKKyAgICAgICAgJm9zc2RtYWJ1ZmZlcl9pbmZvLCAwKTsKKyAgfQorICByZXR1cm4gb3NzZG1hYnVmZmVyX3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzZG1hYnVmZmVyX2NsYXNzX2luaXQgKEdzdE9zc0RNQUJ1ZmZlckNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0T2JqZWN0Q2xhc3MgKmdzdG9iamVjdF9jbGFzczsKKyAgR3N0UmluZ0J1ZmZlckNsYXNzICpnc3RyaW5nYnVmZmVyX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RvYmplY3RfY2xhc3MgPSAoR3N0T2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MgPSAoR3N0UmluZ0J1ZmZlckNsYXNzICopIGtsYXNzOworCisgIHBhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3Rfb3NzZG1hYnVmZmVyX2Rpc3Bvc2U7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X29zc2RtYWJ1ZmZlcl9maW5hbGl6ZTsKKworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5hY3F1aXJlID0gZ3N0X29zc2RtYWJ1ZmZlcl9hY3F1aXJlOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5yZWxlYXNlID0gZ3N0X29zc2RtYWJ1ZmZlcl9yZWxlYXNlOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5wbGF5ID0gZ3N0X29zc2RtYWJ1ZmZlcl9wbGF5OworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5zdG9wID0gZ3N0X29zc2RtYWJ1ZmZlcl9zdG9wOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zc2RtYWJ1ZmZlcl9pbml0IChHc3RPc3NETUFCdWZmZXIgKiBvc3NkbWFidWZmZXIpCit7CisgIG9zc2RtYWJ1ZmZlci0+Y29uZCA9IGdfY29uZF9uZXcgKCk7CisgIG9zc2RtYWJ1ZmZlci0+ZWxlbWVudCA9IGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfT1NTRUxFTUVOVCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzZG1hYnVmZmVyX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zc2RtYWJ1ZmZlcl9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0T3NzRE1BQnVmZmVyICpvYnVmID0gKEdzdE9zc0RNQUJ1ZmZlciAqKSBvYmplY3Q7CisKKyAgZ19jb25kX2ZyZWUgKG9idWYtPmNvbmQpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3NkbWFidWZmZXJfZnVuYyAoR3N0UmluZ0J1ZmZlciAqIGJ1ZikKK3sKKyAgZmRfc2V0IHdyaXRlc2V0OworICBzdHJ1Y3QgY291bnRfaW5mbyBjb3VudDsKKyAgR3N0T3NzRE1BQnVmZmVyICpvYnVmID0gKEdzdE9zc0RNQUJ1ZmZlciAqKSBidWY7CisKKyAgR1NUX09CSkVDVF9MT0NLIChidWYpOworICB3aGlsZSAob2J1Zi0+cnVubmluZykgeworICAgIGlmIChidWYtPnN0YXRlID09IEdTVF9SSU5HQlVGRkVSX1NUQVRFX1BMQVlJTkcpIHsKKyAgICAgIGludCBzZWdzaXplOworCisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAoYnVmKTsKKworICAgICAgc2Vnc2l6ZSA9IGJ1Zi0+c3BlYy5zZWdzaXplOworCisgICAgICBGRF9aRVJPICgmd3JpdGVzZXQpOworICAgICAgRkRfU0VUIChvYnVmLT5mZCwgJndyaXRlc2V0KTsKKworICAgICAgc2VsZWN0IChvYnVmLT5mZCArIDEsIE5VTEwsICZ3cml0ZXNldCwgTlVMTCwgTlVMTCk7CisKKyAgICAgIGlmIChpb2N0bCAob2J1Zi0+ZmQsIFNORENUTF9EU1BfR0VUT1BUUiwgJmNvdW50KSA9PSAtMSkgeworICAgICAgICBwZXJyb3IgKCJHRVRPUFRSIik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoY291bnQuYmxvY2tzID4gYnVmLT5zcGVjLnNlZ3RvdGFsKQorICAgICAgICBjb3VudC5ibG9ja3MgPSBidWYtPnNwZWMuc2VndG90YWw7CisKKyAgICAgIGdzdF9yaW5nYnVmZmVyX2NhbGxiYWNrIChidWYsIGNvdW50LmJsb2Nrcyk7CisKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAoYnVmKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX09TU0RNQUJVRkZFUl9TSUdOQUwgKG9idWYpOworICAgICAgR1NUX09TU0RNQUJVRkZFUl9XQUlUIChvYnVmKTsKKyAgICB9CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGJ1Zik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zc2RtYWJ1ZmZlcl9hY3F1aXJlIChHc3RSaW5nQnVmZmVyICogYnVmLCBHc3RSaW5nQnVmZmVyU3BlYyAqIHNwZWMpCit7CisgIGludCB0bXA7CisgIHN0cnVjdCBhdWRpb19idWZfaW5mbyBpbmZvOworICBHc3RPc3NETUFCdWZmZXIgKm9idWYgPSAoR3N0T3NzRE1BQnVmZmVyICopIGJ1ZjsKKyAgY2FkZHJfdCBtbWFwX2J1ZjsKKyAgaW50IG1vZGU7CisgIGdpbnQgc2l6ZTsKKyAgZ2Jvb2xlYW4gcGFyc2VkOworCisgIHBhcnNlZCA9IGdzdF9vc3NlbGVtZW50X3BhcnNlX2NhcHMgKG9idWYtPmVsZW1lbnQsIHNwZWMtPmNhcHMpOworICBpZiAoIXBhcnNlZCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbW9kZSA9IE9fUkRXUjsKKyAgbW9kZSB8PSBPX05PTkJMT0NLOworCisgIG9idWYtPmZkID0gb3BlbiAoIi9kZXYvZHNwIiwgbW9kZSwgMCk7CisgIGlmIChvYnVmLT5mZCA9PSAtMSkgeworICAgIHBlcnJvciAoIk9QRU4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgLy9vYnVmLT5mcmFnID0gMHgwMDA0MDAwODsKKyAgb2J1Zi0+ZnJhZyA9IDB4ZmZmZjAwMGE7CisKKyAgdG1wID0gb2J1Zi0+ZWxlbWVudC0+Zm9ybWF0OworICBpZiAoaW9jdGwgKG9idWYtPmZkLCBTTkRDVExfRFNQX1NFVEZNVCwgJnRtcCkgPT0gLTEpIHsKKyAgICBwZXJyb3IgKCJTRVRGTVQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICB0bXAgPSBvYnVmLT5lbGVtZW50LT5jaGFubmVsczsKKyAgaWYgKGlvY3RsIChvYnVmLT5mZCwgU05EQ1RMX0RTUF9TVEVSRU8sICZ0bXApID09IC0xKSB7CisgICAgcGVycm9yICgiU1RFUkVPIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgdG1wID0gb2J1Zi0+ZWxlbWVudC0+Y2hhbm5lbHM7CisgIGlmIChpb2N0bCAob2J1Zi0+ZmQsIFNORENUTF9EU1BfQ0hBTk5FTFMsICZ0bXApID09IC0xKSB7CisgICAgcGVycm9yICgiQ0hBTk5FTFMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICB0bXAgPSBvYnVmLT5lbGVtZW50LT5yYXRlOworICBpZiAoaW9jdGwgKG9idWYtPmZkLCBTTkRDVExfRFNQX1NQRUVELCAmdG1wKSA9PSAtMSkgeworICAgIHBlcnJvciAoIlNQRUVEIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKGlvY3RsIChvYnVmLT5mZCwgU05EQ1RMX0RTUF9HRVRDQVBTLCAmb2J1Zi0+Y2FwcykgPT0gLTEpIHsKKyAgICBwZXJyb3IgKCIvZGV2L2RzcCIpOworICAgIGZwcmludGYgKHN0ZGVyciwgIlNvcnJ5IGJ1dCB5b3VyIHNvdW5kIGRyaXZlciBpcyB0b28gb2xkXG4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoIShvYnVmLT5jYXBzICYgRFNQX0NBUF9UUklHR0VSKSB8fCAhKG9idWYtPmNhcHMgJiBEU1BfQ0FQX01NQVApKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiU29ycnkgYnV0IHlvdXIgc291bmRjYXJkIGNhbid0IGRvIHRoaXNcbiIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmIChpb2N0bCAob2J1Zi0+ZmQsIFNORENUTF9EU1BfU0VURlJBR01FTlQsICZvYnVmLT5mcmFnKSA9PSAtMSkgeworICAgIHBlcnJvciAoIlNFVEZSQUdNRU5UIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKGlvY3RsIChvYnVmLT5mZCwgU05EQ1RMX0RTUF9HRVRPU1BBQ0UsICZpbmZvKSA9PSAtMSkgeworICAgIHBlcnJvciAoIkdFVE9TUEFDRSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGJ1Zi0+c3BlYy5zZWdzaXplID0gaW5mby5mcmFnc2l6ZTsKKyAgYnVmLT5zcGVjLnNlZ3RvdGFsID0gaW5mby5mcmFnc3RvdGFsOworICBzaXplID0gaW5mby5mcmFnc2l6ZSAqIGluZm8uZnJhZ3N0b3RhbDsKKyAgZ19wcmludCAoInNlZ3NpemUgJWQsIHNlZ3RvdGFsICVkXG4iLCBpbmZvLmZyYWdzaXplLCBpbmZvLmZyYWdzdG90YWwpOworCisgIG1tYXBfYnVmID0gKGNhZGRyX3QpIG1tYXAgKE5VTEwsIHNpemUsIFBST1RfV1JJVEUsCisgICAgICBNQVBfRklMRSB8IE1BUF9TSEFSRUQsIG9idWYtPmZkLCAwKTsKKworICBpZiAoKGNhZGRyX3QpIG1tYXBfYnVmID09IChjYWRkcl90KSAtIDEpIHsKKyAgICBwZXJyb3IgKCJtbWFwICh3cml0ZSkiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBidWYtPmRhdGEgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgR1NUX0JVRkZFUl9EQVRBIChidWYtPmRhdGEpID0gbW1hcF9idWY7CisgIEdTVF9CVUZGRVJfU0laRSAoYnVmLT5kYXRhKSA9IHNpemU7CisgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1Zi0+ZGF0YSwgR1NUX0JVRkZFUl9ET05URlJFRSk7CisKKyAgdG1wID0gMDsKKyAgaWYgKGlvY3RsIChvYnVmLT5mZCwgU05EQ1RMX0RTUF9TRVRUUklHR0VSLCAmdG1wKSA9PSAtMSkgeworICAgIHBlcnJvciAoIlNFVFRSSUdHRVIiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBHU1RfT0JKRUNUX0xPQ0sgKG9idWYpOworICBvYnVmLT5ydW5uaW5nID0gVFJVRTsKKyAgb2J1Zi0+dGhyZWFkID0gZ190aHJlYWRfY3JlYXRlICgoR1RocmVhZEZ1bmMpIGdzdF9vc3NkbWFidWZmZXJfZnVuYywKKyAgICAgIGJ1ZiwgVFJVRSwgTlVMTCk7CisgIEdTVF9PU1NETUFCVUZGRVJfV0FJVCAob2J1Zik7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChvYnVmKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3NzZG1hYnVmZmVyX3JlbGVhc2UgKEdzdFJpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdE9zc0RNQUJ1ZmZlciAqb2J1ZiA9IChHc3RPc3NETUFCdWZmZXIgKikgYnVmOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zi0+ZGF0YSk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChvYnVmKTsKKyAgb2J1Zi0+cnVubmluZyA9IEZBTFNFOworICBHU1RfT1NTRE1BQlVGRkVSX1NJR05BTCAob2J1Zik7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChvYnVmKTsKKworICBnX3RocmVhZF9qb2luIChvYnVmLT50aHJlYWQpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3NkbWFidWZmZXJfcGxheSAoR3N0UmluZ0J1ZmZlciAqIGJ1ZikKK3sKKyAgaW50IHRtcDsKKyAgR3N0T3NzRE1BQnVmZmVyICpvYnVmOworCisgIG9idWYgPSAoR3N0T3NzRE1BQnVmZmVyICopIGJ1ZjsKKworICB0bXAgPSBQQ01fRU5BQkxFX09VVFBVVDsKKyAgaWYgKGlvY3RsIChvYnVmLT5mZCwgU05EQ1RMX0RTUF9TRVRUUklHR0VSLCAmdG1wKSA9PSAtMSkgeworICAgIHBlcnJvciAoIlNFVFRSSUdHRVIiKTsKKyAgfQorICBHU1RfT1NTRE1BQlVGRkVSX1NJR05BTCAob2J1Zik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zc2RtYWJ1ZmZlcl9zdG9wIChHc3RSaW5nQnVmZmVyICogYnVmKQoreworICBpbnQgdG1wOworICBHc3RPc3NETUFCdWZmZXIgKm9idWY7CisKKyAgb2J1ZiA9IChHc3RPc3NETUFCdWZmZXIgKikgYnVmOworCisgIHRtcCA9IDA7CisgIGlmIChpb2N0bCAob2J1Zi0+ZmQsIFNORENUTF9EU1BfU0VUVFJJR0dFUiwgJnRtcCkgPT0gLTEpIHsKKyAgICBwZXJyb3IgKCJTRVRUUklHR0VSIik7CisgIH0KKyAgR1NUX09TU0RNQUJVRkZFUl9XQUlUIChvYnVmKTsKKyAgYnVmLT5wbGF5c2VnID0gMDsKKworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL3N5cy9vc3MvZ3N0b3NzZG1hYnVmZmVyLmggYi9zeXMvb3NzL2dzdG9zc2RtYWJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNDNiMDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3NzL2dzdG9zc2RtYWJ1ZmZlci5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDA1IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogZ3N0b3NzZG1hYnVmZmVyLmg6IAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfT1NTRE1BQlVGRkVSX0hfXworI2RlZmluZSBfX0dTVF9PU1NETUFCVUZGRVJfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJnc3Rvc3NoZWxwZXIuaCIKKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0cmluZ2J1ZmZlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfT1NTRE1BQlVGRkVSICAgICAgICAgICAgKGdzdF9vc3NkbWFidWZmZXJfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX09TU0RNQUJVRkZFUihvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX09TU0RNQUJVRkZFUixHc3RPc3NETUFCdWZmZXIpKQorI2RlZmluZSBHU1RfT1NTRE1BQlVGRkVSX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9PU1NETUFCVUZGRVIsR3N0T3NzRE1BQnVmZmVyQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfT1NTRE1BQlVGRkVSKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfT1NTRE1BQlVGRkVSKSkKKyNkZWZpbmUgR1NUX0lTX09TU0RNQUJVRkZFUl9DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfT1NTRE1BQlVGRkVSKSkKKworI2RlZmluZSBHU1RfT1NTRUxFTUVOVF9HRVQob2JqKSAgR1NUX09TU0VMRU1FTlQgKG9iai0+ZWxlbWVudCkKKwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX09TU0RNQUJVRkZFUl9PUEVOICAgICAgICAgPSAoMSA8PCAwKSwKK30gR3N0T3NzRE1BQnVmZmVyRmxhZ3M7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RPc3NETUFCdWZmZXIgR3N0T3NzRE1BQnVmZmVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zc0RNQUJ1ZmZlckNsYXNzIEdzdE9zc0RNQUJ1ZmZlckNsYXNzOworCisjZGVmaW5lIEdTVF9PU1NETUFCVUZGRVJfVEhSRUFEKGJ1ZikgICAoR1NUX09TU0RNQUJVRkZFUihidWYpLT50aHJlYWQpCisjZGVmaW5lIEdTVF9PU1NETUFCVUZGRVJfTE9DSyAgICAgICAgICBHU1RfT0JKRUNUX0xPQ0sKKyNkZWZpbmUgR1NUX09TU0RNQUJVRkZFUl9VTkxPQ0sgICAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLCisjZGVmaW5lIEdTVF9PU1NETUFCVUZGRVJfQ09ORChidWYpICAgICAoR1NUX09TU0RNQUJVRkZFUihidWYpLT5jb25kKQorI2RlZmluZSBHU1RfT1NTRE1BQlVGRkVSX1NJR05BTChidWYpICAgKGdfY29uZF9zaWduYWwgKEdTVF9PU1NETUFCVUZGRVJfQ09ORCAoYnVmKSkpCisjZGVmaW5lIEdTVF9PU1NETUFCVUZGRVJfV0FJVChidWYpICAgICAoZ19jb25kX3dhaXQgKEdTVF9PU1NETUFCVUZGRVJfQ09ORCAoYnVmKSwgR1NUX09CSkVDVF9HRVRfTE9DSyAoYnVmKSkpCisKK3N0cnVjdCBfR3N0T3NzRE1BQnVmZmVyIHsKKyAgR3N0UmluZ0J1ZmZlciAgYnVmZmVyOworCisgIEdzdE9zc0VsZW1lbnQgKmVsZW1lbnQ7CisKKyAgaW50ICAgICAgICAgICAgZmQ7CisgIGludCAgICAgICAgICAgIGNhcHM7CisgIGludCAgICAgICAgICAgIGZyYWc7CisKKyAgR1RocmVhZCAgICAgICAqdGhyZWFkOworICBHQ29uZCAgICAgICAgICpjb25kOworICBnYm9vbGVhbiAgICAgICBydW5uaW5nOworfTsKKworc3RydWN0IF9Hc3RPc3NETUFCdWZmZXJDbGFzcyB7CisgIEdzdFJpbmdCdWZmZXJDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3Rfb3NzZG1hYnVmZmVyX2dldF90eXBlKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfT1NTRE1BQlVGRkVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL29zcy9nc3Rvc3NoZWxwZXIuYyBiL3N5cy9vc3MvZ3N0b3NzaGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0OWUwMAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3MvZ3N0b3NzaGVscGVyLmMKQEAgLTAsMCArMSw0MjEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDAwIFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BjaGVsbG8uYmU+CisgKgorICogZ3N0b3NzaGVscGVyLmM6IE9TUyBoZWxwZXIgcm91dGluZXMKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3QvZ3N0LWkxOG4tcGx1Z2luLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBIQVZFX09TU19JTkNMVURFX0lOX1NZUworIyBpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+CisjZWxzZQorIyBpZmRlZiBIQVZFX09TU19JTkNMVURFX0lOX1JPT1QKKyMgIGluY2x1ZGUgPHNvdW5kY2FyZC5oPgorIyBlbHNlCisjICBpZmRlZiBIQVZFX09TU19JTkNMVURFX0lOX01BQ0hJTkUKKyMgICBpbmNsdWRlIDxtYWNoaW5lL3NvdW5kY2FyZC5oPgorIyAgZWxzZQorIyAgIGVycm9yICJXaGF0IHRvIGluY2x1ZGU/IgorIyAgZW5kaWYgLyogSEFWRV9PU1NfSU5DTFVERV9JTl9NQUNISU5FICovCisjIGVuZGlmIC8qIEhBVkVfT1NTX0lOQ0xVREVfSU5fUk9PVCAqLworI2VuZGlmIC8qIEhBVkVfT1NTX0lOQ0xVREVfSU5fU1lTICovCisKKyNpbmNsdWRlICJnc3Rvc3NoZWxwZXIuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX0VYVEVSTiAob3NzX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIG9zc19kZWJ1ZworCit0eXBlZGVmIHN0cnVjdCBfR3N0T3NzUHJvYmUgR3N0T3NzUHJvYmU7CitzdHJ1Y3QgX0dzdE9zc1Byb2JlCit7CisgIGludCBmZDsKKyAgaW50IGZvcm1hdDsKKyAgaW50IG5fY2hhbm5lbHM7CisgIEdBcnJheSAqcmF0ZXM7CisgIGludCBtaW47CisgIGludCBtYXg7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfR3N0T3NzUmFuZ2UgR3N0T3NzUmFuZ2U7CitzdHJ1Y3QgX0dzdE9zc1JhbmdlCit7CisgIGludCBtaW47CisgIGludCBtYXg7Cit9OworCitzdGF0aWMgR3N0U3RydWN0dXJlICpnc3Rfb3NzX2hlbHBlcl9nZXRfZm9ybWF0X3N0cnVjdHVyZSAodW5zaWduZWQgaW50CisgICAgZm9ybWF0X2JpdCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zc19oZWxwZXJfcmF0ZV9wcm9iZV9jaGVjayAoR3N0T3NzUHJvYmUgKiBwcm9iZSk7CitzdGF0aWMgaW50IGdzdF9vc3NfaGVscGVyX3JhdGVfY2hlY2tfcmF0ZSAoR3N0T3NzUHJvYmUgKiBwcm9iZSwgaW50IGlyYXRlKTsKK3N0YXRpYyB2b2lkIGdzdF9vc3NfaGVscGVyX3JhdGVfYWRkX3JhbmdlIChHUXVldWUgKiBxdWV1ZSwgaW50IG1pbiwgaW50IG1heCk7CitzdGF0aWMgdm9pZCBnc3Rfb3NzX2hlbHBlcl9yYXRlX2FkZF9yYXRlIChHQXJyYXkgKiBhcnJheSwgaW50IHJhdGUpOworc3RhdGljIGludCBnc3Rfb3NzX2hlbHBlcl9yYXRlX2ludF9jb21wYXJlIChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYik7CisKK0dzdENhcHMgKgorZ3N0X29zc19oZWxwZXJfcHJvYmVfY2FwcyAoZ2ludCBmZCkKK3sKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19MSVRUTEVfRU5ESUFOCisgIGNvbnN0IGd1aW50IHByb2JlX2Zvcm1hdHNbXSA9IHsgQUZNVF9TMTZfTEUsIEFGTVRfVTE2X0xFLCBBRk1UX1U4LCBBRk1UX1M4IH07CisjZWxzZQorICBjb25zdCBndWludCBwcm9iZV9mb3JtYXRzW10gPSB7IEFGTVRfUzE2X0JFLCBBRk1UX1UxNl9CRSwgQUZNVF9VOCwgQUZNVF9TOCB9OworI2VuZGlmCisgIEdzdE9zc1Byb2JlICpwcm9iZTsKKyAgaW50IGksIGY7CisgIGdib29sZWFuIHJldDsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgLyogRklYTUUgdGVzdCBtYWtlIHN1cmUgd2UncmUgbm90IGN1cnJlbnRseSBwbGF5aW5nICovCisgIC8qIEZJWE1FIHRlc3QgYm90aCBtb25vIGFuZCBzdGVyZW8gKi8KKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIC8qIGFzc3VtZSB0aGF0IHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiBmb3JtYXRfbWFzayBpcyAwICovCisgIGZvciAoZiA9IDA7IGYgPCBHX05fRUxFTUVOVFMgKHByb2JlX2Zvcm1hdHMpOyArK2YpIHsKKyAgICBHVmFsdWUgcmF0ZV92YWx1ZSA9IHsgMCB9OworCisgICAgcHJvYmUgPSBnX25ldzAgKEdzdE9zc1Byb2JlLCAxKTsKKyAgICBwcm9iZS0+ZmQgPSBmZDsKKyAgICBwcm9iZS0+Zm9ybWF0ID0gcHJvYmVfZm9ybWF0c1tmXTsKKyAgICAvKiBGSVhNRTogdGhpcyBpcyBub3Qgd29ya2luZyBmb3IgYWxsIGNhcmRzLCBzZWUgYnVnICM1MTg0NzQgKi8KKyAgICBwcm9iZS0+bl9jaGFubmVscyA9IDI7CisKKyAgICByZXQgPSBnc3Rfb3NzX2hlbHBlcl9yYXRlX3Byb2JlX2NoZWNrIChwcm9iZSk7CisgICAgaWYgKHByb2JlLT5taW4gPT0gLTEgfHwgcHJvYmUtPm1heCA9PSAtMSkgeworICAgICAgZ19hcnJheV9mcmVlIChwcm9iZS0+cmF0ZXMsIFRSVUUpOworICAgICAgZ19mcmVlIChwcm9iZSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAocmV0KSB7CisgICAgICBHVmFsdWUgdmFsdWUgPSB7IDAgfTsKKworICAgICAgZ19hcnJheV9zb3J0IChwcm9iZS0+cmF0ZXMsIGdzdF9vc3NfaGVscGVyX3JhdGVfaW50X2NvbXBhcmUpOworCisgICAgICBnX3ZhbHVlX2luaXQgKCZyYXRlX3ZhbHVlLCBHU1RfVFlQRV9MSVNUKTsKKyAgICAgIGdfdmFsdWVfaW5pdCAoJnZhbHVlLCBHX1RZUEVfSU5UKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IHByb2JlLT5yYXRlcy0+bGVuOyBpKyspIHsKKyAgICAgICAgZ192YWx1ZV9zZXRfaW50ICgmdmFsdWUsIGdfYXJyYXlfaW5kZXggKHByb2JlLT5yYXRlcywgaW50LCBpKSk7CisKKyAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmcmF0ZV92YWx1ZSwgJnZhbHVlKTsKKyAgICAgIH0KKworICAgICAgZ192YWx1ZV91bnNldCAoJnZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogb25lIGJpZyByYW5nZSAqLworICAgICAgZ192YWx1ZV9pbml0ICgmcmF0ZV92YWx1ZSwgR1NUX1RZUEVfSU5UX1JBTkdFKTsKKyAgICAgIGdzdF92YWx1ZV9zZXRfaW50X3JhbmdlICgmcmF0ZV92YWx1ZSwgcHJvYmUtPm1pbiwgcHJvYmUtPm1heCk7CisgICAgfQorCisgICAgZ19hcnJheV9mcmVlIChwcm9iZS0+cmF0ZXMsIFRSVUUpOworICAgIGdfZnJlZSAocHJvYmUpOworCisgICAgc3RydWN0dXJlID0gZ3N0X29zc19oZWxwZXJfZ2V0X2Zvcm1hdF9zdHJ1Y3R1cmUgKHByb2JlX2Zvcm1hdHNbZl0pOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzdHJ1Y3R1cmUsICJjaGFubmVscyIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgMiwgTlVMTCk7CisgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKHN0cnVjdHVyZSwgInJhdGUiLCAmcmF0ZV92YWx1ZSk7CisgICAgZ192YWx1ZV91bnNldCAoJnJhdGVfdmFsdWUpOworCisgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2Fwcywgc3RydWN0dXJlKTsKKyAgfQorCisgIGlmIChnc3RfY2Fwc19pc19lbXB0eSAoY2FwcykpIHsKKyAgICAvKiBmaXhtZTogbWFrZSB1c2VyLXZpc2libGUgKi8KKyAgICBHU1RfV0FSTklORyAoIllvdXIgT1NTIGRldmljZSBjb3VsZCBub3QgYmUgcHJvYmVkIGNvcnJlY3RseSIpOworICB9IGVsc2UgeworICAgIGNhcHMgPSBnc3RfY2Fwc19zaW1wbGlmeSAoY2Fwcyk7CisgIH0KKworICBHU1RfREVCVUcgKCJwcm9iZWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgR3N0U3RydWN0dXJlICoKK2dzdF9vc3NfaGVscGVyX2dldF9mb3JtYXRfc3RydWN0dXJlICh1bnNpZ25lZCBpbnQgZm9ybWF0X2JpdCkKK3sKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGNvbnN0IGdjaGFyICpmb3JtYXQ7CisKKyAgc3dpdGNoIChmb3JtYXRfYml0KSB7CisgICAgY2FzZSBBRk1UX1U4OgorICAgICAgZm9ybWF0ID0gIlU4IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUZNVF9TMTZfTEU6CisgICAgICBmb3JtYXQgPSAiUzE2TEUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBRk1UX1MxNl9CRToKKyAgICAgIGZvcm1hdCA9ICJTMTZCRSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFGTVRfUzg6CisgICAgICBmb3JtYXQgPSAiUzgiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBRk1UX1UxNl9MRToKKyAgICAgIGZvcm1hdCA9ICJVMTZMRSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFGTVRfVTE2X0JFOgorICAgICAgZm9ybWF0ID0gIlUxNkJFIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIHJldHVybiBOVUxMOworICB9CisKKyAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJhdWRpby94LXJhdyIsCisgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgZm9ybWF0LAorICAgICAgImxheW91dCIsIEdfVFlQRV9TVFJJTkcsICJpbnRlcmxlYXZlZCIsIE5VTEwpOworCisgIHJldHVybiBzdHJ1Y3R1cmU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zc19oZWxwZXJfcmF0ZV9wcm9iZV9jaGVjayAoR3N0T3NzUHJvYmUgKiBwcm9iZSkKK3sKKyAgR3N0T3NzUmFuZ2UgKnJhbmdlOworICBHUXVldWUgKnJhbmdlczsKKyAgaW50IGV4YWN0X3JhdGVzID0gMDsKKyAgZ2Jvb2xlYW4gY2hlY2tpbmdfZXhhY3RfcmF0ZXMgPSBUUlVFOworICBpbnQgbl9jaGVja3MgPSAwOworICBnYm9vbGVhbiByZXN1bHQgPSBUUlVFOworCisgIHJhbmdlcyA9IGdfcXVldWVfbmV3ICgpOworCisgIHByb2JlLT5yYXRlcyA9IGdfYXJyYXlfbmV3IChGQUxTRSwgRkFMU0UsIHNpemVvZiAoaW50KSk7CisKKyAgcHJvYmUtPm1pbiA9IGdzdF9vc3NfaGVscGVyX3JhdGVfY2hlY2tfcmF0ZSAocHJvYmUsIDEwMDApOworICBuX2NoZWNrcysrOworICBwcm9iZS0+bWF4ID0gZ3N0X29zc19oZWxwZXJfcmF0ZV9jaGVja19yYXRlIChwcm9iZSwgMTAwMDAwKTsKKyAgLyogYSBsaXR0bGUgYnVnIHdvcmthcm91bmQgKi8KKyAgeworICAgIGludCBtYXg7CisKKyAgICBtYXggPSBnc3Rfb3NzX2hlbHBlcl9yYXRlX2NoZWNrX3JhdGUgKHByb2JlLCA0ODAwMCk7CisgICAgaWYgKG1heCA+IHByb2JlLT5tYXgpIHsKKyAgICAgIEdTVF9FUlJPUgorICAgICAgICAgICgiRHJpdmVyIGJ1ZyByZWNvZ25pemVkIChkcml2ZXIgZG9lcyBub3Qgcm91bmQgcmF0ZXMgY29ycmVjdGx5KS4gIFBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydC4iKTsKKyAgICAgIHByb2JlLT5tYXggPSBtYXg7CisgICAgfQorICB9CisgIG5fY2hlY2tzKys7CisgIGlmIChwcm9iZS0+bWluID09IC0xIHx8IHByb2JlLT5tYXggPT0gLTEpIHsKKyAgICAvKiBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgZHJpdmVycyB0aGF0IHJldHVybiAtRUlOVkFMIChvciBhbm90aGVyCisgICAgICogZXJyb3IpIGZvciByYXRlcyBvdXRzaWRlIG9mIFs4MDAwLDQ4MDAwXS4gIElmIHRoaXMgZmFpbHMsIHRoZQorICAgICAqIGRyaXZlciBpcyBzZXJpb3VzbHkgYnVnZ3ksIGFuZCBwcm9iYWJseSBkb2Vzbid0IHdvcmsgd2l0aCBvdGhlcgorICAgICAqIG1lZGlhIGxpYnJhcmllcy9hcHBzLiAgKi8KKyAgICBwcm9iZS0+bWluID0gZ3N0X29zc19oZWxwZXJfcmF0ZV9jaGVja19yYXRlIChwcm9iZSwgODAwMCk7CisgICAgcHJvYmUtPm1heCA9IGdzdF9vc3NfaGVscGVyX3JhdGVfY2hlY2tfcmF0ZSAocHJvYmUsIDQ4MDAwKTsKKyAgfQorICBpZiAocHJvYmUtPm1pbiA9PSAtMSB8fCBwcm9iZS0+bWF4ID09IC0xKSB7CisgICAgR1NUX0RFQlVHICgidW5leHBlY3RlZCBjaGVja19yYXRlIGVycm9yIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGdzdF9vc3NfaGVscGVyX3JhdGVfYWRkX3JhbmdlIChyYW5nZXMsIHByb2JlLT5taW4gKyAxLCBwcm9iZS0+bWF4IC0gMSk7CisKKyAgd2hpbGUgKChyYW5nZSA9IGdfcXVldWVfcG9wX2hlYWQgKHJhbmdlcykpKSB7CisgICAgaW50IG1pbjE7CisgICAgaW50IG1heDE7CisgICAgaW50IG1pZDsKKyAgICBpbnQgbWlkX3JldDsKKworICAgIEdTVF9ERUJVRyAoImNoZWNraW5nIFslZCwlZF0iLCByYW5nZS0+bWluLCByYW5nZS0+bWF4KTsKKworICAgIG1pZCA9IChyYW5nZS0+bWluICsgcmFuZ2UtPm1heCkgLyAyOworICAgIG1pZF9yZXQgPSBnc3Rfb3NzX2hlbHBlcl9yYXRlX2NoZWNrX3JhdGUgKHByb2JlLCBtaWQpOworICAgIGlmIChtaWRfcmV0ID09IC0xKSB7CisgICAgICAvKiBGSVhNRSBpb2N0bCByZXR1cm5lZCBhbiBlcnJvci4gIGRvIHNvbWV0aGluZyAqLworICAgICAgR1NUX0RFQlVHICgidW5leHBlY3RlZCBjaGVja19yYXRlIGVycm9yIik7CisgICAgfQorICAgIG5fY2hlY2tzKys7CisKKyAgICBpZiAobWlkID09IG1pZF9yZXQgJiYgY2hlY2tpbmdfZXhhY3RfcmF0ZXMpIHsKKyAgICAgIGludCBtYXhfZXhhY3RfbWF0Y2hlcyA9IDIwOworCisgICAgICBleGFjdF9yYXRlcysrOworICAgICAgaWYgKGV4YWN0X3JhdGVzID4gbWF4X2V4YWN0X21hdGNoZXMpIHsKKyAgICAgICAgR1NUX0RFQlVHICgiZ290ICVkIGV4YWN0IHJhdGVzLCBhc3N1bWluZyBhbGwgYXJlIGV4YWN0IiwKKyAgICAgICAgICAgIG1heF9leGFjdF9tYXRjaGVzKTsKKyAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgIGdfZnJlZSAocmFuZ2UpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgY2hlY2tpbmdfZXhhY3RfcmF0ZXMgPSBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBBc3N1bWUgdGhhdCB0aGUgcmF0ZSBpcyBhcml0aG1ldGljYWxseSByb3VuZGVkIHRvIHRoZSBuZWFyZXN0CisgICAgICogc3VwcG9ydGVkIHJhdGUuICovCisgICAgaWYgKG1pZCA9PSBtaWRfcmV0KSB7CisgICAgICBtaW4xID0gbWlkIC0gMTsKKyAgICAgIG1heDEgPSBtaWQgKyAxOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobWlkIDwgbWlkX3JldCkgeworICAgICAgICBtaW4xID0gbWlkIC0gKG1pZF9yZXQgLSBtaWQpOworICAgICAgICBtYXgxID0gbWlkX3JldCArIDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBtaW4xID0gbWlkX3JldCAtIDE7CisgICAgICAgIG1heDEgPSBtaWQgKyAobWlkIC0gbWlkX3JldCk7CisgICAgICB9CisgICAgfQorCisgICAgZ3N0X29zc19oZWxwZXJfcmF0ZV9hZGRfcmFuZ2UgKHJhbmdlcywgcmFuZ2UtPm1pbiwgbWluMSk7CisgICAgZ3N0X29zc19oZWxwZXJfcmF0ZV9hZGRfcmFuZ2UgKHJhbmdlcywgbWF4MSwgcmFuZ2UtPm1heCk7CisKKyAgICBnX2ZyZWUgKHJhbmdlKTsKKyAgfQorCisgIHdoaWxlICgocmFuZ2UgPSBnX3F1ZXVlX3BvcF9oZWFkIChyYW5nZXMpKSkgeworICAgIGdfZnJlZSAocmFuZ2UpOworICB9CisgIGdfcXVldWVfZnJlZSAocmFuZ2VzKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zc19oZWxwZXJfcmF0ZV9hZGRfcmFuZ2UgKEdRdWV1ZSAqIHF1ZXVlLCBpbnQgbWluLCBpbnQgbWF4KQoreworICBpZiAobWluIDw9IG1heCkgeworICAgIEdzdE9zc1JhbmdlICpyYW5nZSA9IGdfbmV3MCAoR3N0T3NzUmFuZ2UsIDEpOworCisgICAgcmFuZ2UtPm1pbiA9IG1pbjsKKyAgICByYW5nZS0+bWF4ID0gbWF4OworCisgICAgZ19xdWV1ZV9wdXNoX3RhaWwgKHF1ZXVlLCByYW5nZSk7CisgICAgLyogcHVzaF9oZWFkIGFsc28gd29ya3MsIGJ1dCBoYXMgZGlmZmVyZW50IHByb2JpbmcgYmVoYXZpb3IgKi8KKyAgICAvKmdfcXVldWVfcHVzaF9oZWFkIChxdWV1ZSwgcmFuZ2UpOyAqLworICB9Cit9CisKK3N0YXRpYyBpbnQKK2dzdF9vc3NfaGVscGVyX3JhdGVfY2hlY2tfcmF0ZSAoR3N0T3NzUHJvYmUgKiBwcm9iZSwgaW50IGlyYXRlKQoreworICBpbnQgcmF0ZTsKKyAgaW50IGZvcm1hdDsKKyAgaW50IG5fY2hhbm5lbHM7CisgIGludCByZXQ7CisKKyAgcmF0ZSA9IGlyYXRlOworICBmb3JtYXQgPSBwcm9iZS0+Zm9ybWF0OworICBuX2NoYW5uZWxzID0gcHJvYmUtPm5fY2hhbm5lbHM7CisKKyAgR1NUX0xPRyAoImNoZWNraW5nIGZvcm1hdCAlZCwgY2hhbm5lbHMgJWQsIHJhdGUgJWQiLAorICAgICAgZm9ybWF0LCBuX2NoYW5uZWxzLCByYXRlKTsKKyAgcmV0ID0gaW9jdGwgKHByb2JlLT5mZCwgU05EQ1RMX0RTUF9TRVRGTVQsICZmb3JtYXQpOworICBpZiAocmV0IDwgMCB8fCBmb3JtYXQgIT0gcHJvYmUtPmZvcm1hdCkgeworICAgIEdTVF9ERUJVRyAoInVuc3VwcG9ydGVkIGZvcm1hdDogJWQgKCVkKSIsIHByb2JlLT5mb3JtYXQsIGZvcm1hdCk7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldCA9IGlvY3RsIChwcm9iZS0+ZmQsIFNORENUTF9EU1BfQ0hBTk5FTFMsICZuX2NoYW5uZWxzKTsKKyAgaWYgKHJldCA8IDAgfHwgbl9jaGFubmVscyAhPSBwcm9iZS0+bl9jaGFubmVscykgeworICAgIEdTVF9ERUJVRyAoInVuc3VwcG9ydGVkIGNoYW5uZWxzOiAlZCAoJWQpIiwgcHJvYmUtPm5fY2hhbm5lbHMsIG5fY2hhbm5lbHMpOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXQgPSBpb2N0bCAocHJvYmUtPmZkLCBTTkRDVExfRFNQX1NQRUVELCAmcmF0ZSk7CisgIGlmIChyZXQgPCAwKSB7CisgICAgR1NUX0RFQlVHICgidW5zdXBwb3J0ZWQgcmF0ZTogJWQgKCVkKSIsIGlyYXRlLCByYXRlKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBHU1RfREVCVUcgKCJyYXRlICVkIC0+ICVkIiwgaXJhdGUsIHJhdGUpOworCisgIGlmIChyYXRlID09IGlyYXRlIC0gMSB8fCByYXRlID09IGlyYXRlICsgMSkgeworICAgIHJhdGUgPSBpcmF0ZTsKKyAgfQorICBnc3Rfb3NzX2hlbHBlcl9yYXRlX2FkZF9yYXRlIChwcm9iZS0+cmF0ZXMsIHJhdGUpOworICByZXR1cm4gcmF0ZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3NfaGVscGVyX3JhdGVfYWRkX3JhdGUgKEdBcnJheSAqIGFycmF5LCBpbnQgcmF0ZSkKK3sKKyAgaW50IGk7CisgIGludCB2YWw7CisKKyAgZm9yIChpID0gMDsgaSA8IGFycmF5LT5sZW47IGkrKykgeworICAgIHZhbCA9IGdfYXJyYXlfaW5kZXggKGFycmF5LCBpbnQsIGkpOworCisgICAgaWYgKHZhbCA9PSByYXRlKQorICAgICAgcmV0dXJuOworICB9CisgIEdTVF9ERUJVRyAoInN1cHBvcnRlZCByYXRlOiAlZCIsIHJhdGUpOworICBnX2FycmF5X2FwcGVuZF92YWwgKGFycmF5LCByYXRlKTsKK30KKworc3RhdGljIGludAorZ3N0X29zc19oZWxwZXJfcmF0ZV9pbnRfY29tcGFyZSAoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpCit7CisgIGNvbnN0IGludCAqdmEgPSAoY29uc3QgaW50ICopIGE7CisgIGNvbnN0IGludCAqdmIgPSAoY29uc3QgaW50ICopIGI7CisKKyAgaWYgKCp2YSA8ICp2YikKKyAgICByZXR1cm4gLTE7CisgIGlmICgqdmEgPiAqdmIpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitnY2hhciAqCitnc3Rfb3NzX2hlbHBlcl9nZXRfY2FyZF9uYW1lIChjb25zdCBnY2hhciAqIG1peGVyX25hbWUpCit7CisjaWZkZWYgU09VTkRfTUlYRVJfSU5GTworICBzdHJ1Y3QgbWl4ZXJfaW5mbyBtaW5mbzsKKyNlbmRpZgorICBnaW50IGZkOworICBnY2hhciAqbmFtZSA9IE5VTEw7CisKKyAgR1NUX0lORk8gKCJPcGVuaW5nIG1peGVyIGZvciBkZXZpY2UgJXMiLCBtaXhlcl9uYW1lKTsKKyAgZmQgPSBvcGVuIChtaXhlcl9uYW1lLCBPX1JEV1IpOworICBpZiAoZmQgPT0gLTEpCisgICAgZ290byBvcGVuX2ZhaWxlZDsKKworICAvKiBnZXQgbmFtZSwgbm90IGZhdGFsICovCisjaWZkZWYgU09VTkRfTUlYRVJfSU5GTworICBpZiAoaW9jdGwgKGZkLCBTT1VORF9NSVhFUl9JTkZPLCAmbWluZm8pID09IDApIHsKKyAgICBuYW1lID0gZ19zdHJkdXAgKG1pbmZvLm5hbWUpOworICAgIEdTVF9JTkZPICgiQ2FyZCBuYW1lID0gJXMiLCBHU1RfU1RSX05VTEwgKG5hbWUpKTsKKyAgfSBlbHNlCisjZW5kaWYKKyAgeworICAgIG5hbWUgPSBnX3N0cmR1cCAoIlVua25vd24iKTsKKyAgICBHU1RfSU5GTyAoIlVua25vd24gY2FyZCBuYW1lIik7CisgIH0KKworICBjbG9zZSAoZmQpOworICByZXR1cm4gbmFtZTsKKworICAvKiBFUlJPUlMgKi8KK29wZW5fZmFpbGVkOgorICB7CisgICAgLyogdGhpcyBpcyB2YWxpZC4gT1NTIGRldmljZXMgZG9uJ3QgbmVlZCB0byBleHBvc2UgYSBtaXhlciAqLworICAgIEdTVF9ERUJVRyAoIkZhaWxlZCB0byBvcGVuIG1peGVyIGRldmljZSAlcywgbWl4aW5nIGRpc2FibGVkOiAlcyIsCisgICAgICAgIG1peGVyX25hbWUsIHN0cmVycm9yIChlcnJubykpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CmRpZmYgLS1naXQgYS9zeXMvb3NzL2dzdG9zc2hlbHBlci5oIGIvc3lzL29zcy9nc3Rvc3NoZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWY5OTE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zcy9nc3Rvc3NoZWxwZXIuaApAQCAtMCwwICsxLDQ2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwMCBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY2hlbGxvLmJlPgorICoKKyAqIGdzdG9zc2hlbHBlci5oOiBPU1MgaGVscGVyIHJvdXRpbmVzLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9PU1NfSEVMUEVSX0hfXworI2RlZmluZSBfX0dTVF9PU1NfSEVMUEVSX0hfXworCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJnc3Rvc3NoZWxwZXIuaCIKKworCitHX0JFR0lOX0RFQ0xTCisKKworR3N0Q2FwcyogZ3N0X29zc19oZWxwZXJfcHJvYmVfY2FwcyAoZ2ludCBmZCk7CisKK2djaGFyICpnc3Rfb3NzX2hlbHBlcl9nZXRfY2FyZF9uYW1lIChjb25zdCBnY2hhciAqIG1peGVyX25hbWUpOworCisKKworR19FTkRfREVDTFMKKworCisjZW5kaWYgLyogX19HU1RfT1NTX0hFTFBFUl9IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy9vc3MvZ3N0b3Nzc2luay5jIGIvc3lzL29zcy9nc3Rvc3NzaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU2YjhjNQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3MvZ3N0b3Nzc2luay5jCkBAIC0wLDAgKzEsNTU2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgIDIwMDAsMjAwNSBXaW0gVGF5bWFucyA8d2ltQGZsdWVuZG8uY29tPgorICoKKyAqIGdzdG9zc3NpbmsuYzogCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtb3Nzc2luaworICoKKyAqIFRoaXMgZWxlbWVudCBsZXRzIHlvdSBvdXRwdXQgc291bmQgdXNpbmcgdGhlIE9wZW4gU291bmQgU3lzdGVtIChPU1MpLgorICoKKyAqIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIGFsbW9zdCBhbHdheXMgdXNlIGdlbmVyaWMgYXVkaW8gY29udmVyc2lvbiBlbGVtZW50cworICogbGlrZSBhdWRpb2NvbnZlcnQgYW5kIGF1ZGlvcmVzYW1wbGUgaW4gZnJvbnQgb2YgYW4gYXVkaW9zaW5rIHRvIG1ha2Ugc3VyZQorICogeW91ciBwaXBlbGluZSB3b3JrcyB1bmRlciBhbGwgY2lyY3Vtc3RhbmNlcyAodGhvc2UgY29udmVyc2lvbiBlbGVtZW50cyB3aWxsCisgKiBhY3QgaW4gcGFzc3Rocm91Z2gtbW9kZSBpZiBubyBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeSkuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBhdWRpb3Rlc3RzcmMgISBhdWRpb2NvbnZlcnQgISB2b2x1bWUgdm9sdW1lPTAuMSAhIG9zc3NpbmsKKyAqIF18IHdpbGwgb3V0cHV0IGEgc2luZSB3YXZlIChjb250aW51b3VzIGJlZXAgc291bmQpIHRvIHlvdXIgc291bmQgY2FyZCAod2l0aAorICogYSB2ZXJ5IGxvdyB2b2x1bWUgYXMgcHJlY2F1dGlvbikuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgZmlsZXNyYyBsb2NhdGlvbj1tdXNpYy5vZ2cgISBkZWNvZGViaW4gISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgb3Nzc2luaworICogXXwgd2lsbCBwbGF5IGFuIE9nZy9Wb3JiaXMgYXVkaW8gZmlsZSBhbmQgb3V0cHV0IGl0IHVzaW5nIHRoZSBPcGVuIFNvdW5kIFN5c3RlbS4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIEhBVkVfT1NTX0lOQ0xVREVfSU5fU1lTCisjIGluY2x1ZGUgPHN5cy9zb3VuZGNhcmQuaD4KKyNlbHNlCisjIGlmZGVmIEhBVkVfT1NTX0lOQ0xVREVfSU5fUk9PVAorIyAgaW5jbHVkZSA8c291bmRjYXJkLmg+CisjIGVsc2UKKyMgIGlmZGVmIEhBVkVfT1NTX0lOQ0xVREVfSU5fTUFDSElORQorIyAgIGluY2x1ZGUgPG1hY2hpbmUvc291bmRjYXJkLmg+CisjICBlbHNlCisjICAgZXJyb3IgIldoYXQgdG8gaW5jbHVkZT8iCisjICBlbmRpZiAvKiBIQVZFX09TU19JTkNMVURFX0lOX01BQ0hJTkUgKi8KKyMgZW5kaWYgLyogSEFWRV9PU1NfSU5DTFVERV9JTl9ST09UICovCisjZW5kaWYgLyogSEFWRV9PU1NfSU5DTFVERV9JTl9TWVMgKi8KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImdzdG9zc3NpbmsuaCIKKworI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX0VYVEVSTiAob3NzX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIG9zc19kZWJ1ZworCitzdGF0aWMgdm9pZCBnc3Rfb3NzX3NpbmtfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3Rfb3NzX3NpbmtfZmluYWxpc2UgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3Rfb3NzX3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X29zc19zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworc3RhdGljIEdzdENhcHMgKmdzdF9vc3Nfc2lua19nZXRjYXBzIChHc3RCYXNlU2luayAqIGJzaW5rLCBHc3RDYXBzICogZmlsdGVyKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9vc3Nfc2lua19vcGVuIChHc3RBdWRpb1NpbmsgKiBhc2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zc19zaW5rX2Nsb3NlIChHc3RBdWRpb1NpbmsgKiBhc2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zc19zaW5rX3ByZXBhcmUgKEdzdEF1ZGlvU2luayAqIGFzaW5rLAorICAgIEdzdEF1ZGlvUmluZ0J1ZmZlclNwZWMgKiBzcGVjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3NzX3NpbmtfdW5wcmVwYXJlIChHc3RBdWRpb1NpbmsgKiBhc2luayk7CitzdGF0aWMgZ2ludCBnc3Rfb3NzX3Npbmtfd3JpdGUgKEdzdEF1ZGlvU2luayAqIGFzaW5rLCBncG9pbnRlciBkYXRhLAorICAgIGd1aW50IGxlbmd0aCk7CitzdGF0aWMgZ3VpbnQgZ3N0X29zc19zaW5rX2RlbGF5IChHc3RBdWRpb1NpbmsgKiBhc2luayk7CitzdGF0aWMgdm9pZCBnc3Rfb3NzX3NpbmtfcmVzZXQgKEdzdEF1ZGlvU2luayAqIGFzaW5rKTsKKworLyogT3NzU2luayBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIExBU1RfU0lHTkFMCit9OworCisjZGVmaW5lIERFRkFVTFRfREVWSUNFICAiL2Rldi9kc3AiCitlbnVtCit7CisgIFBST1BfMCwKKyAgUFJPUF9ERVZJQ0UsCit9OworCisjZGVmaW5lIEZPUk1BVFMgInsiIEdTVF9BVURJT19ORShTMTYpIiwiR1NUX0FVRElPX05FKFUxNikiLCBTOCwgVTggfSIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIG9zc3Npbmtfc2lua19mYWN0b3J5ID0KKyAgICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBGT1JNQVRTICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCBNQVggXSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxOyAiCisgICAgICAgICJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBGT1JNQVRTICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCBNQVggXSwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAyLCAiICJjaGFubmVsLW1hc2sgPSAoYml0bWFzaykgMHgzIikKKyAgICApOworCisvKiBzdGF0aWMgZ3VpbnQgZ3N0X29zc19zaW5rX3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07ICovCisKKyNkZWZpbmUgZ3N0X29zc19zaW5rX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdE9zc1NpbmssIGdzdF9vc3Nfc2luaywgR1NUX1RZUEVfQVVESU9fU0lOSyk7CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzX3NpbmtfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0T3NzU2luayAqb3Nzc2luayA9IEdTVF9PU1NTSU5LIChvYmplY3QpOworCisgIGlmIChvc3NzaW5rLT5wcm9iZWRfY2FwcykgeworICAgIGdzdF9jYXBzX3VucmVmIChvc3NzaW5rLT5wcm9iZWRfY2Fwcyk7CisgICAgb3Nzc2luay0+cHJvYmVkX2NhcHMgPSBOVUxMOworICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzX3NpbmtfY2xhc3NfaW5pdCAoR3N0T3NzU2lua0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCYXNlU2lua0NsYXNzICpnc3RiYXNlc2lua19jbGFzczsKKyAgR3N0QXVkaW9TaW5rQ2xhc3MgKmdzdGF1ZGlvc2lua19jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdGJhc2VzaW5rX2NsYXNzID0gKEdzdEJhc2VTaW5rQ2xhc3MgKikga2xhc3M7CisgIGdzdGF1ZGlvc2lua19jbGFzcyA9IChHc3RBdWRpb1NpbmtDbGFzcyAqKSBrbGFzczsKKworICBwYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X29zc19zaW5rX2Rpc3Bvc2U7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X29zc19zaW5rX2ZpbmFsaXNlOworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfb3NzX3NpbmtfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3Rfb3NzX3Npbmtfc2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfREVWSUNFLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRldmljZSIsICJEZXZpY2UiLAorICAgICAgICAgICJPU1MgZGV2aWNlICh1c3VhbGx5IC9kZXYvZHNwTikiLCBERUZBVUxUX0RFVklDRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnc3RiYXNlc2lua19jbGFzcy0+Z2V0X2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zc19zaW5rX2dldGNhcHMpOworCisgIGdzdGF1ZGlvc2lua19jbGFzcy0+b3BlbiA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzX3Npbmtfb3Blbik7CisgIGdzdGF1ZGlvc2lua19jbGFzcy0+Y2xvc2UgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zc19zaW5rX2Nsb3NlKTsKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzLT5wcmVwYXJlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3Nfc2lua19wcmVwYXJlKTsKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzLT51bnByZXBhcmUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zc19zaW5rX3VucHJlcGFyZSk7CisgIGdzdGF1ZGlvc2lua19jbGFzcy0+d3JpdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zc19zaW5rX3dyaXRlKTsKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzLT5kZWxheSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzX3NpbmtfZGVsYXkpOworICBnc3RhdWRpb3NpbmtfY2xhc3MtPnJlc2V0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3Nfc2lua19yZXNldCk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywgIkF1ZGlvIFNpbmsgKE9TUykiLAorICAgICAgIlNpbmsvQXVkaW8iLAorICAgICAgIk91dHB1dCB0byBhIHNvdW5kIGNhcmQgdmlhIE9TUyIsCisgICAgICAiRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4sICIKKyAgICAgICJXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAY2hlbGxvLmJlPiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLAorICAgICAgJm9zc3Npbmtfc2lua19mYWN0b3J5KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3Nfc2lua19pbml0IChHc3RPc3NTaW5rICogb3Nzc2luaykKK3sKKyAgY29uc3QgZ2NoYXIgKmRldmljZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChvc3NzaW5rLCAiaW5pdGlhbGl6aW5nIG9zc3NpbmsiKTsKKworICBkZXZpY2UgPSBnX2dldGVudiAoIkFVRElPREVWIik7CisgIGlmIChkZXZpY2UgPT0gTlVMTCkKKyAgICBkZXZpY2UgPSBERUZBVUxUX0RFVklDRTsKKyAgb3Nzc2luay0+ZGV2aWNlID0gZ19zdHJkdXAgKGRldmljZSk7CisgIG9zc3NpbmstPmZkID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzX3NpbmtfZmluYWxpc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdE9zc1NpbmsgKm9zc3NpbmsgPSBHU1RfT1NTU0lOSyAob2JqZWN0KTsKKworICBnX2ZyZWUgKG9zc3NpbmstPmRldmljZSk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplICgoR09iamVjdCAqKSAob2JqZWN0KSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzX3Npbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE9zc1NpbmsgKnNpbms7CisKKyAgc2luayA9IEdTVF9PU1NTSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9ERVZJQ0U6CisgICAgICBnX2ZyZWUgKHNpbmstPmRldmljZSk7CisgICAgICBzaW5rLT5kZXZpY2UgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGlmIChzaW5rLT5wcm9iZWRfY2FwcykgeworICAgICAgICBnc3RfY2Fwc191bnJlZiAoc2luay0+cHJvYmVkX2NhcHMpOworICAgICAgICBzaW5rLT5wcm9iZWRfY2FwcyA9IE5VTEw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzX3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE9zc1NpbmsgKnNpbms7CisKKyAgc2luayA9IEdTVF9PU1NTSU5LIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9ERVZJQ0U6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzaW5rLT5kZXZpY2UpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3Rfb3NzX3NpbmtfZ2V0Y2FwcyAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0T3NzU2luayAqb3Nzc2luazsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBvc3NzaW5rID0gR1NUX09TU1NJTksgKGJzaW5rKTsKKworICBpZiAob3Nzc2luay0+ZmQgPT0gLTEpIHsKKyAgICBjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9CQVNFX1NJTktfUEFEIChic2luaykpOworICB9IGVsc2UgaWYgKG9zc3NpbmstPnByb2JlZF9jYXBzKSB7CisgICAgY2FwcyA9IGdzdF9jYXBzX3JlZiAob3Nzc2luay0+cHJvYmVkX2NhcHMpOworICB9IGVsc2UgeworICAgIGNhcHMgPSBnc3Rfb3NzX2hlbHBlcl9wcm9iZV9jYXBzIChvc3NzaW5rLT5mZCk7CisgICAgaWYgKGNhcHMgJiYgIWdzdF9jYXBzX2lzX2VtcHR5IChjYXBzKSkgeworICAgICAgb3Nzc2luay0+cHJvYmVkX2NhcHMgPSBnc3RfY2Fwc19yZWYgKGNhcHMpOworICAgIH0KKyAgfQorCisgIGlmIChmaWx0ZXIgJiYgY2FwcykgeworICAgIEdzdENhcHMgKmludGVyc2VjdGlvbjsKKworICAgIGludGVyc2VjdGlvbiA9CisgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIGNhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIHJldHVybiBpbnRlcnNlY3Rpb247CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGNhcHM7CisgIH0KK30KKworc3RhdGljIGdpbnQKK2lsb2cyIChnaW50IHgpCit7CisgIC8qIHdlbGwuLi4gaGFja2VyJ3MgZGVsaWdodCBleHBsYWlucy4uLiAqLworICB4ID0geCB8ICh4ID4+IDEpOworICB4ID0geCB8ICh4ID4+IDIpOworICB4ID0geCB8ICh4ID4+IDQpOworICB4ID0geCB8ICh4ID4+IDgpOworICB4ID0geCB8ICh4ID4+IDE2KTsKKyAgeCA9IHggLSAoKHggPj4gMSkgJiAweDU1NTU1NTU1KTsKKyAgeCA9ICh4ICYgMHgzMzMzMzMzMykgKyAoKHggPj4gMikgJiAweDMzMzMzMzMzKTsKKyAgeCA9ICh4ICsgKHggPj4gNCkpICYgMHgwZjBmMGYwZjsKKyAgeCA9IHggKyAoeCA+PiA4KTsKKyAgeCA9IHggKyAoeCA+PiAxNik7CisgIHJldHVybiAoeCAmIDB4MDAwMDAwM2YpIC0gMTsKK30KKworc3RhdGljIGdpbnQKK2dzdF9vc3Nfc2lua19nZXRfZm9ybWF0IChHc3RBdWRpb1JpbmdCdWZmZXJGb3JtYXRUeXBlIGZtdCwgR3N0QXVkaW9Gb3JtYXQgcmZtdCkKK3sKKyAgZ2ludCByZXN1bHQ7CisKKyAgc3dpdGNoIChmbXQpIHsKKyAgICBjYXNlIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9NVV9MQVc6CisgICAgICByZXN1bHQgPSBBRk1UX01VX0xBVzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX0FfTEFXOgorICAgICAgcmVzdWx0ID0gQUZNVF9BX0xBVzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX0lNQV9BRFBDTToKKyAgICAgIHJlc3VsdCA9IEFGTVRfSU1BX0FEUENNOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfTVBFRzoKKyAgICAgIHJlc3VsdCA9IEFGTVRfTVBFRzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX1JBVzoKKyAgICB7CisgICAgICBzd2l0Y2ggKHJmbXQpIHsKKyAgICAgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1U4OgorICAgICAgICAgIHJlc3VsdCA9IEFGTVRfVTg7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMTZMRToKKyAgICAgICAgICByZXN1bHQgPSBBRk1UX1MxNl9MRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MxNkJFOgorICAgICAgICAgIHJlc3VsdCA9IEFGTVRfUzE2X0JFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzg6CisgICAgICAgICAgcmVzdWx0ID0gQUZNVF9TODsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1UxNkxFOgorICAgICAgICAgIHJlc3VsdCA9IEFGTVRfVTE2X0xFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfVTE2QkU6CisgICAgICAgICAgcmVzdWx0ID0gQUZNVF9VMTZfQkU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzdWx0ID0gMDsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zc19zaW5rX29wZW4gKEdzdEF1ZGlvU2luayAqIGFzaW5rKQoreworICBHc3RPc3NTaW5rICpvc3M7CisgIGludCBtb2RlOworCisgIG9zcyA9IEdTVF9PU1NTSU5LIChhc2luayk7CisKKyAgbW9kZSA9IE9fV1JPTkxZOworICBtb2RlIHw9IE9fTk9OQkxPQ0s7CisKKyAgb3NzLT5mZCA9IG9wZW4gKG9zcy0+ZGV2aWNlLCBtb2RlLCAwKTsKKyAgaWYgKG9zcy0+ZmQgPT0gLTEpIHsKKyAgICBzd2l0Y2ggKGVycm5vKSB7CisgICAgICBjYXNlIEVCVVNZOgorICAgICAgICBnb3RvIGJ1c3k7CisgICAgICBjYXNlIEVBQ0NFUzoKKyAgICAgICAgZ290byBub19wZXJtaXNzaW9uOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBvcGVuX2ZhaWxlZDsKKyAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2J1c3k6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3NzLCBSRVNPVVJDRSwgQlVTWSwKKyAgICAgICAgKF8oIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suICIKKyAgICAgICAgICAgICAgICAiRGV2aWNlIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciBhcHBsaWNhdGlvbi4iKSksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19wZXJtaXNzaW9uOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9zcywgUkVTT1VSQ0UsIE9QRU5fV1JJVEUsCisgICAgICAgIChfKCJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiAiCisgICAgICAgICAgICAgICAgIllvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiB0aGUgZGV2aWNlLiIpKSwKKyAgICAgICAgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitvcGVuX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvc3MsIFJFU09VUkNFLCBPUEVOX1dSSVRFLAorICAgICAgICAoXygiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iKSksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3Nfc2lua19jbG9zZSAoR3N0QXVkaW9TaW5rICogYXNpbmspCit7CisgIGNsb3NlIChHU1RfT1NTU0lOSyAoYXNpbmspLT5mZCk7CisgIEdTVF9PU1NTSU5LIChhc2luayktPmZkID0gLTE7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3Nfc2lua19wcmVwYXJlIChHc3RBdWRpb1NpbmsgKiBhc2luaywgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpCit7CisgIEdzdE9zc1NpbmsgKm9zczsKKyAgc3RydWN0IGF1ZGlvX2J1Zl9pbmZvIGluZm87CisgIGludCBtb2RlOworICBpbnQgdG1wOworICBndWludCB3aWR0aCwgcmF0ZSwgY2hhbm5lbHM7CisKKyAgb3NzID0gR1NUX09TU1NJTksgKGFzaW5rKTsKKworICAvKiB3ZSBvcGVuZWQgbm9uLWJsb2NraW5nIHNvIHRoYXQgd2UgY2FuIGRldGVjdCBpZiB0aGUgZGV2aWNlIGlzIGF2YWlsYWJsZQorICAgKiB3aXRob3V0IGhhbmdpbmcgZm9yZXZlci4gV2Ugbm93IHdhbnQgdG8gcmVtb3ZlIHRoZSBub24tYmxvY2tpbmcgZmxhZy4gKi8KKyAgbW9kZSA9IGZjbnRsIChvc3MtPmZkLCBGX0dFVEZMKTsKKyAgbW9kZSAmPSB+T19OT05CTE9DSzsKKyAgaWYgKGZjbnRsIChvc3MtPmZkLCBGX1NFVEZMLCBtb2RlKSA9PSAtMSkgeworICAgIC8qIHNvbWUgZHJpdmVycyBkbyBubyBzdXBwb3J0IHVuc2V0dGluZyB0aGUgbm9uLWJsb2NraW5nIGZsYWcsIHRyeSB0bworICAgICAqIGNsb3NlL29wZW4gdGhlIGRldmljZSB0aGVuLiBUaGlzIGlzIHJhY3kgYnV0IHdlIGVycm9yIG91dCBwcm9wZXJseS4gKi8KKyAgICBnc3Rfb3NzX3NpbmtfY2xvc2UgKGFzaW5rKTsKKyAgICBpZiAoKG9zcy0+ZmQgPSBvcGVuIChvc3MtPmRldmljZSwgT19XUk9OTFksIDApKSA9PSAtMSkKKyAgICAgIGdvdG8gbm9uX2Jsb2NrOworICB9CisKKyAgdG1wID0gZ3N0X29zc19zaW5rX2dldF9mb3JtYXQgKHNwZWMtPnR5cGUsCisgICAgICBHU1RfQVVESU9fSU5GT19GT1JNQVQgKCZzcGVjLT5pbmZvKSk7CisgIGlmICh0bXAgPT0gMCkKKyAgICBnb3RvIHdyb25nX2Zvcm1hdDsKKworICB3aWR0aCA9IEdTVF9BVURJT19JTkZPX1dJRFRIICgmc3BlYy0+aW5mbyk7CisgIHJhdGUgPSBHU1RfQVVESU9fSU5GT19SQVRFICgmc3BlYy0+aW5mbyk7CisgIGNoYW5uZWxzID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZzcGVjLT5pbmZvKTsKKworICBpZiAod2lkdGggIT0gMTYgJiYgd2lkdGggIT0gOCkKKyAgICBnb3RvIGRvZGd5X3dpZHRoOworCisgIFNFVF9QQVJBTSAob3NzLCBTTkRDVExfRFNQX1NFVEZNVCwgdG1wLCAiU0VURk1UIik7CisgIGlmIChjaGFubmVscyA9PSAyKQorICAgIFNFVF9QQVJBTSAob3NzLCBTTkRDVExfRFNQX1NURVJFTywgMSwgIlNURVJFTyIpOworICBTRVRfUEFSQU0gKG9zcywgU05EQ1RMX0RTUF9DSEFOTkVMUywgY2hhbm5lbHMsICJDSEFOTkVMUyIpOworICBTRVRfUEFSQU0gKG9zcywgU05EQ1RMX0RTUF9TUEVFRCwgcmF0ZSwgIlNQRUVEIik7CisKKyAgdG1wID0gaWxvZzIgKHNwZWMtPnNlZ3NpemUpOworICB0bXAgPSAoKHNwZWMtPnNlZ3RvdGFsICYgMHg3ZmZmKSA8PCAxNikgfCB0bXA7CisgIEdTVF9ERUJVR19PQkpFQ1QgKG9zcywgInNldCBzZWdzaXplOiAlZCwgc2VndG90YWw6ICVkLCB2YWx1ZTogJTA4eCIsCisgICAgICBzcGVjLT5zZWdzaXplLCBzcGVjLT5zZWd0b3RhbCwgdG1wKTsKKworICBTRVRfUEFSQU0gKG9zcywgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVCwgdG1wLCAiU0VURlJBR01FTlQiKTsKKyAgR0VUX1BBUkFNIChvc3MsIFNORENUTF9EU1BfR0VUT1NQQUNFLCAmaW5mbywgIkdFVE9TUEFDRSIpOworCisgIHNwZWMtPnNlZ3NpemUgPSBpbmZvLmZyYWdzaXplOworICBzcGVjLT5zZWd0b3RhbCA9IGluZm8uZnJhZ3N0b3RhbDsKKworICBvc3MtPmJ5dGVzX3Blcl9zYW1wbGUgPSBHU1RfQVVESU9fSU5GT19CUEYgKCZzcGVjLT5pbmZvKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChvc3MsICJnb3Qgc2Vnc2l6ZTogJWQsIHNlZ3RvdGFsOiAlZCwgdmFsdWU6ICUwOHgiLAorICAgICAgc3BlYy0+c2Vnc2l6ZSwgc3BlYy0+c2VndG90YWwsIHRtcCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitub25fYmxvY2s6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3NzLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJVbmFibGUgdG8gc2V0IGRldmljZSAlcyBpbiBub24gYmxvY2tpbmcgbW9kZTogJXMiLAorICAgICAgICAgICAgb3NzLT5kZXZpY2UsIGdfc3RyZXJyb3IgKGVycm5vKSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQord3JvbmdfZm9ybWF0OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9zcywgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiVW5hYmxlIHRvIGdldCBmb3JtYXQgKCVkLCAlZCkiLCBzcGVjLT50eXBlLAorICAgICAgICAgICAgR1NUX0FVRElPX0lORk9fRk9STUFUICgmc3BlYy0+aW5mbykpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2RvZGd5X3dpZHRoOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9zcywgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgidW5leHBlY3RlZCB3aWR0aCAlZCIsIHdpZHRoKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zc19zaW5rX3VucHJlcGFyZSAoR3N0QXVkaW9TaW5rICogYXNpbmspCit7CisgIC8qIGNvdWxkIGRvIGEgU05EQ1RMX0RTUF9SRVNFVCwgYnV0IHRoZSBPU1MgbWFudWFsIHJlY29tbWVuZHMgYSBjbG9zZS9vcGVuICovCisKKyAgaWYgKCFnc3Rfb3NzX3NpbmtfY2xvc2UgKGFzaW5rKSkKKyAgICBnb3RvIGNvdWxkbnRfY2xvc2U7CisKKyAgaWYgKCFnc3Rfb3NzX3Npbmtfb3BlbiAoYXNpbmspKQorICAgIGdvdG8gY291bGRudF9yZW9wZW47CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitjb3VsZG50X2Nsb3NlOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXNpbmssICJDb3VsZCBub3QgY2xvc2UgdGhlIGF1ZGlvIGRldmljZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorY291bGRudF9yZW9wZW46CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChhc2luaywgIkNvdWxkIG5vdCByZW9wZW4gdGhlIGF1ZGlvIGRldmljZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2ludAorZ3N0X29zc19zaW5rX3dyaXRlIChHc3RBdWRpb1NpbmsgKiBhc2luaywgZ3BvaW50ZXIgZGF0YSwgZ3VpbnQgbGVuZ3RoKQoreworICByZXR1cm4gd3JpdGUgKEdTVF9PU1NTSU5LIChhc2luayktPmZkLCBkYXRhLCBsZW5ndGgpOworfQorCitzdGF0aWMgZ3VpbnQKK2dzdF9vc3Nfc2lua19kZWxheSAoR3N0QXVkaW9TaW5rICogYXNpbmspCit7CisgIEdzdE9zc1NpbmsgKm9zczsKKyAgZ2ludCBkZWxheSA9IDA7CisgIGdpbnQgcmV0OworCisgIG9zcyA9IEdTVF9PU1NTSU5LIChhc2luayk7CisKKyNpZmRlZiBTTkRDVExfRFNQX0dFVE9ERUxBWQorICByZXQgPSBpb2N0bCAob3NzLT5mZCwgU05EQ1RMX0RTUF9HRVRPREVMQVksICZkZWxheSk7CisjZWxzZQorICByZXQgPSAtMTsKKyNlbmRpZgorICBpZiAocmV0IDwgMCkgeworICAgIGF1ZGlvX2J1Zl9pbmZvIGluZm87CisKKyAgICByZXQgPSBpb2N0bCAob3NzLT5mZCwgU05EQ1RMX0RTUF9HRVRPU1BBQ0UsICZpbmZvKTsKKworICAgIGRlbGF5ID0gKHJldCA8IDAgPyAwIDogKGluZm8uZnJhZ3N0b3RhbCAqIGluZm8uZnJhZ3NpemUpIC0gaW5mby5ieXRlcyk7CisgIH0KKyAgcmV0dXJuIGRlbGF5IC8gb3NzLT5ieXRlc19wZXJfc2FtcGxlOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zc19zaW5rX3Jlc2V0IChHc3RBdWRpb1NpbmsgKiBhc2luaykKK3sKKyAgLyogVGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBoZXJlIHJlYWxseTogT1NTIGNhbid0IGhhbmRsZSBhY2Nlc3MgdG8gdGhlCisgICAqIHNhbWUgZGV2aWNlL2ZkIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBhbmQgbWlnaHQgZGVhZGxvY2sgb3IgYmxvdyB1cCBpbgorICAgKiBvdGhlciB3YXlzIGlmIHdlIHRyeSBhbiBpb2N0bCBTTkRDVExfRFNQX1JFU0VUIG9yIHNpbWlsYXIgKi8KK30KZGlmZiAtLWdpdCBhL3N5cy9vc3MvZ3N0b3Nzc2luay5oIGIvc3lzL29zcy9nc3Rvc3NzaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE3NGRmMQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3MvZ3N0b3Nzc2luay5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgICAgICAyMDAwIFdpbSBUYXltYW5zIDx3dGF5QGNoZWxsby5iZT4KKyAqCisgKiBnc3Rvc3NzaW5rLmg6IAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9PU1NTSU5LX0hfXworI2RlZmluZSBfX0dTVF9PU1NTSU5LX0hfXworCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvc2luay5oPgorCisjaW5jbHVkZSAiZ3N0b3NzaGVscGVyLmgiCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9PU1NTSU5LICAgICAgICAgICAgKGdzdF9vc3Nfc2lua19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfT1NTU0lOSyhvYmopICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX09TU1NJTkssR3N0T3NzU2luaykpCisjZGVmaW5lIEdTVF9PU1NTSU5LX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9PU1NTSU5LLEdzdE9zc1NpbmtDbGFzcykpCisjZGVmaW5lIEdTVF9JU19PU1NTSU5LKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfT1NTU0lOSykpCisjZGVmaW5lIEdTVF9JU19PU1NTSU5LX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9PU1NTSU5LKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zc1NpbmsgR3N0T3NzU2luazsKK3R5cGVkZWYgc3RydWN0IF9Hc3RPc3NTaW5rQ2xhc3MgR3N0T3NzU2lua0NsYXNzOworCitzdHJ1Y3QgX0dzdE9zc1NpbmsgeworICBHc3RBdWRpb1NpbmsgICAgc2luazsKKworICBnY2hhciAqZGV2aWNlOworICBnaW50ICAgZmQ7CisgIGdpbnQgICBieXRlc19wZXJfc2FtcGxlOworCisgIEdzdENhcHMgKnByb2JlZF9jYXBzOworfTsKKworc3RydWN0IF9Hc3RPc3NTaW5rQ2xhc3MgeworICBHc3RBdWRpb1NpbmtDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3Rfb3NzX3NpbmtfZ2V0X3R5cGUodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9PU1NTSU5LX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL29zcy9nc3Rvc3NzcmMuYyBiL3N5cy9vc3MvZ3N0b3Nzc3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkyM2FkMgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3MvZ3N0b3Nzc3JjLmMKQEAgLTAsMCArMSw1NDQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4KKyAqICAgICAgICAgICAgICAgMjAwMCwyMDA1IFdpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+CisgKgorICogZ3N0b3Nzc3JjLmM6IAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LW9zc3NyYworICoKKyAqIFRoaXMgZWxlbWVudCBsZXRzIHlvdSByZWNvcmQgc291bmQgdXNpbmcgdGhlIE9wZW4gU291bmQgU3lzdGVtIChPU1MpLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgb3Nzc3JjICEgYXVkaW9jb252ZXJ0ICEgdm9yYmlzZW5jICEgb2dnbXV4ICEgZmlsZXNpbmsgbG9jYXRpb249bXltdXNpYy5vZ2cKKyAqIF18IHdpbGwgcmVjb3JkIHNvdW5kIGZyb20geW91ciBzb3VuZCBjYXJkIHVzaW5nIE9TUyBhbmQgZW5jb2RlIGl0IHRvIGFuCisgKiBPZ2cvVm9yYmlzIGZpbGUgKHRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgeW91ciBtaXhlciBzZXR0aW5ncyBhcmUgcmlnaHQKKyAqIGFuZCB0aGUgcmlnaHQgaW5wdXRzIGVuYWJsZWQgZXRjLikKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgSEFWRV9PU1NfSU5DTFVERV9JTl9TWVMKKyMgaW5jbHVkZSA8c3lzL3NvdW5kY2FyZC5oPgorI2Vsc2UKKyMgaWZkZWYgSEFWRV9PU1NfSU5DTFVERV9JTl9ST09UCisjICBpbmNsdWRlIDxzb3VuZGNhcmQuaD4KKyMgZWxzZQorIyAgaWZkZWYgSEFWRV9PU1NfSU5DTFVERV9JTl9NQUNISU5FCisjICAgaW5jbHVkZSA8bWFjaGluZS9zb3VuZGNhcmQuaD4KKyMgIGVsc2UKKyMgICBlcnJvciAiV2hhdCB0byBpbmNsdWRlPyIKKyMgIGVuZGlmIC8qIEhBVkVfT1NTX0lOQ0xVREVfSU5fTUFDSElORSAqLworIyBlbmRpZiAvKiBIQVZFX09TU19JTkNMVURFX0lOX1JPT1QgKi8KKyNlbmRpZiAvKiBIQVZFX09TU19JTkNMVURFX0lOX1NZUyAqLworCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiZ3N0b3Nzc3JjLmgiCisKKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKG9zc19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBvc3NfZGVidWcKKworI2RlZmluZSBERUZBVUxUX0RFVklDRSAgICAgICAgICAiL2Rldi9kc3AiCisjZGVmaW5lIERFRkFVTFRfREVWSUNFX05BTUUgICAgICIiCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0RFVklDRSwKKyAgUFJPUF9ERVZJQ0VfTkFNRSwKK307CisKKyNkZWZpbmUgZ3N0X29zc19zcmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0T3NzU3JjLCBnc3Rfb3NzX3NyYywgR1NUX1RZUEVfQVVESU9fU1JDKTsKKworc3RhdGljIHZvaWQgZ3N0X29zc19zcmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X29zc19zcmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgdm9pZCBnc3Rfb3NzX3NyY19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyB2b2lkIGdzdF9vc3Nfc3JjX2ZpbmFsaXplIChHc3RPc3NTcmMgKiBvc3NzcmMpOworCitzdGF0aWMgR3N0Q2FwcyAqZ3N0X29zc19zcmNfZ2V0Y2FwcyAoR3N0QmFzZVNyYyAqIGJzcmMsIEdzdENhcHMgKiBmaWx0ZXIpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zc19zcmNfb3BlbiAoR3N0QXVkaW9TcmMgKiBhc3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3NzX3NyY19jbG9zZSAoR3N0QXVkaW9TcmMgKiBhc3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3NzX3NyY19wcmVwYXJlIChHc3RBdWRpb1NyYyAqIGFzcmMsCisgICAgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpOworc3RhdGljIGdib29sZWFuIGdzdF9vc3Nfc3JjX3VucHJlcGFyZSAoR3N0QXVkaW9TcmMgKiBhc3JjKTsKK3N0YXRpYyBndWludCBnc3Rfb3NzX3NyY19yZWFkIChHc3RBdWRpb1NyYyAqIGFzcmMsIGdwb2ludGVyIGRhdGEsIGd1aW50IGxlbmd0aCwKKyAgICBHc3RDbG9ja1RpbWUgKiB0aW1lc3RhbXApOworc3RhdGljIGd1aW50IGdzdF9vc3Nfc3JjX2RlbGF5IChHc3RBdWRpb1NyYyAqIGFzcmMpOworc3RhdGljIHZvaWQgZ3N0X29zc19zcmNfcmVzZXQgKEdzdEF1ZGlvU3JjICogYXNyYyk7CisKKyNkZWZpbmUgRk9STUFUUyAieyIgR1NUX0FVRElPX05FKFMxNikiLCJHU1RfQVVESU9fTkUoVTE2KSIsIFM4LCBVOCB9IgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgb3Nzc3JjX3NyY19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEZPUk1BVFMgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDE7ICIKKyAgICAgICAgImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEZPUk1BVFMgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDIsICIgImNoYW5uZWwtbWFzayA9IChiaXRtYXNrKSAweDMiKQorICAgICk7CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzX3NyY19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3Nfc3JjX2NsYXNzX2luaXQgKEdzdE9zc1NyY0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCYXNlU3JjQ2xhc3MgKmdzdGJhc2VzcmNfY2xhc3M7CisgIEdzdEF1ZGlvU3JjQ2xhc3MgKmdzdGF1ZGlvc3JjX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmFzZXNyY19jbGFzcyA9IChHc3RCYXNlU3JjQ2xhc3MgKikga2xhc3M7CisgIGdzdGF1ZGlvc3JjX2NsYXNzID0gKEdzdEF1ZGlvU3JjQ2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9vc3Nfc3JjX2Rpc3Bvc2U7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gKEdPYmplY3RGaW5hbGl6ZUZ1bmMpIGdzdF9vc3Nfc3JjX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfb3NzX3NyY19nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9vc3Nfc3JjX3NldF9wcm9wZXJ0eTsKKworICBnc3RiYXNlc3JjX2NsYXNzLT5nZXRfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzX3NyY19nZXRjYXBzKTsKKworICBnc3RhdWRpb3NyY19jbGFzcy0+b3BlbiA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzX3NyY19vcGVuKTsKKyAgZ3N0YXVkaW9zcmNfY2xhc3MtPnByZXBhcmUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zc19zcmNfcHJlcGFyZSk7CisgIGdzdGF1ZGlvc3JjX2NsYXNzLT51bnByZXBhcmUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zc19zcmNfdW5wcmVwYXJlKTsKKyAgZ3N0YXVkaW9zcmNfY2xhc3MtPmNsb3NlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3Nfc3JjX2Nsb3NlKTsKKyAgZ3N0YXVkaW9zcmNfY2xhc3MtPnJlYWQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zc19zcmNfcmVhZCk7CisgIGdzdGF1ZGlvc3JjX2NsYXNzLT5kZWxheSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzX3NyY19kZWxheSk7CisgIGdzdGF1ZGlvc3JjX2NsYXNzLT5yZXNldCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzX3NyY19yZXNldCk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ERVZJQ0UsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZGV2aWNlIiwgIkRldmljZSIsCisgICAgICAgICAgIk9TUyBkZXZpY2UgKHVzdWFsbHkgL2Rldi9kc3BOKSIsIERFRkFVTFRfREVWSUNFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfREVWSUNFX05BTUUsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZGV2aWNlLW5hbWUiLCAiRGV2aWNlIG5hbWUiLAorICAgICAgICAgICJIdW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBzb3VuZCBkZXZpY2UiLCBERUZBVUxUX0RFVklDRV9OQU1FLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiQXVkaW8gU291cmNlIChPU1MpIiwKKyAgICAgICJTb3VyY2UvQXVkaW8iLAorICAgICAgIkNhcHR1cmUgZnJvbSBhIHNvdW5kIGNhcmQgdmlhIE9TUyIsCisgICAgICAiRXJpayBXYWx0aGluc2VuIDxvbWVnYUBjc2Uub2dpLmVkdT4sICIgIldpbSBUYXltYW5zIDx3aW1AZmx1ZW5kby5jb20+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsCisgICAgICAmb3Nzc3JjX3NyY19mYWN0b3J5KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3Nfc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RPc3NTcmMgKnNyYzsKKworICBzcmMgPSBHU1RfT1NTX1NSQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfREVWSUNFOgorICAgICAgZ19mcmVlIChzcmMtPmRldmljZSk7CisgICAgICBzcmMtPmRldmljZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X29zc19zcmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE9zc1NyYyAqc3JjOworCisgIHNyYyA9IEdTVF9PU1NfU1JDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9ERVZJQ0U6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzcmMtPmRldmljZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfREVWSUNFX05BTUU6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzcmMtPmRldmljZV9uYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3Nfc3JjX2luaXQgKEdzdE9zc1NyYyAqIG9zc3NyYykKK3sKKyAgY29uc3QgZ2NoYXIgKmRldmljZTsKKworICBHU1RfREVCVUcgKCJpbml0aWFsaXppbmcgb3Nzc3JjIik7CisKKyAgZGV2aWNlID0gZ19nZXRlbnYgKCJBVURJT0RFViIpOworICBpZiAoZGV2aWNlID09IE5VTEwpCisgICAgZGV2aWNlID0gREVGQVVMVF9ERVZJQ0U7CisKKyAgb3Nzc3JjLT5mZCA9IC0xOworICBvc3NzcmMtPmRldmljZSA9IGdfc3RyZHVwIChkZXZpY2UpOworICBvc3NzcmMtPmRldmljZV9uYW1lID0gZ19zdHJkdXAgKERFRkFVTFRfREVWSUNFX05BTUUpOworICBvc3NzcmMtPnByb2JlZF9jYXBzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3Nfc3JjX2ZpbmFsaXplIChHc3RPc3NTcmMgKiBvc3NzcmMpCit7CisgIGdfZnJlZSAob3Nzc3JjLT5kZXZpY2UpOworICBnX2ZyZWUgKG9zc3NyYy0+ZGV2aWNlX25hbWUpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAoKEdPYmplY3QgKikgKG9zc3NyYykpOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3Rfb3NzX3NyY19nZXRjYXBzIChHc3RCYXNlU3JjICogYnNyYywgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0T3NzU3JjICpvc3NzcmM7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgb3Nzc3JjID0gR1NUX09TU19TUkMgKGJzcmMpOworCisgIGlmIChvc3NzcmMtPmZkID09IC0xKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAob3Nzc3JjLCAiZGV2aWNlIG5vdCBvcGVuLCB1c2luZyB0ZW1wbGF0ZSBjYXBzIik7CisgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIGJhc2UgY2xhc3Mgd2lsbCBnZXQgdGVtcGxhdGUgY2FwcyBmb3IgdXMgKi8KKyAgfQorCisgIGlmIChvc3NzcmMtPnByb2JlZF9jYXBzKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKG9zc3NyYywgIlJldHVybmluZyBjYWNoZWQgY2FwcyIpOworICAgIHJldHVybiBnc3RfY2Fwc19yZWYgKG9zc3NyYy0+cHJvYmVkX2NhcHMpOworICB9CisKKyAgY2FwcyA9IGdzdF9vc3NfaGVscGVyX3Byb2JlX2NhcHMgKG9zc3NyYy0+ZmQpOworCisgIGlmIChjYXBzKSB7CisgICAgb3Nzc3JjLT5wcm9iZWRfY2FwcyA9IGdzdF9jYXBzX3JlZiAoY2Fwcyk7CisgIH0KKworICBHU1RfSU5GT19PQkpFQ1QgKG9zc3NyYywgInJldHVybmluZyBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICBpZiAoZmlsdGVyICYmIGNhcHMpIHsKKyAgICBHc3RDYXBzICppbnRlcnNlY3Rpb247CisKKyAgICBpbnRlcnNlY3Rpb24gPQorICAgICAgICBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCBjYXBzLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICByZXR1cm4gaW50ZXJzZWN0aW9uOworICB9IGVsc2UgeworICAgIHJldHVybiBjYXBzOworICB9Cit9CisKK3N0YXRpYyBnaW50CitpbG9nMiAoZ2ludCB4KQoreworICAvKiB3ZWxsLi4uIGhhY2tlcidzIGRlbGlnaHQgZXhwbGFpbnMuLi4gKi8KKyAgeCA9IHggfCAoeCA+PiAxKTsKKyAgeCA9IHggfCAoeCA+PiAyKTsKKyAgeCA9IHggfCAoeCA+PiA0KTsKKyAgeCA9IHggfCAoeCA+PiA4KTsKKyAgeCA9IHggfCAoeCA+PiAxNik7CisgIHggPSB4IC0gKCh4ID4+IDEpICYgMHg1NTU1NTU1NSk7CisgIHggPSAoeCAmIDB4MzMzMzMzMzMpICsgKCh4ID4+IDIpICYgMHgzMzMzMzMzMyk7CisgIHggPSAoeCArICh4ID4+IDQpKSAmIDB4MGYwZjBmMGY7CisgIHggPSB4ICsgKHggPj4gOCk7CisgIHggPSB4ICsgKHggPj4gMTYpOworICByZXR1cm4gKHggJiAweDAwMDAwMDNmKSAtIDE7Cit9CisKK3N0YXRpYyBnaW50Citnc3Rfb3NzX3NyY19nZXRfZm9ybWF0IChHc3RBdWRpb1JpbmdCdWZmZXJGb3JtYXRUeXBlIGZtdCwgR3N0QXVkaW9Gb3JtYXQgcmZtdCkKK3sKKyAgZ2ludCByZXN1bHQ7CisKKyAgc3dpdGNoIChmbXQpIHsKKyAgICBjYXNlIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9NVV9MQVc6CisgICAgICByZXN1bHQgPSBBRk1UX01VX0xBVzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX0FfTEFXOgorICAgICAgcmVzdWx0ID0gQUZNVF9BX0xBVzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX0lNQV9BRFBDTToKKyAgICAgIHJlc3VsdCA9IEFGTVRfSU1BX0FEUENNOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfTVBFRzoKKyAgICAgIHJlc3VsdCA9IEFGTVRfTVBFRzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX1JBVzoKKyAgICB7CisgICAgICBzd2l0Y2ggKHJmbXQpIHsKKyAgICAgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1U4OgorICAgICAgICAgIHJlc3VsdCA9IEFGTVRfVTg7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1NUX0FVRElPX0ZPUk1BVF9TMTZMRToKKyAgICAgICAgICByZXN1bHQgPSBBRk1UX1MxNl9MRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1MxNkJFOgorICAgICAgICAgIHJlc3VsdCA9IEFGTVRfUzE2X0JFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfUzg6CisgICAgICAgICAgcmVzdWx0ID0gQUZNVF9TODsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHU1RfQVVESU9fRk9STUFUX1UxNkxFOgorICAgICAgICAgIHJlc3VsdCA9IEFGTVRfVTE2X0xFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdTVF9BVURJT19GT1JNQVRfVTE2QkU6CisgICAgICAgICAgcmVzdWx0ID0gQUZNVF9VMTZfQkU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzdWx0ID0gMDsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zc19zcmNfb3BlbiAoR3N0QXVkaW9TcmMgKiBhc3JjKQoreworICBHc3RPc3NTcmMgKm9zczsKKyAgaW50IG1vZGU7CisKKyAgb3NzID0gR1NUX09TU19TUkMgKGFzcmMpOworCisgIG1vZGUgPSBPX1JET05MWTsKKyAgbW9kZSB8PSBPX05PTkJMT0NLOworCisgIG9zcy0+ZmQgPSBvcGVuIChvc3MtPmRldmljZSwgbW9kZSwgMCk7CisgIGlmIChvc3MtPmZkID09IC0xKSB7CisgICAgc3dpdGNoIChlcnJubykgeworICAgICAgY2FzZSBFQUNDRVM6CisgICAgICAgIGdvdG8gbm9fcGVybWlzc2lvbjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gb3Blbl9mYWlsZWQ7CisgICAgfQorICB9CisKKyAgZ19mcmVlIChvc3MtPmRldmljZV9uYW1lKTsKKyAgb3NzLT5kZXZpY2VfbmFtZSA9IGdzdF9vc3NfaGVscGVyX2dldF9jYXJkX25hbWUgKCIvZGV2L21peGVyIik7CisKKyAgcmV0dXJuIFRSVUU7CisKK25vX3Blcm1pc3Npb246CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3NzLCBSRVNPVVJDRSwgT1BFTl9SRUFELAorICAgICAgICAoXygiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciByZWNvcmRpbmcuICIKKyAgICAgICAgICAgICAgICAiWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuIHRoZSBkZXZpY2UuIikpLAorICAgICAgICBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK29wZW5fZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9zcywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwKKyAgICAgICAgKF8oIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcmVjb3JkaW5nLiIpKSwKKyAgICAgICAgKCJVbmFibGUgdG8gb3BlbiBkZXZpY2UgJXMgZm9yIHJlY29yZGluZzogJXMiLAorICAgICAgICAgICAgb3NzLT5kZXZpY2UsIGdfc3RyZXJyb3IgKGVycm5vKSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3Nfc3JjX2Nsb3NlIChHc3RBdWRpb1NyYyAqIGFzcmMpCit7CisgIEdzdE9zc1NyYyAqb3NzOworCisgIG9zcyA9IEdTVF9PU1NfU1JDIChhc3JjKTsKKworICBjbG9zZSAob3NzLT5mZCk7CisKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJm9zcy0+cHJvYmVkX2NhcHMsIE5VTEwpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3Nfc3JjX3ByZXBhcmUgKEdzdEF1ZGlvU3JjICogYXNyYywgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpCit7CisgIEdzdE9zc1NyYyAqb3NzOworICBzdHJ1Y3QgYXVkaW9fYnVmX2luZm8gaW5mbzsKKyAgaW50IG1vZGU7CisgIGludCBmbXQsIHRtcDsKKyAgZ3VpbnQgd2lkdGgsIHJhdGUsIGNoYW5uZWxzOworCisgIG9zcyA9IEdTVF9PU1NfU1JDIChhc3JjKTsKKworICBtb2RlID0gZmNudGwgKG9zcy0+ZmQsIEZfR0VURkwpOworICBtb2RlICY9IH5PX05PTkJMT0NLOworICBpZiAoZmNudGwgKG9zcy0+ZmQsIEZfU0VURkwsIG1vZGUpID09IC0xKQorICAgIGdvdG8gbm9uX2Jsb2NrOworCisgIGZtdCA9IGdzdF9vc3Nfc3JjX2dldF9mb3JtYXQgKHNwZWMtPnR5cGUsCisgICAgICBHU1RfQVVESU9fSU5GT19GT1JNQVQgKCZzcGVjLT5pbmZvKSk7CisgIGlmIChmbXQgPT0gMCkKKyAgICBnb3RvIHdyb25nX2Zvcm1hdDsKKworICB3aWR0aCA9IEdTVF9BVURJT19JTkZPX1dJRFRIICgmc3BlYy0+aW5mbyk7CisgIHJhdGUgPSBHU1RfQVVESU9fSU5GT19SQVRFICgmc3BlYy0+aW5mbyk7CisgIGNoYW5uZWxzID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZzcGVjLT5pbmZvKTsKKworICBpZiAod2lkdGggIT0gMTYgJiYgd2lkdGggIT0gOCkKKyAgICBnb3RvIGRvZGd5X3dpZHRoOworCisgIHRtcCA9IGlsb2cyIChzcGVjLT5zZWdzaXplKTsKKyAgdG1wID0gKChzcGVjLT5zZWd0b3RhbCAmIDB4N2ZmZikgPDwgMTYpIHwgdG1wOworICBHU1RfREVCVUdfT0JKRUNUIChvc3MsICJzZXQgc2Vnc2l6ZTogJWQsIHNlZ3RvdGFsOiAlZCwgdmFsdWU6ICUwOHgiLAorICAgICAgc3BlYy0+c2Vnc2l6ZSwgc3BlYy0+c2VndG90YWwsIHRtcCk7CisKKyAgU0VUX1BBUkFNIChvc3MsIFNORENUTF9EU1BfU0VURlJBR01FTlQsIHRtcCwgIlNFVEZSQUdNRU5UIik7CisKKyAgU0VUX1BBUkFNIChvc3MsIFNORENUTF9EU1BfUkVTRVQsIDAsICJSRVNFVCIpOworCisgIFNFVF9QQVJBTSAob3NzLCBTTkRDVExfRFNQX1NFVEZNVCwgZm10LCAiU0VURk1UIik7CisgIGlmIChjaGFubmVscyA9PSAyKQorICAgIFNFVF9QQVJBTSAob3NzLCBTTkRDVExfRFNQX1NURVJFTywgMSwgIlNURVJFTyIpOworICBTRVRfUEFSQU0gKG9zcywgU05EQ1RMX0RTUF9DSEFOTkVMUywgY2hhbm5lbHMsICJDSEFOTkVMUyIpOworICBTRVRfUEFSQU0gKG9zcywgU05EQ1RMX0RTUF9TUEVFRCwgcmF0ZSwgIlNQRUVEIik7CisKKyAgR0VUX1BBUkFNIChvc3MsIFNORENUTF9EU1BfR0VUSVNQQUNFLCAmaW5mbywgIkdFVElTUEFDRSIpOworCisgIHNwZWMtPnNlZ3NpemUgPSBpbmZvLmZyYWdzaXplOworICBzcGVjLT5zZWd0b3RhbCA9IGluZm8uZnJhZ3N0b3RhbDsKKworICBvc3MtPmJ5dGVzX3Blcl9zYW1wbGUgPSBHU1RfQVVESU9fSU5GT19CUEYgKCZzcGVjLT5pbmZvKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChvc3MsICJnb3Qgc2Vnc2l6ZTogJWQsIHNlZ3RvdGFsOiAlZCwgdmFsdWU6ICUwOHgiLAorICAgICAgc3BlYy0+c2Vnc2l6ZSwgc3BlYy0+c2VndG90YWwsIHRtcCk7CisKKyAgcmV0dXJuIFRSVUU7CisKK25vbl9ibG9jazoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvc3MsIFJFU09VUkNFLCBPUEVOX1JFQUQsCisgICAgICAgICgiVW5hYmxlIHRvIHNldCBkZXZpY2UgJXMgaW4gbm9uIGJsb2NraW5nIG1vZGU6ICVzIiwKKyAgICAgICAgICAgIG9zcy0+ZGV2aWNlLCBnX3N0cmVycm9yIChlcnJubykpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQord3JvbmdfZm9ybWF0OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9zcywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwKKyAgICAgICAgKCJVbmFibGUgdG8gZ2V0IGZvcm1hdCAoJWQsICVkKSIsIHNwZWMtPnR5cGUsCisgICAgICAgICAgICBHU1RfQVVESU9fSU5GT19GT1JNQVQgKCZzcGVjLT5pbmZvKSksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citkb2RneV93aWR0aDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvc3MsIFJFU09VUkNFLCBPUEVOX1JFQUQsCisgICAgICAgICgiVW5leHBlY3RlZCB3aWR0aCAlZCIsIHdpZHRoKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3NzX3NyY191bnByZXBhcmUgKEdzdEF1ZGlvU3JjICogYXNyYykKK3sKKyAgLyogY291bGQgZG8gYSBTTkRDVExfRFNQX1JFU0VULCBidXQgdGhlIE9TUyBtYW51YWwgcmVjb21tZW5kcyBhIGNsb3NlL29wZW4gKi8KKworICBpZiAoIWdzdF9vc3Nfc3JjX2Nsb3NlIChhc3JjKSkKKyAgICBnb3RvIGNvdWxkbnRfY2xvc2U7CisKKyAgaWYgKCFnc3Rfb3NzX3NyY19vcGVuIChhc3JjKSkKKyAgICBnb3RvIGNvdWxkbnRfcmVvcGVuOworCisgIHJldHVybiBUUlVFOworCitjb3VsZG50X2Nsb3NlOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXNyYywgIkNvdWxkIG5vdCBjbG9zZSB0aGUgYXVkaW8gZGV2aWNlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citjb3VsZG50X3Jlb3BlbjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFzcmMsICJDb3VsZCBub3QgcmVvcGVuIHRoZSBhdWRpbyBkZXZpY2UiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGd1aW50Citnc3Rfb3NzX3NyY19yZWFkIChHc3RBdWRpb1NyYyAqIGFzcmMsIGdwb2ludGVyIGRhdGEsIGd1aW50IGxlbmd0aCwKKyAgICBHc3RDbG9ja1RpbWUgKiB0aW1lc3RhbXApCit7CisgIHJldHVybiByZWFkIChHU1RfT1NTX1NSQyAoYXNyYyktPmZkLCBkYXRhLCBsZW5ndGgpOworfQorCitzdGF0aWMgZ3VpbnQKK2dzdF9vc3Nfc3JjX2RlbGF5IChHc3RBdWRpb1NyYyAqIGFzcmMpCit7CisgIEdzdE9zc1NyYyAqb3NzOworICBnaW50IGRlbGF5ID0gMDsKKyAgZ2ludCByZXQ7CisKKyAgb3NzID0gR1NUX09TU19TUkMgKGFzcmMpOworCisjaWZkZWYgU05EQ1RMX0RTUF9HRVRPREVMQVkKKyAgcmV0ID0gaW9jdGwgKG9zcy0+ZmQsIFNORENUTF9EU1BfR0VUT0RFTEFZLCAmZGVsYXkpOworI2Vsc2UKKyAgcmV0ID0gLTE7CisjZW5kaWYKKyAgaWYgKHJldCA8IDApIHsKKyAgICBhdWRpb19idWZfaW5mbyBpbmZvOworCisgICAgcmV0ID0gaW9jdGwgKG9zcy0+ZmQsIFNORENUTF9EU1BfR0VUT1NQQUNFLCAmaW5mbyk7CisKKyAgICBkZWxheSA9IChyZXQgPCAwID8gMCA6IChpbmZvLmZyYWdzdG90YWwgKiBpbmZvLmZyYWdzaXplKSAtIGluZm8uYnl0ZXMpOworICB9CisgIHJldHVybiBkZWxheSAvIG9zcy0+Ynl0ZXNfcGVyX3NhbXBsZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3Nfc3JjX3Jlc2V0IChHc3RBdWRpb1NyYyAqIGFzcmMpCit7CisgIC8qIFRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gaGVyZSByZWFsbHk6IE9TUyBjYW4ndCBoYW5kbGUgYWNjZXNzIHRvIHRoZQorICAgKiBzYW1lIGRldmljZS9mZCBmcm9tIG11bHRpcGxlIHRocmVhZHMgYW5kIG1pZ2h0IGRlYWRsb2NrIG9yIGJsb3cgdXAgaW4KKyAgICogb3RoZXIgd2F5cyBpZiB3ZSB0cnkgYW4gaW9jdGwgU05EQ1RMX0RTUF9SRVNFVCBvciBzaW1pbGFyICovCit9CmRpZmYgLS1naXQgYS9zeXMvb3NzL2dzdG9zc3NyYy5oIGIvc3lzL29zcy9nc3Rvc3NzcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODk5NWZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zcy9nc3Rvc3NzcmMuaApAQCAtMCwwICsxLDY0IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgMjAwMCBXaW0gVGF5bWFucyA8d3RheUBjaGVsbG8uYmU+CisgKgorICogZ3N0b3Nzc3JjLmg6IAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9PU1NfU1JDX0hfXworI2RlZmluZSBfX0dTVF9PU1NfU1JDX0hfXworCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvc3JjLmg+CisKKyNpbmNsdWRlICJnc3Rvc3NoZWxwZXIuaCIKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX09TU19TUkMgICAgICAgICAgIChnc3Rfb3NzX3NyY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfT1NTX1NSQyhvYmopICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfT1NTX1NSQyxHc3RPc3NTcmMpKQorI2RlZmluZSBHU1RfT1NTX1NSQ19DTEFTUyhrbGFzcykgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9PU1NfU1JDLEdzdE9zc1NyY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX09TU19TUkMob2JqKSAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX09TU19TUkMpKQorI2RlZmluZSBHU1RfSVNfT1NTX1NSQ19DTEFTUyhrbGFzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9PU1NfU1JDKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zc1NyYyBHc3RPc3NTcmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0T3NzU3JjQ2xhc3MgR3N0T3NzU3JjQ2xhc3M7CisKK3N0cnVjdCBfR3N0T3NzU3JjIHsKKyAgR3N0QXVkaW9TcmMgICAgc3JjOworCisgIGdpbnQgZmQ7CisgIGdpbnQgICAgICAgICAgIGJ5dGVzX3Blcl9zYW1wbGU7CisKKyAgZ2NoYXIgKmRldmljZTsKKyAgZ2NoYXIgKmRldmljZV9uYW1lOworCisgIEdzdENhcHMgICAgICAgKnByb2JlZF9jYXBzOworfTsKKworc3RydWN0IF9Hc3RPc3NTcmNDbGFzcyB7CisgIEdzdEF1ZGlvU3JjQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X29zc19zcmNfZ2V0X3R5cGUodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9PU1NfU1JDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL29zcy9tZXNvbi5idWlsZCBiL3N5cy9vc3MvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3NmU3OAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3MvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwyOCBAQAorb3NzX2hlYWRlcl9sb2NhdGlvbnMgPSBbCisgICMgTGludXggYW5kIG5ld2VyIEJTRCB2ZXJzaW9ucworICBbJ3N5cy9zb3VuZGNhcmQuaCcsICdIQVZFX09TU19JTkNMVURFX0lOX1NZUycsICdPU1MgaW5jbHVkZXMgYXJlIGluIHN5cy8nXSwKKyAgIyBTb21lIG9sZCBCU0QgdmVyc2lvbnMgYW5kIGFsc28gbmV3ZXIgT3BlbkJTRCB2ZXJzaW9ucworICBbJ3NvdW5kY2FyZC5oJywgJ0hBVkVfT1NTX0lOQ0xVREVfSU5fUk9PVCcsICdPU1MgaW5jbHVkZXMgYXJlIGluIHJvb3QnXSwKKyAgIyBTb21lIG9sZCBCU0QgdmVyc2lvbnMKKyAgWydtYWNoaW5lL3NvdW5kY2FyZC5oJywgJ0hBVkVfT1NTX0lOQ0xVREVfSU5fTUFDSElORScsICdPU1MgaW5jbHVkZXMgYXJlIGluIG1hY2hpbmUvJ10sCitdCisKK2hhdmVfb3NzID0gZmFsc2UKK2ZvcmVhY2ggaGRyIDogb3NzX2hlYWRlcl9sb2NhdGlvbnMKKyAgaWYgbm90IGhhdmVfb3NzCisgICAgaWYgY2MuaGFzX2hlYWRlcihoZHJbMF0pCisgICAgICBjZGF0YS5zZXQoaGRyWzFdLCAxLCBkZXNjcmlwdGlvbjogaGRyWzJdKQorICAgICAgaGF2ZV9vc3MgPSB0cnVlCisgICAgZW5kaWYKKyAgZW5kaWYKK2VuZGZvcmVhY2gKKworaWYgaGF2ZV9vc3MKKyAgbGlicmFyeSgnZ3N0b3NzYXVkaW8nLAorICAgICdnc3Rvc3NhdWRpby5jJywgJ2dzdG9zc2hlbHBlci5jJywgJ2dzdG9zc3NpbmsuYycsICdnc3Rvc3NzcmMuYycsCisgICAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jLCBsaWJzaW5jXSwKKyAgICBkZXBlbmRlbmNpZXMgOiBbZ3N0YXVkaW9fZGVwLCBnc3RiYXNlX2RlcF0sCisgICAgaW5zdGFsbCA6IHRydWUsCisgICAgaW5zdGFsbF9kaXIgOiBwbHVnaW5zX2luc3RhbGxfZGlyKQorZW5kaWYKZGlmZiAtLWdpdCBhL3N5cy9vc3Mvb3NzX3Byb2JlLmMgYi9zeXMvb3NzL29zc19wcm9iZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjI0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3NzL29zc19wcm9iZS5jCkBAIC0wLDAgKzEsMjU2IEBACisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKworI2lmZGVmIEhBVkVfT1NTX0lOQ0xVREVfSU5fU1lTCisjIGluY2x1ZGUgPHN5cy9zb3VuZGNhcmQuaD4KKyNlbHNlCisjIGlmZGVmIEhBVkVfT1NTX0lOQ0xVREVfSU5fUk9PVAorIyAgaW5jbHVkZSA8c291bmRjYXJkLmg+CisjIGVsc2UKKyMgIGlmZGVmIEhBVkVfT1NTX0lOQ0xVREVfSU5fTUFDSElORQorIyAgIGluY2x1ZGUgPG1hY2hpbmUvc291bmRjYXJkLmg+CisjICBlbHNlCisjICAgZXJyb3IgIldoYXQgdG8gaW5jbHVkZT8iCisjICBlbmRpZiAvKiBIQVZFX09TU19JTkNMVURFX0lOX01BQ0hJTkUgKi8KKyMgZW5kaWYgLyogSEFWRV9PU1NfSU5DTFVERV9JTl9ST09UICovCisjZW5kaWYgLyogSEFWRV9PU1NfSU5DTFVERV9JTl9TWVMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1Byb2JlIFByb2JlOworc3RydWN0IF9Qcm9iZQoreworICBpbnQgZmQ7CisgIGludCBmb3JtYXQ7CisgIGludCBuX2NoYW5uZWxzOworICBHQXJyYXkgKnJhdGVzOworICBpbnQgbWluOworICBpbnQgbWF4OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1JhbmdlIFJhbmdlOworc3RydWN0IF9SYW5nZQoreworICBpbnQgbWluOworICBpbnQgbWF4OworfTsKKworc3RhdGljIGdib29sZWFuIHByb2JlX2NoZWNrIChQcm9iZSAqIHByb2JlKTsKK3N0YXRpYyBpbnQgY2hlY2tfcmF0ZSAoUHJvYmUgKiBwcm9iZSwgaW50IGlyYXRlKTsKK3N0YXRpYyB2b2lkIGFkZF9yYW5nZSAoR1F1ZXVlICogcXVldWUsIGludCBtaW4sIGludCBtYXgpOworc3RhdGljIHZvaWQgYWRkX3JhdGUgKEdBcnJheSAqIGFycmF5LCBpbnQgcmF0ZSk7CitzdGF0aWMgaW50IGludF9jb21wYXJlIChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYik7CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IGZkOworICBpbnQgaTsKKyAgUHJvYmUgKnByb2JlOworCisgIGZkID0gb3BlbiAoIi9kZXYvZHNwIiwgT19SRFdSKTsKKyAgaWYgKGZkIDwgMCkgeworICAgIHBlcnJvciAoIi9kZXYvZHNwIik7CisgICAgZXhpdCAoMSk7CisgIH0KKworICBwcm9iZSA9IGdfbmV3MCAoUHJvYmUsIDEpOworICBwcm9iZS0+ZmQgPSBmZDsKKyAgcHJvYmUtPmZvcm1hdCA9IEFGTVRfUzE2X0xFOworICBwcm9iZS0+bl9jaGFubmVscyA9IDI7CisKKyAgcHJvYmVfY2hlY2sgKHByb2JlKTsKKyAgZ19hcnJheV9zb3J0IChwcm9iZS0+cmF0ZXMsIGludF9jb21wYXJlKTsKKyAgZm9yIChpID0gMDsgaSA8IHByb2JlLT5yYXRlcy0+bGVuOyBpKyspIHsKKyAgICBnX3ByaW50ICgiJWRcbiIsIGdfYXJyYXlfaW5kZXggKHByb2JlLT5yYXRlcywgaW50LCBpKSk7CisgIH0KKworICBnX2FycmF5X2ZyZWUgKHByb2JlLT5yYXRlcywgVFJVRSk7CisgIGdfZnJlZSAocHJvYmUpOworCisjaWYgMAorICBwcm9iZSA9IGdfbmV3MCAoUHJvYmUsIDEpOworICBwcm9iZS0+ZmQgPSBmZDsKKyAgcHJvYmUtPmZvcm1hdCA9IEFGTVRfUzE2X0xFOworICBwcm9iZS0+bl9jaGFubmVscyA9IDE7CisKKyAgcHJvYmVfY2hlY2sgKHByb2JlKTsKKyAgZm9yIChpID0gMDsgaSA8IHByb2JlLT5yYXRlcy0+bGVuOyBpKyspIHsKKyAgICBnX3ByaW50ICgiJWRcbiIsIGdfYXJyYXlfaW5kZXggKHByb2JlLT5yYXRlcywgaW50LCBpKSk7CisgIH0KKworICBwcm9iZSA9IGdfbmV3MCAoUHJvYmUsIDEpOworICBwcm9iZS0+ZmQgPSBmZDsKKyAgcHJvYmUtPmZvcm1hdCA9IEFGTVRfVTg7CisgIHByb2JlLT5uX2NoYW5uZWxzID0gMjsKKworICBwcm9iZV9jaGVjayAocHJvYmUpOworICBmb3IgKGkgPSAwOyBpIDwgcHJvYmUtPnJhdGVzLT5sZW47IGkrKykgeworICAgIGdfcHJpbnQgKCIlZFxuIiwgZ19hcnJheV9pbmRleCAocHJvYmUtPnJhdGVzLCBpbnQsIGkpKTsKKyAgfQorCisgIHByb2JlID0gZ19uZXcwIChQcm9iZSwgMSk7CisgIHByb2JlLT5mZCA9IGZkOworICBwcm9iZS0+Zm9ybWF0ID0gQUZNVF9VODsKKyAgcHJvYmUtPm5fY2hhbm5lbHMgPSAxOworCisgIHByb2JlX2NoZWNrIChwcm9iZSk7CisgIGZvciAoaSA9IDA7IGkgPCBwcm9iZS0+cmF0ZXMtPmxlbjsgaSsrKSB7CisgICAgZ19wcmludCAoIiVkXG4iLCBnX2FycmF5X2luZGV4IChwcm9iZS0+cmF0ZXMsIGludCwgaSkpOworICB9CisjZW5kaWYKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIGdib29sZWFuCitwcm9iZV9jaGVjayAoUHJvYmUgKiBwcm9iZSkKK3sKKyAgUmFuZ2UgKnJhbmdlOworICBHUXVldWUgKnJhbmdlczsKKyAgaW50IGV4YWN0X3JhdGVzID0gMDsKKyAgZ2Jvb2xlYW4gY2hlY2tpbmdfZXhhY3RfcmF0ZXMgPSBUUlVFOworICBpbnQgbl9jaGVja3MgPSAwOworICBnYm9vbGVhbiByZXN1bHQgPSBUUlVFOworCisgIHJhbmdlcyA9IGdfcXVldWVfbmV3ICgpOworCisgIHByb2JlLT5yYXRlcyA9IGdfYXJyYXlfbmV3IChGQUxTRSwgRkFMU0UsIHNpemVvZiAoaW50KSk7CisKKyAgcHJvYmUtPm1pbiA9IGNoZWNrX3JhdGUgKHByb2JlLCAxMDAwKTsKKyAgbl9jaGVja3MrKzsKKyAgcHJvYmUtPm1heCA9IGNoZWNrX3JhdGUgKHByb2JlLCAxMDAwMDApOworICBuX2NoZWNrcysrOworICBhZGRfcmFuZ2UgKHJhbmdlcywgcHJvYmUtPm1pbiArIDEsIHByb2JlLT5tYXggLSAxKTsKKworICB3aGlsZSAoKHJhbmdlID0gZ19xdWV1ZV9wb3BfaGVhZCAocmFuZ2VzKSkpIHsKKyAgICBpbnQgbWluMTsKKyAgICBpbnQgbWF4MTsKKyAgICBpbnQgbWlkOworICAgIGludCBtaWRfcmV0OworCisgICAgZ19wcmludCAoImNoZWNraW5nIFslZCwlZF1cbiIsIHJhbmdlLT5taW4sIHJhbmdlLT5tYXgpOworCisgICAgbWlkID0gKHJhbmdlLT5taW4gKyByYW5nZS0+bWF4KSAvIDI7CisgICAgbWlkX3JldCA9IGNoZWNrX3JhdGUgKHByb2JlLCBtaWQpOworICAgIG5fY2hlY2tzKys7CisKKyAgICBpZiAobWlkID09IG1pZF9yZXQgJiYgY2hlY2tpbmdfZXhhY3RfcmF0ZXMpIHsKKyAgICAgIGludCBtYXhfZXhhY3RfbWF0Y2hlcyA9IDEwMDsKKworICAgICAgZXhhY3RfcmF0ZXMrKzsKKyAgICAgIGlmIChleGFjdF9yYXRlcyA+IG1heF9leGFjdF9tYXRjaGVzKSB7CisgICAgICAgIGdfcHJpbnQgKCJnb3QgJWQgZXhhY3QgcmF0ZXMsIGFzc3VtaW5nIGFsbCBhcmUgZXhhY3RcbiIsCisgICAgICAgICAgICBtYXhfZXhhY3RfbWF0Y2hlcyk7CisgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgICBnX2ZyZWUgKHJhbmdlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNoZWNraW5nX2V4YWN0X3JhdGVzID0gRkFMU0U7CisgICAgfQorCisgICAgLyogQXNzdW1lIHRoYXQgdGhlIHJhdGUgaXMgYXJpdGhtZXRpY2FsbHkgcm91bmRlZCB0byB0aGUgbmVhcmVzdAorICAgICAqIHN1cHBvcnRlZCByYXRlLiAqLworICAgIGlmIChtaWQgPT0gbWlkX3JldCkgeworICAgICAgbWluMSA9IG1pZCAtIDE7CisgICAgICBtYXgxID0gbWlkICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKG1pZCA8IG1pZF9yZXQpIHsKKyAgICAgICAgbWluMSA9IG1pZCAtIChtaWRfcmV0IC0gbWlkKTsKKyAgICAgICAgbWF4MSA9IG1pZF9yZXQgKyAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWluMSA9IG1pZF9yZXQgLSAxOworICAgICAgICBtYXgxID0gbWlkICsgKG1pZCAtIG1pZF9yZXQpOworICAgICAgfQorICAgIH0KKworICAgIGFkZF9yYW5nZSAocmFuZ2VzLCByYW5nZS0+bWluLCBtaW4xKTsKKyAgICBhZGRfcmFuZ2UgKHJhbmdlcywgbWF4MSwgcmFuZ2UtPm1heCk7CisKKyAgICBnX2ZyZWUgKHJhbmdlKTsKKyAgfQorCisgIHdoaWxlICgocmFuZ2UgPSBnX3F1ZXVlX3BvcF9oZWFkIChyYW5nZXMpKSkgeworICAgIGdfZnJlZSAocmFuZ2UpOworICB9CisgIGdfcXVldWVfZnJlZSAocmFuZ2VzKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorYWRkX3JhbmdlIChHUXVldWUgKiBxdWV1ZSwgaW50IG1pbiwgaW50IG1heCkKK3sKKyAgZ19wcmludCAoInRyeWluZyB0byBhZGQgWyVkLCVkXVxuIiwgbWluLCBtYXgpOworICBpZiAobWluIDw9IG1heCkgeworICAgIFJhbmdlICpyYW5nZSA9IGdfbmV3MCAoUmFuZ2UsIDEpOworCisgICAgcmFuZ2UtPm1pbiA9IG1pbjsKKyAgICByYW5nZS0+bWF4ID0gbWF4OworCisgICAgZ19xdWV1ZV9wdXNoX3RhaWwgKHF1ZXVlLCByYW5nZSk7CisgICAgLy9nX3F1ZXVlX3B1c2hfaGVhZCAocXVldWUsIHJhbmdlKTsKKyAgfQorfQorCitzdGF0aWMgaW50CitjaGVja19yYXRlIChQcm9iZSAqIHByb2JlLCBpbnQgaXJhdGUpCit7CisgIGludCByYXRlOworICBpbnQgZm9ybWF0OworICBpbnQgbl9jaGFubmVsczsKKworICByYXRlID0gaXJhdGU7CisgIGZvcm1hdCA9IHByb2JlLT5mb3JtYXQ7CisgIG5fY2hhbm5lbHMgPSBwcm9iZS0+bl9jaGFubmVsczsKKworICBpb2N0bCAocHJvYmUtPmZkLCBTTkRDVExfRFNQX1NFVEZNVCwgJmZvcm1hdCk7CisgIGlvY3RsIChwcm9iZS0+ZmQsIFNORENUTF9EU1BfQ0hBTk5FTFMsICZuX2NoYW5uZWxzKTsKKyAgaW9jdGwgKHByb2JlLT5mZCwgU05EQ1RMX0RTUF9TUEVFRCwgJnJhdGUpOworCisgIGdfcHJpbnQgKCJyYXRlICVkIC0+ICVkXG4iLCBpcmF0ZSwgcmF0ZSk7CisKKyAgaWYgKHJhdGUgPT0gaXJhdGUgLSAxIHx8IHJhdGUgPT0gaXJhdGUgKyAxKSB7CisgICAgcmF0ZSA9IGlyYXRlOworICB9CisgIGFkZF9yYXRlIChwcm9iZS0+cmF0ZXMsIHJhdGUpOworICByZXR1cm4gcmF0ZTsKK30KKworc3RhdGljIHZvaWQKK2FkZF9yYXRlIChHQXJyYXkgKiBhcnJheSwgaW50IHJhdGUpCit7CisgIGludCBpOworICBpbnQgdmFsOworCisgIGZvciAoaSA9IDA7IGkgPCBhcnJheS0+bGVuOyBpKyspIHsKKyAgICB2YWwgPSBnX2FycmF5X2luZGV4IChhcnJheSwgaW50LCBpKTsKKworICAgIGlmICh2YWwgPT0gcmF0ZSkKKyAgICAgIHJldHVybjsKKyAgfQorICBnX3ByaW50ICgic3VwcG9ydGVkIHJhdGU6ICVkXG4iLCByYXRlKTsKKyAgZ19hcnJheV9hcHBlbmRfdmFsIChhcnJheSwgcmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2ludF9jb21wYXJlIChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYikKK3sKKyAgY29uc3QgaW50ICp2YSA9IChjb25zdCBpbnQgKikgYTsKKyAgY29uc3QgaW50ICp2YiA9IChjb25zdCBpbnQgKikgYjsKKworICBpZiAoKnZhIDwgKnZiKQorICAgIHJldHVybiAtMTsKKyAgaWYgKCp2YSA+ICp2YikKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zeXMvb3NzNC9NYWtlZmlsZS5hbSBiL3N5cy9vc3M0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZjA1OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3NzNC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIyIEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3Rvc3M0LmxhCisKK2xpYmdzdG9zczRfbGFfU09VUkNFUyA9IFwKKwlvc3M0LWF1ZGlvLmMgICAgICAgICAgXAorCW9zczQtcHJvcGVydHktcHJvYmUuYyBcCisJb3NzNC1zaW5rLmMgICAgICAgICAgIFwKKwlvc3M0LXNvdXJjZS5jCisKK2xpYmdzdG9zczRfbGFfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQorbGliZ3N0b3NzNF9sYV9MSUJBREQgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwktbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJJChHU1RfTElCUykKK2xpYmdzdG9zczRfbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKSAKKworbm9pbnN0X0hFQURFUlMgPSBcCisJb3NzNC1hdWRpby5oICAgICAgICAgIFwKKwlvc3M0LXByb3BlcnR5LXByb2JlLmggXAorCW9zczQtc2luay5oICAgICAgICAgICBcCisJb3NzNC1zb3VuZGNhcmQuaCAgICAgIFwKKwlvc3M0LXNvdXJjZS5oCisKZGlmZiAtLWdpdCBhL3N5cy9vc3M0L21lc29uLmJ1aWxkIGIvc3lzL29zczQvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxMjY2ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3M0L21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMjMgQEAKK2hhdmVfb3NzNCA9IHRydWUKK21lc3NhZ2UoJ0NoZWNraW5nIGhlYWRlcnMgbmVlZGVkIGZvciBPcGVuIFNvdW5kIFN5c3RlbSA0IHBsdWdpbi4uLicpCitmb3JlYWNoIGhkciA6IFsnZmNudGwuaCcsICdzeXMvaW9jdGwuaCcsICdzeXMvc3RhdC5oJywgJ3N5cy90eXBlcy5oJ10KKyAgaWYgaGF2ZV9vc3M0CisgICAgaWYgbm90IGNjLmhhc19oZWFkZXIoaGRyKQorICAgICAgaGF2ZV9vc3M0ID0gZmFsc2UKKyAgICBlbmRpZgorICBlbmRpZgorZW5kZm9yZWFjaAorCitpZiBoYXZlX29zczQKKyAgbWVzc2FnZSgnUmVxdWlyZWQgaGVhZGVycyBmb3VuZCwgYnVpbGRpbmcgT3BlbiBTb3VuZCBTeXN0ZW0gNCBwbHVnaW4uJykKKworICBsaWJyYXJ5KCdnc3Rvc3M0JywKKyAgICAnb3NzNC1hdWRpby5jJywgJ29zczQtcHJvcGVydHktcHJvYmUuYycsICdvc3M0LXNpbmsuYycsICdvc3M0LXNvdXJjZS5jJywKKyAgICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICAgIGRlcGVuZGVuY2llcyA6IFtnc3RhdWRpb19kZXAsIGdzdGJhc2VfZGVwXSwKKyAgICBpbnN0YWxsIDogdHJ1ZSwKKyAgICBpbnN0YWxsX2RpciA6IHBsdWdpbnNfaW5zdGFsbF9kaXIpCitlbHNlCisgIG1lc3NhZ2UoJ05vdCBidWlsZGluZyBPcGVuIFNvdW5kIFN5c3RlbSA0IHBsdWdpbiwgcmVxdWlyZWQgaGVhZGVycyBub3QgZm91bmQuJykKK2VuZGlmCmRpZmYgLS1naXQgYS9zeXMvb3NzNC9vc3M0LWF1ZGlvLmMgYi9zeXMvb3NzNC9vc3M0LWF1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg5NjA4MQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3M0L29zczQtYXVkaW8uYwpAQCAtMCwwICsxLDc4MSBAQAorLyogR1N0cmVhbWVyIE9TUzQgYXVkaW8gcGx1Z2luCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIEZJWE1FIDAuMTE6IHN1cHByZXNzIHdhcm5pbmdzIGZvciBkZXByZWNhdGVkIEFQSSBzdWNoIGFzIEdWYWx1ZUFycmF5CisgKiB3aXRoIG5ld2VyIEdMaWIgdmVyc2lvbnMgKD49IDIuMzEuMCkgKi8KKyNkZWZpbmUgR0xJQl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdC9nc3QtaTE4bi1wbHVnaW4uaCIKKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworI2luY2x1ZGUgIm9zczQtYXVkaW8uaCIKKyNpbmNsdWRlICJvc3M0LXByb3BlcnR5LXByb2JlLmgiCisjaW5jbHVkZSAib3NzNC1zaW5rLmgiCisjaW5jbHVkZSAib3NzNC1zb3VyY2UuaCIKKyNpbmNsdWRlICJvc3M0LXNvdW5kY2FyZC5oIgorCitHU1RfREVCVUdfQ0FURUdPUlkgKG9zczRtaXhlcl9kZWJ1Zyk7CitHU1RfREVCVUdfQ0FURUdPUlkgKG9zczRzaW5rX2RlYnVnKTsKK0dTVF9ERUJVR19DQVRFR09SWSAob3NzNHNyY19kZWJ1Zyk7CitHU1RfREVCVUdfQ0FURUdPUlkgKG9zczRfZGVidWcpOworCisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBvc3M0X2RlYnVnCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IEdzdEF1ZGlvUmluZ0J1ZmZlckZvcm1hdFR5cGUgZ3N0X3JiZm10OworICBjb25zdCBHc3RBdWRpb0Zvcm1hdCBnc3RfcmZtdDsKKyAgY29uc3QgZ2ludCBvc3NfZm10OworICBjb25zdCBnY2hhciBuYW1lWzE2XTsKK30gR3N0T3NzNEF1ZGlvRm9ybWF0OworCisvKiAqSU5ERU5ULU9GRiogKi8KK3N0YXRpYyBjb25zdCBHc3RPc3M0QXVkaW9Gb3JtYXQgZm10X21hcFtdID0geworICAvKiBub3RlOiBrZWVwIHNvcnRlZCBieSBwcmVmZXJlbmNlLCBwcmVmZXJlZCBmb3JtYXRzIGZpcnN0ICovCisgIHsKKyAgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX01VX0xBVywgMCwKKyAgICAgIEFGTVRfTVVfTEFXLCAiYXVkaW8veC1tdWxhdyJ9LCB7CisgIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9BX0xBVywgMCwKKyAgICAgIEFGTVRfQV9MQVcsICJhdWRpby94LWFsYXcifSwgeworICBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfUkFXLCBHU1RfQVVESU9fRk9STUFUX1MzMkxFLAorICAgICAgQUZNVF9TMzJfTEUsICJhdWRpby94LXJhdyJ9LCB7CisgIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9SQVcsIEdTVF9BVURJT19GT1JNQVRfUzMyQkUsCisgICAgICBBRk1UX1MzMl9CRSwgImF1ZGlvL3gtcmF3In0sIHsKKyAgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX1JBVywgR1NUX0FVRElPX0ZPUk1BVF9TMjRfMzJMRSwKKyAgICAgIEFGTVRfUzI0X0xFLCAiYXVkaW8veC1yYXcifSwgeworICBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfUkFXLCBHU1RfQVVESU9fRk9STUFUX1MyNF8zMkJFLAorICAgICAgQUZNVF9TMjRfQkUsICJhdWRpby94LXJhdyJ9LCB7CisgIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9SQVcsIEdTVF9BVURJT19GT1JNQVRfUzI0TEUsCisgICAgICBBRk1UX1MyNF9QQUNLRUQsICJhdWRpby94LXJhdyJ9LCB7CisgIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9SQVcsIEdTVF9BVURJT19GT1JNQVRfUzE2TEUsCisgICAgICBBRk1UX1MxNl9MRSwgImF1ZGlvL3gtcmF3In0sIHsKKyAgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX1JBVywgR1NUX0FVRElPX0ZPUk1BVF9TMTZCRSwKKyAgICAgIEFGTVRfUzE2X0JFLCAiYXVkaW8veC1yYXcifSwgeworICBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfUkFXLCBHU1RfQVVESU9fRk9STUFUX1UxNkxFLAorICAgICAgQUZNVF9VMTZfTEUsICJhdWRpby94LXJhdyJ9LCB7CisgIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9SQVcsIEdTVF9BVURJT19GT1JNQVRfVTE2QkUsCisgICAgICBBRk1UX1UxNl9CRSwgImF1ZGlvL3gtcmF3In0sIHsKKyAgR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX1JBVywgR1NUX0FVRElPX0ZPUk1BVF9TOCwKKyAgICAgIEFGTVRfUzgsICJhdWRpby94LXJhdyJ9LCB7CisgIEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9SQVcsIEdTVF9BVURJT19GT1JNQVRfVTgsCisgICAgICBBRk1UX1U4LCAiYXVkaW8veC1yYXcifQorfTsKKy8qICpJTkRFTlQtT04qICovCisKKy8qIGZvcm1hdHMgd2UgYXNzdW1lIHRoZSBPU1M0IGxheWVyIGNhbiBhbHdheXMgaGFuZGxlIGFuZCBjb252ZXJ0IGludGVybmFsbHkgKi8KKyNkZWZpbmUgQ09OVkVSVElCTEVfRk9STUFUUyAoICAgXAorICAgIEFGTVRfTVVfTEFXIHwgQUZNVF9BX0xBVyB8ICBcCisgICAgQUZNVF9TMzJfTEUgfCBBRk1UX1MzMl9CRSB8IFwKKyAgICBBRk1UX1MyNF9MRSB8IEFGTVRfUzI0X0JFIHwgXAorICAgIEFGTVRfUzI0X1BBQ0tFRCB8ICAgICAgICAgICBcCisgICAgQUZNVF9TMTZfTEUgfCBBRk1UX1MxNl9CRSB8IFwKKyAgICBBRk1UX1UxNl9MRSB8IEFGTVRfVTE2X0JFIHwgXAorICAgIEFGTVRfUzggfCBBRk1UX1U4ICkKKworc3RhdGljIHZvaWQKK2dzdF9vc3M0X2FwcGVuZF9mb3JtYXRfdG9fY2FwcyAoY29uc3QgR3N0T3NzNEF1ZGlvRm9ybWF0ICogZm10LCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0U3RydWN0dXJlICpzOworCisgIHMgPSBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoZm10LT5uYW1lKTsKKyAgaWYgKGZtdC0+Z3N0X3JiZm10ID09IEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9SQVcpIHsKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgIGdzdF9hdWRpb19mb3JtYXRfdG9fc3RyaW5nIChmbXQtPmdzdF9yZm10KSwKKyAgICAgICAgImxheW91dCIsIEdfVFlQRV9TVFJJTkcsICJpbnRlcmxlYXZlZCIsIE5VTEwpOworICB9CisgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKGNhcHMsIHMpOworfQorCitzdGF0aWMgZ2ludAorZ3N0X29zczRfYXVkaW9fZ2V0X29zc19mb3JtYXQgKEdzdEF1ZGlvUmluZ0J1ZmZlckZvcm1hdFR5cGUgZm10LAorICAgIEdzdEF1ZGlvRm9ybWF0IHJmbXQpCit7CisgIGd1aW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAoZm10X21hcCk7ICsraSkgeworICAgIGlmIChmbXRfbWFwW2ldLmdzdF9yYmZtdCA9PSBmbXQgJiYgZm10X21hcFtpXS5nc3RfcmZtdCA9PSByZm10KQorICAgICAgcmV0dXJuIGZtdF9tYXBbaV0ub3NzX2ZtdDsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyogVGhlc2UgYXJlIHByZXR0eSByYW5kb20gKi8KKyNkZWZpbmUgR1NUX09TUzRfTUlOX1NBTVBMRV9SQVRFIDEKKyNkZWZpbmUgR1NUX09TUzRfTUFYX1NBTVBMRV9SQVRFIDE5MjAwMAorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3M0X2F1ZGlvX2RldGVjdF9yYXRlcyAoR3N0T2JqZWN0ICogb2JqLCBvc3NfYXVkaW9pbmZvICogYWksCisgICAgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdWYWx1ZSB2YWwgPSB7IDAsIH07CisgIGludCBtaW5yYXRlLCBtYXhyYXRlLCBpOworCisgIG1pbnJhdGUgPSBhaS0+bWluX3JhdGU7CisgIG1heHJhdGUgPSBhaS0+bWF4X3JhdGU7CisKKyAgLyogc2FuaXR5IGNoZWNrICovCisgIGlmIChtaW5yYXRlID4gbWF4cmF0ZSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAob2JqLCAibWluX3JhdGUgJWQgPiBtYXhfcmF0ZSAlZCAoYnVnZ3kgZHJpdmVyPykiLAorICAgICAgICBtaW5yYXRlLCBtYXhyYXRlKTsKKyAgICBtYXhyYXRlID0gYWktPm1pbl9yYXRlOyAgICAgLyogc3dhcCAqLworICAgIG1pbnJhdGUgPSBhaS0+bWF4X3JhdGU7CisgIH0KKworICAvKiBsaW1pdCB0byBzb21ldGhpbmcgc2Vuc2libGUgKi8KKyAgaWYgKG1pbnJhdGUgPCBHU1RfT1NTNF9NSU5fU0FNUExFX1JBVEUpCisgICAgbWlucmF0ZSA9IEdTVF9PU1M0X01JTl9TQU1QTEVfUkFURTsKKyAgaWYgKG1heHJhdGUgPiBHU1RfT1NTNF9NQVhfU0FNUExFX1JBVEUpCisgICAgbWF4cmF0ZSA9IEdTVF9PU1M0X01BWF9TQU1QTEVfUkFURTsKKworICBpZiAobWF4cmF0ZSA8IEdTVF9PU1M0X01JTl9TQU1QTEVfUkFURSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAob2JqLCAibWF4X3JhdGUgPCAlZCwgd2hpY2ggbWFrZXMgbm8gc2Vuc2UiLAorICAgICAgICBHU1RfT1NTNF9NSU5fU0FNUExFX1JBVEUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChvYmosICJtaW5fcmF0ZSAlZCwgbWF4X3JhdGUgJWQgKG9yaWdpbmFsbHk6ICVkLCAlZCkiLAorICAgICAgbWlucmF0ZSwgbWF4cmF0ZSwgYWktPm1pbl9yYXRlLCBhaS0+bWF4X3JhdGUpOworCisgIGlmICgoYWktPmNhcHMgJiBQQ01fQ0FQX0ZSRUVSQVRFKSkgeworICAgIEdTVF9MT0dfT0JKRUNUIChvYmosICJkZXZpY2Ugc3VwcG9ydHMgYW55IHNhbXBsZSByYXRlIGJldHdlZW4gbWluIGFuZCBtYXgiKTsKKyAgICBpZiAobWlucmF0ZSA9PSBtYXhyYXRlKSB7CisgICAgICBnX3ZhbHVlX2luaXQgKCZ2YWwsIEdfVFlQRV9JTlQpOworICAgICAgZ192YWx1ZV9zZXRfaW50ICgmdmFsLCBtYXhyYXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgZ192YWx1ZV9pbml0ICgmdmFsLCBHU1RfVFlQRV9JTlRfUkFOR0UpOworICAgICAgZ3N0X3ZhbHVlX3NldF9pbnRfcmFuZ2UgKCZ2YWwsIG1pbnJhdGUsIG1heHJhdGUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfTE9HX09CSkVDVCAob2JqLCAiJWQgc2FtcGxlIHJhdGVzOiIsIGFpLT5ucmF0ZXMpOworICAgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR1NUX1RZUEVfTElTVCk7CisgICAgZm9yIChpID0gMDsgaSA8IGFpLT5ucmF0ZXM7ICsraSkgeworICAgICAgR1NUX0xPR19PQkpFQ1QgKG9iaiwgIiByYXRlOiAlZCIsIGFpLT5yYXRlc1tpXSk7CisKKyAgICAgIGlmIChhaS0+cmF0ZXNbaV0gPj0gbWlucmF0ZSAmJiBhaS0+cmF0ZXNbaV0gPD0gbWF4cmF0ZSkgeworICAgICAgICBHVmFsdWUgcmF0ZV92YWwgPSB7IDAsIH07CisKKyAgICAgICAgZ192YWx1ZV9pbml0ICgmcmF0ZV92YWwsIEdfVFlQRV9JTlQpOworICAgICAgICBnX3ZhbHVlX3NldF9pbnQgKCZyYXRlX3ZhbCwgYWktPnJhdGVzW2ldKTsKKyAgICAgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmdmFsLCAmcmF0ZV92YWwpOworICAgICAgICBnX3ZhbHVlX3Vuc2V0ICgmcmF0ZV92YWwpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChnc3RfdmFsdWVfbGlzdF9nZXRfc2l6ZSAoJnZhbCkgPT0gMCkgeworICAgICAgZ192YWx1ZV91bnNldCAoJnZhbCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGdzdF9jYXBzX2dldF9zaXplIChjYXBzKTsgKytpKSB7CisgICAgR3N0U3RydWN0dXJlICpzOworCisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIGkpOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzLCAicmF0ZSIsICZ2YWwpOworICB9CisKKyAgZ192YWx1ZV91bnNldCAoJnZhbCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzNF9hdWRpb19nZXRfY2hhbm5lbF9sYXlvdXQgKEdzdE9iamVjdCAqIG9iaiwgZ3VpbnQ2NCBsYXlvdXQsCisgICAgZ3VpbnQgbnVtX2NoYW5uZWxzLCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqIGNoX2xheW91dCkKK3sKKyAgY29uc3QgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zX21hcFsxNl0gPSB7CisgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORSwgICAgLyogMCA9IGR1bm5vICAgICAgICAgICovCisgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwgICAgICAvKiAxID0gbGVmdCAgICAgICAgICAgKi8KKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVCwgICAgIC8qIDIgPSByaWdodCAgICAgICAgICAqLworICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUiwgICAgLyogMyA9IGNlbnRlciAgICAgICAgICovCisgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFMSwgICAgLyogNCA9IGxmZSAgICAgICAgICAgICovCisgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9MRUZULCAgICAgICAvKiA1ID0gbGVmdCBzdXJyb3VuZCAgKi8KKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hULCAgICAgIC8qIDYgPSByaWdodCBzdXJyb3VuZCAqLworICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVCwgICAgICAgLyogNyA9IGxlZnQgcmVhciAgICAgICovCisgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVCwgICAgICAvKiA4ID0gcmlnaHQgcmVhciAgICAgKi8KKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FLAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX05PTkUsCisgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORSwKKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FLAorICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX05PTkUsCisgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORSwKKyAgICBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FCisgIH07CisgIGd1aW50IHNwZWFrZXJfcG9zOyAgICAgICAgICAgIC8qIHNwZWFrZXIgcG9zaXRpb24gYXMgZGVmaW5lZCBieSBPU1MgKi8KKyAgZ3VpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NoYW5uZWxzOyArK2kpIHsKKyAgICAvKiBsYXlvdXQgY29udGFpbnMgdXAgdG8gMTYgc3BlYWtlciBwb3NpdGlvbnMsIHdpdGggZWFjaCB0YWtpbmcgdXAgNCBiaXRzICovCisgICAgc3BlYWtlcl9wb3MgPSAoZ3VpbnQpICgobGF5b3V0ID4+IChpICogNCkpICYgMHgwZik7CisKKyAgICAvKiBpZiBpdCdzIGEgY2hhbm5lbCBwb3NpdGlvbiB0aGF0J3MgdW5rbm93biB0byB1cywgc2V0IGFsbCB0byBOT05FIGFuZAorICAgICAqIGJhaWwgb3V0ICovCisgICAgaWYgKEdfVU5MSUtFTFkgKHBvc19tYXBbc3BlYWtlcl9wb3NdID09IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX05PTkUpKQorICAgICAgZ290byBub19sYXlvdXQ7CisKKyAgICBjaF9sYXlvdXRbaV0gPSBwb3NfbWFwW3NwZWFrZXJfcG9zXTsKKyAgfQorCisgIHJldHVybjsKKworbm9fbGF5b3V0OgorICB7CisgICAgLyogb25seSB3YXJuIGlmIGl0J3MgcmVhbGx5IHVua25vd24sIHBvc2l0aW9uIDAgaXMgb2sgYW5kIHJlcHJlc2VudHMgTk9ORQorICAgICAqIChpbiB3aGljaCBjYXNlIHdlIGFsc28ganVzdCBzZXQgYWxsIG90aGVycyB0byBOT05FIGlnbm9yaW5nIHRoZSBvdGhlcgorICAgICAqIHBvc2l0aW9ucyBpbiB0aGUgT1NTLWdpdmVuIGxheW91dCwgYmVjYXVzZSB0aGF0J3Mgd2hhdCB3ZSBjdXJyZW50bHkKKyAgICAgKiByZXF1aXJlIGluIEdTdHJlYW1lcikgKi8KKyAgICBpZiAoc3BlYWtlcl9wb3MgIT0gMCkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChvYmosICJ1bmtub3duIE9TUyBjaGFubmVsIHBvc2l0aW9uICV4IiwgY2hfbGF5b3V0W2ldKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9jaGFubmVsczsgKytpKSB7CisgICAgICBjaF9sYXlvdXRbaV0gPSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FOworICAgIH0KKyAgICByZXR1cm47CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3M0X2F1ZGlvX3NldF9yaW5nYnVmZmVyX2NoYW5uZWxfbGF5b3V0IChHc3RPYmplY3QgKiBvYmosIGdpbnQgZmQsCisgICAgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpCit7CisgIGd1aW50IG51bV9jaGFubmVsczsKKyAgZ3VpbnQ2NCBsYXlvdXQgPSAwOworICBHc3RBdWRpb1JpbmdCdWZmZXIgKnJiOworICBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBjaF9sYXlvdXRbOF0gPSB7IDAsIH07CisKKyAgbnVtX2NoYW5uZWxzID0gR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZzcGVjLT5pbmZvKTsKKyAgaWYgKG51bV9jaGFubmVscyA8IDMgfHwgbnVtX2NoYW5uZWxzID4gOCkKKyAgICByZXR1cm47CisKKyAgaWYgKHNwZWMtPnR5cGUgIT0gR1NUX0FVRElPX1JJTkdfQlVGRkVSX0ZPUk1BVF9UWVBFX1JBVykKKyAgICByZXR1cm47CisKKyAgaWYgKEdTVF9JU19PU1M0X1NJTksgKG9iaikpIHsKKyAgICByYiA9IEdTVF9BVURJT19CQVNFX1NJTksgKG9iaiktPnJpbmdidWZmZXI7CisgIH0gZWxzZSBpZiAoR1NUX0lTX09TUzRfU09VUkNFIChvYmopKSB7CisgICAgcmIgPSBHU1RfQVVESU9fQkFTRV9TUkMgKG9iaiktPnJpbmdidWZmZXI7CisgIH0gZWxzZQorICAgIGdfcmV0dXJuX2lmX3JlYWNoZWQgKCk7CisKKyAgLyogLTEgPSBnZXQgaW5mbyBmb3IgY3VycmVudGx5IG9wZW4gZGV2aWNlIChmZCkuIFRoaXMgd2lsbCBmYWlsIHdpdGgKKyAgICogT1NTIGJ1aWxkIDw9IDEwMTMgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBPU1MgKi8KKyAgaWYgKGlvY3RsIChmZCwgU05EQ1RMX0RTUF9HRVRfQ0hOT1JERVIsICZsYXlvdXQpID09IC0xKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChvYmosICJjb3VsZG4ndCBxdWVyeSBjaGFubmVsIGxheW91dCwgYXNzdW1pbmcgZGVmYXVsdCIpOworICAgIGxheW91dCA9IENITk9SREVSX05PUk1BTDsKKyAgfQorICBHU1RfREVCVUdfT0JKRUNUIChvYmosICJjaGFubmVsIGxheW91dDogJTA4IiBHX0dJTlQ2NF9NT0RJRklFUiAieCIsIGxheW91dCk7CisKKworICBnc3Rfb3NzNF9hdWRpb19nZXRfY2hhbm5lbF9sYXlvdXQgKG9iaiwgbGF5b3V0LCBudW1fY2hhbm5lbHMsIGNoX2xheW91dCk7CisgIGdzdF9hdWRpb19yaW5nX2J1ZmZlcl9zZXRfY2hhbm5lbF9wb3NpdGlvbnMgKHJiLCBjaF9sYXlvdXQpOworCisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3M0X2F1ZGlvX2FkZF9jaGFubmVsX2xheW91dCAoR3N0T2JqZWN0ICogb2JqLCBndWludDY0IGxheW91dCwKKyAgICBndWludCBudW1fY2hhbm5lbHMsIEdzdFN0cnVjdHVyZSAqIHMpCit7CisgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIGNoX2xheW91dFs4XSA9IHsgMCwgfTsKKyAgZ3VpbnQ2NCBtYXNrOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKG51bV9jaGFubmVscyA8PSBHX05fRUxFTUVOVFMgKGNoX2xheW91dCkpOworCisgIGdzdF9vc3M0X2F1ZGlvX2dldF9jaGFubmVsX2xheW91dCAob2JqLCBsYXlvdXQsIG51bV9jaGFubmVscywgY2hfbGF5b3V0KTsKKyAgaWYgKGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b19tYXNrIChjaF9sYXlvdXQsIG51bV9jaGFubmVscywgRkFMU0UsCisgICAgICAgICAgJm1hc2spKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiY2hhbm5lbC1tYXNrIiwgR1NUX1RZUEVfQklUTUFTSywgbWFzaywgTlVMTCk7CisKKyAgcmV0dXJuOworfQorCisvKiBhcmJpdHJhcnkgbWF4LiBsaW1pdCAqLworI2RlZmluZSBHU1RfT1NTNF9NSU5fQ0hBTk5FTFMgMQorI2RlZmluZSBHU1RfT1NTNF9NQVhfQ0hBTk5FTFMgNDA5NgorCisvKiB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGlucHV0IGNhcHMgKi8KK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9vc3M0X2F1ZGlvX2RldGVjdF9jaGFubmVscyAoR3N0T2JqZWN0ICogb2JqLCBpbnQgZmQsIG9zc19hdWRpb2luZm8gKiBhaSwKKyAgICBHc3RDYXBzICogaW5fY2FwcykKK3sKKyAgY29uc3QgZ2NoYXIgKmZvcmNlZF9sYXlvdXQ7CisgIEdzdFN0cnVjdHVyZSAqcyA9IE5VTEw7CisgIGd1aW50NjQgbGF5b3V0ID0gMDsKKyAgR3N0Q2FwcyAqY2hhbl9jYXBzID0gTlVMTDsKKyAgR3N0Q2FwcyAqb3V0X2NhcHMgPSBOVUxMOworICBpbnQgbWluY2hhbnMsIG1heGNoYW5zOworICBpbnQgYywgaSwgajsKKworICAvKiBHU1RfT1NTNF9DSEFOTkVMX0xBWU9VVCBlbnZpcm9ubWVudCB2YXJpYWJsZTogbWF5IGJlIHVzZWQgdG8gZm9yY2UgYQorICAgKiBwYXJ0aWN1bGFyIGNoYW5uZWwgbGF5b3V0IChpZiBpdCBjb250YWlucyBhbiBvZGQgbnVtYmVyIG9mIGNoYW5uZWwKKyAgICogcG9zaXRpb25zIGl0IHdpbGwgYWxzbyBtYWtlIHVzIGFkdmVydGlzZSBhIGNoYW5uZWwgbGF5b3V0IGZvciB0aGF0CisgICAqIGNoYW5uZWwgY291bnQsIGV2ZW4gaWYgd2UnZCB1c3VhbGx5IHNraXAgaXQ7IHRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwKKyAgICogZm9yIGZvbGtzIHdpdGggMi4xIHNwZWFrZXJzLCBJIGd1ZXNzKSAqLworICBmb3JjZWRfbGF5b3V0ID0gZ19nZXRlbnYgKCJHU1RfT1NTNF9DSEFOTkVMX0xBWU9VVCIpOworCisgIG1pbmNoYW5zID0gYWktPm1pbl9jaGFubmVsczsKKyAgbWF4Y2hhbnMgPSBhaS0+bWF4X2NoYW5uZWxzOworCisgIC8qIHNhbml0eSBjaGVjayAqLworICBpZiAobWluY2hhbnMgPiBtYXhjaGFucykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAob2JqLCAibWluX2NoYW5zICVkID4gbWF4X2NoYW5zICVkIChidWdneSBkcml2ZXI/KSIsCisgICAgICAgIG1pbmNoYW5zLCBtYXhjaGFucyk7CisgICAgbWF4Y2hhbnMgPSBhaS0+bWluX2NoYW5uZWxzOyAgICAgICAgLyogc3dhcCAqLworICAgIG1pbmNoYW5zID0gYWktPm1heF9jaGFubmVsczsKKyAgfQorCisgIC8qIGxpbWl0IHRvIHNvbWV0aGluZyBzZW5zaWJsZSAqLworICBpZiAobWluY2hhbnMgPCBHU1RfT1NTNF9NSU5fQ0hBTk5FTFMpCisgICAgbWluY2hhbnMgPSBHU1RfT1NTNF9NSU5fQ0hBTk5FTFM7CisgIGlmIChtYXhjaGFucyA+IEdTVF9PU1M0X01BWF9DSEFOTkVMUykKKyAgICBtYXhjaGFucyA9IEdTVF9PU1M0X01BWF9DSEFOTkVMUzsKKworICBpZiAobWF4Y2hhbnMgPCBHU1RfT1NTNF9NSU5fQ0hBTk5FTFMpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG9iaiwgIm1heF9jaGFucyA8ICVkLCB3aGljaCBtYWtlcyBubyBzZW5zZSIsCisgICAgICAgIEdTVF9PU1M0X01JTl9DSEFOTkVMUyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGluX2NhcHMpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKG9iaiwgIm1pbl9jaGFubmVscyAlZCwgbWF4X2NoYW5uZWxzICVkIChvcmlnaW5hbGx5OiAlZCwgJWQpIiwKKyAgICAgIG1pbmNoYW5zLCBtYXhjaGFucywgYWktPm1pbl9jaGFubmVscywgYWktPm1heF9jaGFubmVscyk7CisKKyAgY2hhbl9jYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIC8qIGZpcnN0IGRvIHRoZSBzaW1wbGUgY2FzZXM6IG1vbm8gKyBzdGVyZW8gKGNoYW5uZWwgbGF5b3V0IGltcGxpZWQpICovCisgIGlmIChtaW5jaGFucyA9PSAxICYmIG1heGNoYW5zID09IDEpCisgICAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgieCIsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDEsIE5VTEwpOworICBlbHNlIGlmIChtaW5jaGFucyA9PSAyICYmIG1heGNoYW5zID49IDIpCisgICAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgieCIsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDIsIE5VTEwpOworICBlbHNlIGlmIChtaW5jaGFucyA9PSAxICYmIG1heGNoYW5zID49IDIpCisgICAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgieCIsICJjaGFubmVscyIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgMiwgTlVMTCk7CisgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKGNoYW5fY2Fwcywgcyk7CisgIHMgPSBOVUxMOworCisgIC8qIFRPRE86IHdlIGFzc3VtZSBhbGwgZHJpdmVycyB1c2UgYSBsZWZ0L3JpZ2h0IGxheW91dCBmb3Igc3RlcmVvIGhlcmUgKi8KKyAgaWYgKG1heGNoYW5zIDw9IDIpCisgICAgZ290byBkb25lOworCisgIGlmIChpb2N0bCAoZmQsIFNORENUTF9EU1BfR0VUX0NITk9SREVSLCAmbGF5b3V0KSA9PSAtMSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAob2JqLCAiY291bGRuJ3QgcXVlcnkgY2hhbm5lbCBsYXlvdXQsIGFzc3VtaW5nIGRlZmF1bHQiKTsKKyAgICBsYXlvdXQgPSBDSE5PUkRFUl9OT1JNQUw7CisgIH0KKyAgR1NUX0RFQlVHX09CSkVDVCAob2JqLCAiY2hhbm5lbCBsYXlvdXQ6ICUwOCIgR19HSU5UNjRfTU9ESUZJRVIgIngiLCBsYXlvdXQpOworCisgIC8qIGUuZy4gZm9yY2VkIDIuMSBsYXlvdXQgd291bGQgYmUgR1NUX09TUzRfQ0hBTk5FTF9MQVlPVVQ9NDIxICovCisgIGlmIChmb3JjZWRfbGF5b3V0ICE9IE5VTEwgJiYgKmZvcmNlZF9sYXlvdXQgIT0gJ1wwJykgeworICAgIGd1aW50IGxheW91dF9sZW47CisKKyAgICBsYXlvdXRfbGVuID0gc3RybGVuIChmb3JjZWRfbGF5b3V0KTsKKyAgICBpZiAobGF5b3V0X2xlbiA+PSBtaW5jaGFucyAmJiBsYXlvdXRfbGVuIDw9IG1heGNoYW5zKSB7CisgICAgICBsYXlvdXQgPSBnX2FzY2lpX3N0cnRvdWxsIChmb3JjZWRfbGF5b3V0LCBOVUxMLCAxNik7CisgICAgICBtYXhjaGFucyA9IGxheW91dF9sZW47CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChvYmosICJmb3JjZWQgY2hhbm5lbCBsYXlvdXQ6ICUwOCIgR19HSU5UNjRfTU9ESUZJRVIgIngiCisgICAgICAgICAgIiAoJyVzJyksIG1heGNoYW5zIG5vdyAlZCIsIGxheW91dCwgZm9yY2VkX2xheW91dCwgbWF4Y2hhbnMpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG9iaiwgImlnbm9yaW5nIGZvcmNlZCBjaGFubmVsIGxheW91dDogbGF5b3V0IGhhcyAlZCAiCisgICAgICAgICAgImNoYW5uZWwgcG9zaXRpb25zIGJ1dCBtYXhjaGFucyBpcyAlZCIsIGxheW91dF9sZW4sIG1heGNoYW5zKTsKKyAgICB9CisgIH0KKworICAvKiBuZWVkIHRvIGFkdmVydGlzZSBjaGFubmVsIGxheW91dHMgZm9yIGFueXRoaW5nID4yIGFuZCA8PTggY2hhbm5lbHMgKi8KKyAgZm9yIChjID0gTUFYICgzLCBtaW5jaGFucyk7IGMgPD0gTUlOIChtYXhjaGFucywgOCk7IGMrKykgeworICAgIC8qICJUaGUgbWluX2NoYW5uZWxzIGFuZCBtYXhfY2hhbm5lbHMgZmllbGRzIGRlZmluZSB0aGUgbGltaXRzIGZvciB0aGUKKyAgICAgKiBudW1iZXIgb2YgY2hhbm5lbHMuIEhvd2V2ZXIgc29tZSBkZXZpY2VzIGRvbid0IHN1cHBvcnQgYWxsIGNoYW5uZWxzCisgICAgICogd2l0aGluIHRoaXMgcmFuZ2UuIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgb2RkIHZhbHVlcyAoMywgNSwgNywgOSwgZXRjKS4KKyAgICAgKiBhcmUgbm90IHN1cHBvcnRlZC4gVGhlcmUgaXMgY3VycmVudGx5IG5vIHdheSB0byBjaGVjayBmb3IgdGhpcyBvdGhlcgorICAgICAqIHRoYW4gY2hlY2tpbmcgaWYgU05EQ1RMX0RTUF9DSEFOTkVMUyBhY2NlcHRzIHRoZSByZXF1ZXN0ZWQgdmFsdWUuCisgICAgICogQW5vdGhlciBhcHByb2FjaCBpcyB0cnlpbmcgdG8gYXZvaWQgdXNpbmcgb2RkIG51bWJlciBvZiBjaGFubmVscy4iCisgICAgICoKKyAgICAgKiBTbywgd2UgZG9uJ3Qga25vdyBmb3Igc3VyZSBpZiB0aGVzZSBvZGQgdmFsdWVzIGFyZSBzdXBwb3J0ZWQ6CisgICAgICovCisgICAgaWYgKChjID09IDMgfHwgYyA9PSA1IHx8IGMgPT0gNykgJiYgKGMgIT0gbWF4Y2hhbnMpKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAob2JqLCAibm90IGFkZGluZyBsYXlvdXQgd2l0aCAlZCBjaGFubmVscyIsIGMpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgieCIsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIGMsIE5VTEwpOworICAgIGdzdF9vc3M0X2F1ZGlvX2FkZF9jaGFubmVsX2xheW91dCAob2JqLCBsYXlvdXQsIGMsIHMpOworICAgIEdTVF9MT0dfT0JKRUNUIChvYmosICJjPSV1LCBhcHBlbmRpbmcgc3RydWN0ICUiIEdTVF9QVFJfRk9STUFULCBjLCBzKTsKKyAgICBnc3RfY2Fwc19hcHBlbmRfc3RydWN0dXJlIChjaGFuX2NhcHMsIHMpOworICAgIHMgPSBOVUxMOworICB9CisKKyAgaWYgKG1heGNoYW5zIDw9IDgpCisgICAgZ290byBkb25lOworCisgIC8qIGZvciBldmVyeXRoaW5nID44IGNoYW5uZWxzLCBDSEFOTkVMX1BPU0lUSU9OX05PTkUgaXMgaW1wbGllZC4gKi8KKyAgaWYgKG1pbmNoYW5zID09IG1heGNoYW5zIHx8IG1heGNoYW5zID09IDkpIHsKKyAgICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ4IiwgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgbWF4Y2hhbnMsIE5VTEwpOworICB9IGVsc2UgeworICAgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoIngiLCAiY2hhbm5lbHMiLCBHU1RfVFlQRV9JTlRfUkFOR0UsCisgICAgICAgIE1BWCAoOSwgbWluY2hhbnMpLCBtYXhjaGFucywgTlVMTCk7CisgIH0KKyAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2hhbl9jYXBzLCBzKTsKKyAgcyA9IE5VTEw7CisKK2RvbmU6CisKKyAgR1NUX0xPR19PQkpFQ1QgKG9iaiwgImNoYW5uZWwgc3RydWN0dXJlczogJSIgR1NUX1BUUl9GT1JNQVQsIGNoYW5fY2Fwcyk7CisKKyAgb3V0X2NhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisKKyAgLyogY29tYmluZSBlYWNoIHN0cnVjdHVyZSBpbiB0aGUgaW5wdXQgY2FwcyB3aXRoIGVhY2ggY2hhbm5lbCBjYXBzIHN0cnVjdCAqLworICBmb3IgKGkgPSAwOyBpIDwgZ3N0X2NhcHNfZ2V0X3NpemUgKGluX2NhcHMpOyArK2kpIHsKKyAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKmluX3M7CisKKyAgICBpbl9zID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoaW5fY2FwcywgaSk7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgZ3N0X2NhcHNfZ2V0X3NpemUgKGNoYW5fY2Fwcyk7ICsraikgeworICAgICAgY29uc3QgR3N0U3RydWN0dXJlICpjaGFuX3M7CisgICAgICBjb25zdCBHVmFsdWUgKnZhbDsKKworICAgICAgcyA9IGdzdF9zdHJ1Y3R1cmVfY29weSAoaW5fcyk7CisgICAgICBjaGFuX3MgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjaGFuX2NhcHMsIGopOworICAgICAgaWYgKCh2YWwgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoY2hhbl9zLCAiY2hhbm5lbHMiKSkpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzLCAiY2hhbm5lbHMiLCB2YWwpOworICAgICAgaWYgKCh2YWwgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoY2hhbl9zLCAiY2hhbm5lbC1tYXNrIikpKQorICAgICAgICBnc3Rfc3RydWN0dXJlX3NldF92YWx1ZSAocywgImNoYW5uZWwtbWFzayIsIHZhbCk7CisKKyAgICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKG91dF9jYXBzLCBzKTsKKyAgICAgIHMgPSBOVUxMOworICAgIH0KKyAgfQorCisgIGdzdF9jYXBzX3VucmVmIChpbl9jYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNoYW5fY2Fwcyk7CisgIHJldHVybiBvdXRfY2FwczsKK30KKworR3N0Q2FwcyAqCitnc3Rfb3NzNF9hdWRpb19wcm9iZV9jYXBzIChHc3RPYmplY3QgKiBvYmosIGludCBmZCkKK3sKKyAgb3NzX2F1ZGlvaW5mbyBhaSA9IHsgMCwgfTsKKyAgZ2Jvb2xlYW4gb3V0cHV0OworICBHc3RDYXBzICpjYXBzOworICBpbnQgbm9ubmF0aXZlX2Zvcm1hdHMgPSAwOworICBpbnQgZm9ybWF0cywgaTsKKworICBvdXRwdXQgPSBHU1RfSVNfT1NTNF9TSU5LIChvYmopOworCisgIC8qIC0xID0gZ2V0IGluZm8gZm9yIGN1cnJlbnRseSBvcGVuIGRldmljZSAoZmQpLiBUaGlzIHdpbGwgZmFpbCB3aXRoCisgICAqIE9TUyBidWlsZCA8PSAxMDEzIGJlY2F1c2Ugb2YgYSBidWcgaW4gT1NTICovCisgIGFpLmRldiA9IC0xOworICBpZiAoaW9jdGwgKGZkLCBTTkRDVExfRU5HSU5FSU5GTywgJmFpKSA9PSAtMSkKKyAgICBnb3RvIGVuZ2luZWluZm9fZmFpbGVkOworCisgIGZvcm1hdHMgPSAob3V0cHV0KSA/IGFpLm9mb3JtYXRzIDogYWkuaWZvcm1hdHM7CisKKyAgR1NUX0xPR19PQkpFQ1QgKG9iaiwgIiVzIGZvcm1hdHMgOiAweCUwOHgiLCAob3V0cHV0KSA/ICJvdXQiIDogImluIiwgZm9ybWF0cyk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKworICAvKiBmaXJzdCBsaXN0IGFsbCB0aGUgZm9ybWF0cyBuYXRpdmVseSBzdXBwb3J0ZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAoZm10X21hcCk7ICsraSkgeworICAgIGlmICgoZm9ybWF0cyAmIGZtdF9tYXBbaV0ub3NzX2ZtdCkpIHsKKyAgICAgIGdzdF9vc3M0X2FwcGVuZF9mb3JtYXRfdG9fY2FwcyAoJmZtdF9tYXBbaV0sIGNhcHMpOworICAgIH0gZWxzZSBpZiAoKGZtdF9tYXBbaV0ub3NzX2ZtdCAmIENPTlZFUlRJQkxFX0ZPUk1BVFMpKSB7CisgICAgICBub25uYXRpdmVfZm9ybWF0cyB8PSBmbXRfbWFwW2ldLm9zc19mbXQ7CisgICAgfQorICB9CisKKyAgR1NUX0xPR19PQkpFQ1QgKG9iaiwgImFkZGluZyBub24tbmF0aXZlICVzIGZvcm1hdHMgOiAweCUwOHgiLAorICAgICAgKG91dHB1dCkgPyAib3V0IiA6ICJpbiIsIG5vbm5hdGl2ZV9mb3JtYXRzKTsKKworICAvKiBub3cgYXBwZW5kIG5vbi1uYXRpdmUgZm9ybWF0cyBmb3Igd2hpY2ggY29udmVyc2lvbiB3b3VsZCBiZSBuZWVkZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAoZm10X21hcCk7ICsraSkgeworICAgIGlmICgobm9ubmF0aXZlX2Zvcm1hdHMgJiBmbXRfbWFwW2ldLm9zc19mbXQpKSB7CisgICAgICBnc3Rfb3NzNF9hcHBlbmRfZm9ybWF0X3RvX2NhcHMgKCZmbXRfbWFwW2ldLCBjYXBzKTsKKyAgICB9CisgIH0KKworICBjYXBzID0gZ3N0X2NhcHNfc2ltcGxpZnkgKGNhcHMpOworICBHU1RfTE9HX09CSkVDVCAob2JqLCAiZm9ybWF0czogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIGlmICghZ3N0X29zczRfYXVkaW9fZGV0ZWN0X3JhdGVzIChvYmosICZhaSwgY2FwcykpCisgICAgZ290byBkZXRlY3RfcmF0ZXNfZmFpbGVkOworCisgIGNhcHMgPSBnc3Rfb3NzNF9hdWRpb19kZXRlY3RfY2hhbm5lbHMgKG9iaiwgZmQsICZhaSwgY2Fwcyk7CisgIGlmIChjYXBzID09IE5VTEwpCisgICAgZ290byBkZXRlY3RfY2hhbm5lbHNfZmFpbGVkOworCisgIEdTVF9MT0dfT0JKRUNUIChvYmosICJwcm9iZWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIHJldHVybiBjYXBzOworCisvKiBFUlJPUlMgKi8KK2VuZ2luZWluZm9fZmFpbGVkOgorICB7CisgICAgR1NUX1dBUk5JTkcgKCJFTkdJTkVJTkZPIHN1cHBvcnRlZCBmb3JtYXRzIHByb2JlIGZhaWxlZDogJXMiLAorICAgICAgICBnX3N0cmVycm9yIChlcnJubykpOworICAgIHJldHVybiBOVUxMOworICB9CitkZXRlY3RfcmF0ZXNfZmFpbGVkOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChvYmosICJmYWlsZWQgdG8gZGV0ZWN0IHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMiKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK2RldGVjdF9jaGFubmVsc19mYWlsZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG9iaiwgImZhaWxlZCB0byBkZXRlY3Qgc3VwcG9ydGVkIGNoYW5uZWxzIik7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK0dzdENhcHMgKgorZ3N0X29zczRfYXVkaW9fZ2V0X3RlbXBsYXRlX2NhcHMgKHZvaWQpCit7CisgIEdzdENhcHMgKmNhcHM7CisgIGdpbnQgaTsKKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIGZvciAoaSA9IDA7IGkgPCBHX05fRUxFTUVOVFMgKGZtdF9tYXApOyArK2kpIHsKKyAgICBnc3Rfb3NzNF9hcHBlbmRfZm9ybWF0X3RvX2NhcHMgKCZmbXRfbWFwW2ldLCBjYXBzKTsKKyAgfQorCisgIGNhcHMgPSBnc3RfY2Fwc19zaW1wbGlmeSAoY2Fwcyk7CisKKyAgZm9yIChpID0gMDsgaSA8IGdzdF9jYXBzX2dldF9zaXplIChjYXBzKTsgKytpKSB7CisgICAgR3N0U3RydWN0dXJlICpzOworCisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIGkpOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAicmF0ZSIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgR1NUX09TUzRfTUlOX1NBTVBMRV9SQVRFLAorICAgICAgICBHU1RfT1NTNF9NQVhfU0FNUExFX1JBVEUsICJjaGFubmVscyIsIEdTVF9UWVBFX0lOVF9SQU5HRSwKKyAgICAgICAgR1NUX09TUzRfTUlOX0NIQU5ORUxTLCBHU1RfT1NTNF9NQVhfQ0hBTk5FTFMsIE5VTEwpOworICB9CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKKy8qIGNhbGxlZCBieSBnc3Rfb3NzNF9zaW5rX3ByZXBhcmUoKSBhbmQgZ3N0X29zczRfc291cmNlX3ByZXBhcmUoKSAqLworZ2Jvb2xlYW4KK2dzdF9vc3M0X2F1ZGlvX3NldF9mb3JtYXQgKEdzdE9iamVjdCAqIG9iaiwgaW50IGZkLAorICAgIEdzdEF1ZGlvUmluZ0J1ZmZlclNwZWMgKiBzcGVjKQoreworICBzdHJ1Y3QgYXVkaW9fYnVmX2luZm8gaW5mbyA9IHsgMCwgfTsKKyAgaW50IG9mbXQsIGZtdCwgY2hhbnMsIHJhdGUsIHdpZHRoOworCisgIGZtdCA9IGdzdF9vc3M0X2F1ZGlvX2dldF9vc3NfZm9ybWF0IChzcGVjLT50eXBlLAorICAgICAgR1NUX0FVRElPX0lORk9fRk9STUFUICgmc3BlYy0+aW5mbykpOworCisgIGlmIChmbXQgPT0gMCkKKyAgICBnb3RvIHdyb25nX2Zvcm1hdDsKKworICBvZm10ID0gZm10OworICBjaGFucyA9IEdTVF9BVURJT19JTkZPX0NIQU5ORUxTICgmc3BlYy0+aW5mbyk7CisgIHJhdGUgPSBHU1RfQVVESU9fSU5GT19SQVRFICgmc3BlYy0+aW5mbyk7CisgIHdpZHRoID0gR1NUX0FVRElPX0lORk9fV0lEVEggKCZzcGVjLT5pbmZvKTsKKworICBpZiAoc3BlYy0+dHlwZSA9PSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfUkFXICYmCisgICAgICB3aWR0aCAhPSAzMiAmJiB3aWR0aCAhPSAyNCAmJiB3aWR0aCAhPSAxNiAmJiB3aWR0aCAhPSA4KSB7CisgICAgZ290byBkb2RneV93aWR0aDsKKyAgfQorCisgIC8qIGZvcm1hdCAqLworICBHU1RfTE9HX09CSkVDVCAob2JqLCAic2V0dGluZyBmb3JtYXQ6ICVkIiwgZm10KTsKKyAgaWYgKGlvY3RsIChmZCwgU05EQ1RMX0RTUF9TRVRGTVQsICZmbXQpID09IC0xKQorICAgIGdvdG8gc2V0X2Zvcm1hdF9mYWlsZWQ7CisKKyAgLyogY2hhbm5lbHMgKi8KKyAgR1NUX0xPR19PQkpFQ1QgKG9iaiwgInNldHRpbmcgY2hhbm5lbHM6ICVkIiwgY2hhbnMpOworICBpZiAoaW9jdGwgKGZkLCBTTkRDVExfRFNQX0NIQU5ORUxTLCAmY2hhbnMpID09IC0xKQorICAgIGdvdG8gc2V0X2NoYW5uZWxzX2ZhaWxlZDsKKworICAvKiByYXRlICovCisgIEdTVF9MT0dfT0JKRUNUIChvYmosICJzZXR0aW5nIHJhdGU6ICVkIiwgcmF0ZSk7CisgIGlmIChpb2N0bCAoZmQsIFNORENUTF9EU1BfU1BFRUQsICZyYXRlKSA9PSAtMSkKKyAgICBnb3RvIHNldF9yYXRlX2ZhaWxlZDsKKworICBHU1RfREVCVUdfT0JKRUNUIChvYmosICJlZmZlY3RpdmUgZm9ybWF0ICAgOiAlZCIsIGZtdCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKG9iaiwgImVmZmVjdGl2ZSBjaGFubmVscyA6ICVkIiwgY2hhbnMpOworICBHU1RfREVCVUdfT0JKRUNUIChvYmosICJlZmZlY3RpdmUgcmF0ZSAgICAgOiAlZCIsIHJhdGUpOworCisgIC8qIG1ha2Ugc3VyZSBmb3JtYXQsIGNoYW5uZWxzLCBhbmQgcmF0ZSBhcmUgdGhlIG9uZXMgd2UgcmVxdWVzdGVkICovCisgIGlmIChmbXQgIT0gb2ZtdCB8fCBjaGFucyAhPSBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJnNwZWMtPmluZm8pIHx8CisgICAgICByYXRlICE9IEdTVF9BVURJT19JTkZPX1JBVEUgKCZzcGVjLT5pbmZvKSkgeworICAgIC8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiwgYnV0IGhleSAqLworICAgIGdvdG8gZm9ybWF0X25vdF93aGF0X3dhc19yZXF1ZXN0ZWQ7CisgIH0KKworICBpZiAoR1NUX0lTX09TUzRfU09VUkNFIChvYmopKSB7CisgICAgaWYgKGlvY3RsIChmZCwgU05EQ1RMX0RTUF9HRVRJU1BBQ0UsICZpbmZvKSA9PSAtMSkKKyAgICAgIGdvdG8gZ2V0X2lzcGFjZV9mYWlsZWQ7CisgIH0gZWxzZSB7CisgICAgaWYgKGlvY3RsIChmZCwgU05EQ1RMX0RTUF9HRVRPU1BBQ0UsICZpbmZvKSA9PSAtMSkKKyAgICAgIGdvdG8gZ2V0X29zcGFjZV9mYWlsZWQ7CisgIH0KKworICBzcGVjLT5zZWdzaXplID0gaW5mby5mcmFnc2l6ZTsKKworICAvKiB3ZSBhZGQgc29tZSBleHRyYSBmcmFnbWVudHMgLS0gdGhpcyBoZWxwcyB1cyBhY2NvdW50IGZvciBkZWxheXMgZHVlIHRvCisgICAqIGNvbnZlcnNpb24gYnVmZmVyLCBzdHJlYW1zIHF1ZXVlaW5nLCBldGMuICBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGVzZQorICAgKiBiZSB0YWtlbiBpbnRvIGFjY291bnQgYmVjYXVzZSBvdGhlcndpc2UgdGhlIGRlbGF5IGNvdW50ZXIgY2FuIHdpbmQgdXAKKyAgICogYmVpbmcgdG9vIGxhcmdlLCBhbmQgdGhlIGJ1ZmZlciB3aWxsIHdyYXAuICAqLworICBzcGVjLT5zZWd0b3RhbCA9IGluZm8uZnJhZ3N0b3RhbCArIDQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAob2JqLCAiZ290IHNlZ3NpemU6ICVkLCBzZWd0b3RhbDogJWQsIHZhbHVlOiAlMDh4IiwKKyAgICAgIHNwZWMtPnNlZ3NpemUsIHNwZWMtPnNlZ3RvdGFsLCBpbmZvLmZyYWdzaXplKTsKKworICBnc3Rfb3NzNF9hdWRpb19zZXRfcmluZ2J1ZmZlcl9jaGFubmVsX2xheW91dCAob2JqLCBmZCwgc3BlYyk7CisKKyAgcmV0dXJuIFRSVUU7CisKKy8qIEVSUk9SUyAqLword3JvbmdfZm9ybWF0OgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9iaiwgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiVW5hYmxlIHRvIGdldCBmb3JtYXQgKCVkLCAlZCkiLCBzcGVjLT50eXBlLAorICAgICAgICAgICAgR1NUX0FVRElPX0lORk9fRk9STUFUICgmc3BlYy0+aW5mbykpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2RvZGd5X3dpZHRoOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9iaiwgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgidW5leHBlY3RlZCB3aWR0aCAlZCIsIHdpZHRoKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitzZXRfZm9ybWF0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvYmosIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoIkRTUF9TRVRGTVQoJWQpIGZhaWxlZDogJXMiLCBmbXQsIGdfc3RyZXJyb3IgKGVycm5vKSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorc2V0X2NoYW5uZWxzX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvYmosIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoIkRTUF9DSEFOTkVMUyglZCkgZmFpbGVkOiAlcyIsIGNoYW5zLCBnX3N0cmVycm9yIChlcnJubykpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3NldF9yYXRlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvYmosIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoIkRTUF9TUEVFRCglZCkgZmFpbGVkOiAlcyIsIHJhdGUsIGdfc3RyZXJyb3IgKGVycm5vKSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorZ2V0X29zcGFjZV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob2JqLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgKCJEU1BfR0VUT1NQQUNFIGZhaWxlZDogJXMiLCBnX3N0cmVycm9yIChlcnJubykpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2dldF9pc3BhY2VfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9iaiwgUkVTT1VSQ0UsIFNFVFRJTkdTLCAoTlVMTCksCisgICAgICAgICgiRFNQX0dFVElTUEFDRSBmYWlsZWQ6ICVzIiwgZ19zdHJlcnJvciAoZXJybm8pKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citmb3JtYXRfbm90X3doYXRfd2FzX3JlcXVlc3RlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvYmosIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAoIkZvcm1hdCBhY3R1YWxseSBjb25maWd1cmVkIHdhc24ndCB0aGUgb25lIHdlIHJlcXVlc3RlZC4gVGhpcyBpcyAiCisgICAgICAgICAgICAicHJvYmFibHkgZWl0aGVyIGEgYnVnIGluIHRoZSBkcml2ZXIgb3IgaW4gdGhlIGZvcm1hdCBwcm9iaW5nIGNvZGUuIikpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitpbnQKK2dzdF9vc3M0X2F1ZGlvX2dldF92ZXJzaW9uIChHc3RPYmplY3QgKiBvYmosIGludCBmZCkKK3sKKyAgZ2ludCB2ZXIgPSAwOworCisgIC8qIHdlIHVzZSB0aGUgb2xkIGlvY3RsIGhlcmUgb24gcHVycG9zZSBpbnN0ZWFkIG9mIFNORENUTF9TWVNJTkZPICovCisgIGlmIChpb2N0bCAoZmQsIE9TU19HRVRWRVJTSU9OLCAmdmVyKSA8IDApIHsKKyAgICBHU1RfTE9HX09CSkVDVCAob2JqLCAiT1NTX0dFVFZFUlNJT04gZmFpbGVkOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgcmV0dXJuIC0xOworICB9CisgIEdTVF9MT0dfT0JKRUNUIChvYmosICJPU1MgdmVyc2lvbjogMHglMDh4IiwgdmVyKTsKKyAgcmV0dXJuIHZlcjsKK30KKworZ2Jvb2xlYW4KK2dzdF9vc3M0X2F1ZGlvX2NoZWNrX3ZlcnNpb24gKEdzdE9iamVjdCAqIG9iaiwgaW50IGZkKQoreworICByZXR1cm4gKGdzdF9vc3M0X2F1ZGlvX2dldF92ZXJzaW9uIChvYmosIGZkKSA+PSBHU1RfTUlOX09TUzRfVkVSU0lPTik7Cit9CisKK2djaGFyICoKK2dzdF9vc3M0X2F1ZGlvX2ZpbmRfZGV2aWNlIChHc3RPYmplY3QgKiBvc3MpCit7CisgIEdWYWx1ZUFycmF5ICphcnI7CisgIGdjaGFyICpyZXQgPSBOVUxMOworCisgIGFyciA9IGdzdF9vc3M0X3Byb3BlcnR5X3Byb2JlX2dldF92YWx1ZXMgKEdTVF9PQkpFQ1QgKG9zcyksICJkZXZpY2UiKTsKKworICBpZiAoYXJyICE9IE5VTEwpIHsKKyAgICBpZiAoYXJyLT5uX3ZhbHVlcyA+IDApIHsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsOworCisgICAgICB2YWwgPSBnX3ZhbHVlX2FycmF5X2dldF9udGggKGFyciwgMCk7CisgICAgICByZXQgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbCk7CisgICAgfQorICAgIGdfdmFsdWVfYXJyYXlfZnJlZSAoYXJyKTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChvc3MsICJmaXJzdCBkZXZpY2UgZm91bmQ6ICVzIiwgR1NUX1NUUl9OVUxMIChyZXQpKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIGdpbnQgcmFuazsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAob3NzNHNpbmtfZGVidWcsICJvc3M0c2luayIsIDAsICJPU1M0IGF1ZGlvIHNpbmsiKTsKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKG9zczRzcmNfZGVidWcsICJvc3M0c3JjIiwgMCwgIk9TUzQgYXVkaW8gc3JjIik7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChvc3M0bWl4ZXJfZGVidWcsICJvc3M0bWl4ZXIiLCAwLCAiT1NTNCBtaXhlciIpOworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAob3NzNF9kZWJ1ZywgIm9zczQiLCAwLCAiT1NTNCBwbHVnaW4iKTsKKworI2lmZGVmIEVOQUJMRV9OTFMKKyAgR1NUX0RFQlVHICgiYmluZGluZyB0ZXh0IGRvbWFpbiAlcyB0byBsb2NhbGUgZGlyICVzIiwgR0VUVEVYVF9QQUNLQUdFLAorICAgICAgTE9DQUxFRElSKTsKKyAgYmluZHRleHRkb21haW4gKEdFVFRFWFRfUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKEdFVFRFWFRfUEFDS0FHRSwgIlVURi04Iik7CisjZW5kaWYKKworICAvKiB3ZSB3YW50IGEgaGlnaGVyIHJhbmsgdGhhbiB0aGUgbGVnYWN5IE9TUyBlbGVtZW50cyBoYXZlIG5vdyAqLworICByYW5rID0gR1NUX1JBTktfU0VDT05EQVJZICsgMTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJvc3M0c2luayIsIHJhbmssIEdTVF9UWVBFX09TUzRfU0lOSykgfHwKKyAgICAgICFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAib3NzNHNyYyIsIHJhbmssIEdTVF9UWVBFX09TUzRfU09VUkNFKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgb3NzNCwKKyAgICAiT3BlbiBTb3VuZCBTeXN0ZW0gKE9TUykgdmVyc2lvbiA0IHN1cHBvcnQgZm9yIEdTdHJlYW1lciIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9zeXMvb3NzNC9vc3M0LWF1ZGlvLmggYi9zeXMvb3NzNC9vc3M0LWF1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxMjhjMAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3M0L29zczQtYXVkaW8uaApAQCAtMCwwICsxLDQzIEBACisvKiBHU3RyZWFtZXIgT1NTNCBhdWRpbyBwbHVnaW4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBHU1RfT1NTNF9BVURJT19ICisjZGVmaW5lIEdTVF9PU1M0X0FVRElPX0gKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworLyogVGhpcyBpcyB0aGUgbWluaW11bSB2ZXJzaW9uIHdlIHJlcXVpcmUgKi8KKyNkZWZpbmUgR1NUX01JTl9PU1M0X1ZFUlNJT04gIDB4MDQwMDAzCisKK2ludCAgICAgICBnc3Rfb3NzNF9hdWRpb19nZXRfdmVyc2lvbiAoR3N0T2JqZWN0ICogb2JqLCBpbnQgZmQpOworCitnYm9vbGVhbiAgZ3N0X29zczRfYXVkaW9fY2hlY2tfdmVyc2lvbiAoR3N0T2JqZWN0ICogb2JqLCBpbnQgZmQpOworCitHc3RDYXBzICogZ3N0X29zczRfYXVkaW9fcHJvYmVfY2FwcyAgKEdzdE9iamVjdCAqIG9iaiwgaW50IGZkKTsKKworZ2Jvb2xlYW4gIGdzdF9vc3M0X2F1ZGlvX3NldF9mb3JtYXQgIChHc3RPYmplY3QgKiBvYmosIGludCBmZCwgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpOworCitHc3RDYXBzICogZ3N0X29zczRfYXVkaW9fZ2V0X3RlbXBsYXRlX2NhcHMgKHZvaWQpOworCitnY2hhciAgICogZ3N0X29zczRfYXVkaW9fZmluZF9kZXZpY2UgKEdzdE9iamVjdCAqIG9zcyk7CisKKyNlbmRpZiAvKiBHU1RfT1NTNF9BVURJT19IICovCisKKwpkaWZmIC0tZ2l0IGEvc3lzL29zczQvb3NzNC1wcm9wZXJ0eS1wcm9iZS5jIGIvc3lzL29zczQvb3NzNC1wcm9wZXJ0eS1wcm9iZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NDRlYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3NzNC9vc3M0LXByb3BlcnR5LXByb2JlLmMKQEAgLTAsMCArMSwzNDUgQEAKKy8qIEdTdHJlYW1lciBPU1M0IGF1ZGlvIHByb3BlcnR5IHByb2JlIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKiBGSVhNRSAwLjExOiBzdXBwcmVzcyB3YXJuaW5ncyBmb3IgZGVwcmVjYXRlZCBBUEkgc3VjaCBhcyBHVmFsdWVBcnJheQorICogd2l0aCBuZXdlciBHTGliIHZlcnNpb25zICg+PSAyLjMxLjApICovCisjZGVmaW5lIEdMSUJfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKworI2RlZmluZSBOT19MRUdBQ1lfTUlYRVIKKyNpbmNsdWRlICJvc3M0LWF1ZGlvLmgiCisjaW5jbHVkZSAib3NzNC1zaW5rLmgiCisjaW5jbHVkZSAib3NzNC1zb3VyY2UuaCIKKyNpbmNsdWRlICJvc3M0LXNvdW5kY2FyZC5oIgorI2luY2x1ZGUgIm9zczQtcHJvcGVydHktcHJvYmUuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgMAorCitHU1RfREVCVUdfQ0FURUdPUllfRVhURVJOIChvc3M0X2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIG9zczRfZGVidWcKKworc3RhdGljIGNvbnN0IEdMaXN0ICoKK2dzdF9vc3M0X3Byb3BlcnR5X3Byb2JlX2dldF9wcm9wZXJ0aWVzIChHc3RQcm9wZXJ0eVByb2JlICogcHJvYmUpCit7CisgIEdPYmplY3RDbGFzcyAqa2xhc3MgPSBHX09CSkVDVF9HRVRfQ0xBU1MgKHByb2JlKTsKKyAgR0xpc3QgKmxpc3Q7CisKKyAgR1NUX09CSkVDVF9MT0NLIChHU1RfT0JKRUNUIChwcm9iZSkpOworCisgIC8qIHdlIGNyZWF0ZSBhIG5ldyBsaXN0IGFuZCBzdG9yZSBpdCBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0LCBzaW5jZSBhcHBhcmVudGx5CisgICAqIHdlIGZvcmdvdCB0byB1cGRhdGUgdGhlIEFQSSBmb3IgMC4xMCAoYW5kIHdoeSBkb24ndCB3ZSBtYXJrIHByb2JhYmxlCisgICAqIHByb3BlcnRpZXMgd2l0aCBhIGZsYWcgaW5zdGVhZCBhbnl3YXk/KS4gQSBiaXQgaGFja2lzaCwgYnV0IHdoYXQgY2FuIHlvdQorICAgKiBkbyAoY2FuJ3QgcmVhbGx5IHVzZSBhIHN0YXRpYyB2YXJpYWJsZSBzaW5jZSB0aGUgcHNwZWMgd2lsbCBiZSBkaWZmZXJlbnQKKyAgICogZm9yIHNyYyBhbmQgc2luayBjbGFzcyk7IHRoaXMgaXNuJ3QgcGFydGljdWxhcmx5IHByZXR0eSwgYnV0IHRoZSBiZXN0CisgICAqIHdlIGNhbiBkbyBnaXZlbiB0aGF0IHdlIGNhbid0IGNyZWF0ZSBhIGNvbW1vbiBiYXNlIGNsYXNzICh3ZSBjb3VsZCBkbworICAgKiBmYW5jeSB0aGluZ3Mgd2l0aCB0aGUgaW50ZXJmYWNlLCBvciB1c2UgZ19vYmplY3Rfc2V0X2RhdGEgaW5zdGVhZCwgYnV0CisgICAqIGl0J3Mgbm90IHJlYWxseSBnb2luZyB0byBtYWtlIGl0IG11Y2ggYmV0dGVyKSAqLworICBpZiAoR1NUX0lTX0FVRElPX1NJTktfQ0xBU1MgKGtsYXNzKSkgeworICAgIGxpc3QgPSBHU1RfT1NTNF9TSU5LIChwcm9iZSktPnByb3BlcnR5X3Byb2JlX2xpc3Q7CisgIH0gZWxzZSBpZiAoR1NUX0lTX0FVRElPX1NSQ19DTEFTUyAoa2xhc3MpKSB7CisgICAgbGlzdCA9IEdTVF9PU1M0X1NPVVJDRSAocHJvYmUpLT5wcm9wZXJ0eV9wcm9iZV9saXN0OworICB9IGVsc2UgaWYgKEdTVF9JU19PU1M0X01JWEVSX0NMQVNTIChrbGFzcykpIHsKKyAgICBsaXN0ID0gR1NUX09TUzRfTUlYRVIgKHByb2JlKS0+cHJvcGVydHlfcHJvYmVfbGlzdDsKKyAgfSBlbHNlIHsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAoR1NUX09CSkVDVCAocHJvYmUpKTsKKyAgICBnX3JldHVybl92YWxfaWZfcmVhY2hlZCAoTlVMTCk7CisgIH0KKworICBpZiAobGlzdCA9PSBOVUxMKSB7CisgICAgR1BhcmFtU3BlYyAqcHNwZWM7CisKKyAgICBwc3BlYyA9IGdfb2JqZWN0X2NsYXNzX2ZpbmRfcHJvcGVydHkgKGtsYXNzLCAiZGV2aWNlIik7CisgICAgbGlzdCA9IGdfbGlzdF9wcmVwZW5kIChOVUxMLCBwc3BlYyk7CisKKyAgICBpZiAoR1NUX0lTX0FVRElPX1NJTktfQ0xBU1MgKGtsYXNzKSkgeworICAgICAgR1NUX09TUzRfU0lOSyAocHJvYmUpLT5wcm9wZXJ0eV9wcm9iZV9saXN0ID0gbGlzdDsKKyAgICB9IGVsc2UgaWYgKEdTVF9JU19BVURJT19TUkNfQ0xBU1MgKGtsYXNzKSkgeworICAgICAgR1NUX09TUzRfU09VUkNFIChwcm9iZSktPnByb3BlcnR5X3Byb2JlX2xpc3QgPSBsaXN0OworICAgIH0gZWxzZSBpZiAoR1NUX0lTX09TUzRfTUlYRVJfQ0xBU1MgKGtsYXNzKSkgeworICAgICAgR1NUX09TUzRfTUlYRVIgKHByb2JlKS0+cHJvcGVydHlfcHJvYmVfbGlzdCA9IGxpc3Q7CisgICAgfQorICB9CisKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKEdTVF9PQkpFQ1QgKHByb2JlKSk7CisKKyAgcmV0dXJuIGxpc3Q7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzNF9wcm9wZXJ0eV9wcm9iZV9wcm9iZV9wcm9wZXJ0eSAoR3N0UHJvcGVydHlQcm9iZSAqIHByb2JlLAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgaWYgKCFnX3N0cl9lcXVhbCAocHNwZWMtPm5hbWUsICJkZXZpY2UiKSkgeworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAocHJvYmUsIHByb3BfaWQsIHBzcGVjKTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3M0X3Byb3BlcnR5X3Byb2JlX25lZWRzX3Byb2JlIChHc3RQcm9wZXJ0eVByb2JlICogcHJvYmUsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICAvKiBkb24ndCBjYWNoZSBwcm9iZWQgZGF0YSAqLworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmCisKKy8qIGNhbGxlciBtdXN0IGVuc3VyZSBMT0NLIGlzIHRha2VuIChlLmcuIGlmIGlvY3RscyBuZWVkIHRvIGJlIHNlcmlhbGlzZWQpICovCitnYm9vbGVhbgorZ3N0X29zczRfcHJvcGVydHlfcHJvYmVfZmluZF9kZXZpY2VfbmFtZSAoR3N0T2JqZWN0ICogb2JqLCBpbnQgZmQsCisgICAgY29uc3QgZ2NoYXIgKiBkZXZpY2VfaGFuZGxlLCBnY2hhciAqKiBkZXZpY2VfbmFtZSkKK3sKKyAgc3RydWN0IG9zc19zeXNpbmZvIHNpID0geyB7MCx9LCB9OworICBnY2hhciAqbmFtZSA9IE5VTEw7CisKKyAgaWYgKGlvY3RsIChmZCwgU05EQ1RMX1NZU0lORk8sICZzaSkgPT0gMCkgeworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpLm51bWF1ZGlvczsgKytpKSB7CisgICAgICBzdHJ1Y3Qgb3NzX2F1ZGlvaW5mbyBhaSA9IHsgMCwgfTsKKworICAgICAgYWkuZGV2ID0gaTsKKyAgICAgIGlmIChpb2N0bCAoZmQsIFNORENUTF9BVURJT0lORk8sICZhaSkgPT0gLTEpIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqLCAiQVVESU9JTkZPIGlvY3RsIGZvciBkZXZpY2UgJWQgZmFpbGVkIiwgaSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHN0cmNtcCAoYWkuZGV2bm9kZSwgZGV2aWNlX2hhbmRsZSkgPT0gMCkgeworICAgICAgICBuYW1lID0gZ19zdHJkdXAgKGFpLm5hbWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChvYmosICJTWVNJTkZPIGlvY3RsIGZhaWxlZDogJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworICB9CisKKyAgLyogdHJ5IEVOR0lORUlORk8gYXMgZmFsbGJhY2sgKHdoaWNoIGlzIGJldHRlciB0aGFuIG5vdGhpbmcpICovCisgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICBzdHJ1Y3Qgb3NzX2F1ZGlvaW5mbyBhaSA9IHsgMCwgfTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChvYmosICJkZXZpY2UgJXMgbm90IGxpc3RlZCBpbiBBVURJT0lORk8iLCBkZXZpY2VfaGFuZGxlKTsKKyAgICBhaS5kZXYgPSAtMTsKKyAgICBpZiAoaW9jdGwgKGZkLCBTTkRDVExfRU5HSU5FSU5GTywgJmFpKSA9PSAwKQorICAgICAgbmFtZSA9IGdfc3RyZHVwIChhaS5uYW1lKTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKG9iaiwgIkRldmljZSBuYW1lOiAlcyIsIEdTVF9TVFJfTlVMTCAobmFtZSkpOworCisgIGlmIChuYW1lICE9IE5VTEwpCisgICAgKmRldmljZV9uYW1lID0gbmFtZTsKKworICByZXR1cm4gKG5hbWUgIT0gTlVMTCk7Cit9CisKK2dib29sZWFuCitnc3Rfb3NzNF9wcm9wZXJ0eV9wcm9iZV9maW5kX2RldmljZV9uYW1lX25vZmQgKEdzdE9iamVjdCAqIG9iaiwKKyAgICBjb25zdCBnY2hhciAqIGRldmljZV9oYW5kbGUsIGdjaGFyICoqIGRldmljZV9uYW1lKQoreworICBnYm9vbGVhbiByZXM7CisgIGludCBmZDsKKworICBmZCA9IG9wZW4gKCIvZGV2L21peGVyIiwgT19SRE9OTFkpOworICBpZiAoZmQgPCAwKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXMgPSBnc3Rfb3NzNF9wcm9wZXJ0eV9wcm9iZV9maW5kX2RldmljZV9uYW1lIChvYmosIGZkLCBkZXZpY2VfaGFuZGxlLAorICAgICAgZGV2aWNlX25hbWUpOworCisgIGNsb3NlIChmZCk7CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHTGlzdCAqCitnc3Rfb3NzNF9wcm9wZXJ0eV9wcm9iZV9nZXRfYXVkaW9fZGV2aWNlcyAoR3N0T2JqZWN0ICogb2JqLCBpbnQgZmQsCisgICAgc3RydWN0IG9zc19zeXNpbmZvICpzaSwgaW50IGNhcF9tYXNrKQoreworICBHTGlzdCAqZGV2aWNlcyA9IE5VTEw7CisgIGludCBpOworCisgIEdTVF9MT0dfT0JKRUNUIChvYmosICIlZCBhdWRpby9kc3AgZGV2aWNlcyIsIHNpLT5udW1hdWRpb3MpOworCisgIGZvciAoaSA9IDA7IGkgPCBzaS0+bnVtYXVkaW9zOyArK2kpIHsKKyAgICBzdHJ1Y3Qgb3NzX2F1ZGlvaW5mbyBhaSA9IHsgMCwgfTsKKworICAgIGFpLmRldiA9IGk7CisgICAgaWYgKGlvY3RsIChmZCwgU05EQ1RMX0FVRElPSU5GTywgJmFpKSA9PSAtMSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqLCAiQVVESU9JTkZPIGlvY3RsIGZvciBkZXZpY2UgJWQgZmFpbGVkIiwgaSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAoKGFpLmNhcHMgJiBjYXBfbWFzaykgPT0gMCkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqLCAiYXVkaW8gZGV2aWNlICVkIGlzIG5vdCBhbiAlcyBkZXZpY2UiLCBpLAorICAgICAgICAgIChjYXBfbWFzayA9PSBQQ01fQ0FQX09VVFBVVCkgPyAib3V0cHV0IiA6ICJpbnB1dCIpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKCFhaS5lbmFibGVkKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChvYmosICJhdWRpbyBkZXZpY2UgJWQgaXMgbm90IHVzYWJsZS9lbmFibGVkIiwgaSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChvYmosICJhdWRpbyBkZXZpY2UgJWQgbG9va3Mgb2s6ICVzIChcIiVzXCIpIiwgaSwKKyAgICAgICAgYWkuZGV2bm9kZSwgYWkubmFtZSk7CisKKyAgICBkZXZpY2VzID0gZ19saXN0X3ByZXBlbmQgKGRldmljZXMsIGdfc3RyZHVwIChhaS5kZXZub2RlKSk7CisgIH0KKworICByZXR1cm4gZ19saXN0X3JldmVyc2UgKGRldmljZXMpOworfQorCitHVmFsdWVBcnJheSAqCitnc3Rfb3NzNF9wcm9wZXJ0eV9wcm9iZV9nZXRfdmFsdWVzIChHc3RPYmplY3QgKiBwcm9iZSwgY29uc3QgZ2NoYXIgKiBwbmFtZSkKK3sKKyAgc3RydWN0IG9zc19zeXNpbmZvIHNpID0geyB7MCx9LCB9OworICBHVmFsdWVBcnJheSAqYXJyYXkgPSBOVUxMOworICBHc3RPYmplY3QgKm9iajsKKyAgR0xpc3QgKmRldmljZXMsICpsOworICBpbnQgY2FwX21hc2ssIGZkID0gLTE7CisKKyAgaWYgKCFnX3N0cl9lcXVhbCAocG5hbWUsICJkZXZpY2UiKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocHJvYmUsICJpbnZhbGlkIHByb3BlcnR5Iik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBvYmogPSBHU1RfT0JKRUNUIChwcm9iZSk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChvYmopOworCisgIC8qIGZpZ3VyZSBvdXQgd2hldGhlciB0aGUgZWxlbWVudCBpcyBhIHNvdXJjZSBvciBzaW5rICovCisgIGlmIChHU1RfSVNfT1NTNF9TSU5LIChwcm9iZSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwcm9iZSwgInByb2JpbmcgYXZhaWxhYmxlIG91dHB1dCBkZXZpY2VzIik7CisgICAgY2FwX21hc2sgPSBQQ01fQ0FQX09VVFBVVDsKKyAgICBmZCA9IEdTVF9PU1M0X1NJTksgKHByb2JlKS0+ZmQ7CisgIH0gZWxzZSBpZiAoR1NUX0lTX09TUzRfU09VUkNFIChwcm9iZSkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwcm9iZSwgInByb2JpbmcgYXZhaWxhYmxlIGlucHV0IGRldmljZXMiKTsKKyAgICBjYXBfbWFzayA9IFBDTV9DQVBfSU5QVVQ7CisgICAgZmQgPSBHU1RfT1NTNF9TT1VSQ0UgKHByb2JlKS0+ZmQ7CisgIH0gZWxzZSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKG9iaik7CisgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvKiBjb3B5IGZkIGlmIGl0J3Mgb3Blbiwgc28gd2UgY2FuIGp1c3QgdW5jb25kaXRpb25hbGx5IGNsb3NlKCkgbGF0ZXIgKi8KKyAgaWYgKGZkICE9IC0xKQorICAgIGZkID0gZHVwIChmZCk7CisKKyAgLyogdGhpcyB3aWxsIGFsc28gY2F0Y2ggdGhlIHVubGlrZWx5IGNhc2Ugd2hlcmUgdGhlIGFib3ZlIGR1cCgpIGZhaWxlZCAqLworICBpZiAoZmQgPT0gLTEpIHsKKyAgICBmZCA9IG9wZW4gKCIvZGV2L21peGVyIiwgT19SRE9OTFkgfCBPX05PTkJMT0NLLCAwKTsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgZ290byBvcGVuX2ZhaWxlZDsKKyAgICBlbHNlIGlmICghZ3N0X29zczRfYXVkaW9fY2hlY2tfdmVyc2lvbiAoR1NUX09CSkVDVCAocHJvYmUpLCBmZCkpCisgICAgICBnb3RvIGxlZ2FjeV9vc3M7CisgIH0KKworICBpZiAoaW9jdGwgKGZkLCBTTkRDVExfU1lTSU5GTywgJnNpKSA9PSAtMSkKKyAgICBnb3RvIG5vX3N5c2luZm87CisKKyAgZGV2aWNlcyA9IGdzdF9vc3M0X3Byb3BlcnR5X3Byb2JlX2dldF9hdWRpb19kZXZpY2VzIChvYmosIGZkLCAmc2ksIGNhcF9tYXNrKTsKKworICBpZiAoZGV2aWNlcyA9PSBOVUxMKSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKG9iaik7CisgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqLCAiTm8gZGV2aWNlcyBmb3VuZCIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGFycmF5ID0gZ192YWx1ZV9hcnJheV9uZXcgKDEpOworCisgIGZvciAobCA9IGRldmljZXM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKKyAgICBHVmFsdWUgdmFsID0geyAwLCB9OworCisgICAgZ192YWx1ZV9pbml0ICgmdmFsLCBHX1RZUEVfU1RSSU5HKTsKKyAgICBnX3ZhbHVlX3Rha2Vfc3RyaW5nICgmdmFsLCAoZ2NoYXIgKikgbC0+ZGF0YSk7CisgICAgbC0+ZGF0YSA9IE5VTEw7CisgICAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKGFycmF5LCAmdmFsKTsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmdmFsKTsKKyAgfQorCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChvYmopOworCisgIGdfbGlzdF9mcmVlIChkZXZpY2VzKTsKKworZG9uZToKKworICBjbG9zZSAoZmQpOworCisgIHJldHVybiBhcnJheTsKKworLyogRVJST1JTICovCitvcGVuX2ZhaWxlZDoKKyAgeworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChHU1RfT0JKRUNUIChwcm9iZSkpOworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocHJvYmUsICJDYW4ndCBvcGVuIGZpbGUgZGVzY3JpcHRvciB0byBwcm9iZSAiCisgICAgICAgICJhdmFpbGFibGUgZGV2aWNlczogJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworICAgIHJldHVybiBOVUxMOworICB9CitsZWdhY3lfb3NzOgorICB7CisgICAgY2xvc2UgKGZkKTsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAoR1NUX09CSkVDVCAocHJvYmUpKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwcm9iZSwgIkxlZ2FjeSBPU1MgKGllLiBub3QgT1NTdjQpLCBub3Qgc3VwcG9ydGVkIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK25vX3N5c2luZm86CisgIHsKKyAgICBjbG9zZSAoZmQpOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChHU1RfT0JKRUNUIChwcm9iZSkpOworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocHJvYmUsICJDYW4ndCBvcGVuIGZpbGUgZGVzY3JpcHRvciB0byBwcm9iZSAiCisgICAgICAgICJhdmFpbGFibGUgZGV2aWNlczogJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorZ3N0X29zczRfcHJvcGVydHlfcHJvYmVfaW50ZXJmYWNlX2luaXQgKEdzdFByb3BlcnR5UHJvYmVJbnRlcmZhY2UgKiBpZmFjZSkKK3sKKyAgaWZhY2UtPmdldF9wcm9wZXJ0aWVzID0gZ3N0X29zczRfcHJvcGVydHlfcHJvYmVfZ2V0X3Byb3BlcnRpZXM7CisgIGlmYWNlLT5wcm9iZV9wcm9wZXJ0eSA9IGdzdF9vc3M0X3Byb3BlcnR5X3Byb2JlX3Byb2JlX3Byb3BlcnR5OworICBpZmFjZS0+bmVlZHNfcHJvYmUgPSBnc3Rfb3NzNF9wcm9wZXJ0eV9wcm9iZV9uZWVkc19wcm9iZTsKKyAgaWZhY2UtPmdldF92YWx1ZXMgPSBnc3Rfb3NzNF9wcm9wZXJ0eV9wcm9iZV9nZXRfdmFsdWVzOworfQorCit2b2lkCitnc3Rfb3NzNF9hZGRfcHJvcGVydHlfcHJvYmVfaW50ZXJmYWNlIChHVHlwZSB0eXBlKQoreworICBzdGF0aWMgY29uc3QgR0ludGVyZmFjZUluZm8gcHJvYmVfaWZhY2VfaW5mbyA9IHsKKyAgICAoR0ludGVyZmFjZUluaXRGdW5jKSBnc3Rfb3NzNF9wcm9wZXJ0eV9wcm9iZV9pbnRlcmZhY2VfaW5pdCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgIH07CisKKyAgZ190eXBlX2FkZF9pbnRlcmZhY2Vfc3RhdGljICh0eXBlLCBHU1RfVFlQRV9QUk9QRVJUWV9QUk9CRSwKKyAgICAgICZwcm9iZV9pZmFjZV9pbmZvKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL29zczQvb3NzNC1wcm9wZXJ0eS1wcm9iZS5oIGIvc3lzL29zczQvb3NzNC1wcm9wZXJ0eS1wcm9iZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNDZmOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3NzNC9vc3M0LXByb3BlcnR5LXByb2JlLmgKQEAgLTAsMCArMSw0NSBAQAorLyogR1N0cmVhbWVyIE9TUzQgYXVkaW8gcHJvcGVydHkgcHJvYmUgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgR1NUX09TUzRfUFJPUEVSVFlfUFJPQkVfSAorI2RlZmluZSBHU1RfT1NTNF9QUk9QRVJUWV9QUk9CRV9ICisKKyNpZiAwCisKKyNpbmNsdWRlIDxnc3QvaW50ZXJmYWNlcy9wcm9wZXJ0eXByb2JlLmg+CisKK3ZvaWQgICAgICBnc3Rfb3NzNF9hZGRfcHJvcGVydHlfcHJvYmVfaW50ZXJmYWNlIChHVHlwZSB0eXBlKTsKKworI2VuZGlmCisKK2dib29sZWFuICBnc3Rfb3NzNF9wcm9wZXJ0eV9wcm9iZV9maW5kX2RldmljZV9uYW1lIChHc3RPYmplY3QgICAqIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICogZGV2aWNlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAgICAgICoqIGRldmljZV9uYW1lKTsKKworZ2Jvb2xlYW4gIGdzdF9vc3M0X3Byb3BlcnR5X3Byb2JlX2ZpbmRfZGV2aWNlX25hbWVfbm9mZCAoR3N0T2JqZWN0ICAgKiBvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqIGRldmljZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAgICAgICoqIGRldmljZV9uYW1lKTsKKworR1ZhbHVlQXJyYXkgKmdzdF9vc3M0X3Byb3BlcnR5X3Byb2JlX2dldF92YWx1ZXMgKEdzdE9iamVjdCAqIG9iaiwgY29uc3QgZ2NoYXIgKiBwbmFtZSk7CisKKworI2VuZGlmIC8qIEdTVF9PU1M0X1BST1BFUlRZX1BST0JFX0ggKi8KKworCmRpZmYgLS1naXQgYS9zeXMvb3NzNC9vc3M0LXNpbmsuYyBiL3N5cy9vc3M0L29zczQtc2luay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MDI4ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3NzNC9vc3M0LXNpbmsuYwpAQCAtMCwwICsxLDY4OSBAQAorLyogR1N0cmVhbWVyIE9TUzQgYXVkaW8gc2luaworICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtb3NzNHNpbmsKKyAqCisgKiBUaGlzIGVsZW1lbnQgbGV0cyB5b3Ugb3V0cHV0IHNvdW5kIHVzaW5nIHRoZSBPcGVuIFNvdW5kIFN5c3RlbSAoT1NTKQorICogdmVyc2lvbiA0LgorICogCisgKiBOb3RlIHRoYXQgeW91IHNob3VsZCBhbG1vc3QgYWx3YXlzIHVzZSBnZW5lcmljIGF1ZGlvIGNvbnZlcnNpb24gZWxlbWVudHMKKyAqIGxpa2UgYXVkaW9jb252ZXJ0IGFuZCBhdWRpb3Jlc2FtcGxlIGluIGZyb250IG9mIGFuIGF1ZGlvc2luayB0byBtYWtlIHN1cmUKKyAqIHlvdXIgcGlwZWxpbmUgd29ya3MgdW5kZXIgYWxsIGNpcmN1bXN0YW5jZXMgKHRob3NlIGNvbnZlcnNpb24gZWxlbWVudHMgd2lsbAorICogYWN0IGluIHBhc3N0aHJvdWdoLW1vZGUgaWYgbm8gY29udmVyc2lvbiBpcyBuZWNlc3NhcnkpLgorICogCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IGF1ZGlvdGVzdHNyYyAhIGF1ZGlvY29udmVydCAhIHZvbHVtZSB2b2x1bWU9MC4xICEgb3NzNHNpbmsKKyAqIF18IHdpbGwgb3V0cHV0IGEgc2luZSB3YXZlIChjb250aW51b3VzIGJlZXAgc291bmQpIHRvIHlvdXIgc291bmQgY2FyZCAod2l0aAorICogYSB2ZXJ5IGxvdyB2b2x1bWUgYXMgcHJlY2F1dGlvbikuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgLXYgZmlsZXNyYyBsb2NhdGlvbj1tdXNpYy5vZ2cgISBkZWNvZGViaW4gISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgb3NzNHNpbmsKKyAqIF18IHdpbGwgcGxheSBhbiBPZ2cvVm9yYmlzIGF1ZGlvIGZpbGUgYW5kIG91dHB1dCBpdCB1c2luZyB0aGUgT3BlbiBTb3VuZCBTeXN0ZW0KKyAqIHZlcnNpb24gNC4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL3N0cmVhbXZvbHVtZS5oPgorCisjZGVmaW5lIE5PX0xFR0FDWV9NSVhFUgorI2luY2x1ZGUgIm9zczQtYXVkaW8uaCIKKyNpbmNsdWRlICJvc3M0LXNpbmsuaCIKKyNpbmNsdWRlICJvc3M0LXByb3BlcnR5LXByb2JlLmgiCisjaW5jbHVkZSAib3NzNC1zb3VuZGNhcmQuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX0VYVEVSTiAob3NzNHNpbmtfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgb3NzNHNpbmtfZGVidWcKKworc3RhdGljIHZvaWQgZ3N0X29zczRfc2lua19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyB2b2lkIGdzdF9vc3M0X3NpbmtfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpOworCitzdGF0aWMgdm9pZCBnc3Rfb3NzNF9zaW5rX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9vc3M0X3Npbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0Q2FwcyAqZ3N0X29zczRfc2lua19nZXRjYXBzIChHc3RCYXNlU2luayAqIGJzaW5rLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3NzNF9zaW5rX29wZW4gKEdzdEF1ZGlvU2luayAqIGFzaW5rLAorICAgIGdib29sZWFuIHNpbGVudF9lcnJvcnMpOworc3RhdGljIGdib29sZWFuIGdzdF9vc3M0X3Npbmtfb3Blbl9mdW5jIChHc3RBdWRpb1NpbmsgKiBhc2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zczRfc2lua19jbG9zZSAoR3N0QXVkaW9TaW5rICogYXNpbmspOworc3RhdGljIGdib29sZWFuIGdzdF9vc3M0X3NpbmtfcHJlcGFyZSAoR3N0QXVkaW9TaW5rICogYXNpbmssCisgICAgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpOworc3RhdGljIGdib29sZWFuIGdzdF9vc3M0X3NpbmtfdW5wcmVwYXJlIChHc3RBdWRpb1NpbmsgKiBhc2luayk7CitzdGF0aWMgZ2ludCBnc3Rfb3NzNF9zaW5rX3dyaXRlIChHc3RBdWRpb1NpbmsgKiBhc2luaywgZ3BvaW50ZXIgZGF0YSwKKyAgICBndWludCBsZW5ndGgpOworc3RhdGljIGd1aW50IGdzdF9vc3M0X3NpbmtfZGVsYXkgKEdzdEF1ZGlvU2luayAqIGFzaW5rKTsKK3N0YXRpYyB2b2lkIGdzdF9vc3M0X3NpbmtfcmVzZXQgKEdzdEF1ZGlvU2luayAqIGFzaW5rKTsKKworI2RlZmluZSBERUZBVUxUX0RFVklDRSAgICAgIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9ERVZJQ0VfTkFNRSBOVUxMCisjZGVmaW5lIERFRkFVTFRfTVVURSAgICAgICAgRkFMU0UKKyNkZWZpbmUgREVGQVVMVF9WT0xVTUUgICAgICAxLjAKKyNkZWZpbmUgTUFYX1ZPTFVNRSAgICAgICAgICAxMC4wCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBQUk9QX0RFVklDRSwKKyAgUFJPUF9ERVZJQ0VfTkFNRSwKKyAgUFJPUF9WT0xVTUUsCisgIFBST1BfTVVURSwKKyAgUFJPUF9MQVNUCit9OworCisjZGVmaW5lIGdzdF9vc3M0X3NpbmtfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdE9zczRTaW5rLCBnc3Rfb3NzNF9zaW5rLAorICAgIEdTVF9UWVBFX0FVRElPX1NJTkssIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfU1RSRUFNX1ZPTFVNRSwgTlVMTCkpOworCitzdGF0aWMgdm9pZAorZ3N0X29zczRfc2lua19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RPc3M0U2luayAqb3Nzc2luayA9IEdTVF9PU1M0X1NJTksgKG9iamVjdCk7CisKKyAgaWYgKG9zc3NpbmstPnByb2JlZF9jYXBzKSB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKG9zc3NpbmstPnByb2JlZF9jYXBzKTsKKyAgICBvc3NzaW5rLT5wcm9iZWRfY2FwcyA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3M0X3NpbmtfY2xhc3NfaW5pdCAoR3N0T3NzNFNpbmtDbGFzcyAqIGtsYXNzKQoreworICBHc3RBdWRpb1NpbmtDbGFzcyAqYXVkaW9zaW5rX2NsYXNzID0gKEdzdEF1ZGlvU2lua0NsYXNzICopIGtsYXNzOworICBHc3RCYXNlU2lua0NsYXNzICpiYXNlc2lua19jbGFzcyA9IChHc3RCYXNlU2lua0NsYXNzICopIGtsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBHc3RQYWRUZW1wbGF0ZSAqdGVtcGw7CisKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9vc3M0X3NpbmtfZGlzcG9zZTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3Rfb3NzNF9zaW5rX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfb3NzNF9zaW5rX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X29zczRfc2lua19zZXRfcHJvcGVydHk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ERVZJQ0UsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZGV2aWNlIiwgIkRldmljZSIsCisgICAgICAgICAgIk9TUzQgZGV2aWNlIChlLmcuIC9kZXYvb3NzL2hkYXVkaW8wL3BjbTAgb3IgL2Rldi9kc3BOKSAiCisgICAgICAgICAgIihOVUxMID0gdXNlIGZpcnN0IGF2YWlsYWJsZSBwbGF5YmFjayBkZXZpY2UpIiwKKyAgICAgICAgICBERUZBVUxUX0RFVklDRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ERVZJQ0VfTkFNRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJkZXZpY2UtbmFtZSIsICJEZXZpY2UgbmFtZSIsCisgICAgICAgICAgIkh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIHNvdW5kIGRldmljZSIsIERFRkFVTFRfREVWSUNFX05BTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9WT0xVTUUsCisgICAgICBnX3BhcmFtX3NwZWNfZG91YmxlICgidm9sdW1lIiwgIlZvbHVtZSIsCisgICAgICAgICAgIkxpbmVhciB2b2x1bWUgb2YgdGhpcyBzdHJlYW0sIDEuMD0xMDAlIiwgMC4wLCBNQVhfVk9MVU1FLAorICAgICAgICAgIERFRkFVTFRfVk9MVU1FLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9NVVRFLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJtdXRlIiwgIk11dGUiLAorICAgICAgICAgICJNdXRlIHN0YXRlIG9mIHRoaXMgc3RyZWFtIiwgREVGQVVMVF9NVVRFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGJhc2VzaW5rX2NsYXNzLT5nZXRfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzNF9zaW5rX2dldGNhcHMpOworCisgIGF1ZGlvc2lua19jbGFzcy0+b3BlbiA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzNF9zaW5rX29wZW5fZnVuYyk7CisgIGF1ZGlvc2lua19jbGFzcy0+Y2xvc2UgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zczRfc2lua19jbG9zZSk7CisgIGF1ZGlvc2lua19jbGFzcy0+cHJlcGFyZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzNF9zaW5rX3ByZXBhcmUpOworICBhdWRpb3NpbmtfY2xhc3MtPnVucHJlcGFyZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzNF9zaW5rX3VucHJlcGFyZSk7CisgIGF1ZGlvc2lua19jbGFzcy0+d3JpdGUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zczRfc2lua193cml0ZSk7CisgIGF1ZGlvc2lua19jbGFzcy0+ZGVsYXkgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zczRfc2lua19kZWxheSk7CisgIGF1ZGlvc2lua19jbGFzcy0+cmVzZXQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zczRfc2lua19yZXNldCk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJPU1MgdjQgQXVkaW8gU2luayIsICJTaW5rL0F1ZGlvIiwKKyAgICAgICJPdXRwdXQgdG8gYSBzb3VuZCBjYXJkIHZpYSBPU1MgdmVyc2lvbiA0IiwKKyAgICAgICJUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PiIpOworCisgIHRlbXBsID0gZ3N0X3BhZF90ZW1wbGF0ZV9uZXcgKCJzaW5rIiwgR1NUX1BBRF9TSU5LLCBHU1RfUEFEX0FMV0FZUywKKyAgICAgIGdzdF9vc3M0X2F1ZGlvX2dldF90ZW1wbGF0ZV9jYXBzICgpKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZ3N0ZWxlbWVudF9jbGFzcywgdGVtcGwpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zczRfc2lua19pbml0IChHc3RPc3M0U2luayAqIG9zc3NpbmspCit7CisgIGNvbnN0IGdjaGFyICpkZXZpY2U7CisKKyAgZGV2aWNlID0gZ19nZXRlbnYgKCJBVURJT0RFViIpOworICBpZiAoZGV2aWNlID09IE5VTEwpCisgICAgZGV2aWNlID0gREVGQVVMVF9ERVZJQ0U7CisgIG9zc3NpbmstPmRldmljZSA9IGdfc3RyZHVwIChkZXZpY2UpOworICBvc3NzaW5rLT5mZCA9IC0xOworICBvc3NzaW5rLT5ieXRlc19wZXJfc2FtcGxlID0gMDsKKyAgb3Nzc2luay0+cHJvYmVkX2NhcHMgPSBOVUxMOworICBvc3NzaW5rLT5kZXZpY2VfbmFtZSA9IE5VTEw7CisgIG9zc3NpbmstPm11dGVfdm9sdW1lID0gMTAwIHwgKDEwMCA8PCA4KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3M0X3NpbmtfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdE9zczRTaW5rICpvc3NzaW5rID0gR1NUX09TUzRfU0lOSyAob2JqZWN0KTsKKworICBnX2ZyZWUgKG9zc3NpbmstPmRldmljZSk7CisgIG9zc3NpbmstPmRldmljZSA9IE5VTEw7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zczRfc2lua19zZXRfdm9sdW1lIChHc3RPc3M0U2luayAqIG9zcywgZ2RvdWJsZSB2b2x1bWUpCit7CisgIGludCBpdm9sOworCisgIHZvbHVtZSA9IHZvbHVtZSAqIDEwMC4wOworICBpdm9sID0gKGludCkgdm9sdW1lIHwgKChpbnQpIHZvbHVtZSA8PCA4KTsKKyAgR1NUX09CSkVDVF9MT0NLIChvc3MpOworICBpZiAoaW9jdGwgKG9zcy0+ZmQsIFNORENUTF9EU1BfU0VUUExBWVZPTCwgJml2b2wpIDwgMCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChvc3MsICJTRVRQTEFZVk9MIGZhaWxlZCIpOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChvc3MpOworfQorCitzdGF0aWMgZ2RvdWJsZQorZ3N0X29zczRfc2lua19nZXRfdm9sdW1lIChHc3RPc3M0U2luayAqIG9zcykKK3sKKyAgaW50IGl2b2wsIGx2b2wsIHJ2b2w7CisgIGdkb3VibGUgZHZvbCA9IERFRkFVTFRfVk9MVU1FOworCisgIEdTVF9PQkpFQ1RfTE9DSyAob3NzKTsKKyAgaWYgKGlvY3RsIChvc3MtPmZkLCBTTkRDVExfRFNQX0dFVFBMQVlWT0wsICZpdm9sKSA8IDApIHsKKyAgICBHU1RfTE9HX09CSkVDVCAob3NzLCAiR0VUUExBWVZPTCBmYWlsZWQiKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBSZXR1cm4gdGhlIGhpZ2hlciBvZiB0aGUgdHdvIHZvbHVtZSBjaGFubmVscywgaWYgZGlmZmVyZW50ICovCisgICAgbHZvbCA9IGl2b2wgJiAweGZmOworICAgIHJ2b2wgPSAoaXZvbCA+PiA4KSAmIDB4ZmY7CisgICAgZHZvbCA9IE1BWCAobHZvbCwgcnZvbCkgLyAxMDAuMDsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAob3NzKTsKKworICByZXR1cm4gZHZvbDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3M0X3Npbmtfc2V0X211dGUgKEdzdE9zczRTaW5rICogb3NzLCBnYm9vbGVhbiBtdXRlKQoreworICBpbnQgaXZvbDsKKworICBpZiAobXV0ZSkgeworICAgIC8qCisgICAgICogT1NTdjQgZG9lcyBub3QgaGF2ZSBhIHBlci1jaGFubmVsIG11dGUsIHNvIHNpbXVsYXRlIGJ5IHNldHRpbmcKKyAgICAgKiB0aGUgdmFsdWUgdG8gMC4gIFNhdmUgdGhlIHZvbHVtZSBiZWZvcmUgZG9pbmcgYSBtdXRlIHNvIHdlIGNhbgorICAgICAqIHJlc2V0IHRoZSB2YWx1ZSB3aGVuIHRoZSB1c2VyIHVuLW11dGVzLgorICAgICAqLworICAgIGl2b2wgPSAwOworCisgICAgR1NUX09CSkVDVF9MT0NLIChvc3MpOworICAgIGlmIChpb2N0bCAob3NzLT5mZCwgU05EQ1RMX0RTUF9HRVRQTEFZVk9MLCAmb3NzLT5tdXRlX3ZvbHVtZSkgPCAwKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAob3NzLCAiR0VUUExBWVZPTCBmYWlsZWQiKTsKKyAgICB9CisgICAgaWYgKGlvY3RsIChvc3MtPmZkLCBTTkRDVExfRFNQX1NFVFBMQVlWT0wsICZpdm9sKSA8IDApIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChvc3MsICJTRVRQTEFZVk9MIGZhaWxlZCIpOworICAgIH0KKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAob3NzKTsKKyAgfSBlbHNlIHsKKyAgICAvKgorICAgICAqIElmIHRoZSBzYXZlZCB2b2x1bWUgaXMgMCwgdGhlbiByZXNldCBpdCB0byAxMDAuICBPdGhlcndpc2UgdGhlIG11dGUKKyAgICAgKiBjYW4gZ2V0IHN0dWNrLiAgVGhpcyBjYW4gaGFwcGVuLCBmb3IgZXhhbXBsZSwgZHVlIHRvIHJvdW5kaW5nCisgICAgICogZXJyb3JzIGluIGNvbnZlcnRpbmcgZnJvbSB0aGUgZmxvYXQgdG8gYW4gaW50ZWdlci4KKyAgICAgKi8KKyAgICBpZiAob3NzLT5tdXRlX3ZvbHVtZSA9PSAwKSB7CisgICAgICBvc3MtPm11dGVfdm9sdW1lID0gMTAwIHwgKDEwMCA8PCA4KTsKKyAgICB9CisgICAgR1NUX09CSkVDVF9MT0NLIChvc3MpOworICAgIGlmIChpb2N0bCAob3NzLT5mZCwgU05EQ1RMX0RTUF9TRVRQTEFZVk9MLCAmb3NzLT5tdXRlX3ZvbHVtZSkgPCAwKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAob3NzLCAiU0VUUExBWVZPTCBmYWlsZWQiKTsKKyAgICB9CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKG9zcyk7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3NzNF9zaW5rX2dldF9tdXRlIChHc3RPc3M0U2luayAqIG9zcykKK3sKKyAgaW50IGl2b2wsIGx2b2wsIHJ2b2w7CisKKyAgR1NUX09CSkVDVF9MT0NLIChvc3MpOworICBpZiAoaW9jdGwgKG9zcy0+ZmQsIFNORENUTF9EU1BfR0VUUExBWVZPTCwgJml2b2wpIDwgMCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChvc3MsICJHRVRQTEFZVk9MIGZhaWxlZCIpOworICAgIGx2b2wgPSBydm9sID0gMTAwOworICB9IGVsc2UgeworICAgIGx2b2wgPSBpdm9sICYgMHhmZjsKKyAgICBydm9sID0gKGl2b2wgPj4gOCkgJiAweGZmOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChvc3MpOworCisgIHJldHVybiAobHZvbCA9PSAwICYmIHJ2b2wgPT0gMCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzNF9zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RPc3M0U2luayAqb3NzID0gR1NUX09TUzRfU0lOSyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfREVWSUNFOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChvc3MpOworICAgICAgaWYgKG9zcy0+ZmQgPT0gLTEpIHsKKyAgICAgICAgZ19mcmVlIChvc3MtPmRldmljZSk7CisgICAgICAgIG9zcy0+ZGV2aWNlID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICAgIGlmIChvc3MtPnByb2JlZF9jYXBzKSB7CisgICAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKG9zcy0+cHJvYmVkX2NhcHMpOworICAgICAgICAgIG9zcy0+cHJvYmVkX2NhcHMgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGdfZnJlZSAob3NzLT5kZXZpY2VfbmFtZSk7CisgICAgICAgIG9zcy0+ZGV2aWNlX25hbWUgPSBOVUxMOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ193YXJuaW5nICgiJXM6IGNhbid0IGNoYW5nZSBcImRldmljZVwiIHByb3BlcnR5IHdoaWxlIGF1ZGlvIHNpbmsgIgorICAgICAgICAgICAgImlzIG9wZW4iLCBHU1RfT0JKRUNUX05BTUUgKG9zcykpOworICAgICAgfQorICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKG9zcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVk9MVU1FOgorICAgICAgZ3N0X29zczRfc2lua19zZXRfdm9sdW1lIChvc3MsIGdfdmFsdWVfZ2V0X2RvdWJsZSAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NVVRFOgorICAgICAgZ3N0X29zczRfc2lua19zZXRfbXV0ZSAob3NzLCBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X29zczRfc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0T3NzNFNpbmsgKm9zcyA9IEdTVF9PU1M0X1NJTksgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFVklDRToKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAob3NzKTsKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIG9zcy0+ZGV2aWNlKTsKKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChvc3MpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0RFVklDRV9OQU1FOgorICAgICAgR1NUX09CSkVDVF9MT0NLIChvc3MpOworICAgICAgaWYgKG9zcy0+ZmQgPT0gLTEgJiYgb3NzLT5kZXZpY2UgIT0gTlVMTCkgeworICAgICAgICAvKiBJZiBkZXZpY2UgaXMgc2V0LCB0cnkgdG8gcmV0cmlldmUgdGhlIG5hbWUgZXZlbiBpZiB3ZSdyZSBub3Qgb3BlbiAqLworICAgICAgICBpZiAoZ3N0X29zczRfc2lua19vcGVuIChHU1RfQVVESU9fU0lOSyAob3NzKSwgVFJVRSkpIHsKKyAgICAgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBvc3MtPmRldmljZV9uYW1lKTsKKyAgICAgICAgICBnc3Rfb3NzNF9zaW5rX2Nsb3NlIChHU1RfQVVESU9fU0lOSyAob3NzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ2NoYXIgKm5hbWUgPSBOVUxMOworCisgICAgICAgICAgZ3N0X29zczRfcHJvcGVydHlfcHJvYmVfZmluZF9kZXZpY2VfbmFtZV9ub2ZkIChHU1RfT0JKRUNUIChvc3MpLAorICAgICAgICAgICAgICBvc3MtPmRldmljZSwgJm5hbWUpOworICAgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIG5hbWUpOworICAgICAgICAgIGdfZnJlZSAobmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIG9zcy0+ZGV2aWNlX25hbWUpOworICAgICAgfQorICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKG9zcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVk9MVU1FOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgZ3N0X29zczRfc2lua19nZXRfdm9sdW1lIChvc3MpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9NVVRFOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIGdzdF9vc3M0X3NpbmtfZ2V0X211dGUgKG9zcykpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3Rfb3NzNF9zaW5rX2dldGNhcHMgKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdE9zczRTaW5rICpvc3M7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgb3NzID0gR1NUX09TUzRfU0lOSyAoYnNpbmspOworCisgIGlmIChvc3MtPmZkID09IC0xKSB7CisgICAgY2FwcyA9IGdzdF9vc3M0X2F1ZGlvX2dldF90ZW1wbGF0ZV9jYXBzICgpOworICB9IGVsc2UgaWYgKG9zcy0+cHJvYmVkX2NhcHMpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfY29weSAob3NzLT5wcm9iZWRfY2Fwcyk7CisgIH0gZWxzZSB7CisgICAgY2FwcyA9IGdzdF9vc3M0X2F1ZGlvX3Byb2JlX2NhcHMgKEdTVF9PQkpFQ1QgKG9zcyksIG9zcy0+ZmQpOworICAgIGlmIChjYXBzICE9IE5VTEwgJiYgIWdzdF9jYXBzX2lzX2VtcHR5IChjYXBzKSkgeworICAgICAgb3NzLT5wcm9iZWRfY2FwcyA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworICAgIH0KKyAgfQorCisgIGlmIChmaWx0ZXIgJiYgY2FwcykgeworICAgIEdzdENhcHMgKmludGVyc2VjdGlvbjsKKworICAgIGludGVyc2VjdGlvbiA9CisgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIGNhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIHJldHVybiBpbnRlcnNlY3Rpb247CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGNhcHM7CisgIH0KK30KKworLyogbm90ZTogd2UgbXVzdCBub3QgdGFrZSB0aGUgb2JqZWN0IGxvY2sgaGVyZSB1bmxlc3Mgd2UgZml4IHVwIGdldF9wcm9wZXJ0eSAqLworc3RhdGljIGdib29sZWFuCitnc3Rfb3NzNF9zaW5rX29wZW4gKEdzdEF1ZGlvU2luayAqIGFzaW5rLCBnYm9vbGVhbiBzaWxlbnRfZXJyb3JzKQoreworICBHc3RPc3M0U2luayAqb3NzOworICBnY2hhciAqZGV2aWNlOworICBpbnQgbW9kZTsKKworICBvc3MgPSBHU1RfT1NTNF9TSU5LIChhc2luayk7CisKKyAgaWYgKG9zcy0+ZGV2aWNlKQorICAgIGRldmljZSA9IGdfc3RyZHVwIChvc3MtPmRldmljZSk7CisgIGVsc2UKKyAgICBkZXZpY2UgPSBnc3Rfb3NzNF9hdWRpb19maW5kX2RldmljZSAoR1NUX09CSkVDVF9DQVNUIChvc3MpKTsKKworICAvKiBkZXNwZXJhdGUgdGltZXMsIGRlc3BlcmF0ZSBtZWFzdXJlcyAqLworICBpZiAoZGV2aWNlID09IE5VTEwpCisgICAgZGV2aWNlID0gZ19zdHJkdXAgKCIvZGV2L2RzcDAiKTsKKworICBHU1RfSU5GT19PQkpFQ1QgKG9zcywgIlRyeWluZyB0byBvcGVuIE9TUzQgZGV2aWNlICclcyciLCBkZXZpY2UpOworCisgIC8qIHdlIG9wZW4gaW4gbm9uLWJsb2NraW5nIG1vZGUgZXZlbiBpZiB3ZSBkb24ndCByZWFsbHkgd2FudCB0byBkbyB3cml0ZXMKKyAgICogbm9uLWJsb2NraW5nIGJlY2F1c2Ugd2UgY2FuJ3QgYmUgc3VyZSB0aGF0IHRoaXMgaXMgcmVhbGx5IGEgZ2VudWluZQorICAgKiBPU1M0IGRldmljZSB3aXRoIHdlbGwtYmVoYXZlZCBkcml2ZXJzIGV0Yy4gV2UgcmVhbGx5IGRvbid0IHdhbnQgdG8KKyAgICogaGFuZyBmb3JldmVyIHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLiAqLworICBvc3MtPmZkID0gb3BlbiAoZGV2aWNlLCBPX1dST05MWSB8IE9fTk9OQkxPQ0ssIDApOworICBpZiAob3NzLT5mZCA9PSAtMSkgeworICAgIHN3aXRjaCAoZXJybm8pIHsKKyAgICAgIGNhc2UgRUJVU1k6CisgICAgICAgIGdvdG8gYnVzeTsKKyAgICAgIGNhc2UgRUFDQ0VTOgorICAgICAgICBnb3RvIG5vX3Blcm1pc3Npb247CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIG9wZW5fZmFpbGVkOworICAgIH0KKyAgfQorCisgIEdTVF9JTkZPX09CSkVDVCAob3NzLCAiT3BlbmVkIGRldmljZSAnJXMnIiwgZGV2aWNlKTsKKworICAvKiBNYWtlIHN1cmUgaXQncyBPU1M0LiBJZiBpdCdzIG9sZCBPU1MsIGxldCBvc3NzaW5rIGhhbmRsZSBpdCAqLworICBpZiAoIWdzdF9vc3M0X2F1ZGlvX2NoZWNrX3ZlcnNpb24gKEdTVF9PQkpFQ1RfQ0FTVCAob3NzKSwgb3NzLT5mZCkpCisgICAgZ290byBsZWdhY3lfb3NzOworCisgIC8qIG5vdyByZW1vdmUgdGhlIG5vbi1ibG9ja2luZyBmbGFnLiAqLworICBtb2RlID0gZmNudGwgKG9zcy0+ZmQsIEZfR0VURkwpOworICBtb2RlICY9IH5PX05PTkJMT0NLOworICBpZiAoZmNudGwgKG9zcy0+ZmQsIEZfU0VURkwsIG1vZGUpIDwgMCkgeworICAgIC8qIHNvbWUgZHJpdmVycyBkbyBubyBzdXBwb3J0IHVuc2V0dGluZyB0aGUgbm9uLWJsb2NraW5nIGZsYWcsIHRyeSB0bworICAgICAqIGNsb3NlL29wZW4gdGhlIGRldmljZSB0aGVuLiBUaGlzIGlzIHJhY3kgYnV0IHdlIGVycm9yIG91dCBwcm9wZXJseS4gKi8KKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG9zcywgImZhaWxlZCB0byB1bnNldCBPX05PTkJMT0NLIChidWdneSBkcml2ZXI/KSwgIgorICAgICAgICAid2lsbCB0cnkgdG8gcmUtb3BlbiBkZXZpY2Ugbm93Iik7CisgICAgZ3N0X29zczRfc2lua19jbG9zZSAoYXNpbmspOworICAgIGlmICgob3NzLT5mZCA9IG9wZW4gKGRldmljZSwgT19XUk9OTFksIDApKSA9PSAtMSkKKyAgICAgIGdvdG8gbm9uX2Jsb2NrOworICB9CisKKyAgb3NzLT5vcGVuX2RldmljZSA9IGRldmljZTsKKworICAvKiBub3QgdXNpbmcgRU5HSU5FSU5GTyBoZXJlIGJlY2F1c2UgaXQgc29tZXRpbWVzIHJldHVybnMgYSBkaWZmZXJlbnQgYW5kCisgICAqIGxlc3MgdXNlZnVsIG5hbWUgdGhhbiBBVURJT0lORk8gZm9yIHRoZSBzYW1lIGRldmljZSAqLworICBpZiAoIWdzdF9vc3M0X3Byb3BlcnR5X3Byb2JlX2ZpbmRfZGV2aWNlX25hbWUgKEdTVF9PQkpFQ1QgKG9zcyksIG9zcy0+ZmQsCisgICAgICAgICAgb3NzLT5vcGVuX2RldmljZSwgJm9zcy0+ZGV2aWNlX25hbWUpKSB7CisgICAgb3NzLT5kZXZpY2VfbmFtZSA9IE5VTEw7CisgIH0KKworICAvKiBsaXN0IG91dHB1dCByb3V0aW5ncywgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBzbyBmYXIgKi8KKyAgeworICAgIG9zc19taXhlcl9lbnVtaW5mbyByb3V0aW5ncyA9IHsgMCwgfTsKKyAgICBndWludCBpOworCisgICAgaWYgKGlvY3RsIChvc3MtPmZkLCBTTkRDVExfRFNQX0dFVF9QTEFZVEdUX05BTUVTLCAmcm91dGluZ3MpICE9IC0xKSB7CisgICAgICBHU1RfTE9HX09CSkVDVCAob3NzLCAiJXUgb3V0cHV0IHJvdXRpbmdzIChzdGF0aWMgbGlzdDogJWQpIiwKKyAgICAgICAgICByb3V0aW5ncy5udmFsdWVzLCAhICEocm91dGluZ3MudmVyc2lvbiA9PSAwKSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgcm91dGluZ3MubnZhbHVlczsgKytpKSB7CisgICAgICAgIEdTVF9MT0dfT0JKRUNUIChvc3MsICIgIG91dHB1dCByb3V0aW5nICVkOiAlcyIsIGksCisgICAgICAgICAgICAmcm91dGluZ3Muc3RyaW5nc1tyb3V0aW5ncy5zdHJpbmRleFtpXV0pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworYnVzeToKKyAgeworICAgIGlmICghc2lsZW50X2Vycm9ycykgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9zcywgUkVTT1VSQ0UsIEJVU1ksCisgICAgICAgICAgKF8oIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suICIKKyAgICAgICAgICAgICAgICAgICJEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyIGFwcGxpY2F0aW9uLiIpKSwgKE5VTEwpKTsKKyAgICB9CisgICAgZ19mcmVlIChkZXZpY2UpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fcGVybWlzc2lvbjoKKyAgeworICAgIGlmICghc2lsZW50X2Vycm9ycykgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9zcywgUkVTT1VSQ0UsIE9QRU5fV1JJVEUsCisgICAgICAgICAgKF8oIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suICIKKyAgICAgICAgICAgICAgICAgICJZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gdGhlIGRldmljZS4iKSksCisgICAgICAgICAgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgfQorICAgIGdfZnJlZSAoZGV2aWNlKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK29wZW5fZmFpbGVkOgorICB7CisgICAgaWYgKCFzaWxlbnRfZXJyb3JzKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3NzLCBSRVNPVVJDRSwgT1BFTl9XUklURSwKKyAgICAgICAgICAoXygiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4iKSksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIH0KKyAgICBnX2ZyZWUgKGRldmljZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitsZWdhY3lfb3NzOgorICB7CisgICAgaWYgKCFzaWxlbnRfZXJyb3JzKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3NzLCBSRVNPVVJDRSwgT1BFTl9XUklURSwKKyAgICAgICAgICAoXygiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gIgorICAgICAgICAgICAgICAgICAgIlRoaXMgdmVyc2lvbiBvZiB0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzICIKKyAgICAgICAgICAgICAgICAgICJlbGVtZW50LiIpKSwgKCJUcnkgdGhlICdvc3NzaW5rJyBlbGVtZW50IGluc3RlYWQiKSk7CisgICAgfQorICAgIGdzdF9vc3M0X3NpbmtfY2xvc2UgKGFzaW5rKTsKKyAgICBnX2ZyZWUgKGRldmljZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub25fYmxvY2s6CisgIHsKKyAgICBpZiAoIXNpbGVudF9lcnJvcnMpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvc3MsIFJFU09VUkNFLCBTRVRUSU5HUywgKE5VTEwpLAorICAgICAgICAgICgiVW5hYmxlIHRvIHNldCBkZXZpY2UgJXMgaW50byBub24tYmxvY2tpbmcgbW9kZTogJXMiLAorICAgICAgICAgICAgICBvc3MtPmRldmljZSwgZ19zdHJlcnJvciAoZXJybm8pKSk7CisgICAgfQorICAgIGdfZnJlZSAoZGV2aWNlKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3NzNF9zaW5rX29wZW5fZnVuYyAoR3N0QXVkaW9TaW5rICogYXNpbmspCit7CisgIGlmICghZ3N0X29zczRfc2lua19vcGVuIChhc2luaywgRkFMU0UpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiB0aGUgaW5pdGlhbCB2b2x1bWUgbWlnaHQgbm90IGJlIHRoZSBwcm9wZXJ0eSBkZWZhdWx0LCBzbyBub3RpZnkKKyAgICogYXBwbGljYXRpb24gdG8gbWFrZSBpdCBnZXQgYSByZWFkaW5nIG9mIHRoZSBjdXJyZW50IHZvbHVtZSAqLworICBnX29iamVjdF9ub3RpZnkgKEdfT0JKRUNUIChhc2luayksICJ2b2x1bWUiKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zczRfc2lua19jbG9zZSAoR3N0QXVkaW9TaW5rICogYXNpbmspCit7CisgIEdzdE9zczRTaW5rICpvc3MgPSBHU1RfT1NTNF9TSU5LIChhc2luayk7CisKKyAgaWYgKG9zcy0+ZmQgIT0gLTEpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChvc3MsICJjbG9zaW5nIGRldmljZSIpOworICAgIGNsb3NlIChvc3MtPmZkKTsKKyAgICBvc3MtPmZkID0gLTE7CisgIH0KKworICBvc3MtPmJ5dGVzX3Blcl9zYW1wbGUgPSAwOworICAvKiB3ZSBrZWVwIHRoZSBwcm9iZWQgY2FwcyBjYWNoZWQsIGF0IGxlYXN0IHVudGlsIHRoZSBkZXZpY2UgY2hhbmdlcyAqLworCisgIGdfZnJlZSAob3NzLT5vcGVuX2RldmljZSk7CisgIG9zcy0+b3Blbl9kZXZpY2UgPSBOVUxMOworCisgIGdfZnJlZSAob3NzLT5kZXZpY2VfbmFtZSk7CisgIG9zcy0+ZGV2aWNlX25hbWUgPSBOVUxMOworCisgIGlmIChvc3MtPnByb2JlZF9jYXBzKSB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKG9zcy0+cHJvYmVkX2NhcHMpOworICAgIG9zcy0+cHJvYmVkX2NhcHMgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zczRfc2lua19wcmVwYXJlIChHc3RBdWRpb1NpbmsgKiBhc2luaywgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpCit7CisgIEdzdE9zczRTaW5rICpvc3M7CisKKyAgb3NzID0gR1NUX09TUzRfU0lOSyAoYXNpbmspOworCisgIGlmICghZ3N0X29zczRfYXVkaW9fc2V0X2Zvcm1hdCAoR1NUX09CSkVDVF9DQVNUIChvc3MpLCBvc3MtPmZkLCBzcGVjKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAob3NzLCAiQ291bGRuJ3Qgc2V0IHJlcXVlc3RlZCBmb3JtYXQgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgIHNwZWMtPmNhcHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIG9zcy0+Ynl0ZXNfcGVyX3NhbXBsZSA9IEdTVF9BVURJT19JTkZPX0JQRiAoJnNwZWMtPmluZm8pOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3M0X3NpbmtfdW5wcmVwYXJlIChHc3RBdWRpb1NpbmsgKiBhc2luaykKK3sKKyAgLyogY291bGQgZG8gYSBTTkRDVExfRFNQX0hBTFQsIGJ1dCB0aGUgT1NTIG1hbnVhbCByZWNvbW1lbmRzIGEgY2xvc2Uvb3BlbiwKKyAgICogc2luY2UgSEFMVCB3b24ndCBwcm9wZXJseSByZXNldCBzb21lIGRldmljZXMsIGFwcGFyZW50bHkgKi8KKworICBpZiAoIWdzdF9vc3M0X3NpbmtfY2xvc2UgKGFzaW5rKSkKKyAgICBnb3RvIGNvdWxkbnRfY2xvc2U7CisKKyAgaWYgKCFnc3Rfb3NzNF9zaW5rX29wZW5fZnVuYyAoYXNpbmspKQorICAgIGdvdG8gY291bGRudF9yZW9wZW47CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitjb3VsZG50X2Nsb3NlOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYXNpbmssICJDb3VsZG4ndCBjbG9zZSB0aGUgYXVkaW8gZGV2aWNlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citjb3VsZG50X3Jlb3BlbjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFzaW5rLCAiQ291bGRuJ3QgcmVvcGVuIHRoZSBhdWRpbyBkZXZpY2UiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdpbnQKK2dzdF9vc3M0X3Npbmtfd3JpdGUgKEdzdEF1ZGlvU2luayAqIGFzaW5rLCBncG9pbnRlciBkYXRhLCBndWludCBsZW5ndGgpCit7CisgIEdzdE9zczRTaW5rICpvc3M7CisgIGludCBuOworCisgIG9zcyA9IEdTVF9PU1M0X1NJTktfQ0FTVCAoYXNpbmspOworCisgIG4gPSB3cml0ZSAob3NzLT5mZCwgZGF0YSwgbGVuZ3RoKTsKKyAgR1NUX0xPR19PQkpFQ1QgKGFzaW5rLCAid3JvdGUgJWQvJWQgc2FtcGxlcywgJWQgYnl0ZXMiLAorICAgICAgbiAvIG9zcy0+Ynl0ZXNfcGVyX3NhbXBsZSwgbGVuZ3RoIC8gb3NzLT5ieXRlc19wZXJfc2FtcGxlLCBuKTsKKworICBpZiAoR19VTkxJS0VMWSAobiA8IDApKSB7CisgICAgc3dpdGNoIChlcnJubykgeworICAgICAgY2FzZSBFTk9UU1VQOgorICAgICAgY2FzZSBFQUNDRVM6eworICAgICAgICAvKiBUaGlzIGlzIHRoZSBtb3N0IGxpa2VseSBjYXVzZSwgSSB0aGluayAqLworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoYXNpbmssIFJFU09VUkNFLCBXUklURSwKKyAgICAgICAgICAgIChfKCJQbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIpKSwKKyAgICAgICAgICAgICgid3JpdGU6ICVzIChkZXZpY2U6ICVzKSAobWF5YmUgdGhpcyBpcyBhbiBpbnB1dC1vbmx5IGRldmljZT8pIiwKKyAgICAgICAgICAgICAgICBnX3N0cmVycm9yIChlcnJubyksIG9zcy0+b3Blbl9kZXZpY2UpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OnsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGFzaW5rLCBSRVNPVVJDRSwgV1JJVEUsCisgICAgICAgICAgICAoXygiQXVkaW8gcGxheWJhY2sgZXJyb3IuIikpLAorICAgICAgICAgICAgKCJ3cml0ZTogJXMgKGRldmljZTogJXMpIiwgZ19zdHJlcnJvciAoZXJybm8pLCBvc3MtPm9wZW5fZGV2aWNlKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBuOworfQorCitzdGF0aWMgZ3VpbnQKK2dzdF9vc3M0X3NpbmtfZGVsYXkgKEdzdEF1ZGlvU2luayAqIGFzaW5rKQoreworICBHc3RPc3M0U2luayAqb3NzOworICBnaW50IGRlbGF5ID0gLTE7CisKKyAgb3NzID0gR1NUX09TUzRfU0lOS19DQVNUIChhc2luayk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChvc3MpOworICBpZiAoaW9jdGwgKG9zcy0+ZmQsIFNORENUTF9EU1BfR0VUT0RFTEFZLCAmZGVsYXkpIDwgMCB8fCBkZWxheSA8IDApIHsKKyAgICBHU1RfTE9HX09CSkVDVCAob3NzLCAiR0VUT0RFTEFZIGZhaWxlZCIpOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChvc3MpOworCisgIGlmIChHX1VOTElLRUxZIChkZWxheSA8IDApKSAgIC8qIGVycm9yIGNhc2UgKi8KKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gZGVsYXkgLyBvc3MtPmJ5dGVzX3Blcl9zYW1wbGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzNF9zaW5rX3Jlc2V0IChHc3RBdWRpb1NpbmsgKiBhc2luaykKK3sKKyAgLyogVGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBoZXJlIHJlYWxseTogT1NTIGNhbid0IGhhbmRsZSBhY2Nlc3MgdG8gdGhlCisgICAqIHNhbWUgZGV2aWNlL2ZkIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBhbmQgbWlnaHQgZGVhZGxvY2sgb3IgYmxvdyB1cCBpbgorICAgKiBvdGhlciB3YXlzIGlmIHdlIHRyeSBhbiBpb2N0bCBTTkRDVExfRFNQX0hBTFQgb3Igc2ltaWxhciAqLworfQpkaWZmIC0tZ2l0IGEvc3lzL29zczQvb3NzNC1zaW5rLmggYi9zeXMvb3NzNC9vc3M0LXNpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDY0NWZlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zczQvb3NzNC1zaW5rLmgKQEAgLTAsMCArMSw2MiBAQAorLyogR1N0cmVhbWVyIE9TUzQgYXVkaW8gc2luaworICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIEdTVF9PU1M0X1NJTktfSAorI2RlZmluZSBHU1RfT1NTNF9TSU5LX0gKKworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb3NpbmsuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX09TUzRfU0lOSyAgICAgICAgICAgIChnc3Rfb3NzNF9zaW5rX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9PU1M0X1NJTksob2JqKSAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9PU1M0X1NJTkssR3N0T3NzNFNpbmspKQorI2RlZmluZSBHU1RfT1NTNF9TSU5LX0NBU1Qob2JqKSAgICAgICAoKEdzdE9zczRTaW5rICopKG9iaikpCisjZGVmaW5lIEdTVF9PU1M0X1NJTktfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX09TUzRfU0lOSyxHc3RPc3M0U2lua0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX09TUzRfU0lOSyhvYmopICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX09TUzRfU0lOSykpCisjZGVmaW5lIEdTVF9JU19PU1M0X1NJTktfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX09TUzRfU0lOSykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RPc3M0U2luayBHc3RPc3M0U2luazsKK3R5cGVkZWYgc3RydWN0IF9Hc3RPc3M0U2lua0NsYXNzIEdzdE9zczRTaW5rQ2xhc3M7CisKK3N0cnVjdCBfR3N0T3NzNFNpbmsgeworICBHc3RBdWRpb1NpbmsgIGF1ZGlvX3Npbms7CisKKyAgZ2NoYXIgICAgICAgKiBkZXZpY2U7ICAgICAgICAgICAgIC8qIE5VTEwgaWYgbm9uZSB3YXMgc2V0ICAgICAgKi8KKyAgZ2NoYXIgICAgICAgKiBvcGVuX2RldmljZTsgICAgICAgIC8qIHRoZSBkZXZpY2Ugd2Ugb3BlbmVkICAgICAgKi8KKyAgZ2NoYXIgICAgICAgKiBkZXZpY2VfbmFtZTsgICAgICAgIC8qIHNldCBpZiB0aGUgZGV2aWNlIGlzIG9wZW4gKi8KKyAgZ2ludCAgICAgICAgICBmZDsgICAgICAgICAgICAgICAgIC8qIC0xIGlmIG5vdCBvcGVuICAgICAgICAgICAgKi8KKyAgZ2ludCAgICAgICAgICBieXRlc19wZXJfc2FtcGxlOworICBnaW50ICAgICAgICAgIG11dGVfdm9sdW1lOworCisgIEdzdENhcHMgICAgICogcHJvYmVkX2NhcHM7Cit9OworCitzdHJ1Y3QgX0dzdE9zczRTaW5rQ2xhc3MgeworICBHc3RBdWRpb1NpbmtDbGFzcyBhdWRpb19zaW5rX2NsYXNzOworfTsKKworR1R5cGUgIGdzdF9vc3M0X3NpbmtfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogR1NUX09TUzRfU0lOS19IICovCisKKwpkaWZmIC0tZ2l0IGEvc3lzL29zczQvb3NzNC1zb3VuZGNhcmQuaCBiL3N5cy9vc3M0L29zczQtc291bmRjYXJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxMjQ4OQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3M0L29zczQtc291bmRjYXJkLmgKQEAgLTAsMCArMSwyMDY3IEBACisvKgorICogUHVycG9zZTogVGhlIEMvQysrIGhlYWRlciBmaWxlIHRoYXQgZGVmaW5lcyB0aGUgT1NTIEFQSS4KKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyBhbGwgdGhlIGRlY2xhcmF0aW9ucyByZXF1aXJlZCB0byBjb21waWxlIE9TUworICogcHJvZ3JhbXMuIFRoZSBsYXRlc3QgdmVyc2lvbiBpcyBhbHdheXMgaW5zdGFsbGVkIHRvZ2V0aGVyIHdpdGggT1NTCisgKiB1c2Ugb2YgdGhlIGxhdGVzdCB2ZXJzaW9uIGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkLgorICoKKyAqIHshbm90aWNlIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgbWFueSBvYnNvbGV0ZSBkZWZpbml0aW9ucworICogKGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgYXBwbGljYXRpb25zIHRoYXQgc3RpbGwgbmVkIHRoZW0pLgorICogRG8gbm90IHVzZSB0aGlzIGZpbGUgYXMgYSByZWZlcmVuY2UgbWFudWFsIG9mIE9TUy4KKyAqIFBsZWFzZSBjaGVjayB0aGUgT1NTIFByb2dyYW1tZXIncyBndWlkZSBmb3IgZGVzY3JpcHRpb25zCisgKiBvZiB0aGUgc3VwcG9ydGVkIEFQSSBkZXRhaWxzIChodHRwOi8vbWFudWFscy5vcGVuc291bmQuY29tL2RldmVsb3BlcikufQorICovCisKKyNpZm5kZWYgU09VTkRDQVJEX0gKKyNkZWZpbmUgU09VTkRDQVJEX0gKKworI2RlZmluZSBDT1BZSU5HNDAgQ29weXJpZ2h0IChDKSA0RnJvbnQgVGVjaG5vbG9naWVzIDIwMDAtMjAwNi4gUmVsZWFzZWQgdW5kZXIgdGhlIEJTRCBsaWNlbnNlLgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgRVhURVJOQyBleHRlcm4gIkMiCisjZWxzZQorI2RlZmluZSBFWFRFUk5DIGV4dGVybgorI2VuZGlmIC8qIEVYVEVSTl9DX1dSQVBQRVJTICovCisKKyNkZWZpbmUgT1NTX1ZFUlNJT04JMHgwNDAwOTAgLy8gUHJlIDQuMQorCisjZGVmaW5lIFNPVU5EX1ZFUlNJT04JT1NTX1ZFUlNJT04KKyNkZWZpbmUgT1BFTl9TT1VORF9TWVNURU0KKworI2lmIGRlZmluZWQoX19ocHV4KSAmJiAhZGVmaW5lZChfSFBVWF9TT1VSQ0UpCisjCWVycm9yICItRF9IUFVYX1NPVVJDRSBtdXN0IGJlIHVzZWQgd2hlbiBjb21waWxpbmcgT1NTIGFwcGxpY2F0aW9ucyIKKyNlbmRpZgorCisjaWZkZWYgX19ocHV4CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZW5kaWYKKworI2lmZGVmIGxpbnV4CisvKiBJbiBMaW51eCB3ZSBuZWVkIHRvIGJlIHByZXBhcmVkIGZvciBjcm9zcyBjb21waWxpbmcgKi8KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2Vsc2UKKyMgaWZkZWYgX19GcmVlQlNEX18KKyMgICAgaW5jbHVkZSA8c3lzL2lvY2NvbS5oPgorIyBlbHNlCisjICAgIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX19TSU9XUgorI2lmIGRlZmluZWQoX19ocHV4KSB8fCAoZGVmaW5lZChfSU9XUikgJiYgKGRlZmluZWQoX0FJWCkgfHwgKCFkZWZpbmVkKHN1bikgJiYgIWRlZmluZWQoc3BhcmMpICYmICFkZWZpbmVkKF9fSU5DaW9jdGxoKSAmJiAhZGVmaW5lZChfX0x5bnhfXykpKSkKKworLyogCisgKiBNYWtlIHN1cmUgdGhlIGlvY3RsIG1hY3JvcyBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZSBvbmVzIGFscmVhZHkgdXNlZAorICogYnkgdGhpcyBvcGVyYXRpbmcgc3lzdGVtLgorICovCisjZGVmaW5lCVNJT0NQQVJNX01BU0sJSU9DUEFSTV9NQVNLCisjZGVmaW5lCVNJT0NfVk9JRAlJT0NfVk9JRAorI2RlZmluZQlTSU9DX09VVAlJT0NfT1VUCisjZGVmaW5lCVNJT0NfSU4JCUlPQ19JTgorI2RlZmluZQlTSU9DX0lOT1VUCUlPQ19JTk9VVAorI2RlZmluZSBfX1NJT0NfU0laRQlfSU9DX1NJWkUKKyNkZWZpbmUgX19TSU9DX0RJUglfSU9DX0RJUgorI2RlZmluZSBfX1NJT0NfTk9ORQlfSU9DX05PTkUKKyNkZWZpbmUgX19TSU9DX1JFQUQJX0lPQ19SRUFECisjZGVmaW5lIF9fU0lPQ19XUklURQlfSU9DX1dSSVRFCisjZGVmaW5lCV9fU0lPCQlfSU8KKyNkZWZpbmUJX19TSU9SCQlfSU9SCisjZGVmaW5lCV9fU0lPVwkJX0lPVworI2RlZmluZQlfX1NJT1dSCQlfSU9XUgorI2Vsc2UKKworLyogI2RlZmluZQlTSU9DVFlQRQkJKDB4ZmY8PDgpICovCisjZGVmaW5lCVNJT0NQQVJNX01BU0sJMHgxZmZmCS8qIHBhcmFtZXRlcnMgbXVzdCBiZSA8IDgxOTIgYnl0ZXMgKi8KKyNkZWZpbmUJU0lPQ19WT0lECTB4MDAwMDAwMDAJLyogbm8gcGFyYW1ldGVycyAqLworI2RlZmluZQlTSU9DX09VVAkweDIwMDAwMDAwCS8qIGNvcHkgb3V0IHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUJU0lPQ19JTgkJMHg0MDAwMDAwMAkvKiBjb3B5IGluIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUJU0lPQ19JTk9VVAkoU0lPQ19JTnxTSU9DX09VVCkKKworI2RlZmluZQlfX1NJTyh4LHkpCSgoaW50KShTSU9DX1ZPSUR8KHg8PDgpfHkpKQorI2RlZmluZQlfX1NJT1IoeCx5LHQpCSgoaW50KShTSU9DX09VVHwoKHNpemVvZih0KSZTSU9DUEFSTV9NQVNLKTw8MTYpfCh4PDw4KXx5KSkKKyNkZWZpbmUJX19TSU9XKHgseSx0KQkoKGludCkoU0lPQ19JTnwoKHNpemVvZih0KSZTSU9DUEFSTV9NQVNLKTw8MTYpfCh4PDw4KXx5KSkKKyNkZWZpbmUJX19TSU9XUih4LHksdCkJKChpbnQpKFNJT0NfSU5PVVR8KChzaXplb2YodCkmU0lPQ1BBUk1fTUFTSyk8PDE2KXwoeDw8OCl8eSkpCisjZGVmaW5lIF9fU0lPQ19TSVpFKHgpCSgoeD4+MTYpJlNJT0NQQVJNX01BU0spCisjZGVmaW5lIF9fU0lPQ19ESVIoeCkJKHggJiAweGYwMDAwMDAwKQorI2RlZmluZSBfX1NJT0NfTk9ORQlTSU9DX1ZPSUQKKyNkZWZpbmUgX19TSU9DX1JFQUQJU0lPQ19PVVQKKyNkZWZpbmUgX19TSU9DX1dSSVRFCVNJT0NfSU4KKyMgIGVuZGlmIC8qIF9JT1dSICovCisjZW5kaWYgLyogIV9fU0lPV1IgKi8KKworI2RlZmluZSBPU1NfTE9OR05BTUVfU0laRQk2NAorI2RlZmluZSBPU1NfTEFCRUxfU0laRQkJMTYKKyNkZWZpbmUgT1NTX0RFVk5PREVfU0laRQkzMgordHlwZWRlZiBjaGFyIG9zc19sb25nbmFtZV90W09TU19MT05HTkFNRV9TSVpFXTsKK3R5cGVkZWYgY2hhciBvc3NfbGFiZWxfdFtPU1NfTEFCRUxfU0laRV07Cit0eXBlZGVmIGNoYXIgb3NzX2Rldm5vZGVfdFtPU1NfREVWTk9ERV9TSVpFXTsKKworI2lmbmRlZiBESVNBQkxFX1NFUVVFTkNFUgorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJT0NUTCBDb21tYW5kcyBmb3IgL2Rldi9zZXF1ZW5jZXIgYW5kIC9kZXYvbXVzaWMgKEFLQSAvZGV2L3NlcXVlbmNlcjIpCisgKgorICogTm90ZSB0aGF0IHRoaXMgaW50ZXJmYWNlIGlzIG9ic29sZXRlIGFuZCBubyBsb25nZXIgZGV2ZWxvcGVkLiBOZXcKKyAqIGFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIC9kZXYvbWlkaSBpbnN0ZWFkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNORENUTF9TRVFfUkVTRVQJCV9fU0lPICAoJ1EnLCAwKQorI2RlZmluZSBTTkRDVExfU0VRX1NZTkMJCQlfX1NJTyAgKCdRJywgMSkKKyNkZWZpbmUgU05EQ1RMX1NZTlRIX0lORk8JCV9fU0lPV1IoJ1EnLCAyLCBzdHJ1Y3Qgc3ludGhfaW5mbykKKyNkZWZpbmUgU05EQ1RMX1NFUV9DVFJMUkFURQkJX19TSU9XUignUScsIDMsIGludCkJLyogU2V0L2dldCB0aW1lciByZXNvbHV0aW9uIChIWikgKi8KKyNkZWZpbmUgU05EQ1RMX1NFUV9HRVRPVVRDT1VOVAkJX19TSU9SICgnUScsIDQsIGludCkKKyNkZWZpbmUgU05EQ1RMX1NFUV9HRVRJTkNPVU5UCQlfX1NJT1IgKCdRJywgNSwgaW50KQorI2RlZmluZSBTTkRDVExfU0VRX1BFUkNNT0RFCQlfX1NJT1cgKCdRJywgNiwgaW50KQorI2RlZmluZSBTTkRDVExfRk1fTE9BRF9JTlNUUgkJX19TSU9XICgnUScsIDcsIHN0cnVjdCBzYmlfaW5zdHJ1bWVudCkJLyogT2Jzb2xldGUuIERvbid0IHVzZSEhISEhISAqLworI2RlZmluZSBTTkRDVExfU0VRX1RFU1RNSURJCQlfX1NJT1cgKCdRJywgOCwgaW50KQorI2RlZmluZSBTTkRDVExfU0VRX1JFU0VUU0FNUExFUwkJX19TSU9XICgnUScsIDksIGludCkKKyNkZWZpbmUgU05EQ1RMX1NFUV9OUlNZTlRIUwkJX19TSU9SICgnUScsMTAsIGludCkKKyNkZWZpbmUgU05EQ1RMX1NFUV9OUk1JRElTCQlfX1NJT1IgKCdRJywxMSwgaW50KQorI2RlZmluZSBTTkRDVExfTUlESV9JTkZPCQlfX1NJT1dSKCdRJywxMiwgc3RydWN0IG1pZGlfaW5mbykJLyogT0JTT0xFVEUgLSB1c2UgU05EQ1RMX01JRElJTkZPIGluc3RlYWQgKi8KKyNkZWZpbmUgU05EQ1RMX1NFUV9USFJFU0hPTEQJCV9fU0lPVyAoJ1EnLDEzLCBpbnQpCisjZGVmaW5lIFNORENUTF9TWU5USF9NRU1BVkwJCV9fU0lPV1IoJ1EnLDE0LCBpbnQpCS8qIGluPWRldiMsIG91dD1tZW1zaXplICovCisjZGVmaW5lIFNORENUTF9GTV80T1BfRU5BQkxFCQlfX1NJT1cgKCdRJywxNSwgaW50KQkvKiBpbj1kZXYjICovCisjZGVmaW5lIFNORENUTF9TRVFfUEFOSUMJCV9fU0lPICAoJ1EnLDE3KQorI2RlZmluZSBTTkRDVExfU0VRX09VVE9GQkFORAkJX19TSU9XICgnUScsMTgsIHN0cnVjdCBzZXFfZXZlbnRfcmVjKQorI2RlZmluZSBTTkRDVExfU0VRX0dFVFRJTUUJCV9fU0lPUiAoJ1EnLDE5LCBpbnQpCisjZGVmaW5lIFNORENUTF9TWU5USF9JRAkJCV9fU0lPV1IoJ1EnLDIwLCBzdHJ1Y3Qgc3ludGhfaW5mbykKKyNkZWZpbmUgU05EQ1RMX1NZTlRIX0NPTlRST0wJCV9fU0lPV1IoJ1EnLDIxLCBzdHJ1Y3Qgc3ludGhfY29udHJvbCkKKyNkZWZpbmUgU05EQ1RMX1NZTlRIX1JFTU9WRVNBTVBMRQlfX1NJT1dSKCdRJywyMiwgc3RydWN0IHJlbW92ZV9zYW1wbGUpCS8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisjZGVmaW5lIFNORENUTF9TRVFfVElNSU5HX0VOQUJMRQlfX1NJTyAgKCdRJywgMjMpCS8qIEVuYWJsZSBpbmNvbWluZyBNSURJIHRpbWluZyBtZXNzYWdlcyAqLworI2RlZmluZSBTTkRDVExfU0VRX0FDVFNFTlNFX0VOQUJMRQlfX1NJTyAgKCdRJywgMjQpCS8qIEVuYWJsZSBpbmNvbWluZyBhY3RpdmUgc2Vuc2luZyBtZXNzYWdlcyAqLworI2RlZmluZSBTTkRDVExfU0VRX1JUX0VOQUJMRQkJX19TSU8gICgnUScsIDI1KQkvKiBFbmFibGUgb3RoZXIgaW5jb21pbmcgcmVhbHRpbWUgbWVzc2FnZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc3ludGhfY29udHJvbAoreworICBpbnQgZGV2bm87CQkJLyogU3ludGhlc2l6ZXIgIyAqLworICBjaGFyIGRhdGFbNDAwMF07CQkvKiBEZXZpY2Ugc3Blc2lmaWMgY29tbWFuZC9kYXRhIHJlY29yZCAqLworfSBzeW50aF9jb250cm9sOworCit0eXBlZGVmIHN0cnVjdCByZW1vdmVfc2FtcGxlCit7CisgIGludCBkZXZubzsJCQkvKiBTeW50aGVzaXplciAjICovCisgIGludCBiYW5rbm87CQkJLyogTUlESSBiYW5rICMgKDA9R2VuZXJhbCBNSURJKSAqLworICBpbnQgaW5zdHJubzsJCQkvKiBNSURJIGluc3RydW1lbnQgbnVtYmVyICovCit9IHJlbW92ZV9zYW1wbGU7CisKK3R5cGVkZWYgc3RydWN0IHNlcV9ldmVudF9yZWMKK3sKKyAgdW5zaWduZWQgY2hhciBhcnJbOF07Cit9IHNlcV9ldmVudF9yZWM7CisKKyNkZWZpbmUgU05EQ1RMX1RNUl9USU1FQkFTRQkJX19TSU9XUignVCcsIDEsIGludCkKKyNkZWZpbmUgU05EQ1RMX1RNUl9TVEFSVAkJX19TSU8gICgnVCcsIDIpCisjZGVmaW5lIFNORENUTF9UTVJfU1RPUAkJCV9fU0lPICAoJ1QnLCAzKQorI2RlZmluZSBTTkRDVExfVE1SX0NPTlRJTlVFCQlfX1NJTyAgKCdUJywgNCkKKyNkZWZpbmUgU05EQ1RMX1RNUl9URU1QTwkJX19TSU9XUignVCcsIDUsIGludCkKKyNkZWZpbmUgU05EQ1RMX1RNUl9TT1VSQ0UJCV9fU0lPV1IoJ1QnLCA2LCBpbnQpCisjCWRlZmluZSBUTVJfSU5URVJOQUwJCTB4MDAwMDAwMDEKKyMJZGVmaW5lIFRNUl9FWFRFUk5BTAkJMHgwMDAwMDAwMgorIwkJZGVmaW5lIFRNUl9NT0RFX01JREkJMHgwMDAwMDAxMAorIwkJZGVmaW5lIFRNUl9NT0RFX0ZTSwkweDAwMDAwMDIwCisjCQlkZWZpbmUgVE1SX01PREVfQ0xTCTB4MDAwMDAwNDAKKyMJCWRlZmluZSBUTVJfTU9ERV9TTVBURQkweDAwMDAwMDgwCisjZGVmaW5lIFNORENUTF9UTVJfTUVUUk9OT01FCQlfX1NJT1cgKCdUJywgNywgaW50KQorI2RlZmluZSBTTkRDVExfVE1SX1NFTEVDVAkJX19TSU9XICgnVCcsIDgsIGludCkKKworLyoKKyAqIFNhbXBsZSBsb2FkaW5nIG1lY2hhbmlzbSBmb3IgaW50ZXJuYWwgc3ludGhlc2l6ZXJzICgvZGV2L3NlcXVlbmNlcikKKyAqIChmb3IgdGhlIC5QQVQgZm9ybWF0KS4KKyAqLworCitzdHJ1Y3QgcGF0Y2hfaW5mbworeworICB1bnNpZ25lZCBzaG9ydCBrZXk7CQkvKiBVc2UgV0FWRV9QQVRDSCBoZXJlICovCisjZGVmaW5lIFdBVkVfUEFUQ0gJX1BBVENIS0VZKDB4MDQpCisjZGVmaW5lIEdVU19QQVRDSAlXQVZFX1BBVENICisjZGVmaW5lIFdBVkVGUk9OVF9QQVRDSCBfUEFUQ0hLRVkoMHgwNikKKworICBzaG9ydCBkZXZpY2Vfbm87CQkvKiBTeW50aGVzaXplciBudW1iZXIgKi8KKyAgc2hvcnQgaW5zdHJfbm87CQkvKiBNaWRpIHBnbSMgKi8KKworICB1bnNpZ25lZCBpbnQgbW9kZTsKKy8qCisgKiBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBoYXMgdGhlIHNhbWUgZm9ybWF0IHRoYW4gdGhlIEdVUyAuUEFUCisgKiBmaWxlcworICovCisjZGVmaW5lIFdBVkVfMTZfQklUUwkweDAxCS8qIGJpdCAwID0gOCBvciAxNiBiaXQgd2F2ZSBkYXRhLiAqLworI2RlZmluZSBXQVZFX1VOU0lHTkVECTB4MDIJLyogYml0IDEgPSBTaWduZWQgLSBVbnNpZ25lZCBkYXRhLiAqLworI2RlZmluZSBXQVZFX0xPT1BJTkcJMHgwNAkvKiBiaXQgMiA9IGxvb3BpbmcgZW5hYmxlZC0xLiAqLworI2RlZmluZSBXQVZFX0JJRElSX0xPT1AJMHgwOAkvKiBiaXQgMyA9IFNldCBpcyBiaWRpcmVjdGlvbmFsIGxvb3BpbmcuICovCisjZGVmaW5lIFdBVkVfTE9PUF9CQUNLCTB4MTAJLyogYml0IDQgPSBTZXQgaXMgbG9vcGluZyBiYWNrd2FyZC4gKi8KKyNkZWZpbmUgV0FWRV9TVVNUQUlOX09OCTB4MjAJLyogYml0IDUgPSBUdXJuIHN1c3RhaW5pbmcgb24uIChFbnYuIHB0cy4gMykgKi8KKyNkZWZpbmUgV0FWRV9FTlZFTE9QRVMJMHg0MAkvKiBiaXQgNiA9IEVuYWJsZSBlbnZlbG9wZXMgLSAxICovCisjZGVmaW5lIFdBVkVfRkFTVF9SRUxFQVNFIDB4ODAJLyogYml0IDcgPSBTaHV0IG9mZiBpbW1lZGlhdGVseSBhZnRlciBub3RlIG9mZiAqLworICAvKiAgKHVzZSB0aGUgZW52X3JhdGUvZW52X29mZnMgZmllbGRzKS4gKi8KKy8qIExpbnV4IHNwZWNpZmljIGJpdHMgKi8KKyNkZWZpbmUgV0FWRV9WSUJSQVRPCTB4MDAwMTAwMDAJLyogVGhlIHZpYnJhdG8gaW5mbyBpcyB2YWxpZCAqLworI2RlZmluZSBXQVZFX1RSRU1PTE8JMHgwMDAyMDAwMAkvKiBUaGUgdHJlbW9sbyBpbmZvIGlzIHZhbGlkICovCisjZGVmaW5lIFdBVkVfU0NBTEUJMHgwMDA0MDAwMAkvKiBUaGUgc2NhbGluZyBpbmZvIGlzIHZhbGlkICovCisjZGVmaW5lIFdBVkVfRlJBQ1RJT05TCTB4MDAwODAwMDAJLyogRnJhY3Rpb24gaW5mb3JtYXRpb24gaXMgdmFsaWQgKi8KKy8qIFJlc2VydmVkIGJpdHMgKi8KKyNkZWZpbmUgV0FWRV9ST00JMHg0MDAwMDAwMAkvKiBGb3IgZnV0dXJlIHVzZSAqLworI2RlZmluZSBXQVZFX01VTEFXCTB4MjAwMDAwMDAJLyogRm9yIGZ1dHVyZSB1c2UgKi8KKy8qIE90aGVyIGJpdHMgbXVzdCBiZSB6ZXJvZWQgKi8KKworICBpbnQgbGVuOwkJCS8qIFNpemUgb2YgdGhlIHdhdmUgZGF0YSBpbiBieXRlcyAqLworICBpbnQgbG9vcF9zdGFydCwgbG9vcF9lbmQ7CS8qIEJ5dGUgb2Zmc2V0cyBmcm9tIHRoZSBiZWdpbm5pbmcgKi8KKworLyogCisgKiBUaGUgYmFzZV9mcmVxIGFuZCBiYXNlX25vdGUgZmllbGRzIGFyZSB1c2VkIHdoZW4gY29tcHV0aW5nIHRoZQorICogcGxheWJhY2sgc3BlZWQgZm9yIGEgbm90ZS4gVGhlIGJhc2Vfbm90ZSBkZWZpbmVzIHRoZSB0b25lIGZyZXF1ZW5jeQorICogd2hpY2ggaXMgaGVhcmQgaWYgdGhlIHNhbXBsZSBpcyBwbGF5ZWQgdXNpbmcgdGhlIGJhc2VfZnJlcSBhcyB0aGUKKyAqIHBsYXliYWNrIHNwZWVkLgorICoKKyAqIFRoZSBsb3dfbm90ZSBhbmQgaGlnaF9ub3RlIGZpZWxkcyBkZWZpbmUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gbm90ZQorICogZnJlcXVlbmNpZXMgZm9yIHdoaWNoIHRoaXMgc2FtcGxlIGlzIHZhbGlkLiBJdCBpcyBwb3NzaWJsZSB0byBkZWZpbmUKKyAqIG1vcmUgdGhhbiBvbmUgc2FtcGxlcyBmb3IgYW4gaW5zdHJ1bWVudCBudW1iZXIgYXQgdGhlIHNhbWUgdGltZS4gVGhlCisgKiBsb3dfbm90ZSBhbmQgaGlnaF9ub3RlIGZpZWxkcyBhcmUgdXNlZCB0byBzZWxlY3QgdGhlIG1vc3Qgc3VpdGFibGUgb25lLgorICoKKyAqIFRoZSBmaWVsZHMgYmFzZV9ub3RlLCBoaWdoX25vdGUgYW5kIGxvd19ub3RlIHNob3VsZCBjb250YWluCisgKiB0aGUgbm90ZSBmcmVxdWVuY3kgbXVsdGlwbGllZCBieSAxMDAwLiBGb3IgZXhhbXBsZSB2YWx1ZSBmb3IgdGhlCisgKiBtaWRkbGUgQSBpcyA0NDAqMTAwMC4KKyAqLworCisgIHVuc2lnbmVkIGludCBiYXNlX2ZyZXE7CisgIHVuc2lnbmVkIGludCBiYXNlX25vdGU7CisgIHVuc2lnbmVkIGludCBoaWdoX25vdGU7CisgIHVuc2lnbmVkIGludCBsb3dfbm90ZTsKKyAgaW50IHBhbm5pbmc7CQkJLyogLTEyOD1sZWZ0LCAxMjc9cmlnaHQgKi8KKyAgaW50IGRldHVuaW5nOworCisgIC8qIEVudmVsb3BlLiBFbmFibGVkIGJ5IG1vZGUgYml0IFdBVkVfRU5WRUxPUEVTICAqLworICB1bnNpZ25lZCBjaGFyIGVudl9yYXRlWzZdOwkvKiBHVVMgSFcgcmFtcGluZyByYXRlICovCisgIHVuc2lnbmVkIGNoYXIgZW52X29mZnNldFs2XTsJLyogMjU1ID09IDEwMCUgKi8KKworICAvKiAKKyAgICogVGhlIHRyZW1vbG8sIHZpYnJhdG8gYW5kIHNjYWxlIGluZm8gYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgorICAgKiBFbmFibGUgYnkgc2V0dGluZyB0aGUgbW9kZSBiaXRzIFdBVkVfVFJFTU9MTywgV0FWRV9WSUJSQVRPIG9yCisgICAqIFdBVkVfU0NBTEUKKyAgICovCisKKyAgdW5zaWduZWQgY2hhciB0cmVtb2xvX3N3ZWVwOworICB1bnNpZ25lZCBjaGFyIHRyZW1vbG9fcmF0ZTsKKyAgdW5zaWduZWQgY2hhciB0cmVtb2xvX2RlcHRoOworCisgIHVuc2lnbmVkIGNoYXIgdmlicmF0b19zd2VlcDsKKyAgdW5zaWduZWQgY2hhciB2aWJyYXRvX3JhdGU7CisgIHVuc2lnbmVkIGNoYXIgdmlicmF0b19kZXB0aDsKKworICBpbnQgc2NhbGVfZnJlcXVlbmN5OworICB1bnNpZ25lZCBpbnQgc2NhbGVfZmFjdG9yOwkvKiBmcm9tIDAgdG8gMjA0OCBvciAwIHRvIDIgKi8KKworICBpbnQgdm9sdW1lOworICBpbnQgZnJhY3Rpb25zOworICBpbnQgcmVzZXJ2ZWQxOworICBpbnQgc3BhcmVbMl07CisgIGNoYXIgZGF0YVsxXTsJCQkvKiBUaGUgd2F2ZWZvcm0gZGF0YSBzdGFydHMgaGVyZSAqLworfTsKKworc3RydWN0IHN5c2V4X2luZm8KK3sKKyAgc2hvcnQga2V5OwkJCS8qIFVzZSBTWVNFWF9QQVRDSCBvciBNQVVJX1BBVENIIGhlcmUgKi8KKyNkZWZpbmUgU1lTRVhfUEFUQ0gJX1BBVENIS0VZKDB4MDUpCisjZGVmaW5lIE1BVUlfUEFUQ0gJX1BBVENIS0VZKDB4MDYpCisgIHNob3J0IGRldmljZV9ubzsJCS8qIFN5bnRoZXNpemVyIG51bWJlciAqLworICBpbnQgbGVuOwkJCS8qIFNpemUgb2YgdGhlIHN5c2V4IGRhdGEgaW4gYnl0ZXMgKi8KKyAgdW5zaWduZWQgY2hhciBkYXRhWzFdOwkvKiBTeXNleCBkYXRhIHN0YXJ0cyBoZXJlICovCit9OworCisvKgorICogL2Rldi9zZXF1ZW5jZXIgaW5wdXQgZXZlbnRzLgorICoKKyAqIFRoZSBkYXRhIHdyaXR0ZW4gdG8gdGhlIC9kZXYvc2VxdWVuY2VyIGlzIGEgc3RyZWFtIG9mIGV2ZW50cy4gRXZlbnRzCisgKiBhcmUgcmVjb3JkcyBvZiA0IG9yIDggYnl0ZXMuIFRoZSBmaXJzdCBieXRlIGRlZmluZXMgdGhlIHNpemUuIAorICogQW55IG51bWJlciBvZiBldmVudHMgY2FuIGJlIHdyaXR0ZW4gd2l0aCBhIHdyaXRlIGNhbGwuIFRoZXJlCisgKiBpcyBhIHNldCBvZiBtYWNyb3MgZm9yIHNlbmRpbmcgdGhlc2UgZXZlbnRzLiBVc2UgdGhlc2UgbWFjcm9zIGlmIHlvdQorICogd2FudCB0byBtYXhpbWl6ZSBwb3J0YWJpbGl0eSBvZiB5b3VyIHByb2dyYW0uCisgKgorICogRXZlbnRzIFNFUV9XQUlULCBTRVFfTUlESVBVVEMgYW5kIFNFUV9FQ0hPLiBBcmUgYWxzbyBpbnB1dCBldmVudHMuCisgKiAoQWxsIGlucHV0IGV2ZW50cyBhcmUgY3VycmVudGx5IDQgYnl0ZXMgbG9uZy4gQmUgcHJlcGFyZWQgdG8gc3VwcG9ydAorICogOCBieXRlIGV2ZW50cyBhbHNvLiBJZiB5b3UgcmVjZWl2ZSBhbnkgZXZlbnQgaGF2aW5nIGZpcnN0IGJ5dGUgPj0gMTI4LAorICogaXQncyBhIDggYnl0ZSBldmVudC4KKyAqCisgKiBUaGUgZXZlbnRzIGFyZSBkb2N1bWVudGVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorICoKKyAqIE5vcm1hbCBldmVudHMgKDQgYnl0ZXMpCisgKiBUaGVyZSBpcyBhbHNvIGEgOCBieXRlIHZlcnNpb24gb2YgbW9zdCBvZiB0aGUgNCBieXRlIGV2ZW50cy4gVGhlCisgKiA4IGJ5dGUgb25lIGlzIHJlY29tbWVuZGVkLgorICoKKyAqIE5PVEUhIEFsbCA0IGJ5dGUgZXZlbnRzIGFyZSBub3cgb2Jzb2xldGUuIEFwcGxpY2F0aW9ucyBzaG91bGQgbm90IHdyaXRlCisgKiAgICAgICB0aGVtLiBIb3dldmVyIDQgYnl0ZSBldmVudHMgYXJlIHN0aWxsIHVzZWQgYXMgaW5wdXRzIGZyb20KKyAqICAgICAgIC9kZXYvc2VxdWVuY2VyICgvZGV2L211c2ljIHVzZXMgb25seSA4IGJ5dGUgb25lcykuCisgKi8KKyNkZWZpbmUgU0VRX05PVEVPRkYJCTAKKyNkZWZpbmUgU0VRX0ZNTk9URU9GRgkJU0VRX05PVEVPRkYJLyogSnVzdCBvbGQgbmFtZSAqLworI2RlZmluZSBTRVFfTk9URU9OCQkxCisjZGVmaW5lCVNFUV9GTU5PVEVPTgkJU0VRX05PVEVPTgorI2RlZmluZSBTRVFfV0FJVAkJVE1SX1dBSVRfQUJTCisjZGVmaW5lIFNFUV9QR01DSEFOR0UJCTMKKyNkZWZpbmUgU0VRX0ZNUEdNQ0hBTkdFCQlTRVFfUEdNQ0hBTkdFCisjZGVmaW5lIFNFUV9TWU5DVElNRVIJCVRNUl9TVEFSVAorI2RlZmluZSBTRVFfTUlESVBVVEMJCTUKKyNkZWZpbmUgU0VRX0RSVU1PTgkJNgkJLyoqKiBPQlNPTEVURSAqKiovCisjZGVmaW5lIFNFUV9EUlVNT0ZGCQk3CQkvKioqIE9CU09MRVRFICoqKi8KKyNkZWZpbmUgU0VRX0VDSE8JCVRNUl9FQ0hPCS8qIEZvciBzeW5jaGluZyBwcm9ncmFtcyB3aXRoIG91dHB1dCAqLworI2RlZmluZSBTRVFfQUZURVJUT1VDSAkJOQorI2RlZmluZSBTRVFfQ09OVFJPTExFUgkJMTAKKyNkZWZpbmUgU0VRX0JBTEFOQ0UJCTExCisjZGVmaW5lIFNFUV9WT0xNT0RFICAgICAgICAgICAgIDEyCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU1pZGkgY29udHJvbGxlciBudW1iZXJzCSAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENvbnRyb2xsZXJzIDAgdG8gMzEgKDB4MDAgdG8gMHgxZikgYW5kCisgKiAzMiB0byA2MyAoMHgyMCB0byAweDNmKSBhcmUgY29udGludW91cworICogY29udHJvbGxlcnMuCisgKiBJbiB0aGUgTUlESSAxLjAgdGhlc2UgY29udHJvbGxlcnMgYXJlIHNlbnQgdXNpbmcKKyAqIHR3byBtZXNzYWdlcy4gQ29udHJvbGxlciBudW1iZXJzIDAgdG8gMzEgYXJlIHVzZWQKKyAqIHRvIHNlbmQgdGhlIE1TQiBhbmQgdGhlIGNvbnRyb2xsZXIgbnVtYmVycyAzMiB0byA2MworICogYXJlIGZvciB0aGUgTFNCLiBOb3RlIHRoYXQganVzdCA3IGJpdHMgYXJlIHVzZWQgaW4gTUlESSBieXRlcy4KKyAqLworCisjZGVmaW5lCSAgIENUTF9CQU5LX1NFTEVDVAkJMHgwMAorI2RlZmluZQkgICBDVExfTU9EV0hFRUwJCQkweDAxCisjZGVmaW5lICAgIENUTF9CUkVBVEgJCQkweDAyCisvKgkJdW5kZWZpbmVkCQkweDAzICovCisjZGVmaW5lICAgIENUTF9GT09UCQkJMHgwNAorI2RlZmluZSAgICBDVExfUE9SVEFNRU5UT19USU1FCQkweDA1CisjZGVmaW5lICAgIENUTF9EQVRBX0VOVFJZCQkweDA2CisjZGVmaW5lICAgIENUTF9NQUlOX1ZPTFVNRQkJMHgwNworI2RlZmluZSAgICBDVExfQkFMQU5DRQkJCTB4MDgKKy8qCQl1bmRlZmluZWQJCTB4MDkgKi8KKyNkZWZpbmUgICAgQ1RMX1BBTgkJCTB4MGEKKyNkZWZpbmUgICAgQ1RMX0VYUFJFU1NJT04JCTB4MGIKKy8qCQl1bmRlZmluZWQJCTB4MGMgKi8KKy8qCQl1bmRlZmluZWQJCTB4MGQgKi8KKy8qCQl1bmRlZmluZWQJCTB4MGUgKi8KKy8qCQl1bmRlZmluZWQJCTB4MGYgKi8KKyNkZWZpbmUgICAgQ1RMX0dFTkVSQUxfUFVSUE9TRTEJCTB4MTAKKyNkZWZpbmUgICAgQ1RMX0dFTkVSQUxfUFVSUE9TRTIJCTB4MTEKKyNkZWZpbmUgICAgQ1RMX0dFTkVSQUxfUFVSUE9TRTMJCTB4MTIKKyNkZWZpbmUgICAgQ1RMX0dFTkVSQUxfUFVSUE9TRTQJCTB4MTMKKy8qCQl1bmRlZmluZWQJCTB4MTQgLSAweDFmICovCisKKy8qCQl1bmRlZmluZWQJCTB4MjAgKi8KKy8qIFRoZSBjb250cm9sbGVyIG51bWJlcnMgMHgyMSB0byAweDNmIGFyZSByZXNlcnZlZCBmb3IgdGhlICovCisvKiBsZWFzdCBzaWduaWZpY2FudCBieXRlcyBvZiB0aGUgY29udHJvbGxlcnMgMHgwMCB0byAweDFmLiAqLworLyogVGhlc2UgY29udHJvbGxlcnMgYXJlIG5vdCByZWNvZ25pc2VkIGJ5IHRoZSBkcml2ZXIuICovCisKKy8qIENvbnRyb2xsZXJzIDY0IHRvIDY5ICgweDQwIHRvIDB4NDUpIGFyZSBvbi9vZmYgc3dpdGNoZXMuICovCisvKiAwPU9GRiBhbmQgMTI3PU9OIChpbnRlcm1lZGlhdGUgdmFsdWVzIGFyZSBwb3NzaWJsZSkgKi8KKyNkZWZpbmUgICAgQ1RMX0RBTVBFUl9QRURBTAkJMHg0MAorI2RlZmluZSAgICBDVExfU1VTVEFJTgkJCTB4NDAJLyogQWxpYXMgKi8KKyNkZWZpbmUgICAgQ1RMX0hPTEQJCQkweDQwCS8qIEFsaWFzICovCisjZGVmaW5lICAgIENUTF9QT1JUQU1FTlRPCQkweDQxCisjZGVmaW5lICAgIENUTF9TT1NURU5VVE8JCTB4NDIKKyNkZWZpbmUgICAgQ1RMX1NPRlRfUEVEQUwJCTB4NDMKKy8qCQl1bmRlZmluZWQJCTB4NDQgKi8KKyNkZWZpbmUgICAgQ1RMX0hPTEQyCQkJMHg0NQorLyoJCXVuZGVmaW5lZAkJMHg0NiAtIDB4NGYgKi8KKworI2RlZmluZSAgICBDVExfR0VORVJBTF9QVVJQT1NFNQkJMHg1MAorI2RlZmluZSAgICBDVExfR0VORVJBTF9QVVJQT1NFNgkJMHg1MQorI2RlZmluZSAgICBDVExfR0VORVJBTF9QVVJQT1NFNwkJMHg1MgorI2RlZmluZSAgICBDVExfR0VORVJBTF9QVVJQT1NFOAkJMHg1MworLyoJCXVuZGVmaW5lZAkJMHg1NCAtIDB4NWEgKi8KKyNkZWZpbmUgICAgQ1RMX0VYVF9FRkZfREVQVEgJCTB4NWIKKyNkZWZpbmUgICAgQ1RMX1RSRU1PTE9fREVQVEgJCTB4NWMKKyNkZWZpbmUgICAgQ1RMX0NIT1JVU19ERVBUSAkJMHg1ZAorI2RlZmluZSAgICBDVExfREVUVU5FX0RFUFRICQkweDVlCisjZGVmaW5lICAgIENUTF9DRUxFU1RFX0RFUFRICQkweDVlCS8qIEFsaWFzIGZvciB0aGUgYWJvdmUgb25lICovCisjZGVmaW5lICAgIENUTF9QSEFTRVJfREVQVEgJCTB4NWYKKyNkZWZpbmUgICAgQ1RMX0RBVEFfSU5DUkVNRU5UCQkweDYwCisjZGVmaW5lICAgIENUTF9EQVRBX0RFQ1JFTUVOVAkJMHg2MQorI2RlZmluZSAgICBDVExfTk9OUkVHX1BBUk1fTlVNX0xTQgkweDYyCisjZGVmaW5lICAgIENUTF9OT05SRUdfUEFSTV9OVU1fTVNCCTB4NjMKKyNkZWZpbmUgICAgQ1RMX1JFR0lTVF9QQVJNX05VTV9MU0IJMHg2NAorI2RlZmluZSAgICBDVExfUkVHSVNUX1BBUk1fTlVNX01TQgkweDY1CisvKgkJdW5kZWZpbmVkCQkweDY2IC0gMHg3OCAqLworLyoJCXJlc2VydmVkCQkweDc5IC0gMHg3ZiAqLworCisvKiBQc2V1ZG8gY29udHJvbGxlcnMgKG5vdCBtaWRpIGNvbXBhdGlibGUpICovCisjZGVmaW5lICAgIENUUkxfUElUQ0hfQkVOREVSCQkyNTUKKyNkZWZpbmUgICAgQ1RSTF9QSVRDSF9CRU5ERVJfUkFOR0UJMjU0CisjZGVmaW5lICAgIENUUkxfRVhQUkVTU0lPTgkJMjUzCS8qIE9ic29sZXRlICovCisjZGVmaW5lICAgIENUUkxfTUFJTl9WT0xVTUUJCTI1MgkvKiBPYnNvbGV0ZSAqLworCisvKgorICogVm9sdW1lIG1vZGUgZGVmaW5lcyBob3cgdm9sdW1lcyBhcmUgdXNlZAorICovCisKKyNkZWZpbmUgVk9MX01FVEhPRF9BREFHSU8JMQorI2RlZmluZSBWT0xfTUVUSE9EX0xJTkVBUgkyCisKKy8qCisgKiBOb3RlISBTRVFfV0FJVCwgU0VRX01JRElQVVRDIGFuZCBTRVFfRUNITyBhcmUgdXNlZCBhbHNvIGFzCisgKgkgaW5wdXQgZXZlbnRzLgorICovCisKKy8qCisgKiBFdmVudCBjb2RlcyAweGYwIHRvIDB4ZmMgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucy4KKyAqLworCisjZGVmaW5lIFNFUV9GVUxMU0laRQkJMHhmZAkvKiBMb25nIGV2ZW50cyAqLworLyoKKyAqIFNFUV9GVUxMU0laRSBldmVudHMgYXJlIHVzZWQgZm9yIGxvYWRpbmcgcGF0Y2hlcy9zYW1wbGVzIHRvIHRoZQorICogc3ludGhlc2l6ZXIgZGV2aWNlcy4gVGhlc2UgZXZlbnRzIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGRyaXZlcgorICogb2YgdGhlIGFzc29jaWF0ZWQgc3ludGhlc2l6ZXIgZGV2aWNlLiBUaGVyZSBpcyBubyBsaW1pdCB0byB0aGUgc2l6ZQorICogb2YgdGhlIGV4dGVuZGVkIGV2ZW50cy4gVGhlc2UgZXZlbnRzIGFyZSBub3QgcXVldWVkIGJ1dCBleGVjdXRlZAorICogaW1tZWRpYXRlbHkgd2hlbiB0aGUgd3JpdGUoKSBpcyBjYWxsZWQgKGV4ZWN1dGlvbiBjYW4gdGFrZSBzZXZlcmFsCisgKiBzZWNvbmRzIG9mIHRpbWUpLiAKKyAqCisgKiBXaGVuIGEgU0VRX0ZVTExTSVpFIG1lc3NhZ2UgaXMgd3JpdHRlbiB0byB0aGUgZGV2aWNlLCBpdCBtdXN0CisgKiBiZSB3cml0dGVuIHVzaW5nIGV4YWN0bHkgb25lIHdyaXRlKCkgY2FsbC4gT3RoZXIgZXZlbnRzIGNhbm5vdAorICogYmUgbWl4ZWQgdG8gdGhlIHNhbWUgd3JpdGUuCisgKgkKKyAqIEZvciBGTSBzeW50aHMgKFlNMzgxMi9PUEwzKSB1c2Ugc3RydWN0IHNiaV9pbnN0cnVtZW50IGFuZCB3cml0ZSBpdCB0byB0aGUgCisgKiAvZGV2L3NlcXVlbmNlci4gRG9uJ3Qgd3JpdGUgb3RoZXIgZGF0YSB0b2dldGhlciB3aXRoIHRoZSBpbnN0cnVtZW50IHN0cnVjdHVyZQorICogU2V0IHRoZSBrZXkgZmllbGQgb2YgdGhlIHN0cnVjdHVyZSB0byBGTV9QQVRDSC4gVGhlIGRldmljZSBmaWVsZCBpcyB1c2VkIHRvCisgKiByb3V0ZSB0aGUgcGF0Y2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlLgorICoKKyAqIEZvciB3YXZlIHRhYmxlIHVzZSBzdHJ1Y3QgcGF0Y2hfaW5mby4gSW5pdGlhbGl6ZSB0aGUga2V5IGZpZWxkCisgKiB0byBXQVZFX1BBVENILgorICovCisjZGVmaW5lIFNFUV9QUklWQVRFCQkweGZlCS8qIExvdyBsZXZlbCBIVyBkZXBlbmRlbnQgZXZlbnRzICg4IGJ5dGVzKSAqLworI2RlZmluZSBTRVFfRVhURU5ERUQJCTB4ZmYJLyogRXh0ZW5kZWQgZXZlbnRzICg4IGJ5dGVzKSBPQlNPTEVURSAqLworCisvKgorICogUmVjb3JkIGZvciBGTSBwYXRjaGVzCisgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHNiaV9pbnN0cl9kYXRhWzMyXTsKKworc3RydWN0IHNiaV9pbnN0cnVtZW50Cit7CisgIHVuc2lnbmVkIHNob3J0IGtleTsJCS8qIEZNX1BBVENIIG9yIE9QTDNfUEFUQ0ggKi8KKyNkZWZpbmUgRk1fUEFUQ0gJX1BBVENIS0VZKDB4MDEpCisjZGVmaW5lIE9QTDNfUEFUQ0gJX1BBVENIS0VZKDB4MDMpCisgIHNob3J0IGRldmljZTsJCQkvKiAgU3ludGgjICgwLTQpICAgICovCisgIGludCBjaGFubmVsOwkJCS8qICBQcm9ncmFtIyB0byBiZSBpbml0aWFsaXplZCAgKi8KKyAgc2JpX2luc3RyX2RhdGEgb3BlcmF0b3JzOwkvKiAgUmVnaXN0ZXIgc2V0dGluZ3MgZm9yIG9wZXJhdG9yIGNlbGxzICguU0JJIGZvcm1hdCkgICovCit9OworCitzdHJ1Y3Qgc3ludGhfaW5mbworewkJCQkvKiBSZWFkIG9ubHkgKi8KKyAgY2hhciBuYW1lWzMwXTsKKyAgaW50IGRldmljZTsJCQkvKiAwLU4uIElOSVRJQUxJWkUgQkVGT1JFIENBTExJTkcgKi8KKyAgaW50IHN5bnRoX3R5cGU7CisjZGVmaW5lIFNZTlRIX1RZUEVfRk0JCQkwCisjZGVmaW5lIFNZTlRIX1RZUEVfU0FNUExFCQkxCisjZGVmaW5lIFNZTlRIX1RZUEVfTUlESQkJCTIJLyogTWlkaSBpbnRlcmZhY2UgKi8KKworICBpbnQgc3ludGhfc3VidHlwZTsKKyNkZWZpbmUgRk1fVFlQRV9BRExJQgkJCTB4MDAKKyNkZWZpbmUgRk1fVFlQRV9PUEwzCQkJMHgwMQorI2RlZmluZSBNSURJX1RZUEVfTVBVNDAxCQkweDQwMQorCisjZGVmaW5lIFNBTVBMRV9UWVBFX0JBU0lDCQkweDEwCisjZGVmaW5lIFNBTVBMRV9UWVBFX0dVUwkJCVNBTVBMRV9UWVBFX0JBU0lDCisjZGVmaW5lIFNBTVBMRV9UWVBFX1dBVkVGUk9OVCAgIAkweDExCisKKyAgaW50IHBlcmNfbW9kZTsJCS8qIE5vIGxvbmdlciBzdXBwb3J0ZWQgKi8KKyAgaW50IG5yX3ZvaWNlczsKKyAgaW50IG5yX2RydW1zOwkJCS8qIE9ic29sZXRlIGZpZWxkICovCisgIGludCBpbnN0cl9iYW5rX3NpemU7CisgIHVuc2lnbmVkIGludCBjYXBhYmlsaXRpZXM7CisjZGVmaW5lIFNZTlRIX0NBUF9QRVJDTU9ERQkweDAwMDAwMDAxCS8qIE5vIGxvbmdlciB1c2VkICovCisjZGVmaW5lIFNZTlRIX0NBUF9PUEwzCQkweDAwMDAwMDAyCS8qIFNldCBpZiBPUEwzIHN1cHBvcnRlZCAqLworI2RlZmluZSBTWU5USF9DQVBfSU5QVVQJCTB4MDAwMDAwMDQJLyogSW5wdXQgKE1JREkpIGRldmljZSAqLworICBpbnQgZHVtbWllc1sxOV07CQkvKiBSZXNlcnZlIHNwYWNlICovCit9OworCitzdHJ1Y3Qgc291bmRfdGltZXJfaW5mbworeworICBjaGFyIG5hbWVbMzJdOworICBpbnQgY2FwczsKK307CisKK3N0cnVjdCBtaWRpX2luZm8JCS8qIE9CU09MRVRFICovCit7CisgIGNoYXIgbmFtZVszMF07CisgIGludCBkZXZpY2U7CQkJLyogMC1OLiBJTklUSUFMSVpFIEJFRk9SRSBDQUxMSU5HICovCisgIHVuc2lnbmVkIGludCBjYXBhYmlsaXRpZXM7CS8qIFRvIGJlIGRlZmluZWQgbGF0ZXIgKi8KKyAgaW50IGRldl90eXBlOworICBpbnQgZHVtbWllc1sxOF07CQkvKiBSZXNlcnZlIHNwYWNlICovCit9OworCisvKgorICogTGV2ZWwgMiBldmVudCB0eXBlcyBmb3IgL2Rldi9zZXF1ZW5jZXIKKyAqLworCisvKgorICogVGhlIDQgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIGJ5dGUgMCBzcGVjaWZ5IHRoZSBjbGFzcyBvZgorICogdGhlIGV2ZW50OiAKKyAqCisgKgkweDhYID0gc3lzdGVtIGxldmVsIGV2ZW50cywKKyAqCTB4OVggPSBkZXZpY2UvcG9ydCBzcGVjaWZpYyBldmVudHMsIGV2ZW50WzFdID0gZGV2aWNlL3BvcnQsCisgKgkJVGhlIGxhc3QgNCBiaXRzIGdpdmUgdGhlIHN1YnR5cGU6CisgKgkJCTB4MDIJPSBDaGFubmVsIGV2ZW50IChldmVudFszXSA9IGNobikuCisgKgkJCTB4MDEJPSBub3RlIGV2ZW50IChldmVudFs0XSA9IG5vdGUpLgorICoJCQkoMHgwMSBpcyBub3QgdXNlZCBhbG9uZSBidXQgYWx3YXlzIHdpdGggYml0IDB4MDIpLgorICoJICAgICAgIGV2ZW50WzJdID0gTUlESSBtZXNzYWdlIGNvZGUgKDB4ODA9bm90ZSBvZmYgZXRjLikKKyAqCisgKi8KKworI2RlZmluZSBFVl9TRVFfTE9DQUwJCTB4ODAKKyNkZWZpbmUgRVZfVElNSU5HCQkweDgxCisjZGVmaW5lIEVWX0NITl9DT01NT04JCTB4OTIKKyNkZWZpbmUgRVZfQ0hOX1ZPSUNFCQkweDkzCisjZGVmaW5lIEVWX1NZU0VYCQkweDk0CisjZGVmaW5lIEVWX1NZU1RFTQkJMHg5NQkvKiBNSURJIHN5c3RlbSBhbmQgcmVhbCB0aW1lIG1lc3NhZ2VzIChpbnB1dCBvbmx5KSAqLworLyoKKyAqIEV2ZW50IHR5cGVzIDIwMCB0byAyMjAgYXJlIHJlc2VydmVkIGZvciBhcHBsaWNhdGlvbiB1c2UuCisgKiBUaGVzZSBudW1iZXJzIHdpbGwgbm90IGJlIHVzZWQgYnkgdGhlIGRyaXZlci4KKyAqLworCisvKgorICogRXZlbnRzIGZvciBldmVudCB0eXBlIEVWX0NITl9WT0lDRQorICovCisKKyNkZWZpbmUgTUlESV9OT1RFT0ZGCQkweDgwCisjZGVmaW5lIE1JRElfTk9URU9OCQkweDkwCisjZGVmaW5lIE1JRElfS0VZX1BSRVNTVVJFCTB4QTAKKworLyoKKyAqIEV2ZW50cyBmb3IgZXZlbnQgdHlwZSBFVl9DSE5fQ09NTU9OCisgKi8KKworI2RlZmluZSBNSURJX0NUTF9DSEFOR0UJCTB4QjAKKyNkZWZpbmUgTUlESV9QR01fQ0hBTkdFCQkweEMwCisjZGVmaW5lIE1JRElfQ0hOX1BSRVNTVVJFCTB4RDAKKyNkZWZpbmUgTUlESV9QSVRDSF9CRU5ECQkweEUwCisKKyNkZWZpbmUgTUlESV9TWVNURU1fUFJFRklYCTB4RjAKKworLyoKKyAqIFRpbWVyIGV2ZW50IHR5cGVzCisgKi8KKyNkZWZpbmUgVE1SX1dBSVRfUkVMCQkxCS8qIFRpbWUgcmVsYXRpdmUgdG8gdGhlIHByZXYgdGltZSAqLworI2RlZmluZSBUTVJfV0FJVF9BQlMJCTIJLyogQWJzb2x1dGUgdGltZSBzaW5jZSBUTVJfU1RBUlQgKi8KKyNkZWZpbmUgVE1SX1NUT1AJCTMKKyNkZWZpbmUgVE1SX1NUQVJUCQk0CisjZGVmaW5lIFRNUl9DT05USU5VRQkJNQorI2RlZmluZSBUTVJfVEVNUE8JCTYKKyNkZWZpbmUgVE1SX0VDSE8JCTgKKyNkZWZpbmUgVE1SX0NMT0NLCQk5CS8qIE1JREkgY2xvY2sgKi8KKyNkZWZpbmUgVE1SX1NQUAkJCTEwCS8qIFNvbmcgcG9zaXRpb24gcG9pbnRlciAqLworI2RlZmluZSBUTVJfVElNRVNJRwkJMTEJLyogVGltZSBzaWduYXR1cmUgKi8KKworLyoKKyAqCUxvY2FsIGV2ZW50IHR5cGVzCisgKi8KKyNkZWZpbmUgTE9DTF9TVEFSVEFVRElPCQkxCisjZGVmaW5lIExPQ0xfU1RBUlRBVURJTzIJMgorI2RlZmluZSBMT0NMX1NUQVJUQVVESU8zCTMKKyNkZWZpbmUgTE9DTF9TVEFSVEFVRElPNAk0CisKKyNpZiAoIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoS0VSTkVMKSAmJiAhZGVmaW5lZChJTktFUk5FTCkgJiYgIWRlZmluZWQoX0tFUk5FTCkpIHx8IGRlZmluZWQoVVNFX1NFUV9NQUNST1MpCisvKgorICogU29tZSBjb252ZW5pZW5jZSBtYWNyb3MgdG8gc2ltcGxpZnkgcHJvZ3JhbW1pbmcgb2YgdGhlCisgKiAvZGV2L3NlcXVlbmNlciBpbnRlcmZhY2UKKyAqCisgKiBUaGVzZSBtYWNyb3MgZGVmaW5lIHRoZSBBUEkgd2hpY2ggc2hvdWxkIGJlIHVzZWQgd2hlbiBwb3NzaWJsZS4KKyAqLworI2RlZmluZSBTRVFfREVDTEFSRUJVRigpCQlTRVFfVVNFX0VYVEJVRigpCisKK3ZvaWQgc2VxYnVmX2R1bXAgKHZvaWQpOwkvKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgcHJvdmlkZWQgYnkgcHJvZ3JhbXMgKi8KKworRVhURVJOQyBpbnQgT1NTX2luaXQgKGludCBzZXFmZCwgaW50IGJ1Zmxlbik7CitFWFRFUk5DIHZvaWQgT1NTX3NlcWJ1Zl9kdW1wIChpbnQgZmQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGJ1Zmxlbik7CitFWFRFUk5DIHZvaWQgT1NTX3NlcV9hZHZidWYgKGludCBsZW4sIGludCBmZCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKK0VYVEVSTkMgdm9pZCBPU1Nfc2VxX25lZWRidWYgKGludCBsZW4sIGludCBmZCwgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJICAgICAgaW50IGJ1Zmxlbik7CitFWFRFUk5DIHZvaWQgT1NTX3BhdGNoX2NhY2hpbmcgKGludCBkZXYsIGludCBjaG4sIGludCBwYXRjaCwgaW50IGZkLAorCQkJCXVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGJ1Zmxlbik7CitFWFRFUk5DIHZvaWQgT1NTX2RydW1fY2FjaGluZyAoaW50IGRldiwgaW50IGNobiwgaW50IHBhdGNoLCBpbnQgZmQsCisJCQkgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKK0VYVEVSTkMgdm9pZCBPU1Nfd3JpdGVfcGF0Y2ggKGludCBmZCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKTsKK0VYVEVSTkMgaW50IE9TU193cml0ZV9wYXRjaDIgKGludCBmZCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKTsKKworI2RlZmluZSBTRVFfUE1fREVGSU5FUyBpbnQgX19mb29fYmFyX19fCisjaWZkZWYgT1NTTElCCisjICBkZWZpbmUgU0VRX1VTRV9FWFRCVUYoKSBcCisJCUVYVEVSTkMgdW5zaWduZWQgY2hhciAqX3NlcWJ1ZjsgXAorCQlFWFRFUk5DIGludCBfc2VxYnVmbGVuO0VYVEVSTkMgaW50IF9zZXFidWZwdHIKKyMgIGRlZmluZSBTRVFfREVGSU5FQlVGKGxlbikgU0VRX1VTRV9FWFRCVUYoKTtzdGF0aWMgaW50IF9yZXF1ZXN0ZWRfc2VxYnVmbGVuPWxlbgorIyAgZGVmaW5lIF9TRVFfQURWQlVGKGxlbikgT1NTX3NlcV9hZHZidWYobGVuLCBzZXFmZCwgX3NlcWJ1ZiwgX3NlcWJ1ZmxlbikKKyMgIGRlZmluZSBfU0VRX05FRURCVUYobGVuKSBPU1Nfc2VxX25lZWRidWYobGVuLCBzZXFmZCwgX3NlcWJ1ZiwgX3NlcWJ1ZmxlbikKKyMgIGRlZmluZSBTRVFfRFVNUEJVRigpIE9TU19zZXFidWZfZHVtcChzZXFmZCwgX3NlcWJ1ZiwgX3NlcWJ1ZmxlbikKKworIyAgZGVmaW5lIFNFUV9MT0FEX0dNSU5TVFIoZGV2LCBpbnN0cikgXAorCQlPU1NfcGF0Y2hfY2FjaGluZyhkZXYsIC0xLCBpbnN0ciwgc2VxZmQsIF9zZXFidWYsIF9zZXFidWZsZW4pCisjICBkZWZpbmUgU0VRX0xPQURfR01EUlVNKGRldiwgZHJ1bSkgXAorCQlPU1NfZHJ1bV9jYWNoaW5nKGRldiwgLTEsIGRydW0sIHNlcWZkLCBfc2VxYnVmLCBfc2VxYnVmbGVuKQorI2Vsc2UgLyogIU9TU0xJQiAqLworCisjICBkZWZpbmUgU0VRX0xPQURfR01JTlNUUihkZXYsIGluc3RyKQorIyAgZGVmaW5lIFNFUV9MT0FEX0dNRFJVTShkZXYsIGRydW0pCisKKyMgIGRlZmluZSBTRVFfVVNFX0VYVEJVRigpIFwKKwkJRVhURVJOQyB1bnNpZ25lZCBjaGFyIF9zZXFidWZbXTsgXAorCQlFWFRFUk5DIGludCBfc2VxYnVmbGVuO0VYVEVSTkMgaW50IF9zZXFidWZwdHIKKworI2lmbmRlZiBVU0VfU0lNUExFX01BQ1JPUworLyogU2FtcGxlIHNlcWJ1Zl9kdW1wKCkgaW1wbGVtZW50YXRpb246CisgKgorICoJU0VRX0RFRklORUJVRiAoMjA0OCk7CS0tIERlZmluZXMgYSBidWZmZXIgZm9yIDIwNDggYnl0ZXMKKyAqCisgKglpbnQgc2VxZmQ7CQktLSBUaGUgZmlsZSBkZXNjcmlwdG9yIGZvciAvZGV2L3NlcXVlbmNlci4KKyAqCisgKgl2b2lkCisgKglzZXFidWZfZHVtcCAoKQorICoJeworICoJICBpZiAoX3NlcWJ1ZnB0cikKKyAqCSAgICBpZiAod3JpdGUgKHNlcWZkLCBfc2VxYnVmLCBfc2VxYnVmcHRyKSA9PSAtMSkKKyAqCSAgICAgIHsKKyAqCQlwZXJyb3IgKCJ3cml0ZSAvZGV2L3NlcXVlbmNlciIpOworICoJCWV4aXQgKC0xKTsKKyAqCSAgICAgIH0KKyAqCSAgX3NlcWJ1ZnB0ciA9IDA7CisgKgl9CisgKi8KKworI2RlZmluZSBTRVFfREVGSU5FQlVGKGxlbikgXAorCXVuc2lnbmVkIGNoYXIgX3NlcWJ1ZltsZW5dOyBpbnQgX3NlcWJ1ZmxlbiA9IGxlbjtpbnQgX3NlcWJ1ZnB0ciA9IDAKKyNkZWZpbmUgX1NFUV9ORUVEQlVGKGxlbikgXAorCWlmICgoX3NlcWJ1ZnB0cisobGVuKSkgPiBfc2VxYnVmbGVuKSBzZXFidWZfZHVtcCgpCisjZGVmaW5lIF9TRVFfQURWQlVGKGxlbikgX3NlcWJ1ZnB0ciArPSBsZW4KKyNkZWZpbmUgU0VRX0RVTVBCVUYgc2VxYnVmX2R1bXAKKyNlbHNlCisvKgorICogVGhpcyB2YXJpYXRpb24gb2YgdGhlIHNlcXVlbmNlciBtYWNyb3MgaXMgdXNlZCBqdXN0IHRvIGZvcm1hdCBvbmUgZXZlbnQKKyAqIHVzaW5nIGZpeGVkIGJ1ZmZlci4KKyAqIAorICogVGhlIHByb2dyYW0gdXNpbmcgdGhlIG1hY3JvIGxpYnJhcnkgbXVzdCBkZWZpbmUgdGhlIGZvbGxvd2luZyBtYWNyb3MgYmVmb3JlCisgKiB1c2luZyB0aGlzIGxpYnJhcnkuCisgKgorICogI2RlZmluZSBfc2VxYnVmIAkJIG5hbWUgb2YgdGhlIGJ1ZmZlciAodW5zaWduZWQgY2hhcltdKSAKKyAqICNkZWZpbmUgX1NFUV9BRFZCVUYobGVuKQkgSWYgdGhlIGFwcGxpYyBuZWVkcyB0byBrbm93IHRoZSBleGFjdAorICoJCQkJIHNpemUgb2YgdGhlIGV2ZW50LCB0aGlzIG1hY3JvIGNhbiBiZSB1c2VkLgorICoJCQkJIE90aGVyd2lzZSB0aGlzIG11c3QgYmUgZGVmaW5lZCBhcyBlbXB0eS4KKyAqICNkZWZpbmUgX3NlcWJ1ZnB0cgkJIERlZmluZSB0aGUgbmFtZSBvZiBpbmRleCB2YXJpYWJsZSBvciAwIGlmCisgKgkJCQkgbm90IHJlcXVpcmVkLiAKKyAqLworI2RlZmluZSBfU0VRX05FRURCVUYobGVuKQkvKiBlbXB0eSAqLworI2VuZGlmCisjZW5kaWYgLyogIU9TU0xJQiAqLworCisjZGVmaW5lIFNFUV9WT0xVTUVfTU9ERShkZXYsIG1vZGUpIFwKKwkJCQl7X1NFUV9ORUVEQlVGKDgpO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHJdID0gU0VRX0VYVEVOREVEO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrMV0gPSBTRVFfVk9MTU9ERTtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzJdID0gKGRldik7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0ciszXSA9IChtb2RlKTtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzRdID0gMDtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzVdID0gMDtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzZdID0gMDtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzddID0gMDtcCisJCQkJX1NFUV9BRFZCVUYoOCk7fQorCisvKgorICogTWlkaSB2b2ljZSBtZXNzYWdlcworICovCisKKyNkZWZpbmUgX0NITl9WT0lDRShkZXYsIGV2ZW50LCBjaG4sIG5vdGUsIHBhcm0pIFwKKwkJCQl7X1NFUV9ORUVEQlVGKDgpO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHJdID0gRVZfQ0hOX1ZPSUNFO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrMV0gPSAoZGV2KTtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzJdID0gKGV2ZW50KTtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzNdID0gKGNobik7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cis0XSA9IChub3RlKTtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzVdID0gKHBhcm0pO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrNl0gPSAoMCk7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cis3XSA9IDA7XAorCQkJCV9TRVFfQURWQlVGKDgpO30KKworI2RlZmluZSBTRVFfU1RBUlRfTk9URShkZXYsIGNobiwgbm90ZSwgdm9sKSBcCisJCQlfQ0hOX1ZPSUNFKGRldiwgTUlESV9OT1RFT04sIGNobiwgbm90ZSwgdm9sKQorCisjZGVmaW5lIFNFUV9TVE9QX05PVEUoZGV2LCBjaG4sIG5vdGUsIHZvbCkgXAorCQkJX0NITl9WT0lDRShkZXYsIE1JRElfTk9URU9GRiwgY2huLCBub3RlLCB2b2wpCisKKyNkZWZpbmUgU0VRX0tFWV9QUkVTU1VSRShkZXYsIGNobiwgbm90ZSwgcHJlc3N1cmUpIFwKKwkJCV9DSE5fVk9JQ0UoZGV2LCBNSURJX0tFWV9QUkVTU1VSRSwgY2huLCBub3RlLCBwcmVzc3VyZSkKKworLyoKKyAqIE1pZGkgY2hhbm5lbCBtZXNzYWdlcworICovCisKKyNkZWZpbmUgX0NITl9DT01NT04oZGV2LCBldmVudCwgY2huLCBwMSwgcDIsIHcxNCkgXAorCQkJCXtfU0VRX05FRURCVUYoOCk7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cl0gPSBFVl9DSE5fQ09NTU9OO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrMV0gPSAoZGV2KTtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzJdID0gKGV2ZW50KTtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzNdID0gKGNobik7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cis0XSA9IChwMSk7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cis1XSA9IChwMik7XAorCQkJCSooc2hvcnQgKikmX3NlcWJ1Zltfc2VxYnVmcHRyKzZdID0gKHcxNCk7XAorCQkJCV9TRVFfQURWQlVGKDgpO30KKy8qCisgKiBTRVFfU1lTRVggcGVybWl0cyBzZW5kaW5nIG9mIHN5c2V4IG1lc3NhZ2VzLiAoSXQgbWF5IGxvb2sgdGhhdCBpdCBwZXJtaXRzCisgKiBzZW5kaW5nIGFueSBNSURJIGJ5dGVzIGJ1dCBpdCdzIGFic29sdXRlbHkgbm90IHBvc3NpYmxlLiBUcnlpbmcgdG8gZG8KKyAqIHNvIF93aWxsXyBjYXVzZSBwcm9ibGVtcyB3aXRoIE1QVTQwMSBpbnRlbGxpZ2VudCBtb2RlKS4KKyAqCisgKiBTeXNleCBtZXNzYWdlcyBhcmUgc2VudCBpbiBibG9ja3Mgb2YgMSB0byA2IGJ5dGVzLiBMb25nZXIgbWVzc2FnZXMgbXVzdCBiZSAKKyAqIHNlbnQgYnkgY2FsbGluZyBTRVFfU1lTRVgoKSBzZXZlcmFsIHRpbWVzICh0aGVyZSBtdXN0IGJlIG5vIG90aGVyIGV2ZW50cworICogYmV0d2VlbiB0aGVtKS4gRmlyc3Qgc3lzZXggZnJhZ21lbnQgbXVzdCBoYXZlIDB4ZjAgaW4gdGhlIGZpcnN0IGJ5dGUKKyAqIGFuZCB0aGUgbGFzdCBieXRlIChidWZbbGVuLTFdIG9mIHRoZSBsYXN0IGZyYWdtZW50IG11c3QgYmUgMHhmNy4gTm8gYnl0ZQorICogYmV0d2VlbiB0aGVzZSBzeXNleCBzdGFydCBhbmQgZW5kIG1hcmtlcnMgY2Fubm90IGJlIGxhcmdlciB0aGFuIDB4N2YuIEFsc28KKyAqIGxlbmd0aHMgb2YgZWFjaCBmcmFnbWVudHMgKGV4Y2VwdCB0aGUgbGFzdCBvbmUpIG11c3QgYmUgNi4KKyAqCisgKiBCcmVha2luZyB0aGUgYWJvdmUgcnVsZXMgbWF5IHdvcmsgd2l0aCBzb21lIE1JREkgcG9ydHMgYnV0IGlzIGxpa2VseSB0bworICogY2F1c2UgZmF0YWwgcHJvYmxlbXMgd2l0aCBzb21lIG90aGVyIGRldmljZXMgKHN1Y2ggYXMgTVBVNDAxKS4KKyAqLworI2RlZmluZSBTRVFfU1lTRVgoZGV2LCBidWYsIGxlbikgXAorCQkJCXtpbnQgaWksIGxsPShsZW4pOyBcCisJCQkJIHVuc2lnbmVkIGNoYXIgKmJ1ZnA9YnVmO1wKKwkJCQkgaWYgKGxsPjYpbGw9NjtcCisJCQkJX1NFUV9ORUVEQlVGKDgpO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHJdID0gRVZfU1lTRVg7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisxXSA9IChkZXYpO1wKKwkJCQlmb3IoaWk9MDtpaTxsbDtpaSsrKVwKKwkJCQkgICBfc2VxYnVmW19zZXFidWZwdHIraWkrMl0gPSBidWZwW2lpXTtcCisJCQkJZm9yKGlpPWxsO2lpPDY7aWkrKylcCisJCQkJICAgX3NlcWJ1Zltfc2VxYnVmcHRyK2lpKzJdID0gMHhmZjtcCisJCQkJX1NFUV9BRFZCVUYoOCk7fQorCisjZGVmaW5lIFNFUV9DSE5fUFJFU1NVUkUoZGV2LCBjaG4sIHByZXNzdXJlKSBcCisJCV9DSE5fQ09NTU9OKGRldiwgTUlESV9DSE5fUFJFU1NVUkUsIGNobiwgcHJlc3N1cmUsIDAsIDApCisKKyNkZWZpbmUgU0VRX1NFVF9QQVRDSCBTRVFfUEdNX0NIQU5HRQorI2lmZGVmIE9TU0xJQgorIyAgIGRlZmluZSBTRVFfUEdNX0NIQU5HRShkZXYsIGNobiwgcGF0Y2gpIFwKKwkJe09TU19wYXRjaF9jYWNoaW5nKGRldiwgY2huLCBwYXRjaCwgc2VxZmQsIF9zZXFidWYsIF9zZXFidWZsZW4pOyBcCisJCSBfQ0hOX0NPTU1PTihkZXYsIE1JRElfUEdNX0NIQU5HRSwgY2huLCBwYXRjaCwgMCwgMCk7fQorI2Vsc2UKKyMgICBkZWZpbmUgU0VRX1BHTV9DSEFOR0UoZGV2LCBjaG4sIHBhdGNoKSBcCisJCV9DSE5fQ09NTU9OKGRldiwgTUlESV9QR01fQ0hBTkdFLCBjaG4sIHBhdGNoLCAwLCAwKQorI2VuZGlmCisKKyNkZWZpbmUgU0VRX0NPTlRST0woZGV2LCBjaG4sIGNvbnRyb2xsZXIsIHZhbHVlKSBcCisJCV9DSE5fQ09NTU9OKGRldiwgTUlESV9DVExfQ0hBTkdFLCBjaG4sIGNvbnRyb2xsZXIsIDAsIHZhbHVlKQorCisjZGVmaW5lIFNFUV9CRU5ERVIoZGV2LCBjaG4sIHZhbHVlKSBcCisJCV9DSE5fQ09NTU9OKGRldiwgTUlESV9QSVRDSF9CRU5ELCBjaG4sIDAsIDAsIHZhbHVlKQorCisjZGVmaW5lIFNFUV9WMl9YX0NPTlRST0woZGV2LCB2b2ljZSwgY29udHJvbGxlciwgdmFsdWUpCVwKKwkJCQl7X1NFUV9ORUVEQlVGKDgpO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHJdID0gU0VRX0VYVEVOREVEO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrMV0gPSBTRVFfQ09OVFJPTExFUjtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzJdID0gKGRldik7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0ciszXSA9ICh2b2ljZSk7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cis0XSA9IChjb250cm9sbGVyKTtcCisJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzVdID0gKCh2YWx1ZSkmMHhmZik7XAorCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cis2XSA9ICgodmFsdWU+PjgpJjB4ZmYpO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrN10gPSAwO1wKKwkJCQlfU0VRX0FEVkJVRig4KTt9CisvKgorICogVGhlIGZvbGxvd2luZyA1IG1hY3JvcyBhcmUgaW5jb3JyZWN0bHkgaW1wbGVtZW50ZWQgYW5kIG9ic29sZXRlLgorICogVXNlIFNFUV9CRU5ERVIgYW5kIFNFUV9DT05UUk9MICh3aXRoIHByb3BlciBjb250cm9sbGVyKSBpbnN0ZWFkLgorICovCisjZGVmaW5lIFNFUV9QSVRDSEJFTkQoZGV2LCB2b2ljZSwgdmFsdWUpIFwKKwlTRVFfVjJfWF9DT05UUk9MKGRldiwgdm9pY2UsIENUUkxfUElUQ0hfQkVOREVSLCB2YWx1ZSkKKyNkZWZpbmUgU0VRX0JFTkRFUl9SQU5HRShkZXYsIHZvaWNlLCB2YWx1ZSkgXAorCVNFUV9WMl9YX0NPTlRST0woZGV2LCB2b2ljZSwgQ1RSTF9QSVRDSF9CRU5ERVJfUkFOR0UsIHZhbHVlKQorI2RlZmluZSBTRVFfRVhQUkVTU0lPTihkZXYsIHZvaWNlLCB2YWx1ZSkgXAorCVNFUV9DT05UUk9MKGRldiwgdm9pY2UsIENUTF9FWFBSRVNTSU9OLCB2YWx1ZSoxMjgpCisjZGVmaW5lIFNFUV9NQUlOX1ZPTFVNRShkZXYsIHZvaWNlLCB2YWx1ZSkgXAorCVNFUV9DT05UUk9MKGRldiwgdm9pY2UsIENUTF9NQUlOX1ZPTFVNRSwgKHZhbHVlKjE2MzgzKS8xMDApCisjZGVmaW5lIFNFUV9QQU5OSU5HKGRldiwgdm9pY2UsIHBvcykgXAorCVNFUV9DT05UUk9MKGRldiwgdm9pY2UsIENUTF9QQU4sIChwb3MrMTI4KSAvIDIpCisKKy8qCisgKiBUaW1pbmcgYW5kIHN5bmNyb25pemF0aW9uIG1hY3JvcworICovCisKKyNkZWZpbmUgX1RJTUVSX0VWRU5UKGV2LCBwYXJtKQl7X1NFUV9ORUVEQlVGKDgpO1wKKwkJCSAJX3NlcWJ1Zltfc2VxYnVmcHRyKzBdID0gRVZfVElNSU5HOyBcCisJCQkgCV9zZXFidWZbX3NlcWJ1ZnB0cisxXSA9IChldik7IFwKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrMl0gPSAwO1wKKwkJCQlfc2VxYnVmW19zZXFidWZwdHIrM10gPSAwO1wKKwkJCSAJKih1bnNpZ25lZCBpbnQgKikmX3NlcWJ1Zltfc2VxYnVmcHRyKzRdID0gKHBhcm0pOyBcCisJCQkJX1NFUV9BRFZCVUYoOCk7fQorCisjZGVmaW5lIFNFUV9TVEFSVF9USU1FUigpCQlfVElNRVJfRVZFTlQoVE1SX1NUQVJULCAwKQorI2RlZmluZSBTRVFfU1RPUF9USU1FUigpCQlfVElNRVJfRVZFTlQoVE1SX1NUT1AsIDApCisjZGVmaW5lIFNFUV9DT05USU5VRV9USU1FUigpCQlfVElNRVJfRVZFTlQoVE1SX0NPTlRJTlVFLCAwKQorI2RlZmluZSBTRVFfV0FJVF9USU1FKHRpY2tzKQkJX1RJTUVSX0VWRU5UKFRNUl9XQUlUX0FCUywgdGlja3MpCisjZGVmaW5lIFNFUV9ERUxUQV9USU1FKHRpY2tzKQkJX1RJTUVSX0VWRU5UKFRNUl9XQUlUX1JFTCwgdGlja3MpCisjZGVmaW5lIFNFUV9FQ0hPX0JBQ0soa2V5KQkJX1RJTUVSX0VWRU5UKFRNUl9FQ0hPLCBrZXkpCisjZGVmaW5lIFNFUV9TRVRfVEVNUE8odmFsdWUpCQlfVElNRVJfRVZFTlQoVE1SX1RFTVBPLCB2YWx1ZSkKKyNkZWZpbmUgU0VRX1NPTkdQT1MocG9zKQkJX1RJTUVSX0VWRU5UKFRNUl9TUFAsIHBvcykKKyNkZWZpbmUgU0VRX1RJTUVfU0lHTkFUVVJFKHNpZykJCV9USU1FUl9FVkVOVChUTVJfVElNRVNJRywgc2lnKQorCisvKgorICogTG9jYWwgY29udHJvbCBldmVudHMKKyAqLworCisjZGVmaW5lIF9MT0NBTF9FVkVOVChldiwgcGFybSkJCXtfU0VRX05FRURCVUYoOCk7XAorCQkJCSAJX3NlcWJ1Zltfc2VxYnVmcHRyKzBdID0gRVZfU0VRX0xPQ0FMOyBcCisJCQkJIAlfc2VxYnVmW19zZXFidWZwdHIrMV0gPSAoZXYpOyBcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisyXSA9IDA7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrM10gPSAwO1wKKwkJCQkgCSoodW5zaWduZWQgaW50ICopJl9zZXFidWZbX3NlcWJ1ZnB0cis0XSA9IChwYXJtKTsgXAorCQkJCQlfU0VRX0FEVkJVRig4KTt9CisKKyNkZWZpbmUgU0VRX1BMQVlBVURJTyhkZXZtYXNrKQkJX0xPQ0FMX0VWRU5UKExPQ0xfU1RBUlRBVURJTywgZGV2bWFzaykKKyNkZWZpbmUgU0VRX1BMQVlBVURJTzIoZGV2bWFzaykJCV9MT0NBTF9FVkVOVChMT0NMX1NUQVJUQVVESU8yLCBkZXZtYXNrKQorI2RlZmluZSBTRVFfUExBWUFVRElPMyhkZXZtYXNrKQkJX0xPQ0FMX0VWRU5UKExPQ0xfU1RBUlRBVURJTzMsIGRldm1hc2spCisjZGVmaW5lIFNFUV9QTEFZQVVESU80KGRldm1hc2spCQlfTE9DQUxfRVZFTlQoTE9DTF9TVEFSVEFVRElPNCwgZGV2bWFzaykKKy8qCisgKiBFdmVudHMgZm9yIHRoZSBsZXZlbCAxIGludGVyZmFjZSBvbmx5IAorICovCisKKyNkZWZpbmUgU0VRX01JRElPVVQoZGV2aWNlLCBieXRlKQl7X1NFUV9ORUVEQlVGKDQpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyXSA9IFNFUV9NSURJUFVUQztcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisxXSA9IChieXRlKTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisyXSA9IChkZXZpY2UpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzNdID0gMDtcCisJCQkJCV9TRVFfQURWQlVGKDQpO30KKworLyoKKyAqIFBhdGNoIGxvYWRpbmcuCisgKi8KKyNpZmRlZiBPU1NMSUIKKyMgICBkZWZpbmUgU0VRX1dSUEFUQ0gocGF0Y2h4LCBsZW4pIFwKKwkJT1NTX3dyaXRlX3BhdGNoKHNlcWZkLCAoY2hhciopKHBhdGNoeCksIGxlbikKKyMgICBkZWZpbmUgU0VRX1dSUEFUQ0gyKHBhdGNoeCwgbGVuKSBcCisJCU9TU193cml0ZV9wYXRjaDIoc2VxZmQsIChjaGFyKikocGF0Y2h4KSwgbGVuKQorI2Vsc2UKKyMgICBkZWZpbmUgU0VRX1dSUEFUQ0gocGF0Y2h4LCBsZW4pIFwKKwkJe2lmIChfc2VxYnVmcHRyKSBTRVFfRFVNUEJVRigpO1wKKwkJIGlmICh3cml0ZShzZXFmZCwgKGNoYXIqKShwYXRjaHgpLCBsZW4pPT0tMSkgXAorCQkgICAgcGVycm9yKCJXcml0ZSBwYXRjaDogL2Rldi9zZXF1ZW5jZXIiKTt9CisjICAgZGVmaW5lIFNFUV9XUlBBVENIMihwYXRjaHgsIGxlbikgXAorCQkoU0VRX0RVTVBCVUYoKSwgd3JpdGUoc2VxZmQsIChjaGFyKikocGF0Y2h4KSwgbGVuKSkKKyNlbmRpZgorCisjZW5kaWYKKyNlbmRpZiAvKiBpZm5kZWYgRElTQUJMRV9TRVFVRU5DRVIgKi8KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpb2N0bCBjb21tYW5kcyBmb3IgdGhlIC9kZXYvbWlkaSMjIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNORENUTF9NSURJX1BSRVRJTUUJX19TSU9XUignbScsIDAsIGludCkKKworI2lmIDAKKy8qCisgKiBUaGUgU05EQ1RMX01JRElfTVBVTU9ERSBhbmQgU05EQ1RMX01JRElfTVBVQ01EIGNhbGxzCisgKiBhcmUgY29tcGxldGVseSBvYnNvbGV0ZS4gVGhlIGhhcmR3YXJlIGRldmljZSAoTVBVLTQwMSAiaW50ZWxsaWdlbnQgbW9kZSIKKyAqIGFuZCBjb21wYXRpYmxlcykgaGFzIGRpc2FwcGVhcmVkIGZyb20gdGhlIG1hcmtldCAxMCB5ZWFycyBhZ28gc28gdGhlcmUgCisgKiBpcyBubyBuZWVkIGZvciB0aGlzIHN0dWZmLiBUaGUgTVBVLTQwMSAiVUFSVCIgbW9kZSBkZXZpY2VzIGRvbid0IHN1cHBvcnQKKyAqIHRoaXMgc3R1ZmYuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGNoYXIgY21kOworICBjaGFyIG5yX2FyZ3MsIG5yX3JldHVybnM7CisgIHVuc2lnbmVkIGNoYXIgZGF0YVszMF07Cit9IG1wdV9jb21tYW5kX3JlYzsKKworI2RlZmluZSBTTkRDVExfTUlESV9NUFVNT0RFCV9fU0lPV1IoJ20nLCAxLCBpbnQpCisjZGVmaW5lIFNORENUTF9NSURJX01QVUNNRAlfX1NJT1dSKCdtJywgMiwgbXB1X2NvbW1hbmRfcmVjKQorI2VuZGlmCisKKy8qCisgKiBTTkRDVExfTUlESV9NVENJTlBVVCB0dXJucyBvbiBhIG1vZGUgd2hlcmUgT1NTIGF1dG9tYXRpY2FsbHkgaW5zZXJ0cworICogTVRDIHF1YXJ0ZXIgZnJhbWUgbWVzc2FnZXMgKEYxIHh4KSB0byB0aGUgaW5wdXQuCisgKiBUaGUgYXJndW1lbnQgaXMgdGhlIE1UQyBtb2RlOgorICoKKyAqIAktMSA9IFR1cm4gTVRDIG1lc3NhZ2VzIE9GRiAoZGVmYXVsdCkKKyAqCTI0ID0gMjQgRlBTIAorICoJMjUgPSAyNSBGUFMgCisgKgkyOSA9IDMwIEZQUyBkcm9wIGZyYW1lCisgKgkzMCA9IDMwIEZQUyAKKyAqCisgKiBOb3RlIHRoYXQgMjUgRlBTIG1vZGUgaXMgcHJvYmFibHkgdGhlIG9ubHkgbW9kZSB0aGF0IGlzIHN1cHBvcnRlZC4gT3RoZXIKKyAqIG1vZGVzIG1heSBiZSBzdXBwb3J0ZWQgaW4gdGhlIGZ1dHVyZSB2ZXJzaW9ucyBvZiBPU1MsIDI1IEZQUyBpcyBoYW5keSAKKyAqIGJlY2F1c2UgaXQgZ2VuZXJhdGVzIDI1KjQ9MTAwIHF1YXJ0ZXIgZnJhbWUgbWVzc2FnZXMgcGVyIHNlY29uZCB3aGljaAorICogbWF0Y2hlcyB0aGUgdXN1YWwgMTAwIEhaIHN5c3RlbSB0aW1lciByYXRlKS4KKyAqCisgKiBUaGUgcXVhcnRlciBmcmFtZSB0aW1lciB3aWxsIGJlIHJlc2V0IHRvIDA6MDA6MDA6MDAuMCBhdCB0aGUgbW9tZW50IHRoaXMKKyAqIGlvY3RsIGlzIG1hZGUuCisgKi8KKyNkZWZpbmUgU05EQ1RMX01JRElfTVRDSU5QVVQJX19TSU9XUignbScsIDMsIGludCkKKworLyoKKyAqIE1UQy9TTVBURSB0aW1lIGNvZGUgcmVjb3JkIChmb3IgZnV0dXJlIHVzZSkKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciBob3VycywgbWludXRlcywgc2Vjb25kcywgZnJhbWVzLCBxZnJhbWVzOworICBjaGFyIGRpcmVjdGlvbjsKKyNkZWZpbmUgTVRDX0RJUl9TVE9QUEVECQkgMAorI2RlZmluZSBNVENfRElSX0ZPUldBUkQJCSAxCisjZGVmaW5lIE1UQ19ESVJfQkFDS1dBUkQJLTEKKyAgdW5zaWduZWQgY2hhciB0aW1lX2NvZGVfdHlwZTsKKyAgdW5zaWduZWQgaW50IGZsYWdzOworfSBvc3NfbXRjX2RhdGFfdDsKKworI2RlZmluZSBTTkRDVExfTUlESV9TRVRNT0RFCV9fU0lPV1IoJ20nLCA2LCBpbnQpCisjCWRlZmluZSBNSURJX01PREVfVFJBRElUSU9OQUwJMAorIwlkZWZpbmUgTUlESV9NT0RFX1RJTUVECQkxCS8qIElucHV0IHRpbWVzIGFyZSBpbiBNSURJIHRpY2tzICovCisjCWRlZmluZSBNSURJX01PREVfVElNRURfQUJTICAJMgkvKiBJbnB1dCB0aW1lcyBhcmUgYWJzb2x1dGUgKHVzZWNzKSAqLworCisvKgorICogUGFja2V0IGhlYWRlciBmb3IgTUlESV9NT0RFX1RJTUVEIGFuZCBNSURJX01PREVfVElNRURfQUJTCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIG9zc19taWRpX3RpbWVfdDsJLyogVmFyaWFibGUgdHlwZSBmb3IgTUlESSB0aW1lIChjbG9jayB0aWNrcykgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IG1hZ2ljOwkJCS8qIEluaXRpYWxpemUgdG8gTUlESV9IRFJfTUFHSUMgKi8KKyNkZWZpbmUgTUlESV9IRFJfTUFHSUMJLTEKKyAgdW5zaWduZWQgc2hvcnQgZXZlbnRfdHlwZTsKKyNkZWZpbmUgTUlESV9FVl9XUklURQkJCTAJLyogV3JpdGUgb3IgcmVhZCAod2l0aCBwYXlsb2FkKSAqLworI2RlZmluZSBNSURJX0VWX1RFTVBPCQkJMQorI2RlZmluZSBNSURJX0VWX0VDSE8JCQkyCisjZGVmaW5lIE1JRElfRVZfU1RBUlQJCQkzCisjZGVmaW5lIE1JRElfRVZfU1RPUAkJCTQKKyNkZWZpbmUgTUlESV9FVl9DT05USU5VRQkJNQorI2RlZmluZSBNSURJX0VWX1hQUkVTU1dSSVRFCQk2CisjZGVmaW5lIE1JRElfRVZfVElNRUJBU0UJCTcKKyNkZWZpbmUgTUlESV9FVl9ERVZDVEwJCQk4CS8qIERldmljZSBjb250cm9sIHJlYWQvd3JpdGUgKi8KKyAgdW5zaWduZWQgc2hvcnQgb3B0aW9uczsKKyNkZWZpbmUgTUlESV9PUFRfTk9ORQkJCTB4MDAwMAorI2RlZmluZSBNSURJX09QVF9USU1FRAkJCTB4MDAwMQorI2RlZmluZSBNSURJX09QVF9DT05USU5VQVRJT04JCTB4MDAwMgorI2RlZmluZSBNSURJX09QVF9VU0VDVElNRQkJMHgwMDA0CS8qIFRpbWUgaXMgYWJzb2x1dGUgKGluIHVzZWNzKSAqLworI2RlZmluZSBNSURJX09QVF9CVVNZCQkJMHgwMDA4CS8qIFJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UgKi8KKyAgb3NzX21pZGlfdGltZV90IHRpbWU7CisgIGludCBwYXJtOworICBpbnQgZmlsbGVyWzNdOwkJLyogRnVyIGZ1dHVyZSBleHBhbnNpb24gLSBpbml0IHRvIHplcm9zICovCit9IG1pZGlfcGFja2V0X2hlYWRlcl90OworLyogCisgKiBNSURJX1BBWUxPQURfU0laRSBpcyB0aGUgbWF4aW11bSBzaXplIG9mIG9uZSBNSURJIGlucHV0IGNodW5rLiBJdCBtdXN0IGJlCisgKiBsZXNzIChvciBlcXVhbCkgdGhhbiAxMDI0IHdoaWNoIGlzIHRoZSByZWFkIHNpemUgcmVjb21tZW5kZWQgaW4gdGhlIAorICogZG9jdW1lbnRhdGlvbi4gVE9ETzogRXhwbGFpbiB0aGlzIGJldHRlci4KKyAqLworI2RlZmluZSBNSURJX1BBWUxPQURfU0laRQkJMTAwMAorCit0eXBlZGVmIHN0cnVjdAoreworICBtaWRpX3BhY2tldF9oZWFkZXJfdCBoZHI7CisgIHVuc2lnbmVkIGNoYXIgcGF5bG9hZFtNSURJX1BBWUxPQURfU0laRV07Cit9IG1pZGlfcGFja2V0X3Q7CisKKyNkZWZpbmUgU05EQ1RMX01JRElfVElNRUJBU0UJCV9fU0lPV1IoJ20nLCA3LCBpbnQpCisjZGVmaW5lIFNORENUTF9NSURJX1RFTVBPCQlfX1NJT1dSKCdtJywgOCwgaW50KQorLyoKKyAqIFVzZXIgbGFuZCBNSURJIHNlcnZlcnMgKHN5bnRocykgY2FuIHVzZSBTTkRDVExfTUlESV9TRVRfTEFURU5DWQorICogdG8gcmVxdWVzdCBNSURJIGV2ZW50cyB0byBiZSBzZW50IHRvIHRoZW0gaW4gYWR2YW5jZS4gVGhlIHBhcmFtZXRlcgorICogKGluIG1pY3Jvc2Vjb25kcykgdGVsbHMgaG93IG11Y2ggYmVmb3JlIHRoZSBldmVudHMgYXJlIHN1Ym1pdHRlZC4KKyAqCisgKiBUaGlzIGZlYXR1cmUgaXMgb25seSB2YWxpZCBmb3IgbG9vcGJhY2sgZGV2aWNlcyBhbmQgcG9zc2libHkgc29tZSBvdGhlcgorICogdHlwZXMgb2YgdmlydHVhbCBkZXZpY2VzLgorICovCisjZGVmaW5lIFNORENUTF9NSURJX1NFVF9MQVRFTkNZCQlfX1NJT1cgKCdtJywgOSwgaW50KQorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJT0NUTCBjb21tYW5kcyBmb3IgL2Rldi9kc3AKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFNORENUTF9EU1BfSEFMVAkJCV9fU0lPICAoJ1AnLCAwKQorI2RlZmluZSBTTkRDVExfRFNQX1JFU0VUCQlTTkRDVExfRFNQX0hBTFQJLyogT2xkIG5hbWUgKi8KKyNkZWZpbmUgU05EQ1RMX0RTUF9TWU5DCQkJX19TSU8gICgnUCcsIDEpCisjZGVmaW5lIFNORENUTF9EU1BfU1BFRUQJCV9fU0lPV1IoJ1AnLCAyLCBpbnQpCisKKy8qIFNORENUTF9EU1BfU1RFUkVPIGlzIG9ic29sZXRlIC0gdXNlIFNORENUTF9EU1BfQ0hBTk5FTFMgaW5zdGVhZCAqLworI2RlZmluZSBTTkRDVExfRFNQX1NURVJFTwkJX19TSU9XUignUCcsIDMsIGludCkKKy8qIFNORENUTF9EU1BfU1RFUkVPIGlzIG9ic29sZXRlIC0gdXNlIFNORENUTF9EU1BfQ0hBTk5FTFMgaW5zdGVhZCAqLworCisjZGVmaW5lIFNORENUTF9EU1BfR0VUQkxLU0laRQkJX19TSU9XUignUCcsIDQsIGludCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9TQU1QTEVTSVpFCQlTTkRDVExfRFNQX1NFVEZNVAorI2RlZmluZSBTTkRDVExfRFNQX0NIQU5ORUxTCQlfX1NJT1dSKCdQJywgNiwgaW50KQorI2RlZmluZSBTTkRDVExfRFNQX1BPU1QJCQlfX1NJTyAgKCdQJywgOCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9TVUJESVZJREUJCV9fU0lPV1IoJ1AnLCA5LCBpbnQpCisjZGVmaW5lIFNORENUTF9EU1BfU0VURlJBR01FTlQJCV9fU0lPV1IoJ1AnLDEwLCBpbnQpCisKKy8qIEF1ZGlvIGRhdGEgZm9ybWF0cyAoTm90ZSEgVTg9OCBhbmQgUzE2X0xFPTE2IGZvciBjb21wYXRpYmlsaXR5KSAqLworI2RlZmluZSBTTkRDVExfRFNQX0dFVEZNVFMJCV9fU0lPUiAoJ1AnLDExLCBpbnQpCS8qIFJldHVybnMgYSBtYXNrICovCisjZGVmaW5lIFNORENUTF9EU1BfU0VURk1UCQlfX1NJT1dSKCdQJyw1LCBpbnQpCS8qIFNlbGVjdHMgT05FIGZtdCAqLworIwlkZWZpbmUgQUZNVF9RVUVSWQkweDAwMDAwMDAwCS8qIFJldHVybiBjdXJyZW50IGZtdCAqLworIwlkZWZpbmUgQUZNVF9NVV9MQVcJMHgwMDAwMDAwMQorIwlkZWZpbmUgQUZNVF9BX0xBVwkweDAwMDAwMDAyCisjCWRlZmluZSBBRk1UX0lNQV9BRFBDTQkweDAwMDAwMDA0CisjCWRlZmluZSBBRk1UX1U4CQkweDAwMDAwMDA4CisjCWRlZmluZSBBRk1UX1MxNl9MRQkweDAwMDAwMDEwCS8qIExpdHRsZSBlbmRpYW4gc2lnbmVkIDE2ICovCisjCWRlZmluZSBBRk1UX1MxNl9CRQkweDAwMDAwMDIwCS8qIEJpZyBlbmRpYW4gc2lnbmVkIDE2ICovCisjCWRlZmluZSBBRk1UX1M4CQkweDAwMDAwMDQwCisjCWRlZmluZSBBRk1UX1UxNl9MRQkweDAwMDAwMDgwCS8qIExpdHRsZSBlbmRpYW4gVTE2ICovCisjCWRlZmluZSBBRk1UX1UxNl9CRQkweDAwMDAwMTAwCS8qIEJpZyBlbmRpYW4gVTE2ICovCisjCWRlZmluZSBBRk1UX01QRUcJMHgwMDAwMDIwMAkvKiBNUEVHICgyKSBhdWRpbyAqLworCisvKiBBQzMgX2NvbXByZXNzZWRfIGJpdHN0cmVhbXMgKFNlZSBQcm9ncmFtbWVyJ3MgR3VpZGUgZm9yIGRldGFpbHMpLiAqLworIwlkZWZpbmUgQUZNVF9BQzMJCTB4MDAwMDA0MDAKKy8qIE9nZyBWb3JiaXMgX2NvbXByZXNzZWRfIGJpdCBzdHJlYW1zICovCisjCWRlZmluZSBBRk1UX1ZPUkJJUwkweDAwMDAwODAwCisKKy8qIDMyIGJpdCBmb3JtYXRzIChNU0IgYWxpZ25lZCkgZm9ybWF0cyAqLworIwlkZWZpbmUgQUZNVF9TMzJfTEUJMHgwMDAwMTAwMAorIwlkZWZpbmUgQUZNVF9TMzJfQkUJMHgwMDAwMjAwMAorCisvKiBSZXNlcnZlZCBmb3IgX25hdGl2ZV8gZW5kaWFuIGRvdWJsZSBwcmVjaXNpb24gSUVFRSBmbG9hdGluZyBwb2ludCAqLworIwlkZWZpbmUgQUZNVF9GTE9BVAkweDAwMDA0MDAwCisKKy8qIDI0IGJpdCBmb3JtYXRzIChMU0IgYWxpZ25lZCBpbiAzMiBiaXQgd29yZCkgZm9ybWF0cyAqLworIwlkZWZpbmUgQUZNVF9TMjRfTEUJMHgwMDAwODAwMAorIwlkZWZpbmUgQUZNVF9TMjRfQkUJMHgwMDAxMDAwMAorCisvKgorICogUy9QRElGIHJhdyBmb3JtYXQuIEluIHRoaXMgZm9ybWF0IHRoZSBTL1BESUYgZnJhbWVzIChpbmNsdWRpbmcgYWxsCisgKiBjb250cm9sIGFuZCB1c2VyIGJpdHMpIGFyZSBpbmNsdWRlZCBpbiB0aGUgZGF0YSBzdHJlYW0uIEVhY2ggc2FtcGxlCisgKiBpcyBzdG9yZWQgaW4gYSAzMiBiaXQgZnJhbWUgKHNlZSBJRUMtOTU4IGZvciBtb3JlIGluZm8pLiBUaGlzIGZvcm1hdAorICogaXMgc3VwcG9ydGVkIGJ5IHZlcnkgZmV3IGRldmljZXMgYW5kIGl0J3Mgb25seSB1c2FibGUgZm9yIHB1cnBvc2VzCisgKiB3aGVyZSBmdWxsIGFjY2VzcyB0byB0aGUgY29udHJvbC91c2VyIGJpdHMgaXMgcmVxdWlyZWQgKHJlYWwgdGltZSBjb250cm9sKS4KKyAqLworIwlkZWZpbmUgQUZNVF9TUERJRl9SQVcJMHgwMDAyMDAwMAorCisvKiAyNCBiaXQgcGFja2VkICgzIGJ5dGUpIGxpdHRsZSBlbmRpYW4gZm9ybWF0IChVU0IgY29tcGF0aWJpbGl0eSkgKi8KKyMJZGVmaW5lIEFGTVRfUzI0X1BBQ0tFRAkweDAwMDQwMDAwCisKKworLyoKKyAqIFNvbWUgYmlnIGVuZGlhbi9saXR0bGUgZW5kaWFuIGhhbmRsaW5nIG1hY3JvcyAobmF0aXZlIGVuZGlhbiBhbmQgb3Bwb3NpdGUKKyAqIGVuZGlhbiBmb3JtYXRzKS4gVGhlIHVzYWdlIG9mIHRoZXNlIG1hY3JvcyBpcyBkZXNjcmliZWQgaW4gdGhlIE9TUworICogUHJvZ3JhbW1lcidzIE1hbnVhbC4KKyAqLworCisjaWYgZGVmaW5lZChfQUlYKSB8fCBkZWZpbmVkKEFJWCkgfHwgZGVmaW5lZChzcGFyYykgfHwgZGVmaW5lZChfX2hwcGEpIHx8IGRlZmluZWQoUFBDKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSAmJiAhZGVmaW5lZChpMzg2KSAmJiAhZGVmaW5lZChfX2kzODYpICYmICFkZWZpbmVkKF9faTM4Nl9fKQorCisvKiBCaWcgZW5kaWFuIG1hY2hpbmVzICovCisjICBkZWZpbmUgX1BBVENIS0VZKGlkKSAoMHhmZDAwfGlkKQorIyAgZGVmaW5lIEFGTVRfUzE2X05FIEFGTVRfUzE2X0JFCisjICBkZWZpbmUgQUZNVF9VMTZfTkUgQUZNVF9VMTZfQkUKKyMgIGRlZmluZSBBRk1UX1MzMl9ORSBBRk1UX1MzMl9CRQorIyAgZGVmaW5lIEFGTVRfUzI0X05FIEFGTVRfUzI0X0JFCisjICBkZWZpbmUgQUZNVF9TMTZfT0UgQUZNVF9TMTZfTEUKKyMgIGRlZmluZSBBRk1UX1MzMl9PRSBBRk1UX1MzMl9MRQorIyAgZGVmaW5lIEFGTVRfUzI0X09FIEFGTVRfUzI0X0xFCisjZWxzZQorIyAgZGVmaW5lIF9QQVRDSEtFWShpZCkgKChpZDw8OCl8MHhmZCkKKyMgIGRlZmluZSBBRk1UX1MxNl9ORSBBRk1UX1MxNl9MRQorIyAgZGVmaW5lIEFGTVRfVTE2X05FIEFGTVRfVTE2X0xFCisjICBkZWZpbmUgQUZNVF9TMzJfTkUgQUZNVF9TMzJfTEUKKyMgIGRlZmluZSBBRk1UX1MyNF9ORSBBRk1UX1MyNF9MRQorIyAgZGVmaW5lIEFGTVRfUzE2X09FIEFGTVRfUzE2X0JFCisjICBkZWZpbmUgQUZNVF9TMzJfT0UgQUZNVF9TMzJfQkUKKyMgIGRlZmluZSBBRk1UX1MyNF9PRSBBRk1UX1MyNF9CRQorI2VuZGlmCisvKgorICogQnVmZmVyIHN0YXR1cyBxdWVyaWVzLgorICovCit0eXBlZGVmIHN0cnVjdCBhdWRpb19idWZfaW5mbworeworICBpbnQgZnJhZ21lbnRzOwkJLyogIyBvZiBhdmFpbGFibGUgZnJhZ21lbnRzIChwYXJ0aWFsbHkgdXNlbmQgb25lcyBub3QgY291bnRlZCkgKi8KKyAgaW50IGZyYWdzdG90YWw7CQkvKiBUb3RhbCAjIG9mIGZyYWdtZW50cyBhbGxvY2F0ZWQgKi8KKyAgaW50IGZyYWdzaXplOwkJCS8qIFNpemUgb2YgYSBmcmFnbWVudCBpbiBieXRlcyAqLworICBpbnQgYnl0ZXM7CQkJLyogQXZhaWxhYmxlIHNwYWNlIGluIGJ5dGVzIChpbmNsdWRlcyBwYXJ0aWFsbHkgdXNlZCBmcmFnbWVudHMpICovCisgIC8qIE5vdGUhICdieXRlcycgY291bGQgYmUgbW9yZSB0aGFuIGZyYWdtZW50cypmcmFnc2l6ZSAqLworfSBhdWRpb19idWZfaW5mbzsKKworI2RlZmluZSBTTkRDVExfRFNQX0dFVE9TUEFDRQkJX19TSU9SICgnUCcsMTIsIGF1ZGlvX2J1Zl9pbmZvKQorI2RlZmluZSBTTkRDVExfRFNQX0dFVElTUEFDRQkJX19TSU9SICgnUCcsMTMsIGF1ZGlvX2J1Zl9pbmZvKQorI2RlZmluZSBTTkRDVExfRFNQX0dFVENBUFMJCV9fU0lPUiAoJ1AnLDE1LCBpbnQpCisjCWRlZmluZSBQQ01fQ0FQX1JFVklTSU9OCQkweDAwMDAwMGZmCS8qIEJpdHMgZm9yIHJldmlzaW9uIGxldmVsICgwIHRvIDI1NSkgKi8KKyMJZGVmaW5lIFBDTV9DQVBfRFVQTEVYCQkweDAwMDAwMTAwCS8qIEZ1bGwgZHVwbGV4IHJlY29yZC9wbGF5YmFjayAqLworIwlkZWZpbmUgUENNX0NBUF9SRUFMVElNRQkJMHgwMDAwMDIwMAkvKiBOb3QgaW4gdXNlICovCisjCWRlZmluZSBQQ01fQ0FQX0JBVENICQkweDAwMDAwNDAwCS8qIERldmljZSBoYXMgc29tZSBraW5kIG9mICovCisJCQkJCQkJLyogaW50ZXJuYWwgYnVmZmVycyB3aGljaCBtYXkgKi8KKwkJCQkJCQkvKiBjYXVzZSBzb21lIGRlbGF5cyBhbmQgKi8KKwkJCQkJCQkvKiBkZWNyZWFzZSBwcmVjaXNpb24gb2YgdGltaW5nICovCisjCWRlZmluZSBQQ01fQ0FQX0NPUFJPQwkJMHgwMDAwMDgwMAkvKiBIYXMgYSBjb3Byb2Nlc3NvciAqLworCQkJCQkJCS8qIFNvbWV0aW1lcyBpdCdzIGEgRFNQICovCisJCQkJCQkJLyogYnV0IHVzdWFsbHkgbm90ICovCisjCWRlZmluZSBQQ01fQ0FQX1RSSUdHRVIJCTB4MDAwMDEwMDAJLyogU3VwcG9ydHMgU0VUVFJJR0dFUiAqLworIwlkZWZpbmUgUENNX0NBUF9NTUFQCQkweDAwMDAyMDAwCS8qIFN1cHBvcnRzIG1tYXAoKSAqLworIwlkZWZpbmUgUENNX0NBUF9NVUxUSQkJMHgwMDAwNDAwMAkvKiBTdXBwb3J0cyBtdWx0aXBsZSBvcGVuICovCisjCWRlZmluZSBQQ01fQ0FQX0JJTkQJCTB4MDAwMDgwMDAJLyogU3VwcG9ydHMgYmluZGluZyB0byBmcm9udC9yZWFyL2NlbnRlci9sZmUgKi8KKyMgICAJZGVmaW5lIFBDTV9DQVBfSU5QVVQJCTB4MDAwMTAwMDAJLyogU3VwcG9ydHMgcmVjb3JkaW5nICovCisjICAgCWRlZmluZSBQQ01fQ0FQX09VVFBVVAkJMHgwMDAyMDAwMAkvKiBTdXBwb3J0cyBwbGF5YmFjayAqLworIwlkZWZpbmUgUENNX0NBUF9WSVJUVUFMCQkweDAwMDQwMDAwCS8qIFZpcnR1YWwgZGV2aWNlICovCisvKiAweDAwMDQwMDAwIGFuZCAweDAwMDgwMDAwIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisKKy8qIEFuYWxvZy9kaWdpdGFsIGNvbnRyb2wgY2FwYWJpbGl0aWVzICovCisjCWRlZmluZSBQQ01fQ0FQX0FOQUxPR09VVAkweDAwMTAwMDAwCisjCWRlZmluZSBQQ01fQ0FQX0FOQUxPR0lOCQkweDAwMjAwMDAwCisjCWRlZmluZSBQQ01fQ0FQX0RJR0lUQUxPVVQJMHgwMDQwMDAwMAorIwlkZWZpbmUgUENNX0NBUF9ESUdJVEFMSU4JMHgwMDgwMDAwMAorIwlkZWZpbmUgUENNX0NBUF9BRE1BU0sJCTB4MDBmMDAwMDAKKy8qCisgKiBOT1RFISAoY2FwYWJpbGl0aWVzICYgUENNX0NBUF9BRE1BU0spPT0wIG1lYW5zIGp1c3QgdGhhdCB0aGUKKyAqIGRpZ2l0YWwvYW5hbG9nIGludGVyZmFjZSBjb250cm9sIGZlYXR1cmVzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSAKKyAqIGRldmljZS9kcml2ZXIuIEhvd2V2ZXIgdGhlIGRldmljZSBzdGlsbCBzdXBwb3J0cyBhbmFsb2csIGRpZ2l0YWwgb3IKKyAqIGJvdGggaW5wdXRzL291dHB1dHMgKGRlcGVuZGluZyBvbiB0aGUgZGV2aWNlKS4gU2VlIHRoZSBPU1MgUHJvZ3JhbW1lcidzCisgKiBHdWlkZSBmb3IgZnVsbCBkZXRhaWxzLgorICovCisjCWRlZmluZSBQQ01fQ0FQX1NIQURPVwkJMHgwMTAwMDAwMAkvKiAiU2hhZG93IiBkZXZpY2UgKi8KKworLyoKKyAqIFByZWZlcnJlZCBjaGFubmVsIHVzYWdlLiBUaGVzZSBiaXRzIGNhbiBiZSB1c2VkIHRvCisgKiBnaXZlIHJlY29tbWVuZGF0aW9ucyB0byB0aGUgYXBwbGljYXRpb24uIFVzZWQgYnkgZmV3IGRyaXZlcnMuCisgKiBGb3IgZXhhbXBsZSBpZiAoKGNhcHMgJiBEU1BfQ0hfTUFTSykgPT0gRFNQX0NIX01PTk8pIG1lYW5zIHRoYXQKKyAqIHRoZSBkZXZpY2Ugd29ya3MgYmVzdCBpbiBtb25vIG1vZGUuIEhvd2V2ZXIgaXQgZG9lc24ndCBuZWNlc3NhcmlseSBtZWFuCisgKiB0aGF0IHRoZSBkZXZpY2UgY2Fubm90IGJlIHVzZWQgaW4gc3RlcmVvLiBUaGVzZSBiaXRzIHNob3VsZCBvbmx5IGJlIHVzZWQKKyAqIGJ5IHNwZWNpYWwgYXBwbGljYXRpb25zIHN1Y2ggYXMgbXVsdGkgdHJhY2sgaGFyZCBkaXNrIHJlY29yZGVycyB0byBmaW5kCisgKiBvdXQgdGhlIGluaXRpYWwgc2V0dXAuIEhvd2V2ZXIgdGhlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gb3ZlcnJpZGUgdGhpcworICogc2VsZWN0aW9uLgorICoKKyAqIFRvIGZpbmQgb3V0IHdoaWNoIG1vZGVzIGFyZSBhY3R1YWxseSBzdXBwb3J0ZWQgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCAKKyAqIHRyeSB0byBzZWxlY3QgdGhlbSB1c2luZyBTTkRDVExfRFNQX0NIQU5ORUxTLgorICovCisjCWRlZmluZSBEU1BfQ0hfTUFTSwkJMHgwNjAwMDAwMAkvKiBNYXNrICovCisjCWRlZmluZSBEU1BfQ0hfQU5ZCQkweDAwMDAwMDAwCS8qIE5vIHByZWZlcnJlZCBtb2RlICovCisjCWRlZmluZSBEU1BfQ0hfTU9OTwkJMHgwMjAwMDAwMAorIwlkZWZpbmUgRFNQX0NIX1NURVJFTwkJMHgwNDAwMDAwMAorIwlkZWZpbmUgRFNQX0NIX01VTFRJCQkweDA2MDAwMDAwCS8qIE1vcmUgdGhhbiB0d28gY2hhbm5lbHMgKi8KKworIwlkZWZpbmUgUENNX0NBUF9ISURERU4JCTB4MDgwMDAwMDAJLyogSGlkZGVuIGRldmljZSAqLworIwlkZWZpbmUgUENNX0NBUF9GUkVFUkFURQkJMHgxMDAwMDAwMAorIwlkZWZpbmUgUENNX0NBUF9NT0RFTQkJMHgyMDAwMDAwMAkvKiBNb2RlbSBkZXZpY2UgKi8KKyMJZGVmaW5lIFBDTV9DQVBfREVGQVVMVAkJMHg0MDAwMDAwMAkvKiAiRGVmYXVsdCIgZGV2aWNlICovCisKKy8qCisgKiBUaGUgUENNX0NBUF8qIGNhcGFiaWxpdHkgbmFtZXMgd2VyZSBrbm93biBhcyBEU1BfQ0FQXyogcHJpb3IgT1NTIDQuMAorICogc28gaXQncyBuZWNlc3NhcnkgdG8gZGVmaW5lIHRoZSBvbGRlciBuYW1lcyB0b28uCisgKi8KKyNkZWZpbmUgRFNQX0NBUF9BRE1BU0sJCVBDTV9DQVBfQURNQVNLCisjZGVmaW5lIERTUF9DQVBfQU5BTE9HSU4JUENNX0NBUF9BTkFMT0dJTgorI2RlZmluZSBEU1BfQ0FQX0FOQUxPR09VVAlQQ01fQ0FQX0FOQUxPR09VVAorI2RlZmluZSBEU1BfQ0FQX0JBVENICQlQQ01fQ0FQX0JBVENICisjZGVmaW5lIERTUF9DQVBfQklORAkJUENNX0NBUF9CSU5ECisjZGVmaW5lIERTUF9DQVBfQ09QUk9DCQlQQ01fQ0FQX0NPUFJPQworI2RlZmluZSBEU1BfQ0FQX0RFRkFVTFQJCVBDTV9DQVBfREVGQVVMVAorI2RlZmluZSBEU1BfQ0FQX0RJR0lUQUxJTglQQ01fQ0FQX0RJR0lUQUxJTgorI2RlZmluZSBEU1BfQ0FQX0RJR0lUQUxPVVQJUENNX0NBUF9ESUdJVEFMT1VUCisjZGVmaW5lIERTUF9DQVBfRFVQTEVYCQlQQ01fQ0FQX0RVUExFWAorI2RlZmluZSBEU1BfQ0FQX0ZSRUVSQVRFCVBDTV9DQVBfRlJFRVJBVEUKKyNkZWZpbmUgRFNQX0NBUF9ISURERU4JCVBDTV9DQVBfSElEREVOCisjZGVmaW5lIERTUF9DQVBfSU5QVVQJCVBDTV9DQVBfSU5QVVQKKyNkZWZpbmUgRFNQX0NBUF9NTUFQCQlQQ01fQ0FQX01NQVAKKyNkZWZpbmUgRFNQX0NBUF9NT0RFTQkJUENNX0NBUF9NT0RFTQorI2RlZmluZSBEU1BfQ0FQX01VTFRJCQlQQ01fQ0FQX01VTFRJCisjZGVmaW5lIERTUF9DQVBfT1VUUFVUCQlQQ01fQ0FQX09VVFBVVAorI2RlZmluZSBEU1BfQ0FQX1JFQUxUSU1FCVBDTV9DQVBfUkVBTFRJTUUKKyNkZWZpbmUgRFNQX0NBUF9SRVZJU0lPTglQQ01fQ0FQX1JFVklTSU9OCisjZGVmaW5lIERTUF9DQVBfU0hBRE9XCQlQQ01fQ0FQX1NIQURPVworI2RlZmluZSBEU1BfQ0FQX1RSSUdHRVIJCVBDTV9DQVBfVFJJR0dFUgorI2RlZmluZSBEU1BfQ0FQX1ZJUlRVQUwJCVBDTV9DQVBfVklSVFVBTAorCisjZGVmaW5lIFNORENUTF9EU1BfR0VUVFJJR0dFUgkJX19TSU9SICgnUCcsMTYsIGludCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9TRVRUUklHR0VSCQlfX1NJT1cgKCdQJywxNiwgaW50KQorIwlkZWZpbmUgUENNX0VOQUJMRV9JTlBVVAkJMHgwMDAwMDAwMQorIwlkZWZpbmUgUENNX0VOQUJMRV9PVVRQVVQJMHgwMDAwMDAwMgorCit0eXBlZGVmIHN0cnVjdCBjb3VudF9pbmZvCit7CisgIHVuc2lnbmVkIGludCBieXRlczsJCS8qIFRvdGFsICMgb2YgYnl0ZXMgcHJvY2Vzc2VkICovCisgIGludCBibG9ja3M7CQkJLyogIyBvZiBmcmFnbWVudCB0cmFuc2l0aW9ucyBzaW5jZSBsYXN0IHRpbWUgKi8KKyAgaW50IHB0cjsJCQkvKiBDdXJyZW50IERNQSBwb2ludGVyIHZhbHVlICovCit9IGNvdW50X2luZm87CisKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRJUFRSCQlfX1NJT1IgKCdQJywxNywgY291bnRfaW5mbykKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRPUFRSCQlfX1NJT1IgKCdQJywxOCwgY291bnRfaW5mbykKKwordHlwZWRlZiBzdHJ1Y3QgYnVmZm1lbV9kZXNjCit7CisgIHVuc2lnbmVkICpidWZmZXI7CisgIGludCBzaXplOworfSBidWZmbWVtX2Rlc2M7CisjZGVmaW5lIFNORENUTF9EU1BfU0VUU1lOQ1JPCQlfX1NJTyAgKCdQJywgMjEpCisjZGVmaW5lIFNORENUTF9EU1BfU0VURFVQTEVYCQlfX1NJTyAgKCdQJywgMjIpCisKKyNkZWZpbmUgU05EQ1RMX0RTUF9QUk9GSUxFCQlfX1NJT1cgKCdQJywgMjMsIGludCkJLyogT0JTT0xFVEUgKi8KKyNkZWZpbmUJICBBUEZfTk9STUFMCTAJLyogTm9ybWFsIGFwcGxpY2F0aW9ucyAqLworI2RlZmluZQkgIEFQRl9ORVRXT1JLCTEJLyogVW5kZXJydW5zIHByb2JhYmx5IGNhdXNlZCBieSBhbiAiZXh0ZXJuYWwiIGRlbGF5ICovCisjZGVmaW5lICAgQVBGX0NQVUlOVEVOUyAyCS8qIFVuZGVycnVucyBwcm9iYWJseSBjYXVzZWQgYnkgIm92ZXJoZWF0aW5nIiB0aGUgQ1BVICovCisKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRPREVMQVkJCV9fU0lPUiAoJ1AnLCAyMywgaW50KQorCit0eXBlZGVmIHN0cnVjdCBhdWRpb19lcnJpbmZvCit7CisgIGludCBwbGF5X3VuZGVycnVuczsKKyAgaW50IHJlY19vdmVycnVuczsKKyAgdW5zaWduZWQgaW50IHBsYXlfcHRyYWRqdXN0OworICB1bnNpZ25lZCBpbnQgcmVjX3B0cmFkanVzdDsKKyAgaW50IHBsYXlfZXJyb3Jjb3VudDsKKyAgaW50IHJlY19lcnJvcmNvdW50OworICBpbnQgcGxheV9sYXN0ZXJyb3I7CisgIGludCByZWNfbGFzdGVycm9yOworICBpbnQgcGxheV9lcnJvcnBhcm07CisgIGludCByZWNfZXJyb3JwYXJtOworICBpbnQgZmlsbGVyWzE2XTsKK30gYXVkaW9fZXJyaW5mbzsKKworI2RlZmluZSBTTkRDVExfRFNQX0dFVFBMQVlWT0wJCV9fU0lPUiAoJ1AnLCAyNCwgaW50KQorI2RlZmluZSBTTkRDVExfRFNQX1NFVFBMQVlWT0wJCV9fU0lPV1IoJ1AnLCAyNCwgaW50KQorI2RlZmluZSBTTkRDVExfRFNQX0dFVEVSUk9SCQlfX1NJT1IgKCdQJywgMjUsIGF1ZGlvX2VycmluZm8pCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERpZ2l0YWwgaW50ZXJmYWNlIChTL1BESUYpIGNvbnRyb2wgaW50ZXJmYWNlCisgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgb3NzX2RpZ2l0YWxfY29udHJvbAoreworICB1bnNpZ25lZCBpbnQgY2FwczsKKyNkZWZpbmUgRElHX0NCSVRJTl9OT05FCQkJMHgwMDAwMDAwMAorI2RlZmluZSBESUdfQ0JJVElOX0xJTUlURUQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRElHX0NCSVRJTl9EQVRBIAkJMHgwMDAwMDAwMgorI2RlZmluZSBESUdfQ0JJVElOX0JZVEUwCQkweDAwMDAwMDA0CisjZGVmaW5lIERJR19DQklUSU5fRlVMTCAJCTB4MDAwMDAwMDgKKyNkZWZpbmUgRElHX0NCSVRJTl9NQVNLIAkJMHgwMDAwMDAwZgorI2RlZmluZSBESUdfQ0JJVE9VVF9OT05FCQkweDAwMDAwMDAwCisjZGVmaW5lIERJR19DQklUT1VUX0xJTUlURUQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRElHX0NCSVRPVVRfQllURTAJCTB4MDAwMDAwMjAKKyNkZWZpbmUgRElHX0NCSVRPVVRfRlVMTCAJCTB4MDAwMDAwNDAKKyNkZWZpbmUgRElHX0NCSVRPVVRfREFUQSAJCTB4MDAwMDAwODAKKyNkZWZpbmUgRElHX0NCSVRPVVRfTUFTSyAJCTB4MDAwMDAwZjAKKyNkZWZpbmUgRElHX1VCSVRJTgkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgRElHX1VCSVRPVVQJCQkweDAwMDAwMjAwCisjZGVmaW5lIERJR19WQklUT1VUCQkJMHgwMDAwMDQwMAorI2RlZmluZSBESUdfT1VUUkFURQkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgRElHX0lOUkFURQkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgRElHX0lOQklUUwkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgRElHX09VVEJJVFMJCQkweDAwMDA0MDAwCisjZGVmaW5lIERJR19FWEFDVAkJCTB4MDAwMTAwMDAKKyNkZWZpbmUgRElHX1BSTwkJCQkweDAwMDIwMDAwCisjZGVmaW5lIERJR19DT05TVU1FUgkJCTB4MDAwNDAwMDAKKyNkZWZpbmUgRElHX1BBU1NUSFJPVUdICQkJMHgwMDA4MDAwMAorI2RlZmluZSBESUdfT1VUU0VMCQkJMHgwMDEwMDAwMAorCisgIHVuc2lnbmVkIGludCB2YWxpZDsKKyNkZWZpbmUgVkFMX0NCSVRJTgkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgVkFMX1VCSVRJTgkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgVkFMX0NCSVRPVVQJCQkweDAwMDAwMDA0CisjZGVmaW5lIFZBTF9VQklUT1VUCQkJMHgwMDAwMDAwOAorI2RlZmluZSBWQUxfSVNUQVRVUwkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgVkFMX0lSQVRFCQkJMHgwMDAwMDAyMAorI2RlZmluZSBWQUxfT1JBVEUJCQkweDAwMDAwMDQwCisjZGVmaW5lIFZBTF9JTkJJVFMJCQkweDAwMDAwMDgwCisjZGVmaW5lIFZBTF9PVVRCSVRTCQkJMHgwMDAwMDEwMAorI2RlZmluZSBWQUxfUkVRVUVTVAkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgVkFMX09VVFNFTAkJCTB4MDAwMDA0MDAKKworI2RlZmluZSBWQUxfT1VUTUFTSyAoVkFMX0NCSVRPVVR8VkFMX1VCSVRPVVR8VkFMX09SQVRFfFZBTF9PVVRCSVRTfFZBTF9PVVRTRUwpCisKKyAgdW5zaWduZWQgaW50IHJlcXVlc3QsIHBhcmFtOworI2RlZmluZSBTUERfUlFfUEFTU1RIUk9VR0gJCQkJMQorCisgIHVuc2lnbmVkIGNoYXIgY2JpdGluWzI0XTsKKyAgdW5zaWduZWQgY2hhciB1Yml0aW5bMjRdOworICB1bnNpZ25lZCBjaGFyIGNiaXRvdXRbMjRdOworICB1bnNpZ25lZCBjaGFyIHViaXRvdXRbMjRdOworCisgIHVuc2lnbmVkIGludCBvdXRzZWw7CisjZGVmaW5lIE9VVFNFTF9ESUdJVEFMCQkxCisjZGVmaW5lIE9VVFNFTF9BTkFMT0cJCTIKKyNkZWZpbmUgT1VUU0VMX0JPVEgJCShPVVRTRUxfRElHSVRBTHxPVVRTRUxfQU5BTE9HKQorCisgIGludCBpbl9kYXRhOwkJCS8qIEF1ZGlvL2RhdGEgaWYgYXV0b2RldGVjdGFibGUgYnkgdGhlIHJlY2VpdmVyICovCisjZGVmaW5lIElORF9VTktOT1dOCQkwCisjZGVmaW5lIElORF9BVURJTwkJMQorI2RlZmluZSBJTkRfREFUQQkJMgorCisgIGludCBpbl9sb2NrZWQ7CQkvKiBSZWNlaXZlciBsb2NrZWQgKi8KKyNkZWZpbmUgTE9DS19OT1RfSU5ESUNBVEVECTAKKyNkZWZpbmUgTE9DS19VTkxPQ0tFRAkJMQorI2RlZmluZSBMT0NLX0xPQ0tFRAkJMgorCisgIGludCBpbl9xdWFsaXR5OwkJLyogSW5wdXQgc2lnbmFsIHF1YWxpdHkgKi8KKyNkZWZpbmUgSU5fUVVBTF9OT1RfSU5ESUNBVEVECTAKKyNkZWZpbmUgSU5fUVVBTF9QT09SCQkxCisjZGVmaW5lIElOX1FVQUxfR09PRAkJMgorCisgIGludCBpbl92Yml0LCBvdXRfdmJpdDsJLyogViBiaXRzICovCisjZGVmaW5lIFZCSVRfTk9UX0lORElDQVRFRAkwCisjZGVmaW5lIFZCSVRfT0ZGCQkxCisjZGVmaW5lIFZCSVRfT04JCQkyCisKKyAgdW5zaWduZWQgaW50IGluX2Vycm9yczsJLyogVmFyaW91cyBpbnB1dCBlcnJvciBjb25kaXRpb25zICovCisjZGVmaW5lIElORVJSX0NSQwkJMHgwMDAxCisjZGVmaW5lIElORVJSX1FDT0RFX0NSQwkJMHgwMDAyCisjZGVmaW5lIElORVJSX1BBUklUWQkJMHgwMDA0CisjZGVmaW5lIElORVJSX0JJUEhBU0UJCTB4MDAwOAorCisgIGludCBzcmF0ZV9pbiwgc3JhdGVfb3V0OworICBpbnQgYml0c19pbiwgYml0c19vdXQ7CisKKyAgaW50IGZpbGxlclszMl07Cit9IG9zc19kaWdpdGFsX2NvbnRyb2w7CisKKyNkZWZpbmUgU05EQ1RMX0RTUF9SRUFEQ1RMCQlfX1NJT1dSKCdQJywgMjYsIG9zc19kaWdpdGFsX2NvbnRyb2wpCisjZGVmaW5lIFNORENUTF9EU1BfV1JJVEVDVEwJCV9fU0lPV1IoJ1AnLCAyNywgb3NzX2RpZ2l0YWxfY29udHJvbCkKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTeW5jIGdyb3VwcyBmb3IgYXVkaW8gZGV2aWNlcworICovCit0eXBlZGVmIHN0cnVjdCBvc3Nfc3luY2dyb3VwCit7CisgIGludCBpZDsKKyAgaW50IG1vZGU7CisgIGludCBmaWxsZXJbMTZdOworfSBvc3Nfc3luY2dyb3VwOworCisjZGVmaW5lIFNORENUTF9EU1BfU1lOQ0dST1VQCQlfX1NJT1dSKCdQJywgMjgsIG9zc19zeW5jZ3JvdXApCisjZGVmaW5lIFNORENUTF9EU1BfU1lOQ1NUQVJUCQlfX1NJT1cgKCdQJywgMjksIGludCkKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogImNvb2tlZCIgbW9kZSBlbmFibGVzIHNvZnR3YXJlIGJhc2VkIGNvbnZlcnNpb25zIGZvciBzYW1wbGUgcmF0ZSwgc2FtcGxlCisgKiBmb3JtYXQgKGJpdHMpIGFuZCBudW1iZXIgb2YgY2hhbm5lbHMgKG1vbm8vc3RlcmVvKS4gVGhlc2UgY29udmVyc2lvbnMgYXJlCisgKiByZXF1aXJlZCB3aXRoIHNvbWUgZGV2aWNlcyB0aGF0IHN1cHBvcnQgb25seSBvbmUgc2FtcGxlIHJhdGUgb3IganVzdCBzdGVyZW8KKyAqIHRvIGxldCB0aGUgYXBwbGljYXRpb25zIHRvIHVzZSBvdGhlciBmb3JtYXRzLiBUaGUgY29va2VkIG1vZGUgaXMgZW5hYmxlZCBieQorICogZGVmYXVsdC4gSG93ZXZlciBpdCdzIG5lY2Vzc2FyeSB0byBkaXNhYmxlIHRoaXMgbW9kZSB3aGVuIG1tYXAoKSBpcyB1c2VkIG9yCisgKiB3aGVuIHZlcnkgZGV0ZXJtaW5pc3RpYyB0aW1pbmcgaXMgcmVxdWlyZWQuIFNORENUTF9EU1BfQ09PS0VETU9ERSBpcyBhbgorICogb3B0aW9uYWwgY2FsbCBpbnRyb2R1Y2VkIGluIE9TUyAzLjkuNmYuIEl0J3MgX2Vycm9yIHJldHVybiBtdXN0IGJlIGlnbm9yZWRfCisgKiBzaW5jZSBub3JtYWxseSB0aGlzIGNhbGwgd2lsbCByZXR1cm4gZXJubz1FSU5WQUwuCisgKgorICogU05EQ1RMX0RTUF9DT09LRURNT0RFIG11c3QgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIG9wZW4gYmVmb3JlIGRvaW5nCisgKiBhbnl0aGluZyBlbHNlLiBPdGhlcndpc2UgdGhlIGNhbGwgd2lsbCBub3QgaGF2ZSBhbnkgZWZmZWN0LgorICovCisjZGVmaW5lIFNORENUTF9EU1BfQ09PS0VETU9ERQkJX19TSU9XICgnUCcsIDMwLCBpbnQpCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNORENUTF9EU1BfU0lMRU5DRSBhbmQgU05EQ1RMX0RTUF9TS0lQIGFyZSBuZXcgY2FsbHMgaW4gT1NTIDMuOTkuMAorICogdGhhdCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgcGF1c2UvY29udGludWUgZHVyaW5nIHBsYXliYWNrIChubyBlZmZlY3QKKyAqIG9uIHJlY29yZGluZykuCisgKi8KKyNkZWZpbmUgU05EQ1RMX0RTUF9TSUxFTkNFCQlfX1NJTyAgKCdQJywgMzEpCisjZGVmaW5lIFNORENUTF9EU1BfU0tJUAkJCV9fU0lPICAoJ1AnLCAzMikKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWJvcnQgdHJhbnNmZXIgKHJlc2V0KSBmdW5jdGlvbnMgZm9yIGlucHV0IGFuZCBvdXRwdXQKKyAqLworI2RlZmluZSBTTkRDVExfRFNQX0hBTFRfSU5QVVQJCV9fU0lPICAoJ1AnLCAzMykKKyNkZWZpbmUgU05EQ1RMX0RTUF9SRVNFVF9JTlBVVAlTTkRDVExfRFNQX0hBTFRfSU5QVVQJLyogT2xkIG5hbWUgKi8KKyNkZWZpbmUgU05EQ1RMX0RTUF9IQUxUX09VVFBVVAkJX19TSU8gICgnUCcsIDM0KQorI2RlZmluZSBTTkRDVExfRFNQX1JFU0VUX09VVFBVVAlTTkRDVExfRFNQX0hBTFRfT1VUUFVUCS8qIE9sZCBuYW1lICovCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExvdyB3YXRlciBsZXZlbCBjb250cm9sCisgKi8KKyNkZWZpbmUgU05EQ1RMX0RTUF9MT1dfV0FURVIJCV9fU0lPVyAoJ1AnLCAzNCwgaW50KQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIDY0IGJpdCBwb2ludGVyIHN1cHBvcnQuIE9ubHkgYXZhaWxhYmxlIGluIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQKKyAqIHRoZSA2NCBiaXQgKGxvbmcgbG9uZykgaW50ZWdlciB0eXBlLgorICovCisjaWZuZGVmIE9TU19OT19MT05HX0xPTkcKK3R5cGVkZWYgc3RydWN0Cit7CisgIGxvbmcgbG9uZyBzYW1wbGVzOworICBpbnQgZmlmb19zYW1wbGVzOworICBpbnQgZmlsbGVyWzMyXTsJCS8qIEZvciBmdXR1cmUgdXNlICovCit9IG9zc19jb3VudF90OworCisjZGVmaW5lIFNORENUTF9EU1BfQ1VSUkVOVF9JUFRSCQlfX1NJT1IgKCdQJywgMzUsIG9zc19jb3VudF90KQorI2RlZmluZSBTTkRDVExfRFNQX0NVUlJFTlRfT1BUUgkJX19TSU9SICgnUCcsIDM2LCBvc3NfY291bnRfdCkKKyNlbmRpZgorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEludGVyZmFjZSBmb3Igc2VsZWN0aW5nIHJlY29yZGluZyBzb3VyY2VzIGFuZCBwbGF5YmFjayBvdXRwdXQgcm91dGluZ3MuCisgKi8KKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRfUkVDU1JDX05BTUVTCV9fU0lPUiAoJ1AnLCAzNywgb3NzX21peGVyX2VudW1pbmZvKQorI2RlZmluZSBTTkRDVExfRFNQX0dFVF9SRUNTUkMJCV9fU0lPUiAoJ1AnLCAzOCwgaW50KQorI2RlZmluZSBTTkRDVExfRFNQX1NFVF9SRUNTUkMJCV9fU0lPV1IoJ1AnLCAzOCwgaW50KQorCisjZGVmaW5lIFNORENUTF9EU1BfR0VUX1BMQVlUR1RfTkFNRVMJX19TSU9SICgnUCcsIDM5LCBvc3NfbWl4ZXJfZW51bWluZm8pCisjZGVmaW5lIFNORENUTF9EU1BfR0VUX1BMQVlUR1QJCV9fU0lPUiAoJ1AnLCA0MCwgaW50KQorI2RlZmluZSBTTkRDVExfRFNQX1NFVF9QTEFZVEdUCQlfX1NJT1dSKCdQJywgNDAsIGludCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRSRUNWT0wJCV9fU0lPUiAoJ1AnLCA0MSwgaW50KQorI2RlZmluZSBTTkRDVExfRFNQX1NFVFJFQ1ZPTAkJX19TSU9XUignUCcsIDQxLCBpbnQpCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTb21lIGNhbGxzIGZvciBzZXR0aW5nIHRoZSBjaGFubmVsIGFzc2lnbm1lbnQgd2l0aCBtdWx0aSBjaGFubmVsIGRldmljZXMKKyAqIChzZWUgdGhlIG1hbnVhbCBmb3IgZGV0YWlscykuCisgKi8KKyNpZm5kZWYgT1NTX05PX0xPTkdfTE9ORworI2RlZmluZSBTTkRDVExfRFNQX0dFVF9DSE5PUkRFUgkJX19TSU9SICgnUCcsIDQyLCB1bnNpZ25lZCBsb25nIGxvbmcpCisjZGVmaW5lIFNORENUTF9EU1BfU0VUX0NITk9SREVSCQlfX1NJT1dSKCdQJywgNDIsIHVuc2lnbmVkIGxvbmcgbG9uZykKKyMJZGVmaW5lIENISURfVU5ERUYJMAorIwlkZWZpbmUgQ0hJRF9MCQkxCisjCWRlZmluZSBDSElEX1IJCTIKKyMJZGVmaW5lIENISURfQwkJMworIwlkZWZpbmUgQ0hJRF9MRkUJCTQKKyMJZGVmaW5lIENISURfTFMJCTUKKyMJZGVmaW5lIENISURfUlMJCTYKKyMJZGVmaW5lIENISURfTFIJCTcKKyMJZGVmaW5lIENISURfUlIJCTgKKyNkZWZpbmUgQ0hOT1JERVJfVU5ERUYJCTB4MDAwMDAwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBDSE5PUkRFUl9OT1JNQUwJCTB4MDAwMDAwMDA4NzY1NDMyMVVMTAorI2VuZGlmCisKKyNkZWZpbmUgTUFYX1BFQUtfQ0hBTk5FTFMJMTI4Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IG9zc19wZWFrc190W01BWF9QRUFLX0NIQU5ORUxTXTsKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRJUEVBS1MJCV9fU0lPUignUCcsIDQzLCBvc3NfcGVha3NfdCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRPUEVBS1MJCV9fU0lPUignUCcsIDQ0LCBvc3NfcGVha3NfdCkKKworI2RlZmluZSBTTkRDVExfRFNQX1BPTElDWQkJX19TSU9XKCdQJywgNDUsIGludCkJLyogU2VlIHRoZSBtYW51YWwgKi8KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGZXcgaW9jdGwgY2FsbHMgdGhhdCBhcmUgbm90IG9mZmljaWFsIHBhcnRzIG9mIE9TUy4gVGhleSBoYXZlIGJlZW4gdXNlZAorICogYnkgZmV3IGZyZWV3YXJlIGltcGxlbWVudGF0aW9ucyBvZiBPU1MuCisgKi8KKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRDSEFOTkVMTUFTSwlfX1NJT1dSKCdQJywgNjQsIGludCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9CSU5EX0NIQU5ORUwJCV9fU0lPV1IoJ1AnLCA2NSwgaW50KQorIyAgICAgZGVmaW5lIERTUF9CSU5EX1FVRVJZICAgICAgICAgICAweDAwMDAwMDAwCisjICAgICBkZWZpbmUgRFNQX0JJTkRfRlJPTlQgICAgICAgICAgIDB4MDAwMDAwMDEKKyMgICAgIGRlZmluZSBEU1BfQklORF9TVVJSICAgICAgICAgICAgMHgwMDAwMDAwMgorIyAgICAgZGVmaW5lIERTUF9CSU5EX0NFTlRFUl9MRkUgICAgICAweDAwMDAwMDA0CisjICAgICBkZWZpbmUgRFNQX0JJTkRfSEFORFNFVCAgICAgICAgIDB4MDAwMDAwMDgKKyMgICAgIGRlZmluZSBEU1BfQklORF9NSUMgICAgICAgICAgICAgMHgwMDAwMDAxMAorIyAgICAgZGVmaW5lIERTUF9CSU5EX01PREVNMSAgICAgICAgICAweDAwMDAwMDIwCisjICAgICBkZWZpbmUgRFNQX0JJTkRfTU9ERU0yICAgICAgICAgIDB4MDAwMDAwNDAKKyMgICAgIGRlZmluZSBEU1BfQklORF9JMlMgICAgICAgICAgICAgMHgwMDAwMDA4MAorIyAgICAgZGVmaW5lIERTUF9CSU5EX1NQRElGICAgICAgICAgICAweDAwMDAwMTAwCisjICAgICBkZWZpbmUgRFNQX0JJTkRfUkVBUiAgICAgICAgICAgIDB4MDAwMDAyMDAKKworI2lmZGVmIHN1bgorLyogTm90IHBhcnQgb2YgT1NTLiBSZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlIGJ5IFNvbGFyaXMgKi8KKyNkZWZpbmUgWF9TQURBX0dFVF9QTEFZVEdUX01BU0sJX19TSU9SICgnUCcsIDY2LCBpbnQpCisjZGVmaW5lIFhfU0FEQV9HRVRfUExBWVRHVAlfX1NJT1IgKCdQJywgNjcsIGludCkKKyNkZWZpbmUgWF9TQURBX1NFVF9QTEFZVEdUCV9fU0lPV1IoJ1AnLCA2OCwgaW50KQorI2VuZGlmCisKKyNpZm5kZWYgTk9fTEVHQUNZX01JWEVSCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElPQ1RMIGNvbW1hbmRzIGZvciB0aGUgImxlZ2FjeSAiIC9kZXYvbWl4ZXIgQVBJIChvYnNvbGV0ZSkKKyAqCisgKiBNaXhlciBjb250cm9scworICoKKyAqIFRoZXJlIGNhbiBiZSB1cCB0byAyMCBkaWZmZXJlbnQgYW5hbG9nIG1peGVyIGNoYW5uZWxzLiBUaGUKKyAqIFNPVU5EX01JWEVSX05SREVWSUNFUyBnaXZlcyB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCBtYXhpbXVtLiAKKyAqIFRoZSBTT1VORF9NSVhFUl9SRUFEX0RFVk1BU0sgcmV0dXJucyBhIGJpdG1hc2sgd2hpY2ggdGVsbHMKKyAqIHRoZSBkZXZpY2VzIHN1cHBvcnRlZCBieSB0aGUgcGFydGljdWxhciBtaXhlci4KKyAqCisgKiB7IW5vdGljZSBUaGlzICJsZWdhY3kiIG1peGVyIEFQSSBpcyBvYnNvbGV0ZS4gSXQgaGFzIGJlZW4gc3VwZXJjZWRlZAorICogYnkgYSBuZXcgb25lIChzZWUgYmVsb3cpLgorICovCisKKyNkZWZpbmUgU09VTkRfTUlYRVJfTlJERVZJQ0VTCTI4CisjZGVmaW5lIFNPVU5EX01JWEVSX1ZPTFVNRQkwCisjZGVmaW5lIFNPVU5EX01JWEVSX0JBU1MJMQorI2RlZmluZSBTT1VORF9NSVhFUl9UUkVCTEUJMgorI2RlZmluZSBTT1VORF9NSVhFUl9TWU5USAkzCisjZGVmaW5lIFNPVU5EX01JWEVSX1BDTQkJNAorI2RlZmluZSBTT1VORF9NSVhFUl9TUEVBS0VSCTUKKyNkZWZpbmUgU09VTkRfTUlYRVJfTElORQk2CisjZGVmaW5lIFNPVU5EX01JWEVSX01JQwkJNworI2RlZmluZSBTT1VORF9NSVhFUl9DRAkJOAorI2RlZmluZSBTT1VORF9NSVhFUl9JTUlYCTkJLyogIFJlY29yZGluZyBtb25pdG9yICAqLworI2RlZmluZSBTT1VORF9NSVhFUl9BTFRQQ00JMTAKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVDTEVWCTExCS8qIFJlY29yZGluZyBsZXZlbCAqLworI2RlZmluZSBTT1VORF9NSVhFUl9JR0FJTgkxMgkvKiBJbnB1dCBnYWluICovCisjZGVmaW5lIFNPVU5EX01JWEVSX09HQUlOCTEzCS8qIE91dHB1dCBnYWluICovCisvKiAKKyAqIFNvbWUgc291bmRjYXJkcyBoYXZlIHRocmVlIGxpbmUgbGV2ZWwgaW5wdXRzIChsaW5lLCBhdXgxIGFuZCBhdXgyKS4gCisgKiBTaW5jZSBlYWNoIGNhcmQgbWFudWZhY3R1cmVyIGhhcyBhc3NpZ25lZCBkaWZmZXJlbnQgbWVhbmluZ3MgdG8gCisgKiB0aGVzZSBpbnB1dHMsIGl0J3MgaW1wcmFjdGljYWwgdG8gYXNzaWduIHNwZWNpZmljIG1lYW5pbmdzIAorICogKGVnIGxpbmUsIGNkLCBzeW50aCBldGMuKSB0byB0aGVtLgorICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0xJTkUxCTE0CS8qIElucHV0IHNvdXJjZSAxICAoYXV4MSkgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfTElORTIJMTUJLyogSW5wdXQgc291cmNlIDIgIChhdXgyKSAqLworI2RlZmluZSBTT1VORF9NSVhFUl9MSU5FMwkxNgkvKiBJbnB1dCBzb3VyY2UgMyAgKGxpbmUpICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0RJR0lUQUwxCTE3CS8qIERpZ2l0YWwgSS9PIDEgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfRElHSVRBTDIJMTgJLyogRGlnaXRhbCBJL08gMiAqLworI2RlZmluZSBTT1VORF9NSVhFUl9ESUdJVEFMMwkxOQkvKiBEaWdpdGFsIEkvTyAzICovCisjZGVmaW5lIFNPVU5EX01JWEVSX1BIT05FCTIwCS8qIFBob25lICovCisjZGVmaW5lIFNPVU5EX01JWEVSX01PTk8JMjEJLyogTW9ubyBPdXRwdXQgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfVklERU8JMjIJLyogVmlkZW8vVFYgKGF1ZGlvKSBpbiAqLworI2RlZmluZSBTT1VORF9NSVhFUl9SQURJTwkyMwkvKiBSYWRpbyBpbiAqLworI2RlZmluZSBTT1VORF9NSVhFUl9ERVBUSAkyNAkvKiBTdXJyb3VuZCBkZXB0aCAqLworI2RlZmluZSBTT1VORF9NSVhFUl9SRUFSVk9MCTI1CS8qIFJlYXIvU3Vycm91bmQgc3BlYWtlciB2b2wgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfQ0VOVEVSVk9MCTI2CS8qIENlbnRlci9MRkUgc3BlYWtlciB2b2wgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfU0lERVZPTAkyNwkvKiBTaWRlLVN1cnJvdW5kICg4c3BlYWtlcikgdm9sICovCisKKy8qCisgKiBXYXJuaW5nOiBTT1VORF9NSVhFUl9TVVJSVk9MIGlzIGFuIG9sZCBuYW1lIG9mIFNPVU5EX01JWEVSX1NJREVWT0wuCisgKiAgICAgICAgICBUaGV5IGFyZSBib3RoIGFzc2lnbmVkIHRvIHRoZSBzYW1lIG1peGVyIGNvbnRyb2wuIERvbid0CisgKiAgICAgICAgICB1c2UgYm90aCBjb250cm9sIG5hbWVzIGluIHRoZSBzYW1lIHByb2dyYW0vZHJpdmVyLgorICovCisjZGVmaW5lIFNPVU5EX01JWEVSX1NVUlJWT0wJU09VTkRfTUlYRVJfU0lERVZPTAorCisvKiBTb21lIG9uL29mZiBzZXR0aW5ncyAoU09VTkRfU1BFQ0lBTF9NSU4gLSBTT1VORF9TUEVDSUFMX01BWCkgKi8KKy8qIE5vdCBjb3VudGVkIHRvIFNPVU5EX01JWEVSX05SREVWSUNFUywgYnV0IHVzZSB0aGUgc2FtZSBudW1iZXIgc3BhY2UgKi8KKyNkZWZpbmUgU09VTkRfT05PRkZfTUlOCQkyOAorI2RlZmluZSBTT1VORF9PTk9GRl9NQVgJCTMwCisKKy8qIE5vdGUhCU51bWJlciAzMSBjYW5ub3QgYmUgdXNlZCBzaW5jZSB0aGUgc2lnbiBiaXQgaXMgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfTk9ORQkzMQorCisvKgorICogVGhlIGZvbGxvd2luZyB1bnN1cHBvcnRlZCBtYWNyb3MgYXJlIG5vIGxvbmdlciBmdW5jdGlvbmFsLgorICogVXNlIFNPVU5EX01JWEVSX1BSSVZBVEUjIG1hY3JvcyBpbiBmdXR1cmUuCisgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfRU5IQU5DRQlTT1VORF9NSVhFUl9OT05FCisjZGVmaW5lIFNPVU5EX01JWEVSX01VVEUJU09VTkRfTUlYRVJfTk9ORQorI2RlZmluZSBTT1VORF9NSVhFUl9MT1VECVNPVU5EX01JWEVSX05PTkUKKworI2RlZmluZSBTT1VORF9ERVZJQ0VfTEFCRUxTIFwKKwl7IlZvbCAgIiwgIkJhc3MgIiwgIlRyZWJsZSIsICJTeW50aCIsICJQY20gICIsICJTcGVha2VyICIsICJMaW5lICIsIFwKKwkgIk1pYyAgIiwgIkNEICAgIiwgIk1peCAgIiwgIlBjbTIgIiwgIlJlYyAgIiwgIklHYWluIiwgIk9HYWluIiwgXAorCSAiQXV4MSIsICJBdXgyIiwgIkF1eDMiLCAiRGlnaXRhbDEiLCAiRGlnaXRhbDIiLCAiRGlnaXRhbDMiLCBcCisJICJQaG9uZSIsICJNb25vIiwgIlZpZGVvIiwgIlJhZGlvIiwgIkRlcHRoIiwgXAorCSAiUmVhciIsICJDZW50ZXIiLCAiU2lkZSJ9CisKKyNkZWZpbmUgU09VTkRfREVWSUNFX05BTUVTIFwKKwl7InZvbCIsICJiYXNzIiwgInRyZWJsZSIsICJzeW50aCIsICJwY20iLCAic3BlYWtlciIsICJsaW5lIiwgXAorCSAibWljIiwgImNkIiwgIm1peCIsICJwY20yIiwgInJlYyIsICJpZ2FpbiIsICJvZ2FpbiIsIFwKKwkgImF1eDEiLCAiYXV4MiIsICJhdXgzIiwgImRpZzEiLCAiZGlnMiIsICJkaWczIiwgXAorCSAicGhvbmUiLCAibW9ubyIsICJ2aWRlbyIsICJyYWRpbyIsICJkZXB0aCIsIFwKKwkgInJlYXIiLCAiY2VudGVyIiwgInNpZGUifQorCisvKglEZXZpY2UgYml0bWFzayBpZGVudGlmaWVycwkqLworCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQ1NSQwkweGZmCS8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCByZWNvcmRpbmcgc291cmNlICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0RFVk1BU0sJMHhmZQkvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIGRldmljZSAqLworI2RlZmluZSBTT1VORF9NSVhFUl9SRUNNQVNLCTB4ZmQJLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHN1cHBvcnRlZCByZWNvcmRpbmcgc291cmNlICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0NBUFMJMHhmYworIwlkZWZpbmUgU09VTkRfQ0FQX0VYQ0xfSU5QVVQJMHgwMDAwMDAwMQkvKiBPbmx5IG9uZSByZWNvcmRpbmcgc291cmNlIGF0IGEgdGltZSAqLworIwlkZWZpbmUgU09VTkRfQ0FQX05PTEVHQUNZCTB4MDAwMDAwMDQJLyogRm9yIGludGVybmFsIHVzZSBvbmx5ICovCisjCWRlZmluZSBTT1VORF9DQVBfTk9SRUNTUkMJMHgwMDAwMDAwOAorI2RlZmluZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTCTB4ZmIJLyogTWl4ZXIgY2hhbm5lbHMgc3VwcG9ydGluZyBzdGVyZW8gKi8KKworLyogT1NTL0ZyZWUgT05MWSAqLworI2RlZmluZSBTT1VORF9NSVhFUl9PVVRTUkMgICAgMHhmYQkvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggaW5wdXQgc291cmNlIHRvIG91dHB1dCAqLworI2RlZmluZSBTT1VORF9NSVhFUl9PVVRNQVNLICAgMHhmOQkvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIGlucHV0IHNvdXJjZSB0byBvdXRwdXQgKi8KKy8qIE9TUy9GcmVlIE9OTFkgKi8KKworLyoJRGV2aWNlIG1hc2sgYml0cwkqLworCisjZGVmaW5lIFNPVU5EX01BU0tfVk9MVU1FCSgxIDw8IFNPVU5EX01JWEVSX1ZPTFVNRSkKKyNkZWZpbmUgU09VTkRfTUFTS19CQVNTCQkoMSA8PCBTT1VORF9NSVhFUl9CQVNTKQorI2RlZmluZSBTT1VORF9NQVNLX1RSRUJMRQkoMSA8PCBTT1VORF9NSVhFUl9UUkVCTEUpCisjZGVmaW5lIFNPVU5EX01BU0tfU1lOVEgJKDEgPDwgU09VTkRfTUlYRVJfU1lOVEgpCisjZGVmaW5lIFNPVU5EX01BU0tfUENNCQkoMSA8PCBTT1VORF9NSVhFUl9QQ00pCisjZGVmaW5lIFNPVU5EX01BU0tfU1BFQUtFUgkoMSA8PCBTT1VORF9NSVhFUl9TUEVBS0VSKQorI2RlZmluZSBTT1VORF9NQVNLX0xJTkUJCSgxIDw8IFNPVU5EX01JWEVSX0xJTkUpCisjZGVmaW5lIFNPVU5EX01BU0tfTUlDCQkoMSA8PCBTT1VORF9NSVhFUl9NSUMpCisjZGVmaW5lIFNPVU5EX01BU0tfQ0QJCSgxIDw8IFNPVU5EX01JWEVSX0NEKQorI2RlZmluZSBTT1VORF9NQVNLX0lNSVgJCSgxIDw8IFNPVU5EX01JWEVSX0lNSVgpCisjZGVmaW5lIFNPVU5EX01BU0tfQUxUUENNCSgxIDw8IFNPVU5EX01JWEVSX0FMVFBDTSkKKyNkZWZpbmUgU09VTkRfTUFTS19SRUNMRVYJKDEgPDwgU09VTkRfTUlYRVJfUkVDTEVWKQorI2RlZmluZSBTT1VORF9NQVNLX0lHQUlOCSgxIDw8IFNPVU5EX01JWEVSX0lHQUlOKQorI2RlZmluZSBTT1VORF9NQVNLX09HQUlOCSgxIDw8IFNPVU5EX01JWEVSX09HQUlOKQorI2RlZmluZSBTT1VORF9NQVNLX0xJTkUxCSgxIDw8IFNPVU5EX01JWEVSX0xJTkUxKQorI2RlZmluZSBTT1VORF9NQVNLX0xJTkUyCSgxIDw8IFNPVU5EX01JWEVSX0xJTkUyKQorI2RlZmluZSBTT1VORF9NQVNLX0xJTkUzCSgxIDw8IFNPVU5EX01JWEVSX0xJTkUzKQorI2RlZmluZSBTT1VORF9NQVNLX0RJR0lUQUwxCSgxIDw8IFNPVU5EX01JWEVSX0RJR0lUQUwxKQorI2RlZmluZSBTT1VORF9NQVNLX0RJR0lUQUwyCSgxIDw8IFNPVU5EX01JWEVSX0RJR0lUQUwyKQorI2RlZmluZSBTT1VORF9NQVNLX0RJR0lUQUwzCSgxIDw8IFNPVU5EX01JWEVSX0RJR0lUQUwzKQorI2RlZmluZSBTT1VORF9NQVNLX01PTk8JCSgxIDw8IFNPVU5EX01JWEVSX01PTk8pCisjZGVmaW5lIFNPVU5EX01BU0tfUEhPTkUJKDEgPDwgU09VTkRfTUlYRVJfUEhPTkUpCisjZGVmaW5lIFNPVU5EX01BU0tfUkFESU8JKDEgPDwgU09VTkRfTUlYRVJfUkFESU8pCisjZGVmaW5lIFNPVU5EX01BU0tfVklERU8JKDEgPDwgU09VTkRfTUlYRVJfVklERU8pCisjZGVmaW5lIFNPVU5EX01BU0tfREVQVEgJKDEgPDwgU09VTkRfTUlYRVJfREVQVEgpCisjZGVmaW5lIFNPVU5EX01BU0tfUkVBUlZPTAkoMSA8PCBTT1VORF9NSVhFUl9SRUFSVk9MKQorI2RlZmluZSBTT1VORF9NQVNLX0NFTlRFUlZPTAkoMSA8PCBTT1VORF9NSVhFUl9DRU5URVJWT0wpCisjZGVmaW5lIFNPVU5EX01BU0tfU0lERVZPTAkoMSA8PCBTT1VORF9NSVhFUl9TSURFVk9MKQorCisvKiBOb3RlISBTT1VORF9NQVNLX1NVUlJWT0wgaXMgYWxpYXMgb2YgU09VTkRfTUFTS19TSURFVk9MICovCisjZGVmaW5lIFNPVU5EX01BU0tfU1VSUlZPTAkoMSA8PCBTT1VORF9NSVhFUl9TSURFVk9MKQorCisvKiBPYnNvbGV0ZSBtYWNyb3MgKi8KKyNkZWZpbmUgU09VTkRfTUFTS19NVVRFCQkoMSA8PCBTT1VORF9NSVhFUl9NVVRFKQorI2RlZmluZSBTT1VORF9NQVNLX0VOSEFOQ0UJKDEgPDwgU09VTkRfTUlYRVJfRU5IQU5DRSkKKyNkZWZpbmUgU09VTkRfTUFTS19MT1VECQkoMSA8PCBTT1VORF9NSVhFUl9MT1VEKQorCisjZGVmaW5lIE1JWEVSX1JFQUQoZGV2KQkJCV9fU0lPUignTScsIGRldiwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX1ZPTFVNRQkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9WT0xVTUUpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfQkFTUwkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9CQVNTKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX1RSRUJMRQkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9UUkVCTEUpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfU1lOVEgJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfU1lOVEgpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfUENNCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1BDTSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9TUEVBS0VSCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfU1BFQUtFUikKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9MSU5FCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0xJTkUpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfTUlDCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX01JQykKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9DRAkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9DRCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9JTUlYCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0lNSVgpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfQUxUUENNCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0FMVFBDTSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9SRUNMRVYJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfUkVDTEVWKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0lHQUlOCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0lHQUlOKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX09HQUlOCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX09HQUlOKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0xJTkUxCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0xJTkUxKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0xJTkUyCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0xJTkUyKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0xJTkUzCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0xJTkUzKQorCisvKiBPYnNvbGV0ZSBtYWNyb3MgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9NVVRFCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX01VVEUpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfRU5IQU5DRQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0VOSEFOQ0UpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfTE9VRAkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9MT1VEKQorCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfUkVDU1JDCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1JFQ1NSQykKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9ERVZNQVNLCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfREVWTUFTSykKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9SRUNNQVNLCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfUkVDTUFTSykKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9TVEVSRU9ERVZTCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfU1RFUkVPREVWUykKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9DQVBTCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0NBUFMpCisKKyNkZWZpbmUgTUlYRVJfV1JJVEUoZGV2KQkJX19TSU9XUignTScsIGRldiwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9WT0xVTUUJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfVk9MVU1FKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9CQVNTCQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9CQVNTKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9UUkVCTEUJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfVFJFQkxFKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9TWU5USAkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfU1lOVEgpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX1BDTQkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfUENNKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9TUEVBS0VSCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX1NQRUFLRVIpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0xJTkUJCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX01JQwkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfTUlDKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9DRAkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfQ0QpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0lNSVgJCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0lNSVgpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0FMVFBDTQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9BTFRQQ00pCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX1JFQ0xFVglNSVhFUl9XUklURShTT1VORF9NSVhFUl9SRUNMRVYpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0lHQUlOCQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9JR0FJTikKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfT0dBSU4JCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX09HQUlOKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9MSU5FMQkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfTElORTEpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0xJTkUyCQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9MSU5FMikKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfTElORTMJCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUzKQorCisvKiBPYnNvbGV0ZSBtYWNyb3MgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfTVVURQkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfTVVURSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfRU5IQU5DRQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9FTkhBTkNFKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9MT1VECQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9MT1VEKQorCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX1JFQ1NSQwlNSVhFUl9XUklURShTT1VORF9NSVhFUl9SRUNTUkMpCisKK3R5cGVkZWYgc3RydWN0IG1peGVyX2luZm8JLyogT0JTT0xFVEUgKi8KK3sKKyAgY2hhciBpZFsxNl07CisgIGNoYXIgbmFtZVszMl07CisgIGludCBtb2RpZnlfY291bnRlcjsKKyAgaW50IGNhcmRfbnVtYmVyOworICBpbnQgcG9ydF9udW1iZXI7CisgIGNoYXIgaGFuZGxlWzMyXTsKK30gbWl4ZXJfaW5mbzsKKworLyogU09VTkRfTUlYRVJfSU5GTyBpcyBvYnNvbGV0ZSAtIHVzZSBTTkRDVExfTUlYRVJJTkZPIGluc3RlYWQgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfSU5GTwkJX19TSU9SICgnTScsIDEwMSwgbWl4ZXJfaW5mbykKKworLyoKKyAqIFR3byBpb2N0bHMgZm9yIHNwZWNpYWwgc291bmNhcmQgZnVuY3Rpb24gKE9TUy9GcmVlIG9ubHkpCisgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfQUdDICBfU0lPV1IoJ00nLCAxMDMsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfM0RTRSAgX1NJT1dSKCdNJywgMTA0LCBpbnQpCisvKgorICogVGhlIFNPVU5EX01JWEVSX1BSSVZBVEUjIGNvbW1hbmRzIGNhbiBiZSByZWRlZmluZWQgYnkgbG93IGxldmVsIGRyaXZlcnMuCisgKiBUaGVzZSBmZWF0dXJlcyBjYW4gYmUgdXNlZCB3aGVuIGFjY2Vzc2luZyBkZXZpY2Ugc3BlY2lmaWMgZmVhdHVyZXMuCisgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfUFJJVkFURTEJCV9fU0lPV1IoJ00nLCAxMTEsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUFJJVkFURTIJCV9fU0lPV1IoJ00nLCAxMTIsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUFJJVkFURTMJCV9fU0lPV1IoJ00nLCAxMTMsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUFJJVkFURTQJCV9fU0lPV1IoJ00nLCAxMTQsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUFJJVkFURTUJCV9fU0lPV1IoJ00nLCAxMTUsIGludCkKKworLyogVGhlIGZvbGxvd2luZyB0d28gY29udHJvbHMgd2VyZSBuZXZlciBpbXBsZW1lbnRlZCBhbmQgdGhleSBzaG91bGQgbm90IGJlIHVzZWQuICovCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfTUFJTlZPTAkJX19TSU9SICgnTScsIDExNiwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9NQUlOVk9MCQlfX1NJT1dSKCdNJywgMTE2LCBpbnQpCisKKy8qCisgKiBTT1VORF9NSVhFUl9HRVRMRVZFTFMgYW5kIFNPVU5EX01JWEVSX1NFVExFVkVMUyBjYWxscyBjYW4gYmUgdXNlZAorICogZm9yIHF1ZXJ5aW5nIGN1cnJlbnQgbWl4ZXIgc2V0dGluZ3MgZnJvbSB0aGUgZHJpdmVyIGFuZCBmb3IgbG9hZGluZworICogZGVmYXVsdCB2b2x1bWUgc2V0dGluZ3MgX3ByaW9yXyBhY3RpdmF0aW5nIHRoZSBtaXhlciAobG9hZGluZworICogZG9lc24ndCBhZmZlY3QgY3VycmVudCBzdGF0ZSBvZiB0aGUgbWl4ZXIgaGFyZHdhcmUpLiBUaGVzZSBjYWxscworICogYXJlIGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIGRyaXZlciBzb2Z0d2FyZSBvbmx5LgorICovCisKK3R5cGVkZWYgc3RydWN0IG1peGVyX3ZvbF90YWJsZQoreworICBpbnQgbnVtOwkJCS8qIEluZGV4IHRvIHZvbHVtZSB0YWJsZSAqLworICBjaGFyIG5hbWVbMzJdOworICBpbnQgbGV2ZWxzWzMyXTsKK30gbWl4ZXJfdm9sX3RhYmxlOworCisjZGVmaW5lIFNPVU5EX01JWEVSX0dFVExFVkVMUwkJX19TSU9XUignTScsIDExNiwgbWl4ZXJfdm9sX3RhYmxlKQorI2RlZmluZSBTT1VORF9NSVhFUl9TRVRMRVZFTFMJCV9fU0lPV1IoJ00nLCAxMTcsIG1peGVyX3ZvbF90YWJsZSkKKworI2RlZmluZSBPU1NfR0VUVkVSU0lPTgkJCV9fU0lPUiAoJ00nLCAxMTgsIGludCkKKworLyoKKyAqIENhbGxzIHRvIHNldC9nZXQgdGhlIHJlY29yZGluZyBnYWluIGZvciB0aGUgY3VycmVudGx5IGFjdGl2ZQorICogcmVjb3JkaW5nIHNvdXJjZS4gVGhlc2UgY2FsbHMgYXV0b21hdGljYWxseSBtYXAgdG8gdGhlIHJpZ2h0IGNvbnRyb2wuCisgKiBOb3RlIHRoYXQgdGhlc2UgY2FsbHMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGRyaXZlcnMuIEluIHRoaXMgY2FzZQorICogdGhlIGNhbGwgd2lsbCByZXR1cm4gLTEgd2l0aCBlcnJubyBzZXQgdG8gRUlOVkFMCisgKgorICogVGhlIF9NT05HQUlOIHdvcmsgaW4gc2ltaWxhciB3YXkgYnV0IHNldC9nZXQgdGhlIG1vbml0b3JpbmcgZ2FpbiBmb3IKKyAqIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmVjb3JkaW5nIHNvdXJjZS4KKyAqLworI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX1JFQ0dBSU4JX19TSU9SICgnTScsIDExOSwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9SRUNHQUlOCV9fU0lPV1IoJ00nLCAxMTksIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9NT05HQUlOCV9fU0lPUiAoJ00nLCAxMjAsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfTU9OR0FJTglfX1NJT1dSKCdNJywgMTIwLCBpbnQpCisKKy8qIFRoZSBmb2xsb3dpbmcgY2FsbCBpcyBmb3IgZHJpdmVyIGRldmVsb3BtZW50IHRpbWUgcHVycG9zZXMuIEl0J3Mgbm90CisgKiBwcmVzZW50IGluIGFueSByZWxlYXNlZCBkcml2ZXJzLgorICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgb3NzX3Jlc2VydmVkX3RbNTEyXTsKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVTRVJWRUQJCV9fU0lPV1IoJ00nLCAxMjEsIG9zc19yZXNlcnZlZF90KQorI2VuZGlmIC8qIGlmbmRlZiBOT19MRUdBQ1lfTUlYRVIgKi8KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGUgIm5ldyIgbWl4ZXIgQVBJIG9mIE9TUyA0LjAgYW5kIGxhdGVyLgorICoKKyAqIFRoaXMgaW1wcm92ZWQgbWl4ZXIgQVBJIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGFjY2VzcyBldmVyeSBwb3NzaWJsZSBmZWF0dXJlCisgKiBvZiBldmVyeSBwb3NzaWJsZSBkZXZpY2UuIEhvd2V2ZXIgeW91IHNob3VsZCByZWFkIHRoZSBtaXhlciBwcm9ncmFtbWluZworICogc2VjdGlvbiBvZiB0aGUgT1NTIEFQSSBEZXZlbG9wZXIncyBNYW51YWwuIFRoZXJlIGlzIG5vIGNoYW5jZSB0aGF0IHlvdQorICogY291bGQgdXNlIHRoaXMgaW50ZXJmYWNlIGNvcnJlY3RseSBqdXN0IGJ5IGV4YW1pbmluZyB0aGlzIGhlYWRlci4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBvc3Nfc3lzaW5mbworeworICBjaGFyIHByb2R1Y3RbMzJdOwkJLyogRm9yIGV4YW1wbGUgT1NTL0ZyZWUsIE9TUy9MaW51eCBvciBPU1MvU29sYXJpcyAqLworICBjaGFyIHZlcnNpb25bMzJdOwkJLyogRm9yIGV4YW1wbGUgNC4wYSAqLworICBpbnQgdmVyc2lvbm51bTsJCS8qIFNlZSBPU1NfR0VUVkVSU0lPTiAqLworICBjaGFyIG9wdGlvbnNbMTI4XTsJCS8qIFJlc2VydmVkICovCisKKyAgaW50IG51bWF1ZGlvczsJCS8qICMgb2YgYXVkaW8vZHNwIGRldmljZXMgKi8KKyAgaW50IG9wZW5lZGF1ZGlvWzhdOwkJLyogQml0IG1hc2sgdGVsbGluZyB3aGljaCBhdWRpbyBkZXZpY2VzIGFyZSBidXN5ICovCisKKyAgaW50IG51bXN5bnRoczsJCS8qICMgb2YgYXZhaWxhdmxlIHN5bnRoIGRldmljZXMgKi8KKyAgaW50IG51bW1pZGlzOwkJCS8qICMgb2YgYXZhaWxhYmxlIE1JREkgcG9ydHMgKi8KKyAgaW50IG51bXRpbWVyczsJCS8qICMgb2YgYXZhaWxhYmxlIHRpbWVyIGRldmljZXMgKi8KKyAgaW50IG51bW1peGVyczsJCS8qICMgb2YgbWl4ZXIgZGV2aWNlcyAqLworCisgIGludCBvcGVuZWRtaWRpWzhdOwkJLyogQml0IG1hc2sgdGVsbGluZyB3aGljaCBtaWRpIGRldmljZXMgYXJlIGJ1c3kgKi8KKyAgaW50IG51bWNhcmRzOwkJCS8qIE51bWJlciBvZiBzb3VuZCBjYXJkcyBpbiB0aGUgc3lzdGVtICovCisgIGludCBudW1hdWRpb2VuZ2luZXM7CQkvKiBOdW1iZXIgb2YgYXVkaW8gZW5naW5lcyBpbiB0aGUgc3lzdGVtICovCisgIGNoYXIgbGljZW5zZVsxNl07CQkvKiBGb3IgZXhhbXBsZSAiR1BMIiBvciAiQ0RETCIgKi8KKyAgaW50IGZpbGxlclsyMzZdOwkJLyogRm9yIGZ1dHVyZSBleHBhbnNpb24gKHNldCB0byAtMSkgKi8KK30gb3NzX3N5c2luZm87CisKK3R5cGVkZWYgc3RydWN0IG9zc19taXhleHQKK3sKKyAgaW50IGRldjsJCQkvKiBNaXhlciBkZXZpY2UgbnVtYmVyICovCisgIGludCBjdHJsOwkJCS8qIENvbnRyb2xsZXIgbnVtYmVyICovCisgIGludCB0eXBlOwkJCS8qIEVudHJ5IHR5cGUgKi8KKyMJZGVmaW5lIE1JWFRfREVWUk9PVAkgMAkvKiBEZXZpY2Ugcm9vdCBlbnRyeSAqLworIwlkZWZpbmUgTUlYVF9HUk9VUAkgMQkvKiBDb250cm9sbGVyIGdyb3VwICovCisjCWRlZmluZSBNSVhUX09OT0ZGCSAyCS8qIE9GRiAoMCkgb3IgT04gKDEpICovCisjCWRlZmluZSBNSVhUX0VOVU0JIDMJLyogRW51bWVyYXRlZCAoMCB0byBtYXh2YWx1ZSkgKi8KKyMJZGVmaW5lIE1JWFRfTU9OT1NMSURFUgkgNAkvKiBNb25vIHNsaWRlciAoMCB0byAyNTUpICovCisjCWRlZmluZSBNSVhUX1NURVJFT1NMSURFUiA1CS8qIFN0ZXJlbyBzbGlkZXIgKGR1YWwgMCB0byAyNTUpICovCisjCWRlZmluZSBNSVhUX01FU1NBR0UJIDYJLyogKFJlYWRhYmxlKSB0ZXh0dWFsIG1lc3NhZ2UgKi8KKyMJZGVmaW5lIE1JWFRfTU9OT1ZVCSA3CS8qIFZVIG1ldGVyIHZhbHVlIChtb25vKSAqLworIwlkZWZpbmUgTUlYVF9TVEVSRU9WVQkgOAkvKiBWVSBtZXRlciB2YWx1ZSAoc3RlcmVvKSAqLworIwlkZWZpbmUgTUlYVF9NT05PUEVBSwkgOQkvKiBWVSBtZXRlciBwZWFrIHZhbHVlIChtb25vKSAqLworIwlkZWZpbmUgTUlYVF9TVEVSRU9QRUFLCTEwCS8qIFZVIG1ldGVyIHBlYWsgdmFsdWUgKHN0ZXJlbykgKi8KKyMJZGVmaW5lIE1JWFRfUkFESU9HUk9VUAkxMQkvKiBSYWRpbyBidXR0b24gZ3JvdXAgKi8KKyMJZGVmaW5lIE1JWFRfTUFSS0VSCTEyCS8qIFNlcGFyYXRvciBiZXR3ZWVuIG5vcm1hbCBhbmQgZXh0ZW5zaW9uIGVudHJpZXMgKi8KKyMJZGVmaW5lIE1JWFRfVkFMVUUJMTMJLyogRGVjaW1hbCB2YWx1ZSBlbnRyeSAqLworIwlkZWZpbmUgTUlYVF9IRVhWQUxVRQkxNAkvKiBIZXhhZGVjaW1hbCB2YWx1ZSBlbnRyeSAqLworIwlkZWZpbmUgTUlYVF9NT05PREIJMTUJLyogT0JTT0xFVEUgKi8KKyMJZGVmaW5lIE1JWFRfU1RFUkVPREIJMTYJLyogT0JTT0xFVEUgKi8KKyMJZGVmaW5lIE1JWFRfU0xJREVSCTE3CS8qIFNsaWRlciAobW9ubykgd2l0aCBmdWxsICgzMSBiaXQpIHBvc3RpdGl2ZSBpbnRlZ2VyIHJhbmdlICovCisjCWRlZmluZSBNSVhUXzNECQkxOAorCisvKgorICogU2xpZGVycyB3aXRoIHJhbmdlIGV4cGFuZGVkIHRvIDE1IGJpdHMgcGVyIGNoYW5uZWwgKDAtMzI3NjcpCisgKi8KKyMJZGVmaW5lIE1JWFRfTU9OT1NMSURFUjE2CTE5CisjCWRlZmluZSBNSVhUX1NURVJFT1NMSURFUjE2CTIwCisjCWRlZmluZSBNSVhUX01VVEUJMjEJLyogTXV0ZT0xLCB1bm11dGU9MCAqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKiBQb3NzaWJsZSB2YWx1ZSByYW5nZSAobWludmFsdWUgdG8gbWF4dmFsdWUpICovCisgIC8qIE5vdGUgdGhhdCBtYXh2YWx1ZSBtYXkgYWxzbyBiZSBzbWFsbGVyIHRoYW4gbWludmFsdWUgKi8KKyAgaW50IG1heHZhbHVlOworICBpbnQgbWludmFsdWU7CisKKyAgaW50IGZsYWdzOworIwlkZWZpbmUgTUlYRl9SRUFEQUJMRQkweDAwMDAwMDAxCS8qIEhhcyByZWFkYWJsZSB2YWx1ZSAqLworIwlkZWZpbmUgTUlYRl9XUklURUFCTEUJMHgwMDAwMDAwMgkvKiBIYXMgd3JpdGVhYmxlIHZhbHVlICovCisjCWRlZmluZSBNSVhGX1BPTEwJMHgwMDAwMDAwNAkvKiBNYXkgY2hhbmdlIGl0c2VsZiAqLworIwlkZWZpbmUgTUlYRl9IWgkJMHgwMDAwMDAwOAkvKiBIZXJ6IHNjYWxlICovCisjCWRlZmluZSBNSVhGX1NUUklORwkweDAwMDAwMDEwCS8qIFVzZSBkeW5hbWljIGV4dGVuc2lvbnMgZm9yIHZhbHVlICovCisjCWRlZmluZSBNSVhGX0RZTkFNSUMJMHgwMDAwMDAxMAkvKiBTdXBwb3J0cyBkeW5hbWljIGV4dGVuc2lvbnMgKi8KKyMJZGVmaW5lIE1JWEZfT0tGQUlMCTB4MDAwMDAwMjAJLyogSW50ZXJwcmV0IHZhbHVlIGFzIDE9T0ssIDA9RkFJTCAqLworIwlkZWZpbmUgTUlYRl9GTEFUCTB4MDAwMDAwNDAJLyogRmxhdCB2ZXJ0aWNhbCBzcGFjZSByZXF1aXJlbWVudHMgKi8KKyMJZGVmaW5lIE1JWEZfTEVHQUNZCTB4MDAwMDAwODAJLyogTGVnYWN5IG1peGVyIGNvbnRyb2wgZ3JvdXAgKi8KKyMJZGVmaW5lIE1JWEZfQ0VOVElCRUwJMHgwMDAwMDEwMAkvKiBDZW50aWJlbCAoMC4xIGRCKSBzdGVwIHNpemUgKi8KKyMJZGVmaW5lIE1JWEZfREVDSUJFTAkweDAwMDAwMjAwCS8qIFN0ZXAgc2l6ZSBvZiAxIGRCICovCisjCWRlZmluZSBNSVhGX01BSU5WT0wJMHgwMDAwMDQwMAkvKiBNYWluIHZvbHVtZSBjb250cm9sICovCisjCWRlZmluZSBNSVhGX1BDTVZPTAkweDAwMDAwODAwCS8qIFBDTSBvdXRwdXQgdm9sdW1lIGNvbnRyb2wgKi8KKyMJZGVmaW5lIE1JWEZfUkVDVk9MCTB4MDAwMDEwMDAJLyogUENNIHJlY29yZGluZyB2b2x1bWUgY29udHJvbCAqLworIwlkZWZpbmUgTUlYRl9NT05WT0wJMHgwMDAwMjAwMAkvKiBJbnB1dC0+b3V0cHV0IG1vbml0b3Igdm9sdW1lICovCisjCWRlZmluZSBNSVhGX1dJREUJMHgwMDAwNDAwMAkvKiBFbnVtIGNvbnRyb2wgaGFzIHdpZGUgbGFiZWxzICovCisjCWRlZmluZSBNSVhGX0RFU0NSCTB4MDAwMDgwMDAJLyogRGVzY3JpcHRpb24gKHRvb2x0aXApIGF2YWlsYWJsZSAqLworICBjaGFyIGlkWzE2XTsJCQkvKiBNbmVtb25pYyBJRCAobWFpbmx5IGZvciBpbnRlcm5hbCB1c2UpICovCisgIGludCBwYXJlbnQ7CQkJLyogRW50cnkjIG9mIHBhcmVudCAoZ3JvdXApIG5vZGUgKC0xIGlmIHJvb3QpICovCisKKyAgaW50IGR1bW15OwkJCS8qIEludGVybmFsIHVzZSAqLworCisgIGludCB0aW1lc3RhbXA7CisKKyAgY2hhciBkYXRhWzY0XTsJCS8qIE1pc2MgZGF0YSAoZW50cnkgdHlwZSBkZXBlbmRlbnQpICovCisgIHVuc2lnbmVkIGNoYXIgZW51bV9wcmVzZW50WzMyXTsJLyogTWFzayBvZiBhbGxvd2VkIGVudW0gdmFsdWVzICovCisgIGludCBjb250cm9sX25vOwkJLyogU09VTkRfTUlYRVJfVk9MVU1FLi5TT1VORF9NSVhFUl9NSURJICovCisgIC8qICgtMSBtZWFucyBub3QgaW5kaWNhdGVkKSAqLworCisvKgorICogVGhlIGRlc2MgZmllbGQgaXMgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHB1cnBvc2VzIG9mIE9TUy4gSXQgc2hvdWxkIG5vdCBiZSAKKyAqIHVzZWQgYnkgYXBwbGljYXRpb25zLgorICovCisgIHVuc2lnbmVkIGludCBkZXNjOworI2RlZmluZSBNSVhFWFRfU0NPUEVfTUFTSwkJCTB4MDAwMDAwM2YKKyNkZWZpbmUgTUlYRVhUX1NDT1BFX09USEVSCQkJMHgwMDAwMDAwMAorI2RlZmluZSBNSVhFWFRfU0NPUEVfSU5QVVQJCQkweDAwMDAwMDAxCisjZGVmaW5lIE1JWEVYVF9TQ09QRV9PVVRQVVQJCQkweDAwMDAwMDAyCisjZGVmaW5lIE1JWEVYVF9TQ09QRV9NT05JVE9SCQkJMHgwMDAwMDAwMworI2RlZmluZSBNSVhFWFRfU0NPUEVfUkVDU1dJVENICQkJMHgwMDAwMDAwNAorCisgIGNoYXIgZXh0bmFtZVszMl07CisgIGludCB1cGRhdGVfY291bnRlcjsKKyAgaW50IHJnYmNvbG9yOwkJLyogMCBtZWFucyBkZWZhdWx0IGNvbG9yIChub3QgYmxhY2spIC4gT3RoZXJ3aXNlIDI0IGJpdCBSR0IgY29sb3IgKi8KKyAgaW50IGZpbGxlcls2XTsKK30gb3NzX21peGV4dDsKKworLyoKKyAqIFJlY29tbWVuZGVkIGNvbG9ycyB0byBiZSB1c2VkIGluIHRoZSByZ2Jjb2xvciBmaWVsZC4gVGhlc2UgbWF0Y2ggdGhlCisgKiBjb2xvcnMgdXNlZCBhcyB0aGUgYXVkaW8gamFjayBjb2xvcnMgaW4gSEQgYXVkaW8gbW90aGVyYm9hcmRzLgorICovCisjZGVmaW5lIE9TU19SR0JfQkxVRQkweDdhYWJkZQkJLy8gTGlnaHQgYmx1ZQorI2RlZmluZSBPU1NfUkdCX0dSRUVOCTB4YjNjOThjCQkvLyBMaW1lIGdyZWVuCisjZGVmaW5lIE9TU19SR0JfUElOSwkweGU4OGM5OQorI2RlZmluZSBPU1NfUkdCX0dSQVkJMHhkMWNjYzQKKyNkZWZpbmUgT1NTX1JHQl9CTEFDSwkweDJiMjkyNgkJLy8gTGlnaHQgYmxhY2sKKyNkZWZpbmUgT1NTX1JHQl9PUkFOR0UJMHhlODllNDcKKyNkZWZpbmUgT1NTX1JHQl9SRUQJMHhmZjAwMDAKKyNkZWZpbmUgT1NTX1JHQl9ZRUxMT1cJMHhmZmZmMDAKKyNkZWZpbmUgT1NTX1JHQl9QVVJQTEUJMHg4MDAwODAKKyNkZWZpbmUgT1NTX1JHQl9XSElURQkweGY4ZjhmZgorCit0eXBlZGVmIHN0cnVjdCBvc3NfbWl4ZXh0X3Jvb3QKK3sKKyAgY2hhciBpZFsxNl07CisgIGNoYXIgbmFtZVs0OF07Cit9IG9zc19taXhleHRfcm9vdDsKKwordHlwZWRlZiBzdHJ1Y3Qgb3NzX21peGVyX3ZhbHVlCit7CisgIGludCBkZXY7CisgIGludCBjdHJsOworICBpbnQgdmFsdWU7CisgIGludCBmbGFnczsJCQkvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gSW5pdGlhbGl6ZSB0byAwICovCisgIGludCB0aW1lc3RhbXA7CQkvKiBNdXN0IGJlIHNldCB0byBvc3NfbWl4ZXh0LnRpbWVzdGFtcCAqLworICBpbnQgZmlsbGVyWzhdOwkJLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIEluaXRpYWxpemUgdG8gMCAqLworfSBvc3NfbWl4ZXJfdmFsdWU7CisKKyNkZWZpbmUgT1NTX0VOVU1fTUFYVkFMVUUJMjU1CisjZGVmaW5lIE9TU19FTlVNX1NUUklOR1NJWkUJMzAwMAordHlwZWRlZiBzdHJ1Y3Qgb3NzX21peGVyX2VudW1pbmZvCit7CisgIGludCBkZXY7CisgIGludCBjdHJsOworICBpbnQgbnZhbHVlczsKKyAgaW50IHZlcnNpb247CQkJLyogUmVhZCB0aGUgbWFudWFsICovCisgIHNob3J0IHN0cmluZGV4W09TU19FTlVNX01BWFZBTFVFXTsKKyAgY2hhciBzdHJpbmdzW09TU19FTlVNX1NUUklOR1NJWkVdOworfSBvc3NfbWl4ZXJfZW51bWluZm87CisKKyNkZWZpbmUgT1BFTl9SRUFECVBDTV9FTkFCTEVfSU5QVVQKKyNkZWZpbmUgT1BFTl9XUklURQlQQ01fRU5BQkxFX09VVFBVVAorI2RlZmluZSBPUEVOX1JFQURXUklURQkoT1BFTl9SRUFEfE9QRU5fV1JJVEUpCisKK3R5cGVkZWYgc3RydWN0IG9zc19hdWRpb2luZm8KK3sKKyAgaW50IGRldjsJCQkvKiBBdWRpbyBkZXZpY2UgbnVtYmVyICovCisgIGNoYXIgbmFtZVs2NF07CisgIGludCBidXN5OwkJCS8qIDAsIE9QRU5fUkVBRCwgT1BFTl9XUklURSBvciBPUEVOX1JFQURXUklURSAqLworICBpbnQgcGlkOworICBpbnQgY2FwczsJCQkvKiBQQ01fQ0FQX0lOUFVULCBQQ01fQ0FQX09VVFBVVCAqLworICBpbnQgaWZvcm1hdHMsIG9mb3JtYXRzOworICBpbnQgbWFnaWM7CQkJLyogUmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZSAqLworICBjaGFyIGNtZFs2NF07CQkJLyogQ29tbWFuZCB1c2luZyB0aGUgZGV2aWNlIChpZiBrbm93bikgKi8KKyAgaW50IGNhcmRfbnVtYmVyOworICBpbnQgcG9ydF9udW1iZXI7CisgIGludCBtaXhlcl9kZXY7CisgIGludCBsZWdhY3lfZGV2aWNlOwkJLyogT2Jzb2xldGUgZmllbGQuIFJlcGxhY2VkIGJ5IGRldm5vZGUgKi8KKyAgaW50IGVuYWJsZWQ7CQkJLyogMT1lbmFibGVkLCAwPWRldmljZSBub3QgcmVhZHkgYXQgdGhpcyBtb21lbnQgKi8KKyAgaW50IGZsYWdzOwkJCS8qIEZvciBpbnRlcm5hbCB1c2Ugb25seSAtIG5vIHByYWN0aWNhbCBtZWFuaW5nICovCisgIGludCBtaW5fcmF0ZSwgbWF4X3JhdGU7CS8qIFNhbXBsZSByYXRlIGxpbWl0cyAqLworICBpbnQgbWluX2NoYW5uZWxzLCBtYXhfY2hhbm5lbHM7CS8qIE51bWJlciBvZiBjaGFubmVscyBzdXBwb3J0ZWQgKi8KKyAgaW50IGJpbmRpbmc7CQkJLyogRFNQX0JJTkRfRlJPTlQsIGV0Yy4gMCBtZWFucyB1bmRlZmluZWQgKi8KKyAgaW50IHJhdGVfc291cmNlOworICBjaGFyIGhhbmRsZVszMl07CisjZGVmaW5lIE9TU19NQVhfU0FNUExFX1JBVEVTCTIwCS8qIENhbm5vdCBiZSBjaGFuZ2VkICAqLworICB1bnNpZ25lZCBpbnQgbnJhdGVzLCByYXRlc1tPU1NfTUFYX1NBTVBMRV9SQVRFU107CS8qIFBsZWFzZSByZWFkIHRoZSBtYW51YWwgYmVmb3JlIHVzaW5nIHRoZXNlICovCisgIG9zc19sb25nbmFtZV90IHNvbmdfbmFtZTsJLyogU29uZyBuYW1lIChpZiBnaXZlbikgKi8KKyAgb3NzX2xhYmVsX3QgbGFiZWw7CQkvKiBEZXZpY2UgbGFiZWwgKGlmIGdpdmVuKSAqLworICBpbnQgbGF0ZW5jeTsJCQkvKiBJbiB1c2VjcywgLTE9dW5rbm93biAqLworICBvc3NfZGV2bm9kZV90IGRldm5vZGU7CS8qIERldmljZSBzcGVjaWFsIGZpbGUgbmFtZSAoYWJzb2x1dGUgcGF0aCkgKi8KKyAgaW50IG5leHRfcGxheV9lbmdpbmU7CQkvKiBSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm8gKi8KKyAgaW50IG5leHRfcmVjX2VuZ2luZTsJCS8qIFJlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mbyAqLworICBpbnQgZmlsbGVyWzE4NF07Cit9IG9zc19hdWRpb2luZm87CisKK3R5cGVkZWYgc3RydWN0IG9zc19taXhlcmluZm8KK3sKKyAgaW50IGRldjsKKyAgY2hhciBpZFsxNl07CisgIGNoYXIgbmFtZVszMl07CisgIGludCBtb2RpZnlfY291bnRlcjsKKyAgaW50IGNhcmRfbnVtYmVyOworICBpbnQgcG9ydF9udW1iZXI7CisgIGNoYXIgaGFuZGxlWzMyXTsKKyAgaW50IG1hZ2ljOwkJCS8qIFJlc2VydmVkICovCisgIGludCBlbmFibGVkOwkJCS8qIFJlc2VydmVkICovCisgIGludCBjYXBzOworI2RlZmluZSBNSVhFUl9DQVBfVklSVFVBTAkweDAwMDAwMDAxCisjZGVmaW5lIE1JWEVSX0NBUF9MQVlPVVRfQgkweDAwMDAwMDAyCS8qIEZvciBpbnRlcm5hbCB1c2Ugb25seSAqLworI2RlZmluZSBNSVhFUl9DQVBfTkFSUk9XCTB4MDAwMDAwMDQJLyogQ29uc2VydmUgaG9yaXogc3BhY2UgKi8KKyAgaW50IGZsYWdzOwkJCS8qIFJlc2VydmVkICovCisgIGludCBucmV4dDsKKyAgLyoKKyAgICogVGhlIHByaW9yaXR5IGZpZWxkIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB0aGUgZGVmYXVsdCAobW90aGVyYm9hcmQpCisgICAqIG1peGVyIGRldmljZS4gVGhlIG1peGVyIHdpdGggdGhlIGhpZ2hlc3QgcHJpb3JpdHkgaXMgdGhlCisgICAqIG1vc3QgcHJlZmVycmVkIG9uZS4gLTIgb3IgbGVzcyBtZWFucyB0aGF0IHRoaXMgZGV2aWNlIGNhbm5vdCBiZSB1c2VkCisgICAqIGFzIHRoZSBkZWZhdWx0IG1peGVyLgorICAgKi8KKyAgaW50IHByaW9yaXR5OworICBvc3NfZGV2bm9kZV90IGRldm5vZGU7CS8qIERldmljZSBzcGVjaWFsIGZpbGUgbmFtZSAoYWJzb2x1dGUgcGF0aCkgKi8KKyAgaW50IGxlZ2FjeV9kZXZpY2U7CisgIGludCBmaWxsZXJbMjQ1XTsJCS8qIFJlc2VydmVkICovCit9IG9zc19taXhlcmluZm87CisKK3R5cGVkZWYgc3RydWN0IG9zc19taWRpX2luZm8KK3sKKyAgaW50IGRldjsJCQkvKiBNaWRpIGRldmljZSBudW1iZXIgKi8KKyAgY2hhciBuYW1lWzY0XTsKKyAgaW50IGJ1c3k7CQkJLyogMCwgT1BFTl9SRUFELCBPUEVOX1dSSVRFIG9yIE9QRU5fUkVBRFdSSVRFICovCisgIGludCBwaWQ7CisgIGNoYXIgY21kWzY0XTsJCQkvKiBDb21tYW5kIHVzaW5nIHRoZSBkZXZpY2UgKGlmIGtub3duKSAqLworICBpbnQgY2FwczsKKyNkZWZpbmUgTUlESV9DQVBfTVBVNDAxCQkweDAwMDAwMDAxCS8qKioqIE9CU09MRVRFICoqKiovCisjZGVmaW5lIE1JRElfQ0FQX0lOUFVUCQkweDAwMDAwMDAyCisjZGVmaW5lIE1JRElfQ0FQX09VVFBVVAkJMHgwMDAwMDAwNAorI2RlZmluZSBNSURJX0NBUF9JTk9VVAkJKE1JRElfQ0FQX0lOUFVUfE1JRElfQ0FQX09VVFBVVCkKKyNkZWZpbmUgTUlESV9DQVBfVklSVFVBTAkweDAwMDAwMDA4CS8qIFBzZXVkbyBkZXZpY2UgKi8KKyNkZWZpbmUgTUlESV9DQVBfTVRDSU5QVVQJMHgwMDAwMDAxMAkvKiBTdXBwb3J0cyBTTkRDVExfTUlESV9NVENJTlBVVCAqLworI2RlZmluZSBNSURJX0NBUF9DTElFTlQJCTB4MDAwMDAwMjAJLyogVmlydHVhbCBjbGllbnQgc2lkZSBkZXZpY2UgKi8KKyNkZWZpbmUgTUlESV9DQVBfU0VSVkVSCQkweDAwMDAwMDQwCS8qIFZpcnR1YWwgc2VydmVyIHNpZGUgZGV2aWNlICovCisjZGVmaW5lIE1JRElfQ0FQX0lOVEVSTkFMCTB4MDAwMDAwODAJLyogSW50ZXJuYWwgKHN5bnRoKSBkZXZpY2UgKi8KKyNkZWZpbmUgTUlESV9DQVBfRVhURVJOQUwJMHgwMDAwMDEwMAkvKiBleHRlcm5hbCAoTUlESSBwb3J0KSBkZXZpY2UgKi8KKyNkZWZpbmUgTUlESV9DQVBfUFRPUAkJMHgwMDAwMDIwMAkvKiBQb2ludCB0byBwb2ludCBsaW5rIHRvIG9uZSBkZXZpY2UgKi8KKyNkZWZpbmUgTUlESV9DQVBfTVRDCQkweDAwMDAwNDAwCS8qIE1UQy9TTVBURSAoY29udHJvbCkgZGV2aWNlICovCisgIGludCBtYWdpYzsJCQkvKiBSZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlICovCisgIGludCBjYXJkX251bWJlcjsKKyAgaW50IHBvcnRfbnVtYmVyOworICBpbnQgZW5hYmxlZDsJCQkvKiAxPWVuYWJsZWQsIDA9ZGV2aWNlIG5vdCByZWFkeSBhdCB0aGlzIG1vbWVudCAqLworICBpbnQgZmxhZ3M7CQkJLyogRm9yIGludGVybmFsIHVzZSBvbmx5IC0gbm8gcHJhY3RpY2FsIG1lYW5pbmcgKi8KKyAgY2hhciBoYW5kbGVbMzJdOworICBvc3NfbG9uZ25hbWVfdCBzb25nX25hbWU7CS8qIFNvbmcgbmFtZSAoaWYga25vd24pICovCisgIG9zc19sYWJlbF90IGxhYmVsOwkJLyogRGV2aWNlIGxhYmVsIChpZiBnaXZlbikgKi8KKyAgaW50IGxhdGVuY3k7CQkJLyogSW4gdXNlY3MsIC0xPXVua25vd24gKi8KKyAgb3NzX2Rldm5vZGVfdCBkZXZub2RlOwkvKiBEZXZpY2Ugc3BlY2lhbCBmaWxlIG5hbWUgKGFic29sdXRlIHBhdGgpICovCisgIGludCBsZWdhY3lfZGV2aWNlOwkJLyogTGVnYWN5IGRldmljZSBtYXBwaW5nICovCisgIGludCBmaWxsZXJbMjM1XTsKK30gb3NzX21pZGlfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qgb3NzX2NhcmRfaW5mbworeworICBpbnQgY2FyZDsKKyAgY2hhciBzaG9ydG5hbWVbMTZdOworICBjaGFyIGxvbmduYW1lWzEyOF07CisgIGludCBmbGFnczsKKyAgY2hhciBod19pbmZvWzQwMF07CisgIGludCBpbnRyX2NvdW50LCBhY2tfY291bnQ7CisgIGludCBmaWxsZXJbMTU0XTsKK30gb3NzX2NhcmRfaW5mbzsKKworI2RlZmluZSBTTkRDVExfU1lTSU5GTwkJX19TSU9SICgnWCcsIDEsIG9zc19zeXNpbmZvKQorI2RlZmluZSBPU1NfU1lTSU5GTwkJU05EQ1RMX1NZU0lORk8JLyogT2xkIG5hbWUgKi8KKworI2RlZmluZSBTTkRDVExfTUlYX05STUlYCV9fU0lPUiAoJ1gnLCAyLCBpbnQpCisjZGVmaW5lIFNORENUTF9NSVhfTlJFWFQJX19TSU9XUignWCcsIDMsIGludCkKKyNkZWZpbmUgU05EQ1RMX01JWF9FWFRJTkZPCV9fU0lPV1IoJ1gnLCA0LCBvc3NfbWl4ZXh0KQorI2RlZmluZSBTTkRDVExfTUlYX1JFQUQJCV9fU0lPV1IoJ1gnLCA1LCBvc3NfbWl4ZXJfdmFsdWUpCisjZGVmaW5lIFNORENUTF9NSVhfV1JJVEUJX19TSU9XUignWCcsIDYsIG9zc19taXhlcl92YWx1ZSkKKworI2RlZmluZSBTTkRDVExfQVVESU9JTkZPCV9fU0lPV1IoJ1gnLCA3LCBvc3NfYXVkaW9pbmZvKQorI2RlZmluZSBTTkRDVExfTUlYX0VOVU1JTkZPCV9fU0lPV1IoJ1gnLCA4LCBvc3NfbWl4ZXJfZW51bWluZm8pCisjZGVmaW5lIFNORENUTF9NSURJSU5GTwkJX19TSU9XUignWCcsIDksIG9zc19taWRpX2luZm8pCisjZGVmaW5lIFNORENUTF9NSVhFUklORk8JX19TSU9XUignWCcsMTAsIG9zc19taXhlcmluZm8pCisjZGVmaW5lIFNORENUTF9DQVJESU5GTwkJX19TSU9XUignWCcsMTEsIG9zc19jYXJkX2luZm8pCisjZGVmaW5lIFNORENUTF9FTkdJTkVJTkZPCV9fU0lPV1IoJ1gnLDEyLCBvc3NfYXVkaW9pbmZvKQorI2RlZmluZSBTTkRDVExfQVVESU9JTkZPX0VYCV9fU0lPV1IoJ1gnLDEzLCBvc3NfYXVkaW9pbmZvKQorCisjZGVmaW5lIFNORENUTF9NSVhfREVTQ1JJUFRJT04JX19TSU9XUignWCcsMTQsIG9zc19taXhlcl9lbnVtaW5mbykKKworLyogaW9jdGwgY29kZXMgJ1gnLCAyMDAtMjU1IGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlICovCisKKy8qCisgKiBGZXcgbW9yZSAiZ2xvYmFsbHkiIGF2YWlsYWJsZSBpb2N0bCBjYWxscy4KKyAqLworI2RlZmluZSBTTkRDVExfU0VUU09ORwkJX19TSU9XICgnWScsIDIsIG9zc19sb25nbmFtZV90KQorI2RlZmluZSBTTkRDVExfR0VUU09ORwkJX19TSU9SICgnWScsIDIsIG9zc19sb25nbmFtZV90KQorI2RlZmluZSBTTkRDVExfU0VUTkFNRQkJX19TSU9XICgnWScsIDMsIG9zc19sb25nbmFtZV90KQorI2RlZmluZSBTTkRDVExfU0VUTEFCRUwJCV9fU0lPVyAoJ1knLCA0LCBvc3NfbGFiZWxfdCkKKyNkZWZpbmUgU05EQ1RMX0dFVExBQkVMCQlfX1NJT1IgKCdZJywgNCwgb3NzX2xhYmVsX3QpCisvKgorICogVGhlICJuZXciIG1peGVyIEFQSSBkZWZpbml0aW9ucyBlbmQgaGVyZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRmV3IHJvdXRpbmVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIC1sT1NTbGliCisgKgorICogQXQgdGhpcyBtb21lbnQgdGhpcyBpbnRlcmZhY2UgaXMgbm90IHVzZWQuIE9TU2xpYiBjb250YWlucyBqdXN0CisgKiBzdHVicyB0aGF0IGNhbGwgdGhlIHJlbGF0ZWQgc3lzdGVtIGNhbGxzIGRpcmVjdGx5LgorICovCisjaWZkZWYgT1NTTElCCitleHRlcm4gaW50IG9zc2xpYl9vcGVuIChjb25zdCBjaGFyICpwYXRoLCBpbnQgZmxhZ3MsIGludCBkdW1teSk7CitleHRlcm4gdm9pZCBvc3NsaWJfY2xvc2UgKGludCBmZCk7CitleHRlcm4gaW50IG9zc2xpYl93cml0ZSAoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIGludCBjb3VudCk7CitleHRlcm4gaW50IG9zc2xpYl9yZWFkIChpbnQgZmQsIHZvaWQgKmJ1ZiwgaW50IGNvdW50KTsKK2V4dGVybiBpbnQgb3NzbGliX2lvY3RsIChpbnQgZmQsIHVuc2lnbmVkIGludCByZXF1ZXN0LCB2b2lkICphcmcpOworI2Vsc2UKKyMgIGRlZmluZSBvc3NsaWJfb3BlbglvcGVuCisjICBkZWZpbmUgb3NzbGliX2Nsb3NlCWNsb3NlCisjICBkZWZpbmUgb3NzbGliX3dyaXRlCXdyaXRlCisjICBkZWZpbmUgb3NzbGliX3JlYWQJcmVhZAorIyAgZGVmaW5lIG9zc2xpYl9pb2N0bAlpb2N0bAorI2VuZGlmCisKKyNpZiAxCisjZGVmaW5lIFNORENUTF9EU1BfTk9OQkxPQ0sJCV9fU0lPICAoJ1AnLDE0KQkvKiBPYnNvbGV0ZS4gTm90IHN1cHBvcnRlZCBhbnkgbW9yZSAqLworI2VuZGlmCisKKyNpZiAxCisvKgorICogU29tZSBvYnNvbGV0ZSBtYWNyb3MgdGhhdCBhcmUgbm90IHBhcnQgb2YgT3BlbiBTb3VuZCBTeXN0ZW0gQVBJLgorICovCisjZGVmaW5lIFNPVU5EX1BDTV9SRUFEX1JBVEUgICAgICAgICAgICAgU09VTkRfUENNX1JFQURfUkFURV9pc19vYnNvbGV0ZQorI2RlZmluZSBTT1VORF9QQ01fUkVBRF9CSVRTICAgICAgICAgICAgIFNPVU5EX1BDTV9SRUFEX0JJVFNfaXNfb2Jzb2xldGUKKyNkZWZpbmUgU09VTkRfUENNX1JFQURfQ0hBTk5FTFMgICAgICAgICBTT1VORF9QQ01fUkVBRF9DSEFOTkVMU19pc19vYnNvbGV0ZQorI2RlZmluZSBTT1VORF9QQ01fV1JJVEVfUkFURSAgICAgICAgICAgIFNPVU5EX1BDTV9XUklURV9SQVRFX2lzX29ic29sZXRfdXNlX1NORENUTF9EU1BfU1BFRURfaW5zdGVhZAorI2RlZmluZSBTT1VORF9QQ01fV1JJVEVfQ0hBTk5FTFMgICAgICAgIFNPVU5EX1BDTV9XUklURV9DSEFOTkVMU19pc19vYnNvbGV0ZV91c2VfU05EQ1RMX0RTUF9DSEFOTkVMU19pbnN0ZWFkCisjZGVmaW5lIFNPVU5EX1BDTV9XUklURV9CSVRTICAgICAgICAgICAgU09VTkRfUENNX1dSSVRFX0JJVFNfaXNfb2Jzb2xldGVfdXNlX1NORENUTF9EU1BfU0VURk1UX2luc3RlYWQKKyNkZWZpbmUgU09VTkRfUENNX1BPU1QgICAgICAgICAgICAgICAgICBTT1VORF9QQ01fUE9TVF9pc19vYnNvbGV0ZV91c2VfU05EQ1RMX0RTUF9QT1NUX2luc3RlYWQKKyNkZWZpbmUgU09VTkRfUENNX1JFU0VUICAgICAgICAgICAgICAgICBTT1VORF9QQ01fUkVTRVRfaXNfb2Jzb2xldGVfdXNlX1NORENUTF9EU1BfSEFMVF9pbnN0ZWFkCisjZGVmaW5lIFNPVU5EX1BDTV9TWU5DICAgICAgICAgICAgICAgICAgU09VTkRfUENNX1NZTkNfaXNfb2Jzb2xldGVfdXNlX1NORENUTF9EU1BfU1lOQ19pbnN0ZWFkCisjZGVmaW5lIFNPVU5EX1BDTV9TVUJESVZJREUgICAgICAgICAgICAgU09VTkRfUENNX1NVQkRJVklERV9pc19vYnNvbGV0ZV91c2VfU05EQ1RMX0RTUF9TVUJESVZJREVfaW5zdGVhZAorI2RlZmluZSBTT1VORF9QQ01fU0VURlJBR01FTlQgICAgICAgICAgIFNPVU5EX1BDTV9TRVRGUkFHTUVOVF9pc19vYnNvbGV0ZV91c2VfU05EQ1RMX0RTUF9TRVRGUkFHTUVOVF9pbnN0ZWFkCisjZGVmaW5lIFNPVU5EX1BDTV9HRVRGTVRTICAgICAgICAgICAgICAgU09VTkRfUENNX0dFVEZNVFNfaXNfb2Jzb2xldGVfdXNlX1NORENUTF9EU1BfR0VURk1UU19pbnN0ZWFkCisjZGVmaW5lIFNPVU5EX1BDTV9TRVRGTVQgICAgICAgICAgICAgICAgU09VTkRfUENNX1NFVEZNVF9pc19vYnNvbGV0ZV91c2VfU05EQ1RMX0RTUF9TRVRGTVRfaW5zdGVhZAorI2RlZmluZSBTT1VORF9QQ01fR0VUT1NQQUNFICAgICAgICAgICAgIFNPVU5EX1BDTV9HRVRPU1BBQ0VfaXNfb2Jzb2xldGVfdXNlX1NORENUTF9EU1BfR0VUT1NQQUNFX2luc3RlYWQKKyNkZWZpbmUgU09VTkRfUENNX0dFVElTUEFDRSAgICAgICAgICAgICBTT1VORF9QQ01fR0VUSVNQQUNFX2lzX29ic29sZXRlX3VzZV9TTkRDVExfRFNQX0dFVElTUEFDRV9pbnN0ZWFkCisjZGVmaW5lIFNPVU5EX1BDTV9OT05CTE9DSyAgICAgICAgICAgICAgU09VTkRfUENNX05PTkJMT0NLX2lzX29ic29sZXRlX3VzZV9TTkRDVExfRFNQX05PTkJMT0NLX2luc3RlYWQKKyNkZWZpbmUgU09VTkRfUENNX0dFVENBUFMgICAgICAgICAgICAgICBTT1VORF9QQ01fR0VUQ0FQU19pc19vYnNvbGV0ZV91c2VfU05EQ1RMX0RTUF9HRVRDQVBTX2luc3RlYWQKKyNkZWZpbmUgU09VTkRfUENNX0dFVFRSSUdHRVIgICAgICAgICAgICBTT1VORF9QQ01fR0VUVFJJR0dFUl9pc19vYnNvbGV0ZV91c2VfU05EQ1RMX0RTUF9HRVRUUklHR0VSX2luc3RlYWQKKyNkZWZpbmUgU09VTkRfUENNX1NFVFRSSUdHRVIgICAgICAgICAgICBTT1VORF9QQ01fU0VUVFJJR0dFUl9pc19vYnNvbGV0ZV91c2VfU05EQ1RMX0RTUF9TRVRUUklHR0VSX2luc3RlYWQKKyNkZWZpbmUgU09VTkRfUENNX1NFVFNZTkNSTyAgICAgICAgICAgICBTT1VORF9QQ01fU0VUU1lOQ1JPX2lzX29ic29sZXRlX3VzZV9TTkRDVExfRFNQX1NFVFNZTkNST19pbnN0ZWFkCisjZGVmaW5lIFNPVU5EX1BDTV9HRVRJUFRSICAgICAgICAgICAgICAgU09VTkRfUENNX0dFVElQVFJfaXNfb2Jzb2xldGVfdXNlX1NORENUTF9EU1BfR0VUSVBUUl9pbnN0ZWFkCisjZGVmaW5lIFNPVU5EX1BDTV9HRVRPUFRSICAgICAgICAgICAgICAgU09VTkRfUENNX0dFVE9QVFJfaXNfb2Jzb2xldGVfdXNlX1NORENUTF9EU1BfR0VUT1BUUl9pbnN0ZWFkCisjZGVmaW5lIFNPVU5EX1BDTV9NQVBJTkJVRiAgICAgICAgICAgICAgU09VTkRfUENNX01BUElOQlVGX2lzX29ic29sZXRlX3VzZV9TTkRDVExfRFNQX01BUElOQlVGX2luc3RlYWQKKyNkZWZpbmUgU09VTkRfUENNX01BUE9VVEJVRiAgICAgICAgICAgICBTT1VORF9QQ01fTUFQT1VUQlVGX2lzX29ic29sZXRlX3VzZV9TTkRDVExfRFNQX01BUE9VVEJVRl9pbnN0ZWFkCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXMvb3NzNC9vc3M0LXNvdXJjZS5jIGIvc3lzL29zczQvb3NzNC1zb3VyY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGIzMTVkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zczQvb3NzNC1zb3VyY2UuYwpAQCAtMCwwICsxLDU0NiBAQAorLyogR1N0cmVhbWVyIE9TUzQgYXVkaW8gc291cmNlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LW9zczRzcmMKKyAqCisgKiBUaGlzIGVsZW1lbnQgbGV0cyB5b3UgcmVjb3JkIHNvdW5kIHVzaW5nIHRoZSBPcGVuIFNvdW5kIFN5c3RlbSAoT1NTKQorICogdmVyc2lvbiA0LgorICogCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIC12IG9zczRzcmMgISBxdWV1ZSAhIGF1ZGlvY29udmVydCAhIHZvcmJpc2VuYyAhIG9nZ211eCAhIGZpbGVzaW5rIGxvY2F0aW9uPW15bXVzaWMub2dnCisgKiBdfCB3aWxsIHJlY29yZCBzb3VuZCBmcm9tIHlvdXIgc291bmQgY2FyZCB1c2luZyBPU1M0IGFuZCBlbmNvZGUgaXQgdG8gYW4KKyAqIE9nZy9Wb3JiaXMgZmlsZSAodGhpcyB3aWxsIG9ubHkgd29yayBpZiB5b3VyIG1peGVyIHNldHRpbmdzIGFyZSByaWdodAorICogYW5kIHRoZSByaWdodCBpbnB1dHMgYXJlZW5hYmxlZCBldGMuKQorICogPC9yZWZzZWN0Mj4KKyAqLworCisvKiBGSVhNRTogbWFrZSBzdXJlIHdlJ3JlIG5vdCBkb2luZyBpb2N0bHMgZnJvbSB0aGUgYXBwIHRocmVhZCAoZS5nLiB2aWEgdGhlCisgKiBtaXhlciBpbnRlcmZhY2UpIHdoaWxlIHJlY29yZGluZyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworI2RlZmluZSBOT19MRUdBQ1lfTUlYRVIKKyNpbmNsdWRlICJvc3M0LWF1ZGlvLmgiCisjaW5jbHVkZSAib3NzNC1zb3VyY2UuaCIKKyNpbmNsdWRlICJvc3M0LXByb3BlcnR5LXByb2JlLmgiCisjaW5jbHVkZSAib3NzNC1zb3VuZGNhcmQuaCIKKworI2RlZmluZSBHU1RfT1NTNF9TT1VSQ0VfSVNfT1BFTihzcmMpICAoR1NUX09TUzRfU09VUkNFKHNyYyktPmZkICE9IC0xKQorCitHU1RfREVCVUdfQ0FURUdPUllfRVhURVJOIChvc3M0c3JjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIG9zczRzcmNfZGVidWcKKworI2RlZmluZSBERUZBVUxUX0RFVklDRSAgICAgICBOVUxMCisjZGVmaW5lIERFRkFVTFRfREVWSUNFX05BTUUgIE5VTEwKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfREVWSUNFLAorICBQUk9QX0RFVklDRV9OQU1FCit9OworCisjZGVmaW5lIGdzdF9vc3M0X3NvdXJjZV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RPc3M0U291cmNlLCBnc3Rfb3NzNF9zb3VyY2UsIEdTVF9UWVBFX0FVRElPX1NSQyk7CisKK3N0YXRpYyB2b2lkIGdzdF9vc3M0X3NvdXJjZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfb3NzNF9zb3VyY2Vfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgdm9pZCBnc3Rfb3NzNF9zb3VyY2VfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgdm9pZCBnc3Rfb3NzNF9zb3VyY2VfZmluYWxpemUgKEdzdE9zczRTb3VyY2UgKiBvc3NzcmMpOworCitzdGF0aWMgR3N0Q2FwcyAqZ3N0X29zczRfc291cmNlX2dldGNhcHMgKEdzdEJhc2VTcmMgKiBic3JjLCBHc3RDYXBzICogZmlsdGVyKTsKKworc3RhdGljIGdib29sZWFuIGdzdF9vc3M0X3NvdXJjZV9vcGVuIChHc3RBdWRpb1NyYyAqIGFzcmMsCisgICAgZ2Jvb2xlYW4gc2lsZW50X2Vycm9ycyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zczRfc291cmNlX29wZW5fZnVuYyAoR3N0QXVkaW9TcmMgKiBhc3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3NzNF9zb3VyY2VfY2xvc2UgKEdzdEF1ZGlvU3JjICogYXNyYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zczRfc291cmNlX3ByZXBhcmUgKEdzdEF1ZGlvU3JjICogYXNyYywKKyAgICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zczRfc291cmNlX3VucHJlcGFyZSAoR3N0QXVkaW9TcmMgKiBhc3JjKTsKK3N0YXRpYyBndWludCBnc3Rfb3NzNF9zb3VyY2VfcmVhZCAoR3N0QXVkaW9TcmMgKiBhc3JjLCBncG9pbnRlciBkYXRhLAorICAgIGd1aW50IGxlbmd0aCwgR3N0Q2xvY2tUaW1lICogdGltZXN0YW1wKTsKK3N0YXRpYyBndWludCBnc3Rfb3NzNF9zb3VyY2VfZGVsYXkgKEdzdEF1ZGlvU3JjICogYXNyYyk7CitzdGF0aWMgdm9pZCBnc3Rfb3NzNF9zb3VyY2VfcmVzZXQgKEdzdEF1ZGlvU3JjICogYXNyYyk7CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzNF9zb3VyY2VfY2xhc3NfaW5pdCAoR3N0T3NzNFNvdXJjZUNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCYXNlU3JjQ2xhc3MgKmdzdGJhc2VzcmNfY2xhc3M7CisgIEdzdEF1ZGlvU3JjQ2xhc3MgKmdzdGF1ZGlvc3JjX2NsYXNzOworICBHc3RQYWRUZW1wbGF0ZSAqdGVtcGw7CisKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIGdzdGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnc3RiYXNlc3JjX2NsYXNzID0gKEdzdEJhc2VTcmNDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YXVkaW9zcmNfY2xhc3MgPSAoR3N0QXVkaW9TcmNDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X29zczRfc291cmNlX2Rpc3Bvc2U7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gKEdPYmplY3RGaW5hbGl6ZUZ1bmMpIGdzdF9vc3M0X3NvdXJjZV9maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X29zczRfc291cmNlX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X29zczRfc291cmNlX3NldF9wcm9wZXJ0eTsKKworICBnc3RiYXNlc3JjX2NsYXNzLT5nZXRfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzNF9zb3VyY2VfZ2V0Y2Fwcyk7CisKKyAgZ3N0YXVkaW9zcmNfY2xhc3MtPm9wZW4gPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zczRfc291cmNlX29wZW5fZnVuYyk7CisgIGdzdGF1ZGlvc3JjX2NsYXNzLT5wcmVwYXJlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3M0X3NvdXJjZV9wcmVwYXJlKTsKKyAgZ3N0YXVkaW9zcmNfY2xhc3MtPnVucHJlcGFyZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzNF9zb3VyY2VfdW5wcmVwYXJlKTsKKyAgZ3N0YXVkaW9zcmNfY2xhc3MtPmNsb3NlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3M0X3NvdXJjZV9jbG9zZSk7CisgIGdzdGF1ZGlvc3JjX2NsYXNzLT5yZWFkID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3M0X3NvdXJjZV9yZWFkKTsKKyAgZ3N0YXVkaW9zcmNfY2xhc3MtPmRlbGF5ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3M0X3NvdXJjZV9kZWxheSk7CisgIGdzdGF1ZGlvc3JjX2NsYXNzLT5yZXNldCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3NzNF9zb3VyY2VfcmVzZXQpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfREVWSUNFLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRldmljZSIsICJEZXZpY2UiLAorICAgICAgICAgICJPU1M0IGRldmljZSAoZS5nLiAvZGV2L29zcy9oZGF1ZGlvMC9wY20wIG9yIC9kZXYvZHNwTikgIgorICAgICAgICAgICIoTlVMTCA9IHVzZSBmaXJzdCBhdmFpbGFibGUgZGV2aWNlKSIsCisgICAgICAgICAgREVGQVVMVF9ERVZJQ0UsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfREVWSUNFX05BTUUsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZGV2aWNlLW5hbWUiLCAiRGV2aWNlIG5hbWUiLAorICAgICAgICAgICJIdW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBzb3VuZCBkZXZpY2UiLCBERUZBVUxUX0RFVklDRV9OQU1FLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJPU1MgdjQgQXVkaW8gU291cmNlIiwgIlNvdXJjZS9BdWRpbyIsCisgICAgICAiQ2FwdHVyZSBmcm9tIGEgc291bmQgY2FyZCB2aWEgT1NTIHZlcnNpb24gNCIsCisgICAgICAiVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4iKTsKKworICB0ZW1wbCA9IGdzdF9wYWRfdGVtcGxhdGVfbmV3ICgic3JjIiwgR1NUX1BBRF9TUkMsIEdTVF9QQURfQUxXQVlTLAorICAgICAgZ3N0X29zczRfYXVkaW9fZ2V0X3RlbXBsYXRlX2NhcHMgKCkpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCB0ZW1wbCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3NzNF9zb3VyY2VfaW5pdCAoR3N0T3NzNFNvdXJjZSAqIG9zc3NyYykKK3sKKyAgY29uc3QgZ2NoYXIgKmRldmljZTsKKworICBkZXZpY2UgPSBnX2dldGVudiAoIkFVRElPREVWIik7CisgIGlmIChkZXZpY2UgPT0gTlVMTCkKKyAgICBkZXZpY2UgPSBERUZBVUxUX0RFVklDRTsKKworICBvc3NzcmMtPmZkID0gLTE7CisgIG9zc3NyYy0+ZGV2aWNlID0gZ19zdHJkdXAgKGRldmljZSk7CisgIG9zc3NyYy0+ZGV2aWNlX25hbWUgPSBnX3N0cmR1cCAoREVGQVVMVF9ERVZJQ0VfTkFNRSk7CisgIG9zc3NyYy0+ZGV2aWNlX25hbWUgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zczRfc291cmNlX2ZpbmFsaXplIChHc3RPc3M0U291cmNlICogb3NzKQoreworICBnX2ZyZWUgKG9zcy0+ZGV2aWNlKTsKKyAgb3NzLT5kZXZpY2UgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAoKEdPYmplY3QgKikgKG9zcykpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zczRfc291cmNlX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdE9zczRTb3VyY2UgKm9zcyA9IEdTVF9PU1M0X1NPVVJDRSAob2JqZWN0KTsKKworICBpZiAob3NzLT5wcm9iZWRfY2FwcykgeworICAgIGdzdF9jYXBzX3VucmVmIChvc3MtPnByb2JlZF9jYXBzKTsKKyAgICBvc3MtPnByb2JlZF9jYXBzID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zczRfc291cmNlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RPc3M0U291cmNlICpvc3M7CisKKyAgb3NzID0gR1NUX09TUzRfU09VUkNFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9ERVZJQ0U6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKG9zcyk7CisgICAgICBpZiAob3NzLT5mZCA9PSAtMSkgeworICAgICAgICBnX2ZyZWUgKG9zcy0+ZGV2aWNlKTsKKyAgICAgICAgb3NzLT5kZXZpY2UgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgICAgZ19mcmVlIChvc3MtPmRldmljZV9uYW1lKTsKKyAgICAgICAgb3NzLT5kZXZpY2VfbmFtZSA9IE5VTEw7CisgICAgICB9IGVsc2UgeworICAgICAgICBnX3dhcm5pbmcgKCIlczogY2FuJ3QgY2hhbmdlIFwiZGV2aWNlXCIgcHJvcGVydHkgd2hpbGUgYXVkaW8gc291cmNlICIKKyAgICAgICAgICAgICJpcyBvcGVuIiwgR1NUX09CSkVDVF9OQU1FIChvc3MpKTsKKyAgICAgIH0KKyAgICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChvc3MpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X29zczRfc291cmNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RPc3M0U291cmNlICpvc3M7CisKKyAgb3NzID0gR1NUX09TUzRfU09VUkNFIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9ERVZJQ0U6CisgICAgICBHU1RfT0JKRUNUX0xPQ0sgKG9zcyk7CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBvc3MtPmRldmljZSk7CisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAob3NzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERVZJQ0VfTkFNRToKKyAgICAgIEdTVF9PQkpFQ1RfTE9DSyAob3NzKTsKKyAgICAgIC8qIElmIGRldmljZSBpcyBzZXQsIHRyeSB0byByZXRyaWV2ZSB0aGUgbmFtZSBldmVuIGlmIHdlJ3JlIG5vdCBvcGVuICovCisgICAgICBpZiAob3NzLT5mZCA9PSAtMSAmJiBvc3MtPmRldmljZSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChnc3Rfb3NzNF9zb3VyY2Vfb3BlbiAoR1NUX0FVRElPX1NSQyAob3NzKSwgVFJVRSkpIHsKKyAgICAgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBvc3MtPmRldmljZV9uYW1lKTsKKyAgICAgICAgICBnc3Rfb3NzNF9zb3VyY2VfY2xvc2UgKEdTVF9BVURJT19TUkMgKG9zcykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdjaGFyICpuYW1lID0gTlVMTDsKKworICAgICAgICAgIGdzdF9vc3M0X3Byb3BlcnR5X3Byb2JlX2ZpbmRfZGV2aWNlX25hbWVfbm9mZCAoR1NUX09CSkVDVCAob3NzKSwKKyAgICAgICAgICAgICAgb3NzLT5kZXZpY2UsICZuYW1lKTsKKyAgICAgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBuYW1lKTsKKyAgICAgICAgICBnX2ZyZWUgKG5hbWUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBvc3MtPmRldmljZV9uYW1lKTsKKyAgICAgIH0KKworICAgICAgR1NUX09CSkVDVF9VTkxPQ0sgKG9zcyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9vc3M0X3NvdXJjZV9nZXRjYXBzIChHc3RCYXNlU3JjICogYnNyYywgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0T3NzNFNvdXJjZSAqb3NzOworICBHc3RDYXBzICpjYXBzOworCisgIG9zcyA9IEdTVF9PU1M0X1NPVVJDRSAoYnNyYyk7CisKKyAgaWYgKG9zcy0+ZmQgPT0gLTEpIHsKKyAgICBjYXBzID0gZ3N0X29zczRfYXVkaW9fZ2V0X3RlbXBsYXRlX2NhcHMgKCk7CisgIH0gZWxzZSBpZiAob3NzLT5wcm9iZWRfY2FwcykgeworICAgIGNhcHMgPSBnc3RfY2Fwc19jb3B5IChvc3MtPnByb2JlZF9jYXBzKTsKKyAgfSBlbHNlIHsKKyAgICBjYXBzID0gZ3N0X29zczRfYXVkaW9fcHJvYmVfY2FwcyAoR1NUX09CSkVDVCAob3NzKSwgb3NzLT5mZCk7CisgICAgaWYgKGNhcHMgIT0gTlVMTCAmJiAhZ3N0X2NhcHNfaXNfZW1wdHkgKGNhcHMpKSB7CisgICAgICBvc3MtPnByb2JlZF9jYXBzID0gZ3N0X2NhcHNfY29weSAoY2Fwcyk7CisgICAgfQorICB9CisKKyAgaWYgKGZpbHRlciAmJiBjYXBzKSB7CisgICAgR3N0Q2FwcyAqaW50ZXJzZWN0aW9uOworCisgICAgaW50ZXJzZWN0aW9uID0KKyAgICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgY2FwcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgICAgcmV0dXJuIGludGVyc2VjdGlvbjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gY2FwczsKKyAgfQorfQorCisvKiBub3RlOiB3ZSBtdXN0IG5vdCB0YWtlIHRoZSBvYmplY3QgbG9jayBoZXJlIHVubGVzcyB3ZSBmaXggdXAgZ2V0X3Byb3BlcnR5ICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3M0X3NvdXJjZV9vcGVuIChHc3RBdWRpb1NyYyAqIGFzcmMsIGdib29sZWFuIHNpbGVudF9lcnJvcnMpCit7CisgIEdzdE9zczRTb3VyY2UgKm9zczsKKyAgZ2NoYXIgKmRldmljZTsKKyAgaW50IG1vZGU7CisKKyAgb3NzID0gR1NUX09TUzRfU09VUkNFIChhc3JjKTsKKworICBpZiAob3NzLT5kZXZpY2UpCisgICAgZGV2aWNlID0gZ19zdHJkdXAgKG9zcy0+ZGV2aWNlKTsKKyAgZWxzZQorICAgIGRldmljZSA9IGdzdF9vc3M0X2F1ZGlvX2ZpbmRfZGV2aWNlIChHU1RfT0JKRUNUX0NBU1QgKG9zcykpOworCisgIC8qIGRlc3BlcmF0ZSB0aW1lcywgZGVzcGVyYXRlIG1lYXN1cmVzICovCisgIGlmIChkZXZpY2UgPT0gTlVMTCkKKyAgICBkZXZpY2UgPSBnX3N0cmR1cCAoIi9kZXYvZHNwMCIpOworCisgIEdTVF9JTkZPX09CSkVDVCAob3NzLCAiVHJ5aW5nIHRvIG9wZW4gT1NTNCBkZXZpY2UgJyVzJyIsIGRldmljZSk7CisKKyAgLyogd2Ugb3BlbiBpbiBub24tYmxvY2tpbmcgbW9kZSBldmVuIGlmIHdlIGRvbid0IHJlYWxseSB3YW50IHRvIGRvIHdyaXRlcworICAgKiBub24tYmxvY2tpbmcgYmVjYXVzZSB3ZSBjYW4ndCBiZSBzdXJlIHRoYXQgdGhpcyBpcyByZWFsbHkgYSBnZW51aW5lCisgICAqIE9TUzQgZGV2aWNlIHdpdGggd2VsbC1iZWhhdmVkIGRyaXZlcnMgZXRjLiBXZSByZWFsbHkgZG9uJ3Qgd2FudCB0bworICAgKiBoYW5nIGZvcmV2ZXIgdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMuICovCisgIG9zcy0+ZmQgPSBvcGVuIChkZXZpY2UsIE9fUkRPTkxZIHwgT19OT05CTE9DSywgMCk7CisgIGlmIChvc3MtPmZkID09IC0xKSB7CisgICAgc3dpdGNoIChlcnJubykgeworICAgICAgY2FzZSBFQlVTWToKKyAgICAgICAgZ290byBidXN5OworICAgICAgY2FzZSBFQUNDRVM6CisgICAgICAgIGdvdG8gbm9fcGVybWlzc2lvbjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gb3Blbl9mYWlsZWQ7CisgICAgfQorICB9CisKKyAgR1NUX0lORk9fT0JKRUNUIChvc3MsICJPcGVuZWQgZGV2aWNlIik7CisKKyAgLyogTWFrZSBzdXJlIGl0J3MgT1NTNC4gSWYgaXQncyBvbGQgT1NTLCBsZXQgb3Nzc2luayBoYW5kbGUgaXQgKi8KKyAgaWYgKCFnc3Rfb3NzNF9hdWRpb19jaGVja192ZXJzaW9uIChHU1RfT0JKRUNUX0NBU1QgKG9zcyksIG9zcy0+ZmQpKQorICAgIGdvdG8gbGVnYWN5X29zczsKKworICAvKiBub3cgcmVtb3ZlIHRoZSBub24tYmxvY2tpbmcgZmxhZy4gKi8KKyAgbW9kZSA9IGZjbnRsIChvc3MtPmZkLCBGX0dFVEZMKTsKKyAgbW9kZSAmPSB+T19OT05CTE9DSzsKKyAgaWYgKGZjbnRsIChvc3MtPmZkLCBGX1NFVEZMLCBtb2RlKSA8IDApIHsKKyAgICAvKiBzb21lIGRyaXZlcnMgZG8gbm8gc3VwcG9ydCB1bnNldHRpbmcgdGhlIG5vbi1ibG9ja2luZyBmbGFnLCB0cnkgdG8KKyAgICAgKiBjbG9zZS9vcGVuIHRoZSBkZXZpY2UgdGhlbi4gVGhpcyBpcyByYWN5IGJ1dCB3ZSBlcnJvciBvdXQgcHJvcGVybHkuICovCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChvc3MsICJmYWlsZWQgdG8gdW5zZXQgT19OT05CTE9DSyAoYnVnZ3kgZHJpdmVyPyksICIKKyAgICAgICAgIndpbGwgdHJ5IHRvIHJlLW9wZW4gZGV2aWNlIG5vdyIpOworICAgIGdzdF9vc3M0X3NvdXJjZV9jbG9zZSAoYXNyYyk7CisgICAgaWYgKChvc3MtPmZkID0gb3BlbiAoZGV2aWNlLCBPX1JET05MWSwgMCkpID09IC0xKQorICAgICAgZ290byBub25fYmxvY2s7CisgIH0KKworICBvc3MtPm9wZW5fZGV2aWNlID0gZGV2aWNlOworCisgIC8qIG5vdCB1c2luZyBFTkdJTkVJTkZPIGhlcmUgYmVjYXVzZSBpdCBzb21ldGltZXMgcmV0dXJucyBhIGRpZmZlcmVudCBhbmQKKyAgICogbGVzcyB1c2VmdWwgbmFtZSB0aGFuIEFVRElPSU5GTyBmb3IgdGhlIHNhbWUgZGV2aWNlICovCisgIGlmICghZ3N0X29zczRfcHJvcGVydHlfcHJvYmVfZmluZF9kZXZpY2VfbmFtZSAoR1NUX09CSkVDVCAob3NzKSwgb3NzLT5mZCwKKyAgICAgICAgICBvc3MtPm9wZW5fZGV2aWNlLCAmb3NzLT5kZXZpY2VfbmFtZSkpIHsKKyAgICBvc3MtPmRldmljZV9uYW1lID0gTlVMTDsKKyAgfQorCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworYnVzeToKKyAgeworICAgIGlmICghc2lsZW50X2Vycm9ycykgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9zcywgUkVTT1VSQ0UsIEJVU1ksCisgICAgICAgICAgKF8oIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suICIKKyAgICAgICAgICAgICAgICAgICJEZXZpY2UgaXMgYmVpbmcgdXNlZCBieSBhbm90aGVyIGFwcGxpY2F0aW9uLiIpKSwgKE5VTEwpKTsKKyAgICB9CisgICAgZ19mcmVlIChkZXZpY2UpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fcGVybWlzc2lvbjoKKyAgeworICAgIGlmICghc2lsZW50X2Vycm9ycykgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9zcywgUkVTT1VSQ0UsIE9QRU5fUkVBRCwKKyAgICAgICAgICAoXygiQ291bGQgbm90IG9wZW4gYXVkaW8gZGV2aWNlIGZvciBwbGF5YmFjay4gIgorICAgICAgICAgICAgICAgICAgIllvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gb3BlbiB0aGUgZGV2aWNlLiIpKSwKKyAgICAgICAgICBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICB9CisgICAgZ19mcmVlIChkZXZpY2UpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorb3Blbl9mYWlsZWQ6CisgIHsKKyAgICBpZiAoIXNpbGVudF9lcnJvcnMpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChvc3MsIFJFU09VUkNFLCBPUEVOX1JFQUQsCisgICAgICAgICAgKF8oIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIGRldmljZSBmb3IgcGxheWJhY2suIikpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICB9CisgICAgZ19mcmVlIChkZXZpY2UpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbGVnYWN5X29zczoKKyAgeworICAgIGdzdF9vc3M0X3NvdXJjZV9jbG9zZSAoYXNyYyk7CisgICAgaWYgKCFzaWxlbnRfZXJyb3JzKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3NzLCBSRVNPVVJDRSwgT1BFTl9SRUFELAorICAgICAgICAgIChfKCJDb3VsZCBub3Qgb3BlbiBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLiAiCisgICAgICAgICAgICAgICAgICAiVGhpcyB2ZXJzaW9uIG9mIHRoZSBPcGVuIFNvdW5kIFN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgIgorICAgICAgICAgICAgICAgICAgImVsZW1lbnQuIikpLCAoIlRyeSB0aGUgJ29zc3NpbmsnIGVsZW1lbnQgaW5zdGVhZCIpKTsKKyAgICB9CisgICAgZ19mcmVlIChkZXZpY2UpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9uX2Jsb2NrOgorICB7CisgICAgaWYgKCFzaWxlbnRfZXJyb3JzKSB7CisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3NzLCBSRVNPVVJDRSwgU0VUVElOR1MsIChOVUxMKSwKKyAgICAgICAgICAoIlVuYWJsZSB0byBzZXQgZGV2aWNlICVzIGludG8gbm9uLWJsb2NraW5nIG1vZGU6ICVzIiwKKyAgICAgICAgICAgICAgb3NzLT5kZXZpY2UsIGdfc3RyZXJyb3IgKGVycm5vKSkpOworICAgIH0KKyAgICBnX2ZyZWUgKGRldmljZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zczRfc291cmNlX29wZW5fZnVuYyAoR3N0QXVkaW9TcmMgKiBhc3JjKQoreworICByZXR1cm4gZ3N0X29zczRfc291cmNlX29wZW4gKGFzcmMsIEZBTFNFKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3NzNF9zb3VyY2VfY2xvc2UgKEdzdEF1ZGlvU3JjICogYXNyYykKK3sKKyAgR3N0T3NzNFNvdXJjZSAqb3NzOworCisgIG9zcyA9IEdTVF9PU1M0X1NPVVJDRSAoYXNyYyk7CisKKyAgaWYgKG9zcy0+ZmQgIT0gLTEpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChvc3MsICJjbG9zaW5nIGRldmljZSIpOworICAgIGNsb3NlIChvc3MtPmZkKTsKKyAgICBvc3MtPmZkID0gLTE7CisgIH0KKworICBvc3MtPmJ5dGVzX3Blcl9zYW1wbGUgPSAwOworCisgIGdzdF9jYXBzX3JlcGxhY2UgKCZvc3MtPnByb2JlZF9jYXBzLCBOVUxMKTsKKworICBnX2ZyZWUgKG9zcy0+b3Blbl9kZXZpY2UpOworICBvc3MtPm9wZW5fZGV2aWNlID0gTlVMTDsKKworICBnX2ZyZWUgKG9zcy0+ZGV2aWNlX25hbWUpOworICBvc3MtPmRldmljZV9uYW1lID0gTlVMTDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3NzNF9zb3VyY2VfcHJlcGFyZSAoR3N0QXVkaW9TcmMgKiBhc3JjLCBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYykKK3sKKyAgR3N0T3NzNFNvdXJjZSAqb3NzOworCisgIG9zcyA9IEdTVF9PU1M0X1NPVVJDRSAoYXNyYyk7CisKKyAgaWYgKCFnc3Rfb3NzNF9hdWRpb19zZXRfZm9ybWF0IChHU1RfT0JKRUNUX0NBU1QgKG9zcyksIG9zcy0+ZmQsIHNwZWMpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChvc3MsICJDb3VsZG4ndCBzZXQgcmVxdWVzdGVkIGZvcm1hdCAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgc3BlYy0+Y2Fwcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgb3NzLT5ieXRlc19wZXJfc2FtcGxlID0gR1NUX0FVRElPX0lORk9fQlBGICgmc3BlYy0+aW5mbyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zczRfc291cmNlX3VucHJlcGFyZSAoR3N0QXVkaW9TcmMgKiBhc3JjKQoreworICAvKiBjb3VsZCBkbyBhIFNORENUTF9EU1BfSEFMVCwgYnV0IHRoZSBPU1MgbWFudWFsIHJlY29tbWVuZHMgYSBjbG9zZS9vcGVuLAorICAgKiBzaW5jZSBIQUxUIHdvbid0IHByb3Blcmx5IHJlc2V0IHNvbWUgZGV2aWNlcywgYXBwYXJlbnRseSAqLworCisgIGlmICghZ3N0X29zczRfc291cmNlX2Nsb3NlIChhc3JjKSkKKyAgICBnb3RvIGNvdWxkbnRfY2xvc2U7CisKKyAgaWYgKCFnc3Rfb3NzNF9zb3VyY2Vfb3Blbl9mdW5jIChhc3JjKSkKKyAgICBnb3RvIGNvdWxkbnRfcmVvcGVuOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworY291bGRudF9jbG9zZToKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFzcmMsICJDb3VsZG4ndCBjbG9zZSB0aGUgYXVkaW8gZGV2aWNlIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citjb3VsZG50X3Jlb3BlbjoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFzcmMsICJDb3VsZG4ndCByZW9wZW4gdGhlIGF1ZGlvIGRldmljZSIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ3VpbnQKK2dzdF9vc3M0X3NvdXJjZV9yZWFkIChHc3RBdWRpb1NyYyAqIGFzcmMsIGdwb2ludGVyIGRhdGEsIGd1aW50IGxlbmd0aCwKKyAgICBHc3RDbG9ja1RpbWUgKiB0aW1lc3RhbXApCit7CisgIEdzdE9zczRTb3VyY2UgKm9zczsKKyAgaW50IG47CisKKyAgb3NzID0gR1NUX09TUzRfU09VUkNFX0NBU1QgKGFzcmMpOworCisgIG4gPSByZWFkIChvc3MtPmZkLCBkYXRhLCBsZW5ndGgpOworICBHU1RfTE9HX09CSkVDVCAoYXNyYywgIiV1IGJ5dGVzLCAldSBzYW1wbGVzIiwgbiwgbiAvIG9zcy0+Ynl0ZXNfcGVyX3NhbXBsZSk7CisKKyAgaWYgKEdfVU5MSUtFTFkgKG4gPCAwKSkgeworICAgIHN3aXRjaCAoZXJybm8pIHsKKyAgICAgIGNhc2UgRU5PVFNVUDoKKyAgICAgIGNhc2UgRUFDQ0VTOnsKKyAgICAgICAgLyogVGhpcyBpcyB0aGUgbW9zdCBsaWtlbHkgY2F1c2UsIEkgdGhpbmsgKi8KKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGFzcmMsIFJFU09VUkNFLCBSRUFELAorICAgICAgICAgICAgKF8oIlJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYXVkaW8gZGV2aWNlLiIpKSwKKyAgICAgICAgICAgICgicmVhZDogJXMgKGRldmljZTogJXMpIChtYXliZSB0aGlzIGlzIGFuIG91dHB1dC1vbmx5IGRldmljZT8pIiwKKyAgICAgICAgICAgICAgICBnX3N0cmVycm9yIChlcnJubyksIG9zcy0+b3Blbl9kZXZpY2UpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OnsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGFzcmMsIFJFU09VUkNFLCBSRUFELAorICAgICAgICAgICAgKF8oIkVycm9yIHJlY29yZGluZyBmcm9tIGF1ZGlvIGRldmljZS4iKSksCisgICAgICAgICAgICAoInJlYWQ6ICVzIChkZXZpY2U6ICVzKSIsIGdfc3RyZXJyb3IgKGVycm5vKSwgb3NzLT5vcGVuX2RldmljZSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gKGd1aW50KSBuOworfQorCitzdGF0aWMgZ3VpbnQKK2dzdF9vc3M0X3NvdXJjZV9kZWxheSAoR3N0QXVkaW9TcmMgKiBhc3JjKQoreworICBhdWRpb19idWZfaW5mbyBpbmZvID0geyAwLCB9OworICBHc3RPc3M0U291cmNlICpvc3M7CisgIGd1aW50IGRlbGF5OworCisgIG9zcyA9IEdTVF9PU1M0X1NPVVJDRV9DQVNUIChhc3JjKTsKKworICBpZiAoaW9jdGwgKG9zcy0+ZmQsIFNORENUTF9EU1BfR0VUSVNQQUNFLCAmaW5mbykgPT0gLTEpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAob3NzLCAiR0VUSVNQQUNFIGZhaWxlZDogJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworICAgIHJldHVybiAwOworICB9CisKKyAgZGVsYXkgPSAoaW5mby5mcmFnc3RvdGFsICogaW5mby5mcmFnc2l6ZSkgLSBpbmZvLmJ5dGVzOworICBHU1RfTE9HX09CSkVDVCAob3NzLCAiZnJhZ3N0b3RhbDolZCwgZnJhZ3NpemU6JWQsIGJ5dGVzOiVkLCBkZWxheTolZCIsCisgICAgICBpbmZvLmZyYWdzdG90YWwsIGluZm8uZnJhZ3NpemUsIGluZm8uYnl0ZXMsIGRlbGF5KTsKKyAgcmV0dXJuIGRlbGF5OworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zczRfc291cmNlX3Jlc2V0IChHc3RBdWRpb1NyYyAqIGFzcmMpCit7CisgIC8qIFRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gaGVyZSByZWFsbHk6IE9TUyBjYW4ndCBoYW5kbGUgYWNjZXNzIHRvIHRoZQorICAgKiBzYW1lIGRldmljZS9mZCBmcm9tIG11bHRpcGxlIHRocmVhZHMgYW5kIG1pZ2h0IGRlYWRsb2NrIG9yIGJsb3cgdXAgaW4KKyAgICogb3RoZXIgd2F5cyBpZiB3ZSB0cnkgYW4gaW9jdGwgU05EQ1RMX0RTUF9IQUxUIG9yIHNpbWlsYXIgKi8KK30KZGlmZiAtLWdpdCBhL3N5cy9vc3M0L29zczQtc291cmNlLmggYi9zeXMvb3NzNC9vc3M0LXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZDhmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3NzNC9vc3M0LXNvdXJjZS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIEdTdHJlYW1lciBPU1M0IGF1ZGlvIHNvdXJjZQorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIEdTVF9PU1M0X1NPVVJDRV9ICisjZGVmaW5lIEdTVF9PU1M0X1NPVVJDRV9ICisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvc3JjLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9PU1M0X1NPVVJDRSAgICAgICAgICAgIChnc3Rfb3NzNF9zb3VyY2VfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX09TUzRfU09VUkNFKG9iaikgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfT1NTNF9TT1VSQ0UsR3N0T3NzNFNvdXJjZSkpCisjZGVmaW5lIEdTVF9PU1M0X1NPVVJDRV9DQVNUKG9iaikgICAgICAgKChHc3RPc3M0U291cmNlICopKG9iaikpCisjZGVmaW5lIEdTVF9PU1M0X1NPVVJDRV9DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfT1NTNF9TT1VSQ0UsR3N0T3NzNFNvdXJjZUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX09TUzRfU09VUkNFKG9iaikgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfT1NTNF9TT1VSQ0UpKQorI2RlZmluZSBHU1RfSVNfT1NTNF9TT1VSQ0VfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX09TUzRfU09VUkNFKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zczRTb3VyY2UgR3N0T3NzNFNvdXJjZTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RPc3M0U291cmNlQ2xhc3MgR3N0T3NzNFNvdXJjZUNsYXNzOworCitzdHJ1Y3QgX0dzdE9zczRTb3VyY2UgeworICBHc3RBdWRpb1NyYyAgICAgYXVkaW9zcmM7CisKKyAgZ2NoYXIgICAgICAgICAqIGRldmljZTsgICAgICAgICAgICAgLyogTlVMTCBpZiBub25lIHdhcyBzZXQgICAgICAqLworICBnY2hhciAgICAgICAgICogb3Blbl9kZXZpY2U7ICAgICAgICAvKiB0aGUgZGV2aWNlIHdlIG9wZW5lZCAgICAgICovCisgIGdjaGFyICAgICAgICAgKiBkZXZpY2VfbmFtZTsgICAgICAgIC8qIHNldCBpZiB0aGUgZGV2aWNlIGlzIG9wZW4gKi8KKyAgZ2ludCAgICAgICAgICAgIGZkOyAgICAgICAgICAgICAgICAgLyogLTEgaWYgbm90IG9wZW4gICAgICAgICAgICAqLworICBnaW50ICAgICAgICAgICAgYnl0ZXNfcGVyX3NhbXBsZTsKKworICBHc3RDYXBzICAgICAgICogcHJvYmVkX2NhcHM7Cit9OworCitzdHJ1Y3QgX0dzdE9zczRTb3VyY2VDbGFzcyB7CisgIEdzdEF1ZGlvU3JjQ2xhc3MgYXVkaW9zcmNfY2xhc3M7Cit9OworCitHVHlwZSAgZ3N0X29zczRfc291cmNlX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIEdTVF9PU1M0X1NPVVJDRV9IICovCisKZGlmZiAtLWdpdCBhL3N5cy9vc3hhdWRpby9NYWtlZmlsZS5hbSBiL3N5cy9vc3hhdWRpby9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODU0YTM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zeGF1ZGlvL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzcgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdG9zeGF1ZGlvLmxhCisKK2xpYmdzdG9zeGF1ZGlvX2xhX1NPVVJDRVMgPSBnc3Rvc3hhdWRpb3JpbmdidWZmZXIuYyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3Rvc3hhdWRpb2VsZW1lbnQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N0b3N4YXVkaW9zaW5rLmMgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdG9zeGF1ZGlvc3JjLmMgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3Rvc3hjb3JlYXVkaW9jb21tb24uYyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdG9zeGNvcmVhdWRpby5jICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N0b3N4YXVkaW8uYworCitsaWJnc3Rvc3hhdWRpb19sYV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpIFwKKyAgICAtV25vLWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zCitsaWJnc3Rvc3hhdWRpb19sYV9MSUJBREQgPSAJCQkgIFwKKyAgICAtbGdzdGF1ZGlvLUBHU1RfQVBJX1ZFUlNJT05AICAgICAgIFwKKyAgICAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgICAgICAgICAgXAorICAgICQoR1NUX0JBU0VfTElCUykgICAgICAgICAgICAgICAgICBcCisgICAgJChHU1RfTElCUykKKworbGliZ3N0b3N4YXVkaW9fbGFfTERGTEFHUyA9ICQoR1NUX1BMVUdJTl9MREZMQUdTKSAtV2wsLWZyYW1ld29yayxDb3JlQXVkaW8gIC1XbCwtZnJhbWV3b3JrLEF1ZGlvVG9vbGJveAorCitub2luc3RfSEVBREVSUyA9IGdzdG9zeGF1ZGlvc2luay5oCSAgXAorICAgICAgICAgICAgICAgICBnc3Rvc3hhdWRpb2RldmljZXByb3ZpZGVyLmggXAorICAgICAgICAgICAgICAgICBnc3Rvc3hhdWRpb2VsZW1lbnQuaCBcCisgICAgICAgICAgICAgICAgIGdzdG9zeGF1ZGlvcmluZ2J1ZmZlci5oCSAgXAorICAgICAgICAgICAgICAgICBnc3Rvc3hhdWRpb3NyYy5oICAgICBcCisgICAgICAgICAgICAgICAgIGdzdG9zeGNvcmVhdWRpb2NvbW1vbi5oICAgICBcCisgICAgICAgICAgICAgICAgIGdzdG9zeGNvcmVhdWRpby5oCisKK0VYVFJBX0RJU1QgPSBnc3Rvc3hjb3JlYXVkaW9oYWwuYyBcCisgICAgICAgICAgICAgZ3N0b3N4Y29yZWF1ZGlvcmVtb3RlaW8uYworCitpZiAhSEFWRV9JT1MKK2xpYmdzdG9zeGF1ZGlvX2xhX1NPVVJDRVMgKz0gZ3N0b3N4YXVkaW9kZXZpY2Vwcm92aWRlci5jCitsaWJnc3Rvc3hhdWRpb19sYV9MREZMQUdTICs9IC1XbCwtZnJhbWV3b3JrLEF1ZGlvVW5pdCAtV2wsLWZyYW1ld29yayxDb3JlU2VydmljZXMKK2Vsc2UKK0VYVFJBX0RJU1QgKz0gZ3N0b3N4YXVkaW9kZXZpY2Vwcm92aWRlci5jCitlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvLmMgYi9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWRmZGJmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvLmMKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAxOTk5IEVyaWsgV2FsdGhpbnNlbiA8b21lZ2FAY3NlLm9naS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsMjAwOCBQaW9uZWVycyBvZiB0aGUgSW5ldml0YWJsZSA8c29uZ2JpcmRAc29uZ2JpcmRuZXN0LmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBUaGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIHdhcyBtYWRlIHBvc3NpYmxlIGR1ZSB0byB0aGUgaW52b2x2ZW1lbnQgb2YKKyAqIFBpb25lZXJzIG9mIHRoZSBJbmV2aXRhYmxlLCB0aGUgY3JlYXRvcnMgb2YgdGhlIFNvbmdiaXJkIE11c2ljIHBsYXllcgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3Rvc3hhdWRpb2VsZW1lbnQuaCIKKyNpbmNsdWRlICJnc3Rvc3hhdWRpb3NpbmsuaCIKKyNpbmNsdWRlICJnc3Rvc3hhdWRpb3NyYy5oIgorI2lmbmRlZiBIQVZFX0lPUworI2luY2x1ZGUgImdzdG9zeGF1ZGlvZGV2aWNlcHJvdmlkZXIuaCIKKyNlbmRpZgorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm9zeGF1ZGlvc2luayIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICAgR1NUX1RZUEVfT1NYX0FVRElPX1NJTkspKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIm9zeGF1ZGlvc3JjIiwgR1NUX1JBTktfUFJJTUFSWSwKKyAgICAgICAgICBHU1RfVFlQRV9PU1hfQVVESU9fU1JDKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorI2lmbmRlZiBIQVZFX0lPUworICBpZiAoIWdzdF9kZXZpY2VfcHJvdmlkZXJfcmVnaXN0ZXIgKHBsdWdpbiwgIm9zeGF1ZGlvZGV2aWNlcHJvdmlkZXIiLAorICAgICAgICAgIEdTVF9SQU5LX1BSSU1BUlksIEdTVF9UWVBFX09TWF9BVURJT19ERVZJQ0VfUFJPVklERVIpKQorICAgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgb3N4YXVkaW8sCisgICAgIk9TWCAoTWFjIE9TIFgpIGF1ZGlvIHN1cHBvcnQgZm9yIEdTdHJlYW1lciIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9kZXZpY2Vwcm92aWRlci5jIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvZGV2aWNlcHJvdmlkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmEyMjJmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvZGV2aWNlcHJvdmlkZXIuYwpAQCAtMCwwICsxLDM4MCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSHl1bmp1biBLbyA8enpvb25AaWdhbGlhLmNvbT4KKyAqCisgKiBnc3Rvc3hhdWRpb2RldmljZXByb3ZpZGVyLmM6IE9TWCBhdWRpbyBkZXZpY2UgcHJvYmluZyBhbmQgbW9uaXRvcmluZworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlICJnc3Rvc3hhdWRpb3NyYy5oIgorI2luY2x1ZGUgImdzdG9zeGF1ZGlvc2luay5oIgorI2luY2x1ZGUgImdzdG9zeGF1ZGlvZGV2aWNlcHJvdmlkZXIuaCIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX09TWF9BVURJT19TUkNfQ0FQUykKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua19mYWN0b3J5ID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfT1NYX0FVRElPX1NJTktfQ0FQUykKKyAgICApOworCitzdGF0aWMgR3N0T3N4QXVkaW9EZXZpY2UgKmdzdF9vc3hfYXVkaW9fZGV2aWNlX25ldyAoQXVkaW9EZXZpY2VJRCBkZXZpY2VfaWQsCisgICAgY29uc3QgZ2NoYXIgKiBkZXZpY2VfbmFtZSwgR3N0T3N4QXVkaW9EZXZpY2VUeXBlIHR5cGUsCisgICAgR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbyk7CisKK0dfREVGSU5FX1RZUEUgKEdzdE9zeEF1ZGlvRGV2aWNlUHJvdmlkZXIsIGdzdF9vc3hfYXVkaW9fZGV2aWNlX3Byb3ZpZGVyLAorICAgIEdTVF9UWVBFX0RFVklDRV9QUk9WSURFUik7CisKK3N0YXRpYyBHTGlzdCAqZ3N0X29zeF9hdWRpb19kZXZpY2VfcHJvdmlkZXJfcHJvYmUgKEdzdERldmljZVByb3ZpZGVyICoKKyAgICBwcm92aWRlcik7CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X2F1ZGlvX2RldmljZV9wcm92aWRlcl9jbGFzc19pbml0IChHc3RPc3hBdWRpb0RldmljZVByb3ZpZGVyQ2xhc3MgKgorICAgIGtsYXNzKQoreworICBHc3REZXZpY2VQcm92aWRlckNsYXNzICpkbV9jbGFzcyA9IEdTVF9ERVZJQ0VfUFJPVklERVJfQ0xBU1MgKGtsYXNzKTsKKworICBkbV9jbGFzcy0+cHJvYmUgPSBnc3Rfb3N4X2F1ZGlvX2RldmljZV9wcm92aWRlcl9wcm9iZTsKKworICBnc3RfZGV2aWNlX3Byb3ZpZGVyX2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGRtX2NsYXNzLAorICAgICAgIk9TWCBBdWRpbyBEZXZpY2UgUHJvdmlkZXIiLCAiU291cmNlL1NpbmsvQXVkaW8iLAorICAgICAgIkxpc3QgYW5kIG1vbml0b3IgT1NYIGF1ZGlvIHNvdXJjZSBhbmQgc2luayBkZXZpY2VzIiwKKyAgICAgICJIeXVuanVuIEtvIDx6em9vbkBpZ2FsaWEuY29tPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zeF9hdWRpb19kZXZpY2VfcHJvdmlkZXJfaW5pdCAoR3N0T3N4QXVkaW9EZXZpY2VQcm92aWRlciAqIHByb3ZpZGVyKQoreworfQorCitzdGF0aWMgR3N0T3N4QXVkaW9EZXZpY2UgKgorZ3N0X29zeF9hdWRpb19kZXZpY2VfcHJvdmlkZXJfcHJvYmVfZGV2aWNlIChHc3RPc3hBdWRpb0RldmljZVByb3ZpZGVyICoKKyAgICBwcm92aWRlciwgQXVkaW9EZXZpY2VJRCBkZXZpY2VfaWQsIGNvbnN0IGdjaGFyICogZGV2aWNlX25hbWUsCisgICAgR3N0T3N4QXVkaW9EZXZpY2VUeXBlIHR5cGUpCit7CisgIEdzdE9zeEF1ZGlvRGV2aWNlICpkZXZpY2UgPSBOVUxMOworICBHc3RDb3JlQXVkaW8gKmNvcmVfYXVkaW87CisKKyAgY29yZV9hdWRpbyA9IGdzdF9jb3JlX2F1ZGlvX25ldyAoTlVMTCk7CisgIGNvcmVfYXVkaW8tPmlzX3NyYyA9IHR5cGUgPT0gR1NUX09TWF9BVURJT19ERVZJQ0VfVFlQRV9TT1VSQ0UgPyBUUlVFIDogRkFMU0U7CisgIGNvcmVfYXVkaW8tPmRldmljZV9pZCA9IGRldmljZV9pZDsKKworICBpZiAoIWdzdF9jb3JlX2F1ZGlvX29wZW4gKGNvcmVfYXVkaW8pKSB7CisgICAgR1NUX0VSUk9SICgiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIik7CisgICAgZ290byBkb25lOworICB9CisKKyAgZGV2aWNlID0gZ3N0X29zeF9hdWRpb19kZXZpY2VfbmV3IChkZXZpY2VfaWQsIGRldmljZV9uYW1lLCB0eXBlLCBjb3JlX2F1ZGlvKTsKKworICBnc3RfY29yZV9hdWRpb19jbG9zZSAoY29yZV9hdWRpbyk7CisKK2RvbmU6CisgIGdfb2JqZWN0X3VucmVmIChjb3JlX2F1ZGlvKTsKKworICByZXR1cm4gZGV2aWNlOworfQorCitzdGF0aWMgaW5saW5lIGdjaGFyICoKK19hdWRpb19kZXZpY2VfZ2V0X25hbWUgKEF1ZGlvRGV2aWNlSUQgZGV2aWNlX2lkLCBnYm9vbGVhbiBvdXRwdXQpCit7CisgIE9TU3RhdHVzIHN0YXR1cyA9IG5vRXJyOworICBVSW50MzIgcHJvcGVydHlTaXplID0gMDsKKyAgZ2NoYXIgKmRldmljZV9uYW1lID0gTlVMTDsKKyAgQXVkaW9PYmplY3RQcm9wZXJ0eVNjb3BlIHByb3Bfc2NvcGU7CisKKyAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3MgZGV2aWNlTmFtZUFkZHJlc3MgPSB7CisgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlEZXZpY2VOYW1lLAorICAgIGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVPdXRwdXQsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCisgIH07CisKKyAgcHJvcF9zY29wZSA9IG91dHB1dCA/IGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVPdXRwdXQgOgorICAgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlTY29wZUlucHV0OworCisgIGRldmljZU5hbWVBZGRyZXNzLm1TY29wZSA9IHByb3Bfc2NvcGU7CisKKyAgLyogR2V0IHRoZSBsZW5ndGggb2YgdGhlIGRldmljZSBuYW1lICovCisgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhU2l6ZSAoZGV2aWNlX2lkLAorICAgICAgJmRldmljZU5hbWVBZGRyZXNzLCAwLCBOVUxMLCAmcHJvcGVydHlTaXplKTsKKyAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgIGdvdG8gYmVhY2g7CisgIH0KKworICAvKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGRldmljZSAqLworICBkZXZpY2VfbmFtZSA9IChnY2hhciAqKSBnX21hbGxvYyAocHJvcGVydHlTaXplKTsKKyAgc3RhdHVzID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGEgKGRldmljZV9pZCwKKyAgICAgICZkZXZpY2VOYW1lQWRkcmVzcywgMCwgTlVMTCwgJnByb3BlcnR5U2l6ZSwgZGV2aWNlX25hbWUpOworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgZ19mcmVlIChkZXZpY2VfbmFtZSk7CisgICAgZGV2aWNlX25hbWUgPSBOVUxMOworICB9CisKK2JlYWNoOgorICByZXR1cm4gZGV2aWNlX25hbWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2Jvb2xlYW4KK19hdWRpb19kZXZpY2VfaGFzX291dHB1dCAoQXVkaW9EZXZpY2VJRCBkZXZpY2VfaWQpCit7CisgIE9TU3RhdHVzIHN0YXR1cyA9IG5vRXJyOworICBVSW50MzIgcHJvcGVydHlTaXplOworCisgIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIHN0cmVhbXNBZGRyZXNzID0geworICAgIGtBdWRpb0RldmljZVByb3BlcnR5U3RyZWFtcywKKyAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eVNjb3BlT3V0cHV0LAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcgorICB9OworCisgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhU2l6ZSAoZGV2aWNlX2lkLAorICAgICAgJnN0cmVhbXNBZGRyZXNzLCAwLCBOVUxMLCAmcHJvcGVydHlTaXplKTsKKyAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocHJvcGVydHlTaXplID09IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGlubGluZSBBdWRpb0RldmljZUlEICoKK19hdWRpb19zeXN0ZW1fZ2V0X2RldmljZXMgKGdpbnQgKiBuZGV2aWNlcykKK3sKKyAgT1NTdGF0dXMgc3RhdHVzID0gbm9FcnI7CisgIFVJbnQzMiBwcm9wZXJ0eVNpemUgPSAwOworICBBdWRpb0RldmljZUlEICpkZXZpY2VzID0gTlVMTDsKKworICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBhdWRpb0RldmljZXNBZGRyZXNzID0geworICAgIGtBdWRpb0hhcmR3YXJlUHJvcGVydHlEZXZpY2VzLAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5U2NvcGVHbG9iYWwsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCisgIH07CisKKyAgc3RhdHVzID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGFTaXplIChrQXVkaW9PYmplY3RTeXN0ZW1PYmplY3QsCisgICAgICAmYXVkaW9EZXZpY2VzQWRkcmVzcywgMCwgTlVMTCwgJnByb3BlcnR5U2l6ZSk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBHU1RfV0FSTklORyAoImZhaWxlZCBnZXR0aW5nIG51bWJlciBvZiBkZXZpY2VzOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAqbmRldmljZXMgPSBwcm9wZXJ0eVNpemUgLyBzaXplb2YgKEF1ZGlvRGV2aWNlSUQpOworCisgIGRldmljZXMgPSAoQXVkaW9EZXZpY2VJRCAqKSBnX21hbGxvYyAocHJvcGVydHlTaXplKTsKKyAgaWYgKGRldmljZXMpIHsKKyAgICBzdGF0dXMgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YSAoa0F1ZGlvT2JqZWN0U3lzdGVtT2JqZWN0LAorICAgICAgICAmYXVkaW9EZXZpY2VzQWRkcmVzcywgMCwgTlVMTCwgJnByb3BlcnR5U2l6ZSwgZGV2aWNlcyk7CisgICAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgICAgR1NUX1dBUk5JTkcgKCJmYWlsZWQgZ2V0dGluZyB0aGUgbGlzdCBvZiBkZXZpY2VzOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgICBnX2ZyZWUgKGRldmljZXMpOworICAgICAgKm5kZXZpY2VzID0gMDsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorCisgIHJldHVybiBkZXZpY2VzOworfQorCitzdGF0aWMgR0xpc3QgKgorZ3N0X29zeF9hdWRpb19kZXZpY2VfcHJvdmlkZXJfcHJvYmUgKEdzdERldmljZVByb3ZpZGVyICogcHJvdmlkZXIpCit7CisgIEdzdE9zeEF1ZGlvRGV2aWNlUHJvdmlkZXIgKnNlbGYgPSBHU1RfT1NYX0FVRElPX0RFVklDRV9QUk9WSURFUiAocHJvdmlkZXIpOworICBHTGlzdCAqZGV2aWNlcyA9IE5VTEw7CisgIEdzdE9zeEF1ZGlvRGV2aWNlICpkZXZpY2UgPSBOVUxMOworICBBdWRpb0RldmljZUlEICpvc3hfZGV2aWNlcyA9IE5VTEw7CisgIGdpbnQgaSwgbmRldmljZXMgPSAwOworCisgIG9zeF9kZXZpY2VzID0gX2F1ZGlvX3N5c3RlbV9nZXRfZGV2aWNlcyAoJm5kZXZpY2VzKTsKKworICBpZiAobmRldmljZXMgPCAxKSB7CisgICAgR1NUX1dBUk5JTkcgKCJubyBhdWRpbyBvdXRwdXQgZGV2aWNlcyBmb3VuZCIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIEdTVF9JTkZPICgiZm91bmQgJWQgYXVkaW8gZGV2aWNlKHMpIiwgbmRldmljZXMpOworCisgIGZvciAoaSA9IDA7IGkgPCBuZGV2aWNlczsgaSsrKSB7CisgICAgZ2NoYXIgKmRldmljZV9uYW1lOworICAgIEdzdE9zeEF1ZGlvRGV2aWNlVHlwZSB0eXBlID0gR1NUX09TWF9BVURJT19ERVZJQ0VfVFlQRV9JTlZBTElEOworCisgICAgaWYgKChkZXZpY2VfbmFtZSA9IF9hdWRpb19kZXZpY2VfZ2V0X25hbWUgKG9zeF9kZXZpY2VzW2ldLCBGQUxTRSkpKSB7CisgICAgICBpZiAoIV9hdWRpb19kZXZpY2VfaGFzX291dHB1dCAob3N4X2RldmljZXNbaV0pKSB7CisgICAgICAgIEdTVF9ERUJVRyAoIklucHV0IERldmljZSBJRDogJXUgTmFtZTogJXMiLAorICAgICAgICAgICAgKHVuc2lnbmVkKSBvc3hfZGV2aWNlc1tpXSwgZGV2aWNlX25hbWUpOworICAgICAgICB0eXBlID0gR1NUX09TWF9BVURJT19ERVZJQ0VfVFlQRV9TT1VSQ0U7CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVRyAoIk91dHB1dCBEZXZpY2UgSUQ6ICV1IE5hbWU6ICVzIiwKKyAgICAgICAgICAgICh1bnNpZ25lZCkgb3N4X2RldmljZXNbaV0sIGRldmljZV9uYW1lKTsKKyAgICAgICAgdHlwZSA9IEdTVF9PU1hfQVVESU9fREVWSUNFX1RZUEVfU0lOSzsKKyAgICAgIH0KKworICAgICAgZGV2aWNlID0KKyAgICAgICAgICBnc3Rfb3N4X2F1ZGlvX2RldmljZV9wcm92aWRlcl9wcm9iZV9kZXZpY2UgKHNlbGYsIG9zeF9kZXZpY2VzW2ldLAorICAgICAgICAgIGRldmljZV9uYW1lLCB0eXBlKTsKKyAgICAgIGlmIChkZXZpY2UpIHsKKyAgICAgICAgZ3N0X29iamVjdF9yZWZfc2luayAoZGV2aWNlKTsKKyAgICAgICAgZGV2aWNlcyA9IGdfbGlzdF9wcmVwZW5kIChkZXZpY2VzLCBkZXZpY2UpOworICAgICAgfQorCisgICAgICBnX2ZyZWUgKGRldmljZV9uYW1lKTsKKyAgICB9CisgIH0KKworZG9uZToKKyAgZ19mcmVlIChvc3hfZGV2aWNlcyk7CisKKyAgcmV0dXJuIGRldmljZXM7Cit9CisKK2VudW0KK3sKKyAgUFJPUF9ERVZJQ0VfSUQgPSAxLAorfTsKKworR19ERUZJTkVfVFlQRSAoR3N0T3N4QXVkaW9EZXZpY2UsIGdzdF9vc3hfYXVkaW9fZGV2aWNlLCBHU1RfVFlQRV9ERVZJQ0UpOworCitzdGF0aWMgdm9pZCBnc3Rfb3N4X2F1ZGlvX2RldmljZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3Rfb3N4X2F1ZGlvX2RldmljZV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgR3N0RWxlbWVudCAqZ3N0X29zeF9hdWRpb19kZXZpY2VfY3JlYXRlX2VsZW1lbnQgKEdzdERldmljZSAqIGRldmljZSwKKyAgICBjb25zdCBnY2hhciAqIG5hbWUpOworCitzdGF0aWMgdm9pZAorZ3N0X29zeF9hdWRpb19kZXZpY2VfY2xhc3NfaW5pdCAoR3N0T3N4QXVkaW9EZXZpY2VDbGFzcyAqIGtsYXNzKQoreworICBHc3REZXZpY2VDbGFzcyAqZGV2X2NsYXNzID0gR1NUX0RFVklDRV9DTEFTUyAoa2xhc3MpOworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisKKyAgZGV2X2NsYXNzLT5jcmVhdGVfZWxlbWVudCA9IGdzdF9vc3hfYXVkaW9fZGV2aWNlX2NyZWF0ZV9lbGVtZW50OworCisgIG9iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X29zeF9hdWRpb19kZXZpY2VfZ2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9vc3hfYXVkaW9fZGV2aWNlX3NldF9wcm9wZXJ0eTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChvYmplY3RfY2xhc3MsIFBST1BfREVWSUNFX0lELAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoImRldmljZS1pZCIsICJEZXZpY2UgSUQiLCAiRGV2aWNlIElEIG9mIGlucHV0IGRldmljZSIsCisgICAgICAgICAgMCwgR19NQVhJTlQsIDAsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zeF9hdWRpb19kZXZpY2VfaW5pdCAoR3N0T3N4QXVkaW9EZXZpY2UgKiBkZXZpY2UpCit7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK2dzdF9vc3hfYXVkaW9fZGV2aWNlX2NyZWF0ZV9lbGVtZW50IChHc3REZXZpY2UgKiBkZXZpY2UsIGNvbnN0IGdjaGFyICogbmFtZSkKK3sKKyAgR3N0T3N4QXVkaW9EZXZpY2UgKm9zeGRldiA9IEdTVF9PU1hfQVVESU9fREVWSUNFIChkZXZpY2UpOworICBHc3RFbGVtZW50ICplbGVtOworCisgIGVsZW0gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKG9zeGRldi0+ZWxlbWVudCwgbmFtZSk7CisgIGdfb2JqZWN0X3NldCAoZWxlbSwgImRldmljZSIsIG9zeGRldi0+ZGV2aWNlX2lkLCBOVUxMKTsKKworICByZXR1cm4gZWxlbTsKK30KKworc3RhdGljIEdzdE9zeEF1ZGlvRGV2aWNlICoKK2dzdF9vc3hfYXVkaW9fZGV2aWNlX25ldyAoQXVkaW9EZXZpY2VJRCBkZXZpY2VfaWQsIGNvbnN0IGdjaGFyICogZGV2aWNlX25hbWUsCisgICAgR3N0T3N4QXVkaW9EZXZpY2VUeXBlIHR5cGUsIEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIEdzdE9zeEF1ZGlvRGV2aWNlICpnc3RkZXY7CisgIGNvbnN0IGdjaGFyICplbGVtZW50X25hbWUgPSBOVUxMOworICBjb25zdCBnY2hhciAqa2xhc3MgPSBOVUxMOworICBHc3RDYXBzICp0ZW1wbGF0ZV9jYXBzLCAqY2FwczsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZGV2aWNlX2lkID4gMCwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChkZXZpY2VfbmFtZSwgTlVMTCk7CisKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBHU1RfT1NYX0FVRElPX0RFVklDRV9UWVBFX1NPVVJDRToKKyAgICAgIGVsZW1lbnRfbmFtZSA9ICJvc3hhdWRpb3NyYyI7CisgICAgICBrbGFzcyA9ICJBdWRpby9Tb3VyY2UiOworCisgICAgICB0ZW1wbGF0ZV9jYXBzID0gZ3N0X3N0YXRpY19wYWRfdGVtcGxhdGVfZ2V0X2NhcHMgKCZzcmNfZmFjdG9yeSk7CisgICAgICBjYXBzID0gZ3N0X2NvcmVfYXVkaW9fcHJvYmVfY2FwcyAoY29yZV9hdWRpbywgdGVtcGxhdGVfY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAodGVtcGxhdGVfY2Fwcyk7CisKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX09TWF9BVURJT19ERVZJQ0VfVFlQRV9TSU5LOgorICAgICAgZWxlbWVudF9uYW1lID0gIm9zeGF1ZGlvc2luayI7CisgICAgICBrbGFzcyA9ICJBdWRpby9TaW5rIjsKKworICAgICAgdGVtcGxhdGVfY2FwcyA9IGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldF9jYXBzICgmc2lua19mYWN0b3J5KTsKKyAgICAgIGNhcHMgPSBnc3RfY29yZV9hdWRpb19wcm9iZV9jYXBzIChjb3JlX2F1ZGlvLCB0ZW1wbGF0ZV9jYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmICh0ZW1wbGF0ZV9jYXBzKTsKKworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgYnJlYWs7CisgIH0KKworICBnc3RkZXYgPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX09TWF9BVURJT19ERVZJQ0UsICJkZXZpY2UtaWQiLAorICAgICAgZGV2aWNlX2lkLCAiZGlzcGxheS1uYW1lIiwgZGV2aWNlX25hbWUsICJjYXBzIiwgY2FwcywgImRldmljZS1jbGFzcyIsCisgICAgICBrbGFzcywgTlVMTCk7CisKKyAgZ3N0ZGV2LT5lbGVtZW50ID0gZWxlbWVudF9uYW1lOworCisKKyAgcmV0dXJuIGdzdGRldjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfYXVkaW9fZGV2aWNlX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RPc3hBdWRpb0RldmljZSAqZGV2aWNlOworCisgIGRldmljZSA9IEdTVF9PU1hfQVVESU9fREVWSUNFX0NBU1QgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFVklDRV9JRDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIGRldmljZS0+ZGV2aWNlX2lkKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAorZ3N0X29zeF9hdWRpb19kZXZpY2Vfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE9zeEF1ZGlvRGV2aWNlICpkZXZpY2U7CisKKyAgZGV2aWNlID0gR1NUX09TWF9BVURJT19ERVZJQ0VfQ0FTVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfREVWSUNFX0lEOgorICAgICAgZGV2aWNlLT5kZXZpY2VfaWQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2RldmljZXByb3ZpZGVyLmggYi9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9kZXZpY2Vwcm92aWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNTQxNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9kZXZpY2Vwcm92aWRlci5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDE2IEh5dW5qdW4gS28gPHp6b29uQGlnYWxpYS5jb20+CisgKgorICogZ3N0b3N4YXVkaW9kZXZpY2VlcHJvdmlkZXIuaDogT1NYIGF1ZGlvIHByb2JpbmcgYW5kIG1vbml0b3JpbmcKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisKKyNpZm5kZWYgX19HU1RfT1NYX0FVRElPX0RFSVZDRV9QUk9WSURFUl9IX18KKyNkZWZpbmUgX19HU1RfT1NYX0FVRElPX0RFSVZDRV9QUk9WSURFUl9IX18KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgImdzdG9zeGNvcmVhdWRpb2NvbW1vbi5oIgorCitHX0JFR0lOX0RFQ0xTCit0eXBlZGVmIHN0cnVjdCBfR3N0T3N4QXVkaW9EZXZpY2VQcm92aWRlciBHc3RPc3hBdWRpb0RldmljZVByb3ZpZGVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zeEF1ZGlvRGV2aWNlUHJvdmlkZXJDbGFzcyBHc3RPc3hBdWRpb0RldmljZVByb3ZpZGVyQ2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfT1NYX0FVRElPX0RFVklDRV9QUk9WSURFUiAgICAgICAgICAgICAgICAgKGdzdF9vc3hfYXVkaW9fZGV2aWNlX3Byb3ZpZGVyX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9JU19PU1hfQVVESU9fREVWSUNFX1BST1ZJREVSKG9iaikgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX09TWF9BVURJT19ERVZJQ0VfUFJPVklERVIpKQorI2RlZmluZSBHU1RfSVNfT1NYX0FVRElPX0RFVklDRV9QUk9WSURFUl9DTEFTUyhrbGFzcykgICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX09TWF9BVURJT19ERVZJQ0VfUFJPVklERVIpKQorI2RlZmluZSBHU1RfT1NYX0FVRElPX0RFVklDRV9QUk9WSURFUl9HRVRfQ0xBU1Mob2JqKSAgICAgICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX09TWF9BVURJT19ERVZJQ0VfUFJPVklERVIsIEdzdE9zeEF1ZGlvRGV2aWNlUHJvdmlkZXJDbGFzcykpCisjZGVmaW5lIEdTVF9PU1hfQVVESU9fREVWSUNFX1BST1ZJREVSKG9iaikgICAgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX09TWF9BVURJT19ERVZJQ0VfUFJPVklERVIsIEdzdE9zeEF1ZGlvRGV2aWNlUHJvdmlkZXIpKQorI2RlZmluZSBHU1RfT1NYX0FVRElPX0RFVklDRV9QUk9WSURFUl9DTEFTUyhrbGFzcykgICAgICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX0RFVklDRV9QUk9WSURFUiwgR3N0T3N4QXVkaW9EZXZpY2VQcm92aWRlckNsYXNzKSkKKyNkZWZpbmUgR1NUX09TWF9BVURJT19ERVZJQ0VfUFJPVklERVJfQ0FTVChvYmopICAgICAgICAgICAgKChHc3RPc3hBdWRpb0RldmljZVByb3ZpZGVyICopKG9iaikpCisKK3N0cnVjdCBfR3N0T3N4QXVkaW9EZXZpY2VQcm92aWRlcgoreworICBHc3REZXZpY2VQcm92aWRlciBwYXJlbnQ7Cit9OworCitzdHJ1Y3QgX0dzdE9zeEF1ZGlvRGV2aWNlUHJvdmlkZXJDbGFzcworeworICBHc3REZXZpY2VQcm92aWRlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9vc3hfYXVkaW9fZGV2aWNlX3Byb3ZpZGVyX2dldF90eXBlICh2b2lkKTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zeEF1ZGlvRGV2aWNlIEdzdE9zeEF1ZGlvRGV2aWNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zeEF1ZGlvRGV2aWNlQ2xhc3MgR3N0T3N4QXVkaW9EZXZpY2VDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9PU1hfQVVESU9fREVWSUNFICAgICAgICAgICAgICAgICAoZ3N0X29zeF9hdWRpb19kZXZpY2VfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0lTX09TWF9BVURJT19ERVZJQ0Uob2JqKSAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfT1NYX0FVRElPX0RFVklDRSkpCisjZGVmaW5lIEdTVF9JU19PU1hfQVVESU9fREVWSUNFX0NMQVNTKGtsYXNzKSAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfT1NYX0FVRElPX0RFVklDRSkpCisjZGVmaW5lIEdTVF9PU1hfQVVESU9fREVWSUNFX0dFVF9DTEFTUyhvYmopICAgICAgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgR1NUX1RZUEVfT1NYX0FVRElPX0RFVklDRSwgR3N0T3N4QXVkaW9DbGFzcykpCisjZGVmaW5lIEdTVF9PU1hfQVVESU9fREVWSUNFKG9iaikgICAgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX09TWF9BVURJT19ERVZJQ0UsIEdzdE9zeEF1ZGlvRGV2aWNlKSkKKyNkZWZpbmUgR1NUX09TWF9BVURJT19ERVZJQ0VfQ0xBU1Moa2xhc3MpICAgICAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9ERVZJQ0UsIEdzdE9zeEF1ZGlvRGV2aWNlQ2xhc3MpKQorI2RlZmluZSBHU1RfT1NYX0FVRElPX0RFVklDRV9DQVNUKG9iaikgICAgICAgICAgICAoKEdzdE9zeEF1ZGlvRGV2aWNlICopKG9iaikpCisKK3R5cGVkZWYgZW51bQoreworICBHU1RfT1NYX0FVRElPX0RFVklDRV9UWVBFX0lOVkFMSUQgPSAwLAorICBHU1RfT1NYX0FVRElPX0RFVklDRV9UWVBFX1NPVVJDRSwKKyAgR1NUX09TWF9BVURJT19ERVZJQ0VfVFlQRV9TSU5LCit9IEdzdE9zeEF1ZGlvRGV2aWNlVHlwZTsKKworc3RydWN0IF9Hc3RPc3hBdWRpb0RldmljZQoreworICBHc3REZXZpY2UgcGFyZW50OworCisgIGNvbnN0IGdjaGFyICplbGVtZW50OworICBBdWRpb0RldmljZUlEIGRldmljZV9pZDsKK307CisKK3N0cnVjdCBfR3N0T3N4QXVkaW9EZXZpY2VDbGFzcworeworICBHc3REZXZpY2VDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3Rfb3N4X2F1ZGlvX2RldmljZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19HU1RfT1NYX0FVRElPX0RFSVZDRV9QUk9WSURFUl9IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuYyBiL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWMyNGQxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvZWxlbWVudC5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBQaW9uZWVycyBvZiB0aGUgSW5ldml0YWJsZSA8c29uZ2JpcmRAc29uZ2JpcmRuZXN0LmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSAodGhlICJMR1BMIiksIGluCisgKiB3aGljaCBjYXNlIHRoZSBmb2xsb3dpbmcgcHJvdmlzaW9ucyBhcHBseSBpbnN0ZWFkIG9mIHRoZSBvbmVzCisgKiBtZW50aW9uZWQgYWJvdmU6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICogVGhlIGRldmVsb3BtZW50IG9mIHRoaXMgY29kZSB3YXMgbWFkZSBwb3NzaWJsZSBkdWUgdG8gdGhlIGludm9sdmVtZW50IG9mCisgKiBQaW9uZWVycyBvZiB0aGUgSW5ldml0YWJsZSwgdGhlIGNyZWF0b3JzIG9mIHRoZSBTb25nYmlyZCBNdXNpYyBwbGF5ZXIKKyAqCisgKi8KKworI2luY2x1ZGUgImdzdG9zeGF1ZGlvZWxlbWVudC5oIgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfYXVkaW9fZWxlbWVudF9pbnRlcmZhY2VfaW5pdCAoR3N0T3N4QXVkaW9FbGVtZW50SW50ZXJmYWNlICogaWZhY2UpOworCitHVHlwZQorZ3N0X29zeF9hdWRpb19lbGVtZW50X2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgZ3N0X29zeGF1ZGlvZWxlbWVudF90eXBlID0gMDsKKworICBpZiAoIWdzdF9vc3hhdWRpb2VsZW1lbnRfdHlwZSkgeworICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gZ3N0X29zeGF1ZGlvZWxlbWVudF9pbmZvID0geworICAgICAgc2l6ZW9mIChHc3RPc3hBdWRpb0VsZW1lbnRJbnRlcmZhY2UpLAorICAgICAgKEdCYXNlSW5pdEZ1bmMpIGdzdF9vc3hfYXVkaW9fZWxlbWVudF9pbnRlcmZhY2VfaW5pdCwKKyAgICAgIE5VTEwsCisgICAgICBOVUxMLAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgICAwLAorICAgICAgMCwKKyAgICAgIE5VTEwsCisgICAgICBOVUxMCisgICAgfTsKKworICAgIGdzdF9vc3hhdWRpb2VsZW1lbnRfdHlwZSA9IGdfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKEdfVFlQRV9JTlRFUkZBQ0UsCisgICAgICAgICJHc3RPc3hBdWRpb0VsZW1lbnQiLCAmZ3N0X29zeGF1ZGlvZWxlbWVudF9pbmZvLCAwKTsKKyAgfQorCisgIHJldHVybiBnc3Rfb3N4YXVkaW9lbGVtZW50X3R5cGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X2F1ZGlvX2VsZW1lbnRfaW50ZXJmYWNlX2luaXQgKEdzdE9zeEF1ZGlvRWxlbWVudEludGVyZmFjZSAqIGlmYWNlKQoreworICBzdGF0aWMgZ2Jvb2xlYW4gaW5pdGlhbGl6ZWQgPSBGQUxTRTsKKworICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgaW5pdGlhbGl6ZWQgPSBUUlVFOworICB9CisKKyAgLyogZGVmYXVsdCB2aXJ0dWFsIGZ1bmN0aW9ucyAqLworICBpZmFjZS0+aW9fcHJvYyA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50LmggYi9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9lbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwOWRjMQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb2VsZW1lbnQuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUGlvbmVlcnMgb2YgdGhlIEluZXZpdGFibGUgPHNvbmdiaXJkQHNvbmdiaXJkbmVzdC5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgKHRoZSAiTEdQTCIpLCBpbgorICogd2hpY2ggY2FzZSB0aGUgZm9sbG93aW5nIHByb3Zpc2lvbnMgYXBwbHkgaW5zdGVhZCBvZiB0aGUgb25lcworICogbWVudGlvbmVkIGFib3ZlOgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqIFRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgd2FzIG1hZGUgcG9zc2libGUgZHVlIHRvIHRoZSBpbnZvbHZlbWVudCBvZgorICogUGlvbmVlcnMgb2YgdGhlIEluZXZpdGFibGUsIHRoZSBjcmVhdG9ycyBvZiB0aGUgU29uZ2JpcmQgTXVzaWMgcGxheWVyCisgKgorICovCisKKyNpZm5kZWYgX19HU1RfT1NYX0FVRElPX0VMRU1FTlRfSF9fCisjZGVmaW5lIF9fR1NUX09TWF9BVURJT19FTEVNRU5UX0hfXworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpZmRlZiBIQVZFX0lPUworI2luY2x1ZGUgPENvcmVBdWRpby9Db3JlQXVkaW9UeXBlcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxDb3JlQXVkaW8vQ29yZUF1ZGlvLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxBdWRpb1VuaXQvQXVkaW9Vbml0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfT1NYX0FVRElPX0VMRU1FTlRfVFlQRSBcCisgIChnc3Rfb3N4X2F1ZGlvX2VsZW1lbnRfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX09TWF9BVURJT19FTEVNRU5UKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX09TWF9BVURJT19FTEVNRU5UX1RZUEUsR3N0T3N4QXVkaW9FbGVtZW50SW50ZXJmYWNlKSkKKyNkZWZpbmUgR1NUX0lTX09TWF9BVURJT19FTEVNRU5UKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX09TWF9BVURJT19FTEVNRU5UX1RZUEUpKQorI2RlZmluZSBHU1RfT1NYX0FVRElPX0VMRU1FTlRfR0VUX0lOVEVSRkFDRShpbnN0KSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0lOVEVSRkFDRSgoaW5zdCksR1NUX09TWF9BVURJT19FTEVNRU5UX1RZUEUsR3N0T3N4QXVkaW9FbGVtZW50SW50ZXJmYWNlKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zeEF1ZGlvRWxlbWVudEludGVyZmFjZSBHc3RPc3hBdWRpb0VsZW1lbnRJbnRlcmZhY2U7CisKK3N0cnVjdCBfR3N0T3N4QXVkaW9FbGVtZW50SW50ZXJmYWNlCit7CisgIEdUeXBlSW50ZXJmYWNlIHBhcmVudDsKKworICBPU1N0YXR1cyAoKmlvX3Byb2MpICh2b2lkICogdXNlcmRhdGEsCisgICAgICBBdWRpb1VuaXRSZW5kZXJBY3Rpb25GbGFncyAqIGlvQWN0aW9uRmxhZ3MsCisgICAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCAqIGluVGltZVN0YW1wLAorICAgICAgVUludDMyIGluQnVzTnVtYmVyLCBVSW50MzIgaW5OdW1iZXJGcmFtZXMsCisgICAgICBBdWRpb0J1ZmZlckxpc3QgKiBidWZmZXJMaXN0KTsKK307CisKK0dUeXBlIGdzdF9vc3hfYXVkaW9fZWxlbWVudF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9PU1hfQVVESU9fRUxFTUVOVF9IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3JpbmdidWZmZXIuYyBiL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3JpbmdidWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjAxZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5jCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUGlvbmVlcnMgb2YgdGhlIEluZXZpdGFibGUgPHNvbmdiaXJkQHNvbmdiaXJkbmVzdC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgRmx1ZW5kbyBTLkEuIDxzdXBwb3J0QGZsdWVuZG8uY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xICh0aGUgIkxHUEwiKSwgaW4KKyAqIHdoaWNoIGNhc2UgdGhlIGZvbGxvd2luZyBwcm92aXNpb25zIGFwcGx5IGluc3RlYWQgb2YgdGhlIG9uZXMKKyAqIG1lbnRpb25lZCBhYm92ZToKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLWNoYW5uZWxzLmg+CisjaW5jbHVkZSAiZ3N0b3N4YXVkaW9yaW5nYnVmZmVyLmgiCisjaW5jbHVkZSAiZ3N0b3N4YXVkaW9zaW5rLmgiCisjaW5jbHVkZSAiZ3N0b3N4YXVkaW9zcmMuaCIKKworI2luY2x1ZGUgPHVuaXN0ZC5oPiAgICAgICAgICAgICAvKiBmb3IgZ2V0cGlkKCkgKi8KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAob3N4X2F1ZGlvX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIG9zeF9hdWRpb19kZWJ1ZworCisjaW5jbHVkZSAiZ3N0b3N4Y29yZWF1ZGlvLmgiCisKK3N0YXRpYyB2b2lkIGdzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9vcGVuX2RldmljZSAoR3N0QXVkaW9SaW5nQnVmZmVyICoKKyAgICBidWYpOworc3RhdGljIGdib29sZWFuIGdzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfY2xvc2VfZGV2aWNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKgorICAgIGJ1Zik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX2FjcXVpcmUgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZiwKKyAgICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYyk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9yZWxlYXNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpOworCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9zdGFydCAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX3BhdXNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpOworc3RhdGljIGdib29sZWFuIGdzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfc3RvcCAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKTsKK3N0YXRpYyBndWludCBnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX2RlbGF5IChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpOworc3RhdGljIEdzdEF1ZGlvUmluZ0J1ZmZlckNsYXNzICpyaW5nX3BhcmVudF9jbGFzcyA9IE5VTEw7CisKKyNkZWZpbmUgZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9kb19pbml0IFwKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKG9zeF9hdWRpb19kZWJ1ZywgIm9zeGF1ZGlvIiwgMCwgIk9TWCBBdWRpbyBFbGVtZW50cyIpOworCitHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoR3N0T3N4QXVkaW9SaW5nQnVmZmVyLCBnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyLAorICAgIEdTVF9UWVBFX0FVRElPX1JJTkdfQlVGRkVSLCBnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX2RvX2luaXQpOworCitzdGF0aWMgdm9pZAorZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9jbGFzc19pbml0IChHc3RPc3hBdWRpb1JpbmdCdWZmZXJDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEF1ZGlvUmluZ0J1ZmZlckNsYXNzICpnc3RyaW5nYnVmZmVyX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RyaW5nYnVmZmVyX2NsYXNzID0gKEdzdEF1ZGlvUmluZ0J1ZmZlckNsYXNzICopIGtsYXNzOworCisgIHJpbmdfcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfZGlzcG9zZTsKKworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5vcGVuX2RldmljZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9vcGVuX2RldmljZSk7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPmNsb3NlX2RldmljZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9jbG9zZV9kZXZpY2UpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5hY3F1aXJlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX2FjcXVpcmUpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5yZWxlYXNlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX3JlbGVhc2UpOworICBnc3RyaW5nYnVmZmVyX2NsYXNzLT5zdGFydCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9zdGFydCk7CisgIGdzdHJpbmdidWZmZXJfY2xhc3MtPnBhdXNlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX3BhdXNlKTsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+cmVzdW1lID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX3N0YXJ0KTsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+c3RvcCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9zdG9wKTsKKyAgZ3N0cmluZ2J1ZmZlcl9jbGFzcy0+ZGVsYXkgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfZGVsYXkpOworCisgIEdTVF9ERUJVRyAoIm9zeCBhdWRpbyByaW5nIGJ1ZmZlciBjbGFzcyBpbml0Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX2luaXQgKEdzdE9zeEF1ZGlvUmluZ0J1ZmZlciAqIHJpbmdidWZmZXIpCit7CisgIHJpbmdidWZmZXItPmNvcmVfYXVkaW8gPSBnc3RfY29yZV9hdWRpb19uZXcgKEdTVF9PQkpFQ1QgKHJpbmdidWZmZXIpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0T3N4QXVkaW9SaW5nQnVmZmVyICpvc3hidWY7CisKKyAgb3N4YnVmID0gR1NUX09TWF9BVURJT19SSU5HX0JVRkZFUiAob2JqZWN0KTsKKworICBpZiAob3N4YnVmLT5jb3JlX2F1ZGlvKSB7CisgICAgZ19vYmplY3RfdW5yZWYgKG9zeGJ1Zi0+Y29yZV9hdWRpbyk7CisgICAgb3N4YnVmLT5jb3JlX2F1ZGlvID0gTlVMTDsKKyAgfQorICBHX09CSkVDVF9DTEFTUyAocmluZ19wYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfb3Blbl9kZXZpY2UgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0T2JqZWN0ICpvc3hlbCA9IEdTVF9PQkpFQ1RfUEFSRU5UIChidWYpOworICBHc3RPc3hBdWRpb1JpbmdCdWZmZXIgKm9zeGJ1ZiA9IEdTVF9PU1hfQVVESU9fUklOR19CVUZGRVIgKGJ1Zik7CisKKyAgaWYgKCFnc3RfY29yZV9hdWRpb19zZWxlY3RfZGV2aWNlIChvc3hidWYtPmNvcmVfYXVkaW8pKSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9zeGVsLCBSRVNPVVJDRSwgTk9UX0ZPVU5ELAorICAgICAgICAoXygiQ29yZUF1ZGlvIGRldmljZSBub3QgZm91bmQiKSksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKCFnc3RfY29yZV9hdWRpb19vcGVuIChvc3hidWYtPmNvcmVfYXVkaW8pKSB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9zeGVsLCBSRVNPVVJDRSwgT1BFTl9SRUFELAorICAgICAgICAoXygiQ29yZUF1ZGlvIGRldmljZSBjb3VsZCBub3QgYmUgb3BlbmVkIikpLCAoTlVMTCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfY2xvc2VfZGV2aWNlIChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdE9zeEF1ZGlvUmluZ0J1ZmZlciAqb3N4YnVmOworICBvc3hidWYgPSBHU1RfT1NYX0FVRElPX1JJTkdfQlVGRkVSIChidWYpOworCisgIHJldHVybiBnc3RfY29yZV9hdWRpb19jbG9zZSAob3N4YnVmLT5jb3JlX2F1ZGlvKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX2FjcXVpcmUgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZiwKKyAgICBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYykKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0UsIGlzX3Bhc3N0aHJvdWdoID0gRkFMU0U7CisgIEdzdE9zeEF1ZGlvUmluZ0J1ZmZlciAqb3N4YnVmOworICBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gZm9ybWF0OworCisgIG9zeGJ1ZiA9IEdTVF9PU1hfQVVESU9fUklOR19CVUZGRVIgKGJ1Zik7CisKKyAgaWYgKFJJTkdCVUZGRVJfSVNfU1BESUYgKHNwZWMtPnR5cGUpKSB7CisgICAgZm9ybWF0Lm1Gb3JtYXRJRCA9IGtBdWRpb0Zvcm1hdDYwOTU4QUMzOworICAgIGZvcm1hdC5tU2FtcGxlUmF0ZSA9IChkb3VibGUpIEdTVF9BVURJT19JTkZPX1JBVEUgKCZzcGVjLT5pbmZvKTsKKyAgICBmb3JtYXQubUNoYW5uZWxzUGVyRnJhbWUgPSAyOworICAgIGZvcm1hdC5tRm9ybWF0RmxhZ3MgPSBrQXVkaW9Gb3JtYXRGbGFnSXNTaWduZWRJbnRlZ2VyIHwKKyAgICAgICAga0F1ZGlvRm9ybWF0RmxhZ0lzUGFja2VkIHwga0F1ZGlvRm9ybWF0RmxhZ0lzTm9uTWl4YWJsZTsKKyAgICBmb3JtYXQubUJ5dGVzUGVyRnJhbWUgPSAwOworICAgIGZvcm1hdC5tQml0c1BlckNoYW5uZWwgPSAxNjsKKyAgICBmb3JtYXQubUJ5dGVzUGVyUGFja2V0ID0gNjE0NDsKKyAgICBmb3JtYXQubUZyYW1lc1BlclBhY2tldCA9IDE1MzY7CisgICAgZm9ybWF0Lm1SZXNlcnZlZCA9IDA7CisgICAgc3BlYy0+c2Vnc2l6ZSA9IDYxNDQ7CisgICAgc3BlYy0+c2VndG90YWwgPSAxMDsKKyAgICBpc19wYXNzdGhyb3VnaCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgaW50IHdpZHRoLCBkZXB0aDsKKyAgICAvKiBGaWxsIG91dCB0aGUgYXVkaW8gZGVzY3JpcHRpb24gd2UncmUgZ29pbmcgdG8gYmUgdXNpbmcgKi8KKyAgICBmb3JtYXQubUZvcm1hdElEID0ga0F1ZGlvRm9ybWF0TGluZWFyUENNOworICAgIGZvcm1hdC5tU2FtcGxlUmF0ZSA9IChkb3VibGUpIEdTVF9BVURJT19JTkZPX1JBVEUgKCZzcGVjLT5pbmZvKTsKKyAgICBmb3JtYXQubUNoYW5uZWxzUGVyRnJhbWUgPSBHU1RfQVVESU9fSU5GT19DSEFOTkVMUyAoJnNwZWMtPmluZm8pOworICAgIGlmIChHU1RfQVVESU9fSU5GT19JU19GTE9BVCAoJnNwZWMtPmluZm8pKSB7CisgICAgICBmb3JtYXQubUZvcm1hdEZsYWdzID0ga0F1ZGlvRm9ybWF0RmxhZ3NOYXRpdmVGbG9hdFBhY2tlZDsKKyAgICAgIHdpZHRoID0gZGVwdGggPSBHU1RfQVVESU9fSU5GT19XSURUSCAoJnNwZWMtPmluZm8pOworICAgIH0gZWxzZSB7CisgICAgICBmb3JtYXQubUZvcm1hdEZsYWdzID0ga0F1ZGlvRm9ybWF0RmxhZ0lzU2lnbmVkSW50ZWdlcjsKKyAgICAgIHdpZHRoID0gR1NUX0FVRElPX0lORk9fV0lEVEggKCZzcGVjLT5pbmZvKTsKKyAgICAgIGRlcHRoID0gR1NUX0FVRElPX0lORk9fREVQVEggKCZzcGVjLT5pbmZvKTsKKyAgICAgIGlmICh3aWR0aCA9PSBkZXB0aCkgeworICAgICAgICBmb3JtYXQubUZvcm1hdEZsYWdzIHw9IGtBdWRpb0Zvcm1hdEZsYWdJc1BhY2tlZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvcm1hdC5tRm9ybWF0RmxhZ3MgfD0ga0F1ZGlvRm9ybWF0RmxhZ0lzQWxpZ25lZEhpZ2g7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKEdTVF9BVURJT19JTkZPX0lTX0JJR19FTkRJQU4gKCZzcGVjLT5pbmZvKSkgeworICAgICAgZm9ybWF0Lm1Gb3JtYXRGbGFncyB8PSBrQXVkaW9Gb3JtYXRGbGFnSXNCaWdFbmRpYW47CisgICAgfQorCisgICAgZm9ybWF0Lm1CeXRlc1BlckZyYW1lID0gR1NUX0FVRElPX0lORk9fQlBGICgmc3BlYy0+aW5mbyk7CisgICAgZm9ybWF0Lm1CaXRzUGVyQ2hhbm5lbCA9IGRlcHRoOworICAgIGZvcm1hdC5tQnl0ZXNQZXJQYWNrZXQgPSBHU1RfQVVESU9fSU5GT19CUEYgKCZzcGVjLT5pbmZvKTsKKyAgICBmb3JtYXQubUZyYW1lc1BlclBhY2tldCA9IDE7CisgICAgZm9ybWF0Lm1SZXNlcnZlZCA9IDA7CisgICAgc3BlYy0+c2Vnc2l6ZSA9CisgICAgICAgIChzcGVjLT5sYXRlbmN5X3RpbWUgKiBHU1RfQVVESU9fSU5GT19SQVRFICgmc3BlYy0+aW5mbykgLworICAgICAgICBHX1VTRUNfUEVSX1NFQykgKiBHU1RfQVVESU9fSU5GT19CUEYgKCZzcGVjLT5pbmZvKTsKKyAgICBzcGVjLT5zZWd0b3RhbCA9IHNwZWMtPmJ1ZmZlcl90aW1lIC8gc3BlYy0+bGF0ZW5jeV90aW1lOworICAgIGlzX3Bhc3N0aHJvdWdoID0gRkFMU0U7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChvc3hidWYsICJGb3JtYXQ6ICIgQ09SRV9BVURJT19GT1JNQVQsCisgICAgICBDT1JFX0FVRElPX0ZPUk1BVF9BUkdTIChmb3JtYXQpKTsKKworICAvKiBnc3RfYXVkaW9fcmluZ19idWZmZXJfc2V0X2NoYW5uZWxfcG9zaXRpb25zIGlzIG5vdCBjYWxsZWQKKyAgICogc2luY2UgdGhlIEFVcyBwZXJmb3JtIGNoYW5uZWwgcmVvcmRlcmluZyB0aGVtc2VsdmVzLgorICAgKiAoc2VlIGdzdF9jb3JlX2F1ZGlvX3NldF9jaGFubmVsX2xheW91dCkgKi8KKworICBidWYtPnNpemUgPSBzcGVjLT5zZWd0b3RhbCAqIHNwZWMtPnNlZ3NpemU7CisgIGJ1Zi0+bWVtb3J5ID0gZ19tYWxsb2MwIChidWYtPnNpemUpOworCisgIHJldCA9IGdzdF9jb3JlX2F1ZGlvX2luaXRpYWxpemUgKG9zeGJ1Zi0+Y29yZV9hdWRpbywgZm9ybWF0LCBzcGVjLT5jYXBzLAorICAgICAgaXNfcGFzc3Rocm91Z2gpOworCisgIGlmICghcmV0KSB7CisgICAgZ19mcmVlIChidWYtPm1lbW9yeSk7CisgICAgYnVmLT5tZW1vcnkgPSBOVUxMOworICAgIGJ1Zi0+c2l6ZSA9IDA7CisgIH0KKworICBvc3hidWYtPnNlZ29mZnNldCA9IDA7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX3JlbGVhc2UgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0T3N4QXVkaW9SaW5nQnVmZmVyICpvc3hidWY7CisKKyAgb3N4YnVmID0gR1NUX09TWF9BVURJT19SSU5HX0JVRkZFUiAoYnVmKTsKKworICBnc3RfY29yZV9hdWRpb191bmluaXRpYWxpemUgKG9zeGJ1Zi0+Y29yZV9hdWRpbyk7CisKKyAgZ19mcmVlIChidWYtPm1lbW9yeSk7CisgIGJ1Zi0+bWVtb3J5ID0gTlVMTDsKKyAgYnVmLT5zaXplID0gMDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX3N0YXJ0IChHc3RBdWRpb1JpbmdCdWZmZXIgKiBidWYpCit7CisgIEdzdE9zeEF1ZGlvUmluZ0J1ZmZlciAqb3N4YnVmOworCisgIG9zeGJ1ZiA9IEdTVF9PU1hfQVVESU9fUklOR19CVUZGRVIgKGJ1Zik7CisKKyAgcmV0dXJuIGdzdF9jb3JlX2F1ZGlvX3N0YXJ0X3Byb2Nlc3NpbmcgKG9zeGJ1Zi0+Y29yZV9hdWRpbyk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9wYXVzZSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RPc3hBdWRpb1JpbmdCdWZmZXIgKm9zeGJ1ZiA9IEdTVF9PU1hfQVVESU9fUklOR19CVUZGRVIgKGJ1Zik7CisKKyAgcmV0dXJuIGdzdF9jb3JlX2F1ZGlvX3BhdXNlX3Byb2Nlc3NpbmcgKG9zeGJ1Zi0+Y29yZV9hdWRpbyk7Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3Rfb3N4X2F1ZGlvX3JpbmdfYnVmZmVyX3N0b3AgKEdzdEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0T3N4QXVkaW9SaW5nQnVmZmVyICpvc3hidWY7CisKKyAgb3N4YnVmID0gR1NUX09TWF9BVURJT19SSU5HX0JVRkZFUiAoYnVmKTsKKworICBnc3RfY29yZV9hdWRpb19zdG9wX3Byb2Nlc3NpbmcgKG9zeGJ1Zi0+Y29yZV9hdWRpbyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBndWludAorZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9kZWxheSAoR3N0QXVkaW9SaW5nQnVmZmVyICogYnVmKQoreworICBHc3RPc3hBdWRpb1JpbmdCdWZmZXIgKm9zeGJ1ZjsKKyAgZG91YmxlIGxhdGVuY3k7CisgIGd1aW50IHNhbXBsZXM7CisKKyAgb3N4YnVmID0gR1NUX09TWF9BVURJT19SSU5HX0JVRkZFUiAoYnVmKTsKKworICBpZiAoIWdzdF9jb3JlX2F1ZGlvX2dldF9zYW1wbGVzX2FuZF9sYXRlbmN5IChvc3hidWYtPmNvcmVfYXVkaW8sCisgICAgICAgICAgR1NUX0FVRElPX0lORk9fUkFURSAoJmJ1Zi0+c3BlYy5pbmZvKSwgJnNhbXBsZXMsICZsYXRlbmN5KSkgeworICAgIHJldHVybiAwOworICB9CisgIEdTVF9ERUJVR19PQkpFQ1QgKGJ1ZiwgIkdvdCBsYXRlbmN5OiAlZiBzZWNvbmRzIC0+ICVkIHNhbXBsZXMiLAorICAgICAgbGF0ZW5jeSwgc2FtcGxlcyk7CisgIHJldHVybiBzYW1wbGVzOworfQpkaWZmIC0tZ2l0IGEvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5oIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvcmluZ2J1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNTRmZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9yaW5nYnVmZmVyLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA2IFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorICogQ29weXJpZ2h0IChDKSAyMDEyIEZsdWVuZG8gUy5BLiA8c3VwcG9ydEBmbHVlbmRvLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSAodGhlICJMR1BMIiksIGluCisgKiB3aGljaCBjYXNlIHRoZSBmb2xsb3dpbmcgcHJvdmlzaW9ucyBhcHBseSBpbnN0ZWFkIG9mIHRoZSBvbmVzCisgKiBtZW50aW9uZWQgYWJvdmU6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9PU1hfUklOR19CVUZGRVJfSF9fCisjZGVmaW5lIF9fR1NUX09TWF9SSU5HX0JVRkZFUl9IX18KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvcmluZ2J1ZmZlci5oPgorI2luY2x1ZGUgPGdzdG9zeGNvcmVhdWRpby5oPgorCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9PU1hfQVVESU9fUklOR19CVUZGRVIgXAorICAoZ3N0X29zeF9hdWRpb19yaW5nX2J1ZmZlcl9nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfT1NYX0FVRElPX1JJTkdfQlVGRkVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfT1NYX0FVRElPX1JJTkdfQlVGRkVSLEdzdE9zeEF1ZGlvUmluZ0J1ZmZlcikpCisjZGVmaW5lIEdTVF9PU1hfQVVESU9fUklOR19CVUZGRVJfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfT1NYX0FVRElPX1JJTkdfQlVGRkVSLEdzdE9zeEF1ZGlvUmluZ0J1ZmZlckNsYXNzKSkKKyNkZWZpbmUgR1NUX09TWF9BVURJT19SSU5HX0JVRkZFUl9HRVRfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTKChvYmopLEdTVF9UWVBFX09TWF9BVURJT19SSU5HX0JVRkZFUixHc3RPc3hBdWRpb1JpbmdCdWZmZXJDbGFzcykpCisjZGVmaW5lIEdTVF9JU19PU1hfQVVESU9fUklOR19CVUZGRVIob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9PU1hfQVVESU9fUklOR19CVUZGRVIpKQorI2RlZmluZSBHU1RfSVNfT1NYX0FVRElPX1JJTkdfQlVGRkVSX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX09TWF9BVURJT19SSU5HX0JVRkZFUikpCisKKyNkZWZpbmUgUklOR0JVRkZFUl9JU19TUERJRih0KSAoKHQpID09IEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9BQzMgfHwgKHQpID09IEdTVF9BVURJT19SSU5HX0JVRkZFUl9GT1JNQVRfVFlQRV9EVFMpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RPc3hBdWRpb1JpbmdCdWZmZXIgR3N0T3N4QXVkaW9SaW5nQnVmZmVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zeEF1ZGlvUmluZ0J1ZmZlckNsYXNzIEdzdE9zeEF1ZGlvUmluZ0J1ZmZlckNsYXNzOworCitzdHJ1Y3QgX0dzdE9zeEF1ZGlvUmluZ0J1ZmZlcgoreworICBHc3RBdWRpb1JpbmdCdWZmZXIgb2JqZWN0OworCisgIEdzdENvcmVBdWRpbyAqY29yZV9hdWRpbzsKKworICBndWludCBidWZmZXJfbGVuOworICBndWludCBzZWdvZmZzZXQ7Cit9OworCitzdHJ1Y3QgX0dzdE9zeEF1ZGlvUmluZ0J1ZmZlckNsYXNzCit7CisgIEdzdEF1ZGlvUmluZ0J1ZmZlckNsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9vc3hfYXVkaW9fcmluZ19idWZmZXJfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfT1NYX0FVRElPX1JJTkdfQlVGRkVSX0hfXyAqLworCmRpZmYgLS1naXQgYS9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmMgYi9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFmZDE1OAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NpbmsuYwpAQCAtMCwwICsxLDU3MyBAQAorLyoKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA1LDIwMDYgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsMjAwOCBQaW9uZWVycyBvZiB0aGUgSW5ldml0YWJsZSA8c29uZ2JpcmRAc29uZ2JpcmRuZXN0LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBGbHVlbmRvIFMuQS4gPHN1cHBvcnRAZmx1ZW5kby5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjEgKHRoZSAiTEdQTCIpLCBpbgorICogd2hpY2ggY2FzZSB0aGUgZm9sbG93aW5nIHByb3Zpc2lvbnMgYXBwbHkgaW5zdGVhZCBvZiB0aGUgb25lcworICogbWVudGlvbmVkIGFib3ZlOgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqIFRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgd2FzIG1hZGUgcG9zc2libGUgZHVlIHRvIHRoZSBpbnZvbHZlbWVudCBvZgorICogUGlvbmVlcnMgb2YgdGhlIEluZXZpdGFibGUsIHRoZSBjcmVhdG9ycyBvZiB0aGUgU29uZ2JpcmQgTXVzaWMgcGxheWVyCisgKgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LW9zeGF1ZGlvc2luaworICoKKyAqIFRoaXMgZWxlbWVudCByZW5kZXJzIHJhdyBhdWRpbyBzYW1wbGVzIHVzaW5nIHRoZSBDb3JlQXVkaW8gYXBpLgorICoKKyAqIDxyZWZzZWN0Mj4KKyAqIDx0aXRsZT5FeGFtcGxlIHBpcGVsaW5lczwvdGl0bGU+CisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgZmlsZXNyYyBsb2NhdGlvbj1zaW5lLm9nZyAhIG9nZ2RlbXV4ICEgdm9yYmlzZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIG9zeGF1ZGlvc2luaworICogXXwgUGxheSBhbiBPZ2cvVm9yYmlzIGZpbGUuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby1jaGFubmVscy5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9nc3RhdWRpb2llYzYxOTM3Lmg+CisKKyNpbmNsdWRlICJnc3Rvc3hhdWRpb3NpbmsuaCIKKyNpbmNsdWRlICJnc3Rvc3hhdWRpb2VsZW1lbnQuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAob3N4X2F1ZGlvc2lua19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBvc3hfYXVkaW9zaW5rX2RlYnVnCisKKyNpbmNsdWRlICJnc3Rvc3hjb3JlYXVkaW8uaCIKKworLyogRmlsdGVyIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgLyogRklMTCBNRSAqLworICBMQVNUX1NJR05BTAorfTsKKworZW51bQoreworICBBUkdfMCwKKyAgQVJHX0RFVklDRSwKKyAgQVJHX1ZPTFVNRQorfTsKKworI2RlZmluZSBERUZBVUxUX1ZPTFVNRSAxLjAKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmtfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoR1NUX09TWF9BVURJT19TSU5LX0NBUFMpCisgICAgKTsKKworc3RhdGljIHZvaWQgZ3N0X29zeF9hdWRpb19zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF9vc3hfYXVkaW9fc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X29zeF9hdWRpb19zaW5rX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfb3N4X2F1ZGlvX3NpbmtfcXVlcnkgKEdzdEJhc2VTaW5rICogYmFzZSwgR3N0UXVlcnkgKiBxdWVyeSk7CisKK3N0YXRpYyBHc3RDYXBzICpnc3Rfb3N4X2F1ZGlvX3NpbmtfZ2V0Y2FwcyAoR3N0QmFzZVNpbmsgKiBiYXNlLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpOworc3RhdGljIGdib29sZWFuIGdzdF9vc3hfYXVkaW9fc2lua19hY2NlcHRjYXBzIChHc3RPc3hBdWRpb1NpbmsgKiBzaW5rLAorICAgIEdzdENhcHMgKiBjYXBzKTsKKworc3RhdGljIEdzdEJ1ZmZlciAqZ3N0X29zeF9hdWRpb19zaW5rX3NpbmtfcGF5bG9hZCAoR3N0QXVkaW9CYXNlU2luayAqIHNpbmssCisgICAgR3N0QnVmZmVyICogYnVmKTsKK3N0YXRpYyBHc3RBdWRpb1JpbmdCdWZmZXIKKyAgICAqIGdzdF9vc3hfYXVkaW9fc2lua19jcmVhdGVfcmluZ2J1ZmZlciAoR3N0QXVkaW9CYXNlU2luayAqIHNpbmspOworc3RhdGljIHZvaWQgZ3N0X29zeF9hdWRpb19zaW5rX29zeGVsZW1lbnRfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwKKyAgICBncG9pbnRlciBpZmFjZV9kYXRhKTsKK3N0YXRpYyB2b2lkIGdzdF9vc3hfYXVkaW9fc2lua19zZXRfdm9sdW1lIChHc3RPc3hBdWRpb1NpbmsgKiBzaW5rKTsKKworc3RhdGljIE9TU3RhdHVzIGdzdF9vc3hfYXVkaW9fc2lua19pb19wcm9jIChHc3RPc3hBdWRpb1JpbmdCdWZmZXIgKiBidWYsCisgICAgQXVkaW9Vbml0UmVuZGVyQWN0aW9uRmxhZ3MgKiBpb0FjdGlvbkZsYWdzLAorICAgIGNvbnN0IEF1ZGlvVGltZVN0YW1wICogaW5UaW1lU3RhbXAsCisgICAgVUludDMyIGluQnVzTnVtYmVyLCBVSW50MzIgaW5OdW1iZXJGcmFtZXMsIEF1ZGlvQnVmZmVyTGlzdCAqIGJ1ZmZlckxpc3QpOworCitzdGF0aWMgdm9pZAorZ3N0X29zeF9hdWRpb19zaW5rX2RvX2luaXQgKEdUeXBlIHR5cGUpCit7CisgIHN0YXRpYyBjb25zdCBHSW50ZXJmYWNlSW5mbyBvc3hlbGVtZW50X2luZm8gPSB7CisgICAgZ3N0X29zeF9hdWRpb19zaW5rX29zeGVsZW1lbnRfaW5pdCwKKyAgICBOVUxMLAorICAgIE5VTEwKKyAgfTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAob3N4X2F1ZGlvc2lua19kZWJ1ZywgIm9zeGF1ZGlvc2luayIsIDAsCisgICAgICAiT1NYIEF1ZGlvIFNpbmsiKTsKKyAgZ3N0X2NvcmVfYXVkaW9faW5pdF9kZWJ1ZyAoKTsKKyAgR1NUX0RFQlVHICgiQWRkaW5nIHN0YXRpYyBpbnRlcmZhY2UiKTsKKyAgZ190eXBlX2FkZF9pbnRlcmZhY2Vfc3RhdGljICh0eXBlLCBHU1RfT1NYX0FVRElPX0VMRU1FTlRfVFlQRSwKKyAgICAgICZvc3hlbGVtZW50X2luZm8pOworfQorCisjZGVmaW5lIGdzdF9vc3hfYXVkaW9fc2lua19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoR3N0T3N4QXVkaW9TaW5rLCBnc3Rfb3N4X2F1ZGlvX3NpbmssCisgICAgR1NUX1RZUEVfQVVESU9fQkFTRV9TSU5LLCBnc3Rfb3N4X2F1ZGlvX3NpbmtfZG9faW5pdCAoZ19kZWZpbmVfdHlwZV9pZCkpOworCitzdGF0aWMgdm9pZAorZ3N0X29zeF9hdWRpb19zaW5rX2NsYXNzX2luaXQgKEdzdE9zeEF1ZGlvU2lua0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCYXNlU2lua0NsYXNzICpnc3RiYXNlc2lua19jbGFzczsKKyAgR3N0QXVkaW9CYXNlU2lua0NsYXNzICpnc3RhdWRpb2Jhc2VzaW5rX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MgPSAoR3N0QmFzZVNpbmtDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YXVkaW9iYXNlc2lua19jbGFzcyA9IChHc3RBdWRpb0Jhc2VTaW5rQ2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X29zeF9hdWRpb19zaW5rX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X29zeF9hdWRpb19zaW5rX2dldF9wcm9wZXJ0eTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3hfYXVkaW9fc2lua19jaGFuZ2Vfc3RhdGUpOworCisjaWZuZGVmIEhBVkVfSU9TCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIEFSR19ERVZJQ0UsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiZGV2aWNlIiwgIkRldmljZSBJRCIsICJEZXZpY2UgSUQgb2Ygb3V0cHV0IGRldmljZSIsCisgICAgICAgICAgMCwgR19NQVhJTlQsIDAsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworI2VuZGlmCisKKyAgZ3N0YmFzZXNpbmtfY2xhc3MtPnF1ZXJ5ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3hfYXVkaW9fc2lua19xdWVyeSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgQVJHX1ZPTFVNRSwKKyAgICAgIGdfcGFyYW1fc3BlY19kb3VibGUgKCJ2b2x1bWUiLCAiVm9sdW1lIiwgIlZvbHVtZSBvZiB0aGlzIHN0cmVhbSIsCisgICAgICAgICAgMCwgMS4wLCAxLjAsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdzdGJhc2VzaW5rX2NsYXNzLT5nZXRfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfb3N4X2F1ZGlvX3NpbmtfZ2V0Y2Fwcyk7CisKKyAgZ3N0YXVkaW9iYXNlc2lua19jbGFzcy0+Y3JlYXRlX3JpbmdidWZmZXIgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3hfYXVkaW9fc2lua19jcmVhdGVfcmluZ2J1ZmZlcik7CisgIGdzdGF1ZGlvYmFzZXNpbmtfY2xhc3MtPnBheWxvYWQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3hfYXVkaW9fc2lua19zaW5rX3BheWxvYWQpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc2lua19mYWN0b3J5KTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiQXVkaW8gU2luayAoT1NYKSIsCisgICAgICAiU2luay9BdWRpbyIsCisgICAgICAiT3V0cHV0IHRvIGEgc291bmQgY2FyZCBpbiBPUyBYIiwKKyAgICAgICJaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4iKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfYXVkaW9fc2lua19pbml0IChHc3RPc3hBdWRpb1NpbmsgKiBzaW5rKQoreworICBHU1RfREVCVUcgKCJJbml0aWFsaXNpbmcgb2JqZWN0Iik7CisKKyAgc2luay0+ZGV2aWNlX2lkID0ga0F1ZGlvRGV2aWNlVW5rbm93bjsKKyAgc2luay0+dm9sdW1lID0gREVGQVVMVF9WT0xVTUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X2F1ZGlvX3Npbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE9zeEF1ZGlvU2luayAqc2luayA9IEdTVF9PU1hfQVVESU9fU0lOSyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyNpZm5kZWYgSEFWRV9JT1MKKyAgICBjYXNlIEFSR19ERVZJQ0U6CisgICAgICBzaW5rLT5kZXZpY2VfaWQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBBUkdfVk9MVU1FOgorICAgICAgc2luay0+dm9sdW1lID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBnc3Rfb3N4X2F1ZGlvX3Npbmtfc2V0X3ZvbHVtZSAoc2luayk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X29zeF9hdWRpb19zaW5rX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0T3N4QXVkaW9TaW5rICpvc3hzaW5rID0gR1NUX09TWF9BVURJT19TSU5LIChlbGVtZW50KTsKKyAgR3N0T3N4QXVkaW9SaW5nQnVmZmVyICpyaW5nYnVmZmVyOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0ID0gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKQorICAgIGdvdG8gb3V0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgLyogRGV2aWNlIGhhcyBiZWVuIHNlbGVjdGVkLCBBdWRpb1VuaXQgc2V0IHVwLCBzbyBpbml0aWFsaXplIHZvbHVtZSAqLworICAgICAgZ3N0X29zeF9hdWRpb19zaW5rX3NldF92b2x1bWUgKG9zeHNpbmspOworCisgICAgICAvKiBUaGUgZGV2aWNlIGlzIG9wZW4gbm93LCBzbyBmaXggb3VyIGRldmljZV9pZCBpZiBpdCBjaGFuZ2VkICovCisgICAgICByaW5nYnVmZmVyID0KKyAgICAgICAgICBHU1RfT1NYX0FVRElPX1JJTkdfQlVGRkVSIChHU1RfQVVESU9fQkFTRV9TSU5LIChvc3hzaW5rKS0+cmluZ2J1ZmZlcik7CisgICAgICBpZiAocmluZ2J1ZmZlci0+Y29yZV9hdWRpby0+ZGV2aWNlX2lkICE9IG9zeHNpbmstPmRldmljZV9pZCkgeworICAgICAgICBvc3hzaW5rLT5kZXZpY2VfaWQgPSByaW5nYnVmZmVyLT5jb3JlX2F1ZGlvLT5kZXZpY2VfaWQ7CisgICAgICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKG9zeHNpbmspLCAiZGV2aWNlIik7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCitvdXQ6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X2F1ZGlvX3NpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdE9zeEF1ZGlvU2luayAqc2luayA9IEdTVF9PU1hfQVVESU9fU0lOSyAob2JqZWN0KTsKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisjaWZuZGVmIEhBVkVfSU9TCisgICAgY2FzZSBBUkdfREVWSUNFOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgc2luay0+ZGV2aWNlX2lkKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBBUkdfVk9MVU1FOgorICAgICAgZ192YWx1ZV9zZXRfZG91YmxlICh2YWx1ZSwgc2luay0+dm9sdW1lKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfb3N4X2F1ZGlvX3NpbmtfcXVlcnkgKEdzdEJhc2VTaW5rICogYmFzZSwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0T3N4QXVkaW9TaW5rICpzaW5rID0gR1NUX09TWF9BVURJT19TSU5LIChiYXNlKTsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQUNDRVBUX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9hY2NlcHRfY2FwcyAocXVlcnksICZjYXBzKTsKKyAgICAgIHJldCA9IGdzdF9vc3hfYXVkaW9fc2lua19hY2NlcHRjYXBzIChzaW5rLCBjYXBzKTsKKyAgICAgIGdzdF9xdWVyeV9zZXRfYWNjZXB0X2NhcHNfcmVzdWx0IChxdWVyeSwgcmV0KTsKKyAgICAgIHJldCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IEdTVF9CQVNFX1NJTktfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnF1ZXJ5IChiYXNlLCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3Rfb3N4X2F1ZGlvX3NpbmtfZ2V0Y2FwcyAoR3N0QmFzZVNpbmsgKiBzaW5rLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RPc3hBdWRpb1NpbmsgKm9zeHNpbms7CisgIEdzdEF1ZGlvUmluZ0J1ZmZlciAqYnVmOworICBHc3RPc3hBdWRpb1JpbmdCdWZmZXIgKm9zeGJ1ZjsKKyAgR3N0Q2FwcyAqY2FwcywgKmZpbHRlcmVkX2NhcHM7CisKKyAgb3N4c2luayA9IEdTVF9PU1hfQVVESU9fU0lOSyAoc2luayk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChvc3hzaW5rKTsKKyAgYnVmID0gR1NUX0FVRElPX0JBU0VfU0lOSyAoc2luayktPnJpbmdidWZmZXI7CisgIGlmIChidWYpCisgICAgZ3N0X29iamVjdF9yZWYgKGJ1Zik7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChvc3hzaW5rKTsKKworICBpZiAoIWJ1ZikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNpbmssICJubyByaW5nIGJ1ZmZlciwgcmV0dXJuaW5nIE5VTEwgY2FwcyIpOworICAgIHJldHVybiBHU1RfQkFTRV9TSU5LX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5nZXRfY2FwcyAoc2luaywgZmlsdGVyKTsKKyAgfQorCisgIG9zeGJ1ZiA9IEdTVF9PU1hfQVVESU9fUklOR19CVUZGRVIgKGJ1Zik7CisKKyAgLyogcHJvdGVjdCBhZ2FpbnN0IGNhY2hlZF9jYXBzIGdvaW5nIGF3YXkgKi8KKyAgR1NUX09CSkVDVF9MT0NLIChidWYpOworCisgIGlmIChvc3hidWYtPmNvcmVfYXVkaW8tPmNhY2hlZF9jYXBzX3ZhbGlkKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNpbmssICJSZXR1cm5pbmcgY2FjaGVkIGNhcHMiKTsKKyAgICBjYXBzID0gZ3N0X2NhcHNfcmVmIChvc3hidWYtPmNvcmVfYXVkaW8tPmNhY2hlZF9jYXBzKTsKKyAgfSBlbHNlIGlmIChidWYtPm9wZW4pIHsKKyAgICBHc3RDYXBzICp0ZW1wbGF0ZV9jYXBzOworCisgICAgLyogR2V0IHRlbXBsYXRlIGNhcHMgKi8KKyAgICB0ZW1wbGF0ZV9jYXBzID0KKyAgICAgICAgZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9BVURJT19CQVNFX1NJTktfUEFEIChvc3hzaW5rKSk7CisKKyAgICAvKiBEZXZpY2UgaXMgb3BlbiwgbGV0J3MgcHJvYmUgaXRzIGNhcHMgKi8KKyAgICBjYXBzID0gZ3N0X2NvcmVfYXVkaW9fcHJvYmVfY2FwcyAob3N4YnVmLT5jb3JlX2F1ZGlvLCB0ZW1wbGF0ZV9jYXBzKTsKKyAgICBnc3RfY2Fwc19yZXBsYWNlICgmb3N4YnVmLT5jb3JlX2F1ZGlvLT5jYWNoZWRfY2FwcywgY2Fwcyk7CisKKyAgICBnc3RfY2Fwc191bnJlZiAodGVtcGxhdGVfY2Fwcyk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgInJpbmcgYnVmZmVyIG5vdCBvcGVuLCByZXR1cm5pbmcgTlVMTCBjYXBzIik7CisgICAgY2FwcyA9IE5VTEw7CisgIH0KKworICBHU1RfT0JKRUNUX1VOTE9DSyAoYnVmKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChidWYpOworCisgIGlmICghY2FwcykKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIWZpbHRlcikKKyAgICByZXR1cm4gY2FwczsKKworICAvKiBUYWtlIGNhcmUgb2YgZmlsdGVyZWQgY2FwcyAqLworICBmaWx0ZXJlZF9jYXBzID0KKyAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIGNhcHMsIEdTVF9DQVBTX0lOVEVSU0VDVF9GSVJTVCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgcmV0dXJuIGZpbHRlcmVkX2NhcHM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zeF9hdWRpb19zaW5rX2FjY2VwdGNhcHMgKEdzdE9zeEF1ZGlvU2luayAqIHNpbmssIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RDYXBzICpwYWRfY2FwczsKKyAgR3N0U3RydWN0dXJlICpzdDsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisgIEdzdEF1ZGlvUmluZ0J1ZmZlclNwZWMgc3BlYyA9IHsgMCB9OworICBnY2hhciAqY2Fwc19zdHJpbmcgPSBOVUxMOworCisgIGNhcHNfc3RyaW5nID0gZ3N0X2NhcHNfdG9fc3RyaW5nIChjYXBzKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgImFjY2VwdGNhcHMgY2FsbGVkIHdpdGggJXMiLCBjYXBzX3N0cmluZyk7CisgIGdfZnJlZSAoY2Fwc19zdHJpbmcpOworCisgIHBhZF9jYXBzID0gZ3N0X3BhZF9xdWVyeV9jYXBzIChHU1RfQkFTRV9TSU5LX1BBRCAoc2luayksIGNhcHMpOworICBpZiAocGFkX2NhcHMpIHsKKyAgICBnYm9vbGVhbiBjcmV0ID0gZ3N0X2NhcHNfY2FuX2ludGVyc2VjdCAocGFkX2NhcHMsIGNhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChwYWRfY2Fwcyk7CisgICAgaWYgKCFjcmV0KQorICAgICAgZ290byBkb25lOworICB9CisKKyAgLyogSWYgd2UndmUgbm90IGdvdCBmaXhlZCBjYXBzLCBjcmVhdGluZyBhIHN0cmVhbSBtaWdodCBmYWlsLAorICAgKiBzbyBsZXQncyBqdXN0IHJldHVybiBmcm9tIGhlcmUgd2l0aCBkZWZhdWx0IGFjY2VwdGNhcHMKKyAgICogYmVoYXZpb3VyICovCisgIGlmICghZ3N0X2NhcHNfaXNfZml4ZWQgKGNhcHMpKQorICAgIGdvdG8gZG9uZTsKKworICAvKiBwYXJzZSBoZWxwZXIgZXhwZWN0cyB0aGlzIHNldCwgc28gYXZvaWQgbmFzdHkgd2FybmluZworICAgKiB3aWxsIGJlIHNldCBwcm9wZXJseSBsYXRlciBvbiBhbnl3YXkgICovCisgIHNwZWMubGF0ZW5jeV90aW1lID0gR1NUX1NFQ09ORDsKKyAgaWYgKCFnc3RfYXVkaW9fcmluZ19idWZmZXJfcGFyc2VfY2FwcyAoJnNwZWMsIGNhcHMpKQorICAgIGdvdG8gZG9uZTsKKworICAvKiBNYWtlIHN1cmUgaW5wdXQgaXMgZnJhbWVkIGFuZCBjYW4gYmUgcGF5bG9hZGVkICovCisgIHN3aXRjaCAoc3BlYy50eXBlKSB7CisgICAgY2FzZSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfQUMzOgorICAgIHsKKyAgICAgIGdib29sZWFuIGZyYW1lZCA9IEZBTFNFOworCisgICAgICBzdCA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9ib29sZWFuIChzdCwgImZyYW1lZCIsICZmcmFtZWQpOworICAgICAgaWYgKCFmcmFtZWQgfHwgZ3N0X2F1ZGlvX2llYzYxOTM3X2ZyYW1lX3NpemUgKCZzcGVjKSA8PSAwKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfQVVESU9fUklOR19CVUZGRVJfRk9STUFUX1RZUEVfRFRTOgorICAgIHsKKyAgICAgIGdib29sZWFuIHBhcnNlZCA9IEZBTFNFOworCisgICAgICBzdCA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9ib29sZWFuIChzdCwgInBhcnNlZCIsICZwYXJzZWQpOworICAgICAgaWYgKCFwYXJzZWQgfHwgZ3N0X2F1ZGlvX2llYzYxOTM3X2ZyYW1lX3NpemUgKCZzcGVjKSA8PSAwKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldCA9IFRSVUU7CisKK2RvbmU6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X29zeF9hdWRpb19zaW5rX3NpbmtfcGF5bG9hZCAoR3N0QXVkaW9CYXNlU2luayAqIHNpbmssIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgaWYgKFJJTkdCVUZGRVJfSVNfU1BESUYgKHNpbmstPnJpbmdidWZmZXItPnNwZWMudHlwZSkpIHsKKyAgICBnaW50IGZyYW1lc2l6ZSA9IGdzdF9hdWRpb19pZWM2MTkzN19mcmFtZV9zaXplICgmc2luay0+cmluZ2J1ZmZlci0+c3BlYyk7CisgICAgR3N0QnVmZmVyICpvdXQ7CisgICAgR3N0TWFwSW5mbyBpbm1hcCwgb3V0bWFwOworICAgIGdib29sZWFuIHJlczsKKworICAgIGlmIChmcmFtZXNpemUgPD0gMCkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgb3V0ID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChmcmFtZXNpemUpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJmlubWFwLCBHU1RfTUFQX1JFQUQpOworICAgIGdzdF9idWZmZXJfbWFwIChvdXQsICZvdXRtYXAsIEdTVF9NQVBfV1JJVEUpOworCisgICAgLyogRklYTUU6IHRoZSBlbmRpYW5uZXNzIG5lZWRzIHRvIGJlIHF1ZXJpZWQgYW5kIHRoZW4gc2V0ICovCisgICAgcmVzID0gZ3N0X2F1ZGlvX2llYzYxOTM3X3BheWxvYWQgKGlubWFwLmRhdGEsIGlubWFwLnNpemUsCisgICAgICAgIG91dG1hcC5kYXRhLCBvdXRtYXAuc2l6ZSwgJnNpbmstPnJpbmdidWZmZXItPnNwZWMsIEdfQklHX0VORElBTik7CisKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZpbm1hcCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0LCAmb3V0bWFwKTsKKworICAgIGlmICghcmVzKSB7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChvdXQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKG91dCwgYnVmLCBHU1RfQlVGRkVSX0NPUFlfTUVUQURBVEEsIDAsIC0xKTsKKyAgICByZXR1cm4gb3V0OworCisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGdzdF9idWZmZXJfcmVmIChidWYpOworICB9Cit9CisKK3N0YXRpYyBHc3RBdWRpb1JpbmdCdWZmZXIgKgorZ3N0X29zeF9hdWRpb19zaW5rX2NyZWF0ZV9yaW5nYnVmZmVyIChHc3RBdWRpb0Jhc2VTaW5rICogc2luaykKK3sKKyAgR3N0T3N4QXVkaW9TaW5rICpvc3hzaW5rOworICBHc3RPc3hBdWRpb1JpbmdCdWZmZXIgKnJpbmdidWZmZXI7CisKKyAgb3N4c2luayA9IEdTVF9PU1hfQVVESU9fU0lOSyAoc2luayk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgIkNyZWF0aW5nIHJpbmdidWZmZXIiKTsKKyAgcmluZ2J1ZmZlciA9IGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfT1NYX0FVRElPX1JJTkdfQlVGRkVSLCBOVUxMKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2luaywgIm9zeCBzaW5rICVwIGVsZW1lbnQgJXAgIGlvcHJvYyAlcCIsIG9zeHNpbmssCisgICAgICBHU1RfT1NYX0FVRElPX0VMRU1FTlRfR0VUX0lOVEVSRkFDRSAob3N4c2luayksCisgICAgICAodm9pZCAqKSBnc3Rfb3N4X2F1ZGlvX3NpbmtfaW9fcHJvYyk7CisKKyAgcmluZ2J1ZmZlci0+Y29yZV9hdWRpby0+ZWxlbWVudCA9CisgICAgICBHU1RfT1NYX0FVRElPX0VMRU1FTlRfR0VUX0lOVEVSRkFDRSAob3N4c2luayk7CisgIHJpbmdidWZmZXItPmNvcmVfYXVkaW8tPmlzX3NyYyA9IEZBTFNFOworCisgIC8qIEJ5IGRlZmF1bHQgdGhlIGNvcmVhdWRpbyBpbnN0YW5jZSBjcmVhdGVkIGJ5IHRoZSByaW5nYnVmZmVyCisgICAqIGhhcyBkZXZpY2VfaWQ9PWtBdWRpb0RldmljZVVua25vd24uIFRoZSB1c2VyIG1pZ2h0IGhhdmUKKyAgICogc2VsZWN0ZWQgYSBkaWZmZXJlbnQgb25lIGhlcmUKKyAgICovCisgIGlmIChyaW5nYnVmZmVyLT5jb3JlX2F1ZGlvLT5kZXZpY2VfaWQgIT0gb3N4c2luay0+ZGV2aWNlX2lkKQorICAgIHJpbmdidWZmZXItPmNvcmVfYXVkaW8tPmRldmljZV9pZCA9IG9zeHNpbmstPmRldmljZV9pZDsKKworICByZXR1cm4gR1NUX0FVRElPX1JJTkdfQlVGRkVSIChyaW5nYnVmZmVyKTsKK30KKworLyogSEFMT3V0cHV0IEF1ZGlvVW5pdCB3aWxsIHJlcXVlc3QgZmFpcmx5IGFyYml0cmFyaWx5LXNpemVkIGNodW5rcworICogb2YgZGF0YSwgbm90IG9mIGEgZml4ZWQgc2l6ZS4gU28sIHdlIGtlZXAgdHJhY2sgb2Ygd2hlcmUgaW4KKyAqIHRoZSBjdXJyZW50IHJpbmdidWZmZXIgc2VnbWVudCB3ZSBhcmUsIGFuZCBvbmx5IGFkdmFuY2UgdGhlIHNlZ21lbnQKKyAqIG9uY2Ugd2UndmUgcmVhZCB0aGUgd2hvbGUgdGhpbmcgKi8KK3N0YXRpYyBPU1N0YXR1cworZ3N0X29zeF9hdWRpb19zaW5rX2lvX3Byb2MgKEdzdE9zeEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZiwKKyAgICBBdWRpb1VuaXRSZW5kZXJBY3Rpb25GbGFncyAqIGlvQWN0aW9uRmxhZ3MsCisgICAgY29uc3QgQXVkaW9UaW1lU3RhbXAgKiBpblRpbWVTdGFtcCwKKyAgICBVSW50MzIgaW5CdXNOdW1iZXIsIFVJbnQzMiBpbk51bWJlckZyYW1lcywgQXVkaW9CdWZmZXJMaXN0ICogYnVmZmVyTGlzdCkKK3sKKyAgZ3VpbnQ4ICpyZWFkcHRyOworICBnaW50IHJlYWRzZWc7CisgIGdpbnQgbGVuOworICBnaW50IHN0cmVhbV9pZHggPSBidWYtPmNvcmVfYXVkaW8tPnN0cmVhbV9pZHg7CisgIGdpbnQgcmVtYWluaW5nID0gYnVmZmVyTGlzdC0+bUJ1ZmZlcnNbc3RyZWFtX2lkeF0ubURhdGFCeXRlU2l6ZTsKKyAgZ2ludCBvZmZzZXQgPSAwOworCisgIHdoaWxlIChyZW1haW5pbmcpIHsKKyAgICBpZiAoIWdzdF9hdWRpb19yaW5nX2J1ZmZlcl9wcmVwYXJlX3JlYWQgKEdTVF9BVURJT19SSU5HX0JVRkZFUiAoYnVmKSwKKyAgICAgICAgICAgICZyZWFkc2VnLCAmcmVhZHB0ciwgJmxlbikpCisgICAgICByZXR1cm4gMDsKKworICAgIGxlbiAtPSBidWYtPnNlZ29mZnNldDsKKworICAgIGlmIChsZW4gPiByZW1haW5pbmcpCisgICAgICBsZW4gPSByZW1haW5pbmc7CisKKyAgICBtZW1jcHkgKChjaGFyICopIGJ1ZmZlckxpc3QtPm1CdWZmZXJzW3N0cmVhbV9pZHhdLm1EYXRhICsgb2Zmc2V0LAorICAgICAgICByZWFkcHRyICsgYnVmLT5zZWdvZmZzZXQsIGxlbik7CisKKyAgICBidWYtPnNlZ29mZnNldCArPSBsZW47CisgICAgb2Zmc2V0ICs9IGxlbjsKKyAgICByZW1haW5pbmcgLT0gbGVuOworCisgICAgaWYgKChnaW50KSBidWYtPnNlZ29mZnNldCA9PSBHU1RfQVVESU9fUklOR19CVUZGRVIgKGJ1ZiktPnNwZWMuc2Vnc2l6ZSkgeworICAgICAgLyogY2xlYXIgd3JpdHRlbiBzYW1wbGVzICovCisgICAgICBnc3RfYXVkaW9fcmluZ19idWZmZXJfY2xlYXIgKEdTVF9BVURJT19SSU5HX0JVRkZFUiAoYnVmKSwgcmVhZHNlZyk7CisKKyAgICAgIC8qIHdlIHdyb3RlIG9uZSBzZWdtZW50ICovCisgICAgICBnc3RfYXVkaW9fcmluZ19idWZmZXJfYWR2YW5jZSAoR1NUX0FVRElPX1JJTkdfQlVGRkVSIChidWYpLCAxKTsKKworICAgICAgYnVmLT5zZWdvZmZzZXQgPSAwOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfYXVkaW9fc2lua19vc3hlbGVtZW50X2luaXQgKGdwb2ludGVyIGdfaWZhY2UsIGdwb2ludGVyIGlmYWNlX2RhdGEpCit7CisgIEdzdE9zeEF1ZGlvRWxlbWVudEludGVyZmFjZSAqaWZhY2UgPSAoR3N0T3N4QXVkaW9FbGVtZW50SW50ZXJmYWNlICopIGdfaWZhY2U7CisKKyAgaWZhY2UtPmlvX3Byb2MgPSAoQVVSZW5kZXJDYWxsYmFjaykgZ3N0X29zeF9hdWRpb19zaW5rX2lvX3Byb2M7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X2F1ZGlvX3Npbmtfc2V0X3ZvbHVtZSAoR3N0T3N4QXVkaW9TaW5rICogc2luaykKK3sKKyAgR3N0T3N4QXVkaW9SaW5nQnVmZmVyICpvc3hidWY7CisKKyAgb3N4YnVmID0gR1NUX09TWF9BVURJT19SSU5HX0JVRkZFUiAoR1NUX0FVRElPX0JBU0VfU0lOSyAoc2luayktPnJpbmdidWZmZXIpOworICBpZiAoIW9zeGJ1ZikKKyAgICByZXR1cm47CisKKyAgZ3N0X2NvcmVfYXVkaW9fc2V0X3ZvbHVtZSAob3N4YnVmLT5jb3JlX2F1ZGlvLCBzaW5rLT52b2x1bWUpOworfQpkaWZmIC0tZ2l0IGEvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5oIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc2luay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNTVjNGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3N4YXVkaW8vZ3N0b3N4YXVkaW9zaW5rLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA3IFBpb25lZXJzIG9mIHRoZSBJbmV2aXRhYmxlIDxzb25nYmlyZEBzb25nYmlyZG5lc3QuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEyIEZsdWVuZG8gUy5BLiA8c3VwcG9ydEBmbHVlbmRvLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSAodGhlICJMR1BMIiksIGluCisgKiB3aGljaCBjYXNlIHRoZSBmb2xsb3dpbmcgcHJvdmlzaW9ucyBhcHBseSBpbnN0ZWFkIG9mIHRoZSBvbmVzCisgKiBtZW50aW9uZWQgYWJvdmU6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICogVGhlIGRldmVsb3BtZW50IG9mIHRoaXMgY29kZSB3YXMgbWFkZSBwb3NzaWJsZSBkdWUgdG8gdGhlIGludm9sdmVtZW50IG9mCisgKiBQaW9uZWVycyBvZiB0aGUgSW5ldml0YWJsZSwgdGhlIGNyZWF0b3JzIG9mIHRoZSBTb25nYmlyZCBNdXNpYyBwbGF5ZXIKKyAqCisgKi8KKworI2lmbmRlZiBfX0dTVF9PU1hBVURJT1NJTktfSF9fCisjZGVmaW5lIF9fR1NUX09TWEFVRElPU0lOS19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9iYXNlc2luay5oPgorI2luY2x1ZGUgImdzdG9zeGF1ZGlvcmluZ2J1ZmZlci5oIgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX09TWF9BVURJT19TSU5LX0NBUFMgImF1ZGlvL3gtcmF3LCAiIFwKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX0ZPUk1BVFNfQUxMICIsICIgXAorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICAgICAgICAicmF0ZSA9IChpbnQpIFsxLCBNQVhdLCAiIFwKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgWzEsIDldOyIgXAorICAgICAgICAiYXVkaW8veC1hYzMsIGZyYW1lZCA9IChib29sZWFuKSB0cnVlOyIgXAorICAgICAgICAiYXVkaW8veC1kdHMsIGZyYW1lZCA9IChib29sZWFuKSB0cnVlIgorCisjZGVmaW5lIEdTVF9UWVBFX09TWF9BVURJT19TSU5LIFwKKyAgKGdzdF9vc3hfYXVkaW9fc2lua19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfT1NYX0FVRElPX1NJTksob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9PU1hfQVVESU9fU0lOSyxHc3RPc3hBdWRpb1NpbmspKQorI2RlZmluZSBHU1RfT1NYX0FVRElPX1NJTktfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfT1NYX0FVRElPX1NJTkssR3N0T3N4QXVkaW9TaW5rQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfT1NYX0FVRElPX1NJTksob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9PU1hfQVVESU9fU0lOSykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RPc3hBdWRpb1NpbmsgR3N0T3N4QXVkaW9TaW5rOwordHlwZWRlZiBzdHJ1Y3QgX0dzdE9zeEF1ZGlvU2lua0NsYXNzIEdzdE9zeEF1ZGlvU2lua0NsYXNzOworCitzdHJ1Y3QgX0dzdE9zeEF1ZGlvU2luaworeworICBHc3RBdWRpb0Jhc2VTaW5rIHNpbms7CisKKyAgQXVkaW9EZXZpY2VJRCBkZXZpY2VfaWQ7CisKKyAgQXVkaW9Vbml0IGF1ZGlvdW5pdDsKKyAgZG91YmxlIHZvbHVtZTsKKworICBndWludCBjaGFubmVsczsKK307CisKK3N0cnVjdCBfR3N0T3N4QXVkaW9TaW5rQ2xhc3MKK3sKKyAgR3N0QXVkaW9CYXNlU2lua0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF9vc3hfYXVkaW9fc2lua19nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9PU1hBVURJT1NJTktfSF9fICovCisKZGlmZiAtLWdpdCBhL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU1Njc3OAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5jCkBAIC0wLDAgKzEsMzk3IEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsMjAwNiBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBQaW9uZWVycyBvZiB0aGUgSW5ldml0YWJsZSA8c29uZ2JpcmRAc29uZ2JpcmRuZXN0LmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSAodGhlICJMR1BMIiksIGluCisgKiB3aGljaCBjYXNlIHRoZSBmb2xsb3dpbmcgcHJvdmlzaW9ucyBhcHBseSBpbnN0ZWFkIG9mIHRoZSBvbmVzCisgKiBtZW50aW9uZWQgYWJvdmU6CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtb3N4YXVkaW9zcmMKKyAqCisgKiBUaGlzIGVsZW1lbnQgY2FwdHVyZXMgcmF3IGF1ZGlvIHNhbXBsZXMgdXNpbmcgdGhlIENvcmVBdWRpbyBhcGkuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmU8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIG9zeGF1ZGlvc3JjICEgd2F2ZW5jICEgZmlsZXNpbmsgbG9jYXRpb249YXVkaW8ud2F2CisgKiBdfAorICogPC9yZWZzZWN0Mj4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlICJnc3Rvc3hhdWRpb3NyYy5oIgorI2luY2x1ZGUgImdzdG9zeGF1ZGlvZWxlbWVudC5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChvc3hfYXVkaW9zcmNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgb3N4X2F1ZGlvc3JjX2RlYnVnCisKKy8qIEZpbHRlciBzaWduYWxzIGFuZCBhcmdzICovCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgTEFTVF9TSUdOQUwKK307CisKK2VudW0KK3sKKyAgQVJHXzAsCisgIEFSR19ERVZJQ0UKK307CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfZmFjdG9yeSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEdTVF9PU1hfQVVESU9fU1JDX0NBUFMpCisgICAgKTsKKworc3RhdGljIHZvaWQgZ3N0X29zeF9hdWRpb19zcmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X29zeF9hdWRpb19zcmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9vc3hfYXVkaW9fc3JjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKK3N0YXRpYyBHc3RDYXBzICpnc3Rfb3N4X2F1ZGlvX3NyY19nZXRfY2FwcyAoR3N0QmFzZVNyYyAqIHNyYywgR3N0Q2FwcyAqIGZpbHRlcik7CisKK3N0YXRpYyBHc3RBdWRpb1JpbmdCdWZmZXIgKmdzdF9vc3hfYXVkaW9fc3JjX2NyZWF0ZV9yaW5nYnVmZmVyIChHc3RBdWRpb0Jhc2VTcmMKKyAgICAqIHNyYyk7CitzdGF0aWMgdm9pZCBnc3Rfb3N4X2F1ZGlvX3NyY19vc3hlbGVtZW50X2luaXQgKGdwb2ludGVyIGdfaWZhY2UsCisgICAgZ3BvaW50ZXIgaWZhY2VfZGF0YSk7CitzdGF0aWMgT1NTdGF0dXMgZ3N0X29zeF9hdWRpb19zcmNfaW9fcHJvYyAoR3N0T3N4QXVkaW9SaW5nQnVmZmVyICogYnVmLAorICAgIEF1ZGlvVW5pdFJlbmRlckFjdGlvbkZsYWdzICogaW9BY3Rpb25GbGFncywKKyAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCAqIGluVGltZVN0YW1wLCBVSW50MzIgaW5CdXNOdW1iZXIsCisgICAgVUludDMyIGluTnVtYmVyRnJhbWVzLCBBdWRpb0J1ZmZlckxpc3QgKiBidWZmZXJMaXN0KTsKKworc3RhdGljIHZvaWQKK2dzdF9vc3hfYXVkaW9fc3JjX2RvX2luaXQgKEdUeXBlIHR5cGUpCit7CisgIHN0YXRpYyBjb25zdCBHSW50ZXJmYWNlSW5mbyBvc3hlbGVtZW50X2luZm8gPSB7CisgICAgZ3N0X29zeF9hdWRpb19zcmNfb3N4ZWxlbWVudF9pbml0LAorICAgIE5VTEwsCisgICAgTlVMTAorICB9OworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChvc3hfYXVkaW9zcmNfZGVidWcsICJvc3hhdWRpb3NyYyIsIDAsCisgICAgICAiT1NYIEF1ZGlvIFNyYyIpOworICBnX3R5cGVfYWRkX2ludGVyZmFjZV9zdGF0aWMgKHR5cGUsIEdTVF9PU1hfQVVESU9fRUxFTUVOVF9UWVBFLAorICAgICAgJm9zeGVsZW1lbnRfaW5mbyk7Cit9CisKKyNkZWZpbmUgZ3N0X29zeF9hdWRpb19zcmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdE9zeEF1ZGlvU3JjLCBnc3Rfb3N4X2F1ZGlvX3NyYywKKyAgICBHU1RfVFlQRV9BVURJT19CQVNFX1NSQywgZ3N0X29zeF9hdWRpb19zcmNfZG9faW5pdCAoZ19kZWZpbmVfdHlwZV9pZCkpOworCitzdGF0aWMgdm9pZAorZ3N0X29zeF9hdWRpb19zcmNfY2xhc3NfaW5pdCAoR3N0T3N4QXVkaW9TcmNDbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKyAgR3N0QmFzZVNyY0NsYXNzICpnc3RiYXNlc3JjX2NsYXNzOworICBHc3RBdWRpb0Jhc2VTcmNDbGFzcyAqZ3N0YXVkaW9iYXNlc3JjX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBnc3RlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmFzZXNyY19jbGFzcyA9IChHc3RCYXNlU3JjQ2xhc3MgKikga2xhc3M7CisgIGdzdGF1ZGlvYmFzZXNyY19jbGFzcyA9IChHc3RBdWRpb0Jhc2VTcmNDbGFzcyAqKSBrbGFzczsKKworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3Rfb3N4X2F1ZGlvX3NyY19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9vc3hfYXVkaW9fc3JjX2dldF9wcm9wZXJ0eTsKKworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF9vc3hfYXVkaW9fc3JjX2NoYW5nZV9zdGF0ZSk7CisKKyAgZ3N0YmFzZXNyY19jbGFzcy0+Z2V0X2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zeF9hdWRpb19zcmNfZ2V0X2NhcHMpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIEFSR19ERVZJQ0UsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiZGV2aWNlIiwgIkRldmljZSBJRCIsICJEZXZpY2UgSUQgb2YgaW5wdXQgZGV2aWNlIiwKKyAgICAgICAgICAwLCBHX01BWElOVCwgMCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0YXVkaW9iYXNlc3JjX2NsYXNzLT5jcmVhdGVfcmluZ2J1ZmZlciA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X29zeF9hdWRpb19zcmNfY3JlYXRlX3JpbmdidWZmZXIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChnc3RlbGVtZW50X2NsYXNzLCAmc3JjX2ZhY3RvcnkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGdzdGVsZW1lbnRfY2xhc3MsICJBdWRpbyBTb3VyY2UgKE9TWCkiLAorICAgICAgIlNvdXJjZS9BdWRpbyIsCisgICAgICAiSW5wdXQgZnJvbSBhIHNvdW5kIGNhcmQgaW4gT1MgWCIsCisgICAgICAiWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X2F1ZGlvX3NyY19pbml0IChHc3RPc3hBdWRpb1NyYyAqIHNyYykKK3sKKyAgZ3N0X2Jhc2Vfc3JjX3NldF9saXZlIChHU1RfQkFTRV9TUkMgKHNyYyksIFRSVUUpOworCisgIHNyYy0+ZGV2aWNlX2lkID0ga0F1ZGlvRGV2aWNlVW5rbm93bjsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfYXVkaW9fc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RPc3hBdWRpb1NyYyAqc3JjID0gR1NUX09TWF9BVURJT19TUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBBUkdfREVWSUNFOgorICAgICAgc3JjLT5kZXZpY2VfaWQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfYXVkaW9fc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RPc3hBdWRpb1NyYyAqc3JjID0gR1NUX09TWF9BVURJT19TUkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBBUkdfREVWSUNFOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgc3JjLT5kZXZpY2VfaWQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF9vc3hfYXVkaW9fc3JjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdE9zeEF1ZGlvU3JjICpvc3hzcmMgPSBHU1RfT1NYX0FVRElPX1NSQyAoZWxlbWVudCk7CisgIEdzdE9zeEF1ZGlvUmluZ0J1ZmZlciAqcmluZ2J1ZmZlcjsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkKKyAgICBnb3RvIG91dDsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIC8qIFRoZSBkZXZpY2UgaXMgb3BlbiBub3csIHNvIGZpeCBvdXIgZGV2aWNlX2lkIGlmIGl0IGNoYW5nZWQgKi8KKyAgICAgIHJpbmdidWZmZXIgPQorICAgICAgICAgIEdTVF9PU1hfQVVESU9fUklOR19CVUZGRVIgKEdTVF9BVURJT19CQVNFX1NSQyAob3N4c3JjKS0+cmluZ2J1ZmZlcik7CisgICAgICBpZiAocmluZ2J1ZmZlci0+Y29yZV9hdWRpby0+ZGV2aWNlX2lkICE9IG9zeHNyYy0+ZGV2aWNlX2lkKSB7CisgICAgICAgIG9zeHNyYy0+ZGV2aWNlX2lkID0gcmluZ2J1ZmZlci0+Y29yZV9hdWRpby0+ZGV2aWNlX2lkOworICAgICAgICBnX29iamVjdF9ub3RpZnkgKEdfT0JKRUNUIChvc3hzcmMpLCAiZGV2aWNlIik7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCitvdXQ6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF9vc3hfYXVkaW9fc3JjX2dldF9jYXBzIChHc3RCYXNlU3JjICogc3JjLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RPc3hBdWRpb1NyYyAqb3N4c3JjOworICBHc3RBdWRpb1JpbmdCdWZmZXIgKmJ1ZjsKKyAgR3N0T3N4QXVkaW9SaW5nQnVmZmVyICpvc3hidWY7CisgIEdzdENhcHMgKmNhcHMsICpmaWx0ZXJlZF9jYXBzOworCisgIG9zeHNyYyA9IEdTVF9PU1hfQVVESU9fU1JDIChzcmMpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAob3N4c3JjKTsKKyAgYnVmID0gR1NUX0FVRElPX0JBU0VfU1JDIChzcmMpLT5yaW5nYnVmZmVyOworICBpZiAoYnVmKQorICAgIGdzdF9vYmplY3RfcmVmIChidWYpOworICBHU1RfT0JKRUNUX1VOTE9DSyAob3N4c3JjKTsKKworICBpZiAoIWJ1ZikgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNyYywgIm5vIHJpbmcgYnVmZmVyLCB1c2luZyB0ZW1wbGF0ZSBjYXBzIik7CisgICAgcmV0dXJuIEdTVF9CQVNFX1NSQ19DTEFTUyAocGFyZW50X2NsYXNzKS0+Z2V0X2NhcHMgKHNyYywgZmlsdGVyKTsKKyAgfQorCisgIG9zeGJ1ZiA9IEdTVF9PU1hfQVVESU9fUklOR19CVUZGRVIgKGJ1Zik7CisKKyAgLyogcHJvdGVjdCBhZ2FpbnN0IGNhY2hlZF9jYXBzIGdvaW5nIGF3YXkgKi8KKyAgR1NUX09CSkVDVF9MT0NLIChidWYpOworCisgIGlmIChvc3hidWYtPmNvcmVfYXVkaW8tPmNhY2hlZF9jYXBzX3ZhbGlkKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKHNyYywgIlJldHVybmluZyBjYWNoZWQgY2FwcyIpOworICAgIGNhcHMgPSBnc3RfY2Fwc19yZWYgKG9zeGJ1Zi0+Y29yZV9hdWRpby0+Y2FjaGVkX2NhcHMpOworICB9IGVsc2UgaWYgKGJ1Zi0+b3BlbikgeworICAgIEdzdENhcHMgKnRlbXBsYXRlX2NhcHM7CisKKyAgICAvKiBHZXQgdGVtcGxhdGUgY2FwcyAqLworICAgIHRlbXBsYXRlX2NhcHMgPQorICAgICAgICBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0FVRElPX0JBU0VfU1JDX1BBRCAob3N4c3JjKSk7CisKKyAgICAvKiBEZXZpY2UgaXMgb3BlbiwgbGV0J3MgcHJvYmUgaXRzIGNhcHMgKi8KKyAgICBjYXBzID0gZ3N0X2NvcmVfYXVkaW9fcHJvYmVfY2FwcyAob3N4YnVmLT5jb3JlX2F1ZGlvLCB0ZW1wbGF0ZV9jYXBzKTsKKyAgICBnc3RfY2Fwc19yZXBsYWNlICgmb3N4YnVmLT5jb3JlX2F1ZGlvLT5jYWNoZWRfY2FwcywgY2Fwcyk7CisKKyAgICBnc3RfY2Fwc191bnJlZiAodGVtcGxhdGVfY2Fwcyk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAicmluZyBidWZmZXIgbm90IG9wZW4sIHVzaW5nIHRlbXBsYXRlIGNhcHMiKTsKKyAgICBjYXBzID0gR1NUX0JBU0VfU1JDX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5nZXRfY2FwcyAoc3JjLCBOVUxMKTsKKyAgfQorCisgIEdTVF9PQkpFQ1RfVU5MT0NLIChidWYpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1Zik7CisKKyAgaWYgKCFjYXBzKQorICAgIHJldHVybiBOVUxMOworCisgIGlmICghZmlsdGVyKQorICAgIHJldHVybiBjYXBzOworCisgIC8qIFRha2UgY2FyZSBvZiBmaWx0ZXJlZCBjYXBzICovCisgIGZpbHRlcmVkX2NhcHMgPQorICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgY2FwcywgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICByZXR1cm4gZmlsdGVyZWRfY2FwczsKK30KKworc3RhdGljIEdzdEF1ZGlvUmluZ0J1ZmZlciAqCitnc3Rfb3N4X2F1ZGlvX3NyY19jcmVhdGVfcmluZ2J1ZmZlciAoR3N0QXVkaW9CYXNlU3JjICogc3JjKQoreworICBHc3RPc3hBdWRpb1NyYyAqb3N4c3JjOworICBHc3RPc3hBdWRpb1JpbmdCdWZmZXIgKnJpbmdidWZmZXI7CisKKyAgb3N4c3JjID0gR1NUX09TWF9BVURJT19TUkMgKHNyYyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAob3N4c3JjLCAiQ3JlYXRpbmcgcmluZ2J1ZmZlciIpOworICByaW5nYnVmZmVyID0gZ19vYmplY3RfbmV3IChHU1RfVFlQRV9PU1hfQVVESU9fUklOR19CVUZGRVIsIE5VTEwpOworICBHU1RfREVCVUdfT0JKRUNUIChvc3hzcmMsICJvc3ggc3JjIDB4JXAgZWxlbWVudCAweCVwICBpb3Byb2MgMHglcCIsIG9zeHNyYywKKyAgICAgIEdTVF9PU1hfQVVESU9fRUxFTUVOVF9HRVRfSU5URVJGQUNFIChvc3hzcmMpLAorICAgICAgKHZvaWQgKikgZ3N0X29zeF9hdWRpb19zcmNfaW9fcHJvYyk7CisKKyAgcmluZ2J1ZmZlci0+Y29yZV9hdWRpby0+ZWxlbWVudCA9CisgICAgICBHU1RfT1NYX0FVRElPX0VMRU1FTlRfR0VUX0lOVEVSRkFDRSAob3N4c3JjKTsKKyAgcmluZ2J1ZmZlci0+Y29yZV9hdWRpby0+aXNfc3JjID0gVFJVRTsKKworICAvKiBCeSBkZWZhdWx0IHRoZSBjb3JlYXVkaW8gaW5zdGFuY2UgY3JlYXRlZCBieSB0aGUgcmluZ2J1ZmZlcgorICAgKiBoYXMgZGV2aWNlX2lkPT1rQXVkaW9EZXZpY2VVbmtub3duLiBUaGUgdXNlciBtaWdodCBoYXZlCisgICAqIHNlbGVjdGVkIGEgZGlmZmVyZW50IG9uZSBoZXJlCisgICAqLworICBpZiAocmluZ2J1ZmZlci0+Y29yZV9hdWRpby0+ZGV2aWNlX2lkICE9IG9zeHNyYy0+ZGV2aWNlX2lkKQorICAgIHJpbmdidWZmZXItPmNvcmVfYXVkaW8tPmRldmljZV9pZCA9IG9zeHNyYy0+ZGV2aWNlX2lkOworCisgIHJldHVybiBHU1RfQVVESU9fUklOR19CVUZGRVIgKHJpbmdidWZmZXIpOworfQorCitzdGF0aWMgT1NTdGF0dXMKK2dzdF9vc3hfYXVkaW9fc3JjX2lvX3Byb2MgKEdzdE9zeEF1ZGlvUmluZ0J1ZmZlciAqIGJ1ZiwKKyAgICBBdWRpb1VuaXRSZW5kZXJBY3Rpb25GbGFncyAqIGlvQWN0aW9uRmxhZ3MsCisgICAgY29uc3QgQXVkaW9UaW1lU3RhbXAgKiBpblRpbWVTdGFtcCwKKyAgICBVSW50MzIgaW5CdXNOdW1iZXIsIFVJbnQzMiBpbk51bWJlckZyYW1lcywgQXVkaW9CdWZmZXJMaXN0ICogYnVmZmVyTGlzdCkKK3sKKyAgT1NTdGF0dXMgc3RhdHVzOworICBndWludDggKndyaXRlcHRyOworICBnaW50IHdyaXRlc2VnOworICBnaW50IGxlbjsKKyAgZ2ludCByZW1haW5pbmc7CisgIFVJbnQzMiBuOworICBnaW50IG9mZnNldCA9IDA7CisKKyAgLyogUHJldmlvdXMgaW52b2tlIG9mIEF1ZGlvVW5pdFJlbmRlciBjaGFuZ2VkIG1EYXRhQnl0ZVNpemUgaW50bworICAgKiBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZC4gUmVzZXQgdGhlIG1lbWJlcnMuICovCisgIGZvciAobiA9IDA7IG4gPCBidWYtPmNvcmVfYXVkaW8tPnJlY0J1ZmZlckxpc3QtPm1OdW1iZXJCdWZmZXJzOyArK24pIHsKKyAgICBidWYtPmNvcmVfYXVkaW8tPnJlY0J1ZmZlckxpc3QtPm1CdWZmZXJzW25dLm1EYXRhQnl0ZVNpemUgPQorICAgICAgICBidWYtPmNvcmVfYXVkaW8tPnJlY0J1ZmZlclNpemU7CisgIH0KKworICBzdGF0dXMgPSBBdWRpb1VuaXRSZW5kZXIgKGJ1Zi0+Y29yZV9hdWRpby0+YXVkaW91bml0LCBpb0FjdGlvbkZsYWdzLAorICAgICAgaW5UaW1lU3RhbXAsIGluQnVzTnVtYmVyLCBpbk51bWJlckZyYW1lcywgYnVmLT5jb3JlX2F1ZGlvLT5yZWNCdWZmZXJMaXN0KTsKKworICBpZiAoc3RhdHVzKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChidWYsICJBdWRpb1VuaXRSZW5kZXIgcmV0dXJuZWQgJWQiLCAoaW50KSBzdGF0dXMpOworICAgIHJldHVybiBzdGF0dXM7CisgIH0KKworICAvKiBUT0RPOiBUbyBzdXBwb3J0IG5vbi1pbnRlcmxlYXZlZCBhdWRpbywgZ28gb3ZlciBhbGwgbUJ1ZmZlcnMsCisgICAqICAgICAgIG5vdCBqdXN0IHRoZSBmaXJzdCBvbmUuICovCisKKyAgcmVtYWluaW5nID0gYnVmLT5jb3JlX2F1ZGlvLT5yZWNCdWZmZXJMaXN0LT5tQnVmZmVyc1swXS5tRGF0YUJ5dGVTaXplOworCisgIHdoaWxlIChyZW1haW5pbmcpIHsKKyAgICBpZiAoIWdzdF9hdWRpb19yaW5nX2J1ZmZlcl9wcmVwYXJlX3JlYWQgKEdTVF9BVURJT19SSU5HX0JVRkZFUiAoYnVmKSwKKyAgICAgICAgICAgICZ3cml0ZXNlZywgJndyaXRlcHRyLCAmbGVuKSkKKyAgICAgIHJldHVybiAwOworCisgICAgbGVuIC09IGJ1Zi0+c2Vnb2Zmc2V0OworCisgICAgaWYgKGxlbiA+IHJlbWFpbmluZykKKyAgICAgIGxlbiA9IHJlbWFpbmluZzsKKworICAgIG1lbWNweSAod3JpdGVwdHIgKyBidWYtPnNlZ29mZnNldCwKKyAgICAgICAgKGNoYXIgKikgYnVmLT5jb3JlX2F1ZGlvLT5yZWNCdWZmZXJMaXN0LT5tQnVmZmVyc1swXS5tRGF0YSArIG9mZnNldCwKKyAgICAgICAgbGVuKTsKKworICAgIGJ1Zi0+c2Vnb2Zmc2V0ICs9IGxlbjsKKyAgICBvZmZzZXQgKz0gbGVuOworICAgIHJlbWFpbmluZyAtPSBsZW47CisKKyAgICBpZiAoKGdpbnQpIGJ1Zi0+c2Vnb2Zmc2V0ID09IEdTVF9BVURJT19SSU5HX0JVRkZFUiAoYnVmKS0+c3BlYy5zZWdzaXplKSB7CisgICAgICAvKiB3ZSB3cm90ZSBvbmUgc2VnbWVudCAqLworICAgICAgZ3N0X2F1ZGlvX3JpbmdfYnVmZmVyX2FkdmFuY2UgKEdTVF9BVURJT19SSU5HX0JVRkZFUiAoYnVmKSwgMSk7CisKKyAgICAgIGJ1Zi0+c2Vnb2Zmc2V0ID0gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X2F1ZGlvX3NyY19vc3hlbGVtZW50X2luaXQgKGdwb2ludGVyIGdfaWZhY2UsIGdwb2ludGVyIGlmYWNlX2RhdGEpCit7CisgIEdzdE9zeEF1ZGlvRWxlbWVudEludGVyZmFjZSAqaWZhY2UgPSAoR3N0T3N4QXVkaW9FbGVtZW50SW50ZXJmYWNlICopIGdfaWZhY2U7CisKKyAgaWZhY2UtPmlvX3Byb2MgPSAoQVVSZW5kZXJDYWxsYmFjaykgZ3N0X29zeF9hdWRpb19zcmNfaW9fcHJvYzsKK30KZGlmZiAtLWdpdCBhL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5oIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGF1ZGlvc3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ4MjViMAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3hhdWRpby9nc3Rvc3hhdWRpb3NyYy5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xICh0aGUgIkxHUEwiKSwgaW4KKyAqIHdoaWNoIGNhc2UgdGhlIGZvbGxvd2luZyBwcm92aXNpb25zIGFwcGx5IGluc3RlYWQgb2YgdGhlIG9uZXMKKyAqIG1lbnRpb25lZCBhYm92ZToKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX09TWEFVRElPU1JDX0hfXworI2RlZmluZSBfX0dTVF9PU1hBVURJT1NSQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vZ3N0YXVkaW9iYXNlc3JjLmg+CisjaW5jbHVkZSAiZ3N0b3N4YXVkaW9yaW5nYnVmZmVyLmgiCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfT1NYX0FVRElPX1NSQ19DQVBTICJhdWRpby94LXJhdywgIiBcCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19GT1JNQVRTX0FMTCAiLCAiIFwKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiIFwKKyAgICAgICAgInJhdGUgPSAoaW50KSBbMSwgTUFYXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbMSwgTUFYXSIKKworI2RlZmluZSBHU1RfVFlQRV9PU1hfQVVESU9fU1JDIFwKKyAgKGdzdF9vc3hfYXVkaW9fc3JjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9PU1hfQVVESU9fU1JDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfT1NYX0FVRElPX1NSQyxHc3RPc3hBdWRpb1NyYykpCisjZGVmaW5lIEdTVF9PU1hfQVVESU9fU1JDX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX09TWF9BVURJT19TUkMsR3N0T3N4QXVkaW9TcmNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19PU1hfQVVESU9fU1JDKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfT1NYX0FVRElPX1NSQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RPc3hBdWRpb1NyYyBHc3RPc3hBdWRpb1NyYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RPc3hBdWRpb1NyY0NsYXNzIEdzdE9zeEF1ZGlvU3JjQ2xhc3M7CisKK3N0cnVjdCBfR3N0T3N4QXVkaW9TcmMKK3sKKyAgR3N0QXVkaW9CYXNlU3JjIHNyYzsKKworICBBdWRpb0RldmljZUlEIGRldmljZV9pZDsKK307CisKK3N0cnVjdCBfR3N0T3N4QXVkaW9TcmNDbGFzcworeworICBHc3RBdWRpb0Jhc2VTcmNDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3Rfb3N4X2F1ZGlvX3NyY19nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9PU1hBVURJT1NSQ19IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYyBiL3N5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDNiODgyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5jCkBAIC0wLDAgKzEsNjc2IEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBGbHVlbmRvIFMuQS4gPHN1cHBvcnRAZmx1ZW5kby5jb20+CisgKiAgIEF1dGhvcnM6IEpvc2VwIFRvcnJhIFZhbGzDqHMgPGpvc2VwQGZsdWVuZG8uY29tPgorICogICAgICAgICAgICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiZ3N0b3N4Y29yZWF1ZGlvLmgiCisjaW5jbHVkZSAiZ3N0b3N4Y29yZWF1ZGlvY29tbW9uLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKG9zeF9hdWRpb19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBvc3hfYXVkaW9fZGVidWcKKworR19ERUZJTkVfVFlQRSAoR3N0Q29yZUF1ZGlvLCBnc3RfY29yZV9hdWRpbywgR19UWVBFX09CSkVDVCk7CisKKyNpZmRlZiBIQVZFX0lPUworI2luY2x1ZGUgImdzdG9zeGNvcmVhdWRpb3JlbW90ZWlvLmMiCisjZWxzZQorI2luY2x1ZGUgImdzdG9zeGNvcmVhdWRpb2hhbC5jIgorI2VuZGlmCisKKworc3RhdGljIHZvaWQKK2dzdF9jb3JlX2F1ZGlvX2NsYXNzX2luaXQgKEdzdENvcmVBdWRpb0NsYXNzICoga2xhc3MpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfY29yZV9hdWRpb19pbml0IChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBjb3JlX2F1ZGlvLT5pc19wYXNzdGhyb3VnaCA9IEZBTFNFOworICBjb3JlX2F1ZGlvLT5kZXZpY2VfaWQgPSBrQXVkaW9EZXZpY2VVbmtub3duOworICBjb3JlX2F1ZGlvLT5pc19zcmMgPSBGQUxTRTsKKyAgY29yZV9hdWRpby0+YXVkaW91bml0ID0gTlVMTDsKKyAgY29yZV9hdWRpby0+Y2FjaGVkX2NhcHMgPSBOVUxMOworICBjb3JlX2F1ZGlvLT5jYWNoZWRfY2Fwc192YWxpZCA9IEZBTFNFOworI2lmbmRlZiBIQVZFX0lPUworICBjb3JlX2F1ZGlvLT5ob2dfcGlkID0gLTE7CisgIGNvcmVfYXVkaW8tPmRpc2FibGVkX21peGluZyA9IEZBTFNFOworI2VuZGlmCit9CisKK3N0YXRpYyBnYm9vbGVhbgorX2lzX291dGVyX3Njb3BlIChBdWRpb1VuaXRTY29wZSBzY29wZSwgQXVkaW9Vbml0RWxlbWVudCBlbGVtZW50KQoreworICByZXR1cm4KKyAgICAgIChzY29wZSA9PSBrQXVkaW9Vbml0U2NvcGVfSW5wdXQgJiYgZWxlbWVudCA9PSAxKSB8fAorICAgICAgKHNjb3BlID09IGtBdWRpb1VuaXRTY29wZV9PdXRwdXQgJiYgZWxlbWVudCA9PSAwKTsKK30KKworc3RhdGljIHZvaWQKK19hdWRpb191bml0X3Byb3BlcnR5X2xpc3RlbmVyICh2b2lkICppblJlZkNvbiwgQXVkaW9Vbml0IGluVW5pdCwKKyAgICBBdWRpb1VuaXRQcm9wZXJ0eUlEIGluSUQsIEF1ZGlvVW5pdFNjb3BlIGluU2NvcGUsCisgICAgQXVkaW9Vbml0RWxlbWVudCBpbkVsZW1lbnQpCit7CisgIEdzdENvcmVBdWRpbyAqY29yZV9hdWRpbzsKKworICBjb3JlX2F1ZGlvID0gR1NUX0NPUkVfQVVESU8gKGluUmVmQ29uKTsKKyAgZ19hc3NlcnQgKGluVW5pdCA9PSBjb3JlX2F1ZGlvLT5hdWRpb3VuaXQpOworCisgIHN3aXRjaCAoaW5JRCkgeworICAgIGNhc2Uga0F1ZGlvVW5pdFByb3BlcnR5X0F1ZGlvQ2hhbm5lbExheW91dDoKKyAgICBjYXNlIGtBdWRpb1VuaXRQcm9wZXJ0eV9TdHJlYW1Gb3JtYXQ6CisgICAgICBpZiAoX2lzX291dGVyX3Njb3BlIChpblNjb3BlLCBpbkVsZW1lbnQpKSB7CisgICAgICAgIC8qIFdlIGRvbid0IHB1c2ggZ3N0X2V2ZW50X25ld19jYXBzIGhlcmUgKGZvciBzcmMpLAorICAgICAgICAgKiBub3IgZ3N0X2V2ZW50X25ld19yZWNvbmZpZ3VyZSAoZm9yIHNpbmspLCBzaW5jZSBDb3JlIEF1ZGlvIGNvbnRpbnVlcworICAgICAgICAgKiB0byBoYXBwaWx5IGZ1bmN0aW9uIHdpdGggdGhlIG9sZCBmb3JtYXQsIGRvaW5nIGNvbnZlcnNpb24vcmVzYW1wbGluZworICAgICAgICAgKiBhcyBuZWVkZWQuCisgICAgICAgICAqIFRoaXMgbWVyZWx5ICJyZWZyZXNoZXMiIG91ciBQUkVGRVJSRUQgY2Fwcy4gKi8KKworICAgICAgICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBlaXRoZXIgZnJvbSBhIENvcmUgQXVkaW8gdGhyZWFkCisgICAgICAgICAqIG9yIGFzIGEgcmVzdWx0IG9mIGEgQ29yZSBBdWRpbyBBUEkgKGUuZy4gQXVkaW9Vbml0SW5pdGlhbGl6ZSkKKyAgICAgICAgICogZnJvbSBvdXIgb3duIHRocmVhZC4gSW4gdGhlIGxhdHRlciBjYXNlLCBvc3hidWYgY2FuIGJlCisgICAgICAgICAqIGFscmVhZHkgbG9ja2VkIChHU3RyZWFtZXIncyBtdXRleCBpcyBub3QgcmVjdXJzaXZlKS4KKyAgICAgICAgICogRm9yIHRoaXMgcmVhc29uIHdlIHVzZSBhIGJvb2xlYW4gZmxhZyBpbnN0ZWFkIG9mIG51bGxpZnlpbmcKKyAgICAgICAgICogY2FjaGVkX2NhcHMuICovCisgICAgICAgIGNvcmVfYXVkaW8tPmNhY2hlZF9jYXBzX3ZhbGlkID0gRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgIFB1YmxpYyBBUEkgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0dzdENvcmVBdWRpbyAqCitnc3RfY29yZV9hdWRpb19uZXcgKEdzdE9iamVjdCAqIG9zeGJ1ZikKK3sKKyAgR3N0Q29yZUF1ZGlvICpjb3JlX2F1ZGlvOworCisgIGNvcmVfYXVkaW8gPSBnX29iamVjdF9uZXcgKEdTVF9UWVBFX0NPUkVfQVVESU8sIE5VTEwpOworICBjb3JlX2F1ZGlvLT5vc3hidWYgPSBvc3hidWY7CisgIGNvcmVfYXVkaW8tPmNhY2hlZF9jYXBzID0gTlVMTDsKKyAgcmV0dXJuIGNvcmVfYXVkaW87Cit9CisKK2dib29sZWFuCitnc3RfY29yZV9hdWRpb19jbG9zZSAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbykKK3sKKyAgT1NTdGF0dXMgc3RhdHVzOworCisgIC8qIFVuaW5pdGlhbGl6ZSB0aGUgQXVkaW9Vbml0ICovCisgIHN0YXR1cyA9IEF1ZGlvVW5pdFVuaW5pdGlhbGl6ZSAoY29yZV9hdWRpby0+YXVkaW91bml0KTsKKyAgaWYgKHN0YXR1cykgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvcmVfYXVkaW8sICJGYWlsZWQgdG8gdW5pbml0aWFsaXplIEF1ZGlvVW5pdDogJWQiLAorICAgICAgICAoaW50KSBzdGF0dXMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIEF1ZGlvVW5pdFJlbW92ZVByb3BlcnR5TGlzdGVuZXJXaXRoVXNlckRhdGEgKGNvcmVfYXVkaW8tPmF1ZGlvdW5pdCwKKyAgICAgIGtBdWRpb1VuaXRQcm9wZXJ0eV9BdWRpb0NoYW5uZWxMYXlvdXQsIF9hdWRpb191bml0X3Byb3BlcnR5X2xpc3RlbmVyLAorICAgICAgY29yZV9hdWRpbyk7CisgIEF1ZGlvVW5pdFJlbW92ZVByb3BlcnR5TGlzdGVuZXJXaXRoVXNlckRhdGEgKGNvcmVfYXVkaW8tPmF1ZGlvdW5pdCwKKyAgICAgIGtBdWRpb1VuaXRQcm9wZXJ0eV9TdHJlYW1Gb3JtYXQsIF9hdWRpb191bml0X3Byb3BlcnR5X2xpc3RlbmVyLAorICAgICAgY29yZV9hdWRpbyk7CisKKyAgLyogY29yZV9hdWRpby0+b3N4YnVmIGlzIGFscmVhZHkgbG9ja2VkIGF0IHRoaXMgcG9pbnQgKi8KKyAgY29yZV9hdWRpby0+Y2FjaGVkX2NhcHNfdmFsaWQgPSBGQUxTRTsKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJmNvcmVfYXVkaW8tPmNhY2hlZF9jYXBzLCBOVUxMKTsKKworICBBdWRpb0NvbXBvbmVudEluc3RhbmNlRGlzcG9zZSAoY29yZV9hdWRpby0+YXVkaW91bml0KTsKKyAgY29yZV9hdWRpby0+YXVkaW91bml0ID0gTlVMTDsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitnc3RfY29yZV9hdWRpb19vcGVuIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBPU1N0YXR1cyBzdGF0dXM7CisKKyAgLyogY29yZV9hdWRpby0+b3N4YnVmIGlzIGFscmVhZHkgbG9ja2VkIGF0IHRoaXMgcG9pbnQgKi8KKyAgY29yZV9hdWRpby0+Y2FjaGVkX2NhcHNfdmFsaWQgPSBGQUxTRTsKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJmNvcmVfYXVkaW8tPmNhY2hlZF9jYXBzLCBOVUxMKTsKKworICBpZiAoIWdzdF9jb3JlX2F1ZGlvX29wZW5faW1wbCAoY29yZV9hdWRpbykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIEFkZCBwcm9wZXJ0eSBsaXN0ZW5lciAqLworICBzdGF0dXMgPSBBdWRpb1VuaXRBZGRQcm9wZXJ0eUxpc3RlbmVyIChjb3JlX2F1ZGlvLT5hdWRpb3VuaXQsCisgICAgICBrQXVkaW9Vbml0UHJvcGVydHlfQXVkaW9DaGFubmVsTGF5b3V0LCBfYXVkaW9fdW5pdF9wcm9wZXJ0eV9saXN0ZW5lciwKKyAgICAgIGNvcmVfYXVkaW8pOworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoY29yZV9hdWRpbywgIkZhaWxlZCB0byBhZGQgYXVkaW8gY2hhbm5lbCBsYXlvdXQgcHJvcGVydHkgIgorICAgICAgICAibGlzdGVuZXIgZm9yIEF1ZGlvVW5pdDogJWQiLCAoaW50KSBzdGF0dXMpOworICB9CisgIHN0YXR1cyA9IEF1ZGlvVW5pdEFkZFByb3BlcnR5TGlzdGVuZXIgKGNvcmVfYXVkaW8tPmF1ZGlvdW5pdCwKKyAgICAgIGtBdWRpb1VuaXRQcm9wZXJ0eV9TdHJlYW1Gb3JtYXQsIF9hdWRpb191bml0X3Byb3BlcnR5X2xpc3RlbmVyLAorICAgICAgY29yZV9hdWRpbyk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChjb3JlX2F1ZGlvLCAiRmFpbGVkIHRvIGFkZCBzdHJlYW0gZm9ybWF0IHByb3BlcnR5ICIKKyAgICAgICAgImxpc3RlbmVyIGZvciBBdWRpb1VuaXQ6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgdGhlIEF1ZGlvVW5pdC4gV2Uga2VlcCB0aGUgYXVkaW8gdW5pdCBpbml0aWFsaXplZCBlYXJseSBzbyB0aGF0CisgICAqIHdlIGNhbiBwcm9iZSB0aGUgdW5kZXJseWluZyBkZXZpY2UuICovCisgIHN0YXR1cyA9IEF1ZGlvVW5pdEluaXRpYWxpemUgKGNvcmVfYXVkaW8tPmF1ZGlvdW5pdCk7CisgIGlmIChzdGF0dXMpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChjb3JlX2F1ZGlvLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgQXVkaW9Vbml0OiAlZCIsCisgICAgICAgIChpbnQpIHN0YXR1cyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitnc3RfY29yZV9hdWRpb19zdGFydF9wcm9jZXNzaW5nIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICByZXR1cm4gZ3N0X2NvcmVfYXVkaW9fc3RhcnRfcHJvY2Vzc2luZ19pbXBsIChjb3JlX2F1ZGlvKTsKK30KKworZ2Jvb2xlYW4KK2dzdF9jb3JlX2F1ZGlvX3BhdXNlX3Byb2Nlc3NpbmcgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIHJldHVybiBnc3RfY29yZV9hdWRpb19wYXVzZV9wcm9jZXNzaW5nX2ltcGwgKGNvcmVfYXVkaW8pOworfQorCitnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9fc3RvcF9wcm9jZXNzaW5nIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICByZXR1cm4gZ3N0X2NvcmVfYXVkaW9fc3RvcF9wcm9jZXNzaW5nX2ltcGwgKGNvcmVfYXVkaW8pOworfQorCitnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9fZ2V0X3NhbXBsZXNfYW5kX2xhdGVuY3kgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8sCisgICAgZ2RvdWJsZSByYXRlLCBndWludCAqIHNhbXBsZXMsIGdkb3VibGUgKiBsYXRlbmN5KQoreworICByZXR1cm4gZ3N0X2NvcmVfYXVkaW9fZ2V0X3NhbXBsZXNfYW5kX2xhdGVuY3lfaW1wbCAoY29yZV9hdWRpbywgcmF0ZSwKKyAgICAgIHNhbXBsZXMsIGxhdGVuY3kpOworfQorCitnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9faW5pdGlhbGl6ZSAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbywKKyAgICBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gZm9ybWF0LCBHc3RDYXBzICogY2FwcywgZ2Jvb2xlYW4gaXNfcGFzc3Rocm91Z2gpCit7CisgIGd1aW50MzIgZnJhbWVfc2l6ZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChjb3JlX2F1ZGlvLAorICAgICAgIkluaXRpYWxpemluZzogcGFzc3Rocm91Z2g6JWQgY2FwczolIiBHU1RfUFRSX0ZPUk1BVCwgaXNfcGFzc3Rocm91Z2gsCisgICAgICBjYXBzKTsKKworICBpZiAoIWdzdF9jb3JlX2F1ZGlvX2luaXRpYWxpemVfaW1wbCAoY29yZV9hdWRpbywgZm9ybWF0LCBjYXBzLAorICAgICAgICAgIGlzX3Bhc3N0aHJvdWdoLCAmZnJhbWVfc2l6ZSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoY29yZV9hdWRpby0+aXNfc3JjKSB7CisgICAgLyogY3JlYXRlIEF1ZGlvQnVmZmVyTGlzdCBuZWVkZWQgZm9yIHJlY29yZGluZyAqLworICAgIGNvcmVfYXVkaW8tPnJlY0J1ZmZlclNpemUgPSBmcmFtZV9zaXplICogZm9ybWF0Lm1CeXRlc1BlckZyYW1lOworICAgIGNvcmVfYXVkaW8tPnJlY0J1ZmZlckxpc3QgPQorICAgICAgICBidWZmZXJfbGlzdF9hbGxvYyAoZm9ybWF0Lm1DaGFubmVsc1BlckZyYW1lLCBjb3JlX2F1ZGlvLT5yZWNCdWZmZXJTaXplLAorICAgICAgICAvKiBDdXJyZW50bHkgYWx3YXlzIFRSVUUgKGkuZS4gaW50ZXJsZWF2ZWQpICovCisgICAgICAgICEoZm9ybWF0Lm1Gb3JtYXRGbGFncyAmIGtBdWRpb0Zvcm1hdEZsYWdJc05vbkludGVybGVhdmVkKSk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorZ3N0X2NvcmVfYXVkaW9fdW5pbml0aWFsaXplIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBidWZmZXJfbGlzdF9mcmVlIChjb3JlX2F1ZGlvLT5yZWNCdWZmZXJMaXN0KTsKKyAgY29yZV9hdWRpby0+cmVjQnVmZmVyTGlzdCA9IE5VTEw7Cit9CisKK3ZvaWQKK2dzdF9jb3JlX2F1ZGlvX3NldF92b2x1bWUgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8sIGdmbG9hdCB2b2x1bWUpCit7CisgIEF1ZGlvVW5pdFNldFBhcmFtZXRlciAoY29yZV9hdWRpby0+YXVkaW91bml0LCBrSEFMT3V0cHV0UGFyYW1fVm9sdW1lLAorICAgICAga0F1ZGlvVW5pdFNjb3BlX0dsb2JhbCwgMCwgKGZsb2F0KSB2b2x1bWUsIDApOworfQorCitnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9fc2VsZWN0X2RldmljZSAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbykKK3sKKyAgcmV0dXJuIGdzdF9jb3JlX2F1ZGlvX3NlbGVjdF9kZXZpY2VfaW1wbCAoY29yZV9hdWRpbyk7Cit9CisKK3ZvaWQKK2dzdF9jb3JlX2F1ZGlvX2luaXRfZGVidWcgKHZvaWQpCit7CisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChvc3hfYXVkaW9fZGVidWcsICJvc3hhdWRpbyIsIDAsCisgICAgICAiT1NYIEF1ZGlvIEVsZW1lbnRzIik7Cit9CisKK2dib29sZWFuCitnc3RfY29yZV9hdWRpb19hdWRpb19kZXZpY2VfaXNfc3BkaWZfYXZhaWwgKEF1ZGlvRGV2aWNlSUQgZGV2aWNlX2lkKQoreworICByZXR1cm4gZ3N0X2NvcmVfYXVkaW9fYXVkaW9fZGV2aWNlX2lzX3NwZGlmX2F2YWlsX2ltcGwgKGRldmljZV9pZCk7Cit9CisKKy8qIERvZXMgdGhlIGNoYW5uZWwgaGF2ZSBhdCBsZWFzdCBvbmUgcG9zaXRpb25lZCBjaGFubmVsPworICogKEdTdHJlYW1lciBpcyBtb3JlIHN0cmljdCB0aGFuIENvcmUgQXVkaW8sIGluIHRoYXQgaXQgcmVxdWlyZXMgZWl0aGVyCisgKiBhbGwgY2hhbm5lbHMgdG8gYmUgcG9zaXRpb25lZCwgb3IgYWxsIHVucG9zaXRpb25lZC4pICovCitzdGF0aWMgZ2Jvb2xlYW4KK19pc19jb3JlX2F1ZGlvX2xheW91dF9wb3NpdGlvbmVkIChBdWRpb0NoYW5uZWxMYXlvdXQgKiBsYXlvdXQpCit7CisgIGd1aW50IGk7CisKKyAgZ19hc3NlcnQgKGxheW91dC0+bUNoYW5uZWxMYXlvdXRUYWcgPT0KKyAgICAgIGtBdWRpb0NoYW5uZWxMYXlvdXRUYWdfVXNlQ2hhbm5lbERlc2NyaXB0aW9ucyk7CisKKyAgZm9yIChpID0gMDsgaSA8IGxheW91dC0+bU51bWJlckNoYW5uZWxEZXNjcmlwdGlvbnM7ICsraSkgeworICAgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHAgPQorICAgICAgICBnc3RfY29yZV9hdWRpb19jaGFubmVsX2xhYmVsX3RvX2dzdAorICAgICAgICAobGF5b3V0LT5tQ2hhbm5lbERlc2NyaXB0aW9uc1tpXS5tQ2hhbm5lbExhYmVsLCBpLCBGQUxTRSk7CisKKyAgICBpZiAocCA+PSAwKSAgICAgICAgICAgICAgICAgLyogbm90IHNwZWNpYWwgcG9zaXRpdGlvbiAqLworICAgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitfY29yZV9hdWRpb19wYXJzZV9jaGFubmVsX2Rlc2NyaXB0aW9ucyAoQXVkaW9DaGFubmVsTGF5b3V0ICogbGF5b3V0LAorICAgIGd1aW50ICogY2hhbm5lbHMsIGd1aW50NjQgKiBjaGFubmVsX21hc2ssIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICogcG9zKQoreworICBnYm9vbGVhbiBwb3NpdGlvbmVkOworICBndWludCBpOworCisgIGdfYXNzZXJ0IChsYXlvdXQtPm1DaGFubmVsTGF5b3V0VGFnID09CisgICAgICBrQXVkaW9DaGFubmVsTGF5b3V0VGFnX1VzZUNoYW5uZWxEZXNjcmlwdGlvbnMpOworCisgIHBvc2l0aW9uZWQgPSBfaXNfY29yZV9hdWRpb19sYXlvdXRfcG9zaXRpb25lZCAobGF5b3V0KTsKKyAgKmNoYW5uZWxfbWFzayA9IDA7CisKKyAgLyogR28gb3ZlciBhbGwgbGFiZWxzLCBlaXRoZXIgdGFraW5nIG9ubHkgcG9zaXRpb25lZCBvciBvbmx5CisgICAqIHVucG9zaXRpb25lZCBjaGFubmVscywgdXAgdG8gR1NUX09TWF9BVURJT19NQVhfQ0hBTk5FTCBjaGFubmVscy4KKyAgICoKKyAgICogVGhlIHJlc3VsdGluZyAncG9zJyBhcnJheSB3aWxsIGNvbnRhaW4gZWl0aGVyOgorICAgKiAgLSBvbmx5IHJlZ3VsYXIgKD49IDApIHBvc2l0aW9ucworICAgKiAgLSBvbmx5IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX05PTkUgcG9zaXRpb25zCisgICAqIGluIGEgY29tcGFjdCBmb3JtLCBza2lwcGluZyBvdmVyIGFsbCB1bnN1cHBvcnRlZCBwb3NpdGlvbnMuCisgICAqLworICAqY2hhbm5lbHMgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgbGF5b3V0LT5tTnVtYmVyQ2hhbm5lbERlc2NyaXB0aW9uczsgKytpKSB7CisgICAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcCA9CisgICAgICAgIGdzdF9jb3JlX2F1ZGlvX2NoYW5uZWxfbGFiZWxfdG9fZ3N0CisgICAgICAgIChsYXlvdXQtPm1DaGFubmVsRGVzY3JpcHRpb25zW2ldLm1DaGFubmVsTGFiZWwsIGksIFRSVUUpOworCisgICAgLyogSW4gcG9zaXRpb25lZCBsYXlvdXRzLCBza2lwIGFsbCB1bnBvc2l0aW9uZWQgY2hhbm5lbHMuCisgICAgICogSW4gdW5wb3NpdGlvbmVkIGxheW91dHMsIHNraXAgYWxsIGludmFsaWQgY2hhbm5lbHMuICovCisgICAgaWYgKChwb3NpdGlvbmVkICYmIHAgPj0gMCkgfHwKKyAgICAgICAgKCFwb3NpdGlvbmVkICYmIHAgPT0gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORSkpIHsKKworICAgICAgaWYgKHBvcykKKyAgICAgICAgcG9zWypjaGFubmVsc10gPSBwOworICAgICAgKmNoYW5uZWxfbWFzayB8PSBHX0dVSU5UNjRfQ09OU1RBTlQgKDEpIDw8IHA7CisgICAgICArKygqY2hhbm5lbHMpOworCisgICAgICBpZiAoKmNoYW5uZWxzID09IEdTVF9PU1hfQVVESU9fTUFYX0NIQU5ORUwpCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIG5vdCB0byBvdmVyZmxvdyAqLworICAgIH0KKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9fcGFyc2VfY2hhbm5lbF9sYXlvdXQgKEF1ZGlvQ2hhbm5lbExheW91dCAqIGxheW91dCwKKyAgICBndWludCAqIGNoYW5uZWxzLCBndWludDY0ICogY2hhbm5lbF9tYXNrLCBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiAqIHBvcykKK3sKKyAgZ19hc3NlcnQgKGNoYW5uZWxzICE9IE5VTEwpOworICBnX2Fzc2VydCAoY2hhbm5lbF9tYXNrICE9IE5VTEwpOworICBnX2Fzc2VydCAobGF5b3V0ICE9IE5VTEwpOworCisgIGlmIChsYXlvdXQtPm1DaGFubmVsTGF5b3V0VGFnICE9CisgICAgICBrQXVkaW9DaGFubmVsTGF5b3V0VGFnX1VzZUNoYW5uZWxEZXNjcmlwdGlvbnMpIHsKKyAgICBHU1RfRVJST1IKKyAgICAgICAgKCJPbmx5IGtBdWRpb0NoYW5uZWxMYXlvdXRUYWdfVXNlQ2hhbm5lbERlc2NyaXB0aW9ucyBpcyBzdXBwb3J0ZWQuIik7CisgICAgKmNoYW5uZWxzID0gMDsKKyAgICAqY2hhbm5lbF9tYXNrID0gMDsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBzd2l0Y2ggKGxheW91dC0+bU51bWJlckNoYW5uZWxEZXNjcmlwdGlvbnMpIHsKKyAgICBjYXNlIDA6CisgICAgICBpZiAocG9zKQorICAgICAgICBwb3NbMF0gPSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FOworICAgICAgKmNoYW5uZWxzID0gMDsKKyAgICAgICpjaGFubmVsX21hc2sgPSAwOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgY2FzZSAxOgorICAgICAgaWYgKHBvcykKKyAgICAgICAgcG9zWzBdID0gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTU9OTzsKKyAgICAgICpjaGFubmVscyA9IDE7CisgICAgICAqY2hhbm5lbF9tYXNrID0gMDsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgMjoKKyAgICAgIGlmIChwb3MpIHsKKyAgICAgICAgcG9zWzBdID0gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVDsKKyAgICAgICAgcG9zWzFdID0gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQ7CisgICAgICB9CisgICAgICAqY2hhbm5lbHMgPSAyOworICAgICAgKmNoYW5uZWxfbWFzayA9CisgICAgICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTUFTSyAoRlJPTlRfTEVGVCkgfAorICAgICAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX01BU0sgKEZST05UX1JJR0hUKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGRlZmF1bHQ6CisgICAgICBfY29yZV9hdWRpb19wYXJzZV9jaGFubmVsX2Rlc2NyaXB0aW9ucyAobGF5b3V0LCBjaGFubmVscywgY2hhbm5lbF9tYXNrLAorICAgICAgICAgIHBvcyk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgfQorfQorCisvKiBDb252ZXJ0cyBhbiBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gdG8gcHJlZmVycmVkIGNhcHMuCisgKgorICogVGhlc2UgY2FwcyB3aWxsIGluZGljYXRlIHRoZSBBVSBlbGVtZW50J3MgY2Fub25pY2FsIGZvcm1hdCwgd2hpY2ggd29uJ3QKKyAqIG1ha2UgQ29yZSBBdWRpbyByZXNhbXBsZSBub3IgY29udmVydC4KKyAqCisgKiBOT1RFIE9OIE1VTFRJLUNIQU5ORUwgQVVESU86CisgKgorICogSWYgbGF5b3V0IGlzIG5vdCBOVUxMLCByZXN1bHRpbmcgY2FwcyB3aWxsIG9ubHkgaW5jbHVkZSB0aGUgc3Vic2V0CisgKiBvZiBjaGFubmVscyBzdXBwb3J0ZWQgYnkgR1N0cmVhbWVyLiBJZiB0aGUgQ29yZSBBdWRpbyBsYXlvdXQgY29udGFpbmVkCisgKiBBTlkgcG9zaXRpb25lZCBjaGFubmVscywgdGhlbiBPTkxZIHBvc2l0aW9uZWQgY2hhbm5lbHMgd2lsbCBiZSBpbmNsdWRlZAorICogaW4gdGhlIHJlc3VsdGluZyBjYXBzLiBPdGhlcndpc2UsIHJlc3VsdGluZyBjYXBzIHdpbGwgYmUgdW5wb3NpdGlvbmVkLAorICogYW5kIGluY2x1ZGUgb25seSB1bnBvc2l0aW9uZWQgY2hhbm5lbHMuCisgKiAoQ2hhbm5lbHMgd2l0aCB1bnN1cHBvcnRlZCBBdWRpb0NoYW5uZWxMYWJlbCB3aWxsIGJlIHNraXBwZWQgZWl0aGVyIHdheS4pCisgKgorICogTmF0dXJhbGx5LCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluZGljYXRlZCBieSAnY2hhbm5lbHMnIGNhbiBiZSBsb3dlcgorICogdGhhbiB0aGUgQVUgZWxlbWVudCdzIHRvdGFsIG51bWJlciBvZiBjaGFubmVscy4KKyAqLworR3N0Q2FwcyAqCitnc3RfY29yZV9hdWRpb19hc2JkX3RvX2NhcHMgKEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiAqIGFzYmQsCisgICAgQXVkaW9DaGFubmVsTGF5b3V0ICogbGF5b3V0KQoreworICBHc3RBdWRpb0luZm8gaW5mbzsKKyAgR3N0QXVkaW9Gb3JtYXQgZm9ybWF0ID0gR1NUX0FVRElPX0ZPUk1BVF9VTktOT1dOOworICBndWludCByYXRlLCBjaGFubmVscywgYnBzLCBlbmRpYW5uZXNzOworICBndWludDY0IGNoYW5uZWxfbWFzazsKKyAgZ2Jvb2xlYW4gc2lnbiwgaW50ZXJsZWF2ZWQ7CisKKyAgaWYgKGFzYmQtPm1Gb3JtYXRJRCAhPSBrQXVkaW9Gb3JtYXRMaW5lYXJQQ00pIHsKKyAgICBHU1RfV0FSTklORyAoIk9ubHkgbGluZWFyIFBDTSBpcyBzdXBwb3J0ZWQiKTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKCEoYXNiZC0+bUZvcm1hdEZsYWdzICYga0F1ZGlvRm9ybWF0RmxhZ0lzUGFja2VkKSkgeworICAgIEdTVF9XQVJOSU5HICgiT25seSBwYWNrZWQgZm9ybWF0cyBzdXBwb3J0ZWQiKTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgaWYgKGFzYmQtPm1Gb3JtYXRGbGFncyAmIGtMaW5lYXJQQ01Gb3JtYXRGbGFnc1NhbXBsZUZyYWN0aW9uTWFzaykgeworICAgIEdTVF9XQVJOSU5HICgiRml4ZWQgcG9pbnQgYXVkaW8gaXMgdW5zdXBwb3J0ZWQiKTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgcmF0ZSA9IGFzYmQtPm1TYW1wbGVSYXRlOworICBpZiAocmF0ZSA9PSBrQXVkaW9TdHJlYW1BbnlSYXRlKSB7CisgICAgR1NUX1dBUk5JTkcgKCJObyBzYW1wbGUgcmF0ZSIpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBicHMgPSBhc2JkLT5tQml0c1BlckNoYW5uZWw7CisgIGVuZGlhbm5lc3MgPSBhc2JkLT5tRm9ybWF0RmxhZ3MgJiBrQXVkaW9Gb3JtYXRGbGFnSXNCaWdFbmRpYW4gPworICAgICAgR19CSUdfRU5ESUFOIDogR19MSVRUTEVfRU5ESUFOOworICBzaWduID0gYXNiZC0+bUZvcm1hdElEICYga0F1ZGlvRm9ybWF0RmxhZ0lzU2lnbmVkSW50ZWdlciA/IFRSVUUgOiBGQUxTRTsKKyAgaW50ZXJsZWF2ZWQgPSBhc2JkLT5tRm9ybWF0RmxhZ3MgJiBrQXVkaW9Gb3JtYXRGbGFnSXNOb25JbnRlcmxlYXZlZCA/CisgICAgICBUUlVFIDogRkFMU0U7CisKKyAgaWYgKGFzYmQtPm1Gb3JtYXRGbGFncyAmIGtBdWRpb0Zvcm1hdEZsYWdJc0Zsb2F0KSB7CisgICAgaWYgKGJwcyA9PSAzMikgeworICAgICAgaWYgKGVuZGlhbm5lc3MgPT0gR19MSVRUTEVfRU5ESUFOKQorICAgICAgICBmb3JtYXQgPSBHU1RfQVVESU9fRk9STUFUX0YzMkxFOworICAgICAgZWxzZQorICAgICAgICBmb3JtYXQgPSBHU1RfQVVESU9fRk9STUFUX0YzMkJFOworCisgICAgfSBlbHNlIGlmIChicHMgPT0gNjQpIHsKKyAgICAgIGlmIChlbmRpYW5uZXNzID09IEdfTElUVExFX0VORElBTikKKyAgICAgICAgZm9ybWF0ID0gR1NUX0FVRElPX0ZPUk1BVF9GNjRMRTsKKyAgICAgIGVsc2UKKyAgICAgICAgZm9ybWF0ID0gR1NUX0FVRElPX0ZPUk1BVF9GNjRCRTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9ybWF0ID0gZ3N0X2F1ZGlvX2Zvcm1hdF9idWlsZF9pbnRlZ2VyIChzaWduLCBlbmRpYW5uZXNzLCBicHMsIGJwcyk7CisgIH0KKworICBpZiAoZm9ybWF0ID09IEdTVF9BVURJT19GT1JNQVRfVU5LTk9XTikgeworICAgIEdTVF9XQVJOSU5HICgiVW5zdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCIpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAobGF5b3V0KSB7CisgICAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gcG9zW0dTVF9PU1hfQVVESU9fTUFYX0NIQU5ORUxdOworCisgICAgaWYgKCFnc3RfY29yZV9hdWRpb19wYXJzZV9jaGFubmVsX2xheW91dCAobGF5b3V0LCAmY2hhbm5lbHMsICZjaGFubmVsX21hc2ssCisgICAgICAgICAgICBwb3MpKSB7CisgICAgICBHU1RfV0FSTklORyAoIkZhaWxlZCB0byBwYXJzZSBjaGFubmVsIGxheW91dCIpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBUaGUgQVUgY2FuIGhhdmUgYXJiaXRyYXJ5IGNoYW5uZWwgb3JkZXIsIGJ1dCB3ZSdyZSB1c2luZyBHc3RBdWRpb0luZm8KKyAgICAgKiB3aGljaCBzdXBwb3J0cyBvbmx5IHRoZSBHU3RyZWFtZXIgY2hhbm5lbCBvcmRlci4KKyAgICAgKiBBbHNvLCB3ZSdyZSBldmVudHVhbGx5IHByb2R1Y2luZyBjYXBzLCB3aGljaCBvbmx5IGhhdmUgY2hhbm5lbC1tYXNrCisgICAgICogKHdob3NlIGltcGxpZWQgb3JkZXIgaXMgdGhlIEdTdHJlYW1lciBjaGFubmVsIG9yZGVyKS4gKi8KKyAgICBnc3RfYXVkaW9fY2hhbm5lbF9wb3NpdGlvbnNfdG9fdmFsaWRfb3JkZXIgKHBvcywgY2hhbm5lbHMpOworCisgICAgZ3N0X2F1ZGlvX2luZm9fc2V0X2Zvcm1hdCAoJmluZm8sIGZvcm1hdCwgcmF0ZSwgY2hhbm5lbHMsIHBvcyk7CisgIH0gZWxzZSB7CisgICAgY2hhbm5lbHMgPSBNSU4gKGFzYmQtPm1DaGFubmVsc1BlckZyYW1lLCBHU1RfT1NYX0FVRElPX01BWF9DSEFOTkVMKTsKKyAgICBnc3RfYXVkaW9faW5mb19zZXRfZm9ybWF0ICgmaW5mbywgZm9ybWF0LCByYXRlLCBjaGFubmVscywgTlVMTCk7CisgIH0KKworICByZXR1cm4gZ3N0X2F1ZGlvX2luZm9fdG9fY2FwcyAoJmluZm8pOworCitlcnJvcjoKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorX2NvcmVfYXVkaW9fZ2V0X3Byb3BlcnR5IChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvLCBnYm9vbGVhbiBvdXRlciwKKyAgICBBdWRpb1VuaXRQcm9wZXJ0eUlEIGluSUQsIHZvaWQgKmluRGF0YSwgVUludDMyICogaW5EYXRhU2l6ZSkKK3sKKyAgT1NTdGF0dXMgc3RhdHVzOworICBBdWRpb1VuaXRTY29wZSBzY29wZTsKKyAgQXVkaW9Vbml0RWxlbWVudCBlbGVtZW50OworCisgIHNjb3BlID0gb3V0ZXIgPworICAgICAgQ09SRV9BVURJT19PVVRFUl9TQ09QRSAoY29yZV9hdWRpbykgOiBDT1JFX0FVRElPX0lOTkVSX1NDT1BFIChjb3JlX2F1ZGlvKTsKKyAgZWxlbWVudCA9IENPUkVfQVVESU9fRUxFTUVOVCAoY29yZV9hdWRpbyk7CisKKyAgc3RhdHVzID0KKyAgICAgIEF1ZGlvVW5pdEdldFByb3BlcnR5IChjb3JlX2F1ZGlvLT5hdWRpb3VuaXQsIGluSUQsIHNjb3BlLCBlbGVtZW50LCBpbkRhdGEsCisgICAgICBpbkRhdGFTaXplKTsKKworICByZXR1cm4gc3RhdHVzID09IG5vRXJyOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK19jb3JlX2F1ZGlvX2dldF9zdHJlYW1fZm9ybWF0IChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvLAorICAgIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiAqIGFzYmQsIGdib29sZWFuIG91dGVyKQoreworICBVSW50MzIgc2l6ZTsKKworICBzaXplID0gc2l6ZW9mIChBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24pOworICByZXR1cm4gX2NvcmVfYXVkaW9fZ2V0X3Byb3BlcnR5IChjb3JlX2F1ZGlvLCBvdXRlciwKKyAgICAgIGtBdWRpb1VuaXRQcm9wZXJ0eV9TdHJlYW1Gb3JtYXQsIGFzYmQsICZzaXplKTsKK30KKworQXVkaW9DaGFubmVsTGF5b3V0ICoKK2dzdF9jb3JlX2F1ZGlvX2dldF9jaGFubmVsX2xheW91dCAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbywgZ2Jvb2xlYW4gb3V0ZXIpCit7CisgIFVJbnQzMiBzaXplOworICBBdWRpb0NoYW5uZWxMYXlvdXQgKmxheW91dDsKKworICBpZiAoY29yZV9hdWRpby0+aXNfc3JjKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb3JlX2F1ZGlvLAorICAgICAgICAiZ3N0X2NvcmVfYXVkaW9fZ2V0X2NoYW5uZWxfbGF5b3V0IG5vdCBzdXBwb3J0ZWQgb24gc291cmNlLiIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKCFfY29yZV9hdWRpb19nZXRfcHJvcGVydHkgKGNvcmVfYXVkaW8sIG91dGVyLAorICAgICAgICAgIGtBdWRpb1VuaXRQcm9wZXJ0eV9BdWRpb0NoYW5uZWxMYXlvdXQsIE5VTEwsICZzaXplKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29yZV9hdWRpbywgInVuYWJsZSB0byBnZXQgY2hhbm5lbCBsYXlvdXQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGxheW91dCA9IGdfbWFsbG9jIChzaXplKTsKKyAgaWYgKCFfY29yZV9hdWRpb19nZXRfcHJvcGVydHkgKGNvcmVfYXVkaW8sIG91dGVyLAorICAgICAgICAgIGtBdWRpb1VuaXRQcm9wZXJ0eV9BdWRpb0NoYW5uZWxMYXlvdXQsIGxheW91dCwgJnNpemUpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb3JlX2F1ZGlvLCAidW5hYmxlIHRvIGdldCBjaGFubmVsIGxheW91dCIpOworICAgIGdfZnJlZSAobGF5b3V0KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBsYXlvdXQ7Cit9CisKKyNkZWZpbmUgU1RFUkVPX0NIQU5ORUxfTUFTSyBcCisgIChHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9NQVNLIChGUk9OVF9MRUZUKSB8IFwKKyAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX01BU0sgKEZST05UX1JJR0hUKSkKKworR3N0Q2FwcyAqCitnc3RfY29yZV9hdWRpb19wcm9iZV9jYXBzIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvLCBHc3RDYXBzICogaW5fY2FwcykKK3sKKyAgZ3VpbnQgaSwgY2hhbm5lbHM7CisgIGdib29sZWFuIHNwZGlmX2FsbG93ZWQ7CisgIEF1ZGlvQ2hhbm5lbExheW91dCAqbGF5b3V0OworICBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gb3V0ZXJfYXNiZDsKKyAgZ2Jvb2xlYW4gZ290X291dGVyX2FzYmQ7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworICBndWludDY0IGNoYW5uZWxfbWFzazsKKworICAvKiBHZXQgdGhlIEFTQkQgb2YgdGhlIG91dGVyIHNjb3BlIChpLmUuIGlucHV0IHNjb3BlIG9mIElucHV0LAorICAgKiBvdXRwdXQgc2NvcGUgb2YgT3V0cHV0KS4KKyAgICogVGhpcyBBU0JEIGluZGljYXRlcyB0aGUgaGFyZHdhcmUgZm9ybWF0LiAqLworICBnb3Rfb3V0ZXJfYXNiZCA9CisgICAgICBfY29yZV9hdWRpb19nZXRfc3RyZWFtX2Zvcm1hdCAoY29yZV9hdWRpbywgJm91dGVyX2FzYmQsIFRSVUUpOworCisgIC8qIENvbGxlY3QgaW5mbyBhYm91dCB0aGUgSFcgY2FwYWJpbGl0ZXMgYW5kIHByZWZlcmVuY2VzICovCisgIHNwZGlmX2FsbG93ZWQgPQorICAgICAgZ3N0X2NvcmVfYXVkaW9fYXVkaW9fZGV2aWNlX2lzX3NwZGlmX2F2YWlsIChjb3JlX2F1ZGlvLT5kZXZpY2VfaWQpOworICBpZiAoIWNvcmVfYXVkaW8tPmlzX3NyYykKKyAgICBsYXlvdXQgPSBnc3RfY29yZV9hdWRpb19nZXRfY2hhbm5lbF9sYXlvdXQgKGNvcmVfYXVkaW8sIFRSVUUpOworICBlbHNlCisgICAgbGF5b3V0ID0gTlVMTDsgICAgICAgICAgICAgIC8qIG5vIHN1cHBvcnRlZCBmb3Igc291cmNlcyAqLworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGNvcmVfYXVkaW8sICJTZWxlY3RlZCBkZXZpY2UgSUQ6ICV1IFNQRElGIGFsbG93ZWQ6ICVkIiwKKyAgICAgICh1bnNpZ25lZCkgY29yZV9hdWRpby0+ZGV2aWNlX2lkLCBzcGRpZl9hbGxvd2VkKTsKKworICBpZiAobGF5b3V0KSB7CisgICAgaWYgKCFnc3RfY29yZV9hdWRpb19wYXJzZV9jaGFubmVsX2xheW91dCAobGF5b3V0LCAmY2hhbm5lbHMsICZjaGFubmVsX21hc2ssCisgICAgICAgICAgICBOVUxMKSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb3JlX2F1ZGlvLCAiRmFpbGVkIHRvIHBhcnNlIGNoYW5uZWwgbGF5b3V0Iik7CisgICAgICBjaGFubmVsX21hc2sgPSAwOworICAgIH0KKworICAgIC8qIElmIGF2YWlsYWJsZSwgc3RhcnQgd2l0aCB0aGUgcHJlZmVycmVkIGNhcHMuICovCisgICAgaWYgKGdvdF9vdXRlcl9hc2JkKQorICAgICAgY2FwcyA9IGdzdF9jb3JlX2F1ZGlvX2FzYmRfdG9fY2FwcyAoJm91dGVyX2FzYmQsIGxheW91dCk7CisKKyAgICBnX2ZyZWUgKGxheW91dCk7CisgIH0gZWxzZSBpZiAoZ290X291dGVyX2FzYmQpIHsKKyAgICBjaGFubmVscyA9IG91dGVyX2FzYmQubUNoYW5uZWxzUGVyRnJhbWU7CisgICAgY2hhbm5lbF9tYXNrID0gMDsKKyAgICAvKiBJZiBhdmFpbGFibGUsIHN0YXJ0IHdpdGggdGhlIHByZWZlcnJlZCBjYXBzICovCisgICAgY2FwcyA9IGdzdF9jb3JlX2F1ZGlvX2FzYmRfdG9fY2FwcyAoJm91dGVyX2FzYmQsIE5VTEwpOworICB9IGVsc2UgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvcmVfYXVkaW8sCisgICAgICAgICJVbmFibGUgdG8gZ2V0IGFueSBpbmZvcm1hdGlvbiBhYm91dCBoYXJkd2FyZSIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLyogQXBwZW5kIHRoZSBhbGxvd2VkIHN1YnNldCBiYXNlZCBvbiB0aGUgdGVtcGxhdGUgY2FwcyAgKi8KKyAgaWYgKCFjYXBzKQorICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAoaW5fY2Fwcyk7IGkrKykgeworICAgIEdzdFN0cnVjdHVyZSAqaW5fczsKKworICAgIGluX3MgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChpbl9jYXBzLCBpKTsKKworICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChpbl9zLCAiYXVkaW8veC1hYzMiKSB8fAorICAgICAgICBnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChpbl9zLCAiYXVkaW8veC1kdHMiKSkgeworICAgICAgaWYgKHNwZGlmX2FsbG93ZWQpIHsKKyAgICAgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2FwcywgZ3N0X3N0cnVjdHVyZV9jb3B5IChpbl9zKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqb3V0X3M7CisKKyAgICAgIG91dF9zID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChpbl9zKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChvdXRfcywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgY2hhbm5lbHMsIE5VTEwpOworICAgICAgaWYgKGNoYW5uZWxfbWFzayAhPSAwKSB7CisgICAgICAgIC8qIHBvc2l0aW9uZWQgbGF5b3V0ICovCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChvdXRfcywKKyAgICAgICAgICAgICJjaGFubmVsLW1hc2siLCBHU1RfVFlQRV9CSVRNQVNLLCBjaGFubmVsX21hc2ssIE5VTEwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogdW5wb3NpdGlvbmVkIGxheW91dCAqLworICAgICAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAob3V0X3MsICJjaGFubmVsLW1hc2siKTsKKyAgICAgIH0KKworI2lmbmRlZiBIQVZFX0lPUworICAgICAgaWYgKGNvcmVfYXVkaW8tPmlzX3NyYyAmJiBnb3Rfb3V0ZXJfYXNiZAorICAgICAgICAgICYmIG91dGVyX2FzYmQubVNhbXBsZVJhdGUgIT0ga0F1ZGlvU3RyZWFtQW55UmF0ZSkgeworICAgICAgICAvKiBBY2NvcmRpbmcgdG8gQ29yZSBBdWRpbyBlbmdpbmVlciwgQVVIQUwgZG9lcyBub3Qgc3VwcG9ydCBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uLgorICAgICAgICAgKiBvbiBzb3VyY2VzLiBUaGVyZWZvcmUsIHdlIGZpeGF0ZSB0aGUgc2FtcGxlIHJhdGUuCisgICAgICAgICAqCisgICAgICAgICAqICJZb3UgZGVmaW5pdGVseSBjYW5ub3QgZG8gcmF0ZSBjb252ZXJzaW9uIGFzIHBhcnQgb2YgZ2V0dGluZyBpbnB1dCBmcm9tIEFVSEFMLgorICAgICAgICAgKiAgVGhhdCdzIHRoZSBtb3N0IGNvbW1vbiBjYXVzZSBvZiB0aG9zZSAiY2Fubm90IGRvIGluIGN1cnJlbnQgY29udGV4dCIgZXJyb3JzLiIKKyAgICAgICAgICogaHR0cDovL2xpc3RzLmFwcGxlLmNvbS9hcmNoaXZlcy9jb3JlYXVkaW8tYXBpLzIwMDYvU2VwL21zZzAwMDg4Lmh0bWwKKyAgICAgICAgICovCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChvdXRfcywgInJhdGUiLCBHX1RZUEVfSU5ULAorICAgICAgICAgICAgKGdpbnQpIG91dGVyX2FzYmQubVNhbXBsZVJhdGUsIE5VTEwpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8qIFNwZWNpYWwgY2FzZXMgZm9yIHVwbWl4aW5nIGFuZCBkb3dubWl4aW5nLgorICAgICAgICogT3RoZXIgdGhhbiB0aGF0LCB0aGUgQVVzIGRvbid0IHVwbWl4IG9yIGRvd25taXggbXVsdGktY2hhbm5lbCBhdWRpbywKKyAgICAgICAqIGUuZy4gaWYgeW91IHB1c2ggNS4xLXN1cnJvdW5kIGF1ZGlvIHRvIGEgc3RlcmVvIGNvbmZpZ3VyYXRpb24sCisgICAgICAgKiB0aGUgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMgd2lsbCBiZSBwbGF5ZWQgYWNjb3JkaW5nbHksCisgICAgICAgKiBhbmQgdGhlIHJlc3Qgd2lsbCBiZSBkcm9wcGVkLiAqLworICAgICAgaWYgKGNoYW5uZWxzID09IDEpIHsKKyAgICAgICAgLyogSWYgaGF2ZSBtb25vLCB0aGVuIGFsc28gb2ZmZXIgc3RlcmVvIHNpbmNlIENvcmVBdWRpbyBkb3dubWl4ZXMgdG8gaXQgKi8KKyAgICAgICAgR3N0U3RydWN0dXJlICpzdGVyZW8gPSBnc3Rfc3RydWN0dXJlX2NvcHkgKG91dF9zKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKG91dF9zLCAiY2hhbm5lbC1tYXNrIik7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzdGVyZW8sICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDIsCisgICAgICAgICAgICAiY2hhbm5lbC1tYXNrIiwgR1NUX1RZUEVfQklUTUFTSywgU1RFUkVPX0NIQU5ORUxfTUFTSywgTlVMTCk7CisgICAgICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKGNhcHMsIHN0ZXJlbyk7CisgICAgICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKGNhcHMsIG91dF9zKTsKKyAgICAgIH0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gMiAmJiAoY2hhbm5lbF9tYXNrID09IDAKKyAgICAgICAgICAgICAgfHwgY2hhbm5lbF9tYXNrID09IFNURVJFT19DSEFOTkVMX01BU0spKSB7CisgICAgICAgIC8qIElmIGhhdmUgc3RlcmVvIGNoYW5uZWxzLCB0aGVuIGFsc28gb2ZmZXIgbW9ubyBzaW5jZSBDb3JlQXVkaW8KKyAgICAgICAgICogdXBtaXhlcyBpdC4gKi8KKyAgICAgICAgR3N0U3RydWN0dXJlICptb25vID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChvdXRfcyk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChtb25vLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKG1vbm8sICJjaGFubmVsLW1hc2siKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG91dF9zLCAiY2hhbm5lbC1tYXNrIiwgR1NUX1RZUEVfQklUTUFTSywKKyAgICAgICAgICAgIFNURVJFT19DSEFOTkVMX01BU0ssIE5VTEwpOworCisgICAgICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKGNhcHMsIG91dF9zKTsKKyAgICAgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2FwcywgbW9ubyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBPdGhlcndoaXNlIGp1c3QgYWRkIHRoZSBjYXBzICovCisgICAgICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKGNhcHMsIG91dF9zKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChjb3JlX2F1ZGlvLCAiUHJvYmVkIGNhcHM6JSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworICByZXR1cm4gY2FwczsKK30KZGlmZiAtLWdpdCBhL3N5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uaCBiL3N5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTg4ZTNjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpby5oCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgRmx1ZW5kbyBTLkEuIDxzdXBwb3J0QGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9fR1NUX0NPUkVfQVVESU9fSF9fCisjZGVmaW5lIF9fR1NUX0NPUkVfQVVESU9fSF9fCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby1jaGFubmVscy5oPgorI2lmZGVmIEhBVkVfSU9TCisgICNpbmNsdWRlIDxDb3JlQXVkaW8vQ29yZUF1ZGlvVHlwZXMuaD4KKyAgI2RlZmluZSBBdWRpb0RldmljZUlEIGdpbnQKKyAgI2RlZmluZSBrQXVkaW9EZXZpY2VVbmtub3duIDAKKyNlbHNlCisgICNpbmNsdWRlIDxDb3JlQXVkaW8vQ29yZUF1ZGlvLmg+CisgICNpbmNsdWRlIDxBdWRpb1Rvb2xib3gvQXVkaW9Ub29sYm94Lmg+CisgICNpZiBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8IDEwNjAKKyAgICAjaW5jbHVkZSA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgorICAgICNkZWZpbmUgQXVkaW9Db21wb25lbnRGaW5kTmV4dCBGaW5kTmV4dENvbXBvbmVudAorICAgICNkZWZpbmUgQXVkaW9Db21wb25lbnRJbnN0YW5jZU5ldyBPcGVuQUNvbXBvbmVudAorICAgICNkZWZpbmUgQXVkaW9Db21wb25lbnRJbnN0YW5jZURpc3Bvc2UgQ2xvc2VDb21wb25lbnQKKyAgICAjZGVmaW5lIEF1ZGlvQ29tcG9uZW50IENvbXBvbmVudAorICAgICNkZWZpbmUgQXVkaW9Db21wb25lbnREZXNjcmlwdGlvbiBDb21wb25lbnREZXNjcmlwdGlvbgorICAjZW5kaWYKKyNlbmRpZgorI2luY2x1ZGUgPEF1ZGlvVW5pdC9BdWRpb1VuaXQuaD4KKyNpbmNsdWRlICJnc3Rvc3hhdWRpb2VsZW1lbnQuaCIKKworCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfQ09SRV9BVURJTyBcCisgIChnc3RfY29yZV9hdWRpb19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfQ09SRV9BVURJTyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0NPUkVfQVVESU8sR3N0Q29yZUF1ZGlvKSkKKyNkZWZpbmUgR1NUX0NPUkVfQVVESU9fQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfQ09SRV9BVURJTyxHc3RDb3JlQXVkaW9DbGFzcykpCisjZGVmaW5lIEdTVF9DT1JFX0FVRElPX0dFVF9DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MoKG9iaiksR1NUX1RZUEVfQ09SRV9BVURJTyxHc3RDb3JlQXVkaW9DbGFzcykpCisjZGVmaW5lIEdTVF9JU19DT1JFX0FVRElPKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfQ09SRV9BVURJTykpCisjZGVmaW5lIEdTVF9JU19DT1JFX0FVRElPX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0NPUkVfQVVESU8pKQorCisvKiBUT0RPOiBDb25zaWRlciByYWlzaW5nIHRvIDY0ICovCisjZGVmaW5lIEdTVF9PU1hfQVVESU9fTUFYX0NIQU5ORUwgKDkpCisKKyNkZWZpbmUgQ09SRV9BVURJT19GT1JNQVRfSVNfU1BESUYoZikgKChmKS5tRm9ybWF0Lm1Gb3JtYXRJRCA9PSAnSUFDMycgfHwgKGYpLm1Gb3JtYXQubUZvcm1hdElEID09ICdpYWMzJyB8fCAoZikubUZvcm1hdC5tRm9ybWF0SUQgPT0ga0F1ZGlvRm9ybWF0NjA5NThBQzMgfHwgKGYpLm1Gb3JtYXQubUZvcm1hdElEID09IGtBdWRpb0Zvcm1hdEFDMykKKworI2RlZmluZSBDT1JFX0FVRElPX0ZPUk1BVCAiRm9ybWF0SUQ6ICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgcmF0ZTogJWYgZmxhZ3M6IDB4JXggQnl0ZXNQZXJQYWNrZXQ6ICV1IEZyYW1lc1BlclBhY2tldDogJXUgQnl0ZXNQZXJGcmFtZTogJXUgQ2hhbm5lbHNQZXJGcmFtZTogJXUgQml0c1BlckNoYW5uZWw6ICV1IgorI2RlZmluZSBDT1JFX0FVRElPX0ZPUk1BVF9BUkdTKGYpIEdTVF9GT1VSQ0NfQVJHUygodW5zaWduZWQgaW50KShmKS5tRm9ybWF0SUQpLChmKS5tU2FtcGxlUmF0ZSwodW5zaWduZWQgaW50KShmKS5tRm9ybWF0RmxhZ3MsKHVuc2lnbmVkIGludCkoZikubUJ5dGVzUGVyUGFja2V0LCh1bnNpZ25lZCBpbnQpKGYpLm1GcmFtZXNQZXJQYWNrZXQsKHVuc2lnbmVkIGludCkoZikubUJ5dGVzUGVyRnJhbWUsKHVuc2lnbmVkIGludCkoZikubUNoYW5uZWxzUGVyRnJhbWUsKHVuc2lnbmVkIGludCkoZikubUJpdHNQZXJDaGFubmVsCisKKyNkZWZpbmUgQ09SRV9BVURJT19JTk5FUl9TQ09QRShjb3JlX2F1ZGlvKSAoKGNvcmVfYXVkaW8pLT5pc19zcmMgPyBrQXVkaW9Vbml0U2NvcGVfT3V0cHV0IDoga0F1ZGlvVW5pdFNjb3BlX0lucHV0KQorI2RlZmluZSBDT1JFX0FVRElPX09VVEVSX1NDT1BFKGNvcmVfYXVkaW8pICgoY29yZV9hdWRpbyktPmlzX3NyYyA/IGtBdWRpb1VuaXRTY29wZV9JbnB1dCA6IGtBdWRpb1VuaXRTY29wZV9PdXRwdXQpCisjZGVmaW5lIENPUkVfQVVESU9fRUxFTUVOVChjb3JlX2F1ZGlvKSAoKGNvcmVfYXVkaW8pLT5pc19zcmMgPyAxIDogMCkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdENvcmVBdWRpbyBHc3RDb3JlQXVkaW87Cit0eXBlZGVmIHN0cnVjdCBfR3N0Q29yZUF1ZGlvQ2xhc3MgR3N0Q29yZUF1ZGlvQ2xhc3M7CisKK3N0cnVjdCBfR3N0Q29yZUF1ZGlvCit7CisgIEdPYmplY3Qgb2JqZWN0OworCisgIEdzdE9iamVjdCAqb3N4YnVmOworICBHc3RPc3hBdWRpb0VsZW1lbnRJbnRlcmZhY2UgKmVsZW1lbnQ7CisKKyAgZ2Jvb2xlYW4gaXNfc3JjOworICBnYm9vbGVhbiBpc19wYXNzdGhyb3VnaDsKKyAgQXVkaW9EZXZpY2VJRCBkZXZpY2VfaWQ7CisgIGdib29sZWFuIGNhY2hlZF9jYXBzX3ZhbGlkOyAvKiB0aHJlYWQtc2FmZSBmbGFnICovCisgIEdzdENhcHMgKmNhY2hlZF9jYXBzOworICBnaW50IHN0cmVhbV9pZHg7CisgIGdib29sZWFuIGlvX3Byb2NfYWN0aXZlOworICBnYm9vbGVhbiBpb19wcm9jX25lZWRzX2RlYWN0aXZhdGlvbjsKKworICAvKiBGb3IgTFBDTSBpbi9vdXQgKi8KKyAgQXVkaW9Vbml0IGF1ZGlvdW5pdDsKKyAgVUludDMyIHJlY0J1ZmZlclNpemU7IC8qIEF1ZGlvVW5pdFJlbmRlciBjbG9iYmVycyBtRGF0YUJ5dGVTaXplICovCisgIEF1ZGlvQnVmZmVyTGlzdCAqcmVjQnVmZmVyTGlzdDsKKworI2lmbmRlZiBIQVZFX0lPUworICAvKiBGb3IgU1BESUYgb3V0ICovCisgIHBpZF90IGhvZ19waWQ7CisgIGdib29sZWFuIGRpc2FibGVkX21peGluZzsKKyAgQXVkaW9TdHJlYW1JRCBzdHJlYW1faWQ7CisgIGdib29sZWFuIHJldmVydF9mb3JtYXQ7CisgIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiBvcmlnaW5hbF9mb3JtYXQsIHN0cmVhbV9mb3JtYXQ7CisgIEF1ZGlvRGV2aWNlSU9Qcm9jSUQgcHJvY0lEOworI2VuZGlmCit9OworCitzdHJ1Y3QgX0dzdENvcmVBdWRpb0NsYXNzCit7CisgIEdPYmplY3RDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfY29yZV9hdWRpb19nZXRfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpOworCit2b2lkIGdzdF9jb3JlX2F1ZGlvX2luaXRfZGVidWcgKHZvaWQpOworCitHc3RDb3JlQXVkaW8gKiBnc3RfY29yZV9hdWRpb19uZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdzdE9iamVjdCAqb3N4YnVmKTsKKworZ2Jvb2xlYW4gZ3N0X2NvcmVfYXVkaW9fb3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHc3RDb3JlQXVkaW8gKmNvcmVfYXVkaW8pOworCitnYm9vbGVhbiBnc3RfY29yZV9hdWRpb19jbG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdzdENvcmVBdWRpbyAqY29yZV9hdWRpbyk7CisKK2dib29sZWFuIGdzdF9jb3JlX2F1ZGlvX2luaXRpYWxpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAoR3N0Q29yZUF1ZGlvICpjb3JlX2F1ZGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RDYXBzICpjYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYm9vbGVhbiBpc19wYXNzdGhyb3VnaCk7CisKK3ZvaWQgZ3N0X2NvcmVfYXVkaW9fdW5pbml0aWFsaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR3N0Q29yZUF1ZGlvICpjb3JlX2F1ZGlvKTsKKworZ2Jvb2xlYW4gZ3N0X2NvcmVfYXVkaW9fc3RhcnRfcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgIChHc3RDb3JlQXVkaW8gKmNvcmVfYXVkaW8pOworCitnYm9vbGVhbiBnc3RfY29yZV9hdWRpb19wYXVzZV9wcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgKEdzdENvcmVBdWRpbyAqY29yZV9hdWRpbyk7CisKK2dib29sZWFuIGdzdF9jb3JlX2F1ZGlvX3N0b3BfcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAoR3N0Q29yZUF1ZGlvICpjb3JlX2F1ZGlvKTsKKworZ2Jvb2xlYW4gZ3N0X2NvcmVfYXVkaW9fZ2V0X3NhbXBsZXNfYW5kX2xhdGVuY3kgICAgICAgICAgICAgIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlIHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50ICpzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICpsYXRlbmN5KTsKKwordm9pZCAgZ3N0X2NvcmVfYXVkaW9fc2V0X3ZvbHVtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHc3RDb3JlQXVkaW8gKmNvcmVfYXVkaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdmbG9hdCB2b2x1bWUpOworCitnYm9vbGVhbiBnc3RfY29yZV9hdWRpb19hdWRpb19kZXZpY2VfaXNfc3BkaWZfYXZhaWwgICAgICAgICAgKEF1ZGlvRGV2aWNlSUQgZGV2aWNlX2lkKTsKKworCitnYm9vbGVhbiBnc3RfY29yZV9hdWRpb19zZWxlY3RfZGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pOworCitHc3RDYXBzICoKK2dzdF9jb3JlX2F1ZGlvX3Byb2JlX2NhcHMgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8sIEdzdENhcHMgKiBpbl9jYXBzKTsKKworQXVkaW9DaGFubmVsTGF5b3V0ICoKK2dzdF9jb3JlX2F1ZGlvX2dldF9jaGFubmVsX2xheW91dCAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbywgZ2Jvb2xlYW4gb3V0ZXIpOworCitnYm9vbGVhbiBnc3RfY29yZV9hdWRpb19wYXJzZV9jaGFubmVsX2xheW91dCAoQXVkaW9DaGFubmVsTGF5b3V0ICogbGF5b3V0LAorICAgIGd1aW50ICogY2hhbm5lbHMsIGd1aW50NjQgKiBjaGFubmVsX21hc2ssIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICogcG9zKTsKK0dzdENhcHMgKiBnc3RfY29yZV9hdWRpb19hc2JkX3RvX2NhcHMgKEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiAqIGFzYmQsCisgICAgQXVkaW9DaGFubmVsTGF5b3V0ICogbGF5b3V0KTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX0NPUkVfQVVESU9fSF9fICovCmRpZmYgLS1naXQgYS9zeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvY29tbW9uLmMgYi9zeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkMDNhYwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9jb21tb24uYwpAQCAtMCwwICsxLDU1MiBAQAorLyoKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgRmx1ZW5kbyBTLkEuIDxzdXBwb3J0QGZsdWVuZG8uY29tPgorICogICBBdXRob3JzOiBKb3NlcCBUb3JyYSBWYWxsw6hzIDxqb3NlcEBmbHVlbmRvLmNvbT4KKyAqICAgICAgICAgICAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDxhbW9yYWxlc0BmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImdzdG9zeGNvcmVhdWRpb2NvbW1vbi5oIgorCit2b2lkCitnc3RfY29yZV9hdWRpb19yZW1vdmVfcmVuZGVyX2NhbGxiYWNrIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBBVVJlbmRlckNhbGxiYWNrU3RydWN0IGlucHV0OworICBPU1N0YXR1cyBzdGF0dXM7CisKKyAgLyogRGVhY3RpdmF0ZSB0aGUgcmVuZGVyIGNhbGxiYWNrIGJ5IGNhbGxpbmcgU2V0UmVuZGVyQ2FsbGJhY2sKKyAgICogd2l0aCBhIE5VTEwgaW5wdXRQcm9jLgorICAgKi8KKyAgaW5wdXQuaW5wdXRQcm9jID0gTlVMTDsKKyAgaW5wdXQuaW5wdXRQcm9jUmVmQ29uID0gTlVMTDsKKworICBzdGF0dXMgPSBBdWRpb1VuaXRTZXRQcm9wZXJ0eSAoY29yZV9hdWRpby0+YXVkaW91bml0LCBrQXVkaW9Vbml0UHJvcGVydHlfU2V0UmVuZGVyQ2FsbGJhY2ssIGtBdWRpb1VuaXRTY29wZV9HbG9iYWwsIDAsICAgICAgICAvKiBOL0EgZm9yIGdsb2JhbCAqLworICAgICAgJmlucHV0LCBzaXplb2YgKGlucHV0KSk7CisKKyAgaWYgKHN0YXR1cykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLAorICAgICAgICAiRmFpbGVkIHRvIHJlbW92ZSByZW5kZXIgY2FsbGJhY2sgJWQiLCAoaW50KSBzdGF0dXMpOworICB9CisKKyAgLyogUmVtb3ZlIHRoZSBSZW5kZXJOb3RpZnkgdG9vICovCisgIHN0YXR1cyA9IEF1ZGlvVW5pdFJlbW92ZVJlbmRlck5vdGlmeSAoY29yZV9hdWRpby0+YXVkaW91bml0LAorICAgICAgKEFVUmVuZGVyQ2FsbGJhY2spIGdzdF9jb3JlX2F1ZGlvX3JlbmRlcl9ub3RpZnksIGNvcmVfYXVkaW8pOworCisgIGlmIChzdGF0dXMpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwKKyAgICAgICAgIkZhaWxlZCB0byByZW1vdmUgcmVuZGVyIG5vdGlmeSBjYWxsYmFjayAlZCIsIChpbnQpIHN0YXR1cyk7CisgIH0KKworICAvKiBXZSdyZSBkZWFjdGl2YXRlZC4uICovCisgIGNvcmVfYXVkaW8tPmlvX3Byb2NfbmVlZHNfZGVhY3RpdmF0aW9uID0gRkFMU0U7CisgIGNvcmVfYXVkaW8tPmlvX3Byb2NfYWN0aXZlID0gRkFMU0U7Cit9CisKK09TU3RhdHVzCitnc3RfY29yZV9hdWRpb19yZW5kZXJfbm90aWZ5IChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvLAorICAgIEF1ZGlvVW5pdFJlbmRlckFjdGlvbkZsYWdzICogaW9BY3Rpb25GbGFncywKKyAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCAqIGluVGltZVN0YW1wLAorICAgIHVuc2lnbmVkIGludCBpbkJ1c051bWJlciwKKyAgICB1bnNpZ25lZCBpbnQgaW5OdW1iZXJGcmFtZXMsIEF1ZGlvQnVmZmVyTGlzdCAqIGlvRGF0YSkKK3sKKyAgLyogQmVmb3JlIHJlbmRlcmluZyBhIGZyYW1lLCB3ZSBnZXQgdGhlIFByZVJlbmRlciBub3RpZmljYXRpb24uCisgICAqIEhlcmUsIHdlIGRldGFjaCB0aGUgUmVuZGVyQ2FsbGJhY2sgaWYgd2UndmUgYmVlbiBwYXVzZWQuCisgICAqCisgICAqIFRoaXMgaXMgbmVjZXNzYXJ5IChyYXRoZXIgdGhhbiBqdXN0IGRpcmVjdGx5IGRldGFjaGluZyBpdCkgdG8KKyAgICogd29yayBhcm91bmQgc29tZSB0aHJlYWQtc2FmZXR5IGlzc3VlcyBpbiBDb3JlQXVkaW8KKyAgICovCisgIGlmICgoKmlvQWN0aW9uRmxhZ3MpICYga0F1ZGlvVW5pdFJlbmRlckFjdGlvbl9QcmVSZW5kZXIpIHsKKyAgICBpZiAoY29yZV9hdWRpby0+aW9fcHJvY19uZWVkc19kZWFjdGl2YXRpb24pIHsKKyAgICAgIGdzdF9jb3JlX2F1ZGlvX3JlbW92ZV9yZW5kZXJfY2FsbGJhY2sgKGNvcmVfYXVkaW8pOworICAgIH0KKyAgfQorCisgIHJldHVybiBub0VycjsKK30KKworZ2Jvb2xlYW4KK2dzdF9jb3JlX2F1ZGlvX2lvX3Byb2Nfc3RhcnQgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIE9TU3RhdHVzIHN0YXR1czsKKyAgQVVSZW5kZXJDYWxsYmFja1N0cnVjdCBpbnB1dDsKKyAgQXVkaW9Vbml0UHJvcGVydHlJRCBjYWxsYmFja190eXBlOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwKKyAgICAgICJvc3ggcmluZyBidWZmZXIgc3RhcnQgaW9wcm9jOiAlcCBkZXZpY2VfaWQgJWx1IiwKKyAgICAgIGNvcmVfYXVkaW8tPmVsZW1lbnQtPmlvX3Byb2MsIChndWxvbmcpIGNvcmVfYXVkaW8tPmRldmljZV9pZCk7CisgIGlmICghY29yZV9hdWRpby0+aW9fcHJvY19hY3RpdmUpIHsKKyAgICBjYWxsYmFja190eXBlID0gY29yZV9hdWRpby0+aXNfc3JjID8KKyAgICAgICAga0F1ZGlvT3V0cHV0VW5pdFByb3BlcnR5X1NldElucHV0Q2FsbGJhY2sgOgorICAgICAgICBrQXVkaW9Vbml0UHJvcGVydHlfU2V0UmVuZGVyQ2FsbGJhY2s7CisKKyAgICBpbnB1dC5pbnB1dFByb2MgPSAoQVVSZW5kZXJDYWxsYmFjaykgY29yZV9hdWRpby0+ZWxlbWVudC0+aW9fcHJvYzsKKyAgICBpbnB1dC5pbnB1dFByb2NSZWZDb24gPSBjb3JlX2F1ZGlvLT5vc3hidWY7CisKKyAgICBzdGF0dXMgPSBBdWRpb1VuaXRTZXRQcm9wZXJ0eSAoY29yZV9hdWRpby0+YXVkaW91bml0LCBjYWxsYmFja190eXBlLCBrQXVkaW9Vbml0U2NvcGVfR2xvYmFsLCAwLCAgICAgLyogTi9BIGZvciBnbG9iYWwgKi8KKyAgICAgICAgJmlucHV0LCBzaXplb2YgKGlucHV0KSk7CisKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChjb3JlX2F1ZGlvLT5vc3hidWYsCisgICAgICAgICAgIkF1ZGlvVW5pdFNldFByb3BlcnR5IGZhaWxlZDogJWQiLCAoaW50KSBzdGF0dXMpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAvLyAjIyMgZG9lcyBpdCBtYWtlIHNlbnNlIHRvIGRvIHRoaXMgbm90aWZ5IHN0dWZmIGZvciBpbnB1dCBtb2RlPworICAgIHN0YXR1cyA9IEF1ZGlvVW5pdEFkZFJlbmRlck5vdGlmeSAoY29yZV9hdWRpby0+YXVkaW91bml0LAorICAgICAgICAoQVVSZW5kZXJDYWxsYmFjaykgZ3N0X2NvcmVfYXVkaW9fcmVuZGVyX25vdGlmeSwgY29yZV9hdWRpbyk7CisKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChjb3JlX2F1ZGlvLT5vc3hidWYsCisgICAgICAgICAgIkF1ZGlvVW5pdEFkZFJlbmRlck5vdGlmeSBmYWlsZWQgJWQiLCAoaW50KSBzdGF0dXMpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBjb3JlX2F1ZGlvLT5pb19wcm9jX2FjdGl2ZSA9IFRSVUU7CisgIH0KKworICBjb3JlX2F1ZGlvLT5pb19wcm9jX25lZWRzX2RlYWN0aXZhdGlvbiA9IEZBTFNFOworCisgIHN0YXR1cyA9IEF1ZGlvT3V0cHV0VW5pdFN0YXJ0IChjb3JlX2F1ZGlvLT5hdWRpb3VuaXQpOworICBpZiAoc3RhdHVzKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLCAiQXVkaW9PdXRwdXRVbml0U3RhcnQgZmFpbGVkOiAlZCIsCisgICAgICAgIChpbnQpIHN0YXR1cyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9faW9fcHJvY19zdG9wIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBPU0VyciBzdGF0dXM7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLAorICAgICAgIm9zeCByaW5nIGJ1ZmZlciBzdG9wIGlvcHJvYzogJXAgZGV2aWNlX2lkICVsdSIsCisgICAgICBjb3JlX2F1ZGlvLT5lbGVtZW50LT5pb19wcm9jLCAoZ3Vsb25nKSBjb3JlX2F1ZGlvLT5kZXZpY2VfaWQpOworCisgIHN0YXR1cyA9IEF1ZGlvT3V0cHV0VW5pdFN0b3AgKGNvcmVfYXVkaW8tPmF1ZGlvdW5pdCk7CisgIGlmIChzdGF0dXMpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwKKyAgICAgICAgIkF1ZGlvT3V0cHV0VW5pdFN0b3AgZmFpbGVkOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgIH0KKyAgLy8gIyMjOiB3aHkgaXMgaXQgb2theSB0byBkaXJlY3RseSByZW1vdmUgZnJvbSBoZXJlIGJ1dCBub3QgZnJvbSBwYXVzZSgpID8KKyAgaWYgKGNvcmVfYXVkaW8tPmlvX3Byb2NfYWN0aXZlKSB7CisgICAgZ3N0X2NvcmVfYXVkaW9fcmVtb3ZlX3JlbmRlcl9jYWxsYmFjayAoY29yZV9hdWRpbyk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK0F1ZGlvQnVmZmVyTGlzdCAqCitidWZmZXJfbGlzdF9hbGxvYyAoVUludDMyIGNoYW5uZWxzLCBVSW50MzIgc2l6ZSwgZ2Jvb2xlYW4gaW50ZXJsZWF2ZWQpCit7CisgIEF1ZGlvQnVmZmVyTGlzdCAqbGlzdDsKKyAgZ3NpemUgbGlzdF9zaXplOworICBVSW50MzIgbnVtX2J1ZmZlcnMsIG47CisKKyAgbnVtX2J1ZmZlcnMgPSBpbnRlcmxlYXZlZCA/IDEgOiBjaGFubmVsczsKKyAgLyogQXVkaW9CdWZmZXJMaXN0IG1lbWJlciBtQnVmZmVycyBpcyB2YXJpYWJsZS1sZW5ndGggYXJyYXkgKi8KKyAgbGlzdF9zaXplID0gR19TVFJVQ1RfT0ZGU0VUIChBdWRpb0J1ZmZlckxpc3QsIG1CdWZmZXJzW251bV9idWZmZXJzXSk7CisgIGxpc3QgPSAoQXVkaW9CdWZmZXJMaXN0ICopIGdfbWFsbG9jIChsaXN0X3NpemUpOworCisgIGxpc3QtPm1OdW1iZXJCdWZmZXJzID0gbnVtX2J1ZmZlcnM7CisgIGZvciAobiA9IDA7IG4gPCBudW1fYnVmZmVyczsgKytuKSB7CisgICAgLyogU2VlIGh0dHA6Ly9saXN0cy5hcHBsZS5jb20vYXJjaGl2ZXMvY29yZWF1ZGlvLWFwaS8yMDE1L0ZlYi9tc2cwMDAyNy5odG1sICovCisgICAgbGlzdC0+bUJ1ZmZlcnNbbl0ubU51bWJlckNoYW5uZWxzID0gaW50ZXJsZWF2ZWQgPyBjaGFubmVscyA6IDE7CisgICAgLyogQXVkaW9Vbml0UmVuZGVyIHdpbGwga2VlcCBvdmVyd3JpdGluZyBtRGF0YUJ5dGVTaXplICovCisgICAgbGlzdC0+bUJ1ZmZlcnNbbl0ubURhdGFCeXRlU2l6ZSA9IHNpemU7CisgICAgbGlzdC0+bUJ1ZmZlcnNbbl0ubURhdGEgPSBnX21hbGxvYyAoc2l6ZSk7CisgIH0KKworICByZXR1cm4gbGlzdDsKK30KKwordm9pZAorYnVmZmVyX2xpc3RfZnJlZSAoQXVkaW9CdWZmZXJMaXN0ICogbGlzdCkKK3sKKyAgVUludDMyIG47CisKKyAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgZm9yIChuID0gMDsgbiA8IGxpc3QtPm1OdW1iZXJCdWZmZXJzOyArK24pIHsKKyAgICBnX2ZyZWUgKGxpc3QtPm1CdWZmZXJzW25dLm1EYXRhKTsKKyAgfQorCisgIGdfZnJlZSAobGlzdCk7Cit9CisKK2dib29sZWFuCitnc3RfY29yZV9hdWRpb19iaW5kX2RldmljZSAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbykKK3sKKyAgT1NTdGF0dXMgc3RhdHVzOworCisgIC8qIFNwZWNpZnkgd2hpY2ggZGV2aWNlIHdlJ3JlIHVzaW5nLiAqLworICBHU1RfREVCVUdfT0JKRUNUIChjb3JlX2F1ZGlvLT5vc3hidWYsICJCaW5kIEF1ZGlvVW5pdCB0byBkZXZpY2UgJWQiLAorICAgICAgKGludCkgY29yZV9hdWRpby0+ZGV2aWNlX2lkKTsKKyAgc3RhdHVzID0gQXVkaW9Vbml0U2V0UHJvcGVydHkgKGNvcmVfYXVkaW8tPmF1ZGlvdW5pdCwKKyAgICAgIGtBdWRpb091dHB1dFVuaXRQcm9wZXJ0eV9DdXJyZW50RGV2aWNlLCBrQXVkaW9Vbml0U2NvcGVfR2xvYmFsLCAwLAorICAgICAgJmNvcmVfYXVkaW8tPmRldmljZV9pZCwgc2l6ZW9mIChBdWRpb0RldmljZUlEKSk7CisgIGlmIChzdGF0dXMpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChjb3JlX2F1ZGlvLT5vc3hidWYsICJGYWlsZWQgYmluZGluZyB0byBkZXZpY2U6ICVkIiwKKyAgICAgICAgKGludCkgc3RhdHVzKTsKKyAgICBnb3RvIGF1ZGlvdW5pdF9lcnJvcjsKKyAgfQorICByZXR1cm4gVFJVRTsKKworYXVkaW91bml0X2Vycm9yOgorICBpZiAoY29yZV9hdWRpby0+cmVjQnVmZmVyTGlzdCkgeworICAgIGJ1ZmZlcl9saXN0X2ZyZWUgKGNvcmVfYXVkaW8tPnJlY0J1ZmZlckxpc3QpOworICAgIGNvcmVfYXVkaW8tPnJlY0J1ZmZlckxpc3QgPSBOVUxMOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitfY29yZV9hdWRpb19zZXRfcHJvcGVydHkgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8sIEF1ZGlvVW5pdFByb3BlcnR5SUQgaW5JRCwKKyAgICB2b2lkICppbkRhdGEsIFVJbnQzMiBpbkRhdGFTaXplKQoreworICBPU1N0YXR1cyBzdGF0dXM7CisgIEF1ZGlvVW5pdFNjb3BlIHNjb3BlOworICBBdWRpb1VuaXRFbGVtZW50IGVsZW1lbnQ7CisKKyAgc2NvcGUgPSBDT1JFX0FVRElPX0lOTkVSX1NDT1BFIChjb3JlX2F1ZGlvKTsKKyAgZWxlbWVudCA9IENPUkVfQVVESU9fRUxFTUVOVCAoY29yZV9hdWRpbyk7CisKKyAgc3RhdHVzID0KKyAgICAgIEF1ZGlvVW5pdFNldFByb3BlcnR5IChjb3JlX2F1ZGlvLT5hdWRpb3VuaXQsIGluSUQsIHNjb3BlLCBlbGVtZW50LCBpbkRhdGEsCisgICAgICBpbkRhdGFTaXplKTsKKworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb3JlX2F1ZGlvLT5vc3hidWYsCisgICAgICAgICJGYWlsZWQgdG8gc2V0IEF1ZGlvIFVuaXQgcHJvcGVydHk6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgICByZXR1cm4gRkFMU0U7OworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFRoZSBBdWRpb1VuaXQgbXVzdCBiZSB1bmluaXRpYWxpemVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgKi8KK2dib29sZWFuCitnc3RfY29yZV9hdWRpb19zZXRfY2hhbm5lbF9sYXlvdXQgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8sCisgICAgZ2ludCBjaGFubmVscywgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEF1ZGlvQ2hhbm5lbExheW91dCAqbGF5b3V0ID0gTlVMTDsKKyAgZ2Jvb2xlYW4gcmV0OworICBnc2l6ZSBsYXlvdXRTaXplOworICBnaW50IGk7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBwb3NpdGlvbnNbR1NUX09TWF9BVURJT19NQVhfQ0hBTk5FTF07CisgIGd1aW50NjQgY2hhbm5lbF9tYXNrOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChjaGFubmVscyA8PSBHU1RfT1NYX0FVRElPX01BWF9DSEFOTkVMLCBGQUxTRSk7CisKKyAgLyogRGV0ZXJtaW5lIHRoZSBjaGFubmVsIHBvc2l0aW9ucyAqLworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgY2hhbm5lbF9tYXNrID0gMDsKKyAgZ3N0X3N0cnVjdHVyZV9nZXQgKHN0cnVjdHVyZSwgImNoYW5uZWwtbWFzayIsIEdTVF9UWVBFX0JJVE1BU0ssICZjaGFubmVsX21hc2ssCisgICAgICBOVUxMKTsKKworICBpZiAoY2hhbm5lbF9tYXNrICE9IDApCisgICAgZ3N0X2F1ZGlvX2NoYW5uZWxfcG9zaXRpb25zX2Zyb21fbWFzayAoY2hhbm5lbHMsIGNoYW5uZWxfbWFzaywgcG9zaXRpb25zKTsKKworICAvKiBBdWRpb0NoYW5uZWxMYXlvdXQgbWVtYmVyIG1DaGFubmVsRGVzY3JpcHRpb25zIGlzIHZhcmlhYmxlLWxlbmd0aCBhcnJheSAqLworICBsYXlvdXRTaXplID0KKyAgICAgIEdfU1RSVUNUX09GRlNFVCAoQXVkaW9DaGFubmVsTGF5b3V0LCBtQ2hhbm5lbERlc2NyaXB0aW9uc1tjaGFubmVsc10pOworICBsYXlvdXQgPSBnX21hbGxvYyAobGF5b3V0U2l6ZSk7CisKKyAgLyogRmlsbCBvdXQgdGhlIEF1ZGlvQ2hhbm5lbExheW91dCAqLworICBsYXlvdXQtPm1DaGFubmVsTGF5b3V0VGFnID0ga0F1ZGlvQ2hhbm5lbExheW91dFRhZ19Vc2VDaGFubmVsRGVzY3JpcHRpb25zOworICBsYXlvdXQtPm1DaGFubmVsQml0bWFwID0gMDsgICAvKiBOb3QgdXNlZCAqLworICBsYXlvdXQtPm1OdW1iZXJDaGFubmVsRGVzY3JpcHRpb25zID0gY2hhbm5lbHM7CisgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisgICAgaWYgKGNoYW5uZWxfbWFzayAhPSAwKSB7CisgICAgICBsYXlvdXQtPm1DaGFubmVsRGVzY3JpcHRpb25zW2ldLm1DaGFubmVsTGFiZWwgPQorICAgICAgICAgIGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uX3RvX2NvcmVfYXVkaW8gKHBvc2l0aW9uc1tpXSwgaSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIERpc2NyZXRlIGNoYW5uZWwgbnVtYmVycyBhcmUgT1JlZCBpbnRvIHRoaXMgKi8KKyAgICAgIGxheW91dC0+bUNoYW5uZWxEZXNjcmlwdGlvbnNbaV0ubUNoYW5uZWxMYWJlbCA9CisgICAgICAgICAga0F1ZGlvQ2hhbm5lbExhYmVsX0Rpc2NyZXRlXzAgfCBpOworICAgIH0KKworICAgIC8qIE90aGVycyB1bnVzZWQgKi8KKyAgICBsYXlvdXQtPm1DaGFubmVsRGVzY3JpcHRpb25zW2ldLm1DaGFubmVsRmxhZ3MgPSBrQXVkaW9DaGFubmVsRmxhZ3NfQWxsT2ZmOworICAgIGxheW91dC0+bUNoYW5uZWxEZXNjcmlwdGlvbnNbaV0ubUNvb3JkaW5hdGVzWzBdID0gMC5mOworICAgIGxheW91dC0+bUNoYW5uZWxEZXNjcmlwdGlvbnNbaV0ubUNvb3JkaW5hdGVzWzFdID0gMC5mOworICAgIGxheW91dC0+bUNoYW5uZWxEZXNjcmlwdGlvbnNbaV0ubUNvb3JkaW5hdGVzWzJdID0gMC5mOworICB9CisKKyAgLyogU2V0cyBHU3RyZWFtZXItb3JkZXJlZCBjaGFubmVsIGxheW91dCBvbiB0aGUgaW5uZXIgc2NvcGUuCisgICAqIFJlb3JkZXJpbmcgYmV0d2VlbiB0aGUgaW5uZXIgc2NvcGUgYW5kIG91dGVyIHNjb3BlIGlzIGhhbmRsZWQKKyAgICogYnkgdGhlIEF1ZGlvIFVuaXQgaXRzZWxmLiAqLworICByZXQgPSBfY29yZV9hdWRpb19zZXRfcHJvcGVydHkgKGNvcmVfYXVkaW8sCisgICAgICBrQXVkaW9Vbml0UHJvcGVydHlfQXVkaW9DaGFubmVsTGF5b3V0LCBsYXlvdXQsIGxheW91dFNpemUpOworCisgIGdfZnJlZSAobGF5b3V0KTsKKyAgcmV0dXJuIHJldDsKK30KKworLyogVGhlIEF1ZGlvVW5pdCBtdXN0IGJlIHVuaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyAqLworZ2Jvb2xlYW4KK2dzdF9jb3JlX2F1ZGlvX3NldF9mb3JtYXQgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8sCisgICAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uIGZvcm1hdCkKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLCAiU2V0dGluZyBmb3JtYXQgZm9yIEF1ZGlvVW5pdCIpOworCisgIHJldHVybiBfY29yZV9hdWRpb19zZXRfcHJvcGVydHkgKGNvcmVfYXVkaW8sIGtBdWRpb1VuaXRQcm9wZXJ0eV9TdHJlYW1Gb3JtYXQsCisgICAgICAmZm9ybWF0LCBzaXplb2YgKEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbikpOworfQorCitnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9fb3Blbl9kZXZpY2UgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8sIE9TVHlwZSBzdWJfdHlwZSwKKyAgICBjb25zdCBnY2hhciAqIGFkZXNjKQoreworICBBdWRpb0NvbXBvbmVudERlc2NyaXB0aW9uIGRlc2M7CisgIEF1ZGlvQ29tcG9uZW50IGNvbXA7CisgIE9TU3RhdHVzIHN0YXR1czsKKyAgQXVkaW9Vbml0IHVuaXQ7CisgIFVJbnQzMiBlbmFibGVJTzsKKworICBkZXNjLmNvbXBvbmVudFR5cGUgPSBrQXVkaW9Vbml0VHlwZV9PdXRwdXQ7CisgIGRlc2MuY29tcG9uZW50U3ViVHlwZSA9IHN1Yl90eXBlOworICBkZXNjLmNvbXBvbmVudE1hbnVmYWN0dXJlciA9IGtBdWRpb1VuaXRNYW51ZmFjdHVyZXJfQXBwbGU7CisgIGRlc2MuY29tcG9uZW50RmxhZ3MgPSAwOworICBkZXNjLmNvbXBvbmVudEZsYWdzTWFzayA9IDA7CisKKyAgY29tcCA9IEF1ZGlvQ29tcG9uZW50RmluZE5leHQgKE5VTEwsICZkZXNjKTsKKworICBpZiAoY29tcCA9PSBOVUxMKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb3JlX2F1ZGlvLT5vc3hidWYsICJDb3VsZG4ndCBmaW5kICVzIGNvbXBvbmVudCIsCisgICAgICAgIGFkZXNjKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBzdGF0dXMgPSBBdWRpb0NvbXBvbmVudEluc3RhbmNlTmV3IChjb21wLCAmdW5pdCk7CisKKyAgaWYgKHN0YXR1cykgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwgIkNvdWxkbid0IG9wZW4gJXMgY29tcG9uZW50ICVkIiwKKyAgICAgICAgYWRlc2MsIChpbnQpIHN0YXR1cyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKGNvcmVfYXVkaW8tPmlzX3NyYykgeworICAgIC8qIGVuYWJsZSBpbnB1dCAqLworICAgIGVuYWJsZUlPID0gMTsKKyAgICBzdGF0dXMgPSBBdWRpb1VuaXRTZXRQcm9wZXJ0eSAodW5pdCwga0F1ZGlvT3V0cHV0VW5pdFByb3BlcnR5X0VuYWJsZUlPLCBrQXVkaW9Vbml0U2NvcGVfSW5wdXQsIDEsICAgLyogMSA9IGlucHV0IGVsZW1lbnQgKi8KKyAgICAgICAgJmVuYWJsZUlPLCBzaXplb2YgKGVuYWJsZUlPKSk7CisKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICBBdWRpb0NvbXBvbmVudEluc3RhbmNlRGlzcG9zZSAodW5pdCk7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwgIkZhaWxlZCB0byBlbmFibGUgaW5wdXQ6ICVkIiwKKyAgICAgICAgICAoaW50KSBzdGF0dXMpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIGRpc2FibGUgb3V0cHV0ICovCisgICAgZW5hYmxlSU8gPSAwOworICAgIHN0YXR1cyA9IEF1ZGlvVW5pdFNldFByb3BlcnR5ICh1bml0LCBrQXVkaW9PdXRwdXRVbml0UHJvcGVydHlfRW5hYmxlSU8sIGtBdWRpb1VuaXRTY29wZV9PdXRwdXQsIDAsICAvKiAwID0gb3V0cHV0IGVsZW1lbnQgKi8KKyAgICAgICAgJmVuYWJsZUlPLCBzaXplb2YgKGVuYWJsZUlPKSk7CisKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICBBdWRpb0NvbXBvbmVudEluc3RhbmNlRGlzcG9zZSAodW5pdCk7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwgIkZhaWxlZCB0byBkaXNhYmxlIG91dHB1dDogJWQiLAorICAgICAgICAgIChpbnQpIHN0YXR1cyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLCAiQ3JlYXRlZCAlcyBBdWRpb1VuaXQ6ICVwIiwgYWRlc2MsCisgICAgICB1bml0KTsKKyAgY29yZV9hdWRpby0+YXVkaW91bml0ID0gdW5pdDsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0F1ZGlvQ2hhbm5lbExhYmVsCitnc3RfYXVkaW9fY2hhbm5lbF9wb3NpdGlvbl90b19jb3JlX2F1ZGlvIChHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbgorICAgIHBvc2l0aW9uLCBpbnQgY2hhbm5lbCkKK3sKKyAgc3dpdGNoIChwb3NpdGlvbikgeworICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVDoKKyAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGFiZWxfTGVmdDsKKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUOgorICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYWJlbF9SaWdodDsKKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfQ0VOVEVSOgorICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYWJlbF9DZW50ZXJTdXJyb3VuZDsKKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfTEVGVDoKKyAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGFiZWxfTGVmdFN1cnJvdW5kOworICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVDoKKyAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGFiZWxfUmlnaHRTdXJyb3VuZDsKKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0xGRTE6CisgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExhYmVsX0xGRVNjcmVlbjsKKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUjoKKyAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGFiZWxfQ2VudGVyOworICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU0lERV9MRUZUOgorICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYWJlbF9MZWZ0U3Vycm91bmREaXJlY3Q7CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hUOgorICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYWJlbF9SaWdodFN1cnJvdW5kRGlyZWN0OworICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVF9PRl9DRU5URVI6CisgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExhYmVsX0xlZnRDZW50ZXI7CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVF9PRl9DRU5URVI6CisgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExhYmVsX1JpZ2h0Q2VudGVyOworICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfTEVGVDoKKyAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGFiZWxfVG9wQmFja0xlZnQ7CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9DRU5URVI6CisgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExhYmVsX1RvcEJhY2tDZW50ZXI7CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9SSUdIVDoKKyAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGFiZWxfVG9wQmFja1JpZ2h0OworICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fV0lERV9MRUZUOgorICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYWJlbF9MZWZ0V2lkZTsKKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1dJREVfUklHSFQ6CisgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExhYmVsX1JpZ2h0V2lkZTsKKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0xGRTI6CisgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExhYmVsX0xGRTI7CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfRlJPTlRfTEVGVDoKKyAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGFiZWxfVmVydGljYWxIZWlnaHRMZWZ0OworICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX1JJR0hUOgorICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYWJlbF9WZXJ0aWNhbEhlaWdodFJpZ2h0OworICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX0NFTlRFUjoKKyAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGFiZWxfVmVydGljYWxIZWlnaHRDZW50ZXI7CisKKyAgICAgIC8qIFNwZWNpYWwgcG9zaXRpb24gdmFsdWVzICovCisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9OT05FOgorICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYWJlbF9EaXNjcmV0ZV8wIHwgY2hhbm5lbDsKKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX01PTk86CisgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExhYmVsX01vbm87CisKKyAgICAgIC8qIEZvbGxvd2luZyBwb3NpdGlvbnMgYXJlIHVubWFwcGVkIC0tCisgICAgICAgKiBpLmUuIG1hcHBlZCB0byBrQXVkaW9DaGFubmVsTGFiZWxfVW5rbm93bjogKi8KKyAgICBjYXNlIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9DRU5URVI6CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfU0lERV9MRUZUOgorICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX1NJREVfUklHSFQ6CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9CT1RUT01fRlJPTlRfQ0VOVEVSOgorICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fQk9UVE9NX0ZST05UX0xFRlQ6CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9CT1RUT01fRlJPTlRfUklHSFQ6CisgICAgY2FzZSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TVVJST1VORF9MRUZUOgorICAgIGNhc2UgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fU1VSUk9VTkRfUklHSFQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGFiZWxfVW5rbm93bjsKKyAgfQorfQorCisvKiBQZXJmb3JtcyBhIGJlc3QtZWZmb3J0IGNvbnZlcnNpb24uICdjaGFubmVsJyBpcyB1c2VkIGZvciB3YXJuaW5ncyBvbmx5LiAqLworR3N0QXVkaW9DaGFubmVsUG9zaXRpb24KK2dzdF9jb3JlX2F1ZGlvX2NoYW5uZWxfbGFiZWxfdG9fZ3N0IChBdWRpb0NoYW5uZWxMYWJlbCBsYWJlbCwKKyAgICBpbnQgY2hhbm5lbCwgZ2Jvb2xlYW4gd2FybikKK3sKKyAgc3dpdGNoIChsYWJlbCkgeworICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX0xlZnQ6CisgICAgICByZXR1cm4gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVDsKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9SaWdodDoKKyAgICAgIHJldHVybiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVDsKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9DZW50ZXI6CisgICAgICByZXR1cm4gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSOworICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX0xGRVNjcmVlbjoKKyAgICAgIHJldHVybiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9MRkUxOworICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX0xlZnRTdXJyb3VuZDoKKyAgICAgIHJldHVybiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0xFRlQ7CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfUmlnaHRTdXJyb3VuZDoKKyAgICAgIHJldHVybiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX1JJR0hUOworICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX0xlZnRTdXJyb3VuZERpcmVjdDoKKyAgICAgIHJldHVybiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQ7CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfUmlnaHRTdXJyb3VuZERpcmVjdDoKKyAgICAgIHJldHVybiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hUOworICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX0NlbnRlclN1cnJvdW5kOgorICAgICAgcmV0dXJuIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfQ0VOVEVSOworICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX0xlZnRDZW50ZXI6CisgICAgICByZXR1cm4gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVF9PRl9DRU5URVI7CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfUmlnaHRDZW50ZXI6CisgICAgICByZXR1cm4gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFRfT0ZfQ0VOVEVSOworICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX1RvcEJhY2tMZWZ0OgorICAgICAgcmV0dXJuIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX0xFRlQ7CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfVG9wQmFja0NlbnRlcjoKKyAgICAgIHJldHVybiBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9UT1BfUkVBUl9DRU5URVI7CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfVG9wQmFja1JpZ2h0OgorICAgICAgcmV0dXJuIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX1JJR0hUOworICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX0xlZnRXaWRlOgorICAgICAgcmV0dXJuIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1dJREVfTEVGVDsKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9SaWdodFdpZGU6CisgICAgICByZXR1cm4gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fV0lERV9SSUdIVDsKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9MRkUyOgorICAgICAgcmV0dXJuIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0xGRTI7CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfVmVydGljYWxIZWlnaHRMZWZ0OgorICAgICAgcmV0dXJuIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9MRUZUOworICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX1ZlcnRpY2FsSGVpZ2h0UmlnaHQ6CisgICAgICByZXR1cm4gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX1JJR0hUOworICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX1ZlcnRpY2FsSGVpZ2h0Q2VudGVyOgorICAgICAgcmV0dXJuIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9DRU5URVI7CisKKyAgICAgIC8qIFNwZWNpYWwgcG9zaXRpb24gdmFsdWVzICovCisKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9Nb25vOgorICAgICAgLyogR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTU9OTyBpcyBvbmx5IGZvciAxLWNoYW5uZWwgbGF5b3V0cyAqLworICAgICAgcmV0dXJuIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0lOVkFMSUQ7CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfRGlzY3JldGU6CisgICAgICByZXR1cm4gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORTsKKworICAgICAgLyoKKyAgICAgICAgIEZvbGxvd2luZyBsYWJlbHMgYXJlIHVubWFwcGVkIC0tCisgICAgICAgICBpLmUuIG1hcHBlZCB0byBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9JTlZBTElEOgorICAgICAgICovCisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfUmVhclN1cnJvdW5kTGVmdDoKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9SZWFyU3Vycm91bmRSaWdodDoKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9Ub3BDZW50ZXJTdXJyb3VuZDoKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9MZWZ0VG90YWw6CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfUmlnaHRUb3RhbDoKKyAgICBjYXNlIGtBdWRpb0NoYW5uZWxMYWJlbF9IZWFyaW5nSW1wYWlyZWQ6CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfTmFycmF0aW9uOgorICAgIGNhc2Uga0F1ZGlvQ2hhbm5lbExhYmVsX0RpYWxvZ0NlbnRyaWNNaXg6CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfQ2VudGVyU3Vycm91bmREaXJlY3Q6CisgICAgY2FzZSBrQXVkaW9DaGFubmVsTGFiZWxfSGFwdGljOgorICAgIGRlZmF1bHQ6CisgICAgICBpZiAobGFiZWwgPj4gMTYgIT0gMCkgeyAgIC8qIGtBdWRpb0NoYW5uZWxMYWJlbF9EaXNjcmV0ZV9OICovCisgICAgICAgIC8qIG5vIHdheSB0byBzdG9yZSBkaXNjcmV0ZSBjaGFubmVsIG9yZGVyICovCisgICAgICAgIGlmICh3YXJuKQorICAgICAgICAgIEdTVF9XQVJOSU5HCisgICAgICAgICAgICAgICgiQ29yZSBBdWRpbyBjaGFubmVsICV1IGxhYmVsZWQga0F1ZGlvQ2hhbm5lbExhYmVsX0Rpc2NyZXRlXyV1IC0tIGRpc2NyZXRlIG9yZGVyIHdpbGwgYmUgbG9zdCIsCisgICAgICAgICAgICAgIGNoYW5uZWwsICgodW5zaWduZWQgaW50KSBsYWJlbCkgJiAweEZGRkYpOworICAgICAgICByZXR1cm4gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTk9ORTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh3YXJuKQorICAgICAgICAgIEdTVF9XQVJOSU5HCisgICAgICAgICAgICAgICgiQ29yZSBBdWRpbyBjaGFubmVsICV1IGhhcyB1bnN1cHBvcnRlZCBsYWJlbCAlZCBhbmQgd2lsbCBiZSBza2lwcGVkIiwKKyAgICAgICAgICAgICAgY2hhbm5lbCwgKGludCkgbGFiZWwpOworICAgICAgICByZXR1cm4gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fSU5WQUxJRDsKKyAgICAgIH0KKyAgfQorfQorCit2b2lkCitnc3RfY29yZV9hdWRpb19kdW1wX2NoYW5uZWxfbGF5b3V0IChBdWRpb0NoYW5uZWxMYXlvdXQgKiBjaGFubmVsX2xheW91dCkKK3sKKyAgVUludDMyIGk7CisKKyAgR1NUX0RFQlVHICgibUNoYW5uZWxMYXlvdXRUYWc6IDB4JWx4IiwKKyAgICAgICh1bnNpZ25lZCBsb25nKSBjaGFubmVsX2xheW91dC0+bUNoYW5uZWxMYXlvdXRUYWcpOworICBHU1RfREVCVUcgKCJtQ2hhbm5lbEJpdG1hcDogMHglbHgiLAorICAgICAgKHVuc2lnbmVkIGxvbmcpIGNoYW5uZWxfbGF5b3V0LT5tQ2hhbm5lbEJpdG1hcCk7CisgIEdTVF9ERUJVRyAoIm1OdW1iZXJDaGFubmVsRGVzY3JpcHRpb25zOiAlbHUiLAorICAgICAgKHVuc2lnbmVkIGxvbmcpIGNoYW5uZWxfbGF5b3V0LT5tTnVtYmVyQ2hhbm5lbERlc2NyaXB0aW9ucyk7CisgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsX2xheW91dC0+bU51bWJlckNoYW5uZWxEZXNjcmlwdGlvbnM7IGkrKykgeworICAgIEF1ZGlvQ2hhbm5lbERlc2NyaXB0aW9uICpjaGFubmVsX2Rlc2MgPQorICAgICAgICAmY2hhbm5lbF9sYXlvdXQtPm1DaGFubmVsRGVzY3JpcHRpb25zW2ldOworICAgIEdTVF9ERUJVRyAoIiAgbUNoYW5uZWxMYWJlbDogMHglbHggbUNoYW5uZWxGbGFnczogMHglbHggIgorICAgICAgICAibUNvb3JkaW5hdGVzWzBdOiAlZiBtQ29vcmRpbmF0ZXNbMV06ICVmICIKKyAgICAgICAgIm1Db29yZGluYXRlc1syXTogJWYiLAorICAgICAgICAodW5zaWduZWQgbG9uZykgY2hhbm5lbF9kZXNjLT5tQ2hhbm5lbExhYmVsLAorICAgICAgICAodW5zaWduZWQgbG9uZykgY2hhbm5lbF9kZXNjLT5tQ2hhbm5lbEZsYWdzLAorICAgICAgICBjaGFubmVsX2Rlc2MtPm1Db29yZGluYXRlc1swXSwgY2hhbm5lbF9kZXNjLT5tQ29vcmRpbmF0ZXNbMV0sCisgICAgICAgIGNoYW5uZWxfZGVzYy0+bUNvb3JkaW5hdGVzWzJdKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2NvbW1vbi5oIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NjAyYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvY29tbW9uLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgRmx1ZW5kbyBTLkEuIDxzdXBwb3J0QGZsdWVuZG8uY29tPgorICogICBBdXRob3JzOiBKb3NlcCBUb3JyYSBWYWxsw6hzIDxqb3NlcEBmbHVlbmRvLmNvbT4KKyAqICAgICAgICAgICAgQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDxhbW9yYWxlc0BmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImdzdG9zeGNvcmVhdWRpby5oIgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby1jaGFubmVscy5oPgorCit0eXBlZGVmIHN0cnVjdAoreworICBHTXV0ZXggbG9jazsKKyAgR0NvbmQgY29uZDsKK30gUHJvcGVydHlNdXRleDsKKworZ2Jvb2xlYW4gZ3N0X2NvcmVfYXVkaW9fYmluZF9kZXZpY2UgICAgICAgICAgICAgICAgICAgICAgIChHc3RDb3JlQXVkaW8gKmNvcmVfYXVkaW8pOworCit2b2lkIGdzdF9jb3JlX2F1ZGlvX2R1bXBfY2hhbm5lbF9sYXlvdXQgICAgICAgICAgICAgICAgICAgKEF1ZGlvQ2hhbm5lbExheW91dCAqIGNoYW5uZWxfbGF5b3V0KTsKKwordm9pZCBnc3RfY29yZV9hdWRpb19yZW1vdmVfcmVuZGVyX2NhbGxiYWNrICAgICAgICAgICAgICAgIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKTsKKworZ2Jvb2xlYW4gZ3N0X2NvcmVfYXVkaW9faW9fcHJvY19zdGFydCAgICAgICAgICAgICAgICAgICAgIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKTsKKworZ2Jvb2xlYW4gZ3N0X2NvcmVfYXVkaW9faW9fcHJvY19zdG9wICAgICAgICAgICAgICAgICAgICAgIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKTsKKworQXVkaW9CdWZmZXJMaXN0ICogYnVmZmVyX2xpc3RfYWxsb2MgICAgICAgICAgICAgICAgICAgICAgIChVSW50MzIgY2hhbm5lbHMsIFVJbnQzMiBzaXplLCBnYm9vbGVhbiBpbnRlcmxlYXZlZCk7CisKK3ZvaWQgYnVmZmVyX2xpc3RfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXVkaW9CdWZmZXJMaXN0ICogbGlzdCk7CisKK2dib29sZWFuIGdzdF9jb3JlX2F1ZGlvX3NldF9mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uIGZvcm1hdCk7CisKK2dib29sZWFuIGdzdF9jb3JlX2F1ZGlvX3NldF9jaGFubmVsX2xheW91dCAgICAgICAgICAgICAgICAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCBjaGFubmVscywgR3N0Q2FwcyAqIGNhcHMpOworCitnYm9vbGVhbiBnc3RfY29yZV9hdWRpb19vcGVuX2RldmljZSAgICAgICAgICAgICAgICAgICAgICAgKEdzdENvcmVBdWRpbyAqY29yZV9hdWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1NUeXBlIHN1Yl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqYWRlc2MpOworCitPU1N0YXR1cyBnc3RfY29yZV9hdWRpb19yZW5kZXJfbm90aWZ5ICAgICAgICAgICAgICAgICAgICAgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVW5pdFJlbmRlckFjdGlvbkZsYWdzICogaW9BY3Rpb25GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9UaW1lU3RhbXAgKiBpblRpbWVTdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGluQnVzTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5OdW1iZXJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyTGlzdCAqIGlvRGF0YSk7CisKK0F1ZGlvQ2hhbm5lbExhYmVsIGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uX3RvX2NvcmVfYXVkaW8gKEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHBvc2l0aW9uLCBpbnQgY2hhbm5lbCk7CisKK0dzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIGdzdF9jb3JlX2F1ZGlvX2NoYW5uZWxfbGFiZWxfdG9fZ3N0IChBdWRpb0NoYW5uZWxMYWJlbCBsYWJlbCwgaW50IGNoYW5uZWwsIGdib29sZWFuIHdhcm4pOwpkaWZmIC0tZ2l0IGEvc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2hhbC5jIGIvc3lzL29zeGF1ZGlvL2dzdG9zeGNvcmVhdWRpb2hhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MDVjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvaGFsLmMKQEAgLTAsMCArMSwxMjg3IEBACisvKgorICogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBGbHVlbmRvIFMuQS4gPHN1cHBvcnRAZmx1ZW5kby5jb20+CisgKiAgIEF1dGhvcnM6IEpvc2VwIFRvcnJhIFZhbGzDqHMgPGpvc2VwQGZsdWVuZG8uY29tPgorICogICAgICAgICAgICBBbmRvbmkgTW9yYWxlcyBBbGFzdHJ1ZXkgPGFtb3JhbGVzQGZsdWVuZG8uY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgICAgICAgIC8qIGZvciBnZXRwaWQgKi8KKyNpbmNsdWRlICJnc3Rvc3hhdWRpb3NpbmsuaCIKKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorX2F1ZGlvX3N5c3RlbV9zZXRfcnVubG9vcCAoQ0ZSdW5Mb29wUmVmIHJ1bkxvb3ApCit7CisgIE9TU3RhdHVzIHN0YXR1cyA9IG5vRXJyOworCisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIHJ1bmxvb3BBZGRyZXNzID0geworICAgIGtBdWRpb0hhcmR3YXJlUHJvcGVydHlSdW5Mb29wLAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5U2NvcGVHbG9iYWwsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCisgIH07CisKKyAgc3RhdHVzID0gQXVkaW9PYmplY3RTZXRQcm9wZXJ0eURhdGEgKGtBdWRpb09iamVjdFN5c3RlbU9iamVjdCwKKyAgICAgICZydW5sb29wQWRkcmVzcywgMCwgTlVMTCwgc2l6ZW9mIChDRlJ1bkxvb3BSZWYpLCAmcnVuTG9vcCk7CisgIGlmIChzdGF0dXMgPT0gbm9FcnIpIHsKKyAgICByZXMgPSBUUlVFOworICB9IGVsc2UgeworICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBzZXQgcnVubG9vcCB0byAlcDogJWQiLCBydW5Mb29wLCAoaW50KSBzdGF0dXMpOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGlubGluZSBBdWRpb0RldmljZUlECitfYXVkaW9fc3lzdGVtX2dldF9kZWZhdWx0X2RldmljZSAoZ2Jvb2xlYW4gb3V0cHV0KQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgVUludDMyIHByb3BlcnR5U2l6ZSA9IHNpemVvZiAoQXVkaW9EZXZpY2VJRCk7CisgIEF1ZGlvRGV2aWNlSUQgZGV2aWNlX2lkID0ga0F1ZGlvRGV2aWNlVW5rbm93bjsKKyAgQXVkaW9PYmplY3RQcm9wZXJ0eVNlbGVjdG9yIHByb3Bfc2VsZWN0b3I7CisKKyAgcHJvcF9zZWxlY3RvciA9IG91dHB1dCA/IGtBdWRpb0hhcmR3YXJlUHJvcGVydHlEZWZhdWx0T3V0cHV0RGV2aWNlIDoKKyAgICAgIGtBdWRpb0hhcmR3YXJlUHJvcGVydHlEZWZhdWx0SW5wdXREZXZpY2U7CisKKyAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3MgZGVmYXVsdERldmljZUFkZHJlc3MgPSB7CisgICAgcHJvcF9zZWxlY3RvciwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eVNjb3BlR2xvYmFsLAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcgorICB9OworCisgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhIChrQXVkaW9PYmplY3RTeXN0ZW1PYmplY3QsCisgICAgICAmZGVmYXVsdERldmljZUFkZHJlc3MsIDAsIE5VTEwsICZwcm9wZXJ0eVNpemUsICZkZXZpY2VfaWQpOworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgR1NUX0VSUk9SICgiZmFpbGVkIGdldHRpbmcgZGVmYXVsdCBvdXRwdXQgZGV2aWNlOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgIH0KKworICBHU1RfREVCVUcgKCJEZWZhdWx0IGRldmljZSBpZDogJXUiLCAodW5zaWduZWQpIGRldmljZV9pZCk7CisKKyAgcmV0dXJuIGRldmljZV9pZDsKK30KKworc3RhdGljIGlubGluZSBBdWRpb0RldmljZUlEICoKK19hdWRpb19zeXN0ZW1fZ2V0X2RldmljZXMgKGdpbnQgKiBuZGV2aWNlcykKK3sKKyAgT1NTdGF0dXMgc3RhdHVzID0gbm9FcnI7CisgIFVJbnQzMiBwcm9wZXJ0eVNpemUgPSAwOworICBBdWRpb0RldmljZUlEICpkZXZpY2VzID0gTlVMTDsKKworICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBhdWRpb0RldmljZXNBZGRyZXNzID0geworICAgIGtBdWRpb0hhcmR3YXJlUHJvcGVydHlEZXZpY2VzLAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5U2NvcGVHbG9iYWwsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCisgIH07CisKKyAgc3RhdHVzID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGFTaXplIChrQXVkaW9PYmplY3RTeXN0ZW1PYmplY3QsCisgICAgICAmYXVkaW9EZXZpY2VzQWRkcmVzcywgMCwgTlVMTCwgJnByb3BlcnR5U2l6ZSk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBHU1RfV0FSTklORyAoImZhaWxlZCBnZXR0aW5nIG51bWJlciBvZiBkZXZpY2VzOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAqbmRldmljZXMgPSBwcm9wZXJ0eVNpemUgLyBzaXplb2YgKEF1ZGlvRGV2aWNlSUQpOworCisgIGRldmljZXMgPSAoQXVkaW9EZXZpY2VJRCAqKSBnX21hbGxvYyAocHJvcGVydHlTaXplKTsKKyAgaWYgKGRldmljZXMpIHsKKyAgICBzdGF0dXMgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YSAoa0F1ZGlvT2JqZWN0U3lzdGVtT2JqZWN0LAorICAgICAgICAmYXVkaW9EZXZpY2VzQWRkcmVzcywgMCwgTlVMTCwgJnByb3BlcnR5U2l6ZSwgZGV2aWNlcyk7CisgICAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgICAgR1NUX1dBUk5JTkcgKCJmYWlsZWQgZ2V0dGluZyB0aGUgbGlzdCBvZiBkZXZpY2VzOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgICBnX2ZyZWUgKGRldmljZXMpOworICAgICAgKm5kZXZpY2VzID0gMDsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICByZXR1cm4gZGV2aWNlczsKK30KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorX2F1ZGlvX2RldmljZV9pc19hbGl2ZSAoQXVkaW9EZXZpY2VJRCBkZXZpY2VfaWQsIGdib29sZWFuIG91dHB1dCkKK3sKKyAgT1NTdGF0dXMgc3RhdHVzID0gbm9FcnI7CisgIGludCBhbGl2ZSA9IEZBTFNFOworICBVSW50MzIgcHJvcGVydHlTaXplID0gc2l6ZW9mIChhbGl2ZSk7CisgIEF1ZGlvT2JqZWN0UHJvcGVydHlTY29wZSBwcm9wX3Njb3BlOworCisgIHByb3Bfc2NvcGUgPSBvdXRwdXQgPyBrQXVkaW9EZXZpY2VQcm9wZXJ0eVNjb3BlT3V0cHV0IDoKKyAgICAgIGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVJbnB1dDsKKworICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBhdWRpb0RldmljZUFsaXZlQWRkcmVzcyA9IHsKKyAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eURldmljZUlzQWxpdmUsCisgICAgcHJvcF9zY29wZSwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKKyAgfTsKKworICBzdGF0dXMgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YSAoZGV2aWNlX2lkLAorICAgICAgJmF1ZGlvRGV2aWNlQWxpdmVBZGRyZXNzLCAwLCBOVUxMLCAmcHJvcGVydHlTaXplLCAmYWxpdmUpOworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgYWxpdmUgPSBGQUxTRTsKKyAgfQorCisgIHJldHVybiBhbGl2ZTsKK30KKworc3RhdGljIGlubGluZSBndWludAorX2F1ZGlvX2RldmljZV9nZXRfbGF0ZW5jeSAoQXVkaW9EZXZpY2VJRCBkZXZpY2VfaWQpCit7CisgIE9TU3RhdHVzIHN0YXR1cyA9IG5vRXJyOworICBVSW50MzIgbGF0ZW5jeSA9IDA7CisgIFVJbnQzMiBwcm9wZXJ0eVNpemUgPSBzaXplb2YgKGxhdGVuY3kpOworCisgIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIGF1ZGlvRGV2aWNlTGF0ZW5jeUFkZHJlc3MgPSB7CisgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlMYXRlbmN5LAorICAgIGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVPdXRwdXQsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCisgIH07CisKKyAgc3RhdHVzID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGEgKGRldmljZV9pZCwKKyAgICAgICZhdWRpb0RldmljZUxhdGVuY3lBZGRyZXNzLCAwLCBOVUxMLCAmcHJvcGVydHlTaXplLCAmbGF0ZW5jeSk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBHU1RfRVJST1IgKCJmYWlsZWQgdG8gZ2V0IGxhdGVuY3k6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgICBsYXRlbmN5ID0gLTE7CisgIH0KKworICByZXR1cm4gbGF0ZW5jeTsKK30KKworc3RhdGljIGlubGluZSBwaWRfdAorX2F1ZGlvX2RldmljZV9nZXRfaG9nIChBdWRpb0RldmljZUlEIGRldmljZV9pZCkKK3sKKyAgT1NTdGF0dXMgc3RhdHVzID0gbm9FcnI7CisgIHBpZF90IGhvZ19waWQ7CisgIFVJbnQzMiBwcm9wZXJ0eVNpemUgPSBzaXplb2YgKGhvZ19waWQpOworCisgIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIGF1ZGlvRGV2aWNlSG9nTW9kZUFkZHJlc3MgPSB7CisgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlIb2dNb2RlLAorICAgIGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVPdXRwdXQsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCisgIH07CisKKyAgc3RhdHVzID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGEgKGRldmljZV9pZCwKKyAgICAgICZhdWRpb0RldmljZUhvZ01vZGVBZGRyZXNzLCAwLCBOVUxMLCAmcHJvcGVydHlTaXplLCAmaG9nX3BpZCk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBHU1RfRVJST1IgKCJmYWlsZWQgdG8gZ2V0IGhvZzogJWQiLCAoaW50KSBzdGF0dXMpOworICAgIGhvZ19waWQgPSAtMTsKKyAgfQorCisgIHJldHVybiBob2dfcGlkOworfQorCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitfYXVkaW9fZGV2aWNlX3NldF9ob2cgKEF1ZGlvRGV2aWNlSUQgZGV2aWNlX2lkLCBwaWRfdCBob2dfcGlkKQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgVUludDMyIHByb3BlcnR5U2l6ZSA9IHNpemVvZiAoaG9nX3BpZCk7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworCisgIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIGF1ZGlvRGV2aWNlSG9nTW9kZUFkZHJlc3MgPSB7CisgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlIb2dNb2RlLAorICAgIGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVPdXRwdXQsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCisgIH07CisKKyAgc3RhdHVzID0gQXVkaW9PYmplY3RTZXRQcm9wZXJ0eURhdGEgKGRldmljZV9pZCwKKyAgICAgICZhdWRpb0RldmljZUhvZ01vZGVBZGRyZXNzLCAwLCBOVUxMLCBwcm9wZXJ0eVNpemUsICZob2dfcGlkKTsKKworICBpZiAoc3RhdHVzID09IG5vRXJyKSB7CisgICAgcmVzID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfRVJST1IgKCJmYWlsZWQgdG8gc2V0IGhvZzogJWQiLCAoaW50KSBzdGF0dXMpOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorX2F1ZGlvX2RldmljZV9zZXRfbWl4aW5nIChBdWRpb0RldmljZUlEIGRldmljZV9pZCwgZ2Jvb2xlYW4gZW5hYmxlX21peCkKK3sKKyAgT1NTdGF0dXMgc3RhdHVzID0gbm9FcnI7CisgIFVJbnQzMiBwcm9wZXJ0eVNpemUgPSAwLCBjYW5fbWl4ID0gZW5hYmxlX21peDsKKyAgQm9vbGVhbiB3cml0YWJsZSA9IEZBTFNFOworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKworICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBhdWRpb0RldmljZVN1cHBvcnRzTWl4aW5nQWRkcmVzcyA9IHsKKyAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eVN1cHBvcnRzTWl4aW5nLAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5U2NvcGVHbG9iYWwsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCisgIH07CisKKyAgaWYgKEF1ZGlvT2JqZWN0SGFzUHJvcGVydHkgKGRldmljZV9pZCwgJmF1ZGlvRGV2aWNlU3VwcG9ydHNNaXhpbmdBZGRyZXNzKSkgeworICAgIC8qIFNldCBtaXhhYmxlIHRvIGZhbHNlIGlmIHdlIGFyZSBhbGxvd2VkIHRvICovCisgICAgc3RhdHVzID0gQXVkaW9PYmplY3RJc1Byb3BlcnR5U2V0dGFibGUgKGRldmljZV9pZCwKKyAgICAgICAgJmF1ZGlvRGV2aWNlU3VwcG9ydHNNaXhpbmdBZGRyZXNzLCAmd3JpdGFibGUpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgIEdTVF9ERUJVRyAoIkF1ZGlvT2JqZWN0SXNQcm9wZXJ0eVNldHRhYmxlOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgfQorICAgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhU2l6ZSAoZGV2aWNlX2lkLAorICAgICAgICAmYXVkaW9EZXZpY2VTdXBwb3J0c01peGluZ0FkZHJlc3MsIDAsIE5VTEwsICZwcm9wZXJ0eVNpemUpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgIEdTVF9ERUJVRyAoIkF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhU2l6ZTogJWQiLCAoaW50KSBzdGF0dXMpOworICAgIH0KKyAgICBzdGF0dXMgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YSAoZGV2aWNlX2lkLAorICAgICAgICAmYXVkaW9EZXZpY2VTdXBwb3J0c01peGluZ0FkZHJlc3MsIDAsIE5VTEwsICZwcm9wZXJ0eVNpemUsICZjYW5fbWl4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICBHU1RfREVCVUcgKCJBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YTogJWQiLCAoaW50KSBzdGF0dXMpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgPT0gbm9FcnIgJiYgd3JpdGFibGUpIHsKKyAgICAgIGNhbl9taXggPSBlbmFibGVfbWl4OworICAgICAgc3RhdHVzID0gQXVkaW9PYmplY3RTZXRQcm9wZXJ0eURhdGEgKGRldmljZV9pZCwKKyAgICAgICAgICAmYXVkaW9EZXZpY2VTdXBwb3J0c01peGluZ0FkZHJlc3MsIDAsIE5VTEwsIHByb3BlcnR5U2l6ZSwgJmNhbl9taXgpOworICAgICAgcmVzID0gVFJVRTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgICBHU1RfRVJST1IgKCJmYWlsZWQgdG8gc2V0IG1peG1vZGU6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHICgicHJvcGVydHkgbm90IGZvdW5kLCBtaXhpbmcgY291ZGxuJ3QgYmUgY2hhbmdlZCIpOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGlubGluZSBnY2hhciAqCitfYXVkaW9fZGV2aWNlX2dldF9uYW1lIChBdWRpb0RldmljZUlEIGRldmljZV9pZCwgZ2Jvb2xlYW4gb3V0cHV0KQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgVUludDMyIHByb3BlcnR5U2l6ZSA9IDA7CisgIGdjaGFyICpkZXZpY2VfbmFtZSA9IE5VTEw7CisgIEF1ZGlvT2JqZWN0UHJvcGVydHlTY29wZSBwcm9wX3Njb3BlOworCisgIHByb3Bfc2NvcGUgPSBvdXRwdXQgPyBrQXVkaW9EZXZpY2VQcm9wZXJ0eVNjb3BlT3V0cHV0IDoKKyAgICAgIGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVJbnB1dDsKKworICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBkZXZpY2VOYW1lQWRkcmVzcyA9IHsKKyAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eURldmljZU5hbWUsCisgICAgcHJvcF9zY29wZSwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKKyAgfTsKKworICAvKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgZGV2aWNlIG5hbWUgKi8KKyAgc3RhdHVzID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGFTaXplIChkZXZpY2VfaWQsCisgICAgICAmZGV2aWNlTmFtZUFkZHJlc3MsIDAsIE5VTEwsICZwcm9wZXJ0eVNpemUpOworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIC8qIEdldCB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlICovCisgIGRldmljZV9uYW1lID0gKGdjaGFyICopIGdfbWFsbG9jIChwcm9wZXJ0eVNpemUpOworICBzdGF0dXMgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YSAoZGV2aWNlX2lkLAorICAgICAgJmRldmljZU5hbWVBZGRyZXNzLCAwLCBOVUxMLCAmcHJvcGVydHlTaXplLCBkZXZpY2VfbmFtZSk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBnX2ZyZWUgKGRldmljZV9uYW1lKTsKKyAgICBkZXZpY2VfbmFtZSA9IE5VTEw7CisgIH0KKworYmVhY2g6CisgIHJldHVybiBkZXZpY2VfbmFtZTsKK30KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorX2F1ZGlvX2RldmljZV9oYXNfb3V0cHV0IChBdWRpb0RldmljZUlEIGRldmljZV9pZCkKK3sKKyAgT1NTdGF0dXMgc3RhdHVzID0gbm9FcnI7CisgIFVJbnQzMiBwcm9wZXJ0eVNpemU7CisKKyAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3Mgc3RyZWFtc0FkZHJlc3MgPSB7CisgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlTdHJlYW1zLAorICAgIGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVPdXRwdXQsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCisgIH07CisKKyAgc3RhdHVzID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGFTaXplIChkZXZpY2VfaWQsCisgICAgICAmc3RyZWFtc0FkZHJlc3MsIDAsIE5VTEwsICZwcm9wZXJ0eVNpemUpOworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChwcm9wZXJ0eVNpemUgPT0gMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjaWZkZWYgR1NUX0NPUkVfQVVESU9fREVCVUcKK3N0YXRpYyBBdWRpb0NoYW5uZWxMYXlvdXQgKgorZ3N0X2NvcmVfYXVkaW9fYXVkaW9fZGV2aWNlX2dldF9jaGFubmVsX2xheW91dCAoQXVkaW9EZXZpY2VJRCBkZXZpY2VfaWQsCisgICAgZ2Jvb2xlYW4gb3V0cHV0KQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgVUludDMyIHByb3BlcnR5U2l6ZSA9IDA7CisgIEF1ZGlvQ2hhbm5lbExheW91dCAqbGF5b3V0ID0gTlVMTDsKKyAgQXVkaW9PYmplY3RQcm9wZXJ0eVNjb3BlIHByb3Bfc2NvcGU7CisKKyAgcHJvcF9zY29wZSA9IG91dHB1dCA/IGtBdWRpb0RldmljZVByb3BlcnR5U2NvcGVPdXRwdXQgOgorICAgICAga0F1ZGlvRGV2aWNlUHJvcGVydHlTY29wZUlucHV0OworCisgIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIGNoYW5uZWxMYXlvdXRBZGRyZXNzID0geworICAgIGtBdWRpb0RldmljZVByb3BlcnR5UHJlZmVycmVkQ2hhbm5lbExheW91dCwKKyAgICBwcm9wX3Njb3BlLAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcgorICB9OworCisgIC8qIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBkZWZhdWx0IGNoYW5uZWwgbGF5b3V0IHN0cnVjdHVyZSAqLworICBzdGF0dXMgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YVNpemUgKGRldmljZV9pZCwKKyAgICAgICZjaGFubmVsTGF5b3V0QWRkcmVzcywgMCwgTlVMTCwgJnByb3BlcnR5U2l6ZSk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBHU1RfRVJST1IgKCJmYWlsZWQgdG8gZ2V0IHByZWZlcnJlZCBsYXlvdXQ6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgLyogR2V0IHRoZSBkZWZhdWx0IGNoYW5uZWwgbGF5b3V0IG9mIHRoZSBkZXZpY2UgKi8KKyAgbGF5b3V0ID0gKEF1ZGlvQ2hhbm5lbExheW91dCAqKSBnX21hbGxvYyAocHJvcGVydHlTaXplKTsKKyAgc3RhdHVzID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGEgKGRldmljZV9pZCwKKyAgICAgICZjaGFubmVsTGF5b3V0QWRkcmVzcywgMCwgTlVMTCwgJnByb3BlcnR5U2l6ZSwgbGF5b3V0KTsKKyAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgIEdTVF9FUlJPUiAoImZhaWxlZCB0byBnZXQgcHJlZmVycmVkIGxheW91dDogJWQiLCAoaW50KSBzdGF0dXMpOworICAgIGdvdG8gZmFpbGVkOworICB9CisKKyAgaWYgKGxheW91dC0+bUNoYW5uZWxMYXlvdXRUYWcgPT0ga0F1ZGlvQ2hhbm5lbExheW91dFRhZ19Vc2VDaGFubmVsQml0bWFwKSB7CisgICAgLyogYml0bWFwIGRlZmluZWQgY2hhbm5lbGxheW91dCAqLworICAgIHN0YXR1cyA9CisgICAgICAgIEF1ZGlvRm9ybWF0R2V0UHJvcGVydHkgKGtBdWRpb0Zvcm1hdFByb3BlcnR5X0NoYW5uZWxMYXlvdXRGb3JCaXRtYXAsCisgICAgICAgIHNpemVvZiAoVUludDMyKSwgJmxheW91dC0+bUNoYW5uZWxCaXRtYXAsICZwcm9wZXJ0eVNpemUsIGxheW91dCk7CisgICAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgICAgR1NUX0VSUk9SICgiZmFpbGVkIHRvIGdldCBsYXlvdXQgZm9yIGJpdG1hcDogJWQiLCAoaW50KSBzdGF0dXMpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICB9IGVsc2UgaWYgKGxheW91dC0+bUNoYW5uZWxMYXlvdXRUYWcgIT0KKyAgICAgIGtBdWRpb0NoYW5uZWxMYXlvdXRUYWdfVXNlQ2hhbm5lbERlc2NyaXB0aW9ucykgeworICAgIC8qIGxheW91dHRhZ3MgZGVmaW5lZCBjaGFubmVsbGF5b3V0ICovCisgICAgc3RhdHVzID0gQXVkaW9Gb3JtYXRHZXRQcm9wZXJ0eSAoa0F1ZGlvRm9ybWF0UHJvcGVydHlfQ2hhbm5lbExheW91dEZvclRhZywKKyAgICAgICAgc2l6ZW9mIChBdWRpb0NoYW5uZWxMYXlvdXRUYWcpLCAmbGF5b3V0LT5tQ2hhbm5lbExheW91dFRhZywKKyAgICAgICAgJnByb3BlcnR5U2l6ZSwgbGF5b3V0KTsKKyAgICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgICBHU1RfRVJST1IgKCJmYWlsZWQgdG8gZ2V0IGxheW91dCBmb3IgdGFnOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgIH0KKworICBnc3RfY29yZV9hdWRpb19kdW1wX2NoYW5uZWxfbGF5b3V0IChsYXlvdXQpOworCitiZWFjaDoKKyAgcmV0dXJuIGxheW91dDsKKworZmFpbGVkOgorICBnX2ZyZWUgKGxheW91dCk7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgQXVkaW9TdHJlYW1JRCAqCitfYXVkaW9fZGV2aWNlX2dldF9zdHJlYW1zIChBdWRpb0RldmljZUlEIGRldmljZV9pZCwgZ2ludCAqIG5zdHJlYW1zKQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgVUludDMyIHByb3BlcnR5U2l6ZSA9IDA7CisgIEF1ZGlvU3RyZWFtSUQgKnN0cmVhbXMgPSBOVUxMOworCisgIEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIHN0cmVhbXNBZGRyZXNzID0geworICAgIGtBdWRpb0RldmljZVByb3BlcnR5U3RyZWFtcywKKyAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eVNjb3BlT3V0cHV0LAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcgorICB9OworCisgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhU2l6ZSAoZGV2aWNlX2lkLAorICAgICAgJnN0cmVhbXNBZGRyZXNzLCAwLCBOVUxMLCAmcHJvcGVydHlTaXplKTsKKyAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgIEdTVF9XQVJOSU5HICgiZmFpbGVkIGdldHRpbmcgbnVtYmVyIG9mIHN0cmVhbXM6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgICpuc3RyZWFtcyA9IHByb3BlcnR5U2l6ZSAvIHNpemVvZiAoQXVkaW9TdHJlYW1JRCk7CisgIHN0cmVhbXMgPSAoQXVkaW9TdHJlYW1JRCAqKSBnX21hbGxvYyAocHJvcGVydHlTaXplKTsKKworICBpZiAoc3RyZWFtcykgeworICAgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhIChkZXZpY2VfaWQsCisgICAgICAgICZzdHJlYW1zQWRkcmVzcywgMCwgTlVMTCwgJnByb3BlcnR5U2l6ZSwgc3RyZWFtcyk7CisgICAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgICAgR1NUX1dBUk5JTkcgKCJmYWlsZWQgZ2V0dGluZyB0aGUgbGlzdCBvZiBzdHJlYW1zOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgICBnX2ZyZWUgKHN0cmVhbXMpOworICAgICAgKm5zdHJlYW1zID0gMDsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdHJlYW1zOworfQorCitzdGF0aWMgaW5saW5lIGd1aW50CitfYXVkaW9fc3RyZWFtX2dldF9sYXRlbmN5IChBdWRpb1N0cmVhbUlEIHN0cmVhbV9pZCkKK3sKKyAgT1NTdGF0dXMgc3RhdHVzID0gbm9FcnI7CisgIFVJbnQzMiBsYXRlbmN5OworICBVSW50MzIgcHJvcGVydHlTaXplID0gc2l6ZW9mIChsYXRlbmN5KTsKKworICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBsYXRlbmN5QWRkcmVzcyA9IHsKKyAgICBrQXVkaW9TdHJlYW1Qcm9wZXJ0eUxhdGVuY3ksCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlTY29wZUdsb2JhbCwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKKyAgfTsKKworICBzdGF0dXMgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YSAoc3RyZWFtX2lkLAorICAgICAgJmxhdGVuY3lBZGRyZXNzLCAwLCBOVUxMLCAmcHJvcGVydHlTaXplLCAmbGF0ZW5jeSk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBHU1RfRVJST1IgKCJmYWlsZWQgdG8gZ2V0IGxhdGVuY3k6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgICBsYXRlbmN5ID0gLTE7CisgIH0KKworICByZXR1cm4gbGF0ZW5jeTsKK30KKworc3RhdGljIGlubGluZSBnYm9vbGVhbgorX2F1ZGlvX3N0cmVhbV9nZXRfY3VycmVudF9mb3JtYXQgKEF1ZGlvU3RyZWFtSUQgc3RyZWFtX2lkLAorICAgIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiAqIGZvcm1hdCkKK3sKKyAgT1NTdGF0dXMgc3RhdHVzID0gbm9FcnI7CisgIFVJbnQzMiBwcm9wZXJ0eVNpemUgPSBzaXplb2YgKEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbik7CisKKyAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3MgZm9ybWF0QWRkcmVzcyA9IHsKKyAgICBrQXVkaW9TdHJlYW1Qcm9wZXJ0eVBoeXNpY2FsRm9ybWF0LAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5U2NvcGVHbG9iYWwsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCisgIH07CisKKyAgc3RhdHVzID0gQXVkaW9PYmplY3RHZXRQcm9wZXJ0eURhdGEgKHN0cmVhbV9pZCwKKyAgICAgICZmb3JtYXRBZGRyZXNzLCAwLCBOVUxMLCAmcHJvcGVydHlTaXplLCBmb3JtYXQpOworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgR1NUX0VSUk9SICgiZmFpbGVkIHRvIGdldCBjdXJyZW50IGZvcm1hdDogJWQiLCAoaW50KSBzdGF0dXMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitfYXVkaW9fc3RyZWFtX3NldF9jdXJyZW50X2Zvcm1hdCAoQXVkaW9TdHJlYW1JRCBzdHJlYW1faWQsCisgICAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uIGZvcm1hdCkKK3sKKyAgT1NTdGF0dXMgc3RhdHVzID0gbm9FcnI7CisgIFVJbnQzMiBwcm9wZXJ0eVNpemUgPSBzaXplb2YgKEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbik7CisKKyAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3MgZm9ybWF0QWRkcmVzcyA9IHsKKyAgICBrQXVkaW9TdHJlYW1Qcm9wZXJ0eVBoeXNpY2FsRm9ybWF0LAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5U2NvcGVHbG9iYWwsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCisgIH07CisKKyAgc3RhdHVzID0gQXVkaW9PYmplY3RTZXRQcm9wZXJ0eURhdGEgKHN0cmVhbV9pZCwKKyAgICAgICZmb3JtYXRBZGRyZXNzLCAwLCBOVUxMLCBwcm9wZXJ0eVNpemUsICZmb3JtYXQpOworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgR1NUX0VSUk9SICgiZmFpbGVkIHRvIHNldCBjdXJyZW50IGZvcm1hdDogJWQiLCAoaW50KSBzdGF0dXMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW5saW5lIEF1ZGlvU3RyZWFtUmFuZ2VkRGVzY3JpcHRpb24gKgorX2F1ZGlvX3N0cmVhbV9nZXRfZm9ybWF0cyAoQXVkaW9TdHJlYW1JRCBzdHJlYW1faWQsIGdpbnQgKiBuZm9ybWF0cykKK3sKKyAgT1NTdGF0dXMgc3RhdHVzID0gbm9FcnI7CisgIFVJbnQzMiBwcm9wZXJ0eVNpemUgPSAwOworICBBdWRpb1N0cmVhbVJhbmdlZERlc2NyaXB0aW9uICpmb3JtYXRzID0gTlVMTDsKKworICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBmb3JtYXRzQWRkcmVzcyA9IHsKKyAgICBrQXVkaW9TdHJlYW1Qcm9wZXJ0eUF2YWlsYWJsZVBoeXNpY2FsRm9ybWF0cywKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eVNjb3BlR2xvYmFsLAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5RWxlbWVudE1hc3RlcgorICB9OworCisgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0R2V0UHJvcGVydHlEYXRhU2l6ZSAoc3RyZWFtX2lkLAorICAgICAgJmZvcm1hdHNBZGRyZXNzLCAwLCBOVUxMLCAmcHJvcGVydHlTaXplKTsKKyAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgIEdTVF9XQVJOSU5HICgiZmFpbGVkIGdldHRpbmcgbnVtYmVyIG9mIHN0cmVhbSBmb3JtYXRzOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAqbmZvcm1hdHMgPSBwcm9wZXJ0eVNpemUgLyBzaXplb2YgKEF1ZGlvU3RyZWFtUmFuZ2VkRGVzY3JpcHRpb24pOworCisgIGZvcm1hdHMgPSAoQXVkaW9TdHJlYW1SYW5nZWREZXNjcmlwdGlvbiAqKSBnX21hbGxvYyAocHJvcGVydHlTaXplKTsKKyAgaWYgKGZvcm1hdHMpIHsKKyAgICBzdGF0dXMgPSBBdWRpb09iamVjdEdldFByb3BlcnR5RGF0YSAoc3RyZWFtX2lkLAorICAgICAgICAmZm9ybWF0c0FkZHJlc3MsIDAsIE5VTEwsICZwcm9wZXJ0eVNpemUsIGZvcm1hdHMpOworICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICAgIEdTVF9XQVJOSU5HICgiZmFpbGVkIGdldHRpbmcgdGhlIGxpc3Qgb2Ygc3RyZWFtIGZvcm1hdHM6ICVkIiwKKyAgICAgICAgICAoaW50KSBzdGF0dXMpOworICAgICAgZ19mcmVlIChmb3JtYXRzKTsKKyAgICAgICpuZm9ybWF0cyA9IDA7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZvcm1hdHM7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2Jvb2xlYW4KK19hdWRpb19zdHJlYW1faXNfc3BkaWZfYXZhaWwgKEF1ZGlvU3RyZWFtSUQgc3RyZWFtX2lkKQoreworICBBdWRpb1N0cmVhbVJhbmdlZERlc2NyaXB0aW9uICpmb3JtYXRzOworICBnaW50IGksIG5mb3JtYXRzID0gMDsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgZm9ybWF0cyA9IF9hdWRpb19zdHJlYW1fZ2V0X2Zvcm1hdHMgKHN0cmVhbV9pZCwgJm5mb3JtYXRzKTsKKyAgR1NUX0RFQlVHICgiZm91bmQgJWQgc3RyZWFtIGZvcm1hdHMiLCBuZm9ybWF0cyk7CisKKyAgaWYgKGZvcm1hdHMpIHsKKyAgICBHU1RfREVCVUcgKCJmb3JtYXRzIHN1cHBvcnRlZCBvbiBzdHJlYW0gSUQ6ICV1IiwgKHVuc2lnbmVkKSBzdHJlYW1faWQpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5mb3JtYXRzOyBpKyspIHsKKyAgICAgIEdTVF9ERUJVRyAoIiAgIiBDT1JFX0FVRElPX0ZPUk1BVCwKKyAgICAgICAgICBDT1JFX0FVRElPX0ZPUk1BVF9BUkdTIChmb3JtYXRzW2ldLm1Gb3JtYXQpKTsKKworICAgICAgaWYgKENPUkVfQVVESU9fRk9STUFUX0lTX1NQRElGIChmb3JtYXRzW2ldKSkgeworICAgICAgICByZXMgPSBUUlVFOworICAgICAgfQorICAgIH0KKyAgICBnX2ZyZWUgKGZvcm1hdHMpOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIE9TU3RhdHVzCitfYXVkaW9fc3RyZWFtX2Zvcm1hdF9saXN0ZW5lciAoQXVkaW9PYmplY3RJRCBpbk9iamVjdElELAorICAgIFVJbnQzMiBpbk51bWJlckFkZHJlc3NlcywKKyAgICBjb25zdCBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBpbkFkZHJlc3Nlc1tdLCB2b2lkICppbkNsaWVudERhdGEpCit7CisgIE9TU3RhdHVzIHN0YXR1cyA9IG5vRXJyOworICBndWludCBpOworICBQcm9wZXJ0eU11dGV4ICpwcm9wX211dGV4ID0gaW5DbGllbnREYXRhOworCisgIGZvciAoaSA9IDA7IGkgPCBpbk51bWJlckFkZHJlc3NlczsgaSsrKSB7CisgICAgaWYgKGluQWRkcmVzc2VzW2ldLm1TZWxlY3RvciA9PSBrQXVkaW9TdHJlYW1Qcm9wZXJ0eVBoeXNpY2FsRm9ybWF0KSB7CisgICAgICBnX211dGV4X2xvY2sgKCZwcm9wX211dGV4LT5sb2NrKTsKKyAgICAgIGdfY29uZF9zaWduYWwgKCZwcm9wX211dGV4LT5jb25kKTsKKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmcHJvcF9tdXRleC0+bG9jayk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChzdGF0dXMpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK19hdWRpb19zdHJlYW1fY2hhbmdlX2Zvcm1hdCAoQXVkaW9TdHJlYW1JRCBzdHJlYW1faWQsCisgICAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uIGZvcm1hdCkKK3sKKyAgT1NTdGF0dXMgc3RhdHVzID0gbm9FcnI7CisgIGdpbnQgaTsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisgIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiBjZm9ybWF0OworICBQcm9wZXJ0eU11dGV4IHByb3BfbXV0ZXg7CisKKyAgQXVkaW9PYmplY3RQcm9wZXJ0eUFkZHJlc3MgZm9ybWF0QWRkcmVzcyA9IHsKKyAgICBrQXVkaW9TdHJlYW1Qcm9wZXJ0eVBoeXNpY2FsRm9ybWF0LAorICAgIGtBdWRpb09iamVjdFByb3BlcnR5U2NvcGVHbG9iYWwsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlFbGVtZW50TWFzdGVyCisgIH07CisKKyAgR1NUX0RFQlVHICgic2V0dGluZyBzdHJlYW0gZm9ybWF0OiAiIENPUkVfQVVESU9fRk9STUFULAorICAgICAgQ09SRV9BVURJT19GT1JNQVRfQVJHUyAoZm9ybWF0KSk7CisKKyAgLyogQ29uZGl0aW9uIGJlY2F1c2UgU2V0UHJvcGVydHkgaXMgYXN5bmNocm9ub3VzICovCisgIGdfbXV0ZXhfaW5pdCAoJnByb3BfbXV0ZXgubG9jayk7CisgIGdfY29uZF9pbml0ICgmcHJvcF9tdXRleC5jb25kKTsKKworICBnX211dGV4X2xvY2sgKCZwcm9wX211dGV4LmxvY2spOworCisgIC8qIEluc3RhbGwgdGhlIHByb3BlcnR5IGxpc3RlbmVyIHRvIHNlcmlhbGl6ZSB0aGUgb3BlcmF0aW9ucyAqLworICBzdGF0dXMgPSBBdWRpb09iamVjdEFkZFByb3BlcnR5TGlzdGVuZXIgKHN0cmVhbV9pZCwgJmZvcm1hdEFkZHJlc3MsCisgICAgICBfYXVkaW9fc3RyZWFtX2Zvcm1hdF9saXN0ZW5lciwgKHZvaWQgKikgJnByb3BfbXV0ZXgpOworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgR1NUX0VSUk9SICgiQXVkaW9PYmplY3RBZGRQcm9wZXJ0eUxpc3RlbmVyIGZhaWxlZDogJWQiLCAoaW50KSBzdGF0dXMpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIC8qIENoYW5nZSB0aGUgZm9ybWF0ICovCisgIGlmICghX2F1ZGlvX3N0cmVhbV9zZXRfY3VycmVudF9mb3JtYXQgKHN0cmVhbV9pZCwgZm9ybWF0KSkgeworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIC8qIFRoZSBBdWRpb09iamVjdFNldFByb3BlcnR5IGlzIG5vdCBvbmx5IGFzeW5jaHJvbm91cworICAgKiBpdCBpcyBhbHNvIG5vdCBhdG9taWMgaW4gaXRzIGJlaGF2aW91ci4KKyAgICogVGhlcmVmb3JlIHdlIGNoZWNrIDQgdGltZXMgYmVmb3JlIHdlIHJlYWxseSBnaXZlIHVwLiAqLworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgR1RpbWVWYWwgdGltZW91dDsKKworICAgIGdfZ2V0X2N1cnJlbnRfdGltZSAoJnRpbWVvdXQpOworICAgIGdfdGltZV92YWxfYWRkICgmdGltZW91dCwgMjUwMDAwKTsKKworICAgIGlmICghZ19jb25kX3dhaXRfdW50aWwgKCZwcm9wX211dGV4LmNvbmQsICZwcm9wX211dGV4LmxvY2ssIHRpbWVvdXQudHZfc2VjKSkgeworICAgICAgR1NUX0xPRyAoInRpbWVvdXQuLi4iKTsKKyAgICB9CisKKyAgICBpZiAoX2F1ZGlvX3N0cmVhbV9nZXRfY3VycmVudF9mb3JtYXQgKHN0cmVhbV9pZCwgJmNmb3JtYXQpKSB7CisgICAgICBHU1RfREVCVUcgKCJjdXJyZW50IHN0cmVhbSBmb3JtYXQ6ICIgQ09SRV9BVURJT19GT1JNQVQsCisgICAgICAgICAgQ09SRV9BVURJT19GT1JNQVRfQVJHUyAoY2Zvcm1hdCkpOworCisgICAgICBpZiAoY2Zvcm1hdC5tU2FtcGxlUmF0ZSA9PSBmb3JtYXQubVNhbXBsZVJhdGUgJiYKKyAgICAgICAgICBjZm9ybWF0Lm1Gb3JtYXRJRCA9PSBmb3JtYXQubUZvcm1hdElEICYmCisgICAgICAgICAgY2Zvcm1hdC5tRnJhbWVzUGVyUGFja2V0ID09IGZvcm1hdC5tRnJhbWVzUGVyUGFja2V0KSB7CisgICAgICAgIC8qIFRoZSByaWdodCBmb3JtYXQgaXMgbm93IGFjdGl2ZSAqLworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoY2Zvcm1hdC5tU2FtcGxlUmF0ZSAhPSBmb3JtYXQubVNhbXBsZVJhdGUgfHwKKyAgICAgIGNmb3JtYXQubUZvcm1hdElEICE9IGZvcm1hdC5tRm9ybWF0SUQgfHwKKyAgICAgIGNmb3JtYXQubUZyYW1lc1BlclBhY2tldCAhPSBmb3JtYXQubUZyYW1lc1BlclBhY2tldCkgeworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIHJldCA9IFRSVUU7CisKK2RvbmU6CisgIC8qIFJlbW92aW5nIHRoZSBwcm9wZXJ0eSBsaXN0ZW5lciAqLworICBzdGF0dXMgPSBBdWRpb09iamVjdFJlbW92ZVByb3BlcnR5TGlzdGVuZXIgKHN0cmVhbV9pZCwKKyAgICAgICZmb3JtYXRBZGRyZXNzLCBfYXVkaW9fc3RyZWFtX2Zvcm1hdF9saXN0ZW5lciwgKHZvaWQgKikgJnByb3BfbXV0ZXgpOworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgR1NUX0VSUk9SICgiQXVkaW9PYmplY3RSZW1vdmVQcm9wZXJ0eUxpc3RlbmVyIGZhaWxlZDogJWQiLCAoaW50KSBzdGF0dXMpOworICB9CisgIC8qIERlc3Ryb3kgdGhlIGxvY2sgYW5kIGNvbmRpdGlvbiAqLworICBnX211dGV4X3VubG9jayAoJnByb3BfbXV0ZXgubG9jayk7CisgIGdfbXV0ZXhfY2xlYXIgKCZwcm9wX211dGV4LmxvY2spOworICBnX2NvbmRfY2xlYXIgKCZwcm9wX211dGV4LmNvbmQpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBPU1N0YXR1cworX2F1ZGlvX3N0cmVhbV9oYXJkd2FyZV9jaGFuZ2VkX2xpc3RlbmVyIChBdWRpb09iamVjdElEIGluT2JqZWN0SUQsCisgICAgVUludDMyIGluTnVtYmVyQWRkcmVzc2VzLAorICAgIGNvbnN0IEF1ZGlvT2JqZWN0UHJvcGVydHlBZGRyZXNzIGluQWRkcmVzc2VzW10sIHZvaWQgKmluQ2xpZW50RGF0YSkKK3sKKyAgT1NTdGF0dXMgc3RhdHVzID0gbm9FcnI7CisgIGd1aW50IGk7CisgIEdzdENvcmVBdWRpbyAqY29yZV9hdWRpbyA9IGluQ2xpZW50RGF0YTsKKworICBmb3IgKGkgPSAwOyBpIDwgaW5OdW1iZXJBZGRyZXNzZXM7IGkrKykgeworICAgIGlmIChpbkFkZHJlc3Nlc1tpXS5tU2VsZWN0b3IgPT0ga0F1ZGlvRGV2aWNlUHJvcGVydHlEZXZpY2VIYXNDaGFuZ2VkKSB7CisgICAgICBpZiAoIWdzdF9jb3JlX2F1ZGlvX2F1ZGlvX2RldmljZV9pc19zcGRpZl9hdmFpbCAoY29yZV9hdWRpby0+ZGV2aWNlX2lkKSkgeworICAgICAgICBHc3RPc3hBdWRpb1NpbmsgKnNpbmsgPQorICAgICAgICAgICAgR1NUX09TWF9BVURJT19TSU5LIChHU1RfT0JKRUNUX1BBUkVOVCAoY29yZV9hdWRpby0+b3N4YnVmKSk7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzaW5rLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAgICAgKCJTUERJRiBvdXRwdXQgbm8gbG9uZ2VyIGF2YWlsYWJsZSIpLAorICAgICAgICAgICAgKCJBdWRpbyBkZXZpY2UgaXMgcmVwb3J0aW5nIHRoYXQgU1BESUYgb3V0cHV0IGlzbid0IGF2YWlsYWJsZSIpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gKHN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2Jvb2xlYW4KK19tb25pdG9yaXplX3NwZGlmIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBwcm9wQWRkcmVzcyA9IHsKKyAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eURldmljZUhhc0NoYW5nZWQsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlTY29wZUdsb2JhbCwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKKyAgfTsKKworICAvKiBJbnN0YWxsIHRoZSBwcm9wZXJ0eSBsaXN0ZW5lciAqLworICBzdGF0dXMgPSBBdWRpb09iamVjdEFkZFByb3BlcnR5TGlzdGVuZXIgKGNvcmVfYXVkaW8tPmRldmljZV9pZCwKKyAgICAgICZwcm9wQWRkcmVzcywgX2F1ZGlvX3N0cmVhbV9oYXJkd2FyZV9jaGFuZ2VkX2xpc3RlbmVyLAorICAgICAgKHZvaWQgKikgY29yZV9hdWRpbyk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChjb3JlX2F1ZGlvLT5vc3hidWYsCisgICAgICAgICJBdWRpb09iamVjdEFkZFByb3BlcnR5TGlzdGVuZXIgZmFpbGVkOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgcmV0ID0gRkFMU0U7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitfdW5tb25pdG9yaXplX3NwZGlmIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBPU1N0YXR1cyBzdGF0dXMgPSBub0VycjsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICBBdWRpb09iamVjdFByb3BlcnR5QWRkcmVzcyBwcm9wQWRkcmVzcyA9IHsKKyAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eURldmljZUhhc0NoYW5nZWQsCisgICAga0F1ZGlvT2JqZWN0UHJvcGVydHlTY29wZUdsb2JhbCwKKyAgICBrQXVkaW9PYmplY3RQcm9wZXJ0eUVsZW1lbnRNYXN0ZXIKKyAgfTsKKworICAvKiBSZW1vdmUgdGhlIHByb3BlcnR5IGxpc3RlbmVyICovCisgIHN0YXR1cyA9IEF1ZGlvT2JqZWN0UmVtb3ZlUHJvcGVydHlMaXN0ZW5lciAoY29yZV9hdWRpby0+ZGV2aWNlX2lkLAorICAgICAgJnByb3BBZGRyZXNzLCBfYXVkaW9fc3RyZWFtX2hhcmR3YXJlX2NoYW5nZWRfbGlzdGVuZXIsCisgICAgICAodm9pZCAqKSBjb3JlX2F1ZGlvKTsKKyAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwKKyAgICAgICAgIkF1ZGlvT2JqZWN0UmVtb3ZlUHJvcGVydHlMaXN0ZW5lciBmYWlsZWQ6ICVkIiwgKGludCkgc3RhdHVzKTsKKyAgICByZXQgPSBGQUxTRTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2Jvb2xlYW4KK19vcGVuX3NwZGlmIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKyAgcGlkX3QgaG9nX3BpZCwgb3duX3BpZCA9IGdldHBpZCAoKTsKKworICAvKiBXZSBuZWVkIHRoZSBkZXZpY2UgaW4gZXhjbHVzaXZlIGFuZCBkaXNhYmxlIHRoZSBtaXhpbmcgKi8KKyAgaG9nX3BpZCA9IF9hdWRpb19kZXZpY2VfZ2V0X2hvZyAoY29yZV9hdWRpby0+ZGV2aWNlX2lkKTsKKworICBpZiAoaG9nX3BpZCAhPSAtMSAmJiBob2dfcGlkICE9IG93bl9waWQpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChjb3JlX2F1ZGlvLAorICAgICAgICAiZGV2aWNlIGlzIGN1cnJlbnRseSBpbiB1c2UgYnkgYW5vdGhlciBhcHBsaWNhdGlvbiIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGlmIChfYXVkaW9fZGV2aWNlX3NldF9ob2cgKGNvcmVfYXVkaW8tPmRldmljZV9pZCwgb3duX3BpZCkpIHsKKyAgICBjb3JlX2F1ZGlvLT5ob2dfcGlkID0gb3duX3BpZDsKKyAgfQorCisgIGlmIChfYXVkaW9fZGV2aWNlX3NldF9taXhpbmcgKGNvcmVfYXVkaW8tPmRldmljZV9pZCwgRkFMU0UpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoY29yZV9hdWRpbywgImRpc2FibGVkIG1peGluZyBvbiB0aGUgZGV2aWNlIik7CisgICAgY29yZV9hdWRpby0+ZGlzYWJsZWRfbWl4aW5nID0gVFJVRTsKKyAgfQorCisgIHJlcyA9IFRSVUU7Citkb25lOgorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitfY2xvc2Vfc3BkaWYgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIHBpZF90IGhvZ19waWQ7CisKKyAgX3VubW9uaXRvcml6ZV9zcGRpZiAoY29yZV9hdWRpbyk7CisKKyAgaWYgKGNvcmVfYXVkaW8tPnJldmVydF9mb3JtYXQpIHsKKyAgICBpZiAoIV9hdWRpb19zdHJlYW1fY2hhbmdlX2Zvcm1hdCAoY29yZV9hdWRpby0+c3RyZWFtX2lkLAorICAgICAgICAgICAgY29yZV9hdWRpby0+b3JpZ2luYWxfZm9ybWF0KSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChjb3JlX2F1ZGlvLT5vc3hidWYsICJGb3JtYXQgcmV2ZXJ0IGZhaWxlZCIpOworICAgIH0KKyAgICBjb3JlX2F1ZGlvLT5yZXZlcnRfZm9ybWF0ID0gRkFMU0U7CisgIH0KKworICBpZiAoY29yZV9hdWRpby0+ZGlzYWJsZWRfbWl4aW5nKSB7CisgICAgX2F1ZGlvX2RldmljZV9zZXRfbWl4aW5nIChjb3JlX2F1ZGlvLT5kZXZpY2VfaWQsIFRSVUUpOworICAgIGNvcmVfYXVkaW8tPmRpc2FibGVkX21peGluZyA9IEZBTFNFOworICB9CisKKyAgaWYgKGNvcmVfYXVkaW8tPmhvZ19waWQgIT0gLTEpIHsKKyAgICBob2dfcGlkID0gX2F1ZGlvX2RldmljZV9nZXRfaG9nIChjb3JlX2F1ZGlvLT5kZXZpY2VfaWQpOworICAgIGlmIChob2dfcGlkID09IGdldHBpZCAoKSkgeworICAgICAgaWYgKF9hdWRpb19kZXZpY2Vfc2V0X2hvZyAoY29yZV9hdWRpby0+ZGV2aWNlX2lkLCAtMSkpIHsKKyAgICAgICAgY29yZV9hdWRpby0+aG9nX3BpZCA9IC0xOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgT1NTdGF0dXMKK19pb19wcm9jX3NwZGlmIChBdWRpb0RldmljZUlEIGluRGV2aWNlLAorICAgIGNvbnN0IEF1ZGlvVGltZVN0YW1wICogaW5Ob3csCisgICAgY29uc3Qgdm9pZCAqaW5JbnB1dERhdGEsCisgICAgY29uc3QgQXVkaW9UaW1lU3RhbXAgKiBpblRpbWVzdGFtcCwKKyAgICBBdWRpb0J1ZmZlckxpc3QgKiBidWZmZXJMaXN0LAorICAgIGNvbnN0IEF1ZGlvVGltZVN0YW1wICogaW5PdXRwdXRUaW1lLCBHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBPU1N0YXR1cyBzdGF0dXM7CisKKyAgc3RhdHVzID0gY29yZV9hdWRpby0+ZWxlbWVudC0+aW9fcHJvYyAoY29yZV9hdWRpby0+b3N4YnVmLCBOVUxMLCBpblRpbWVzdGFtcCwKKyAgICAgIDAsIDAsIGJ1ZmZlckxpc3QpOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2Jvb2xlYW4KK19hY3F1aXJlX3NwZGlmIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvLCBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gZm9ybWF0KQoreworICBBdWRpb1N0cmVhbUlEICpzdHJlYW1zID0gTlVMTDsKKyAgZ2ludCBpLCBqLCBuc3RyZWFtcyA9IDA7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIGlmICghX29wZW5fc3BkaWYgKGNvcmVfYXVkaW8pKQorICAgIGdvdG8gZG9uZTsKKworICBzdHJlYW1zID0gX2F1ZGlvX2RldmljZV9nZXRfc3RyZWFtcyAoY29yZV9hdWRpby0+ZGV2aWNlX2lkLCAmbnN0cmVhbXMpOworCisgIGZvciAoaSA9IDA7IGkgPCBuc3RyZWFtczsgaSsrKSB7CisgICAgQXVkaW9TdHJlYW1SYW5nZWREZXNjcmlwdGlvbiAqZm9ybWF0cyA9IE5VTEw7CisgICAgZ2ludCBuZm9ybWF0cyA9IDA7CisKKyAgICBmb3JtYXRzID0gX2F1ZGlvX3N0cmVhbV9nZXRfZm9ybWF0cyAoc3RyZWFtc1tpXSwgJm5mb3JtYXRzKTsKKworICAgIGlmIChmb3JtYXRzKSB7CisgICAgICBnYm9vbGVhbiBpc19zcGRpZiA9IEZBTFNFOworCisgICAgICAvKiBDaGVjayBpZiBvbmUgb2YgdGhlIHN1cHBvcnRlZCBmb3JtYXRzIGlzIGEgZGlnaXRhbCBmb3JtYXQgKi8KKyAgICAgIGZvciAoaiA9IDA7IGogPCBuZm9ybWF0czsgaisrKSB7CisgICAgICAgIGlmIChDT1JFX0FVRElPX0ZPUk1BVF9JU19TUERJRiAoZm9ybWF0c1tqXSkpIHsKKyAgICAgICAgICBpc19zcGRpZiA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGlzX3NwZGlmKSB7CisgICAgICAgIC8qIGlmIHRoaXMgc3RyZWFtIHN1cHBvcnRzIGEgZGlnaXRhbCAoY2FjMykgZm9ybWF0LAorICAgICAgICAgKiB0aGVuIGdvIHNldCBpdC4gKi8KKyAgICAgICAgZ2ludCByZXF1ZXN0ZWRfcmF0ZV9mb3JtYXQgPSAtMTsKKyAgICAgICAgZ2ludCBjdXJyZW50X3JhdGVfZm9ybWF0ID0gLTE7CisgICAgICAgIGdpbnQgYmFja3VwX3JhdGVfZm9ybWF0ID0gLTE7CisKKyAgICAgICAgY29yZV9hdWRpby0+c3RyZWFtX2lkID0gc3RyZWFtc1tpXTsKKyAgICAgICAgY29yZV9hdWRpby0+c3RyZWFtX2lkeCA9IGk7CisKKyAgICAgICAgaWYgKCFjb3JlX2F1ZGlvLT5yZXZlcnRfZm9ybWF0KSB7CisgICAgICAgICAgaWYgKCFfYXVkaW9fc3RyZWFtX2dldF9jdXJyZW50X2Zvcm1hdCAoY29yZV9hdWRpby0+c3RyZWFtX2lkLAorICAgICAgICAgICAgICAgICAgJmNvcmVfYXVkaW8tPm9yaWdpbmFsX2Zvcm1hdCkpIHsKKyAgICAgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLAorICAgICAgICAgICAgICAgICJmb3JtYXQgY291bGQgbm90IGJlIHNhdmVkIik7CisgICAgICAgICAgICBnX2ZyZWUgKGZvcm1hdHMpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIGNvcmVfYXVkaW8tPnJldmVydF9mb3JtYXQgPSBUUlVFOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG5mb3JtYXRzOyBqKyspIHsKKyAgICAgICAgICBpZiAoQ09SRV9BVURJT19GT1JNQVRfSVNfU1BESUYgKGZvcm1hdHNbal0pKSB7CisgICAgICAgICAgICBHU1RfTE9HX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLAorICAgICAgICAgICAgICAgICJmb3VuZCBzdHJlYW0gZm9ybWF0OiAiIENPUkVfQVVESU9fRk9STUFULAorICAgICAgICAgICAgICAgIENPUkVfQVVESU9fRk9STUFUX0FSR1MgKGZvcm1hdHNbal0ubUZvcm1hdCkpOworCisgICAgICAgICAgICBpZiAoZm9ybWF0c1tqXS5tRm9ybWF0Lm1TYW1wbGVSYXRlID09IGZvcm1hdC5tU2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgICByZXF1ZXN0ZWRfcmF0ZV9mb3JtYXQgPSBqOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0c1tqXS5tRm9ybWF0Lm1TYW1wbGVSYXRlID09CisgICAgICAgICAgICAgICAgY29yZV9hdWRpby0+b3JpZ2luYWxfZm9ybWF0Lm1TYW1wbGVSYXRlKSB7CisgICAgICAgICAgICAgIGN1cnJlbnRfcmF0ZV9mb3JtYXQgPSBqOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKGJhY2t1cF9yYXRlX2Zvcm1hdCA8IDAgfHwKKyAgICAgICAgICAgICAgICAgIGZvcm1hdHNbal0ubUZvcm1hdC5tU2FtcGxlUmF0ZSA+CisgICAgICAgICAgICAgICAgICBmb3JtYXRzW2JhY2t1cF9yYXRlX2Zvcm1hdF0ubUZvcm1hdC5tU2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgICAgIGJhY2t1cF9yYXRlX2Zvcm1hdCA9IGo7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVxdWVzdGVkX3JhdGVfZm9ybWF0ID49IDApIHsKKyAgICAgICAgICAvKiBXZSBwcmVmZXIgdG8gb3V0cHV0IGF0IHRoZSByYXRlIG9mIHRoZSBvcmlnaW5hbCBhdWRpbyAqLworICAgICAgICAgIGNvcmVfYXVkaW8tPnN0cmVhbV9mb3JtYXQgPSBmb3JtYXRzW3JlcXVlc3RlZF9yYXRlX2Zvcm1hdF0ubUZvcm1hdDsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50X3JhdGVfZm9ybWF0ID49IDApIHsKKyAgICAgICAgICAvKiBJZiBub3QgcG9zc2libGUsIHdlIHdpbGwgdHJ5IHRvIHVzZSB0aGUgY3VycmVudCByYXRlICovCisgICAgICAgICAgY29yZV9hdWRpby0+c3RyZWFtX2Zvcm1hdCA9IGZvcm1hdHNbY3VycmVudF9yYXRlX2Zvcm1hdF0ubUZvcm1hdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBBbmQgaWYgd2UgaGF2ZSB0bywgYW55IGRpZ2l0YWwgZm9ybWF0IHdpbGwgYmUganVzdAorICAgICAgICAgICAqIGZpbmUgKGhpZ2hlc3QgcmF0ZSBwb3NzaWJsZSkgKi8KKyAgICAgICAgICBjb3JlX2F1ZGlvLT5zdHJlYW1fZm9ybWF0ID0gZm9ybWF0c1tiYWNrdXBfcmF0ZV9mb3JtYXRdLm1Gb3JtYXQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdfZnJlZSAoZm9ybWF0cyk7CisgICAgfQorICB9CisgIGdfZnJlZSAoc3RyZWFtcyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoY29yZV9hdWRpbywKKyAgICAgICJvcmlnaW5hbCBzdHJlYW0gZm9ybWF0OiAiIENPUkVfQVVESU9fRk9STUFULAorICAgICAgQ09SRV9BVURJT19GT1JNQVRfQVJHUyAoY29yZV9hdWRpby0+b3JpZ2luYWxfZm9ybWF0KSk7CisKKyAgaWYgKCFfYXVkaW9fc3RyZWFtX2NoYW5nZV9mb3JtYXQgKGNvcmVfYXVkaW8tPnN0cmVhbV9pZCwKKyAgICAgICAgICBjb3JlX2F1ZGlvLT5zdHJlYW1fZm9ybWF0KSkKKyAgICBnb3RvIGRvbmU7CisKKyAgcmV0ID0gVFJVRTsKKworZG9uZToKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfcmVtb3ZlX3JlbmRlcl9zcGRpZl9jYWxsYmFjayAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbykKK3sKKyAgT1NTdGF0dXMgc3RhdHVzOworCisgIC8qIERlYWN0aXZhdGUgdGhlIHJlbmRlciBjYWxsYmFjayBieSBjYWxsaW5nCisgICAqIEF1ZGlvRGV2aWNlRGVzdHJveUlPUHJvY0lEICovCisgIHN0YXR1cyA9CisgICAgICBBdWRpb0RldmljZURlc3Ryb3lJT1Byb2NJRCAoY29yZV9hdWRpby0+ZGV2aWNlX2lkLCBjb3JlX2F1ZGlvLT5wcm9jSUQpOworICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLAorICAgICAgICAiQXVkaW9EZXZpY2VEZXN0cm95SU9Qcm9jSUQgZmFpbGVkOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChjb3JlX2F1ZGlvLAorICAgICAgIm9zeCByaW5nIGJ1ZmZlciByZW1vdmVkIGlvcHJvYyBJRDogJXAgZGV2aWNlX2lkICVsdSIsCisgICAgICBjb3JlX2F1ZGlvLT5wcm9jSUQsIChndWxvbmcpIGNvcmVfYXVkaW8tPmRldmljZV9pZCk7CisKKyAgLyogV2UncmUgZGVhY3RpdmF0ZWQuLiAqLworICBjb3JlX2F1ZGlvLT5wcm9jSUQgPSAwOworICBjb3JlX2F1ZGlvLT5pb19wcm9jX25lZWRzX2RlYWN0aXZhdGlvbiA9IEZBTFNFOworICBjb3JlX2F1ZGlvLT5pb19wcm9jX2FjdGl2ZSA9IEZBTFNFOworfQorCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitfaW9fcHJvY19zcGRpZl9zdGFydCAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbykKK3sKKyAgT1NFcnIgc3RhdHVzOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGNvcmVfYXVkaW8sCisgICAgICAib3N4IHJpbmcgYnVmZmVyIHN0YXJ0IGlvcHJvYyBJRDogJXAgZGV2aWNlX2lkICVsdSIsCisgICAgICBjb3JlX2F1ZGlvLT5wcm9jSUQsIChndWxvbmcpIGNvcmVfYXVkaW8tPmRldmljZV9pZCk7CisKKyAgaWYgKCFjb3JlX2F1ZGlvLT5pb19wcm9jX2FjdGl2ZSkgeworICAgIC8qIEFkZCBJT1Byb2MgY2FsbGJhY2sgKi8KKyAgICBzdGF0dXMgPSBBdWRpb0RldmljZUNyZWF0ZUlPUHJvY0lEIChjb3JlX2F1ZGlvLT5kZXZpY2VfaWQsCisgICAgICAgIChBdWRpb0RldmljZUlPUHJvYykgX2lvX3Byb2Nfc3BkaWYsCisgICAgICAgICh2b2lkICopIGNvcmVfYXVkaW8sICZjb3JlX2F1ZGlvLT5wcm9jSUQpOworICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwKKyAgICAgICAgICAiOkF1ZGlvRGV2aWNlQ3JlYXRlSU9Qcm9jSUQgZmFpbGVkOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGNvcmVfYXVkaW8tPmlvX3Byb2NfYWN0aXZlID0gVFJVRTsKKyAgfQorCisgIGNvcmVfYXVkaW8tPmlvX3Byb2NfbmVlZHNfZGVhY3RpdmF0aW9uID0gRkFMU0U7CisKKyAgLyogU3RhcnQgZGV2aWNlICovCisgIHN0YXR1cyA9IEF1ZGlvRGV2aWNlU3RhcnQgKGNvcmVfYXVkaW8tPmRldmljZV9pZCwgY29yZV9hdWRpby0+cHJvY0lEKTsKKyAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwKKyAgICAgICAgIkF1ZGlvRGV2aWNlU3RhcnQgZmFpbGVkOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW5saW5lIGdib29sZWFuCitfaW9fcHJvY19zcGRpZl9zdG9wIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBPU0VyciBzdGF0dXM7CisKKyAgLyogU3RvcCBkZXZpY2UgKi8KKyAgc3RhdHVzID0gQXVkaW9EZXZpY2VTdG9wIChjb3JlX2F1ZGlvLT5kZXZpY2VfaWQsIGNvcmVfYXVkaW8tPnByb2NJRCk7CisgIGlmIChzdGF0dXMgIT0gbm9FcnIpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChjb3JlX2F1ZGlvLT5vc3hidWYsCisgICAgICAgICJBdWRpb0RldmljZVN0b3AgZmFpbGVkOiAlZCIsIChpbnQpIHN0YXR1cyk7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChjb3JlX2F1ZGlvLAorICAgICAgIm9zeCByaW5nIGJ1ZmZlciBzdG9wIGlvcHJvYyBJRDogJXAgZGV2aWNlX2lkICVsdSIsCisgICAgICBjb3JlX2F1ZGlvLT5wcm9jSUQsIChndWxvbmcpIGNvcmVfYXVkaW8tPmRldmljZV9pZCk7CisKKyAgaWYgKGNvcmVfYXVkaW8tPmlvX3Byb2NfYWN0aXZlKSB7CisgICAgX3JlbW92ZV9yZW5kZXJfc3BkaWZfY2FsbGJhY2sgKGNvcmVfYXVkaW8pOworICB9CisKKyAgX2Nsb3NlX3NwZGlmIChjb3JlX2F1ZGlvKTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgSW1wbGVtZW50YXRpb24gICAgKgorICoqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9fb3Blbl9pbXBsIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBnYm9vbGVhbiByZXQ7CisKKyAgLyogVGhlIGZvbGxvd2luZyBpcyBuZWVkZWQgdG8gaW5zdHJ1Y3QgSEFMIHRvIGNyZWF0ZSB0aGVpciBvd24KKyAgICogdGhyZWFkIHRvIGhhbmRsZSB0aGUgbm90aWZpY2F0aW9ucy4gKi8KKyAgX2F1ZGlvX3N5c3RlbV9zZXRfcnVubG9vcCAoTlVMTCk7CisKKyAgLyogQ3JlYXRlIGEgSEFMT3V0cHV0IEF1ZGlvVW5pdC4KKyAgICogVGhpcyBpcyB0aGUgbG93ZXN0LWxldmVsIG91dHB1dCBBUEkgdGhhdCBpcyBhY3R1YWxseSBzZW5zaWJseQorICAgKiB1c2FibGUgKHRoZSBsb3dlciBsZXZlbCBvbmVzIHJlcXVpcmUgdGhhdCB5b3UgZG8KKyAgICogY2hhbm5lbC1yZW1hcHBpbmcgeW91cnNlbGYsIGFuZCB0aGUgQ29yZUF1ZGlvIGNoYW5uZWwgbWFwcGluZworICAgKiBpcyBzdWZmaWNpZW50bHkgY29tcGxleCB0aGF0IGRvaW5nIHNvIHdvdWxkIGJlIHZlcnkgZGlmZmljdWx0KQorICAgKgorICAgKiBOb3RlIHRoYXQgZm9yIGlucHV0IHdlIHJlcXVlc3QgYW4gb3V0cHV0IHVuaXQgZXZlbiB0aG91Z2gKKyAgICogd2Ugd2lsbCBkbyBpbnB1dCB3aXRoIGl0LgorICAgKiBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90ZWNobm90ZXMvdG4yMDAyL3RuMjA5MS5odG1sCisgICAqLworICByZXQgPSBnc3RfY29yZV9hdWRpb19vcGVuX2RldmljZSAoY29yZV9hdWRpbywga0F1ZGlvVW5pdFN1YlR5cGVfSEFMT3V0cHV0LAorICAgICAgIkhBTE91dHB1dCIpOworICBpZiAoIXJldCkgeworICAgIEdTVF9ERUJVRyAoIkNvdWxkIG5vdCBvcGVuIGRldmljZSIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIHJldCA9IGdzdF9jb3JlX2F1ZGlvX2JpbmRfZGV2aWNlIChjb3JlX2F1ZGlvKTsKKyAgaWYgKCFyZXQpIHsKKyAgICBHU1RfREVCVUcgKCJDb3VsZCBub3QgYmluZCBkZXZpY2UiKTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworZG9uZToKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfY29yZV9hdWRpb19zdGFydF9wcm9jZXNzaW5nX2ltcGwgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIGlmIChjb3JlX2F1ZGlvLT5pc19wYXNzdGhyb3VnaCkgeworICAgIHJldHVybiBfaW9fcHJvY19zcGRpZl9zdGFydCAoY29yZV9hdWRpbyk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGdzdF9jb3JlX2F1ZGlvX2lvX3Byb2Nfc3RhcnQgKGNvcmVfYXVkaW8pOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9fcGF1c2VfcHJvY2Vzc2luZ19pbXBsIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBpZiAoY29yZV9hdWRpby0+aXNfcGFzc3Rocm91Z2gpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChjb3JlX2F1ZGlvLAorICAgICAgICAib3N4IHJpbmcgYnVmZmVyIHBhdXNlIGlvcHJvYyBJRDogJXAgZGV2aWNlX2lkICVsdSIsCisgICAgICAgIGNvcmVfYXVkaW8tPnByb2NJRCwgKGd1bG9uZykgY29yZV9hdWRpby0+ZGV2aWNlX2lkKTsKKworICAgIGlmIChjb3JlX2F1ZGlvLT5pb19wcm9jX2FjdGl2ZSkgeworICAgICAgX3JlbW92ZV9yZW5kZXJfc3BkaWZfY2FsbGJhY2sgKGNvcmVfYXVkaW8pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChjb3JlX2F1ZGlvLAorICAgICAgICAib3N4IHJpbmcgYnVmZmVyIHBhdXNlIGlvcHJvYzogJXAgZGV2aWNlX2lkICVsdSIsCisgICAgICAgIGNvcmVfYXVkaW8tPmVsZW1lbnQtPmlvX3Byb2MsIChndWxvbmcpIGNvcmVfYXVkaW8tPmRldmljZV9pZCk7CisgICAgaWYgKGNvcmVfYXVkaW8tPmlvX3Byb2NfYWN0aXZlKSB7CisgICAgICAvKiBDb3JlQXVkaW8gaXNuJ3QgdGhyZWFkc2FmZSBlbm91Z2ggdG8gZG8gdGhpcyBoZXJlOworICAgICAgICogd2UgbXVzdCBkZWFjdGl2YXRlIHRoZSByZW5kZXIgY2FsbGJhY2sgZWxzZXdoZXJlLiBTZWU6CisgICAgICAgKiBodHRwOi8vbGlzdHMuYXBwbGUuY29tL2FyY2hpdmVzL0NvcmVhdWRpby1hcGkvMjAwNi9NYXIvbXNnMDAwMTAuaHRtbAorICAgICAgICovCisgICAgICBjb3JlX2F1ZGlvLT5pb19wcm9jX25lZWRzX2RlYWN0aXZhdGlvbiA9IFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9jb3JlX2F1ZGlvX3N0b3BfcHJvY2Vzc2luZ19pbXBsIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBpZiAoY29yZV9hdWRpby0+aXNfcGFzc3Rocm91Z2gpIHsKKyAgICBfaW9fcHJvY19zcGRpZl9zdG9wIChjb3JlX2F1ZGlvKTsKKyAgfSBlbHNlIHsKKyAgICBnc3RfY29yZV9hdWRpb19pb19wcm9jX3N0b3AgKGNvcmVfYXVkaW8pOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9fZ2V0X3NhbXBsZXNfYW5kX2xhdGVuY3lfaW1wbCAoR3N0Q29yZUF1ZGlvICogY29yZV9hdWRpbywKKyAgICBnZG91YmxlIHJhdGUsIGd1aW50ICogc2FtcGxlcywgZ2RvdWJsZSAqIGxhdGVuY3kpCit7CisgIE9TU3RhdHVzIHN0YXR1czsKKyAgVUludDMyIHNpemUgPSBzaXplb2YgKGRvdWJsZSk7CisKKyAgaWYgKGNvcmVfYXVkaW8tPmlzX3Bhc3N0aHJvdWdoKSB7CisgICAgKnNhbXBsZXMgPSBfYXVkaW9fZGV2aWNlX2dldF9sYXRlbmN5IChjb3JlX2F1ZGlvLT5kZXZpY2VfaWQpOworICAgICpzYW1wbGVzICs9IF9hdWRpb19zdHJlYW1fZ2V0X2xhdGVuY3kgKGNvcmVfYXVkaW8tPnN0cmVhbV9pZCk7CisgICAgKmxhdGVuY3kgPSAoZG91YmxlKSAqc2FtcGxlcyAvIHJhdGU7CisgIH0gZWxzZSB7CisgICAgc3RhdHVzID0gQXVkaW9Vbml0R2V0UHJvcGVydHkgKGNvcmVfYXVkaW8tPmF1ZGlvdW5pdCwga0F1ZGlvVW5pdFByb3BlcnR5X0xhdGVuY3ksIGtBdWRpb1VuaXRTY29wZV9HbG9iYWwsIDAsICAgICAgICAvKiBOL0EgZm9yIGdsb2JhbCAqLworICAgICAgICBsYXRlbmN5LCAmc2l6ZSk7CisKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGNvcmVfYXVkaW8tPm9zeGJ1ZiwgIkZhaWxlZCB0byBnZXQgbGF0ZW5jeTogJWQiLAorICAgICAgICAgIChpbnQpIHN0YXR1cyk7CisgICAgICAqc2FtcGxlcyA9IDA7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgKnNhbXBsZXMgPSAqbGF0ZW5jeSAqIHJhdGU7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9faW5pdGlhbGl6ZV9pbXBsIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvLAorICAgIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiBmb3JtYXQsIEdzdENhcHMgKiBjYXBzLAorICAgIGdib29sZWFuIGlzX3Bhc3N0aHJvdWdoLCBndWludDMyICogZnJhbWVfc2l6ZSkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisgIE9TU3RhdHVzIHN0YXR1czsKKworICAvKiBVbmluaXRpYWxpemUgdGhlIEF1ZGlvVW5pdCBiZWZvcmUgY2hhbmdpbmcgZm9ybWF0cyAqLworICBzdGF0dXMgPSBBdWRpb1VuaXRVbmluaXRpYWxpemUgKGNvcmVfYXVkaW8tPmF1ZGlvdW5pdCk7CisgIGlmIChzdGF0dXMpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChjb3JlX2F1ZGlvLCAiRmFpbGVkIHRvIHVuaW5pdGlhbGl6ZSBBdWRpb1VuaXQ6ICVkIiwKKyAgICAgICAgKGludCkgc3RhdHVzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBjb3JlX2F1ZGlvLT5pc19wYXNzdGhyb3VnaCA9IGlzX3Bhc3N0aHJvdWdoOworICBpZiAoaXNfcGFzc3Rocm91Z2gpIHsKKyAgICBpZiAoIV9hY3F1aXJlX3NwZGlmIChjb3JlX2F1ZGlvLCBmb3JtYXQpKQorICAgICAgZ290byBkb25lOworICAgIF9tb25pdG9yaXplX3NwZGlmIChjb3JlX2F1ZGlvKTsKKyAgfSBlbHNlIHsKKyAgICBPU1N0YXR1cyBzdGF0dXM7CisgICAgVUludDMyIHByb3BlcnR5U2l6ZTsKKworICAgIGNvcmVfYXVkaW8tPnN0cmVhbV9pZHggPSAwOworICAgIGlmICghZ3N0X2NvcmVfYXVkaW9fc2V0X2Zvcm1hdCAoY29yZV9hdWRpbywgZm9ybWF0KSkKKyAgICAgIGdvdG8gZG9uZTsKKworICAgIGlmICghZ3N0X2NvcmVfYXVkaW9fc2V0X2NoYW5uZWxfbGF5b3V0IChjb3JlX2F1ZGlvLAorICAgICAgICAgICAgZm9ybWF0Lm1DaGFubmVsc1BlckZyYW1lLCBjYXBzKSkKKyAgICAgIGdvdG8gZG9uZTsKKworICAgIGlmIChjb3JlX2F1ZGlvLT5pc19zcmMpIHsKKyAgICAgIHByb3BlcnR5U2l6ZSA9IHNpemVvZiAoKmZyYW1lX3NpemUpOworICAgICAgc3RhdHVzID0gQXVkaW9Vbml0R2V0UHJvcGVydHkgKGNvcmVfYXVkaW8tPmF1ZGlvdW5pdCwga0F1ZGlvRGV2aWNlUHJvcGVydHlCdWZmZXJGcmFtZVNpemUsIGtBdWRpb1VuaXRTY29wZV9HbG9iYWwsIDAsICAgICAvKiBOL0EgZm9yIGdsb2JhbCAqLworICAgICAgICAgIGZyYW1lX3NpemUsICZwcm9wZXJ0eVNpemUpOworCisgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29yZV9hdWRpby0+b3N4YnVmLCAiRmFpbGVkIHRvIGdldCBmcmFtZSBzaXplOiAlZCIsCisgICAgICAgICAgICAoaW50KSBzdGF0dXMpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0ID0gVFJVRTsKKworZG9uZToKKyAgLyogRm9ybWF0IGNoYW5nZWQsIGluaXRpYWxpc2UgdGhlIEF1ZGlvVW5pdCBhZ2FpbiAqLworICBzdGF0dXMgPSBBdWRpb1VuaXRJbml0aWFsaXplIChjb3JlX2F1ZGlvLT5hdWRpb3VuaXQpOworICBpZiAoc3RhdHVzKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoY29yZV9hdWRpbywgIkZhaWxlZCB0byBpbml0aWFsaXplIEF1ZGlvVW5pdDogJWQiLAorICAgICAgICAoaW50KSBzdGF0dXMpOworICAgIHJldCA9IEZBTFNFOworICB9CisKKyAgaWYgKHJldCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGNvcmVfYXVkaW8sICJvc3hidWYgcmluZyBidWZmZXIgYWNxdWlyZWQiKTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9fc2VsZWN0X2RldmljZV9pbXBsIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBBdWRpb0RldmljZUlEICpkZXZpY2VzID0gTlVMTDsKKyAgQXVkaW9EZXZpY2VJRCBkZXZpY2VfaWQgPSBjb3JlX2F1ZGlvLT5kZXZpY2VfaWQ7CisgIEF1ZGlvRGV2aWNlSUQgZGVmYXVsdF9kZXZpY2VfaWQgPSAwOworICBnaW50IGksIG5kZXZpY2VzID0gMDsKKyAgZ2Jvb2xlYW4gb3V0cHV0ID0gIWNvcmVfYXVkaW8tPmlzX3NyYzsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisjaWZkZWYgR1NUX0NPUkVfQVVESU9fREVCVUcKKyAgQXVkaW9DaGFubmVsTGF5b3V0ICpjaGFubmVsX2xheW91dDsKKyNlbmRpZgorCisgIGRldmljZXMgPSBfYXVkaW9fc3lzdGVtX2dldF9kZXZpY2VzICgmbmRldmljZXMpOworCisgIGlmIChuZGV2aWNlcyA8IDEpIHsKKyAgICBHU1RfRVJST1IgKCJubyBhdWRpbyBvdXRwdXQgZGV2aWNlcyBmb3VuZCIpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIEdTVF9ERUJVRyAoImZvdW5kICVkIGF1ZGlvIGRldmljZShzKSIsIG5kZXZpY2VzKTsKKworI2lmZGVmIEdTVF9DT1JFX0FVRElPX0RFQlVHCisgIGZvciAoaSA9IDA7IGkgPCBuZGV2aWNlczsgaSsrKSB7CisgICAgZ2NoYXIgKmRldmljZV9uYW1lOworCisgICAgaWYgKChkZXZpY2VfbmFtZSA9IF9hdWRpb19kZXZpY2VfZ2V0X25hbWUgKGRldmljZXNbaV0sIG91dHB1dCkpKSB7CisgICAgICBpZiAoIV9hdWRpb19kZXZpY2VfaGFzX291dHB1dCAoZGV2aWNlc1tpXSkpIHsKKyAgICAgICAgR1NUX0RFQlVHICgiSW5wdXQgRGV2aWNlIElEOiAldSBOYW1lOiAlcyIsCisgICAgICAgICAgICAodW5zaWduZWQpIGRldmljZXNbaV0sIGRldmljZV9uYW1lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVRyAoIk91dHB1dCBEZXZpY2UgSUQ6ICV1IE5hbWU6ICVzIiwKKyAgICAgICAgICAgICh1bnNpZ25lZCkgZGV2aWNlc1tpXSwgZGV2aWNlX25hbWUpOworCisgICAgICAgIGNoYW5uZWxfbGF5b3V0ID0KKyAgICAgICAgICAgIGdzdF9jb3JlX2F1ZGlvX2F1ZGlvX2RldmljZV9nZXRfY2hhbm5lbF9sYXlvdXQgKGRldmljZXNbaV0sIG91dHB1dCk7CisgICAgICAgIGlmIChjaGFubmVsX2xheW91dCkgeworICAgICAgICAgIGdzdF9jb3JlX2F1ZGlvX2R1bXBfY2hhbm5lbF9sYXlvdXQgKGNoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgICBnX2ZyZWUgKGNoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBnX2ZyZWUgKGRldmljZV9uYW1lKTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIC8qIEZpbmQgdGhlIElEIG9mIHRoZSBkZWZhdWx0IG91dHB1dCBkZXZpY2UgKi8KKyAgZGVmYXVsdF9kZXZpY2VfaWQgPSBfYXVkaW9fc3lzdGVtX2dldF9kZWZhdWx0X2RldmljZSAob3V0cHV0KTsKKworICAvKiBIZXJlIHdlIGRlY2lkZSBpZiBzZWxlY3RlZCBkZXZpY2UgaXMgdmFsaWQgb3IgYXV0b3NlbGVjdAorICAgKiB0aGUgZGVmYXVsdCBvbmUgd2hlbiByZXF1aXJlZCAqLworICBpZiAoZGV2aWNlX2lkID09IGtBdWRpb0RldmljZVVua25vd24pIHsKKyAgICBpZiAoZGVmYXVsdF9kZXZpY2VfaWQgIT0ga0F1ZGlvRGV2aWNlVW5rbm93bikgeworICAgICAgZGV2aWNlX2lkID0gZGVmYXVsdF9kZXZpY2VfaWQ7CisgICAgICByZXMgPSBUUlVFOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfRVJST1IgKCJObyBkZXZpY2Ugb2YgcmVxdWlyZWQgdHlwZSBhdmFpbGFibGUiKTsKKyAgICAgIHJlcyA9IEZBTFNFOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmRldmljZXM7IGkrKykgeworICAgICAgaWYgKGRldmljZV9pZCA9PSBkZXZpY2VzW2ldKSB7CisgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXMgJiYgIV9hdWRpb19kZXZpY2VfaXNfYWxpdmUgKGRldmljZV9pZCwgb3V0cHV0KSkgeworICAgICAgR1NUX0VSUk9SICgiUmVxdWVzdGVkIGRldmljZSBub3QgdXNhYmxlIik7CisgICAgICByZXMgPSBGQUxTRTsKKyAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgIH0KKworICBpZiAocmVzKQorICAgIGNvcmVfYXVkaW8tPmRldmljZV9pZCA9IGRldmljZV9pZDsKKworZG9uZToKKyAgZ19mcmVlIChkZXZpY2VzKTsKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfY29yZV9hdWRpb19hdWRpb19kZXZpY2VfaXNfc3BkaWZfYXZhaWxfaW1wbCAoQXVkaW9EZXZpY2VJRCBkZXZpY2VfaWQpCit7CisgIEF1ZGlvU3RyZWFtSUQgKnN0cmVhbXMgPSBOVUxMOworICBnaW50IGksIG5zdHJlYW1zID0gMDsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisKKyAgc3RyZWFtcyA9IF9hdWRpb19kZXZpY2VfZ2V0X3N0cmVhbXMgKGRldmljZV9pZCwgJm5zdHJlYW1zKTsKKyAgR1NUX0RFQlVHICgiZm91bmQgJWQgc3RyZWFtcyIsIG5zdHJlYW1zKTsKKyAgaWYgKHN0cmVhbXMpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnN0cmVhbXM7IGkrKykgeworICAgICAgaWYgKF9hdWRpb19zdHJlYW1faXNfc3BkaWZfYXZhaWwgKHN0cmVhbXNbaV0pKSB7CisgICAgICAgIHJlcyA9IFRSVUU7CisgICAgICB9CisgICAgfQorCisgICAgZ19mcmVlIChzdHJlYW1zKTsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9zeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvcmVtb3RlaW8uYyBiL3N5cy9vc3hhdWRpby9nc3Rvc3hjb3JlYXVkaW9yZW1vdGVpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YjBlYmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvb3N4YXVkaW8vZ3N0b3N4Y29yZWF1ZGlvcmVtb3RlaW8uYwpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDEyIEZsdWVuZG8gUy5BLiA8c3VwcG9ydEBmbHVlbmRvLmNvbT4KKyAqICAgQXV0aG9yczogQW5kb25pIE1vcmFsZXMgQWxhc3RydWV5IDxhbW9yYWxlc0BmbHVlbmRvLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKi8KKworI2ltcG9ydCA8QXVkaW9Vbml0L0FVQ29tcG9uZW50Lmg+CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9fb3Blbl9pbXBsIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICByZXR1cm4gZ3N0X2NvcmVfYXVkaW9fb3Blbl9kZXZpY2UgKGNvcmVfYXVkaW8sIGtBdWRpb1VuaXRTdWJUeXBlX1JlbW90ZUlPLAorICAgICAgIlJlbW90ZUlPIik7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9fc3RhcnRfcHJvY2Vzc2luZ19pbXBsIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICByZXR1cm4gZ3N0X2NvcmVfYXVkaW9faW9fcHJvY19zdGFydCAoY29yZV9hdWRpbyk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9fcGF1c2VfcHJvY2Vzc2luZ19pbXBsIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBHU1RfREVCVUdfT0JKRUNUIChjb3JlX2F1ZGlvLAorICAgICAgIm9zeCByaW5nIGJ1ZmZlciBwYXVzZSBpb3Byb2M6ICVwIGRldmljZV9pZCAlbHUiLAorICAgICAgY29yZV9hdWRpby0+ZWxlbWVudC0+aW9fcHJvYywgKGd1bG9uZykgY29yZV9hdWRpby0+ZGV2aWNlX2lkKTsKKworICBpZiAoY29yZV9hdWRpby0+aW9fcHJvY19hY3RpdmUpIHsKKyAgICAvKiBDb3JlQXVkaW8gaXNuJ3QgdGhyZWFkc2FmZSBlbm91Z2ggdG8gZG8gdGhpcyBoZXJlOworICAgICAqIHdlIG11c3QgZGVhY3RpdmF0ZSB0aGUgcmVuZGVyIGNhbGxiYWNrIGVsc2V3aGVyZS4gU2VlOgorICAgICAqIGh0dHA6Ly9saXN0cy5hcHBsZS5jb20vYXJjaGl2ZXMvQ29yZWF1ZGlvLWFwaS8yMDA2L01hci9tc2cwMDAxMC5odG1sCisgICAgICovCisgICAgY29yZV9hdWRpby0+aW9fcHJvY19uZWVkc19kZWFjdGl2YXRpb24gPSBUUlVFOworICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9jb3JlX2F1ZGlvX3N0b3BfcHJvY2Vzc2luZ19pbXBsIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvKQoreworICBnc3RfY29yZV9hdWRpb19pb19wcm9jX3N0b3AgKGNvcmVfYXVkaW8pOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfY29yZV9hdWRpb19nZXRfc2FtcGxlc19hbmRfbGF0ZW5jeV9pbXBsIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvLAorICAgIGdkb3VibGUgcmF0ZSwgZ3VpbnQgKiBzYW1wbGVzLCBnZG91YmxlICogbGF0ZW5jeSkKK3sKKyAgT1NTdGF0dXMgc3RhdHVzOworICBVSW50MzIgc2l6ZSA9IHNpemVvZiAoZG91YmxlKTsKKworICBzdGF0dXMgPSBBdWRpb1VuaXRHZXRQcm9wZXJ0eSAoY29yZV9hdWRpby0+YXVkaW91bml0LCBrQXVkaW9Vbml0UHJvcGVydHlfTGF0ZW5jeSwga0F1ZGlvVW5pdFNjb3BlX0dsb2JhbCwgMCwgIC8qIE4vQSBmb3IgZ2xvYmFsICovCisgICAgICBsYXRlbmN5LCAmc2l6ZSk7CisKKyAgaWYgKHN0YXR1cykgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY29yZV9hdWRpbywgIkZhaWxlZCB0byBnZXQgbGF0ZW5jeTogJWQiLCAoaW50KSBzdGF0dXMpOworICAgICpzYW1wbGVzID0gMDsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAqc2FtcGxlcyA9ICpsYXRlbmN5ICogcmF0ZTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X2NvcmVfYXVkaW9faW5pdGlhbGl6ZV9pbXBsIChHc3RDb3JlQXVkaW8gKiBjb3JlX2F1ZGlvLAorICAgIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiBmb3JtYXQsIEdzdENhcHMgKiBjYXBzLAorICAgIGdib29sZWFuIGlzX3Bhc3N0aHJvdWdoLCBndWludDMyICogZnJhbWVfc2l6ZSkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisgIE9TU3RhdHVzIHN0YXR1czsKKworICAvKiBVbmluaXRpYWxpemUgdGhlIEF1ZGlvVW5pdCBiZWZvcmUgY2hhbmdpbmcgZm9ybWF0cyAqLworICBzdGF0dXMgPSBBdWRpb1VuaXRVbmluaXRpYWxpemUgKGNvcmVfYXVkaW8tPmF1ZGlvdW5pdCk7CisgIGlmIChzdGF0dXMpIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChjb3JlX2F1ZGlvLCAiRmFpbGVkIHRvIHVuaW5pdGlhbGl6ZSBBdWRpb1VuaXQ6ICVkIiwKKyAgICAgICAgKGludCkgc3RhdHVzKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBjb3JlX2F1ZGlvLT5pc19wYXNzdGhyb3VnaCA9IGlzX3Bhc3N0aHJvdWdoOworICBjb3JlX2F1ZGlvLT5zdHJlYW1faWR4ID0gMDsKKworICBpZiAoIWdzdF9jb3JlX2F1ZGlvX3NldF9mb3JtYXQgKGNvcmVfYXVkaW8sIGZvcm1hdCkpCisgICAgZ290byBkb25lOworCisgIC8qIEZJWE1FOiBVc2Uga0F1ZGlvU2Vzc2lvblByb3BlcnR5X0N1cnJlbnRIYXJkd2FyZVNhbXBsZVJhdGUgYW5kCisgICAqIGtBdWRpb1Nlc3Npb25Qcm9wZXJ0eV9DdXJyZW50SGFyZHdhcmVJT0J1ZmZlckR1cmF0aW9uIHdpdGggcHJvcGVydHkKKyAgICogbGlzdGVuZXJzIHRvIGRldGVjdCBjaGFuZ2VzIGluIHNjcmVlbiBsb2Nrcy4KKyAgICogRm9yIG5vdyB1c2UgdGhlIG1heGltdW0gdmFsdWUgKi8KKyAgKmZyYW1lX3NpemUgPSA0MTk2OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGNvcmVfYXVkaW8sICJvc3hidWYgcmluZyBidWZmZXIgYWNxdWlyZWQiKTsKKyAgcmV0ID0gVFJVRTsKKworZG9uZToKKyAgLyogRm9ybWF0IGNoYW5nZWQsIGluaXRpYWxpc2UgdGhlIEF1ZGlvVW5pdCBhZ2FpbiAqLworICBzdGF0dXMgPSBBdWRpb1VuaXRJbml0aWFsaXplIChjb3JlX2F1ZGlvLT5hdWRpb3VuaXQpOworICBpZiAoc3RhdHVzKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoY29yZV9hdWRpbywgIkZhaWxlZCB0byBpbml0aWFsaXplIEF1ZGlvVW5pdDogJWQiLAorICAgICAgICAoaW50KSBzdGF0dXMpOworICAgIHJldCA9IEZBTFNFOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfY29yZV9hdWRpb19zZWxlY3RfZGV2aWNlX2ltcGwgKEdzdENvcmVBdWRpbyAqIGNvcmVfYXVkaW8pCit7CisgIC8qIE5vIGRldmljZSBzZWxlY3Rpb24gaW4gaU9TICovCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9jb3JlX2F1ZGlvX2F1ZGlvX2RldmljZV9pc19zcGRpZl9hdmFpbF9pbXBsIChBdWRpb0RldmljZUlEIGRldmljZV9pZCkKK3sKKyAgLyogTm8gU1BESUYgaW4gaU9TICovCisgIHJldHVybiBGQUxTRTsKK30KZGlmZiAtLWdpdCBhL3N5cy9vc3h2aWRlby9NYWtlZmlsZS5hbSBiL3N5cy9vc3h2aWRlby9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWEzZDc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zeHZpZGVvL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTcgQEAKKworcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0b3N4dmlkZW8ubGEKKworbGliZ3N0b3N4dmlkZW9fbGFfU09VUkNFUyA9IG9zeHZpZGVvc2luay5tIGNvY29hd2luZG93Lm0gCitsaWJnc3Rvc3h2aWRlb19sYV9DRkxBR1MgPSAkKEdTVF9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykKK2xpYmdzdG9zeHZpZGVvX2xhX09CSkNGTEFHUyA9ICQoR1NUX09CSkNGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKQorbGliZ3N0b3N4dmlkZW9fbGFfTElCQUREID0gIFwKKwkkKEdTVF9MSUJTKSBcCisJJChHU1RfQkFTRV9MSUJTKSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwktbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKQorCitsaWJnc3Rvc3h2aWRlb19sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpIC1XbCwtZnJhbWV3b3JrIC1XbCxDb2NvYSAtV2wsLWZyYW1ld29yayAtV2wsT3BlbkdMCisKK25vaW5zdF9IRUFERVJTID0gb3N4dmlkZW9zaW5rLmggY29jb2F3aW5kb3cuaApkaWZmIC0tZ2l0IGEvc3lzL29zeHZpZGVvL2NvY29hd2luZG93LmggYi9zeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTZmMWJiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zeHZpZGVvL2NvY29hd2luZG93LmgKQEAgLTAsMCArMSw4NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgWmFoZWVyIEFiYmFzIE1lcmFsaSA8emFoZWVyYWJiYXMgYXQgbWVyYWxpIGRvdCBvcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUGlvbmVlcnMgb2YgdGhlIEluZXZpdGFibGUgPHNvbmdiaXJkQHNvbmdiaXJkbmVzdC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICogVGhlIGRldmVsb3BtZW50IG9mIHRoaXMgY29kZSB3YXMgbWFkZSBwb3NzaWJsZSBkdWUgdG8gdGhlIGludm9sdmVtZW50IG9mIFBpb25lZXJzIAorICogb2YgdGhlIEluZXZpdGFibGUsIHRoZSBjcmVhdG9ycyBvZiB0aGUgU29uZ2JpcmQgTXVzaWMgcGxheWVyCisgKiAKKyAqLworCisvKiBpbnNwaXJhdGlvbiBnYWluZWQgZnJvbSBsb29raW5nIGF0IHNvdXJjZSBvZiBvc3ggdmlkZW8gb3V0IG9mIHhpbmUgYW5kIHZsYyAKKyAqIGFuZCBpcyByZWZsZWN0ZWQgaW4gdGhlIGNvZGUKKyAqLworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCA8Z2xpYi5oPgorI2ltcG9ydCA8Z3N0L3ZpZGVvL25hdmlnYXRpb24uaD4KKworc3RydWN0IF9Hc3RPU1hJbWFnZTsKKworQGludGVyZmFjZSBHc3RHTFZpZXcgOiBOU09wZW5HTFZpZXcKK3sKKyAgICBpbnQgaV9lZmZlY3Q7CisgICAgdW5zaWduZWQgaW50IHBpX3RleHR1cmU7CisgICAgZmxvYXQgZl94OworICAgIGZsb2F0IGZfeTsKKyAgICBpbnQgaW5pdERvbmU7CisgICAgY2hhciogZGF0YTsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBCT09MIGZ1bGxzY3JlZW47CisgICAgQk9PTCBrZWVwQXNwZWN0UmF0aW87CisgICAgTlNPcGVuR0xDb250ZXh0KiBmdWxsU2NyZWVuQ29udGV4dDsgCisgICAgTlNPcGVuR0xDb250ZXh0KiBhY3R1YWxDb250ZXh0OworICAgIE5TVHJhY2tpbmdBcmVhICp0cmFja2luZ0FyZWE7CisgICAgR3N0TmF2aWdhdGlvbiAqbmF2aWdhdGlvbjsKKyAgICBOU1JlY3QgZHJhd2luZ0JvdW5kczsKKyAgICBOU1RocmVhZCAqbWFpblRocmVhZDsKKyAgICBOU1VJbnRlZ2VyIHNhdmVkTW9kaWZpZXJGbGFnczsKK30KKy0gKHZvaWQpIGRyYXdRdWFkOworLSAodm9pZCkgZHJhd1JlY3Q6IChOU1JlY3QpIHJlY3Q7CistIChpZCkgaW5pdFdpdGhGcmFtZTogKE5TUmVjdCkgZnJhbWU7CistICh2b2lkKSBpbml0VGV4dHVyZXM7CistICh2b2lkKSByZWxvYWRUZXh0dXJlOworLSAodm9pZCkgY2xlYW5VcDsKKy0gKHZvaWQpIGRpc3BsYXlUZXh0dXJlOworLSAoY2hhciopIGdldFRleHR1cmVCdWZmZXI7CistICh2b2lkKSBzZXRGdWxsU2NyZWVuOiAoQk9PTCkgZmxhZzsKKy0gKHZvaWQpIHNldEtlZXBBc3BlY3RSYXRpbzogKEJPT0wpIGZsYWc7CistICh2b2lkKSByZXNoYXBlOworLSAodm9pZCkgc2V0VmlkZW9TaXplOihpbnQpdyA6IChpbnQpaDsKKy0gKE5TUmVjdCkgZ2V0RHJhd2luZ0JvdW5kczsKKy0gKEJPT0wpIGhhdmVTdXBlcnZpZXc7CistICh2b2lkKSBoYXZlU3VwZXJ2aWV3UmVhbDogKE5TTXV0YWJsZUFycmF5ICopY2xvc3VyZTsKKy0gKHZvaWQpIGFkZFRvU3VwZXJ2aWV3OiAoTlNWaWV3ICopc3VwZXJ2aWV3OworLSAodm9pZCkgcmVtb3ZlRnJvbVN1cGVydmlldzogKGlkKXVudXNlZDsKKy0gKHZvaWQpIHNldE5hdmlnYXRpb246IChHc3ROYXZpZ2F0aW9uICopIG5hdjsKKyNpZm5kZWYgR1NUUkVBTUVSX0dMSUJfQ09DT0FfTlNBUFBMSUNBVElPTgorLSAodm9pZCkgc2V0TWFpblRocmVhZDogKE5TVGhyZWFkICopIHRocmVhZDsKKyNlbmRpZgorCitAZW5kCisKK0BpbnRlcmZhY2UgR3N0T1NYVmlkZW9TaW5rV2luZG93OiBOU1dpbmRvdyB7CisgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgIEdzdEdMVmlldyAqZ3N0dmlldzsKK30KKworLSAodm9pZCkgc2V0Q29udGVudFNpemU6IChOU1NpemUpIHNpemU7CistIChHc3RHTFZpZXcgKikgZ3N0VmlldzsKKy0gKGlkKWluaXRXaXRoQ29udGVudE5TUmVjdDooTlNSZWN0KWNvbnRlbnRSZWN0IHN0eWxlTWFzazoodW5zaWduZWQgaW50KXN0eWxlTWFzayBiYWNraW5nOihOU0JhY2tpbmdTdG9yZVR5cGUpYnVmZmVyaW5nVHlwZSBkZWZlcjooQk9PTClmbGFnIHNjcmVlbjooTlNTY3JlZW4gKilhU2NyZWVuOworQGVuZApkaWZmIC0tZ2l0IGEvc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm0gYi9zeXMvb3N4dmlkZW8vY29jb2F3aW5kb3cubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWIwNDI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL29zeHZpZGVvL2NvY29hd2luZG93Lm0KQEAgLTAsMCArMSw4MzYgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA0IFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA3IFBpb25lZXJzIG9mIHRoZSBJbmV2aXRhYmxlIDxzb25nYmlyZEBzb25nYmlyZG5lc3QuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqIFRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgd2FzIG1hZGUgcG9zc2libGUgZHVlIHRvIHRoZSBpbnZvbHZlbWVudCBvZiBQaW9uZWVycworICogb2YgdGhlIEluZXZpdGFibGUsIHRoZSBjcmVhdG9ycyBvZiB0aGUgU29uZ2JpcmQgTXVzaWMgcGxheWVyCisgKgorICovCisKKy8qIGluc3BpcmF0aW9uIGdhaW5lZCBmcm9tIGxvb2tpbmcgYXQgc291cmNlIG9mIG9zeCB2aWRlbyBvdXQgb2YgeGluZSBhbmQgdmxjCisgKiBhbmQgaXMgcmVmbGVjdGVkIGluIHRoZSBjb2RlCisgKi8KKworCisjaW5jbHVkZSA8Q29jb2EvQ29jb2EuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW1wb3J0ICJjb2NvYXdpbmRvdy5oIgorI2ltcG9ydCAib3N4dmlkZW9zaW5rLmgiCisKKyNpbmNsdWRlIDxPcGVuR0wvT3BlbkdMLmg+CisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjaW5jbHVkZSA8T3BlbkdML2dsZXh0Lmg+CisKKyNpbmNsdWRlIDxDYXJib24vQ2FyYm9uLmg+CisKKy8qIERlYnVnZ2luZyBjYXRlZ29yeSAqLworI2luY2x1ZGUgPGdzdC9nc3RpbmZvLmg+CisKKyNpZiBNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEIDwgMTAxMjAwCisjZGVmaW5lIE5TRXZlbnRUeXBlTW91c2VNb3ZlZCAgICAgICAgICAgICAgICBOU01vdXNlTW92ZWQKKyNkZWZpbmUgTlNFdmVudFR5cGVMZWZ0TW91c2VEb3duICAgICAgICAgICAgIE5TTGVmdE1vdXNlRG93bgorI2RlZmluZSBOU0V2ZW50VHlwZUxlZnRNb3VzZVVwICAgICAgICAgICAgICAgTlNMZWZ0TW91c2VVcAorI2RlZmluZSBOU0V2ZW50VHlwZVJpZ2h0TW91c2VEb3duICAgICAgICAgICAgTlNSaWdodE1vdXNlRG93bgorI2RlZmluZSBOU0V2ZW50VHlwZVJpZ2h0TW91c2VVcCAgICAgICAgICAgICAgTlNSaWdodE1vdXNlVXAKKyNlbmRpZgorCitzdGF0aWMKK2NvbnN0IGdjaGFyKiBnc3Rfa2V5Y29kZV90b19rZXluYW1lKGdpbnQxNiBrZXljb2RlKQoreworICAgIHN3aXRjaCAoa2V5Y29kZSkKKyAgICB7CisgICAgICBjYXNlIGtWS19BTlNJX0E6CisgICAgICAgIHJldHVybiAiYSI7CisgICAgICBjYXNlIGtWS19BTlNJX1M6CisgICAgICAgIHJldHVybiAicyI7CisgICAgICBjYXNlIGtWS19BTlNJX0Q6CisgICAgICAgIHJldHVybiAiZCI7CisgICAgICBjYXNlIGtWS19BTlNJX0Y6CisgICAgICAgIHJldHVybiAiZiI7CisgICAgICBjYXNlIGtWS19BTlNJX0g6CisgICAgICAgIHJldHVybiAiaCI7CisgICAgICBjYXNlIGtWS19BTlNJX0c6CisgICAgICAgIHJldHVybiAiZyI7CisgICAgICBjYXNlIGtWS19BTlNJX1o6CisgICAgICAgIHJldHVybiAieiI7CisgICAgICBjYXNlIGtWS19BTlNJX1g6CisgICAgICAgIHJldHVybiAieCI7CisgICAgICBjYXNlIGtWS19BTlNJX0M6CisgICAgICAgIHJldHVybiAiYyI7CisgICAgICBjYXNlIGtWS19BTlNJX1Y6CisgICAgICAgIHJldHVybiAidiI7CisgICAgICBjYXNlIGtWS19BTlNJX0I6CisgICAgICAgIHJldHVybiAiYiI7CisgICAgICBjYXNlIGtWS19BTlNJX1E6CisgICAgICAgIHJldHVybiAicSI7CisgICAgICBjYXNlIGtWS19BTlNJX1c6CisgICAgICAgIHJldHVybiAidyI7CisgICAgICBjYXNlIGtWS19BTlNJX0U6CisgICAgICAgIHJldHVybiAiZSI7CisgICAgICBjYXNlIGtWS19BTlNJX1I6CisgICAgICAgIHJldHVybiAiciI7CisgICAgICBjYXNlIGtWS19BTlNJX1k6CisgICAgICAgIHJldHVybiAieSI7CisgICAgICBjYXNlIGtWS19BTlNJX1Q6CisgICAgICAgIHJldHVybiAidCI7CisgICAgICBjYXNlIGtWS19BTlNJXzE6CisgICAgICAgIHJldHVybiAiMSI7CisgICAgICBjYXNlIGtWS19BTlNJXzI6CisgICAgICAgIHJldHVybiAiMiI7CisgICAgICBjYXNlIGtWS19BTlNJXzM6CisgICAgICAgIHJldHVybiAiMyI7CisgICAgICBjYXNlIGtWS19BTlNJXzQ6CisgICAgICAgIHJldHVybiAiNCI7CisgICAgICBjYXNlIGtWS19BTlNJXzY6CisgICAgICAgIHJldHVybiAiNiI7CisgICAgICBjYXNlIGtWS19BTlNJXzU6CisgICAgICAgIHJldHVybiAiNSI7CisgICAgICBjYXNlIGtWS19BTlNJX0VxdWFsOgorICAgICAgICByZXR1cm4gImVxdWFsIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfOToKKyAgICAgICAgcmV0dXJuICI5IjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfNzoKKyAgICAgICAgcmV0dXJuICI3IjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfTWludXM6CisgICAgICAgIHJldHVybiAibWludXMiOworICAgICAgY2FzZSBrVktfQU5TSV84OgorICAgICAgICByZXR1cm4gIjgiOworICAgICAgY2FzZSBrVktfQU5TSV8wOgorICAgICAgICByZXR1cm4gIjAiOworICAgICAgY2FzZSBrVktfQU5TSV9SaWdodEJyYWNrZXQ6CisgICAgICAgIHJldHVybiAiYnJhY2tldHJpZ2h0IjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfTzoKKyAgICAgICAgcmV0dXJuICIwIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfVToKKyAgICAgICAgcmV0dXJuICJ1IjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfTGVmdEJyYWNrZXQ6CisgICAgICAgIHJldHVybiAiYnJhY2tldGxlZnQiOworICAgICAgY2FzZSBrVktfQU5TSV9JOgorICAgICAgICByZXR1cm4gImkiOworICAgICAgY2FzZSBrVktfQU5TSV9QOgorICAgICAgICByZXR1cm4gInAiOworICAgICAgY2FzZSBrVktfQU5TSV9MOgorICAgICAgICByZXR1cm4gImwiOworICAgICAgY2FzZSBrVktfQU5TSV9KOgorICAgICAgICByZXR1cm4gImoiOworICAgICAgY2FzZSBrVktfQU5TSV9RdW90ZToKKyAgICAgICAgcmV0dXJuICJhcG9zdHJvcGhlIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfSzoKKyAgICAgICAgcmV0dXJuICJrIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfU2VtaWNvbG9uOgorICAgICAgICByZXR1cm4gInNlbWljb2xvbiI7CisgICAgICBjYXNlIGtWS19BTlNJX0JhY2tzbGFzaDoKKyAgICAgICAgcmV0dXJuICJiYWNrc2xhc2giOworICAgICAgY2FzZSBrVktfQU5TSV9Db21tYToKKyAgICAgICAgcmV0dXJuICJjb21tYSI7CisgICAgICBjYXNlIGtWS19BTlNJX1NsYXNoOgorICAgICAgICByZXR1cm4gInNsYXNoIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfTjoKKyAgICAgICAgcmV0dXJuICJuIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfTToKKyAgICAgICAgcmV0dXJuICJtIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfUGVyaW9kOgorICAgICAgICByZXR1cm4gInBlcmlvZCI7CisgICAgICBjYXNlIGtWS19BTlNJX0dyYXZlOgorICAgICAgICByZXR1cm4gImdyYXZlIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfS2V5cGFkRGVjaW1hbDoKKyAgICAgICAgcmV0dXJuICJLUF9EZWxldGUiOworICAgICAgY2FzZSBrVktfQU5TSV9LZXlwYWRNdWx0aXBseToKKyAgICAgICAgcmV0dXJuICJLUF9NdWx0aXBseSI7CisgICAgICBjYXNlIGtWS19BTlNJX0tleXBhZFBsdXM6CisgICAgICAgIHJldHVybiAiS1BfQWRkIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfS2V5cGFkQ2xlYXI6CisgICAgICAgIHJldHVybiAiS1BfQ2xlYXIiOworICAgICAgY2FzZSBrVktfQU5TSV9LZXlwYWREaXZpZGU6CisgICAgICAgIHJldHVybiAiS1BfRGl2aWRlIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfS2V5cGFkRW50ZXI6CisgICAgICAgIHJldHVybiAiS1BfRW50ZXIiOworICAgICAgY2FzZSBrVktfQU5TSV9LZXlwYWRNaW51czoKKyAgICAgICAgcmV0dXJuICJLUF9TdWJ0cmFjdCI7CisgICAgICBjYXNlIGtWS19BTlNJX0tleXBhZEVxdWFsczoKKyAgICAgICAgcmV0dXJuICJLUF9FcXVhbHMiOworICAgICAgY2FzZSBrVktfQU5TSV9LZXlwYWQwOgorICAgICAgICByZXR1cm4gIktQX0luc2VydCI7CisgICAgICBjYXNlIGtWS19BTlNJX0tleXBhZDE6CisgICAgICAgIHJldHVybiAiS1BfRW5kIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfS2V5cGFkMjoKKyAgICAgICAgcmV0dXJuICJLUF9Eb3duIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfS2V5cGFkMzoKKyAgICAgICAgcmV0dXJuICJLUF9OZXh0IjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfS2V5cGFkNDoKKyAgICAgICAgcmV0dXJuICJLUF9MZWZ0IjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfS2V5cGFkNToKKyAgICAgICAgcmV0dXJuICJLUF9CZWdpbiI7CisgICAgICBjYXNlIGtWS19BTlNJX0tleXBhZDY6CisgICAgICAgIHJldHVybiAiS1BfUmlnaHQiOworICAgICAgY2FzZSBrVktfQU5TSV9LZXlwYWQ3OgorICAgICAgICByZXR1cm4gIktQX0hvbWUiOworICAgICAgY2FzZSBrVktfQU5TSV9LZXlwYWQ4OgorICAgICAgICByZXR1cm4gIktQX1VwIjsKKyAgICAgIGNhc2Uga1ZLX0FOU0lfS2V5cGFkOToKKyAgICAgICAgcmV0dXJuICJLUF9QcmlvciI7CisKKyAgICAvKiBrZXljb2RlcyBmb3Iga2V5cyB0aGF0IGFyZSBpbmRlcGVuZGVudCBvZiBrZXlib2FyZCBsYXlvdXQqLworCisgICAgICBjYXNlIGtWS19SZXR1cm46CisgICAgICAgIHJldHVybiAiUmV0dXJuIjsKKyAgICAgIGNhc2Uga1ZLX1RhYjoKKyAgICAgICAgcmV0dXJuICJUYWIiOworICAgICAgY2FzZSBrVktfU3BhY2U6CisgICAgICAgIHJldHVybiAic3BhY2UiOworICAgICAgY2FzZSBrVktfRGVsZXRlOgorICAgICAgICByZXR1cm4gIkJhY2tzcGFjZSI7CisgICAgICBjYXNlIGtWS19Fc2NhcGU6CisgICAgICAgIHJldHVybiAiRXNjYXBlIjsKKyAgICAgIGNhc2Uga1ZLX0NvbW1hbmQ6CisgICAgICAgIHJldHVybiAiQ29tbWFuZCI7CisgICAgICBjYXNlIGtWS19TaGlmdDoKKyAgICAgICAgcmV0dXJuICJTaGlmdF9MIjsKKyAgICAgIGNhc2Uga1ZLX0NhcHNMb2NrOgorICAgICAgICByZXR1cm4gIkNhcHNfTG9jayI7CisgICAgICBjYXNlIGtWS19PcHRpb246CisgICAgICAgIHJldHVybiAiT3B0aW9uX0wiOworICAgICAgY2FzZSBrVktfQ29udHJvbDoKKyAgICAgICAgcmV0dXJuICJDb250cm9sX0wiOworICAgICAgY2FzZSBrVktfUmlnaHRTaGlmdDoKKyAgICAgICAgcmV0dXJuICJTaGlmdF9SIjsKKyAgICAgIGNhc2Uga1ZLX1JpZ2h0T3B0aW9uOgorICAgICAgICByZXR1cm4gIk9wdGlvbl9SIjsKKyAgICAgIGNhc2Uga1ZLX1JpZ2h0Q29udHJvbDoKKyAgICAgICAgcmV0dXJuICJDb250cm9sX1IiOworICAgICAgY2FzZSBrVktfRnVuY3Rpb246CisgICAgICAgIHJldHVybiAiRnVuY3Rpb24iOworICAgICAgY2FzZSBrVktfRjE3OgorICAgICAgICByZXR1cm4gIkYxNyI7CisgICAgICBjYXNlIGtWS19Wb2x1bWVVcDoKKyAgICAgICAgcmV0dXJuICJWb2x1bWVVcCI7CisgICAgICBjYXNlIGtWS19Wb2x1bWVEb3duOgorICAgICAgICByZXR1cm4gIlZvbHVtZURvd24iOworICAgICAgY2FzZSBrVktfTXV0ZToKKyAgICAgICAgcmV0dXJuICJNdXRlIjsKKyAgICAgIGNhc2Uga1ZLX0YxODoKKyAgICAgICAgcmV0dXJuICJGMTgiOworICAgICAgY2FzZSBrVktfRjE5OgorICAgICAgICByZXR1cm4gIkYxOSI7CisgICAgICBjYXNlIGtWS19GMjA6CisgICAgICAgIHJldHVybiAiRjIwIjsKKyAgICAgIGNhc2Uga1ZLX0Y1OgorICAgICAgICByZXR1cm4gIkY1IjsKKyAgICAgIGNhc2Uga1ZLX0Y2OgorICAgICAgICByZXR1cm4gIkY2IjsKKyAgICAgIGNhc2Uga1ZLX0Y3OgorICAgICAgICByZXR1cm4gIkY3IjsKKyAgICAgIGNhc2Uga1ZLX0YzOgorICAgICAgICByZXR1cm4gIkYzIjsKKyAgICAgIGNhc2Uga1ZLX0Y4OgorICAgICAgICByZXR1cm4gIkY4IjsKKyAgICAgIGNhc2Uga1ZLX0Y5OgorICAgICAgICByZXR1cm4gIkY5IjsKKyAgICAgIGNhc2Uga1ZLX0YxMToKKyAgICAgICAgcmV0dXJuICJGMTEiOworICAgICAgY2FzZSBrVktfRjEzOgorICAgICAgICByZXR1cm4gIkYxMyI7CisgICAgICBjYXNlIGtWS19GMTY6CisgICAgICAgIHJldHVybiAiRjE2IjsKKyAgICAgIGNhc2Uga1ZLX0YxNDoKKyAgICAgICAgcmV0dXJuICJGMTQiOworICAgICAgY2FzZSBrVktfRjEwOgorICAgICAgICByZXR1cm4gIkYxMCI7CisgICAgICBjYXNlIGtWS19GMTI6CisgICAgICAgIHJldHVybiAiRjEyIjsKKyAgICAgIGNhc2Uga1ZLX0YxNToKKyAgICAgICAgcmV0dXJuICJGMTUiOworICAgICAgY2FzZSBrVktfSGVscDoKKyAgICAgICAgcmV0dXJuICJIZWxwIjsKKyAgICAgIGNhc2Uga1ZLX0hvbWU6CisgICAgICAgIHJldHVybiAiSG9tZSI7CisgICAgICBjYXNlIGtWS19QYWdlVXA6CisgICAgICAgIHJldHVybiAiUHJpb3IiOworICAgICAgY2FzZSBrVktfRm9yd2FyZERlbGV0ZToKKyAgICAgICAgcmV0dXJuICJEZWxldGUiOworICAgICAgY2FzZSBrVktfRjQ6CisgICAgICAgIHJldHVybiAiRjQiOworICAgICAgY2FzZSBrVktfRW5kOgorICAgICAgICByZXR1cm4gIkVuZCI7CisgICAgICBjYXNlIGtWS19GMjoKKyAgICAgICAgcmV0dXJuICJGMiI7CisgICAgICBjYXNlIGtWS19QYWdlRG93bjoKKyAgICAgICAgcmV0dXJuICJOZXh0IjsKKyAgICAgIGNhc2Uga1ZLX0YxOgorICAgICAgICByZXR1cm4gIkYxIjsKKyAgICAgIGNhc2Uga1ZLX0xlZnRBcnJvdzoKKyAgICAgICAgcmV0dXJuICJMZWZ0IjsKKyAgICAgIGNhc2Uga1ZLX1JpZ2h0QXJyb3c6CisgICAgICAgIHJldHVybiAiUmlnaHQiOworICAgICAgY2FzZSBrVktfRG93bkFycm93OgorICAgICAgICByZXR1cm4gIkRvd24iOworICAgICAgY2FzZSBrVktfVXBBcnJvdzoKKyAgICAgICAgcmV0dXJuICJVcCI7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICIiOworICB9OworfQorCitAIGltcGxlbWVudGF0aW9uIEdzdE9TWFZpZGVvU2lua1dpbmRvdworCisvKiBUaGUgb2JqZWN0IGhhcyB0byBiZSByZWxlYXNlZCAqLworLSAoaWQpIGluaXRXaXRoQ29udGVudE5TUmVjdDogKE5TUmVjdCkgcmVjdAorCQkgc3R5bGVNYXNrOiAodW5zaWduZWQgaW50KSBzdHlsZU1hc2sKKwkJICAgYmFja2luZzogKE5TQmFja2luZ1N0b3JlVHlwZSkgYnVmZmVyaW5nVHlwZQorCQkgICAgIGRlZmVyOiAoQk9PTCkgZmxhZworCQkgICAgc2NyZWVuOihOU1NjcmVlbiAqKSBhU2NyZWVuCit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhDb250ZW50UmVjdDogcmVjdAorCQlzdHlsZU1hc2s6IHN0eWxlTWFzaworCQliYWNraW5nOiBidWZmZXJpbmdUeXBlCisJCWRlZmVyOiBmbGFnCisJCXNjcmVlbjphU2NyZWVuXTsKKworICBHU1RfREVCVUcgKCJJbml0aWFsaXppbmcgR3N0T1NYdmlkZW9TaW5rV2luZG93Iik7CisKKyAgZ3N0dmlldyA9IFtbR3N0R0xWaWV3IGFsbG9jXSBpbml0V2l0aEZyYW1lOnJlY3RdOworCisgIGlmIChnc3R2aWV3KQorICAgIFtzZWxmIHNldENvbnRlbnRWaWV3OmdzdHZpZXddOworICBbc2VsZiBzZXRUaXRsZTpAIkdTdHJlYW1lciBWaWRlbyBPdXRwdXQiXTsKKworICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgc2V0Q29udGVudFNpemU6KE5TU2l6ZSkgc2l6ZSB7CisgIHdpZHRoID0gc2l6ZS53aWR0aDsKKyAgaGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7CisKKyAgW3N1cGVyIHNldENvbnRlbnRTaXplOnNpemVdOworfQorCistIChHc3RHTFZpZXcgKikgZ3N0VmlldyB7CisgIHJldHVybiBnc3R2aWV3OworfQorCistICh2b2lkKSBhd2FrZUZyb21OaWIgeworICBbc2VsZiBzZXRBY2NlcHRzTW91c2VNb3ZlZEV2ZW50czpZRVNdOworfQorCitAZW5kCisKKworLy8KKy8vIE9wZW5HTCBpbXBsZW1lbnRhdGlvbgorLy8KKworQCBpbXBsZW1lbnRhdGlvbiBHc3RHTFZpZXcKKworLSAoaWQpIGluaXRXaXRoRnJhbWU6KE5TUmVjdCkgZnJhbWUgeworICBOU09wZW5HTFBpeGVsRm9ybWF0ICpmbXQ7CisgIE5TT3BlbkdMUGl4ZWxGb3JtYXRBdHRyaWJ1dGUgYXR0cmlic1tdID0geworICAgIE5TT3BlbkdMUEZBTm9SZWNvdmVyeSwKKyAgICBOU09wZW5HTFBGQURvdWJsZUJ1ZmZlciwKKyAgICBOU09wZW5HTFBGQUNvbG9yU2l6ZSwgMjQsCisgICAgTlNPcGVuR0xQRkFBbHBoYVNpemUsIDgsCisgICAgTlNPcGVuR0xQRkFEZXB0aFNpemUsIDI0LAorI2lmIE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPCAxMDkwCisgICAgTlNPcGVuR0xQRkFXaW5kb3csCisjZW5kaWYKKyAgICAwCisgIH07CisKKyAgZm10ID0gW1tOU09wZW5HTFBpeGVsRm9ybWF0IGFsbG9jXQorCSAgaW5pdFdpdGhBdHRyaWJ1dGVzOmF0dHJpYnNdOworCisgIGlmICghZm10KSB7CisgICAgR1NUX1dBUk5JTkcgKCJDYW5ub3QgY3JlYXRlIE5TT3BlbkdMUGl4ZWxGb3JtYXQiKTsKKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgc2VsZiA9IFtzdXBlciBpbml0V2l0aEZyYW1lOiBmcmFtZSBwaXhlbEZvcm1hdDpmbXRdOworICBbZm10IHJlbGVhc2VdOworCisgICBhY3R1YWxDb250ZXh0ID0gW3NlbGYgb3BlbkdMQ29udGV4dF07CisgICBbYWN0dWFsQ29udGV4dCBtYWtlQ3VycmVudENvbnRleHRdOworICAgW2FjdHVhbENvbnRleHQgdXBkYXRlXTsKKworICAvKiBCbGFjayBiYWNrZ3JvdW5kICovCisgIGdsQ2xlYXJDb2xvciAoMC4wLCAwLjAsIDAuMCwgMC4wKTsKKworICBwaV90ZXh0dXJlID0gMDsKKyAgZGF0YSA9IG5pbDsKKyAgd2lkdGggPSBmcmFtZS5zaXplLndpZHRoOworICBoZWlnaHQgPSBmcmFtZS5zaXplLmhlaWdodDsKKyAgZHJhd2luZ0JvdW5kcyA9IE5TTWFrZVJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisKKyAgR1NUX0xPRyAoIldpZHRoOiAlZCBIZWlnaHQ6ICVkIiwgd2lkdGgsIGhlaWdodCk7CisKKyAgdHJhY2tpbmdBcmVhID0gW1tOU1RyYWNraW5nQXJlYSBhbGxvY10gaW5pdFdpdGhSZWN0OltzZWxmIGJvdW5kc10KKyAgICAgIG9wdGlvbnM6IChOU1RyYWNraW5nTW91c2VFbnRlcmVkQW5kRXhpdGVkIHwgTlNUcmFja2luZ01vdXNlTW92ZWQgfCBOU1RyYWNraW5nQWN0aXZlSW5LZXlXaW5kb3cpCisgICAgICBvd25lcjpzZWxmCisgICAgICB1c2VySW5mbzpuaWxdOworCisgIFtzZWxmIGFkZFRyYWNraW5nQXJlYTp0cmFja2luZ0FyZWFdOworICBtYWluVGhyZWFkID0gW05TVGhyZWFkIG1haW5UaHJlYWRdOworCisgIFtzZWxmIGluaXRUZXh0dXJlc107CisgIHJldHVybiBzZWxmOworfQorCistIChOU1JlY3QpIGdldERyYXdpbmdCb3VuZHMgeworICByZXR1cm4gZHJhd2luZ0JvdW5kczsKK30KKworLSAodm9pZCkgcmVzaGFwZSB7CisgIE5TUmVjdCBib3VuZHM7CisgIGdkb3VibGUgZnJhbWVfcGFyLCB2aWV3X3BhcjsKKyAgZ2ludCB2aWV3X2hlaWdodCwgdmlld193aWR0aCwgY19oZWlnaHQsIGNfd2lkdGgsIGNfeCwgY195OworCisKKyAgR1NUX0xPRyAoInJlc2hhcGluZyIpOworCisgIGlmICghaW5pdERvbmUpIHsKKyAgICByZXR1cm47CisgIH0KKworICBbYWN0dWFsQ29udGV4dCBtYWtlQ3VycmVudENvbnRleHRdOworCisgIGJvdW5kcyA9IFtzZWxmIGJvdW5kc107CisgIHZpZXdfd2lkdGggPSBib3VuZHMuc2l6ZS53aWR0aDsKKyAgdmlld19oZWlnaHQgPSBib3VuZHMuc2l6ZS5oZWlnaHQ7CisKKyAgZnJhbWVfcGFyID0gKGdkb3VibGUpIHdpZHRoIC8gaGVpZ2h0OworICB2aWV3X3BhciA9IChnZG91YmxlKSB2aWV3X3dpZHRoIC8gdmlld19oZWlnaHQ7CisgIGlmICgha2VlcEFzcGVjdFJhdGlvKQorICAgIHZpZXdfcGFyID0gZnJhbWVfcGFyOworCisgIGlmIChmcmFtZV9wYXIgPT0gdmlld19wYXIpIHsKKyAgICBjX2hlaWdodCA9IHZpZXdfaGVpZ2h0OworICAgIGNfd2lkdGggPSB2aWV3X3dpZHRoOworICAgIGNfeCA9IDA7CisgICAgY195ID0gMDsKKyAgfSBlbHNlIGlmIChmcmFtZV9wYXIgPCB2aWV3X3BhcikgeworICAgIGNfaGVpZ2h0ID0gdmlld19oZWlnaHQ7CisgICAgY193aWR0aCA9IGNfaGVpZ2h0ICogZnJhbWVfcGFyOworICAgIGNfeCA9ICh2aWV3X3dpZHRoIC0gY193aWR0aCkgLyAyOworICAgIGNfeSA9IDA7CisgIH0gZWxzZSB7CisgICAgY193aWR0aCA9IHZpZXdfd2lkdGg7CisgICAgY19oZWlnaHQgPSBjX3dpZHRoIC8gZnJhbWVfcGFyOworICAgIGNfeCA9IDA7CisgICAgY195ID0gKHZpZXdfaGVpZ2h0IC0gY19oZWlnaHQpIC8gMjsKKyAgfQorCisgIGRyYXdpbmdCb3VuZHMgPSBOU01ha2VSZWN0KGNfeCwgY195LCBjX3dpZHRoLCBjX2hlaWdodCk7CisgIGdsVmlld3BvcnQgKGNfeCwgY195LCAoR0xpbnQpIGNfd2lkdGgsIChHTGludCkgY19oZWlnaHQpOworfQorCistICh2b2lkKSBpbml0VGV4dHVyZXMgeworCisgIFthY3R1YWxDb250ZXh0IG1ha2VDdXJyZW50Q29udGV4dF07CisKKyAgLyogRnJlZSBwcmV2aW91cyB0ZXh0dXJlIGlmIGFueSAqLworICBpZiAocGlfdGV4dHVyZSkgeworICAgIGdsRGVsZXRlVGV4dHVyZXMgKDEsIChHTHVpbnQgKikmcGlfdGV4dHVyZSk7CisgIH0KKworICBpZiAoZGF0YSkgeworICAgIGRhdGEgPSBnX3JlYWxsb2MgKGRhdGEsIHdpZHRoICogaGVpZ2h0ICogc2l6ZW9mKHNob3J0KSk7IC8vIHNob3J0IG9yIDNieXRlPworICB9IGVsc2UgeworICAgIGRhdGEgPSBnX21hbGxvYzAod2lkdGggKiBoZWlnaHQgKiBzaXplb2Yoc2hvcnQpKTsKKyAgfQorICAvKiBDcmVhdGUgdGV4dHVyZXMgKi8KKyAgZ2xHZW5UZXh0dXJlcyAoMSwgKEdMdWludCAqKSZwaV90ZXh0dXJlKTsKKworICBnbEVuYWJsZSAoR0xfVEVYVFVSRV9SRUNUQU5HTEVfRVhUKTsKKyAgZ2xFbmFibGUgKEdMX1VOUEFDS19DTElFTlRfU1RPUkFHRV9BUFBMRSk7CisKKyAgZ2xQaXhlbFN0b3JlaSAoR0xfVU5QQUNLX0FMSUdOTUVOVCwgMSk7CisgIGdsUGl4ZWxTdG9yZWkgKEdMX1VOUEFDS19ST1dfTEVOR1RILCB3aWR0aCk7CisKKyAgZ2xCaW5kVGV4dHVyZSAoR0xfVEVYVFVSRV9SRUNUQU5HTEVfRVhULCBwaV90ZXh0dXJlKTsKKworICAvKiBVc2UgVlJBTSB0ZXh0dXJpbmcgKi8KKyAgZ2xUZXhQYXJhbWV0ZXJpIChHTF9URVhUVVJFX1JFQ1RBTkdMRV9FWFQsCisJCSAgIEdMX1RFWFRVUkVfU1RPUkFHRV9ISU5UX0FQUExFLCBHTF9TVE9SQUdFX0NBQ0hFRF9BUFBMRSk7CisKKyAgLyogVGVsbCB0aGUgZHJpdmVyIG5vdCB0byBtYWtlIGEgY29weSBvZiB0aGUgdGV4dHVyZSBidXQgdG8gdXNlCisgICAgIG91ciBidWZmZXIgKi8KKyAgZ2xQaXhlbFN0b3JlaSAoR0xfVU5QQUNLX0NMSUVOVF9TVE9SQUdFX0FQUExFLCBHTF9UUlVFKTsKKworICAvKiBMaW5lYXIgaW50ZXJwb2xhdGlvbiAqLworICBnbFRleFBhcmFtZXRlcmkgKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0VYVCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICBnbFRleFBhcmFtZXRlcmkgKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0VYVCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworCisgIC8qIEkgaGF2ZSBubyBpZGVhIHdoYXQgdGhpcyBleGFjdGx5IGRvZXMsIGJ1dCBpdCBzZWVtcyB0byBiZQorICAgICBuZWNlc3NhcnkgZm9yIHNjYWxpbmcgKi8KKyAgZ2xUZXhQYXJhbWV0ZXJpIChHTF9URVhUVVJFX1JFQ1RBTkdMRV9FWFQsCisJCSAgIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgZ2xUZXhQYXJhbWV0ZXJpIChHTF9URVhUVVJFX1JFQ1RBTkdMRV9FWFQsCisJCSAgIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKKyAgLy8gZ2xQaXhlbFN0b3JlaSAoR0xfVU5QQUNLX1JPV19MRU5HVEgsIDApOyBXSFkgPz8KKworICBnbFRleEltYWdlMkQgKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0VYVCwgMCwgR0xfUkdCQSwKKwkJd2lkdGgsIGhlaWdodCwgMCwKKwkJR0xfWUNCQ1JfNDIyX0FQUExFLCBHTF9VTlNJR05FRF9TSE9SVF84XzhfQVBQTEUsIGRhdGEpOworCisKKyAgaW5pdERvbmUgPSAxOworfQorCistICh2b2lkKSByZWxvYWRUZXh0dXJlIHsKKyAgaWYgKCFpbml0RG9uZSkgeworICAgIHJldHVybjsKKyAgfQorCisgIEdTVF9MT0cgKCJSZWxvYWRpbmcgVGV4dHVyZSIpOworCisgIFthY3R1YWxDb250ZXh0IG1ha2VDdXJyZW50Q29udGV4dF07CisKKyAgZ2xCaW5kVGV4dHVyZSAoR0xfVEVYVFVSRV9SRUNUQU5HTEVfRVhULCBwaV90ZXh0dXJlKTsKKyAgZ2xQaXhlbFN0b3JlaSAoR0xfVU5QQUNLX1JPV19MRU5HVEgsIHdpZHRoKTsKKworICAvKiBnbFRleFN1YkltYWdlMkQgaXMgZmFzdGVyIHRoYW4gZ2xUZXhJbWFnZTJECisgICAgIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3NhbXBsZWNvZGUvU2FtcGxlX0NvZGUvR3JhcGhpY3NfM0QvCisgICAgIFRleHR1cmVSYW5nZS9NYWluT3BlbkdMVmlldy5tLmh0bSAqLworICBnbFRleFN1YkltYWdlMkQgKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0VYVCwgMCwgMCwgMCwKKwkJICAgd2lkdGgsIGhlaWdodCwKKwkJICAgR0xfWUNCQ1JfNDIyX0FQUExFLCBHTF9VTlNJR05FRF9TSE9SVF84XzhfQVBQTEUsIGRhdGEpOyAgICAvL0ZJWE1FCit9CisKKy0gKHZvaWQpIGNsZWFuVXAgeworICBpbml0RG9uZSA9IDA7Cit9CisKKy0gKHZvaWQpIGRyYXdRdWFkIHsKKyAgZl94ID0gMS4wOworICBmX3kgPSAxLjA7CisKKyAgZ2xCZWdpbiAoR0xfUVVBRFMpOworICAvKiBUb3AgbGVmdCAqLworICBnbFRleENvb3JkMmYgKDAuMCwgMC4wKTsKKyAgZ2xWZXJ0ZXgyZiAoLWZfeCwgZl95KTsKKyAgLyogQm90dG9tIGxlZnQgKi8KKyAgZ2xUZXhDb29yZDJmICgwLjAsIChmbG9hdCkgaGVpZ2h0KTsKKyAgZ2xWZXJ0ZXgyZiAoLWZfeCwgLWZfeSk7CisgIC8qIEJvdHRvbSByaWdodCAqLworICBnbFRleENvb3JkMmYgKChmbG9hdCkgd2lkdGgsIChmbG9hdCkgaGVpZ2h0KTsKKyAgZ2xWZXJ0ZXgyZiAoZl94LCAtZl95KTsKKyAgLyogVG9wIHJpZ2h0ICovCisgIGdsVGV4Q29vcmQyZiAoKGZsb2F0KSB3aWR0aCwgMC4wKTsKKyAgZ2xWZXJ0ZXgyZiAoZl94LCBmX3kpOworICBnbEVuZCAoKTsKK30KKworLSAodm9pZCkgZHJhd1JlY3Q6KE5TUmVjdCkgcmVjdCB7CisgIEdMaW50IHBhcmFtc1tdID0geyAxIH07CisKKyAgW2FjdHVhbENvbnRleHQgbWFrZUN1cnJlbnRDb250ZXh0XTsKKworICBDR0xTZXRQYXJhbWV0ZXIgKENHTEdldEN1cnJlbnRDb250ZXh0ICgpLCBrQ0dMQ1BTd2FwSW50ZXJ2YWwsIHBhcmFtcyk7CisKKyAgLyogQmxhY2sgYmFja2dyb3VuZCAqLworICBnbENsZWFyIChHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCk7CisKKyAgaWYgKCFpbml0RG9uZSkgeworICAgIFthY3R1YWxDb250ZXh0IGZsdXNoQnVmZmVyXTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBEcmF3ICovCisgIGdsQmluZFRleHR1cmUgKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0VYVCwgcGlfdGV4dHVyZSk7IC8vIEZJWE1FCisgIFtzZWxmIGRyYXdRdWFkXTsKKyAgLyogRHJhdyAqLworICBbYWN0dWFsQ29udGV4dCBmbHVzaEJ1ZmZlcl07Cit9CisKKy0gKHZvaWQpIGRpc3BsYXlUZXh0dXJlIHsKKyAgaWYgKFtzZWxmIGxvY2tGb2N1c0lmQ2FuRHJhd10pIHsKKworICAgIFtzZWxmIGRyYXdSZWN0OltzZWxmIGJvdW5kc11dOworICAgIFtzZWxmIHJlbG9hZFRleHR1cmVdOworCisgICAgW3NlbGYgdW5sb2NrRm9jdXNdOworCisgIH0KKworfQorCistIChjaGFyICopIGdldFRleHR1cmVCdWZmZXIgeworICByZXR1cm4gZGF0YTsKK30KKworLSAodm9pZCkgc2V0RnVsbFNjcmVlbjooQk9PTCkgZmxhZyB7CisgIGlmICghZnVsbHNjcmVlbiAmJiBmbGFnKSB7CisgICAgLy8gZ28gdG8gZnVsbCBzY3JlZW4KKyAgICAvKiBDcmVhdGUgdGhlIG5ldyBwaXhlbCBmb3JtYXQgKi8KKyAgICBOU09wZW5HTFBpeGVsRm9ybWF0ICpmbXQ7CisgICAgTlNPcGVuR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZSBhdHRyaWJzW10gPSB7CisgICAgICBOU09wZW5HTFBGQUFjY2VsZXJhdGVkLAorICAgICAgTlNPcGVuR0xQRkFOb1JlY292ZXJ5LAorICAgICAgTlNPcGVuR0xQRkFEb3VibGVCdWZmZXIsCisgICAgICBOU09wZW5HTFBGQUNvbG9yU2l6ZSwgMjQsCisgICAgICBOU09wZW5HTFBGQUFscGhhU2l6ZSwgOCwKKyAgICAgIE5TT3BlbkdMUEZBRGVwdGhTaXplLCAyNCwKKyNpZiBNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEIDwgMTA2MAorICAgICAgTlNPcGVuR0xQRkFGdWxsU2NyZWVuLAorI2VuZGlmCisgICAgICBOU09wZW5HTFBGQVNjcmVlbk1hc2ssCisgICAgICBDR0Rpc3BsYXlJRFRvT3BlbkdMRGlzcGxheU1hc2sgKGtDR0RpcmVjdE1haW5EaXNwbGF5KSwKKyAgICAgIDAKKyAgICB9OworCisgICAgZm10ID0gW1tOU09wZW5HTFBpeGVsRm9ybWF0IGFsbG9jXQorCSAgICBpbml0V2l0aEF0dHJpYnV0ZXM6YXR0cmlic107CisKKyAgICBpZiAoIWZtdCkgeworICAgICAgR1NUX1dBUk5JTkcgKCJDYW5ub3QgY3JlYXRlIE5TT3BlbkdMUGl4ZWxGb3JtYXQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgdGhlIG5ldyBPcGVuR0wgY29udGV4dCAqLworICAgIGZ1bGxTY3JlZW5Db250ZXh0ID0gW1tOU09wZW5HTENvbnRleHQgYWxsb2NdCisJCQkgIGluaXRXaXRoRm9ybWF0OiBmbXQgc2hhcmVDb250ZXh0Om5pbF07CisgICAgaWYgKCFmdWxsU2NyZWVuQ29udGV4dCkgeworICAgICAgR1NUX1dBUk5JTkcgKCJGYWlsZWQgdG8gY3JlYXRlIG5ldyBOU09wZW5HTENvbnRleHQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhY3R1YWxDb250ZXh0ID0gZnVsbFNjcmVlbkNvbnRleHQ7CisKKyAgICAvKiBDYXB0dXJlIGRpc3BsYXksIHN3aXRjaCB0byBmdWxsc2NyZWVuICovCisgICAgaWYgKENHQ2FwdHVyZUFsbERpc3BsYXlzICgpICE9IENHRGlzcGxheU5vRXJyKSB7CisgICAgICBHU1RfV0FSTklORyAoIkNHQ2FwdHVyZUFsbERpc3BsYXlzKCkgZmFpbGVkIik7CisgICAgICByZXR1cm47CisgICAgfQorI2lmIE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPCAxMDcwCisgICAgW2Z1bGxTY3JlZW5Db250ZXh0IHNldEZ1bGxTY3JlZW5dOworI2VuZGlmCisgICAgW2Z1bGxTY3JlZW5Db250ZXh0IG1ha2VDdXJyZW50Q29udGV4dF07CisKKyAgICBmdWxsc2NyZWVuID0gWUVTOworCisgICAgW3NlbGYgaW5pdFRleHR1cmVzXTsKKyAgICBbc2VsZiBzZXROZWVkc0Rpc3BsYXk6WUVTXTsKKworICB9IGVsc2UgaWYgKGZ1bGxzY3JlZW4gJiYgIWZsYWcpIHsKKyAgICAvLyBmdWxsc2NyZWVuIG5vdyBhbmQgbmVlZHMgdG8gZ28gYmFjayB0byBub3JtYWwKKyAgICBpbml0RG9uZSA9IE5POworCisgICAgYWN0dWFsQ29udGV4dCA9IFtzZWxmIG9wZW5HTENvbnRleHRdOworCisgICAgW05TT3BlbkdMQ29udGV4dCBjbGVhckN1cnJlbnRDb250ZXh0XTsKKyAgICBbZnVsbFNjcmVlbkNvbnRleHQgY2xlYXJEcmF3YWJsZV07CisgICAgW2Z1bGxTY3JlZW5Db250ZXh0IHJlbGVhc2VdOworICAgIGZ1bGxTY3JlZW5Db250ZXh0ID0gbmlsOworCisgICAgQ0dSZWxlYXNlQWxsRGlzcGxheXMgKCk7CisKKyAgICBbc2VsZiByZXNoYXBlXTsKKyAgICBbc2VsZiBpbml0VGV4dHVyZXNdOworCisgICAgW3NlbGYgc2V0TmVlZHNEaXNwbGF5OllFU107CisKKyAgICBmdWxsc2NyZWVuID0gTk87CisgICAgaW5pdERvbmUgPSBZRVM7CisgIH0KK30KKworLSAodm9pZCkgc2V0VmlkZW9TaXplOiAoaW50KXcgOiAoaW50KWggeworICBHU1RfTE9HICgid2lkdGg6JWQsIGhlaWdodDolZCIsIHcsIGgpOworCisgIHdpZHRoID0gdzsKKyAgaGVpZ2h0ID0gaDsKKworICBbc2VsZiBpbml0VGV4dHVyZXNdOworICBbc2VsZiByZXNoYXBlXTsKK30KKworLSAodm9pZCkgc2V0S2VlcEFzcGVjdFJhdGlvOiAoQk9PTCkgZmxhZyB7CisgIGtlZXBBc3BlY3RSYXRpbyA9IGZsYWc7CisgIFtzZWxmIHJlc2hhcGVdOworfQorCisjaWZuZGVmIEdTVFJFQU1FUl9HTElCX0NPQ09BX05TQVBQTElDQVRJT04KKy0gKHZvaWQpIHNldE1haW5UaHJlYWQ6IChOU1RocmVhZCAqKSB0aHJlYWQgeworICBtYWluVGhyZWFkID0gdGhyZWFkOworfQorI2VuZGlmCisKKy0gKHZvaWQpIGhhdmVTdXBlcnZpZXdSZWFsOihOU011dGFibGVBcnJheSAqKWNsb3N1cmUgeworCUJPT0wgaGF2ZVN1cGVydmlldyA9IFtzZWxmIHN1cGVydmlld10gIT0gbmlsOworCVtjbG9zdXJlIGFkZE9iamVjdDpbTlNOdW1iZXIgbnVtYmVyV2l0aEJvb2w6aGF2ZVN1cGVydmlld11dOworfQorCistIChCT09MKSBoYXZlU3VwZXJ2aWV3IHsKKwlOU011dGFibGVBcnJheSAqY2xvc3VyZSA9IFtOU011dGFibGVBcnJheSBhcnJheVdpdGhDYXBhY2l0eToxXTsKKwlbc2VsZiBwZXJmb3JtU2VsZWN0b3I6QHNlbGVjdG9yKGhhdmVTdXBlcnZpZXdSZWFsOikKKwkJb25UaHJlYWQ6bWFpblRocmVhZAorCQl3aXRoT2JqZWN0OihpZCljbG9zdXJlIHdhaXRVbnRpbERvbmU6WUVTXTsKKworCXJldHVybiBbW2Nsb3N1cmUgb2JqZWN0QXRJbmRleDowXSBib29sVmFsdWVdOworfQorCistICh2b2lkKSBhZGRUb1N1cGVydmlld1JlYWw6KE5TVmlldyAqKXN1cGVydmlldyB7CisJTlNSZWN0IGJvdW5kczsKKwlbc3VwZXJ2aWV3IGFkZFN1YnZpZXc6c2VsZl07CisJYm91bmRzID0gW3N1cGVydmlldyBib3VuZHNdOworCVtzZWxmIHNldEZyYW1lOmJvdW5kc107CisJW3NlbGYgc2V0QXV0b3Jlc2l6aW5nTWFzazpOU1ZpZXdXaWR0aFNpemFibGV8TlNWaWV3SGVpZ2h0U2l6YWJsZV07Cit9CisKKy0gKHZvaWQpIGFkZFRvU3VwZXJ2aWV3OiAoTlNWaWV3ICopc3VwZXJ2aWV3IHsKKwlbc2VsZiBwZXJmb3JtU2VsZWN0b3I6QHNlbGVjdG9yKGFkZFRvU3VwZXJ2aWV3UmVhbDopCisJCW9uVGhyZWFkOm1haW5UaHJlYWQKKwkJd2l0aE9iamVjdDpzdXBlcnZpZXcgd2FpdFVudGlsRG9uZTpZRVNdOworfQorCistICh2b2lkKSByZW1vdmVGcm9tU3VwZXJ2aWV3OiAoaWQpdW51c2VkCit7CisJW3NlbGYgcmVtb3ZlRnJvbVN1cGVydmlld107Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MgeworICBHU1RfTE9HICgiZGVhbGxvYyBjYWxsZWQiKTsKKyAgaWYgKGRhdGEpIGdfZnJlZShkYXRhKTsKKworICBpZiAoZnVsbFNjcmVlbkNvbnRleHQpIHsKKyAgICBbTlNPcGVuR0xDb250ZXh0IGNsZWFyQ3VycmVudENvbnRleHRdOworICAgIFtmdWxsU2NyZWVuQ29udGV4dCBjbGVhckRyYXdhYmxlXTsKKyAgICBbZnVsbFNjcmVlbkNvbnRleHQgcmVsZWFzZV07CisgICAgaWYgKGFjdHVhbENvbnRleHQgPT0gZnVsbFNjcmVlbkNvbnRleHQpIGFjdHVhbENvbnRleHQgPSBuaWw7CisgICAgZnVsbFNjcmVlbkNvbnRleHQgPSBuaWw7CisgIH0KKworICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKHZvaWQpdXBkYXRlVHJhY2tpbmdBcmVhcyB7CisgIFtzZWxmIHJlbW92ZVRyYWNraW5nQXJlYTp0cmFja2luZ0FyZWFdOworICBbdHJhY2tpbmdBcmVhIHJlbGVhc2VdOworICB0cmFja2luZ0FyZWEgPSBbW05TVHJhY2tpbmdBcmVhIGFsbG9jXSBpbml0V2l0aFJlY3Q6IFtzZWxmIGJvdW5kc10KKyAgICAgIG9wdGlvbnM6IChOU1RyYWNraW5nTW91c2VFbnRlcmVkQW5kRXhpdGVkIHwgTlNUcmFja2luZ01vdXNlTW92ZWQgfCBOU1RyYWNraW5nQWN0aXZlSW5LZXlXaW5kb3cpCisgICAgICBvd25lcjpzZWxmIHVzZXJJbmZvOm5pbF07CisgIFtzZWxmIGFkZFRyYWNraW5nQXJlYTp0cmFja2luZ0FyZWFdOworfQorCistIChCT09MKWFjY2VwdHNGaXJzdFJlc3BvbmRlciB7CisgICAgcmV0dXJuIFlFUzsKK30KKworLSAodm9pZCkgc2V0TmF2aWdhdGlvbjooR3N0TmF2aWdhdGlvbiAqKW5hdgoreworICBuYXZpZ2F0aW9uID0gbmF2OworfQorCistICh2b2lkKXNlbmRNb3VzZUV2ZW50OihOU0V2ZW50ICopZXZlbnQgOiAoY29uc3QgY2hhciAqKWV2ZW50X25hbWUKK3sKKyAgTlNQb2ludCBsb2NhdGlvbjsKKyAgZ2ludCBidXR0b247CisgIGdkb3VibGUgeCwgeTsKKworICBpZiAoIW5hdmlnYXRpb24pCisgICAgcmV0dXJuOworCisgIHN3aXRjaCAoW2V2ZW50IHR5cGVdKSB7CisgICAgY2FzZSBOU0V2ZW50VHlwZU1vdXNlTW92ZWQ6CisgICAgICBidXR0b24gPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBOU0V2ZW50VHlwZUxlZnRNb3VzZURvd246CisgICAgY2FzZSBOU0V2ZW50VHlwZUxlZnRNb3VzZVVwOgorICAgICAgYnV0dG9uID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTlNFdmVudFR5cGVSaWdodE1vdXNlRG93bjoKKyAgICBjYXNlIE5TRXZlbnRUeXBlUmlnaHRNb3VzZVVwOgorICAgICAgYnV0dG9uID0gMjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBidXR0b24gPSAzOworICAgICAgYnJlYWs7CisgIH0KKworICBsb2NhdGlvbiA9IFtzZWxmIGNvbnZlcnRQb2ludDpbZXZlbnQgbG9jYXRpb25JbldpbmRvd10gZnJvbVZpZXc6bmlsXTsKKworICB4ID0gbG9jYXRpb24ueDsKKyAgeSA9IGxvY2F0aW9uLnk7CisgIC8qIGludmVydCBZICovCisKKyAgeSA9ICgxIC0gKChnZG91YmxlKSB5KSAvIFtzZWxmIGJvdW5kc10uc2l6ZS5oZWlnaHQpICogW3NlbGYgYm91bmRzXS5zaXplLmhlaWdodDsKKworICBnc3RfbmF2aWdhdGlvbl9zZW5kX21vdXNlX2V2ZW50IChuYXZpZ2F0aW9uLCBldmVudF9uYW1lLCBidXR0b24sIHgsIHkpOworfQorCistICh2b2lkKXNlbmRLZXlFdmVudDooTlNFdmVudCAqKWV2ZW50IDogKGNvbnN0IGNoYXIgKilldmVudF9uYW1lCit7CisgIGlmICghbmF2aWdhdGlvbikKKyAgICByZXR1cm47CisKKyAgZ3N0X25hdmlnYXRpb25fc2VuZF9rZXlfZXZlbnQobmF2aWdhdGlvbiwgZXZlbnRfbmFtZSwgZ3N0X2tleWNvZGVfdG9fa2V5bmFtZShbZXZlbnQga2V5Q29kZV0pKTsKK30KKworLSAodm9pZClzZW5kTW9kaWZpZXJLZXlFdmVudDooTlNFdmVudCAqKWV2ZW50Cit7CisgIE5TVUludGVnZXIgZmxhZ3MgPSBbZXZlbnQgbW9kaWZpZXJGbGFnc107CisgIGNvbnN0IGdjaGFyKiBldmVudF9uYW1lID0gZmxhZ3MgPiBzYXZlZE1vZGlmaWVyRmxhZ3MgPyAia2V5LXByZXNzIiA6ICJrZXktcmVsZWFzZSI7CisgIHNhdmVkTW9kaWZpZXJGbGFncyA9IGZsYWdzOworICBbc2VsZiBzZW5kS2V5RXZlbnQ6IGV2ZW50OiBldmVudF9uYW1lXTsKK30KKworLSAodm9pZClrZXlEb3duOihOU0V2ZW50ICopIGV2ZW50OworeworICBbc2VsZiBzZW5kS2V5RXZlbnQ6IGV2ZW50OiAia2V5LXByZXNzIl07CisgIFtzdXBlciBrZXlEb3duOiBldmVudF07Cit9CisKKy0gKHZvaWQpa2V5VXA6KE5TRXZlbnQgKikgZXZlbnQ7Cit7CisgIFtzZWxmIHNlbmRLZXlFdmVudDogZXZlbnQ6ICJrZXktcmVsZWFzZSJdOworICBbc3VwZXIga2V5VXA6IGV2ZW50XTsKK30KKworLSAodm9pZClmbGFnc0NoYW5nZWQ6KE5TRXZlbnQgKikgZXZlbnQ7Cit7CisgIFtzZWxmIHNlbmRNb2RpZmllcktleUV2ZW50OiBldmVudF07CisgIFtzdXBlciBmbGFnc0NoYW5nZWQ6IGV2ZW50XTsKK30KKworLSAodm9pZCltb3VzZURvd246KE5TRXZlbnQgKikgZXZlbnQ7Cit7CisgIFtzZWxmIHNlbmRNb3VzZUV2ZW50OmV2ZW50OiAibW91c2UtYnV0dG9uLXByZXNzIl07CisgIFtzdXBlciBtb3VzZURvd246IGV2ZW50XTsKK30KKworLSAodm9pZCltb3VzZVVwOihOU0V2ZW50ICopIGV2ZW50OworeworICBbc2VsZiBzZW5kTW91c2VFdmVudDpldmVudDogIm1vdXNlLWJ1dHRvbi1yZWxlYXNlIl07CisgIFtzdXBlciBtb3VzZVVwOiBldmVudF07Cit9CisKKy0gKHZvaWQpbW91c2VNb3ZlZDooTlNFdmVudCAqKWV2ZW50OworeworICBbc2VsZiBzZW5kTW91c2VFdmVudDpldmVudDogIm1vdXNlLW1vdmUiXTsKKyAgW3N1cGVyIG1vdXNlTW92ZWQ6IGV2ZW50XTsKK30KKworLSAodm9pZCltb3VzZUVudGVyZWQ6KE5TRXZlbnQgKilldmVudDsKK3sKKyAgW3N1cGVyIG1vdXNlRW50ZXJlZDogZXZlbnRdOworfQorCistICh2b2lkKW1vdXNlRXhpdGVkOihOU0V2ZW50ICopZXZlbnQ7Cit7CisgIFtzdXBlciBtb3VzZUV4aXRlZDogZXZlbnRdOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9zeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmggYi9zeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ2N2IwZQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsuaApAQCAtMCwwICsxLDE0MSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtNiBaYWhlZXIgQWJiYXMgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBQaW9uZWVycyBvZiB0aGUgSW5ldml0YWJsZSA8c29uZ2JpcmRAc29uZ2JpcmRuZXN0LmNvbT4KKyAqCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIFRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgd2FzIG1hZGUgcG9zc2libGUgZHVlIHRvIHRoZSBpbnZvbHZlbWVudCBvZiBQaW9uZWVycyAKKyAqIG9mIHRoZSBJbmV2aXRhYmxlLCB0aGUgY3JlYXRvcnMgb2YgdGhlIFNvbmdiaXJkIE11c2ljIHBsYXllcgorICogCisgKi8KKyAKKyNpZm5kZWYgX19HU1RfT1NYX1ZJREVPX1NJTktfSF9fCisjZGVmaW5lIF9fR1NUX09TWF9WSURFT19TSU5LX0hfXworCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvc2luay5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG9iamMvcnVudGltZS5oPgorI2luY2x1ZGUgPENvY29hL0NvY29hLmg+CisKKyNpbXBvcnQgImNvY29hd2luZG93LmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKGdzdF9kZWJ1Z19vc3hfdmlkZW9fc2luayk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfZGVidWdfb3N4X3ZpZGVvX3NpbmsKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX09TWF9WSURFT19TSU5LIFwKKyAgKGdzdF9vc3hfdmlkZW9fc2lua19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfT1NYX1ZJREVPX1NJTksob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSwgR1NUX1RZUEVfT1NYX1ZJREVPX1NJTkssIEdzdE9TWFZpZGVvU2luaykpCisjZGVmaW5lIEdTVF9PU1hfVklERU9fU0lOS19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSwgR1NUX1RZUEVfT1NYX1ZJREVPX1NJTkssIEdzdE9TWFZpZGVvU2lua0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX09TWF9WSURFT19TSU5LKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksIEdTVF9UWVBFX09TWF9WSURFT19TSU5LKSkKKyNkZWZpbmUgR1NUX0lTX09TWF9WSURFT19TSU5LX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLCBHU1RfVFlQRV9PU1hfVklERU9fU0lOSykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RPU1hXaW5kb3cgR3N0T1NYV2luZG93OworCit0eXBlZGVmIHN0cnVjdCBfR3N0T1NYVmlkZW9TaW5rIEdzdE9TWFZpZGVvU2luazsKK3R5cGVkZWYgc3RydWN0IF9Hc3RPU1hWaWRlb1NpbmtDbGFzcyBHc3RPU1hWaWRlb1NpbmtDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9PU1hWSURFT0JVRkZFUiAoZ3N0X29zeHZpZGVvYnVmZmVyX2dldF90eXBlKCkpCisKK3R5cGVkZWYgZW51bSB7CisgIEdTVF9PU1hfVklERU9fU0lOS19SVU5fTE9PUF9TVEFURV9OT1RfUlVOTklORyA9IDAsCisgIEdTVF9PU1hfVklERU9fU0lOS19SVU5fTE9PUF9TVEFURV9SVU5OSU5HID0gMSwKKyAgR1NUX09TWF9WSURFT19TSU5LX1JVTl9MT09QX1NUQVRFX1VOS05PV04gPSAyLAorfSBHc3RPU1hWaWRlb1NpbmtSdW5Mb29wU3RhdGU7CisKKy8qIE9TWFdpbmRvdyBzdHVmZiAqLworc3RydWN0IF9Hc3RPU1hXaW5kb3cgeworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIGdib29sZWFuIGNsb3NlZDsKKyAgZ2Jvb2xlYW4gaW50ZXJuYWw7CisgIEdzdEdMVmlldyogZ3N0dmlldzsKKyAgR3N0T1NYVmlkZW9TaW5rV2luZG93KiB3aW47Cit9OworCitzdHJ1Y3QgX0dzdE9TWFZpZGVvU2luayB7CisgIC8qIE91ciBlbGVtZW50IHN0dWZmICovCisgIEdzdFZpZGVvU2luayB2aWRlb3Npbms7CisgIEdzdE9TWFdpbmRvdyAqb3N4d2luZG93OworICB2b2lkICpvc3h2aWRlb3NpbmtvYmplY3Q7CisgIE5TVmlldyAqc3VwZXJ2aWV3OworICBnYm9vbGVhbiBrZWVwX3BhcjsKKyAgR3N0VmlkZW9JbmZvIGluZm87Cit9OworCitzdHJ1Y3QgX0dzdE9TWFZpZGVvU2lua0NsYXNzIHsKKyAgR3N0VmlkZW9TaW5rQ2xhc3MgcGFyZW50X2NsYXNzOworCisgIEdzdE9TWFZpZGVvU2lua1J1bkxvb3BTdGF0ZSBydW5fbG9vcF9zdGF0ZTsKKyAgTlNUaHJlYWQgKm5zX2FwcF90aHJlYWQ7Cit9OworCitHVHlwZSBnc3Rfb3N4X3ZpZGVvX3NpbmtfZ2V0X3R5cGUodm9pZCk7CisKK0BpbnRlcmZhY2UgTlNBcHBsaWNhdGlvbihBcHBsZU1lbnUpCistICh2b2lkKXNldEFwcGxlTWVudTooTlNNZW51ICopbWVudTsKK0BlbmQKKworQGludGVyZmFjZSBHc3RCdWZmZXJPYmplY3QgOiBOU09iamVjdAoreworICBAcHVibGljCisgIEdzdEJ1ZmZlciAqYnVmOworfQorCistKGlkKSBpbml0V2l0aEJ1ZmZlcjogKEdzdEJ1ZmZlciAqKSBidWY7CitAZW5kCisKKworQGludGVyZmFjZSBHc3RXaW5kb3dEZWxlZ2F0ZSA6IE5TT2JqZWN0IDxOU1dpbmRvd0RlbGVnYXRlPgoreworICBAcHVibGljCisgIEdzdE9TWFZpZGVvU2luayAqb3N4dmlkZW9zaW5rOworfQorLShpZCkgaW5pdFdpdGhTaW5rOiAoR3N0T1NYVmlkZW9TaW5rICopIHNpbms7CitAZW5kCisKK0BpbnRlcmZhY2UgR3N0T1NYVmlkZW9TaW5rT2JqZWN0IDogTlNPYmplY3QKK3sKKyAgQHB1YmxpYworICBHc3RPU1hWaWRlb1NpbmsgKm9zeHZpZGVvc2luazsKK30KKworLShpZCkgaW5pdFdpdGhTaW5rOiAoR3N0T1NYVmlkZW9TaW5rICopIHNpbms7CistKHZvaWQpIGNyZWF0ZUludGVybmFsV2luZG93OworLSh2b2lkKSByZXNpemU7CistKHZvaWQpIGRlc3Ryb3k7CistKHZvaWQpIHNob3dGcmFtZTogKEdzdEJ1ZmZlck9iamVjdCopIGJ1ZjsKKy0odm9pZCkgc2V0VmlldzogKE5TVmlldyopIHZpZXc7CisrIChCT09MKSBpc01haW5UaHJlYWQ7CisjaWZuZGVmIEdTVFJFQU1FUl9HTElCX0NPQ09BX05TQVBQTElDQVRJT04KKy0odm9pZCkgbnNBcHBUaHJlYWQ7CistKHZvaWQpIGNoZWNrTWFpblJ1bkxvb3A7CisjZW5kaWYKK0BlbmQKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX09TWF9WSURFT19TSU5LX0hfXyAqLworCmRpZmYgLS1naXQgYS9zeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm0gYi9zeXMvb3N4dmlkZW8vb3N4dmlkZW9zaW5rLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0MGQ1MQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9vc3h2aWRlby9vc3h2aWRlb3NpbmsubQpAQCAtMCwwICsxLDEwMjUgQEAKKy8qIEdTdHJlYW1lcgorICogT1NYIHZpZGVvIHNpbmsKKyAqIENvcHlyaWdodCAoQykgMjAwNC02IFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA3LDIwMDgsMjAwOSBQaW9uZWVycyBvZiB0aGUgSW5ldml0YWJsZSA8c29uZ2JpcmRAc29uZ2JpcmRuZXN0LmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBUaGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIHdhcyBtYWRlIHBvc3NpYmxlIGR1ZSB0byB0aGUgaW52b2x2ZW1lbnQgb2YKKyAqIFBpb25lZXJzIG9mIHRoZSBJbmV2aXRhYmxlLCB0aGUgY3JlYXRvcnMgb2YgdGhlIFNvbmdiaXJkIE11c2ljIHBsYXllci4KKyAqCisgKi8KKworLyoqCisgKiBTRUNUSU9OOmVsZW1lbnQtb3N4dmlkZW9zaW5rCisgKgorICogVGhlIE9TWFZpZGVvU2luayByZW5kZXJzIHZpZGVvIGZyYW1lcyB0byBhIE1hY09TWCB3aW5kb3cuIFRoZSB2aWRlbyBvdXRwdXQKKyAqIG11c3QgYmUgZGlyZWN0ZWQgdG8gYSB3aW5kb3cgZW1iZWRkZWQgaW4gYW4gZXhpc3RpbmcgTlNBcHAuCisgKgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW9vdmVybGF5Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL25hdmlnYXRpb24uaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworI2luY2x1ZGUgIm9zeHZpZGVvc2luay5oIgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2ltcG9ydCAiY29jb2F3aW5kb3cuaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZIChnc3RfZGVidWdfb3N4X3ZpZGVvX3NpbmspOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X2RlYnVnX29zeF92aWRlb19zaW5rCisKKyNpZm5kZWYgR1NUUkVBTUVSX0dMSUJfQ09DT0FfTlNBUFBMSUNBVElPTgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KK2V4dGVybiB2b2lkIF9DRlJ1bkxvb3BTZXRDdXJyZW50IChDRlJ1bkxvb3BSZWYgcmwpOworZXh0ZXJuIHB0aHJlYWRfdCBfQ0ZNYWluUFRocmVhZDsKKyNlbmRpZgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgZ3N0X29zeF92aWRlb19zaW5rX3NpbmtfdGVtcGxhdGVfZmFjdG9yeSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXJhdywgIgorICAgICAgICAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbIDAsIE1BWCBdLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsgMSwgTUFYIF0sICIKKyAgICAgICAgImhlaWdodCA9IChpbnQpIFsgMSwgTUFYIF0sICIKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19CSUdfRU5ESUFOCisgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIFlVWTIiKQorI2Vsc2UKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIFVZVlkiKQorI2VuZGlmCisgICAgKTsKKworZW51bQoreworICBBUkdfMCwKKyAgQVJHX0VNQkVELAorICBBUkdfRk9SQ0VfUEFSLAorfTsKKworc3RhdGljIHZvaWQgZ3N0X29zeF92aWRlb19zaW5rX29zeHdpbmRvd19kZXN0cm95IChHc3RPU1hWaWRlb1NpbmsgKiBvc3h2aWRlb3NpbmspOworCisjaWZuZGVmIEdTVFJFQU1FUl9HTElCX0NPQ09BX05TQVBQTElDQVRJT04KK3N0YXRpYyBHTXV0ZXggX3J1bl9sb29wX2NoZWNrX211dGV4Oworc3RhdGljIEdNdXRleCBfcnVuX2xvb3BfbXV0ZXg7CitzdGF0aWMgR0NvbmQgX3J1bl9sb29wX2NvbmQ7CisjZW5kaWYKKworc3RhdGljIEdzdE9TWFZpZGVvU2lua0NsYXNzICpzaW5rX2NsYXNzID0gTlVMTDsKK3N0YXRpYyBHc3RWaWRlb1NpbmtDbGFzcyAqcGFyZW50X2NsYXNzID0gTlVMTDsKKworI2lmIE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPCAxMDEyMDAKKyNkZWZpbmUgTlNFdmVudE1hc2tBbnkgICAgICAgICAgICAgICAgICAgICAgIE5TQW55RXZlbnRNYXNrCisjZGVmaW5lIE5TV2luZG93U3R5bGVNYXNrVGl0bGVkICAgICAgICAgICAgICBOU1RpdGxlZFdpbmRvd01hc2sKKyNkZWZpbmUgTlNXaW5kb3dTdHlsZU1hc2tDbG9zYWJsZSAgICAgICAgICAgIE5TQ2xvc2FibGVXaW5kb3dNYXNrCisjZGVmaW5lIE5TV2luZG93U3R5bGVNYXNrUmVzaXphYmxlICAgICAgICAgICBOU1Jlc2l6YWJsZVdpbmRvd01hc2sKKyNkZWZpbmUgTlNXaW5kb3dTdHlsZU1hc2tUZXh0dXJlZEJhY2tncm91bmQgIE5TVGV4dHVyZWRCYWNrZ3JvdW5kV2luZG93TWFzaworI2RlZmluZSBOU1dpbmRvd1N0eWxlTWFza01pbmlhdHVyaXphYmxlICAgICAgTlNNaW5pYXR1cml6YWJsZVdpbmRvd01hc2sKKyNlbmRpZgorCisvKiBIZWxwZXIgdG8gdHJpZ2dlciBjYWxscyBmcm9tIHRoZSBtYWluIHRocmVhZCAqLworc3RhdGljIHZvaWQKK2dzdF9vc3hfdmlkZW9fc2lua19jYWxsX2Zyb21fbWFpbl90aHJlYWQoR3N0T1NYVmlkZW9TaW5rICpvc3h2aWRlb3NpbmssCisgICAgTlNPYmplY3QgKiBvYmplY3QsIFNFTCBmdW5jdGlvbiwgTlNPYmplY3QgKmRhdGEsIEJPT0wgd2FpdFVudGlsRG9uZSkKK3sKKworICBOU1RocmVhZCAqdGhyZWFkOworICBOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworCisgIGlmIChzaW5rX2NsYXNzLT5uc19hcHBfdGhyZWFkID09IE5VTEwpeworICAgIHRocmVhZCA9IFtOU1RocmVhZCBtYWluVGhyZWFkXTsKKyAgfSBlbHNlIHsKKyAgICB0aHJlYWQgPSBzaW5rX2NsYXNzLT5uc19hcHBfdGhyZWFkOworICB9CisKKyAgW29iamVjdCBwZXJmb3JtU2VsZWN0b3I6ZnVuY3Rpb24gb25UaHJlYWQ6dGhyZWFkCisgICAgICAgICAgd2l0aE9iamVjdDpkYXRhIHdhaXRVbnRpbERvbmU6d2FpdFVudGlsRG9uZV07CisgIFtwb29sIHJlbGVhc2VdOworfQorCisjaWZuZGVmIEdTVFJFQU1FUl9HTElCX0NPQ09BX05TQVBQTElDQVRJT04KKy8qIFBvbGwgZm9yIGNvY29hIGV2ZW50cyAqLworc3RhdGljIHZvaWQKK3J1bl9uc19hcHBfbG9vcCAodm9pZCkgeworICBOU0V2ZW50ICpldmVudDsKKyAgTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2wgPVtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworICBOU0RhdGUgKnBvbGxUaW1lID0gbmlsOworCisgIC8qIHdoZW4gcnVubmluZyB0aGUgbG9vcCBpbiBhIHRocmVhZCB3ZSB3YW50IHRvIHNsZWVwIGFzIGxvbmcgYXMgcG9zc2libGUgKi8KKyAgcG9sbFRpbWUgPSBbTlNEYXRlIGRpc3RhbnRGdXR1cmVdOworCisgIGRvIHsKKyAgICAgIGV2ZW50ID0gW05TQXBwIG5leHRFdmVudE1hdGNoaW5nTWFzazpOU0V2ZW50TWFza0FueSB1bnRpbERhdGU6cG9sbFRpbWUKKyAgICAgICAgICBpbk1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGUgZGVxdWV1ZTpZRVNdOworICAgICAgW05TQXBwIHNlbmRFdmVudDpldmVudF07CisgICAgfQorICB3aGlsZSAoZXZlbnQgIT0gbmlsKTsKKyAgW3Bvb2wgcmVsZWFzZV07Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X3ZpZGVvc2lua19jaGVja19tYWluX3J1bl9sb29wIChHc3RPU1hWaWRlb1NpbmsgKnNpbmspCit7CisgIC8qIGNoZWNrIGlmIHRoZSBtYWluIHJ1biBsb29wIGlzIHJ1bm5pbmcgKi8KKyAgZ2Jvb2xlYW4gaXNfcnVubmluZzsKKworICAvKiB0aGUgZWFzeSB3YXkgKi8KKyAgaXNfcnVubmluZyA9IFtbTlNSdW5Mb29wIG1haW5SdW5Mb29wXSBjdXJyZW50TW9kZV0gIT0gbmlsOworICBpZiAoaXNfcnVubmluZykgeworICAgIGdvdG8gZXhpdDsKKyAgfSBlbHNlIHsKKyAgICAvKiB0aGUgcHJldmlvdXMgY2hlY2sgZG9lc24ndCBhbHdheXMgd29yayB3aXRoIG1haW4gbG9vcHMgdGhhdCBydW4KKyAgICAgKiBjb2NvYSdzIG1haW4gcnVuIGxvb3AgbWFudWFsbHksIGxpa2UgdGhlIGdkayBvbmUsIGdpdmluZyBmYWxzZQorICAgICAqIG5lZ2F0aXZlcy4gVGhpcyBjaGVjayBkZWZlcnMgYSBjYWxsIHRvIHRoZSBtYWluIHRocmVhZCBhbmQgd2FpdHMgdG8KKyAgICAgKiBiZSBhd2FrZW4gYnkgdGhpcyBmdW5jdGlvbi4gKi8KKyAgICBOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworICAgIEdzdE9TWFZpZGVvU2lua09iamVjdCAqIG9iamVjdCA9IChHc3RPU1hWaWRlb1NpbmtPYmplY3QgKikgc2luay0+b3N4dmlkZW9zaW5rb2JqZWN0OworICAgIGdpbnQ2NCBhYnN0aW1lOworCisgICAgZ19tdXRleF9sb2NrICgmX3J1bl9sb29wX211dGV4KTsKKyAgICBbb2JqZWN0IHBlcmZvcm1TZWxlY3Rvck9uTWFpblRocmVhZDoKKyAgICAgICAgICBAc2VsZWN0b3IoY2hlY2tNYWluUnVuTG9vcCkKKyAgICAgICAgICB3aXRoT2JqZWN0Om5pbCB3YWl0VW50aWxEb25lOk5PXTsKKyAgICAvKiBXYWl0IDEwMCBtcyAqLworICAgIGFic3RpbWUgPSBnX2dldF9tb25vdG9uaWNfdGltZSAoKSArIDEwMCAqIDEwMDA7CisgICAgaXNfcnVubmluZyA9IGdfY29uZF93YWl0X3VudGlsICgmX3J1bl9sb29wX2NvbmQsCisgICAgICAgICZfcnVuX2xvb3BfbXV0ZXgsIGFic3RpbWUpOworICAgIGdfbXV0ZXhfdW5sb2NrICgmX3J1bl9sb29wX211dGV4KTsKKworICAgIFtwb29sIHJlbGVhc2VdOworICB9CisKK2V4aXQ6CisgIHsKKyAgR1NUX0RFQlVHX09CSkVDVChzaW5rLCAiVGhlIG1haW4gcnVubG9vcCAlcyBpcyBydW5uaW5nIiwKKyAgICAgIGlzX3J1bm5pbmcgPyAiIiA6ICIgbm90ICIpOworICBpZiAoaXNfcnVubmluZykgeworICAgIHNpbmtfY2xhc3MtPnJ1bl9sb29wX3N0YXRlID0gR1NUX09TWF9WSURFT19TSU5LX1JVTl9MT09QX1NUQVRFX1JVTk5JTkc7CisgICAgc2lua19jbGFzcy0+bnNfYXBwX3RocmVhZCA9IFtOU1RocmVhZCBtYWluVGhyZWFkXTsKKyAgfSBlbHNlIHsKKyAgICBzaW5rX2NsYXNzLT5ydW5fbG9vcF9zdGF0ZSA9IEdTVF9PU1hfVklERU9fU0lOS19SVU5fTE9PUF9TVEFURV9OT1RfUlVOTklORzsKKyAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X3ZpZGVvX3NpbmtfcnVuX2NvY29hX2xvb3AgKEdzdE9TWFZpZGVvU2luayAqIHNpbmsgKQoreworICAvKiBDb2NvYSBhcHBsaWNhdGlvbnMgcmVxdWlyZSBhIG1haW4gcnVubG9vcCBydW5uaW5nIHRvIGRpc3BhdGNoIFVJCisgICAqIGV2ZW50cyBhbmQgcHJvY2VzcyBkZWZlcnJlZCBjYWxscyB0byB0aGUgbWFpbiB0aHJlYWQgdGhyb3VnaAorICAgKiBwZXJmZXJtU2VsZWN0b3JPbk1haW5UaHJlYWQuCisgICAqIFNpbmNlIHRoZSBzaW5rIG5lZWRzIHRvIGNyZWF0ZSBpdCdzIG93biBDb2NvYSB3aW5kb3cgd2hlbiBubworICAgKiBleHRlcm5hbCBOU1ZpZXcgaXMgcGFzc2VkIHRvIHRoZSBzaW5rIHRocm91Z2ggdGhlIEdzdFZpZGVvT3ZlcmxheSBBUEksCisgICAqIHdlIG5lZWQgdG8gcnVuIHRoZSBjb2NvYSBtYWlubG9vcCBzb21laG93LgorICAgKiBUaGlzIHJ1biBsb29wIGNhbiBvbmx5IGJlIHN0YXJ0ZWQgb25jZSwgYnkgdGhlIGZpcnN0IHNpbmsgbmVlZGluZyBpdAorICAgKi8KKworICBnX211dGV4X2xvY2sgKCZfcnVuX2xvb3BfY2hlY2tfbXV0ZXgpOworCisgIGlmIChzaW5rX2NsYXNzLT5ydW5fbG9vcF9zdGF0ZSA9PSBHU1RfT1NYX1ZJREVPX1NJTktfUlVOX0xPT1BfU1RBVEVfVU5LTk9XTikgeworICAgIGdzdF9vc3hfdmlkZW9zaW5rX2NoZWNrX21haW5fcnVuX2xvb3AgKHNpbmspOworICB9CisKKyAgaWYgKHNpbmtfY2xhc3MtPnJ1bl9sb29wX3N0YXRlID09IEdTVF9PU1hfVklERU9fU0lOS19SVU5fTE9PUF9TVEFURV9SVU5OSU5HKSB7CisgICAgZ19tdXRleF91bmxvY2sgKCZfcnVuX2xvb3BfY2hlY2tfbXV0ZXgpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzaW5rX2NsYXNzLT5uc19hcHBfdGhyZWFkID09IE5VTEwpIHsKKyAgICAvKiBydW4gdGhlIG1haW4gcnVubG9vcCBpbiBhIHNlcGFyYXRlIHRocmVhZCAqLworCisgICAgLyogb3ZlcnJpZGUgW05TVGhyZWFkIGlzTWFpblRocmVhZF0gd2l0aCBvdXIgb3duIGltcGxlbWVudGF0aW9uIHNvIHRoYXQgd2UgY2FuCisgICAgICogbWFrZSBpdCBiZWxpZXZlIG91ciBkZWRpY2F0ZWQgdGhyZWFkIGlzIHRoZSBtYWluIHRocmVhZAorICAgICAqLworICAgIE1ldGhvZCBvcmlnSXNNYWluVGhyZWFkID0gY2xhc3NfZ2V0Q2xhc3NNZXRob2QoW05TVGhyZWFkIGNsYXNzXSwKKyAgICAgICAgTlNTZWxlY3RvckZyb21TdHJpbmcoQCJpc01haW5UaHJlYWQiKSk7CisgICAgTWV0aG9kIG91cklzTWFpblRocmVhZCA9IGNsYXNzX2dldENsYXNzTWV0aG9kKFtHc3RPU1hWaWRlb1NpbmtPYmplY3QgY2xhc3NdLAorICAgICAgICBOU1NlbGVjdG9yRnJvbVN0cmluZyhAImlzTWFpblRocmVhZCIpKTsKKworICAgIG1ldGhvZF9leGNoYW5nZUltcGxlbWVudGF0aW9ucyhvcmlnSXNNYWluVGhyZWFkLCBvdXJJc01haW5UaHJlYWQpOworCisgICAgc2lua19jbGFzcy0+bnNfYXBwX3RocmVhZCA9IFtbTlNUaHJlYWQgYWxsb2NdCisgICAgICAgIGluaXRXaXRoVGFyZ2V0OnNpbmstPm9zeHZpZGVvc2lua29iamVjdAorICAgICAgICBzZWxlY3RvcjpAc2VsZWN0b3IobnNBcHBUaHJlYWQpIG9iamVjdDpuaWxdOworICAgIFtzaW5rX2NsYXNzLT5uc19hcHBfdGhyZWFkIHN0YXJ0XTsKKworICAgIGdfbXV0ZXhfbG9jayAoJl9ydW5fbG9vcF9tdXRleCk7CisgICAgZ19jb25kX3dhaXQgKCZfcnVuX2xvb3BfY29uZCwgJl9ydW5fbG9vcF9tdXRleCk7CisgICAgZ19tdXRleF91bmxvY2sgKCZfcnVuX2xvb3BfbXV0ZXgpOworICB9CisKKyAgZ19tdXRleF91bmxvY2sgKCZfcnVuX2xvb3BfY2hlY2tfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zeF92aWRlb19zaW5rX3N0b3BfY29jb2FfbG9vcCAoR3N0T1NYVmlkZW9TaW5rICogb3N4dmlkZW9zaW5rKQoreworfQorI2VuZGlmCisKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBvc3ggd2luZG93IGNyZWF0aW9uICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3hfdmlkZW9fc2lua19vc3h3aW5kb3dfY3JlYXRlIChHc3RPU1hWaWRlb1NpbmsgKiBvc3h2aWRlb3NpbmssIGdpbnQgd2lkdGgsCisgICAgZ2ludCBoZWlnaHQpCit7CisgIE5TUmVjdCByZWN0OworICBHc3RPU1hXaW5kb3cgKm9zeHdpbmRvdyA9IE5VTEw7CisgIGdib29sZWFuIHJlcyA9IFRSVUU7CisgIE5TQXV0b3JlbGVhc2VQb29sICpwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19PU1hfVklERU9fU0lOSyAob3N4dmlkZW9zaW5rKSwgRkFMU0UpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG9zeHZpZGVvc2luaywgIkNyZWF0aW5nIG5ldyBPU1ggd2luZG93Iik7CisKKyAgb3N4dmlkZW9zaW5rLT5vc3h3aW5kb3cgPSBvc3h3aW5kb3cgPSBnX25ldzAgKEdzdE9TWFdpbmRvdywgMSk7CisKKyAgb3N4d2luZG93LT53aWR0aCA9IHdpZHRoOworICBvc3h3aW5kb3ctPmhlaWdodCA9IGhlaWdodDsKKyAgb3N4d2luZG93LT5jbG9zZWQgPSBGQUxTRTsKKyAgb3N4d2luZG93LT5pbnRlcm5hbCA9IEZBTFNFOworCisgIC8qIEFsbG9jYXRlIG91ciBHc3RHTFZpZXcgZm9yIHRoZSB3aW5kb3csIGFuZCB0aGVuIHRlbGwgdGhlIGFwcGxpY2F0aW9uCisgICAqIGFib3V0IGl0IChob3BlZnVsbHkgaXQncyBsaXN0ZW5pbmcuLi4pICovCisgIHJlY3Qub3JpZ2luLnggPSAwLjA7CisgIHJlY3Qub3JpZ2luLnkgPSAwLjA7CisgIHJlY3Quc2l6ZS53aWR0aCA9IChmbG9hdCkgb3N4d2luZG93LT53aWR0aDsKKyAgcmVjdC5zaXplLmhlaWdodCA9IChmbG9hdCkgb3N4d2luZG93LT5oZWlnaHQ7CisgIG9zeHdpbmRvdy0+Z3N0dmlldyA9W1tHc3RHTFZpZXcgYWxsb2NdIGluaXRXaXRoRnJhbWU6cmVjdF07CisKKyNpZm5kZWYgR1NUUkVBTUVSX0dMSUJfQ09DT0FfTlNBUFBMSUNBVElPTgorICBnc3Rfb3N4X3ZpZGVvX3NpbmtfcnVuX2NvY29hX2xvb3AgKG9zeHZpZGVvc2luayk7CisgIFtvc3h3aW5kb3ctPmdzdHZpZXcgc2V0TWFpblRocmVhZDpzaW5rX2NsYXNzLT5uc19hcHBfdGhyZWFkXTsKKyNlbmRpZgorCisgIGlmIChvc3h2aWRlb3NpbmstPnN1cGVydmlldyA9PSBOVUxMKSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChvc3h2aWRlb3NpbmssICJlbWl0dGluZyBwcmVwYXJlLXh3aW5kb3ctaWQiKTsKKyAgICBnc3RfdmlkZW9fb3ZlcmxheV9wcmVwYXJlX3dpbmRvd19oYW5kbGUgKEdTVF9WSURFT19PVkVSTEFZIChvc3h2aWRlb3NpbmspKTsKKyAgfQorCisgIGlmIChvc3h2aWRlb3NpbmstPnN1cGVydmlldyAhPSBOVUxMKSB7CisgICAgLyogcHJlcGFyZS14d2luZG93LWlkIHdhcyBoYW5kbGVkLCB3ZSBoYXZlIHRoZSBzdXBlcnZpZXcgaW4KKyAgICAgKiBvc3h2aWRlb3NpbmstPnN1cGVydmlldy4gV2Ugbm93IGFkZCBvc3h3aW5kb3ctPmdzdHZpZXcgdG8gdGhlIHN1cGVydmlldworICAgICAqIGZyb20gdGhlIG1haW4gdGhyZWFkCisgICAgICovCisgICAgR1NUX0lORk9fT0JKRUNUIChvc3h2aWRlb3NpbmssICJ3ZSBoYXZlIGEgc3VwZXJ2aWV3LCBhZGRpbmcgb3VyIHZpZXcgdG8gaXQiKTsKKyAgICBnc3Rfb3N4X3ZpZGVvX3NpbmtfY2FsbF9mcm9tX21haW5fdGhyZWFkKG9zeHZpZGVvc2luaywgb3N4d2luZG93LT5nc3R2aWV3LAorICAgICAgICBAc2VsZWN0b3IoYWRkVG9TdXBlcnZpZXc6KSwgb3N4dmlkZW9zaW5rLT5zdXBlcnZpZXcsIE5PKTsKKworICB9IGVsc2UgeworICAgIGdzdF9vc3hfdmlkZW9fc2lua19jYWxsX2Zyb21fbWFpbl90aHJlYWQob3N4dmlkZW9zaW5rLAorICAgICAgb3N4dmlkZW9zaW5rLT5vc3h2aWRlb3NpbmtvYmplY3QsCisgICAgICBAc2VsZWN0b3IoY3JlYXRlSW50ZXJuYWxXaW5kb3cpLCBuaWwsIFlFUyk7CisgICAgR1NUX0lORk9fT0JKRUNUIChvc3h2aWRlb3NpbmssICJObyBzdXBlcnZpZXcsIGNyZWF0aW5nIGFuIGludGVybmFsIHdpbmRvdy4iKTsKKyAgfQorICBbb3N4d2luZG93LT5nc3R2aWV3IHNldE5hdmlnYXRpb246IEdTVF9OQVZJR0FUSU9OKG9zeHZpZGVvc2luayldOworICBbb3N4dmlkZW9zaW5rLT5vc3h3aW5kb3ctPmdzdHZpZXcgc2V0S2VlcEFzcGVjdFJhdGlvOiBvc3h2aWRlb3NpbmstPmtlZXBfcGFyXTsKKworICBbcG9vbCByZWxlYXNlXTsKKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zeF92aWRlb19zaW5rX29zeHdpbmRvd19kZXN0cm95IChHc3RPU1hWaWRlb1NpbmsgKiBvc3h2aWRlb3NpbmspCit7CisgIE5TQXV0b3JlbGVhc2VQb29sICpwb29sOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19PU1hfVklERU9fU0lOSyAob3N4dmlkZW9zaW5rKSk7CisgIHBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKG9zeHZpZGVvc2luayk7CisgIGdzdF9vc3hfdmlkZW9fc2lua19jYWxsX2Zyb21fbWFpbl90aHJlYWQob3N4dmlkZW9zaW5rLAorICAgICAgb3N4dmlkZW9zaW5rLT5vc3h2aWRlb3NpbmtvYmplY3QsCisgICAgICBAc2VsZWN0b3IoZGVzdHJveSksIChpZCkgbmlsLCBZRVMpOworICBHU1RfT0JKRUNUX1VOTE9DSyAob3N4dmlkZW9zaW5rKTsKKyNpZm5kZWYgR1NUUkVBTUVSX0dMSUJfQ09DT0FfTlNBUFBMSUNBVElPTgorICBnc3Rfb3N4X3ZpZGVvX3Npbmtfc3RvcF9jb2NvYV9sb29wIChvc3h2aWRlb3NpbmspOworI2VuZGlmCisgIFtwb29sIHJlbGVhc2VdOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHJlc2l6ZXMgYSBHc3RYV2luZG93ICovCitzdGF0aWMgdm9pZAorZ3N0X29zeF92aWRlb19zaW5rX29zeHdpbmRvd19yZXNpemUgKEdzdE9TWFZpZGVvU2luayAqIG9zeHZpZGVvc2luaywKKyAgICBHc3RPU1hXaW5kb3cgKiBvc3h3aW5kb3csIGd1aW50IHdpZHRoLCBndWludCBoZWlnaHQpCit7CisgIEdzdE9TWFZpZGVvU2lua09iamVjdCAqb2JqZWN0ID0gb3N4dmlkZW9zaW5rLT5vc3h2aWRlb3NpbmtvYmplY3Q7CisKKyAgTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKKyAgZ19yZXR1cm5faWZfZmFpbCAob3N4d2luZG93ICE9IE5VTEwpOworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfT1NYX1ZJREVPX1NJTksgKG9zeHZpZGVvc2luaykpOworCisgIG9zeHdpbmRvdy0+d2lkdGggPSB3aWR0aDsKKyAgb3N4d2luZG93LT5oZWlnaHQgPSBoZWlnaHQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAob3N4dmlkZW9zaW5rLCAiUmVzaXppbmcgd2luZG93IHRvICglZCwlZCkiLCB3aWR0aCwgaGVpZ2h0KTsKKworICAvKiBEaXJlY3RseSByZXNpemUgdGhlIHVuZGVybHlpbmcgdmlldyAqLworICBHU1RfREVCVUdfT0JKRUNUIChvc3h2aWRlb3NpbmssICJDYWxsaW5nIHNldFZpZGVvU2l6ZSBvbiAlcCIsIG9zeHdpbmRvdy0+Z3N0dmlldyk7CisgIGdzdF9vc3hfdmlkZW9fc2lua19jYWxsX2Zyb21fbWFpbl90aHJlYWQgKG9zeHZpZGVvc2luaywgb2JqZWN0LAorICAgICAgQHNlbGVjdG9yKHJlc2l6ZSksIChpZCluaWwsIFlFUyk7CisKKyAgW3Bvb2wgcmVsZWFzZV07Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X29zeF92aWRlb19zaW5rX3NldGNhcHMgKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RPU1hWaWRlb1NpbmsgKm9zeHZpZGVvc2luazsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdib29sZWFuIHJlcywgcmVzdWx0ID0gRkFMU0U7CisgIGdpbnQgdmlkZW9fd2lkdGgsIHZpZGVvX2hlaWdodDsKKworICBvc3h2aWRlb3NpbmsgPSBHU1RfT1NYX1ZJREVPX1NJTksgKGJzaW5rKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChvc3h2aWRlb3NpbmssICJjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIHJlcyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAid2lkdGgiLCAmdmlkZW9fd2lkdGgpOworICByZXMgJj0gZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJoZWlnaHQiLCAmdmlkZW9faGVpZ2h0KTsKKworICBpZiAoIXJlcykgeworICAgIGdvdG8gYmVhY2g7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChvc3h2aWRlb3NpbmssICJvdXIgZm9ybWF0IGlzOiAlZHglZCB2aWRlbyIsCisgICAgICB2aWRlb193aWR0aCwgdmlkZW9faGVpZ2h0KTsKKworICBHU1RfVklERU9fU0lOS19XSURUSCAob3N4dmlkZW9zaW5rKSA9IHZpZGVvX3dpZHRoOworICBHU1RfVklERU9fU0lOS19IRUlHSFQgKG9zeHZpZGVvc2luaykgPSB2aWRlb19oZWlnaHQ7CisKKyAgZ3N0X29zeF92aWRlb19zaW5rX29zeHdpbmRvd19yZXNpemUgKG9zeHZpZGVvc2luaywgb3N4dmlkZW9zaW5rLT5vc3h3aW5kb3csCisgICAgICB2aWRlb193aWR0aCwgdmlkZW9faGVpZ2h0KTsKKworICBnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMgKCZvc3h2aWRlb3NpbmstPmluZm8sIGNhcHMpOworCisgIHJlc3VsdCA9IFRSVUU7CisKK2JlYWNoOgorICByZXR1cm4gcmVzdWx0OworCit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X29zeF92aWRlb19zaW5rX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0T1NYVmlkZW9TaW5rICpvc3h2aWRlb3Npbms7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBvc3h2aWRlb3NpbmsgPSBHU1RfT1NYX1ZJREVPX1NJTksgKGVsZW1lbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKG9zeHZpZGVvc2luaywgIiVzID0+ICVzIiwKKyAgICAgICAgZ3N0X2VsZW1lbnRfc3RhdGVfZ2V0X25hbWUoR1NUX1NUQVRFX1RSQU5TSVRJT05fQ1VSUkVOVCAodHJhbnNpdGlvbikpLAorICAgICAgICBnc3RfZWxlbWVudF9zdGF0ZV9nZXRfbmFtZShHU1RfU1RBVEVfVFJBTlNJVElPTl9ORVhUICh0cmFuc2l0aW9uKSkpOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX1BBVVNFRDoKKyAgICAgIC8qIENyZWF0aW5nIG91ciB3aW5kb3cgYW5kIG91ciBpbWFnZSAqLworICAgICAgR1NUX1ZJREVPX1NJTktfV0lEVEggKG9zeHZpZGVvc2luaykgPSAzMjA7CisgICAgICBHU1RfVklERU9fU0lOS19IRUlHSFQgKG9zeHZpZGVvc2luaykgPSAyNDA7CisgICAgICBpZiAoIWdzdF9vc3hfdmlkZW9fc2lua19vc3h3aW5kb3dfY3JlYXRlIChvc3h2aWRlb3NpbmssCisgICAgICAgICAgR1NUX1ZJREVPX1NJTktfV0lEVEggKG9zeHZpZGVvc2luayksCisgICAgICAgICAgR1NUX1ZJREVPX1NJTktfSEVJR0hUIChvc3h2aWRlb3NpbmspKSkgeworICAgICAgICByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IChHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKSktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWToKKyAgICAgIEdTVF9WSURFT19TSU5LX1dJRFRIIChvc3h2aWRlb3NpbmspID0gMDsKKyAgICAgIEdTVF9WSURFT19TSU5LX0hFSUdIVCAob3N4dmlkZW9zaW5rKSA9IDA7CisgICAgICBnc3Rfb3N4X3ZpZGVvX3Npbmtfb3N4d2luZG93X2Rlc3Ryb3kgKG9zeHZpZGVvc2luayk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCitkb25lOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X29zeF92aWRlb19zaW5rX3Nob3dfZnJhbWUgKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0T1NYVmlkZW9TaW5rICpvc3h2aWRlb3Npbms7CisgIEdzdEJ1ZmZlck9iamVjdCogYnVmZmVyb2JqZWN0OworICBOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworCisgIG9zeHZpZGVvc2luayA9IEdTVF9PU1hfVklERU9fU0lOSyAoYnNpbmspOworCisgIEdTVF9ERUJVRyAoInNob3dfZnJhbWUiKTsKKyAgYnVmZmVyb2JqZWN0ID0gW1tHc3RCdWZmZXJPYmplY3QgYWxsb2NdIGluaXRXaXRoQnVmZmVyOmJ1Zl07CisgIGdzdF9vc3hfdmlkZW9fc2lua19jYWxsX2Zyb21fbWFpbl90aHJlYWQob3N4dmlkZW9zaW5rLAorICAgICAgb3N4dmlkZW9zaW5rLT5vc3h2aWRlb3NpbmtvYmplY3QsCisgICAgICBAc2VsZWN0b3Ioc2hvd0ZyYW1lOiksIGJ1ZmZlcm9iamVjdCwgTk8pOworICBbcG9vbCByZWxlYXNlXTsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCisvKiBCdWZmZXIgbWFuYWdlbWVudCAqLworCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIEluaXQgJiBDbGFzcyBpbml0ICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgdm9pZAorZ3N0X29zeF92aWRlb19zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RPU1hWaWRlb1NpbmsgKm9zeHZpZGVvc2luazsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfT1NYX1ZJREVPX1NJTksgKG9iamVjdCkpOworCisgIG9zeHZpZGVvc2luayA9IEdTVF9PU1hfVklERU9fU0lOSyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIEFSR19FTUJFRDoKKyAgICAgIGdfd2FybmluZyAoIlRoZSBcImVtYmVkXCIgcHJvcGVydHkgb2Ygb3N4dmlkZW9zaW5rIGlzIGRlcHJlY2F0ZWQgYW5kICIKKyAgICAgICAgICAiaGFzIG5vIGVmZmVjdCBhbnltb3JlLiBVc2UgdGhlIEdzdFZpZGVvT3ZlcmxheSAiCisgICAgICAgICAgImluc3RlYWQuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19GT1JDRV9QQVI6CisgICAgICBvc3h2aWRlb3NpbmstPmtlZXBfcGFyID0gZ192YWx1ZV9nZXRfYm9vbGVhbih2YWx1ZSk7CisgICAgICBpZiAob3N4dmlkZW9zaW5rLT5vc3h3aW5kb3cpCisgICAgICAgIFtvc3h2aWRlb3NpbmstPm9zeHdpbmRvdy0+Z3N0dmlldworICAgICAgICAgICAgc2V0S2VlcEFzcGVjdFJhdGlvOiBvc3h2aWRlb3NpbmstPmtlZXBfcGFyXTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfdmlkZW9fc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0T1NYVmlkZW9TaW5rICpvc3h2aWRlb3Npbms7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX09TWF9WSURFT19TSU5LIChvYmplY3QpKTsKKworICBvc3h2aWRlb3NpbmsgPSBHU1RfT1NYX1ZJREVPX1NJTksgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBBUkdfRU1CRUQ6CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgRkFMU0UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBUkdfRk9SQ0VfUEFSOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIG9zeHZpZGVvc2luay0+a2VlcF9wYXIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF9vc3hfdmlkZW9fc2lua19wcm9wb3NlX2FsbG9jYXRpb24gKEdzdEJhc2VTaW5rICogYmFzZV9zaW5rLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICAgIGdzdF9xdWVyeV9hZGRfYWxsb2NhdGlvbl9tZXRhIChxdWVyeSwKKyAgICAgICAgR1NUX1ZJREVPX01FVEFfQVBJX1RZUEUsIE5VTEwpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X3ZpZGVvX3NpbmtfaW5pdCAoR3N0T1NYVmlkZW9TaW5rICogc2luaykKK3sKKyAgc2luay0+b3N4d2luZG93ID0gTlVMTDsKKyAgc2luay0+c3VwZXJ2aWV3ID0gTlVMTDsKKyAgc2luay0+b3N4dmlkZW9zaW5rb2JqZWN0ID0gW1tHc3RPU1hWaWRlb1NpbmtPYmplY3QgYWxsb2NdIGluaXRXaXRoU2luazpzaW5rXTsKKyAgc2luay0+a2VlcF9wYXIgPSBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfdmlkZW9fc2lua19iYXNlX2luaXQgKGdwb2ludGVyIGdfY2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChnX2NsYXNzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiT1NYIFZpZGVvIHNpbmsiLAorICAgICAgIlNpbmsvVmlkZW8iLCAiT1NYIG5hdGl2ZSB2aWRlb3NpbmsiLAorICAgICAgIlphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9zdGF0aWNfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLCAmZ3N0X29zeF92aWRlb19zaW5rX3NpbmtfdGVtcGxhdGVfZmFjdG9yeSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X3ZpZGVvX3NpbmtfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgR3N0T1NYVmlkZW9TaW5rICpvc3h2aWRlb3NpbmsgPSBHU1RfT1NYX1ZJREVPX1NJTksgKG9iamVjdCk7CisKKyAgaWYgKG9zeHZpZGVvc2luay0+c3VwZXJ2aWV3KQorICAgIFtvc3h2aWRlb3NpbmstPnN1cGVydmlldyByZWxlYXNlXTsKKworICBpZiAob3N4dmlkZW9zaW5rLT5vc3h2aWRlb3NpbmtvYmplY3QpCisgICAgWyhHc3RPU1hWaWRlb1NpbmtPYmplY3QqKShvc3h2aWRlb3NpbmstPm9zeHZpZGVvc2lua29iamVjdCkgcmVsZWFzZV07CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zeF92aWRlb19zaW5rX2NsYXNzX2luaXQgKEdzdE9TWFZpZGVvU2lua0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzOworICBHc3RCYXNlU2lua0NsYXNzICpnc3RiYXNlc2lua19jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdzdGJhc2VzaW5rX2NsYXNzID0gKEdzdEJhc2VTaW5rQ2xhc3MgKikga2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3JlZiAoR1NUX1RZUEVfVklERU9fU0lOSyk7CisgIHNpbmtfY2xhc3MgPSBrbGFzczsKKworICBrbGFzcy0+cnVuX2xvb3Bfc3RhdGUgPSBHU1RfT1NYX1ZJREVPX1NJTktfUlVOX0xPT1BfU1RBVEVfVU5LTk9XTjsKKyAga2xhc3MtPm5zX2FwcF90aHJlYWQgPSBOVUxMOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF9vc3hfdmlkZW9fc2lua19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF9vc3hfdmlkZW9fc2lua19nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X29zeF92aWRlb19zaW5rX2ZpbmFsaXplOworCisgIGdzdGJhc2VzaW5rX2NsYXNzLT5zZXRfY2FwcyA9IGdzdF9vc3hfdmlkZW9fc2lua19zZXRjYXBzOworICBnc3RiYXNlc2lua19jbGFzcy0+cHJlcm9sbCA9IGdzdF9vc3hfdmlkZW9fc2lua19zaG93X2ZyYW1lOworICBnc3RiYXNlc2lua19jbGFzcy0+cmVuZGVyID0gZ3N0X29zeF92aWRlb19zaW5rX3Nob3dfZnJhbWU7CisgIGdzdGJhc2VzaW5rX2NsYXNzLT5wcm9wb3NlX2FsbG9jYXRpb24gPSBnc3Rfb3N4X3ZpZGVvX3NpbmtfcHJvcG9zZV9hbGxvY2F0aW9uOworICBnc3RlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3Rfb3N4X3ZpZGVvX3NpbmtfY2hhbmdlX3N0YXRlOworCisgIC8qKgorICAgKiBHc3RPU1hWaWRlb1Npbms6ZW1iZWQKKyAgICoKKyAgICogRm9yIEFCSSBjb21hdGliaWxpdHkgb255bCwgZG8gbm90IHVzZQorICAgKgorICAgKiovCisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgQVJHX0VNQkVELAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJlbWJlZCIsICJlbWJlZCIsICJGb3IgQUJJIGNvbXBhdGlibGl0eSBvbmx5LCBkbyBub3QgdXNlIiwKKyAgICAgICAgICBGQUxTRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdE9TWFZpZGVvU2luazpmb3JjZS1hc3BlY3QtcmF0aW8KKyAgICoKKyAgICogV2hlbiBlbmFibGVkLCBzY2FsaW5nIHdpbGwgcmVzcGVjdCBvcmlnaW5hbCBhc3BlY3QgcmF0aW8uCisgICAqCisgICAqKi8KKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBBUkdfRk9SQ0VfUEFSLAorICAgICAgZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJmb3JjZS1hc3BlY3QtcmF0aW8iLCAiZm9yY2UgYXNwZWN0IHJhdGlvbiIsCisgICAgICAgICAgIldoZW4gZW5hYmxlZCwgc2NhbGluZyB3aWxsIHJlc3BlY3Qgb3JpZ2luYWwgYXNwZWN0IHJhdGlvbiIsCisgICAgICAgICAgVFJVRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X3ZpZGVvX3NpbmtfbmF2aWdhdGlvbl9zZW5kX2V2ZW50IChHc3ROYXZpZ2F0aW9uICogbmF2aWdhdGlvbiwKKyAgICBHc3RTdHJ1Y3R1cmUgKiBzdHJ1Y3R1cmUpCit7CisgIEdzdE9TWFZpZGVvU2luayAqb3N4dmlkZW9zaW5rID0gR1NUX09TWF9WSURFT19TSU5LIChuYXZpZ2F0aW9uKTsKKyAgR3N0UGFkICpwZWVyOworICBHc3RFdmVudCAqZXZlbnQ7CisgIEdzdFZpZGVvUmVjdGFuZ2xlIHNyYyA9IHsgMCwgfTsKKyAgR3N0VmlkZW9SZWN0YW5nbGUgZHN0ID0geyAwLCB9OworICBHc3RWaWRlb1JlY3RhbmdsZSByZXN1bHQ7CisgIE5TUmVjdCBib3VuZHM7CisgIGdkb3VibGUgeCwgeSwgeHNjYWxlID0gMS4wLCB5c2NhbGUgPSAxLjA7CisKKyAgcGVlciA9IGdzdF9wYWRfZ2V0X3BlZXIgKEdTVF9WSURFT19TSU5LX1BBRCAob3N4dmlkZW9zaW5rKSk7CisKKyAgaWYgKCFwZWVyIHx8ICFvc3h2aWRlb3NpbmstPm9zeHdpbmRvdykKKyAgICByZXR1cm47CisKKyAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X25hdmlnYXRpb24gKHN0cnVjdHVyZSk7CisKKyAgYm91bmRzID0gW29zeHZpZGVvc2luay0+b3N4d2luZG93LT5nc3R2aWV3IGdldERyYXdpbmdCb3VuZHNdOworCisgIGlmIChvc3h2aWRlb3NpbmstPmtlZXBfcGFyKSB7CisgICAgLyogV2UgZ2V0IHRoZSBmcmFtZSBwb3NpdGlvbiB1c2luZyB0aGUgY2FsY3VsYXRlZCBnZW9tZXRyeSBmcm9tIF9zZXRjYXBzCisgICAgICAgdGhhdCByZXNwZWN0IHBpeGVsIGFzcGVjdCByYXRpb3MgKi8KKyAgICBzcmMudyA9IEdTVF9WSURFT19TSU5LX1dJRFRIIChvc3h2aWRlb3NpbmspOworICAgIHNyYy5oID0gR1NUX1ZJREVPX1NJTktfSEVJR0hUIChvc3h2aWRlb3NpbmspOworICAgIGRzdC53ID0gYm91bmRzLnNpemUud2lkdGg7CisgICAgZHN0LmggPSBib3VuZHMuc2l6ZS5oZWlnaHQ7CisKKyAgICBnc3RfdmlkZW9fc2lua19jZW50ZXJfcmVjdCAoc3JjLCBkc3QsICZyZXN1bHQsIFRSVUUpOworICAgIHJlc3VsdC54ICs9IGJvdW5kcy5vcmlnaW4ueDsKKyAgICByZXN1bHQueSArPSBib3VuZHMub3JpZ2luLnk7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0LnggPSBib3VuZHMub3JpZ2luLng7CisgICAgcmVzdWx0LnkgPSBib3VuZHMub3JpZ2luLnk7CisgICAgcmVzdWx0LncgPSBib3VuZHMuc2l6ZS53aWR0aDsKKyAgICByZXN1bHQuaCA9IGJvdW5kcy5zaXplLmhlaWdodDsKKyAgfQorCisgIC8qIFdlIGNhbGN1bGF0ZSBzY2FsaW5nIHVzaW5nIHRoZSBvcmlnaW5hbCB2aWRlbyBmcmFtZXMgZ2VvbWV0cnkgdG8gaW5jbHVkZQorICAgICBwaXhlbCBhc3BlY3QgcmF0aW8gc2NhbGluZy4gKi8KKyAgeHNjYWxlID0gKGdkb3VibGUpIG9zeHZpZGVvc2luay0+b3N4d2luZG93LT53aWR0aCAvIHJlc3VsdC53OworICB5c2NhbGUgPSAoZ2RvdWJsZSkgb3N4dmlkZW9zaW5rLT5vc3h3aW5kb3ctPmhlaWdodCAvIHJlc3VsdC5oOworCisgIC8qIENvbnZlcnRpbmcgcG9pbnRlciBjb29yZGluYXRlcyB0byB0aGUgbm9uIHNjYWxlZCBnZW9tZXRyeSAqLworICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfZG91YmxlIChzdHJ1Y3R1cmUsICJwb2ludGVyX3giLCAmeCkpIHsKKyAgICB4ID0gTUlOICh4LCByZXN1bHQueCArIHJlc3VsdC53KTsKKyAgICB4ID0gTUFYICh4IC0gcmVzdWx0LngsIDApOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzdHJ1Y3R1cmUsICJwb2ludGVyX3giLCBHX1RZUEVfRE9VQkxFLAorICAgICAgICAoZ2RvdWJsZSkgeCAqIHhzY2FsZSwgTlVMTCk7CisgIH0KKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2RvdWJsZSAoc3RydWN0dXJlLCAicG9pbnRlcl95IiwgJnkpKSB7CisgICAgeSA9IE1JTiAoeSwgcmVzdWx0LnkgKyByZXN1bHQuaCk7CisgICAgeSA9IE1BWCAoeSAtIHJlc3VsdC55LCAwKTsKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLCAicG9pbnRlcl95IiwgR19UWVBFX0RPVUJMRSwKKyAgICAgICAgKGdkb3VibGUpIHkgKiB5c2NhbGUsIE5VTEwpOworICB9CisKKyAgZ3N0X3BhZF9zZW5kX2V2ZW50IChwZWVyLCBldmVudCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBlZXIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X29zeF92aWRlb19zaW5rX25hdmlnYXRpb25faW5pdCAoR3N0TmF2aWdhdGlvbkludGVyZmFjZSAqIGlmYWNlKQoreworICBpZmFjZS0+c2VuZF9ldmVudCA9IGdzdF9vc3hfdmlkZW9fc2lua19uYXZpZ2F0aW9uX3NlbmRfZXZlbnQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfb3N4X3ZpZGVvX3Npbmtfc2V0X3dpbmRvd19oYW5kbGUgKEdzdFZpZGVvT3ZlcmxheSAqIG92ZXJsYXksIGd1aW50cHRyIGhhbmRsZV9pZCkKK3sKKyAgR3N0T1NYVmlkZW9TaW5rICpvc3h2aWRlb3NpbmsgPSBHU1RfT1NYX1ZJREVPX1NJTksgKG92ZXJsYXkpOworICBOU1ZpZXcgKnZpZXcgPSAoTlNWaWV3ICopIGhhbmRsZV9pZDsKKworICBnc3Rfb3N4X3ZpZGVvX3NpbmtfY2FsbF9mcm9tX21haW5fdGhyZWFkKG9zeHZpZGVvc2luaywKKyAgICAgIG9zeHZpZGVvc2luay0+b3N4dmlkZW9zaW5rb2JqZWN0LAorICAgICAgQHNlbGVjdG9yKHNldFZpZXc6KSwgdmlldywgWUVTKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF9vc3hfdmlkZW9fc2lua194b3ZlcmxheV9pbml0IChHc3RWaWRlb092ZXJsYXlJbnRlcmZhY2UgKiBpZmFjZSkKK3sKKyAgaWZhY2UtPnNldF93aW5kb3dfaGFuZGxlID0gZ3N0X29zeF92aWRlb19zaW5rX3NldF93aW5kb3dfaGFuZGxlOworICBpZmFjZS0+ZXhwb3NlID0gTlVMTDsKKyAgaWZhY2UtPmhhbmRsZV9ldmVudHMgPSBOVUxMOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgUHVibGljIE1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIE9iamVjdCB0eXBpbmcgJiBDcmVhdGlvbiAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworR1R5cGUKK2dzdF9vc3hfdmlkZW9fc2lua19nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIG9zeHZpZGVvc2lua190eXBlID0gMDsKKworICBpZiAoIW9zeHZpZGVvc2lua190eXBlKSB7CisgICAgc3RhdGljIGNvbnN0IEdUeXBlSW5mbyBvc3h2aWRlb3NpbmtfaW5mbyA9IHsKKyAgICAgIHNpemVvZiAoR3N0T1NYVmlkZW9TaW5rQ2xhc3MpLAorICAgICAgZ3N0X29zeF92aWRlb19zaW5rX2Jhc2VfaW5pdCwKKyAgICAgIE5VTEwsCisgICAgICAoR0NsYXNzSW5pdEZ1bmMpIGdzdF9vc3hfdmlkZW9fc2lua19jbGFzc19pbml0LAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgICBzaXplb2YgKEdzdE9TWFZpZGVvU2luayksCisgICAgICAwLAorICAgICAgKEdJbnN0YW5jZUluaXRGdW5jKSBnc3Rfb3N4X3ZpZGVvX3NpbmtfaW5pdCwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IEdJbnRlcmZhY2VJbmZvIG92ZXJsYXlfaW5mbyA9IHsKKyAgICAgIChHSW50ZXJmYWNlSW5pdEZ1bmMpIGdzdF9vc3hfdmlkZW9fc2lua194b3ZlcmxheV9pbml0LAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBHSW50ZXJmYWNlSW5mbyBuYXZpZ2F0aW9uX2luZm8gPSB7CisgICAgICAoR0ludGVyZmFjZUluaXRGdW5jKSBnc3Rfb3N4X3ZpZGVvX3NpbmtfbmF2aWdhdGlvbl9pbml0LAorICAgICAgTlVMTCwKKyAgICAgIE5VTEwsCisgICAgfTsKKyAgICBvc3h2aWRlb3NpbmtfdHlwZSA9IGdfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKEdTVF9UWVBFX1ZJREVPX1NJTkssCisgICAgICAgICJHc3RPU1hWaWRlb1NpbmsiLCAmb3N4dmlkZW9zaW5rX2luZm8sIDApOworCisgICAgZ190eXBlX2FkZF9pbnRlcmZhY2Vfc3RhdGljIChvc3h2aWRlb3NpbmtfdHlwZSwgR1NUX1RZUEVfVklERU9fT1ZFUkxBWSwKKyAgICAgICAgJm92ZXJsYXlfaW5mbyk7CisgICAgZ190eXBlX2FkZF9pbnRlcmZhY2Vfc3RhdGljIChvc3h2aWRlb3NpbmtfdHlwZSwgR1NUX1RZUEVfTkFWSUdBVElPTiwKKyAgICAgICAgJm5hdmlnYXRpb25faW5mbyk7CisgIH0KKworICByZXR1cm4gb3N4dmlkZW9zaW5rX3R5cGU7Cit9CisKK0BpbXBsZW1lbnRhdGlvbiBHc3RXaW5kb3dEZWxlZ2F0ZQorLSAoaWQpIGluaXRXaXRoU2luazogKEdzdE9TWFZpZGVvU2luayAqKSBzaW5rCit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIHNlbGYtPm9zeHZpZGVvc2luayA9IHNpbms7CisgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKXdpbmRvd1dpbGxDbG9zZTooTlNOb3RpZmljYXRpb24gKilub3RpZmljYXRpb24geworICAvKiBPbmx5IGhhbmRsZSBjbG9zZSBldmVudHMgaWYgdGhlIHdpbmRvdyB3YXMgY2xvc2VkIG1hbnVhbGx5IGJ5IHRoZSB1c2VyCisgICAqIGFuZCBub3QgYmVjdWFzZSBvZiBhIHN0YXRlIGNoYW5nZSBzdGF0ZSB0byBSRUFEWSAqLworICBpZiAob3N4dmlkZW9zaW5rLT5vc3h3aW5kb3cgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoIW9zeHZpZGVvc2luay0+b3N4d2luZG93LT5jbG9zZWQpIHsKKyAgICBvc3h2aWRlb3NpbmstPm9zeHdpbmRvdy0+Y2xvc2VkID0gVFJVRTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob3N4dmlkZW9zaW5rLCBSRVNPVVJDRSwgTk9UX0ZPVU5ELCAoIk91dHB1dCB3aW5kb3cgd2FzIGNsb3NlZCIpLCAoTlVMTCkpOworICAgIGdzdF9vc3hfdmlkZW9fc2lua19vc3h3aW5kb3dfZGVzdHJveShvc3h2aWRlb3NpbmspOworICB9Cit9CisKK0BlbmQKKworQCBpbXBsZW1lbnRhdGlvbiBHc3RPU1hWaWRlb1NpbmtPYmplY3QKKworLShpZCkgaW5pdFdpdGhTaW5rOiAoR3N0T1NYVmlkZW9TaW5rKikgc2luaworeworICBzZWxmID0gW3N1cGVyIGluaXRdOworICBzZWxmLT5vc3h2aWRlb3NpbmsgPSBnc3Rfb2JqZWN0X3JlZiAoc2luayk7CisgIHJldHVybiBzZWxmOworfQorCistKHZvaWQpIGRlYWxsb2MgeworICBnc3Rfb2JqZWN0X3VucmVmIChvc3h2aWRlb3NpbmspOworICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy0odm9pZCkgY3JlYXRlSW50ZXJuYWxXaW5kb3cKK3sKKyAgR3N0T1NYV2luZG93ICpvc3h3aW5kb3cgPSBvc3h2aWRlb3NpbmstPm9zeHdpbmRvdzsKKyAgTlNSZWN0IHJlY3Q7CisgIHVuc2lnbmVkIGludCBtYXNrOworCisgIFtOU0FwcGxpY2F0aW9uIHNoYXJlZEFwcGxpY2F0aW9uXTsKKworICBvc3h3aW5kb3ctPmludGVybmFsID0gVFJVRTsKKworICBtYXNrID0gIE5TV2luZG93U3R5bGVNYXNrVGl0bGVkICAgICAgICAgICAgIHwKKyAgICAgICAgICBOU1dpbmRvd1N0eWxlTWFza0Nsb3NhYmxlICAgICAgICAgICB8CisgICAgICAgICAgTlNXaW5kb3dTdHlsZU1hc2tSZXNpemFibGUgICAgICAgICAgfAorICAgICAgICAgIE5TV2luZG93U3R5bGVNYXNrVGV4dHVyZWRCYWNrZ3JvdW5kIHwKKyAgICAgICAgICBOU1dpbmRvd1N0eWxlTWFza01pbmlhdHVyaXphYmxlOworCisgIHJlY3Qub3JpZ2luLnggPSAxMDAuMDsKKyAgcmVjdC5vcmlnaW4ueSA9IDEwMC4wOworICByZWN0LnNpemUud2lkdGggPSAoZmxvYXQpIG9zeHdpbmRvdy0+d2lkdGg7CisgIHJlY3Quc2l6ZS5oZWlnaHQgPSAoZmxvYXQpIG9zeHdpbmRvdy0+aGVpZ2h0OworCisgIG9zeHdpbmRvdy0+d2luID1bW1tHc3RPU1hWaWRlb1NpbmtXaW5kb3cgYWxsb2NdCisgICAgICAgICAgICAgICAgICAgICAgIGluaXRXaXRoQ29udGVudE5TUmVjdDogcmVjdAorICAgICAgICAgICAgICAgICAgICAgICBzdHlsZU1hc2s6IG1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgYmFja2luZzogTlNCYWNraW5nU3RvcmVCdWZmZXJlZAorICAgICAgICAgICAgICAgICAgICAgICBkZWZlcjogTk8KKyAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuOiBuaWxdIHJldGFpbl07CisgIEdTVF9ERUJVRygiVmlkZW9TaW5rV2luZG93IGNyZWF0ZWQsICVwIiwgb3N4d2luZG93LT53aW4pOworICBbb3N4d2luZG93LT53aW4gb3JkZXJGcm9udFJlZ2FyZGxlc3NdOworICBvc3h3aW5kb3ctPmdzdHZpZXcgPVtvc3h3aW5kb3ctPndpbiBnc3RWaWV3XTsKKyAgW29zeHdpbmRvdy0+d2luIHNldERlbGVnYXRlOltbR3N0V2luZG93RGVsZWdhdGUgYWxsb2NdCisgICAgICBpbml0V2l0aFNpbms6b3N4dmlkZW9zaW5rXV07CisKK30KKworKyAoQk9PTCkgaXNNYWluVGhyZWFkCit7CisgIC8qIEZJWE1FOiBpZGVhbGx5IHdlIHNob3VsZCByZXR1cm4gWUVTIG9ubHkgZm9yIC0+bnNfYXBwX3RocmVhZCBoZXJlICovCisgIHJldHVybiBZRVM7Cit9CisKKy0gKHZvaWQpIHNldFZpZXc6IChOU1ZpZXcqKXZpZXcKK3sKKyAgTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKKworICBpZiAob3N4dmlkZW9zaW5rLT5zdXBlcnZpZXcpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKG9zeHZpZGVvc2luaywgIm9sZCB4d2luZG93IGlkICVwIiwgb3N4dmlkZW9zaW5rLT5zdXBlcnZpZXcpOworICAgIGlmIChvc3h2aWRlb3NpbmstPm9zeHdpbmRvdykgeworICAgICAgW29zeHZpZGVvc2luay0+b3N4d2luZG93LT5nc3R2aWV3IHJlbW92ZUZyb21TdXBlcnZpZXddOworICAgIH0KKyAgICBbb3N4dmlkZW9zaW5rLT5zdXBlcnZpZXcgcmVsZWFzZV07CisgIH0KKyAgaWYgKG9zeHZpZGVvc2luay0+b3N4d2luZG93ICE9IE5VTEwgJiYgdmlldyAhPSBOVUxMKSB7CisgICAgaWYgKG9zeHZpZGVvc2luay0+b3N4d2luZG93LT5pbnRlcm5hbCkgeworICAgICAgR1NUX0lORk9fT0JKRUNUIChvc3h2aWRlb3NpbmssICJjbG9zaW5nIGludGVybmFsIHdpbmRvdyIpOworICAgICAgb3N4dmlkZW9zaW5rLT5vc3h3aW5kb3ctPmNsb3NlZCA9IFRSVUU7CisgICAgICBbb3N4dmlkZW9zaW5rLT5vc3h3aW5kb3ctPndpbiBjbG9zZV07CisgICAgICBbb3N4dmlkZW9zaW5rLT5vc3h3aW5kb3ctPndpbiByZWxlYXNlXTsKKyAgICB9CisgIH0KKworICBHU1RfSU5GT19PQkpFQ1QgKG9zeHZpZGVvc2luaywgInNldCB4d2luZG93IGlkICVwIiwgdmlldyk7CisgIG9zeHZpZGVvc2luay0+c3VwZXJ2aWV3ID0gW3ZpZXcgcmV0YWluXTsKKyAgaWYgKG9zeHZpZGVvc2luay0+b3N4d2luZG93KSB7CisgICAgW29zeHZpZGVvc2luay0+b3N4d2luZG93LT5nc3R2aWV3IGFkZFRvU3VwZXJ2aWV3OiBvc3h2aWRlb3NpbmstPnN1cGVydmlld107CisgICAgaWYgKHZpZXcpIHsKKyAgICAgIG9zeHZpZGVvc2luay0+b3N4d2luZG93LT5pbnRlcm5hbCA9IEZBTFNFOworICAgIH0KKyAgfQorCisgIFtwb29sIHJlbGVhc2VdOworfQorCistICh2b2lkKSByZXNpemUKK3sKKyAgR3N0T1NYV2luZG93ICpvc3h3aW5kb3cgPSBvc3h2aWRlb3NpbmstPm9zeHdpbmRvdzsKKworICBOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworCisgIEdTVF9JTkZPX09CSkVDVCAob3N4dmlkZW9zaW5rLCAicmVzaXppbmciKTsKKyAgTlNTaXplIHNpemUgPSB7b3N4d2luZG93LT53aWR0aCwgb3N4d2luZG93LT5oZWlnaHR9OworICBpZiAob3N4d2luZG93LT5pbnRlcm5hbCkgeworICAgIFtvc3h3aW5kb3ctPndpbiBzZXRDb250ZW50U2l6ZTpzaXplXTsKKyAgfQorICBpZiAob3N4d2luZG93LT5nc3R2aWV3KSB7CisgICAgICBbb3N4d2luZG93LT5nc3R2aWV3IHNldFZpZGVvU2l6ZSA6KGludClvc3h3aW5kb3ctPndpZHRoIDooaW50KW9zeHdpbmRvdy0+aGVpZ2h0XTsKKyAgfQorICBHU1RfSU5GT19PQkpFQ1QgKG9zeHZpZGVvc2luaywgImRvbmUiKTsKKworICBbcG9vbCByZWxlYXNlXTsKK30KKworLSAodm9pZCkgc2hvd0ZyYW1lOiAoR3N0QnVmZmVyT2JqZWN0ICopIG9iamVjdAoreworICBHc3RWaWRlb0ZyYW1lIGZyYW1lOworICBndWludDggKmRhdGEsICpyZWFkcCwgKndyaXRlcDsKKyAgZ2ludCBpLCBhY3RpdmVfd2lkdGgsIHN0cmlkZTsKKyAgZ3VpbnQ4ICp0ZXh0dXJlX2J1ZmZlcjsKKyAgTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKKyAgR3N0QnVmZmVyICpidWYgPSBvYmplY3QtPmJ1ZjsKKworICBHU1RfT0JKRUNUX0xPQ0sgKG9zeHZpZGVvc2luayk7CisgIGlmIChvc3h2aWRlb3NpbmstPm9zeHdpbmRvdyA9PSBOVUxMKQorICAgICAgZ290byBub193aW5kb3c7CisKKyAgdGV4dHVyZV9idWZmZXIgPSAoZ3VpbnQ4ICopIFtvc3h2aWRlb3NpbmstPm9zeHdpbmRvdy0+Z3N0dmlldyBnZXRUZXh0dXJlQnVmZmVyXTsKKyAgaWYgKEdfVU5MSUtFTFkgKHRleHR1cmVfYnVmZmVyID09IE5VTEwpKQorICAgICAgZ290byBub190ZXh0dXJlX2J1ZmZlcjsKKworICBpZiAoIWdzdF92aWRlb19mcmFtZV9tYXAgKCZmcmFtZSwgJm9zeHZpZGVvc2luay0+aW5mbywgYnVmLCBHU1RfTUFQX1JFQUQpKQorICAgICAgZ290byBub19tYXA7CisKKyAgZGF0YSA9IHJlYWRwID0gR1NUX1ZJREVPX0ZSQU1FX1BMQU5FX0RBVEEgKCZmcmFtZSwgMCk7CisgIHN0cmlkZSA9IEdTVF9WSURFT19GUkFNRV9QTEFORV9TVFJJREUgKCZmcmFtZSwgMCk7CisgIHdyaXRlcCA9IHRleHR1cmVfYnVmZmVyOworICBhY3RpdmVfd2lkdGggPSBHU1RfVklERU9fU0lOS19XSURUSCAob3N4dmlkZW9zaW5rKSAqIHNpemVvZiAoc2hvcnQpOworICBmb3IgKGkgPSAwOyBpIDwgR1NUX1ZJREVPX1NJTktfSEVJR0hUIChvc3h2aWRlb3NpbmspOyBpKyspIHsKKyAgICAgIG1lbWNweSAod3JpdGVwLCByZWFkcCwgYWN0aXZlX3dpZHRoKTsKKyAgICAgIHdyaXRlcCArPSBhY3RpdmVfd2lkdGg7CisgICAgICByZWFkcCArPSBzdHJpZGU7CisgIH0KKyAgW29zeHZpZGVvc2luay0+b3N4d2luZG93LT5nc3R2aWV3IGRpc3BsYXlUZXh0dXJlXTsKKworICBnc3RfdmlkZW9fZnJhbWVfdW5tYXAgKCZmcmFtZSk7CisKK291dDoKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKG9zeHZpZGVvc2luayk7CisgIFtvYmplY3QgcmVsZWFzZV07CisKKyAgW3Bvb2wgcmVsZWFzZV07CisgIHJldHVybjsKKworbm9fbWFwOgorICBHU1RfV0FSTklOR19PQkpFQ1QgKG9zeHZpZGVvc2luaywgImNvdWxkbid0IG1hcCBmcmFtZSIpOworICBnb3RvIG91dDsKKworbm9fd2luZG93OgorICBHU1RfV0FSTklOR19PQkpFQ1QgKG9zeHZpZGVvc2luaywgIm5vdCBzaG93aW5nIGZyYW1lIHNpbmNlIHdlIGhhdmUgbm8gd2luZG93ICghPykiKTsKKyAgZ290byBvdXQ7CisKK25vX3RleHR1cmVfYnVmZmVyOgorICBHU1RfRUxFTUVOVF9FUlJPUiAob3N4dmlkZW9zaW5rLCBSRVNPVVJDRSwgV1JJVEUsIChOVUxMKSwKKyAgICAgICAgICAoInRoZSB0ZXh0dXJlIGJ1ZmZlciBpcyBOVUxMIikpOworICBnb3RvIG91dDsKK30KKworLSh2b2lkKSBkZXN0cm95Cit7CisgIE5TQXV0b3JlbGVhc2VQb29sICpwb29sOworICBHc3RPU1hXaW5kb3cgKm9zeHdpbmRvdzsKKworICBwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07CisKKyAgb3N4d2luZG93ID0gb3N4dmlkZW9zaW5rLT5vc3h3aW5kb3c7CisgIG9zeHZpZGVvc2luay0+b3N4d2luZG93ID0gTlVMTDsKKworICBpZiAob3N4d2luZG93KSB7CisgICAgaWYgKG9zeHZpZGVvc2luay0+c3VwZXJ2aWV3KSB7CisgICAgICBbb3N4d2luZG93LT5nc3R2aWV3IHJlbW92ZUZyb21TdXBlcnZpZXddOworICAgIH0KKyAgICBbb3N4d2luZG93LT5nc3R2aWV3IHJlbGVhc2VdOworICAgIGlmIChvc3h3aW5kb3ctPmludGVybmFsKSB7CisgICAgICBpZiAoIW9zeHdpbmRvdy0+Y2xvc2VkKSB7CisgICAgICAgIG9zeHdpbmRvdy0+Y2xvc2VkID0gVFJVRTsKKyAgICAgICAgW29zeHdpbmRvdy0+d2luIGNsb3NlXTsKKyAgICAgICAgW29zeHdpbmRvdy0+d2luIHJlbGVhc2VdOworICAgICAgfQorICAgIH0KKyAgICBnX2ZyZWUgKG9zeHdpbmRvdyk7CisgIH0KKyAgW3Bvb2wgcmVsZWFzZV07Cit9CisKKyNpZm5kZWYgR1NUUkVBTUVSX0dMSUJfQ09DT0FfTlNBUFBMSUNBVElPTgorLSh2b2lkKSBuc0FwcFRocmVhZAoreworICBOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbDsKKworICAvKiBzZXQgdGhlIG1haW4gcnVubG9vcCBhcyB0aGUgcnVubG9vcCBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLiBUaGlzIGhhcyB0aGUKKyAgICogZWZmZWN0IHRoYXQgY2FsbGluZyBOU0FwcCBuZXh0RXZlbnRNYXRjaGluZ01hc2s6dW50aWxEYXRlOmluTW9kZTpkZXF1ZXVlCisgICAqIHJ1bnMgdGhlIG1haW4gcnVubG9vcC4KKyAgICovCisgIF9DRlJ1bkxvb3BTZXRDdXJyZW50KENGUnVuTG9vcEdldE1haW4oKSk7CisKKyAgLyogdGhpcyBpcyBuZWVkZWQgdG8gbWFrZSBJc01haW5UaHJlYWQgY2hlY2tzIGluIGNvcmUgZm91bmRhdGlvbiB3b3JrIGZyb20gdGhlCisgICAqIGN1cnJlbnQgdGhyZWFkCisgICAqLworICBfQ0ZNYWluUFRocmVhZCA9IHB0aHJlYWRfc2VsZigpOworCisgIHBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKKworICBbTlNBcHBsaWNhdGlvbiBzaGFyZWRBcHBsaWNhdGlvbl07CisgIFtOU0FwcCBmaW5pc2hMYXVuY2hpbmddOworCisgIGdfbXV0ZXhfbG9jayAoJl9ydW5fbG9vcF9tdXRleCk7CisgIGdfY29uZF9zaWduYWwgKCZfcnVuX2xvb3BfY29uZCk7CisgIGdfbXV0ZXhfdW5sb2NrICgmX3J1bl9sb29wX211dGV4KTsKKworICAvKiBydW4gdGhlIGxvb3AgKi8KKyAgcnVuX25zX2FwcF9sb29wICgpOworCisgIFtwb29sIHJlbGVhc2VdOworfQorCistKHZvaWQpIGNoZWNrTWFpblJ1bkxvb3AKK3sKKyAgZ19tdXRleF9sb2NrICgmX3J1bl9sb29wX211dGV4KTsKKyAgZ19jb25kX3NpZ25hbCAoJl9ydW5fbG9vcF9jb25kKTsKKyAgZ19tdXRleF91bmxvY2sgKCZfcnVuX2xvb3BfbXV0ZXgpOworfQorI2VuZGlmCisKK0BlbmQKKworQCBpbXBsZW1lbnRhdGlvbiBHc3RCdWZmZXJPYmplY3QKKy0oaWQpIGluaXRXaXRoQnVmZmVyOiAoR3N0QnVmZmVyKikgYnVmZmVyCit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGdzdF9idWZmZXJfcmVmKGJ1ZmZlcik7CisgIHNlbGYtPmJ1ZiA9IGJ1ZmZlcjsKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0odm9pZCkgZGVhbGxvY3sKKyAgZ3N0X2J1ZmZlcl91bnJlZihidWYpOworICBbc3VwZXIgZGVhbGxvY107Cit9CitAZW5kCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJvc3h2aWRlb3NpbmsiLAorICAgICAgICAgIEdTVF9SQU5LX01BUkdJTkFMLCBHU1RfVFlQRV9PU1hfVklERU9fU0lOSykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfZGVidWdfb3N4X3ZpZGVvX3NpbmssICJvc3h2aWRlb3NpbmsiLCAwLAorICAgICAgIm9zeHZpZGVvc2luayBlbGVtZW50Iik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0dTVF9QTFVHSU5fREVGSU5FIChHU1RfVkVSU0lPTl9NQUpPUiwKKyAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICBvc3h2aWRlbywKKyAgICAiT1NYIG5hdGl2ZSB2aWRlbyBvdXRwdXQgcGx1Z2luIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL3N5cy92NGwyL01ha2VmaWxlLmFtIGIvc3lzL3Y0bDIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEyNmMxMQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNzQgQEAKK3BsdWdpbl9MVExJQlJBUklFUyA9IGxpYmdzdHZpZGVvNGxpbnV4Mi5sYQorCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29tbW9uL2dzdC1nbGliLWdlbi5tYWsKKworbGliZ3N0dmlkZW80bGludXgyX2xhX1NPVVJDRVMgPSBnc3R2NGwyLmMgXAorCQkJCWdzdHY0bDJhbGxvY2F0b3IuYyBcCisJCQkJZ3N0djRsMmNvbG9yYmFsYW5jZS5jIFwKKwkJCQlnc3R2NGwyZGV2aWNlcHJvdmlkZXIuYyBcCisJCQkJZ3N0djRsMm9iamVjdC5jIFwKKwkJCQlnc3R2NGwyYnVmZmVycG9vbC5jIFwKKwkJCQlnc3R2NGwyc2luay5jIFwKKwkJCQlnc3R2NGwyc3JjLmMgXAorCQkJCWdzdHY0bDJyYWRpby5jIFwKKwkJCQlnc3R2NGwydHVuZXIuYyBcCisJCQkJZ3N0djRsMnRyYW5zZm9ybS5jIFwKKwkJCQlnc3R2NGwydmlkZW9kZWMuYyBcCisJCQkJZ3N0djRsMnZpZGVvZW5jLmMgXAorCQkJCWdzdHY0bDJoMjYzZW5jLmMgXAorCQkJCWdzdHY0bDJoMjY0ZW5jLmMgXAorCQkJCWdzdHY0bDJtcGVnNGVuYy5jIFwKKwkJCQlnc3R2NGwydmlkb3JpZW50LmMgXAorCQkJCWdzdHY0bDJ2cDhlbmMuYyBcCisJCQkJZ3N0djRsMnZwOWVuYy5jIFwKKwkJCQl2NGwyX2NhbGxzLmMgXAorCQkJCXY0bDItdXRpbHMuYyBcCisJCQkJdHVuZXIuYyBcCisJCQkJdHVuZXJjaGFubmVsLmMgXAorCQkJCXR1bmVybm9ybS5jCisKK2xpYmdzdHZpZGVvNGxpbnV4Ml9sYV9DRkxBR1MgPSAgICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkJCQkgJChHU1RfQkFTRV9DRkxBR1MpIFwKKwkJCQkgJChHU1RfQ0ZMQUdTKSBcCisJCQkJICQoWF9DRkxBR1MpIFwKKwkJCQkgJChMSUJWNEwyX0NGTEFHUykgXAorCQkJCSAkKEdVREVWX0NGTEFHUykKKworbGliZ3N0dmlkZW80bGludXgyX2xhX0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKK2xpYmdzdHZpZGVvNGxpbnV4Ml9sYV9MSUJBREQgPSAgICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSBcCisJCQkJIC1sZ3N0YWxsb2NhdG9ycy0kKEdTVF9BUElfVkVSU0lPTikgXAorCQkJCSAtbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisJCQkJICQoR1NUX0JBU0VfTElCUykgXAorCQkJCSAkKEdTVF9MSUJTKSBcCisJCQkJICQoTElCVjRMMl9MSUJTKSBcCisJCQkJICQoR1VERVZfTElCUykgXAorCQkJCSAkKExJQlJUKQorCitub2luc3RfSEVBREVSUyA9IFwKKwlleHQvdHlwZXMtY29tcGF0LmggXAorCWV4dC92NGwyLWNvbW1vbi5oIFwKKwlleHQvdjRsMi1jb250cm9scy5oIFwKKwlleHQvdmlkZW9kZXYyLmggXAorCWdzdHY0bDJhbGxvY2F0b3IuaCBcCisJZ3N0djRsMmJ1ZmZlcnBvb2wuaCBcCisJZ3N0djRsMmNvbG9yYmFsYW5jZS5oIFwKKwlnc3R2NGwyZGV2aWNlcHJvdmlkZXIuaCBcCisJZ3N0djRsMm9iamVjdC5oIFwKKwlnc3R2NGwyc2luay5oIFwKKwlnc3R2NGwyc3JjLmggXAorCWdzdHY0bDJyYWRpby5oIFwKKwlnc3R2NGwydHVuZXIuaCBcCisJZ3N0djRsMnRyYW5zZm9ybS5oIFwKKwlnc3R2NGwydmlkZW9kZWMuaCBcCisJZ3N0djRsMnZpZGVvZW5jLmggXAorCWdzdHY0bDJoMjYzZW5jLmggXAorCWdzdHY0bDJoMjY0ZW5jLmggXAorCWdzdHY0bDJtcGVnNGVuYy5oIFwKKwlnc3R2NGwydmlkb3JpZW50LmggXAorCWdzdHY0bDJ2cDhlbmMuaCBcCisJZ3N0djRsMnZwOWVuYy5oIFwKKwl2NGwyLXV0aWxzLmggXAorCXR1bmVyLmggXAorCXR1bmVyY2hhbm5lbC5oIFwKKwl0dW5lcm5vcm0uaAorCmRpZmYgLS1naXQgYS9zeXMvdjRsMi9SRUFETUUgYi9zeXMvdjRsMi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljNGFiNAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL1JFQURNRQpAQCAtMCwwICsxLDMyIEBACit2NGwyIHBsdWdpbnMKKz09PT09PT09PT09PQorCitUaGUgaWRlYSBpcyBhIGJpdCB0aGUgc2FtZSBhcyB0aGUgaWRlYSBmb3IgdGhlIHY0bDEgcGx1Z2lucy4gV2Ugd2FudAorb25lIGdlbmVyaWMgdjRsMmVsZW1lbnQsIGFuZCBhIGZldyBjaGlsZCBvYmplY3RzIChwcm9iYWJseSBvbmx5IHR3bzoKK3Y0bDJzcmMgYW5kIHY0bDJzaW5rKToKKworICAgICAgICAgICAgICAgIC8tLS0tLS0tLSB2NGwyc3JjCit2NGwyZWxlbWVudCAtLS09CisgICAgICAgICAgICAgICAgXC0tLS0tLS0tIHY0bDJzaW5rCisKK0JvdGggdjRsMnNyYyBhbmQgdjRsMnNpbmsgaGF2ZSBhIHVuY29tcHJlc3NlZCBhbmQgYSBjb21wcmVzc2VkCityZWNvcmRpbmctL3BsYXliYWNrLW1vZGUuIFNpbmNlIHRoaXMgaXMgYWxsIHBhcnQgb2YgdjRsMiwgdGhlICdjbGllbnQnCitvZiB0aGVzZSBlbGVtZW50cywgaS5lLiBhbiBhcHBsaWNhdGlvbiB1c2luZyB2NGwyc3JjL3Y0bDJzaW5rLCB3aWxsCitoYXJkbHkgbm90aWNlIHRoaXMuIEFsbCBjYXBzbmVnbyBzdHVmZiBpcyBkb25lIGluc2lkZSwgYW5kIHRoZSBwbHVnaW4KK2tub3dzIHdoaWNoIGZvcm1hdHMgYXJlIGNvbXByZXNzZWQgYW5kIHdoaWNoIGFyZSBub3QuCisKK1BsZWFzZSBub3RlIHRoYXQgdGhlIHY0bDEgYW5kIHRoZSB2NGwyIHBsdWdpbnMgYXJlICpub3QqIGNvbXBhdGlibGUKK2NvbmNlcm5pbmcgcHJvcGVydGllcy4gTmFtaW5nIGhhcyBiZWVuIGtlcHQgdGhlIHNhbWUgd2hlcmUgcG9zc2libGUsCitidXQgaW4gc29tZSBjYXNlcywgcHJvcGVydGllcyBoYWQgdG8gYmUgcmVtb3ZlZCBvciBhZGRlZCB0byBtYWtlCitmdWxsIHVzZSBvZiB2NGwyLgorCitWNEwyIEFQSTogaHR0cDovL2xpbnV4LmJ5dGVzZXgub3JnL3Y0bDIvLgorICAgICAgICAgIGh0dHA6Ly92NGwyc3BlYy5ieXRlc2V4Lm9yZy8KKyAgICAgICAgICAvdXNyL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmggb3IKKworS2VybmVsIHBhdGNoZXMgYXZhaWxhYmxlIGZyb20KKyAgICAgICAgICBodHRwOi8vZGwuYnl0ZXNleC5vcmcvcGF0Y2hlcy8uCisKK0FydGljbGVzOgorICAgICAgICAgIGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzIwMzkyNC8KKwpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZXh0L3R5cGVzLWNvbXBhdC5oIGIvc3lzL3Y0bDIvZXh0L3R5cGVzLWNvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMjZkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9leHQvdHlwZXMtY29tcGF0LmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBDb2xsYWJvcmEgTHRkLgorICogICAgIEF1dGhvcjogTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhc0BuZHVmcmVzbmUuY2E+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpZm5kZWYgX19UWVBFU19DT01QQVRfSF9fCisjZGVmaW5lIF9fVFlQRVNfQ09NUEFUX0hfXworCisvKiBGcm9tIGxpbnV4L3R5cGVzLmggKi8KKyNpZm5kZWYgX19iaXR3aXNlX18KKyMgIGlmZGVmIF9fQ0hFQ0tFUl9fCisjICAgIGRlZmluZSBfX2JpdHdpc2VfXyBfX2F0dHJpYnV0ZV9fKChiaXR3aXNlKSkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9fYml0d2lzZV9fCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX19iaXR3aXNlCisjICBpZmRlZiBfX0NIRUNLX0VORElBTl9fCisjICAgIGRlZmluZSBfX2JpdHdpc2UgX19iaXR3aXNlX18KKyMgIGVsc2UKKyMgICAgZGVmaW5lIF9fYml0d2lzZQorIyAgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIF9fdTY0IGd1aW50NjQKKyNkZWZpbmUgX191MzIgZ3VpbnQzMgorI2RlZmluZSBfX3UxNiBndWludDE2CisjZGVmaW5lIF9fdTggZ3VpbnQ4CisjZGVmaW5lIF9fczY0IGdpbnQ2NAorI2RlZmluZSBfX3MzMiBnaW50MzIKKyNkZWZpbmUgX19sZTMyIGd1aW50MzIgX19iaXR3aXNlCisKKyNkZWZpbmUgX191c2VyCisKKyNlbmRpZiAvKiBfX1RZUEVTX0NPTVBBVF9IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2V4dC92NGwyLWNvbW1vbi5oIGIvc3lzL3Y0bDIvZXh0L3Y0bDItY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEyYzg4YQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2V4dC92NGwyLWNvbW1vbi5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogaW5jbHVkZS9saW51eC92NGwyLWNvbW1vbi5oCisgKgorICogQ29tbW9uIFY0TDIgYW5kIFY0TDIgc3ViZGV2IGRlZmluaXRpb25zLgorICoKKyAqIFVzZXJzIGFyZSBhZHZpc2VkIHRvICNpbmNsdWRlIHRoaXMgZmlsZSBlaXRoZXIgdGhyb3VnaCB2aWRlb2RldjIuaAorICogKFY0TDIpIG9yIHRocm91Z2ggdjRsMi1zdWJkZXYuaCAoVjRMMiBzdWJkZXYpIHJhdGhlciB0aGFuIHRvIHJlZmVyCisgKiB0byB0aGlzIGZpbGUgZGlyZWN0bHkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb250YWN0OiBTYWthcmkgQWlsdXMgPHNha2FyaS5haWx1c0Bpa2kuZmk+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIEFsdGVybmF0aXZlbHkgeW91IGNhbiByZWRpc3RyaWJ1dGUgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqICBCU0QgbGljZW5zZSBhcyBzdGF0ZWQgYmVsb3c6CisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqICAgICBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorICogIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1Y0TDJfQ09NTU9OX18KKyNkZWZpbmUgX19WNEwyX0NPTU1PTl9fCisKKyNpbmNsdWRlICJleHQvdHlwZXMtY29tcGF0LmgiCisKKy8qCisgKgorICogU2VsZWN0aW9uIGludGVyZmFjZSBkZWZpbml0aW9ucworICoKKyAqLworCisvKiBDdXJyZW50IGNyb3BwaW5nIGFyZWEgKi8KKyNkZWZpbmUgVjRMMl9TRUxfVEdUX0NST1AJCTB4MDAwMAorLyogRGVmYXVsdCBjcm9wcGluZyBhcmVhICovCisjZGVmaW5lIFY0TDJfU0VMX1RHVF9DUk9QX0RFRkFVTFQJMHgwMDAxCisvKiBDcm9wcGluZyBib3VuZHMgKi8KKyNkZWZpbmUgVjRMMl9TRUxfVEdUX0NST1BfQk9VTkRTCTB4MDAwMgorLyogTmF0aXZlIGZyYW1lIHNpemUgKi8KKyNkZWZpbmUgVjRMMl9TRUxfVEdUX05BVElWRV9TSVpFCTB4MDAwMworLyogQ3VycmVudCBjb21wb3NpbmcgYXJlYSAqLworI2RlZmluZSBWNEwyX1NFTF9UR1RfQ09NUE9TRQkJMHgwMTAwCisvKiBEZWZhdWx0IGNvbXBvc2luZyBhcmVhICovCisjZGVmaW5lIFY0TDJfU0VMX1RHVF9DT01QT1NFX0RFRkFVTFQJMHgwMTAxCisvKiBDb21wb3NpbmcgYm91bmRzICovCisjZGVmaW5lIFY0TDJfU0VMX1RHVF9DT01QT1NFX0JPVU5EUwkweDAxMDIKKy8qIEN1cnJlbnQgY29tcG9zaW5nIGFyZWEgcGx1cyBhbGwgcGFkZGluZyBwaXhlbHMgKi8KKyNkZWZpbmUgVjRMMl9TRUxfVEdUX0NPTVBPU0VfUEFEREVECTB4MDEwMworCisvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHRhcmdldCBkZWZpbml0aW9ucyAtLS0gdG8gYmUgcmVtb3ZlZC4gKi8KKyNkZWZpbmUgVjRMMl9TRUxfVEdUX0NST1BfQUNUSVZFCVY0TDJfU0VMX1RHVF9DUk9QCisjZGVmaW5lIFY0TDJfU0VMX1RHVF9DT01QT1NFX0FDVElWRQlWNEwyX1NFTF9UR1RfQ09NUE9TRQorI2RlZmluZSBWNEwyX1NVQkRFVl9TRUxfVEdUX0NST1BfQUNUVUFMCVY0TDJfU0VMX1RHVF9DUk9QCisjZGVmaW5lIFY0TDJfU1VCREVWX1NFTF9UR1RfQ09NUE9TRV9BQ1RVQUwgVjRMMl9TRUxfVEdUX0NPTVBPU0UKKyNkZWZpbmUgVjRMMl9TVUJERVZfU0VMX1RHVF9DUk9QX0JPVU5EUwlWNEwyX1NFTF9UR1RfQ1JPUF9CT1VORFMKKyNkZWZpbmUgVjRMMl9TVUJERVZfU0VMX1RHVF9DT01QT1NFX0JPVU5EUyBWNEwyX1NFTF9UR1RfQ09NUE9TRV9CT1VORFMKKworLyogU2VsZWN0aW9uIGZsYWdzICovCisjZGVmaW5lIFY0TDJfU0VMX0ZMQUdfR0UJCSgxIDw8IDApCisjZGVmaW5lIFY0TDJfU0VMX0ZMQUdfTEUJCSgxIDw8IDEpCisjZGVmaW5lIFY0TDJfU0VMX0ZMQUdfS0VFUF9DT05GSUcJKDEgPDwgMikKKworLyogQmFja3dhcmQgY29tcGF0aWJpbGl0eSBmbGFnIGRlZmluaXRpb25zIC0tLSB0byBiZSByZW1vdmVkLiAqLworI2RlZmluZSBWNEwyX1NVQkRFVl9TRUxfRkxBR19TSVpFX0dFCVY0TDJfU0VMX0ZMQUdfR0UKKyNkZWZpbmUgVjRMMl9TVUJERVZfU0VMX0ZMQUdfU0laRV9MRQlWNEwyX1NFTF9GTEFHX0xFCisjZGVmaW5lIFY0TDJfU1VCREVWX1NFTF9GTEFHX0tFRVBfQ09ORklHIFY0TDJfU0VMX0ZMQUdfS0VFUF9DT05GSUcKKworc3RydWN0IHY0bDJfZWRpZCB7CisJX191MzIgcGFkOworCV9fdTMyIHN0YXJ0X2Jsb2NrOworCV9fdTMyIGJsb2NrczsKKwlfX3UzMiByZXNlcnZlZFs1XTsKKwlfX3U4ICAqZWRpZDsKK307CisKKyNlbmRpZiAvKiBfX1Y0TDJfQ09NTU9OX18gKi8KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2V4dC92NGwyLWNvbnRyb2xzLmggYi9zeXMvdjRsMi9leHQvdjRsMi1jb250cm9scy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYmZjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9leHQvdjRsMi1jb250cm9scy5oCkBAIC0wLDAgKzEsOTg3IEBACisvKgorICogIFZpZGVvIGZvciBMaW51eCBUd28gY29udHJvbHMgaGVhZGVyIGZpbGUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMTIgdGhlIGNvbnRyaWJ1dG9ycworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gcmVkaXN0cmlidXRlIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiAgQlNEIGxpY2Vuc2UgYXMgc3RhdGVkIGJlbG93OgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgKiAgICAgcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqICBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqICBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiAgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFRoZSBjb250ZW50cyBvZiB0aGlzIGhlYWRlciB3YXMgc3BsaXQgb2ZmIGZyb20gdmlkZW9kZXYyLmguIEFsbCBjb250cm9sCisgKiAgZGVmaW5pdGlvbnMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoaXMgaGVhZGVyLCB3aGljaCBpcyBpbmNsdWRlZCBieQorICogIHZpZGVvZGV2Mi5oLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9WNEwyX0NPTlRST0xTX0gKKyNkZWZpbmUgX19MSU5VWF9WNEwyX0NPTlRST0xTX0gKKworLyogQ29udHJvbCBjbGFzc2VzICovCisjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19VU0VSCQkweDAwOTgwMDAwCS8qIE9sZC1zdHlsZSAndXNlcicgY29udHJvbHMgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX01QRUcJCTB4MDA5OTAwMDAJLyogTVBFRy1jb21wcmVzc2lvbiBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfQ0FNRVJBCQkweDAwOWEwMDAwCS8qIENhbWVyYSBjbGFzcyBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfRk1fVFgJCTB4MDA5YjAwMDAJLyogRk0gTW9kdWxhdG9yIGNvbnRyb2xzICovCisjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19GTEFTSAkJMHgwMDljMDAwMAkvKiBDYW1lcmEgZmxhc2ggY29udHJvbHMgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX0pQRUcJCTB4MDA5ZDAwMDAJLyogSlBFRy1jb21wcmVzc2lvbiBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfSU1BR0VfU09VUkNFCTB4MDA5ZTAwMDAJLyogSW1hZ2Ugc291cmNlIGNvbnRyb2xzICovCisjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19JTUFHRV9QUk9DCTB4MDA5ZjAwMDAJLyogSW1hZ2UgcHJvY2Vzc2luZyBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfRFYJCTB4MDBhMDAwMDAJLyogRGlnaXRhbCBWaWRlbyBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfRk1fUlgJCTB4MDBhMTAwMDAJLyogRk0gUmVjZWl2ZXIgY29udHJvbHMgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX1JGX1RVTkVSCTB4MDBhMjAwMDAJLyogUkYgdHVuZXIgY29udHJvbHMgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX0RFVEVDVAkJMHgwMGEzMDAwMAkvKiBEZXRlY3Rpb24gY29udHJvbHMgKi8KKworLyogVXNlci1jbGFzcyBjb250cm9sIElEcyAqLworCisjZGVmaW5lIFY0TDJfQ0lEX0JBU0UJCQkoVjRMMl9DVFJMX0NMQVNTX1VTRVIgfCAweDkwMCkKKyNkZWZpbmUgVjRMMl9DSURfVVNFUl9CQVNFIAkJVjRMMl9DSURfQkFTRQorI2RlZmluZSBWNEwyX0NJRF9VU0VSX0NMQVNTIAkJKFY0TDJfQ1RSTF9DTEFTU19VU0VSIHwgMSkKKyNkZWZpbmUgVjRMMl9DSURfQlJJR0hUTkVTUwkJKFY0TDJfQ0lEX0JBU0UrMCkKKyNkZWZpbmUgVjRMMl9DSURfQ09OVFJBU1QJCShWNEwyX0NJRF9CQVNFKzEpCisjZGVmaW5lIFY0TDJfQ0lEX1NBVFVSQVRJT04JCShWNEwyX0NJRF9CQVNFKzIpCisjZGVmaW5lIFY0TDJfQ0lEX0hVRQkJCShWNEwyX0NJRF9CQVNFKzMpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRQkJKFY0TDJfQ0lEX0JBU0UrNSkKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fQkFMQU5DRQkJKFY0TDJfQ0lEX0JBU0UrNikKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fQkFTUwkJKFY0TDJfQ0lEX0JBU0UrNykKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fVFJFQkxFCQkoVjRMMl9DSURfQkFTRSs4KQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19NVVRFCQkoVjRMMl9DSURfQkFTRSs5KQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19MT1VETkVTUwkJKFY0TDJfQ0lEX0JBU0UrMTApCisjZGVmaW5lIFY0TDJfQ0lEX0JMQUNLX0xFVkVMCQkoVjRMMl9DSURfQkFTRSsxMSkgLyogRGVwcmVjYXRlZCAqLworI2RlZmluZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0UJKFY0TDJfQ0lEX0JBU0UrMTIpCisjZGVmaW5lIFY0TDJfQ0lEX0RPX1dISVRFX0JBTEFOQ0UJKFY0TDJfQ0lEX0JBU0UrMTMpCisjZGVmaW5lIFY0TDJfQ0lEX1JFRF9CQUxBTkNFCQkoVjRMMl9DSURfQkFTRSsxNCkKKyNkZWZpbmUgVjRMMl9DSURfQkxVRV9CQUxBTkNFCQkoVjRMMl9DSURfQkFTRSsxNSkKKyNkZWZpbmUgVjRMMl9DSURfR0FNTUEJCQkoVjRMMl9DSURfQkFTRSsxNikKKyNkZWZpbmUgVjRMMl9DSURfV0hJVEVORVNTCQkoVjRMMl9DSURfR0FNTUEpIC8qIERlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgVjRMMl9DSURfRVhQT1NVUkUJCShWNEwyX0NJRF9CQVNFKzE3KQorI2RlZmluZSBWNEwyX0NJRF9BVVRPR0FJTgkJKFY0TDJfQ0lEX0JBU0UrMTgpCisjZGVmaW5lIFY0TDJfQ0lEX0dBSU4JCQkoVjRMMl9DSURfQkFTRSsxOSkKKyNkZWZpbmUgVjRMMl9DSURfSEZMSVAJCQkoVjRMMl9DSURfQkFTRSsyMCkKKyNkZWZpbmUgVjRMMl9DSURfVkZMSVAJCQkoVjRMMl9DSURfQkFTRSsyMSkKKworI2RlZmluZSBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWQkoVjRMMl9DSURfQkFTRSsyNCkKK2VudW0gdjRsMl9wb3dlcl9saW5lX2ZyZXF1ZW5jeSB7CisJVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfRElTQUJMRUQJPSAwLAorCVY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZXzUwSFoJPSAxLAorCVY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZXzYwSFoJPSAyLAorCVY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZX0FVVE8JPSAzLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfSFVFX0FVVE8JCQkoVjRMMl9DSURfQkFTRSsyNSkKKyNkZWZpbmUgVjRMMl9DSURfV0hJVEVfQkFMQU5DRV9URU1QRVJBVFVSRQkoVjRMMl9DSURfQkFTRSsyNikKKyNkZWZpbmUgVjRMMl9DSURfU0hBUlBORVNTCQkJKFY0TDJfQ0lEX0JBU0UrMjcpCisjZGVmaW5lIFY0TDJfQ0lEX0JBQ0tMSUdIVF9DT01QRU5TQVRJT04gCShWNEwyX0NJRF9CQVNFKzI4KQorI2RlZmluZSBWNEwyX0NJRF9DSFJPTUFfQUdDICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMjkpCisjZGVmaW5lIFY0TDJfQ0lEX0NPTE9SX0tJTExFUiAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSszMCkKKyNkZWZpbmUgVjRMMl9DSURfQ09MT1JGWAkJCShWNEwyX0NJRF9CQVNFKzMxKQorZW51bSB2NGwyX2NvbG9yZnggeworCVY0TDJfQ09MT1JGWF9OT05FCQkJPSAwLAorCVY0TDJfQ09MT1JGWF9CVwkJCQk9IDEsCisJVjRMMl9DT0xPUkZYX1NFUElBCQkJPSAyLAorCVY0TDJfQ09MT1JGWF9ORUdBVElWRQkJCT0gMywKKwlWNEwyX0NPTE9SRlhfRU1CT1NTCQkJPSA0LAorCVY0TDJfQ09MT1JGWF9TS0VUQ0gJCQk9IDUsCisJVjRMMl9DT0xPUkZYX1NLWV9CTFVFCQkJPSA2LAorCVY0TDJfQ09MT1JGWF9HUkFTU19HUkVFTgkJPSA3LAorCVY0TDJfQ09MT1JGWF9TS0lOX1dISVRFTgkJPSA4LAorCVY0TDJfQ09MT1JGWF9WSVZJRAkJCT0gOSwKKwlWNEwyX0NPTE9SRlhfQVFVQQkJCT0gMTAsCisJVjRMMl9DT0xPUkZYX0FSVF9GUkVFWkUJCQk9IDExLAorCVY0TDJfQ09MT1JGWF9TSUxIT1VFVFRFCQkJPSAxMiwKKwlWNEwyX0NPTE9SRlhfU09MQVJJWkFUSU9OCQk9IDEzLAorCVY0TDJfQ09MT1JGWF9BTlRJUVVFCQkJPSAxNCwKKwlWNEwyX0NPTE9SRlhfU0VUX0NCQ1IJCQk9IDE1LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfQVVUT0JSSUdIVE5FU1MJCQkoVjRMMl9DSURfQkFTRSszMikKKyNkZWZpbmUgVjRMMl9DSURfQkFORF9TVE9QX0ZJTFRFUgkJKFY0TDJfQ0lEX0JBU0UrMzMpCisKKyNkZWZpbmUgVjRMMl9DSURfUk9UQVRFCQkJCShWNEwyX0NJRF9CQVNFKzM0KQorI2RlZmluZSBWNEwyX0NJRF9CR19DT0xPUgkJCShWNEwyX0NJRF9CQVNFKzM1KQorCisjZGVmaW5lIFY0TDJfQ0lEX0NIUk9NQV9HQUlOICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSszNikKKworI2RlZmluZSBWNEwyX0NJRF9JTExVTUlOQVRPUlNfMQkJCShWNEwyX0NJRF9CQVNFKzM3KQorI2RlZmluZSBWNEwyX0NJRF9JTExVTUlOQVRPUlNfMgkJCShWNEwyX0NJRF9CQVNFKzM4KQorCisjZGVmaW5lIFY0TDJfQ0lEX01JTl9CVUZGRVJTX0ZPUl9DQVBUVVJFCShWNEwyX0NJRF9CQVNFKzM5KQorI2RlZmluZSBWNEwyX0NJRF9NSU5fQlVGRkVSU19GT1JfT1VUUFVUCQkoVjRMMl9DSURfQkFTRSs0MCkKKworI2RlZmluZSBWNEwyX0NJRF9BTFBIQV9DT01QT05FTlQJCShWNEwyX0NJRF9CQVNFKzQxKQorI2RlZmluZSBWNEwyX0NJRF9DT0xPUkZYX0NCQ1IJCQkoVjRMMl9DSURfQkFTRSs0MikKKworLyogbGFzdCBDSUQgKyAxICovCisjZGVmaW5lIFY0TDJfQ0lEX0xBU1RQMSAgICAgICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSs0MykKKworLyogVVNFUi1jbGFzcyBwcml2YXRlIGNvbnRyb2wgSURzICovCisKKy8qIFRoZSBiYXNlIGZvciB0aGUgbWV5ZSBkcml2ZXIgY29udHJvbHMuIFNlZSBsaW51eC9tZXllLmggZm9yIHRoZSBsaXN0CisgKiBvZiBjb250cm9scy4gV2UgcmVzZXJ2ZSAxNiBjb250cm9scyBmb3IgdGhpcyBkcml2ZXIuICovCisjZGVmaW5lIFY0TDJfQ0lEX1VTRVJfTUVZRV9CQVNFCQkJKFY0TDJfQ0lEX1VTRVJfQkFTRSArIDB4MTAwMCkKKworLyogVGhlIGJhc2UgZm9yIHRoZSBidHR2IGRyaXZlciBjb250cm9scy4KKyAqIFdlIHJlc2VydmUgMzIgY29udHJvbHMgZm9yIHRoaXMgZHJpdmVyLiAqLworI2RlZmluZSBWNEwyX0NJRF9VU0VSX0JUVFZfQkFTRQkJCShWNEwyX0NJRF9VU0VSX0JBU0UgKyAweDEwMTApCisKKworLyogVGhlIGJhc2UgZm9yIHRoZSBzMjI1NSBkcml2ZXIgY29udHJvbHMuCisgKiBXZSByZXNlcnZlIDE2IGNvbnRyb2xzIGZvciB0aGlzIGRyaXZlci4gKi8KKyNkZWZpbmUgVjRMMl9DSURfVVNFUl9TMjI1NV9CQVNFCQkoVjRMMl9DSURfVVNFUl9CQVNFICsgMHgxMDMwKQorCisvKgorICogVGhlIGJhc2UgZm9yIHRoZSBzaTQ3NnggZHJpdmVyIGNvbnRyb2xzLiBTZWUgaW5jbHVkZS9tZWRpYS9kcnYtaW50Zi9zaTQ3NnguaAorICogZm9yIHRoZSBsaXN0IG9mIGNvbnRyb2xzLiBUb3RhbCBvZiAxNiBjb250cm9scyBpcyByZXNlcnZlZCBmb3IgdGhpcyBkcml2ZXIKKyAqLworI2RlZmluZSBWNEwyX0NJRF9VU0VSX1NJNDc2WF9CQVNFCQkoVjRMMl9DSURfVVNFUl9CQVNFICsgMHgxMDQwKQorCisvKiBUaGUgYmFzZSBmb3IgdGhlIFRJIFZQRSBkcml2ZXIgY29udHJvbHMuIFRvdGFsIG9mIDE2IGNvbnRyb2xzIGlzIHJlc2VydmVkIGZvcgorICogdGhpcyBkcml2ZXIgKi8KKyNkZWZpbmUgVjRMMl9DSURfVVNFUl9USV9WUEVfQkFTRQkJKFY0TDJfQ0lEX1VTRVJfQkFTRSArIDB4MTA1MCkKKworLyogVGhlIGJhc2UgZm9yIHRoZSBzYWE3MTM0IGRyaXZlciBjb250cm9scy4KKyAqIFdlIHJlc2VydmUgMTYgY29udHJvbHMgZm9yIHRoaXMgZHJpdmVyLiAqLworI2RlZmluZSBWNEwyX0NJRF9VU0VSX1NBQTcxMzRfQkFTRQkJKFY0TDJfQ0lEX1VTRVJfQkFTRSArIDB4MTA2MCkKKworLyogVGhlIGJhc2UgZm9yIHRoZSBhZHY3MTgwIGRyaXZlciBjb250cm9scy4KKyAqIFdlIHJlc2VydmUgMTYgY29udHJvbHMgZm9yIHRoaXMgZHJpdmVyLiAqLworI2RlZmluZSBWNEwyX0NJRF9VU0VSX0FEVjcxODBfQkFTRQkJKFY0TDJfQ0lEX1VTRVJfQkFTRSArIDB4MTA3MCkKKworLyogVGhlIGJhc2UgZm9yIHRoZSB0YzM1ODc0MyBkcml2ZXIgY29udHJvbHMuCisgKiBXZSByZXNlcnZlIDE2IGNvbnRyb2xzIGZvciB0aGlzIGRyaXZlci4gKi8KKyNkZWZpbmUgVjRMMl9DSURfVVNFUl9UQzM1ODc0M19CQVNFCQkoVjRMMl9DSURfVVNFUl9CQVNFICsgMHgxMDgwKQorCisvKiBUaGUgYmFzZSBmb3IgdGhlIG1heDIxN3ggZHJpdmVyIGNvbnRyb2xzLgorICogV2UgcmVzZXJ2ZSAzMiBjb250cm9scyBmb3IgdGhpcyBkcml2ZXIKKyAqLworI2RlZmluZSBWNEwyX0NJRF9VU0VSX01BWDIxN1hfQkFTRQkJKFY0TDJfQ0lEX1VTRVJfQkFTRSArIDB4MTA5MCkKKworLyogVGhlIGJhc2UgZm9yIHRoZSBpbXggZHJpdmVyIGNvbnRyb2xzLgorICogV2UgcmVzZXJ2ZSAxNiBjb250cm9scyBmb3IgdGhpcyBkcml2ZXIuICovCisjZGVmaW5lIFY0TDJfQ0lEX1VTRVJfSU1YX0JBU0UJCQkoVjRMMl9DSURfVVNFUl9CQVNFICsgMHgxMDkwKQorCisvKiBNUEVHLWNsYXNzIGNvbnRyb2wgSURzICovCisvKiBUaGUgTVBFRyBjb250cm9scyBhcmUgYXBwbGljYWJsZSB0byBhbGwgY29kZWMgY29udHJvbHMKKyAqIGFuZCB0aGUgJ01QRUcnIHBhcnQgb2YgdGhlIGRlZmluZSBpcyBoaXN0b3JpY2FsICovCisKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19CQVNFIAkJCShWNEwyX0NUUkxfQ0xBU1NfTVBFRyB8IDB4OTAwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NMQVNTIAkJCShWNEwyX0NUUkxfQ0xBU1NfTVBFRyB8IDEpCisKKy8qICBNUEVHIHN0cmVhbXMsIHNwZWNpZmljIHRvIG11bHRpcGxleGVkIHN0cmVhbXMgKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMCkKK2VudW0gdjRsMl9tcGVnX3N0cmVhbV90eXBlIHsKKwlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfUFMgICA9IDAsIC8qIE1QRUctMiBwcm9ncmFtIHN0cmVhbSAqLworCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9UUyAgID0gMSwgLyogTVBFRy0yIHRyYW5zcG9ydCBzdHJlYW0gKi8KKwlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzFfU1MgICA9IDIsIC8qIE1QRUctMSBzeXN0ZW0gc3RyZWFtICovCisJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX0RWRCAgPSAzLCAvKiBNUEVHLTIgRFZELWNvbXBhdGlibGUgc3RyZWFtICovCisJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcxX1ZDRCAgPSA0LCAvKiBNUEVHLTEgVkNELWNvbXBhdGlibGUgc3RyZWFtICovCisJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX1NWQ0QgPSA1LCAvKiBNUEVHLTIgU1ZDRC1jb21wYXRpYmxlIHN0cmVhbSAqLworfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1BNVCAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX0FVRElPIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfVklERU8gCQkoVjRMMl9DSURfTVBFR19CQVNFKzMpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QQ1IgCQkoVjRMMl9DSURfTVBFR19CQVNFKzQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BFU19JRF9BVURJTyAJKFY0TDJfQ0lEX01QRUdfQkFTRSs1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfVklERU8gCShWNEwyX0NJRF9NUEVHX0JBU0UrNikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fVkJJX0ZNVCAJCShWNEwyX0NJRF9NUEVHX0JBU0UrNykKK2VudW0gdjRsMl9tcGVnX3N0cmVhbV92YmlfZm10IHsKKwlWNEwyX01QRUdfU1RSRUFNX1ZCSV9GTVRfTk9ORSA9IDAsICAvKiBObyBWQkkgaW4gdGhlIE1QRUcgc3RyZWFtICovCisJVjRMMl9NUEVHX1NUUkVBTV9WQklfRk1UX0lWVFYgPSAxLCAgLyogVkJJIGluIHByaXZhdGUgcGFja2V0cywgSVZUViBmb3JtYXQgKi8KK307CisKKy8qICBNUEVHIGF1ZGlvIGNvbnRyb2xzIHNwZWNpZmljIHRvIG11bHRpcGxleGVkIHN0cmVhbXMgICovCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUSAJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDApCitlbnVtIHY0bDJfbXBlZ19hdWRpb19zYW1wbGluZ19mcmVxIHsKKwlWNEwyX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUV80NDEwMCA9IDAsCisJVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfNDgwMDAgPSAxLAorCVY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzMyMDAwID0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fRU5DT0RJTkcgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwMSkKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2VuY29kaW5nIHsKKwlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMSA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzIgPSAxLAorCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8zID0gMiwKKwlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfQUFDICAgICA9IDMsCisJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0FDMyAgICAgPSA0LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19MMV9CSVRSQVRFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDIpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19sMV9iaXRyYXRlIHsKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8zMksgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV82NEsgID0gMSwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV85NksgID0gMiwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8xMjhLID0gMywKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8xNjBLID0gNCwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8xOTJLID0gNSwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8yMjRLID0gNiwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8yNTZLID0gNywKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8yODhLID0gOCwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8zMjBLID0gOSwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8zNTJLID0gMTAsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMzg0SyA9IDExLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzQxNksgPSAxMiwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV80NDhLID0gMTMsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wyX0JJVFJBVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwMykKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2wyX2JpdHJhdGUgeworCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzMySyAgPSAwLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzQ4SyAgPSAxLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzU2SyAgPSAyLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzY0SyAgPSAzLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzgwSyAgPSA0LAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzk2SyAgPSA1LAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzExMksgPSA2LAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzEyOEsgPSA3LAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzE2MEsgPSA4LAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzE5MksgPSA5LAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzIyNEsgPSAxMCwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yNTZLID0gMTEsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzIwSyA9IDEyLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzM4NEsgPSAxMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTDNfQklUUkFURSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTA0KQorZW51bSB2NGwyX21wZWdfYXVkaW9fbDNfYml0cmF0ZSB7CisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMzJLICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfNDBLICA9IDEsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfNDhLICA9IDIsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfNTZLICA9IDMsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfNjRLICA9IDQsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfODBLICA9IDUsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfOTZLICA9IDYsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMTEySyA9IDcsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMTI4SyA9IDgsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMTYwSyA9IDksCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMTkySyA9IDEwLAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzIyNEsgPSAxMSwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8yNTZLID0gMTIsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMzIwSyA9IDEzLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19NT0RFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDUpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19tb2RlIHsKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9TVEVSRU8gICAgICAgPSAwLAorCVY0TDJfTVBFR19BVURJT19NT0RFX0pPSU5UX1NURVJFTyA9IDEsCisJVjRMMl9NUEVHX0FVRElPX01PREVfRFVBTCAgICAgICAgID0gMiwKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9NT05PICAgICAgICAgPSAzLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTiAJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDYpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19tb2RlX2V4dGVuc2lvbiB7CisJVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzQgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfOCAgPSAxLAorCVY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF8xMiA9IDIsCisJVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzE2ID0gMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVMgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwNykKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2VtcGhhc2lzIHsKKwlWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfTk9ORSAgICAgICAgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfNTBfRElWXzE1X3VTID0gMSwKKwlWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfQ0NJVFRfSjE3ICAgID0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fQ1JDIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDgpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19jcmMgeworCVY0TDJfTVBFR19BVURJT19DUkNfTk9ORSAgPSAwLAorCVY0TDJfTVBFR19BVURJT19DUkNfQ1JDMTYgPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19NVVRFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDkpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fQUFDX0JJVFJBVEUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTEwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0FDM19CSVRSQVRFCQkoVjRMMl9DSURfTVBFR19CQVNFKzExMSkKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2FjM19iaXRyYXRlIHsKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMzJLICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzQwSyAgPSAxLAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV80OEsgID0gMiwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNTZLICA9IDMsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzY0SyAgPSA0LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV84MEsgID0gNSwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfOTZLICA9IDYsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzExMksgPSA3LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8xMjhLID0gOCwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMTYwSyA9IDksCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzE5MksgPSAxMCwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMjI0SyA9IDExLAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8yNTZLID0gMTIsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzMyMEsgPSAxMywKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMzg0SyA9IDE0LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV80NDhLID0gMTUsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzUxMksgPSAxNiwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNTc2SyA9IDE3LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV82NDBLID0gMTgsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0RFQ19QTEFZQkFDSwkoVjRMMl9DSURfTVBFR19CQVNFKzExMikKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2RlY19wbGF5YmFjayB7CisJVjRMMl9NUEVHX0FVRElPX0RFQ19QTEFZQkFDS19BVVRPCSAgICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0RFQ19QTEFZQkFDS19TVEVSRU8JICAgID0gMSwKKwlWNEwyX01QRUdfQVVESU9fREVDX1BMQVlCQUNLX0xFRlQJICAgID0gMiwKKwlWNEwyX01QRUdfQVVESU9fREVDX1BMQVlCQUNLX1JJR0hUCSAgICA9IDMsCisJVjRMMl9NUEVHX0FVRElPX0RFQ19QTEFZQkFDS19NT05PCSAgICA9IDQsCisJVjRMMl9NUEVHX0FVRElPX0RFQ19QTEFZQkFDS19TV0FQUEVEX1NURVJFTyA9IDUsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0RFQ19NVUxUSUxJTkdVQUxfUExBWUJBQ0sgKFY0TDJfQ0lEX01QRUdfQkFTRSsxMTMpCisKKy8qICBNUEVHIHZpZGVvIGNvbnRyb2xzIHNwZWNpZmljIHRvIG11bHRpcGxleGVkIHN0cmVhbXMgKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjAwKQorZW51bSB2NGwyX21wZWdfdmlkZW9fZW5jb2RpbmcgeworCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzEgICAgID0gMCwKKwlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yICAgICA9IDEsCisJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfNF9BVkMgPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1QgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwMSkKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2FzcGVjdCB7CisJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xeDEgICAgID0gMCwKKwlWNEwyX01QRUdfVklERU9fQVNQRUNUXzR4MyAgICAgPSAxLAorCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMTZ4OSAgICA9IDIsCisJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8yMjF4MTAwID0gMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fQl9GUkFNRVMgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwMikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjAzKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFIAkoVjRMMl9DSURfTVBFR19CQVNFKzIwNCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19QVUxMRE9XTiAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjA1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERSAJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDYpCitlbnVtIHY0bDJfbXBlZ192aWRlb19iaXRyYXRlX21vZGUgeworCVY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfVkJSID0gMCwKKwlWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX0NCUiA9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwNykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX1BFQUsgCShWNEwyX0NJRF9NUEVHX0JBU0UrMjA4KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1RFTVBPUkFMX0RFQ0lNQVRJT04gKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDkpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjEwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VVEVfWVVWIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fREVDT0RFUl9TTElDRV9JTlRFUkZBQ0UJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjEyKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0RFQ09ERVJfTVBFRzRfREVCTE9DS19GSUxURVIJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTMpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fQ1lDTElDX0lOVFJBX1JFRlJFU0hfTUIJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjE0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0ZSQU1FX1JDX0VOQUJMRQkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjE1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0hFQURFUl9NT0RFCQkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjE2KQorZW51bSB2NGwyX21wZWdfdmlkZW9faGVhZGVyX21vZGUgeworCVY0TDJfTVBFR19WSURFT19IRUFERVJfTU9ERV9TRVBBUkFURQkJCT0gMCwKKwlWNEwyX01QRUdfVklERU9fSEVBREVSX01PREVfSk9JTkVEX1dJVEhfMVNUX0ZSQU1FCT0gMSwKKworfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NQVhfUkVGX1BJQwkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjE3KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01CX1JDX0VOQUJMRQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTgpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTUFYX0JZVEVTCShWNEwyX0NJRF9NUEVHX0JBU0UrMjE5KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01BWF9NQgkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMjApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTU9ERQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMjEpCitlbnVtIHY0bDJfbXBlZ192aWRlb19tdWx0aV9zbGljZV9tb2RlIHsKKwlWNEwyX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTU9ERV9TSU5HTEUJCT0gMCwKKwlWNEwyX01QRUdfVklERU9fTVVMVElfU0lDRV9NT0RFX01BWF9NQgkJPSAxLAorCVY0TDJfTVBFR19WSURFT19NVUxUSV9TSUNFX01PREVfTUFYX0JZVEVTCT0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fVkJWX1NJWkUJCQkoVjRMMl9DSURfTVBFR19CQVNFKzIyMikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19ERUNfUFRTCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMjMpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fREVDX0ZSQU1FCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMjQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fVkJWX0RFTEFZCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMjUpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fUkVQRUFUX1NFUV9IRUFERVIJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjI2KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01WX0hfU0VBUkNIX1JBTkdFCQkoVjRMMl9DSURfTVBFR19CQVNFKzIyNykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NVl9WX1NFQVJDSF9SQU5HRQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMjgpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fRk9SQ0VfS0VZX0ZSQU1FCQkoVjRMMl9DSURfTVBFR19CQVNFKzIyOSkKKworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfSV9GUkFNRV9RUAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszMDApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19QX0ZSQU1FX1FQCQkoVjRMMl9DSURfTVBFR19CQVNFKzMwMSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX0JfRlJBTUVfUVAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzAyKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfTUlOX1FQCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszMDMpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19NQVhfUVAJCQkoVjRMMl9DSURfTVBFR19CQVNFKzMwNCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0lfRlJBTUVfUVAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzUwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfUF9GUkFNRV9RUAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9CX0ZSQU1FX1FQCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1MikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X01JTl9RUAkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzUzKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTUFYX1FQCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF84WDhfVFJBTlNGT1JNCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1NSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0NQQl9TSVpFCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1NikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0VOVFJPUFlfTU9ERQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTcpCitlbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X2VudHJvcHlfbW9kZSB7CisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfRU5UUk9QWV9NT0RFX0NBVkxDCT0gMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREVfQ0FCQUMJPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0lfUEVSSU9ECQkoVjRMMl9DSURfTVBFR19CQVNFKzM1OCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xFVkVMCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTkpCitlbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X2xldmVsIHsKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzAJPSAwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFCCT0gMSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzEJPSAyLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMgk9IDMsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8zCT0gNCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8yXzAJPSA1LAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMQk9IDYsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8yCT0gNywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzAJPSA4LAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzNfMQk9IDksCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18yCT0gMTAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNF8wCT0gMTEsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNF8xCT0gMTIsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNF8yCT0gMTMsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNV8wCT0gMTQsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNV8xCT0gMTUsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfQUxQSEEJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9CRVRBCShWNEwyX0NJRF9NUEVHX0JBU0UrMzYxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfTU9ERQkoVjRMMl9DSURfTVBFR19CQVNFKzM2MikKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfbG9vcF9maWx0ZXJfbW9kZSB7CisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfTU9ERV9FTkFCTEVECQkJCT0gMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFX0RJU0FCTEVECQkJCT0gMSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFX0RJU0FCTEVEX0FUX1NMSUNFX0JPVU5EQVJZCT0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QUk9GSUxFCQkoVjRMMl9DSURfTVBFR19CQVNFKzM2MykKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfcHJvZmlsZSB7CisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9CQVNFTElORQkJCT0gMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0NPTlNUUkFJTkVEX0JBU0VMSU5FCT0gMSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX01BSU4JCQk9IDIsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9FWFRFTkRFRAkJCT0gMywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0gJCQk9IDQsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzEwCQkJPSA1LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80MjIJCQk9IDYsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQ0NF9QUkVESUNUSVZFCT0gNywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfMTBfSU5UUkEJCT0gOCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfNDIyX0lOVFJBCQk9IDksCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQ0NF9JTlRSQQkJPSAxMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0NBVkxDXzQ0NF9JTlRSQQkJPSAxMSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX1NDQUxBQkxFX0JBU0VMSU5FCQk9IDEyLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU0NBTEFCTEVfSElHSAkJPSAxMywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX1NDQUxBQkxFX0hJR0hfSU5UUkEJPSAxNCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX1NURVJFT19ISUdICQk9IDE1LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfTVVMVElWSUVXX0hJR0gJCT0gMTYsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfVlVJX0VYVF9TQVJfSEVJR0hUCShWNEwyX0NJRF9NUEVHX0JBU0UrMzY0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfVlVJX0VYVF9TQVJfV0lEVEgJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjUpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0VOQUJMRQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjYpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQwkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjcpCitlbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X3Z1aV9zYXJfaWRjIHsKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ19VTlNQRUNJRklFRAk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMXgxCQk9IDEsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTJ4MTEJCT0gMiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xMHgxMQkJPSAzLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzE2eDExCQk9IDQsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfNDB4MzMJCT0gNSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18yNHgxMQkJPSA2LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzIweDExCQk9IDcsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMzJ4MTEJCT0gOCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ184MHgzMwkJPSA5LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzE4eDExCQk9IDEwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzE1eDExCQk9IDExLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzY0eDMzCQk9IDEyLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzE2MHg5OQkJPSAxMywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ180eDMJCT0gMTQsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfM3gyCQk9IDE1LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzJ4MQkJPSAxNiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ19FWFRFTkRFRAk9IDE3LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1NFSV9GUkFNRV9QQUNLSU5HCQkoVjRMMl9DSURfTVBFR19CQVNFKzM2OCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1NFSV9GUF9DVVJSRU5UX0ZSQU1FXzAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzY5KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfU0VJX0ZQX0FSUkFOR0VNRU5UX1RZUEUJKFY0TDJfQ0lEX01QRUdfQkFTRSszNzApCitlbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X3NlaV9mcF9hcnJhbmdlbWVudF90eXBlIHsKKwlWNEwyX01QRUdfVklERU9fSDI2NF9TRUlfRlBfQVJSQU5HRU1FTlRfVFlQRV9DSEVDS0VSQk9BUkQJPSAwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1NFSV9GUF9BUlJBTkdFTUVOVF9UWVBFX0NPTFVNTgkJPSAxLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1NFSV9GUF9BUlJBTkdFTUVOVF9UWVBFX1JPVwkJPSAyLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1NFSV9GUF9BUlJBTkdFTUVOVF9UWVBFX1NJREVfQllfU0lERQk9IDMsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfU0VJX0ZQX0FSUkFOR0VNRU5UX1RZUEVfVE9QX0JPVFRPTQkJPSA0LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1NFSV9GUF9BUlJBTkdFTUVOVF9UWVBFX1RFTVBPUkFMCQk9IDUsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfRk1PCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNzEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9GTU9fTUFQX1RZUEUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzcyKQorZW51bSB2NGwyX21wZWdfdmlkZW9faDI2NF9mbW9fbWFwX3R5cGUgeworCVY0TDJfTVBFR19WSURFT19IMjY0X0ZNT19NQVBfVFlQRV9JTlRFUkxFQVZFRF9TTElDRVMJCT0gMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9GTU9fTUFQX1RZUEVfU0NBVFRFUkVEX1NMSUNFUwkJPSAxLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0ZNT19NQVBfVFlQRV9GT1JFR1JPVU5EX1dJVEhfTEVGVF9PVkVSCT0gMiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9GTU9fTUFQX1RZUEVfQk9YX09VVAkJCT0gMywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9GTU9fTUFQX1RZUEVfUkFTVEVSX1NDQU4JCQk9IDQsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfRk1PX01BUF9UWVBFX1dJUEVfU0NBTgkJCT0gNSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9GTU9fTUFQX1RZUEVfRVhQTElDSVQJCQk9IDYsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfRk1PX1NMSUNFX0dST1VQCShWNEwyX0NJRF9NUEVHX0JBU0UrMzczKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfRk1PX0NIQU5HRV9ESVJFQ1RJT04JKFY0TDJfQ0lEX01QRUdfQkFTRSszNzQpCitlbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X2Ztb19jaGFuZ2VfZGlyIHsKKwlWNEwyX01QRUdfVklERU9fSDI2NF9GTU9fQ0hBTkdFX0RJUl9SSUdIVAk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfRk1PX0NIQU5HRV9ESVJfTEVGVAk9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfRk1PX0NIQU5HRV9SQVRFCShWNEwyX0NJRF9NUEVHX0JBU0UrMzc1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfRk1PX1JVTl9MRU5HVEgJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzc2KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfQVNPCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNzcpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9BU09fU0xJQ0VfT1JERVIJKFY0TDJfQ0lEX01QRUdfQkFTRSszNzgpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9ISUVSQVJDSElDQUxfQ09ESU5HCQkoVjRMMl9DSURfTVBFR19CQVNFKzM3OSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0hJRVJBUkNISUNBTF9DT0RJTkdfVFlQRQkoVjRMMl9DSURfTVBFR19CQVNFKzM4MCkKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfaGllcmFyY2hpY2FsX2NvZGluZ190eXBlIHsKKwlWNEwyX01QRUdfVklERU9fSDI2NF9ISUVSQVJDSElDQUxfQ09ESU5HX0IJPSAwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0hJRVJBUkNISUNBTF9DT0RJTkdfUAk9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSElFUkFSQ0hJQ0FMX0NPRElOR19MQVlFUgkoVjRMMl9DSURfTVBFR19CQVNFKzM4MSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0hJRVJBUkNISUNBTF9DT0RJTkdfTEFZRVJfUVAJKFY0TDJfQ0lEX01QRUdfQkFTRSszODIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfSV9GUkFNRV9RUAkoVjRMMl9DSURfTVBFR19CQVNFKzQwMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9QX0ZSQU1FX1FQCShWNEwyX0NJRF9NUEVHX0JBU0UrNDAxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X0JfRlJBTUVfUVAJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfTUlOX1FQCShWNEwyX0NJRF9NUEVHX0JBU0UrNDAzKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X01BWF9RUAkoVjRMMl9DSURfTVBFR19CQVNFKzQwNCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9MRVZFTAkJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDUpCitlbnVtIHY0bDJfbXBlZ192aWRlb19tcGVnNF9sZXZlbCB7CisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzAJPSAwLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8wQgk9IDEsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzEJPSAyLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8yCT0gMywKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfMwk9IDQsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzNCCT0gNSwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfNAk9IDYsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzUJPSA3LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFCShWNEwyX0NJRF9NUEVHX0JBU0UrNDA2KQorZW51bSB2NGwyX21wZWdfdmlkZW9fbXBlZzRfcHJvZmlsZSB7CisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfU0lNUExFCQkJCT0gMCwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9BRFZBTkNFRF9TSU1QTEUJCQk9IDEsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfQ09SRQkJCQk9IDIsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfU0lNUExFX1NDQUxBQkxFCQkJPSAzLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX0FEVkFOQ0VEX0NPRElOR19FRkZJQ0lFTkNZCT0gNCwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfUVBFTAkJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDcpCisKKy8qICBDb250cm9sIElEcyBmb3IgVlA4IHN0cmVhbXMKKyAqICBBbHRob3VnaCBWUDggaXMgbm90IHBhcnQgb2YgTVBFRyB3ZSBhZGQgdGhlc2UgY29udHJvbHMgdG8gdGhlIE1QRUcgY2xhc3MKKyAqICBhcyB0aGF0IGNsYXNzIGlzIGFscmVhZHkgaGFuZGxpbmcgb3RoZXIgdmlkZW8gY29tcHJlc3Npb24gc3RhbmRhcmRzCisgKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19WUFhfTlVNX1BBUlRJVElPTlMJCShWNEwyX0NJRF9NUEVHX0JBU0UrNTAwKQorZW51bSB2NGwyX3ZwOF9udW1fcGFydGl0aW9ucyB7CisJVjRMMl9DSURfTVBFR19WSURFT19WUFhfMV9QQVJUSVRJT04JPSAwLAorCVY0TDJfQ0lEX01QRUdfVklERU9fVlBYXzJfUEFSVElUSU9OUwk9IDEsCisJVjRMMl9DSURfTVBFR19WSURFT19WUFhfNF9QQVJUSVRJT05TCT0gMiwKKwlWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF84X1BBUlRJVElPTlMJPSAzLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19WUFhfSU1EX0RJU0FCTEVfNFg0CQkoVjRMMl9DSURfTVBFR19CQVNFKzUwMSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19WUFhfTlVNX1JFRl9GUkFNRVMJCShWNEwyX0NJRF9NUEVHX0JBU0UrNTAyKQorZW51bSB2NGwyX3ZwOF9udW1fcmVmX2ZyYW1lcyB7CisJVjRMMl9DSURfTVBFR19WSURFT19WUFhfMV9SRUZfRlJBTUUJPSAwLAorCVY0TDJfQ0lEX01QRUdfVklERU9fVlBYXzJfUkVGX0ZSQU1FCT0gMSwKKwlWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF8zX1JFRl9GUkFNRQk9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9GSUxURVJfTEVWRUwJCShWNEwyX0NJRF9NUEVHX0JBU0UrNTAzKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9GSUxURVJfU0hBUlBORVNTCShWNEwyX0NJRF9NUEVHX0JBU0UrNTA0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9HT0xERU5fRlJBTUVfUkVGX1BFUklPRAkoVjRMMl9DSURfTVBFR19CQVNFKzUwNSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19WUFhfR09MREVOX0ZSQU1FX1NFTAkoVjRMMl9DSURfTVBFR19CQVNFKzUwNikKK2VudW0gdjRsMl92cDhfZ29sZGVuX2ZyYW1lX3NlbCB7CisJVjRMMl9DSURfTVBFR19WSURFT19WUFhfR09MREVOX0ZSQU1FX1VTRV9QUkVWCQk9IDAsCisJVjRMMl9DSURfTVBFR19WSURFT19WUFhfR09MREVOX0ZSQU1FX1VTRV9SRUZfUEVSSU9ECT0gMSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX01JTl9RUAkJCShWNEwyX0NJRF9NUEVHX0JBU0UrNTA3KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9NQVhfUVAJCQkoVjRMMl9DSURfTVBFR19CQVNFKzUwOCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19WUFhfSV9GUkFNRV9RUAkJKFY0TDJfQ0lEX01QRUdfQkFTRSs1MDkpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX1BfRlJBTUVfUVAJCShWNEwyX0NJRF9NUEVHX0JBU0UrNTEwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZQWF9QUk9GSUxFCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSs1MTEpCisKKy8qICBNUEVHLWNsYXNzIGNvbnRyb2wgSURzIHNwZWNpZmljIHRvIHRoZSBDWDIzNDF4IGRyaXZlciBhcyBkZWZpbmVkIGJ5IFY0TDIgKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UgCQkJCShWNEwyX0NUUkxfQ0xBU1NfTVBFRyB8IDB4MTAwMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSX01PREUgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSswKQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb19zcGF0aWFsX2ZpbHRlcl9tb2RlIHsKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFX01BTlVBTCA9IDAsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERV9BVVRPICAgPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSIAkJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEUgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsyKQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb19sdW1hX3NwYXRpYWxfZmlsdGVyX3R5cGUgeworCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRV9PRkYgICAgICAgICAgICAgICAgICA9IDAsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzFEX0hPUiAgICAgICAgICAgICAgID0gMSwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfMURfVkVSVCAgICAgICAgICAgICAgPSAyLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRV8yRF9IVl9TRVBBUkFCTEUgICAgICA9IDMsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzJEX1NZTV9OT05fU0VQQVJBQkxFID0gNCwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRSAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzMpCitlbnVtIHY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX2Nocm9tYV9zcGF0aWFsX2ZpbHRlcl90eXBlIHsKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRV9PRkYgICAgPSAwLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzFEX0hPUiA9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREUgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs0KQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb190ZW1wb3JhbF9maWx0ZXJfbW9kZSB7CisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREVfTUFOVUFMID0gMCwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVJfTU9ERV9BVVRPICAgPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUiAJCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFIAkJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzYpCitlbnVtIHY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX21lZGlhbl9maWx0ZXJfdHlwZSB7CisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX09GRiAgICAgID0gMCwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfSE9SICAgICAgPSAxLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9WRVJUICAgICA9IDIsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX0hPUl9WRVJUID0gMywKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfRElBRyAgICAgPSA0LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfTUVESUFOX0ZJTFRFUl9CT1RUT00gCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs3KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9NRURJQU5fRklMVEVSX1RPUCAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzgpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9CT1RUT00JKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzkpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9UT1AgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsxMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1NUUkVBTV9JTlNFUlRfTkFWX1BBQ0tFVFMgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsxMSkKKworLyogIE1QRUctY2xhc3MgY29udHJvbCBJRHMgc3BlY2lmaWMgdG8gdGhlIFNhbXN1bmcgTUZDIDUuMSBkcml2ZXIgYXMgZGVmaW5lZCBieSBWNEwyICovCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRQkJCQkoVjRMMl9DVFJMX0NMQVNTX01QRUcgfCAweDExMDApCisKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19ERUNPREVSX0gyNjRfRElTUExBWV9ERUxBWQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSswKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0RFQ09ERVJfSDI2NF9ESVNQTEFZX0RFTEFZX0VOQUJMRQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fRlJBTUVfU0tJUF9NT0RFCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSsyKQorZW51bSB2NGwyX21wZWdfbWZjNTFfdmlkZW9fZnJhbWVfc2tpcF9tb2RlIHsKKwlWNEwyX01QRUdfTUZDNTFfVklERU9fRlJBTUVfU0tJUF9NT0RFX0RJU0FCTEVECQk9IDAsCisJVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZSQU1FX1NLSVBfTU9ERV9MRVZFTF9MSU1JVAk9IDEsCisJVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZSQU1FX1NLSVBfTU9ERV9CVUZfTElNSVQJCT0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fRk9SQ0VfRlJBTUVfVFlQRQkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrMykKK2VudW0gdjRsMl9tcGVnX21mYzUxX3ZpZGVvX2ZvcmNlX2ZyYW1lX3R5cGUgeworCVY0TDJfTVBFR19NRkM1MV9WSURFT19GT1JDRV9GUkFNRV9UWVBFX0RJU0FCTEVECQk9IDAsCisJVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZPUkNFX0ZSQU1FX1RZUEVfSV9GUkFNRQkJPSAxLAorCVY0TDJfTVBFR19NRkM1MV9WSURFT19GT1JDRV9GUkFNRV9UWVBFX05PVF9DT0RFRAk9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX1BBRERJTkcJCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX1BBRERJTkdfWVVWCQkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19SQ19GSVhFRF9UQVJHRVRfQklUCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs2KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX1JDX1JFQUNUSU9OX0NPRUZGCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs3KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfQURBUFRJVkVfUkNfQUNUSVZJVFkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNTApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9BREFQVElWRV9SQ19EQVJLCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs1MSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X0FEQVBUSVZFX1JDX1NNT09USAkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs1MikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X0FEQVBUSVZFX1JDX1NUQVRJQwkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs1MykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X05VTV9SRUZfUElDX0ZPUl9QCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzU0KQorCisKKy8qICBDYW1lcmEgY2xhc3MgY29udHJvbCBJRHMgKi8KKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSAJKFY0TDJfQ1RSTF9DTEFTU19DQU1FUkEgfCAweDkwMCkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0NMQVNTIAkJKFY0TDJfQ1RSTF9DTEFTU19DQU1FUkEgfCAxKQorCisjZGVmaW5lIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE8JCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMSkKK2VudW0gIHY0bDJfZXhwb3N1cmVfYXV0b190eXBlIHsKKwlWNEwyX0VYUE9TVVJFX0FVVE8gPSAwLAorCVY0TDJfRVhQT1NVUkVfTUFOVUFMID0gMSwKKwlWNEwyX0VYUE9TVVJFX1NIVVRURVJfUFJJT1JJVFkgPSAyLAorCVY0TDJfRVhQT1NVUkVfQVBFUlRVUkVfUFJJT1JJVFkgPSAzCit9OworI2RlZmluZSBWNEwyX0NJRF9FWFBPU1VSRV9BQlNPTFVURQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzIpCisjZGVmaW5lIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE9fUFJJT1JJVFkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSszKQorCisjZGVmaW5lIFY0TDJfQ0lEX1BBTl9SRUxBVElWRQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSs0KQorI2RlZmluZSBWNEwyX0NJRF9USUxUX1JFTEFUSVZFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzUpCisjZGVmaW5lIFY0TDJfQ0lEX1BBTl9SRVNFVAkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSs2KQorI2RlZmluZSBWNEwyX0NJRF9USUxUX1JFU0VUCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzcpCisKKyNkZWZpbmUgVjRMMl9DSURfUEFOX0FCU09MVVRFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzgpCisjZGVmaW5lIFY0TDJfQ0lEX1RJTFRfQUJTT0xVVEUJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrOSkKKworI2RlZmluZSBWNEwyX0NJRF9GT0NVU19BQlNPTFVURQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxMCkKKyNkZWZpbmUgVjRMMl9DSURfRk9DVVNfUkVMQVRJVkUJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTEpCisjZGVmaW5lIFY0TDJfQ0lEX0ZPQ1VTX0FVVE8JCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTIpCisKKyNkZWZpbmUgVjRMMl9DSURfWk9PTV9BQlNPTFVURQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxMykKKyNkZWZpbmUgVjRMMl9DSURfWk9PTV9SRUxBVElWRQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxNCkKKyNkZWZpbmUgVjRMMl9DSURfWk9PTV9DT05USU5VT1VTCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTUpCisKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFDWQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxNikKKworI2RlZmluZSBWNEwyX0NJRF9JUklTX0FCU09MVVRFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzE3KQorI2RlZmluZSBWNEwyX0NJRF9JUklTX1JFTEFUSVZFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzE4KQorCisjZGVmaW5lIFY0TDJfQ0lEX0FVVE9fRVhQT1NVUkVfQklBUwkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzE5KQorCisjZGVmaW5lIFY0TDJfQ0lEX0FVVE9fTl9QUkVTRVRfV0hJVEVfQkFMQU5DRQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMjApCitlbnVtIHY0bDJfYXV0b19uX3ByZXNldF93aGl0ZV9iYWxhbmNlIHsKKwlWNEwyX1dISVRFX0JBTEFOQ0VfTUFOVUFMCQk9IDAsCisJVjRMMl9XSElURV9CQUxBTkNFX0FVVE8JCQk9IDEsCisJVjRMMl9XSElURV9CQUxBTkNFX0lOQ0FOREVTQ0VOVAkJPSAyLAorCVY0TDJfV0hJVEVfQkFMQU5DRV9GTFVPUkVTQ0VOVAkJPSAzLAorCVY0TDJfV0hJVEVfQkFMQU5DRV9GTFVPUkVTQ0VOVF9ICT0gNCwKKwlWNEwyX1dISVRFX0JBTEFOQ0VfSE9SSVpPTgkJPSA1LAorCVY0TDJfV0hJVEVfQkFMQU5DRV9EQVlMSUdIVAkJPSA2LAorCVY0TDJfV0hJVEVfQkFMQU5DRV9GTEFTSAkJPSA3LAorCVY0TDJfV0hJVEVfQkFMQU5DRV9DTE9VRFkJCT0gOCwKKwlWNEwyX1dISVRFX0JBTEFOQ0VfU0hBREUJCT0gOSwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfV0lERV9EWU5BTUlDX1JBTkdFCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMjEpCisjZGVmaW5lIFY0TDJfQ0lEX0lNQUdFX1NUQUJJTElaQVRJT04JCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsyMikKKworI2RlZmluZSBWNEwyX0NJRF9JU09fU0VOU0lUSVZJVFkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsyMykKKyNkZWZpbmUgVjRMMl9DSURfSVNPX1NFTlNJVElWSVRZX0FVVE8JCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsyNCkKK2VudW0gdjRsMl9pc29fc2Vuc2l0aXZpdHlfYXV0b190eXBlIHsKKwlWNEwyX0lTT19TRU5TSVRJVklUWV9NQU5VQUwJCT0gMCwKKwlWNEwyX0lTT19TRU5TSVRJVklUWV9BVVRPCQk9IDEsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0VYUE9TVVJFX01FVEVSSU5HCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMjUpCitlbnVtIHY0bDJfZXhwb3N1cmVfbWV0ZXJpbmcgeworCVY0TDJfRVhQT1NVUkVfTUVURVJJTkdfQVZFUkFHRQkJPSAwLAorCVY0TDJfRVhQT1NVUkVfTUVURVJJTkdfQ0VOVEVSX1dFSUdIVEVECT0gMSwKKwlWNEwyX0VYUE9TVVJFX01FVEVSSU5HX1NQT1QJCT0gMiwKKwlWNEwyX0VYUE9TVVJFX01FVEVSSU5HX01BVFJJWAkJPSAzLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9TQ0VORV9NT0RFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzI2KQorZW51bSB2NGwyX3NjZW5lX21vZGUgeworCVY0TDJfU0NFTkVfTU9ERV9OT05FCQkJPSAwLAorCVY0TDJfU0NFTkVfTU9ERV9CQUNLTElHSFQJCT0gMSwKKwlWNEwyX1NDRU5FX01PREVfQkVBQ0hfU05PVwkJPSAyLAorCVY0TDJfU0NFTkVfTU9ERV9DQU5ETEVfTElHSFQJCT0gMywKKwlWNEwyX1NDRU5FX01PREVfREFXTl9EVVNLCQk9IDQsCisJVjRMMl9TQ0VORV9NT0RFX0ZBTExfQ09MT1JTCQk9IDUsCisJVjRMMl9TQ0VORV9NT0RFX0ZJUkVXT1JLUwkJPSA2LAorCVY0TDJfU0NFTkVfTU9ERV9MQU5EU0NBUEUJCT0gNywKKwlWNEwyX1NDRU5FX01PREVfTklHSFQJCQk9IDgsCisJVjRMMl9TQ0VORV9NT0RFX1BBUlRZX0lORE9PUgkJPSA5LAorCVY0TDJfU0NFTkVfTU9ERV9QT1JUUkFJVAkJPSAxMCwKKwlWNEwyX1NDRU5FX01PREVfU1BPUlRTCQkJPSAxMSwKKwlWNEwyX1NDRU5FX01PREVfU1VOU0VUCQkJPSAxMiwKKwlWNEwyX1NDRU5FX01PREVfVEVYVAkJCT0gMTMsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEXzNBX0xPQ0sJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMjcpCisjZGVmaW5lIFY0TDJfTE9DS19FWFBPU1VSRQkJCSgxIDw8IDApCisjZGVmaW5lIFY0TDJfTE9DS19XSElURV9CQUxBTkNFCQkJKDEgPDwgMSkKKyNkZWZpbmUgVjRMMl9MT0NLX0ZPQ1VTCQkJCSgxIDw8IDIpCisKKyNkZWZpbmUgVjRMMl9DSURfQVVUT19GT0NVU19TVEFSVAkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzI4KQorI2RlZmluZSBWNEwyX0NJRF9BVVRPX0ZPQ1VTX1NUT1AJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsyOSkKKyNkZWZpbmUgVjRMMl9DSURfQVVUT19GT0NVU19TVEFUVVMJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSszMCkKKyNkZWZpbmUgVjRMMl9BVVRPX0ZPQ1VTX1NUQVRVU19JRExFCQkoMCA8PCAwKQorI2RlZmluZSBWNEwyX0FVVE9fRk9DVVNfU1RBVFVTX0JVU1kJCSgxIDw8IDApCisjZGVmaW5lIFY0TDJfQVVUT19GT0NVU19TVEFUVVNfUkVBQ0hFRAkJKDEgPDwgMSkKKyNkZWZpbmUgVjRMMl9BVVRPX0ZPQ1VTX1NUQVRVU19GQUlMRUQJCSgxIDw8IDIpCisKKyNkZWZpbmUgVjRMMl9DSURfQVVUT19GT0NVU19SQU5HRQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzMxKQorZW51bSB2NGwyX2F1dG9fZm9jdXNfcmFuZ2UgeworCVY0TDJfQVVUT19GT0NVU19SQU5HRV9BVVRPCQk9IDAsCisJVjRMMl9BVVRPX0ZPQ1VTX1JBTkdFX05PUk1BTAkJPSAxLAorCVY0TDJfQVVUT19GT0NVU19SQU5HRV9NQUNSTwkJPSAyLAorCVY0TDJfQVVUT19GT0NVU19SQU5HRV9JTkZJTklUWQkJPSAzLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9QQU5fU1BFRUQJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMzIpCisjZGVmaW5lIFY0TDJfQ0lEX1RJTFRfU1BFRUQJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMzMpCisKKy8qIEZNIE1vZHVsYXRvciBjbGFzcyBjb250cm9sIElEcyAqLworCisjZGVmaW5lIFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UJCShWNEwyX0NUUkxfQ0xBU1NfRk1fVFggfCAweDkwMCkKKyNkZWZpbmUgVjRMMl9DSURfRk1fVFhfQ0xBU1MJCQkoVjRMMl9DVFJMX0NMQVNTX0ZNX1RYIHwgMSkKKworI2RlZmluZSBWNEwyX0NJRF9SRFNfVFhfREVWSUFUSU9OCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDEpCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9QSQkJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMikKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX1BUWQkJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMykKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX1BTX05BTUUJCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDUpCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9SQURJT19URVhUCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDYpCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9NT05PX1NURVJFTwkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA3KQorI2RlZmluZSBWNEwyX0NJRF9SRFNfVFhfQVJUSUZJQ0lBTF9IRUFECQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDgpCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9DT01QUkVTU0VECQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDkpCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9EWU5BTUlDX1BUWQkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAxMCkKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX1RSQUZGSUNfQU5OT1VOQ0VNRU5UCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMTEpCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9UUkFGRklDX1BST0dSQU0JCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMTIpCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9NVVNJQ19TUEVFQ0gJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMTMpCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9BTFRfRlJFUVNfRU5BQkxFCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMTQpCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9BTFRfRlJFUVMJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMTUpCisKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fTElNSVRFUl9FTkFCTEVECQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDY0KQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19MSU1JVEVSX1JFTEVBU0VfVElNRQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDY1KQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19MSU1JVEVSX0RFVklBVElPTgkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDY2KQorCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0NPTVBSRVNTSU9OX0VOQUJMRUQJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA4MCkKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fQ09NUFJFU1NJT05fR0FJTgkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA4MSkKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fQ09NUFJFU1NJT05fVEhSRVNIT0xECShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgODIpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0NPTVBSRVNTSU9OX0FUVEFDS19USU1FCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgODMpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0NPTVBSRVNTSU9OX1JFTEVBU0VfVElNRQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDg0KQorCisjZGVmaW5lIFY0TDJfQ0lEX1BJTE9UX1RPTkVfRU5BQkxFRAkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA5NikKKyNkZWZpbmUgVjRMMl9DSURfUElMT1RfVE9ORV9ERVZJQVRJT04JCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgOTcpCisjZGVmaW5lIFY0TDJfQ0lEX1BJTE9UX1RPTkVfRlJFUVVFTkNZCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDk4KQorCisjZGVmaW5lIFY0TDJfQ0lEX1RVTkVfUFJFRU1QSEFTSVMJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMTEyKQorZW51bSB2NGwyX3ByZWVtcGhhc2lzIHsKKwlWNEwyX1BSRUVNUEhBU0lTX0RJU0FCTEVECT0gMCwKKwlWNEwyX1BSRUVNUEhBU0lTXzUwX3VTCQk9IDEsCisJVjRMMl9QUkVFTVBIQVNJU183NV91UwkJPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfVFVORV9QT1dFUl9MRVZFTAkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAxMTMpCisjZGVmaW5lIFY0TDJfQ0lEX1RVTkVfQU5URU5OQV9DQVBBQ0lUT1IJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMTE0KQorCisKKy8qIEZsYXNoIGFuZCBwcml2YWN5IChpbmRpY2F0b3IpIGxpZ2h0IGNvbnRyb2xzICovCisKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRQkJKFY0TDJfQ1RSTF9DTEFTU19GTEFTSCB8IDB4OTAwKQorI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9DTEFTUwkJCShWNEwyX0NUUkxfQ0xBU1NfRkxBU0ggfCAxKQorCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX0xFRF9NT0RFCQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyAxKQorZW51bSB2NGwyX2ZsYXNoX2xlZF9tb2RlIHsKKwlWNEwyX0ZMQVNIX0xFRF9NT0RFX05PTkUsCisJVjRMMl9GTEFTSF9MRURfTU9ERV9GTEFTSCwKKwlWNEwyX0ZMQVNIX0xFRF9NT0RFX1RPUkNILAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkVfU09VUkNFCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDIpCitlbnVtIHY0bDJfZmxhc2hfc3Ryb2JlX3NvdXJjZSB7CisJVjRMMl9GTEFTSF9TVFJPQkVfU09VUkNFX1NPRlRXQVJFLAorCVY0TDJfRkxBU0hfU1RST0JFX1NPVVJDRV9FWFRFUk5BTCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfU1RST0JFCQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyAzKQorI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkVfU1RPUAkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyA0KQorI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkVfU1RBVFVTCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDUpCisKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfVElNRU9VVAkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgNikKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfSU5URU5TSVRZCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDcpCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX1RPUkNIX0lOVEVOU0lUWQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyA4KQorI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9JTkRJQ0FUT1JfSU5URU5TSVRZCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgOSkKKworI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9GQVVMVAkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgMTApCisjZGVmaW5lIFY0TDJfRkxBU0hfRkFVTFRfT1ZFUl9WT0xUQUdFCQkoMSA8PCAwKQorI2RlZmluZSBWNEwyX0ZMQVNIX0ZBVUxUX1RJTUVPVVQJCSgxIDw8IDEpCisjZGVmaW5lIFY0TDJfRkxBU0hfRkFVTFRfT1ZFUl9URU1QRVJBVFVSRQkoMSA8PCAyKQorI2RlZmluZSBWNEwyX0ZMQVNIX0ZBVUxUX1NIT1JUX0NJUkNVSVQJCSgxIDw8IDMpCisjZGVmaW5lIFY0TDJfRkxBU0hfRkFVTFRfT1ZFUl9DVVJSRU5UCQkoMSA8PCA0KQorI2RlZmluZSBWNEwyX0ZMQVNIX0ZBVUxUX0lORElDQVRPUgkJKDEgPDwgNSkKKyNkZWZpbmUgVjRMMl9GTEFTSF9GQVVMVF9VTkRFUl9WT0xUQUdFCQkoMSA8PCA2KQorI2RlZmluZSBWNEwyX0ZMQVNIX0ZBVUxUX0lOUFVUX1ZPTFRBR0UJCSgxIDw8IDcpCisjZGVmaW5lIFY0TDJfRkxBU0hfRkFVTFRfTEVEX09WRVJfVEVNUEVSQVRVUkUJKDEgPDwgOCkKKworI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9DSEFSR0UJCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDExKQorI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9SRUFEWQkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgMTIpCisKKworLyogSlBFRy1jbGFzcyBjb250cm9sIElEcyAqLworCisjZGVmaW5lIFY0TDJfQ0lEX0pQRUdfQ0xBU1NfQkFTRQkJKFY0TDJfQ1RSTF9DTEFTU19KUEVHIHwgMHg5MDApCisjZGVmaW5lIFY0TDJfQ0lEX0pQRUdfQ0xBU1MJCQkoVjRMMl9DVFJMX0NMQVNTX0pQRUcgfCAxKQorCisjZGVmaW5lCVY0TDJfQ0lEX0pQRUdfQ0hST01BX1NVQlNBTVBMSU5HCShWNEwyX0NJRF9KUEVHX0NMQVNTX0JBU0UgKyAxKQorZW51bSB2NGwyX2pwZWdfY2hyb21hX3N1YnNhbXBsaW5nIHsKKwlWNEwyX0pQRUdfQ0hST01BX1NVQlNBTVBMSU5HXzQ0NAk9IDAsCisJVjRMMl9KUEVHX0NIUk9NQV9TVUJTQU1QTElOR180MjIJPSAxLAorCVY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfNDIwCT0gMiwKKwlWNEwyX0pQRUdfQ0hST01BX1NVQlNBTVBMSU5HXzQxMQk9IDMsCisJVjRMMl9KUEVHX0NIUk9NQV9TVUJTQU1QTElOR180MTAJPSA0LAorCVY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfR1JBWQk9IDUsCit9OworI2RlZmluZQlWNEwyX0NJRF9KUEVHX1JFU1RBUlRfSU5URVJWQUwJCShWNEwyX0NJRF9KUEVHX0NMQVNTX0JBU0UgKyAyKQorI2RlZmluZQlWNEwyX0NJRF9KUEVHX0NPTVBSRVNTSU9OX1FVQUxJVFkJKFY0TDJfQ0lEX0pQRUdfQ0xBU1NfQkFTRSArIDMpCisKKyNkZWZpbmUJVjRMMl9DSURfSlBFR19BQ1RJVkVfTUFSS0VSCQkoVjRMMl9DSURfSlBFR19DTEFTU19CQVNFICsgNCkKKyNkZWZpbmUJVjRMMl9KUEVHX0FDVElWRV9NQVJLRVJfQVBQMAkJKDEgPDwgMCkKKyNkZWZpbmUJVjRMMl9KUEVHX0FDVElWRV9NQVJLRVJfQVBQMQkJKDEgPDwgMSkKKyNkZWZpbmUJVjRMMl9KUEVHX0FDVElWRV9NQVJLRVJfQ09NCQkoMSA8PCAxNikKKyNkZWZpbmUJVjRMMl9KUEVHX0FDVElWRV9NQVJLRVJfRFFUCQkoMSA8PCAxNykKKyNkZWZpbmUJVjRMMl9KUEVHX0FDVElWRV9NQVJLRVJfREhUCQkoMSA8PCAxOCkKKworCisvKiBJbWFnZSBzb3VyY2UgY29udHJvbHMgKi8KKyNkZWZpbmUgVjRMMl9DSURfSU1BR0VfU09VUkNFX0NMQVNTX0JBU0UJKFY0TDJfQ1RSTF9DTEFTU19JTUFHRV9TT1VSQ0UgfCAweDkwMCkKKyNkZWZpbmUgVjRMMl9DSURfSU1BR0VfU09VUkNFX0NMQVNTCQkoVjRMMl9DVFJMX0NMQVNTX0lNQUdFX1NPVVJDRSB8IDEpCisKKyNkZWZpbmUgVjRMMl9DSURfVkJMQU5LCQkJCShWNEwyX0NJRF9JTUFHRV9TT1VSQ0VfQ0xBU1NfQkFTRSArIDEpCisjZGVmaW5lIFY0TDJfQ0lEX0hCTEFOSwkJCQkoVjRMMl9DSURfSU1BR0VfU09VUkNFX0NMQVNTX0JBU0UgKyAyKQorI2RlZmluZSBWNEwyX0NJRF9BTkFMT0dVRV9HQUlOCQkJKFY0TDJfQ0lEX0lNQUdFX1NPVVJDRV9DTEFTU19CQVNFICsgMykKKyNkZWZpbmUgVjRMMl9DSURfVEVTVF9QQVRURVJOX1JFRAkJKFY0TDJfQ0lEX0lNQUdFX1NPVVJDRV9DTEFTU19CQVNFICsgNCkKKyNkZWZpbmUgVjRMMl9DSURfVEVTVF9QQVRURVJOX0dSRUVOUgkJKFY0TDJfQ0lEX0lNQUdFX1NPVVJDRV9DTEFTU19CQVNFICsgNSkKKyNkZWZpbmUgVjRMMl9DSURfVEVTVF9QQVRURVJOX0JMVUUJCShWNEwyX0NJRF9JTUFHRV9TT1VSQ0VfQ0xBU1NfQkFTRSArIDYpCisjZGVmaW5lIFY0TDJfQ0lEX1RFU1RfUEFUVEVSTl9HUkVFTkIJCShWNEwyX0NJRF9JTUFHRV9TT1VSQ0VfQ0xBU1NfQkFTRSArIDcpCisKKworLyogSW1hZ2UgcHJvY2Vzc2luZyBjb250cm9scyAqLworCisjZGVmaW5lIFY0TDJfQ0lEX0lNQUdFX1BST0NfQ0xBU1NfQkFTRQkJKFY0TDJfQ1RSTF9DTEFTU19JTUFHRV9QUk9DIHwgMHg5MDApCisjZGVmaW5lIFY0TDJfQ0lEX0lNQUdFX1BST0NfQ0xBU1MJCShWNEwyX0NUUkxfQ0xBU1NfSU1BR0VfUFJPQyB8IDEpCisKKyNkZWZpbmUgVjRMMl9DSURfTElOS19GUkVRCQkJKFY0TDJfQ0lEX0lNQUdFX1BST0NfQ0xBU1NfQkFTRSArIDEpCisjZGVmaW5lIFY0TDJfQ0lEX1BJWEVMX1JBVEUJCQkoVjRMMl9DSURfSU1BR0VfUFJPQ19DTEFTU19CQVNFICsgMikKKyNkZWZpbmUgVjRMMl9DSURfVEVTVF9QQVRURVJOCQkJKFY0TDJfQ0lEX0lNQUdFX1BST0NfQ0xBU1NfQkFTRSArIDMpCisjZGVmaW5lIFY0TDJfQ0lEX0RFSU5URVJMQUNJTkdfTU9ERQkJKFY0TDJfQ0lEX0lNQUdFX1BST0NfQ0xBU1NfQkFTRSArIDQpCisjZGVmaW5lIFY0TDJfQ0lEX0RJR0lUQUxfR0FJTgkJCShWNEwyX0NJRF9JTUFHRV9QUk9DX0NMQVNTX0JBU0UgKyA1KQorCisvKiAgRFYtY2xhc3MgY29udHJvbCBJRHMgZGVmaW5lZCBieSBWNEwyICovCisjZGVmaW5lIFY0TDJfQ0lEX0RWX0NMQVNTX0JBU0UJCQkoVjRMMl9DVFJMX0NMQVNTX0RWIHwgMHg5MDApCisjZGVmaW5lIFY0TDJfQ0lEX0RWX0NMQVNTCQkJKFY0TDJfQ1RSTF9DTEFTU19EViB8IDEpCisKKyNkZWZpbmUJVjRMMl9DSURfRFZfVFhfSE9UUExVRwkJCShWNEwyX0NJRF9EVl9DTEFTU19CQVNFICsgMSkKKyNkZWZpbmUJVjRMMl9DSURfRFZfVFhfUlhTRU5TRQkJCShWNEwyX0NJRF9EVl9DTEFTU19CQVNFICsgMikKKyNkZWZpbmUJVjRMMl9DSURfRFZfVFhfRURJRF9QUkVTRU5UCQkoVjRMMl9DSURfRFZfQ0xBU1NfQkFTRSArIDMpCisjZGVmaW5lCVY0TDJfQ0lEX0RWX1RYX01PREUJCQkoVjRMMl9DSURfRFZfQ0xBU1NfQkFTRSArIDQpCitlbnVtIHY0bDJfZHZfdHhfbW9kZSB7CisJVjRMMl9EVl9UWF9NT0RFX0RWSV9ECT0gMCwKKwlWNEwyX0RWX1RYX01PREVfSERNSQk9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9EVl9UWF9SR0JfUkFOR0UJCShWNEwyX0NJRF9EVl9DTEFTU19CQVNFICsgNSkKK2VudW0gdjRsMl9kdl9yZ2JfcmFuZ2UgeworCVY0TDJfRFZfUkdCX1JBTkdFX0FVVE8JICA9IDAsCisJVjRMMl9EVl9SR0JfUkFOR0VfTElNSVRFRCA9IDEsCisJVjRMMl9EVl9SR0JfUkFOR0VfRlVMTAkgID0gMiwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfRFZfVFhfSVRfQ09OVEVOVF9UWVBFCQkoVjRMMl9DSURfRFZfQ0xBU1NfQkFTRSArIDYpCitlbnVtIHY0bDJfZHZfaXRfY29udGVudF90eXBlIHsKKwlWNEwyX0RWX0lUX0NPTlRFTlRfVFlQRV9HUkFQSElDUyAgPSAwLAorCVY0TDJfRFZfSVRfQ09OVEVOVF9UWVBFX1BIT1RPCSAgPSAxLAorCVY0TDJfRFZfSVRfQ09OVEVOVF9UWVBFX0NJTkVNQQkgID0gMiwKKwlWNEwyX0RWX0lUX0NPTlRFTlRfVFlQRV9HQU1FCSAgPSAzLAorCVY0TDJfRFZfSVRfQ09OVEVOVF9UWVBFX05PX0lUQwkgID0gNCwKK307CisKKyNkZWZpbmUJVjRMMl9DSURfRFZfUlhfUE9XRVJfUFJFU0VOVAkJKFY0TDJfQ0lEX0RWX0NMQVNTX0JBU0UgKyAxMDApCisjZGVmaW5lIFY0TDJfQ0lEX0RWX1JYX1JHQl9SQU5HRQkJKFY0TDJfQ0lEX0RWX0NMQVNTX0JBU0UgKyAxMDEpCisjZGVmaW5lIFY0TDJfQ0lEX0RWX1JYX0lUX0NPTlRFTlRfVFlQRQkJKFY0TDJfQ0lEX0RWX0NMQVNTX0JBU0UgKyAxMDIpCisKKyNkZWZpbmUgVjRMMl9DSURfRk1fUlhfQ0xBU1NfQkFTRQkJKFY0TDJfQ1RSTF9DTEFTU19GTV9SWCB8IDB4OTAwKQorI2RlZmluZSBWNEwyX0NJRF9GTV9SWF9DTEFTUwkJCShWNEwyX0NUUkxfQ0xBU1NfRk1fUlggfCAxKQorCisjZGVmaW5lIFY0TDJfQ0lEX1RVTkVfREVFTVBIQVNJUwkJKFY0TDJfQ0lEX0ZNX1JYX0NMQVNTX0JBU0UgKyAxKQorZW51bSB2NGwyX2RlZW1waGFzaXMgeworCVY0TDJfREVFTVBIQVNJU19ESVNBQkxFRAk9IFY0TDJfUFJFRU1QSEFTSVNfRElTQUJMRUQsCisJVjRMMl9ERUVNUEhBU0lTXzUwX3VTCQk9IFY0TDJfUFJFRU1QSEFTSVNfNTBfdVMsCisJVjRMMl9ERUVNUEhBU0lTXzc1X3VTCQk9IFY0TDJfUFJFRU1QSEFTSVNfNzVfdVMsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19SRUNFUFRJT04JCQkoVjRMMl9DSURfRk1fUlhfQ0xBU1NfQkFTRSArIDIpCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19SWF9QVFkJCQkoVjRMMl9DSURfRk1fUlhfQ0xBU1NfQkFTRSArIDMpCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19SWF9QU19OQU1FCQkJKFY0TDJfQ0lEX0ZNX1JYX0NMQVNTX0JBU0UgKyA0KQorI2RlZmluZSBWNEwyX0NJRF9SRFNfUlhfUkFESU9fVEVYVAkJKFY0TDJfQ0lEX0ZNX1JYX0NMQVNTX0JBU0UgKyA1KQorI2RlZmluZSBWNEwyX0NJRF9SRFNfUlhfVFJBRkZJQ19BTk5PVU5DRU1FTlQJKFY0TDJfQ0lEX0ZNX1JYX0NMQVNTX0JBU0UgKyA2KQorI2RlZmluZSBWNEwyX0NJRF9SRFNfUlhfVFJBRkZJQ19QUk9HUkFNCQkoVjRMMl9DSURfRk1fUlhfQ0xBU1NfQkFTRSArIDcpCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19SWF9NVVNJQ19TUEVFQ0gJCShWNEwyX0NJRF9GTV9SWF9DTEFTU19CQVNFICsgOCkKKworI2RlZmluZSBWNEwyX0NJRF9SRl9UVU5FUl9DTEFTU19CQVNFCQkoVjRMMl9DVFJMX0NMQVNTX1JGX1RVTkVSIHwgMHg5MDApCisjZGVmaW5lIFY0TDJfQ0lEX1JGX1RVTkVSX0NMQVNTCQkJKFY0TDJfQ1RSTF9DTEFTU19SRl9UVU5FUiB8IDEpCisKKyNkZWZpbmUgVjRMMl9DSURfUkZfVFVORVJfQkFORFdJRFRIX0FVVE8JKFY0TDJfQ0lEX1JGX1RVTkVSX0NMQVNTX0JBU0UgKyAxMSkKKyNkZWZpbmUgVjRMMl9DSURfUkZfVFVORVJfQkFORFdJRFRICQkoVjRMMl9DSURfUkZfVFVORVJfQ0xBU1NfQkFTRSArIDEyKQorI2RlZmluZSBWNEwyX0NJRF9SRl9UVU5FUl9SRl9HQUlOCQkoVjRMMl9DSURfUkZfVFVORVJfQ0xBU1NfQkFTRSArIDMyKQorI2RlZmluZSBWNEwyX0NJRF9SRl9UVU5FUl9MTkFfR0FJTl9BVVRPCQkoVjRMMl9DSURfUkZfVFVORVJfQ0xBU1NfQkFTRSArIDQxKQorI2RlZmluZSBWNEwyX0NJRF9SRl9UVU5FUl9MTkFfR0FJTgkJKFY0TDJfQ0lEX1JGX1RVTkVSX0NMQVNTX0JBU0UgKyA0MikKKyNkZWZpbmUgVjRMMl9DSURfUkZfVFVORVJfTUlYRVJfR0FJTl9BVVRPCShWNEwyX0NJRF9SRl9UVU5FUl9DTEFTU19CQVNFICsgNTEpCisjZGVmaW5lIFY0TDJfQ0lEX1JGX1RVTkVSX01JWEVSX0dBSU4JCShWNEwyX0NJRF9SRl9UVU5FUl9DTEFTU19CQVNFICsgNTIpCisjZGVmaW5lIFY0TDJfQ0lEX1JGX1RVTkVSX0lGX0dBSU5fQVVUTwkJKFY0TDJfQ0lEX1JGX1RVTkVSX0NMQVNTX0JBU0UgKyA2MSkKKyNkZWZpbmUgVjRMMl9DSURfUkZfVFVORVJfSUZfR0FJTgkJKFY0TDJfQ0lEX1JGX1RVTkVSX0NMQVNTX0JBU0UgKyA2MikKKyNkZWZpbmUgVjRMMl9DSURfUkZfVFVORVJfUExMX0xPQ0sJCQkoVjRMMl9DSURfUkZfVFVORVJfQ0xBU1NfQkFTRSArIDkxKQorCisKKy8qICBEZXRlY3Rpb24tY2xhc3MgY29udHJvbCBJRHMgZGVmaW5lZCBieSBWNEwyICovCisjZGVmaW5lIFY0TDJfQ0lEX0RFVEVDVF9DTEFTU19CQVNFCQkoVjRMMl9DVFJMX0NMQVNTX0RFVEVDVCB8IDB4OTAwKQorI2RlZmluZSBWNEwyX0NJRF9ERVRFQ1RfQ0xBU1MJCQkoVjRMMl9DVFJMX0NMQVNTX0RFVEVDVCB8IDEpCisKKyNkZWZpbmUgVjRMMl9DSURfREVURUNUX01EX01PREUJCQkoVjRMMl9DSURfREVURUNUX0NMQVNTX0JBU0UgKyAxKQorZW51bSB2NGwyX2RldGVjdF9tZF9tb2RlIHsKKwlWNEwyX0RFVEVDVF9NRF9NT0RFX0RJU0FCTEVECQk9IDAsCisJVjRMMl9ERVRFQ1RfTURfTU9ERV9HTE9CQUwJCT0gMSwKKwlWNEwyX0RFVEVDVF9NRF9NT0RFX1RIUkVTSE9MRF9HUklECT0gMiwKKwlWNEwyX0RFVEVDVF9NRF9NT0RFX1JFR0lPTl9HUklECQk9IDMsCit9OworI2RlZmluZSBWNEwyX0NJRF9ERVRFQ1RfTURfR0xPQkFMX1RIUkVTSE9MRAkoVjRMMl9DSURfREVURUNUX0NMQVNTX0JBU0UgKyAyKQorI2RlZmluZSBWNEwyX0NJRF9ERVRFQ1RfTURfVEhSRVNIT0xEX0dSSUQJKFY0TDJfQ0lEX0RFVEVDVF9DTEFTU19CQVNFICsgMykKKyNkZWZpbmUgVjRMMl9DSURfREVURUNUX01EX1JFR0lPTl9HUklECQkoVjRMMl9DSURfREVURUNUX0NMQVNTX0JBU0UgKyA0KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5cy92NGwyL2V4dC92aWRlb2RldjIuaCBiL3N5cy92NGwyL2V4dC92aWRlb2RldjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWUxZjNkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZXh0L3ZpZGVvZGV2Mi5oCkBAIC0wLDAgKzEsMjM5OCBAQAorLyoKKyAqICBWaWRlbyBmb3IgTGludXggVHdvIGhlYWRlciBmaWxlCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OS0yMDEyIHRoZSBjb250cmlidXRvcnMKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHJlZGlzdHJpYnV0ZSB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogIEJTRCBsaWNlbnNlIGFzIHN0YXRlZCBiZWxvdzoKKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogICAgIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiAgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECisgKiAgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCUhlYWRlciBmaWxlIGZvciB2NGwgb3IgVjRMMiBkcml2ZXJzIGFuZCBhcHBsaWNhdGlvbnMKKyAqIHdpdGggcHVibGljIEFQSS4KKyAqIEFsbCBrZXJuZWwtc3BlY2lmaWMgc3R1ZmYgd2VyZSBtb3ZlZCB0byBtZWRpYS92NGwyLWRldi5oLCBzbworICogbm8gI2lmIF9fS0VSTkVMIHRlc3RzIGFyZSBhbGxvd2VkIGhlcmUKKyAqCisgKglTZWUgaHR0cHM6Ly9saW51eHR2Lm9yZyBmb3IgbW9yZSBpbmZvCisgKgorICoJQXV0aG9yOiBCaWxsIERpcmtzIDxiaWxsQHRoZWRpcmtzLm9yZz4KKyAqCQlKdXN0aW4gU2Nob2VtYW4KKyAqICAgICAgICAgICAgICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKyAqCQlldCBhbC4KKyAqLworI2lmbmRlZiBfVUFQSV9fTElOVVhfVklERU9ERVYyX0gKKyNkZWZpbmUgX1VBUElfX0xJTlVYX1ZJREVPREVWMl9ICisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaW5jbHVkZSAiZXh0L3R5cGVzLWNvbXBhdC5oIgorI2luY2x1ZGUgImV4dC92NGwyLWNvbW1vbi5oIgorI2luY2x1ZGUgImV4dC92NGwyLWNvbnRyb2xzLmgiCisKKy8qCisgKiBDb21tb24gc3R1ZmYgZm9yIGJvdGggVjRMMSBhbmQgVjRMMgorICogTW92ZWQgZnJvbSB2aWRlb2Rldi5oCisgKi8KKyNkZWZpbmUgVklERU9fTUFYX0ZSQU1FICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgVklERU9fTUFYX1BMQU5FUyAgICAgICAgICAgICAgIDgKKworLyoKKyAqCU0gSSBTIEMgRSBMIEwgQSBOIEUgTyBVIFMKKyAqLworCisvKiAgRm91ci1jaGFyYWN0ZXItY29kZSAoRk9VUkNDKSAqLworI2RlZmluZSB2NGwyX2ZvdXJjYyhhLCBiLCBjLCBkKVwKKwkoKF9fdTMyKShhKSB8ICgoX191MzIpKGIpIDw8IDgpIHwgKChfX3UzMikoYykgPDwgMTYpIHwgKChfX3UzMikoZCkgPDwgMjQpKQorI2RlZmluZSB2NGwyX2ZvdXJjY19iZShhLCBiLCBjLCBkKQkodjRsMl9mb3VyY2MoYSwgYiwgYywgZCkgfCAoMSA8PCAzMSkpCisKKy8qCisgKglFIE4gVSBNIFMKKyAqLworZW51bSB2NGwyX2ZpZWxkIHsKKwlWNEwyX0ZJRUxEX0FOWSAgICAgICAgICAgPSAwLCAvKiBkcml2ZXIgY2FuIGNob29zZSBmcm9tIG5vbmUsCisJCQkJCSB0b3AsIGJvdHRvbSwgaW50ZXJsYWNlZAorCQkJCQkgZGVwZW5kaW5nIG9uIHdoYXRldmVyIGl0IHRoaW5rcworCQkJCQkgaXMgYXBwcm94aW1hdGUgLi4uICovCisJVjRMMl9GSUVMRF9OT05FICAgICAgICAgID0gMSwgLyogdGhpcyBkZXZpY2UgaGFzIG5vIGZpZWxkcyAuLi4gKi8KKwlWNEwyX0ZJRUxEX1RPUCAgICAgICAgICAgPSAyLCAvKiB0b3AgZmllbGQgb25seSAqLworCVY0TDJfRklFTERfQk9UVE9NICAgICAgICA9IDMsIC8qIGJvdHRvbSBmaWVsZCBvbmx5ICovCisJVjRMMl9GSUVMRF9JTlRFUkxBQ0VEICAgID0gNCwgLyogYm90aCBmaWVsZHMgaW50ZXJsYWNlZCAqLworCVY0TDJfRklFTERfU0VRX1RCICAgICAgICA9IDUsIC8qIGJvdGggZmllbGRzIHNlcXVlbnRpYWwgaW50byBvbmUKKwkJCQkJIGJ1ZmZlciwgdG9wLWJvdHRvbSBvcmRlciAqLworCVY0TDJfRklFTERfU0VRX0JUICAgICAgICA9IDYsIC8qIHNhbWUgYXMgYWJvdmUgKyBib3R0b20tdG9wIG9yZGVyICovCisJVjRMMl9GSUVMRF9BTFRFUk5BVEUgICAgID0gNywgLyogYm90aCBmaWVsZHMgYWx0ZXJuYXRpbmcgaW50bworCQkJCQkgc2VwYXJhdGUgYnVmZmVycyAqLworCVY0TDJfRklFTERfSU5URVJMQUNFRF9UQiA9IDgsIC8qIGJvdGggZmllbGRzIGludGVybGFjZWQsIHRvcCBmaWVsZAorCQkJCQkgZmlyc3QgYW5kIHRoZSB0b3AgZmllbGQgaXMKKwkJCQkJIHRyYW5zbWl0dGVkIGZpcnN0ICovCisJVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUID0gOSwgLyogYm90aCBmaWVsZHMgaW50ZXJsYWNlZCwgdG9wIGZpZWxkCisJCQkJCSBmaXJzdCBhbmQgdGhlIGJvdHRvbSBmaWVsZCBpcworCQkJCQkgdHJhbnNtaXR0ZWQgZmlyc3QgKi8KK307CisjZGVmaW5lIFY0TDJfRklFTERfSEFTX1RPUChmaWVsZCkJXAorCSgoZmllbGQpID09IFY0TDJfRklFTERfVE9QIAl8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX1RCIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9CVCB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9UQgl8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9CVCkKKyNkZWZpbmUgVjRMMl9GSUVMRF9IQVNfQk9UVE9NKGZpZWxkKQlcCisJKChmaWVsZCkgPT0gVjRMMl9GSUVMRF9CT1RUT00gCXx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRCB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfVEIgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfU0VRX1RCCXx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfU0VRX0JUKQorI2RlZmluZSBWNEwyX0ZJRUxEX0hBU19CT1RIKGZpZWxkKQlcCisJKChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9UQiB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfVEIgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfQlQpCisjZGVmaW5lIFY0TDJfRklFTERfSEFTX1RfT1JfQihmaWVsZCkJXAorCSgoZmllbGQpID09IFY0TDJfRklFTERfQk9UVE9NIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfVE9QIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfQUxURVJOQVRFKQorCitlbnVtIHY0bDJfYnVmX3R5cGUgeworCVY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSAgICAgICAgPSAxLAorCVY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUICAgICAgICAgPSAyLAorCVY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWSAgICAgICAgPSAzLAorCVY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUgICAgICAgICAgPSA0LAorCVY0TDJfQlVGX1RZUEVfVkJJX09VVFBVVCAgICAgICAgICAgPSA1LAorCVY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFICAgPSA2LAorCVY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVQgICAgPSA3LAorCVY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX09WRVJMQVkgPSA4LAorCVY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUgPSA5LAorCVY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSAgPSAxMCwKKwlWNEwyX0JVRl9UWVBFX1NEUl9DQVBUVVJFICAgICAgICAgID0gMTEsCisJVjRMMl9CVUZfVFlQRV9TRFJfT1VUUFVUICAgICAgICAgICA9IDEyLAorCVY0TDJfQlVGX1RZUEVfTUVUQV9DQVBUVVJFICAgICAgICAgPSAxMywKKwkvKiBEZXByZWNhdGVkLCBkbyBub3QgdXNlICovCisJVjRMMl9CVUZfVFlQRV9QUklWQVRFICAgICAgICAgICAgICA9IDB4ODAsCit9OworCisjZGVmaW5lIFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUih0eXBlKQkJCVwKKwkoKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUJXAorCSB8fCAodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKQorCisjZGVmaW5lIFY0TDJfVFlQRV9JU19PVVRQVVQodHlwZSkJCQkJXAorCSgodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQJCQlcCisJIHx8ICh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUJCVwKKwkgfHwgKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWQkJXAorCSB8fCAodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfT1ZFUkxBWQlcCisJIHx8ICh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1ZCSV9PVVRQVVQJCQlcCisJIHx8ICh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVUCQlcCisJIHx8ICh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1NEUl9PVVRQVVQpCisKK2VudW0gdjRsMl90dW5lcl90eXBlIHsKKwlWNEwyX1RVTkVSX1JBRElPCSAgICAgPSAxLAorCVY0TDJfVFVORVJfQU5BTE9HX1RWCSAgICAgPSAyLAorCVY0TDJfVFVORVJfRElHSVRBTF9UVgkgICAgID0gMywKKwlWNEwyX1RVTkVSX1NEUiAgICAgICAgICAgICAgID0gNCwKKwlWNEwyX1RVTkVSX1JGICAgICAgICAgICAgICAgID0gNSwKK307CisKKy8qIERlcHJlY2F0ZWQsIGRvIG5vdCB1c2UgKi8KKyNkZWZpbmUgVjRMMl9UVU5FUl9BREMgIFY0TDJfVFVORVJfU0RSCisKK2VudW0gdjRsMl9tZW1vcnkgeworCVY0TDJfTUVNT1JZX01NQVAgICAgICAgICAgICAgPSAxLAorCVY0TDJfTUVNT1JZX1VTRVJQVFIgICAgICAgICAgPSAyLAorCVY0TDJfTUVNT1JZX09WRVJMQVkgICAgICAgICAgPSAzLAorCVY0TDJfTUVNT1JZX0RNQUJVRiAgICAgICAgICAgPSA0LAorfTsKKworLyogc2VlIGFsc28gaHR0cDovL3Zla3Rvci50aGVvcmVtLmNhL2dyYXBoaWNzL3ljYmNyLyAqLworZW51bSB2NGwyX2NvbG9yc3BhY2UgeworCS8qCisJICogRGVmYXVsdCBjb2xvcnNwYWNlLCBpLmUuIGxldCB0aGUgZHJpdmVyIGZpZ3VyZSBpdCBvdXQuCisJICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHZpZGVvIGNhcHR1cmUuCisJICovCisJVjRMMl9DT0xPUlNQQUNFX0RFRkFVTFQgICAgICAgPSAwLAorCisJLyogU01QVEUgMTcwTTogdXNlZCBmb3IgYnJvYWRjYXN0IE5UU0MvUEFMIFNEVFYgKi8KKwlWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNICAgICA9IDEsCisKKwkvKiBPYnNvbGV0ZSBwcmUtMTk5OCBTTVBURSAyNDBNIEhEVFYgc3RhbmRhcmQsIHN1cGVyc2VkZWQgYnkgUmVjIDcwOSAqLworCVY0TDJfQ09MT1JTUEFDRV9TTVBURTI0ME0gICAgID0gMiwKKworCS8qIFJlYy43MDk6IHVzZWQgZm9yIEhEVFYgKi8KKwlWNEwyX0NPTE9SU1BBQ0VfUkVDNzA5ICAgICAgICA9IDMsCisKKwkvKgorCSAqIERlcHJlY2F0ZWQsIGRvIG5vdCB1c2UuIE5vIGRyaXZlciB3aWxsIGV2ZXIgcmV0dXJuIHRoaXMuIFRoaXMgd2FzCisJICogYmFzZWQgb24gYSBtaXN1bmRlcnN0YW5kaW5nIG9mIHRoZSBidDg3OCBkYXRhc2hlZXQuCisJICovCisJVjRMMl9DT0xPUlNQQUNFX0JUODc4ICAgICAgICAgPSA0LAorCisJLyoKKwkgKiBOVFNDIDE5NTMgY29sb3JzcGFjZS4gVGhpcyBvbmx5IG1ha2VzIHNlbnNlIHdoZW4gZGVhbGluZyB3aXRoCisJICogcmVhbGx5LCByZWFsbHkgb2xkIE5UU0MgcmVjb3JkaW5ncy4gU3VwZXJzZWRlZCBieSBTTVBURSAxNzBNLgorCSAqLworCVY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX00gID0gNSwKKworCS8qCisJICogRUJVIFRlY2ggMzIxMyBQQUwvU0VDQU0gY29sb3JzcGFjZS4gVGhpcyBvbmx5IG1ha2VzIHNlbnNlIHdoZW4KKwkgKiBkZWFsaW5nIHdpdGggcmVhbGx5IG9sZCBQQUwvU0VDQU0gcmVjb3JkaW5ncy4gU3VwZXJzZWRlZCBieQorCSAqIFNNUFRFIDE3ME0uCisJICovCisJVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkcgPSA2LAorCisJLyoKKwkgKiBFZmZlY3RpdmVseSBzaG9ydGhhbmQgZm9yIFY0TDJfQ09MT1JTUEFDRV9TUkdCLCBWNEwyX1lDQkNSX0VOQ182MDEKKwkgKiBhbmQgVjRMMl9RVUFOVElaQVRJT05fRlVMTF9SQU5HRS4gVG8gYmUgdXNlZCBmb3IgKE1vdGlvbi0pSlBFRy4KKwkgKi8KKwlWNEwyX0NPTE9SU1BBQ0VfSlBFRyAgICAgICAgICA9IDcsCisKKwkvKiBGb3IgUkdCIGNvbG9yc3BhY2VzIHN1Y2ggYXMgcHJvZHVjZXMgYnkgbW9zdCB3ZWJjYW1zLiAqLworCVY0TDJfQ09MT1JTUEFDRV9TUkdCICAgICAgICAgID0gOCwKKworCS8qIEFkb2JlUkdCIGNvbG9yc3BhY2UgKi8KKwlWNEwyX0NPTE9SU1BBQ0VfQURPQkVSR0IgICAgICA9IDksCisKKwkvKiBCVC4yMDIwIGNvbG9yc3BhY2UsIHVzZWQgZm9yIFVIRFRWLiAqLworCVY0TDJfQ09MT1JTUEFDRV9CVDIwMjAgICAgICAgID0gMTAsCisKKwkvKiBSYXcgY29sb3JzcGFjZTogZm9yIFJBVyB1bnByb2Nlc3NlZCBpbWFnZXMgKi8KKwlWNEwyX0NPTE9SU1BBQ0VfUkFXICAgICAgICAgICA9IDExLAorCisJLyogRENJLVAzIGNvbG9yc3BhY2UsIHVzZWQgYnkgY2luZW1hIHByb2plY3RvcnMgKi8KKwlWNEwyX0NPTE9SU1BBQ0VfRENJX1AzICAgICAgICA9IDEyLAorfTsKKworLyoKKyAqIERldGVybWluZSBob3cgQ09MT1JTUEFDRV9ERUZBVUxUIHNob3VsZCBtYXAgdG8gYSBwcm9wZXIgY29sb3JzcGFjZS4KKyAqIFRoaXMgZGVwZW5kcyBvbiB3aGV0aGVyIHRoaXMgaXMgYSBTRFRWIGltYWdlICh1c2UgU01QVEUgMTcwTSksIGFuCisgKiBIRFRWIGltYWdlICh1c2UgUmVjLiA3MDkpLCBvciBzb21ldGhpbmcgZWxzZSAodXNlIHNSR0IpLgorICovCisjZGVmaW5lIFY0TDJfTUFQX0NPTE9SU1BBQ0VfREVGQVVMVChpc19zZHR2LCBpc19oZHR2KSBcCisJKChpc19zZHR2KSA/IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME0gOiBcCisJICgoaXNfaGR0dikgPyBWNEwyX0NPTE9SU1BBQ0VfUkVDNzA5IDogVjRMMl9DT0xPUlNQQUNFX1NSR0IpKQorCitlbnVtIHY0bDJfeGZlcl9mdW5jIHsKKwkvKgorCSAqIE1hcHBpbmcgb2YgVjRMMl9YRkVSX0ZVTkNfREVGQVVMVCB0byBhY3R1YWwgdHJhbnNmZXIgZnVuY3Rpb25zCisJICogZm9yIHRoZSB2YXJpb3VzIGNvbG9yc3BhY2VzOgorCSAqCisJICogVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTSwgVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fTSwKKwkgKiBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRywgVjRMMl9DT0xPUlNQQUNFX1JFQzcwOSBhbmQKKwkgKiBWNEwyX0NPTE9SU1BBQ0VfQlQyMDIwOiBWNEwyX1hGRVJfRlVOQ183MDkKKwkgKgorCSAqIFY0TDJfQ09MT1JTUEFDRV9TUkdCLCBWNEwyX0NPTE9SU1BBQ0VfSlBFRzogVjRMMl9YRkVSX0ZVTkNfU1JHQgorCSAqCisJICogVjRMMl9DT0xPUlNQQUNFX0FET0JFUkdCOiBWNEwyX1hGRVJfRlVOQ19BRE9CRVJHQgorCSAqCisJICogVjRMMl9DT0xPUlNQQUNFX1NNUFRFMjQwTTogVjRMMl9YRkVSX0ZVTkNfU01QVEUyNDBNCisJICoKKwkgKiBWNEwyX0NPTE9SU1BBQ0VfUkFXOiBWNEwyX1hGRVJfRlVOQ19OT05FCisJICoKKwkgKiBWNEwyX0NPTE9SU1BBQ0VfRENJX1AzOiBWNEwyX1hGRVJfRlVOQ19EQ0lfUDMKKwkgKi8KKwlWNEwyX1hGRVJfRlVOQ19ERUZBVUxUICAgICA9IDAsCisJVjRMMl9YRkVSX0ZVTkNfNzA5ICAgICAgICAgPSAxLAorCVY0TDJfWEZFUl9GVU5DX1NSR0IgICAgICAgID0gMiwKKwlWNEwyX1hGRVJfRlVOQ19BRE9CRVJHQiAgICA9IDMsCisJVjRMMl9YRkVSX0ZVTkNfU01QVEUyNDBNICAgPSA0LAorCVY0TDJfWEZFUl9GVU5DX05PTkUgICAgICAgID0gNSwKKwlWNEwyX1hGRVJfRlVOQ19EQ0lfUDMgICAgICA9IDYsCisJVjRMMl9YRkVSX0ZVTkNfU01QVEUyMDg0ICAgPSA3LAorfTsKKworLyoKKyAqIERldGVybWluZSBob3cgWEZFUl9GVU5DX0RFRkFVTFQgc2hvdWxkIG1hcCB0byBhIHByb3BlciB0cmFuc2ZlciBmdW5jdGlvbi4KKyAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgY29sb3JzcGFjZS4KKyAqLworI2RlZmluZSBWNEwyX01BUF9YRkVSX0ZVTkNfREVGQVVMVChjb2xzcCkgXAorCSgoY29sc3ApID09IFY0TDJfQ09MT1JTUEFDRV9BRE9CRVJHQiA/IFY0TDJfWEZFUl9GVU5DX0FET0JFUkdCIDogXAorCSAoKGNvbHNwKSA9PSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUyNDBNID8gVjRMMl9YRkVSX0ZVTkNfU01QVEUyNDBNIDogXAorCSAgKChjb2xzcCkgPT0gVjRMMl9DT0xPUlNQQUNFX0RDSV9QMyA/IFY0TDJfWEZFUl9GVU5DX0RDSV9QMyA6IFwKKwkgICAoKGNvbHNwKSA9PSBWNEwyX0NPTE9SU1BBQ0VfUkFXID8gVjRMMl9YRkVSX0ZVTkNfTk9ORSA6IFwKKwkgICAgKChjb2xzcCkgPT0gVjRMMl9DT0xPUlNQQUNFX1NSR0IgfHwgKGNvbHNwKSA9PSBWNEwyX0NPTE9SU1BBQ0VfSlBFRyA/IFwKKwkgICAgIFY0TDJfWEZFUl9GVU5DX1NSR0IgOiBWNEwyX1hGRVJfRlVOQ183MDkpKSkpKQorCitlbnVtIHY0bDJfeWNiY3JfZW5jb2RpbmcgeworCS8qCisJICogTWFwcGluZyBvZiBWNEwyX1lDQkNSX0VOQ19ERUZBVUxUIHRvIGFjdHVhbCBlbmNvZGluZ3MgZm9yIHRoZQorCSAqIHZhcmlvdXMgY29sb3JzcGFjZXM6CisJICoKKwkgKiBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNLCBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9NLAorCSAqIFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX0JHLCBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKwkgKiBWNEwyX0NPTE9SU1BBQ0VfQURPQkVSR0IgYW5kIFY0TDJfQ09MT1JTUEFDRV9KUEVHOiBWNEwyX1lDQkNSX0VOQ182MDEKKwkgKgorCSAqIFY0TDJfQ09MT1JTUEFDRV9SRUM3MDkgYW5kIFY0TDJfQ09MT1JTUEFDRV9EQ0lfUDM6IFY0TDJfWUNCQ1JfRU5DXzcwOQorCSAqCisJICogVjRMMl9DT0xPUlNQQUNFX0JUMjAyMDogVjRMMl9ZQ0JDUl9FTkNfQlQyMDIwCisJICoKKwkgKiBWNEwyX0NPTE9SU1BBQ0VfU01QVEUyNDBNOiBWNEwyX1lDQkNSX0VOQ19TTVBURTI0ME0KKwkgKi8KKwlWNEwyX1lDQkNSX0VOQ19ERUZBVUxUICAgICAgICA9IDAsCisKKwkvKiBJVFUtUiA2MDEgLS0gU0RUViAqLworCVY0TDJfWUNCQ1JfRU5DXzYwMSAgICAgICAgICAgID0gMSwKKworCS8qIFJlYy4gNzA5IC0tIEhEVFYgKi8KKwlWNEwyX1lDQkNSX0VOQ183MDkgICAgICAgICAgICA9IDIsCisKKwkvKiBJVFUtUiA2MDEvRU4gNjE5NjYtMi00IEV4dGVuZGVkIEdhbXV0IC0tIFNEVFYgKi8KKwlWNEwyX1lDQkNSX0VOQ19YVjYwMSAgICAgICAgICA9IDMsCisKKwkvKiBSZWMuIDcwOS9FTiA2MTk2Ni0yLTQgRXh0ZW5kZWQgR2FtdXQgLS0gSERUViAqLworCVY0TDJfWUNCQ1JfRU5DX1hWNzA5ICAgICAgICAgID0gNCwKKworI2lmbmRlZiBfX0tFUk5FTF9fCisJLyoKKwkgKiBzWUNDIChZJ0NiQ3IgZW5jb2Rpbmcgb2Ygc1JHQiksIGlkZW50aWNhbCB0byBFTkNfNjAxLiBJdCB3YXMgYWRkZWQKKwkgKiBvcmlnaW5hbGx5IGR1ZSB0byBhIG1pc3VuZGVyc3RhbmRpbmcgb2YgdGhlIHNZQ0Mgc3RhbmRhcmQuIEl0IHNob3VsZAorCSAqIG5vdCBiZSB1c2VkLCBpbnN0ZWFkIHVzZSBWNEwyX1lDQkNSX0VOQ182MDEuCisJICovCisJVjRMMl9ZQ0JDUl9FTkNfU1lDQyAgICAgICAgICAgPSA1LAorI2VuZGlmCisKKwkvKiBCVC4yMDIwIE5vbi1jb25zdGFudCBMdW1pbmFuY2UgWSdDYkNyICovCisJVjRMMl9ZQ0JDUl9FTkNfQlQyMDIwICAgICAgICAgPSA2LAorCisJLyogQlQuMjAyMCBDb25zdGFudCBMdW1pbmFuY2UgWSdDYmNDcmMgKi8KKwlWNEwyX1lDQkNSX0VOQ19CVDIwMjBfQ09OU1RfTFVNID0gNywKKworCS8qIFNNUFRFIDI0ME0gLS0gT2Jzb2xldGUgSERUViAqLworCVY0TDJfWUNCQ1JfRU5DX1NNUFRFMjQwTSAgICAgID0gOCwKK307CisKKy8qCisgKiBlbnVtIHY0bDJfaHN2X2VuY29kaW5nIHZhbHVlcyBzaG91bGQgbm90IGNvbGxpZGUgd2l0aCB0aGUgb25lcyBmcm9tCisgKiBlbnVtIHY0bDJfeWNiY3JfZW5jb2RpbmcuCisgKi8KK2VudW0gdjRsMl9oc3ZfZW5jb2RpbmcgeworCisJLyogSHVlIG1hcHBlZCB0byAwIC0gMTc5ICovCisJVjRMMl9IU1ZfRU5DXzE4MAkJPSAxMjgsCisKKwkvKiBIdWUgbWFwcGVkIHRvIDAtMjU1ICovCisJVjRMMl9IU1ZfRU5DXzI1NgkJPSAxMjksCit9OworCisvKgorICogRGV0ZXJtaW5lIGhvdyBZQ0JDUl9FTkNfREVGQVVMVCBzaG91bGQgbWFwIHRvIGEgcHJvcGVyIFknQ2JDciBlbmNvZGluZy4KKyAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgY29sb3JzcGFjZS4KKyAqLworI2RlZmluZSBWNEwyX01BUF9ZQ0JDUl9FTkNfREVGQVVMVChjb2xzcCkgXAorCSgoKGNvbHNwKSA9PSBWNEwyX0NPTE9SU1BBQ0VfUkVDNzA5IHx8IFwKKwkgIChjb2xzcCkgPT0gVjRMMl9DT0xPUlNQQUNFX0RDSV9QMykgPyBWNEwyX1lDQkNSX0VOQ183MDkgOiBcCisJICgoY29sc3ApID09IFY0TDJfQ09MT1JTUEFDRV9CVDIwMjAgPyBWNEwyX1lDQkNSX0VOQ19CVDIwMjAgOiBcCisJICAoKGNvbHNwKSA9PSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUyNDBNID8gVjRMMl9ZQ0JDUl9FTkNfU01QVEUyNDBNIDogXAorCSAgIFY0TDJfWUNCQ1JfRU5DXzYwMSkpKQorCitlbnVtIHY0bDJfcXVhbnRpemF0aW9uIHsKKwkvKgorCSAqIFRoZSBkZWZhdWx0IGZvciBSJ0cnQicgcXVhbnRpemF0aW9uIGlzIGFsd2F5cyBmdWxsIHJhbmdlLCBleGNlcHQKKwkgKiBmb3IgdGhlIEJUMjAyMCBjb2xvcnNwYWNlLiBGb3IgWSdDYkNyIHRoZSBxdWFudGl6YXRpb24gaXMgYWx3YXlzCisJICogbGltaXRlZCByYW5nZSwgZXhjZXB0IGZvciBDT0xPUlNQQUNFX0pQRUc6IHRoaXMgaXMgZnVsbCByYW5nZS4KKwkgKi8KKwlWNEwyX1FVQU5USVpBVElPTl9ERUZBVUxUICAgICA9IDAsCisJVjRMMl9RVUFOVElaQVRJT05fRlVMTF9SQU5HRSAgPSAxLAorCVY0TDJfUVVBTlRJWkFUSU9OX0xJTV9SQU5HRSAgID0gMiwKK307CisKKy8qCisgKiBEZXRlcm1pbmUgaG93IFFVQU5USVpBVElPTl9ERUZBVUxUIHNob3VsZCBtYXAgdG8gYSBwcm9wZXIgcXVhbnRpemF0aW9uLgorICogVGhpcyBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIGltYWdlIGlzIFJHQiBvciBub3QsIHRoZSBjb2xvcnNwYWNlIGFuZCB0aGUKKyAqIFknQ2JDciBlbmNvZGluZy4KKyAqLworI2RlZmluZSBWNEwyX01BUF9RVUFOVElaQVRJT05fREVGQVVMVChpc19yZ2Jfb3JfaHN2LCBjb2xzcCwgeWNiY3JfZW5jKSBcCisJKCgoaXNfcmdiX29yX2hzdikgJiYgKGNvbHNwKSA9PSBWNEwyX0NPTE9SU1BBQ0VfQlQyMDIwKSA/IFwKKwkgVjRMMl9RVUFOVElaQVRJT05fTElNX1JBTkdFIDogXAorCSAoKChpc19yZ2Jfb3JfaHN2KSB8fCAoY29sc3ApID09IFY0TDJfQ09MT1JTUEFDRV9KUEVHKSA/IFwKKwkgVjRMMl9RVUFOVElaQVRJT05fRlVMTF9SQU5HRSA6IFY0TDJfUVVBTlRJWkFUSU9OX0xJTV9SQU5HRSkpCisKK2VudW0gdjRsMl9wcmlvcml0eSB7CisJVjRMMl9QUklPUklUWV9VTlNFVCAgICAgICA9IDAsICAvKiBub3QgaW5pdGlhbGl6ZWQgKi8KKwlWNEwyX1BSSU9SSVRZX0JBQ0tHUk9VTkQgID0gMSwKKwlWNEwyX1BSSU9SSVRZX0lOVEVSQUNUSVZFID0gMiwKKwlWNEwyX1BSSU9SSVRZX1JFQ09SRCAgICAgID0gMywKKwlWNEwyX1BSSU9SSVRZX0RFRkFVTFQgICAgID0gVjRMMl9QUklPUklUWV9JTlRFUkFDVElWRSwKK307CisKK3N0cnVjdCB2NGwyX3JlY3QgeworCV9fczMyICAgbGVmdDsKKwlfX3MzMiAgIHRvcDsKKwlfX3UzMiAgIHdpZHRoOworCV9fdTMyICAgaGVpZ2h0OworfTsKKworc3RydWN0IHY0bDJfZnJhY3QgeworCV9fdTMyICAgbnVtZXJhdG9yOworCV9fdTMyICAgZGVub21pbmF0b3I7Cit9OworCisvKioKKyAgKiBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IC0gRGVzY3JpYmVzIFY0TDIgZGV2aWNlIGNhcHMgcmV0dXJuZWQgYnkgVklESU9DX1FVRVJZQ0FQCisgICoKKyAgKiBAZHJpdmVyOgkgICBuYW1lIG9mIHRoZSBkcml2ZXIgbW9kdWxlIChlLmcuICJidHR2IikKKyAgKiBAY2FyZDoJICAgbmFtZSBvZiB0aGUgY2FyZCAoZS5nLiAiSGF1cHBhdWdlIFdpblRWIikKKyAgKiBAYnVzX2luZm86CSAgIG5hbWUgb2YgdGhlIGJ1cyAoZS5nLiAiUENJOiIgKyBwY2lfbmFtZShwY2lfZGV2KSApCisgICogQHZlcnNpb246CSAgIEtFUk5FTF9WRVJTSU9OCisgICogQGNhcGFiaWxpdGllczogY2FwYWJpbGl0aWVzIG9mIHRoZSBwaHlzaWNhbCBkZXZpY2UgYXMgYSB3aG9sZQorICAqIEBkZXZpY2VfY2FwczogIGNhcGFiaWxpdGllcyBhY2Nlc3NlZCB2aWEgdGhpcyBwYXJ0aWN1bGFyIGRldmljZSAobm9kZSkKKyAgKiBAcmVzZXJ2ZWQ6CSAgIHJlc2VydmVkIGZpZWxkcyBmb3IgZnV0dXJlIGV4dGVuc2lvbnMKKyAgKi8KK3N0cnVjdCB2NGwyX2NhcGFiaWxpdHkgeworCV9fdTgJZHJpdmVyWzE2XTsKKwlfX3U4CWNhcmRbMzJdOworCV9fdTgJYnVzX2luZm9bMzJdOworCV9fdTMyICAgdmVyc2lvbjsKKwlfX3UzMgljYXBhYmlsaXRpZXM7CisJX191MzIJZGV2aWNlX2NhcHM7CisJX191MzIJcmVzZXJ2ZWRbM107Cit9OworCisvKiBWYWx1ZXMgZm9yICdjYXBhYmlsaXRpZXMnIGZpZWxkICovCisjZGVmaW5lIFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUJCTB4MDAwMDAwMDEgIC8qIElzIGEgdmlkZW8gY2FwdHVyZSBkZXZpY2UgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVklERU9fT1VUUFVUCQkweDAwMDAwMDAyICAvKiBJcyBhIHZpZGVvIG91dHB1dCBkZXZpY2UgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVklERU9fT1ZFUkxBWQkJMHgwMDAwMDAwNCAgLyogQ2FuIGRvIHZpZGVvIG92ZXJsYXkgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVkJJX0NBUFRVUkUJCTB4MDAwMDAwMTAgIC8qIElzIGEgcmF3IFZCSSBjYXB0dXJlIGRldmljZSAqLworI2RlZmluZSBWNEwyX0NBUF9WQklfT1VUUFVUCQkweDAwMDAwMDIwICAvKiBJcyBhIHJhdyBWQkkgb3V0cHV0IGRldmljZSAqLworI2RlZmluZSBWNEwyX0NBUF9TTElDRURfVkJJX0NBUFRVUkUJMHgwMDAwMDA0MCAgLyogSXMgYSBzbGljZWQgVkJJIGNhcHR1cmUgZGV2aWNlICovCisjZGVmaW5lIFY0TDJfQ0FQX1NMSUNFRF9WQklfT1VUUFVUCTB4MDAwMDAwODAgIC8qIElzIGEgc2xpY2VkIFZCSSBvdXRwdXQgZGV2aWNlICovCisjZGVmaW5lIFY0TDJfQ0FQX1JEU19DQVBUVVJFCQkweDAwMDAwMTAwICAvKiBSRFMgZGF0YSBjYXB0dXJlICovCisjZGVmaW5lIFY0TDJfQ0FQX1ZJREVPX09VVFBVVF9PVkVSTEFZCTB4MDAwMDAyMDAgIC8qIENhbiBkbyB2aWRlbyBvdXRwdXQgb3ZlcmxheSAqLworI2RlZmluZSBWNEwyX0NBUF9IV19GUkVRX1NFRUsJCTB4MDAwMDA0MDAgIC8qIENhbiBkbyBoYXJkd2FyZSBmcmVxdWVuY3kgc2VlayAgKi8KKyNkZWZpbmUgVjRMMl9DQVBfUkRTX09VVFBVVAkJMHgwMDAwMDgwMCAgLyogSXMgYW4gUkRTIGVuY29kZXIgKi8KKworLyogSXMgYSB2aWRlbyBjYXB0dXJlIGRldmljZSB0aGF0IHN1cHBvcnRzIG11bHRpcGxhbmFyIGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVklERU9fQ0FQVFVSRV9NUExBTkUJMHgwMDAwMTAwMAorLyogSXMgYSB2aWRlbyBvdXRwdXQgZGV2aWNlIHRoYXQgc3VwcG9ydHMgbXVsdGlwbGFuYXIgZm9ybWF0cyAqLworI2RlZmluZSBWNEwyX0NBUF9WSURFT19PVVRQVVRfTVBMQU5FCTB4MDAwMDIwMDAKKy8qIElzIGEgdmlkZW8gbWVtLXRvLW1lbSBkZXZpY2UgdGhhdCBzdXBwb3J0cyBtdWx0aXBsYW5hciBmb3JtYXRzICovCisjZGVmaW5lIFY0TDJfQ0FQX1ZJREVPX00yTV9NUExBTkUJMHgwMDAwNDAwMAorLyogSXMgYSB2aWRlbyBtZW0tdG8tbWVtIGRldmljZSAqLworI2RlZmluZSBWNEwyX0NBUF9WSURFT19NMk0JCTB4MDAwMDgwMDAKKworI2RlZmluZSBWNEwyX0NBUF9UVU5FUgkJCTB4MDAwMTAwMDAgIC8qIGhhcyBhIHR1bmVyICovCisjZGVmaW5lIFY0TDJfQ0FQX0FVRElPCQkJMHgwMDAyMDAwMCAgLyogaGFzIGF1ZGlvIHN1cHBvcnQgKi8KKyNkZWZpbmUgVjRMMl9DQVBfUkFESU8JCQkweDAwMDQwMDAwICAvKiBpcyBhIHJhZGlvIGRldmljZSAqLworI2RlZmluZSBWNEwyX0NBUF9NT0RVTEFUT1IJCTB4MDAwODAwMDAgIC8qIGhhcyBhIG1vZHVsYXRvciAqLworCisjZGVmaW5lIFY0TDJfQ0FQX1NEUl9DQVBUVVJFCQkweDAwMTAwMDAwICAvKiBJcyBhIFNEUiBjYXB0dXJlIGRldmljZSAqLworI2RlZmluZSBWNEwyX0NBUF9FWFRfUElYX0ZPUk1BVAkJMHgwMDIwMDAwMCAgLyogU3VwcG9ydHMgdGhlIGV4dGVuZGVkIHBpeGVsIGZvcm1hdCAqLworI2RlZmluZSBWNEwyX0NBUF9TRFJfT1VUUFVUCQkweDAwNDAwMDAwICAvKiBJcyBhIFNEUiBvdXRwdXQgZGV2aWNlICovCisjZGVmaW5lIFY0TDJfQ0FQX01FVEFfQ0FQVFVSRQkJMHgwMDgwMDAwMCAgLyogSXMgYSBtZXRhZGF0YSBjYXB0dXJlIGRldmljZSAqLworCisjZGVmaW5lIFY0TDJfQ0FQX1JFQURXUklURSAgICAgICAgICAgICAgMHgwMTAwMDAwMCAgLyogcmVhZC93cml0ZSBzeXN0ZW1jYWxscyAqLworI2RlZmluZSBWNEwyX0NBUF9BU1lOQ0lPICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAgIC8qIGFzeW5jIEkvTyAqLworI2RlZmluZSBWNEwyX0NBUF9TVFJFQU1JTkcgICAgICAgICAgICAgIDB4MDQwMDAwMDAgIC8qIHN0cmVhbWluZyBJL08gaW9jdGxzICovCisKKyNkZWZpbmUgVjRMMl9DQVBfVE9VQ0ggICAgICAgICAgICAgICAgICAweDEwMDAwMDAwICAvKiBJcyBhIHRvdWNoIGRldmljZSAqLworCisjZGVmaW5lIFY0TDJfQ0FQX0RFVklDRV9DQVBTICAgICAgICAgICAgMHg4MDAwMDAwMCAgLyogc2V0cyBkZXZpY2UgY2FwYWJpbGl0aWVzIGZpZWxkICovCisKKy8qCisgKglWIEkgRCBFIE8gICBJIE0gQSBHIEUgICBGIE8gUiBNIEEgVAorICovCitzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHsKKwlfX3UzMiAgICAgICAgIAkJd2lkdGg7CisJX191MzIJCQloZWlnaHQ7CisJX191MzIJCQlwaXhlbGZvcm1hdDsKKwlfX3UzMgkJCWZpZWxkOwkJLyogZW51bSB2NGwyX2ZpZWxkICovCisJX191MzIgICAgICAgICAgICAJYnl0ZXNwZXJsaW5lOwkvKiBmb3IgcGFkZGluZywgemVybyBpZiB1bnVzZWQgKi8KKwlfX3UzMiAgICAgICAgICAJCXNpemVpbWFnZTsKKwlfX3UzMgkJCWNvbG9yc3BhY2U7CS8qIGVudW0gdjRsMl9jb2xvcnNwYWNlICovCisJX191MzIJCQlwcml2OwkJLyogcHJpdmF0ZSBkYXRhLCBkZXBlbmRzIG9uIHBpeGVsZm9ybWF0ICovCisJX191MzIJCQlmbGFnczsJCS8qIGZvcm1hdCBmbGFncyAoVjRMMl9QSVhfRk1UX0ZMQUdfKikgKi8KKwl1bmlvbiB7CisJCS8qIGVudW0gdjRsMl95Y2Jjcl9lbmNvZGluZyAqLworCQlfX3UzMgkJCXljYmNyX2VuYzsKKwkJLyogZW51bSB2NGwyX2hzdl9lbmNvZGluZyAqLworCQlfX3UzMgkJCWhzdl9lbmM7CisJfTsKKwlfX3UzMgkJCXF1YW50aXphdGlvbjsJLyogZW51bSB2NGwyX3F1YW50aXphdGlvbiAqLworCV9fdTMyCQkJeGZlcl9mdW5jOwkvKiBlbnVtIHY0bDJfeGZlcl9mdW5jICovCit9OworCisvKiAgICAgIFBpeGVsIGZvcm1hdCAgICAgICAgIEZPVVJDQyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggIERlc2NyaXB0aW9uICAqLworCisvKiBSR0IgZm9ybWF0cyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCMzMyICB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0InLCAnMScpIC8qICA4ICBSR0ItMy0zLTIgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0I0NDQgIHY0bDJfZm91cmNjKCdSJywgJzQnLCAnNCcsICc0JykgLyogMTYgIHh4eHhycnJyIGdnZ2diYmJiICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9BUkdCNDQ0IHY0bDJfZm91cmNjKCdBJywgJ1InLCAnMScsICcyJykgLyogMTYgIGFhYWFycnJyIGdnZ2diYmJiICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9YUkdCNDQ0IHY0bDJfZm91cmNjKCdYJywgJ1InLCAnMScsICcyJykgLyogMTYgIHh4eHhycnJyIGdnZ2diYmJiICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0I1NTUgIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnQicsICdPJykgLyogMTYgIFJHQi01LTUtNSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0FSR0I1NTUgdjRsMl9mb3VyY2MoJ0EnLCAnUicsICcxJywgJzUnKSAvKiAxNiAgQVJHQi0xLTUtNS01ICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWFJHQjU1NSB2NGwyX2ZvdXJjYygnWCcsICdSJywgJzEnLCAnNScpIC8qIDE2ICBYUkdCLTEtNS01LTUgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0I1NjUgIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnQicsICdQJykgLyogMTYgIFJHQi01LTYtNSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjU1NVggdjRsMl9mb3VyY2MoJ1InLCAnRycsICdCJywgJ1EnKSAvKiAxNiAgUkdCLTUtNS01IEJFICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfQVJHQjU1NVggdjRsMl9mb3VyY2NfYmUoJ0EnLCAnUicsICcxJywgJzUnKSAvKiAxNiAgQVJHQi01LTUtNSBCRSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWFJHQjU1NVggdjRsMl9mb3VyY2NfYmUoJ1gnLCAnUicsICcxJywgJzUnKSAvKiAxNiAgWFJHQi01LTUtNSBCRSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCNTY1WCB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0InLCAnUicpIC8qIDE2ICBSR0ItNS02LTUgQkUgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9CR1I2NjYgIHY0bDJfZm91cmNjKCdCJywgJ0cnLCAnUicsICdIJykgLyogMTggIEJHUi02LTYtNgkgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9CR1IyNCAgIHY0bDJfZm91cmNjKCdCJywgJ0cnLCAnUicsICczJykgLyogMjQgIEJHUi04LTgtOCAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjI0ICAgdjRsMl9mb3VyY2MoJ1InLCAnRycsICdCJywgJzMnKSAvKiAyNCAgUkdCLTgtOC04ICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfQkdSMzIgICB2NGwyX2ZvdXJjYygnQicsICdHJywgJ1InLCAnNCcpIC8qIDMyICBCR1ItOC04LTgtOCAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9BQkdSMzIgIHY0bDJfZm91cmNjKCdBJywgJ1InLCAnMicsICc0JykgLyogMzIgIEJHUkEtOC04LTgtOCAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1hCR1IzMiAgdjRsMl9mb3VyY2MoJ1gnLCAnUicsICcyJywgJzQnKSAvKiAzMiAgQkdSWC04LTgtOC04ICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCMzIgICB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0InLCAnNCcpIC8qIDMyICBSR0ItOC04LTgtOCAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9BUkdCMzIgIHY0bDJfZm91cmNjKCdCJywgJ0EnLCAnMicsICc0JykgLyogMzIgIEFSR0ItOC04LTgtOCAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1hSR0IzMiAgdjRsMl9mb3VyY2MoJ0InLCAnWCcsICcyJywgJzQnKSAvKiAzMiAgWFJHQi04LTgtOC04ICAqLworCisvKiBHcmV5IGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0dSRVkgICAgdjRsMl9mb3VyY2MoJ0cnLCAnUicsICdFJywgJ1knKSAvKiAgOCAgR3JleXNjYWxlICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWTQgICAgICB2NGwyX2ZvdXJjYygnWScsICcwJywgJzQnLCAnICcpIC8qICA0ICBHcmV5c2NhbGUgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZNiAgICAgIHY0bDJfZm91cmNjKCdZJywgJzAnLCAnNicsICcgJykgLyogIDYgIEdyZXlzY2FsZSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1kxMCAgICAgdjRsMl9mb3VyY2MoJ1knLCAnMScsICcwJywgJyAnKSAvKiAxMCAgR3JleXNjYWxlICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWTEyICAgICB2NGwyX2ZvdXJjYygnWScsICcxJywgJzInLCAnICcpIC8qIDEyICBHcmV5c2NhbGUgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZMTYgICAgIHY0bDJfZm91cmNjKCdZJywgJzEnLCAnNicsICcgJykgLyogMTYgIEdyZXlzY2FsZSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1kxNl9CRSAgdjRsMl9mb3VyY2NfYmUoJ1knLCAnMScsICc2JywgJyAnKSAvKiAxNiAgR3JleXNjYWxlIEJFICAqLworCisvKiBHcmV5IGJpdC1wYWNrZWQgZm9ybWF0cyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWTEwQlBBQ0sgICAgdjRsMl9mb3VyY2MoJ1knLCAnMScsICcwJywgJ0InKSAvKiAxMCAgR3JleXNjYWxlIGJpdC1wYWNrZWQgKi8KKworLyogUGFsZXR0ZSBmb3JtYXRzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9QQUw4ICAgIHY0bDJfZm91cmNjKCdQJywgJ0EnLCAnTCcsICc4JykgLyogIDggIDgtYml0IHBhbGV0dGUgKi8KKworLyogQ2hyb21pbmFuY2UgZm9ybWF0cyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfVVY4ICAgICB2NGwyX2ZvdXJjYygnVScsICdWJywgJzgnLCAnICcpIC8qICA4ICBVViA0OjQgKi8KKworLyogTHVtaW5hbmNlK0Nocm9taW5hbmNlIGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVWVYgICAgdjRsMl9mb3VyY2MoJ1knLCAnVScsICdZJywgJ1YnKSAvKiAxNiAgWVVWIDQ6MjoyICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVlVViAgICB2NGwyX2ZvdXJjYygnWScsICdZJywgJ1UnLCAnVicpIC8qIDE2ICBZVVYgNDoyOjIgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVllVICAgIHY0bDJfZm91cmNjKCdZJywgJ1YnLCAnWScsICdVJykgLyogMTYgWVZVIDQ6MjoyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9VWVZZICAgIHY0bDJfZm91cmNjKCdVJywgJ1knLCAnVicsICdZJykgLyogMTYgIFlVViA0OjI6MiAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1ZZVVkgICAgdjRsMl9mb3VyY2MoJ1YnLCAnWScsICdVJywgJ1knKSAvKiAxNiAgWVVWIDQ6MjoyICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWTQxUCAgICB2NGwyX2ZvdXJjYygnWScsICc0JywgJzEnLCAnUCcpIC8qIDEyICBZVVYgNDoxOjEgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVY0NDQgIHY0bDJfZm91cmNjKCdZJywgJzQnLCAnNCcsICc0JykgLyogMTYgIHh4eHh5eXl5IHV1dXV2dnZ2ICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVY1NTUgIHY0bDJfZm91cmNjKCdZJywgJ1UnLCAnVicsICdPJykgLyogMTYgIFlVVi01LTUtNSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjU2NSAgdjRsMl9mb3VyY2MoJ1knLCAnVScsICdWJywgJ1AnKSAvKiAxNiAgWVVWLTUtNi01ICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWMzIgICB2NGwyX2ZvdXJjYygnWScsICdVJywgJ1YnLCAnNCcpIC8qIDMyICBZVVYtOC04LTgtOCAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ISTI0MCAgIHY0bDJfZm91cmNjKCdIJywgJ0knLCAnMicsICc0JykgLyogIDggIDgtYml0IGNvbG9yICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0hNMTIgICAgdjRsMl9mb3VyY2MoJ0gnLCAnTScsICcxJywgJzInKSAvKiAgOCAgWVVWIDQ6MjowIDE2eDE2IG1hY3JvYmxvY2tzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NNDIwICAgIHY0bDJfZm91cmNjKCdNJywgJzQnLCAnMicsICcwJykgLyogMTIgIFlVViA0OjI6MCAyIGxpbmVzIHksIDEgbGluZSB1diBpbnRlcmxlYXZlZCAqLworCisvKiB0d28gcGxhbmVzIC0tIG9uZSBZLCBvbmUgQ3IgKyBDYiBpbnRlcmxlYXZlZCAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMTIgICAgdjRsMl9mb3VyY2MoJ04nLCAnVicsICcxJywgJzInKSAvKiAxMiAgWS9DYkNyIDQ6MjowICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYyMSAgICB2NGwyX2ZvdXJjYygnTicsICdWJywgJzInLCAnMScpIC8qIDEyICBZL0NyQ2IgNDoyOjAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjE2ICAgIHY0bDJfZm91cmNjKCdOJywgJ1YnLCAnMScsICc2JykgLyogMTYgIFkvQ2JDciA0OjI6MiAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WNjEgICAgdjRsMl9mb3VyY2MoJ04nLCAnVicsICc2JywgJzEnKSAvKiAxNiAgWS9DckNiIDQ6MjoyICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYyNCAgICB2NGwyX2ZvdXJjYygnTicsICdWJywgJzInLCAnNCcpIC8qIDI0ICBZL0NiQ3IgNDo0OjQgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjQyICAgIHY0bDJfZm91cmNjKCdOJywgJ1YnLCAnNCcsICcyJykgLyogMjQgIFkvQ3JDYiA0OjQ6NCAgKi8KKworLyogdHdvIG5vbiBjb250aWd1b3VzIHBsYW5lcyAtIG9uZSBZLCBvbmUgQ3IgKyBDYiBpbnRlcmxlYXZlZCAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMTJNICAgdjRsMl9mb3VyY2MoJ04nLCAnTScsICcxJywgJzInKSAvKiAxMiAgWS9DYkNyIDQ6MjowICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYyMU0gICB2NGwyX2ZvdXJjYygnTicsICdNJywgJzInLCAnMScpIC8qIDIxICBZL0NyQ2IgNDoyOjAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjE2TSAgIHY0bDJfZm91cmNjKCdOJywgJ00nLCAnMScsICc2JykgLyogMTYgIFkvQ2JDciA0OjI6MiAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WNjFNICAgdjRsMl9mb3VyY2MoJ04nLCAnTScsICc2JywgJzEnKSAvKiAxNiAgWS9DckNiIDQ6MjoyICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYxMk1UICB2NGwyX2ZvdXJjYygnVCcsICdNJywgJzEnLCAnMicpIC8qIDEyICBZL0NiQ3IgNDoyOjAgNjR4MzIgbWFjcm9ibG9ja3MgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMTJNVF8xNlgxNiB2NGwyX2ZvdXJjYygnVicsICdNJywgJzEnLCAnMicpIC8qIDEyICBZL0NiQ3IgNDoyOjAgMTZ4MTYgbWFjcm9ibG9ja3MgKi8KKworLyogdGhyZWUgcGxhbmVzIC0gWSBDYiwgQ3IgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQxMCAgdjRsMl9mb3VyY2MoJ1knLCAnVScsICdWJywgJzknKSAvKiAgOSAgWVVWIDQ6MTowICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVZVNDEwICB2NGwyX2ZvdXJjYygnWScsICdWJywgJ1UnLCAnOScpIC8qICA5ICBZVlUgNDoxOjAgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVY0MTFQIHY0bDJfZm91cmNjKCc0JywgJzEnLCAnMScsICdQJykgLyogMTIgIFlWVTQxMSBwbGFuYXIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQyMCAgdjRsMl9mb3VyY2MoJ1knLCAnVScsICcxJywgJzInKSAvKiAxMiAgWVVWIDQ6MjowICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVZVNDIwICB2NGwyX2ZvdXJjYygnWScsICdWJywgJzEnLCAnMicpIC8qIDEyICBZVlUgNDoyOjAgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVY0MjJQIHY0bDJfZm91cmNjKCc0JywgJzInLCAnMicsICdQJykgLyogMTYgIFlWVTQyMiBwbGFuYXIgKi8KKworLyogdGhyZWUgbm9uIGNvbnRpZ3VvdXMgcGxhbmVzIC0gWSwgQ2IsIENyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVY0MjBNIHY0bDJfZm91cmNjKCdZJywgJ00nLCAnMScsICcyJykgLyogMTIgIFlVVjQyMCBwbGFuYXIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lWVTQyME0gdjRsMl9mb3VyY2MoJ1knLCAnTScsICcyJywgJzEnKSAvKiAxMiAgWVZVNDIwIHBsYW5hciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDIyTSB2NGwyX2ZvdXJjYygnWScsICdNJywgJzEnLCAnNicpIC8qIDE2ICBZVVY0MjIgcGxhbmFyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVlU0MjJNIHY0bDJfZm91cmNjKCdZJywgJ00nLCAnNicsICcxJykgLyogMTYgIFlWVTQyMiBwbGFuYXIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQ0NE0gdjRsMl9mb3VyY2MoJ1knLCAnTScsICcyJywgJzQnKSAvKiAyNCAgWVVWNDQ0IHBsYW5hciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVZVNDQ0TSB2NGwyX2ZvdXJjYygnWScsICdNJywgJzQnLCAnMicpIC8qIDI0ICBZVlU0NDQgcGxhbmFyICovCisKKy8qIEJheWVyIGZvcm1hdHMgLSBzZWUgaHR0cDovL3d3dy5zaWxpY29uaW1hZ2luZy5jb20vUkdCJTIwQmF5ZXIuaHRtICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TQkdHUjggIHY0bDJfZm91cmNjKCdCJywgJ0EnLCAnOCcsICcxJykgLyogIDggIEJHQkcuLiBHUkdSLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHQlJHOCAgdjRsMl9mb3VyY2MoJ0cnLCAnQicsICdSJywgJ0cnKSAvKiAgOCAgR0JHQi4uIFJHUkcuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dSQkc4ICB2NGwyX2ZvdXJjYygnRycsICdSJywgJ0InLCAnRycpIC8qICA4ICBHUkdSLi4gQkdCRy4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TUkdHQjggIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnRycsICdCJykgLyogIDggIFJHUkcuLiBHQkdCLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NCR0dSMTAgdjRsMl9mb3VyY2MoJ0InLCAnRycsICcxJywgJzAnKSAvKiAxMCAgQkdCRy4uIEdSR1IuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dCUkcxMCB2NGwyX2ZvdXJjYygnRycsICdCJywgJzEnLCAnMCcpIC8qIDEwICBHQkdCLi4gUkdSRy4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR1JCRzEwIHY0bDJfZm91cmNjKCdCJywgJ0EnLCAnMScsICcwJykgLyogMTAgIEdSR1IuLiBCR0JHLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NSR0dCMTAgdjRsMl9mb3VyY2MoJ1InLCAnRycsICcxJywgJzAnKSAvKiAxMCAgUkdSRy4uIEdCR0IuLiAqLworCS8qIDEwYml0IHJhdyBiYXllciBwYWNrZWQsIDUgYnl0ZXMgZm9yIGV2ZXJ5IDQgcGl4ZWxzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TQkdHUjEwUCB2NGwyX2ZvdXJjYygncCcsICdCJywgJ0EnLCAnQScpCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR0JSRzEwUCB2NGwyX2ZvdXJjYygncCcsICdHJywgJ0EnLCAnQScpCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR1JCRzEwUCB2NGwyX2ZvdXJjYygncCcsICdnJywgJ0EnLCAnQScpCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TUkdHQjEwUCB2NGwyX2ZvdXJjYygncCcsICdSJywgJ0EnLCAnQScpCisJLyogMTBiaXQgcmF3IGJheWVyIGEtbGF3IGNvbXByZXNzZWQgdG8gOCBiaXRzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TQkdHUjEwQUxBVzggdjRsMl9mb3VyY2MoJ2EnLCAnQicsICdBJywgJzgnKQorI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dCUkcxMEFMQVc4IHY0bDJfZm91cmNjKCdhJywgJ0cnLCAnQScsICc4JykKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHUkJHMTBBTEFXOCB2NGwyX2ZvdXJjYygnYScsICdnJywgJ0EnLCAnOCcpCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TUkdHQjEwQUxBVzggdjRsMl9mb3VyY2MoJ2EnLCAnUicsICdBJywgJzgnKQorCS8qIDEwYml0IHJhdyBiYXllciBEUENNIGNvbXByZXNzZWQgdG8gOCBiaXRzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TQkdHUjEwRFBDTTggdjRsMl9mb3VyY2MoJ2InLCAnQicsICdBJywgJzgnKQorI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dCUkcxMERQQ004IHY0bDJfZm91cmNjKCdiJywgJ0cnLCAnQScsICc4JykKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHUkJHMTBEUENNOCB2NGwyX2ZvdXJjYygnQicsICdEJywgJzEnLCAnMCcpCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TUkdHQjEwRFBDTTggdjRsMl9mb3VyY2MoJ2InLCAnUicsICdBJywgJzgnKQorI2RlZmluZSBWNEwyX1BJWF9GTVRfU0JHR1IxMiB2NGwyX2ZvdXJjYygnQicsICdHJywgJzEnLCAnMicpIC8qIDEyICBCR0JHLi4gR1JHUi4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR0JSRzEyIHY0bDJfZm91cmNjKCdHJywgJ0InLCAnMScsICcyJykgLyogMTIgIEdCR0IuLiBSR1JHLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHUkJHMTIgdjRsMl9mb3VyY2MoJ0InLCAnQScsICcxJywgJzInKSAvKiAxMiAgR1JHUi4uIEJHQkcuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1JHR0IxMiB2NGwyX2ZvdXJjYygnUicsICdHJywgJzEnLCAnMicpIC8qIDEyICBSR1JHLi4gR0JHQi4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TQkdHUjE2IHY0bDJfZm91cmNjKCdCJywgJ1knLCAnUicsICcyJykgLyogMTYgIEJHQkcuLiBHUkdSLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHQlJHMTYgdjRsMl9mb3VyY2MoJ0cnLCAnQicsICcxJywgJzYnKSAvKiAxNiAgR0JHQi4uIFJHUkcuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dSQkcxNiB2NGwyX2ZvdXJjYygnRycsICdSJywgJzEnLCAnNicpIC8qIDE2ICBHUkdSLi4gQkdCRy4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TUkdHQjE2IHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnMScsICc2JykgLyogMTYgIFJHUkcuLiBHQkdCLi4gKi8KKworLyogSFNWIGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0hTVjI0IHY0bDJfZm91cmNjKCdIJywgJ1MnLCAnVicsICczJykKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0hTVjMyIHY0bDJfZm91cmNjKCdIJywgJ1MnLCAnVicsICc0JykKKworLyogY29tcHJlc3NlZCBmb3JtYXRzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NSlBFRyAgICB2NGwyX2ZvdXJjYygnTScsICdKJywgJ1AnLCAnRycpIC8qIE1vdGlvbi1KUEVHICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0pQRUcgICAgIHY0bDJfZm91cmNjKCdKJywgJ1AnLCAnRScsICdHJykgLyogSkZJRiBKUEVHICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfRFYgICAgICAgdjRsMl9mb3VyY2MoJ2QnLCAndicsICdzJywgJ2QnKSAvKiAxMzk0ICAgICAgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NUEVHICAgICB2NGwyX2ZvdXJjYygnTScsICdQJywgJ0UnLCAnRycpIC8qIE1QRUctMS8yLzQgTXVsdGlwbGV4ZWQgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0gyNjQgICAgIHY0bDJfZm91cmNjKCdIJywgJzInLCAnNicsICc0JykgLyogSDI2NCB3aXRoIHN0YXJ0IGNvZGVzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9IMjY0X05PX1NDIHY0bDJfZm91cmNjKCdBJywgJ1YnLCAnQycsICcxJykgLyogSDI2NCB3aXRob3V0IHN0YXJ0IGNvZGVzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9IMjY0X01WQyB2NGwyX2ZvdXJjYygnTScsICcyJywgJzYnLCAnNCcpIC8qIEgyNjQgTVZDICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9IMjYzICAgICB2NGwyX2ZvdXJjYygnSCcsICcyJywgJzYnLCAnMycpIC8qIEgyNjMgICAgICAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX01QRUcxICAgIHY0bDJfZm91cmNjKCdNJywgJ1AnLCAnRycsICcxJykgLyogTVBFRy0xIEVTICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTVBFRzIgICAgdjRsMl9mb3VyY2MoJ00nLCAnUCcsICdHJywgJzInKSAvKiBNUEVHLTIgRVMgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NUEVHNCAgICB2NGwyX2ZvdXJjYygnTScsICdQJywgJ0cnLCAnNCcpIC8qIE1QRUctNCBwYXJ0IDIgRVMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1hWSUQgICAgIHY0bDJfZm91cmNjKCdYJywgJ1YnLCAnSScsICdEJykgLyogWHZpZCAgICAgICAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1ZDMV9BTk5FWF9HIHY0bDJfZm91cmNjKCdWJywgJ0MnLCAnMScsICdHJykgLyogU01QVEUgNDIxTSBBbm5leCBHIGNvbXBsaWFudCBzdHJlYW0gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1ZDMV9BTk5FWF9MIHY0bDJfZm91cmNjKCdWJywgJ0MnLCAnMScsICdMJykgLyogU01QVEUgNDIxTSBBbm5leCBMIGNvbXBsaWFudCBzdHJlYW0gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1ZQOCAgICAgIHY0bDJfZm91cmNjKCdWJywgJ1AnLCAnOCcsICcwJykgLyogVlA4ICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9WUDkgICAgICB2NGwyX2ZvdXJjYygnVicsICdQJywgJzknLCAnMCcpIC8qIFZQOSAqLworCisvKiAgVmVuZG9yLXNwZWNpZmljIGZvcm1hdHMgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfQ1BJQTEgICAgdjRsMl9mb3VyY2MoJ0MnLCAnUCcsICdJJywgJ0EnKSAvKiBjcGlhMSBZVVYgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1dOVkEgICAgIHY0bDJfZm91cmNjKCdXJywgJ04nLCAnVicsICdBJykgLyogV2lubm92IGh3IGNvbXByZXNzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TTjlDMTBYICB2NGwyX2ZvdXJjYygnUycsICc5JywgJzEnLCAnMCcpIC8qIFNOOUMxMHggY29tcHJlc3Npb24gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NOOUMyMFhfSTQyMCB2NGwyX2ZvdXJjYygnUycsICc5JywgJzInLCAnMCcpIC8qIFNOOUMyMHggWVVWIDQ6MjowICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9QV0MxICAgICB2NGwyX2ZvdXJjYygnUCcsICdXJywgJ0MnLCAnMScpIC8qIHB3YyBvbGRlciB3ZWJjYW0gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1BXQzIgICAgIHY0bDJfZm91cmNjKCdQJywgJ1cnLCAnQycsICcyJykgLyogcHdjIG5ld2VyIHdlYmNhbSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfRVQ2MVgyNTEgdjRsMl9mb3VyY2MoJ0UnLCAnNicsICcyJywgJzUnKSAvKiBFVDYxWDI1MSBjb21wcmVzc2lvbiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1BDQTUwMSAgdjRsMl9mb3VyY2MoJ1MnLCAnNScsICcwJywgJzEnKSAvKiBZVVlWIHBlciBsaW5lICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TUENBNTA1ICB2NGwyX2ZvdXJjYygnUycsICc1JywgJzAnLCAnNScpIC8qIFlZVVYgcGVyIGxpbmUgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NQQ0E1MDggIHY0bDJfZm91cmNjKCdTJywgJzUnLCAnMCcsICc4JykgLyogWVVWWSBwZXIgbGluZSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1BDQTU2MSAgdjRsMl9mb3VyY2MoJ1MnLCAnNScsICc2JywgJzEnKSAvKiBjb21wcmVzc2VkIEdCUkcgYmF5ZXIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1BBQzIwNyAgIHY0bDJfZm91cmNjKCdQJywgJzInLCAnMCcsICc3JykgLyogY29tcHJlc3NlZCBCR0dSIGJheWVyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NUjk3MzEwQSB2NGwyX2ZvdXJjYygnTScsICczJywgJzEnLCAnMCcpIC8qIGNvbXByZXNzZWQgQkdHUiBiYXllciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfSkwyMDA1QkNEIHY0bDJfZm91cmNjKCdKJywgJ0wnLCAnMicsICcwJykgLyogY29tcHJlc3NlZCBSR0dCIGJheWVyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TTjlDMjAyOCB2NGwyX2ZvdXJjYygnUycsICdPJywgJ04nLCAnWCcpIC8qIGNvbXByZXNzZWQgR0JSRyBiYXllciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1E5MDVDICAgdjRsMl9mb3VyY2MoJzknLCAnMCcsICc1JywgJ0MnKSAvKiBjb21wcmVzc2VkIFJHR0IgYmF5ZXIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1BKUEcgICAgIHY0bDJfZm91cmNjKCdQJywgJ0onLCAnUCcsICdHJykgLyogUGl4YXJ0IDczeHggSlBFRyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfT1Y1MTEgICAgdjRsMl9mb3VyY2MoJ08nLCAnNScsICcxJywgJzEnKSAvKiBvdjUxMSBKUEVHICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9PVjUxOCAgICB2NGwyX2ZvdXJjYygnTycsICc1JywgJzEnLCAnOCcpIC8qIG92NTE4IEpQRUcgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NUVjA2ODAgIHY0bDJfZm91cmNjKCdTJywgJzYnLCAnOCcsICcwJykgLyogc3R2MDY4MCBiYXllciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfVE02MDAwICAgdjRsMl9mb3VyY2MoJ1QnLCAnTScsICc2JywgJzAnKSAvKiB0bTU2MDAvdG02MHgwICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9DSVRfWVlWWVVZIHY0bDJfZm91cmNjKCdDJywgJ0knLCAnVCcsICdWJykgLyogb25lIGxpbmUgb2YgWSB0aGVuIDEgbGluZSBvZiBWWVVZICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9LT05JQ0E0MjAgIHY0bDJfZm91cmNjKCdLJywgJ08nLCAnTicsICdJJykgLyogWVVWNDIwIHBsYW5hciBpbiBibG9ja3Mgb2YgMjU2IHBpeGVscyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfSlBHTAl2NGwyX2ZvdXJjYygnSicsICdQJywgJ0cnLCAnTCcpIC8qIEpQRUctTGl0ZSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0U0MDEgICAgICB2NGwyX2ZvdXJjYygnUycsICc0JywgJzAnLCAnMScpIC8qIHNlNDAxIGphbmdndSBjb21wcmVzc2VkIHJnYiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUzVDX1VZVllfSlBHIHY0bDJfZm91cmNjKCdTJywgJzUnLCAnQycsICdJJykgLyogUzVDNzNNMyBpbnRlcmxlYXZlZCBVWVZZL0pQRUcgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1k4SSAgICAgIHY0bDJfZm91cmNjKCdZJywgJzgnLCAnSScsICcgJykgLyogR3JleXNjYWxlIDgtYml0IEwvUiBpbnRlcmxlYXZlZCAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWTEySSAgICAgdjRsMl9mb3VyY2MoJ1knLCAnMScsICcyJywgJ0knKSAvKiBHcmV5c2NhbGUgMTItYml0IEwvUiBpbnRlcmxlYXZlZCAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWjE2ICAgICAgdjRsMl9mb3VyY2MoJ1onLCAnMScsICc2JywgJyAnKSAvKiBEZXB0aCBkYXRhIDE2LWJpdCAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTVQyMUMgICAgdjRsMl9mb3VyY2MoJ00nLCAnVCcsICcyJywgJzEnKSAvKiBNZWRpYXRlayBjb21wcmVzc2VkIGJsb2NrIG1vZGUgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9JTlpJICAgICB2NGwyX2ZvdXJjYygnSScsICdOJywgJ1onLCAnSScpIC8qIEludGVsIFBsYW5hciBHcmV5c2NhbGUgMTAtYml0IGFuZCBEZXB0aCAxNi1iaXQgKi8KKworLyogU0RSIGZvcm1hdHMgLSB1c2VkIG9ubHkgZm9yIFNvZnR3YXJlIERlZmluZWQgUmFkaW8gZGV2aWNlcyAqLworI2RlZmluZSBWNEwyX1NEUl9GTVRfQ1U4ICAgICAgICAgIHY0bDJfZm91cmNjKCdDJywgJ1UnLCAnMCcsICc4JykgLyogSVEgdTggKi8KKyNkZWZpbmUgVjRMMl9TRFJfRk1UX0NVMTZMRSAgICAgICB2NGwyX2ZvdXJjYygnQycsICdVJywgJzEnLCAnNicpIC8qIElRIHUxNmxlICovCisjZGVmaW5lIFY0TDJfU0RSX0ZNVF9DUzggICAgICAgICAgdjRsMl9mb3VyY2MoJ0MnLCAnUycsICcwJywgJzgnKSAvKiBjb21wbGV4IHM4ICovCisjZGVmaW5lIFY0TDJfU0RSX0ZNVF9DUzE0TEUgICAgICAgdjRsMl9mb3VyY2MoJ0MnLCAnUycsICcxJywgJzQnKSAvKiBjb21wbGV4IHMxNGxlICovCisjZGVmaW5lIFY0TDJfU0RSX0ZNVF9SVTEyTEUgICAgICAgdjRsMl9mb3VyY2MoJ1InLCAnVScsICcxJywgJzInKSAvKiByZWFsIHUxMmxlICovCisjZGVmaW5lIFY0TDJfU0RSX0ZNVF9QQ1UxNkJFCSAgdjRsMl9mb3VyY2MoJ1AnLCAnQycsICcxJywgJzYnKSAvKiBwbGFuYXIgY29tcGxleCB1MTZiZSAqLworI2RlZmluZSBWNEwyX1NEUl9GTVRfUENVMThCRQkgIHY0bDJfZm91cmNjKCdQJywgJ0MnLCAnMScsICc4JykgLyogcGxhbmFyIGNvbXBsZXggdTE4YmUgKi8KKyNkZWZpbmUgVjRMMl9TRFJfRk1UX1BDVTIwQkUJICB2NGwyX2ZvdXJjYygnUCcsICdDJywgJzInLCAnMCcpIC8qIHBsYW5hciBjb21wbGV4IHUyMGJlICovCisKKy8qIFRvdWNoIGZvcm1hdHMgLSB1c2VkIGZvciBUb3VjaCBkZXZpY2VzICovCisjZGVmaW5lIFY0TDJfVENIX0ZNVF9ERUxUQV9URDE2CXY0bDJfZm91cmNjKCdUJywgJ0QnLCAnMScsICc2JykgLyogMTYtYml0IHNpZ25lZCBkZWx0YXMgKi8KKyNkZWZpbmUgVjRMMl9UQ0hfRk1UX0RFTFRBX1REMDgJdjRsMl9mb3VyY2MoJ1QnLCAnRCcsICcwJywgJzgnKSAvKiA4LWJpdCBzaWduZWQgZGVsdGFzICovCisjZGVmaW5lIFY0TDJfVENIX0ZNVF9UVTE2CXY0bDJfZm91cmNjKCdUJywgJ1UnLCAnMScsICc2JykgLyogMTYtYml0IHVuc2lnbmVkIHRvdWNoIGRhdGEgKi8KKyNkZWZpbmUgVjRMMl9UQ0hfRk1UX1RVMDgJdjRsMl9mb3VyY2MoJ1QnLCAnVScsICcwJywgJzgnKSAvKiA4LWJpdCB1bnNpZ25lZCB0b3VjaCBkYXRhICovCisKKy8qIE1ldGEtZGF0YSBmb3JtYXRzICovCisjZGVmaW5lIFY0TDJfTUVUQV9GTVRfVlNQMV9IR08gICAgdjRsMl9mb3VyY2MoJ1YnLCAnUycsICdQJywgJ0gnKSAvKiBSLUNhciBWU1AxIDEtRCBIaXN0b2dyYW0gKi8KKyNkZWZpbmUgVjRMMl9NRVRBX0ZNVF9WU1AxX0hHVCAgICB2NGwyX2ZvdXJjYygnVicsICdTJywgJ1AnLCAnVCcpIC8qIFItQ2FyIFZTUDEgMi1EIEhpc3RvZ3JhbSAqLworCisvKiBwcml2IGZpZWxkIHZhbHVlIHRvIGluZGljYXRlcyB0aGF0IHN1YnNlcXVlbnQgZmllbGRzIGFyZSB2YWxpZC4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1BSSVZfTUFHSUMJCTB4ZmVlZGNhZmUKKworLyogRmxhZ3MgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0ZMQUdfUFJFTVVMX0FMUEhBCTB4MDAwMDAwMDEKKworLyoKKyAqCUYgTyBSIE0gQSBUICAgRSBOIFUgTSBFIFIgQSBUIEkgTyBOCisgKi8KK3N0cnVjdCB2NGwyX2ZtdGRlc2MgeworCV9fdTMyCQkgICAgaW5kZXg7ICAgICAgICAgICAgIC8qIEZvcm1hdCBudW1iZXIgICAgICAqLworCV9fdTMyCQkgICAgdHlwZTsgICAgICAgICAgICAgIC8qIGVudW0gdjRsMl9idWZfdHlwZSAqLworCV9fdTMyICAgICAgICAgICAgICAgZmxhZ3M7CisJX191OAkJICAgIGRlc2NyaXB0aW9uWzMyXTsgICAvKiBEZXNjcmlwdGlvbiBzdHJpbmcgKi8KKwlfX3UzMgkJICAgIHBpeGVsZm9ybWF0OyAgICAgICAvKiBGb3JtYXQgZm91cmNjICAgICAgKi8KKwlfX3UzMgkJICAgIHJlc2VydmVkWzRdOworfTsKKworI2RlZmluZSBWNEwyX0ZNVF9GTEFHX0NPTVBSRVNTRUQgMHgwMDAxCisjZGVmaW5lIFY0TDJfRk1UX0ZMQUdfRU1VTEFURUQgICAweDAwMDIKKworCS8qIEZyYW1lIFNpemUgYW5kIGZyYW1lIHJhdGUgZW51bWVyYXRpb24gKi8KKy8qCisgKglGIFIgQSBNIEUgICBTIEkgWiBFICAgRSBOIFUgTSBFIFIgQSBUIEkgTyBOCisgKi8KK2VudW0gdjRsMl9mcm1zaXpldHlwZXMgeworCVY0TDJfRlJNU0laRV9UWVBFX0RJU0NSRVRFCT0gMSwKKwlWNEwyX0ZSTVNJWkVfVFlQRV9DT05USU5VT1VTCT0gMiwKKwlWNEwyX0ZSTVNJWkVfVFlQRV9TVEVQV0lTRQk9IDMsCit9OworCitzdHJ1Y3QgdjRsMl9mcm1zaXplX2Rpc2NyZXRlIHsKKwlfX3UzMgkJCXdpZHRoOwkJLyogRnJhbWUgd2lkdGggW3BpeGVsXSAqLworCV9fdTMyCQkJaGVpZ2h0OwkJLyogRnJhbWUgaGVpZ2h0IFtwaXhlbF0gKi8KK307CisKK3N0cnVjdCB2NGwyX2ZybXNpemVfc3RlcHdpc2UgeworCV9fdTMyCQkJbWluX3dpZHRoOwkvKiBNaW5pbXVtIGZyYW1lIHdpZHRoIFtwaXhlbF0gKi8KKwlfX3UzMgkJCW1heF93aWR0aDsJLyogTWF4aW11bSBmcmFtZSB3aWR0aCBbcGl4ZWxdICovCisJX191MzIJCQlzdGVwX3dpZHRoOwkvKiBGcmFtZSB3aWR0aCBzdGVwIHNpemUgW3BpeGVsXSAqLworCV9fdTMyCQkJbWluX2hlaWdodDsJLyogTWluaW11bSBmcmFtZSBoZWlnaHQgW3BpeGVsXSAqLworCV9fdTMyCQkJbWF4X2hlaWdodDsJLyogTWF4aW11bSBmcmFtZSBoZWlnaHQgW3BpeGVsXSAqLworCV9fdTMyCQkJc3RlcF9oZWlnaHQ7CS8qIEZyYW1lIGhlaWdodCBzdGVwIHNpemUgW3BpeGVsXSAqLworfTsKKworc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0geworCV9fdTMyCQkJaW5kZXg7CQkvKiBGcmFtZSBzaXplIG51bWJlciAqLworCV9fdTMyCQkJcGl4ZWxfZm9ybWF0OwkvKiBQaXhlbCBmb3JtYXQgKi8KKwlfX3UzMgkJCXR5cGU7CQkvKiBGcmFtZSBzaXplIHR5cGUgdGhlIGRldmljZSBzdXBwb3J0cy4gKi8KKworCXVuaW9uIHsJCQkJCS8qIEZyYW1lIHNpemUgKi8KKwkJc3RydWN0IHY0bDJfZnJtc2l6ZV9kaXNjcmV0ZQlkaXNjcmV0ZTsKKwkJc3RydWN0IHY0bDJfZnJtc2l6ZV9zdGVwd2lzZQlzdGVwd2lzZTsKKwl9OworCisJX191MzIgICByZXNlcnZlZFsyXTsJCQkvKiBSZXNlcnZlZCBzcGFjZSBmb3IgZnV0dXJlIHVzZSAqLworfTsKKworLyoKKyAqCUYgUiBBIE0gRSAgIFIgQSBUIEUgICBFIE4gVSBNIEUgUiBBIFQgSSBPIE4KKyAqLworZW51bSB2NGwyX2ZybWl2YWx0eXBlcyB7CisJVjRMMl9GUk1JVkFMX1RZUEVfRElTQ1JFVEUJPSAxLAorCVY0TDJfRlJNSVZBTF9UWVBFX0NPTlRJTlVPVVMJPSAyLAorCVY0TDJfRlJNSVZBTF9UWVBFX1NURVBXSVNFCT0gMywKK307CisKK3N0cnVjdCB2NGwyX2ZybWl2YWxfc3RlcHdpc2UgeworCXN0cnVjdCB2NGwyX2ZyYWN0CW1pbjsJCS8qIE1pbmltdW0gZnJhbWUgaW50ZXJ2YWwgW3NdICovCisJc3RydWN0IHY0bDJfZnJhY3QJbWF4OwkJLyogTWF4aW11bSBmcmFtZSBpbnRlcnZhbCBbc10gKi8KKwlzdHJ1Y3QgdjRsMl9mcmFjdAlzdGVwOwkJLyogRnJhbWUgaW50ZXJ2YWwgc3RlcCBzaXplIFtzXSAqLworfTsKKworc3RydWN0IHY0bDJfZnJtaXZhbGVudW0geworCV9fdTMyCQkJaW5kZXg7CQkvKiBGcmFtZSBmb3JtYXQgaW5kZXggKi8KKwlfX3UzMgkJCXBpeGVsX2Zvcm1hdDsJLyogUGl4ZWwgZm9ybWF0ICovCisJX191MzIJCQl3aWR0aDsJCS8qIEZyYW1lIHdpZHRoICovCisJX191MzIJCQloZWlnaHQ7CQkvKiBGcmFtZSBoZWlnaHQgKi8KKwlfX3UzMgkJCXR5cGU7CQkvKiBGcmFtZSBpbnRlcnZhbCB0eXBlIHRoZSBkZXZpY2Ugc3VwcG9ydHMuICovCisKKwl1bmlvbiB7CQkJCQkvKiBGcmFtZSBpbnRlcnZhbCAqLworCQlzdHJ1Y3QgdjRsMl9mcmFjdAkJZGlzY3JldGU7CisJCXN0cnVjdCB2NGwyX2ZybWl2YWxfc3RlcHdpc2UJc3RlcHdpc2U7CisJfTsKKworCV9fdTMyCXJlc2VydmVkWzJdOwkJCS8qIFJlc2VydmVkIHNwYWNlIGZvciBmdXR1cmUgdXNlICovCit9OworCisvKgorICoJVCBJIE0gRSBDIE8gRCBFCisgKi8KK3N0cnVjdCB2NGwyX3RpbWVjb2RlIHsKKwlfX3UzMgl0eXBlOworCV9fdTMyCWZsYWdzOworCV9fdTgJZnJhbWVzOworCV9fdTgJc2Vjb25kczsKKwlfX3U4CW1pbnV0ZXM7CisJX191OAlob3VyczsKKwlfX3U4CXVzZXJiaXRzWzRdOworfTsKKworLyogIFR5cGUgICovCisjZGVmaW5lIFY0TDJfVENfVFlQRV8yNEZQUwkJMQorI2RlZmluZSBWNEwyX1RDX1RZUEVfMjVGUFMJCTIKKyNkZWZpbmUgVjRMMl9UQ19UWVBFXzMwRlBTCQkzCisjZGVmaW5lIFY0TDJfVENfVFlQRV81MEZQUwkJNAorI2RlZmluZSBWNEwyX1RDX1RZUEVfNjBGUFMJCTUKKworLyogIEZsYWdzICAqLworI2RlZmluZSBWNEwyX1RDX0ZMQUdfRFJPUEZSQU1FCQkweDAwMDEgLyogImRyb3AtZnJhbWUiIG1vZGUgKi8KKyNkZWZpbmUgVjRMMl9UQ19GTEFHX0NPTE9SRlJBTUUJCTB4MDAwMgorI2RlZmluZSBWNEwyX1RDX1VTRVJCSVRTX2ZpZWxkCQkweDAwMEMKKyNkZWZpbmUgVjRMMl9UQ19VU0VSQklUU19VU0VSREVGSU5FRAkweDAwMDAKKyNkZWZpbmUgVjRMMl9UQ19VU0VSQklUU184QklUQ0hBUlMJMHgwMDA4CisvKiBUaGUgYWJvdmUgaXMgYmFzZWQgb24gU01QVEUgdGltZWNvZGVzICovCisKK3N0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbiB7CisJaW50IHF1YWxpdHk7CisKKwlpbnQgIEFQUG47ICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgQVBQIHNlZ21lbnQgdG8gYmUgd3JpdHRlbiwKKwkJCQkgKiBtdXN0IGJlIDAuLjE1ICovCisJaW50ICBBUFBfbGVuOyAgICAgICAgICAgLyogTGVuZ3RoIG9mIGRhdGEgaW4gSlBFRyBBUFBuIHNlZ21lbnQgKi8KKwljaGFyIEFQUF9kYXRhWzYwXTsgICAgICAvKiBEYXRhIGluIHRoZSBKUEVHIEFQUG4gc2VnbWVudC4gKi8KKworCWludCAgQ09NX2xlbjsgICAgICAgICAgIC8qIExlbmd0aCBvZiBkYXRhIGluIEpQRUcgQ09NIHNlZ21lbnQgKi8KKwljaGFyIENPTV9kYXRhWzYwXTsgICAgICAvKiBEYXRhIGluIEpQRUcgQ09NIHNlZ21lbnQgKi8KKworCV9fdTMyIGpwZWdfbWFya2VyczsgICAgIC8qIFdoaWNoIG1hcmtlcnMgc2hvdWxkIGdvIGludG8gdGhlIEpQRUcKKwkJCQkgKiBvdXRwdXQuIFVubGVzcyB5b3UgZXhhY3RseSBrbm93IHdoYXQKKwkJCQkgKiB5b3UgZG8sIGxlYXZlIHRoZW0gdW50b3VjaGVkLgorCQkJCSAqIEluY2x1ZGluZyBsZXNzIG1hcmtlcnMgd2lsbCBtYWtlIHRoZQorCQkJCSAqIHJlc3VsdGluZyBjb2RlIHNtYWxsZXIsIGJ1dCB0aGVyZSB3aWxsCisJCQkJICogYmUgZmV3ZXIgYXBwbGljYXRpb25zIHdoaWNoIGNhbiByZWFkIGl0LgorCQkJCSAqIFRoZSBwcmVzZW5jZSBvZiB0aGUgQVBQIGFuZCBDT00gbWFya2VyCisJCQkJICogaXMgaW5mbHVlbmNlZCBieSBBUFBfbGVuIGFuZCBDT01fbGVuCisJCQkJICogT05MWSwgbm90IGJ5IHRoaXMgcHJvcGVydHkhICovCisKKyNkZWZpbmUgVjRMMl9KUEVHX01BUktFUl9ESFQgKDE8PDMpICAgIC8qIERlZmluZSBIdWZmbWFuIFRhYmxlcyAqLworI2RlZmluZSBWNEwyX0pQRUdfTUFSS0VSX0RRVCAoMTw8NCkgICAgLyogRGVmaW5lIFF1YW50aXphdGlvbiBUYWJsZXMgKi8KKyNkZWZpbmUgVjRMMl9KUEVHX01BUktFUl9EUkkgKDE8PDUpICAgIC8qIERlZmluZSBSZXN0YXJ0IEludGVydmFsICovCisjZGVmaW5lIFY0TDJfSlBFR19NQVJLRVJfQ09NICgxPDw2KSAgICAvKiBDb21tZW50IHNlZ21lbnQgKi8KKyNkZWZpbmUgVjRMMl9KUEVHX01BUktFUl9BUFAgKDE8PDcpICAgIC8qIEFwcCBzZWdtZW50LCBkcml2ZXIgd2lsbAorCQkJCQkqIGFsd2F5cyB1c2UgQVBQMCAqLworfTsKKworLyoKKyAqCU0gRSBNIE8gUiBZIC0gTSBBIFAgUCBJIE4gRyAgIEIgVSBGIEYgRSBSIFMKKyAqLworc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgeworCV9fdTMyCQkJY291bnQ7CisJX191MzIJCQl0eXBlOwkJLyogZW51bSB2NGwyX2J1Zl90eXBlICovCisJX191MzIJCQltZW1vcnk7CQkvKiBlbnVtIHY0bDJfbWVtb3J5ICovCisJX191MzIJCQlyZXNlcnZlZFsyXTsKK307CisKKy8qKgorICogc3RydWN0IHY0bDJfcGxhbmUgLSBwbGFuZSBpbmZvIGZvciBtdWx0aS1wbGFuYXIgYnVmZmVycworICogQGJ5dGVzdXNlZDoJCW51bWJlciBvZiBieXRlcyBvY2N1cGllZCBieSBkYXRhIGluIHRoZSBwbGFuZSAocGF5bG9hZCkKKyAqIEBsZW5ndGg6CQlzaXplIG9mIHRoaXMgcGxhbmUgKE5PVCB0aGUgcGF5bG9hZCkgaW4gYnl0ZXMKKyAqIEBtZW1fb2Zmc2V0OgkJd2hlbiBtZW1vcnkgaW4gdGhlIGFzc29jaWF0ZWQgc3RydWN0IHY0bDJfYnVmZmVyIGlzCisgKgkJCVY0TDJfTUVNT1JZX01NQVAsIGVxdWFscyB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mCisgKgkJCXRoZSBkZXZpY2UgbWVtb3J5IGZvciB0aGlzIHBsYW5lIChvciBpcyBhICJjb29raWUiIHRoYXQKKyAqCQkJc2hvdWxkIGJlIHBhc3NlZCB0byBtbWFwKCkgY2FsbGVkIG9uIHRoZSB2aWRlbyBub2RlKQorICogQHVzZXJwdHI6CQl3aGVuIG1lbW9yeSBpcyBWNEwyX01FTU9SWV9VU0VSUFRSLCBhIHVzZXJzcGFjZSBwb2ludGVyCisgKgkJCXBvaW50aW5nIHRvIHRoaXMgcGxhbmUKKyAqIEBmZDoJCQl3aGVuIG1lbW9yeSBpcyBWNEwyX01FTU9SWV9ETUFCVUYsIGEgdXNlcnNwYWNlIGZpbGUKKyAqCQkJZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBwbGFuZQorICogQGRhdGFfb2Zmc2V0OglvZmZzZXQgaW4gdGhlIHBsYW5lIHRvIHRoZSBzdGFydCBvZiBkYXRhOyB1c3VhbGx5IDAsCisgKgkJCXVubGVzcyB0aGVyZSBpcyBhIGhlYWRlciBpbiBmcm9udCBvZiB0aGUgZGF0YQorICoKKyAqIE11bHRpLXBsYW5hciBidWZmZXJzIGNvbnNpc3Qgb2Ygb25lIG9yIG1vcmUgcGxhbmVzLCBlLmcuIGFuIFlDYkNyIGJ1ZmZlcgorICogd2l0aCB0d28gcGxhbmVzIGNhbiBoYXZlIG9uZSBwbGFuZSBmb3IgWSwgYW5kIGFub3RoZXIgZm9yIGludGVybGVhdmVkIENiQ3IKKyAqIGNvbXBvbmVudHMuIEVhY2ggcGxhbmUgY2FuIHJlc2lkZSBpbiBhIHNlcGFyYXRlIG1lbW9yeSBidWZmZXIsIG9yIGV2ZW4gaW4KKyAqIGEgY29tcGxldGVseSBzZXBhcmF0ZSBtZW1vcnkgbm9kZSAoZS5nLiBpbiBlbWJlZGRlZCBkZXZpY2VzKS4KKyAqLworc3RydWN0IHY0bDJfcGxhbmUgeworCV9fdTMyCQkJYnl0ZXN1c2VkOworCV9fdTMyCQkJbGVuZ3RoOworCXVuaW9uIHsKKwkJX191MzIJCW1lbV9vZmZzZXQ7CisJCXVuc2lnbmVkIGxvbmcJdXNlcnB0cjsKKwkJX19zMzIJCWZkOworCX0gbTsKKwlfX3UzMgkJCWRhdGFfb2Zmc2V0OworCV9fdTMyCQkJcmVzZXJ2ZWRbMTFdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdjRsMl9idWZmZXIgLSB2aWRlbyBidWZmZXIgaW5mbworICogQGluZGV4OglpZCBudW1iZXIgb2YgdGhlIGJ1ZmZlcgorICogQHR5cGU6CWVudW0gdjRsMl9idWZfdHlwZTsgYnVmZmVyIHR5cGUgKHR5cGUgPT0gKl9NUExBTkUgZm9yCisgKgkJbXVsdGlwbGFuYXIgYnVmZmVycyk7CisgKiBAYnl0ZXN1c2VkOgludW1iZXIgb2YgYnl0ZXMgb2NjdXBpZWQgYnkgZGF0YSBpbiB0aGUgYnVmZmVyIChwYXlsb2FkKTsKKyAqCQl1bnVzZWQgKHNldCB0byAwKSBmb3IgbXVsdGlwbGFuYXIgYnVmZmVycworICogQGZsYWdzOglidWZmZXIgaW5mb3JtYXRpb25hbCBmbGFncworICogQGZpZWxkOgllbnVtIHY0bDJfZmllbGQ7IGZpZWxkIG9yZGVyIG9mIHRoZSBpbWFnZSBpbiB0aGUgYnVmZmVyCisgKiBAdGltZXN0YW1wOglmcmFtZSB0aW1lc3RhbXAKKyAqIEB0aW1lY29kZToJZnJhbWUgdGltZWNvZGUKKyAqIEBzZXF1ZW5jZToJc2VxdWVuY2UgY291bnQgb2YgdGhpcyBmcmFtZQorICogQG1lbW9yeToJZW51bSB2NGwyX21lbW9yeTsgdGhlIG1ldGhvZCwgaW4gd2hpY2ggdGhlIGFjdHVhbCB2aWRlbyBkYXRhIGlzCisgKgkJcGFzc2VkCisgKiBAb2Zmc2V0Oglmb3Igbm9uLW11bHRpcGxhbmFyIGJ1ZmZlcnMgd2l0aCBtZW1vcnkgPT0gVjRMMl9NRU1PUllfTU1BUDsKKyAqCQlvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGRldmljZSBtZW1vcnkgZm9yIHRoaXMgcGxhbmUsCisgKgkJKG9yIGEgImNvb2tpZSIgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIG1tYXAoKSBhcyBvZmZzZXQpCisgKiBAdXNlcnB0cjoJZm9yIG5vbi1tdWx0aXBsYW5hciBidWZmZXJzIHdpdGggbWVtb3J5ID09IFY0TDJfTUVNT1JZX1VTRVJQVFI7CisgKgkJYSB1c2Vyc3BhY2UgcG9pbnRlciBwb2ludGluZyB0byB0aGlzIGJ1ZmZlcgorICogQGZkOgkJZm9yIG5vbi1tdWx0aXBsYW5hciBidWZmZXJzIHdpdGggbWVtb3J5ID09IFY0TDJfTUVNT1JZX0RNQUJVRjsKKyAqCQlhIHVzZXJzcGFjZSBmaWxlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVmZmVyCisgKiBAcGxhbmVzOglmb3IgbXVsdGlwbGFuYXIgYnVmZmVyczsgdXNlcnNwYWNlIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIHBsYW5lCisgKgkJaW5mbyBzdHJ1Y3RzIGZvciB0aGlzIGJ1ZmZlcgorICogQGxlbmd0aDoJc2l6ZSBpbiBieXRlcyBvZiB0aGUgYnVmZmVyIChOT1QgaXRzIHBheWxvYWQpIGZvciBzaW5nbGUtcGxhbmUKKyAqCQlidWZmZXJzICh3aGVuIHR5cGUgIT0gKl9NUExBTkUpOyBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlCisgKgkJcGxhbmVzIGFycmF5IGZvciBtdWx0aS1wbGFuZSBidWZmZXJzCisgKgorICogQ29udGFpbnMgZGF0YSBleGNoYW5nZWQgYnkgYXBwbGljYXRpb24gYW5kIGRyaXZlciB1c2luZyBvbmUgb2YgdGhlIFN0cmVhbWluZworICogSS9PIG1ldGhvZHMuCisgKi8KK3N0cnVjdCB2NGwyX2J1ZmZlciB7CisJX191MzIJCQlpbmRleDsKKwlfX3UzMgkJCXR5cGU7CisJX191MzIJCQlieXRlc3VzZWQ7CisJX191MzIJCQlmbGFnczsKKwlfX3UzMgkJCWZpZWxkOworCXN0cnVjdCB0aW1ldmFsCQl0aW1lc3RhbXA7CisJc3RydWN0IHY0bDJfdGltZWNvZGUJdGltZWNvZGU7CisJX191MzIJCQlzZXF1ZW5jZTsKKworCS8qIG1lbW9yeSBsb2NhdGlvbiAqLworCV9fdTMyCQkJbWVtb3J5OworCXVuaW9uIHsKKwkJX191MzIgICAgICAgICAgIG9mZnNldDsKKwkJdW5zaWduZWQgbG9uZyAgIHVzZXJwdHI7CisJCXN0cnVjdCB2NGwyX3BsYW5lICpwbGFuZXM7CisJCV9fczMyCQlmZDsKKwl9IG07CisJX191MzIJCQlsZW5ndGg7CisJX191MzIJCQlyZXNlcnZlZDI7CisJX191MzIJCQlyZXNlcnZlZDsKK307CisKKy8qICBGbGFncyBmb3IgJ2ZsYWdzJyBmaWVsZCAqLworLyogQnVmZmVyIGlzIG1hcHBlZCAoZmxhZykgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19NQVBQRUQJCQkweDAwMDAwMDAxCisvKiBCdWZmZXIgaXMgcXVldWVkIGZvciBwcm9jZXNzaW5nICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfUVVFVUVECQkJMHgwMDAwMDAwMgorLyogQnVmZmVyIGlzIHJlYWR5ICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfRE9ORQkJCTB4MDAwMDAwMDQKKy8qIEltYWdlIGlzIGEga2V5ZnJhbWUgKEktZnJhbWUpICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfS0VZRlJBTUUJCQkweDAwMDAwMDA4CisvKiBJbWFnZSBpcyBhIFAtZnJhbWUgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19QRlJBTUUJCQkweDAwMDAwMDEwCisvKiBJbWFnZSBpcyBhIEItZnJhbWUgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19CRlJBTUUJCQkweDAwMDAwMDIwCisvKiBCdWZmZXIgaXMgcmVhZHksIGJ1dCB0aGUgZGF0YSBjb250YWluZWQgd2l0aGluIGlzIGNvcnJ1cHRlZC4gKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19FUlJPUgkJCTB4MDAwMDAwNDAKKy8qIHRpbWVjb2RlIGZpZWxkIGlzIHZhbGlkICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfVElNRUNPREUJCQkweDAwMDAwMTAwCisvKiBCdWZmZXIgaXMgcHJlcGFyZWQgZm9yIHF1ZXVpbmcgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19QUkVQQVJFRAkJCTB4MDAwMDA0MDAKKy8qIENhY2hlIGhhbmRsaW5nIGZsYWdzICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfTk9fQ0FDSEVfSU5WQUxJREFURQkweDAwMDAwODAwCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfTk9fQ0FDSEVfQ0xFQU4JCTB4MDAwMDEwMDAKKy8qIFRpbWVzdGFtcCB0eXBlICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfVElNRVNUQU1QX01BU0sJCTB4MDAwMGUwMDAKKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19USU1FU1RBTVBfVU5LTk9XTgkJMHgwMDAwMDAwMAorI2RlZmluZSBWNEwyX0JVRl9GTEFHX1RJTUVTVEFNUF9NT05PVE9OSUMJMHgwMDAwMjAwMAorI2RlZmluZSBWNEwyX0JVRl9GTEFHX1RJTUVTVEFNUF9DT1BZCQkweDAwMDA0MDAwCisvKiBUaW1lc3RhbXAgc291cmNlcy4gKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19UU1RBTVBfU1JDX01BU0sJCTB4MDAwNzAwMDAKKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19UU1RBTVBfU1JDX0VPRgkJMHgwMDAwMDAwMAorI2RlZmluZSBWNEwyX0JVRl9GTEFHX1RTVEFNUF9TUkNfU09FCQkweDAwMDEwMDAwCisvKiBtZW0ybWVtIGVuY29kZXIvZGVjb2RlciAqLworI2RlZmluZSBWNEwyX0JVRl9GTEFHX0xBU1QJCQkweDAwMTAwMDAwCisKKy8qKgorICogc3RydWN0IHY0bDJfZXhwb3J0YnVmZmVyIC0gZXhwb3J0IG9mIHZpZGVvIGJ1ZmZlciBhcyBETUFCVUYgZmlsZSBkZXNjcmlwdG9yCisgKgorICogQGluZGV4OglpZCBudW1iZXIgb2YgdGhlIGJ1ZmZlcgorICogQHR5cGU6CWVudW0gdjRsMl9idWZfdHlwZTsgYnVmZmVyIHR5cGUgKHR5cGUgPT0gKl9NUExBTkUgZm9yCisgKgkJbXVsdGlwbGFuYXIgYnVmZmVycyk7CisgKiBAcGxhbmU6CWluZGV4IG9mIHRoZSBwbGFuZSB0byBiZSBleHBvcnRlZCwgMCBmb3Igc2luZ2xlIHBsYW5lIHF1ZXVlcworICogQGZsYWdzOglmbGFncyBmb3IgbmV3bHkgY3JlYXRlZCBmaWxlLCBjdXJyZW50bHkgb25seSBPX0NMT0VYRUMgaXMKKyAqCQlzdXBwb3J0ZWQsIHJlZmVyIHRvIG1hbnVhbCBvZiBvcGVuIHN5c2NhbGwgZm9yIG1vcmUgZGV0YWlscworICogQGZkOgkJZmlsZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCBETUFCVUYgKHNldCBieSBkcml2ZXIpCisgKgorICogQ29udGFpbnMgZGF0YSB1c2VkIGZvciBleHBvcnRpbmcgYSB2aWRlbyBidWZmZXIgYXMgRE1BQlVGIGZpbGUgZGVzY3JpcHRvci4KKyAqIFRoZSBidWZmZXIgaXMgaWRlbnRpZmllZCBieSBhICdjb29raWUnIHJldHVybmVkIGJ5IFZJRElPQ19RVUVSWUJVRgorICogKGlkZW50aWNhbCB0byB0aGUgY29va2llIHVzZWQgdG8gbW1hcCgpIHRoZSBidWZmZXIgdG8gdXNlcnNwYWNlKS4gQWxsCisgKiByZXNlcnZlZCBmaWVsZHMgbXVzdCBiZSBzZXQgdG8gemVyby4gVGhlIGZpZWxkIHJlc2VydmVkMCBpcyBleHBlY3RlZCB0bworICogYmVjb21lIGEgc3RydWN0dXJlICd0eXBlJyBhbGxvd2luZyBhbiBhbHRlcm5hdGl2ZSBsYXlvdXQgb2YgdGhlIHN0cnVjdHVyZQorICogY29udGVudC4gVGhlcmVmb3JlIHRoaXMgZmllbGQgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBhbnkgb3RoZXIgZXh0ZW5zaW9ucy4KKyAqLworc3RydWN0IHY0bDJfZXhwb3J0YnVmZmVyIHsKKwlfX3UzMgkJdHlwZTsgLyogZW51bSB2NGwyX2J1Zl90eXBlICovCisJX191MzIJCWluZGV4OworCV9fdTMyCQlwbGFuZTsKKwlfX3UzMgkJZmxhZ3M7CisJX19zMzIJCWZkOworCV9fdTMyCQlyZXNlcnZlZFsxMV07Cit9OworCisvKgorICoJTyBWIEUgUiBMIEEgWSAgIFAgUiBFIFYgSSBFIFcKKyAqLworc3RydWN0IHY0bDJfZnJhbWVidWZmZXIgeworCV9fdTMyCQkJY2FwYWJpbGl0eTsKKwlfX3UzMgkJCWZsYWdzOworLyogRklYTUU6IGluIHRoZW9yeSB3ZSBzaG91bGQgcGFzcyBzb21ldGhpbmcgbGlrZSBQQ0kgZGV2aWNlICsgbWVtb3J5CisgKiByZWdpb24gKyBvZmZzZXQgaW5zdGVhZCBvZiBzb21lIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwl2b2lkICAgICAgICAgICAgICAgICAgICAqYmFzZTsKKwlzdHJ1Y3QgeworCQlfX3UzMgkJd2lkdGg7CisJCV9fdTMyCQloZWlnaHQ7CisJCV9fdTMyCQlwaXhlbGZvcm1hdDsKKwkJX191MzIJCWZpZWxkOwkJLyogZW51bSB2NGwyX2ZpZWxkICovCisJCV9fdTMyCQlieXRlc3BlcmxpbmU7CS8qIGZvciBwYWRkaW5nLCB6ZXJvIGlmIHVudXNlZCAqLworCQlfX3UzMgkJc2l6ZWltYWdlOworCQlfX3UzMgkJY29sb3JzcGFjZTsJLyogZW51bSB2NGwyX2NvbG9yc3BhY2UgKi8KKwkJX191MzIJCXByaXY7CQkvKiByZXNlcnZlZCBmaWVsZCwgc2V0IHRvIDAgKi8KKwl9IGZtdDsKK307CisvKiAgRmxhZ3MgZm9yIHRoZSAnY2FwYWJpbGl0eScgZmllbGQuIFJlYWQgb25seSAqLworI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0VYVEVSTk9WRVJMQVkJMHgwMDAxCisjZGVmaW5lIFY0TDJfRkJVRl9DQVBfQ0hST01BS0VZCQkweDAwMDIKKyNkZWZpbmUgVjRMMl9GQlVGX0NBUF9MSVNUX0NMSVBQSU5HICAgICAweDAwMDQKKyNkZWZpbmUgVjRMMl9GQlVGX0NBUF9CSVRNQVBfQ0xJUFBJTkcJMHgwMDA4CisjZGVmaW5lIFY0TDJfRkJVRl9DQVBfTE9DQUxfQUxQSEEJMHgwMDEwCisjZGVmaW5lIFY0TDJfRkJVRl9DQVBfR0xPQkFMX0FMUEhBCTB4MDAyMAorI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0xPQ0FMX0lOVl9BTFBIQQkweDAwNDAKKyNkZWZpbmUgVjRMMl9GQlVGX0NBUF9TUkNfQ0hST01BS0VZCTB4MDA4MAorLyogIEZsYWdzIGZvciB0aGUgJ2ZsYWdzJyBmaWVsZC4gKi8KKyNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfUFJJTUFSWQkJMHgwMDAxCisjZGVmaW5lIFY0TDJfRkJVRl9GTEFHX09WRVJMQVkJCTB4MDAwMgorI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19DSFJPTUFLRVkJMHgwMDA0CisjZGVmaW5lIFY0TDJfRkJVRl9GTEFHX0xPQ0FMX0FMUEhBCTB4MDAwOAorI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19HTE9CQUxfQUxQSEEJMHgwMDEwCisjZGVmaW5lIFY0TDJfRkJVRl9GTEFHX0xPQ0FMX0lOVl9BTFBIQQkweDAwMjAKKyNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfU1JDX0NIUk9NQUtFWQkweDAwNDAKKworc3RydWN0IHY0bDJfY2xpcCB7CisJc3RydWN0IHY0bDJfcmVjdCAgICAgICAgYzsKKwlzdHJ1Y3QgdjRsMl9jbGlwCV9fdXNlciAqbmV4dDsKK307CisKK3N0cnVjdCB2NGwyX3dpbmRvdyB7CisJc3RydWN0IHY0bDJfcmVjdCAgICAgICAgdzsKKwlfX3UzMgkJCWZpZWxkOwkgLyogZW51bSB2NGwyX2ZpZWxkICovCisJX191MzIJCQljaHJvbWFrZXk7CisJc3RydWN0IHY0bDJfY2xpcAlfX3VzZXIgKmNsaXBzOworCV9fdTMyCQkJY2xpcGNvdW50OworCXZvaWQJCQlfX3VzZXIgKmJpdG1hcDsKKwlfX3U4ICAgICAgICAgICAgICAgICAgICBnbG9iYWxfYWxwaGE7Cit9OworCisvKgorICoJQyBBIFAgVCBVIFIgRSAgIFAgQSBSIEEgTSBFIFQgRSBSIFMKKyAqLworc3RydWN0IHY0bDJfY2FwdHVyZXBhcm0geworCV9fdTMyCQkgICBjYXBhYmlsaXR5OwkgIC8qICBTdXBwb3J0ZWQgbW9kZXMgKi8KKwlfX3UzMgkJICAgY2FwdHVyZW1vZGU7CSAgLyogIEN1cnJlbnQgbW9kZSAqLworCXN0cnVjdCB2NGwyX2ZyYWN0ICB0aW1lcGVyZnJhbWU7ICAvKiAgVGltZSBwZXIgZnJhbWUgaW4gc2Vjb25kcyAqLworCV9fdTMyCQkgICBleHRlbmRlZG1vZGU7ICAvKiAgRHJpdmVyLXNwZWNpZmljIGV4dGVuc2lvbnMgKi8KKwlfX3UzMiAgICAgICAgICAgICAgcmVhZGJ1ZmZlcnM7ICAgLyogICMgb2YgYnVmZmVycyBmb3IgcmVhZCAqLworCV9fdTMyCQkgICByZXNlcnZlZFs0XTsKK307CisKKy8qICBGbGFncyBmb3IgJ2NhcGFiaWxpdHknIGFuZCAnY2FwdHVyZW1vZGUnIGZpZWxkcyAqLworI2RlZmluZSBWNEwyX01PREVfSElHSFFVQUxJVFkJMHgwMDAxCS8qICBIaWdoIHF1YWxpdHkgaW1hZ2luZyBtb2RlICovCisjZGVmaW5lIFY0TDJfQ0FQX1RJTUVQRVJGUkFNRQkweDEwMDAJLyogIHRpbWVwZXJmcmFtZSBmaWVsZCBpcyBzdXBwb3J0ZWQgKi8KKworc3RydWN0IHY0bDJfb3V0cHV0cGFybSB7CisJX191MzIJCSAgIGNhcGFiaWxpdHk7CSAvKiAgU3VwcG9ydGVkIG1vZGVzICovCisJX191MzIJCSAgIG91dHB1dG1vZGU7CSAvKiAgQ3VycmVudCBtb2RlICovCisJc3RydWN0IHY0bDJfZnJhY3QgIHRpbWVwZXJmcmFtZTsgLyogIFRpbWUgcGVyIGZyYW1lIGluIHNlY29uZHMgKi8KKwlfX3UzMgkJICAgZXh0ZW5kZWRtb2RlOyAvKiAgRHJpdmVyLXNwZWNpZmljIGV4dGVuc2lvbnMgKi8KKwlfX3UzMiAgICAgICAgICAgICAgd3JpdGVidWZmZXJzOyAvKiAgIyBvZiBidWZmZXJzIGZvciB3cml0ZSAqLworCV9fdTMyCQkgICByZXNlcnZlZFs0XTsKK307CisKKy8qCisgKglJIE4gUCBVIFQgICBJIE0gQSBHIEUgICBDIFIgTyBQIFAgSSBOIEcKKyAqLworc3RydWN0IHY0bDJfY3JvcGNhcCB7CisJX191MzIJCQl0eXBlOwkvKiBlbnVtIHY0bDJfYnVmX3R5cGUgKi8KKwlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICBib3VuZHM7CisJc3RydWN0IHY0bDJfcmVjdCAgICAgICAgZGVmcmVjdDsKKwlzdHJ1Y3QgdjRsMl9mcmFjdCAgICAgICBwaXhlbGFzcGVjdDsKK307CisKK3N0cnVjdCB2NGwyX2Nyb3AgeworCV9fdTMyCQkJdHlwZTsJLyogZW51bSB2NGwyX2J1Zl90eXBlICovCisJc3RydWN0IHY0bDJfcmVjdCAgICAgICAgYzsKK307CisKKy8qKgorICogc3RydWN0IHY0bDJfc2VsZWN0aW9uIC0gc2VsZWN0aW9uIGluZm8KKyAqIEB0eXBlOglidWZmZXIgdHlwZSAoZG8gbm90IHVzZSAqX01QTEFORSB0eXBlcykKKyAqIEB0YXJnZXQ6CVNlbGVjdGlvbiB0YXJnZXQsIHVzZWQgdG8gY2hvb3NlIG9uZSBvZiBwb3NzaWJsZSByZWN0YW5nbGVzOworICoJCWRlZmluZWQgaW4gdjRsMi1jb21tb24uaDsgVjRMMl9TRUxfVEdUXyogLgorICogQGZsYWdzOgljb25zdHJhaW50cyBmbGFncywgZGVmaW5lZCBpbiB2NGwyLWNvbW1vbi5oOyBWNEwyX1NFTF9GTEFHXyouCisgKiBAcjoJCWNvb3JkaW5hdGVzIG9mIHNlbGVjdGlvbiB3aW5kb3cKKyAqIEByZXNlcnZlZDoJZm9yIGZ1dHVyZSB1c2UsIHJvdW5kcyBzdHJ1Y3R1cmUgc2l6ZSB0byA2NCBieXRlcywgc2V0IHRvIHplcm8KKyAqCisgKiBIYXJkd2FyZSBtYXkgdXNlIG11bHRpcGxlIGhlbHBlciB3aW5kb3dzIHRvIHByb2Nlc3MgYSB2aWRlbyBzdHJlYW0uCisgKiBUaGUgc3RydWN0dXJlIGlzIHVzZWQgdG8gZXhjaGFuZ2UgdGhpcyBzZWxlY3Rpb24gYXJlYXMgYmV0d2VlbgorICogYW4gYXBwbGljYXRpb24gYW5kIGEgZHJpdmVyLgorICovCitzdHJ1Y3QgdjRsMl9zZWxlY3Rpb24geworCV9fdTMyCQkJdHlwZTsKKwlfX3UzMgkJCXRhcmdldDsKKwlfX3UzMiAgICAgICAgICAgICAgICAgICBmbGFnczsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICByOworCV9fdTMyICAgICAgICAgICAgICAgICAgIHJlc2VydmVkWzldOworfTsKKworCisvKgorICogICAgICBBIE4gQSBMIE8gRyAgIFYgSSBEIEUgTyAgIFMgVCBBIE4gRCBBIFIgRAorICovCisKK3R5cGVkZWYgX191NjQgdjRsMl9zdGRfaWQ7CisKKy8qIG9uZSBiaXQgZm9yIGVhY2ggKi8KKyNkZWZpbmUgVjRMMl9TVERfUEFMX0IgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDAxKQorI2RlZmluZSBWNEwyX1NURF9QQUxfQjEgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwMDIpCisjZGVmaW5lIFY0TDJfU1REX1BBTF9HICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDAwNCkKKyNkZWZpbmUgVjRMMl9TVERfUEFMX0ggICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDA4KQorI2RlZmluZSBWNEwyX1NURF9QQUxfSSAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwMTApCisjZGVmaW5lIFY0TDJfU1REX1BBTF9EICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDAyMCkKKyNkZWZpbmUgVjRMMl9TVERfUEFMX0QxICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDQwKQorI2RlZmluZSBWNEwyX1NURF9QQUxfSyAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwODApCisKKyNkZWZpbmUgVjRMMl9TVERfUEFMX00gICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMTAwKQorI2RlZmluZSBWNEwyX1NURF9QQUxfTiAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAyMDApCisjZGVmaW5lIFY0TDJfU1REX1BBTF9OYyAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDQwMCkKKyNkZWZpbmUgVjRMMl9TVERfUEFMXzYwICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwODAwKQorCisjZGVmaW5lIFY0TDJfU1REX05UU0NfTSAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMTAwMCkJLyogQlRTQyAqLworI2RlZmluZSBWNEwyX1NURF9OVFNDX01fSlAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDIwMDApCS8qIEVJQS1KICovCisjZGVmaW5lIFY0TDJfU1REX05UU0NfNDQzICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwNDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfTlRTQ19NX0tSICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDA4MDAwKQkvKiBGTSBBMiAqLworCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0IgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAxMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fRCAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDIwMDAwKQorI2RlZmluZSBWNEwyX1NURF9TRUNBTV9HICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwNDAwMDApCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0ggICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDA4MDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fSyAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMTAwMDAwKQorI2RlZmluZSBWNEwyX1NURF9TRUNBTV9LMSAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAyMDAwMDApCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0wgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDQwMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fTEMgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwODAwMDAwKQorCisvKiBBVFNDL0hEVFYgKi8KKyNkZWZpbmUgVjRMMl9TVERfQVRTQ184X1ZTQiAgICAgKCh2NGwyX3N0ZF9pZCkweDAxMDAwMDAwKQorI2RlZmluZSBWNEwyX1NURF9BVFNDXzE2X1ZTQiAgICAoKHY0bDJfc3RkX2lkKTB4MDIwMDAwMDApCisKKy8qIEZJWE1FOgorICAgQWx0aG91Z2ggc3RkX2lkIGlzIDY0IGJpdHMsIHRoZXJlIGlzIGFuIGlzc3VlIG9uIFBQQzMyIGFyY2hpdGVjdHVyZSB0aGF0CisgICBtYWtlcyBzd2l0Y2goX191NjQpIHRvIGJyZWFrLiBTbywgdGhlcmUncyBhIGhhY2sgb24gdjRsMi1jb21tb24uYyByb3VuZGluZworICAgdGhpcyB2YWx1ZSB0byAzMiBiaXRzLgorICAgQXMsIGN1cnJlbnRseSwgdGhlIG1heCB2YWx1ZSBpcyBmb3IgVjRMMl9TVERfQVRTQ18xNl9WU0IgKDMwIGJpdHMgd2lkZSksCisgICBpdCBzaG91bGQgd29yayBmaW5lLiBIb3dldmVyLCBpZiBuZWVkZWQgdG8gYWRkIG1vcmUgdGhhbiB0d28gc3RhbmRhcmRzLAorICAgdjRsMi1jb21tb24uYyBzaG91bGQgYmUgZml4ZWQuCisgKi8KKworLyoKKyAqIFNvbWUgbWFjcm9zIHRvIG1lcmdlIHZpZGVvIHN0YW5kYXJkcyBpbiBvcmRlciB0byBtYWtlIGxpdmUgZWFzaWVyIGZvciB0aGUKKyAqIGRyaXZlcnMgYW5kIFY0TDIgYXBwbGljYXRpb25zCisgKi8KKworLyoKKyAqICJDb21tb24iIE5UU0MvTSAtIEl0IHNob3VsZCBiZSBub3RpY2VkIHRoYXQgVjRMMl9TVERfTlRTQ180NDMgaXMKKyAqIE1pc3NpbmcgaGVyZS4KKyAqLworI2RlZmluZSBWNEwyX1NURF9OVFNDICAgICAgICAgICAoVjRMMl9TVERfTlRTQ19NCXxcCisJCQkJIFY0TDJfU1REX05UU0NfTV9KUCAgICAgfFwKKwkJCQkgVjRMMl9TVERfTlRTQ19NX0tSKQorLyogU2VjYW0gbWFjcm9zICovCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0RLICAgICAgCShWNEwyX1NURF9TRUNBTV9ECXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0sJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fSzEpCisvKiBBbGwgU2VjYW0gU3RhbmRhcmRzICovCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNCQkoVjRMMl9TVERfU0VDQU1fQgl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9HCXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0gJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fREsJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fTCAgICAgICB8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9MQykKKy8qIFBBTCBtYWNyb3MgKi8KKyNkZWZpbmUgVjRMMl9TVERfUEFMX0JHCQkoVjRMMl9TVERfUEFMX0IJCXxcCisJCQkJIFY0TDJfU1REX1BBTF9CMQl8XAorCQkJCSBWNEwyX1NURF9QQUxfRykKKyNkZWZpbmUgVjRMMl9TVERfUEFMX0RLCQkoVjRMMl9TVERfUEFMX0QJCXxcCisJCQkJIFY0TDJfU1REX1BBTF9EMQl8XAorCQkJCSBWNEwyX1NURF9QQUxfSykKKy8qCisgKiAiQ29tbW9uIiBQQUwgLSBUaGlzIG1hY3JvIGlzIHRoZXJlIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgb2xkCisgKiBWNEwxIGNvbmNlcHQgb2YgIlBBTCI6IC9CR0RLSEkuCisgKiBTZXZlcmFsIFBBTCBzdGFuZGFyZHMgYXJlIG1pc3NpbmcgaGVyZTogL00sIC9OIGFuZCAvTmMKKyAqLworI2RlZmluZSBWNEwyX1NURF9QQUwJCShWNEwyX1NURF9QQUxfQkcJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0RLCXxcCisJCQkJIFY0TDJfU1REX1BBTF9ICQl8XAorCQkJCSBWNEwyX1NURF9QQUxfSSkKKy8qIENocm9tYSAiYWdub3N0aWMiIHN0YW5kYXJkcyAqLworI2RlZmluZSBWNEwyX1NURF9CCQkoVjRMMl9TVERfUEFMX0IJCXxcCisJCQkJIFY0TDJfU1REX1BBTF9CMQl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9CKQorI2RlZmluZSBWNEwyX1NURF9HCQkoVjRMMl9TVERfUEFMX0cJCXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0cpCisjZGVmaW5lIFY0TDJfU1REX0gJCShWNEwyX1NURF9QQUxfSAkJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fSCkKKyNkZWZpbmUgVjRMMl9TVERfTAkJKFY0TDJfU1REX1NFQ0FNX0wJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fTEMpCisjZGVmaW5lIFY0TDJfU1REX0dICQkoVjRMMl9TVERfRwkJfFwKKwkJCQkgVjRMMl9TVERfSCkKKyNkZWZpbmUgVjRMMl9TVERfREsJCShWNEwyX1NURF9QQUxfREsJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fREspCisjZGVmaW5lIFY0TDJfU1REX0JHCQkoVjRMMl9TVERfQgkJfFwKKwkJCQkgVjRMMl9TVERfRykKKyNkZWZpbmUgVjRMMl9TVERfTU4JCShWNEwyX1NURF9QQUxfTQkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX04JCXxcCisJCQkJIFY0TDJfU1REX1BBTF9OYwl8XAorCQkJCSBWNEwyX1NURF9OVFNDKQorCisvKiBTdGFuZGFyZHMgd2hlcmUgTVRTL0JUU0Mgc3RlcmVvIGNvdWxkIGJlIGZvdW5kICovCisjZGVmaW5lIFY0TDJfU1REX01UUwkJKFY0TDJfU1REX05UU0NfTQl8XAorCQkJCSBWNEwyX1NURF9QQUxfTQkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX04JCXxcCisJCQkJIFY0TDJfU1REX1BBTF9OYykKKworLyogU3RhbmRhcmRzIGZvciBDb3VudHJpZXMgd2l0aCA2MEh6IExpbmUgZnJlcXVlbmN5ICovCisjZGVmaW5lIFY0TDJfU1REXzUyNV82MAkJKFY0TDJfU1REX1BBTF9NCQl8XAorCQkJCSBWNEwyX1NURF9QQUxfNjAJfFwKKwkJCQkgVjRMMl9TVERfTlRTQwkJfFwKKwkJCQkgVjRMMl9TVERfTlRTQ180NDMpCisvKiBTdGFuZGFyZHMgZm9yIENvdW50cmllcyB3aXRoIDUwSHogTGluZSBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgVjRMMl9TVERfNjI1XzUwCQkoVjRMMl9TVERfUEFMCQl8XAorCQkJCSBWNEwyX1NURF9QQUxfTgkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX05jCXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNKQorCisjZGVmaW5lIFY0TDJfU1REX0FUU0MgICAgICAgICAgIChWNEwyX1NURF9BVFNDXzhfVlNCICAgIHxcCisJCQkJIFY0TDJfU1REX0FUU0NfMTZfVlNCKQorLyogTWFjcm9zIHdpdGggbm9uZSBhbmQgYWxsIGFuYWxvZyBzdGFuZGFyZHMgKi8KKyNkZWZpbmUgVjRMMl9TVERfVU5LTk9XTiAgICAgICAgMAorI2RlZmluZSBWNEwyX1NURF9BTEwgICAgICAgICAgICAoVjRMMl9TVERfNTI1XzYwCXxcCisJCQkJIFY0TDJfU1REXzYyNV81MCkKKworc3RydWN0IHY0bDJfc3RhbmRhcmQgeworCV9fdTMyCQkgICAgIGluZGV4OworCXY0bDJfc3RkX2lkICAgICAgICAgIGlkOworCV9fdTgJCSAgICAgbmFtZVsyNF07CisJc3RydWN0IHY0bDJfZnJhY3QgICAgZnJhbWVwZXJpb2Q7IC8qIEZyYW1lcywgbm90IGZpZWxkcyAqLworCV9fdTMyCQkgICAgIGZyYW1lbGluZXM7CisJX191MzIJCSAgICAgcmVzZXJ2ZWRbNF07Cit9OworCisvKgorICoJRCBWIAlCIFQJVCBJIE0gSSBOIEcgUworICovCisKKy8qKiBzdHJ1Y3QgdjRsMl9idF90aW1pbmdzIC0gQlQuNjU2L0JULjExMjAgdGltaW5nIGRhdGEKKyAqIEB3aWR0aDoJdG90YWwgd2lkdGggb2YgdGhlIGFjdGl2ZSB2aWRlbyBpbiBwaXhlbHMKKyAqIEBoZWlnaHQ6CXRvdGFsIGhlaWdodCBvZiB0aGUgYWN0aXZlIHZpZGVvIGluIGxpbmVzCisgKiBAaW50ZXJsYWNlZDoJSW50ZXJsYWNlZCBvciBwcm9ncmVzc2l2ZQorICogQHBvbGFyaXRpZXM6CVBvc2l0aXZlIG9yIG5lZ2F0aXZlIHBvbGFyaXRpZXMKKyAqIEBwaXhlbGNsb2NrOglQaXhlbCBjbG9jayBpbiBIWi4gRXguIDc0LjI1TUh6LT43NDI1MDAwMAorICogQGhmcm9udHBvcmNoOkhvcml6b250YWwgZnJvbnQgcG9yY2ggaW4gcGl4ZWxzCisgKiBAaHN5bmM6CUhvcml6b250YWwgU3luYyBsZW5ndGggaW4gcGl4ZWxzCisgKiBAaGJhY2twb3JjaDoJSG9yaXpvbnRhbCBiYWNrIHBvcmNoIGluIHBpeGVscworICogQHZmcm9udHBvcmNoOlZlcnRpY2FsIGZyb250IHBvcmNoIGluIGxpbmVzCisgKiBAdnN5bmM6CVZlcnRpY2FsIFN5bmMgbGVuZ3RoIGluIGxpbmVzCisgKiBAdmJhY2twb3JjaDoJVmVydGljYWwgYmFjayBwb3JjaCBpbiBsaW5lcworICogQGlsX3Zmcm9udHBvcmNoOlZlcnRpY2FsIGZyb250IHBvcmNoIGZvciB0aGUgZXZlbiBmaWVsZAorICoJCShha2EgZmllbGQgMikgb2YgaW50ZXJsYWNlZCBmaWVsZCBmb3JtYXRzCisgKiBAaWxfdnN5bmM6CVZlcnRpY2FsIFN5bmMgbGVuZ3RoIGZvciB0aGUgZXZlbiBmaWVsZAorICoJCShha2EgZmllbGQgMikgb2YgaW50ZXJsYWNlZCBmaWVsZCBmb3JtYXRzCisgKiBAaWxfdmJhY2twb3JjaDpWZXJ0aWNhbCBiYWNrIHBvcmNoIGZvciB0aGUgZXZlbiBmaWVsZAorICoJCShha2EgZmllbGQgMikgb2YgaW50ZXJsYWNlZCBmaWVsZCBmb3JtYXRzCisgKiBAc3RhbmRhcmRzOglTdGFuZGFyZHMgdGhlIHRpbWluZyBiZWxvbmdzIHRvCisgKiBAZmxhZ3M6CUZsYWdzCisgKiBAcGljdHVyZV9hc3BlY3Q6IFRoZSBwaWN0dXJlIGFzcGVjdCByYXRpbyAoaG9yL3ZlcnQpLgorICogQGNlYTg2MV92aWM6CVZJQyBjb2RlIGFzIHBlciB0aGUgQ0VBLTg2MSBzdGFuZGFyZC4KKyAqIEBoZG1pX3ZpYzoJVklDIGNvZGUgYXMgcGVyIHRoZSBIRE1JIHN0YW5kYXJkLgorICogQHJlc2VydmVkOglSZXNlcnZlZCBmaWVsZHMsIG11c3QgYmUgemVyb2VkLgorICoKKyAqIEEgbm90ZSByZWdhcmRpbmcgdmVydGljYWwgaW50ZXJsYWNlZCB0aW1pbmdzOiBoZWlnaHQgcmVmZXJzIHRvIHRoZSB0b3RhbAorICogaGVpZ2h0IG9mIHRoZSBhY3RpdmUgdmlkZW8gZnJhbWUgKD0gdHdvIGZpZWxkcykuIFRoZSBibGFua2luZyB0aW1pbmdzIHJlZmVyCisgKiB0byB0aGUgYmxhbmtpbmcgb2YgZWFjaCBmaWVsZC4gU28gdGhlIGhlaWdodCBvZiB0aGUgdG90YWwgZnJhbWUgaXMKKyAqIGNhbGN1bGF0ZWQgYXMgZm9sbG93czoKKyAqCisgKiB0b3RfaGVpZ2h0ID0gaGVpZ2h0ICsgdmZyb250cG9yY2ggKyB2c3luYyArIHZiYWNrcG9yY2ggKworICogICAgICAgICAgICAgICAgICAgICAgIGlsX3Zmcm9udHBvcmNoICsgaWxfdnN5bmMgKyBpbF92YmFja3BvcmNoCisgKgorICogVGhlIGFjdGl2ZSBoZWlnaHQgb2YgZWFjaCBmaWVsZCBpcyBoZWlnaHQgLyAyLgorICovCitzdHJ1Y3QgdjRsMl9idF90aW1pbmdzIHsKKwlfX3UzMgl3aWR0aDsKKwlfX3UzMgloZWlnaHQ7CisJX191MzIJaW50ZXJsYWNlZDsKKwlfX3UzMglwb2xhcml0aWVzOworCV9fdTY0CXBpeGVsY2xvY2s7CisJX191MzIJaGZyb250cG9yY2g7CisJX191MzIJaHN5bmM7CisJX191MzIJaGJhY2twb3JjaDsKKwlfX3UzMgl2ZnJvbnRwb3JjaDsKKwlfX3UzMgl2c3luYzsKKwlfX3UzMgl2YmFja3BvcmNoOworCV9fdTMyCWlsX3Zmcm9udHBvcmNoOworCV9fdTMyCWlsX3ZzeW5jOworCV9fdTMyCWlsX3ZiYWNrcG9yY2g7CisJX191MzIJc3RhbmRhcmRzOworCV9fdTMyCWZsYWdzOworCXN0cnVjdCB2NGwyX2ZyYWN0IHBpY3R1cmVfYXNwZWN0OworCV9fdTgJY2VhODYxX3ZpYzsKKwlfX3U4CWhkbWlfdmljOworCV9fdTgJcmVzZXJ2ZWRbNDZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEludGVybGFjZWQgb3IgcHJvZ3Jlc3NpdmUgZm9ybWF0ICovCisjZGVmaW5lCVY0TDJfRFZfUFJPR1JFU1NJVkUJMAorI2RlZmluZQlWNEwyX0RWX0lOVEVSTEFDRUQJMQorCisvKiBQb2xhcml0aWVzLiBJZiBiaXQgaXMgbm90IHNldCwgaXQgaXMgYXNzdW1lZCB0byBiZSBuZWdhdGl2ZSBwb2xhcml0eSAqLworI2RlZmluZSBWNEwyX0RWX1ZTWU5DX1BPU19QT0wJMHgwMDAwMDAwMQorI2RlZmluZSBWNEwyX0RWX0hTWU5DX1BPU19QT0wJMHgwMDAwMDAwMgorCisvKiBUaW1pbmdzIHN0YW5kYXJkcyAqLworI2RlZmluZSBWNEwyX0RWX0JUX1NURF9DRUE4NjEJKDEgPDwgMCkgIC8qIENFQS04NjEgRGlnaXRhbCBUViBQcm9maWxlICovCisjZGVmaW5lIFY0TDJfRFZfQlRfU1REX0RNVAkoMSA8PCAxKSAgLyogVkVTQSBEaXNjcmV0ZSBNb25pdG9yIFRpbWluZ3MgKi8KKyNkZWZpbmUgVjRMMl9EVl9CVF9TVERfQ1ZUCSgxIDw8IDIpICAvKiBWRVNBIENvb3JkaW5hdGVkIFZpZGVvIFRpbWluZ3MgKi8KKyNkZWZpbmUgVjRMMl9EVl9CVF9TVERfR1RGCSgxIDw8IDMpICAvKiBWRVNBIEdlbmVyYWxpemVkIFRpbWluZ3MgRm9ybXVsYSAqLworI2RlZmluZSBWNEwyX0RWX0JUX1NURF9TREkJKDEgPDwgNCkgIC8qIFNESSBUaW1pbmdzICovCisKKy8qIEZsYWdzICovCisKKy8qCisgKiBDVlQvR1RGIHNwZWNpZmljOiB0aW1pbmcgdXNlcyByZWR1Y2VkIGJsYW5raW5nIChDVlQpIG9yIHRoZSAnU2Vjb25kYXJ5CisgKiBHVEYnIGN1cnZlIChHVEYpLiBJbiBib3RoIGNhc2VzIHRoZSBob3Jpem9udGFsIGFuZC9vciB2ZXJ0aWNhbCBibGFua2luZworICogaW50ZXJ2YWxzIGFyZSByZWR1Y2VkLCBhbGxvd2luZyBhIGhpZ2hlciByZXNvbHV0aW9uIG92ZXIgdGhlIHNhbWUKKyAqIGJhbmR3aWR0aC4gVGhpcyBpcyBhIHJlYWQtb25seSBmbGFnLgorICovCisjZGVmaW5lIFY0TDJfRFZfRkxfUkVEVUNFRF9CTEFOS0lORwkJKDEgPDwgMCkKKy8qCisgKiBDRUEtODYxIHNwZWNpZmljOiBzZXQgZm9yIENFQS04NjEgZm9ybWF0cyB3aXRoIGEgZnJhbWVyYXRlIG9mIGEgbXVsdGlwbGUKKyAqIG9mIHNpeC4gVGhlc2UgZm9ybWF0cyBjYW4gYmUgb3B0aW9uYWxseSBwbGF5ZWQgYXQgMSAvIDEuMDAxIHNwZWVkLgorICogVGhpcyBpcyBhIHJlYWQtb25seSBmbGFnLgorICovCisjZGVmaW5lIFY0TDJfRFZfRkxfQ0FOX1JFRFVDRV9GUFMJCSgxIDw8IDEpCisvKgorICogQ0VBLTg2MSBzcGVjaWZpYzogb25seSB2YWxpZCBmb3IgdmlkZW8gdHJhbnNtaXR0ZXJzLCB0aGUgZmxhZyBpcyBjbGVhcmVkCisgKiBieSByZWNlaXZlcnMuCisgKiBJZiB0aGUgZnJhbWVyYXRlIG9mIHRoZSBmb3JtYXQgaXMgYSBtdWx0aXBsZSBvZiBzaXgsIHRoZW4gdGhlIHBpeGVsY2xvY2sKKyAqIHVzZWQgdG8gc2V0IHVwIHRoZSB0cmFuc21pdHRlciBpcyBkaXZpZGVkIGJ5IDEuMDAxIHRvIG1ha2UgaXQgY29tcGF0aWJsZQorICogd2l0aCA2MCBIeiBiYXNlZCBzdGFuZGFyZHMgc3VjaCBhcyBOVFNDIGFuZCBQQUwtTSB0aGF0IHVzZSBhIGZyYW1lcmF0ZSBvZgorICogMjkuOTcgSHouIE90aGVyd2lzZSB0aGlzIGZsYWcgaXMgY2xlYXJlZC4gSWYgdGhlIHRyYW5zbWl0dGVyIGNhbid0IGdlbmVyYXRlCisgKiBzdWNoIGZyZXF1ZW5jaWVzLCB0aGVuIHRoZSBmbGFnIHdpbGwgYWxzbyBiZSBjbGVhcmVkLgorICovCisjZGVmaW5lIFY0TDJfRFZfRkxfUkVEVUNFRF9GUFMJCQkoMSA8PCAyKQorLyoKKyAqIFNwZWNpZmljIHRvIGludGVybGFjZWQgZm9ybWF0czogaWYgc2V0LCB0aGVuIGZpZWxkIDEgaXMgcmVhbGx5IG9uZSBoYWxmLWxpbmUKKyAqIGxvbmdlciBhbmQgZmllbGQgMiBpcyByZWFsbHkgb25lIGhhbGYtbGluZSBzaG9ydGVyLCBzbyBlYWNoIGZpZWxkIGhhcworICogZXhhY3RseSB0aGUgc2FtZSBudW1iZXIgb2YgaGFsZi1saW5lcy4gV2hldGhlciBoYWxmLWxpbmVzIGNhbiBiZSBkZXRlY3RlZAorICogb3IgdXNlZCBkZXBlbmRzIG9uIHRoZSBoYXJkd2FyZS4KKyAqLworI2RlZmluZSBWNEwyX0RWX0ZMX0hBTEZfTElORQkJCSgxIDw8IDMpCisvKgorICogSWYgc2V0LCB0aGVuIHRoaXMgaXMgYSBDb25zdW1lciBFbGVjdHJvbmljcyAoQ0UpIHZpZGVvIGZvcm1hdC4gU3VjaCBmb3JtYXRzCisgKiBkaWZmZXIgZnJvbSBvdGhlciBmb3JtYXRzIChjb21tb25seSBjYWxsZWQgSVQgZm9ybWF0cykgaW4gdGhhdCBpZiBSR0IKKyAqIGVuY29kaW5nIGlzIHVzZWQgdGhlbiBieSBkZWZhdWx0IHRoZSBSR0IgdmFsdWVzIHVzZSBsaW1pdGVkIHJhbmdlIChpLmUuCisgKiB1c2UgdGhlIHJhbmdlIDE2LTIzNSkgYXMgb3Bwb3NlZCB0byAwLTI1NS4gQWxsIGZvcm1hdHMgZGVmaW5lZCBpbiBDRUEtODYxCisgKiBleGNlcHQgZm9yIHRoZSA2NDB4NDgwIGZvcm1hdCBhcmUgQ0UgZm9ybWF0cy4KKyAqLworI2RlZmluZSBWNEwyX0RWX0ZMX0lTX0NFX1ZJREVPCQkJKDEgPDwgNCkKKy8qIFNvbWUgZm9ybWF0cyBsaWtlIFNNUFRFLTEyNU0gaGF2ZSBhbiBpbnRlcmxhY2VkIHNpZ25hbCB3aXRoIGEgb2RkCisgKiB0b3RhbCBoZWlnaHQuIEZvciB0aGVzZSBmb3JtYXRzLCBpZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgZmlyc3QKKyAqIGZpZWxkIGhhcyB0aGUgZXh0cmEgbGluZS4gSWYgbm90LCBpdCBpcyB0aGUgc2Vjb25kIGZpZWxkLgorICovCisjZGVmaW5lIFY0TDJfRFZfRkxfRklSU1RfRklFTERfRVhUUkFfTElORQkoMSA8PCA1KQorLyoKKyAqIElmIHNldCwgdGhlbiB0aGUgcGljdHVyZV9hc3BlY3QgZmllbGQgaXMgdmFsaWQuIE90aGVyd2lzZSBhc3N1bWUgdGhhdCB0aGUKKyAqIHBpeGVscyBhcmUgc3F1YXJlLCBzbyB0aGUgcGljdHVyZSBhc3BlY3QgcmF0aW8gaXMgdGhlIHNhbWUgYXMgdGhlIHdpZHRoIHRvCisgKiBoZWlnaHQgcmF0aW8uCisgKi8KKyNkZWZpbmUgVjRMMl9EVl9GTF9IQVNfUElDVFVSRV9BU1BFQ1QJCSgxIDw8IDYpCisvKgorICogSWYgc2V0LCB0aGVuIHRoZSBjZWE4NjFfdmljIGZpZWxkIGlzIHZhbGlkIGFuZCBjb250YWlucyB0aGUgVmlkZW8KKyAqIElkZW50aWZpY2F0aW9uIENvZGUgYXMgcGVyIHRoZSBDRUEtODYxIHN0YW5kYXJkLgorICovCisjZGVmaW5lIFY0TDJfRFZfRkxfSEFTX0NFQTg2MV9WSUMJCSgxIDw8IDcpCisvKgorICogSWYgc2V0LCB0aGVuIHRoZSBoZG1pX3ZpYyBmaWVsZCBpcyB2YWxpZCBhbmQgY29udGFpbnMgdGhlIFZpZGVvCisgKiBJZGVudGlmaWNhdGlvbiBDb2RlIGFzIHBlciB0aGUgSERNSSBzdGFuZGFyZCAoSERNSSBWZW5kb3IgU3BlY2lmaWMKKyAqIEluZm9GcmFtZSkuCisgKi8KKyNkZWZpbmUgVjRMMl9EVl9GTF9IQVNfSERNSV9WSUMJCQkoMSA8PCA4KQorCisvKiBBIGZldyB1c2VmdWwgZGVmaW5lcyB0byBjYWxjdWxhdGUgdGhlIHRvdGFsIGJsYW5raW5nIGFuZCBmcmFtZSBzaXplcyAqLworI2RlZmluZSBWNEwyX0RWX0JUX0JMQU5LSU5HX1dJRFRIKGJ0KSBcCisJKChidCktPmhmcm9udHBvcmNoICsgKGJ0KS0+aHN5bmMgKyAoYnQpLT5oYmFja3BvcmNoKQorI2RlZmluZSBWNEwyX0RWX0JUX0ZSQU1FX1dJRFRIKGJ0KSBcCisJKChidCktPndpZHRoICsgVjRMMl9EVl9CVF9CTEFOS0lOR19XSURUSChidCkpCisjZGVmaW5lIFY0TDJfRFZfQlRfQkxBTktJTkdfSEVJR0hUKGJ0KSBcCisJKChidCktPnZmcm9udHBvcmNoICsgKGJ0KS0+dnN5bmMgKyAoYnQpLT52YmFja3BvcmNoICsgXAorCSAoYnQpLT5pbF92ZnJvbnRwb3JjaCArIChidCktPmlsX3ZzeW5jICsgKGJ0KS0+aWxfdmJhY2twb3JjaCkKKyNkZWZpbmUgVjRMMl9EVl9CVF9GUkFNRV9IRUlHSFQoYnQpIFwKKwkoKGJ0KS0+aGVpZ2h0ICsgVjRMMl9EVl9CVF9CTEFOS0lOR19IRUlHSFQoYnQpKQorCisvKiogc3RydWN0IHY0bDJfZHZfdGltaW5ncyAtIERWIHRpbWluZ3MKKyAqIEB0eXBlOgl0aGUgdHlwZSBvZiB0aGUgdGltaW5ncworICogQGJ0OglCVDY1Ni8xMTIwIHRpbWluZ3MKKyAqLworc3RydWN0IHY0bDJfZHZfdGltaW5ncyB7CisJX191MzIgdHlwZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB2NGwyX2J0X3RpbWluZ3MJYnQ7CisJCV9fdTMyCXJlc2VydmVkWzMyXTsKKwl9OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFZhbHVlcyBmb3IgdGhlIHR5cGUgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9EVl9CVF82NTZfMTEyMAkwCS8qIEJULjY1Ni8xMTIwIHRpbWluZyB0eXBlICovCisKKworLyoqIHN0cnVjdCB2NGwyX2VudW1fZHZfdGltaW5ncyAtIERWIHRpbWluZ3MgZW51bWVyYXRpb24KKyAqIEBpbmRleDoJZW51bWVyYXRpb24gaW5kZXgKKyAqIEBwYWQ6CXRoZSBwYWQgbnVtYmVyIGZvciB3aGljaCB0byBlbnVtZXJhdGUgdGltaW5ncyAodXNlZCB3aXRoCisgKgkJdjRsLXN1YmRldiBub2RlcyBvbmx5KQorICogQHJlc2VydmVkOgltdXN0IGJlIHplcm9lZAorICogQHRpbWluZ3M6CXRoZSB0aW1pbmdzIGZvciB0aGUgZ2l2ZW4gaW5kZXgKKyAqLworc3RydWN0IHY0bDJfZW51bV9kdl90aW1pbmdzIHsKKwlfX3UzMiBpbmRleDsKKwlfX3UzMiBwYWQ7CisJX191MzIgcmVzZXJ2ZWRbMl07CisJc3RydWN0IHY0bDJfZHZfdGltaW5ncyB0aW1pbmdzOworfTsKKworLyoqIHN0cnVjdCB2NGwyX2J0X3RpbWluZ3NfY2FwIC0gQlQuNjU2L0JULjExMjAgdGltaW5nIGNhcGFiaWxpdGllcworICogQG1pbl93aWR0aDoJCXdpZHRoIGluIHBpeGVscworICogQG1heF93aWR0aDoJCXdpZHRoIGluIHBpeGVscworICogQG1pbl9oZWlnaHQ6CQloZWlnaHQgaW4gbGluZXMKKyAqIEBtYXhfaGVpZ2h0OgkJaGVpZ2h0IGluIGxpbmVzCisgKiBAbWluX3BpeGVsY2xvY2s6CVBpeGVsIGNsb2NrIGluIEhaLiBFeC4gNzQuMjVNSHotPjc0MjUwMDAwCisgKiBAbWF4X3BpeGVsY2xvY2s6CVBpeGVsIGNsb2NrIGluIEhaLiBFeC4gNzQuMjVNSHotPjc0MjUwMDAwCisgKiBAc3RhbmRhcmRzOgkJU3VwcG9ydGVkIHN0YW5kYXJkcworICogQGNhcGFiaWxpdGllczoJU3VwcG9ydGVkIGNhcGFiaWxpdGllcworICogQHJlc2VydmVkOgkJTXVzdCBiZSB6ZXJvZWQKKyAqLworc3RydWN0IHY0bDJfYnRfdGltaW5nc19jYXAgeworCV9fdTMyCW1pbl93aWR0aDsKKwlfX3UzMgltYXhfd2lkdGg7CisJX191MzIJbWluX2hlaWdodDsKKwlfX3UzMgltYXhfaGVpZ2h0OworCV9fdTY0CW1pbl9waXhlbGNsb2NrOworCV9fdTY0CW1heF9waXhlbGNsb2NrOworCV9fdTMyCXN0YW5kYXJkczsKKwlfX3UzMgljYXBhYmlsaXRpZXM7CisJX191MzIJcmVzZXJ2ZWRbMTZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFN1cHBvcnRzIGludGVybGFjZWQgZm9ybWF0cyAqLworI2RlZmluZSBWNEwyX0RWX0JUX0NBUF9JTlRFUkxBQ0VECSgxIDw8IDApCisvKiBTdXBwb3J0cyBwcm9ncmVzc2l2ZSBmb3JtYXRzICovCisjZGVmaW5lIFY0TDJfRFZfQlRfQ0FQX1BST0dSRVNTSVZFCSgxIDw8IDEpCisvKiBTdXBwb3J0cyBDVlQvR1RGIHJlZHVjZWQgYmxhbmtpbmcgKi8KKyNkZWZpbmUgVjRMMl9EVl9CVF9DQVBfUkVEVUNFRF9CTEFOS0lORwkoMSA8PCAyKQorLyogU3VwcG9ydHMgY3VzdG9tIGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9EVl9CVF9DQVBfQ1VTVE9NCQkoMSA8PCAzKQorCisvKiogc3RydWN0IHY0bDJfZHZfdGltaW5nc19jYXAgLSBEViB0aW1pbmdzIGNhcGFiaWxpdGllcworICogQHR5cGU6CXRoZSB0eXBlIG9mIHRoZSB0aW1pbmdzIChzYW1lIGFzIGluIHN0cnVjdCB2NGwyX2R2X3RpbWluZ3MpCisgKiBAcGFkOgl0aGUgcGFkIG51bWJlciBmb3Igd2hpY2ggdG8gcXVlcnkgY2FwYWJpbGl0aWVzICh1c2VkIHdpdGgKKyAqCQl2NGwtc3ViZGV2IG5vZGVzIG9ubHkpCisgKiBAYnQ6CQl0aGUgQlQ2NTYvMTEyMCB0aW1pbmdzIGNhcGFiaWxpdGllcworICovCitzdHJ1Y3QgdjRsMl9kdl90aW1pbmdzX2NhcCB7CisJX191MzIgdHlwZTsKKwlfX3UzMiBwYWQ7CisJX191MzIgcmVzZXJ2ZWRbMl07CisJdW5pb24geworCQlzdHJ1Y3QgdjRsMl9idF90aW1pbmdzX2NhcCBidDsKKwkJX191MzIgcmF3X2RhdGFbMzJdOworCX07Cit9OworCisKKy8qCisgKglWIEkgRCBFIE8gICBJIE4gUCBVIFQgUworICovCitzdHJ1Y3QgdjRsMl9pbnB1dCB7CisJX191MzIJICAgICBpbmRleDsJCS8qICBXaGljaCBpbnB1dCAqLworCV9fdTgJICAgICBuYW1lWzMyXTsJCS8qICBMYWJlbCAqLworCV9fdTMyCSAgICAgdHlwZTsJCS8qICBUeXBlIG9mIGlucHV0ICovCisJX191MzIJICAgICBhdWRpb3NldDsJCS8qICBBc3NvY2lhdGVkIGF1ZGlvcyAoYml0ZmllbGQpICovCisJX191MzIgICAgICAgIHR1bmVyOyAgICAgICAgICAgICAvKiAgZW51bSB2NGwyX3R1bmVyX3R5cGUgKi8KKwl2NGwyX3N0ZF9pZCAgc3RkOworCV9fdTMyCSAgICAgc3RhdHVzOworCV9fdTMyCSAgICAgY2FwYWJpbGl0aWVzOworCV9fdTMyCSAgICAgcmVzZXJ2ZWRbM107Cit9OworCisvKiAgVmFsdWVzIGZvciB0aGUgJ3R5cGUnIGZpZWxkICovCisjZGVmaW5lIFY0TDJfSU5QVVRfVFlQRV9UVU5FUgkJMQorI2RlZmluZSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBCQkyCisjZGVmaW5lIFY0TDJfSU5QVVRfVFlQRV9UT1VDSAkJMworCisvKiBmaWVsZCAnc3RhdHVzJyAtIGdlbmVyYWwgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19QT1dFUiAgICAweDAwMDAwMDAxICAvKiBBdHRhY2hlZCBkZXZpY2UgaXMgb2ZmICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fU0lHTkFMICAgMHgwMDAwMDAwMgorI2RlZmluZSBWNEwyX0lOX1NUX05PX0NPTE9SICAgIDB4MDAwMDAwMDQKKworLyogZmllbGQgJ3N0YXR1cycgLSBzZW5zb3Igb3JpZW50YXRpb24gKi8KKy8qIElmIHNlbnNvciBpcyBtb3VudGVkIHVwc2lkZSBkb3duIHNldCBib3RoIGJpdHMgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9IRkxJUCAgICAgICAweDAwMDAwMDEwIC8qIEZyYW1lcyBhcmUgZmxpcHBlZCBob3Jpem9udGFsbHkgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9WRkxJUCAgICAgICAweDAwMDAwMDIwIC8qIEZyYW1lcyBhcmUgZmxpcHBlZCB2ZXJ0aWNhbGx5ICovCisKKy8qIGZpZWxkICdzdGF0dXMnIC0gYW5hbG9nICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fSF9MT0NLICAgMHgwMDAwMDEwMCAgLyogTm8gaG9yaXpvbnRhbCBzeW5jIGxvY2sgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9DT0xPUl9LSUxMICAweDAwMDAwMjAwICAvKiBDb2xvciBraWxsZXIgaXMgYWN0aXZlICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fVl9MT0NLICAgMHgwMDAwMDQwMCAgLyogTm8gdmVydGljYWwgc3luYyBsb2NrICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fU1REX0xPQ0sgMHgwMDAwMDgwMCAgLyogTm8gc3RhbmRhcmQgZm9ybWF0IGxvY2sgKi8KKworLyogZmllbGQgJ3N0YXR1cycgLSBkaWdpdGFsICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fU1lOQyAgICAgMHgwMDAxMDAwMCAgLyogTm8gc3luY2hyb25pemF0aW9uIGxvY2sgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19FUVUgICAgICAweDAwMDIwMDAwICAvKiBObyBlcXVhbGl6ZXIgbG9jayAqLworI2RlZmluZSBWNEwyX0lOX1NUX05PX0NBUlJJRVIgIDB4MDAwNDAwMDAgIC8qIENhcnJpZXIgcmVjb3ZlcnkgZmFpbGVkICovCisKKy8qIGZpZWxkICdzdGF0dXMnIC0gVkNSIGFuZCBzZXQtdG9wIGJveCAqLworI2RlZmluZSBWNEwyX0lOX1NUX01BQ1JPVklTSU9OIDB4MDEwMDAwMDAgIC8qIE1hY3JvdmlzaW9uIGRldGVjdGVkICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fQUNDRVNTICAgMHgwMjAwMDAwMCAgLyogQ29uZGl0aW9uYWwgYWNjZXNzIGRlbmllZCAqLworI2RlZmluZSBWNEwyX0lOX1NUX1ZUUiAgICAgICAgIDB4MDQwMDAwMDAgIC8qIFZUUiB0aW1lIGNvbnN0YW50ICovCisKKy8qIGNhcGFiaWxpdGllcyBmbGFncyAqLworI2RlZmluZSBWNEwyX0lOX0NBUF9EVl9USU1JTkdTCQkweDAwMDAwMDAyIC8qIFN1cHBvcnRzIFNfRFZfVElNSU5HUyAqLworI2RlZmluZSBWNEwyX0lOX0NBUF9DVVNUT01fVElNSU5HUwlWNEwyX0lOX0NBUF9EVl9USU1JTkdTIC8qIEZvciBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFY0TDJfSU5fQ0FQX1NURAkJCTB4MDAwMDAwMDQgLyogU3VwcG9ydHMgU19TVEQgKi8KKyNkZWZpbmUgVjRMMl9JTl9DQVBfTkFUSVZFX1NJWkUJCTB4MDAwMDAwMDggLyogU3VwcG9ydHMgc2V0dGluZyBuYXRpdmUgc2l6ZSAqLworCisvKgorICoJViBJIEQgRSBPICAgTyBVIFQgUCBVIFQgUworICovCitzdHJ1Y3QgdjRsMl9vdXRwdXQgeworCV9fdTMyCSAgICAgaW5kZXg7CQkvKiAgV2hpY2ggb3V0cHV0ICovCisJX191OAkgICAgIG5hbWVbMzJdOwkJLyogIExhYmVsICovCisJX191MzIJICAgICB0eXBlOwkJLyogIFR5cGUgb2Ygb3V0cHV0ICovCisJX191MzIJICAgICBhdWRpb3NldDsJCS8qICBBc3NvY2lhdGVkIGF1ZGlvcyAoYml0ZmllbGQpICovCisJX191MzIJICAgICBtb2R1bGF0b3I7ICAgICAgICAgLyogIEFzc29jaWF0ZWQgbW9kdWxhdG9yICovCisJdjRsMl9zdGRfaWQgIHN0ZDsKKwlfX3UzMgkgICAgIGNhcGFiaWxpdGllczsKKwlfX3UzMgkgICAgIHJlc2VydmVkWzNdOworfTsKKy8qICBWYWx1ZXMgZm9yIHRoZSAndHlwZScgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9PVVRQVVRfVFlQRV9NT0RVTEFUT1IJCTEKKyNkZWZpbmUgVjRMMl9PVVRQVVRfVFlQRV9BTkFMT0cJCQkyCisjZGVmaW5lIFY0TDJfT1VUUFVUX1RZUEVfQU5BTE9HVkdBT1ZFUkxBWQkzCisKKy8qIGNhcGFiaWxpdGllcyBmbGFncyAqLworI2RlZmluZSBWNEwyX09VVF9DQVBfRFZfVElNSU5HUwkJMHgwMDAwMDAwMiAvKiBTdXBwb3J0cyBTX0RWX1RJTUlOR1MgKi8KKyNkZWZpbmUgVjRMMl9PVVRfQ0FQX0NVU1RPTV9USU1JTkdTCVY0TDJfT1VUX0NBUF9EVl9USU1JTkdTIC8qIEZvciBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFY0TDJfT1VUX0NBUF9TVEQJCTB4MDAwMDAwMDQgLyogU3VwcG9ydHMgU19TVEQgKi8KKyNkZWZpbmUgVjRMMl9PVVRfQ0FQX05BVElWRV9TSVpFCTB4MDAwMDAwMDggLyogU3VwcG9ydHMgc2V0dGluZyBuYXRpdmUgc2l6ZSAqLworCisvKgorICoJQyBPIE4gVCBSIE8gTCBTCisgKi8KK3N0cnVjdCB2NGwyX2NvbnRyb2wgeworCV9fdTMyCQkgICAgIGlkOworCV9fczMyCQkgICAgIHZhbHVlOworfTsKKworc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgeworCV9fdTMyIGlkOworCV9fdTMyIHNpemU7CisJX191MzIgcmVzZXJ2ZWQyWzFdOworCXVuaW9uIHsKKwkJX19zMzIgdmFsdWU7CisJCV9fczY0IHZhbHVlNjQ7CisJCWNoYXIgX191c2VyICpzdHJpbmc7CisJCV9fdTggX191c2VyICpwX3U4OworCQlfX3UxNiBfX3VzZXIgKnBfdTE2OworCQlfX3UzMiBfX3VzZXIgKnBfdTMyOworCQl2b2lkIF9fdXNlciAqcHRyOworCX07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzIHsKKwl1bmlvbiB7CisjaWZuZGVmIF9fS0VSTkVMX18KKwkJX191MzIgY3RybF9jbGFzczsKKyNlbmRpZgorCQlfX3UzMiB3aGljaDsKKwl9OworCV9fdTMyIGNvdW50OworCV9fdTMyIGVycm9yX2lkeDsKKwlfX3UzMiByZXNlcnZlZFsyXTsKKwlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCAqY29udHJvbHM7Cit9OworCisjZGVmaW5lIFY0TDJfQ1RSTF9JRF9NQVNLICAgICAgCSAgKDB4MGZmZmZmZmYpCisjaWZuZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgVjRMMl9DVFJMX0lEMkNMQVNTKGlkKSAgICAoKGlkKSAmIDB4MGZmZjAwMDBVTCkKKyNlbmRpZgorI2RlZmluZSBWNEwyX0NUUkxfSUQyV0hJQ0goaWQpICAgICgoaWQpICYgMHgwZmZmMDAwMFVMKQorI2RlZmluZSBWNEwyX0NUUkxfRFJJVkVSX1BSSVYoaWQpICgoKGlkKSAmIDB4ZmZmZikgPj0gMHgxMDAwKQorI2RlZmluZSBWNEwyX0NUUkxfTUFYX0RJTVMJICAoNCkKKyNkZWZpbmUgVjRMMl9DVFJMX1dISUNIX0NVUl9WQUwgICAwCisjZGVmaW5lIFY0TDJfQ1RSTF9XSElDSF9ERUZfVkFMICAgMHgwZjAwMDAwMAorCitlbnVtIHY0bDJfY3RybF90eXBlIHsKKwlWNEwyX0NUUkxfVFlQRV9JTlRFR0VSCSAgICAgPSAxLAorCVY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4JICAgICA9IDIsCisJVjRMMl9DVFJMX1RZUEVfTUVOVQkgICAgID0gMywKKwlWNEwyX0NUUkxfVFlQRV9CVVRUT04JICAgICA9IDQsCisJVjRMMl9DVFJMX1RZUEVfSU5URUdFUjY0ICAgICA9IDUsCisJVjRMMl9DVFJMX1RZUEVfQ1RSTF9DTEFTUyAgICA9IDYsCisJVjRMMl9DVFJMX1RZUEVfU1RSSU5HICAgICAgICA9IDcsCisJVjRMMl9DVFJMX1RZUEVfQklUTUFTSyAgICAgICA9IDgsCisJVjRMMl9DVFJMX1RZUEVfSU5URUdFUl9NRU5VICA9IDksCisKKwkvKiBDb21wb3VuZCB0eXBlcyBhcmUgPj0gMHgwMTAwICovCisJVjRMMl9DVFJMX0NPTVBPVU5EX1RZUEVTICAgICA9IDB4MDEwMCwKKwlWNEwyX0NUUkxfVFlQRV9VOAkgICAgID0gMHgwMTAwLAorCVY0TDJfQ1RSTF9UWVBFX1UxNgkgICAgID0gMHgwMTAxLAorCVY0TDJfQ1RSTF9UWVBFX1UzMgkgICAgID0gMHgwMTAyLAorfTsKKworLyogIFVzZWQgaW4gdGhlIFZJRElPQ19RVUVSWUNUUkwgaW9jdGwgZm9yIHF1ZXJ5aW5nIGNvbnRyb2xzICovCitzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgeworCV9fdTMyCQkgICAgIGlkOworCV9fdTMyCQkgICAgIHR5cGU7CS8qIGVudW0gdjRsMl9jdHJsX3R5cGUgKi8KKwlfX3U4CQkgICAgIG5hbWVbMzJdOwkvKiBXaGF0ZXZlciAqLworCV9fczMyCQkgICAgIG1pbmltdW07CS8qIE5vdGUgc2lnbmVkbmVzcyAqLworCV9fczMyCQkgICAgIG1heGltdW07CisJX19zMzIJCSAgICAgc3RlcDsKKwlfX3MzMgkJICAgICBkZWZhdWx0X3ZhbHVlOworCV9fdTMyICAgICAgICAgICAgICAgIGZsYWdzOworCV9fdTMyCQkgICAgIHJlc2VydmVkWzJdOworfTsKKworLyogIFVzZWQgaW4gdGhlIFZJRElPQ19RVUVSWV9FWFRfQ1RSTCBpb2N0bCBmb3IgcXVlcnlpbmcgZXh0ZW5kZWQgY29udHJvbHMgKi8KK3N0cnVjdCB2NGwyX3F1ZXJ5X2V4dF9jdHJsIHsKKwlfX3UzMgkJICAgICBpZDsKKwlfX3UzMgkJICAgICB0eXBlOworCWNoYXIJCSAgICAgbmFtZVszMl07CisJX19zNjQJCSAgICAgbWluaW11bTsKKwlfX3M2NAkJICAgICBtYXhpbXVtOworCV9fdTY0CQkgICAgIHN0ZXA7CisJX19zNjQJCSAgICAgZGVmYXVsdF92YWx1ZTsKKwlfX3UzMiAgICAgICAgICAgICAgICBmbGFnczsKKwlfX3UzMiAgICAgICAgICAgICAgICBlbGVtX3NpemU7CisJX191MzIgICAgICAgICAgICAgICAgZWxlbXM7CisJX191MzIgICAgICAgICAgICAgICAgbnJfb2ZfZGltczsKKwlfX3UzMiAgICAgICAgICAgICAgICBkaW1zW1Y0TDJfQ1RSTF9NQVhfRElNU107CisJX191MzIJCSAgICAgcmVzZXJ2ZWRbMzJdOworfTsKKworLyogIFVzZWQgaW4gdGhlIFZJRElPQ19RVUVSWU1FTlUgaW9jdGwgZm9yIHF1ZXJ5aW5nIG1lbnUgaXRlbXMgKi8KK3N0cnVjdCB2NGwyX3F1ZXJ5bWVudSB7CisJX191MzIJCWlkOworCV9fdTMyCQlpbmRleDsKKwl1bmlvbiB7CisJCV9fdTgJbmFtZVszMl07CS8qIFdoYXRldmVyICovCisJCV9fczY0CXZhbHVlOworCX07CisJX191MzIJCXJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qICBDb250cm9sIGZsYWdzICAqLworI2RlZmluZSBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRAkJMHgwMDAxCisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX0dSQUJCRUQJCTB4MDAwMgorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19SRUFEX09OTFkgCTB4MDAwNAorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19VUERBVEUgCQkweDAwMDgKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkUgCTB4MDAxMAorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19TTElERVIgCQkweDAwMjAKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfV1JJVEVfT05MWSAJMHgwMDQwCisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFCQkweDAwODAKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfSEFTX1BBWUxPQUQJMHgwMTAwCisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX0VYRUNVVEVfT05fV1JJVEUJMHgwMjAwCisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX01PRElGWV9MQVlPVVQJMHgwNDAwCisKKy8qICBRdWVyeSBmbGFncywgdG8gYmUgT1JlZCB3aXRoIHRoZSBjb250cm9sIElEICovCisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX05FWFRfQ1RSTAkweDgwMDAwMDAwCisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX05FWFRfQ09NUE9VTkQJMHg0MDAwMDAwMAorCisvKiAgVXNlci1jbGFzcyBjb250cm9sIElEcyBkZWZpbmVkIGJ5IFY0TDIgKi8KKyNkZWZpbmUgVjRMMl9DSURfTUFYX0NUUkxTCQkxMDI0CisvKiAgSURzIHJlc2VydmVkIGZvciBkcml2ZXIgc3BlY2lmaWMgY29udHJvbHMgKi8KKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9CQVNFCQkweDA4MDAwMDAwCisKKworLyoKKyAqCVQgVSBOIEkgTiBHCisgKi8KK3N0cnVjdCB2NGwyX3R1bmVyIHsKKwlfX3UzMiAgICAgICAgICAgICAgICAgICBpbmRleDsKKwlfX3U4CQkJbmFtZVszMl07CisJX191MzIJCQl0eXBlOwkvKiBlbnVtIHY0bDJfdHVuZXJfdHlwZSAqLworCV9fdTMyCQkJY2FwYWJpbGl0eTsKKwlfX3UzMgkJCXJhbmdlbG93OworCV9fdTMyCQkJcmFuZ2VoaWdoOworCV9fdTMyCQkJcnhzdWJjaGFuczsKKwlfX3UzMgkJCWF1ZG1vZGU7CisJX19zMzIJCQlzaWduYWw7CisJX19zMzIJCQlhZmM7CisJX191MzIJCQlyZXNlcnZlZFs0XTsKK307CisKK3N0cnVjdCB2NGwyX21vZHVsYXRvciB7CisJX191MzIJCQlpbmRleDsKKwlfX3U4CQkJbmFtZVszMl07CisJX191MzIJCQljYXBhYmlsaXR5OworCV9fdTMyCQkJcmFuZ2Vsb3c7CisJX191MzIJCQlyYW5nZWhpZ2g7CisJX191MzIJCQl0eHN1YmNoYW5zOworCV9fdTMyCQkJdHlwZTsJLyogZW51bSB2NGwyX3R1bmVyX3R5cGUgKi8KKwlfX3UzMgkJCXJlc2VydmVkWzNdOworfTsKKworLyogIEZsYWdzIGZvciB0aGUgJ2NhcGFiaWxpdHknIGZpZWxkICovCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX0xPVwkJMHgwMDAxCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX05PUk0JCTB4MDAwMgorI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9IV1NFRUtfQk9VTkRFRAkweDAwMDQKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfSFdTRUVLX1dSQVAJMHgwMDA4CisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX1NURVJFTwkJMHgwMDEwCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX0xBTkcyCQkweDAwMjAKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfU0FQCQkweDAwMjAKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfTEFORzEJCTB4MDA0MAorI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9SRFMJCTB4MDA4MAorI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9SRFNfQkxPQ0tfSU8JMHgwMTAwCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX1JEU19DT05UUk9MUwkweDAyMDAKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfRlJFUV9CQU5EUwkweDA0MDAKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfSFdTRUVLX1BST0dfTElNCTB4MDgwMAorI2RlZmluZSBWNEwyX1RVTkVSX0NBUF8xSFoJCTB4MTAwMAorCisvKiAgRmxhZ3MgZm9yIHRoZSAncnhzdWJjaGFucycgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfTU9OTwkJMHgwMDAxCisjZGVmaW5lIFY0TDJfVFVORVJfU1VCX1NURVJFTwkJMHgwMDAyCisjZGVmaW5lIFY0TDJfVFVORVJfU1VCX0xBTkcyCQkweDAwMDQKKyNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfU0FQCQkweDAwMDQKKyNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfTEFORzEJCTB4MDAwOAorI2RlZmluZSBWNEwyX1RVTkVSX1NVQl9SRFMJCTB4MDAxMAorCisvKiAgVmFsdWVzIGZvciB0aGUgJ2F1ZG1vZGUnIGZpZWxkICovCisjZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9NT05PCQkweDAwMDAKKyNkZWZpbmUgVjRMMl9UVU5FUl9NT0RFX1NURVJFTwkJMHgwMDAxCisjZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9MQU5HMgkJMHgwMDAyCisjZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9TQVAJCTB4MDAwMgorI2RlZmluZSBWNEwyX1RVTkVSX01PREVfTEFORzEJCTB4MDAwMworI2RlZmluZSBWNEwyX1RVTkVSX01PREVfTEFORzFfTEFORzIJMHgwMDA0CisKK3N0cnVjdCB2NGwyX2ZyZXF1ZW5jeSB7CisJX191MzIJdHVuZXI7CisJX191MzIJdHlwZTsJLyogZW51bSB2NGwyX3R1bmVyX3R5cGUgKi8KKwlfX3UzMglmcmVxdWVuY3k7CisJX191MzIJcmVzZXJ2ZWRbOF07Cit9OworCisjZGVmaW5lIFY0TDJfQkFORF9NT0RVTEFUSU9OX1ZTQgkoMSA8PCAxKQorI2RlZmluZSBWNEwyX0JBTkRfTU9EVUxBVElPTl9GTQkJKDEgPDwgMikKKyNkZWZpbmUgVjRMMl9CQU5EX01PRFVMQVRJT05fQU0JCSgxIDw8IDMpCisKK3N0cnVjdCB2NGwyX2ZyZXF1ZW5jeV9iYW5kIHsKKwlfX3UzMgl0dW5lcjsKKwlfX3UzMgl0eXBlOwkvKiBlbnVtIHY0bDJfdHVuZXJfdHlwZSAqLworCV9fdTMyCWluZGV4OworCV9fdTMyCWNhcGFiaWxpdHk7CisJX191MzIJcmFuZ2Vsb3c7CisJX191MzIJcmFuZ2VoaWdoOworCV9fdTMyCW1vZHVsYXRpb247CisJX191MzIJcmVzZXJ2ZWRbOV07Cit9OworCitzdHJ1Y3QgdjRsMl9od19mcmVxX3NlZWsgeworCV9fdTMyCXR1bmVyOworCV9fdTMyCXR5cGU7CS8qIGVudW0gdjRsMl90dW5lcl90eXBlICovCisJX191MzIJc2Vla191cHdhcmQ7CisJX191MzIJd3JhcF9hcm91bmQ7CisJX191MzIJc3BhY2luZzsKKwlfX3UzMglyYW5nZWxvdzsKKwlfX3UzMglyYW5nZWhpZ2g7CisJX191MzIJcmVzZXJ2ZWRbNV07Cit9OworCisvKgorICoJUiBEIFMKKyAqLworCitzdHJ1Y3QgdjRsMl9yZHNfZGF0YSB7CisJX191OCAJbHNiOworCV9fdTggCW1zYjsKKwlfX3U4IAlibG9jazsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFY0TDJfUkRTX0JMT0NLX01TSyAJIDB4NworI2RlZmluZSBWNEwyX1JEU19CTE9DS19BIAkgMAorI2RlZmluZSBWNEwyX1JEU19CTE9DS19CIAkgMQorI2RlZmluZSBWNEwyX1JEU19CTE9DS19DIAkgMgorI2RlZmluZSBWNEwyX1JEU19CTE9DS19EIAkgMworI2RlZmluZSBWNEwyX1JEU19CTE9DS19DX0FMVCAJIDQKKyNkZWZpbmUgVjRMMl9SRFNfQkxPQ0tfSU5WQUxJRCAJIDcKKworI2RlZmluZSBWNEwyX1JEU19CTE9DS19DT1JSRUNURUQgMHg0MAorI2RlZmluZSBWNEwyX1JEU19CTE9DS19FUlJPUiAJIDB4ODAKKworLyoKKyAqCUEgVSBEIEkgTworICovCitzdHJ1Y3QgdjRsMl9hdWRpbyB7CisJX191MzIJaW5kZXg7CisJX191OAluYW1lWzMyXTsKKwlfX3UzMgljYXBhYmlsaXR5OworCV9fdTMyCW1vZGU7CisJX191MzIJcmVzZXJ2ZWRbMl07Cit9OworCisvKiAgRmxhZ3MgZm9yIHRoZSAnY2FwYWJpbGl0eScgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9BVURDQVBfU1RFUkVPCQkweDAwMDAxCisjZGVmaW5lIFY0TDJfQVVEQ0FQX0FWTAkJCTB4MDAwMDIKKworLyogIEZsYWdzIGZvciB0aGUgJ21vZGUnIGZpZWxkICovCisjZGVmaW5lIFY0TDJfQVVETU9ERV9BVkwJCTB4MDAwMDEKKworc3RydWN0IHY0bDJfYXVkaW9vdXQgeworCV9fdTMyCWluZGV4OworCV9fdTgJbmFtZVszMl07CisJX191MzIJY2FwYWJpbGl0eTsKKwlfX3UzMgltb2RlOworCV9fdTMyCXJlc2VydmVkWzJdOworfTsKKworLyoKKyAqCU0gUCBFIEcgICBTIEUgUiBWIEkgQyBFIFMKKyAqLworI2lmIDEKKyNkZWZpbmUgVjRMMl9FTkNfSURYX0ZSQU1FX0kgICAgKDApCisjZGVmaW5lIFY0TDJfRU5DX0lEWF9GUkFNRV9QICAgICgxKQorI2RlZmluZSBWNEwyX0VOQ19JRFhfRlJBTUVfQiAgICAoMikKKyNkZWZpbmUgVjRMMl9FTkNfSURYX0ZSQU1FX01BU0sgKDB4ZikKKworc3RydWN0IHY0bDJfZW5jX2lkeF9lbnRyeSB7CisJX191NjQgb2Zmc2V0OworCV9fdTY0IHB0czsKKwlfX3UzMiBsZW5ndGg7CisJX191MzIgZmxhZ3M7CisJX191MzIgcmVzZXJ2ZWRbMl07Cit9OworCisjZGVmaW5lIFY0TDJfRU5DX0lEWF9FTlRSSUVTICg2NCkKK3N0cnVjdCB2NGwyX2VuY19pZHggeworCV9fdTMyIGVudHJpZXM7CisJX191MzIgZW50cmllc19jYXA7CisJX191MzIgcmVzZXJ2ZWRbNF07CisJc3RydWN0IHY0bDJfZW5jX2lkeF9lbnRyeSBlbnRyeVtWNEwyX0VOQ19JRFhfRU5UUklFU107Cit9OworCisKKyNkZWZpbmUgVjRMMl9FTkNfQ01EX1NUQVJUICAgICAgKDApCisjZGVmaW5lIFY0TDJfRU5DX0NNRF9TVE9QICAgICAgICgxKQorI2RlZmluZSBWNEwyX0VOQ19DTURfUEFVU0UgICAgICAoMikKKyNkZWZpbmUgVjRMMl9FTkNfQ01EX1JFU1VNRSAgICAgKDMpCisKKy8qIEZsYWdzIGZvciBWNEwyX0VOQ19DTURfU1RPUCAqLworI2RlZmluZSBWNEwyX0VOQ19DTURfU1RPUF9BVF9HT1BfRU5EICAgICgxIDw8IDApCisKK3N0cnVjdCB2NGwyX2VuY29kZXJfY21kIHsKKwlfX3UzMiBjbWQ7CisJX191MzIgZmxhZ3M7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191MzIgZGF0YVs4XTsKKwkJfSByYXc7CisJfTsKK307CisKKy8qIERlY29kZXIgY29tbWFuZHMgKi8KKyNkZWZpbmUgVjRMMl9ERUNfQ01EX1NUQVJUICAgICAgICgwKQorI2RlZmluZSBWNEwyX0RFQ19DTURfU1RPUCAgICAgICAgKDEpCisjZGVmaW5lIFY0TDJfREVDX0NNRF9QQVVTRSAgICAgICAoMikKKyNkZWZpbmUgVjRMMl9ERUNfQ01EX1JFU1VNRSAgICAgICgzKQorCisvKiBGbGFncyBmb3IgVjRMMl9ERUNfQ01EX1NUQVJUICovCisjZGVmaW5lIFY0TDJfREVDX0NNRF9TVEFSVF9NVVRFX0FVRElPCSgxIDw8IDApCisKKy8qIEZsYWdzIGZvciBWNEwyX0RFQ19DTURfUEFVU0UgKi8KKyNkZWZpbmUgVjRMMl9ERUNfQ01EX1BBVVNFX1RPX0JMQUNLCSgxIDw8IDApCisKKy8qIEZsYWdzIGZvciBWNEwyX0RFQ19DTURfU1RPUCAqLworI2RlZmluZSBWNEwyX0RFQ19DTURfU1RPUF9UT19CTEFDSwkoMSA8PCAwKQorI2RlZmluZSBWNEwyX0RFQ19DTURfU1RPUF9JTU1FRElBVEVMWQkoMSA8PCAxKQorCisvKiBQbGF5IGZvcm1hdCByZXF1aXJlbWVudHMgKHJldHVybmVkIGJ5IHRoZSBkcml2ZXIpOiAqLworCisvKiBUaGUgZGVjb2RlciBoYXMgbm8gc3BlY2lhbCBmb3JtYXQgcmVxdWlyZW1lbnRzICovCisjZGVmaW5lIFY0TDJfREVDX1NUQVJUX0ZNVF9OT05FCQkoMCkKKy8qIFRoZSBkZWNvZGVyIHJlcXVpcmVzIGZ1bGwgR09QcyAqLworI2RlZmluZSBWNEwyX0RFQ19TVEFSVF9GTVRfR09QCQkoMSkKKworLyogVGhlIHN0cnVjdHVyZSBtdXN0IGJlIHplcm9lZCBiZWZvcmUgdXNlIGJ5IHRoZSBhcHBsaWNhdGlvbgorICAgVGhpcyBlbnN1cmVzIGl0IGNhbiBiZSBleHRlbmRlZCBzYWZlbHkgaW4gdGhlIGZ1dHVyZS4gKi8KK3N0cnVjdCB2NGwyX2RlY29kZXJfY21kIHsKKwlfX3UzMiBjbWQ7CisJX191MzIgZmxhZ3M7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191NjQgcHRzOworCQl9IHN0b3A7CisKKwkJc3RydWN0IHsKKwkJCS8qIDAgb3IgMTAwMCBzcGVjaWZpZXMgbm9ybWFsIHNwZWVkLAorCQkJICAgMSBzcGVjaWZpZXMgZm9yd2FyZCBzaW5nbGUgc3RlcHBpbmcsCisJCQkgICAtMSBzcGVjaWZpZXMgYmFja3dhcmQgc2luZ2xlIHN0ZXBwaW5nLAorCQkJICAgPjE6IHBsYXliYWNrIGF0IHNwZWVkLzEwMDAgb2YgdGhlIG5vcm1hbCBzcGVlZCwKKwkJCSAgIDwtMTogcmV2ZXJzZSBwbGF5YmFjayBhdCAoLXNwZWVkLzEwMDApIG9mIHRoZSBub3JtYWwgc3BlZWQuICovCisJCQlfX3MzMiBzcGVlZDsKKwkJCV9fdTMyIGZvcm1hdDsKKwkJfSBzdGFydDsKKworCQlzdHJ1Y3QgeworCQkJX191MzIgZGF0YVsxNl07CisJCX0gcmF3OworCX07Cit9OworI2VuZGlmCisKKworLyoKKyAqCUQgQSBUIEEgICBTIEUgUiBWIEkgQyBFIFMgICAoIFYgQiBJICkKKyAqCisgKglEYXRhIHNlcnZpY2VzIEFQSSBieSBNaWNoYWVsIFNjaGltZWsKKyAqLworCisvKiBSYXcgVkJJICovCitzdHJ1Y3QgdjRsMl92YmlfZm9ybWF0IHsKKwlfX3UzMglzYW1wbGluZ19yYXRlOwkJLyogaW4gMSBIeiAqLworCV9fdTMyCW9mZnNldDsKKwlfX3UzMglzYW1wbGVzX3Blcl9saW5lOworCV9fdTMyCXNhbXBsZV9mb3JtYXQ7CQkvKiBWNEwyX1BJWF9GTVRfKiAqLworCV9fczMyCXN0YXJ0WzJdOworCV9fdTMyCWNvdW50WzJdOworCV9fdTMyCWZsYWdzOwkJCS8qIFY0TDJfVkJJXyogKi8KKwlfX3UzMglyZXNlcnZlZFsyXTsJCS8qIG11c3QgYmUgemVybyAqLworfTsKKworLyogIFZCSSBmbGFncyAgKi8KKyNkZWZpbmUgVjRMMl9WQklfVU5TWU5DCQkoMSA8PCAwKQorI2RlZmluZSBWNEwyX1ZCSV9JTlRFUkxBQ0VECSgxIDw8IDEpCisKKy8qIElUVS1SIHN0YXJ0IGxpbmVzIGZvciBlYWNoIGZpZWxkICovCisjZGVmaW5lIFY0TDJfVkJJX0lUVV81MjVfRjFfU1RBUlQgKDEpCisjZGVmaW5lIFY0TDJfVkJJX0lUVV81MjVfRjJfU1RBUlQgKDI2NCkKKyNkZWZpbmUgVjRMMl9WQklfSVRVXzYyNV9GMV9TVEFSVCAoMSkKKyNkZWZpbmUgVjRMMl9WQklfSVRVXzYyNV9GMl9TVEFSVCAoMzE0KQorCisvKiBTbGljZWQgVkJJCisgKgorICogICAgVGhpcyBpbXBsZW1lbnRzIGlzIGEgcHJvcG9zYWwgVjRMMiBBUEkgdG8gYWxsb3cgU0xJQ0VEIFZCSQorICogcmVxdWlyZWQgZm9yIHNvbWUgaGFyZHdhcmUgZW5jb2RlcnMuIEl0IHNob3VsZCBjaGFuZ2Ugd2l0aG91dAorICogbm90aWNlIGluIHRoZSBkZWZpbml0aXZlIGltcGxlbWVudGF0aW9uLgorICovCisKK3N0cnVjdCB2NGwyX3NsaWNlZF92YmlfZm9ybWF0IHsKKwlfX3UxNiAgIHNlcnZpY2Vfc2V0OworCS8qIHNlcnZpY2VfbGluZXNbMF1bLi4uXSBzcGVjaWZpZXMgbGluZXMgMC0yMyAoMS0yMyB1c2VkKSBvZiB0aGUgZmlyc3QgZmllbGQKKwkgICBzZXJ2aWNlX2xpbmVzWzFdWy4uLl0gc3BlY2lmaWVzIGxpbmVzIDAtMjMgKDEtMjMgdXNlZCkgb2YgdGhlIHNlY29uZCBmaWVsZAorCQkJCSAoZXF1YWxzIGZyYW1lIGxpbmVzIDMxMy0zMzYgZm9yIDYyNSBsaW5lIHZpZGVvCisJCQkJICBzdGFuZGFyZHMsIDI2My0yODYgZm9yIDUyNSBsaW5lIHN0YW5kYXJkcykgKi8KKwlfX3UxNiAgIHNlcnZpY2VfbGluZXNbMl1bMjRdOworCV9fdTMyICAgaW9fc2l6ZTsKKwlfX3UzMiAgIHJlc2VydmVkWzJdOyAgICAgICAgICAgIC8qIG11c3QgYmUgemVybyAqLworfTsKKworLyogVGVsZXRleHQgV29ybGQgU3lzdGVtIFRlbGV0ZXh0CisgICAoV1NUKSwgZGVmaW5lZCBvbiBJVFUtUiBCVC42NTMtMiAqLworI2RlZmluZSBWNEwyX1NMSUNFRF9URUxFVEVYVF9CICAgICAgICAgICgweDAwMDEpCisvKiBWaWRlbyBQcm9ncmFtIFN5c3RlbSwgZGVmaW5lZCBvbiBFVFMgMzAwIDIzMSovCisjZGVmaW5lIFY0TDJfU0xJQ0VEX1ZQUyAgICAgICAgICAgICAgICAgKDB4MDQwMCkKKy8qIENsb3NlZCBDYXB0aW9uLCBkZWZpbmVkIG9uIEVJQS02MDggKi8KKyNkZWZpbmUgVjRMMl9TTElDRURfQ0FQVElPTl81MjUgICAgICAgICAoMHgxMDAwKQorLyogV2lkZSBTY3JlZW4gU3lzdGVtLCBkZWZpbmVkIG9uIElUVS1SIEJUMTExOS4xICovCisjZGVmaW5lIFY0TDJfU0xJQ0VEX1dTU182MjUgICAgICAgICAgICAgKDB4NDAwMCkKKworI2RlZmluZSBWNEwyX1NMSUNFRF9WQklfNTI1ICAgICAgICAgICAgIChWNEwyX1NMSUNFRF9DQVBUSU9OXzUyNSkKKyNkZWZpbmUgVjRMMl9TTElDRURfVkJJXzYyNSAgICAgICAgICAgICAoVjRMMl9TTElDRURfVEVMRVRFWFRfQiB8IFY0TDJfU0xJQ0VEX1ZQUyB8IFY0TDJfU0xJQ0VEX1dTU182MjUpCisKK3N0cnVjdCB2NGwyX3NsaWNlZF92YmlfY2FwIHsKKwlfX3UxNiAgIHNlcnZpY2Vfc2V0OworCS8qIHNlcnZpY2VfbGluZXNbMF1bLi4uXSBzcGVjaWZpZXMgbGluZXMgMC0yMyAoMS0yMyB1c2VkKSBvZiB0aGUgZmlyc3QgZmllbGQKKwkgICBzZXJ2aWNlX2xpbmVzWzFdWy4uLl0gc3BlY2lmaWVzIGxpbmVzIDAtMjMgKDEtMjMgdXNlZCkgb2YgdGhlIHNlY29uZCBmaWVsZAorCQkJCSAoZXF1YWxzIGZyYW1lIGxpbmVzIDMxMy0zMzYgZm9yIDYyNSBsaW5lIHZpZGVvCisJCQkJICBzdGFuZGFyZHMsIDI2My0yODYgZm9yIDUyNSBsaW5lIHN0YW5kYXJkcykgKi8KKwlfX3UxNiAgIHNlcnZpY2VfbGluZXNbMl1bMjRdOworCV9fdTMyCXR5cGU7CQkvKiBlbnVtIHY0bDJfYnVmX3R5cGUgKi8KKwlfX3UzMiAgIHJlc2VydmVkWzNdOyAgICAvKiBtdXN0IGJlIDAgKi8KK307CisKK3N0cnVjdCB2NGwyX3NsaWNlZF92YmlfZGF0YSB7CisJX191MzIgICBpZDsKKwlfX3UzMiAgIGZpZWxkOyAgICAgICAgICAvKiAwOiBmaXJzdCBmaWVsZCwgMTogc2Vjb25kIGZpZWxkICovCisJX191MzIgICBsaW5lOyAgICAgICAgICAgLyogMS0yMyAqLworCV9fdTMyICAgcmVzZXJ2ZWQ7ICAgICAgIC8qIG11c3QgYmUgMCAqLworCV9fdTggICAgZGF0YVs0OF07Cit9OworCisvKgorICogU2xpY2VkIFZCSSBkYXRhIGluc2VydGVkIGludG8gTVBFRyBTdHJlYW1zCisgKi8KKworLyoKKyAqIFY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9JVlRWOgorICoKKyAqIFN0cnVjdHVyZSBvZiBwYXlsb2FkIGNvbnRhaW5lZCBpbiBhbiBNUEVHIDIgUHJpdmF0ZSBTdHJlYW0gMSBQRVMgUGFja2V0IGluIGFuCisgKiBNUEVHLTIgUHJvZ3JhbSBQYWNrIHRoYXQgY29udGFpbnMgVjRMMl9NUEVHX1NUUkVBTV9WQklfRk1UX0lWVFYgU2xpY2VkIFZCSQorICogZGF0YQorICoKKyAqIE5vdGUsIHRoZSBNUEVHLTIgUHJvZ3JhbSBQYWNrIGFuZCBQcml2YXRlIFN0cmVhbSAxIFBFUyBwYWNrZXQgaGVhZGVyCisgKiBkZWZpbml0aW9ucyBhcmUgbm90IGluY2x1ZGVkIGhlcmUuICBTZWUgdGhlIE1QRUctMiBzcGVjaWZpY2F0aW9ucyBmb3IgZGV0YWlscworICogb24gdGhlc2UgaGVhZGVycy4KKyAqLworCisvKiBMaW5lIHR5cGUgSURzICovCisjZGVmaW5lIFY0TDJfTVBFR19WQklfSVZUVl9URUxFVEVYVF9CICAgICAoMSkKKyNkZWZpbmUgVjRMMl9NUEVHX1ZCSV9JVlRWX0NBUFRJT05fNTI1ICAgICg0KQorI2RlZmluZSBWNEwyX01QRUdfVkJJX0lWVFZfV1NTXzYyNSAgICAgICAgKDUpCisjZGVmaW5lIFY0TDJfTVBFR19WQklfSVZUVl9WUFMgICAgICAgICAgICAoNykKKworc3RydWN0IHY0bDJfbXBlZ192YmlfaXR2MF9saW5lIHsKKwlfX3U4IGlkOwkvKiBPbmUgb2YgVjRMMl9NUEVHX1ZCSV9JVlRWXyogYWJvdmUgKi8KKwlfX3U4IGRhdGFbNDJdOwkvKiBTbGljZWQgVkJJIGRhdGEgZm9yIHRoZSBsaW5lICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHY0bDJfbXBlZ192YmlfaXR2MCB7CisJX19sZTMyIGxpbmVtYXNrWzJdOyAvKiBCaXRtYXNrcyBvZiBWQkkgc2VydmljZSBsaW5lcyBwcmVzZW50ICovCisJc3RydWN0IHY0bDJfbXBlZ192YmlfaXR2MF9saW5lIGxpbmVbMzVdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCB2NGwyX21wZWdfdmJpX0lUVjAgeworCXN0cnVjdCB2NGwyX21wZWdfdmJpX2l0djBfbGluZSBsaW5lWzM2XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFY0TDJfTVBFR19WQklfSVZUVl9NQUdJQzAJIml0djAiCisjZGVmaW5lIFY0TDJfTVBFR19WQklfSVZUVl9NQUdJQzEJIklUVjAiCisKK3N0cnVjdCB2NGwyX21wZWdfdmJpX2ZtdF9pdnR2IHsKKwlfX3U4IG1hZ2ljWzRdOworCXVuaW9uIHsKKwkJc3RydWN0IHY0bDJfbXBlZ192YmlfaXR2MCBpdHYwOworCQlzdHJ1Y3QgdjRsMl9tcGVnX3ZiaV9JVFYwIElUVjA7CisJfTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKgorICoJQSBHIEcgUiBFIEcgQSBUIEUgICBTIFQgUiBVIEMgVCBVIFIgRSBTCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgdjRsMl9wbGFuZV9waXhfZm9ybWF0IC0gYWRkaXRpb25hbCwgcGVyLXBsYW5lIGZvcm1hdCBkZWZpbml0aW9uCisgKiBAc2l6ZWltYWdlOgkJbWF4aW11bSBzaXplIGluIGJ5dGVzIHJlcXVpcmVkIGZvciBkYXRhLCBmb3Igd2hpY2gKKyAqCQkJdGhpcyBwbGFuZSB3aWxsIGJlIHVzZWQKKyAqIEBieXRlc3BlcmxpbmU6CWRpc3RhbmNlIGluIGJ5dGVzIGJldHdlZW4gdGhlIGxlZnRtb3N0IHBpeGVscyBpbiB0d28KKyAqCQkJYWRqYWNlbnQgbGluZXMKKyAqLworc3RydWN0IHY0bDJfcGxhbmVfcGl4X2Zvcm1hdCB7CisJX191MzIJCXNpemVpbWFnZTsKKwlfX3UzMgkJYnl0ZXNwZXJsaW5lOworCV9fdTE2CQlyZXNlcnZlZFs2XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKioKKyAqIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lIC0gbXVsdGlwbGFuYXIgZm9ybWF0IGRlZmluaXRpb24KKyAqIEB3aWR0aDoJCWltYWdlIHdpZHRoIGluIHBpeGVscworICogQGhlaWdodDoJCWltYWdlIGhlaWdodCBpbiBwaXhlbHMKKyAqIEBwaXhlbGZvcm1hdDoJbGl0dGxlIGVuZGlhbiBmb3VyIGNoYXJhY3RlciBjb2RlIChmb3VyY2MpCisgKiBAZmllbGQ6CQllbnVtIHY0bDJfZmllbGQ7IGZpZWxkIG9yZGVyIChmb3IgaW50ZXJsYWNlZCB2aWRlbykKKyAqIEBjb2xvcnNwYWNlOgkJZW51bSB2NGwyX2NvbG9yc3BhY2U7IHN1cHBsZW1lbnRhbCB0byBwaXhlbGZvcm1hdAorICogQHBsYW5lX2ZtdDoJCXBlci1wbGFuZSBpbmZvcm1hdGlvbgorICogQG51bV9wbGFuZXM6CQludW1iZXIgb2YgcGxhbmVzIGZvciB0aGlzIGZvcm1hdAorICogQGZsYWdzOgkJZm9ybWF0IGZsYWdzIChWNEwyX1BJWF9GTVRfRkxBR18qKQorICogQHljYmNyX2VuYzoJCWVudW0gdjRsMl95Y2Jjcl9lbmNvZGluZywgWSdDYkNyIGVuY29kaW5nCisgKiBAcXVhbnRpemF0aW9uOgllbnVtIHY0bDJfcXVhbnRpemF0aW9uLCBjb2xvcnNwYWNlIHF1YW50aXphdGlvbgorICogQHhmZXJfZnVuYzoJCWVudW0gdjRsMl94ZmVyX2Z1bmMsIGNvbG9yc3BhY2UgdHJhbnNmZXIgZnVuY3Rpb24KKyAqLworc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgeworCV9fdTMyCQkJCXdpZHRoOworCV9fdTMyCQkJCWhlaWdodDsKKwlfX3UzMgkJCQlwaXhlbGZvcm1hdDsKKwlfX3UzMgkJCQlmaWVsZDsKKwlfX3UzMgkJCQljb2xvcnNwYWNlOworCisJc3RydWN0IHY0bDJfcGxhbmVfcGl4X2Zvcm1hdAlwbGFuZV9mbXRbVklERU9fTUFYX1BMQU5FU107CisJX191OAkJCQludW1fcGxhbmVzOworCV9fdTgJCQkJZmxhZ3M7CisJIHVuaW9uIHsKKwkJX191OAkJCQl5Y2Jjcl9lbmM7CisJCV9fdTgJCQkJaHN2X2VuYzsKKwl9OworCV9fdTgJCQkJcXVhbnRpemF0aW9uOworCV9fdTgJCQkJeGZlcl9mdW5jOworCV9fdTgJCQkJcmVzZXJ2ZWRbN107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqCisgKiBzdHJ1Y3QgdjRsMl9zZHJfZm9ybWF0IC0gU0RSIGZvcm1hdCBkZWZpbml0aW9uCisgKiBAcGl4ZWxmb3JtYXQ6CWxpdHRsZSBlbmRpYW4gZm91ciBjaGFyYWN0ZXIgY29kZSAoZm91cmNjKQorICogQGJ1ZmZlcnNpemU6CQltYXhpbXVtIHNpemUgaW4gYnl0ZXMgcmVxdWlyZWQgZm9yIGRhdGEKKyAqLworc3RydWN0IHY0bDJfc2RyX2Zvcm1hdCB7CisJX191MzIJCQkJcGl4ZWxmb3JtYXQ7CisJX191MzIJCQkJYnVmZmVyc2l6ZTsKKwlfX3U4CQkJCXJlc2VydmVkWzI0XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKioKKyAqIHN0cnVjdCB2NGwyX21ldGFfZm9ybWF0IC0gbWV0YWRhdGEgZm9ybWF0IGRlZmluaXRpb24KKyAqIEBkYXRhZm9ybWF0OgkJbGl0dGxlIGVuZGlhbiBmb3VyIGNoYXJhY3RlciBjb2RlIChmb3VyY2MpCisgKiBAYnVmZmVyc2l6ZToJCW1heGltdW0gc2l6ZSBpbiBieXRlcyByZXF1aXJlZCBmb3IgZGF0YQorICovCitzdHJ1Y3QgdjRsMl9tZXRhX2Zvcm1hdCB7CisJX191MzIJCQkJZGF0YWZvcm1hdDsKKwlfX3UzMgkJCQlidWZmZXJzaXplOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKgorICogc3RydWN0IHY0bDJfZm9ybWF0IC0gc3RyZWFtIGRhdGEgZm9ybWF0CisgKiBAdHlwZToJZW51bSB2NGwyX2J1Zl90eXBlOyB0eXBlIG9mIHRoZSBkYXRhIHN0cmVhbQorICogQHBpeDoJZGVmaW5pdGlvbiBvZiBhbiBpbWFnZSBmb3JtYXQKKyAqIEBwaXhfbXA6CWRlZmluaXRpb24gb2YgYSBtdWx0aXBsYW5hciBpbWFnZSBmb3JtYXQKKyAqIEB3aW46CWRlZmluaXRpb24gb2YgYW4gb3ZlcmxhaWQgaW1hZ2UKKyAqIEB2Ymk6CXJhdyBWQkkgY2FwdHVyZSBvciBvdXRwdXQgcGFyYW1ldGVycworICogQHNsaWNlZDoJc2xpY2VkIFZCSSBjYXB0dXJlIG9yIG91dHB1dCBwYXJhbWV0ZXJzCisgKiBAcmF3X2RhdGE6CXBsYWNlaG9sZGVyIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyBhbmQgY3VzdG9tIGZvcm1hdHMKKyAqLworc3RydWN0IHY0bDJfZm9ybWF0IHsKKwlfX3UzMgkgdHlwZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQJCXBpeDsgICAgIC8qIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSAqLworCQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZQlwaXhfbXA7ICAvKiBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FICovCisJCXN0cnVjdCB2NGwyX3dpbmRvdwkJd2luOyAgICAgLyogVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZICovCisJCXN0cnVjdCB2NGwyX3ZiaV9mb3JtYXQJCXZiaTsgICAgIC8qIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUgKi8KKwkJc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9mb3JtYXQJc2xpY2VkOyAgLyogVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkUgKi8KKwkJc3RydWN0IHY0bDJfc2RyX2Zvcm1hdAkJc2RyOyAgICAgLyogVjRMMl9CVUZfVFlQRV9TRFJfQ0FQVFVSRSAqLworCQlzdHJ1Y3QgdjRsMl9tZXRhX2Zvcm1hdAkJbWV0YTsgICAgLyogVjRMMl9CVUZfVFlQRV9NRVRBX0NBUFRVUkUgKi8KKwkJX191OAlyYXdfZGF0YVsyMDBdOyAgICAgICAgICAgICAgICAgICAvKiB1c2VyLWRlZmluZWQgKi8KKwl9IGZtdDsKK307CisKKy8qCVN0cmVhbSB0eXBlLWRlcGVuZGVudCBwYXJhbWV0ZXJzCisgKi8KK3N0cnVjdCB2NGwyX3N0cmVhbXBhcm0geworCV9fdTMyCSB0eXBlOwkJCS8qIGVudW0gdjRsMl9idWZfdHlwZSAqLworCXVuaW9uIHsKKwkJc3RydWN0IHY0bDJfY2FwdHVyZXBhcm0JY2FwdHVyZTsKKwkJc3RydWN0IHY0bDJfb3V0cHV0cGFybQlvdXRwdXQ7CisJCV9fdTgJcmF3X2RhdGFbMjAwXTsgIC8qIHVzZXItZGVmaW5lZCAqLworCX0gcGFybTsKK307CisKKy8qCisgKglFIFYgRSBOIFQgUworICovCisKKyNkZWZpbmUgVjRMMl9FVkVOVF9BTEwJCQkJMAorI2RlZmluZSBWNEwyX0VWRU5UX1ZTWU5DCQkJMQorI2RlZmluZSBWNEwyX0VWRU5UX0VPUwkJCQkyCisjZGVmaW5lIFY0TDJfRVZFTlRfQ1RSTAkJCQkzCisjZGVmaW5lIFY0TDJfRVZFTlRfRlJBTUVfU1lOQwkJCTQKKyNkZWZpbmUgVjRMMl9FVkVOVF9TT1VSQ0VfQ0hBTkdFCQk1CisjZGVmaW5lIFY0TDJfRVZFTlRfTU9USU9OX0RFVAkJCTYKKyNkZWZpbmUgVjRMMl9FVkVOVF9QUklWQVRFX1NUQVJUCQkweDA4MDAwMDAwCisKKy8qIFBheWxvYWQgZm9yIFY0TDJfRVZFTlRfVlNZTkMgKi8KK3N0cnVjdCB2NGwyX2V2ZW50X3ZzeW5jIHsKKwkvKiBDYW4gYmUgVjRMMl9GSUVMRF9BTlksIF9OT05FLCBfVE9QIG9yIF9CT1RUT00gKi8KKwlfX3U4IGZpZWxkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFBheWxvYWQgZm9yIFY0TDJfRVZFTlRfQ1RSTCAqLworI2RlZmluZSBWNEwyX0VWRU5UX0NUUkxfQ0hfVkFMVUUJCSgxIDw8IDApCisjZGVmaW5lIFY0TDJfRVZFTlRfQ1RSTF9DSF9GTEFHUwkJKDEgPDwgMSkKKyNkZWZpbmUgVjRMMl9FVkVOVF9DVFJMX0NIX1JBTkdFCQkoMSA8PCAyKQorCitzdHJ1Y3QgdjRsMl9ldmVudF9jdHJsIHsKKwlfX3UzMiBjaGFuZ2VzOworCV9fdTMyIHR5cGU7CisJdW5pb24geworCQlfX3MzMiB2YWx1ZTsKKwkJX19zNjQgdmFsdWU2NDsKKwl9OworCV9fdTMyIGZsYWdzOworCV9fczMyIG1pbmltdW07CisJX19zMzIgbWF4aW11bTsKKwlfX3MzMiBzdGVwOworCV9fczMyIGRlZmF1bHRfdmFsdWU7Cit9OworCitzdHJ1Y3QgdjRsMl9ldmVudF9mcmFtZV9zeW5jIHsKKwlfX3UzMiBmcmFtZV9zZXF1ZW5jZTsKK307CisKKyNkZWZpbmUgVjRMMl9FVkVOVF9TUkNfQ0hfUkVTT0xVVElPTgkJKDEgPDwgMCkKKworc3RydWN0IHY0bDJfZXZlbnRfc3JjX2NoYW5nZSB7CisJX191MzIgY2hhbmdlczsKK307CisKKyNkZWZpbmUgVjRMMl9FVkVOVF9NRF9GTF9IQVZFX0ZSQU1FX1NFUQkoMSA8PCAwKQorCisvKioKKyAqIHN0cnVjdCB2NGwyX2V2ZW50X21vdGlvbl9kZXQgLSBtb3Rpb24gZGV0ZWN0aW9uIGV2ZW50CisgKiBAZmxhZ3M6ICAgICAgICAgICAgIGlmIFY0TDJfRVZFTlRfTURfRkxfSEFWRV9GUkFNRV9TRVEgaXMgc2V0LCB0aGVuIHRoZQorICogICAgICAgICAgICAgICAgICAgICBmcmFtZV9zZXF1ZW5jZSBmaWVsZCBpcyB2YWxpZC4KKyAqIEBmcmFtZV9zZXF1ZW5jZTogICAgdGhlIGZyYW1lIHNlcXVlbmNlIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudC4KKyAqIEByZWdpb25fbWFzazogICAgICAgd2hpY2ggcmVnaW9ucyBkZXRlY3RlZCBtb3Rpb24uCisgKi8KK3N0cnVjdCB2NGwyX2V2ZW50X21vdGlvbl9kZXQgeworCV9fdTMyIGZsYWdzOworCV9fdTMyIGZyYW1lX3NlcXVlbmNlOworCV9fdTMyIHJlZ2lvbl9tYXNrOworfTsKKworc3RydWN0IHY0bDJfZXZlbnQgeworCV9fdTMyCQkJCXR5cGU7CisJdW5pb24geworCQlzdHJ1Y3QgdjRsMl9ldmVudF92c3luYwkJdnN5bmM7CisJCXN0cnVjdCB2NGwyX2V2ZW50X2N0cmwJCWN0cmw7CisJCXN0cnVjdCB2NGwyX2V2ZW50X2ZyYW1lX3N5bmMJZnJhbWVfc3luYzsKKwkJc3RydWN0IHY0bDJfZXZlbnRfc3JjX2NoYW5nZQlzcmNfY2hhbmdlOworCQlzdHJ1Y3QgdjRsMl9ldmVudF9tb3Rpb25fZGV0CW1vdGlvbl9kZXQ7CisJCV9fdTgJCQkJZGF0YVs2NF07CisJfSB1OworCV9fdTMyCQkJCXBlbmRpbmc7CisJX191MzIJCQkJc2VxdWVuY2U7CisJc3RydWN0IHRpbWVzcGVjCQkJdGltZXN0YW1wOworCV9fdTMyCQkJCWlkOworCV9fdTMyCQkJCXJlc2VydmVkWzhdOworfTsKKworI2RlZmluZSBWNEwyX0VWRU5UX1NVQl9GTF9TRU5EX0lOSVRJQUwJCSgxIDw8IDApCisjZGVmaW5lIFY0TDJfRVZFTlRfU1VCX0ZMX0FMTE9XX0ZFRURCQUNLCSgxIDw8IDEpCisKK3N0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiB7CisJX191MzIJCQkJdHlwZTsKKwlfX3UzMgkJCQlpZDsKKwlfX3UzMgkJCQlmbGFnczsKKwlfX3UzMgkJCQlyZXNlcnZlZFs1XTsKK307CisKKy8qCisgKglBIEQgViBBIE4gQyBFIEQgICBEIEUgQiBVIEcgRyBJIE4gRworICoKKyAqCU5PVEU6IEVYUEVSSU1FTlRBTCBBUEksIE5FVkVSIFJFTFkgT04gVEhJUyBJTiBBUFBMSUNBVElPTlMhCisgKglGT1IgREVCVUdHSU5HLCBURVNUSU5HIEFORCBJTlRFUk5BTCBVU0UgT05MWSEKKyAqLworCisvKiBWSURJT0NfREJHX0dfUkVHSVNURVIgYW5kIFZJRElPQ19EQkdfU19SRUdJU1RFUiAqLworCisjZGVmaW5lIFY0TDJfQ0hJUF9NQVRDSF9CUklER0UgICAgICAwICAvKiBNYXRjaCBhZ2FpbnN0IGNoaXAgSUQgb24gdGhlIGJyaWRnZSAoMCBmb3IgdGhlIGJyaWRnZSkgKi8KKyNkZWZpbmUgVjRMMl9DSElQX01BVENIX1NVQkRFViAgICAgIDQgIC8qIE1hdGNoIGFnYWluc3Qgc3ViZGV2IGluZGV4ICovCisKKy8qIFRoZSBmb2xsb3dpbmcgZm91ciBkZWZpbmVzIGFyZSBubyBsb25nZXIgaW4gdXNlICovCisjZGVmaW5lIFY0TDJfQ0hJUF9NQVRDSF9IT1NUIFY0TDJfQ0hJUF9NQVRDSF9CUklER0UKKyNkZWZpbmUgVjRMMl9DSElQX01BVENIX0kyQ19EUklWRVIgIDEgIC8qIE1hdGNoIGFnYWluc3QgSTJDIGRyaXZlciBuYW1lICovCisjZGVmaW5lIFY0TDJfQ0hJUF9NQVRDSF9JMkNfQUREUiAgICAyICAvKiBNYXRjaCBhZ2FpbnN0IEkyQyA3LWJpdCBhZGRyZXNzICovCisjZGVmaW5lIFY0TDJfQ0hJUF9NQVRDSF9BQzk3ICAgICAgICAzICAvKiBNYXRjaCBhZ2FpbnN0IGFuY2lsbGFyeSBBQzk3IGNoaXAgKi8KKworc3RydWN0IHY0bDJfZGJnX21hdGNoIHsKKwlfX3UzMiB0eXBlOyAvKiBNYXRjaCB0eXBlICovCisJdW5pb24geyAgICAgLyogTWF0Y2ggdGhpcyBjaGlwLCBtZWFuaW5nIGRldGVybWluZWQgYnkgdHlwZSAqLworCQlfX3UzMiBhZGRyOworCQljaGFyIG5hbWVbMzJdOworCX07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyIHsKKwlzdHJ1Y3QgdjRsMl9kYmdfbWF0Y2ggbWF0Y2g7CisJX191MzIgc2l6ZTsJLyogcmVnaXN0ZXIgc2l6ZSBpbiBieXRlcyAqLworCV9fdTY0IHJlZzsKKwlfX3U2NCB2YWw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBWNEwyX0NISVBfRkxfUkVBREFCTEUgKDEgPDwgMCkKKyNkZWZpbmUgVjRMMl9DSElQX0ZMX1dSSVRBQkxFICgxIDw8IDEpCisKKy8qIFZJRElPQ19EQkdfR19DSElQX0lORk8gKi8KK3N0cnVjdCB2NGwyX2RiZ19jaGlwX2luZm8geworCXN0cnVjdCB2NGwyX2RiZ19tYXRjaCBtYXRjaDsKKwljaGFyIG5hbWVbMzJdOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHJlc2VydmVkWzMyXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKioKKyAqIHN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzIC0gVklESU9DX0NSRUFURV9CVUZTIGFyZ3VtZW50CisgKiBAaW5kZXg6CW9uIHJldHVybiwgaW5kZXggb2YgdGhlIGZpcnN0IGNyZWF0ZWQgYnVmZmVyCisgKiBAY291bnQ6CWVudHJ5OiBudW1iZXIgb2YgcmVxdWVzdGVkIGJ1ZmZlcnMsCisgKgkJcmV0dXJuOiBudW1iZXIgb2YgY3JlYXRlZCBidWZmZXJzCisgKiBAbWVtb3J5OgllbnVtIHY0bDJfbWVtb3J5OyBidWZmZXIgbWVtb3J5IHR5cGUKKyAqIEBmb3JtYXQ6CWZyYW1lIGZvcm1hdCwgZm9yIHdoaWNoIGJ1ZmZlcnMgYXJlIHJlcXVlc3RlZAorICogQHJlc2VydmVkOglmdXR1cmUgZXh0ZW5zaW9ucworICovCitzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVycyB7CisJX191MzIJCQlpbmRleDsKKwlfX3UzMgkJCWNvdW50OworCV9fdTMyCQkJbWVtb3J5OworCXN0cnVjdCB2NGwyX2Zvcm1hdAlmb3JtYXQ7CisJX191MzIJCQlyZXNlcnZlZFs4XTsKK307CisKKy8qCisgKglJIE8gQyBUIEwgICBDIE8gRCBFIFMgICBGIE8gUiAgIFYgSSBEIEUgTyAgIEQgRSBWIEkgQyBFIFMKKyAqCisgKi8KKyNkZWZpbmUgVklESU9DX1FVRVJZQ0FQCQkgX0lPUignVicsICAwLCBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5KQorI2RlZmluZSBWSURJT0NfUkVTRVJWRUQJCSAgX0lPKCdWJywgIDEpCisjZGVmaW5lIFZJRElPQ19FTlVNX0ZNVCAgICAgICAgIF9JT1dSKCdWJywgIDIsIHN0cnVjdCB2NGwyX2ZtdGRlc2MpCisjZGVmaW5lIFZJRElPQ19HX0ZNVAkJX0lPV1IoJ1YnLCAgNCwgc3RydWN0IHY0bDJfZm9ybWF0KQorI2RlZmluZSBWSURJT0NfU19GTVQJCV9JT1dSKCdWJywgIDUsIHN0cnVjdCB2NGwyX2Zvcm1hdCkKKyNkZWZpbmUgVklESU9DX1JFUUJVRlMJCV9JT1dSKCdWJywgIDgsIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzKQorI2RlZmluZSBWSURJT0NfUVVFUllCVUYJCV9JT1dSKCdWJywgIDksIHN0cnVjdCB2NGwyX2J1ZmZlcikKKyNkZWZpbmUgVklESU9DX0dfRkJVRgkJIF9JT1IoJ1YnLCAxMCwgc3RydWN0IHY0bDJfZnJhbWVidWZmZXIpCisjZGVmaW5lIFZJRElPQ19TX0ZCVUYJCSBfSU9XKCdWJywgMTEsIHN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyKQorI2RlZmluZSBWSURJT0NfT1ZFUkxBWQkJIF9JT1coJ1YnLCAxNCwgaW50KQorI2RlZmluZSBWSURJT0NfUUJVRgkJX0lPV1IoJ1YnLCAxNSwgc3RydWN0IHY0bDJfYnVmZmVyKQorI2RlZmluZSBWSURJT0NfRVhQQlVGCQlfSU9XUignVicsIDE2LCBzdHJ1Y3QgdjRsMl9leHBvcnRidWZmZXIpCisjZGVmaW5lIFZJRElPQ19EUUJVRgkJX0lPV1IoJ1YnLCAxNywgc3RydWN0IHY0bDJfYnVmZmVyKQorI2RlZmluZSBWSURJT0NfU1RSRUFNT04JCSBfSU9XKCdWJywgMTgsIGludCkKKyNkZWZpbmUgVklESU9DX1NUUkVBTU9GRgkgX0lPVygnVicsIDE5LCBpbnQpCisjZGVmaW5lIFZJRElPQ19HX1BBUk0JCV9JT1dSKCdWJywgMjEsIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0pCisjZGVmaW5lIFZJRElPQ19TX1BBUk0JCV9JT1dSKCdWJywgMjIsIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0pCisjZGVmaW5lIFZJRElPQ19HX1NURAkJIF9JT1IoJ1YnLCAyMywgdjRsMl9zdGRfaWQpCisjZGVmaW5lIFZJRElPQ19TX1NURAkJIF9JT1coJ1YnLCAyNCwgdjRsMl9zdGRfaWQpCisjZGVmaW5lIFZJRElPQ19FTlVNU1RECQlfSU9XUignVicsIDI1LCBzdHJ1Y3QgdjRsMl9zdGFuZGFyZCkKKyNkZWZpbmUgVklESU9DX0VOVU1JTlBVVAlfSU9XUignVicsIDI2LCBzdHJ1Y3QgdjRsMl9pbnB1dCkKKyNkZWZpbmUgVklESU9DX0dfQ1RSTAkJX0lPV1IoJ1YnLCAyNywgc3RydWN0IHY0bDJfY29udHJvbCkKKyNkZWZpbmUgVklESU9DX1NfQ1RSTAkJX0lPV1IoJ1YnLCAyOCwgc3RydWN0IHY0bDJfY29udHJvbCkKKyNkZWZpbmUgVklESU9DX0dfVFVORVIJCV9JT1dSKCdWJywgMjksIHN0cnVjdCB2NGwyX3R1bmVyKQorI2RlZmluZSBWSURJT0NfU19UVU5FUgkJIF9JT1coJ1YnLCAzMCwgc3RydWN0IHY0bDJfdHVuZXIpCisjZGVmaW5lIFZJRElPQ19HX0FVRElPCQkgX0lPUignVicsIDMzLCBzdHJ1Y3QgdjRsMl9hdWRpbykKKyNkZWZpbmUgVklESU9DX1NfQVVESU8JCSBfSU9XKCdWJywgMzQsIHN0cnVjdCB2NGwyX2F1ZGlvKQorI2RlZmluZSBWSURJT0NfUVVFUllDVFJMCV9JT1dSKCdWJywgMzYsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCkKKyNkZWZpbmUgVklESU9DX1FVRVJZTUVOVQlfSU9XUignVicsIDM3LCBzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUpCisjZGVmaW5lIFZJRElPQ19HX0lOUFVUCQkgX0lPUignVicsIDM4LCBpbnQpCisjZGVmaW5lIFZJRElPQ19TX0lOUFVUCQlfSU9XUignVicsIDM5LCBpbnQpCisjZGVmaW5lIFZJRElPQ19HX0VESUQJCV9JT1dSKCdWJywgNDAsIHN0cnVjdCB2NGwyX2VkaWQpCisjZGVmaW5lIFZJRElPQ19TX0VESUQJCV9JT1dSKCdWJywgNDEsIHN0cnVjdCB2NGwyX2VkaWQpCisjZGVmaW5lIFZJRElPQ19HX09VVFBVVAkJIF9JT1IoJ1YnLCA0NiwgaW50KQorI2RlZmluZSBWSURJT0NfU19PVVRQVVQJCV9JT1dSKCdWJywgNDcsIGludCkKKyNkZWZpbmUgVklESU9DX0VOVU1PVVRQVVQJX0lPV1IoJ1YnLCA0OCwgc3RydWN0IHY0bDJfb3V0cHV0KQorI2RlZmluZSBWSURJT0NfR19BVURPVVQJCSBfSU9SKCdWJywgNDksIHN0cnVjdCB2NGwyX2F1ZGlvb3V0KQorI2RlZmluZSBWSURJT0NfU19BVURPVVQJCSBfSU9XKCdWJywgNTAsIHN0cnVjdCB2NGwyX2F1ZGlvb3V0KQorI2RlZmluZSBWSURJT0NfR19NT0RVTEFUT1IJX0lPV1IoJ1YnLCA1NCwgc3RydWN0IHY0bDJfbW9kdWxhdG9yKQorI2RlZmluZSBWSURJT0NfU19NT0RVTEFUT1IJIF9JT1coJ1YnLCA1NSwgc3RydWN0IHY0bDJfbW9kdWxhdG9yKQorI2RlZmluZSBWSURJT0NfR19GUkVRVUVOQ1kJX0lPV1IoJ1YnLCA1Niwgc3RydWN0IHY0bDJfZnJlcXVlbmN5KQorI2RlZmluZSBWSURJT0NfU19GUkVRVUVOQ1kJIF9JT1coJ1YnLCA1Nywgc3RydWN0IHY0bDJfZnJlcXVlbmN5KQorI2RlZmluZSBWSURJT0NfQ1JPUENBUAkJX0lPV1IoJ1YnLCA1OCwgc3RydWN0IHY0bDJfY3JvcGNhcCkKKyNkZWZpbmUgVklESU9DX0dfQ1JPUAkJX0lPV1IoJ1YnLCA1OSwgc3RydWN0IHY0bDJfY3JvcCkKKyNkZWZpbmUgVklESU9DX1NfQ1JPUAkJIF9JT1coJ1YnLCA2MCwgc3RydWN0IHY0bDJfY3JvcCkKKyNkZWZpbmUgVklESU9DX0dfSlBFR0NPTVAJIF9JT1IoJ1YnLCA2MSwgc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uKQorI2RlZmluZSBWSURJT0NfU19KUEVHQ09NUAkgX0lPVygnVicsIDYyLCBzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24pCisjZGVmaW5lIFZJRElPQ19RVUVSWVNURCAgICAgIAkgX0lPUignVicsIDYzLCB2NGwyX3N0ZF9pZCkKKyNkZWZpbmUgVklESU9DX1RSWV9GTVQgICAgICAJX0lPV1IoJ1YnLCA2NCwgc3RydWN0IHY0bDJfZm9ybWF0KQorI2RlZmluZSBWSURJT0NfRU5VTUFVRElPCV9JT1dSKCdWJywgNjUsIHN0cnVjdCB2NGwyX2F1ZGlvKQorI2RlZmluZSBWSURJT0NfRU5VTUFVRE9VVAlfSU9XUignVicsIDY2LCBzdHJ1Y3QgdjRsMl9hdWRpb291dCkKKyNkZWZpbmUgVklESU9DX0dfUFJJT1JJVFkJIF9JT1IoJ1YnLCA2NywgX191MzIpIC8qIGVudW0gdjRsMl9wcmlvcml0eSAqLworI2RlZmluZSBWSURJT0NfU19QUklPUklUWQkgX0lPVygnVicsIDY4LCBfX3UzMikgLyogZW51bSB2NGwyX3ByaW9yaXR5ICovCisjZGVmaW5lIFZJRElPQ19HX1NMSUNFRF9WQklfQ0FQIF9JT1dSKCdWJywgNjksIHN0cnVjdCB2NGwyX3NsaWNlZF92YmlfY2FwKQorI2RlZmluZSBWSURJT0NfTE9HX1NUQVRVUyAgICAgICAgIF9JTygnVicsIDcwKQorI2RlZmluZSBWSURJT0NfR19FWFRfQ1RSTFMJX0lPV1IoJ1YnLCA3MSwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzKQorI2RlZmluZSBWSURJT0NfU19FWFRfQ1RSTFMJX0lPV1IoJ1YnLCA3Miwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzKQorI2RlZmluZSBWSURJT0NfVFJZX0VYVF9DVFJMUwlfSU9XUignVicsIDczLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMpCisjZGVmaW5lIFZJRElPQ19FTlVNX0ZSQU1FU0laRVMJX0lPV1IoJ1YnLCA3NCwgc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0pCisjZGVmaW5lIFZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTIF9JT1dSKCdWJywgNzUsIHN0cnVjdCB2NGwyX2ZybWl2YWxlbnVtKQorI2RlZmluZSBWSURJT0NfR19FTkNfSU5ERVggICAgICAgX0lPUignVicsIDc2LCBzdHJ1Y3QgdjRsMl9lbmNfaWR4KQorI2RlZmluZSBWSURJT0NfRU5DT0RFUl9DTUQgICAgICBfSU9XUignVicsIDc3LCBzdHJ1Y3QgdjRsMl9lbmNvZGVyX2NtZCkKKyNkZWZpbmUgVklESU9DX1RSWV9FTkNPREVSX0NNRCAgX0lPV1IoJ1YnLCA3OCwgc3RydWN0IHY0bDJfZW5jb2Rlcl9jbWQpCisKKy8qCisgKiBFeHBlcmltZW50YWwsIG1lYW50IGZvciBkZWJ1Z2dpbmcsIHRlc3RpbmcgYW5kIGludGVybmFsIHVzZS4KKyAqIE9ubHkgaW1wbGVtZW50ZWQgaWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRyBpcyBkZWZpbmVkLgorICogWW91IG11c3QgYmUgcm9vdCB0byB1c2UgdGhlc2UgaW9jdGxzLiBOZXZlciB1c2UgdGhlc2UgaW4gYXBwbGljYXRpb25zIQorICovCisjZGVmaW5lCVZJRElPQ19EQkdfU19SRUdJU1RFUiAJIF9JT1coJ1YnLCA3OSwgc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyKQorI2RlZmluZQlWSURJT0NfREJHX0dfUkVHSVNURVIgCV9JT1dSKCdWJywgODAsIHN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlcikKKworI2RlZmluZSBWSURJT0NfU19IV19GUkVRX1NFRUsJIF9JT1coJ1YnLCA4Miwgc3RydWN0IHY0bDJfaHdfZnJlcV9zZWVrKQorI2RlZmluZQlWSURJT0NfU19EVl9USU1JTkdTCV9JT1dSKCdWJywgODcsIHN0cnVjdCB2NGwyX2R2X3RpbWluZ3MpCisjZGVmaW5lCVZJRElPQ19HX0RWX1RJTUlOR1MJX0lPV1IoJ1YnLCA4OCwgc3RydWN0IHY0bDJfZHZfdGltaW5ncykKKyNkZWZpbmUJVklESU9DX0RRRVZFTlQJCSBfSU9SKCdWJywgODksIHN0cnVjdCB2NGwyX2V2ZW50KQorI2RlZmluZQlWSURJT0NfU1VCU0NSSUJFX0VWRU5UCSBfSU9XKCdWJywgOTAsIHN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbikKKyNkZWZpbmUJVklESU9DX1VOU1VCU0NSSUJFX0VWRU5UIF9JT1coJ1YnLCA5MSwgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uKQorI2RlZmluZSBWSURJT0NfQ1JFQVRFX0JVRlMJX0lPV1IoJ1YnLCA5Miwgc3RydWN0IHY0bDJfY3JlYXRlX2J1ZmZlcnMpCisjZGVmaW5lIFZJRElPQ19QUkVQQVJFX0JVRglfSU9XUignVicsIDkzLCBzdHJ1Y3QgdjRsMl9idWZmZXIpCisjZGVmaW5lIFZJRElPQ19HX1NFTEVDVElPTglfSU9XUignVicsIDk0LCBzdHJ1Y3QgdjRsMl9zZWxlY3Rpb24pCisjZGVmaW5lIFZJRElPQ19TX1NFTEVDVElPTglfSU9XUignVicsIDk1LCBzdHJ1Y3QgdjRsMl9zZWxlY3Rpb24pCisjZGVmaW5lIFZJRElPQ19ERUNPREVSX0NNRAlfSU9XUignVicsIDk2LCBzdHJ1Y3QgdjRsMl9kZWNvZGVyX2NtZCkKKyNkZWZpbmUgVklESU9DX1RSWV9ERUNPREVSX0NNRAlfSU9XUignVicsIDk3LCBzdHJ1Y3QgdjRsMl9kZWNvZGVyX2NtZCkKKyNkZWZpbmUgVklESU9DX0VOVU1fRFZfVElNSU5HUyAgX0lPV1IoJ1YnLCA5OCwgc3RydWN0IHY0bDJfZW51bV9kdl90aW1pbmdzKQorI2RlZmluZSBWSURJT0NfUVVFUllfRFZfVElNSU5HUyAgX0lPUignVicsIDk5LCBzdHJ1Y3QgdjRsMl9kdl90aW1pbmdzKQorI2RlZmluZSBWSURJT0NfRFZfVElNSU5HU19DQVAgICBfSU9XUignVicsIDEwMCwgc3RydWN0IHY0bDJfZHZfdGltaW5nc19jYXApCisjZGVmaW5lIFZJRElPQ19FTlVNX0ZSRVFfQkFORFMJX0lPV1IoJ1YnLCAxMDEsIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeV9iYW5kKQorCisvKgorICogRXhwZXJpbWVudGFsLCBtZWFudCBmb3IgZGVidWdnaW5nLCB0ZXN0aW5nIGFuZCBpbnRlcm5hbCB1c2UuCisgKiBOZXZlciB1c2UgdGhpcyBpbiBhcHBsaWNhdGlvbnMhCisgKi8KKyNkZWZpbmUgVklESU9DX0RCR19HX0NISVBfSU5GTyAgX0lPV1IoJ1YnLCAxMDIsIHN0cnVjdCB2NGwyX2RiZ19jaGlwX2luZm8pCisKKyNkZWZpbmUgVklESU9DX1FVRVJZX0VYVF9DVFJMCV9JT1dSKCdWJywgMTAzLCBzdHJ1Y3QgdjRsMl9xdWVyeV9leHRfY3RybCkKKworLyogUmVtaW5kZXI6IHdoZW4gYWRkaW5nIG5ldyBpb2N0bHMgcGxlYXNlIGFkZCBzdXBwb3J0IGZvciB0aGVtIHRvCisgICBkcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWNvbXBhdC1pb2N0bDMyLmMgYXMgd2VsbCEgKi8KKworI2RlZmluZSBCQVNFX1ZJRElPQ19QUklWQVRFCTE5MgkJLyogMTkyLTI1NSBhcmUgcHJpdmF0ZSAqLworCisjZW5kaWYgLyogX1VBUElfX0xJTlVYX1ZJREVPREVWMl9IICovCmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwyLmMgYi9zeXMvdjRsMi9nc3R2NGwyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhMjg3MwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDIuYwpAQCAtMCwwICsxLDI3MiBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogICAgICAgICAgICAgICAyMDA2IEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+CisgKgorICogZ3N0djRsMi5jOiBwbHVnaW4gZm9yIHY0bDIgZWxlbWVudHMKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIF9HTlVfU09VUkNFICAgICAgICAgICAgLyogT19DTE9FWEVDICovCisjZW5kaWYKKworI2luY2x1ZGUgImdzdC9nc3QtaTE4bi1wbHVnaW4uaCIKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImV4dC92aWRlb2RldjIuaCIKKyNpbmNsdWRlICJ2NGwyLXV0aWxzLmgiCisKKyNpbmNsdWRlICJnc3R2NGwyb2JqZWN0LmgiCisjaW5jbHVkZSAiZ3N0djRsMnNyYy5oIgorI2luY2x1ZGUgImdzdHY0bDJzaW5rLmgiCisjaW5jbHVkZSAiZ3N0djRsMnJhZGlvLmgiCisjaW5jbHVkZSAiZ3N0djRsMnZpZGVvZGVjLmgiCisjaW5jbHVkZSAiZ3N0djRsMmgyNjNlbmMuaCIKKyNpbmNsdWRlICJnc3R2NGwyaDI2NGVuYy5oIgorI2luY2x1ZGUgImdzdHY0bDJtcGVnNGVuYy5oIgorI2luY2x1ZGUgImdzdHY0bDJ2cDhlbmMuaCIKKyNpbmNsdWRlICJnc3R2NGwydnA5ZW5jLmgiCisjaW5jbHVkZSAiZ3N0djRsMmRldmljZXByb3ZpZGVyLmgiCisjaW5jbHVkZSAiZ3N0djRsMnRyYW5zZm9ybS5oIgorCisvKiB1c2VkIGluIGdzdHY0bDJvYmplY3QuYyBhbmQgdjRsMl9jYWxscy5jICovCitHU1RfREVCVUdfQ0FURUdPUlkgKHY0bDJfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgdjRsMl9kZWJ1ZworCisjaWZkZWYgR1NUX1Y0TDJfRU5BQkxFX1BST0JFCisvKiBUaGlzIGlzIGEgbWluaW1hbGlzdCBwcm9iZSwgZm9yIHNwZWVkLCB3ZSBvbmx5IGVudW1lcmF0ZSBmb3JtYXRzICovCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfdjRsMl9wcm9iZV90ZW1wbGF0ZV9jYXBzIChjb25zdCBnY2hhciAqIGRldmljZSwgZ2ludCB2aWRlb19mZCwKKyAgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKyAgZ2ludCBuOworICBzdHJ1Y3QgdjRsMl9mbXRkZXNjIGZvcm1hdDsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBHU1RfREVCVUcgKCJHZXR0aW5nICVzIGZvcm1hdCBlbnVtZXJhdGlvbnMiLCBkZXZpY2UpOworICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIGZvciAobiA9IDA7OyBuKyspIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnRlbXBsYXRlOworCisgICAgbWVtc2V0ICgmZm9ybWF0LCAwLCBzaXplb2YgKGZvcm1hdCkpOworCisgICAgZm9ybWF0LmluZGV4ID0gbjsKKyAgICBmb3JtYXQudHlwZSA9IHR5cGU7CisKKyAgICBpZiAoaW9jdGwgKHZpZGVvX2ZkLCBWSURJT0NfRU5VTV9GTVQsICZmb3JtYXQpIDwgMCkKKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGVudW1lcmF0aW9uICovCisKKyAgICBHU1RfTE9HICgiaW5kZXg6ICAgICAgICV1IiwgZm9ybWF0LmluZGV4KTsKKyAgICBHU1RfTE9HICgidHlwZTogICAgICAgICVkIiwgZm9ybWF0LnR5cGUpOworICAgIEdTVF9MT0cgKCJmbGFnczogICAgICAgJTA4eCIsIGZvcm1hdC5mbGFncyk7CisgICAgR1NUX0xPRyAoImRlc2NyaXB0aW9uOiAnJXMnIiwgZm9ybWF0LmRlc2NyaXB0aW9uKTsKKyAgICBHU1RfTE9HICgicGl4ZWxmb3JtYXQ6ICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvcm1hdC5waXhlbGZvcm1hdCkpOworCisgICAgdGVtcGxhdGUgPSBnc3RfdjRsMl9vYmplY3RfdjRsMmZvdXJjY190b19zdHJ1Y3R1cmUgKGZvcm1hdC5waXhlbGZvcm1hdCk7CisKKyAgICBpZiAodGVtcGxhdGUpIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqYWx0X3QgPSBOVUxMOworCisgICAgICBzd2l0Y2ggKGZvcm1hdC5waXhlbGZvcm1hdCkgeworICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0IzMjoKKyAgICAgICAgICBhbHRfdCA9IGdzdF9zdHJ1Y3R1cmVfY29weSAodGVtcGxhdGUpOworICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChhbHRfdCwgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJBUkdCIiwgTlVMTCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVjRMMl9QSVhfRk1UX0JHUjMyOgorICAgICAgICAgIGFsdF90ID0gZ3N0X3N0cnVjdHVyZV9jb3B5ICh0ZW1wbGF0ZSk7CisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKGFsdF90LCAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIkJHUkEiLCBOVUxMKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2FwcywgdGVtcGxhdGUpOworCisgICAgICBpZiAoYWx0X3QpCisgICAgICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKGNhcHMsIGFsdF90KTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZ3N0X2NhcHNfc2ltcGxpZnkgKGNhcHMpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX3Byb2JlX2FuZF9yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBHc3RWNGwySXRlcmF0b3IgKml0OworICBnaW50IHZpZGVvX2ZkID0gLTE7CisgIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgdmNhcDsKKyAgZ3VpbnQzMiBkZXZpY2VfY2FwczsKKworICBpdCA9IGdzdF92NGwyX2l0ZXJhdG9yX25ldyAoKTsKKworICB3aGlsZSAoZ3N0X3Y0bDJfaXRlcmF0b3JfbmV4dCAoaXQpKSB7CisgICAgR3N0Q2FwcyAqc3JjX2NhcHMsICpzaW5rX2NhcHM7CisgICAgZ2NoYXIgKmJhc2VuYW1lOworCisgICAgaWYgKHZpZGVvX2ZkID49IDApCisgICAgICBjbG9zZSAodmlkZW9fZmQpOworCisgICAgdmlkZW9fZmQgPSBvcGVuIChpdC0+ZGV2aWNlX3BhdGgsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CisKKyAgICBpZiAodmlkZW9fZmQgPT0gLTEpIHsKKyAgICAgIEdTVF9ERUJVRyAoIkZhaWxlZCB0byBvcGVuICVzOiAlcyIsIGl0LT5kZXZpY2VfcGF0aCwgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIG1lbXNldCAoJnZjYXAsIDAsIHNpemVvZiAodmNhcCkpOworCisgICAgaWYgKGlvY3RsICh2aWRlb19mZCwgVklESU9DX1FVRVJZQ0FQLCAmdmNhcCkgPCAwKSB7CisgICAgICBHU1RfREVCVUcgKCJGYWlsZWQgdG8gZ2V0IGRldmljZSBjYXBhYmlsaXRpZXM6ICVzIiwgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmICh2Y2FwLmNhcGFiaWxpdGllcyAmIFY0TDJfQ0FQX0RFVklDRV9DQVBTKQorICAgICAgZGV2aWNlX2NhcHMgPSB2Y2FwLmRldmljZV9jYXBzOworICAgIGVsc2UKKyAgICAgIGRldmljZV9jYXBzID0gdmNhcC5jYXBhYmlsaXRpZXM7CisKKyAgICBpZiAoISgoZGV2aWNlX2NhcHMgJiAoVjRMMl9DQVBfVklERU9fTTJNIHwgVjRMMl9DQVBfVklERU9fTTJNX01QTEFORSkpIHx8CisgICAgICAgICAgICAvKiBCdXQgbGVnYWN5IGRyaXZlciBtYXkgZXhwb3NlIGJvdGggQ0FQVFVSRSBhbmQgT1VUUFVUICovCisgICAgICAgICAgICAoKGRldmljZV9jYXBzICYKKyAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9WSURFT19DQVBUVVJFX01QTEFORSkpICYmCisgICAgICAgICAgICAgICAgKGRldmljZV9jYXBzICYKKyAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0FQX1ZJREVPX09VVFBVVCB8IFY0TDJfQ0FQX1ZJREVPX09VVFBVVF9NUExBTkUpKSkpKQorICAgICAgY29udGludWU7CisKKyAgICBHU1RfREVCVUcgKCJQcm9iaW5nICclcycgbG9jYXRlZCBhdCAnJXMnIiwKKyAgICAgICAgaXQtPmRldmljZV9uYW1lID8gaXQtPmRldmljZV9uYW1lIDogKGNvbnN0IGdjaGFyICopIHZjYXAuZHJpdmVyLAorICAgICAgICBpdC0+ZGV2aWNlX3BhdGgpOworCisgICAgLyogZ2V0IHNpbmsgc3VwcG9ydGVkIGZvcm1hdCAobm8gTVBMQU5FIGZvciBjb2RlYykgKi8KKyAgICBzaW5rX2NhcHMgPSBnc3RfY2Fwc19tZXJnZSAoZ3N0X3Y0bDJfcHJvYmVfdGVtcGxhdGVfY2FwcyAoaXQtPmRldmljZV9wYXRoLAorICAgICAgICAgICAgdmlkZW9fZmQsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUKSwKKyAgICAgICAgZ3N0X3Y0bDJfcHJvYmVfdGVtcGxhdGVfY2FwcyAoaXQtPmRldmljZV9wYXRoLCB2aWRlb19mZCwKKyAgICAgICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkpOworCisgICAgLyogZ2V0IHNyYyBzdXBwb3J0ZWQgZm9ybWF0ICovCisgICAgc3JjX2NhcHMgPSBnc3RfY2Fwc19tZXJnZSAoZ3N0X3Y0bDJfcHJvYmVfdGVtcGxhdGVfY2FwcyAoaXQtPmRldmljZV9wYXRoLAorICAgICAgICAgICAgdmlkZW9fZmQsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSksCisgICAgICAgIGdzdF92NGwyX3Byb2JlX3RlbXBsYXRlX2NhcHMgKGl0LT5kZXZpY2VfcGF0aCwgdmlkZW9fZmQsCisgICAgICAgICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSk7CisKKyAgICAvKiBTa2lwIGRldmljZXMgd2l0aG91dCBhbnkgc3VwcG9ydGVkIGZvcm1hdHMgKi8KKyAgICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKHNpbmtfY2FwcykgfHwgZ3N0X2NhcHNfaXNfZW1wdHkgKHNyY19jYXBzKSkgeworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHNpbmtfY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoc3JjX2NhcHMpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgYmFzZW5hbWUgPSBnX3BhdGhfZ2V0X2Jhc2VuYW1lIChpdC0+ZGV2aWNlX3BhdGgpOworCisgICAgaWYgKGdzdF92NGwyX2lzX3ZpZGVvX2RlYyAoc2lua19jYXBzLCBzcmNfY2FwcykpIHsKKyAgICAgIGdzdF92NGwyX3ZpZGVvX2RlY19yZWdpc3RlciAocGx1Z2luLCBiYXNlbmFtZSwgaXQtPmRldmljZV9wYXRoLAorICAgICAgICAgIHNpbmtfY2Fwcywgc3JjX2NhcHMpOworICAgIH0gZWxzZSBpZiAoZ3N0X3Y0bDJfaXNfdmlkZW9fZW5jIChzaW5rX2NhcHMsIHNyY19jYXBzLCBOVUxMKSkgeworICAgICAgaWYgKGdzdF92NGwyX2lzX2gyNjRfZW5jIChzaW5rX2NhcHMsIHNyY19jYXBzKSkKKyAgICAgICAgZ3N0X3Y0bDJfaDI2NF9lbmNfcmVnaXN0ZXIgKHBsdWdpbiwgYmFzZW5hbWUsIGl0LT5kZXZpY2VfcGF0aCwKKyAgICAgICAgICAgIHNpbmtfY2Fwcywgc3JjX2NhcHMpOworCisgICAgICBpZiAoZ3N0X3Y0bDJfaXNfbXBlZzRfZW5jIChzaW5rX2NhcHMsIHNyY19jYXBzKSkKKyAgICAgICAgZ3N0X3Y0bDJfbXBlZzRfZW5jX3JlZ2lzdGVyIChwbHVnaW4sIGJhc2VuYW1lLCBpdC0+ZGV2aWNlX3BhdGgsCisgICAgICAgICAgICBzaW5rX2NhcHMsIHNyY19jYXBzKTsKKworICAgICAgaWYgKGdzdF92NGwyX2lzX2gyNjNfZW5jIChzaW5rX2NhcHMsIHNyY19jYXBzKSkKKyAgICAgICAgZ3N0X3Y0bDJfaDI2M19lbmNfcmVnaXN0ZXIgKHBsdWdpbiwgYmFzZW5hbWUsIGl0LT5kZXZpY2VfcGF0aCwKKyAgICAgICAgICAgIHNpbmtfY2Fwcywgc3JjX2NhcHMpOworCisgICAgICBpZiAoZ3N0X3Y0bDJfaXNfdnA4X2VuYyAoc2lua19jYXBzLCBzcmNfY2FwcykpCisgICAgICAgIGdzdF92NGwyX3ZwOF9lbmNfcmVnaXN0ZXIgKHBsdWdpbiwgYmFzZW5hbWUsIGl0LT5kZXZpY2VfcGF0aCwKKyAgICAgICAgICAgIHNpbmtfY2Fwcywgc3JjX2NhcHMpOworCisgICAgICBpZiAoZ3N0X3Y0bDJfaXNfdnA5X2VuYyAoc2lua19jYXBzLCBzcmNfY2FwcykpCisgICAgICAgIGdzdF92NGwyX3ZwOV9lbmNfcmVnaXN0ZXIgKHBsdWdpbiwgYmFzZW5hbWUsIGl0LT5kZXZpY2VfcGF0aCwKKyAgICAgICAgICAgIHNpbmtfY2Fwcywgc3JjX2NhcHMpOworICAgIH0gZWxzZSBpZiAoZ3N0X3Y0bDJfaXNfdHJhbnNmb3JtIChzaW5rX2NhcHMsIHNyY19jYXBzKSkgeworICAgICAgZ3N0X3Y0bDJfdHJhbnNmb3JtX3JlZ2lzdGVyIChwbHVnaW4sIGJhc2VuYW1lLCBpdC0+ZGV2aWNlX3BhdGgsCisgICAgICAgICAgc2lua19jYXBzLCBzcmNfY2Fwcyk7CisgICAgfQorICAgIC8qIGVsc2UgaWYgKCAuLi4gZXRjLiAqLworCisgICAgZ3N0X2NhcHNfdW5yZWYgKHNpbmtfY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHNyY19jYXBzKTsKKyAgICBnX2ZyZWUgKGJhc2VuYW1lKTsKKyAgfQorCisgIGlmICh2aWRlb19mZCA+PSAwKQorICAgIGNsb3NlICh2aWRlb19mZCk7CisKKyAgZ3N0X3Y0bDJfaXRlcmF0b3JfZnJlZSAoaXQpOworCisgIHJldHVybiBUUlVFOworfQorI2VuZGlmCisKK3N0YXRpYyBnYm9vbGVhbgorcGx1Z2luX2luaXQgKEdzdFBsdWdpbiAqIHBsdWdpbikKK3sKKyAgY29uc3QgZ2NoYXIgKnBhdGhzW10gPSB7ICIvZGV2IiwgIi9kZXYvdjRsMiIsIE5VTEwgfTsKKyAgY29uc3QgZ2NoYXIgKm5hbWVzW10gPSB7ICJ2aWRlbyIsIE5VTEwgfTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAodjRsMl9kZWJ1ZywgInY0bDIiLCAwLCAiVjRMMiBBUEkgY2FsbHMiKTsKKworICAvKiBBZGQgc29tZSBkZXBlZGVuY3ksIHNvIHRoZSBkeW5hbWljIGZlYXR1cmVzIGdldCB1cGRhdGVkIHVwb24gY2hhbmdlcyBpbgorICAgKiAvZGV2L3ZpZGVvKiAqLworICBnc3RfcGx1Z2luX2FkZF9kZXBlbmRlbmN5IChwbHVnaW4sCisgICAgICBOVUxMLCBwYXRocywgbmFtZXMsIEdTVF9QTFVHSU5fREVQRU5ERU5DWV9GTEFHX0ZJTEVfTkFNRV9JU19QUkVGSVgpOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInY0bDJzcmMiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIEdTVF9UWVBFX1Y0TDJTUkMpIHx8CisgICAgICAhZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInY0bDJzaW5rIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9WNEwyU0lOSykgfHwKKyAgICAgICFnc3RfZWxlbWVudF9yZWdpc3RlciAocGx1Z2luLCAidjRsMnJhZGlvIiwgR1NUX1JBTktfTk9ORSwKKyAgICAgICAgICBHU1RfVFlQRV9WNEwyUkFESU8pIHx8CisgICAgICAhZ3N0X2RldmljZV9wcm92aWRlcl9yZWdpc3RlciAocGx1Z2luLCAidjRsMmRldmljZXByb3ZpZGVyIiwKKyAgICAgICAgICBHU1RfUkFOS19QUklNQVJZLCBHU1RfVFlQRV9WNEwyX0RFVklDRV9QUk9WSURFUikKKyAgICAgIC8qIGV0Yy4gKi8KKyNpZmRlZiBHU1RfVjRMMl9FTkFCTEVfUFJPQkUKKyAgICAgIHx8ICFnc3RfdjRsMl9wcm9iZV9hbmRfcmVnaXN0ZXIgKHBsdWdpbikKKyNlbmRpZgorICAgICAgKQorICAgIHJldHVybiBGQUxTRTsKKworI2lmZGVmIEVOQUJMRV9OTFMKKyAgYmluZHRleHRkb21haW4gKEdFVFRFWFRfUEFDS0FHRSwgTE9DQUxFRElSKTsKKyAgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKEdFVFRFWFRfUEFDS0FHRSwgIlVURi04Iik7CisjZW5kaWYgLyogRU5BQkxFX05MUyAqLworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgdmlkZW80bGludXgyLAorICAgICJlbGVtZW50cyBmb3IgVmlkZW8gNCBMaW51eCIsCisgICAgcGx1Z2luX2luaXQsIFZFUlNJT04sIEdTVF9MSUNFTlNFLCBHU1RfUEFDS0FHRV9OQU1FLCBHU1RfUEFDS0FHRV9PUklHSU4pCmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmMgYi9zeXMvdjRsMi9nc3R2NGwyYWxsb2NhdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhNTgxYgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuYwpAQCAtMCwwICsxLDE0NDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgQ29sbGFib3JhIEx0ZC4KKyAqICAgICBBdXRob3I6IE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWZuZGVmIF9HTlVfU09VUkNFCisjIGRlZmluZSBfR05VX1NPVVJDRSAgICAgICAgICAgIC8qIE9fQ0xPRVhFQyAqLworI2VuZGlmCisKKyNpbmNsdWRlICJleHQvdmlkZW9kZXYyLmgiCisKKyNpbmNsdWRlICJnc3R2NGwyb2JqZWN0LmgiCisjaW5jbHVkZSAiZ3N0djRsMmFsbG9jYXRvci5oIgorCisjaW5jbHVkZSA8Z3N0L2FsbG9jYXRvcnMvZ3N0ZG1hYnVmLmg+CisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBHU1RfVjRMMl9NRU1PUllfVFlQRSAiVjRsMk1lbW9yeSIKKworI2RlZmluZSBnc3RfdjRsMl9hbGxvY2F0b3JfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0VjRsMkFsbG9jYXRvciwgZ3N0X3Y0bDJfYWxsb2NhdG9yLCBHU1RfVFlQRV9BTExPQ0FUT1IpOworCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDICh2NGwyYWxsb2NhdG9yX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHY0bDJhbGxvY2F0b3JfZGVidWcKKworI2RlZmluZSBVTlNFVF9RVUVVRUQoYnVmZmVyKSBcCisgICAgKChidWZmZXIpLmZsYWdzICY9IH4oVjRMMl9CVUZfRkxBR19RVUVVRUQgfCBWNEwyX0JVRl9GTEFHX0RPTkUpKQorCisjZGVmaW5lIFNFVF9RVUVVRUQoYnVmZmVyKSAoKGJ1ZmZlcikuZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19RVUVVRUQpCisKKyNkZWZpbmUgSVNfUVVFVUVEKGJ1ZmZlcikgXAorICAgICgoYnVmZmVyKS5mbGFncyAmIChWNEwyX0JVRl9GTEFHX1FVRVVFRCB8IFY0TDJfQlVGX0ZMQUdfRE9ORSkpCisKK2VudW0KK3sKKyAgR1JPVVBfUkVMRUFTRUQsCisgIExBU1RfU0lHTkFMCit9OworCitzdGF0aWMgZ3VpbnQgZ3N0X3Y0bDJfYWxsb2NhdG9yX3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07CisKK3N0YXRpYyB2b2lkIGdzdF92NGwyX2FsbG9jYXRvcl9yZWxlYXNlIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yLAorICAgIEdzdFY0bDJNZW1vcnkgKiBtZW0pOworCitzdGF0aWMgY29uc3QgZ2NoYXIgKgorbWVtb3J5X3R5cGVfdG9fc3RyIChndWludDMyIG1lbW9yeSkKK3sKKyAgc3dpdGNoIChtZW1vcnkpIHsKKyAgICBjYXNlIFY0TDJfTUVNT1JZX01NQVA6CisgICAgICByZXR1cm4gIm1tYXAiOworICAgIGNhc2UgVjRMMl9NRU1PUllfVVNFUlBUUjoKKyAgICAgIHJldHVybiAidXNlcnB0ciI7CisgICAgY2FzZSBWNEwyX01FTU9SWV9ETUFCVUY6CisgICAgICByZXR1cm4gImRtYWJ1ZiI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAidW5rbm93biI7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHc3RWNGxNZW1vcnkgaW1wbGVtZW50YXRpb24gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgZ3BvaW50ZXIKK192NGwybWVtX21hcCAoR3N0VjRsMk1lbW9yeSAqIG1lbSwgZ3NpemUgbWF4c2l6ZSwgR3N0TWFwRmxhZ3MgZmxhZ3MpCit7CisgIGdwb2ludGVyIGRhdGEgPSBOVUxMOworCisgIHN3aXRjaCAobWVtLT5ncm91cC0+YnVmZmVyLm1lbW9yeSkgeworICAgIGNhc2UgVjRMMl9NRU1PUllfTU1BUDoKKyAgICBjYXNlIFY0TDJfTUVNT1JZX1VTRVJQVFI6CisgICAgICBkYXRhID0gbWVtLT5kYXRhOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX01FTU9SWV9ETUFCVUY6CisgICAgICAvKiB2NGwyIGRtYWJ1ZiBtZW1vcnkgYXJlIG5vdCBzaGFyZWQgd2l0aCBkb3duc3RyZWFtICovCisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHU1RfV0FSTklORyAoIlVua25vd24gbWVtb3J5IHR5cGUgJWkiLCBtZW0tPmdyb3VwLT5idWZmZXIubWVtb3J5KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBkYXRhOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK192NGwybWVtX3VubWFwIChHc3RWNGwyTWVtb3J5ICogbWVtKQoreworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBzd2l0Y2ggKG1lbS0+Z3JvdXAtPmJ1ZmZlci5tZW1vcnkpIHsKKyAgICBjYXNlIFY0TDJfTUVNT1JZX01NQVA6CisgICAgY2FzZSBWNEwyX01FTU9SWV9VU0VSUFRSOgorICAgICAgcmV0ID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9NRU1PUllfRE1BQlVGOgorICAgICAgLyogdjRsMiBkbWFidWYgbWVtb3J5IGFyZSBub3Qgc2hhcmUgd2l0aCBkb3duc3RyZWFtICovCisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHU1RfV0FSTklORyAoIlVua25vd24gbWVtb3J5IHR5cGUgJWkiLCBtZW0tPmdyb3VwLT5idWZmZXIubWVtb3J5KTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorX3Y0bDJtZW1fZGlzcG9zZSAoR3N0VjRsMk1lbW9yeSAqIG1lbSkKK3sKKyAgR3N0VjRsMkFsbG9jYXRvciAqYWxsb2NhdG9yID0gKEdzdFY0bDJBbGxvY2F0b3IgKikgbWVtLT5tZW0uYWxsb2NhdG9yOworICBHc3RWNGwyTWVtb3J5R3JvdXAgKmdyb3VwID0gbWVtLT5ncm91cDsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIGlmIChncm91cC0+bWVtW21lbS0+cGxhbmVdKSB7CisgICAgLyogV2UgbWF5IGhhdmUgYSBkbWFidWYsIHJlcGxhY2UgaXQgd2l0aCByZXR1cm5lZCBvcmlnaW5hbCBtZW1vcnkgKi8KKyAgICBncm91cC0+bWVtW21lbS0+cGxhbmVdID0gZ3N0X21lbW9yeV9yZWYgKChHc3RNZW1vcnkgKikgbWVtKTsKKyAgICBnc3RfdjRsMl9hbGxvY2F0b3JfcmVsZWFzZSAoYWxsb2NhdG9yLCBtZW0pOworICAgIHJldCA9IEZBTFNFOworICB9IGVsc2UgeworICAgIGdzdF9vYmplY3RfcmVmIChhbGxvY2F0b3IpOworICAgIHJldCA9IFRSVUU7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIEdzdFY0bDJNZW1vcnkgKgorX3Y0bDJtZW1fbmV3IChHc3RNZW1vcnlGbGFncyBmbGFncywgR3N0QWxsb2NhdG9yICogYWxsb2NhdG9yLAorICAgIEdzdE1lbW9yeSAqIHBhcmVudCwgZ3NpemUgbWF4c2l6ZSwgZ3NpemUgYWxpZ24sIGdzaXplIG9mZnNldCwgZ3NpemUgc2l6ZSwKKyAgICBnaW50IHBsYW5lLCBncG9pbnRlciBkYXRhLCBpbnQgZG1hZmQsIEdzdFY0bDJNZW1vcnlHcm91cCAqIGdyb3VwKQoreworICBHc3RWNGwyTWVtb3J5ICptZW07CisKKyAgbWVtID0gZ19zbGljZV9uZXcwIChHc3RWNGwyTWVtb3J5KTsKKyAgZ3N0X21lbW9yeV9pbml0IChHU1RfTUVNT1JZX0NBU1QgKG1lbSksCisgICAgICBmbGFncywgYWxsb2NhdG9yLCBwYXJlbnQsIG1heHNpemUsIGFsaWduLCBvZmZzZXQsIHNpemUpOworCisgIGlmIChwYXJlbnQgPT0gTlVMTCkKKyAgICBtZW0tPm1lbS5taW5pX29iamVjdC5kaXNwb3NlID0KKyAgICAgICAgKEdzdE1pbmlPYmplY3REaXNwb3NlRnVuY3Rpb24pIF92NGwybWVtX2Rpc3Bvc2U7CisKKyAgbWVtLT5wbGFuZSA9IHBsYW5lOworICBtZW0tPmRhdGEgPSBkYXRhOworICBtZW0tPmRtYWZkID0gZG1hZmQ7CisgIG1lbS0+Z3JvdXAgPSBncm91cDsKKworICByZXR1cm4gbWVtOworfQorCitzdGF0aWMgR3N0VjRsMk1lbW9yeSAqCitfdjRsMm1lbV9zaGFyZSAoR3N0VjRsMk1lbW9yeSAqIG1lbSwgZ3NzaXplIG9mZnNldCwgZ3NpemUgc2l6ZSkKK3sKKyAgR3N0VjRsMk1lbW9yeSAqc3ViOworICBHc3RNZW1vcnkgKnBhcmVudDsKKworICAvKiBmaW5kIHRoZSByZWFsIHBhcmVudCAqLworICBpZiAoKHBhcmVudCA9IG1lbS0+bWVtLnBhcmVudCkgPT0gTlVMTCkKKyAgICBwYXJlbnQgPSAoR3N0TWVtb3J5ICopIG1lbTsKKworICBpZiAoc2l6ZSA9PSAtMSkKKyAgICBzaXplID0gbWVtLT5tZW0uc2l6ZSAtIG9mZnNldDsKKworICAvKiB0aGUgc2hhcmVkIG1lbW9yeSBpcyBhbHdheXMgcmVhZG9ubHkgKi8KKyAgc3ViID0gX3Y0bDJtZW1fbmV3IChHU1RfTUlOSV9PQkpFQ1RfRkxBR1MgKHBhcmVudCkgfAorICAgICAgR1NUX01JTklfT0JKRUNUX0ZMQUdfTE9DS19SRUFET05MWSwgbWVtLT5tZW0uYWxsb2NhdG9yLCBwYXJlbnQsCisgICAgICBtZW0tPm1lbS5tYXhzaXplLCBtZW0tPm1lbS5hbGlnbiwgb2Zmc2V0LCBzaXplLCBtZW0tPnBsYW5lLCBtZW0tPmRhdGEsCisgICAgICAtMSwgbWVtLT5ncm91cCk7CisKKyAgcmV0dXJuIHN1YjsKK30KKworc3RhdGljIGdib29sZWFuCitfdjRsMm1lbV9pc19zcGFuIChHc3RWNGwyTWVtb3J5ICogbWVtMSwgR3N0VjRsMk1lbW9yeSAqIG1lbTIsIGdzaXplICogb2Zmc2V0KQoreworICBpZiAob2Zmc2V0KQorICAgICpvZmZzZXQgPSBtZW0xLT5tZW0ub2Zmc2V0IC0gbWVtMS0+bWVtLnBhcmVudC0+b2Zmc2V0OworCisgIC8qIGFuZCBtZW1vcnkgaXMgY29udGlndW91cyAqLworICByZXR1cm4gbWVtMS0+bWVtLm9mZnNldCArIG1lbTEtPm1lbS5zaXplID09IG1lbTItPm1lbS5vZmZzZXQ7Cit9CisKK2dib29sZWFuCitnc3RfaXNfdjRsMl9tZW1vcnkgKEdzdE1lbW9yeSAqIG1lbSkKK3sKKyAgcmV0dXJuIGdzdF9tZW1vcnlfaXNfdHlwZSAobWVtLCBHU1RfVjRMMl9NRU1PUllfVFlQRSk7Cit9CisKK0dRdWFyaworZ3N0X3Y0bDJfbWVtb3J5X3F1YXJrICh2b2lkKQoreworICBzdGF0aWMgR1F1YXJrIHF1YXJrID0gMDsKKworICBpZiAocXVhcmsgPT0gMCkKKyAgICBxdWFyayA9IGdfcXVhcmtfZnJvbV9zdHJpbmcgKCJHc3RWNGwyTWVtb3J5Iik7CisKKyAgcmV0dXJuIHF1YXJrOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogR3N0VjRsMk1lbW9yeUdyb3VwIGltcGxlbWVudGF0aW9uICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX21lbW9yeV9ncm91cF9mcmVlIChHc3RWNGwyTWVtb3J5R3JvdXAgKiBncm91cCkKK3sKKyAgZ2ludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBncm91cC0+bl9tZW07IGkrKykgeworICAgIEdzdE1lbW9yeSAqbWVtID0gZ3JvdXAtPm1lbVtpXTsKKyAgICBncm91cC0+bWVtW2ldID0gTlVMTDsKKyAgICBpZiAobWVtKQorICAgICAgZ3N0X21lbW9yeV91bnJlZiAobWVtKTsKKyAgfQorCisgIGdfc2xpY2VfZnJlZSAoR3N0VjRsMk1lbW9yeUdyb3VwLCBncm91cCk7Cit9CisKK3N0YXRpYyBHc3RWNGwyTWVtb3J5R3JvdXAgKgorZ3N0X3Y0bDJfbWVtb3J5X2dyb3VwX25ldyAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvciwgZ3VpbnQzMiBpbmRleCkKK3sKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gYWxsb2NhdG9yLT5vYmo7CisgIGd1aW50MzIgbWVtb3J5ID0gYWxsb2NhdG9yLT5tZW1vcnk7CisgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm9ybWF0ID0gJm9iai0+Zm9ybWF0OworICBHc3RWNGwyTWVtb3J5R3JvdXAgKmdyb3VwOworICBnc2l6ZSBpbWdfc2l6ZSwgYnVmX3NpemU7CisKKyAgZ3JvdXAgPSBnX3NsaWNlX25ldzAgKEdzdFY0bDJNZW1vcnlHcm91cCk7CisKKyAgZ3JvdXAtPmJ1ZmZlci50eXBlID0gZm9ybWF0LT50eXBlOworICBncm91cC0+YnVmZmVyLmluZGV4ID0gaW5kZXg7CisgIGdyb3VwLT5idWZmZXIubWVtb3J5ID0gbWVtb3J5OworCisgIGlmIChWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIgKGZvcm1hdC0+dHlwZSkpIHsKKyAgICBncm91cC0+bl9tZW0gPSBncm91cC0+YnVmZmVyLmxlbmd0aCA9IGZvcm1hdC0+Zm10LnBpeF9tcC5udW1fcGxhbmVzOworICAgIGdyb3VwLT5idWZmZXIubS5wbGFuZXMgPSBncm91cC0+cGxhbmVzOworICB9IGVsc2UgeworICAgIGdyb3VwLT5uX21lbSA9IDE7CisgIH0KKworICBpZiAob2JqLT5pb2N0bCAob2JqLT52aWRlb19mZCwgVklESU9DX1FVRVJZQlVGLCAmZ3JvdXAtPmJ1ZmZlcikgPCAwKQorICAgIGdvdG8gcXVlcnlidWZfZmFpbGVkOworCisgIGlmIChncm91cC0+YnVmZmVyLmluZGV4ICE9IGluZGV4KSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoYWxsb2NhdG9yLCAiQnVmZmVyIGluZGV4IHJldHVybmVkIGJ5IFZJRElPQ19RVUVSWUJVRiAiCisgICAgICAgICJkaWRuJ3QgbWF0Y2gsIHRoaXMgaW5kaWNhdGUgdGhlIHByZXNlbmNlIG9mIGEgYnVnIGluIHlvdXIgZHJpdmVyIG9yICIKKyAgICAgICAgImxpYnY0bDIiKTsKKyAgICBnX3NsaWNlX2ZyZWUgKEdzdFY0bDJNZW1vcnlHcm91cCwgZ3JvdXApOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLyogQ2hlY2sgdGhhdCBwcm92aWRlZCBzaXplIG1hdGNoZXMgdGhlIGZvcm1hdCB3ZSBoYXZlIG5lZ290aWF0aW9uLiBGYWlsaW5nCisgICAqIHRoZXJlIHVzdWFsbHkgbWVhbnMgYSBkcml2ZXIgb2YgbGlidjRsIGJ1Zy4gKi8KKyAgaWYgKFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUiAob2JqLT50eXBlKSkgeworICAgIGdpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBncm91cC0+bl9tZW07IGkrKykgeworICAgICAgaW1nX3NpemUgPSBvYmotPmZvcm1hdC5mbXQucGl4X21wLnBsYW5lX2ZtdFtpXS5zaXplaW1hZ2U7CisgICAgICBidWZfc2l6ZSA9IGdyb3VwLT5wbGFuZXNbaV0ubGVuZ3RoOworICAgICAgaWYgKGJ1Zl9zaXplIDwgaW1nX3NpemUpCisgICAgICAgIGdvdG8gYnVmZmVyX3Rvb19zaG9ydDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW1nX3NpemUgPSBvYmotPmZvcm1hdC5mbXQucGl4LnNpemVpbWFnZTsKKyAgICBidWZfc2l6ZSA9IGdyb3VwLT5idWZmZXIubGVuZ3RoOworICAgIGlmIChidWZfc2l6ZSA8IGltZ19zaXplKQorICAgICAgZ290byBidWZmZXJfdG9vX3Nob3J0OworICB9CisKKyAgLyogV2Ugc2F2ZSBub24gcGxhbmFyIGJ1ZmZlciBpbmZvcm1hdGlvbiBpbnRvIHRoZSBtdWx0aS1wbGFuYXIgcGxhbmUgYXJyYXkKKyAgICogdG8gYXZvaWQgZHVwbGljYXRpbmcgdGhlIGNvZGUgbGF0ZXIgKi8KKyAgaWYgKCFWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIgKGZvcm1hdC0+dHlwZSkpIHsKKyAgICBncm91cC0+cGxhbmVzWzBdLmJ5dGVzdXNlZCA9IGdyb3VwLT5idWZmZXIuYnl0ZXN1c2VkOworICAgIGdyb3VwLT5wbGFuZXNbMF0ubGVuZ3RoID0gZ3JvdXAtPmJ1ZmZlci5sZW5ndGg7CisgICAgZ3JvdXAtPnBsYW5lc1swXS5kYXRhX29mZnNldCA9IDA7CisgICAgZ19hc3NlcnQgKHNpemVvZiAoZ3JvdXAtPnBsYW5lc1swXS5tKSA9PSBzaXplb2YgKGdyb3VwLT5idWZmZXIubSkpOworICAgIG1lbWNweSAoJmdyb3VwLT5wbGFuZXNbMF0ubSwgJmdyb3VwLT5idWZmZXIubSwgc2l6ZW9mIChncm91cC0+YnVmZmVyLm0pKTsKKyAgfQorCisgIEdTVF9MT0dfT0JKRUNUIChhbGxvY2F0b3IsICJHb3QgJXMgYnVmZmVyIiwgbWVtb3J5X3R5cGVfdG9fc3RyIChtZW1vcnkpKTsKKyAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwgIiAgaW5kZXg6ICAgICAldSIsIGdyb3VwLT5idWZmZXIuaW5kZXgpOworICBHU1RfTE9HX09CSkVDVCAoYWxsb2NhdG9yLCAiICB0eXBlOiAgICAgICVkIiwgZ3JvdXAtPmJ1ZmZlci50eXBlKTsKKyAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwgIiAgZmxhZ3M6ICAgICAlMDh4IiwgZ3JvdXAtPmJ1ZmZlci5mbGFncyk7CisgIEdTVF9MT0dfT0JKRUNUIChhbGxvY2F0b3IsICIgIGZpZWxkOiAgICAgJWQiLCBncm91cC0+YnVmZmVyLmZpZWxkKTsKKyAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwgIiAgbWVtb3J5OiAgICAlZCIsIGdyb3VwLT5idWZmZXIubWVtb3J5KTsKKyAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwgIiAgcGxhbmVzOiAgICAlZCIsIGdyb3VwLT5uX21lbSk7CisKKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgIGlmIChtZW1vcnkgPT0gVjRMMl9NRU1PUllfTU1BUCkgeworICAgIGdpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXAtPm5fbWVtOyBpKyspIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChhbGxvY2F0b3IsCisgICAgICAgICAgIiAgWyV1XSBieXRlc3VzZWQ6ICV1LCBsZW5ndGg6ICV1LCBvZmZzZXQ6ICV1IiwgaSwKKyAgICAgICAgICBncm91cC0+cGxhbmVzW2ldLmJ5dGVzdXNlZCwgZ3JvdXAtPnBsYW5lc1tpXS5sZW5ndGgsCisgICAgICAgICAgZ3JvdXAtPnBsYW5lc1tpXS5kYXRhX29mZnNldCk7CisgICAgICBHU1RfTE9HX09CSkVDVCAoYWxsb2NhdG9yLCAiICBbJXVdIE1NQVAgb2Zmc2V0OiAgJXUiLCBpLAorICAgICAgICAgIGdyb3VwLT5wbGFuZXNbaV0ubS5tZW1fb2Zmc2V0KTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBncm91cDsKKworcXVlcnlidWZfZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SICgiZXJyb3IgcXVlcnlpbmcgYnVmZmVyICVkOiAlcyIsIGluZGV4LCBnX3N0cmVycm9yIChlcnJubykpOworICAgIGdvdG8gZmFpbGVkOworICB9CitidWZmZXJfdG9vX3Nob3J0OgorICB7CisgICAgR1NUX0VSUk9SICgiYnVmZmVyIHNpemUgJSIgR19HU0laRV9GT1JNQVQKKyAgICAgICAgIiBpcyBzbWFsbGVyIHRoZW4gbmVnb3RpYXRlZCBzaXplICUiIEdfR1NJWkVfRk9STUFUCisgICAgICAgICIsIHRoaXMgaXMgdXN1YWxseSB0aGUgcmVzdWx0IG9mIGEgYnVnIGluIHRoZSB2NGwyIGRyaXZlciBvciBsaWJ2NGwuIiwKKyAgICAgICAgYnVmX3NpemUsIGltZ19zaXplKTsKKyAgICBnb3RvIGZhaWxlZDsKKyAgfQorZmFpbGVkOgorICBnc3RfdjRsMl9tZW1vcnlfZ3JvdXBfZnJlZSAoZ3JvdXApOworICByZXR1cm4gTlVMTDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEdzdFY0bEFsbG9jYXRvciBpbXBsZW1lbnRhdGlvbiAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9hbGxvY2F0b3JfcmVsZWFzZSAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvciwgR3N0VjRsMk1lbW9yeSAqIG1lbSkKK3sKKyAgR3N0VjRsMk1lbW9yeUdyb3VwICpncm91cCA9IG1lbS0+Z3JvdXA7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwgInBsYW5lICVpIG9mIGJ1ZmZlciAldSByZWxlYXNlZCIsCisgICAgICBtZW0tPnBsYW5lLCBncm91cC0+YnVmZmVyLmluZGV4KTsKKworICBzd2l0Y2ggKGFsbG9jYXRvci0+bWVtb3J5KSB7CisgICAgY2FzZSBWNEwyX01FTU9SWV9ETUFCVUY6CisgICAgICBjbG9zZSAobWVtLT5kbWFmZCk7CisgICAgICBtZW0tPmRtYWZkID0gLTE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfTUVNT1JZX1VTRVJQVFI6CisgICAgICBtZW0tPmRhdGEgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgLyogV2hlbiBhbGwgbWVtb3J5IGFyZSBiYWNrLCBwdXQgdGhlIGdyb3VwIGJhY2sgaW4gdGhlIGZyZWUgcXVldWUgKi8KKyAgaWYgKGdfYXRvbWljX2ludF9kZWNfYW5kX3Rlc3QgKCZncm91cC0+bWVtc19hbGxvY2F0ZWQpKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwgImJ1ZmZlciAldSByZWxlYXNlZCIsIGdyb3VwLT5idWZmZXIuaW5kZXgpOworICAgIGdzdF9hdG9taWNfcXVldWVfcHVzaCAoYWxsb2NhdG9yLT5mcmVlX3F1ZXVlLCBncm91cCk7CisgICAgZ19zaWduYWxfZW1pdCAoYWxsb2NhdG9yLCBnc3RfdjRsMl9hbGxvY2F0b3Jfc2lnbmFsc1tHUk9VUF9SRUxFQVNFRF0sIDApOworICB9CisKKyAgLyogS2VlcCBsYXN0LCBhbGxvY2F0b3IgbWF5IGJlIGZyZWVkIGFmdGVyIHRoaXMgY2FsbCAqLworICBnX29iamVjdF91bnJlZiAoYWxsb2NhdG9yKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2FsbG9jYXRvcl9mcmVlIChHc3RBbGxvY2F0b3IgKiBnYWxsb2NhdG9yLCBHc3RNZW1vcnkgKiBnbWVtKQoreworICBHc3RWNGwyQWxsb2NhdG9yICphbGxvY2F0b3IgPSAoR3N0VjRsMkFsbG9jYXRvciAqKSBnYWxsb2NhdG9yOworICBHc3RWNGwyT2JqZWN0ICpvYmogPSBhbGxvY2F0b3ItPm9iajsKKyAgR3N0VjRsMk1lbW9yeSAqbWVtID0gKEdzdFY0bDJNZW1vcnkgKikgZ21lbTsKKyAgR3N0VjRsMk1lbW9yeUdyb3VwICpncm91cCA9IG1lbS0+Z3JvdXA7CisKKyAgLyogT25seSBmcmVlIHVucGFyZW50ZWQgbWVtb3J5ICovCisgIGlmIChtZW0tPm1lbS5wYXJlbnQgPT0gTlVMTCkgeworICAgIEdTVF9MT0dfT0JKRUNUIChhbGxvY2F0b3IsICJmcmVlaW5nIHBsYW5lICVpIG9mIGJ1ZmZlciAldSIsCisgICAgICAgIG1lbS0+cGxhbmUsIGdyb3VwLT5idWZmZXIuaW5kZXgpOworCisgICAgaWYgKGFsbG9jYXRvci0+bWVtb3J5ID09IFY0TDJfTUVNT1JZX01NQVApIHsKKyAgICAgIGlmIChtZW0tPmRhdGEpCisgICAgICAgIG9iai0+bXVubWFwIChtZW0tPmRhdGEsIGdyb3VwLT5wbGFuZXNbbWVtLT5wbGFuZV0ubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKiBUaGlzIGFwcGx5IGZvciBib3RoIG1tYXAgd2l0aCBleHBidWYsIGFuZCBkbWFidWYgaW1wb3J0ZWQgbWVtb3J5ICovCisgICAgaWYgKG1lbS0+ZG1hZmQgPj0gMCkKKyAgICAgIGNsb3NlIChtZW0tPmRtYWZkKTsKKyAgfQorCisgIGdfc2xpY2VfZnJlZSAoR3N0VjRsMk1lbW9yeSwgbWVtKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2FsbG9jYXRvcl9kaXNwb3NlIChHT2JqZWN0ICogb2JqKQoreworICBHc3RWNGwyQWxsb2NhdG9yICphbGxvY2F0b3IgPSAoR3N0VjRsMkFsbG9jYXRvciAqKSBvYmo7CisgIGdpbnQgaTsKKworICBHU1RfTE9HX09CSkVDVCAob2JqLCAiY2FsbGVkIik7CisKKyAgZm9yIChpID0gMDsgaSA8IGFsbG9jYXRvci0+Y291bnQ7IGkrKykgeworICAgIEdzdFY0bDJNZW1vcnlHcm91cCAqZ3JvdXAgPSBhbGxvY2F0b3ItPmdyb3Vwc1tpXTsKKyAgICBhbGxvY2F0b3ItPmdyb3Vwc1tpXSA9IE5VTEw7CisgICAgaWYgKGdyb3VwKQorICAgICAgZ3N0X3Y0bDJfbWVtb3J5X2dyb3VwX2ZyZWUgKGdyb3VwKTsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmopOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfYWxsb2NhdG9yX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqKQoreworICBHc3RWNGwyQWxsb2NhdG9yICphbGxvY2F0b3IgPSAoR3N0VjRsMkFsbG9jYXRvciAqKSBvYmo7CisKKyAgR1NUX0xPR19PQkpFQ1QgKG9iaiwgImNhbGxlZCIpOworCisgIGdzdF9hdG9taWNfcXVldWVfdW5yZWYgKGFsbG9jYXRvci0+ZnJlZV9xdWV1ZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGFsbG9jYXRvci0+b2JqLT5lbGVtZW50KTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iaik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9hbGxvY2F0b3JfY2xhc3NfaW5pdCAoR3N0VjRsMkFsbG9jYXRvckNsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzOworICBHc3RBbGxvY2F0b3JDbGFzcyAqYWxsb2NhdG9yX2NsYXNzOworCisgIGFsbG9jYXRvcl9jbGFzcyA9IChHc3RBbGxvY2F0b3JDbGFzcyAqKSBrbGFzczsKKyAgb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKworICBhbGxvY2F0b3JfY2xhc3MtPmFsbG9jID0gTlVMTDsKKyAgYWxsb2NhdG9yX2NsYXNzLT5mcmVlID0gZ3N0X3Y0bDJfYWxsb2NhdG9yX2ZyZWU7CisKKyAgb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gZ3N0X3Y0bDJfYWxsb2NhdG9yX2Rpc3Bvc2U7CisgIG9iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBnc3RfdjRsMl9hbGxvY2F0b3JfZmluYWxpemU7CisKKyAgZ3N0X3Y0bDJfYWxsb2NhdG9yX3NpZ25hbHNbR1JPVVBfUkVMRUFTRURdID0gZ19zaWduYWxfbmV3ICgiZ3JvdXAtcmVsZWFzZWQiLAorICAgICAgR19UWVBFX0ZST01fQ0xBU1MgKG9iamVjdF9jbGFzcyksIEdfU0lHTkFMX1JVTl9MQVNULCAwLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgR19UWVBFX05PTkUsIDApOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUICh2NGwyYWxsb2NhdG9yX2RlYnVnLCAidjRsMmFsbG9jYXRvciIsIDAsCisgICAgICAiVjRMMiBBbGxvY2F0b3IiKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2FsbG9jYXRvcl9pbml0IChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yKQoreworICBHc3RBbGxvY2F0b3IgKmFsbG9jID0gR1NUX0FMTE9DQVRPUl9DQVNUIChhbGxvY2F0b3IpOworCisgIGFsbG9jLT5tZW1fdHlwZSA9IEdTVF9WNEwyX01FTU9SWV9UWVBFOworICBhbGxvYy0+bWVtX21hcCA9IChHc3RNZW1vcnlNYXBGdW5jdGlvbikgX3Y0bDJtZW1fbWFwOworICBhbGxvYy0+bWVtX3VubWFwID0gKEdzdE1lbW9yeVVubWFwRnVuY3Rpb24pIF92NGwybWVtX3VubWFwOworICBhbGxvYy0+bWVtX3NoYXJlID0gKEdzdE1lbW9yeVNoYXJlRnVuY3Rpb24pIF92NGwybWVtX3NoYXJlOworICBhbGxvYy0+bWVtX2lzX3NwYW4gPSAoR3N0TWVtb3J5SXNTcGFuRnVuY3Rpb24pIF92NGwybWVtX2lzX3NwYW47CisgIC8qIFVzZSB0aGUgZGVmYXVsdCwgZmFsbGJhY2sgY29weSBmdW5jdGlvbiAqLworCisgIGFsbG9jYXRvci0+ZnJlZV9xdWV1ZSA9IGdzdF9hdG9taWNfcXVldWVfbmV3IChWSURFT19NQVhfRlJBTUUpOworCisgIEdTVF9PQkpFQ1RfRkxBR19TRVQgKGFsbG9jYXRvciwgR1NUX0FMTE9DQVRPUl9GTEFHX0NVU1RPTV9BTExPQyk7Cit9CisKKyNkZWZpbmUgR1NUX1Y0TDJfQUxMT0NBVE9SX1BST0JFKG9iaix0eXBlKSBcCisgICAgZ3N0X3Y0bDJfYWxsb2NhdG9yX3Byb2JlICgob2JqKSwgVjRMMl9NRU1PUllfICMjIHR5cGUsIFwKKyAgICAgICAgR1NUX1Y0TDJfQUxMT0NBVE9SX0ZMQUdfICMjIHR5cGUgIyMgX1JFUUJVRlMsIFwKKyAgICAgICAgR1NUX1Y0TDJfQUxMT0NBVE9SX0ZMQUdfICMjIHR5cGUgIyMgX0NSRUFURV9CVUZTKQorc3RhdGljIGd1aW50MzIKK2dzdF92NGwyX2FsbG9jYXRvcl9wcm9iZSAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvciwgZ3VpbnQzMiBtZW1vcnksCisgICAgZ3VpbnQzMiBicmVxX2ZsYWcsIGd1aW50MzIgYmNyZWF0ZV9mbGFnKQoreworICBHc3RWNGwyT2JqZWN0ICpvYmogPSBhbGxvY2F0b3ItPm9iajsKKyAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgYnJlcSA9IHsgMCB9OworICBndWludDMyIGZsYWdzID0gMDsKKworICBicmVxLnR5cGUgPSBvYmotPnR5cGU7CisgIGJyZXEuY291bnQgPSAwOworICBicmVxLm1lbW9yeSA9IG1lbW9yeTsKKworICBpZiAob2JqLT5pb2N0bCAob2JqLT52aWRlb19mZCwgVklESU9DX1JFUUJVRlMsICZicmVxKSA9PSAwKSB7CisgICAgc3RydWN0IHY0bDJfY3JlYXRlX2J1ZmZlcnMgYmNyZWF0ZSA9IHsgMCB9OworCisgICAgZmxhZ3MgfD0gYnJlcV9mbGFnOworCisgICAgYmNyZWF0ZS5tZW1vcnkgPSBtZW1vcnk7CisgICAgYmNyZWF0ZS5mb3JtYXQgPSBvYmotPmZvcm1hdDsKKworICAgIGlmICgob2JqLT5pb2N0bCAob2JqLT52aWRlb19mZCwgVklESU9DX0NSRUFURV9CVUZTLCAmYmNyZWF0ZSkgPT0gMCkpCisgICAgICBmbGFncyB8PSBiY3JlYXRlX2ZsYWc7CisgIH0KKworICByZXR1cm4gZmxhZ3M7Cit9CisKK3N0YXRpYyBHc3RWNGwyTWVtb3J5R3JvdXAgKgorZ3N0X3Y0bDJfYWxsb2NhdG9yX2NyZWF0ZV9idWYgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IpCit7CisgIEdzdFY0bDJPYmplY3QgKm9iaiA9IGFsbG9jYXRvci0+b2JqOworICBzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVycyBiY3JlYXRlID0geyAwIH07CisgIEdzdFY0bDJNZW1vcnlHcm91cCAqZ3JvdXAgPSBOVUxMOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoYWxsb2NhdG9yKTsKKworICBpZiAoIWdfYXRvbWljX2ludF9nZXQgKCZhbGxvY2F0b3ItPmFjdGl2ZSkpCisgICAgZ290byBkb25lOworCisgIGJjcmVhdGUubWVtb3J5ID0gYWxsb2NhdG9yLT5tZW1vcnk7CisgIGJjcmVhdGUuZm9ybWF0ID0gb2JqLT5mb3JtYXQ7CisgIGJjcmVhdGUuY291bnQgPSAxOworCisgIGlmICghYWxsb2NhdG9yLT5jYW5fYWxsb2NhdGUpCisgICAgZ290byBkb25lOworCisgIGlmIChvYmotPmlvY3RsIChvYmotPnZpZGVvX2ZkLCBWSURJT0NfQ1JFQVRFX0JVRlMsICZiY3JlYXRlKSA8IDApCisgICAgZ290byBjcmVhdGVfYnVmc19mYWlsZWQ7CisKKyAgaWYgKGFsbG9jYXRvci0+Z3JvdXBzW2JjcmVhdGUuaW5kZXhdICE9IE5VTEwpCisgICAgZ290byBjcmVhdGVfYnVmc19idWc7CisKKyAgZ3JvdXAgPSBnc3RfdjRsMl9tZW1vcnlfZ3JvdXBfbmV3IChhbGxvY2F0b3IsIGJjcmVhdGUuaW5kZXgpOworCisgIGlmIChncm91cCkgeworICAgIGFsbG9jYXRvci0+Z3JvdXBzW2JjcmVhdGUuaW5kZXhdID0gZ3JvdXA7CisgICAgYWxsb2NhdG9yLT5jb3VudCsrOworICB9CisKK2RvbmU6CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChhbGxvY2F0b3IpOworICByZXR1cm4gZ3JvdXA7CisKK2NyZWF0ZV9idWZzX2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYWxsb2NhdG9yLCAiZXJyb3IgY3JlYXRpbmcgYSBuZXcgYnVmZmVyOiAlcyIsCisgICAgICAgIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgZ290byBkb25lOworICB9CitjcmVhdGVfYnVmc19idWc6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChhbGxvY2F0b3IsICJjcmVhdGVkIGJ1ZmZlciBoYXMgYWxyZWFkeSB1c2VkIGJ1ZmZlciAiCisgICAgICAgICJpbmRleCAlaSwgdGhpcyBtZWFucyB0aGVyZSBpcyBhbiBidWcgaW4geW91ciBkcml2ZXIgb3IgbGlidjRsMiIsCisgICAgICAgIGJjcmVhdGUuaW5kZXgpOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCitzdGF0aWMgR3N0VjRsMk1lbW9yeUdyb3VwICoKK2dzdF92NGwyX2FsbG9jYXRvcl9hbGxvYyAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvcikKK3sKKyAgR3N0VjRsMk1lbW9yeUdyb3VwICpncm91cDsKKworICBpZiAoIWdfYXRvbWljX2ludF9nZXQgKCZhbGxvY2F0b3ItPmFjdGl2ZSkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZ3JvdXAgPSBnc3RfYXRvbWljX3F1ZXVlX3BvcCAoYWxsb2NhdG9yLT5mcmVlX3F1ZXVlKTsKKworICBpZiAoZ3JvdXAgPT0gTlVMTCkgeworICAgIGlmIChhbGxvY2F0b3ItPmNhbl9hbGxvY2F0ZSkgeworICAgICAgZ3JvdXAgPSBnc3RfdjRsMl9hbGxvY2F0b3JfY3JlYXRlX2J1ZiAoYWxsb2NhdG9yKTsKKworICAgICAgLyogRG9uJ3QgaGFtbWVyIG9uIENSRUFURV9CVUZTICovCisgICAgICBpZiAoZ3JvdXAgPT0gTlVMTCkKKyAgICAgICAgYWxsb2NhdG9yLT5jYW5fYWxsb2NhdGUgPSBGQUxTRTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZ3JvdXA7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9hbGxvY2F0b3JfcmVzZXRfc2l6ZSAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvciwKKyAgICBHc3RWNGwyTWVtb3J5R3JvdXAgKiBncm91cCkKK3sKKyAgZ2ludCBpOworICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXAtPm5fbWVtOyBpKyspIHsKKyAgICBncm91cC0+bWVtW2ldLT5tYXhzaXplID0gZ3JvdXAtPnBsYW5lc1tpXS5sZW5ndGg7CisgICAgZ3JvdXAtPm1lbVtpXS0+b2Zmc2V0ID0gMDsKKyAgICBncm91cC0+bWVtW2ldLT5zaXplID0gZ3JvdXAtPnBsYW5lc1tpXS5sZW5ndGg7CisgIH0KK30KKworc3RhdGljIHZvaWQKK19jbGVhbnVwX2ZhaWxlZF9hbGxvYyAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvciwgR3N0VjRsMk1lbW9yeUdyb3VwICogZ3JvdXApCit7CisgIGlmIChncm91cC0+bWVtc19hbGxvY2F0ZWQgPiAwKSB7CisgICAgZ2ludCBpOworICAgIC8qIElmIG9uZSBvciBtb3JlIG1tYXAgd29ya2VkLCB3ZSBuZWVkIHRvIHVucmVmIHRoZSBtZW1vcnksIG90aGVyd2lzZQorICAgICAqIHRoZXkgd2lsbCBrZWVwIGEgcmVmIG9uIHRoZSBhbGxvY2F0b3IgYW5kIGxlYWsgaXQuIFRoaXMgd2lsbCBwdXQgYmFjaworICAgICAqIHRoZSBncm91cCBpbnRvIHRoZSBmcmVlX3F1ZXVlICovCisgICAgZm9yIChpID0gMDsgaSA8IGdyb3VwLT5uX21lbTsgaSsrKQorICAgICAgZ3N0X21lbW9yeV91bnJlZiAoZ3JvdXAtPm1lbVtpXSk7CisgIH0gZWxzZSB7CisgICAgLyogT3RoZXJ3aXNlLCBncm91cCBoYXMgdG8gYmUgb24gZnJlZSBxdWV1ZSBmb3IgX3N0b3AoKSB0byB3b3JrICovCisgICAgZ3N0X2F0b21pY19xdWV1ZV9wdXNoIChhbGxvY2F0b3ItPmZyZWVfcXVldWUsIGdyb3VwKTsKKyAgfQorfQorCisKKworR3N0VjRsMkFsbG9jYXRvciAqCitnc3RfdjRsMl9hbGxvY2F0b3JfbmV3IChHc3RPYmplY3QgKiBwYXJlbnQsIEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KQoreworICBHc3RWNGwyQWxsb2NhdG9yICphbGxvY2F0b3I7CisgIGd1aW50MzIgZmxhZ3MgPSAwOworICBnY2hhciAqbmFtZSwgKnBhcmVudF9uYW1lOworCisgIHBhcmVudF9uYW1lID0gZ3N0X29iamVjdF9nZXRfbmFtZSAocGFyZW50KTsKKyAgbmFtZSA9IGdfc3RyY29uY2F0IChwYXJlbnRfbmFtZSwgIjphbGxvY2F0b3IiLCBOVUxMKTsKKyAgZ19mcmVlIChwYXJlbnRfbmFtZSk7CisKKyAgYWxsb2NhdG9yID0gZ19vYmplY3RfbmV3IChHU1RfVFlQRV9WNEwyX0FMTE9DQVRPUiwgIm5hbWUiLCBuYW1lLCBOVUxMKTsKKyAgZ3N0X29iamVjdF9yZWZfc2luayAoYWxsb2NhdG9yKTsKKyAgZ19mcmVlIChuYW1lKTsKKworICAvKiBTYXZlIGV2ZXJ5dGhpbmcgKi8KKyAgYWxsb2NhdG9yLT5vYmogPSB2NGwyb2JqZWN0OworCisgIC8qIEtlZXAgYSByZWYgb24gdGhlIGVsZW1udCBzbyBvYmogZG9lcyBub3QgZGlzYXBlYXIgKi8KKyAgZ3N0X29iamVjdF9yZWYgKGFsbG9jYXRvci0+b2JqLT5lbGVtZW50KTsKKworICBmbGFncyB8PSBHU1RfVjRMMl9BTExPQ0FUT1JfUFJPQkUgKGFsbG9jYXRvciwgTU1BUCk7CisgIGZsYWdzIHw9IEdTVF9WNEwyX0FMTE9DQVRPUl9QUk9CRSAoYWxsb2NhdG9yLCBVU0VSUFRSKTsKKyAgZmxhZ3MgfD0gR1NUX1Y0TDJfQUxMT0NBVE9SX1BST0JFIChhbGxvY2F0b3IsIERNQUJVRik7CisKKworICBpZiAoZmxhZ3MgPT0gMCkgeworICAgIC8qIERyaXZlcnMgbm90IHBvcnRlZCBmcm9tIHZpZGVvYnVmIHRvIHZpZGVidWYyIGRvbid0IGFsbG93IGZyZWVpbmcgYnVmZmVycworICAgICAqIHVzaW5nIFJFUUJVRlMoMCkuIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIHN0aWxsIHN1cHBvcnQgdGhlc2UgZHJpdmVycywKKyAgICAgKiB3aGljaCBhcmUga25vd24gdG8gaGF2ZSBNTUFQIHN1cHBvcnQuICovCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhbGxvY2F0b3IsICJDb3VsZCBub3QgcHJvYmUgc3VwcG9ydGVkIG1lbW9yeSB0eXBlLCAiCisgICAgICAgICJhc3N1bWluZyBNTUFQIGlzIHN1cHBvcnRlZCwgdGhpcyBpcyBleHBlY3RlZCBmb3Igb2xkZXIgZHJpdmVycyBub3QgIgorICAgICAgICAiIHlldCBwb3J0ZWQgdG8gdmlkZW9idWYyIGZyYW1ld29yayIpOworICAgIGZsYWdzID0gR1NUX1Y0TDJfQUxMT0NBVE9SX0ZMQUdfTU1BUF9SRVFCVUZTOworICB9CisKKyAgR1NUX09CSkVDVF9GTEFHX1NFVCAoYWxsb2NhdG9yLCBmbGFncyk7CisKKyAgcmV0dXJuIGFsbG9jYXRvcjsKK30KKworZ3VpbnQKK2dzdF92NGwyX2FsbG9jYXRvcl9zdGFydCAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvciwgZ3VpbnQzMiBjb3VudCwKKyAgICBndWludDMyIG1lbW9yeSkKK3sKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gYWxsb2NhdG9yLT5vYmo7CisgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzIGJyZXEgPSB7IGNvdW50LCBvYmotPnR5cGUsIG1lbW9yeSB9OworICBnYm9vbGVhbiBjYW5fYWxsb2NhdGU7CisgIGdpbnQgaTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoY291bnQgIT0gMCwgMCk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChhbGxvY2F0b3IpOworCisgIGlmIChnX2F0b21pY19pbnRfZ2V0ICgmYWxsb2NhdG9yLT5hY3RpdmUpKQorICAgIGdvdG8gYWxyZWFkeV9hY3RpdmU7CisKKyAgaWYgKG9iai0+aW9jdGwgKG9iai0+dmlkZW9fZmQsIFZJRElPQ19SRVFCVUZTLCAmYnJlcSkgPCAwKQorICAgIGdvdG8gcmVxYnVmc19mYWlsZWQ7CisKKyAgaWYgKGJyZXEuY291bnQgPCAxKQorICAgIGdvdG8gb3V0X29mX21lbW9yeTsKKworICBzd2l0Y2ggKG1lbW9yeSkgeworICAgIGNhc2UgVjRMMl9NRU1PUllfTU1BUDoKKyAgICAgIGNhbl9hbGxvY2F0ZSA9IEdTVF9WNEwyX0FMTE9DQVRPUl9DQU5fQUxMT0NBVEUgKGFsbG9jYXRvciwgTU1BUCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfTUVNT1JZX1VTRVJQVFI6CisgICAgICBjYW5fYWxsb2NhdGUgPSBHU1RfVjRMMl9BTExPQ0FUT1JfQ0FOX0FMTE9DQVRFIChhbGxvY2F0b3IsIFVTRVJQVFIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX01FTU9SWV9ETUFCVUY6CisgICAgICBjYW5fYWxsb2NhdGUgPSBHU1RfVjRMMl9BTExPQ0FUT1JfQ0FOX0FMTE9DQVRFIChhbGxvY2F0b3IsIERNQUJVRik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgY2FuX2FsbG9jYXRlID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGFsbG9jYXRvciwgImFsbG9jYXRlZCAldSAlcyBidWZmZXJzIG91dCBvZiAldSByZXF1ZXN0ZWQiLAorICAgICAgYnJlcS5jb3VudCwgbWVtb3J5X3R5cGVfdG9fc3RyIChtZW1vcnkpLCBjb3VudCk7CisKKyAgYWxsb2NhdG9yLT5jYW5fYWxsb2NhdGUgPSBjYW5fYWxsb2NhdGU7CisgIGFsbG9jYXRvci0+Y291bnQgPSBicmVxLmNvdW50OworICBhbGxvY2F0b3ItPm1lbW9yeSA9IG1lbW9yeTsKKworICAvKiBDcmVhdGUgbWVtb3J5IGdyb3VwcyAqLworICBmb3IgKGkgPSAwOyBpIDwgYWxsb2NhdG9yLT5jb3VudDsgaSsrKSB7CisgICAgYWxsb2NhdG9yLT5ncm91cHNbaV0gPSBnc3RfdjRsMl9tZW1vcnlfZ3JvdXBfbmV3IChhbGxvY2F0b3IsIGkpOworICAgIGlmIChhbGxvY2F0b3ItPmdyb3Vwc1tpXSA9PSBOVUxMKQorICAgICAgZ290byBlcnJvcjsKKworICAgIGdzdF9hdG9taWNfcXVldWVfcHVzaCAoYWxsb2NhdG9yLT5mcmVlX3F1ZXVlLCBhbGxvY2F0b3ItPmdyb3Vwc1tpXSk7CisgIH0KKworICBnX2F0b21pY19pbnRfc2V0ICgmYWxsb2NhdG9yLT5hY3RpdmUsIFRSVUUpOworCitkb25lOgorICBHU1RfT0JKRUNUX1VOTE9DSyAoYWxsb2NhdG9yKTsKKyAgcmV0dXJuIGJyZXEuY291bnQ7CisKK2FscmVhZHlfYWN0aXZlOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoYWxsb2NhdG9yLCAiYWxsb2NhdG9yIGFscmVhZHkgYWN0aXZlIik7CisgICAgZ290byBlcnJvcjsKKyAgfQorcmVxYnVmc19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChhbGxvY2F0b3IsCisgICAgICAgICJlcnJvciByZXF1ZXN0aW5nICVkIGJ1ZmZlcnM6ICVzIiwgY291bnQsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgZ290byBlcnJvcjsKKyAgfQorb3V0X29mX21lbW9yeToKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGFsbG9jYXRvciwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIGJ1ZmZlcnMiKTsKKyAgICBnb3RvIGVycm9yOworICB9CitlcnJvcjoKKyAgeworICAgIGJyZXEuY291bnQgPSAwOworICAgIGdvdG8gZG9uZTsKKyAgfQorfQorCitHc3RWNGwyUmV0dXJuCitnc3RfdjRsMl9hbGxvY2F0b3Jfc3RvcCAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvcikKK3sKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gYWxsb2NhdG9yLT5vYmo7CisgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzIGJyZXEgPSB7IDAsIG9iai0+dHlwZSwgYWxsb2NhdG9yLT5tZW1vcnkgfTsKKyAgZ2ludCBpID0gMDsKKyAgR3N0VjRsMlJldHVybiByZXQgPSBHU1RfVjRMMl9PSzsKKworICBHU1RfREVCVUdfT0JKRUNUIChhbGxvY2F0b3IsICJzdG9wIGFsbG9jYXRvciIpOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoYWxsb2NhdG9yKTsKKworICBpZiAoIWdfYXRvbWljX2ludF9nZXQgKCZhbGxvY2F0b3ItPmFjdGl2ZSkpCisgICAgZ290byBkb25lOworCisgIGlmIChnc3RfYXRvbWljX3F1ZXVlX2xlbmd0aCAoYWxsb2NhdG9yLT5mcmVlX3F1ZXVlKSAhPSBhbGxvY2F0b3ItPmNvdW50KSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYWxsb2NhdG9yLCAiYWxsb2NhdG9yIGlzIHN0aWxsIGluIHVzZSIpOworICAgIHJldCA9IEdTVF9WNEwyX0JVU1k7CisgICAgZ290byBkb25lOworICB9CisKKyAgd2hpbGUgKGdzdF9hdG9taWNfcXVldWVfcG9wIChhbGxvY2F0b3ItPmZyZWVfcXVldWUpKSB7CisgICAgLyogbm90aGluZyAqLworICB9OworCisgIGZvciAoaSA9IDA7IGkgPCBhbGxvY2F0b3ItPmNvdW50OyBpKyspIHsKKyAgICBHc3RWNGwyTWVtb3J5R3JvdXAgKmdyb3VwID0gYWxsb2NhdG9yLT5ncm91cHNbaV07CisgICAgYWxsb2NhdG9yLT5ncm91cHNbaV0gPSBOVUxMOworICAgIGlmIChncm91cCkKKyAgICAgIGdzdF92NGwyX21lbW9yeV9ncm91cF9mcmVlIChncm91cCk7CisgIH0KKworICAvKiBOb3QgYWxsIGRyaXZlcnMgc3VwcG9ydCByZWJ1ZnMoMCksIHNvIHdhcm4gb25seSAqLworICBpZiAob2JqLT5pb2N0bCAob2JqLT52aWRlb19mZCwgVklESU9DX1JFUUJVRlMsICZicmVxKSA8IDApCisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhbGxvY2F0b3IsCisgICAgICAgICJlcnJvciByZWxlYXNpbmcgYnVmZmVycyBidWZmZXJzOiAlcyIsIGdfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgYWxsb2NhdG9yLT5jb3VudCA9IDA7CisKKyAgZ19hdG9taWNfaW50X3NldCAoJmFsbG9jYXRvci0+YWN0aXZlLCBGQUxTRSk7CisKK2RvbmU6CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChhbGxvY2F0b3IpOworICByZXR1cm4gcmV0OworfQorCitHc3RWNGwyTWVtb3J5R3JvdXAgKgorZ3N0X3Y0bDJfYWxsb2NhdG9yX2FsbG9jX21tYXAgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IpCit7CisgIEdzdFY0bDJPYmplY3QgKm9iaiA9IGFsbG9jYXRvci0+b2JqOworICBHc3RWNGwyTWVtb3J5R3JvdXAgKmdyb3VwOworICBnaW50IGk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGFsbG9jYXRvci0+bWVtb3J5ID09IFY0TDJfTUVNT1JZX01NQVAsIE5VTEwpOworCisgIGdyb3VwID0gZ3N0X3Y0bDJfYWxsb2NhdG9yX2FsbG9jIChhbGxvY2F0b3IpOworCisgIGlmIChncm91cCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGZvciAoaSA9IDA7IGkgPCBncm91cC0+bl9tZW07IGkrKykgeworICAgIGlmIChncm91cC0+bWVtW2ldID09IE5VTEwpIHsKKyAgICAgIGdwb2ludGVyIGRhdGE7CisgICAgICBkYXRhID0gb2JqLT5tbWFwIChOVUxMLCBncm91cC0+cGxhbmVzW2ldLmxlbmd0aCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICBNQVBfU0hBUkVELCBvYmotPnZpZGVvX2ZkLCBncm91cC0+cGxhbmVzW2ldLm0ubWVtX29mZnNldCk7CisKKyAgICAgIGlmIChkYXRhID09IE1BUF9GQUlMRUQpCisgICAgICAgIGdvdG8gbW1hcF9mYWlsZWQ7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChhbGxvY2F0b3IsCisgICAgICAgICAgIm1tYXAgYnVmZmVyIGxlbmd0aCAlZCwgZGF0YSBvZmZzZXQgJWQsIHBsYW5lICVkIiwKKyAgICAgICAgICBncm91cC0+cGxhbmVzW2ldLmxlbmd0aCwgZ3JvdXAtPnBsYW5lc1tpXS5kYXRhX29mZnNldCwgaSk7CisKKyAgICAgIGdyb3VwLT5tZW1baV0gPSAoR3N0TWVtb3J5ICopIF92NGwybWVtX25ldyAoMCwgR1NUX0FMTE9DQVRPUiAoYWxsb2NhdG9yKSwKKyAgICAgICAgICBOVUxMLCBncm91cC0+cGxhbmVzW2ldLmxlbmd0aCwgMCwgMCwgZ3JvdXAtPnBsYW5lc1tpXS5sZW5ndGgsIGksIGRhdGEsCisgICAgICAgICAgLTEsIGdyb3VwKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogVGFrZSBiYWNrIHRoZSBhbGxvY2F0b3IgcmVmZXJlbmNlICovCisgICAgICBnc3Rfb2JqZWN0X3JlZiAoYWxsb2NhdG9yKTsKKyAgICB9CisKKyAgICBncm91cC0+bWVtc19hbGxvY2F0ZWQrKzsKKyAgfQorCisgIC8qIEVuc3VyZSBncm91cCBzaXplLiBVbmxpa2UgR1NULCB2NGwyIGhhdmUgc2l6ZSAoYnl0ZXN1c2VkKSBpbml0aWFsbHkgc2V0CisgICAqIHRvIDAuIEFzIGxlbmd0aCBtaWdodCBiZSBiaWdnZXIgdGhlbiB0aGUgZXhwZWN0ZWQgc2l6ZSBleHBvc2VkIGluIHRoZQorICAgKiBmb3JtYXQsIHdlIHNpbXBseSBzZXQgYnl0ZXN1c2VkIGluaXRpYWxseSBhbmQgcmVzZXQgaXQgaGVyZSBmb3IKKyAgICogc2ltcGxpY2l0eSAqLworICBnc3RfdjRsMl9hbGxvY2F0b3JfcmVzZXRfc2l6ZSAoYWxsb2NhdG9yLCBncm91cCk7CisKKyAgcmV0dXJuIGdyb3VwOworCittbWFwX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGFsbG9jYXRvciwgIkZhaWxlZCB0byBtbWFwIGJ1ZmZlcjogJXMiLAorICAgICAgICBnX3N0cmVycm9yIChlcnJubykpOworICAgIF9jbGVhbnVwX2ZhaWxlZF9hbGxvYyAoYWxsb2NhdG9yLCBncm91cCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworR3N0VjRsMk1lbW9yeUdyb3VwICoKK2dzdF92NGwyX2FsbG9jYXRvcl9hbGxvY19kbWFidWYgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IsCisgICAgR3N0QWxsb2NhdG9yICogZG1hYnVmX2FsbG9jYXRvcikKK3sKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gYWxsb2NhdG9yLT5vYmo7CisgIEdzdFY0bDJNZW1vcnlHcm91cCAqZ3JvdXA7CisgIGdpbnQgaTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoYWxsb2NhdG9yLT5tZW1vcnkgPT0gVjRMMl9NRU1PUllfTU1BUCwgTlVMTCk7CisKKyAgZ3JvdXAgPSBnc3RfdjRsMl9hbGxvY2F0b3JfYWxsb2MgKGFsbG9jYXRvcik7CisKKyAgaWYgKGdyb3VwID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IGdyb3VwLT5uX21lbTsgaSsrKSB7CisgICAgR3N0VjRsMk1lbW9yeSAqbWVtOworICAgIEdzdE1lbW9yeSAqZG1hX21lbTsKKyAgICBnaW50IGRtYWZkOworCisgICAgaWYgKGdyb3VwLT5tZW1baV0gPT0gTlVMTCkgeworICAgICAgc3RydWN0IHY0bDJfZXhwb3J0YnVmZmVyIGV4cGJ1ZiA9IHsgMCB9OworCisgICAgICBleHBidWYudHlwZSA9IG9iai0+dHlwZTsKKyAgICAgIGV4cGJ1Zi5pbmRleCA9IGdyb3VwLT5idWZmZXIuaW5kZXg7CisgICAgICBleHBidWYucGxhbmUgPSBpOworICAgICAgZXhwYnVmLmZsYWdzID0gT19DTE9FWEVDIHwgT19SRFdSOworCisgICAgICBpZiAob2JqLT5pb2N0bCAob2JqLT52aWRlb19mZCwgVklESU9DX0VYUEJVRiwgJmV4cGJ1ZikgPCAwKQorICAgICAgICBnb3RvIGV4cGJ1Zl9mYWlsZWQ7CisKKyAgICAgIEdTVF9MT0dfT0JKRUNUIChhbGxvY2F0b3IsICJleHBvcnRlZCBETUFCVUYgYXMgZmQgJWkgcGxhbmUgJWQiLAorICAgICAgICAgIGV4cGJ1Zi5mZCwgaSk7CisKKyAgICAgIGdyb3VwLT5tZW1baV0gPSAoR3N0TWVtb3J5ICopIF92NGwybWVtX25ldyAoMCwgR1NUX0FMTE9DQVRPUiAoYWxsb2NhdG9yKSwKKyAgICAgICAgICBOVUxMLCBncm91cC0+cGxhbmVzW2ldLmxlbmd0aCwgMCwgZ3JvdXAtPnBsYW5lc1tpXS5kYXRhX29mZnNldCwKKyAgICAgICAgICBncm91cC0+cGxhbmVzW2ldLmxlbmd0aCAtIGdyb3VwLT5wbGFuZXNbaV0uZGF0YV9vZmZzZXQsIGksIE5VTEwsCisgICAgICAgICAgZXhwYnVmLmZkLCBncm91cCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFRha2UgYmFjayB0aGUgYWxsb2NhdG9yIHJlZmVyZW5jZSAqLworICAgICAgZ3N0X29iamVjdF9yZWYgKGFsbG9jYXRvcik7CisgICAgfQorCisgICAgZ3JvdXAtPm1lbXNfYWxsb2NhdGVkKys7CisKKyAgICBnX2Fzc2VydCAoZ3N0X2lzX3Y0bDJfbWVtb3J5IChncm91cC0+bWVtW2ldKSk7CisgICAgbWVtID0gKEdzdFY0bDJNZW1vcnkgKikgZ3JvdXAtPm1lbVtpXTsKKworICAgIGlmICgoZG1hZmQgPSBkdXAgKG1lbS0+ZG1hZmQpKSA8IDApCisgICAgICBnb3RvIGR1cF9mYWlsZWQ7CisKKyAgICBkbWFfbWVtID0gZ3N0X2RtYWJ1Zl9hbGxvY2F0b3JfYWxsb2MgKGRtYWJ1Zl9hbGxvY2F0b3IsIGRtYWZkLAorICAgICAgICBncm91cC0+cGxhbmVzW2ldLmxlbmd0aCk7CisgICAgZ3N0X21lbW9yeV9yZXNpemUgKGRtYV9tZW0sIGdyb3VwLT5wbGFuZXNbaV0uZGF0YV9vZmZzZXQsCisgICAgICAgIGdyb3VwLT5wbGFuZXNbaV0ubGVuZ3RoIC0gZ3JvdXAtPnBsYW5lc1tpXS5kYXRhX29mZnNldCk7CisKKyAgICBnc3RfbWluaV9vYmplY3Rfc2V0X3FkYXRhIChHU1RfTUlOSV9PQkpFQ1QgKGRtYV9tZW0pLAorICAgICAgICBHU1RfVjRMMl9NRU1PUllfUVVBUkssIG1lbSwgKEdEZXN0cm95Tm90aWZ5KSBnc3RfbWVtb3J5X3VucmVmKTsKKworICAgIGdyb3VwLT5tZW1baV0gPSBkbWFfbWVtOworICB9CisKKyAgZ3N0X3Y0bDJfYWxsb2NhdG9yX3Jlc2V0X3NpemUgKGFsbG9jYXRvciwgZ3JvdXApOworCisgIHJldHVybiBncm91cDsKKworZXhwYnVmX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGFsbG9jYXRvciwgIkZhaWxlZCB0byBleHBvcnQgRE1BQlVGOiAlcyIsCisgICAgICAgIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgZ290byBjbGVhbnVwOworICB9CitkdXBfZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoYWxsb2NhdG9yLCAiRmFpbGVkIHRvIGR1cCBETUFCVUYgZGVzY3JpcHRvcjogJXMiLAorICAgICAgICBnX3N0cmVycm9yIChlcnJubykpOworICAgIGdvdG8gY2xlYW51cDsKKyAgfQorY2xlYW51cDoKKyAgeworICAgIF9jbGVhbnVwX2ZhaWxlZF9hbGxvYyAoYWxsb2NhdG9yLCBncm91cCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2FsbG9jYXRvcl9jbGVhcl9kbWFidWZpbiAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvciwKKyAgICBHc3RWNGwyTWVtb3J5R3JvdXAgKiBncm91cCkKK3sKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gYWxsb2NhdG9yLT5vYmo7CisgIEdzdFY0bDJNZW1vcnkgKm1lbTsKKyAgZ2ludCBpOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKGFsbG9jYXRvci0+bWVtb3J5ID09IFY0TDJfTUVNT1JZX0RNQUJVRik7CisKKyAgZm9yIChpID0gMDsgaSA8IGdyb3VwLT5uX21lbTsgaSsrKSB7CisKKyAgICBtZW0gPSAoR3N0VjRsMk1lbW9yeSAqKSBncm91cC0+bWVtW2ldOworCisgICAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwgImNsZWFyaW5nIERNQUJVRiBpbXBvcnQsIGZkICVpIHBsYW5lICVkIiwKKyAgICAgICAgbWVtLT5kbWFmZCwgaSk7CisKKyAgICBpZiAobWVtLT5kbWFmZCA+PSAwKQorICAgICAgY2xvc2UgKG1lbS0+ZG1hZmQpOworCisgICAgLyogVXBkYXRlIG1lbW9yeSAqLworICAgIG1lbS0+bWVtLm1heHNpemUgPSAwOworICAgIG1lbS0+bWVtLm9mZnNldCA9IDA7CisgICAgbWVtLT5tZW0uc2l6ZSA9IDA7CisgICAgbWVtLT5kbWFmZCA9IC0xOworCisgICAgLyogVXBkYXRlIHY0bDIgc3RydWN0dXJlICovCisgICAgZ3JvdXAtPnBsYW5lc1tpXS5sZW5ndGggPSAwOworICAgIGdyb3VwLT5wbGFuZXNbaV0uYnl0ZXN1c2VkID0gMDsKKyAgICBncm91cC0+cGxhbmVzW2ldLm0uZmQgPSAtMTsKKyAgICBncm91cC0+cGxhbmVzW2ldLmRhdGFfb2Zmc2V0ID0gMDsKKyAgfQorCisgIGlmICghVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSIChvYmotPnR5cGUpKSB7CisgICAgZ3JvdXAtPmJ1ZmZlci5ieXRlc3VzZWQgPSAwOworICAgIGdyb3VwLT5idWZmZXIubGVuZ3RoID0gMDsKKyAgICBncm91cC0+YnVmZmVyLm0uZmQgPSAtMTsKKyAgfQorfQorCitHc3RWNGwyTWVtb3J5R3JvdXAgKgorZ3N0X3Y0bDJfYWxsb2NhdG9yX2FsbG9jX2RtYWJ1ZmluIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yKQoreworICBHc3RWNGwyTWVtb3J5R3JvdXAgKmdyb3VwOworICBnaW50IGk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGFsbG9jYXRvci0+bWVtb3J5ID09IFY0TDJfTUVNT1JZX0RNQUJVRiwgTlVMTCk7CisKKyAgZ3JvdXAgPSBnc3RfdjRsMl9hbGxvY2F0b3JfYWxsb2MgKGFsbG9jYXRvcik7CisKKyAgaWYgKGdyb3VwID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwgImFsbG9jYXRpbmcgZW1wdHkgRE1BQlVGIGltcG9ydCBncm91cCIpOworCisgIGZvciAoaSA9IDA7IGkgPCBncm91cC0+bl9tZW07IGkrKykgeworICAgIGlmIChncm91cC0+bWVtW2ldID09IE5VTEwpIHsKKyAgICAgIGdyb3VwLT5tZW1baV0gPSAoR3N0TWVtb3J5ICopIF92NGwybWVtX25ldyAoMCwgR1NUX0FMTE9DQVRPUiAoYWxsb2NhdG9yKSwKKyAgICAgICAgICBOVUxMLCAwLCAwLCAwLCAwLCBpLCBOVUxMLCAtMSwgZ3JvdXApOworICAgIH0gZWxzZSB7CisgICAgICAvKiBUYWtlIGJhY2sgdGhlIGFsbG9jYXRvciByZWZlcmVuY2UgKi8KKyAgICAgIGdzdF9vYmplY3RfcmVmIChhbGxvY2F0b3IpOworICAgIH0KKworICAgIGdyb3VwLT5tZW1zX2FsbG9jYXRlZCsrOworICB9CisKKyAgZ3N0X3Y0bDJfYWxsb2NhdG9yX2NsZWFyX2RtYWJ1ZmluIChhbGxvY2F0b3IsIGdyb3VwKTsKKworICByZXR1cm4gZ3JvdXA7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9hbGxvY2F0b3JfY2xlYXJfdXNlcnB0ciAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvciwKKyAgICBHc3RWNGwyTWVtb3J5R3JvdXAgKiBncm91cCkKK3sKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gYWxsb2NhdG9yLT5vYmo7CisgIEdzdFY0bDJNZW1vcnkgKm1lbTsKKyAgZ2ludCBpOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKGFsbG9jYXRvci0+bWVtb3J5ID09IFY0TDJfTUVNT1JZX1VTRVJQVFIpOworCisgIGZvciAoaSA9IDA7IGkgPCBncm91cC0+bl9tZW07IGkrKykgeworICAgIG1lbSA9IChHc3RWNGwyTWVtb3J5ICopIGdyb3VwLT5tZW1baV07CisKKyAgICBHU1RfTE9HX09CSkVDVCAoYWxsb2NhdG9yLCAiY2xlYXJpbmcgVVNFUlBUUiAlcCBwbGFuZSAlZCBzaXplICUiCisgICAgICAgIEdfR1NJWkVfRk9STUFULCBtZW0tPmRhdGEsIGksIG1lbS0+bWVtLnNpemUpOworCisgICAgbWVtLT5tZW0ubWF4c2l6ZSA9IDA7CisgICAgbWVtLT5tZW0uc2l6ZSA9IDA7CisgICAgbWVtLT5kYXRhID0gTlVMTDsKKworICAgIGdyb3VwLT5wbGFuZXNbaV0ubGVuZ3RoID0gMDsKKyAgICBncm91cC0+cGxhbmVzW2ldLmJ5dGVzdXNlZCA9IDA7CisgICAgZ3JvdXAtPnBsYW5lc1tpXS5tLnVzZXJwdHIgPSAwOworICB9CisKKyAgaWYgKCFWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIgKG9iai0+dHlwZSkpIHsKKyAgICBncm91cC0+YnVmZmVyLmJ5dGVzdXNlZCA9IDA7CisgICAgZ3JvdXAtPmJ1ZmZlci5sZW5ndGggPSAwOworICAgIGdyb3VwLT5idWZmZXIubS51c2VycHRyID0gMDsKKyAgfQorfQorCitHc3RWNGwyTWVtb3J5R3JvdXAgKgorZ3N0X3Y0bDJfYWxsb2NhdG9yX2FsbG9jX3VzZXJwdHIgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IpCit7CisgIEdzdFY0bDJNZW1vcnlHcm91cCAqZ3JvdXA7CisgIGdpbnQgaTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoYWxsb2NhdG9yLT5tZW1vcnkgPT0gVjRMMl9NRU1PUllfVVNFUlBUUiwgTlVMTCk7CisKKyAgZ3JvdXAgPSBnc3RfdjRsMl9hbGxvY2F0b3JfYWxsb2MgKGFsbG9jYXRvcik7CisKKyAgaWYgKGdyb3VwID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwgImFsbG9jYXRpbmcgZW1wdHkgVVNFUlBUUiBncm91cCIpOworCisgIGZvciAoaSA9IDA7IGkgPCBncm91cC0+bl9tZW07IGkrKykgeworCisgICAgaWYgKGdyb3VwLT5tZW1baV0gPT0gTlVMTCkgeworICAgICAgZ3JvdXAtPm1lbVtpXSA9IChHc3RNZW1vcnkgKikgX3Y0bDJtZW1fbmV3ICgwLCBHU1RfQUxMT0NBVE9SIChhbGxvY2F0b3IpLAorICAgICAgICAgIE5VTEwsIDAsIDAsIDAsIDAsIGksIE5VTEwsIC0xLCBncm91cCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFRha2UgYmFjayB0aGUgYWxsb2NhdG9yIHJlZmVyZW5jZSAqLworICAgICAgZ3N0X29iamVjdF9yZWYgKGFsbG9jYXRvcik7CisgICAgfQorCisgICAgZ3JvdXAtPm1lbXNfYWxsb2NhdGVkKys7CisgIH0KKworICBnc3RfdjRsMl9hbGxvY2F0b3JfY2xlYXJfdXNlcnB0ciAoYWxsb2NhdG9yLCBncm91cCk7CisKKyAgcmV0dXJuIGdyb3VwOworfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfYWxsb2NhdG9yX2ltcG9ydF9kbWFidWYgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IsCisgICAgR3N0VjRsMk1lbW9yeUdyb3VwICogZ3JvdXAsIGdpbnQgbl9tZW0sIEdzdE1lbW9yeSAqKiBkbWFfbWVtKQoreworICBHc3RWNGwyT2JqZWN0ICpvYmogPSBhbGxvY2F0b3ItPm9iajsKKyAgR3N0VjRsMk1lbW9yeSAqbWVtOworICBnaW50IGk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGFsbG9jYXRvci0+bWVtb3J5ID09IFY0TDJfTUVNT1JZX0RNQUJVRiwgRkFMU0UpOworCisgIGlmIChncm91cC0+bl9tZW0gIT0gbl9tZW0pCisgICAgZ290byBuX21lbV9taXNzbWF0Y2g7CisKKyAgZm9yIChpID0gMDsgaSA8IGdyb3VwLT5uX21lbTsgaSsrKSB7CisgICAgZ2ludCBkbWFmZDsKKyAgICBnc2l6ZSBzaXplLCBvZmZzZXQsIG1heHNpemU7CisKKyAgICBpZiAoIWdzdF9pc19kbWFidWZfbWVtb3J5IChkbWFfbWVtW2ldKSkKKyAgICAgIGdvdG8gbm90X2RtYWJ1ZjsKKworICAgIHNpemUgPSBnc3RfbWVtb3J5X2dldF9zaXplcyAoZG1hX21lbVtpXSwgJm9mZnNldCwgJm1heHNpemUpOworCisgICAgaWYgKChkbWFmZCA9IGR1cCAoZ3N0X2RtYWJ1Zl9tZW1vcnlfZ2V0X2ZkIChkbWFfbWVtW2ldKSkpIDwgMCkKKyAgICAgIGdvdG8gZHVwX2ZhaWxlZDsKKworICAgIEdTVF9MT0dfT0JKRUNUIChhbGxvY2F0b3IsICJpbXBvcnRlZCBETUFCVUYgYXMgZmQgJWkgcGxhbmUgJWQiLCBkbWFmZCwgaSk7CisKKyAgICBtZW0gPSAoR3N0VjRsMk1lbW9yeSAqKSBncm91cC0+bWVtW2ldOworCisgICAgLyogVXBkYXRlIG1lbW9yeSAqLworICAgIG1lbS0+bWVtLm1heHNpemUgPSBtYXhzaXplOworICAgIG1lbS0+bWVtLm9mZnNldCA9IG9mZnNldDsKKyAgICBtZW0tPm1lbS5zaXplID0gc2l6ZTsKKyAgICBtZW0tPmRtYWZkID0gZG1hZmQ7CisKKyAgICAvKiBVcGRhdGUgdjRsMiBzdHJ1Y3R1cmUgKi8KKyAgICBncm91cC0+cGxhbmVzW2ldLmxlbmd0aCA9IG1heHNpemU7CisgICAgZ3JvdXAtPnBsYW5lc1tpXS5ieXRlc3VzZWQgPSBzaXplICsgb2Zmc2V0OworICAgIGdyb3VwLT5wbGFuZXNbaV0ubS5mZCA9IGRtYWZkOworICAgIGdyb3VwLT5wbGFuZXNbaV0uZGF0YV9vZmZzZXQgPSBvZmZzZXQ7CisgIH0KKworICAvKiBDb3B5IGludG8gYnVmZmVyIHN0cnVjdHVyZSBpZiBub3QgdXNpbmcgcGxhbmVzICovCisgIGlmICghVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSIChvYmotPnR5cGUpKSB7CisgICAgZ3JvdXAtPmJ1ZmZlci5ieXRlc3VzZWQgPSBncm91cC0+cGxhbmVzWzBdLmJ5dGVzdXNlZDsKKyAgICBncm91cC0+YnVmZmVyLmxlbmd0aCA9IGdyb3VwLT5wbGFuZXNbMF0ubGVuZ3RoOworICAgIGdyb3VwLT5idWZmZXIubS5mZCA9IGdyb3VwLT5wbGFuZXNbMF0ubS51c2VycHRyOworCisgICAgLyogRklYTUUgQ2hlY2sgaWYgZGF0YV9vZmZzZXQgPiAwIGFuZCBmYWlsIGZvciBub24tbXVsdGktcGxhbmFyICovCisgICAgZ19hc3NlcnQgKGdyb3VwLT5wbGFuZXNbMF0uZGF0YV9vZmZzZXQgPT0gMCk7CisgIH0gZWxzZSB7CisgICAgZ3JvdXAtPmJ1ZmZlci5sZW5ndGggPSBncm91cC0+bl9tZW07CisgIH0KKworICByZXR1cm4gVFJVRTsKKworbl9tZW1fbWlzc21hdGNoOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoYWxsb2NhdG9yLCAiR290ICVpIGRtYWJ1ZiBidXQgbmVlZGVkICVpIiwgbl9tZW0sCisgICAgICAgIGdyb3VwLT5uX21lbSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub3RfZG1hYnVmOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoYWxsb2NhdG9yLCAiTWVtb3J5ICVpIGlzIG5vdCBvZiBETUFCVUYiLCBpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2R1cF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChhbGxvY2F0b3IsICJGYWlsZWQgdG8gZHVwIERNQUJVRiBkZXNjcmlwdG9yOiAlcyIsCisgICAgICAgIGdfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9hbGxvY2F0b3JfaW1wb3J0X3VzZXJwdHIgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IsCisgICAgR3N0VjRsMk1lbW9yeUdyb3VwICogZ3JvdXAsIGdzaXplIGltZ19zaXplLCBpbnQgbl9wbGFuZXMsCisgICAgZ3BvaW50ZXIgKiBkYXRhLCBnc2l6ZSAqIHNpemUpCit7CisgIEdzdFY0bDJPYmplY3QgKm9iaiA9IGFsbG9jYXRvci0+b2JqOworICBHc3RWNGwyTWVtb3J5ICptZW07CisgIGdpbnQgaTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoYWxsb2NhdG9yLT5tZW1vcnkgPT0gVjRMMl9NRU1PUllfVVNFUlBUUiwgRkFMU0UpOworCisgIC8qIFRPRE8gU3VwcG9ydCBwYXNzaW5nIE4gcGxhbmUgZnJvbSAxIG1lbW9yeSB0byBNUExBTkUgdjRsMiBmb3JtYXQgKi8KKyAgaWYgKFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUiAob2JqLT50eXBlKSAmJiBuX3BsYW5lcyAhPSBncm91cC0+bl9tZW0pCisgICAgZ290byBuX21lbV9taXNzbWF0Y2g7CisKKyAgZm9yIChpID0gMDsgaSA8IGdyb3VwLT5uX21lbTsgaSsrKSB7CisgICAgZ3NpemUgbWF4c2l6ZSwgcHNpemU7CisKKyAgICBpZiAoVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSIChvYmotPnR5cGUpKSB7CisgICAgICBtYXhzaXplID0gZ3JvdXAtPnBsYW5lc1tpXS5sZW5ndGg7CisgICAgICBwc2l6ZSA9IHNpemVbaV07CisgICAgfSBlbHNlIHsKKyAgICAgIG1heHNpemUgPSBncm91cC0+cGxhbmVzW2ldLmxlbmd0aDsKKyAgICAgIHBzaXplID0gaW1nX3NpemU7CisgICAgfQorCisgICAgZ19hc3NlcnQgKHBzaXplIDw9IGltZ19zaXplKTsKKworICAgIEdTVF9MT0dfT0JKRUNUIChhbGxvY2F0b3IsICJpbXBvcnRlZCBVU0VSUFRSICVwIHBsYW5lICVkIHNpemUgJSIKKyAgICAgICAgR19HU0laRV9GT1JNQVQsIGRhdGFbaV0sIGksIHBzaXplKTsKKworICAgIG1lbSA9IChHc3RWNGwyTWVtb3J5ICopIGdyb3VwLT5tZW1baV07CisKKyAgICBtZW0tPm1lbS5tYXhzaXplID0gbWF4c2l6ZTsKKyAgICBtZW0tPm1lbS5zaXplID0gcHNpemU7CisgICAgbWVtLT5kYXRhID0gZGF0YVtpXTsKKworICAgIGdyb3VwLT5wbGFuZXNbaV0ubGVuZ3RoID0gbWF4c2l6ZTsKKyAgICBncm91cC0+cGxhbmVzW2ldLmJ5dGVzdXNlZCA9IHBzaXplOworICAgIGdyb3VwLT5wbGFuZXNbaV0ubS51c2VycHRyID0gKHVuc2lnbmVkIGxvbmcpIGRhdGFbaV07CisgICAgZ3JvdXAtPnBsYW5lc1tpXS5kYXRhX29mZnNldCA9IDA7CisgIH0KKworICAvKiBDb3B5IGludG8gYnVmZmVyIHN0cnVjdHVyZSBpZiBub3QgdXNpbmcgcGxhbmVzICovCisgIGlmICghVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSIChvYmotPnR5cGUpKSB7CisgICAgZ3JvdXAtPmJ1ZmZlci5ieXRlc3VzZWQgPSBncm91cC0+cGxhbmVzWzBdLmJ5dGVzdXNlZDsKKyAgICBncm91cC0+YnVmZmVyLmxlbmd0aCA9IGdyb3VwLT5wbGFuZXNbMF0ubGVuZ3RoOworICAgIGdyb3VwLT5idWZmZXIubS51c2VycHRyID0gZ3JvdXAtPnBsYW5lc1swXS5tLnVzZXJwdHI7CisgIH0gZWxzZSB7CisgICAgZ3JvdXAtPmJ1ZmZlci5sZW5ndGggPSBncm91cC0+bl9tZW07CisgIH0KKworICByZXR1cm4gVFJVRTsKKworbl9tZW1fbWlzc21hdGNoOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoYWxsb2NhdG9yLCAiR290ICVpIHVzZXJwdHIgcGxhbmUgd2hpbGUgZHJpdmVyIG5lZWQgJWkiLAorICAgICAgICBuX3BsYW5lcywgZ3JvdXAtPm5fbWVtKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKwordm9pZAorZ3N0X3Y0bDJfYWxsb2NhdG9yX2ZsdXNoIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yKQoreworICBnaW50IGk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChhbGxvY2F0b3IpOworCisgIGlmICghZ19hdG9taWNfaW50X2dldCAoJmFsbG9jYXRvci0+YWN0aXZlKSkKKyAgICBnb3RvIGRvbmU7CisKKyAgZm9yIChpID0gMDsgaSA8IGFsbG9jYXRvci0+Y291bnQ7IGkrKykgeworICAgIEdzdFY0bDJNZW1vcnlHcm91cCAqZ3JvdXAgPSBhbGxvY2F0b3ItPmdyb3Vwc1tpXTsKKyAgICBnaW50IG47CisKKyAgICBpZiAoSVNfUVVFVUVEIChncm91cC0+YnVmZmVyKSkgeworICAgICAgVU5TRVRfUVVFVUVEIChncm91cC0+YnVmZmVyKTsKKworICAgICAgZ3N0X3Y0bDJfYWxsb2NhdG9yX3Jlc2V0X2dyb3VwIChhbGxvY2F0b3IsIGdyb3VwKTsKKworICAgICAgZm9yIChuID0gMDsgbiA8IGdyb3VwLT5uX21lbTsgbisrKQorICAgICAgICBnc3RfbWVtb3J5X3VucmVmIChncm91cC0+bWVtW25dKTsKKyAgICB9CisgIH0KKworZG9uZToKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKGFsbG9jYXRvcik7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9hbGxvY2F0b3JfcWJ1ZiAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvciwKKyAgICBHc3RWNGwyTWVtb3J5R3JvdXAgKiBncm91cCkKK3sKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gYWxsb2NhdG9yLT5vYmo7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIGdpbnQgaTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ19hdG9taWNfaW50X2dldCAoJmFsbG9jYXRvci0+YWN0aXZlKSwgRkFMU0UpOworCisgIC8qIHVwZGF0ZSBzaXplcyAqLworICBpZiAoVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSIChvYmotPnR5cGUpKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGdyb3VwLT5uX21lbTsgaSsrKQorICAgICAgZ3JvdXAtPnBsYW5lc1tpXS5ieXRlc3VzZWQgPQorICAgICAgICAgIGdzdF9tZW1vcnlfZ2V0X3NpemVzIChncm91cC0+bWVtW2ldLCBOVUxMLCBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBncm91cC0+YnVmZmVyLmJ5dGVzdXNlZCA9IGdzdF9tZW1vcnlfZ2V0X3NpemVzIChncm91cC0+bWVtWzBdLCBOVUxMLCBOVUxMKTsKKyAgfQorCisgIC8qIEVuc3VyZSB0aGUgbWVtb3J5IHdpbGwgc3RheSBhcm91bmQgYW5kIGlzIFJPICovCisgIGZvciAoaSA9IDA7IGkgPCBncm91cC0+bl9tZW07IGkrKykKKyAgICBnc3RfbWVtb3J5X3JlZiAoZ3JvdXAtPm1lbVtpXSk7CisKKyAgaWYgKG9iai0+aW9jdGwgKG9iai0+dmlkZW9fZmQsIFZJRElPQ19RQlVGLCAmZ3JvdXAtPmJ1ZmZlcikgPCAwKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoYWxsb2NhdG9yLCAiZmFpbGVkIHF1ZXVlaW5nIGJ1ZmZlciAlaTogJXMiLAorICAgICAgICBncm91cC0+YnVmZmVyLmluZGV4LCBnX3N0cmVycm9yIChlcnJubykpOworCisgICAgLyogUmVsZWFzZSB0aGUgbWVtb3J5LCBwb3NzaWJseSBtYWtpbmcgaXQgUlcgYWdhaW4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXAtPm5fbWVtOyBpKyspCisgICAgICBnc3RfbWVtb3J5X3VucmVmIChncm91cC0+bWVtW2ldKTsKKworICAgIHJldCA9IEZBTFNFOworICAgIGlmIChJU19RVUVVRUQgKGdyb3VwLT5idWZmZXIpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChhbGxvY2F0b3IsCisgICAgICAgICAgImRyaXZlciBwcmV0ZW5kcyBidWZmZXIgaXMgcXVldWVkIGV2ZW4gaWYgcXVldWUgZmFpbGVkIik7CisgICAgICBVTlNFVF9RVUVVRUQgKGdyb3VwLT5idWZmZXIpOworICAgIH0KKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBHU1RfTE9HX09CSkVDVCAoYWxsb2NhdG9yLCAicXVldWVkIGJ1ZmZlciAlaSAoZmxhZ3MgMHglWCkiLAorICAgICAgZ3JvdXAtPmJ1ZmZlci5pbmRleCwgZ3JvdXAtPmJ1ZmZlci5mbGFncyk7CisKKyAgaWYgKCFJU19RVUVVRUQgKGdyb3VwLT5idWZmZXIpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoYWxsb2NhdG9yLAorICAgICAgICAiZHJpdmVyIHByZXRlbmRzIGJ1ZmZlciBpcyBub3QgcXVldWVkIGV2ZW4gaWYgcXVldWUgc3VjY2VlZGVkIik7CisgICAgU0VUX1FVRVVFRCAoZ3JvdXAtPmJ1ZmZlcik7CisgIH0KKworZG9uZToKKyAgcmV0dXJuIHJldDsKK30KKworR3N0Rmxvd1JldHVybgorZ3N0X3Y0bDJfYWxsb2NhdG9yX2RxYnVmIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yLAorICAgIEdzdFY0bDJNZW1vcnlHcm91cCAqKiBncm91cF9vdXQpCit7CisgIEdzdFY0bDJPYmplY3QgKm9iaiA9IGFsbG9jYXRvci0+b2JqOworICBzdHJ1Y3QgdjRsMl9idWZmZXIgYnVmZmVyID0geyAwIH07CisgIHN0cnVjdCB2NGwyX3BsYW5lIHBsYW5lc1tWSURFT19NQVhfUExBTkVTXSA9IHsgezB9IH07CisgIGdpbnQgaTsKKworICBHc3RWNGwyTWVtb3J5R3JvdXAgKmdyb3VwID0gTlVMTDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ19hdG9taWNfaW50X2dldCAoJmFsbG9jYXRvci0+YWN0aXZlKSwgR1NUX0ZMT1dfRVJST1IpOworCisgIGJ1ZmZlci50eXBlID0gb2JqLT50eXBlOworICBidWZmZXIubWVtb3J5ID0gYWxsb2NhdG9yLT5tZW1vcnk7CisKKyAgaWYgKFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUiAob2JqLT50eXBlKSkgeworICAgIGJ1ZmZlci5sZW5ndGggPSBvYmotPmZvcm1hdC5mbXQucGl4X21wLm51bV9wbGFuZXM7CisgICAgYnVmZmVyLm0ucGxhbmVzID0gcGxhbmVzOworICB9CisKKyAgaWYgKG9iai0+aW9jdGwgKG9iai0+dmlkZW9fZmQsIFZJRElPQ19EUUJVRiwgJmJ1ZmZlcikgPCAwKQorICAgIGdvdG8gZXJyb3I7CisKKyAgZ3JvdXAgPSBhbGxvY2F0b3ItPmdyb3Vwc1tidWZmZXIuaW5kZXhdOworCisgIGlmICghSVNfUVVFVUVEIChncm91cC0+YnVmZmVyKSkgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGFsbG9jYXRvciwKKyAgICAgICAgImJ1ZmZlciAlaSB3YXMgbm90IHF1ZXVlZCwgdGhpcyBpbmRpY2F0ZSBhIGRyaXZlciBidWcuIiwgYnVmZmVyLmluZGV4KTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICBncm91cC0+YnVmZmVyID0gYnVmZmVyOworCisgIEdTVF9MT0dfT0JKRUNUIChhbGxvY2F0b3IsICJkZXF1ZXVlZCBidWZmZXIgJWkgKGZsYWdzIDB4JVgpIiwgYnVmZmVyLmluZGV4LAorICAgICAgYnVmZmVyLmZsYWdzKTsKKworICBpZiAoSVNfUVVFVUVEIChncm91cC0+YnVmZmVyKSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFsbG9jYXRvciwKKyAgICAgICAgImRyaXZlciBwcmV0ZW5kcyBidWZmZXIgaXMgcXVldWVkIGV2ZW4gaWYgZGVxdWV1ZSBzdWNjZWVkZWQiKTsKKyAgICBVTlNFVF9RVUVVRUQgKGdyb3VwLT5idWZmZXIpOworICB9CisKKyAgaWYgKFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUiAob2JqLT50eXBlKSkgeworICAgIGdyb3VwLT5idWZmZXIubS5wbGFuZXMgPSBncm91cC0+cGxhbmVzOworICAgIG1lbWNweSAoZ3JvdXAtPnBsYW5lcywgYnVmZmVyLm0ucGxhbmVzLCBzaXplb2YgKHBsYW5lcykpOworICB9IGVsc2UgeworICAgIGdyb3VwLT5wbGFuZXNbMF0uYnl0ZXN1c2VkID0gZ3JvdXAtPmJ1ZmZlci5ieXRlc3VzZWQ7CisgICAgZ3JvdXAtPnBsYW5lc1swXS5sZW5ndGggPSBncm91cC0+YnVmZmVyLmxlbmd0aDsKKyAgICBnX2Fzc2VydCAoc2l6ZW9mIChncm91cC0+cGxhbmVzWzBdLm0pID09IHNpemVvZiAoZ3JvdXAtPmJ1ZmZlci5tKSk7CisgICAgbWVtY3B5ICgmZ3JvdXAtPnBsYW5lc1swXS5tLCAmZ3JvdXAtPmJ1ZmZlci5tLCBzaXplb2YgKGdyb3VwLT5idWZmZXIubSkpOworICB9CisKKyAgLyogQW5kIHVwZGF0ZSBtZW1vcnkgc2l6ZSAqLworICBpZiAoVjRMMl9UWVBFX0lTX09VVFBVVCAob2JqLT50eXBlKSkgeworICAgIGdzdF92NGwyX2FsbG9jYXRvcl9yZXNldF9zaXplIChhbGxvY2F0b3IsIGdyb3VwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBmb3IgY2FwdHVyZSwgc2ltcGx5IHJlYWQgdGhlIHNpemUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXAtPm5fbWVtOyBpKyspIHsKKyAgICAgIGdzaXplIHNpemUsIG9mZnNldDsKKworICAgICAgR1NUX0xPR19PQkpFQ1QgKGFsbG9jYXRvciwKKyAgICAgICAgICAiRGVxdWV1ZWQgY2FwdHVyZSBidWZmZXIsIGxlbmd0aDogJXUgYnl0ZXN1c2VkOiAldSBkYXRhX29mZnNldDogJXUiLAorICAgICAgICAgIGdyb3VwLT5wbGFuZXNbaV0ubGVuZ3RoLCBncm91cC0+cGxhbmVzW2ldLmJ5dGVzdXNlZCwKKyAgICAgICAgICBncm91cC0+cGxhbmVzW2ldLmRhdGFfb2Zmc2V0KTsKKworICAgICAgb2Zmc2V0ID0gZ3JvdXAtPnBsYW5lc1tpXS5kYXRhX29mZnNldDsKKworICAgICAgaWYgKGdyb3VwLT5wbGFuZXNbaV0uYnl0ZXN1c2VkID4gZ3JvdXAtPnBsYW5lc1tpXS5kYXRhX29mZnNldCkgeworICAgICAgICBzaXplID0gZ3JvdXAtPnBsYW5lc1tpXS5ieXRlc3VzZWQgLSBncm91cC0+cGxhbmVzW2ldLmRhdGFfb2Zmc2V0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhbGxvY2F0b3IsICJWNEwyIHByb3ZpZGVkIGJ1ZmZlciBoYXMgYnl0ZXN1c2VkICUiCisgICAgICAgICAgICBHX0dVSU5UMzJfRk9STUFUICIgd2hpY2ggaXMgdG9vIHNtYWxsIHRvIGluY2x1ZGUgZGF0YV9vZmZzZXQgJSIKKyAgICAgICAgICAgIEdfR1VJTlQzMl9GT1JNQVQsIGdyb3VwLT5wbGFuZXNbaV0uYnl0ZXN1c2VkLAorICAgICAgICAgICAgZ3JvdXAtPnBsYW5lc1tpXS5kYXRhX29mZnNldCk7CisgICAgICAgIHNpemUgPSBncm91cC0+cGxhbmVzW2ldLmJ5dGVzdXNlZDsKKyAgICAgIH0KKworICAgICAgaWYgKEdfTElLRUxZIChzaXplICsgb2Zmc2V0IDw9IGdyb3VwLT5tZW1baV0tPm1heHNpemUpKQorICAgICAgICBnc3RfbWVtb3J5X3Jlc2l6ZSAoZ3JvdXAtPm1lbVtpXSwgb2Zmc2V0LCBzaXplKTsKKyAgICAgIGVsc2UgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGFsbG9jYXRvciwKKyAgICAgICAgICAgICJ2NGwyIHByb3ZpZGVkIGJ1ZmZlciB0aGF0IGlzIHRvbyBiaWcgZm9yIHRoZSBtZW1vcnkgaXQgd2FzICIKKyAgICAgICAgICAgICJ3cml0aW5nIGludG8uICB2NGwyIGNsYWltcyAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIHVzZWQgYnV0ICIKKyAgICAgICAgICAgICJtZW1vcnkgaXMgb25seSAlIiBHX0dTSVpFX0ZPUk1BVCAiQi4gIFRoaXMgaXMgcHJvYmFibHkgYSBkcml2ZXIgIgorICAgICAgICAgICAgImJ1Zy4iLCBzaXplLCBncm91cC0+bWVtW2ldLT5tYXhzaXplKTsKKyAgICAgICAgZ3N0X21lbW9yeV9yZXNpemUgKGdyb3VwLT5tZW1baV0sIDAsIGdyb3VwLT5tZW1baV0tPm1heHNpemUpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFJlbGVhc2UgdGhlIG1lbW9yeSwgcG9zc2libHkgbWFraW5nIGl0IFJXIGFnYWluICovCisgIGZvciAoaSA9IDA7IGkgPCBncm91cC0+bl9tZW07IGkrKykKKyAgICBnc3RfbWVtb3J5X3VucmVmIChncm91cC0+bWVtW2ldKTsKKworICAqZ3JvdXBfb3V0ID0gZ3JvdXA7CisgIHJldHVybiBHU1RfRkxPV19PSzsKKworZXJyb3I6CisgIGlmIChlcnJubyA9PSBFUElQRSkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFsbG9jYXRvciwgImJyb2tlbiBwaXBlIHNpZ25hbHMgbGFzdCBidWZmZXIiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRU9TOworICB9CisKKyAgR1NUX0VSUk9SX09CSkVDVCAoYWxsb2NhdG9yLCAiZmFpbGVkIGRlcXVldWluZyBhICVzIGJ1ZmZlcjogJXMiLAorICAgICAgbWVtb3J5X3R5cGVfdG9fc3RyIChhbGxvY2F0b3ItPm1lbW9yeSksIGdfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgc3dpdGNoIChlcnJubykgeworICAgIGNhc2UgRUFHQUlOOgorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChhbGxvY2F0b3IsCisgICAgICAgICAgIk5vbi1ibG9ja2luZyBJL08gaGFzIGJlZW4gc2VsZWN0ZWQgdXNpbmcgT19OT05CTE9DSyBhbmQiCisgICAgICAgICAgIiBubyBidWZmZXIgd2FzIGluIHRoZSBvdXRnb2luZyBxdWV1ZS4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRUlOVkFMOgorICAgICAgR1NUX0VSUk9SX09CSkVDVCAoYWxsb2NhdG9yLAorICAgICAgICAgICJUaGUgYnVmZmVyIHR5cGUgaXMgbm90IHN1cHBvcnRlZCwgb3IgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMsICIKKyAgICAgICAgICAib3Igbm8gYnVmZmVycyBoYXZlIGJlZW4gYWxsb2NhdGVkIHlldCwgb3IgdGhlIHVzZXJwdHIgIgorICAgICAgICAgICJvciBsZW5ndGggYXJlIGludmFsaWQuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVOT01FTToKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKGFsbG9jYXRvciwKKyAgICAgICAgICAiaW5zdWZmaWNpZW50IG1lbW9yeSB0byBlbnF1ZXVlIGEgdXNlciBwb2ludGVyIGJ1ZmZlciIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFSU86CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGFsbG9jYXRvciwKKyAgICAgICAgICAiVklESU9DX0RRQlVGIGZhaWxlZCBkdWUgdG8gYW4gaW50ZXJuYWwgZXJyb3IuIgorICAgICAgICAgICIgQ2FuIGFsc28gaW5kaWNhdGUgdGVtcG9yYXJ5IHByb2JsZW1zIGxpa2Ugc2lnbmFsIGxvc3MuIgorICAgICAgICAgICIgTm90ZSB0aGUgZHJpdmVyIG1pZ2h0IGRlcXVldWUgYW4gKGVtcHR5KSBidWZmZXIgZGVzcGl0ZSIKKyAgICAgICAgICAiIHJldHVybmluZyBhbiBlcnJvciwgb3IgZXZlbiBzdG9wIGNhcHR1cmluZy4iKTsKKyAgICAgIC8qIGhhdmUgd2UgZGUtcXVldWVkIGEgYnVmZmVyID8gKi8KKyAgICAgIGlmICghSVNfUVVFVUVEIChidWZmZXIpKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGFsbG9jYXRvciwgInJlZW5xdWV1ZWluZyBidWZmZXIiKTsKKyAgICAgICAgLyogRklYTUUgLi4uIHNob3VsZCB3ZSBkbyBzb21ldGhpbmcgaGVyZT8gKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRUlOVFI6CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGFsbG9jYXRvciwgImNvdWxkIG5vdCBzeW5jIG9uIGEgYnVmZmVyIG9uIGRldmljZSIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoYWxsb2NhdG9yLAorICAgICAgICAgICJHcmFiYmluZyBmcmFtZSBnb3QgaW50ZXJydXB0ZWQgdW5leHBlY3RlZGx5LiAlZDogJXMuIiwgZXJybm8sCisgICAgICAgICAgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworfQorCit2b2lkCitnc3RfdjRsMl9hbGxvY2F0b3JfcmVzZXRfZ3JvdXAgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IsCisgICAgR3N0VjRsMk1lbW9yeUdyb3VwICogZ3JvdXApCit7CisgIHN3aXRjaCAoYWxsb2NhdG9yLT5tZW1vcnkpIHsKKyAgICBjYXNlIFY0TDJfTUVNT1JZX1VTRVJQVFI6CisgICAgICBnc3RfdjRsMl9hbGxvY2F0b3JfY2xlYXJfdXNlcnB0ciAoYWxsb2NhdG9yLCBncm91cCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfTUVNT1JZX0RNQUJVRjoKKyAgICAgIGdzdF92NGwyX2FsbG9jYXRvcl9jbGVhcl9kbWFidWZpbiAoYWxsb2NhdG9yLCBncm91cCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfTUVNT1JZX01NQVA6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBicmVhazsKKyAgfQorCisgIGdzdF92NGwyX2FsbG9jYXRvcl9yZXNldF9zaXplIChhbGxvY2F0b3IsIGdyb3VwKTsKK30KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuaCBiL3N5cy92NGwyL2dzdHY0bDJhbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODI2ODE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMmFsbG9jYXRvci5oCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IENvbGxhYm9yYSBMdGQuCisgKiAgICAgQXV0aG9yOiBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKworI2lmbmRlZiBfX0dTVF9WNEwyX0FMTE9DQVRPUl9IX18KKyNkZWZpbmUgX19HU1RfVjRMMl9BTExPQ0FUT1JfSF9fCisKKyNpbmNsdWRlICJleHQvdmlkZW9kZXYyLmgiCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9nc3RhdG9taWNxdWV1ZS5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfVjRMMl9BTExPQ0FUT1IgICAgICAgICAgICAgICAgIChnc3RfdjRsMl9hbGxvY2F0b3JfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfQUxMT0NBVE9SKG9iaikgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX1Y0TDJfQUxMT0NBVE9SKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfQUxMT0NBVE9SX0NMQVNTKGtsYXNzKSAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfVjRMMl9BTExPQ0FUT1IpKQorI2RlZmluZSBHU1RfVjRMMl9BTExPQ0FUT1JfR0VUX0NMQVNTKG9iaikgICAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9WNEwyX0FMTE9DQVRPUiwgR3N0VjRsMkFsbG9jYXRvckNsYXNzKSkKKyNkZWZpbmUgR1NUX1Y0TDJfQUxMT0NBVE9SKG9iaikgICAgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX1Y0TDJfQUxMT0NBVE9SLCBHc3RWNGwyQWxsb2NhdG9yKSkKKyNkZWZpbmUgR1NUX1Y0TDJfQUxMT0NBVE9SX0NMQVNTKGtsYXNzKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfVjRMMl9BTExPQ0FUT1IsIEdzdFY0bDJBbGxvY2F0b3JDbGFzcykpCisjZGVmaW5lIEdTVF9WNEwyX0FMTE9DQVRPUl9DQVNUKG9iaikgICAgICAgICAgICAoKEdzdFY0bDJBbGxvY2F0b3IgKikob2JqKSkKKworI2RlZmluZSBHU1RfVjRMMl9BTExPQ0FUT1JfQ0FOX1JFUVVFU1Qob2JqLHR5cGUpIFwKKyAgICAgICAgKEdTVF9PQkpFQ1RfRkxBR19JU19TRVQgKG9iaiwgR1NUX1Y0TDJfQUxMT0NBVE9SX0ZMQUdfICMjIHR5cGUgIyMgX1JFUUJVRlMpKQorI2RlZmluZSBHU1RfVjRMMl9BTExPQ0FUT1JfQ0FOX0FMTE9DQVRFKG9iaix0eXBlKSBcCisgICAgICAgIChHU1RfT0JKRUNUX0ZMQUdfSVNfU0VUIChvYmosIEdTVF9WNEwyX0FMTE9DQVRPUl9GTEFHXyAjIyB0eXBlICMjIF9DUkVBVEVfQlVGUykpCisKKyNkZWZpbmUgR1NUX1Y0TDJfTUVNT1JZX1FVQVJLIGdzdF92NGwyX21lbW9yeV9xdWFyayAoKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMkFsbG9jYXRvciBHc3RWNGwyQWxsb2NhdG9yOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJBbGxvY2F0b3JDbGFzcyBHc3RWNGwyQWxsb2NhdG9yQ2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMk1lbW9yeUdyb3VwIEdzdFY0bDJNZW1vcnlHcm91cDsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyTWVtb3J5IEdzdFY0bDJNZW1vcnk7Cit0eXBlZGVmIGVudW0gX0dzdFY0bDJDYXBhYmlsaXRpZXMgR3N0VjRsMkNhcGFiaWxpdGllczsKK3R5cGVkZWYgZW51bSBfR3N0VjRsMlJldHVybiBHc3RWNGwyUmV0dXJuOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJPYmplY3QgR3N0VjRsMk9iamVjdDsKKworZW51bSBfR3N0VjRsMkFsbG9jYXRvckZsYWdzCit7CisgIEdTVF9WNEwyX0FMTE9DQVRPUl9GTEFHX01NQVBfUkVRQlVGUyAgICAgICAgPSAoR1NUX0FMTE9DQVRPUl9GTEFHX0xBU1QgPDwgMCksCisgIEdTVF9WNEwyX0FMTE9DQVRPUl9GTEFHX01NQVBfQ1JFQVRFX0JVRlMgICAgPSAoR1NUX0FMTE9DQVRPUl9GTEFHX0xBU1QgPDwgMSksCisgIEdTVF9WNEwyX0FMTE9DQVRPUl9GTEFHX1VTRVJQVFJfUkVRQlVGUyAgICAgPSAoR1NUX0FMTE9DQVRPUl9GTEFHX0xBU1QgPDwgMiksCisgIEdTVF9WNEwyX0FMTE9DQVRPUl9GTEFHX1VTRVJQVFJfQ1JFQVRFX0JVRlMgPSAoR1NUX0FMTE9DQVRPUl9GTEFHX0xBU1QgPDwgMyksCisgIEdTVF9WNEwyX0FMTE9DQVRPUl9GTEFHX0RNQUJVRl9SRVFCVUZTICAgICAgPSAoR1NUX0FMTE9DQVRPUl9GTEFHX0xBU1QgPDwgNCksCisgIEdTVF9WNEwyX0FMTE9DQVRPUl9GTEFHX0RNQUJVRl9DUkVBVEVfQlVGUyAgPSAoR1NUX0FMTE9DQVRPUl9GTEFHX0xBU1QgPDwgNSksCit9OworCitlbnVtIF9Hc3RWNGwyUmV0dXJuCit7CisgIEdTVF9WNEwyX09LID0gMCwKKyAgR1NUX1Y0TDJfRVJST1IgPSAtMSwKKyAgR1NUX1Y0TDJfQlVTWSA9IC0yCit9OworCitzdHJ1Y3QgX0dzdFY0bDJNZW1vcnkKK3sKKyAgR3N0TWVtb3J5IG1lbTsKKyAgZ2ludCBwbGFuZTsKKyAgR3N0VjRsMk1lbW9yeUdyb3VwICpncm91cDsKKyAgZ3BvaW50ZXIgZGF0YTsKKyAgZ2ludCBkbWFmZDsKK307CisKK3N0cnVjdCBfR3N0VjRsMk1lbW9yeUdyb3VwCit7CisgIGdpbnQgbl9tZW07CisgIEdzdE1lbW9yeSAqIG1lbVtWSURFT19NQVhfUExBTkVTXTsKKyAgZ2ludCBtZW1zX2FsbG9jYXRlZDsKKyAgc3RydWN0IHY0bDJfYnVmZmVyIGJ1ZmZlcjsKKyAgc3RydWN0IHY0bDJfcGxhbmUgcGxhbmVzW1ZJREVPX01BWF9QTEFORVNdOworfTsKKworc3RydWN0IF9Hc3RWNGwyQWxsb2NhdG9yCit7CisgIEdzdEFsbG9jYXRvciBwYXJlbnQ7CisgIEdzdFY0bDJPYmplY3QgKm9iajsKKyAgZ3VpbnQzMiBjb3VudDsKKyAgZ3VpbnQzMiBtZW1vcnk7CisgIGdib29sZWFuIGNhbl9hbGxvY2F0ZTsKKyAgZ2Jvb2xlYW4gYWN0aXZlOworCisgIEdzdFY0bDJNZW1vcnlHcm91cCAqIGdyb3Vwc1tWSURFT19NQVhfRlJBTUVdOworICBHc3RBdG9taWNRdWV1ZSAqZnJlZV9xdWV1ZTsKKyAgR3N0QXRvbWljUXVldWUgKnBlbmRpbmdfcXVldWU7CisKK307CisKK3N0cnVjdCBfR3N0VjRsMkFsbG9jYXRvckNsYXNzIHsKKyAgR3N0QWxsb2NhdG9yQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3Y0bDJfYWxsb2NhdG9yX2dldF90eXBlKHZvaWQpOworCitnYm9vbGVhbiAgICAgICAgICAgICBnc3RfaXNfdjRsMl9tZW1vcnkgICAgICAgICAgICAgICAgKEdzdE1lbW9yeSAqIG1lbSk7CisKK0dRdWFyayAgICAgICAgICAgICAgIGdzdF92NGwyX21lbW9yeV9xdWFyayAgICAgICAgICAgICAodm9pZCk7CisKK2dib29sZWFuICAgICAgICAgICAgIGdzdF92NGwyX2FsbG9jYXRvcl9pc19hY3RpdmUgICAgICAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvcik7CisKK2d1aW50ICAgICAgICAgICAgICAgIGdzdF92NGwyX2FsbG9jYXRvcl9nZXRfc2l6ZSAgICAgICAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvcik7CisKK0dzdFY0bDJBbGxvY2F0b3IqICAgIGdzdF92NGwyX2FsbG9jYXRvcl9uZXcgICAgICAgICAgICAoR3N0T2JqZWN0ICpwYXJlbnQsIEdzdFY0bDJPYmplY3QgKiBvYmopOworCitndWludCAgICAgICAgICAgICAgICBnc3RfdjRsMl9hbGxvY2F0b3Jfc3RhcnQgICAgICAgICAgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgY291bnQsIGd1aW50MzIgbWVtb3J5KTsKKworR3N0VjRsMlJldHVybiAgICAgICAgZ3N0X3Y0bDJfYWxsb2NhdG9yX3N0b3AgICAgICAgICAgIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yKTsKKworR3N0VjRsMk1lbW9yeUdyb3VwKiAgZ3N0X3Y0bDJfYWxsb2NhdG9yX2FsbG9jX21tYXAgICAgIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yKTsKKworR3N0VjRsMk1lbW9yeUdyb3VwKiAgZ3N0X3Y0bDJfYWxsb2NhdG9yX2FsbG9jX2RtYWJ1ZiAgIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RBbGxvY2F0b3IgKiBkbWFidWZfYWxsb2NhdG9yKTsKKworR3N0VjRsMk1lbW9yeUdyb3VwICogZ3N0X3Y0bDJfYWxsb2NhdG9yX2FsbG9jX2RtYWJ1ZmluIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yKTsKKworR3N0VjRsMk1lbW9yeUdyb3VwICogZ3N0X3Y0bDJfYWxsb2NhdG9yX2FsbG9jX3VzZXJwdHIgIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yKTsKKworZ2Jvb2xlYW4gICAgICAgICAgICAgZ3N0X3Y0bDJfYWxsb2NhdG9yX2ltcG9ydF9kbWFidWYgIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RWNGwyTWVtb3J5R3JvdXAgKmdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50IG5fbWVtLCBHc3RNZW1vcnkgKiogZG1hX21lbSk7CisKK2dib29sZWFuICAgICAgICAgICAgIGdzdF92NGwyX2FsbG9jYXRvcl9pbXBvcnRfdXNlcnB0ciAoR3N0VjRsMkFsbG9jYXRvciAqIGFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VjRsMk1lbW9yeUdyb3VwICpncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NpemUgaW1nX3NpemUsIGludCBuX3BsYW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgKiBkYXRhLCBnc2l6ZSAqIHNpemUpOworCit2b2lkICAgICAgICAgICAgICAgICBnc3RfdjRsMl9hbGxvY2F0b3JfZmx1c2ggICAgICAgICAgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IpOworCitnYm9vbGVhbiAgICAgICAgICAgICBnc3RfdjRsMl9hbGxvY2F0b3JfcWJ1ZiAgICAgICAgICAgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFY0bDJNZW1vcnlHcm91cCAqIGdyb3VwKTsKKworR3N0Rmxvd1JldHVybiAgICAgICAgZ3N0X3Y0bDJfYWxsb2NhdG9yX2RxYnVmICAgICAgICAgIChHc3RWNGwyQWxsb2NhdG9yICogYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RWNGwyTWVtb3J5R3JvdXAgKiogZ3JvdXApOworCit2b2lkICAgICAgICAgICAgICAgICBnc3RfdjRsMl9hbGxvY2F0b3JfcmVzZXRfZ3JvdXAgICAgKEdzdFY0bDJBbGxvY2F0b3IgKiBhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFY0bDJNZW1vcnlHcm91cCAqIGdyb3VwKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1Y0TDJfQUxMT0NBVE9SX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMmJ1ZmZlcnBvb2wuYyBiL3N5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZkNWM4YgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmMKQEAgLTAsMCArMSwyMDE1IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAgICAgICAgICAgICAgIDIwMDYgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKyAqICAgICAgICAgICAgICAgMjAwOSBUZXhhcyBJbnN0cnVtZW50cywgSW5jIC0gaHR0cDovL3d3dy50aS5jb20vCisgKgorICogZ3N0djRsMmJ1ZmZlcnBvb2wuYyBWNEwyIGJ1ZmZlciBwb29sIGNsYXNzCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIF9HTlVfU09VUkNFICAgICAgICAgICAgLyogT19DTE9FWEVDICovCisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImdzdC92aWRlby92aWRlby5oIgorI2luY2x1ZGUgImdzdC92aWRlby9nc3R2aWRlb21ldGEuaCIKKyNpbmNsdWRlICJnc3QvdmlkZW8vZ3N0dmlkZW9wb29sLmgiCisjaW5jbHVkZSAiZ3N0L2FsbG9jYXRvcnMvZ3N0ZG1hYnVmLmgiCisKKyNpbmNsdWRlIDxnc3R2NGwyYnVmZmVycG9vbC5oPgorCisjaW5jbHVkZSAiZ3N0djRsMm9iamVjdC5oIgorI2luY2x1ZGUgImdzdC9nc3QtaTE4bi1wbHVnaW4uaCIKKyNpbmNsdWRlIDxnc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDICh2NGwyYnVmZmVycG9vbF9kZWJ1Zyk7CitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChDQVRfUEVSRk9STUFOQ0UpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgdjRsMmJ1ZmZlcnBvb2xfZGVidWcKKworI2RlZmluZSBHU1RfVjRMMl9JTVBPUlRfUVVBUksgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfaW1wb3J0X3F1YXJrICgpCisKKworLyoKKyAqIEdzdFY0bDJCdWZmZXJQb29sOgorICovCisjZGVmaW5lIGdzdF92NGwyX2J1ZmZlcl9wb29sX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFY0bDJCdWZmZXJQb29sLCBnc3RfdjRsMl9idWZmZXJfcG9vbCwgR1NUX1RZUEVfQlVGRkVSX1BPT0wpOworCitlbnVtIF9Hc3RWNGwyQnVmZmVyUG9vbEFjcXVpcmVGbGFncworeworICBHU1RfVjRMMl9CVUZGRVJfUE9PTF9BQ1FVSVJFX0ZMQUdfUkVTVVJSRUNUID0KKyAgICAgIEdTVF9CVUZGRVJfUE9PTF9BQ1FVSVJFX0ZMQUdfTEFTVCwKKyAgR1NUX1Y0TDJfQlVGRkVSX1BPT0xfQUNRVUlSRV9GTEFHX0xBU1QKK307CisKK3N0YXRpYyB2b2lkIGdzdF92NGwyX2J1ZmZlcl9wb29sX3JlbGVhc2VfYnVmZmVyIChHc3RCdWZmZXJQb29sICogYnBvb2wsCisgICAgR3N0QnVmZmVyICogYnVmZmVyKTsKKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl9pc19idWZmZXJfdmFsaWQgKEdzdEJ1ZmZlciAqIGJ1ZmZlciwgR3N0VjRsMk1lbW9yeUdyb3VwICoqIG91dF9ncm91cCkKK3sKKyAgR3N0TWVtb3J5ICptZW0gPSBnc3RfYnVmZmVyX3BlZWtfbWVtb3J5IChidWZmZXIsIDApOworICBnYm9vbGVhbiB2YWxpZCA9IEZBTFNFOworCisgIGlmIChHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19UQUdfTUVNT1JZKSkKKyAgICBnb3RvIGRvbmU7CisKKyAgaWYgKGdzdF9pc19kbWFidWZfbWVtb3J5IChtZW0pKQorICAgIG1lbSA9IGdzdF9taW5pX29iamVjdF9nZXRfcWRhdGEgKEdTVF9NSU5JX09CSkVDVCAobWVtKSwKKyAgICAgICAgR1NUX1Y0TDJfTUVNT1JZX1FVQVJLKTsKKworICBpZiAobWVtICYmIGdzdF9pc192NGwyX21lbW9yeSAobWVtKSkgeworICAgIEdzdFY0bDJNZW1vcnkgKnZtZW0gPSAoR3N0VjRsMk1lbW9yeSAqKSBtZW07CisgICAgR3N0VjRsMk1lbW9yeUdyb3VwICpncm91cCA9IHZtZW0tPmdyb3VwOworICAgIGdpbnQgaTsKKworICAgIGlmIChncm91cC0+bl9tZW0gIT0gZ3N0X2J1ZmZlcl9uX21lbW9yeSAoYnVmZmVyKSkKKyAgICAgIGdvdG8gZG9uZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBncm91cC0+bl9tZW07IGkrKykgeworICAgICAgaWYgKGdyb3VwLT5tZW1baV0gIT0gZ3N0X2J1ZmZlcl9wZWVrX21lbW9yeSAoYnVmZmVyLCBpKSkKKyAgICAgICAgZ290byBkb25lOworCisgICAgICBpZiAoIWdzdF9tZW1vcnlfaXNfd3JpdGFibGUgKGdyb3VwLT5tZW1baV0pKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgdmFsaWQgPSBUUlVFOworICAgIGlmIChvdXRfZ3JvdXApCisgICAgICAqb3V0X2dyb3VwID0gZ3JvdXA7CisgIH0KKworZG9uZToKKyAgcmV0dXJuIHZhbGlkOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfY29weV9idWZmZXIgKEdzdFY0bDJCdWZmZXJQb29sICogcG9vbCwgR3N0QnVmZmVyICogZGVzdCwKKyAgICBHc3RCdWZmZXIgKiBzcmMpCit7CisgIGNvbnN0IEdzdFZpZGVvRm9ybWF0SW5mbyAqZmluZm8gPSBwb29sLT5jYXBzX2luZm8uZmluZm87CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBvb2wsICJjb3B5aW5nIGJ1ZmZlciIpOworCisgIGlmIChmaW5mbyAmJiAoZmluZm8tPmZvcm1hdCAhPSBHU1RfVklERU9fRk9STUFUX1VOS05PV04gJiYKKyAgICAgICAgICBmaW5mby0+Zm9ybWF0ICE9IEdTVF9WSURFT19GT1JNQVRfRU5DT0RFRCkpIHsKKyAgICBHc3RWaWRlb0ZyYW1lIHNyY19mcmFtZSwgZGVzdF9mcmFtZTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBvb2wsICJjb3B5IHZpZGVvIGZyYW1lIik7CisKKyAgICAvKiB3ZSBoYXZlIHJhdyB2aWRlbywgdXNlIHZpZGVvZnJhbWUgY29weSB0byBnZXQgc3RyaWRlcyByaWdodCAqLworICAgIGlmICghZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJnNyY19mcmFtZSwgJnBvb2wtPmNhcHNfaW5mbywgc3JjLCBHU1RfTUFQX1JFQUQpKQorICAgICAgZ290byBpbnZhbGlkX2J1ZmZlcjsKKworICAgIGlmICghZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJmRlc3RfZnJhbWUsICZwb29sLT5jYXBzX2luZm8sIGRlc3QsCisgICAgICAgICAgICBHU1RfTUFQX1dSSVRFKSkgeworICAgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmc3JjX2ZyYW1lKTsKKyAgICAgIGdvdG8gaW52YWxpZF9idWZmZXI7CisgICAgfQorCisgICAgZ3N0X3ZpZGVvX2ZyYW1lX2NvcHkgKCZkZXN0X2ZyYW1lLCAmc3JjX2ZyYW1lKTsKKworICAgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJnNyY19mcmFtZSk7CisgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmZGVzdF9mcmFtZSk7CisgIH0gZWxzZSB7CisgICAgR3N0TWFwSW5mbyBtYXA7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwb29sLCAiY29weSByYXcgYnl0ZXMiKTsKKworICAgIGlmICghZ3N0X2J1ZmZlcl9tYXAgKHNyYywgJm1hcCwgR1NUX01BUF9SRUFEKSkKKyAgICAgIGdvdG8gaW52YWxpZF9idWZmZXI7CisKKyAgICBnc3RfYnVmZmVyX2ZpbGwgKGRlc3QsIDAsIG1hcC5kYXRhLCBnc3RfYnVmZmVyX2dldF9zaXplIChzcmMpKTsKKworICAgIGdzdF9idWZmZXJfdW5tYXAgKHNyYywgJm1hcCk7CisgICAgZ3N0X2J1ZmZlcl9yZXNpemUgKGRlc3QsIDAsIGdzdF9idWZmZXJfZ2V0X3NpemUgKHNyYykpOworICB9CisKKyAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKGRlc3QsIHNyYywKKyAgICAgIEdTVF9CVUZGRVJfQ09QWV9GTEFHUyB8IEdTVF9CVUZGRVJfQ09QWV9USU1FU1RBTVBTLCAwLCAtMSk7CisKKyAgR1NUX0NBVF9MT0dfT0JKRUNUIChDQVRfUEVSRk9STUFOQ0UsIHBvb2wsICJzbG93IGNvcHkgaW50byBidWZmZXIgJXAiLCBkZXN0KTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKK2ludmFsaWRfYnVmZmVyOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwgImNvdWxkIG5vdCBtYXAgYnVmZmVyIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0cnVjdCBVc2VyUHRyRGF0YQoreworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgZ2Jvb2xlYW4gaXNfZnJhbWU7CisgIEdzdFZpZGVvRnJhbWUgZnJhbWU7CisgIEdzdE1hcEluZm8gbWFwOworfTsKKworc3RhdGljIEdRdWFyaworZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfaW1wb3J0X3F1YXJrICh2b2lkKQoreworICBzdGF0aWMgR1F1YXJrIHF1YXJrID0gMDsKKworICBpZiAocXVhcmsgPT0gMCkKKyAgICBxdWFyayA9IGdfcXVhcmtfZnJvbV9zdHJpbmcgKCJHc3RWNGwyQnVmZmVyUG9vbFVzZVB0ckRhdGEiKTsKKworICByZXR1cm4gcXVhcms7Cit9CisKK3N0YXRpYyB2b2lkCitfdW5tYXBfdXNlcnB0cl9mcmFtZSAoc3RydWN0IFVzZXJQdHJEYXRhICpkYXRhKQoreworICBpZiAoZGF0YS0+aXNfZnJhbWUpCisgICAgZ3N0X3ZpZGVvX2ZyYW1lX3VubWFwICgmZGF0YS0+ZnJhbWUpOworICBlbHNlCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoZGF0YS0+YnVmZmVyLCAmZGF0YS0+bWFwKTsKKworICBpZiAoZGF0YS0+YnVmZmVyKQorICAgIGdzdF9idWZmZXJfdW5yZWYgKGRhdGEtPmJ1ZmZlcik7CisKKyAgZ19zbGljZV9mcmVlIChzdHJ1Y3QgVXNlclB0ckRhdGEsIGRhdGEpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfaW1wb3J0X3VzZXJwdHIgKEdzdFY0bDJCdWZmZXJQb29sICogcG9vbCwKKyAgICBHc3RCdWZmZXIgKiBkZXN0LCBHc3RCdWZmZXIgKiBzcmMpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdFY0bDJNZW1vcnlHcm91cCAqZ3JvdXAgPSBOVUxMOworICBHc3RNYXBGbGFncyBmbGFnczsKKyAgY29uc3QgR3N0VmlkZW9Gb3JtYXRJbmZvICpmaW5mbyA9IHBvb2wtPmNhcHNfaW5mby5maW5mbzsKKyAgc3RydWN0IFVzZXJQdHJEYXRhICpkYXRhID0gTlVMTDsKKworICBHU1RfTE9HX09CSkVDVCAocG9vbCwgImltcG9ydGluZyB1c2VycHRyIik7CisKKyAgLyogZ2V0IHRoZSBncm91cCAqLworICBpZiAoIWdzdF92NGwyX2lzX2J1ZmZlcl92YWxpZCAoZGVzdCwgJmdyb3VwKSkKKyAgICBnb3RvIG5vdF9vdXJfYnVmZmVyOworCisgIGlmIChWNEwyX1RZUEVfSVNfT1VUUFVUIChwb29sLT5vYmotPnR5cGUpKQorICAgIGZsYWdzID0gR1NUX01BUF9SRUFEOworICBlbHNlCisgICAgZmxhZ3MgPSBHU1RfTUFQX1dSSVRFOworCisgIGRhdGEgPSBnX3NsaWNlX25ldzAgKHN0cnVjdCBVc2VyUHRyRGF0YSk7CisKKyAgaWYgKGZpbmZvICYmIChmaW5mby0+Zm9ybWF0ICE9IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTiAmJgorICAgICAgICAgIGZpbmZvLT5mb3JtYXQgIT0gR1NUX1ZJREVPX0ZPUk1BVF9FTkNPREVEKSkgeworICAgIGdzaXplIHNpemVbR1NUX1ZJREVPX01BWF9QTEFORVNdID0geyAwLCB9OworICAgIGdpbnQgaTsKKworICAgIGRhdGEtPmlzX2ZyYW1lID0gVFJVRTsKKworICAgIGlmICghZ3N0X3ZpZGVvX2ZyYW1lX21hcCAoJmRhdGEtPmZyYW1lLCAmcG9vbC0+Y2Fwc19pbmZvLCBzcmMsIGZsYWdzKSkKKyAgICAgIGdvdG8gaW52YWxpZF9idWZmZXI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX05fUExBTkVTIChmaW5mbyk7IGkrKykgeworICAgICAgaWYgKEdTVF9WSURFT19GT1JNQVRfSU5GT19JU19USUxFRCAoZmluZm8pKSB7CisgICAgICAgIGdpbnQgdGluZm8gPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFICgmZGF0YS0+ZnJhbWUsIGkpOworICAgICAgICBnaW50IHBzdHJpZGU7CisgICAgICAgIGd1aW50IHBoZWlnaHQ7CisKKyAgICAgICAgcHN0cmlkZSA9IEdTVF9WSURFT19USUxFX1hfVElMRVMgKHRpbmZvKSA8PAorICAgICAgICAgICAgR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1RJTEVfV1MgKGZpbmZvKTsKKworICAgICAgICBwaGVpZ2h0ID0gR1NUX1ZJREVPX1RJTEVfWV9USUxFUyAodGluZm8pIDw8CisgICAgICAgICAgICBHU1RfVklERU9fRk9STUFUX0lORk9fVElMRV9IUyAoZmluZm8pOworCisgICAgICAgIHNpemVbaV0gPSBwc3RyaWRlICogcGhlaWdodDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVbaV0gPSBHU1RfVklERU9fRlJBTUVfUExBTkVfU1RSSURFICgmZGF0YS0+ZnJhbWUsIGkpICoKKyAgICAgICAgICAgIEdTVF9WSURFT19GUkFNRV9DT01QX0hFSUdIVCAoJmRhdGEtPmZyYW1lLCBpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJbiB0aGUgc2luZ2xlIHBsYW5hciBBUEksIHBsYW5lcyBtdXN0IGJlIGNvbnRpZ3VvdXMgaW4gbWVtb3J5IGFuZAorICAgICAqIHRoZXJlZm9yZSB0aGV5IG11c3QgaGF2ZSBleHBlY3RlZCBzaXplLiBpZTogbm8gcGFkZGluZy4KKyAgICAgKiBUbyBjaGVjayB0aGVzZSBjb25kaXRpb25zLCB3ZSBjaGVjayB0aGF0IHBsYW5lICdpJyBzdGFydCBhZGRyZXNzCisgICAgICogKyBwbGFuZSAnaScgc2l6ZSBlcXVhbHMgdG8gcGxhbmUgJ2krMScgc3RhcnQgYWRkcmVzcyAqLworICAgIGlmICghVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSIChwb29sLT5vYmotPnR5cGUpKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgKEdTVF9WSURFT19GT1JNQVRfSU5GT19OX1BMQU5FUyAoZmluZm8pIC0gMSk7IGkrKykgeworICAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXhfZm10ID0gJnBvb2wtPm9iai0+Zm9ybWF0LmZtdC5waXg7CisgICAgICAgIGdwb2ludGVyIHRtcDsKKyAgICAgICAgZ2ludCBlc3RyaWRlID0gZ3N0X3Y0bDJfb2JqZWN0X2V4dHJhcG9sYXRlX3N0cmlkZSAoZmluZm8sIGksCisgICAgICAgICAgICBwaXhfZm10LT5ieXRlc3BlcmxpbmUpOworICAgICAgICBndWludCBlaGVpZ2h0ID0gR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX0hFSUdIVCAoZmluZm8sIGksCisgICAgICAgICAgICBwaXhfZm10LT5oZWlnaHQpOworCisgICAgICAgIHRtcCA9ICgoZ3VpbnQ4ICopIGRhdGEtPmZyYW1lLmRhdGFbaV0pICsgZXN0cmlkZSAqIGVoZWlnaHQ7CisgICAgICAgIGlmICh0bXAgIT0gZGF0YS0+ZnJhbWUuZGF0YVtpICsgMV0pCisgICAgICAgICAgZ290byBub25fY29udGlndW91c19tZW07CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFnc3RfdjRsMl9hbGxvY2F0b3JfaW1wb3J0X3VzZXJwdHIgKHBvb2wtPnZhbGxvY2F0b3IsIGdyb3VwLAorICAgICAgICAgICAgZGF0YS0+ZnJhbWUuaW5mby5zaXplLCBmaW5mby0+bl9wbGFuZXMsIGRhdGEtPmZyYW1lLmRhdGEsIHNpemUpKQorICAgICAgZ290byBpbXBvcnRfZmFpbGVkOworICB9IGVsc2UgeworICAgIGdwb2ludGVyIHB0clsxXTsKKyAgICBnc2l6ZSBzaXplWzFdOworCisgICAgZGF0YS0+aXNfZnJhbWUgPSBGQUxTRTsKKworICAgIGlmICghZ3N0X2J1ZmZlcl9tYXAgKHNyYywgJmRhdGEtPm1hcCwgZmxhZ3MpKQorICAgICAgZ290byBpbnZhbGlkX2J1ZmZlcjsKKworICAgIHB0clswXSA9IGRhdGEtPm1hcC5kYXRhOworICAgIHNpemVbMF0gPSBkYXRhLT5tYXAuc2l6ZTsKKworICAgIGlmICghZ3N0X3Y0bDJfYWxsb2NhdG9yX2ltcG9ydF91c2VycHRyIChwb29sLT52YWxsb2NhdG9yLCBncm91cCwKKyAgICAgICAgICAgIGRhdGEtPm1hcC5zaXplLCAxLCBwdHIsIHNpemUpKQorICAgICAgZ290byBpbXBvcnRfZmFpbGVkOworICB9CisKKyAgZGF0YS0+YnVmZmVyID0gZ3N0X2J1ZmZlcl9yZWYgKHNyYyk7CisKKyAgZ3N0X21pbmlfb2JqZWN0X3NldF9xZGF0YSAoR1NUX01JTklfT0JKRUNUIChkZXN0KSwgR1NUX1Y0TDJfSU1QT1JUX1FVQVJLLAorICAgICAgZGF0YSwgKEdEZXN0cm95Tm90aWZ5KSBfdW5tYXBfdXNlcnB0cl9mcmFtZSk7CisKKyAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKGRlc3QsIHNyYywKKyAgICAgIEdTVF9CVUZGRVJfQ09QWV9GTEFHUyB8IEdTVF9CVUZGRVJfQ09QWV9USU1FU1RBTVBTLCAwLCAtMSk7CisKKyAgcmV0dXJuIHJldDsKKworbm90X291cl9idWZmZXI6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwb29sLCAiZGVzdGluYXRpb24gYnVmZmVyIGludmFsaWQgb3Igbm90IGZyb20gb3VyIHBvb2wiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2ludmFsaWRfYnVmZmVyOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwgImNvdWxkIG5vdCBtYXAgYnVmZmVyIik7CisgICAgZ19zbGljZV9mcmVlIChzdHJ1Y3QgVXNlclB0ckRhdGEsIGRhdGEpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorbm9uX2NvbnRpZ3VvdXNfbWVtOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwgIm1lbW9yeSBpcyBub3QgY29udGlndW91cyBvciBwbGFuZSBzaXplIG1pc21hdGNoIik7CisgICAgX3VubWFwX3VzZXJwdHJfZnJhbWUgKGRhdGEpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQoraW1wb3J0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBvb2wsICJmYWlsZWQgdG8gaW1wb3J0IGRhdGEiKTsKKyAgICBfdW5tYXBfdXNlcnB0cl9mcmFtZSAoZGF0YSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdjRsMl9idWZmZXJfcG9vbF9pbXBvcnRfZG1hYnVmIChHc3RWNGwyQnVmZmVyUG9vbCAqIHBvb2wsCisgICAgR3N0QnVmZmVyICogZGVzdCwgR3N0QnVmZmVyICogc3JjKQoreworICBHc3RWNGwyTWVtb3J5R3JvdXAgKmdyb3VwID0gTlVMTDsKKyAgR3N0TWVtb3J5ICpkbWFfbWVtW0dTVF9WSURFT19NQVhfUExBTkVTXSA9IHsgMCB9OworICBndWludCBuX21lbSA9IGdzdF9idWZmZXJfbl9tZW1vcnkgKHNyYyk7CisgIGdpbnQgaTsKKworICBHU1RfTE9HX09CSkVDVCAocG9vbCwgImltcG9ydGluZyBkbWFidWYiKTsKKworICBpZiAoIWdzdF92NGwyX2lzX2J1ZmZlcl92YWxpZCAoZGVzdCwgJmdyb3VwKSkKKyAgICBnb3RvIG5vdF9vdXJfYnVmZmVyOworCisgIGlmIChuX21lbSA+IEdTVF9WSURFT19NQVhfUExBTkVTKQorICAgIGdvdG8gdG9vX21hbnlfbWVtczsKKworICBmb3IgKGkgPSAwOyBpIDwgbl9tZW07IGkrKykKKyAgICBkbWFfbWVtW2ldID0gZ3N0X2J1ZmZlcl9wZWVrX21lbW9yeSAoc3JjLCBpKTsKKworICBpZiAoIWdzdF92NGwyX2FsbG9jYXRvcl9pbXBvcnRfZG1hYnVmIChwb29sLT52YWxsb2NhdG9yLCBncm91cCwgbl9tZW0sCisgICAgICAgICAgZG1hX21lbSkpCisgICAgZ290byBpbXBvcnRfZmFpbGVkOworCisgIGdzdF9taW5pX29iamVjdF9zZXRfcWRhdGEgKEdTVF9NSU5JX09CSkVDVCAoZGVzdCksIEdTVF9WNEwyX0lNUE9SVF9RVUFSSywKKyAgICAgIGdzdF9idWZmZXJfcmVmIChzcmMpLCAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9idWZmZXJfdW5yZWYpOworCisgIGdzdF9idWZmZXJfY29weV9pbnRvIChkZXN0LCBzcmMsCisgICAgICBHU1RfQlVGRkVSX0NPUFlfRkxBR1MgfCBHU1RfQlVGRkVSX0NPUFlfVElNRVNUQU1QUywgMCwgLTEpOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKKworbm90X291cl9idWZmZXI6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwb29sLCAiZGVzdGluYXRpb24gYnVmZmVyIGludmFsaWQgb3Igbm90IGZyb20gb3VyIHBvb2wiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK3Rvb19tYW55X21lbXM6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwb29sLCAiY291bGQgbm90IG1hcCBidWZmZXIiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK2ltcG9ydF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwb29sLCAiZmFpbGVkIHRvIGltcG9ydCBkbWFidWYiKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92NGwyX2J1ZmZlcl9wb29sX3ByZXBhcmVfYnVmZmVyIChHc3RWNGwyQnVmZmVyUG9vbCAqIHBvb2wsCisgICAgR3N0QnVmZmVyICogZGVzdCwgR3N0QnVmZmVyICogc3JjKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBnYm9vbGVhbiBvd25fc3JjID0gRkFMU0U7CisKKyAgaWYgKHNyYyA9PSBOVUxMKSB7CisgICAgaWYgKHBvb2wtPm90aGVyX3Bvb2wgPT0gTlVMTCkgeworICAgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwgImNhbid0IHByZXBhcmUgYnVmZmVyLCBzb3VyY2UgYnVmZmVyIG1pc3NpbmciKTsKKyAgICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgICB9CisKKyAgICByZXQgPSBnc3RfYnVmZmVyX3Bvb2xfYWNxdWlyZV9idWZmZXIgKHBvb2wtPm90aGVyX3Bvb2wsICZzcmMsIE5VTEwpOworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spIHsKKyAgICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBvb2wsICJmYWlsZWQgdG8gYWNxdWlyZSBidWZmZXIgZnJvbSBkb3duc3RyZWFtIHBvb2wiKTsKKyAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBvd25fc3JjID0gVFJVRTsKKyAgfQorCisgIHN3aXRjaCAocG9vbC0+b2JqLT5tb2RlKSB7CisgICAgY2FzZSBHU1RfVjRMMl9JT19NTUFQOgorICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGOgorICAgICAgcmV0ID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfY29weV9idWZmZXIgKHBvb2wsIGRlc3QsIHNyYyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WNEwyX0lPX1VTRVJQVFI6CisgICAgICByZXQgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9pbXBvcnRfdXNlcnB0ciAocG9vbCwgZGVzdCwgc3JjKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGX0lNUE9SVDoKKyAgICAgIHJldCA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX2ltcG9ydF9kbWFidWYgKHBvb2wsIGRlc3QsIHNyYyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAob3duX3NyYykKKyAgICBnc3RfYnVmZmVyX3VucmVmIChzcmMpOworCitkb25lOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfYWxsb2NfYnVmZmVyIChHc3RCdWZmZXJQb29sICogYnBvb2wsIEdzdEJ1ZmZlciAqKiBidWZmZXIsCisgICAgR3N0QnVmZmVyUG9vbEFjcXVpcmVQYXJhbXMgKiBwYXJhbXMpCit7CisgIEdzdFY0bDJCdWZmZXJQb29sICpwb29sID0gR1NUX1Y0TDJfQlVGRkVSX1BPT0wgKGJwb29sKTsKKyAgR3N0VjRsMk1lbW9yeUdyb3VwICpncm91cCA9IE5VTEw7CisgIEdzdEJ1ZmZlciAqbmV3YnVmID0gTlVMTDsKKyAgR3N0VjRsMk9iamVjdCAqb2JqOworICBHc3RWaWRlb0luZm8gKmluZm87CisKKyAgb2JqID0gcG9vbC0+b2JqOworICBpbmZvID0gJm9iai0+aW5mbzsKKworICBzd2l0Y2ggKG9iai0+bW9kZSkgeworICAgIGNhc2UgR1NUX1Y0TDJfSU9fUlc6CisgICAgICBuZXdidWYgPQorICAgICAgICAgIGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChwb29sLT5hbGxvY2F0b3IsIHBvb2wtPnNpemUsICZwb29sLT5wYXJhbXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVjRMMl9JT19NTUFQOgorICAgICAgZ3JvdXAgPSBnc3RfdjRsMl9hbGxvY2F0b3JfYWxsb2NfbW1hcCAocG9vbC0+dmFsbG9jYXRvcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WNEwyX0lPX0RNQUJVRjoKKyAgICAgIGdyb3VwID0gZ3N0X3Y0bDJfYWxsb2NhdG9yX2FsbG9jX2RtYWJ1ZiAocG9vbC0+dmFsbG9jYXRvciwKKyAgICAgICAgICBwb29sLT5hbGxvY2F0b3IpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVjRMMl9JT19VU0VSUFRSOgorICAgICAgZ3JvdXAgPSBnc3RfdjRsMl9hbGxvY2F0b3JfYWxsb2NfdXNlcnB0ciAocG9vbC0+dmFsbG9jYXRvcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WNEwyX0lPX0RNQUJVRl9JTVBPUlQ6CisgICAgICBncm91cCA9IGdzdF92NGwyX2FsbG9jYXRvcl9hbGxvY19kbWFidWZpbiAocG9vbC0+dmFsbG9jYXRvcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbmV3YnVmID0gTlVMTDsKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoZ3JvdXAgIT0gTlVMTCkgeworICAgIGdpbnQgaTsKKyAgICBuZXdidWYgPSBnc3RfYnVmZmVyX25ldyAoKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBncm91cC0+bl9tZW07IGkrKykKKyAgICAgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAobmV3YnVmLCBncm91cC0+bWVtW2ldKTsKKyAgfSBlbHNlIGlmIChuZXdidWYgPT0gTlVMTCkgeworICAgIGdvdG8gYWxsb2NhdGlvbl9mYWlsZWQ7CisgIH0KKworICAvKiBhZGQgbWV0YWRhdGEgdG8gcmF3IHZpZGVvIGJ1ZmZlcnMgKi8KKyAgaWYgKHBvb2wtPmFkZF92aWRlb21ldGEpCisgICAgZ3N0X2J1ZmZlcl9hZGRfdmlkZW9fbWV0YV9mdWxsIChuZXdidWYsIEdTVF9WSURFT19GUkFNRV9GTEFHX05PTkUsCisgICAgICAgIEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoaW5mbyksIEdTVF9WSURFT19JTkZPX1dJRFRIIChpbmZvKSwKKyAgICAgICAgR1NUX1ZJREVPX0lORk9fSEVJR0hUIChpbmZvKSwgR1NUX1ZJREVPX0lORk9fTl9QTEFORVMgKGluZm8pLAorICAgICAgICBpbmZvLT5vZmZzZXQsIGluZm8tPnN0cmlkZSk7CisKKyAgKmJ1ZmZlciA9IG5ld2J1ZjsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCithbGxvY2F0aW9uX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBvb2wsICJmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfc2V0X2NvbmZpZyAoR3N0QnVmZmVyUG9vbCAqIGJwb29sLCBHc3RTdHJ1Y3R1cmUgKiBjb25maWcpCit7CisgIEdzdFY0bDJCdWZmZXJQb29sICpwb29sID0gR1NUX1Y0TDJfQlVGRkVSX1BPT0wgKGJwb29sKTsKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gcG9vbC0+b2JqOworICBHc3RDYXBzICpjYXBzOworICBndWludCBzaXplLCBtaW5fYnVmZmVycywgbWF4X2J1ZmZlcnM7CisgIEdzdEFsbG9jYXRvciAqYWxsb2NhdG9yOworICBHc3RBbGxvY2F0aW9uUGFyYW1zIHBhcmFtczsKKyAgZ2Jvb2xlYW4gY2FuX2FsbG9jYXRlID0gRkFMU0U7CisgIGdib29sZWFuIHVwZGF0ZWQgPSBGQUxTRTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIHBvb2wtPmFkZF92aWRlb21ldGEgPQorICAgICAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19oYXNfb3B0aW9uIChjb25maWcsCisgICAgICBHU1RfQlVGRkVSX1BPT0xfT1BUSU9OX1ZJREVPX01FVEEpOworCisgIC8qIHBhcnNlIHRoZSBjb25maWcgYW5kIGtlZXAgYXJvdW5kICovCisgIGlmICghZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19nZXRfcGFyYW1zIChjb25maWcsICZjYXBzLCAmc2l6ZSwgJm1pbl9idWZmZXJzLAorICAgICAgICAgICZtYXhfYnVmZmVycykpCisgICAgZ290byB3cm9uZ19jb25maWc7CisKKyAgaWYgKCFnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX2dldF9hbGxvY2F0b3IgKGNvbmZpZywgJmFsbG9jYXRvciwgJnBhcmFtcykpCisgICAgZ290byB3cm9uZ19jb25maWc7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocG9vbCwgImNvbmZpZyAlIiBHU1RfUFRSX0ZPUk1BVCwgY29uZmlnKTsKKworICBpZiAocG9vbC0+YWxsb2NhdG9yKQorICAgIGdzdF9vYmplY3RfdW5yZWYgKHBvb2wtPmFsbG9jYXRvcik7CisgIHBvb2wtPmFsbG9jYXRvciA9IE5VTEw7CisKKyAgc3dpdGNoIChvYmotPm1vZGUpIHsKKyAgICBjYXNlIEdTVF9WNEwyX0lPX0RNQUJVRjoKKyAgICAgIHBvb2wtPmFsbG9jYXRvciA9IGdzdF9kbWFidWZfYWxsb2NhdG9yX25ldyAoKTsKKyAgICAgIGNhbl9hbGxvY2F0ZSA9IEdTVF9WNEwyX0FMTE9DQVRPUl9DQU5fQUxMT0NBVEUgKHBvb2wtPnZhbGxvY2F0b3IsIE1NQVApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVjRMMl9JT19NTUFQOgorICAgICAgY2FuX2FsbG9jYXRlID0gR1NUX1Y0TDJfQUxMT0NBVE9SX0NBTl9BTExPQ0FURSAocG9vbC0+dmFsbG9jYXRvciwgTU1BUCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9WNEwyX0lPX1VTRVJQVFI6CisgICAgICBjYW5fYWxsb2NhdGUgPQorICAgICAgICAgIEdTVF9WNEwyX0FMTE9DQVRPUl9DQU5fQUxMT0NBVEUgKHBvb2wtPnZhbGxvY2F0b3IsIFVTRVJQVFIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVjRMMl9JT19ETUFCVUZfSU1QT1JUOgorICAgICAgY2FuX2FsbG9jYXRlID0gR1NUX1Y0TDJfQUxMT0NBVE9SX0NBTl9BTExPQ0FURSAocG9vbC0+dmFsbG9jYXRvciwgRE1BQlVGKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1Y0TDJfSU9fUlc6CisgICAgICBpZiAoYWxsb2NhdG9yKQorICAgICAgICBwb29sLT5hbGxvY2F0b3IgPSBnX29iamVjdF9yZWYgKGFsbG9jYXRvcik7CisgICAgICBwb29sLT5wYXJhbXMgPSBwYXJhbXM7CisgICAgICAvKiBObyBuZWVkIHRvIGNoYW5nZSB0aGUgY29uZmlndXJhdGlvbiAqLworICAgICAgZ290byBkb25lOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgYnJlYWs7CisgIH0KKworICAvKiBsaWJ2NGwyIGNvbnZlcnNpb24gY29kZSBkb2VzIG5vdCBoYW5kbGUgQ1JFQVRFX0JVRlMsIGFuZCBtYXkgbGVhZCB0bworICAgKiBpbnN0YWJpbGl0eSBhbmQgY3Jhc2gsIGRpc2FibGUgaXQgZm9yIG5vdyAqLworICBpZiAoY2FuX2FsbG9jYXRlICYmIG9iai0+Zm10ZGVzYy0+ZmxhZ3MgJiBWNEwyX0ZNVF9GTEFHX0VNVUxBVEVEKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwb29sLAorICAgICAgICAibGlidjRsMiBjb252ZXJ0ZXIgZGV0ZWN0ZWQsIGRpc2FibGluZyBDUkVBVEVfQlVGUyIpOworICAgIGNhbl9hbGxvY2F0ZSA9IEZBTFNFOworICAgIEdTVF9PQkpFQ1RfRkxBR19VTlNFVCAocG9vbC0+dmFsbG9jYXRvciwKKyAgICAgICAgR1NUX1Y0TDJfQUxMT0NBVE9SX0ZMQUdfTU1BUF9DUkVBVEVfQlVGUworICAgICAgICB8IEdTVF9WNEwyX0FMTE9DQVRPUl9GTEFHX1VTRVJQVFJfQ1JFQVRFX0JVRlMKKyAgICAgICAgfCBHU1RfVjRMMl9BTExPQ0FUT1JfRkxBR19ETUFCVUZfQ1JFQVRFX0JVRlMpOworICB9CisKKyAgaWYgKG1pbl9idWZmZXJzIDwgR1NUX1Y0TDJfTUlOX0JVRkZFUlMpIHsKKyAgICB1cGRhdGVkID0gVFJVRTsKKyAgICBtaW5fYnVmZmVycyA9IEdTVF9WNEwyX01JTl9CVUZGRVJTOworICAgIEdTVF9JTkZPX09CSkVDVCAocG9vbCwgImluY3JlYXNpbmcgbWluaW11bSBidWZmZXJzIHRvICV1IiwgbWluX2J1ZmZlcnMpOworICB9CisKKyAgLyogcmVzcGVjdCBkcml2ZXIgcmVxdWlyZW1lbnRzICovCisgIGlmIChtaW5fYnVmZmVycyA8IG9iai0+bWluX2J1ZmZlcnMpIHsKKyAgICB1cGRhdGVkID0gVFJVRTsKKyAgICBtaW5fYnVmZmVycyA9IG9iai0+bWluX2J1ZmZlcnM7CisgICAgR1NUX0lORk9fT0JKRUNUIChwb29sLCAiaW5jcmVhc2luZyBtaW5pbXVtIGJ1ZmZlcnMgdG8gJXUiLCBtaW5fYnVmZmVycyk7CisgIH0KKworICBpZiAobWF4X2J1ZmZlcnMgPiBWSURFT19NQVhfRlJBTUUgfHwgbWF4X2J1ZmZlcnMgPT0gMCkgeworICAgIHVwZGF0ZWQgPSBUUlVFOworICAgIG1heF9idWZmZXJzID0gVklERU9fTUFYX0ZSQU1FOworICAgIEdTVF9JTkZPX09CSkVDVCAocG9vbCwgInJlZHVjaW5nIG1heGltdW0gYnVmZmVycyB0byAldSIsIG1heF9idWZmZXJzKTsKKyAgfQorCisgIGlmIChtaW5fYnVmZmVycyA+IG1heF9idWZmZXJzKSB7CisgICAgdXBkYXRlZCA9IFRSVUU7CisgICAgbWluX2J1ZmZlcnMgPSBtYXhfYnVmZmVyczsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHBvb2wsICJyZWR1Y2luZyBtaW5pbXVtIGJ1ZmZlcnMgdG8gJXUiLCBtaW5fYnVmZmVycyk7CisgIH0gZWxzZSBpZiAobWluX2J1ZmZlcnMgIT0gbWF4X2J1ZmZlcnMpIHsKKyAgICBpZiAoIWNhbl9hbGxvY2F0ZSkgeworICAgICAgdXBkYXRlZCA9IFRSVUU7CisgICAgICBtYXhfYnVmZmVycyA9IG1pbl9idWZmZXJzOworICAgICAgR1NUX0lORk9fT0JKRUNUIChwb29sLCAiY2FuJ3QgYWxsb2NhdGUsIHNldHRpbmcgbWF4aW11bSB0byBtaW5pbXVtIik7CisgICAgfQorICB9CisKKyAgaWYgKCFwb29sLT5hZGRfdmlkZW9tZXRhICYmIG9iai0+bmVlZF92aWRlb19tZXRhKSB7CisgICAgR1NUX0lORk9fT0JKRUNUIChwb29sLCAiYWRkaW5nIG5lZWRlZCB2aWRlbyBtZXRhIik7CisgICAgdXBkYXRlZCA9IFRSVUU7CisgICAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19hZGRfb3B0aW9uIChjb25maWcsCisgICAgICAgIEdTVF9CVUZGRVJfUE9PTF9PUFRJT05fVklERU9fTUVUQSk7CisgIH0KKworICAvKiBBbHdheXMgdXBkYXRlIHRoZSBjb25maWcgdG8gZW5zdXJlIHRoZSBjb25maWd1cmVkIHNpemUgbWF0Y2hlcyAqLworICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX3NldF9wYXJhbXMgKGNvbmZpZywgY2Fwcywgb2JqLT5pbmZvLnNpemUsIG1pbl9idWZmZXJzLAorICAgICAgbWF4X2J1ZmZlcnMpOworCisgIC8qIGtlZXAgYSBHc3RWaWRlb0luZm8gd2l0aCBkZWZhdWx0cyBmb3IgdGhlIHdoZW4gd2UgbmVlZCB0byBjb3B5ICovCisgIGdzdF92aWRlb19pbmZvX2Zyb21fY2FwcyAoJnBvb2wtPmNhcHNfaW5mbywgY2Fwcyk7CisKK2RvbmU6CisgIHJldCA9IEdTVF9CVUZGRVJfUE9PTF9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2V0X2NvbmZpZyAoYnBvb2wsIGNvbmZpZyk7CisKKyAgLyogSWYgYW55dGhpbmcgd2FzIGNoYW5nZWQgZG9jdW1lbnRhdGlvbiByZWNvbW1hbmQgdG8gcmV0dXJuIEZBTFNFICovCisgIHJldHVybiAhdXBkYXRlZCAmJiByZXQ7CisKKyAgLyogRVJST1JTICovCit3cm9uZ19jb25maWc6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwb29sLCAiaW52YWxpZCBjb25maWcgJSIgR1NUX1BUUl9GT1JNQVQsIGNvbmZpZyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdjRsMl9idWZmZXJfcG9vbF9yZXN1cmVjdF9idWZmZXIgKEdzdFY0bDJCdWZmZXJQb29sICogcG9vbCkKK3sKKyAgR3N0QnVmZmVyUG9vbEFjcXVpcmVQYXJhbXMgcGFyYW1zID0geyAwIH07CisgIEdzdEJ1ZmZlciAqYnVmZmVyID0gTlVMTDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocG9vbCwgIkEgYnVmZmVyIHdhcyBsb3N0LCByZWFsbG9jYXRpbmcgaXQiKTsKKworICAvKiBibG9jayByZWN1cnNpdmUgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiAqLworICBnX3NpZ25hbF9oYW5kbGVyX2Jsb2NrIChwb29sLT52YWxsb2NhdG9yLCBwb29sLT5ncm91cF9yZWxlYXNlZF9oYW5kbGVyKTsKKworICBwYXJhbXMuZmxhZ3MgPQorICAgICAgKEdzdEJ1ZmZlclBvb2xBY3F1aXJlRmxhZ3MpIEdTVF9WNEwyX0JVRkZFUl9QT09MX0FDUVVJUkVfRkxBR19SRVNVUlJFQ1QgfAorICAgICAgR1NUX0JVRkZFUl9QT09MX0FDUVVJUkVfRkxBR19ET05UV0FJVDsKKyAgcmV0ID0KKyAgICAgIGdzdF9idWZmZXJfcG9vbF9hY3F1aXJlX2J1ZmZlciAoR1NUX0JVRkZFUl9QT09MIChwb29sKSwgJmJ1ZmZlciwgJnBhcmFtcyk7CisKKyAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIGdfc2lnbmFsX2hhbmRsZXJfdW5ibG9jayAocG9vbC0+dmFsbG9jYXRvciwgcG9vbC0+Z3JvdXBfcmVsZWFzZWRfaGFuZGxlcik7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl9idWZmZXJfcG9vbF9zdHJlYW1vbiAoR3N0VjRsMkJ1ZmZlclBvb2wgKiBwb29sKQoreworICBHc3RWNGwyT2JqZWN0ICpvYmogPSBwb29sLT5vYmo7CisKKyAgaWYgKHBvb2wtPnN0cmVhbWluZykKKyAgICByZXR1cm4gVFJVRTsKKworICBzd2l0Y2ggKG9iai0+bW9kZSkgeworICAgIGNhc2UgR1NUX1Y0TDJfSU9fTU1BUDoKKyAgICBjYXNlIEdTVF9WNEwyX0lPX1VTRVJQVFI6CisgICAgY2FzZSBHU1RfVjRMMl9JT19ETUFCVUY6CisgICAgY2FzZSBHU1RfVjRMMl9JT19ETUFCVUZfSU1QT1JUOgorICAgICAgaWYgKCFWNEwyX1RZUEVfSVNfT1VUUFVUIChwb29sLT5vYmotPnR5cGUpKSB7CisgICAgICAgIC8qIEZvciBjYXB0dXJlcywgd2UgbmVlZCB0byBlbnF1ZXVlIGJ1ZmZlcnMgYmVmb3JlIHdlIHN0YXJ0IHN0cmVhbWluZywKKyAgICAgICAgICogc28gdGhlIGRyaXZlciBkb24ndCB1bmRlcmZsb3cgaW1tZWRpYXRseS4gQXMgd2UgaGF2ZSBwdXQgdGhlbiBiYWNrCisgICAgICAgICAqIGludG8gdGhlIGJhc2UgY2xhc3MgcXVldWUsIHJlc3VyZWN0IHRoZW0sIHRoZW4gcmVsZWFzaW5nIHdpbGwgcXVldWUKKyAgICAgICAgICogdGhlbSBiYWNrLiAqLworICAgICAgICB3aGlsZSAoZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcmVzdXJlY3RfYnVmZmVyIChwb29sKSA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKG9iai0+aW9jdGwgKHBvb2wtPnZpZGVvX2ZkLCBWSURJT0NfU1RSRUFNT04sICZvYmotPnR5cGUpIDwgMCkKKyAgICAgICAgZ290byBzdHJlYW1vbl9mYWlsZWQ7CisKKyAgICAgIHBvb2wtPnN0cmVhbWluZyA9IFRSVUU7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBvb2wsICJTdGFydGVkIHN0cmVhbWluZyIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKK3N0cmVhbW9uX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBvb2wsICJlcnJvciB3aXRoIFNUUkVBTU9OICVkICglcykiLCBlcnJubywKKyAgICAgICAgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogQ2FsbCB3aXRoIHN0cmVhbWxvY2sgaGVsZCwgb3Igd2hlbiBzdHJlYW1pbmcgdGhyZWFkcyBhcmUgZG93biAqLworc3RhdGljIHZvaWQKK2dzdF92NGwyX2J1ZmZlcl9wb29sX3N0cmVhbW9mZiAoR3N0VjRsMkJ1ZmZlclBvb2wgKiBwb29sKQoreworICBHc3RCdWZmZXJQb29sQ2xhc3MgKnBjbGFzcyA9IEdTVF9CVUZGRVJfUE9PTF9DTEFTUyAocGFyZW50X2NsYXNzKTsKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gcG9vbC0+b2JqOworICBnaW50IGk7CisKKyAgaWYgKCFwb29sLT5zdHJlYW1pbmcpCisgICAgcmV0dXJuOworCisgIHN3aXRjaCAob2JqLT5tb2RlKSB7CisgICAgY2FzZSBHU1RfVjRMMl9JT19NTUFQOgorICAgIGNhc2UgR1NUX1Y0TDJfSU9fVVNFUlBUUjoKKyAgICBjYXNlIEdTVF9WNEwyX0lPX0RNQUJVRjoKKyAgICBjYXNlIEdTVF9WNEwyX0lPX0RNQUJVRl9JTVBPUlQ6CisKKyAgICAgIGlmIChvYmotPmlvY3RsIChwb29sLT52aWRlb19mZCwgVklESU9DX1NUUkVBTU9GRiwgJm9iai0+dHlwZSkgPCAwKQorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBvb2wsICJTVFJFQU1PRkYgZmFpbGVkIHdpdGggZXJybm8gJWQgKCVzKSIsCisgICAgICAgICAgICBlcnJubywgZ19zdHJlcnJvciAoZXJybm8pKTsKKworICAgICAgcG9vbC0+c3RyZWFtaW5nID0gRkFMU0U7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBvb2wsICJTdG9wcGVkIHN0cmVhbWluZyIpOworCisgICAgICBpZiAocG9vbC0+dmFsbG9jYXRvcikKKyAgICAgICAgZ3N0X3Y0bDJfYWxsb2NhdG9yX2ZsdXNoIChwb29sLT52YWxsb2NhdG9yKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBWSURFT19NQVhfRlJBTUU7IGkrKykgeworICAgIGlmIChwb29sLT5idWZmZXJzW2ldKSB7CisgICAgICBHc3RCdWZmZXIgKmJ1ZmZlciA9IHBvb2wtPmJ1ZmZlcnNbaV07CisgICAgICBHc3RCdWZmZXJQb29sICpicG9vbCA9IEdTVF9CVUZGRVJfUE9PTCAocG9vbCk7CisKKyAgICAgIHBvb2wtPmJ1ZmZlcnNbaV0gPSBOVUxMOworCisgICAgICBpZiAoVjRMMl9UWVBFX0lTX09VVFBVVCAocG9vbC0+b2JqLT50eXBlKSkKKyAgICAgICAgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcmVsZWFzZV9idWZmZXIgKGJwb29sLCBidWZmZXIpOworICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAvKiBEb24ndCByZS1lbnF1ZXVlIGNhcHR1cmUgYnVmZmVyIG9uIHN0b3AgKi8KKyAgICAgICAgcGNsYXNzLT5yZWxlYXNlX2J1ZmZlciAoYnBvb2wsIGJ1ZmZlcik7CisKKyAgICAgIGdfYXRvbWljX2ludF9hZGQgKCZwb29sLT5udW1fcXVldWVkLCAtMSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfc3RhcnQgKEdzdEJ1ZmZlclBvb2wgKiBicG9vbCkKK3sKKyAgR3N0VjRsMkJ1ZmZlclBvb2wgKnBvb2wgPSBHU1RfVjRMMl9CVUZGRVJfUE9PTCAoYnBvb2wpOworICBHc3RCdWZmZXJQb29sQ2xhc3MgKnBjbGFzcyA9IEdTVF9CVUZGRVJfUE9PTF9DTEFTUyAocGFyZW50X2NsYXNzKTsKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gcG9vbC0+b2JqOworICBHc3RTdHJ1Y3R1cmUgKmNvbmZpZzsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ3VpbnQgc2l6ZSwgbWluX2J1ZmZlcnMsIG1heF9idWZmZXJzOworICBndWludCBtYXhfbGF0ZW5jeSwgbWluX2xhdGVuY3ksIGNvcHlfdGhyZXNob2xkID0gMDsKKyAgZ2Jvb2xlYW4gY2FuX2FsbG9jYXRlID0gRkFMU0UsIHJldCA9IFRSVUU7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocG9vbCwgImFjdGl2YXRpbmcgcG9vbCIpOworCisgIGNvbmZpZyA9IGdzdF9idWZmZXJfcG9vbF9nZXRfY29uZmlnIChicG9vbCk7CisgIGlmICghZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19nZXRfcGFyYW1zIChjb25maWcsICZjYXBzLCAmc2l6ZSwgJm1pbl9idWZmZXJzLAorICAgICAgICAgICZtYXhfYnVmZmVycykpCisgICAgZ290byB3cm9uZ19jb25maWc7CisKKyAgbWluX2xhdGVuY3kgPSBNQVggKEdTVF9WNEwyX01JTl9CVUZGRVJTLCBvYmotPm1pbl9idWZmZXJzKTsKKworICBzd2l0Y2ggKG9iai0+bW9kZSkgeworICAgIGNhc2UgR1NUX1Y0TDJfSU9fUlc6CisgICAgICBjYW5fYWxsb2NhdGUgPSBUUlVFOworI2lmZGVmIEhBVkVfTElCVjRMMgorICAgICAgLyogVGhpcyB3b3JrYXJvdW5kIGEgdW5maXhhYmxlIGJ1ZyBpbiBsaWJ2NGwyIHdoZW4gUlcgaXMgZW11bGF0ZWQgb24gdG9wCisgICAgICAgKiBvZiBNTUFQLiBJbiB0aGlzIGNhc2UsIHRoZSBmaXJzdCByZWFkIGluaXRpYWxpemUgdGhlIHF1ZXVlcywgYnV0IHRoZQorICAgICAgICogcG9sbCBiZWZvcmUgdGhhdCB3aWxsIGFsd2F5cyBmYWlsLiBEb2luZyBhbiBlbXB0eSByZWFkLCBmb3JjZXMgdGhlCisgICAgICAgKiBxdWV1ZSB0byBiZSBpbml0aWFsaXplZCBub3cuIFdlIG9ubHkgZG8gdGhpcyBpZiB3ZSBoYXZlIGEgc3RyZWFtaW5nCisgICAgICAgKiBkcml2ZXIuICovCisgICAgICBpZiAob2JqLT5kZXZpY2VfY2FwcyAmIFY0TDJfQ0FQX1NUUkVBTUlORykKKyAgICAgICAgb2JqLT5yZWFkIChvYmotPnZpZGVvX2ZkLCBOVUxMLCAwKTsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfVjRMMl9JT19ETUFCVUY6CisgICAgY2FzZSBHU1RfVjRMMl9JT19NTUFQOgorICAgIHsKKyAgICAgIGd1aW50IGNvdW50OworCisgICAgICBjYW5fYWxsb2NhdGUgPSBHU1RfVjRMMl9BTExPQ0FUT1JfQ0FOX0FMTE9DQVRFIChwb29sLT52YWxsb2NhdG9yLCBNTUFQKTsKKworICAgICAgLyogZmlyc3QsIGxldHMgcmVxdWVzdCBidWZmZXJzLCBhbmQgc2VlIGhvdyBtYW55IHdlIGNhbiBnZXQ6ICovCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChwb29sLCAicmVxdWVzdGluZyAlZCBNTUFQIGJ1ZmZlcnMiLCBtaW5fYnVmZmVycyk7CisKKyAgICAgIGNvdW50ID0gZ3N0X3Y0bDJfYWxsb2NhdG9yX3N0YXJ0IChwb29sLT52YWxsb2NhdG9yLCBtaW5fYnVmZmVycywKKyAgICAgICAgICBWNEwyX01FTU9SWV9NTUFQKTsKKworICAgICAgaWYgKGNvdW50IDwgR1NUX1Y0TDJfTUlOX0JVRkZFUlMpIHsKKyAgICAgICAgbWluX2J1ZmZlcnMgPSBjb3VudDsKKyAgICAgICAgZ290byBub19idWZmZXJzOworICAgICAgfQorCisgICAgICAvKiBWNEwyIGJ1ZmZlciBwb29sIGFyZSBvZnRlbiB2ZXJ5IGxpbWl0ZWQgaW4gdGhlIGFtb3VudCBvZiBidWZmZXJzIGl0CisgICAgICAgKiBjYW4gb2ZmZXIuIFRoZSBjb3B5X3RocmVzaG9sZCB3aWxsIHdvcmthcm91bmQgdGhpcyBsaW1pdGF0aW9uIGJ5CisgICAgICAgKiBmYWxsaW5nIGJhY2sgdG8gY29weSBpZiB0aGUgcGlwZWxpbmUgbmVlZGVkIG1vcmUgYnVmZmVycy4gVGhpcyBhbHNvCisgICAgICAgKiBwcmV2ZW50IGhhdmluZyB0byBkbyBSRVFCVUZTKE4pL1JFUUJVRlMoMCkgZXZlcnl0aW1lIGNvbmZpZ3VyZSBpcworICAgICAgICogY2FsbGVkLiAqLworICAgICAgaWYgKGNvdW50ICE9IG1pbl9idWZmZXJzIHx8IHBvb2wtPmVuYWJsZV9jb3B5X3RocmVzaG9sZCkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBvb2wsCisgICAgICAgICAgICAiVW5jZXJ0YWluIG9yIG5vdCBlbm91Z2ggYnVmZmVycywgZW5hYmxpbmcgY29weSB0aHJlc2hvbGQiKTsKKyAgICAgICAgbWluX2J1ZmZlcnMgPSBjb3VudDsKKyAgICAgICAgY29weV90aHJlc2hvbGQgPSBtaW5fbGF0ZW5jeTsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1Y0TDJfSU9fVVNFUlBUUjoKKyAgICB7CisgICAgICBndWludCBjb3VudDsKKworICAgICAgY2FuX2FsbG9jYXRlID0KKyAgICAgICAgICBHU1RfVjRMMl9BTExPQ0FUT1JfQ0FOX0FMTE9DQVRFIChwb29sLT52YWxsb2NhdG9yLCBVU0VSUFRSKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocG9vbCwgInJlcXVlc3RpbmcgJWQgVVNFUlBUUiBidWZmZXJzIiwgbWluX2J1ZmZlcnMpOworCisgICAgICBjb3VudCA9IGdzdF92NGwyX2FsbG9jYXRvcl9zdGFydCAocG9vbC0+dmFsbG9jYXRvciwgbWluX2J1ZmZlcnMsCisgICAgICAgICAgVjRMMl9NRU1PUllfVVNFUlBUUik7CisKKyAgICAgIC8qIFRoZXJlIGlzIG5vIHJhdGlvbmFsIHRvIG5vdCBnZXQgd2hhdCB3ZSBhc2tlZCAqLworICAgICAgaWYgKGNvdW50IDwgbWluX2J1ZmZlcnMpIHsKKyAgICAgICAgbWluX2J1ZmZlcnMgPSBjb3VudDsKKyAgICAgICAgZ290byBub19idWZmZXJzOworICAgICAgfQorCisgICAgICBtaW5fYnVmZmVycyA9IGNvdW50OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGX0lNUE9SVDoKKyAgICB7CisgICAgICBndWludCBjb3VudDsKKworICAgICAgY2FuX2FsbG9jYXRlID0gR1NUX1Y0TDJfQUxMT0NBVE9SX0NBTl9BTExPQ0FURSAocG9vbC0+dmFsbG9jYXRvciwgRE1BQlVGKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAocG9vbCwgInJlcXVlc3RpbmcgJWQgRE1BQlVGIGJ1ZmZlcnMiLCBtaW5fYnVmZmVycyk7CisKKyAgICAgIGNvdW50ID0gZ3N0X3Y0bDJfYWxsb2NhdG9yX3N0YXJ0IChwb29sLT52YWxsb2NhdG9yLCBtaW5fYnVmZmVycywKKyAgICAgICAgICBWNEwyX01FTU9SWV9ETUFCVUYpOworCisgICAgICAvKiBUaGVyZSBpcyBubyByYXRpb25hbCB0byBub3QgZ2V0IHdoYXQgd2UgYXNrZWQgKi8KKyAgICAgIGlmIChjb3VudCA8IG1pbl9idWZmZXJzKSB7CisgICAgICAgIG1pbl9idWZmZXJzID0gY291bnQ7CisgICAgICAgIGdvdG8gbm9fYnVmZmVyczsKKyAgICAgIH0KKworICAgICAgbWluX2J1ZmZlcnMgPSBjb3VudDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgbWluX2J1ZmZlcnMgPSAwOworICAgICAgY29weV90aHJlc2hvbGQgPSAwOworICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChjYW5fYWxsb2NhdGUpCisgICAgbWF4X2xhdGVuY3kgPSBtYXhfYnVmZmVyczsKKyAgZWxzZQorICAgIG1heF9sYXRlbmN5ID0gbWluX2J1ZmZlcnM7CisKKyAgcG9vbC0+c2l6ZSA9IHNpemU7CisgIHBvb2wtPmNvcHlfdGhyZXNob2xkID0gY29weV90aHJlc2hvbGQ7CisgIHBvb2wtPm1heF9sYXRlbmN5ID0gbWF4X2xhdGVuY3k7CisgIHBvb2wtPm1pbl9sYXRlbmN5ID0gbWluX2xhdGVuY3k7CisgIHBvb2wtPm51bV9xdWV1ZWQgPSAwOworCisgIGlmIChtYXhfYnVmZmVycyAhPSAwICYmIG1heF9idWZmZXJzIDwgbWluX2J1ZmZlcnMpCisgICAgbWF4X2J1ZmZlcnMgPSBtaW5fYnVmZmVyczsKKworICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX3NldF9wYXJhbXMgKGNvbmZpZywgY2Fwcywgc2l6ZSwgbWluX2J1ZmZlcnMsCisgICAgICBtYXhfYnVmZmVycyk7CisgIHBjbGFzcy0+c2V0X2NvbmZpZyAoYnBvb2wsIGNvbmZpZyk7CisgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoY29uZmlnKTsKKworICBpZiAocG9vbC0+b3RoZXJfcG9vbCkKKyAgICBpZiAoIWdzdF9idWZmZXJfcG9vbF9zZXRfYWN0aXZlIChwb29sLT5vdGhlcl9wb29sLCBUUlVFKSkKKyAgICAgIGdvdG8gb3RoZXJfcG9vbF9mYWlsZWQ7CisKKyAgLyogbm93LCBhbGxvY2F0ZSB0aGUgYnVmZmVyczogKi8KKyAgaWYgKCFwY2xhc3MtPnN0YXJ0IChicG9vbCkpCisgICAgZ290byBzdGFydF9mYWlsZWQ7CisKKyAgaWYgKCFWNEwyX1RZUEVfSVNfT1VUUFVUIChvYmotPnR5cGUpKSB7CisgICAgcG9vbC0+Z3JvdXBfcmVsZWFzZWRfaGFuZGxlciA9CisgICAgICAgIGdfc2lnbmFsX2Nvbm5lY3Rfc3dhcHBlZCAocG9vbC0+dmFsbG9jYXRvciwgImdyb3VwLXJlbGVhc2VkIiwKKyAgICAgICAgR19DQUxMQkFDSyAoZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcmVzdXJlY3RfYnVmZmVyKSwgcG9vbCk7CisgICAgcmV0ID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfc3RyZWFtb24gKHBvb2wpOworICB9CisKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK3dyb25nX2NvbmZpZzoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBvb2wsICJpbnZhbGlkIGNvbmZpZyAlIiBHU1RfUFRSX0ZPUk1BVCwgY29uZmlnKTsKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKGNvbmZpZyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19idWZmZXJzOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwKKyAgICAgICAgIndlIHJlY2VpdmVkICVkIGJ1ZmZlciBmcm9tIGRldmljZSAnJXMnLCB3ZSB3YW50IGF0IGxlYXN0ICVkIiwKKyAgICAgICAgbWluX2J1ZmZlcnMsIG9iai0+dmlkZW9kZXYsIEdTVF9WNEwyX01JTl9CVUZGRVJTKTsKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKGNvbmZpZyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitzdGFydF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwb29sLCAiYWxsb2NhdGUgZmFpbGVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitvdGhlcl9wb29sX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBvb2wsICJmYWlsZWQgdG8gYWN0aXZlIHRoZSBvdGhlciBwb29sICUiCisgICAgICAgIEdTVF9QVFJfRk9STUFULCBwb29sLT5vdGhlcl9wb29sKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl9idWZmZXJfcG9vbF9zdG9wIChHc3RCdWZmZXJQb29sICogYnBvb2wpCit7CisgIEdzdFY0bDJCdWZmZXJQb29sICpwb29sID0gR1NUX1Y0TDJfQlVGRkVSX1BPT0wgKGJwb29sKTsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBvb2wsICJzdG9wcGluZyBwb29sIik7CisKKyAgaWYgKHBvb2wtPmdyb3VwX3JlbGVhc2VkX2hhbmRsZXIgPiAwKSB7CisgICAgZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0IChwb29sLT52YWxsb2NhdG9yLAorICAgICAgICBwb29sLT5ncm91cF9yZWxlYXNlZF9oYW5kbGVyKTsKKyAgICBwb29sLT5ncm91cF9yZWxlYXNlZF9oYW5kbGVyID0gMDsKKyAgfQorCisgIGlmIChwb29sLT5vdGhlcl9wb29sKSB7CisgICAgZ3N0X2J1ZmZlcl9wb29sX3NldF9hY3RpdmUgKHBvb2wtPm90aGVyX3Bvb2wsIEZBTFNFKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwb29sLT5vdGhlcl9wb29sKTsKKyAgICBwb29sLT5vdGhlcl9wb29sID0gTlVMTDsKKyAgfQorCisgIGdzdF92NGwyX2J1ZmZlcl9wb29sX3N0cmVhbW9mZiAocG9vbCk7CisKKyAgcmV0ID0gR1NUX0JVRkZFUl9QT09MX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zdG9wIChicG9vbCk7CisKKyAgaWYgKHJldCAmJiBwb29sLT52YWxsb2NhdG9yKSB7CisgICAgR3N0VjRsMlJldHVybiB2cmV0OworCisgICAgdnJldCA9IGdzdF92NGwyX2FsbG9jYXRvcl9zdG9wIChwb29sLT52YWxsb2NhdG9yKTsKKworICAgIGlmICh2cmV0ID09IEdTVF9WNEwyX0JVU1kpCisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBvb2wsICJzb21lIGJ1ZmZlcnMgYXJlIHN0aWxsIG91dHN0YW5kaW5nIik7CisKKyAgICByZXQgPSAodnJldCA9PSBHU1RfVjRMMl9PSyk7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfZmx1c2hfc3RhcnQgKEdzdEJ1ZmZlclBvb2wgKiBicG9vbCkKK3sKKyAgR3N0VjRsMkJ1ZmZlclBvb2wgKnBvb2wgPSBHU1RfVjRMMl9CVUZGRVJfUE9PTCAoYnBvb2wpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBvb2wsICJzdGFydCBmbHVzaGluZyIpOworCisgIGdzdF9wb2xsX3NldF9mbHVzaGluZyAocG9vbC0+cG9sbCwgVFJVRSk7CisKKyAgR1NUX09CSkVDVF9MT0NLIChwb29sKTsKKyAgcG9vbC0+ZW1wdHkgPSBGQUxTRTsKKyAgZ19jb25kX2Jyb2FkY2FzdCAoJnBvb2wtPmVtcHR5X2NvbmQpOworICBHU1RfT0JKRUNUX1VOTE9DSyAocG9vbCk7CisKKyAgaWYgKHBvb2wtPm90aGVyX3Bvb2wpCisgICAgZ3N0X2J1ZmZlcl9wb29sX3NldF9mbHVzaGluZyAocG9vbC0+b3RoZXJfcG9vbCwgVFJVRSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9idWZmZXJfcG9vbF9mbHVzaF9zdG9wIChHc3RCdWZmZXJQb29sICogYnBvb2wpCit7CisgIEdzdFY0bDJCdWZmZXJQb29sICpwb29sID0gR1NUX1Y0TDJfQlVGRkVSX1BPT0wgKGJwb29sKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChwb29sLCAic3RvcCBmbHVzaGluZyIpOworCisgIGlmIChwb29sLT5vdGhlcl9wb29sKQorICAgIGdzdF9idWZmZXJfcG9vbF9zZXRfZmx1c2hpbmcgKHBvb2wtPm90aGVyX3Bvb2wsIEZBTFNFKTsKKworICBnc3RfcG9sbF9zZXRfZmx1c2hpbmcgKHBvb2wtPnBvbGwsIEZBTFNFKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92NGwyX2J1ZmZlcl9wb29sX3BvbGwgKEdzdFY0bDJCdWZmZXJQb29sICogcG9vbCkKK3sKKyAgZ2ludCByZXQ7CisKKyAgLyogSW4gUlcgbW9kZSB0aGVyZSBpcyBubyBxdWV1ZSwgaGVuY2Ugbm8gbmVlZCB0byB3YWl0IHdoaWxlIHRoZSBxdWV1ZSBpcworICAgKiBlbXB0eSAqLworICBpZiAocG9vbC0+b2JqLT5tb2RlICE9IEdTVF9WNEwyX0lPX1JXKSB7CisgICAgR1NUX09CSkVDVF9MT0NLIChwb29sKTsKKyAgICB3aGlsZSAocG9vbC0+ZW1wdHkpCisgICAgICBnX2NvbmRfd2FpdCAoJnBvb2wtPmVtcHR5X2NvbmQsIEdTVF9PQkpFQ1RfR0VUX0xPQ0sgKHBvb2wpKTsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAocG9vbCk7CisgIH0KKworICBpZiAoIXBvb2wtPmNhbl9wb2xsX2RldmljZSkKKyAgICBnb3RvIGRvbmU7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHBvb2wsICJwb2xsaW5nIGRldmljZSIpOworCithZ2FpbjoKKyAgcmV0ID0gZ3N0X3BvbGxfd2FpdCAocG9vbC0+cG9sbCwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgIGlmIChHX1VOTElLRUxZIChyZXQgPCAwKSkgeworICAgIHN3aXRjaCAoZXJybm8pIHsKKyAgICAgIGNhc2UgRUJVU1k6CisgICAgICAgIGdvdG8gc3RvcHBlZDsKKyAgICAgIGNhc2UgRUFHQUlOOgorICAgICAgY2FzZSBFSU5UUjoKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgIGNhc2UgRU5YSU86CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocG9vbCwKKyAgICAgICAgICAgICJ2NGwyIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgcG9sbGluZy4gRGlzYWJsaW5nIgorICAgICAgICAgICAgIiB1c2luZyBsaWJ2NGwyIGluIHRoaXMgY2FzZSBtYXkgY2F1c2UgZGVhZGxvY2tzIik7CisgICAgICAgIHBvb2wtPmNhbl9wb2xsX2RldmljZSA9IEZBTFNFOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIHNlbGVjdF9lcnJvcjsKKyAgICB9CisgIH0KKworICBpZiAoZ3N0X3BvbGxfZmRfaGFzX2Vycm9yIChwb29sLT5wb2xsLCAmcG9vbC0+cG9sbGZkKSkKKyAgICBnb3RvIHNlbGVjdF9lcnJvcjsKKworZG9uZToKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIC8qIEVSUk9SUyAqLworc3RvcHBlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBvb2wsICJzdG9wIGNhbGxlZCIpOworICAgIHJldHVybiBHU1RfRkxPV19GTFVTSElORzsKKyAgfQorc2VsZWN0X2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHBvb2wtPm9iai0+ZWxlbWVudCwgUkVTT1VSQ0UsIFJFQUQsIChOVUxMKSwKKyAgICAgICAgKCJwb2xsIGVycm9yICVkOiAlcyAoJWQpIiwgcmV0LCBnX3N0cmVycm9yIChlcnJubyksIGVycm5vKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdjRsMl9idWZmZXJfcG9vbF9xYnVmIChHc3RWNGwyQnVmZmVyUG9vbCAqIHBvb2wsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgR3N0VjRsMk1lbW9yeUdyb3VwICpncm91cCA9IE5VTEw7CisgIGNvbnN0IEdzdFY0bDJPYmplY3QgKm9iaiA9IHBvb2wtPm9iajsKKyAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcDsKKyAgZ2ludCBpbmRleDsKKworICBpZiAoIWdzdF92NGwyX2lzX2J1ZmZlcl92YWxpZCAoYnVmLCAmZ3JvdXApKSB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwgImludmFsaWQgYnVmZmVyICVwIiwgYnVmKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KKworICBpbmRleCA9IGdyb3VwLT5idWZmZXIuaW5kZXg7CisKKyAgaWYgKHBvb2wtPmJ1ZmZlcnNbaW5kZXhdICE9IE5VTEwpCisgICAgZ290byBhbHJlYWR5X3F1ZXVlZDsKKworICBHU1RfTE9HX09CSkVDVCAocG9vbCwgInF1ZXVpbmcgYnVmZmVyICVpIiwgaW5kZXgpOworCisgIGlmIChWNEwyX1RZUEVfSVNfT1VUUFVUIChvYmotPnR5cGUpKSB7CisgICAgZW51bSB2NGwyX2ZpZWxkIGZpZWxkOworCisgICAgLyogRXhjZXB0IHdoZW4gZmllbGQgaXMgc2V0IHRvIGFsdGVybmF0ZSwgYnVmZmVyIGZpZWxkIGlzIHRoZSBzYW1lIGFzCisgICAgICogdGhlIG9uZSBkZWZpbmVkIGluIGZvcm1hdCAqLworICAgIGlmIChWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIgKG9iai0+dHlwZSkpCisgICAgICBmaWVsZCA9IG9iai0+Zm9ybWF0LmZtdC5waXhfbXAuZmllbGQ7CisgICAgZWxzZQorICAgICAgZmllbGQgPSBvYmotPmZvcm1hdC5mbXQucGl4LmZpZWxkOworCisgICAgLyogTkI6IEF0IHRoaXMgbW9tZW50LCB3ZSBjYW4ndCBoYXZlIGFsdGVybmF0ZSBtb2RlIGJlY2F1c2UgaXQgbm90IGhhbmRsZWQKKyAgICAgKiB5ZXQgKi8KKyAgICBpZiAoZmllbGQgPT0gVjRMMl9GSUVMRF9BTFRFUk5BVEUpIHsKKyAgICAgIGlmIChHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChidWYsIEdTVF9WSURFT19GUkFNRV9GTEFHX1RGRikpCisgICAgICAgIGZpZWxkID0gVjRMMl9GSUVMRF9UT1A7CisgICAgICBlbHNlCisgICAgICAgIGZpZWxkID0gVjRMMl9GSUVMRF9CT1RUT007CisgICAgfQorCisgICAgZ3JvdXAtPmJ1ZmZlci5maWVsZCA9IGZpZWxkOworICB9CisKKyAgaWYgKEdTVF9CVUZGRVJfVElNRVNUQU1QX0lTX1ZBTElEIChidWYpKSB7CisgICAgdGltZXN0YW1wID0gR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1Zik7CisgICAgR1NUX1RJTUVfVE9fVElNRVZBTCAodGltZXN0YW1wLCBncm91cC0+YnVmZmVyLnRpbWVzdGFtcCk7CisgIH0KKworICBHU1RfT0JKRUNUX0xPQ0sgKHBvb2wpOworICBnX2F0b21pY19pbnRfaW5jICgmcG9vbC0+bnVtX3F1ZXVlZCk7CisgIHBvb2wtPmJ1ZmZlcnNbaW5kZXhdID0gYnVmOworCisgIGlmICghZ3N0X3Y0bDJfYWxsb2NhdG9yX3FidWYgKHBvb2wtPnZhbGxvY2F0b3IsIGdyb3VwKSkKKyAgICBnb3RvIHF1ZXVlX2ZhaWxlZDsKKworICBwb29sLT5lbXB0eSA9IEZBTFNFOworICBnX2NvbmRfc2lnbmFsICgmcG9vbC0+ZW1wdHlfY29uZCk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChwb29sKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKK2FscmVhZHlfcXVldWVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwgInRoZSBidWZmZXIgJWkgd2FzIGFscmVhZHkgcXVldWVkIiwgaW5kZXgpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorcXVldWVfZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwgImNvdWxkIG5vdCBxdWV1ZSBhIGJ1ZmZlciAlaSIsIGluZGV4KTsKKyAgICAvKiBNYXJrIGJyb2tlbiBidWZmZXIgdG8gdGhlIGFsbG9jYXRvciAqLworICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGJ1ZiwgR1NUX0JVRkZFUl9GTEFHX1RBR19NRU1PUlkpOworICAgIGdfYXRvbWljX2ludF9hZGQgKCZwb29sLT5udW1fcXVldWVkLCAtMSk7CisgICAgcG9vbC0+YnVmZmVyc1tpbmRleF0gPSBOVUxMOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChwb29sKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92NGwyX2J1ZmZlcl9wb29sX2RxYnVmIChHc3RWNGwyQnVmZmVyUG9vbCAqIHBvb2wsIEdzdEJ1ZmZlciAqKiBidWZmZXIpCit7CisgIEdzdEZsb3dSZXR1cm4gcmVzOworICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gcG9vbC0+b2JqOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworICBHc3RWNGwyTWVtb3J5R3JvdXAgKmdyb3VwOworICBHc3RWaWRlb01ldGEgKnZtZXRhOworICBnc2l6ZSBzaXplOworICBnaW50IGk7CisKKyAgaWYgKChyZXMgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9wb2xsIChwb29sKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgZ290byBwb2xsX2ZhaWxlZDsKKworICBHU1RfTE9HX09CSkVDVCAocG9vbCwgImRlcXVldWVpbmcgYSBidWZmZXIiKTsKKworICByZXMgPSBnc3RfdjRsMl9hbGxvY2F0b3JfZHFidWYgKHBvb2wtPnZhbGxvY2F0b3IsICZncm91cCk7CisgIGlmIChyZXMgPT0gR1NUX0ZMT1dfRU9TKQorICAgIGdvdG8gZW9zOworICBpZiAocmVzICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gZHFidWZfZmFpbGVkOworCisgIC8qIGdldCBvdXIgR3N0QnVmZmVyIHdpdGggdGhhdCBpbmRleCBmcm9tIHRoZSBwb29sLCBpZiB0aGUgYnVmZmVyIHdhcworICAgKiBvdXRzdGFuZGluZyB3ZSBoYXZlIGEgc2VyaW91cyBwcm9ibGVtLgorICAgKi8KKyAgb3V0YnVmID0gcG9vbC0+YnVmZmVyc1tncm91cC0+YnVmZmVyLmluZGV4XTsKKyAgaWYgKG91dGJ1ZiA9PSBOVUxMKQorICAgIGdvdG8gbm9fYnVmZmVyOworCisgIC8qIG1hcmsgdGhlIGJ1ZmZlciBvdXRzdGFuZGluZyAqLworICBwb29sLT5idWZmZXJzW2dyb3VwLT5idWZmZXIuaW5kZXhdID0gTlVMTDsKKyAgaWYgKGdfYXRvbWljX2ludF9kZWNfYW5kX3Rlc3QgKCZwb29sLT5udW1fcXVldWVkKSkgeworICAgIEdTVF9PQkpFQ1RfTE9DSyAocG9vbCk7CisgICAgcG9vbC0+ZW1wdHkgPSBUUlVFOworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChwb29sKTsKKyAgfQorCisgIHRpbWVzdGFtcCA9IEdTVF9USU1FVkFMX1RPX1RJTUUgKGdyb3VwLT5idWZmZXIudGltZXN0YW1wKTsKKworICBzaXplID0gMDsKKyAgdm1ldGEgPSBnc3RfYnVmZmVyX2dldF92aWRlb19tZXRhIChvdXRidWYpOworICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXAtPm5fbWVtOyBpKyspIHsKKyAgICBHU1RfTE9HX09CSkVDVCAocG9vbCwKKyAgICAgICAgImRlcXVldWVkIGJ1ZmZlciAlcCBzZXE6JWQgKGl4PSVkKSwgbWVtICVwIHVzZWQgJWQsIHBsYW5lPSVkLCBmbGFncyAlMDh4LCB0cyAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQgIiwgcG9vbC1xdWV1ZWQ9JWQsIGJ1ZmZlcj0lcCIsIG91dGJ1ZiwKKyAgICAgICAgZ3JvdXAtPmJ1ZmZlci5zZXF1ZW5jZSwgZ3JvdXAtPmJ1ZmZlci5pbmRleCwgZ3JvdXAtPm1lbVtpXSwKKyAgICAgICAgZ3JvdXAtPnBsYW5lc1tpXS5ieXRlc3VzZWQsIGksIGdyb3VwLT5idWZmZXIuZmxhZ3MsCisgICAgICAgIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCksIHBvb2wtPm51bV9xdWV1ZWQsIG91dGJ1Zik7CisKKyAgICBpZiAodm1ldGEpIHsKKyAgICAgIHZtZXRhLT5vZmZzZXRbaV0gPSBzaXplOworICAgICAgc2l6ZSArPSBnc3RfbWVtb3J5X2dldF9zaXplcyAoZ3JvdXAtPm1lbVtpXSwgTlVMTCwgTlVMTCk7CisgICAgfQorICB9CisKKyAgLyogSWdub3JlIHRpbWVzdGFtcCBhbmQgZmllbGQgZm9yIE9VVFBVVCBkZXZpY2UgKi8KKyAgaWYgKFY0TDJfVFlQRV9JU19PVVRQVVQgKG9iai0+dHlwZSkpCisgICAgZ290byBkb25lOworCisgIC8qIENoZWNrIGZvciBkcml2ZXIgYnVnIGluIHJlcG9ydGluZyBmZWlsZCAqLworICBpZiAoZ3JvdXAtPmJ1ZmZlci5maWVsZCA9PSBWNEwyX0ZJRUxEX0FOWSkgeworICAgIC8qIE9ubHkgd2FybiBvbmNlIHRvIGF2b2lkIHRoZSBzcGFtbWluZyAqLworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgICBpZiAoIXBvb2wtPmhhc193YXJuZWRfb25fYnVnZ3lfZmllbGQpIHsKKyAgICAgIHBvb2wtPmhhc193YXJuZWRfb25fYnVnZ3lfZmllbGQgPSBUUlVFOworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwb29sLAorICAgICAgICAgICJEcml2ZXIgc2hvdWxkIG5ldmVyIHNldCB2NGwyX2J1ZmZlci5maWVsZCB0byBBTlkiKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIFVzZSB0aGUgdmFsdWUgZnJvbSB0aGUgZm9ybWF0ICh3b3JrcyBmb3IgVVZDIGJ1ZykgKi8KKyAgICBncm91cC0+YnVmZmVyLmZpZWxkID0gb2JqLT5mb3JtYXQuZm10LnBpeC5maWVsZDsKKworICAgIC8qIElmIGRyaXZlciBhbHNvIGhhcyBidWdneSBTX0ZNVCwgYXNzdW1lIHByb2dyZXNzaXZlICovCisgICAgaWYgKGdyb3VwLT5idWZmZXIuZmllbGQgPT0gVjRMMl9GSUVMRF9BTlkpIHsKKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgICAgICBpZiAoIXBvb2wtPmhhc193YXJuZWRfb25fYnVnZ3lfZmllbGQpIHsKKyAgICAgICAgcG9vbC0+aGFzX3dhcm5lZF9vbl9idWdneV9maWVsZCA9IFRSVUU7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocG9vbCwKKyAgICAgICAgICAgICJEcml2ZXIgc2hvdWxkIG5ldmVyIHNldCB2NGwyX2Zvcm1hdC5waXguZmllbGQgdG8gQU5ZIik7CisgICAgICB9CisjZW5kaWYKKworICAgICAgZ3JvdXAtPmJ1ZmZlci5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKyAgICB9CisgIH0KKworICAvKiBzZXQgdG9wL2JvdHRvbSBmaWVsZCBmaXJzdCBpZiB2NGwyX2J1ZmZlciBoYXMgdGhlIGluZm9ybWF0aW9uICovCisgIHN3aXRjaCAoZ3JvdXAtPmJ1ZmZlci5maWVsZCkgeworICAgIGNhc2UgVjRMMl9GSUVMRF9OT05FOgorICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChvdXRidWYsIEdTVF9WSURFT19CVUZGRVJfRkxBR19JTlRFUkxBQ0VEKTsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAob3V0YnVmLCBHU1RfVklERU9fQlVGRkVSX0ZMQUdfVEZGKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX1RCOgorICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfVklERU9fQlVGRkVSX0ZMQUdfSU5URVJMQUNFRCk7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9WSURFT19CVUZGRVJfRkxBR19URkYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQ6CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChvdXRidWYsIEdTVF9WSURFT19CVUZGRVJfRkxBR19JTlRFUkxBQ0VEKTsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAob3V0YnVmLCBHU1RfVklERU9fQlVGRkVSX0ZMQUdfVEZGKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOgorICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfVklERU9fQlVGRkVSX0ZMQUdfSU5URVJMQUNFRCk7CisgICAgICBpZiAob2JqLT50dl9ub3JtID09IFY0TDJfU1REX05UU0NfTSB8fAorICAgICAgICAgIG9iai0+dHZfbm9ybSA9PSBWNEwyX1NURF9OVFNDX01fSlAgfHwKKyAgICAgICAgICBvYmotPnR2X25vcm0gPT0gVjRMMl9TVERfTlRTQ19NX0tSKSB7CisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAob3V0YnVmLCBHU1RfVklERU9fQlVGRkVSX0ZMQUdfVEZGKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQgKG91dGJ1ZiwgR1NUX1ZJREVPX0JVRkZFUl9GTEFHX1RGRik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX0JVRkZFUl9GTEFHX1VOU0VUIChvdXRidWYsIEdTVF9WSURFT19CVUZGRVJfRkxBR19JTlRFUkxBQ0VEKTsKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAob3V0YnVmLCBHU1RfVklERU9fQlVGRkVSX0ZMQUdfVEZGKTsKKyAgICAgIEdTVF9GSVhNRV9PQkpFQ1QgKHBvb2wsCisgICAgICAgICAgIlVuaGFuZGxlZCBlbnVtIHY0bDJfZmllbGQgJWQgLSB0cmVhdGluZyBhcyBwcm9ncmVzc2l2ZSIsCisgICAgICAgICAgZ3JvdXAtPmJ1ZmZlci5maWVsZCk7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChHU1RfVklERU9fSU5GT19GT1JNQVQgKCZvYmotPmluZm8pID09IEdTVF9WSURFT19GT1JNQVRfRU5DT0RFRCkgeworICAgIGlmICgoZ3JvdXAtPmJ1ZmZlci5mbGFncyAmIFY0TDJfQlVGX0ZMQUdfS0VZRlJBTUUpIHx8CisgICAgICAgIEdTVF9WNEwyX1BJWEVMRk9STUFUIChvYmopID09IFY0TDJfUElYX0ZNVF9NSlBFRyB8fAorICAgICAgICBHU1RfVjRMMl9QSVhFTEZPUk1BVCAob2JqKSA9PSBWNEwyX1BJWF9GTVRfSlBFRyB8fAorICAgICAgICBHU1RfVjRMMl9QSVhFTEZPUk1BVCAob2JqKSA9PSBWNEwyX1BJWF9GTVRfUEpQRykKKyAgICAgIEdTVF9CVUZGRVJfRkxBR19VTlNFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgICAgZWxzZQorICAgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CisgIH0KKworICBpZiAoZ3JvdXAtPmJ1ZmZlci5mbGFncyAmIFY0TDJfQlVGX0ZMQUdfRVJST1IpCisgICAgR1NUX0JVRkZFUl9GTEFHX1NFVCAob3V0YnVmLCBHU1RfQlVGRkVSX0ZMQUdfQ09SUlVQVEVEKTsKKworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmKSA9IHRpbWVzdGFtcDsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKG91dGJ1ZikgPSBncm91cC0+YnVmZmVyLnNlcXVlbmNlOworICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKG91dGJ1ZikgPSBncm91cC0+YnVmZmVyLnNlcXVlbmNlICsgMTsKKworZG9uZToKKyAgKmJ1ZmZlciA9IG91dGJ1ZjsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7CisKKyAgLyogRVJST1JTICovCitwb2xsX2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBvb2wsICJwb2xsIGVycm9yICVzIiwgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJlcykpOworICAgIHJldHVybiByZXM7CisgIH0KK2VvczoKKyAgeworICAgIHJldHVybiBHU1RfRkxPV19FT1M7CisgIH0KK2RxYnVmX2ZhaWxlZDoKKyAgeworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorbm9fYnVmZmVyOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwgIk5vIGZyZWUgYnVmZmVyIGZvdW5kIGluIHRoZSBwb29sIGF0IGluZGV4ICVkLiIsCisgICAgICAgIGdyb3VwLT5idWZmZXIuaW5kZXgpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfYWNxdWlyZV9idWZmZXIgKEdzdEJ1ZmZlclBvb2wgKiBicG9vbCwgR3N0QnVmZmVyICoqIGJ1ZmZlciwKKyAgICBHc3RCdWZmZXJQb29sQWNxdWlyZVBhcmFtcyAqIHBhcmFtcykKK3sKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdFY0bDJCdWZmZXJQb29sICpwb29sID0gR1NUX1Y0TDJfQlVGRkVSX1BPT0wgKGJwb29sKTsKKyAgR3N0QnVmZmVyUG9vbENsYXNzICpwY2xhc3MgPSBHU1RfQlVGRkVSX1BPT0xfQ0xBU1MgKHBhcmVudF9jbGFzcyk7CisgIEdzdFY0bDJPYmplY3QgKm9iaiA9IHBvb2wtPm9iajsKKworICBHU1RfREVCVUdfT0JKRUNUIChwb29sLCAiYWNxdWlyZSIpOworCisgIC8qIElmIHRoaXMgaXMgYmVpbmcgY2FsbGVkIHRvIHJlc3VyZWN0IGEgbG9zdCBidWZmZXIgKi8KKyAgaWYgKHBhcmFtcyAmJiBwYXJhbXMtPmZsYWdzICYgR1NUX1Y0TDJfQlVGRkVSX1BPT0xfQUNRVUlSRV9GTEFHX1JFU1VSUkVDVCkgeworICAgIHJldCA9IHBjbGFzcy0+YWNxdWlyZV9idWZmZXIgKGJwb29sLCBidWZmZXIsIHBhcmFtcyk7CisgICAgZ290byBkb25lOworICB9CisKKyAgc3dpdGNoIChvYmotPnR5cGUpIHsKKyAgICBjYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKyAgICBjYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU6CisgICAgICAvKiBjYXB0dXJlLCBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBidWZmZXIgd2l0aCBuZXcgY2FwdHVyZWQgZGF0YSAqLworICAgICAgc3dpdGNoIChvYmotPm1vZGUpIHsKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19SVzoKKyAgICAgICAgeworICAgICAgICAgIC8qIHRha2UgZW1wdHkgYnVmZmVyIGZyb20gdGhlIHBvb2wgKi8KKyAgICAgICAgICByZXQgPSBwY2xhc3MtPmFjcXVpcmVfYnVmZmVyIChicG9vbCwgYnVmZmVyLCBwYXJhbXMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGOgorICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX01NQVA6CisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fVVNFUlBUUjoKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19ETUFCVUZfSU1QT1JUOgorICAgICAgICB7CisgICAgICAgICAgLyoganVzdCBkZXF1ZXVlIGEgYnVmZmVyLCB3ZSBiYXNpY2FsbHkgdXNlIHRoZSBxdWV1ZSBvZiB2NGwyIGFzIHRoZQorICAgICAgICAgICAqIHN0b3JhZ2UgZm9yIG91ciBidWZmZXJzLiBUaGlzIGZ1bmN0aW9uIGRvZXMgcG9sbCBmaXJzdCBzbyB3ZSBjYW4KKyAgICAgICAgICAgKiBpbnRlcnJ1cHQgaXQgZmluZS4gKi8KKyAgICAgICAgICByZXQgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9kcWJ1ZiAocG9vbCwgYnVmZmVyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6CisgICAgY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU6CisgICAgICAvKiBwbGF5YmFjaywgVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGFuIGVtcHR5IGJ1ZmZlciAqLworICAgICAgc3dpdGNoIChvYmotPm1vZGUpIHsKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19SVzoKKyAgICAgICAgICAvKiBnZXQgYW4gZW1wdHkgYnVmZmVyICovCisgICAgICAgICAgcmV0ID0gcGNsYXNzLT5hY3F1aXJlX2J1ZmZlciAoYnBvb2wsIGJ1ZmZlciwgcGFyYW1zKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX01NQVA6CisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGOgorICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX1VTRVJQVFI6CisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGX0lNUE9SVDoKKyAgICAgICAgICAvKiBnZXQgYSBmcmVlIHVucXVldWVkIGJ1ZmZlciAqLworICAgICAgICAgIHJldCA9IHBjbGFzcy0+YWNxdWlyZV9idWZmZXIgKGJwb29sLCBidWZmZXIsIHBhcmFtcyk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICAgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBicmVhazsKKyAgfQorZG9uZToKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2J1ZmZlcl9wb29sX3JlbGVhc2VfYnVmZmVyIChHc3RCdWZmZXJQb29sICogYnBvb2wsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgR3N0VjRsMkJ1ZmZlclBvb2wgKnBvb2wgPSBHU1RfVjRMMl9CVUZGRVJfUE9PTCAoYnBvb2wpOworICBHc3RCdWZmZXJQb29sQ2xhc3MgKnBjbGFzcyA9IEdTVF9CVUZGRVJfUE9PTF9DTEFTUyAocGFyZW50X2NsYXNzKTsKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gcG9vbC0+b2JqOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBvb2wsICJyZWxlYXNlIGJ1ZmZlciAlcCIsIGJ1ZmZlcik7CisKKyAgc3dpdGNoIChvYmotPnR5cGUpIHsKKyAgICBjYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKyAgICBjYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU6CisgICAgICAvKiBjYXB0dXJlLCBwdXQgdGhlIGJ1ZmZlciBiYWNrIGluIHRoZSBxdWV1ZSBzbyB0aGF0IHdlIGNhbiByZWZpbGwgaXQKKyAgICAgICAqIGxhdGVyLiAqLworICAgICAgc3dpdGNoIChvYmotPm1vZGUpIHsKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19SVzoKKyAgICAgICAgICAvKiByZWxlYXNlIGJhY2sgaW4gdGhlIHBvb2wgKi8KKyAgICAgICAgICBwY2xhc3MtPnJlbGVhc2VfYnVmZmVyIChicG9vbCwgYnVmZmVyKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX0RNQUJVRjoKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19NTUFQOgorICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX1VTRVJQVFI6CisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGX0lNUE9SVDoKKyAgICAgICAgeworICAgICAgICAgIEdzdFY0bDJNZW1vcnlHcm91cCAqZ3JvdXA7CisgICAgICAgICAgaWYgKGdzdF92NGwyX2lzX2J1ZmZlcl92YWxpZCAoYnVmZmVyLCAmZ3JvdXApKSB7CisgICAgICAgICAgICBnc3RfdjRsMl9hbGxvY2F0b3JfcmVzZXRfZ3JvdXAgKHBvb2wtPnZhbGxvY2F0b3IsIGdyb3VwKTsKKyAgICAgICAgICAgIC8qIHF1ZXVlIGJhY2sgaW4gdGhlIGRldmljZSAqLworICAgICAgICAgICAgaWYgKHBvb2wtPm90aGVyX3Bvb2wpCisgICAgICAgICAgICAgIGdzdF92NGwyX2J1ZmZlcl9wb29sX3ByZXBhcmVfYnVmZmVyIChwb29sLCBidWZmZXIsIE5VTEwpOworICAgICAgICAgICAgaWYgKGdzdF92NGwyX2J1ZmZlcl9wb29sX3FidWYgKHBvb2wsIGJ1ZmZlcikgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgIHBjbGFzcy0+cmVsZWFzZV9idWZmZXIgKGJwb29sLCBidWZmZXIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBTaW1wbHkgcmVsZWFzZSBpbnZhbGlkZS9tb2RpZmllZCBidWZmZXIsIHRoZSBhbGxvY2F0b3Igd2lsbAorICAgICAgICAgICAgICogZ2l2ZSBpdCBiYWNrIGxhdGVyICovCisgICAgICAgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19UQUdfTUVNT1JZKTsKKyAgICAgICAgICAgIHBjbGFzcy0+cmVsZWFzZV9idWZmZXIgKGJwb29sLCBidWZmZXIpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgorICAgIGNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOgorICAgICAgc3dpdGNoIChvYmotPm1vZGUpIHsKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19SVzoKKyAgICAgICAgICAvKiByZWxlYXNlIGJhY2sgaW4gdGhlIHBvb2wgKi8KKyAgICAgICAgICBwY2xhc3MtPnJlbGVhc2VfYnVmZmVyIChicG9vbCwgYnVmZmVyKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX01NQVA6CisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGOgorICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX1VTRVJQVFI6CisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGX0lNUE9SVDoKKyAgICAgICAgeworICAgICAgICAgIEdzdFY0bDJNZW1vcnlHcm91cCAqZ3JvdXA7CisgICAgICAgICAgZ3VpbnQgaW5kZXg7CisKKyAgICAgICAgICBpZiAoIWdzdF92NGwyX2lzX2J1ZmZlcl92YWxpZCAoYnVmZmVyLCAmZ3JvdXApKSB7CisgICAgICAgICAgICAvKiBTaW1wbHkgcmVsZWFzZSBpbnZhbGlkZS9tb2RpZmllZCBidWZmZXIsIHRoZSBhbGxvY2F0b3Igd2lsbAorICAgICAgICAgICAgICogZ2l2ZSBpdCBiYWNrIGxhdGVyICovCisgICAgICAgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19UQUdfTUVNT1JZKTsKKyAgICAgICAgICAgIHBjbGFzcy0+cmVsZWFzZV9idWZmZXIgKGJwb29sLCBidWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgaW5kZXggPSBncm91cC0+YnVmZmVyLmluZGV4OworCisgICAgICAgICAgaWYgKHBvb2wtPmJ1ZmZlcnNbaW5kZXhdID09IE5VTEwpIHsKKyAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwb29sLCAiYnVmZmVyICV1IG5vdCBxdWV1ZWQsIHB1dHRpbmcgb24gZnJlZSBsaXN0IiwKKyAgICAgICAgICAgICAgICBpbmRleCk7CisKKyAgICAgICAgICAgIC8qIFJlbW92ZSBxZGF0YSwgdGhpcyB3aWxsIHVubWFwIGFueSBtYXAgZGF0YSBpbiB1c2VycHRyICovCisgICAgICAgICAgICBnc3RfbWluaV9vYmplY3Rfc2V0X3FkYXRhIChHU1RfTUlOSV9PQkpFQ1QgKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgR1NUX1Y0TDJfSU1QT1JUX1FVQVJLLCBOVUxMLCBOVUxMKTsKKworICAgICAgICAgICAgLyogcmVzZXQgdG8gZGVmYXVsdCBzaXplICovCisgICAgICAgICAgICBnc3RfdjRsMl9hbGxvY2F0b3JfcmVzZXRfZ3JvdXAgKHBvb2wtPnZhbGxvY2F0b3IsIGdyb3VwKTsKKworICAgICAgICAgICAgLyogcGxheWJhY2ssIHB1dCB0aGUgYnVmZmVyIGJhY2sgaW4gdGhlIHF1ZXVlIHRvIHJlZmlsbCBsYXRlci4gKi8KKyAgICAgICAgICAgIHBjbGFzcy0+cmVsZWFzZV9idWZmZXIgKGJwb29sLCBidWZmZXIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiB0aGUgYnVmZmVyIGlzIHF1ZXVlZCBpbiB0aGUgZGV2aWNlIGJ1dCBtYXliZSBub3QgcGxheWVkIHlldC4gV2UganVzdAorICAgICAgICAgICAgICogbGVhdmUgaXQgdGhlcmUgYW5kIG5vdCBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgZnV0dXJlIGNhbGxzIHRvIGFjcXVpcmUKKyAgICAgICAgICAgICAqIGZvciBub3cuIFRoZSBidWZmZXIgd2lsbCBiZSBkZXF1ZXVlZCBhbmQgcmV1c2VkIGxhdGVyLiAqLworICAgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBvb2wsICJidWZmZXIgJXUgaXMgcXVldWVkIiwgaW5kZXgpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9idWZmZXJfcG9vbF9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RWNGwyQnVmZmVyUG9vbCAqcG9vbCA9IEdTVF9WNEwyX0JVRkZFUl9QT09MIChvYmplY3QpOworCisgIGlmIChwb29sLT52YWxsb2NhdG9yKQorICAgIGdzdF9vYmplY3RfdW5yZWYgKHBvb2wtPnZhbGxvY2F0b3IpOworICBwb29sLT52YWxsb2NhdG9yID0gTlVMTDsKKworICBpZiAocG9vbC0+YWxsb2NhdG9yKQorICAgIGdzdF9vYmplY3RfdW5yZWYgKHBvb2wtPmFsbG9jYXRvcik7CisgIHBvb2wtPmFsbG9jYXRvciA9IE5VTEw7CisKKyAgaWYgKHBvb2wtPm90aGVyX3Bvb2wpCisgICAgZ3N0X29iamVjdF91bnJlZiAocG9vbC0+b3RoZXJfcG9vbCk7CisgIHBvb2wtPm90aGVyX3Bvb2wgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFY0bDJCdWZmZXJQb29sICpwb29sID0gR1NUX1Y0TDJfQlVGRkVSX1BPT0wgKG9iamVjdCk7CisKKyAgaWYgKHBvb2wtPnZpZGVvX2ZkID49IDApCisgICAgcG9vbC0+b2JqLT5jbG9zZSAocG9vbC0+dmlkZW9fZmQpOworCisgIGdzdF9wb2xsX2ZyZWUgKHBvb2wtPnBvbGwpOworCisgIC8qIFRoaXMgY2FuJ3QgYmUgZG9uZSBpbiBkaXNwb3NlIG1ldGhvZCBiZWNhdXNlIHdlIG11c3Qgbm90IHNldCBwb2ludGVyCisgICAqIHRvIE5VTEwgYXMgaXQgaXMgcGFydCBvZiB0aGUgdjRsMm9iamVjdCBhbmQgZGlzcG9zZSBjb3VsZCBiZSBjYWxsZWQKKyAgICogbXVsdGlwbGUgdGltZXMgKi8KKyAgZ3N0X29iamVjdF91bnJlZiAocG9vbC0+b2JqLT5lbGVtZW50KTsKKworICBnX2NvbmRfY2xlYXIgKCZwb29sLT5lbXB0eV9jb25kKTsKKworICAvKiBGSVhNRSBoYXZlIHdlIGRvbmUgZW5vdWdoIGhlcmUgPyAqLworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2J1ZmZlcl9wb29sX2luaXQgKEdzdFY0bDJCdWZmZXJQb29sICogcG9vbCkKK3sKKyAgcG9vbC0+cG9sbCA9IGdzdF9wb2xsX25ldyAoVFJVRSk7CisgIHBvb2wtPmNhbl9wb2xsX2RldmljZSA9IFRSVUU7CisgIGdfY29uZF9pbml0ICgmcG9vbC0+ZW1wdHlfY29uZCk7CisgIHBvb2wtPmVtcHR5ID0gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2J1ZmZlcl9wb29sX2NsYXNzX2luaXQgKEdzdFY0bDJCdWZmZXJQb29sQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBHc3RCdWZmZXJQb29sQ2xhc3MgKmJ1ZmZlcnBvb2xfY2xhc3MgPSBHU1RfQlVGRkVSX1BPT0xfQ0xBU1MgKGtsYXNzKTsKKworICBvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9kaXNwb3NlOworICBvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfZmluYWxpemU7CisKKyAgYnVmZmVycG9vbF9jbGFzcy0+c3RhcnQgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9zdGFydDsKKyAgYnVmZmVycG9vbF9jbGFzcy0+c3RvcCA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX3N0b3A7CisgIGJ1ZmZlcnBvb2xfY2xhc3MtPnNldF9jb25maWcgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9zZXRfY29uZmlnOworICBidWZmZXJwb29sX2NsYXNzLT5hbGxvY19idWZmZXIgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9hbGxvY19idWZmZXI7CisgIGJ1ZmZlcnBvb2xfY2xhc3MtPmFjcXVpcmVfYnVmZmVyID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfYWNxdWlyZV9idWZmZXI7CisgIGJ1ZmZlcnBvb2xfY2xhc3MtPnJlbGVhc2VfYnVmZmVyID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcmVsZWFzZV9idWZmZXI7CisgIGJ1ZmZlcnBvb2xfY2xhc3MtPmZsdXNoX3N0YXJ0ID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfZmx1c2hfc3RhcnQ7CisgIGJ1ZmZlcnBvb2xfY2xhc3MtPmZsdXNoX3N0b3AgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9mbHVzaF9zdG9wOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUICh2NGwyYnVmZmVycG9vbF9kZWJ1ZywgInY0bDJidWZmZXJwb29sIiwgMCwKKyAgICAgICJWNEwyIEJ1ZmZlciBQb29sIik7CisgIEdTVF9ERUJVR19DQVRFR09SWV9HRVQgKENBVF9QRVJGT1JNQU5DRSwgIkdTVF9QRVJGT1JNQU5DRSIpOworfQorCisvKioKKyAqIGdzdF92NGwyX2J1ZmZlcl9wb29sX25ldzoKKyAqIEBvYmo6ICB0aGUgdjRsMiBvYmplY3Qgb3duaW5nIHRoZSBwb29sCisgKgorICogQ29uc3RydWN0IGEgbmV3IGJ1ZmZlciBwb29sLgorICoKKyAqIFJldHVybnM6IHRoZSBuZXcgcG9vbCwgdXNlIGdzdF9vYmplY3RfdW5yZWYoKSB0byBmcmVlIHJlc291cmNlcworICovCitHc3RCdWZmZXJQb29sICoKK2dzdF92NGwyX2J1ZmZlcl9wb29sX25ldyAoR3N0VjRsMk9iamVjdCAqIG9iaiwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFY0bDJCdWZmZXJQb29sICpwb29sOworICBHc3RTdHJ1Y3R1cmUgKmNvbmZpZzsKKyAgZ2NoYXIgKm5hbWUsICpwYXJlbnRfbmFtZTsKKyAgZ2ludCBmZDsKKworICBmZCA9IG9iai0+ZHVwIChvYmotPnZpZGVvX2ZkKTsKKyAgaWYgKGZkIDwgMCkKKyAgICBnb3RvIGR1cF9mYWlsZWQ7CisKKyAgLyogc2V0dGluZyBhIHNpZ25pZmljYW50IHVuaXF1ZSBuYW1lICovCisgIHBhcmVudF9uYW1lID0gZ3N0X29iamVjdF9nZXRfbmFtZSAoR1NUX09CSkVDVCAob2JqLT5lbGVtZW50KSk7CisgIG5hbWUgPSBnX3N0cmNvbmNhdCAocGFyZW50X25hbWUsICI6IiwgInBvb2w6IiwKKyAgICAgIFY0TDJfVFlQRV9JU19PVVRQVVQgKG9iai0+dHlwZSkgPyAic2luayIgOiAic3JjIiwgTlVMTCk7CisgIGdfZnJlZSAocGFyZW50X25hbWUpOworCisgIHBvb2wgPSAoR3N0VjRsMkJ1ZmZlclBvb2wgKikgZ19vYmplY3RfbmV3IChHU1RfVFlQRV9WNEwyX0JVRkZFUl9QT09MLAorICAgICAgIm5hbWUiLCBuYW1lLCBOVUxMKTsKKyAgZ19vYmplY3RfcmVmX3NpbmsgKHBvb2wpOworICBnX2ZyZWUgKG5hbWUpOworCisgIGdzdF9wb2xsX2ZkX2luaXQgKCZwb29sLT5wb2xsZmQpOworICBwb29sLT5wb2xsZmQuZmQgPSBmZDsKKyAgZ3N0X3BvbGxfYWRkX2ZkIChwb29sLT5wb2xsLCAmcG9vbC0+cG9sbGZkKTsKKyAgaWYgKFY0TDJfVFlQRV9JU19PVVRQVVQgKG9iai0+dHlwZSkpCisgICAgZ3N0X3BvbGxfZmRfY3RsX3dyaXRlIChwb29sLT5wb2xsLCAmcG9vbC0+cG9sbGZkLCBUUlVFKTsKKyAgZWxzZQorICAgIGdzdF9wb2xsX2ZkX2N0bF9yZWFkIChwb29sLT5wb2xsLCAmcG9vbC0+cG9sbGZkLCBUUlVFKTsKKworICBwb29sLT52aWRlb19mZCA9IGZkOworICBwb29sLT5vYmogPSBvYmo7CisgIHBvb2wtPmNhbl9wb2xsX2RldmljZSA9IFRSVUU7CisKKyAgcG9vbC0+dmFsbG9jYXRvciA9IGdzdF92NGwyX2FsbG9jYXRvcl9uZXcgKEdTVF9PQkpFQ1QgKHBvb2wpLCBvYmopOworICBpZiAocG9vbC0+dmFsbG9jYXRvciA9PSBOVUxMKQorICAgIGdvdG8gYWxsb2NhdG9yX2ZhaWxlZDsKKworICBnc3Rfb2JqZWN0X3JlZiAob2JqLT5lbGVtZW50KTsKKworICBjb25maWcgPSBnc3RfYnVmZmVyX3Bvb2xfZ2V0X2NvbmZpZyAoR1NUX0JVRkZFUl9QT09MX0NBU1QgKHBvb2wpKTsKKyAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19zZXRfcGFyYW1zIChjb25maWcsIGNhcHMsIG9iai0+aW5mby5zaXplLCAwLCAwKTsKKyAgLyogVGhpcyB3aWxsIHNpbXBseSBzZXQgYSBkZWZhdWx0IGNvbmZpZywgYnV0IHdpbGwgbm90IGNvbmZpZ3VyZSB0aGUgcG9vbAorICAgKiBiZWNhdXNlIG1pbiBhbmQgbWF4IGFyZSBub3QgdmFsaWQgKi8KKyAgZ3N0X2J1ZmZlcl9wb29sX3NldF9jb25maWcgKEdTVF9CVUZGRVJfUE9PTF9DQVNUIChwb29sKSwgY29uZmlnKTsKKworICByZXR1cm4gR1NUX0JVRkZFUl9QT09MIChwb29sKTsKKworICAvKiBFUlJPUlMgKi8KK2R1cF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1IgKCJmYWlsZWQgdG8gZHVwIGZkICVkICglcykiLCBlcnJubywgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorYWxsb2NhdG9yX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBvb2wsICJGYWlsZWQgdG8gY3JlYXRlIFY0TDIgYWxsb2NhdG9yIik7CisgICAgZ3N0X29iamVjdF91bnJlZiAocG9vbCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92NGwyX2RvX3JlYWQgKEdzdFY0bDJCdWZmZXJQb29sICogcG9vbCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RGbG93UmV0dXJuIHJlczsKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gcG9vbC0+b2JqOworICBnaW50IGFtb3VudDsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdpbnQgdG9yZWFkOworCisgIHRvcmVhZCA9IG9iai0+aW5mby5zaXplOworCisgIEdTVF9MT0dfT0JKRUNUIChwb29sLCAicmVhZGluZyAlZCBieXRlcyBpbnRvIGJ1ZmZlciAlcCIsIHRvcmVhZCwgYnVmKTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKworICBkbyB7CisgICAgaWYgKChyZXMgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9wb2xsIChwb29sKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIHBvbGxfZXJyb3I7CisKKyAgICBhbW91bnQgPSBvYmotPnJlYWQgKG9iai0+dmlkZW9fZmQsIG1hcC5kYXRhLCB0b3JlYWQpOworCisgICAgaWYgKGFtb3VudCA9PSB0b3JlYWQpIHsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZiAoYW1vdW50ID09IC0xKSB7CisgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVJTlRSKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlCisgICAgICAgIGdvdG8gcmVhZF9lcnJvcjsKKyAgICB9IGVsc2UgeworICAgICAgLyogc2hvcnQgcmVhZHMgY2FuIGhhcHBlbiBpZiBhIHNpZ25hbCBpbnRlcnJ1cHRzIHRoZSByZWFkICovCisgICAgICBjb250aW51ZTsKKyAgICB9CisgIH0gd2hpbGUgKFRSVUUpOworCisgIEdTVF9MT0dfT0JKRUNUIChwb29sLCAicmVhZCAlZCBieXRlcyIsIGFtb3VudCk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfcmVzaXplIChidWYsIDAsIGFtb3VudCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworCisgIC8qIEVSUk9SUyAqLworcG9sbF9lcnJvcjoKKyAgeworICAgIEdTVF9ERUJVRyAoInBvbGwgZXJyb3IgJXMiLCBnc3RfZmxvd19nZXRfbmFtZSAocmVzKSk7CisgICAgZ290byBjbGVhbnVwOworICB9CityZWFkX2Vycm9yOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9iai0+ZWxlbWVudCwgUkVTT1VSQ0UsIFJFQUQsCisgICAgICAgIChfKCJFcnJvciByZWFkaW5nICVkIGJ5dGVzIGZyb20gZGV2aWNlICclcycuIiksCisgICAgICAgICAgICB0b3JlYWQsIG9iai0+dmlkZW9kZXYpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICByZXMgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KK2NsZWFudXA6CisgIHsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworICAgIGdzdF9idWZmZXJfcmVzaXplIChidWYsIDAsIDApOworICAgIHJldHVybiByZXM7CisgIH0KK30KKworLyoqCisgKiBnc3RfdjRsMl9idWZmZXJfcG9vbF9wcm9jZXNzOgorICogQGJwb29sOiBhICNHc3RCdWZmZXJQb29sCisgKiBAYnVmOiBhICNHc3RCdWZmZXIsIG1heWJlIGJlIHJlcGxhY2VkCisgKgorICogUHJvY2VzcyBAYnVmIGluIEBicG9vbC4gRm9yIGNhcHR1cmUgZGV2aWNlcywgdGhpcyBmdW5jdGlvbnMgZmlsbHMgQGJ1ZiB3aXRoCisgKiBkYXRhIGZyb20gdGhlIGRldmljZS4gRm9yIG91dHB1dCBkZXZpY2VzLCB0aGlzIGZ1bmN0aW9ucyBzZW5kIHRoZSBjb250ZW50cyBvZgorICogQGJ1ZiB0byB0aGUgZGV2aWNlIGZvciBwbGF5YmFjay4KKyAqCisgKiBSZXR1cm5zOiAlR1NUX0ZMT1dfT0sgb24gc3VjY2Vzcy4KKyAqLworR3N0Rmxvd1JldHVybgorZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcHJvY2VzcyAoR3N0VjRsMkJ1ZmZlclBvb2wgKiBwb29sLCBHc3RCdWZmZXIgKiogYnVmKQoreworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RCdWZmZXJQb29sICpicG9vbCA9IEdTVF9CVUZGRVJfUE9PTF9DQVNUIChwb29sKTsKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gcG9vbC0+b2JqOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHBvb2wsICJwcm9jZXNzIGJ1ZmZlciAlcCIsIGJ1Zik7CisKKyAgaWYgKEdTVF9CVUZGRVJfUE9PTF9JU19GTFVTSElORyAocG9vbCkpCisgICAgcmV0dXJuIEdTVF9GTE9XX0ZMVVNISU5HOworCisgIHN3aXRjaCAob2JqLT50eXBlKSB7CisgICAgY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CisgICAgY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOgorICAgICAgLyogY2FwdHVyZSAqLworICAgICAgc3dpdGNoIChvYmotPm1vZGUpIHsKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19SVzoKKyAgICAgICAgICAvKiBjYXB0dXJlIGludG8gdGhlIGJ1ZmZlciAqLworICAgICAgICAgIHJldCA9IGdzdF92NGwyX2RvX3JlYWQgKHBvb2wsICpidWYpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fTU1BUDoKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19ETUFCVUY6CisgICAgICAgIHsKKyAgICAgICAgICBHc3RCdWZmZXIgKnRtcDsKKworICAgICAgICAgIGlmICgoKmJ1ZiktPnBvb2wgPT0gYnBvb2wpIHsKKyAgICAgICAgICAgIGd1aW50IG51bV9xdWV1ZWQ7CisgICAgICAgICAgICBnc2l6ZSBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoKmJ1Zik7CisKKyAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgICAgaWYgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKCpidWYsIEdTVF9CVUZGRVJfRkxBR19DT1JSVVBURUQpKQorICAgICAgICAgICAgICAgIGdvdG8gYnVmZmVyX2NvcnJ1cHRlZDsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdvdG8gZW9zOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBudW1fcXVldWVkID0gZ19hdG9taWNfaW50X2dldCAoJnBvb2wtPm51bV9xdWV1ZWQpOworICAgICAgICAgICAgR1NUX1RSQUNFX09CSkVDVCAocG9vbCwgIk9ubHkgJWkgYnVmZmVyIGxlZnQgaW4gdGhlIGNhcHR1cmUgcXVldWUuIiwKKyAgICAgICAgICAgICAgICBudW1fcXVldWVkKTsKKworICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBubyBtb3JlIGJ1ZmZlciwgYW5kIGNhbiBhbGxvY2F0ZSBpdCB0aW1lIHRvIGRvIHNvICovCisgICAgICAgICAgICBpZiAobnVtX3F1ZXVlZCA9PSAwKSB7CisgICAgICAgICAgICAgIGlmIChHU1RfVjRMMl9BTExPQ0FUT1JfQ0FOX0FMTE9DQVRFIChwb29sLT52YWxsb2NhdG9yLCBNTUFQKSkgeworICAgICAgICAgICAgICAgIHJldCA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX3Jlc3VyZWN0X2J1ZmZlciAocG9vbCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBzdGFydCBjb3B5aW5nIGJ1ZmZlcnMgd2hlbiB3ZSBhcmUgcnVubmluZyBsb3cgb24gYnVmZmVycyAqLworICAgICAgICAgICAgaWYgKG51bV9xdWV1ZWQgPCBwb29sLT5jb3B5X3RocmVzaG9sZCkgeworICAgICAgICAgICAgICBHc3RCdWZmZXIgKmNvcHk7CisKKyAgICAgICAgICAgICAgaWYgKEdTVF9WNEwyX0FMTE9DQVRPUl9DQU5fQUxMT0NBVEUgKHBvb2wtPnZhbGxvY2F0b3IsIE1NQVApKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcmVzdXJlY3RfYnVmZmVyIChwb29sKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogY29weSB0aGUgYnVmZmVyICovCisgICAgICAgICAgICAgIGNvcHkgPSBnc3RfYnVmZmVyX2NvcHlfcmVnaW9uICgqYnVmLAorICAgICAgICAgICAgICAgICAgR1NUX0JVRkZFUl9DT1BZX0FMTCB8IEdTVF9CVUZGRVJfQ09QWV9ERUVQLCAwLCAtMSk7CisgICAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwb29sLCAiY29weSBidWZmZXIgJXAtPiVwIiwgKmJ1ZiwgY29weSk7CisKKyAgICAgICAgICAgICAgLyogYW5kIHJlcXVldWUgc28gdGhhdCB3ZSBjYW4gY29udGludWUgY2FwdHVyaW5nICovCisgICAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKCpidWYpOworICAgICAgICAgICAgICAqYnVmID0gY29weTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0ID0gR1NUX0ZMT1dfT0s7CisgICAgICAgICAgICAvKiBub3RoaW5nLCBkYXRhIHdhcyBpbnNpZGUgdGhlIGJ1ZmZlciB3aGVuIHdlIGRpZCBfYWNxdWlyZSgpICovCisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogYnVmZmVyIG5vdCBmcm9tIG91ciBwb29sLCBncmFiIGEgZnJhbWUgYW5kIGNvcHkgaXQgaW50byB0aGUgdGFyZ2V0ICovCisgICAgICAgICAgaWYgKChyZXQgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9kcWJ1ZiAocG9vbCwgJnRtcCkpICE9IEdTVF9GTE9XX09LKQorICAgICAgICAgICAgZ290byBkb25lOworCisgICAgICAgICAgLyogQW4gZW1wdHkgYnVmZmVyIG9uIGNhcHR1cmUgaW5kaWNhdGVzIHRoZSBlbmQgb2Ygc3RyZWFtICovCisgICAgICAgICAgaWYgKGdzdF9idWZmZXJfZ2V0X3NpemUgKHRtcCkgPT0gMCkgeworICAgICAgICAgICAgZ2Jvb2xlYW4gY29ycnVwdGVkID0gR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAodG1wLAorICAgICAgICAgICAgICAgIEdTVF9CVUZGRVJfRkxBR19DT1JSVVBURUQpOworCisgICAgICAgICAgICBnc3RfdjRsMl9idWZmZXJfcG9vbF9yZWxlYXNlX2J1ZmZlciAoYnBvb2wsIHRtcCk7CisKKyAgICAgICAgICAgIGlmIChjb3JydXB0ZWQpCisgICAgICAgICAgICAgIGdvdG8gYnVmZmVyX2NvcnJ1cHRlZDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZ290byBlb3M7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0ID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfY29weV9idWZmZXIgKHBvb2wsICpidWYsIHRtcCk7CisKKyAgICAgICAgICAvKiBhbiBxdWV1ZSB0aGUgYnVmZmVyIGFnYWluIGFmdGVyIHRoZSBjb3B5ICovCisgICAgICAgICAgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcmVsZWFzZV9idWZmZXIgKGJwb29sLCB0bXApOworCisgICAgICAgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgICAgICAgIGdvdG8gY29weV9mYWlsZWQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX1VTRVJQVFI6CisgICAgICAgIHsKKyAgICAgICAgICBzdHJ1Y3QgVXNlclB0ckRhdGEgKmRhdGE7CisgICAgICAgICAgR3N0QnVmZmVyICp0bXA7CisKKyAgICAgICAgICAvKiBSZXBsYWNlIG91ciBidWZmZXIgd2l0aCBkb3duc3RyZWFtIGFsbG9jYXRlZCBidWZmZXIgKi8KKyAgICAgICAgICBkYXRhID0gZ3N0X21pbmlfb2JqZWN0X3N0ZWFsX3FkYXRhIChHU1RfTUlOSV9PQkpFQ1QgKCpidWYpLAorICAgICAgICAgICAgICBHU1RfVjRMMl9JTVBPUlRfUVVBUkspOworICAgICAgICAgIHRtcCA9IGdzdF9idWZmZXJfcmVmIChkYXRhLT5idWZmZXIpOworICAgICAgICAgIF91bm1hcF91c2VycHRyX2ZyYW1lIChkYXRhKTsKKworICAgICAgICAgIC8qIE5vdyB0bXAgaXMgd3JpdGFibGUsIGNvcHkgdGhlIGZsYWdzIGFuZCB0aW1lc3RhbXAgKi8KKyAgICAgICAgICBnc3RfYnVmZmVyX2NvcHlfaW50byAodG1wLCAqYnVmLAorICAgICAgICAgICAgICBHU1RfQlVGRkVSX0NPUFlfRkxBR1MgfCBHU1RfQlVGRkVSX0NPUFlfVElNRVNUQU1QUywgMCwgLTEpOworCisgICAgICAgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlIChidWYsIHRtcCk7CisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAodG1wKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGX0lNUE9SVDoKKyAgICAgICAgeworICAgICAgICAgIEdzdEJ1ZmZlciAqdG1wOworCisgICAgICAgICAgLyogUmVwbGFjZSBvdXIgYnVmZmVyIHdpdGggZG93bnN0cmVhbSBhbGxvY2F0ZWQgYnVmZmVyICovCisgICAgICAgICAgdG1wID0gZ3N0X21pbmlfb2JqZWN0X3N0ZWFsX3FkYXRhIChHU1RfTUlOSV9PQkpFQ1QgKCpidWYpLAorICAgICAgICAgICAgICBHU1RfVjRMMl9JTVBPUlRfUVVBUkspOworCisgICAgICAgICAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKHRtcCwgKmJ1ZiwKKyAgICAgICAgICAgICAgR1NUX0JVRkZFUl9DT1BZX0ZMQUdTIHwgR1NUX0JVRkZFUl9DT1BZX1RJTUVTVEFNUFMsIDAsIC0xKTsKKworICAgICAgICAgIGdzdF9idWZmZXJfcmVwbGFjZSAoYnVmLCB0bXApOworICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHRtcCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgorICAgIGNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOgorICAgICAgLyogcGxheWJhY2sgKi8KKyAgICAgIHN3aXRjaCAob2JqLT5tb2RlKSB7CisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fUlc6CisgICAgICAgICAgLyogRklYTUUsIGRvIHdyaXRlKCkgKi8KKyAgICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHBvb2wsICJpbXBsZW1lbnQgd3JpdGUoKSIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgR1NUX1Y0TDJfSU9fVVNFUlBUUjoKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19ETUFCVUZfSU1QT1JUOgorICAgICAgICBjYXNlIEdTVF9WNEwyX0lPX0RNQUJVRjoKKyAgICAgICAgY2FzZSBHU1RfVjRMMl9JT19NTUFQOgorICAgICAgICB7CisgICAgICAgICAgR3N0QnVmZmVyICp0b19xdWV1ZSA9IE5VTEw7CisgICAgICAgICAgR3N0VjRsMk1lbW9yeUdyb3VwICpncm91cDsKKyAgICAgICAgICBnaW50IGluZGV4OworCisgICAgICAgICAgaWYgKCgqYnVmKS0+cG9vbCAhPSBicG9vbCkKKyAgICAgICAgICAgIGdvdG8gY29weWluZzsKKworICAgICAgICAgIGlmICghZ3N0X3Y0bDJfaXNfYnVmZmVyX3ZhbGlkICgqYnVmLCAmZ3JvdXApKQorICAgICAgICAgICAgZ290byBjb3B5aW5nOworCisgICAgICAgICAgaW5kZXggPSBncm91cC0+YnVmZmVyLmluZGV4OworCisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHBvb2wsICJwcm9jZXNzaW5nIGJ1ZmZlciAlaSBmcm9tIG91ciBwb29sIiwgaW5kZXgpOworCisgICAgICAgICAgaWYgKHBvb2wtPmJ1ZmZlcnNbaW5kZXhdICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEdTVF9MT0dfT0JKRUNUIChwb29sLCAiYnVmZmVyICVpIGFscmVhZHkgcXVldWVkLCBjb3B5aW5nIiwgaW5kZXgpOworICAgICAgICAgICAgZ290byBjb3B5aW5nOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIHdlIGNhbiBxdWV1ZSBkaXJlY3RseSAqLworICAgICAgICAgIHRvX3F1ZXVlID0gZ3N0X2J1ZmZlcl9yZWYgKCpidWYpOworCisgICAgICAgIGNvcHlpbmc6CisgICAgICAgICAgaWYgKHRvX3F1ZXVlID09IE5VTEwpIHsKKyAgICAgICAgICAgIEdzdEJ1ZmZlclBvb2xBY3F1aXJlUGFyYW1zIHBhcmFtcyA9IHsgMCB9OworCisgICAgICAgICAgICBHU1RfTE9HX09CSkVDVCAocG9vbCwgImFsbG9jIGJ1ZmZlciBmcm9tIG91ciBwb29sIik7CisKKyAgICAgICAgICAgIC8qIHRoaXMgY2FuIHJldHVybiBFT1MgaWYgYWxsIGJ1ZmZlcnMgYXJlIG91dHN0YW5kaW5nIHdoaWNoIHdvdWxkCisgICAgICAgICAgICAgKiBiZSBzdHJhbmdlIGJlY2F1c2Ugd2Ugd291bGQgZXhwZWN0IHRoZSB1cHN0cmVhbSBlbGVtZW50IHRvIGhhdmUKKyAgICAgICAgICAgICAqIGFsbG9jYXRlZCB0aGVtIGFuZCByZXR1cm5lZCB0byB1cy4uICovCisgICAgICAgICAgICBwYXJhbXMuZmxhZ3MgPSBHU1RfQlVGRkVSX1BPT0xfQUNRVUlSRV9GTEFHX0RPTlRXQUlUOworICAgICAgICAgICAgcmV0ID0gZ3N0X2J1ZmZlcl9wb29sX2FjcXVpcmVfYnVmZmVyIChicG9vbCwgJnRvX3F1ZXVlLCAmcGFyYW1zKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICAgIGdvdG8gYWNxdWlyZV9mYWlsZWQ7CisKKyAgICAgICAgICAgIHJldCA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX3ByZXBhcmVfYnVmZmVyIChwb29sLCB0b19xdWV1ZSwgKmJ1Zik7CisgICAgICAgICAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgICAgICAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHRvX3F1ZXVlKTsKKyAgICAgICAgICAgICAgZ290byBwcmVwYXJlX2ZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoKHJldCA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX3FidWYgKHBvb2wsIHRvX3F1ZXVlKSkgIT0gR1NUX0ZMT1dfT0spCisgICAgICAgICAgICBnb3RvIHF1ZXVlX2ZhaWxlZDsKKworICAgICAgICAgIC8qIGlmIHdlIGFyZSBub3Qgc3RyZWFtaW5nIHlldCAodGhpcyBpcyB0aGUgZmlyc3QgYnVmZmVyLCBzdGFydAorICAgICAgICAgICAqIHN0cmVhbWluZyBub3cgKi8KKyAgICAgICAgICBpZiAoIWdzdF92NGwyX2J1ZmZlcl9wb29sX3N0cmVhbW9uIChwb29sKSkgeworICAgICAgICAgICAgLyogZG9uJ3QgY2hlY2sgcmV0dXJuIHZhbHVlIGJlY2F1c2UgcWJ1ZiB3b3VsZCBoYXZlIGZhaWxlZCAqLworICAgICAgICAgICAgZ3N0X3Y0bDJfaXNfYnVmZmVyX3ZhbGlkICh0b19xdWV1ZSwgJmdyb3VwKTsKKworICAgICAgICAgICAgLyogcWJ1ZiBoYXMgc3RvcmVkIHRvX3F1ZXVlIGJ1ZmZlciBidXQgd2UgYXJlIG5vdCBpbgorICAgICAgICAgICAgICogc3RyZWFtaW5nIHN0YXRlLCBzbyB0aGUgZmx1c2ggbG9naWMgd29uJ3QgYmUgcGVyZm9ybWVkLgorICAgICAgICAgICAgICogVG8gYXZvaWQgbGVha3MsIGZsdXNoIHRoZSBhbGxvY2F0b3IgYW5kIHJlc3RvcmUgdGhlIHF1ZXVlZAorICAgICAgICAgICAgICogYnVmZmVyIGFzIG5vbi1xdWV1ZWQgKi8KKyAgICAgICAgICAgIGdzdF92NGwyX2FsbG9jYXRvcl9mbHVzaCAocG9vbC0+dmFsbG9jYXRvcik7CisKKyAgICAgICAgICAgIHBvb2wtPmJ1ZmZlcnNbZ3JvdXAtPmJ1ZmZlci5pbmRleF0gPSBOVUxMOworCisgICAgICAgICAgICBnc3RfbWluaV9vYmplY3Rfc2V0X3FkYXRhIChHU1RfTUlOSV9PQkpFQ1QgKHRvX3F1ZXVlKSwKKyAgICAgICAgICAgICAgICBHU1RfVjRMMl9JTVBPUlRfUVVBUkssIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAodG9fcXVldWUpOworICAgICAgICAgICAgZ19hdG9taWNfaW50X2FkZCAoJnBvb2wtPm51bV9xdWV1ZWQsIC0xKTsKKyAgICAgICAgICAgIGdvdG8gc3RhcnRfZmFpbGVkOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIFJlbW92ZSBvdXIgcmVmLCB3ZSB3aWxsIHN0aWxsIGhvbGQgdGhpcyBidWZmZXIgaW4gYWNxdWlyZSBhcyBuZWVkZWQsCisgICAgICAgICAgICogb3RoZXJ3aXNlIHRoZSBwb29sIHdpbGwgdGhpbmsgaXQgaXMgb3V0c3RhbmRpbmcgYW5kIHdpbGwgcmVmdXNlIHRvIHN0b3AuICovCisgICAgICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAodG9fcXVldWUpOworCisgICAgICAgICAgaWYgKGdfYXRvbWljX2ludF9nZXQgKCZwb29sLT5udW1fcXVldWVkKSA+PSBwb29sLT5taW5fbGF0ZW5jeSkgeworICAgICAgICAgICAgR3N0QnVmZmVyICpvdXQ7CisgICAgICAgICAgICAvKiBhbGwgYnVmZmVycyBhcmUgcXVldWVkLCB0cnkgdG8gZGVxdWV1ZSBvbmUgYW5kIHJlbGVhc2UgaXQgYmFjaworICAgICAgICAgICAgICogaW50byB0aGUgcG9vbCBzbyB0aGF0IF9hY3F1aXJlIGNhbiBnZXQgdG8gaXQgYWdhaW4uICovCisgICAgICAgICAgICByZXQgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9kcWJ1ZiAocG9vbCwgJm91dCk7CisgICAgICAgICAgICBpZiAocmV0ID09IEdTVF9GTE9XX09LICYmIG91dC0+cG9vbCA9PSBOVUxMKQorICAgICAgICAgICAgICAvKiByZWxlYXNlIHRoZSByZW5kZXJlZCBidWZmZXIgYmFjayBpbnRvIHRoZSBwb29sLiBUaGlzIHdha2VzIHVwIGFueQorICAgICAgICAgICAgICAgKiB0aHJlYWQgd2FpdGluZyBmb3IgYSBidWZmZXIgaW4gX2FjcXVpcmUoKS4gKi8KKyAgICAgICAgICAgICAgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcmVsZWFzZV9idWZmZXIgKGJwb29sLCBvdXQpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgYnJlYWs7CisgIH0KK2RvbmU6CisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1JTICovCitjb3B5X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBvb2wsICJmYWlsZWQgdG8gY29weSBidWZmZXIiKTsKKyAgICByZXR1cm4gcmV0OworICB9CitidWZmZXJfY29ycnVwdGVkOgorICB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwb29sLCAiRHJvcHBpbmcgY29ycnVwdGVkIGJ1ZmZlciB3aXRob3V0IHBheWxvYWQiKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmICgqYnVmKTsKKyAgICAqYnVmID0gTlVMTDsKKyAgICByZXR1cm4gR1NUX1Y0TDJfRkxPV19DT1JSVVBURURfQlVGRkVSOworICB9Citlb3M6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChwb29sLCAiZW5kIG9mIHN0cmVhbSByZWFjaGVkIik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoKmJ1Zik7CisgICAgKmJ1ZiA9IE5VTEw7CisgICAgcmV0dXJuIEdTVF9WNEwyX0ZMT1dfTEFTVF9CVUZGRVI7CisgIH0KK2FjcXVpcmVfZmFpbGVkOgorICB7CisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19GTFVTSElORykKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHBvb2wsICJmbHVzaGluZyIpOworICAgIGVsc2UKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocG9vbCwgImZhaWxlZCB0byBhY3F1aXJlIGEgYnVmZmVyOiAlcyIsCisgICAgICAgICAgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworICAgIHJldHVybiByZXQ7CisgIH0KK3ByZXBhcmVfZmFpbGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAocG9vbCwgImZhaWxlZCB0byBwcmVwYXJlIGRhdGEiKTsKKyAgICByZXR1cm4gcmV0OworICB9CitxdWV1ZV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChwb29sLCAiZmFpbGVkIHRvIHF1ZXVlIGJ1ZmZlciIpOworICAgIHJldHVybiByZXQ7CisgIH0KK3N0YXJ0X2ZhaWxlZDoKKyAgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHBvb2wsICJmYWlsZWQgdG8gc3RhcnQgc3RyZWFtaW5nIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9Cit9CisKK3ZvaWQKK2dzdF92NGwyX2J1ZmZlcl9wb29sX3NldF9vdGhlcl9wb29sIChHc3RWNGwyQnVmZmVyUG9vbCAqIHBvb2wsCisgICAgR3N0QnVmZmVyUG9vbCAqIG90aGVyX3Bvb2wpCit7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKCFnc3RfYnVmZmVyX3Bvb2xfaXNfYWN0aXZlIChHU1RfQlVGRkVSX1BPT0wgKHBvb2wpKSk7CisKKyAgaWYgKHBvb2wtPm90aGVyX3Bvb2wpCisgICAgZ3N0X29iamVjdF91bnJlZiAocG9vbC0+b3RoZXJfcG9vbCk7CisgIHBvb2wtPm90aGVyX3Bvb2wgPSBnc3Rfb2JqZWN0X3JlZiAob3RoZXJfcG9vbCk7Cit9CisKK3ZvaWQKK2dzdF92NGwyX2J1ZmZlcl9wb29sX2NvcHlfYXRfdGhyZXNob2xkIChHc3RWNGwyQnVmZmVyUG9vbCAqIHBvb2wsIGdib29sZWFuIGNvcHkpCit7CisgIEdTVF9PQkpFQ1RfTE9DSyAocG9vbCk7CisgIHBvb2wtPmVuYWJsZV9jb3B5X3RocmVzaG9sZCA9IGNvcHk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChwb29sKTsKK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX2J1ZmZlcl9wb29sX2ZsdXNoIChHc3RCdWZmZXJQb29sICogYnBvb2wpCit7CisgIEdzdFY0bDJCdWZmZXJQb29sICpwb29sID0gR1NUX1Y0TDJfQlVGRkVSX1BPT0wgKGJwb29sKTsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICBnc3RfdjRsMl9idWZmZXJfcG9vbF9zdHJlYW1vZmYgKHBvb2wpOworCisgIGlmICghVjRMMl9UWVBFX0lTX09VVFBVVCAocG9vbC0+b2JqLT50eXBlKSkKKyAgICByZXQgPSBnc3RfdjRsMl9idWZmZXJfcG9vbF9zdHJlYW1vbiAocG9vbCk7CisKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJidWZmZXJwb29sLmggYi9zeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZmZjNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwyYnVmZmVycG9vbC5oCkBAIC0wLDAgKzEsMTE0IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAgICAgICAgICAgICAgIDIwMDYgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKyAqICAgICAgICAgICAgICAgMjAwOSBUZXhhcyBJbnN0cnVtZW50cywgSW5jIC0gaHR0cDovL3d3dy50aS5jb20vCisgKgorICogZ3N0djRsMmJ1ZmZlcnBvb2wuaCBWNEwyIGJ1ZmZlciBwb29sIGNsYXNzCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9WNEwyX0JVRkZFUl9QT09MX0hfXworI2RlZmluZSBfX0dTVF9WNEwyX0JVRkZFUl9QT09MX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMkJ1ZmZlclBvb2wgR3N0VjRsMkJ1ZmZlclBvb2w7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMkJ1ZmZlclBvb2xDbGFzcyBHc3RWNGwyQnVmZmVyUG9vbENsYXNzOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJNZXRhIEdzdFY0bDJNZXRhOworCisjaW5jbHVkZSAiZ3N0djRsMm9iamVjdC5oIgorI2luY2x1ZGUgImdzdHY0bDJhbGxvY2F0b3IuaCIKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1Y0TDJfQlVGRkVSX1BPT0wgICAgICAoZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfQlVGRkVSX1BPT0wob2JqKSAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX1Y0TDJfQlVGRkVSX1BPT0wpKQorI2RlZmluZSBHU1RfVjRMMl9CVUZGRVJfUE9PTChvYmopICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfVjRMMl9CVUZGRVJfUE9PTCwgR3N0VjRsMkJ1ZmZlclBvb2wpKQorI2RlZmluZSBHU1RfVjRMMl9CVUZGRVJfUE9PTF9DQVNUKG9iaikgKChHc3RWNGwyQnVmZmVyUG9vbCopKG9iaikpCisKKy8qIFRoaXMgZmxvdyByZXR1cm4gaXMgdXNlZCB0byBpbmRpY2F0ZWQgdGhhdCB0aGUgbGFzdCBidWZmZXIgb2YgYQorICogZHJhaW4gb3IgYSByZXNvbHR1aW9uIGNoYW5nZSBoYXMgYmVlbiBmb3VuZC4gVGhpcyBzaG91bGQgbm9ybWFsbHkKKyAqIG9ubHkgb2NjdXJlIGZvciBtZW0tMi1tZW0gZGV2aWNlcy4gKi8KKyNkZWZpbmUgR1NUX1Y0TDJfRkxPV19MQVNUX0JVRkZFUiBHU1RfRkxPV19DVVNUT01fU1VDQ0VTUworCisvKiBUaGlzIGZsb3cgcmV0dXJuIGlzIHVzZWQgdG8gaW5kaWNhdGVkIHRoYXQgdGhlIHJldHVybmVkIGJ1ZmZlciB3YXMgbWFya2VkCisgKiB3aXRoIHRoZSBlcnJvciBmbGFnIGFuZCBoYWQgbm8gcGF5bG9hZC4gVGhpcyBlcnJvciBzaG91bGQgYmUgcmVjb3ZlcmVkIGJ5CisgKiBzaW1wbHkgd2FpdGluZyBmb3IgbmV4dCBidWZmZXIuICovCisjZGVmaW5lIEdTVF9WNEwyX0ZMT1dfQ09SUlVQVEVEX0JVRkZFUiBHU1RfRkxPV19DVVNUT01fU1VDQ0VTU18xCisKK3N0cnVjdCBfR3N0VjRsMkJ1ZmZlclBvb2wKK3sKKyAgR3N0QnVmZmVyUG9vbCBwYXJlbnQ7CisKKyAgR3N0VjRsMk9iamVjdCAqb2JqOyAgICAgICAgLyogdGhlIHY0bDIgb2JqZWN0ICovCisgIGdpbnQgdmlkZW9fZmQ7ICAgICAgICAgICAgIC8qIGEgZHVwKDIpIG9mIHRoZSB2NGwyb2JqZWN0J3MgdmlkZW9fZmQgKi8KKyAgR3N0UG9sbCAqcG9sbDsgICAgICAgICAgICAgLyogYSBwb2xsIGZvciB2aWRlb19mZCAqLworICBHc3RQb2xsRkQgcG9sbGZkOworICBnYm9vbGVhbiBjYW5fcG9sbF9kZXZpY2U7CisKKyAgZ2Jvb2xlYW4gZW1wdHk7CisgIEdDb25kIGVtcHR5X2NvbmQ7CisKKyAgR3N0VjRsMkFsbG9jYXRvciAqdmFsbG9jYXRvcjsKKyAgR3N0QWxsb2NhdG9yICphbGxvY2F0b3I7CisgIEdzdEFsbG9jYXRpb25QYXJhbXMgcGFyYW1zOworICBHc3RCdWZmZXJQb29sICpvdGhlcl9wb29sOworICBndWludCBzaXplOworICBHc3RWaWRlb0luZm8gY2Fwc19pbmZvOyAgIC8qIERlZmF1bHQgdmlkZW8gaW5mb3JtYXRpb24gKi8KKworICBnYm9vbGVhbiBhZGRfdmlkZW9tZXRhOyAgICAvKiBzZXQgaWYgdmlkZW8gbWV0YSBzaG91bGQgYmUgYWRkZWQgKi8KKyAgZ2Jvb2xlYW4gZW5hYmxlX2NvcHlfdGhyZXNob2xkOyAvKiBJZiBjb3B5X3RocmVzaG9sZCBzaG91bGQgYmUgc2V0ICovCisKKyAgZ3VpbnQgbWluX2xhdGVuY3k7ICAgICAgICAgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgd2Ugd2lsbCBob2xkICovCisgIGd1aW50IG1heF9sYXRlbmN5OyAgICAgICAgIC8qIG51bWJlciBvZiBidWZmZXJzIHdlIGNhbiBob2xkICovCisgIGd1aW50IG51bV9xdWV1ZWQ7ICAgICAgICAgIC8qIG51bWJlciBvZiBidWZmZXJzIHF1ZXVlZCBpbiB0aGUgZHJpdmVyICovCisgIGd1aW50IGNvcHlfdGhyZXNob2xkOyAgICAgIC8qIHdoZW4gb3VyIHBvb2wgcnVucyBsb3dlciwgc3RhcnQgaGFuZGluZyBvdXQgY29waWVzICovCisKKyAgZ2Jvb2xlYW4gc3RyZWFtaW5nOworICBnYm9vbGVhbiBmbHVzaGluZzsKKworICBHc3RCdWZmZXIgKmJ1ZmZlcnNbVklERU9fTUFYX0ZSQU1FXTsKKworICAvKiBzaWduYWwgaGFuZGxlcnMgKi8KKyAgZ3Vsb25nIGdyb3VwX3JlbGVhc2VkX2hhbmRsZXI7CisKKyAgLyogQ29udHJvbCB0byB3YXJuIG9ubHkgb25jZSBvbiBidWdneSBmZWlsZCBkcml2ZXIgYnVnICovCisgIGdib29sZWFuIGhhc193YXJuZWRfb25fYnVnZ3lfZmllbGQ7Cit9OworCitzdHJ1Y3QgX0dzdFY0bDJCdWZmZXJQb29sQ2xhc3MKK3sKKyAgR3N0QnVmZmVyUG9vbENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF92NGwyX2J1ZmZlcl9wb29sX2dldF90eXBlICh2b2lkKTsKKworR3N0QnVmZmVyUG9vbCAqICAgICBnc3RfdjRsMl9idWZmZXJfcG9vbF9uZXcgICAgIChHc3RWNGwyT2JqZWN0ICpvYmosIEdzdENhcHMgKmNhcHMpOworCitHc3RGbG93UmV0dXJuICAgICAgIGdzdF92NGwyX2J1ZmZlcl9wb29sX3Byb2Nlc3MgKEdzdFY0bDJCdWZmZXJQb29sICogYnBvb2wsIEdzdEJ1ZmZlciAqKiBidWYpOworCit2b2lkICAgICAgICAgICAgICAgIGdzdF92NGwyX2J1ZmZlcl9wb29sX3NldF9vdGhlcl9wb29sIChHc3RWNGwyQnVmZmVyUG9vbCAqIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RCdWZmZXJQb29sICogb3RoZXJfcG9vbCk7Cit2b2lkICAgICAgICAgICAgICAgIGdzdF92NGwyX2J1ZmZlcl9wb29sX2NvcHlfYXRfdGhyZXNob2xkIChHc3RWNGwyQnVmZmVyUG9vbCAqIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYm9vbGVhbiBjb3B5KTsKKworZ2Jvb2xlYW4gICAgICAgICAgICBnc3RfdjRsMl9idWZmZXJfcG9vbF9mbHVzaCAgIChHc3RCdWZmZXJQb29sICpwb29sKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qX19HU1RfVjRMMl9CVUZGRVJfUE9PTF9IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuYyBiL3N5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGM2YmE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMmNvbG9yYmFsYW5jZS5jCkBAIC0wLDAgKzEsMTAwIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogICAgICAgICAgICAgICAyMDA2IEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+CisgKgorICogZ3N0djRsMmNvbG9yYmFsYW5jZS5jOiBjb2xvciBiYWxhbmNlIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgVjRMMgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlICJnc3R2NGwyY29sb3JiYWxhbmNlLmgiCisjaW5jbHVkZSAiZ3N0djRsMm9iamVjdC5oIgorCisjZGVmaW5lIGdzdF92NGwyX2NvbG9yX2JhbGFuY2VfY2hhbm5lbF9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RWNGwyQ29sb3JCYWxhbmNlQ2hhbm5lbCwKKyAgICBnc3RfdjRsMl9jb2xvcl9iYWxhbmNlX2NoYW5uZWwsIEdTVF9UWVBFX0NPTE9SX0JBTEFOQ0VfQ0hBTk5FTCk7CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9jb2xvcl9iYWxhbmNlX2NoYW5uZWxfY2xhc3NfaW5pdCAoR3N0VjRsMkNvbG9yQmFsYW5jZUNoYW5uZWxDbGFzcyAqCisgICAga2xhc3MpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9jb2xvcl9iYWxhbmNlX2NoYW5uZWxfaW5pdCAoR3N0VjRsMkNvbG9yQmFsYW5jZUNoYW5uZWwgKiBjaGFubmVsKQoreworICBjaGFubmVsLT5pZCA9IChndWludDMyKSAtIDE7Cit9CisKK3N0YXRpYyBHX0dOVUNfVU5VU0VEIGdib29sZWFuCitnc3RfdjRsMl9jb2xvcl9iYWxhbmNlX2NvbnRhaW5zX2NoYW5uZWwgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIEdzdFY0bDJDb2xvckJhbGFuY2VDaGFubmVsICogdjRsMmNoYW5uZWwpCit7CisgIGNvbnN0IEdMaXN0ICppdGVtOworCisgIGZvciAoaXRlbSA9IHY0bDJvYmplY3QtPmNvbG9yczsgaXRlbSAhPSBOVUxMOyBpdGVtID0gaXRlbS0+bmV4dCkKKyAgICBpZiAoaXRlbS0+ZGF0YSA9PSB2NGwyY2hhbm5lbCkKKyAgICAgIHJldHVybiBUUlVFOworCisgIHJldHVybiBGQUxTRTsKK30KKworY29uc3QgR0xpc3QgKgorZ3N0X3Y0bDJfY29sb3JfYmFsYW5jZV9saXN0X2NoYW5uZWxzIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCkKK3sKKyAgcmV0dXJuIHY0bDJvYmplY3QtPmNvbG9yczsKK30KKwordm9pZAorZ3N0X3Y0bDJfY29sb3JfYmFsYW5jZV9zZXRfdmFsdWUgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIEdzdENvbG9yQmFsYW5jZUNoYW5uZWwgKiBjaGFubmVsLCBnaW50IHZhbHVlKQoreworCisgIEdzdFY0bDJDb2xvckJhbGFuY2VDaGFubmVsICp2NGwyY2hhbm5lbCA9CisgICAgICBHU1RfVjRMMl9DT0xPUl9CQUxBTkNFX0NIQU5ORUwgKGNoYW5uZWwpOworCisgIC8qIGFzc2VydCB0aGF0IHdlJ3JlIG9wZW5lZCBhbmQgdGhhdCB3ZSdyZSB1c2luZyBhIGtub3duIGl0ZW0gKi8KKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpOworICBnX3JldHVybl9pZl9mYWlsIChnc3RfdjRsMl9jb2xvcl9iYWxhbmNlX2NvbnRhaW5zX2NoYW5uZWwgKHY0bDJvYmplY3QsCisgICAgICAgICAgdjRsMmNoYW5uZWwpKTsKKworICBnc3RfdjRsMl9zZXRfYXR0cmlidXRlICh2NGwyb2JqZWN0LCB2NGwyY2hhbm5lbC0+aWQsIHZhbHVlKTsKK30KKworZ2ludAorZ3N0X3Y0bDJfY29sb3JfYmFsYW5jZV9nZXRfdmFsdWUgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIEdzdENvbG9yQmFsYW5jZUNoYW5uZWwgKiBjaGFubmVsKQoreworICBHc3RWNGwyQ29sb3JCYWxhbmNlQ2hhbm5lbCAqdjRsMmNoYW5uZWwgPQorICAgICAgR1NUX1Y0TDJfQ09MT1JfQkFMQU5DRV9DSEFOTkVMIChjaGFubmVsKTsKKyAgZ2ludCB2YWx1ZTsKKworICAvKiBhc3NlcnQgdGhhdCB3ZSdyZSBvcGVuZWQgYW5kIHRoYXQgd2UncmUgdXNpbmcgYSBrbm93biBpdGVtICovCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSwgMCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChnc3RfdjRsMl9jb2xvcl9iYWxhbmNlX2NvbnRhaW5zX2NoYW5uZWwgKHY0bDJvYmplY3QsCisgICAgICAgICAgdjRsMmNoYW5uZWwpLCAwKTsKKworICBpZiAoIWdzdF92NGwyX2dldF9hdHRyaWJ1dGUgKHY0bDJvYmplY3QsIHY0bDJjaGFubmVsLT5pZCwgJnZhbHVlKSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gdmFsdWU7Cit9CmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmggYi9zeXMvdjRsMi9nc3R2NGwyY29sb3JiYWxhbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiYTdhYgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJjb2xvcmJhbGFuY2UuaApAQCAtMCwwICsxLDExMSBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqICAgICAgICAgICAgICAgMjAwNiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICoKKyAqIGdzdHY0bDJjb2xvcmJhbGFuY2UuaDogY29sb3IgYmFsYW5jZSBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIFY0TDIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1Y0TDJfQ09MT1JfQkFMQU5DRV9IX18KKyNkZWZpbmUgX19HU1RfVjRMMl9DT0xPUl9CQUxBTkNFX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9jb2xvcmJhbGFuY2UuaD4KKworI2luY2x1ZGUgImdzdHY0bDJvYmplY3QuaCIKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1Y0TDJfQ09MT1JfQkFMQU5DRV9DSEFOTkVMIFwKKyAgKGdzdF92NGwyX2NvbG9yX2JhbGFuY2VfY2hhbm5lbF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX1Y0TDJfQ09MT1JfQkFMQU5DRV9DSEFOTkVMKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9WNEwyX0NPTE9SX0JBTEFOQ0VfQ0hBTk5FTCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFY0bDJDb2xvckJhbGFuY2VDaGFubmVsKSkKKyNkZWZpbmUgR1NUX1Y0TDJfQ09MT1JfQkFMQU5DRV9DSEFOTkVMX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfVjRMMl9DT0xPUl9CQUxBTkNFX0NIQU5ORUwsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RWNGwyQ29sb3JCYWxhbmNlQ2hhbm5lbENsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfQ09MT1JfQkFMQU5DRV9DSEFOTkVMKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9WNEwyX0NPTE9SX0JBTEFOQ0VfQ0hBTk5FTCkpCisjZGVmaW5lIEdTVF9JU19WNEwyX0NPTE9SX0JBTEFOQ0VfQ0hBTk5FTF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChrbGFzcyksIEdTVF9UWVBFX1Y0TDJfQ09MT1JfQkFMQU5DRV9DSEFOTkVMKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJDb2xvckJhbGFuY2VDaGFubmVsIHsKKyAgR3N0Q29sb3JCYWxhbmNlQ2hhbm5lbCBwYXJlbnQ7CisKKyAgZ3VpbnQzMiBpZDsKK30gR3N0VjRsMkNvbG9yQmFsYW5jZUNoYW5uZWw7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyQ29sb3JCYWxhbmNlQ2hhbm5lbENsYXNzIHsKKyAgR3N0Q29sb3JCYWxhbmNlQ2hhbm5lbENsYXNzIHBhcmVudDsKK30gR3N0VjRsMkNvbG9yQmFsYW5jZUNoYW5uZWxDbGFzczsKKworR1R5cGUgZ3N0X3Y0bDJfY29sb3JfYmFsYW5jZV9jaGFubmVsX2dldF90eXBlICAgKHZvaWQpOworCitjb25zdCBHTGlzdCAqICAgZ3N0X3Y0bDJfY29sb3JfYmFsYW5jZV9saXN0X2NoYW5uZWxzICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCk7CisKK3ZvaWQgICAgICAgICAgICBnc3RfdjRsMl9jb2xvcl9iYWxhbmNlX3NldF92YWx1ZSAgICAgICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0Q29sb3JCYWxhbmNlQ2hhbm5lbCAqIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50IHZhbHVlKTsKKworZ2ludCAgICAgICAgICAgIGdzdF92NGwyX2NvbG9yX2JhbGFuY2VfZ2V0X3ZhbHVlICAgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RDb2xvckJhbGFuY2VDaGFubmVsICogY2hhbm5lbCk7CisKKyNkZWZpbmUgR1NUX0lNUExFTUVOVF9WNEwyX0NPTE9SX0JBTEFOQ0VfTUVUSE9EUyhUeXBlLCBpbnRlcmZhY2VfYXNfZnVuY3Rpb24pICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgY29uc3QgR0xpc3QgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfY29sb3JfYmFsYW5jZV9saXN0X2NoYW5uZWxzIChHc3RDb2xvckJhbGFuY2UgKiBiYWxhbmNlKSAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFR5cGUgKnRoaXMgPSAoVHlwZSopIGJhbGFuY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIGdzdF92NGwyX2NvbG9yX2JhbGFuY2VfbGlzdF9jaGFubmVscyh0aGlzLT52NGwyb2JqZWN0KTsgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF9jb2xvcl9iYWxhbmNlX3NldF92YWx1ZSAoR3N0Q29sb3JCYWxhbmNlICogYmFsYW5jZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RDb2xvckJhbGFuY2VDaGFubmVsICogY2hhbm5lbCwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFR5cGUgKnRoaXMgPSAoVHlwZSopIGJhbGFuY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ3N0X3Y0bDJfY29sb3JfYmFsYW5jZV9zZXRfdmFsdWUodGhpcy0+djRsMm9iamVjdCwgY2hhbm5lbCwgdmFsdWUpOyAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGdpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX2NvbG9yX2JhbGFuY2VfZ2V0X3ZhbHVlIChHc3RDb2xvckJhbGFuY2UgKiBiYWxhbmNlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENvbG9yQmFsYW5jZUNoYW5uZWwgKiBjaGFubmVsKSAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFR5cGUgKnRoaXMgPSAoVHlwZSopIGJhbGFuY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIGdzdF92NGwyX2NvbG9yX2JhbGFuY2VfZ2V0X3ZhbHVlKHRoaXMtPnY0bDJvYmplY3QsIGNoYW5uZWwpOyAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBHc3RDb2xvckJhbGFuY2VUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF9jb2xvcl9iYWxhbmNlX2dldF9iYWxhbmNlX3R5cGUgKEdzdENvbG9yQmFsYW5jZSAqIGJhbGFuY2UpICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIEdTVF9DT0xPUl9CQUxBTkNFX0hBUkRXQVJFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF9jb2xvcl9iYWxhbmNlX2ludGVyZmFjZV9pbml0IChHc3RDb2xvckJhbGFuY2VJbnRlcmZhY2UgKiBpZmFjZSkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIGRlZmF1bHQgdmlydHVhbCBmdW5jdGlvbnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWZhY2UtPmxpc3RfY2hhbm5lbHMgPSBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX2NvbG9yX2JhbGFuY2VfbGlzdF9jaGFubmVsczsgICAgICAgXAorICBpZmFjZS0+c2V0X3ZhbHVlID0gaW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF9jb2xvcl9iYWxhbmNlX3NldF92YWx1ZTsgICAgICAgICAgICAgICBcCisgIGlmYWNlLT5nZXRfdmFsdWUgPSBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX2NvbG9yX2JhbGFuY2VfZ2V0X3ZhbHVlOyAgICAgICAgICAgICAgIFwKKyAgaWZhY2UtPmdldF9iYWxhbmNlX3R5cGUgPSBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX2NvbG9yX2JhbGFuY2VfZ2V0X2JhbGFuY2VfdHlwZTsgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19HU1RfVjRMMl9DT0xPUl9CQUxBTkNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMmRldmljZXByb3ZpZGVyLmMgYi9zeXMvdjRsMi9nc3R2NGwyZGV2aWNlcHJvdmlkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjZlOWVhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMmRldmljZXByb3ZpZGVyLmMKQEAgLTAsMCArMSw2MDEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDEyIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKyAqCisgKiBnc3R2NGwyZGV2aWNlcHJvdmlkZXIuYzogVjRsMiBkZXZpY2UgcHJvYmluZyBhbmQgbW9uaXRvcmluZworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdHY0bDJkZXZpY2Vwcm92aWRlci5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImdzdHY0bDJvYmplY3QuaCIKKyNpbmNsdWRlICJ2NGwyLXV0aWxzLmgiCisKKyNpZmRlZiBIQVZFX0dVREVWCisjaW5jbHVkZSA8Z3VkZXYvZ3VkZXYuaD4KKyNlbmRpZgorCitzdGF0aWMgR3N0VjRsMkRldmljZSAqZ3N0X3Y0bDJfZGV2aWNlX25ldyAoY29uc3QgZ2NoYXIgKiBkZXZpY2VfcGF0aCwKKyAgICBjb25zdCBnY2hhciAqIGRldmljZV9uYW1lLCBHc3RDYXBzICogY2FwcywgR3N0VjRsMkRldmljZVR5cGUgdHlwZSwKKyAgICBHc3RTdHJ1Y3R1cmUgKiBwcm9wcyk7CisKKworR19ERUZJTkVfVFlQRSAoR3N0VjRsMkRldmljZVByb3ZpZGVyLCBnc3RfdjRsMl9kZXZpY2VfcHJvdmlkZXIsCisgICAgR1NUX1RZUEVfREVWSUNFX1BST1ZJREVSKTsKKworc3RhdGljIHZvaWQgZ3N0X3Y0bDJfZGV2aWNlX3Byb3ZpZGVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyBHTGlzdCAqZ3N0X3Y0bDJfZGV2aWNlX3Byb3ZpZGVyX3Byb2JlIChHc3REZXZpY2VQcm92aWRlciAqIHByb3ZpZGVyKTsKKworI2lmZGVmIEhBVkVfR1VERVYKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdjRsMl9kZXZpY2VfcHJvdmlkZXJfc3RhcnQgKEdzdERldmljZVByb3ZpZGVyICogcHJvdmlkZXIpOworc3RhdGljIHZvaWQgZ3N0X3Y0bDJfZGV2aWNlX3Byb3ZpZGVyX3N0b3AgKEdzdERldmljZVByb3ZpZGVyICogcHJvdmlkZXIpOworI2VuZGlmCisKKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2RldmljZV9wcm92aWRlcl9jbGFzc19pbml0IChHc3RWNGwyRGV2aWNlUHJvdmlkZXJDbGFzcyAqIGtsYXNzKQoreworICBHc3REZXZpY2VQcm92aWRlckNsYXNzICpkbV9jbGFzcyA9IEdTVF9ERVZJQ0VfUFJPVklERVJfQ0xBU1MgKGtsYXNzKTsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBkbV9jbGFzcy0+cHJvYmUgPSBnc3RfdjRsMl9kZXZpY2VfcHJvdmlkZXJfcHJvYmU7CisKKyNpZmRlZiBIQVZFX0dVREVWCisgIGRtX2NsYXNzLT5zdGFydCA9IGdzdF92NGwyX2RldmljZV9wcm92aWRlcl9zdGFydDsKKyAgZG1fY2xhc3MtPnN0b3AgPSBnc3RfdjRsMl9kZXZpY2VfcHJvdmlkZXJfc3RvcDsKKyNlbmRpZgorCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ3N0X3Y0bDJfZGV2aWNlX3Byb3ZpZGVyX2ZpbmFsaXplOworCisgIGdzdF9kZXZpY2VfcHJvdmlkZXJfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZG1fY2xhc3MsCisgICAgICAiVmlkZW8gKHZpZGVvNGxpbnV4MikgRGV2aWNlIFByb3ZpZGVyIiwgIlNvdXJjZS9TaW5rL1ZpZGVvIiwKKyAgICAgICJMaXN0IGFuZCBtb25pdG9yIHZpZGVvNGxpbnV4MiBzb3VyY2UgYW5kIHNpbmsgZGV2aWNlcyIsCisgICAgICAiT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY29tPiIpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfZGV2aWNlX3Byb3ZpZGVyX2luaXQgKEdzdFY0bDJEZXZpY2VQcm92aWRlciAqIHByb3ZpZGVyKQoreworI2lmZGVmIEhBVkVfR1VERVYKKyAgZ19jb25kX2luaXQgKCZwcm92aWRlci0+c3RhcnRlZF9jb25kKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfZGV2aWNlX3Byb3ZpZGVyX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KQoreworI2lmZGVmIEhBVkVfR1VERVYKKyAgR3N0VjRsMkRldmljZVByb3ZpZGVyICpwcm92aWRlciA9IEdTVF9WNEwyX0RFVklDRV9QUk9WSURFUiAob2JqZWN0KTsKKworICBnX2NvbmRfY2xlYXIgKCZwcm92aWRlci0+c3RhcnRlZF9jb25kKTsKKyNlbmRpZgorCisgIEdfT0JKRUNUX0NMQVNTIChnc3RfdjRsMl9kZXZpY2VfcHJvdmlkZXJfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RWNGwyRGV2aWNlICoKK2dzdF92NGwyX2RldmljZV9wcm92aWRlcl9wcm9iZV9kZXZpY2UgKEdzdFY0bDJEZXZpY2VQcm92aWRlciAqIHByb3ZpZGVyLAorICAgIGNvbnN0IGdjaGFyICogZGV2aWNlX3BhdGgsIGNvbnN0IGdjaGFyICogZGV2aWNlX25hbWUsIEdzdFN0cnVjdHVyZSAqIHByb3BzKQoreworICBHc3RWNGwyT2JqZWN0ICp2NGwyb2JqID0gTlVMTDsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0VjRsMkRldmljZSAqZGV2aWNlID0gTlVMTDsKKyAgc3RydWN0IHN0YXQgc3Q7CisgIEdzdFY0bDJEZXZpY2VUeXBlIHR5cGUgPSBHU1RfVjRMMl9ERVZJQ0VfVFlQRV9JTlZBTElEOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChwcm9wcyAhPSBOVUxMLCBOVUxMKTsKKworICBpZiAoc3RhdCAoZGV2aWNlX3BhdGgsICZzdCkgPT0gLTEpCisgICAgZ290byBkZXN0cm95OworCisgIGlmICghU19JU0NIUiAoc3Quc3RfbW9kZSkpCisgICAgZ290byBkZXN0cm95OworCisgIHY0bDJvYmogPSBnc3RfdjRsMl9vYmplY3RfbmV3IChOVUxMLCBHU1RfT0JKRUNUIChwcm92aWRlciksCisgICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsIGRldmljZV9wYXRoLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICBpZiAoIWdzdF92NGwyX29wZW4gKHY0bDJvYmopKQorICAgIGdvdG8gZGVzdHJveTsKKworICBnc3Rfc3RydWN0dXJlX3NldCAocHJvcHMsICJkZXZpY2UuYXBpIiwgR19UWVBFX1NUUklORywgInY0bDIiLCBOVUxMKTsKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKHByb3BzLCAiZGV2aWNlLnBhdGgiLCBHX1RZUEVfU1RSSU5HLCBkZXZpY2VfcGF0aCwgTlVMTCk7CisKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKHByb3BzLCAidjRsMi5kZXZpY2UuZHJpdmVyIiwgR19UWVBFX1NUUklORywKKyAgICAgIHY0bDJvYmotPnZjYXAuZHJpdmVyLCBOVUxMKTsKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKHByb3BzLCAidjRsMi5kZXZpY2UuY2FyZCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICB2NGwyb2JqLT52Y2FwLmNhcmQsIE5VTEwpOworICBnc3Rfc3RydWN0dXJlX3NldCAocHJvcHMsICJ2NGwyLmRldmljZS5idXNfaW5mbyIsIEdfVFlQRV9TVFJJTkcsCisgICAgICB2NGwyb2JqLT52Y2FwLmJ1c19pbmZvLCBOVUxMKTsKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKHByb3BzLCAidjRsMi5kZXZpY2UudmVyc2lvbiIsIEdfVFlQRV9VSU5ULAorICAgICAgdjRsMm9iai0+dmNhcC52ZXJzaW9uLCBOVUxMKTsKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKHByb3BzLCAidjRsMi5kZXZpY2UuY2FwYWJpbGl0aWVzIiwgR19UWVBFX1VJTlQsCisgICAgICB2NGwyb2JqLT52Y2FwLmNhcGFiaWxpdGllcywgTlVMTCk7CisgIGdzdF9zdHJ1Y3R1cmVfc2V0IChwcm9wcywgInY0bDIuZGV2aWNlLmRldmljZV9jYXBzIiwgR19UWVBFX1VJTlQsCisgICAgICB2NGwyb2JqLT52Y2FwLmRldmljZV9jYXBzLCBOVUxMKTsKKworICBpZiAodjRsMm9iai0+ZGV2aWNlX2NhcHMgJgorICAgICAgKFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9WSURFT19DQVBUVVJFX01QTEFORSkpIHsKKyAgICAvKiBXZSBpZ25vcmUgdG91Y2ggc2Vuc2luZyBkZXZpY2VzOyB0aG9zZSBhcmUndCByZWFsbHkgdmlkZW8gKi8KKyAgICBpZiAodjRsMm9iai0+ZGV2aWNlX2NhcHMgJiBWNEwyX0NBUF9UT1VDSCkKKyAgICAgIGdvdG8gY2xvc2U7CisKKyAgICB0eXBlID0gR1NUX1Y0TDJfREVWSUNFX1RZUEVfU09VUkNFOworICAgIHY0bDJvYmotPnNraXBfdHJ5X2ZtdF9wcm9iZXMgPSBUUlVFOworICB9CisKKyAgaWYgKHY0bDJvYmotPmRldmljZV9jYXBzICYKKyAgICAgIChWNEwyX0NBUF9WSURFT19PVVRQVVQgfCBWNEwyX0NBUF9WSURFT19PVVRQVVRfTVBMQU5FKSkgeworICAgIC8qIFdlIGlnbm9yZSBNMk0gZGV2aWNlcyB0aGF0IGFyZSBib3RoIGNhcHR1cmUgYW5kIG91dHB1dCBmb3Igbm93CisgICAgICogVGhlIHByb3ZpZGVyIGlzIG5vdCBmb3IgdGhlbSAqLworICAgIGlmICh0eXBlICE9IEdTVF9WNEwyX0RFVklDRV9UWVBFX0lOVkFMSUQpCisgICAgICBnb3RvIGNsb3NlOworCisgICAgdHlwZSA9IEdTVF9WNEwyX0RFVklDRV9UWVBFX1NJTks7CisKKyAgICAvKiBXZSBoYXZlIG9wZW5lZCBhcyBhIGNhcHR1cmUgYXMgd2UgZGlkbid0IGtub3csIG5vdyB0aGF0IGtub3csCisgICAgICogbGV0J3MgZml4ZWQgaXQgKi8KKyAgICBpZiAodjRsMm9iai0+ZGV2aWNlX2NhcHMgJiBWNEwyX0NBUF9WSURFT19PVVRQVVRfTVBMQU5FKQorICAgICAgdjRsMm9iai0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKKyAgICBlbHNlCisgICAgICB2NGwyb2JqLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ7CisgIH0KKworICBpZiAodHlwZSA9PSBHU1RfVjRMMl9ERVZJQ0VfVFlQRV9JTlZBTElEKQorICAgIGdvdG8gY2xvc2U7CisKKyAgY2FwcyA9IGdzdF92NGwyX29iamVjdF9nZXRfY2FwcyAodjRsMm9iaiwgTlVMTCk7CisKKyAgaWYgKGNhcHMgPT0gTlVMTCkKKyAgICBnb3RvIGNsb3NlOworICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKGNhcHMpKSB7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIGdvdG8gY2xvc2U7CisgIH0KKworICBkZXZpY2UgPSBnc3RfdjRsMl9kZXZpY2VfbmV3IChkZXZpY2VfcGF0aCwKKyAgICAgIGRldmljZV9uYW1lID8gZGV2aWNlX25hbWUgOiAoZ2NoYXIgKikgdjRsMm9iai0+dmNhcC5jYXJkLCBjYXBzLCB0eXBlLAorICAgICAgcHJvcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKK2Nsb3NlOgorCisgIGdzdF92NGwyX2Nsb3NlICh2NGwyb2JqKTsKKworZGVzdHJveToKKworICBpZiAodjRsMm9iaikKKyAgICBnc3RfdjRsMl9vYmplY3RfZGVzdHJveSAodjRsMm9iaik7CisKKyAgaWYgKHByb3BzKQorICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAocHJvcHMpOworCisgIHJldHVybiBkZXZpY2U7Cit9CisKKworc3RhdGljIEdMaXN0ICoKK2dzdF92NGwyX2RldmljZV9wcm92aWRlcl9wcm9iZSAoR3N0RGV2aWNlUHJvdmlkZXIgKiBwcm92aWRlcikKK3sKKyAgR3N0VjRsMkRldmljZVByb3ZpZGVyICpzZWxmID0gR1NUX1Y0TDJfREVWSUNFX1BST1ZJREVSIChwcm92aWRlcik7CisgIEdzdFY0bDJJdGVyYXRvciAqaXQ7CisgIEdMaXN0ICpkZXZpY2VzID0gTlVMTDsKKworICBpdCA9IGdzdF92NGwyX2l0ZXJhdG9yX25ldyAoKTsKKworICB3aGlsZSAoZ3N0X3Y0bDJfaXRlcmF0b3JfbmV4dCAoaXQpKSB7CisgICAgR3N0U3RydWN0dXJlICpwcm9wczsKKyAgICBHc3RWNGwyRGV2aWNlICpkZXZpY2U7CisKKyAgICBwcm9wcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgidjRsMi1wcm9wbGlzdCIsICJkZXZpY2UucGF0aCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgIGl0LT5kZXZpY2VfcGF0aCwgInVkZXYtcHJvYmVkIiwgR19UWVBFX0JPT0xFQU4sIEZBTFNFLCBOVUxMKTsKKyAgICBkZXZpY2UgPSBnc3RfdjRsMl9kZXZpY2VfcHJvdmlkZXJfcHJvYmVfZGV2aWNlIChzZWxmLCBpdC0+ZGV2aWNlX3BhdGgsIE5VTEwsCisgICAgICAgIHByb3BzKTsKKworICAgIGlmIChkZXZpY2UpIHsKKyAgICAgIGdzdF9vYmplY3RfcmVmX3NpbmsgKGRldmljZSk7CisgICAgICBkZXZpY2VzID0gZ19saXN0X3ByZXBlbmQgKGRldmljZXMsIGRldmljZSk7CisgICAgfQorICB9CisKKyAgZ3N0X3Y0bDJfaXRlcmF0b3JfZnJlZSAoaXQpOworCisgIHJldHVybiBkZXZpY2VzOworfQorCisjaWZkZWYgSEFWRV9HVURFVgorCitzdGF0aWMgR3N0RGV2aWNlICoKK2dzdF92NGwyX2RldmljZV9wcm92aWRlcl9kZXZpY2VfZnJvbV91ZGV2IChHc3RWNGwyRGV2aWNlUHJvdmlkZXIgKiBwcm92aWRlciwKKyAgICBHVWRldkRldmljZSAqIHVkZXZfZGV2aWNlKQoreworICBHc3RWNGwyRGV2aWNlICpnc3RkZXY7CisgIGNvbnN0IGdjaGFyICpkZXZpY2VfcGF0aCA9IGdfdWRldl9kZXZpY2VfZ2V0X2RldmljZV9maWxlICh1ZGV2X2RldmljZSk7CisgIGNvbnN0IGdjaGFyICpkZXZpY2VfbmFtZSwgKnN0cjsKKyAgR3N0U3RydWN0dXJlICpwcm9wczsKKworICBwcm9wcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgidjRsMmRldmljZXByb3ZpZGVyIiwgInVkZXYtcHJvYmVkIiwKKyAgICAgIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKworICBzdHIgPSBnX3VkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eSAodWRldl9kZXZpY2UsICJJRF9QQVRIIik7CisgIGlmICghKHN0ciAmJiAqc3RyKSkgeworICAgIHN0ciA9IGdfdWRldl9kZXZpY2VfZ2V0X3N5c2ZzX3BhdGggKHVkZXZfZGV2aWNlKTsKKyAgfQorICBpZiAoc3RyICYmICpzdHIpCisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHByb3BzLCAiZGV2aWNlLmJ1c19wYXRoIiwgR19UWVBFX1NUUklORywgc3RyLCBOVUxMKTsKKworICBpZiAoKHN0ciA9IGdfdWRldl9kZXZpY2VfZ2V0X3N5c2ZzX3BhdGggKHVkZXZfZGV2aWNlKSkgJiYgKnN0cikKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocHJvcHMsICJzeXNmcy5wYXRoIiwgR19UWVBFX1NUUklORywgc3RyLCBOVUxMKTsKKworICBpZiAoKHN0ciA9IGdfdWRldl9kZXZpY2VfZ2V0X3Byb3BlcnR5ICh1ZGV2X2RldmljZSwgIklEX0lEIikpICYmICpzdHIpCisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHByb3BzLCAidWRldi5pZCIsIEdfVFlQRV9TVFJJTkcsIHN0ciwgTlVMTCk7CisKKyAgaWYgKChzdHIgPSBnX3VkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eSAodWRldl9kZXZpY2UsICJJRF9CVVMiKSkgJiYgKnN0cikKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocHJvcHMsICJkZXZpY2UuYnVzIiwgR19UWVBFX1NUUklORywgc3RyLCBOVUxMKTsKKworICBpZiAoKHN0ciA9IGdfdWRldl9kZXZpY2VfZ2V0X3Byb3BlcnR5ICh1ZGV2X2RldmljZSwgIlNVQlNZU1RFTSIpKSAmJiAqc3RyKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChwcm9wcywgImRldmljZS5zdWJzeXN0ZW0iLCBHX1RZUEVfU1RSSU5HLCBzdHIsIE5VTEwpOworCisgIGlmICgoc3RyID0gZ191ZGV2X2RldmljZV9nZXRfcHJvcGVydHkgKHVkZXZfZGV2aWNlLCAiSURfVkVORE9SX0lEIikpICYmICpzdHIpCisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHByb3BzLCAiZGV2aWNlLnZlbmRvci5pZCIsIEdfVFlQRV9TVFJJTkcsIHN0ciwgTlVMTCk7CisKKyAgc3RyID0gZ191ZGV2X2RldmljZV9nZXRfcHJvcGVydHkgKHVkZXZfZGV2aWNlLCAiSURfVkVORE9SX0ZST01fREFUQUJBU0UiKTsKKyAgaWYgKCEoc3RyICYmICpzdHIpKSB7CisgICAgc3RyID0gZ191ZGV2X2RldmljZV9nZXRfcHJvcGVydHkgKHVkZXZfZGV2aWNlLCAiSURfVkVORE9SX0VOQyIpOworICAgIGlmICghKHN0ciAmJiAqc3RyKSkgeworICAgICAgc3RyID0gZ191ZGV2X2RldmljZV9nZXRfcHJvcGVydHkgKHVkZXZfZGV2aWNlLCAiSURfVkVORE9SIik7CisgICAgfQorICB9CisgIGlmIChzdHIgJiYgKnN0cikKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocHJvcHMsICJkZXZpY2UudmVuZG9yLm5hbWUiLCBHX1RZUEVfU1RSSU5HLCBzdHIsIE5VTEwpOworCisgIGlmICgoc3RyID0gZ191ZGV2X2RldmljZV9nZXRfcHJvcGVydHkgKHVkZXZfZGV2aWNlLCAiSURfTU9ERUxfSUQiKSkgJiYgKnN0cikKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocHJvcHMsICJkZXZpY2UucHJvZHVjdC5pZCIsIEdfVFlQRV9TVFJJTkcsIHN0ciwgTlVMTCk7CisKKyAgZGV2aWNlX25hbWUgPSBnX3VkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eSAodWRldl9kZXZpY2UsICJJRF9WNExfUFJPRFVDVCIpOworICBpZiAoIShkZXZpY2VfbmFtZSAmJiAqZGV2aWNlX25hbWUpKSB7CisgICAgZGV2aWNlX25hbWUgPQorICAgICAgICBnX3VkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eSAodWRldl9kZXZpY2UsICJJRF9NT0RFTF9GUk9NX0RBVEFCQVNFIik7CisgICAgaWYgKCEoZGV2aWNlX25hbWUgJiYgKmRldmljZV9uYW1lKSkgeworICAgICAgZGV2aWNlX25hbWUgPSBnX3VkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eSAodWRldl9kZXZpY2UsICJJRF9NT0RFTF9FTkMiKTsKKyAgICAgIGlmICghKGRldmljZV9uYW1lICYmICpkZXZpY2VfbmFtZSkpIHsKKyAgICAgICAgZGV2aWNlX25hbWUgPSBnX3VkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eSAodWRldl9kZXZpY2UsICJJRF9NT0RFTCIpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoZGV2aWNlX25hbWUgJiYgKmRldmljZV9uYW1lKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChwcm9wcywgImRldmljZS5wcm9kdWN0Lm5hbWUiLCBHX1RZUEVfU1RSSU5HLCBkZXZpY2VfbmFtZSwKKyAgICAgICAgTlVMTCk7CisKKyAgaWYgKChzdHIgPSBnX3VkZXZfZGV2aWNlX2dldF9wcm9wZXJ0eSAodWRldl9kZXZpY2UsICJJRF9TRVJJQUwiKSkgJiYgKnN0cikKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocHJvcHMsICJkZXZpY2Uuc2VyaWFsIiwgR19UWVBFX1NUUklORywgc3RyLCBOVUxMKTsKKworICBpZiAoKHN0ciA9IGdfdWRldl9kZXZpY2VfZ2V0X3Byb3BlcnR5ICh1ZGV2X2RldmljZSwgIklEX1Y0TF9DQVBBQklMSVRJRVMiKSkKKyAgICAgICYmICpzdHIpCisgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHByb3BzLCAiZGV2aWNlLmNhcGFiaWxpdGllcyIsIEdfVFlQRV9TVFJJTkcsIHN0ciwgTlVMTCk7CisKKyAgZ3N0ZGV2ID0gZ3N0X3Y0bDJfZGV2aWNlX3Byb3ZpZGVyX3Byb2JlX2RldmljZSAocHJvdmlkZXIsIGRldmljZV9wYXRoLAorICAgICAgZGV2aWNlX25hbWUsIHByb3BzKTsKKworICBpZiAoZ3N0ZGV2KQorICAgIGdzdGRldi0+c3lzcGF0aCA9IGdfc3RyZHVwIChnX3VkZXZfZGV2aWNlX2dldF9zeXNmc19wYXRoICh1ZGV2X2RldmljZSkpOworCisgIHJldHVybiBHU1RfREVWSUNFIChnc3RkZXYpOworfQorCitzdGF0aWMgdm9pZAordWV2ZW50X2NiIChHVWRldkNsaWVudCAqIGNsaWVudCwgY29uc3QgZ2NoYXIgKiBhY3Rpb24sIEdVZGV2RGV2aWNlICogZGV2aWNlLAorICAgIEdzdFY0bDJEZXZpY2VQcm92aWRlciAqIHNlbGYpCit7CisgIEdzdERldmljZVByb3ZpZGVyICpwcm92aWRlciA9IEdTVF9ERVZJQ0VfUFJPVklERVIgKHNlbGYpOworCisgIC8qIE5vdCBWNEwyLCBpZ25vcmluZyAqLworICBpZiAoZ191ZGV2X2RldmljZV9nZXRfcHJvcGVydHlfYXNfaW50IChkZXZpY2UsICJJRF9WNExfVkVSU0lPTiIpICE9IDIpCisgICAgcmV0dXJuOworCisgIGlmICghc3RyY21wIChhY3Rpb24sICJhZGQiKSkgeworICAgIEdzdERldmljZSAqZ3N0ZGV2ID0gTlVMTDsKKworICAgIGdzdGRldiA9IGdzdF92NGwyX2RldmljZV9wcm92aWRlcl9kZXZpY2VfZnJvbV91ZGV2IChzZWxmLCBkZXZpY2UpOworCisgICAgaWYgKGdzdGRldikKKyAgICAgIGdzdF9kZXZpY2VfcHJvdmlkZXJfZGV2aWNlX2FkZCAocHJvdmlkZXIsIGdzdGRldik7CisgIH0gZWxzZSBpZiAoIXN0cmNtcCAoYWN0aW9uLCAicmVtb3ZlIikpIHsKKyAgICBHc3RWNGwyRGV2aWNlICpnc3RkZXYgPSBOVUxMOworICAgIEdMaXN0ICppdGVtOworCisgICAgR1NUX09CSkVDVF9MT0NLIChzZWxmKTsKKyAgICBmb3IgKGl0ZW0gPSBwcm92aWRlci0+ZGV2aWNlczsgaXRlbTsgaXRlbSA9IGl0ZW0tPm5leHQpIHsKKyAgICAgIGdzdGRldiA9IGl0ZW0tPmRhdGE7CisKKyAgICAgIGlmICghc3RyY21wIChnc3RkZXYtPnN5c3BhdGgsIGdfdWRldl9kZXZpY2VfZ2V0X3N5c2ZzX3BhdGggKGRldmljZSkpKSB7CisgICAgICAgIGdzdF9vYmplY3RfcmVmIChnc3RkZXYpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZ3N0ZGV2ID0gTlVMTDsKKyAgICB9CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHByb3ZpZGVyKTsKKworICAgIGlmIChnc3RkZXYpIHsKKyAgICAgIGdzdF9kZXZpY2VfcHJvdmlkZXJfZGV2aWNlX3JlbW92ZSAocHJvdmlkZXIsIEdTVF9ERVZJQ0UgKGdzdGRldikpOworICAgICAgZ19vYmplY3RfdW5yZWYgKGdzdGRldik7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HICgiVW5oYW5kbGVkIGFjdGlvbiAlcyIsIGFjdGlvbik7CisgIH0KK30KKworc3RhdGljIGdwb2ludGVyCitwcm92aWRlcl90aHJlYWQgKGdwb2ludGVyIGRhdGEpCit7CisgIEdzdFY0bDJEZXZpY2VQcm92aWRlciAqcHJvdmlkZXIgPSBkYXRhOworICBHTWFpbkNvbnRleHQgKmNvbnRleHQgPSBOVUxMOworICBHTWFpbkxvb3AgKmxvb3AgPSBOVUxMOworICBHVWRldkNsaWVudCAqY2xpZW50OworICBHTGlzdCAqZGV2aWNlczsKKyAgc3RhdGljIGNvbnN0IGdjaGFyICpzdWJzeXN0ZW1zW10gPSB7ICJ2aWRlbzRsaW51eCIsIE5VTEwgfTsKKworICBHU1RfT0JKRUNUX0xPQ0sgKHByb3ZpZGVyKTsKKyAgaWYgKHByb3ZpZGVyLT5jb250ZXh0KQorICAgIGNvbnRleHQgPSBnX21haW5fY29udGV4dF9yZWYgKHByb3ZpZGVyLT5jb250ZXh0KTsKKyAgaWYgKHByb3ZpZGVyLT5sb29wKQorICAgIGxvb3AgPSBnX21haW5fbG9vcF9yZWYgKHByb3ZpZGVyLT5sb29wKTsKKworICBpZiAoY29udGV4dCA9PSBOVUxMIHx8IGxvb3AgPT0gTlVMTCkgeworICAgIHByb3ZpZGVyLT5zdGFydGVkID0gVFJVRTsKKyAgICBnX2NvbmRfYnJvYWRjYXN0ICgmcHJvdmlkZXItPnN0YXJ0ZWRfY29uZCk7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHByb3ZpZGVyKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBHU1RfT0JKRUNUX1VOTE9DSyAocHJvdmlkZXIpOworCisgIGdfbWFpbl9jb250ZXh0X3B1c2hfdGhyZWFkX2RlZmF1bHQgKGNvbnRleHQpOworCisgIGNsaWVudCA9IGdfdWRldl9jbGllbnRfbmV3IChzdWJzeXN0ZW1zKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChjbGllbnQsICJ1ZXZlbnQiLCBHX0NBTExCQUNLICh1ZXZlbnRfY2IpLCBwcm92aWRlcik7CisKKyAgZGV2aWNlcyA9IGdfdWRldl9jbGllbnRfcXVlcnlfYnlfc3Vic3lzdGVtIChjbGllbnQsICJ2aWRlbzRsaW51eCIpOworCisgIHdoaWxlIChkZXZpY2VzKSB7CisgICAgR1VkZXZEZXZpY2UgKnVkZXZfZGV2aWNlID0gZGV2aWNlcy0+ZGF0YTsKKyAgICBHc3REZXZpY2UgKmdzdGRldjsKKworICAgIGRldmljZXMgPSBnX2xpc3RfcmVtb3ZlIChkZXZpY2VzLCB1ZGV2X2RldmljZSk7CisKKyAgICBpZiAoZ191ZGV2X2RldmljZV9nZXRfcHJvcGVydHlfYXNfaW50ICh1ZGV2X2RldmljZSwgIklEX1Y0TF9WRVJTSU9OIikgPT0gMikgeworICAgICAgZ3N0ZGV2ID0KKyAgICAgICAgICBnc3RfdjRsMl9kZXZpY2VfcHJvdmlkZXJfZGV2aWNlX2Zyb21fdWRldiAocHJvdmlkZXIsIHVkZXZfZGV2aWNlKTsKKyAgICAgIGlmIChnc3RkZXYpCisgICAgICAgIGdzdF9kZXZpY2VfcHJvdmlkZXJfZGV2aWNlX2FkZCAoR1NUX0RFVklDRV9QUk9WSURFUiAocHJvdmlkZXIpLCBnc3RkZXYpOworICAgIH0KKworICAgIGdfb2JqZWN0X3VucmVmICh1ZGV2X2RldmljZSk7CisgIH0KKworICBHU1RfT0JKRUNUX0xPQ0sgKHByb3ZpZGVyKTsKKyAgcHJvdmlkZXItPnN0YXJ0ZWQgPSBUUlVFOworICBnX2NvbmRfYnJvYWRjYXN0ICgmcHJvdmlkZXItPnN0YXJ0ZWRfY29uZCk7CisgIEdTVF9PQkpFQ1RfVU5MT0NLIChwcm92aWRlcik7CisKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKyAgZ19tYWluX2xvb3BfdW5yZWYgKGxvb3ApOworCisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICBnX21haW5fY29udGV4dF91bnJlZiAoY29udGV4dCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocHJvdmlkZXIpOworCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX2RldmljZV9wcm92aWRlcl9zdGFydCAoR3N0RGV2aWNlUHJvdmlkZXIgKiBwcm92aWRlcikKK3sKKyAgR3N0VjRsMkRldmljZVByb3ZpZGVyICpzZWxmID0gR1NUX1Y0TDJfREVWSUNFX1BST1ZJREVSIChwcm92aWRlcik7CisKKyAgR1NUX09CSkVDVF9MT0NLIChzZWxmKTsKKyAgZ19hc3NlcnQgKHNlbGYtPmNvbnRleHQgPT0gTlVMTCk7CisKKyAgc2VsZi0+Y29udGV4dCA9IGdfbWFpbl9jb250ZXh0X25ldyAoKTsKKyAgc2VsZi0+bG9vcCA9IGdfbWFpbl9sb29wX25ldyAoc2VsZi0+Y29udGV4dCwgRkFMU0UpOworCisgIHNlbGYtPnRocmVhZCA9IGdfdGhyZWFkX25ldyAoInY0bDItZGV2aWNlLXByb3ZpZGVyIiwgcHJvdmlkZXJfdGhyZWFkLAorICAgICAgZ19vYmplY3RfcmVmIChzZWxmKSk7CisKKyAgd2hpbGUgKHNlbGYtPnN0YXJ0ZWQgPT0gRkFMU0UpCisgICAgZ19jb25kX3dhaXQgKCZzZWxmLT5zdGFydGVkX2NvbmQsIEdTVF9PQkpFQ1RfR0VUX0xPQ0sgKHNlbGYpKTsKKworICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9kZXZpY2VfcHJvdmlkZXJfc3RvcCAoR3N0RGV2aWNlUHJvdmlkZXIgKiBwcm92aWRlcikKK3sKKyAgR3N0VjRsMkRldmljZVByb3ZpZGVyICpzZWxmID0gR1NUX1Y0TDJfREVWSUNFX1BST1ZJREVSIChwcm92aWRlcik7CisgIEdNYWluQ29udGV4dCAqY29udGV4dDsKKyAgR01haW5Mb29wICpsb29wOworICBHU291cmNlICppZGxlX3N0b3Bfc291cmNlOworCisgIEdTVF9PQkpFQ1RfTE9DSyAoc2VsZik7CisgIGNvbnRleHQgPSBzZWxmLT5jb250ZXh0OworICBsb29wID0gc2VsZi0+bG9vcDsKKyAgc2VsZi0+Y29udGV4dCA9IE5VTEw7CisgIHNlbGYtPmxvb3AgPSBOVUxMOworICBHU1RfT0JKRUNUX1VOTE9DSyAoc2VsZik7CisKKyAgaWYgKCFjb250ZXh0IHx8ICFsb29wKQorICAgIHJldHVybjsKKworICBpZGxlX3N0b3Bfc291cmNlID0gZ19pZGxlX3NvdXJjZV9uZXcgKCk7CisgIGdfc291cmNlX3NldF9jYWxsYmFjayAoaWRsZV9zdG9wX3NvdXJjZSwgKEdTb3VyY2VGdW5jKSBnX21haW5fbG9vcF9xdWl0LCBsb29wLAorICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnX21haW5fbG9vcF91bnJlZik7CisgIGdfc291cmNlX2F0dGFjaCAoaWRsZV9zdG9wX3NvdXJjZSwgY29udGV4dCk7CisgIGdfc291cmNlX3VucmVmIChpZGxlX3N0b3Bfc291cmNlKTsKKyAgZ19tYWluX2NvbnRleHRfdW5yZWYgKGNvbnRleHQpOworCisgIGdfdGhyZWFkX2pvaW4gKHNlbGYtPnRocmVhZCk7CisgIHNlbGYtPnRocmVhZCA9IE5VTEw7CisgIHNlbGYtPnN0YXJ0ZWQgPSBGQUxTRTsKK30KKworI2VuZGlmCisKK2VudW0KK3sKKyAgUFJPUF9ERVZJQ0VfUEFUSCA9IDEsCit9OworCitHX0RFRklORV9UWVBFIChHc3RWNGwyRGV2aWNlLCBnc3RfdjRsMl9kZXZpY2UsIEdTVF9UWVBFX0RFVklDRSk7CisKK3N0YXRpYyB2b2lkIGdzdF92NGwyX2RldmljZV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfdjRsMl9kZXZpY2Vfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3Y0bDJfZGV2aWNlX2ZpbmFsaXplIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyBHc3RFbGVtZW50ICpnc3RfdjRsMl9kZXZpY2VfY3JlYXRlX2VsZW1lbnQgKEdzdERldmljZSAqIGRldmljZSwKKyAgICBjb25zdCBnY2hhciAqIG5hbWUpOworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfZGV2aWNlX2NsYXNzX2luaXQgKEdzdFY0bDJEZXZpY2VDbGFzcyAqIGtsYXNzKQoreworICBHc3REZXZpY2VDbGFzcyAqZGV2X2NsYXNzID0gR1NUX0RFVklDRV9DTEFTUyAoa2xhc3MpOworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisKKyAgZGV2X2NsYXNzLT5jcmVhdGVfZWxlbWVudCA9IGdzdF92NGwyX2RldmljZV9jcmVhdGVfZWxlbWVudDsKKworICBvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF92NGwyX2RldmljZV9nZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3Y0bDJfZGV2aWNlX3NldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF92NGwyX2RldmljZV9maW5hbGl6ZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChvYmplY3RfY2xhc3MsIFBST1BfREVWSUNFX1BBVEgsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZGV2aWNlLXBhdGgiLCAiRGV2aWNlIFBhdGgiLAorICAgICAgICAgICJUaGUgUGF0aCBvZiB0aGUgZGV2aWNlIG5vZGUiLCAiIiwKKyAgICAgICAgICBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9kZXZpY2VfaW5pdCAoR3N0VjRsMkRldmljZSAqIGRldmljZSkKK3sKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2RldmljZV9maW5hbGl6ZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0VjRsMkRldmljZSAqZGV2aWNlID0gR1NUX1Y0TDJfREVWSUNFIChvYmplY3QpOworCisgIGdfZnJlZSAoZGV2aWNlLT5kZXZpY2VfcGF0aCk7CisgIGdfZnJlZSAoZGV2aWNlLT5zeXNwYXRoKTsKKworICBHX09CSkVDVF9DTEFTUyAoZ3N0X3Y0bDJfZGV2aWNlX3BhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitnc3RfdjRsMl9kZXZpY2VfY3JlYXRlX2VsZW1lbnQgKEdzdERldmljZSAqIGRldmljZSwgY29uc3QgZ2NoYXIgKiBuYW1lKQoreworICBHc3RWNGwyRGV2aWNlICp2NGwyX2RldiA9IEdTVF9WNEwyX0RFVklDRSAoZGV2aWNlKTsKKyAgR3N0RWxlbWVudCAqZWxlbTsKKworICBlbGVtID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICh2NGwyX2Rldi0+ZWxlbWVudCwgbmFtZSk7CisgIGdfb2JqZWN0X3NldCAoZWxlbSwgImRldmljZSIsIHY0bDJfZGV2LT5kZXZpY2VfcGF0aCwgTlVMTCk7CisKKyAgcmV0dXJuIGVsZW07Cit9CisKK3N0YXRpYyBHc3RWNGwyRGV2aWNlICoKK2dzdF92NGwyX2RldmljZV9uZXcgKGNvbnN0IGdjaGFyICogZGV2aWNlX3BhdGgsIGNvbnN0IGdjaGFyICogZGV2aWNlX25hbWUsCisgICAgR3N0Q2FwcyAqIGNhcHMsIEdzdFY0bDJEZXZpY2VUeXBlIHR5cGUsIEdzdFN0cnVjdHVyZSAqIHByb3BzKQoreworICBHc3RWNGwyRGV2aWNlICpnc3RkZXY7CisgIGNvbnN0IGdjaGFyICplbGVtZW50ID0gTlVMTDsKKyAgY29uc3QgZ2NoYXIgKmtsYXNzID0gTlVMTDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZGV2aWNlX3BhdGgsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZGV2aWNlX25hbWUsIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoY2FwcywgTlVMTCk7CisKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBHU1RfVjRMMl9ERVZJQ0VfVFlQRV9TT1VSQ0U6CisgICAgICBlbGVtZW50ID0gInY0bDJzcmMiOworICAgICAga2xhc3MgPSAiVmlkZW8vU291cmNlIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1Y0TDJfREVWSUNFX1RZUEVfU0lOSzoKKyAgICAgIGVsZW1lbnQgPSAidjRsMnNpbmsiOworICAgICAga2xhc3MgPSAiVmlkZW8vU2luayI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBicmVhazsKKyAgfQorCisgIGdzdGRldiA9IGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfVjRMMl9ERVZJQ0UsICJkZXZpY2UtcGF0aCIsIGRldmljZV9wYXRoLAorICAgICAgImRpc3BsYXktbmFtZSIsIGRldmljZV9uYW1lLCAiY2FwcyIsIGNhcHMsICJkZXZpY2UtY2xhc3MiLCBrbGFzcywKKyAgICAgICJwcm9wZXJ0aWVzIiwgcHJvcHMsIE5VTEwpOworCisgIGdzdGRldi0+ZWxlbWVudCA9IGVsZW1lbnQ7CisKKworICByZXR1cm4gZ3N0ZGV2OworfQorCisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9kZXZpY2VfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFY0bDJEZXZpY2UgKmRldmljZTsKKworICBkZXZpY2UgPSBHU1RfVjRMMl9ERVZJQ0VfQ0FTVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfREVWSUNFX1BBVEg6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBkZXZpY2UtPmRldmljZV9wYXRoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfZGV2aWNlX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWNGwyRGV2aWNlICpkZXZpY2U7CisKKyAgZGV2aWNlID0gR1NUX1Y0TDJfREVWSUNFX0NBU1QgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFVklDRV9QQVRIOgorICAgICAgZGV2aWNlLT5kZXZpY2VfcGF0aCA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMmRldmljZXByb3ZpZGVyLmggYi9zeXMvdjRsMi9nc3R2NGwyZGV2aWNlcHJvdmlkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTA1YjM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMmRldmljZXByb3ZpZGVyLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDEyIE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKyAqCisgKiBnc3R2NGwyZGV2aWNlcHJvdmlkZXIuaDogVjRsMiBkZXZpY2UgcHJvYmluZyBhbmQgbW9uaXRvcmluZworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKworI2lmbmRlZiBfX0dTVF9WNEwyX0RFVklDRV9QUk9WSURFUl9IX18KKyNkZWZpbmUgX19HU1RfVjRMMl9ERVZJQ0VfUFJPVklERVJfSF9fCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2lmZGVmIEhBVkVfR1VERVYKKyNpbmNsdWRlIDxndWRldi9ndWRldi5oPgorI2VuZGlmCisKK0dfQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJEZXZpY2VQcm92aWRlciBHc3RWNGwyRGV2aWNlUHJvdmlkZXI7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMkRldmljZVByb3ZpZGVyQ2xhc3MgR3N0VjRsMkRldmljZVByb3ZpZGVyQ2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfVjRMMl9ERVZJQ0VfUFJPVklERVIgICAgICAgICAgICAgICAgIChnc3RfdjRsMl9kZXZpY2VfcHJvdmlkZXJfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfREVWSUNFX1BST1ZJREVSKG9iaikgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX1Y0TDJfREVWSUNFX1BST1ZJREVSKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfREVWSUNFX1BST1ZJREVSX0NMQVNTKGtsYXNzKSAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfVjRMMl9ERVZJQ0VfUFJPVklERVIpKQorI2RlZmluZSBHU1RfVjRMMl9ERVZJQ0VfUFJPVklERVJfR0VUX0NMQVNTKG9iaikgICAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9WNEwyX0RFVklDRV9QUk9WSURFUiwgR3N0VjRsMkRldmljZVByb3ZpZGVyQ2xhc3MpKQorI2RlZmluZSBHU1RfVjRMMl9ERVZJQ0VfUFJPVklERVIob2JqKSAgICAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfVjRMMl9ERVZJQ0VfUFJPVklERVIsIEdzdFY0bDJEZXZpY2VQcm92aWRlcikpCisjZGVmaW5lIEdTVF9WNEwyX0RFVklDRV9QUk9WSURFUl9DTEFTUyhrbGFzcykgICAgICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX0RFVklDRV9QUk9WSURFUiwgR3N0VjRsMkRldmljZVByb3ZpZGVyQ2xhc3MpKQorI2RlZmluZSBHU1RfVjRMMl9ERVZJQ0VfUFJPVklERVJfQ0FTVChvYmopICAgICAgICAgICAgKChHc3RWNGwyRGV2aWNlUHJvdmlkZXIgKikob2JqKSkKKworc3RydWN0IF9Hc3RWNGwyRGV2aWNlUHJvdmlkZXIgeworICBHc3REZXZpY2VQcm92aWRlciAgICAgICAgIHBhcmVudDsKKworI2lmZGVmIEhBVkVfR1VERVYKKyAgR01haW5Db250ZXh0ICpjb250ZXh0OworICBHTWFpbkxvb3AgKmxvb3A7CisgIEdUaHJlYWQgKnRocmVhZDsKKyAgZ2Jvb2xlYW4gc3RhcnRlZDsKKyAgR0NvbmQgc3RhcnRlZF9jb25kOworI2VuZGlmCit9OworCit0eXBlZGVmIGVudW0geworICBHU1RfVjRMMl9ERVZJQ0VfVFlQRV9JTlZBTElEID0gMCwKKyAgR1NUX1Y0TDJfREVWSUNFX1RZUEVfU09VUkNFLAorICBHU1RfVjRMMl9ERVZJQ0VfVFlQRV9TSU5LCit9IEdzdFY0bDJEZXZpY2VUeXBlOworCitzdHJ1Y3QgX0dzdFY0bDJEZXZpY2VQcm92aWRlckNsYXNzIHsKKyAgR3N0RGV2aWNlUHJvdmlkZXJDbGFzcyAgICBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSAgICAgICAgZ3N0X3Y0bDJfZGV2aWNlX3Byb3ZpZGVyX2dldF90eXBlICh2b2lkKTsKKworCit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMkRldmljZSBHc3RWNGwyRGV2aWNlOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJEZXZpY2VDbGFzcyBHc3RWNGwyRGV2aWNlQ2xhc3M7CisKKyNkZWZpbmUgR1NUX1RZUEVfVjRMMl9ERVZJQ0UgICAgICAgICAgICAgICAgIChnc3RfdjRsMl9kZXZpY2VfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfREVWSUNFKG9iaikgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX1Y0TDJfREVWSUNFKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfREVWSUNFX0NMQVNTKGtsYXNzKSAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfVjRMMl9ERVZJQ0UpKQorI2RlZmluZSBHU1RfVjRMMl9ERVZJQ0VfR0VUX0NMQVNTKG9iaikgICAgICAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBHU1RfVFlQRV9WNEwyX0RFVklDRSwgR3N0VjRsMkRldmljZUNsYXNzKSkKKyNkZWZpbmUgR1NUX1Y0TDJfREVWSUNFKG9iaikgICAgICAgICAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX1Y0TDJfREVWSUNFLCBHc3RWNGwyRGV2aWNlKSkKKyNkZWZpbmUgR1NUX1Y0TDJfREVWSUNFX0NMQVNTKGtsYXNzKSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfREVWSUNFLCBHc3RWNGwyRGV2aWNlQ2xhc3MpKQorI2RlZmluZSBHU1RfVjRMMl9ERVZJQ0VfQ0FTVChvYmopICAgICAgICAgICAgKChHc3RWNGwyRGV2aWNlICopKG9iaikpCisKK3N0cnVjdCBfR3N0VjRsMkRldmljZSB7CisgIEdzdERldmljZSAgICAgICAgIHBhcmVudDsKKworICBnY2hhciAgICAgICAgICAgICpkZXZpY2VfcGF0aDsKKyAgZ2NoYXIgICAgICAgICAgICAqc3lzcGF0aDsKKyAgY29uc3QgZ2NoYXIgICAgICAqZWxlbWVudDsKK307CisKK3N0cnVjdCBfR3N0VjRsMkRldmljZUNsYXNzIHsKKyAgR3N0RGV2aWNlQ2xhc3MgICAgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgICAgICAgIGdzdF92NGwyX2RldmljZV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9WNEwyX0RFVklDRV9QUk9WSURFUl9IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJoMjYzZW5jLmMgYi9zeXMvdjRsMi9nc3R2NGwyaDI2M2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNjNhZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwyaDI2M2VuYy5jCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IENvbGxhYm9yYSBJbmMuCisgKiAgICBBdXRob3I6IE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3R2NGwyb2JqZWN0LmgiCisjaW5jbHVkZSAiZ3N0djRsMmgyNjNlbmMuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3Y0bDJfaDI2M19lbmNfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3Y0bDJfaDI2M19lbmNfZGVidWcKKworCitzdGF0aWMgR3N0U3RhdGljQ2FwcyBzcmNfdGVtcGxhdGVfY2FwcyA9CitHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LWgyNjMsIHZhcmlhbnQ9KHN0cmluZykgaXR1Iik7CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBWNEwyX1NURF9PQkpFQ1RfUFJPUFMsCisvKiBUT0RPIGFkZCBIMjYzIGNvbnRyb2xzICovCit9OworCisjZGVmaW5lIGdzdF92NGwyX2gyNjNfZW5jX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFY0bDJIMjYzRW5jLCBnc3RfdjRsMl9oMjYzX2VuYywgR1NUX1RZUEVfVjRMMl9WSURFT19FTkMpOworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfaDI2M19lbmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIC8qIFRPRE8gKi8KK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2gyNjNfZW5jX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICAvKiBUT0RPICovCit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9oMjYzX2VuY19pbml0IChHc3RWNGwySDI2M0VuYyAqIHNlbGYpCit7CisKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX2gyNjNfZW5jX2NsYXNzX2luaXQgKEdzdFY0bDJIMjYzRW5jQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfdjRsMl9oMjYzX2VuY19kZWJ1ZywgInY0bDJoMjYzZW5jIiwgMCwKKyAgICAgICJWNEwyIEguMjYzIEVuY29kZXIiKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIlY0TDIgSC4yNjMgRW5jb2RlciIsCisgICAgICAiQ29kZWMvRW5jb2Rlci9WaWRlbyIsCisgICAgICAiRW5jb2RlIEguMjYzIHZpZGVvIHN0cmVhbXMgdmlhIFY0TDIgQVBJIiwKKyAgICAgICJOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+Iik7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl9oMjYzX2VuY19zZXRfcHJvcGVydHkpOworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX2gyNjNfZW5jX2dldF9wcm9wZXJ0eSk7Cit9CisKKy8qIFByb2JpbmcgZnVuY3Rpb25zICovCitnYm9vbGVhbgorZ3N0X3Y0bDJfaXNfaDI2M19lbmMgKEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdENhcHMgKiBzcmNfY2FwcykKK3sKKyAgcmV0dXJuIGdzdF92NGwyX2lzX3ZpZGVvX2VuYyAoc2lua19jYXBzLCBzcmNfY2FwcywKKyAgICAgIGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZzcmNfdGVtcGxhdGVfY2FwcykpOworfQorCit2b2lkCitnc3RfdjRsMl9oMjYzX2VuY19yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luLCBjb25zdCBnY2hhciAqIGJhc2VuYW1lLAorICAgIGNvbnN0IGdjaGFyICogZGV2aWNlX3BhdGgsIEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdENhcHMgKiBzcmNfY2FwcykKK3sKKyAgZ3N0X3Y0bDJfdmlkZW9fZW5jX3JlZ2lzdGVyIChwbHVnaW4sIEdTVF9UWVBFX1Y0TDJfSDI2M19FTkMsCisgICAgICAiaDI2MyIsIGJhc2VuYW1lLCBkZXZpY2VfcGF0aCwgc2lua19jYXBzLAorICAgICAgZ3N0X3N0YXRpY19jYXBzX2dldCAoJnNyY190ZW1wbGF0ZV9jYXBzKSwgc3JjX2NhcHMpOworfQpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMmgyNjNlbmMuaCBiL3N5cy92NGwyL2dzdHY0bDJoMjYzZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1YTM1NgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJoMjYzZW5jLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBDb2xsYWJvcmEgSW5jLgorICogICAgQXV0aG9yOiBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX19HU1RfVjRMMl9IMjYzX0VOQ19IX18KKyNkZWZpbmUgX19HU1RfVjRMMl9IMjYzX0VOQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlICJnc3R2NGwydmlkZW9lbmMuaCIKKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9WNEwyX0gyNjNfRU5DIFwKKyAgKGdzdF92NGwyX2gyNjNfZW5jX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WNEwyX0gyNjNfRU5DKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVjRMMl9IMjYzX0VOQyxHc3RWNGwySDI2M0VuYykpCisjZGVmaW5lIEdTVF9WNEwyX0gyNjNfRU5DX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1Y0TDJfSDI2M19FTkMsR3N0VjRsMkgyNjNFbmNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19WNEwyX0gyNjNfRU5DKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVjRMMl9IMjYzX0VOQykpCisjZGVmaW5lIEdTVF9JU19WNEwyX0gyNjNfRU5DX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9WNEwyX0gyNjNfRU5DKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwySDI2M0VuYyBHc3RWNGwySDI2M0VuYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwySDI2M0VuY0NsYXNzIEdzdFY0bDJIMjYzRW5jQ2xhc3M7CisKK3N0cnVjdCBfR3N0VjRsMkgyNjNFbmMKK3sKKyAgR3N0VjRsMlZpZGVvRW5jIHBhcmVudDsKK307CisKK3N0cnVjdCBfR3N0VjRsMkgyNjNFbmNDbGFzcworeworICBHc3RWNGwyVmlkZW9FbmNDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfdjRsMl9oMjYzX2VuY19nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF92NGwyX2lzX2gyNjNfZW5jIChHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpOworCit2b2lkIGdzdF92NGwyX2gyNjNfZW5jX3JlZ2lzdGVyIChHc3RQbHVnaW4gKiBwbHVnaW4sIGNvbnN0IGdjaGFyICogYmFzZW5hbWUsCisgICAgY29uc3QgZ2NoYXIgKiBkZXZpY2VfcGF0aCwgR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9WNEwyX0gyNjNfRU5DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMmgyNjRlbmMuYyBiL3N5cy92NGwyL2dzdHY0bDJoMjY0ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjNjAzNgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJoMjY0ZW5jLmMKQEAgLTAsMCArMSwzMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgU1VNT01PIENvbXB1dGVyIEFzc29jaWF0aW9uCisgKiAgICAgQXV0aG9yOiBheWFrYSA8YXlha2FAc291bGlrLmluZm8+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0djRsMm9iamVjdC5oIgorI2luY2x1ZGUgImdzdHY0bDJoMjY0ZW5jLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF92NGwyX2gyNjRfZW5jX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF92NGwyX2gyNjRfZW5jX2RlYnVnCisKKworc3RhdGljIEdzdFN0YXRpY0NhcHMgc3JjX3RlbXBsYXRlX2NhcHMgPQorR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC1oMjY0LCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpIGJ5dGUtc3RyZWFtLCAiCisgICAgImFsaWdubWVudD0oc3RyaW5nKSBhdSIpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgVjRMMl9TVERfT0JKRUNUX1BST1BTLAorLyogVE9ETyBhZGQgSDI2NCBjb250cm9scworICogUFJPUF9JX0ZSQU1FX1FQLAorICogUFJPUF9QX0ZSQU1FX1FQLAorICogUFJPUF9CX0ZSQU1FX1FQLAorICogUFJPUF9NSU5fUVAsCisgKiBQUk9QX01BWF9RUCwKKyAqIFBST1BfOHg4X1RSQU5TRk9STSwKKyAqIFBST1BfQ1BCX1NJWkUsCisgKiBQUk9QX0VOVFJPUFlfTU9ERSwKKyAqIFBST1BfSV9QRVJJT0QsCisgKiBQUk9QX0xPT1BfRklMVEVSX0FMUEhBLAorICogUFJPUF9MT09QX0ZJTFRFUl9CRVRBLAorICogUFJPUF9MT09QX0ZJTFRFUl9NT0RFLAorICogUFJPUF9WVUlfRVhUX1NBUl9IRUlHSFQsCisgKiBQUk9QX1ZVSV9FWFRfU0FSX1dJRFRILAorICogUFJPUF9WVUlfU0FSX0VOQUJMRUQsCisgKiBQUk9QX1ZVSV9TQVJfSURDLAorICogUFJPUF9TRUlfRlJBTUVfUEFDS0lORywKKyAqIFBST1BfU0VJX0ZQX0NVUlJFTlRfRlJBTUVfMCwKKyAqIFBST1BfU0VJX0ZQX0FSUkFOR0VNRU5UX1RZUCwKKyAqIC4uLgorICogKi8KK307CisKKyNkZWZpbmUgZ3N0X3Y0bDJfaDI2NF9lbmNfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRSAoR3N0VjRsMkgyNjRFbmMsIGdzdF92NGwyX2gyNjRfZW5jLCBHU1RfVFlQRV9WNEwyX1ZJREVPX0VOQyk7CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9oMjY0X2VuY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgLyogVE9ETyAqLworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfaDI2NF9lbmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIC8qIFRPRE8gKi8KK30KKworc3RhdGljIGdpbnQKK3Y0bDJfcHJvZmlsZV9mcm9tX3N0cmluZyAoY29uc3QgZ2NoYXIgKiBwcm9maWxlKQoreworICBnaW50IHY0bDJfcHJvZmlsZSA9IC0xOworCisgIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgImJhc2VsaW5lIikpIHsKKyAgICB2NGwyX3Byb2ZpbGUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0JBU0VMSU5FOworICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAiY29uc3RyYWluZWQtYmFzZWxpbmUiKSkgeworICAgIHY0bDJfcHJvZmlsZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQ09OU1RSQUlORURfQkFTRUxJTkU7CisgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKHByb2ZpbGUsICJtYWluIikpIHsKKyAgICB2NGwyX3Byb2ZpbGUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX01BSU47CisgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKHByb2ZpbGUsICJleHRlbmRlZCIpKSB7CisgICAgdjRsMl9wcm9maWxlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9FWFRFTkRFRDsKKyAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgImhpZ2giKSkgeworICAgIHY0bDJfcHJvZmlsZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSDsKKyAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgImhpZ2gtMTAiKSkgeworICAgIHY0bDJfcHJvZmlsZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF8xMDsKKyAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgImhpZ2gtNDoyOjIiKSkgeworICAgIHY0bDJfcHJvZmlsZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80MjI7CisgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKHByb2ZpbGUsICJoaWdoLTQ6NDo0IikpIHsKKyAgICB2NGwyX3Byb2ZpbGUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfNDQ0X1BSRURJQ1RJVkU7CisgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKHByb2ZpbGUsICJoaWdoLTEwLWludHJhIikpIHsKKyAgICB2NGwyX3Byb2ZpbGUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfMTBfSU5UUkE7CisgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKHByb2ZpbGUsICJoaWdoLTQ6MjoyLWludHJhIikpIHsKKyAgICB2NGwyX3Byb2ZpbGUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfNDIyX0lOVFJBOworICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAiaGlnaC00OjQ6NC1pbnRyYSIpKSB7CisgICAgdjRsMl9wcm9maWxlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQ0NF9JTlRSQTsKKyAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgImNhdmxjLTQ6NDo0LWludHJhIikpIHsKKyAgICB2NGwyX3Byb2ZpbGUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0NBVkxDXzQ0NF9JTlRSQTsKKyAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgInNjYWxhYmxlLWJhc2VsaW5lIikpIHsKKyAgICB2NGwyX3Byb2ZpbGUgPSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX1NDQUxBQkxFX0JBU0VMSU5FOworICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAic2NhbGFibGUtaGlnaCIpKSB7CisgICAgdjRsMl9wcm9maWxlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TQ0FMQUJMRV9ISUdIOworICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAic2NhbGFibGUtaGlnaC1pbnRyYSIpKSB7CisgICAgdjRsMl9wcm9maWxlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TQ0FMQUJMRV9ISUdIX0lOVFJBOworICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAic3RlcmVvLWhpZ2giKSkgeworICAgIHY0bDJfcHJvZmlsZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU1RFUkVPX0hJR0g7CisgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKHByb2ZpbGUsICJtdWx0aXZpZXctaGlnaCIpKSB7CisgICAgdjRsMl9wcm9maWxlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9NVUxUSVZJRVdfSElHSDsKKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklORyAoIlVuc3VwcG9ydGVkIHByb2ZpbGUgc3RyaW5nICclcyciLCBwcm9maWxlKTsKKyAgfQorCisgIHJldHVybiB2NGwyX3Byb2ZpbGU7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqCit2NGwyX3Byb2ZpbGVfdG9fc3RyaW5nIChnaW50IHY0bDJfcHJvZmlsZSkKK3sKKyAgc3dpdGNoICh2NGwyX3Byb2ZpbGUpIHsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQkFTRUxJTkU6CisgICAgICByZXR1cm4gImJhc2VsaW5lIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQ09OU1RSQUlORURfQkFTRUxJTkU6CisgICAgICByZXR1cm4gImNvbnN0cmFpbmVkLWJhc2VsaW5lIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfTUFJTjoKKyAgICAgIHJldHVybiAibWFpbiI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0VYVEVOREVEOgorICAgICAgcmV0dXJuICJleHRlbmRlZCI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0g6CisgICAgICByZXR1cm4gImhpZ2giOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzEwOgorICAgICAgcmV0dXJuICJoaWdoLTEwIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80MjI6CisgICAgICByZXR1cm4gImhpZ2gtNDoyOjIiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQ0NF9QUkVESUNUSVZFOgorICAgICAgcmV0dXJuICJoaWdoLTQ6NDo0IjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF8xMF9JTlRSQToKKyAgICAgIHJldHVybiAiaGlnaC0xMC1pbnRyYSI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfNDIyX0lOVFJBOgorICAgICAgcmV0dXJuICJoaWdoLTQ6MjoyLWludHJhIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80NDRfSU5UUkE6CisgICAgICByZXR1cm4gImhpZ2gtNDo0OjQtaW50cmEiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9DQVZMQ180NDRfSU5UUkE6CisgICAgICByZXR1cm4gImNhdmxjLTQ6NDo0LWludHJhIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU0NBTEFCTEVfQkFTRUxJTkU6CisgICAgICByZXR1cm4gInNjYWxhYmxlLWJhc2VsaW5lIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU0NBTEFCTEVfSElHSDoKKyAgICAgIHJldHVybiAic2NhbGFibGUtaGlnaCI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX1NDQUxBQkxFX0hJR0hfSU5UUkE6CisgICAgICByZXR1cm4gInNjYWxhYmxlLWhpZ2gtaW50cmEiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TVEVSRU9fSElHSDoKKyAgICAgIHJldHVybiAic3RlcmVvLWhpZ2giOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9NVUxUSVZJRVdfSElHSDoKKyAgICAgIHJldHVybiAibXVsdGl2aWV3LWhpZ2giOworICAgIGRlZmF1bHQ6CisgICAgICBHU1RfV0FSTklORyAoIlVuc3VwcG9ydGVkIFY0TDIgcHJvZmlsZSAlaSIsIHY0bDJfcHJvZmlsZSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgZ2ludAordjRsMl9sZXZlbF9mcm9tX3N0cmluZyAoY29uc3QgZ2NoYXIgKiBsZXZlbCkKK3sKKyAgZ2ludCB2NGwyX2xldmVsID0gLTE7CisKKyAgaWYgKGdfc3RyX2VxdWFsIChsZXZlbCwgIjEiKSkKKyAgICB2NGwyX2xldmVsID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8wOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAobGV2ZWwsICIxYiIpKQorICAgIHY0bDJfbGV2ZWwgPSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xQjsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKGxldmVsLCAiMS4xIikpCisgICAgdjRsMl9sZXZlbCA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMTsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKGxldmVsLCAiMS4yIikpCisgICAgdjRsMl9sZXZlbCA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMjsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKGxldmVsLCAiMS4zIikpCisgICAgdjRsMl9sZXZlbCA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMzsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKGxldmVsLCAiMiIpKQorICAgIHY0bDJfbGV2ZWwgPSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8yXzA7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChsZXZlbCwgIjIuMSIpKQorICAgIHY0bDJfbGV2ZWwgPSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8yXzE7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChsZXZlbCwgIjIuMiIpKQorICAgIHY0bDJfbGV2ZWwgPSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8yXzI7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChsZXZlbCwgIjMiKSkKKyAgICB2NGwyX2xldmVsID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18wOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAobGV2ZWwsICIzLjEiKSkKKyAgICB2NGwyX2xldmVsID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18xOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAobGV2ZWwsICIzLjIiKSkKKyAgICB2NGwyX2xldmVsID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18yOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAobGV2ZWwsICI0IikpCisgICAgdjRsMl9sZXZlbCA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMDsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKGxldmVsLCAiNC4xIikpCisgICAgdjRsMl9sZXZlbCA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMTsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKGxldmVsLCAiNC4yIikpCisgICAgdjRsMl9sZXZlbCA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMjsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKGxldmVsLCAiNSIpKQorICAgIHY0bDJfbGV2ZWwgPSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF81XzA7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChsZXZlbCwgIjUuMSIpKQorICAgIHY0bDJfbGV2ZWwgPSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF81XzE7CisgIGVsc2UKKyAgICBHU1RfV0FSTklORyAoIlVuc3VwcG9ydGVkIGxldmVsICclcyciLCBsZXZlbCk7CisKKyAgcmV0dXJuIHY0bDJfbGV2ZWw7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqCit2NGwyX2xldmVsX3RvX3N0cmluZyAoZ2ludCB2NGwyX2xldmVsKQoreworICBzd2l0Y2ggKHY0bDJfbGV2ZWwpIHsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMDoKKyAgICAgIHJldHVybiAiMSI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xQjoKKyAgICAgIHJldHVybiAiMWIiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8xOgorICAgICAgcmV0dXJuICIxLjEiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8yOgorICAgICAgcmV0dXJuICIxLjIiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8zOgorICAgICAgcmV0dXJuICIxLjMiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8wOgorICAgICAgcmV0dXJuICIyIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMToKKyAgICAgIHJldHVybiAiMi4xIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMjoKKyAgICAgIHJldHVybiAiMi4yIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzNfMDoKKyAgICAgIHJldHVybiAiMy4wIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzNfMToKKyAgICAgIHJldHVybiAiMy4xIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzNfMjoKKyAgICAgIHJldHVybiAiMy4yIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMDoKKyAgICAgIHJldHVybiAiNCI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzE6CisgICAgICByZXR1cm4gIjQuMSI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzI6CisgICAgICByZXR1cm4gIjQuMiI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF81XzA6CisgICAgICByZXR1cm4gIjUiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNV8xOgorICAgICAgcmV0dXJuICI1LjEiOworICAgIGRlZmF1bHQ6CisgICAgICBHU1RfV0FSTklORyAoIlVuc3VwcG9ydGVkIFY0TDIgbGV2ZWwgJWkiLCB2NGwyX2xldmVsKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9oMjY0X2VuY19pbml0IChHc3RWNGwySDI2NEVuYyAqIHNlbGYpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9oMjY0X2VuY19jbGFzc19pbml0IChHc3RWNGwySDI2NEVuY0NsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RWNGwyVmlkZW9FbmNDbGFzcyAqYmFzZWNsYXNzOworCisgIHBhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoa2xhc3MpOworCisgIGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgYmFzZWNsYXNzID0gKEdzdFY0bDJWaWRlb0VuY0NsYXNzICopIChrbGFzcyk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF92NGwyX2gyNjRfZW5jX2RlYnVnLCAidjRsMmgyNjRlbmMiLCAwLAorICAgICAgIlY0TDIgSC4yNjQgRW5jb2RlciIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiVjRMMiBILjI2NCBFbmNvZGVyIiwKKyAgICAgICJDb2RlYy9FbmNvZGVyL1ZpZGVvIiwKKyAgICAgICJFbmNvZGUgSC4yNjQgdmlkZW8gc3RyZWFtcyB2aWEgVjRMMiBBUEkiLCAiYXlha2EgPGF5YWthQHNvdWxpay5pbmZvPiIpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfaDI2NF9lbmNfc2V0X3Byb3BlcnR5KTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl9oMjY0X2VuY19nZXRfcHJvcGVydHkpOworCisgIGJhc2VjbGFzcy0+Y29kZWNfbmFtZSA9ICJIMjY0IjsKKyAgYmFzZWNsYXNzLT5wcm9maWxlX2NpZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QUk9GSUxFOworICBiYXNlY2xhc3MtPnByb2ZpbGVfdG9fc3RyaW5nID0gdjRsMl9wcm9maWxlX3RvX3N0cmluZzsKKyAgYmFzZWNsYXNzLT5wcm9maWxlX2Zyb21fc3RyaW5nID0gdjRsMl9wcm9maWxlX2Zyb21fc3RyaW5nOworICBiYXNlY2xhc3MtPmxldmVsX2NpZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MRVZFTDsKKyAgYmFzZWNsYXNzLT5sZXZlbF90b19zdHJpbmcgPSB2NGwyX2xldmVsX3RvX3N0cmluZzsKKyAgYmFzZWNsYXNzLT5sZXZlbF9mcm9tX3N0cmluZyA9IHY0bDJfbGV2ZWxfZnJvbV9zdHJpbmc7Cit9CisKKy8qIFByb2JpbmcgZnVuY3Rpb25zICovCitnYm9vbGVhbgorZ3N0X3Y0bDJfaXNfaDI2NF9lbmMgKEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdENhcHMgKiBzcmNfY2FwcykKK3sKKyAgcmV0dXJuIGdzdF92NGwyX2lzX3ZpZGVvX2VuYyAoc2lua19jYXBzLCBzcmNfY2FwcywKKyAgICAgIGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZzcmNfdGVtcGxhdGVfY2FwcykpOworfQorCit2b2lkCitnc3RfdjRsMl9oMjY0X2VuY19yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luLCBjb25zdCBnY2hhciAqIGJhc2VuYW1lLAorICAgIGNvbnN0IGdjaGFyICogZGV2aWNlX3BhdGgsIEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdENhcHMgKiBzcmNfY2FwcykKK3sKKyAgZ3N0X3Y0bDJfdmlkZW9fZW5jX3JlZ2lzdGVyIChwbHVnaW4sIEdTVF9UWVBFX1Y0TDJfSDI2NF9FTkMsCisgICAgICAiaDI2NCIsIGJhc2VuYW1lLCBkZXZpY2VfcGF0aCwgc2lua19jYXBzLAorICAgICAgZ3N0X3N0YXRpY19jYXBzX2dldCAoJnNyY190ZW1wbGF0ZV9jYXBzKSwgc3JjX2NhcHMpOworfQpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMmgyNjRlbmMuaCBiL3N5cy92NGwyL2dzdHY0bDJoMjY0ZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JmYTM0MwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJoMjY0ZW5jLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBTVU1PTU8gQ29tcHV0ZXIgQXNzb2NpYXRpb24uCisgKiAgICAgQXV0aG9yOiBheWFrYSA8YXlha2FAc291bGlrLmluZm8+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX19HU1RfVjRMMl9IMjY0X0VOQ19IX18KKyNkZWZpbmUgX19HU1RfVjRMMl9IMjY0X0VOQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlICJnc3R2NGwydmlkZW9lbmMuaCIKKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9WNEwyX0gyNjRfRU5DIFwKKyAgKGdzdF92NGwyX2gyNjRfZW5jX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WNEwyX0gyNjRfRU5DKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVjRMMl9IMjY0X0VOQyxHc3RWNGwySDI2NEVuYykpCisjZGVmaW5lIEdTVF9WNEwyX0gyNjRfRU5DX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1Y0TDJfSDI2NF9FTkMsR3N0VjRsMkgyNjRFbmNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19WNEwyX0gyNjRfRU5DKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVjRMMl9IMjY0X0VOQykpCisjZGVmaW5lIEdTVF9JU19WNEwyX0gyNjRfRU5DX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9WNEwyX0gyNjRfRU5DKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwySDI2NEVuYyBHc3RWNGwySDI2NEVuYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwySDI2NEVuY0NsYXNzIEdzdFY0bDJIMjY0RW5jQ2xhc3M7CisKK3N0cnVjdCBfR3N0VjRsMkgyNjRFbmMKK3sKKyAgR3N0VjRsMlZpZGVvRW5jIHBhcmVudDsKK307CisKK3N0cnVjdCBfR3N0VjRsMkgyNjRFbmNDbGFzcworeworICBHc3RWNGwyVmlkZW9FbmNDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfdjRsMl9oMjY0X2VuY19nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF92NGwyX2lzX2gyNjRfZW5jIChHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpOworCit2b2lkIGdzdF92NGwyX2gyNjRfZW5jX3JlZ2lzdGVyIChHc3RQbHVnaW4gKiBwbHVnaW4sIGNvbnN0IGdjaGFyICogYmFzZW5hbWUsCisgICAgY29uc3QgZ2NoYXIgKiBkZXZpY2VfcGF0aCwgR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9WNEwyX0gyNjRfRU5DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMm1wZWc0ZW5jLmMgYi9zeXMvdjRsMi9nc3R2NGwybXBlZzRlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjBiYjc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMm1wZWc0ZW5jLmMKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQ29sbGFib3JhIEluYy4KKyAqICAgIEF1dGhvcjogTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHY0bDJvYmplY3QuaCIKKyNpbmNsdWRlICJnc3R2NGwybXBlZzRlbmMuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzdC9nc3QtaTE4bi1wbHVnaW4uaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZ3N0X3Y0bDJfbXBlZzRfZW5jX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF92NGwyX21wZWc0X2VuY19kZWJ1ZworCitzdGF0aWMgR3N0U3RhdGljQ2FwcyBzcmNfdGVtcGxhdGVfY2FwcyA9CitHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIHN5c3RlbXN0cmVhbT0oYm9vbGVhbilGQUxTRSIpOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgVjRMMl9TVERfT0JKRUNUX1BST1BTLAorICAvKiBUT0RPICovCit9OworCisjZGVmaW5lIGdzdF92NGwyX21wZWc0X2VuY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RWNGwyTXBlZzRFbmMsIGdzdF92NGwyX21wZWc0X2VuYywgR1NUX1RZUEVfVjRMMl9WSURFT19FTkMpOworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfbXBlZzRfZW5jX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICAvKiBUT0RPICovCit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9tcGVnNF9lbmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIC8qIFRPRE8gKi8KK30KKworc3RhdGljIGdpbnQKK3Y0bDJfcHJvZmlsZV9mcm9tX3N0cmluZyAoY29uc3QgZ2NoYXIgKiBwcm9maWxlKQoreworICBnaW50IHY0bDJfcHJvZmlsZSA9IC0xOworCisgIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgInNpbXBsZSIpKQorICAgIHY0bDJfcHJvZmlsZSA9IFY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX1NJTVBMRTsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKHByb2ZpbGUsICJhZHZhbmNlZC1zaW1wbGUiKSkKKyAgICB2NGwyX3Byb2ZpbGUgPSBWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9BRFZBTkNFRF9TSU1QTEU7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAiY29yZSIpKQorICAgIHY0bDJfcHJvZmlsZSA9IFY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX0NPUkU7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChwcm9maWxlLCAic2ltcGxlLXNjYWxhYmxlIikpCisgICAgdjRsMl9wcm9maWxlID0gVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfU0lNUExFX1NDQUxBQkxFOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgImFkdmFuY2VkLWNvZGluZy1lZmZpY2llbmN5IikpCisgICAgdjRsMl9wcm9maWxlID0gVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfQURWQU5DRURfQ09ESU5HX0VGRklDSUVOQ1k7CisgIGVsc2UKKyAgICBHU1RfV0FSTklORyAoIlVuc3VwcG9ydGVkIHByb2ZpbGUgc3RyaW5nICclcyciLCBwcm9maWxlKTsKKworICByZXR1cm4gdjRsMl9wcm9maWxlOworfQorCitzdGF0aWMgY29uc3QgZ2NoYXIgKgordjRsMl9wcm9maWxlX3RvX3N0cmluZyAoZ2ludCB2NGwyX3Byb2ZpbGUpCit7CisgIHN3aXRjaCAodjRsMl9wcm9maWxlKSB7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9TSU1QTEU6CisgICAgICByZXR1cm4gInNpbXBsZSI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9BRFZBTkNFRF9TSU1QTEU6CisgICAgICByZXR1cm4gImFkdmFuY2VkLXNpbXBsZSI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9DT1JFOgorICAgICAgcmV0dXJuICJjb3JlIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX1NJTVBMRV9TQ0FMQUJMRToKKyAgICAgIHJldHVybiAic2ltcGxlLXNjYWxhYmxlIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX0FEVkFOQ0VEX0NPRElOR19FRkZJQ0lFTkNZOgorICAgICAgcmV0dXJuICJhZHZhbmNlZC1jb2RpbmctZWZmaWNpZW5jeSI7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HICgiVW5zdXBwb3J0ZWQgVjRMMiBwcm9maWxlICVpIiwgdjRsMl9wcm9maWxlKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBnaW50Cit2NGwyX2xldmVsX2Zyb21fc3RyaW5nIChjb25zdCBnY2hhciAqIGxldmVsKQoreworICBnaW50IHY0bDJfbGV2ZWwgPSAtMTsKKworICBpZiAoZ19zdHJfZXF1YWwgKGxldmVsLCAiMCIpKQorICAgIHY0bDJfbGV2ZWwgPSBWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfMDsKKyAgZWxzZSBpZiAoZ19zdHJfZXF1YWwgKGxldmVsLCAiMGIiKSkKKyAgICB2NGwyX2xldmVsID0gVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzBCOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAobGV2ZWwsICIxIikpCisgICAgdjRsMl9sZXZlbCA9IFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8xOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAobGV2ZWwsICIyIikpCisgICAgdjRsMl9sZXZlbCA9IFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8yOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAobGV2ZWwsICIzIikpCisgICAgdjRsMl9sZXZlbCA9IFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8zOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAobGV2ZWwsICIzYiIpKQorICAgIHY0bDJfbGV2ZWwgPSBWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfM0I7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChsZXZlbCwgIjQiKSkKKyAgICB2NGwyX2xldmVsID0gVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzQ7CisgIGVsc2UgaWYgKGdfc3RyX2VxdWFsIChsZXZlbCwgIjUiKSkKKyAgICB2NGwyX2xldmVsID0gVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzU7CisgIGVsc2UKKyAgICBHU1RfV0FSTklORyAoIlVuc3VwcG9ydGVkIGxldmVsICclcyciLCBsZXZlbCk7CisKKyAgcmV0dXJuIHY0bDJfbGV2ZWw7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqCit2NGwyX2xldmVsX3RvX3N0cmluZyAoZ2ludCB2NGwyX2xldmVsKQoreworICBzd2l0Y2ggKHY0bDJfbGV2ZWwpIHsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8wOgorICAgICAgcmV0dXJuICIwIjsKKyAgICBjYXNlIFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8wQjoKKyAgICAgIHJldHVybiAiMGIiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzE6CisgICAgICByZXR1cm4gIjEiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzI6CisgICAgICByZXR1cm4gIjIiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzM6CisgICAgICByZXR1cm4gIjMiOworICAgIGNhc2UgVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzNCOgorICAgICAgcmV0dXJuICIzYiI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfNDoKKyAgICAgIHJldHVybiAiNCI7CisgICAgY2FzZSBWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfNToKKyAgICAgIHJldHVybiAiNSI7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HICgiVW5zdXBwb3J0ZWQgVjRMMiBsZXZlbCAlaSIsIHY0bDJfbGV2ZWwpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX21wZWc0X2VuY19pbml0IChHc3RWNGwyTXBlZzRFbmMgKiBzZWxmKQoreworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfbXBlZzRfZW5jX2NsYXNzX2luaXQgKEdzdFY0bDJNcGVnNEVuY0NsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RWNGwyVmlkZW9FbmNDbGFzcyAqYmFzZWNsYXNzOworCisgIHBhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoa2xhc3MpOworCisgIGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgYmFzZWNsYXNzID0gKEdzdFY0bDJWaWRlb0VuY0NsYXNzICopIChrbGFzcyk7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF92NGwyX21wZWc0X2VuY19kZWJ1ZywgInY0bDJtcGVnNGVuYyIsIDAsCisgICAgICAiVjRMMiBNUEVHNCBFbmNvZGVyIik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywKKyAgICAgICJWNEwyIE1QRUc0IEVuY29kZXIiLAorICAgICAgIkNvZGVjL0VuY29kZXIvVmlkZW8iLAorICAgICAgIkVuY29kZSBNUEVHNCB2aWRlbyBzdHJlYW1zIHZpYSBWNEwyIEFQSSIsCisgICAgICAiTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tIik7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl9tcGVnNF9lbmNfc2V0X3Byb3BlcnR5KTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl9tcGVnNF9lbmNfZ2V0X3Byb3BlcnR5KTsKKworICBiYXNlY2xhc3MtPmNvZGVjX25hbWUgPSAiTVBFRzQiOworICBiYXNlY2xhc3MtPnByb2ZpbGVfY2lkID0gVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFOworICBiYXNlY2xhc3MtPnByb2ZpbGVfdG9fc3RyaW5nID0gdjRsMl9wcm9maWxlX3RvX3N0cmluZzsKKyAgYmFzZWNsYXNzLT5wcm9maWxlX2Zyb21fc3RyaW5nID0gdjRsMl9wcm9maWxlX2Zyb21fc3RyaW5nOworICBiYXNlY2xhc3MtPmxldmVsX2NpZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfTEVWRUw7CisgIGJhc2VjbGFzcy0+bGV2ZWxfdG9fc3RyaW5nID0gdjRsMl9sZXZlbF90b19zdHJpbmc7CisgIGJhc2VjbGFzcy0+bGV2ZWxfZnJvbV9zdHJpbmcgPSB2NGwyX2xldmVsX2Zyb21fc3RyaW5nOworfQorCisvKiBQcm9iaW5nIGZ1bmN0aW9ucyAqLworZ2Jvb2xlYW4KK2dzdF92NGwyX2lzX21wZWc0X2VuYyAoR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKQoreworICByZXR1cm4gZ3N0X3Y0bDJfaXNfdmlkZW9fZW5jIChzaW5rX2NhcHMsIHNyY19jYXBzLAorICAgICAgZ3N0X3N0YXRpY19jYXBzX2dldCAoJnNyY190ZW1wbGF0ZV9jYXBzKSk7Cit9CisKK3ZvaWQKK2dzdF92NGwyX21wZWc0X2VuY19yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luLCBjb25zdCBnY2hhciAqIGJhc2VuYW1lLAorICAgIGNvbnN0IGdjaGFyICogZGV2aWNlX3BhdGgsIEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdENhcHMgKiBzcmNfY2FwcykKK3sKKyAgZ3N0X3Y0bDJfdmlkZW9fZW5jX3JlZ2lzdGVyIChwbHVnaW4sIEdTVF9UWVBFX1Y0TDJfTVBFRzRfRU5DLAorICAgICAgIm1wZWc0IiwgYmFzZW5hbWUsIGRldmljZV9wYXRoLCBzaW5rX2NhcHMsCisgICAgICBnc3Rfc3RhdGljX2NhcHNfZ2V0ICgmc3JjX3RlbXBsYXRlX2NhcHMpLCBzcmNfY2Fwcyk7Cit9CmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwybXBlZzRlbmMuaCBiL3N5cy92NGwyL2dzdHY0bDJtcGVnNGVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OTQxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwybXBlZzRlbmMuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IENvbGxhYm9yYSBJbmMuCisgKiAgICBBdXRob3I6IE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0dTVF9WNEwyX01QRUc0X0VOQ19IX18KKyNkZWZpbmUgX19HU1RfVjRMMl9NUEVHNF9FTkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSAiZ3N0djRsMnZpZGVvZW5jLmgiCisKK0dfQkVHSU5fREVDTFMKKyNkZWZpbmUgR1NUX1RZUEVfVjRMMl9NUEVHNF9FTkMgXAorICAoZ3N0X3Y0bDJfbXBlZzRfZW5jX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WNEwyX01QRUc0X0VOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1Y0TDJfTVBFRzRfRU5DLEdzdFY0bDJNcGVnNEVuYykpCisjZGVmaW5lIEdTVF9WNEwyX01QRUc0X0VOQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WNEwyX01QRUc0X0VOQyxHc3RWNGwyTXBlZzRFbmNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19WNEwyX01QRUc0X0VOQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1Y0TDJfTVBFRzRfRU5DKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfTVBFRzRfRU5DX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9WNEwyX01QRUc0X0VOQykpCit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMk1wZWc0RW5jIEdzdFY0bDJNcGVnNEVuYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyTXBlZzRFbmNDbGFzcyBHc3RWNGwyTXBlZzRFbmNDbGFzczsKKworc3RydWN0IF9Hc3RWNGwyTXBlZzRFbmMKK3sKKyAgR3N0VjRsMlZpZGVvRW5jIHBhcmVudDsKK307CisKK3N0cnVjdCBfR3N0VjRsMk1wZWc0RW5jQ2xhc3MKK3sKKyAgR3N0VjRsMlZpZGVvRW5jQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ3N0X3Y0bDJfbXBlZzRfZW5jX2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3Y0bDJfaXNfbXBlZzRfZW5jIChHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpOworCit2b2lkIGdzdF92NGwyX21wZWc0X2VuY19yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luLCBjb25zdCBnY2hhciAqIGJhc2VuYW1lLAorICAgIGNvbnN0IGdjaGFyICogZGV2aWNlX3BhdGgsIEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdENhcHMgKiBzcmNfY2Fwcyk7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19HU1RfVjRMMl9NUEVHNF9FTkNfSF9fICovCmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmMgYi9zeXMvdjRsMi9nc3R2NGwyb2JqZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVlNjcwNwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJvYmplY3QuYwpAQCAtMCwwICsxLDQ0ODUgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqICAgICAgICAgICAgICAgMjAwNiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICoKKyAqIGdzdHY0bDJvYmplY3QuYzogYmFzZSBjbGFzcyBmb3IgVjRMMiBlbGVtZW50cworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlCisgKiB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUKKyAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAorICogVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKworI2lmZGVmIEhBVkVfR1VERVYKKyNpbmNsdWRlIDxndWRldi9ndWRldi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQvdmlkZW9kZXYyLmgiCisjaW5jbHVkZSAiZ3N0djRsMm9iamVjdC5oIgorI2luY2x1ZGUgImdzdHY0bDJ0dW5lci5oIgorI2luY2x1ZGUgImdzdHY0bDJjb2xvcmJhbGFuY2UuaCIKKworI2luY2x1ZGUgImdzdC9nc3QtaTE4bi1wbHVnaW4uaCIKKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfRVhURVJOICh2NGwyX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHY0bDJfZGVidWcKKworI2RlZmluZSBERUZBVUxUX1BST1BfREVWSUNFX05BTUUgICAgICAgIE5VTEwKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0RFVklDRV9GRCAgICAgICAgICAtMQorI2RlZmluZSBERUZBVUxUX1BST1BfRkxBR1MgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9QUk9QX1RWX05PUk0gICAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfUFJPUF9JT19NT0RFICAgICAgICAgICAgR1NUX1Y0TDJfSU9fQVVUTworCisjZGVmaW5lIEVOQ09ERURfQlVGRkVSX1NJWkUgICAgICAgICAgICAgKDIgKiAxMDI0ICogMTAyNCkKKworI2lmIFNJWkVPRl9PRkZfVCA9PSA4ICYmICFkZWZpbmVkKG1tYXA2NCkKKyNkZWZpbmUgbW1hcDY0IG1tYXAKKyNlbmRpZgorCitlbnVtCit7CisgIFBST1BfMCwKKyAgVjRMMl9TVERfT0JKRUNUX1BST1BTLAorfTsKKworLyoKKyAqIGNvbW1vbiBmb3JtYXQgLyBjYXBzIHV0aWxpdGllczoKKyAqLwordHlwZWRlZiBlbnVtCit7CisgIEdTVF9WNEwyX1JBVyA9IDEgPDwgMCwKKyAgR1NUX1Y0TDJfQ09ERUMgPSAxIDw8IDEsCisgIEdTVF9WNEwyX1RSQU5TUE9SVCA9IDEgPDwgMiwKKyAgR1NUX1Y0TDJfTk9fUEFSU0UgPSAxIDw8IDMsCisgIEdTVF9WNEwyX0FMTCA9IDB4ZmZmZgorfSBHc3RWNEwyRm9ybWF0RmxhZ3M7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGd1aW50MzIgZm9ybWF0OworICBnYm9vbGVhbiBkaW1lbnNpb25zOworICBHc3RWNEwyRm9ybWF0RmxhZ3MgZmxhZ3M7Cit9IEdzdFY0TDJGb3JtYXREZXNjOworCitzdGF0aWMgY29uc3QgR3N0VjRMMkZvcm1hdERlc2MgZ3N0X3Y0bDJfZm9ybWF0c1tdID0geworICAvKiBSR0IgZm9ybWF0cyAqLworICB7VjRMMl9QSVhfRk1UX1JHQjMzMiwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9BUkdCNTU1LCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1hSR0I1NTUsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfQVJHQjU1NVgsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWFJHQjU1NVgsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfUkdCNTY1LCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1JHQjU2NVgsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfQkdSNjY2LCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX0JHUjI0LCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1JHQjI0LCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX0FCR1IzMiwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9YQkdSMzIsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfQVJHQjMyLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1hSR0IzMiwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKworICAvKiBEZXByZWNhdGVkIFBhY2tlZCBSR0IgSW1hZ2UgRm9ybWF0cyAoYWxwaGEgYW1iaWd1aXR5KSAqLworICB7VjRMMl9QSVhfRk1UX1JHQjQ0NCwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9SR0I1NTUsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfUkdCNTU1WCwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9CR1IzMiwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9SR0IzMiwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKworICAvKiBHcmV5IGZvcm1hdHMgKi8KKyAge1Y0TDJfUElYX0ZNVF9HUkVZLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1k0LCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1k2LCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1kxMCwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9ZMTIsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWTE2LCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1kxNl9CRSwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9ZMTBCUEFDSywgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKworICAvKiBQYWxldHRlIGZvcm1hdHMgKi8KKyAge1Y0TDJfUElYX0ZNVF9QQUw4LCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorCisgIC8qIENocm9taW5hbmNlIGZvcm1hdHMgKi8KKyAge1Y0TDJfUElYX0ZNVF9VVjgsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisKKyAgLyogTHVtaW5hbmNlK0Nocm9taW5hbmNlIGZvcm1hdHMgKi8KKyAge1Y0TDJfUElYX0ZNVF9ZVlU0MTAsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWVZVNDIwLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1lWVTQyME0sIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWVVZViwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9ZWVVWLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1lWWVUsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfVVlWWSwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9WWVVZLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1lVVjQyMlAsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWVVWNDExUCwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9ZNDFQLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1lVVjQ0NCwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9ZVVY1NTUsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWVVWNTY1LCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1lVVjMyLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX1lVVjQxMCwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9ZVVY0MjAsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfWVVWNDIwTSwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9ISTI0MCwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9ITTEyLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX000MjAsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisKKyAgLyogdHdvIHBsYW5lcyAtLSBvbmUgWSwgb25lIENyICsgQ2IgaW50ZXJsZWF2ZWQgICovCisgIHtWNEwyX1BJWF9GTVRfTlYxMiwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9OVjEyTSwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9OVjEyTVQsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfTlYxMk1UXzE2WDE2LCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX05WMjEsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfTlYyMU0sIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfTlYxNiwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9OVjE2TSwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKyAge1Y0TDJfUElYX0ZNVF9OVjYxLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX05WNjFNLCBUUlVFLCBHU1RfVjRMMl9SQVd9LAorICB7VjRMMl9QSVhfRk1UX05WMjQsIFRSVUUsIEdTVF9WNEwyX1JBV30sCisgIHtWNEwyX1BJWF9GTVRfTlY0MiwgVFJVRSwgR1NUX1Y0TDJfUkFXfSwKKworICAvKiBCYXllciBmb3JtYXRzIC0gc2VlIGh0dHA6Ly93d3cuc2lsaWNvbmltYWdpbmcuY29tL1JHQiUyMEJheWVyLmh0bSAqLworICB7VjRMMl9QSVhfRk1UX1NCR0dSOCwgVFJVRSwgR1NUX1Y0TDJfQ09ERUN9LAorICB7VjRMMl9QSVhfRk1UX1NHQlJHOCwgVFJVRSwgR1NUX1Y0TDJfQ09ERUN9LAorICB7VjRMMl9QSVhfRk1UX1NHUkJHOCwgVFJVRSwgR1NUX1Y0TDJfQ09ERUN9LAorICB7VjRMMl9QSVhfRk1UX1NSR0dCOCwgVFJVRSwgR1NUX1Y0TDJfQ09ERUN9LAorCisgIC8qIGNvbXByZXNzZWQgZm9ybWF0cyAqLworICB7VjRMMl9QSVhfRk1UX01KUEVHLCBGQUxTRSwgR1NUX1Y0TDJfQ09ERUN9LAorICB7VjRMMl9QSVhfRk1UX0pQRUcsIEZBTFNFLCBHU1RfVjRMMl9DT0RFQ30sCisgIHtWNEwyX1BJWF9GTVRfUEpQRywgRkFMU0UsIEdTVF9WNEwyX0NPREVDfSwKKyAge1Y0TDJfUElYX0ZNVF9EViwgRkFMU0UsIEdTVF9WNEwyX1RSQU5TUE9SVH0sCisgIHtWNEwyX1BJWF9GTVRfTVBFRywgRkFMU0UsIEdTVF9WNEwyX1RSQU5TUE9SVH0sCisgIHtWNEwyX1BJWF9GTVRfSDI2NCwgRkFMU0UsIEdTVF9WNEwyX0NPREVDfSwKKyAge1Y0TDJfUElYX0ZNVF9IMjY0X05PX1NDLCBGQUxTRSwgR1NUX1Y0TDJfQ09ERUN9LAorICB7VjRMMl9QSVhfRk1UX0gyNjRfTVZDLCBGQUxTRSwgR1NUX1Y0TDJfQ09ERUN9LAorICB7VjRMMl9QSVhfRk1UX0gyNjMsIEZBTFNFLCBHU1RfVjRMMl9DT0RFQ30sCisgIHtWNEwyX1BJWF9GTVRfTVBFRzEsIEZBTFNFLCBHU1RfVjRMMl9DT0RFQ30sCisgIHtWNEwyX1BJWF9GTVRfTVBFRzIsIEZBTFNFLCBHU1RfVjRMMl9DT0RFQ30sCisgIHtWNEwyX1BJWF9GTVRfTVBFRzQsIEZBTFNFLCBHU1RfVjRMMl9DT0RFQ30sCisgIHtWNEwyX1BJWF9GTVRfWFZJRCwgRkFMU0UsIEdTVF9WNEwyX0NPREVDfSwKKyAge1Y0TDJfUElYX0ZNVF9WQzFfQU5ORVhfRywgRkFMU0UsIEdTVF9WNEwyX0NPREVDfSwKKyAge1Y0TDJfUElYX0ZNVF9WQzFfQU5ORVhfTCwgRkFMU0UsIEdTVF9WNEwyX0NPREVDfSwKKyAge1Y0TDJfUElYX0ZNVF9WUDgsIEZBTFNFLCBHU1RfVjRMMl9DT0RFQyB8IEdTVF9WNEwyX05PX1BBUlNFfSwKKyAge1Y0TDJfUElYX0ZNVF9WUDksIEZBTFNFLCBHU1RfVjRMMl9DT0RFQyB8IEdTVF9WNEwyX05PX1BBUlNFfSwKKworICAvKiAgVmVuZG9yLXNwZWNpZmljIGZvcm1hdHMgICAqLworICB7VjRMMl9QSVhfRk1UX1dOVkEsIFRSVUUsIEdTVF9WNEwyX0NPREVDfSwKKyAge1Y0TDJfUElYX0ZNVF9TTjlDMTBYLCBUUlVFLCBHU1RfVjRMMl9DT0RFQ30sCisgIHtWNEwyX1BJWF9GTVRfUFdDMSwgVFJVRSwgR1NUX1Y0TDJfQ09ERUN9LAorICB7VjRMMl9QSVhfRk1UX1BXQzIsIFRSVUUsIEdTVF9WNEwyX0NPREVDfSwKK307CisKKyNkZWZpbmUgR1NUX1Y0TDJfRk9STUFUX0NPVU5UIChHX05fRUxFTUVOVFMgKGdzdF92NGwyX2Zvcm1hdHMpKQorCitzdGF0aWMgR1NMaXN0ICpnc3RfdjRsMl9vYmplY3RfZ2V0X2Zvcm1hdF9saXN0IChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCk7CisKKworI2RlZmluZSBHU1RfVFlQRV9WNEwyX0RFVklDRV9GTEFHUyAoZ3N0X3Y0bDJfZGV2aWNlX2dldF90eXBlICgpKQorc3RhdGljIEdUeXBlCitnc3RfdjRsMl9kZXZpY2VfZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB2NGwyX2RldmljZV90eXBlID0gMDsKKworICBpZiAodjRsMl9kZXZpY2VfdHlwZSA9PSAwKSB7CisgICAgc3RhdGljIGNvbnN0IEdGbGFnc1ZhbHVlIHZhbHVlc1tdID0geworICAgICAge1Y0TDJfQ0FQX1ZJREVPX0NBUFRVUkUsICJEZXZpY2Ugc3VwcG9ydHMgdmlkZW8gY2FwdHVyZSIsICJjYXB0dXJlIn0sCisgICAgICB7VjRMMl9DQVBfVklERU9fT1VUUFVULCAiRGV2aWNlIHN1cHBvcnRzIHZpZGVvIHBsYXliYWNrIiwgIm91dHB1dCJ9LAorICAgICAge1Y0TDJfQ0FQX1ZJREVPX09WRVJMQVksICJEZXZpY2Ugc3VwcG9ydHMgdmlkZW8gb3ZlcmxheSIsICJvdmVybGF5In0sCisKKyAgICAgIHtWNEwyX0NBUF9WQklfQ0FQVFVSRSwgIkRldmljZSBzdXBwb3J0cyB0aGUgVkJJIGNhcHR1cmUiLCAidmJpLWNhcHR1cmUifSwKKyAgICAgIHtWNEwyX0NBUF9WQklfT1VUUFVULCAiRGV2aWNlIHN1cHBvcnRzIHRoZSBWQkkgb3V0cHV0IiwgInZiaS1vdXRwdXQifSwKKworICAgICAge1Y0TDJfQ0FQX1RVTkVSLCAiRGV2aWNlIGhhcyBhIHR1bmVyIG9yIG1vZHVsYXRvciIsICJ0dW5lciJ9LAorICAgICAge1Y0TDJfQ0FQX0FVRElPLCAiRGV2aWNlIGhhcyBhdWRpbyBpbnB1dHMgb3Igb3V0cHV0cyIsICJhdWRpbyJ9LAorCisgICAgICB7MCwgTlVMTCwgTlVMTH0KKyAgICB9OworCisgICAgdjRsMl9kZXZpY2VfdHlwZSA9CisgICAgICAgIGdfZmxhZ3NfcmVnaXN0ZXJfc3RhdGljICgiR3N0VjRsMkRldmljZVR5cGVGbGFncyIsIHZhbHVlcyk7CisgIH0KKworICByZXR1cm4gdjRsMl9kZXZpY2VfdHlwZTsKK30KKworI2RlZmluZSBHU1RfVFlQRV9WNEwyX1RWX05PUk0gKGdzdF92NGwyX3R2X25vcm1fZ2V0X3R5cGUgKCkpCitzdGF0aWMgR1R5cGUKK2dzdF92NGwyX3R2X25vcm1fZ2V0X3R5cGUgKHZvaWQpCit7CisgIHN0YXRpYyBHVHlwZSB2NGwyX3R2X25vcm0gPSAwOworCisgIGlmICghdjRsMl90dl9ub3JtKSB7CisgICAgc3RhdGljIGNvbnN0IEdFbnVtVmFsdWUgdHZfbm9ybXNbXSA9IHsKKyAgICAgIHswLCAibm9uZSIsICJub25lIn0sCisKKyAgICAgIHtWNEwyX1NURF9OVFNDLCAiTlRTQyIsICJOVFNDIn0sCisgICAgICB7VjRMMl9TVERfTlRTQ19NLCAiTlRTQy1NIiwgIk5UU0MtTSJ9LAorICAgICAge1Y0TDJfU1REX05UU0NfTV9KUCwgIk5UU0MtTS1KUCIsICJOVFNDLU0tSlAifSwKKyAgICAgIHtWNEwyX1NURF9OVFNDX01fS1IsICJOVFNDLU0tS1IiLCAiTlRTQy1NLUtSIn0sCisgICAgICB7VjRMMl9TVERfTlRTQ180NDMsICJOVFNDLTQ0MyIsICJOVFNDLTQ0MyJ9LAorCisgICAgICB7VjRMMl9TVERfUEFMLCAiUEFMIiwgIlBBTCJ9LAorICAgICAge1Y0TDJfU1REX1BBTF9CRywgIlBBTC1CRyIsICJQQUwtQkcifSwKKyAgICAgIHtWNEwyX1NURF9QQUxfQiwgIlBBTC1CIiwgIlBBTC1CIn0sCisgICAgICB7VjRMMl9TVERfUEFMX0IxLCAiUEFMLUIxIiwgIlBBTC1CMSJ9LAorICAgICAge1Y0TDJfU1REX1BBTF9HLCAiUEFMLUciLCAiUEFMLUcifSwKKyAgICAgIHtWNEwyX1NURF9QQUxfSCwgIlBBTC1IIiwgIlBBTC1IIn0sCisgICAgICB7VjRMMl9TVERfUEFMX0ksICJQQUwtSSIsICJQQUwtSSJ9LAorICAgICAge1Y0TDJfU1REX1BBTF9ESywgIlBBTC1ESyIsICJQQUwtREsifSwKKyAgICAgIHtWNEwyX1NURF9QQUxfRCwgIlBBTC1EIiwgIlBBTC1EIn0sCisgICAgICB7VjRMMl9TVERfUEFMX0QxLCAiUEFMLUQxIiwgIlBBTC1EMSJ9LAorICAgICAge1Y0TDJfU1REX1BBTF9LLCAiUEFMLUsiLCAiUEFMLUsifSwKKyAgICAgIHtWNEwyX1NURF9QQUxfTSwgIlBBTC1NIiwgIlBBTC1NIn0sCisgICAgICB7VjRMMl9TVERfUEFMX04sICJQQUwtTiIsICJQQUwtTiJ9LAorICAgICAge1Y0TDJfU1REX1BBTF9OYywgIlBBTC1OYyIsICJQQUwtTmMifSwKKyAgICAgIHtWNEwyX1NURF9QQUxfNjAsICJQQUwtNjAiLCAiUEFMLTYwIn0sCisKKyAgICAgIHtWNEwyX1NURF9TRUNBTSwgIlNFQ0FNIiwgIlNFQ0FNIn0sCisgICAgICB7VjRMMl9TVERfU0VDQU1fQiwgIlNFQ0FNLUIiLCAiU0VDQU0tQiJ9LAorICAgICAge1Y0TDJfU1REX1NFQ0FNX0csICJTRUNBTS1HIiwgIlNFQ0FNLUcifSwKKyAgICAgIHtWNEwyX1NURF9TRUNBTV9ILCAiU0VDQU0tSCIsICJTRUNBTS1IIn0sCisgICAgICB7VjRMMl9TVERfU0VDQU1fREssICJTRUNBTS1ESyIsICJTRUNBTS1ESyJ9LAorICAgICAge1Y0TDJfU1REX1NFQ0FNX0QsICJTRUNBTS1EIiwgIlNFQ0FNLUQifSwKKyAgICAgIHtWNEwyX1NURF9TRUNBTV9LLCAiU0VDQU0tSyIsICJTRUNBTS1LIn0sCisgICAgICB7VjRMMl9TVERfU0VDQU1fSzEsICJTRUNBTS1LMSIsICJTRUNBTS1LMSJ9LAorICAgICAge1Y0TDJfU1REX1NFQ0FNX0wsICJTRUNBTS1MIiwgIlNFQ0FNLUwifSwKKyAgICAgIHtWNEwyX1NURF9TRUNBTV9MQywgIlNFQ0FNLUxjIiwgIlNFQ0FNLUxjIn0sCisKKyAgICAgIHswLCBOVUxMLCBOVUxMfQorICAgIH07CisKKyAgICB2NGwyX3R2X25vcm0gPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiVjRMMl9UVl9ub3JtcyIsIHR2X25vcm1zKTsKKyAgfQorCisgIHJldHVybiB2NGwyX3R2X25vcm07Cit9CisKK0dUeXBlCitnc3RfdjRsMl9pb19tb2RlX2dldF90eXBlICh2b2lkKQoreworICBzdGF0aWMgR1R5cGUgdjRsMl9pb19tb2RlID0gMDsKKworICBpZiAoIXY0bDJfaW9fbW9kZSkgeworICAgIHN0YXRpYyBjb25zdCBHRW51bVZhbHVlIGlvX21vZGVzW10gPSB7CisgICAgICB7R1NUX1Y0TDJfSU9fQVVUTywgIkdTVF9WNEwyX0lPX0FVVE8iLCAiYXV0byJ9LAorICAgICAge0dTVF9WNEwyX0lPX1JXLCAiR1NUX1Y0TDJfSU9fUlciLCAicncifSwKKyAgICAgIHtHU1RfVjRMMl9JT19NTUFQLCAiR1NUX1Y0TDJfSU9fTU1BUCIsICJtbWFwIn0sCisgICAgICB7R1NUX1Y0TDJfSU9fVVNFUlBUUiwgIkdTVF9WNEwyX0lPX1VTRVJQVFIiLCAidXNlcnB0ciJ9LAorICAgICAge0dTVF9WNEwyX0lPX0RNQUJVRiwgIkdTVF9WNEwyX0lPX0RNQUJVRiIsICJkbWFidWYifSwKKyAgICAgIHtHU1RfVjRMMl9JT19ETUFCVUZfSU1QT1JULCAiR1NUX1Y0TDJfSU9fRE1BQlVGX0lNUE9SVCIsCisgICAgICAgICAgImRtYWJ1Zi1pbXBvcnQifSwKKworICAgICAgezAsIE5VTEwsIE5VTEx9CisgICAgfTsKKyAgICB2NGwyX2lvX21vZGUgPSBnX2VudW1fcmVnaXN0ZXJfc3RhdGljICgiR3N0VjRsMklPTW9kZSIsIGlvX21vZGVzKTsKKyAgfQorICByZXR1cm4gdjRsMl9pb19tb2RlOworfQorCit2b2lkCitnc3RfdjRsMl9vYmplY3RfaW5zdGFsbF9wcm9wZXJ0aWVzX2hlbHBlciAoR09iamVjdENsYXNzICogZ29iamVjdF9jbGFzcywKKyAgICBjb25zdCBjaGFyICpkZWZhdWx0X2RldmljZSkKK3sKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ERVZJQ0UsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZGV2aWNlIiwgIkRldmljZSIsICJEZXZpY2UgbG9jYXRpb24iLAorICAgICAgICAgIGRlZmF1bHRfZGV2aWNlLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9ERVZJQ0VfTkFNRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJkZXZpY2UtbmFtZSIsICJEZXZpY2UgbmFtZSIsCisgICAgICAgICAgIk5hbWUgb2YgdGhlIGRldmljZSIsIERFRkFVTFRfUFJPUF9ERVZJQ0VfTkFNRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RFVklDRV9GRCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJkZXZpY2UtZmQiLCAiRmlsZSBkZXNjcmlwdG9yIiwKKyAgICAgICAgICAiRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBkZXZpY2UiLCAtMSwgR19NQVhJTlQsIERFRkFVTFRfUFJPUF9ERVZJQ0VfRkQsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9GTEFHUywKKyAgICAgIGdfcGFyYW1fc3BlY19mbGFncyAoImZsYWdzIiwgIkZsYWdzIiwgIkRldmljZSB0eXBlIGZsYWdzIiwKKyAgICAgICAgICBHU1RfVFlQRV9WNEwyX0RFVklDRV9GTEFHUywgREVGQVVMVF9QUk9QX0ZMQUdTLAorICAgICAgICAgIEdfUEFSQU1fUkVBREFCTEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFY0bDJTcmM6YnJpZ2h0bmVzczoKKyAgICoKKyAgICogUGljdHVyZSBicmlnaHRuZXNzLCBvciBtb3JlIHByZWNpc2VseSwgdGhlIGJsYWNrIGxldmVsCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0JSSUdIVE5FU1MsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiYnJpZ2h0bmVzcyIsICJCcmlnaHRuZXNzIiwKKyAgICAgICAgICAiUGljdHVyZSBicmlnaHRuZXNzLCBvciBtb3JlIHByZWNpc2VseSwgdGhlIGJsYWNrIGxldmVsIiwgR19NSU5JTlQsCisgICAgICAgICAgR19NQVhJTlQsIDAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworICAvKioKKyAgICogR3N0VjRsMlNyYzpjb250cmFzdDoKKyAgICoKKyAgICogUGljdHVyZSBjb250cmFzdCBvciBsdW1hIGdhaW4KKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ09OVFJBU1QsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiY29udHJhc3QiLCAiQ29udHJhc3QiLAorICAgICAgICAgICJQaWN0dXJlIGNvbnRyYXN0IG9yIGx1bWEgZ2FpbiIsIEdfTUlOSU5ULAorICAgICAgICAgIEdfTUFYSU5ULCAwLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUyB8IEdTVF9QQVJBTV9DT05UUk9MTEFCTEUpKTsKKyAgLyoqCisgICAqIEdzdFY0bDJTcmM6c2F0dXJhdGlvbjoKKyAgICoKKyAgICogUGljdHVyZSBjb2xvciBzYXR1cmF0aW9uIG9yIGNocm9tYSBnYWluCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1NBVFVSQVRJT04sCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgic2F0dXJhdGlvbiIsICJTYXR1cmF0aW9uIiwKKyAgICAgICAgICAiUGljdHVyZSBjb2xvciBzYXR1cmF0aW9uIG9yIGNocm9tYSBnYWluIiwgR19NSU5JTlQsCisgICAgICAgICAgR19NQVhJTlQsIDAsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTIHwgR1NUX1BBUkFNX0NPTlRST0xMQUJMRSkpOworICAvKioKKyAgICogR3N0VjRsMlNyYzpodWU6CisgICAqCisgICAqIEh1ZSBvciBjb2xvciBiYWxhbmNlCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0hVRSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJodWUiLCAiSHVlIiwKKyAgICAgICAgICAiSHVlIG9yIGNvbG9yIGJhbGFuY2UiLCBHX01JTklOVCwKKyAgICAgICAgICBHX01BWElOVCwgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MgfCBHU1RfUEFSQU1fQ09OVFJPTExBQkxFKSk7CisKKyAgLyoqCisgICAqIEdzdFY0bDJTcmM6bm9ybToKKyAgICoKKyAgICogVFYgbm9ybQorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9UVl9OT1JNLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJub3JtIiwgIlRWIG5vcm0iLAorICAgICAgICAgICJ2aWRlbyBzdGFuZGFyZCIsCisgICAgICAgICAgR1NUX1RZUEVfVjRMMl9UVl9OT1JNLCBERUZBVUxUX1BST1BfVFZfTk9STSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0VjRsMlNyYzppby1tb2RlOgorICAgKgorICAgKiBJTyBNb2RlCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0lPX01PREUsCisgICAgICBnX3BhcmFtX3NwZWNfZW51bSAoImlvLW1vZGUiLCAiSU8gbW9kZSIsCisgICAgICAgICAgIkkvTyBtb2RlIiwKKyAgICAgICAgICBHU1RfVFlQRV9WNEwyX0lPX01PREUsIERFRkFVTFRfUFJPUF9JT19NT0RFLAorICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIC8qKgorICAgKiBHc3RWNGwyU3JjOmV4dHJhLWNvbnRyb2xzOgorICAgKgorICAgKiBBZGRpdGlvbmFsIHY0bDIgY29udHJvbHMgZm9yIHRoZSBkZXZpY2UuIFRoZSBjb250cm9scyBhcmUgaWRlbnRpZmllZAorICAgKiBieSB0aGUgY29udHJvbCBuYW1lIChsb3dlcmNhc2Ugd2l0aCAnXycgZm9yIGFueSBub24tYWxwaGFudW1lcmljCisgICAqIGNoYXJhY3RlcnMpLgorICAgKgorICAgKiBTaW5jZTogMS4yCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0VYVFJBX0NPTlRST0xTLAorICAgICAgZ19wYXJhbV9zcGVjX2JveGVkICgiZXh0cmEtY29udHJvbHMiLCAiRXh0cmEgQ29udHJvbHMiLAorICAgICAgICAgICJFeHRyYSB2NGwyIGNvbnRyb2xzIChDSURzKSBmb3IgdGhlIGRldmljZSIsCisgICAgICAgICAgR1NUX1RZUEVfU1RSVUNUVVJFLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICAvKioKKyAgICogR3N0VjRsMlNyYzpwaXhlbC1hc3BlY3QtcmF0aW86CisgICAqCisgICAqIFRoZSBwaXhlbCBhc3BlY3QgcmF0aW8gb2YgdGhlIGRldmljZS4gVGhpcyBvdmVyd3JpdGVzIHRoZSBwaXhlbCBhc3BlY3QKKyAgICogcmF0aW8gcXVlcmllZCBmcm9tIHRoZSBkZXZpY2UuCisgICAqCisgICAqIFNpbmNlOiAxLjIKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfUElYRUxfQVNQRUNUX1JBVElPLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoInBpeGVsLWFzcGVjdC1yYXRpbyIsICJQaXhlbCBBc3BlY3QgUmF0aW8iLAorICAgICAgICAgICJPdmVyd3JpdGUgdGhlIHBpeGVsIGFzcGVjdCByYXRpbyBvZiB0aGUgZGV2aWNlIiwgIjEvMSIsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgLyoqCisgICAqIEdzdFY0bDJTcmM6Zm9yY2UtYXNwZWN0LXJhdGlvOgorICAgKgorICAgKiBXaGVuIGVuYWJsZWQsIHRoZSBwaXhlbCBhc3BlY3QgcmF0aW8gcXVlcmllZCBmcm9tIHRoZSBkZXZpY2Ugb3Igc2V0CisgICAqIHdpdGggdGhlIHBpeGVsLWFzcGVjdC1yYXRpbyBwcm9wZXJ0eSB3aWxsIGJlIGVuZm9yY2VkLgorICAgKgorICAgKiBTaW5jZTogMS4yCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0ZPUkNFX0FTUEVDVF9SQVRJTywKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgiZm9yY2UtYXNwZWN0LXJhdGlvIiwgIkZvcmNlIGFzcGVjdCByYXRpbyIsCisgICAgICAgICAgIldoZW4gZW5hYmxlZCwgdGhlIHBpeGVsIGFzcGVjdCByYXRpbyB3aWxsIGJlIGVuZm9yY2VkIiwgVFJVRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworfQorCit2b2lkCitnc3RfdjRsMl9vYmplY3RfaW5zdGFsbF9tMm1fcHJvcGVydGllc19oZWxwZXIgKEdPYmplY3RDbGFzcyAqIGdvYmplY3RfY2xhc3MpCit7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfREVWSUNFLAorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRldmljZSIsICJEZXZpY2UiLCAiRGV2aWNlIGxvY2F0aW9uIiwKKyAgICAgICAgICBOVUxMLCBHX1BBUkFNX1JFQURBQkxFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfREVWSUNFX05BTUUsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZGV2aWNlLW5hbWUiLCAiRGV2aWNlIG5hbWUiLAorICAgICAgICAgICJOYW1lIG9mIHRoZSBkZXZpY2UiLCBERUZBVUxUX1BST1BfREVWSUNFX05BTUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0RFVklDRV9GRCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJkZXZpY2UtZmQiLCAiRmlsZSBkZXNjcmlwdG9yIiwKKyAgICAgICAgICAiRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBkZXZpY2UiLCAtMSwgR19NQVhJTlQsIERFRkFVTFRfUFJPUF9ERVZJQ0VfRkQsCisgICAgICAgICAgR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX09VVFBVVF9JT19NT0RFLAorICAgICAgZ19wYXJhbV9zcGVjX2VudW0gKCJvdXRwdXQtaW8tbW9kZSIsICJPdXRwdXQgSU8gbW9kZSIsCisgICAgICAgICAgIk91dHB1dCBzaWRlIEkvTyBtb2RlIChtYXRjaGVzIHNpbmsgcGFkKSIsCisgICAgICAgICAgR1NUX1RZUEVfVjRMMl9JT19NT0RFLCBERUZBVUxUX1BST1BfSU9fTU9ERSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX0NBUFRVUkVfSU9fTU9ERSwKKyAgICAgIGdfcGFyYW1fc3BlY19lbnVtICgiY2FwdHVyZS1pby1tb2RlIiwgIkNhcHR1cmUgSU8gbW9kZSIsCisgICAgICAgICAgIkNhcHR1cmUgSS9PIG1vZGUgKG1hdGNoZXMgc3JjIHBhZCkiLAorICAgICAgICAgIEdTVF9UWVBFX1Y0TDJfSU9fTU9ERSwgREVGQVVMVF9QUk9QX0lPX01PREUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9FWFRSQV9DT05UUk9MUywKKyAgICAgIGdfcGFyYW1fc3BlY19ib3hlZCAoImV4dHJhLWNvbnRyb2xzIiwgIkV4dHJhIENvbnRyb2xzIiwKKyAgICAgICAgICAiRXh0cmEgdjRsMiBjb250cm9scyAoQ0lEcykgZm9yIHRoZSBkZXZpY2UiLAorICAgICAgICAgIEdTVF9UWVBFX1NUUlVDVFVSRSwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7Cit9CisKK0dzdFY0bDJPYmplY3QgKgorZ3N0X3Y0bDJfb2JqZWN0X25ldyAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0T2JqZWN0ICogZGVidWdfb2JqZWN0LAorICAgIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlLAorICAgIGNvbnN0IGNoYXIgKmRlZmF1bHRfZGV2aWNlLAorICAgIEdzdFY0bDJHZXRJbk91dEZ1bmN0aW9uIGdldF9pbl9vdXRfZnVuYywKKyAgICBHc3RWNGwyU2V0SW5PdXRGdW5jdGlvbiBzZXRfaW5fb3V0X2Z1bmMsCisgICAgR3N0VjRsMlVwZGF0ZUZwc0Z1bmN0aW9uIHVwZGF0ZV9mcHNfZnVuYykKK3sKKyAgR3N0VjRsMk9iamVjdCAqdjRsMm9iamVjdDsKKworICAvKgorICAgKiBzb21lIGRlZmF1bHQgdmFsdWVzCisgICAqLworICB2NGwyb2JqZWN0ID0gZ19uZXcwIChHc3RWNGwyT2JqZWN0LCAxKTsKKworICB2NGwyb2JqZWN0LT50eXBlID0gdHlwZTsKKyAgdjRsMm9iamVjdC0+Zm9ybWF0cyA9IE5VTEw7CisKKyAgdjRsMm9iamVjdC0+ZWxlbWVudCA9IGVsZW1lbnQ7CisgIHY0bDJvYmplY3QtPmRiZ19vYmogPSBkZWJ1Z19vYmplY3Q7CisgIHY0bDJvYmplY3QtPmdldF9pbl9vdXRfZnVuYyA9IGdldF9pbl9vdXRfZnVuYzsKKyAgdjRsMm9iamVjdC0+c2V0X2luX291dF9mdW5jID0gc2V0X2luX291dF9mdW5jOworICB2NGwyb2JqZWN0LT51cGRhdGVfZnBzX2Z1bmMgPSB1cGRhdGVfZnBzX2Z1bmM7CisKKyAgdjRsMm9iamVjdC0+dmlkZW9fZmQgPSAtMTsKKyAgdjRsMm9iamVjdC0+YWN0aXZlID0gRkFMU0U7CisgIHY0bDJvYmplY3QtPnZpZGVvZGV2ID0gZ19zdHJkdXAgKGRlZmF1bHRfZGV2aWNlKTsKKworICB2NGwyb2JqZWN0LT5ub3JtcyA9IE5VTEw7CisgIHY0bDJvYmplY3QtPmNoYW5uZWxzID0gTlVMTDsKKyAgdjRsMm9iamVjdC0+Y29sb3JzID0gTlVMTDsKKworICB2NGwyb2JqZWN0LT5rZWVwX2FzcGVjdCA9IFRSVUU7CisKKyAgdjRsMm9iamVjdC0+bl92NGwyX3BsYW5lcyA9IDA7CisKKyAgdjRsMm9iamVjdC0+bm9faW5pdGlhbF9mb3JtYXQgPSBGQUxTRTsKKworICAvKiBXZSBub3cgZGlzYWJsZSBsaWJ2NGwyIGJ5IGRlZmF1bHQsIGJ1dCBoYXZlIGFuIGVudiB0byBlbmFibGUgaXQuICovCisjaWZkZWYgSEFWRV9MSUJWNEwyCisgIGlmIChnX2dldGVudiAoIkdTVF9WNEwyX1VTRV9MSUJWNEwyIikpIHsKKyAgICB2NGwyb2JqZWN0LT5mZF9vcGVuID0gdjRsMl9mZF9vcGVuOworICAgIHY0bDJvYmplY3QtPmNsb3NlID0gdjRsMl9jbG9zZTsKKyAgICB2NGwyb2JqZWN0LT5kdXAgPSB2NGwyX2R1cDsKKyAgICB2NGwyb2JqZWN0LT5pb2N0bCA9IHY0bDJfaW9jdGw7CisgICAgdjRsMm9iamVjdC0+cmVhZCA9IHY0bDJfcmVhZDsKKyAgICB2NGwyb2JqZWN0LT5tbWFwID0gdjRsMl9tbWFwOworICAgIHY0bDJvYmplY3QtPm11bm1hcCA9IHY0bDJfbXVubWFwOworICB9IGVsc2UKKyNlbmRpZgorICB7CisgICAgdjRsMm9iamVjdC0+ZmRfb3BlbiA9IE5VTEw7CisgICAgdjRsMm9iamVjdC0+Y2xvc2UgPSBjbG9zZTsKKyAgICB2NGwyb2JqZWN0LT5kdXAgPSBkdXA7CisgICAgdjRsMm9iamVjdC0+aW9jdGwgPSBpb2N0bDsKKyAgICB2NGwyb2JqZWN0LT5yZWFkID0gcmVhZDsKKyAgICB2NGwyb2JqZWN0LT5tbWFwID0gbW1hcDsKKyAgICB2NGwyb2JqZWN0LT5tdW5tYXAgPSBtdW5tYXA7CisgIH0KKworICByZXR1cm4gdjRsMm9iamVjdDsKK30KKworc3RhdGljIGdib29sZWFuIGdzdF92NGwyX29iamVjdF9jbGVhcl9mb3JtYXRfbGlzdCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpOworCisKK3ZvaWQKK2dzdF92NGwyX29iamVjdF9kZXN0cm95IChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAodjRsMm9iamVjdCAhPSBOVUxMKTsKKworICBnX2ZyZWUgKHY0bDJvYmplY3QtPnZpZGVvZGV2KTsKKworICBnX2ZyZWUgKHY0bDJvYmplY3QtPmNoYW5uZWwpOworCisgIGlmICh2NGwyb2JqZWN0LT5mb3JtYXRzKSB7CisgICAgZ3N0X3Y0bDJfb2JqZWN0X2NsZWFyX2Zvcm1hdF9saXN0ICh2NGwyb2JqZWN0KTsKKyAgfQorCisgIGlmICh2NGwyb2JqZWN0LT5wcm9iZWRfY2FwcykgeworICAgIGdzdF9jYXBzX3VucmVmICh2NGwyb2JqZWN0LT5wcm9iZWRfY2Fwcyk7CisgIH0KKworICBpZiAodjRsMm9iamVjdC0+ZXh0cmFfY29udHJvbHMpIHsKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHY0bDJvYmplY3QtPmV4dHJhX2NvbnRyb2xzKTsKKyAgfQorCisgIGdfZnJlZSAodjRsMm9iamVjdCk7Cit9CisKKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl9vYmplY3RfY2xlYXJfZm9ybWF0X2xpc3QgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KQoreworICBnX3NsaXN0X2ZvcmVhY2ggKHY0bDJvYmplY3QtPmZvcm1hdHMsIChHRnVuYykgZ19mcmVlLCBOVUxMKTsKKyAgZ19zbGlzdF9mcmVlICh2NGwyb2JqZWN0LT5mb3JtYXRzKTsKKyAgdjRsMm9iamVjdC0+Zm9ybWF0cyA9IE5VTEw7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnaW50Citnc3RfdjRsMl9vYmplY3RfcHJvcF90b19jaWQgKGd1aW50IHByb3BfaWQpCit7CisgIGdpbnQgY2lkID0gLTE7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0JSSUdIVE5FU1M6CisgICAgICBjaWQgPSBWNEwyX0NJRF9CUklHSFRORVNTOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0NPTlRSQVNUOgorICAgICAgY2lkID0gVjRMMl9DSURfQ09OVFJBU1Q7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0FUVVJBVElPTjoKKyAgICAgIGNpZCA9IFY0TDJfQ0lEX1NBVFVSQVRJT047CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSFVFOgorICAgICAgY2lkID0gVjRMMl9DSURfSFVFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HICgidW5tYXBwZWQgcHJvcGVydHkgaWQ6ICVkIiwgcHJvcF9pZCk7CisgIH0KKyAgcmV0dXJuIGNpZDsKK30KKworCitnYm9vbGVhbgorZ3N0X3Y0bDJfb2JqZWN0X3NldF9wcm9wZXJ0eV9oZWxwZXIgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9ERVZJQ0U6CisgICAgICBnX2ZyZWUgKHY0bDJvYmplY3QtPnZpZGVvZGV2KTsKKyAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2ID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQlJJR0hUTkVTUzoKKyAgICBjYXNlIFBST1BfQ09OVFJBU1Q6CisgICAgY2FzZSBQUk9QX1NBVFVSQVRJT046CisgICAgY2FzZSBQUk9QX0hVRToKKyAgICB7CisgICAgICBnaW50IGNpZCA9IGdzdF92NGwyX29iamVjdF9wcm9wX3RvX2NpZCAocHJvcF9pZCk7CisKKyAgICAgIGlmIChjaWQgIT0gLTEpIHsKKyAgICAgICAgaWYgKEdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKSB7CisgICAgICAgICAgZ3N0X3Y0bDJfc2V0X2F0dHJpYnV0ZSAodjRsMm9iamVjdCwgY2lkLCBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9UVl9OT1JNOgorICAgICAgdjRsMm9iamVjdC0+dHZfbm9ybSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworI2lmIDAKKyAgICBjYXNlIFBST1BfQ0hBTk5FTDoKKyAgICAgIGlmIChHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSkgeworICAgICAgICBHc3RUdW5lciAqdHVuZXIgPSBHU1RfVFVORVIgKHY0bDJvYmplY3QtPmVsZW1lbnQpOworICAgICAgICBHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWwgPSBnc3RfdHVuZXJfZmluZF9jaGFubmVsX2J5X25hbWUgKHR1bmVyLAorICAgICAgICAgICAgKGdjaGFyICopIGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKKworICAgICAgICBpZiAoY2hhbm5lbCkgeworICAgICAgICAgIC8qIGxpa2UgZ3N0X3R1bmVyX3NldF9jaGFubmVsICh0dW5lciwgY2hhbm5lbCkKKyAgICAgICAgICAgICB3aXRob3V0IGdfb2JqZWN0X25vdGlmeSAqLworICAgICAgICAgIGdzdF92NGwyX3R1bmVyX3NldF9jaGFubmVsICh2NGwyb2JqZWN0LCBjaGFubmVsKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ19mcmVlICh2NGwyb2JqZWN0LT5jaGFubmVsKTsKKyAgICAgICAgdjRsMm9iamVjdC0+Y2hhbm5lbCA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZSRVFVRU5DWToKKyAgICAgIGlmIChHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSkgeworICAgICAgICBHc3RUdW5lciAqdHVuZXIgPSBHU1RfVFVORVIgKHY0bDJvYmplY3QtPmVsZW1lbnQpOworICAgICAgICBHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWwgPSBnc3RfdHVuZXJfZ2V0X2NoYW5uZWwgKHR1bmVyKTsKKworICAgICAgICBpZiAoY2hhbm5lbCAmJgorICAgICAgICAgICAgR1NUX1RVTkVSX0NIQU5ORUxfSEFTX0ZMQUcgKGNoYW5uZWwsIEdTVF9UVU5FUl9DSEFOTkVMX0ZSRVFVRU5DWSkpIHsKKyAgICAgICAgICAvKiBsaWtlCisgICAgICAgICAgICAgZ3N0X3R1bmVyX3NldF9mcmVxdWVuY3kgKHR1bmVyLCBjaGFubmVsLCBnX3ZhbHVlX2dldF91bG9uZyAodmFsdWUpKQorICAgICAgICAgICAgIHdpdGhvdXQgZ19vYmplY3Rfbm90aWZ5ICovCisgICAgICAgICAgZ3N0X3Y0bDJfdHVuZXJfc2V0X2ZyZXF1ZW5jeSAodjRsMm9iamVjdCwgY2hhbm5lbCwKKyAgICAgICAgICAgICAgZ192YWx1ZV9nZXRfdWxvbmcgKHZhbHVlKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHY0bDJvYmplY3QtPmZyZXF1ZW5jeSA9IGdfdmFsdWVfZ2V0X3Vsb25nICh2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgY2FzZSBQUk9QX0lPX01PREU6CisgICAgICB2NGwyb2JqZWN0LT5yZXFfbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DQVBUVVJFX0lPX01PREU6CisgICAgICBnX3JldHVybl92YWxfaWZfZmFpbCAoIVY0TDJfVFlQRV9JU19PVVRQVVQgKHY0bDJvYmplY3QtPnR5cGUpLCBGQUxTRSk7CisgICAgICB2NGwyb2JqZWN0LT5yZXFfbW9kZSA9IGdfdmFsdWVfZ2V0X2VudW0gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9PVVRQVVRfSU9fTU9ERToKKyAgICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChWNEwyX1RZUEVfSVNfT1VUUFVUICh2NGwyb2JqZWN0LT50eXBlKSwgRkFMU0UpOworICAgICAgdjRsMm9iamVjdC0+cmVxX21vZGUgPSBnX3ZhbHVlX2dldF9lbnVtICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRVhUUkFfQ09OVFJPTFM6eworICAgICAgY29uc3QgR3N0U3RydWN0dXJlICpzID0gZ3N0X3ZhbHVlX2dldF9zdHJ1Y3R1cmUgKHZhbHVlKTsKKworICAgICAgaWYgKHY0bDJvYmplY3QtPmV4dHJhX2NvbnRyb2xzKQorICAgICAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHY0bDJvYmplY3QtPmV4dHJhX2NvbnRyb2xzKTsKKworICAgICAgdjRsMm9iamVjdC0+ZXh0cmFfY29udHJvbHMgPSBzID8gZ3N0X3N0cnVjdHVyZV9jb3B5IChzKSA6IE5VTEw7CisgICAgICBpZiAoR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpCisgICAgICAgIGdzdF92NGwyX3NldF9jb250cm9scyAodjRsMm9iamVjdCwgdjRsMm9iamVjdC0+ZXh0cmFfY29udHJvbHMpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9QSVhFTF9BU1BFQ1RfUkFUSU86CisgICAgICBpZiAodjRsMm9iamVjdC0+cGFyKSB7CisgICAgICAgIGdfdmFsdWVfdW5zZXQgKHY0bDJvYmplY3QtPnBhcik7CisgICAgICAgIGdfZnJlZSAodjRsMm9iamVjdC0+cGFyKTsKKyAgICAgIH0KKyAgICAgIHY0bDJvYmplY3QtPnBhciA9IGdfbmV3MCAoR1ZhbHVlLCAxKTsKKyAgICAgIGdfdmFsdWVfaW5pdCAodjRsMm9iamVjdC0+cGFyLCBHU1RfVFlQRV9GUkFDVElPTik7CisgICAgICBpZiAoIWdfdmFsdWVfdHJhbnNmb3JtICh2YWx1ZSwgdjRsMm9iamVjdC0+cGFyKSkgeworICAgICAgICBnX3dhcm5pbmcgKCJDb3VsZCBub3QgdHJhbnNmb3JtIHN0cmluZyB0byBhc3BlY3QgcmF0aW8iKTsKKyAgICAgICAgZ3N0X3ZhbHVlX3NldF9mcmFjdGlvbiAodjRsMm9iamVjdC0+cGFyLCAxLCAxKTsKKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgInNldCBQQVIgdG8gJWQvJWQiLAorICAgICAgICAgIGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fbnVtZXJhdG9yICh2NGwyb2JqZWN0LT5wYXIpLAorICAgICAgICAgIGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fZGVub21pbmF0b3IgKHY0bDJvYmplY3QtPnBhcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0ZPUkNFX0FTUEVDVF9SQVRJTzoKKyAgICAgIHY0bDJvYmplY3QtPmtlZXBfYXNwZWN0ID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBUUlVFOworfQorCisKK2dib29sZWFuCitnc3RfdjRsMl9vYmplY3RfZ2V0X3Byb3BlcnR5X2hlbHBlciAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0RFVklDRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHY0bDJvYmplY3QtPnZpZGVvZGV2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9ERVZJQ0VfTkFNRToKKyAgICB7CisgICAgICBjb25zdCBndWNoYXIgKm5ldyA9IE5VTEw7CisKKyAgICAgIGlmIChHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSkgeworICAgICAgICBuZXcgPSB2NGwyb2JqZWN0LT52Y2FwLmNhcmQ7CisgICAgICB9IGVsc2UgaWYgKGdzdF92NGwyX29wZW4gKHY0bDJvYmplY3QpKSB7CisgICAgICAgIG5ldyA9IHY0bDJvYmplY3QtPnZjYXAuY2FyZDsKKyAgICAgICAgZ3N0X3Y0bDJfY2xvc2UgKHY0bDJvYmplY3QpOworICAgICAgfQorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgKGdjaGFyICopIG5ldyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0RFVklDRV9GRDoKKyAgICB7CisgICAgICBpZiAoR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpCisgICAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHY0bDJvYmplY3QtPnZpZGVvX2ZkKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgREVGQVVMVF9QUk9QX0RFVklDRV9GRCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0ZMQUdTOgorICAgIHsKKyAgICAgIGd1aW50IGZsYWdzID0gMDsKKworICAgICAgaWYgKEdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKSB7CisgICAgICAgIGZsYWdzIHw9IHY0bDJvYmplY3QtPmRldmljZV9jYXBzICYKKyAgICAgICAgICAgIChWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKKyAgICAgICAgICAgIFY0TDJfQ0FQX1ZJREVPX09VVFBVVCB8CisgICAgICAgICAgICBWNEwyX0NBUF9WSURFT19PVkVSTEFZIHwKKyAgICAgICAgICAgIFY0TDJfQ0FQX1ZCSV9DQVBUVVJFIHwKKyAgICAgICAgICAgIFY0TDJfQ0FQX1ZCSV9PVVRQVVQgfCBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX0FVRElPKTsKKworICAgICAgICBpZiAodjRsMm9iamVjdC0+ZGV2aWNlX2NhcHMgJiBWNEwyX0NBUF9WSURFT19DQVBUVVJFX01QTEFORSkKKyAgICAgICAgICBmbGFncyB8PSBWNEwyX0NBUF9WSURFT19DQVBUVVJFOworCisgICAgICAgIGlmICh2NGwyb2JqZWN0LT5kZXZpY2VfY2FwcyAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVF9NUExBTkUpCisgICAgICAgICAgZmxhZ3MgfD0gVjRMMl9DQVBfVklERU9fT1VUUFVUOworICAgICAgfQorICAgICAgZ192YWx1ZV9zZXRfZmxhZ3MgKHZhbHVlLCBmbGFncyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0JSSUdIVE5FU1M6CisgICAgY2FzZSBQUk9QX0NPTlRSQVNUOgorICAgIGNhc2UgUFJPUF9TQVRVUkFUSU9OOgorICAgIGNhc2UgUFJPUF9IVUU6CisgICAgeworICAgICAgZ2ludCBjaWQgPSBnc3RfdjRsMl9vYmplY3RfcHJvcF90b19jaWQgKHByb3BfaWQpOworCisgICAgICBpZiAoY2lkICE9IC0xKSB7CisgICAgICAgIGlmIChHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSkgeworICAgICAgICAgIGdpbnQgdjsKKyAgICAgICAgICBpZiAoZ3N0X3Y0bDJfZ2V0X2F0dHJpYnV0ZSAodjRsMm9iamVjdCwgY2lkLCAmdikpIHsKKyAgICAgICAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHYpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RWX05PUk06CisgICAgICBnX3ZhbHVlX3NldF9lbnVtICh2YWx1ZSwgdjRsMm9iamVjdC0+dHZfbm9ybSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfSU9fTU9ERToKKyAgICAgIGdfdmFsdWVfc2V0X2VudW0gKHZhbHVlLCB2NGwyb2JqZWN0LT5yZXFfbW9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0FQVFVSRV9JT19NT0RFOgorICAgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKCFWNEwyX1RZUEVfSVNfT1VUUFVUICh2NGwyb2JqZWN0LT50eXBlKSwgRkFMU0UpOworICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHY0bDJvYmplY3QtPnJlcV9tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9PVVRQVVRfSU9fTU9ERToKKyAgICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChWNEwyX1RZUEVfSVNfT1VUUFVUICh2NGwyb2JqZWN0LT50eXBlKSwgRkFMU0UpOworICAgICAgZ192YWx1ZV9zZXRfZW51bSAodmFsdWUsIHY0bDJvYmplY3QtPnJlcV9tb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9FWFRSQV9DT05UUk9MUzoKKyAgICAgIGdzdF92YWx1ZV9zZXRfc3RydWN0dXJlICh2YWx1ZSwgdjRsMm9iamVjdC0+ZXh0cmFfY29udHJvbHMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1BJWEVMX0FTUEVDVF9SQVRJTzoKKyAgICAgIGlmICh2NGwyb2JqZWN0LT5wYXIpCisgICAgICAgIGdfdmFsdWVfdHJhbnNmb3JtICh2NGwyb2JqZWN0LT5wYXIsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9GT1JDRV9BU1BFQ1RfUkFUSU86CisgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuICh2YWx1ZSwgdjRsMm9iamVjdC0+a2VlcF9hc3BlY3QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfZ2V0X2RyaXZlcl9taW5fYnVmZmVycyAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpCit7CisgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbCA9IHsgMCwgfTsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSk7CisKKyAgaWYgKFY0TDJfVFlQRV9JU19PVVRQVVQgKHY0bDJvYmplY3QtPnR5cGUpKQorICAgIGNvbnRyb2wuaWQgPSBWNEwyX0NJRF9NSU5fQlVGRkVSU19GT1JfT1VUUFVUOworICBlbHNlCisgICAgY29udHJvbC5pZCA9IFY0TDJfQ0lEX01JTl9CVUZGRVJTX0ZPUl9DQVBUVVJFOworCisgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19HX0NUUkwsICZjb250cm9sKSA9PSAwKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgImRyaXZlciByZXF1aXJlcyBhIG1pbmltdW0gb2YgJWQgYnVmZmVycyIsIGNvbnRyb2wudmFsdWUpOworICAgIHY0bDJvYmplY3QtPm1pbl9idWZmZXJzID0gY29udHJvbC52YWx1ZTsKKyAgfSBlbHNlIHsKKyAgICB2NGwyb2JqZWN0LT5taW5fYnVmZmVycyA9IDA7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3NldF9kZWZhdWx0cyAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpCit7CisgIEdzdFR1bmVyTm9ybSAqbm9ybSA9IE5VTEw7CisgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbCA9IE5VTEw7CisgIEdzdFR1bmVyICp0dW5lcjsKKworICBpZiAoIUdTVF9JU19UVU5FUiAodjRsMm9iamVjdC0+ZWxlbWVudCkpCisgICAgcmV0dXJuOworCisgIHR1bmVyID0gR1NUX1RVTkVSICh2NGwyb2JqZWN0LT5lbGVtZW50KTsKKworICBpZiAodjRsMm9iamVjdC0+dHZfbm9ybSkKKyAgICBub3JtID0gZ3N0X3Y0bDJfdHVuZXJfZ2V0X25vcm1fYnlfc3RkX2lkICh2NGwyb2JqZWN0LCB2NGwyb2JqZWN0LT50dl9ub3JtKTsKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgInR2X25vcm09MHglIiBHX0dJTlQ2NF9NT0RJRklFUiAieCwgIgorICAgICAgIm5vcm09JXAiLCAoZ3VpbnQ2NCkgdjRsMm9iamVjdC0+dHZfbm9ybSwgbm9ybSk7CisgIGlmIChub3JtKSB7CisgICAgZ3N0X3R1bmVyX3NldF9ub3JtICh0dW5lciwgbm9ybSk7CisgIH0gZWxzZSB7CisgICAgbm9ybSA9CisgICAgICAgIEdTVF9UVU5FUl9OT1JNIChnc3RfdHVuZXJfZ2V0X25vcm0gKEdTVF9UVU5FUiAodjRsMm9iamVjdC0+ZWxlbWVudCkpKTsKKyAgICBpZiAobm9ybSkgeworICAgICAgdjRsMm9iamVjdC0+dHZfbm9ybSA9CisgICAgICAgICAgZ3N0X3Y0bDJfdHVuZXJfZ2V0X3N0ZF9pZF9ieV9ub3JtICh2NGwyb2JqZWN0LCBub3JtKTsKKyAgICAgIGdzdF90dW5lcl9ub3JtX2NoYW5nZWQgKHR1bmVyLCBub3JtKTsKKyAgICB9CisgIH0KKworICBpZiAodjRsMm9iamVjdC0+Y2hhbm5lbCkKKyAgICBjaGFubmVsID0gZ3N0X3R1bmVyX2ZpbmRfY2hhbm5lbF9ieV9uYW1lICh0dW5lciwgdjRsMm9iamVjdC0+Y2hhbm5lbCk7CisgIGlmIChjaGFubmVsKSB7CisgICAgZ3N0X3R1bmVyX3NldF9jaGFubmVsICh0dW5lciwgY2hhbm5lbCk7CisgIH0gZWxzZSB7CisgICAgY2hhbm5lbCA9CisgICAgICAgIEdTVF9UVU5FUl9DSEFOTkVMIChnc3RfdHVuZXJfZ2V0X2NoYW5uZWwgKEdTVF9UVU5FUgorICAgICAgICAgICAgKHY0bDJvYmplY3QtPmVsZW1lbnQpKSk7CisgICAgaWYgKGNoYW5uZWwpIHsKKyAgICAgIGdfZnJlZSAodjRsMm9iamVjdC0+Y2hhbm5lbCk7CisgICAgICB2NGwyb2JqZWN0LT5jaGFubmVsID0gZ19zdHJkdXAgKGNoYW5uZWwtPmxhYmVsKTsKKyAgICAgIGdzdF90dW5lcl9jaGFubmVsX2NoYW5nZWQgKHR1bmVyLCBjaGFubmVsKTsKKyAgICB9CisgIH0KKworICBpZiAoY2hhbm5lbAorICAgICAgJiYgR1NUX1RVTkVSX0NIQU5ORUxfSEFTX0ZMQUcgKGNoYW5uZWwsIEdTVF9UVU5FUl9DSEFOTkVMX0ZSRVFVRU5DWSkpIHsKKyAgICBpZiAodjRsMm9iamVjdC0+ZnJlcXVlbmN5ICE9IDApIHsKKyAgICAgIGdzdF90dW5lcl9zZXRfZnJlcXVlbmN5ICh0dW5lciwgY2hhbm5lbCwgdjRsMm9iamVjdC0+ZnJlcXVlbmN5KTsKKyAgICB9IGVsc2UgeworICAgICAgdjRsMm9iamVjdC0+ZnJlcXVlbmN5ID0gZ3N0X3R1bmVyX2dldF9mcmVxdWVuY3kgKHR1bmVyLCBjaGFubmVsKTsKKyAgICAgIGlmICh2NGwyb2JqZWN0LT5mcmVxdWVuY3kgPT0gMCkgeworICAgICAgICAvKiBndWVzcyAqLworICAgICAgICBnc3RfdHVuZXJfc2V0X2ZyZXF1ZW5jeSAodHVuZXIsIGNoYW5uZWwsIDEwMDApOworICAgICAgfSBlbHNlIHsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX29iamVjdF9vcGVuIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCkKK3sKKyAgaWYgKGdzdF92NGwyX29wZW4gKHY0bDJvYmplY3QpKQorICAgIGdzdF92NGwyX3NldF9kZWZhdWx0cyAodjRsMm9iamVjdCk7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9vYmplY3Rfb3Blbl9zaGFyZWQgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBHc3RWNGwyT2JqZWN0ICogb3RoZXIpCit7CisgIGdib29sZWFuIHJldDsKKworICByZXQgPSBnc3RfdjRsMl9kdXAgKHY0bDJvYmplY3QsIG90aGVyKTsKKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfb2JqZWN0X2Nsb3NlIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCkKK3sKKyAgaWYgKCFnc3RfdjRsMl9jbG9zZSAodjRsMm9iamVjdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGdzdF9jYXBzX3JlcGxhY2UgKCZ2NGwyb2JqZWN0LT5wcm9iZWRfY2FwcywgTlVMTCk7CisKKyAgLyogcmVzZXQgb3VyIGNvcHkgb2YgdGhlIGRldmljZSBjYXBzICovCisgIHY0bDJvYmplY3QtPmRldmljZV9jYXBzID0gMDsKKworICBpZiAodjRsMm9iamVjdC0+Zm9ybWF0cykgeworICAgIGdzdF92NGwyX29iamVjdF9jbGVhcl9mb3JtYXRfbGlzdCAodjRsMm9iamVjdCk7CisgIH0KKworICBpZiAodjRsMm9iamVjdC0+cGFyKSB7CisgICAgZ192YWx1ZV91bnNldCAodjRsMm9iamVjdC0+cGFyKTsKKyAgICBnX2ZyZWUgKHY0bDJvYmplY3QtPnBhcik7CisgICAgdjRsMm9iamVjdC0+cGFyID0gTlVMTDsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgc3RydWN0IHY0bDJfZm10ZGVzYyAqCitnc3RfdjRsMl9vYmplY3RfZ2V0X2Zvcm1hdF9mcm9tX2ZvdXJjYyAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgZ3VpbnQzMiBmb3VyY2MpCit7CisgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZtdDsKKyAgR1NMaXN0ICp3YWxrOworCisgIGlmIChmb3VyY2MgPT0gMCkKKyAgICByZXR1cm4gTlVMTDsKKworICB3YWxrID0gZ3N0X3Y0bDJfb2JqZWN0X2dldF9mb3JtYXRfbGlzdCAodjRsMm9iamVjdCk7CisgIHdoaWxlICh3YWxrKSB7CisgICAgZm10ID0gKHN0cnVjdCB2NGwyX2ZtdGRlc2MgKikgd2Fsay0+ZGF0YTsKKyAgICBpZiAoZm10LT5waXhlbGZvcm1hdCA9PSBmb3VyY2MpCisgICAgICByZXR1cm4gZm10OworICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IganBlZyAqLworICAgIGlmIChmbXQtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9NSlBFRyB8fAorICAgICAgICBmbXQtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9KUEVHIHx8CisgICAgICAgIGZtdC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1BKUEcpIHsKKyAgICAgIGlmIChmb3VyY2MgPT0gVjRMMl9QSVhfRk1UX0pQRUcgfHwgZm91cmNjID09IFY0TDJfUElYX0ZNVF9NSlBFRyB8fAorICAgICAgICAgIGZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfUEpQRykgeworICAgICAgICByZXR1cm4gZm10OworICAgICAgfQorICAgIH0KKyAgICB3YWxrID0gZ19zbGlzdF9uZXh0ICh3YWxrKTsKKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCisKKworLyogY29tcGxldGUgbWFkZSB1cCByYW5raW5nLCB0aGUgdmFsdWVzIHRoZW1zZWx2ZXMgYXJlIG1lYW5pbmdsZXNzICovCisvKiBUaGVzZSByYW5rcyBNVVNUIGJlIFggc3VjaCB0aGF0IFg8PDE1IGZpdHMgb24gYSBzaWduZWQgaW50IC0gc2VlCisgICB0aGUgY29tbWVudCBhdCB0aGUgZW5kIG9mIGdzdF92NGwyX29iamVjdF9mb3JtYXRfZ2V0X3JhbmsuICovCisjZGVmaW5lIFlVVl9CQVNFX1JBTksgICAgIDEwMDAKKyNkZWZpbmUgSlBFR19CQVNFX1JBTksgICAgIDUwMAorI2RlZmluZSBEVl9CQVNFX1JBTksgICAgICAgMjAwCisjZGVmaW5lIFJHQl9CQVNFX1JBTksgICAgICAxMDAKKyNkZWZpbmUgWVVWX09ERF9CQVNFX1JBTksgICA1MAorI2RlZmluZSBSR0JfT0REX0JBU0VfUkFOSyAgIDI1CisjZGVmaW5lIEJBWUVSX0JBU0VfUkFOSyAgICAgMTUKKyNkZWZpbmUgUzkxMF9CQVNFX1JBTksgICAgICAxMAorI2RlZmluZSBHUkVZX0JBU0VfUkFOSyAgICAgICA1CisjZGVmaW5lIFBXQ19CQVNFX1JBTksgICAgICAgIDEKKworc3RhdGljIGdpbnQKK2dzdF92NGwyX29iamVjdF9mb3JtYXRfZ2V0X3JhbmsgKGNvbnN0IHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZtdCkKK3sKKyAgZ3VpbnQzMiBmb3VyY2MgPSBmbXQtPnBpeGVsZm9ybWF0OworICBnYm9vbGVhbiBlbXVsYXRlZCA9ICgoZm10LT5mbGFncyAmIFY0TDJfRk1UX0ZMQUdfRU1VTEFURUQpICE9IDApOworICBnaW50IHJhbmsgPSAwOworCisgIHN3aXRjaCAoZm91cmNjKSB7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTUpQRUc6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUEpQRzoKKyAgICAgIHJhbmsgPSBKUEVHX0JBU0VfUkFOSzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX0pQRUc6CisgICAgICByYW5rID0gSlBFR19CQVNFX1JBTksgKyAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTVBFRzogICAgLyogTVBFRyAgICAgICAgICAqLworICAgICAgcmFuayA9IEpQRUdfQkFTRV9SQU5LICsgMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCMzMyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX0FSR0I1NTU6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWFJHQjU1NToKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0I1NTU6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfQVJHQjU1NVg6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWFJHQjU1NVg6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTU1WDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9CR1I2NjY6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NVg6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCNDQ0OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1k0OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1k2OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1kxMDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZMTI6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWTEwQlBBQ0s6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVWNTU1OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjU2NToKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVYzMjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjEyTVRfMTZYMTY6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlY0MjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9IMjY0X01WQzoKKyAgICAgIHJhbmsgPSBSR0JfT0REX0JBU0VfUkFOSzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCMjQ6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfQkdSMjQ6CisgICAgICByYW5rID0gUkdCX0JBU0VfUkFOSyAtIDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjMyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX0JHUjMyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX0FCR1IzMjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9YQkdSMzI6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfQVJHQjMyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1hSR0IzMjoKKyAgICAgIHJhbmsgPSBSR0JfQkFTRV9SQU5LOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9HUkVZOiAgICAvKiAgOCAgR3JleXNjYWxlICAgICAqLworICAgICAgcmFuayA9IEdSRVlfQkFTRV9SQU5LOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjEyOiAgICAvKiAxMiAgWS9DYkNyIDQ6MjowICAqLworICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMTJNOiAgIC8qIFNhbWUgYXMgTlYxMiAgICAgICovCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxMk1UOiAgLyogTlYxMiA2NHgzMiB0aWxlICAgKi8KKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjIxOiAgICAvKiAxMiAgWS9DckNiIDQ6MjowICAqLworICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMjFNOiAgIC8qIFNhbWUgYXMgTlYyMSAgICAgICovCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVlVVjogICAgLyogMTYgIFlVViA0OjI6MiAgICAgKi8KKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ISTI0MDogICAvKiAgOCAgOC1iaXQgY29sb3IgICAqLworICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMTY6ICAgIC8qIDE2ICBZL0NiQ3IgNDoyOjIgICovCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxNk06ICAgLyogU2FtZSBhcyBOVjE2ICAgICAgKi8KKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjYxOiAgICAvKiAxNiAgWS9DckNiIDQ6MjoyICAqLworICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WNjFNOiAgIC8qIFNhbWUgYXMgTlY2MSAgICAgICovCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYyNDogICAgLyogMjQgIFkvQ3JDYiA0OjQ6NCAgKi8KKyAgICAgIHJhbmsgPSBZVVZfT0REX0JBU0VfUkFOSzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVZVNDEwOiAgLyogWVZVOSwgIDkgYml0cyBwZXIgcGl4ZWwgKi8KKyAgICAgIHJhbmsgPSBZVVZfQkFTRV9SQU5LICsgMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQxMDogIC8qIFlVVjksICA5IGJpdHMgcGVyIHBpeGVsICovCisgICAgICByYW5rID0gWVVWX0JBU0VfUkFOSyArIDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjA6ICAvKiBJNDIwLCAxMiBiaXRzIHBlciBwaXhlbCAqLworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyME06CisgICAgICByYW5rID0gWVVWX0JBU0VfUkFOSyArIDc7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVlWOiAgICAvKiBZVVkyLCAxNiBiaXRzIHBlciBwaXhlbCAqLworICAgICAgcmFuayA9IFlVVl9CQVNFX1JBTksgKyAxMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lWVTQyMDogIC8qIFlWMTIsIDEyIGJpdHMgcGVyIHBpeGVsICovCisgICAgICByYW5rID0gWVVWX0JBU0VfUkFOSyArIDY7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9VWVZZOiAgICAvKiBVWVZZLCAxNiBiaXRzIHBlciBwaXhlbCAqLworICAgICAgcmFuayA9IFlVVl9CQVNFX1JBTksgKyA5OworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDQ0OgorICAgICAgcmFuayA9IFlVVl9CQVNFX1JBTksgKyA2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWTQxUDogICAgLyogWTQxUCwgMTIgYml0cyBwZXIgcGl4ZWwgKi8KKyAgICAgIHJhbmsgPSBZVVZfQkFTRV9SQU5LICsgNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQxMVA6IC8qIFk0MUIsIDEyIGJpdHMgcGVyIHBpeGVsICovCisgICAgICByYW5rID0gWVVWX0JBU0VfUkFOSyArIDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjJQOiAvKiBZNDJCLCAxNiBiaXRzIHBlciBwaXhlbCAqLworICAgICAgcmFuayA9IFlVVl9CQVNFX1JBTksgKyA4OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9EVjoKKyAgICAgIHJhbmsgPSBEVl9CQVNFX1JBTks7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1dOVkE6ICAgIC8qIFdpbm5vdiBodyBjb21wcmVzICovCisgICAgICByYW5rID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfU0JHR1I4OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1NHQlJHODoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9TR1JCRzg6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfU1JHR0I4OgorICAgICAgcmFuayA9IEJBWUVSX0JBU0VfUkFOSzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfU045QzEwWDoKKyAgICAgIHJhbmsgPSBTOTEwX0JBU0VfUkFOSzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUFdDMToKKyAgICAgIHJhbmsgPSBQV0NfQkFTRV9SQU5LOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUFdDMjoKKyAgICAgIHJhbmsgPSBQV0NfQkFTRV9SQU5LOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmFuayA9IDA7CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIEFsbCByYW5rcyBhcmUgYmVsb3cgMTw8MTUgc28gYSBzaGlmdCBieSAxNQorICAgKiB3aWxsIGEpIG1ha2UgYWxsIG5vbi1lbXVsYXRlZCBmb3JtYXRzIGxhcmdlcgorICAgKiB0aGFuIGVtdWxhdGVkIGFuZCBiKSB3aWxsIG5vdCBvdmVyZmxvdworICAgKi8KKyAgaWYgKCFlbXVsYXRlZCkKKyAgICByYW5rIDw8PSAxNTsKKworICByZXR1cm4gcmFuazsKK30KKworCisKK3N0YXRpYyBnaW50Citmb3JtYXRfY21wX2Z1bmMgKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKQoreworICBjb25zdCBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmYSA9IGE7CisgIGNvbnN0IHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZiID0gYjsKKworICBpZiAoZmEtPnBpeGVsZm9ybWF0ID09IGZiLT5waXhlbGZvcm1hdCkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gZ3N0X3Y0bDJfb2JqZWN0X2Zvcm1hdF9nZXRfcmFuayAoZmIpIC0KKyAgICAgIGdzdF92NGwyX29iamVjdF9mb3JtYXRfZ2V0X3JhbmsgKGZhKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ3N0X3Y0bDJfb2JqZWN0X2ZpbGxfZm9ybWF0X2xpc3QoKToKKyAqICAgY3JlYXRlIGxpc3Qgb2Ygc3VwcG9ydGVkIGNhcHR1cmUgZm9ybWF0cworICogcmV0dXJuIHZhbHVlOiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGVycm9yCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl9vYmplY3RfZmlsbF9mb3JtYXRfbGlzdCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCit7CisgIGdpbnQgbjsKKyAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZm9ybWF0OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJnZXR0aW5nIHNyYyBmb3JtYXQgZW51bWVyYXRpb25zIik7CisKKyAgLyogZm9ybWF0IGVudW1lcmF0aW9uICovCisgIGZvciAobiA9IDA7OyBuKyspIHsKKyAgICBmb3JtYXQgPSBnX25ldzAgKHN0cnVjdCB2NGwyX2ZtdGRlc2MsIDEpOworCisgICAgZm9ybWF0LT5pbmRleCA9IG47CisgICAgZm9ybWF0LT50eXBlID0gdHlwZTsKKworICAgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19FTlVNX0ZNVCwgZm9ybWF0KSA8IDApIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5WQUwpIHsKKyAgICAgICAgZ19mcmVlIChmb3JtYXQpOworICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgZW51bWVyYXRpb24gKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgfQorICAgIH0KKworICAgIEdTVF9MT0dfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiaW5kZXg6ICAgICAgICV1IiwgZm9ybWF0LT5pbmRleCk7CisgICAgR1NUX0xPR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJ0eXBlOiAgICAgICAgJWQiLCBmb3JtYXQtPnR5cGUpOworICAgIEdTVF9MT0dfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiZmxhZ3M6ICAgICAgICUwOHgiLCBmb3JtYXQtPmZsYWdzKTsKKyAgICBHU1RfTE9HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgImRlc2NyaXB0aW9uOiAnJXMnIiwKKyAgICAgICAgZm9ybWF0LT5kZXNjcmlwdGlvbik7CisgICAgR1NUX0xPR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJwaXhlbGZvcm1hdDogJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm9ybWF0LT5waXhlbGZvcm1hdCkpOworCisgICAgLyogc29ydCBmb3JtYXRzIGFjY29yZGluZyB0byBvdXIgcHJlZmVyZW5jZTsgIHdlIGRvIHRoaXMsIGJlY2F1c2UgY2FwcworICAgICAqIGFyZSBwcm9iZWQgaW4gdGhlIG9yZGVyIHRoZSBmb3JtYXRzIGFyZSBpbiB0aGUgbGlzdCwgYW5kIHRoZSBvcmRlciBvZgorICAgICAqIGZvcm1hdHMgaW4gdGhlIGZpbmFsIHByb2JlZCBjYXBzIG1hdHRlcnMgZm9yIHRoaW5ncyBsaWtlIGZpeGF0aW9uICovCisgICAgdjRsMm9iamVjdC0+Zm9ybWF0cyA9IGdfc2xpc3RfaW5zZXJ0X3NvcnRlZCAodjRsMm9iamVjdC0+Zm9ybWF0cywgZm9ybWF0LAorICAgICAgICAoR0NvbXBhcmVGdW5jKSBmb3JtYXRfY21wX2Z1bmMpOworICB9CisKKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgIHsKKyAgICBHU0xpc3QgKmw7CisKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJnb3QgJWQgZm9ybWF0KHMpOiIsIG4pOworICAgIGZvciAobCA9IHY0bDJvYmplY3QtPmZvcm1hdHM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKKyAgICAgIGZvcm1hdCA9IGwtPmRhdGE7CisKKyAgICAgIEdTVF9JTkZPX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgICAiICAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiJXMiLCBHU1RfRk9VUkNDX0FSR1MgKGZvcm1hdC0+cGl4ZWxmb3JtYXQpLAorICAgICAgICAgICgoZm9ybWF0LT5mbGFncyAmIFY0TDJfRk1UX0ZMQUdfRU1VTEFURUQpKSA/ICIgKGVtdWxhdGVkKSIgOiAiIik7CisgICAgfQorICB9CisjZW5kaWYKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2ZhaWxlZDoKKyAgeworICAgIGdfZnJlZSAoZm9ybWF0KTsKKworICAgIGlmICh2NGwyb2JqZWN0LT5lbGVtZW50KQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkZhaWxlZCB0byBlbnVtZXJhdGUgcG9zc2libGUgdmlkZW8gZm9ybWF0cyBkZXZpY2UgJyVzJyBjYW4gd29yayAiCisgICAgICAgICAgICAgICAgIndpdGgiKSwgdjRsMm9iamVjdC0+dmlkZW9kZXYpLAorICAgICAgICAoIkZhaWxlZCB0byBnZXQgbnVtYmVyICVkIGluIHBpeGVsZm9ybWF0IGVudW1lcmF0aW9uIGZvciAlcy4gKCVkIC0gJXMpIiwKKyAgICAgICAgICAgIG4sIHY0bDJvYmplY3QtPnZpZGVvZGV2LCBlcnJubywgZ19zdHJlcnJvciAoZXJybm8pKSk7CisKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyoKKyAgKiBHZXQgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGNhcHR1cmUgZm9ybWF0cywgYSBsaXN0IG9mCisgICogPGNvZGU+c3RydWN0IHY0bDJfZm10ZGVzYzwvY29kZT4uCisgICovCitzdGF0aWMgR1NMaXN0ICoKK2dzdF92NGwyX29iamVjdF9nZXRfZm9ybWF0X2xpc3QgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KQoreworICBpZiAoIXY0bDJvYmplY3QtPmZvcm1hdHMpIHsKKworICAgIC8qIGNoZWNrIHVzdWFsIHdheSAqLworICAgIGdzdF92NGwyX29iamVjdF9maWxsX2Zvcm1hdF9saXN0ICh2NGwyb2JqZWN0LCB2NGwyb2JqZWN0LT50eXBlKTsKKworICAgIC8qIGlmIG91ciBkcml2ZXIgc3VwcG9ydHMgbXVsdGktcGxhbmFyCisgICAgICogYW5kIGlmIGZvcm1hdHMgYXJlIHN0aWxsIGVtcHR5IHRoZW4gd2UgY2FuIHdvcmthcm91bmQgZHJpdmVyIGJ1ZworICAgICAqIGJ5IGFsc28gbG9va2luZyB1cCBmb3JtYXRzIGFzIGlmIG91ciBkZXZpY2Ugd2FzIG5vdCBzdXBwb3J0aW5nCisgICAgICogbXVsdGlwbGFuYXIgKi8KKyAgICBpZiAoIXY0bDJvYmplY3QtPmZvcm1hdHMpIHsKKyAgICAgIHN3aXRjaCAodjRsMm9iamVjdC0+dHlwZSkgeworICAgICAgICBjYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU6CisgICAgICAgICAgZ3N0X3Y0bDJfb2JqZWN0X2ZpbGxfZm9ybWF0X2xpc3QgKHY0bDJvYmplY3QsCisgICAgICAgICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU6CisgICAgICAgICAgZ3N0X3Y0bDJfb2JqZWN0X2ZpbGxfZm9ybWF0X2xpc3QgKHY0bDJvYmplY3QsCisgICAgICAgICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdjRsMm9iamVjdC0+Zm9ybWF0czsKK30KKworc3RhdGljIEdzdFZpZGVvRm9ybWF0Citnc3RfdjRsMl9vYmplY3RfdjRsMmZvdXJjY190b192aWRlb19mb3JtYXQgKGd1aW50MzIgZm91cmNjKQoreworICBHc3RWaWRlb0Zvcm1hdCBmb3JtYXQ7CisKKyAgc3dpdGNoIChmb3VyY2MpIHsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9HUkVZOiAgICAvKiAgOCAgR3JleXNjYWxlICAgICAqLworICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9HUkFZODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1kxNjoKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfR1JBWTE2X0xFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWTE2X0JFOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9HUkFZMTZfQkU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9YUkdCNTU1OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjU1NToKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfUkdCMTU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9YUkdCNTU1WDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0I1NTVYOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9CR1IxNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NToKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfUkdCMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0IyNDoKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfUkdCOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfQkdSMjQ6CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX0JHUjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1hSR0IzMjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0IzMjoKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfeFJHQjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1hCR1IzMjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9CR1IzMjoKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfQkdSeDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX0FCR1IzMjoKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfQkdSQTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX0FSR0IzMjoKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfQVJHQjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMTI6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxMk06CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX05WMTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjEyTVQ6CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX05WMTJfNjRaMzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjIxOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMjFNOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9OVjIxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVZVNDEwOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9ZVlU5OworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDEwOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9ZVVY5OworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIwOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyME06CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX0k0MjA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVlWOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9ZVVkyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVZVNDIwOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9ZVjEyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfVVlWWToKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfVVlWWTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQxMVA6CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1k0MUI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjJQOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9ZNDJCOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVZZVToKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfWVZZVTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMTY6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxNk06CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX05WMTY7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjYxOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WNjFNOgorICAgICAgZm9ybWF0ID0gR1NUX1ZJREVPX0ZPUk1BVF9OVjYxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYyNDoKKyAgICAgIGZvcm1hdCA9IEdTVF9WSURFT19GT1JNQVRfTlYyNDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBmb3JtYXQgPSBHU1RfVklERU9fRk9STUFUX1VOS05PV047CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBmb3JtYXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfb2JqZWN0X3Y0bDJmb3VyY2NfaXNfcmdiIChndWludDMyIGZvdXJjYykKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgc3dpdGNoIChmb3VyY2MpIHsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9YUkdCNTU1OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjU1NToKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9YUkdCNTU1WDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0I1NTVYOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NToKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0IyNDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9CR1IyNDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9YUkdCMzI6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCMzI6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWEJHUjMyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX0JHUjMyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX0FCR1IzMjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9BUkdCMzI6CisgICAgICByZXQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdFN0cnVjdHVyZSAqCitnc3RfdjRsMl9vYmplY3RfdjRsMmZvdXJjY190b19iYXJlX3N0cnVjdCAoZ3VpbnQzMiBmb3VyY2MpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlID0gTlVMTDsKKworICBzd2l0Y2ggKGZvdXJjYykgeworICAgIGNhc2UgVjRMMl9QSVhfRk1UX01KUEVHOiAgIC8qIE1vdGlvbi1KUEVHICovCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUEpQRzogICAgLyogUHJvZ3Jlc3NpdmUtSlBFRyAqLworICAgIGNhc2UgVjRMMl9QSVhfRk1UX0pQRUc6ICAgIC8qIEpGSUYgSlBFRyAqLworICAgICAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCJpbWFnZS9qcGVnIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9NUEVHMToKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgidmlkZW8vbXBlZyIsCisgICAgICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9NUEVHMjoKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgidmlkZW8vbXBlZyIsCisgICAgICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9NUEVHNDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9YVklEOgorICAgICAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2aWRlby9tcGVnIiwKKyAgICAgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCA0LCAic3lzdGVtc3RyZWFtIiwKKyAgICAgICAgICBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfSDI2MzoKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgidmlkZW8veC1oMjYzIiwKKyAgICAgICAgICAidmFyaWFudCIsIEdfVFlQRV9TVFJJTkcsICJpdHUiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX0gyNjQ6ICAgIC8qIEguMjY0ICovCisgICAgICBzdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX25ldyAoInZpZGVvL3gtaDI2NCIsCisgICAgICAgICAgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiYnl0ZS1zdHJlYW0iLCAiYWxpZ25tZW50IiwKKyAgICAgICAgICBHX1RZUEVfU1RSSU5HLCAiYXUiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX0gyNjRfTk9fU0M6CisgICAgICBzdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX25ldyAoInZpZGVvL3gtaDI2NCIsCisgICAgICAgICAgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiYXZjIiwgImFsaWdubWVudCIsCisgICAgICAgICAgR19UWVBFX1NUUklORywgImF1IiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9WQzFfQU5ORVhfRzoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9WQzFfQU5ORVhfTDoKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgidmlkZW8veC13bXYiLAorICAgICAgICAgICJ3bXZ2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMywgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJXVkMxIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9WUDg6CisgICAgICBzdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoInZpZGVvL3gtdnA4Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9WUDk6CisgICAgICBzdHJ1Y3R1cmUgPSBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoInZpZGVvL3gtdnA5Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9HUkVZOiAgICAvKiAgOCAgR3JleXNjYWxlICAgICAqLworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1kxNjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZMTZfQkU6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWFJHQjU1NToKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0I1NTU6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWFJHQjU1NVg6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTU1WDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjU6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCMjQ6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfQkdSMjQ6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCMzI6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWFJHQjMyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX0FSR0IzMjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9CR1IzMjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9YQkdSMzI6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfQUJHUjMyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMTI6ICAgIC8qIDEyICBZL0NiQ3IgNDoyOjAgICovCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxMk06CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxMk1UOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMjE6ICAgIC8qIDEyICBZL0NyQ2IgNDoyOjAgICovCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYyMU06CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxNjogICAgLyogMTYgIFkvQ2JDciA0OjI6MiAgKi8KKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjE2TToKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjYxOiAgICAvKiAxNiAgWS9DckNiIDQ6MjoyICAqLworICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WNjFNOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMjQ6ICAgIC8qIDI0ICBZL0NyQ2IgNDo0OjQgICovCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVZVNDEwOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQxMDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjA6ICAvKiBJNDIwL0lZVVYgKi8KKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjBNOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVWVY6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVZVNDIwOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1VZVlk6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIyUDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVllVOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQxMVA6eworICAgICAgR3N0VmlkZW9Gb3JtYXQgZm9ybWF0OworICAgICAgZm9ybWF0ID0gZ3N0X3Y0bDJfb2JqZWN0X3Y0bDJmb3VyY2NfdG9fdmlkZW9fZm9ybWF0IChmb3VyY2MpOworICAgICAgaWYgKGZvcm1hdCAhPSBHU1RfVklERU9fRk9STUFUX1VOS05PV04pCisgICAgICAgIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgidmlkZW8veC1yYXciLAorICAgICAgICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsIGdzdF92aWRlb19mb3JtYXRfdG9fc3RyaW5nIChmb3JtYXQpLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9EVjoKKyAgICAgIHN0cnVjdHVyZSA9CisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2aWRlby94LWR2IiwgInN5c3RlbXN0cmVhbSIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLAorICAgICAgICAgIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTVBFRzogICAgLyogTVBFRyAgICAgICAgICAqLworICAgICAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2aWRlby9tcGVndHMiLAorICAgICAgICAgICJzeXN0ZW1zdHJlYW0iLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9XTlZBOiAgICAvKiBXaW5ub3YgaHcgY29tcHJlcyAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfU0JHR1I4OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1NHQlJHODoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9TR1JCRzg6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfU1JHR0I4OgorICAgICAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJ2aWRlby94LWJheWVyIiwgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAgICAgZm91cmNjID09IFY0TDJfUElYX0ZNVF9TQkdHUjggPyAiYmdnciIgOgorICAgICAgICAgIGZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfU0dCUkc4ID8gImdicmciIDoKKyAgICAgICAgICBmb3VyY2MgPT0gVjRMMl9QSVhfRk1UX1NHUkJHOCA/ICJncmJnIiA6CisgICAgICAgICAgLyogZm91cmNjID09IFY0TDJfUElYX0ZNVF9TUkdHQjggPyAqLyAicmdnYiIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfU045QzEwWDoKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgidmlkZW8veC1zb25peCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUFdDMToKKyAgICAgIHN0cnVjdHVyZSA9IGdzdF9zdHJ1Y3R1cmVfbmV3X2VtcHR5ICgidmlkZW8veC1wd2MxIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9QV0MyOgorICAgICAgc3RydWN0dXJlID0gZ3N0X3N0cnVjdHVyZV9uZXdfZW1wdHkgKCJ2aWRlby94LXB3YzIiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjMzMjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9CR1I2NjY6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfQVJHQjU1NVg6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1WDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0I0NDQ6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVlVVjogICAgLyogMTYgIFlVViA0OjI6MiAgICAgKi8KKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ISTI0MDogICAvKiAgOCAgOC1iaXQgY29sb3IgICAqLworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1k0OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1k2OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1kxMDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZMTI6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWTEwQlBBQ0s6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDQ0OgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjU1NToKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVY1NjU6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWTQxUDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVYzMjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjEyTVRfMTZYMTY6CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlY0MjoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9IMjY0X01WQzoKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX0RFQlVHICgiVW5zdXBwb3J0ZWQgZm91cmNjIDB4JTA4eCAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICBmb3VyY2MsIEdTVF9GT1VSQ0NfQVJHUyAoZm91cmNjKSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBzdHJ1Y3R1cmU7Cit9CisKK0dzdFN0cnVjdHVyZSAqCitnc3RfdjRsMl9vYmplY3RfdjRsMmZvdXJjY190b19zdHJ1Y3R1cmUgKGd1aW50MzIgZm91cmNjKQoreworICBHc3RTdHJ1Y3R1cmUgKnRlbXBsYXRlOworICBnaW50IGk7CisKKyAgdGVtcGxhdGUgPSBnc3RfdjRsMl9vYmplY3RfdjRsMmZvdXJjY190b19iYXJlX3N0cnVjdCAoZm91cmNjKTsKKworICBpZiAodGVtcGxhdGUgPT0gTlVMTCkKKyAgICBnb3RvIGRvbmU7CisKKyAgZm9yIChpID0gMDsgaSA8IEdTVF9WNEwyX0ZPUk1BVF9DT1VOVDsgaSsrKSB7CisgICAgaWYgKGdzdF92NGwyX2Zvcm1hdHNbaV0uZm9ybWF0ICE9IGZvdXJjYykKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKGdzdF92NGwyX2Zvcm1hdHNbaV0uZGltZW5zaW9ucykgeworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHRlbXBsYXRlLAorICAgICAgICAgICJ3aWR0aCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgR1NUX1Y0TDJfTUFYX1NJWkUsCisgICAgICAgICAgImhlaWdodCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMSwgR1NUX1Y0TDJfTUFYX1NJWkUsCisgICAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFLCAwLCAxLCBHX01BWElOVCwgMSwgTlVMTCk7CisgICAgfQorICAgIGJyZWFrOworICB9CisKK2RvbmU6CisgIHJldHVybiB0ZW1wbGF0ZTsKK30KKworCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfdjRsMl9vYmplY3RfZ2V0X2NhcHNfaGVscGVyIChHc3RWNEwyRm9ybWF0RmxhZ3MgZmxhZ3MpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBHc3RDYXBzICpjYXBzOworICBndWludCBpOworCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisgIGZvciAoaSA9IDA7IGkgPCBHU1RfVjRMMl9GT1JNQVRfQ09VTlQ7IGkrKykgeworCisgICAgaWYgKChnc3RfdjRsMl9mb3JtYXRzW2ldLmZsYWdzICYgZmxhZ3MpID09IDApCisgICAgICBjb250aW51ZTsKKworICAgIHN0cnVjdHVyZSA9CisgICAgICAgIGdzdF92NGwyX29iamVjdF92NGwyZm91cmNjX3RvX2JhcmVfc3RydWN0IChnc3RfdjRsMl9mb3JtYXRzW2ldLmZvcm1hdCk7CisKKyAgICBpZiAoc3RydWN0dXJlKSB7CisgICAgICBHc3RTdHJ1Y3R1cmUgKmFsdF9zID0gTlVMTDsKKworICAgICAgaWYgKGdzdF92NGwyX2Zvcm1hdHNbaV0uZGltZW5zaW9ucykgeworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoc3RydWN0dXJlLAorICAgICAgICAgICAgIndpZHRoIiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAxLCBHU1RfVjRMMl9NQVhfU0laRSwKKyAgICAgICAgICAgICJoZWlnaHQiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDEsIEdTVF9WNEwyX01BWF9TSVpFLAorICAgICAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFLCAwLCAxLCBHX01BWElOVCwgMSwgTlVMTCk7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoZ3N0X3Y0bDJfZm9ybWF0c1tpXS5mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCMzI6CisgICAgICAgICAgYWx0X3MgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHN0cnVjdHVyZSk7CisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKGFsdF9zLCAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIkFSR0IiLCBOVUxMKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfQkdSMzI6CisgICAgICAgICAgYWx0X3MgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHN0cnVjdHVyZSk7CisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKGFsdF9zLCAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIkJHUkEiLCBOVUxMKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2Fwcywgc3RydWN0dXJlKTsKKworICAgICAgaWYgKGFsdF9zKQorICAgICAgICBnc3RfY2Fwc19hcHBlbmRfc3RydWN0dXJlIChjYXBzLCBhbHRfcyk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGdzdF9jYXBzX3NpbXBsaWZ5IChjYXBzKTsKK30KKworR3N0Q2FwcyAqCitnc3RfdjRsMl9vYmplY3RfZ2V0X2FsbF9jYXBzICh2b2lkKQoreworICBzdGF0aWMgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisKKyAgaWYgKGdfb25jZV9pbml0X2VudGVyICgmY2FwcykpIHsKKyAgICBHc3RDYXBzICphbGxfY2FwcyA9IGdzdF92NGwyX29iamVjdF9nZXRfY2Fwc19oZWxwZXIgKEdTVF9WNEwyX0FMTCk7CisgICAgR1NUX01JTklfT0JKRUNUX0ZMQUdfU0VUIChhbGxfY2FwcywgR1NUX01JTklfT0JKRUNUX0ZMQUdfTUFZX0JFX0xFQUtFRCk7CisgICAgZ19vbmNlX2luaXRfbGVhdmUgKCZjYXBzLCBhbGxfY2Fwcyk7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworR3N0Q2FwcyAqCitnc3RfdjRsMl9vYmplY3RfZ2V0X3Jhd19jYXBzICh2b2lkKQoreworICBzdGF0aWMgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisKKyAgaWYgKGdfb25jZV9pbml0X2VudGVyICgmY2FwcykpIHsKKyAgICBHc3RDYXBzICpyYXdfY2FwcyA9IGdzdF92NGwyX29iamVjdF9nZXRfY2Fwc19oZWxwZXIgKEdTVF9WNEwyX1JBVyk7CisgICAgR1NUX01JTklfT0JKRUNUX0ZMQUdfU0VUIChyYXdfY2FwcywgR1NUX01JTklfT0JKRUNUX0ZMQUdfTUFZX0JFX0xFQUtFRCk7CisgICAgZ19vbmNlX2luaXRfbGVhdmUgKCZjYXBzLCByYXdfY2Fwcyk7CisgIH0KKworICByZXR1cm4gY2FwczsKK30KKworR3N0Q2FwcyAqCitnc3RfdjRsMl9vYmplY3RfZ2V0X2NvZGVjX2NhcHMgKHZvaWQpCit7CisgIHN0YXRpYyBHc3RDYXBzICpjYXBzID0gTlVMTDsKKworICBpZiAoZ19vbmNlX2luaXRfZW50ZXIgKCZjYXBzKSkgeworICAgIEdzdENhcHMgKmNvZGVjX2NhcHMgPSBnc3RfdjRsMl9vYmplY3RfZ2V0X2NhcHNfaGVscGVyIChHU1RfVjRMMl9DT0RFQyk7CisgICAgR1NUX01JTklfT0JKRUNUX0ZMQUdfU0VUIChjb2RlY19jYXBzLCBHU1RfTUlOSV9PQkpFQ1RfRkxBR19NQVlfQkVfTEVBS0VEKTsKKyAgICBnX29uY2VfaW5pdF9sZWF2ZSAoJmNhcHMsIGNvZGVjX2NhcHMpOworICB9CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKKy8qIGNvbGxlY3QgZGF0YSBmb3IgdGhlIGdpdmVuIGNhcHMKKyAqIEBjYXBzOiBnaXZlbiBpbnB1dCBjYXBzCisgKiBAZm9ybWF0OiBsb2NhdGlvbiBmb3IgdGhlIHY0bCBmb3JtYXQKKyAqIEB3L0BoOiBsb2NhdGlvbiBmb3Igd2lkdGggYW5kIGhlaWdodAorICogQGZwc19uL0BmcHNfZDogbG9jYXRpb24gZm9yIGZyYW1lcmF0ZQorICogQHNpemU6IGxvY2F0aW9uIGZvciBleHBlY3RlZCBzaXplIG9mIHRoZSBmcmFtZSBvciAwIGlmIHVua25vd24KKyAqLworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl9vYmplY3RfZ2V0X2NhcHNfaW5mbyAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIEdzdENhcHMgKiBjYXBzLAorICAgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKipmb3JtYXQsIEdzdFZpZGVvSW5mbyAqIGluZm8pCit7CisgIEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBndWludDMyIGZvdXJjYyA9IDAsIGZvdXJjY19uYyA9IDA7CisgIGNvbnN0IGdjaGFyICptaW1ldHlwZTsKKyAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZm10ID0gTlVMTDsKKworICBzdHJ1Y3R1cmUgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICBtaW1ldHlwZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSk7CisKKyAgaWYgKCFnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMgKGluZm8sIGNhcHMpKQorICAgIGdvdG8gaW52YWxpZF9mb3JtYXQ7CisKKyAgaWYgKGdfc3RyX2VxdWFsIChtaW1ldHlwZSwgInZpZGVvL3gtcmF3IikpIHsKKyAgICBzd2l0Y2ggKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoaW5mbykpIHsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9JNDIwOgorICAgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfWVVWNDIwOworICAgICAgICBmb3VyY2NfbmMgPSBWNEwyX1BJWF9GTVRfWVVWNDIwTTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWVVZMjoKKyAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX1lVWVY7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX1VZVlk6CisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9VWVZZOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVjEyOgorICAgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfWVZVNDIwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZNDFCOgorICAgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfWVVWNDExUDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfWTQyQjoKKyAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX1lVVjQyMlA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX05WMTI6CisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9OVjEyOworICAgICAgICBmb3VyY2NfbmMgPSBWNEwyX1BJWF9GTVRfTlYxMk07CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX05WMTJfNjRaMzI6CisgICAgICAgIGZvdXJjY19uYyA9IFY0TDJfUElYX0ZNVF9OVjEyTVQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX05WMjE6CisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9OVjIxOworICAgICAgICBmb3VyY2NfbmMgPSBWNEwyX1BJWF9GTVRfTlYyMU07CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX05WMTY6CisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9OVjE2OworICAgICAgICBmb3VyY2NfbmMgPSBWNEwyX1BJWF9GTVRfTlYxNk07CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX05WNjE6CisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9OVjYxOworICAgICAgICBmb3VyY2NfbmMgPSBWNEwyX1BJWF9GTVRfTlY2MU07CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX05WMjQ6CisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9OVjI0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9ZVllVOgorICAgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfWVZZVTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCMTU6CisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9SR0I1NTU7CisgICAgICAgIGZvdXJjY19uYyA9IFY0TDJfUElYX0ZNVF9YUkdCNTU1OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9SR0IxNjoKKyAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX1JHQjU2NTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfUkdCOgorICAgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfUkdCMjQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0JHUjoKKyAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX0JHUjI0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF94UkdCOgorICAgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfUkdCMzI7CisgICAgICAgIGZvdXJjY19uYyA9IFY0TDJfUElYX0ZNVF9YUkdCMzI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0FSR0I6CisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9SR0IzMjsKKyAgICAgICAgZm91cmNjX25jID0gVjRMMl9QSVhfRk1UX0FSR0IzMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfQkdSeDoKKyAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX0JHUjMyOworICAgICAgICBmb3VyY2NfbmMgPSBWNEwyX1BJWF9GTVRfWEJHUjMyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9CR1JBOgorICAgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfQkdSMzI7CisgICAgICAgIGZvdXJjY19uYyA9IFY0TDJfUElYX0ZNVF9BQkdSMzI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX0dSQVk4OgorICAgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfR1JFWTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19GT1JNQVRfR1JBWTE2X0xFOgorICAgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfWTE2OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0ZPUk1BVF9HUkFZMTZfQkU6CisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9ZMTZfQkU7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChnX3N0cl9lcXVhbCAobWltZXR5cGUsICJ2aWRlby9tcGVndHMiKSkgeworICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX01QRUc7CisgICAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAobWltZXR5cGUsICJ2aWRlby94LWR2IikpIHsKKyAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9EVjsKKyAgICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChtaW1ldHlwZSwgImltYWdlL2pwZWciKSkgeworICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX0pQRUc7CisgICAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAobWltZXR5cGUsICJ2aWRlby9tcGVnIikpIHsKKyAgICAgIGdpbnQgdmVyc2lvbjsKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgIm1wZWd2ZXJzaW9uIiwgJnZlcnNpb24pKSB7CisgICAgICAgIHN3aXRjaCAodmVyc2lvbikgeworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9NUEVHMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9NUEVHMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9NUEVHNDsKKyAgICAgICAgICAgIGZvdXJjY19uYyA9IFY0TDJfUElYX0ZNVF9YVklEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAobWltZXR5cGUsICJ2aWRlby94LWgyNjMiKSkgeworICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX0gyNjM7CisgICAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAobWltZXR5cGUsICJ2aWRlby94LWgyNjQiKSkgeworICAgICAgY29uc3QgZ2NoYXIgKnN0cmVhbV9mb3JtYXQgPQorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAic3RyZWFtLWZvcm1hdCIpOworICAgICAgaWYgKGdfc3RyX2VxdWFsIChzdHJlYW1fZm9ybWF0LCAiYXZjIikpCisgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9IMjY0X05PX1NDOworICAgICAgZWxzZQorICAgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfSDI2NDsKKyAgICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChtaW1ldHlwZSwgInZpZGVvL3gtdnA4IikpIHsKKyAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9WUDg7CisgICAgfSBlbHNlIGlmIChnX3N0cl9lcXVhbCAobWltZXR5cGUsICJ2aWRlby94LXZwOSIpKSB7CisgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfVlA5OworICAgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKG1pbWV0eXBlLCAidmlkZW8veC1iYXllciIpKSB7CisgICAgICBjb25zdCBnY2hhciAqZm9ybWF0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzdHJ1Y3R1cmUsICJmb3JtYXQiKTsKKyAgICAgIGlmIChmb3JtYXQpIHsKKyAgICAgICAgaWYgKCFnX2FzY2lpX3N0cmNhc2VjbXAgKGZvcm1hdCwgImJnZ3IiKSkKKyAgICAgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfU0JHR1I4OworICAgICAgICBlbHNlIGlmICghZ19hc2NpaV9zdHJjYXNlY21wIChmb3JtYXQsICJnYnJnIikpCisgICAgICAgICAgZm91cmNjID0gVjRMMl9QSVhfRk1UX1NHQlJHODsKKyAgICAgICAgZWxzZSBpZiAoIWdfYXNjaWlfc3RyY2FzZWNtcCAoZm9ybWF0LCAiZ3JiZyIpKQorICAgICAgICAgIGZvdXJjYyA9IFY0TDJfUElYX0ZNVF9TR1JCRzg7CisgICAgICAgIGVsc2UgaWYgKCFnX2FzY2lpX3N0cmNhc2VjbXAgKGZvcm1hdCwgInJnZ2IiKSkKKyAgICAgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfU1JHR0I4OworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZ19zdHJfZXF1YWwgKG1pbWV0eXBlLCAidmlkZW8veC1zb25peCIpKSB7CisgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfU045QzEwWDsKKyAgICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChtaW1ldHlwZSwgInZpZGVvL3gtcHdjMSIpKSB7CisgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfUFdDMTsKKyAgICB9IGVsc2UgaWYgKGdfc3RyX2VxdWFsIChtaW1ldHlwZSwgInZpZGVvL3gtcHdjMiIpKSB7CisgICAgICBmb3VyY2MgPSBWNEwyX1BJWF9GTVRfUFdDMjsKKyAgICB9CisgIH0KKworCisgIC8qIFByZWZlciB0aGUgbm9uLWNvbnRpZ3VvdXMgaWYgc3VwcG9ydGVkICovCisgIHY0bDJvYmplY3QtPnByZWZlcmVkX25vbl9jb250aWd1b3VzID0gVFJVRTsKKworICBpZiAoZm91cmNjX25jKQorICAgIGZtdCA9IGdzdF92NGwyX29iamVjdF9nZXRfZm9ybWF0X2Zyb21fZm91cmNjICh2NGwyb2JqZWN0LCBmb3VyY2NfbmMpOworICBlbHNlIGlmIChmb3VyY2MgPT0gMCkKKyAgICBnb3RvIHVuaGFuZGxlZF9mb3JtYXQ7CisKKyAgaWYgKGZtdCA9PSBOVUxMKSB7CisgICAgZm10ID0gZ3N0X3Y0bDJfb2JqZWN0X2dldF9mb3JtYXRfZnJvbV9mb3VyY2MgKHY0bDJvYmplY3QsIGZvdXJjYyk7CisgICAgdjRsMm9iamVjdC0+cHJlZmVyZWRfbm9uX2NvbnRpZ3VvdXMgPSBGQUxTRTsKKyAgfQorCisgIGlmIChmbXQgPT0gTlVMTCkKKyAgICBnb3RvIHVuc3VwcG9ydGVkX2Zvcm1hdDsKKworICAqZm9ybWF0ID0gZm10OworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworaW52YWxpZF9mb3JtYXQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LCAiaW52YWxpZCBmb3JtYXQiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3VuaGFuZGxlZF9mb3JtYXQ6CisgIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LCAidW5oYW5kbGVkIGZvcm1hdCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQordW5zdXBwb3J0ZWRfZm9ybWF0OgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdCwgInVuc3VwcG9ydGVkIGZvcm1hdCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX29iamVjdF9nZXRfbmVhcmVzdF9zaXplIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBndWludDMyIHBpeGVsZm9ybWF0LCBnaW50ICogd2lkdGgsIGdpbnQgKiBoZWlnaHQpOworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfb2JqZWN0X2FkZF9hc3BlY3RfcmF0aW8gKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBHc3RTdHJ1Y3R1cmUgKiBzKQoreworICBpZiAodjRsMm9iamVjdC0+a2VlcF9hc3BlY3QgJiYgdjRsMm9iamVjdC0+cGFyKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChzLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgdjRsMm9iamVjdC0+cGFyKTsKK30KKworLyogcmV0dXJucyBUUlVFIGlmIHRoZSB2YWx1ZSB3YXMgY2hhbmdlZCBpbiBwbGFjZSwgb3RoZXJ3aXNlIEZBTFNFICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyc3JjX3ZhbHVlX3NpbXBsaWZ5IChHVmFsdWUgKiB2YWwpCit7CisgIC8qIHNpbXBsaWZ5IGxpc3Qgb2Ygb25lIHZhbHVlIHRvIG9uZSB2YWx1ZSAqLworICBpZiAoR1NUX1ZBTFVFX0hPTERTX0xJU1QgKHZhbCkgJiYgZ3N0X3ZhbHVlX2xpc3RfZ2V0X3NpemUgKHZhbCkgPT0gMSkgeworICAgIGNvbnN0IEdWYWx1ZSAqbGlzdF92YWw7CisgICAgR1ZhbHVlIG5ld192YWwgPSBHX1ZBTFVFX0lOSVQ7CisKKyAgICBsaXN0X3ZhbCA9IGdzdF92YWx1ZV9saXN0X2dldF92YWx1ZSAodmFsLCAwKTsKKyAgICBnX3ZhbHVlX2luaXQgKCZuZXdfdmFsLCBHX1ZBTFVFX1RZUEUgKGxpc3RfdmFsKSk7CisgICAgZ192YWx1ZV9jb3B5IChsaXN0X3ZhbCwgJm5ld192YWwpOworICAgIGdfdmFsdWVfdW5zZXQgKHZhbCk7CisgICAgKnZhbCA9IG5ld192YWw7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfb2JqZWN0X2dldF9pbnRlcmxhY2VfbW9kZSAoZW51bSB2NGwyX2ZpZWxkIGZpZWxkLAorICAgIEdzdFZpZGVvSW50ZXJsYWNlTW9kZSAqIGludGVybGFjZV9tb2RlKQoreworICAvKiBOQjogSWYgeW91IGFkZCBuZXcgcmV0dXJuIHZhbHVlcywgcGxlYXNlIGZpeCBtb2RlX3N0cmluZ3MgaW4KKyAgICogZ3N0X3Y0bDJfb2JqZWN0X2FkZF9pbnRlcmxhY2VfbW9kZSAqLworICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgY2FzZSBWNEwyX0ZJRUxEX0FOWToKKyAgICAgIEdTVF9FUlJPUgorICAgICAgICAgICgiRHJpdmVyIGJ1ZyBkZXRlY3RlZCAtIGNoZWNrIGRyaXZlciB3aXRoIHY0bDItY29tcGxpYW5jZSBmcm9tIGh0dHA6Ly9naXQubGludXh0di5vcmcvdjRsLXV0aWxzLmdpdFxuIik7CisgICAgICAvKiBmYWxsdGhyb3VnaCAqLworICAgIGNhc2UgVjRMMl9GSUVMRF9OT05FOgorICAgICAgKmludGVybGFjZV9tb2RlID0gR1NUX1ZJREVPX0lOVEVSTEFDRV9NT0RFX1BST0dSRVNTSVZFOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgY2FzZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ6CisgICAgY2FzZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfVEI6CisgICAgY2FzZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQ6CisgICAgICAqaW50ZXJsYWNlX21vZGUgPSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfSU5URVJMRUFWRUQ7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX0VSUk9SICgiVW5rbm93biBlbnVtIHY0bDJfZmllbGQgJWQiLCBmaWVsZCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl9vYmplY3RfZ2V0X2NvbG9yc3BhY2UgKHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10LAorICAgIEdzdFZpZGVvQ29sb3JpbWV0cnkgKiBjaW5mbykKK3sKKyAgZ2Jvb2xlYW4gaXNfcmdiID0KKyAgICAgIGdzdF92NGwyX29iamVjdF92NGwyZm91cmNjX2lzX3JnYiAoZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKKyAgZW51bSB2NGwyX2NvbG9yc3BhY2UgY29sb3JzcGFjZTsKKyAgZW51bSB2NGwyX3F1YW50aXphdGlvbiByYW5nZTsKKyAgZW51bSB2NGwyX3ljYmNyX2VuY29kaW5nIG1hdHJpeDsKKyAgZW51bSB2NGwyX3hmZXJfZnVuYyB0cmFuc2ZlcjsKKyAgZ2Jvb2xlYW4gcmV0ID0gVFJVRTsKKworICBpZiAoVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSIChmbXQtPnR5cGUpKSB7CisgICAgY29sb3JzcGFjZSA9IGZtdC0+Zm10LnBpeF9tcC5jb2xvcnNwYWNlOworICAgIHJhbmdlID0gZm10LT5mbXQucGl4X21wLnF1YW50aXphdGlvbjsKKyAgICBtYXRyaXggPSBmbXQtPmZtdC5waXhfbXAueWNiY3JfZW5jOworICAgIHRyYW5zZmVyID0gZm10LT5mbXQucGl4X21wLnhmZXJfZnVuYzsKKyAgfSBlbHNlIHsKKyAgICBjb2xvcnNwYWNlID0gZm10LT5mbXQucGl4LmNvbG9yc3BhY2U7CisgICAgcmFuZ2UgPSBmbXQtPmZtdC5waXgucXVhbnRpemF0aW9uOworICAgIG1hdHJpeCA9IGZtdC0+Zm10LnBpeC55Y2Jjcl9lbmM7CisgICAgdHJhbnNmZXIgPSBmbXQtPmZtdC5waXgueGZlcl9mdW5jOworICB9CisKKyAgLyogRmlyc3Qgc3RlcCwgc2V0IHRoZSBkZWZhdWx0cyBmb3IgZWFjaCBwcmltYXJpZXMgKi8KKyAgc3dpdGNoIChjb2xvcnNwYWNlKSB7CisgICAgY2FzZSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNOgorICAgICAgY2luZm8tPnJhbmdlID0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFXzE2XzIzNTsKKyAgICAgIGNpbmZvLT5tYXRyaXggPSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUNjAxOworICAgICAgY2luZm8tPnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX0JUNzA5OworICAgICAgY2luZm8tPnByaW1hcmllcyA9IEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfU01QVEUxNzBNOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX0NPTE9SU1BBQ0VfUkVDNzA5OgorICAgICAgY2luZm8tPnJhbmdlID0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFXzE2XzIzNTsKKyAgICAgIGNpbmZvLT5tYXRyaXggPSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUNzA5OworICAgICAgY2luZm8tPnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX0JUNzA5OworICAgICAgY2luZm8tPnByaW1hcmllcyA9IEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfQlQ3MDk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfQ09MT1JTUEFDRV9TUkdCOgorICAgIGNhc2UgVjRMMl9DT0xPUlNQQUNFX0pQRUc6CisgICAgICBjaW5mby0+cmFuZ2UgPSBHU1RfVklERU9fQ09MT1JfUkFOR0VfMF8yNTU7CisgICAgICBjaW5mby0+bWF0cml4ID0gR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9CVDYwMTsKKyAgICAgIGNpbmZvLT50cmFuc2ZlciA9IEdTVF9WSURFT19UUkFOU0ZFUl9TUkdCOworICAgICAgY2luZm8tPnByaW1hcmllcyA9IEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfQlQ3MDk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfQ09MT1JTUEFDRV9BRE9CRVJHQjoKKyAgICAgIGNpbmZvLT5yYW5nZSA9IEdTVF9WSURFT19DT0xPUl9SQU5HRV8xNl8yMzU7CisgICAgICBjaW5mby0+bWF0cml4ID0gR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9CVDYwMTsKKyAgICAgIGNpbmZvLT50cmFuc2ZlciA9IEdTVF9WSURFT19UUkFOU0ZFUl9BRE9CRVJHQjsKKyAgICAgIGNpbmZvLT5wcmltYXJpZXMgPSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX0FET0JFUkdCOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX0NPTE9SU1BBQ0VfQlQyMDIwOgorICAgICAgY2luZm8tPnJhbmdlID0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFXzE2XzIzNTsKKyAgICAgIGNpbmZvLT5tYXRyaXggPSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUMjAyMDsKKyAgICAgIGNpbmZvLT50cmFuc2ZlciA9IEdTVF9WSURFT19UUkFOU0ZFUl9CVDIwMjBfMTI7CisgICAgICBjaW5mby0+cHJpbWFyaWVzID0gR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19CVDIwMjA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfQ09MT1JTUEFDRV9TTVBURTI0ME06CisgICAgICBjaW5mby0+cmFuZ2UgPSBHU1RfVklERU9fQ09MT1JfUkFOR0VfMTZfMjM1OworICAgICAgY2luZm8tPm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfU01QVEUyNDBNOworICAgICAgY2luZm8tPnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX1NNUFRFMjQwTTsKKyAgICAgIGNpbmZvLT5wcmltYXJpZXMgPSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX1NNUFRFMjQwTTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fTToKKyAgICAgIGNpbmZvLT5yYW5nZSA9IEdTVF9WSURFT19DT0xPUl9SQU5HRV8xNl8yMzU7CisgICAgICBjaW5mby0+bWF0cml4ID0gR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9CVDYwMTsKKyAgICAgIGNpbmZvLT50cmFuc2ZlciA9IEdTVF9WSURFT19UUkFOU0ZFUl9CVDcwOTsKKyAgICAgIGNpbmZvLT5wcmltYXJpZXMgPSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX0JUNDcwTTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc6CisgICAgICBjaW5mby0+cmFuZ2UgPSBHU1RfVklERU9fQ09MT1JfUkFOR0VfMTZfMjM1OworICAgICAgY2luZm8tPm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQ2MDE7CisgICAgICBjaW5mby0+dHJhbnNmZXIgPSBHU1RfVklERU9fVFJBTlNGRVJfQlQ3MDk7CisgICAgICBjaW5mby0+cHJpbWFyaWVzID0gR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19CVDQ3MEJHOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX0NPTE9SU1BBQ0VfUkFXOgorICAgICAgLyogRXhwbGljaXRseSB1bmtub3duICovCisgICAgICBjaW5mby0+cmFuZ2UgPSBHU1RfVklERU9fQ09MT1JfUkFOR0VfVU5LTk9XTjsKKyAgICAgIGNpbmZvLT5tYXRyaXggPSBHU1RfVklERU9fQ09MT1JfTUFUUklYX1VOS05PV047CisgICAgICBjaW5mby0+dHJhbnNmZXIgPSBHU1RfVklERU9fVFJBTlNGRVJfVU5LTk9XTjsKKyAgICAgIGNpbmZvLT5wcmltYXJpZXMgPSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX1VOS05PV047CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX0RFQlVHICgiVW5rbm93biBlbnVtIHY0bDJfY29sb3JzcGFjZSAlZCIsIGNvbG9yc3BhY2UpOworICAgICAgcmV0ID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmICghcmV0KQorICAgIGdvdG8gZG9uZTsKKworICAvKiBTZWNvbmQgc3RlcCwgYXBwbHkgYW55IGN1c3RvbSB2YXJpYXRpb24gKi8KKyAgc3dpdGNoIChyYW5nZSkgeworICAgIGNhc2UgVjRMMl9RVUFOVElaQVRJT05fRlVMTF9SQU5HRToKKyAgICAgIGNpbmZvLT5yYW5nZSA9IEdTVF9WSURFT19DT0xPUl9SQU5HRV8wXzI1NTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9RVUFOVElaQVRJT05fTElNX1JBTkdFOgorICAgICAgY2luZm8tPnJhbmdlID0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFXzE2XzIzNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9RVUFOVElaQVRJT05fREVGQVVMVDoKKyAgICAgIC8qIHJlcGxpY2F0ZWQgVjRMMl9NQVBfUVVBTlRJWkFUSU9OX0RFRkFVTFQgbWFjcm8gYmVoYXZpb3IgKi8KKyAgICAgIGlmIChpc19yZ2IgJiYgY29sb3JzcGFjZSA9PSBWNEwyX0NPTE9SU1BBQ0VfQlQyMDIwKQorICAgICAgICBjaW5mby0+cmFuZ2UgPSBHU1RfVklERU9fQ09MT1JfUkFOR0VfMTZfMjM1OworICAgICAgZWxzZSBpZiAoaXNfcmdiIHx8IG1hdHJpeCA9PSBWNEwyX1lDQkNSX0VOQ19YVjYwMQorICAgICAgICAgIHx8IG1hdHJpeCA9PSBWNEwyX1lDQkNSX0VOQ19YVjcwOQorICAgICAgICAgIHx8IGNvbG9yc3BhY2UgPT0gVjRMMl9DT0xPUlNQQUNFX0pQRUcpCisgICAgICAgIGNpbmZvLT5yYW5nZSA9IEdTVF9WSURFT19DT0xPUl9SQU5HRV8wXzI1NTsKKyAgICAgIGVsc2UKKyAgICAgICAgY2luZm8tPnJhbmdlID0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFXzE2XzIzNTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHU1RfV0FSTklORyAoIlVua25vd24gZW51bSB2NGwyX3F1YW50aXphdGlvbiB2YWx1ZSAlZCIsIHJhbmdlKTsKKyAgICAgIGNpbmZvLT5yYW5nZSA9IEdTVF9WSURFT19DT0xPUl9SQU5HRV9VTktOT1dOOworICAgICAgYnJlYWs7CisgIH0KKworICBzd2l0Y2ggKG1hdHJpeCkgeworICAgIGNhc2UgVjRMMl9ZQ0JDUl9FTkNfWFY2MDE6CisgICAgY2FzZSBWNEwyX1lDQkNSX0VOQ19TWUNDOgorICAgICAgR1NUX0ZJWE1FICgiWFY2MDEgYW5kIFNZQ0Mgbm90IGRlZmluZWQsIGFzc3VtaW5nIDYwMSIpOworICAgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIFY0TDJfWUNCQ1JfRU5DXzYwMToKKyAgICAgIGNpbmZvLT5tYXRyaXggPSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUNjAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1lDQkNSX0VOQ19YVjcwOToKKyAgICAgIEdTVF9GSVhNRSAoIlhWNzA5IG5vdCBkZWZpbmVkLCBhc3N1bWluZyA3MDkiKTsKKyAgICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgY2FzZSBWNEwyX1lDQkNSX0VOQ183MDk6CisgICAgICBjaW5mby0+bWF0cml4ID0gR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9CVDcwOTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9ZQ0JDUl9FTkNfQlQyMDIwX0NPTlNUX0xVTToKKyAgICAgIEdTVF9GSVhNRSAoIkJUMjAyMCB3aXRoIGNvbnN0YW50IGx1bWEgaXMgbm90IGRlZmluZWQsIGFzc3VtaW5nIEJUMjAyMCIpOworICAgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIFY0TDJfWUNCQ1JfRU5DX0JUMjAyMDoKKyAgICAgIGNpbmZvLT5tYXRyaXggPSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0JUMjAyMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9ZQ0JDUl9FTkNfU01QVEUyNDBNOgorICAgICAgY2luZm8tPm1hdHJpeCA9IEdTVF9WSURFT19DT0xPUl9NQVRSSVhfU01QVEUyNDBNOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1lDQkNSX0VOQ19ERUZBVUxUOgorICAgICAgLyogbm90aGluZywganVzdCB1c2UgZGVmYXVsdHMgZm9yIGNvbG9yc3BhY2UgKi8KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHU1RfV0FSTklORyAoIlVua25vd24gZW51bSB2NGwyX3ljYmNyX2VuY29kaW5nIHZhbHVlICVkIiwgbWF0cml4KTsKKyAgICAgIGNpbmZvLT5tYXRyaXggPSBHU1RfVklERU9fQ09MT1JfTUFUUklYX1VOS05PV047CisgICAgICBicmVhazsKKyAgfQorCisgIC8qIFNldCBpZGVudGl0eSBtYXRyaXggZm9yIFInRydCJyBmb3JtYXRzIHRvIGF2b2lkIGNyZWF0aW5nCisgICAqIGNvbmZ1c2lvbi4gVGhpcyB0aG91Z2ggaXMgY29zbWV0aWMgYXMgaXQncyBub3cgcHJvcGVybHkgaWdub3JlZCBieQorICAgKiB0aGUgdmlkZW8gaW5mbyBBUEkgYW5kIHZpZGVvY29udmVydC4gKi8KKyAgaWYgKGlzX3JnYikKKyAgICBjaW5mby0+bWF0cml4ID0gR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9SR0I7CisKKyAgc3dpdGNoICh0cmFuc2ZlcikgeworICAgIGNhc2UgVjRMMl9YRkVSX0ZVTkNfNzA5OgorICAgICAgaWYgKGZtdC0+Zm10LnBpeC5oZWlnaHQgPj0gMjE2MCkKKyAgICAgICAgY2luZm8tPnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX0JUMjAyMF8xMjsKKyAgICAgIGVsc2UKKyAgICAgICAgY2luZm8tPnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX0JUNzA5OworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1hGRVJfRlVOQ19TUkdCOgorICAgICAgY2luZm8tPnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX1NSR0I7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfWEZFUl9GVU5DX0FET0JFUkdCOgorICAgICAgY2luZm8tPnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX0FET0JFUkdCOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1hGRVJfRlVOQ19TTVBURTI0ME06CisgICAgICBjaW5mby0+dHJhbnNmZXIgPSBHU1RfVklERU9fVFJBTlNGRVJfU01QVEUyNDBNOworICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX1hGRVJfRlVOQ19OT05FOgorICAgICAgY2luZm8tPnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX0dBTU1BMTA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfWEZFUl9GVU5DX0RFRkFVTFQ6CisgICAgICAvKiBub3RoaW5nLCBqdXN0IHVzZSBkZWZhdWx0cyBmb3IgY29sb3JzcGFjZSAqLworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HICgiVW5rbm93biBlbnVtIHY0bDJfeGZlcl9mdW5jIHZhbHVlICVkIiwgdHJhbnNmZXIpOworICAgICAgY2luZm8tPnRyYW5zZmVyID0gR1NUX1ZJREVPX1RSQU5TRkVSX1VOS05PV047CisgICAgICBicmVhazsKKyAgfQorCitkb25lOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Citnc3RfdjRsMl9vYmplY3RfdHJ5X2ZtdCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgc3RydWN0IHY0bDJfZm9ybWF0ICp0cnlfZm10KQoreworICBpbnQgZmQgPSB2NGwyb2JqZWN0LT52aWRlb19mZDsKKyAgc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKKyAgaW50IHI7CisKKyAgbWVtY3B5ICgmZm10LCB0cnlfZm10LCBzaXplb2YgKGZtdCkpOworICByID0gdjRsMm9iamVjdC0+aW9jdGwgKGZkLCBWSURJT0NfVFJZX0ZNVCwgJmZtdCk7CisKKyAgaWYgKHIgPCAwICYmIGVycm5vID09IEVOT1RUWSkgeworICAgIC8qIFRoZSBkcml2ZXIgbWlnaHQgbm90IGltcGxlbWVudCBUUllfRk1ULCBpbiB3aGljaCBjYXNlIHdlIHdpbGwgdHJ5CisgICAgICAgU19GTVQgdG8gcHJvYmUgKi8KKyAgICBpZiAoR1NUX1Y0TDJfSVNfQUNUSVZFICh2NGwyb2JqZWN0KSkKKyAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBtZW1jcHkgKCZmbXQsIHRyeV9mbXQsIHNpemVvZiAoZm10KSk7CisgICAgciA9IHY0bDJvYmplY3QtPmlvY3RsIChmZCwgVklESU9DX1NfRk1ULCAmZm10KTsKKyAgfQorICBtZW1jcHkgKHRyeV9mbXQsICZmbXQsIHNpemVvZiAoZm10KSk7CisKKyAgcmV0dXJuIHI7CisKK2Vycm9yOgorICBtZW1jcHkgKHRyeV9mbXQsICZmbXQsIHNpemVvZiAoZm10KSk7CisgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICJVbmFibGUgdG8gdHJ5IGZvcm1hdDogJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworICByZXR1cm4gcjsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfb2JqZWN0X2FkZF9pbnRlcmxhY2VfbW9kZSAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgR3N0U3RydWN0dXJlICogcywgZ3VpbnQzMiB3aWR0aCwgZ3VpbnQzMiBoZWlnaHQsIGd1aW50MzIgcGl4ZWxmb3JtYXQpCit7CisgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQ7CisgIEdWYWx1ZSBpbnRlcmxhY2VfZm9ybWF0cyA9IHsgMCwgfTsKKyAgR3N0VmlkZW9JbnRlcmxhY2VNb2RlIGludGVybGFjZV9tb2RlLCBwcmV2ID0gLTE7CisKKyAgY29uc3QgZ2NoYXIgKm1vZGVfc3RyaW5nc1tdID0geyAicHJvZ3Jlc3NpdmUiLAorICAgICJpbnRlcmxlYXZlZCIsCisgICAgIm1peGVkIgorICB9OworCisgIGlmICghZ19zdHJfZXF1YWwgKGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHMpLCAidmlkZW8veC1yYXciKSkKKyAgICByZXR1cm47CisKKyAgaWYgKHY0bDJvYmplY3QtPm5ldmVyX2ludGVybGFjZWQpIHsKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgImludGVybGFjZS1tb2RlIiwgR19UWVBFX1NUUklORywgInByb2dyZXNzaXZlIiwgTlVMTCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZ192YWx1ZV9pbml0ICgmaW50ZXJsYWNlX2Zvcm1hdHMsIEdTVF9UWVBFX0xJU1QpOworCisgIC8qIFRyeSB0d2ljZSAtIG9uY2UgZm9yIE5PTkUsIG9uY2UgZm9yIElOVEVSTEFDRUQuICovCisgIG1lbXNldCAoJmZtdCwgMCwgc2l6ZW9mIChmbXQpKTsKKyAgZm10LnR5cGUgPSB2NGwyb2JqZWN0LT50eXBlOworICBmbXQuZm10LnBpeC53aWR0aCA9IHdpZHRoOworICBmbXQuZm10LnBpeC5oZWlnaHQgPSBoZWlnaHQ7CisgIGZtdC5mbXQucGl4LnBpeGVsZm9ybWF0ID0gcGl4ZWxmb3JtYXQ7CisgIGZtdC5mbXQucGl4LmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCisgIGlmIChnc3RfdjRsMl9vYmplY3RfdHJ5X2ZtdCAodjRsMm9iamVjdCwgJmZtdCkgPT0gMCAmJgorICAgICAgZ3N0X3Y0bDJfb2JqZWN0X2dldF9pbnRlcmxhY2VfbW9kZSAoZm10LmZtdC5waXguZmllbGQsICZpbnRlcmxhY2VfbW9kZSkpIHsKKyAgICBHVmFsdWUgaW50ZXJsYWNlX2VudW0gPSB7IDAsIH07CisgICAgZ192YWx1ZV9pbml0ICgmaW50ZXJsYWNlX2VudW0sIEdfVFlQRV9TVFJJTkcpOworICAgIGdfdmFsdWVfc2V0X3N0cmluZyAoJmludGVybGFjZV9lbnVtLCBtb2RlX3N0cmluZ3NbaW50ZXJsYWNlX21vZGVdKTsKKyAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfYW5kX3Rha2VfdmFsdWUgKCZpbnRlcmxhY2VfZm9ybWF0cywgJmludGVybGFjZV9lbnVtKTsKKyAgICBwcmV2ID0gaW50ZXJsYWNlX21vZGU7CisgIH0KKworICBtZW1zZXQgKCZmbXQsIDAsIHNpemVvZiAoZm10KSk7CisgIGZtdC50eXBlID0gdjRsMm9iamVjdC0+dHlwZTsKKyAgZm10LmZtdC5waXgud2lkdGggPSB3aWR0aDsKKyAgZm10LmZtdC5waXguaGVpZ2h0ID0gaGVpZ2h0OworICBmbXQuZm10LnBpeC5waXhlbGZvcm1hdCA9IHBpeGVsZm9ybWF0OworICBmbXQuZm10LnBpeC5maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKKworICBpZiAoZ3N0X3Y0bDJfb2JqZWN0X3RyeV9mbXQgKHY0bDJvYmplY3QsICZmbXQpID09IDAgJiYKKyAgICAgIGdzdF92NGwyX29iamVjdF9nZXRfaW50ZXJsYWNlX21vZGUgKGZtdC5mbXQucGl4LmZpZWxkLCAmaW50ZXJsYWNlX21vZGUpICYmCisgICAgICBwcmV2ICE9IGludGVybGFjZV9tb2RlKSB7CisgICAgR1ZhbHVlIGludGVybGFjZV9lbnVtID0geyAwLCB9OworICAgIGdfdmFsdWVfaW5pdCAoJmludGVybGFjZV9lbnVtLCBHX1RZUEVfU1RSSU5HKTsKKyAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKCZpbnRlcmxhY2VfZW51bSwgbW9kZV9zdHJpbmdzW2ludGVybGFjZV9tb2RlXSk7CisgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX2FuZF90YWtlX3ZhbHVlICgmaW50ZXJsYWNlX2Zvcm1hdHMsICZpbnRlcmxhY2VfZW51bSk7CisgIH0KKworICBpZiAoZ3N0X3Y0bDJzcmNfdmFsdWVfc2ltcGxpZnkgKCZpbnRlcmxhY2VfZm9ybWF0cykKKyAgICAgIHx8IGdzdF92YWx1ZV9saXN0X2dldF9zaXplICgmaW50ZXJsYWNlX2Zvcm1hdHMpID4gMCkKKyAgICBnc3Rfc3RydWN0dXJlX3Rha2VfdmFsdWUgKHMsICJpbnRlcmxhY2UtbW9kZSIsICZpbnRlcmxhY2VfZm9ybWF0cyk7CisgIGVsc2UKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJvYmplY3QsICJGYWlsZWQgdG8gZGV0ZXJtaW5lIGludGVybGFjZSBtb2RlIik7CisKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfb2JqZWN0X2ZpbGxfY29sb3JpbWV0cnlfbGlzdCAoR1ZhbHVlICogbGlzdCwKKyAgICBHc3RWaWRlb0NvbG9yaW1ldHJ5ICogY2luZm8pCit7CisgIEdWYWx1ZSBjb2xvcmltZXRyeSA9IEdfVkFMVUVfSU5JVDsKKyAgZ3VpbnQgc2l6ZTsKKyAgZ3VpbnQgaTsKKyAgZ2Jvb2xlYW4gZm91bmQgPSBGQUxTRTsKKworICBnX3ZhbHVlX2luaXQgKCZjb2xvcmltZXRyeSwgR19UWVBFX1NUUklORyk7CisgIGdfdmFsdWVfdGFrZV9zdHJpbmcgKCZjb2xvcmltZXRyeSwgZ3N0X3ZpZGVvX2NvbG9yaW1ldHJ5X3RvX3N0cmluZyAoY2luZm8pKTsKKworICAvKiBvbmx5IGluc2VydCBpZiBubyBkdXBsaWNhdGUgKi8KKyAgc2l6ZSA9IGdzdF92YWx1ZV9saXN0X2dldF9zaXplIChsaXN0KTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIGNvbnN0IEdWYWx1ZSAqdG1wOworCisgICAgdG1wID0gZ3N0X3ZhbHVlX2xpc3RfZ2V0X3ZhbHVlIChsaXN0LCBpKTsKKyAgICBpZiAoZ3N0X3ZhbHVlX2NvbXBhcmUgKCZjb2xvcmltZXRyeSwgdG1wKSA9PSBHU1RfVkFMVUVfRVFVQUwpIHsKKyAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmICghZm91bmQpCisgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX2FuZF90YWtlX3ZhbHVlIChsaXN0LCAmY29sb3JpbWV0cnkpOworICBlbHNlCisgICAgZ192YWx1ZV91bnNldCAoJmNvbG9yaW1ldHJ5KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX29iamVjdF9hZGRfY29sb3JzcGFjZSAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIEdzdFN0cnVjdHVyZSAqIHMsCisgICAgZ3VpbnQzMiB3aWR0aCwgZ3VpbnQzMiBoZWlnaHQsIGd1aW50MzIgcGl4ZWxmb3JtYXQpCit7CisgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQ7CisgIEdWYWx1ZSBsaXN0ID0gR19WQUxVRV9JTklUOworICBHc3RWaWRlb0NvbG9yaW1ldHJ5IGNpbmZvOworICBlbnVtIHY0bDJfY29sb3JzcGFjZSByZXFfY3NwYWNlOworCisgIG1lbXNldCAoJmZtdCwgMCwgc2l6ZW9mIChmbXQpKTsKKyAgZm10LnR5cGUgPSB2NGwyb2JqZWN0LT50eXBlOworICBmbXQuZm10LnBpeC53aWR0aCA9IHdpZHRoOworICBmbXQuZm10LnBpeC5oZWlnaHQgPSBoZWlnaHQ7CisgIGZtdC5mbXQucGl4LnBpeGVsZm9ybWF0ID0gcGl4ZWxmb3JtYXQ7CisKKyAgZ192YWx1ZV9pbml0ICgmbGlzdCwgR1NUX1RZUEVfTElTVCk7CisKKyAgLyogc3RlcCAxOiBnZXQgZGV2aWNlIGRlZmF1bHQgY29sb3JzcGFjZSBhbmQgaW5zZXJ0IGl0IGZpcnN0IGFzCisgICAqIGl0IHNob3VsZCBiZSB0aGUgcHJlZmVycmVkIG9uZSAqLworICBpZiAoZ3N0X3Y0bDJfb2JqZWN0X3RyeV9mbXQgKHY0bDJvYmplY3QsICZmbXQpID09IDApIHsKKyAgICBpZiAoZ3N0X3Y0bDJfb2JqZWN0X2dldF9jb2xvcnNwYWNlICgmZm10LCAmY2luZm8pKQorICAgICAgZ3N0X3Y0bDJfb2JqZWN0X2ZpbGxfY29sb3JpbWV0cnlfbGlzdCAoJmxpc3QsICZjaW5mbyk7CisgIH0KKworICAvKiBzdGVwIDI6IHByb2JlIGFsbCBjb2xvcnNwYWNlIG90aGVyIHRoYW4gZGVmYXVsdAorICAgKiBXZSBkb24ndCBwcm9iZSBhbGwgY29sb3JzcGFjZSwgcmFuZ2UsIG1hdHJpeCBhbmQgdHJhbnNmZXIgY29tYmluYXRpb24gdG8KKyAgICogYXZvaWQgaW9jdGwgZmxvb2Rpbmcgd2hpY2ggY291bGQgZ3JlYXRseSBpbmNyZWFzZSBpbml0aWFsaXphdGlvbiB0aW1lCisgICAqIHdpdGggbG93LXNwZWVkIGRldmljZXMgKFVWQy4uLikgKi8KKyAgZm9yIChyZXFfY3NwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTTsKKyAgICAgIHJlcV9jc3BhY2UgPD0gVjRMMl9DT0xPUlNQQUNFX1JBVzsgcmVxX2NzcGFjZSsrKSB7CisgICAgLyogVjRMMl9DT0xPUlNQQUNFX0JUODc4IGlzIGRlcHJlY2F0ZWQgYW5kIHNoYWxsIG5vdCBiZSB1c2VkLCBzbyBza2lwICovCisgICAgaWYgKHJlcV9jc3BhY2UgPT0gVjRMMl9DT0xPUlNQQUNFX0JUODc4KQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSICh2NGwyb2JqZWN0LT50eXBlKSkKKyAgICAgIGZtdC5mbXQucGl4X21wLmNvbG9yc3BhY2UgPSByZXFfY3NwYWNlOworICAgIGVsc2UKKyAgICAgIGZtdC5mbXQucGl4LmNvbG9yc3BhY2UgPSByZXFfY3NwYWNlOworCisgICAgaWYgKGdzdF92NGwyX29iamVjdF90cnlfZm10ICh2NGwyb2JqZWN0LCAmZm10KSA9PSAwKSB7CisgICAgICBlbnVtIHY0bDJfY29sb3JzcGFjZSBjb2xvcnNwYWNlOworCisgICAgICBpZiAoVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSICh2NGwyb2JqZWN0LT50eXBlKSkKKyAgICAgICAgY29sb3JzcGFjZSA9IGZtdC5mbXQucGl4X21wLmNvbG9yc3BhY2U7CisgICAgICBlbHNlCisgICAgICAgIGNvbG9yc3BhY2UgPSBmbXQuZm10LnBpeC5jb2xvcnNwYWNlOworCisgICAgICBpZiAoY29sb3JzcGFjZSA9PSByZXFfY3NwYWNlKSB7CisgICAgICAgIGlmIChnc3RfdjRsMl9vYmplY3RfZ2V0X2NvbG9yc3BhY2UgKCZmbXQsICZjaW5mbykpCisgICAgICAgICAgZ3N0X3Y0bDJfb2JqZWN0X2ZpbGxfY29sb3JpbWV0cnlfbGlzdCAoJmxpc3QsICZjaW5mbyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGdzdF92YWx1ZV9saXN0X2dldF9zaXplICgmbGlzdCkgPiAwKQorICAgIGdzdF9zdHJ1Y3R1cmVfdGFrZV92YWx1ZSAocywgImNvbG9yaW1ldHJ5IiwgJmxpc3QpOworICBlbHNlCisgICAgZ192YWx1ZV91bnNldCAoJmxpc3QpOworCisgIHJldHVybjsKK30KKworLyogVGhlIGZyYW1lIGludGVydmFsIGVudW1lcmF0aW9uIGNvZGUgZmlyc3QgYXBwZWFyZWQgaW4gTGludXggMi42LjE5LiAqLworc3RhdGljIEdzdFN0cnVjdHVyZSAqCitnc3RfdjRsMl9vYmplY3RfcHJvYmVfY2Fwc19mb3JfZm9ybWF0X2FuZF9zaXplIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBndWludDMyIHBpeGVsZm9ybWF0LAorICAgIGd1aW50MzIgd2lkdGgsIGd1aW50MzIgaGVpZ2h0LCBjb25zdCBHc3RTdHJ1Y3R1cmUgKiB0ZW1wbGF0ZSkKK3sKKyAgZ2ludCBmZCA9IHY0bDJvYmplY3QtPnZpZGVvX2ZkOworICBzdHJ1Y3QgdjRsMl9mcm1pdmFsZW51bSBpdmFsOworICBndWludDMyIG51bSwgZGVub207CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgR1ZhbHVlIHJhdGVzID0geyAwLCB9OworCisgIG1lbXNldCAoJml2YWwsIDAsIHNpemVvZiAoc3RydWN0IHY0bDJfZnJtaXZhbGVudW0pKTsKKyAgaXZhbC5pbmRleCA9IDA7CisgIGl2YWwucGl4ZWxfZm9ybWF0ID0gcGl4ZWxmb3JtYXQ7CisgIGl2YWwud2lkdGggPSB3aWR0aDsKKyAgaXZhbC5oZWlnaHQgPSBoZWlnaHQ7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAiZ2V0IGZyYW1lIGludGVydmFsIGZvciAldXgldSwgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsIHdpZHRoLCBoZWlnaHQsCisgICAgICBHU1RfRk9VUkNDX0FSR1MgKHBpeGVsZm9ybWF0KSk7CisKKyAgLyoga2VlcCBpbiBtaW5kIHRoYXQgdjRsMiBnaXZlcyB1cyBmcmFtZSBpbnRlcnZhbHMgKGR1cmF0aW9ucyk7IHdlIGludmVydCB0aGUKKyAgICogZnJhY3Rpb24gdG8gZ2V0IGZyYW1lcmF0ZSAqLworICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKGZkLCBWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMUywgJml2YWwpIDwgMCkKKyAgICBnb3RvIGVudW1fZnJhbWVpbnRlcnZhbHNfZmFpbGVkOworCisgIGlmIChpdmFsLnR5cGUgPT0gVjRMMl9GUk1JVkFMX1RZUEVfRElTQ1JFVEUpIHsKKyAgICBHVmFsdWUgcmF0ZSA9IHsgMCwgfTsKKworICAgIGdfdmFsdWVfaW5pdCAoJnJhdGVzLCBHU1RfVFlQRV9MSVNUKTsKKyAgICBnX3ZhbHVlX2luaXQgKCZyYXRlLCBHU1RfVFlQRV9GUkFDVElPTik7CisKKyAgICBkbyB7CisgICAgICBudW0gPSBpdmFsLmRpc2NyZXRlLm51bWVyYXRvcjsKKyAgICAgIGRlbm9tID0gaXZhbC5kaXNjcmV0ZS5kZW5vbWluYXRvcjsKKworICAgICAgaWYgKG51bSA+IEdfTUFYSU5UIHx8IGRlbm9tID4gR19NQVhJTlQpIHsKKyAgICAgICAgLyogbGV0IHVzIGhvcGUgd2UgZG9uJ3QgZ2V0IGhlcmUuLi4gKi8KKyAgICAgICAgbnVtID4+PSAxOworICAgICAgICBkZW5vbSA+Pj0gMTsKKyAgICAgIH0KKworICAgICAgR1NUX0xPR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJhZGRpbmcgZGlzY3JldGUgZnJhbWVyYXRlOiAlZC8lZCIsCisgICAgICAgICAgZGVub20sIG51bSk7CisKKyAgICAgIC8qIHN3YXAgdG8gZ2V0IHRoZSBmcmFtZXJhdGUgKi8KKyAgICAgIGdzdF92YWx1ZV9zZXRfZnJhY3Rpb24gKCZyYXRlLCBkZW5vbSwgbnVtKTsKKyAgICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJnJhdGVzLCAmcmF0ZSk7CisKKyAgICAgIGl2YWwuaW5kZXgrKzsKKyAgICB9IHdoaWxlICh2NGwyb2JqZWN0LT5pb2N0bCAoZmQsIFZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTLCAmaXZhbCkgPj0gMCk7CisgIH0gZWxzZSBpZiAoaXZhbC50eXBlID09IFY0TDJfRlJNSVZBTF9UWVBFX1NURVBXSVNFKSB7CisgICAgR1ZhbHVlIG1pbiA9IHsgMCwgfTsKKyAgICBHVmFsdWUgc3RlcCA9IHsgMCwgfTsKKyAgICBHVmFsdWUgbWF4ID0geyAwLCB9OworICAgIGdib29sZWFuIGFkZGVkID0gRkFMU0U7CisgICAgZ3VpbnQzMiBtaW5udW0sIG1pbmRlbm9tOworICAgIGd1aW50MzIgbWF4bnVtLCBtYXhkZW5vbTsKKworICAgIGdfdmFsdWVfaW5pdCAoJnJhdGVzLCBHU1RfVFlQRV9MSVNUKTsKKworICAgIGdfdmFsdWVfaW5pdCAoJm1pbiwgR1NUX1RZUEVfRlJBQ1RJT04pOworICAgIGdfdmFsdWVfaW5pdCAoJnN0ZXAsIEdTVF9UWVBFX0ZSQUNUSU9OKTsKKyAgICBnX3ZhbHVlX2luaXQgKCZtYXgsIEdTVF9UWVBFX0ZSQUNUSU9OKTsKKworICAgIC8qIGdldCB0aGUgbWluICovCisgICAgbWlubnVtID0gaXZhbC5zdGVwd2lzZS5taW4ubnVtZXJhdG9yOworICAgIG1pbmRlbm9tID0gaXZhbC5zdGVwd2lzZS5taW4uZGVub21pbmF0b3I7CisgICAgaWYgKG1pbm51bSA+IEdfTUFYSU5UIHx8IG1pbmRlbm9tID4gR19NQVhJTlQpIHsKKyAgICAgIG1pbm51bSA+Pj0gMTsKKyAgICAgIG1pbmRlbm9tID4+PSAxOworICAgIH0KKyAgICBHU1RfTE9HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgInN0ZXB3aXNlIG1pbiBmcmFtZSBpbnRlcnZhbDogJWQvJWQiLAorICAgICAgICBtaW5udW0sIG1pbmRlbm9tKTsKKyAgICBnc3RfdmFsdWVfc2V0X2ZyYWN0aW9uICgmbWluLCBtaW5udW0sIG1pbmRlbm9tKTsKKworICAgIC8qIGdldCB0aGUgbWF4ICovCisgICAgbWF4bnVtID0gaXZhbC5zdGVwd2lzZS5tYXgubnVtZXJhdG9yOworICAgIG1heGRlbm9tID0gaXZhbC5zdGVwd2lzZS5tYXguZGVub21pbmF0b3I7CisgICAgaWYgKG1heG51bSA+IEdfTUFYSU5UIHx8IG1heGRlbm9tID4gR19NQVhJTlQpIHsKKyAgICAgIG1heG51bSA+Pj0gMTsKKyAgICAgIG1heGRlbm9tID4+PSAxOworICAgIH0KKworICAgIEdTVF9MT0dfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAic3RlcHdpc2UgbWF4IGZyYW1lIGludGVydmFsOiAlZC8lZCIsCisgICAgICAgIG1heG51bSwgbWF4ZGVub20pOworICAgIGdzdF92YWx1ZV9zZXRfZnJhY3Rpb24gKCZtYXgsIG1heG51bSwgbWF4ZGVub20pOworCisgICAgLyogZ2V0IHRoZSBzdGVwICovCisgICAgbnVtID0gaXZhbC5zdGVwd2lzZS5zdGVwLm51bWVyYXRvcjsKKyAgICBkZW5vbSA9IGl2YWwuc3RlcHdpc2Uuc3RlcC5kZW5vbWluYXRvcjsKKyAgICBpZiAobnVtID4gR19NQVhJTlQgfHwgZGVub20gPiBHX01BWElOVCkgeworICAgICAgbnVtID4+PSAxOworICAgICAgZGVub20gPj49IDE7CisgICAgfQorCisgICAgaWYgKG51bSA9PSAwIHx8IGRlbm9tID09IDApIHsKKyAgICAgIC8qIGluIHRoaXMgY2FzZSB3ZSBoYXZlIGEgd3JvbmcgZnJhY3Rpb24gb3Igbm8gc3RlcCwgc2V0IHRoZSBzdGVwIHRvIG1heAorICAgICAgICogc28gdGhhdCB3ZSBvbmx5IGFkZCB0aGUgbWluIHZhbHVlIGluIHRoZSBsb29wIGJlbG93ICovCisgICAgICBudW0gPSBtYXhudW07CisgICAgICBkZW5vbSA9IG1heGRlbm9tOworICAgIH0KKworICAgIC8qIHNpbmNlIHdlIG9ubHkgaGF2ZSBnc3RfdmFsdWVfZnJhY3Rpb25fc3VidHJhY3QgYW5kIG5vdCBhZGQsIG5lZ2F0ZSB0aGUKKyAgICAgKiBudW1lcmF0b3IgKi8KKyAgICBHU1RfTE9HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgInN0ZXB3aXNlIHN0ZXAgZnJhbWUgaW50ZXJ2YWw6ICVkLyVkIiwKKyAgICAgICAgbnVtLCBkZW5vbSk7CisgICAgZ3N0X3ZhbHVlX3NldF9mcmFjdGlvbiAoJnN0ZXAsIC1udW0sIGRlbm9tKTsKKworICAgIHdoaWxlIChnc3RfdmFsdWVfY29tcGFyZSAoJm1pbiwgJm1heCkgIT0gR1NUX1ZBTFVFX0dSRUFURVJfVEhBTikgeworICAgICAgR1ZhbHVlIHJhdGUgPSB7IDAsIH07CisKKyAgICAgIG51bSA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fbnVtZXJhdG9yICgmbWluKTsKKyAgICAgIGRlbm9tID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9kZW5vbWluYXRvciAoJm1pbik7CisgICAgICBHU1RfTE9HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgImFkZGluZyBzdGVwd2lzZSBmcmFtZXJhdGU6ICVkLyVkIiwKKyAgICAgICAgICBkZW5vbSwgbnVtKTsKKworICAgICAgLyogaW52ZXJ0IHRvIGdldCB0aGUgZnJhbWVyYXRlICovCisgICAgICBnX3ZhbHVlX2luaXQgKCZyYXRlLCBHU1RfVFlQRV9GUkFDVElPTik7CisgICAgICBnc3RfdmFsdWVfc2V0X2ZyYWN0aW9uICgmcmF0ZSwgZGVub20sIG51bSk7CisgICAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZyYXRlcywgJnJhdGUpOworICAgICAgYWRkZWQgPSBUUlVFOworCisgICAgICAvKiB3ZSdyZSBhY3R1YWxseSBhZGRpbmcgYmVjYXVzZSBzdGVwIHdhcyBuZWdhdGVkIGFib3ZlLiBUaGlzIGlzIGJlY2F1c2UKKyAgICAgICAqIHRoZXJlIGlzIG5vIF9hZGQgZnVuY3Rpb24uLi4gKi8KKyAgICAgIGlmICghZ3N0X3ZhbHVlX2ZyYWN0aW9uX3N1YnRyYWN0ICgmbWluLCAmbWluLCAmc3RlcCkpIHsKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiY291bGQgbm90IHN0ZXAgZnJhY3Rpb24hIik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWFkZGVkKSB7CisgICAgICAvKiBubyByYW5nZSB3YXMgYWRkZWQsIGxlYXZlIHRoZSBkZWZhdWx0IHJhbmdlIGZyb20gdGhlIHRlbXBsYXRlICovCisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICAgIm5vIHJhbmdlIGFkZGVkLCBsZWF2aW5nIGRlZmF1bHQiKTsKKyAgICAgIGdfdmFsdWVfdW5zZXQgKCZyYXRlcyk7CisgICAgfQorICB9IGVsc2UgaWYgKGl2YWwudHlwZSA9PSBWNEwyX0ZSTUlWQUxfVFlQRV9DT05USU5VT1VTKSB7CisgICAgZ3VpbnQzMiBtYXhudW0sIG1heGRlbm9tOworCisgICAgZ192YWx1ZV9pbml0ICgmcmF0ZXMsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFKTsKKworICAgIG51bSA9IGl2YWwuc3RlcHdpc2UubWluLm51bWVyYXRvcjsKKyAgICBkZW5vbSA9IGl2YWwuc3RlcHdpc2UubWluLmRlbm9taW5hdG9yOworICAgIGlmIChudW0gPiBHX01BWElOVCB8fCBkZW5vbSA+IEdfTUFYSU5UKSB7CisgICAgICBudW0gPj49IDE7CisgICAgICBkZW5vbSA+Pj0gMTsKKyAgICB9CisKKyAgICBtYXhudW0gPSBpdmFsLnN0ZXB3aXNlLm1heC5udW1lcmF0b3I7CisgICAgbWF4ZGVub20gPSBpdmFsLnN0ZXB3aXNlLm1heC5kZW5vbWluYXRvcjsKKyAgICBpZiAobWF4bnVtID4gR19NQVhJTlQgfHwgbWF4ZGVub20gPiBHX01BWElOVCkgeworICAgICAgbWF4bnVtID4+PSAxOworICAgICAgbWF4ZGVub20gPj49IDE7CisgICAgfQorCisgICAgR1NUX0xPR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICJjb250aW51b3VzIGZyYW1lIGludGVydmFsICVkLyVkIHRvICVkLyVkIiwgbWF4ZGVub20sIG1heG51bSwgZGVub20sCisgICAgICAgIG51bSk7CisKKyAgICBnc3RfdmFsdWVfc2V0X2ZyYWN0aW9uX3JhbmdlX2Z1bGwgKCZyYXRlcywgbWF4ZGVub20sIG1heG51bSwgZGVub20sIG51bSk7CisgIH0gZWxzZSB7CisgICAgZ290byB1bmtub3duX3R5cGU7CisgIH0KKworcmV0dXJuX2RhdGE6CisgIHMgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHRlbXBsYXRlKTsKKyAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIChnaW50KSB3aWR0aCwKKyAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCAoZ2ludCkgaGVpZ2h0LCBOVUxMKTsKKworICBnc3RfdjRsMl9vYmplY3RfYWRkX2FzcGVjdF9yYXRpbyAodjRsMm9iamVjdCwgcyk7CisKKyAgaWYgKCF2NGwyb2JqZWN0LT5za2lwX3RyeV9mbXRfcHJvYmVzKSB7CisgICAgZ3N0X3Y0bDJfb2JqZWN0X2FkZF9pbnRlcmxhY2VfbW9kZSAodjRsMm9iamVjdCwgcywgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgcGl4ZWxmb3JtYXQpOworICAgIGdzdF92NGwyX29iamVjdF9hZGRfY29sb3JzcGFjZSAodjRsMm9iamVjdCwgcywgd2lkdGgsIGhlaWdodCwgcGl4ZWxmb3JtYXQpOworICB9CisKKyAgaWYgKEdfSVNfVkFMVUUgKCZyYXRlcykpIHsKKyAgICBnc3RfdjRsMnNyY192YWx1ZV9zaW1wbGlmeSAoJnJhdGVzKTsKKyAgICAvKiBvbmx5IGNoYW5nZSB0aGUgZnJhbWVyYXRlIG9uIHRoZSB0ZW1wbGF0ZSB3aGVuIHdlIGhhdmUgYSB2YWxpZCBwcm9iZWQgbmV3CisgICAgICogdmFsdWUgKi8KKyAgICBnc3Rfc3RydWN0dXJlX3Rha2VfdmFsdWUgKHMsICJmcmFtZXJhdGUiLCAmcmF0ZXMpOworICB9IGVsc2UgaWYgKHY0bDJvYmplY3QtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8CisgICAgICB2NGwyb2JqZWN0LT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpIHsKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OX1JBTkdFLCAwLCAxLCBHX01BWElOVCwKKyAgICAgICAgMSwgTlVMTCk7CisgIH0KKyAgcmV0dXJuIHM7CisKKyAgLyogRVJST1JTICovCitlbnVtX2ZyYW1laW50ZXJ2YWxzX2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICJVbmFibGUgdG8gZW51bWVyYXRlIGludGVydmFscyBmb3IgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIkAldXgldSIsCisgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAocGl4ZWxmb3JtYXQpLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBnb3RvIHJldHVybl9kYXRhOworICB9Cit1bmtub3duX3R5cGU6CisgIHsKKyAgICAvKiBJIGRvbid0IHNlZSBob3cgdGhpcyBpcyBhY3R1YWxseSBhbiBlcnJvciwgd2UgaWdub3JlIHRoZSBmb3JtYXQgdGhlbiAqLworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgIlVua25vd24gZnJhbWUgaW50ZXJ2YWwgdHlwZSBhdCAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiQCV1eCV1OiAldSIsCisgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAocGl4ZWxmb3JtYXQpLCB3aWR0aCwgaGVpZ2h0LCBpdmFsLnR5cGUpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3N0YXRpYyBnaW50Citzb3J0X2J5X2ZyYW1lX3NpemUgKEdzdFN0cnVjdHVyZSAqIHMxLCBHc3RTdHJ1Y3R1cmUgKiBzMikKK3sKKyAgaW50IHcxLCBoMSwgdzIsIGgyOworCisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoczEsICJ3aWR0aCIsICZ3MSk7CisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoczEsICJoZWlnaHQiLCAmaDEpOworICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMyLCAid2lkdGgiLCAmdzIpOworICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMyLCAiaGVpZ2h0IiwgJmgyKTsKKworICAvKiBJIHRoaW5rIGl0J3Mgc2FmZSB0byBhc3N1bWUgdGhhdCB0aGlzIHdvbid0IG92ZXJmbG93IGZvciBhIHdoaWxlICovCisgIHJldHVybiAoKHcyICogaDIpIC0gKHcxICogaDEpKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX29iamVjdF91cGRhdGVfYW5kX2FwcGVuZCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgZ3VpbnQzMiBmb3JtYXQsIEdzdENhcHMgKiBjYXBzLCBHc3RTdHJ1Y3R1cmUgKiBzKQoreworICBHc3RTdHJ1Y3R1cmUgKmFsdF9zID0gTlVMTDsKKworICAvKiBFbmNvZGVkIHN0cmVhbSBvbiBvdXRwdXQgYnVmZmVyIG5lZWQgdG8gYmUgcGFyc2VkICovCisgIGlmICh2NGwyb2JqZWN0LT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUIHx8CisgICAgICB2NGwyb2JqZWN0LT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkgeworICAgIGdpbnQgaSA9IDA7CisKKyAgICBmb3IgKDsgaSA8IEdTVF9WNEwyX0ZPUk1BVF9DT1VOVDsgaSsrKSB7CisgICAgICBpZiAoZm9ybWF0ID09IGdzdF92NGwyX2Zvcm1hdHNbaV0uZm9ybWF0ICYmCisgICAgICAgICAgZ3N0X3Y0bDJfZm9ybWF0c1tpXS5mbGFncyAmIEdTVF9WNEwyX0NPREVDICYmCisgICAgICAgICAgIShnc3RfdjRsMl9mb3JtYXRzW2ldLmZsYWdzICYgR1NUX1Y0TDJfTk9fUEFSU0UpKSB7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAicGFyc2VkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAodjRsMm9iamVjdC0+aGFzX2FscGhhX2NvbXBvbmVudCAmJgorICAgICAgKHY0bDJvYmplY3QtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8CisgICAgICAgICAgdjRsMm9iamVjdC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSkgeworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0IzMjoKKyAgICAgICAgYWx0X3MgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHMpOworICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAoYWx0X3MsICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiQVJHQiIsIE5VTEwpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVjRMMl9QSVhfRk1UX0JHUjMyOgorICAgICAgICBhbHRfcyA9IGdzdF9zdHJ1Y3R1cmVfY29weSAocyk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChhbHRfcywgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJCR1JBIiwgTlVMTCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoY2Fwcywgcyk7CisKKyAgaWYgKGFsdF9zKQorICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKGNhcHMsIGFsdF9zKTsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3Y0bDJfb2JqZWN0X3Byb2JlX2NhcHNfZm9yX2Zvcm1hdCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgZ3VpbnQzMiBwaXhlbGZvcm1hdCwgY29uc3QgR3N0U3RydWN0dXJlICogdGVtcGxhdGUpCit7CisgIEdzdENhcHMgKnJldCA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKyAgR3N0U3RydWN0dXJlICp0bXA7CisgIGdpbnQgZmQgPSB2NGwyb2JqZWN0LT52aWRlb19mZDsKKyAgc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0gc2l6ZTsKKyAgR0xpc3QgKnJlc3VsdHMgPSBOVUxMOworICBndWludDMyIHcsIGg7CisKKyAgaWYgKHBpeGVsZm9ybWF0ID09IEdTVF9NQUtFX0ZPVVJDQyAoJ00nLCAnUCcsICdFJywgJ0cnKSkgeworICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKHJldCwgZ3N0X3N0cnVjdHVyZV9jb3B5ICh0ZW1wbGF0ZSkpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICBtZW1zZXQgKCZzaXplLCAwLCBzaXplb2YgKHN0cnVjdCB2NGwyX2ZybXNpemVlbnVtKSk7CisgIHNpemUuaW5kZXggPSAwOworICBzaXplLnBpeGVsX2Zvcm1hdCA9IHBpeGVsZm9ybWF0OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAiRW51bWVyYXRpbmcgZnJhbWUgc2l6ZXMgZm9yICUiIEdTVF9GT1VSQ0NfRk9STUFULAorICAgICAgR1NUX0ZPVVJDQ19BUkdTIChwaXhlbGZvcm1hdCkpOworCisgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAoZmQsIFZJRElPQ19FTlVNX0ZSQU1FU0laRVMsICZzaXplKSA8IDApCisgICAgZ290byBlbnVtX2ZyYW1lc2l6ZXNfZmFpbGVkOworCisgIGlmIChzaXplLnR5cGUgPT0gVjRMMl9GUk1TSVpFX1RZUEVfRElTQ1JFVEUpIHsKKyAgICBkbyB7CisgICAgICBHU1RfTE9HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgImdvdCBkaXNjcmV0ZSBmcmFtZSBzaXplICVkeCVkIiwKKyAgICAgICAgICBzaXplLmRpc2NyZXRlLndpZHRoLCBzaXplLmRpc2NyZXRlLmhlaWdodCk7CisKKyAgICAgIHcgPSBNSU4gKHNpemUuZGlzY3JldGUud2lkdGgsIEdfTUFYSU5UKTsKKyAgICAgIGggPSBNSU4gKHNpemUuZGlzY3JldGUuaGVpZ2h0LCBHX01BWElOVCk7CisKKyAgICAgIGlmICh3ICYmIGgpIHsKKyAgICAgICAgdG1wID0KKyAgICAgICAgICAgIGdzdF92NGwyX29iamVjdF9wcm9iZV9jYXBzX2Zvcl9mb3JtYXRfYW5kX3NpemUgKHY0bDJvYmplY3QsCisgICAgICAgICAgICBwaXhlbGZvcm1hdCwgdywgaCwgdGVtcGxhdGUpOworCisgICAgICAgIGlmICh0bXApCisgICAgICAgICAgcmVzdWx0cyA9IGdfbGlzdF9wcmVwZW5kIChyZXN1bHRzLCB0bXApOworICAgICAgfQorCisgICAgICBzaXplLmluZGV4Kys7CisgICAgfSB3aGlsZSAodjRsMm9iamVjdC0+aW9jdGwgKGZkLCBWSURJT0NfRU5VTV9GUkFNRVNJWkVTLCAmc2l6ZSkgPj0gMCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgImRvbmUgaXRlcmF0aW5nIGRpc2NyZXRlIGZyYW1lIHNpemVzIik7CisgIH0gZWxzZSBpZiAoc2l6ZS50eXBlID09IFY0TDJfRlJNU0laRV9UWVBFX1NURVBXSVNFKSB7CisgICAgZ3VpbnQzMiBtYXh3LCBtYXhoLCBzdGVwX3csIHN0ZXBfaDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJ3ZSBoYXZlIHN0ZXB3aXNlIGZyYW1lIHNpemVzOiIpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJtaW4gd2lkdGg6ICAgJWQiLAorICAgICAgICBzaXplLnN0ZXB3aXNlLm1pbl93aWR0aCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIm1pbiBoZWlnaHQ6ICAlZCIsCisgICAgICAgIHNpemUuc3RlcHdpc2UubWluX2hlaWdodCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIm1heCB3aWR0aDogICAlZCIsCisgICAgICAgIHNpemUuc3RlcHdpc2UubWF4X3dpZHRoKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAibWluIGhlaWdodDogICVkIiwKKyAgICAgICAgc2l6ZS5zdGVwd2lzZS5tYXhfaGVpZ2h0KTsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAic3RlcCB3aWR0aDogICVkIiwKKyAgICAgICAgc2l6ZS5zdGVwd2lzZS5zdGVwX3dpZHRoKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAic3RlcCBoZWlnaHQ6ICVkIiwKKyAgICAgICAgc2l6ZS5zdGVwd2lzZS5zdGVwX2hlaWdodCk7CisKKyAgICB3ID0gTUFYIChzaXplLnN0ZXB3aXNlLm1pbl93aWR0aCwgMSk7CisgICAgaCA9IE1BWCAoc2l6ZS5zdGVwd2lzZS5taW5faGVpZ2h0LCAxKTsKKyAgICBtYXh3ID0gTUlOIChzaXplLnN0ZXB3aXNlLm1heF93aWR0aCwgR19NQVhJTlQpOworICAgIG1heGggPSBNSU4gKHNpemUuc3RlcHdpc2UubWF4X2hlaWdodCwgR19NQVhJTlQpOworCisgICAgc3RlcF93ID0gTUFYIChzaXplLnN0ZXB3aXNlLnN0ZXBfd2lkdGgsIDEpOworICAgIHN0ZXBfaCA9IE1BWCAoc2l6ZS5zdGVwd2lzZS5zdGVwX2hlaWdodCwgMSk7CisKKyAgICAvKiBGSVhNRTogY2hlY2sgZm9yIHNhbml0eSBhbmQgdGhhdCBtaW4vbWF4IGFyZSBtdWx0aXBsZXMgb2YgdGhlIHN0ZXBzICovCisKKyAgICAvKiB3ZSBvbmx5IHF1ZXJ5IGRldGFpbHMgZm9yIHRoZSBtYXggd2lkdGgvaGVpZ2h0IHNpbmNlIGl0J3MgbGlrZWx5IHRoZQorICAgICAqIG1vc3QgcmVzdHJpY3RlZCBpZiB0aGVyZSBhcmUgYW55IHJlc29sdXRpb24tZGVwZW5kZW50IHJlc3RyaWN0aW9ucyAqLworICAgIHRtcCA9IGdzdF92NGwyX29iamVjdF9wcm9iZV9jYXBzX2Zvcl9mb3JtYXRfYW5kX3NpemUgKHY0bDJvYmplY3QsCisgICAgICAgIHBpeGVsZm9ybWF0LCBtYXh3LCBtYXhoLCB0ZW1wbGF0ZSk7CisKKyAgICBpZiAodG1wKSB7CisgICAgICBHVmFsdWUgc3RlcF9yYW5nZSA9IEdfVkFMVUVfSU5JVDsKKworICAgICAgZ192YWx1ZV9pbml0ICgmc3RlcF9yYW5nZSwgR1NUX1RZUEVfSU5UX1JBTkdFKTsKKyAgICAgIGdzdF92YWx1ZV9zZXRfaW50X3JhbmdlX3N0ZXAgKCZzdGVwX3JhbmdlLCB3LCBtYXh3LCBzdGVwX3cpOworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKHRtcCwgIndpZHRoIiwgJnN0ZXBfcmFuZ2UpOworCisgICAgICBnc3RfdmFsdWVfc2V0X2ludF9yYW5nZV9zdGVwICgmc3RlcF9yYW5nZSwgaCwgbWF4aCwgc3RlcF9oKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfdGFrZV92YWx1ZSAodG1wLCAiaGVpZ2h0IiwgJnN0ZXBfcmFuZ2UpOworCisgICAgICAvKiBubyBwb2ludCB1c2luZyB0aGUgcmVzdWx0cyBsaXN0IGhlcmUsIHNpbmNlIHRoZXJlJ3Mgb25seSBvbmUgc3RydWN0ICovCisgICAgICBnc3RfdjRsMl9vYmplY3RfdXBkYXRlX2FuZF9hcHBlbmQgKHY0bDJvYmplY3QsIHBpeGVsZm9ybWF0LCByZXQsIHRtcCk7CisgICAgfQorICB9IGVsc2UgaWYgKHNpemUudHlwZSA9PSBWNEwyX0ZSTVNJWkVfVFlQRV9DT05USU5VT1VTKSB7CisgICAgZ3VpbnQzMiBtYXh3LCBtYXhoOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIndlIGhhdmUgY29udGludW91cyBmcmFtZSBzaXplczoiKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAibWluIHdpZHRoOiAgICVkIiwKKyAgICAgICAgc2l6ZS5zdGVwd2lzZS5taW5fd2lkdGgpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJtaW4gaGVpZ2h0OiAgJWQiLAorICAgICAgICBzaXplLnN0ZXB3aXNlLm1pbl9oZWlnaHQpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJtYXggd2lkdGg6ICAgJWQiLAorICAgICAgICBzaXplLnN0ZXB3aXNlLm1heF93aWR0aCk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIm1pbiBoZWlnaHQ6ICAlZCIsCisgICAgICAgIHNpemUuc3RlcHdpc2UubWF4X2hlaWdodCk7CisKKyAgICB3ID0gTUFYIChzaXplLnN0ZXB3aXNlLm1pbl93aWR0aCwgMSk7CisgICAgaCA9IE1BWCAoc2l6ZS5zdGVwd2lzZS5taW5faGVpZ2h0LCAxKTsKKyAgICBtYXh3ID0gTUlOIChzaXplLnN0ZXB3aXNlLm1heF93aWR0aCwgR19NQVhJTlQpOworICAgIG1heGggPSBNSU4gKHNpemUuc3RlcHdpc2UubWF4X2hlaWdodCwgR19NQVhJTlQpOworCisgICAgdG1wID0KKyAgICAgICAgZ3N0X3Y0bDJfb2JqZWN0X3Byb2JlX2NhcHNfZm9yX2Zvcm1hdF9hbmRfc2l6ZSAodjRsMm9iamVjdCwgcGl4ZWxmb3JtYXQsCisgICAgICAgIHcsIGgsIHRlbXBsYXRlKTsKKyAgICBpZiAodG1wKSB7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAodG1wLCAid2lkdGgiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIChnaW50KSB3LAorICAgICAgICAgIChnaW50KSBtYXh3LCAiaGVpZ2h0IiwgR1NUX1RZUEVfSU5UX1JBTkdFLCAoZ2ludCkgaCwgKGdpbnQpIG1heGgsCisgICAgICAgICAgTlVMTCk7CisKKyAgICAgIC8qIG5vIHBvaW50IHVzaW5nIHRoZSByZXN1bHRzIGxpc3QgaGVyZSwgc2luY2UgdGhlcmUncyBvbmx5IG9uZSBzdHJ1Y3QgKi8KKyAgICAgIGdzdF92NGwyX29iamVjdF91cGRhdGVfYW5kX2FwcGVuZCAodjRsMm9iamVjdCwgcGl4ZWxmb3JtYXQsIHJldCwgdG1wKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ290byB1bmtub3duX3R5cGU7CisgIH0KKworICAvKiB3ZSB1c2UgYW4gaW50ZXJtZWRpYXJ5IGxpc3QgdG8gc3RvcmUgYW5kIHRoZW4gc29ydCB0aGUgcmVzdWx0cyBvZiB0aGUKKyAgICogcHJvYmluZyBiZWNhdXNlIHdlIGNhbid0IG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZSBvcmRlciBpbiB3aGljaAorICAgKiB0aGUgZHJpdmVyIHdpbGwgZ2l2ZSB1cyB0aGUgc2l6ZXMsIGJ1dCB3ZSB3YW50IHRoZSBmaW5hbCBjYXBzIHRvIGNvbnRhaW4KKyAgICogdGhlIHJlc3VsdHMgc3RhcnRpbmcgd2l0aCB0aGUgaGlnaGVzdCByZXNvbHV0aW9uIGFuZCBoYXZpbmcgdGhlIGxvd2VzdAorICAgKiByZXNvbHV0aW9uIGxhc3QsIHNpbmNlIG9yZGVyIGluIGNhcHMgbWF0dGVycyBmb3IgdGhpbmdzIGxpa2UgZml4YXRpb24uICovCisgIHJlc3VsdHMgPSBnX2xpc3Rfc29ydCAocmVzdWx0cywgKEdDb21wYXJlRnVuYykgc29ydF9ieV9mcmFtZV9zaXplKTsKKyAgd2hpbGUgKHJlc3VsdHMgIT0gTlVMTCkgeworICAgIGdzdF92NGwyX29iamVjdF91cGRhdGVfYW5kX2FwcGVuZCAodjRsMm9iamVjdCwgcGl4ZWxmb3JtYXQsIHJldCwKKyAgICAgICAgcmVzdWx0cy0+ZGF0YSk7CisgICAgcmVzdWx0cyA9IGdfbGlzdF9kZWxldGVfbGluayAocmVzdWx0cywgcmVzdWx0cyk7CisgIH0KKworICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKHJldCkpCisgICAgZ290byBlbnVtX2ZyYW1lc2l6ZXNfbm9fcmVzdWx0czsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworZW51bV9mcmFtZXNpemVzX2ZhaWxlZDoKKyAgeworICAgIC8qIEkgZG9uJ3Qgc2VlIGhvdyB0aGlzIGlzIGFjdHVhbGx5IGFuIGVycm9yICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgIkZhaWxlZCB0byBlbnVtZXJhdGUgZnJhbWUgc2l6ZXMgZm9yIHBpeGVsZm9ybWF0ICUiIEdTVF9GT1VSQ0NfRk9STUFUCisgICAgICAgICIgKCVzKSIsIEdTVF9GT1VSQ0NfQVJHUyAocGl4ZWxmb3JtYXQpLCBnX3N0cmVycm9yIChlcnJubykpOworICAgIGdvdG8gZGVmYXVsdF9mcmFtZV9zaXplczsKKyAgfQorZW51bV9mcmFtZXNpemVzX25vX3Jlc3VsdHM6CisgIHsKKyAgICAvKiBpdCdzIHBvc3NpYmxlIHRoYXQgVklESU9DX0VOVU1fRlJBTUVTSVpFUyBpcyBkZWZpbmVkIGJ1dCB0aGUgZHJpdmVyIGluCisgICAgICogcXVlc3Rpb24gZG9lc24ndCBhY3R1YWxseSBzdXBwb3J0IGl0IHlldCAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICJObyByZXN1bHRzIGZvciBwaXhlbGZvcm1hdCAlIiBHU1RfRk9VUkNDX0ZPUk1BVAorICAgICAgICAiIGVudW1lcmF0aW5nIGZyYW1lIHNpemVzLCB0cnlpbmcgZmFsbGJhY2siLAorICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHBpeGVsZm9ybWF0KSk7CisgICAgZ290byBkZWZhdWx0X2ZyYW1lX3NpemVzOworICB9Cit1bmtub3duX3R5cGU6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICJVbmtub3duIGZyYW1lIHNpemVlbnVtIHR5cGUgZm9yIHBpeGVsZm9ybWF0ICUiIEdTVF9GT1VSQ0NfRk9STUFUCisgICAgICAgICI6ICV1IiwgR1NUX0ZPVVJDQ19BUkdTIChwaXhlbGZvcm1hdCksIHNpemUudHlwZSk7CisgICAgZ290byBkZWZhdWx0X2ZyYW1lX3NpemVzOworICB9CisKK2RlZmF1bHRfZnJhbWVfc2l6ZXM6CisgIHsKKyAgICBnaW50IG1pbl93LCBtYXhfdywgbWluX2gsIG1heF9oLCBmaXhfbnVtID0gMCwgZml4X2Rlbm9tID0gMDsKKworICAgIC8qIFRoaXMgY29kZSBpcyBmb3IgTGludXggPCAyLjYuMTkgKi8KKyAgICBtaW5fdyA9IG1pbl9oID0gMTsKKyAgICBtYXhfdyA9IG1heF9oID0gR1NUX1Y0TDJfTUFYX1NJWkU7CisgICAgaWYgKCFnc3RfdjRsMl9vYmplY3RfZ2V0X25lYXJlc3Rfc2l6ZSAodjRsMm9iamVjdCwgcGl4ZWxmb3JtYXQsICZtaW5fdywKKyAgICAgICAgICAgICZtaW5faCkpIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgICAiQ291bGQgbm90IHByb2JlIG1pbmltdW0gY2FwdHVyZSBzaXplIGZvciBwaXhlbGZvcm1hdCAlIgorICAgICAgICAgIEdTVF9GT1VSQ0NfRk9STUFULCBHU1RfRk9VUkNDX0FSR1MgKHBpeGVsZm9ybWF0KSk7CisgICAgfQorICAgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X2dldF9uZWFyZXN0X3NpemUgKHY0bDJvYmplY3QsIHBpeGVsZm9ybWF0LCAmbWF4X3csCisgICAgICAgICAgICAmbWF4X2gpKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICAgIkNvdWxkIG5vdCBwcm9iZSBtYXhpbXVtIGNhcHR1cmUgc2l6ZSBmb3IgcGl4ZWxmb3JtYXQgJSIKKyAgICAgICAgICBHU1RfRk9VUkNDX0ZPUk1BVCwgR1NUX0ZPVVJDQ19BUkdTIChwaXhlbGZvcm1hdCkpOworICAgIH0KKworICAgIC8qIFNpbmNlIHdlIGNhbid0IGdldCBmcmFtZXJhdGUgZGlyZWN0bHksIHRyeSB0byB1c2UgdGhlIGN1cnJlbnQgbm9ybSAqLworICAgIGlmICh2NGwyb2JqZWN0LT50dl9ub3JtICYmIHY0bDJvYmplY3QtPm5vcm1zKSB7CisgICAgICBHTGlzdCAqbm9ybXM7CisgICAgICBHc3RUdW5lck5vcm0gKm5vcm0gPSBOVUxMOworICAgICAgR3N0VHVuZXJOb3JtICpjdXJyZW50ID0KKyAgICAgICAgICBnc3RfdjRsMl90dW5lcl9nZXRfbm9ybV9ieV9zdGRfaWQgKHY0bDJvYmplY3QsIHY0bDJvYmplY3QtPnR2X25vcm0pOworCisgICAgICBmb3IgKG5vcm1zID0gdjRsMm9iamVjdC0+bm9ybXM7IG5vcm1zICE9IE5VTEw7IG5vcm1zID0gbm9ybXMtPm5leHQpIHsKKyAgICAgICAgbm9ybSA9IChHc3RUdW5lck5vcm0gKikgbm9ybXMtPmRhdGE7CisgICAgICAgIGlmICghc3RyY21wIChub3JtLT5sYWJlbCwgY3VycmVudC0+bGFiZWwpKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLyogSWYgaXQncyBwb3NzaWJsZSwgc2V0IGZyYW1lcmF0ZSB0byB0aGF0IChkaXNjcmV0ZSkgdmFsdWUgKi8KKyAgICAgIGlmIChub3JtKSB7CisgICAgICAgIGZpeF9udW0gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAoJm5vcm0tPmZyYW1lcmF0ZSk7CisgICAgICAgIGZpeF9kZW5vbSA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fZGVub21pbmF0b3IgKCZub3JtLT5mcmFtZXJhdGUpOworICAgICAgfQorICAgIH0KKworICAgIHRtcCA9IGdzdF9zdHJ1Y3R1cmVfY29weSAodGVtcGxhdGUpOworICAgIGlmIChmaXhfbnVtKSB7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAodG1wLCAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sIGZpeF9udW0sCisgICAgICAgICAgZml4X2Rlbm9tLCBOVUxMKTsKKyAgICB9IGVsc2UgaWYgKHY0bDJvYmplY3QtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8CisgICAgICAgIHY0bDJvYmplY3QtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgeworICAgICAgLyogaWYgbm9ybSBjYW4ndCBiZSB1c2VkLCBjb3B5IHRoZSB0ZW1wbGF0ZSBmcmFtZXJhdGUgKi8KKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0ICh0bXAsICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTl9SQU5HRSwgMCwgMSwKKyAgICAgICAgICBHX01BWElOVCwgMSwgTlVMTCk7CisgICAgfQorCisgICAgaWYgKG1pbl93ID09IG1heF93KQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHRtcCwgIndpZHRoIiwgR19UWVBFX0lOVCwgbWF4X3csIE5VTEwpOworICAgIGVsc2UKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0ICh0bXAsICJ3aWR0aCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgbWluX3csIG1heF93LCBOVUxMKTsKKworICAgIGlmIChtaW5faCA9PSBtYXhfaCkKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0ICh0bXAsICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBtYXhfaCwgTlVMTCk7CisgICAgZWxzZQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHRtcCwgImhlaWdodCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgbWluX2gsIG1heF9oLCBOVUxMKTsKKworICAgIGdzdF92NGwyX29iamVjdF9hZGRfYXNwZWN0X3JhdGlvICh2NGwyb2JqZWN0LCB0bXApOworCisgICAgaWYgKCF2NGwyb2JqZWN0LT5za2lwX3RyeV9mbXRfcHJvYmVzKSB7CisgICAgICAvKiBXZSBjb3VsZCBjb25zaWRlciBzZXR0aW5nIGludGVybGFjZSBtb2RlIGZyb20gbWluIGFuZCBtYXguICovCisgICAgICBnc3RfdjRsMl9vYmplY3RfYWRkX2ludGVybGFjZV9tb2RlICh2NGwyb2JqZWN0LCB0bXAsIG1heF93LCBtYXhfaCwKKyAgICAgICAgICBwaXhlbGZvcm1hdCk7CisgICAgICAvKiBXZSBjb3VsZCBjb25zaWRlciB0byBjaGVjayBjb2xvcnNwYWNlIGZvciBtaW4gdG9vLCBpbiBjYXNlIGl0IGRlcGVuZHMgb24KKyAgICAgICAqIHRoZSBzaXplLiBCdXQgaW4gdGhpcyBjYXNlLCBtaW4gYW5kIG1heCBjb3VsZCBub3QgYmUgZW5vdWdoICovCisgICAgICBnc3RfdjRsMl9vYmplY3RfYWRkX2NvbG9yc3BhY2UgKHY0bDJvYmplY3QsIHRtcCwgbWF4X3csIG1heF9oLAorICAgICAgICAgIHBpeGVsZm9ybWF0KTsKKyAgICB9CisKKyAgICBnc3RfdjRsMl9vYmplY3RfdXBkYXRlX2FuZF9hcHBlbmQgKHY0bDJvYmplY3QsIHBpeGVsZm9ybWF0LCByZXQsIHRtcCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX29iamVjdF9nZXRfbmVhcmVzdF9zaXplIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBndWludDMyIHBpeGVsZm9ybWF0LCBnaW50ICogd2lkdGgsIGdpbnQgKiBoZWlnaHQpCit7CisgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQ7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworICBHc3RWaWRlb0ludGVybGFjZU1vZGUgaW50ZXJsYWNlX21vZGU7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHdpZHRoICE9IE5VTEwsIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGhlaWdodCAhPSBOVUxMLCBGQUxTRSk7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAiZ2V0dGluZyBuZWFyZXN0IHNpemUgdG8gJWR4JWQgd2l0aCBmb3JtYXQgJSIgR1NUX0ZPVVJDQ19GT1JNQVQsCisgICAgICAqd2lkdGgsICpoZWlnaHQsIEdTVF9GT1VSQ0NfQVJHUyAocGl4ZWxmb3JtYXQpKTsKKworICBtZW1zZXQgKCZmbXQsIDAsIHNpemVvZiAoc3RydWN0IHY0bDJfZm9ybWF0KSk7CisKKyAgLyogZ2V0IHNpemUgZGVsaW1pdGVycyAqLworICBtZW1zZXQgKCZmbXQsIDAsIHNpemVvZiAoZm10KSk7CisgIGZtdC50eXBlID0gdjRsMm9iamVjdC0+dHlwZTsKKyAgZm10LmZtdC5waXgud2lkdGggPSAqd2lkdGg7CisgIGZtdC5mbXQucGl4LmhlaWdodCA9ICpoZWlnaHQ7CisgIGZtdC5mbXQucGl4LnBpeGVsZm9ybWF0ID0gcGl4ZWxmb3JtYXQ7CisgIGZtdC5mbXQucGl4LmZpZWxkID0gVjRMMl9GSUVMRF9BTlk7CisKKyAgaWYgKGdzdF92NGwyX29iamVjdF90cnlfZm10ICh2NGwyb2JqZWN0LCAmZm10KSA8IDApCisgICAgZ290byBlcnJvcjsKKworICBHU1RfTE9HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICJnb3QgbmVhcmVzdCBzaXplICVkeCVkIiwgZm10LmZtdC5waXgud2lkdGgsIGZtdC5mbXQucGl4LmhlaWdodCk7CisKKyAgKndpZHRoID0gZm10LmZtdC5waXgud2lkdGg7CisgICpoZWlnaHQgPSBmbXQuZm10LnBpeC5oZWlnaHQ7CisKKyAgaWYgKCFnc3RfdjRsMl9vYmplY3RfZ2V0X2ludGVybGFjZV9tb2RlIChmbXQuZm10LnBpeC5maWVsZCwgJmludGVybGFjZV9tb2RlKSkgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgIlVuc3VwcG9ydGVkIGZpZWxkIHR5cGUgZm9yICUiIEdTVF9GT1VSQ0NfRk9STUFUICJAJXV4JXU6ICV1IiwKKyAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChwaXhlbGZvcm1hdCksICp3aWR0aCwgKmhlaWdodCwgZm10LmZtdC5waXguZmllbGQpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICByZXQgPSBUUlVFOworCitlcnJvcjoKKyAgaWYgKCFyZXQpIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICJVbmFibGUgdG8gdHJ5IGZvcm1hdDogJXMiLCBnX3N0cmVycm9yIChlcnJubykpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl9vYmplY3RfaXNfZG1hYnVmX3N1cHBvcnRlZCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpCit7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIHN0cnVjdCB2NGwyX2V4cG9ydGJ1ZmZlciBleHBidWYgPSB7CisgICAgLnR5cGUgPSB2NGwyb2JqZWN0LT50eXBlLAorICAgIC5pbmRleCA9IC0xLAorICAgIC5wbGFuZSA9IC0xLAorICAgIC5mbGFncyA9IE9fQ0xPRVhFQyB8IE9fUkRXUiwKKyAgfTsKKworICAvKiBFeHBlY3RlZCB0byBmYWlsLCBidXQgRU5PVFRZIHRlbGxzIHVzIHRoYXQgaXQgaXMgbm90IGltcGxlbWVudGVkLiAqLworICB2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19FWFBCVUYsICZleHBidWYpOworICBpZiAoZXJybm8gPT0gRU5PVFRZKQorICAgIHJldCA9IEZBTFNFOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfb2JqZWN0X3NldHVwX3Bvb2wgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0VjRsMklPTW9kZSBtb2RlOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJpbml0aWFsaXppbmcgdGhlICVzIHN5c3RlbSIsCisgICAgICBWNEwyX1RZUEVfSVNfT1VUUFVUICh2NGwyb2JqZWN0LT50eXBlKSA/ICJvdXRwdXQiIDogImNhcHR1cmUiKTsKKworICBHU1RfVjRMMl9DSEVDS19PUEVOICh2NGwyb2JqZWN0KTsKKyAgR1NUX1Y0TDJfQ0hFQ0tfTk9UX0FDVElWRSAodjRsMm9iamVjdCk7CisKKyAgLyogZmluZCB0cmFuc3BvcnQgKi8KKyAgbW9kZSA9IHY0bDJvYmplY3QtPnJlcV9tb2RlOworCisgIGlmICh2NGwyb2JqZWN0LT5kZXZpY2VfY2FwcyAmIFY0TDJfQ0FQX1JFQURXUklURSkgeworICAgIGlmICh2NGwyb2JqZWN0LT5yZXFfbW9kZSA9PSBHU1RfVjRMMl9JT19BVVRPKQorICAgICAgbW9kZSA9IEdTVF9WNEwyX0lPX1JXOworICB9IGVsc2UgaWYgKHY0bDJvYmplY3QtPnJlcV9tb2RlID09IEdTVF9WNEwyX0lPX1JXKQorICAgIGdvdG8gbWV0aG9kX25vdF9zdXBwb3J0ZWQ7CisKKyAgaWYgKHY0bDJvYmplY3QtPmRldmljZV9jYXBzICYgVjRMMl9DQVBfU1RSRUFNSU5HKSB7CisgICAgaWYgKHY0bDJvYmplY3QtPnJlcV9tb2RlID09IEdTVF9WNEwyX0lPX0FVVE8pIHsKKyAgICAgIGlmICghVjRMMl9UWVBFX0lTX09VVFBVVCAodjRsMm9iamVjdC0+dHlwZSkgJiYKKyAgICAgICAgICBnc3RfdjRsMl9vYmplY3RfaXNfZG1hYnVmX3N1cHBvcnRlZCAodjRsMm9iamVjdCkpIHsKKyAgICAgICAgbW9kZSA9IEdTVF9WNEwyX0lPX0RNQUJVRjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1vZGUgPSBHU1RfVjRMMl9JT19NTUFQOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICh2NGwyb2JqZWN0LT5yZXFfbW9kZSA9PSBHU1RfVjRMMl9JT19NTUFQKQorICAgIGdvdG8gbWV0aG9kX25vdF9zdXBwb3J0ZWQ7CisKKyAgLyogaWYgc3RpbGwgbm8gdHJhbnNwb3J0IHNlbGVjdGVkLCBlcnJvciBvdXQgKi8KKyAgaWYgKG1vZGUgPT0gR1NUX1Y0TDJfSU9fQVVUTykKKyAgICBnb3RvIG5vX3N1cHBvcnRlZF9jYXB0dXJlX21ldGhvZDsKKworICBHU1RfSU5GT19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJhY2Nlc3NpbmcgYnVmZmVycyB2aWEgbW9kZSAlZCIsIG1vZGUpOworICB2NGwyb2JqZWN0LT5tb2RlID0gbW9kZTsKKworICAvKiBJZiBtaW5fYnVmZmVycyBpcyBub3Qgc2V0LCB0aGUgZHJpdmVyIGVpdGhlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjb250cm9sIG9yCisgICAgIGl0IGhhcyBub3QgYmVlbiBhc2tlZCB5ZXQgdmlhIHByb3Bvc2VfYWxsb2NhdGlvbi9kZWNpZGVfYWxsb2NhdGlvbi4gKi8KKyAgaWYgKCF2NGwyb2JqZWN0LT5taW5fYnVmZmVycykKKyAgICBnc3RfdjRsMl9nZXRfZHJpdmVyX21pbl9idWZmZXJzICh2NGwyb2JqZWN0KTsKKworICAvKiBNYXAgdGhlIGJ1ZmZlcnMgKi8KKyAgR1NUX0xPR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJpbml0aWF0aW5nIGJ1ZmZlciBwb29sIik7CisKKyAgaWYgKCEodjRsMm9iamVjdC0+cG9vbCA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX25ldyAodjRsMm9iamVjdCwgY2FwcykpKQorICAgIGdvdG8gYnVmZmVyX3Bvb2xfbmV3X2ZhaWxlZDsKKworICBHU1RfVjRMMl9TRVRfQUNUSVZFICh2NGwyb2JqZWN0KTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2J1ZmZlcl9wb29sX25ld19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIFJFQUQsCisgICAgICAgIChfKCJDb3VsZCBub3QgbWFwIGJ1ZmZlcnMgZnJvbSBkZXZpY2UgJyVzJyIpLAorICAgICAgICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYpLAorICAgICAgICAoIkZhaWxlZCB0byBjcmVhdGUgYnVmZmVyIHBvb2w6ICVzIiwgZ19zdHJlcnJvciAoZXJybm8pKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CittZXRob2Rfbm90X3N1cHBvcnRlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgUkVBRCwKKyAgICAgICAgKF8oIlRoZSBkcml2ZXIgb2YgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSU8gbWV0aG9kICVkIiksCisgICAgICAgICAgICB2NGwyb2JqZWN0LT52aWRlb2RldiwgbW9kZSksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Citub19zdXBwb3J0ZWRfY2FwdHVyZV9tZXRob2Q6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIFJFQUQsCisgICAgICAgIChfKCJUaGUgZHJpdmVyIG9mIGRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYW55IGtub3duIElPICIKKyAgICAgICAgICAgICAgICAibWV0aG9kLiIpLCB2NGwyb2JqZWN0LT52aWRlb2RldiksIChOVUxMKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9vYmplY3Rfc2V0X3N0cmlkZSAoR3N0VmlkZW9JbmZvICogaW5mbywgR3N0VmlkZW9BbGlnbm1lbnQgKiBhbGlnbiwKKyAgICBnaW50IHBsYW5lLCBnaW50IHN0cmlkZSkKK3sKKyAgY29uc3QgR3N0VmlkZW9Gb3JtYXRJbmZvICpmaW5mbyA9IGluZm8tPmZpbmZvOworCisgIGlmIChHU1RfVklERU9fRk9STUFUX0lORk9fSVNfVElMRUQgKGZpbmZvKSkgeworICAgIGdpbnQgeF90aWxlcywgeV90aWxlcywgd3MsIGhzLCB0aWxlX2hlaWdodCwgcGFkZGVkX2hlaWdodDsKKworCisgICAgd3MgPSBHU1RfVklERU9fRk9STUFUX0lORk9fVElMRV9XUyAoZmluZm8pOworICAgIGhzID0gR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1RJTEVfSFMgKGZpbmZvKTsKKyAgICB0aWxlX2hlaWdodCA9IDEgPDwgaHM7CisKKyAgICBwYWRkZWRfaGVpZ2h0ID0gR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX0hFSUdIVCAoZmluZm8sIHBsYW5lLAorICAgICAgICBpbmZvLT5oZWlnaHQgKyBhbGlnbi0+cGFkZGluZ190b3AgKyBhbGlnbi0+cGFkZGluZ19ib3R0b20pOworICAgIHBhZGRlZF9oZWlnaHQgPSBHU1RfUk9VTkRfVVBfTiAocGFkZGVkX2hlaWdodCwgdGlsZV9oZWlnaHQpOworCisgICAgeF90aWxlcyA9IHN0cmlkZSA+PiB3czsKKyAgICB5X3RpbGVzID0gcGFkZGVkX2hlaWdodCA+PiBoczsKKyAgICBpbmZvLT5zdHJpZGVbcGxhbmVdID0gR1NUX1ZJREVPX1RJTEVfTUFLRV9TVFJJREUgKHhfdGlsZXMsIHlfdGlsZXMpOworICB9IGVsc2UgeworICAgIGluZm8tPnN0cmlkZVtwbGFuZV0gPSBzdHJpZGU7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX29iamVjdF9leHRyYXBvbGF0ZV9pbmZvIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBHc3RWaWRlb0luZm8gKiBpbmZvLCBHc3RWaWRlb0FsaWdubWVudCAqIGFsaWduLCBnaW50IHN0cmlkZSkKK3sKKyAgY29uc3QgR3N0VmlkZW9Gb3JtYXRJbmZvICpmaW5mbyA9IGluZm8tPmZpbmZvOworICBnaW50IGksIGVzdHJpZGUsIHBhZGRlZF9oZWlnaHQ7CisgIGdzaXplIG9mZnMgPSAwOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKHY0bDJvYmplY3QtPm5fdjRsMl9wbGFuZXMgPT0gMSk7CisKKyAgcGFkZGVkX2hlaWdodCA9IGluZm8tPmhlaWdodCArIGFsaWduLT5wYWRkaW5nX3RvcCArIGFsaWduLT5wYWRkaW5nX2JvdHRvbTsKKworICBmb3IgKGkgPSAwOyBpIDwgZmluZm8tPm5fcGxhbmVzOyBpKyspIHsKKyAgICBlc3RyaWRlID0gZ3N0X3Y0bDJfb2JqZWN0X2V4dHJhcG9sYXRlX3N0cmlkZSAoZmluZm8sIGksIHN0cmlkZSk7CisKKyAgICBnc3RfdjRsMl9vYmplY3Rfc2V0X3N0cmlkZSAoaW5mbywgYWxpZ24sIGksIGVzdHJpZGUpOworCisgICAgaW5mby0+b2Zmc2V0W2ldID0gb2ZmczsKKyAgICBvZmZzICs9IGVzdHJpZGUgKgorICAgICAgICBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfSEVJR0hUIChmaW5mbywgaSwgcGFkZGVkX2hlaWdodCk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgICAiRXh0cmFwb2xhdGVkIGZvciBwbGFuZSAlZCB3aXRoIGJhc2Ugc3RyaWRlICVkOiAiCisgICAgICAgICJzdHJpZGUgJWQsIG9mZnNldCAlIiBHX0dTSVpFX0ZPUk1BVCwgaSwgc3RyaWRlLCBpbmZvLT5zdHJpZGVbaV0sCisgICAgICAgIGluZm8tPm9mZnNldFtpXSk7CisgIH0KKworICAvKiBVcGRhdGUgdGhlIGltYWdlIHNpemUgYWNjb3JkaW5nIHRoZSBhbW91bnQgb2YgZGF0YSB3ZSBhcmUgZ29pbmcgdG8KKyAgICogcmVhZC93cml0ZS4gVGhpcyB3b3JrYXJvdW5kIGJ1Z3MgaW4gZHJpdmVyIHdoZXJlIHRoZSBzaXplaW1hZ2UgcHJvdmlkZWQKKyAgICogYnkgVFJZL1NfRk1UIHJlcHJlc2VudCB0aGUgYnVmZmVyIGxlbmd0aCAobWF4aW11bSBzaXplKSByYXRoZXIgdGhlbiB0aGUgZXhwZWN0ZWQKKyAgICogYnl0ZXN1c2VkIChidWZmZXIgc2l6ZSkuICovCisgIGlmIChvZmZzIDwgaW5mby0+c2l6ZSkKKyAgICBpbmZvLT5zaXplID0gb2ZmczsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX29iamVjdF9zYXZlX2Zvcm1hdCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZm10ZGVzYywgc3RydWN0IHY0bDJfZm9ybWF0ICpmb3JtYXQsCisgICAgR3N0VmlkZW9JbmZvICogaW5mbywgR3N0VmlkZW9BbGlnbm1lbnQgKiBhbGlnbikKK3sKKyAgY29uc3QgR3N0VmlkZW9Gb3JtYXRJbmZvICpmaW5mbyA9IGluZm8tPmZpbmZvOworICBnYm9vbGVhbiBzdGFuZGFyZF9zdHJpZGUgPSBUUlVFOworICBnaW50IHN0cmlkZSwgcHN0cmlkZSwgcGFkZGVkX3dpZHRoLCBwYWRkZWRfaGVpZ2h0LCBpOworCisgIGlmIChHU1RfVklERU9fSU5GT19GT1JNQVQgKGluZm8pID09IEdTVF9WSURFT19GT1JNQVRfRU5DT0RFRCkgeworICAgIHY0bDJvYmplY3QtPm5fdjRsMl9wbGFuZXMgPSAxOworICAgIGluZm8tPnNpemUgPSBmb3JtYXQtPmZtdC5waXguc2l6ZWltYWdlOworICAgIGdvdG8gc3RvcmVfaW5mbzsKKyAgfQorCisgIC8qIGFkanVzdCByaWdodCBwYWRkaW5nICovCisgIGlmIChWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIgKHY0bDJvYmplY3QtPnR5cGUpKQorICAgIHN0cmlkZSA9IGZvcm1hdC0+Zm10LnBpeF9tcC5wbGFuZV9mbXRbMF0uYnl0ZXNwZXJsaW5lOworICBlbHNlCisgICAgc3RyaWRlID0gZm9ybWF0LT5mbXQucGl4LmJ5dGVzcGVybGluZTsKKworICBwc3RyaWRlID0gR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1BTVFJJREUgKGZpbmZvLCAwKTsKKyAgaWYgKHBzdHJpZGUpIHsKKyAgICBwYWRkZWRfd2lkdGggPSBzdHJpZGUgLyBwc3RyaWRlOworICB9IGVsc2UgeworICAgIC8qIHBzdHJpZGUgY2FuIGJlIDAgZm9yIGNvbXBsZXggZm9ybWF0cyAqLworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdC0+ZWxlbWVudCwKKyAgICAgICAgImZvcm1hdCAlcyBoYXMgYSBwc3RyaWRlIG9mIDAsIGNhbm5vdCBjb21wdXRlIHBhZGRlZCB3aXRoIiwKKyAgICAgICAgZ3N0X3ZpZGVvX2Zvcm1hdF90b19zdHJpbmcgKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoaW5mbykpKTsKKyAgICBwYWRkZWRfd2lkdGggPSBzdHJpZGU7CisgIH0KKworICBpZiAocGFkZGVkX3dpZHRoIDwgZm9ybWF0LT5mbXQucGl4LndpZHRoKQorICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgIkRyaXZlciBidWcgZGV0ZWN0ZWQsIHN0cmlkZSAoJWQpIGlzIHRvbyBzbWFsbCBmb3IgdGhlIHdpZHRoICglZCkiLAorICAgICAgICBwYWRkZWRfd2lkdGgsIGZvcm1hdC0+Zm10LnBpeC53aWR0aCk7CisKKyAgYWxpZ24tPnBhZGRpbmdfcmlnaHQgPSBwYWRkZWRfd2lkdGggLSBpbmZvLT53aWR0aCAtIGFsaWduLT5wYWRkaW5nX2xlZnQ7CisKKyAgLyogYWRqdXN0IGJvdHRvbSBwYWRkaW5nICovCisgIHBhZGRlZF9oZWlnaHQgPSBmb3JtYXQtPmZtdC5waXguaGVpZ2h0OworCisgIGlmIChHU1RfVklERU9fRk9STUFUX0lORk9fSVNfVElMRUQgKGZpbmZvKSkgeworICAgIGd1aW50IGhzLCB0aWxlX2hlaWdodDsKKworICAgIGhzID0gR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1RJTEVfSFMgKGZpbmZvKTsKKyAgICB0aWxlX2hlaWdodCA9IDEgPDwgaHM7CisKKyAgICBwYWRkZWRfaGVpZ2h0ID0gR1NUX1JPVU5EX1VQX04gKHBhZGRlZF9oZWlnaHQsIHRpbGVfaGVpZ2h0KTsKKyAgfQorCisgIGFsaWduLT5wYWRkaW5nX2JvdHRvbSA9IHBhZGRlZF9oZWlnaHQgLSBpbmZvLT5oZWlnaHQgLSBhbGlnbi0+cGFkZGluZ190b3A7CisKKyAgLyogc2V0dXAgdGhlIHN0cmlkZXMgYW5kIG9mZnNldCAqLworICBpZiAoVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSICh2NGwyb2JqZWN0LT50eXBlKSkgeworICAgIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXhfbXAgPSAmZm9ybWF0LT5mbXQucGl4X21wOworCisgICAgLyogZmlndXJlIG91dCB0aGUgZnJhbWUgbGF5b3V0ICovCisgICAgdjRsMm9iamVjdC0+bl92NGwyX3BsYW5lcyA9IE1BWCAoMSwgcGl4X21wLT5udW1fcGxhbmVzKTsKKyAgICBpbmZvLT5zaXplID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdjRsMm9iamVjdC0+bl92NGwyX3BsYW5lczsgaSsrKSB7CisgICAgICBzdHJpZGUgPSBwaXhfbXAtPnBsYW5lX2ZtdFtpXS5ieXRlc3BlcmxpbmU7CisKKyAgICAgIGlmIChpbmZvLT5zdHJpZGVbaV0gIT0gc3RyaWRlKQorICAgICAgICBzdGFuZGFyZF9zdHJpZGUgPSBGQUxTRTsKKworICAgICAgZ3N0X3Y0bDJfb2JqZWN0X3NldF9zdHJpZGUgKGluZm8sIGFsaWduLCBpLCBzdHJpZGUpOworICAgICAgaW5mby0+b2Zmc2V0W2ldID0gaW5mby0+c2l6ZTsKKyAgICAgIGluZm8tPnNpemUgKz0gcGl4X21wLT5wbGFuZV9mbXRbaV0uc2l6ZWltYWdlOworICAgIH0KKworICAgIC8qIEV4dHJhcG9sYXRlIHN0cmlkZSBpZiBwbGFuYXIgZm9ybWF0IGFyZSBiZWluZyBzZXQgaW4gMSB2NGwyIHBsYW5lICovCisgICAgaWYgKHY0bDJvYmplY3QtPm5fdjRsMl9wbGFuZXMgPCBmaW5mby0+bl9wbGFuZXMpIHsKKyAgICAgIHN0cmlkZSA9IGZvcm1hdC0+Zm10LnBpeF9tcC5wbGFuZV9mbXRbMF0uYnl0ZXNwZXJsaW5lOworICAgICAgZ3N0X3Y0bDJfb2JqZWN0X2V4dHJhcG9sYXRlX2luZm8gKHY0bDJvYmplY3QsIGluZm8sIGFsaWduLCBzdHJpZGUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBvbmx5IG9uZSBwbGFuZSBpbiBub24tTVBMQU5FIG1vZGUgKi8KKyAgICB2NGwyb2JqZWN0LT5uX3Y0bDJfcGxhbmVzID0gMTsKKyAgICBpbmZvLT5zaXplID0gZm9ybWF0LT5mbXQucGl4LnNpemVpbWFnZTsKKyAgICBzdHJpZGUgPSBmb3JtYXQtPmZtdC5waXguYnl0ZXNwZXJsaW5lOworCisgICAgaWYgKGluZm8tPnN0cmlkZVswXSAhPSBzdHJpZGUpCisgICAgICBzdGFuZGFyZF9zdHJpZGUgPSBGQUxTRTsKKworICAgIGdzdF92NGwyX29iamVjdF9leHRyYXBvbGF0ZV9pbmZvICh2NGwyb2JqZWN0LCBpbmZvLCBhbGlnbiwgc3RyaWRlKTsKKyAgfQorCisgIC8qIGFkanVzdCB0aGUgb2Zmc2V0IHRvIHRha2UgaW50byBhY2NvdW50IGxlZnQgYW5kIHRvcCAqLworICBpZiAoR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX0lTX1RJTEVEIChmaW5mbykpIHsKKyAgICBpZiAoKGFsaWduLT5wYWRkaW5nX2xlZnQgKyBhbGlnbi0+cGFkZGluZ190b3ApID4gMCkKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgICAiTGVmdCBhbmQgdG9wIHBhZGRpbmcgaXMgbm90IHBlcm1pdHRlZCBmb3IgdGlsZWQgZm9ybWF0cyIpOworICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCBmaW5mby0+bl9wbGFuZXM7IGkrKykgeworICAgICAgZ2ludCB2ZWRnZSwgaGVkZ2U7CisKKyAgICAgIC8qIEZJWE1FIHdlIGFzc3VtZSBwbGFuZSBhcyBjb21wb25lbnQgYXMgdGhpcyBpcyB0cnVlIGZvciBhbGwgc3VwcG9ydGVkCisgICAgICAgKiBmb3JtYXQgd2Ugc3VwcG9ydC4gKi8KKworICAgICAgaGVkZ2UgPSBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfV0lEVEggKGZpbmZvLCBpLCBhbGlnbi0+cGFkZGluZ19sZWZ0KTsKKyAgICAgIHZlZGdlID0gR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1NDQUxFX0hFSUdIVCAoZmluZm8sIGksIGFsaWduLT5wYWRkaW5nX3RvcCk7CisKKyAgICAgIGluZm8tPm9mZnNldFtpXSArPSAodmVkZ2UgKiBpbmZvLT5zdHJpZGVbaV0pICsKKyAgICAgICAgICAoaGVkZ2UgKiBHU1RfVklERU9fSU5GT19DT01QX1BTVFJJREUgKGluZm8sIGkpKTsKKyAgICB9CisgIH0KKworc3RvcmVfaW5mbzoKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIkdvdCBzaXplaW1hZ2UgJSIgR19HU0laRV9GT1JNQVQsCisgICAgICBpbmZvLT5zaXplKTsKKworICAvKiB0byBhdm9pZCBjb3BpZXMgd2UgbmVlZCB2aWRlbyBtZXRhIGlmIHRoZXJlIGlzIHBhZGRpbmcgKi8KKyAgdjRsMm9iamVjdC0+bmVlZF92aWRlb19tZXRhID0KKyAgICAgICgoYWxpZ24tPnBhZGRpbmdfdG9wICsgYWxpZ24tPnBhZGRpbmdfbGVmdCArIGFsaWduLT5wYWRkaW5nX3JpZ2h0ICsKKyAgICAgICAgICBhbGlnbi0+cGFkZGluZ19ib3R0b20pICE9IDApOworCisgIC8qIC4uLiBvciBpZiBzdHJpZGUgaXMgbm9uICJzdGFuZGFyZCIgKi8KKyAgaWYgKCFzdGFuZGFyZF9zdHJpZGUpCisgICAgdjRsMm9iamVjdC0+bmVlZF92aWRlb19tZXRhID0gVFJVRTsKKworICAvKiAuLi4gb3IgYWxzbyB2aWRlbyBtZXRhIGlmIHdlIHVzZSBtdWx0aXBsZSwgbm9uLWNvbnRpZ3VvdXMsIHBsYW5lcyAqLworICBpZiAodjRsMm9iamVjdC0+bl92NGwyX3BsYW5lcyA+IDEpCisgICAgdjRsMm9iamVjdC0+bmVlZF92aWRlb19tZXRhID0gVFJVRTsKKworICB2NGwyb2JqZWN0LT5pbmZvID0gKmluZm87CisgIHY0bDJvYmplY3QtPmFsaWduID0gKmFsaWduOworICB2NGwyb2JqZWN0LT5mb3JtYXQgPSAqZm9ybWF0OworICB2NGwyb2JqZWN0LT5mbXRkZXNjID0gZm10ZGVzYzsKKworICAvKiBpZiB3ZSBoYXZlIGEgZnJhbWVyYXRlIHByZS1jYWxjdWxhdGUgZHVyYXRpb24gKi8KKyAgaWYgKGluZm8tPmZwc19uID4gMCAmJiBpbmZvLT5mcHNfZCA+IDApIHsKKyAgICB2NGwyb2JqZWN0LT5kdXJhdGlvbiA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKEdTVF9TRUNPTkQsIGluZm8tPmZwc19kLAorICAgICAgICBpbmZvLT5mcHNfbik7CisgIH0gZWxzZSB7CisgICAgdjRsMm9iamVjdC0+ZHVyYXRpb24gPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9Cit9CisKK2dpbnQKK2dzdF92NGwyX29iamVjdF9leHRyYXBvbGF0ZV9zdHJpZGUgKGNvbnN0IEdzdFZpZGVvRm9ybWF0SW5mbyAqIGZpbmZvLAorICAgIGdpbnQgcGxhbmUsIGdpbnQgc3RyaWRlKQoreworICBnaW50IGVzdHJpZGU7CisKKyAgc3dpdGNoIChmaW5mby0+Zm9ybWF0KSB7CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX05WMTI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX05WMTJfNjRaMzI6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX05WMjE6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX05WMTY6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX05WNjE6CisgICAgY2FzZSBHU1RfVklERU9fRk9STUFUX05WMjQ6CisgICAgICBlc3RyaWRlID0gKHBsYW5lID09IDAgPyAxIDogMikgKgorICAgICAgICAgIEdTVF9WSURFT19GT1JNQVRfSU5GT19TQ0FMRV9XSURUSCAoZmluZm8sIHBsYW5lLCBzdHJpZGUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGVzdHJpZGUgPSBHU1RfVklERU9fRk9STUFUX0lORk9fU0NBTEVfV0lEVEggKGZpbmZvLCBwbGFuZSwgc3RyaWRlKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGVzdHJpZGU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfb2JqZWN0X3NldF9mb3JtYXRfZnVsbCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIEdzdENhcHMgKiBjYXBzLAorICAgIGdib29sZWFuIHRyeV9vbmx5LCBHc3RWNGwyRXJyb3IgKiBlcnJvcikKK3sKKyAgZ2ludCBmZCA9IHY0bDJvYmplY3QtPnZpZGVvX2ZkOworICBzdHJ1Y3QgdjRsMl9mb3JtYXQgZm9ybWF0OworICBzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtIHN0cmVhbXBhcm07CisgIGVudW0gdjRsMl9maWVsZCBmaWVsZDsKKyAgZ3VpbnQzMiBwaXhlbGZvcm1hdDsKKyAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZm10ZGVzYzsKKyAgR3N0VmlkZW9JbmZvIGluZm87CisgIEdzdFZpZGVvQWxpZ25tZW50IGFsaWduOworICBnaW50IHdpZHRoLCBoZWlnaHQsIGZwc19uLCBmcHNfZDsKKyAgZ2ludCBuX3Y0bF9wbGFuZXM7CisgIGdpbnQgaSA9IDA7CisgIGdib29sZWFuIGlzX21wbGFuZTsKKyAgZW51bSB2NGwyX2NvbG9yc3BhY2UgY29sb3JzcGFjZSA9IDA7CisgIGVudW0gdjRsMl9xdWFudGl6YXRpb24gcmFuZ2UgPSAwOworICBlbnVtIHY0bDJfeWNiY3JfZW5jb2RpbmcgbWF0cml4ID0gMDsKKyAgZW51bSB2NGwyX3hmZXJfZnVuYyB0cmFuc2ZlciA9IDA7CisgIEdzdFN0cnVjdHVyZSAqczsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoIXY0bDJvYmplY3QtPnNraXBfdHJ5X2ZtdF9wcm9iZXMgfHwKKyAgICAgIGdzdF9jYXBzX2lzX3dyaXRhYmxlIChjYXBzKSwgRkFMU0UpOworCisgIEdTVF9WNEwyX0NIRUNLX09QRU4gKHY0bDJvYmplY3QpOworICBpZiAoIXRyeV9vbmx5KQorICAgIEdTVF9WNEwyX0NIRUNLX05PVF9BQ1RJVkUgKHY0bDJvYmplY3QpOworCisgIGlzX21wbGFuZSA9IFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUiAodjRsMm9iamVjdC0+dHlwZSk7CisKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJmluZm8pOworICBnc3RfdmlkZW9fYWxpZ25tZW50X3Jlc2V0ICgmYWxpZ24pOworCisgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X2dldF9jYXBzX2luZm8gKHY0bDJvYmplY3QsIGNhcHMsICZmbXRkZXNjLCAmaW5mbykpCisgICAgZ290byBpbnZhbGlkX2NhcHM7CisKKyAgcGl4ZWxmb3JtYXQgPSBmbXRkZXNjLT5waXhlbGZvcm1hdDsKKyAgd2lkdGggPSBHU1RfVklERU9fSU5GT19XSURUSCAoJmluZm8pOworICBoZWlnaHQgPSBHU1RfVklERU9fSU5GT19IRUlHSFQgKCZpbmZvKTsKKyAgZnBzX24gPSBHU1RfVklERU9fSU5GT19GUFNfTiAoJmluZm8pOworICBmcHNfZCA9IEdTVF9WSURFT19JTkZPX0ZQU19EICgmaW5mbyk7CisKKyAgLyogaWYgZW5jb2RlZCBmb3JtYXQgKEdTVF9WSURFT19JTkZPX05fUExBTkVTIHJldHVybiAwKQorICAgKiBvciBpZiBjb250aWd1b3VzIGlzIHByZWZlcmVkICovCisgIG5fdjRsX3BsYW5lcyA9IEdTVF9WSURFT19JTkZPX05fUExBTkVTICgmaW5mbyk7CisgIGlmICghbl92NGxfcGxhbmVzIHx8ICF2NGwyb2JqZWN0LT5wcmVmZXJlZF9ub25fY29udGlndW91cykKKyAgICBuX3Y0bF9wbGFuZXMgPSAxOworCisgIGlmIChHU1RfVklERU9fSU5GT19JU19JTlRFUkxBQ0VEICgmaW5mbykpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiaW50ZXJsYWNlZCB2aWRlbyIpOworICAgIC8qIGlkZWFsbHkgd2Ugd291bGQgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHR5cGVzIG9mIGludGVybGFjZWQgdmlkZW8KKyAgICAgKiBidXQgdGhlcmUgaXMgbm90IHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gaW4gdGhlIGNhcHMuLgorICAgICAqLworICAgIGZpZWxkID0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJwcm9ncmVzc2l2ZSB2aWRlbyIpOworICAgIGZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworICB9CisKKyAgaWYgKFY0TDJfVFlQRV9JU19PVVRQVVQgKHY0bDJvYmplY3QtPnR5cGUpKSB7CisgICAgLyogV2UgZmlyc3QgcGljayB0aCBtYWluIGNvbG9yc3BhY2UgZnJvbSB0aGUgcHJpbWFyaWVzICovCisgICAgc3dpdGNoIChpbmZvLmNvbG9yaW1ldHJ5LnByaW1hcmllcykgeworICAgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX0JUNzA5OgorICAgICAgICAvKiBUaGVyZSBpcyB0d28gY29sb3JzcGFjZXMgdXNpbmcgdGhlc2UgcHJpbWFyaWVzLCB1c2UgdGhlIHJhbmdlIHRvCisgICAgICAgICAqIGRpZmZlcmVudGlhdGUgKi8KKyAgICAgICAgaWYgKGluZm8uY29sb3JpbWV0cnkucmFuZ2UgPT0gR1NUX1ZJREVPX0NPTE9SX1JBTkdFXzE2XzIzNSkKKyAgICAgICAgICBjb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1JFQzcwOTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfQlQyMDIwOgorICAgICAgICBjb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0JUMjAyMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfQlQ0NzBNOgorICAgICAgICBjb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fTTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfQlQ0NzBCRzoKKyAgICAgICAgY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX0JHOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19TTVBURTE3ME06CisgICAgICAgIGNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX1BSSU1BUklFU19TTVBURTI0ME06CisgICAgICAgIGNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUyNDBNOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfUFJJTUFSSUVTX0ZJTE06CisgICAgICBjYXNlIEdTVF9WSURFT19DT0xPUl9QUklNQVJJRVNfVU5LTk9XTjoKKyAgICAgICAgLyogV2UgZG9uJ3Qga25vdywgd2Ugd2lsbCBndWVzcyAqLworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgICAgICAgIlVua25vd24gY29sb3JpbWV0cnkgcHJpbWFyaWVzICVkIiwgaW5mby5jb2xvcmltZXRyeS5wcmltYXJpZXMpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGluZm8uY29sb3JpbWV0cnkucmFuZ2UpIHsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX1JBTkdFXzBfMjU1OgorICAgICAgICByYW5nZSA9IFY0TDJfUVVBTlRJWkFUSU9OX0ZVTExfUkFOR0U7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfUkFOR0VfMTZfMjM1OgorICAgICAgICByYW5nZSA9IFY0TDJfUVVBTlRJWkFUSU9OX0xJTV9SQU5HRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19DT0xPUl9SQU5HRV9VTktOT1dOOgorICAgICAgICAvKiBXZSBsZXQgdGhlIGRyaXZlciBwaWNrIGEgZGVmYXVsdCBvbmUgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICAgICAiVW5rbm93biBjb2xvcmltZXRyeSByYW5nZSAlZCIsIGluZm8uY29sb3JpbWV0cnkucmFuZ2UpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGluZm8uY29sb3JpbWV0cnkubWF0cml4KSB7CisgICAgICBjYXNlIEdTVF9WSURFT19DT0xPUl9NQVRSSVhfUkdCOgorICAgICAgICAvKiBVbnNwZWNpZmllZCwgbGVhdmUgdG8gZGVmYXVsdCAqLworICAgICAgICBicmVhazsKKyAgICAgICAgLyogRkNDIGlzIGFib3V0IHRoZSBzYW1lIGFzIEJUNjAxIHdpdGggbGVzcyBkaWdpdCAqLworICAgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfTUFUUklYX0ZDQzoKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9CVDYwMToKKyAgICAgICAgbWF0cml4ID0gVjRMMl9ZQ0JDUl9FTkNfNjAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9CVDcwOToKKyAgICAgICAgbWF0cml4ID0gVjRMMl9ZQ0JDUl9FTkNfNzA5OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR1NUX1ZJREVPX0NPTE9SX01BVFJJWF9TTVBURTI0ME06CisgICAgICAgIG1hdHJpeCA9IFY0TDJfWUNCQ1JfRU5DX1NNUFRFMjQwTTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19DT0xPUl9NQVRSSVhfQlQyMDIwOgorICAgICAgICBtYXRyaXggPSBWNEwyX1lDQkNSX0VOQ19CVDIwMjA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fQ09MT1JfTUFUUklYX1VOS05PV046CisgICAgICAgIC8qIFdlIGxldCB0aGUgZHJpdmVyIHBpY2sgYSBkZWZhdWx0IG9uZSAqLworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgICAgICJVbmtub3duIGNvbG9yaW1ldHJ5IG1hdHJpeCAlZCIsIGluZm8uY29sb3JpbWV0cnkubWF0cml4KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoIChpbmZvLmNvbG9yaW1ldHJ5LnRyYW5zZmVyKSB7CisgICAgICBjYXNlIEdTVF9WSURFT19UUkFOU0ZFUl9HQU1NQTE4OgorICAgICAgY2FzZSBHU1RfVklERU9fVFJBTlNGRVJfR0FNTUEyMDoKKyAgICAgIGNhc2UgR1NUX1ZJREVPX1RSQU5TRkVSX0dBTU1BMjI6CisgICAgICBjYXNlIEdTVF9WSURFT19UUkFOU0ZFUl9HQU1NQTI4OgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICAgICAiR0FNTUEgMTgsIDIwLCAyMiwgMjggdHJhbnNmZXIgZnVuY3Rpb25zIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICAgIGNhc2UgR1NUX1ZJREVPX1RSQU5TRkVSX0dBTU1BMTA6CisgICAgICAgIHRyYW5zZmVyID0gVjRMMl9YRkVSX0ZVTkNfTk9ORTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19UUkFOU0ZFUl9CVDIwMjBfMTI6CisgICAgICBjYXNlIEdTVF9WSURFT19UUkFOU0ZFUl9CVDcwOToKKyAgICAgICAgdHJhbnNmZXIgPSBWNEwyX1hGRVJfRlVOQ183MDk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fVFJBTlNGRVJfU01QVEUyNDBNOgorICAgICAgICB0cmFuc2ZlciA9IFY0TDJfWEZFUl9GVU5DX1NNUFRFMjQwTTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19UUkFOU0ZFUl9TUkdCOgorICAgICAgICB0cmFuc2ZlciA9IFY0TDJfWEZFUl9GVU5DX1NSR0I7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHU1RfVklERU9fVFJBTlNGRVJfTE9HMTAwOgorICAgICAgY2FzZSBHU1RfVklERU9fVFJBTlNGRVJfTE9HMzE2OgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICAgICAiTE9HIDEwMCwgMzE2IHRyYW5zZmVyIGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIC8qIEZJWE1FIE5vIGtub3duIHNlbnNpYmxlIGRlZmF1bHQsIG1heWJlIEFkb2JlUkdCID8gKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdTVF9WSURFT19UUkFOU0ZFUl9VTktOT1dOOgorICAgICAgICAvKiBXZSBsZXQgdGhlIGRyaXZlciBwaWNrIGEgZGVmYXVsdCBvbmUgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICAgICAiVW5rbm93biBjb2xvcmltZXRyeSB0cmFuZmVyICVkIiwgaW5mby5jb2xvcmltZXRyeS50cmFuc2Zlcik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChjb2xvcnNwYWNlID09IDApIHsKKyAgICAgIC8qIFRyeSB0byBndWVzcyBjb2xvcnNwYWNlIGFjY29yZGluZyB0byBwaXhlbGZvcm1hdCBhbmQgc2l6ZSAqLworICAgICAgaWYgKEdTVF9WSURFT19JTkZPX0lTX1lVViAoJmluZm8pKSB7CisgICAgICAgIC8qIFNEIHN0cmVhbXMgbGlrZWx5IHVzZSBTTVBURTE3ME0gYW5kIEhEIHN0cmVhbXMgUkVDNzA5ICovCisgICAgICAgIGlmICh3aWR0aCA8PSA3MjAgJiYgaGVpZ2h0IDw9IDU3NikKKyAgICAgICAgICBjb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfUkVDNzA5OworICAgICAgfSBlbHNlIGlmIChHU1RfVklERU9fSU5GT19JU19SR0IgKCZpbmZvKSkgeworICAgICAgICBjb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0I7CisgICAgICAgIHRyYW5zZmVyID0gVjRMMl9YRkVSX0ZVTkNfTk9ORTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiRGVzaXJlZCBmb3JtYXQgJWR4JWQsIGZvcm1hdCAiCisgICAgICAiJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiBzdHJpZGU6ICVkIiwgd2lkdGgsIGhlaWdodCwKKyAgICAgIEdTVF9GT1VSQ0NfQVJHUyAocGl4ZWxmb3JtYXQpLCBHU1RfVklERU9fSU5GT19QTEFORV9TVFJJREUgKCZpbmZvLCAwKSk7CisKKyAgbWVtc2V0ICgmZm9ybWF0LCAweDAwLCBzaXplb2YgKHN0cnVjdCB2NGwyX2Zvcm1hdCkpOworICBmb3JtYXQudHlwZSA9IHY0bDJvYmplY3QtPnR5cGU7CisKKyAgaWYgKGlzX21wbGFuZSkgeworICAgIGZvcm1hdC50eXBlID0gdjRsMm9iamVjdC0+dHlwZTsKKyAgICBmb3JtYXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IHBpeGVsZm9ybWF0OworICAgIGZvcm1hdC5mbXQucGl4X21wLndpZHRoID0gd2lkdGg7CisgICAgZm9ybWF0LmZtdC5waXhfbXAuaGVpZ2h0ID0gaGVpZ2h0OworICAgIGZvcm1hdC5mbXQucGl4X21wLmZpZWxkID0gZmllbGQ7CisgICAgZm9ybWF0LmZtdC5waXhfbXAubnVtX3BsYW5lcyA9IG5fdjRsX3BsYW5lczsKKworICAgIC8qIHRyeSB0byBhc2sgb3VyIHByZWZlcmVkIHN0cmlkZSBidXQgaXQncyBub3QgYSBmYWlsdXJlIGlmIG5vdAorICAgICAqIGFjY2VwdGVkICovCisgICAgZm9yIChpID0gMDsgaSA8IG5fdjRsX3BsYW5lczsgaSsrKSB7CisgICAgICBnaW50IHN0cmlkZSA9IEdTVF9WSURFT19JTkZPX1BMQU5FX1NUUklERSAoJmluZm8sIGkpOworCisgICAgICBpZiAoR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX0lTX1RJTEVEIChpbmZvLmZpbmZvKSkKKyAgICAgICAgc3RyaWRlID0gR1NUX1ZJREVPX1RJTEVfWF9USUxFUyAoc3RyaWRlKSA8PAorICAgICAgICAgICAgR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1RJTEVfV1MgKGluZm8uZmluZm8pOworCisgICAgICBmb3JtYXQuZm10LnBpeF9tcC5wbGFuZV9mbXRbaV0uYnl0ZXNwZXJsaW5lID0gc3RyaWRlOworICAgIH0KKworICAgIGlmIChHU1RfVklERU9fSU5GT19GT1JNQVQgKCZpbmZvKSA9PSBHU1RfVklERU9fRk9STUFUX0VOQ09ERUQpCisgICAgICBmb3JtYXQuZm10LnBpeF9tcC5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlID0gRU5DT0RFRF9CVUZGRVJfU0laRTsKKyAgfSBlbHNlIHsKKyAgICBnaW50IHN0cmlkZSA9IEdTVF9WSURFT19JTkZPX1BMQU5FX1NUUklERSAoJmluZm8sIDApOworCisgICAgZm9ybWF0LnR5cGUgPSB2NGwyb2JqZWN0LT50eXBlOworCisgICAgZm9ybWF0LmZtdC5waXgud2lkdGggPSB3aWR0aDsKKyAgICBmb3JtYXQuZm10LnBpeC5oZWlnaHQgPSBoZWlnaHQ7CisgICAgZm9ybWF0LmZtdC5waXgucGl4ZWxmb3JtYXQgPSBwaXhlbGZvcm1hdDsKKyAgICBmb3JtYXQuZm10LnBpeC5maWVsZCA9IGZpZWxkOworCisgICAgaWYgKEdTVF9WSURFT19GT1JNQVRfSU5GT19JU19USUxFRCAoaW5mby5maW5mbykpCisgICAgICBzdHJpZGUgPSBHU1RfVklERU9fVElMRV9YX1RJTEVTIChzdHJpZGUpIDw8CisgICAgICAgICAgR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1RJTEVfV1MgKGluZm8uZmluZm8pOworCisgICAgLyogdHJ5IHRvIGFzayBvdXIgcHJlZmVyZWQgc3RyaWRlICovCisgICAgZm9ybWF0LmZtdC5waXguYnl0ZXNwZXJsaW5lID0gc3RyaWRlOworCisgICAgaWYgKEdTVF9WSURFT19JTkZPX0ZPUk1BVCAoJmluZm8pID09IEdTVF9WSURFT19GT1JNQVRfRU5DT0RFRCkKKyAgICAgIGZvcm1hdC5mbXQucGl4LnNpemVpbWFnZSA9IEVOQ09ERURfQlVGRkVSX1NJWkU7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiRGVzaXJlZCBmb3JtYXQgaXMgJWR4JWQsIGZvcm1hdCAiCisgICAgICAiJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiwgbmIgcGxhbmVzICVkIiwgZm9ybWF0LmZtdC5waXgud2lkdGgsCisgICAgICBmb3JtYXQuZm10LnBpeF9tcC5oZWlnaHQsCisgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvcm1hdC5mbXQucGl4LnBpeGVsZm9ybWF0KSwKKyAgICAgIGlzX21wbGFuZSA/IGZvcm1hdC5mbXQucGl4X21wLm51bV9wbGFuZXMgOiAxKTsKKworI2lmbmRlZiBHU1RfRElTQUJMRV9HU1RfREVCVUcKKyAgaWYgKGlzX21wbGFuZSkgeworICAgIGZvciAoaSA9IDA7IGkgPCBmb3JtYXQuZm10LnBpeF9tcC5udW1fcGxhbmVzOyBpKyspCisgICAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiICBzdHJpZGUgJWQiLAorICAgICAgICAgIGZvcm1hdC5mbXQucGl4X21wLnBsYW5lX2ZtdFtpXS5ieXRlc3BlcmxpbmUpOworICB9IGVsc2UgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICIgIHN0cmlkZSAlZCIsCisgICAgICAgIGZvcm1hdC5mbXQucGl4LmJ5dGVzcGVybGluZSk7CisgIH0KKyNlbmRpZgorCisgIGlmIChWNEwyX1RZUEVfSVNfT1VUUFVUICh2NGwyb2JqZWN0LT50eXBlKSkgeworICAgIGlmIChpc19tcGxhbmUpIHsKKyAgICAgIGZvcm1hdC5mbXQucGl4X21wLmNvbG9yc3BhY2UgPSBjb2xvcnNwYWNlOworICAgICAgZm9ybWF0LmZtdC5waXhfbXAucXVhbnRpemF0aW9uID0gcmFuZ2U7CisgICAgICBmb3JtYXQuZm10LnBpeF9tcC55Y2Jjcl9lbmMgPSBtYXRyaXg7CisgICAgICBmb3JtYXQuZm10LnBpeF9tcC54ZmVyX2Z1bmMgPSB0cmFuc2ZlcjsKKyAgICB9IGVsc2UgeworICAgICAgZm9ybWF0LmZtdC5waXguY29sb3JzcGFjZSA9IGNvbG9yc3BhY2U7CisgICAgICBmb3JtYXQuZm10LnBpeC5xdWFudGl6YXRpb24gPSByYW5nZTsKKyAgICAgIGZvcm1hdC5mbXQucGl4LnljYmNyX2VuYyA9IG1hdHJpeDsKKyAgICAgIGZvcm1hdC5mbXQucGl4LnhmZXJfZnVuYyA9IHRyYW5zZmVyOworICAgIH0KKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJEZXNpcmVkIGNvbG9yc3BhY2UgaXMgJWQ6JWQ6JWQ6JWQiLAorICAgICAgICBjb2xvcnNwYWNlLCByYW5nZSwgbWF0cml4LCB0cmFuc2Zlcik7CisgIH0KKworICBpZiAodHJ5X29ubHkpIHsKKyAgICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKGZkLCBWSURJT0NfVFJZX0ZNVCwgJmZvcm1hdCkgPCAwKQorICAgICAgZ290byB0cnlfZm10X2ZhaWxlZDsKKyAgfSBlbHNlIHsKKyAgICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKGZkLCBWSURJT0NfU19GTVQsICZmb3JtYXQpIDwgMCkKKyAgICAgIGdvdG8gc2V0X2ZtdF9mYWlsZWQ7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiR290IGZvcm1hdCBvZiAlZHglZCwgZm9ybWF0ICIKKyAgICAgICIlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiLCBuYiBwbGFuZXMgJWQsIGNvbG9yc3BhY2UgJWQiLAorICAgICAgZm9ybWF0LmZtdC5waXgud2lkdGgsIGZvcm1hdC5mbXQucGl4X21wLmhlaWdodCwKKyAgICAgIEdTVF9GT1VSQ0NfQVJHUyAoZm9ybWF0LmZtdC5waXgucGl4ZWxmb3JtYXQpLAorICAgICAgaXNfbXBsYW5lID8gZm9ybWF0LmZtdC5waXhfbXAubnVtX3BsYW5lcyA6IDEsCisgICAgICBpc19tcGxhbmUgPyBmb3JtYXQuZm10LnBpeF9tcC5jb2xvcnNwYWNlIDogZm9ybWF0LmZtdC5waXguY29sb3JzcGFjZSk7CisKKyNpZm5kZWYgR1NUX0RJU0FCTEVfR1NUX0RFQlVHCisgIGlmIChpc19tcGxhbmUpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZm9ybWF0LmZtdC5waXhfbXAubnVtX3BsYW5lczsgaSsrKQorICAgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIiAgc3RyaWRlICVkLCBzaXplaW1hZ2UgJWQiLAorICAgICAgICAgIGZvcm1hdC5mbXQucGl4X21wLnBsYW5lX2ZtdFtpXS5ieXRlc3BlcmxpbmUsCisgICAgICAgICAgZm9ybWF0LmZtdC5waXhfbXAucGxhbmVfZm10W2ldLnNpemVpbWFnZSk7CisgIH0gZWxzZSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIiAgc3RyaWRlICVkLCBzaXplaW1hZ2UgJWQiLAorICAgICAgICBmb3JtYXQuZm10LnBpeC5ieXRlc3BlcmxpbmUsIGZvcm1hdC5mbXQucGl4LnNpemVpbWFnZSk7CisgIH0KKyNlbmRpZgorCisgIGlmIChmb3JtYXQuZm10LnBpeC5waXhlbGZvcm1hdCAhPSBwaXhlbGZvcm1hdCkKKyAgICBnb3RvIGludmFsaWRfcGl4ZWxmb3JtYXQ7CisKKyAgLyogT25seSBuZWdvdGlhdGUgc2l6ZSB3aXRoIHJhdyBkYXRhLgorICAgKiBGb3Igc29tZSBjb2RlY3MgdGhlIGRpbWVuc2lvbnMgYXJlICpub3QqIGluIHRoZSBiaXRzdHJlYW0sIElJUkMgVkMxCisgICAqIGluIEFTRiBtb2RlIGZvciBleGFtcGxlLCB0aGVyZSBpcyBhbHNvIG5vdCByZWFzb24gZm9yIGEgZHJpdmVyIHRvCisgICAqIGNoYW5nZSB0aGUgc2l6ZS4gKi8KKyAgaWYgKGluZm8uZmluZm8tPmZvcm1hdCAhPSBHU1RfVklERU9fRk9STUFUX0VOQ09ERUQpIHsKKyAgICAvKiBXZSBjYW4gY3JvcCBsYXJnZXIgaW1hZ2VzICovCisgICAgaWYgKGZvcm1hdC5mbXQucGl4LndpZHRoIDwgd2lkdGggfHwgZm9ybWF0LmZtdC5waXguaGVpZ2h0IDwgaGVpZ2h0KQorICAgICAgZ290byBpbnZhbGlkX2RpbWVuc2lvbnM7CisKKyAgICAvKiBOb3RlLCB0aGlzIHdpbGwgYmUgYWRqdXN0ZWQgaWYgdXBzdHJlYW0gaGFzIG5vbi1jZW50ZXJlZCBjcm9wcGluZy4gKi8KKyAgICBhbGlnbi5wYWRkaW5nX3RvcCA9IDA7CisgICAgYWxpZ24ucGFkZGluZ19ib3R0b20gPSBmb3JtYXQuZm10LnBpeC5oZWlnaHQgLSBoZWlnaHQ7CisgICAgYWxpZ24ucGFkZGluZ19sZWZ0ID0gMDsKKyAgICBhbGlnbi5wYWRkaW5nX3JpZ2h0ID0gZm9ybWF0LmZtdC5waXgud2lkdGggLSB3aWR0aDsKKyAgfQorCisgIGlmIChpc19tcGxhbmUgJiYgZm9ybWF0LmZtdC5waXhfbXAubnVtX3BsYW5lcyAhPSBuX3Y0bF9wbGFuZXMpCisgICAgZ290byBpbnZhbGlkX3BsYW5lczsKKworICBpZiAoKGlzX21wbGFuZSAmJiBmb3JtYXQuZm10LnBpeF9tcC5maWVsZCAhPSBmaWVsZCkKKyAgICAgIHx8IGZvcm1hdC5mbXQucGl4LmZpZWxkICE9IGZpZWxkKQorICAgIGdvdG8gaW52YWxpZF9maWVsZDsKKworICBnc3RfdjRsMl9vYmplY3RfZ2V0X2NvbG9yc3BhY2UgKCZmb3JtYXQsICZpbmZvLmNvbG9yaW1ldHJ5KTsKKworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgImNvbG9yaW1ldHJ5IikpIHsKKyAgICBHc3RWaWRlb0NvbG9yaW1ldHJ5IGNpOworICAgIGlmICghZ3N0X3ZpZGVvX2NvbG9yaW1ldHJ5X2Zyb21fc3RyaW5nICgmY2ksCisgICAgICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJjb2xvcmltZXRyeSIpKQorICAgICAgICB8fCAhZ3N0X3ZpZGVvX2NvbG9yaW1ldHJ5X2lzX2VxdWFsICgmY2ksICZpbmZvLmNvbG9yaW1ldHJ5KSkKKyAgICAgIGdvdG8gaW52YWxpZF9jb2xvcmltZXRyeTsKKyAgfQorCisgIC8qIEluIGNhc2Ugd2UgaGF2ZSBza2lwcGVkIHRoZSB0cnlfZm10IHByb2Jlcywgd2UnbGwgbmVlZCB0byBzZXQgdGhlCisgICAqIGNvbG9yaW1ldHJ5IGFuZCBpbnRlcmxhY2UtbW9kZSBiYWNrIGludG8gdGhlIGNhcHMuICovCisgIGlmICh2NGwyb2JqZWN0LT5za2lwX3RyeV9mbXRfcHJvYmVzKSB7CisgICAgaWYgKCFnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgImNvbG9yaW1ldHJ5IikpIHsKKyAgICAgIGdjaGFyICpzdHIgPSBnc3RfdmlkZW9fY29sb3JpbWV0cnlfdG9fc3RyaW5nICgmaW5mby5jb2xvcmltZXRyeSk7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgImNvbG9yaW1ldHJ5IiwgR19UWVBFX1NUUklORywgc3RyLCBOVUxMKTsKKyAgICAgIGdfZnJlZSAoc3RyKTsKKyAgICB9CisKKyAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAiaW50ZXJsYWNlLW1vZGUiKSkKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAiaW50ZXJsYWNlLW1vZGUiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgICAgIGdzdF92aWRlb19pbnRlcmxhY2VfbW9kZV90b19zdHJpbmcgKGluZm8uaW50ZXJsYWNlX21vZGUpLCBOVUxMKTsKKyAgfQorCisgIGlmICh0cnlfb25seSkgICAgICAgICAgICAgICAgIC8qIGdvb2QgZW5vdWdoIGZvciB0cnlpbmcgb25seSAqLworICAgIHJldHVybiBUUlVFOworCisgIGlmIChHU1RfVklERU9fSU5GT19IQVNfQUxQSEEgKCZpbmZvKSkgeworICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY3RsID0geyAwLCB9OworICAgIGN0bC5pZCA9IFY0TDJfQ0lEX0FMUEhBX0NPTVBPTkVOVDsKKyAgICBjdGwudmFsdWUgPSAweGZmOworCisgICAgaWYgKHY0bDJvYmplY3QtPmlvY3RsIChmZCwgVklESU9DX1NfQ1RSTCwgJmN0bCkgPCAwKQorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgICAgICJGYWlsZWQgdG8gc2V0IGFscGhhIGNvbXBvbmVudCB2YWx1ZSIpOworICB9CisKKyAgLyogSXMgdGhlcmUgYSByZWFzb24gd2UgcmVxdWlyZSB0aGUgY2FsbGVyIHRvIGFsd2F5cyBzcGVjaWZ5IGEgZnJhbWVyYXRlPyAqLworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiRGVzaXJlZCBmcmFtZXJhdGU6ICV1LyV1IiwgZnBzX24sCisgICAgICBmcHNfZCk7CisKKyAgbWVtc2V0ICgmc3RyZWFtcGFybSwgMHgwMCwgc2l6ZW9mIChzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtKSk7CisgIHN0cmVhbXBhcm0udHlwZSA9IHY0bDJvYmplY3QtPnR5cGU7CisKKyAgaWYgKHY0bDJvYmplY3QtPmlvY3RsIChmZCwgVklESU9DX0dfUEFSTSwgJnN0cmVhbXBhcm0pIDwgMCkKKyAgICBnb3RvIGdldF9wYXJtX2ZhaWxlZDsKKworICBpZiAodjRsMm9iamVjdC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUKKyAgICAgIHx8IHY0bDJvYmplY3QtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgeworICAgIEdTVF9WSURFT19JTkZPX0ZQU19OICgmaW5mbykgPQorICAgICAgICBzdHJlYW1wYXJtLnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3I7CisgICAgR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZpbmZvKSA9CisgICAgICAgIHN0cmVhbXBhcm0ucGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5udW1lcmF0b3I7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiR290IGNhcHR1cmUgZnJhbWVyYXRlOiAldS8ldSIsCisgICAgICAgIHN0cmVhbXBhcm0ucGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciwKKyAgICAgICAgc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLm51bWVyYXRvcik7CisKKyAgICAvKiBXZSB1c2VkIHRvIHNraXAgZnJhbWUgcmF0ZSBzZXR1cCBpZiB0aGUgY2FtZXJhIHdhcyBhbHJlYWR5IHNldHVwCisgICAgICogd2l0aCB0aGUgcmVxdWVzdGVkIGZyYW1lIHJhdGUuIFRoaXMgYnJlYWtzIHNvbWUgY2FtZXJhcyB0aG91Z2gsCisgICAgICogY2F1c2luZyB0aGVtIHRvIG5vdCBvdXRwdXQgZGF0YSAoc2V2ZXJhbCBtb2RlbHMgb2YgVGhpbmtwYWQgY2FtZXJhcworICAgICAqIGhhdmUgdGhpcyBwcm9ibGVtIGF0IGxlYXN0KS4KKyAgICAgKiBTbywgZG9uJ3Qgc2tpcC4gKi8KKyAgICBHU1RfTE9HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIlNldHRpbmcgY2FwdHVyZSBmcmFtZXJhdGUgdG8gJXUvJXUiLAorICAgICAgICBmcHNfbiwgZnBzX2QpOworICAgIC8qIFdlIHdhbnQgdG8gY2hhbmdlIHRoZSBmcmFtZSByYXRlLCBzbyBjaGVjayB3aGV0aGVyIHdlIGNhbi4gU29tZSBjaGVhcCBVU0IKKyAgICAgKiBjYW1lcmFzIGRvbid0IGhhdmUgdGhlIGNhcGFiaWxpdHkgKi8KKyAgICBpZiAoKHN0cmVhbXBhcm0ucGFybS5jYXB0dXJlLmNhcGFiaWxpdHkgJiBWNEwyX0NBUF9USU1FUEVSRlJBTUUpID09IDApIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICAgIk5vdCBzZXR0aW5nIGNhcHR1cmUgZnJhbWVyYXRlIChub3Qgc3VwcG9ydGVkKSIpOworICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIC8qIE5vdGU6IFY0TDIgd2FudHMgdGhlIGZyYW1lIGludGVydmFsLCB3ZSBoYXZlIHRoZSBmcmFtZSByYXRlICovCisgICAgc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLm51bWVyYXRvciA9IGZwc19kOworICAgIHN0cmVhbXBhcm0ucGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA9IGZwc19uOworCisgICAgLyogc29tZSBjaGVhcCBVU0IgY2FtJ3Mgd29uJ3QgYWNjZXB0IGFueSBjaGFuZ2UgKi8KKyAgICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKGZkLCBWSURJT0NfU19QQVJNLCAmc3RyZWFtcGFybSkgPCAwKQorICAgICAgZ290byBzZXRfcGFybV9mYWlsZWQ7CisKKyAgICBpZiAoc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLm51bWVyYXRvciA+IDAgJiYKKyAgICAgICAgc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yID4gMCkgeworICAgICAgLyogZ2V0IG5ldyB2YWx1ZXMgKi8KKyAgICAgIGZwc19kID0gc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLm51bWVyYXRvcjsKKyAgICAgIGZwc19uID0gc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yOworCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJTZXQgY2FwdHVyZSBmcmFtZXJhdGUgdG8gJXUvJXUiLAorICAgICAgICAgIGZwc19uLCBmcHNfZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGZpeCB2NGwyIGNhcHR1cmUgZHJpdmVyIHRvIHByb3ZpZGUgZnJhbWVyYXRlIHZhbHVlcyAqLworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgICAgICJSZXVzZSBjYXBzIGZyYW1lcmF0ZSAldS8ldSAtIGZpeCB2NGwyIGNhcHR1cmUgZHJpdmVyIiwgZnBzX24sIGZwc19kKTsKKyAgICB9CisKKyAgICBHU1RfVklERU9fSU5GT19GUFNfTiAoJmluZm8pID0gZnBzX247CisgICAgR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZpbmZvKSA9IGZwc19kOworICB9IGVsc2UgaWYgKHY0bDJvYmplY3QtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQKKyAgICAgIHx8IHY0bDJvYmplY3QtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CisgICAgR1NUX1ZJREVPX0lORk9fRlBTX04gKCZpbmZvKSA9CisgICAgICAgIHN0cmVhbXBhcm0ucGFybS5vdXRwdXQudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yOworICAgIEdTVF9WSURFT19JTkZPX0ZQU19EICgmaW5mbykgPQorICAgICAgICBzdHJlYW1wYXJtLnBhcm0ub3V0cHV0LnRpbWVwZXJmcmFtZS5udW1lcmF0b3I7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiR290IG91dHB1dCBmcmFtZXJhdGU6ICV1LyV1IiwKKyAgICAgICAgc3RyZWFtcGFybS5wYXJtLm91dHB1dC50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IsCisgICAgICAgIHN0cmVhbXBhcm0ucGFybS5vdXRwdXQudGltZXBlcmZyYW1lLm51bWVyYXRvcik7CisKKyAgICBHU1RfTE9HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIlNldHRpbmcgb3V0cHV0IGZyYW1lcmF0ZSB0byAldS8ldSIsCisgICAgICAgIGZwc19uLCBmcHNfZCk7CisgICAgaWYgKChzdHJlYW1wYXJtLnBhcm0ub3V0cHV0LmNhcGFiaWxpdHkgJiBWNEwyX0NBUF9USU1FUEVSRlJBTUUpID09IDApIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAgICAgIk5vdCBzZXR0aW5nIG91dHB1dCBmcmFtZXJhdGUgKG5vdCBzdXBwb3J0ZWQpIik7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgLyogTm90ZTogVjRMMiB3YW50cyB0aGUgZnJhbWUgaW50ZXJ2YWwsIHdlIGhhdmUgdGhlIGZyYW1lIHJhdGUgKi8KKyAgICBzdHJlYW1wYXJtLnBhcm0ub3V0cHV0LnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPSBmcHNfZDsKKyAgICBzdHJlYW1wYXJtLnBhcm0ub3V0cHV0LnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA9IGZwc19uOworCisgICAgaWYgKHY0bDJvYmplY3QtPmlvY3RsIChmZCwgVklESU9DX1NfUEFSTSwgJnN0cmVhbXBhcm0pIDwgMCkKKyAgICAgIGdvdG8gc2V0X3Bhcm1fZmFpbGVkOworCisgICAgaWYgKHN0cmVhbXBhcm0ucGFybS5vdXRwdXQudGltZXBlcmZyYW1lLm51bWVyYXRvciA+IDAgJiYKKyAgICAgICAgc3RyZWFtcGFybS5wYXJtLm91dHB1dC50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgPiAwKSB7CisgICAgICAvKiBnZXQgbmV3IHZhbHVlcyAqLworICAgICAgZnBzX2QgPSBzdHJlYW1wYXJtLnBhcm0ub3V0cHV0LnRpbWVwZXJmcmFtZS5udW1lcmF0b3I7CisgICAgICBmcHNfbiA9IHN0cmVhbXBhcm0ucGFybS5vdXRwdXQudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yOworCisgICAgICBHU1RfSU5GT19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJTZXQgb3V0cHV0IGZyYW1lcmF0ZSB0byAldS8ldSIsCisgICAgICAgICAgZnBzX24sIGZwc19kKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogZml4IHY0bDIgb3V0cHV0IGRyaXZlciB0byBwcm92aWRlIGZyYW1lcmF0ZSB2YWx1ZXMgKi8KKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwKKyAgICAgICAgICAiUmV1c2UgY2FwcyBmcmFtZXJhdGUgJXUvJXUgLSBmaXggdjRsMiBvdXRwdXQgZHJpdmVyIiwgZnBzX24sIGZwc19kKTsKKyAgICB9CisKKyAgICBHU1RfVklERU9fSU5GT19GUFNfTiAoJmluZm8pID0gZnBzX247CisgICAgR1NUX1ZJREVPX0lORk9fRlBTX0QgKCZpbmZvKSA9IGZwc19kOworICB9CisKK2RvbmU6CisgIC8qIGFkZCBib29sZWFuIHJldHVybiwgc28gd2UgY2FuIGZhaWwgb24gZHJpdmVycyBidWdzICovCisgIGdzdF92NGwyX29iamVjdF9zYXZlX2Zvcm1hdCAodjRsMm9iamVjdCwgZm10ZGVzYywgJmZvcm1hdCwgJmluZm8sICZhbGlnbik7CisKKyAgLyogbm93IGNvbmZpZ3VyZSB0aGUgcG9vbCAqLworICBpZiAoIWdzdF92NGwyX29iamVjdF9zZXR1cF9wb29sICh2NGwyb2JqZWN0LCBjYXBzKSkKKyAgICBnb3RvIHBvb2xfZmFpbGVkOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworaW52YWxpZF9jYXBzOgorICB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgImNhbid0IHBhcnNlIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgIGNhcHMpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQordHJ5X2ZtdF9mYWlsZWQ6CisgIHsKKyAgICBpZiAoZXJybm8gPT0gRUlOVkFMKSB7CisgICAgICBHU1RfVjRMMl9FUlJPUiAoZXJyb3IsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgICAoXygiRGV2aWNlICclcycgaGFzIG5vIHN1cHBvcnRlZCBmb3JtYXQiKSwgdjRsMm9iamVjdC0+dmlkZW9kZXYpLAorICAgICAgICAgICgiQ2FsbCB0byBUUllfRk1UIGZhaWxlZCBmb3IgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiBAICVkeCVkOiAlcyIsCisgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAocGl4ZWxmb3JtYXQpLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICBnX3N0cmVycm9yIChlcnJubykpKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX1Y0TDJfRVJST1IgKGVycm9yLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAgIChfKCJEZXZpY2UgJyVzJyBmYWlsZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIiksCisgICAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwKKyAgICAgICAgICAoIkNhbGwgdG8gVFJZX0ZNVCBmYWlsZWQgZm9yICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgQCAlZHglZDogJXMiLAorICAgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHBpeGVsZm9ybWF0KSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgZ19zdHJlcnJvciAoZXJybm8pKSk7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKKyAgfQorc2V0X2ZtdF9mYWlsZWQ6CisgIHsKKyAgICBpZiAoZXJybm8gPT0gRUJVU1kpIHsKKyAgICAgIEdTVF9WNEwyX0VSUk9SIChlcnJvciwgUkVTT1VSQ0UsIEJVU1ksCisgICAgICAgICAgKF8oIkRldmljZSAnJXMnIGlzIGJ1c3kiKSwgdjRsMm9iamVjdC0+dmlkZW9kZXYpLAorICAgICAgICAgICgiQ2FsbCB0byBTX0ZNVCBmYWlsZWQgZm9yICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgQCAlZHglZDogJXMiLAorICAgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKHBpeGVsZm9ybWF0KSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgZ19zdHJlcnJvciAoZXJybm8pKSk7CisgICAgfSBlbHNlIGlmIChlcnJubyA9PSBFSU5WQUwpIHsKKyAgICAgIEdTVF9WNEwyX0VSUk9SIChlcnJvciwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAgIChfKCJEZXZpY2UgJyVzJyBoYXMgbm8gc3VwcG9ydGVkIGZvcm1hdCIpLCB2NGwyb2JqZWN0LT52aWRlb2RldiksCisgICAgICAgICAgKCJDYWxsIHRvIFNfRk1UIGZhaWxlZCBmb3IgJSIgR1NUX0ZPVVJDQ19GT1JNQVQgIiBAICVkeCVkOiAlcyIsCisgICAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAocGl4ZWxmb3JtYXQpLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICBnX3N0cmVycm9yIChlcnJubykpKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX1Y0TDJfRVJST1IgKGVycm9yLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAgIChfKCJEZXZpY2UgJyVzJyBmYWlsZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIiksCisgICAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwKKyAgICAgICAgICAoIkNhbGwgdG8gU19GTVQgZmFpbGVkIGZvciAlIiBHU1RfRk9VUkNDX0ZPUk1BVCAiIEAgJWR4JWQ6ICVzIiwKKyAgICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChwaXhlbGZvcm1hdCksIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgIGdfc3RyZXJyb3IgKGVycm5vKSkpOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfZGltZW5zaW9uczoKKyAgeworICAgIEdTVF9WNEwyX0VSUk9SIChlcnJvciwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgYXQgJWR4JWQiKSwKKyAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2LCB3aWR0aCwgaGVpZ2h0KSwKKyAgICAgICAgKCJUcmllZCB0byBjYXB0dXJlIGF0ICVkeCVkLCBidXQgZGV2aWNlIHJldHVybmVkIHNpemUgJWR4JWQiLAorICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LmZtdC5waXgud2lkdGgsIGZvcm1hdC5mbXQucGl4LmhlaWdodCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQoraW52YWxpZF9waXhlbGZvcm1hdDoKKyAgeworICAgIEdTVF9WNEwyX0VSUk9SIChlcnJvciwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiRGV2aWNlICclcycgY2Fubm90IGNhcHR1cmUgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQiKSwKKyAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwKKyAgICAgICAgKCJUcmllZCB0byBjYXB0dXJlIGluICUiIEdTVF9GT1VSQ0NfRk9STUFUCisgICAgICAgICAgICAiLCBidXQgZGV2aWNlIHJldHVybmVkIGZvcm1hdCIgIiAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICAgIEdTVF9GT1VSQ0NfQVJHUyAocGl4ZWxmb3JtYXQpLAorICAgICAgICAgICAgR1NUX0ZPVVJDQ19BUkdTIChmb3JtYXQuZm10LnBpeC5waXhlbGZvcm1hdCkpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfcGxhbmVzOgorICB7CisgICAgR1NUX1Y0TDJfRVJST1IgKGVycm9yLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJEZXZpY2UgJyVzJyBkb2VzIHN1cHBvcnQgbm9uLWNvbnRpZ3VvdXMgcGxhbmVzIiksCisgICAgICAgICAgICB2NGwyb2JqZWN0LT52aWRlb2RldiksCisgICAgICAgICgiRGV2aWNlIHdhbnRzICVkIHBsYW5lcyIsIGZvcm1hdC5mbXQucGl4X21wLm51bV9wbGFuZXMpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfZmllbGQ6CisgIHsKKyAgICBlbnVtIHY0bDJfZmllbGQgd2FudGVkX2ZpZWxkOworCisgICAgaWYgKGlzX21wbGFuZSkKKyAgICAgIHdhbnRlZF9maWVsZCA9IGZvcm1hdC5mbXQucGl4X21wLmZpZWxkOworICAgIGVsc2UKKyAgICAgIHdhbnRlZF9maWVsZCA9IGZvcm1hdC5mbXQucGl4LmZpZWxkOworCisgICAgR1NUX1Y0TDJfRVJST1IgKGVycm9yLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0ICVzIGludGVybGFjaW5nIiksCisgICAgICAgICAgICB2NGwyb2JqZWN0LT52aWRlb2RldiwKKyAgICAgICAgICAgIGZpZWxkID09IFY0TDJfRklFTERfTk9ORSA/ICJwcm9ncmVzc2l2ZSIgOiAiaW50ZXJsZWF2ZWQiKSwKKyAgICAgICAgKCJEZXZpY2Ugd2FudHMgJXMgaW50ZXJsYWNpbmciLAorICAgICAgICAgICAgd2FudGVkX2ZpZWxkID09IFY0TDJfRklFTERfTk9ORSA/ICJwcm9ncmVzc2l2ZSIgOiAiaW50ZXJsZWF2ZWQiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbnZhbGlkX2NvbG9yaW1ldHJ5OgorICB7CisgICAgZ2NoYXIgKndhbnRlZF9jb2xvcmltZXRyeTsKKworICAgIHdhbnRlZF9jb2xvcmltZXRyeSA9IGdzdF92aWRlb19jb2xvcmltZXRyeV90b19zdHJpbmcgKCZpbmZvLmNvbG9yaW1ldHJ5KTsKKworICAgIEdTVF9WNEwyX0VSUk9SIChlcnJvciwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiRGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCAlcyBjb2xvcmltZXRyeSIpLAorICAgICAgICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYsIGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAocywgImNvbG9yaW1ldHJ5IikpLAorICAgICAgICAoIkRldmljZSB3YW50cyAlcyBjb2xvcmltZXRyeSIsIHdhbnRlZF9jb2xvcmltZXRyeSkpOworCisgICAgZ19mcmVlICh3YW50ZWRfY29sb3JpbWV0cnkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorZ2V0X3Bhcm1fZmFpbGVkOgorICB7CisgICAgLyogaXQncyBwb3NzaWJsZSB0aGF0IHRoaXMgY2FsbCBpcyBub3Qgc3VwcG9ydGVkICovCisgICAgaWYgKGVycm5vICE9IEVJTlZBTCAmJiBlcnJubyAhPSBFTk9UVFkpIHsKKyAgICAgIEdTVF9WNEwyX0VSUk9SIChlcnJvciwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAgIChfKCJDb3VsZCBub3QgZ2V0IHBhcmFtZXRlcnMgb24gZGV2aWNlICclcyciKSwKKyAgICAgICAgICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICB9CisgICAgZ290byBkb25lOworICB9CitzZXRfcGFybV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfVjRMMl9FUlJPUiAoZXJyb3IsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIlZpZGVvIGRldmljZSBkaWQgbm90IGFjY2VwdCBuZXcgZnJhbWUgcmF0ZSBzZXR0aW5nLiIpKSwKKyAgICAgICAgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgZ290byBkb25lOworICB9Citwb29sX2ZhaWxlZDoKKyAgeworICAgIC8qIHNldHVwX3Bvb2wgYWxyZWFkeSBzZW5kIHRoZSBlcnJvciAqLworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfb2JqZWN0X3NldF9mb3JtYXQgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBHc3RDYXBzICogY2FwcywKKyAgICBHc3RWNGwyRXJyb3IgKiBlcnJvcikKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIlNldHRpbmcgZm9ybWF0IHRvICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgY2Fwcyk7CisgIHJldHVybiBnc3RfdjRsMl9vYmplY3Rfc2V0X2Zvcm1hdF9mdWxsICh2NGwyb2JqZWN0LCBjYXBzLCBGQUxTRSwgZXJyb3IpOworfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfb2JqZWN0X3RyeV9mb3JtYXQgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBHc3RDYXBzICogY2FwcywKKyAgICBHc3RWNGwyRXJyb3IgKiBlcnJvcikKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIlRyeWluZyBmb3JtYXQgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBjYXBzKTsKKyAgcmV0dXJuIGdzdF92NGwyX29iamVjdF9zZXRfZm9ybWF0X2Z1bGwgKHY0bDJvYmplY3QsIGNhcHMsIFRSVUUsIGVycm9yKTsKK30KKworLyoqCisgKiBnc3RfdjRsMl9vYmplY3RfYWNxdWlyZV9mb3JtYXQ6CisgKiBAdjRsMm9iamVjdCB0aGUgb2JqZWN0CisgKiBAaW5mbyBhIEdzdFZpZGVvSW5mbyB0byBiZSBmaWxsZWQKKyAqCisgKiBBY3F1aXJlIHRoZSBkcml2ZXIgY2hvb3NlbiBmb3JtYXQuIFRoaXMgaXMgdXNlZnVsIGluIGRlY29kZXIgb3IgZW5jb2RlciBlbGVtZW50cyB3aGVyZQorICogdGhlIG91dHB1dCBmb3JtYXQgaXMgY2hvb3NlbiBieSB0aGUgSFcuCisgKgorICogUmV0dXJuczogJVRSVUUgb24gc3VjY2VzcywgJUZBTFNFIG9uIGZhaWx1cmUuCisgKi8KK2dib29sZWFuCitnc3RfdjRsMl9vYmplY3RfYWNxdWlyZV9mb3JtYXQgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBHc3RWaWRlb0luZm8gKiBpbmZvKQoreworICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmbXRkZXNjOworICBzdHJ1Y3QgdjRsMl9mb3JtYXQgZm10OworICBzdHJ1Y3QgdjRsMl9jcm9wIGNyb3A7CisgIHN0cnVjdCB2NGwyX3NlbGVjdGlvbiBzZWw7CisgIHN0cnVjdCB2NGwyX3JlY3QgKnIgPSBOVUxMOworICBHc3RWaWRlb0Zvcm1hdCBmb3JtYXQ7CisgIGd1aW50IHdpZHRoLCBoZWlnaHQ7CisgIEdzdFZpZGVvQWxpZ25tZW50IGFsaWduOworCisgIGdzdF92aWRlb19pbmZvX2luaXQgKGluZm8pOworICBnc3RfdmlkZW9fYWxpZ25tZW50X3Jlc2V0ICgmYWxpZ24pOworCisgIG1lbXNldCAoJmZtdCwgMHgwMCwgc2l6ZW9mIChzdHJ1Y3QgdjRsMl9mb3JtYXQpKTsKKyAgZm10LnR5cGUgPSB2NGwyb2JqZWN0LT50eXBlOworICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfR19GTVQsICZmbXQpIDwgMCkKKyAgICBnb3RvIGdldF9mbXRfZmFpbGVkOworCisgIGZtdGRlc2MgPSBnc3RfdjRsMl9vYmplY3RfZ2V0X2Zvcm1hdF9mcm9tX2ZvdXJjYyAodjRsMm9iamVjdCwKKyAgICAgIGZtdC5mbXQucGl4LnBpeGVsZm9ybWF0KTsKKyAgaWYgKGZtdGRlc2MgPT0gTlVMTCkKKyAgICBnb3RvIHVuc3VwcG9ydGVkX2Zvcm1hdDsKKworICAvKiBObyBuZWVkIHRvIGNhcmUgYWJvdXQgbXBsYW5lLCB0aGUgZm91ciBmaXJzdCBwYXJhbXMgYXJlIHRoZSBzYW1lICovCisgIGZvcm1hdCA9IGdzdF92NGwyX29iamVjdF92NGwyZm91cmNjX3RvX3ZpZGVvX2Zvcm1hdCAoZm10LmZtdC5waXgucGl4ZWxmb3JtYXQpOworCisgIC8qIGZhaWxzIGlmIHdlIGRvIG5vIHRyYW5zbGF0ZSB0aGUgZm10LnBpeC5waXhlbGZvcm1hdCB0byBHc3RWaWRlb0Zvcm1hdCAqLworICBpZiAoZm9ybWF0ID09IEdTVF9WSURFT19GT1JNQVRfVU5LTk9XTikKKyAgICBnb3RvIHVuc3VwcG9ydGVkX2Zvcm1hdDsKKworICBpZiAoZm10LmZtdC5waXgud2lkdGggPT0gMCB8fCBmbXQuZm10LnBpeC5oZWlnaHQgPT0gMCkKKyAgICBnb3RvIGludmFsaWRfZGltZW5zaW9uczsKKworICB3aWR0aCA9IGZtdC5mbXQucGl4LndpZHRoOworICBoZWlnaHQgPSBmbXQuZm10LnBpeC5oZWlnaHQ7CisKKyAgLyogVXNlIHRoZSBkZWZhdWx0IGNvbXBvc2UgcmVjdGFuZ2xlICovCisgIG1lbXNldCAoJnNlbCwgMCwgc2l6ZW9mIChzdHJ1Y3QgdjRsMl9zZWxlY3Rpb24pKTsKKyAgc2VsLnR5cGUgPSB2NGwyb2JqZWN0LT50eXBlOworICBzZWwudGFyZ2V0ID0gVjRMMl9TRUxfVEdUX0NPTVBPU0VfREVGQVVMVDsKKyAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX0dfU0VMRUNUSU9OLCAmc2VsKSA+PSAwKSB7CisgICAgciA9ICZzZWwucjsKKyAgfSBlbHNlIHsKKyAgICAvKiBGb3IgYW5jaWVudCBrZXJuZWxzLCBmYWxsIGJhY2sgdG8gR19DUk9QICovCisgICAgbWVtc2V0ICgmY3JvcCwgMCwgc2l6ZW9mIChzdHJ1Y3QgdjRsMl9jcm9wKSk7CisgICAgY3JvcC50eXBlID0gdjRsMm9iamVjdC0+dHlwZTsKKyAgICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfR19DUk9QLCAmY3JvcCkgPj0gMCkKKyAgICAgIHIgPSAmY3JvcC5jOworICB9CisgIGlmIChyKSB7CisgICAgYWxpZ24ucGFkZGluZ19sZWZ0ID0gci0+bGVmdDsKKyAgICBhbGlnbi5wYWRkaW5nX3RvcCA9IHItPnRvcDsKKyAgICBhbGlnbi5wYWRkaW5nX3JpZ2h0ID0gd2lkdGggLSByLT53aWR0aCAtIHItPmxlZnQ7CisgICAgYWxpZ24ucGFkZGluZ19ib3R0b20gPSBoZWlnaHQgLSByLT5oZWlnaHQgLSByLT50b3A7CisgICAgd2lkdGggPSByLT53aWR0aDsKKyAgICBoZWlnaHQgPSByLT5oZWlnaHQ7CisgIH0KKworICBnc3RfdmlkZW9faW5mb19zZXRfZm9ybWF0IChpbmZvLCBmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOworCisgIHN3aXRjaCAoZm10LmZtdC5waXguZmllbGQpIHsKKyAgICBjYXNlIFY0TDJfRklFTERfQU5ZOgorICAgIGNhc2UgVjRMMl9GSUVMRF9OT05FOgorICAgICAgaW5mby0+aW50ZXJsYWNlX21vZGUgPSBHU1RfVklERU9fSU5URVJMQUNFX01PREVfUFJPR1JFU1NJVkU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDoKKyAgICBjYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRF9UQjoKKyAgICBjYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRF9CVDoKKyAgICAgIGluZm8tPmludGVybGFjZV9tb2RlID0gR1NUX1ZJREVPX0lOVEVSTEFDRV9NT0RFX0lOVEVSTEVBVkVEOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdvdG8gdW5zdXBwb3J0ZWRfZmllbGQ7CisgIH0KKworICBnc3RfdjRsMl9vYmplY3RfZ2V0X2NvbG9yc3BhY2UgKCZmbXQsICZpbmZvLT5jb2xvcmltZXRyeSk7CisKKyAgZ3N0X3Y0bDJfb2JqZWN0X3NhdmVfZm9ybWF0ICh2NGwyb2JqZWN0LCBmbXRkZXNjLCAmZm10LCBpbmZvLCAmYWxpZ24pOworCisgIC8qIFNoYWxsIHdlIHNldHVwIHRoZSBwb29sID8gKi8KKworICByZXR1cm4gVFJVRTsKKworZ2V0X2ZtdF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJWaWRlbyBkZXZpY2UgZGlkIG5vdCBwcm92aWRlIG91dHB1dCBmb3JtYXQuIikpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK2ludmFsaWRfZGltZW5zaW9uczoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIlZpZGVvIGRldmljZSByZXR1cm5lZCBpbnZhbGlkIGRpbWVuc2lvbnMuIikpLAorICAgICAgICAoIkV4cGVjdGVkIG5vbiAwIGRpbWVuc2lvbnMsIGdvdCAlZHglZCIsIGZtdC5mbXQucGl4LndpZHRoLAorICAgICAgICAgICAgZm10LmZtdC5waXguaGVpZ2h0KSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit1bnN1cHBvcnRlZF9maWVsZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBpbnRlcmxhY2luZyBtZXRob2QuIikpLAorICAgICAgICAoIlY0TDIgZmllbGQgdHlwZSAlZCBub3Qgc3VwcG9ydGVkIiwgZm10LmZtdC5waXguZmllbGQpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK3Vuc3VwcG9ydGVkX2Zvcm1hdDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJWaWRlbyBkZXZpY2UgdXNlcyBhbiB1bnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIikpLAorICAgICAgICAoIlY0TDIgZm9ybWF0ICUiIEdTVF9GT1VSQ0NfRk9STUFUICIgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZtdC5mbXQucGl4LnBpeGVsZm9ybWF0KSkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfb2JqZWN0X3NldF9jcm9wIChHc3RWNGwyT2JqZWN0ICogb2JqKQoreworICBzdHJ1Y3QgdjRsMl9jcm9wIGNyb3AgPSB7IDAgfTsKKworICBjcm9wLnR5cGUgPSBvYmotPnR5cGU7CisgIGNyb3AuYy5sZWZ0ID0gb2JqLT5hbGlnbi5wYWRkaW5nX2xlZnQ7CisgIGNyb3AuYy50b3AgPSBvYmotPmFsaWduLnBhZGRpbmdfdG9wOworICBjcm9wLmMud2lkdGggPSBvYmotPmluZm8ud2lkdGg7CisgIGNyb3AuYy5oZWlnaHQgPSBvYmotPmluZm8uaGVpZ2h0OworCisgIGlmIChvYmotPmFsaWduLnBhZGRpbmdfbGVmdCArIG9iai0+YWxpZ24ucGFkZGluZ190b3AgKworICAgICAgb2JqLT5hbGlnbi5wYWRkaW5nX3JpZ2h0ICsgb2JqLT5hbGlnbi5wYWRkaW5nX2JvdHRvbSA9PSAwKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqLT5kYmdfb2JqLCAibm8gY3JvcHBpbmcgbmVlZGVkIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChvYmotPmRiZ19vYmosCisgICAgICAiRGVzaXJlZCBjcm9wcGluZyBsZWZ0ICV1LCB0b3AgJXUsIHNpemUgJXV4JXUiLCBjcm9wLmMubGVmdCwgY3JvcC5jLnRvcCwKKyAgICAgIGNyb3AuYy53aWR0aCwgY3JvcC5jLmhlaWdodCk7CisKKyAgaWYgKG9iai0+aW9jdGwgKG9iai0+dmlkZW9fZmQsIFZJRElPQ19TX0NST1AsICZjcm9wKSA8IDApIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG9iai0+ZGJnX29iaiwgIlZJRElPQ19TX0NST1AgZmFpbGVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKG9iai0+aW9jdGwgKG9iai0+dmlkZW9fZmQsIFZJRElPQ19HX0NST1AsICZjcm9wKSA8IDApIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKG9iai0+ZGJnX29iaiwgIlZJRElPQ19HX0NST1AgZmFpbGVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAob2JqLT5kYmdfb2JqLAorICAgICAgIkdvdCBjcm9wcGluZyBsZWZ0ICV1LCB0b3AgJXUsIHNpemUgJXV4JXUiLCBjcm9wLmMubGVmdCwgY3JvcC5jLnRvcCwKKyAgICAgIGNyb3AuYy53aWR0aCwgY3JvcC5jLmhlaWdodCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9vYmplY3RfY2Fwc19lcXVhbCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RTdHJ1Y3R1cmUgKmNvbmZpZzsKKyAgR3N0Q2FwcyAqb2xkY2FwczsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIGlmICghdjRsMm9iamVjdC0+cG9vbCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgY29uZmlnID0gZ3N0X2J1ZmZlcl9wb29sX2dldF9jb25maWcgKHY0bDJvYmplY3QtPnBvb2wpOworICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX2dldF9wYXJhbXMgKGNvbmZpZywgJm9sZGNhcHMsIE5VTEwsIE5VTEwsIE5VTEwpOworCisgIHJldCA9IG9sZGNhcHMgJiYgZ3N0X2NhcHNfaXNfZXF1YWwgKGNhcHMsIG9sZGNhcHMpOworCisgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoY29uZmlnKTsKKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfb2JqZWN0X3VubG9jayAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpCit7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgR1NUX0xPR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJzdGFydCBmbHVzaGluZyIpOworCisgIGlmICh2NGwyb2JqZWN0LT5wb29sICYmIGdzdF9idWZmZXJfcG9vbF9pc19hY3RpdmUgKHY0bDJvYmplY3QtPnBvb2wpKQorICAgIGdzdF9idWZmZXJfcG9vbF9zZXRfZmx1c2hpbmcgKHY0bDJvYmplY3QtPnBvb2wsIFRSVUUpOworCisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9vYmplY3RfdW5sb2NrX3N0b3AgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KQoreworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIEdTVF9MT0dfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAic3RvcCBmbHVzaGluZyIpOworCisgIGlmICh2NGwyb2JqZWN0LT5wb29sICYmIGdzdF9idWZmZXJfcG9vbF9pc19hY3RpdmUgKHY0bDJvYmplY3QtPnBvb2wpKQorICAgIGdzdF9idWZmZXJfcG9vbF9zZXRfZmx1c2hpbmcgKHY0bDJvYmplY3QtPnBvb2wsIEZBTFNFKTsKKworICByZXR1cm4gcmV0OworfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfb2JqZWN0X3N0b3AgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KQoreworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAic3RvcHBpbmciKTsKKworICBpZiAoIUdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKQorICAgIGdvdG8gZG9uZTsKKyAgaWYgKCFHU1RfVjRMMl9JU19BQ1RJVkUgKHY0bDJvYmplY3QpKQorICAgIGdvdG8gZG9uZTsKKworICBpZiAodjRsMm9iamVjdC0+cG9vbCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJkZWFjdGl2YXRpbmcgcG9vbCIpOworICAgIGdzdF9idWZmZXJfcG9vbF9zZXRfYWN0aXZlICh2NGwyb2JqZWN0LT5wb29sLCBGQUxTRSk7CisgICAgZ3N0X29iamVjdF91bnJlZiAodjRsMm9iamVjdC0+cG9vbCk7CisgICAgdjRsMm9iamVjdC0+cG9vbCA9IE5VTEw7CisgIH0KKworICBHU1RfVjRMMl9TRVRfSU5BQ1RJVkUgKHY0bDJvYmplY3QpOworCitkb25lOgorICByZXR1cm4gVFJVRTsKK30KKworR3N0Q2FwcyAqCitnc3RfdjRsMl9vYmplY3RfcHJvYmVfY2FwcyAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdENhcHMgKnJldDsKKyAgR1NMaXN0ICp3YWxrOworICBHU0xpc3QgKmZvcm1hdHM7CisKKyAgZm9ybWF0cyA9IGdzdF92NGwyX29iamVjdF9nZXRfZm9ybWF0X2xpc3QgKHY0bDJvYmplY3QpOworCisgIHJldCA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKworICBpZiAodjRsMm9iamVjdC0+a2VlcF9hc3BlY3QgJiYgIXY0bDJvYmplY3QtPnBhcikgeworICAgIHN0cnVjdCB2NGwyX2Nyb3BjYXAgY3JvcGNhcDsKKworICAgIG1lbXNldCAoJmNyb3BjYXAsIDAsIHNpemVvZiAoY3JvcGNhcCkpOworCisgICAgY3JvcGNhcC50eXBlID0gdjRsMm9iamVjdC0+dHlwZTsKKyAgICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfQ1JPUENBUCwgJmNyb3BjYXApIDwgMCkgeworICAgICAgaWYgKGVycm5vICE9IEVOT1RUWSkKKyAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgICAgICAgIkZhaWxlZCB0byBwcm9iZSBwaXhlbCBhc3BlY3QgcmF0aW8gd2l0aCBWSURJT0NfQ1JPUENBUDogJXMiLAorICAgICAgICAgICAgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICB9IGVsc2UgeworICAgICAgdjRsMm9iamVjdC0+cGFyID0gZ19uZXcwIChHVmFsdWUsIDEpOworICAgICAgZ192YWx1ZV9pbml0ICh2NGwyb2JqZWN0LT5wYXIsIEdTVF9UWVBFX0ZSQUNUSU9OKTsKKyAgICAgIGdzdF92YWx1ZV9zZXRfZnJhY3Rpb24gKHY0bDJvYmplY3QtPnBhciwgY3JvcGNhcC5waXhlbGFzcGVjdC5udW1lcmF0b3IsCisgICAgICAgICAgY3JvcGNhcC5waXhlbGFzcGVjdC5kZW5vbWluYXRvcik7CisgICAgfQorICB9CisKKyAgZm9yICh3YWxrID0gZm9ybWF0czsgd2Fsazsgd2FsayA9IHdhbGstPm5leHQpIHsKKyAgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmb3JtYXQ7CisgICAgR3N0U3RydWN0dXJlICp0ZW1wbGF0ZTsKKyAgICBHc3RDYXBzICp0bXA7CisKKyAgICBmb3JtYXQgPSAoc3RydWN0IHY0bDJfZm10ZGVzYyAqKSB3YWxrLT5kYXRhOworCisgICAgdGVtcGxhdGUgPSBnc3RfdjRsMl9vYmplY3RfdjRsMmZvdXJjY190b19iYXJlX3N0cnVjdCAoZm9ybWF0LT5waXhlbGZvcm1hdCk7CisKKyAgICBpZiAoIXRlbXBsYXRlKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgICAgICJ1bmtub3duIGZvcm1hdCAlIiBHU1RfRk9VUkNDX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfRk9VUkNDX0FSR1MgKGZvcm1hdC0+cGl4ZWxmb3JtYXQpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIElmIHdlIGhhdmUgYSBmaWx0ZXIsIGNoZWNrIGlmIHdlIG5lZWQgdG8gcHJvYmUgdGhpcyBmb3JtYXQgb3Igbm90ICovCisgICAgaWYgKGZpbHRlcikgeworICAgICAgR3N0Q2FwcyAqZm9ybWF0X2NhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHkgKCk7CisKKyAgICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKGZvcm1hdF9jYXBzLCBnc3Rfc3RydWN0dXJlX2NvcHkgKHRlbXBsYXRlKSk7CisKKyAgICAgIGlmICghZ3N0X2NhcHNfY2FuX2ludGVyc2VjdCAoZm9ybWF0X2NhcHMsIGZpbHRlcikpIHsKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKGZvcm1hdF9jYXBzKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlICh0ZW1wbGF0ZSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBnc3RfY2Fwc191bnJlZiAoZm9ybWF0X2NhcHMpOworICAgIH0KKworICAgIHRtcCA9IGdzdF92NGwyX29iamVjdF9wcm9iZV9jYXBzX2Zvcl9mb3JtYXQgKHY0bDJvYmplY3QsCisgICAgICAgIGZvcm1hdC0+cGl4ZWxmb3JtYXQsIHRlbXBsYXRlKTsKKyAgICBpZiAodG1wKQorICAgICAgZ3N0X2NhcHNfYXBwZW5kIChyZXQsIHRtcCk7CisKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHRlbXBsYXRlKTsKKyAgfQorCisgIGlmIChmaWx0ZXIpIHsKKyAgICBHc3RDYXBzICp0bXA7CisKKyAgICB0bXAgPSByZXQ7CisgICAgcmV0ID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgcmV0LCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgIGdzdF9jYXBzX3VucmVmICh0bXApOworICB9CisKKyAgR1NUX0lORk9fT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAicHJvYmVkIGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCByZXQpOworCisgIHJldHVybiByZXQ7Cit9CisKK0dzdENhcHMgKgorZ3N0X3Y0bDJfb2JqZWN0X2dldF9jYXBzIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqcmV0OworCisgIGlmICh2NGwyb2JqZWN0LT5wcm9iZWRfY2FwcyA9PSBOVUxMKQorICAgIHY0bDJvYmplY3QtPnByb2JlZF9jYXBzID0gZ3N0X3Y0bDJfb2JqZWN0X3Byb2JlX2NhcHMgKHY0bDJvYmplY3QsIE5VTEwpOworCisgIGlmIChmaWx0ZXIpIHsKKyAgICByZXQgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAoZmlsdGVyLCB2NGwyb2JqZWN0LT5wcm9iZWRfY2FwcywKKyAgICAgICAgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgfSBlbHNlIHsKKyAgICByZXQgPSBnc3RfY2Fwc19yZWYgKHY0bDJvYmplY3QtPnByb2JlZF9jYXBzKTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9vYmplY3RfZGVjaWRlX2FsbG9jYXRpb24gKEdzdFY0bDJPYmplY3QgKiBvYmosIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdEJ1ZmZlclBvb2wgKnBvb2wgPSBOVUxMLCAqb3RoZXJfcG9vbCA9IE5VTEw7CisgIEdzdFN0cnVjdHVyZSAqY29uZmlnOworICBndWludCBzaXplLCBtaW4sIG1heCwgb3duX21pbiA9IDA7CisgIGdib29sZWFuIHVwZGF0ZTsKKyAgZ2Jvb2xlYW4gaGFzX3ZpZGVvX21ldGE7CisgIGdib29sZWFuIGNhbl9zaGFyZV9vd25fcG9vbCwgcHVzaGluZ19mcm9tX291cl9wb29sID0gRkFMU0U7CisgIEdzdEFsbG9jYXRvciAqYWxsb2NhdG9yID0gTlVMTDsKKyAgR3N0QWxsb2NhdGlvblBhcmFtcyBwYXJhbXMgPSB7IDAgfTsKKworICBHU1RfREVCVUdfT0JKRUNUIChvYmotPmRiZ19vYmosICJkZWNpZGUgYWxsb2NhdGlvbiIpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChvYmotPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8CisgICAgICBvYmotPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSwgRkFMU0UpOworCisgIGdzdF9xdWVyeV9wYXJzZV9hbGxvY2F0aW9uIChxdWVyeSwgJmNhcHMsIE5VTEwpOworCisgIGlmIChvYmotPnBvb2wgPT0gTlVMTCkgeworICAgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X3NldHVwX3Bvb2wgKG9iaiwgY2FwcykpCisgICAgICBnb3RvIHBvb2xfZmFpbGVkOworICB9CisKKyAgaWYgKGdzdF9xdWVyeV9nZXRfbl9hbGxvY2F0aW9uX3BhcmFtcyAocXVlcnkpID4gMCkKKyAgICBnc3RfcXVlcnlfcGFyc2VfbnRoX2FsbG9jYXRpb25fcGFyYW0gKHF1ZXJ5LCAwLCAmYWxsb2NhdG9yLCAmcGFyYW1zKTsKKworICBpZiAoZ3N0X3F1ZXJ5X2dldF9uX2FsbG9jYXRpb25fcG9vbHMgKHF1ZXJ5KSA+IDApIHsKKyAgICBnc3RfcXVlcnlfcGFyc2VfbnRoX2FsbG9jYXRpb25fcG9vbCAocXVlcnksIDAsICZwb29sLCAmc2l6ZSwgJm1pbiwgJm1heCk7CisgICAgdXBkYXRlID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBwb29sID0gTlVMTDsKKyAgICBtaW4gPSBtYXggPSAwOworICAgIHNpemUgPSAwOworICAgIHVwZGF0ZSA9IEZBTFNFOworICB9CisKKyAgR1NUX0RFQlVHX09CSkVDVCAob2JqLT5kYmdfb2JqLCAiYWxsb2NhdGlvbjogc2l6ZToldSBtaW46JXUgbWF4OiV1IHBvb2w6JSIKKyAgICAgIEdTVF9QVFJfRk9STUFULCBzaXplLCBtaW4sIG1heCwgcG9vbCk7CisKKyAgaGFzX3ZpZGVvX21ldGEgPQorICAgICAgZ3N0X3F1ZXJ5X2ZpbmRfYWxsb2NhdGlvbl9tZXRhIChxdWVyeSwgR1NUX1ZJREVPX01FVEFfQVBJX1RZUEUsIE5VTEwpOworCisgIGNhbl9zaGFyZV9vd25fcG9vbCA9IChoYXNfdmlkZW9fbWV0YSB8fCAhb2JqLT5uZWVkX3ZpZGVvX21ldGEpOworCisgIGdzdF92NGwyX2dldF9kcml2ZXJfbWluX2J1ZmZlcnMgKG9iaik7CisgIC8qIFdlIGNhbid0IHNoYXJlIG91ciBvd24gcG9vbCwgaWYgaXQgZXhjZWVkIFY0TDIgY2FwYWNpdHkgKi8KKyAgaWYgKG1pbiArIG9iai0+bWluX2J1ZmZlcnMgKyAxID4gVklERU9fTUFYX0ZSQU1FKQorICAgIGNhbl9zaGFyZV9vd25fcG9vbCA9IEZBTFNFOworCisgIC8qIHNlbGVjdCBhIHBvb2wgKi8KKyAgc3dpdGNoIChvYmotPm1vZGUpIHsKKyAgICBjYXNlIEdTVF9WNEwyX0lPX1JXOgorICAgICAgaWYgKHBvb2wpIHsKKyAgICAgICAgLyogaW4gUkVBRC9XUklURSBtb2RlLCBwcmVmZXIgYSBkb3duc3RyZWFtIHBvb2wgYmVjYXVzZSBvdXIgb3duIHBvb2wKKyAgICAgICAgICogZG9lc24ndCBoZWxwIG11Y2gsIHdlIGhhdmUgdG8gd3JpdGUgdG8gaXQgYXMgd2VsbCAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChvYmotPmRiZ19vYmosCisgICAgICAgICAgICAicmVhZC93cml0ZSBtb2RlOiB1c2luZyBkb3duc3RyZWFtIHBvb2wiKTsKKyAgICAgICAgLyogdXNlIHRoZSBiaWdlc3Qgc2l6ZSwgd2hlbiB3ZSB1c2Ugb3VyIG93biBwb29sIHdlIGNhbid0IHJlYWxseSBkbyBhbnkKKyAgICAgICAgICogb3RoZXIgc2l6ZSB0aGFuIHdoYXQgdGhlIGhhcmR3YXJlIGdpdmVzIHVzIGJ1dCBmb3IgZG93bnN0cmVhbSBwb29scworICAgICAgICAgKiB3ZSBjYW4gdHJ5ICovCisgICAgICAgIHNpemUgPSBNQVggKHNpemUsIG9iai0+aW5mby5zaXplKTsKKyAgICAgIH0gZWxzZSBpZiAoY2FuX3NoYXJlX293bl9wb29sKSB7CisgICAgICAgIC8qIG5vIGRvd25zdHJlYW0gcG9vbCwgdXNlIG91ciBvd24gdGhlbiAqLworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChvYmotPmRiZ19vYmosCisgICAgICAgICAgICAicmVhZC93cml0ZSBtb2RlOiBubyBkb3duc3RyZWFtIHBvb2wsIHVzaW5nIG91ciBvd24iKTsKKyAgICAgICAgcG9vbCA9IGdzdF9vYmplY3RfcmVmIChvYmotPnBvb2wpOworICAgICAgICBzaXplID0gb2JqLT5pbmZvLnNpemU7CisgICAgICAgIHB1c2hpbmdfZnJvbV9vdXJfcG9vbCA9IFRSVUU7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgR1NUX1Y0TDJfSU9fVVNFUlBUUjoKKyAgICBjYXNlIEdTVF9WNEwyX0lPX0RNQUJVRl9JTVBPUlQ6CisgICAgICAvKiBpbiBpbXBvcnRpbmcgbW9kZSwgcHJlZmVyIG91ciBvd24gcG9vbCwgYW5kIHBhc3MgdGhlIG90aGVyIHBvb2wgdG8KKyAgICAgICAqIG91ciBvd24sIHNvIGl0IGNhbiBzZXJ2ZSBpdHNlbGYgKi8KKyAgICAgIGlmIChwb29sID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9fZG93bnN0cmVhbV9wb29sOworICAgICAgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfc2V0X290aGVyX3Bvb2wgKEdTVF9WNEwyX0JVRkZFUl9QT09MIChvYmotPnBvb2wpLAorICAgICAgICAgIHBvb2wpOworICAgICAgb3RoZXJfcG9vbCA9IHBvb2w7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChwb29sKTsKKyAgICAgIHBvb2wgPSBnc3Rfb2JqZWN0X3JlZiAob2JqLT5wb29sKTsKKyAgICAgIHNpemUgPSBvYmotPmluZm8uc2l6ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHU1RfVjRMMl9JT19NTUFQOgorICAgIGNhc2UgR1NUX1Y0TDJfSU9fRE1BQlVGOgorICAgICAgLyogaW4gc3RyZWFtaW5nIG1vZGUsIHByZWZlciBvdXIgb3duIHBvb2wgKi8KKyAgICAgIC8qIENoZWNrIGlmIHdlIGNhbiB1c2UgaXQgLi4uICovCisgICAgICBpZiAoY2FuX3NoYXJlX293bl9wb29sKSB7CisgICAgICAgIGlmIChwb29sKQorICAgICAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHBvb2wpOworICAgICAgICBwb29sID0gZ3N0X29iamVjdF9yZWYgKG9iai0+cG9vbCk7CisgICAgICAgIHNpemUgPSBvYmotPmluZm8uc2l6ZTsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqLT5kYmdfb2JqLAorICAgICAgICAgICAgInN0cmVhbWluZyBtb2RlOiB1c2luZyBvdXIgb3duIHBvb2wgJSIgR1NUX1BUUl9GT1JNQVQsIHBvb2wpOworICAgICAgICBwdXNoaW5nX2Zyb21fb3VyX3Bvb2wgPSBUUlVFOworICAgICAgfSBlbHNlIGlmIChwb29sKSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG9iai0+ZGJnX29iaiwKKyAgICAgICAgICAgICJzdHJlYW1pbmcgbW9kZTogY29weWluZyB0byBkb3duc3RyZWFtIHBvb2wgJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICAgICAgICBwb29sKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG9iai0+ZGJnX29iaiwKKyAgICAgICAgICAgICJzdHJlYW1pbmcgbW9kZTogbm8gdXNhYmxlIHBvb2wsIGNvcHlpbmcgdG8gZ2VuZXJpYyBwb29sIik7CisgICAgICAgIHNpemUgPSBNQVggKHNpemUsIG9iai0+aW5mby5zaXplKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX1Y0TDJfSU9fQVVUTzoKKyAgICBkZWZhdWx0OgorICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChvYmotPmRiZ19vYmosICJ1bmhhbmRsZWQgbW9kZSIpOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoc2l6ZSA9PSAwKQorICAgIGdvdG8gbm9fc2l6ZTsKKworICAvKiBJZiBwdXNoaW5nIGZyb20gb3VyIG93biBwb29sLCBjb25maWd1cmUgaXQgd2l0aCBxdWVyaWVkIG1pbmltdW0sCisgICAqIG90aGVyd2lzZSB1c2UgdGhlIG1pbmltdW0gcmVxdWlyZWQgKi8KKyAgaWYgKHB1c2hpbmdfZnJvbV9vdXJfcG9vbCkgeworICAgIC8qIFdoZW4gcHVzaGluZyBmcm9tIG91ciBvd24gcG9vbCwgd2UgbmVlZCB3aGF0IGRvd25zdHJlYW0gb25lLCB0byBiZSBhYmxlCisgICAgICogdG8gZmlsbCB0aGUgcGlwZWxpbmUsIHRoZSBtaW5pbXVtIHJlcXVpcmVkIHRvIGRlY29kZXIgYWNjb3JkaW5nIHRvIHRoZQorICAgICAqIGRyaXZlciBhbmQgMiBtb3JlLCBzbyB3ZSBkb24ndCBlbmR1cCB1cCB3aXRoIGV2ZXJ5dGhpbmcgZG93bnN0cmVhbSBvcgorICAgICAqIGhlbGQgYnkgdGhlIGRlY29kZXIuIFdlIGFjY291bnQgMiBidWZmZXJzIGZvciB2NGwyIHNvIHdoZW4gb25lIGlzIGJlaW5nCisgICAgICogcHVzaGVkIGRvd25zdHJlYW0gdGhlIG90aGVyIG9uZSBjYW4gYWxyZWFkeSBiZSBxdWV1ZWQgZm9yIHRoZSBuZXh0CisgICAgICogZnJhbWUuICovCisgICAgb3duX21pbiA9IG1pbiArIG9iai0+bWluX2J1ZmZlcnMgKyAyOworCisgICAgLyogSWYgbm8gYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIHdoZXJlIHByb3ZpZGVkLCBhbGxvdyBmb3IgYSBsaXR0bGUgbW9yZQorICAgICAqIGJ1ZmZlcnMgYW5kIGVuYWJsZSBjb3B5IHRocmVzaG9sZCAqLworICAgIGlmICghdXBkYXRlKSB7CisgICAgICBvd25fbWluICs9IDI7CisgICAgICBnc3RfdjRsMl9idWZmZXJfcG9vbF9jb3B5X2F0X3RocmVzaG9sZCAoR1NUX1Y0TDJfQlVGRkVSX1BPT0wgKHBvb2wpLAorICAgICAgICAgIFRSVUUpOworICAgIH0gZWxzZSB7CisgICAgICBnc3RfdjRsMl9idWZmZXJfcG9vbF9jb3B5X2F0X3RocmVzaG9sZCAoR1NUX1Y0TDJfQlVGRkVSX1BPT0wgKHBvb2wpLAorICAgICAgICAgIEZBTFNFKTsKKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICAvKiBJbiB0aGlzIGNhc2Ugd2UnbGwgaGF2ZSB0byBjb25maWd1cmUgdHdvIGJ1ZmZlciBwb29sLiBGb3Igb3VyIGJ1ZmZlcgorICAgICAqIHBvb2wsIHdlJ2xsIG5lZWQgd2hhdCB0aGUgZHJpdmVyIG9uZSwgYW5kIG9uZSBtb3JlLCBzbyB3ZSBjYW4gZGVxdWV1ICovCisgICAgb3duX21pbiA9IG9iai0+bWluX2J1ZmZlcnMgKyAxOworICAgIG93bl9taW4gPSBNQVggKG93bl9taW4sIEdTVF9WNEwyX01JTl9CVUZGRVJTKTsKKworICAgIC8qIGZvciB0aGUgZG93bnN0cmVhbSBwb29sLCB3ZSBrZWVwIHdoYXQgZG93bnN0cmVhbSB3YW50cywgdGhvdWdoIGVuc3VyZQorICAgICAqIGF0IGxlYXN0IGEgbWluaW11bSBpZiBkb3duc3RyZWFtIGRpZG4ndCBzdWdnZXN0IGFueXRoaW5nICh3ZSBhcmUKKyAgICAgKiBleHBlY3RpbmcgdGhlIGJhc2UgY2xhc3MgdG8gY3JlYXRlIGEgZGVmYXVsdCBvbmUgZm9yIHRoZSBjb250ZXh0KSAqLworICAgIG1pbiA9IE1BWCAobWluLCBHU1RfVjRMMl9NSU5fQlVGRkVSUyk7CisKKyAgICAvKiBUbyBpbXBvcnQgd2UgbmVlZCB0aGUgb3RoZXIgcG9vbCB0byBob2xkIGF0IGxlYXN0IG93bl9taW4gKi8KKyAgICBpZiAob2JqLT5wb29sID09IHBvb2wpCisgICAgICBtaW4gKz0gb3duX21pbjsKKyAgfQorCisgIC8qIFJlcXVlc3QgYSBiaWdnZXIgbWF4LCBpZiBvbmUgd2FzIHN1Z2dlc3RlZCBidXQgaXQncyB0b28gc21hbGwgKi8KKyAgaWYgKG1heCAhPSAwKQorICAgIG1heCA9IE1BWCAobWluLCBtYXgpOworCisgIC8qIEZpcnN0IHN0ZXAsIGNvbmZpZ3VyZSBvdXIgb3duIHBvb2wgKi8KKyAgY29uZmlnID0gZ3N0X2J1ZmZlcl9wb29sX2dldF9jb25maWcgKG9iai0+cG9vbCk7CisKKyAgaWYgKG9iai0+bmVlZF92aWRlb19tZXRhIHx8IGhhc192aWRlb19tZXRhKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqLT5kYmdfb2JqLCAiYWN0aXZhdGUgVmlkZW8gTWV0YSIpOworICAgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfYWRkX29wdGlvbiAoY29uZmlnLAorICAgICAgICBHU1RfQlVGRkVSX1BPT0xfT1BUSU9OX1ZJREVPX01FVEEpOworICB9CisKKyAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19zZXRfYWxsb2NhdG9yIChjb25maWcsIGFsbG9jYXRvciwgJnBhcmFtcyk7CisgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfc2V0X3BhcmFtcyAoY29uZmlnLCBjYXBzLCBzaXplLCBvd25fbWluLCAwKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChvYmotPmRiZ19vYmosICJzZXR0aW5nIG93biBwb29sIGNvbmZpZyB0byAlIgorICAgICAgR1NUX1BUUl9GT1JNQVQsIGNvbmZpZyk7CisKKyAgLyogT3VyIHBvb2wgb2Z0ZW4gbmVlZCB0byBhZGp1c3QgdGhlIHZhbHVlICovCisgIGlmICghZ3N0X2J1ZmZlcl9wb29sX3NldF9jb25maWcgKG9iai0+cG9vbCwgY29uZmlnKSkgeworICAgIGNvbmZpZyA9IGdzdF9idWZmZXJfcG9vbF9nZXRfY29uZmlnIChvYmotPnBvb2wpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqLT5kYmdfb2JqLCAib3duIHBvb2wgY29uZmlnIGNoYW5nZWQgdG8gJSIKKyAgICAgICAgR1NUX1BUUl9GT1JNQVQsIGNvbmZpZyk7CisKKyAgICAvKiBvdXIgcG9vbCB3aWxsIGFkanVzdCB0aGUgbWF4aW11bSBidWZmZXIsIHdoaWNoIHdlIGFyZSBmaW5lIHdpdGggKi8KKyAgICBpZiAoIWdzdF9idWZmZXJfcG9vbF9zZXRfY29uZmlnIChvYmotPnBvb2wsIGNvbmZpZykpCisgICAgICBnb3RvIGNvbmZpZ19mYWlsZWQ7CisgIH0KKworICAvKiBOb3cgY29uZmlndXJlIHRoZSBvdGhlciBwb29sIGlmIGRpZmZlcmVudCAqLworICBpZiAob2JqLT5wb29sICE9IHBvb2wpCisgICAgb3RoZXJfcG9vbCA9IHBvb2w7CisKKyAgaWYgKG90aGVyX3Bvb2wpIHsKKyAgICBjb25maWcgPSBnc3RfYnVmZmVyX3Bvb2xfZ2V0X2NvbmZpZyAob3RoZXJfcG9vbCk7CisgICAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19zZXRfYWxsb2NhdG9yIChjb25maWcsIGFsbG9jYXRvciwgJnBhcmFtcyk7CisgICAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19zZXRfcGFyYW1zIChjb25maWcsIGNhcHMsIHNpemUsIG1pbiwgbWF4KTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG9iai0+ZGJnX29iaiwgInNldHRpbmcgb3RoZXIgcG9vbCBjb25maWcgdG8gJSIKKyAgICAgICAgR1NUX1BUUl9GT1JNQVQsIGNvbmZpZyk7CisKKyAgICAvKiBpZiBkb3duc3RyZWFtIHN1cHBvcnRzIHZpZGVvIG1ldGFkYXRhLCBhZGQgdGhpcyB0byB0aGUgcG9vbCBjb25maWcgKi8KKyAgICBpZiAoaGFzX3ZpZGVvX21ldGEpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKG9iai0+ZGJnX29iaiwgImFjdGl2YXRlIFZpZGVvIE1ldGEiKTsKKyAgICAgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfYWRkX29wdGlvbiAoY29uZmlnLAorICAgICAgICAgIEdTVF9CVUZGRVJfUE9PTF9PUFRJT05fVklERU9fTUVUQSk7CisgICAgfQorCisgICAgaWYgKCFnc3RfYnVmZmVyX3Bvb2xfc2V0X2NvbmZpZyAob3RoZXJfcG9vbCwgY29uZmlnKSkgeworICAgICAgY29uZmlnID0gZ3N0X2J1ZmZlcl9wb29sX2dldF9jb25maWcgKG90aGVyX3Bvb2wpOworCisgICAgICBpZiAoIWdzdF9idWZmZXJfcG9vbF9jb25maWdfdmFsaWRhdGVfcGFyYW1zIChjb25maWcsIGNhcHMsIHNpemUsIG1pbiwKKyAgICAgICAgICAgICAgbWF4KSkgeworICAgICAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKGNvbmZpZyk7CisgICAgICAgIGdvdG8gY29uZmlnX2ZhaWxlZDsKKyAgICAgIH0KKworICAgICAgaWYgKCFnc3RfYnVmZmVyX3Bvb2xfc2V0X2NvbmZpZyAob3RoZXJfcG9vbCwgY29uZmlnKSkKKyAgICAgICAgZ290byBjb25maWdfZmFpbGVkOworICAgIH0KKyAgfQorCisgIGlmIChwb29sKSB7CisgICAgLyogRm9yIHNpbXBsaWNpdHksIHNpbXBseSByZWFkIGJhY2sgdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uLCBzbyBvdXIgYmFzZQorICAgICAqIGNsYXNzIGdldCB0aGUgcmlnaHQgaW5mb3JtYXRpb24gKi8KKyAgICBjb25maWcgPSBnc3RfYnVmZmVyX3Bvb2xfZ2V0X2NvbmZpZyAocG9vbCk7CisgICAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19nZXRfcGFyYW1zIChjb25maWcsIE5VTEwsICZzaXplLCAmbWluLCAmbWF4KTsKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKGNvbmZpZyk7CisgIH0KKworICBpZiAodXBkYXRlKQorICAgIGdzdF9xdWVyeV9zZXRfbnRoX2FsbG9jYXRpb25fcG9vbCAocXVlcnksIDAsIHBvb2wsIHNpemUsIG1pbiwgbWF4KTsKKyAgZWxzZQorICAgIGdzdF9xdWVyeV9hZGRfYWxsb2NhdGlvbl9wb29sIChxdWVyeSwgcG9vbCwgc2l6ZSwgbWluLCBtYXgpOworCisgIGlmIChhbGxvY2F0b3IpCisgICAgZ3N0X29iamVjdF91bnJlZiAoYWxsb2NhdG9yKTsKKworICBpZiAocG9vbCkKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwb29sKTsKKworICByZXR1cm4gVFJVRTsKKworcG9vbF9mYWlsZWQ6CisgIHsKKyAgICAvKiBzZXR1cF9wb29sIGFscmVhZHkgc2VuZCB0aGUgZXJyb3IgKi8KKyAgICBnb3RvIGNsZWFudXA7CisgIH0KK2NvbmZpZ19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob2JqLT5lbGVtZW50LCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJGYWlsZWQgdG8gY29uZmlndXJlIGludGVybmFsIGJ1ZmZlciBwb29sLiIpKSwgKE5VTEwpKTsKKyAgICBnb3RvIGNsZWFudXA7CisgIH0KK25vX3NpemU6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAob2JqLT5lbGVtZW50LCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJWaWRlbyBkZXZpY2UgZGlkIG5vdCBzdWdnZXN0IGFueSBidWZmZXIgc2l6ZS4iKSksIChOVUxMKSk7CisgICAgZ290byBjbGVhbnVwOworICB9CitjbGVhbnVwOgorICB7CisgICAgaWYgKGFsbG9jYXRvcikKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGFsbG9jYXRvcik7CisKKyAgICBpZiAocG9vbCkKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKHBvb2wpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm9fZG93bnN0cmVhbV9wb29sOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKG9iai0+ZWxlbWVudCwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiTm8gZG93bnN0cmVhbSBwb29sIHRvIGltcG9ydCBmcm9tLiIpKSwKKyAgICAgICAgKCJXaGVuIGltcG9ydGluZyBETUFCVUYgb3IgVVNFUlBUUiwgd2UgbmVlZCBhIHBvb2wgdG8gaW1wb3J0IGZyb20iKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9vYmplY3RfcHJvcG9zZV9hbGxvY2F0aW9uIChHc3RWNGwyT2JqZWN0ICogb2JqLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RCdWZmZXJQb29sICpwb29sOworICAvKiB3ZSBuZWVkIGF0IGxlYXN0IDIgYnVmZmVycyB0byBvcGVyYXRlICovCisgIGd1aW50IHNpemUsIG1pbiwgbWF4OworICBHc3RDYXBzICpjYXBzOworICBnYm9vbGVhbiBuZWVkX3Bvb2w7CisKKyAgLyogU2V0IGRlZmF1bHRzIGFsbG9jYXRpb24gcGFyYW1ldGVycyAqLworICBzaXplID0gb2JqLT5pbmZvLnNpemU7CisgIG1pbiA9IEdTVF9WNEwyX01JTl9CVUZGRVJTOworICBtYXggPSBWSURFT19NQVhfRlJBTUU7CisKKyAgZ3N0X3F1ZXJ5X3BhcnNlX2FsbG9jYXRpb24gKHF1ZXJ5LCAmY2FwcywgJm5lZWRfcG9vbCk7CisKKyAgaWYgKGNhcHMgPT0gTlVMTCkKKyAgICBnb3RvIG5vX2NhcHM7CisKKyAgaWYgKChwb29sID0gb2JqLT5wb29sKSkKKyAgICBnc3Rfb2JqZWN0X3JlZiAocG9vbCk7CisKKyAgaWYgKHBvb2wgIT0gTlVMTCkgeworICAgIEdzdENhcHMgKnBjYXBzOworICAgIEdzdFN0cnVjdHVyZSAqY29uZmlnOworCisgICAgLyogd2UgaGFkIGEgcG9vbCwgY2hlY2sgY2FwcyAqLworICAgIGNvbmZpZyA9IGdzdF9idWZmZXJfcG9vbF9nZXRfY29uZmlnIChwb29sKTsKKyAgICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX2dldF9wYXJhbXMgKGNvbmZpZywgJnBjYXBzLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG9iai0+ZGJnX29iaiwKKyAgICAgICAgIndlIGhhZCBhIHBvb2wgd2l0aCBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBwY2Fwcyk7CisgICAgaWYgKCFnc3RfY2Fwc19pc19lcXVhbCAoY2FwcywgcGNhcHMpKSB7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKGNvbmZpZyk7CisgICAgICBnc3Rfb2JqZWN0X3VucmVmIChwb29sKTsKKyAgICAgIGdvdG8gZGlmZmVyZW50X2NhcHM7CisgICAgfQorICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoY29uZmlnKTsKKyAgfQorICBnc3RfdjRsMl9nZXRfZHJpdmVyX21pbl9idWZmZXJzIChvYmopOworCisgIG1pbiA9IE1BWCAob2JqLT5taW5fYnVmZmVycywgR1NUX1Y0TDJfTUlOX0JVRkZFUlMpOworCisgIGdzdF9xdWVyeV9hZGRfYWxsb2NhdGlvbl9wb29sIChxdWVyeSwgcG9vbCwgc2l6ZSwgbWluLCBtYXgpOworCisgIC8qIHdlIGFsc28gc3VwcG9ydCB2YXJpb3VzIG1ldGFkYXRhICovCisgIGdzdF9xdWVyeV9hZGRfYWxsb2NhdGlvbl9tZXRhIChxdWVyeSwgR1NUX1ZJREVPX01FVEFfQVBJX1RZUEUsIE5VTEwpOworCisgIGlmIChwb29sKQorICAgIGdzdF9vYmplY3RfdW5yZWYgKHBvb2wpOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworbm9fY2FwczoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKG9iai0+ZGJnX29iaiwgIm5vIGNhcHMgc3BlY2lmaWVkIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitkaWZmZXJlbnRfY2FwczoKKyAgeworICAgIC8qIGRpZmZlcmVudCBjYXBzLCB3ZSBjYW4ndCB1c2UgdGhpcyBwb29sICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAob2JqLT5kYmdfb2JqLCAicG9vbCBoYXMgZGlmZmVyZW50IGNhcHMiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJvYmplY3QuaCBiL3N5cy92NGwyL2dzdHY0bDJvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2JhNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMm9iamVjdC5oCkBAIC0wLDAgKzEsMzI2IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAgICAgICAgICAgICAgIDIwMDYgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKyAqCisgKiBnc3R2NGwyb2JqZWN0Lmg6IGJhc2UgY2xhc3MgZm9yIFY0TDIgZWxlbWVudHMKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1Y0TDJfT0JKRUNUX0hfXworI2RlZmluZSBfX0dTVF9WNEwyX09CSkVDVF9IX18KKworI2luY2x1ZGUgImV4dC92aWRlb2RldjIuaCIKKyNpZmRlZiBIQVZFX0xJQlY0TDIKKyMgIGluY2x1ZGUgPGxpYnY0bDIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAidjRsMi11dGlscy5oIgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdHB1c2hzcmMuaD4KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMk9iamVjdCBHc3RWNGwyT2JqZWN0OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJPYmplY3RDbGFzc0hlbHBlciBHc3RWNGwyT2JqZWN0Q2xhc3NIZWxwZXI7CisKKyNpbmNsdWRlIDxnc3R2NGwyYnVmZmVycG9vbC5oPgorCisvKiBzaXplIG9mIHY0bDIgYnVmZmVyIHBvb2wgaW4gc3RyZWFtaW5nIGNhc2UgKi8KKyNkZWZpbmUgR1NUX1Y0TDJfTUlOX0JVRkZFUlMgMgorCisvKiBtYXggZnJhbWUgd2lkdGgvaGVpZ2h0ICovCisjZGVmaW5lIEdTVF9WNEwyX01BWF9TSVpFICgxPDwxNSkgLyogMl4xNSA9PSAzMjc2OCAqLworCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfVjRMMl9JT19NT0RFIChnc3RfdjRsMl9pb19tb2RlX2dldF90eXBlICgpKQorR1R5cGUgZ3N0X3Y0bDJfaW9fbW9kZV9nZXRfdHlwZSAodm9pZCk7CisKKyNkZWZpbmUgR1NUX1Y0TDJfT0JKRUNUKG9iaikgKEdzdFY0bDJPYmplY3QgKikob2JqKQorCit0eXBlZGVmIGVudW0geworICBHU1RfVjRMMl9JT19BVVRPICAgICAgICAgID0gMCwKKyAgR1NUX1Y0TDJfSU9fUlcgICAgICAgICAgICA9IDEsCisgIEdTVF9WNEwyX0lPX01NQVAgICAgICAgICAgPSAyLAorICBHU1RfVjRMMl9JT19VU0VSUFRSICAgICAgID0gMywKKyAgR1NUX1Y0TDJfSU9fRE1BQlVGICAgICAgICA9IDQsCisgIEdTVF9WNEwyX0lPX0RNQUJVRl9JTVBPUlQgPSA1Cit9IEdzdFY0bDJJT01vZGU7CisKK3R5cGVkZWYgZ2Jvb2xlYW4gICgqR3N0VjRsMkdldEluT3V0RnVuY3Rpb24pICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIGdpbnQgKiBpbnB1dCk7Cit0eXBlZGVmIGdib29sZWFuICAoKkdzdFY0bDJTZXRJbk91dEZ1bmN0aW9uKSAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBnaW50IGlucHV0KTsKK3R5cGVkZWYgZ2Jvb2xlYW4gICgqR3N0VjRsMlVwZGF0ZUZwc0Z1bmN0aW9uKSAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpOworCisjZGVmaW5lIEdTVF9WNEwyX1dJRFRIKG8pICAgICAgICAoR1NUX1ZJREVPX0lORk9fV0lEVEggKCYobyktPmluZm8pKQorI2RlZmluZSBHU1RfVjRMMl9IRUlHSFQobykgICAgICAgKEdTVF9WSURFT19JTkZPX0hFSUdIVCAoJihvKS0+aW5mbykpCisjZGVmaW5lIEdTVF9WNEwyX1BJWEVMRk9STUFUKG8pICAoKG8pLT5mbXRkZXNjLT5waXhlbGZvcm1hdCkKKyNkZWZpbmUgR1NUX1Y0TDJfRlBTX04obykgICAgICAgIChHU1RfVklERU9fSU5GT19GUFNfTiAoJihvKS0+aW5mbykpCisjZGVmaW5lIEdTVF9WNEwyX0ZQU19EKG8pICAgICAgICAoR1NUX1ZJREVPX0lORk9fRlBTX0QgKCYobyktPmluZm8pKQorCisvKiBzaW1wbGUgY2hlY2sgd2hldGhlciB0aGUgZGV2aWNlIGlzIG9wZW4gKi8KKyNkZWZpbmUgR1NUX1Y0TDJfSVNfT1BFTihvKSAgICAgICgobyktPnZpZGVvX2ZkID4gMCkKKworLyogY2hlY2sgd2hldGhlciB0aGUgZGV2aWNlIGlzICdhY3RpdmUnICovCisjZGVmaW5lIEdTVF9WNEwyX0lTX0FDVElWRShvKSAgICAoKG8pLT5hY3RpdmUpCisjZGVmaW5lIEdTVF9WNEwyX1NFVF9BQ1RJVkUobykgICAoKG8pLT5hY3RpdmUgPSBUUlVFKQorI2RlZmluZSBHU1RfVjRMMl9TRVRfSU5BQ1RJVkUobykgKChvKS0+YWN0aXZlID0gRkFMU0UpCisKKy8qIGNoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHY0bHY0bDJvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBvcGVuKCknZWQgb3Igbm90ICovCisjZGVmaW5lIEdTVF9WNEwyX0NIRUNLX09QRU4odjRsMm9iamVjdCkJCQkJXAorICBpZiAoIUdTVF9WNEwyX0lTX09QRU4odjRsMm9iamVjdCkpCQkJCVwKKyAgewkJCQkJCQkJXAorICAgIEdTVF9FTEVNRU5UX0VSUk9SICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgU0VUVElOR1MsCVwKKyAgICAgIChfKCJEZXZpY2UgaXMgbm90IG9wZW4uIikpLCAoTlVMTCkpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIEZBTFNFOwkJCQkJCVwKKyAgfQorCisvKiBjaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCB2NGx2NGwyb2JqZWN0IGlzIGNsb3NlKCknZWQgb3Igd2hldGhlciBpdCBpcyBzdGlsbCBvcGVuICovCisjZGVmaW5lIEdTVF9WNEwyX0NIRUNLX05PVF9PUEVOKHY0bDJvYmplY3QpCQkJXAorICBpZiAoR1NUX1Y0TDJfSVNfT1BFTih2NGwyb2JqZWN0KSkJCQkJXAorICB7CQkJCQkJCQlcCisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBTRVRUSU5HUywJXAorICAgICAgKF8oIkRldmljZSBpcyBvcGVuLiIpKSwgKE5VTEwpKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gRkFMU0U7CQkJCQkJXAorICB9CisKKy8qIGNoZWNrcyB3aGV0aGVyIHdlJ3JlIG91dCBvZiBjYXB0dXJlIG1vZGUgb3Igbm90ICovCisjZGVmaW5lIEdTVF9WNEwyX0NIRUNLX05PVF9BQ1RJVkUodjRsMm9iamVjdCkJCQlcCisgIGlmIChHU1RfVjRMMl9JU19BQ1RJVkUodjRsMm9iamVjdCkpCQkJCVwKKyAgewkJCQkJCQkJXAorICAgIEdTVF9FTEVNRU5UX0VSUk9SICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgU0VUVElOR1MsIFwKKyAgICAgIChOVUxMKSwgKCJEZXZpY2UgaXMgaW4gc3RyZWFtaW5nIG1vZGUiKSk7ICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIEZBTFNFOwkJCQkJCVwKKyAgfQorCisKK3N0cnVjdCBfR3N0VjRsMk9iamVjdCB7CisgIEdzdEVsZW1lbnQgKiBlbGVtZW50OworICBHc3RPYmplY3QgKiBkYmdfb2JqOworCisgIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlOyAgIC8qIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgKi8KKworICAvKiB0aGUgdmlkZW8gZGV2aWNlICovCisgIGNoYXIgKnZpZGVvZGV2OworCisgIC8qIHRoZSB2aWRlby1kZXZpY2UncyBmaWxlIGRlc2NyaXB0b3IgKi8KKyAgZ2ludCB2aWRlb19mZDsKKyAgR3N0VjRsMklPTW9kZSBtb2RlOworCisgIGdib29sZWFuIGFjdGl2ZTsKKyAgZ2Jvb2xlYW4gc3RyZWFtaW5nOworCisgIC8qIHRoZSBjdXJyZW50IGZvcm1hdCAqLworICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmbXRkZXNjOworICBzdHJ1Y3QgdjRsMl9mb3JtYXQgZm9ybWF0OworICBHc3RWaWRlb0luZm8gaW5mbzsKKyAgR3N0VmlkZW9BbGlnbm1lbnQgYWxpZ247CisKKyAgLyogRmVhdHVyZXMgKi8KKyAgZ2Jvb2xlYW4gbmVlZF92aWRlb19tZXRhOworICBnYm9vbGVhbiBoYXNfYWxwaGFfY29tcG9uZW50OworCisgIC8qIG9ubHkgdXNlZCBpZiB0aGUgZGV2aWNlIHN1cHBvcnRzIE1QTEFORQorICAgKiBuYiBwbGFuZXMgaXMgbWVhbmluZyBvZiB2NGwyIHBsYW5lcworICAgKiB0aGUgZ3N0cmVhbWVyIGVxdWl2YWxlbnQgaXMgZ3N0X2J1ZmZlcl9uX21lbW9yeQorICAgKi8KKyAgZ2ludCBuX3Y0bDJfcGxhbmVzOworCisgIC8qIFdlIGNhY2hlIHRoZSBmcmFtZSBkdXJhdGlvbiBpZiBrbm93biAqLworICBHc3RDbG9ja1RpbWUgZHVyYXRpb247CisKKyAgLyogaWYgdGhlIE1QTEFORSBkZXZpY2Ugc3VwcG9ydCBib3RoIGNvbnRpZ3VvdXMgYW5kIG5vbiBjb250aWd1b3VzCisgICAqIGl0IGFsbG93cyB0byBzZWxlY3Qgd2hpY2ggb25lIHdlIHdhbnQuIEJ1dCB3ZSBwcmVmZXJlZF9ub25fY29udGlndW91cworICAgKiBub24gY29udGlndW91cyBtb2RlLgorICAgKi8KKyAgZ2Jvb2xlYW4gcHJlZmVyZWRfbm9uX2NvbnRpZ3VvdXM7CisKKyAgLyogVGhpcyB3aWxsIGJlIHNldCBpZiBzdXBwb3J0ZWQgaW4gZGVjaWRlX2FsbG9jYXRpb24uIEl0IGNhbiBiZSB1c2VkIHRvCisgICAqIGNhbGN1bGF0ZSB0aGUgbWluaW11bSBsYXRlbmN5LiAqLworICBndWludDMyIG1pbl9idWZmZXJzOworCisgIC8qIHdhbnRlZCBtb2RlICovCisgIEdzdFY0bDJJT01vZGUgcmVxX21vZGU7CisKKyAgLyogb3B0aW9uYWwgcG9vbCAqLworICBHc3RCdWZmZXJQb29sICpwb29sOworCisgIC8qIHRoZSB2aWRlbyBkZXZpY2UncyBjYXBhYmlsaXRpZXMgKi8KKyAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSB2Y2FwOworICAvKiBvcGVuZWQgZGV2aWNlIHNwZWNpZmljIGNhcGFiaWxpdGllcyAqLworICBndWludDMyIGRldmljZV9jYXBzOworCisgIC8qIGxpc3RzLi4uICovCisgIEdTTGlzdCAqZm9ybWF0czsgICAgICAgICAgICAgIC8qIGxpc3Qgb2YgYXZhaWxhYmxlIGNhcHR1cmUgZm9ybWF0cyAqLworICBHc3RDYXBzICpwcm9iZWRfY2FwczsKKworICBHTGlzdCAqY29sb3JzOworICBHTGlzdCAqbm9ybXM7CisgIEdMaXN0ICpjaGFubmVsczsKKyAgR0RhdGEgKmNvbnRyb2xzOworCisgIC8qIHByb3BlcnRpZXMgKi8KKyAgdjRsMl9zdGRfaWQgdHZfbm9ybTsKKyAgZ2NoYXIgKmNoYW5uZWw7CisgIGd1bG9uZyBmcmVxdWVuY3k7CisgIEdzdFN0cnVjdHVyZSAqZXh0cmFfY29udHJvbHM7CisgIGdib29sZWFuIGtlZXBfYXNwZWN0OworICBHVmFsdWUgKnBhcjsKKworICAvKiBmdW5jcyAqLworICBHc3RWNGwyR2V0SW5PdXRGdW5jdGlvbiAgZ2V0X2luX291dF9mdW5jOworICBHc3RWNGwyU2V0SW5PdXRGdW5jdGlvbiAgc2V0X2luX291dF9mdW5jOworICBHc3RWNGwyVXBkYXRlRnBzRnVuY3Rpb24gdXBkYXRlX2Zwc19mdW5jOworCisgIC8qIHN5c2NhbGxzICovCisgIGdpbnQgKCpmZF9vcGVuKSAoZ2ludCBmZCwgZ2ludCB2NGwyX2ZsYWdzKTsKKyAgZ2ludCAoKmNsb3NlKSAoZ2ludCBmZCk7CisgIGdpbnQgKCpkdXApIChnaW50IGZkKTsKKyAgZ2ludCAoKmlvY3RsKSAoZ2ludCBmZCwgZ3Vsb25nIHJlcXVlc3QsIC4uLik7CisgIGdzc2l6ZSAoKnJlYWQpIChnaW50IGZkLCBncG9pbnRlciBidWZmZXIsIGdzaXplIG4pOworICBncG9pbnRlciAoKm1tYXApIChncG9pbnRlciBzdGFydCwgZ3NpemUgbGVuZ3RoLCBnaW50IHByb3QsIGdpbnQgZmxhZ3MsCisgICAgICBnaW50IGZkLCBnaW50NjQgb2Zmc2V0KTsKKyAgZ2ludCAoKm11bm1hcCkgKGdwb2ludGVyIF9zdGFydCwgZ3NpemUgbGVuZ3RoKTsKKworICAvKiBRdWlya3MgKi8KKyAgLyogU2tpcHMgaW50ZXJsYWNpbmcgcHJvYmVzICovCisgIGdib29sZWFuIG5ldmVyX2ludGVybGFjZWQ7CisgIC8qIEFsbG93IHRvIHNraXAgcmVhZGluZyBpbml0aWFsIGZvcm1hdCB0aHJvdWdoIEdfRk1ULiBTb21lIGRldmljZXMKKyAgICoganVzdCBmYWlscyBpZiB5b3UgZG9uJ3QgY2FsbCBTX0ZNVCBmaXJzdC4gKGV4OiBNMk0gZGVjb2RlcnMpICovCisgIGdib29sZWFuIG5vX2luaXRpYWxfZm9ybWF0OworICAvKiBBdm9pZCBhbnkgdHJ5X2ZtdCBwcm9iZS4gVGhpcyBpcyB1c2VkIGJ5IHY0bDJzcmMgdG8gc3BlZWR1cCBzdGFydCB1cCB0aW1lCisgICAqIG9uIHNsb3cgVVNCIGZpcm13YXJlcy4gV2hlbiB0aGlzIGlzIHNldCwgZ3N0X3Y0bDJfc2V0X2Zvcm1hdCgpIHdpbGwgbW9kaWZ5CisgICAqIHRoZSBjYXBzIHRvIHJlZmxlY3Qgd2hhdCB3YXMgbmVnb3RpYXRlZCBkdXJpbmcgZml4YXRpb24gKi8KKyAgZ2Jvb2xlYW4gc2tpcF90cnlfZm10X3Byb2JlczsKK307CisKK3N0cnVjdCBfR3N0VjRsMk9iamVjdENsYXNzSGVscGVyIHsKKyAgLyogcHJvYmVkIGRldmljZXMgKi8KKyAgR0xpc3QgKmRldmljZXM7Cit9OworCitHVHlwZSBnc3RfdjRsMl9vYmplY3RfZ2V0X3R5cGUgKHZvaWQpOworCisjZGVmaW5lIFY0TDJfU1REX09CSkVDVF9QUk9QUyBcCisgICAgUFJPUF9ERVZJQ0UsICAgICAgICAgICAgICBcCisgICAgUFJPUF9ERVZJQ0VfTkFNRSwgICAgICAgICBcCisgICAgUFJPUF9ERVZJQ0VfRkQsICAgICAgICAgICBcCisgICAgUFJPUF9GTEFHUywgICAgICAgICAgICAgICBcCisgICAgUFJPUF9CUklHSFRORVNTLCAgICAgICAgICBcCisgICAgUFJPUF9DT05UUkFTVCwgICAgICAgICAgICBcCisgICAgUFJPUF9TQVRVUkFUSU9OLCAgICAgICAgICBcCisgICAgUFJPUF9IVUUsICAgICAgICAgICAgICAgICBcCisgICAgUFJPUF9UVl9OT1JNLCAgICAgICAgICAgICBcCisgICAgUFJPUF9JT19NT0RFLCAgICAgICAgICAgICBcCisgICAgUFJPUF9PVVRQVVRfSU9fTU9ERSwgICAgICBcCisgICAgUFJPUF9DQVBUVVJFX0lPX01PREUsICAgICBcCisgICAgUFJPUF9FWFRSQV9DT05UUk9MUywgICAgICBcCisgICAgUFJPUF9QSVhFTF9BU1BFQ1RfUkFUSU8sICBcCisgICAgUFJPUF9GT1JDRV9BU1BFQ1RfUkFUSU8KKworLyogY3JlYXRlL2Rlc3Ryb3kgKi8KK0dzdFY0bDJPYmplY3QqICBnc3RfdjRsMl9vYmplY3RfbmV3ICAgICAgIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RPYmplY3QgKiBkYmdfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gdjRsMl9idWZfdHlwZSAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogZGVmYXVsdF9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VjRsMkdldEluT3V0RnVuY3Rpb24gZ2V0X2luX291dF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFY0bDJTZXRJbk91dEZ1bmN0aW9uIHNldF9pbl9vdXRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RWNGwyVXBkYXRlRnBzRnVuY3Rpb24gdXBkYXRlX2Zwc19mdW5jKTsKKwordm9pZCAgICAgICAgIGdzdF92NGwyX29iamVjdF9kZXN0cm95ICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KTsKKworLyogcHJvcGVydGllcyAqLworCit2b2lkICAgICAgICAgZ3N0X3Y0bDJfb2JqZWN0X2luc3RhbGxfcHJvcGVydGllc19oZWxwZXIgKEdPYmplY3RDbGFzcyAqIGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBkZWZhdWx0X2RldmljZSk7CisKK3ZvaWQgICAgICAgICBnc3RfdjRsMl9vYmplY3RfaW5zdGFsbF9tMm1fcHJvcGVydGllc19oZWxwZXIgKEdPYmplY3RDbGFzcyAqIGdvYmplY3RfY2xhc3MpOworCitnYm9vbGVhbiAgICAgZ3N0X3Y0bDJfb2JqZWN0X3NldF9wcm9wZXJ0eV9oZWxwZXIgICAgICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludCBwcm9wX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK2dib29sZWFuICAgICBnc3RfdjRsMl9vYmplY3RfZ2V0X3Byb3BlcnR5X2hlbHBlciAgICAgICAoR3N0VjRsMk9iamVjdCAqdjRsMm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQYXJhbVNwZWMgKiBwc3BlYyk7CisvKiBvcGVuL2Nsb3NlICovCitnYm9vbGVhbiAgICAgZ3N0X3Y0bDJfb2JqZWN0X29wZW4gICAgICAgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpOworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX29iamVjdF9vcGVuX3NoYXJlZCAgICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBHc3RWNGwyT2JqZWN0ICogb3RoZXIpOworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX29iamVjdF9jbG9zZSAgICAgICAgICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KTsKKworLyogcHJvYmluZyAqLworCitHc3RDYXBzKiAgICAgZ3N0X3Y0bDJfb2JqZWN0X2dldF9hbGxfY2FwcyAodm9pZCk7CisKK0dzdENhcHMqICAgICBnc3RfdjRsMl9vYmplY3RfZ2V0X3Jhd19jYXBzICh2b2lkKTsKKworR3N0Q2FwcyogICAgIGdzdF92NGwyX29iamVjdF9nZXRfY29kZWNfY2FwcyAodm9pZCk7CisKK2dpbnQgICAgICAgICBnc3RfdjRsMl9vYmplY3RfZXh0cmFwb2xhdGVfc3RyaWRlIChjb25zdCBHc3RWaWRlb0Zvcm1hdEluZm8gKiBmaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCBwbGFuZSwgZ2ludCBzdHJpZGUpOworCitnYm9vbGVhbiAgICAgZ3N0X3Y0bDJfb2JqZWN0X3NldF9mb3JtYXQgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgR3N0Q2FwcyAqIGNhcHMsIEdzdFY0bDJFcnJvciAqIGVycm9yKTsKK2dib29sZWFuICAgICBnc3RfdjRsMl9vYmplY3RfdHJ5X2Zvcm1hdCAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBHc3RDYXBzICogY2FwcywgR3N0VjRsMkVycm9yICogZXJyb3IpOworCitnYm9vbGVhbiAgICAgZ3N0X3Y0bDJfb2JqZWN0X2NhcHNfZXF1YWwgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgR3N0Q2FwcyAqIGNhcHMpOworCitnYm9vbGVhbiAgICAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9jayAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCk7CitnYm9vbGVhbiAgICAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9ja19zdG9wIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCk7CisKK2dib29sZWFuICAgICBnc3RfdjRsMl9vYmplY3Rfc3RvcCAgICAgICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KTsKKworR3N0Q2FwcyAqICAgIGdzdF92NGwyX29iamVjdF9wcm9iZV9jYXBzICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIEdzdENhcHMgKiBmaWx0ZXIpOworR3N0Q2FwcyAqICAgIGdzdF92NGwyX29iamVjdF9nZXRfY2FwcyAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIEdzdENhcHMgKiBmaWx0ZXIpOworCitnYm9vbGVhbiAgICAgZ3N0X3Y0bDJfb2JqZWN0X2FjcXVpcmVfZm9ybWF0IChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgR3N0VmlkZW9JbmZvICogaW5mbyk7CisKK2dib29sZWFuICAgICBnc3RfdjRsMl9vYmplY3Rfc2V0X2Nyb3AgICAgKEdzdFY0bDJPYmplY3QgKiBvYmopOworCitnYm9vbGVhbiAgICAgZ3N0X3Y0bDJfb2JqZWN0X2RlY2lkZV9hbGxvY2F0aW9uIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgR3N0UXVlcnkgKiBxdWVyeSk7CisKK2dib29sZWFuICAgICBnc3RfdjRsMl9vYmplY3RfcHJvcG9zZV9hbGxvY2F0aW9uIChHc3RWNGwyT2JqZWN0ICogb2JqLCBHc3RRdWVyeSAqIHF1ZXJ5KTsKKworR3N0U3RydWN0dXJlICogZ3N0X3Y0bDJfb2JqZWN0X3Y0bDJmb3VyY2NfdG9fc3RydWN0dXJlIChndWludDMyIGZvdXJjYyk7CisKKy8qIFRPRE8gTW92ZSB0byBwcm9wZXIgbmFtZXNwYWNlICovCisvKiBvcGVuL2Nsb3NlIHRoZSBkZXZpY2UgKi8KK2dib29sZWFuICAgICBnc3RfdjRsMl9vcGVuICAgICAgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpOworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX2R1cCAgICAgICAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgR3N0VjRsMk9iamVjdCAqIG90aGVyKTsKK2dib29sZWFuICAgICBnc3RfdjRsMl9jbG9zZSAgICAgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpOworCisvKiBub3JtL2lucHV0L291dHB1dCAqLworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX2dldF9ub3JtICAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgdjRsMl9zdGRfaWQgKiBub3JtKTsKK2dib29sZWFuICAgICBnc3RfdjRsMl9zZXRfbm9ybSAgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIHY0bDJfc3RkX2lkIG5vcm0pOworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX2dldF9pbnB1dCAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgZ2ludCAqIGlucHV0KTsKK2dib29sZWFuICAgICBnc3RfdjRsMl9zZXRfaW5wdXQgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIGdpbnQgaW5wdXQpOworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX2dldF9vdXRwdXQgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgZ2ludCAqIG91dHB1dCk7CitnYm9vbGVhbiAgICAgZ3N0X3Y0bDJfc2V0X291dHB1dCAgICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBnaW50IG91dHB1dCk7CisKKy8qIGZyZXF1ZW5jeSBjb250cm9sICovCitnYm9vbGVhbiAgICAgZ3N0X3Y0bDJfZ2V0X2ZyZXF1ZW5jeSAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgZ2ludCB0dW5lcm51bSwgZ3Vsb25nICogZnJlcXVlbmN5KTsKK2dib29sZWFuICAgICBnc3RfdjRsMl9zZXRfZnJlcXVlbmN5ICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBnaW50IHR1bmVybnVtLCBndWxvbmcgZnJlcXVlbmN5KTsKK2dib29sZWFuICAgICBnc3RfdjRsMl9zaWduYWxfc3RyZW5ndGggKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBnaW50IHR1bmVybnVtLCBndWxvbmcgKiBzaWduYWwpOworCisvKiBhdHRyaWJ1dGUgY29udHJvbCAqLworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX2dldF9hdHRyaWJ1dGUgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIGludCBhdHRyaWJ1dGUsIGludCAqIHZhbHVlKTsKK2dib29sZWFuICAgICBnc3RfdjRsMl9zZXRfYXR0cmlidXRlICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBpbnQgYXR0cmlidXRlLCBjb25zdCBpbnQgdmFsdWUpOworZ2Jvb2xlYW4gICAgIGdzdF92NGwyX3NldF9jb250cm9scyAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIEdzdFN0cnVjdHVyZSAqIGNvbnRyb2xzKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1Y0TDJfT0JKRUNUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMnJhZGlvLmMgYi9zeXMvdjRsMi9nc3R2NGwycmFkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmZiZWZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMnJhZGlvLmMKQEAgLTAsMCArMSw1ODIgQEAKKy8qIEdTdHJlYW1lciB2NGwyIHJhZGlvIHR1bmVyIGVsZW1lbnQKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSBBbGV4ZXkgQ2hlcm5vdiA8NGVybm92QGdtYWlsLmNvbT4KKyAqCisgKiBnc3R2NGwycmFkaW8uYyAtIFY0TDIgcmFkaW8gdHVuZXIgZWxlbWVudAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXY0bDJyYWRpbworICoKKyAqIHY0bDJyYWRpbyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHJhZGlvIGRldmljZQorICogYW5kIHRvIHR1bmUgaXQgdG8gZGlmZmVyZW50IHJhZGlvc3RhdGlvbnMuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB2NGwycmFkaW8gZGV2aWNlPS9kZXYvcmFkaW8wIGZyZXF1ZW5jeT0xMDEyMDAwMDAKKyAqIGdzdC1sYXVuY2gtMS4wIGFsc2FzcmMgZGV2aWNlPWh3OjEgISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgYWxzYXNpbmsKKyAqIF18CisgKiBGaXJzdCBwaXBlbGluZSB0dW5lcyB0aGUgcmFkaW8gZGV2aWNlIC9kZXYvcmFkaW8wIHRvIHN0YXRpb24gMTAxLjIgTUh6LAorICogc2Vjb25kIHBpcGVsaW5lIGNvbm5lY3RzIGRpZ2l0YWwgYXVkaW8gb3V0IChodzoxKSB0byBkZWZhdWx0IHNvdW5kIGNhcmQuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ3N0L2dzdC1pMThuLXBsdWdpbi5oIgorCisjaW5jbHVkZSAiZ3N0djRsMm9iamVjdC5oIgorI2luY2x1ZGUgImdzdHY0bDJ0dW5lci5oIgorI2luY2x1ZGUgImdzdHY0bDJyYWRpby5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDICh2NGwycmFkaW9fZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgdjRsMnJhZGlvX2RlYnVnCisKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0RFVklDRSAiL2Rldi9yYWRpbzAiCisjZGVmaW5lIE1JTl9GUkVRVUVOQ1kJCSA4NzUwMDAwMAorI2RlZmluZSBERUZBVUxUX0ZSRVFVRU5DWQkxMDAwMDAwMDAKKyNkZWZpbmUgTUFYX0ZSRVFVRU5DWQkJMTA4MDAwMDAwCisKK2VudW0KK3sKKyAgQVJHXzAsCisgIEFSR19ERVZJQ0UsCisgIEFSR19GUkVRVUVOQ1kKK307CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJyYWRpb19maWxsX2NoYW5uZWxfbGlzdCAoR3N0VjRsMlJhZGlvICogcmFkaW8pCit7CisgIGludCByZXM7CisgIHN0cnVjdCB2NGwyX3R1bmVyIHZ0dW47CisgIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgdmM7CisgIEdzdFY0bDJUdW5lckNoYW5uZWwgKnY0bDJjaGFubmVsOworICBHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWw7CisKKyAgR3N0RWxlbWVudCAqZTsKKworICBHc3RWNGwyT2JqZWN0ICp2NGwyb2JqZWN0OworCisgIGUgPSBHU1RfRUxFTUVOVCAocmFkaW8pOworICB2NGwyb2JqZWN0ID0gcmFkaW8tPnY0bDJvYmplY3Q7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZSwgImdldHRpbmcgYXVkaW8gZW51bWVyYXRpb24iKTsKKyAgR1NUX1Y0TDJfQ0hFQ0tfT1BFTiAodjRsMm9iamVjdCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZSwgIiAgYXVkaW8gaW5wdXQiKTsKKworICBtZW1zZXQgKCZ2YywgMCwgc2l6ZW9mICh2YykpOworCisgIHJlcyA9IHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX1FVRVJZQ0FQLCAmdmMpOworICBpZiAocmVzIDwgMCkKKyAgICBnb3RvIGNhcHNfZmFpbGVkOworCisgIGlmICh2Yy5jYXBhYmlsaXRpZXMgJiBWNEwyX0NBUF9ERVZJQ0VfQ0FQUykKKyAgICB2NGwyb2JqZWN0LT5kZXZpY2VfY2FwcyA9IHZjLmRldmljZV9jYXBzOworICBlbHNlCisgICAgdjRsMm9iamVjdC0+ZGV2aWNlX2NhcHMgPSB2Yy5jYXBhYmlsaXRpZXM7CisKKyAgaWYgKCEodjRsMm9iamVjdC0+ZGV2aWNlX2NhcHMgJiBWNEwyX0NBUF9UVU5FUikpCisgICAgZ290byBub3RfYV90dW5lcjsKKworICAvKiBnZXR0aW5nIGF1ZGlvIGlucHV0ICovCisgIG1lbXNldCAoJnZ0dW4sIDAsIHNpemVvZiAodnR1bikpOworICB2dHVuLmluZGV4ID0gMDsKKworICByZXMgPSB2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19HX1RVTkVSLCAmdnR1bik7CisgIGlmIChyZXMgPCAwKQorICAgIGdvdG8gdHVuZXJfZmFpbGVkOworCisgIEdTVF9MT0dfT0JKRUNUIChlLCAiICAgaW5kZXg6ICAgICAlZCIsIHZ0dW4uaW5kZXgpOworICBHU1RfTE9HX09CSkVDVCAoZSwgIiAgIG5hbWU6ICAgICAgJyVzJyIsIHZ0dW4ubmFtZSk7CisgIEdTVF9MT0dfT0JKRUNUIChlLCAiICAgdHlwZTogICAgICAlMDE2eCIsIChndWludCkgdnR1bi50eXBlKTsKKyAgR1NUX0xPR19PQkpFQ1QgKGUsICIgICBjYXBzOiAgICAgICUwMTZ4IiwgKGd1aW50KSB2dHVuLmNhcGFiaWxpdHkpOworICBHU1RfTE9HX09CSkVDVCAoZSwgIiAgIHJsb3c6ICAgICAgJTAxNngiLCAoZ3VpbnQpIHZ0dW4ucmFuZ2Vsb3cpOworICBHU1RfTE9HX09CSkVDVCAoZSwgIiAgIHJoaWdoOiAgICAgJTAxNngiLCAoZ3VpbnQpIHZ0dW4ucmFuZ2VoaWdoKTsKKyAgR1NUX0xPR19PQkpFQ1QgKGUsICIgICBhdWRtb2RlOiAgICUwMTZ4IiwgKGd1aW50KSB2dHVuLmF1ZG1vZGUpOworCisgIHY0bDJjaGFubmVsID0gZ19vYmplY3RfbmV3IChHU1RfVFlQRV9WNEwyX1RVTkVSX0NIQU5ORUwsIE5VTEwpOworICBjaGFubmVsID0gR1NUX1RVTkVSX0NIQU5ORUwgKHY0bDJjaGFubmVsKTsKKyAgY2hhbm5lbC0+bGFiZWwgPSBnX3N0cmR1cCAoKGNvbnN0IGdjaGFyICopIHZ0dW4ubmFtZSk7CisgIGNoYW5uZWwtPmZsYWdzID0gR1NUX1RVTkVSX0NIQU5ORUxfRlJFUVVFTkNZIHwgR1NUX1RVTkVSX0NIQU5ORUxfQVVESU87CisgIHY0bDJjaGFubmVsLT5pbmRleCA9IDA7CisgIHY0bDJjaGFubmVsLT50dW5lciA9IDA7CisKKyAgY2hhbm5lbC0+ZnJlcV9tdWx0aXBsaWNhdG9yID0KKyAgICAgIDYyLjUgKiAoKHZ0dW4uY2FwYWJpbGl0eSAmIFY0TDJfVFVORVJfQ0FQX0xPVykgPyAxIDogMTAwMCk7CisgIGNoYW5uZWwtPm1pbl9mcmVxdWVuY3kgPSB2dHVuLnJhbmdlbG93ICogY2hhbm5lbC0+ZnJlcV9tdWx0aXBsaWNhdG9yOworICBjaGFubmVsLT5tYXhfZnJlcXVlbmN5ID0gdnR1bi5yYW5nZWhpZ2ggKiBjaGFubmVsLT5mcmVxX211bHRpcGxpY2F0b3I7CisgIGNoYW5uZWwtPm1pbl9zaWduYWwgPSAwOworICBjaGFubmVsLT5tYXhfc2lnbmFsID0gMHhmZmZmOworCisgIHY0bDJvYmplY3QtPmNoYW5uZWxzID0KKyAgICAgIGdfbGlzdF9wcmVwZW5kICh2NGwyb2JqZWN0LT5jaGFubmVscywgKGdwb2ludGVyKSBjaGFubmVsKTsKKworICB2NGwyb2JqZWN0LT5jaGFubmVscyA9IGdfbGlzdF9yZXZlcnNlICh2NGwyb2JqZWN0LT5jaGFubmVscyk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZSwgImRvbmUiKTsKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCit0dW5lcl9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZSwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiRmFpbGVkIHRvIGdldCBzZXR0aW5ncyBvZiB0dW5lciAlZCBvbiBkZXZpY2UgJyVzJy4iKSwKKyAgICAgICAgICAgIHZ0dW4uaW5kZXgsIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitjYXBzX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChlLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJFcnJvciBnZXR0aW5nIGNhcGFiaWxpdGllcyBmb3IgZGV2aWNlICclcycuIiksCisgICAgICAgICAgICB2NGwyb2JqZWN0LT52aWRlb2RldiksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorbm90X2FfdHVuZXI6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZSwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiRGV2aWNlICclcycgaXMgbm90IGEgdHVuZXIuIiksCisgICAgICAgICAgICB2NGwyb2JqZWN0LT52aWRlb2RldiksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwycmFkaW9fZ2V0X2lucHV0IChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgZ2ludCAqIGlucHV0KQoreworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5lbGVtZW50LCAidHJ5aW5nIHRvIGdldCByYWRpbyBpbnB1dCIpOworCisgIGlmICghR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICghdjRsMm9iamVjdC0+Y2hhbm5lbHMpCisgICAgZ290byBpbnB1dF9mYWlsZWQ7CisKKyAgKmlucHV0ID0gMDsKKworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5lbGVtZW50LCAiaW5wdXQ6ICVkIiwgMCk7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitpbnB1dF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJGYWlsZWQgdG8gZ2V0IHJhZGlvIGlucHV0IG9uIGRldmljZSAnJXMnLiAiKSwKKyAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJyYWRpb19zZXRfaW5wdXQgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBnaW50IGlucHV0KQoreworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5lbGVtZW50LCAidHJ5aW5nIHRvIHNldCBpbnB1dCB0byAlZCIsIGlucHV0KTsKKworICBpZiAoIUdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIXY0bDJvYmplY3QtPmNoYW5uZWxzKQorICAgIGdvdG8gaW5wdXRfZmFpbGVkOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworaW5wdXRfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIiksCisgICAgICAgICAgICBpbnB1dCwgdjRsMm9iamVjdC0+dmlkZW9kZXYpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMnJhZGlvX3NldF9tdXRlX29uIChHc3RWNGwyUmFkaW8gKiByYWRpbywgZ2Jvb2xlYW4gb24pCit7CisgIGdpbnQgcmVzOworICBzdHJ1Y3QgdjRsMl9jb250cm9sIHZjdHJsOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHJhZGlvLCAic2V0dGluZyBjdXJyZW50IHR1bmVyIG11dGUgc3RhdGU6ICVkIiwgb24pOworCisgIGlmICghR1NUX1Y0TDJfSVNfT1BFTiAocmFkaW8tPnY0bDJvYmplY3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBtZW1zZXQgKCZ2Y3RybCwgMCwgc2l6ZW9mICh2Y3RybCkpOworICB2Y3RybC5pZCA9IFY0TDJfQ0lEX0FVRElPX01VVEU7CisgIHZjdHJsLnZhbHVlID0gb247CisKKyAgR1NUX0RFQlVHX09CSkVDVCAocmFkaW8sICJyYWRpbyBmZDogJWQiLCByYWRpby0+djRsMm9iamVjdC0+dmlkZW9fZmQpOworCisgIHJlcyA9IGlvY3RsIChyYWRpby0+djRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19TX0NUUkwsICZ2Y3RybCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHJhZGlvLCAibXV0ZSBzdGF0ZSBjaGFuZ2UgcmVzdWx0OiAlZCIsIHJlcyk7CisgIGlmIChyZXMgPCAwKQorICAgIGdvdG8gZnJlcV9mYWlsZWQ7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitmcmVxX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHJhZGlvLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJGYWlsZWQgdG8gY2hhbmdlIG11dGUgc3RhdGUgZm9yIGRldmljZSAnJXMnLiIpLAorICAgICAgICAgICAgcmFkaW8tPnY0bDJvYmplY3QtPnZpZGVvZGV2KSwgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJyYWRpb19zZXRfbXV0ZSAoR3N0VjRsMlJhZGlvICogcmFkaW8pCit7CisgIHJldHVybiBnc3RfdjRsMnJhZGlvX3NldF9tdXRlX29uIChyYWRpbywgVFJVRSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJyYWRpb19zZXRfdW5tdXRlIChHc3RWNGwyUmFkaW8gKiByYWRpbykKK3sKKyAgcmV0dXJuIGdzdF92NGwycmFkaW9fc2V0X211dGVfb24gKHJhZGlvLCBGQUxTRSk7Cit9CisKK0dTVF9JTVBMRU1FTlRfVjRMMl9UVU5FUl9NRVRIT0RTIChHc3RWNGwyUmFkaW8sIGdzdF92NGwycmFkaW8pOworCitzdGF0aWMgdm9pZCBnc3RfdjRsMnJhZGlvX3VyaV9oYW5kbGVyX2luaXQgKGdwb2ludGVyIGdfaWZhY2UsCisgICAgZ3BvaW50ZXIgaWZhY2VfZGF0YSk7CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMnJhZGlvX3R1bmVyX2ludGVyZmFjZV9yZWluaXQgKEdzdFR1bmVySW50ZXJmYWNlICogaWZhY2UpCit7CisgIGdzdF92NGwycmFkaW9fdHVuZXJfaW50ZXJmYWNlX2luaXQgKGlmYWNlKTsKK30KKworI2RlZmluZSBnc3RfdjRsMnJhZGlvX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEVfV0lUSF9DT0RFIChHc3RWNGwyUmFkaW8sIGdzdF92NGwycmFkaW8sIEdTVF9UWVBFX0VMRU1FTlQsCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9VUklfSEFORExFUiwKKyAgICAgICAgZ3N0X3Y0bDJyYWRpb191cmlfaGFuZGxlcl9pbml0KTsKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1RVTkVSLAorICAgICAgICBnc3RfdjRsMnJhZGlvX3R1bmVyX2ludGVyZmFjZV9yZWluaXQpKTsKKworc3RhdGljIHZvaWQgZ3N0X3Y0bDJyYWRpb19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYyk7CitzdGF0aWMgdm9pZCBnc3RfdjRsMnJhZGlvX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF92NGwycmFkaW9fZmluYWxpemUgKEdzdFY0bDJSYWRpbyAqIHJhZGlvKTsKK3N0YXRpYyB2b2lkIGdzdF92NGwycmFkaW9fZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gZ3N0X3Y0bDJyYWRpb19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJyYWRpb19jbGFzc19pbml0IChHc3RWNGwyUmFkaW9DbGFzcyAqIGtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZ3N0ZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0ZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IGdzdF92NGwycmFkaW9fZGlzcG9zZTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAoR09iamVjdEZpbmFsaXplRnVuYykgZ3N0X3Y0bDJyYWRpb19maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3Y0bDJyYWRpb19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF92NGwycmFkaW9fZ2V0X3Byb3BlcnR5OworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIEFSR19ERVZJQ0UsCisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgiZGV2aWNlIiwgIlJhZGlvIGRldmljZSBsb2NhdGlvbiIsCisgICAgICAgICAgIlZpZGVvNExpbnV4MiByYWRpbyBkZXZpY2UgbG9jYXRpb24iLAorICAgICAgICAgIERFRkFVTFRfUFJPUF9ERVZJQ0UsIEdfUEFSQU1fUkVBRFdSSVRFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgQVJHX0ZSRVFVRU5DWSwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJmcmVxdWVuY3kiLCAiU3RhdGlvbiBmcmVxdWVuY3kiLAorICAgICAgICAgICJTdGF0aW9uIGZyZXF1ZW5jeSBpbiBIeiIsCisgICAgICAgICAgTUlOX0ZSRVFVRU5DWSwgTUFYX0ZSRVFVRU5DWSwgREVGQVVMVF9GUkVRVUVOQ1ksIEdfUEFSQU1fUkVBRFdSSVRFKSk7CisKKyAgZ3N0ZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMnJhZGlvX2NoYW5nZV9zdGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZ3N0ZWxlbWVudF9jbGFzcywKKyAgICAgICJSYWRpbyAodmlkZW80bGludXgyKSBUdW5lciIsCisgICAgICAiVHVuZXIiLAorICAgICAgIkNvbnRyb2xzIGEgVmlkZW80TGludXgyIHJhZGlvIGRldmljZSIsCisgICAgICAiQWxleGV5IENoZXJub3YgPDRlcm5vdkBnbWFpbC5jb20+Iik7CisKKyAga2xhc3MtPnY0bDJfY2xhc3NfZGV2aWNlcyA9IE5VTEw7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHY0bDJyYWRpb19kZWJ1ZywgInY0bDJyYWRpbyIsIDAsCisgICAgICAiVjRsMiByYWRpbyBlbGVtZW50Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMnJhZGlvX2luaXQgKEdzdFY0bDJSYWRpbyAqIGZpbHRlcikKK3sKKyAgZmlsdGVyLT52NGwyb2JqZWN0ID0gZ3N0X3Y0bDJfb2JqZWN0X25ldyAoR1NUX0VMRU1FTlQgKGZpbHRlciksCisgICAgICBHU1RfT0JKRUNUIChmaWx0ZXIpLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsIERFRkFVTFRfUFJPUF9ERVZJQ0UsCisgICAgICBnc3RfdjRsMnJhZGlvX2dldF9pbnB1dCwgZ3N0X3Y0bDJyYWRpb19zZXRfaW5wdXQsIE5VTEwpOworCisgIGZpbHRlci0+djRsMm9iamVjdC0+ZnJlcXVlbmN5ID0gREVGQVVMVF9GUkVRVUVOQ1k7CisgIGdfZnJlZSAoZmlsdGVyLT52NGwyb2JqZWN0LT52aWRlb2Rldik7CisgIGZpbHRlci0+djRsMm9iamVjdC0+dmlkZW9kZXYgPSBnX3N0cmR1cCAoREVGQVVMVF9QUk9QX0RFVklDRSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMnJhZGlvX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFY0bDJSYWRpbyAqcmFkaW8gPSBHU1RfVjRMMlJBRElPIChvYmplY3QpOworICBnc3RfdjRsMl9jbG9zZSAocmFkaW8tPnY0bDJvYmplY3QpOworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwycmFkaW9fZmluYWxpemUgKEdzdFY0bDJSYWRpbyAqIHJhZGlvKQoreworICBnc3RfdjRsMl9vYmplY3RfZGVzdHJveSAocmFkaW8tPnY0bDJvYmplY3QpOworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKChHT2JqZWN0ICopIChyYWRpbykpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwycmFkaW9fb3BlbiAoR3N0VjRsMlJhZGlvICogcmFkaW8pCit7CisgIEdzdFY0bDJPYmplY3QgKnY0bDJvYmplY3Q7CisKKyAgdjRsMm9iamVjdCA9IHJhZGlvLT52NGwyb2JqZWN0OworICBpZiAoZ3N0X3Y0bDJfb3BlbiAodjRsMm9iamVjdCkpCisgICAgcmV0dXJuIGdzdF92NGwycmFkaW9fZmlsbF9jaGFubmVsX2xpc3QgKHJhZGlvKTsKKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwycmFkaW9fc2V0X2RlZmF1bHRzIChHc3RWNGwyUmFkaW8gKiByYWRpbykKK3sKKyAgR3N0VjRsMk9iamVjdCAqdjRsMm9iamVjdDsKKyAgR3N0VHVuZXJDaGFubmVsICpjaGFubmVsID0gTlVMTDsKKyAgR3N0VHVuZXIgKnR1bmVyOworCisgIHY0bDJvYmplY3QgPSByYWRpby0+djRsMm9iamVjdDsKKworICBpZiAoIUdTVF9JU19UVU5FUiAodjRsMm9iamVjdC0+ZWxlbWVudCkpCisgICAgcmV0dXJuOworCisgIHR1bmVyID0gR1NUX1RVTkVSICh2NGwyb2JqZWN0LT5lbGVtZW50KTsKKworICBpZiAodjRsMm9iamVjdC0+Y2hhbm5lbCkKKyAgICBjaGFubmVsID0gZ3N0X3R1bmVyX2ZpbmRfY2hhbm5lbF9ieV9uYW1lICh0dW5lciwgdjRsMm9iamVjdC0+Y2hhbm5lbCk7CisgIGlmIChjaGFubmVsKSB7CisgICAgZ3N0X3R1bmVyX3NldF9jaGFubmVsICh0dW5lciwgY2hhbm5lbCk7CisgIH0gZWxzZSB7CisgICAgY2hhbm5lbCA9CisgICAgICAgIEdTVF9UVU5FUl9DSEFOTkVMIChnc3RfdHVuZXJfZ2V0X2NoYW5uZWwgKEdTVF9UVU5FUgorICAgICAgICAgICAgKHY0bDJvYmplY3QtPmVsZW1lbnQpKSk7CisgICAgaWYgKGNoYW5uZWwpIHsKKyAgICAgIGdfZnJlZSAodjRsMm9iamVjdC0+Y2hhbm5lbCk7CisgICAgICB2NGwyb2JqZWN0LT5jaGFubmVsID0gZ19zdHJkdXAgKGNoYW5uZWwtPmxhYmVsKTsKKyAgICAgIGdzdF90dW5lcl9jaGFubmVsX2NoYW5nZWQgKHR1bmVyLCBjaGFubmVsKTsKKyAgICB9CisgIH0KKworICBpZiAoY2hhbm5lbAorICAgICAgJiYgR1NUX1RVTkVSX0NIQU5ORUxfSEFTX0ZMQUcgKGNoYW5uZWwsIEdTVF9UVU5FUl9DSEFOTkVMX0ZSRVFVRU5DWSkpIHsKKyAgICBpZiAodjRsMm9iamVjdC0+ZnJlcXVlbmN5ICE9IDApIHsKKyAgICAgIGdzdF90dW5lcl9zZXRfZnJlcXVlbmN5ICh0dW5lciwgY2hhbm5lbCwgdjRsMm9iamVjdC0+ZnJlcXVlbmN5KTsKKyAgICB9IGVsc2UgeworICAgICAgdjRsMm9iamVjdC0+ZnJlcXVlbmN5ID0gZ3N0X3R1bmVyX2dldF9mcmVxdWVuY3kgKHR1bmVyLCBjaGFubmVsKTsKKyAgICAgIGlmICh2NGwyb2JqZWN0LT5mcmVxdWVuY3kgPT0gMCkgeworICAgICAgICAvKiBndWVzcyAqLworICAgICAgICBnc3RfdHVuZXJfc2V0X2ZyZXF1ZW5jeSAodHVuZXIsIGNoYW5uZWwsIE1JTl9GUkVRVUVOQ1kpOworICAgICAgfSBlbHNlIHsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMnJhZGlvX3N0YXJ0IChHc3RWNGwyUmFkaW8gKiByYWRpbykKK3sKKyAgaWYgKCFnc3RfdjRsMnJhZGlvX29wZW4gKHJhZGlvKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZ3N0X3Y0bDJyYWRpb19zZXRfZGVmYXVsdHMgKHJhZGlvKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMnJhZGlvX3N0b3AgKEdzdFY0bDJSYWRpbyAqIHJhZGlvKQoreworICBpZiAoIWdzdF92NGwyX29iamVjdF9jbG9zZSAocmFkaW8tPnY0bDJvYmplY3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfdjRsMnJhZGlvX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFY0bDJSYWRpbyAqcmFkaW87CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUzsKKworICByYWRpbyA9IEdTVF9WNEwyUkFESU8gKGVsZW1lbnQpOworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIC8qc3RhcnQgcmFkaW8gKi8KKyAgICAgIGlmICghZ3N0X3Y0bDJyYWRpb19zdGFydCAocmFkaW8pKQorICAgICAgICByZXQgPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1BMQVlJTkc6CisgICAgICAvKnVubXV0ZSByYWRpbyAqLworICAgICAgaWYgKCFnc3RfdjRsMnJhZGlvX3NldF91bm11dGUgKHJhZGlvKSkKKyAgICAgICAgcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1BMQVlJTkdfVE9fUEFVU0VEOgorICAgICAgLyptdXRlIHJhZGlvICovCisgICAgICBpZiAoIWdzdF92NGwycmFkaW9fc2V0X211dGUgKHJhZGlvKSkKKyAgICAgICAgcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX1JFQURZX1RPX05VTEw6CisgICAgICAvKnN0b3AgcmFkaW8gKi8KKyAgICAgIGlmICghZ3N0X3Y0bDJyYWRpb19zdG9wIChyYWRpbykpCisgICAgICAgIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMnJhZGlvX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWNGwyUmFkaW8gKnJhZGlvID0gR1NUX1Y0TDJSQURJTyAob2JqZWN0KTsKKyAgZ2ludCBmcmVxdWVuY3k7CisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgQVJHX0RFVklDRToKKyAgICAgIGdfZnJlZSAocmFkaW8tPnY0bDJvYmplY3QtPnZpZGVvZGV2KTsKKyAgICAgIHJhZGlvLT52NGwyb2JqZWN0LT52aWRlb2RldiA9CisgICAgICAgICAgZ19zdHJkdXAgKChnY2hhciAqKSBnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSR19GUkVRVUVOQ1k6CisgICAgICBmcmVxdWVuY3kgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGlmIChmcmVxdWVuY3kgPj0gTUlOX0ZSRVFVRU5DWSAmJiBmcmVxdWVuY3kgPD0gTUFYX0ZSRVFVRU5DWSkgeworICAgICAgICByYWRpby0+djRsMm9iamVjdC0+ZnJlcXVlbmN5ID0gZnJlcXVlbmN5OworICAgICAgICBnc3RfdjRsMl9zZXRfZnJlcXVlbmN5IChyYWRpby0+djRsMm9iamVjdCwgMCwKKyAgICAgICAgICAgIHJhZGlvLT52NGwyb2JqZWN0LT5mcmVxdWVuY3kpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJyYWRpb19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VjRsMlJhZGlvICpyYWRpbyA9IEdTVF9WNEwyUkFESU8gKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBBUkdfREVWSUNFOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgcmFkaW8tPnY0bDJvYmplY3QtPnZpZGVvZGV2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHX0ZSRVFVRU5DWToKKyAgICAgIGlmIChnc3RfdjRsMl9nZXRfZnJlcXVlbmN5IChyYWRpby0+djRsMm9iamVjdCwKKyAgICAgICAgICAgICAgMCwgJihyYWRpby0+djRsMm9iamVjdC0+ZnJlcXVlbmN5KSkpCisgICAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHJhZGlvLT52NGwyb2JqZWN0LT5mcmVxdWVuY3kpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBHc3RVUklIYW5kbGVyIGludGVyZmFjZSAqLworc3RhdGljIEdzdFVSSVR5cGUKK2dzdF92NGwycmFkaW9fdXJpX2dldF90eXBlIChHVHlwZSB0eXBlKQoreworICByZXR1cm4gR1NUX1VSSV9TUkM7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqY29uc3QgKgorZ3N0X3Y0bDJyYWRpb191cmlfZ2V0X3Byb3RvY29scyAoR1R5cGUgdHlwZSkKK3sKKyAgc3RhdGljIGNvbnN0IGdjaGFyICpwcm90b2NvbHNbXSA9IHsgInJhZGlvIiwgTlVMTCB9OworCisgIHJldHVybiBwcm90b2NvbHM7Cit9CisKK3N0YXRpYyBnY2hhciAqCitnc3RfdjRsMnJhZGlvX3VyaV9nZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlcikKK3sKKyAgR3N0VjRsMlJhZGlvICpyYWRpbyA9IEdTVF9WNEwyUkFESU8gKGhhbmRsZXIpOworCisgIGlmIChyYWRpby0+djRsMm9iamVjdC0+dmlkZW9kZXYgIT0gTlVMTCkgeworICAgIGlmIChnc3RfdjRsMl9nZXRfZnJlcXVlbmN5IChyYWRpby0+djRsMm9iamVjdCwKKyAgICAgICAgICAgIDAsICYocmFkaW8tPnY0bDJvYmplY3QtPmZyZXF1ZW5jeSkpKSB7CisgICAgICByZXR1cm4gZ19zdHJkdXBfcHJpbnRmICgicmFkaW86Ly8lNC4xZiIsCisgICAgICAgICAgcmFkaW8tPnY0bDJvYmplY3QtPmZyZXF1ZW5jeSAvIDFlNik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGdfc3RyZHVwICgicmFkaW86Ly8iKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMnJhZGlvX3VyaV9zZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlciwgY29uc3QgZ2NoYXIgKiB1cmksCisgICAgR0Vycm9yICoqIGVycm9yKQoreworICBHc3RWNGwyUmFkaW8gKnJhZGlvID0gR1NUX1Y0TDJSQURJTyAoaGFuZGxlcik7CisgIGdkb3VibGUgZGZyZXE7CisgIGdpbnQgaWZyZXE7CisgIGNvbnN0IGdjaGFyICpmcmVxOworICBnY2hhciAqZW5kOworCisgIGlmIChzdHJjbXAgKHVyaSwgInJhZGlvOi8vIikgIT0gMCkgeworICAgIGZyZXEgPSB1cmkgKyA4OworCisgICAgZGZyZXEgPSBnX2FzY2lpX3N0cnRvZCAoZnJlcSwgJmVuZCk7CisKKyAgICBpZiAoZXJybm8gfHwgc3RybGVuIChlbmQpKQorICAgICAgZ290byB1cmlfZmFpbGVkOworCisgICAgaWZyZXEgPSBkZnJlcSAqIDFlNjsKKyAgICBnX29iamVjdF9zZXQgKHJhZGlvLCAiZnJlcXVlbmN5IiwgaWZyZXEsIE5VTEwpOworCisgIH0gZWxzZQorICAgIGdvdG8gdXJpX2ZhaWxlZDsKKworICByZXR1cm4gVFJVRTsKKwordXJpX2ZhaWxlZDoKKyAgZ19zZXRfZXJyb3JfbGl0ZXJhbCAoZXJyb3IsIEdTVF9VUklfRVJST1IsIEdTVF9VUklfRVJST1JfQkFEX1JFRkVSRU5DRSwKKyAgICAgICJCYWQgcmFkaW8gVVJJLCBjb3VsZCBub3QgcGFyc2UgZnJlcXVlbmN5Iik7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwycmFkaW9fdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0VVJJSGFuZGxlckludGVyZmFjZSAqaWZhY2UgPSAoR3N0VVJJSGFuZGxlckludGVyZmFjZSAqKSBnX2lmYWNlOworCisgIGlmYWNlLT5nZXRfdHlwZSA9IGdzdF92NGwycmFkaW9fdXJpX2dldF90eXBlOworICBpZmFjZS0+Z2V0X3Byb3RvY29scyA9IGdzdF92NGwycmFkaW9fdXJpX2dldF9wcm90b2NvbHM7CisgIGlmYWNlLT5nZXRfdXJpID0gZ3N0X3Y0bDJyYWRpb191cmlfZ2V0X3VyaTsKKyAgaWZhY2UtPnNldF91cmkgPSBnc3RfdjRsMnJhZGlvX3VyaV9zZXRfdXJpOworfQpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMnJhZGlvLmggYi9zeXMvdjRsMi9nc3R2NGwycmFkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmRhNGZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMnJhZGlvLmgKQEAgLTAsMCArMSw2NyBAQAorLyogR1N0cmVhbWVyIHY0bDIgcmFkaW8gdHVuZXIgZWxlbWVudAorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExIEFsZXhleSBDaGVybm92IDw0ZXJub3ZAZ21haWwuY29tPgorICoKKyAqIGdzdHY0bDJyYWRpby5oIC0gVjRMMiByYWRpbyB0dW5lciBlbGVtZW50CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9WNEwyUkFESU9fSF9fCisjZGVmaW5lIF9fR1NUX1Y0TDJSQURJT19IX18KKworI2luY2x1ZGUgImdzdHY0bDJvYmplY3QuaCIKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1Y0TDJSQURJTyBcCisgIChnc3RfdjRsMnJhZGlvX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WNEwyUkFESU8ob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9WNEwyUkFESU8sR3N0VjRsMlJhZGlvKSkKKyNkZWZpbmUgR1NUX1Y0TDJSQURJT19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WNEwyUkFESU8sR3N0VjRsMlJhZGlvQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVjRMMlJBRElPKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVjRMMlJBRElPKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJSQURJT19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9WNEwyUkFESU8pKQorCit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMlJhZGlvICAgICAgR3N0VjRsMlJhZGlvOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJSYWRpb0NsYXNzIEdzdFY0bDJSYWRpb0NsYXNzOworCisvKioKKyAqIEdzdFY0bDJSYWRpbzoKKyAqCisgKiBPcGFxdWUgdmlkZW80bGludXgyIHJhZGlvIHR1bmVyIGVsZW1lbnQKKyAqLworc3RydWN0IF9Hc3RWNGwyUmFkaW8KK3sKKyAgR3N0RWxlbWVudCBlbGVtZW50OworCisgIC8qPCBwcml2YXRlID4qLworICBHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdDsKK307CisKK3N0cnVjdCBfR3N0VjRsMlJhZGlvQ2xhc3MKK3sKKyAgR3N0RWxlbWVudENsYXNzIHBhcmVudF9jbGFzczsKKworICBHTGlzdCAqdjRsMl9jbGFzc19kZXZpY2VzOworfTsKKworR1R5cGUgZ3N0X3Y0bDJyYWRpb19nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9WNEwyUkFESU9fSF9fICovCmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwyc2luay5jIGIvc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzM5MjE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMnNpbmsuYwpAQCAtMCwwICsxLDY0NiBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRleGFzIEluc3RydW1lbnRzLCBJbmMgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBEZXNjcmlwdGlvbjogVjRMMiBzaW5rIGVsZW1lbnQKKyAqICBDcmVhdGVkIG9uOiBKdWwgMiwgMjAwOQorICogICAgICBBdXRob3I6IFJvYiBDbGFyayA8cm9iQHRpLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC12NGwyc2luaworICoKKyAqIHY0bDJzaW5rIGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgdmlkZW8gdG8gdjRsMiBkZXZpY2VzIChzY3JlZW4gb3ZlcmxheXMKKyAqIHByb3ZpZGVkIGJ5IHRoZSBncmFwaGljcyBoYXJkd2FyZSwgdHYtb3V0LCBldGMpCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgbGF1bmNoIGxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCB2aWRlb3Rlc3RzcmMgISB2NGwyc2luayBkZXZpY2U9L2Rldi92aWRlbzEKKyAqIF18IFRoaXMgcGlwZWxpbmUgZGlzcGxheXMgYSB0ZXN0IHBhdHRlcm4gb24gL2Rldi92aWRlbzEKKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiB2aWRlb3Rlc3RzcmMgISBuYXZpZ2F0aW9udGVzdCAhIHY0bDJzaW5rCisgKiBdfCBBIHBpcGVsaW5lIHRvIHRlc3QgbmF2aWdhdGlvbiBldmVudHMuCisgKiBXaGlsZSBtb3ZpbmcgdGhlIG1vdXNlIHBvaW50ZXIgb3ZlciB0aGUgdGVzdCBzaWduYWwgeW91IHdpbGwgc2VlIGEgYmxhY2sgYm94CisgKiBmb2xsb3dpbmcgdGhlIG1vdXNlIHBvaW50ZXIuIElmIHlvdSBwcmVzcyB0aGUgbW91c2UgYnV0dG9uIHNvbWV3aGVyZSBvbiB0aGUKKyAqIHZpZGVvIGFuZCByZWxlYXNlIGl0IHNvbWV3aGVyZSBlbHNlIGEgZ3JlZW4gYm94IHdpbGwgYXBwZWFyIHdoZXJlIHlvdSBwcmVzc2VkCisgKiB0aGUgYnV0dG9uIGFuZCBhIHJlZCBvbmUgd2hlcmUgeW91IHJlbGVhc2VkIGl0LiAoVGhlIG5hdmlnYXRpb250ZXN0IGVsZW1lbnQKKyAqIGlzIHBhcnQgb2YgZ3N0LXBsdWdpbnMtZ29vZC4pIFlvdSBjYW4gb2JzZXJ2ZSBoZXJlIHRoYXQgZXZlbiBpZiB0aGUgaW1hZ2VzCisgKiBhcmUgc2NhbGVkIHRocm91Z2ggaGFyZHdhcmUgdGhlIHBvaW50ZXIgY29vcmRpbmF0ZXMgYXJlIGNvbnZlcnRlZCBiYWNrIHRvIHRoZQorICogb3JpZ2luYWwgdmlkZW8gZnJhbWUgZ2VvbWV0cnkgc28gdGhhdCB0aGUgYm94IGNhbiBiZSBkcmF3biB0byB0aGUgY29ycmVjdAorICogcG9zaXRpb24uIFRoaXMgYWxzbyBoYW5kbGVzIGJvcmRlcnMgY29ycmVjdGx5LCBsaW1pdGluZyBjb29yZGluYXRlcyB0byB0aGUKKyAqIGltYWdlIGFyZWEKKyAqIDwvcmVmc2VjdDI+CisgKi8KKworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnc3QvdmlkZW8vZ3N0dmlkZW9tZXRhLmgiCisKKyNpbmNsdWRlICJnc3R2NGwyY29sb3JiYWxhbmNlLmgiCisjaW5jbHVkZSAiZ3N0djRsMnR1bmVyLmgiCisjaW5jbHVkZSAiZ3N0djRsMnZpZG9yaWVudC5oIgorCisjaW5jbHVkZSAiZ3N0djRsMnNpbmsuaCIKKyNpbmNsdWRlICJnc3QvZ3N0LWkxOG4tcGx1Z2luLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZICh2NGwyc2lua19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCB2NGwyc2lua19kZWJ1ZworCisjZGVmaW5lIERFRkFVTFRfUFJPUF9ERVZJQ0UgICAiL2Rldi92aWRlbzEiCisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBWNEwyX1NURF9PQkpFQ1RfUFJPUFMsCisgIFBST1BfT1ZFUkxBWV9UT1AsCisgIFBST1BfT1ZFUkxBWV9MRUZULAorICBQUk9QX09WRVJMQVlfV0lEVEgsCisgIFBST1BfT1ZFUkxBWV9IRUlHSFQsCisgIFBST1BfQ1JPUF9UT1AsCisgIFBST1BfQ1JPUF9MRUZULAorICBQUk9QX0NST1BfV0lEVEgsCisgIFBST1BfQ1JPUF9IRUlHSFQsCit9OworCisKK0dTVF9JTVBMRU1FTlRfVjRMMl9DT0xPUl9CQUxBTkNFX01FVEhPRFMgKEdzdFY0bDJTaW5rLCBnc3RfdjRsMnNpbmspOworR1NUX0lNUExFTUVOVF9WNEwyX1RVTkVSX01FVEhPRFMgKEdzdFY0bDJTaW5rLCBnc3RfdjRsMnNpbmspOworR1NUX0lNUExFTUVOVF9WNEwyX1ZJRE9SSUVOVF9NRVRIT0RTIChHc3RWNGwyU2luaywgZ3N0X3Y0bDJzaW5rKTsKKworI2RlZmluZSBnc3RfdjRsMnNpbmtfcGFyZW50X2NsYXNzIHBhcmVudF9jbGFzcworR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKEdzdFY0bDJTaW5rLCBnc3RfdjRsMnNpbmssIEdTVF9UWVBFX1ZJREVPX1NJTkssCisgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFIChHU1RfVFlQRV9UVU5FUiwgZ3N0X3Y0bDJzaW5rX3R1bmVyX2ludGVyZmFjZV9pbml0KTsKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX0NPTE9SX0JBTEFOQ0UsCisgICAgICAgIGdzdF92NGwyc2lua19jb2xvcl9iYWxhbmNlX2ludGVyZmFjZV9pbml0KTsKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX1ZJREVPX09SSUVOVEFUSU9OLAorICAgICAgICBnc3RfdjRsMnNpbmtfdmlkZW9fb3JpZW50YXRpb25faW50ZXJmYWNlX2luaXQpKTsKKworCitzdGF0aWMgdm9pZCBnc3RfdjRsMnNpbmtfZmluYWxpemUgKEdzdFY0bDJTaW5rICogdjRsMnNpbmspOworCisvKiBHT2JqZWN0IG1ldGhvZHM6ICovCitzdGF0aWMgdm9pZCBnc3RfdjRsMnNpbmtfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3Y0bDJzaW5rX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwgZ3VpbnQgcHJvcF9pZCwKKyAgICBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKKworLyogR3N0RWxlbWVudCBtZXRob2RzOiAqLworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF92NGwyc2lua19jaGFuZ2Vfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50LAorICAgIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pOworCisvKiBHc3RCYXNlU2luayBtZXRob2RzOiAqLworc3RhdGljIGdib29sZWFuIGdzdF92NGwyc2lua19wcm9wb3NlX2FsbG9jYXRpb24gKEdzdEJhc2VTaW5rICogYnNpbmssCisgICAgR3N0UXVlcnkgKiBxdWVyeSk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3Y0bDJzaW5rX2dldF9jYXBzIChHc3RCYXNlU2luayAqIGJzaW5rLCBHc3RDYXBzICogZmlsdGVyKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdjRsMnNpbmtfc2V0X2NhcHMgKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF92NGwyc2lua19zaG93X2ZyYW1lIChHc3RWaWRlb1NpbmsgKiBic2luaywKKyAgICBHc3RCdWZmZXIgKiBidWYpOworc3RhdGljIGdib29sZWFuIGdzdF92NGwyc2lua191bmxvY2sgKEdzdEJhc2VTaW5rICogc2luayk7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Y0bDJzaW5rX3VubG9ja19zdG9wIChHc3RCYXNlU2luayAqIHNpbmspOworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJzaW5rX2NsYXNzX2luaXQgKEdzdFY0bDJTaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3M7CisgIEdzdEJhc2VTaW5rQ2xhc3MgKmJhc2VzaW5rX2NsYXNzOworICBHc3RWaWRlb1NpbmtDbGFzcyAqdmlkZW9zaW5rX2NsYXNzOworCisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgYmFzZXNpbmtfY2xhc3MgPSBHU1RfQkFTRV9TSU5LX0NMQVNTIChrbGFzcyk7CisgIHZpZGVvc2lua19jbGFzcyA9IEdTVF9WSURFT19TSU5LX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAoR09iamVjdEZpbmFsaXplRnVuYykgZ3N0X3Y0bDJzaW5rX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdjRsMnNpbmtfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3RfdjRsMnNpbmtfZ2V0X3Byb3BlcnR5OworCisgIGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9IGdzdF92NGwyc2lua19jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0X3Y0bDJfb2JqZWN0X2luc3RhbGxfcHJvcGVydGllc19oZWxwZXIgKGdvYmplY3RfY2xhc3MsCisgICAgICBERUZBVUxUX1BST1BfREVWSUNFKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX09WRVJMQVlfVE9QLAorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoIm92ZXJsYXktdG9wIiwgIk92ZXJsYXkgdG9wIiwKKyAgICAgICAgICAiVGhlIHRvcG1vc3QgKHkpIGNvb3JkaW5hdGUgb2YgdGhlIHZpZGVvIG92ZXJsYXk7IHRvcCBsZWZ0IGNvcm5lciBvZiBzY3JlZW4gaXMgMCwwIiwKKyAgICAgICAgICBHX01JTklOVCwgR19NQVhJTlQsIDAsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX09WRVJMQVlfTEVGVCwKKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJvdmVybGF5LWxlZnQiLCAiT3ZlcmxheSBsZWZ0IiwKKyAgICAgICAgICAiVGhlIGxlZnRtb3N0ICh4KSBjb29yZGluYXRlIG9mIHRoZSB2aWRlbyBvdmVybGF5OyB0b3AgbGVmdCBjb3JuZXIgb2Ygc2NyZWVuIGlzIDAsMCIsCisgICAgICAgICAgR19NSU5JTlQsIEdfTUFYSU5ULCAwLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9PVkVSTEFZX1dJRFRILAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJvdmVybGF5LXdpZHRoIiwgIk92ZXJsYXkgd2lkdGgiLAorICAgICAgICAgICJUaGUgd2lkdGggb2YgdGhlIHZpZGVvIG92ZXJsYXk7IGRlZmF1bHQgaXMgZXF1YWwgdG8gbmVnb3RpYXRlZCBpbWFnZSB3aWR0aCIsCisgICAgICAgICAgMCwgR19NQVhVSU5ULCAwLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9PVkVSTEFZX0hFSUdIVCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgib3ZlcmxheS1oZWlnaHQiLCAiT3ZlcmxheSBoZWlnaHQiLAorICAgICAgICAgICJUaGUgaGVpZ2h0IG9mIHRoZSB2aWRlbyBvdmVybGF5OyBkZWZhdWx0IGlzIGVxdWFsIHRvIG5lZ290aWF0ZWQgaW1hZ2UgaGVpZ2h0IiwKKyAgICAgICAgICAwLCBHX01BWFVJTlQsIDAsIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9TVEFUSUNfU1RSSU5HUykpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfQ1JPUF9UT1AsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiY3JvcC10b3AiLCAiQ3JvcCB0b3AiLAorICAgICAgICAgICJUaGUgdG9wbW9zdCAoeSkgY29vcmRpbmF0ZSBvZiB0aGUgdmlkZW8gY3JvcDsgdG9wIGxlZnQgY29ybmVyIG9mIGltYWdlIGlzIDAsMCIsCisgICAgICAgICAgMHg4MDAwMDAwMCwgMHg3ZmZmZmZmZiwgMCwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DUk9QX0xFRlQsCisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgiY3JvcC1sZWZ0IiwgIkNyb3AgbGVmdCIsCisgICAgICAgICAgIlRoZSBsZWZ0bW9zdCAoeCkgY29vcmRpbmF0ZSBvZiB0aGUgdmlkZW8gY3JvcDsgdG9wIGxlZnQgY29ybmVyIG9mIGltYWdlIGlzIDAsMCIsCisgICAgICAgICAgMHg4MDAwMDAwMCwgMHg3ZmZmZmZmZiwgMCwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DUk9QX1dJRFRILAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJjcm9wLXdpZHRoIiwgIkNyb3Agd2lkdGgiLAorICAgICAgICAgICJUaGUgd2lkdGggb2YgdGhlIHZpZGVvIGNyb3A7IGRlZmF1bHQgaXMgZXF1YWwgdG8gbmVnb3RpYXRlZCBpbWFnZSB3aWR0aCIsCisgICAgICAgICAgMCwgMHhmZmZmZmZmZiwgMCwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9DUk9QX0hFSUdIVCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgiY3JvcC1oZWlnaHQiLCAiQ3JvcCBoZWlnaHQiLAorICAgICAgICAgICJUaGUgaGVpZ2h0IG9mIHRoZSB2aWRlbyBjcm9wOyBkZWZhdWx0IGlzIGVxdWFsIHRvIG5lZ290aWF0ZWQgaW1hZ2UgaGVpZ2h0IiwKKyAgICAgICAgICAwLCAweGZmZmZmZmZmLCAwLCBHX1BBUkFNX1JFQURXUklURSkpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiVmlkZW8gKHZpZGVvNGxpbnV4MikgU2luayIsICJTaW5rL1ZpZGVvIiwKKyAgICAgICJEaXNwbGF5cyBmcmFtZXMgb24gYSB2aWRlbzRsaW51eDIgZGV2aWNlIiwgIlJvYiBDbGFyayA8cm9iQHRpLmNvbT4sIik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgIGdzdF9wYWRfdGVtcGxhdGVfbmV3ICgic2luayIsIEdTVF9QQURfU0lOSywgR1NUX1BBRF9BTFdBWVMsCisgICAgICAgICAgZ3N0X3Y0bDJfb2JqZWN0X2dldF9hbGxfY2FwcyAoKSkpOworCisgIGJhc2VzaW5rX2NsYXNzLT5nZXRfY2FwcyA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMnNpbmtfZ2V0X2NhcHMpOworICBiYXNlc2lua19jbGFzcy0+c2V0X2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJzaW5rX3NldF9jYXBzKTsKKyAgYmFzZXNpbmtfY2xhc3MtPnByb3Bvc2VfYWxsb2NhdGlvbiA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJzaW5rX3Byb3Bvc2VfYWxsb2NhdGlvbik7CisgIGJhc2VzaW5rX2NsYXNzLT51bmxvY2sgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJzaW5rX3VubG9jayk7CisgIGJhc2VzaW5rX2NsYXNzLT51bmxvY2tfc3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMnNpbmtfdW5sb2NrX3N0b3ApOworCisgIHZpZGVvc2lua19jbGFzcy0+c2hvd19mcmFtZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMnNpbmtfc2hvd19mcmFtZSk7CisKKyAga2xhc3MtPnY0bDJfY2xhc3NfZGV2aWNlcyA9IE5VTEw7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHY0bDJzaW5rX2RlYnVnLCAidjRsMnNpbmsiLCAwLCAiVjRMMiBzaW5rIGVsZW1lbnQiKTsKKworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJzaW5rX2luaXQgKEdzdFY0bDJTaW5rICogdjRsMnNpbmspCit7CisgIHY0bDJzaW5rLT52NGwyb2JqZWN0ID0gZ3N0X3Y0bDJfb2JqZWN0X25ldyAoR1NUX0VMRU1FTlQgKHY0bDJzaW5rKSwKKyAgICAgIEdTVF9PQkpFQ1QgKEdTVF9CQVNFX1NJTktfUEFEICh2NGwyc2luaykpLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwKKyAgICAgIERFRkFVTFRfUFJPUF9ERVZJQ0UsIGdzdF92NGwyX2dldF9vdXRwdXQsIGdzdF92NGwyX3NldF9vdXRwdXQsIE5VTEwpOworCisgIC8qIHNhbWUgZGVmYXVsdCB2YWx1ZSBmb3IgdmlkZW8gb3V0cHV0IGRldmljZSBhcyBpcyB1c2VkIGZvcgorICAgKiB2NGwyc3JjL2NhcHR1cmUgaXMgbm8gZ29vZC4uICBzbyBsZXRzIHNldCBhIHNhbmVyIGRlZmF1bHQKKyAgICogKHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBvbmUgY3JlYXRpbmcgdGhlIHY0bDJzaW5rCisgICAqIGFmdGVyIHRoZSBjb25zdHJ1Y3RvciByZXR1cm5zKQorICAgKi8KKyAgZ19vYmplY3Rfc2V0ICh2NGwyc2luaywgImRldmljZSIsICIvZGV2L3ZpZGVvMSIsIE5VTEwpOworCisgIHY0bDJzaW5rLT5vdmVybGF5X2ZpZWxkc19zZXQgPSAwOworICB2NGwyc2luay0+Y3JvcF9maWVsZHNfc2V0ID0gMDsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJzaW5rX2ZpbmFsaXplIChHc3RWNGwyU2luayAqIHY0bDJzaW5rKQoreworICBnc3RfdjRsMl9vYmplY3RfZGVzdHJveSAodjRsMnNpbmstPnY0bDJvYmplY3QpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAoKEdPYmplY3QgKikgKHY0bDJzaW5rKSk7Cit9CisKKworLyoKKyAqIGZsYWdzIHRvIGluZGljYXRlIHdoaWNoIG92ZXJsYXkvY3JvcCBwcm9wZXJ0aWVzIHRoZSB1c2VyIGhhcyBzZXQgKGFuZAorICogdGhlcmVmb3JlIHdoaWNoIG9uZXMgc2hvdWxkIG92ZXJyaWRlIHRoZSBkZWZhdWx0cyBmcm9tIHRoZSBkcml2ZXIpCisgKi8KK2VudW0KK3sKKyAgUkVDVF9UT1BfU0VUID0gMHgwMSwKKyAgUkVDVF9MRUZUX1NFVCA9IDB4MDIsCisgIFJFQ1RfV0lEVEhfU0VUID0gMHgwNCwKKyAgUkVDVF9IRUlHSFRfU0VUID0gMHgwOAorfTsKKworc3RhdGljIHZvaWQKK2dzdF92NGwyc2lua19zeW5jX292ZXJsYXlfZmllbGRzIChHc3RWNGwyU2luayAqIHY0bDJzaW5rKQoreworICBpZiAoIXY0bDJzaW5rLT5vdmVybGF5X2ZpZWxkc19zZXQpCisgICAgcmV0dXJuOworCisgIGlmIChHU1RfVjRMMl9JU19PUEVOICh2NGwyc2luay0+djRsMm9iamVjdCkpIHsKKworICAgIEdzdFY0bDJPYmplY3QgKm9iaiA9IHY0bDJzaW5rLT52NGwyb2JqZWN0OworICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmb3JtYXQ7CisKKyAgICBtZW1zZXQgKCZmb3JtYXQsIDB4MDAsIHNpemVvZiAoc3RydWN0IHY0bDJfZm9ybWF0KSk7CisgICAgaWYgKG9iai0+ZGV2aWNlX2NhcHMgJiBWNEwyX0NBUF9WSURFT19PVVRQVVRfT1ZFUkxBWSkKKyAgICAgIGZvcm1hdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfT1ZFUkxBWTsKKyAgICBlbHNlCisgICAgICBmb3JtYXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWTsKKworICAgIGlmIChvYmotPmlvY3RsIChvYmotPnZpZGVvX2ZkLCBWSURJT0NfR19GTVQsICZmb3JtYXQpIDwgMCkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyc2luaywgIlZJRElPQ19HX0ZNVCBmYWlsZWQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyc2luaywKKyAgICAgICAgInNldHRpbmcgb3ZlcmxheTogb3ZlcmxheV9maWVsZHNfc2V0PTB4JTAyeCwgdG9wPSVkLCBsZWZ0PSVkLCB3aWR0aD0lZCwgaGVpZ2h0PSVkIiwKKyAgICAgICAgdjRsMnNpbmstPm92ZXJsYXlfZmllbGRzX3NldCwKKyAgICAgICAgdjRsMnNpbmstPm92ZXJsYXkudG9wLCB2NGwyc2luay0+b3ZlcmxheS5sZWZ0LAorICAgICAgICB2NGwyc2luay0+b3ZlcmxheS53aWR0aCwgdjRsMnNpbmstPm92ZXJsYXkuaGVpZ2h0KTsKKworICAgIGlmICh2NGwyc2luay0+b3ZlcmxheV9maWVsZHNfc2V0ICYgUkVDVF9UT1BfU0VUKQorICAgICAgZm9ybWF0LmZtdC53aW4udy50b3AgPSB2NGwyc2luay0+b3ZlcmxheS50b3A7CisgICAgaWYgKHY0bDJzaW5rLT5vdmVybGF5X2ZpZWxkc19zZXQgJiBSRUNUX0xFRlRfU0VUKQorICAgICAgZm9ybWF0LmZtdC53aW4udy5sZWZ0ID0gdjRsMnNpbmstPm92ZXJsYXkubGVmdDsKKyAgICBpZiAodjRsMnNpbmstPm92ZXJsYXlfZmllbGRzX3NldCAmIFJFQ1RfV0lEVEhfU0VUKQorICAgICAgZm9ybWF0LmZtdC53aW4udy53aWR0aCA9IHY0bDJzaW5rLT5vdmVybGF5LndpZHRoOworICAgIGlmICh2NGwyc2luay0+b3ZlcmxheV9maWVsZHNfc2V0ICYgUkVDVF9IRUlHSFRfU0VUKQorICAgICAgZm9ybWF0LmZtdC53aW4udy5oZWlnaHQgPSB2NGwyc2luay0+b3ZlcmxheS5oZWlnaHQ7CisKKyAgICBpZiAob2JqLT5pb2N0bCAob2JqLT52aWRlb19mZCwgVklESU9DX1NfRk1ULCAmZm9ybWF0KSA8IDApIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMnNpbmssICJWSURJT0NfU19GTVQgZmFpbGVkIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdjRsMnNpbmstPm92ZXJsYXlfZmllbGRzX3NldCA9IDA7CisgICAgdjRsMnNpbmstPm92ZXJsYXkgPSBmb3JtYXQuZm10Lndpbi53OworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMnNpbmtfc3luY19jcm9wX2ZpZWxkcyAoR3N0VjRsMlNpbmsgKiB2NGwyc2luaykKK3sKKyAgaWYgKCF2NGwyc2luay0+Y3JvcF9maWVsZHNfc2V0KQorICAgIHJldHVybjsKKworICBpZiAoR1NUX1Y0TDJfSVNfT1BFTiAodjRsMnNpbmstPnY0bDJvYmplY3QpKSB7CisKKyAgICBHc3RWNGwyT2JqZWN0ICpvYmogPSB2NGwyc2luay0+djRsMm9iamVjdDsKKyAgICBzdHJ1Y3QgdjRsMl9jcm9wIGNyb3A7CisKKyAgICBtZW1zZXQgKCZjcm9wLCAweDAwLCBzaXplb2YgKHN0cnVjdCB2NGwyX2Nyb3ApKTsKKyAgICBjcm9wLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDsKKworICAgIGlmIChvYmotPmlvY3RsIChvYmotPnZpZGVvX2ZkLCBWSURJT0NfR19DUk9QLCAmY3JvcCkgPCAwKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJzaW5rLCAiVklESU9DX0dfQ1JPUCBmYWlsZWQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyc2luaywKKyAgICAgICAgInNldHRpbmcgY3JvcDogY3JvcF9maWVsZHNfc2V0PTB4JTAyeCwgdG9wPSVkLCBsZWZ0PSVkLCB3aWR0aD0lZCwgaGVpZ2h0PSVkIiwKKyAgICAgICAgdjRsMnNpbmstPmNyb3BfZmllbGRzX3NldCwKKyAgICAgICAgdjRsMnNpbmstPmNyb3AudG9wLCB2NGwyc2luay0+Y3JvcC5sZWZ0LAorICAgICAgICB2NGwyc2luay0+Y3JvcC53aWR0aCwgdjRsMnNpbmstPmNyb3AuaGVpZ2h0KTsKKworICAgIGlmICh2NGwyc2luay0+Y3JvcF9maWVsZHNfc2V0ICYgUkVDVF9UT1BfU0VUKQorICAgICAgY3JvcC5jLnRvcCA9IHY0bDJzaW5rLT5jcm9wLnRvcDsKKyAgICBpZiAodjRsMnNpbmstPmNyb3BfZmllbGRzX3NldCAmIFJFQ1RfTEVGVF9TRVQpCisgICAgICBjcm9wLmMubGVmdCA9IHY0bDJzaW5rLT5jcm9wLmxlZnQ7CisgICAgaWYgKHY0bDJzaW5rLT5jcm9wX2ZpZWxkc19zZXQgJiBSRUNUX1dJRFRIX1NFVCkKKyAgICAgIGNyb3AuYy53aWR0aCA9IHY0bDJzaW5rLT5jcm9wLndpZHRoOworICAgIGlmICh2NGwyc2luay0+Y3JvcF9maWVsZHNfc2V0ICYgUkVDVF9IRUlHSFRfU0VUKQorICAgICAgY3JvcC5jLmhlaWdodCA9IHY0bDJzaW5rLT5jcm9wLmhlaWdodDsKKworICAgIGlmIChvYmotPmlvY3RsIChvYmotPnZpZGVvX2ZkLCBWSURJT0NfU19DUk9QLCAmY3JvcCkgPCAwKSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJzaW5rLCAiVklESU9DX1NfQ1JPUCBmYWlsZWQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAob2JqLT5pb2N0bCAob2JqLT52aWRlb19mZCwgVklESU9DX0dfQ1JPUCwgJmNyb3ApIDwgMCkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyc2luaywgIlZJRElPQ19HX0NST1AgZmFpbGVkIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdjRsMnNpbmstPmNyb3BfZmllbGRzX3NldCA9IDA7CisgICAgdjRsMnNpbmstPmNyb3AgPSBjcm9wLmM7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJzaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWNGwyU2luayAqdjRsMnNpbmsgPSBHU1RfVjRMMlNJTksgKG9iamVjdCk7CisKKyAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfc2V0X3Byb3BlcnR5X2hlbHBlciAodjRsMnNpbmstPnY0bDJvYmplY3QsCisgICAgICAgICAgcHJvcF9pZCwgdmFsdWUsIHBzcGVjKSkgeworICAgIHN3aXRjaCAocHJvcF9pZCkgeworICAgICAgY2FzZSBQUk9QX09WRVJMQVlfVE9QOgorICAgICAgICB2NGwyc2luay0+b3ZlcmxheS50b3AgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgICAgdjRsMnNpbmstPm92ZXJsYXlfZmllbGRzX3NldCB8PSBSRUNUX1RPUF9TRVQ7CisgICAgICAgIGdzdF92NGwyc2lua19zeW5jX292ZXJsYXlfZmllbGRzICh2NGwyc2luayk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUk9QX09WRVJMQVlfTEVGVDoKKyAgICAgICAgdjRsMnNpbmstPm92ZXJsYXkubGVmdCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgICB2NGwyc2luay0+b3ZlcmxheV9maWVsZHNfc2V0IHw9IFJFQ1RfTEVGVF9TRVQ7CisgICAgICAgIGdzdF92NGwyc2lua19zeW5jX292ZXJsYXlfZmllbGRzICh2NGwyc2luayk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUk9QX09WRVJMQVlfV0lEVEg6CisgICAgICAgIHY0bDJzaW5rLT5vdmVybGF5LndpZHRoID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgICB2NGwyc2luay0+b3ZlcmxheV9maWVsZHNfc2V0IHw9IFJFQ1RfV0lEVEhfU0VUOworICAgICAgICBnc3RfdjRsMnNpbmtfc3luY19vdmVybGF5X2ZpZWxkcyAodjRsMnNpbmspOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUFJPUF9PVkVSTEFZX0hFSUdIVDoKKyAgICAgICAgdjRsMnNpbmstPm92ZXJsYXkuaGVpZ2h0ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgICB2NGwyc2luay0+b3ZlcmxheV9maWVsZHNfc2V0IHw9IFJFQ1RfSEVJR0hUX1NFVDsKKyAgICAgICAgZ3N0X3Y0bDJzaW5rX3N5bmNfb3ZlcmxheV9maWVsZHMgKHY0bDJzaW5rKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBST1BfQ1JPUF9UT1A6CisgICAgICAgIHY0bDJzaW5rLT5jcm9wLnRvcCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgICB2NGwyc2luay0+Y3JvcF9maWVsZHNfc2V0IHw9IFJFQ1RfVE9QX1NFVDsKKyAgICAgICAgZ3N0X3Y0bDJzaW5rX3N5bmNfY3JvcF9maWVsZHMgKHY0bDJzaW5rKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBST1BfQ1JPUF9MRUZUOgorICAgICAgICB2NGwyc2luay0+Y3JvcC5sZWZ0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICAgIHY0bDJzaW5rLT5jcm9wX2ZpZWxkc19zZXQgfD0gUkVDVF9MRUZUX1NFVDsKKyAgICAgICAgZ3N0X3Y0bDJzaW5rX3N5bmNfY3JvcF9maWVsZHMgKHY0bDJzaW5rKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBST1BfQ1JPUF9XSURUSDoKKyAgICAgICAgdjRsMnNpbmstPmNyb3Aud2lkdGggPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICAgIHY0bDJzaW5rLT5jcm9wX2ZpZWxkc19zZXQgfD0gUkVDVF9XSURUSF9TRVQ7CisgICAgICAgIGdzdF92NGwyc2lua19zeW5jX2Nyb3BfZmllbGRzICh2NGwyc2luayk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUk9QX0NST1BfSEVJR0hUOgorICAgICAgICB2NGwyc2luay0+Y3JvcC5oZWlnaHQgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICAgIHY0bDJzaW5rLT5jcm9wX2ZpZWxkc19zZXQgfD0gUkVDVF9IRUlHSFRfU0VUOworICAgICAgICBnc3RfdjRsMnNpbmtfc3luY19jcm9wX2ZpZWxkcyAodjRsMnNpbmspOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMnNpbmtfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFY0bDJTaW5rICp2NGwyc2luayA9IEdTVF9WNEwyU0lOSyAob2JqZWN0KTsKKworICBpZiAoIWdzdF92NGwyX29iamVjdF9nZXRfcHJvcGVydHlfaGVscGVyICh2NGwyc2luay0+djRsMm9iamVjdCwKKyAgICAgICAgICBwcm9wX2lkLCB2YWx1ZSwgcHNwZWMpKSB7CisgICAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgICBjYXNlIFBST1BfT1ZFUkxBWV9UT1A6CisgICAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHY0bDJzaW5rLT5vdmVybGF5LnRvcCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUk9QX09WRVJMQVlfTEVGVDoKKyAgICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdjRsMnNpbmstPm92ZXJsYXkubGVmdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUk9QX09WRVJMQVlfV0lEVEg6CisgICAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB2NGwyc2luay0+b3ZlcmxheS53aWR0aCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUk9QX09WRVJMQVlfSEVJR0hUOgorICAgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdjRsMnNpbmstPm92ZXJsYXkuaGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBST1BfQ1JPUF9UT1A6CisgICAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHY0bDJzaW5rLT5jcm9wLnRvcCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUk9QX0NST1BfTEVGVDoKKyAgICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdjRsMnNpbmstPmNyb3AubGVmdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUk9QX0NST1BfV0lEVEg6CisgICAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB2NGwyc2luay0+Y3JvcC53aWR0aCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUk9QX0NST1BfSEVJR0hUOgorICAgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdjRsMnNpbmstPmNyb3AuaGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfdjRsMnNpbmtfY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0ID0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTOworICBHc3RWNGwyU2luayAqdjRsMnNpbmsgPSBHU1RfVjRMMlNJTksgKGVsZW1lbnQpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJzaW5rLCAiJWQgLT4gJWQiLAorICAgICAgR1NUX1NUQVRFX1RSQU5TSVRJT05fQ1VSUkVOVCAodHJhbnNpdGlvbiksCisgICAgICBHU1RfU1RBVEVfVFJBTlNJVElPTl9ORVhUICh0cmFuc2l0aW9uKSk7CisKKyAgc3dpdGNoICh0cmFuc2l0aW9uKSB7CisgICAgY2FzZSBHU1RfU1RBVEVfQ0hBTkdFX05VTExfVE9fUkVBRFk6CisgICAgICAvKiBvcGVuIHRoZSBkZXZpY2UgKi8KKyAgICAgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X29wZW4gKHY0bDJzaW5rLT52NGwyb2JqZWN0KSkKKyAgICAgICAgcmV0dXJuIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFk6CisgICAgICBpZiAoIWdzdF92NGwyX29iamVjdF9zdG9wICh2NGwyc2luay0+djRsMm9iamVjdCkpCisgICAgICAgIHJldHVybiBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIC8qIHdlIG5lZWQgdG8gY2FsbCBzdG9wIGhlcmUgdG9vICovCisgICAgICBpZiAoIWdzdF92NGwyX29iamVjdF9zdG9wICh2NGwyc2luay0+djRsMm9iamVjdCkpCisgICAgICAgIHJldHVybiBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgICAgICAvKiBjbG9zZSB0aGUgZGV2aWNlICovCisgICAgICBpZiAoIWdzdF92NGwyX29iamVjdF9jbG9zZSAodjRsMnNpbmstPnY0bDJvYmplY3QpKQorICAgICAgICByZXR1cm4gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfdjRsMnNpbmtfZ2V0X2NhcHMgKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdFY0bDJTaW5rICp2NGwyc2luayA9IEdTVF9WNEwyU0lOSyAoYnNpbmspOworCisgIGlmICghR1NUX1Y0TDJfSVNfT1BFTiAodjRsMnNpbmstPnY0bDJvYmplY3QpKSB7CisgICAgLyogRklYTUU6IGNvcHk/ICovCisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMnNpbmssICJkZXZpY2UgaXMgbm90IG9wZW4iKTsKKyAgICByZXR1cm4gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKEdTVF9CQVNFX1NJTktfUEFEICh2NGwyc2luaykpOworICB9CisKKworICByZXR1cm4gZ3N0X3Y0bDJfb2JqZWN0X2dldF9jYXBzICh2NGwyc2luay0+djRsMm9iamVjdCwgZmlsdGVyKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMnNpbmtfc2V0X2NhcHMgKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RWNGwyRXJyb3IgZXJyb3IgPSBHU1RfVjRMMl9FUlJPUl9JTklUOworICBHc3RWNGwyU2luayAqdjRsMnNpbmsgPSBHU1RfVjRMMlNJTksgKGJzaW5rKTsKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gdjRsMnNpbmstPnY0bDJvYmplY3Q7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMnNpbmssICJjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisKKyAgaWYgKCFHU1RfVjRMMl9JU19PUEVOIChvYmopKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAodjRsMnNpbmssICJkZXZpY2UgaXMgbm90IG9wZW4iKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBtYWtlIHN1cmUgdGhlIGNhcHMgY2hhbmdlZCBiZWZvcmUgZG9pbmcgYW55dGhpbmcgKi8KKyAgaWYgKGdzdF92NGwyX29iamVjdF9jYXBzX2VxdWFsIChvYmosIGNhcHMpKQorICAgIHJldHVybiBUUlVFOworCisgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X3N0b3AgKG9iaikpCisgICAgZ290byBzdG9wX2ZhaWxlZDsKKworICBpZiAoIWdzdF92NGwyX29iamVjdF9zZXRfZm9ybWF0IChvYmosIGNhcHMsICZlcnJvcikpCisgICAgZ290byBpbnZhbGlkX2Zvcm1hdDsKKworICBnc3RfdjRsMnNpbmtfc3luY19vdmVybGF5X2ZpZWxkcyAodjRsMnNpbmspOworICBnc3RfdjRsMnNpbmtfc3luY19jcm9wX2ZpZWxkcyAodjRsMnNpbmspOworCisgIEdTVF9JTkZPX09CSkVDVCAodjRsMnNpbmssICJvdXRwdXR0aW5nIGJ1ZmZlcnMgdmlhIG1vZGUgJXUiLCBvYmotPm1vZGUpOworCisgIHY0bDJzaW5rLT52aWRlb193aWR0aCA9IEdTVF9WNEwyX1dJRFRIIChvYmopOworICB2NGwyc2luay0+dmlkZW9faGVpZ2h0ID0gR1NUX1Y0TDJfSEVJR0hUIChvYmopOworCisgIC8qIFRPRE86IHZpZGVvc2luayB3aWR0aC9oZWlnaHQgc2hvdWxkIGJlIHNjYWxlZCBhY2NvcmRpbmcgdG8KKyAgICogcGl4ZWwtYXNwZWN0LXJhdGlvCisgICAqLworICBHU1RfVklERU9fU0lOS19XSURUSCAodjRsMnNpbmspID0gdjRsMnNpbmstPnZpZGVvX3dpZHRoOworICBHU1RfVklERU9fU0lOS19IRUlHSFQgKHY0bDJzaW5rKSA9IHY0bDJzaW5rLT52aWRlb19oZWlnaHQ7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitzdG9wX2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJzaW5rLCAiZmFpbGVkIHRvIHN0b3Agc3RyZWFtaW5nIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CitpbnZhbGlkX2Zvcm1hdDoKKyAgeworICAgIC8qIGVycm9yIGFscmVhZHkgcG9zdGVkICovCisgICAgZ3N0X3Y0bDJfZXJyb3IgKHY0bDJzaW5rLCAmZXJyb3IpOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJzaW5rLCAiY2FuJ3Qgc2V0IGZvcm1hdCIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyc2lua19wcm9wb3NlX2FsbG9jYXRpb24gKEdzdEJhc2VTaW5rICogYnNpbmssIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFY0bDJTaW5rICp2NGwyc2luayA9IEdTVF9WNEwyU0lOSyAoYnNpbmspOworICBnYm9vbGVhbiBsYXN0X3NhbXBsZV9lbmFibGVkOworCisgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X3Byb3Bvc2VfYWxsb2NhdGlvbiAodjRsMnNpbmstPnY0bDJvYmplY3QsIHF1ZXJ5KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZ19vYmplY3RfZ2V0IChic2luaywgImVuYWJsZS1sYXN0LXNhbXBsZSIsICZsYXN0X3NhbXBsZV9lbmFibGVkLCBOVUxMKTsKKworICBpZiAobGFzdF9zYW1wbGVfZW5hYmxlZCkgeworICAgIEdzdEJ1ZmZlclBvb2wgKnBvb2w7CisgICAgZ3VpbnQgc2l6ZSwgbWluLCBtYXg7CisKKyAgICBnc3RfcXVlcnlfcGFyc2VfbnRoX2FsbG9jYXRpb25fcG9vbCAocXVlcnksIDAsICZwb29sLCAmc2l6ZSwgJm1pbiwgJm1heCk7CisKKyAgICAvKiB3ZSBuZWVkIDEgbW9yZSwgb3RoZXJ3aXNlIHdlJ2xsIHJ1biBvdXQgb2YgYnVmZmVycyBhdCBwcmVyb2xsICovCisgICAgbWluKys7CisgICAgaWYgKG1heCA8IG1pbikKKyAgICAgIG1heCA9IG1pbjsKKworICAgIGdzdF9xdWVyeV9zZXRfbnRoX2FsbG9jYXRpb25fcG9vbCAocXVlcnksIDAsIHBvb2wsIHNpemUsIG1pbiwgbWF4KTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwb29sKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBjYWxsZWQgYWZ0ZXIgQS9WIHN5bmMgdG8gcmVuZGVyIGZyYW1lICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3Y0bDJzaW5rX3Nob3dfZnJhbWUgKEdzdFZpZGVvU2luayAqIHZzaW5rLCBHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdEZsb3dSZXR1cm4gcmV0OworICBHc3RWNGwyU2luayAqdjRsMnNpbmsgPSBHU1RfVjRMMlNJTksgKHZzaW5rKTsKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gdjRsMnNpbmstPnY0bDJvYmplY3Q7CisgIEdzdEJ1ZmZlclBvb2wgKmJwb29sID0gR1NUX0JVRkZFUl9QT09MIChvYmotPnBvb2wpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJzaW5rLCAicmVuZGVyIGJ1ZmZlcjogJXAiLCBidWYpOworCisgIGlmIChHX1VOTElLRUxZIChvYmotPnBvb2wgPT0gTlVMTCkpCisgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICBpZiAoR19VTkxJS0VMWSAoIWdzdF9idWZmZXJfcG9vbF9pc19hY3RpdmUgKGJwb29sKSkpIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKmNvbmZpZzsKKworICAgIC8qIHRoaXMgcG9vbCB3YXMgbm90IGFjdGl2YXRlZCwgY29uZmlndXJlIGFuZCBhY3RpdmF0ZSAqLworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJzaW5rLCAiYWN0aXZhdGluZyBwb29sIik7CisKKyAgICBjb25maWcgPSBnc3RfYnVmZmVyX3Bvb2xfZ2V0X2NvbmZpZyAoYnBvb2wpOworICAgIGdzdF9idWZmZXJfcG9vbF9jb25maWdfYWRkX29wdGlvbiAoY29uZmlnLAorICAgICAgICBHU1RfQlVGRkVSX1BPT0xfT1BUSU9OX1ZJREVPX01FVEEpOworICAgIGdzdF9idWZmZXJfcG9vbF9zZXRfY29uZmlnIChicG9vbCwgY29uZmlnKTsKKworICAgIGlmICghZ3N0X2J1ZmZlcl9wb29sX3NldF9hY3RpdmUgKGJwb29sLCBUUlVFKSkKKyAgICAgIGdvdG8gYWN0aXZhdGVfZmFpbGVkOworICB9CisKKyAgZ3N0X2J1ZmZlcl9yZWYgKGJ1Zik7CithZ2FpbjoKKyAgcmV0ID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcHJvY2VzcyAoR1NUX1Y0TDJfQlVGRkVSX1BPT0xfQ0FTVCAob2JqLT5wb29sKSwKKyAgICAgICZidWYpOworICBpZiAocmV0ID09IEdTVF9GTE9XX0ZMVVNISU5HKSB7CisgICAgcmV0ID0gZ3N0X2Jhc2Vfc2lua193YWl0X3ByZXJvbGwgKEdTVF9CQVNFX1NJTksgKHZzaW5rKSk7CisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19PSykKKyAgICAgIGdvdG8gYWdhaW47CisgIH0KKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICByZXR1cm4gcmV0OworCisgIC8qIEVSUk9SUyAqLworbm90X25lZ290aWF0ZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUICh2NGwyc2luaywgIm5vdCBuZWdvdGlhdGVkIik7CisgICAgcmV0dXJuIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEOworICB9CithY3RpdmF0ZV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAodjRsMnNpbmssIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkZhaWxlZCB0byBhbGxvY2F0ZWQgcmVxdWlyZWQgbWVtb3J5LiIpKSwKKyAgICAgICAgKCJCdWZmZXIgcG9vbCBhY3RpdmF0aW9uIGZhaWxlZCIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMnNpbmtfdW5sb2NrIChHc3RCYXNlU2luayAqIHNpbmspCit7CisgIEdzdFY0bDJTaW5rICp2NGwyc2luayA9IEdTVF9WNEwyU0lOSyAoc2luayk7CisgIHJldHVybiBnc3RfdjRsMl9vYmplY3RfdW5sb2NrICh2NGwyc2luay0+djRsMm9iamVjdCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJzaW5rX3VubG9ja19zdG9wIChHc3RCYXNlU2luayAqIHNpbmspCit7CisgIEdzdFY0bDJTaW5rICp2NGwyc2luayA9IEdTVF9WNEwyU0lOSyAoc2luayk7CisgIHJldHVybiBnc3RfdjRsMl9vYmplY3RfdW5sb2NrX3N0b3AgKHY0bDJzaW5rLT52NGwyb2JqZWN0KTsKK30KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJzaW5rLmggYi9zeXMvdjRsMi9nc3R2NGwyc2luay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZTk3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwyc2luay5oCkBAIC0wLDAgKzEsODEgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUZXhhcyBJbnN0cnVtZW50cywgSW5jIC0gaHR0cDovL3d3dy50aS5jb20vCisgKgorICogRGVzY3JpcHRpb246IFY0TDIgc2luayBlbGVtZW50CisgKiAgQ3JlYXRlZCBvbjogSnVsIDIsIDIwMDkKKyAqICAgICAgQXV0aG9yOiBSb2IgQ2xhcmsgPHJvYkB0aS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVFY0TDJTSU5LX0hfXworI2RlZmluZSBfX0dTVFY0TDJTSU5LX0hfXworCisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvc2luay5oPgorI2luY2x1ZGUgPGdzdHY0bDJvYmplY3QuaD4KKyNpbmNsdWRlIDxnc3R2NGwyYnVmZmVycG9vbC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfVjRMMlNJTksgXAorICAoZ3N0X3Y0bDJzaW5rX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WNEwyU0lOSyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLCBHU1RfVFlQRV9WNEwyU0lOSywgR3N0VjRsMlNpbmspKQorI2RlZmluZSBHU1RfVjRMMlNJTktfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksIEdTVF9UWVBFX1Y0TDJTSU5LLCBHc3RWNGwyU2lua0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJTSU5LKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksIEdTVF9UWVBFX1Y0TDJTSU5LKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJTSU5LX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLCBHU1RfVFlQRV9WNEwyU0lOSykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyU2luayBHc3RWNGwyU2luazsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyU2lua0NsYXNzIEdzdFY0bDJTaW5rQ2xhc3M7CisKKworc3RydWN0IF9Hc3RWNGwyU2luayB7CisgIEdzdFZpZGVvU2luayB2aWRlb3Npbms7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0OworCisgIGdpbnQgdmlkZW9fd2lkdGgsIHZpZGVvX2hlaWdodDsgICAgICAvKiBvcmlnaW5hbCAodW5zY2FsZWQpIHZpZGVvIHcvaCAqLworCisgIC8qCisgICAqIGZpZWxkIHRvIHN0b3JlIHJlcXVlc3RlZCBvdmVybGF5IGFuZCBjcm9wIHRvcC9sZWZ0L3dpZHRoL2hlaWdodCBwcm9wczoKKyAgICogbm90ZSwgY291bGQgbWF5YmUgYmUgY29tYmluZWQgd2l0aCAndndpbicgZmllbGQgaW4gR3N0VjRsMk9iamVjdD8KKyAgICovCisgIHN0cnVjdCB2NGwyX3JlY3Qgb3ZlcmxheSwgY3JvcDsKKworICAvKgorICAgKiBiaXRtYXNrIHRvIHRyYWNrIHdoaWNoIG92ZXJsYXkgYW5kIGNyb3AgZmllbGRzIHVzZXIgaGFzIHJlcXVlc3RlZCBieQorICAgKiBzZXR0aW5nIHByb3BlcnRpZXM6CisgICAqLworICBndWludDggb3ZlcmxheV9maWVsZHNfc2V0LCBjcm9wX2ZpZWxkc19zZXQ7Cit9OworCitzdHJ1Y3QgX0dzdFY0bDJTaW5rQ2xhc3MgeworICBHc3RWaWRlb1NpbmtDbGFzcyBwYXJlbnRfY2xhc3M7CisKKyAgR0xpc3QgKnY0bDJfY2xhc3NfZGV2aWNlczsKK307CisKK0dUeXBlIGdzdF92NGwyc2lua19nZXRfdHlwZSh2b2lkKTsKKworR19FTkRfREVDTFMKKworCisjZW5kaWYgLyogX19HU1RWNEwyU0lOS19IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJzcmMuYyBiL3N5cy92NGwyL2dzdHY0bDJzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTJlMGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMnNyYy5jCkBAIC0wLDAgKzEsMTA2NCBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogICAgICAgICAgICAgICAyMDA2IEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+CisgKgorICogZ3N0djRsMnNyYy5jOiBWaWRlbzRMaW51eDIgc291cmNlIGVsZW1lbnQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC12NGwyc3JjCisgKgorICogdjRsMnNyYyBjYW4gYmUgdXNlZCB0byBjYXB0dXJlIHZpZGVvIGZyb20gdjRsMiBkZXZpY2VzLCBsaWtlIHdlYmNhbXMgYW5kIHR2CisgKiBjYXJkcy4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBsYXVuY2ggbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHY0bDJzcmMgISB4dmltYWdlc2luaworICogXXwgVGhpcyBwaXBlbGluZSBzaG93cyB0aGUgdmlkZW8gY2FwdHVyZWQgZnJvbSAvZGV2L3ZpZGVvMCB0diBjYXJkIGFuZCBmb3IKKyAqIHdlYmNhbXMuCisgKiB8WworICogZ3N0LWxhdW5jaC0xLjAgdjRsMnNyYyAhIGpwZWdkZWMgISB4dmltYWdlc2luaworICogXXwgVGhpcyBwaXBlbGluZSBzaG93cyB0aGUgdmlkZW8gY2FwdHVyZWQgZnJvbSBhIHdlYmNhbSB0aGF0IGRlbGl2ZXJzIGpwZWcKKyAqIGltYWdlcy4KKyAqIDwvcmVmc2VjdDI+CisgKgorICogU2luY2UgMS4xNCwgdGhlIHVzZSBvZiBsaWJ2NGwyIGhhcyBiZWVuIGRpc2FibGVkIGR1ZSB0byBtYWpvciBidWdzIGluIHRoZQorICogZW11bGF0aW9uIGxheWVyLiBUbyBlbmFibGUgdXNhZ2Ugb2YgdGhpcyBsaWJyYXJ5LCBzZXQgdGhlIGVudmlyb25tZW50CisgKiB2YXJpYWJsZSBHU1RfVjRMMl9VU0VfTElCVjRMMj0xLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9tZXRhLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvcG9vbC5oPgorCisjaW5jbHVkZSAiZ3N0djRsMnNyYy5oIgorCisjaW5jbHVkZSAiZ3N0djRsMmNvbG9yYmFsYW5jZS5oIgorI2luY2x1ZGUgImdzdHY0bDJ0dW5lci5oIgorI2luY2x1ZGUgImdzdHY0bDJ2aWRvcmllbnQuaCIKKworI2luY2x1ZGUgImdzdC9nc3QtaTE4bi1wbHVnaW4uaCIKKworR1NUX0RFQlVHX0NBVEVHT1JZICh2NGwyc3JjX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIHY0bDJzcmNfZGVidWcKKworI2RlZmluZSBERUZBVUxUX1BST1BfREVWSUNFICAgIi9kZXYvdmlkZW8wIgorCitlbnVtCit7CisgIFBST1BfMCwKKyAgVjRMMl9TVERfT0JKRUNUX1BST1BTLAorICBQUk9QX0xBU1QKK307CisKKy8qIHNpZ25hbHMgYW5kIGFyZ3MgKi8KK2VudW0KK3sKKyAgU0lHTkFMX1BSRV9TRVRfRk9STUFULAorICBMQVNUX1NJR05BTAorfTsKKworc3RhdGljIGd1aW50IGdzdF92NGwyX3NpZ25hbHNbTEFTVF9TSUdOQUxdID0geyAwIH07CisKK0dTVF9JTVBMRU1FTlRfVjRMMl9DT0xPUl9CQUxBTkNFX01FVEhPRFMgKEdzdFY0bDJTcmMsIGdzdF92NGwyc3JjKTsKK0dTVF9JTVBMRU1FTlRfVjRMMl9UVU5FUl9NRVRIT0RTIChHc3RWNGwyU3JjLCBnc3RfdjRsMnNyYyk7CitHU1RfSU1QTEVNRU5UX1Y0TDJfVklET1JJRU5UX01FVEhPRFMgKEdzdFY0bDJTcmMsIGdzdF92NGwyc3JjKTsKKworc3RhdGljIHZvaWQgZ3N0X3Y0bDJzcmNfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwKKyAgICBncG9pbnRlciBpZmFjZV9kYXRhKTsKKworI2RlZmluZSBnc3RfdjRsMnNyY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoR3N0VjRsMlNyYywgZ3N0X3Y0bDJzcmMsIEdTVF9UWVBFX1BVU0hfU1JDLAorICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfVVJJX0hBTkRMRVIsIGdzdF92NGwyc3JjX3VyaV9oYW5kbGVyX2luaXQpOworICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfVFVORVIsIGdzdF92NGwyc3JjX3R1bmVyX2ludGVyZmFjZV9pbml0KTsKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKEdTVF9UWVBFX0NPTE9SX0JBTEFOQ0UsCisgICAgICAgIGdzdF92NGwyc3JjX2NvbG9yX2JhbGFuY2VfaW50ZXJmYWNlX2luaXQpOworICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoR1NUX1RZUEVfVklERU9fT1JJRU5UQVRJT04sCisgICAgICAgIGdzdF92NGwyc3JjX3ZpZGVvX29yaWVudGF0aW9uX2ludGVyZmFjZV9pbml0KSk7CisKK3N0YXRpYyB2b2lkIGdzdF92NGwyc3JjX2ZpbmFsaXplIChHc3RWNGwyU3JjICogdjRsMnNyYyk7CisKKy8qIGVsZW1lbnQgbWV0aG9kcyAqLworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIGdzdF92NGwyc3JjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbik7CisKKy8qIGJhc2VzcmMgbWV0aG9kcyAqLworc3RhdGljIGdib29sZWFuIGdzdF92NGwyc3JjX3N0YXJ0IChHc3RCYXNlU3JjICogc3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdjRsMnNyY191bmxvY2sgKEdzdEJhc2VTcmMgKiBzcmMpOworc3RhdGljIGdib29sZWFuIGdzdF92NGwyc3JjX3VubG9ja19zdG9wIChHc3RCYXNlU3JjICogc3JjKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdjRsMnNyY19zdG9wIChHc3RCYXNlU3JjICogc3JjKTsKK3N0YXRpYyBHc3RDYXBzICpnc3RfdjRsMnNyY19nZXRfY2FwcyAoR3N0QmFzZVNyYyAqIHNyYywgR3N0Q2FwcyAqIGZpbHRlcik7CitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3Y0bDJzcmNfcXVlcnkgKEdzdEJhc2VTcmMgKiBic3JjLCBHc3RRdWVyeSAqIHF1ZXJ5KTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdjRsMnNyY19kZWNpZGVfYWxsb2NhdGlvbiAoR3N0QmFzZVNyYyAqIHNyYywKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KTsKK3N0YXRpYyBHc3RGbG93UmV0dXJuIGdzdF92NGwyc3JjX2NyZWF0ZSAoR3N0UHVzaFNyYyAqIHNyYywgR3N0QnVmZmVyICoqIG91dCk7CitzdGF0aWMgR3N0Q2FwcyAqZ3N0X3Y0bDJzcmNfZml4YXRlIChHc3RCYXNlU3JjICogYmFzZXNyYywgR3N0Q2FwcyAqIGNhcHMsCisgICAgR3N0U3RydWN0dXJlICogcHJlZl9zKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3RfdjRsMnNyY19uZWdvdGlhdGUgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKTsKKworc3RhdGljIHZvaWQgZ3N0X3Y0bDJzcmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworc3RhdGljIHZvaWQgZ3N0X3Y0bDJzcmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LCBndWludCBwcm9wX2lkLAorICAgIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpOworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJzcmNfY2xhc3NfaW5pdCAoR3N0VjRsMlNyY0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHc3RCYXNlU3JjQ2xhc3MgKmJhc2VzcmNfY2xhc3M7CisgIEdzdFB1c2hTcmNDbGFzcyAqcHVzaHNyY19jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChrbGFzcyk7CisgIGJhc2VzcmNfY2xhc3MgPSBHU1RfQkFTRV9TUkNfQ0xBU1MgKGtsYXNzKTsKKyAgcHVzaHNyY19jbGFzcyA9IEdTVF9QVVNIX1NSQ19DTEFTUyAoa2xhc3MpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gKEdPYmplY3RGaW5hbGl6ZUZ1bmMpIGdzdF92NGwyc3JjX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSBnc3RfdjRsMnNyY19zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IGdzdF92NGwyc3JjX2dldF9wcm9wZXJ0eTsKKworICBlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPSBnc3RfdjRsMnNyY19jaGFuZ2Vfc3RhdGU7CisKKyAgZ3N0X3Y0bDJfb2JqZWN0X2luc3RhbGxfcHJvcGVydGllc19oZWxwZXIgKGdvYmplY3RfY2xhc3MsCisgICAgICBERUZBVUxUX1BST1BfREVWSUNFKTsKKworICAvKioKKyAgICogR3N0VjRsMlNyYzo6cHJlcGFyZS1mb3JtYXQ6CisgICAqIEB2NGwyc3JjOiB0aGUgdjRsMnNyYyBpbnN0YW5jZQorICAgKiBAZmQ6IHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGN1cnJlbnQgZGV2aWNlCisgICAqIEBjYXBzOiB0aGUgY2FwcyBvZiB0aGUgZm9ybWF0IGJlaW5nIHNldAorICAgKgorICAgKiBUaGlzIHNpZ25hbCBnZXRzIGVtaXR0ZWQgYmVmb3JlIGNhbGxpbmcgdGhlIHY0bDIgVklESU9DX1NfRk1UIGlvY3RsCisgICAqIChzZXQgZm9ybWF0KS4gVGhpcyBhbGxvd3MgZm9yIGFueSBjdXN0b20gY29uZmlndXJhdGlvbiBvZiB0aGUgZGV2aWNlIHRvCisgICAqIGhhcHBlbiBwcmlvciB0byB0aGUgZm9ybWF0IGJlaW5nIHNldC4KKyAgICogVGhpcyBpcyBtb3N0bHkgdXNlZnVsIGZvciBVVkMgSDI2NCBlbmNvZGluZyBjYW1lcmFzIHdoaWNoIG5lZWQgdGhlIEgyNjQKKyAgICogUHJvYmUgJiBDb21taXQgdG8gaGFwcGVuIHByaW9yIHRvIHRoZSBub3JtYWwgUHJvYmUgJiBDb21taXQuCisgICAqCisgICAqIFNpbmNlOiAwLjEwLjMyCisgICAqLworICBnc3RfdjRsMl9zaWduYWxzW1NJR05BTF9QUkVfU0VUX0ZPUk1BVF0gPSBnX3NpZ25hbF9uZXcgKCJwcmVwYXJlLWZvcm1hdCIsCisgICAgICBHX1RZUEVfRlJPTV9DTEFTUyAoa2xhc3MpLAorICAgICAgR19TSUdOQUxfUlVOX0xBU1QsCisgICAgICAwLCBOVUxMLCBOVUxMLCBOVUxMLCBHX1RZUEVfTk9ORSwgMiwgR19UWVBFX0lOVCwgR1NUX1RZUEVfQ0FQUyk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywKKyAgICAgICJWaWRlbyAodmlkZW80bGludXgyKSBTb3VyY2UiLCAiU291cmNlL1ZpZGVvIiwKKyAgICAgICJSZWFkcyBmcmFtZXMgZnJvbSBhIFZpZGVvNExpbnV4MiBkZXZpY2UiLAorICAgICAgIkVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+LCAiCisgICAgICAiU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PiIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVtcGxhdGUKKyAgICAgIChlbGVtZW50X2NsYXNzLAorICAgICAgZ3N0X3BhZF90ZW1wbGF0ZV9uZXcgKCJzcmMiLCBHU1RfUEFEX1NSQywgR1NUX1BBRF9BTFdBWVMsCisgICAgICAgICAgZ3N0X3Y0bDJfb2JqZWN0X2dldF9hbGxfY2FwcyAoKSkpOworCisgIGJhc2VzcmNfY2xhc3MtPmdldF9jYXBzID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyc3JjX2dldF9jYXBzKTsKKyAgYmFzZXNyY19jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJzcmNfc3RhcnQpOworICBiYXNlc3JjX2NsYXNzLT51bmxvY2sgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJzcmNfdW5sb2NrKTsKKyAgYmFzZXNyY19jbGFzcy0+dW5sb2NrX3N0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJzcmNfdW5sb2NrX3N0b3ApOworICBiYXNlc3JjX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyc3JjX3N0b3ApOworICBiYXNlc3JjX2NsYXNzLT5xdWVyeSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMnNyY19xdWVyeSk7CisgIGJhc2VzcmNfY2xhc3MtPm5lZ290aWF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMnNyY19uZWdvdGlhdGUpOworICBiYXNlc3JjX2NsYXNzLT5kZWNpZGVfYWxsb2NhdGlvbiA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJzcmNfZGVjaWRlX2FsbG9jYXRpb24pOworCisgIHB1c2hzcmNfY2xhc3MtPmNyZWF0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMnNyY19jcmVhdGUpOworCisgIGtsYXNzLT52NGwyX2NsYXNzX2RldmljZXMgPSBOVUxMOworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUICh2NGwyc3JjX2RlYnVnLCAidjRsMnNyYyIsIDAsICJWNEwyIHNvdXJjZSBlbGVtZW50Iik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMnNyY19pbml0IChHc3RWNGwyU3JjICogdjRsMnNyYykKK3sKKyAgLyogZml4bWU6IGdpdmUgYW4gdXBkYXRlX2Zwc19mdW5jdGlvbiAqLworICB2NGwyc3JjLT52NGwyb2JqZWN0ID0gZ3N0X3Y0bDJfb2JqZWN0X25ldyAoR1NUX0VMRU1FTlQgKHY0bDJzcmMpLAorICAgICAgR1NUX09CSkVDVCAoR1NUX0JBU0VfU1JDX1BBRCAodjRsMnNyYykpLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCisgICAgICBERUZBVUxUX1BST1BfREVWSUNFLCBnc3RfdjRsMl9nZXRfaW5wdXQsIGdzdF92NGwyX3NldF9pbnB1dCwgTlVMTCk7CisKKyAgLyogQXZvaWQgdGhlIHNsb3cgcHJvYmVzICovCisgIHY0bDJzcmMtPnY0bDJvYmplY3QtPnNraXBfdHJ5X2ZtdF9wcm9iZXMgPSBUUlVFOworCisgIGdzdF9iYXNlX3NyY19zZXRfZm9ybWF0IChHU1RfQkFTRV9TUkMgKHY0bDJzcmMpLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfYmFzZV9zcmNfc2V0X2xpdmUgKEdTVF9CQVNFX1NSQyAodjRsMnNyYyksIFRSVUUpOworfQorCisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMnNyY19maW5hbGl6ZSAoR3N0VjRsMlNyYyAqIHY0bDJzcmMpCit7CisgIGdzdF92NGwyX29iamVjdF9kZXN0cm95ICh2NGwyc3JjLT52NGwyb2JqZWN0KTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKChHT2JqZWN0ICopICh2NGwyc3JjKSk7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF92NGwyc3JjX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWNGwyU3JjICp2NGwyc3JjID0gR1NUX1Y0TDJTUkMgKG9iamVjdCk7CisKKyAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfc2V0X3Byb3BlcnR5X2hlbHBlciAodjRsMnNyYy0+djRsMm9iamVjdCwKKyAgICAgICAgICBwcm9wX2lkLCB2YWx1ZSwgcHNwZWMpKSB7CisgICAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyc3JjX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWNGwyU3JjICp2NGwyc3JjID0gR1NUX1Y0TDJTUkMgKG9iamVjdCk7CisKKyAgaWYgKCFnc3RfdjRsMl9vYmplY3RfZ2V0X3Byb3BlcnR5X2hlbHBlciAodjRsMnNyYy0+djRsMm9iamVjdCwKKyAgICAgICAgICBwcm9wX2lkLCB2YWx1ZSwgcHNwZWMpKSB7CisgICAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworc3RydWN0IFByZWZlcmVkQ2Fwc0luZm8KK3sKKyAgZ2ludCB3aWR0aDsKKyAgZ2ludCBoZWlnaHQ7CisgIGdpbnQgZnBzX247CisgIGdpbnQgZnBzX2Q7Cit9OworCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92bDQyX3NyY19maXhhdGVfZmllbGRzIChHUXVhcmsgZmllbGRfaWQsIEdWYWx1ZSAqIHZhbHVlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFN0cnVjdHVyZSAqcyA9IHVzZXJfZGF0YTsKKworICBpZiAoZmllbGRfaWQgPT0gZ19xdWFya19mcm9tX3N0cmluZyAoImludGVybGFjZS1tb2RlIikpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKGZpZWxkX2lkID09IGdfcXVhcmtfZnJvbV9zdHJpbmcgKCJjb2xvcmltZXRyeSIpKQorICAgIHJldHVybiBUUlVFOworCisgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkIChzLCBnX3F1YXJrX3RvX3N0cmluZyAoZmllbGRfaWQpKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3NyY19maXhhdGVfc3RydWN0X3dpdGhfcHJlZmVyZW5jZSAoR3N0U3RydWN0dXJlICogcywKKyAgICBzdHJ1Y3QgUHJlZmVyZWRDYXBzSW5mbyAqcHJlZikKK3sKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAid2lkdGgiKSkKKyAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAocywgIndpZHRoIiwgcHJlZi0+d2lkdGgpOworCisgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgImhlaWdodCIpKQorICAgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfaW50IChzLCAiaGVpZ2h0IiwgcHJlZi0+aGVpZ2h0KTsKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHMsICJmcmFtZXJhdGUiKSkKKyAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ZyYWN0aW9uIChzLCAiZnJhbWVyYXRlIiwgcHJlZi0+ZnBzX24sCisgICAgICAgIHByZWYtPmZwc19kKTsKKworICAvKiBGaW5hbGx5LCBmaXhhdGUgZXZlcnl0aGluZyBlbHNlIGV4Y2VwdCB0aGUgaW50ZXJsYWNlLW1vZGUgYW5kIGNvbG9yaW1ldHJ5CisgICAqIHdoaWNoIHN0aWxsIG5lZWQgZnVydGhlciBuZWdvdGlhdGlvbiBhcyBpdCB3YXNuJ3QgcHJvYmVkICovCisgIGdzdF9zdHJ1Y3R1cmVfbWFwX2luX3BsYWNlIChzLCBnc3Rfdmw0Ml9zcmNfZml4YXRlX2ZpZWxkcywgcyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9zcmNfcGFyc2VfZml4ZWRfc3RydWN0IChHc3RTdHJ1Y3R1cmUgKiBzLAorICAgIGdpbnQgKiB3aWR0aCwgZ2ludCAqIGhlaWdodCwgZ2ludCAqIGZwc19uLCBnaW50ICogZnBzX2QpCit7CisgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgIndpZHRoIikgJiYgd2lkdGgpCisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAid2lkdGgiLCB3aWR0aCk7CisKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAiaGVpZ2h0IikgJiYgaGVpZ2h0KQorICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImhlaWdodCIsIGhlaWdodCk7CisKKyAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzLCAiZnJhbWVyYXRlIikgJiYgZnBzX24gJiYgZnBzX2QpCisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfZnJhY3Rpb24gKHMsICJmcmFtZXJhdGUiLCBmcHNfbiwgZnBzX2QpOworfQorCisvKiBUT0RPIENvbnNpZGVyIGZyYW1lcmF0ZSAqLworc3RhdGljIGdpbnQKK2dzdF92NGwyc3JjX2ZpeGVkX2NhcHNfY29tcGFyZSAoR3N0U3RydWN0dXJlICogYSwgR3N0U3RydWN0dXJlICogYiwKKyAgICBzdHJ1Y3QgUHJlZmVyZWRDYXBzSW5mbyAqcHJlZikKK3sKKyAgZ2ludCBhdyA9IEdfTUFYSU5ULCBhaCA9IEdfTUFYSU5ULCBhZCA9IEdfTUFYSU5UOworICBnaW50IGJ3ID0gR19NQVhJTlQsIGJoID0gR19NQVhJTlQsIGJkID0gR19NQVhJTlQ7CisgIGdpbnQgcmV0OworCisgIGdzdF92NGwyX3NyY19wYXJzZV9maXhlZF9zdHJ1Y3QgKGEsICZhdywgJmFoLCBOVUxMLCBOVUxMKTsKKyAgZ3N0X3Y0bDJfc3JjX3BhcnNlX2ZpeGVkX3N0cnVjdCAoYiwgJmJ3LCAmYmgsIE5VTEwsIE5VTEwpOworCisgIC8qIFdoZW4gYm90aCBhcmUgc21hbGxlciB0aGVuIHByZWYsIGp1c3QgYXBwZW5kIHRvIHRoZSBlbmQgKi8KKyAgaWYgKChidyA8IHByZWYtPndpZHRoIHx8IGJoIDwgcHJlZi0+aGVpZ2h0KQorICAgICAgJiYgKGF3IDwgcHJlZi0+d2lkdGggfHwgYWggPCBwcmVmLT5oZWlnaHQpKSB7CisgICAgcmV0ID0gMTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKiBJZiBhIGlzIHNtYWxsZXIgdGhlbiBwcmVmIGFuZCBub3QgYiwgdGhlbiBhIGdvZXMgYWZ0ZXIgYiAqLworICBpZiAoYXcgPCBwcmVmLT53aWR0aCB8fCBhaCA8IHByZWYtPmhlaWdodCkgeworICAgIHJldCA9IDE7CisgICAgZ290byBkb25lOworICB9CisKKyAgLyogSWYgYiBpcyBzbWFsbGVyIHRoZW4gcHJlZiBhbmQgbm90IGEsIHRoZW4gYSBnb2VzIGJlZm9yZSBiICovCisgIGlmIChidyA8IHByZWYtPndpZHRoIHx8IGJoIDwgcHJlZi0+aGVpZ2h0KSB7CisgICAgcmV0ID0gLTE7CisgICAgZ290byBkb25lOworICB9CisKKyAgLyogQm90aCBhcmUgbGFyZ2VyIG9yIGVxdWFsIHRvIHRoZSBwcmVmZXJlbmNlLCBwcmVmZXIgdGhlIHNtYWxsZXN0ICovCisgIGFkID0gTUFYICgxLCBhdyAtIHByZWYtPndpZHRoKSAqIE1BWCAoMSwgYWggLSBwcmVmLT5oZWlnaHQpOworICBiZCA9IE1BWCAoMSwgYncgLSBwcmVmLT53aWR0aCkgKiBNQVggKDEsIGJoIC0gcHJlZi0+aGVpZ2h0KTsKKworICAvKiBBZGp1c3Qgc2xpZ2h0bHkgaW4gY2FzZSB3aWR0aC9oZWlnaHQgbWF0Y2hlZCB0aGUgcHJlZmVyZW5jZSAqLworICBpZiAoYXcgPT0gcHJlZi0+d2lkdGgpCisgICAgYWQgLT0gMTsKKworICBpZiAoYWggPT0gcHJlZi0+aGVpZ2h0KQorICAgIGFkIC09IDE7CisKKyAgaWYgKGJ3ID09IHByZWYtPndpZHRoKQorICAgIGJkIC09IDE7CisKKyAgaWYgKGJoID09IHByZWYtPmhlaWdodCkKKyAgICBiZCAtPSAxOworCisgIC8qIElmIHRoZSBjaG9pY2VzIGFyZSBlcXVpdmFsZW50LCBtYWludGFpbiB0aGUgb3JkZXIgKi8KKyAgaWYgKGFkID09IGJkKQorICAgIHJldCA9IDE7CisgIGVsc2UKKyAgICByZXQgPSBhZCAtIGJkOworCitkb25lOgorICBHU1RfVFJBQ0UgKCJQbGFjaW5nICVpeCVpICglcykgJXMgJWl4JWkgKCVzKSIsIGF3LCBhaCwKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoYSwgImZvcm1hdCIpLCByZXQgPiAwID8gImFmdGVyIiA6ICJiZWZvcmUiLCBidywKKyAgICAgIGJoLCBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKGIsICJmb3JtYXQiKSk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJzcmNfc2V0X2Zvcm1hdCAoR3N0VjRsMlNyYyAqIHY0bDJzcmMsIEdzdENhcHMgKiBjYXBzLAorICAgIEdzdFY0bDJFcnJvciAqIGVycm9yKQoreworICBHc3RWNGwyT2JqZWN0ICpvYmo7CisKKyAgb2JqID0gdjRsMnNyYy0+djRsMm9iamVjdDsKKworICAvKiBtYWtlIHN1cmUgd2Ugc3RvcCBjYXB0dXJpbmcgYW5kIGRlYWxsb2MgYnVmZmVycyAqLworICBpZiAoIWdzdF92NGwyX29iamVjdF9zdG9wIChvYmopKQorICAgIHJldHVybiBGQUxTRTsKKworICBnX3NpZ25hbF9lbWl0ICh2NGwyc3JjLCBnc3RfdjRsMl9zaWduYWxzW1NJR05BTF9QUkVfU0VUX0ZPUk1BVF0sIDAsCisgICAgICB2NGwyc3JjLT52NGwyb2JqZWN0LT52aWRlb19mZCwgY2Fwcyk7CisKKyAgcmV0dXJuIGdzdF92NGwyX29iamVjdF9zZXRfZm9ybWF0IChvYmosIGNhcHMsIGVycm9yKTsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3Y0bDJzcmNfZml4YXRlIChHc3RCYXNlU3JjICogYmFzZXNyYywgR3N0Q2FwcyAqIGNhcHMsIEdzdFN0cnVjdHVyZSAqIHByZWZfcykKK3sKKyAgLyogTGV0J3MgcHJlZmVyIGEgZ29vZCByZXNvbHV0aWlvbiBhcyBvZiB0b2RheSdzIHN0YW5kYXJkLiAqLworICBzdHJ1Y3QgUHJlZmVyZWRDYXBzSW5mbyBwcmVmID0geworICAgIDM4NDAsIDIxNjAsIDEyMCwgMQorICB9OworICBHc3RWNGwyU3JjICp2NGwyc3JjID0gR1NUX1Y0TDJTUkMgKGJhc2VzcmMpOworICBHc3RWNGwyT2JqZWN0ICpvYmogPSB2NGwyc3JjLT52NGwyb2JqZWN0OworICBHTGlzdCAqY2Fwc19saXN0ID0gTlVMTDsKKyAgR3N0U3RydWN0dXJlICpzOworICBnaW50IGkgPSBHX01BWElOVDsKKyAgR3N0VjRsMkVycm9yIGVycm9yID0gR1NUX1Y0TDJfRVJST1JfSU5JVDsKKyAgR3N0Q2FwcyAqZmNhcHMgPSBOVUxMOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VzcmMsICJmaXhhdGluZyBjYXBzICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICBjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoY2Fwcyk7CisKKyAgLyogV2UgY29uc2lkZXIgdGhlIGZpcnN0IHN0cnVjdHVyZSBmcm9tIHBlZXJjYXBzIHRvIGJlIGEgcHJlZmVyZW5jZS4gVGhpcyBpcworICAgKiB1c2VmdWwgZm9yIG1hdGNoaW5nIGEgcmVwb3J0ZWQgbmF0aXZlIGRpc3BsYXksIG9yIHNpbXBseSB0byBhdm9pZAorICAgKiB0cmFuc2Zvcm1hdGlvbiB0byBoYXBwZW4gZG93bnN0cmVhbS4gKi8KKyAgaWYgKHByZWZfcykgeworICAgIHByZWZfcyA9IGdzdF9zdHJ1Y3R1cmVfY29weSAocHJlZl9zKTsKKyAgICBnc3RfdjRsMl9zcmNfZml4YXRlX3N0cnVjdF93aXRoX3ByZWZlcmVuY2UgKHByZWZfcywgJnByZWYpOworICAgIGdzdF92NGwyX3NyY19wYXJzZV9maXhlZF9zdHJ1Y3QgKHByZWZfcywgJnByZWYud2lkdGgsICZwcmVmLmhlaWdodCwKKyAgICAgICAgJnByZWYuZnBzX24sICZwcmVmLmZwc19kKTsKKyAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHByZWZfcyk7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChiYXNlc3JjLCAiUHJlZmVyZWQgc2l6ZSAlaXglaSIsIHByZWYud2lkdGgsIHByZWYuaGVpZ2h0KTsKKworICAvKiBTb3J0IHRoZSBzdHJ1Y3R1cmVzIHRvIGdldCB0aGUgY2FwcyB0aGF0IGlzIG5lYXJlc3QgdG8gb3VyIHByZWZlcmVuY2VzLAorICAgKiBmaXJzdCAqLworICB3aGlsZSAoKHMgPSBnc3RfY2Fwc19zdGVhbF9zdHJ1Y3R1cmUgKGNhcHMsIDApKSkgeworICAgIGdzdF92NGwyX3NyY19maXhhdGVfc3RydWN0X3dpdGhfcHJlZmVyZW5jZSAocywgJnByZWYpOworICAgIGNhcHNfbGlzdCA9IGdfbGlzdF9pbnNlcnRfc29ydGVkX3dpdGhfZGF0YSAoY2Fwc19saXN0LCBzLAorICAgICAgICAoR0NvbXBhcmVEYXRhRnVuYykgZ3N0X3Y0bDJzcmNfZml4ZWRfY2Fwc19jb21wYXJlLCAmcHJlZik7CisgIH0KKworICB3aGlsZSAoY2Fwc19saXN0KSB7CisgICAgcyA9IGNhcHNfbGlzdC0+ZGF0YTsKKyAgICBjYXBzX2xpc3QgPSBnX2xpc3RfZGVsZXRlX2xpbmsgKGNhcHNfbGlzdCwgY2Fwc19saXN0KTsKKyAgICBnc3RfY2Fwc19hcHBlbmRfc3RydWN0dXJlIChjYXBzLCBzKTsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VzcmMsICJzb3J0ZWQgYW5kIG5vcm1hbGl6ZWQgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIGNhcHMpOworCisgIC8qIEVhY2ggc3RydWN0dXJlIGluIHRoZSBjYXBzIGhhcyBiZWVuIGZpeGF0ZWQsIGV4Y2VwdCBmb3IgdGhlCisgICAqIGludGVybGFjZS1tb2RlIGFuZCBjb2xvcmltZXRyeS4gTm93IG5vcm1hbGl6ZSB0aGUgY2FwcyBzbyB3ZSBjYW4KKyAgICogZW51bWVyYXRlIHRoZSBwb3NzaWJpbGl0aWVzICovCisgIGNhcHMgPSBnc3RfY2Fwc19ub3JtYWxpemUgKGNhcHMpOworCisgIGZvciAoaSA9IDA7IGkgPCBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7ICsraSkgeworICAgIGdzdF92NGwyX2NsZWFyX2Vycm9yICgmZXJyb3IpOworICAgIGlmIChmY2FwcykKKyAgICAgIGdzdF9jYXBzX3VucmVmIChmY2Fwcyk7CisKKyAgICBmY2FwcyA9IGdzdF9jYXBzX2NvcHlfbnRoIChjYXBzLCBpKTsKKworICAgIGlmIChHU1RfVjRMMl9JU19BQ1RJVkUgKG9iaikpIHsKKyAgICAgIC8qIEp1c3QgY2hlY2sgaWYgdGhlIGZvcm1hdCBpcyBhY2NlcHRhYmxlLCBvbmNlIHdlIGtub3cKKyAgICAgICAqIG5vIGJ1ZmZlcnMgc2hvdWxkIGJlIG91dHN0YW5kaW5nIHdlIHRyeSBTX0ZNVC4KKyAgICAgICAqCisgICAgICAgKiBCYXNlc3JjIHdpbGwgZG8gYW4gYWxsb2NhdGlvbiBxdWVyeSB0aGF0CisgICAgICAgKiBzaG91bGQgaW5kaXJlY3RseSByZWNsYWltIGJ1ZmZlcnMsIGFmdGVyIHRoYXQgd2UgY2FuCisgICAgICAgKiBzZXQgdGhlIGZvcm1hdCBhbmQgdGhlbiBjb25maWd1cmUgb3VyIHBvb2wgKi8KKyAgICAgIGlmIChnc3RfdjRsMl9vYmplY3RfdHJ5X2Zvcm1hdCAob2JqLCBmY2FwcywgJmVycm9yKSkgeworICAgICAgICAvKiBtYWtlIHN1cmUgdGhlIGNhcHMgY2hhbmdlZCBiZWZvcmUgZG9pbmcgYW55dGhpbmcgKi8KKyAgICAgICAgaWYgKGdzdF92NGwyX29iamVjdF9jYXBzX2VxdWFsIChvYmosIGZjYXBzKSkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICB2NGwyc3JjLT5yZW5lZ290aWF0aW9uX2FkanVzdCA9IHY0bDJzcmMtPm9mZnNldCArIDE7CisgICAgICAgIHY0bDJzcmMtPnBlbmRpbmdfc2V0X2ZtdCA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoZ3N0X3Y0bDJzcmNfc2V0X2Zvcm1hdCAodjRsMnNyYywgZmNhcHMsICZlcnJvcikpCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIE9ubHkgRUlWQUwgbWFrZSBzZW5zZSwgcmVwb3J0IGFueSBvdGhlciBlcnJvcnMsIHRoaXMgd2F5IHdlIGRvbid0IGtlZXAKKyAgICAgKiBwcm9iaW5nIGlmIHRoZSBkZXZpY2UgZ290IGRpc2Nvbm5lY3RlZCwgb3IgaWYgaXQncyBmaXJtd2FyZSBzdG9wcGVkCisgICAgICogcmVzcG9uZGluZyAqLworICAgIGlmIChlcnJvci5lcnJvci0+Y29kZSAhPSBHU1RfUkVTT1VSQ0VfRVJST1JfU0VUVElOR1MpIHsKKyAgICAgIGkgPSBHX01BWElOVDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChpID49IGdzdF9jYXBzX2dldF9zaXplIChjYXBzKSkgeworICAgIGdzdF92NGwyX2Vycm9yICh2NGwyc3JjLCAmZXJyb3IpOworICAgIGlmIChmY2FwcykKKyAgICAgIGdzdF9jYXBzX3VucmVmIChmY2Fwcyk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VzcmMsICJmaXhhdGVkIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGZjYXBzKTsKKworICByZXR1cm4gZmNhcHM7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJzcmNfbmVnb3RpYXRlIChHc3RCYXNlU3JjICogYmFzZXNyYykKK3sKKyAgR3N0Q2FwcyAqdGhpc2NhcHM7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworICBHc3RDYXBzICpwZWVyY2FwcyA9IE5VTEw7CisgIGdib29sZWFuIHJlc3VsdCA9IEZBTFNFOworCisgIC8qIGZpcnN0IHNlZSB3aGF0IGlzIHBvc3NpYmxlIG9uIG91ciBzb3VyY2UgcGFkICovCisgIHRoaXNjYXBzID0gZ3N0X3BhZF9xdWVyeV9jYXBzIChHU1RfQkFTRV9TUkNfUEFEIChiYXNlc3JjKSwgTlVMTCk7CisgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VzcmMsICJjYXBzIG9mIHNyYzogJSIgR1NUX1BUUl9GT1JNQVQsIHRoaXNjYXBzKTsKKworICAvKiBub3RoaW5nIG9yIGFueXRoaW5nIGlzIGFsbG93ZWQsIHdlJ3JlIGRvbmUgKi8KKyAgaWYgKHRoaXNjYXBzID09IE5VTEwgfHwgZ3N0X2NhcHNfaXNfYW55ICh0aGlzY2FwcykpCisgICAgZ290byBub19uZWdvX25lZWRlZDsKKworICAvKiBnZXQgdGhlIHBlZXIgY2FwcyB3aXRob3V0IGEgZmlsdGVyIGFzIHdlJ2xsIGZpbHRlciBvdXJzZWx2ZXMgbGF0ZXIgb24gKi8KKyAgcGVlcmNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAoR1NUX0JBU0VfU1JDX1BBRCAoYmFzZXNyYyksIE5VTEwpOworICBHU1RfREVCVUdfT0JKRUNUIChiYXNlc3JjLCAiY2FwcyBvZiBwZWVyOiAlIiBHU1RfUFRSX0ZPUk1BVCwgcGVlcmNhcHMpOworICBpZiAocGVlcmNhcHMgJiYgIWdzdF9jYXBzX2lzX2FueSAocGVlcmNhcHMpKSB7CisgICAgLyogUHJlZmVyIHRoZSBmaXJzdCBjYXBzIHdlIGFyZSBjb21wYXRpYmxlIHdpdGggdGhhdCB0aGUgcGVlciBwcm9wb3NlZCAqLworICAgIGNhcHMgPSBnc3RfY2Fwc19pbnRlcnNlY3RfZnVsbCAocGVlcmNhcHMsIHRoaXNjYXBzLAorICAgICAgICBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAoYmFzZXNyYywgImludGVyc2VjdDogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKHRoaXNjYXBzKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBubyBwZWVyIG9yIHBlZXIgaGF2ZSBBTlkgY2Fwcywgd29yayB3aXRoIG91ciBvd24gY2FwcyB0aGVuICovCisgICAgY2FwcyA9IHRoaXNjYXBzOworICB9CisKKyAgaWYgKGNhcHMpIHsKKyAgICAvKiBub3cgZml4YXRlICovCisgICAgaWYgKCFnc3RfY2Fwc19pc19lbXB0eSAoY2FwcykpIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqcHJlZiA9IE5VTEw7CisKKyAgICAgIGlmIChwZWVyY2FwcyAmJiAhZ3N0X2NhcHNfaXNfYW55IChwZWVyY2FwcykpCisgICAgICAgIHByZWYgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChwZWVyY2FwcywgMCk7CisKKyAgICAgIGNhcHMgPSBnc3RfdjRsMnNyY19maXhhdGUgKGJhc2VzcmMsIGNhcHMsIHByZWYpOworCisgICAgICAvKiBGaXhhdGluZyBtYXkgZmFpbCBhcyB3ZSBub3cgc2V0IHRoZSBzZWxlY3RlZCBmb3JtYXQgKi8KKyAgICAgIGlmICghY2FwcykgeworICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChiYXNlc3JjLCAiZml4YXRlZCB0bzogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgICAgICBpZiAoZ3N0X2NhcHNfaXNfYW55IChjYXBzKSkgeworICAgICAgICAvKiBobW0sIHN0aWxsIGFueXRoaW5nLCBzbyBlbGVtZW50IGNhbiBkbyBhbnl0aGluZyBhbmQKKyAgICAgICAgICogbmVnbyBpcyBub3QgbmVlZGVkICovCisgICAgICAgIHJlc3VsdCA9IFRSVUU7CisgICAgICB9IGVsc2UgaWYgKGdzdF9jYXBzX2lzX2ZpeGVkIChjYXBzKSkgeworICAgICAgICAvKiB5YXksIGZpeGVkIGNhcHMsIHVzZSB0aG9zZSB0aGVuICovCisgICAgICAgIHJlc3VsdCA9IGdzdF9iYXNlX3NyY19zZXRfY2FwcyAoYmFzZXNyYywgY2Fwcyk7CisgICAgICB9CisgICAgfQorICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgfQorCitkb25lOgorICBpZiAocGVlcmNhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKHBlZXJjYXBzKTsKKworICByZXR1cm4gcmVzdWx0OworCitub19uZWdvX25lZWRlZDoKKyAgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGJhc2VzcmMsICJubyBuZWdvdGlhdGlvbiBuZWVkZWQiKTsKKyAgICBpZiAodGhpc2NhcHMpCisgICAgICBnc3RfY2Fwc191bnJlZiAodGhpc2NhcHMpOworICAgIHJldHVybiBUUlVFOworICB9Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF92NGwyc3JjX2dldF9jYXBzIChHc3RCYXNlU3JjICogc3JjLCBHc3RDYXBzICogZmlsdGVyKQoreworICBHc3RWNGwyU3JjICp2NGwyc3JjOworICBHc3RWNGwyT2JqZWN0ICpvYmo7CisKKyAgdjRsMnNyYyA9IEdTVF9WNEwyU1JDIChzcmMpOworICBvYmogPSB2NGwyc3JjLT52NGwyb2JqZWN0OworCisgIGlmICghR1NUX1Y0TDJfSVNfT1BFTiAob2JqKSkgeworICAgIHJldHVybiBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0JBU0VfU1JDX1BBRCAodjRsMnNyYykpOworICB9CisKKyAgcmV0dXJuIGdzdF92NGwyX29iamVjdF9nZXRfY2FwcyAob2JqLCBmaWx0ZXIpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyc3JjX2RlY2lkZV9hbGxvY2F0aW9uIChHc3RCYXNlU3JjICogYnNyYywgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0VjRsMlNyYyAqc3JjID0gR1NUX1Y0TDJTUkMgKGJzcmMpOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIGlmIChzcmMtPnBlbmRpbmdfc2V0X2ZtdCkgeworICAgIEdzdENhcHMgKmNhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKEdTVF9CQVNFX1NSQ19QQUQgKGJzcmMpKTsKKyAgICBHc3RWNGwyRXJyb3IgZXJyb3IgPSBHU1RfVjRMMl9FUlJPUl9JTklUOworCisgICAgY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGNhcHMpOworICAgIGlmICghKHJldCA9IGdzdF92NGwyc3JjX3NldF9mb3JtYXQgKHNyYywgY2FwcywgJmVycm9yKSkpCisgICAgICBnc3RfdjRsMl9lcnJvciAoc3JjLCAmZXJyb3IpOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIHNyYy0+cGVuZGluZ19zZXRfZm10ID0gRkFMU0U7CisgIH0gZWxzZSBpZiAoZ3N0X2J1ZmZlcl9wb29sX2lzX2FjdGl2ZSAoc3JjLT52NGwyb2JqZWN0LT5wb29sKSkgeworICAgIC8qIFRyaWNrIGJhc2VzcmMgaW50byBub3QgZGVhY3RpdmF0aW5nIHRoZSBhY3RpdmUgcG9vbC4gUmVuZWdvdGlhdGluZyBoZXJlCisgICAgICogd291bGQgb3RoZXJ3aXNlIHR1cm4gb2ZmIGFuZCBvbiB0aGUgY2FtZXJhLiAqLworICAgIEdzdEFsbG9jYXRvciAqYWxsb2NhdG9yOworICAgIEdzdEFsbG9jYXRpb25QYXJhbXMgcGFyYW1zOworICAgIEdzdEJ1ZmZlclBvb2wgKnBvb2w7CisKKyAgICBnc3RfYmFzZV9zcmNfZ2V0X2FsbG9jYXRvciAoYnNyYywgJmFsbG9jYXRvciwgJnBhcmFtcyk7CisgICAgcG9vbCA9IGdzdF9iYXNlX3NyY19nZXRfYnVmZmVyX3Bvb2wgKGJzcmMpOworCisgICAgaWYgKGdzdF9xdWVyeV9nZXRfbl9hbGxvY2F0aW9uX3BhcmFtcyAocXVlcnkpKQorICAgICAgZ3N0X3F1ZXJ5X3NldF9udGhfYWxsb2NhdGlvbl9wYXJhbSAocXVlcnksIDAsIGFsbG9jYXRvciwgJnBhcmFtcyk7CisgICAgZWxzZQorICAgICAgZ3N0X3F1ZXJ5X2FkZF9hbGxvY2F0aW9uX3BhcmFtIChxdWVyeSwgYWxsb2NhdG9yLCAmcGFyYW1zKTsKKworICAgIGlmIChnc3RfcXVlcnlfZ2V0X25fYWxsb2NhdGlvbl9wb29scyAocXVlcnkpKQorICAgICAgZ3N0X3F1ZXJ5X3NldF9udGhfYWxsb2NhdGlvbl9wb29sIChxdWVyeSwgMCwgcG9vbCwKKyAgICAgICAgICBzcmMtPnY0bDJvYmplY3QtPmluZm8uc2l6ZSwgMSwgMCk7CisgICAgZWxzZQorICAgICAgZ3N0X3F1ZXJ5X2FkZF9hbGxvY2F0aW9uX3Bvb2wgKHF1ZXJ5LCBwb29sLCBzcmMtPnY0bDJvYmplY3QtPmluZm8uc2l6ZSwgMSwKKyAgICAgICAgICAwKTsKKworICAgIGlmIChwb29sKQorICAgICAgZ3N0X29iamVjdF91bnJlZiAocG9vbCk7CisgICAgaWYgKGFsbG9jYXRvcikKKyAgICAgIGdzdF9vYmplY3RfdW5yZWYgKGFsbG9jYXRvcik7CisKKyAgICByZXR1cm4gR1NUX0JBU0VfU1JDX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kZWNpZGVfYWxsb2NhdGlvbiAoYnNyYywgcXVlcnkpOworICB9CisKKyAgaWYgKHJldCkgeworICAgIHJldCA9IGdzdF92NGwyX29iamVjdF9kZWNpZGVfYWxsb2NhdGlvbiAoc3JjLT52NGwyb2JqZWN0LCBxdWVyeSk7CisgICAgaWYgKHJldCkKKyAgICAgIHJldCA9IEdTVF9CQVNFX1NSQ19DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGVjaWRlX2FsbG9jYXRpb24gKGJzcmMsIHF1ZXJ5KTsKKyAgfQorCisgIGlmIChyZXQpIHsKKyAgICBpZiAoIWdzdF9idWZmZXJfcG9vbF9zZXRfYWN0aXZlIChzcmMtPnY0bDJvYmplY3QtPnBvb2wsIFRSVUUpKQorICAgICAgZ290byBhY3RpdmF0ZV9mYWlsZWQ7CisgIH0KKworICByZXR1cm4gcmV0OworCithY3RpdmF0ZV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIpKSwKKyAgICAgICAgKCJCdWZmZXIgcG9vbCBhY3RpdmF0aW9uIGZhaWxlZCIpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMnNyY19xdWVyeSAoR3N0QmFzZVNyYyAqIGJzcmMsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFY0bDJTcmMgKnNyYzsKKyAgR3N0VjRsMk9iamVjdCAqb2JqOworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKworICBzcmMgPSBHU1RfVjRMMlNSQyAoYnNyYyk7CisgIG9iaiA9IHNyYy0+djRsMm9iamVjdDsKKworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9MQVRFTkNZOnsKKyAgICAgIEdzdENsb2NrVGltZSBtaW5fbGF0ZW5jeSwgbWF4X2xhdGVuY3k7CisgICAgICBndWludDMyIGZwc19uLCBmcHNfZDsKKyAgICAgIGd1aW50IG51bV9idWZmZXJzID0gMDsKKworICAgICAgLyogZGV2aWNlIG11c3QgYmUgb3BlbiAqLworICAgICAgaWYgKCFHU1RfVjRMMl9JU19PUEVOIChvYmopKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoc3JjLAorICAgICAgICAgICAgIkNhbid0IGdpdmUgbGF0ZW5jeSBzaW5jZSBkZXZpY2UgaXNuJ3Qgb3BlbiAhIik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKworICAgICAgZnBzX24gPSBHU1RfVjRMMl9GUFNfTiAob2JqKTsKKyAgICAgIGZwc19kID0gR1NUX1Y0TDJfRlBTX0QgKG9iaik7CisKKyAgICAgIC8qIHdlIG11c3QgaGF2ZSBhIGZyYW1lcmF0ZSAqLworICAgICAgaWYgKGZwc19uIDw9IDAgfHwgZnBzX2QgPD0gMCkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNyYywKKyAgICAgICAgICAgICJDYW4ndCBnaXZlIGxhdGVuY3kgc2luY2UgZnJhbWVyYXRlIGlzbid0IGZpeGF0ZWQgISIpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisKKyAgICAgIC8qIG1pbiBsYXRlbmN5IGlzIHRoZSB0aW1lIHRvIGNhcHR1cmUgb25lIGZyYW1lICovCisgICAgICBtaW5fbGF0ZW5jeSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKEdTVF9TRUNPTkQsIGZwc19kLCBmcHNfbik7CisKKyAgICAgIC8qIG1heCBsYXRlbmN5IGlzIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBmcmFtZSBidWZmZXIgKi8KKyAgICAgIGlmIChvYmotPnBvb2wgIT0gTlVMTCkKKyAgICAgICAgbnVtX2J1ZmZlcnMgPSBHU1RfVjRMMl9CVUZGRVJfUE9PTF9DQVNUIChvYmotPnBvb2wpLT5tYXhfbGF0ZW5jeTsKKworICAgICAgaWYgKG51bV9idWZmZXJzID09IDApCisgICAgICAgIG1heF9sYXRlbmN5ID0gLTE7CisgICAgICBlbHNlCisgICAgICAgIG1heF9sYXRlbmN5ID0gbnVtX2J1ZmZlcnMgKiBtaW5fbGF0ZW5jeTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoYnNyYywKKyAgICAgICAgICAicmVwb3J0IGxhdGVuY3kgbWluICUiIEdTVF9USU1FX0ZPUk1BVCAiIG1heCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAobWluX2xhdGVuY3kpLCBHU1RfVElNRV9BUkdTIChtYXhfbGF0ZW5jeSkpOworCisgICAgICAvKiB3ZSBhcmUgYWx3YXlzIGxpdmUsIHRoZSBtaW4gbGF0ZW5jeSBpcyAxIGZyYW1lIGFuZCB0aGUgbWF4IGxhdGVuY3kgaXMKKyAgICAgICAqIHRoZSBjb21wbGV0ZSBidWZmZXIgb2YgZnJhbWVzLiAqLworICAgICAgZ3N0X3F1ZXJ5X3NldF9sYXRlbmN5IChxdWVyeSwgVFJVRSwgbWluX2xhdGVuY3ksIG1heF9sYXRlbmN5KTsKKworICAgICAgcmVzID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcmVzID0gR1NUX0JBU0VfU1JDX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5xdWVyeSAoYnNyYywgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKworZG9uZToKKworICByZXR1cm4gcmVzOworfQorCisvKiBzdGFydCBhbmQgc3RvcCBhcmUgbm90IHN5bW1ldHJpYyAtLSBzdGFydCB3aWxsIG9wZW4gdGhlIGRldmljZSwgYnV0IG5vdCBzdGFydAorICogY2FwdHVyZS4gaXQncyBzZXRjYXBzIHRoYXQgd2lsbCBzdGFydCBjYXB0dXJlLCB3aGljaCBpcyBjYWxsZWQgdmlhIGJhc2VzcmMncworICogbmVnb3RpYXRlIG1ldGhvZC4gc3RvcCB3aWxsIGJvdGggc3RvcCBjYXB0dXJlIGFuZCBjbG9zZSB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyc3JjX3N0YXJ0IChHc3RCYXNlU3JjICogc3JjKQoreworICBHc3RWNGwyU3JjICp2NGwyc3JjID0gR1NUX1Y0TDJTUkMgKHNyYyk7CisKKyAgdjRsMnNyYy0+b2Zmc2V0ID0gMDsKKyAgdjRsMnNyYy0+cmVuZWdvdGlhdGlvbl9hZGp1c3QgPSAwOworCisgIC8qIGFjdGl2YXRlIHNldHRpbmdzIGZvciBmaXJzdCBmcmFtZSAqLworICB2NGwyc3JjLT5jdHJsX3RpbWUgPSAwOworICBnc3Rfb2JqZWN0X3N5bmNfdmFsdWVzIChHU1RfT0JKRUNUIChzcmMpLCB2NGwyc3JjLT5jdHJsX3RpbWUpOworCisgIHY0bDJzcmMtPmhhc19iYWRfdGltZXN0YW1wID0gRkFMU0U7CisgIHY0bDJzcmMtPmxhc3RfdGltZXN0YW1wID0gMDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMnNyY191bmxvY2sgKEdzdEJhc2VTcmMgKiBzcmMpCit7CisgIEdzdFY0bDJTcmMgKnY0bDJzcmMgPSBHU1RfVjRMMlNSQyAoc3JjKTsKKyAgcmV0dXJuIGdzdF92NGwyX29iamVjdF91bmxvY2sgKHY0bDJzcmMtPnY0bDJvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyc3JjX3VubG9ja19zdG9wIChHc3RCYXNlU3JjICogc3JjKQoreworICBHc3RWNGwyU3JjICp2NGwyc3JjID0gR1NUX1Y0TDJTUkMgKHNyYyk7CisKKyAgdjRsMnNyYy0+bGFzdF90aW1lc3RhbXAgPSAwOworCisgIHJldHVybiBnc3RfdjRsMl9vYmplY3RfdW5sb2NrX3N0b3AgKHY0bDJzcmMtPnY0bDJvYmplY3QpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyc3JjX3N0b3AgKEdzdEJhc2VTcmMgKiBzcmMpCit7CisgIEdzdFY0bDJTcmMgKnY0bDJzcmMgPSBHU1RfVjRMMlNSQyAoc3JjKTsKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gdjRsMnNyYy0+djRsMm9iamVjdDsKKworICBpZiAoR1NUX1Y0TDJfSVNfQUNUSVZFIChvYmopKSB7CisgICAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfc3RvcCAob2JqKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHY0bDJzcmMtPnBlbmRpbmdfc2V0X2ZtdCA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK2dzdF92NGwyc3JjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFN0YXRlQ2hhbmdlIHRyYW5zaXRpb24pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldCA9IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUzsKKyAgR3N0VjRsMlNyYyAqdjRsMnNyYyA9IEdTVF9WNEwyU1JDIChlbGVtZW50KTsKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gdjRsMnNyYy0+djRsMm9iamVjdDsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfTlVMTF9UT19SRUFEWToKKyAgICAgIC8qIG9wZW4gdGhlIGRldmljZSAqLworICAgICAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfb3BlbiAob2JqKSkKKyAgICAgICAgcmV0dXJuIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldCA9IEdTVF9FTEVNRU5UX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5jaGFuZ2Vfc3RhdGUgKGVsZW1lbnQsIHRyYW5zaXRpb24pOworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19OVUxMOgorICAgICAgLyogY2xvc2UgdGhlIGRldmljZSAqLworICAgICAgaWYgKCFnc3RfdjRsMl9vYmplY3RfY2xvc2UgKG9iaikpCisgICAgICAgIHJldHVybiBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdjRsMnNyY19jcmVhdGUgKEdzdFB1c2hTcmMgKiBzcmMsIEdzdEJ1ZmZlciAqKiBidWYpCit7CisgIEdzdFY0bDJTcmMgKnY0bDJzcmMgPSBHU1RfVjRMMlNSQyAoc3JjKTsKKyAgR3N0VjRsMk9iamVjdCAqb2JqID0gdjRsMnNyYy0+djRsMm9iamVjdDsKKyAgR3N0VjRsMkJ1ZmZlclBvb2wgKnBvb2wgPSBHU1RfVjRMMl9CVUZGRVJfUE9PTF9DQVNUIChvYmotPnBvb2wpOworICBHc3RGbG93UmV0dXJuIHJldDsKKyAgR3N0Q2xvY2sgKmNsb2NrOworICBHc3RDbG9ja1RpbWUgYWJzX3RpbWUsIGJhc2VfdGltZSwgdGltZXN0YW1wLCBkdXJhdGlvbjsKKyAgR3N0Q2xvY2tUaW1lIGRlbGF5OworICBHc3RNZXNzYWdlICpxb3NfbXNnOworCisgIGRvIHsKKyAgICByZXQgPSBHU1RfQkFTRV9TUkNfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmFsbG9jIChHU1RfQkFTRV9TUkMgKHNyYyksIDAsCisgICAgICAgIG9iai0+aW5mby5zaXplLCBidWYpOworCisgICAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykpCisgICAgICBnb3RvIGFsbG9jX2ZhaWxlZDsKKworICAgIHJldCA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX3Byb2Nlc3MgKHBvb2wsIGJ1Zik7CisKKyAgfSB3aGlsZSAocmV0ID09IEdTVF9WNEwyX0ZMT1dfQ09SUlVQVEVEX0JVRkZFUik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKHJldCAhPSBHU1RfRkxPV19PSykpCisgICAgZ290byBlcnJvcjsKKworICB0aW1lc3RhbXAgPSBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoKmJ1Zik7CisgIGR1cmF0aW9uID0gb2JqLT5kdXJhdGlvbjsKKworICAvKiB0aW1lc3RhbXBzLCBMT0NLIHRvIGdldCBjbG9jayBhbmQgYmFzZSB0aW1lLiAqLworICAvKiBGSVhNRTogZWxlbWVudCBjbG9jayBhbmQgYmFzZV90aW1lIGlzIHJhcmVseSBjaGFuZ2luZyAqLworICBHU1RfT0JKRUNUX0xPQ0sgKHY0bDJzcmMpOworICBpZiAoKGNsb2NrID0gR1NUX0VMRU1FTlRfQ0xPQ0sgKHY0bDJzcmMpKSkgeworICAgIC8qIHdlIGhhdmUgYSBjbG9jaywgZ2V0IGJhc2UgdGltZSBhbmQgcmVmIGNsb2NrICovCisgICAgYmFzZV90aW1lID0gR1NUX0VMRU1FTlQgKHY0bDJzcmMpLT5iYXNlX3RpbWU7CisgICAgZ3N0X29iamVjdF9yZWYgKGNsb2NrKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBubyBjbG9jaywgY2FuJ3Qgc2V0IHRpbWVzdGFtcHMgKi8KKyAgICBiYXNlX3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9CisgIEdTVF9PQkpFQ1RfVU5MT0NLICh2NGwyc3JjKTsKKworICAvKiBzYW1wbGUgcGlwZWxpbmUgY2xvY2sgKi8KKyAgaWYgKGNsb2NrKSB7CisgICAgYWJzX3RpbWUgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKGNsb2NrKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChjbG9jayk7CisgIH0gZWxzZSB7CisgICAgYWJzX3RpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICB9CisKK3JldHJ5OgorICBpZiAoIXY0bDJzcmMtPmhhc19iYWRfdGltZXN0YW1wICYmIHRpbWVzdGFtcCAhPSBHU1RfQ0xPQ0tfVElNRV9OT05FKSB7CisgICAgc3RydWN0IHRpbWVzcGVjIG5vdzsKKyAgICBHc3RDbG9ja1RpbWUgZ3N0bm93OworCisgICAgLyogdjRsMiBzcGVjcyBzYXkgdG8gdXNlIHRoZSBzeXN0ZW0gdGltZSBhbHRob3VnaCBtYW55IGRyaXZlcnMgc3dpdGNoZWQgdG8KKyAgICAgKiB0aGUgbW9yZSBkZXNpcmFibGUgbW9ub3RvbmljIHRpbWUuIFdlIGZpcnN0IHRyeSB0byB1c2UgdGhlIG1vbm90b25pYyB0aW1lCisgICAgICogYW5kIHNlZSBob3cgdGhhdCBnb2VzICovCisgICAgY2xvY2tfZ2V0dGltZSAoQ0xPQ0tfTU9OT1RPTklDLCAmbm93KTsKKyAgICBnc3Rub3cgPSBHU1RfVElNRVNQRUNfVE9fVElNRSAobm93KTsKKworICAgIGlmICh0aW1lc3RhbXAgPiBnc3Rub3cgfHwgKGdzdG5vdyAtIHRpbWVzdGFtcCkgPiAoMTAgKiBHU1RfU0VDT05EKSkgeworICAgICAgR1RpbWVWYWwgbm93OworCisgICAgICAvKiB2ZXJ5IGxhcmdlIGRpZmYsIGZhbGwgYmFjayB0byBzeXN0ZW0gdGltZSAqLworICAgICAgZ19nZXRfY3VycmVudF90aW1lICgmbm93KTsKKyAgICAgIGdzdG5vdyA9IEdTVF9USU1FVkFMX1RPX1RJTUUgKG5vdyk7CisgICAgfQorCisgICAgLyogRGV0ZWN0IGJ1Z2d5IGRyaXZlcnMgaGVyZSwgYW5kIHN0b3AgdXNpbmcgdGhlaXIgdGltZXN0YW1wLiBGYWlsaW5nIGFueQorICAgICAqIG9mIHRoZXNlIGNvbmRpdGlvbiB3b3VsZCBpbXBseSBhIHZlcnkgYnVnZ3kgZHJpdmVyOgorICAgICAqICAgLSBUaW1lc3RhbXAgaW4gdGhlIGZ1dHVyZQorICAgICAqICAgLSBUaW1lc3RhbXAgaXMgZ29pbmcgYmFja3dhcmQgY29tcGFyZSB0byBsYXN0IHNlZW4gdGltZXN0YW1wCisgICAgICogICAtIFRpbWVzdGFtcCBpcyBqdW1waW5nIGZvcndhcmQgZm9yIGxlc3MgdGhlbiBhIGZyYW1lIGR1cmF0aW9uCisgICAgICogICAtIERlbGF5IGlzIGJpZ2dlciB0aGVuIHRoZSBhY3R1YWwgdGltZXN0YW1wCisgICAgICogKi8KKyAgICBpZiAodGltZXN0YW1wID4gZ3N0bm93KSB7CisgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJzcmMsCisgICAgICAgICAgIlRpbWVzdGFtcCBpbiB0aGUgZnV0dXJlIGRldGVjdGVkLCBpZ25vcmluZyBkcml2ZXIgdGltZXN0YW1wcyIpOworICAgICAgdjRsMnNyYy0+aGFzX2JhZF90aW1lc3RhbXAgPSBUUlVFOworICAgICAgZ290byByZXRyeTsKKyAgICB9CisKKyAgICBpZiAodjRsMnNyYy0+bGFzdF90aW1lc3RhbXAgPiB0aW1lc3RhbXApIHsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMnNyYywKKyAgICAgICAgICAiVGltZXN0YW1wIGdvaW5nIGJhY2t3YXJkLCBpZ25vcmluZyBkcml2ZXIgdGltZXN0YW1wcyIpOworICAgICAgdjRsMnNyYy0+aGFzX2JhZF90aW1lc3RhbXAgPSBUUlVFOworICAgICAgZ290byByZXRyeTsKKyAgICB9CisKKyAgICBkZWxheSA9IGdzdG5vdyAtIHRpbWVzdGFtcDsKKworICAgIGlmIChkZWxheSA+IHRpbWVzdGFtcCkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyc3JjLAorICAgICAgICAgICJUaW1lc3RhbXAgZG9lcyBub3QgY29ycmVsYXRlIHdpdGggYW55IGNsb2NrLCBpZ25vcmluZyBkcml2ZXIgdGltZXN0YW1wcyIpOworICAgICAgdjRsMnNyYy0+aGFzX2JhZF90aW1lc3RhbXAgPSBUUlVFOworICAgICAgZ290byByZXRyeTsKKyAgICB9CisKKyAgICAvKiBTYXZlIGxhc3QgdGltZXN0YW1wIGZvciBzYW5pdHkgY2hlY2tzICovCisgICAgdjRsMnNyYy0+bGFzdF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUICh2NGwyc3JjLCAidHM6ICUiIEdTVF9USU1FX0ZPUk1BVCAiIG5vdyAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgIiBkZWxheSAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHRpbWVzdGFtcCksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKGdzdG5vdyksIEdTVF9USU1FX0FSR1MgKGRlbGF5KSk7CisgIH0gZWxzZSB7CisgICAgLyogd2UgYXNzdW1lIDEgZnJhbWUgbGF0ZW5jeSBvdGhlcndpc2UgKi8KKyAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGR1cmF0aW9uKSkKKyAgICAgIGRlbGF5ID0gZHVyYXRpb247CisgICAgZWxzZQorICAgICAgZGVsYXkgPSAwOworICB9CisKKyAgLyogc2V0IGJ1ZmZlciBtZXRhZGF0YSAqLworCisgIGlmIChHX0xJS0VMWSAoYWJzX3RpbWUgIT0gR1NUX0NMT0NLX1RJTUVfTk9ORSkpIHsKKyAgICAvKiB0aGUgdGltZSBub3cgaXMgdGhlIHRpbWUgb2YgdGhlIGNsb2NrIG1pbnVzIHRoZSBiYXNlIHRpbWUgKi8KKyAgICB0aW1lc3RhbXAgPSBhYnNfdGltZSAtIGJhc2VfdGltZTsKKworICAgIC8qIGFkanVzdCBmb3IgZGVsYXkgaW4gdGhlIGRldmljZSAqLworICAgIGlmICh0aW1lc3RhbXAgPiBkZWxheSkKKyAgICAgIHRpbWVzdGFtcCAtPSBkZWxheTsKKyAgICBlbHNlCisgICAgICB0aW1lc3RhbXAgPSAwOworICB9IGVsc2UgeworICAgIHRpbWVzdGFtcCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIH0KKworICAvKiBhY3RpdmF0ZSBzZXR0aW5ncyBmb3IgbmV4dCBmcmFtZSAqLworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGR1cmF0aW9uKSkgeworICAgIHY0bDJzcmMtPmN0cmxfdGltZSArPSBkdXJhdGlvbjsKKyAgfSBlbHNlIHsKKyAgICAvKiB0aGlzIGlzIG5vdCB2ZXJ5IGdvb2QgKGFzIGl0IHNob3VsZCBiZSB0aGUgbmV4dCB0aW1lc3RhbXApLAorICAgICAqIHN0aWxsIGdvb2QgZW5vdWdoIGZvciBsaW5lYXIgZmFkZXMgKGFzIGxvbmcgYXMgaXQgaXMgbm90IC0xKQorICAgICAqLworICAgIHY0bDJzcmMtPmN0cmxfdGltZSA9IHRpbWVzdGFtcDsKKyAgfQorICBnc3Rfb2JqZWN0X3N5bmNfdmFsdWVzIChHU1RfT0JKRUNUIChzcmMpLCB2NGwyc3JjLT5jdHJsX3RpbWUpOworCisgIEdTVF9JTkZPX09CSkVDVCAoc3JjLCAic3luYyB0byAlIiBHU1RfVElNRV9GT1JNQVQgIiBvdXQgdHMgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAodjRsMnNyYy0+Y3RybF90aW1lKSwgR1NUX1RJTUVfQVJHUyAodGltZXN0YW1wKSk7CisKKyAgLyogdXNlIGdlbmVyYXRlZCBvZmZzZXQgdmFsdWVzIG9ubHkgaWYgdGhlcmUgYXJlIG5vdCBhbHJlYWR5IHZhbGlkIG9uZXMKKyAgICogc2V0IGJ5IHRoZSB2NGwyIGRldmljZSAqLworICBpZiAoIUdTVF9CVUZGRVJfT0ZGU0VUX0lTX1ZBTElEICgqYnVmKQorICAgICAgfHwgIUdTVF9CVUZGRVJfT0ZGU0VUX0VORF9JU19WQUxJRCAoKmJ1ZikpIHsKKyAgICBHU1RfQlVGRkVSX09GRlNFVCAoKmJ1ZikgPSB2NGwyc3JjLT5vZmZzZXQrKzsKKyAgICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKCpidWYpID0gdjRsMnNyYy0+b2Zmc2V0OworICB9IGVsc2UgeworICAgIC8qIGFkanVzdCByYXcgdjRsMiBkZXZpY2Ugc2VxdWVuY2UsIHdpbGwgcmVzdGFydCBhdCBudWxsIGluIGNhc2Ugb2YgcmVuZWdvdGlhdGlvbgorICAgICAqIChzdHJlYW1vZmYvc3RyZWFtb24pICovCisgICAgR1NUX0JVRkZFUl9PRkZTRVQgKCpidWYpICs9IHY0bDJzcmMtPnJlbmVnb3RpYXRpb25fYWRqdXN0OworICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoKmJ1ZikgKz0gdjRsMnNyYy0+cmVuZWdvdGlhdGlvbl9hZGp1c3Q7CisgICAgLyogY2hlY2sgZm9yIGZyYW1lIGxvc3Mgd2l0aCBnaXZlbiAoZnJvbSB2NGwyIGRldmljZSkgYnVmZmVyIG9mZnNldCAqLworICAgIGlmICgodjRsMnNyYy0+b2Zmc2V0ICE9IDApCisgICAgICAgICYmIChHU1RfQlVGRkVSX09GRlNFVCAoKmJ1ZikgIT0gKHY0bDJzcmMtPm9mZnNldCArIDEpKSkgeworICAgICAgZ3VpbnQ2NCBsb3N0X2ZyYW1lX2NvdW50ID0gR1NUX0JVRkZFUl9PRkZTRVQgKCpidWYpIC0gdjRsMnNyYy0+b2Zmc2V0IC0gMTsKKyAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMnNyYywKKyAgICAgICAgICAibG9zdCBmcmFtZXMgZGV0ZWN0ZWQ6IGNvdW50ID0gJSIgR19HVUlOVDY0X0ZPUk1BVCAiIC0gdHM6ICUiCisgICAgICAgICAgR1NUX1RJTUVfRk9STUFULCBsb3N0X2ZyYW1lX2NvdW50LCBHU1RfVElNRV9BUkdTICh0aW1lc3RhbXApKTsKKworICAgICAgcW9zX21zZyA9IGdzdF9tZXNzYWdlX25ld19xb3MgKEdTVF9PQkpFQ1RfQ0FTVCAodjRsMnNyYyksIFRSVUUsCisgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSwgR1NUX0NMT0NLX1RJTUVfTk9ORSwgdGltZXN0YW1wLAorICAgICAgICAgIEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChkdXJhdGlvbikgPyBsb3N0X2ZyYW1lX2NvdW50ICoKKyAgICAgICAgICBkdXJhdGlvbiA6IEdTVF9DTE9DS19USU1FX05PTkUpOworICAgICAgZ3N0X2VsZW1lbnRfcG9zdF9tZXNzYWdlIChHU1RfRUxFTUVOVF9DQVNUICh2NGwyc3JjKSwgcW9zX21zZyk7CisKKyAgICB9CisgICAgdjRsMnNyYy0+b2Zmc2V0ID0gR1NUX0JVRkZFUl9PRkZTRVQgKCpidWYpOworICB9CisKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKCpidWYpID0gdGltZXN0YW1wOworICBHU1RfQlVGRkVSX0RVUkFUSU9OICgqYnVmKSA9IGR1cmF0aW9uOworCisgIHJldHVybiByZXQ7CisKKyAgLyogRVJST1IgKi8KK2FsbG9jX2ZhaWxlZDoKKyAgeworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfRkxVU0hJTkcpCisgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc3JjLCBSRVNPVVJDRSwgTk9fU1BBQ0VfTEVGVCwKKyAgICAgICAgICAoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJ1ZmZlciIpLCAoTlVMTCkpOworICAgIHJldHVybiByZXQ7CisgIH0KK2Vycm9yOgorICB7CisgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlIChidWYsIE5VTEwpOworICAgIGlmIChyZXQgPT0gR1NUX1Y0TDJfRkxPV19MQVNUX0JVRkZFUikgeworICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNyYywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgICAoIkRyaXZlciByZXR1cm5lZCBhIGJ1ZmZlciB3aXRoIG5vIHBheWxvYWQsIHRoaXMgbW9zdCBsaWtlbHkgIgorICAgICAgICAgICAgICAiaW5kaWNhdGUgYSBidWcgaW4gdGhlIGRyaXZlci4iKSwgKE5VTEwpKTsKKyAgICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzcmMsICJlcnJvciBwcm9jZXNzaW5nIGJ1ZmZlciAlZCAoJXMpIiwgcmV0LAorICAgICAgICAgIGdzdF9mbG93X2dldF9uYW1lIChyZXQpKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgfQorfQorCisKKy8qIEdzdFVSSUhhbmRsZXIgaW50ZXJmYWNlICovCitzdGF0aWMgR3N0VVJJVHlwZQorZ3N0X3Y0bDJzcmNfdXJpX2dldF90eXBlIChHVHlwZSB0eXBlKQoreworICByZXR1cm4gR1NUX1VSSV9TUkM7Cit9CisKK3N0YXRpYyBjb25zdCBnY2hhciAqY29uc3QgKgorZ3N0X3Y0bDJzcmNfdXJpX2dldF9wcm90b2NvbHMgKEdUeXBlIHR5cGUpCit7CisgIHN0YXRpYyBjb25zdCBnY2hhciAqcHJvdG9jb2xzW10gPSB7ICJ2NGwyIiwgTlVMTCB9OworCisgIHJldHVybiBwcm90b2NvbHM7Cit9CisKK3N0YXRpYyBnY2hhciAqCitnc3RfdjRsMnNyY191cmlfZ2V0X3VyaSAoR3N0VVJJSGFuZGxlciAqIGhhbmRsZXIpCit7CisgIEdzdFY0bDJTcmMgKnY0bDJzcmMgPSBHU1RfVjRMMlNSQyAoaGFuZGxlcik7CisKKyAgaWYgKHY0bDJzcmMtPnY0bDJvYmplY3QtPnZpZGVvZGV2ICE9IE5VTEwpIHsKKyAgICByZXR1cm4gZ19zdHJkdXBfcHJpbnRmICgidjRsMjovLyVzIiwgdjRsMnNyYy0+djRsMm9iamVjdC0+dmlkZW9kZXYpOworICB9CisKKyAgcmV0dXJuIGdfc3RyZHVwICgidjRsMjovLyIpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyc3JjX3VyaV9zZXRfdXJpIChHc3RVUklIYW5kbGVyICogaGFuZGxlciwgY29uc3QgZ2NoYXIgKiB1cmksCisgICAgR0Vycm9yICoqIGVycm9yKQoreworICBHc3RWNGwyU3JjICp2NGwyc3JjID0gR1NUX1Y0TDJTUkMgKGhhbmRsZXIpOworICBjb25zdCBnY2hhciAqZGV2aWNlID0gREVGQVVMVF9QUk9QX0RFVklDRTsKKworICBpZiAoc3RyY21wICh1cmksICJ2NGwyOi8vIikgIT0gMCkgeworICAgIGRldmljZSA9IHVyaSArIDc7CisgIH0KKyAgZ19vYmplY3Rfc2V0ICh2NGwyc3JjLCAiZGV2aWNlIiwgZGV2aWNlLCBOVUxMKTsKKworICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJzcmNfdXJpX2hhbmRsZXJfaW5pdCAoZ3BvaW50ZXIgZ19pZmFjZSwgZ3BvaW50ZXIgaWZhY2VfZGF0YSkKK3sKKyAgR3N0VVJJSGFuZGxlckludGVyZmFjZSAqaWZhY2UgPSAoR3N0VVJJSGFuZGxlckludGVyZmFjZSAqKSBnX2lmYWNlOworCisgIGlmYWNlLT5nZXRfdHlwZSA9IGdzdF92NGwyc3JjX3VyaV9nZXRfdHlwZTsKKyAgaWZhY2UtPmdldF9wcm90b2NvbHMgPSBnc3RfdjRsMnNyY191cmlfZ2V0X3Byb3RvY29sczsKKyAgaWZhY2UtPmdldF91cmkgPSBnc3RfdjRsMnNyY191cmlfZ2V0X3VyaTsKKyAgaWZhY2UtPnNldF91cmkgPSBnc3RfdjRsMnNyY191cmlfc2V0X3VyaTsKK30KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJzcmMuaCBiL3N5cy92NGwyL2dzdHY0bDJzcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjdmNzUxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMnNyYy5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqICAgICAgICAgICAgICAgMjAwNiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICoKKyAqIGdzdHY0bDJzcmMuaDogQlQ4eDgvVjRMMiBzb3VyY2UgZWxlbWVudAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfVjRMMlNSQ19IX18KKyNkZWZpbmUgX19HU1RfVjRMMlNSQ19IX18KKworI2luY2x1ZGUgPGdzdHY0bDJvYmplY3QuaD4KKyNpbmNsdWRlIDxnc3R2NGwyYnVmZmVycG9vbC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfVjRMMlNSQyBcCisgIChnc3RfdjRsMnNyY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfVjRMMlNSQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1Y0TDJTUkMsR3N0VjRsMlNyYykpCisjZGVmaW5lIEdTVF9WNEwyU1JDX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1Y0TDJTUkMsR3N0VjRsMlNyY0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJTUkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WNEwyU1JDKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJTUkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVjRMMlNSQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyU3JjIEdzdFY0bDJTcmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMlNyY0NsYXNzIEdzdFY0bDJTcmNDbGFzczsKKworLyoqCisgKiBHc3RWNGwyU3JjOgorICoKKyAqIE9wYXF1ZSBvYmplY3QuCisgKi8KK3N0cnVjdCBfR3N0VjRsMlNyYworeworICBHc3RQdXNoU3JjIHB1c2hzcmM7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0OworCisgIGd1aW50NjQgb2Zmc2V0OworCisgIC8qIG9mZnNldCBhZGp1c3QgYWZ0ZXIgcmVuZWdvdGlhdGlvbiAqLworICBndWludDY0IHJlbmVnb3RpYXRpb25fYWRqdXN0OworCisgIEdzdENsb2NrVGltZSBjdHJsX3RpbWU7CisKKyAgZ2Jvb2xlYW4gcGVuZGluZ19zZXRfZm10OworCisgIC8qIFRpbWVzdGFtcCBzYW5pdHkgY2hlY2sgKi8KKyAgR3N0Q2xvY2tUaW1lIGxhc3RfdGltZXN0YW1wOworICBnYm9vbGVhbiBoYXNfYmFkX3RpbWVzdGFtcDsKK307CisKK3N0cnVjdCBfR3N0VjRsMlNyY0NsYXNzCit7CisgIEdzdFB1c2hTcmNDbGFzcyBwYXJlbnRfY2xhc3M7CisKKyAgR0xpc3QgKnY0bDJfY2xhc3NfZGV2aWNlczsKK307CisKK0dUeXBlIGdzdF92NGwyc3JjX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1Y0TDJTUkNfSF9fICovCmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmMgYi9zeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwNTJhOAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJ0cmFuc2Zvcm0uYwpAQCAtMCwwICsxLDEyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgQ29sbGFib3JhIEx0ZC4KKyAqICAgICBBdXRob3I6IE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdzdHY0bDJvYmplY3QuaCIKKyNpbmNsdWRlICJnc3R2NGwydHJhbnNmb3JtLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisKKyNkZWZpbmUgREVGQVVMVF9QUk9QX0RFVklDRSAiL2Rldi92aWRlbzEwIgorCisjZGVmaW5lIFY0TDJfVFJBTlNGT1JNX1FVQVJLIFwKKwlnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZygiZ3N0LXY0bDItdHJhbnNmb3JtLWluZm8iKQorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfdjRsMl90cmFuc2Zvcm1fZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZ3N0X3Y0bDJfdHJhbnNmb3JtX2RlYnVnCisKKworZW51bQoreworICBQUk9QXzAsCisgIFY0TDJfU1REX09CSkVDVF9QUk9QUworfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ2NoYXIgKmRldmljZTsKKyAgR3N0Q2FwcyAqc2lua19jYXBzOworICBHc3RDYXBzICpzcmNfY2FwczsKK30gR3N0VjRsMlRyYW5zZm9ybUNEYXRhOworCisjZGVmaW5lIGdzdF92NGwyX3RyYW5zZm9ybV9wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9BQlNUUkFDVF9UWVBFIChHc3RWNGwyVHJhbnNmb3JtLCBnc3RfdjRsMl90cmFuc2Zvcm0sCisgICAgR1NUX1RZUEVfQkFTRV9UUkFOU0ZPUk0pOworCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdHJhbnNmb3JtX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWNGwyVHJhbnNmb3JtICpzZWxmID0gR1NUX1Y0TDJfVFJBTlNGT1JNIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9PVVRQVVRfSU9fTU9ERToKKyAgICAgIGdzdF92NGwyX29iamVjdF9zZXRfcHJvcGVydHlfaGVscGVyIChzZWxmLT52NGwyb3V0cHV0LCBwcm9wX2lkLCB2YWx1ZSwKKyAgICAgICAgICBwc3BlYyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfQ0FQVFVSRV9JT19NT0RFOgorICAgICAgZ3N0X3Y0bDJfb2JqZWN0X3NldF9wcm9wZXJ0eV9oZWxwZXIgKHNlbGYtPnY0bDJjYXB0dXJlLCBwcm9wX2lkLCB2YWx1ZSwKKyAgICAgICAgICBwc3BlYyk7CisgICAgICBicmVhazsKKworICAgICAgLyogQnkgZGVmYXVsdCwgb25seSBzZXQgb24gb3V0cHV0ICovCisgICAgZGVmYXVsdDoKKyAgICAgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X3NldF9wcm9wZXJ0eV9oZWxwZXIgKHNlbGYtPnY0bDJvdXRwdXQsCisgICAgICAgICAgICAgIHByb3BfaWQsIHZhbHVlLCBwc3BlYykpIHsKKyAgICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl90cmFuc2Zvcm1fZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFY0bDJUcmFuc2Zvcm0gKnNlbGYgPSBHU1RfVjRMMl9UUkFOU0ZPUk0gKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX09VVFBVVF9JT19NT0RFOgorICAgICAgZ3N0X3Y0bDJfb2JqZWN0X2dldF9wcm9wZXJ0eV9oZWxwZXIgKHNlbGYtPnY0bDJvdXRwdXQsIHByb3BfaWQsIHZhbHVlLAorICAgICAgICAgIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9DQVBUVVJFX0lPX01PREU6CisgICAgICBnc3RfdjRsMl9vYmplY3RfZ2V0X3Byb3BlcnR5X2hlbHBlciAoc2VsZi0+djRsMmNhcHR1cmUsIHByb3BfaWQsIHZhbHVlLAorICAgICAgICAgIHBzcGVjKTsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBCeSBkZWZhdWx0IHJlYWQgZnJvbSBvdXRwdXQgKi8KKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCFnc3RfdjRsMl9vYmplY3RfZ2V0X3Byb3BlcnR5X2hlbHBlciAoc2VsZi0+djRsMm91dHB1dCwKKyAgICAgICAgICAgICAgcHJvcF9pZCwgdmFsdWUsIHBzcGVjKSkgeworICAgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl90cmFuc2Zvcm1fb3BlbiAoR3N0VjRsMlRyYW5zZm9ybSAqIHNlbGYpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJPcGVuaW5nIik7CisKKyAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfb3BlbiAoc2VsZi0+djRsMm91dHB1dCkpCisgICAgZ290byBmYWlsdXJlOworCisgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X29wZW5fc2hhcmVkIChzZWxmLT52NGwyY2FwdHVyZSwgc2VsZi0+djRsMm91dHB1dCkpCisgICAgZ290byBmYWlsdXJlOworCisgIHNlbGYtPnByb2JlZF9zaW5rY2FwcyA9IGdzdF92NGwyX29iamVjdF9nZXRfY2FwcyAoc2VsZi0+djRsMm91dHB1dCwKKyAgICAgIGdzdF92NGwyX29iamVjdF9nZXRfcmF3X2NhcHMgKCkpOworCisgIGlmIChnc3RfY2Fwc19pc19lbXB0eSAoc2VsZi0+cHJvYmVkX3NpbmtjYXBzKSkKKyAgICBnb3RvIG5vX2lucHV0X2Zvcm1hdDsKKworICBzZWxmLT5wcm9iZWRfc3JjY2FwcyA9IGdzdF92NGwyX29iamVjdF9nZXRfY2FwcyAoc2VsZi0+djRsMmNhcHR1cmUsCisgICAgICBnc3RfdjRsMl9vYmplY3RfZ2V0X3Jhd19jYXBzICgpKTsKKworICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKHNlbGYtPnByb2JlZF9zcmNjYXBzKSkKKyAgICBnb3RvIG5vX291dHB1dF9mb3JtYXQ7CisKKyAgcmV0dXJuIFRSVUU7CisKK25vX2lucHV0X2Zvcm1hdDoKKyAgR1NUX0VMRU1FTlRfRVJST1IgKHNlbGYsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgIChfKCJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgaW5wdXQgZm9ybWF0IiksCisgICAgICAgICAgc2VsZi0+djRsMm91dHB1dC0+dmlkZW9kZXYpLCAoTlVMTCkpOworICBnb3RvIGZhaWx1cmU7CisKKworbm9fb3V0cHV0X2Zvcm1hdDoKKyAgR1NUX0VMRU1FTlRfRVJST1IgKHNlbGYsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgIChfKCJDb252ZXJ0ZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIpLAorICAgICAgICAgIHNlbGYtPnY0bDJvdXRwdXQtPnZpZGVvZGV2KSwgKE5VTEwpKTsKKyAgZ290byBmYWlsdXJlOworCitmYWlsdXJlOgorICBpZiAoR1NUX1Y0TDJfSVNfT1BFTiAoc2VsZi0+djRsMm91dHB1dCkpCisgICAgZ3N0X3Y0bDJfb2JqZWN0X2Nsb3NlIChzZWxmLT52NGwyb3V0cHV0KTsKKworICBpZiAoR1NUX1Y0TDJfSVNfT1BFTiAoc2VsZi0+djRsMmNhcHR1cmUpKQorICAgIGdzdF92NGwyX29iamVjdF9jbG9zZSAoc2VsZi0+djRsMmNhcHR1cmUpOworCisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzZWxmLT5wcm9iZWRfc3JjY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzZWxmLT5wcm9iZWRfc2lua2NhcHMsIE5VTEwpOworCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3RyYW5zZm9ybV9jbG9zZSAoR3N0VjRsMlRyYW5zZm9ybSAqIHNlbGYpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJDbG9zaW5nIik7CisKKyAgZ3N0X3Y0bDJfb2JqZWN0X2Nsb3NlIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgZ3N0X3Y0bDJfb2JqZWN0X2Nsb3NlIChzZWxmLT52NGwyY2FwdHVyZSk7CisKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNlbGYtPnByb2JlZF9zcmNjYXBzLCBOVUxMKTsKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNlbGYtPnByb2JlZF9zaW5rY2FwcywgTlVMTCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdHJhbnNmb3JtX3N0b3AgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucykKK3sKKyAgR3N0VjRsMlRyYW5zZm9ybSAqc2VsZiA9IEdTVF9WNEwyX1RSQU5TRk9STSAodHJhbnMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJTdG9wIik7CisKKyAgZ3N0X3Y0bDJfb2JqZWN0X3N0b3AgKHNlbGYtPnY0bDJvdXRwdXQpOworICBnc3RfdjRsMl9vYmplY3Rfc3RvcCAoc2VsZi0+djRsMmNhcHR1cmUpOworICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+aW5jYXBzLCBOVUxMKTsKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNlbGYtPm91dGNhcHMsIE5VTEwpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX3RyYW5zZm9ybV9zZXRfY2FwcyAoR3N0QmFzZVRyYW5zZm9ybSAqIHRyYW5zLCBHc3RDYXBzICogaW5jYXBzLAorICAgIEdzdENhcHMgKiBvdXRjYXBzKQoreworICBHc3RWNGwyRXJyb3IgZXJyb3IgPSBHU1RfVjRMMl9FUlJPUl9JTklUOworICBHc3RWNGwyVHJhbnNmb3JtICpzZWxmID0gR1NUX1Y0TDJfVFJBTlNGT1JNICh0cmFucyk7CisKKyAgaWYgKHNlbGYtPmluY2FwcyAmJiBzZWxmLT5vdXRjYXBzKSB7CisgICAgaWYgKGdzdF9jYXBzX2lzX2VxdWFsIChpbmNhcHMsIHNlbGYtPmluY2FwcykgJiYKKyAgICAgICAgZ3N0X2NhcHNfaXNfZXF1YWwgKG91dGNhcHMsIHNlbGYtPm91dGNhcHMpKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUICh0cmFucywgIkNhcHMgZGlkIG5vdCBjaGFuZ2VkIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKworICAvKiBUT0RPIEFkZCByZW5lZ290aWF0aW9uIHN1cHBvcnQgKi8KKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKCFHU1RfVjRMMl9JU19BQ1RJVkUgKHNlbGYtPnY0bDJvdXRwdXQpLCBGQUxTRSk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICghR1NUX1Y0TDJfSVNfQUNUSVZFIChzZWxmLT52NGwyY2FwdHVyZSksIEZBTFNFKTsKKworICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+aW5jYXBzLCBpbmNhcHMpOworICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+b3V0Y2Fwcywgb3V0Y2Fwcyk7CisKKyAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfc2V0X2Zvcm1hdCAoc2VsZi0+djRsMm91dHB1dCwgaW5jYXBzLCAmZXJyb3IpKQorICAgIGdvdG8gaW5jYXBzX2ZhaWxlZDsKKworICBpZiAoIWdzdF92NGwyX29iamVjdF9zZXRfZm9ybWF0IChzZWxmLT52NGwyY2FwdHVyZSwgb3V0Y2FwcywgJmVycm9yKSkKKyAgICBnb3RvIG91dGNhcHNfZmFpbGVkOworCisgIC8qIEZJWE1FIGltcGxlbWVudCBmYWxsYmFjayBpZiBjcm9wIG5vdCBzdXBwb3J0ZWQgKi8KKyAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfc2V0X2Nyb3AgKHNlbGYtPnY0bDJvdXRwdXQpKQorICAgIGdvdG8gZmFpbGVkOworCisgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X3NldF9jcm9wIChzZWxmLT52NGwyY2FwdHVyZSkpCisgICAgZ290byBmYWlsZWQ7CisKKyAgcmV0dXJuIFRSVUU7CisKK2luY2Fwc19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUIChzZWxmLCAiZmFpbGVkIHRvIHNldCBpbnB1dCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgaW5jYXBzKTsKKyAgICBnc3RfdjRsMl9lcnJvciAoc2VsZiwgJmVycm9yKTsKKyAgICBnb3RvIGZhaWxlZDsKKyAgfQorb3V0Y2Fwc19mYWlsZWQ6CisgIHsKKyAgICBnc3RfdjRsMl9vYmplY3Rfc3RvcCAoc2VsZi0+djRsMm91dHB1dCk7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoc2VsZiwgImZhaWxlZCB0byBzZXQgb3V0cHV0IGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgICBvdXRjYXBzKTsKKyAgICBnc3RfdjRsMl9lcnJvciAoc2VsZiwgJmVycm9yKTsKKyAgICBnb3RvIGZhaWxlZDsKKyAgfQorZmFpbGVkOgorICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdHJhbnNmb3JtX3F1ZXJ5IChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdFBhZERpcmVjdGlvbiBkaXJlY3Rpb24sCisgICAgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0VjRsMlRyYW5zZm9ybSAqc2VsZiA9IEdTVF9WNEwyX1RSQU5TRk9STSAodHJhbnMpOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0NBUFM6eworICAgICAgR3N0Q2FwcyAqZmlsdGVyLCAqY2FwcyA9IE5VTEwsICpyZXN1bHQgPSBOVUxMOworICAgICAgR3N0UGFkICpwYWQsICpvdGhlcnBhZDsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2NhcHMgKHF1ZXJ5LCAmZmlsdGVyKTsKKworICAgICAgaWYgKGRpcmVjdGlvbiA9PSBHU1RfUEFEX1NSQykgeworICAgICAgICBwYWQgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fU1JDX1BBRCAodHJhbnMpOworICAgICAgICBvdGhlcnBhZCA9IEdTVF9CQVNFX1RSQU5TRk9STV9TSU5LX1BBRCAodHJhbnMpOworICAgICAgICBpZiAoc2VsZi0+cHJvYmVkX3NyY2NhcHMpCisgICAgICAgICAgY2FwcyA9IGdzdF9jYXBzX3JlZiAoc2VsZi0+cHJvYmVkX3NyY2NhcHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFkID0gR1NUX0JBU0VfVFJBTlNGT1JNX1NJTktfUEFEICh0cmFucyk7CisgICAgICAgIG90aGVycGFkID0gR1NUX0JBU0VfVFJBTlNGT1JNX1NSQ19QQUQgKHRyYW5zKTsKKyAgICAgICAgaWYgKHNlbGYtPnByb2JlZF9zaW5rY2FwcykKKyAgICAgICAgICBjYXBzID0gZ3N0X2NhcHNfcmVmIChzZWxmLT5wcm9iZWRfc2lua2NhcHMpOworICAgICAgfQorCisgICAgICBpZiAoIWNhcHMpCisgICAgICAgIGNhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAocGFkKTsKKworICAgICAgaWYgKGZpbHRlcikgeworICAgICAgICBHc3RDYXBzICp0bXAgPSBjYXBzOworICAgICAgICBjYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgdG1wLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgICAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICAgIH0KKworICAgICAgcmVzdWx0ID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKG90aGVycGFkLCBjYXBzKTsKKyAgICAgIHJlc3VsdCA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKHJlc3VsdCk7CisgICAgICBnc3RfY2Fwc19hcHBlbmQgKHJlc3VsdCwgY2Fwcyk7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJSZXR1cm5pbmcgJXMgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgICAgICBHU1RfUEFEX05BTUUgKHBhZCksIHJlc3VsdCk7CisKKyAgICAgIGdzdF9xdWVyeV9zZXRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCByZXN1bHQpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHJlc3VsdCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5xdWVyeSAodHJhbnMsIGRpcmVjdGlvbiwKKyAgICAgICAgICBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdHJhbnNmb3JtX2RlY2lkZV9hbGxvY2F0aW9uIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgR3N0VjRsMlRyYW5zZm9ybSAqc2VsZiA9IEdTVF9WNEwyX1RSQU5TRk9STSAodHJhbnMpOworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiY2FsbGVkIik7CisKKyAgaWYgKGdzdF92NGwyX29iamVjdF9kZWNpZGVfYWxsb2NhdGlvbiAoc2VsZi0+djRsMmNhcHR1cmUsIHF1ZXJ5KSkgeworICAgIEdzdEJ1ZmZlclBvb2wgKnBvb2wgPSBHU1RfQlVGRkVSX1BPT0wgKHNlbGYtPnY0bDJjYXB0dXJlLT5wb29sKTsKKworICAgIHJldCA9IEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGVjaWRlX2FsbG9jYXRpb24gKHRyYW5zLAorICAgICAgICBxdWVyeSk7CisKKyAgICBpZiAoIWdzdF9idWZmZXJfcG9vbF9zZXRfYWN0aXZlIChwb29sLCBUUlVFKSkKKyAgICAgIGdvdG8gYWN0aXZhdGVfZmFpbGVkOworICB9CisKKyAgcmV0dXJuIHJldDsKKworYWN0aXZhdGVfZmFpbGVkOgorICBHU1RfRUxFTUVOVF9FUlJPUiAoc2VsZiwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgKCJmYWlsZWQgdG8gYWN0aXZhdGUgYnVmZmVycG9vbCIpLCAoImZhaWxlZCB0byBhY3RpdmF0ZSBidWZmZXJwb29sIikpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl90cmFuc2Zvcm1fcHJvcG9zZV9hbGxvY2F0aW9uIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0UXVlcnkgKiBkZWNpZGVfcXVlcnksIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIEdzdFY0bDJUcmFuc2Zvcm0gKnNlbGYgPSBHU1RfVjRMMl9UUkFOU0ZPUk0gKHRyYW5zKTsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImNhbGxlZCIpOworCisgIGlmIChkZWNpZGVfcXVlcnkgPT0gTlVMTCkKKyAgICByZXQgPSBUUlVFOworICBlbHNlCisgICAgcmV0ID0gZ3N0X3Y0bDJfb2JqZWN0X3Byb3Bvc2VfYWxsb2NhdGlvbiAoc2VsZi0+djRsMm91dHB1dCwgcXVlcnkpOworCisgIGlmIChyZXQpCisgICAgcmV0ID0gR1NUX0JBU0VfVFJBTlNGT1JNX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5wcm9wb3NlX2FsbG9jYXRpb24gKHRyYW5zLAorICAgICAgICBkZWNpZGVfcXVlcnksIHF1ZXJ5KTsKKworICByZXR1cm4gcmV0OworfQorCisvKiBjb3BpZXMgdGhlIGdpdmVuIGNhcHMgKi8KK3N0YXRpYyBHc3RDYXBzICoKK2dzdF92NGwyX3RyYW5zZm9ybV9jYXBzX3JlbW92ZV9mb3JtYXRfaW5mbyAoR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqc3Q7CisgIEdzdENhcHNGZWF0dXJlcyAqZjsKKyAgZ2ludCBpLCBuOworICBHc3RDYXBzICpyZXM7CisKKyAgcmVzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIG4gPSBnc3RfY2Fwc19nZXRfc2l6ZSAoY2Fwcyk7CisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBzdCA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIGkpOworICAgIGYgPSBnc3RfY2Fwc19nZXRfZmVhdHVyZXMgKGNhcHMsIGkpOworCisgICAgLyogSWYgdGhpcyBpcyBhbHJlYWR5IGV4cHJlc3NlZCBieSB0aGUgZXhpc3RpbmcgY2FwcworICAgICAqIHNraXAgdGhpcyBzdHJ1Y3R1cmUgKi8KKyAgICBpZiAoaSA+IDAgJiYgZ3N0X2NhcHNfaXNfc3Vic2V0X3N0cnVjdHVyZV9mdWxsIChyZXMsIHN0LCBmKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgc3QgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKHN0KTsKKyAgICAvKiBPbmx5IHJlbW92ZSBmb3JtYXQgaW5mbyBmb3IgdGhlIGNhc2VzIHdoZW4gd2UgY2FuIGFjdHVhbGx5IGNvbnZlcnQgKi8KKyAgICBpZiAoIWdzdF9jYXBzX2ZlYXR1cmVzX2lzX2FueSAoZikKKyAgICAgICAgJiYgZ3N0X2NhcHNfZmVhdHVyZXNfaXNfZXF1YWwgKGYsCisgICAgICAgICAgICBHU1RfQ0FQU19GRUFUVVJFU19NRU1PUllfU1lTVEVNX01FTU9SWSkpCisgICAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZHMgKHN0LCAiZm9ybWF0IiwgImNvbG9yaW1ldHJ5IiwgImNocm9tYS1zaXRlIiwKKyAgICAgICAgICAid2lkdGgiLCAiaGVpZ2h0IiwgInBpeGVsLWFzcGVjdC1yYXRpbyIsIE5VTEwpOworCisgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZV9mdWxsIChyZXMsIHN0LCBnc3RfY2Fwc19mZWF0dXJlc19jb3B5IChmKSk7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCisvKiBUaGUgY2FwcyBjYW4gYmUgdHJhbnNmb3JtZWQgaW50byBhbnkgb3RoZXIgY2FwcyB3aXRoIGZvcm1hdCBpbmZvIHJlbW92ZWQuCisgKiBIb3dldmVyLCB3ZSBzaG91bGQgcHJlZmVyIHBhc3N0aHJvdWdoLCBzbyBpZiBwYXNzdGhyb3VnaCBpcyBwb3NzaWJsZSwKKyAqIHB1dCBpdCBmaXJzdCBpbiB0aGUgbGlzdC4gKi8KK3N0YXRpYyBHc3RDYXBzICoKK2dzdF92NGwyX3RyYW5zZm9ybV90cmFuc2Zvcm1fY2FwcyAoR3N0QmFzZVRyYW5zZm9ybSAqIGJ0cmFucywKKyAgICBHc3RQYWREaXJlY3Rpb24gZGlyZWN0aW9uLCBHc3RDYXBzICogY2FwcywgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0Q2FwcyAqdG1wLCAqdG1wMjsKKyAgR3N0Q2FwcyAqcmVzdWx0OworCisgIC8qIEdldCBhbGwgcG9zc2libGUgY2FwcyB0aGF0IHdlIGNhbiB0cmFuc2Zvcm0gdG8gKi8KKyAgdG1wID0gZ3N0X3Y0bDJfdHJhbnNmb3JtX2NhcHNfcmVtb3ZlX2Zvcm1hdF9pbmZvIChjYXBzKTsKKworICBpZiAoZmlsdGVyKSB7CisgICAgdG1wMiA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHRtcCwgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICB0bXAgPSB0bXAyOworICB9CisKKyAgcmVzdWx0ID0gdG1wOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGJ0cmFucywgInRyYW5zZm9ybWVkICUiIEdTVF9QVFJfRk9STUFUICIgaW50byAlIgorICAgICAgR1NUX1BUUl9GT1JNQVQsIGNhcHMsIHJlc3VsdCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3Y0bDJfdHJhbnNmb3JtX2ZpeGF0ZV9jYXBzIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsCisgICAgR3N0UGFkRGlyZWN0aW9uIGRpcmVjdGlvbiwgR3N0Q2FwcyAqIGNhcHMsIEdzdENhcHMgKiBvdGhlcmNhcHMpCit7CisgIEdzdFN0cnVjdHVyZSAqaW5zLCAqb3V0czsKKyAgY29uc3QgR1ZhbHVlICpmcm9tX3BhciwgKnRvX3BhcjsKKyAgR1ZhbHVlIGZwYXIgPSB7IDAsIH0sIHRwYXIgPSB7CisgIDAsfTsKKworICBvdGhlcmNhcHMgPSBnc3RfY2Fwc190cnVuY2F0ZSAob3RoZXJjYXBzKTsKKyAgb3RoZXJjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAob3RoZXJjYXBzKTsKKworICBHU1RfREVCVUdfT0JKRUNUICh0cmFucywgInRyeWluZyB0byBmaXhhdGUgb3RoZXJjYXBzICUiIEdTVF9QVFJfRk9STUFUCisgICAgICAiIGJhc2VkIG9uIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIG90aGVyY2FwcywgY2Fwcyk7CisKKyAgaW5zID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIG91dHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChvdGhlcmNhcHMsIDApOworCisgIHsKKyAgICBjb25zdCBnY2hhciAqaW5fZm9ybWF0OworCisgICAgaW5fZm9ybWF0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChpbnMsICJmb3JtYXQiKTsKKyAgICBpZiAoaW5fZm9ybWF0KSB7CisgICAgICAvKiBUcnkgdG8gc2V0IG91dHB1dCBmb3JtYXQgZm9yIHBhc3MgdGhyb3VnaCAqLworICAgICAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfc3RyaW5nIChvdXRzLCAiZm9ybWF0IiwgaW5fZm9ybWF0KTsKKyAgICB9CisKKyAgfQorCisgIGZyb21fcGFyID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKGlucywgInBpeGVsLWFzcGVjdC1yYXRpbyIpOworICB0b19wYXIgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAob3V0cywgInBpeGVsLWFzcGVjdC1yYXRpbyIpOworCisgIC8qIElmIHdlJ3JlIGZpeGF0aW5nIGZyb20gdGhlIHNpbmtwYWQgd2UgYWx3YXlzIHNldCB0aGUgUEFSIGFuZAorICAgKiBhc3N1bWUgdGhhdCBtaXNzaW5nIFBBUiBvbiB0aGUgc2lua3BhZCBtZWFucyAxLzEgYW5kCisgICAqIG1pc3NpbmcgUEFSIG9uIHRoZSBzcmNwYWQgbWVhbnMgdW5kZWZpbmVkCisgICAqLworICBpZiAoZGlyZWN0aW9uID09IEdTVF9QQURfU0lOSykgeworICAgIGlmICghZnJvbV9wYXIpIHsKKyAgICAgIGdfdmFsdWVfaW5pdCAoJmZwYXIsIEdTVF9UWVBFX0ZSQUNUSU9OKTsKKyAgICAgIGdzdF92YWx1ZV9zZXRfZnJhY3Rpb24gKCZmcGFyLCAxLCAxKTsKKyAgICAgIGZyb21fcGFyID0gJmZwYXI7CisgICAgfQorICAgIGlmICghdG9fcGFyKSB7CisgICAgICBnX3ZhbHVlX2luaXQgKCZ0cGFyLCBHU1RfVFlQRV9GUkFDVElPTl9SQU5HRSk7CisgICAgICBnc3RfdmFsdWVfc2V0X2ZyYWN0aW9uX3JhbmdlX2Z1bGwgKCZ0cGFyLCAxLCBHX01BWElOVCwgR19NQVhJTlQsIDEpOworICAgICAgdG9fcGFyID0gJnRwYXI7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICghdG9fcGFyKSB7CisgICAgICBnX3ZhbHVlX2luaXQgKCZ0cGFyLCBHU1RfVFlQRV9GUkFDVElPTik7CisgICAgICBnc3RfdmFsdWVfc2V0X2ZyYWN0aW9uICgmdHBhciwgMSwgMSk7CisgICAgICB0b19wYXIgPSAmdHBhcjsKKworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG91dHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iLCBHU1RfVFlQRV9GUkFDVElPTiwgMSwgMSwKKyAgICAgICAgICBOVUxMKTsKKyAgICB9CisgICAgaWYgKCFmcm9tX3BhcikgeworICAgICAgZ192YWx1ZV9pbml0ICgmZnBhciwgR1NUX1RZUEVfRlJBQ1RJT04pOworICAgICAgZ3N0X3ZhbHVlX3NldF9mcmFjdGlvbiAoJmZwYXIsIDEsIDEpOworICAgICAgZnJvbV9wYXIgPSAmZnBhcjsKKyAgICB9CisgIH0KKworICAvKiB3ZSBoYXZlIGJvdGggUEFSIGJ1dCB0aGV5IG1pZ2h0IG5vdCBiZSBmaXhhdGVkICovCisgIHsKKyAgICBnaW50IGZyb21fdywgZnJvbV9oLCBmcm9tX3Bhcl9uLCBmcm9tX3Bhcl9kLCB0b19wYXJfbiwgdG9fcGFyX2Q7CisgICAgZ2ludCB3ID0gMCwgaCA9IDA7CisgICAgZ2ludCBmcm9tX2Rhcl9uLCBmcm9tX2Rhcl9kOworICAgIGdpbnQgbnVtLCBkZW47CisKKyAgICAvKiBmcm9tX3BhciBzaG91bGQgYmUgZml4ZWQgKi8KKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ3N0X3ZhbHVlX2lzX2ZpeGVkIChmcm9tX3BhciksIG90aGVyY2Fwcyk7CisKKyAgICBmcm9tX3Bhcl9uID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9udW1lcmF0b3IgKGZyb21fcGFyKTsKKyAgICBmcm9tX3Bhcl9kID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9kZW5vbWluYXRvciAoZnJvbV9wYXIpOworCisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChpbnMsICJ3aWR0aCIsICZmcm9tX3cpOworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoaW5zLCAiaGVpZ2h0IiwgJmZyb21faCk7CisKKyAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKG91dHMsICJ3aWR0aCIsICZ3KTsKKyAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKG91dHMsICJoZWlnaHQiLCAmaCk7CisKKyAgICAvKiBpZiBib3RoIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGFscmVhZHkgZml4ZWQsIHdlIGNhbid0IGRvIGFueXRoaW5nCisgICAgICogYWJvdXQgaXQgYW55bW9yZSAqLworICAgIGlmICh3ICYmIGgpIHsKKyAgICAgIGd1aW50IG4sIGQ7CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHRyYW5zLCAiZGltZW5zaW9ucyBhbHJlYWR5IHNldCB0byAlZHglZCwgbm90IGZpeGF0aW5nIiwKKyAgICAgICAgICB3LCBoKTsKKyAgICAgIGlmICghZ3N0X3ZhbHVlX2lzX2ZpeGVkICh0b19wYXIpKSB7CisgICAgICAgIGlmIChnc3RfdmlkZW9fY2FsY3VsYXRlX2Rpc3BsYXlfcmF0aW8gKCZuLCAmZCwgZnJvbV93LCBmcm9tX2gsCisgICAgICAgICAgICAgICAgZnJvbV9wYXJfbiwgZnJvbV9wYXJfZCwgdywgaCkpIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh0cmFucywgImZpeGF0aW5nIHRvX3BhciB0byAlZHglZCIsIG4sIGQpOworICAgICAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAob3V0cywgInBpeGVsLWFzcGVjdC1yYXRpbyIpKQorICAgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9mcmFjdGlvbiAob3V0cywKKyAgICAgICAgICAgICAgICAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgbiwgZCk7CisgICAgICAgICAgZWxzZSBpZiAobiAhPSBkKQorICAgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG91dHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iLCBHU1RfVFlQRV9GUkFDVElPTiwKKyAgICAgICAgICAgICAgICBuLCBkLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSBpbnB1dCBEQVIgKi8KKyAgICBpZiAoIWdzdF91dGlsX2ZyYWN0aW9uX211bHRpcGx5IChmcm9tX3csIGZyb21faCwgZnJvbV9wYXJfbiwgZnJvbV9wYXJfZCwKKyAgICAgICAgICAgICZmcm9tX2Rhcl9uLCAmZnJvbV9kYXJfZCkpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SICh0cmFucywgQ09SRSwgTkVHT1RJQVRJT04sIChOVUxMKSwKKyAgICAgICAgICAoIkVycm9yIGNhbGN1bGF0aW5nIHRoZSBvdXRwdXQgc2NhbGVkIHNpemUgLSBpbnRlZ2VyIG92ZXJmbG93IikpOworICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHRyYW5zLCAiSW5wdXQgREFSIGlzICVkLyVkIiwgZnJvbV9kYXJfbiwgZnJvbV9kYXJfZCk7CisKKyAgICAvKiBJZiBlaXRoZXIgd2lkdGggb3IgaGVpZ2h0IGFyZSBmaXhlZCB0aGVyZSdzIG5vdCBtdWNoIHdlCisgICAgICogY2FuIGRvIGVpdGhlciBleGNlcHQgY2hvb3NpbmcgYSBoZWlnaHQgb3Igd2lkdGggYW5kIFBBUgorICAgICAqIHRoYXQgbWF0Y2hlcyB0aGUgREFSIGFzIGdvb2QgYXMgcG9zc2libGUKKyAgICAgKi8KKyAgICBpZiAoaCkgeworICAgICAgR3N0U3RydWN0dXJlICp0bXA7CisgICAgICBnaW50IHNldF93LCBzZXRfcGFyX24sIHNldF9wYXJfZDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAodHJhbnMsICJoZWlnaHQgaXMgZml4ZWQgKCVkKSIsIGgpOworCisgICAgICAvKiBJZiB0aGUgUEFSIGlzIGZpeGVkIHRvbywgdGhlcmUncyBub3QgbXVjaCB0byBkbworICAgICAgICogZXhjZXB0IGNob29zaW5nIHRoZSB3aWR0aCB0aGF0IGlzIG5lYXJlc3QgdG8gdGhlCisgICAgICAgKiB3aWR0aCB3aXRoIHRoZSBzYW1lIERBUiAqLworICAgICAgaWYgKGdzdF92YWx1ZV9pc19maXhlZCAodG9fcGFyKSkgeworICAgICAgICB0b19wYXJfbiA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fbnVtZXJhdG9yICh0b19wYXIpOworICAgICAgICB0b19wYXJfZCA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fZGVub21pbmF0b3IgKHRvX3Bhcik7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAodHJhbnMsICJQQVIgaXMgZml4ZWQgJWQvJWQiLCB0b19wYXJfbiwgdG9fcGFyX2QpOworCisgICAgICAgIGlmICghZ3N0X3V0aWxfZnJhY3Rpb25fbXVsdGlwbHkgKGZyb21fZGFyX24sIGZyb21fZGFyX2QsIHRvX3Bhcl9kLAorICAgICAgICAgICAgICAgIHRvX3Bhcl9uLCAmbnVtLCAmZGVuKSkgeworICAgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SICh0cmFucywgQ09SRSwgTkVHT1RJQVRJT04sIChOVUxMKSwKKyAgICAgICAgICAgICAgKCJFcnJvciBjYWxjdWxhdGluZyB0aGUgb3V0cHV0IHNjYWxlZCBzaXplIC0gaW50ZWdlciBvdmVyZmxvdyIpKTsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgICB3ID0gKGd1aW50KSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChoLCBudW0sIGRlbik7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfaW50IChvdXRzLCAid2lkdGgiLCB3KTsKKworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisKKyAgICAgIC8qIFRoZSBQQVIgaXMgbm90IGZpeGVkIGFuZCBpdCdzIHF1aXRlIGxpa2VseSB0aGF0IHdlIGNhbiBzZXQKKyAgICAgICAqIGFuIGFyYml0cmFyeSBQQVIuICovCisKKyAgICAgIC8qIENoZWNrIGlmIHdlIGNhbiBrZWVwIHRoZSBpbnB1dCB3aWR0aCAqLworICAgICAgdG1wID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChvdXRzKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfaW50ICh0bXAsICJ3aWR0aCIsIGZyb21fdyk7CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHRtcCwgIndpZHRoIiwgJnNldF93KTsKKworICAgICAgLyogTWlnaHQgaGF2ZSBmYWlsZWQgYnV0IHRyeSB0byBrZWVwIHRoZSBEQVIgbm9uZXRoZWxlc3MgYnkKKyAgICAgICAqIGFkanVzdGluZyB0aGUgUEFSICovCisgICAgICBpZiAoIWdzdF91dGlsX2ZyYWN0aW9uX211bHRpcGx5IChmcm9tX2Rhcl9uLCBmcm9tX2Rhcl9kLCBoLCBzZXRfdywKKyAgICAgICAgICAgICAgJnRvX3Bhcl9uLCAmdG9fcGFyX2QpKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SICh0cmFucywgQ09SRSwgTkVHT1RJQVRJT04sIChOVUxMKSwKKyAgICAgICAgICAgICgiRXJyb3IgY2FsY3VsYXRpbmcgdGhlIG91dHB1dCBzY2FsZWQgc2l6ZSAtIGludGVnZXIgb3ZlcmZsb3ciKSk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAodG1wKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorCisgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkICh0bXAsICJwaXhlbC1hc3BlY3QtcmF0aW8iKSkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKHRtcCwgInBpeGVsLWFzcGVjdC1yYXRpbyIsIHRvX3Bhcik7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ZyYWN0aW9uICh0bXAsICJwaXhlbC1hc3BlY3QtcmF0aW8iLAorICAgICAgICAgIHRvX3Bhcl9uLCB0b19wYXJfZCk7CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9mcmFjdGlvbiAodG1wLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgJnNldF9wYXJfbiwKKyAgICAgICAgICAmc2V0X3Bhcl9kKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAodG1wKTsKKworICAgICAgLyogQ2hlY2sgaWYgdGhlIGFkanVzdGVkIFBBUiBpcyBhY2NlcHRlZCAqLworICAgICAgaWYgKHNldF9wYXJfbiA9PSB0b19wYXJfbiAmJiBzZXRfcGFyX2QgPT0gdG9fcGFyX2QpIHsKKyAgICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChvdXRzLCAicGl4ZWwtYXNwZWN0LXJhdGlvIikgfHwKKyAgICAgICAgICAgIHNldF9wYXJfbiAhPSBzZXRfcGFyX2QpCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG91dHMsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHNldF93LAorICAgICAgICAgICAgICAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgR1NUX1RZUEVfRlJBQ1RJT04sIHNldF9wYXJfbiwgc2V0X3Bhcl9kLAorICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorCisgICAgICAvKiBPdGhlcndpc2Ugc2NhbGUgdGhlIHdpZHRoIHRvIHRoZSBuZXcgUEFSIGFuZCBjaGVjayBpZiB0aGUKKyAgICAgICAqIGFkanVzdGVkIHdpdGggaXMgYWNjZXB0ZWQuIElmIGFsbCB0aGF0IGZhaWxzIHdlIGNhbid0IGtlZXAKKyAgICAgICAqIHRoZSBEQVIgKi8KKyAgICAgIGlmICghZ3N0X3V0aWxfZnJhY3Rpb25fbXVsdGlwbHkgKGZyb21fZGFyX24sIGZyb21fZGFyX2QsIHNldF9wYXJfZCwKKyAgICAgICAgICAgICAgc2V0X3Bhcl9uLCAmbnVtLCAmZGVuKSkgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAodHJhbnMsIENPUkUsIE5FR09USUFUSU9OLCAoTlVMTCksCisgICAgICAgICAgICAoIkVycm9yIGNhbGN1bGF0aW5nIHRoZSBvdXRwdXQgc2NhbGVkIHNpemUgLSBpbnRlZ2VyIG92ZXJmbG93IikpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisKKyAgICAgIHcgPSAoZ3VpbnQpIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKGgsIG51bSwgZGVuKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfaW50IChvdXRzLCAid2lkdGgiLCB3KTsKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAob3V0cywgInBpeGVsLWFzcGVjdC1yYXRpbyIpIHx8CisgICAgICAgICAgc2V0X3Bhcl9uICE9IHNldF9wYXJfZCkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG91dHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iLCBHU1RfVFlQRV9GUkFDVElPTiwKKyAgICAgICAgICAgIHNldF9wYXJfbiwgc2V0X3Bhcl9kLCBOVUxMKTsKKworICAgICAgZ290byBkb25lOworICAgIH0gZWxzZSBpZiAodykgeworICAgICAgR3N0U3RydWN0dXJlICp0bXA7CisgICAgICBnaW50IHNldF9oLCBzZXRfcGFyX24sIHNldF9wYXJfZDsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAodHJhbnMsICJ3aWR0aCBpcyBmaXhlZCAoJWQpIiwgdyk7CisKKyAgICAgIC8qIElmIHRoZSBQQVIgaXMgZml4ZWQgdG9vLCB0aGVyZSdzIG5vdCBtdWNoIHRvIGRvCisgICAgICAgKiBleGNlcHQgY2hvb3NpbmcgdGhlIGhlaWdodCB0aGF0IGlzIG5lYXJlc3QgdG8gdGhlCisgICAgICAgKiBoZWlnaHQgd2l0aCB0aGUgc2FtZSBEQVIgKi8KKyAgICAgIGlmIChnc3RfdmFsdWVfaXNfZml4ZWQgKHRvX3BhcikpIHsKKyAgICAgICAgdG9fcGFyX24gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAodG9fcGFyKTsKKyAgICAgICAgdG9fcGFyX2QgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yICh0b19wYXIpOworCisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHRyYW5zLCAiUEFSIGlzIGZpeGVkICVkLyVkIiwgdG9fcGFyX24sIHRvX3Bhcl9kKTsKKworICAgICAgICBpZiAoIWdzdF91dGlsX2ZyYWN0aW9uX211bHRpcGx5IChmcm9tX2Rhcl9uLCBmcm9tX2Rhcl9kLCB0b19wYXJfZCwKKyAgICAgICAgICAgICAgICB0b19wYXJfbiwgJm51bSwgJmRlbikpIHsKKyAgICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAodHJhbnMsIENPUkUsIE5FR09USUFUSU9OLCAoTlVMTCksCisgICAgICAgICAgICAgICgiRXJyb3IgY2FsY3VsYXRpbmcgdGhlIG91dHB1dCBzY2FsZWQgc2l6ZSAtIGludGVnZXIgb3ZlcmZsb3ciKSk7CisgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisKKyAgICAgICAgaCA9IChndWludCkgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAodywgZGVuLCBudW0pOworICAgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAob3V0cywgImhlaWdodCIsIGgpOworCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKworICAgICAgLyogVGhlIFBBUiBpcyBub3QgZml4ZWQgYW5kIGl0J3MgcXVpdGUgbGlrZWx5IHRoYXQgd2UgY2FuIHNldAorICAgICAgICogYW4gYXJiaXRyYXJ5IFBBUi4gKi8KKworICAgICAgLyogQ2hlY2sgaWYgd2UgY2FuIGtlZXAgdGhlIGlucHV0IGhlaWdodCAqLworICAgICAgdG1wID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChvdXRzKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfaW50ICh0bXAsICJoZWlnaHQiLCBmcm9tX2gpOworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50ICh0bXAsICJoZWlnaHQiLCAmc2V0X2gpOworCisgICAgICAvKiBNaWdodCBoYXZlIGZhaWxlZCBidXQgdHJ5IHRvIGtlZXAgdGhlIERBUiBub25ldGhlbGVzcyBieQorICAgICAgICogYWRqdXN0aW5nIHRoZSBQQVIgKi8KKyAgICAgIGlmICghZ3N0X3V0aWxfZnJhY3Rpb25fbXVsdGlwbHkgKGZyb21fZGFyX24sIGZyb21fZGFyX2QsIHNldF9oLCB3LAorICAgICAgICAgICAgICAmdG9fcGFyX24sICZ0b19wYXJfZCkpIHsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKHRyYW5zLCBDT1JFLCBORUdPVElBVElPTiwgKE5VTEwpLAorICAgICAgICAgICAgKCJFcnJvciBjYWxjdWxhdGluZyB0aGUgb3V0cHV0IHNjYWxlZCBzaXplIC0gaW50ZWdlciBvdmVyZmxvdyIpKTsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlICh0bXApOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkICh0bXAsICJwaXhlbC1hc3BlY3QtcmF0aW8iKSkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKHRtcCwgInBpeGVsLWFzcGVjdC1yYXRpbyIsIHRvX3Bhcik7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ZyYWN0aW9uICh0bXAsICJwaXhlbC1hc3BlY3QtcmF0aW8iLAorICAgICAgICAgIHRvX3Bhcl9uLCB0b19wYXJfZCk7CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9mcmFjdGlvbiAodG1wLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgJnNldF9wYXJfbiwKKyAgICAgICAgICAmc2V0X3Bhcl9kKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAodG1wKTsKKworICAgICAgLyogQ2hlY2sgaWYgdGhlIGFkanVzdGVkIFBBUiBpcyBhY2NlcHRlZCAqLworICAgICAgaWYgKHNldF9wYXJfbiA9PSB0b19wYXJfbiAmJiBzZXRfcGFyX2QgPT0gdG9fcGFyX2QpIHsKKyAgICAgICAgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChvdXRzLCAicGl4ZWwtYXNwZWN0LXJhdGlvIikgfHwKKyAgICAgICAgICAgIHNldF9wYXJfbiAhPSBzZXRfcGFyX2QpCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG91dHMsICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBzZXRfaCwKKyAgICAgICAgICAgICAgInBpeGVsLWFzcGVjdC1yYXRpbyIsIEdTVF9UWVBFX0ZSQUNUSU9OLCBzZXRfcGFyX24sIHNldF9wYXJfZCwKKyAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKworICAgICAgLyogT3RoZXJ3aXNlIHNjYWxlIHRoZSBoZWlnaHQgdG8gdGhlIG5ldyBQQVIgYW5kIGNoZWNrIGlmIHRoZQorICAgICAgICogYWRqdXN0ZWQgd2l0aCBpcyBhY2NlcHRlZC4gSWYgYWxsIHRoYXQgZmFpbHMgd2UgY2FuJ3Qga2VlcAorICAgICAgICogdGhlIERBUiAqLworICAgICAgaWYgKCFnc3RfdXRpbF9mcmFjdGlvbl9tdWx0aXBseSAoZnJvbV9kYXJfbiwgZnJvbV9kYXJfZCwgc2V0X3Bhcl9kLAorICAgICAgICAgICAgICBzZXRfcGFyX24sICZudW0sICZkZW4pKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SICh0cmFucywgQ09SRSwgTkVHT1RJQVRJT04sIChOVUxMKSwKKyAgICAgICAgICAgICgiRXJyb3IgY2FsY3VsYXRpbmcgdGhlIG91dHB1dCBzY2FsZWQgc2l6ZSAtIGludGVnZXIgb3ZlcmZsb3ciKSk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKworICAgICAgaCA9IChndWludCkgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAodywgZGVuLCBudW0pOworICAgICAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9pbnQgKG91dHMsICJoZWlnaHQiLCBoKTsKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAob3V0cywgInBpeGVsLWFzcGVjdC1yYXRpbyIpIHx8CisgICAgICAgICAgc2V0X3Bhcl9uICE9IHNldF9wYXJfZCkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG91dHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iLCBHU1RfVFlQRV9GUkFDVElPTiwKKyAgICAgICAgICAgIHNldF9wYXJfbiwgc2V0X3Bhcl9kLCBOVUxMKTsKKworICAgICAgZ290byBkb25lOworICAgIH0gZWxzZSBpZiAoZ3N0X3ZhbHVlX2lzX2ZpeGVkICh0b19wYXIpKSB7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnRtcDsKKyAgICAgIGdpbnQgc2V0X2gsIHNldF93LCBmX2gsIGZfdzsKKworICAgICAgdG9fcGFyX24gPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX251bWVyYXRvciAodG9fcGFyKTsKKyAgICAgIHRvX3Bhcl9kID0gZ3N0X3ZhbHVlX2dldF9mcmFjdGlvbl9kZW5vbWluYXRvciAodG9fcGFyKTsKKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAodHJhbnMsICJQQVIgaXMgZml4ZWQgJWQvJWQiLCB0b19wYXJfbiwgdG9fcGFyX2QpOworCisgICAgICAvKiBDYWxjdWxhdGUgc2NhbGUgZmFjdG9yIGZvciB0aGUgUEFSIGNoYW5nZSAqLworICAgICAgaWYgKCFnc3RfdXRpbF9mcmFjdGlvbl9tdWx0aXBseSAoZnJvbV9kYXJfbiwgZnJvbV9kYXJfZCwgdG9fcGFyX2QsCisgICAgICAgICAgICAgIHRvX3Bhcl9uLCAmbnVtLCAmZGVuKSkgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAodHJhbnMsIENPUkUsIE5FR09USUFUSU9OLCAoTlVMTCksCisgICAgICAgICAgICAoIkVycm9yIGNhbGN1bGF0aW5nIHRoZSBvdXRwdXQgc2NhbGVkIHNpemUgLSBpbnRlZ2VyIG92ZXJmbG93IikpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICB9CisKKyAgICAgIC8qIFRyeSB0byBrZWVwIHRoZSBpbnB1dCBoZWlnaHQgKGJlY2F1c2Ugb2YgaW50ZXJsYWNpbmcpICovCisgICAgICB0bXAgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKG91dHMpOworICAgICAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9pbnQgKHRtcCwgImhlaWdodCIsIGZyb21faCk7CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHRtcCwgImhlaWdodCIsICZzZXRfaCk7CisKKyAgICAgIC8qIFRoaXMgbWlnaHQgaGF2ZSBmYWlsZWQgYnV0IHRyeSB0byBzY2FsZSB0aGUgd2lkdGgKKyAgICAgICAqIHRvIGtlZXAgdGhlIERBUiBub25ldGhlbGVzcyAqLworICAgICAgdyA9IChndWludCkgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoc2V0X2gsIG51bSwgZGVuKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfaW50ICh0bXAsICJ3aWR0aCIsIHcpOworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50ICh0bXAsICJ3aWR0aCIsICZzZXRfdyk7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHRtcCk7CisKKyAgICAgIC8qIFdlIGtlcHQgdGhlIERBUiBhbmQgdGhlIGhlaWdodCBpcyBuZWFyZXN0IHRvIHRoZSBvcmlnaW5hbCBoZWlnaHQgKi8KKyAgICAgIGlmIChzZXRfdyA9PSB3KSB7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChvdXRzLCAid2lkdGgiLCBHX1RZUEVfSU5ULCBzZXRfdywgImhlaWdodCIsCisgICAgICAgICAgICBHX1RZUEVfSU5ULCBzZXRfaCwgTlVMTCk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKworICAgICAgZl9oID0gc2V0X2g7CisgICAgICBmX3cgPSBzZXRfdzsKKworICAgICAgLyogSWYgdGhlIGZvcm1lciBmYWlsZWQsIHRyeSB0byBrZWVwIHRoZSBpbnB1dCB3aWR0aCBhdCBsZWFzdCAqLworICAgICAgdG1wID0gZ3N0X3N0cnVjdHVyZV9jb3B5IChvdXRzKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZml4YXRlX2ZpZWxkX25lYXJlc3RfaW50ICh0bXAsICJ3aWR0aCIsIGZyb21fdyk7CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHRtcCwgIndpZHRoIiwgJnNldF93KTsKKworICAgICAgLyogVGhpcyBtaWdodCBoYXZlIGZhaWxlZCBidXQgdHJ5IHRvIHNjYWxlIHRoZSB3aWR0aAorICAgICAgICogdG8ga2VlcCB0aGUgREFSIG5vbmV0aGVsZXNzICovCisgICAgICBoID0gKGd1aW50KSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChzZXRfdywgZGVuLCBudW0pOworICAgICAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9pbnQgKHRtcCwgImhlaWdodCIsIGgpOworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50ICh0bXAsICJoZWlnaHQiLCAmc2V0X2gpOworICAgICAgZ3N0X3N0cnVjdHVyZV9mcmVlICh0bXApOworCisgICAgICAvKiBXZSBrZXB0IHRoZSBEQVIgYW5kIHRoZSB3aWR0aCBpcyBuZWFyZXN0IHRvIHRoZSBvcmlnaW5hbCB3aWR0aCAqLworICAgICAgaWYgKHNldF9oID09IGgpIHsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG91dHMsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHNldF93LCAiaGVpZ2h0IiwKKyAgICAgICAgICAgIEdfVFlQRV9JTlQsIHNldF9oLCBOVUxMKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorCisgICAgICAvKiBJZiBhbGwgdGhpcyBmYWlsZWQsIGtlZXAgdGhlIGhlaWdodCB0aGF0IHdhcyBuZWFyZXN0IHRvIHRoZSBvcmlnbmFsCisgICAgICAgKiBoZWlnaHQgYW5kIHRoZSBuZWFyZXN0IHBvc3NpYmxlIHdpZHRoLiBUaGlzIGNoYW5nZXMgdGhlIERBUiBidXQKKyAgICAgICAqIHRoZXJlJ3Mgbm90IG11Y2ggZWxzZSB0byBkbyBoZXJlLgorICAgICAgICovCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAob3V0cywgIndpZHRoIiwgR19UWVBFX0lOVCwgZl93LCAiaGVpZ2h0IiwgR19UWVBFX0lOVCwKKyAgICAgICAgICBmX2gsIE5VTEwpOworICAgICAgZ290byBkb25lOworICAgIH0gZWxzZSB7CisgICAgICBHc3RTdHJ1Y3R1cmUgKnRtcDsKKyAgICAgIGdpbnQgc2V0X2gsIHNldF93LCBzZXRfcGFyX24sIHNldF9wYXJfZCwgdG1wMjsKKworICAgICAgLyogd2lkdGgsIGhlaWdodCBhbmQgUEFSIGFyZSBub3QgZml4ZWQgYnV0IHBhc3N0aHJvdWdoIGlzIG5vdCBwb3NzaWJsZSAqLworCisgICAgICAvKiBGaXJzdCB0cnkgdG8ga2VlcCB0aGUgaGVpZ2h0IGFuZCB3aWR0aCBhcyBnb29kIGFzIHBvc3NpYmxlCisgICAgICAgKiBhbmQgc2NhbGUgUEFSICovCisgICAgICB0bXAgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKG91dHMpOworICAgICAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9pbnQgKHRtcCwgImhlaWdodCIsIGZyb21faCk7CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHRtcCwgImhlaWdodCIsICZzZXRfaCk7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAodG1wLCAid2lkdGgiLCBmcm9tX3cpOworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50ICh0bXAsICJ3aWR0aCIsICZzZXRfdyk7CisKKyAgICAgIGlmICghZ3N0X3V0aWxfZnJhY3Rpb25fbXVsdGlwbHkgKGZyb21fZGFyX24sIGZyb21fZGFyX2QsIHNldF9oLCBzZXRfdywKKyAgICAgICAgICAgICAgJnRvX3Bhcl9uLCAmdG9fcGFyX2QpKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SICh0cmFucywgQ09SRSwgTkVHT1RJQVRJT04sIChOVUxMKSwKKyAgICAgICAgICAgICgiRXJyb3IgY2FsY3VsYXRpbmcgdGhlIG91dHB1dCBzY2FsZWQgc2l6ZSAtIGludGVnZXIgb3ZlcmZsb3ciKSk7CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAodG1wKTsKKyAgICAgICAgZ290byBkb25lOworICAgICAgfQorCisgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkICh0bXAsICJwaXhlbC1hc3BlY3QtcmF0aW8iKSkKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXRfdmFsdWUgKHRtcCwgInBpeGVsLWFzcGVjdC1yYXRpbyIsIHRvX3Bhcik7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ZyYWN0aW9uICh0bXAsICJwaXhlbC1hc3BlY3QtcmF0aW8iLAorICAgICAgICAgIHRvX3Bhcl9uLCB0b19wYXJfZCk7CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9mcmFjdGlvbiAodG1wLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgJnNldF9wYXJfbiwKKyAgICAgICAgICAmc2V0X3Bhcl9kKTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAodG1wKTsKKworICAgICAgaWYgKHNldF9wYXJfbiA9PSB0b19wYXJfbiAmJiBzZXRfcGFyX2QgPT0gdG9fcGFyX2QpIHsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG91dHMsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHNldF93LCAiaGVpZ2h0IiwKKyAgICAgICAgICAgIEdfVFlQRV9JTlQsIHNldF9oLCBOVUxMKTsKKworICAgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKG91dHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iKSB8fAorICAgICAgICAgICAgc2V0X3Bhcl9uICE9IHNldF9wYXJfZCkKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAob3V0cywgInBpeGVsLWFzcGVjdC1yYXRpbyIsIEdTVF9UWVBFX0ZSQUNUSU9OLAorICAgICAgICAgICAgICBzZXRfcGFyX24sIHNldF9wYXJfZCwgTlVMTCk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKworICAgICAgLyogT3RoZXJ3aXNlIHRyeSB0byBzY2FsZSB3aWR0aCB0byBrZWVwIHRoZSBEQVIgd2l0aCB0aGUgc2V0CisgICAgICAgKiBQQVIgYW5kIGhlaWdodCAqLworICAgICAgaWYgKCFnc3RfdXRpbF9mcmFjdGlvbl9tdWx0aXBseSAoZnJvbV9kYXJfbiwgZnJvbV9kYXJfZCwgc2V0X3Bhcl9kLAorICAgICAgICAgICAgICBzZXRfcGFyX24sICZudW0sICZkZW4pKSB7CisgICAgICAgIEdTVF9FTEVNRU5UX0VSUk9SICh0cmFucywgQ09SRSwgTkVHT1RJQVRJT04sIChOVUxMKSwKKyAgICAgICAgICAgICgiRXJyb3IgY2FsY3VsYXRpbmcgdGhlIG91dHB1dCBzY2FsZWQgc2l6ZSAtIGludGVnZXIgb3ZlcmZsb3ciKSk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKworICAgICAgdyA9IChndWludCkgZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoc2V0X2gsIG51bSwgZGVuKTsKKyAgICAgIHRtcCA9IGdzdF9zdHJ1Y3R1cmVfY29weSAob3V0cyk7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ludCAodG1wLCAid2lkdGgiLCB3KTsKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAodG1wLCAid2lkdGgiLCAmdG1wMik7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHRtcCk7CisKKyAgICAgIGlmICh0bXAyID09IHcpIHsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG91dHMsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHRtcDIsICJoZWlnaHQiLAorICAgICAgICAgICAgR19UWVBFX0lOVCwgc2V0X2gsIE5VTEwpOworICAgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKG91dHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iKSB8fAorICAgICAgICAgICAgc2V0X3Bhcl9uICE9IHNldF9wYXJfZCkKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAob3V0cywgInBpeGVsLWFzcGVjdC1yYXRpbyIsIEdTVF9UWVBFX0ZSQUNUSU9OLAorICAgICAgICAgICAgICBzZXRfcGFyX24sIHNldF9wYXJfZCwgTlVMTCk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKworICAgICAgLyogLi4uIG9yIHRyeSB0aGUgc2FtZSB3aXRoIHRoZSBoZWlnaHQgKi8KKyAgICAgIGggPSAoZ3VpbnQpIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKHNldF93LCBkZW4sIG51bSk7CisgICAgICB0bXAgPSBnc3Rfc3RydWN0dXJlX2NvcHkgKG91dHMpOworICAgICAgZ3N0X3N0cnVjdHVyZV9maXhhdGVfZmllbGRfbmVhcmVzdF9pbnQgKHRtcCwgImhlaWdodCIsIGgpOworICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50ICh0bXAsICJoZWlnaHQiLCAmdG1wMik7CisgICAgICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHRtcCk7CisKKyAgICAgIGlmICh0bXAyID09IGgpIHsKKyAgICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG91dHMsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHNldF93LCAiaGVpZ2h0IiwKKyAgICAgICAgICAgIEdfVFlQRV9JTlQsIHRtcDIsIE5VTEwpOworICAgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKG91dHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iKSB8fAorICAgICAgICAgICAgc2V0X3Bhcl9uICE9IHNldF9wYXJfZCkKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX3NldCAob3V0cywgInBpeGVsLWFzcGVjdC1yYXRpbyIsIEdTVF9UWVBFX0ZSQUNUSU9OLAorICAgICAgICAgICAgICBzZXRfcGFyX24sIHNldF9wYXJfZCwgTlVMTCk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKworICAgICAgLyogSWYgYWxsIGZhaWxzIHdlIGNhbid0IGtlZXAgdGhlIERBUiBhbmQgdGFrZSB0aGUgbmVhcmVzdCB2YWx1ZXMKKyAgICAgICAqIGZvciBldmVyeXRoaW5nIGZyb20gdGhlIGZpcnN0IHRyeSAqLworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKG91dHMsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHNldF93LCAiaGVpZ2h0IiwKKyAgICAgICAgICBHX1RZUEVfSU5ULCBzZXRfaCwgTlVMTCk7CisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKG91dHMsICJwaXhlbC1hc3BlY3QtcmF0aW8iKSB8fAorICAgICAgICAgIHNldF9wYXJfbiAhPSBzZXRfcGFyX2QpCisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChvdXRzLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwgR1NUX1RZUEVfRlJBQ1RJT04sCisgICAgICAgICAgICBzZXRfcGFyX24sIHNldF9wYXJfZCwgTlVMTCk7CisgICAgfQorICB9CisKK2RvbmU6CisgIEdTVF9ERUJVR19PQkpFQ1QgKHRyYW5zLCAiZml4YXRlZCBvdGhlcmNhcHMgdG8gJSIgR1NUX1BUUl9GT1JNQVQsIG90aGVyY2Fwcyk7CisKKyAgaWYgKGZyb21fcGFyID09ICZmcGFyKQorICAgIGdfdmFsdWVfdW5zZXQgKCZmcGFyKTsKKyAgaWYgKHRvX3BhciA9PSAmdHBhcikKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmdHBhcik7CisKKyAgLyogZml4YXRlIHJlbWFpbmluZyBmaWVsZHMgKi8KKyAgb3RoZXJjYXBzID0gZ3N0X2NhcHNfZml4YXRlIChvdGhlcmNhcHMpOworCisgIGlmIChkaXJlY3Rpb24gPT0gR1NUX1BBRF9TSU5LKSB7CisgICAgaWYgKGdzdF9jYXBzX2lzX3N1YnNldCAoY2Fwcywgb3RoZXJjYXBzKSkgeworICAgICAgZ3N0X2NhcHNfcmVwbGFjZSAoJm90aGVyY2FwcywgY2Fwcyk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG90aGVyY2FwczsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92NGwyX3RyYW5zZm9ybV9wcmVwYXJlX291dHB1dF9idWZmZXIgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywKKyAgICBHc3RCdWZmZXIgKiBpbmJ1ZiwgR3N0QnVmZmVyICoqIG91dGJ1ZikKK3sKKyAgR3N0VjRsMlRyYW5zZm9ybSAqc2VsZiA9IEdTVF9WNEwyX1RSQU5TRk9STSAodHJhbnMpOworICBHc3RCdWZmZXJQb29sICpwb29sID0gR1NUX0JVRkZFUl9QT09MIChzZWxmLT52NGwyb3V0cHV0LT5wb29sKTsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgR3N0QmFzZVRyYW5zZm9ybUNsYXNzICpiY2xhc3MgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKHBhcmVudF9jbGFzcyk7CisKKyAgaWYgKGdzdF9iYXNlX3RyYW5zZm9ybV9pc19wYXNzdGhyb3VnaCAodHJhbnMpKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlBhc3N0aHJvdWdoLCBubyBuZWVkIHRvIGRvIGFueXRoaW5nIik7CisgICAgKm91dGJ1ZiA9IGluYnVmOworICAgIGdvdG8gYmVhY2g7CisgIH0KKworICAvKiBFbnN1cmUgaW5wdXQgaW50ZXJuYWwgcG9vbCBpcyBhY3RpdmUgKi8KKyAgaWYgKCFnc3RfYnVmZmVyX3Bvb2xfaXNfYWN0aXZlIChwb29sKSkgeworICAgIEdzdFN0cnVjdHVyZSAqY29uZmlnID0gZ3N0X2J1ZmZlcl9wb29sX2dldF9jb25maWcgKHBvb2wpOworICAgIGdpbnQgbWluID0gc2VsZi0+djRsMm91dHB1dC0+bWluX2J1ZmZlcnMgPT0gMCA/IEdTVF9WNEwyX01JTl9CVUZGRVJTIDoKKyAgICAgICAgc2VsZi0+djRsMm91dHB1dC0+bWluX2J1ZmZlcnM7CisgICAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19zZXRfcGFyYW1zIChjb25maWcsIHNlbGYtPmluY2FwcywKKyAgICAgICAgc2VsZi0+djRsMm91dHB1dC0+aW5mby5zaXplLCBtaW4sIG1pbik7CisKKyAgICAvKiBUaGVyZSBpcyBubyByZWFzb24gdG8gcmVmdXNlIHRoaXMgY29uZmlnICovCisgICAgaWYgKCFnc3RfYnVmZmVyX3Bvb2xfc2V0X2NvbmZpZyAocG9vbCwgY29uZmlnKSkKKyAgICAgIGdvdG8gYWN0aXZhdGVfZmFpbGVkOworCisgICAgaWYgKCFnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAocG9vbCwgVFJVRSkpCisgICAgICBnb3RvIGFjdGl2YXRlX2ZhaWxlZDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJRdWV1ZSBpbnB1dCBidWZmZXIiKTsKKyAgcmV0ID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcHJvY2VzcyAoR1NUX1Y0TDJfQlVGRkVSX1BPT0wgKHBvb2wpLCAmaW5idWYpOworICBpZiAoR19VTkxJS0VMWSAocmV0ICE9IEdTVF9GTE9XX09LKSkKKyAgICBnb3RvIGJlYWNoOworCisgIGRvIHsKKyAgICBwb29sID0gZ3N0X2Jhc2VfdHJhbnNmb3JtX2dldF9idWZmZXJfcG9vbCAodHJhbnMpOworCisgICAgaWYgKCFnc3RfYnVmZmVyX3Bvb2xfc2V0X2FjdGl2ZSAocG9vbCwgVFJVRSkpCisgICAgICBnb3RvIGFjdGl2YXRlX2ZhaWxlZDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJEZXF1ZXVlIG91dHB1dCBidWZmZXIiKTsKKyAgICByZXQgPSBnc3RfYnVmZmVyX3Bvb2xfYWNxdWlyZV9idWZmZXIgKHBvb2wsIG91dGJ1ZiwgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHBvb2wpOworCisgICAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICAgIGdvdG8gYWxsb2NfZmFpbGVkOworCisgICAgcG9vbCA9IHNlbGYtPnY0bDJjYXB0dXJlLT5wb29sOworICAgIHJldCA9IGdzdF92NGwyX2J1ZmZlcl9wb29sX3Byb2Nlc3MgKEdTVF9WNEwyX0JVRkZFUl9QT09MIChwb29sKSwgb3V0YnVmKTsKKworICB9IHdoaWxlIChyZXQgPT0gR1NUX1Y0TDJfRkxPV19DT1JSVVBURURfQlVGRkVSKTsKKworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoKm91dGJ1Zik7CisgICAgKm91dGJ1ZiA9IE5VTEw7CisgIH0KKworICBpZiAoYmNsYXNzLT5jb3B5X21ldGFkYXRhKQorICAgIGlmICghYmNsYXNzLT5jb3B5X21ldGFkYXRhICh0cmFucywgaW5idWYsICpvdXRidWYpKSB7CisgICAgICAvKiBzb21ldGhpbmcgZmFpbGVkLCBwb3N0IGEgd2FybmluZyAqLworICAgICAgR1NUX0VMRU1FTlRfV0FSTklORyAoc2VsZiwgU1RSRUFNLCBOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgKCJjb3VsZCBub3QgY29weSBtZXRhZGF0YSIpLCAoTlVMTCkpOworICAgIH0KKworYmVhY2g6CisgIHJldHVybiByZXQ7CisKK2FjdGl2YXRlX2ZhaWxlZDoKKyAgR1NUX0VMRU1FTlRfRVJST1IgKHNlbGYsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICgiZmFpbGVkIHRvIGFjdGl2YXRlIGJ1ZmZlcnBvb2wiKSwgKCJmYWlsZWQgdG8gYWN0aXZhdGUgYnVmZmVycG9vbCIpKTsKKyAgZ19vYmplY3RfdW5yZWYgKHBvb2wpOworICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisKK2FsbG9jX2ZhaWxlZDoKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXIgZnJvbSBwb29sIik7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdjRsMl90cmFuc2Zvcm1fdHJhbnNmb3JtIChHc3RCYXNlVHJhbnNmb3JtICogdHJhbnMsIEdzdEJ1ZmZlciAqIGluYnVmLAorICAgIEdzdEJ1ZmZlciAqIG91dGJ1ZikKK3sKKyAgLyogTm90aGluZyB0byBkbyAqLworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdHJhbnNmb3JtX3NpbmtfZXZlbnQgKEdzdEJhc2VUcmFuc2Zvcm0gKiB0cmFucywgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR3N0VjRsMlRyYW5zZm9ybSAqc2VsZiA9IEdTVF9WNEwyX1RSQU5TRk9STSAodHJhbnMpOworICBnYm9vbGVhbiByZXQ7CisKKyAgLyogTm90aGluZyB0byBmbHVzaCBpbiBwYXNzdGhyb3VnaCAqLworICBpZiAoZ3N0X2Jhc2VfdHJhbnNmb3JtX2lzX3Bhc3N0aHJvdWdoICh0cmFucykpCisgICAgcmV0dXJuIEdTVF9CQVNFX1RSQU5TRk9STV9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAodHJhbnMsIGV2ZW50KTsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVEFSVDoKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJmbHVzaCBzdGFydCIpOworICAgICAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9jayAoc2VsZi0+djRsMm91dHB1dCk7CisgICAgICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyY2FwdHVyZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNpbmtfZXZlbnQgKHRyYW5zLCBldmVudCk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfRkxVU0hfU1RPUDoKKyAgICAgIC8qIEJ1ZmZlciBzaG91bGQgYmUgYmFjayBub3cgKi8KKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJmbHVzaCBzdG9wIik7CisgICAgICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrX3N0b3AgKHNlbGYtPnY0bDJjYXB0dXJlKTsKKyAgICAgIGdzdF92NGwyX29iamVjdF91bmxvY2tfc3RvcCAoc2VsZi0+djRsMm91dHB1dCk7CisgICAgICBnc3RfdjRsMl9idWZmZXJfcG9vbF9mbHVzaCAoc2VsZi0+djRsMm91dHB1dC0+cG9vbCk7CisgICAgICBnc3RfdjRsMl9idWZmZXJfcG9vbF9mbHVzaCAoc2VsZi0+djRsMmNhcHR1cmUtPnBvb2wpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuCitnc3RfdjRsMl90cmFuc2Zvcm1fY2hhbmdlX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0ZUNoYW5nZSB0cmFuc2l0aW9uKQoreworICBHc3RWNGwyVHJhbnNmb3JtICpzZWxmID0gR1NUX1Y0TDJfVFJBTlNGT1JNIChlbGVtZW50KTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworCisgIHN3aXRjaCAodHJhbnNpdGlvbikgeworICAgIGNhc2UgR1NUX1NUQVRFX0NIQU5HRV9OVUxMX1RPX1JFQURZOgorICAgICAgaWYgKCFnc3RfdjRsMl90cmFuc2Zvcm1fb3BlbiAoc2VsZikpCisgICAgICAgIHJldHVybiBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZOgorICAgICAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9jayAoc2VsZi0+djRsMm91dHB1dCk7CisgICAgICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyY2FwdHVyZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKKworICBzd2l0Y2ggKHRyYW5zaXRpb24pIHsKKyAgICBjYXNlIEdTVF9TVEFURV9DSEFOR0VfUkVBRFlfVE9fTlVMTDoKKyAgICAgIGdzdF92NGwyX3RyYW5zZm9ybV9jbG9zZSAoc2VsZik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdHJhbnNmb3JtX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFY0bDJUcmFuc2Zvcm0gKnNlbGYgPSBHU1RfVjRMMl9UUkFOU0ZPUk0gKG9iamVjdCk7CisKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNlbGYtPnByb2JlZF9zaW5rY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzZWxmLT5wcm9iZWRfc3JjY2FwcywgTlVMTCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl90cmFuc2Zvcm1fZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFY0bDJUcmFuc2Zvcm0gKnNlbGYgPSBHU1RfVjRMMl9UUkFOU0ZPUk0gKG9iamVjdCk7CisKKyAgZ3N0X3Y0bDJfb2JqZWN0X2Rlc3Ryb3kgKHNlbGYtPnY0bDJjYXB0dXJlKTsKKyAgZ3N0X3Y0bDJfb2JqZWN0X2Rlc3Ryb3kgKHNlbGYtPnY0bDJvdXRwdXQpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3RyYW5zZm9ybV9pbml0IChHc3RWNGwyVHJhbnNmb3JtICogc2VsZikKK3sKKyAgLyogVjRMMiBvYmplY3QgYXJlIGNyZWF0ZWQgaW4gc3ViaW5zdGFuY2VfaW5pdCAqLworICAvKiBlbmFibGUgUW9TICovCisgIGdzdF9iYXNlX3RyYW5zZm9ybV9zZXRfcW9zX2VuYWJsZWQgKEdTVF9CQVNFX1RSQU5TRk9STSAoc2VsZiksIFRSVUUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdHJhbnNmb3JtX3N1Ymluc3RhbmNlX2luaXQgKEdUeXBlSW5zdGFuY2UgKiBpbnN0YW5jZSwgZ3BvaW50ZXIgZ19jbGFzcykKK3sKKyAgR3N0VjRsMlRyYW5zZm9ybUNsYXNzICprbGFzcyA9IEdTVF9WNEwyX1RSQU5TRk9STV9DTEFTUyAoZ19jbGFzcyk7CisgIEdzdFY0bDJUcmFuc2Zvcm0gKnNlbGYgPSBHU1RfVjRMMl9UUkFOU0ZPUk0gKGluc3RhbmNlKTsKKworICBzZWxmLT52NGwyb3V0cHV0ID0gZ3N0X3Y0bDJfb2JqZWN0X25ldyAoR1NUX0VMRU1FTlQgKHNlbGYpLAorICAgICAgR1NUX09CSkVDVCAoR1NUX0JBU0VfVFJBTlNGT1JNX1NJTktfUEFEIChzZWxmKSksCisgICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwga2xhc3MtPmRlZmF1bHRfZGV2aWNlLAorICAgICAgZ3N0X3Y0bDJfZ2V0X291dHB1dCwgZ3N0X3Y0bDJfc2V0X291dHB1dCwgTlVMTCk7CisgIHNlbGYtPnY0bDJvdXRwdXQtPm5vX2luaXRpYWxfZm9ybWF0ID0gVFJVRTsKKyAgc2VsZi0+djRsMm91dHB1dC0+a2VlcF9hc3BlY3QgPSBGQUxTRTsKKworICBzZWxmLT52NGwyY2FwdHVyZSA9IGdzdF92NGwyX29iamVjdF9uZXcgKEdTVF9FTEVNRU5UIChzZWxmKSwKKyAgICAgIEdTVF9PQkpFQ1QgKEdTVF9CQVNFX1RSQU5TRk9STV9TUkNfUEFEIChzZWxmKSksCisgICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsIGtsYXNzLT5kZWZhdWx0X2RldmljZSwKKyAgICAgIGdzdF92NGwyX2dldF9pbnB1dCwgZ3N0X3Y0bDJfc2V0X2lucHV0LCBOVUxMKTsKKyAgc2VsZi0+djRsMmNhcHR1cmUtPm5vX2luaXRpYWxfZm9ybWF0ID0gVFJVRTsKKyAgc2VsZi0+djRsMm91dHB1dC0+a2VlcF9hc3BlY3QgPSBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3RyYW5zZm9ybV9jbGFzc19pbml0IChHc3RWNGwyVHJhbnNmb3JtQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqYmFzZV90cmFuc2Zvcm1fY2xhc3M7CisKKyAgZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBiYXNlX3RyYW5zZm9ybV9jbGFzcyA9IChHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgKikga2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF92NGwyX3RyYW5zZm9ybV9kZWJ1ZywgInY0bDJ0cmFuc2Zvcm0iLCAwLAorICAgICAgIlY0TDIgQ29udmVydGVyIik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywKKyAgICAgICJWNEwyIFZpZGVvIENvbnZlcnRlciIsCisgICAgICAiRmlsdGVyL0NvbnZlcnRlci9WaWRlby9TY2FsZXIiLAorICAgICAgIlRyYW5zZm9ybSBzdHJlYW1zIHZpYSBWNEwyIEFQSSIsCisgICAgICAiTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPiIpOworCisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdHJhbnNmb3JtX2Rpc3Bvc2UpOworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl90cmFuc2Zvcm1fZmluYWxpemUpOworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3RyYW5zZm9ybV9zZXRfcHJvcGVydHkpOworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3RyYW5zZm9ybV9nZXRfcHJvcGVydHkpOworCisgIGJhc2VfdHJhbnNmb3JtX2NsYXNzLT5zdG9wID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3RyYW5zZm9ybV9zdG9wKTsKKyAgYmFzZV90cmFuc2Zvcm1fY2xhc3MtPnNldF9jYXBzID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl90cmFuc2Zvcm1fc2V0X2NhcHMpOworICBiYXNlX3RyYW5zZm9ybV9jbGFzcy0+cXVlcnkgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdHJhbnNmb3JtX3F1ZXJ5KTsKKyAgYmFzZV90cmFuc2Zvcm1fY2xhc3MtPnNpbmtfZXZlbnQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3RyYW5zZm9ybV9zaW5rX2V2ZW50KTsKKyAgYmFzZV90cmFuc2Zvcm1fY2xhc3MtPmRlY2lkZV9hbGxvY2F0aW9uID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl90cmFuc2Zvcm1fZGVjaWRlX2FsbG9jYXRpb24pOworICBiYXNlX3RyYW5zZm9ybV9jbGFzcy0+cHJvcG9zZV9hbGxvY2F0aW9uID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl90cmFuc2Zvcm1fcHJvcG9zZV9hbGxvY2F0aW9uKTsKKyAgYmFzZV90cmFuc2Zvcm1fY2xhc3MtPnRyYW5zZm9ybV9jYXBzID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl90cmFuc2Zvcm1fdHJhbnNmb3JtX2NhcHMpOworICBiYXNlX3RyYW5zZm9ybV9jbGFzcy0+Zml4YXRlX2NhcHMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3RyYW5zZm9ybV9maXhhdGVfY2Fwcyk7CisgIGJhc2VfdHJhbnNmb3JtX2NsYXNzLT5wcmVwYXJlX291dHB1dF9idWZmZXIgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3RyYW5zZm9ybV9wcmVwYXJlX291dHB1dF9idWZmZXIpOworICBiYXNlX3RyYW5zZm9ybV9jbGFzcy0+dHJhbnNmb3JtID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl90cmFuc2Zvcm1fdHJhbnNmb3JtKTsKKworICBiYXNlX3RyYW5zZm9ybV9jbGFzcy0+cGFzc3Rocm91Z2hfb25fc2FtZV9jYXBzID0gVFJVRTsKKworICBlbGVtZW50X2NsYXNzLT5jaGFuZ2Vfc3RhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3RyYW5zZm9ybV9jaGFuZ2Vfc3RhdGUpOworCisgIGdzdF92NGwyX29iamVjdF9pbnN0YWxsX20ybV9wcm9wZXJ0aWVzX2hlbHBlciAoZ29iamVjdF9jbGFzcyk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl90cmFuc2Zvcm1fc3ViY2xhc3NfaW5pdCAoZ3BvaW50ZXIgZ19jbGFzcywgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR3N0VjRsMlRyYW5zZm9ybUNsYXNzICprbGFzcyA9IEdTVF9WNEwyX1RSQU5TRk9STV9DTEFTUyAoZ19jbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChnX2NsYXNzKTsKKyAgR3N0VjRsMlRyYW5zZm9ybUNEYXRhICpjZGF0YSA9IGRhdGE7CisKKyAga2xhc3MtPmRlZmF1bHRfZGV2aWNlID0gY2RhdGEtPmRldmljZTsKKworICAvKiBOb3RlOiBnc3RfcGFkX3RlbXBsYXRlX25ldygpIHRha2UgdGhlIGZsb2F0aW5nIHJlZiBmcm9tIHRoZSBjYXBzICovCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICBnc3RfcGFkX3RlbXBsYXRlX25ldyAoInNpbmsiLCBHU1RfUEFEX1NJTkssIEdTVF9QQURfQUxXQVlTLAorICAgICAgICAgIGNkYXRhLT5zaW5rX2NhcHMpKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgIGdzdF9wYWRfdGVtcGxhdGVfbmV3ICgic3JjIiwgR1NUX1BBRF9TUkMsIEdTVF9QQURfQUxXQVlTLAorICAgICAgICAgIGNkYXRhLT5zcmNfY2FwcykpOworCisgIGdfZnJlZSAoY2RhdGEpOworfQorCisvKiBQcm9iaW5nIGZ1bmN0aW9ucyAqLworZ2Jvb2xlYW4KK2dzdF92NGwyX2lzX3RyYW5zZm9ybSAoR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKQoreworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBpZiAoZ3N0X2NhcHNfaXNfc3Vic2V0IChzaW5rX2NhcHMsIGdzdF92NGwyX29iamVjdF9nZXRfcmF3X2NhcHMgKCkpCisgICAgICAmJiBnc3RfY2Fwc19pc19zdWJzZXQgKHNyY19jYXBzLCBnc3RfdjRsMl9vYmplY3RfZ2V0X3Jhd19jYXBzICgpKSkKKyAgICByZXQgPSBUUlVFOworCisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2dzdF92NGwyX3RyYW5zZm9ybV9yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luLCBjb25zdCBnY2hhciAqIGJhc2VuYW1lLAorICAgIGNvbnN0IGdjaGFyICogZGV2aWNlX3BhdGgsIEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdENhcHMgKiBzcmNfY2FwcykKK3sKKyAgR1R5cGVRdWVyeSB0eXBlX3F1ZXJ5OworICBHVHlwZUluZm8gdHlwZV9pbmZvID0geyAwLCB9OworICBHVHlwZSB0eXBlLCBzdWJ0eXBlOworICBnY2hhciAqdHlwZV9uYW1lOworICBHc3RWNGwyVHJhbnNmb3JtQ0RhdGEgKmNkYXRhOworCisgIGNkYXRhID0gZ19uZXcwIChHc3RWNGwyVHJhbnNmb3JtQ0RhdGEsIDEpOworICBjZGF0YS0+ZGV2aWNlID0gZ19zdHJkdXAgKGRldmljZV9wYXRoKTsKKyAgY2RhdGEtPnNpbmtfY2FwcyA9IGdzdF9jYXBzX3JlZiAoc2lua19jYXBzKTsKKyAgY2RhdGEtPnNyY19jYXBzID0gZ3N0X2NhcHNfcmVmIChzcmNfY2Fwcyk7CisKKyAgdHlwZSA9IGdzdF92NGwyX3RyYW5zZm9ybV9nZXRfdHlwZSAoKTsKKyAgZ190eXBlX3F1ZXJ5ICh0eXBlLCAmdHlwZV9xdWVyeSk7CisgIG1lbXNldCAoJnR5cGVfaW5mbywgMCwgc2l6ZW9mICh0eXBlX2luZm8pKTsKKyAgdHlwZV9pbmZvLmNsYXNzX3NpemUgPSB0eXBlX3F1ZXJ5LmNsYXNzX3NpemU7CisgIHR5cGVfaW5mby5pbnN0YW5jZV9zaXplID0gdHlwZV9xdWVyeS5pbnN0YW5jZV9zaXplOworICB0eXBlX2luZm8uY2xhc3NfaW5pdCA9IGdzdF92NGwyX3RyYW5zZm9ybV9zdWJjbGFzc19pbml0OworICB0eXBlX2luZm8uY2xhc3NfZGF0YSA9IGNkYXRhOworICB0eXBlX2luZm8uaW5zdGFuY2VfaW5pdCA9IGdzdF92NGwyX3RyYW5zZm9ybV9zdWJpbnN0YW5jZV9pbml0OworCisgIHR5cGVfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInY0bDIlc2NvbnZlcnQiLCBiYXNlbmFtZSk7CisgIHN1YnR5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljICh0eXBlLCB0eXBlX25hbWUsICZ0eXBlX2luZm8sIDApOworCisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgdHlwZV9uYW1lLCBHU1RfUkFOS19OT05FLCBzdWJ0eXBlKSkKKyAgICBHU1RfV0FSTklORyAoIkZhaWxlZCB0byByZWdpc3RlciBwbHVnaW4gJyVzJyIsIHR5cGVfbmFtZSk7CisKKyAgZ19mcmVlICh0eXBlX25hbWUpOworfQpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5oIGIvc3lzL3Y0bDIvZ3N0djRsMnRyYW5zZm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNmI5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwydHJhbnNmb3JtLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBDb2xsYWJvcmEgTHRkLgorICogICAgIEF1dGhvcjogTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX19HU1RfVjRMMl9UUkFOU0ZPUk1fSF9fCisjZGVmaW5lIF9fR1NUX1Y0TDJfVFJBTlNGT1JNX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKworI2luY2x1ZGUgPGdzdHY0bDJvYmplY3QuaD4KKyNpbmNsdWRlIDxnc3R2NGwyYnVmZmVycG9vbC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfVjRMMl9UUkFOU0ZPUk0gXAorICAoZ3N0X3Y0bDJfdHJhbnNmb3JtX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WNEwyX1RSQU5TRk9STShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1Y0TDJfVFJBTlNGT1JNLEdzdFY0bDJUcmFuc2Zvcm0pKQorI2RlZmluZSBHU1RfVjRMMl9UUkFOU0ZPUk1fQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVjRMMl9UUkFOU0ZPUk0sR3N0VjRsMlRyYW5zZm9ybUNsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfVFJBTlNGT1JNKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVjRMMl9UUkFOU0ZPUk0pKQorI2RlZmluZSBHU1RfSVNfVjRMMl9UUkFOU0ZPUk1fQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX1Y0TDJfVFJBTlNGT1JNKSkKKyNkZWZpbmUgR1NUX1Y0TDJfVFJBTlNGT1JNX0dFVF9DTEFTUyhpbnN0KSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgoaW5zdCksR1NUX1RZUEVfVjRMMl9UUkFOU0ZPUk0sR3N0VjRsMlRyYW5zZm9ybUNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJUcmFuc2Zvcm0gR3N0VjRsMlRyYW5zZm9ybTsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyVHJhbnNmb3JtQ2xhc3MgR3N0VjRsMlRyYW5zZm9ybUNsYXNzOworCitzdHJ1Y3QgX0dzdFY0bDJUcmFuc2Zvcm0KK3sKKyAgR3N0QmFzZVRyYW5zZm9ybSBwYXJlbnQ7CisKKyAgLyogPCBwcml2YXRlID4gKi8KKyAgR3N0VjRsMk9iamVjdCAqIHY0bDJvdXRwdXQ7CisgIEdzdFY0bDJPYmplY3QgKiB2NGwyY2FwdHVyZTsKKworICAvKiBwYWRzICovCisgIEdzdENhcHMgKnByb2JlZF9zcmNjYXBzOworICBHc3RDYXBzICpwcm9iZWRfc2lua2NhcHM7CisKKyAgLyogU2VsZWN0ZWQgY2FwcyAqLworICBHc3RDYXBzICppbmNhcHM7CisgIEdzdENhcHMgKm91dGNhcHM7Cit9OworCitzdHJ1Y3QgX0dzdFY0bDJUcmFuc2Zvcm1DbGFzcworeworICBHc3RCYXNlVHJhbnNmb3JtQ2xhc3MgcGFyZW50X2NsYXNzOworICBnY2hhciAqZGVmYXVsdF9kZXZpY2U7Cit9OworCitHVHlwZSBnc3RfdjRsMl90cmFuc2Zvcm1fZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfdjRsMl9pc190cmFuc2Zvcm0gICAgICAgKEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdENhcHMgKiBzcmNfY2Fwcyk7Cit2b2lkICAgICBnc3RfdjRsMl90cmFuc2Zvcm1fcmVnaXN0ZXIgKEdzdFBsdWdpbiAqIHBsdWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKmJhc2VuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqZGV2aWNlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdENhcHMgKiBzcmNfY2Fwcyk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9WNEwyX1RSQU5TRk9STV9IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJ0dW5lci5jIGIvc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjYzJjMQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJ0dW5lci5jCkBAIC0wLDAgKzEsMzAzIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogICAgICAgICAgICAgICAyMDA2IEVkZ2FyZCBMaW1hIDxlZGdhcmQubGltYUBnbWFpbC5jb20+CisgKgorICogZ3N0djRsMnR1bmVyLmM6IHR1bmVyIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgVjRMMgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgImdzdHY0bDJvYmplY3QuaCIKKyNpbmNsdWRlICJnc3R2NGwydHVuZXIuaCIKKyNpbmNsdWRlICJnc3R2NGwyb2JqZWN0LmgiCisKK0dfREVGSU5FX1RZUEUgKEdzdFY0bDJUdW5lckNoYW5uZWwsIGdzdF92NGwyX3R1bmVyX2NoYW5uZWwsCisgICAgR1NUX1RZUEVfVFVORVJfQ0hBTk5FTCk7CisKK0dfREVGSU5FX1RZUEUgKEdzdFY0bDJUdW5lck5vcm0sIGdzdF92NGwyX3R1bmVyX25vcm0sIEdTVF9UWVBFX1RVTkVSX05PUk0pOworCisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl90dW5lcl9jaGFubmVsX2NsYXNzX2luaXQgKEdzdFY0bDJUdW5lckNoYW5uZWxDbGFzcyAqIGtsYXNzKQoreworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdHVuZXJfY2hhbm5lbF9pbml0IChHc3RWNGwyVHVuZXJDaGFubmVsICogY2hhbm5lbCkKK3sKKyAgY2hhbm5lbC0+aW5kZXggPSAoZ3VpbnQzMikgLSAxOworICBjaGFubmVsLT50dW5lciA9IChndWludDMyKSAtIDE7CisgIGNoYW5uZWwtPmF1ZGlvID0gKGd1aW50MzIpIC0gMTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3R1bmVyX25vcm1fY2xhc3NfaW5pdCAoR3N0VjRsMlR1bmVyTm9ybUNsYXNzICoga2xhc3MpCit7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl90dW5lcl9ub3JtX2luaXQgKEdzdFY0bDJUdW5lck5vcm0gKiBub3JtKQoreworICBub3JtLT5pbmRleCA9IDA7Cit9CisKK3N0YXRpYyBHX0dOVUNfVU5VU0VEIGdib29sZWFuCitnc3RfdjRsMl90dW5lcl9jb250YWluc19jaGFubmVsIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBHc3RWNGwyVHVuZXJDaGFubmVsICogdjRsMmNoYW5uZWwpCit7CisgIGNvbnN0IEdMaXN0ICppdGVtOworCisgIGZvciAoaXRlbSA9IHY0bDJvYmplY3QtPmNoYW5uZWxzOyBpdGVtICE9IE5VTEw7IGl0ZW0gPSBpdGVtLT5uZXh0KQorICAgIGlmIChpdGVtLT5kYXRhID09IHY0bDJjaGFubmVsKQorICAgICAgcmV0dXJuIFRSVUU7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitjb25zdCBHTGlzdCAqCitnc3RfdjRsMl90dW5lcl9saXN0X2NoYW5uZWxzIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCkKK3sKKyAgcmV0dXJuIHY0bDJvYmplY3QtPmNoYW5uZWxzOworfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfdHVuZXJfc2V0X2NoYW5uZWwgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIEdzdFR1bmVyQ2hhbm5lbCAqIGNoYW5uZWwpCit7CisgIEdzdFY0bDJUdW5lckNoYW5uZWwgKnY0bDJjaGFubmVsID0gR1NUX1Y0TDJfVFVORVJfQ0hBTk5FTCAoY2hhbm5lbCk7CisKKyAgLyogYXNzZXJ0IHRoYXQgd2UncmUgb3BlbmVkIGFuZCB0aGF0IHdlJ3JlIHVzaW5nIGEga25vd24gaXRlbSAqLworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCksIEZBTFNFKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGdzdF92NGwyX3R1bmVyX2NvbnRhaW5zX2NoYW5uZWwgKHY0bDJvYmplY3QsCisgICAgICAgICAgdjRsMmNoYW5uZWwpLCBGQUxTRSk7CisKKyAgaWYgKHY0bDJvYmplY3QtPnNldF9pbl9vdXRfZnVuYyAodjRsMm9iamVjdCwgdjRsMmNoYW5uZWwtPmluZGV4KSkgeworICAgIGdzdF90dW5lcl9jaGFubmVsX2NoYW5nZWQgKEdTVF9UVU5FUiAodjRsMm9iamVjdC0+ZWxlbWVudCksIGNoYW5uZWwpOworICAgIC8qIGNhbiBGUFMgY2hhbmdlIGhlcmU/ICovCisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7CisKK30KKworR3N0VHVuZXJDaGFubmVsICoKK2dzdF92NGwyX3R1bmVyX2dldF9jaGFubmVsIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCkKK3sKKyAgR0xpc3QgKml0ZW07CisgIGdpbnQgY2hhbm5lbDsKKworICAvKiBhc3NlcnQgdGhhdCB3ZSdyZSBvcGVuZWQgYW5kIHRoYXQgd2UncmUgdXNpbmcgYSBrbm93biBpdGVtICovCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSwgTlVMTCk7CisKKyAgaWYgKHY0bDJvYmplY3QtPmdldF9pbl9vdXRfZnVuYyAodjRsMm9iamVjdCwgJmNoYW5uZWwpKSB7CisKKyAgICBmb3IgKGl0ZW0gPSB2NGwyb2JqZWN0LT5jaGFubmVsczsgaXRlbSAhPSBOVUxMOyBpdGVtID0gaXRlbS0+bmV4dCkgeworICAgICAgaWYgKGNoYW5uZWwgPT0gR1NUX1Y0TDJfVFVORVJfQ0hBTk5FTCAoaXRlbS0+ZGF0YSktPmluZGV4KQorICAgICAgICByZXR1cm4gKEdzdFR1bmVyQ2hhbm5lbCAqKSBpdGVtLT5kYXRhOworICAgIH0KKworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBHX0dOVUNfVU5VU0VEIGdib29sZWFuCitnc3RfdjRsMl90dW5lcl9jb250YWluc19ub3JtIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBHc3RWNGwyVHVuZXJOb3JtICogdjRsMm5vcm0pCit7CisgIGNvbnN0IEdMaXN0ICppdGVtOworCisgIGZvciAoaXRlbSA9IHY0bDJvYmplY3QtPm5vcm1zOyBpdGVtICE9IE5VTEw7IGl0ZW0gPSBpdGVtLT5uZXh0KQorICAgIGlmIChpdGVtLT5kYXRhID09IHY0bDJub3JtKQorICAgICAgcmV0dXJuIFRSVUU7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitjb25zdCBHTGlzdCAqCitnc3RfdjRsMl90dW5lcl9saXN0X25vcm1zIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCkKK3sKKyAgcmV0dXJuIHY0bDJvYmplY3QtPm5vcm1zOworfQorCit2b2lkCitnc3RfdjRsMl90dW5lcl9zZXRfbm9ybV9hbmRfbm90aWZ5IChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBHc3RUdW5lck5vcm0gKiBub3JtKQoreworICBpZiAoZ3N0X3Y0bDJfdHVuZXJfc2V0X25vcm0gKHY0bDJvYmplY3QsIG5vcm0pKSB7CisjaWYgMAorICAgIGdfb2JqZWN0X25vdGlmeSAoR19PQkpFQ1QgKHY0bDJvYmplY3QtPmVsZW1lbnQpLCAibm9ybSIpOworI2VuZGlmCisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX3R1bmVyX3NldF9ub3JtIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgR3N0VHVuZXJOb3JtICogbm9ybSkKK3sKKyAgR3N0VjRsMlR1bmVyTm9ybSAqdjRsMm5vcm0gPSBHU1RfVjRMMl9UVU5FUl9OT1JNIChub3JtKTsKKworICAvKiBhc3NlcnQgdGhhdCB3ZSdyZSBvcGVuZWQgYW5kIHRoYXQgd2UncmUgdXNpbmcgYSBrbm93biBpdGVtICovCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ3N0X3Y0bDJfdHVuZXJfY29udGFpbnNfbm9ybSAodjRsMm9iamVjdCwgdjRsMm5vcm0pLAorICAgICAgRkFMU0UpOworCisgIGlmIChnc3RfdjRsMl9zZXRfbm9ybSAodjRsMm9iamVjdCwgdjRsMm5vcm0tPmluZGV4KSkgeworICAgIGdzdF90dW5lcl9ub3JtX2NoYW5nZWQgKEdTVF9UVU5FUiAodjRsMm9iamVjdC0+ZWxlbWVudCksIG5vcm0pOworICAgIGlmICh2NGwyb2JqZWN0LT51cGRhdGVfZnBzX2Z1bmMpCisgICAgICB2NGwyb2JqZWN0LT51cGRhdGVfZnBzX2Z1bmMgKHY0bDJvYmplY3QpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworCit9CisKK0dzdFR1bmVyTm9ybSAqCitnc3RfdjRsMl90dW5lcl9nZXRfbm9ybSAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpCit7CisgIHY0bDJfc3RkX2lkIG5vcm07CisKKyAgLyogYXNzZXJ0IHRoYXQgd2UncmUgb3BlbmVkIGFuZCB0aGF0IHdlJ3JlIHVzaW5nIGEga25vd24gaXRlbSAqLworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCksIE5VTEwpOworCisgIGdzdF92NGwyX2dldF9ub3JtICh2NGwyb2JqZWN0LCAmbm9ybSk7CisKKyAgcmV0dXJuIGdzdF92NGwyX3R1bmVyX2dldF9ub3JtX2J5X3N0ZF9pZCAodjRsMm9iamVjdCwgbm9ybSk7Cit9CisKK0dzdFR1bmVyTm9ybSAqCitnc3RfdjRsMl90dW5lcl9nZXRfbm9ybV9ieV9zdGRfaWQgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCB2NGwyX3N0ZF9pZCBub3JtKQoreworICBHTGlzdCAqaXRlbTsKKworICBmb3IgKGl0ZW0gPSB2NGwyb2JqZWN0LT5ub3JtczsgaXRlbSAhPSBOVUxMOyBpdGVtID0gaXRlbS0+bmV4dCkgeworICAgIGlmIChub3JtICYgR1NUX1Y0TDJfVFVORVJfTk9STSAoaXRlbS0+ZGF0YSktPmluZGV4KQorICAgICAgcmV0dXJuIChHc3RUdW5lck5vcm0gKikgaXRlbS0+ZGF0YTsKKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCit2NGwyX3N0ZF9pZAorZ3N0X3Y0bDJfdHVuZXJfZ2V0X3N0ZF9pZF9ieV9ub3JtIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBHc3RUdW5lck5vcm0gKiBub3JtKQoreworICBHTGlzdCAqaXRlbTsKKworICBmb3IgKGl0ZW0gPSB2NGwyb2JqZWN0LT5ub3JtczsgaXRlbSAhPSBOVUxMOyBpdGVtID0gaXRlbS0+bmV4dCkgeworICAgIGlmIChub3JtID09IEdTVF9UVU5FUl9OT1JNIChpdGVtLT5kYXRhKSkKKyAgICAgIHJldHVybiBHU1RfVjRMMl9UVU5FUl9OT1JNIChpdGVtLT5kYXRhKS0+aW5kZXg7CisgIH0KKworICByZXR1cm4gMDsKK30KKwordm9pZAorZ3N0X3Y0bDJfdHVuZXJfc2V0X2ZyZXF1ZW5jeV9hbmRfbm90aWZ5IChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBHc3RUdW5lckNoYW5uZWwgKiBjaGFubmVsLCBndWxvbmcgZnJlcXVlbmN5KQoreworICBpZiAoZ3N0X3Y0bDJfdHVuZXJfc2V0X2ZyZXF1ZW5jeSAodjRsMm9iamVjdCwgY2hhbm5lbCwgZnJlcXVlbmN5KSkgeworI2lmIDAKKyAgICBnX29iamVjdF9ub3RpZnkgKEdfT0JKRUNUICh2NGwyb2JqZWN0LT5lbGVtZW50KSwgImZyZXF1ZW5jeSIpOworI2VuZGlmCisgIH0KK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX3R1bmVyX3NldF9mcmVxdWVuY3kgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIEdzdFR1bmVyQ2hhbm5lbCAqIGNoYW5uZWwsIGd1bG9uZyBmcmVxdWVuY3kpCit7CisgIEdzdFY0bDJUdW5lckNoYW5uZWwgKnY0bDJjaGFubmVsID0gR1NUX1Y0TDJfVFVORVJfQ0hBTk5FTCAoY2hhbm5lbCk7CisgIGdpbnQgY2hhbjsKKworICAvKiBhc3NlcnQgdGhhdCB3ZSdyZSBvcGVuZWQgYW5kIHRoYXQgd2UncmUgdXNpbmcgYSBrbm93biBpdGVtICovCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX1RVTkVSX0NIQU5ORUxfSEFTX0ZMQUcgKGNoYW5uZWwsCisgICAgICAgICAgR1NUX1RVTkVSX0NIQU5ORUxfRlJFUVVFTkNZKSwgRkFMU0UpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZ3N0X3Y0bDJfdHVuZXJfY29udGFpbnNfY2hhbm5lbCAodjRsMm9iamVjdCwKKyAgICAgICAgICB2NGwyY2hhbm5lbCksIEZBTFNFKTsKKworICBpZiAodjRsMm9iamVjdC0+Z2V0X2luX291dF9mdW5jICh2NGwyb2JqZWN0LCAmY2hhbikpIHsKKyAgICBpZiAoY2hhbiA9PSBHU1RfVjRMMl9UVU5FUl9DSEFOTkVMIChjaGFubmVsKS0+aW5kZXggJiYKKyAgICAgICAgR1NUX1RVTkVSX0NIQU5ORUxfSEFTX0ZMQUcgKGNoYW5uZWwsIEdTVF9UVU5FUl9DSEFOTkVMX0ZSRVFVRU5DWSkpIHsKKyAgICAgIGlmIChnc3RfdjRsMl9zZXRfZnJlcXVlbmN5ICh2NGwyb2JqZWN0LCB2NGwyY2hhbm5lbC0+dHVuZXIsIGZyZXF1ZW5jeSkpIHsKKyAgICAgICAgZ3N0X3R1bmVyX2ZyZXF1ZW5jeV9jaGFuZ2VkIChHU1RfVFVORVIgKHY0bDJvYmplY3QtPmVsZW1lbnQpLCBjaGFubmVsLAorICAgICAgICAgICAgZnJlcXVlbmN5KTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitndWxvbmcKK2dzdF92NGwyX3R1bmVyX2dldF9mcmVxdWVuY3kgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIEdzdFR1bmVyQ2hhbm5lbCAqIGNoYW5uZWwpCit7CisgIEdzdFY0bDJUdW5lckNoYW5uZWwgKnY0bDJjaGFubmVsID0gR1NUX1Y0TDJfVFVORVJfQ0hBTk5FTCAoY2hhbm5lbCk7CisgIGdpbnQgY2hhbjsKKyAgZ3Vsb25nIGZyZXF1ZW5jeSA9IDA7CisKKyAgLyogYXNzZXJ0IHRoYXQgd2UncmUgb3BlbmVkIGFuZCB0aGF0IHdlJ3JlIHVzaW5nIGEga25vd24gaXRlbSAqLworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCksIDApOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX1RVTkVSX0NIQU5ORUxfSEFTX0ZMQUcgKGNoYW5uZWwsCisgICAgICAgICAgR1NUX1RVTkVSX0NIQU5ORUxfRlJFUVVFTkNZKSwgMCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChnc3RfdjRsMl90dW5lcl9jb250YWluc19jaGFubmVsICh2NGwyb2JqZWN0LAorICAgICAgICAgIHY0bDJjaGFubmVsKSwgMCk7CisKKyAgaWYgKHY0bDJvYmplY3QtPmdldF9pbl9vdXRfZnVuYyAodjRsMm9iamVjdCwgJmNoYW4pKSB7CisgICAgaWYgKGNoYW4gPT0gR1NUX1Y0TDJfVFVORVJfQ0hBTk5FTCAoY2hhbm5lbCktPmluZGV4ICYmCisgICAgICAgIEdTVF9UVU5FUl9DSEFOTkVMX0hBU19GTEFHIChjaGFubmVsLCBHU1RfVFVORVJfQ0hBTk5FTF9GUkVRVUVOQ1kpKSB7CisgICAgICBnc3RfdjRsMl9nZXRfZnJlcXVlbmN5ICh2NGwyb2JqZWN0LCB2NGwyY2hhbm5lbC0+dHVuZXIsICZmcmVxdWVuY3kpOworICAgIH0KKyAgfQorCisgIHJldHVybiBmcmVxdWVuY3k7Cit9CisKK2dpbnQKK2dzdF92NGwyX3R1bmVyX3NpZ25hbF9zdHJlbmd0aCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgR3N0VHVuZXJDaGFubmVsICogY2hhbm5lbCkKK3sKKyAgR3N0VjRsMlR1bmVyQ2hhbm5lbCAqdjRsMmNoYW5uZWwgPSBHU1RfVjRMMl9UVU5FUl9DSEFOTkVMIChjaGFubmVsKTsKKyAgZ2ludCBjaGFuOworICBndWxvbmcgc2lnbmFsID0gMDsKKworICAvKiBhc3NlcnQgdGhhdCB3ZSdyZSBvcGVuZWQgYW5kIHRoYXQgd2UncmUgdXNpbmcgYSBrbm93biBpdGVtICovCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSwgMCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfVFVORVJfQ0hBTk5FTF9IQVNfRkxBRyAoY2hhbm5lbCwKKyAgICAgICAgICBHU1RfVFVORVJfQ0hBTk5FTF9GUkVRVUVOQ1kpLCAwKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKGdzdF92NGwyX3R1bmVyX2NvbnRhaW5zX2NoYW5uZWwgKHY0bDJvYmplY3QsCisgICAgICAgICAgdjRsMmNoYW5uZWwpLCAwKTsKKworICBpZiAodjRsMm9iamVjdC0+Z2V0X2luX291dF9mdW5jICh2NGwyb2JqZWN0LCAmY2hhbikpIHsKKyAgICBpZiAoY2hhbiA9PSBHU1RfVjRMMl9UVU5FUl9DSEFOTkVMIChjaGFubmVsKS0+aW5kZXggJiYKKyAgICAgICAgR1NUX1RVTkVSX0NIQU5ORUxfSEFTX0ZMQUcgKGNoYW5uZWwsIEdTVF9UVU5FUl9DSEFOTkVMX0ZSRVFVRU5DWSkpIHsKKyAgICAgIGdzdF92NGwyX3NpZ25hbF9zdHJlbmd0aCAodjRsMm9iamVjdCwgdjRsMmNoYW5uZWwtPnR1bmVyLCAmc2lnbmFsKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc2lnbmFsOworfQpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmggYi9zeXMvdjRsMi9nc3R2NGwydHVuZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTA1NjU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMnR1bmVyLmgKQEAgLTAsMCArMSwyMDAgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAgICAgICAgICAgICAgIDIwMDYgRWRnYXJkIExpbWEgPGVkZ2FyZC5saW1hQGdtYWlsLmNvbT4KKyAqCisgKiBnc3R2NGwydHVuZXIuaDogdHVuZXIgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBWNEwyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9WNEwyX1RVTkVSX0hfXworI2RlZmluZSBfX0dTVF9WNEwyX1RVTkVSX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaW5jbHVkZSAidHVuZXIuaCIKKyNpbmNsdWRlICJnc3R2NGwyb2JqZWN0LmgiCisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVFlQRV9WNEwyX1RVTkVSX0NIQU5ORUwgXAorICAoZ3N0X3Y0bDJfdHVuZXJfY2hhbm5lbF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX1Y0TDJfVFVORVJfQ0hBTk5FTChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfVjRMMl9UVU5FUl9DSEFOTkVMLCBcCisgICAgICAgICAgR3N0VjRsMlR1bmVyQ2hhbm5lbCkpCisjZGVmaW5lIEdTVF9WNEwyX1RVTkVSX0NIQU5ORUxfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9WNEwyX1RVTkVSX0NIQU5ORUwsIFwKKyAgICAgICBHc3RWNGwyVHVuZXJDaGFubmVsQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVjRMMl9UVU5FUl9DSEFOTkVMKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9WNEwyX1RVTkVSX0NIQU5ORUwpKQorI2RlZmluZSBHU1RfSVNfVjRMMl9UVU5FUl9DSEFOTkVMX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfVjRMMl9UVU5FUl9DSEFOTkVMKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJUdW5lckNoYW5uZWwgeworICBHc3RUdW5lckNoYW5uZWwgcGFyZW50OworCisgIGd1aW50MzIgICAgICAgICBpbmRleDsKKyAgZ3VpbnQzMiAgICAgICAgIHR1bmVyOworICBndWludDMyICAgICAgICAgYXVkaW87Cit9IEdzdFY0bDJUdW5lckNoYW5uZWw7CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyVHVuZXJDaGFubmVsQ2xhc3MgeworICBHc3RUdW5lckNoYW5uZWxDbGFzcyBwYXJlbnQ7Cit9IEdzdFY0bDJUdW5lckNoYW5uZWxDbGFzczsKKworI2RlZmluZSBHU1RfVFlQRV9WNEwyX1RVTkVSX05PUk0gXAorICAoZ3N0X3Y0bDJfdHVuZXJfbm9ybV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX1Y0TDJfVFVORVJfTk9STShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgR1NUX1RZUEVfVjRMMl9UVU5FUl9OT1JNLCBcCisgICAgICAgICAgR3N0VjRsMlR1bmVyTm9ybSkpCisjZGVmaW5lIEdTVF9WNEwyX1RVTkVSX05PUk1fQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoa2xhc3MpLCBHU1RfVFlQRV9WNEwyX1RVTkVSX05PUk0sIFwKKyAgICAgICBHc3RWNGwyVHVuZXJOb3JtQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVjRMMl9UVU5FUl9OT1JNKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9WNEwyX1RVTkVSX05PUk0pKQorI2RlZmluZSBHU1RfSVNfVjRMMl9UVU5FUl9OT1JNX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfVjRMMl9UVU5FUl9OT1JNKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJUdW5lck5vcm0geworICBHc3RUdW5lck5vcm0gcGFyZW50OworCisgIHY0bDJfc3RkX2lkICBpbmRleDsKK30gR3N0VjRsMlR1bmVyTm9ybTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJUdW5lck5vcm1DbGFzcyB7CisgIEdzdFR1bmVyTm9ybUNsYXNzIHBhcmVudDsKK30gR3N0VjRsMlR1bmVyTm9ybUNsYXNzOworCitHVHlwZSBnc3RfdjRsMl90dW5lcl9jaGFubmVsX2dldF90eXBlICh2b2lkKTsKK0dUeXBlIGdzdF92NGwyX3R1bmVyX25vcm1fZ2V0X3R5cGUgKHZvaWQpOworCisvKiBjaGFubmVscyAqLworY29uc3QgR0xpc3QqICAgICAgZ3N0X3Y0bDJfdHVuZXJfbGlzdF9jaGFubmVscyAgICAgICAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCk7CitHc3RUdW5lckNoYW5uZWwqICBnc3RfdjRsMl90dW5lcl9nZXRfY2hhbm5lbCAgICAgICAgICAgICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KTsKK2dib29sZWFuICAgICAgICAgIGdzdF92NGwyX3R1bmVyX3NldF9jaGFubmVsICAgICAgICAgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWwgKiBjaGFubmVsKTsKKy8qIG5vcm1zICovCitjb25zdCBHTGlzdCogICAgICBnc3RfdjRsMl90dW5lcl9saXN0X25vcm1zICAgICAgICAgICAgICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KTsKK3ZvaWQgICAgICAgICAgICAgIGdzdF92NGwyX3R1bmVyX3NldF9ub3JtX2FuZF9ub3RpZnkgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lck5vcm0gKiBub3JtKTsKK0dzdFR1bmVyTm9ybSogICAgIGdzdF92NGwyX3R1bmVyX2dldF9ub3JtICAgICAgICAgICAgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpOworZ2Jvb2xlYW4gICAgICAgICAgZ3N0X3Y0bDJfdHVuZXJfc2V0X25vcm0gICAgICAgICAgICAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyTm9ybSAqIG5vcm0pOworR3N0VHVuZXJOb3JtKiAgICAgZ3N0X3Y0bDJfdHVuZXJfZ2V0X25vcm1fYnlfc3RkX2lkICAgICAgIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjRsMl9zdGRfaWQgbm9ybSk7Cit2NGwyX3N0ZF9pZCAgICAgICBnc3RfdjRsMl90dW5lcl9nZXRfc3RkX2lkX2J5X25vcm0gICAgICAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lck5vcm0gKiBub3JtKTsKKworLyogZnJlcXVlbmN5ICovCit2b2lkICAgICAgICAgICAgICBnc3RfdjRsMl90dW5lcl9zZXRfZnJlcXVlbmN5X2FuZF9ub3RpZnkgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWwgKiBjaGFubmVsLCAKKwkJCQkJCQkgICBndWxvbmcgZnJlcXVlbmN5KTsKK2dpbnQgICAgICAgICAgICAgIGdzdF92NGwyX3R1bmVyX3NpZ25hbF9zdHJlbmd0aCAgICAgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWwgKiBjaGFubmVsKTsKK2d1bG9uZyAgICAgICAgICAgIGdzdF92NGwyX3R1bmVyX2dldF9mcmVxdWVuY3kgICAgICAgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWwgKiBjaGFubmVsKTsKK2dib29sZWFuICAgICAgICAgIGdzdF92NGwyX3R1bmVyX3NldF9mcmVxdWVuY3kgICAgICAgICAgICAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqIGNoYW5uZWwsIAorCQkJCQkJCSAgIGd1bG9uZyBmcmVxdWVuY3kpOworCisjZGVmaW5lIEdTVF9JTVBMRU1FTlRfVjRMMl9UVU5FUl9NRVRIT0RTKFR5cGUsIGludGVyZmFjZV9hc19mdW5jdGlvbikgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGNvbnN0IEdMaXN0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3R1bmVyX2xpc3RfY2hhbm5lbHMgKEdzdFR1bmVyICogbWl4ZXIpICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUeXBlICp0aGlzID0gKFR5cGUqKSBtaXhlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiBnc3RfdjRsMl90dW5lcl9saXN0X2NoYW5uZWxzICh0aGlzLT52NGwyb2JqZWN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdHVuZXJfc2V0X2NoYW5uZWwgKEdzdFR1bmVyICogbWl4ZXIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VHVuZXJDaGFubmVsICogY2hhbm5lbCkgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVHlwZSAqdGhpcyA9IChUeXBlKikgbWl4ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnc3RfdjRsMl90dW5lcl9zZXRfY2hhbm5lbCAodGhpcy0+djRsMm9iamVjdCwgY2hhbm5lbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBHc3RUdW5lckNoYW5uZWwgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF90dW5lcl9nZXRfY2hhbm5lbCAoR3N0VHVuZXIgKiBtaXhlcikgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVHlwZSAqdGhpcyA9IChUeXBlKikgbWl4ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gZ3N0X3Y0bDJfdHVuZXJfZ2V0X2NoYW5uZWwgKHRoaXMtPnY0bDJvYmplY3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBjb25zdCBHTGlzdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF90dW5lcl9saXN0X25vcm1zIChHc3RUdW5lciAqIG1peGVyKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVHlwZSAqdGhpcyA9IChUeXBlKikgbWl4ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gZ3N0X3Y0bDJfdHVuZXJfbGlzdF9ub3JtcyAodGhpcy0+djRsMm9iamVjdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF90dW5lcl9zZXRfbm9ybV9hbmRfbm90aWZ5IChHc3RUdW5lciAqIG1peGVyLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyTm9ybSAqIG5vcm0pICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUeXBlICp0aGlzID0gKFR5cGUqKSBtaXhlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdzdF92NGwyX3R1bmVyX3NldF9ub3JtX2FuZF9ub3RpZnkgKHRoaXMtPnY0bDJvYmplY3QsIG5vcm0pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIEdzdFR1bmVyTm9ybSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3R1bmVyX2dldF9ub3JtIChHc3RUdW5lciAqIG1peGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUeXBlICp0aGlzID0gKFR5cGUqKSBtaXhlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiBnc3RfdjRsMl90dW5lcl9nZXRfbm9ybSAodGhpcy0+djRsMm9iamVjdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdHVuZXJfc2V0X2ZyZXF1ZW5jeV9hbmRfbm90aWZ5IChHc3RUdW5lciAqIG1peGVyLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqIGNoYW5uZWwsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Vsb25nIGZyZXF1ZW5jeSkgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUeXBlICp0aGlzID0gKFR5cGUqKSBtaXhlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdzdF92NGwyX3R1bmVyX3NldF9mcmVxdWVuY3lfYW5kX25vdGlmeSAodGhpcy0+djRsMm9iamVjdCwgY2hhbm5lbCwgZnJlcXVlbmN5KTsgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgZ3Vsb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdHVuZXJfZ2V0X2ZyZXF1ZW5jeSAoR3N0VHVuZXIgKiBtaXhlciwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWwgKiBjaGFubmVsKSAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVHlwZSAqdGhpcyA9IChUeXBlKikgbWl4ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gZ3N0X3Y0bDJfdHVuZXJfZ2V0X2ZyZXF1ZW5jeSAodGhpcy0+djRsMm9iamVjdCwgY2hhbm5lbCk7ICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGdpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3R1bmVyX3NpZ25hbF9zdHJlbmd0aCAoR3N0VHVuZXIgKiBtaXhlciwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWwgKiBjaGFubmVsKSAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFR5cGUgKnRoaXMgPSAoVHlwZSopIG1peGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIGdzdF92NGwyX3R1bmVyX3NpZ25hbF9zdHJlbmd0aCAodGhpcy0+djRsMm9iamVjdCwgY2hhbm5lbCk7ICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF90dW5lcl9pbnRlcmZhY2VfaW5pdCAoR3N0VHVuZXJJbnRlcmZhY2UgKiBpZmFjZSkgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIGRlZmF1bHQgdmlydHVhbCBmdW5jdGlvbnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWZhY2UtPmxpc3RfY2hhbm5lbHMgPSBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3R1bmVyX2xpc3RfY2hhbm5lbHM7ICAgICAgICAgICAgICAgXAorICBpZmFjZS0+c2V0X2NoYW5uZWwgPSBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3R1bmVyX3NldF9jaGFubmVsOyAgICAgICAgICAgICAgICAgICBcCisgIGlmYWNlLT5nZXRfY2hhbm5lbCA9IGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdHVuZXJfZ2V0X2NoYW5uZWw7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZmFjZS0+bGlzdF9ub3JtcyA9IGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdHVuZXJfbGlzdF9ub3JtczsgICAgICAgICAgICAgICAgICAgICBcCisgIGlmYWNlLT5zZXRfbm9ybSA9IGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdHVuZXJfc2V0X25vcm1fYW5kX25vdGlmeTsgICAgICAgICAgICAgIFwKKyAgaWZhY2UtPmdldF9ub3JtID0gaW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF90dW5lcl9nZXRfbm9ybTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmYWNlLT5zZXRfZnJlcXVlbmN5ID0gaW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF90dW5lcl9zZXRfZnJlcXVlbmN5X2FuZF9ub3RpZnk7ICAgIFwKKyAgaWZhY2UtPmdldF9mcmVxdWVuY3kgPSBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3R1bmVyX2dldF9mcmVxdWVuY3k7ICAgICAgICAgICAgICAgXAorICBpZmFjZS0+c2lnbmFsX3N0cmVuZ3RoID0gaW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF90dW5lcl9zaWduYWxfc3RyZW5ndGg7ICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1Y0TDJfVFVORVJfSF9fICovCmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYyBiL3N5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDY3NzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuYwpAQCAtMCwwICsxLDExNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgQ29sbGFib3JhIEx0ZC4KKyAqICAgICBBdXRob3I6IE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3R2NGwyb2JqZWN0LmgiCisjaW5jbHVkZSAiZ3N0djRsMnZpZGVvZGVjLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF92NGwyX3ZpZGVvX2RlY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfdjRsMl92aWRlb19kZWNfZGVidWcKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ2NoYXIgKmRldmljZTsKKyAgR3N0Q2FwcyAqc2lua19jYXBzOworICBHc3RDYXBzICpzcmNfY2FwczsKKyAgY29uc3QgZ2NoYXIgKmxvbmduYW1lOworICBjb25zdCBnY2hhciAqZGVzY3JpcHRpb247Cit9IEdzdFY0bDJWaWRlb0RlY0NEYXRhOworCitlbnVtCit7CisgIFBST1BfMCwKKyAgVjRMMl9TVERfT0JKRUNUX1BST1BTCit9OworCisjZGVmaW5lIGdzdF92NGwyX3ZpZGVvX2RlY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9BQlNUUkFDVF9UWVBFIChHc3RWNGwyVmlkZW9EZWMsIGdzdF92NGwyX3ZpZGVvX2RlYywKKyAgICBHU1RfVFlQRV9WSURFT19ERUNPREVSKTsKKworc3RhdGljIEdzdEZsb3dSZXR1cm4gZ3N0X3Y0bDJfdmlkZW9fZGVjX2ZpbmlzaCAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2Rlcik7CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl92aWRlb19kZWNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIEdzdFY0bDJWaWRlb0RlYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0RFQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfQ0FQVFVSRV9JT19NT0RFOgorICAgICAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfc2V0X3Byb3BlcnR5X2hlbHBlciAoc2VsZi0+djRsMmNhcHR1cmUsCisgICAgICAgICAgICAgIHByb3BfaWQsIHZhbHVlLCBwc3BlYykpIHsKKyAgICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgICAvKiBCeSBkZWZhdWx0LCBvbmx5IHNldCBvbiBvdXRwdXQgKi8KKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfc2V0X3Byb3BlcnR5X2hlbHBlciAoc2VsZi0+djRsMm91dHB1dCwKKyAgICAgICAgICAgICAgcHJvcF9pZCwgdmFsdWUsIHBzcGVjKSkgeworICAgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZpZGVvX2RlY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VjRsMlZpZGVvRGVjICpzZWxmID0gR1NUX1Y0TDJfVklERU9fREVDIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DQVBUVVJFX0lPX01PREU6CisgICAgICBpZiAoIWdzdF92NGwyX29iamVjdF9nZXRfcHJvcGVydHlfaGVscGVyIChzZWxmLT52NGwyY2FwdHVyZSwKKyAgICAgICAgICAgICAgcHJvcF9pZCwgdmFsdWUsIHBzcGVjKSkgeworICAgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEJ5IGRlZmF1bHQgcmVhZCBmcm9tIG91dHB1dCAqLworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoIWdzdF92NGwyX29iamVjdF9nZXRfcHJvcGVydHlfaGVscGVyIChzZWxmLT52NGwyb3V0cHV0LAorICAgICAgICAgICAgICBwcm9wX2lkLCB2YWx1ZSwgcHNwZWMpKSB7CisgICAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX2RlY19vcGVuIChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyKQoreworICBHc3RWNGwyVmlkZW9EZWMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19ERUMgKGRlY29kZXIpOworICBHc3RDYXBzICpjb2RlY19jYXBzOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJPcGVuaW5nIik7CisKKyAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfb3BlbiAoc2VsZi0+djRsMm91dHB1dCkpCisgICAgZ290byBmYWlsdXJlOworCisgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X29wZW5fc2hhcmVkIChzZWxmLT52NGwyY2FwdHVyZSwgc2VsZi0+djRsMm91dHB1dCkpCisgICAgZ290byBmYWlsdXJlOworCisgIGNvZGVjX2NhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoZGVjb2Rlci0+c2lua3BhZCk7CisgIHNlbGYtPnByb2JlZF9zaW5rY2FwcyA9IGdzdF92NGwyX29iamVjdF9wcm9iZV9jYXBzIChzZWxmLT52NGwyb3V0cHV0LAorICAgICAgY29kZWNfY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjb2RlY19jYXBzKTsKKworICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKHNlbGYtPnByb2JlZF9zaW5rY2FwcykpCisgICAgZ290byBub19lbmNvZGVkX2Zvcm1hdDsKKworICBzZWxmLT5wcm9iZWRfc3JjY2FwcyA9IGdzdF92NGwyX29iamVjdF9wcm9iZV9jYXBzIChzZWxmLT52NGwyY2FwdHVyZSwKKyAgICAgIGdzdF92NGwyX29iamVjdF9nZXRfcmF3X2NhcHMgKCkpOworCisgIGlmIChnc3RfY2Fwc19pc19lbXB0eSAoc2VsZi0+cHJvYmVkX3NyY2NhcHMpKQorICAgIGdvdG8gbm9fcmF3X2Zvcm1hdDsKKworICByZXR1cm4gVFJVRTsKKworbm9fZW5jb2RlZF9mb3JtYXQ6CisgIEdTVF9FTEVNRU5UX0VSUk9SIChzZWxmLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAoXygiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiKSwKKyAgICAgICAgICBzZWxmLT52NGwyb3V0cHV0LT52aWRlb2RldiksIChOVUxMKSk7CisgIGdvdG8gZmFpbHVyZTsKKworCitub19yYXdfZm9ybWF0OgorICBHU1RfRUxFTUVOVF9FUlJPUiAoc2VsZiwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgKF8oIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIpLAorICAgICAgICAgIHNlbGYtPnY0bDJvdXRwdXQtPnZpZGVvZGV2KSwgKE5VTEwpKTsKKyAgZ290byBmYWlsdXJlOworCitmYWlsdXJlOgorICBpZiAoR1NUX1Y0TDJfSVNfT1BFTiAoc2VsZi0+djRsMm91dHB1dCkpCisgICAgZ3N0X3Y0bDJfb2JqZWN0X2Nsb3NlIChzZWxmLT52NGwyb3V0cHV0KTsKKworICBpZiAoR1NUX1Y0TDJfSVNfT1BFTiAoc2VsZi0+djRsMmNhcHR1cmUpKQorICAgIGdzdF92NGwyX29iamVjdF9jbG9zZSAoc2VsZi0+djRsMmNhcHR1cmUpOworCisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzZWxmLT5wcm9iZWRfc3JjY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzZWxmLT5wcm9iZWRfc2lua2NhcHMsIE5VTEwpOworCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl92aWRlb19kZWNfY2xvc2UgKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIpCit7CisgIEdzdFY0bDJWaWRlb0RlYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0RFQyAoZGVjb2Rlcik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkNsb3NpbmciKTsKKworICBnc3RfdjRsMl9vYmplY3RfY2xvc2UgKHNlbGYtPnY0bDJvdXRwdXQpOworICBnc3RfdjRsMl9vYmplY3RfY2xvc2UgKHNlbGYtPnY0bDJjYXB0dXJlKTsKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNlbGYtPnByb2JlZF9zcmNjYXBzLCBOVUxMKTsKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNlbGYtPnByb2JlZF9zaW5rY2FwcywgTlVMTCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZGVjX3N0YXJ0IChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyKQoreworICBHc3RWNGwyVmlkZW9EZWMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19ERUMgKGRlY29kZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJTdGFydGluZyIpOworCisgIGdzdF92NGwyX29iamVjdF91bmxvY2sgKHNlbGYtPnY0bDJvdXRwdXQpOworICBnX2F0b21pY19pbnRfc2V0ICgmc2VsZi0+YWN0aXZlLCBUUlVFKTsKKyAgc2VsZi0+b3V0cHV0X2Zsb3cgPSBHU1RfRkxPV19PSzsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl92aWRlb19kZWNfc3RvcCAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlcikKK3sKKyAgR3N0VjRsMlZpZGVvRGVjICpzZWxmID0gR1NUX1Y0TDJfVklERU9fREVDIChkZWNvZGVyKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiU3RvcHBpbmciKTsKKworICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9jayAoc2VsZi0+djRsMmNhcHR1cmUpOworCisgIC8qIFdhaXQgZm9yIGNhcHR1cmUgdGhyZWFkIHRvIHN0b3AgKi8KKyAgZ3N0X3BhZF9zdG9wX3Rhc2sgKGRlY29kZXItPnNyY3BhZCk7CisKKyAgR1NUX1ZJREVPX0RFQ09ERVJfU1RSRUFNX0xPQ0sgKGRlY29kZXIpOworICBzZWxmLT5vdXRwdXRfZmxvdyA9IEdTVF9GTE9XX09LOworICBHU1RfVklERU9fREVDT0RFUl9TVFJFQU1fVU5MT0NLIChkZWNvZGVyKTsKKworICAvKiBTaG91bGQgaGF2ZSBiZWVuIGZsdXNoZWQgYWxyZWFkeSAqLworICBnX2Fzc2VydCAoZ19hdG9taWNfaW50X2dldCAoJnNlbGYtPmFjdGl2ZSkgPT0gRkFMU0UpOworCisgIGdzdF92NGwyX29iamVjdF9zdG9wIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgZ3N0X3Y0bDJfb2JqZWN0X3N0b3AgKHNlbGYtPnY0bDJjYXB0dXJlKTsKKworICBpZiAoc2VsZi0+aW5wdXRfc3RhdGUpIHsKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKHNlbGYtPmlucHV0X3N0YXRlKTsKKyAgICBzZWxmLT5pbnB1dF9zdGF0ZSA9IE5VTEw7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiU3RvcHBlZCIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX2RlY19zZXRfZm9ybWF0IChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyLAorICAgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqIHN0YXRlKQoreworICBHc3RWNGwyRXJyb3IgZXJyb3IgPSBHU1RfVjRMMl9FUlJPUl9JTklUOworICBnYm9vbGVhbiByZXQgPSBUUlVFOworICBHc3RWNGwyVmlkZW9EZWMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19ERUMgKGRlY29kZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJTZXR0aW5nIGZvcm1hdDogJSIgR1NUX1BUUl9GT1JNQVQsIHN0YXRlLT5jYXBzKTsKKworICBpZiAoc2VsZi0+aW5wdXRfc3RhdGUpIHsKKyAgICBpZiAoZ3N0X3Y0bDJfb2JqZWN0X2NhcHNfZXF1YWwgKHNlbGYtPnY0bDJvdXRwdXQsIHN0YXRlLT5jYXBzKSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkNvbXBhdGlibGUgY2FwcyIpOworICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKHNlbGYtPmlucHV0X3N0YXRlKTsKKyAgICBzZWxmLT5pbnB1dF9zdGF0ZSA9IE5VTEw7CisKKyAgICBnc3RfdjRsMl92aWRlb19kZWNfZmluaXNoIChkZWNvZGVyKTsKKyAgICBnc3RfdjRsMl9vYmplY3Rfc3RvcCAoc2VsZi0+djRsMm91dHB1dCk7CisKKyAgICAvKiBUaGUgcmVuZWdvdGlhdGlvbiBmbG93IGRvbid0IGJsZW5kIHdpdGggdGhlIGJhc2UgY2xhc3MgZmxvdy4gVG8KKyAgICAgKiBwcm9wZXJseSBzdG9wIHRoZSBjYXB0dXJlIHBvb2wgd2UgbmVlZCB0byByZWNsYWltIG91ciBidWZmZXJzLCB3aGljaAorICAgICAqIHdpbGwgaGFwcGVuZCB0aHJvdWdoIHRoZSBhbGxvY2F0aW9uIHF1ZXJ5LiBUaGUgYWxsb2NhdGlvbiBxdWVyeSBpcworICAgICAqIHRyaWdnZXJlZCBieSBnc3RfdmlkZW9fZGVjb2Rlcl9uZWdvdGlhdGUoKSB3aGljaCByZXF1aXJlcyB0aGUgb3V0cHV0CisgICAgICogY2FwcyB0byBiZSBzZXQsIGJ1dCB3ZSBjYW4ndCBrbm93IHRoaXMgaW5mb3JtYXRpb24gYXMgd2UgcmVseSBvbiB0aGUKKyAgICAgKiBkZWNvZGVyLCB3aGljaCByZXF1aXJlcyB0aGUgY2FwdHVyZSBxdWV1ZSB0byBiZSBzdG9wcGVkLgorICAgICAqCisgICAgICogVG8gd29ya2Fyb3VuZCB0aGlzIGlzc3VlLCB3ZSBzaW1wbHkgcnVuIGFuIGFsbG9jYXRpb24gcXVlcnkgd2l0aCB0aGUKKyAgICAgKiBvbGQgbmVnb3RpYXRlZCBjYXBzIGluIG9yZGVyIHRvIGRyYWluL3JlY2xhaW0gb3VyIGJ1ZmZlcnMuIFRoYXQgYnJlYWtzCisgICAgICogdGhlIGNvbXBsZXhpdHkgYW5kIHNob3VsZCBub3QgaGF2ZSBtdWNoIGltcGFjdCBpbiBwZXJmb3JtYW5jZSBzaW5jZSB0aGUKKyAgICAgKiBmb2xsb3dpbmcgYWxsb2NhdGlvbiBxdWVyeSB3aWxsIGhhcHBlbiBvbiBhIGRyYWluZWQgcGlwZWxpbmUgYW5kIHdvbid0CisgICAgICogYmxvY2suICovCisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoZGVjb2Rlci0+c3JjcGFkKTsKKyAgICAgIEdzdFF1ZXJ5ICpxdWVyeSA9IGdzdF9xdWVyeV9uZXdfYWxsb2NhdGlvbiAoY2FwcywgRkFMU0UpOworICAgICAgZ3N0X3BhZF9wZWVyX3F1ZXJ5IChkZWNvZGVyLT5zcmNwYWQsIHF1ZXJ5KTsKKyAgICAgIGdzdF9xdWVyeV91bnJlZiAocXVlcnkpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIH0KKworICAgIGdzdF92NGwyX29iamVjdF9zdG9wIChzZWxmLT52NGwyY2FwdHVyZSk7CisgICAgc2VsZi0+b3V0cHV0X2Zsb3cgPSBHU1RfRkxPV19PSzsKKyAgfQorCisgIHJldCA9IGdzdF92NGwyX29iamVjdF9zZXRfZm9ybWF0IChzZWxmLT52NGwyb3V0cHV0LCBzdGF0ZS0+Y2FwcywgJmVycm9yKTsKKworICBpZiAocmV0KQorICAgIHNlbGYtPmlucHV0X3N0YXRlID0gZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3JlZiAoc3RhdGUpOworICBlbHNlCisgICAgZ3N0X3Y0bDJfZXJyb3IgKHNlbGYsICZlcnJvcik7CisKK2RvbmU6CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZGVjX2ZsdXNoIChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyKQoreworICBHc3RWNGwyVmlkZW9EZWMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19ERUMgKGRlY29kZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJGbHVzaGVkIik7CisKKyAgLyogRW5zdXJlIHRoZSBwcm9jZXNzaW5nIHRocmVhZCBoYXMgc3RvcHBlZCBmb3IgdGhlIHJldmVyc2UgcGxheWJhY2sKKyAgICogZGlzY291bnQgY2FzZSAqLworICBpZiAoZ3N0X3BhZF9nZXRfdGFza19zdGF0ZSAoZGVjb2Rlci0+c3JjcGFkKSA9PSBHU1RfVEFTS19TVEFSVEVEKSB7CisgICAgR1NUX1ZJREVPX0RFQ09ERVJfU1RSRUFNX1VOTE9DSyAoZGVjb2Rlcik7CisKKyAgICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyY2FwdHVyZSk7CisgICAgZ3N0X3BhZF9zdG9wX3Rhc2sgKGRlY29kZXItPnNyY3BhZCk7CisgICAgR1NUX1ZJREVPX0RFQ09ERVJfU1RSRUFNX0xPQ0sgKGRlY29kZXIpOworICB9CisKKyAgc2VsZi0+b3V0cHV0X2Zsb3cgPSBHU1RfRkxPV19PSzsKKworICBpZiAoc2VsZi0+djRsMm91dHB1dC0+cG9vbCkKKyAgICBnc3RfdjRsMl9idWZmZXJfcG9vbF9mbHVzaCAoc2VsZi0+djRsMm91dHB1dC0+cG9vbCk7CisKKyAgaWYgKHNlbGYtPnY0bDJjYXB0dXJlLT5wb29sKQorICAgIGdzdF92NGwyX2J1ZmZlcl9wb29sX2ZsdXNoIChzZWxmLT52NGwyY2FwdHVyZS0+cG9vbCk7CisKKyAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9ja19zdG9wIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9ja19zdG9wIChzZWxmLT52NGwyY2FwdHVyZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZGVjX25lZ290aWF0ZSAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlcikKK3sKKyAgR3N0VjRsMlZpZGVvRGVjICpzZWxmID0gR1NUX1Y0TDJfVklERU9fREVDIChkZWNvZGVyKTsKKworICAvKiBXZSBkb24ndCBhbGxvdyByZW5lZ290aWF0aW9uIHdpdGhvdXQgY2FyZWZ1bGwgZGlzYWJsaW5nIHRoZSBwb29sICovCisgIGlmIChzZWxmLT52NGwyY2FwdHVyZS0+cG9vbCAmJgorICAgICAgZ3N0X2J1ZmZlcl9wb29sX2lzX2FjdGl2ZSAoR1NUX0JVRkZFUl9QT09MIChzZWxmLT52NGwyY2FwdHVyZS0+cG9vbCkpKQorICAgIHJldHVybiBUUlVFOworCisgIHJldHVybiBHU1RfVklERU9fREVDT0RFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+bmVnb3RpYXRlIChkZWNvZGVyKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl9kZWNvZGVyX2NtZCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIGd1aW50IGNtZCwgZ3VpbnQgZmxhZ3MpCit7CisgIHN0cnVjdCB2NGwyX2RlY29kZXJfY21kIGRjbWQgPSB7IDAsIH07CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZWxlbWVudCwKKyAgICAgICJzZW5kaW5nIHY0bDIgZGVjb2RlciBjb21tYW5kICV1IHdpdGggZmxhZ3MgJXUiLCBjbWQsIGZsYWdzKTsKKworICBpZiAoIUdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBkY21kLmNtZCA9IGNtZDsKKyAgZGNtZC5mbGFncyA9IGZsYWdzOworICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfREVDT0RFUl9DTUQsICZkY21kKSA8IDApCisgICAgZ290byBkY21kX2ZhaWxlZDsKKworICByZXR1cm4gVFJVRTsKKworZGNtZF9mYWlsZWQ6CisgIGlmIChlcnJubyA9PSBFTk9UVFkpIHsKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHY0bDJvYmplY3QtPmVsZW1lbnQsCisgICAgICAgICJGYWlsZWQgdG8gc2VuZCBkZWNvZGVyIGNvbW1hbmQgJXUgd2l0aCBmbGFncyAldSBmb3IgJyVzJy4gKCVzKSIsCisgICAgICAgIGNtZCwgZmxhZ3MsIHY0bDJvYmplY3QtPnZpZGVvZGV2LCBnX3N0cmVycm9yIChlcnJubykpOworICB9IGVsc2UgeworICAgIEdTVF9FUlJPUl9PQkpFQ1QgKHY0bDJvYmplY3QtPmVsZW1lbnQsCisgICAgICAgICJGYWlsZWQgdG8gc2VuZCBkZWNvZGVyIGNvbW1hbmQgJXUgd2l0aCBmbGFncyAldSBmb3IgJyVzJy4gKCVzKSIsCisgICAgICAgIGNtZCwgZmxhZ3MsIHY0bDJvYmplY3QtPnZpZGVvZGV2LCBnX3N0cmVycm9yIChlcnJubykpOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF92NGwyX3ZpZGVvX2RlY19maW5pc2ggKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIpCit7CisgIEdzdFY0bDJWaWRlb0RlYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0RFQyAoZGVjb2Rlcik7CisgIEdzdEZsb3dSZXR1cm4gcmV0ID0gR1NUX0ZMT1dfT0s7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworCisgIGlmIChnc3RfcGFkX2dldF90YXNrX3N0YXRlIChkZWNvZGVyLT5zcmNwYWQpICE9IEdTVF9UQVNLX1NUQVJURUQpCisgICAgZ290byBkb25lOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJGaW5pc2hpbmcgZGVjb2RpbmciKTsKKworICBHU1RfVklERU9fREVDT0RFUl9TVFJFQU1fVU5MT0NLIChkZWNvZGVyKTsKKworICBpZiAoZ3N0X3Y0bDJfZGVjb2Rlcl9jbWQgKHNlbGYtPnY0bDJvdXRwdXQsIFY0TDJfREVDX0NNRF9TVE9QLCAwKSkgeworICAgIEdzdFRhc2sgKnRhc2sgPSBkZWNvZGVyLT5zcmNwYWQtPnRhc2s7CisKKyAgICAvKiBJZiB0aGUgZGVjb2RlciBzdG9wIGNvbW1hbmQgc3VjY2VlZGVkLCBqdXN0IHdhaXQgdW50aWwgcHJvY2Vzc2luZyBpcworICAgICAqIGZpbmlzaGVkICovCisgICAgR1NUX09CSkVDVF9MT0NLICh0YXNrKTsKKyAgICB3aGlsZSAoR1NUX1RBU0tfU1RBVEUgKHRhc2spID09IEdTVF9UQVNLX1NUQVJURUQpCisgICAgICBHU1RfVEFTS19XQUlUICh0YXNrKTsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAodGFzayk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRkxVU0hJTkc7CisgIH0gZWxzZSB7CisgICAgLyogb3RoZXJ3aXNlIGtlZXAgcXVldWluZyBlbXB0eSBidWZmZXJzIHVudGlsIHRoZSBwcm9jZXNzaW5nIHRocmVhZCBoYXMKKyAgICAgKiBzdG9wcGVkLCBfcG9vbF9wcm9jZXNzKCkgd2lsbCByZXR1cm4gRkxVU0hJTkcgd2hlbiB0aGF0IGhhcHBlbmVkICovCisgICAgd2hpbGUgKHJldCA9PSBHU1RfRkxPV19PSykgeworICAgICAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgICAgICByZXQgPQorICAgICAgICAgIGdzdF92NGwyX2J1ZmZlcl9wb29sX3Byb2Nlc3MgKEdTVF9WNEwyX0JVRkZFUl9QT09MIChzZWxmLT4KKyAgICAgICAgICAgICAgdjRsMm91dHB1dC0+cG9vbCksICZidWZmZXIpOworICAgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgICB9CisgIH0KKworICAvKiBhbmQgZW5zdXJlIHRoZSBwcm9jZXNzaW5nIHRocmVhZCBoYXMgc3RvcHBlZCBpbiBjYXNlIGFub3RoZXIgZXJyb3IKKyAgICogb2NjdXJlZC4gKi8KKyAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9jayAoc2VsZi0+djRsMmNhcHR1cmUpOworICBnc3RfcGFkX3N0b3BfdGFzayAoZGVjb2Rlci0+c3JjcGFkKTsKKyAgR1NUX1ZJREVPX0RFQ09ERVJfU1RSRUFNX0xPQ0sgKGRlY29kZXIpOworCisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRkxVU0hJTkcpCisgICAgcmV0ID0gc2VsZi0+b3V0cHV0X2Zsb3c7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVjb2RlciwgIkRvbmUgZHJhaW5pbmcgYnVmZmVycyIpOworCisgIC8qIFRPRE8gU2hhbGwgd2UgY2xlYW51cCBhbnkgcmVmZmVkIGZyYW1lIHRvIHdvcmthcm91bmQgYnJva2VuIGRlY29kZXJzID8gKi8KKworZG9uZToKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl92aWRlb19kZWNfZHJhaW4gKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIpCit7CisgIEdzdFY0bDJWaWRlb0RlYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0RFQyAoZGVjb2Rlcik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkRyYWluaW5nLi4uIik7CisgIGdzdF92NGwyX3ZpZGVvX2RlY19maW5pc2ggKGRlY29kZXIpOworICBnc3RfdjRsMl92aWRlb19kZWNfZmx1c2ggKGRlY29kZXIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0VmlkZW9Db2RlY0ZyYW1lICoKK2dzdF92NGwyX3ZpZGVvX2RlY19nZXRfb2xkZXN0X2ZyYW1lIChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyKQoreworICBHc3RWaWRlb0NvZGVjRnJhbWUgKmZyYW1lID0gTlVMTDsKKyAgR0xpc3QgKmZyYW1lcywgKmw7CisgIGdpbnQgY291bnQgPSAwOworCisgIGZyYW1lcyA9IGdzdF92aWRlb19kZWNvZGVyX2dldF9mcmFtZXMgKGRlY29kZXIpOworCisgIGZvciAobCA9IGZyYW1lczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworICAgIEdzdFZpZGVvQ29kZWNGcmFtZSAqZiA9IGwtPmRhdGE7CisKKyAgICBpZiAoIWZyYW1lIHx8IGZyYW1lLT5wdHMgPiBmLT5wdHMpCisgICAgICBmcmFtZSA9IGY7CisKKyAgICBjb3VudCsrOworICB9CisKKyAgaWYgKGZyYW1lKSB7CisgICAgR1NUX0xPR19PQkpFQ1QgKGRlY29kZXIsCisgICAgICAgICJPbGRlc3QgZnJhbWUgaXMgJWQgJSIgR1NUX1RJTUVfRk9STUFUICIgYW5kICVkIGZyYW1lcyBsZWZ0IiwKKyAgICAgICAgZnJhbWUtPnN5c3RlbV9mcmFtZV9udW1iZXIsIEdTVF9USU1FX0FSR1MgKGZyYW1lLT5wdHMpLCBjb3VudCAtIDEpOworICAgIGdzdF92aWRlb19jb2RlY19mcmFtZV9yZWYgKGZyYW1lKTsKKyAgfQorCisgIGdfbGlzdF9mcmVlX2Z1bGwgKGZyYW1lcywgKEdEZXN0cm95Tm90aWZ5KSBnc3RfdmlkZW9fY29kZWNfZnJhbWVfdW5yZWYpOworCisgIHJldHVybiBmcmFtZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZpZGVvX2RlY19sb29wIChHc3RWaWRlb0RlY29kZXIgKiBkZWNvZGVyKQoreworICBHc3RWNGwyVmlkZW9EZWMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19ERUMgKGRlY29kZXIpOworICBHc3RWNGwyQnVmZmVyUG9vbCAqdjRsMl9wb29sID0gR1NUX1Y0TDJfQlVGRkVSX1BPT0wgKHNlbGYtPnY0bDJjYXB0dXJlLT5wb29sKTsKKyAgR3N0QnVmZmVyUG9vbCAqcG9vbDsKKyAgR3N0VmlkZW9Db2RlY0ZyYW1lICpmcmFtZTsKKyAgR3N0QnVmZmVyICpidWZmZXIgPSBOVUxMOworICBHc3RGbG93UmV0dXJuIHJldDsKKworICBHU1RfTE9HX09CSkVDVCAoZGVjb2RlciwgIkFsbG9jYXRlIG91dHB1dCBidWZmZXIiKTsKKworICBzZWxmLT5vdXRwdXRfZmxvdyA9IEdTVF9GTE9XX09LOworICBkbyB7CisgICAgLyogV2UgY2Fubm90IHVzZSB0aGUgYmFzZSBjbGFzcyBhbGxvdGF0ZSBoZWxwZXIgc2luY2UgaXQgdGFraW5nIHRoZSBpbnRlcm5hbAorICAgICAqIHN0cmVhbSBsb2NrLiB3ZSBrbm93IHRoYXQgdGhlIGFjcXVpcmUgbWF5IG5lZWQgdG8gcG9sbCB1bnRpbCBtb3JlIGZyYW1lcworICAgICAqIGNvbWVzIGluIGFuZCBob2xkaW5nIHRoaXMgbG9jayB3b3VsZCBwcmV2ZW50IHRoYXQuCisgICAgICovCisgICAgcG9vbCA9IGdzdF92aWRlb19kZWNvZGVyX2dldF9idWZmZXJfcG9vbCAoZGVjb2Rlcik7CisKKyAgICAvKiBQb29sIG1heSBiZSBOVUxMIGlmIHdlIHN0YXJ0ZWQgZ29pbmcgdG8gUkVBRFkgc3RhdGUgKi8KKyAgICBpZiAocG9vbCA9PSBOVUxMKSB7CisgICAgICByZXQgPSBHU1RfRkxPV19GTFVTSElORzsKKyAgICAgIGdvdG8gYmVhY2g7CisgICAgfQorCisgICAgcmV0ID0gZ3N0X2J1ZmZlcl9wb29sX2FjcXVpcmVfYnVmZmVyIChwb29sLCAmYnVmZmVyLCBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAocG9vbCk7CisKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBiZWFjaDsKKworICAgIEdTVF9MT0dfT0JKRUNUIChkZWNvZGVyLCAiUHJvY2VzcyBvdXRwdXQgYnVmZmVyIik7CisgICAgcmV0ID0gZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcHJvY2VzcyAodjRsMl9wb29sLCAmYnVmZmVyKTsKKworICB9IHdoaWxlIChyZXQgPT0gR1NUX1Y0TDJfRkxPV19DT1JSVVBURURfQlVGRkVSKTsKKworICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgIGdvdG8gYmVhY2g7CisKKyAgZnJhbWUgPSBnc3RfdjRsMl92aWRlb19kZWNfZ2V0X29sZGVzdF9mcmFtZSAoZGVjb2Rlcik7CisKKyAgaWYgKGZyYW1lKSB7CisgICAgZnJhbWUtPm91dHB1dF9idWZmZXIgPSBidWZmZXI7CisgICAgYnVmZmVyID0gTlVMTDsKKyAgICByZXQgPSBnc3RfdmlkZW9fZGVjb2Rlcl9maW5pc2hfZnJhbWUgKGRlY29kZXIsIGZyYW1lKTsKKworICAgIGlmIChyZXQgIT0gR1NUX0ZMT1dfT0spCisgICAgICBnb3RvIGJlYWNoOworICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZGVjb2RlciwgIkRlY29kZXIgaXMgcHJvZHVjaW5nIHRvbyBtYW55IGJ1ZmZlcnMiKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICB9CisKKyAgcmV0dXJuOworCitiZWFjaDoKKyAgR1NUX0RFQlVHX09CSkVDVCAoZGVjb2RlciwgIkxlYXZpbmcgb3V0cHV0IHRocmVhZDogJXMiLAorICAgICAgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJldCkpOworCisgIGdzdF9idWZmZXJfcmVwbGFjZSAoJmJ1ZmZlciwgTlVMTCk7CisgIHNlbGYtPm91dHB1dF9mbG93ID0gcmV0OworICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgZ3N0X3BhZF9wYXVzZV90YXNrIChkZWNvZGVyLT5zcmNwYWQpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX3JlbW92ZV9wYWRkaW5nIChHc3RDYXBzRmVhdHVyZXMgKiBmZWF0dXJlcywKKyAgICBHc3RTdHJ1Y3R1cmUgKiBzdHJ1Y3R1cmUsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0VjRsMlZpZGVvRGVjICpzZWxmID0gR1NUX1Y0TDJfVklERU9fREVDICh1c2VyX2RhdGEpOworICBHc3RWaWRlb0FsaWdubWVudCAqYWxpZ24gPSAmc2VsZi0+djRsMmNhcHR1cmUtPmFsaWduOworICBHc3RWaWRlb0luZm8gKmluZm8gPSAmc2VsZi0+djRsMmNhcHR1cmUtPmluZm87CisgIGludCB3aWR0aCwgaGVpZ2h0OworCisgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzdHJ1Y3R1cmUsICJ3aWR0aCIsICZ3aWR0aCkpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKCFnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImhlaWdodCIsICZoZWlnaHQpKQorICAgIHJldHVybiBUUlVFOworCisgIGlmIChhbGlnbi0+cGFkZGluZ19sZWZ0ICE9IDAgfHwgYWxpZ24tPnBhZGRpbmdfdG9wICE9IDAgfHwKKyAgICAgIGhlaWdodCAhPSBpbmZvLT5oZWlnaHQgKyBhbGlnbi0+cGFkZGluZ19ib3R0b20pCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKGhlaWdodCA9PSBpbmZvLT5oZWlnaHQgKyBhbGlnbi0+cGFkZGluZ19ib3R0b20pIHsKKyAgICAvKiBTb21lIGRyaXZlcnMgbWF5IHJvdW5kIHVwIHdpZHRoIHRvIHRoZSBwYWRkZWQgd2l0aCAqLworICAgIGlmICh3aWR0aCA9PSBpbmZvLT53aWR0aCArIGFsaWduLT5wYWRkaW5nX3JpZ2h0KQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cnVjdHVyZSwKKyAgICAgICAgICAid2lkdGgiLCBHX1RZUEVfSU5ULCB3aWR0aCAtIGFsaWduLT5wYWRkaW5nX3JpZ2h0LAorICAgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBoZWlnaHQgLSBhbGlnbi0+cGFkZGluZ19ib3R0b20sIE5VTEwpOworICAgIC8qIFNvbWUgZHJpdmVycyBtYXkga2VlcCB2aXNpYmxlIHdpZHRoIGFuZCBvbmx5IHJvdW5kIHVwIGJ5dGVzcGVybGluZSAqLworICAgIGVsc2UgaWYgKHdpZHRoID09IGluZm8tPndpZHRoKQorICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHN0cnVjdHVyZSwKKyAgICAgICAgICAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgaGVpZ2h0IC0gYWxpZ24tPnBhZGRpbmdfYm90dG9tLCBOVUxMKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorZ3N0X3Y0bDJfdmlkZW9fZGVjX2hhbmRsZV9mcmFtZSAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlciwKKyAgICBHc3RWaWRlb0NvZGVjRnJhbWUgKiBmcmFtZSkKK3sKKyAgR3N0VjRsMkVycm9yIGVycm9yID0gR1NUX1Y0TDJfRVJST1JfSU5JVDsKKyAgR3N0VjRsMlZpZGVvRGVjICpzZWxmID0gR1NUX1Y0TDJfVklERU9fREVDIChkZWNvZGVyKTsKKyAgR3N0Rmxvd1JldHVybiByZXQgPSBHU1RfRkxPV19PSzsKKyAgZ2Jvb2xlYW4gcHJvY2Vzc2VkID0gRkFMU0U7CisgIEdzdEJ1ZmZlciAqdG1wOworICBHc3RUYXNrU3RhdGUgdGFza19zdGF0ZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiSGFuZGxpbmcgZnJhbWUgJWQiLCBmcmFtZS0+c3lzdGVtX2ZyYW1lX251bWJlcik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFnX2F0b21pY19pbnRfZ2V0ICgmc2VsZi0+YWN0aXZlKSkpCisgICAgZ290byBmbHVzaGluZzsKKworICBpZiAoR19VTkxJS0VMWSAoIUdTVF9WNEwyX0lTX0FDVElWRSAoc2VsZi0+djRsMm91dHB1dCkpKSB7CisgICAgaWYgKCFzZWxmLT5pbnB1dF9zdGF0ZSkKKyAgICAgIGdvdG8gbm90X25lZ290aWF0ZWQ7CisgICAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfc2V0X2Zvcm1hdCAoc2VsZi0+djRsMm91dHB1dCwgc2VsZi0+aW5wdXRfc3RhdGUtPmNhcHMsCisgICAgICAgICAgICAmZXJyb3IpKQorICAgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKyAgfQorCisgIGlmIChHX1VOTElLRUxZICghR1NUX1Y0TDJfSVNfQUNUSVZFIChzZWxmLT52NGwyY2FwdHVyZSkpKSB7CisgICAgR3N0QnVmZmVyUG9vbCAqcG9vbCA9IEdTVF9CVUZGRVJfUE9PTCAoc2VsZi0+djRsMm91dHB1dC0+cG9vbCk7CisgICAgR3N0VmlkZW9JbmZvIGluZm87CisgICAgR3N0VmlkZW9Db2RlY1N0YXRlICpvdXRwdXRfc3RhdGU7CisgICAgR3N0QnVmZmVyICpjb2RlY19kYXRhOworICAgIEdzdENhcHMgKmFjcXVpcmVkX2NhcHMsICphdmFpbGFibGVfY2FwcywgKmNhcHMsICpmaWx0ZXI7CisgICAgR3N0U3RydWN0dXJlICpzdDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJTZW5kaW5nIGhlYWRlciIpOworCisgICAgY29kZWNfZGF0YSA9IHNlbGYtPmlucHV0X3N0YXRlLT5jb2RlY19kYXRhOworCisgICAgLyogV2UgYXJlIHJ1bm5pbmcgaW4gYnl0ZS1zdHJlYW0gbW9kZSwgc28gd2UgZG9uJ3Qga25vdyB0aGUgaGVhZGVycywgYnV0CisgICAgICogd2UgbmVlZCB0byBzZW5kIHNvbWV0aGluZywgb3RoZXJ3aXNlIHRoZSBkZWNvZGVyIHdpbGwgcmVmdXNlIHRvCisgICAgICogaW50aWFsaXplLgorICAgICAqLworICAgIGlmIChjb2RlY19kYXRhKSB7CisgICAgICBnc3RfYnVmZmVyX3JlZiAoY29kZWNfZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvZGVjX2RhdGEgPSBnc3RfYnVmZmVyX3JlZiAoZnJhbWUtPmlucHV0X2J1ZmZlcik7CisgICAgICBwcm9jZXNzZWQgPSBUUlVFOworICAgIH0KKworICAgIC8qIEVuc3VyZSBpbnB1dCBpbnRlcm5hbCBwb29sIGlzIGFjdGl2ZSAqLworICAgIGlmICghZ3N0X2J1ZmZlcl9wb29sX2lzX2FjdGl2ZSAocG9vbCkpIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqY29uZmlnID0gZ3N0X2J1ZmZlcl9wb29sX2dldF9jb25maWcgKHBvb2wpOworICAgICAgZ3N0X2J1ZmZlcl9wb29sX2NvbmZpZ19zZXRfcGFyYW1zIChjb25maWcsIHNlbGYtPmlucHV0X3N0YXRlLT5jYXBzLAorICAgICAgICAgIHNlbGYtPnY0bDJvdXRwdXQtPmluZm8uc2l6ZSwgMiwgMik7CisKKyAgICAgIC8qIFRoZXJlIGlzIG5vIHJlYXNvbiB0byByZWZ1c2UgdGhpcyBjb25maWcgKi8KKyAgICAgIGlmICghZ3N0X2J1ZmZlcl9wb29sX3NldF9jb25maWcgKHBvb2wsIGNvbmZpZykpCisgICAgICAgIGdvdG8gYWN0aXZhdGVfZmFpbGVkOworCisgICAgICBpZiAoIWdzdF9idWZmZXJfcG9vbF9zZXRfYWN0aXZlIChwb29sLCBUUlVFKSkKKyAgICAgICAgZ290byBhY3RpdmF0ZV9mYWlsZWQ7CisgICAgfQorCisgICAgR1NUX1ZJREVPX0RFQ09ERVJfU1RSRUFNX1VOTE9DSyAoZGVjb2Rlcik7CisgICAgcmV0ID0KKyAgICAgICAgZ3N0X3Y0bDJfYnVmZmVyX3Bvb2xfcHJvY2VzcyAoR1NUX1Y0TDJfQlVGRkVSX1BPT0wgKHNlbGYtPgorICAgICAgICAgICAgdjRsMm91dHB1dC0+cG9vbCksICZjb2RlY19kYXRhKTsKKyAgICBHU1RfVklERU9fREVDT0RFUl9TVFJFQU1fTE9DSyAoZGVjb2Rlcik7CisKKyAgICBnc3RfYnVmZmVyX3VucmVmIChjb2RlY19kYXRhKTsKKworICAgIC8qIEZvciBkZWNvZGVycyBHX0ZNVCByZXR1cm5zIGNvZGVkIHNpemUsIEdfU0VMRUNUSU9OIHJldHVybnMgdmlzaWJsZSBzaXplCisgICAgICogaW4gdGhlIGNvbXBvc2UgcmVjdGFuZ2xlLiBnc3RfdjRsMl9vYmplY3RfYWNxdWlyZV9mb3JtYXQoKSBjaGVja3MgYm90aAorICAgICAqIGFuZCByZXR1cm5zIHRoZSB2aXNpYmxlIHNpemUgYXMgd2l0aC9oZWlnaHQgYW5kIHRoZSBjb2RlZCBzaXplIGFzCisgICAgICogcGFkZGluZy4gKi8KKyAgICBpZiAoIWdzdF92NGwyX29iamVjdF9hY3F1aXJlX2Zvcm1hdCAoc2VsZi0+djRsMmNhcHR1cmUsICZpbmZvKSkKKyAgICAgIGdvdG8gbm90X25lZ290aWF0ZWQ7CisKKyAgICAvKiBDcmVhdGUgY2FwcyBmcm9tIHRoZSBhY3F1aXJlZCBmb3JtYXQsIHJlbW92ZSB0aGUgZm9ybWF0IGZpZWxkICovCisgICAgYWNxdWlyZWRfY2FwcyA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZpbmZvKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiQWNxdWlyZWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGFjcXVpcmVkX2NhcHMpOworICAgIHN0ID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoYWNxdWlyZWRfY2FwcywgMCk7CisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHN0LCAiZm9ybWF0Iik7CisKKyAgICAvKiBQcm9iZSBjdXJyZW50bHkgYXZhaWxhYmxlIHBpeGVsIGZvcm1hdHMgKi8KKyAgICBhdmFpbGFibGVfY2FwcyA9IGdzdF92NGwyX29iamVjdF9wcm9iZV9jYXBzIChzZWxmLT52NGwyY2FwdHVyZSwgTlVMTCk7CisgICAgYXZhaWxhYmxlX2NhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChhdmFpbGFibGVfY2Fwcyk7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIkF2YWlsYWJsZSBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgYXZhaWxhYmxlX2NhcHMpOworCisgICAgLyogUmVwbGFjZSBjb2RlZCBzaXplIHdpdGggdmlzaWJsZSBzaXplLCB3ZSB3YW50IHRvIG5lZ290aWF0ZSB2aXNpYmxlIHNpemUKKyAgICAgKiB3aXRoIGRvd25zdHJlYW0sIG5vdCBjb2RlZCBzaXplLiAqLworICAgIGdzdF9jYXBzX21hcF9pbl9wbGFjZSAoYXZhaWxhYmxlX2NhcHMsIGdzdF92NGwyX3ZpZGVvX3JlbW92ZV9wYWRkaW5nLCBzZWxmKTsKKworICAgIGZpbHRlciA9IGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChhdmFpbGFibGVfY2FwcywgYWNxdWlyZWRfY2FwcywKKyAgICAgICAgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiRmlsdGVyZWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGZpbHRlcik7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGFjcXVpcmVkX2NhcHMpOworICAgIGdzdF9jYXBzX3VucmVmIChhdmFpbGFibGVfY2Fwcyk7CisgICAgY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChkZWNvZGVyLT5zcmNwYWQsIGZpbHRlcik7CisgICAgZ3N0X2NhcHNfdW5yZWYgKGZpbHRlcik7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiUG9zc2libGUgZGVjb2RlZCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgICAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChjYXBzKSkgeworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKyAgICB9CisKKyAgICAvKiBGaXhhdGUgcGl4ZWwgZm9ybWF0ICovCisgICAgY2FwcyA9IGdzdF9jYXBzX2ZpeGF0ZSAoY2Fwcyk7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiQ2hvc2VuIGRlY29kZWQgY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgICAgLyogVHJ5IHRvIHNldCBuZWdvdGlhdGVkIGZvcm1hdCwgb24gc3VjY2VzcyByZXBsYWNlIGFjcXVpcmVkIGZvcm1hdCAqLworICAgIGlmIChnc3RfdjRsMl9vYmplY3Rfc2V0X2Zvcm1hdCAoc2VsZi0+djRsMmNhcHR1cmUsIGNhcHMsICZlcnJvcikpCisgICAgICBnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKTsKKyAgICBlbHNlCisgICAgICBnc3RfdjRsMl9jbGVhcl9lcnJvciAoJmVycm9yKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgICBvdXRwdXRfc3RhdGUgPSBnc3RfdmlkZW9fZGVjb2Rlcl9zZXRfb3V0cHV0X3N0YXRlIChkZWNvZGVyLAorICAgICAgICBpbmZvLmZpbmZvLT5mb3JtYXQsIGluZm8ud2lkdGgsIGluZm8uaGVpZ2h0LCBzZWxmLT5pbnB1dF9zdGF0ZSk7CisKKyAgICAvKiBDb3B5IHRoZSByZXN0IG9mIHRoZSBpbmZvcm1hdGlvbiwgdGhlcmUgbWlnaHQgYmUgbW9yZSBpbiB0aGUgZnV0dXJlICovCisgICAgb3V0cHV0X3N0YXRlLT5pbmZvLmludGVybGFjZV9tb2RlID0gaW5mby5pbnRlcmxhY2VfbW9kZTsKKyAgICBnc3RfdmlkZW9fY29kZWNfc3RhdGVfdW5yZWYgKG91dHB1dF9zdGF0ZSk7CisKKyAgICBpZiAoIWdzdF92aWRlb19kZWNvZGVyX25lZ290aWF0ZSAoZGVjb2RlcikpIHsKKyAgICAgIGlmIChHU1RfUEFEX0lTX0ZMVVNISU5HIChkZWNvZGVyLT5zcmNwYWQpKQorICAgICAgICBnb3RvIGZsdXNoaW5nOworICAgICAgZWxzZQorICAgICAgICBnb3RvIG5vdF9uZWdvdGlhdGVkOworICAgIH0KKworICAgIC8qIEVuc3VyZSBvdXIgaW50ZXJuYWwgcG9vbCBpcyBhY3RpdmF0ZWQgKi8KKyAgICBpZiAoIWdzdF9idWZmZXJfcG9vbF9zZXRfYWN0aXZlIChHU1RfQlVGRkVSX1BPT0wgKHNlbGYtPnY0bDJjYXB0dXJlLT5wb29sKSwKKyAgICAgICAgICAgIFRSVUUpKQorICAgICAgZ290byBhY3RpdmF0ZV9mYWlsZWQ7CisgIH0KKworICB0YXNrX3N0YXRlID0gZ3N0X3BhZF9nZXRfdGFza19zdGF0ZSAoR1NUX1ZJREVPX0RFQ09ERVJfU1JDX1BBRCAoc2VsZikpOworICBpZiAodGFza19zdGF0ZSA9PSBHU1RfVEFTS19TVE9QUEVEIHx8IHRhc2tfc3RhdGUgPT0gR1NUX1RBU0tfUEFVU0VEKSB7CisgICAgLyogSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBwcm9jZXNzaW5nIHRocmVhZCBzdG9wcGVkIGR1ZSB0byBhbiBlcnJvciAqLworICAgIGlmIChzZWxmLT5vdXRwdXRfZmxvdyAhPSBHU1RfRkxPV19PSyAmJgorICAgICAgICBzZWxmLT5vdXRwdXRfZmxvdyAhPSBHU1RfRkxPV19GTFVTSElORykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlByb2Nlc3NpbmcgbG9vcCBzdG9wcGVkIHdpdGggZXJyb3IsIGxlYXZpbmciKTsKKyAgICAgIHJldCA9IHNlbGYtPm91dHB1dF9mbG93OworICAgICAgZ290byBkcm9wOworICAgIH0KKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJTdGFydGluZyBkZWNvZGluZyB0aHJlYWQiKTsKKworICAgIC8qIFN0YXJ0IHRoZSBwcm9jZXNzaW5nIHRhc2ssIHdoZW4gaXQgcXVpdHMsIHRoZSB0YXNrIHdpbGwgZGlzYWJsZSBpbnB1dAorICAgICAqIHByb2Nlc3NpbmcgdG8gdW5sb2NrIGlucHV0IGlmIGRyYWluaW5nLCBvciBwcmV2ZW50IHBvdGVudGlhbCBibG9jayAqLworICAgIHNlbGYtPm91dHB1dF9mbG93ID0gR1NUX0ZMT1dfRkxVU0hJTkc7CisgICAgaWYgKCFnc3RfcGFkX3N0YXJ0X3Rhc2sgKGRlY29kZXItPnNyY3BhZCwKKyAgICAgICAgICAgIChHc3RUYXNrRnVuY3Rpb24pIGdzdF92NGwyX3ZpZGVvX2RlY19sb29wLCBzZWxmLCBOVUxMKSkKKyAgICAgIGdvdG8gc3RhcnRfdGFza19mYWlsZWQ7CisgIH0KKworICBpZiAoIXByb2Nlc3NlZCkgeworICAgIEdTVF9WSURFT19ERUNPREVSX1NUUkVBTV9VTkxPQ0sgKGRlY29kZXIpOworICAgIHJldCA9CisgICAgICAgIGdzdF92NGwyX2J1ZmZlcl9wb29sX3Byb2Nlc3MgKEdTVF9WNEwyX0JVRkZFUl9QT09MIChzZWxmLT52NGwyb3V0cHV0LT4KKyAgICAgICAgICAgIHBvb2wpLCAmZnJhbWUtPmlucHV0X2J1ZmZlcik7CisgICAgR1NUX1ZJREVPX0RFQ09ERVJfU1RSRUFNX0xPQ0sgKGRlY29kZXIpOworCisgICAgaWYgKHJldCA9PSBHU1RfRkxPV19GTFVTSElORykgeworICAgICAgaWYgKGdzdF9wYWRfZ2V0X3Rhc2tfc3RhdGUgKEdTVF9WSURFT19ERUNPREVSX1NSQ19QQUQgKHNlbGYpKSAhPQorICAgICAgICAgIEdTVF9UQVNLX1NUQVJURUQpCisgICAgICAgIHJldCA9IHNlbGYtPm91dHB1dF9mbG93OworICAgICAgZ290byBkcm9wOworICAgIH0gZWxzZSBpZiAocmV0ICE9IEdTVF9GTE9XX09LKSB7CisgICAgICBnb3RvIHByb2Nlc3NfZmFpbGVkOworICAgIH0KKyAgfQorCisgIC8qIE5vIG5lZWQgdG8ga2VlcCBpbnB1dCBhcnJvdW5kICovCisgIHRtcCA9IGZyYW1lLT5pbnB1dF9idWZmZXI7CisgIGZyYW1lLT5pbnB1dF9idWZmZXIgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgZ3N0X2J1ZmZlcl9jb3B5X2ludG8gKGZyYW1lLT5pbnB1dF9idWZmZXIsIHRtcCwKKyAgICAgIEdTVF9CVUZGRVJfQ09QWV9GTEFHUyB8IEdTVF9CVUZGRVJfQ09QWV9USU1FU1RBTVBTIHwKKyAgICAgIEdTVF9CVUZGRVJfQ09QWV9NRVRBLCAwLCAwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAodG1wKTsKKworICBnc3RfdmlkZW9fY29kZWNfZnJhbWVfdW5yZWYgKGZyYW1lKTsKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK25vdF9uZWdvdGlhdGVkOgorICB7CisgICAgR1NUX0VSUk9SX09CSkVDVCAoc2VsZiwgIm5vdCBuZWdvdGlhdGVkIik7CisgICAgcmV0ID0gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7CisgICAgZ3N0X3Y0bDJfZXJyb3IgKHNlbGYsICZlcnJvcik7CisgICAgZ290byBkcm9wOworICB9CithY3RpdmF0ZV9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2VsZiwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiRmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeS4iKSksCisgICAgICAgICgiQnVmZmVyIHBvb2wgYWN0aXZhdGlvbiBmYWlsZWQiKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBkcm9wOworICB9CitmbHVzaGluZzoKKyAgeworICAgIHJldCA9IEdTVF9GTE9XX0ZMVVNISU5HOworICAgIGdvdG8gZHJvcDsKKyAgfQorCitzdGFydF90YXNrX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzZWxmLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoXygiRmFpbGVkIHRvIHN0YXJ0IGRlY29kaW5nIHRocmVhZC4iKSksIChOVUxMKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBkcm9wOworICB9Citwcm9jZXNzX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzZWxmLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoXygiRmFpbGVkIHRvIHByb2Nlc3MgZnJhbWUuIikpLAorICAgICAgICAoIk1heWJlIGJlIGR1ZSB0byBub3QgZW5vdWdoIG1lbW9yeSBvciBmYWlsaW5nIGRyaXZlciIpKTsKKyAgICByZXQgPSBHU1RfRkxPV19FUlJPUjsKKyAgICBnb3RvIGRyb3A7CisgIH0KK2Ryb3A6CisgIHsKKyAgICBnc3RfdmlkZW9fZGVjb2Rlcl9kcm9wX2ZyYW1lIChkZWNvZGVyLCBmcmFtZSk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX2RlY19kZWNpZGVfYWxsb2NhdGlvbiAoR3N0VmlkZW9EZWNvZGVyICogZGVjb2RlciwKKyAgICBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RWNGwyVmlkZW9EZWMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19ERUMgKGRlY29kZXIpOworICBHc3RDbG9ja1RpbWUgbGF0ZW5jeTsKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgaWYgKGdzdF92NGwyX29iamVjdF9kZWNpZGVfYWxsb2NhdGlvbiAoc2VsZi0+djRsMmNhcHR1cmUsIHF1ZXJ5KSkKKyAgICByZXQgPSBHU1RfVklERU9fREVDT0RFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZGVjaWRlX2FsbG9jYXRpb24gKGRlY29kZXIsCisgICAgICAgIHF1ZXJ5KTsKKworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHNlbGYtPnY0bDJjYXB0dXJlLT5kdXJhdGlvbikpIHsKKyAgICBsYXRlbmN5ID0gc2VsZi0+djRsMmNhcHR1cmUtPm1pbl9idWZmZXJzICogc2VsZi0+djRsMmNhcHR1cmUtPmR1cmF0aW9uOworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJTZXR0aW5nIGxhdGVuY3k6ICUiIEdTVF9USU1FX0ZPUk1BVCAiICglIgorICAgICAgICBHX0dVSU5UMzJfRk9STUFUICIgKiAlIiBHX0dVSU5UNjRfRk9STUFULCBHU1RfVElNRV9BUkdTIChsYXRlbmN5KSwKKyAgICAgICAgc2VsZi0+djRsMmNhcHR1cmUtPm1pbl9idWZmZXJzLCBzZWxmLT52NGwyY2FwdHVyZS0+ZHVyYXRpb24pOworICAgIGdzdF92aWRlb19kZWNvZGVyX3NldF9sYXRlbmN5IChkZWNvZGVyLCBsYXRlbmN5LCBsYXRlbmN5KTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHNlbGYsICJEdXJhdGlvbiBpbnZhbGlkLCBub3Qgc2V0dGluZyBsYXRlbmN5Iik7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX2RlY19zcmNfcXVlcnkgKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIEdzdFY0bDJWaWRlb0RlYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0RFQyAoZGVjb2Rlcik7CisKKyAgc3dpdGNoIChHU1RfUVVFUllfVFlQRSAocXVlcnkpKSB7CisgICAgY2FzZSBHU1RfUVVFUllfQ0FQUzp7CisgICAgICBHc3RDYXBzICpmaWx0ZXIsICpyZXN1bHQgPSBOVUxMOworICAgICAgR3N0UGFkICpwYWQgPSBHU1RfVklERU9fREVDT0RFUl9TUkNfUEFEIChkZWNvZGVyKTsKKworICAgICAgZ3N0X3F1ZXJ5X3BhcnNlX2NhcHMgKHF1ZXJ5LCAmZmlsdGVyKTsKKworICAgICAgaWYgKHNlbGYtPnByb2JlZF9zcmNjYXBzKQorICAgICAgICByZXN1bHQgPSBnc3RfY2Fwc19yZWYgKHNlbGYtPnByb2JlZF9zcmNjYXBzKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHBhZCk7CisKKyAgICAgIGlmIChmaWx0ZXIpIHsKKyAgICAgICAgR3N0Q2FwcyAqdG1wID0gcmVzdWx0OworICAgICAgICByZXN1bHQgPQorICAgICAgICAgICAgZ3N0X2NhcHNfaW50ZXJzZWN0X2Z1bGwgKGZpbHRlciwgdG1wLCBHU1RfQ0FQU19JTlRFUlNFQ1RfRklSU1QpOworICAgICAgICBnc3RfY2Fwc191bnJlZiAodG1wKTsKKyAgICAgIH0KKworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlJldHVybmluZyBzcmMgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgcmVzdWx0KTsKKworICAgICAgZ3N0X3F1ZXJ5X3NldF9jYXBzX3Jlc3VsdCAocXVlcnksIHJlc3VsdCk7CisgICAgICBnc3RfY2Fwc191bnJlZiAocmVzdWx0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBHU1RfVklERU9fREVDT0RFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+c3JjX3F1ZXJ5IChkZWNvZGVyLCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF92NGwyX3ZpZGVvX2RlY19zaW5rX2dldGNhcHMgKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdFY0bDJWaWRlb0RlYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0RFQyAoZGVjb2Rlcik7CisgIEdzdENhcHMgKnJlc3VsdDsKKworICByZXN1bHQgPSBnc3RfdmlkZW9fZGVjb2Rlcl9wcm94eV9nZXRjYXBzIChkZWNvZGVyLCBzZWxmLT5wcm9iZWRfc2lua2NhcHMsCisgICAgICBmaWx0ZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJSZXR1cm5pbmcgc2luayBjYXBzICUiIEdTVF9QVFJfRk9STUFULCByZXN1bHQpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZGVjX3NpbmtfZXZlbnQgKEdzdFZpZGVvRGVjb2RlciAqIGRlY29kZXIsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFY0bDJWaWRlb0RlYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0RFQyAoZGVjb2Rlcik7CisgIGdib29sZWFuIHJldDsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVEFSVDoKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJmbHVzaCBzdGFydCIpOworICAgICAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9jayAoc2VsZi0+djRsMm91dHB1dCk7CisgICAgICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyY2FwdHVyZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfVklERU9fREVDT0RFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAoZGVjb2RlciwgZXZlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUQVJUOgorICAgICAgLyogVGhlIHByb2Nlc3NpbmcgdGhyZWFkIHNob3VsZCBzdG9wIG5vdywgd2FpdCBmb3IgaXQgKi8KKyAgICAgIGdzdF9wYWRfc3RvcF90YXNrIChkZWNvZGVyLT5zcmNwYWQpOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgImZsdXNoIHN0YXJ0IGRvbmUiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3Y0bDJfdmlkZW9fZGVjX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0VjRsMlZpZGVvRGVjICpzZWxmID0gR1NUX1Y0TDJfVklERU9fREVDIChlbGVtZW50KTsKKyAgR3N0VmlkZW9EZWNvZGVyICpkZWNvZGVyID0gR1NUX1ZJREVPX0RFQ09ERVIgKGVsZW1lbnQpOworCisgIGlmICh0cmFuc2l0aW9uID09IEdTVF9TVEFURV9DSEFOR0VfUEFVU0VEX1RPX1JFQURZKSB7CisgICAgZ19hdG9taWNfaW50X3NldCAoJnNlbGYtPmFjdGl2ZSwgRkFMU0UpOworICAgIGdzdF92NGwyX29iamVjdF91bmxvY2sgKHNlbGYtPnY0bDJvdXRwdXQpOworICAgIGdzdF92NGwyX29iamVjdF91bmxvY2sgKHNlbGYtPnY0bDJjYXB0dXJlKTsKKyAgICBnc3RfcGFkX3N0b3BfdGFzayAoZGVjb2Rlci0+c3JjcGFkKTsKKyAgfQorCisgIHJldHVybiBHU1RfRUxFTUVOVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+Y2hhbmdlX3N0YXRlIChlbGVtZW50LCB0cmFuc2l0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZpZGVvX2RlY19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RWNGwyVmlkZW9EZWMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19ERUMgKG9iamVjdCk7CisKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNlbGYtPnByb2JlZF9zaW5rY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzZWxmLT5wcm9iZWRfc3JjY2FwcywgTlVMTCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl92aWRlb19kZWNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFY0bDJWaWRlb0RlYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0RFQyAob2JqZWN0KTsKKworICBnc3RfdjRsMl9vYmplY3RfZGVzdHJveSAoc2VsZi0+djRsMmNhcHR1cmUpOworICBnc3RfdjRsMl9vYmplY3RfZGVzdHJveSAoc2VsZi0+djRsMm91dHB1dCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdmlkZW9fZGVjX2luaXQgKEdzdFY0bDJWaWRlb0RlYyAqIHNlbGYpCit7CisgIC8qIFY0TDIgb2JqZWN0IGFyZSBjcmVhdGVkIGluIHN1Ymluc3RhbmNlX2luaXQgKi8KK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZpZGVvX2RlY19zdWJpbnN0YW5jZV9pbml0IChHVHlwZUluc3RhbmNlICogaW5zdGFuY2UsIGdwb2ludGVyIGdfY2xhc3MpCit7CisgIEdzdFY0bDJWaWRlb0RlY0NsYXNzICprbGFzcyA9IEdTVF9WNEwyX1ZJREVPX0RFQ19DTEFTUyAoZ19jbGFzcyk7CisgIEdzdFY0bDJWaWRlb0RlYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0RFQyAoaW5zdGFuY2UpOworICBHc3RWaWRlb0RlY29kZXIgKmRlY29kZXIgPSBHU1RfVklERU9fREVDT0RFUiAoaW5zdGFuY2UpOworCisgIGdzdF92aWRlb19kZWNvZGVyX3NldF9wYWNrZXRpemVkIChkZWNvZGVyLCBUUlVFKTsKKworICBzZWxmLT52NGwyb3V0cHV0ID0gZ3N0X3Y0bDJfb2JqZWN0X25ldyAoR1NUX0VMRU1FTlQgKHNlbGYpLAorICAgICAgR1NUX09CSkVDVCAoR1NUX1ZJREVPX0RFQ09ERVJfU0lOS19QQUQgKHNlbGYpKSwKKyAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVULCBrbGFzcy0+ZGVmYXVsdF9kZXZpY2UsCisgICAgICBnc3RfdjRsMl9nZXRfb3V0cHV0LCBnc3RfdjRsMl9zZXRfb3V0cHV0LCBOVUxMKTsKKyAgc2VsZi0+djRsMm91dHB1dC0+bm9faW5pdGlhbF9mb3JtYXQgPSBUUlVFOworICBzZWxmLT52NGwyb3V0cHV0LT5rZWVwX2FzcGVjdCA9IEZBTFNFOworCisgIHNlbGYtPnY0bDJjYXB0dXJlID0gZ3N0X3Y0bDJfb2JqZWN0X25ldyAoR1NUX0VMRU1FTlQgKHNlbGYpLAorICAgICAgR1NUX09CSkVDVCAoR1NUX1ZJREVPX0RFQ09ERVJfU1JDX1BBRCAoc2VsZikpLAorICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLCBrbGFzcy0+ZGVmYXVsdF9kZXZpY2UsCisgICAgICBnc3RfdjRsMl9nZXRfaW5wdXQsIGdzdF92NGwyX3NldF9pbnB1dCwgTlVMTCk7CisgIHNlbGYtPnY0bDJjYXB0dXJlLT5ub19pbml0aWFsX2Zvcm1hdCA9IFRSVUU7CisgIHNlbGYtPnY0bDJvdXRwdXQtPmtlZXBfYXNwZWN0ID0gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl92aWRlb19kZWNfY2xhc3NfaW5pdCAoR3N0VjRsMlZpZGVvRGVjQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdFZpZGVvRGVjb2RlckNsYXNzICp2aWRlb19kZWNvZGVyX2NsYXNzOworCisgIHBhcmVudF9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoa2xhc3MpOworCisgIGVsZW1lbnRfY2xhc3MgPSAoR3N0RWxlbWVudENsYXNzICopIGtsYXNzOworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgdmlkZW9fZGVjb2Rlcl9jbGFzcyA9IChHc3RWaWRlb0RlY29kZXJDbGFzcyAqKSBrbGFzczsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3Y0bDJfdmlkZW9fZGVjX2RlYnVnLCAidjRsMnZpZGVvZGVjIiwgMCwKKyAgICAgICJWNEwyIFZpZGVvIERlY29kZXIiKTsKKworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2RlY19kaXNwb3NlKTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZGVjX2ZpbmFsaXplKTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19kZWNfc2V0X3Byb3BlcnR5KTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19kZWNfZ2V0X3Byb3BlcnR5KTsKKworICB2aWRlb19kZWNvZGVyX2NsYXNzLT5vcGVuID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2RlY19vcGVuKTsKKyAgdmlkZW9fZGVjb2Rlcl9jbGFzcy0+Y2xvc2UgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZGVjX2Nsb3NlKTsKKyAgdmlkZW9fZGVjb2Rlcl9jbGFzcy0+c3RhcnQgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZGVjX3N0YXJ0KTsKKyAgdmlkZW9fZGVjb2Rlcl9jbGFzcy0+c3RvcCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19kZWNfc3RvcCk7CisgIHZpZGVvX2RlY29kZXJfY2xhc3MtPmZpbmlzaCA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19kZWNfZmluaXNoKTsKKyAgdmlkZW9fZGVjb2Rlcl9jbGFzcy0+Zmx1c2ggPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZGVjX2ZsdXNoKTsKKyAgdmlkZW9fZGVjb2Rlcl9jbGFzcy0+ZHJhaW4gPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZGVjX2RyYWluKTsKKyAgdmlkZW9fZGVjb2Rlcl9jbGFzcy0+c2V0X2Zvcm1hdCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZGVjX3NldF9mb3JtYXQpOworICB2aWRlb19kZWNvZGVyX2NsYXNzLT5uZWdvdGlhdGUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2RlY19uZWdvdGlhdGUpOworICB2aWRlb19kZWNvZGVyX2NsYXNzLT5kZWNpZGVfYWxsb2NhdGlvbiA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZGVjX2RlY2lkZV9hbGxvY2F0aW9uKTsKKyAgLyogRklYTUUgcHJvcG9zZV9hbGxvY2F0aW9uIG9yIG5vdCA/ICovCisgIHZpZGVvX2RlY29kZXJfY2xhc3MtPmhhbmRsZV9mcmFtZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZGVjX2hhbmRsZV9mcmFtZSk7CisgIHZpZGVvX2RlY29kZXJfY2xhc3MtPmdldGNhcHMgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2RlY19zaW5rX2dldGNhcHMpOworICB2aWRlb19kZWNvZGVyX2NsYXNzLT5zcmNfcXVlcnkgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2RlY19zcmNfcXVlcnkpOworICB2aWRlb19kZWNvZGVyX2NsYXNzLT5zaW5rX2V2ZW50ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19kZWNfc2lua19ldmVudCk7CisKKyAgZWxlbWVudF9jbGFzcy0+Y2hhbmdlX3N0YXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19kZWNfY2hhbmdlX3N0YXRlKTsKKworICBnc3RfdjRsMl9vYmplY3RfaW5zdGFsbF9tMm1fcHJvcGVydGllc19oZWxwZXIgKGdvYmplY3RfY2xhc3MpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdmlkZW9fZGVjX3N1YmNsYXNzX2luaXQgKGdwb2ludGVyIGdfY2xhc3MsIGdwb2ludGVyIGRhdGEpCit7CisgIEdzdFY0bDJWaWRlb0RlY0NsYXNzICprbGFzcyA9IEdTVF9WNEwyX1ZJREVPX0RFQ19DTEFTUyAoZ19jbGFzcyk7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTIChnX2NsYXNzKTsKKyAgR3N0VjRsMlZpZGVvRGVjQ0RhdGEgKmNkYXRhID0gZGF0YTsKKworICBrbGFzcy0+ZGVmYXVsdF9kZXZpY2UgPSBjZGF0YS0+ZGV2aWNlOworCisgIC8qIE5vdGU6IGdzdF9wYWRfdGVtcGxhdGVfbmV3KCkgdGFrZSB0aGUgZmxvYXRpbmcgcmVmIGZyb20gdGhlIGNhcHMgKi8KKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgIGdzdF9wYWRfdGVtcGxhdGVfbmV3ICgic2luayIsIEdTVF9QQURfU0lOSywgR1NUX1BBRF9BTFdBWVMsCisgICAgICAgICAgY2RhdGEtPnNpbmtfY2FwcykpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfcGFkX3RlbXBsYXRlIChlbGVtZW50X2NsYXNzLAorICAgICAgZ3N0X3BhZF90ZW1wbGF0ZV9uZXcgKCJzcmMiLCBHU1RfUEFEX1NSQywgR1NUX1BBRF9BTFdBWVMsCisgICAgICAgICAgY2RhdGEtPnNyY19jYXBzKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgY2RhdGEtPmxvbmduYW1lLAorICAgICAgIkNvZGVjL0RlY29kZXIvVmlkZW8iLCBjZGF0YS0+ZGVzY3JpcHRpb24sCisgICAgICAiTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPiIpOworCisgIGdzdF9jYXBzX3VucmVmIChjZGF0YS0+c2lua19jYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNkYXRhLT5zcmNfY2Fwcyk7CisgIGdfZnJlZSAoY2RhdGEpOworfQorCisvKiBQcm9iaW5nIGZ1bmN0aW9ucyAqLworZ2Jvb2xlYW4KK2dzdF92NGwyX2lzX3ZpZGVvX2RlYyAoR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKQoreworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBpZiAoZ3N0X2NhcHNfaXNfc3Vic2V0IChzaW5rX2NhcHMsIGdzdF92NGwyX29iamVjdF9nZXRfY29kZWNfY2FwcyAoKSkKKyAgICAgICYmIGdzdF9jYXBzX2lzX3N1YnNldCAoc3JjX2NhcHMsIGdzdF92NGwyX29iamVjdF9nZXRfcmF3X2NhcHMgKCkpKQorICAgIHJldCA9IFRSVUU7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGdjaGFyICoKK2dzdF92NGwyX3ZpZGVvX2RlY19zZXRfbWV0YWRhdGEgKEdzdFN0cnVjdHVyZSAqIHMsIEdzdFY0bDJWaWRlb0RlY0NEYXRhICogY2RhdGEsCisgICAgY29uc3QgZ2NoYXIgKiBiYXNlbmFtZSkKK3sKKyAgZ2NoYXIgKmNvZGVjX25hbWUgPSBOVUxMOworICBnY2hhciAqdHlwZV9uYW1lID0gTlVMTDsKKworI2RlZmluZSBTRVRfTUVUQShjb2RlYykgXAorR19TVE1UX1NUQVJUIHsgXAorICBjZGF0YS0+bG9uZ25hbWUgPSAiVjRMMiAiIGNvZGVjICIgRGVjb2RlciI7IFwKKyAgY2RhdGEtPmRlc2NyaXB0aW9uID0gIkRlY29kZXMgIiBjb2RlYyAiIHN0cmVhbXMgdmlhIFY0TDIgQVBJIjsgXAorICBjb2RlY19uYW1lID0gZ19hc2NpaV9zdHJkb3duIChjb2RlYywgLTEpOyBcCit9IEdfU1RNVF9FTkQKKworICBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgImltYWdlL2pwZWciKSkgeworICAgIFNFVF9NRVRBICgiSlBFRyIpOworICB9IGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJ2aWRlby9tcGVnIikpIHsKKyAgICBnaW50IG1wZWd2ZXJzaW9uID0gMDsKKyAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJtcGVndmVyc2lvbiIsICZtcGVndmVyc2lvbik7CisKKyAgICBpZiAobXBlZ3ZlcnNpb24gPT0gMikgeworICAgICAgU0VUX01FVEEgKCJNUEVHMiIpOworICAgIH0gZWxzZSB7CisgICAgICBTRVRfTUVUQSAoIk1QRUc0Iik7CisgICAgfQorICB9IGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJ2aWRlby94LWgyNjMiKSkgeworICAgIFNFVF9NRVRBICgiSDI2MyIpOworICB9IGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJ2aWRlby94LWgyNjQiKSkgeworICAgIFNFVF9NRVRBICgiSDI2NCIpOworICB9IGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJ2aWRlby94LXdtdiIpKSB7CisgICAgU0VUX01FVEEgKCJWQzEiKTsKKyAgfSBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAidmlkZW8veC12cDgiKSkgeworICAgIFNFVF9NRVRBICgiVlA4Iik7CisgIH0gZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgInZpZGVvL3gtdnA5IikpIHsKKyAgICBTRVRfTUVUQSAoIlZQOSIpOworICB9IGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJ2aWRlby94LWJheWVyIikpIHsKKyAgICBTRVRfTUVUQSAoIkJBWUVSIik7CisgIH0gZWxzZSBpZiAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgInZpZGVvL3gtc29uaXgiKSkgeworICAgIFNFVF9NRVRBICgiU09OSVgiKTsKKyAgfSBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAidmlkZW8veC1wd2MxIikpIHsKKyAgICBTRVRfTUVUQSAoIlBXQzEiKTsKKyAgfSBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAidmlkZW8veC1wd2MyIikpIHsKKyAgICBTRVRfTUVUQSAoIlBXQzIiKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBUaGlzIGNvZGUgc2hvdWxkIGJlIGtlcHQgb24gc3luYyB3aXRoIHRoZSBleHBvc2VkIENPREVDIHR5cGUgb2YgZm9ybWF0CisgICAgICogZnJvbSBnc3R2NGwyb2JqZWN0LmMuIFRoaXMgd2FybmluZyB3aWxsIG9ubHkgb2NjdXJlIGluIGNhc2Ugd2UgZm9yZ2V0CisgICAgICogdG8gYWxzbyBhZGQgYSBmb3JtYXQgaGVyZS4gKi8KKyAgICBnY2hhciAqc19zdHIgPSBnc3Rfc3RydWN0dXJlX3RvX3N0cmluZyAocyk7CisgICAgZ193YXJuaW5nICgiTWlzc2luZyBmaXhlZCBuYW1lIG1hcHBpbmcgZm9yIGNhcHMgJyVzJywgdGhpcyBpcyBhIEdTdHJlYW1lciAiCisgICAgICAgICJidWcsIHBsZWFzZSByZXBvcnQgYXQgaHR0cHM6Ly9idWdzLmdub21lLm9yZyIsIHNfc3RyKTsKKyAgICBnX2ZyZWUgKHNfc3RyKTsKKyAgfQorCisgIGlmIChjb2RlY19uYW1lKSB7CisgICAgdHlwZV9uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgidjRsMiVzZGVjIiwgY29kZWNfbmFtZSk7CisgICAgaWYgKGdfdHlwZV9mcm9tX25hbWUgKHR5cGVfbmFtZSkgIT0gMCkgeworICAgICAgZ19mcmVlICh0eXBlX25hbWUpOworICAgICAgdHlwZV9uYW1lID0gZ19zdHJkdXBfcHJpbnRmICgidjRsMiVzJXNkZWMiLCBiYXNlbmFtZSwgY29kZWNfbmFtZSk7CisgICAgfQorCisgICAgZ19mcmVlIChjb2RlY19uYW1lKTsKKyAgfQorCisgIHJldHVybiB0eXBlX25hbWU7CisjdW5kZWYgU0VUX01FVEEKK30KKwordm9pZAorZ3N0X3Y0bDJfdmlkZW9fZGVjX3JlZ2lzdGVyIChHc3RQbHVnaW4gKiBwbHVnaW4sIGNvbnN0IGdjaGFyICogYmFzZW5hbWUsCisgICAgY29uc3QgZ2NoYXIgKiBkZXZpY2VfcGF0aCwgR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKQoreworICBnaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGdzdF9jYXBzX2dldF9zaXplIChzaW5rX2NhcHMpOyBpKyspIHsKKyAgICBHc3RWNGwyVmlkZW9EZWNDRGF0YSAqY2RhdGE7CisgICAgR3N0U3RydWN0dXJlICpzOworICAgIEdUeXBlUXVlcnkgdHlwZV9xdWVyeTsKKyAgICBHVHlwZUluZm8gdHlwZV9pbmZvID0geyAwLCB9OworICAgIEdUeXBlIHR5cGUsIHN1YnR5cGU7CisgICAgZ2NoYXIgKnR5cGVfbmFtZTsKKworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChzaW5rX2NhcHMsIGkpOworCisgICAgY2RhdGEgPSBnX25ldzAgKEdzdFY0bDJWaWRlb0RlY0NEYXRhLCAxKTsKKyAgICBjZGF0YS0+ZGV2aWNlID0gZ19zdHJkdXAgKGRldmljZV9wYXRoKTsKKyAgICBjZGF0YS0+c2lua19jYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKGNkYXRhLT5zaW5rX2NhcHMsIGdzdF9zdHJ1Y3R1cmVfY29weSAocykpOworICAgIGNkYXRhLT5zcmNfY2FwcyA9IGdzdF9jYXBzX3JlZiAoc3JjX2NhcHMpOworICAgIHR5cGVfbmFtZSA9IGdzdF92NGwyX3ZpZGVvX2RlY19zZXRfbWV0YWRhdGEgKHMsIGNkYXRhLCBiYXNlbmFtZSk7CisKKyAgICAvKiBTa2lwIG92ZXIgaWYgd2UgaGl0IGFuIHVubWFwcGVkIHR5cGUgKi8KKyAgICBpZiAoIXR5cGVfbmFtZSkgeworICAgICAgZ19mcmVlIChjZGF0YSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICB0eXBlID0gZ3N0X3Y0bDJfdmlkZW9fZGVjX2dldF90eXBlICgpOworICAgIGdfdHlwZV9xdWVyeSAodHlwZSwgJnR5cGVfcXVlcnkpOworICAgIG1lbXNldCAoJnR5cGVfaW5mbywgMCwgc2l6ZW9mICh0eXBlX2luZm8pKTsKKyAgICB0eXBlX2luZm8uY2xhc3Nfc2l6ZSA9IHR5cGVfcXVlcnkuY2xhc3Nfc2l6ZTsKKyAgICB0eXBlX2luZm8uaW5zdGFuY2Vfc2l6ZSA9IHR5cGVfcXVlcnkuaW5zdGFuY2Vfc2l6ZTsKKyAgICB0eXBlX2luZm8uY2xhc3NfaW5pdCA9IGdzdF92NGwyX3ZpZGVvX2RlY19zdWJjbGFzc19pbml0OworICAgIHR5cGVfaW5mby5jbGFzc19kYXRhID0gY2RhdGE7CisgICAgdHlwZV9pbmZvLmluc3RhbmNlX2luaXQgPSBnc3RfdjRsMl92aWRlb19kZWNfc3ViaW5zdGFuY2VfaW5pdDsKKworICAgIHN1YnR5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljICh0eXBlLCB0eXBlX25hbWUsICZ0eXBlX2luZm8sIDApOworICAgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgdHlwZV9uYW1lLCBHU1RfUkFOS19QUklNQVJZICsgMSwKKyAgICAgICAgICAgIHN1YnR5cGUpKQorICAgICAgR1NUX1dBUk5JTkcgKCJGYWlsZWQgdG8gcmVnaXN0ZXIgcGx1Z2luICclcyciLCB0eXBlX25hbWUpOworCisgICAgZ19mcmVlICh0eXBlX25hbWUpOworICB9Cit9CmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuaCBiL3N5cy92NGwyL2dzdHY0bDJ2aWRlb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOTdkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwydmlkZW9kZWMuaApAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IENvbGxhYm9yYSBMdGQuCisgKiAgICAgQXV0aG9yOiBOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1ZnJlc25lQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0dTVF9WNEwyX1ZJREVPX0RFQ19IX18KKyNkZWZpbmUgX19HU1RfVjRMMl9WSURFT19ERUNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZGVjb2Rlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb21ldGEuaD4KKworI2luY2x1ZGUgPGdzdHY0bDJvYmplY3QuaD4KKyNpbmNsdWRlIDxnc3R2NGwyYnVmZmVycG9vbC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfVjRMMl9WSURFT19ERUMgXAorICAoZ3N0X3Y0bDJfdmlkZW9fZGVjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WNEwyX1ZJREVPX0RFQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1Y0TDJfVklERU9fREVDLEdzdFY0bDJWaWRlb0RlYykpCisjZGVmaW5lIEdTVF9WNEwyX1ZJREVPX0RFQ19DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9WNEwyX1ZJREVPX0RFQyxHc3RWNGwyVmlkZW9EZWNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19WNEwyX1ZJREVPX0RFQyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX1Y0TDJfVklERU9fREVDKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfVklERU9fREVDX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9WNEwyX1ZJREVPX0RFQykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyVmlkZW9EZWMgR3N0VjRsMlZpZGVvRGVjOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJWaWRlb0RlY0NsYXNzIEdzdFY0bDJWaWRlb0RlY0NsYXNzOworCitzdHJ1Y3QgX0dzdFY0bDJWaWRlb0RlYworeworICBHc3RWaWRlb0RlY29kZXIgcGFyZW50OworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIEdzdFY0bDJPYmplY3QgKiB2NGwyb3V0cHV0OworICBHc3RWNGwyT2JqZWN0ICogdjRsMmNhcHR1cmU7CisKKyAgLyogcGFkcyAqLworICBHc3RDYXBzICpwcm9iZWRfc3JjY2FwczsKKyAgR3N0Q2FwcyAqcHJvYmVkX3NpbmtjYXBzOworCisgIC8qIFN0YXRlICovCisgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqaW5wdXRfc3RhdGU7CisgIGdib29sZWFuIGFjdGl2ZTsKKyAgR3N0Rmxvd1JldHVybiBvdXRwdXRfZmxvdzsKK307CisKK3N0cnVjdCBfR3N0VjRsMlZpZGVvRGVjQ2xhc3MKK3sKKyAgR3N0VmlkZW9EZWNvZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworCisgIGdjaGFyICpkZWZhdWx0X2RldmljZTsKK307CisKK0dUeXBlIGdzdF92NGwyX3ZpZGVvX2RlY19nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIGdzdF92NGwyX2lzX3ZpZGVvX2RlYyAgICAgICAoR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKTsKK3ZvaWQgICAgIGdzdF92NGwyX3ZpZGVvX2RlY19yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqYmFzZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpkZXZpY2VfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1Y0TDJfVklERU9fREVDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZW5jLmMgYi9zeXMvdjRsMi9nc3R2NGwydmlkZW9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzY1YTI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMnZpZGVvZW5jLmMKQEAgLTAsMCArMSwxMTg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTcgU1VNT01PIENvbXB1dGVyIEFzc29jaWF0aW9uCisgKiAgICAgQXV0aG9ycyBBeWFrYSA8YXlha2FAc291bGlrLmluZm8+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQ29sbGFib3JhIEx0ZC4KKyAqICAgICBBdXRob3I6IE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3R2NGwyb2JqZWN0LmgiCisjaW5jbHVkZSAiZ3N0djRsMnZpZGVvZW5jLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKGdzdF92NGwyX3ZpZGVvX2VuY19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfdjRsMl92aWRlb19lbmNfZGVidWcKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ2NoYXIgKmRldmljZTsKKyAgR3N0Q2FwcyAqc2lua19jYXBzOworICBHc3RDYXBzICpzcmNfY2FwczsKK30gR3N0VjRsMlZpZGVvRW5jQ0RhdGE7CisKK2VudW0KK3sKKyAgUFJPUF8wLAorICBWNEwyX1NURF9PQkpFQ1RfUFJPUFMsCit9OworCisjZGVmaW5lIGdzdF92NGwyX3ZpZGVvX2VuY19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9BQlNUUkFDVF9UWVBFIChHc3RWNGwyVmlkZW9FbmMsIGdzdF92NGwyX3ZpZGVvX2VuYywKKyAgICBHU1RfVFlQRV9WSURFT19FTkNPREVSKTsKKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZpZGVvX2VuY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsCisgICAgZ3VpbnQgcHJvcF9pZCwgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0VjRsMlZpZGVvRW5jICpzZWxmID0gR1NUX1Y0TDJfVklERU9fRU5DIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcF9pZCkgeworICAgIGNhc2UgUFJPUF9DQVBUVVJFX0lPX01PREU6CisgICAgICBpZiAoIWdzdF92NGwyX29iamVjdF9zZXRfcHJvcGVydHlfaGVscGVyIChzZWxmLT52NGwyY2FwdHVyZSwKKyAgICAgICAgICAgICAgcHJvcF9pZCwgdmFsdWUsIHBzcGVjKSkgeworICAgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEJ5IGRlZmF1bHQsIG9ubHkgc2V0IG9uIG91dHB1dCAqLworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoIWdzdF92NGwyX29iamVjdF9zZXRfcHJvcGVydHlfaGVscGVyIChzZWxmLT52NGwyb3V0cHV0LAorICAgICAgICAgICAgICBwcm9wX2lkLCB2YWx1ZSwgcHNwZWMpKSB7CisgICAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdmlkZW9fZW5jX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKQoreworICBHc3RWNGwyVmlkZW9FbmMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19FTkMgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgY2FzZSBQUk9QX0NBUFRVUkVfSU9fTU9ERToKKyAgICAgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X2dldF9wcm9wZXJ0eV9oZWxwZXIgKHNlbGYtPnY0bDJjYXB0dXJlLAorICAgICAgICAgICAgICBwcm9wX2lkLCB2YWx1ZSwgcHNwZWMpKSB7CisgICAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgICAgLyogQnkgZGVmYXVsdCByZWFkIGZyb20gb3V0cHV0ICovCisgICAgZGVmYXVsdDoKKyAgICAgIGlmICghZ3N0X3Y0bDJfb2JqZWN0X2dldF9wcm9wZXJ0eV9oZWxwZXIgKHNlbGYtPnY0bDJvdXRwdXQsCisgICAgICAgICAgICAgIHByb3BfaWQsIHZhbHVlLCBwc3BlYykpIHsKKyAgICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZW5jX29wZW4gKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIpCit7CisgIEdzdFY0bDJWaWRlb0VuYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0VOQyAoZW5jb2Rlcik7CisgIEdzdENhcHMgKmNvZGVjX2NhcHM7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIk9wZW5pbmciKTsKKworICBpZiAoIWdzdF92NGwyX29iamVjdF9vcGVuIChzZWxmLT52NGwyb3V0cHV0KSkKKyAgICBnb3RvIGZhaWx1cmU7CisKKyAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfb3Blbl9zaGFyZWQgKHNlbGYtPnY0bDJjYXB0dXJlLCBzZWxmLT52NGwyb3V0cHV0KSkKKyAgICBnb3RvIGZhaWx1cmU7CisKKyAgc2VsZi0+cHJvYmVkX3NpbmtjYXBzID0gZ3N0X3Y0bDJfb2JqZWN0X3Byb2JlX2NhcHMgKHNlbGYtPnY0bDJvdXRwdXQsCisgICAgICBnc3RfdjRsMl9vYmplY3RfZ2V0X3Jhd19jYXBzICgpKTsKKworICBpZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKHNlbGYtPnByb2JlZF9zaW5rY2FwcykpCisgICAgZ290byBub19yYXdfZm9ybWF0OworCisgIGNvZGVjX2NhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoZW5jb2Rlci0+c3JjcGFkKTsKKyAgc2VsZi0+cHJvYmVkX3NyY2NhcHMgPSBnc3RfdjRsMl9vYmplY3RfcHJvYmVfY2FwcyAoc2VsZi0+djRsMmNhcHR1cmUsCisgICAgICBjb2RlY19jYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNvZGVjX2NhcHMpOworCisgIGlmIChnc3RfY2Fwc19pc19lbXB0eSAoc2VsZi0+cHJvYmVkX3NyY2NhcHMpKQorICAgIGdvdG8gbm9fZW5jb2RlZF9mb3JtYXQ7CisKKyAgcmV0dXJuIFRSVUU7CisKK25vX2VuY29kZWRfZm9ybWF0OgorICBHU1RfRUxFTUVOVF9FUlJPUiAoc2VsZiwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgKF8oIkVuY29kZXIgb24gZGV2aWNlICVzIGhhcyBubyBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIpLAorICAgICAgICAgIHNlbGYtPnY0bDJvdXRwdXQtPnZpZGVvZGV2KSwgKE5VTEwpKTsKKyAgZ290byBmYWlsdXJlOworCisKK25vX3Jhd19mb3JtYXQ6CisgIEdTVF9FTEVNRU5UX0VSUk9SIChzZWxmLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAoXygiRW5jb2RlciBvbiBkZXZpY2UgJXMgaGFzIG5vIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQiKSwKKyAgICAgICAgICBzZWxmLT52NGwyb3V0cHV0LT52aWRlb2RldiksIChOVUxMKSk7CisgIGdvdG8gZmFpbHVyZTsKKworZmFpbHVyZToKKyAgaWYgKEdTVF9WNEwyX0lTX09QRU4gKHNlbGYtPnY0bDJvdXRwdXQpKQorICAgIGdzdF92NGwyX29iamVjdF9jbG9zZSAoc2VsZi0+djRsMm91dHB1dCk7CisKKyAgaWYgKEdTVF9WNEwyX0lTX09QRU4gKHNlbGYtPnY0bDJjYXB0dXJlKSkKKyAgICBnc3RfdjRsMl9vYmplY3RfY2xvc2UgKHNlbGYtPnY0bDJjYXB0dXJlKTsKKworICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+cHJvYmVkX3NyY2NhcHMsIE5VTEwpOworICBnc3RfY2Fwc19yZXBsYWNlICgmc2VsZi0+cHJvYmVkX3NpbmtjYXBzLCBOVUxMKTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZW5jX2Nsb3NlIChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyKQoreworICBHc3RWNGwyVmlkZW9FbmMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19FTkMgKGVuY29kZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJDbG9zaW5nIik7CisKKyAgZ3N0X3Y0bDJfb2JqZWN0X2Nsb3NlIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgZ3N0X3Y0bDJfb2JqZWN0X2Nsb3NlIChzZWxmLT52NGwyY2FwdHVyZSk7CisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzZWxmLT5wcm9iZWRfc3JjY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzZWxmLT5wcm9iZWRfc2lua2NhcHMsIE5VTEwpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX2VuY19zdGFydCAoR3N0VmlkZW9FbmNvZGVyICogZW5jb2RlcikKK3sKKyAgR3N0VjRsMlZpZGVvRW5jICpzZWxmID0gR1NUX1Y0TDJfVklERU9fRU5DIChlbmNvZGVyKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiU3RhcnRpbmciKTsKKworICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgZ19hdG9taWNfaW50X3NldCAoJnNlbGYtPmFjdGl2ZSwgVFJVRSk7CisgIHNlbGYtPm91dHB1dF9mbG93ID0gR1NUX0ZMT1dfT0s7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZW5jX3N0b3AgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIpCit7CisgIEdzdFY0bDJWaWRlb0VuYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0VOQyAoZW5jb2Rlcik7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlN0b3BwaW5nIik7CisKKyAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9jayAoc2VsZi0+djRsMm91dHB1dCk7CisgIGdzdF92NGwyX29iamVjdF91bmxvY2sgKHNlbGYtPnY0bDJjYXB0dXJlKTsKKworICAvKiBXYWl0IGZvciBjYXB0dXJlIHRocmVhZCB0byBzdG9wICovCisgIGdzdF9wYWRfc3RvcF90YXNrIChlbmNvZGVyLT5zcmNwYWQpOworCisgIEdTVF9WSURFT19FTkNPREVSX1NUUkVBTV9MT0NLIChlbmNvZGVyKTsKKyAgc2VsZi0+b3V0cHV0X2Zsb3cgPSBHU1RfRkxPV19PSzsKKyAgR1NUX1ZJREVPX0VOQ09ERVJfU1RSRUFNX1VOTE9DSyAoZW5jb2Rlcik7CisKKyAgLyogU2hvdWxkIGhhdmUgYmVlbiBmbHVzaGVkIGFscmVhZHkgKi8KKyAgZ19hc3NlcnQgKGdfYXRvbWljX2ludF9nZXQgKCZzZWxmLT5hY3RpdmUpID09IEZBTFNFKTsKKyAgZ19hc3NlcnQgKGdfYXRvbWljX2ludF9nZXQgKCZzZWxmLT5wcm9jZXNzaW5nKSA9PSBGQUxTRSk7CisKKyAgZ3N0X3Y0bDJfb2JqZWN0X3N0b3AgKHNlbGYtPnY0bDJvdXRwdXQpOworICBnc3RfdjRsMl9vYmplY3Rfc3RvcCAoc2VsZi0+djRsMmNhcHR1cmUpOworCisgIGlmIChzZWxmLT5pbnB1dF9zdGF0ZSkgeworICAgIGdzdF92aWRlb19jb2RlY19zdGF0ZV91bnJlZiAoc2VsZi0+aW5wdXRfc3RhdGUpOworICAgIHNlbGYtPmlucHV0X3N0YXRlID0gTlVMTDsKKyAgfQorCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJTdG9wcGVkIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfZW5jb2Rlcl9jbWQgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBndWludCBjbWQsIGd1aW50IGZsYWdzKQoreworICBzdHJ1Y3QgdjRsMl9lbmNvZGVyX2NtZCBlY21kID0geyAwLCB9OworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmVsZW1lbnQsCisgICAgICAic2VuZGluZyB2NGwyIGVuY29kZXIgY29tbWFuZCAldSB3aXRoIGZsYWdzICV1IiwgY21kLCBmbGFncyk7CisKKyAgaWYgKCFHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZWNtZC5jbWQgPSBjbWQ7CisgIGVjbWQuZmxhZ3MgPSBmbGFnczsKKyAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX0VOQ09ERVJfQ01ELCAmZWNtZCkgPCAwKQorICAgIGdvdG8gZWNtZF9mYWlsZWQ7CisKKyAgcmV0dXJuIFRSVUU7CisKK2VjbWRfZmFpbGVkOgorICBpZiAoZXJybm8gPT0gRU5PVFRZKSB7CisgICAgR1NUX0lORk9fT0JKRUNUICh2NGwyb2JqZWN0LT5lbGVtZW50LAorICAgICAgICAiRmFpbGVkIHRvIHNlbmQgZW5jb2RlciBjb21tYW5kICV1IHdpdGggZmxhZ3MgJXUgZm9yICclcycuICglcykiLAorICAgICAgICBjbWQsIGZsYWdzLCB2NGwyb2JqZWN0LT52aWRlb2RldiwgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgfSBlbHNlIHsKKyAgICBHU1RfRVJST1JfT0JKRUNUICh2NGwyb2JqZWN0LT5lbGVtZW50LAorICAgICAgICAiRmFpbGVkIHRvIHNlbmQgZW5jb2RlciBjb21tYW5kICV1IHdpdGggZmxhZ3MgJXUgZm9yICclcycuICglcykiLAorICAgICAgICBjbWQsIGZsYWdzLCB2NGwyb2JqZWN0LT52aWRlb2RldiwgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdjRsMl92aWRlb19lbmNfZmluaXNoIChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyKQoreworICBHc3RWNGwyVmlkZW9FbmMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19FTkMgKGVuY29kZXIpOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworCisgIGlmIChnc3RfcGFkX2dldF90YXNrX3N0YXRlIChlbmNvZGVyLT5zcmNwYWQpICE9IEdTVF9UQVNLX1NUQVJURUQpCisgICAgZ290byBkb25lOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJGaW5pc2hpbmcgZW5jb2RpbmciKTsKKworICAvKiBkcm9wIHRoZSBzdHJlYW0gbG9jayB3aGlsZSBkcmFpbmluZywgc28gcmVtYWluaW5nIGJ1ZmZlcnMgY2FuIGJlCisgICAqIHB1c2hlZCBmcm9tIHRoZSBzcmMgcGFkIHRhc2sgdGhyZWFkICovCisgIEdTVF9WSURFT19FTkNPREVSX1NUUkVBTV9VTkxPQ0sgKGVuY29kZXIpOworCisgIGlmIChnc3RfdjRsMl9lbmNvZGVyX2NtZCAoc2VsZi0+djRsMmNhcHR1cmUsIFY0TDJfRU5DX0NNRF9TVE9QLCAwKSkgeworICAgIEdzdFRhc2sgKnRhc2sgPSBlbmNvZGVyLT5zcmNwYWQtPnRhc2s7CisKKyAgICAvKiBXYWl0IGZvciB0aGUgdGFzayB0byBiZSBkcmFpbmVkICovCisgICAgR1NUX09CSkVDVF9MT0NLICh0YXNrKTsKKyAgICB3aGlsZSAoR1NUX1RBU0tfU1RBVEUgKHRhc2spID09IEdTVF9UQVNLX1NUQVJURUQpCisgICAgICBHU1RfVEFTS19XQUlUICh0YXNrKTsKKyAgICBHU1RfT0JKRUNUX1VOTE9DSyAodGFzayk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRkxVU0hJTkc7CisgIH0KKworICAvKiBhbmQgZW5zdXJlIHRoZSBwcm9jZXNzaW5nIHRocmVhZCBoYXMgc3RvcHBlZCBpbiBjYXNlIGFub3RoZXIgZXJyb3IKKyAgICogb2NjdXJlZC4gKi8KKyAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9jayAoc2VsZi0+djRsMmNhcHR1cmUpOworICBnc3RfcGFkX3N0b3BfdGFzayAoZW5jb2Rlci0+c3JjcGFkKTsKKyAgR1NUX1ZJREVPX0VOQ09ERVJfU1RSRUFNX0xPQ0sgKGVuY29kZXIpOworCisgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRkxVU0hJTkcpCisgICAgcmV0ID0gc2VsZi0+b3V0cHV0X2Zsb3c7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZW5jb2RlciwgIkRvbmUgZHJhaW5pbmcgYnVmZmVycyIpOworCitkb25lOgorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX2VuY19zZXRfZm9ybWF0IChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyLAorICAgIEdzdFZpZGVvQ29kZWNTdGF0ZSAqIHN0YXRlKQoreworICBnYm9vbGVhbiByZXQgPSBUUlVFOworICBHc3RWNGwyVmlkZW9FbmMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19FTkMgKGVuY29kZXIpOworICBHc3RWNGwyRXJyb3IgZXJyb3IgPSBHU1RfVjRMMl9FUlJPUl9JTklUOworICBHc3RDYXBzICpvdXRjYXBzOworICBHc3RWaWRlb0NvZGVjU3RhdGUgKm91dHB1dDsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiU2V0dGluZyBmb3JtYXQ6ICUiIEdTVF9QVFJfRk9STUFULCBzdGF0ZS0+Y2Fwcyk7CisKKyAgaWYgKHNlbGYtPmlucHV0X3N0YXRlKSB7CisgICAgaWYgKGdzdF92NGwyX29iamVjdF9jYXBzX2VxdWFsIChzZWxmLT52NGwyb3V0cHV0LCBzdGF0ZS0+Y2FwcykpIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJDb21wYXRpYmxlIGNhcHMiKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIGlmIChnc3RfdjRsMl92aWRlb19lbmNfZmluaXNoIChlbmNvZGVyKSAhPSBHU1RfRkxPV19PSykKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGdzdF92NGwyX29iamVjdF9zdG9wIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgICBnc3RfdjRsMl9vYmplY3Rfc3RvcCAoc2VsZi0+djRsMmNhcHR1cmUpOworCisgICAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChzZWxmLT5pbnB1dF9zdGF0ZSk7CisgICAgc2VsZi0+aW5wdXRfc3RhdGUgPSBOVUxMOworICB9CisKKyAgb3V0Y2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChlbmNvZGVyLT5zcmNwYWQpOworICBvdXRjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAob3V0Y2Fwcyk7CisgIG91dHB1dCA9IGdzdF92aWRlb19lbmNvZGVyX3NldF9vdXRwdXRfc3RhdGUgKGVuY29kZXIsIG91dGNhcHMsIHN0YXRlKTsKKyAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChvdXRwdXQpOworCisgIGlmICghZ3N0X3ZpZGVvX2VuY29kZXJfbmVnb3RpYXRlIChlbmNvZGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKCFnc3RfdjRsMl9vYmplY3Rfc2V0X2Zvcm1hdCAoc2VsZi0+djRsMm91dHB1dCwgc3RhdGUtPmNhcHMsICZlcnJvcikpIHsKKyAgICBnc3RfdjRsMl9lcnJvciAoc2VsZiwgJmVycm9yKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBhY3RpdmF0aW5nIGEgY2FwdHVyZSBwb29sIHdpbGwgYWxzbyBjYWxsIFNUUkVBTU9OLiBDT0RBIGRyaXZlciB3aWxsCisgICAqIHJlZnVzZSB0byBjb25maWd1cmUgdGhlIG91dHB1dCBpZiB0aGUgY2FwdHVyZSBpcyBzdHJlbWFpbmcuICovCisgIGlmICghZ3N0X2J1ZmZlcl9wb29sX3NldF9hY3RpdmUgKEdTVF9CVUZGRVJfUE9PTCAoc2VsZi0+djRsMmNhcHR1cmUtPnBvb2wpLAorICAgICAgICAgIFRSVUUpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiQ291bGQgbm90IGFjdGl2YXRlIGNhcHR1cmUgYnVmZmVyIHBvb2wuIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgc2VsZi0+aW5wdXRfc3RhdGUgPSBnc3RfdmlkZW9fY29kZWNfc3RhdGVfcmVmIChzdGF0ZSk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIm91dHB1dCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgc3RhdGUtPmNhcHMpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZW5jX2ZsdXNoIChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyKQoreworICBHc3RWNGwyVmlkZW9FbmMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19FTkMgKGVuY29kZXIpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJGbHVzaGluZyIpOworCisgIC8qIEVuc3VyZSB0aGUgcHJvY2Vzc2luZyB0aHJlYWQgaGFzIHN0b3BwZWQgZm9yIHRoZSByZXZlcnNlIHBsYXliYWNrCisgICAqIGlzY291bnQgY2FzZSAqLworICBpZiAoZ19hdG9taWNfaW50X2dldCAoJnNlbGYtPnByb2Nlc3NpbmcpKSB7CisgICAgR1NUX1ZJREVPX0VOQ09ERVJfU1RSRUFNX1VOTE9DSyAoZW5jb2Rlcik7CisKKyAgICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrX3N0b3AgKHNlbGYtPnY0bDJvdXRwdXQpOworICAgIGdzdF92NGwyX29iamVjdF91bmxvY2tfc3RvcCAoc2VsZi0+djRsMmNhcHR1cmUpOworICAgIGdzdF9wYWRfc3RvcF90YXNrIChlbmNvZGVyLT5zcmNwYWQpOworCisgICAgR1NUX1ZJREVPX0VOQ09ERVJfU1RSRUFNX1VOTE9DSyAoZW5jb2Rlcik7CisKKyAgfQorCisgIHNlbGYtPm91dHB1dF9mbG93ID0gR1NUX0ZMT1dfT0s7CisKKyAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9ja19zdG9wIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9ja19zdG9wIChzZWxmLT52NGwyY2FwdHVyZSk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0cnVjdCBQcm9maWxlTGV2ZWxDdHgKK3sKKyAgR3N0VjRsMlZpZGVvRW5jICpzZWxmOworICBjb25zdCBnY2hhciAqcHJvZmlsZTsKKyAgY29uc3QgZ2NoYXIgKmxldmVsOworfTsKKworc3RhdGljIGdib29sZWFuCitnZXRfc3RyaW5nX2xpc3QgKEdzdFN0cnVjdHVyZSAqIHMsIGNvbnN0IGdjaGFyICogZmllbGQsIEdRdWV1ZSAqIHF1ZXVlKQoreworICBjb25zdCBHVmFsdWUgKnZhbHVlOworCisgIHZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsIGZpZWxkKTsKKworICBpZiAoIXZhbHVlKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoR1NUX1ZBTFVFX0hPTERTX0xJU1QgKHZhbHVlKSkgeworICAgIGd1aW50IGk7CisKKyAgICBpZiAoZ3N0X3ZhbHVlX2xpc3RfZ2V0X3NpemUgKHZhbHVlKSA9PSAwKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgZm9yIChpID0gMDsgaSA8IGdzdF92YWx1ZV9saXN0X2dldF9zaXplICh2YWx1ZSk7IGkrKykgeworICAgICAgY29uc3QgR1ZhbHVlICppdGVtID0gZ3N0X3ZhbHVlX2xpc3RfZ2V0X3ZhbHVlICh2YWx1ZSwgaSk7CisKKyAgICAgIGlmIChHX1ZBTFVFX0hPTERTX1NUUklORyAoaXRlbSkpCisgICAgICAgIGdfcXVldWVfcHVzaF90YWlsIChxdWV1ZSwgZ192YWx1ZV9kdXBfc3RyaW5nIChpdGVtKSk7CisgICAgfQorICB9IGVsc2UgaWYgKEdfVkFMVUVfSE9MRFNfU1RSSU5HICh2YWx1ZSkpIHsKKyAgICBnX3F1ZXVlX3B1c2hfdGFpbCAocXVldWUsIGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK25lZ290aWF0ZV9wcm9maWxlX2FuZF9sZXZlbCAoR3N0Q2Fwc0ZlYXR1cmVzICogZmVhdHVyZXMsIEdzdFN0cnVjdHVyZSAqIHMsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBzdHJ1Y3QgUHJvZmlsZUxldmVsQ3R4ICpjdHggPSB1c2VyX2RhdGE7CisgIEdzdFY0bDJWaWRlb0VuY0NsYXNzICprbGFzcyA9IEdTVF9WNEwyX1ZJREVPX0VOQ19HRVRfQ0xBU1MgKGN0eC0+c2VsZik7CisgIEdzdFY0bDJPYmplY3QgKnY0bDJvYmplY3QgPSBHU1RfVjRMMl9WSURFT19FTkMgKGN0eC0+c2VsZiktPnY0bDJvdXRwdXQ7CisgIEdRdWV1ZSBwcm9maWxlcyA9IEdfUVVFVUVfSU5JVDsKKyAgR1F1ZXVlIGxldmVscyA9IEdfUVVFVUVfSU5JVDsKKyAgZ2Jvb2xlYW4gZmFpbGVkID0gRkFMU0U7CisKKyAgaWYgKGtsYXNzLT5wcm9maWxlX2NpZCAmJiBnZXRfc3RyaW5nX2xpc3QgKHMsICJwcm9maWxlIiwgJnByb2ZpbGVzKSkgeworICAgIEdMaXN0ICpsOworCisgICAgZm9yIChsID0gcHJvZmlsZXMuaGVhZDsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbCA9IHsgMCwgfTsKKyAgICAgIGdpbnQgdjRsMl9wcm9maWxlOworICAgICAgY29uc3QgZ2NoYXIgKnByb2ZpbGUgPSBsLT5kYXRhOworCisgICAgICBHU1RfVFJBQ0VfT0JKRUNUIChjdHgtPnNlbGYsICJUcnlpbmcgcHJvZmlsZSAlcyIsIHByb2ZpbGUpOworCisgICAgICBjb250cm9sLmlkID0ga2xhc3MtPnByb2ZpbGVfY2lkOworICAgICAgY29udHJvbC52YWx1ZSA9IHY0bDJfcHJvZmlsZSA9IGtsYXNzLT5wcm9maWxlX2Zyb21fc3RyaW5nIChwcm9maWxlKTsKKworICAgICAgaWYgKGNvbnRyb2wudmFsdWUgPCAwKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpIDwgMCkgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGN0eC0+c2VsZiwgIkZhaWxlZCB0byBzZXQgJXMgcHJvZmlsZTogJyVzJyIsCisgICAgICAgICAgICBrbGFzcy0+Y29kZWNfbmFtZSwgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHByb2ZpbGUgPSBrbGFzcy0+cHJvZmlsZV90b19zdHJpbmcgKGNvbnRyb2wudmFsdWUpOworCisgICAgICBpZiAoY29udHJvbC52YWx1ZSA9PSB2NGwyX3Byb2ZpbGUpIHsKKyAgICAgICAgY3R4LT5wcm9maWxlID0gcHJvZmlsZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChnX2xpc3RfZmluZF9jdXN0b20gKGwsIHByb2ZpbGUsIGdfc3RyX2VxdWFsKSkgeworICAgICAgICBjdHgtPnByb2ZpbGUgPSBwcm9maWxlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJvZmlsZXMubGVuZ3RoICYmICFjdHgtPnByb2ZpbGUpCisgICAgICBmYWlsZWQgPSBUUlVFOworCisgICAgZ19xdWV1ZV9mb3JlYWNoICgmcHJvZmlsZXMsIChHRnVuYykgZ19mcmVlLCBOVUxMKTsKKyAgICBnX3F1ZXVlX2NsZWFyICgmcHJvZmlsZXMpOworICB9CisKKyAgaWYgKCFmYWlsZWQgJiYga2xhc3MtPmxldmVsX2NpZCAmJiBnZXRfc3RyaW5nX2xpc3QgKHMsICJsZXZlbCIsICZsZXZlbHMpKSB7CisgICAgR0xpc3QgKmw7CisKKyAgICBmb3IgKGwgPSBsZXZlbHMuaGVhZDsgbDsgbCA9IGwtPm5leHQpIHsKKyAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbCA9IHsgMCwgfTsKKyAgICAgIGdpbnQgdjRsMl9sZXZlbDsKKyAgICAgIGNvbnN0IGdjaGFyICpsZXZlbCA9IGwtPmRhdGE7CisKKyAgICAgIEdTVF9UUkFDRV9PQkpFQ1QgKGN0eC0+c2VsZiwgIlRyeWluZyBsZXZlbCAlcyIsIGxldmVsKTsKKworICAgICAgY29udHJvbC5pZCA9IGtsYXNzLT5sZXZlbF9jaWQ7CisgICAgICBjb250cm9sLnZhbHVlID0gdjRsMl9sZXZlbCA9IGtsYXNzLT5sZXZlbF9mcm9tX3N0cmluZyAobGV2ZWwpOworCisgICAgICBpZiAoY29udHJvbC52YWx1ZSA8IDApCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkgPCAwKSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoY3R4LT5zZWxmLCAiRmFpbGVkIHRvIHNldCAlcyBsZXZlbDogJyVzJyIsCisgICAgICAgICAgICBrbGFzcy0+Y29kZWNfbmFtZSwgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGxldmVsID0ga2xhc3MtPmxldmVsX3RvX3N0cmluZyAoY29udHJvbC52YWx1ZSk7CisKKyAgICAgIGlmIChjb250cm9sLnZhbHVlID09IHY0bDJfbGV2ZWwpIHsKKyAgICAgICAgY3R4LT5sZXZlbCA9IGxldmVsOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKGdfbGlzdF9maW5kX2N1c3RvbSAobCwgbGV2ZWwsIGdfc3RyX2VxdWFsKSkgeworICAgICAgICBjdHgtPmxldmVsID0gbGV2ZWw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChsZXZlbHMubGVuZ3RoICYmICFjdHgtPmxldmVsKQorICAgICAgZmFpbGVkID0gVFJVRTsKKworICAgIGdfcXVldWVfZm9yZWFjaCAoJmxldmVscywgKEdGdW5jKSBnX2ZyZWUsIE5VTEwpOworICAgIGdfcXVldWVfY2xlYXIgKCZsZXZlbHMpOworICB9CisKKyAgLyogSWYgaXQgZmFpbGVkLCB3ZSBjb250aW51ZSAqLworICByZXR1cm4gZmFpbGVkOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX2VuY19uZWdvdGlhdGUgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIpCit7CisgIEdzdFY0bDJWaWRlb0VuY0NsYXNzICprbGFzcyA9IEdTVF9WNEwyX1ZJREVPX0VOQ19HRVRfQ0xBU1MgKGVuY29kZXIpOworICBHc3RWNGwyVmlkZW9FbmMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19FTkMgKGVuY29kZXIpOworICBHc3RWNGwyT2JqZWN0ICp2NGwyb2JqZWN0ID0gc2VsZi0+djRsMm91dHB1dDsKKyAgR3N0Q2FwcyAqYWxsb3dlZF9jYXBzOworICBzdHJ1Y3QgUHJvZmlsZUxldmVsQ3R4IGN0eCA9IHsgc2VsZiwgTlVMTCwgTlVMTCB9OworICBHc3RWaWRlb0NvZGVjU3RhdGUgKnN0YXRlOworICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIk5lZ290aWF0aW5nICVzIHByb2ZpbGUgYW5kIGxldmVsLiIsCisgICAgICBrbGFzcy0+Y29kZWNfbmFtZSk7CisKKyAgYWxsb3dlZF9jYXBzID0gZ3N0X3BhZF9nZXRfYWxsb3dlZF9jYXBzIChHU1RfVklERU9fRU5DT0RFUl9TUkNfUEFEIChlbmNvZGVyKSk7CisKKyAgaWYgKGFsbG93ZWRfY2FwcykgeworCisgICAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChhbGxvd2VkX2NhcHMpKQorICAgICAgZ290byBub3RfbmVnb3RpYXRlZDsKKworICAgIGFsbG93ZWRfY2FwcyA9IGdzdF9jYXBzX21ha2Vfd3JpdGFibGUgKGFsbG93ZWRfY2Fwcyk7CisKKyAgICAvKiBuZWdvdGlhdGVfcHJvZmlsZV9hbmRfbGV2ZWwoKSB3aWxsIHJldHVybiBUUlVFIG9uIGZhaWx1cmUgdG8ga2VlcAorICAgICAqIGl0ZXJhdGluZywgaWYgZ3N0X2NhcHNfZm9yZWFjaCgpIHJldHVybnMgVFJVRSBpdCBtZWFucyB0aGVyZSB3YXMgbm8KKyAgICAgKiBjb21wYXRpYmxlIHByb2ZpbGUgYW5kIGxldmVsIGluIGFueSBvZiB0aGUgc3RydWN0dXJlICovCisgICAgaWYgKGdzdF9jYXBzX2ZvcmVhY2ggKGFsbG93ZWRfY2FwcywgbmVnb3RpYXRlX3Byb2ZpbGVfYW5kX2xldmVsLCAmY3R4KSkgeworICAgICAgZ290byBub19wcm9maWxlX2xldmVsOworICAgIH0KKyAgfQorCisgIGlmIChrbGFzcy0+cHJvZmlsZV9jaWQgJiYgIWN0eC5wcm9maWxlKSB7CisgICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sID0geyAwLCB9OworCisgICAgY29udHJvbC5pZCA9IGtsYXNzLT5wcm9maWxlX2NpZDsKKworICAgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19HX0NUUkwsICZjb250cm9sKSA8IDApCisgICAgICBnb3RvIGdfY3RybF9mYWlsZWQ7CisKKyAgICBjdHgucHJvZmlsZSA9IGtsYXNzLT5wcm9maWxlX3RvX3N0cmluZyAoY29udHJvbC52YWx1ZSk7CisgIH0KKworICBpZiAoa2xhc3MtPmxldmVsX2NpZCAmJiAhY3R4LmxldmVsKSB7CisgICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sID0geyAwLCB9OworCisgICAgY29udHJvbC5pZCA9IGtsYXNzLT5sZXZlbF9jaWQ7CisKKyAgICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfR19DVFJMLCAmY29udHJvbCkgPCAwKQorICAgICAgZ290byBnX2N0cmxfZmFpbGVkOworCisgICAgY3R4LmxldmVsID0ga2xhc3MtPmxldmVsX3RvX3N0cmluZyAoY29udHJvbC52YWx1ZSk7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiU2VsZWN0ZWQgJXMgcHJvZmlsZSAlcyBhdCBsZXZlbCAlcyIsCisgICAgICBrbGFzcy0+Y29kZWNfbmFtZSwgY3R4LnByb2ZpbGUsIGN0eC5sZXZlbCk7CisKKyAgc3RhdGUgPSBnc3RfdmlkZW9fZW5jb2Rlcl9nZXRfb3V0cHV0X3N0YXRlIChlbmNvZGVyKTsKKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKHN0YXRlLT5jYXBzLCAwKTsKKworICBpZiAoa2xhc3MtPnByb2ZpbGVfY2lkKQorICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAicHJvZmlsZSIsIEdfVFlQRV9TVFJJTkcsIGN0eC5wcm9maWxlLCBOVUxMKTsKKworICBpZiAoa2xhc3MtPmxldmVsX2NpZCkKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgImxldmVsIiwgR19UWVBFX1NUUklORywgY3R4LmxldmVsLCBOVUxMKTsKKworICBpZiAoIUdTVF9WSURFT19FTkNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5uZWdvdGlhdGUgKGVuY29kZXIpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKKworZ19jdHJsX2ZhaWxlZDoKKyAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiRmFpbGVkIHRvIGdldCAlcyBwcm9maWxlIGFuZCBsZXZlbDogJyVzJyIsCisgICAgICBrbGFzcy0+Y29kZWNfbmFtZSwgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgZ290byBub3RfbmVnb3RpYXRlZDsKKworbm9fcHJvZmlsZV9sZXZlbDoKKyAgR1NUX1dBUk5JTkdfT0JKRUNUIChzZWxmLCAiTm8gY29tcGF0aWJsZSBsZXZlbCBhbmQgcHJvZmlsZSBpbiBjYXBzOiAlIgorICAgICAgR1NUX1BUUl9GT1JNQVQsIGFsbG93ZWRfY2Fwcyk7CisgIGdvdG8gbm90X25lZ290aWF0ZWQ7CisKK25vdF9uZWdvdGlhdGVkOgorICBpZiAoYWxsb3dlZF9jYXBzKQorICAgIGdzdF9jYXBzX3VucmVmIChhbGxvd2VkX2NhcHMpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBHc3RWaWRlb0NvZGVjRnJhbWUgKgorZ3N0X3Y0bDJfdmlkZW9fZW5jX2dldF9vbGRlc3RfZnJhbWUgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIpCit7CisgIEdzdFZpZGVvQ29kZWNGcmFtZSAqZnJhbWUgPSBOVUxMOworICBHTGlzdCAqZnJhbWVzLCAqbDsKKyAgZ2ludCBjb3VudCA9IDA7CisKKyAgZnJhbWVzID0gZ3N0X3ZpZGVvX2VuY29kZXJfZ2V0X2ZyYW1lcyAoZW5jb2Rlcik7CisKKyAgZm9yIChsID0gZnJhbWVzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KSB7CisgICAgR3N0VmlkZW9Db2RlY0ZyYW1lICpmID0gbC0+ZGF0YTsKKworICAgIGlmICghZnJhbWUgfHwgZnJhbWUtPnB0cyA+IGYtPnB0cykKKyAgICAgIGZyYW1lID0gZjsKKworICAgIGNvdW50Kys7CisgIH0KKworICBpZiAoZnJhbWUpIHsKKyAgICBHU1RfTE9HX09CSkVDVCAoZW5jb2RlciwKKyAgICAgICAgIk9sZGVzdCBmcmFtZSBpcyAlZCAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgIiBhbmQgJWQgZnJhbWVzIGxlZnQiLAorICAgICAgICBmcmFtZS0+c3lzdGVtX2ZyYW1lX251bWJlciwgR1NUX1RJTUVfQVJHUyAoZnJhbWUtPnB0cyksIGNvdW50IC0gMSk7CisgICAgZ3N0X3ZpZGVvX2NvZGVjX2ZyYW1lX3JlZiAoZnJhbWUpOworICB9CisKKyAgZ19saXN0X2ZyZWVfZnVsbCAoZnJhbWVzLCAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF92aWRlb19jb2RlY19mcmFtZV91bnJlZik7CisKKyAgcmV0dXJuIGZyYW1lOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdmlkZW9fZW5jX2xvb3AgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIpCit7CisgIEdzdFY0bDJWaWRlb0VuYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0VOQyAoZW5jb2Rlcik7CisgIEdzdFZpZGVvQ29kZWNGcmFtZSAqZnJhbWU7CisgIEdzdEJ1ZmZlciAqYnVmZmVyID0gTlVMTDsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisKKyAgR1NUX0xPR19PQkpFQ1QgKGVuY29kZXIsICJBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIik7CisKKyAgYnVmZmVyID0gZ3N0X3ZpZGVvX2VuY29kZXJfYWxsb2NhdGVfb3V0cHV0X2J1ZmZlciAoZW5jb2RlciwKKyAgICAgIHNlbGYtPnY0bDJjYXB0dXJlLT5pbmZvLnNpemUpOworCisgIGlmIChOVUxMID09IGJ1ZmZlcikgeworICAgIHJldCA9IEdTVF9GTE9XX0ZMVVNISU5HOworICAgIGdvdG8gYmVhY2g7CisgIH0KKworCisgIC8qIEZJWE1FIENoZWNrIGlmIGJ1ZmZlciBpc24ndCB0aGUgbGFzdCBvbmUgaGVyZSAqLworCisgIEdTVF9MT0dfT0JKRUNUIChlbmNvZGVyLCAiUHJvY2VzcyBvdXRwdXQgYnVmZmVyIik7CisgIHJldCA9CisgICAgICBnc3RfdjRsMl9idWZmZXJfcG9vbF9wcm9jZXNzIChHU1RfVjRMMl9CVUZGRVJfUE9PTAorICAgICAgKHNlbGYtPnY0bDJjYXB0dXJlLT5wb29sKSwgJmJ1ZmZlcik7CisKKyAgaWYgKHJldCAhPSBHU1RfRkxPV19PSykKKyAgICBnb3RvIGJlYWNoOworCisgIGZyYW1lID0gZ3N0X3Y0bDJfdmlkZW9fZW5jX2dldF9vbGRlc3RfZnJhbWUgKGVuY29kZXIpOworCisgIGlmIChmcmFtZSkgeworICAgIGZyYW1lLT5vdXRwdXRfYnVmZmVyID0gYnVmZmVyOworICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgcmV0ID0gZ3N0X3ZpZGVvX2VuY29kZXJfZmluaXNoX2ZyYW1lIChlbmNvZGVyLCBmcmFtZSk7CisKKyAgICBpZiAocmV0ICE9IEdTVF9GTE9XX09LKQorICAgICAgZ290byBiZWFjaDsKKyAgfSBlbHNlIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGVuY29kZXIsICJFbmNvZGVyIGlzIHByb2R1Y2luZyB0b28gbWFueSBidWZmZXJzIik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgfQorCisgIHJldHVybjsKKworYmVhY2g6CisgIEdTVF9ERUJVR19PQkpFQ1QgKGVuY29kZXIsICJMZWF2aW5nIG91dHB1dCB0aHJlYWQiKTsKKworICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZidWZmZXIsIE5VTEwpOworICBzZWxmLT5vdXRwdXRfZmxvdyA9IHJldDsKKyAgZ19hdG9taWNfaW50X3NldCAoJnNlbGYtPnByb2Nlc3NpbmcsIEZBTFNFKTsKKyAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9jayAoc2VsZi0+djRsMm91dHB1dCk7CisgIGdzdF9wYWRfcGF1c2VfdGFzayAoZW5jb2Rlci0+c3JjcGFkKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZpZGVvX2VuY19sb29wX3N0b3BwZWQgKEdzdFY0bDJWaWRlb0VuYyAqIHNlbGYpCit7CisgIGlmIChnX2F0b21pY19pbnRfZ2V0ICgmc2VsZi0+cHJvY2Vzc2luZykpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiRWFybHkgc3RvcCBvZiBlbmNvZGluZyB0aHJlYWQiKTsKKyAgICBzZWxmLT5vdXRwdXRfZmxvdyA9IEdTVF9GTE9XX0ZMVVNISU5HOworICAgIGdfYXRvbWljX2ludF9zZXQgKCZzZWxmLT5wcm9jZXNzaW5nLCBGQUxTRSk7CisgIH0KKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiRW5jb2RpbmcgdGFzayBkZXN0cm95ZWQ6ICVzIiwKKyAgICAgIGdzdF9mbG93X2dldF9uYW1lIChzZWxmLT5vdXRwdXRfZmxvdykpOworCit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitnc3RfdjRsMl92aWRlb19lbmNfaGFuZGxlX2ZyYW1lIChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyLAorICAgIEdzdFZpZGVvQ29kZWNGcmFtZSAqIGZyYW1lKQoreworICBHc3RWNGwyVmlkZW9FbmMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19FTkMgKGVuY29kZXIpOworICBHc3RGbG93UmV0dXJuIHJldCA9IEdTVF9GTE9XX09LOworICBHc3RUYXNrU3RhdGUgdGFza19zdGF0ZTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiSGFuZGxpbmcgZnJhbWUgJWQiLCBmcmFtZS0+c3lzdGVtX2ZyYW1lX251bWJlcik7CisKKyAgaWYgKEdfVU5MSUtFTFkgKCFnX2F0b21pY19pbnRfZ2V0ICgmc2VsZi0+YWN0aXZlKSkpCisgICAgZ290byBmbHVzaGluZzsKKworICB0YXNrX3N0YXRlID0gZ3N0X3BhZF9nZXRfdGFza19zdGF0ZSAoR1NUX1ZJREVPX0RFQ09ERVJfU1JDX1BBRCAoc2VsZikpOworICBpZiAodGFza19zdGF0ZSA9PSBHU1RfVEFTS19TVE9QUEVEIHx8IHRhc2tfc3RhdGUgPT0gR1NUX1RBU0tfUEFVU0VEKSB7CisgICAgR3N0QnVmZmVyUG9vbCAqcG9vbCA9IEdTVF9CVUZGRVJfUE9PTCAoc2VsZi0+djRsMm91dHB1dC0+cG9vbCk7CisKKyAgICAvKiBJdCBwb3NzaWJsZSB0aGF0IHRoZSBwcm9jZXNzaW5nIHRocmVhZCBzdG9wcGVkIGR1ZSB0byBhbiBlcnJvciAqLworICAgIGlmIChzZWxmLT5vdXRwdXRfZmxvdyAhPSBHU1RfRkxPV19PSyAmJgorICAgICAgICBzZWxmLT5vdXRwdXRfZmxvdyAhPSBHU1RfRkxPV19GTFVTSElORykgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlByb2Nlc3NpbmcgbG9vcCBzdG9wcGVkIHdpdGggZXJyb3IsIGxlYXZpbmciKTsKKyAgICAgIHJldCA9IHNlbGYtPm91dHB1dF9mbG93OworICAgICAgZ290byBkcm9wOworICAgIH0KKworICAgIC8qIEVuc3VyZSBpbnB1dCBpbnRlcm5hbCBwb29sIGlzIGFjdGl2ZSAqLworICAgIGlmICghZ3N0X2J1ZmZlcl9wb29sX2lzX2FjdGl2ZSAocG9vbCkpIHsKKyAgICAgIEdzdFN0cnVjdHVyZSAqY29uZmlnID0gZ3N0X2J1ZmZlcl9wb29sX2dldF9jb25maWcgKHBvb2wpOworICAgICAgZ3VpbnQgbWluID0gTUFYIChzZWxmLT52NGwyb3V0cHV0LT5taW5fYnVmZmVycywgR1NUX1Y0TDJfTUlOX0JVRkZFUlMpOworCisgICAgICBnc3RfYnVmZmVyX3Bvb2xfY29uZmlnX3NldF9wYXJhbXMgKGNvbmZpZywgc2VsZi0+aW5wdXRfc3RhdGUtPmNhcHMsCisgICAgICAgICAgc2VsZi0+djRsMm91dHB1dC0+aW5mby5zaXplLCBtaW4sIG1pbik7CisKKyAgICAgIC8qIFRoZXJlIGlzIG5vIHJlYXNvbiB0byByZWZ1c2UgdGhpcyBjb25maWcgKi8KKyAgICAgIGlmICghZ3N0X2J1ZmZlcl9wb29sX3NldF9jb25maWcgKHBvb2wsIGNvbmZpZykpCisgICAgICAgIGdvdG8gYWN0aXZhdGVfZmFpbGVkOworCisgICAgICBpZiAoIWdzdF9idWZmZXJfcG9vbF9zZXRfYWN0aXZlIChwb29sLCBUUlVFKSkKKyAgICAgICAgZ290byBhY3RpdmF0ZV9mYWlsZWQ7CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAoc2VsZiwgIlN0YXJ0aW5nIGVuY29kaW5nIHRocmVhZCIpOworCisgICAgLyogU3RhcnQgdGhlIHByb2Nlc3NpbmcgdGFzaywgd2hlbiBpdCBxdWl0cywgdGhlIHRhc2sgd2lsbCBkaXNhYmxlIGlucHV0CisgICAgICogcHJvY2Vzc2luZyB0byB1bmxvY2sgaW5wdXQgaWYgZHJhaW5pbmcsIG9yIHByZXZlbnQgcG90ZW50aWFsIGJsb2NrICovCisgICAgaWYgKCFnc3RfcGFkX3N0YXJ0X3Rhc2sgKGVuY29kZXItPnNyY3BhZCwKKyAgICAgICAgICAgIChHc3RUYXNrRnVuY3Rpb24pIGdzdF92NGwyX3ZpZGVvX2VuY19sb29wLCBzZWxmLAorICAgICAgICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnc3RfdjRsMl92aWRlb19lbmNfbG9vcF9zdG9wcGVkKSkKKyAgICAgIGdvdG8gc3RhcnRfdGFza19mYWlsZWQ7CisgIH0KKworICBpZiAoZnJhbWUtPmlucHV0X2J1ZmZlcikgeworICAgIEdTVF9WSURFT19FTkNPREVSX1NUUkVBTV9VTkxPQ0sgKGVuY29kZXIpOworICAgIHJldCA9CisgICAgICAgIGdzdF92NGwyX2J1ZmZlcl9wb29sX3Byb2Nlc3MgKEdTVF9WNEwyX0JVRkZFUl9QT09MCisgICAgICAgIChzZWxmLT52NGwyb3V0cHV0LT5wb29sKSwgJmZyYW1lLT5pbnB1dF9idWZmZXIpOworICAgIEdTVF9WSURFT19FTkNPREVSX1NUUkVBTV9MT0NLIChlbmNvZGVyKTsKKworICAgIGlmIChyZXQgPT0gR1NUX0ZMT1dfRkxVU0hJTkcpIHsKKyAgICAgIGlmIChnc3RfcGFkX2dldF90YXNrX3N0YXRlIChHU1RfVklERU9fREVDT0RFUl9TUkNfUEFEIChzZWxmKSkgIT0KKyAgICAgICAgICBHU1RfVEFTS19TVEFSVEVEKQorICAgICAgICByZXQgPSBzZWxmLT5vdXRwdXRfZmxvdzsKKyAgICAgIGdvdG8gZHJvcDsKKyAgICB9IGVsc2UgaWYgKHJldCAhPSBHU1RfRkxPV19PSykgeworICAgICAgZ290byBwcm9jZXNzX2ZhaWxlZDsKKyAgICB9CisgIH0KKworICBnc3RfdmlkZW9fY29kZWNfZnJhbWVfdW5yZWYgKGZyYW1lKTsKKyAgcmV0dXJuIHJldDsKKworICAvKiBFUlJPUlMgKi8KK2FjdGl2YXRlX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzZWxmLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiIpKSwKKyAgICAgICAgKCJCdWZmZXIgcG9vbCBhY3RpdmF0aW9uIGZhaWxlZCIpKTsKKyAgICByZXR1cm4gR1NUX0ZMT1dfRVJST1I7CisKKyAgfQorZmx1c2hpbmc6CisgIHsKKyAgICByZXQgPSBHU1RfRkxPV19GTFVTSElORzsKKyAgICBnb3RvIGRyb3A7CisgIH0KK3N0YXJ0X3Rhc2tfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHNlbGYsIFJFU09VUkNFLCBGQUlMRUQsCisgICAgICAgIChfKCJGYWlsZWQgdG8gc3RhcnQgZW5jb2RpbmcgdGhyZWFkLiIpKSwgKE5VTEwpKTsKKyAgICBnX2F0b21pY19pbnRfc2V0ICgmc2VsZi0+cHJvY2Vzc2luZywgRkFMU0UpOworICAgIHJldCA9IEdTVF9GTE9XX0VSUk9SOworICAgIGdvdG8gZHJvcDsKKyAgfQorcHJvY2Vzc19mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAoc2VsZiwgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKF8oIkZhaWxlZCB0byBwcm9jZXNzIGZyYW1lLiIpKSwKKyAgICAgICAgKCJNYXliZSBiZSBkdWUgdG8gbm90IGVub3VnaCBtZW1vcnkgb3IgZmFpbGluZyBkcml2ZXIiKSk7CisgICAgcmV0ID0gR1NUX0ZMT1dfRVJST1I7CisgICAgZ290byBkcm9wOworICB9Citkcm9wOgorICB7CisgICAgZ3N0X3ZpZGVvX2VuY29kZXJfZmluaXNoX2ZyYW1lIChlbmNvZGVyLCBmcmFtZSk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX2VuY19kZWNpZGVfYWxsb2NhdGlvbiAoR3N0VmlkZW9FbmNvZGVyICoKKyAgICBlbmNvZGVyLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RWNGwyVmlkZW9FbmMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19FTkMgKGVuY29kZXIpOworICBHc3RWaWRlb0NvZGVjU3RhdGUgKnN0YXRlID0gZ3N0X3ZpZGVvX2VuY29kZXJfZ2V0X291dHB1dF9zdGF0ZSAoZW5jb2Rlcik7CisgIEdzdFY0bDJFcnJvciBlcnJvciA9IEdTVF9WNEwyX0VSUk9SX0lOSVQ7CisgIEdzdENsb2NrVGltZSBsYXRlbmN5OworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICAvKiBXZSBuZWVkIHRvIHNldCB0aGUgZm9ybWF0IGhlcmUsIHNpbmNlIHRoaXMgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyCisgICAqIEdzdFZpZGVvRW5jb2RlciBoYXZlIHNldCB0aGUgd2lkdGgsIGhlaWdodCBhbmQgZnJhbWVyYXRlIGludG8gdGhlIHN0YXRlCisgICAqIGNhcHMuIFRoZXNlIGFyZSBuZWVkZWQgYnkgdGhlIGRyaXZlciB0byBjYWxjdWxhdGUgdGhlIGJ1ZmZlciBzaXplIGFuZCB0bworICAgKiBpbXBsZW1lbnQgYml0cmF0ZSBhZGFwdGF0aW9uLiAqLworICBpZiAoIWdzdF92NGwyX29iamVjdF9zZXRfZm9ybWF0IChzZWxmLT52NGwyY2FwdHVyZSwgc3RhdGUtPmNhcHMsICZlcnJvcikpIHsKKyAgICBnc3RfdjRsMl9lcnJvciAoc2VsZiwgJmVycm9yKTsKKyAgICByZXQgPSBGQUxTRTsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICBpZiAoZ3N0X3Y0bDJfb2JqZWN0X2RlY2lkZV9hbGxvY2F0aW9uIChzZWxmLT52NGwyY2FwdHVyZSwgcXVlcnkpKSB7CisgICAgR3N0VmlkZW9FbmNvZGVyQ2xhc3MgKmVuY19jbGFzcyA9IEdTVF9WSURFT19FTkNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpOworICAgIHJldCA9IGVuY19jbGFzcy0+ZGVjaWRlX2FsbG9jYXRpb24gKGVuY29kZXIsIHF1ZXJ5KTsKKyAgfQorCisgIC8qIEZJWE1FIFRoaXMgbWF5IG5vdCBiZSBlbnRpcmVseSBjb3JyZWN0LCBhcyBlbmNvZGVyIG1heSBrZWVwIHNvbWUKKyAgICogb2JzZXJ2YXRpb24gd2l0aG91dGggZGVsYXlpbmcgdGhlIGVuY29kaW5nLiBMaW51eCBNZWRpYSBBUEkgbmVlZCBzb21lCisgICAqIG1vcmUgd29yayB0byBleHBsaWNpdGx5IGV4cHJlc3NlZCB0aGUgZGVjb2RlciAvIGVuY29kZXIgbGF0ZW5jeS4gVGhpcworICAgKiB2YWx1ZSB3aWxsIHRoZW4gYmVjb21lIG1heCBsYXRlbmN5LCBhbmQgdGhlIHJlcG9ydGVkIGRyaXZlciBsYXRlbmN5IHdvdWxkCisgICAqIGJlY29tZSB0aGUgbWluIGxhdGVuY3kuICovCisgIGxhdGVuY3kgPSBzZWxmLT52NGwyY2FwdHVyZS0+bWluX2J1ZmZlcnMgKiBzZWxmLT52NGwyY2FwdHVyZS0+ZHVyYXRpb247CisgIGdzdF92aWRlb19lbmNvZGVyX3NldF9sYXRlbmN5IChlbmNvZGVyLCBsYXRlbmN5LCBsYXRlbmN5KTsKKworZG9uZToKKyAgZ3N0X3ZpZGVvX2NvZGVjX3N0YXRlX3VucmVmIChzdGF0ZSk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZW5jX3Byb3Bvc2VfYWxsb2NhdGlvbiAoR3N0VmlkZW9FbmNvZGVyICoKKyAgICBlbmNvZGVyLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBHc3RWNGwyVmlkZW9FbmMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19FTkMgKGVuY29kZXIpOworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiY2FsbGVkIik7CisKKyAgaWYgKHF1ZXJ5ID09IE5VTEwpCisgICAgcmV0ID0gVFJVRTsKKyAgZWxzZQorICAgIHJldCA9IGdzdF92NGwyX29iamVjdF9wcm9wb3NlX2FsbG9jYXRpb24gKHNlbGYtPnY0bDJvdXRwdXQsIHF1ZXJ5KTsKKworICBpZiAocmV0KQorICAgIHJldCA9IEdTVF9WSURFT19FTkNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5wcm9wb3NlX2FsbG9jYXRpb24gKGVuY29kZXIsCisgICAgICAgIHF1ZXJ5KTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX2VuY19zcmNfcXVlcnkgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisgIEdzdFY0bDJWaWRlb0VuYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0VOQyAoZW5jb2Rlcik7CisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0NBUFM6eworICAgICAgR3N0Q2FwcyAqZmlsdGVyLCAqcmVzdWx0ID0gTlVMTDsKKyAgICAgIEdzdFBhZCAqcGFkID0gR1NUX1ZJREVPX0VOQ09ERVJfU1JDX1BBRCAoZW5jb2Rlcik7CisKKyAgICAgIGdzdF9xdWVyeV9wYXJzZV9jYXBzIChxdWVyeSwgJmZpbHRlcik7CisKKyAgICAgIC8qIEZJWE1FIFRyeSBhbmQgbm90IHByb2JlIHRoZSBlbnRpcmUgZW5jb2RlciwgYnV0IG9ubHkgdGhlIGltcGxlbWVudAorICAgICAgICogc3ViY2xhc3MgZm9ybWF0ICovCisgICAgICBpZiAoc2VsZi0+cHJvYmVkX3NyY2NhcHMpIHsKKyAgICAgICAgR3N0Q2FwcyAqdG1wbCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChwYWQpOworICAgICAgICByZXN1bHQgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKHRtcGwsIHNlbGYtPnByb2JlZF9zcmNjYXBzKTsKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcGwpOworICAgICAgfSBlbHNlCisgICAgICAgIHJlc3VsdCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChwYWQpOworCisgICAgICBpZiAoZmlsdGVyKSB7CisgICAgICAgIEdzdENhcHMgKnRtcCA9IHJlc3VsdDsKKyAgICAgICAgcmVzdWx0ID0KKyAgICAgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHRtcCwgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcCk7CisgICAgICB9CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJSZXR1cm5pbmcgc3JjIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIHJlc3VsdCk7CisKKyAgICAgIGdzdF9xdWVyeV9zZXRfY2Fwc19yZXN1bHQgKHF1ZXJ5LCByZXN1bHQpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKHJlc3VsdCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0ID0gR1NUX1ZJREVPX0VOQ09ERVJfQ0xBU1MgKHBhcmVudF9jbGFzcyktPnNyY19xdWVyeSAoZW5jb2RlciwgcXVlcnkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX2VuY19zaW5rX3F1ZXJ5IChHc3RWaWRlb0VuY29kZXIgKiBlbmNvZGVyLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnYm9vbGVhbiByZXQgPSBUUlVFOworICBHc3RWNGwyVmlkZW9FbmMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19FTkMgKGVuY29kZXIpOworCisgIHN3aXRjaCAoR1NUX1FVRVJZX1RZUEUgKHF1ZXJ5KSkgeworICAgIGNhc2UgR1NUX1FVRVJZX0NBUFM6eworICAgICAgR3N0Q2FwcyAqZmlsdGVyLCAqcmVzdWx0ID0gTlVMTDsKKyAgICAgIEdzdFBhZCAqcGFkID0gR1NUX1ZJREVPX0VOQ09ERVJfU0lOS19QQUQgKGVuY29kZXIpOworCisgICAgICBnc3RfcXVlcnlfcGFyc2VfY2FwcyAocXVlcnksICZmaWx0ZXIpOworCisgICAgICBpZiAoc2VsZi0+cHJvYmVkX3NpbmtjYXBzKQorICAgICAgICByZXN1bHQgPSBnc3RfY2Fwc19yZWYgKHNlbGYtPnByb2JlZF9zaW5rY2Fwcyk7CisgICAgICBlbHNlCisgICAgICAgIHJlc3VsdCA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChwYWQpOworCisgICAgICBpZiAoZmlsdGVyKSB7CisgICAgICAgIEdzdENhcHMgKnRtcCA9IHJlc3VsdDsKKyAgICAgICAgcmVzdWx0ID0KKyAgICAgICAgICAgIGdzdF9jYXBzX2ludGVyc2VjdF9mdWxsIChmaWx0ZXIsIHRtcCwgR1NUX0NBUFNfSU5URVJTRUNUX0ZJUlNUKTsKKyAgICAgICAgZ3N0X2NhcHNfdW5yZWYgKHRtcCk7CisgICAgICB9CisKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJSZXR1cm5pbmcgc2luayBjYXBzICUiIEdTVF9QVFJfRk9STUFULCByZXN1bHQpOworCisgICAgICBnc3RfcXVlcnlfc2V0X2NhcHNfcmVzdWx0IChxdWVyeSwgcmVzdWx0KTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChyZXN1bHQpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIHJldCA9IEdTVF9WSURFT19FTkNPREVSX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5zaW5rX3F1ZXJ5IChlbmNvZGVyLCBxdWVyeSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fZW5jX3NpbmtfZXZlbnQgKEdzdFZpZGVvRW5jb2RlciAqIGVuY29kZXIsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdzdFY0bDJWaWRlb0VuYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0VOQyAoZW5jb2Rlcik7CisgIGdib29sZWFuIHJldDsKKworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9GTFVTSF9TVEFSVDoKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHNlbGYsICJmbHVzaCBzdGFydCIpOworICAgICAgZ3N0X3Y0bDJfb2JqZWN0X3VubG9jayAoc2VsZi0+djRsMm91dHB1dCk7CisgICAgICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyY2FwdHVyZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXQgPSBHU1RfVklERU9fRU5DT0RFUl9DTEFTUyAocGFyZW50X2NsYXNzKS0+c2lua19ldmVudCAoZW5jb2RlciwgZXZlbnQpOworCisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0ZMVVNIX1NUQVJUOgorICAgICAgZ3N0X3BhZF9zdG9wX3Rhc2sgKGVuY29kZXItPnNyY3BhZCk7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzZWxmLCAiZmx1c2ggc3RhcnQgZG9uZSIpOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBHc3RTdGF0ZUNoYW5nZVJldHVybgorZ3N0X3Y0bDJfdmlkZW9fZW5jX2NoYW5nZV9zdGF0ZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikKK3sKKyAgR3N0VjRsMlZpZGVvRW5jICpzZWxmID0gR1NUX1Y0TDJfVklERU9fRU5DIChlbGVtZW50KTsKKworICBpZiAodHJhbnNpdGlvbiA9PSBHU1RfU1RBVEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWSkgeworICAgIGdfYXRvbWljX2ludF9zZXQgKCZzZWxmLT5hY3RpdmUsIEZBTFNFKTsKKyAgICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyb3V0cHV0KTsKKyAgICBnc3RfdjRsMl9vYmplY3RfdW5sb2NrIChzZWxmLT52NGwyY2FwdHVyZSk7CisgIH0KKworICByZXR1cm4gR1NUX0VMRU1FTlRfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmNoYW5nZV9zdGF0ZSAoZWxlbWVudCwgdHJhbnNpdGlvbik7Cit9CisKKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZpZGVvX2VuY19kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RWNGwyVmlkZW9FbmMgKnNlbGYgPSBHU1RfVjRMMl9WSURFT19FTkMgKG9iamVjdCk7CisKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJnNlbGYtPnByb2JlZF9zaW5rY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzZWxmLT5wcm9iZWRfc3JjY2FwcywgTlVMTCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmRpc3Bvc2UgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl92aWRlb19lbmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFY0bDJWaWRlb0VuYyAqc2VsZiA9IEdTVF9WNEwyX1ZJREVPX0VOQyAob2JqZWN0KTsKKworICBnc3RfdjRsMl9vYmplY3RfZGVzdHJveSAoc2VsZi0+djRsMmNhcHR1cmUpOworICBnc3RfdjRsMl9vYmplY3RfZGVzdHJveSAoc2VsZi0+djRsMm91dHB1dCk7CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHBhcmVudF9jbGFzcyktPmZpbmFsaXplIChvYmplY3QpOworfQorCisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl92aWRlb19lbmNfaW5pdCAoR3N0VjRsMlZpZGVvRW5jICogc2VsZikKK3sKKyAgLyogVjRMMiBvYmplY3QgYXJlIGNyZWF0ZWQgaW4gc3ViaW5zdGFuY2VfaW5pdCAqLworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdmlkZW9fZW5jX3N1Ymluc3RhbmNlX2luaXQgKEdUeXBlSW5zdGFuY2UgKiBpbnN0YW5jZSwgZ3BvaW50ZXIgZ19jbGFzcykKK3sKKyAgR3N0VjRsMlZpZGVvRW5jQ2xhc3MgKmtsYXNzID0gR1NUX1Y0TDJfVklERU9fRU5DX0NMQVNTIChnX2NsYXNzKTsKKyAgR3N0VjRsMlZpZGVvRW5jICpzZWxmID0gR1NUX1Y0TDJfVklERU9fRU5DIChpbnN0YW5jZSk7CisKKyAgc2VsZi0+djRsMm91dHB1dCA9IGdzdF92NGwyX29iamVjdF9uZXcgKEdTVF9FTEVNRU5UIChzZWxmKSwKKyAgICAgIEdTVF9PQkpFQ1QgKEdTVF9WSURFT19FTkNPREVSX1NJTktfUEFEIChzZWxmKSksCisgICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwga2xhc3MtPmRlZmF1bHRfZGV2aWNlLAorICAgICAgZ3N0X3Y0bDJfZ2V0X291dHB1dCwgZ3N0X3Y0bDJfc2V0X291dHB1dCwgTlVMTCk7CisgIHNlbGYtPnY0bDJvdXRwdXQtPm5vX2luaXRpYWxfZm9ybWF0ID0gVFJVRTsKKyAgc2VsZi0+djRsMm91dHB1dC0+a2VlcF9hc3BlY3QgPSBGQUxTRTsKKworICBzZWxmLT52NGwyY2FwdHVyZSA9IGdzdF92NGwyX29iamVjdF9uZXcgKEdTVF9FTEVNRU5UIChzZWxmKSwKKyAgICAgIEdTVF9PQkpFQ1QgKEdTVF9WSURFT19FTkNPREVSX1NSQ19QQUQgKHNlbGYpKSwKKyAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwga2xhc3MtPmRlZmF1bHRfZGV2aWNlLAorICAgICAgZ3N0X3Y0bDJfZ2V0X2lucHV0LCBnc3RfdjRsMl9zZXRfaW5wdXQsIE5VTEwpOworICBzZWxmLT52NGwyY2FwdHVyZS0+bm9faW5pdGlhbF9mb3JtYXQgPSBUUlVFOworICBzZWxmLT52NGwyb3V0cHV0LT5rZWVwX2FzcGVjdCA9IEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdmlkZW9fZW5jX2NsYXNzX2luaXQgKEdzdFY0bDJWaWRlb0VuY0NsYXNzICoga2xhc3MpCit7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHc3RWaWRlb0VuY29kZXJDbGFzcyAqdmlkZW9fZW5jb2Rlcl9jbGFzczsKKworICBwYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGtsYXNzKTsKKworICBlbGVtZW50X2NsYXNzID0gKEdzdEVsZW1lbnRDbGFzcyAqKSBrbGFzczsKKyAgZ29iamVjdF9jbGFzcyA9IChHT2JqZWN0Q2xhc3MgKikga2xhc3M7CisgIHZpZGVvX2VuY29kZXJfY2xhc3MgPSAoR3N0VmlkZW9FbmNvZGVyQ2xhc3MgKikga2xhc3M7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF92NGwyX3ZpZGVvX2VuY19kZWJ1ZywgInY0bDJ2aWRlb2VuYyIsIDAsCisgICAgICAiVjRMMiBWaWRlbyBFbmNvZGVyIik7CisKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19lbmNfZGlzcG9zZSk7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2VuY19maW5hbGl6ZSk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZW5jX3NldF9wcm9wZXJ0eSk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZW5jX2dldF9wcm9wZXJ0eSk7CisKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+b3BlbiA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19lbmNfb3Blbik7CisgIHZpZGVvX2VuY29kZXJfY2xhc3MtPmNsb3NlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2VuY19jbG9zZSk7CisgIHZpZGVvX2VuY29kZXJfY2xhc3MtPnN0YXJ0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2VuY19zdGFydCk7CisgIHZpZGVvX2VuY29kZXJfY2xhc3MtPnN0b3AgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZW5jX3N0b3ApOworICB2aWRlb19lbmNvZGVyX2NsYXNzLT5maW5pc2ggPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZW5jX2ZpbmlzaCk7CisgIHZpZGVvX2VuY29kZXJfY2xhc3MtPmZsdXNoID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2VuY19mbHVzaCk7CisgIHZpZGVvX2VuY29kZXJfY2xhc3MtPnNldF9mb3JtYXQgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2VuY19zZXRfZm9ybWF0KTsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+bmVnb3RpYXRlID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19lbmNfbmVnb3RpYXRlKTsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+ZGVjaWRlX2FsbG9jYXRpb24gPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2VuY19kZWNpZGVfYWxsb2NhdGlvbik7CisgIHZpZGVvX2VuY29kZXJfY2xhc3MtPnByb3Bvc2VfYWxsb2NhdGlvbiA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZW5jX3Byb3Bvc2VfYWxsb2NhdGlvbik7CisgIHZpZGVvX2VuY29kZXJfY2xhc3MtPnNpbmtfcXVlcnkgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2VuY19zaW5rX3F1ZXJ5KTsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+c3JjX3F1ZXJ5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92aWRlb19lbmNfc3JjX3F1ZXJ5KTsKKyAgdmlkZW9fZW5jb2Rlcl9jbGFzcy0+c2lua19ldmVudCA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZW5jX3NpbmtfZXZlbnQpOworICB2aWRlb19lbmNvZGVyX2NsYXNzLT5oYW5kbGVfZnJhbWUgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZpZGVvX2VuY19oYW5kbGVfZnJhbWUpOworCisgIGVsZW1lbnRfY2xhc3MtPmNoYW5nZV9zdGF0ZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdmlkZW9fZW5jX2NoYW5nZV9zdGF0ZSk7CisKKyAgZ3N0X3Y0bDJfb2JqZWN0X2luc3RhbGxfbTJtX3Byb3BlcnRpZXNfaGVscGVyIChnb2JqZWN0X2NsYXNzKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZpZGVvX2VuY19zdWJjbGFzc19pbml0IChncG9pbnRlciBnX2NsYXNzLCBncG9pbnRlciBkYXRhKQoreworICBHc3RWNGwyVmlkZW9FbmNDbGFzcyAqa2xhc3MgPSBHU1RfVjRMMl9WSURFT19FTkNfQ0xBU1MgKGdfY2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmVsZW1lbnRfY2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyAoZ19jbGFzcyk7CisgIEdzdFY0bDJWaWRlb0VuY0NEYXRhICpjZGF0YSA9IGRhdGE7CisKKyAga2xhc3MtPmRlZmF1bHRfZGV2aWNlID0gY2RhdGEtPmRldmljZTsKKworICAvKiBOb3RlOiBnc3RfcGFkX3RlbXBsYXRlX25ldygpIHRha2UgdGhlIGZsb2F0aW5nIHJlZiBmcm9tIHRoZSBjYXBzICovCisgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICBnc3RfcGFkX3RlbXBsYXRlX25ldyAoInNpbmsiLCBHU1RfUEFEX1NJTkssIEdTVF9QQURfQUxXQVlTLAorICAgICAgICAgIGNkYXRhLT5zaW5rX2NhcHMpKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywKKyAgICAgIGdzdF9wYWRfdGVtcGxhdGVfbmV3ICgic3JjIiwgR1NUX1BBRF9TUkMsIEdTVF9QQURfQUxXQVlTLAorICAgICAgICAgIGNkYXRhLT5zcmNfY2FwcykpOworCisgIGdzdF9jYXBzX3VucmVmIChjZGF0YS0+c2lua19jYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNkYXRhLT5zcmNfY2Fwcyk7CisgIGdfZnJlZSAoY2RhdGEpOworfQorCisvKiBQcm9iaW5nIGZ1bmN0aW9ucyAqLworZ2Jvb2xlYW4KK2dzdF92NGwyX2lzX3ZpZGVvX2VuYyAoR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzLAorICAgIEdzdENhcHMgKiBjb2RlY19jYXBzKQoreworICBnYm9vbGVhbiByZXQgPSBGQUxTRTsKKyAgZ2Jvb2xlYW4gKCpjaGVja19jYXBzKSAoY29uc3QgR3N0Q2FwcyAqLCBjb25zdCBHc3RDYXBzICopOworCisgIGlmIChjb2RlY19jYXBzKSB7CisgICAgY2hlY2tfY2FwcyA9IGdzdF9jYXBzX2Nhbl9pbnRlcnNlY3Q7CisgIH0gZWxzZSB7CisgICAgY29kZWNfY2FwcyA9IGdzdF92NGwyX29iamVjdF9nZXRfY29kZWNfY2FwcyAoKTsKKyAgICBjaGVja19jYXBzID0gZ3N0X2NhcHNfaXNfc3Vic2V0OworICB9CisKKyAgaWYgKGdzdF9jYXBzX2lzX3N1YnNldCAoc2lua19jYXBzLCBnc3RfdjRsMl9vYmplY3RfZ2V0X3Jhd19jYXBzICgpKQorICAgICAgJiYgY2hlY2tfY2FwcyAoc3JjX2NhcHMsIGNvZGVjX2NhcHMpKQorICAgIHJldCA9IFRSVUU7CisKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZAorZ3N0X3Y0bDJfdmlkZW9fZW5jX3JlZ2lzdGVyIChHc3RQbHVnaW4gKiBwbHVnaW4sIEdUeXBlIHR5cGUsCisgICAgY29uc3QgY2hhciAqY29kZWMsIGNvbnN0IGdjaGFyICogYmFzZW5hbWUsIGNvbnN0IGdjaGFyICogZGV2aWNlX3BhdGgsCisgICAgR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIGNvZGVjX2NhcHMsIEdzdENhcHMgKiBzcmNfY2FwcykKK3sKKyAgR3N0Q2FwcyAqZmlsdGVyZWRfY2FwczsKKyAgR1R5cGVRdWVyeSB0eXBlX3F1ZXJ5OworICBHVHlwZUluZm8gdHlwZV9pbmZvID0geyAwLCB9OworICBHVHlwZSBzdWJ0eXBlOworICBnY2hhciAqdHlwZV9uYW1lOworICBHc3RWNGwyVmlkZW9FbmNDRGF0YSAqY2RhdGE7CisKKyAgZmlsdGVyZWRfY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdCAoc3JjX2NhcHMsIGNvZGVjX2NhcHMpOworCisgIGNkYXRhID0gZ19uZXcwIChHc3RWNGwyVmlkZW9FbmNDRGF0YSwgMSk7CisgIGNkYXRhLT5kZXZpY2UgPSBnX3N0cmR1cCAoZGV2aWNlX3BhdGgpOworICBjZGF0YS0+c2lua19jYXBzID0gZ3N0X2NhcHNfcmVmIChzaW5rX2NhcHMpOworICBjZGF0YS0+c3JjX2NhcHMgPSBnc3RfY2Fwc19yZWYgKGZpbHRlcmVkX2NhcHMpOworCisgIGdfdHlwZV9xdWVyeSAodHlwZSwgJnR5cGVfcXVlcnkpOworICBtZW1zZXQgKCZ0eXBlX2luZm8sIDAsIHNpemVvZiAodHlwZV9pbmZvKSk7CisgIHR5cGVfaW5mby5jbGFzc19zaXplID0gdHlwZV9xdWVyeS5jbGFzc19zaXplOworICB0eXBlX2luZm8uaW5zdGFuY2Vfc2l6ZSA9IHR5cGVfcXVlcnkuaW5zdGFuY2Vfc2l6ZTsKKyAgdHlwZV9pbmZvLmNsYXNzX2luaXQgPSBnc3RfdjRsMl92aWRlb19lbmNfc3ViY2xhc3NfaW5pdDsKKyAgdHlwZV9pbmZvLmNsYXNzX2RhdGEgPSBjZGF0YTsKKyAgdHlwZV9pbmZvLmluc3RhbmNlX2luaXQgPSBnc3RfdjRsMl92aWRlb19lbmNfc3ViaW5zdGFuY2VfaW5pdDsKKworICAvKiBUaGUgZmlyc3QgZW5jb2RlciB0byBiZSByZWdpc3RlcmVkIHNob3VsZCB1c2UgYSBjb25zdGFudCBuYW1lLCBsaWtlCisgICAqIHY0bDJoMjY0ZW5jLCBmb3IgYW55IGFkZGl0aW9uYWwgZW5jb2RlcnMsIHdlIGNyZWF0ZSB1bmlxdWUgbmFtZXMuIEVuY29kZXIKKyAgICogbmFtZXMgbWF5IGNoYW5nZSBiZXR3ZWVuIGJvb3RzLCBzbyB0aGlzIHNob3VsZCBoZWxwIGdhaW4gc3RhYmxlIG5hbWVzIGZvcgorICAgKiB0aGUgbW9zdCBjb21tb24gdXNlIGNhc2VzLiAqLworICB0eXBlX25hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJ2NGwyJXNlbmMiLCBjb2RlYyk7CisKKyAgaWYgKGdfdHlwZV9mcm9tX25hbWUgKHR5cGVfbmFtZSkgIT0gMCkgeworICAgIGdfZnJlZSAodHlwZV9uYW1lKTsKKyAgICB0eXBlX25hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJ2NGwyJXMlc2VuYyIsIGJhc2VuYW1lLCBjb2RlYyk7CisgIH0KKworICBzdWJ0eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAodHlwZSwgdHlwZV9uYW1lLCAmdHlwZV9pbmZvLCAwKTsKKworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sIHR5cGVfbmFtZSwgR1NUX1JBTktfUFJJTUFSWSArIDEsIHN1YnR5cGUpKQorICAgIEdTVF9XQVJOSU5HICgiRmFpbGVkIHRvIHJlZ2lzdGVyIHBsdWdpbiAnJXMnIiwgdHlwZV9uYW1lKTsKKworICBnX2ZyZWUgKHR5cGVfbmFtZSk7Cit9CmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwydmlkZW9lbmMuaCBiL3N5cy92NGwyL2dzdHY0bDJ2aWRlb2VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwM2FjZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwydmlkZW9lbmMuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFNVTU9NTyBDb21wdXRlciBBc3NvY2lhdGlvbi4KKyAqICAgICBBdXRob3I6IGF5YWthIDxheWFrYUBzb3VsaWsuaW5mbz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0dTVF9WNEwyX1ZJREVPX0VOQ19IX18KKyNkZWZpbmUgX19HU1RfVjRMMl9WSURFT19FTkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2dzdHZpZGVvZW5jb2Rlci5oPgorI2luY2x1ZGUgPGdzdC92aWRlby9nc3R2aWRlb21ldGEuaD4KKworI2luY2x1ZGUgPGdzdHY0bDJvYmplY3QuaD4KKyNpbmNsdWRlIDxnc3R2NGwyYnVmZmVycG9vbC5oPgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1Y0TDJfVklERU9fRU5DIFwKKyAgKGdzdF92NGwyX3ZpZGVvX2VuY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfVjRMMl9WSURFT19FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9WNEwyX1ZJREVPX0VOQyxHc3RWNGwyVmlkZW9FbmMpKQorI2RlZmluZSBHU1RfVjRMMl9WSURFT19FTkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVjRMMl9WSURFT19FTkMsR3N0VjRsMlZpZGVvRW5jQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVjRMMl9WSURFT19FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WNEwyX1ZJREVPX0VOQykpCisjZGVmaW5lIEdTVF9JU19WNEwyX1ZJREVPX0VOQ19DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVjRMMl9WSURFT19FTkMpKQorI2RlZmluZSBHU1RfVjRMMl9WSURFT19FTkNfR0VUX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIEdTVF9UWVBFX1Y0TDJfVklERU9fRU5DLCBHc3RWNGwyVmlkZW9FbmNDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyVmlkZW9FbmMgR3N0VjRsMlZpZGVvRW5jOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJWaWRlb0VuY0NsYXNzIEdzdFY0bDJWaWRlb0VuY0NsYXNzOworCitzdHJ1Y3QgX0dzdFY0bDJWaWRlb0VuYworeworICBHc3RWaWRlb0VuY29kZXIgcGFyZW50OworCisgIC8qIDwgcHJpdmF0ZSA+ICovCisgIEdzdFY0bDJPYmplY3QgKnY0bDJvdXRwdXQ7CisgIEdzdFY0bDJPYmplY3QgKnY0bDJjYXB0dXJlOworCisgIC8qIHBhZHMgKi8KKyAgR3N0Q2FwcyAqcHJvYmVkX3NyY2NhcHM7CisgIEdzdENhcHMgKnByb2JlZF9zaW5rY2FwczsKKworICAvKiBTdGF0ZSAqLworICBHc3RWaWRlb0NvZGVjU3RhdGUgKmlucHV0X3N0YXRlOworICBnYm9vbGVhbiBhY3RpdmU7CisgIGdib29sZWFuIHByb2Nlc3Npbmc7CisgIEdzdEZsb3dSZXR1cm4gb3V0cHV0X2Zsb3c7CisKK307CisKK3N0cnVjdCBfR3N0VjRsMlZpZGVvRW5jQ2xhc3MKK3sKKyAgR3N0VmlkZW9FbmNvZGVyQ2xhc3MgcGFyZW50X2NsYXNzOworCisgIGdjaGFyICpkZWZhdWx0X2RldmljZTsKKyAgY29uc3QgY2hhciAqY29kZWNfbmFtZTsKKworICBndWludDMyIHByb2ZpbGVfY2lkOworICBjb25zdCBnY2hhciAqICgqcHJvZmlsZV90b19zdHJpbmcpIChnaW50IHY0bDJfcHJvZmlsZSk7CisgIGdpbnQgKCpwcm9maWxlX2Zyb21fc3RyaW5nKSAoY29uc3QgZ2NoYXIgKiBwcm9maWxlKTsKKworICBndWludDMyIGxldmVsX2NpZDsKKyAgY29uc3QgZ2NoYXIgKiAoKmxldmVsX3RvX3N0cmluZykgKGdpbnQgdjRsMl9sZXZlbCk7CisgIGdpbnQgKCpsZXZlbF9mcm9tX3N0cmluZykgKGNvbnN0IGdjaGFyICogbGV2ZWwpOworfTsKKworR1R5cGUgZ3N0X3Y0bDJfdmlkZW9fZW5jX2dldF90eXBlICh2b2lkKTsKKworCitnYm9vbGVhbiBnc3RfdjRsMl9pc192aWRlb19lbmMgKEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdENhcHMgKiBzcmNfY2FwcywKKyAgICBHc3RDYXBzICogY29kZWNfY2Fwcyk7CisKK3ZvaWQgZ3N0X3Y0bDJfdmlkZW9fZW5jX3JlZ2lzdGVyIChHc3RQbHVnaW4gKiBwbHVnaW4sIEdUeXBlIHR5cGUsCisgICAgY29uc3QgY2hhciAqY29kZWMsIGNvbnN0IGdjaGFyICogYmFzZW5hbWUsIGNvbnN0IGdjaGFyICogZGV2aWNlX3BhdGgsCisgICAgR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqY29kZWNfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9WNEwyX1ZJREVPX0VOQ19IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJ2aWRvcmllbnQuYyBiL3N5cy92NGwyL2dzdHY0bDJ2aWRvcmllbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2NiNDU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICoKKyAqIGdzdHY0bDJ2aWRvcmllbnQuYzogdmlkZW8gb3JpZW50YXRpb24gaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBWNEwyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaW5jbHVkZSAiZ3N0djRsMm9iamVjdC5oIgorI2luY2x1ZGUgImdzdHY0bDJ2aWRvcmllbnQuaCIKKyNpbmNsdWRlICJnc3R2NGwyb2JqZWN0LmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHY0bDJ2b19kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCB2NGwydm9fZGVidWcKKwordm9pZAorZ3N0X3Y0bDJfdmlkZW9fb3JpZW50YXRpb25faW50ZXJmYWNlX2luaXQgKEdzdFZpZGVvT3JpZW50YXRpb25JbnRlcmZhY2UgKiBpZmFjZSkKK3sKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKHY0bDJ2b19kZWJ1ZywgInY0bDJ2byIsIDAsCisgICAgICAiVjRMMiBWaWRlb09yaWVudGF0aW9uIGludGVyZmFjZSBkZWJ1Z2dpbmciKTsKK30KKworCitnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fb3JpZW50YXRpb25fZ2V0X2hmbGlwIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBnYm9vbGVhbiAqIGZsaXApCit7CisKKyAgcmV0dXJuIGdzdF92NGwyX2dldF9hdHRyaWJ1dGUgKHY0bDJvYmplY3QsIFY0TDJfQ0lEX0hGTElQLCBmbGlwKTsKK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX29yaWVudGF0aW9uX2dldF92ZmxpcCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgZ2Jvb2xlYW4gKiBmbGlwKQoreworICByZXR1cm4gZ3N0X3Y0bDJfZ2V0X2F0dHJpYnV0ZSAodjRsMm9iamVjdCwgVjRMMl9DSURfVkZMSVAsIGZsaXApOworfQorCisvKiBuYW1lZCBoY2VudGVyIGJlY2F1c2Ugb2YgaGlzdG9yaWNhbCB2NGwyIG5hbWluZyAqLworZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX29yaWVudGF0aW9uX2dldF9oY2VudGVyIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBnaW50ICogY2VudGVyKQoreworICByZXR1cm4gZ3N0X3Y0bDJfZ2V0X2F0dHJpYnV0ZSAodjRsMm9iamVjdCwgVjRMMl9DSURfUEFOX1JFU0VULCBjZW50ZXIpOworfQorCisvKiBuYW1lZCB2Y2VudGVyIGJlY2F1c2Ugb2YgaGlzdG9yaWNhbCB2NGwyIG5hbWluZyAqLworZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX29yaWVudGF0aW9uX2dldF92Y2VudGVyIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBnaW50ICogY2VudGVyKQoreworICByZXR1cm4gZ3N0X3Y0bDJfZ2V0X2F0dHJpYnV0ZSAodjRsMm9iamVjdCwgVjRMMl9DSURfVElMVF9SRVNFVCwgY2VudGVyKTsKK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX29yaWVudGF0aW9uX3NldF9oZmxpcCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIGdib29sZWFuIGZsaXApCit7CisgIHJldHVybiBnc3RfdjRsMl9zZXRfYXR0cmlidXRlICh2NGwyb2JqZWN0LCBWNEwyX0NJRF9IRkxJUCwgZmxpcCk7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl92aWRlb19vcmllbnRhdGlvbl9zZXRfdmZsaXAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBnYm9vbGVhbiBmbGlwKQoreworICByZXR1cm4gZ3N0X3Y0bDJfc2V0X2F0dHJpYnV0ZSAodjRsMm9iamVjdCwgVjRMMl9DSURfVkZMSVAsIGZsaXApOworfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfdmlkZW9fb3JpZW50YXRpb25fc2V0X2hjZW50ZXIgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBnaW50IGNlbnRlcikKK3sKKyAgcmV0dXJuIGdzdF92NGwyX3NldF9hdHRyaWJ1dGUgKHY0bDJvYmplY3QsIFY0TDJfQ0lEX1BBTl9SRVNFVCwgY2VudGVyKTsKK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX3ZpZGVvX29yaWVudGF0aW9uX3NldF92Y2VudGVyIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgZ2ludCBjZW50ZXIpCit7CisgIHJldHVybiBnc3RfdjRsMl9zZXRfYXR0cmlidXRlICh2NGwyb2JqZWN0LCBWNEwyX0NJRF9USUxUX1JFU0VULCBjZW50ZXIpOworfQpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5oIGIvc3lzL3Y0bDIvZ3N0djRsMnZpZG9yaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMmFlOGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9nc3R2NGwydmlkb3JpZW50LmgKQEAgLTAsMCArMSwxMTggQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICoKKyAqIGdzdHY0bDJ2aWRvcmllbnQuaDogdmlkZW8gb3JpZW50YXRpb24gaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBWNEwyCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9WNEwyX1ZJRE9SSUVOVF9IX18KKyNkZWZpbmUgX19HU1RfVjRMMl9WSURPUklFTlRfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvb3JpZW50YXRpb24uaD4KKworI2luY2x1ZGUgImdzdHY0bDJvYmplY3QuaCIKKworR19CRUdJTl9ERUNMUworCit2b2lkICAgICBnc3RfdjRsMl92aWRlb19vcmllbnRhdGlvbl9pbnRlcmZhY2VfaW5pdCAoR3N0VmlkZW9PcmllbnRhdGlvbkludGVyZmFjZSAqIGlmYWNlKTsKKworZ2Jvb2xlYW4gZ3N0X3Y0bDJfdmlkZW9fb3JpZW50YXRpb25fZ2V0X2hmbGlwIAkoR3N0VjRsMk9iamVjdCAqdjRsMm9iamVjdCwgZ2Jvb2xlYW4gKmZsaXApOworZ2Jvb2xlYW4gZ3N0X3Y0bDJfdmlkZW9fb3JpZW50YXRpb25fZ2V0X3ZmbGlwIAkoR3N0VjRsMk9iamVjdCAqdjRsMm9iamVjdCwgZ2Jvb2xlYW4gKmZsaXApOworZ2Jvb2xlYW4gZ3N0X3Y0bDJfdmlkZW9fb3JpZW50YXRpb25fZ2V0X2hjZW50ZXIgKEdzdFY0bDJPYmplY3QgKnY0bDJvYmplY3QsIGdpbnQgKmNlbnRlcik7CitnYm9vbGVhbiBnc3RfdjRsMl92aWRlb19vcmllbnRhdGlvbl9nZXRfdmNlbnRlciAoR3N0VjRsMk9iamVjdCAqdjRsMm9iamVjdCwgZ2ludCAqY2VudGVyKTsKKworZ2Jvb2xlYW4gZ3N0X3Y0bDJfdmlkZW9fb3JpZW50YXRpb25fc2V0X2hmbGlwIAkoR3N0VjRsMk9iamVjdCAqdjRsMm9iamVjdCwgZ2Jvb2xlYW4gZmxpcCk7CitnYm9vbGVhbiBnc3RfdjRsMl92aWRlb19vcmllbnRhdGlvbl9zZXRfdmZsaXAgCShHc3RWNGwyT2JqZWN0ICp2NGwyb2JqZWN0LCBnYm9vbGVhbiBmbGlwKTsKK2dib29sZWFuIGdzdF92NGwyX3ZpZGVvX29yaWVudGF0aW9uX3NldF9oY2VudGVyIChHc3RWNGwyT2JqZWN0ICp2NGwyb2JqZWN0LCBnaW50IGNlbnRlcik7CitnYm9vbGVhbiBnc3RfdjRsMl92aWRlb19vcmllbnRhdGlvbl9zZXRfdmNlbnRlciAoR3N0VjRsMk9iamVjdCAqdjRsMm9iamVjdCwgZ2ludCBjZW50ZXIpOworCisjZGVmaW5lIEdTVF9JTVBMRU1FTlRfVjRMMl9WSURPUklFTlRfTUVUSE9EUyhUeXBlLCBpbnRlcmZhY2VfYXNfZnVuY3Rpb24pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdmlkZW9fb3JpZW50YXRpb25fZ2V0X2hmbGlwIChHc3RWaWRlb09yaWVudGF0aW9uICp2bywgZ2Jvb2xlYW4gKmZsaXApICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFR5cGUgKnRoaXMgPSAoVHlwZSopIHZvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGdzdF92NGwyX3ZpZGVvX29yaWVudGF0aW9uX2dldF9oZmxpcCAodGhpcy0+djRsMm9iamVjdCwgZmxpcCk7CQkgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGdib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3ZpZGVvX29yaWVudGF0aW9uX2dldF92ZmxpcCAoR3N0VmlkZW9PcmllbnRhdGlvbiAqdm8sIGdib29sZWFuICpmbGlwKSAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUeXBlICp0aGlzID0gKFR5cGUqKSB2bzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBnc3RfdjRsMl92aWRlb19vcmllbnRhdGlvbl9nZXRfdmZsaXAgKHRoaXMtPnY0bDJvYmplY3QsIGZsaXApOwkJICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBnYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF92aWRlb19vcmllbnRhdGlvbl9nZXRfaGNlbnRlciAoR3N0VmlkZW9PcmllbnRhdGlvbiAqdm8sIGdpbnQgKmNlbnRlcikgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVHlwZSAqdGhpcyA9IChUeXBlKikgdm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gZ3N0X3Y0bDJfdmlkZW9fb3JpZW50YXRpb25fZ2V0X2hjZW50ZXIgKHRoaXMtPnY0bDJvYmplY3QsIGNlbnRlcik7CQkgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGdib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3ZpZGVvX29yaWVudGF0aW9uX2dldF92Y2VudGVyIChHc3RWaWRlb09yaWVudGF0aW9uICp2bywgZ2ludCAqY2VudGVyKSAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUeXBlICp0aGlzID0gKFR5cGUqKSB2bzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBnc3RfdjRsMl92aWRlb19vcmllbnRhdGlvbl9nZXRfdmNlbnRlciAodGhpcy0+djRsMm9iamVjdCwgY2VudGVyKTsJCSAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgZ2Jvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdmlkZW9fb3JpZW50YXRpb25fc2V0X2hmbGlwIChHc3RWaWRlb09yaWVudGF0aW9uICp2bywgZ2Jvb2xlYW4gZmxpcCkgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFR5cGUgKnRoaXMgPSAoVHlwZSopIHZvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGdzdF92NGwyX3ZpZGVvX29yaWVudGF0aW9uX3NldF9oZmxpcCAodGhpcy0+djRsMm9iamVjdCwgZmxpcCk7CQkgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGdib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3ZpZGVvX29yaWVudGF0aW9uX3NldF92ZmxpcCAoR3N0VmlkZW9PcmllbnRhdGlvbiAqdm8sIGdib29sZWFuIGZsaXApICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUeXBlICp0aGlzID0gKFR5cGUqKSB2bzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBnc3RfdjRsMl92aWRlb19vcmllbnRhdGlvbl9zZXRfdmZsaXAgKHRoaXMtPnY0bDJvYmplY3QsIGZsaXApOwkJICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBnYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF92aWRlb19vcmllbnRhdGlvbl9zZXRfaGNlbnRlciAoR3N0VmlkZW9PcmllbnRhdGlvbiAqdm8sIGdpbnQgY2VudGVyKSAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVHlwZSAqdGhpcyA9IChUeXBlKikgdm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gZ3N0X3Y0bDJfdmlkZW9fb3JpZW50YXRpb25fc2V0X2hjZW50ZXIgKHRoaXMtPnY0bDJvYmplY3QsIGNlbnRlcik7CQkgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGdib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3ZpZGVvX29yaWVudGF0aW9uX3NldF92Y2VudGVyIChHc3RWaWRlb09yaWVudGF0aW9uICp2bywgZ2ludCBjZW50ZXIpICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUeXBlICp0aGlzID0gKFR5cGUqKSB2bzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBnc3RfdjRsMl92aWRlb19vcmllbnRhdGlvbl9zZXRfdmNlbnRlciAodGhpcy0+djRsMm9iamVjdCwgY2VudGVyKTsJCSAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdmlkZW9fb3JpZW50YXRpb25faW50ZXJmYWNlX2luaXQgKEdzdFZpZGVvT3JpZW50YXRpb25JbnRlcmZhY2UgKiBpZmFjZSkgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogZGVmYXVsdCB2aXJ0dWFsIGZ1bmN0aW9ucyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZmFjZS0+Z2V0X2hmbGlwICAgPSBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3ZpZGVvX29yaWVudGF0aW9uX2dldF9oZmxpcDsgICAgICAgICAgICAgICAgICAgXAorICAgIGlmYWNlLT5nZXRfdmZsaXAgICA9IGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdmlkZW9fb3JpZW50YXRpb25fZ2V0X3ZmbGlwOyAgICAgICAgICAgICAgICAgICBcCisgICAgaWZhY2UtPmdldF9oY2VudGVyID0gaW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF92aWRlb19vcmllbnRhdGlvbl9nZXRfaGNlbnRlcjsgICAgICAgICAgICAgICAgIFwKKyAgICBpZmFjZS0+Z2V0X3ZjZW50ZXIgPSBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3ZpZGVvX29yaWVudGF0aW9uX2dldF92Y2VudGVyOyAgICAgICAgICAgICAgICAgXAorICAgIGlmYWNlLT5zZXRfaGZsaXAgICA9IGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdmlkZW9fb3JpZW50YXRpb25fc2V0X2hmbGlwOyAgICAgICAgICAgICAgICAgICBcCisgICAgaWZhY2UtPnNldF92ZmxpcCAgID0gaW50ZXJmYWNlX2FzX2Z1bmN0aW9uICMjIF92aWRlb19vcmllbnRhdGlvbl9zZXRfdmZsaXA7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZmFjZS0+c2V0X2hjZW50ZXIgPSBpbnRlcmZhY2VfYXNfZnVuY3Rpb24gIyMgX3ZpZGVvX29yaWVudGF0aW9uX3NldF9oY2VudGVyOyAgICAgICAgICAgICAgICAgXAorICAgIGlmYWNlLT5zZXRfdmNlbnRlciA9IGludGVyZmFjZV9hc19mdW5jdGlvbiAjIyBfdmlkZW9fb3JpZW50YXRpb25fc2V0X3ZjZW50ZXI7ICAgICAgICAgICAgICAgICBcCisgIH0KKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9WNEwyX1ZJRE9SSUVOVF9IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJ2cDhlbmMuYyBiL3N5cy92NGwyL2dzdHY0bDJ2cDhlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjNlYjA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMnZwOGVuYy5jCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IENvbGxhYm9yYSBJbmMuCisgKiAgICBBdXRob3I6IE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3R2NGwyb2JqZWN0LmgiCisjaW5jbHVkZSAiZ3N0djRsMnZwOGVuYy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC1pMThuLXBsdWdpbi5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfdjRsMl92cDhfZW5jX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF92NGwyX3ZwOF9lbmNfZGVidWcKKworc3RhdGljIEdzdFN0YXRpY0NhcHMgc3JjX3RlbXBsYXRlX2NhcHMgPQorR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC12cDgsIHByb2ZpbGU9KHN0cmluZykgeyAwLCAxLCAyLCAzIH0iKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFY0TDJfU1REX09CSkVDVF9QUk9QUywKKyAgLyogVE9ETyAqLworfTsKKworI2RlZmluZSBnc3RfdjRsMl92cDhfZW5jX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFY0bDJWcDhFbmMsIGdzdF92NGwyX3ZwOF9lbmMsIEdTVF9UWVBFX1Y0TDJfVklERU9fRU5DKTsKKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZwOF9lbmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIC8qIFRPRE8gKi8KK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZwOF9lbmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIC8qIFRPRE8gKi8KK30KKworc3RhdGljIGdpbnQKK3Y0bDJfcHJvZmlsZV9mcm9tX3N0cmluZyAoY29uc3QgZ2NoYXIgKiBwcm9maWxlKQoreworICBnaW50IHY0bDJfcHJvZmlsZSA9IC0xOworCisgIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgIjAiKSkKKyAgICB2NGwyX3Byb2ZpbGUgPSAwOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgIjEiKSkKKyAgICB2NGwyX3Byb2ZpbGUgPSAxOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgIjIiKSkKKyAgICB2NGwyX3Byb2ZpbGUgPSAyOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgIjMiKSkKKyAgICB2NGwyX3Byb2ZpbGUgPSAzOworICBlbHNlCisgICAgR1NUX1dBUk5JTkcgKCJVbnN1cHBvcnRlZCBwcm9maWxlIHN0cmluZyAnJXMnIiwgcHJvZmlsZSk7CisKKyAgcmV0dXJuIHY0bDJfcHJvZmlsZTsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICoKK3Y0bDJfcHJvZmlsZV90b19zdHJpbmcgKGdpbnQgdjRsMl9wcm9maWxlKQoreworICBzd2l0Y2ggKHY0bDJfcHJvZmlsZSkgeworICAgIGNhc2UgMDoKKyAgICAgIHJldHVybiAiMCI7CisgICAgY2FzZSAxOgorICAgICAgcmV0dXJuICIxIjsKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gIjIiOworICAgIGNhc2UgMzoKKyAgICAgIHJldHVybiAiMyI7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HICgiVW5zdXBwb3J0ZWQgVjRMMiBwcm9maWxlICVpIiwgdjRsMl9wcm9maWxlKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl92cDhfZW5jX2luaXQgKEdzdFY0bDJWcDhFbmMgKiBzZWxmKQoreworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdnA4X2VuY19jbGFzc19pbml0IChHc3RWNGwyVnA4RW5jQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdFY0bDJWaWRlb0VuY0NsYXNzICpiYXNlY2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBiYXNlY2xhc3MgPSAoR3N0VjRsMlZpZGVvRW5jQ2xhc3MgKikgKGtsYXNzKTsKKworCisgIEdTVF9ERUJVR19DQVRFR09SWV9JTklUIChnc3RfdjRsMl92cDhfZW5jX2RlYnVnLCAidjRsMnZwOGVuYyIsIDAsCisgICAgICAiVjRMMiBWUDggRW5jb2RlciIpOworCisgIGdzdF9lbGVtZW50X2NsYXNzX3NldF9zdGF0aWNfbWV0YWRhdGEgKGVsZW1lbnRfY2xhc3MsCisgICAgICAiVjRMMiBWUDggRW5jb2RlciIsCisgICAgICAiQ29kZWMvRW5jb2Rlci9WaWRlbyIsCisgICAgICAiRW5jb2RlIFZQOCB2aWRlbyBzdHJlYW1zIHZpYSBWNEwyIEFQSSIsCisgICAgICAiTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tIik7CisKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0KKyAgICAgIEdTVF9ERUJVR19GVU5DUFRSIChnc3RfdjRsMl92cDhfZW5jX3NldF9wcm9wZXJ0eSk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdnA4X2VuY19nZXRfcHJvcGVydHkpOworCisgIGJhc2VjbGFzcy0+Y29kZWNfbmFtZSA9ICJWUDgiOworICBiYXNlY2xhc3MtPnByb2ZpbGVfY2lkID0gVjRMMl9DSURfTVBFR19WSURFT19WUFhfUFJPRklMRTsKKyAgYmFzZWNsYXNzLT5wcm9maWxlX3RvX3N0cmluZyA9IHY0bDJfcHJvZmlsZV90b19zdHJpbmc7CisgIGJhc2VjbGFzcy0+cHJvZmlsZV9mcm9tX3N0cmluZyA9IHY0bDJfcHJvZmlsZV9mcm9tX3N0cmluZzsKK30KKworLyogUHJvYmluZyBmdW5jdGlvbnMgKi8KK2dib29sZWFuCitnc3RfdjRsMl9pc192cDhfZW5jIChHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpCit7CisgIHJldHVybiBnc3RfdjRsMl9pc192aWRlb19lbmMgKHNpbmtfY2Fwcywgc3JjX2NhcHMsCisgICAgICBnc3Rfc3RhdGljX2NhcHNfZ2V0ICgmc3JjX3RlbXBsYXRlX2NhcHMpKTsKK30KKwordm9pZAorZ3N0X3Y0bDJfdnA4X2VuY19yZWdpc3RlciAoR3N0UGx1Z2luICogcGx1Z2luLCBjb25zdCBnY2hhciAqIGJhc2VuYW1lLAorICAgIGNvbnN0IGdjaGFyICogZGV2aWNlX3BhdGgsIEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdENhcHMgKiBzcmNfY2FwcykKK3sKKyAgZ3N0X3Y0bDJfdmlkZW9fZW5jX3JlZ2lzdGVyIChwbHVnaW4sIEdTVF9UWVBFX1Y0TDJfVlA4X0VOQywKKyAgICAgICJ2cDgiLCBiYXNlbmFtZSwgZGV2aWNlX3BhdGgsIHNpbmtfY2FwcywKKyAgICAgIGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZzcmNfdGVtcGxhdGVfY2FwcyksIHNyY19jYXBzKTsKK30KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJ2cDhlbmMuaCBiL3N5cy92NGwyL2dzdHY0bDJ2cDhlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTgyYjRiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMnZwOGVuYy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQ29sbGFib3JhIEluYy4KKyAqICAgIEF1dGhvcjogTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9fR1NUX1Y0TDJfVlA4X0VOQ19IX18KKyNkZWZpbmUgX19HU1RfVjRMMl9WUDhfRU5DX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgImdzdHY0bDJ2aWRlb2VuYy5oIgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1Y0TDJfVlA4X0VOQyBcCisgIChnc3RfdjRsMl92cDhfZW5jX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9WNEwyX1ZQOF9FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSxHU1RfVFlQRV9WNEwyX1ZQOF9FTkMsR3N0VjRsMlZwOEVuYykpCisjZGVmaW5lIEdTVF9WNEwyX1ZQOF9FTkNfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfVjRMMl9WUDhfRU5DLEdzdFY0bDJWcDhFbmNDbGFzcykpCisjZGVmaW5lIEdTVF9JU19WNEwyX1ZQOF9FTkMob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9WNEwyX1ZQOF9FTkMpKQorI2RlZmluZSBHU1RfSVNfVjRMMl9WUDhfRU5DX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9WNEwyX1ZQOF9FTkMpKQordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJWcDhFbmMgR3N0VjRsMlZwOEVuYzsKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyVnA4RW5jQ2xhc3MgR3N0VjRsMlZwOEVuY0NsYXNzOworCitzdHJ1Y3QgX0dzdFY0bDJWcDhFbmMKK3sKKyAgR3N0VjRsMlZpZGVvRW5jIHBhcmVudDsKK307CisKK3N0cnVjdCBfR3N0VjRsMlZwOEVuY0NsYXNzCit7CisgIEdzdFY0bDJWaWRlb0VuY0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dUeXBlIGdzdF92NGwyX3ZwOF9lbmNfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiBnc3RfdjRsMl9pc192cDhfZW5jIChHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpOworCit2b2lkIGdzdF92NGwyX3ZwOF9lbmNfcmVnaXN0ZXIgKEdzdFBsdWdpbiAqIHBsdWdpbiwgY29uc3QgZ2NoYXIgKiBiYXNlbmFtZSwKKyAgICBjb25zdCBnY2hhciAqIGRldmljZV9wYXRoLCBHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpOworCitHX0VORF9ERUNMUworI2VuZGlmIC8qIF9fR1NUX1Y0TDJfVlA4X0VOQ19IX18gKi8KZGlmZiAtLWdpdCBhL3N5cy92NGwyL2dzdHY0bDJ2cDllbmMuYyBiL3N5cy92NGwyL2dzdHY0bDJ2cDllbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTM4ZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvZ3N0djRsMnZwOWVuYy5jCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IENvbGxhYm9yYSBJbmMuCisgKiAgICBBdXRob3I6IE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJnc3R2NGwyb2JqZWN0LmgiCisjaW5jbHVkZSAiZ3N0djRsMnZwOWVuYy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC1pMThuLXBsdWdpbi5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfdjRsMl92cDlfZW5jX2RlYnVnKTsKKyNkZWZpbmUgR1NUX0NBVF9ERUZBVUxUIGdzdF92NGwyX3ZwOV9lbmNfZGVidWcKKworc3RhdGljIEdzdFN0YXRpY0NhcHMgc3JjX3RlbXBsYXRlX2NhcHMgPQorR1NUX1NUQVRJQ19DQVBTICgidmlkZW8veC12cDksIHByb2ZpbGU9KHN0cmluZykgeyAwLCAxLCAyLCAzIH0iKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFY0TDJfU1REX09CSkVDVF9QUk9QUywKKyAgLyogVE9ETyAqLworfTsKKworI2RlZmluZSBnc3RfdjRsMl92cDlfZW5jX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFY0bDJWcDlFbmMsIGdzdF92NGwyX3ZwOV9lbmMsIEdTVF9UWVBFX1Y0TDJfVklERU9fRU5DKTsKKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZwOV9lbmNfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIGNvbnN0IEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIC8qIFRPRE8gKi8KK30KKworc3RhdGljIHZvaWQKK2dzdF92NGwyX3ZwOV9lbmNfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICogb2JqZWN0LAorICAgIGd1aW50IHByb3BfaWQsIEdWYWx1ZSAqIHZhbHVlLCBHUGFyYW1TcGVjICogcHNwZWMpCit7CisgIC8qIFRPRE8gKi8KK30KKworc3RhdGljIGdpbnQKK3Y0bDJfcHJvZmlsZV9mcm9tX3N0cmluZyAoY29uc3QgZ2NoYXIgKiBwcm9maWxlKQoreworICBnaW50IHY0bDJfcHJvZmlsZSA9IC0xOworCisgIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgIjAiKSkKKyAgICB2NGwyX3Byb2ZpbGUgPSAwOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgIjEiKSkKKyAgICB2NGwyX3Byb2ZpbGUgPSAxOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgIjIiKSkKKyAgICB2NGwyX3Byb2ZpbGUgPSAyOworICBlbHNlIGlmIChnX3N0cl9lcXVhbCAocHJvZmlsZSwgIjMiKSkKKyAgICB2NGwyX3Byb2ZpbGUgPSAzOworICBlbHNlCisgICAgR1NUX1dBUk5JTkcgKCJVbnN1cHBvcnRlZCBwcm9maWxlIHN0cmluZyAnJXMnIiwgcHJvZmlsZSk7CisKKyAgcmV0dXJuIHY0bDJfcHJvZmlsZTsKK30KKworc3RhdGljIGNvbnN0IGdjaGFyICoKK3Y0bDJfcHJvZmlsZV90b19zdHJpbmcgKGdpbnQgdjRsMl9wcm9maWxlKQoreworICBzd2l0Y2ggKHY0bDJfcHJvZmlsZSkgeworICAgIGNhc2UgMDoKKyAgICAgIHJldHVybiAiMCI7CisgICAgY2FzZSAxOgorICAgICAgcmV0dXJuICIxIjsKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gIjIiOworICAgIGNhc2UgMzoKKyAgICAgIHJldHVybiAiMyI7CisgICAgZGVmYXVsdDoKKyAgICAgIEdTVF9XQVJOSU5HICgiVW5zdXBwb3J0ZWQgVjRMMiBwcm9maWxlICVpIiwgdjRsMl9wcm9maWxlKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl92cDlfZW5jX2luaXQgKEdzdFY0bDJWcDlFbmMgKiBzZWxmKQoreworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfdnA5X2VuY19jbGFzc19pbml0IChHc3RWNGwyVnA5RW5jQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdzdFY0bDJWaWRlb0VuY0NsYXNzICpiYXNlY2xhc3M7CisKKyAgcGFyZW50X2NsYXNzID0gZ190eXBlX2NsYXNzX3BlZWtfcGFyZW50IChrbGFzcyk7CisKKyAgZWxlbWVudF9jbGFzcyA9IChHc3RFbGVtZW50Q2xhc3MgKikga2xhc3M7CisgIGdvYmplY3RfY2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworICBiYXNlY2xhc3MgPSAoR3N0VjRsMlZpZGVvRW5jQ2xhc3MgKikgKGtsYXNzKTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZ3N0X3Y0bDJfdnA5X2VuY19kZWJ1ZywgInY0bDJ2cDllbmMiLCAwLAorICAgICAgIlY0TDIgVlA5IEVuY29kZXIiKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChlbGVtZW50X2NsYXNzLAorICAgICAgIlY0TDIgVlA5IEVuY29kZXIiLAorICAgICAgIkNvZGVjL0VuY29kZXIvVmlkZW8iLAorICAgICAgIkVuY29kZSBWUDkgdmlkZW8gc3RyZWFtcyB2aWEgVjRMMiBBUEkiLAorICAgICAgIk5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbSIpOworCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3Y0bDJfdnA5X2VuY19zZXRfcHJvcGVydHkpOworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPQorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF92NGwyX3ZwOV9lbmNfZ2V0X3Byb3BlcnR5KTsKKworICBiYXNlY2xhc3MtPmNvZGVjX25hbWUgPSAiVlA5IjsKKyAgYmFzZWNsYXNzLT5wcm9maWxlX2NpZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fVlBYX1BST0ZJTEU7CisgIGJhc2VjbGFzcy0+cHJvZmlsZV90b19zdHJpbmcgPSB2NGwyX3Byb2ZpbGVfdG9fc3RyaW5nOworICBiYXNlY2xhc3MtPnByb2ZpbGVfZnJvbV9zdHJpbmcgPSB2NGwyX3Byb2ZpbGVfZnJvbV9zdHJpbmc7Cit9CisKKy8qIFByb2JpbmcgZnVuY3Rpb25zICovCitnYm9vbGVhbgorZ3N0X3Y0bDJfaXNfdnA5X2VuYyAoR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKQoreworICByZXR1cm4gZ3N0X3Y0bDJfaXNfdmlkZW9fZW5jIChzaW5rX2NhcHMsIHNyY19jYXBzLAorICAgICAgZ3N0X3N0YXRpY19jYXBzX2dldCAoJnNyY190ZW1wbGF0ZV9jYXBzKSk7Cit9CisKK3ZvaWQKK2dzdF92NGwyX3ZwOV9lbmNfcmVnaXN0ZXIgKEdzdFBsdWdpbiAqIHBsdWdpbiwgY29uc3QgZ2NoYXIgKiBiYXNlbmFtZSwKKyAgICBjb25zdCBnY2hhciAqIGRldmljZV9wYXRoLCBHc3RDYXBzICogc2lua19jYXBzLCBHc3RDYXBzICogc3JjX2NhcHMpCit7CisgIGdzdF92NGwyX3ZpZGVvX2VuY19yZWdpc3RlciAocGx1Z2luLCBHU1RfVFlQRV9WNEwyX1ZQOV9FTkMsCisgICAgICAidnA5IiwgYmFzZW5hbWUsIGRldmljZV9wYXRoLCBzaW5rX2NhcHMsCisgICAgICBnc3Rfc3RhdGljX2NhcHNfZ2V0ICgmc3JjX3RlbXBsYXRlX2NhcHMpLCBzcmNfY2Fwcyk7Cit9CmRpZmYgLS1naXQgYS9zeXMvdjRsMi9nc3R2NGwydnA5ZW5jLmggYi9zeXMvdjRsMi9nc3R2NGwydnA5ZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2OGNjZQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL2dzdHY0bDJ2cDllbmMuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IENvbGxhYm9yYSBJbmMuCisgKiAgICBBdXRob3I6IE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0dTVF9WNEwyX1ZQOV9FTkNfSF9fCisjZGVmaW5lIF9fR1NUX1Y0TDJfVlA5X0VOQ19IX18KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlICJnc3R2NGwydmlkZW9lbmMuaCIKKworR19CRUdJTl9ERUNMUworI2RlZmluZSBHU1RfVFlQRV9WNEwyX1ZQOV9FTkMgXAorICAoZ3N0X3Y0bDJfdnA5X2VuY19nZXRfdHlwZSgpKQorI2RlZmluZSBHU1RfVjRMMl9WUDlfRU5DKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfVjRMMl9WUDlfRU5DLEdzdFY0bDJWcDlFbmMpKQorI2RlZmluZSBHU1RfVjRMMl9WUDlfRU5DX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1Y0TDJfVlA5X0VOQyxHc3RWNGwyVnA5RW5jQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVjRMMl9WUDlfRU5DKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfVjRMMl9WUDlfRU5DKSkKKyNkZWZpbmUgR1NUX0lTX1Y0TDJfVlA5X0VOQ19DTEFTUyhvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfVjRMMl9WUDlfRU5DKSkKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwyVnA5RW5jIEdzdFY0bDJWcDlFbmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VjRsMlZwOUVuY0NsYXNzIEdzdFY0bDJWcDlFbmNDbGFzczsKKworc3RydWN0IF9Hc3RWNGwyVnA5RW5jCit7CisgIEdzdFY0bDJWaWRlb0VuYyBwYXJlbnQ7Cit9OworCitzdHJ1Y3QgX0dzdFY0bDJWcDlFbmNDbGFzcworeworICBHc3RWNGwyVmlkZW9FbmNDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3RfdjRsMl92cDlfZW5jX2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gZ3N0X3Y0bDJfaXNfdnA5X2VuYyAoR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKTsKKwordm9pZCBnc3RfdjRsMl92cDlfZW5jX3JlZ2lzdGVyIChHc3RQbHVnaW4gKiBwbHVnaW4sIGNvbnN0IGdjaGFyICogYmFzZW5hbWUsCisgICAgY29uc3QgZ2NoYXIgKiBkZXZpY2VfcGF0aCwgR3N0Q2FwcyAqIHNpbmtfY2FwcywgR3N0Q2FwcyAqIHNyY19jYXBzKTsKKworR19FTkRfREVDTFMKKyNlbmRpZiAvKiBfX0dTVF9WNEwyX1ZQOV9FTkNfSF9fICovCmRpZmYgLS1naXQgYS9zeXMvdjRsMi9tZXNvbi5idWlsZCBiL3N5cy92NGwyL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZWNjMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi9tZXNvbi5idWlsZApAQCAtMCwwICsxLDU0IEBACit2NGwyX3NvdXJjZXMgPSBbCisgICdnc3R2NGwyLmMnLAorICAnZ3N0djRsMmFsbG9jYXRvci5jJywKKyAgJ2dzdHY0bDJjb2xvcmJhbGFuY2UuYycsCisgICdnc3R2NGwyZGV2aWNlcHJvdmlkZXIuYycsCisgICdnc3R2NGwyb2JqZWN0LmMnLAorICAnZ3N0djRsMmJ1ZmZlcnBvb2wuYycsCisgICdnc3R2NGwyc2luay5jJywKKyAgJ2dzdHY0bDJzcmMuYycsCisgICdnc3R2NGwycmFkaW8uYycsCisgICdnc3R2NGwydHVuZXIuYycsCisgICdnc3R2NGwydHJhbnNmb3JtLmMnLAorICAnZ3N0djRsMnZpZGVvZGVjLmMnLAorICAnZ3N0djRsMnZpZGVvZW5jLmMnLAorICAnZ3N0djRsMmgyNjNlbmMuYycsCisgICdnc3R2NGwyaDI2NGVuYy5jJywKKyAgJ2dzdHY0bDJtcGVnNGVuYy5jJywKKyAgJ2dzdHY0bDJ2aWRvcmllbnQuYycsCisgICdnc3R2NGwydnA4ZW5jLmMnLAorICAnZ3N0djRsMnZwOWVuYy5jJywKKyAgJ3Y0bDJfY2FsbHMuYycsCisgICd2NGwyLXV0aWxzLmMnLAorICAndHVuZXIuYycsCisgICd0dW5lcmNoYW5uZWwuYycsCisgICd0dW5lcm5vcm0uYycKK10KKworY2RhdGEuc2V0KCdHU1RfVjRMMl9FTkFCTEVfUFJPQkUnLCBnZXRfb3B0aW9uKCd2NGwyLXByb2JlJykpCisKK2lmIGNjLmhhc19oZWFkZXIoJ2xpbnV4L3ZpZGVvZGV2Mi5oJykgb3IgY2MuaGFzX2hlYWRlcignc3lzL3ZpZGVvZGV2Mi5oJykgb3IgY2MuaGFzX2hlYWRlcignc3lzL3ZpZGVvaW8uaCcpCisgIG1lc3NhZ2UoJ2J1aWxkaW5nIHY0bDIgcGx1Z2luJykKKyAgY2RhdGEuc2V0KCdIQVZFX0dTVF9WNEwyJywgdHJ1ZSkKKyAgZ3VkZXZfZGVwID0gZGVwZW5kZW5jeSgnZ3VkZXYtMS4wJywgdmVyc2lvbiA6ICc+PTE0NycsIHJlcXVpcmVkIDogZmFsc2UpCisgIGNkYXRhLnNldCgnSEFWRV9HVURFVicsIGd1ZGV2X2RlcC5mb3VuZCgpKQorCisgICMgbGlidjRsMiBpcyBvbmx5IG5lZWRlZCBmb3IgY29udmVydGluZyBzb21lIG9ic2N1cmUgZm9ybWF0cworICAjIEZJWE1FOiBBZGQgYSBmdWxsIGxpc3Qgb2YgdGhlIGZvcm1hdHMgaGVyZQorICBpZiBnZXRfb3B0aW9uKCd3aXRoLWxpYnY0bDInKQorICAgIGxpYnY0bDJfZGVwID0gZGVwZW5kZW5jeSgnbGlidjRsMicsIHJlcXVpcmVkIDogZmFsc2UpCisgICAgY2RhdGEuc2V0KCdIQVZFX0xJQlY0TDInLCBsaWJ2NGwyX2RlcC5mb3VuZCgpKQorICAgIGxpYnY0bDJfZGVwcyA9IFtsaWJ2NGwyX2RlcF0KKyAgZWxzZQorICAgIGxpYnY0bDJfZGVwcyA9IFtdCisgIGVuZGlmCisKKyAgZ3N0djRsMiA9IGxpYnJhcnkoJ2dzdHZpZGVvNGxpbnV4MicsCisgICAgdjRsMl9zb3VyY2VzLAorICAgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luYywgbGlic2luY10sCisgICAgZGVwZW5kZW5jaWVzIDogW2dzdGJhc2VfZGVwLCBnc3R2aWRlb19kZXAsIGdzdGFsbG9jYXRvcnNfZGVwLCBndWRldl9kZXBdICsgbGlidjRsMl9kZXBzLAorICAgIGluc3RhbGwgOiB0cnVlLAorICAgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKyAgKQorZW5kaWYKZGlmZiAtLWdpdCBhL3N5cy92NGwyL3R1bmVyLmMgYi9zeXMvdjRsMi90dW5lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YjNmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi90dW5lci5jCkBAIC0wLDAgKzEsNTUxIEBACisvKiBHU3RyZWFtZXIgVHVuZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKgorICogdHVuZXIuYzogdHVuZXIgZGVzaWduIHZpcnR1YWwgY2xhc3MgZnVuY3Rpb24gd3JhcHBlcnMKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ0dW5lci5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qKgorICogU0VDVElPTjpnc3R0dW5lcgorICogQHNob3J0X2Rlc2NyaXB0aW9uOiBJbnRlcmZhY2UgZm9yIGVsZW1lbnRzIHByb3ZpZGluZyB0dW5lciBvcGVyYXRpb25zCisgKiAKKyAqIDxyZWZzZWN0Mj4KKyAqIDxwYXJhPgorICogVGhlIEdzdFR1bmVyIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIGFiaWxpdHkgdG8KKyAqIHR1bmUgaW50byBtdWx0aXBsZSBpbnB1dCBzaWduYWxzLCBmb3IgZXhhbXBsZSBUViBvciByYWRpbyBjYXB0dXJlIGNhcmRzLgorICogPC9wYXJhPjxwYXJhPgorICogVGhlIGludGVycHJldGF0aW9uIG9mICd0dW5pbmcgaW50bycgYW4gaW5wdXQgc3RyZWFtIGRlcGVuZHMgb24gdGhlIGVsZW1lbnQKKyAqIGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlLiBGb3IgdjRsc3JjLCBpdCBtaWdodCBpbXBseSBzZWxlY3Rpb24gb2YgYW4KKyAqIGlucHV0IHNvdXJjZSBhbmQvb3IgZnJlcXVlbmN5IHRvIGJlIGNvbmZpZ3VyZWQgb24gYSBUViBjYXJkLiBBbm90aGVyIAorICogR3N0VHVuZXIgaW1wbGVtZW50YXRpb24gbWlnaHQgYmUgdG8gYWxsb3cgc2VsZWN0aW9uIG9mIGFuIGFjdGl2ZSBpbnB1dCBwYWQKKyAqIGZyb20gbXVsdGlwbGUgaW5wdXQgcGFkcy4KKyAqIDwvcGFyYT48cGFyYT4KKyAqIFRoYXQgc2FpZCwgdGhlIEdzdFR1bmVyIGludGVyZmFjZSBmdW5jdGlvbnMgYXJlIGJpYXNlZCB0b3dhcmQgdGhlCisgKiBUViBjYXB0dXJlIHNjZW5hcmlvLgorICogPC9wYXJhPjxwYXJhPgorICogVGhlIGdlbmVyYWwgcGFyYW1ldGVycyBwcm92aWRlZCBhcmUgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorICogPGl0ZW1pemVkbGlzdD4KKyAqIDxsaXN0aXRlbT5TZWxlY3Rpb24gb2YgYSBjdXJyZW50ICNHc3RUdW5lckNoYW5uZWwuIFRoZSBjdXJyZW50IGNoYW5uZWwKKyAqIHJlcHJlc2VudHMgdGhlIGlucHV0IHNvdXJjZSAoZS5nLiBDb21wb3NpdGUsIFMtVmlkZW8gZXRjIGZvciBUViBjYXB0dXJlKS4KKyAqIDwvbGlzdGl0ZW0+CisgKiA8bGlzdGl0ZW0+VGhlICNHc3RUdW5lck5vcm0gZm9yIHRoZSBjaGFubmVsLiBUaGUgbm9ybSBjaG9vc2VzIHRoZQorICogaW50ZXJwcmV0YXRpb24gb2YgdGhlIGluY29taW5nIHNpZ25hbCBmb3IgdGhlIGN1cnJlbnQgY2hhbm5lbC4gRm9yIGV4YW1wbGUsCisgKiBQQUwgb3IgTlRTQywgb3IgbW9yZSBzcGVjaWZpYyB2YXJpYW50cyB0aGVyZS1vZi4KKyAqIDwvbGlzdGl0ZW0+CisgKiA8bGlzdGl0ZW0+Q2hhbm5lbCBmcmVxdWVuY3kuIElmIHRoZSBjdXJyZW50IGNoYW5uZWwgaGFzIHRoZSBhYmlsaXR5IHRvIHR1bmUKKyAqIGJldHdlZW4gbXVsdGlwbGUgZnJlcXVlbmNpZXMgKGlmIGl0IGhhcyB0aGUgR1NUX1RVTkVSX0NIQU5ORUxfRlJFUVVFTkNZIGZsYWcpCisgKiB0aGVuIHRoZSBmcmVxdWVuY3kgY2FuIGJlIGNoYW5nZWQvcmV0cmlldmVkIHZpYSB0aGUKKyAqIGdzdF90dW5lcl9zZXRfZnJlcXVlbmN5KCkgYW5kIGdzdF90dW5lcl9nZXRfZnJlcXVlbmN5KCkgbWV0aG9kcy4KKyAqIDwvbGlzdGl0ZW0+CisgKiA8L2l0ZW1pemVkbGlzdD4KKyAqIDwvcGFyYT4KKyAqIDxwYXJhPgorICogV2hlcmUgYXBwbGljYWJsZSwgdGhlIHNpZ25hbCBzdHJlbmd0aCBjYW4gYmUgcmV0cmlldmVkIGFuZC9vciBtb25pdG9yZWQKKyAqIHZpYSBhIHNpZ25hbC4KKyAqIDwvcGFyYT4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworLyogRklYTUUgMC4xMTogY2hlY2sgaWYgd2UgbmVlZCB0byBhZGQgQVBJIGZvciBzb21ldGltZXMtc3VwcG9ydGVkbmVzcworICogKGFrYSBtYWtpbmcgdXAgZm9yIEdzdEltcGxlbWVudHNJbnRlcmZhY2UgcmVtb3ZhbCkgKi8KKworLyogRklYTUUgMC4xMTogcmVwbGFjZSBzaWduYWxzIHdpdGggbWVzc2FnZXMgKCsgbWFrZSBBUEkgdGhyZWFkLXNhZmUpICovCisKK2VudW0KK3sKKyAgTk9STV9DSEFOR0VELAorICBDSEFOTkVMX0NIQU5HRUQsCisgIEZSRVFVRU5DWV9DSEFOR0VELAorICBTSUdOQUxfQ0hBTkdFRCwKKyAgTEFTVF9TSUdOQUwKK307CisKK3N0YXRpYyBndWludCBnc3RfdHVuZXJfc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsKKworR19ERUZJTkVfSU5URVJGQUNFIChHc3RUdW5lciwgZ3N0X3R1bmVyLCBHX1RZUEVfSU5WQUxJRCk7CisKK3N0YXRpYyB2b2lkCitnc3RfdHVuZXJfZGVmYXVsdF9pbml0IChHc3RUdW5lckludGVyZmFjZSAqIGlmYWNlKQoreworICBzdGF0aWMgZ2Jvb2xlYW4gaW5pdGlhbGl6ZWQgPSBGQUxTRTsKKworICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgLyoqCisgICAgICogR3N0VHVuZXI6Om5vcm0tY2hhbmdlZDoKKyAgICAgKiBAdHVuZXI6IFRoZSBlbGVtZW50IHByb3ZpZGluZyB0aGUgR3N0VHVuZXIgaW50ZXJmYWNlCisgICAgICogQG5vcm06IFRoZSBuZXcgY29uZmlndXJlZCBub3JtLgorICAgICAqCisgICAgICogUmVwb3J0cyB0aGF0IHRoZSBjdXJyZW50ICNHc3RUdW5lck5vcm0gaGFzIGNoYW5nZWQuCisgICAgICovCisgICAgZ3N0X3R1bmVyX3NpZ25hbHNbTk9STV9DSEFOR0VEXSA9CisgICAgICAgIGdfc2lnbmFsX25ldyAoIm5vcm0tY2hhbmdlZCIsCisgICAgICAgIEdTVF9UWVBFX1RVTkVSLCBHX1NJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgR19TVFJVQ1RfT0ZGU0VUIChHc3RUdW5lckludGVyZmFjZSwgbm9ybV9jaGFuZ2VkKSwKKyAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX09CSkVDVCwgR19UWVBFX05PTkUsIDEsIEdTVF9UWVBFX1RVTkVSX05PUk0pOworICAgIC8qKgorICAgICAqIEdzdFR1bmVyOjpjaGFubmVsLWNoYW5nZWQ6CisgICAgICogQHR1bmVyOiBUaGUgZWxlbWVudCBwcm92aWRpbmcgdGhlIEdzdFR1bmVyIGludGVyZmFjZQorICAgICAqIEBjaGFubmVsOiBUaGUgbmV3IGNvbmZpZ3VyZWQgY2hhbm5lbC4KKyAgICAgKgorICAgICAqIFJlcG9ydHMgdGhhdCB0aGUgY3VycmVudCAjR3N0VHVuZXJDaGFubmVsIGhhcyBjaGFuZ2VkLgorICAgICAqLworICAgIGdzdF90dW5lcl9zaWduYWxzW0NIQU5ORUxfQ0hBTkdFRF0gPQorICAgICAgICBnX3NpZ25hbF9uZXcgKCJjaGFubmVsLWNoYW5nZWQiLAorICAgICAgICBHU1RfVFlQRV9UVU5FUiwgR19TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgIEdfU1RSVUNUX09GRlNFVCAoR3N0VHVuZXJJbnRlcmZhY2UsIGNoYW5uZWxfY2hhbmdlZCksCisgICAgICAgIE5VTEwsIE5VTEwsCisgICAgICAgIGdfY2Nsb3N1cmVfbWFyc2hhbF9WT0lEX19PQkpFQ1QsIEdfVFlQRV9OT05FLCAxLAorICAgICAgICBHU1RfVFlQRV9UVU5FUl9DSEFOTkVMKTsKKyAgICAvKioKKyAgICAgKiBHc3RUdW5lcjo6ZnJlcXVlbmN5LWNoYW5nZWQ6CisgICAgICogQHR1bmVyOiBUaGUgZWxlbWVudCBwcm92aWRpbmcgdGhlIEdzdFR1bmVyIGludGVyZmFjZQorICAgICAqIEBmcmVxdWVuY3k6IFRoZSBuZXcgZnJlcXVlbmN5IChhbiB1bnNpZ25lZCBsb25nKQorICAgICAqCisgICAgICogUmVwb3J0cyB0aGF0IHRoZSBjdXJyZW50IGZyZXF1ZW5jeSBoYXMgY2hhbmdlZC4KKyAgICAgKi8KKyAgICBnc3RfdHVuZXJfc2lnbmFsc1tGUkVRVUVOQ1lfQ0hBTkdFRF0gPQorICAgICAgICBnX3NpZ25hbF9uZXcgKCJmcmVxdWVuY3ktY2hhbmdlZCIsCisgICAgICAgIEdTVF9UWVBFX1RVTkVSLCBHX1NJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgR19TVFJVQ1RfT0ZGU0VUIChHc3RUdW5lckludGVyZmFjZSwgZnJlcXVlbmN5X2NoYW5nZWQpLAorICAgICAgICBOVUxMLCBOVUxMLAorICAgICAgICBnX2NjbG9zdXJlX21hcnNoYWxfZ2VuZXJpYywgR19UWVBFX05PTkUsIDIsIEdTVF9UWVBFX1RVTkVSX0NIQU5ORUwsCisgICAgICAgIEdfVFlQRV9VTE9ORyk7CisgICAgLyoqCisgICAgICogR3N0VHVuZXI6OnNpZ25hbC1jaGFuZ2VkOgorICAgICAqIEB0dW5lcjogVGhlIGVsZW1lbnQgcHJvdmlkaW5nIHRoZSBHc3RUdW5lciBpbnRlcmZhY2UKKyAgICAgKiBAY2hhbm5lbDogVGhlIGN1cnJlbnQgI0dzdFR1bmVyQ2hhbm5lbAorICAgICAqIEBzaWduYWw6IFRoZSBuZXcgc2lnbmFsIHN0cmVuZ3RoIChhbiBpbnRlZ2VyKQorICAgICAqCisgICAgICogUmVwb3J0cyB0aGF0IHRoZSBzaWduYWwgc3RyZW5ndGggaGFzIGNoYW5nZWQuCisgICAgICoKKyAgICAgKiBTZWUgQWxzbzogZ3N0X3R1bmVyX3NpZ25hbF9zdHJlbmd0aCgpCisgICAgICovCisgICAgZ3N0X3R1bmVyX3NpZ25hbHNbU0lHTkFMX0NIQU5HRURdID0KKyAgICAgICAgZ19zaWduYWxfbmV3ICgic2lnbmFsLWNoYW5nZWQiLAorICAgICAgICBHU1RfVFlQRV9UVU5FUiwgR19TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgIEdfU1RSVUNUX09GRlNFVCAoR3N0VHVuZXJJbnRlcmZhY2UsIHNpZ25hbF9jaGFuZ2VkKSwKKyAgICAgICAgTlVMTCwgTlVMTCwKKyAgICAgICAgZ19jY2xvc3VyZV9tYXJzaGFsX2dlbmVyaWMsIEdfVFlQRV9OT05FLCAyLCBHU1RfVFlQRV9UVU5FUl9DSEFOTkVMLAorICAgICAgICBHX1RZUEVfSU5UKTsKKworICAgIGluaXRpYWxpemVkID0gVFJVRTsKKyAgfQorCisgIC8qIGRlZmF1bHQgdmlydHVhbCBmdW5jdGlvbnMgKi8KKyAgaWZhY2UtPmxpc3RfY2hhbm5lbHMgPSBOVUxMOworICBpZmFjZS0+c2V0X2NoYW5uZWwgPSBOVUxMOworICBpZmFjZS0+Z2V0X2NoYW5uZWwgPSBOVUxMOworCisgIGlmYWNlLT5saXN0X25vcm1zID0gTlVMTDsKKyAgaWZhY2UtPnNldF9ub3JtID0gTlVMTDsKKyAgaWZhY2UtPmdldF9ub3JtID0gTlVMTDsKKworICBpZmFjZS0+c2V0X2ZyZXF1ZW5jeSA9IE5VTEw7CisgIGlmYWNlLT5nZXRfZnJlcXVlbmN5ID0gTlVMTDsKKyAgaWZhY2UtPnNpZ25hbF9zdHJlbmd0aCA9IE5VTEw7Cit9CisKKy8qKgorICogZ3N0X3R1bmVyX2xpc3RfY2hhbm5lbHM6CisgKiBAdHVuZXI6IHRoZSAjR3N0VHVuZXIgKGEgI0dzdEVsZW1lbnQpIHRvIGdldCB0aGUgY2hhbm5lbHMgZnJvbS4KKyAqCisgKiBSZXRyaWV2ZSBhICNHTGlzdCBvZiAjR3N0VHVuZXJDaGFubmVscyBhdmFpbGFibGUKKyAqIChlLmcuICdjb21wb3NpdGUnLCAncy12aWRlbycsIC4uLikgZnJvbSB0aGUgZ2l2ZW4gdHVuZXIgb2JqZWN0LgorICoKKyAqIFJldHVybnM6IEEgbGlzdCBvZiBjaGFubmVscyBhdmFpbGFibGUgb24gdGhpcyB0dW5lci4gVGhlIGxpc3QgaXMKKyAqICAgICAgICAgIG93bmVkIGJ5IHRoZSBHc3RUdW5lciBhbmQgbXVzdCBub3QgYmUgZnJlZWQuCisgKi8KK2NvbnN0IEdMaXN0ICoKK2dzdF90dW5lcl9saXN0X2NoYW5uZWxzIChHc3RUdW5lciAqIHR1bmVyKQoreworICBHc3RUdW5lckludGVyZmFjZSAqaWZhY2U7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19UVU5FUiAodHVuZXIpLCBOVUxMKTsKKworICBpZmFjZSA9IEdTVF9UVU5FUl9HRVRfSU5URVJGQUNFICh0dW5lcik7CisgIGlmIChpZmFjZS0+bGlzdF9jaGFubmVscykgeworICAgIHJldHVybiBpZmFjZS0+bGlzdF9jaGFubmVscyAodHVuZXIpOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogZ3N0X3R1bmVyX3NldF9jaGFubmVsOgorICogQHR1bmVyOiB0aGUgI0dzdFR1bmVyIChhICNHc3RFbGVtZW50KSB0aGF0IG93bnMgdGhlIGNoYW5uZWwuCisgKiBAY2hhbm5lbDogdGhlIGNoYW5uZWwgdG8gdHVuZSB0by4KKyAqCisgKiBUdW5lcyB0aGUgb2JqZWN0IHRvIHRoZSBnaXZlbiBjaGFubmVsLCB3aGljaCBzaG91bGQgYmUgb25lIG9mIHRoZQorICogY2hhbm5lbHMgcmV0dXJuZWQgYnkgZ3N0X3R1bmVyX2xpc3RfY2hhbm5lbHMoKS4KKyAqLworCit2b2lkCitnc3RfdHVuZXJfc2V0X2NoYW5uZWwgKEdzdFR1bmVyICogdHVuZXIsIEdzdFR1bmVyQ2hhbm5lbCAqIGNoYW5uZWwpCit7CisgIEdzdFR1bmVySW50ZXJmYWNlICppZmFjZTsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfVFVORVIgKHR1bmVyKSk7CisKKyAgaWZhY2UgPSBHU1RfVFVORVJfR0VUX0lOVEVSRkFDRSAodHVuZXIpOworICBpZiAoaWZhY2UtPnNldF9jaGFubmVsKSB7CisgICAgaWZhY2UtPnNldF9jaGFubmVsICh0dW5lciwgY2hhbm5lbCk7CisgIH0KK30KKworLyoqCisgKiBnc3RfdHVuZXJfZ2V0X2NoYW5uZWw6CisgKiBAdHVuZXI6IHRoZSAjR3N0VHVuZXIgKGEgI0dzdEVsZW1lbnQpIHRvIGdldCB0aGUgY3VycmVudCBjaGFubmVsIGZyb20uCisgKgorICogUmV0cmlldmUgdGhlIGN1cnJlbnQgY2hhbm5lbCBmcm9tIHRoZSB0dW5lci4KKyAqCisgKiBSZXR1cm5zOiB0aGUgY3VycmVudCBjaGFubmVsIG9mIHRoZSB0dW5lciBvYmplY3QuCisgKi8KKworR3N0VHVuZXJDaGFubmVsICoKK2dzdF90dW5lcl9nZXRfY2hhbm5lbCAoR3N0VHVuZXIgKiB0dW5lcikKK3sKKyAgR3N0VHVuZXJJbnRlcmZhY2UgKmlmYWNlOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfVFVORVIgKHR1bmVyKSwgTlVMTCk7CisKKyAgaWZhY2UgPSBHU1RfVFVORVJfR0VUX0lOVEVSRkFDRSAodHVuZXIpOworICBpZiAoaWZhY2UtPmdldF9jaGFubmVsKSB7CisgICAgcmV0dXJuIGlmYWNlLT5nZXRfY2hhbm5lbCAodHVuZXIpOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogZ3N0X3R1bmVyX2xpc3Rfbm9ybXM6CisgKiBAdHVuZXI6IHRoZSAjR3N0VHVuZXIgKCphICNHc3RFbGVtZW50KSB0byBnZXQgdGhlIGxpc3Qgb2Ygbm9ybXMgZnJvbS4KKyAqCisgKiBSZXRyaWV2ZSBhIEdMaXN0IG9mIGF2YWlsYWJsZSAjR3N0VHVuZXJOb3JtIHNldHRpbmdzIGZvciB0aGUgY3VycmVudGx5CisgKiB0dW5lZCBjaGFubmVsIG9uIHRoZSBnaXZlbiB0dW5lciBvYmplY3QuCisgKgorICogUmV0dXJuczogQSBsaXN0IG9mIG5vcm1zIGF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBjaGFubmVsIGZvciB0aGlzCisgKiAgICAgICAgICB0dW5lciBvYmplY3QuIFRoZSBsaXN0IGlzIG93bmVkIGJ5IHRoZSBHc3RUdW5lciBhbmQgbXVzdCBub3QKKyAqICAgICAgICAgIGJlIGZyZWVkLgorICovCisKK2NvbnN0IEdMaXN0ICoKK2dzdF90dW5lcl9saXN0X25vcm1zIChHc3RUdW5lciAqIHR1bmVyKQoreworICBHc3RUdW5lckludGVyZmFjZSAqaWZhY2U7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19UVU5FUiAodHVuZXIpLCBOVUxMKTsKKworICBpZmFjZSA9IEdTVF9UVU5FUl9HRVRfSU5URVJGQUNFICh0dW5lcik7CisgIGlmIChpZmFjZS0+bGlzdF9ub3JtcykgeworICAgIHJldHVybiBpZmFjZS0+bGlzdF9ub3JtcyAodHVuZXIpOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogZ3N0X3R1bmVyX3NldF9ub3JtOgorICogQHR1bmVyOiB0aGUgI0dzdFR1bmVyIChhICNHc3RFbGVtZW50KSB0byBzZXQgdGhlIG5vcm0gb24uCisgKiBAbm9ybTogdGhlIG5vcm0gdG8gdXNlIGZvciB0aGUgY3VycmVudCBjaGFubmVsLgorICoKKyAqIENoYW5nZXMgdGhlIHZpZGVvIG5vcm0gb24gdGhpcyB0dW5lciB0byB0aGUgZ2l2ZW4gbm9ybSwgd2hpY2ggc2hvdWxkIGJlCisgKiBvbmUgb2YgdGhlIG5vcm1zIHJldHVybmVkIGJ5IGdzdF90dW5lcl9saXN0X25vcm1zKCkuCisgKi8KKwordm9pZAorZ3N0X3R1bmVyX3NldF9ub3JtIChHc3RUdW5lciAqIHR1bmVyLCBHc3RUdW5lck5vcm0gKiBub3JtKQoreworICBHc3RUdW5lckludGVyZmFjZSAqaWZhY2U7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1RVTkVSICh0dW5lcikpOworCisgIGlmYWNlID0gR1NUX1RVTkVSX0dFVF9JTlRFUkZBQ0UgKHR1bmVyKTsKKyAgaWYgKGlmYWNlLT5zZXRfbm9ybSkgeworICAgIGlmYWNlLT5zZXRfbm9ybSAodHVuZXIsIG5vcm0pOworICB9Cit9CisKKy8qKgorICogZ3N0X3R1bmVyX2dldF9ub3JtOgorICogQHR1bmVyOiB0aGUgI0dzdFR1bmVyIChhICNHc3RFbGVtZW50KSB0byBnZXQgdGhlIGN1cnJlbnQgbm9ybSBmcm9tLgorICoKKyAqIEdldCB0aGUgY3VycmVudCB2aWRlbyBub3JtIGZyb20gdGhlIGdpdmVuIHR1bmVyIG9iamVjdCBmb3IgdGhlCisgKiBjdXJyZW50bHkgc2VsZWN0ZWQgY2hhbm5lbC4KKyAqCisgKiBSZXR1cm5zOiB0aGUgY3VycmVudCBub3JtLgorICovCisKK0dzdFR1bmVyTm9ybSAqCitnc3RfdHVuZXJfZ2V0X25vcm0gKEdzdFR1bmVyICogdHVuZXIpCit7CisgIEdzdFR1bmVySW50ZXJmYWNlICppZmFjZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX1RVTkVSICh0dW5lciksIE5VTEwpOworCisgIGlmYWNlID0gR1NUX1RVTkVSX0dFVF9JTlRFUkZBQ0UgKHR1bmVyKTsKKyAgaWYgKGlmYWNlLT5nZXRfbm9ybSkgeworICAgIHJldHVybiBpZmFjZS0+Z2V0X25vcm0gKHR1bmVyKTsKKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIGdzdF90dW5lcl9zZXRfZnJlcXVlbmN5OgorICogQHR1bmVyOiBUaGUgI0dzdFR1bmVyIChhICNHc3RFbGVtZW50KSB0aGF0IG93bnMgdGhlIGdpdmVuIGNoYW5uZWwuCisgKiBAY2hhbm5lbDogVGhlICNHc3RUdW5lckNoYW5uZWwgdG8gc2V0IHRoZSBmcmVxdWVuY3kgb24uCisgKiBAZnJlcXVlbmN5OiBUaGUgZnJlcXVlbmN5IHRvIHR1bmUgaW4gdG8uCisgKgorICogU2V0cyBhIHR1bmluZyBmcmVxdWVuY3kgb24gdGhlIGdpdmVuIHR1bmVyL2NoYW5uZWwuIE5vdGUgdGhhdCB0aGlzCisgKiByZXF1aXJlcyB0aGUgZ2l2ZW4gY2hhbm5lbCB0byBiZSBhICJ0dW5pbmciIGNoYW5uZWwsIHdoaWNoIGNhbiBiZQorICogY2hlY2tlZCB1c2luZyBHU1RfVFVORVJfQ0hBTk5FTF9IQVNfRkxBRyAoKSwgd2l0aCB0aGUgcHJvcGVyIGZsYWcKKyAqIGJlaW5nIEdTVF9UVU5FUl9DSEFOTkVMX0ZSRVFVRU5DWS4KKyAqCisgKiBUaGUgZnJlcXVlbmN5IGlzIGluIEh6LCB3aXRoIG1pbmltdW0gc3RlcHMgaW5kaWNhdGVkIGJ5IHRoZSAKKyAqIGZyZXF1ZW5jeV9tdWx0aXBsaWNhdG9yIHByb3ZpZGVkIGluIHRoZSAjR3N0VHVuZXJDaGFubmVsLiBUaGUKKyAqIHZhbGlkIHJhbmdlIGlzIHByb3ZpZGVkIGluIHRoZSBtaW5fZnJlcXVlbmN5IGFuZCBtYXhfZnJlcXVlbmN5IHByb3BlcnRpZXMKKyAqIG9mIHRoZSAjR3N0VHVuZXJDaGFubmVsLgorICovCisKK3ZvaWQKK2dzdF90dW5lcl9zZXRfZnJlcXVlbmN5IChHc3RUdW5lciAqIHR1bmVyLAorICAgIEdzdFR1bmVyQ2hhbm5lbCAqIGNoYW5uZWwsIGd1bG9uZyBmcmVxdWVuY3kpCit7CisgIEdzdFR1bmVySW50ZXJmYWNlICppZmFjZTsKKworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfVFVORVIgKHR1bmVyKSk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19UVU5FUl9DSEFOTkVMIChjaGFubmVsKSk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9UVU5FUl9DSEFOTkVMX0hBU19GTEFHIChjaGFubmVsLAorICAgICAgICAgIEdTVF9UVU5FUl9DSEFOTkVMX0ZSRVFVRU5DWSkpOworCisgIGlmYWNlID0gR1NUX1RVTkVSX0dFVF9JTlRFUkZBQ0UgKHR1bmVyKTsKKyAgaWYgKGlmYWNlLT5zZXRfZnJlcXVlbmN5KSB7CisgICAgaWZhY2UtPnNldF9mcmVxdWVuY3kgKHR1bmVyLCBjaGFubmVsLCBmcmVxdWVuY3kpOworICB9Cit9CisKKy8qKgorICogZ3N0X3R1bmVyX2dldF9mcmVxdWVuY3k6CisgKiBAdHVuZXI6IFRoZSAjR3N0VHVuZXIgKGEgI0dzdEVsZW1lbnQpIHRoYXQgb3ducyB0aGUgZ2l2ZW4gY2hhbm5lbC4KKyAqIEBjaGFubmVsOiBUaGUgI0dzdFR1bmVyQ2hhbm5lbCB0byByZXRyaWV2ZSB0aGUgZnJlcXVlbmN5IGZyb20uCisgKgorICogUmV0cmlldmUgdGhlIGN1cnJlbnQgZnJlcXVlbmN5IGZyb20gdGhlIGdpdmVuIGNoYW5uZWwuIEFzIGZvcgorICogZ3N0X3R1bmVyX3NldF9mcmVxdWVuY3koKSwgdGhlICNHc3RUdW5lckNoYW5uZWwgbXVzdCBzdXBwb3J0IGZyZXF1ZW5jeQorICogb3BlcmF0aW9ucywgYXMgaW5kaWNhdGVkIGJ5IHRoZSBHU1RfVFVORVJfQ0hBTk5FTF9GUkVRVUVOQ1kgZmxhZy4KKyAqCisgKiBSZXR1cm5zOiBUaGUgY3VycmVudCBmcmVxdWVuY3ksIG9yIDAgb24gZXJyb3IuCisgKi8KKworZ3Vsb25nCitnc3RfdHVuZXJfZ2V0X2ZyZXF1ZW5jeSAoR3N0VHVuZXIgKiB0dW5lciwgR3N0VHVuZXJDaGFubmVsICogY2hhbm5lbCkKK3sKKyAgR3N0VHVuZXJJbnRlcmZhY2UgKmlmYWNlOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfVFVORVIgKHR1bmVyKSwgMCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfVFVORVJfQ0hBTk5FTCAoY2hhbm5lbCksIDApOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX1RVTkVSX0NIQU5ORUxfSEFTX0ZMQUcgKGNoYW5uZWwsCisgICAgICAgICAgR1NUX1RVTkVSX0NIQU5ORUxfRlJFUVVFTkNZKSwgMCk7CisKKyAgaWZhY2UgPSBHU1RfVFVORVJfR0VUX0lOVEVSRkFDRSAodHVuZXIpOworCisgIGlmIChpZmFjZS0+Z2V0X2ZyZXF1ZW5jeSkgeworICAgIHJldHVybiBpZmFjZS0+Z2V0X2ZyZXF1ZW5jeSAodHVuZXIsIGNoYW5uZWwpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogZ3N0X3R1bmVyX3NpZ25hbF9zdHJlbmd0aDoKKyAqIEB0dW5lcjogdGhlICNHc3RUdW5lciAoYSAjR3N0RWxlbWVudCkgdGhhdCBvd25zIHRoZSBnaXZlbiBjaGFubmVsLgorICogQGNoYW5uZWw6IHRoZSAjR3N0VHVuZXJDaGFubmVsIHRvIGdldCB0aGUgc2lnbmFsIHN0cmVuZ3RoIGZyb20uCisgKgorICogR2V0IHRoZSBzdHJlbmd0aCBvZiB0aGUgc2lnbmFsIG9uIHRoaXMgY2hhbm5lbC4gTm90ZSB0aGF0IHRoaXMKKyAqIHJlcXVpcmVzIHRoZSBjdXJyZW50IGNoYW5uZWwgdG8gYmUgYSAidHVuaW5nIiBjaGFubmVsLCBpLmUuIGEKKyAqIGNoYW5uZWwgb24gd2hpY2ggZnJlcXVlbmN5IGNhbiBiZSBzZXQuIFRoaXMgY2FuIGJlIGNoZWNrZWQgdXNpbmcKKyAqIEdTVF9UVU5FUl9DSEFOTkVMX0hBU19GTEFHICgpLCBhbmQgdGhlIGFwcHJvcHJpYXRlIGZsYWcgdG8gY2hlY2sKKyAqIGZvciBpcyBHU1RfVFVORVJfQ0hBTk5FTF9GUkVRVUVOQ1kuCisgKgorICogVGhlIHZhbGlkIHJhbmdlIG9mIHRoZSBzaWduYWwgc3RyZW5ndGggaXMgaW5kaWNhdGVkIGluIHRoZSAKKyAqIG1pbl9zaWduYWwgYW5kIG1heF9zaWduYWwgcHJvcGVydGllcyBvZiB0aGUgI0dzdFR1bmVyQ2hhbm5lbC4KKyAqCisgKiBSZXR1cm5zOiBTaWduYWwgc3RyZW5ndGgsIG9yIDAgb24gZXJyb3IuCisgKi8KK2dpbnQKK2dzdF90dW5lcl9zaWduYWxfc3RyZW5ndGggKEdzdFR1bmVyICogdHVuZXIsIEdzdFR1bmVyQ2hhbm5lbCAqIGNoYW5uZWwpCit7CisgIEdzdFR1bmVySW50ZXJmYWNlICppZmFjZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX1RVTkVSICh0dW5lciksIDApOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX1RVTkVSX0NIQU5ORUwgKGNoYW5uZWwpLCAwKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9UVU5FUl9DSEFOTkVMX0hBU19GTEFHIChjaGFubmVsLAorICAgICAgICAgIEdTVF9UVU5FUl9DSEFOTkVMX0ZSRVFVRU5DWSksIDApOworCisgIGlmYWNlID0gR1NUX1RVTkVSX0dFVF9JTlRFUkZBQ0UgKHR1bmVyKTsKKyAgaWYgKGlmYWNlLT5zaWduYWxfc3RyZW5ndGgpIHsKKyAgICByZXR1cm4gaWZhY2UtPnNpZ25hbF9zdHJlbmd0aCAodHVuZXIsIGNoYW5uZWwpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogZ3N0X3R1bmVyX2ZpbmRfbm9ybV9ieV9uYW1lOgorICogQHR1bmVyOiBBICNHc3RUdW5lciBpbnN0YW5jZQorICogQG5vcm06IEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgYSAjR3N0VHVuZXJOb3JtCisgKiAKKyAqIExvb2sgdXAgYSAjR3N0VHVuZXJOb3JtIGJ5IG5hbWUuCisgKgorICogUmV0dXJuczogQSAjR3N0VHVuZXJOb3JtLCBvciBOVUxMIGlmIG5vIG5vcm0gd2l0aCB0aGUgcHJvdmlkZWQgbmFtZQorICogaXMgYXZhaWxhYmxlLgorICovCitHc3RUdW5lck5vcm0gKgorZ3N0X3R1bmVyX2ZpbmRfbm9ybV9ieV9uYW1lIChHc3RUdW5lciAqIHR1bmVyLCBnY2hhciAqIG5vcm0pCit7CisgIEdMaXN0ICp3YWxrOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfVFVORVIgKHR1bmVyKSwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChub3JtICE9IE5VTEwsIE5VTEwpOworCisgIHdhbGsgPSAoR0xpc3QgKikgZ3N0X3R1bmVyX2xpc3Rfbm9ybXMgKHR1bmVyKTsKKyAgd2hpbGUgKHdhbGspIHsKKyAgICBpZiAoc3RyY21wIChHU1RfVFVORVJfTk9STSAod2Fsay0+ZGF0YSktPmxhYmVsLCBub3JtKSA9PSAwKQorICAgICAgcmV0dXJuIEdTVF9UVU5FUl9OT1JNICh3YWxrLT5kYXRhKTsKKyAgICB3YWxrID0gZ19saXN0X25leHQgKHdhbGspOworICB9CisgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIGdzdF90dW5lcl9maW5kX2NoYW5uZWxfYnlfbmFtZToKKyAqIEB0dW5lcjogQSAjR3N0VHVuZXIgaW5zdGFuY2UKKyAqIEBjaGFubmVsOiBBIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIGEgI0dzdFR1bmVyQ2hhbm5lbAorICogCisgKiBMb29rIHVwIGEgI0dzdFR1bmVyQ2hhbm5lbCBieSBuYW1lLgorICoKKyAqIFJldHVybnM6IEEgI0dzdFR1bmVyQ2hhbm5lbCwgb3IgTlVMTCBpZiBubyBjaGFubmVsIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUKKyAqIGlzIGF2YWlsYWJsZS4KKyAqLworR3N0VHVuZXJDaGFubmVsICoKK2dzdF90dW5lcl9maW5kX2NoYW5uZWxfYnlfbmFtZSAoR3N0VHVuZXIgKiB0dW5lciwgZ2NoYXIgKiBjaGFubmVsKQoreworICBHTGlzdCAqd2FsazsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX1RVTkVSICh0dW5lciksIE5VTEwpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoY2hhbm5lbCAhPSBOVUxMLCBOVUxMKTsKKworICB3YWxrID0gKEdMaXN0ICopIGdzdF90dW5lcl9saXN0X2NoYW5uZWxzICh0dW5lcik7CisgIHdoaWxlICh3YWxrKSB7CisgICAgaWYgKHN0cmNtcCAoR1NUX1RVTkVSX0NIQU5ORUwgKHdhbGstPmRhdGEpLT5sYWJlbCwgY2hhbm5lbCkgPT0gMCkKKyAgICAgIHJldHVybiBHU1RfVFVORVJfQ0hBTk5FTCAod2Fsay0+ZGF0YSk7CisgICAgd2FsayA9IGdfbGlzdF9uZXh0ICh3YWxrKTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBnc3RfdHVuZXJfY2hhbm5lbF9jaGFuZ2VkOgorICogQHR1bmVyOiBBICNHc3RUdW5lciBpbnN0YW5jZQorICogQGNoYW5uZWw6IEEgI0dzdFR1bmVyQ2hhbm5lbCBpbnN0YW5jZQorICoKKyAqIENhbGxlZCBieSBlbGVtZW50cyBpbXBsZW1lbnRpbmcgdGhlICNHc3RUdW5lciBpbnRlcmZhY2Ugd2hlbiB0aGUKKyAqIGN1cnJlbnQgY2hhbm5lbCBjaGFuZ2VzLiBGaXJlcyB0aGUgI0dzdFR1bmVyOjpjaGFubmVsLWNoYW5nZWQgc2lnbmFsLgorICovCit2b2lkCitnc3RfdHVuZXJfY2hhbm5lbF9jaGFuZ2VkIChHc3RUdW5lciAqIHR1bmVyLCBHc3RUdW5lckNoYW5uZWwgKiBjaGFubmVsKQoreworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfVFVORVIgKHR1bmVyKSk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19UVU5FUl9DSEFOTkVMIChjaGFubmVsKSk7CisKKyAgZ19zaWduYWxfZW1pdCAoR19PQkpFQ1QgKHR1bmVyKSwKKyAgICAgIGdzdF90dW5lcl9zaWduYWxzW0NIQU5ORUxfQ0hBTkdFRF0sIDAsIGNoYW5uZWwpOworfQorCisvKioKKyAqIGdzdF90dW5lcl9ub3JtX2NoYW5nZWQ6CisgKiBAdHVuZXI6IEEgI0dzdFR1bmVyIGluc3RhbmNlCisgKiBAbm9ybTogQSAjR3N0VHVuZXJOb3JtIGluc3RhbmNlCisgKgorICogQ2FsbGVkIGJ5IGVsZW1lbnRzIGltcGxlbWVudGluZyB0aGUgI0dzdFR1bmVyIGludGVyZmFjZSB3aGVuIHRoZQorICogY3VycmVudCBub3JtIGNoYW5nZXMuIEZpcmVzIHRoZSAjR3N0VHVuZXI6Om5vcm0tY2hhbmdlZCBzaWduYWwuCisgKiAKKyAqLwordm9pZAorZ3N0X3R1bmVyX25vcm1fY2hhbmdlZCAoR3N0VHVuZXIgKiB0dW5lciwgR3N0VHVuZXJOb3JtICogbm9ybSkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1RVTkVSICh0dW5lcikpOworICBnX3JldHVybl9pZl9mYWlsIChHU1RfSVNfVFVORVJfTk9STSAobm9ybSkpOworCisgIGdfc2lnbmFsX2VtaXQgKEdfT0JKRUNUICh0dW5lciksIGdzdF90dW5lcl9zaWduYWxzW05PUk1fQ0hBTkdFRF0sIDAsIG5vcm0pOworfQorCisvKioKKyAqIGdzdF90dW5lcl9mcmVxdWVuY3lfY2hhbmdlZDoKKyAqIEB0dW5lcjogQSAjR3N0VHVuZXIgaW5zdGFuY2UKKyAqIEBjaGFubmVsOiBUaGUgY3VycmVudCAjR3N0VHVuZXJDaGFubmVsCisgKiBAZnJlcXVlbmN5OiBUaGUgbmV3IGZyZXF1ZW5jeSBzZXR0aW5nCisgKgorICogQ2FsbGVkIGJ5IGVsZW1lbnRzIGltcGxlbWVudGluZyB0aGUgI0dzdFR1bmVyIGludGVyZmFjZSB3aGVuIHRoZQorICogY29uZmlndXJlZCBmcmVxdWVuY3kgY2hhbmdlcy4gRmlyZXMgdGhlICNHc3RUdW5lcjo6ZnJlcXVlbmN5LWNoYW5nZWQKKyAqIHNpZ25hbCBvbiB0aGUgdHVuZXIsIGFuZCB0aGUgI0dzdFR1bmVyQ2hhbm5lbDo6ZnJlcXVlbmN5LWNoYW5nZWQgc2lnbmFsCisgKiBvbiB0aGUgY2hhbm5lbC4KKyAqLwordm9pZAorZ3N0X3R1bmVyX2ZyZXF1ZW5jeV9jaGFuZ2VkIChHc3RUdW5lciAqIHR1bmVyLAorICAgIEdzdFR1bmVyQ2hhbm5lbCAqIGNoYW5uZWwsIGd1bG9uZyBmcmVxdWVuY3kpCit7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19UVU5FUiAodHVuZXIpKTsKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1RVTkVSX0NIQU5ORUwgKGNoYW5uZWwpKTsKKworICBnX3NpZ25hbF9lbWl0IChHX09CSkVDVCAodHVuZXIpLAorICAgICAgZ3N0X3R1bmVyX3NpZ25hbHNbRlJFUVVFTkNZX0NIQU5HRURdLCAwLCBjaGFubmVsLCBmcmVxdWVuY3kpOworCisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAoR19PQkpFQ1QgKGNoYW5uZWwpLCAiZnJlcXVlbmN5X2NoYW5nZWQiLCBmcmVxdWVuY3kpOworfQorCisvKioKKyAqIGdzdF90dW5lcl9zaWduYWxfY2hhbmdlZDoKKyAqIEB0dW5lcjogQSAjR3N0VHVuZXIgaW5zdGFuY2UKKyAqIEBjaGFubmVsOiBUaGUgY3VycmVudCAjR3N0VHVuZXJDaGFubmVsCisgKiBAc2lnbmFsOiBUaGUgbmV3IHNpZ25hbCBzdHJlbmd0aAorICoKKyAqIENhbGxlZCBieSBlbGVtZW50cyBpbXBsZW1lbnRpbmcgdGhlICNHc3RUdW5lciBpbnRlcmZhY2Ugd2hlbiB0aGUKKyAqIGluY29taW5nIHNpZ25hbCBzdHJlbmd0aCBjaGFuZ2VzLiBGaXJlcyB0aGUgI0dzdFR1bmVyOjpzaWduYWwtY2hhbmdlZAorICogc2lnbmFsIG9uIHRoZSB0dW5lciBhbmQgdGhlICNHc3RUdW5lckNoYW5uZWw6OnNpZ25hbC1jaGFuZ2VkIHNpZ25hbCBvbiAKKyAqIHRoZSBjaGFubmVsLgorICovCit2b2lkCitnc3RfdHVuZXJfc2lnbmFsX2NoYW5nZWQgKEdzdFR1bmVyICogdHVuZXIsCisgICAgR3N0VHVuZXJDaGFubmVsICogY2hhbm5lbCwgZ2ludCBzaWduYWwpCit7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKEdTVF9JU19UVU5FUiAodHVuZXIpKTsKKyAgZ19yZXR1cm5faWZfZmFpbCAoR1NUX0lTX1RVTkVSX0NIQU5ORUwgKGNoYW5uZWwpKTsKKworICBnX3NpZ25hbF9lbWl0IChHX09CSkVDVCAodHVuZXIpLAorICAgICAgZ3N0X3R1bmVyX3NpZ25hbHNbU0lHTkFMX0NIQU5HRURdLCAwLCBjaGFubmVsLCBzaWduYWwpOworCisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAoR19PQkpFQ1QgKGNoYW5uZWwpLCAic2lnbmFsX2NoYW5nZWQiLCBzaWduYWwpOworfQpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvdHVuZXIuaCBiL3N5cy92NGwyL3R1bmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5N2U0YgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL3R1bmVyLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qIEdTdHJlYW1lciBUdW5lcgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqCisgKiB0dW5lci5oOiB0dW5lciBpbnRlcmZhY2UgZGVzaWduCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9UVU5FUl9IX18KKyNkZWZpbmUgX19HU1RfVFVORVJfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpbmNsdWRlICJ0dW5lcm5vcm0uaCIKKyNpbmNsdWRlICJ0dW5lcmNoYW5uZWwuaCIKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1RVTkVSIFwKKyAgKGdzdF90dW5lcl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX1RVTkVSKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBHU1RfVFlQRV9UVU5FUiwgR3N0VHVuZXIpKQorI2RlZmluZSBHU1RfSVNfVFVORVIob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIEdTVF9UWVBFX1RVTkVSKSkKKyNkZWZpbmUgR1NUX1RVTkVSX0dFVF9JTlRFUkZBQ0UoaW5zdCkgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9JTlRFUkZBQ0UgKChpbnN0KSwgR1NUX1RZUEVfVFVORVIsIEdzdFR1bmVySW50ZXJmYWNlKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFR1bmVyIEdzdFR1bmVyOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFR1bmVySW50ZXJmYWNlIEdzdFR1bmVySW50ZXJmYWNlOworCisvKioKKyAqIEdzdFR1bmVySW50ZXJmYWNlOgorICogQGlmYWNlOiB0aGUgcGFyZW50IGludGVyZmFjZQorICogQGxpc3RfY2hhbm5lbHM6IGxpc3QgYXZhaWxhYmxlIGNoYW5uZWxzCisgKiBAc2V0X2NoYW5uZWw6IHNldCB0byBhIGNoYW5uZWwKKyAqIEBnZXRfY2hhbm5lbDogcmV0dXJuIHRoZSBjdXJyZW50IGNoYW5uZWwKKyAqIEBsaXN0X25vcm1zOiBsaXN0IGF2YWlsYWJsZSBub3JtcworICogQHNldF9ub3JtOiBzZXQgYSBub3JtCisgKiBAZ2V0X25vcm06IHJldHVybiB0aGUgY3VycmVudCBub3JtCisgKiBAc2V0X2ZyZXF1ZW5jeTogc2V0IHRoZSBmcmVxdWVuY3kKKyAqIEBnZXRfZnJlcXVlbmN5OiByZXR1cm4gdGhlIGN1cnJlbnQgZnJlcXVlbmN5CisgKiBAc2lnbmFsX3N0cmVuZ3RoOiBnZXQgdGhlIHNpZ25hbCBzdHJlbmd0aAorICogQGNoYW5uZWxfY2hhbmdlZDogZGVmYXVsdCBoYW5kbGVyIGZvciBjaGFubmVsIGNoYW5nZWQgbm90aWZpY2F0aW9uCisgKiBAbm9ybV9jaGFuZ2VkOiBkZWZhdWx0IGhhbmRsZXIgZm9yIG5vcm0gY2hhbmdlZCBub3RpZmljYXRpb24KKyAqIEBmcmVxdWVuY3lfY2hhbmdlZDogZGVmYXVsdCBoYW5kbGVyIGZvciBmcmVxdWVuY3kgY2hhbmdlZCBub3RpZmljYXRpb24KKyAqIEBzaWduYWxfY2hhbmdlZDogZGVmYXVsdCBoYW5kbGVyIGZvciBzaWduYWwtc3RyZW5ndGggY2hhbmdlZCBub3RpZmljYXRpb24KKyAqCisgKiBUdW5lciBpbnRlcmZhY2UuCisgKi8KK3N0cnVjdCBfR3N0VHVuZXJJbnRlcmZhY2UgeworICBHVHlwZUludGVyZmFjZSBpZmFjZTsKKworICAvKiB2aXJ0dWFsIGZ1bmN0aW9ucyAqLworICBjb25zdCBHTGlzdCAqICgqIGxpc3RfY2hhbm5lbHMpICAgKEdzdFR1bmVyICAgICAgICAqdHVuZXIpOworICB2b2lkICAgICAgICAgICgqIHNldF9jaGFubmVsKSAgICAgKEdzdFR1bmVyICAgICAgICAqdHVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VHVuZXJDaGFubmVsICpjaGFubmVsKTsKKyAgR3N0VHVuZXJDaGFubmVsICoKKyAgICAgICAgICAgICAgICAoKiBnZXRfY2hhbm5lbCkgICAgIChHc3RUdW5lciAgICAgICAgKnR1bmVyKTsKKworICBjb25zdCBHTGlzdCAqICgqIGxpc3Rfbm9ybXMpICAgICAgKEdzdFR1bmVyICAgICAgICAqdHVuZXIpOworICB2b2lkICAgICAgICAgICgqIHNldF9ub3JtKSAgICAgICAgKEdzdFR1bmVyICAgICAgICAqdHVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VHVuZXJOb3JtICAgICpub3JtKTsKKyAgR3N0VHVuZXJOb3JtICooKiBnZXRfbm9ybSkgICAgICAgIChHc3RUdW5lciAgICAgICAgKnR1bmVyKTsKKworICB2b2lkICAgICAgICAgICgqIHNldF9mcmVxdWVuY3kpICAgKEdzdFR1bmVyICAgICAgICAqdHVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VHVuZXJDaGFubmVsICpjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1bG9uZyAgICAgICAgICAgZnJlcXVlbmN5KTsKKyAgZ3Vsb25nICAgICAgICAoKiBnZXRfZnJlcXVlbmN5KSAgIChHc3RUdW5lciAgICAgICAgKnR1bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbCk7CisgIGdpbnQgICAgICAgICAgKCogc2lnbmFsX3N0cmVuZ3RoKSAoR3N0VHVuZXIgICAgICAgICp0dW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWwpOworCisgIC8qIHNpZ25hbHMgKi8KKyAgdm9pZCAoKmNoYW5uZWxfY2hhbmdlZCkgICAoR3N0VHVuZXIgICAgICAgICp0dW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VHVuZXJDaGFubmVsICpjaGFubmVsKTsKKyAgdm9pZCAoKm5vcm1fY2hhbmdlZCkgICAgICAoR3N0VHVuZXIgICAgICAgICp0dW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VHVuZXJOb3JtICAgICpub3JtKTsKKyAgdm9pZCAoKmZyZXF1ZW5jeV9jaGFuZ2VkKSAoR3N0VHVuZXIgICAgICAgICp0dW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VHVuZXJDaGFubmVsICpjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWxvbmcgICAgICAgICAgIGZyZXF1ZW5jeSk7CisgIHZvaWQgKCpzaWduYWxfY2hhbmdlZCkgICAgKEdzdFR1bmVyICAgICAgICAqdHVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICBzaWduYWwpOworfTsKKworR1R5cGUgICAgICAgICAgIGdzdF90dW5lcl9nZXRfdHlwZSAgICAgICAgICAgICAgKHZvaWQpOworCisvKiB2aXJ0dWFsIGNsYXNzIGZ1bmN0aW9uIHdyYXBwZXJzICovCitjb25zdCBHTGlzdCAqICAgZ3N0X3R1bmVyX2xpc3RfY2hhbm5lbHMgICAgICAgICAoR3N0VHVuZXIgICAgICAgICp0dW5lcik7Cit2b2lkICAgICAgICAgICAgZ3N0X3R1bmVyX3NldF9jaGFubmVsICAgICAgICAgICAoR3N0VHVuZXIgICAgICAgICp0dW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWwpOworR3N0VHVuZXJDaGFubmVsICoKKyAgICAgICAgICAgICAgICBnc3RfdHVuZXJfZ2V0X2NoYW5uZWwgICAgICAgICAgIChHc3RUdW5lciAgICAgICAgKnR1bmVyKTsKKworY29uc3QgR0xpc3QgKiAgIGdzdF90dW5lcl9saXN0X25vcm1zICAgICAgICAgICAgKEdzdFR1bmVyICAgICAgICAqdHVuZXIpOwordm9pZCAgICAgICAgICAgIGdzdF90dW5lcl9zZXRfbm9ybSAgICAgICAgICAgICAgKEdzdFR1bmVyICAgICAgICAqdHVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VHVuZXJOb3JtICAgICpub3JtKTsKK0dzdFR1bmVyTm9ybSAqICBnc3RfdHVuZXJfZ2V0X25vcm0gICAgICAgICAgICAgIChHc3RUdW5lciAgICAgICAgKnR1bmVyKTsKKwordm9pZCAgICAgICAgICAgIGdzdF90dW5lcl9zZXRfZnJlcXVlbmN5ICAgICAgICAgKEdzdFR1bmVyICAgICAgICAqdHVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VHVuZXJDaGFubmVsICpjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1bG9uZyAgICAgICAgICAgZnJlcXVlbmN5KTsKK2d1bG9uZyAgICAgICAgICBnc3RfdHVuZXJfZ2V0X2ZyZXF1ZW5jeSAgICAgICAgIChHc3RUdW5lciAgICAgICAgKnR1bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbCk7CitnaW50ICAgICAgICAgICAgZ3N0X3R1bmVyX3NpZ25hbF9zdHJlbmd0aCAgICAgICAoR3N0VHVuZXIgICAgICAgICp0dW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWwpOworCisvKiBoZWxwZXIgZnVuY3Rpb25zICovCitHc3RUdW5lck5vcm0gKiAgZ3N0X3R1bmVyX2ZpbmRfbm9ybV9ieV9uYW1lICAgICAoR3N0VHVuZXIgICAgICAgICp0dW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAgICAgICAgICAgKm5vcm0pOworR3N0VHVuZXJDaGFubmVsICpnc3RfdHVuZXJfZmluZF9jaGFubmVsX2J5X25hbWUgKEdzdFR1bmVyICAgICAgICAqdHVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgICAgICAgICAgICpjaGFubmVsKTsKKworLyogdHJpZ2dlciBzaWduYWxzICovCit2b2lkICAgICAgICAgICAgZ3N0X3R1bmVyX2NoYW5uZWxfY2hhbmdlZCAgICAgICAoR3N0VHVuZXIgICAgICAgICp0dW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWwpOwordm9pZCAgICAgICAgICAgIGdzdF90dW5lcl9ub3JtX2NoYW5nZWQgICAgICAgICAgKEdzdFR1bmVyICAgICAgICAqdHVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3N0VHVuZXJOb3JtICAgICpub3JtKTsKK3ZvaWQgICAgICAgICAgICBnc3RfdHVuZXJfZnJlcXVlbmN5X2NoYW5nZWQgICAgIChHc3RUdW5lciAgICAgICAgKnR1bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWxvbmcgICAgICAgICAgIGZyZXF1ZW5jeSk7Cit2b2lkICAgICAgICAgICAgZ3N0X3R1bmVyX3NpZ25hbF9jaGFuZ2VkICAgICAgICAoR3N0VHVuZXIgICAgICAgICp0dW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICBzaWduYWwpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19HU1RfVFVORVJfSF9fICovCmRpZmYgLS1naXQgYS9zeXMvdjRsMi90dW5lcmNoYW5uZWwuYyBiL3N5cy92NGwyL3R1bmVyY2hhbm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNDU2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi90dW5lcmNoYW5uZWwuYwpAQCAtMCwwICsxLDExNyBAQAorLyogR1N0cmVhbWVyIFR1bmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICoKKyAqIHR1bmVyY2hhbm5lbC5jOiB0dW5lciBjaGFubmVsIG9iamVjdCBkZXNpZ24KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ0dW5lcmNoYW5uZWwuaCIKKworLyoqCisgKiBTRUNUSU9OOmdzdHR1bmVyY2hhbm5lbAorICogQHNob3J0X2Rlc2NyaXB0aW9uOiBBIGNoYW5uZWwgZnJvbSBhbiBlbGVtZW50IGltcGxlbWVudGluZyB0aGUgI0dzdFR1bmVyCisgKiBpbnRlcmZhY2UuCisgKgorICogPHJlZnNlY3QyPgorICogPHBhcmE+VGhlICNHc3RUdW5lckNoYW5uZWwgb2JqZWN0IGlzIHByb3ZpZGVkIGJ5IGFuIGVsZW1lbnQgaW1wbGVtZW50aW5nCisgKiB0aGUgI0dzdFR1bmVyIGludGVyZmFjZS4KKyAqIDwvcGFyYT4KKyAqIDxwYXJhPgorICogR3N0VHVuZXJDaGFubmVsIHByb3ZpZGVzIGEgbmFtZSBhbmQgZmxhZ3MgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIGFuZAorICogY2FwYWJpbGl0aWVzIG9mIHRoZSBjaGFubmVsLiBJZiB0aGUgR1NUX1RVTkVSX0NIQU5ORUxfRlJFUVVFTkNZIGZsYWcgaXMKKyAqIHNldCwgdGhlbiB0aGUgY2hhbm5lbCBhbHNvIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtCisgKiBmcmVxdWVuY3ksIGFuZCByYW5nZSBvZiB0aGUgcmVwb3J0ZWQgc2lnbmFsIHN0cmVuZ3RoLgorICogPC9wYXJhPgorICogPC9yZWZzZWN0Mj4KKyAqLworCitlbnVtCit7CisgIC8qIEZJTEwgTUUgKi8KKyAgU0lHTkFMX0ZSRVFVRU5DWV9DSEFOR0VELAorICBTSUdOQUxfU0lHTkFMX0NIQU5HRUQsCisgIExBU1RfU0lHTkFMCit9OworCitHX0RFRklORV9UWVBFIChHc3RUdW5lckNoYW5uZWwsIGdzdF90dW5lcl9jaGFubmVsLCBHX1RZUEVfT0JKRUNUKTsKKworc3RhdGljIHZvaWQgZ3N0X3R1bmVyX2NoYW5uZWxfZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CisKK3N0YXRpYyBndWludCBzaWduYWxzW0xBU1RfU0lHTkFMXSA9IHsgMCB9OworCitzdGF0aWMgdm9pZAorZ3N0X3R1bmVyX2NoYW5uZWxfY2xhc3NfaW5pdCAoR3N0VHVuZXJDaGFubmVsQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpvYmplY3Rfa2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworCisgIC8qKgorICAgKiBHc3RUdW5lckNoYW5uZWw6OmZyZXF1ZW5jeS1jaGFuZ2VkOgorICAgKiBAdHVuZXJjaGFubmVsOiBUaGUgI0dzdFR1bmVyQ2hhbm5lbAorICAgKiBAZnJlcXVlbmN5OiBUaGUgbmV3IGZyZXF1ZW5jeSAoYW4gdW5zaWduZWQgbG9uZykKKyAgICoKKyAgICogUmVwb3J0cyB0aGF0IHRoZSBjdXJyZW50IGZyZXF1ZW5jeSBoYXMgY2hhbmdlZC4KKyAgICovCisgIHNpZ25hbHNbU0lHTkFMX0ZSRVFVRU5DWV9DSEFOR0VEXSA9CisgICAgICBnX3NpZ25hbF9uZXcgKCJmcmVxdWVuY3ktY2hhbmdlZCIsIEdfVFlQRV9GUk9NX0NMQVNTIChrbGFzcyksCisgICAgICBHX1NJR05BTF9SVU5fTEFTVCwKKyAgICAgIEdfU1RSVUNUX09GRlNFVCAoR3N0VHVuZXJDaGFubmVsQ2xhc3MsCisgICAgICAgICAgZnJlcXVlbmN5X2NoYW5nZWQpLAorICAgICAgTlVMTCwgTlVMTCwgZ19jY2xvc3VyZV9tYXJzaGFsX1ZPSURfX1VMT05HLCBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX1VMT05HKTsKKyAgLyoqCisgICAqIEdzdFR1bmVyQ2hhbm5lbDo6c2lnbmFsLWNoYW5nZWQ6CisgICAqIEB0dW5lcmNoYW5uZWw6IFRoZSAjR3N0VHVuZXJDaGFubmVsCisgICAqIEBzaWduYWw6IFRoZSBuZXcgc2lnbmFsIHN0cmVuZ3RoIChhbiBpbnRlZ2VyKQorICAgKgorICAgKiBSZXBvcnRzIHRoYXQgdGhlIHNpZ25hbCBzdHJlbmd0aCBoYXMgY2hhbmdlZC4KKyAgICoKKyAgICogU2VlIEFsc286IGdzdF90dW5lcl9zaWduYWxfc3RyZW5ndGgoKQorICAgKi8KKyAgc2lnbmFsc1tTSUdOQUxfU0lHTkFMX0NIQU5HRURdID0KKyAgICAgIGdfc2lnbmFsX25ldyAoInNpZ25hbC1jaGFuZ2VkIiwgR19UWVBFX0ZST01fQ0xBU1MgKGtsYXNzKSwKKyAgICAgIEdfU0lHTkFMX1JVTl9MQVNULAorICAgICAgR19TVFJVQ1RfT0ZGU0VUIChHc3RUdW5lckNoYW5uZWxDbGFzcywKKyAgICAgICAgICBzaWduYWxfY2hhbmdlZCksCisgICAgICBOVUxMLCBOVUxMLCBnX2NjbG9zdXJlX21hcnNoYWxfVk9JRF9fSU5ULCBHX1RZUEVfTk9ORSwgMSwgR19UWVBFX0lOVCk7CisKKyAgb2JqZWN0X2tsYXNzLT5kaXNwb3NlID0gZ3N0X3R1bmVyX2NoYW5uZWxfZGlzcG9zZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF90dW5lcl9jaGFubmVsX2luaXQgKEdzdFR1bmVyQ2hhbm5lbCAqIGNoYW5uZWwpCit7CisgIGNoYW5uZWwtPmxhYmVsID0gTlVMTDsKKyAgY2hhbm5lbC0+ZmxhZ3MgPSAwOworICBjaGFubmVsLT5taW5fZnJlcXVlbmN5ID0gY2hhbm5lbC0+bWF4X2ZyZXF1ZW5jeSA9IDA7CisgIGNoYW5uZWwtPm1pbl9zaWduYWwgPSBjaGFubmVsLT5tYXhfc2lnbmFsID0gMDsKK30KKworc3RhdGljIHZvaWQKK2dzdF90dW5lcl9jaGFubmVsX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbCA9IEdTVF9UVU5FUl9DSEFOTkVMIChvYmplY3QpOworCisgIGlmIChjaGFubmVsLT5sYWJlbCkgeworICAgIGdfZnJlZSAoY2hhbm5lbC0+bGFiZWwpOworICAgIGNoYW5uZWwtPmxhYmVsID0gTlVMTDsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTIChnc3RfdHVuZXJfY2hhbm5lbF9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvdHVuZXJjaGFubmVsLmggYi9zeXMvdjRsMi90dW5lcmNoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDgwYzczCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvdHVuZXJjaGFubmVsLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qIEdTdHJlYW1lciBUdW5lcgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqCisgKiB0dW5lcmNoYW5uZWwuaDogdHVuZXIgY2hhbm5lbCBvYmplY3QgZGVzaWduCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9UVU5FUl9DSEFOTkVMX0hfXworI2RlZmluZSBfX0dTVF9UVU5FUl9DSEFOTkVMX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfVFVORVJfQ0hBTk5FTCBcCisgIChnc3RfdHVuZXJfY2hhbm5lbF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX1RVTkVSX0NIQU5ORUwob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX1RVTkVSX0NIQU5ORUwsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWwpKQorI2RlZmluZSBHU1RfVFVORVJfQ0hBTk5FTF9DTEFTUyhrbGFzcykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChrbGFzcyksIEdTVF9UWVBFX1RVTkVSX0NIQU5ORUwsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHc3RUdW5lckNoYW5uZWxDbGFzcykpCisjZGVmaW5lIEdTVF9JU19UVU5FUl9DSEFOTkVMKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBHU1RfVFlQRV9UVU5FUl9DSEFOTkVMKSkKKyNkZWZpbmUgR1NUX0lTX1RVTkVSX0NIQU5ORUxfQ0xBU1Moa2xhc3MpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHU1RfVFlQRV9UVU5FUl9DSEFOTkVMKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFR1bmVyQ2hhbm5lbCBHc3RUdW5lckNoYW5uZWw7Cit0eXBlZGVmIHN0cnVjdCBfR3N0VHVuZXJDaGFubmVsQ2xhc3MgR3N0VHVuZXJDaGFubmVsQ2xhc3M7CisKKy8qKgorICogR3N0VHVuZXJDaGFubmVsRmxhZ3M6CisgKiBAR1NUX1RVTkVSX0NIQU5ORUxfSU5QVVQ6IFRoZSBjaGFubmVsIGlzIGZvciBpbnB1dAorICogQEdTVF9UVU5FUl9DSEFOTkVMX09VVFBVVDogVGhlIGNoYW5uZWwgaXMgZm9yIG91dHB1dAorICogQEdTVF9UVU5FUl9DSEFOTkVMX0ZSRVFVRU5DWTogVGhlIGNoYW5uZWwgaGFzIGEgZnJlcXVlbmN5IHNldHRpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzaWduYWwgc3RyZW5ndGguCisgKiBAR1NUX1RVTkVSX0NIQU5ORUxfQVVESU86IFRoZSBjaGFubmVsIGNhcnJpZXMgYXVkaW8uCisgKgorICogQW4gZW51bWVyYXRpb24gZm9yIGZsYWdzIGluZGljYXRpbmcgdGhlIGF2YWlsYWJsZSBjYXBhYmlsaXRpZXMKKyAqIG9mIGEgI0dzdFR1bmVyQ2hhbm5lbC4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgR1NUX1RVTkVSX0NIQU5ORUxfSU5QVVQgICAgID0gKDE8PDApLAorICBHU1RfVFVORVJfQ0hBTk5FTF9PVVRQVVQgICAgPSAoMTw8MSksCisgIEdTVF9UVU5FUl9DSEFOTkVMX0ZSRVFVRU5DWSA9ICgxPDwyKSwKKyAgR1NUX1RVTkVSX0NIQU5ORUxfQVVESU8gICAgID0gKDE8PDMpCit9IEdzdFR1bmVyQ2hhbm5lbEZsYWdzOworCisvKioKKyAqIEdTVF9UVU5FUl9DSEFOTkVMX0hBU19GTEFHOgorICogQGNoYW5uZWw6IEEgI0dzdFR1bmVyQ2hhbm5lbAorICogQGZsYWc6IFRoZSBmbGFnIHRvIGNoZWNrIGZvcgorICoKKyAqIE1hY3JvIHRvIGNoZWNrIGlmIHRoZSBnaXZlbiBmbGFnIGlzIHNldCBvbiBhIGNoYW5uZWwKKyAqLworI2RlZmluZSBHU1RfVFVORVJfQ0hBTk5FTF9IQVNfRkxBRyhjaGFubmVsLCBmbGFnKSBcCisgICgoY2hhbm5lbCktPmZsYWdzICYgZmxhZykKKworLyoqCisgKiBHc3RUdW5lckNoYW5uZWw6CisgKiBAbGFiZWw6IEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBkZXNjcmlwdGl2ZSBuYW1lIGZvciB0aGlzIGNoYW5uZWwKKyAqIEBmbGFnczogQSBzZXQgb2YgI0dzdFR1bmVyQ2hhbm5lbEZsYWdzIGZvciB0aGlzIGNoYW5uZWwKKyAqIEBmcmVxX211bHRpcGxpY2F0b3I6IFRoZSBzdGVwIHNpemUgKGluIEh6KSBmb3IgdGhlIGZyZXF1ZW5jeSBzZXR0aW5nLgorICogQG1pbl9mcmVxdWVuY3k6IE1pbmltdW0gdmFsaWQgZnJlcXVlbmN5IHNldHRpbmcgKGluIEh6KS4KKyAqIEBtYXhfZnJlcXVlbmN5OiBNYXhpbXVtIHZhbGlkIGZyZXF1ZW5jeSBzZXR0aW5nIChpbiBIeikuCisgKiBAbWluX3NpZ25hbDogTWluaW11bSByZXBvcnRlZCBzaWduYWwgc3RyZW5ndGggdmFsdWUuCisgKiBAbWF4X3NpZ25hbDogTWF4aW11bSByZXBvcnRlZCBzaWduYWwgc3RyZW5ndGggdmFsdWUuCisgKi8KK3N0cnVjdCBfR3N0VHVuZXJDaGFubmVsIHsKKyAgR09iamVjdCAgICAgICAgICAgICAgcGFyZW50OworCisgIC8qPCBwdWJsaWMgPiovCisgIGdjaGFyICAgICAgICAgICAgICAgKmxhYmVsOworICBHc3RUdW5lckNoYW5uZWxGbGFncyBmbGFnczsKKyAgZ2Zsb2F0ICAgICAgICAgICAgICAgZnJlcV9tdWx0aXBsaWNhdG9yOworICBndWxvbmcgICAgICAgICAgICAgICBtaW5fZnJlcXVlbmN5OworICBndWxvbmcgICAgICAgICAgICAgICBtYXhfZnJlcXVlbmN5OworICBnaW50ICAgICAgICAgICAgICAgICBtaW5fc2lnbmFsOworICBnaW50ICAgICAgICAgICAgICAgICBtYXhfc2lnbmFsOworCisgIC8qPCBwcml2YXRlID4qLworICBncG9pbnRlciBfZ3N0X3Jlc2VydmVkW0dTVF9QQURESU5HXTsKK307CisKK3N0cnVjdCBfR3N0VHVuZXJDaGFubmVsQ2xhc3MgeworICBHT2JqZWN0Q2xhc3MgcGFyZW50OworCisgIC8qPCBwcml2YXRlID4qLworICAvKiBzaWduYWxzICovCisgIHZvaWQgKCpmcmVxdWVuY3lfY2hhbmdlZCkgKEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Vsb25nICAgICAgICAgICBmcmVxdWVuY3kpOworICB2b2lkICgqc2lnbmFsX2NoYW5nZWQpICAgIChHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAgc2lnbmFsKTsKKworICBncG9pbnRlciBfZ3N0X3Jlc2VydmVkW0dTVF9QQURESU5HXTsKK307CisKK0dUeXBlICAgICAgICAgICBnc3RfdHVuZXJfY2hhbm5lbF9nZXRfdHlwZSAgICAgICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9fR1NUX1RVTkVSX0NIQU5ORUxfSF9fICovCmRpZmYgLS1naXQgYS9zeXMvdjRsMi90dW5lcm5vcm0uYyBiL3N5cy92NGwyL3R1bmVybm9ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNTdmZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi90dW5lcm5vcm0uYwpAQCAtMCwwICsxLDgxIEBACisvKiBHU3RyZWFtZXIgVHVuZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMyBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKgorICogdHVuZXJub3JtLmM6IHR1bmVyIG5vcm0gb2JqZWN0IGRlc2lnbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInR1bmVybm9ybS5oIgorCisvKioKKyAqIFNFQ1RJT046Z3N0dHVuZXJub3JtCisgKiBAc2hvcnRfZGVzY3JpcHRpb246IEVuY2Fwc3VsYXRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGF0YSBmb3JtYXQocykKKyAqIGZvciBhICNHc3RUdW5lckNoYW5uZWwuCisgKgorICogPHJlZnNlY3QyPgorICogPHBhcmE+VGhlICNHc3RUdW5lck5vcm0gb2JqZWN0IGlzIGNyZWF0ZWQgYnkgYW4gZWxlbWVudCBpbXBsZW1lbnRpbmcgdGhlCisgKiAjR3N0VHVuZXIgaW50ZXJmYWNlIGFuZCBlbmNhcHN1bGF0ZXMgdGhlIHNlbGVjdGlvbiBvZiBhIGNhcHR1cmUvb3V0cHV0IGZvcm1hdAorICogZm9yIGEgc2VsZWN0ZWQgI0dzdFR1bmVyQ2hhbm5lbC4KKyAqIDwvcGFyYT4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworZW51bQoreworICAvKiBGSUxMIE1FICovCisgIExBU1RfU0lHTkFMCit9OworCitHX0RFRklORV9UWVBFIChHc3RUdW5lck5vcm0sIGdzdF90dW5lcl9ub3JtLCBHX1RZUEVfT0JKRUNUKTsKKworc3RhdGljIHZvaWQgZ3N0X3R1bmVyX25vcm1fZGlzcG9zZSAoR09iamVjdCAqIG9iamVjdCk7CisKKworLypzdGF0aWMgZ3VpbnQgc2lnbmFsc1tMQVNUX1NJR05BTF0gPSB7IDAgfTsqLworCitzdGF0aWMgdm9pZAorZ3N0X3R1bmVyX25vcm1fY2xhc3NfaW5pdCAoR3N0VHVuZXJOb3JtQ2xhc3MgKiBrbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpvYmplY3Rfa2xhc3MgPSAoR09iamVjdENsYXNzICopIGtsYXNzOworCisKKyAgb2JqZWN0X2tsYXNzLT5kaXNwb3NlID0gZ3N0X3R1bmVyX25vcm1fZGlzcG9zZTsKK30KKworc3RhdGljIHZvaWQKK2dzdF90dW5lcl9ub3JtX2luaXQgKEdzdFR1bmVyTm9ybSAqIG5vcm0pCit7CisgIG5vcm0tPmxhYmVsID0gTlVMTDsKKyAgZ192YWx1ZV9pbml0ICgmbm9ybS0+ZnJhbWVyYXRlLCBHU1RfVFlQRV9GUkFDVElPTik7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfdHVuZXJfbm9ybV9kaXNwb3NlIChHT2JqZWN0ICogb2JqZWN0KQoreworICBHc3RUdW5lck5vcm0gKm5vcm0gPSBHU1RfVFVORVJfTk9STSAob2JqZWN0KTsKKworICBpZiAobm9ybS0+bGFiZWwpIHsKKyAgICBnX2ZyZWUgKG5vcm0tPmxhYmVsKTsKKyAgICBub3JtLT5sYWJlbCA9IE5VTEw7CisgIH0KKworICBHX09CSkVDVF9DTEFTUyAoZ3N0X3R1bmVyX25vcm1fcGFyZW50X2NsYXNzKS0+ZGlzcG9zZSAob2JqZWN0KTsKK30KZGlmZiAtLWdpdCBhL3N5cy92NGwyL3R1bmVybm9ybS5oIGIvc3lzL3Y0bDIvdHVuZXJub3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkYTIyYwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy92NGwyL3R1bmVybm9ybS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qIEdTdHJlYW1lciBUdW5lcgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqCisgKiB0dW5lcm5vcm0uaDogdHVuZXIgbm9ybSBvYmplY3QgZGVzaWduCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dTVF9UVU5FUl9OT1JNX0hfXworI2RlZmluZSBfX0dTVF9UVU5FUl9OT1JNX0hfXworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgR1NUX1RZUEVfVFVORVJfTk9STSBcCisgIChnc3RfdHVuZXJfbm9ybV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgR1NUX1RVTkVSX05PUk0ob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIEdTVF9UWVBFX1RVTkVSX05PUk0sIEdzdFR1bmVyTm9ybSkpCisjZGVmaW5lIEdTVF9UVU5FUl9OT1JNX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGtsYXNzKSwgR1NUX1RZUEVfVFVORVJfTk9STSwgR3N0VHVuZXJOb3JtQ2xhc3MpKQorI2RlZmluZSBHU1RfSVNfVFVORVJfTk9STShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgR1NUX1RZUEVfVFVORVJfTk9STSkpCisjZGVmaW5lIEdTVF9JU19UVU5FUl9OT1JNX0NMQVNTKGtsYXNzKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGtsYXNzKSwgR1NUX1RZUEVfVFVORVJfTk9STSkpCisKK3R5cGVkZWYgc3RydWN0IF9Hc3RUdW5lck5vcm0gR3N0VHVuZXJOb3JtOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFR1bmVyTm9ybUNsYXNzIEdzdFR1bmVyTm9ybUNsYXNzOworCisvKioKKyAqIEdzdFR1bmVyTm9ybToKKyAqIEBsYWJlbDogQSBzdHJpbmcgY29udGFpbmluZyBhIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBub3JtCisgKiBAZnJhbWVyYXRlOiBBIEdWYWx1ZSBjb250YWluaW5nIHRoZSBmcmFtZXJhdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9ybSwKKyAqICAgICAgICAgICAgIGlmIGFueS4gKE1heSBiZSB1bnNldCkuCisgKi8KK3N0cnVjdCBfR3N0VHVuZXJOb3JtIHsKKyAgR09iamVjdCBwYXJlbnQ7CisKKyAgLyo8IHB1YmxpYyA+Ki8KKyAgZ2NoYXIgICpsYWJlbDsKKyAgR1ZhbHVlICBmcmFtZXJhdGU7CisKKyAgLyo8IHByaXZhdGUgPiovCisgIGdwb2ludGVyIF9nc3RfcmVzZXJ2ZWRbR1NUX1BBRERJTkddOworfTsKKworc3RydWN0IF9Hc3RUdW5lck5vcm1DbGFzcyB7CisgIEdPYmplY3RDbGFzcyBwYXJlbnQ7CisKKyAgZ3BvaW50ZXIgX2dzdF9yZXNlcnZlZFtHU1RfUEFERElOR107Cit9OworCitHVHlwZSAgICAgICAgICAgZ3N0X3R1bmVyX25vcm1fZ2V0X3R5cGUgICAgICAgICAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9UVU5FUl9OT1JNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvdjRsMi11dGlscy5jIGIvc3lzL3Y0bDIvdjRsMi11dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MGM1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi92NGwyLXV0aWxzLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgQ29sbGFib3JhIEx0ZC4KKyAqICAgICBBdXRob3I6IE5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ2NGwyLXV0aWxzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENvbW1vbiBkZXZpY2UgaXRlcmF0b3IgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIEhBVkVfR1VERVYKKyNpbmNsdWRlIDxndWRldi9ndWRldi5oPgorCitzdHJ1Y3QgX0dzdFY0bDJHVWRldkl0ZXJhdG9yCit7CisgIEdzdFY0bDJJdGVyYXRvciBwYXJlbnQ7CisgIEdMaXN0ICpkZXZpY2VzOworICBHVWRldkRldmljZSAqZGV2aWNlOworICBHVWRldkNsaWVudCAqY2xpZW50OworfTsKKworR3N0VjRsMkl0ZXJhdG9yICoKK2dzdF92NGwyX2l0ZXJhdG9yX25ldyAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IGdjaGFyICpzdWJzeXN0ZW1zW10gPSB7ICJ2aWRlbzRsaW51eCIsIE5VTEwgfTsKKyAgc3RydWN0IF9Hc3RWNGwyR1VkZXZJdGVyYXRvciAqaXQ7CisKKyAgaXQgPSBnX3NsaWNlX25ldzAgKHN0cnVjdCBfR3N0VjRsMkdVZGV2SXRlcmF0b3IpOworCisgIGl0LT5jbGllbnQgPSBnX3VkZXZfY2xpZW50X25ldyAoc3Vic3lzdGVtcyk7CisgIGl0LT5kZXZpY2VzID0gZ191ZGV2X2NsaWVudF9xdWVyeV9ieV9zdWJzeXN0ZW0gKGl0LT5jbGllbnQsICJ2aWRlbzRsaW51eCIpOworCisgIHJldHVybiAoR3N0VjRsMkl0ZXJhdG9yICopIGl0OworfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfaXRlcmF0b3JfbmV4dCAoR3N0VjRsMkl0ZXJhdG9yICogX2l0KQoreworICBzdHJ1Y3QgX0dzdFY0bDJHVWRldkl0ZXJhdG9yICppdCA9IChzdHJ1Y3QgX0dzdFY0bDJHVWRldkl0ZXJhdG9yICopIF9pdDsKKyAgY29uc3QgZ2NoYXIgKmRldmljZV9uYW1lOworCisgIGlmIChpdC0+ZGV2aWNlKQorICAgIGdfb2JqZWN0X3VucmVmIChpdC0+ZGV2aWNlKTsKKworICBpdC0+ZGV2aWNlID0gTlVMTDsKKyAgaXQtPnBhcmVudC5kZXZpY2VfcGF0aCA9IE5VTEw7CisgIGl0LT5wYXJlbnQuZGV2aWNlX25hbWUgPSBOVUxMOworCisgIGlmIChpdC0+ZGV2aWNlcyA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBpdC0+ZGV2aWNlID0gaXQtPmRldmljZXMtPmRhdGE7CisgIGl0LT5kZXZpY2VzID0gZ19saXN0X2RlbGV0ZV9saW5rIChpdC0+ZGV2aWNlcywgaXQtPmRldmljZXMpOworCisgIGRldmljZV9uYW1lID0gZ191ZGV2X2RldmljZV9nZXRfcHJvcGVydHkgKGl0LT5kZXZpY2UsICJJRF9WNExfUFJPRFVDVCIpOworICBpZiAoIWRldmljZV9uYW1lKQorICAgIGRldmljZV9uYW1lID0gZ191ZGV2X2RldmljZV9nZXRfcHJvcGVydHkgKGl0LT5kZXZpY2UsICJJRF9NT0RFTF9FTkMiKTsKKyAgaWYgKCFkZXZpY2VfbmFtZSkKKyAgICBkZXZpY2VfbmFtZSA9IGdfdWRldl9kZXZpY2VfZ2V0X3Byb3BlcnR5IChpdC0+ZGV2aWNlLCAiSURfTU9ERUwiKTsKKworICBpdC0+cGFyZW50LmRldmljZV9wYXRoID0gZ191ZGV2X2RldmljZV9nZXRfZGV2aWNlX2ZpbGUgKGl0LT5kZXZpY2UpOworICBpdC0+cGFyZW50LmRldmljZV9uYW1lID0gZGV2aWNlX25hbWU7CisgIGl0LT5wYXJlbnQuc3lzX3BhdGggPSBnX3VkZXZfZGV2aWNlX2dldF9zeXNmc19wYXRoIChpdC0+ZGV2aWNlKTsKKworICByZXR1cm4gVFJVRTsKK30KKwordm9pZAorZ3N0X3Y0bDJfaXRlcmF0b3JfZnJlZSAoR3N0VjRsMkl0ZXJhdG9yICogX2l0KQoreworICBzdHJ1Y3QgX0dzdFY0bDJHVWRldkl0ZXJhdG9yICppdCA9IChzdHJ1Y3QgX0dzdFY0bDJHVWRldkl0ZXJhdG9yICopIF9pdDsKKyAgZ19saXN0X2ZyZWVfZnVsbCAoaXQtPmRldmljZXMsIGdfb2JqZWN0X3VucmVmKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoaXQtPmNsaWVudCk7CisgIGdfc2xpY2VfZnJlZSAoc3RydWN0IF9Hc3RWNGwyR1VkZXZJdGVyYXRvciwgaXQpOworfQorCisjZWxzZSAvKiBObyBHVURFViAqLworCitzdHJ1Y3QgX0dzdFY0bDJGc0l0ZXJhdG9yCit7CisgIEdzdFY0bDJJdGVyYXRvciBwYXJlbnQ7CisgIGdpbnQgYmFzZV9pZHg7CisgIGdpbnQgdmlkZW9faWR4OworICBnY2hhciAqZGV2aWNlOworfTsKKworR3N0VjRsMkl0ZXJhdG9yICoKK2dzdF92NGwyX2l0ZXJhdG9yX25ldyAodm9pZCkKK3sKKyAgc3RydWN0IF9Hc3RWNGwyRnNJdGVyYXRvciAqaXQ7CisKKyAgaXQgPSBnX3NsaWNlX25ldzAgKHN0cnVjdCBfR3N0VjRsMkZzSXRlcmF0b3IpOworICBpdC0+YmFzZV9pZHggPSAwOworICBpdC0+dmlkZW9faWR4ID0gLTE7CisgIGl0LT5kZXZpY2UgPSBOVUxMOworCisgIHJldHVybiAoR3N0VjRsMkl0ZXJhdG9yICopIGl0OworfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfaXRlcmF0b3JfbmV4dCAoR3N0VjRsMkl0ZXJhdG9yICogX2l0KQoreworICBzdHJ1Y3QgX0dzdFY0bDJGc0l0ZXJhdG9yICppdCA9IChzdHJ1Y3QgX0dzdFY0bDJGc0l0ZXJhdG9yICopIF9pdDsKKyAgc3RhdGljIGNvbnN0IGdjaGFyICpkZXZfYmFzZVtdID0geyAiL2Rldi92aWRlbyIsICIvZGV2L3Y0bDIvdmlkZW8iLCBOVUxMIH07CisgIGdjaGFyICpkZXZpY2UgPSBOVUxMOworCisgIGdfZnJlZSAoKGdjaGFyICopIGl0LT5wYXJlbnQuZGV2aWNlX3BhdGgpOworICBpdC0+cGFyZW50LmRldmljZV9wYXRoID0gTlVMTDsKKworICB3aGlsZSAoZGV2aWNlID09IE5VTEwpIHsKKyAgICBpdC0+dmlkZW9faWR4Kys7CisKKyAgICBpZiAoaXQtPnZpZGVvX2lkeCA+PSA2NCkgeworICAgICAgaXQtPnZpZGVvX2lkeCA9IDA7CisgICAgICBpdC0+YmFzZV9pZHgrKzsKKyAgICB9CisKKyAgICBpZiAoZGV2X2Jhc2VbaXQtPmJhc2VfaWR4XSA9PSBOVUxMKSB7CisgICAgICBpdC0+dmlkZW9faWR4ID0gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRldmljZSA9IGdfc3RyZHVwX3ByaW50ZiAoIiVzJWQiLCBkZXZfYmFzZVtpdC0+YmFzZV9pZHhdLCBpdC0+dmlkZW9faWR4KTsKKworICAgIGlmIChnX2ZpbGVfdGVzdCAoZGV2aWNlLCBHX0ZJTEVfVEVTVF9FWElTVFMpKSB7CisgICAgICBpdC0+cGFyZW50LmRldmljZV9wYXRoID0gZGV2aWNlOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZ19mcmVlIChkZXZpY2UpOworICAgIGRldmljZSA9IE5VTEw7CisgIH0KKworICByZXR1cm4gaXQtPnBhcmVudC5kZXZpY2VfcGF0aCAhPSBOVUxMOworfQorCit2b2lkCitnc3RfdjRsMl9pdGVyYXRvcl9mcmVlIChHc3RWNGwySXRlcmF0b3IgKiBfaXQpCit7CisgIHN0cnVjdCBfR3N0VjRsMkZzSXRlcmF0b3IgKml0ID0gKHN0cnVjdCBfR3N0VjRsMkZzSXRlcmF0b3IgKikgX2l0OworICBnX2ZyZWUgKChnY2hhciAqKSBpdC0+cGFyZW50LmRldmljZV9wYXRoKTsKKyAgZ19zbGljZV9mcmVlIChzdHJ1Y3QgX0dzdFY0bDJGc0l0ZXJhdG9yLCBpdCk7Cit9CisKKyNlbmRpZgorCit2b2lkCitnc3RfdjRsMl9jbGVhcl9lcnJvciAoR3N0VjRsMkVycm9yICogdjRsMmVycikKK3sKKyAgaWYgKHY0bDJlcnIpIHsKKyAgICBnX2NsZWFyX2Vycm9yICgmdjRsMmVyci0+ZXJyb3IpOworICAgIGdfZnJlZSAodjRsMmVyci0+ZGJnX21lc3NhZ2UpOworICAgIHY0bDJlcnItPmRiZ19tZXNzYWdlID0gTlVMTDsKKyAgfQorfQorCit2b2lkCitnc3RfdjRsMl9lcnJvciAoZ3BvaW50ZXIgZWxlbWVudCwgR3N0VjRsMkVycm9yICogdjRsMmVycikKK3sKKyAgR0Vycm9yICplcnJvcjsKKworICBpZiAoIXY0bDJlcnIgfHwgIXY0bDJlcnItPmVycm9yKQorICAgIHJldHVybjsKKworICBlcnJvciA9IHY0bDJlcnItPmVycm9yOworCisgIGlmIChlcnJvci0+bWVzc2FnZSkKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGVsZW1lbnQsICJlcnJvcjogJXMiLCBlcnJvci0+bWVzc2FnZSk7CisKKyAgaWYgKHY0bDJlcnItPmRiZ19tZXNzYWdlKQorICAgIEdTVF9XQVJOSU5HX09CSkVDVCAoZWxlbWVudCwgImVycm9yOiAlcyIsIHY0bDJlcnItPmRiZ19tZXNzYWdlKTsKKworICBnc3RfZWxlbWVudF9tZXNzYWdlX2Z1bGwgKEdTVF9FTEVNRU5UIChlbGVtZW50KSwgR1NUX01FU1NBR0VfRVJST1IsCisgICAgICBlcnJvci0+ZG9tYWluLCBlcnJvci0+Y29kZSwgZXJyb3ItPm1lc3NhZ2UsIHY0bDJlcnItPmRiZ19tZXNzYWdlLAorICAgICAgdjRsMmVyci0+ZmlsZSwgdjRsMmVyci0+ZnVuYywgdjRsMmVyci0+bGluZSk7CisKKyAgZXJyb3ItPm1lc3NhZ2UgPSBOVUxMOworICB2NGwyZXJyLT5kYmdfbWVzc2FnZSA9IE5VTEw7CisKKyAgZ3N0X3Y0bDJfY2xlYXJfZXJyb3IgKHY0bDJlcnIpOworfQpkaWZmIC0tZ2l0IGEvc3lzL3Y0bDIvdjRsMi11dGlscy5oIGIvc3lzL3Y0bDIvdjRsMi11dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYzAwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvdjRsMi92NGwyLXV0aWxzLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBDb2xsYWJvcmEgTHRkLgorICogICAgIEF1dGhvcjogTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX19WNEwyX1VUSUxTX0hfXworI2RlZmluZSBfX1Y0TDJfVVRJTFNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBHU1RfVjRMMl9FUlJPUl9JTklUIHsgTlVMTCwgTlVMTCB9CisjZGVmaW5lIEdTVF9WNEwyX0VSUk9SKHY0bDJlcnIsZG9tYWluLGNvZGUsbXNnLGRiZykgXAore1wKKyAgaWYgKHY0bDJlcnIpIHsgXAorICAgIGdjaGFyICpfbXNnID0gX2dzdF9lbGVtZW50X2Vycm9yX3ByaW50ZiBtc2c7IFwKKyAgICB2NGwyZXJyLT5lcnJvciA9IGdfZXJyb3JfbmV3X2xpdGVyYWwgKEdTVF8jI2RvbWFpbiMjX0VSUk9SLCBcCisgICAgICAgIEdTVF8jI2RvbWFpbiMjX0VSUk9SXyMjY29kZSwgX21zZyk7IFwKKyAgICBnX2ZyZWUgKF9tc2cpOyBcCisgICAgdjRsMmVyci0+ZGJnX21lc3NhZ2UgPSBfZ3N0X2VsZW1lbnRfZXJyb3JfcHJpbnRmIGRiZzsgXAorICAgIHY0bDJlcnItPmZpbGUgPSBfX0ZJTEVfXzsgXAorICAgIHY0bDJlcnItPmZ1bmMgPSBHU1RfRlVOQ1RJT047IFwKKyAgICB2NGwyZXJyLT5saW5lID0gX19MSU5FX187IFwKKyAgfSBcCit9CisKK3R5cGVkZWYgc3RydWN0IF9Hc3RWNGwySXRlcmF0b3IgR3N0VjRsMkl0ZXJhdG9yOwordHlwZWRlZiBzdHJ1Y3QgX0dzdFY0bDJFcnJvciBHc3RWNGwyRXJyb3I7CisKK3N0cnVjdCBfR3N0VjRsMkl0ZXJhdG9yCit7CisgICAgY29uc3QgZ2NoYXIgKmRldmljZV9wYXRoOworICAgIGNvbnN0IGdjaGFyICpkZXZpY2VfbmFtZTsKKyAgICBjb25zdCBnY2hhciAqc3lzX3BhdGg7Cit9OworCitzdHJ1Y3QgX0dzdFY0bDJFcnJvcgoreworICAgIEdFcnJvciAqZXJyb3I7CisgICAgZ2NoYXIgKmRiZ19tZXNzYWdlOworICAgIGNvbnN0IGdjaGFyICpmaWxlOworICAgIGNvbnN0IGdjaGFyICpmdW5jOworICAgIGdpbnQgbGluZTsKK307CisKK0dzdFY0bDJJdGVyYXRvciAqICBnc3RfdjRsMl9pdGVyYXRvcl9uZXcgKHZvaWQpOworZ2Jvb2xlYW4gICAgICAgICAgIGdzdF92NGwyX2l0ZXJhdG9yX25leHQgKEdzdFY0bDJJdGVyYXRvciAqaXQpOwordm9pZCAgICAgICAgICAgICAgIGdzdF92NGwyX2l0ZXJhdG9yX2ZyZWUgKEdzdFY0bDJJdGVyYXRvciAqaXQpOworCitjb25zdCBnY2hhciAqICAgICAgZ3N0X3Y0bDJfaXRlcmF0b3JfZ2V0X2RldmljZV9wYXRoIChHc3RWNGwySXRlcmF0b3IgKml0KTsKK2NvbnN0IGdjaGFyICogICAgICBnc3RfdjRsMl9pdGVyYXRvcl9nZXRfZGV2aWNlX25hbWUgKEdzdFY0bDJJdGVyYXRvciAqaXQpOworY29uc3QgZ2NoYXIgKiAgICAgIGdzdF92NGwyX2l0ZXJhdG9yX2dldF9zeXNfcGF0aCAoR3N0VjRsMkl0ZXJhdG9yICppdCk7CisKK3ZvaWQgICAgICAgICAgICAgICBnc3RfdjRsMl9jbGVhcl9lcnJvciAoR3N0VjRsMkVycm9yICplcnJvcik7Cit2b2lkICAgICAgICAgICAgICAgZ3N0X3Y0bDJfZXJyb3IgKGdwb2ludGVyIGVsZW1lbnQsIEdzdFY0bDJFcnJvciAqZXJyb3IpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX19WNEwyX1VUSUxTX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL3N5cy92NGwyL3Y0bDJfY2FsbHMuYyBiL3N5cy92NGwyL3Y0bDJfY2FsbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmZjODIxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3Y0bDIvdjRsMl9jYWxscy5jCkBAIC0wLDAgKzEsMTEzOSBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbmFsZCBCdWx0amUgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KKyAqICAgICAgICAgICAgICAgMjAwNiBFZGdhcmQgTGltYSA8ZWRnYXJkLmxpbWFAZ21haWwuY29tPgorICoKKyAqIHY0bDJfY2FsbHMuYyAtIGdlbmVyaWMgVjRMMiBjYWxscyBoYW5kbGluZworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaWZkZWYgX19zdW4KKy8qIE5lZWRlZCBvbiBvbGRlciBTb2xhcmlzIE5ldmFkYSBidWlsZHMgKDcyIGF0IGxlYXN0KSAqLworI2luY2x1ZGUgPHN0cm9wdHMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jY29tLmg+CisjZW5kaWYKKyNpbmNsdWRlICJnc3R2NGwyb2JqZWN0LmgiCisjaW5jbHVkZSAiZ3N0djRsMnR1bmVyLmgiCisjaW5jbHVkZSAiZ3N0djRsMmNvbG9yYmFsYW5jZS5oIgorCisjaW5jbHVkZSAiZ3N0djRsMnNyYy5oIgorI2luY2x1ZGUgImdzdHY0bDJzaW5rLmgiCisjaW5jbHVkZSAiZ3N0djRsMnZpZGVvZGVjLmgiCisKKyNpbmNsdWRlICJnc3QvZ3N0LWkxOG4tcGx1Z2luLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9FWFRFUk4gKHY0bDJfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgdjRsMl9kZWJ1ZworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnc3RfdjRsMl9nZXRfY2FwYWJpbGl0aWVzKCk6CisgKiAgIGdldCB0aGUgZGV2aWNlJ3MgY2FwdHVyaW5nIGNhcGFiaWxpdGllcworICogcmV0dXJuIHZhbHVlOiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGVycm9yCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGdib29sZWFuCitnc3RfdjRsMl9nZXRfY2FwYWJpbGl0aWVzIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCkKK3sKKyAgR3N0RWxlbWVudCAqZTsKKworICBlID0gdjRsMm9iamVjdC0+ZWxlbWVudDsKKworICBHU1RfREVCVUdfT0JKRUNUIChlLCAiZ2V0dGluZyBjYXBhYmlsaXRpZXMiKTsKKworICBpZiAoIUdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfUVVFUllDQVAsCisgICAgICAgICAgJnY0bDJvYmplY3QtPnZjYXApIDwgMCkKKyAgICBnb3RvIGNhcF9mYWlsZWQ7CisKKyAgaWYgKHY0bDJvYmplY3QtPnZjYXAuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfREVWSUNFX0NBUFMpCisgICAgdjRsMm9iamVjdC0+ZGV2aWNlX2NhcHMgPSB2NGwyb2JqZWN0LT52Y2FwLmRldmljZV9jYXBzOworICBlbHNlCisgICAgdjRsMm9iamVjdC0+ZGV2aWNlX2NhcHMgPSB2NGwyb2JqZWN0LT52Y2FwLmNhcGFiaWxpdGllczsKKworICBHU1RfTE9HX09CSkVDVCAoZSwgImRyaXZlcjogICAgICAnJXMnIiwgdjRsMm9iamVjdC0+dmNhcC5kcml2ZXIpOworICBHU1RfTE9HX09CSkVDVCAoZSwgImNhcmQ6ICAgICAgICAnJXMnIiwgdjRsMm9iamVjdC0+dmNhcC5jYXJkKTsKKyAgR1NUX0xPR19PQkpFQ1QgKGUsICJidXNfaW5mbzogICAgJyVzJyIsIHY0bDJvYmplY3QtPnZjYXAuYnVzX2luZm8pOworICBHU1RfTE9HX09CSkVDVCAoZSwgInZlcnNpb246ICAgICAlMDh4IiwgdjRsMm9iamVjdC0+dmNhcC52ZXJzaW9uKTsKKyAgR1NUX0xPR19PQkpFQ1QgKGUsICJjYXBhYmlsaXRlczogJTA4eCIsIHY0bDJvYmplY3QtPmRldmljZV9jYXBzKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2NhcF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiRXJyb3IgZ2V0dGluZyBjYXBhYmlsaXRpZXMgZm9yIGRldmljZSAnJXMnOiAiCisgICAgICAgICAgICAgICAgIkl0IGlzbid0IGEgdjRsMiBkcml2ZXIuIENoZWNrIGlmIGl0IGlzIGEgdjRsMSBkcml2ZXIuIiksCisgICAgICAgICAgICB2NGwyb2JqZWN0LT52aWRlb2RldiksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGUgdmlkZW80bGludXggY29tbWFuZCBsaW5lIHRvb2wgdjRsMi1jdHJsCisgKiBub3JtYWxpc2VzIHRoZSBuYW1lcyBvZiB0aGUgY29udHJvbHMgcmVjZWl2ZWQgZnJvbQorICogdGhlIGtlcm5lbCBsaWtlOgorICoKKyAqICAgICAiRXhwb3N1cmUgKGFic29sdXRlKSIgLT4gImV4cG9zdXJlX2Fic29sdXRlIgorICoKKyAqIFdlIGZvbGxvdyB0aGVpciBsZWFkIGhlcmUuICBAbmFtZSBpcyBtb2RpZmllZAorICogaW4tcGxhY2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2dzdF92NGwyX25vcm1hbGlzZV9jb250cm9sX25hbWUgKGdjaGFyICogbmFtZSkKK3sKKyAgaW50IGksIGo7CisgIGZvciAoaSA9IDAsIGogPSAwOyBuYW1lW2pdOyArK2opIHsKKyAgICBpZiAoZ19hc2NpaV9pc2FsbnVtIChuYW1lW2pdKSkgeworICAgICAgaWYgKGkgPiAwICYmICFnX2FzY2lpX2lzYWxudW0gKG5hbWVbaiAtIDFdKSkKKyAgICAgICAgbmFtZVtpKytdID0gJ18nOworICAgICAgbmFtZVtpKytdID0gZ19hc2NpaV90b2xvd2VyIChuYW1lW2pdKTsKKyAgICB9CisgIH0KKyAgbmFtZVtpKytdID0gJ1wwJzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ3N0X3Y0bDJfZW1wdHlfbGlzdHMoKSBhbmQgZ3N0X3Y0bDJfZmlsbF9saXN0cygpOgorICogICBmaWxsL2VtcHR5IHRoZSBsaXN0cyBvZiBlbnVtZXJhdGlvbnMKKyAqIHJldHVybiB2YWx1ZTogVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBlcnJvcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3Y0bDJfZmlsbF9saXN0cyAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpCit7CisgIGdpbnQgbiwgbmV4dDsKKyAgc3RydWN0IHY0bDJfcXVlcnljdHJsIGNvbnRyb2wgPSB7IDAsIH07CisKKyAgR3N0RWxlbWVudCAqZTsKKworICBlID0gdjRsMm9iamVjdC0+ZWxlbWVudDsKKworICBHU1RfREVCVUdfT0JKRUNUIChlLCAiZ2V0dGluZyBlbnVtZXJhdGlvbnMiKTsKKyAgR1NUX1Y0TDJfQ0hFQ0tfT1BFTiAodjRsMm9iamVjdCk7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZSwgIiAgY2hhbm5lbHMiKTsKKyAgLyogYW5kIG5vdywgdGhlIGNoYW5uZWxzICovCisgIGZvciAobiA9IDA7OyBuKyspIHsKKyAgICBzdHJ1Y3QgdjRsMl9pbnB1dCBpbnB1dDsKKyAgICBHc3RWNGwyVHVuZXJDaGFubmVsICp2NGwyY2hhbm5lbDsKKyAgICBHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWw7CisKKyAgICBtZW1zZXQgKCZpbnB1dCwgMCwgc2l6ZW9mIChpbnB1dCkpOworCisgICAgaW5wdXQuaW5kZXggPSBuOworICAgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19FTlVNSU5QVVQsICZpbnB1dCkgPCAwKSB7CisgICAgICBpZiAoZXJybm8gPT0gRUlOVkFMIHx8IGVycm5vID09IEVOT1RUWSkKKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGVudW1lcmF0aW9uICovCisgICAgICBlbHNlIHsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGUsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgICAgIChfKCJGYWlsZWQgdG8gcXVlcnkgYXR0cmlidXRlcyBvZiBpbnB1dCAlZCBpbiBkZXZpY2UgJXMiKSwKKyAgICAgICAgICAgICAgICBuLCB2NGwyb2JqZWN0LT52aWRlb2RldiksCisgICAgICAgICAgICAoIkZhaWxlZCB0byBnZXQgJWQgaW4gaW5wdXQgZW51bWVyYXRpb24gZm9yICVzLiAoJWQgLSAlcykiLAorICAgICAgICAgICAgICAgIG4sIHY0bDJvYmplY3QtPnZpZGVvZGV2LCBlcnJubywgc3RyZXJyb3IgKGVycm5vKSkpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorCisgICAgR1NUX0xPR19PQkpFQ1QgKGUsICIgICBpbmRleDogICAgICVkIiwgaW5wdXQuaW5kZXgpOworICAgIEdTVF9MT0dfT0JKRUNUIChlLCAiICAgbmFtZTogICAgICAnJXMnIiwgaW5wdXQubmFtZSk7CisgICAgR1NUX0xPR19PQkpFQ1QgKGUsICIgICB0eXBlOiAgICAgICUwOHgiLCBpbnB1dC50eXBlKTsKKyAgICBHU1RfTE9HX09CSkVDVCAoZSwgIiAgIGF1ZGlvc2V0OiAgJTA4eCIsIGlucHV0LmF1ZGlvc2V0KTsKKyAgICBHU1RfTE9HX09CSkVDVCAoZSwgIiAgIHN0ZDogICAgICAgJTAxNiIgR19HSU5UNjRfTU9ESUZJRVIgIngiLAorICAgICAgICAoZ3VpbnQ2NCkgaW5wdXQuc3RkKTsKKyAgICBHU1RfTE9HX09CSkVDVCAoZSwgIiAgIHN0YXR1czogICAgJTA4eCIsIGlucHV0LnN0YXR1cyk7CisKKyAgICB2NGwyY2hhbm5lbCA9IGdfb2JqZWN0X25ldyAoR1NUX1RZUEVfVjRMMl9UVU5FUl9DSEFOTkVMLCBOVUxMKTsKKyAgICBjaGFubmVsID0gR1NUX1RVTkVSX0NIQU5ORUwgKHY0bDJjaGFubmVsKTsKKyAgICBjaGFubmVsLT5sYWJlbCA9IGdfc3RyZHVwICgoY29uc3QgZ2NoYXIgKikgaW5wdXQubmFtZSk7CisgICAgY2hhbm5lbC0+ZmxhZ3MgPSBHU1RfVFVORVJfQ0hBTk5FTF9JTlBVVDsKKyAgICB2NGwyY2hhbm5lbC0+aW5kZXggPSBuOworCisgICAgaWYgKGlucHV0LnR5cGUgPT0gVjRMMl9JTlBVVF9UWVBFX1RVTkVSKSB7CisgICAgICBzdHJ1Y3QgdjRsMl90dW5lciB2dHVuOworCisgICAgICB2NGwyY2hhbm5lbC0+dHVuZXIgPSBpbnB1dC50dW5lcjsKKyAgICAgIGNoYW5uZWwtPmZsYWdzIHw9IEdTVF9UVU5FUl9DSEFOTkVMX0ZSRVFVRU5DWTsKKworICAgICAgdnR1bi5pbmRleCA9IGlucHV0LnR1bmVyOworICAgICAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX0dfVFVORVIsICZ2dHVuKSA8IDApIHsKKyAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGUsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgICAgIChfKCJGYWlsZWQgdG8gZ2V0IHNldHRpbmcgb2YgdHVuZXIgJWQgb24gZGV2aWNlICclcycuIiksCisgICAgICAgICAgICAgICAgaW5wdXQudHVuZXIsIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgICAgIGdfb2JqZWN0X3VucmVmIChHX09CSkVDVCAoY2hhbm5lbCkpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisKKyAgICAgIGNoYW5uZWwtPmZyZXFfbXVsdGlwbGljYXRvciA9CisgICAgICAgICAgNjIuNSAqICgodnR1bi5jYXBhYmlsaXR5ICYgVjRMMl9UVU5FUl9DQVBfTE9XKSA/IDEgOiAxMDAwKTsKKyAgICAgIGNoYW5uZWwtPm1pbl9mcmVxdWVuY3kgPSB2dHVuLnJhbmdlbG93ICogY2hhbm5lbC0+ZnJlcV9tdWx0aXBsaWNhdG9yOworICAgICAgY2hhbm5lbC0+bWF4X2ZyZXF1ZW5jeSA9IHZ0dW4ucmFuZ2VoaWdoICogY2hhbm5lbC0+ZnJlcV9tdWx0aXBsaWNhdG9yOworICAgICAgY2hhbm5lbC0+bWluX3NpZ25hbCA9IDA7CisgICAgICBjaGFubmVsLT5tYXhfc2lnbmFsID0gMHhmZmZmOworICAgIH0KKyAgICBpZiAoaW5wdXQuYXVkaW9zZXQpIHsKKyAgICAgIC8qIHdlIHRha2UgdGhlIGZpcnN0LiBXZSBkb24ndCBjYXJlIGZvcgorICAgICAgICogdGhlIG90aGVycyBmb3Igbm93ICovCisgICAgICB3aGlsZSAoIShpbnB1dC5hdWRpb3NldCAmICgxIDw8IHY0bDJjaGFubmVsLT5hdWRpbykpKQorICAgICAgICB2NGwyY2hhbm5lbC0+YXVkaW8rKzsKKyAgICAgIGNoYW5uZWwtPmZsYWdzIHw9IEdTVF9UVU5FUl9DSEFOTkVMX0FVRElPOworICAgIH0KKworICAgIHY0bDJvYmplY3QtPmNoYW5uZWxzID0KKyAgICAgICAgZ19saXN0X3ByZXBlbmQgKHY0bDJvYmplY3QtPmNoYW5uZWxzLCAoZ3BvaW50ZXIpIGNoYW5uZWwpOworICB9CisgIHY0bDJvYmplY3QtPmNoYW5uZWxzID0gZ19saXN0X3JldmVyc2UgKHY0bDJvYmplY3QtPmNoYW5uZWxzKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChlLCAiICBub3JtcyIpOworICAvKiBub3Jtcy4uLiAqLworICBmb3IgKG4gPSAwOzsgbisrKSB7CisgICAgc3RydWN0IHY0bDJfc3RhbmRhcmQgc3RhbmRhcmQgPSB7IDAsIH07CisgICAgR3N0VjRsMlR1bmVyTm9ybSAqdjRsMm5vcm07CisKKyAgICBHc3RUdW5lck5vcm0gKm5vcm07CisKKyAgICAvKiBmaWxsIGluIGRlZmF1bHRzICovCisgICAgc3RhbmRhcmQuZnJhbWVwZXJpb2QubnVtZXJhdG9yID0gMTsKKyAgICBzdGFuZGFyZC5mcmFtZXBlcmlvZC5kZW5vbWluYXRvciA9IDA7CisgICAgc3RhbmRhcmQuaW5kZXggPSBuOworCisgICAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX0VOVU1TVEQsICZzdGFuZGFyZCkgPCAwKSB7CisgICAgICBpZiAoZXJybm8gPT0gRUlOVkFMIHx8IGVycm5vID09IEVOT1RUWSkKKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGVudW1lcmF0aW9uICovCisjaWZkZWYgRU5PREFUQQorICAgICAgZWxzZSBpZiAoZXJybm8gPT0gRU5PREFUQSkKKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGVudW1lcmF0aW9uLCBhcyBvZiBMaW51eCAzLjctcmMxICovCisjZW5kaWYKKyAgICAgIGVsc2UgeworICAgICAgICBHU1RfRUxFTUVOVF9FUlJPUiAoZSwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAgICAgKF8oIkZhaWxlZCB0byBxdWVyeSBub3JtIG9uIGRldmljZSAnJXMnLiIpLAorICAgICAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwKKyAgICAgICAgICAgICgiRmFpbGVkIHRvIGdldCBhdHRyaWJ1dGVzIGZvciBub3JtICVkIG9uIGRldmlkZSAnJXMnLiAoJWQgLSAlcykiLAorICAgICAgICAgICAgICAgIG4sIHY0bDJvYmplY3QtPnZpZGVvZGV2LCBlcnJubywgc3RyZXJyb3IgKGVycm5vKSkpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorCisgICAgR1NUX0RFQlVHX09CSkVDVCAoZSwgIiAgICAnJXMnLCBmcHM6ICVkIC8gJWQiLAorICAgICAgICBzdGFuZGFyZC5uYW1lLCBzdGFuZGFyZC5mcmFtZXBlcmlvZC5kZW5vbWluYXRvciwKKyAgICAgICAgc3RhbmRhcmQuZnJhbWVwZXJpb2QubnVtZXJhdG9yKTsKKworICAgIHY0bDJub3JtID0gZ19vYmplY3RfbmV3IChHU1RfVFlQRV9WNEwyX1RVTkVSX05PUk0sIE5VTEwpOworICAgIG5vcm0gPSBHU1RfVFVORVJfTk9STSAodjRsMm5vcm0pOworICAgIG5vcm0tPmxhYmVsID0gZ19zdHJkdXAgKChjb25zdCBnY2hhciAqKSBzdGFuZGFyZC5uYW1lKTsKKyAgICBnc3RfdmFsdWVfc2V0X2ZyYWN0aW9uICgmbm9ybS0+ZnJhbWVyYXRlLAorICAgICAgICBzdGFuZGFyZC5mcmFtZXBlcmlvZC5kZW5vbWluYXRvciwgc3RhbmRhcmQuZnJhbWVwZXJpb2QubnVtZXJhdG9yKTsKKyAgICB2NGwybm9ybS0+aW5kZXggPSBzdGFuZGFyZC5pZDsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJpbmRleD0lMDh4LCBsYWJlbD0lcyIsCisgICAgICAgICh1bnNpZ25lZCBpbnQpIHY0bDJub3JtLT5pbmRleCwgbm9ybS0+bGFiZWwpOworCisgICAgdjRsMm9iamVjdC0+bm9ybXMgPSBnX2xpc3RfcHJlcGVuZCAodjRsMm9iamVjdC0+bm9ybXMsIChncG9pbnRlcikgbm9ybSk7CisgIH0KKyAgdjRsMm9iamVjdC0+bm9ybXMgPSBnX2xpc3RfcmV2ZXJzZSAodjRsMm9iamVjdC0+bm9ybXMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGUsICIgIGNvbnRyb2xzK21lbnVzIik7CisKKyAgLyogYW5kIGxhc3RseSwgY29udHJvbHMrbWVudXMgKGlmIGFwcHJvcHJpYXRlKSAqLworICBuZXh0ID0gVjRMMl9DVFJMX0ZMQUdfTkVYVF9DVFJMOworICBuID0gMDsKKyAgY29udHJvbC5pZCA9IG5leHQ7CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBHc3RWNGwyQ29sb3JCYWxhbmNlQ2hhbm5lbCAqdjRsMmNoYW5uZWw7CisgICAgR3N0Q29sb3JCYWxhbmNlQ2hhbm5lbCAqY2hhbm5lbDsKKworICAgIGlmICghbmV4dCkKKyAgICAgIG4rKzsKKworICByZXRyeToKKyAgICAvKiB3aGVuIHdlIHJlYWNoZWQgdGhlIGxhc3Qgb2ZmaWNpYWwgQ0lELCBjb250aW51ZSB3aXRoIHByaXZhdGUgQ0lEcyAqLworICAgIGlmIChuID09IFY0TDJfQ0lEX0xBU1RQMSkgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZSwgImNoZWNraW5nIHByaXZhdGUgQ0lEcyIpOworICAgICAgbiA9IFY0TDJfQ0lEX1BSSVZBVEVfQkFTRTsKKyAgICB9CisgICAgR1NUX0RFQlVHX09CSkVDVCAoZSwgImNoZWNraW5nIGNvbnRyb2wgJTA4eCIsIG4pOworCisgICAgY29udHJvbC5pZCA9IG4gfCBuZXh0OworICAgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19RVUVSWUNUUkwsCisgICAgICAgICAgICAmY29udHJvbCkgPCAwKSB7CisgICAgICBpZiAobmV4dCkgeworICAgICAgICBpZiAobiA+IDApIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChlLCAiY29udHJvbHMgZmluaXNoZWQiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChlLCAiVjRMMl9DVFJMX0ZMQUdfTkVYVF9DVFJMIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgICAgbmV4dCA9IDA7CisgICAgICAgICAgbiA9IFY0TDJfQ0lEX0JBU0U7CisgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGVycm5vID09IEVJTlZBTCB8fCBlcnJubyA9PSBFTk9UVFkgfHwgZXJybm8gPT0gRUlPIHx8IGVycm5vID09IEVOT0VOVCkgeworICAgICAgICBpZiAobiA8IFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSkgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGUsICJza2lwcGluZyBjb250cm9sICUwOHgiLCBuKTsKKyAgICAgICAgICAvKiBjb250aW51ZSBzbyB0aGF0IHdlIGFsc28gY2hlY2sgcHJpdmF0ZSBjb250cm9scyAqLworICAgICAgICAgIG4gPSBWNEwyX0NJRF9QUklWQVRFX0JBU0UgLSAxOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGUsICJjb250cm9scyBmaW5pc2hlZCIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBHU1RfV0FSTklOR19PQkpFQ1QgKGUsICJGYWlsZWQgcXVlcnlpbmcgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4gIgorICAgICAgICAgICAgIiglZCAtICVzKSIsIG4sIHY0bDJvYmplY3QtPnZpZGVvZGV2LCBlcnJubywgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICAvKiBib2d1cyBkcml2ZXIgbWlnaHQgbWVzcyB3aXRoIGlkIGluIHVuZXhwZWN0ZWQgd2F5cyAoZS5nLiBzZXQgdG8gMCksIHNvCisgICAgICogbWFrZSBzdXJlIHRvIHNpbXBseSB0cnkgYWxsIGlmIFY0TDJfQ1RSTF9GTEFHX05FWFRfQ1RSTCBub3Qgc3VwcG9ydGVkICovCisgICAgaWYgKG5leHQpCisgICAgICBuID0gY29udHJvbC5pZDsKKyAgICBpZiAoY29udHJvbC5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVEKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChlLCAic2tpcHBpbmcgZGlzYWJsZWQgY29udHJvbCIpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKGNvbnRyb2wudHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNTKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChlLCAic3RhcnRpbmcgY29udHJvbCBjbGFzcyAnJXMnIiwgY29udHJvbC5uYW1lKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHN3aXRjaCAoY29udHJvbC50eXBlKSB7CisgICAgICBjYXNlIFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI6CisgICAgICBjYXNlIFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU46CisgICAgICBjYXNlIFY0TDJfQ1RSTF9UWVBFX01FTlU6CisgICAgICBjYXNlIFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVJfTUVOVToKKyAgICAgIGNhc2UgVjRMMl9DVFJMX1RZUEVfQklUTUFTSzoKKyAgICAgIGNhc2UgVjRMMl9DVFJMX1RZUEVfQlVUVE9OOnsKKyAgICAgICAgY29udHJvbC5uYW1lWzMxXSA9ICdcMCc7CisgICAgICAgIGdzdF92NGwyX25vcm1hbGlzZV9jb250cm9sX25hbWUgKChnY2hhciAqKSBjb250cm9sLm5hbWUpOworICAgICAgICBnX2RhdGFsaXN0X2lkX3NldF9kYXRhICgmdjRsMm9iamVjdC0+Y29udHJvbHMsCisgICAgICAgICAgICBnX3F1YXJrX2Zyb21fc3RyaW5nICgoY29uc3QgZ2NoYXIgKikgY29udHJvbC5uYW1lKSwKKyAgICAgICAgICAgIEdJTlRfVE9fUE9JTlRFUiAobikpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGUsCisgICAgICAgICAgICAiQ29udHJvbCB0eXBlIGZvciAnJXMnIG5vdCBzdXBwb3JlZCBmb3IgZXh0cmEgY29udHJvbHMuIiwKKyAgICAgICAgICAgIGNvbnRyb2wubmFtZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAobikgeworICAgICAgY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgorICAgICAgY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKyAgICAgIGNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKyAgICAgIGNhc2UgVjRMMl9DSURfSFVFOgorICAgICAgY2FzZSBWNEwyX0NJRF9CTEFDS19MRVZFTDoKKyAgICAgIGNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgorICAgICAgY2FzZSBWNEwyX0NJRF9ET19XSElURV9CQUxBTkNFOgorICAgICAgY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKKyAgICAgIGNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgorICAgICAgY2FzZSBWNEwyX0NJRF9HQU1NQToKKyAgICAgIGNhc2UgVjRMMl9DSURfRVhQT1NVUkU6CisgICAgICBjYXNlIFY0TDJfQ0lEX0FVVE9HQUlOOgorICAgICAgY2FzZSBWNEwyX0NJRF9HQUlOOgorICAgICAgY2FzZSBWNEwyX0NJRF9TSEFSUE5FU1M6CisgICAgICAgIC8qIHdlIG9ubHkgaGFuZGxlIHRoZXNlIGZvciBub3cgKHdoeT8pICovCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBWNEwyX0NJRF9IRkxJUDoKKyAgICAgIGNhc2UgVjRMMl9DSURfVkZMSVA6CisgICAgICBjYXNlIFY0TDJfQ0lEX1BBTl9SRVNFVDoKKyAgICAgIGNhc2UgVjRMMl9DSURfVElMVF9SRVNFVDoKKyAgICAgICAgLyogbm90IGhhbmRsZWQgaGVyZSwgaGFuZGxlZCBieSBWaWRlb09yaWVudGF0aW9uIGludGVyZmFjZSAqLworICAgICAgICBjb250cm9sLmlkKys7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CisgICAgICBjYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6CisgICAgICBjYXNlIFY0TDJfQ0lEX0FVRElPX0JBU1M6CisgICAgICBjYXNlIFY0TDJfQ0lEX0FVRElPX1RSRUJMRToKKyAgICAgIGNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKKyAgICAgIGNhc2UgVjRMMl9DSURfQVVESU9fTE9VRE5FU1M6CisgICAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgaW1wbGVtZW50IEdzdE1peGVyIGludGVyZmFjZSBpbnN0ZWFkICovCisgICAgICAgIC8qIGJ1dCBsZXQncyBub3QgYmUgcGVkYW50aWMgYW5kIG1ha2UgZWxlbWVudCBtb3JlIHVzZWZ1bCBmb3Igbm93ICovCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBWNEwyX0NJRF9BTFBIQV9DT01QT05FTlQ6CisgICAgICAgIHY0bDJvYmplY3QtPmhhc19hbHBoYV9jb21wb25lbnQgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKGUsCisgICAgICAgICAgICAiQ29udHJvbElEICVzICgleCkgdW5oYW5kbGVkLCBGSVhNRSIsIGNvbnRyb2wubmFtZSwgbik7CisgICAgICAgIGNvbnRyb2wuaWQrKzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChuICE9IGNvbnRyb2wuaWQpCisgICAgICBjb250aW51ZTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKGUsICJBZGRpbmcgQ29udHJvbElEICVzICgleCkiLCBjb250cm9sLm5hbWUsIG4pOworICAgIHY0bDJjaGFubmVsID0gZ19vYmplY3RfbmV3IChHU1RfVFlQRV9WNEwyX0NPTE9SX0JBTEFOQ0VfQ0hBTk5FTCwgTlVMTCk7CisgICAgY2hhbm5lbCA9IEdTVF9DT0xPUl9CQUxBTkNFX0NIQU5ORUwgKHY0bDJjaGFubmVsKTsKKyAgICBjaGFubmVsLT5sYWJlbCA9IGdfc3RyZHVwICgoY29uc3QgZ2NoYXIgKikgY29udHJvbC5uYW1lKTsKKyAgICB2NGwyY2hhbm5lbC0+aWQgPSBuOworCisjaWYgMAorICAgIC8qIEZJWE1FOiBpdCB3aWxsIGJlIG5lZWQganVzdCB3aGVuIGhhbmRsaW5nIHByaXZhdGUgY29udHJvbHMKKyAgICAgKihjdXJyZW50bHkgbm9uZSBvZiBiYXNlIGNvbnRyb2xzIGFyZSBvZiB0aGlzIHR5cGUpICovCisgICAgaWYgKGNvbnRyb2wudHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9NRU5VKSB7CisgICAgICBzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUgbWVudSwgKm1wdHI7CisKKyAgICAgIGludCBpOworCisgICAgICBtZW51LmlkID0gbjsKKyAgICAgIGZvciAoaSA9IDA7OyBpKyspIHsKKyAgICAgICAgbWVudS5pbmRleCA9IGk7CisgICAgICAgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19RVUVSWU1FTlUsCisgICAgICAgICAgICAgICAgJm1lbnUpIDwgMCkgeworICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5WQUwpCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgIC8qIGVuZCBvZiBlbnVtZXJhdGlvbiAqLworICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgR1NUX0VMRU1FTlRfRVJST1IgKGUsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgICAgICAgICAoXygiRmFpbGVkIGdldHRpbmcgY29udHJvbHMgYXR0cmlidXRlcyBvbiBkZXZpY2UgJyVzJy4iKSwKKyAgICAgICAgICAgICAgICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYpLAorICAgICAgICAgICAgICAgICgiRmFpbGVkIHRvIGdldCAlZCBpbiBtZW51IGVudW1lcmF0aW9uIGZvciAlcy4gKCVkIC0gJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgbiwgdjRsMm9iamVjdC0+dmlkZW9kZXYsIGVycm5vLCBzdHJlcnJvciAoZXJybm8pKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1wdHIgPSBnX21hbGxvYyAoc2l6ZW9mIChtZW51KSk7CisgICAgICAgIG1lbWNweSAobXB0ciwgJm1lbnUsIHNpemVvZiAobWVudSkpOworICAgICAgICBtZW51cyA9IGdfbGlzdF9hcHBlbmQgKG1lbnVzLCBtcHRyKTsKKyAgICAgIH0KKyAgICB9CisgICAgdjRsMm9iamVjdC0+bWVudXMgPSBnX2xpc3RfYXBwZW5kICh2NGwyb2JqZWN0LT5tZW51cywgbWVudXMpOworI2VuZGlmCisKKyAgICBzd2l0Y2ggKGNvbnRyb2wudHlwZSkgeworICAgICAgY2FzZSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSOgorICAgICAgICBjaGFubmVsLT5taW5fdmFsdWUgPSBjb250cm9sLm1pbmltdW07CisgICAgICAgIGNoYW5uZWwtPm1heF92YWx1ZSA9IGNvbnRyb2wubWF4aW11bTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU46CisgICAgICAgIGNoYW5uZWwtPm1pbl92YWx1ZSA9IEZBTFNFOworICAgICAgICBjaGFubmVsLT5tYXhfdmFsdWUgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIEZJWE1FIHdlIHNob3VsZCBmaW5kIG91dCBob3cgdG8gaGFuZGxlIFY0TDJfQ1RSTF9UWVBFX0JVVFRPTi4KKyAgICAgICAgICAgQlVUVE9OIGNvbnRyb2xzIGxpa2UgVjRMMl9DSURfRE9fV0hJVEVfQkFMQU5DRSBjYW4ganVzdCBiZSBzZXQgKDEpIG9yCisgICAgICAgICAgIHVuc2V0ICgwKSwgYnV0IGNhbid0IGJlIHF1ZXJpZWQgKi8KKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoZSwKKyAgICAgICAgICAgICJDb250cm9sIHdpdGggbm9uIHN1cHBvcnRlZCB0eXBlICVzICgleCksIHR5cGU9JWQiLAorICAgICAgICAgICAgY29udHJvbC5uYW1lLCBuLCBjb250cm9sLnR5cGUpOworICAgICAgICBjaGFubmVsLT5taW5fdmFsdWUgPSBjaGFubmVsLT5tYXhfdmFsdWUgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB2NGwyb2JqZWN0LT5jb2xvcnMgPQorICAgICAgICBnX2xpc3RfcHJlcGVuZCAodjRsMm9iamVjdC0+Y29sb3JzLCAoZ3BvaW50ZXIpIGNoYW5uZWwpOworICB9CisgIHY0bDJvYmplY3QtPmNvbG9ycyA9IGdfbGlzdF9yZXZlcnNlICh2NGwyb2JqZWN0LT5jb2xvcnMpOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGUsICJkb25lIik7CisgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyB2b2lkCitnc3RfdjRsMl9lbXB0eV9saXN0cyAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJkZWxldGluZyBlbnVtZXJhdGlvbnMiKTsKKworICBnX2xpc3RfZm9yZWFjaCAodjRsMm9iamVjdC0+Y2hhbm5lbHMsIChHRnVuYykgZ19vYmplY3RfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAodjRsMm9iamVjdC0+Y2hhbm5lbHMpOworICB2NGwyb2JqZWN0LT5jaGFubmVscyA9IE5VTEw7CisKKyAgZ19saXN0X2ZvcmVhY2ggKHY0bDJvYmplY3QtPm5vcm1zLCAoR0Z1bmMpIGdfb2JqZWN0X3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKHY0bDJvYmplY3QtPm5vcm1zKTsKKyAgdjRsMm9iamVjdC0+bm9ybXMgPSBOVUxMOworCisgIGdfbGlzdF9mb3JlYWNoICh2NGwyb2JqZWN0LT5jb2xvcnMsIChHRnVuYykgZ19vYmplY3RfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAodjRsMm9iamVjdC0+Y29sb3JzKTsKKyAgdjRsMm9iamVjdC0+Y29sb3JzID0gTlVMTDsKKworICBnX2RhdGFsaXN0X2NsZWFyICgmdjRsMm9iamVjdC0+Y29udHJvbHMpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3Y0bDJfYWRqdXN0X2J1Zl90eXBlIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCkKK3sKKyAgLyogd2hlbiBjYWxsaW5nIGdzdF92NGwyX29iamVjdF9uZXcgdGhlIHVzZXIgZGVjaWRlcyB0aGUgaW5pdGlhbCB0eXBlCisgICAqIHNvIGFkanVzdCBpdCBpZiBtdWx0aS1wbGFuYXIgaXMgc3VwcG9ydGVkCisgICAqIHRoZSBkcml2ZXIgc2hvdWxkIG1ha2UgaXQgZXhjbHVzaXZlLiBTbyB0aGUgZHJpdmVyIHNob3VsZAorICAgKiBub3Qgc3VwcG9ydCBib3RoIE1QTEFORSBhbmQgbm9uLVBMQU5FLgorICAgKiBCZWNhdXNlIGV2ZW4gd2hlbiB1c2luZyBNUExBTkUgaXQgc3RpbGwgcG9zc2libGVzIHRvIHVzZSBpdAorICAgKiBpbiBhIGNvbnRpZ3VvdXMgbWFubmVyLiBJbiB0aGlzIGNhc2UgdGhlIGZpcnN0IHY0bDIgcGxhbmUKKyAgICogY29udGFpbnMgYWxsIHRoZSBnc3QgcGxhbmVzLgorICAgKi8KKyAgc3dpdGNoICh2NGwyb2JqZWN0LT50eXBlKSB7CisgICAgY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDoKKyAgICAgIGlmICh2NGwyb2JqZWN0LT5kZXZpY2VfY2FwcyAmCisgICAgICAgICAgKFY0TDJfQ0FQX1ZJREVPX09VVFBVVF9NUExBTkUgfCBWNEwyX0NBUF9WSURFT19NMk1fTVBMQU5FKSkgeworICAgICAgICBHU1RfREVCVUcgKCJhZGp1c3QgdHlwZSB0byBtdWx0aS1wbGFuYXIgb3V0cHV0Iik7CisgICAgICAgIHY0bDJvYmplY3QtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKyAgICAgIGlmICh2NGwyb2JqZWN0LT5kZXZpY2VfY2FwcyAmCisgICAgICAgICAgKFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkVfTVBMQU5FIHwgVjRMMl9DQVBfVklERU9fTTJNX01QTEFORSkpIHsKKyAgICAgICAgR1NUX0RFQlVHICgiYWRqdXN0IHR5cGUgdG8gbXVsdGktcGxhbmFyIGNhcHR1cmUiKTsKKyAgICAgICAgdjRsMm9iamVjdC0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ3N0X3Y0bDJfb3BlbigpOgorICogICBvcGVuIHRoZSB2aWRlbyBkZXZpY2UgKHY0bDJvYmplY3QtPnZpZGVvZGV2KQorICogcmV0dXJuIHZhbHVlOiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGVycm9yCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZ2Jvb2xlYW4KK2dzdF92NGwyX29wZW4gKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KQoreworICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgaW50IGxpYnY0bDJfZmQgPSAtMTsKKworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiVHJ5aW5nIHRvIG9wZW4gZGV2aWNlICVzIiwKKyAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2KTsKKworICBHU1RfVjRMMl9DSEVDS19OT1RfT1BFTiAodjRsMm9iamVjdCk7CisgIEdTVF9WNEwyX0NIRUNLX05PVF9BQ1RJVkUgKHY0bDJvYmplY3QpOworCisgIC8qIGJlIHN1cmUgd2UgaGF2ZSBhIGRldmljZSAqLworICBpZiAoIXY0bDJvYmplY3QtPnZpZGVvZGV2KQorICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2ID0gZ19zdHJkdXAgKCIvZGV2L3ZpZGVvIik7CisKKyAgLyogY2hlY2sgaWYgaXQgaXMgYSBkZXZpY2UgKi8KKyAgaWYgKHN0YXQgKHY0bDJvYmplY3QtPnZpZGVvZGV2LCAmc3QpID09IC0xKQorICAgIGdvdG8gc3RhdF9mYWlsZWQ7CisKKyAgaWYgKCFTX0lTQ0hSIChzdC5zdF9tb2RlKSkKKyAgICBnb3RvIG5vX2RldmljZTsKKworICAvKiBvcGVuIHRoZSBkZXZpY2UgKi8KKyAgdjRsMm9iamVjdC0+dmlkZW9fZmQgPQorICAgICAgb3BlbiAodjRsMm9iamVjdC0+dmlkZW9kZXYsIE9fUkRXUiAvKiB8IE9fTk9OQkxPQ0sgKi8gKTsKKworICBpZiAoIUdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKQorICAgIGdvdG8gbm90X29wZW47CisKKyNpZmRlZiBIQVZFX0xJQlY0TDIKKyAgaWYgKHY0bDJvYmplY3QtPmZkX29wZW4pCisgICAgbGlidjRsMl9mZCA9IHY0bDJvYmplY3QtPmZkX29wZW4gKHY0bDJvYmplY3QtPnZpZGVvX2ZkLAorICAgICAgICBWNEwyX0VOQUJMRV9FTlVNX0ZNVF9FTVVMQVRJT04pOworI2VuZGlmCisKKyAgLyogTm90ZSB0aGUgdjRsMl94eHggZnVuY3Rpb25zIGFyZSBkZXNpZ25lZCBzbyB0aGF0IGlmIHRoZXkgZ2V0IHBhc3NlZCBhbgorICAgICB1bmtub3duIGZkLCB0aGUgd2lsbCBiZWhhdmUgZXhhY3RseSBhcyB0aGVpciByZWd1bGFyIHh4eCBjb3VudGVycGFydHMsIHNvCisgICAgIGlmIHY0bDJfZmRfb3BlbiBmYWlscywgd2UgY29udGludWUgYXMgbm9ybWFsIChtaXNzaW5nIHRoZSBsaWJ2NGwyIGN1c3RvbQorICAgICBjYW0gZm9ybWF0IHRvIG5vcm1hbCBmb3JtYXRzIGNvbnZlcnNpb24pLiBDaGFuY2VzIGFyZSBiaWcgd2Ugd2lsbCBzdGlsbAorICAgICBmYWlsIHRoZW4gdGhvdWdoLCBhcyBub3JtYWxseSB2NGwyX2ZkX29wZW4gb25seSBmYWlscyBpZiB0aGUgZGV2aWNlIGlzIG5vdAorICAgICBhIHY0bDIgZGV2aWNlLiAqLworICBpZiAobGlidjRsMl9mZCAhPSAtMSkKKyAgICB2NGwyb2JqZWN0LT52aWRlb19mZCA9IGxpYnY0bDJfZmQ7CisKKyAgLyogZ2V0IGNhcGFiaWxpdGllcywgZXJyb3Igd2lsbCBiZSBwb3N0ZWQgKi8KKyAgaWYgKCFnc3RfdjRsMl9nZXRfY2FwYWJpbGl0aWVzICh2NGwyb2JqZWN0KSkKKyAgICBnb3RvIGVycm9yOworCisgIC8qIGRvIHdlIG5lZWQgdG8gYmUgYSBjYXB0dXJlIGRldmljZT8gKi8KKyAgaWYgKEdTVF9JU19WNEwyU1JDICh2NGwyb2JqZWN0LT5lbGVtZW50KSAmJgorICAgICAgISh2NGwyb2JqZWN0LT5kZXZpY2VfY2FwcyAmIChWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKKyAgICAgICAgICAgICAgVjRMMl9DQVBfVklERU9fQ0FQVFVSRV9NUExBTkUpKSkKKyAgICBnb3RvIG5vdF9jYXB0dXJlOworCisgIGlmIChHU1RfSVNfVjRMMlNJTksgKHY0bDJvYmplY3QtPmVsZW1lbnQpICYmCisgICAgICAhKHY0bDJvYmplY3QtPmRldmljZV9jYXBzICYgKFY0TDJfQ0FQX1ZJREVPX09VVFBVVCB8CisgICAgICAgICAgICAgIFY0TDJfQ0FQX1ZJREVPX09VVFBVVF9NUExBTkUpKSkKKyAgICBnb3RvIG5vdF9vdXRwdXQ7CisKKyAgaWYgKEdTVF9JU19WNEwyX1ZJREVPX0RFQyAodjRsMm9iamVjdC0+ZWxlbWVudCkgJiYKKyAgICAgIC8qIFRvZGF5J3MgTTJNIGRldmljZSBvbmx5IGV4cG9zZSBNMk0gKi8KKyAgICAgICEoKHY0bDJvYmplY3QtPmRldmljZV9jYXBzICYgKFY0TDJfQ0FQX1ZJREVPX00yTSB8CisgICAgICAgICAgICAgICAgICBWNEwyX0NBUF9WSURFT19NMk1fTVBMQU5FKSkgfHwKKyAgICAgICAgICAvKiBCdXQgbGVnYWN5IGRyaXZlciBtYXkgZXhwb3NlIGJvdGggQ0FQVFVSRSBhbmQgT1VUUFVUICovCisgICAgICAgICAgKCh2NGwyb2JqZWN0LT5kZXZpY2VfY2FwcyAmCisgICAgICAgICAgICAgICAgICAoVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSkgJiYKKyAgICAgICAgICAgICAgKHY0bDJvYmplY3QtPmRldmljZV9jYXBzICYKKyAgICAgICAgICAgICAgICAgIChWNEwyX0NBUF9WSURFT19PVVRQVVQgfCBWNEwyX0NBUF9WSURFT19PVVRQVVRfTVBMQU5FKSkpKSkKKyAgICBnb3RvIG5vdF9tMm07CisKKyAgZ3N0X3Y0bDJfYWRqdXN0X2J1Zl90eXBlICh2NGwyb2JqZWN0KTsKKworICAvKiBjcmVhdGUgZW51bWVyYXRpb25zLCBwb3N0cyBlcnJvcnMuICovCisgIGlmICghZ3N0X3Y0bDJfZmlsbF9saXN0cyAodjRsMm9iamVjdCkpCisgICAgZ290byBlcnJvcjsKKworICBHU1RfSU5GT19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAiT3BlbmVkIGRldmljZSAnJXMnICglcykgc3VjY2Vzc2Z1bGx5IiwKKyAgICAgIHY0bDJvYmplY3QtPnZjYXAuY2FyZCwgdjRsMm9iamVjdC0+dmlkZW9kZXYpOworCisgIGlmICh2NGwyb2JqZWN0LT5leHRyYV9jb250cm9scykKKyAgICBnc3RfdjRsMl9zZXRfY29udHJvbHMgKHY0bDJvYmplY3QsIHY0bDJvYmplY3QtPmV4dHJhX2NvbnRyb2xzKTsKKworICAvKiBVVkMgZGV2aWNlcyBhcmUgbmV2ZXIgaW50ZXJsYWNlZCwgYW5kIGRvaW5nIFZJRElPQ19UUllfRk1UIG9uIHRoZW0KKyAgICogY2F1c2VzIGV4cGVuc2l2ZSBhbmQgc2xvdyBVU0IgSU8sIHNvIGRvbid0IHByb2JlIHRoZW0gZm9yIGludGVybGFjZWQKKyAgICovCisgIGlmICghc3RyY21wICgoY2hhciAqKSB2NGwyb2JqZWN0LT52Y2FwLmRyaXZlciwgInV2Y3VzYiIpIHx8CisgICAgICAhc3RyY21wICgoY2hhciAqKSB2NGwyb2JqZWN0LT52Y2FwLmRyaXZlciwgInV2Y3ZpZGVvIikpIHsKKyAgICB2NGwyb2JqZWN0LT5uZXZlcl9pbnRlcmxhY2VkID0gVFJVRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworc3RhdF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIE5PVF9GT1VORCwKKyAgICAgICAgKF8oIkNhbm5vdCBpZGVudGlmeSBkZXZpY2UgJyVzJy4iKSwgdjRsMm9iamVjdC0+dmlkZW9kZXYpLAorICAgICAgICBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICBnb3RvIGVycm9yOworICB9Citub19kZXZpY2U6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIE5PVF9GT1VORCwKKyAgICAgICAgKF8oIlRoaXMgaXNuJ3QgYSBkZXZpY2UgJyVzJy4iKSwgdjRsMm9iamVjdC0+dmlkZW9kZXYpLAorICAgICAgICBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICBnb3RvIGVycm9yOworICB9Citub3Rfb3BlbjoKKyAgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgT1BFTl9SRUFEX1dSSVRFLAorICAgICAgICAoXygiQ291bGQgbm90IG9wZW4gZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIiksCisgICAgICAgICAgICB2NGwyb2JqZWN0LT52aWRlb2RldiksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIGdvdG8gZXJyb3I7CisgIH0KK25vdF9jYXB0dXJlOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBOT1RfRk9VTkQsCisgICAgICAgIChfKCJEZXZpY2UgJyVzJyBpcyBub3QgYSBjYXB0dXJlIGRldmljZS4iKSwKKyAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwKKyAgICAgICAgKCJDYXBhYmlsaXRpZXM6IDB4JXgiLCB2NGwyb2JqZWN0LT5kZXZpY2VfY2FwcykpOworICAgIGdvdG8gZXJyb3I7CisgIH0KK25vdF9vdXRwdXQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIE5PVF9GT1VORCwKKyAgICAgICAgKF8oIkRldmljZSAnJXMnIGlzIG5vdCBhIG91dHB1dCBkZXZpY2UuIiksCisgICAgICAgICAgICB2NGwyb2JqZWN0LT52aWRlb2RldiksCisgICAgICAgICgiQ2FwYWJpbGl0aWVzOiAweCV4IiwgdjRsMm9iamVjdC0+ZGV2aWNlX2NhcHMpKTsKKyAgICBnb3RvIGVycm9yOworICB9Citub3RfbTJtOgorICB7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBOT1RfRk9VTkQsCisgICAgICAgIChfKCJEZXZpY2UgJyVzJyBpcyBub3QgYSBNMk0gZGV2aWNlLiIpLAorICAgICAgICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYpLAorICAgICAgICAoIkNhcGFiaWxpdGllczogMHgleCIsIHY0bDJvYmplY3QtPmRldmljZV9jYXBzKSk7CisgICAgZ290byBlcnJvcjsKKyAgfQorZXJyb3I6CisgIHsKKyAgICBpZiAoR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpIHsKKyAgICAgIC8qIGNsb3NlIGRldmljZSAqLworICAgICAgdjRsMm9iamVjdC0+Y2xvc2UgKHY0bDJvYmplY3QtPnZpZGVvX2ZkKTsKKyAgICAgIHY0bDJvYmplY3QtPnZpZGVvX2ZkID0gLTE7CisgICAgfQorICAgIC8qIGVtcHR5IGxpc3RzICovCisgICAgZ3N0X3Y0bDJfZW1wdHlfbGlzdHMgKHY0bDJvYmplY3QpOworCisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9kdXAgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LCBHc3RWNGwyT2JqZWN0ICogb3RoZXIpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJUcnlpbmcgdG8gZHVwIGRldmljZSAlcyIsCisgICAgICBvdGhlci0+dmlkZW9kZXYpOworCisgIEdTVF9WNEwyX0NIRUNLX09QRU4gKG90aGVyKTsKKyAgR1NUX1Y0TDJfQ0hFQ0tfTk9UX09QRU4gKHY0bDJvYmplY3QpOworICBHU1RfVjRMMl9DSEVDS19OT1RfQUNUSVZFIChvdGhlcik7CisgIEdTVF9WNEwyX0NIRUNLX05PVF9BQ1RJVkUgKHY0bDJvYmplY3QpOworCisgIHY0bDJvYmplY3QtPnZjYXAgPSBvdGhlci0+dmNhcDsKKyAgdjRsMm9iamVjdC0+ZGV2aWNlX2NhcHMgPSBvdGhlci0+ZGV2aWNlX2NhcHM7CisgIGdzdF92NGwyX2FkanVzdF9idWZfdHlwZSAodjRsMm9iamVjdCk7CisKKyAgdjRsMm9iamVjdC0+dmlkZW9fZmQgPSB2NGwyb2JqZWN0LT5kdXAgKG90aGVyLT52aWRlb19mZCk7CisgIGlmICghR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpCisgICAgZ290byBub3Rfb3BlbjsKKworICBnX2ZyZWUgKHY0bDJvYmplY3QtPnZpZGVvZGV2KTsKKyAgdjRsMm9iamVjdC0+dmlkZW9kZXYgPSBnX3N0cmR1cCAob3RoZXItPnZpZGVvZGV2KTsKKworICBHU1RfSU5GT19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosCisgICAgICAiQ2xvbmVkIGRldmljZSAnJXMnICglcykgc3VjY2Vzc2Z1bGx5IiwKKyAgICAgIHY0bDJvYmplY3QtPnZjYXAuY2FyZCwgdjRsMm9iamVjdC0+dmlkZW9kZXYpOworCisgIHY0bDJvYmplY3QtPm5ldmVyX2ludGVybGFjZWQgPSBvdGhlci0+bmV2ZXJfaW50ZXJsYWNlZDsKKworICByZXR1cm4gVFJVRTsKKworbm90X29wZW46CisgIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIE9QRU5fUkVBRF9XUklURSwKKyAgICAgICAgKF8oIkNvdWxkIG5vdCBkdXAgZGV2aWNlICclcycgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIiksCisgICAgICAgICAgICB2NGwyb2JqZWN0LT52aWRlb2RldiksIEdTVF9FUlJPUl9TWVNURU0pOworCisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ3N0X3Y0bDJfY2xvc2UoKToKKyAqICAgY2xvc2UgdGhlIHZpZGVvIGRldmljZSAodjRsMm9iamVjdC0+dmlkZW9fZmQpCisgKiByZXR1cm4gdmFsdWU6IFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZXJyb3IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitnYm9vbGVhbgorZ3N0X3Y0bDJfY2xvc2UgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0KQoreworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiVHJ5aW5nIHRvIGNsb3NlICVzIiwKKyAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2KTsKKworICBHU1RfVjRMMl9DSEVDS19PUEVOICh2NGwyb2JqZWN0KTsKKyAgR1NUX1Y0TDJfQ0hFQ0tfTk9UX0FDVElWRSAodjRsMm9iamVjdCk7CisKKyAgLyogY2xvc2UgZGV2aWNlICovCisgIHY0bDJvYmplY3QtPmNsb3NlICh2NGwyb2JqZWN0LT52aWRlb19mZCk7CisgIHY0bDJvYmplY3QtPnZpZGVvX2ZkID0gLTE7CisKKyAgLyogZW1wdHkgbGlzdHMgKi8KKyAgZ3N0X3Y0bDJfZW1wdHlfbGlzdHMgKHY0bDJvYmplY3QpOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdzdF92NGwyX2dldF9ub3JtKCkKKyAqICAgR2V0IHRoZSBub3JtIG9mIHRoZSBjdXJyZW50IGRldmljZQorICogcmV0dXJuIHZhbHVlOiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGVycm9yCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZ2Jvb2xlYW4KK2dzdF92NGwyX2dldF9ub3JtIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgdjRsMl9zdGRfaWQgKiBub3JtKQoreworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAiZ2V0dGluZyBub3JtIik7CisKKyAgaWYgKCFHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX0dfU1RELCBub3JtKSA8IDApCisgICAgZ290byBzdGRfZmFpbGVkOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworc3RkX2ZhaWxlZDoKKyAgeworICAgIEdTVF9ERUJVRyAoIkZhaWxlZCB0byBnZXQgdGhlIGN1cnJlbnQgbm9ybSBmb3IgZGV2aWNlICVzIiwKKyAgICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdzdF92NGwyX3NldF9ub3JtKCkKKyAqICAgU2V0IHRoZSBub3JtIG9mIHRoZSBjdXJyZW50IGRldmljZQorICogcmV0dXJuIHZhbHVlOiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGVycm9yCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZ2Jvb2xlYW4KK2dzdF92NGwyX3NldF9ub3JtIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgdjRsMl9zdGRfaWQgbm9ybSkKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgInRyeWluZyB0byBzZXQgbm9ybSB0byAiCisgICAgICAiJSIgR19HSU5UNjRfTU9ESUZJRVIgIngiLCAoZ3VpbnQ2NCkgbm9ybSk7CisKKyAgaWYgKCFHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX1NfU1RELCAmbm9ybSkgPCAwKQorICAgIGdvdG8gc3RkX2ZhaWxlZDsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3N0ZF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJGYWlsZWQgdG8gc2V0IG5vcm0gZm9yIGRldmljZSAnJXMnLiIpLAorICAgICAgICAgICAgdjRsMm9iamVjdC0+dmlkZW9kZXYpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ3N0X3Y0bDJfZ2V0X2ZyZXF1ZW5jeSgpOgorICogICBnZXQgdGhlIGN1cnJlbnQgZnJlcXVlbmN5CisgKiByZXR1cm4gdmFsdWU6IFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZXJyb3IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitnYm9vbGVhbgorZ3N0X3Y0bDJfZ2V0X2ZyZXF1ZW5jeSAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgZ2ludCB0dW5lcm51bSwgZ3Vsb25nICogZnJlcXVlbmN5KQoreworICBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgZnJlcSA9IHsgMCwgfTsKKworICBHc3RUdW5lckNoYW5uZWwgKmNoYW5uZWw7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgImdldHRpbmcgY3VycmVudCB0dW5lciBmcmVxdWVuY3kiKTsKKworICBpZiAoIUdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBjaGFubmVsID0gZ3N0X3R1bmVyX2dldF9jaGFubmVsIChHU1RfVFVORVIgKHY0bDJvYmplY3QtPmVsZW1lbnQpKTsKKworICBmcmVxLnR1bmVyID0gdHVuZXJudW07CisgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19HX0ZSRVFVRU5DWSwgJmZyZXEpIDwgMCkKKyAgICBnb3RvIGZyZXFfZmFpbGVkOworCisgICpmcmVxdWVuY3kgPSBmcmVxLmZyZXF1ZW5jeSAqIGNoYW5uZWwtPmZyZXFfbXVsdGlwbGljYXRvcjsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2ZyZXFfZmFpbGVkOgorICB7CisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiRmFpbGVkIHRvIGdldCBjdXJyZW50IHR1bmVyIGZyZXF1ZW5jeSBmb3IgZGV2aWNlICclcycuIiksCisgICAgICAgICAgICB2NGwyb2JqZWN0LT52aWRlb2RldiksIEdTVF9FUlJPUl9TWVNURU0pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdzdF92NGwyX3NldF9mcmVxdWVuY3koKToKKyAqICAgc2V0IGZyZXF1ZW5jeQorICogcmV0dXJuIHZhbHVlOiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGVycm9yCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZ2Jvb2xlYW4KK2dzdF92NGwyX3NldF9mcmVxdWVuY3kgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIGdpbnQgdHVuZXJudW0sIGd1bG9uZyBmcmVxdWVuY3kpCit7CisgIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSBmcmVxID0geyAwLCB9OworCisgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbDsKKworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLAorICAgICAgInNldHRpbmcgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgdG8gJWx1IiwgZnJlcXVlbmN5KTsKKworICBpZiAoIUdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBjaGFubmVsID0gZ3N0X3R1bmVyX2dldF9jaGFubmVsIChHU1RfVFVORVIgKHY0bDJvYmplY3QtPmVsZW1lbnQpKTsKKworICBmcmVxLnR1bmVyID0gdHVuZXJudW07CisgIC8qIGZpbGwgaW4gdHlwZSAtIGlnbm9yZSBlcnJvciAqLworICAodm9pZCkgdjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfR19GUkVRVUVOQ1ksICZmcmVxKTsKKyAgZnJlcS5mcmVxdWVuY3kgPSBmcmVxdWVuY3kgLyBjaGFubmVsLT5mcmVxX211bHRpcGxpY2F0b3I7CisKKyAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX1NfRlJFUVVFTkNZLCAmZnJlcSkgPCAwKQorICAgIGdvdG8gZnJlcV9mYWlsZWQ7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitmcmVxX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkZhaWxlZCB0byBzZXQgY3VycmVudCB0dW5lciBmcmVxdWVuY3kgZm9yIGRldmljZSAnJXMnIHRvICVsdSBIei4iKSwKKyAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2LCBmcmVxdWVuY3kpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ3N0X3Y0bDJfc2lnbmFsX3N0cmVuZ3RoKCk6CisgKiAgIGdldCB0aGUgc3RyZW5ndGggb2YgdGhlIHNpZ25hbCBvbiB0aGUgY3VycmVudCBpbnB1dAorICogcmV0dXJuIHZhbHVlOiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGVycm9yCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZ2Jvb2xlYW4KK2dzdF92NGwyX3NpZ25hbF9zdHJlbmd0aCAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsCisgICAgZ2ludCB0dW5lcm51bSwgZ3Vsb25nICogc2lnbmFsX3N0cmVuZ3RoKQoreworICBzdHJ1Y3QgdjRsMl90dW5lciB0dW5lciA9IHsgMCwgfTsKKworICBHU1RfREVCVUdfT0JKRUNUICh2NGwyb2JqZWN0LT5kYmdfb2JqLCAidHJ5aW5nIHRvIGdldCBzaWduYWwgc3RyZW5ndGgiKTsKKworICBpZiAoIUdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICB0dW5lci5pbmRleCA9IHR1bmVybnVtOworICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfR19UVU5FUiwgJnR1bmVyKSA8IDApCisgICAgZ290byB0dW5lcl9mYWlsZWQ7CisKKyAgKnNpZ25hbF9zdHJlbmd0aCA9IHR1bmVyLnNpZ25hbDsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK3R1bmVyX2ZhaWxlZDoKKyAgeworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkZhaWxlZCB0byBnZXQgc2lnbmFsIHN0cmVuZ3RoIGZvciBkZXZpY2UgJyVzJy4iKSwKKyAgICAgICAgICAgIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwgR1NUX0VSUk9SX1NZU1RFTSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdzdF92NGwyX2dldF9hdHRyaWJ1dGUoKToKKyAqICAgdHJ5IHRvIGdldCB0aGUgdmFsdWUgb2Ygb25lIHNwZWNpZmljIGF0dHJpYnV0ZQorICogcmV0dXJuIHZhbHVlOiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGVycm9yCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZ2Jvb2xlYW4KK2dzdF92NGwyX2dldF9hdHRyaWJ1dGUgKEdzdFY0bDJPYmplY3QgKiB2NGwyb2JqZWN0LAorICAgIGludCBhdHRyaWJ1dGVfbnVtLCBpbnQgKnZhbHVlKQoreworICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2wgPSB7IDAsIH07CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgImdldHRpbmcgdmFsdWUgb2YgYXR0cmlidXRlICVkIiwKKyAgICAgIGF0dHJpYnV0ZV9udW0pOworCisgIGlmICghR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGNvbnRyb2wuaWQgPSBhdHRyaWJ1dGVfbnVtOworCisgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19HX0NUUkwsICZjb250cm9sKSA8IDApCisgICAgZ290byBjdHJsX2ZhaWxlZDsKKworICAqdmFsdWUgPSBjb250cm9sLnZhbHVlOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworY3RybF9mYWlsZWQ6CisgIHsKKyAgICBHU1RfV0FSTklOR19PQkpFQ1QgKHY0bDJvYmplY3QsCisgICAgICAgIF8oIkZhaWxlZCB0byBnZXQgdmFsdWUgZm9yIGNvbnRyb2wgJWQgb24gZGV2aWNlICclcycuIiksCisgICAgICAgIGF0dHJpYnV0ZV9udW0sIHY0bDJvYmplY3QtPnZpZGVvZGV2KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnc3RfdjRsMl9zZXRfYXR0cmlidXRlKCk6CisgKiAgIHRyeSB0byBzZXQgdGhlIHZhbHVlIG9mIG9uZSBzcGVjaWZpYyBhdHRyaWJ1dGUKKyAqIHJldHVybiB2YWx1ZTogVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBlcnJvcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2dib29sZWFuCitnc3RfdjRsMl9zZXRfYXR0cmlidXRlIChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwKKyAgICBpbnQgYXR0cmlidXRlX251bSwgY29uc3QgaW50IHZhbHVlKQoreworICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2wgPSB7IDAsIH07CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgInNldHRpbmcgdmFsdWUgb2YgYXR0cmlidXRlICVkIHRvICVkIiwKKyAgICAgIGF0dHJpYnV0ZV9udW0sIHZhbHVlKTsKKworICBpZiAoIUdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBjb250cm9sLmlkID0gYXR0cmlidXRlX251bTsKKyAgY29udHJvbC52YWx1ZSA9IHZhbHVlOworICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCkgPCAwKQorICAgIGdvdG8gY3RybF9mYWlsZWQ7CisKKyAgcmV0dXJuIFRSVUU7CisKKyAgLyogRVJST1JTICovCitjdHJsX2ZhaWxlZDoKKyAgeworICAgIEdTVF9XQVJOSU5HX09CSkVDVCAodjRsMm9iamVjdCwKKyAgICAgICAgXygiRmFpbGVkIHRvIHNldCB2YWx1ZSAlZCBmb3IgY29udHJvbCAlZCBvbiBkZXZpY2UgJyVzJy4iKSwKKyAgICAgICAgdmFsdWUsIGF0dHJpYnV0ZV9udW0sIHY0bDJvYmplY3QtPnZpZGVvZGV2KTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitzZXRfY29udHJvbCAoR1F1YXJrIGZpZWxkX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RWNGwyT2JqZWN0ICp2NGwyb2JqZWN0ID0gdXNlcl9kYXRhOworICBHUXVhcmsgbm9ybWFsaXNlZF9maWVsZF9pZDsKKyAgZ3BvaW50ZXIgKmQ7CisKKyAgLyogMzIgYnl0ZXMgaXMgdGhlIG1heGltdW0gc2l6ZSBmb3IgYSBjb250cm9sIG5hbWUgYWNjb3JkaW5nIHRvIHY0bDIgKi8KKyAgZ2NoYXIgbmFtZVszMl07CisKKyAgLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IGluIHRoZSBwYXN0IEdTdHJlYW1lciB3b3VsZCBub3JtYWxpc2Ugc3RyaW5ncyBpbgorICAgICBhIHN1YnRseSBkaWZmZXJlbnQgd2F5IHRvIHY0bDItY3RsLiAgZS5nLiB0aGUga2VybmVsJ3MgIkZvY3VzIChhYnNvbHV0ZSkiCisgICAgIHdvdWxkIGJlY29tZSAiZm9jdXNfX2Fic29sdXRlXyIgd2hlcmVhcyBub3cgaXQgYmVjb21lcyAiZm9jdXNfYWJzb2x1dGUiLgorICAgICBQbGVhc2UgcmVtb3ZlIHRoZSBmb2xsb3dpbmcgaW4gR1N0cmVhbWVyIDEuNSBmb3IgMS42ICovCisgIHN0cm5jcHkgKG5hbWUsIGdfcXVhcmtfdG9fc3RyaW5nIChmaWVsZF9pZCksIHNpemVvZiAobmFtZSkpOworICBuYW1lWzMxXSA9ICdcMCc7CisgIGdzdF92NGwyX25vcm1hbGlzZV9jb250cm9sX25hbWUgKG5hbWUpOworICBub3JtYWxpc2VkX2ZpZWxkX2lkID0gZ19xdWFya19mcm9tX3N0cmluZyAobmFtZSk7CisgIGlmIChub3JtYWxpc2VkX2ZpZWxkX2lkICE9IGZpZWxkX2lkKQorICAgIGdfd2FybmluZyAoIkluIEdTdHJlYW1lciAxLjQgdGhlIHdheSBWNEwyIGNvbnRyb2wgbmFtZXMgd2VyZSBub3JtYWxpc2VkICIKKyAgICAgICAgImNoYW5nZWQuICBJbnN0ZWFkIG9mIHNldHRpbmcgXCIlc1wiIHBsZWFzZSB1c2UgXCIlc1wiLiAgVGhlIGZvcm1lciBpcyAiCisgICAgICAgICJkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBHU3RyZWFtZXIiLAorICAgICAgICBnX3F1YXJrX3RvX3N0cmluZyAoZmllbGRfaWQpLCBuYW1lKTsKKyAgZmllbGRfaWQgPSBub3JtYWxpc2VkX2ZpZWxkX2lkOworCisgIGQgPSBnX2RhdGFsaXN0X2lkX2dldF9kYXRhICgmdjRsMm9iamVjdC0+Y29udHJvbHMsIGZpZWxkX2lkKTsKKyAgaWYgKCFkKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyb2JqZWN0LAorICAgICAgICAiQ29udHJvbCAnJXMnIGRvZXMgbm90IGV4aXN0IG9yIGhhcyBhbiB1bnN1cHBvcnRlZCB0eXBlLiIsCisgICAgICAgIGdfcXVhcmtfdG9fc3RyaW5nIChmaWVsZF9pZCkpOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmICghR19WQUxVRV9IT0xEUyAodmFsdWUsIEdfVFlQRV9JTlQpKSB7CisgICAgR1NUX1dBUk5JTkdfT0JKRUNUICh2NGwyb2JqZWN0LAorICAgICAgICAiJ2ludCcgdmFsdWUgZXhwZWN0ZWQgZm9yIGNvbnRyb2wgJyVzJy4iLCBnX3F1YXJrX3RvX3N0cmluZyAoZmllbGRfaWQpKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBnc3RfdjRsMl9zZXRfYXR0cmlidXRlICh2NGwyb2JqZWN0LCBHUE9JTlRFUl9UT19JTlQgKGQpLAorICAgICAgZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSkpOworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK2dzdF92NGwyX3NldF9jb250cm9scyAoR3N0VjRsMk9iamVjdCAqIHY0bDJvYmplY3QsIEdzdFN0cnVjdHVyZSAqIGNvbnRyb2xzKQoreworICByZXR1cm4gZ3N0X3N0cnVjdHVyZV9mb3JlYWNoIChjb250cm9scywgc2V0X2NvbnRyb2wsIHY0bDJvYmplY3QpOworfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfZ2V0X2lucHV0IChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgZ2ludCAqIGlucHV0KQoreworICBnaW50IG47CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgInRyeWluZyB0byBnZXQgaW5wdXQiKTsKKworICBpZiAoIUdTVF9WNEwyX0lTX09QRU4gKHY0bDJvYmplY3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodjRsMm9iamVjdC0+aW9jdGwgKHY0bDJvYmplY3QtPnZpZGVvX2ZkLCBWSURJT0NfR19JTlBVVCwgJm4pIDwgMCkKKyAgICBnb3RvIGlucHV0X2ZhaWxlZDsKKworICAqaW5wdXQgPSBuOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJpbnB1dDogJWQiLCBuKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK2lucHV0X2ZhaWxlZDoKKyAgaWYgKHY0bDJvYmplY3QtPmRldmljZV9jYXBzICYgVjRMMl9DQVBfVFVORVIpIHsKKyAgICAvKiBvbmx5IGdpdmUgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgZHJpdmVyIGFjdHVhbGx5IGNsYWltcyB0byBoYXZlIHR1bmVyCisgICAgICogc3VwcG9ydAorICAgICAqLworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkZhaWxlZCB0byBnZXQgY3VycmVudCBpbnB1dCBvbiBkZXZpY2UgJyVzJy4gTWF5IGJlIGl0IGlzIGEgcmFkaW8gZGV2aWNlIiksIHY0bDJvYmplY3QtPnZpZGVvZGV2KSwgR1NUX0VSUk9SX1NZU1RFTSk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitnYm9vbGVhbgorZ3N0X3Y0bDJfc2V0X2lucHV0IChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgZ2ludCBpbnB1dCkKK3sKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgInRyeWluZyB0byBzZXQgaW5wdXQgdG8gJWQiLCBpbnB1dCk7CisKKyAgaWYgKCFHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX1NfSU5QVVQsICZpbnB1dCkgPCAwKQorICAgIGdvdG8gaW5wdXRfZmFpbGVkOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworaW5wdXRfZmFpbGVkOgorICBpZiAodjRsMm9iamVjdC0+ZGV2aWNlX2NhcHMgJiBWNEwyX0NBUF9UVU5FUikgeworICAgIC8qIG9ubHkgZ2l2ZSBhIHdhcm5pbmcgbWVzc2FnZSBpZiBkcml2ZXIgYWN0dWFsbHkgY2xhaW1zIHRvIGhhdmUgdHVuZXIKKyAgICAgKiBzdXBwb3J0CisgICAgICovCisgICAgR1NUX0VMRU1FTlRfV0FSTklORyAodjRsMm9iamVjdC0+ZWxlbWVudCwgUkVTT1VSQ0UsIFNFVFRJTkdTLAorICAgICAgICAoXygiRmFpbGVkIHRvIHNldCBpbnB1dCAlZCBvbiBkZXZpY2UgJXMuIiksCisgICAgICAgICAgICBpbnB1dCwgdjRsMm9iamVjdC0+dmlkZW9kZXYpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9nZXRfb3V0cHV0IChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgZ2ludCAqIG91dHB1dCkKK3sKKyAgZ2ludCBuOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJ0cnlpbmcgdG8gZ2V0IG91dHB1dCIpOworCisgIGlmICghR1NUX1Y0TDJfSVNfT1BFTiAodjRsMm9iamVjdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmICh2NGwyb2JqZWN0LT5pb2N0bCAodjRsMm9iamVjdC0+dmlkZW9fZmQsIFZJRElPQ19HX09VVFBVVCwgJm4pIDwgMCkKKyAgICBnb3RvIG91dHB1dF9mYWlsZWQ7CisKKyAgKm91dHB1dCA9IG47CisKKyAgR1NUX0RFQlVHX09CSkVDVCAodjRsMm9iamVjdC0+ZGJnX29iaiwgIm91dHB1dDogJWQiLCBuKTsKKworICByZXR1cm4gVFJVRTsKKworICAvKiBFUlJPUlMgKi8KK291dHB1dF9mYWlsZWQ6CisgIGlmICh2NGwyb2JqZWN0LT5kZXZpY2VfY2FwcyAmIFY0TDJfQ0FQX1RVTkVSKSB7CisgICAgLyogb25seSBnaXZlIGEgd2FybmluZyBtZXNzYWdlIGlmIGRyaXZlciBhY3R1YWxseSBjbGFpbXMgdG8gaGF2ZSB0dW5lcgorICAgICAqIHN1cHBvcnQKKyAgICAgKi8KKyAgICBHU1RfRUxFTUVOVF9XQVJOSU5HICh2NGwyb2JqZWN0LT5lbGVtZW50LCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgIChfKCJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgb3V0cHV0IG9uIGRldmljZSAnJXMnLiBNYXkgYmUgaXQgaXMgYSByYWRpbyBkZXZpY2UiKSwgdjRsMm9iamVjdC0+dmlkZW9kZXYpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK2dib29sZWFuCitnc3RfdjRsMl9zZXRfb3V0cHV0IChHc3RWNGwyT2JqZWN0ICogdjRsMm9iamVjdCwgZ2ludCBvdXRwdXQpCit7CisgIEdTVF9ERUJVR19PQkpFQ1QgKHY0bDJvYmplY3QtPmRiZ19vYmosICJ0cnlpbmcgdG8gc2V0IG91dHB1dCB0byAlZCIsIG91dHB1dCk7CisKKyAgaWYgKCFHU1RfVjRMMl9JU19PUEVOICh2NGwyb2JqZWN0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHY0bDJvYmplY3QtPmlvY3RsICh2NGwyb2JqZWN0LT52aWRlb19mZCwgVklESU9DX1NfT1VUUFVULCAmb3V0cHV0KSA8IDApCisgICAgZ290byBvdXRwdXRfZmFpbGVkOworCisgIHJldHVybiBUUlVFOworCisgIC8qIEVSUk9SUyAqLworb3V0cHV0X2ZhaWxlZDoKKyAgaWYgKHY0bDJvYmplY3QtPmRldmljZV9jYXBzICYgVjRMMl9DQVBfVFVORVIpIHsKKyAgICAvKiBvbmx5IGdpdmUgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgZHJpdmVyIGFjdHVhbGx5IGNsYWltcyB0byBoYXZlIHR1bmVyCisgICAgICogc3VwcG9ydAorICAgICAqLworICAgIEdTVF9FTEVNRU5UX1dBUk5JTkcgKHY0bDJvYmplY3QtPmVsZW1lbnQsIFJFU09VUkNFLCBTRVRUSU5HUywKKyAgICAgICAgKF8oIkZhaWxlZCB0byBzZXQgb3V0cHV0ICVkIG9uIGRldmljZSAlcy4iKSwKKyAgICAgICAgICAgIG91dHB1dCwgdjRsMm9iamVjdC0+dmlkZW9kZXYpLCBHU1RfRVJST1JfU1lTVEVNKTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CmRpZmYgLS1naXQgYS9zeXMvd2F2ZWZvcm0vTWFrZWZpbGUuYW0gYi9zeXMvd2F2ZWZvcm0vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiMTYxYwotLS0gL2Rldi9udWxsCisrKyBiL3N5cy93YXZlZm9ybS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE1IEBACitwbHVnaW5fTFRMSUJSQVJJRVMgPSBsaWJnc3R3YXZlZm9ybS5sYQorCitsaWJnc3R3YXZlZm9ybV9sYV9TT1VSQ0VTID0gIGdzdHdhdmVmb3Jtc2luay5jIGdzdHdhdmVmb3JtcGx1Z2luLmMKK2xpYmdzdHdhdmVmb3JtX2xhX0NGTEFHUyA9ICQoR1NUX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpIFwKKyAgICAgICAgJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykKK2xpYmdzdHdhdmVmb3JtX2xhX0xJQkFERCA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgXAorICAgICAgICAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisgICAgICAgICQoR1NUX0JBU0VfTElCUykgXAorCSQoR1NUX0xJQlMpIFwKKwktbHdpbm1tCitsaWJnc3R3YXZlZm9ybV9sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0d2F2ZWZvcm1zaW5rLmgKKwpkaWZmIC0tZ2l0IGEvc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3JtcGx1Z2luLmMgYi9zeXMvd2F2ZWZvcm0vZ3N0d2F2ZWZvcm1wbHVnaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDBjNGMyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3JtcGx1Z2luLmMKQEAgLTAsMCArMSw0MiBAQAorLyogR1N0cmVhbWVyCisqIENvcHlyaWdodCAoQykgMjAwNSBTZWJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4KKyoKKyogZ3N0d2F2ZWZvcm1wbHVnaW4uYzoKKyoKKyogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdzdHdhdmVmb3Jtc2luay5oIgorCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdpbl9pbml0IChHc3RQbHVnaW4gKiBwbHVnaW4pCit7CisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgIndhdmVmb3Jtc2luayIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICAgR1NUX1RZUEVfV0FWRUZPUk1fU0lOSykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfUExVR0lOX0RFRklORSAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgd2F2ZWZvcm0sCisgICAgIldhdmVGb3JtIHdpbjMyIEFQSSBwbHVnaW4iLAorICAgIHBsdWdpbl9pbml0LCBWRVJTSU9OLCAiTEdQTCIsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTikKZGlmZiAtLWdpdCBhL3N5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXNpbmsuYyBiL3N5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXNpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjcwYTVmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5jCkBAIC0wLDAgKzEsNTY2IEBACisvKiBHU3RyZWFtZXIKKyogQ29weXJpZ2h0IChDKSAyMDA1IFNlYmFzdGllbiBNb3V0dGUgPHNlYmFzdGllbkBtb3V0dGUubmV0PgorKgorKiBnc3R3YXZlZm9ybXNpbmsuYzoKKyoKKyogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyovCisKKy8qKgorICogU0VDVElPTjplbGVtZW50LXdhdmVmb3Jtc2luaworICoKKyAqIFRoaXMgZWxlbWVudCBsZXRzIHlvdSBvdXRwdXQgc291bmQgdXNpbmcgdGhlIFdpbmRvd3MgV2F2ZUZvcm0gQVBJLgorICoKKyAqIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIGFsbW9zdCBhbHdheXMgdXNlIGdlbmVyaWMgYXVkaW8gY29udmVyc2lvbiBlbGVtZW50cworICogbGlrZSBhdWRpb2NvbnZlcnQgYW5kIGF1ZGlvcmVzYW1wbGUgaW4gZnJvbnQgb2YgYW4gYXVkaW9zaW5rIHRvIG1ha2Ugc3VyZQorICogeW91ciBwaXBlbGluZSB3b3JrcyB1bmRlciBhbGwgY2lyY3Vtc3RhbmNlcyAodGhvc2UgY29udmVyc2lvbiBlbGVtZW50cyB3aWxsCisgKiBhY3QgaW4gcGFzc3Rocm91Z2gtbW9kZSBpZiBubyBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeSkuCisgKgorICogPHJlZnNlY3QyPgorICogPHRpdGxlPkV4YW1wbGUgcGlwZWxpbmVzPC90aXRsZT4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBhdWRpb3Rlc3RzcmMgISBhdWRpb2NvbnZlcnQgISB2b2x1bWUgdm9sdW1lPTAuMSAhIHdhdmVmb3Jtc2luaworICogXXwgd2lsbCBvdXRwdXQgYSBzaW5lIHdhdmUgKGNvbnRpbnVvdXMgYmVlcCBzb3VuZCkgdG8geW91ciBzb3VuZCBjYXJkICh3aXRoCisgKiBhIHZlcnkgbG93IHZvbHVtZSBhcyBwcmVjYXV0aW9uKS4KKyAqIHxbCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBmaWxlc3JjIGxvY2F0aW9uPW11c2ljLm9nZyAhIGRlY29kZWJpbiAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISB3YXZlZm9ybXNpbmsKKyAqIF18IHdpbGwgcGxheSBhbiBPZ2cvVm9yYmlzIGF1ZGlvIGZpbGUgYW5kIG91dHB1dCBpdC4KKyAqIDwvcmVmc2VjdDI+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZ3N0d2F2ZWZvcm1zaW5rLmgiCisKK0dTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMgKHdhdmVmb3Jtc2lua19kZWJ1Zyk7CisKK3N0YXRpYyB2b2lkIGdzdF93YXZlZm9ybV9zaW5rX2ZpbmFsaXNlIChHT2JqZWN0ICogb2JqZWN0KTsKK3N0YXRpYyB2b2lkIGdzdF93YXZlZm9ybV9zaW5rX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBjb25zdCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyB2b2lkIGdzdF93YXZlZm9ybV9zaW5rX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqIG9iamVjdCwKKyAgICBndWludCBwcm9wX2lkLCBHVmFsdWUgKiB2YWx1ZSwgR1BhcmFtU3BlYyAqIHBzcGVjKTsKK3N0YXRpYyBHc3RDYXBzICpnc3Rfd2F2ZWZvcm1fc2lua19nZXRjYXBzIChHc3RCYXNlU2luayAqIGJzaW5rLAorICAgIEdzdENhcHMgKiBmaWx0ZXIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogR3N0QXVkaW9TaW5rIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgZ2Jvb2xlYW4gZ3N0X3dhdmVmb3JtX3NpbmtfcHJlcGFyZSAoR3N0QXVkaW9TaW5rICogYXNpbmssCisgICAgR3N0QXVkaW9SaW5nQnVmZmVyU3BlYyAqIHNwZWMpOworc3RhdGljIGdib29sZWFuIGdzdF93YXZlZm9ybV9zaW5rX3VucHJlcGFyZSAoR3N0QXVkaW9TaW5rICogYXNpbmspOworc3RhdGljIGdib29sZWFuIGdzdF93YXZlZm9ybV9zaW5rX29wZW4gKEdzdEF1ZGlvU2luayAqIGFzaW5rKTsKK3N0YXRpYyBnYm9vbGVhbiBnc3Rfd2F2ZWZvcm1fc2lua19jbG9zZSAoR3N0QXVkaW9TaW5rICogYXNpbmspOworc3RhdGljIGdpbnQgZ3N0X3dhdmVmb3JtX3Npbmtfd3JpdGUgKEdzdEF1ZGlvU2luayAqIGFzaW5rLCBncG9pbnRlciBkYXRhLAorICAgIGd1aW50IGxlbmd0aCk7CitzdGF0aWMgZ3VpbnQgZ3N0X3dhdmVmb3JtX3NpbmtfZGVsYXkgKEdzdEF1ZGlvU2luayAqIGFzaW5rKTsKK3N0YXRpYyB2b2lkIGdzdF93YXZlZm9ybV9zaW5rX3Jlc2V0IChHc3RBdWRpb1NpbmsgKiBhc2luayk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBVdGlscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0dzdENhcHMgKmdzdF93YXZlZm9ybV9zaW5rX2NyZWF0ZV9jYXBzIChnaW50IHJhdGUsIGdpbnQgY2hhbm5lbHMsCisgICAgY29uc3QgZ2NoYXIgKiBmb3JtYXQpOworV0FWRUhEUiAqYnVmZmVycG9vbF9nZXRfYnVmZmVyIChHc3RXYXZlRm9ybVNpbmsgKiB3ZnNpbmssIGdwb2ludGVyIGRhdGEsCisgICAgZ3VpbnQgbGVuZ3RoKTsKK3ZvaWQgQ0FMTEJBQ0sgd2F2ZU91dFByb2MgKEhXQVZFT1VUIGh3bywgVUlOVCB1TXNnLCBEV09SRF9QVFIgZHdJbnN0YW5jZSwKKyAgICBEV09SRF9QVFIgZHdQYXJhbTEsIERXT1JEX1BUUiBkd1BhcmFtMik7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSB3YXZlZm9ybXNpbmtfc2lua19mYWN0b3J5ID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSB7ICIgR1NUX0FVRElPX05FIChTMTYpICIsIFM4IH0sICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJyYXRlID0gKGludCkgWyAxLCBNQVggXSwgIiAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXSIpKTsKKworI2RlZmluZSBnc3Rfd2F2ZWZvcm1fc2lua19wYXJlbnRfY2xhc3MgcGFyZW50X2NsYXNzCitHX0RFRklORV9UWVBFIChHc3RXYXZlRm9ybVNpbmssIGdzdF93YXZlZm9ybV9zaW5rLCBHU1RfVFlQRV9BVURJT19TSU5LKTsKKworc3RhdGljIHZvaWQKK2dzdF93YXZlZm9ybV9zaW5rX2NsYXNzX2luaXQgKEdzdFdhdmVGb3JtU2lua0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR3N0QmFzZVNpbmtDbGFzcyAqZ3N0YmFzZXNpbmtfY2xhc3M7CisgIEdzdEF1ZGlvU2lua0NsYXNzICpnc3RhdWRpb3NpbmtfY2xhc3M7CisgIEdzdEVsZW1lbnRDbGFzcyAqZWxlbWVudF9jbGFzczsKKworICBnb2JqZWN0X2NsYXNzID0gKEdPYmplY3RDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YmFzZXNpbmtfY2xhc3MgPSAoR3N0QmFzZVNpbmtDbGFzcyAqKSBrbGFzczsKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzID0gKEdzdEF1ZGlvU2lua0NsYXNzICopIGtsYXNzOworICBlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKworICBwYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IGdzdF93YXZlZm9ybV9zaW5rX2ZpbmFsaXNlOworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSBnc3Rfd2F2ZWZvcm1fc2lua19nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IGdzdF93YXZlZm9ybV9zaW5rX3NldF9wcm9wZXJ0eTsKKworICBnc3RiYXNlc2lua19jbGFzcy0+Z2V0X2NhcHMgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdmVmb3JtX3NpbmtfZ2V0Y2Fwcyk7CisKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzLT5wcmVwYXJlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZlZm9ybV9zaW5rX3ByZXBhcmUpOworICBnc3RhdWRpb3NpbmtfY2xhc3MtPnVucHJlcGFyZSA9CisgICAgICBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdmVmb3JtX3NpbmtfdW5wcmVwYXJlKTsKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzLT5vcGVuID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZlZm9ybV9zaW5rX29wZW4pOworICBnc3RhdWRpb3NpbmtfY2xhc3MtPmNsb3NlID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZlZm9ybV9zaW5rX2Nsb3NlKTsKKyAgZ3N0YXVkaW9zaW5rX2NsYXNzLT53cml0ZSA9IEdTVF9ERUJVR19GVU5DUFRSIChnc3Rfd2F2ZWZvcm1fc2lua193cml0ZSk7CisgIGdzdGF1ZGlvc2lua19jbGFzcy0+ZGVsYXkgPSBHU1RfREVCVUdfRlVOQ1BUUiAoZ3N0X3dhdmVmb3JtX3NpbmtfZGVsYXkpOworICBnc3RhdWRpb3NpbmtfY2xhc3MtPnJlc2V0ID0gR1NUX0RFQlVHX0ZVTkNQVFIgKGdzdF93YXZlZm9ybV9zaW5rX3Jlc2V0KTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAod2F2ZWZvcm1zaW5rX2RlYnVnLCAid2F2ZWZvcm1zaW5rIiwgMCwKKyAgICAgICJXYXZlZm9ybSBzaW5rIik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWxlbWVudF9jbGFzcywgIldhdmVGb3JtIEF1ZGlvIFNpbmsiLAorICAgICAgIlNpbmsvQXVkaW8iLAorICAgICAgIk91dHB1dCB0byBhIHNvdW5kIGNhcmQgdmlhIFdhdmVGb3JtIEFQSSIsCisgICAgICAiU2ViYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+Iik7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVsZW1lbnRfY2xhc3MsCisgICAgICAmd2F2ZWZvcm1zaW5rX3NpbmtfZmFjdG9yeSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2ZWZvcm1fc2lua19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgLyogR3N0V2F2ZUZvcm1TaW5rICp3ZnNpbmsgPSBHU1RfV0FWRUZPUk1fU0lOSyAob2JqZWN0KTsgKi8KKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2ZWZvcm1fc2lua19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgLyogR3N0V2F2ZUZvcm1TaW5rICp3ZnNpbmsgPSBHU1RfV0FWRUZPUk1fU0lOSyAob2JqZWN0KTsgKi8KKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2ZWZvcm1fc2lua19pbml0IChHc3RXYXZlRm9ybVNpbmsgKiB3ZnNpbmspCit7CisgIC8qIGluaXRpYWxpemUgbWVtYmVycyAqLworICB3ZnNpbmstPmh3YXZlb3V0ID0gTlVMTDsKKyAgd2ZzaW5rLT5jYWNoZWRfY2FwcyA9IE5VTEw7CisgIHdmc2luay0+d2F2ZV9idWZmZXJzID0gTlVMTDsKKyAgd2ZzaW5rLT53cml0ZV9idWZmZXIgPSAwOworICB3ZnNpbmstPmJ1ZmZlcl9jb3VudCA9IEJVRkZFUl9DT1VOVDsKKyAgd2ZzaW5rLT5idWZmZXJfc2l6ZSA9IEJVRkZFUl9TSVpFOworICB3ZnNpbmstPmZyZWVfYnVmZmVyc19jb3VudCA9IHdmc2luay0+YnVmZmVyX2NvdW50OworICB3ZnNpbmstPmJ5dGVzX2luX3F1ZXVlID0gMDsKKworICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uICgmd2ZzaW5rLT5jcml0aWNfd2F2ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2ZWZvcm1fc2lua19maW5hbGlzZSAoR09iamVjdCAqIG9iamVjdCkKK3sKKyAgR3N0V2F2ZUZvcm1TaW5rICp3ZnNpbmsgPSBHU1RfV0FWRUZPUk1fU0lOSyAob2JqZWN0KTsKKworICBpZiAod2ZzaW5rLT5jYWNoZWRfY2FwcykgeworICAgIGdzdF9jYXBzX3VucmVmICh3ZnNpbmstPmNhY2hlZF9jYXBzKTsKKyAgICB3ZnNpbmstPmNhY2hlZF9jYXBzID0gTlVMTDsKKyAgfQorCisgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbiAoJndmc2luay0+Y3JpdGljX3dhdmUpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSAob2JqZWN0KTsKK30KKworc3RhdGljIEdzdENhcHMgKgorZ3N0X3dhdmVmb3JtX3NpbmtfZ2V0Y2FwcyAoR3N0QmFzZVNpbmsgKiBic2luaywgR3N0Q2FwcyAqIGZpbHRlcikKK3sKKyAgR3N0V2F2ZUZvcm1TaW5rICp3ZnNpbmsgPSBHU1RfV0FWRUZPUk1fU0lOSyAoYnNpbmspOworICBNTVJFU1VMVCBtbXJlc3VsdDsKKyAgV0FWRU9VVENBUFMgd29jYXBzOworICBHc3RDYXBzICpjYXBzLCAqY2Fwc190ZW1wOworCisgIC8qIHJldHVybiB0aGUgY2FjaGVkIGNhcHMgaWYgYWxyZWFkeSBkZWZpbmVkICovCisgIGlmICh3ZnNpbmstPmNhY2hlZF9jYXBzKSB7CisgICAgcmV0dXJuIGdzdF9jYXBzX3JlZiAod2ZzaW5rLT5jYWNoZWRfY2Fwcyk7CisgIH0KKworICAvKiBnZXQgdGhlIGRlZmF1bHQgZGV2aWNlIGNhcHMgKi8KKyAgbW1yZXN1bHQgPSB3YXZlT3V0R2V0RGV2Q2FwcyAoV0FWRV9NQVBQRVIsICZ3b2NhcHMsIHNpemVvZiAod29jYXBzKSk7CisgIGlmIChtbXJlc3VsdCAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7CisgICAgd2F2ZU91dEdldEVycm9yVGV4dCAobW1yZXN1bHQsIHdmc2luay0+ZXJyb3Jfc3RyaW5nLCBFUlJPUl9MRU5HVEggLSAxKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAod2ZzaW5rLCBSRVNPVVJDRSwgU0VUVElOR1MsCisgICAgICAgICgiZ3N0X3dhdmVmb3JtX3NpbmtfZ2V0Y2Fwczogd2F2ZU91dEdldERldkNhcHMgZmFpbGVkIGVycm9yPT4lcyIsCisgICAgICAgICAgICB3ZnNpbmstPmVycm9yX3N0cmluZyksIChOVUxMKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworCisgIC8qIGNyZWF0ZSBhIGNhcHMgZm9yIGFsbCB3YXZlIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgCisgICAgIHN0YXJ0aW5nIGJ5IHRoZSBiZXN0IHF1YWxpdHkgZm9ybWF0ICovCisgIGlmICh3b2NhcHMuZHdGb3JtYXRzICYgV0FWRV9GT1JNQVRfOTZTMTYpIHsKKyAgICBjYXBzX3RlbXAgPSBnc3Rfd2F2ZWZvcm1fc2lua19jcmVhdGVfY2FwcyAoOTYwMDAsIDIsIEdTVF9BVURJT19ORSAoUzE2KSk7CisgICAgaWYgKGNhcHNfdGVtcCkgeworICAgICAgZ3N0X2NhcHNfYXBwZW5kIChjYXBzLCBjYXBzX3RlbXApOworICAgIH0KKyAgfQorICBpZiAod29jYXBzLmR3Rm9ybWF0cyAmIFdBVkVfRk9STUFUXzk2UzA4KSB7CisgICAgY2Fwc190ZW1wID0gZ3N0X3dhdmVmb3JtX3NpbmtfY3JlYXRlX2NhcHMgKDk2MDAwLCAyLCAiUzgiKTsKKyAgICBpZiAoY2Fwc190ZW1wKSB7CisgICAgICBnc3RfY2Fwc19hcHBlbmQgKGNhcHMsIGNhcHNfdGVtcCk7CisgICAgfQorICB9CisgIGlmICh3b2NhcHMuZHdGb3JtYXRzICYgV0FWRV9GT1JNQVRfOTZNMTYpIHsKKyAgICBjYXBzX3RlbXAgPSBnc3Rfd2F2ZWZvcm1fc2lua19jcmVhdGVfY2FwcyAoOTYwMDAsIDEsIEdTVF9BVURJT19ORSAoUzE2KSk7CisgICAgaWYgKGNhcHNfdGVtcCkgeworICAgICAgZ3N0X2NhcHNfYXBwZW5kIChjYXBzLCBjYXBzX3RlbXApOworICAgIH0KKyAgfQorICBpZiAod29jYXBzLmR3Rm9ybWF0cyAmIFdBVkVfRk9STUFUXzk2TTA4KSB7CisgICAgY2Fwc190ZW1wID0gZ3N0X3dhdmVmb3JtX3NpbmtfY3JlYXRlX2NhcHMgKDk2MDAwLCAxLCAiUzgiKTsKKyAgICBpZiAoY2Fwc190ZW1wKSB7CisgICAgICBnc3RfY2Fwc19hcHBlbmQgKGNhcHMsIGNhcHNfdGVtcCk7CisgICAgfQorICB9CisgIGlmICh3b2NhcHMuZHdGb3JtYXRzICYgV0FWRV9GT1JNQVRfNFMxNikgeworICAgIGNhcHNfdGVtcCA9IGdzdF93YXZlZm9ybV9zaW5rX2NyZWF0ZV9jYXBzICg0NDEwMCwgMiwgR1NUX0FVRElPX05FIChTMTYpKTsKKyAgICBpZiAoY2Fwc190ZW1wKSB7CisgICAgICBnc3RfY2Fwc19hcHBlbmQgKGNhcHMsIGNhcHNfdGVtcCk7CisgICAgfQorICB9CisgIGlmICh3b2NhcHMuZHdGb3JtYXRzICYgV0FWRV9GT1JNQVRfNFMwOCkgeworICAgIGNhcHNfdGVtcCA9IGdzdF93YXZlZm9ybV9zaW5rX2NyZWF0ZV9jYXBzICg0NDEwMCwgMiwgIlM4Iik7CisgICAgaWYgKGNhcHNfdGVtcCkgeworICAgICAgZ3N0X2NhcHNfYXBwZW5kIChjYXBzLCBjYXBzX3RlbXApOworICAgIH0KKyAgfQorICBpZiAod29jYXBzLmR3Rm9ybWF0cyAmIFdBVkVfRk9STUFUXzRNMTYpIHsKKyAgICBjYXBzX3RlbXAgPSBnc3Rfd2F2ZWZvcm1fc2lua19jcmVhdGVfY2FwcyAoNDQxMDAsIDEsIEdTVF9BVURJT19ORSAoUzE2KSk7CisgICAgaWYgKGNhcHNfdGVtcCkgeworICAgICAgZ3N0X2NhcHNfYXBwZW5kIChjYXBzLCBjYXBzX3RlbXApOworICAgIH0KKyAgfQorICBpZiAod29jYXBzLmR3Rm9ybWF0cyAmIFdBVkVfRk9STUFUXzRNMDgpIHsKKyAgICBjYXBzX3RlbXAgPSBnc3Rfd2F2ZWZvcm1fc2lua19jcmVhdGVfY2FwcyAoNDQxMDAsIDEsICJTOCIpOworICAgIGlmIChjYXBzX3RlbXApIHsKKyAgICAgIGdzdF9jYXBzX2FwcGVuZCAoY2FwcywgY2Fwc190ZW1wKTsKKyAgICB9CisgIH0KKyAgaWYgKHdvY2Fwcy5kd0Zvcm1hdHMgJiBXQVZFX0ZPUk1BVF8yUzE2KSB7CisgICAgY2Fwc190ZW1wID0gZ3N0X3dhdmVmb3JtX3NpbmtfY3JlYXRlX2NhcHMgKDIyMDUwLCAyLCBHU1RfQVVESU9fTkUgKFMxNikpOworICAgIGlmIChjYXBzX3RlbXApIHsKKyAgICAgIGdzdF9jYXBzX2FwcGVuZCAoY2FwcywgY2Fwc190ZW1wKTsKKyAgICB9CisgIH0KKyAgaWYgKHdvY2Fwcy5kd0Zvcm1hdHMgJiBXQVZFX0ZPUk1BVF8yUzA4KSB7CisgICAgY2Fwc190ZW1wID0gZ3N0X3dhdmVmb3JtX3NpbmtfY3JlYXRlX2NhcHMgKDIyMDUwLCAyLCAiUzgiKTsKKyAgICBpZiAoY2Fwc190ZW1wKSB7CisgICAgICBnc3RfY2Fwc19hcHBlbmQgKGNhcHMsIGNhcHNfdGVtcCk7CisgICAgfQorICB9CisgIGlmICh3b2NhcHMuZHdGb3JtYXRzICYgV0FWRV9GT1JNQVRfMk0xNikgeworICAgIGNhcHNfdGVtcCA9IGdzdF93YXZlZm9ybV9zaW5rX2NyZWF0ZV9jYXBzICgyMjA1MCwgMSwgR1NUX0FVRElPX05FIChTMTYpKTsKKyAgICBpZiAoY2Fwc190ZW1wKSB7CisgICAgICBnc3RfY2Fwc19hcHBlbmQgKGNhcHMsIGNhcHNfdGVtcCk7CisgICAgfQorICB9CisgIGlmICh3b2NhcHMuZHdGb3JtYXRzICYgV0FWRV9GT1JNQVRfMk0wOCkgeworICAgIGNhcHNfdGVtcCA9IGdzdF93YXZlZm9ybV9zaW5rX2NyZWF0ZV9jYXBzICgyMjA1MCwgMSwgIlM4Iik7CisgICAgaWYgKGNhcHNfdGVtcCkgeworICAgICAgZ3N0X2NhcHNfYXBwZW5kIChjYXBzLCBjYXBzX3RlbXApOworICAgIH0KKyAgfQorICBpZiAod29jYXBzLmR3Rm9ybWF0cyAmIFdBVkVfRk9STUFUXzFTMTYpIHsKKyAgICBjYXBzX3RlbXAgPSBnc3Rfd2F2ZWZvcm1fc2lua19jcmVhdGVfY2FwcyAoMTEwMjUsIDIsIEdTVF9BVURJT19ORSAoUzE2KSk7CisgICAgaWYgKGNhcHNfdGVtcCkgeworICAgICAgZ3N0X2NhcHNfYXBwZW5kIChjYXBzLCBjYXBzX3RlbXApOworICAgIH0KKyAgfQorICBpZiAod29jYXBzLmR3Rm9ybWF0cyAmIFdBVkVfRk9STUFUXzFTMDgpIHsKKyAgICBjYXBzX3RlbXAgPSBnc3Rfd2F2ZWZvcm1fc2lua19jcmVhdGVfY2FwcyAoMTEwMjUsIDIsICJTOCIpOworICAgIGlmIChjYXBzX3RlbXApIHsKKyAgICAgIGdzdF9jYXBzX2FwcGVuZCAoY2FwcywgY2Fwc190ZW1wKTsKKyAgICB9CisgIH0KKyAgaWYgKHdvY2Fwcy5kd0Zvcm1hdHMgJiBXQVZFX0ZPUk1BVF8xTTE2KSB7CisgICAgY2Fwc190ZW1wID0gZ3N0X3dhdmVmb3JtX3NpbmtfY3JlYXRlX2NhcHMgKDExMDI1LCAxLCBHU1RfQVVESU9fTkUgKFMxNikpOworICAgIGlmIChjYXBzX3RlbXApIHsKKyAgICAgIGdzdF9jYXBzX2FwcGVuZCAoY2FwcywgY2Fwc190ZW1wKTsKKyAgICB9CisgIH0KKyAgaWYgKHdvY2Fwcy5kd0Zvcm1hdHMgJiBXQVZFX0ZPUk1BVF8xTTA4KSB7CisgICAgY2Fwc190ZW1wID0gZ3N0X3dhdmVmb3JtX3NpbmtfY3JlYXRlX2NhcHMgKDExMDI1LCAxLCAiUzgiKTsKKyAgICBpZiAoY2Fwc190ZW1wKSB7CisgICAgICBnc3RfY2Fwc19hcHBlbmQgKGNhcHMsIGNhcHNfdGVtcCk7CisgICAgfQorICB9CisKKyAgaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChjYXBzKSkgeworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgICBjYXBzID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICB3ZnNpbmstPmNhY2hlZF9jYXBzID0gZ3N0X2NhcHNfcmVmIChjYXBzKTsKKyAgfQorCisgIEdTVF9DQVRfTE9HX09CSkVDVCAod2F2ZWZvcm1zaW5rX2RlYnVnLCB3ZnNpbmssCisgICAgICAiUmV0dXJuaW5nIGNhcHMgJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZlZm9ybV9zaW5rX29wZW4gKEdzdEF1ZGlvU2luayAqIGFzaW5rKQoreworICAvKiBHc3RXYXZlRm9ybVNpbmsgKndmc2luayA9IEdTVF9XQVZFRk9STV9TSU5LIChhc2luayk7ICovCisKKyAgLyogbm90aGluZyB0byBkbyBoZXJlIGFzIHRoZSBkZXZpY2UgbmVlZHMgdG8gYmUgb3BlbmVkIHdpdGggdGhlIGZvcm1hdCB3ZSB3aWxsIHVzZSAqLworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF93YXZlZm9ybV9zaW5rX3ByZXBhcmUgKEdzdEF1ZGlvU2luayAqIGFzaW5rLCBHc3RBdWRpb1JpbmdCdWZmZXJTcGVjICogc3BlYykKK3sKKyAgR3N0V2F2ZUZvcm1TaW5rICp3ZnNpbmsgPSBHU1RfV0FWRUZPUk1fU0lOSyAoYXNpbmspOworICBXQVZFRk9STUFURVggd2Z4OworICBNTVJFU1VMVCBtbXJlc3VsdDsKKyAgZ3VpbnQgaW5kZXg7CisKKyAgLyogc2V0dXAgd2F2ZWZvcm1leCBzdHJ1dHVyZSB3aXRoIHRoZSBpbnB1dCByaW5nYnVmZmVyIHNwZWNzICovCisgIG1lbXNldCAoJndmeCwgMCwgc2l6ZW9mICh3ZngpKTsKKyAgd2Z4LmNiU2l6ZSA9IDA7CisgIHdmeC53Rm9ybWF0VGFnID0gV0FWRV9GT1JNQVRfUENNOworICB3ZngubkNoYW5uZWxzID0gc3BlYy0+aW5mby5jaGFubmVsczsKKyAgd2Z4Lm5TYW1wbGVzUGVyU2VjID0gc3BlYy0+aW5mby5yYXRlOworICB3Zngud0JpdHNQZXJTYW1wbGUgPSAoc3BlYy0+aW5mby5icGYgKiA4KSAvIHdmeC5uQ2hhbm5lbHM7CisgIHdmeC5uQmxvY2tBbGlnbiA9IHNwZWMtPmluZm8uYnBmOworICB3ZngubkF2Z0J5dGVzUGVyU2VjID0gd2Z4Lm5TYW1wbGVzUGVyU2VjICogd2Z4Lm5CbG9ja0FsaWduOworCisgIC8qIHNhdmUgYnl0ZXMgcGVyIHNhbXBsZSB0byB1c2UgaXQgaW4gZGVsYXkgKi8KKyAgd2ZzaW5rLT5ieXRlc19wZXJfc2FtcGxlID0gc3BlYy0+aW5mby5icGY7CisKKyAgLyogb3BlbiB0aGUgZGVmYXVsdCBhdWRpbyBkZXZpY2Ugd2l0aCB0aGUgZ2l2ZW4gY2FwcyAqLworICBtbXJlc3VsdCA9IHdhdmVPdXRPcGVuICgmd2ZzaW5rLT5od2F2ZW91dCwgV0FWRV9NQVBQRVIsCisgICAgICAmd2Z4LCAoRFdPUkRfUFRSKSB3YXZlT3V0UHJvYywgKERXT1JEX1BUUikgd2ZzaW5rLCBDQUxMQkFDS19GVU5DVElPTik7CisgIGlmIChtbXJlc3VsdCAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7CisgICAgd2F2ZU91dEdldEVycm9yVGV4dCAobW1yZXN1bHQsIHdmc2luay0+ZXJyb3Jfc3RyaW5nLCBFUlJPUl9MRU5HVEggLSAxKTsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAod2ZzaW5rLCBSRVNPVVJDRSwgT1BFTl9XUklURSwKKyAgICAgICAgKCJnc3Rfd2F2ZWZvcm1fc2lua19wcmVwYXJlOiB3YXZlT3V0T3BlbiBmYWlsZWQgZXJyb3I9PiVzIiwKKyAgICAgICAgICAgIHdmc2luay0+ZXJyb3Jfc3RyaW5nKSwgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBldmFsdWF0ZSB0aGUgYnVmZmVyIHNpemUgYW5kIHRoZSBudW1iZXIgb2YgYnVmZmVycyBuZWVkZWQgKi8KKyAgd2ZzaW5rLT5mcmVlX2J1ZmZlcnNfY291bnQgPSB3ZnNpbmstPmJ1ZmZlcl9jb3VudDsKKworICAvKiBhbGxvY2F0ZSB3YXZlIGJ1ZmZlcnMgKi8KKyAgd2ZzaW5rLT53YXZlX2J1ZmZlcnMgPSAoV0FWRUhEUiAqKSBnX25ldzAgKFdBVkVIRFIsIHdmc2luay0+YnVmZmVyX2NvdW50KTsKKyAgaWYgKCF3ZnNpbmstPndhdmVfYnVmZmVycykgeworICAgIEdTVF9FTEVNRU5UX0VSUk9SICh3ZnNpbmssIFJFU09VUkNFLCBPUEVOX1dSSVRFLAorICAgICAgICAoImdzdF93YXZlZm9ybV9zaW5rX3ByZXBhcmU6IEZhaWxlZCB0byBhbGxvY2F0ZSB3YXZlIGJ1ZmZlciBoZWFkZXJzIChidWZmZXIgY291bnQ9JWQpIiwKKyAgICAgICAgICAgIHdmc2luay0+YnVmZmVyX2NvdW50KSwgKE5VTEwpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbWVtc2V0ICh3ZnNpbmstPndhdmVfYnVmZmVycywgMCwgc2l6ZW9mIChXQVZFSERSKSAqIHdmc2luay0+YnVmZmVyX2NvdW50KTsKKworICAvKiBzZXR1cCBoZWFkZXJzICovCisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHdmc2luay0+YnVmZmVyX2NvdW50OyBpbmRleCsrKSB7CisgICAgd2ZzaW5rLT53YXZlX2J1ZmZlcnNbaW5kZXhdLmR3QnVmZmVyTGVuZ3RoID0gd2ZzaW5rLT5idWZmZXJfc2l6ZTsKKyAgICB3ZnNpbmstPndhdmVfYnVmZmVyc1tpbmRleF0ubHBEYXRhID0gZ19uZXcwIChnY2hhciwgd2ZzaW5rLT5idWZmZXJfc2l6ZSk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3Rfd2F2ZWZvcm1fc2lua191bnByZXBhcmUgKEdzdEF1ZGlvU2luayAqIGFzaW5rKQoreworICBHc3RXYXZlRm9ybVNpbmsgKndmc2luayA9IEdTVF9XQVZFRk9STV9TSU5LIChhc2luayk7CisKKyAgLyogZnJlZSB3YXZlIGJ1ZmZlcnMgKi8KKyAgaWYgKHdmc2luay0+d2F2ZV9idWZmZXJzKSB7CisgICAgZ3VpbnQgaW5kZXg7CisKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB3ZnNpbmstPmJ1ZmZlcl9jb3VudDsgaW5kZXgrKykgeworICAgICAgaWYgKHdmc2luay0+d2F2ZV9idWZmZXJzW2luZGV4XS5kd0ZsYWdzICYgV0hEUl9QUkVQQVJFRCkgeworICAgICAgICBNTVJFU1VMVCBtbXJlc3VsdCA9IHdhdmVPdXRVbnByZXBhcmVIZWFkZXIgKHdmc2luay0+aHdhdmVvdXQsCisgICAgICAgICAgICAmd2ZzaW5rLT53YXZlX2J1ZmZlcnNbaW5kZXhdLCBzaXplb2YgKFdBVkVIRFIpKTsKKyAgICAgICAgaWYgKG1tcmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IpIHsKKyAgICAgICAgICB3YXZlT3V0R2V0RXJyb3JUZXh0IChtbXJlc3VsdCwgd2ZzaW5rLT5lcnJvcl9zdHJpbmcsCisgICAgICAgICAgICAgIEVSUk9SX0xFTkdUSCAtIDEpOworICAgICAgICAgIEdTVF9DQVRfV0FSTklOR19PQkpFQ1QgKHdhdmVmb3Jtc2lua19kZWJ1Zywgd2ZzaW5rLAorICAgICAgICAgICAgICAiZ3N0X3dhdmVmb3JtX3NpbmtfdW5wcmVwYXJlOiBFcnJvciB1bnByZXBhcmluZyBidWZmZXIgPT4gJXMiLAorICAgICAgICAgICAgICB3ZnNpbmstPmVycm9yX3N0cmluZyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdfZnJlZSAod2ZzaW5rLT53YXZlX2J1ZmZlcnNbaW5kZXhdLmxwRGF0YSk7CisgICAgfQorICAgIGdfZnJlZSAod2ZzaW5rLT53YXZlX2J1ZmZlcnMpOworICAgIHdmc2luay0+d2F2ZV9idWZmZXJzID0gTlVMTDsKKyAgfQorCisgIC8qIGNsb3NlIHdhdmVmb3JtLWF1ZGlvIG91dHB1dCBkZXZpY2UgKi8KKyAgaWYgKHdmc2luay0+aHdhdmVvdXQpIHsKKyAgICB3YXZlT3V0Q2xvc2UgKHdmc2luay0+aHdhdmVvdXQpOworICAgIHdmc2luay0+aHdhdmVvdXQgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3dhdmVmb3JtX3NpbmtfY2xvc2UgKEdzdEF1ZGlvU2luayAqIGFzaW5rKQoreworICAvKiBHc3RXYXZlRm9ybVNpbmsgKndmc2luayA9IEdTVF9XQVZFRk9STV9TSU5LIChhc2luayk7ICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnaW50Citnc3Rfd2F2ZWZvcm1fc2lua193cml0ZSAoR3N0QXVkaW9TaW5rICogYXNpbmssIGdwb2ludGVyIGRhdGEsIGd1aW50IGxlbmd0aCkKK3sKKyAgR3N0V2F2ZUZvcm1TaW5rICp3ZnNpbmsgPSBHU1RfV0FWRUZPUk1fU0lOSyAoYXNpbmspOworICBXQVZFSERSICp3YXZlaGVhZGVyOworICBNTVJFU1VMVCBtbXJlc3VsdDsKKyAgZ3VpbnQgYnl0ZXNfdG9fd3JpdGUgPSBsZW5ndGg7CisgIGd1aW50IHJlbWFpbmluZ19sZW5ndGggPSBsZW5ndGg7CisKKyAgd2ZzaW5rLT5ieXRlc19pbl9xdWV1ZSArPSBsZW5ndGg7CisKKyAgd2hpbGUgKHJlbWFpbmluZ19sZW5ndGggPiAwKSB7CisgICAgaWYgKHdmc2luay0+ZnJlZV9idWZmZXJzX2NvdW50ID09IDApIHsKKyAgICAgIC8qIG5vIGZyZWUgYnVmZmVyIGF2YWlsYWJsZSwgd2FpdCBmb3Igb25lICovCisgICAgICBTbGVlcCAoMTApOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLyogZ2V0IHRoZSBjdXJyZW50IHdyaXRlIGJ1ZmZlciBoZWFkZXIgKi8KKyAgICB3YXZlaGVhZGVyID0gJndmc2luay0+d2F2ZV9idWZmZXJzW3dmc2luay0+d3JpdGVfYnVmZmVyXTsKKworICAgIC8qIHVucHJlcGFyZSB0aGUgaGVhZGVyIGlmIG5lZWRlZCAqLworICAgIGlmICh3YXZlaGVhZGVyLT5kd0ZsYWdzICYgV0hEUl9QUkVQQVJFRCkgeworICAgICAgbW1yZXN1bHQgPQorICAgICAgICAgIHdhdmVPdXRVbnByZXBhcmVIZWFkZXIgKHdmc2luay0+aHdhdmVvdXQsIHdhdmVoZWFkZXIsCisgICAgICAgICAgc2l6ZW9mIChXQVZFSERSKSk7CisgICAgICBpZiAobW1yZXN1bHQgIT0gTU1TWVNFUlJfTk9FUlJPUikgeworICAgICAgICB3YXZlT3V0R2V0RXJyb3JUZXh0IChtbXJlc3VsdCwgd2ZzaW5rLT5lcnJvcl9zdHJpbmcsIEVSUk9SX0xFTkdUSCAtIDEpOworICAgICAgICBHU1RfQ0FUX1dBUk5JTkdfT0JKRUNUICh3YXZlZm9ybXNpbmtfZGVidWcsIHdmc2luaywKKyAgICAgICAgICAgICJFcnJvciB1bnByZXBhcmluZyBidWZmZXIgPT4gJXMiLCB3ZnNpbmstPmVycm9yX3N0cmluZyk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHdmc2luay0+YnVmZmVyX3NpemUgLSB3YXZlaGVhZGVyLT5kd1VzZXIgPj0gcmVtYWluaW5nX2xlbmd0aCkKKyAgICAgIGJ5dGVzX3RvX3dyaXRlID0gcmVtYWluaW5nX2xlbmd0aDsKKyAgICBlbHNlCisgICAgICBieXRlc190b193cml0ZSA9IHdmc2luay0+YnVmZmVyX3NpemUgLSB3YXZlaGVhZGVyLT5kd1VzZXI7CisKKyAgICBtZW1jcHkgKHdhdmVoZWFkZXItPmxwRGF0YSArIHdhdmVoZWFkZXItPmR3VXNlciwgZGF0YSwgYnl0ZXNfdG9fd3JpdGUpOworICAgIHdhdmVoZWFkZXItPmR3VXNlciArPSBieXRlc190b193cml0ZTsKKyAgICByZW1haW5pbmdfbGVuZ3RoIC09IGJ5dGVzX3RvX3dyaXRlOworICAgIGRhdGEgPSAoZ3VpbnQ4ICopIGRhdGEgKyBieXRlc190b193cml0ZTsKKworICAgIGlmICh3YXZlaGVhZGVyLT5kd1VzZXIgPT0gd2ZzaW5rLT5idWZmZXJfc2l6ZSkgeworICAgICAgLyogd2UgaGF2ZSBmaWxsZWQgYSBidWZmZXIsIGxldCdzIHByZXBhcmUgaXQgYW5kIG5leHQgd3JpdGUgaXQgdG8gdGhlIGRldmljZSAqLworICAgICAgbW1yZXN1bHQgPQorICAgICAgICAgIHdhdmVPdXRQcmVwYXJlSGVhZGVyICh3ZnNpbmstPmh3YXZlb3V0LCB3YXZlaGVhZGVyLCBzaXplb2YgKFdBVkVIRFIpKTsKKyAgICAgIGlmIChtbXJlc3VsdCAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7CisgICAgICAgIHdhdmVPdXRHZXRFcnJvclRleHQgKG1tcmVzdWx0LCB3ZnNpbmstPmVycm9yX3N0cmluZywgRVJST1JfTEVOR1RIIC0gMSk7CisgICAgICAgIEdTVF9DQVRfV0FSTklOR19PQkpFQ1QgKHdhdmVmb3Jtc2lua19kZWJ1Zywgd2ZzaW5rLAorICAgICAgICAgICAgImdzdF93YXZlZm9ybV9zaW5rX3dyaXRlOiBFcnJvciBwcmVwYXJpbmcgaGVhZGVyID0+ICVzIiwKKyAgICAgICAgICAgIHdmc2luay0+ZXJyb3Jfc3RyaW5nKTsKKyAgICAgIH0KKyAgICAgIG1tcmVzdWx0ID0gd2F2ZU91dFdyaXRlICh3ZnNpbmstPmh3YXZlb3V0LCB3YXZlaGVhZGVyLCBzaXplb2YgKFdBVkVIRFIpKTsKKyAgICAgIGlmIChtbXJlc3VsdCAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7CisgICAgICAgIHdhdmVPdXRHZXRFcnJvclRleHQgKG1tcmVzdWx0LCB3ZnNpbmstPmVycm9yX3N0cmluZywgRVJST1JfTEVOR1RIIC0gMSk7CisgICAgICAgIEdTVF9DQVRfV0FSTklOR19PQkpFQ1QgKHdhdmVmb3Jtc2lua19kZWJ1Zywgd2ZzaW5rLAorICAgICAgICAgICAgImdzdF93YXZlZm9ybV9zaW5rX3dyaXRlOiBFcnJvciB3cml0dGluZyBidWZmZXIgdG8gdGhlIGRldmljZSA9PiAlcyIsCisgICAgICAgICAgICB3ZnNpbmstPmVycm9yX3N0cmluZyk7CisgICAgICB9CisKKyAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmd2ZzaW5rLT5jcml0aWNfd2F2ZSk7CisgICAgICB3ZnNpbmstPmZyZWVfYnVmZmVyc19jb3VudC0tOworICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZ3ZnNpbmstPmNyaXRpY193YXZlKTsKKworICAgICAgd2ZzaW5rLT53cml0ZV9idWZmZXIrKzsKKyAgICAgIHdmc2luay0+d3JpdGVfYnVmZmVyICU9IHdmc2luay0+YnVmZmVyX2NvdW50OworICAgICAgd2F2ZWhlYWRlci0+ZHdVc2VyID0gMDsKKyAgICAgIHdmc2luay0+Ynl0ZXNfaW5fcXVldWUgPSAwOworICAgICAgR1NUX0NBVF9MT0dfT0JKRUNUICh3YXZlZm9ybXNpbmtfZGVidWcsIHdmc2luaywKKyAgICAgICAgICAiZ3N0X3dhdmVmb3JtX3Npbmtfd3JpdGU6IFdyaXR0aW5nIGEgYnVmZmVyIHRvIHRoZSBkZXZpY2UgKGZyZWUgYnVmZmVycyByZW1haW5pbmc9JWQsIHdyaXRlIGJ1ZmZlcj0lZCkiLAorICAgICAgICAgIHdmc2luay0+ZnJlZV9idWZmZXJzX2NvdW50LCB3ZnNpbmstPndyaXRlX2J1ZmZlcik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGxlbmd0aDsKK30KKworc3RhdGljIGd1aW50Citnc3Rfd2F2ZWZvcm1fc2lua19kZWxheSAoR3N0QXVkaW9TaW5rICogYXNpbmspCit7CisgIC8qIHJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaW4gcXVldWUgKGRldmljZStpbnRlcm5hbCBxdWV1ZSkgKi8KKyAgR3N0V2F2ZUZvcm1TaW5rICp3ZnNpbmsgPSBHU1RfV0FWRUZPUk1fU0lOSyAoYXNpbmspOworICBndWludCBieXRlc19pbl9kZXZpY2UgPQorICAgICAgKHdmc2luay0+YnVmZmVyX2NvdW50IC0gd2ZzaW5rLT5mcmVlX2J1ZmZlcnNfY291bnQpICogd2ZzaW5rLT5idWZmZXJfc2l6ZTsKKyAgZ3VpbnQgZGVsYXkgPQorICAgICAgKGJ5dGVzX2luX2RldmljZSArIHdmc2luay0+Ynl0ZXNfaW5fcXVldWUpIC8gd2ZzaW5rLT5ieXRlc19wZXJfc2FtcGxlOworICByZXR1cm4gZGVsYXk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3Rfd2F2ZWZvcm1fc2lua19yZXNldCAoR3N0QXVkaW9TaW5rICogYXNpbmspCit7CisgIEdzdFdhdmVGb3JtU2luayAqd2ZzaW5rID0gR1NUX1dBVkVGT1JNX1NJTksgKGFzaW5rKTsKKyAgTU1SRVNVTFQgbW1yZXN1bHQgPSB3YXZlT3V0UmVzZXQgKHdmc2luay0+aHdhdmVvdXQpOworCisgIGlmIChtbXJlc3VsdCAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7CisgICAgd2F2ZU91dEdldEVycm9yVGV4dCAobW1yZXN1bHQsIHdmc2luay0+ZXJyb3Jfc3RyaW5nLCBFUlJPUl9MRU5HVEggLSAxKTsKKyAgICBHU1RfQ0FUX1dBUk5JTkdfT0JKRUNUICh3YXZlZm9ybXNpbmtfZGVidWcsIHdmc2luaywKKyAgICAgICAgImdzdF93YXZlZm9ybV9zaW5rX3Jlc2V0OiBFcnJvciByZXNldGluZyB3YXZlZm9ybS1hdWRpbyBkZXZpY2UgPT4gJXMiLAorICAgICAgICB3ZnNpbmstPmVycm9yX3N0cmluZyk7CisgIH0KK30KKworR3N0Q2FwcyAqCitnc3Rfd2F2ZWZvcm1fc2lua19jcmVhdGVfY2FwcyAoZ2ludCByYXRlLCBnaW50IGNoYW5uZWxzLCBjb25zdCBnY2hhciAqIGZvcm1hdCkKK3sKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgZm9ybWF0LAorICAgICAgImxheW91dCIsIEdfVFlQRV9TVFJJTkcsICJpbnRlcmxlYXZlZCIsCisgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBjaGFubmVscywgInJhdGUiLCBHX1RZUEVfSU5ULCByYXRlLCBOVUxMKTsKKyAgcmV0dXJuIGNhcHM7Cit9CisKK3ZvaWQgQ0FMTEJBQ0sKK3dhdmVPdXRQcm9jIChIV0FWRU9VVCBod28sCisgICAgVUlOVCB1TXNnLCBEV09SRF9QVFIgZHdJbnN0YW5jZSwgRFdPUkRfUFRSIGR3UGFyYW0xLCBEV09SRF9QVFIgZHdQYXJhbTIpCit7CisgIEdzdFdhdmVGb3JtU2luayAqd2ZzaW5rID0gKEdzdFdhdmVGb3JtU2luayAqKSBkd0luc3RhbmNlOworCisgIGlmICh1TXNnID09IFdPTV9ET05FKSB7CisgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZ3ZnNpbmstPmNyaXRpY193YXZlKTsKKyAgICB3ZnNpbmstPmZyZWVfYnVmZmVyc19jb3VudCsrOworICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmd2ZzaW5rLT5jcml0aWNfd2F2ZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3N5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXNpbmsuaCBiL3N5cy93YXZlZm9ybS9nc3R3YXZlZm9ybXNpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDBkZmMzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3dhdmVmb3JtL2dzdHdhdmVmb3Jtc2luay5oCkBAIC0wLDAgKzEsMTA4IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgIDIwMDUgU2ViYXN0aWVuIE1vdXR0ZSA8c2ViYXN0aWVuQG1vdXR0ZS5uZXQ+CisgKgorICogZ3N0d2F2ZWZvcm1zaW5rLmg6IAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19HU1RfV0FWRUZPUk1TSU5LX0hfXworI2RlZmluZSBfX0dTVF9XQVZFRk9STVNJTktfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvc2luay5oPgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPG1tc3lzdGVtLmg+CisKKyNpZm5kZWYgV0FWRV9GT1JNQVRfOTZNMDgKKyNkZWZpbmUgV0FWRV9GT1JNQVRfOTZNMDggICAgICAgMHgwMDAwMTAwMCAgICAgICAvKiA5NiAgIGtIeiwgTW9ubywgICA4LWJpdCAgKi8KKyNlbmRpZgorCisjaWZuZGVmIFdBVkVfRk9STUFUXzk2UzA4CisjZGVmaW5lIFdBVkVfRk9STUFUXzk2UzA4ICAgICAgIDB4MDAwMDIwMDAgICAgICAgLyogOTYgICBrSHosIFN0ZXJlbywgOC1iaXQgICovCisjZW5kaWYKKworI2lmbmRlZiBXQVZFX0ZPUk1BVF85Nk0xNgorI2RlZmluZSBXQVZFX0ZPUk1BVF85Nk0xNiAgICAgICAweDAwMDA0MDAwICAgICAgIC8qIDk2ICAga0h6LCBNb25vLCAgIDE2LWJpdCAqLworI2VuZGlmCisKKyNpZm5kZWYgV0FWRV9GT1JNQVRfOTZTMTYKKyNkZWZpbmUgV0FWRV9GT1JNQVRfOTZTMTYgICAgICAgMHgwMDAwODAwMCAgICAgICAvKiA5NiAgIGtIeiwgU3RlcmVvLCAxNi1iaXQgKi8KKyNlbmRpZgorCisjZGVmaW5lIEVSUk9SX0xFTkdUSCBNQVhFUlJPUkxFTkdUSCs1MAorI2RlZmluZSBCVUZGRVJfQ09VTlQgMjAKKyNkZWZpbmUgQlVGRkVSX1NJWkUgODE5MgorCitHX0JFR0lOX0RFQ0xTCisjZGVmaW5lIEdTVF9UWVBFX1dBVkVGT1JNX1NJTksgICAgICAgICAgICAgICAgKGdzdF93YXZlZm9ybV9zaW5rX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9XQVZFRk9STV9TSU5LKG9iaikgICAgICAgICAgICAgICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1dBVkVGT1JNX1NJTkssR3N0V2F2ZUZvcm1TaW5rKSkKKyNkZWZpbmUgR1NUX1dBVkVGT1JNX1NJTktfQ0xBU1Moa2xhc3MpICAgICAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSxHU1RfVFlQRV9XQVZFRk9STV9TSU5LLEdzdFdhdmVGb3JtU2lua0NsYXNzKSkKKyNkZWZpbmUgR1NUX0lTX1dBVkVGT1JNX1NJTksob2JqKSAgICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfV0FWRUZPUk1fU0lOSykpCisjZGVmaW5lIEdTVF9JU19XQVZFRk9STV9TSU5LX0NMQVNTKGtsYXNzKSAgICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksR1NUX1RZUEVfV0FWRUZPUk1fU0lOSykpCit0eXBlZGVmIHN0cnVjdCBfR3N0V2F2ZUZvcm1TaW5rIEdzdFdhdmVGb3JtU2luazsKK3R5cGVkZWYgc3RydWN0IF9Hc3RXYXZlRm9ybVNpbmtDbGFzcyBHc3RXYXZlRm9ybVNpbmtDbGFzczsKKworc3RydWN0IF9Hc3RXYXZlRm9ybVNpbmsKK3sKKyAgLyogcGFyZW50IG9iamVjdCAqLworICBHc3RBdWRpb1Npbmsgc2luazsKKworICAvKiBzdXBwb3J0ZWQgY2FwcyAqLworICBHc3RDYXBzICpjYWNoZWRfY2FwczsKKyAgCisgIC8qIGhhbmRsZSB0byB0aGUgd2F2ZWZvcm0tYXVkaW8gb3V0cHV0IGRldmljZSAqLworICBIV0FWRU9VVCBod2F2ZW91dDsKKyAgCisgIC8qIHRhYmxlIG9mIGJ1ZmZlciBoZWFkZXJzICovCisgIFdBVkVIRFIgKndhdmVfYnVmZmVyczsKKworICAvKiBjcml0aWNhbCBzZWN0aW9uIHByb3RlY3RpbmcgYWNjZXNzIHRvIHRoZSBudW1iZXIgb2YgZnJlZSBidWZmZXJzICovCisgIENSSVRJQ0FMX1NFQ1RJT04gY3JpdGljX3dhdmU7CisKKyAgLyogbnVtYmVyIG9mIGZyZWUgYnVmZmVycyBhdmFpbGFibGUgKi8KKyAgZ3VpbnQgZnJlZV9idWZmZXJzX2NvdW50OworICAKKyAgLyogY3VycmVudCBmcmVlIGJ1ZmZlciB3aGVyZSB5b3UgaGF2ZSB0byB3cml0ZSBpbmNvbWluZyBkYXRhICovCisgIGd1aW50IHdyaXRlX2J1ZmZlcjsKKyAgCisgIC8qIHNpemUgb2YgYnVmZmVycyBzdHJlYW1lZCB0byB0aGUgZGV2aWNlICovCisgIGd1aW50IGJ1ZmZlcl9zaXplOworCisgIC8qIG51bWJlciBvZiBidWZmZXJzIHN0cmVhbWVkIHRvIHRoZSBkZXZpY2UgKi8KKyAgZ3VpbnQgYnVmZmVyX2NvdW50OworCisgIC8qIHRvdGFsIG9mIGJ5dGVzIGluIHF1ZXVlIGJlZm9yZSB0aGV5IGFyZSB3cml0dGVuIHRvIHRoZSBkZXZpY2UgKi8KKyAgZ3VpbnQgYnl0ZXNfaW5fcXVldWU7CisKKyAgLyogYnl0ZXMgcGVyIHNhbXBsZSBmcm9tIHNldGNhcHMgdXNlZCB0byBldmFsdWF0ZSB0aGUgbnVtYmVyIHNhbXBsZXMgcmV0dXJuZWQgYnkgZGVsYXkgKi8KKyAgZ3VpbnQgYnl0ZXNfcGVyX3NhbXBsZTsKKworICAvKiB3YXZlIGZvcm0gZXJyb3Igc3RyaW5nICovCisgIGdjaGFyIGVycm9yX3N0cmluZ1tFUlJPUl9MRU5HVEhdOworfTsKKworc3RydWN0IF9Hc3RXYXZlRm9ybVNpbmtDbGFzcworeworICBHc3RBdWRpb1NpbmtDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitHVHlwZSBnc3Rfd2F2ZWZvcm1fc2lua19nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYgLyogX19HU1RfV0FWRUZPUk1TSU5LX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3hpbWFnZS9NYWtlZmlsZS5hbSBiL3N5cy94aW1hZ2UvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ2YjM1ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy94aW1hZ2UvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNSBAQAorcGx1Z2luX0xUTElCUkFSSUVTID0gbGliZ3N0eGltYWdlc3JjLmxhCisKK2xpYmdzdHhpbWFnZXNyY19sYV9TT1VSQ0VTID0gZ3N0eGltYWdlc3JjLmMgeGltYWdldXRpbC5jCitsaWJnc3R4aW1hZ2VzcmNfbGFfQ0ZMQUdTID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKwkkKEdTVF9CQVNFX0NGTEFHUykgXAorCSQoR1NUX0NGTEFHUykgXAorCSQoWF9DRkxBR1MpICQoWEZJWEVTX0NGTEFHUykgJChYREFNQUdFX0NGTEFHUykKK2xpYmdzdHhpbWFnZXNyY19sYV9MSUJBREQgPSBcCisJJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dmlkZW8tJChHU1RfQVBJX1ZFUlNJT04pIFwKKwkkKEdTVF9CQVNFX0xJQlMpIFwKKwkkKFhfTElCUykgJChYU0hNX0xJQlMpICQoWEZJWEVTX0xJQlMpICQoWERBTUFHRV9MSUJTKSAKK2xpYmdzdHhpbWFnZXNyY19sYV9MREZMQUdTID0gJChHU1RfUExVR0lOX0xERkxBR1MpCisKK25vaW5zdF9IRUFERVJTID0gZ3N0eGltYWdlc3JjLmggeGltYWdldXRpbC5oCmRpZmYgLS1naXQgYS9zeXMveGltYWdlL2dzdHhpbWFnZXNyYy5jIGIvc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWFkNGUyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuYwpAQCAtMCwwICsxLDEzMzYgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBaYWhlZXIgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKioKKyAqIFNFQ1RJT046ZWxlbWVudC14aW1hZ2VzcmMKKyAqCisgKiBUaGlzIGVsZW1lbnQgY2FwdHVyZXMgeW91ciBYIERpc3BsYXkgYW5kIGNyZWF0ZXMgcmF3IFJHQiB2aWRlby4gIEl0IHVzZXMKKyAqIHRoZSBYRGFtYWdlIGV4dGVuc2lvbiBpZiBhdmFpbGFibGUgdG8gb25seSBjYXB0dXJlIGFyZWFzIG9mIHRoZSBzY3JlZW4gdGhhdAorICogaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IGZyYW1lLiAgSXQgdXNlcyB0aGUgWEZpeGVzIGV4dGVuc2lvbiBpZgorICogYXZhaWxhYmxlIHRvIGFsc28gY2FwdHVyZSB5b3VyIG1vdXNlIHBvaW50ZXIuICBCeSBkZWZhdWx0IGl0IHdpbGwgZml4YXRlIHRvCisgKiAyNSBmcmFtZXMgcGVyIHNlY29uZC4KKyAqCisgKiA8cmVmc2VjdDI+CisgKiA8dGl0bGU+RXhhbXBsZSBwaXBlbGluZXM8L3RpdGxlPgorICogfFsKKyAqIGdzdC1sYXVuY2gtMS4wIHhpbWFnZXNyYyAhIHZpZGVvL3gtcmF3LGZyYW1lcmF0ZT01LzEgISB2aWRlb2NvbnZlcnQgISB0aGVvcmFlbmMgISBvZ2dtdXggISBmaWxlc2luayBsb2NhdGlvbj1kZXNrdG9wLm9nZworICogXXwgRW5jb2RlcyB5b3VyIFggZGlzcGxheSB0byBhbiBPZ2cgdGhlb3JhIHZpZGVvIGF0IDUgZnJhbWVzIHBlciBzZWNvbmQuCisgKiA8L3JlZnNlY3QyPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlICJnc3R4aW1hZ2VzcmMuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0LWkxOG4tcGx1Z2luLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKyNpbmNsdWRlICJnc3QvZ2xpYi1jb21wYXQtcHJpdmF0ZS5oIgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDIChnc3RfZGVidWdfeGltYWdlX3NyYyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCBnc3RfZGVidWdfeGltYWdlX3NyYworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgdCA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsIEdTVF9QQURfU1JDLCBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXJhdywgIgorICAgICAgICAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSBbIDAsIE1BWCBdLCAiCisgICAgICAgICJ3aWR0aCA9IChpbnQpIFsgMSwgTUFYIF0sICIgImhlaWdodCA9IChpbnQpIFsgMSwgTUFYIF0sICIKKyAgICAgICAgInBpeGVsLWFzcGVjdC1yYXRpbyA9IChmcmFjdGlvbikgWyAwLCBNQVggXSIpKTsKKworZW51bQoreworICBQUk9QXzAsCisgIFBST1BfRElTUExBWV9OQU1FLAorICBQUk9QX1NIT1dfUE9JTlRFUiwKKyAgUFJPUF9VU0VfREFNQUdFLAorICBQUk9QX1NUQVJUWCwKKyAgUFJPUF9TVEFSVFksCisgIFBST1BfRU5EWCwKKyAgUFJPUF9FTkRZLAorICBQUk9QX1JFTU9URSwKKyAgUFJPUF9YSUQsCisgIFBST1BfWE5BTUUsCit9OworCisjZGVmaW5lIGdzdF94aW1hZ2Vfc3JjX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK0dfREVGSU5FX1RZUEUgKEdzdFhJbWFnZVNyYywgZ3N0X3hpbWFnZV9zcmMsIEdTVF9UWVBFX1BVU0hfU1JDKTsKKworc3RhdGljIEdzdENhcHMgKmdzdF94aW1hZ2Vfc3JjX2ZpeGF0ZSAoR3N0QmFzZVNyYyAqIGJzcmMsIEdzdENhcHMgKiBjYXBzKTsKK3N0YXRpYyB2b2lkIGdzdF94aW1hZ2Vfc3JjX2NsZWFyX2J1ZnBvb2wgKEdzdFhJbWFnZVNyYyAqIHhpbWFnZXNyYyk7CisKKy8qIENhbGxlZCB3aGVuIGEgYnVmZmVyIGlzIHJldHVybmVkIGZyb20gdGhlIHBpcGVsaW5lICovCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF94aW1hZ2Vfc3JjX3JldHVybl9idWYgKEdzdFhJbWFnZVNyYyAqIHhpbWFnZXNyYywgR3N0QnVmZmVyICogeGltYWdlKQoreworICBHc3RNZXRhWEltYWdlICptZXRhID0gR1NUX01FVEFfWElNQUdFX0dFVCAoeGltYWdlKTsKKyAgLyogVHJ1ZSB3aWxsIG1ha2UgZGlzcG9zZSBmcmVlIHRoZSBidWZmZXIsIHdoaWxlIGZhbHNlIHdpbGwga2VlcCBpdCAqLworICBnYm9vbGVhbiByZXQgPSBUUlVFOworCisgIC8qIElmIG91ciBnZW9tZXRyeSBjaGFuZ2VkIHdlIGNhbid0IHJldXNlIHRoYXQgaW1hZ2UuICovCisgIGlmICgobWV0YS0+d2lkdGggIT0geGltYWdlc3JjLT53aWR0aCkgfHwgKG1ldGEtPmhlaWdodCAhPSB4aW1hZ2VzcmMtPmhlaWdodCkpIHsKKyAgICBHU1RfREVCVUdfT0JKRUNUICh4aW1hZ2VzcmMsCisgICAgICAgICJkZXN0cm95IGltYWdlICVwIGFzIGl0cyBzaXplIGNoYW5nZWQgJWR4JWQgdnMgY3VycmVudCAlZHglZCIsCisgICAgICAgIHhpbWFnZSwgbWV0YS0+d2lkdGgsIG1ldGEtPmhlaWdodCwgeGltYWdlc3JjLT53aWR0aCwgeGltYWdlc3JjLT5oZWlnaHQpOworICAgIGdfbXV0ZXhfbG9jayAoJnhpbWFnZXNyYy0+eF9sb2NrKTsKKyAgICBnc3RfeGltYWdldXRpbF94aW1hZ2VfZGVzdHJveSAoeGltYWdlc3JjLT54Y29udGV4dCwgeGltYWdlKTsKKyAgICBnX211dGV4X3VubG9jayAoJnhpbWFnZXNyYy0+eF9sb2NrKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBJbiB0aGF0IGNhc2Ugd2UgY2FuIHJldXNlIHRoZSBpbWFnZSBhbmQgYWRkIGl0IHRvIG91ciBpbWFnZSBwb29sLiAqLworICAgIEdTVF9MT0dfT0JKRUNUICh4aW1hZ2VzcmMsICJyZWN5Y2xpbmcgaW1hZ2UgJXAgaW4gcG9vbCIsIHhpbWFnZSk7CisgICAgLyogbmVlZCB0byBpbmNyZW1lbnQgdGhlIHJlZmNvdW50IGFnYWluIHRvIHJlY3ljbGUgKi8KKyAgICBnc3RfYnVmZmVyX3JlZiAoeGltYWdlKTsKKyAgICBnX211dGV4X2xvY2sgKCZ4aW1hZ2VzcmMtPnBvb2xfbG9jayk7CisgICAgR1NUX0JVRkZFUl9GTEFHUyAoR1NUX0JVRkZFUiAoeGltYWdlKSkgPSAwOyAvKiBjbGVhciBvdXQgYW55IGZsYWdzIGZyb20gdGhlIHByZXZpb3VzIHVzZSAqLworICAgIHhpbWFnZXNyYy0+YnVmZmVyX3Bvb2wgPSBnX3NsaXN0X3ByZXBlbmQgKHhpbWFnZXNyYy0+YnVmZmVyX3Bvb2wsIHhpbWFnZSk7CisgICAgZ19tdXRleF91bmxvY2sgKCZ4aW1hZ2VzcmMtPnBvb2xfbG9jayk7CisgICAgcmV0ID0gRkFMU0U7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgV2luZG93Citnc3RfeGltYWdlX3NyY19maW5kX3dpbmRvdyAoR3N0WEltYWdlU3JjICogc3JjLCBXaW5kb3cgcm9vdCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgV2luZG93ICpjaGlsZHJlbjsKKyAgV2luZG93IHdpbmRvdyA9IDAsIHJvb3RfcmV0dXJuLCBwYXJlbnRfcmV0dXJuOworICB1bnNpZ25lZCBpbnQgbmNoaWxkcmVuOworICBjaGFyICp0bXBuYW1lOworICBpbnQgbiwgc3RhdHVzOworCisgIHN0YXR1cyA9IFhGZXRjaE5hbWUgKHNyYy0+eGNvbnRleHQtPmRpc3AsIHJvb3QsICZ0bXBuYW1lKTsKKyAgaWYgKHN0YXR1cyAmJiAhc3RyY21wIChuYW1lLCB0bXBuYW1lKSkKKyAgICByZXR1cm4gcm9vdDsKKworICBzdGF0dXMgPQorICAgICAgWFF1ZXJ5VHJlZSAoc3JjLT54Y29udGV4dC0+ZGlzcCwgcm9vdCwgJnJvb3RfcmV0dXJuLCAmcGFyZW50X3JldHVybiwKKyAgICAgICZjaGlsZHJlbiwgJm5jaGlsZHJlbik7CisgIGlmICghc3RhdHVzIHx8ICFjaGlsZHJlbikKKyAgICByZXR1cm4gKFdpbmRvdykgMDsKKworICBmb3IgKG4gPSAwOyBuIDwgbmNoaWxkcmVuOyArK24pIHsKKyAgICB3aW5kb3cgPSBnc3RfeGltYWdlX3NyY19maW5kX3dpbmRvdyAoc3JjLCBjaGlsZHJlbltuXSwgbmFtZSk7CisgICAgaWYgKHdpbmRvdyAhPSAwKQorICAgICAgYnJlYWs7CisgIH0KKworICBYRnJlZSAoY2hpbGRyZW4pOworICByZXR1cm4gd2luZG93OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF94aW1hZ2Vfc3JjX29wZW5fZGlzcGxheSAoR3N0WEltYWdlU3JjICogcywgY29uc3QgZ2NoYXIgKiBuYW1lKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoR1NUX0lTX1hJTUFHRV9TUkMgKHMpLCBGQUxTRSk7CisKKyAgaWYgKHMtPnhjb250ZXh0ICE9IE5VTEwpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgZ19tdXRleF9sb2NrICgmcy0+eF9sb2NrKTsKKyAgcy0+eGNvbnRleHQgPSB4aW1hZ2V1dGlsX3hjb250ZXh0X2dldCAoR1NUX0VMRU1FTlQgKHMpLCBuYW1lKTsKKyAgaWYgKHMtPnhjb250ZXh0ID09IE5VTEwpIHsKKyAgICBnX211dGV4X3VubG9jayAoJnMtPnhfbG9jayk7CisgICAgR1NUX0VMRU1FTlRfRVJST1IgKHMsIFJFU09VUkNFLCBPUEVOX1JFQUQsCisgICAgICAgICgiQ291bGQgbm90IG9wZW4gWCBkaXNwbGF5IGZvciByZWFkaW5nIiksCisgICAgICAgICgiTlVMTCByZXR1cm5lZCBmcm9tIGdldHRpbmcgeGNvbnRleHQiKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHMtPndpZHRoID0gcy0+eGNvbnRleHQtPndpZHRoOworICBzLT5oZWlnaHQgPSBzLT54Y29udGV4dC0+aGVpZ2h0OworCisgIHMtPnh3aW5kb3cgPSBzLT54Y29udGV4dC0+cm9vdDsKKyAgaWYgKHMtPnhpZCAhPSAwIHx8IHMtPnhuYW1lKSB7CisgICAgaW50IHN0YXR1czsKKyAgICBYV2luZG93QXR0cmlidXRlcyBhdHRyczsKKyAgICBXaW5kb3cgd2luZG93OworICAgIGludCB4LCB5OworICAgIFdpbmRvdyBjaGlsZDsKKyAgICBCb29sIGNvb3JkX3RyYW5zbGF0ZWQ7CisKKyAgICBpZiAocy0+eGlkICE9IDApIHsKKyAgICAgIHN0YXR1cyA9IFhHZXRXaW5kb3dBdHRyaWJ1dGVzIChzLT54Y29udGV4dC0+ZGlzcCwgcy0+eGlkLCAmYXR0cnMpOworICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzLCAiRm91bmQgd2luZG93IFhJRCAlIiBHX0dVSU5UNjRfRk9STUFULCBzLT54aWQpOworICAgICAgICBzLT54d2luZG93ID0gcy0+eGlkOworICAgICAgICBnb3RvIHdpbmRvd19mb3VuZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdTVF9XQVJOSU5HX09CSkVDVCAocywgIkZhaWxlZCB0byBnZXQgd2luZG93ICUiIEdfR1VJTlQ2NF9GT1JNQVQKKyAgICAgICAgICAgICIgYXR0cmlidXRlcyIsIHMtPnhpZCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPnhuYW1lKSB7CisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzLCAiTG9va2luZyBmb3Igd2luZG93ICVzIiwgcy0+eG5hbWUpOworICAgICAgd2luZG93ID0gZ3N0X3hpbWFnZV9zcmNfZmluZF93aW5kb3cgKHMsIHMtPnhjb250ZXh0LT5yb290LCBzLT54bmFtZSk7CisgICAgICBpZiAod2luZG93ICE9IDApIHsKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocywgIkZvdW5kIHdpbmRvdyBuYW1lZCAlcywgIiwgcy0+eG5hbWUpOworICAgICAgICBzdGF0dXMgPSBYR2V0V2luZG93QXR0cmlidXRlcyAocy0+eGNvbnRleHQtPmRpc3AsIHdpbmRvdywgJmF0dHJzKTsKKyAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgIHMtPnh3aW5kb3cgPSB3aW5kb3c7CisgICAgICAgICAgZ290byB3aW5kb3dfZm91bmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChzLCAiRmFpbGVkIHRvIGdldCB3aW5kb3cgYXR0cmlidXRlcyBmb3IgIgorICAgICAgICAgICAgICAid2luZG93IG5hbWVkICVzIiwgcy0+eG5hbWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgR1NUX0lORk9fT0JKRUNUIChzLCAiVXNpbmcgcm9vdCB3aW5kb3ciKTsKKyAgICBnb3RvIHVzZV9yb290X3dpbmRvdzsKKworICB3aW5kb3dfZm91bmQ6CisgICAgZ19hc3NlcnQgKHMtPnh3aW5kb3cgIT0gMCk7CisgICAgcy0+d2lkdGggPSBhdHRycy53aWR0aDsKKyAgICBzLT5oZWlnaHQgPSBhdHRycy5oZWlnaHQ7CisKKyAgICBjb29yZF90cmFuc2xhdGVkID0gWFRyYW5zbGF0ZUNvb3JkaW5hdGVzIChzLT54Y29udGV4dC0+ZGlzcCwgcy0+eHdpbmRvdywKKyAgICAgICAgcy0+eGNvbnRleHQtPnJvb3QsIDAsIDAsICZ4LCAmeSwgJmNoaWxkKTsKKyAgICBpZiAoY29vcmRfdHJhbnNsYXRlZCkgeworICAgICAgcy0+eCA9IHg7CisgICAgICBzLT55ID0geTsKKyAgICB9IGVsc2UgeworICAgICAgcy0+eCA9IDA7CisgICAgICBzLT55ID0gMDsKKyAgICB9CisKKyAgICBHU1RfSU5GT19PQkpFQ1QgKHMsICJVc2luZyBkZWZhdWx0IHdpbmRvdyBzaXplIG9mICVkeCVkIGF0IGxvY2F0aW9uICVkLCVkIiwKKyAgICAgICAgcy0+d2lkdGgsIHMtPmhlaWdodCwgcy0+eCwgcy0+eSk7CisgIH0KK3VzZV9yb290X3dpbmRvdzoKKworI2lmZGVmIEhBVkVfWEZJWEVTCisgIC8qIGNoZWNrIGlmIHhmaXhlcyBzdXBwb3J0ZWQgKi8KKyAgeworICAgIGludCBlcnJvcl9iYXNlOworCisgICAgaWYgKFhGaXhlc1F1ZXJ5RXh0ZW5zaW9uIChzLT54Y29udGV4dC0+ZGlzcCwgJnMtPmZpeGVzX2V2ZW50X2Jhc2UsCisgICAgICAgICAgICAmZXJyb3JfYmFzZSkpIHsKKyAgICAgIHMtPmhhdmVfeGZpeGVzID0gVFJVRTsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHMsICJYIFNlcnZlciBzdXBwb3J0cyBYRml4ZXMiKTsKKyAgICB9IGVsc2UgeworCisgICAgICBHU1RfREVCVUdfT0JKRUNUIChzLCAiWCBTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBYRml4ZXMiKTsKKyAgICB9CisgIH0KKworI2lmZGVmIEhBVkVfWERBTUFHRQorICAvKiBjaGVjayBpZiB4ZGFtYWdlIGlzIHN1cHBvcnRlZCAqLworICB7CisgICAgaW50IGVycm9yX2Jhc2U7CisgICAgbG9uZyBldm1hc2sgPSBOb0V2ZW50TWFzazsKKworICAgIHMtPmhhdmVfeGRhbWFnZSA9IEZBTFNFOworICAgIHMtPmRhbWFnZSA9IE5vbmU7CisgICAgcy0+ZGFtYWdlX2NvcHlfZ2MgPSBOb25lOworICAgIHMtPmRhbWFnZV9yZWdpb24gPSBOb25lOworCisgICAgaWYgKFhEYW1hZ2VRdWVyeUV4dGVuc2lvbiAocy0+eGNvbnRleHQtPmRpc3AsICZzLT5kYW1hZ2VfZXZlbnRfYmFzZSwKKyAgICAgICAgICAgICZlcnJvcl9iYXNlKSkgeworICAgICAgcy0+ZGFtYWdlID0KKyAgICAgICAgICBYRGFtYWdlQ3JlYXRlIChzLT54Y29udGV4dC0+ZGlzcCwgcy0+eHdpbmRvdywgWERhbWFnZVJlcG9ydE5vbkVtcHR5KTsKKyAgICAgIGlmIChzLT5kYW1hZ2UgIT0gTm9uZSkgeworICAgICAgICBzLT5kYW1hZ2VfcmVnaW9uID0gWEZpeGVzQ3JlYXRlUmVnaW9uIChzLT54Y29udGV4dC0+ZGlzcCwgTlVMTCwgMCk7CisgICAgICAgIGlmIChzLT5kYW1hZ2VfcmVnaW9uICE9IE5vbmUpIHsKKyAgICAgICAgICBYR0NWYWx1ZXMgdmFsdWVzOworCisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAocywgIlVzaW5nIFhEYW1hZ2UgZXh0ZW5zaW9uIik7CisgICAgICAgICAgdmFsdWVzLnN1YndpbmRvd19tb2RlID0gSW5jbHVkZUluZmVyaW9yczsKKyAgICAgICAgICBzLT5kYW1hZ2VfY29weV9nYyA9IFhDcmVhdGVHQyAocy0+eGNvbnRleHQtPmRpc3AsCisgICAgICAgICAgICAgIHMtPnh3aW5kb3csIEdDU3Vid2luZG93TW9kZSwgJnZhbHVlcyk7CisgICAgICAgICAgWFNlbGVjdElucHV0IChzLT54Y29udGV4dC0+ZGlzcCwgcy0+eHdpbmRvdywgZXZtYXNrKTsKKworICAgICAgICAgIHMtPmhhdmVfeGRhbWFnZSA9IFRSVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgWERhbWFnZURlc3Ryb3kgKHMtPnhjb250ZXh0LT5kaXNwLCBzLT5kYW1hZ2UpOworICAgICAgICAgIHMtPmRhbWFnZSA9IE5vbmU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZQorICAgICAgICBHU1RfREVCVUdfT0JKRUNUIChzLCAiQ291bGQgbm90IGF0dGFjaCB0byBYRGFtYWdlIik7CisgICAgfSBlbHNlIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHMsICJYIFNlcnZlciBkb2VzIG5vdCBoYXZlIFhEYW1hZ2UgZXh0ZW5zaW9uIik7CisgICAgfQorICB9CisjZW5kaWYKKyNlbmRpZgorCisgIGdfbXV0ZXhfdW5sb2NrICgmcy0+eF9sb2NrKTsKKworICBpZiAocy0+eGNvbnRleHQgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3hpbWFnZV9zcmNfc3RhcnQgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKQoreworICBHc3RYSW1hZ2VTcmMgKnMgPSBHU1RfWElNQUdFX1NSQyAoYmFzZXNyYyk7CisKKyAgcy0+bGFzdF9mcmFtZV9ubyA9IC0xOworI2lmZGVmIEhBVkVfWERBTUFHRQorICBpZiAocy0+bGFzdF94aW1hZ2UpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoR1NUX0JVRkZFUl9DQVNUIChzLT5sYXN0X3hpbWFnZSkpOworICBzLT5sYXN0X3hpbWFnZSA9IE5VTEw7CisjZW5kaWYKKyAgcmV0dXJuIGdzdF94aW1hZ2Vfc3JjX29wZW5fZGlzcGxheSAocywgcy0+ZGlzcGxheV9uYW1lKTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfeGltYWdlX3NyY19zdG9wIChHc3RCYXNlU3JjICogYmFzZXNyYykKK3sKKyAgR3N0WEltYWdlU3JjICpzcmMgPSBHU1RfWElNQUdFX1NSQyAoYmFzZXNyYyk7CisKKyNpZmRlZiBIQVZFX1hEQU1BR0UKKyAgaWYgKHNyYy0+bGFzdF94aW1hZ2UpCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoR1NUX0JVRkZFUl9DQVNUIChzcmMtPmxhc3RfeGltYWdlKSk7CisgIHNyYy0+bGFzdF94aW1hZ2UgPSBOVUxMOworI2VuZGlmCisKKyAgZ3N0X3hpbWFnZV9zcmNfY2xlYXJfYnVmcG9vbCAoc3JjKTsKKworI2lmZGVmIEhBVkVfWEZJWEVTCisgIGlmIChzcmMtPmN1cnNvcl9pbWFnZSkKKyAgICBYRnJlZSAoc3JjLT5jdXJzb3JfaW1hZ2UpOworICBzcmMtPmN1cnNvcl9pbWFnZSA9IE5VTEw7CisjZW5kaWYKKworICBpZiAoc3JjLT54Y29udGV4dCkgeworICAgIGdfbXV0ZXhfbG9jayAoJnNyYy0+eF9sb2NrKTsKKworI2lmZGVmIEhBVkVfWERBTUFHRQorICAgIGlmIChzcmMtPmRhbWFnZV9jb3B5X2djICE9IE5vbmUpIHsKKyAgICAgIFhGcmVlR0MgKHNyYy0+eGNvbnRleHQtPmRpc3AsIHNyYy0+ZGFtYWdlX2NvcHlfZ2MpOworICAgICAgc3JjLT5kYW1hZ2VfY29weV9nYyA9IE5vbmU7CisgICAgfQorICAgIGlmIChzcmMtPmRhbWFnZV9yZWdpb24gIT0gTm9uZSkgeworICAgICAgWEZpeGVzRGVzdHJveVJlZ2lvbiAoc3JjLT54Y29udGV4dC0+ZGlzcCwgc3JjLT5kYW1hZ2VfcmVnaW9uKTsKKyAgICAgIHNyYy0+ZGFtYWdlX3JlZ2lvbiA9IE5vbmU7CisgICAgfQorICAgIGlmIChzcmMtPmRhbWFnZSAhPSBOb25lKSB7CisgICAgICBYRGFtYWdlRGVzdHJveSAoc3JjLT54Y29udGV4dC0+ZGlzcCwgc3JjLT5kYW1hZ2UpOworICAgICAgc3JjLT5kYW1hZ2UgPSBOb25lOworICAgIH0KKyNlbmRpZgorCisgICAgeGltYWdldXRpbF94Y29udGV4dF9jbGVhciAoc3JjLT54Y29udGV4dCk7CisgICAgc3JjLT54Y29udGV4dCA9IE5VTEw7CisgICAgZ19tdXRleF91bmxvY2sgKCZzcmMtPnhfbG9jayk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfeGltYWdlX3NyY191bmxvY2sgKEdzdEJhc2VTcmMgKiBiYXNlc3JjKQoreworICBHc3RYSW1hZ2VTcmMgKnNyYyA9IEdTVF9YSU1BR0VfU1JDIChiYXNlc3JjKTsKKworICAvKiBBd2FrZW4gdGhlIGNyZWF0ZSgpIGZ1bmMgaWYgaXQncyB3YWl0aW5nIG9uIHRoZSBjbG9jayAqLworICBHU1RfT0JKRUNUX0xPQ0sgKHNyYyk7CisgIGlmIChzcmMtPmNsb2NrX2lkKSB7CisgICAgR1NUX0RFQlVHX09CSkVDVCAoc3JjLCAiV2FraW5nIHVwIHdhaXRpbmcgY2xvY2siKTsKKyAgICBnc3RfY2xvY2tfaWRfdW5zY2hlZHVsZSAoc3JjLT5jbG9ja19pZCk7CisgIH0KKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHNyYyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3hpbWFnZV9zcmNfcmVjYWxjIChHc3RYSW1hZ2VTcmMgKiBzcmMpCit7CisgIGlmICghc3JjLT54Y29udGV4dCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogTWF5YmUgbGF0ZXIgd2UgY2FuIGNoZWNrIHRoZSBkaXNwbGF5IGhhc24ndCBjaGFuZ2VkIHNpemUgKi8KKyAgLyogV2UgY291bGQgdXNlIFhRdWVyeVBvaW50ZXIgdG8gZ2V0IG9ubHkgdGhlIGN1cnJlbnQgd2luZG93LiAqLworICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIEhBVkVfWEZJWEVTCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF94aW1hZ2VfaXNfcG9pbnRlcl9pbl9yZWdpb24gKEdzdFhJbWFnZVNyYyAqIHNyYykKK3sKKyAgV2luZG93IHdpbmRvd19yZXR1cm5lZDsKKyAgaW50IHJvb3RfeCwgcm9vdF95OworICBpbnQgd2luX3gsIHdpbl95OworICB1bnNpZ25lZCBpbnQgbWFza19yZXR1cm47CisgIEJvb2wgb25fd2luZG93OworCisgIG9uX3dpbmRvdyA9IFhRdWVyeVBvaW50ZXIgKHNyYy0+eGNvbnRleHQtPmRpc3AsIHNyYy0+eHdpbmRvdywKKyAgICAgICZ3aW5kb3dfcmV0dXJuZWQsICZ3aW5kb3dfcmV0dXJuZWQsICZyb290X3gsICZyb290X3ksICZ3aW5feCwgJndpbl95LAorICAgICAgJm1hc2tfcmV0dXJuKTsKKworICByZXR1cm4gKG9uX3dpbmRvdyAmJiAod2luX3ggPj0gc3JjLT5zdGFydHgpICYmICh3aW5feSA+PSBzcmMtPnN0YXJ0eSkgJiYKKyAgICAgICh3aW5feCA8IHNyYy0+ZW5keCkgJiYgKHdpbl95IDwgc3JjLT5lbmR5KSk7Cit9CisjZW5kaWYKKworI2lmZGVmIEhBVkVfWEZJWEVTCitzdGF0aWMgdm9pZAorY29tcG9zaXRlX3BpeGVsIChHc3RYQ29udGV4dCAqIHhjb250ZXh0LCBndWNoYXIgKiBkZXN0LCBndWNoYXIgKiBzcmMpCit7CisgIGd1aW50OCByID0gc3JjWzJdOworICBndWludDggZyA9IHNyY1sxXTsKKyAgZ3VpbnQ4IGIgPSBzcmNbMF07CisgIGd1aW50OCBhID0gc3JjWzNdOworICBndWludDggZHIsIGRnLCBkYjsKKyAgZ3VpbnQzMiBjb2xvcjsKKyAgZ2ludCByX3NoaWZ0LCByX21heCwgcl9zaGlmdF9vdXQ7CisgIGdpbnQgZ19zaGlmdCwgZ19tYXgsIGdfc2hpZnRfb3V0OworICBnaW50IGJfc2hpZnQsIGJfbWF4LCBiX3NoaWZ0X291dDsKKworICBzd2l0Y2ggKHhjb250ZXh0LT5icHApIHsKKyAgICBjYXNlIDg6CisgICAgICBjb2xvciA9ICpkZXN0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjoKKyAgICAgIGNvbG9yID0gR1VJTlQxNl9GUk9NX0xFICgqKGd1aW50MTYgKikgKGRlc3QpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzI6CisgICAgICBjb2xvciA9IEdVSU5UMzJfRlJPTV9MRSAoKihndWludDMyICopIChkZXN0KSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogU2hvdWxkIG5vdCByZWFjaCBoZXJlICovCisgICAgICBnX3JldHVybl9pZl9yZWFjaGVkICgpOworICB9CisKKyAgLyogcG9zc2libGUgb3B0aW1pc2F0aW9uOgorICAgKiBtb3ZlIHRoZSBjb2RlIHRoYXQgZmluZHMgc2hpZnQgYW5kIG1heCBpbiB0aGUgX2xpbmsgZnVuY3Rpb24gKi8KKyAgZm9yIChyX3NoaWZ0ID0gMDsgISh4Y29udGV4dC0+dmlzdWFsLT5yZWRfbWFzayAmICgxIDw8IHJfc2hpZnQpKTsgcl9zaGlmdCsrKTsKKyAgZm9yIChnX3NoaWZ0ID0gMDsgISh4Y29udGV4dC0+dmlzdWFsLT5ncmVlbl9tYXNrICYgKDEgPDwgZ19zaGlmdCkpOworICAgICAgZ19zaGlmdCsrKTsKKyAgZm9yIChiX3NoaWZ0ID0gMDsgISh4Y29udGV4dC0+dmlzdWFsLT5ibHVlX21hc2sgJiAoMSA8PCBiX3NoaWZ0KSk7IGJfc2hpZnQrKyk7CisKKyAgZm9yIChyX3NoaWZ0X291dCA9IDA7ICEoeGNvbnRleHQtPnZpc3VhbC0+cmVkX21hc2sgJiAoMSA8PCByX3NoaWZ0X291dCkpOworICAgICAgcl9zaGlmdF9vdXQrKyk7CisgIGZvciAoZ19zaGlmdF9vdXQgPSAwOyAhKHhjb250ZXh0LT52aXN1YWwtPmdyZWVuX21hc2sgJiAoMSA8PCBnX3NoaWZ0X291dCkpOworICAgICAgZ19zaGlmdF9vdXQrKyk7CisgIGZvciAoYl9zaGlmdF9vdXQgPSAwOyAhKHhjb250ZXh0LT52aXN1YWwtPmJsdWVfbWFzayAmICgxIDw8IGJfc2hpZnRfb3V0KSk7CisgICAgICBiX3NoaWZ0X291dCsrKTsKKworCisgIHJfbWF4ID0gKHhjb250ZXh0LT52aXN1YWwtPnJlZF9tYXNrID4+IHJfc2hpZnQpOworICBiX21heCA9ICh4Y29udGV4dC0+dmlzdWFsLT5ibHVlX21hc2sgPj4gYl9zaGlmdCk7CisgIGdfbWF4ID0gKHhjb250ZXh0LT52aXN1YWwtPmdyZWVuX21hc2sgPj4gZ19zaGlmdCk7CisKKyNkZWZpbmUgUkdCWFhYX1IoeCkgICgoKHgpPj5yX3NoaWZ0KSAmIChyX21heCkpCisjZGVmaW5lIFJHQlhYWF9HKHgpICAoKCh4KT4+Z19zaGlmdCkgJiAoZ19tYXgpKQorI2RlZmluZSBSR0JYWFhfQih4KSAgKCgoeCk+PmJfc2hpZnQpICYgKGJfbWF4KSkKKworICBkciA9IChSR0JYWFhfUiAoY29sb3IpICogMjU1KSAvIHJfbWF4OworICBkZyA9IChSR0JYWFhfRyAoY29sb3IpICogMjU1KSAvIGdfbWF4OworICBkYiA9IChSR0JYWFhfQiAoY29sb3IpICogMjU1KSAvIGJfbWF4OworCisgIGRyID0gKHIgKiBhICsgKDB4ZmYgLSBhKSAqIGRyKSAvIDB4ZmY7CisgIGRnID0gKGcgKiBhICsgKDB4ZmYgLSBhKSAqIGRnKSAvIDB4ZmY7CisgIGRiID0gKGIgKiBhICsgKDB4ZmYgLSBhKSAqIGRiKSAvIDB4ZmY7CisKKyAgY29sb3IgPSAoKChkciAqIHJfbWF4KSAvIDI1NSkgPDwgcl9zaGlmdF9vdXQpICsKKyAgICAgICgoKGRnICogZ19tYXgpIC8gMjU1KSA8PCBnX3NoaWZ0X291dCkgKworICAgICAgKCgoZGIgKiBiX21heCkgLyAyNTUpIDw8IGJfc2hpZnRfb3V0KTsKKworICBzd2l0Y2ggKHhjb250ZXh0LT5icHApIHsKKyAgICBjYXNlIDg6CisgICAgICAqZGVzdCA9IGNvbG9yOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjoKKyAgICAgICooZ3VpbnQxNiAqKSAoZGVzdCkgPSBjb2xvcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzI6CisgICAgICAqKGd1aW50MzIgKikgKGRlc3QpID0gY29sb3I7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ193YXJuaW5nICgiYnBwICVkIG5vdCBzdXBwb3J0ZWRcbiIsIHhjb250ZXh0LT5icHApOworICB9Cit9CisjZW5kaWYKKworI2lmZGVmIEhBVkVfWERBTUFHRQorc3RhdGljIHZvaWQKK2NvcHlfYnVmZmVyIChHc3RCdWZmZXIgKiBkZXN0LCBHc3RCdWZmZXIgKiBzcmMpCit7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGdzdF9idWZmZXJfbWFwIChzcmMsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGdzdF9idWZmZXJfZmlsbCAoZGVzdCwgMCwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoc3JjLCAmbWFwKTsKK30KKyNlbmRpZgorCisvKiBSZXRyaWV2ZSBhbiBYSW1hZ2VTcmNCdWZmZXIsIHByZWZlcmFibHkgZnJvbSBvdXIKKyAqIHBvb2wgb2YgZXhpc3RpbmcgaW1hZ2VzIGFuZCBwb3B1bGF0ZSBpdCBmcm9tIHRoZSB3aW5kb3cgKi8KK3N0YXRpYyBHc3RCdWZmZXIgKgorZ3N0X3hpbWFnZV9zcmNfeGltYWdlX2dldCAoR3N0WEltYWdlU3JjICogeGltYWdlc3JjKQoreworICBHc3RCdWZmZXIgKnhpbWFnZSA9IE5VTEw7CisgIEdzdE1ldGFYSW1hZ2UgKm1ldGE7CisKKyAgZ19tdXRleF9sb2NrICgmeGltYWdlc3JjLT5wb29sX2xvY2spOworICB3aGlsZSAoeGltYWdlc3JjLT5idWZmZXJfcG9vbCAhPSBOVUxMKSB7CisgICAgeGltYWdlID0geGltYWdlc3JjLT5idWZmZXJfcG9vbC0+ZGF0YTsKKworICAgIG1ldGEgPSBHU1RfTUVUQV9YSU1BR0VfR0VUICh4aW1hZ2UpOworCisgICAgeGltYWdlc3JjLT5idWZmZXJfcG9vbCA9IGdfc2xpc3RfZGVsZXRlX2xpbmsgKHhpbWFnZXNyYy0+YnVmZmVyX3Bvb2wsCisgICAgICAgIHhpbWFnZXNyYy0+YnVmZmVyX3Bvb2wpOworCisgICAgaWYgKChtZXRhLT53aWR0aCA9PSB4aW1hZ2VzcmMtPndpZHRoKSB8fAorICAgICAgICAobWV0YS0+aGVpZ2h0ID09IHhpbWFnZXNyYy0+aGVpZ2h0KSkKKyAgICAgIGJyZWFrOworCisgICAgZ3N0X3hpbWFnZV9idWZmZXJfZnJlZSAoeGltYWdlKTsKKyAgICB4aW1hZ2UgPSBOVUxMOworICB9CisgIGdfbXV0ZXhfdW5sb2NrICgmeGltYWdlc3JjLT5wb29sX2xvY2spOworCisgIGlmICh4aW1hZ2UgPT0gTlVMTCkgeworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHhpbWFnZXNyYywgImNyZWF0aW5nIGltYWdlICglZHglZCkiLAorICAgICAgICB4aW1hZ2VzcmMtPndpZHRoLCB4aW1hZ2VzcmMtPmhlaWdodCk7CisKKyAgICBnX211dGV4X2xvY2sgKCZ4aW1hZ2VzcmMtPnhfbG9jayk7CisgICAgeGltYWdlID0gZ3N0X3hpbWFnZXV0aWxfeGltYWdlX25ldyAoeGltYWdlc3JjLT54Y29udGV4dCwKKyAgICAgICAgR1NUX0VMRU1FTlQgKHhpbWFnZXNyYyksIHhpbWFnZXNyYy0+d2lkdGgsIHhpbWFnZXNyYy0+aGVpZ2h0LAorICAgICAgICAoQnVmZmVyUmV0dXJuRnVuYykgKGdzdF94aW1hZ2Vfc3JjX3JldHVybl9idWYpKTsKKyAgICBpZiAoeGltYWdlID09IE5VTEwpIHsKKyAgICAgIEdTVF9FTEVNRU5UX0VSUk9SICh4aW1hZ2VzcmMsIFJFU09VUkNFLCBXUklURSwgKE5VTEwpLAorICAgICAgICAgICgiY291bGQgbm90IGNyZWF0ZSBhICVkeCVkIHhpbWFnZSIsIHhpbWFnZXNyYy0+d2lkdGgsCisgICAgICAgICAgICAgIHhpbWFnZXNyYy0+aGVpZ2h0KSk7CisgICAgICBnX211dGV4X3VubG9jayAoJnhpbWFnZXNyYy0+eF9sb2NrKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGdfbXV0ZXhfdW5sb2NrICgmeGltYWdlc3JjLT54X2xvY2spOworICB9CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKEdTVF9JU19YSU1BR0VfU1JDICh4aW1hZ2VzcmMpLCBOVUxMKTsKKworICBtZXRhID0gR1NUX01FVEFfWElNQUdFX0dFVCAoeGltYWdlKTsKKworI2lmZGVmIEhBVkVfWERBTUFHRQorICBpZiAoeGltYWdlc3JjLT5oYXZlX3hkYW1hZ2UgJiYgeGltYWdlc3JjLT51c2VfZGFtYWdlICYmCisgICAgICB4aW1hZ2VzcmMtPmxhc3RfeGltYWdlICE9IE5VTEwpIHsKKyAgICBYRXZlbnQgZXY7CisgICAgZ2Jvb2xlYW4gaGF2ZV9kYW1hZ2UgPSBGQUxTRTsKKworICAgIC8qIGhhdmVfZnJhbWUgaXMgVFJVRSB3aGVuIGVpdGhlciB0aGUgZW50aXJlIHNjcmVlbiBoYXMgYmVlbgorICAgICAqIGdyYWJiZWQgb3Igd2hlbiB0aGUgbGFzdCBpbWFnZSBoYXMgYmVlbiBjb3BpZWQgKi8KKyAgICBnYm9vbGVhbiBoYXZlX2ZyYW1lID0gRkFMU0U7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUICh4aW1hZ2VzcmMsICJSZXRyaWV2aW5nIHNjcmVlbiB1c2luZyBYRGFtYWdlIik7CisKKyAgICBkbyB7CisgICAgICBYRGFtYWdlTm90aWZ5RXZlbnQgKmRhbWFnZV9ldiA9IChYRGFtYWdlTm90aWZ5RXZlbnQgKikgKCZldik7CisKKyAgICAgIFhOZXh0RXZlbnQgKHhpbWFnZXNyYy0+eGNvbnRleHQtPmRpc3AsICZldik7CisKKyAgICAgIGlmIChldi50eXBlID09IHhpbWFnZXNyYy0+ZGFtYWdlX2V2ZW50X2Jhc2UgKyBYRGFtYWdlTm90aWZ5ICYmCisgICAgICAgICAgZGFtYWdlX2V2LT5sZXZlbCA9PSBYRGFtYWdlUmVwb3J0Tm9uRW1wdHkpIHsKKworICAgICAgICBYRGFtYWdlU3VidHJhY3QgKHhpbWFnZXNyYy0+eGNvbnRleHQtPmRpc3AsIHhpbWFnZXNyYy0+ZGFtYWdlLCBOb25lLAorICAgICAgICAgICAgeGltYWdlc3JjLT5kYW1hZ2VfcmVnaW9uKTsKKyAgICAgICAgaGF2ZV9kYW1hZ2UgPSBUUlVFOworICAgICAgfQorICAgIH0gd2hpbGUgKFhQZW5kaW5nICh4aW1hZ2VzcmMtPnhjb250ZXh0LT5kaXNwKSk7CisKKyAgICBpZiAoaGF2ZV9kYW1hZ2UpIHsKKyAgICAgIFhSZWN0YW5nbGUgKnJlY3RzOworICAgICAgaW50IG5yZWN0czsKKworICAgICAgLyogTm93IGNvcHkgb3V0IGFsbCBvZiB0aGUgZGFtYWdlZCByZWN0YW5nbGVzLiAqLworICAgICAgcmVjdHMgPQorICAgICAgICAgIFhGaXhlc0ZldGNoUmVnaW9uICh4aW1hZ2VzcmMtPnhjb250ZXh0LT5kaXNwLAorICAgICAgICAgIHhpbWFnZXNyYy0+ZGFtYWdlX3JlZ2lvbiwgJm5yZWN0cyk7CisgICAgICBpZiAocmVjdHMgIT0gTlVMTCkgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBpZiAoIWhhdmVfZnJhbWUpIHsKKyAgICAgICAgICBHU1RfTE9HX09CSkVDVCAoeGltYWdlc3JjLAorICAgICAgICAgICAgICAiQ29weWluZyBmcm9tIGxhc3QgZnJhbWUgeGltYWdlLT5zaXplOiAlIiBHX0dTSVpFX0ZPUk1BVCwKKyAgICAgICAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoeGltYWdlKSk7CisgICAgICAgICAgY29weV9idWZmZXIgKHhpbWFnZSwgeGltYWdlc3JjLT5sYXN0X3hpbWFnZSk7CisgICAgICAgICAgaGF2ZV9mcmFtZSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5yZWN0czsgaSsrKSB7CisgICAgICAgICAgR1NUX0xPR19PQkpFQ1QgKHhpbWFnZXNyYywKKyAgICAgICAgICAgICAgIkRhbWFnZWQgc3ViLXJlZ2lvbiBAICVkLCVkIHNpemUgJWR4JWQgcmVwb3J0ZWQiLAorICAgICAgICAgICAgICByZWN0c1tpXS54LCByZWN0c1tpXS55LCByZWN0c1tpXS53aWR0aCwgcmVjdHNbaV0uaGVpZ2h0KTsKKworICAgICAgICAgIC8qIGlmIHdlIG9ubHkgd2FudCBhIHNtYWxsIGFyZWEsIGNsaXAgdGhpcyBkYW1hZ2UgcmVnaW9uIHRvCisgICAgICAgICAgICogYXJlYSB3ZSB3YW50ICovCisgICAgICAgICAgaWYgKHhpbWFnZXNyYy0+ZW5keCA+IHhpbWFnZXNyYy0+c3RhcnR4ICYmCisgICAgICAgICAgICAgIHhpbWFnZXNyYy0+ZW5keSA+IHhpbWFnZXNyYy0+c3RhcnR5KSB7CisgICAgICAgICAgICAvKiBzZWUgaWYgZGFtYWdlIGFyZWEgaW50ZXJzZWN0cyAqLworICAgICAgICAgICAgaWYgKHJlY3RzW2ldLnggKyByZWN0c1tpXS53aWR0aCAtIDEgPCB4aW1hZ2VzcmMtPnN0YXJ0eCB8fAorICAgICAgICAgICAgICAgIHJlY3RzW2ldLnggPiB4aW1hZ2VzcmMtPmVuZHgpIHsKKyAgICAgICAgICAgICAgLyogdHJpdmlhbCByZWplY3QgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVjdHNbaV0ueSArIHJlY3RzW2ldLmhlaWdodCAtIDEgPCB4aW1hZ2VzcmMtPnN0YXJ0eSB8fAorICAgICAgICAgICAgICAgIHJlY3RzW2ldLnkgPiB4aW1hZ2VzcmMtPmVuZHkpIHsKKyAgICAgICAgICAgICAgLyogdHJpdmlhbCByZWplY3QgKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8qIGZpbmQgaW50ZXJzZWN0IHJlZ2lvbiAqLworICAgICAgICAgICAgICBpbnQgc3RhcnR4LCBzdGFydHksIHdpZHRoLCBoZWlnaHQ7CisKKyAgICAgICAgICAgICAgc3RhcnR4ID0gKHJlY3RzW2ldLnggPCB4aW1hZ2VzcmMtPnN0YXJ0eCkgPyB4aW1hZ2VzcmMtPnN0YXJ0eCA6CisgICAgICAgICAgICAgICAgICByZWN0c1tpXS54OworICAgICAgICAgICAgICBzdGFydHkgPSAocmVjdHNbaV0ueSA8IHhpbWFnZXNyYy0+c3RhcnR5KSA/IHhpbWFnZXNyYy0+c3RhcnR5IDoKKyAgICAgICAgICAgICAgICAgIHJlY3RzW2ldLnk7CisgICAgICAgICAgICAgIHdpZHRoID0gKHJlY3RzW2ldLnggKyByZWN0c1tpXS53aWR0aCAtIDEgPCB4aW1hZ2VzcmMtPmVuZHgpID8KKyAgICAgICAgICAgICAgICAgIHJlY3RzW2ldLnggKyByZWN0c1tpXS53aWR0aCAtIHN0YXJ0eCA6CisgICAgICAgICAgICAgICAgICB4aW1hZ2VzcmMtPmVuZHggLSBzdGFydHggKyAxOworICAgICAgICAgICAgICBoZWlnaHQgPSAocmVjdHNbaV0ueSArIHJlY3RzW2ldLmhlaWdodCAtIDEgPCB4aW1hZ2VzcmMtPmVuZHkpID8KKyAgICAgICAgICAgICAgICAgIHJlY3RzW2ldLnkgKyByZWN0c1tpXS5oZWlnaHQgLSBzdGFydHkgOiB4aW1hZ2VzcmMtPmVuZHkgLQorICAgICAgICAgICAgICAgICAgc3RhcnR5ICsgMTsKKworICAgICAgICAgICAgICBHU1RfTE9HX09CSkVDVCAoeGltYWdlc3JjLAorICAgICAgICAgICAgICAgICAgIlJldHJpZXZpbmcgZGFtYWdlZCBzdWItcmVnaW9uIEAgJWQsJWQgc2l6ZSAlZHglZCBhcyBpbnRlcnNlY3QgcmVnaW9uIiwKKyAgICAgICAgICAgICAgICAgIHN0YXJ0eCwgc3RhcnR5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgWEdldFN1YkltYWdlICh4aW1hZ2VzcmMtPnhjb250ZXh0LT5kaXNwLCB4aW1hZ2VzcmMtPnh3aW5kb3csCisgICAgICAgICAgICAgICAgICBzdGFydHgsIHN0YXJ0eSwgd2lkdGgsIGhlaWdodCwgQWxsUGxhbmVzLCBaUGl4bWFwLAorICAgICAgICAgICAgICAgICAgbWV0YS0+eGltYWdlLCBzdGFydHggLSB4aW1hZ2VzcmMtPnN0YXJ0eCwKKyAgICAgICAgICAgICAgICAgIHN0YXJ0eSAtIHhpbWFnZXNyYy0+c3RhcnR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICBHU1RfTE9HX09CSkVDVCAoeGltYWdlc3JjLAorICAgICAgICAgICAgICAgICJSZXRyaWV2aW5nIGRhbWFnZWQgc3ViLXJlZ2lvbiBAICVkLCVkIHNpemUgJWR4JWQiLAorICAgICAgICAgICAgICAgIHJlY3RzW2ldLngsIHJlY3RzW2ldLnksIHJlY3RzW2ldLndpZHRoLCByZWN0c1tpXS5oZWlnaHQpOworCisgICAgICAgICAgICBYR2V0U3ViSW1hZ2UgKHhpbWFnZXNyYy0+eGNvbnRleHQtPmRpc3AsIHhpbWFnZXNyYy0+eHdpbmRvdywKKyAgICAgICAgICAgICAgICByZWN0c1tpXS54LCByZWN0c1tpXS55LAorICAgICAgICAgICAgICAgIHJlY3RzW2ldLndpZHRoLCByZWN0c1tpXS5oZWlnaHQsCisgICAgICAgICAgICAgICAgQWxsUGxhbmVzLCBaUGl4bWFwLCBtZXRhLT54aW1hZ2UsIHJlY3RzW2ldLngsIHJlY3RzW2ldLnkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBYRnJlZSAocmVjdHMpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWhhdmVfZnJhbWUpIHsKKyAgICAgIEdTVF9MT0dfT0JKRUNUICh4aW1hZ2VzcmMsCisgICAgICAgICAgIkNvcHlpbmcgZnJvbSBsYXN0IGZyYW1lIHhpbWFnZS0+c2l6ZTogJSIgR19HU0laRV9GT1JNQVQsCisgICAgICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoeGltYWdlKSk7CisgICAgICBjb3B5X2J1ZmZlciAoeGltYWdlLCB4aW1hZ2VzcmMtPmxhc3RfeGltYWdlKTsKKyAgICB9CisjaWZkZWYgSEFWRV9YRklYRVMKKyAgICAvKiByZS1nZXQgYXJlYSB3aGVyZSBsYXN0IG1vdXNlIHBvaW50ZXIgd2FzICBidXQgb25seSBpZiBpbiBvdXIgY2xpcHBpbmcKKyAgICAgKiBib3VuZHMgKi8KKyAgICBpZiAoeGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UpIHsKKyAgICAgIGdpbnQgeCwgeSwgd2lkdGgsIGhlaWdodDsKKworICAgICAgeCA9IHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlLT54IC0geGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPnhob3QgLQorICAgICAgICAgIHhpbWFnZXNyYy0+eDsKKyAgICAgIHkgPSB4aW1hZ2VzcmMtPmN1cnNvcl9pbWFnZS0+eSAtIHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlLT55aG90IC0KKyAgICAgICAgICB4aW1hZ2VzcmMtPnk7CisgICAgICB3aWR0aCA9IHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlLT53aWR0aDsKKyAgICAgIGhlaWdodCA9IHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlLT5oZWlnaHQ7CisKKyAgICAgIC8qIGJvdW5kcyBjaGVja2luZyAqLworICAgICAgaWYgKHggPCAwKQorICAgICAgICB4ID0gMDsKKyAgICAgIGlmICh5IDwgMCkKKyAgICAgICAgeSA9IDA7CisgICAgICBpZiAoeCArIHdpZHRoID4geGltYWdlc3JjLT54Y29udGV4dC0+d2lkdGgpCisgICAgICAgIHdpZHRoID0geGltYWdlc3JjLT54Y29udGV4dC0+d2lkdGggLSB4OworICAgICAgaWYgKHkgKyBoZWlnaHQgPiB4aW1hZ2VzcmMtPnhjb250ZXh0LT5oZWlnaHQpCisgICAgICAgIGhlaWdodCA9IHhpbWFnZXNyYy0+eGNvbnRleHQtPmhlaWdodCAtIHk7CisgICAgICBnX2Fzc2VydCAoeCA+PSAwKTsKKyAgICAgIGdfYXNzZXJ0ICh5ID49IDApOworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoeGltYWdlc3JjLAorICAgICAgICAgICJDdXJzb3Igd2FzIGF0ICglZCwlZCkgd2lkdGg6ICVkLCBoZWlnaHQ6ICVkIGFuZCBvdXIgcmFuZ2UgaXM6ICglZCwlZCkgLSAoJWQsJWQpIiwKKyAgICAgICAgICB4LCB5LCB3aWR0aCwgaGVpZ2h0LCB4aW1hZ2VzcmMtPnN0YXJ0eCwgeGltYWdlc3JjLT5zdGFydHksCisgICAgICAgICAgeGltYWdlc3JjLT5lbmR4LCB4aW1hZ2VzcmMtPmVuZHkpOworICAgICAgLyogb25seSBnZXQgd2hlcmUgY3Vyc29yIGxhc3Qgd2FzLCBpZiBpdCBpcyBpbiBvdXIgcmFuZ2UgKi8KKyAgICAgIGlmICh4aW1hZ2VzcmMtPmVuZHggPiB4aW1hZ2VzcmMtPnN0YXJ0eCAmJgorICAgICAgICAgIHhpbWFnZXNyYy0+ZW5keSA+IHhpbWFnZXNyYy0+c3RhcnR5KSB7CisgICAgICAgIC8qIGNoZWNrIGJvdW5kcyAqLworICAgICAgICBpZiAoeCArIHdpZHRoIDwgeGltYWdlc3JjLT5zdGFydHggfHwgeCA+IHhpbWFnZXNyYy0+ZW5keCkgeworICAgICAgICAgIC8qIHRyaXZpYWwgcmVqZWN0ICovCisgICAgICAgIH0gZWxzZSBpZiAoeSArIGhlaWdodCA8IHhpbWFnZXNyYy0+c3RhcnR5IHx8IHkgPiB4aW1hZ2VzcmMtPmVuZHkpIHsKKyAgICAgICAgICAvKiB0cml2aWFsIHJlamVjdCAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIGZpbmQgaW50ZXJzZWN0IHJlZ2lvbiAqLworICAgICAgICAgIGludCBzdGFydHgsIHN0YXJ0eSwgaXdpZHRoLCBpaGVpZ2h0OworCisgICAgICAgICAgc3RhcnR4ID0gKHggPCB4aW1hZ2VzcmMtPnN0YXJ0eCkgPyB4aW1hZ2VzcmMtPnN0YXJ0eCA6IHg7CisgICAgICAgICAgc3RhcnR5ID0gKHkgPCB4aW1hZ2VzcmMtPnN0YXJ0eSkgPyB4aW1hZ2VzcmMtPnN0YXJ0eSA6IHk7CisgICAgICAgICAgaXdpZHRoID0gKHggKyB3aWR0aCA8IHhpbWFnZXNyYy0+ZW5keCkgPworICAgICAgICAgICAgICB4ICsgd2lkdGggLSBzdGFydHggOiB4aW1hZ2VzcmMtPmVuZHggLSBzdGFydHg7CisgICAgICAgICAgaWhlaWdodCA9ICh5ICsgaGVpZ2h0IDwgeGltYWdlc3JjLT5lbmR5KSA/CisgICAgICAgICAgICAgIHkgKyBoZWlnaHQgLSBzdGFydHkgOiB4aW1hZ2VzcmMtPmVuZHkgLSBzdGFydHk7CisgICAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoeGltYWdlc3JjLCAiUmVtb3ZpbmcgY3Vyc29yIGZyb20gJWQsJWQiLCB4LCB5KTsKKyAgICAgICAgICBYR2V0U3ViSW1hZ2UgKHhpbWFnZXNyYy0+eGNvbnRleHQtPmRpc3AsIHhpbWFnZXNyYy0+eHdpbmRvdywKKyAgICAgICAgICAgICAgc3RhcnR4LCBzdGFydHksIGl3aWR0aCwgaWhlaWdodCwgQWxsUGxhbmVzLCBaUGl4bWFwLAorICAgICAgICAgICAgICBtZXRhLT54aW1hZ2UsIHN0YXJ0eCAtIHhpbWFnZXNyYy0+c3RhcnR4LAorICAgICAgICAgICAgICBzdGFydHkgLSB4aW1hZ2VzcmMtPnN0YXJ0eSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgR1NUX0RFQlVHX09CSkVDVCAoeGltYWdlc3JjLCAiUmVtb3ZpbmcgY3Vyc29yIGZyb20gJWQsJWQiLCB4LCB5KTsKKyAgICAgICAgWEdldFN1YkltYWdlICh4aW1hZ2VzcmMtPnhjb250ZXh0LT5kaXNwLCB4aW1hZ2VzcmMtPnh3aW5kb3csCisgICAgICAgICAgICB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBBbGxQbGFuZXMsIFpQaXhtYXAsIG1ldGEtPnhpbWFnZSwgeCwgeSk7CisgICAgICB9CisgICAgfQorI2VuZGlmCisKKworICB9IGVsc2UgeworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1hTSE0KKyAgICBpZiAoeGltYWdlc3JjLT54Y29udGV4dC0+dXNlX3hzaG0pIHsKKyAgICAgIEdTVF9ERUJVR19PQkpFQ1QgKHhpbWFnZXNyYywgIlJldHJpZXZpbmcgc2NyZWVuIHVzaW5nIFhTaG0iKTsKKyAgICAgIFhTaG1HZXRJbWFnZSAoeGltYWdlc3JjLT54Y29udGV4dC0+ZGlzcCwgeGltYWdlc3JjLT54d2luZG93LAorICAgICAgICAgIG1ldGEtPnhpbWFnZSwgeGltYWdlc3JjLT5zdGFydHgsIHhpbWFnZXNyYy0+c3RhcnR5LCBBbGxQbGFuZXMpOworCisgICAgfSBlbHNlCisjZW5kaWYgLyogSEFWRV9YU0hNICovCisgICAgeworICAgICAgR1NUX0RFQlVHX09CSkVDVCAoeGltYWdlc3JjLCAiUmV0cmlldmluZyBzY3JlZW4gdXNpbmcgWEdldEltYWdlIik7CisgICAgICBpZiAoeGltYWdlc3JjLT5yZW1vdGUpIHsKKyAgICAgICAgWEdldFN1YkltYWdlICh4aW1hZ2VzcmMtPnhjb250ZXh0LT5kaXNwLCB4aW1hZ2VzcmMtPnh3aW5kb3csCisgICAgICAgICAgICB4aW1hZ2VzcmMtPnN0YXJ0eCwgeGltYWdlc3JjLT5zdGFydHksIHhpbWFnZXNyYy0+d2lkdGgsCisgICAgICAgICAgICB4aW1hZ2VzcmMtPmhlaWdodCwgQWxsUGxhbmVzLCBaUGl4bWFwLCBtZXRhLT54aW1hZ2UsIDAsIDApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWV0YS0+eGltYWdlID0KKyAgICAgICAgICAgIFhHZXRJbWFnZSAoeGltYWdlc3JjLT54Y29udGV4dC0+ZGlzcCwgeGltYWdlc3JjLT54d2luZG93LAorICAgICAgICAgICAgeGltYWdlc3JjLT5zdGFydHgsIHhpbWFnZXNyYy0+c3RhcnR5LCB4aW1hZ2VzcmMtPndpZHRoLAorICAgICAgICAgICAgeGltYWdlc3JjLT5oZWlnaHQsIEFsbFBsYW5lcywgWlBpeG1hcCk7CisgICAgICB9CisgICAgfQorI2lmZGVmIEhBVkVfWERBTUFHRQorICB9CisjZW5kaWYKKworI2lmZGVmIEhBVkVfWEZJWEVTCisgIGlmICh4aW1hZ2VzcmMtPnNob3dfcG9pbnRlciAmJiB4aW1hZ2VzcmMtPmhhdmVfeGZpeGVzCisgICAgICAmJiBnc3RfeGltYWdlX2lzX3BvaW50ZXJfaW5fcmVnaW9uICh4aW1hZ2VzcmMpKSB7CisKKyAgICBHU1RfREVCVUdfT0JKRUNUICh4aW1hZ2VzcmMsICJVc2luZyBYRml4ZXMgdG8gZHJhdyBjdXJzb3IiKTsKKyAgICAvKiBnZXQgY3Vyc29yICovCisgICAgaWYgKHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlKQorICAgICAgWEZyZWUgKHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlKTsKKyAgICB4aW1hZ2VzcmMtPmN1cnNvcl9pbWFnZSA9IFhGaXhlc0dldEN1cnNvckltYWdlICh4aW1hZ2VzcmMtPnhjb250ZXh0LT5kaXNwKTsKKyAgICBpZiAoeGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UgIT0gTlVMTCkgeworICAgICAgaW50IGN4LCBjeSwgaSwgaiwgY291bnQ7CisgICAgICBpbnQgc3RhcnR4LCBzdGFydHksIGl3aWR0aCwgaWhlaWdodDsKKyAgICAgIGdib29sZWFuIGN1cnNvcl9pbl9pbWFnZSA9IFRSVUU7CisKKyAgICAgIGN4ID0geGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPnggLSB4aW1hZ2VzcmMtPmN1cnNvcl9pbWFnZS0+eGhvdCAtCisgICAgICAgICAgeGltYWdlc3JjLT54OworICAgICAgY3kgPSB4aW1hZ2VzcmMtPmN1cnNvcl9pbWFnZS0+eSAtIHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlLT55aG90IC0KKyAgICAgICAgICB4aW1hZ2VzcmMtPnk7CisgICAgICBjb3VudCA9IHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlLT53aWR0aCAqIHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlLT5oZWlnaHQ7CisKKyAgICAgIC8qIG9ubHkgZ2V0IHdoZXJlIGN1cnNvciBsYXN0IHdhcywgaWYgaXQgaXMgaW4gb3VyIHJhbmdlICovCisgICAgICBpZiAoeGltYWdlc3JjLT5lbmR4ID4geGltYWdlc3JjLT5zdGFydHggJiYKKyAgICAgICAgICB4aW1hZ2VzcmMtPmVuZHkgPiB4aW1hZ2VzcmMtPnN0YXJ0eSkgeworICAgICAgICAvKiBjaGVjayBib3VuZHMgKi8KKyAgICAgICAgaWYgKGN4ICsgeGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPndpZHRoIDwgKGludCkgeGltYWdlc3JjLT5zdGFydHggfHwKKyAgICAgICAgICAgIGN4ID4gKGludCkgeGltYWdlc3JjLT5lbmR4KSB7CisgICAgICAgICAgLyogdHJpdmlhbCByZWplY3QgKi8KKyAgICAgICAgICBjdXJzb3JfaW5faW1hZ2UgPSBGQUxTRTsKKyAgICAgICAgfSBlbHNlIGlmIChjeSArIHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlLT5oZWlnaHQgPAorICAgICAgICAgICAgKGludCkgeGltYWdlc3JjLT5zdGFydHkgfHwgY3kgPiAoaW50KSB4aW1hZ2VzcmMtPmVuZHkpIHsKKyAgICAgICAgICAvKiB0cml2aWFsIHJlamVjdCAqLworICAgICAgICAgIGN1cnNvcl9pbl9pbWFnZSA9IEZBTFNFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8qIGZpbmQgaW50ZXJzZWN0IHJlZ2lvbiAqLworCisgICAgICAgICAgc3RhcnR4ID0gKGN4IDwgKGludCkgeGltYWdlc3JjLT5zdGFydHgpID8geGltYWdlc3JjLT5zdGFydHggOiBjeDsKKyAgICAgICAgICBzdGFydHkgPSAoY3kgPCAoaW50KSB4aW1hZ2VzcmMtPnN0YXJ0eSkgPyB4aW1hZ2VzcmMtPnN0YXJ0eSA6IGN5OworICAgICAgICAgIGl3aWR0aCA9IChjeCArIHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlLT53aWR0aCA8IHhpbWFnZXNyYy0+ZW5keCkgPworICAgICAgICAgICAgICBjeCArIHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlLT53aWR0aCAtIHN0YXJ0eCA6CisgICAgICAgICAgICAgIHhpbWFnZXNyYy0+ZW5keCAtIHN0YXJ0eDsKKyAgICAgICAgICBpaGVpZ2h0ID0KKyAgICAgICAgICAgICAgKGN5ICsgeGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPmhlaWdodCA8CisgICAgICAgICAgICAgIHhpbWFnZXNyYy0+ZW5keSkgPyBjeSArIHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlLT5oZWlnaHQgLQorICAgICAgICAgICAgICBzdGFydHkgOiB4aW1hZ2VzcmMtPmVuZHkgLSBzdGFydHk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXJ0eCA9IGN4OworICAgICAgICBzdGFydHkgPSBjeTsKKyAgICAgICAgaXdpZHRoID0geGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPndpZHRoOworICAgICAgICBpaGVpZ2h0ID0geGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPmhlaWdodDsKKyAgICAgIH0KKworICAgICAgaWYgKGN1cnNvcl9pbl9pbWFnZSkgeworICAgICAgICBHU1RfREVCVUdfT0JKRUNUICh4aW1hZ2VzcmMsICJDdXJzb3IgaXMgaW4gaW1hZ2Ugc28gdHJ5aW5nIHRvIGRyYXcgaXQiKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgICAgeGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPnBpeGVsc1tpXSA9CisgICAgICAgICAgICAgIEdVSU5UX1RPX0xFICh4aW1hZ2VzcmMtPmN1cnNvcl9pbWFnZS0+cGl4ZWxzW2ldKTsKKyAgICAgICAgLyogY29weSB0aG9zZSBwaXhlbHMgYWNyb3NzICovCisgICAgICAgIGZvciAoaiA9IHN0YXJ0eTsKKyAgICAgICAgICAgIGogPCBzdGFydHkgKyBpaGVpZ2h0CisgICAgICAgICAgICAmJiBqIDwgeGltYWdlc3JjLT5zdGFydHkgKyB4aW1hZ2VzcmMtPmhlaWdodDsgaisrKSB7CisgICAgICAgICAgZm9yIChpID0gc3RhcnR4OworICAgICAgICAgICAgICBpIDwgc3RhcnR4ICsgaXdpZHRoCisgICAgICAgICAgICAgICYmIGkgPCB4aW1hZ2VzcmMtPnN0YXJ0eCArIHhpbWFnZXNyYy0+d2lkdGg7IGkrKykgeworICAgICAgICAgICAgZ3VpbnQ4ICpzcmMsICpkZXN0OworCisgICAgICAgICAgICBzcmMgPQorICAgICAgICAgICAgICAgIChndWludDggKikgJiAoeGltYWdlc3JjLT5jdXJzb3JfaW1hZ2UtPnBpeGVsc1soKGogLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5KSAqIHhpbWFnZXNyYy0+Y3Vyc29yX2ltYWdlLT53aWR0aCArIChpIC0gY3gpKV0pOworICAgICAgICAgICAgZGVzdCA9CisgICAgICAgICAgICAgICAgKGd1aW50OCAqKSAmIChtZXRhLT54aW1hZ2UtPmRhdGFbKChqIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aW1hZ2VzcmMtPnN0YXJ0eSkgKiB4aW1hZ2VzcmMtPndpZHRoICsgKGkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhpbWFnZXNyYy0+c3RhcnR4KSkgKgorICAgICAgICAgICAgICAgICAgICAoeGltYWdlc3JjLT54Y29udGV4dC0+YnBwIC8gOCldKTsKKworICAgICAgICAgICAgY29tcG9zaXRlX3BpeGVsICh4aW1hZ2VzcmMtPnhjb250ZXh0LCAoZ3VpbnQ4ICopIGRlc3QsCisgICAgICAgICAgICAgICAgKGd1aW50OCAqKSBzcmMpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisjaWZkZWYgSEFWRV9YREFNQUdFCisgIGlmICh4aW1hZ2VzcmMtPmhhdmVfeGRhbWFnZSAmJiB4aW1hZ2VzcmMtPnVzZV9kYW1hZ2UpIHsKKyAgICAvKiBuZWVkIHRvIHJlZiB4aW1hZ2UgdG8gcHV0IGluIGxhc3RfeGltYWdlICovCisgICAgZ3N0X2J1ZmZlcl9yZWYgKHhpbWFnZSk7CisgICAgaWYgKHhpbWFnZXNyYy0+bGFzdF94aW1hZ2UpIHsKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKHhpbWFnZXNyYy0+bGFzdF94aW1hZ2UpOworICAgIH0KKyAgICB4aW1hZ2VzcmMtPmxhc3RfeGltYWdlID0geGltYWdlOworICAgIEdTVF9MT0dfT0JKRUNUICh4aW1hZ2VzcmMsICJyZWZmaW5nIGN1cnJlbnQgYnVmZmVyIGZvciBsYXN0X3hpbWFnZSIpOworICB9CisjZW5kaWYKKyAgcmV0dXJuIHhpbWFnZTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2dzdF94aW1hZ2Vfc3JjX2NyZWF0ZSAoR3N0UHVzaFNyYyAqIGJzLCBHc3RCdWZmZXIgKiogYnVmKQoreworICBHc3RYSW1hZ2VTcmMgKnMgPSBHU1RfWElNQUdFX1NSQyAoYnMpOworICBHc3RCdWZmZXIgKmltYWdlOworICBHc3RDbG9ja1RpbWUgYmFzZV90aW1lOworICBHc3RDbG9ja1RpbWUgbmV4dF9jYXB0dXJlX3RzOworICBHc3RDbG9ja1RpbWUgZHVyOworICBnaW50NjQgbmV4dF9mcmFtZV9ubzsKKworICBpZiAoIWdzdF94aW1hZ2Vfc3JjX3JlY2FsYyAocykpIHsKKyAgICBHU1RfRUxFTUVOVF9FUlJPUiAocywgUkVTT1VSQ0UsIEZBSUxFRCwKKyAgICAgICAgKF8oIkNoYW5naW5nIHJlc29sdXRpb24gYXQgcnVudGltZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4iKSksIChOVUxMKSk7CisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworICB9CisKKyAgaWYgKHMtPmZwc19uIDw9IDAgfHwgcy0+ZnBzX2QgPD0gMCkKKyAgICByZXR1cm4gR1NUX0ZMT1dfTk9UX05FR09USUFURUQ7ICAgICAvKiBGUFMgbXVzdCBiZSA+IDAgKi8KKworICAvKiBOb3csIHdlIG1pZ2h0IG5lZWQgdG8gd2FpdCBmb3IgdGhlIG5leHQgbXVsdGlwbGUgb2YgdGhlIGZwcworICAgKiBiZWZvcmUgY2FwdHVyaW5nICovCisKKyAgR1NUX09CSkVDVF9MT0NLIChzKTsKKyAgaWYgKEdTVF9FTEVNRU5UX0NMT0NLIChzKSA9PSBOVUxMKSB7CisgICAgR1NUX09CSkVDVF9VTkxPQ0sgKHMpOworICAgIEdTVF9FTEVNRU5UX0VSUk9SIChzLCBSRVNPVVJDRSwgRkFJTEVELAorICAgICAgICAoXygiQ2Fubm90IG9wZXJhdGUgd2l0aG91dCBhIGNsb2NrIikpLCAoTlVMTCkpOworICAgIHJldHVybiBHU1RfRkxPV19FUlJPUjsKKyAgfQorCisgIGJhc2VfdGltZSA9IEdTVF9FTEVNRU5UX0NBU1QgKHMpLT5iYXNlX3RpbWU7CisgIG5leHRfY2FwdHVyZV90cyA9IGdzdF9jbG9ja19nZXRfdGltZSAoR1NUX0VMRU1FTlRfQ0xPQ0sgKHMpKTsKKyAgbmV4dF9jYXB0dXJlX3RzIC09IGJhc2VfdGltZTsKKworICAvKiBGaWd1cmUgb3V0IHdoaWNoICdmcmFtZSBudW1iZXInIHBvc2l0aW9uIHdlJ3JlIGF0LCBiYXNlZCBvbiB0aGUgY3VyIHRpbWUKKyAgICogYW5kIGZyYW1lIHJhdGUgKi8KKyAgbmV4dF9mcmFtZV9ubyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAobmV4dF9jYXB0dXJlX3RzLAorICAgICAgcy0+ZnBzX24sIEdTVF9TRUNPTkQgKiBzLT5mcHNfZCk7CisgIGlmIChuZXh0X2ZyYW1lX25vID09IHMtPmxhc3RfZnJhbWVfbm8pIHsKKyAgICBHc3RDbG9ja0lEIGlkOworICAgIEdzdENsb2NrUmV0dXJuIHJldDsKKworICAgIC8qIE5lZWQgdG8gd2FpdCBmb3IgdGhlIG5leHQgZnJhbWUgKi8KKyAgICBuZXh0X2ZyYW1lX25vICs9IDE7CisKKyAgICAvKiBGaWd1cmUgb3V0IHdoYXQgdGhlIG5leHQgZnJhbWUgdGltZSBpcyAqLworICAgIG5leHRfY2FwdHVyZV90cyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAobmV4dF9mcmFtZV9ubywKKyAgICAgICAgcy0+ZnBzX2QgKiBHU1RfU0VDT05ELCBzLT5mcHNfbik7CisKKyAgICBpZCA9IGdzdF9jbG9ja19uZXdfc2luZ2xlX3Nob3RfaWQgKEdTVF9FTEVNRU5UX0NMT0NLIChzKSwKKyAgICAgICAgbmV4dF9jYXB0dXJlX3RzICsgYmFzZV90aW1lKTsKKyAgICBzLT5jbG9ja19pZCA9IGlkOworCisgICAgLyogcmVsZWFzZSB0aGUgb2JqZWN0IGxvY2sgd2hpbGUgd2FpdGluZyAqLworICAgIEdTVF9PQkpFQ1RfVU5MT0NLIChzKTsKKworICAgIEdTVF9ERUJVR19PQkpFQ1QgKHMsICJXYWl0aW5nIGZvciBuZXh0IGZyYW1lIHRpbWUgJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICAgbmV4dF9jYXB0dXJlX3RzKTsKKyAgICByZXQgPSBnc3RfY2xvY2tfaWRfd2FpdCAoaWQsIE5VTEwpOworICAgIEdTVF9PQkpFQ1RfTE9DSyAocyk7CisKKyAgICBnc3RfY2xvY2tfaWRfdW5yZWYgKGlkKTsKKyAgICBzLT5jbG9ja19pZCA9IE5VTEw7CisgICAgaWYgKHJldCA9PSBHU1RfQ0xPQ0tfVU5TQ0hFRFVMRUQpIHsKKyAgICAgIC8qIEdvdCB3b2tlbiB1cCBieSB0aGUgdW5sb2NrIGZ1bmN0aW9uICovCisgICAgICBHU1RfT0JKRUNUX1VOTE9DSyAocyk7CisgICAgICByZXR1cm4gR1NUX0ZMT1dfRkxVU0hJTkc7CisgICAgfQorICAgIC8qIER1cmF0aW9uIGlzIGEgY29tcGxldGUgMS9mcHMgZnJhbWUgZHVyYXRpb24gKi8KKyAgICBkdXIgPSBnc3RfdXRpbF91aW50NjRfc2NhbGVfaW50IChHU1RfU0VDT05ELCBzLT5mcHNfZCwgcy0+ZnBzX24pOworICB9IGVsc2UgeworICAgIEdzdENsb2NrVGltZSBuZXh0X2ZyYW1lX3RzOworCisgICAgR1NUX0RFQlVHX09CSkVDVCAocywgIk5vIG5lZWQgdG8gd2FpdCBmb3IgbmV4dCBmcmFtZSB0aW1lICUiCisgICAgICAgIEdfR1VJTlQ2NF9GT1JNQVQgIiBuZXh0IGZyYW1lID0gJSIgR19HSU5UNjRfRk9STUFUICIgcHJldiA9ICUiCisgICAgICAgIEdfR0lOVDY0X0ZPUk1BVCwgbmV4dF9jYXB0dXJlX3RzLCBuZXh0X2ZyYW1lX25vLCBzLT5sYXN0X2ZyYW1lX25vKTsKKyAgICBuZXh0X2ZyYW1lX3RzID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChuZXh0X2ZyYW1lX25vICsgMSwKKyAgICAgICAgcy0+ZnBzX2QgKiBHU1RfU0VDT05ELCBzLT5mcHNfbik7CisgICAgLyogRnJhbWUgZHVyYXRpb24gaXMgZnJvbSBub3cgdW50aWwgdGhlIG5leHQgZXhwZWN0ZWQgY2FwdHVyZSB0aW1lICovCisgICAgZHVyID0gbmV4dF9mcmFtZV90cyAtIG5leHRfY2FwdHVyZV90czsKKyAgfQorICBzLT5sYXN0X2ZyYW1lX25vID0gbmV4dF9mcmFtZV9ubzsKKyAgR1NUX09CSkVDVF9VTkxPQ0sgKHMpOworCisgIGltYWdlID0gZ3N0X3hpbWFnZV9zcmNfeGltYWdlX2dldCAocyk7CisgIGlmICghaW1hZ2UpCisgICAgcmV0dXJuIEdTVF9GTE9XX0VSUk9SOworCisgICpidWYgPSBpbWFnZTsKKyAgR1NUX0JVRkZFUl9EVFMgKCpidWYpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgR1NUX0JVRkZFUl9QVFMgKCpidWYpID0gbmV4dF9jYXB0dXJlX3RzOworICBHU1RfQlVGRkVSX0RVUkFUSU9OICgqYnVmKSA9IGR1cjsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfeGltYWdlX3NyY19zZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgY29uc3QgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0WEltYWdlU3JjICpzcmMgPSBHU1RfWElNQUdFX1NSQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfRElTUExBWV9OQU1FOgorCisgICAgICBnX2ZyZWUgKHNyYy0+ZGlzcGxheV9uYW1lKTsKKyAgICAgIHNyYy0+ZGlzcGxheV9uYW1lID0gZ19zdHJkdXAgKGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TSE9XX1BPSU5URVI6CisgICAgICBzcmMtPnNob3dfcG9pbnRlciA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VfREFNQUdFOgorICAgICAgc3JjLT51c2VfZGFtYWdlID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUQVJUWDoKKyAgICAgIHNyYy0+c3RhcnR4ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1NUQVJUWToKKyAgICAgIHNyYy0+c3RhcnR5ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0VORFg6CisgICAgICBzcmMtPmVuZHggPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfRU5EWToKKyAgICAgIHNyYy0+ZW5keSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9SRU1PVEU6CisgICAgICBzcmMtPnJlbW90ZSA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4gKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9YSUQ6CisgICAgICBpZiAoc3JjLT54Y29udGV4dCAhPSBOVUxMKSB7CisgICAgICAgIGdfd2FybmluZyAoInhpbWFnZXNyYyB3aW5kb3cgSUQgbXVzdCBiZSBzZXQgYmVmb3JlIG9wZW5pbmcgZGlzcGxheSIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHNyYy0+eGlkID0gZ192YWx1ZV9nZXRfdWludDY0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfWE5BTUU6CisgICAgICBpZiAoc3JjLT54Y29udGV4dCAhPSBOVUxMKSB7CisgICAgICAgIGdfd2FybmluZyAoInhpbWFnZXNyYyB3aW5kb3cgbmFtZSBtdXN0IGJlIHNldCBiZWZvcmUgb3BlbmluZyBkaXNwbGF5Iik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZ19mcmVlIChzcmMtPnhuYW1lKTsKKyAgICAgIHNyYy0+eG5hbWUgPSBnX3N0cmR1cCAoZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfeGltYWdlX3NyY19nZXRfcHJvcGVydHkgKEdPYmplY3QgKiBvYmplY3QsIGd1aW50IHByb3BfaWQsCisgICAgR1ZhbHVlICogdmFsdWUsIEdQYXJhbVNwZWMgKiBwc3BlYykKK3sKKyAgR3N0WEltYWdlU3JjICpzcmMgPSBHU1RfWElNQUdFX1NSQyAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BfaWQpIHsKKyAgICBjYXNlIFBST1BfRElTUExBWV9OQU1FOgorICAgICAgaWYgKHNyYy0+eGNvbnRleHQpCisgICAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIERpc3BsYXlTdHJpbmcgKHNyYy0+eGNvbnRleHQtPmRpc3ApKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc3JjLT5kaXNwbGF5X25hbWUpOworCisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU0hPV19QT0lOVEVSOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNyYy0+c2hvd19wb2ludGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9VU0VfREFNQUdFOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNyYy0+dXNlX2RhbWFnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfU1RBUlRYOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNyYy0+c3RhcnR4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9TVEFSVFk6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc3JjLT5zdGFydHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX0VORFg6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc3JjLT5lbmR4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9FTkRZOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNyYy0+ZW5keSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfUkVNT1RFOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHNyYy0+cmVtb3RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9YSUQ6CisgICAgICBnX3ZhbHVlX3NldF91aW50NjQgKHZhbHVlLCBzcmMtPnhpZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfWE5BTUU6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzcmMtPnhuYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcF9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dzdF94aW1hZ2Vfc3JjX2NsZWFyX2J1ZnBvb2wgKEdzdFhJbWFnZVNyYyAqIHhpbWFnZXNyYykKK3sKKyAgZ19tdXRleF9sb2NrICgmeGltYWdlc3JjLT5wb29sX2xvY2spOworICB3aGlsZSAoeGltYWdlc3JjLT5idWZmZXJfcG9vbCAhPSBOVUxMKSB7CisgICAgR3N0QnVmZmVyICp4aW1hZ2UgPSB4aW1hZ2VzcmMtPmJ1ZmZlcl9wb29sLT5kYXRhOworCisgICAgZ3N0X3hpbWFnZV9idWZmZXJfZnJlZSAoeGltYWdlKTsKKworICAgIHhpbWFnZXNyYy0+YnVmZmVyX3Bvb2wgPSBnX3NsaXN0X2RlbGV0ZV9saW5rICh4aW1hZ2VzcmMtPmJ1ZmZlcl9wb29sLAorICAgICAgICB4aW1hZ2VzcmMtPmJ1ZmZlcl9wb29sKTsKKyAgfQorICBnX211dGV4X3VubG9jayAoJnhpbWFnZXNyYy0+cG9vbF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2dzdF94aW1hZ2Vfc3JjX2Rpc3Bvc2UgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIC8qIERyb3AgcmVmZXJlbmNlcyBpbiB0aGUgYnVmZmVyX3Bvb2wgKi8KKyAgZ3N0X3hpbWFnZV9zcmNfY2xlYXJfYnVmcG9vbCAoR1NUX1hJTUFHRV9TUkMgKG9iamVjdCkpOworCisgIEdfT0JKRUNUX0NMQVNTIChwYXJlbnRfY2xhc3MpLT5kaXNwb3NlIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X3hpbWFnZV9zcmNfZmluYWxpemUgKEdPYmplY3QgKiBvYmplY3QpCit7CisgIEdzdFhJbWFnZVNyYyAqc3JjID0gR1NUX1hJTUFHRV9TUkMgKG9iamVjdCk7CisKKyAgaWYgKHNyYy0+eGNvbnRleHQpCisgICAgeGltYWdldXRpbF94Y29udGV4dF9jbGVhciAoc3JjLT54Y29udGV4dCk7CisKKyAgZ19mcmVlIChzcmMtPnhuYW1lKTsKKyAgZ19tdXRleF9jbGVhciAoJnNyYy0+cG9vbF9sb2NrKTsKKyAgZ19tdXRleF9jbGVhciAoJnNyYy0+eF9sb2NrKTsKKworICBHX09CSkVDVF9DTEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2dzdF94aW1hZ2Vfc3JjX2dldF9jYXBzIChHc3RCYXNlU3JjICogYnMsIEdzdENhcHMgKiBmaWx0ZXIpCit7CisgIEdzdFhJbWFnZVNyYyAqcyA9IEdTVF9YSU1BR0VfU1JDIChicyk7CisgIEdzdFhDb250ZXh0ICp4Y29udGV4dDsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBHc3RWaWRlb0Zvcm1hdCBmb3JtYXQ7CisgIGd1aW50MzIgYWxwaGFfbWFzazsKKworICBpZiAoKCFzLT54Y29udGV4dCkgJiYgKCFnc3RfeGltYWdlX3NyY19vcGVuX2Rpc3BsYXkgKHMsIHMtPmRpc3BsYXlfbmFtZSkpKQorICAgIHJldHVybiBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoR1NUX0JBU0VfU1JDIChzKS0+c3JjcGFkKTsKKworICBpZiAoIWdzdF94aW1hZ2Vfc3JjX3JlY2FsYyAocykpCisgICAgcmV0dXJuIGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChHU1RfQkFTRV9TUkMgKHMpLT5zcmNwYWQpOworCisgIHhjb250ZXh0ID0gcy0+eGNvbnRleHQ7CisgIHdpZHRoID0gcy0+eGNvbnRleHQtPndpZHRoOworICBoZWlnaHQgPSBzLT54Y29udGV4dC0+aGVpZ2h0OworICBpZiAocy0+eHdpbmRvdyAhPSAwKSB7CisgICAgWFdpbmRvd0F0dHJpYnV0ZXMgYXR0cnM7CisgICAgaW50IHN0YXR1cyA9IFhHZXRXaW5kb3dBdHRyaWJ1dGVzIChzLT54Y29udGV4dC0+ZGlzcCwgcy0+eHdpbmRvdywgJmF0dHJzKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICB3aWR0aCA9IGF0dHJzLndpZHRoOworICAgICAgaGVpZ2h0ID0gYXR0cnMuaGVpZ2h0OworICAgIH0KKyAgfQorCisgIC8qIHByb3BlcnR5IGNvbW1lbnRzIHNheSAwIG1lYW5zIHJpZ2h0L2JvdHRvbSwgbWVhbnMgd2UgY2FuJ3QgY2FwdHVyZQorICAgICB0aGUgdG9wIGxlZnQgcGl4ZWwgYWxvbmUgKi8KKyAgaWYgKHMtPmVuZHggPT0gMCkKKyAgICBzLT5lbmR4ID0gd2lkdGggLSAxOworICBpZiAocy0+ZW5keSA9PSAwKQorICAgIHMtPmVuZHkgPSBoZWlnaHQgLSAxOworCisgIGlmIChzLT5lbmR4ID49IHMtPnN0YXJ0eCAmJiBzLT5lbmR5ID49IHMtPnN0YXJ0eSkgeworICAgIC8qIHRoaXMgbWVhbnMgdXNlciBoYXMgcHV0IGluIHZhbHVlcyAqLworICAgIGlmIChzLT5zdGFydHggPCB4Y29udGV4dC0+d2lkdGggJiYgcy0+ZW5keCA8IHhjb250ZXh0LT53aWR0aCAmJgorICAgICAgICBzLT5zdGFydHkgPCB4Y29udGV4dC0+aGVpZ2h0ICYmIHMtPmVuZHkgPCB4Y29udGV4dC0+aGVpZ2h0KSB7CisgICAgICAvKiB2YWx1ZXMgYXJlIGZpbmUgKi8KKyAgICAgIHMtPndpZHRoID0gd2lkdGggPSBzLT5lbmR4IC0gcy0+c3RhcnR4ICsgMTsKKyAgICAgIHMtPmhlaWdodCA9IGhlaWdodCA9IHMtPmVuZHkgLSBzLT5zdGFydHkgKyAxOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklORworICAgICAgICAgICgiVXNlciBwdXQgaW4gY28tb3JkaW5hdGVzIG92ZXJzaG9vdGluZyB0aGUgWCByZXNvbHV0aW9uLCBzZXR0aW5nIHRvIGZ1bGwgc2NyZWVuIik7CisgICAgICBzLT5zdGFydHggPSAwOworICAgICAgcy0+c3RhcnR5ID0gMDsKKyAgICAgIHMtPmVuZHggPSB3aWR0aCAtIDE7CisgICAgICBzLT5lbmR5ID0gaGVpZ2h0IC0gMTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgR1NUX1dBUk5JTkcgKCJVc2VyIHB1dCBpbiBib2d1cyBjby1vcmRpbmF0ZXMsIHNldHRpbmcgdG8gZnVsbCBzY3JlZW4iKTsKKyAgICBzLT5zdGFydHggPSAwOworICAgIHMtPnN0YXJ0eSA9IDA7CisgICAgcy0+ZW5keCA9IHdpZHRoIC0gMTsKKyAgICBzLT5lbmR5ID0gaGVpZ2h0IC0gMTsKKyAgfQorICBHU1RfREVCVUcgKCJ3aWR0aCA9ICVkLCBoZWlnaHQ9JWQiLCB3aWR0aCwgaGVpZ2h0KTsKKworICAvKiBleHRyYXBvbGF0ZSBhbHBoYSBtYXNrICovCisgIGlmICh4Y29udGV4dC0+ZGVwdGggPT0gMzIpIHsKKyAgICBhbHBoYV9tYXNrID0gfih4Y29udGV4dC0+cl9tYXNrX291dHB1dAorICAgICAgICB8IHhjb250ZXh0LT5nX21hc2tfb3V0cHV0IHwgeGNvbnRleHQtPmJfbWFza19vdXRwdXQpOworICB9IGVsc2UgeworICAgIGFscGhhX21hc2sgPSAwOworICB9CisKKyAgZm9ybWF0ID0KKyAgICAgIGdzdF92aWRlb19mb3JtYXRfZnJvbV9tYXNrcyAoeGNvbnRleHQtPmRlcHRoLCB4Y29udGV4dC0+YnBwLAorICAgICAgeGNvbnRleHQtPmVuZGlhbm5lc3MsIHhjb250ZXh0LT5yX21hc2tfb3V0cHV0LAorICAgICAgeGNvbnRleHQtPmdfbWFza19vdXRwdXQsIHhjb250ZXh0LT5iX21hc2tfb3V0cHV0LCBhbHBoYV9tYXNrKTsKKworICByZXR1cm4gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcmF3IiwKKyAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBnc3RfdmlkZW9fZm9ybWF0X3RvX3N0cmluZyAoZm9ybWF0KSwKKyAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHdpZHRoLAorICAgICAgImhlaWdodCIsIEdfVFlQRV9JTlQsIGhlaWdodCwKKyAgICAgICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTl9SQU5HRSwgMSwgR19NQVhJTlQsIEdfTUFYSU5ULCAxLAorICAgICAgInBpeGVsLWFzcGVjdC1yYXRpbyIsIEdTVF9UWVBFX0ZSQUNUSU9OLCB4Y29udGV4dC0+cGFyX24sCisgICAgICB4Y29udGV4dC0+cGFyX2QsIE5VTEwpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2dzdF94aW1hZ2Vfc3JjX3NldF9jYXBzIChHc3RCYXNlU3JjICogYnMsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RYSW1hZ2VTcmMgKnMgPSBHU1RfWElNQUdFX1NSQyAoYnMpOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgY29uc3QgR1ZhbHVlICpuZXdfZnBzOworCisgIC8qIElmIG5vdCB5ZXQgb3BlbmVkLCBkaXNhbGxvdyBzZXRjYXBzIHVudGlsIGxhdGVyICovCisgIGlmICghcy0+eGNvbnRleHQpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIFRoZSBvbmx5IHRoaW5nIHRoYXQgY2FuIGNoYW5nZSBpcyB0aGUgZnJhbWVyYXRlIGRvd25zdHJlYW0gd2FudHMgKi8KKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIG5ld19mcHMgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAiZnJhbWVyYXRlIik7CisgIGlmICghbmV3X2ZwcykKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogU3RvcmUgdGhpcyBGUFMgZm9yIHVzZSB3aGVuIGdlbmVyYXRpbmcgYnVmZmVycyAqLworICBzLT5mcHNfbiA9IGdzdF92YWx1ZV9nZXRfZnJhY3Rpb25fbnVtZXJhdG9yIChuZXdfZnBzKTsKKyAgcy0+ZnBzX2QgPSBnc3RfdmFsdWVfZ2V0X2ZyYWN0aW9uX2Rlbm9taW5hdG9yIChuZXdfZnBzKTsKKworICBHU1RfREVCVUdfT0JKRUNUIChzLCAicGVlciB3YW50cyAlZC8lZCBmcHMiLCBzLT5mcHNfbiwgcy0+ZnBzX2QpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0Q2FwcyAqCitnc3RfeGltYWdlX3NyY19maXhhdGUgKEdzdEJhc2VTcmMgKiBic3JjLCBHc3RDYXBzICogY2FwcykKK3sKKyAgZ2ludCBpOworICBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKworICBjYXBzID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoY2Fwcyk7CisKKyAgZm9yIChpID0gMDsgaSA8IGdzdF9jYXBzX2dldF9zaXplIChjYXBzKTsgKytpKSB7CisgICAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgaSk7CisKKyAgICBnc3Rfc3RydWN0dXJlX2ZpeGF0ZV9maWVsZF9uZWFyZXN0X2ZyYWN0aW9uIChzdHJ1Y3R1cmUsICJmcmFtZXJhdGUiLCAyNSwgMSk7CisgIH0KKyAgY2FwcyA9IEdTVF9CQVNFX1NSQ19DTEFTUyAocGFyZW50X2NsYXNzKS0+Zml4YXRlIChic3JjLCBjYXBzKTsKKworICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIHZvaWQKK2dzdF94aW1hZ2Vfc3JjX2NsYXNzX2luaXQgKEdzdFhJbWFnZVNyY0NsYXNzICoga2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ2MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBHc3RFbGVtZW50Q2xhc3MgKmVjID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgR3N0QmFzZVNyY0NsYXNzICpiYyA9IEdTVF9CQVNFX1NSQ19DTEFTUyAoa2xhc3MpOworICBHc3RQdXNoU3JjQ2xhc3MgKnB1c2hfY2xhc3MgPSBHU1RfUFVTSF9TUkNfQ0xBU1MgKGtsYXNzKTsKKworICBnYy0+c2V0X3Byb3BlcnR5ID0gZ3N0X3hpbWFnZV9zcmNfc2V0X3Byb3BlcnR5OworICBnYy0+Z2V0X3Byb3BlcnR5ID0gZ3N0X3hpbWFnZV9zcmNfZ2V0X3Byb3BlcnR5OworICBnYy0+ZGlzcG9zZSA9IGdzdF94aW1hZ2Vfc3JjX2Rpc3Bvc2U7CisgIGdjLT5maW5hbGl6ZSA9IGdzdF94aW1hZ2Vfc3JjX2ZpbmFsaXplOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdjLCBQUk9QX0RJU1BMQVlfTkFNRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJkaXNwbGF5LW5hbWUiLCAiRGlzcGxheSIsICJYIERpc3BsYXkgTmFtZSIsCisgICAgICAgICAgTlVMTCwgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdjLCBQUk9QX1NIT1dfUE9JTlRFUiwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgic2hvdy1wb2ludGVyIiwgIlNob3cgTW91c2UgUG9pbnRlciIsCisgICAgICAgICAgIlNob3cgbW91c2UgcG9pbnRlciAoaWYgWEZpeGVzIGV4dGVuc2lvbiBlbmFibGVkKSIsIFRSVUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RYSW1hZ2VTcmM6dXNlLWRhbWFnZToKKyAgICoKKyAgICogVXNlIFhEYW1hZ2UgKGlmIHRoZSBYRGFtYWdlIGV4dGVuc2lvbiBpcyBlbmFibGVkKQorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ2MsIFBST1BfVVNFX0RBTUFHRSwKKyAgICAgIGdfcGFyYW1fc3BlY19ib29sZWFuICgidXNlLWRhbWFnZSIsICJVc2UgWERhbWFnZSIsCisgICAgICAgICAgIlVzZSBYRGFtYWdlIChpZiBYRGFtYWdlIGV4dGVuc2lvbiBlbmFibGVkKSIsIFRSVUUsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisgIC8qKgorICAgKiBHc3RYSW1hZ2VTcmM6c3RhcnR4OgorICAgKgorICAgKiBYIGNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIGFyZWEgdG8gYmUgcmVjb3JkZWQKKyAgICogKDAgZm9yIHRvcCBsZWZ0IG9mIHNjcmVlbikKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdjLCBQUk9QX1NUQVJUWCwKKyAgICAgIGdfcGFyYW1fc3BlY191aW50ICgic3RhcnR4IiwgIlN0YXJ0IFggY28tb3JkaW5hdGUiLAorICAgICAgICAgICJYIGNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIGFyZWEgdG8gYmUgcmVjb3JkZWQgKDAgZm9yIHRvcCBsZWZ0IG9mIHNjcmVlbikiLAorICAgICAgICAgIDAsIEdfTUFYSU5ULCAwLCBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgLyoqCisgICAqIEdzdFhJbWFnZVNyYzpzdGFydHk6CisgICAqCisgICAqIFkgY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgYXJlYSB0byBiZSByZWNvcmRlZAorICAgKiAoMCBmb3IgdG9wIGxlZnQgb2Ygc2NyZWVuKQorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ2MsIFBST1BfU1RBUlRZLAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQgKCJzdGFydHkiLCAiU3RhcnQgWSBjby1vcmRpbmF0ZSIsCisgICAgICAgICAgIlkgY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgYXJlYSB0byBiZSByZWNvcmRlZCAoMCBmb3IgdG9wIGxlZnQgb2Ygc2NyZWVuKSIsCisgICAgICAgICAgMCwgR19NQVhJTlQsIDAsIEdfUEFSQU1fUkVBRFdSSVRFKSk7CisgIC8qKgorICAgKiBHc3RYSW1hZ2VTcmM6ZW5keDoKKyAgICoKKyAgICogWCBjb29yZGluYXRlIG9mIGJvdHRvbSByaWdodCBjb3JuZXIgb2YgYXJlYSB0byBiZSByZWNvcmRlZAorICAgKiAoMCBmb3IgYm90dG9tIHJpZ2h0IG9mIHNjcmVlbikKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdjLCBQUk9QX0VORFgsCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoImVuZHgiLCAiRW5kIFgiLAorICAgICAgICAgICJYIGNvb3JkaW5hdGUgb2YgYm90dG9tIHJpZ2h0IGNvcm5lciBvZiBhcmVhIHRvIGJlIHJlY29yZGVkICgwIGZvciBib3R0b20gcmlnaHQgb2Ygc2NyZWVuKSIsCisgICAgICAgICAgMCwgR19NQVhJTlQsIDAsIEdfUEFSQU1fUkVBRFdSSVRFKSk7CisgIC8qKgorICAgKiBHc3RYSW1hZ2VTcmM6ZW5keToKKyAgICoKKyAgICogWSBjb29yZGluYXRlIG9mIGJvdHRvbSByaWdodCBjb3JuZXIgb2YgYXJlYSB0byBiZSByZWNvcmRlZAorICAgKiAoMCBmb3IgYm90dG9tIHJpZ2h0IG9mIHNjcmVlbikKKyAgICovCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdjLCBQUk9QX0VORFksCisgICAgICBnX3BhcmFtX3NwZWNfdWludCAoImVuZHkiLCAiRW5kIFkiLAorICAgICAgICAgICJZIGNvb3JkaW5hdGUgb2YgYm90dG9tIHJpZ2h0IGNvcm5lciBvZiBhcmVhIHRvIGJlIHJlY29yZGVkICgwIGZvciBib3R0b20gcmlnaHQgb2Ygc2NyZWVuKSIsCisgICAgICAgICAgMCwgR19NQVhJTlQsIDAsIEdfUEFSQU1fUkVBRFdSSVRFKSk7CisKKyAgLyoqCisgICAqIEdzdFhJbWFnZVNyYzpyZW1vdGU6CisgICAqCisgICAqIFdoZXRoZXIgdGhlIFggZGlzcGxheSBpcyByZW1vdGUuIFRoZSBlbGVtZW50IHdpbGwgdHJ5IHRvIHVzZSBhbHRlcm5hdGUgY2FsbHMKKyAgICoga25vd24gdG8gd29yayBiZXR0ZXIgd2l0aCByZW1vdGUgZGlzcGxheXMuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnYywgUFJPUF9SRU1PVEUsCisgICAgICBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInJlbW90ZSIsICJSZW1vdGUgZGlzcGF5IiwKKyAgICAgICAgICAiV2hldGhlciB0aGUgZGlzcGxheSBpcyByZW1vdGUiLCBGQUxTRSwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgLyoqCisgICAqIEdzdFhJbWFnZVNyYzp4aWQ6CisgICAqCisgICAqIFRoZSBYSUQgb2YgdGhlIHdpbmRvdyB0byBjYXB0dXJlLiAwIGZvciB0aGUgcm9vdCB3aW5kb3cgKGRlZmF1bHQpLgorICAgKi8KKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ2MsIFBST1BfWElELAorICAgICAgZ19wYXJhbV9zcGVjX3VpbnQ2NCAoInhpZCIsICJXaW5kb3cgWElEIiwKKyAgICAgICAgICAiV2luZG93IFhJRCB0byBjYXB0dXJlIGZyb20iLCAwLCBHX01BWFVJTlQ2NCwgMCwKKyAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fU1RBVElDX1NUUklOR1MpKTsKKyAgLyoqCisgICAqIEdzdFhJbWFnZVNyYzp4bmFtZToKKyAgICoKKyAgICogVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB0byBjYXB0dXJlLCBpZiBhbnkuCisgICAqLworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnYywgUFJPUF9YTkFNRSwKKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJ4bmFtZSIsICJXaW5kb3cgbmFtZSIsCisgICAgICAgICAgIldpbmRvdyBuYW1lIHRvIGNhcHR1cmUgZnJvbSIsIE5VTEwsCisgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX1NUQVRJQ19TVFJJTkdTKSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X3N0YXRpY19tZXRhZGF0YSAoZWMsICJYaW1hZ2UgdmlkZW8gc291cmNlIiwKKyAgICAgICJTb3VyY2UvVmlkZW8iLAorICAgICAgIkNyZWF0ZXMgYSBzY3JlZW5zaG90IHZpZGVvIHN0cmVhbSIsCisgICAgICAiTHV0eiBNdWVsbGVyIDxsdXR6QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4sICIKKyAgICAgICJKYW4gU2NobWlkdCA8dGhheXRhbkBtYWQuc2NpZW50aXN0LmNvbT4sICIKKyAgICAgICJaYWhlZXIgTWVyYWxpIDx6YWhlZXJhYmJhcyBhdCBtZXJhbGkgZG90IG9yZz4iKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGVjLCAmdCk7CisKKyAgYmMtPmZpeGF0ZSA9IGdzdF94aW1hZ2Vfc3JjX2ZpeGF0ZTsKKyAgYmMtPmdldF9jYXBzID0gZ3N0X3hpbWFnZV9zcmNfZ2V0X2NhcHM7CisgIGJjLT5zZXRfY2FwcyA9IGdzdF94aW1hZ2Vfc3JjX3NldF9jYXBzOworICBiYy0+c3RhcnQgPSBnc3RfeGltYWdlX3NyY19zdGFydDsKKyAgYmMtPnN0b3AgPSBnc3RfeGltYWdlX3NyY19zdG9wOworICBiYy0+dW5sb2NrID0gZ3N0X3hpbWFnZV9zcmNfdW5sb2NrOworICBwdXNoX2NsYXNzLT5jcmVhdGUgPSBnc3RfeGltYWdlX3NyY19jcmVhdGU7Cit9CisKK3N0YXRpYyB2b2lkCitnc3RfeGltYWdlX3NyY19pbml0IChHc3RYSW1hZ2VTcmMgKiB4aW1hZ2VzcmMpCit7CisgIGdzdF9iYXNlX3NyY19zZXRfZm9ybWF0IChHU1RfQkFTRV9TUkMgKHhpbWFnZXNyYyksIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9iYXNlX3NyY19zZXRfbGl2ZSAoR1NUX0JBU0VfU1JDICh4aW1hZ2VzcmMpLCBUUlVFKTsKKworICBnX211dGV4X2luaXQgKCZ4aW1hZ2VzcmMtPnBvb2xfbG9jayk7CisgIGdfbXV0ZXhfaW5pdCAoJnhpbWFnZXNyYy0+eF9sb2NrKTsKKyAgeGltYWdlc3JjLT5zaG93X3BvaW50ZXIgPSBUUlVFOworICB4aW1hZ2VzcmMtPnVzZV9kYW1hZ2UgPSBUUlVFOworICB4aW1hZ2VzcmMtPnN0YXJ0eCA9IDA7CisgIHhpbWFnZXNyYy0+c3RhcnR5ID0gMDsKKyAgeGltYWdlc3JjLT5lbmR4ID0gMDsKKyAgeGltYWdlc3JjLT5lbmR5ID0gMDsKKyAgeGltYWdlc3JjLT5yZW1vdGUgPSBGQUxTRTsKK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBnYm9vbGVhbiByZXQ7CisKKyAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQgKGdzdF9kZWJ1Z194aW1hZ2Vfc3JjLCAieGltYWdlc3JjIiwgMCwKKyAgICAgICJ4aW1hZ2VzcmMgZWxlbWVudCBkZWJ1ZyIpOworCisgIHJldCA9IGdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJ4aW1hZ2VzcmMiLCBHU1RfUkFOS19OT05FLAorICAgICAgR1NUX1RZUEVfWElNQUdFX1NSQyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworR1NUX1BMVUdJTl9ERUZJTkUgKEdTVF9WRVJTSU9OX01BSk9SLAorICAgIEdTVF9WRVJTSU9OX01JTk9SLAorICAgIHhpbWFnZXNyYywKKyAgICAiWDExIHZpZGVvIGlucHV0IHBsdWdpbiB1c2luZyBzdGFuZGFyZCBYbGliIGNhbGxzIiwKKyAgICBwbHVnaW5faW5pdCwgVkVSU0lPTiwgR1NUX0xJQ0VOU0UsIEdTVF9QQUNLQUdFX05BTUUsIEdTVF9QQUNLQUdFX09SSUdJTik7CmRpZmYgLS1naXQgYS9zeXMveGltYWdlL2dzdHhpbWFnZXNyYy5oIGIvc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDM0NDdhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3hpbWFnZS9nc3R4aW1hZ2VzcmMuaApAQCAtMCwwICsxLDExNCBAQAorLyogc2NyZWVuc2hvdHNyYzogU2NyZWVuc2hvdCBwbHVnaW4gZm9yIEdTdHJlYW1lcgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1hJTUFHRV9TUkNfSF9fCisjZGVmaW5lIF9fR1NUX1hJTUFHRV9TUkNfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0cHVzaHNyYy5oPgorI2luY2x1ZGUgInhpbWFnZXV0aWwuaCIKKworI2lmZGVmIEhBVkVfWEZJWEVTCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWGZpeGVzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1hEQU1BR0UKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YZGFtYWdlLmg+CisjZW5kaWYKKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIEdTVF9UWVBFX1hJTUFHRV9TUkMgKGdzdF94aW1hZ2Vfc3JjX2dldF90eXBlKCkpCisjZGVmaW5lIEdTVF9YSU1BR0VfU1JDKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX1hJTUFHRV9TUkMsR3N0WEltYWdlU3JjKSkKKyNkZWZpbmUgR1NUX1hJTUFHRV9TUkNfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX1hJTUFHRV9TUkMsR3N0WEltYWdlU3JjKSkKKyNkZWZpbmUgR1NUX0lTX1hJTUFHRV9TUkMob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksR1NUX1RZUEVfWElNQUdFX1NSQykpCisjZGVmaW5lIEdTVF9JU19YSU1BR0VfU1JDX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9YSU1BR0VfU1JDKSkKKwordHlwZWRlZiBzdHJ1Y3QgX0dzdFhJbWFnZVNyYyBHc3RYSW1hZ2VTcmM7Cit0eXBlZGVmIHN0cnVjdCBfR3N0WEltYWdlU3JjQ2xhc3MgR3N0WEltYWdlU3JjQ2xhc3M7CisKK0dUeXBlIGdzdF94aW1hZ2Vfc3JjX2dldF90eXBlICh2b2lkKSBHX0dOVUNfQ09OU1Q7CisKK3N0cnVjdCBfR3N0WEltYWdlU3JjCit7CisgIEdzdFB1c2hTcmMgcGFyZW50OworCisgIC8qIEluZm9ybWF0aW9uIG9uIGRpc3BsYXkgKi8KKyAgR3N0WENvbnRleHQgKnhjb250ZXh0OworICBnaW50IHg7CisgIGdpbnQgeTsKKyAgZ2ludCB3aWR0aDsKKyAgZ2ludCBoZWlnaHQ7CisKKyAgV2luZG93IHh3aW5kb3c7CisgIGdjaGFyICpkaXNwbGF5X25hbWU7CisKKyAgLyogV2luZG93IHNlbGVjdGlvbiAqLworICBndWludDY0IHhpZDsKKyAgZ2NoYXIgKnhuYW1lOworCisgIC8qIERlc2lyZWQgb3V0cHV0IGZyYW1lcmF0ZSAqLworICBnaW50IGZwc19uOworICBnaW50IGZwc19kOworCisgIC8qIGZvciBmcmFtZXJhdGUgc3luYyAqLworICBHc3RDbG9ja0lEIGNsb2NrX2lkOworICBnaW50NjQgbGFzdF9mcmFtZV9ubzsKKworICAvKiBQcm90ZWN0IFggV2luZG93cyBjYWxscyAqLworICBHTXV0ZXggIHhfbG9jazsKKworICAvKiBHYXRoZXJlZCBwb29sIG9mIGVtaXR0ZWQgYnVmZmVycyAqLworICBHTXV0ZXggIHBvb2xfbG9jazsKKyAgR1NMaXN0ICpidWZmZXJfcG9vbDsKKworICAvKiBYRml4ZXMgYW5kIFhEYW1hZ2Ugc3VwcG9ydCAqLworICBnYm9vbGVhbiBoYXZlX3hmaXhlczsKKyAgZ2Jvb2xlYW4gaGF2ZV94ZGFtYWdlOworICBnYm9vbGVhbiBzaG93X3BvaW50ZXI7CisgIGdib29sZWFuIHVzZV9kYW1hZ2U7CisKKyAgLyogY28tb3JkaW5hdGVzIGZvciBzdGFydCBhbmQgZW5kICovCisgIGd1aW50IHN0YXJ0eDsKKyAgZ3VpbnQgc3RhcnR5OworICBndWludCBlbmR4OworICBndWludCBlbmR5OworCisgIC8qIHdoZXRoZXIgdG8gdXNlIHJlbW90ZSBmcmllbmRseSBjYWxscyAqLworICBnYm9vbGVhbiByZW1vdGU7CisKKyNpZmRlZiBIQVZFX1hGSVhFUworICBpbnQgZml4ZXNfZXZlbnRfYmFzZTsKKyAgWEZpeGVzQ3Vyc29ySW1hZ2UgKmN1cnNvcl9pbWFnZTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfWERBTUFHRQorICBEYW1hZ2UgZGFtYWdlOworICBpbnQgZGFtYWdlX2V2ZW50X2Jhc2U7CisgIFhzZXJ2ZXJSZWdpb24gZGFtYWdlX3JlZ2lvbjsKKyAgR0MgZGFtYWdlX2NvcHlfZ2M7CisgIEdzdEJ1ZmZlciAqbGFzdF94aW1hZ2U7CisjZW5kaWYKK307CisKK3N0cnVjdCBfR3N0WEltYWdlU3JjQ2xhc3MKK3sKKyAgR3N0UHVzaFNyY0NsYXNzIHBhcmVudF9jbGFzczsKK307CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfX0dTVF9YSU1BR0VfU1JDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzL3hpbWFnZS9tZXNvbi5idWlsZCBiL3N5cy94aW1hZ2UvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZlYzIxZQotLS0gL2Rldi9udWxsCisrKyBiL3N5cy94aW1hZ2UvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwzMCBAQAoreDExX2RlcCA9IGRlcGVuZGVuY3koJ3gxMScsIHJlcXVpcmVkIDogZmFsc2UpCisKK2lmIHgxMV9kZXAuZm91bmQoKQorICB4X2FyZ3MgPSBbXQorICAjIEZJWE1FOiBOZWVkIHRvIGNoZWNrIGZvciBYU2htQXR0YWNoIGluc2lkZSBsaWJYZXh0CisgIHhzaG1fZGVwID0gZGVwZW5kZW5jeSgneGV4dCcsIHJlcXVpcmVkIDogZmFsc2UpCisgIGlmIHhzaG1fZGVwLmZvdW5kKCkKKyAgICB4X2FyZ3MgKz0gWyctREhBVkVfWFNITSddCisgIGVuZGlmCisKKyAgeGZpeGVzX2RlcCA9IGRlcGVuZGVuY3koJ3hmaXhlcycsIHJlcXVpcmVkIDogZmFsc2UpCisgIGlmIHhmaXhlc19kZXAuZm91bmQoKQorICAgIHhfYXJncyArPSBbJy1ESEFWRV9YRklYRVMnXQorICBlbmRpZgorCisgIHhkYW1hZ2VfZGVwID0gZGVwZW5kZW5jeSgneGRhbWFnZScsIHJlcXVpcmVkIDogZmFsc2UpCisgIGlmIHhkYW1hZ2VfZGVwLmZvdW5kKCkKKyAgICB4X2FyZ3MgKz0gWyctREhBVkVfWERBTUFHRSddCisgIGVuZGlmCisKKyAgZ3N0eGltYWdlc3JjID0gbGlicmFyeSgnZ3N0eGltYWdlc3JjJywKKyAgICAnZ3N0eGltYWdlc3JjLmMnLCAneGltYWdldXRpbC5jJywKKyAgICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MgKyB4X2FyZ3MsCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmMsIGxpYnNpbmNdLAorICAgIGRlcGVuZGVuY2llcyA6IFtnc3RiYXNlX2RlcCwgZ3N0dmlkZW9fZGVwLCB4MTFfZGVwLAorICAgICAgICAgICAgICAgICAgICB4c2htX2RlcCwgeGZpeGVzX2RlcCwgeGRhbWFnZV9kZXBdLAorICAgIGluc3RhbGwgOiB0cnVlLAorICAgIGluc3RhbGxfZGlyIDogcGx1Z2luc19pbnN0YWxsX2RpciwKKyAgKQorZW5kaWYKZGlmZiAtLWdpdCBhL3N5cy94aW1hZ2UveGltYWdldXRpbC5jIGIvc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjOTM5MgotLS0gL2Rldi9udWxsCisrKyBiL3N5cy94aW1hZ2UveGltYWdldXRpbC5jCkBAIC0wLDAgKzEsNTAwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IEx1Y2EgT2duaWJlbmUgPGx1b2duaUB0aW4uaXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAieGltYWdldXRpbC5oIgorCitHVHlwZQorZ3N0X21ldGFfeGltYWdlX2FwaV9nZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIHZvbGF0aWxlIEdUeXBlIHR5cGU7CisgIHN0YXRpYyBjb25zdCBnY2hhciAqdGFnc1tdID0geyAibWVtb3J5IiwgTlVMTCB9OworCisgIGlmIChnX29uY2VfaW5pdF9lbnRlciAoJnR5cGUpKSB7CisgICAgR1R5cGUgX3R5cGUgPSBnc3RfbWV0YV9hcGlfdHlwZV9yZWdpc3RlciAoIkdzdE1ldGFYSW1hZ2VTcmNBUEkiLCB0YWdzKTsKKyAgICBnX29uY2VfaW5pdF9sZWF2ZSAoJnR5cGUsIF90eXBlKTsKKyAgfQorICByZXR1cm4gdHlwZTsKK30KKworc3RhdGljIGdib29sZWFuCitnc3RfbWV0YV94aW1hZ2VfaW5pdCAoR3N0TWV0YSAqIG1ldGEsIGdwb2ludGVyIHBhcmFtcywgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RNZXRhWEltYWdlICplbWV0YSA9IChHc3RNZXRhWEltYWdlICopIG1ldGE7CisKKyAgZW1ldGEtPnBhcmVudCA9IE5VTEw7CisgIGVtZXRhLT54aW1hZ2UgPSBOVUxMOworI2lmZGVmIEhBVkVfWFNITQorICBlbWV0YS0+U0hNSW5mby5zaG1hZGRyID0gKCh2b2lkICopIC0xKTsKKyAgZW1ldGEtPlNITUluZm8uc2htaWQgPSAtMTsKKyAgZW1ldGEtPlNITUluZm8ucmVhZE9ubHkgPSBUUlVFOworI2VuZGlmCisgIGVtZXRhLT53aWR0aCA9IGVtZXRhLT5oZWlnaHQgPSBlbWV0YS0+c2l6ZSA9IDA7CisgIGVtZXRhLT5yZXR1cm5fZnVuYyA9IE5VTEw7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2NvbnN0IEdzdE1ldGFJbmZvICoKK2dzdF9tZXRhX3hpbWFnZV9nZXRfaW5mbyAodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IEdzdE1ldGFJbmZvICptZXRhX3hpbWFnZV9pbmZvID0gTlVMTDsKKworICBpZiAoZ19vbmNlX2luaXRfZW50ZXIgKCZtZXRhX3hpbWFnZV9pbmZvKSkgeworICAgIGNvbnN0IEdzdE1ldGFJbmZvICptZXRhID0KKyAgICAgICAgZ3N0X21ldGFfcmVnaXN0ZXIgKGdzdF9tZXRhX3hpbWFnZV9hcGlfZ2V0X3R5cGUgKCksICJHc3RNZXRhWEltYWdlU3JjIiwKKyAgICAgICAgc2l6ZW9mIChHc3RNZXRhWEltYWdlKSwgKEdzdE1ldGFJbml0RnVuY3Rpb24pIGdzdF9tZXRhX3hpbWFnZV9pbml0LAorICAgICAgICAoR3N0TWV0YUZyZWVGdW5jdGlvbikgTlVMTCwgKEdzdE1ldGFUcmFuc2Zvcm1GdW5jdGlvbikgTlVMTCk7CisgICAgZ19vbmNlX2luaXRfbGVhdmUgKCZtZXRhX3hpbWFnZV9pbmZvLCBtZXRhKTsKKyAgfQorICByZXR1cm4gbWV0YV94aW1hZ2VfaW5mbzsKK30KKworI2lmZGVmIEhBVkVfWFNITQorc3RhdGljIGdib29sZWFuIGVycm9yX2NhdWdodCA9IEZBTFNFOworCitzdGF0aWMgaW50Cit4aW1hZ2V1dGlsX2hhbmRsZV94ZXJyb3IgKERpc3BsYXkgKiBkaXNwbGF5LCBYRXJyb3JFdmVudCAqIHhldmVudCkKK3sKKyAgY2hhciBlcnJvcl9tc2dbMTAyNF07CisKKyAgWEdldEVycm9yVGV4dCAoZGlzcGxheSwgeGV2ZW50LT5lcnJvcl9jb2RlLCBlcnJvcl9tc2csIDEwMjQpOworICBHU1RfREVCVUcgKCJ4aW1hZ2V1dGlsIGZhaWxlZCB0byB1c2UgWFNobSBjYWxscy4gZXJyb3I6ICVzIiwgZXJyb3JfbXNnKTsKKyAgZXJyb3JfY2F1Z2h0ID0gVFJVRTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoYXQgaXQgaXMgYWN0dWFsbHkgcmVhbGx5IHBvc3NpYmxlIHRvIGNyZWF0ZSBhbiBpbWFnZQorICAgdXNpbmcgWFNobSAqLworZ2Jvb2xlYW4KK3hpbWFnZXV0aWxfY2hlY2tfeHNobV9jYWxscyAoR3N0WENvbnRleHQgKiB4Y29udGV4dCkKK3sKKyAgWEltYWdlICp4aW1hZ2U7CisgIFhTaG1TZWdtZW50SW5mbyBTSE1JbmZvOworICBzaXplX3Qgc2l6ZTsKKyAgaW50ICgqaGFuZGxlcikgKERpc3BsYXkgKiwgWEVycm9yRXZlbnQgKik7CisgIGdib29sZWFuIHJlc3VsdCA9IEZBTFNFOworICBnYm9vbGVhbiBkaWRfYXR0YWNoID0gRkFMU0U7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHhjb250ZXh0ICE9IE5VTEwsIEZBTFNFKTsKKworICAvKiBTeW5jIHRvIGVuc3VyZSBhbnkgb2xkZXIgZXJyb3JzIGFyZSBhbHJlYWR5IHByb2Nlc3NlZCAqLworICBYU3luYyAoeGNvbnRleHQtPmRpc3AsIEZBTFNFKTsKKworICAvKiBTZXQgZGVmYXVsdHMgc28gd2UgZG9uJ3QgZnJlZSB0aGVzZSBsYXRlciB1bm5lY2Vzc2FyaWx5ICovCisgIFNITUluZm8uc2htYWRkciA9ICgodm9pZCAqKSAtMSk7CisgIFNITUluZm8uc2htaWQgPSAtMTsKKworICAvKiBTZXR0aW5nIGFuIGVycm9yIGhhbmRsZXIgdG8gY2F0Y2ggZmFpbHVyZSAqLworICBlcnJvcl9jYXVnaHQgPSBGQUxTRTsKKyAgaGFuZGxlciA9IFhTZXRFcnJvckhhbmRsZXIgKHhpbWFnZXV0aWxfaGFuZGxlX3hlcnJvcik7CisKKyAgLyogVHJ5aW5nIHRvIGNyZWF0ZSBhIDF4MSB4aW1hZ2UgKi8KKyAgR1NUX0RFQlVHICgiWFNobUNyZWF0ZUltYWdlIG9mIDF4MSIpOworCisgIHhpbWFnZSA9IFhTaG1DcmVhdGVJbWFnZSAoeGNvbnRleHQtPmRpc3AsIHhjb250ZXh0LT52aXN1YWwsCisgICAgICB4Y29udGV4dC0+ZGVwdGgsIFpQaXhtYXAsIE5VTEwsICZTSE1JbmZvLCAxLCAxKTsKKworICAvKiBNaWdodCBjYXVzZSBhbiBlcnJvciwgc3luYyB0byBlbnN1cmUgaXQgaXMgbm90aWNlZCAqLworICBYU3luYyAoeGNvbnRleHQtPmRpc3AsIEZBTFNFKTsKKyAgaWYgKCF4aW1hZ2UgfHwgZXJyb3JfY2F1Z2h0KSB7CisgICAgR1NUX1dBUk5JTkcgKCJjb3VsZCBub3QgWFNobUNyZWF0ZUltYWdlIGEgMXgxIGltYWdlIik7CisgICAgZ290byBiZWFjaDsKKyAgfQorICBzaXplID0geGltYWdlLT5oZWlnaHQgKiB4aW1hZ2UtPmJ5dGVzX3Blcl9saW5lOworCisgIFNITUluZm8uc2htaWQgPSBzaG1nZXQgKElQQ19QUklWQVRFLCBzaXplLCBJUENfQ1JFQVQgfCAwNzc3KTsKKyAgaWYgKFNITUluZm8uc2htaWQgPT0gLTEpIHsKKyAgICBHU1RfV0FSTklORyAoImNvdWxkIG5vdCBnZXQgc2hhcmVkIG1lbW9yeSBvZiAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwKKyAgICAgICAgc2l6ZSk7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIFNITUluZm8uc2htYWRkciA9IHNobWF0IChTSE1JbmZvLnNobWlkLCAwLCAwKTsKKyAgaWYgKFNITUluZm8uc2htYWRkciA9PSAoKHZvaWQgKikgLTEpKSB7CisgICAgR1NUX1dBUk5JTkcgKCJGYWlsZWQgdG8gc2htYXQ6ICVzIiwgZ19zdHJlcnJvciAoZXJybm8pKTsKKyAgICBnb3RvIGJlYWNoOworICB9CisKKyAgLyogRGVsZXRlIHRoZSBTSE0gc2VnbWVudC4gSXQgd2lsbCBhY3R1YWxseSBnbyBhd2F5IGF1dG9tYXRpY2FsbHkKKyAgICogd2hlbiB3ZSBkZXRhY2ggbm93ICovCisgIHNobWN0bCAoU0hNSW5mby5zaG1pZCwgSVBDX1JNSUQsIDApOworCisgIHhpbWFnZS0+ZGF0YSA9IFNITUluZm8uc2htYWRkcjsKKyAgU0hNSW5mby5yZWFkT25seSA9IEZBTFNFOworCisgIGlmIChYU2htQXR0YWNoICh4Y29udGV4dC0+ZGlzcCwgJlNITUluZm8pID09IDApIHsKKyAgICBHU1RfV0FSTklORyAoIkZhaWxlZCB0byBYU2htQXR0YWNoIik7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIC8qIFN5bmMgdG8gZW5zdXJlIHdlIHNlZSBhbnkgZXJyb3JzIHdlIGNhdXNlZCAqLworICBYU3luYyAoeGNvbnRleHQtPmRpc3AsIEZBTFNFKTsKKworICBpZiAoIWVycm9yX2NhdWdodCkgeworICAgIGRpZF9hdHRhY2ggPSBUUlVFOworICAgIC8qIHN0b3JlIHdoZXRoZXIgd2Ugc3VjY2VlZGVkIGluIHJlc3VsdCAqLworICAgIHJlc3VsdCA9IFRSVUU7CisgIH0KK2JlYWNoOgorICAvKiBTeW5jIHRvIGVuc3VyZSB3ZSBzd2FsbG93IGFueSBlcnJvcnMgd2UgY2F1c2VkIGFuZCByZXNldCBlcnJvcl9jYXVnaHQgKi8KKyAgWFN5bmMgKHhjb250ZXh0LT5kaXNwLCBGQUxTRSk7CisgIGVycm9yX2NhdWdodCA9IEZBTFNFOworICBYU2V0RXJyb3JIYW5kbGVyIChoYW5kbGVyKTsKKworICBpZiAoZGlkX2F0dGFjaCkgeworICAgIFhTaG1EZXRhY2ggKHhjb250ZXh0LT5kaXNwLCAmU0hNSW5mbyk7CisgICAgWFN5bmMgKHhjb250ZXh0LT5kaXNwLCBGQUxTRSk7CisgIH0KKyAgaWYgKFNITUluZm8uc2htYWRkciAhPSAoKHZvaWQgKikgLTEpKQorICAgIHNobWR0IChTSE1JbmZvLnNobWFkZHIpOworICBpZiAoeGltYWdlKQorICAgIFhEZXN0cm95SW1hZ2UgKHhpbWFnZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLyogSEFWRV9YU0hNICovCisKKy8qIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgWCBEaXNwbGF5IGFuZCBnbG9iYWwgaW5mbyBhYm91dCBpdC4gRXZlcnl0aGluZyBpcworICAgc3RvcmVkIGluIG91ciBvYmplY3QgYW5kIHdpbGwgYmUgY2xlYW5lZCB3aGVuIHRoZSBvYmplY3QgaXMgZGlzcG9zZWQuIE5vdGUKKyAgIGhlcmUgdGhhdCBjYXBzIGZvciBzdXBwb3J0ZWQgZm9ybWF0IGFyZSBnZW5lcmF0ZWQgd2l0aG91dCBhbnkgd2luZG93IG9yCisgICBpbWFnZSBjcmVhdGlvbiAqLworR3N0WENvbnRleHQgKgoreGltYWdldXRpbF94Y29udGV4dF9nZXQgKEdzdEVsZW1lbnQgKiBwYXJlbnQsIGNvbnN0IGdjaGFyICogZGlzcGxheV9uYW1lKQoreworICBHc3RYQ29udGV4dCAqeGNvbnRleHQgPSBOVUxMOworICBYUGl4bWFwRm9ybWF0VmFsdWVzICpweF9mb3JtYXRzID0gTlVMTDsKKyAgZ2ludCBuYl9mb3JtYXRzID0gMCwgaTsKKworICB4Y29udGV4dCA9IGdfbmV3MCAoR3N0WENvbnRleHQsIDEpOworCisgIHhjb250ZXh0LT5kaXNwID0gWE9wZW5EaXNwbGF5IChkaXNwbGF5X25hbWUpOworICBHU1RfREVCVUdfT0JKRUNUIChwYXJlbnQsICJvcGVuZWQgZGlzcGxheSAlcCIsIHhjb250ZXh0LT5kaXNwKTsKKyAgaWYgKCF4Y29udGV4dC0+ZGlzcCkgeworICAgIGdfZnJlZSAoeGNvbnRleHQpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHhjb250ZXh0LT5zY3JlZW4gPSBEZWZhdWx0U2NyZWVuT2ZEaXNwbGF5ICh4Y29udGV4dC0+ZGlzcCk7CisgIHhjb250ZXh0LT52aXN1YWwgPSBEZWZhdWx0VmlzdWFsT2ZTY3JlZW4gKHhjb250ZXh0LT5zY3JlZW4pOworICB4Y29udGV4dC0+cm9vdCA9IFJvb3RXaW5kb3dPZlNjcmVlbiAoeGNvbnRleHQtPnNjcmVlbik7CisgIHhjb250ZXh0LT53aGl0ZSA9IFdoaXRlUGl4ZWxPZlNjcmVlbiAoeGNvbnRleHQtPnNjcmVlbik7CisgIHhjb250ZXh0LT5ibGFjayA9IEJsYWNrUGl4ZWxPZlNjcmVlbiAoeGNvbnRleHQtPnNjcmVlbik7CisgIHhjb250ZXh0LT5kZXB0aCA9IERlZmF1bHREZXB0aE9mU2NyZWVuICh4Y29udGV4dC0+c2NyZWVuKTsKKworICB4Y29udGV4dC0+d2lkdGggPSBXaWR0aE9mU2NyZWVuICh4Y29udGV4dC0+c2NyZWVuKTsKKyAgeGNvbnRleHQtPmhlaWdodCA9IEhlaWdodE9mU2NyZWVuICh4Y29udGV4dC0+c2NyZWVuKTsKKworICB4Y29udGV4dC0+d2lkdGhtbSA9IFdpZHRoTU1PZlNjcmVlbiAoeGNvbnRleHQtPnNjcmVlbik7CisgIHhjb250ZXh0LT5oZWlnaHRtbSA9IEhlaWdodE1NT2ZTY3JlZW4gKHhjb250ZXh0LT5zY3JlZW4pOworCisgIHhjb250ZXh0LT5jYXBzID0gTlVMTDsKKworICBHU1RfREVCVUdfT0JKRUNUIChwYXJlbnQsICJYIHJlcG9ydHMgJWR4JWQgcGl4ZWxzIGFuZCAlZCBtbSB4ICVkIG1tIiwKKyAgICAgIHhjb250ZXh0LT53aWR0aCwgeGNvbnRleHQtPmhlaWdodCwgeGNvbnRleHQtPndpZHRobW0sIHhjb250ZXh0LT5oZWlnaHRtbSk7CisgIHhpbWFnZXV0aWxfY2FsY3VsYXRlX3BpeGVsX2FzcGVjdF9yYXRpbyAoeGNvbnRleHQpOworCisgIC8qIFdlIGdldCBzdXBwb3J0ZWQgcGl4bWFwIGZvcm1hdHMgYXQgc3VwcG9ydGVkIGRlcHRoICovCisgIHB4X2Zvcm1hdHMgPSBYTGlzdFBpeG1hcEZvcm1hdHMgKHhjb250ZXh0LT5kaXNwLCAmbmJfZm9ybWF0cyk7CisKKyAgaWYgKCFweF9mb3JtYXRzKSB7CisgICAgWENsb3NlRGlzcGxheSAoeGNvbnRleHQtPmRpc3ApOworICAgIGdfZnJlZSAoeGNvbnRleHQpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLyogV2UgZ2V0IGJwcCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIG91ciBydW5uaW5nIGRlcHRoICovCisgIGZvciAoaSA9IDA7IGkgPCBuYl9mb3JtYXRzOyBpKyspIHsKKyAgICBpZiAocHhfZm9ybWF0c1tpXS5kZXB0aCA9PSB4Y29udGV4dC0+ZGVwdGgpCisgICAgICB4Y29udGV4dC0+YnBwID0gcHhfZm9ybWF0c1tpXS5iaXRzX3Blcl9waXhlbDsKKyAgfQorCisgIFhGcmVlIChweF9mb3JtYXRzKTsKKworICB4Y29udGV4dC0+ZW5kaWFubmVzcyA9CisgICAgICAoSW1hZ2VCeXRlT3JkZXIgKHhjb250ZXh0LT5kaXNwKSA9PQorICAgICAgTFNCRmlyc3QpID8gR19MSVRUTEVfRU5ESUFOIDogR19CSUdfRU5ESUFOOworCisjaWZkZWYgSEFWRV9YU0hNCisgIC8qIFNlYXJjaCBmb3IgWFNobSBleHRlbnNpb24gc3VwcG9ydCAqLworICBpZiAoWFNobVF1ZXJ5RXh0ZW5zaW9uICh4Y29udGV4dC0+ZGlzcCkgJiYKKyAgICAgIHhpbWFnZXV0aWxfY2hlY2tfeHNobV9jYWxscyAoeGNvbnRleHQpKSB7CisgICAgeGNvbnRleHQtPnVzZV94c2htID0gVFJVRTsKKyAgICBHU1RfREVCVUcgKCJ4aW1hZ2V1dGlsIGlzIHVzaW5nIFhTaG0gZXh0ZW5zaW9uIik7CisgIH0gZWxzZSB7CisgICAgeGNvbnRleHQtPnVzZV94c2htID0gRkFMU0U7CisgICAgR1NUX0RFQlVHICgieGltYWdldXRpbCBpcyBub3QgdXNpbmcgWFNobSBleHRlbnNpb24iKTsKKyAgfQorI2VuZGlmIC8qIEhBVkVfWFNITSAqLworCisgIC8qIG91ciBjYXBzIHN5c3RlbSBoYW5kbGVzIDI0LzMyYnBwIFJHQiBhcyBiaWctZW5kaWFuLiAqLworICBpZiAoKHhjb250ZXh0LT5icHAgPT0gMjQgfHwgeGNvbnRleHQtPmJwcCA9PSAzMikgJiYKKyAgICAgIHhjb250ZXh0LT5lbmRpYW5uZXNzID09IEdfTElUVExFX0VORElBTikgeworICAgIHhjb250ZXh0LT5lbmRpYW5uZXNzID0gR19CSUdfRU5ESUFOOworICAgIHhjb250ZXh0LT5yX21hc2tfb3V0cHV0ID0gR1VJTlQzMl9UT19CRSAoeGNvbnRleHQtPnZpc3VhbC0+cmVkX21hc2spOworICAgIHhjb250ZXh0LT5nX21hc2tfb3V0cHV0ID0gR1VJTlQzMl9UT19CRSAoeGNvbnRleHQtPnZpc3VhbC0+Z3JlZW5fbWFzayk7CisgICAgeGNvbnRleHQtPmJfbWFza19vdXRwdXQgPSBHVUlOVDMyX1RPX0JFICh4Y29udGV4dC0+dmlzdWFsLT5ibHVlX21hc2spOworICAgIGlmICh4Y29udGV4dC0+YnBwID09IDI0KSB7CisgICAgICB4Y29udGV4dC0+cl9tYXNrX291dHB1dCA+Pj0gODsKKyAgICAgIHhjb250ZXh0LT5nX21hc2tfb3V0cHV0ID4+PSA4OworICAgICAgeGNvbnRleHQtPmJfbWFza19vdXRwdXQgPj49IDg7CisgICAgfQorICB9IGVsc2UgeworICAgIHhjb250ZXh0LT5yX21hc2tfb3V0cHV0ID0geGNvbnRleHQtPnZpc3VhbC0+cmVkX21hc2s7CisgICAgeGNvbnRleHQtPmdfbWFza19vdXRwdXQgPSB4Y29udGV4dC0+dmlzdWFsLT5ncmVlbl9tYXNrOworICAgIHhjb250ZXh0LT5iX21hc2tfb3V0cHV0ID0geGNvbnRleHQtPnZpc3VhbC0+Ymx1ZV9tYXNrOworICB9CisKKyAgcmV0dXJuIHhjb250ZXh0OworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGNsZWFucyB0aGUgWCBjb250ZXh0LiBDbG9zaW5nIHRoZSBEaXNwbGF5IGFuZCB1bnJlZmluZyB0aGUKKyAgIGNhcHMgZm9yIHN1cHBvcnRlZCBmb3JtYXRzLiAqLwordm9pZAoreGltYWdldXRpbF94Y29udGV4dF9jbGVhciAoR3N0WENvbnRleHQgKiB4Y29udGV4dCkKK3sKKyAgZ19yZXR1cm5faWZfZmFpbCAoeGNvbnRleHQgIT0gTlVMTCk7CisKKyAgaWYgKHhjb250ZXh0LT5jYXBzICE9IE5VTEwpCisgICAgZ3N0X2NhcHNfdW5yZWYgKHhjb250ZXh0LT5jYXBzKTsKKworICBYQ2xvc2VEaXNwbGF5ICh4Y29udGV4dC0+ZGlzcCk7CisKKyAgZ19mcmVlICh4Y29udGV4dCk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgcGl4ZWwgYXNwZWN0IHJhdGlvIGJhc2VkIG9uIHRoZSBwcm9wZXJ0aWVzCisgKiBpbiB0aGUgeGNvbnRleHQgc3RydWN0dXJlIGFuZCBzdG9yZXMgaXQgdGhlcmUuICovCit2b2lkCit4aW1hZ2V1dGlsX2NhbGN1bGF0ZV9waXhlbF9hc3BlY3RfcmF0aW8gKEdzdFhDb250ZXh0ICogeGNvbnRleHQpCit7CisgIGdpbnQgcGFyW11bMl0gPSB7CisgICAgezEsIDF9LCAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ3VsYXIgc2NyZWVuICovCisgICAgezE2LCAxNX0sICAgICAgICAgICAgICAgICAgIC8qIFBBTCBUViAqLworICAgIHsxMSwgMTB9LCAgICAgICAgICAgICAgICAgICAvKiA1MjUgbGluZSBSZWMuNjAxIHZpZGVvICovCisgICAgezU0LCA1OX0gICAgICAgICAgICAgICAgICAgIC8qIDYyNSBsaW5lIFJlYy42MDEgdmlkZW8gKi8KKyAgfTsKKyAgZ2ludCBpOworICBnaW50IGluZGV4OworICBnZG91YmxlIHJhdGlvOworICBnZG91YmxlIGRlbHRhOworCisjZGVmaW5lIERFTFRBKGlkeCkgKEFCUyAocmF0aW8gLSAoKGdkb3VibGUpIHBhcltpZHhdWzBdIC8gcGFyW2lkeF1bMV0pKSkKKworICAvKiBmaXJzdCBjYWxjdWxhdGUgdGhlICJyZWFsIiByYXRpbyBiYXNlZCBvbiB0aGUgWCB2YWx1ZXM7CisgICAqIHdoaWNoIGlzIHRoZSAicGh5c2ljYWwiIHcvaCBkaXZpZGVkIGJ5IHRoZSB3L2ggaW4gcGl4ZWxzIG9mIHRoZSBkaXNwbGF5ICovCisgIHJhdGlvID0gKGdkb3VibGUpICh4Y29udGV4dC0+d2lkdGhtbSAqIHhjb250ZXh0LT5oZWlnaHQpCisgICAgICAvICh4Y29udGV4dC0+aGVpZ2h0bW0gKiB4Y29udGV4dC0+d2lkdGgpOworCisgIC8qIERpcmVjdEZCJ3MgWCBpbiA3MjB4NTc2IHJlcG9ydHMgdGhlIHBoeXNpY2FsIGRpbWVuc2lvbnMgd3JvbmcsIHNvCisgICAqIG92ZXJyaWRlIGhlcmUgKi8KKyAgaWYgKHhjb250ZXh0LT53aWR0aCA9PSA3MjAgJiYgeGNvbnRleHQtPmhlaWdodCA9PSA1NzYpIHsKKyAgICByYXRpbyA9IDQuMCAqIDU3NiAvICgzLjAgKiA3MjApOworICB9CisgIEdTVF9ERUJVRyAoImNhbGN1bGF0ZWQgcGl4ZWwgYXNwZWN0IHJhdGlvOiAlZiIsIHJhdGlvKTsKKworICAvKiBub3cgZmluZCB0aGUgb25lIGZyb20gcGFyW11bMl0gd2l0aCB0aGUgbG93ZXN0IGRlbHRhIHRvIHRoZSByZWFsIG9uZSAqLworICBkZWx0YSA9IERFTFRBICgwKTsKKyAgaW5kZXggPSAwOworCisgIGZvciAoaSA9IDE7IGkgPCBzaXplb2YgKHBhcikgLyAoc2l6ZW9mIChnaW50KSAqIDIpOyArK2kpIHsKKyAgICBnZG91YmxlIHRoaXNfZGVsdGEgPSBERUxUQSAoaSk7CisKKyAgICBpZiAodGhpc19kZWx0YSA8IGRlbHRhKSB7CisgICAgICBpbmRleCA9IGk7CisgICAgICBkZWx0YSA9IHRoaXNfZGVsdGE7CisgICAgfQorICB9CisKKyAgR1NUX0RFQlVHICgiRGVjaWRlZCBvbiBpbmRleCAlZCAoJWQvJWQpIiwgaW5kZXgsCisgICAgICBwYXJbaW5kZXhdWzBdLCBwYXJbaW5kZXhdWzFdKTsKKworICB4Y29udGV4dC0+cGFyX24gPSBwYXJbaW5kZXhdWzBdOworICB4Y29udGV4dC0+cGFyX2QgPSBwYXJbaW5kZXhdWzFdOworICBHU1RfREVCVUcgKCJzZXQgeGNvbnRleHQgUEFSIHRvICVkLyVkXG4iLCB4Y29udGV4dC0+cGFyX24sIHhjb250ZXh0LT5wYXJfZCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZ3N0X3hpbWFnZXNyY19idWZmZXJfZGlzcG9zZSAoR3N0QnVmZmVyICogeGltYWdlKQoreworICBHc3RFbGVtZW50ICpwYXJlbnQ7CisgIEdzdE1ldGFYSW1hZ2UgKm1ldGE7CisgIGdib29sZWFuIHJldCA9IFRSVUU7CisKKyAgbWV0YSA9IEdTVF9NRVRBX1hJTUFHRV9HRVQgKHhpbWFnZSk7CisKKyAgcGFyZW50ID0gbWV0YS0+cGFyZW50OworICBpZiAocGFyZW50ID09IE5VTEwpIHsKKyAgICBnX3dhcm5pbmcgKCJYSW1hZ2VTcmNCdWZmZXItPnhpbWFnZXNyYyA9PSBOVUxMIik7CisgICAgZ290byBiZWFjaDsKKyAgfQorCisgIGlmIChtZXRhLT5yZXR1cm5fZnVuYykKKyAgICByZXQgPSBtZXRhLT5yZXR1cm5fZnVuYyAocGFyZW50LCB4aW1hZ2UpOworCitiZWFjaDoKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZAorZ3N0X3hpbWFnZV9idWZmZXJfZnJlZSAoR3N0QnVmZmVyICogeGltYWdlKQoreworICBHc3RNZXRhWEltYWdlICptZXRhOworCisgIG1ldGEgPSBHU1RfTUVUQV9YSU1BR0VfR0VUICh4aW1hZ2UpOworCisgIC8qIG1ha2Ugc3VyZSBpdCBpcyBub3QgcmVjeWNsZWQgKi8KKyAgbWV0YS0+d2lkdGggPSAtMTsKKyAgbWV0YS0+aGVpZ2h0ID0gLTE7CisgIGdzdF9idWZmZXJfdW5yZWYgKHhpbWFnZSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBHc3RYSW1hZ2VTcmNCdWZmZXIgY3JlYXRpb24gZGVwZW5kaW5nIG9uIFhTaG0gYXZhaWxhYmlsaXR5ICovCitHc3RCdWZmZXIgKgorZ3N0X3hpbWFnZXV0aWxfeGltYWdlX25ldyAoR3N0WENvbnRleHQgKiB4Y29udGV4dCwKKyAgICBHc3RFbGVtZW50ICogcGFyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEJ1ZmZlclJldHVybkZ1bmMgcmV0dXJuX2Z1bmMpCit7CisgIEdzdEJ1ZmZlciAqeGltYWdlID0gTlVMTDsKKyAgR3N0TWV0YVhJbWFnZSAqbWV0YTsKKyAgZ2Jvb2xlYW4gc3VjY2VlZGVkID0gRkFMU0U7CisKKyAgeGltYWdlID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgIEdTVF9NSU5JX09CSkVDVF9DQVNUICh4aW1hZ2UpLT5kaXNwb3NlID0KKyAgICAgIChHc3RNaW5pT2JqZWN0RGlzcG9zZUZ1bmN0aW9uKSBnc3RfeGltYWdlc3JjX2J1ZmZlcl9kaXNwb3NlOworCisgIG1ldGEgPSBHU1RfTUVUQV9YSU1BR0VfQUREICh4aW1hZ2UpOworICBtZXRhLT53aWR0aCA9IHdpZHRoOworICBtZXRhLT5oZWlnaHQgPSBoZWlnaHQ7CisKKyNpZmRlZiBIQVZFX1hTSE0KKyAgbWV0YS0+U0hNSW5mby5zaG1hZGRyID0gKCh2b2lkICopIC0xKTsKKyAgbWV0YS0+U0hNSW5mby5zaG1pZCA9IC0xOworCisgIGlmICh4Y29udGV4dC0+dXNlX3hzaG0pIHsKKyAgICBtZXRhLT54aW1hZ2UgPSBYU2htQ3JlYXRlSW1hZ2UgKHhjb250ZXh0LT5kaXNwLAorICAgICAgICB4Y29udGV4dC0+dmlzdWFsLCB4Y29udGV4dC0+ZGVwdGgsCisgICAgICAgIFpQaXhtYXAsIE5VTEwsICZtZXRhLT5TSE1JbmZvLCBtZXRhLT53aWR0aCwgbWV0YS0+aGVpZ2h0KTsKKyAgICBpZiAoIW1ldGEtPnhpbWFnZSkgeworICAgICAgR1NUX1dBUk5JTkdfT0JKRUNUIChwYXJlbnQsCisgICAgICAgICAgImNvdWxkIG5vdCBYU2htQ3JlYXRlSW1hZ2UgYSAlZHglZCBpbWFnZSIsIG1ldGEtPndpZHRoLCBtZXRhLT5oZWlnaHQpOworCisgICAgICAvKiBSZXRyeSB3aXRob3V0IFhTaG0gKi8KKyAgICAgIHhjb250ZXh0LT51c2VfeHNobSA9IEZBTFNFOworICAgICAgZ290byBub194c2htOworICAgIH0KKworICAgIC8qIHdlIGhhdmUgdG8gdXNlIHRoZSByZXR1cm5lZCBieXRlc19wZXJfbGluZSBmb3Igb3VyIHNobSBzaXplICovCisgICAgbWV0YS0+c2l6ZSA9IG1ldGEtPnhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmUgKiBtZXRhLT54aW1hZ2UtPmhlaWdodDsKKyAgICBtZXRhLT5TSE1JbmZvLnNobWlkID0gc2htZ2V0IChJUENfUFJJVkFURSwgbWV0YS0+c2l6ZSwgSVBDX0NSRUFUIHwgMDc3Nyk7CisgICAgaWYgKG1ldGEtPlNITUluZm8uc2htaWQgPT0gLTEpCisgICAgICBnb3RvIGJlYWNoOworCisgICAgbWV0YS0+U0hNSW5mby5zaG1hZGRyID0gc2htYXQgKG1ldGEtPlNITUluZm8uc2htaWQsIDAsIDApOworICAgIGlmIChtZXRhLT5TSE1JbmZvLnNobWFkZHIgPT0gKCh2b2lkICopIC0xKSkKKyAgICAgIGdvdG8gYmVhY2g7CisKKyAgICAvKiBEZWxldGUgdGhlIFNITSBzZWdtZW50LiBJdCB3aWxsIGFjdHVhbGx5IGdvIGF3YXkgYXV0b21hdGljYWxseQorICAgICAqIHdoZW4gd2UgZGV0YWNoIG5vdyAqLworICAgIHNobWN0bCAobWV0YS0+U0hNSW5mby5zaG1pZCwgSVBDX1JNSUQsIDApOworCisgICAgbWV0YS0+eGltYWdlLT5kYXRhID0gbWV0YS0+U0hNSW5mby5zaG1hZGRyOworICAgIG1ldGEtPlNITUluZm8ucmVhZE9ubHkgPSBGQUxTRTsKKworICAgIGlmIChYU2htQXR0YWNoICh4Y29udGV4dC0+ZGlzcCwgJm1ldGEtPlNITUluZm8pID09IDApCisgICAgICBnb3RvIGJlYWNoOworCisgICAgWFN5bmMgKHhjb250ZXh0LT5kaXNwLCBGQUxTRSk7CisgIH0gZWxzZQorICBub194c2htOgorI2VuZGlmIC8qIEhBVkVfWFNITSAqLworICB7CisgICAgbWV0YS0+eGltYWdlID0gWENyZWF0ZUltYWdlICh4Y29udGV4dC0+ZGlzcCwKKyAgICAgICAgeGNvbnRleHQtPnZpc3VhbCwKKyAgICAgICAgeGNvbnRleHQtPmRlcHRoLAorICAgICAgICBaUGl4bWFwLCAwLCBOVUxMLCBtZXRhLT53aWR0aCwgbWV0YS0+aGVpZ2h0LCB4Y29udGV4dC0+YnBwLCAwKTsKKyAgICBpZiAoIW1ldGEtPnhpbWFnZSkKKyAgICAgIGdvdG8gYmVhY2g7CisKKyAgICAvKiB3ZSBoYXZlIHRvIHVzZSB0aGUgcmV0dXJuZWQgYnl0ZXNfcGVyX2xpbmUgZm9yIG91ciBpbWFnZSBzaXplICovCisgICAgbWV0YS0+c2l6ZSA9IG1ldGEtPnhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmUgKiBtZXRhLT54aW1hZ2UtPmhlaWdodDsKKyAgICBtZXRhLT54aW1hZ2UtPmRhdGEgPSBnX21hbGxvYyAobWV0YS0+c2l6ZSk7CisKKyAgICBYU3luYyAoeGNvbnRleHQtPmRpc3AsIEZBTFNFKTsKKyAgfQorICBzdWNjZWVkZWQgPSBUUlVFOworCisgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAoeGltYWdlLAorICAgICAgZ3N0X21lbW9yeV9uZXdfd3JhcHBlZCAoR1NUX01FTU9SWV9GTEFHX05PX1NIQVJFLCBtZXRhLT54aW1hZ2UtPmRhdGEsCisgICAgICAgICAgbWV0YS0+c2l6ZSwgMCwgbWV0YS0+c2l6ZSwgTlVMTCwgTlVMTCkpOworCisgIC8qIEtlZXAgYSByZWYgdG8gb3VyIHNyYyAqLworICBtZXRhLT5wYXJlbnQgPSBnc3Rfb2JqZWN0X3JlZiAocGFyZW50KTsKKyAgbWV0YS0+cmV0dXJuX2Z1bmMgPSByZXR1cm5fZnVuYzsKK2JlYWNoOgorICBpZiAoIXN1Y2NlZWRlZCkgeworICAgIGdzdF94aW1hZ2VfYnVmZmVyX2ZyZWUgKHhpbWFnZSk7CisgICAgeGltYWdlID0gTlVMTDsKKyAgfQorCisgIHJldHVybiB4aW1hZ2U7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gZGVzdHJveXMgYSBHc3RYSW1hZ2VCdWZmZXIgaGFuZGxpbmcgWFNobSBhdmFpbGFiaWxpdHkgKi8KK3ZvaWQKK2dzdF94aW1hZ2V1dGlsX3hpbWFnZV9kZXN0cm95IChHc3RYQ29udGV4dCAqIHhjb250ZXh0LCBHc3RCdWZmZXIgKiB4aW1hZ2UpCit7CisgIEdzdE1ldGFYSW1hZ2UgKm1ldGE7CisKKyAgbWV0YSA9IEdTVF9NRVRBX1hJTUFHRV9HRVQgKHhpbWFnZSk7CisKKyAgLyogV2UgbWlnaHQgaGF2ZSBzb21lIGJ1ZmZlcnMgZGVzdHJveWVkIGFmdGVyIGNoYW5naW5nIHN0YXRlIHRvIE5VTEwgKi8KKyAgaWYgKCF4Y29udGV4dCkKKyAgICBnb3RvIGJlYWNoOworCisgIGdfcmV0dXJuX2lmX2ZhaWwgKHhpbWFnZSAhPSBOVUxMKTsKKworI2lmZGVmIEhBVkVfWFNITQorICBpZiAoeGNvbnRleHQtPnVzZV94c2htKSB7CisgICAgaWYgKG1ldGEtPlNITUluZm8uc2htYWRkciAhPSAoKHZvaWQgKikgLTEpKSB7CisgICAgICBYU2htRGV0YWNoICh4Y29udGV4dC0+ZGlzcCwgJm1ldGEtPlNITUluZm8pOworICAgICAgWFN5bmMgKHhjb250ZXh0LT5kaXNwLCAwKTsKKyAgICAgIHNobWR0IChtZXRhLT5TSE1JbmZvLnNobWFkZHIpOworICAgIH0KKyAgICBpZiAobWV0YS0+eGltYWdlKQorICAgICAgWERlc3Ryb3lJbWFnZSAobWV0YS0+eGltYWdlKTsKKworICB9IGVsc2UKKyNlbmRpZiAvKiBIQVZFX1hTSE0gKi8KKyAgeworICAgIGlmIChtZXRhLT54aW1hZ2UpIHsKKyAgICAgIFhEZXN0cm95SW1hZ2UgKG1ldGEtPnhpbWFnZSk7CisgICAgfQorICB9CisKKyAgWFN5bmMgKHhjb250ZXh0LT5kaXNwLCBGQUxTRSk7CitiZWFjaDoKKyAgaWYgKG1ldGEtPnBhcmVudCkgeworICAgIC8qIFJlbGVhc2UgdGhlIHJlZiB0byBvdXIgcGFyZW50ICovCisgICAgZ3N0X29iamVjdF91bnJlZiAobWV0YS0+cGFyZW50KTsKKyAgICBtZXRhLT5wYXJlbnQgPSBOVUxMOworICB9CisKKyAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmggYi9zeXMveGltYWdlL3hpbWFnZXV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDc2ODYxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3hpbWFnZS94aW1hZ2V1dGlsLmgKQEAgLTAsMCArMSwxODEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gTHVjYSBPZ25pYmVuZSA8bHVvZ25pQHRpbi5pdD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fR1NUX1hJTUFHRVVUSUxfSF9fCisjZGVmaW5lIF9fR1NUX1hJTUFHRVVUSUxfSF9fCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKyNpZmRlZiBIQVZFX1hTSE0KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaXBjLmg+CisjaW5jbHVkZSA8c3lzL3NobS5oPgorI2VuZGlmIC8qIEhBVkVfWFNITSAqLworCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KKworI2lmZGVmIEhBVkVfWFNITQorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hTaG0uaD4KKyNlbmRpZiAvKiBIQVZFX1hTSE0gKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworR19CRUdJTl9ERUNMUworCit0eXBlZGVmIHN0cnVjdCBfR3N0WENvbnRleHQgR3N0WENvbnRleHQ7Cit0eXBlZGVmIHN0cnVjdCBfR3N0WFdpbmRvdyBHc3RYV2luZG93OwordHlwZWRlZiBzdHJ1Y3QgX0dzdFhJbWFnZSBHc3RYSW1hZ2U7Cit0eXBlZGVmIHN0cnVjdCBfR3N0TWV0YVhJbWFnZSBHc3RNZXRhWEltYWdlOworCisvKiBHbG9iYWwgWCBDb250ZXh0IHN0dWZmICovCisvKioKKyAqIEdzdFhDb250ZXh0OgorICogQGRpc3A6IHRoZSBYMTEgRGlzcGxheSBvZiB0aGlzIGNvbnRleHQKKyAqIEBzY3JlZW46IHRoZSBkZWZhdWx0IFNjcmVlbiBvZiBEaXNwbGF5IEBkaXNwCisgKiBAdmlzdWFsOiB0aGUgZGVmYXVsdCBWaXN1YWwgb2YgU2NyZWVuIEBzY3JlZW4KKyAqIEByb290OiB0aGUgcm9vdCBXaW5kb3cgb2YgRGlzcGxheSBAZGlzcAorICogQHdoaXRlOiB0aGUgdmFsdWUgb2YgYSB3aGl0ZSBwaXhlbCBvbiBTY3JlZW4gQHNjcmVlbgorICogQGJsYWNrOiB0aGUgdmFsdWUgb2YgYSBibGFjayBwaXhlbCBvbiBTY3JlZW4gQHNjcmVlbgorICogQGRlcHRoOiB0aGUgY29sb3IgZGVwdGggb2YgRGlzcGxheSBAZGlzcAorICogQGJwcDogdGhlIG51bWJlciBvZiBiaXRzIHBlciBwaXhlbCBvbiBEaXNwbGF5IEBkaXNwCisgKiBAZW5kaWFubmVzczogdGhlIGVuZGlhbm5lc3Mgb2YgaW1hZ2UgYnl0ZXMgb24gRGlzcGxheSBAZGlzcAorICogQHdpZHRoOiB0aGUgd2lkdGggaW4gcGl4ZWxzIG9mIERpc3BsYXkgQGRpc3AKKyAqIEBoZWlnaHQ6IHRoZSBoZWlnaHQgaW4gcGl4ZWxzIG9mIERpc3BsYXkgQGRpc3AKKyAqIEB3aWR0aG1tOiB0aGUgd2lkdGggaW4gbWlsbGltZXRlcnMgb2YgRGlzcGxheSBAZGlzcAorICogQGhlaWdodG1tOiB0aGUgaGVpZ2h0IGluIG1pbGxpbWV0ZXJzIG9mIERpc3BsYXkgQGRpc3AKKyAqIEBwYXJfbjogdGhlIHBpeGVsIGFzcGVjdCByYXRpbyBudW1lcmF0b3IgY2FsY3VsYXRlZCBmcm9tIEB3aWR0aCwgQHdpZHRobW0KKyAqIGFuZCBAaGVpZ2h0LAorICogQHBhcl9kOiB0aGUgcGl4ZWwgYXNwZWN0IHJhdGlvIGRlbnVtZXJhdG9yIGNhbGN1bGF0ZWQgZnJvbSBAd2lkdGgsIEB3aWR0aG1tCisgKiBhbmQgQGhlaWdodCwKKyAqIEBoZWlnaHRtbSByYXRpbworICogQHVzZV94c2htOiB1c2VkIHRvIGtub3duIHdldGhlciBvZiBub3QgWFNobSBleHRlbnNpb24gaXMgdXNhYmxlIG9yIG5vdCBldmVuCisgKiBpZiB0aGUgRXh0ZW5zaW9uIGlzIHByZXNlbnQKKyAqIEBjYXBzOiB0aGUgI0dzdENhcHMgdGhhdCBEaXNwbGF5IEBkaXNwIGNhbiBhY2NlcHQKKyAqCisgKiBTdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSB2YXJpb3VzIGluZm9ybWF0aW9ucyBjb2xsZWN0ZWQvY2FsY3VsYXRlZCBmb3IgYQorICogRGlzcGxheS4KKyAqLworc3RydWN0IF9Hc3RYQ29udGV4dCB7CisgIERpc3BsYXkgKmRpc3A7CisKKyAgU2NyZWVuICpzY3JlZW47CisKKyAgVmlzdWFsICp2aXN1YWw7CisKKyAgV2luZG93IHJvb3Q7CisKKyAgZ3Vsb25nIHdoaXRlLCBibGFjazsKKworICBnaW50IGRlcHRoOworICBnaW50IGJwcDsKKyAgZ2ludCBlbmRpYW5uZXNzOworCisgIGdpbnQgd2lkdGgsIGhlaWdodDsKKyAgZ2ludCB3aWR0aG1tLCBoZWlnaHRtbTsKKworICAvKiB0aGVzZSBhcmUgdGhlIG91dHB1dCBtYXNrcworICAgKiBmb3IgYnVmZmVycyBmcm9tIHhpbWFnZXNyYworICAgKiBhbmQgYXJlIGluIGJpZyBlbmRpYW4gKi8KKyAgZ3VpbnQzMiByX21hc2tfb3V0cHV0LCBnX21hc2tfb3V0cHV0LCBiX21hc2tfb3V0cHV0OworCisgIGd1aW50IHBhcl9uOyAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZWQgcGl4ZWwgYXNwZWN0IHJhdGlvIG51bWVyYXRvciAqLworICBndWludCBwYXJfZDsgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGVkIHBpeGVsIGFzcGVjdCByYXRpbyBkZW51bWVyYXRvciAqLworCisgIGdib29sZWFuIHVzZV94c2htOworCisgIEdzdENhcHMgKmNhcHM7Cit9OworCisvKioKKyAqIEdzdFhXaW5kb3c6CisgKiBAd2luOiB0aGUgV2luZG93IElEIG9mIHRoaXMgWDExIHdpbmRvdworICogQHdpZHRoOiB0aGUgd2lkdGggaW4gcGl4ZWxzIG9mIFdpbmRvdyBAd2luCisgKiBAaGVpZ2h0OiB0aGUgaGVpZ2h0IGluIHBpeGVscyBvZiBXaW5kb3cgQHdpbgorICogQGludGVybmFsOiB1c2VkIHRvIHJlbWVtYmVyIGlmIFdpbmRvdyBAd2luIHdhcyBjcmVhdGVkIGludGVybmFsbHkgb3IgcGFzc2VkCisgKiB0aHJvdWdoIHRoZSAjR3N0WE92ZXJsYXkgaW50ZXJmYWNlCisgKiBAZ2M6IHRoZSBHcmFwaGljYWwgQ29udGV4dCBvZiBXaW5kb3cgQHdpbgorICoKKyAqIFN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGluZm9ybWF0aW9ucyBhYm91dCBhIFdpbmRvdy4KKyAqLworc3RydWN0IF9Hc3RYV2luZG93IHsKKyAgV2luZG93IHdpbjsKKyAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICBnYm9vbGVhbiBpbnRlcm5hbDsKKyAgR0MgZ2M7Cit9OworCitnYm9vbGVhbiB4aW1hZ2V1dGlsX2NoZWNrX3hzaG1fY2FsbHMgKEdzdFhDb250ZXh0ICogeGNvbnRleHQpOworCitHc3RYQ29udGV4dCAqeGltYWdldXRpbF94Y29udGV4dF9nZXQgKEdzdEVsZW1lbnQgKnBhcmVudCwgCisgICAgY29uc3QgZ2NoYXIgKmRpc3BsYXlfbmFtZSk7Cit2b2lkIHhpbWFnZXV0aWxfeGNvbnRleHRfY2xlYXIgKEdzdFhDb250ZXh0ICp4Y29udGV4dCk7Cit2b2lkIHhpbWFnZXV0aWxfY2FsY3VsYXRlX3BpeGVsX2FzcGVjdF9yYXRpbyAoR3N0WENvbnRleHQgKiB4Y29udGV4dCk7CisKKy8qIGN1c3RvbSB4aW1hZ2VzcmMgYnVmZmVyLCBjb3BpZWQgZnJvbSB4aW1hZ2VzaW5rICovCisKKy8qIEJ1ZmZlclJldHVybkZ1bmMgaXMgY2FsbGVkIHdoZW4gYSBidWZmZXIgaXMgZmluYWxpc2VkICovCit0eXBlZGVmIGdib29sZWFuICgqQnVmZmVyUmV0dXJuRnVuYykgKEdzdEVsZW1lbnQgKnBhcmVudCwgR3N0QnVmZmVyICpidWYpOworCisvKioKKyAqIEdzdE1ldGFYSW1hZ2U6CisgKiBAcGFyZW50OiBhIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCB3ZSBiZWxvbmcgdG8KKyAqIEB4aW1hZ2U6IHRoZSBYSW1hZ2Ugb2YgdGhpcyBidWZmZXIKKyAqIEB3aWR0aDogdGhlIHdpZHRoIGluIHBpeGVscyBvZiBYSW1hZ2UgQHhpbWFnZQorICogQGhlaWdodDogdGhlIGhlaWdodCBpbiBwaXhlbHMgb2YgWEltYWdlIEB4aW1hZ2UKKyAqIEBzaXplOiB0aGUgc2l6ZSBpbiBieXRlcyBvZiBYSW1hZ2UgQHhpbWFnZQorICoKKyAqIEV4dHJhIGRhdGEgYXR0YWNoZWQgdG8gYnVmZmVycyBjb250YWluaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYW4gWEltYWdlLgorICovCitzdHJ1Y3QgX0dzdE1ldGFYSW1hZ2UgeworICBHc3RNZXRhIG1ldGE7CisKKyAgLyogUmVmZXJlbmNlIHRvIHRoZSB4aW1hZ2VzcmMgd2UgYmVsb25nIHRvICovCisgIEdzdEVsZW1lbnQgKnBhcmVudDsKKworICBYSW1hZ2UgKnhpbWFnZTsKKworI2lmZGVmIEhBVkVfWFNITQorICBYU2htU2VnbWVudEluZm8gU0hNSW5mbzsKKyNlbmRpZiAvKiBIQVZFX1hTSE0gKi8KKworICBnaW50IHdpZHRoLCBoZWlnaHQ7CisgIHNpemVfdCBzaXplOworCisgIEJ1ZmZlclJldHVybkZ1bmMgcmV0dXJuX2Z1bmM7Cit9OworCitHVHlwZSBnc3RfbWV0YV94aW1hZ2VfYXBpX2dldF90eXBlICh2b2lkKTsKK2NvbnN0IEdzdE1ldGFJbmZvICogZ3N0X21ldGFfeGltYWdlX2dldF9pbmZvICh2b2lkKTsKKyNkZWZpbmUgR1NUX01FVEFfWElNQUdFX0dFVChidWYpICgoR3N0TWV0YVhJbWFnZSAqKWdzdF9idWZmZXJfZ2V0X21ldGEoYnVmLGdzdF9tZXRhX3hpbWFnZV9hcGlfZ2V0X3R5cGUoKSkpCisjZGVmaW5lIEdTVF9NRVRBX1hJTUFHRV9BREQoYnVmKSAoKEdzdE1ldGFYSW1hZ2UgKilnc3RfYnVmZmVyX2FkZF9tZXRhKGJ1Zixnc3RfbWV0YV94aW1hZ2VfZ2V0X2luZm8oKSxOVUxMKSkKKworR3N0QnVmZmVyICpnc3RfeGltYWdldXRpbF94aW1hZ2VfbmV3IChHc3RYQ29udGV4dCAqeGNvbnRleHQsCisgIEdzdEVsZW1lbnQgKnBhcmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBCdWZmZXJSZXR1cm5GdW5jIHJldHVybl9mdW5jKTsKKwordm9pZCBnc3RfeGltYWdldXRpbF94aW1hZ2VfZGVzdHJveSAoR3N0WENvbnRleHQgKnhjb250ZXh0LCAKKyAgR3N0QnVmZmVyICogeGltYWdlKTsKKyAgCisvKiBDYWxsIHRvIG1hbnVhbGx5IHJlbGVhc2UgYSBidWZmZXIgKi8KK3ZvaWQgZ3N0X3hpbWFnZV9idWZmZXJfZnJlZSAoR3N0QnVmZmVyICp4aW1hZ2UpOworCitHX0VORF9ERUNMUyAKKworI2VuZGlmIC8qIF9fR1NUX1hJTUFHRVVUSUxfSF9fICovCmRpZmYgLS1naXQgYS90ZXN0cy9NYWtlZmlsZS5hbSBiL3Rlc3RzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMTBlOGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIyIEBACitpZiBIQVZFX0dTVF9DSEVDSworU1VCRElSU19DSEVDSyA9IGNoZWNrIGZpbGVzCitlbHNlCitTVUJESVJTX0NIRUNLID0KK2VuZGlmCisKK2lmIFVTRV9YCitTVUJESVJTX0lDTEVTID0gaWNsZXMKK2Vsc2UKK1NVQkRJUlNfSUNMRVMgPQorZW5kaWYKKworaWYgQlVJTERfRVhBTVBMRVMKK1NVQkRJUl9FWEFNUExFUyA9IGV4YW1wbGVzCitlbHNlCitTVUJESVJfRVhBTVBMRVMgPQorZW5kaWYKKworU1VCRElSUyA9ICQoU1VCRElSU19DSEVDSykgJChTVUJESVJTX0lDTEVTKSAkKFNVQkRJUl9FWEFNUExFUykKKworRElTVF9TVUJESVJTID0gY2hlY2sgaWNsZXMgZXhhbXBsZXMgZmlsZXMKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svLmdpdGlnbm9yZSBiL3Rlc3RzL2NoZWNrLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg5NTg4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACit0ZXN0LXJlZ2lzdHJ5LioKK29yYwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svTWFrZWZpbGUuYW0gYi90ZXN0cy9jaGVjay9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODUwYmM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2NjMgQEAKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9jb21tb24vY2hlY2subWFrCisKK0NIRUNLX1JFR0lTVFJZID0gJCh0b3BfYnVpbGRkaXIpL3Rlc3RzL2NoZWNrL3Rlc3QtcmVnaXN0cnkucmVnCitURVNUX0ZJTEVTX0RJUkVDVE9SWSA9ICQodG9wX3NyY2RpcikvdGVzdHMvZmlsZXMKKworUkVHSVNUUllfRU5WSVJPTk1FTlQgPSBcCisJR1NUX1JFR0lTVFJZXzFfMD0kKENIRUNLX1JFR0lTVFJZKQorCitBTV9URVNUU19FTlZJUk9OTUVOVCArPSBcCisJJChSRUdJU1RSWV9FTlZJUk9OTUVOVCkJCQkJCVwKKwlHU1RfUExVR0lOX1NZU1RFTV9QQVRIXzFfMD0JCQkJXAorCUdTVF9QTFVHSU5fUEFUSF8xXzA9JCh0b3BfYnVpbGRkaXIpL2dzdDokKHRvcF9idWlsZGRpcikvZXh0OiQodG9wX2J1aWxkZGlyKS9zeXM6JChHU1RQQl9QTFVHSU5TX0RJUik6JChHU1RfUExVR0lOU19ESVIpCQkJXAorCUdTVF9QTFVHSU5fTE9BRElOR19XSElURUxJU1Q9ImdzdHJlYW1lckAkKEdTVF9QTFVHSU5TX0RJUik6Z3N0LXBsdWdpbnMtYmFzZUAkKEdTVFBCX1BMVUdJTlNfRElSKTpnc3QtcGx1Z2lucy1nb29kQCQodG9wX2J1aWxkZGlyKSIJXAorCUdTVF9TVEFURV9JR05PUkVfRUxFTUVOVFM9ImFhc2luayBhdXRvYXVkaW9zcmMgYXV0b2F1ZGlvc2luayBhdXRvdmlkZW9zcmMgYXV0b3ZpZGVvc2luayBcCisJCWNhY2FzaW5rIGNhaXJvdGV4dG92ZXJsYXkgXAorCQloYWxhdWRpb3NyYyBoYWxhdWRpb3NpbmsgamFja2F1ZGlvc3JjIGphY2thdWRpb3NpbmsgXAorCQlvc3NzcmMgb3Nzc2luayBvc3hhdWRpb3Npbmsgb3N4YXVkaW9zcmMgb3N4dmlkZW9zcmMgb3N4dmlkZW9zaW5rIFwKKwkJcHVsc2VzaW5rIHB1bHNlc3JjIHB1bHNlbWl4ZXIgdjRsMnNyYyIgXAorCUdTRVRUSU5HU19CQUNLRU5EPSJtZW1vcnkiCisKKyMgZmFrZSBkZXZpY2UgZHJpdmVyczogd2UgY291bGQgcnVuIGhhcmR3YXJlIGVsZW1lbnQgdGVzdHMgYWdhaW5zdCBkdW1teSBkcml2ZXJzCisjIHY0bDI6IHZpdm8gKHBhcnQgb2Ygbm9ybWFsIGtlcm5lbCkKKyMgICBtb2Rwcm9iZSB2aXZvOworIyAgIGdzdC1sYXVuY2ggdjRsMnNyYyBkZXZpY2U9Ii9kZXYvdmlkZW8xIiAhIHh2aW1hZ2VzaW5rOworIyAgIHJtbW9kIHZpdm8KKyMKKyMgYWxzYTogc25kLWR1bW15IChwYXJ0IG9mIG5vcm1hbCBhbHNhLCBub3QgcmVtb3ZhYmxlKQorIyAgIG1vZHByb2JlIHNuZC1kdW1teTsKKyMgICBnc3QtbGF1bmNoIGFsc2FzcmMgZGV2aWNlPSJodzoyIiAhIGZha2VzaW5rCisjICAgZ3N0LWxhdW5jaCBmYWtlc3JjICEgYWxzYXNpbmsgZGV2aWNlPSJodzoyIgorIworIyBuZWVkIGEgd2F5IHRvIGZpZ3VyZSBvdXQgdmFsdWUgZm9yIHRoZSBkZXZpY2UgcHJvcGVydHkKKworIyB0aGUgY29yZSBkdW1wcyBvZiBzb21lIG1hY2hpbmVzIGhhdmUgUElEcyBhcHBlbmRlZAorQ0xFQU5GSUxFUyA9IGNvcmUuKiB0ZXN0LXJlZ2lzdHJ5LioKKworY2xlYW4tbG9jYWw6IGNsZWFuLWxvY2FsLWNoZWNrCitkaXN0Y2xlYW4tbG9jYWw6IGRpc3RjbGVhbi1sb2NhbC1vcmMKKworaWYgVVNFX1BMVUdJTl9BTFBIQQorY2hlY2tfYWxwaGEgPSBcCisJZWxlbWVudHMvYWxwaGFjb2xvciBcCisJZWxlbWVudHMvYWxwaGEKK2Vsc2UKK2NoZWNrX2FscGhhID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fQVVESU9GWAorY2hlY2tfYXVkaW9meCA9IFwKKwllbGVtZW50cy9hdWRpb2FtcGxpZnkgXAorCWVsZW1lbnRzL2F1ZGlvY2hlYmJhbmQgXAorCWVsZW1lbnRzL2F1ZGlvY2hlYmxpbWl0IFwKKwllbGVtZW50cy9hdWRpb2R5bmFtaWMgXAorCWVsZW1lbnRzL2F1ZGlvZWNobyBcCisJZWxlbWVudHMvYXVkaW9maXJmaWx0ZXIgXAorCWVsZW1lbnRzL2F1ZGlvaWlyZmlsdGVyIFwKKwllbGVtZW50cy9hdWRpb2ludmVydCBcCisJZWxlbWVudHMvYXVkaW9wYW5vcmFtYSBcCisJZWxlbWVudHMvYXVkaW93c2luY2JhbmQgXAorCWVsZW1lbnRzL2F1ZGlvd3NpbmNsaW1pdAorZWxzZQorY2hlY2tfYXVkaW9meCA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX0FVRElPUEFSU0VSUworY2hlY2tfYXVkaW9wYXJzZXJzID0gXAorCWVsZW1lbnRzL2FhY3BhcnNlIFwKKwllbGVtZW50cy9hYzNwYXJzZSBcCisJZWxlbWVudHMvYW1ycGFyc2UgXAorCWVsZW1lbnRzL2ZsYWNwYXJzZSBcCisJZWxlbWVudHMvbXBlZ2F1ZGlvcGFyc2UgXAorCWVsZW1lbnRzL3dhdnBhY2twYXJzZQorZWxzZQorY2hlY2tfYXVkaW9wYXJzZXJzID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fQVVUT0RFVEVDVAorY2hlY2tfYXV0b2RldGVjdCA9IGVsZW1lbnRzL2F1dG9kZXRlY3QKK2Vsc2UKK2NoZWNrX2F1dG9kZXRlY3QgPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9BVkkKK2NoZWNrX2F2aSA9IFwKKyAgZWxlbWVudHMvYXZpbXV4IFwKKyAgZWxlbWVudHMvYXZpc3VidGl0bGUKK2Vsc2UKK2NoZWNrX2F2aSA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX0RFQlVHVVRJTFMKK2NoZWNrX2RlYnVndXRpbHMgPSBlbGVtZW50cy9jYXBzc2V0dGVyCitlbHNlCitjaGVja19kZWJ1Z3V0aWxzID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fREVJTlRFUkxBQ0UKK2NoZWNrX2RlaW50ZXJsYWNlID0gZWxlbWVudHMvZGVpbnRlcmxhY2UKK2Vsc2UKK2NoZWNrX2RlaW50ZXJsYWNlID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fRFRNRgorY2hlY2tfZHRtZiA9IGVsZW1lbnRzL2R0bWYKK2Vsc2UKK2NoZWNrX2R0bWYgPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9FRkZFQ1RWCitjaGVja19lZmZlY3R2ID0gcGlwZWxpbmVzL2VmZmVjdHYKK2Vsc2UKK2NoZWNrX2VmZmVjdHYgPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9FUVVBTElaRVIKK2NoZWNrX2VxdWFsaXplciA9IGVsZW1lbnRzL2VxdWFsaXplcgorZWxzZQorY2hlY2tfZXF1YWxpemVyID0KK2VuZGlmCisKK2lmIFVTRV9GTEFDCitjaGVja19mbGFjID0gcGlwZWxpbmVzL2ZsYWNkZWMKK2Vsc2UKK2NoZWNrX2ZsYWMgPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9GTFYKK2NoZWNrX2ZsdiA9IFwKKyAgICAgICAgZWxlbWVudHMvZmx2ZGVtdXggXAorICAgICAgICBlbGVtZW50cy9mbHZtdXgKK2Vsc2UKK2NoZWNrX2ZsdiA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX0lTT01QNAorY2hlY2tfaXNvbXA0ID0gXAorCWVsZW1lbnRzL3F0bXV4IFwKKwllbGVtZW50cy9xdGRlbXV4CitlbHNlCitjaGVja19pc29tcDQgPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9MQVcKK2NoZWNrX2xhdyA9IFwKKwllbGVtZW50cy9tdWxhd2RlYyBcCisJZWxlbWVudHMvbXVsYXdlbmMKK2Vsc2UKK2NoZWNrX2xhdyA9CitlbmRpZgorCitpZiBVU0VfR0RLX1BJWEJVRgorY2hlY2tfZ2RrcGl4YnVmID0gZWxlbWVudHMvZ2RrcGl4YnVmc2luayBlbGVtZW50cy9nZGtwaXhidWZvdmVybGF5CitlbHNlCitjaGVja19nZGtwaXhidWYgPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9JQ1lERU1VWAorY2hlY2tfaWN5ZGVtdXggPSBlbGVtZW50cy9pY3lkZW11eAorZWxzZQorY2hlY2tfaWN5ZGVtdXggPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9JRDNERU1VWAorY2hlY2tfaWQzZGVtdXggPSBlbGVtZW50cy9pZDNkZW11eAorZWxzZQorY2hlY2tfaWQzZGVtdXggPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9JTUFHRUZSRUVaRQorY2hlY2tfaW1hZ2VmcmVlemUgPSBlbGVtZW50cy9pbWFnZWZyZWV6ZQorZWxzZQorY2hlY2tfaW1hZ2VmcmVlemUgPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9JTlRFUkxFQVZFCitjaGVja19pbnRlcmxlYXZlID0gXAorICAgICAgICBlbGVtZW50cy9kZWludGVybGVhdmUgXAorICAgICAgICBlbGVtZW50cy9pbnRlcmxlYXZlCitlbHNlCitjaGVja19pbnRlcmxlYXZlID0KK2VuZGlmCisKK2lmIFVTRV9KUEVHCitjaGVja19qcGVnID0gXAorICAgICAgICBlbGVtZW50cy9qcGVnZGVjIFwKKyAgICAgICAgZWxlbWVudHMvanBlZ2VuYworZWxzZQorY2hlY2tfanBlZyA9CitlbmRpZgorCitpZiBVU0VfTEFNRQorY2hlY2tfbGFtZSA9IHBpcGVsaW5lcy9sYW1lCitlbHNlCitjaGVja19sYW1lID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fTEVWRUwKK2NoZWNrX2xldmVsID0gZWxlbWVudHMvbGV2ZWwKK2Vsc2UKK2NoZWNrX2xldmVsID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fTUFUUk9TS0EKK2NoZWNrX21hdHJvc2thID0gXAorCWVsZW1lbnRzL21hdHJvc2thZGVtdXggXAorCWVsZW1lbnRzL21hdHJvc2thbXV4IFwKKwllbGVtZW50cy9tYXRyb3NrYXBhcnNlCitlbHNlCitjaGVja19tYXRyb3NrYSA9CitlbmRpZgorCitpZiBVU0VfTVBHMTIzCitjaGVja19tcGcxMjMgPSBlbGVtZW50cy9tcGcxMjNhdWRpb2RlYworZWxzZQorY2hlY2tfbXBnMTIzID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fTVVMVElGSUxFCitjaGVja19tdWx0aWZpbGUgPSBlbGVtZW50cy9tdWx0aWZpbGUgZWxlbWVudHMvc3BsaXRtdXgKK2Vsc2UKK2NoZWNrX211bHRpZmlsZSA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX1JFUExBWUdBSU4KK2NoZWNrX3JlcGxheWdhaW4gPSBcCisJZWxlbWVudHMvcmdhbmFseXNpcyBcCisJZWxlbWVudHMvcmdsaW1pdGVyIFwKKwllbGVtZW50cy9yZ3ZvbHVtZQorZWxzZQorY2hlY2tfcmVwbGF5Z2FpbiA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX1JUUAorY2hlY2tfcnRwID0gXAorCWVsZW1lbnRzL3J0cC1wYXlsb2FkaW5nIFwKKwllbGVtZW50cy9ydHBoMjYxIFwKKwllbGVtZW50cy9ydHBoMjYzIFwKKwllbGVtZW50cy9ydHBoMjY0IFwKKwllbGVtZW50cy9ydHB2cDkKK2Vsc2UKK2NoZWNrX3J0cCA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX1JUUE1BTkFHRVIKK2NoZWNrX3J0cG1hbmFnZXIgPSBcCisJZWxlbWVudHMvcnRwYXV4IFwKKwllbGVtZW50cy9ydHBiaW4gXAorCWVsZW1lbnRzL3J0cGJpbl9idWZmZXJfbGlzdCBcCisJZWxlbWVudHMvcnRwYnVuZGxlIFwKKwllbGVtZW50cy9ydHBjb2xsaXNpb24gXAorCWVsZW1lbnRzL3J0cGppdHRlcmJ1ZmZlciBcCisJZWxlbWVudHMvcnRwbXV4IFwKKwllbGVtZW50cy9ydHBydHggXAorCWVsZW1lbnRzL3J0cHNlc3Npb24KK2Vsc2UKK2NoZWNrX3J0cG1hbmFnZXIgPQorZW5kaWYKKworaWYgVVNFX1NPVVAKK2NoZWNrX3NvdXAgPSBlbGVtZW50cy9zb3VwaHR0cHNyYworZWxzZQorY2hlY2tfc291cCA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX1NQRUNUUlVNCitjaGVja19zcGVjdHJ1bSA9IGVsZW1lbnRzL3NwZWN0cnVtCitlbHNlCitjaGVja19zcGVjdHJ1bSA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX1NIQVBFV0lQRQorY2hlY2tfc2hhcGV3aXBlID0gZWxlbWVudHMvc2hhcGV3aXBlCitlbHNlCitjaGVja19zaGFwZXdpcGUgPQorZW5kaWYKKworaWYgVVNFX1RBR0xJQgorY2hlY2tfdGFnbGliID0gXAorCWVsZW1lbnRzL2lkM3YybXV4IFwKKwllbGVtZW50cy9hcGV2Mm11eAorZWxzZQorY2hlY2tfdGFnbGliID0KK2VuZGlmCisKK2lmIFVTRV9UV09MQU1FCitjaGVja190d29sYW1lID0gcGlwZWxpbmVzL3R3b2xhbWUKK2Vsc2UKK2NoZWNrX3R3b2xhbWUgPQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9VRFAKK2NoZWNrX3VkcCA9IFwKKyAgICAgICAgZWxlbWVudHMvdWRwc2luayBcCisgICAgICAgIGVsZW1lbnRzL3VkcHNyYworZWxzZQorY2hlY2tfdWRwID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fVklERU9CT1gKK2NoZWNrX3ZpZGVvYm94ID0gZWxlbWVudHMvdmlkZW9ib3gKK2Vsc2UKK2NoZWNrX3ZpZGVvYm94ID0KK2VuZGlmCisKK2lmIFVTRV9QTFVHSU5fVklERU9DUk9QCitjaGVja192aWRlb2Nyb3AgPSBcCisJZWxlbWVudHMvYXNwZWN0cmF0aW9jcm9wIFwKKwllbGVtZW50cy92aWRlb2Nyb3AKK2Vsc2UKK2NoZWNrX3ZpZGVvY3JvcCA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX1ZJREVPRklMVEVSCitjaGVja192aWRlb2ZpbHRlciA9IGVsZW1lbnRzL3ZpZGVvZmlsdGVyCitlbHNlCitjaGVja192aWRlb2ZpbHRlciA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX1ZJREVPTUlYRVIKK2NoZWNrX3ZpZGVvbWl4ZXIgPSBlbGVtZW50cy92aWRlb21peGVyCitlbHNlCitjaGVja192aWRlb21peGVyID0KK2VuZGlmCisKK2lmIFVTRV9WUFgKK2NoZWNrX3ZweD1lbGVtZW50cy92cDhlbmMgZWxlbWVudHMvdnA4ZGVjIGVsZW1lbnRzL3ZwOWVuYworZWxzZQorY2hlY2tfdnB4PQorZW5kaWYKKworaWYgVVNFX1BMVUdJTl9XQVZFTkMKK2NoZWNrX3dhdmVuYyA9IHBpcGVsaW5lcy93YXZlbmMKK2Vsc2UKK2NoZWNrX3dhdmVuYyA9CitlbmRpZgorCitpZiBVU0VfV0FWUEFDSworY2hlY2tfd2F2cGFjayA9IFwKKyAgICAgICBlbGVtZW50cy93YXZwYWNrZGVjIFwKKyAgICAgICBlbGVtZW50cy93YXZwYWNrZW5jIFwKKyAgICAgICBwaXBlbGluZXMvd2F2cGFjaworZWxzZQorY2hlY2tfd2F2cGFjayA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX1dBVlBBUlNFCitjaGVja193YXZwYXJzZSA9IGVsZW1lbnRzL3dhdnBhcnNlCitlbHNlCitjaGVja193YXZwYXJzZSA9CitlbmRpZgorCitpZiBVU0VfUExVR0lOX1k0TQorY2hlY2tfeTRtID0gZWxlbWVudHMveTRtZW5jCitlbHNlCitjaGVja195NG0gPQorZW5kaWYKKworaWYgSEFWRV9PUkMKK2NoZWNrX29yYyA9IG9yYy9kZWludGVybGFjZSBvcmMvdmlkZW9taXhlciBvcmMvdmlkZW9ib3gKK2Vsc2UKK2NoZWNrX29yYyA9CitlbmRpZgorCisKK2NoZWNrX1BST0dSQU1TID0gXAorCWdlbmVyaWMvc3RhdGVzIFwKKwlwaXBlbGluZXMvc2ltcGxlLWxhdW5jaC1saW5lcyBcCisJcGlwZWxpbmVzL3RhZ3NjaGVja2luZyBcCisJJChjaGVja19hbHBoYSkgXAorCSQoY2hlY2tfYXVkaW9meCkgXAorCSQoY2hlY2tfYXVkaW9wYXJzZXJzKSBcCisJJChjaGVja19hdXRvZGV0ZWN0KSBcCisJJChjaGVja19hdmkpIFwKKwkkKGNoZWNrX2RlYnVndXRpbHMpIFwKKwkkKGNoZWNrX2RlaW50ZXJsYWNlKSBcCisJJChjaGVja19kdG1mKSBcCisJJChjaGVja19lZmZlY3R2KSBcCisJJChjaGVja19lcXVhbGl6ZXIpIFwKKwkkKGNoZWNrX2ZsYWMpIFwKKwkkKGNoZWNrX2ZsdikgXAorCSQoY2hlY2tfZ2RrcGl4YnVmKSBcCisJJChjaGVja19pc29tcDQpIFwKKwkkKGNoZWNrX2ljeWRlbXV4KSBcCisJJChjaGVja19pZDNkZW11eCkgXAorCSQoY2hlY2tfaW1hZ2VmcmVlemUpIFwKKwkkKGNoZWNrX2ludGVybGVhdmUpIFwKKwkkKGNoZWNrX2pwZWcpIFwKKwkkKGNoZWNrX2xhbWUpIFwKKwkkKGNoZWNrX2xhdykgXAorCSQoY2hlY2tfbGV2ZWwpIFwKKwkkKGNoZWNrX21hdHJvc2thKSBcCisJJChjaGVja19tcGcxMjMpIFwKKwkkKGNoZWNrX211bHRpZmlsZSkgXAorCSQoY2hlY2tfcmVwbGF5Z2FpbikgXAorCSQoY2hlY2tfcnRwKSBcCisJJChjaGVja19ydHBtYW5hZ2VyKSBcCisJJChjaGVja19zaGFwZXdpcGUpIFwKKwkkKGNoZWNrX3NvdXApIFwKKwkkKGNoZWNrX3NwZWN0cnVtKSBcCisJJChjaGVja190YWdsaWIpIFwKKwkkKGNoZWNrX3R3b2xhbWUpIFwKKwkkKGNoZWNrX3VkcCkgXAorCSQoY2hlY2tfdmlkZW9ib3gpIFwKKwkkKGNoZWNrX3ZpZGVvY3JvcCkgXAorCSQoY2hlY2tfdmlkZW9maWx0ZXIpIFwKKwkkKGNoZWNrX3ZpZGVvbWl4ZXIpIFwKKwkkKGNoZWNrX3ZweCkgXAorCSQoY2hlY2tfd2F2ZW5jKSBcCisJJChjaGVja193YXZwYWNrKSBcCisJJChjaGVja193YXZwYXJzZSkgXAorCSQoY2hlY2tfeTRtKSBcCisJJChjaGVja19vcmMpCisKK1ZBTEdSSU5EX1RPX0ZJWCA9IFwKKwllbGVtZW50cy9ydHAtcGF5bG9hZGluZworCitURVNUUyA9ICQoY2hlY2tfUFJPR1JBTVMpCisKK0FNX0NGTEFHUyA9ICQoR1NUX09CSl9DRkxBR1MpICQoR1NUX0NIRUNLX0NGTEFHUykgJChDSEVDS19DRkxBR1MpIFwKKwkkKEdTVF9PUFRJT05fQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpIC1ER1NUX1RFU1RfRklMRVNfUEFUSD0iXCIkKFRFU1RfRklMRVNfRElSRUNUT1JZKVwiIiBcCisJLURHU1RfQ0hFQ0tfVEVTVF9FTlZJUk9OTUVOVF9CRUFDT049IlwiR1NUX1BMVUdJTl9MT0FESU5HX1dISVRFTElTVFwiIiBcCisJLVVHX0RJU0FCTEVfQVNTRVJUIC1VR19ESVNBQkxFX0NBU1RfQ0hFQ0tTICQoUFRIUkVBRF9DRkxBR1MpCitMREFERCA9ICQoR1NUX09CSl9MSUJTKSAkKEdTVF9DSEVDS19MSUJTKSAkKENIRUNLX0xJQlMpCisKKyMgdmFsZ3JpbmQgdGVzdGluZworIyB2aWRlb2Nyb3AgZGlzYWJsZWQgc2luY2UgaXQgdGFrZXMgd2F5IHRvbyBsb25nIGluIHZhbGdyaW5kCitWQUxHUklORF9URVNUU19ESVNBQkxFID0gXAorCWVsZW1lbnRzL3ZpZGVvY3JvcCBcCisJJChWQUxHUklORF9UT19GSVgpCisKK1NVUFBSRVNTSU9OUyA9ICQodG9wX3NyY2RpcikvY29tbW9uL2dzdC5zdXBwICQoc3JjZGlyKS9nc3QtcGx1Z2lucy1nb29kLnN1cHAKKworIyBwYXJzZXIgdW5pdCB0ZXN0IGNvbnZlbmllbmNlIGxpYgorbm9pbnN0X0xUTElCUkFSSUVTID0gbGlicGFyc2VyLmxhCitsaWJwYXJzZXJfbGFfU09VUkNFUyA9IGVsZW1lbnRzL3BhcnNlci5jIGVsZW1lbnRzL3BhcnNlci5oCitsaWJwYXJzZXJfbGFfQ0ZMQUdTID0gXAorCS1JJCh0b3Bfc3JjZGlyKS90ZXN0cy9jaGVjayBcCisJJChBTV9DRkxBR1MpIC1ER1NUX1VTRV9VTlNUQUJMRV9BUEkKKworZWxlbWVudHNfYWFjcGFyc2VfTERBREQgPSBsaWJwYXJzZXIubGEgJChMREFERCkKKworZWxlbWVudHNfYWMzcGFyc2VfTERBREQgPSBsaWJwYXJzZXIubGEgJChMREFERCkKKworZWxlbWVudHNfYW1ycGFyc2VfTERBREQgPSBsaWJwYXJzZXIubGEgJChMREFERCkKKworZWxlbWVudHNfZmxhY3BhcnNlX0xEQUREID0gbGlicGFyc2VyLmxhICQoTERBREQpCisKK2VsZW1lbnRzX2ZsdmRlbXV4X0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX2ZsdmRlbXV4X0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dGFnLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKQorCitlbGVtZW50c19tcGVnYXVkaW9wYXJzZV9MREFERCA9IGxpYnBhcnNlci5sYSAkKExEQUREKQorCitlbGVtZW50c19hc3BlY3RyYXRpb2Nyb3BfTERBREQgPSAkKExEQUREKQorZWxlbWVudHNfYXNwZWN0cmF0aW9jcm9wX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKKworZWxlbWVudHNfYXVkaW9hbXBsaWZ5X0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX2F1ZGlvYW1wbGlmeV9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKQorCitlbGVtZW50c19hdWRpb2NoZWJiYW5kX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX2F1ZGlvY2hlYmJhbmRfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RhdWRpby0kKEdTVF9BUElfVkVSU0lPTikgJChMREFERCkgJChMSUJNKQorCitlbGVtZW50c19hdWRpb2NoZWJsaW1pdF9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19hdWRpb2NoZWJsaW1pdF9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKSAkKExJQk0pCisKK2VsZW1lbnRzX2F1ZGlvZHluYW1pY19DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19hdWRpb2R5bmFtaWNfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RhdWRpby0kKEdTVF9BUElfVkVSU0lPTikgJChMREFERCkKKworZWxlbWVudHNfYXVkaW9lY2hvX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX2F1ZGlvZWNob19MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKQorCitlbGVtZW50c19hdWRpb2ludmVydF9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19hdWRpb2ludmVydF9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKQorCitlbGVtZW50c19hdWRpb3Bhbm9yYW1hX0xEQUREID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEdTVF9CQVNFX0xJQlMpIFwKKwkkKEdTVF9DT05UUk9MTEVSX0xJQlMpICQoTERBREQpCisKK2VsZW1lbnRzX2F1ZGlvcGFub3JhbWFfQ0ZMQUdTID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DT05UUk9MTEVSX0NGTEFHUykgXAorCSQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKKworZWxlbWVudHNfYXVkaW93c2luY2JhbmRfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfYXVkaW93c2luY2JhbmRfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RhdWRpby0kKEdTVF9BUElfVkVSU0lPTikgJChMREFERCkgJChMSUJNKQorCitlbGVtZW50c19hdWRpb3dzaW5jbGltaXRfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfYXVkaW93c2luY2xpbWl0X0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoTERBREQpICQoTElCTSkKKworZWxlbWVudHNfYXV0b2RldGVjdF9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfYXV0b2RldGVjdF9MREFERCA9ICQoR1NUX0JBU0VfTElCUykgJChMREFERCkKKworZWxlbWVudHNfZXF1YWxpemVyX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX2VxdWFsaXplcl9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKSAkKExJQk0pCisKK2VsZW1lbnRzX3JnYW5hbHlzaXNfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfcmdhbmFseXNpc19MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKQorZWxlbWVudHNfcmdsaW1pdGVyX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX3JnbGltaXRlcl9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKQorZWxlbWVudHNfcmd2b2x1bWVfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfcmd2b2x1bWVfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RhdWRpby0kKEdTVF9BUElfVkVSU0lPTikgJChMREFERCkgJChMSUJNKQorCitlbGVtZW50c19ydHBfcGF5bG9hZGluZ19DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfcnRwX3BheWxvYWRpbmdfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RhdWRpby0kKEdTVF9BUElfVkVSU0lPTikgJChHU1RfQkFTRV9MSUJTKSAkKExEQUREKQorCitlbGVtZW50c19zcGVjdHJ1bV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19zcGVjdHJ1bV9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKQorCitlbGVtZW50c19hbHBoYWNvbG9yX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX2FscGhhX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKKworZWxlbWVudHNfZGVpbnRlcmxhY2VfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfZGVpbnRlcmxhY2VfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R2aWRlby0kKEdTVF9BUElfVkVSU0lPTikgJChMREFERCkKKworZWxlbWVudHNfZHRtZl9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSBcCisJJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19kdG1mX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0cnRwLUBHU1RfQVBJX1ZFUlNJT05AIFwKKyAgICAkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoTERBREQpCisKK2VsZW1lbnRzX2RlaW50ZXJsZWF2ZV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19kZWludGVybGVhdmVfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RhdWRpby0kKEdTVF9BUElfVkVSU0lPTikgJChMREFERCkKK2VsZW1lbnRzX2ludGVybGVhdmVfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfaW50ZXJsZWF2ZV9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKQorCitlbGVtZW50c19sZXZlbF9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19sZXZlbF9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKQorCitlbGVtZW50c19pbWFnZWZyZWV6ZV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19pbWFnZWZyZWV6ZV9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEdTVF9CQVNFX0xJQlMpICQoTERBREQpCisKK2VsZW1lbnRzX2pwZWdkZWNfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR0lPX0NGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19qcGVnZGVjX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXBwLSQoR1NUX0FQSV9WRVJTSU9OKSAtbGdzdHBidXRpbHMtJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0JBU0VfTElCUykgJChHSU9fTElCUykgJChMREFERCkKKworZWxlbWVudHNfanBlZ2VuY19DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19qcGVnZW5jX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXBwLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEdTVF9CQVNFX0xJQlMpICQoTERBREQpCisKK2VsZW1lbnRzX21hdHJvc2thbXV4X0xEQUREID0gJChHU1RfQkFTRV9MSUJTKSAkKExEQUREKSAkKExJQk0pCisKK2VsZW1lbnRzX21wZzEyM2F1ZGlvZGVjX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX21wZzEyM2F1ZGlvZGVjX0xEQUREID0gXAorCSQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLUBHU1RfQVBJX1ZFUlNJT05AIC1sZ3N0ZmZ0LUBHU1RfQVBJX1ZFUlNJT05AIFwKKwktbGdzdGFwcC1AR1NUX0FQSV9WRVJTSU9OQCAkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoTERBREQpCisKK2VsZW1lbnRzX211bGF3ZGVjX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgJChBTV9DRkxBR1MpCisKK2VsZW1lbnRzX211bGF3ZW5jX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgJChBTV9DRkxBR1MpCisKK2VsZW1lbnRzX211bHRpZmlsZV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfbXVsdGlmaWxlX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0dmlkZW8tJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0xJQlMpICQoTERBREQpICQoTElCTSkKKworZWxlbWVudHNfc3BsaXRtdXhfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfc3BsaXRtdXhfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RhcHAtJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0xJQlMpICQoTERBREQpICQoTElCTSkKKworZWxlbWVudHNfcXRtdXhfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX3F0bXV4X0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0cGJ1dGlscy1AR1NUX0FQSV9WRVJTSU9OQCBcCisgICAgICAgICAgICAgJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKEdTVF9DSEVDS19MSUJTKQorCitlbGVtZW50c19ydHBiaW5fYnVmZmVyX2xpc3RfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSBcCisJJChXQVJOSU5HX0NGTEFHUykgJChFUlJPUl9DRkxBR1MpICQoR1NUX0NIRUNLX0NGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19ydHBiaW5fYnVmZmVyX2xpc3RfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgXAorICAgICAgICAgICAgIC1sZ3N0cnRwLSQoR1NUX0FQSV9WRVJTSU9OKSBcCisgICAgICAgICAgICAgJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKEdTVF9DSEVDS19MSUJTKSAkKExEQUREKQorZWxlbWVudHNfcnRwYmluX2J1ZmZlcl9saXN0X1NPVVJDRVMgPSBlbGVtZW50cy9ydHBiaW5fYnVmZmVyX2xpc3QuYworCitlbGVtZW50c19ydHBiaW5fQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgXAorCSQoV0FSTklOR19DRkxBR1MpICQoRVJST1JfQ0ZMQUdTKSAkKEdTVF9DSEVDS19DRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfcnRwYmluX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKyAgICAgICAgICAgICAtbGdzdHJ0cC0kKEdTVF9BUElfVkVSU0lPTikgXAorICAgICAgICAgICAgICQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykgJChHU1RfQ0hFQ0tfTElCUykgJChMREFERCkKKworZWxlbWVudHNfcnRwaDI2MV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9CQVNFX0NGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19ydHBoMjYxX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0cnRwLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEdTVF9CQVNFX0xJQlMpICQoTERBREQpCisKK2VsZW1lbnRzX3J0cGgyNjNfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfcnRwaDI2M19MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHJ0cC0kKEdTVF9BUElfVkVSU0lPTikgJChHU1RfQkFTRV9MSUJTKSAkKExEQUREKQorCitlbGVtZW50c19ydHBoMjY0X0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX3J0cGgyNjRfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RhcHAtJChHU1RfQVBJX1ZFUlNJT04pICQoR1NUX0JBU0VfTElCUykgJChMREFERCkKKworZWxlbWVudHNfcnRwbXV4X0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX3J0cG11eF9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHJ0cC0kKEdTVF9BUElfVkVSU0lPTikgJChHU1RfQkFTRV9MSUJTKSAkKExEQUREKQorCitlbGVtZW50c19zb3VwaHR0cHNyY19DRkxBR1MgPSAkKFNPVVBfQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX3NvdXBodHRwc3JjX0xEQUREID0gJChTT1VQX0xJQlMpICQoTERBREQpCisKK2VsZW1lbnRzX3VkcHNpbmtfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoR0lPX0NGTEFHUykKK2VsZW1lbnRzX3VkcHNpbmtfTERBREQgPSAkKExEQUREKSAkKEdJT19MSUJTKQorCitlbGVtZW50c191ZHBzcmNfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoR0lPX0NGTEFHUykKK2VsZW1lbnRzX3VkcHNyY19MREFERCA9ICQoTERBREQpICQoR0lPX0xJQlMpCisKK2VsZW1lbnRzX3ZpZGVvY3JvcF9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAkKEdTVF9CQVNFX0xJQlMpIC1sZ3N0dmlkZW8tJChHU1RfQVBJX1ZFUlNJT04pICQoTERBREQpCitlbGVtZW50c192aWRlb2Nyb3BfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKKworZWxlbWVudHNfdmlkZW9maWx0ZXJfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorZWxlbWVudHNfdmlkZW9maWx0ZXJfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R2aWRlby0kKEdTVF9BUElfVkVSU0lPTikgJChMREFERCkKKworZWxlbWVudHNfcnRwaml0dGVyYnVmZmVyX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX3J0cGppdHRlcmJ1ZmZlcl9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHJ0cC0kKEdTVF9BUElfVkVSU0lPTikgJChMREFERCkKKworZWxlbWVudHNfcnRwcnR4X0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX3J0cHJ0eF9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHJ0cC0kKEdTVF9BUElfVkVSU0lPTikgJChMREFERCkKKworZWxlbWVudHNfcnRwc2Vzc2lvbl9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19ydHBzZXNzaW9uX0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpICQoR1NUX05FVF9MSUJTKSAtbGdzdHJ0cC0kKEdTVF9BUElfVkVSU0lPTikgJChHSU9fTElCUykgJChMREFERCkKKworZWxlbWVudHNfcnRwY29sbGlzaW9uX0NGTEFHUyA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKK2VsZW1lbnRzX3J0cGNvbGxpc2lvbl9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAkKEdTVF9ORVRfTElCUykgLWxnc3RydHAtJChHU1RfQVBJX1ZFUlNJT04pICQoR0lPX0xJQlMpICQoTERBREQpCisKK2VsZW1lbnRzX3J0cGF1eF9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19ydHBhdXhfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RydHAtJChHU1RfQVBJX1ZFUlNJT04pICQoTERBREQpCisKK2VsZW1lbnRzX3J0cGJ1bmRsZV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c19ydHBidW5kbGVfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RydHAtJChHU1RfQVBJX1ZFUlNJT04pICQoTERBREQpCisKKyMgRklYTUU6IGNvbmZpZ3VyZSBzaG91bGQgY2hlY2sgZm9yIGdkay1waXhidWYgbm90IGd0aworIyBvbmx5IG5lZWQgdmlkZW8uaCBoZWFkZXIsIG5vdCB0aGUgbGliCitlbGVtZW50c19nZGtwaXhidWZzaW5rX0NGTEFHUyA9IFwKKwkkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpICQoR0RLX1BJWEJVRl9DRkxBR1MpCitlbGVtZW50c19nZGtwaXhidWZzaW5rX0xEQUREID0gXAorCSQoTERBREQpICQoR0RLX1BJWEJVRl9MSUJTKQorCitlbGVtZW50c192aWRlb21peGVyX0xEQUREID0gJChMREFERCkgICQoR1NUX0JBU0VfTElCUykKK2VsZW1lbnRzX3ZpZGVvbWl4ZXJfQ0ZMQUdTID0gJChHU1RfQkFTRV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0NGTEFHUykKKworcGlwZWxpbmVzX2ZsYWNkZWNfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChDRkxBR1MpICQoQU1fQ0ZMQUdTKQorcGlwZWxpbmVzX2ZsYWNkZWNfTERBREQgID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0YXVkaW8tJChHU1RfQVBJX1ZFUlNJT04pICQoTERBREQpCisKK2VsZW1lbnRzX3ZwOWVuY19DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitlbGVtZW50c192cDllbmNfTERBREQgPSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3R2aWRlby0kKEdTVF9BUElfVkVSU0lPTikgJChMREFERCkKKworcGlwZWxpbmVzX3dhdmVuY19DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCitwaXBlbGluZXNfd2F2ZW5jX0xEQUREICA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGF1ZGlvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKExEQUREKQorCitwaXBlbGluZXNfd2F2cGFja19MREFERCA9ICQoTERBREQpICQoR1NUX0JBU0VfTElCUykKK3BpcGVsaW5lc193YXZwYWNrX0NGTEFHUyA9ICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9DRkxBR1MpCisKK29yY19kZWludGVybGFjZV9DRkxBR1MgPSAkKE9SQ19DRkxBR1MpCitvcmNfZGVpbnRlcmxhY2VfTERBREQgPSAkKE9SQ19MSUJTKSAtbG9yYy10ZXN0LTAuNAorbm9kaXN0X29yY19kZWludGVybGFjZV9TT1VSQ0VTID0gb3JjL2RlaW50ZXJsYWNlLmMKK29yY192aWRlb21peGVyX0NGTEFHUyA9ICQoT1JDX0NGTEFHUykKK29yY192aWRlb21peGVyX0xEQUREID0gJChPUkNfTElCUykgLWxvcmMtdGVzdC0wLjQKK25vZGlzdF9vcmNfdmlkZW9taXhlcl9TT1VSQ0VTID0gb3JjL3ZpZGVvbWl4ZXIuYworb3JjX3ZpZGVvYm94X0NGTEFHUyA9ICQoT1JDX0NGTEFHUykKK29yY192aWRlb2JveF9MREFERCA9ICQoT1JDX0xJQlMpIC1sb3JjLXRlc3QtMC40Citub2Rpc3Rfb3JjX3ZpZGVvYm94X1NPVVJDRVMgPSBvcmMvdmlkZW9ib3guYworCitvcmMvZGVpbnRlcmxhY2UuYzogJCh0b3Bfc3JjZGlyKS9nc3QvZGVpbnRlcmxhY2UvdHZ0aW1lLm9yYworCSQoTUtESVJfUCkgb3JjLworCSQoT1JDQykgLS10ZXN0IC1vICRAICQ8CisKK29yYy92aWRlb21peGVyLmM6ICQodG9wX3NyY2RpcikvZ3N0L3ZpZGVvbWl4ZXIvdmlkZW9taXhlcm9yYy5vcmMKKwkkKE1LRElSX1ApIG9yYy8KKwkkKE9SQ0MpIC0tdGVzdCAtbyAkQCAkPAorCitvcmMvdmlkZW9ib3guYzogJCh0b3Bfc3JjZGlyKS9nc3QvdmlkZW9ib3gvZ3N0dmlkZW9ib3hvcmMub3JjCisJJChNS0RJUl9QKSBvcmMvCisJJChPUkNDKSAtLXRlc3QgLW8gJEAgJDwKKworZGlzdGNsZWFuLWxvY2FsLW9yYzoKKwlybSAtcmYgb3JjCisKK0VYVFJBX0RJU1QgPSBcCisJZ3N0LXBsdWdpbnMtZ29vZC5zdXBwCVwKKwllbGVtZW50cy9xdGRlbXV4LmgKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzLy5naXRpZ25vcmUgYi90ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MzI0NzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsODUgQEAKKy5kaXJzdGFtcAorYWFjcGFyc2UKK2FjM3BhcnNlCithbHBoYQorYWxwaGFjb2xvcgorYW1ycGFyc2UKK2FwZXYybXV4Cithc3BlY3RyYXRpb2Nyb3AKK2F1ZGlvYW1wbGlmeQorYXVkaW9jaGViYmFuZAorYXVkaW9jaGVibGltaXQKK2F1ZGlvZWNobworYXVkaW93c2luY2JhbmQKK2F1ZGlvd3NpbmNsaW1pdAorYXVkaW9keW5hbWljCithdWRpb2ZpcmZpbHRlcgorYXVkaW9pbnZlcnQKK2F1ZGlvaWlyZmlsdGVyCithdWRpb3Bhbm9yYW1hCithdXRvZGV0ZWN0CithdmltdXgKK2F2aXN1YnRpdGxlCitjYXBzc2V0dGVyCitkZWludGVybGFjZQorZGVpbnRlcmxlYXZlCitkdG1mCitlcXVhbGl6ZXIKK2dka3BpeGJ1Zm92ZXJsYXkKK2dka3BpeGJ1ZnNpbmsKK2ZsYWNwYXJzZQorZmx2ZGVtdXgKK2Zsdm11eAoraWN5ZGVtdXgKK2lkM2RlbXV4CitpZDN2Mm11eAoraW1hZ2VmcmVlemUKK2ludGVybGVhdmUKK2pwZWdkZWMKK2pwZWdlbmMKK2xldmVsCittYXRyb3NrYWRlbXV4CittYXRyb3NrYW11eAorbWF0cm9za2FwYXJzZQorbXBlZ2F1ZGlvcGFyc2UKK21wZzEyM2F1ZGlvZGVjCittdWxhd2RlYworbXVsYXdlbmMKK211bHRpZmlsZQorcXRkZW11eAorcXRtdXgKK3JnYW5hbHlzaXMKK3JnbGltaXRlcgorcmd2b2x1bWUKK3J0cC1wYXlsb2FkaW5nCitydHBhdXgKK3J0cGJpbgorcnRwYmluX2J1ZmZlcl9saXN0CitydHBidW5kbGUKK3J0cGNvbGxpc2lvbgorcnRwaDI2MQorcnRwaDI2MworcnRwaDI2NAorcnRwaml0dGVyYnVmZmVyCitydHBzZXNzaW9uCitydHBtdXgKK3J0cHJ0eAorcnRwdnA5CitzaGFwZXdpcGUKK3NvdXBodHRwc3JjCitzcGVjdHJ1bQorc3BsaXRtdXgKK3VkcHNpbmsKK3VkcHNyYwordmlkZW9jcm9wCit2aWRlb2JveAordmlkZW9maWx0ZXIKK3ZpZGVvbWl4ZXIKK3ZwOGRlYwordnA4ZW5jCit2cDllbmMKK3dhdnBhY2tkZWMKK3dhdnBhcnNlCit3YXZwYWNrZW5jCit3YXZwYWNrcGFyc2UKK3k0bWVuYwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvYWFjcGFyc2UuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2FhY3BhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE5ZmQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2FhY3BhcnNlLmMKQEAgLTAsMCArMSwzMTggQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIGFhY3BhcnNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3Q6IFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9jaGVjay5oPgorI2luY2x1ZGUgInBhcnNlci5oIgorCisjZGVmaW5lIFNSQ19DQVBTX0NEQVRBICJhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIGZyYW1lZD0oYm9vbGVhbilmYWxzZSwgY29kZWNfZGF0YT0oYnVmZmVyKTExOTAiCisjZGVmaW5lIFNSQ19DQVBTX1RNUEwgICJhdWRpby9tcGVnLCBmcmFtZWQ9KGJvb2xlYW4pZmFsc2UsIG1wZWd2ZXJzaW9uPShpbnQpezIsNH0iCisjZGVmaW5lIFNSQ19DQVBTX1JBVyAgICJhdWRpby9tcGVnLCBtcGVndmVyc2lvbj0oaW50KTQsIGZyYW1lZD0oYm9vbGVhbil0cnVlLCBzdHJlYW0tZm9ybWF0PShzdHJpbmcpcmF3LCByYXRlPShpbnQpNDgwMDAsIGNoYW5uZWxzPShpbnQpMiwgY29kZWNfZGF0YT0oYnVmZmVyKTExOTAiCisKKyNkZWZpbmUgU0lOS19DQVBTIFwKKyAgICAiYXVkaW8vbXBlZywgZnJhbWVkPShib29sZWFuKXRydWUiCisjZGVmaW5lIFNJTktfQ0FQU19NUEVHMiBcCisgICAgImF1ZGlvL21wZWcsIGZyYW1lZD0oYm9vbGVhbil0cnVlLCBtcGVndmVyc2lvbj0yLCByYXRlPTQ4MDAwLCBjaGFubmVscz0yIgorI2RlZmluZSBTSU5LX0NBUFNfTVBFRzQgXAorICAgICJhdWRpby9tcGVnLCBmcmFtZWQ9KGJvb2xlYW4pdHJ1ZSwgbXBlZ3ZlcnNpb249NCwgcmF0ZT05NjAwMCwgY2hhbm5lbHM9MiIKKyNkZWZpbmUgU0lOS19DQVBTX1RNUEwgICJhdWRpby9tcGVnLCBmcmFtZWQ9KGJvb2xlYW4pdHJ1ZSwgbXBlZ3ZlcnNpb249KGludCl7Miw0fSIKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChTSU5LX0NBUFNfVE1QTCkKKyAgICApOworCitHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFNSQ19DQVBTX1RNUEwpCisgICAgKTsKKworLyogc29tZSBkYXRhICovCitzdGF0aWMgZ3VpbnQ4IGFkaWZfaGVhZGVyW10gPSB7CisgICdBJywgJ0QnLCAnSScsICdGJworfTsKKworc3RhdGljIGd1aW50OCBhZHRzX2ZyYW1lX21wZWcyW10gPSB7CisgIDB4ZmYsIDB4ZjksIDB4NGMsIDB4ODAsIDB4MDEsIDB4ZmYsIDB4ZmMsIDB4MjEsIDB4MTAsIDB4ZDMsIDB4MjAsIDB4MGMsCisgIDB4MzIsIDB4MDAsIDB4YzcKK307CisKK3N0YXRpYyBndWludDggYWR0c19mcmFtZV9tcGVnNFtdID0geworICAweGZmLCAweGYxLCAweDRjLCAweDgwLCAweDAxLCAweGZmLCAweGZjLCAweDIxLCAweDEwLCAweGQzLCAweDIwLCAweDBjLAorICAweDMyLCAweDAwLCAweGM3Cit9OworCitzdGF0aWMgZ3VpbnQ4IGdhcmJhZ2VfZnJhbWVbXSA9IHsKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZgorfTsKKworc3RhdGljIGd1aW50OCByYXdfZnJhbWVfc2hvcnRbXSA9IHsKKyAgMHgyNywgMHgwMCwgMHgwMywgMHgyMCwgMHg2NCwgMHgxYworfTsKKworLyoKKyAqIFRlc3QgaWYgdGhlIHBhcnNlciBwdXNoZXMgZGF0YSB3aXRoIEFESUYgaGVhZGVyIHByb3Blcmx5IGFuZCBkZXRlY3RzIHRoZQorICogc3RyZWFtIHRvIE1QRUc0IHByb3Blcmx5LgorICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9hZGlmX25vcm1hbCkKK3sKKyAgR3N0UGFyc2VyVGVzdCBwdGVzdDsKKworICAvKiBBRElGIGhlYWRlciAqLworICBnc3RfcGFyc2VyX3Rlc3RfaW5pdCAoJnB0ZXN0LCBhZGlmX2hlYWRlciwgc2l6ZW9mIChhZGlmX2hlYWRlciksIDEpOworICAvKiB3ZWxsLCBubyBnYXJiYWdlLCBmb2xsb3dlZCBieSByYW5kb20gZGF0YSAqLworICBwdGVzdC5zZXJpZXNbMl0uc2l6ZSA9IDEwMDsKKyAgcHRlc3Quc2VyaWVzWzJdLm51bSA9IDM7CisgIC8qIGFuZCB3ZSBkbyBub3QgcmVhbGx5IGV4cGVjdCBvdXRwdXQgZnJhbWVzICovCisgIHB0ZXN0LmZyYW1lZCA9IEZBTFNFOworICAvKiBDaGVjayB0aGF0IHRoZSBuZWdvdGlhdGVkIGNhcHMgYXJlIGFzIGV4cGVjdGVkICovCisgIC8qIEZvciBBRElGIHBhcnNlciBhc3N1bWVzIHRoYXQgZGF0YSBpcyBhbHdheXMgdmVyc2lvbiA0ICovCisgIHB0ZXN0LnNpbmtfY2FwcyA9CisgICAgICBnc3RfY2Fwc19mcm9tX3N0cmluZyAoU0lOS19DQVBTX01QRUc0ICIsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylhZGlmIik7CisKKyAgZ3N0X3BhcnNlcl90ZXN0X3J1biAoJnB0ZXN0LCBOVUxMKTsKKworICBnc3RfY2Fwc191bnJlZiAocHRlc3Quc2lua19jYXBzKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX2FkdHNfbm9ybWFsKQoreworICBnc3RfcGFyc2VyX3Rlc3Rfbm9ybWFsIChhZHRzX2ZyYW1lX21wZWc0LCBzaXplb2YgKGFkdHNfZnJhbWVfbXBlZzQpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX2FkdHNfZHJhaW5fc2luZ2xlKQoreworICBnc3RfcGFyc2VyX3Rlc3RfZHJhaW5fc2luZ2xlIChhZHRzX2ZyYW1lX21wZWc0LCBzaXplb2YgKGFkdHNfZnJhbWVfbXBlZzQpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX2FkdHNfZHJhaW5fZ2FyYmFnZSkKK3sKKyAgZ3N0X3BhcnNlcl90ZXN0X2RyYWluX2dhcmJhZ2UgKGFkdHNfZnJhbWVfbXBlZzQsIHNpemVvZiAoYWR0c19mcmFtZV9tcGVnNCksCisgICAgICBnYXJiYWdlX2ZyYW1lLCBzaXplb2YgKGdhcmJhZ2VfZnJhbWUpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX2FkdHNfc3BsaXQpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9zcGxpdCAoYWR0c19mcmFtZV9tcGVnNCwgc2l6ZW9mIChhZHRzX2ZyYW1lX21wZWc0KSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9hZHRzX3NraXBfZ2FyYmFnZSkKK3sKKyAgZ3N0X3BhcnNlcl90ZXN0X3NraXBfZ2FyYmFnZSAoYWR0c19mcmFtZV9tcGVnNCwgc2l6ZW9mIChhZHRzX2ZyYW1lX21wZWc0KSwKKyAgICAgIGdhcmJhZ2VfZnJhbWUsIHNpemVvZiAoZ2FyYmFnZV9mcmFtZSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworLyoKKyAqIFRlc3QgaWYgdGhlIHNyYyBjYXBzIGFyZSBzZXQgYWNjb3JkaW5nIHRvIHN0cmVhbSBmb3JtYXQgKE1QRUcgdmVyc2lvbikuCisgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX2FkdHNfZGV0ZWN0X21wZWdfdmVyc2lvbikKK3sKKyAgZ3N0X3BhcnNlcl90ZXN0X291dHB1dF9jYXBzIChhZHRzX2ZyYW1lX21wZWcyLCBzaXplb2YgKGFkdHNfZnJhbWVfbXBlZzIpLAorICAgICAgTlVMTCwKKyAgICAgIFNJTktfQ0FQU19NUEVHMgorICAgICAgIiwgc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWFkdHMsIGxldmVsPShzdHJpbmcpMiwgcHJvZmlsZT0oc3RyaW5nKWxjIik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyoKKyAqIFRlc3QgaWYgdGhlIHBhcnNlciBjb3JyZWN0bHkgaGFuZGxlcyBzaG9ydCByYXcgZnJhbWVzIGFuZCBkb2Vzbid0CisgKiBjb25jYXRlbmF0ZSB0aGVtLgorICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9yYXdfc2hvcnQpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJhYWNwYXJzZSIpOworICBHc3RCdWZmZXIgKmluX2J1ZjsKKworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkaXNhYmxlLXBhc3N0aHJvdWdoIiwgVFJVRSwgTlVMTCk7CisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgsIFNSQ19DQVBTX1JBVyk7CisKKyAgaW5fYnVmID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksCisgICAgICByYXdfZnJhbWVfc2hvcnQsIHNpemVvZiByYXdfZnJhbWVfc2hvcnQsIDAsIHNpemVvZiByYXdfZnJhbWVfc2hvcnQsCisgICAgICBOVUxMLCBOVUxMKTsKKworICBnc3RfaGFybmVzc19wdXNoIChoLCBnc3RfYnVmZmVyX3JlZiAoaW5fYnVmKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9oYXJuZXNzX2J1ZmZlcnNfcmVjZWl2ZWQgKGgpLCAxKTsKKworICBnc3RfaGFybmVzc19wdXNoIChoLCBpbl9idWYpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfaGFybmVzc19idWZmZXJzX3JlY2VpdmVkIChoKSwgMik7CisKKyAgZ3N0X2hhcm5lc3NfcHVzaF9ldmVudCAoaCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfaGFybmVzc19idWZmZXJzX3JlY2VpdmVkIChoKSwgMik7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKyNkZWZpbmUgc3RydWN0dXJlX2dldF9pbnQocyxmKSBcCisgICAgKGdfdmFsdWVfZ2V0X2ludChnc3Rfc3RydWN0dXJlX2dldF92YWx1ZShzLGYpKSkKKyNkZWZpbmUgZmFpbF91bmxlc3Nfc3RydWN0dXJlX2ZpZWxkX2ludF9lcXVhbHMocyxmaWVsZCxudW0pIFwKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChzdHJ1Y3R1cmVfZ2V0X2ludChzLGZpZWxkKSwgbnVtKQorLyoKKyAqIFRlc3QgaWYgdGhlIHBhcnNlciBoYW5kbGVzIHJhdyBzdHJlYW0gYW5kIGNvZGVjX2RhdGEgaW5mbyBwcm9wZXJseS4KKyAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfaGFuZGxlX2NvZGVjX2RhdGEpCit7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgY29uc3QgZ2NoYXIgKnN0cmVhbV9mb3JtYXQ7CisKKyAgLyogUHVzaCByYW5kb20gZGF0YS4gSXQgc2hvdWxkIGdldCB0aHJvdWdoIHNpbmNlIHRoZSBwYXJzZXIgc2hvdWxkIGJlCisgICAqIGluaXRpYWxpemVkIGJlY2F1c2UgaXQgZ290IGNvZGVjX2RhdGEgaW4gdGhlIGNhcHMgKi8KKyAgY2FwcyA9IGdzdF9wYXJzZXJfdGVzdF9nZXRfb3V0cHV0X2NhcHMgKE5VTEwsIDEwMCwgU1JDX0NBUFNfQ0RBVEEpOworICBmYWlsX3VubGVzcyAoY2FwcyAhPSBOVUxMKTsKKworICAvKiBDaGVjayB0aGF0IHRoZSBuZWdvdGlhdGVkIGNhcHMgYXJlIGFzIGV4cGVjdGVkICovCisgIC8qIFdoZW4gY29kZWNfZGF0YSBpcyBwcmVzZW50LCBwYXJzZXIgYXNzdW1lcyB0aGF0IGRhdGEgaXMgdmVyc2lvbiA0ICovCisgIEdTVF9MT0cgKCJhYWMgb3V0cHV0IGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgImF1ZGlvL21wZWciKSk7CisgIGZhaWxfdW5sZXNzX3N0cnVjdHVyZV9maWVsZF9pbnRfZXF1YWxzIChzLCAibXBlZ3ZlcnNpb24iLCA0KTsKKyAgZmFpbF91bmxlc3Nfc3RydWN0dXJlX2ZpZWxkX2ludF9lcXVhbHMgKHMsICJjaGFubmVscyIsIDIpOworICBmYWlsX3VubGVzc19zdHJ1Y3R1cmVfZmllbGRfaW50X2VxdWFscyAocywgInJhdGUiLCA0ODAwMCk7CisgIGZhaWxfdW5sZXNzIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgImNvZGVjX2RhdGEiKSk7CisgIGZhaWxfdW5sZXNzIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgInN0cmVhbS1mb3JtYXQiKSk7CisgIHN0cmVhbV9mb3JtYXQgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJzdHJlYW0tZm9ybWF0Iik7CisgIGZhaWxfdW5sZXNzIChzdHJjbXAgKHN0cmVhbV9mb3JtYXQsICJyYXciKSA9PSAwKTsKKworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfcHJveHlfY29uc3RyYWludHMpCit7CisgIEdzdENhcHMgKmNhcHMsICpyZXN1bHRjYXBzOworICBHc3RFbGVtZW50ICpwYXJzZSwgKmZpbHRlcjsKKyAgR3N0UGFkICpzaW5rcGFkOworICBHc3RTdHJ1Y3R1cmUgKnM7CisKKyAgcGFyc2UgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhYWNwYXJzZSIsIE5VTEwpOworICBmaWx0ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJjYXBzZmlsdGVyIiwgTlVMTCk7CisKKyAgLyogY29uc3RyYWludCBvbiByYXRlIGFuZCB2ZXJzaW9uICovCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoImF1ZGlvL21wZWcsbXBlZ3ZlcnNpb249MixyYXRlPTQ0MTAwIik7CisgIGdfb2JqZWN0X3NldCAoZmlsdGVyLCAiY2FwcyIsIGNhcHMsIE5VTEwpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgZ3N0X2VsZW1lbnRfbGluayAocGFyc2UsIGZpbHRlcik7CisKKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChwYXJzZSwgInNpbmsiKTsKKyAgY2FwcyA9IGdzdF9wYWRfcXVlcnlfY2FwcyAoc2lua3BhZCwgTlVMTCk7CisgIEdTVF9MT0cgKCJjYXBzICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfZ2V0X3NpemUgKGNhcHMpID09IDEpOworCisgIC8qIGdldGNhcHMgc2hvdWxkIHByb3h5IHRoZSByYXRlIGNvbnN0cmFpbnQgKi8KKyAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgImF1ZGlvL21wZWciKSk7CisgIGZhaWxfdW5sZXNzX3N0cnVjdHVyZV9maWVsZF9pbnRfZXF1YWxzIChzLCAicmF0ZSIsIDQ0MTAwKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIC8qIHNob3VsZCBhY2NlcHQgd2l0aG91dCB0aGUgY29uc3RyYWludCAqLworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKCJhdWRpby9tcGVnLG1wZWd2ZXJzaW9uPTIiKTsKKyAgcmVzdWx0Y2FwcyA9IGdzdF9wYWRfcXVlcnlfY2FwcyAoc2lua3BhZCwgY2Fwcyk7CisgIGZhaWxfaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChyZXN1bHRjYXBzKSk7CisgIGdzdF9jYXBzX3VucmVmIChyZXN1bHRjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIC8qIHNob3VsZCBub3QgYWNjZXB0IHdpdGggY29uZmxpY3RpbmcgdmVyc2lvbiAqLworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKCJhdWRpby9tcGVnLG1wZWd2ZXJzaW9uPTQiKTsKKyAgcmVzdWx0Y2FwcyA9IGdzdF9wYWRfcXVlcnlfY2FwcyAoc2lua3BhZCwgY2Fwcyk7CisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19pc19lbXB0eSAocmVzdWx0Y2FwcykpOworICBnc3RfY2Fwc191bnJlZiAocmVzdWx0Y2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChmaWx0ZXIpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYXJzZSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2FhY3BhcnNlX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImFhY3BhcnNlIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICAvKiBpbml0IHRlc3QgY29udGV4dCAqLworICBjdHhfZmFjdG9yeSA9ICJhYWNwYXJzZSI7CisgIGN0eF9zaW5rX3RlbXBsYXRlID0gJnNpbmt0ZW1wbGF0ZTsKKyAgY3R4X3NyY190ZW1wbGF0ZSA9ICZzcmN0ZW1wbGF0ZTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgLyogQURJRiB0ZXN0cyAqLworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfYWRpZl9ub3JtYWwpOworCisgIC8qIEFEVFMgdGVzdHMgKi8KKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX2FkdHNfbm9ybWFsKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX2FkdHNfZHJhaW5fc2luZ2xlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX2FkdHNfZHJhaW5fZ2FyYmFnZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9hZHRzX3NwbGl0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX2FkdHNfc2tpcF9nYXJiYWdlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX2FkdHNfZGV0ZWN0X21wZWdfdmVyc2lvbik7CisKKyAgLyogUmF3IHRlc3RzICovCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9yYXdfc2hvcnQpOworCisgIC8qIE90aGVyIHRlc3RzICovCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9oYW5kbGVfY29kZWNfZGF0YSk7CisKKyAgLyogY2FwcyB0ZXN0cyAqLworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfcHJveHlfY29uc3RyYWludHMpOworCisgIHJldHVybiBzOworfQorCisKKy8qCisgKiBUT0RPOgorICogICAtIEJvdGggcHVzaC0gYW5kIHB1bGwtbW9kZXMgbmVlZCB0byBiZSB0ZXN0ZWQKKyAqICAgICAgKiBQdWxsLW1vZGUgJiBFT1MKKyAqLworR1NUX0NIRUNLX01BSU4gKGFhY3BhcnNlKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2FjM3BhcnNlLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hYzNwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYmU1OWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hYzNwYXJzZS5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBhYzNwYXJzZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0OiBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlICJwYXJzZXIuaCIKKworI2RlZmluZSBTUkNfQ0FQU19UTVBMICAgImF1ZGlvL3gtYWMzLCBmcmFtZWQ9KGJvb2xlYW4pZmFsc2UiCisjZGVmaW5lIFNJTktfQ0FQU19UTVBMICAiYXVkaW8veC1hYzMsIGZyYW1lZD0oYm9vbGVhbil0cnVlIgorCitHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFNJTktfQ0FQU19UTVBMKQorICAgICk7CisKK0dzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoU1JDX0NBUFNfVE1QTCkKKyAgICApOworCisvKiBzb21lIGRhdGEgKi8KKworc3RhdGljIGd1aW50OCBhYzNfZnJhbWVbNTEyXSA9IHsKKyAgMHgwYiwgMHg3NywgMHhiNiwgMHhhOCwgMHgxMCwgMHg0MCwgMHgyZiwgMHg4NCwKKyAgMHgyOSwgMHhjYiwgMHhmZSwgMHg3NSwgMHg3YywgMHhmOSwgMHhmMywgMHhlNywKKyAgMHhjZiwgMHg5ZiwgMHgzZSwgMHg3YywgMHhmOSwgMHhmMywgMHhlNywgMHhjZiwKKyAgMHg5ZiwgMHgzZSwgMHg3YywgMHhmOSwgMHhmMywgMHhlNywgMHhjZiwgMHg5ZiwKKyAgMHgzZSwgMHg3YywgMHhmOSwgMHhmMywgMHhlNywgMHhjZiwgMHg5ZiwgMHgzZSwKKyAgMHg3YywgMHhmOSwgMHhmMywgMHhlNywgMHhjZiwgMHg5ZiwgMHgzZSwgMHg3YywKKyAgMHhmOSwgMHhmMywgMHhlNywgMHhjZiwgMHg5ZiwgMHgzZSwgMHg3YywgMHhmOSwKKyAgMHhmMywgMHhlNywgMHhjZiwgMHg5ZiwgMHgzZSwgMHg3YywgMHhmOSwgMHhmMywKKyAgMHhlNywgMHhjZiwgMHg5ZiwgMHgzZSwgMHg3YywgMHhmOSwgMHhmMywgMHhlNywKKyAgMHhjZiwgMHg5ZiwgMHgzZSwgMHgzMiwgMHhkMywgMHhmZiwgMHhjMCwgMHgwNiwKKyAgMHhlOSwgMHg0MCwgMHgwMCwgMHg2ZSwgMHg5NCwgMHgwMCwgMHgwNiwgMHhlOSwKKyAgMHg0MCwgMHgwMCwgMHg2ZSwgMHg5NCwgMHgwMCwgMHgwNiwgMHhlOSwgMHg0MCwKKyAgMHgwMCwgMHg2ZSwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKK307CisKK3N0YXRpYyBndWludDggZ2FyYmFnZV9mcmFtZVtdID0geworICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmCit9OworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX25vcm1hbCkKK3sKKyAgZ3N0X3BhcnNlcl90ZXN0X25vcm1hbCAoYWMzX2ZyYW1lLCBzaXplb2YgKGFjM19mcmFtZSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfZHJhaW5fc2luZ2xlKQoreworICBnc3RfcGFyc2VyX3Rlc3RfZHJhaW5fc2luZ2xlIChhYzNfZnJhbWUsIHNpemVvZiAoYWMzX2ZyYW1lKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9kcmFpbl9nYXJiYWdlKQoreworICBnc3RfcGFyc2VyX3Rlc3RfZHJhaW5fZ2FyYmFnZSAoYWMzX2ZyYW1lLCBzaXplb2YgKGFjM19mcmFtZSksCisgICAgICBnYXJiYWdlX2ZyYW1lLCBzaXplb2YgKGdhcmJhZ2VfZnJhbWUpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX3NwbGl0KQoreworICBnc3RfcGFyc2VyX3Rlc3Rfc3BsaXQgKGFjM19mcmFtZSwgc2l6ZW9mIChhYzNfZnJhbWUpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX3NraXBfZ2FyYmFnZSkKK3sKKyAgZ3N0X3BhcnNlcl90ZXN0X3NraXBfZ2FyYmFnZSAoYWMzX2ZyYW1lLCBzaXplb2YgKGFjM19mcmFtZSksCisgICAgICBnYXJiYWdlX2ZyYW1lLCBzaXplb2YgKGdhcmJhZ2VfZnJhbWUpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX2RldGVjdF9zdHJlYW0pCit7CisgIGdzdF9wYXJzZXJfdGVzdF9vdXRwdXRfY2FwcyAoYWMzX2ZyYW1lLCBzaXplb2YgKGFjM19mcmFtZSksCisgICAgICBOVUxMLCBTSU5LX0NBUFNfVE1QTCAiLGNoYW5uZWxzPTEscmF0ZT00ODAwMCxhbGlnbm1lbnQ9ZnJhbWUiKTsKK30KKworR1NUX0VORF9URVNUOworCisKK3N0YXRpYyBTdWl0ZSAqCithYzNwYXJzZV9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJhYzNwYXJzZSIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgLyogaW5pdCB0ZXN0IGNvbnRleHQgKi8KKyAgY3R4X2ZhY3RvcnkgPSAiYWMzcGFyc2UiOworICBjdHhfc2lua190ZW1wbGF0ZSA9ICZzaW5rdGVtcGxhdGU7CisgIGN0eF9zcmNfdGVtcGxhdGUgPSAmc3JjdGVtcGxhdGU7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9ub3JtYWwpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfZHJhaW5fc2luZ2xlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX2RyYWluX2dhcmJhZ2UpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2Vfc3BsaXQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2Vfc2tpcF9nYXJiYWdlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX2RldGVjdF9zdHJlYW0pOworCisgIHJldHVybiBzOworfQorCisKKy8qCisgKiBUT0RPOgorICogICAtIEJvdGggcHVzaC0gYW5kIHB1bGwtbW9kZXMgbmVlZCB0byBiZSB0ZXN0ZWQKKyAqICAgICAgKiBQdWxsLW1vZGUgJiBFT1MKKyAqLworR1NUX0NIRUNLX01BSU4gKGFjM3BhcnNlKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2FscGhhLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hbHBoYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMDNiYzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hbHBoYS5jCkBAIC0wLDAgKzEsMjY1IEBACisvKiBHU3RyZWFtZXIgdW5pdCB0ZXN0IGZvciB0aGUgYWxwaGEgZWxlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSYXZpIEtpcmFuIEsgTiA8cmF2aS5raXJhbkBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKworR3N0UGFkICpzcmNwYWQsICpzaW5rcGFkOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgiQVlVViIpKQorICAgICk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBBWVVWLCAiCisgICAgICAgICAgICAiQVJHQiwgQkdSQSwgQUJHUiwgUkdCQSwgWTQ0NCwgeFJHQiwgQkdSeCwgeEJHUiwgIgorICAgICAgICAgICAgIlJHQngsIFJHQiwgQkdSLCBZNDJCLCBZVVkyLCBZVllVLCBVWVZZLCBJNDIwLCBZVjEyLCBZNDFCIH0gIikpCisgICAgKTsKKworCit0eXBlZGVmIGVudW0KK3sKKyAgRklMTF9HUkVFTiwKKyAgRklMTF9CTFVFCit9CitGaWxsQ29sb3I7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX2FscGhhICh2b2lkKQoreworICBHc3RFbGVtZW50ICphbHBoYTsKKworICBhbHBoYSA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgiYWxwaGEiKTsKKyAgc3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKGFscGhhLCAmc3JjdGVtcGxhdGUpOworICBzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChhbHBoYSwgJnNpbmt0ZW1wbGF0ZSk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNpbmtwYWQsIFRSVUUpOworCisgIHJldHVybiBhbHBoYTsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfYWxwaGEgKEdzdEVsZW1lbnQgKiBhbHBoYSkKK3sKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzaW5rcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkIChhbHBoYSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoYWxwaGEpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAoYWxwaGEpOworfQorCisjZGVmaW5lIFdJRFRIIDMKKyNkZWZpbmUgSEVJR0hUIDQKKworc3RhdGljIEdzdENhcHMgKgorY3JlYXRlX2NhcHNfcmdiYTMyICh2b2lkKQoreworICBHc3RDYXBzICpjYXBzOworCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1yYXciLAorICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgV0lEVEgsCisgICAgICAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgSEVJR0hULAorICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLCAwLCAxLAorICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJSR0JBIiwgTlVMTCk7CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorY3JlYXRlX2J1ZmZlcl9yZ2JhMzIgKEZpbGxDb2xvciBjb2xvcikKK3sKKyAgZ3VpbnQ4IHJnYmEzMl9pbWdbSEVJR0hUICogV0lEVEggKiA0XTsKKyAgZ3VpbnQzMiAqcmdiYTMyID0gKGd1aW50MzIgKikgcmdiYTMyX2ltZzsKKworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGd1aW50MzIgcmdiYV9jb2w7CisgIGludCBpOworCisgIGlmIChjb2xvciA9PSBGSUxMX0dSRUVOKQorICAgIHJnYmFfY29sID0gMHhmZjAwZmYwMDsgICAgICAvKiBHUkVFTiAqLworICBlbHNlCisgICAgcmdiYV9jb2wgPSAweGZmZmYwMDAwOyAgICAgIC8qIEJMVUUgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgSEVJR0hUICogV0lEVEg7IGkrKykKKyAgICByZ2JhMzJbaV0gPSByZ2JhX2NvbDsKKworICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKEhFSUdIVCAqIFdJRFRIICogNCk7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobWFwLnNpemUsIHNpemVvZiAocmdiYTMyX2ltZykpOworICBtZW1jcHkgKG1hcC5kYXRhLCByZ2JhMzJfaW1nLCBzaXplb2YgKHJnYmEzMl9pbWcpKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIHJldHVybiBidWY7Cit9CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfY2hyb21ha2V5aW5nKQoreworICBHc3RFbGVtZW50ICphbHBoYTsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlcjsKKyAgR3N0QnVmZmVyICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmluY2FwczsKKyAgZ3VpbnQ4ICpheXV2OworICBndWludCBvdXRsZW5ndGg7CisgIEdzdE1hcEluZm8gbWFwOworICBpbnQgaTsKKworICBpbmNhcHMgPSBjcmVhdGVfY2Fwc19yZ2JhMzIgKCk7CisKKyAgYWxwaGEgPSBzZXR1cF9hbHBoYSAoKTsKKworICBnX29iamVjdF9zZXQgKGFscGhhLCAibWV0aG9kIiwgMSwgTlVMTCk7ICAgICAgLyogQ2hyb21hLWtleWluZyBHUkVFTiAqLworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYWxwaGEsIEdTVF9TVEFURV9QTEFZSU5HKSwKKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAoc3JjcGFkLCBhbHBoYSwgaW5jYXBzLCBHU1RfRk9STUFUX1RJTUUpOworCisgIGluYnVmZmVyID0gY3JlYXRlX2J1ZmZlcl9yZ2JhMzIgKEZJTExfR1JFRU4pOworICBHU1RfREVCVUcgKCJDcmVhdGVkIGJ1ZmZlciBvZiAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGluYnVmZmVyKSk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcGFkX3B1c2ggKHNyY3BhZCwgaW5idWZmZXIpLCBHU1RfRkxPV19PSyk7CisKKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID09IDEpOworICBvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGE7CisgIGZhaWxfaWYgKG91dGJ1ZmZlciA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9JU19CVUZGRVIgKG91dGJ1ZmZlcikpOworCisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKG91dGJ1ZmZlciwgIm91dGJ1ZmZlciIsIDEpOworICBvdXRsZW5ndGggPSBXSURUSCAqIEhFSUdIVCAqIDQ7ICAgICAgIC8qIG91dHB1dCBpcyBBWVVWICovCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG1hcC5zaXplLCBvdXRsZW5ndGgpOworCisgIGF5dXYgPSBtYXAuZGF0YTsKKworICAvKiBjaGVjayBjaHJvbWEga2V5aW5nIEdSRUVOICovCisgIGZvciAoaSA9IDA7IGkgPCBIRUlHSFQgKiBXSURUSDsgaSArPSA0KQorICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGF5dXZbaV0sIDB4MDApOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgYnVmZmVycyA9IGdfbGlzdF9yZW1vdmUgKGJ1ZmZlcnMsIG91dGJ1ZmZlcik7CisgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1ZmZlcik7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhbHBoYSwgR1NUX1NUQVRFX05VTEwpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYWxwaGEgKGFscGhhKTsKKyAgQVNTRVJUX0NBUFNfUkVGQ09VTlQgKGluY2FwcywgImluY2FwcyIsIDEpOworICBnc3RfY2Fwc191bnJlZiAoaW5jYXBzKTsKKworfQorCitHU1RfRU5EX1RFU1Q7CisKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9hbHBoYSkKK3sKKyAgR3N0RWxlbWVudCAqYWxwaGE7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXI7CisgIEdzdEJ1ZmZlciAqb3V0YnVmZmVyOworICBHc3RDYXBzICppbmNhcHM7CisgIGd1aW50OCAqYXl1djsKKyAgZ3VpbnQgb3V0bGVuZ3RoOworICBHc3RNYXBJbmZvIG1hcDsKKyAgaW50IGk7CisKKyAgaW5jYXBzID0gY3JlYXRlX2NhcHNfcmdiYTMyICgpOworCisgIGFscGhhID0gc2V0dXBfYWxwaGEgKCk7CisKKyAgZ19vYmplY3Rfc2V0IChhbHBoYSwgImFscGhhIiwgMC41LCBOVUxMKTsgICAgIC8qIEFscGhhIHZhbHVlIDAuNSAqLworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYWxwaGEsIEdTVF9TVEFURV9QTEFZSU5HKSwKKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAoc3JjcGFkLCBhbHBoYSwgaW5jYXBzLCBHU1RfRk9STUFUX1RJTUUpOworCisgIGluYnVmZmVyID0gY3JlYXRlX2J1ZmZlcl9yZ2JhMzIgKEZJTExfQkxVRSk7CisgIEdTVF9ERUJVRyAoIkNyZWF0ZWQgYnVmZmVyIG9mICUiIEdfR1NJWkVfRk9STUFUICIgYnl0ZXMiLAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoaW5idWZmZXIpKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSByZWZlcmVuY2UgKi8KKyAgR1NUX0RFQlVHICgicHVzaCBpdCIpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcGFkX3B1c2ggKHNyY3BhZCwgaW5idWZmZXIpLCBHU1RfRkxPV19PSyk7CisgIEdTVF9ERUJVRyAoInB1c2hlZCBpdCIpOworCisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA9PSAxKTsKKyAgb3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhOworICBmYWlsX2lmIChvdXRidWZmZXIgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChHU1RfSVNfQlVGRkVSIChvdXRidWZmZXIpKTsKKworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChvdXRidWZmZXIsICJvdXRidWZmZXIiLCAxKTsKKyAgb3V0bGVuZ3RoID0gV0lEVEggKiBIRUlHSFQgKiA0OyAgICAgICAvKiBvdXRwdXQgaXMgQVlVViAqLworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChtYXAuc2l6ZSwgb3V0bGVuZ3RoKTsKKworICBheXV2ID0gbWFwLmRhdGE7CisKKyAgZm9yIChpID0gMDsgaSA8IEhFSUdIVCAqIFdJRFRIOyBpICs9IDQpCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoYXl1dltpXSwgMHg3Rik7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICBidWZmZXJzID0gZ19saXN0X3JlbW92ZSAoYnVmZmVycywgb3V0YnVmZmVyKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmZmVyKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGFscGhhLCBHU1RfU1RBVEVfTlVMTCksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIC8qIGNsZWFudXAgKi8KKyAgR1NUX0RFQlVHICgiY2xlYW51cCBhbHBoYSIpOworICBjbGVhbnVwX2FscGhhIChhbHBoYSk7CisgIEdTVF9ERUJVRyAoImNsZWFudXAsIHVucmVmIGluY2FwcyIpOworICBBU1NFUlRfQ0FQU19SRUZDT1VOVCAoaW5jYXBzLCAiaW5jYXBzIiwgMSk7CisgIGdzdF9jYXBzX3VucmVmIChpbmNhcHMpOworCit9CisKK0dTVF9FTkRfVEVTVDsKKworCitzdGF0aWMgU3VpdGUgKgorYWxwaGFfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiYWxwaGEiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYWxwaGEpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfY2hyb21ha2V5aW5nKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGFscGhhKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2FscGhhY29sb3IuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2FscGhhY29sb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTQ5NmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYWxwaGFjb2xvci5jCkBAIC0wLDAgKzEsMjg4IEBACisvKiBHU3RyZWFtZXIgdW5pdCB0ZXN0IGZvciB0aGUgYWxwaGFjb2xvciBlbGVtZW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgiQVlVViIpKQorICAgICk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFICgieyBSR0JBLCBSR0IgfSIpKQorICAgICk7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX2FscGhhY29sb3IgKHZvaWQpCit7CisgIEdzdEVsZW1lbnQgKmFscGhhY29sb3I7CisKKyAgYWxwaGFjb2xvciA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgiYWxwaGFjb2xvciIpOworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChhbHBoYWNvbG9yLCAmc3JjdGVtcGxhdGUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGFscGhhY29sb3IsICZzaW5rdGVtcGxhdGUpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgcmV0dXJuIGFscGhhY29sb3I7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX2FscGhhY29sb3IgKEdzdEVsZW1lbnQgKiBhbHBoYWNvbG9yKQoreworICBHU1RfREVCVUcgKCJjbGVhbmluZyB1cCIpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKGFscGhhY29sb3IpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKGFscGhhY29sb3IpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAoYWxwaGFjb2xvcik7Cit9CisKKyNkZWZpbmUgV0lEVEggMworI2RlZmluZSBIRUlHSFQgNAorCitzdGF0aWMgR3N0Q2FwcyAqCitjcmVhdGVfY2Fwc19yZ2IyNCAodm9pZCkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcmF3IiwKKyAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIDMsCisgICAgICAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgNCwKKyAgICAgICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwgMCwgMSwKKyAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiUkdCIiwgTlVMTCk7CisKKyAgcmV0dXJuIGNhcHM7Cit9CisKK3N0YXRpYyBHc3RDYXBzICoKK2NyZWF0ZV9jYXBzX3JnYmEzMiAodm9pZCkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcmF3IiwKKyAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIDMsCisgICAgICAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgNCwKKyAgICAgICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwgMCwgMSwKKyAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiUkdCQSIsIE5VTEwpOworCisgIHJldHVybiBjYXBzOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2NyZWF0ZV9idWZmZXJfcmdiMjRfM3g0ICh2b2lkKQoreworICAvKiBzdHJpZGUgaXMgcm91bmRlZCB1cCB0byBtdWx0aXBsZSBvZiA0LCBzbyAzIGJ5dGVzIHBhZGRpbmcgZm9yIGVhY2ggcm93ICovCisgIGNvbnN0IGd1aW50OCByZ2IyNF8zeDRfaW1nW0hFSUdIVCAqIEdTVF9ST1VORF9VUF80IChXSURUSCAqIDMpXSA9IHsKKyAgICAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwCisgIH07CisgIGd1aW50IHJvd3N0cmlkZSA9IEdTVF9ST1VORF9VUF80IChXSURUSCAqIDMpOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0TWFwSW5mbyBpbmZvOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoSEVJR0hUICogcm93c3RyaWRlKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJmluZm8sIEdTVF9NQVBfUkVBRFdSSVRFKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoaW5mby5zaXplLCBzaXplb2YgKHJnYjI0XzN4NF9pbWcpKTsKKyAgbWVtY3B5IChpbmZvLmRhdGEsIHJnYjI0XzN4NF9pbWcsIHNpemVvZiAocmdiMjRfM3g0X2ltZykpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJmluZm8pOworCisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorY3JlYXRlX2J1ZmZlcl9yZ2JhMzJfM3g0ICh2b2lkKQoreworICAvKiBzdHJpZGUgaXMgcm91bmRlZCB1cCB0byBtdWx0aXBsZSBvZiA0LCBzbyAzIGJ5dGVzIHBhZGRpbmcgZm9yIGVhY2ggcm93ICovCisgIC8qIHNob3VsZCBiZTogIFJFRCAgICAgQkxVRSAgICBXSElURSAgICB3aGVyZSAnbm90aGluZycgaXMgZnVsbHkgdHJhbnNwYXJlbnQKKyAgICogICAgICAgICAgICAgR1JFRU4gICBSRUQgICAgIEJMVUUgICAgIGFuZCBhbGwgb3RoZXIgY29sb3VycyBhcmUgZnVsbHkKKyAgICogICAgICAgICAgICAgTk9USElORyBHUkVFTiAgIFJFRCAgICAgIG9wYXF1ZS4KKyAgICogICAgICAgICAgICAgQkxBQ0sgICBOT1RISU5HIEdSRUVOCisgICAqLworICBjb25zdCBndWludDggcmdiYTMyXzN4NF9pbWdbSEVJR0hUICogV0lEVEggKiA0XSA9IHsKKyAgICAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweDAwLCAweGZmCisgIH07CisgIGd1aW50IHJvd3N0cmlkZSA9IFdJRFRIICogNDsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoSEVJR0hUICogcm93c3RyaWRlKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEV1JJVEUpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChtYXAuc2l6ZSwgc2l6ZW9mIChyZ2JhMzJfM3g0X2ltZykpOworICBtZW1jcHkgKG1hcC5kYXRhLCByZ2JhMzJfM3g0X2ltZywgc2l6ZW9mIChyZ2JhMzJfM3g0X2ltZykpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcmdiMjQpCit7CisgIEdzdEVsZW1lbnQgKmFscGhhY29sb3I7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXI7CisgIEdzdENhcHMgKmluY2FwczsKKworICBpbmNhcHMgPSBjcmVhdGVfY2Fwc19yZ2IyNCAoKTsKKyAgYWxwaGFjb2xvciA9IHNldHVwX2FscGhhY29sb3IgKCk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhbHBoYWNvbG9yLCBHU1RfU1RBVEVfUExBWUlORyksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhbHBoYWNvbG9yLCBpbmNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisKKyAgaW5idWZmZXIgPSBjcmVhdGVfYnVmZmVyX3JnYjI0XzN4NCAoKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSByZWZlcmVuY2U7IHRoaXMgc2hvdWxkIGVycm9yIG91dCB3aXRoIGEgbm90LW5lZ290aWF0ZWQKKyAgICogZXJyb3IsIGFscGhhY29sb3Igc2hvdWxkIG9ubHkgYWNjZXB0IFJHQkEgY2Fwcywgbm90IGJ1dCBwbGFpbiBSR0IyNCBjYXBzICovCisgIEdTVF9ERUJVRyAoInB1c2ggaXQiKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpLAorICAgICAgR1NUX0ZMT1dfTk9UX05FR09USUFURUQpOworICBHU1RfREVCVUcgKCJwdXNoZWQgaXQiKTsKKworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPT0gMCk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhbHBoYWNvbG9yLCBHU1RfU1RBVEVfTlVMTCksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIC8qIGNsZWFudXAgKi8KKyAgR1NUX0RFQlVHICgiY2xlYW51cCBhbHBoYWNvbG9yIik7CisgIGNsZWFudXBfYWxwaGFjb2xvciAoYWxwaGFjb2xvcik7CisgIEdTVF9ERUJVRyAoImNsZWFudXAsIHVucmVmIGluY2FwcyIpOworICBBU1NFUlRfQ0FQU19SRUZDT1VOVCAoaW5jYXBzLCAiaW5jYXBzIiwgMSk7CisgIGdzdF9jYXBzX3VucmVmIChpbmNhcHMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIHRoZXNlIG1hY3JvcyBhc3N1bWUgV0lEVEggYW5kIEhFSUdIVCBpcyBmaXhlZCB0byB3aGF0J3MgZGVmaW5lZCBhYm92ZSAqLworI2RlZmluZSBmYWlsX3VubGVzc19heXV2X3BpeGVsX2hhc19hbHBoYShheXV2LHgseSxhKSBcCisgICAgeyBcCisgICAgICAgIGd1aW50OCAqcGl4ZWw7IFwKKyAgICAgICAgcGl4ZWwgPSAoKGd1aW50OCopKGF5dXYpICsgKChXSURUSCAqIDQpICogKHkpKSArICgoeCkgKiA0KSk7IFwKKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAocGl4ZWxbMF0sIGEpOyBcCisgICAgfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9yZ2JhMzIpCit7CisgIEdzdEVsZW1lbnQgKmFscGhhY29sb3I7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXI7CisgIEdzdEJ1ZmZlciAqb3V0YnVmZmVyOworICBHc3RDYXBzICppbmNhcHM7CisgIGd1aW50OCAqYXl1djsKKyAgZ3VpbnQgb3V0bGVuZ3RoOworICBHc3RNYXBJbmZvIG1hcDsKKworICBpbmNhcHMgPSBjcmVhdGVfY2Fwc19yZ2JhMzIgKCk7CisgIGFscGhhY29sb3IgPSBzZXR1cF9hbHBoYWNvbG9yICgpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYWxwaGFjb2xvciwgR1NUX1NUQVRFX1BMQVlJTkcpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYWxwaGFjb2xvciwgaW5jYXBzLCBHU1RfRk9STUFUX1RJTUUpOworCisgIGluYnVmZmVyID0gY3JlYXRlX2J1ZmZlcl9yZ2JhMzJfM3g0ICgpOworICBHU1RfREVCVUcgKCJDcmVhdGVkIGJ1ZmZlciBvZiAlIiBHX0dTSVpFX0ZPUk1BVCAiIGJ5dGVzIiwKKyAgICAgIGdzdF9idWZmZXJfZ2V0X3NpemUgKGluYnVmZmVyKSk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgcmVmZXJlbmNlICovCisgIEdTVF9ERUJVRyAoInB1c2ggaXQiKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpLCBHU1RfRkxPV19PSyk7CisgIEdTVF9ERUJVRyAoInB1c2hlZCBpdCIpOworCisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA9PSAxKTsKKyAgb3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhOworICBmYWlsX2lmIChvdXRidWZmZXIgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChHU1RfSVNfQlVGRkVSIChvdXRidWZmZXIpKTsKKworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChvdXRidWZmZXIsICJvdXRidWZmZXIiLCAxKTsKKyAgb3V0bGVuZ3RoID0gV0lEVEggKiBIRUlHSFQgKiA0OyAgICAgICAvKiBvdXRwdXQgaXMgQVlVViAqLworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChtYXAuc2l6ZSwgb3V0bGVuZ3RoKTsKKworICBheXV2ID0gbWFwLmRhdGE7CisKKyAgLyogY2hlY2sgYWxwaGEgdmFsdWVzICgweDAwID0gdG90YWxseSB0cmFuc3BhcmVudCwgMHhmZiA9IHRvdGFsbHkgb3BhcXVlKSAqLworICBmYWlsX3VubGVzc19heXV2X3BpeGVsX2hhc19hbHBoYSAoYXl1diwgMCwgMCwgMHhmZik7CisgIGZhaWxfdW5sZXNzX2F5dXZfcGl4ZWxfaGFzX2FscGhhIChheXV2LCAxLCAwLCAweGZmKTsKKyAgZmFpbF91bmxlc3NfYXl1dl9waXhlbF9oYXNfYWxwaGEgKGF5dXYsIDIsIDAsIDB4ZmYpOworICBmYWlsX3VubGVzc19heXV2X3BpeGVsX2hhc19hbHBoYSAoYXl1diwgMCwgMSwgMHhmZik7CisgIGZhaWxfdW5sZXNzX2F5dXZfcGl4ZWxfaGFzX2FscGhhIChheXV2LCAxLCAxLCAweGZmKTsKKyAgZmFpbF91bmxlc3NfYXl1dl9waXhlbF9oYXNfYWxwaGEgKGF5dXYsIDIsIDEsIDB4ZmYpOworICBmYWlsX3VubGVzc19heXV2X3BpeGVsX2hhc19hbHBoYSAoYXl1diwgMCwgMiwgMHgwMCk7CisgIGZhaWxfdW5sZXNzX2F5dXZfcGl4ZWxfaGFzX2FscGhhIChheXV2LCAxLCAyLCAweGZmKTsKKyAgZmFpbF91bmxlc3NfYXl1dl9waXhlbF9oYXNfYWxwaGEgKGF5dXYsIDIsIDIsIDB4ZmYpOworICBmYWlsX3VubGVzc19heXV2X3BpeGVsX2hhc19hbHBoYSAoYXl1diwgMCwgMywgMHhmZik7CisgIGZhaWxfdW5sZXNzX2F5dXZfcGl4ZWxfaGFzX2FscGhhIChheXV2LCAxLCAzLCAweDAwKTsKKyAgZmFpbF91bmxlc3NfYXl1dl9waXhlbF9oYXNfYWxwaGEgKGF5dXYsIDIsIDMsIDB4ZmYpOworCisgIC8qIHdlIGRvbid0IGNoZWNrIHRoZSBZVVYgZGF0YSwgYmVjYXVzZSBhcHBhcmVudGx5IHJlc3VsdHMgZGlmZmVyIHNsaWdodGx5CisgICAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIHJ1biBpbiB2YWxncmluZCBvciBub3QgKi8KKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIGJ1ZmZlcnMgPSBnX2xpc3RfcmVtb3ZlIChidWZmZXJzLCBvdXRidWZmZXIpOworICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYWxwaGFjb2xvciwgR1NUX1NUQVRFX05VTEwpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICAvKiBjbGVhbnVwICovCisgIEdTVF9ERUJVRyAoImNsZWFudXAgYWxwaGFjb2xvciIpOworICBjbGVhbnVwX2FscGhhY29sb3IgKGFscGhhY29sb3IpOworICBHU1RfREVCVUcgKCJjbGVhbnVwLCB1bnJlZiBpbmNhcHMiKTsKKyAgQVNTRVJUX0NBUFNfUkVGQ09VTlQgKGluY2FwcywgImluY2FwcyIsIDEpOworICBnc3RfY2Fwc191bnJlZiAoaW5jYXBzKTsKK30KKworR1NUX0VORF9URVNUOworCisKK3N0YXRpYyBTdWl0ZSAqCithbHBoYWNvbG9yX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImFscGhhY29sb3IiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcmdiMjQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcmdiYTMyKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGFscGhhY29sb3IpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvYW1ycGFyc2UuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2FtcnBhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmZmZhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2FtcnBhcnNlLmMKQEAgLTAsMCArMSwzMDYgQEAKKy8qCisgKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIGFtcnBhcnNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3Q6IFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgInBhcnNlci5oIgorCisjZGVmaW5lIFNSQ19DQVBTX05CICAiYXVkaW8veC1hbXItbmItc2giCisjZGVmaW5lIFNSQ19DQVBTX1dCICAiYXVkaW8veC1hbXItd2Itc2giCisjZGVmaW5lIFNSQ19DQVBTX0FOWSAiQU5ZIgorCisjZGVmaW5lIFNJTktfQ0FQU19OQiAgImF1ZGlvL0FNUiwgcmF0ZT04MDAwICwgY2hhbm5lbHM9MSIKKyNkZWZpbmUgU0lOS19DQVBTX1dCICAiYXVkaW8vQU1SLVdCLCByYXRlPTE2MDAwICwgY2hhbm5lbHM9MSIKKyNkZWZpbmUgU0lOS19DQVBTX0FOWSAiQU5ZIgorCisjZGVmaW5lIEFNUl9GUkFNRV9EVVJBVElPTiAoR1NUX1NFQ09ORC81MCkKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZV9uYiA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoU0lOS19DQVBTX05CKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGVfd2IgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFNJTktfQ0FQU19XQikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGVfbmIgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChTUkNfQ0FQU19OQikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGVfd2IgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChTUkNfQ0FQU19XQikKKyAgICApOworCitzdGF0aWMgR3N0Q2FwcyAqaW5wdXRfY2FwcyA9IE5VTEw7CisKKy8qIHNvbWUgZGF0YSAqLworCitzdGF0aWMgZ3VpbnQ4IGZyYW1lX2RhdGFfbmJbXSA9IHsKKyAgMHgwYywgMHg1NiwgMHgzYywgMHg1MiwgMHhlMCwgMHg2MSwgMHhiYywgMHg0NSwKKyAgMHgwZiwgMHg5OCwgMHgyZSwgMHgwMSwgMHg0MiwgMHgwMgorfTsKKworc3RhdGljIGd1aW50OCBmcmFtZV9kYXRhX3diW10gPSB7CisgIDB4MDgsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsCisgIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsCisgIDB4MGYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYKK307CisKK3N0YXRpYyBndWludDggZnJhbWVfaGRyX25iW10gPSB7CisgICcjJywgJyEnLCAnQScsICdNJywgJ1InLCAnXG4nCit9OworCitzdGF0aWMgZ3VpbnQ4IGZyYW1lX2hkcl93YltdID0geworICAnIycsICchJywgJ0EnLCAnTScsICdSJywgJy0nLCAnVycsICdCJywgJ1xuJworfTsKKworc3RhdGljIGd1aW50OCBnYXJiYWdlX2ZyYW1lW10gPSB7CisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKK307CisKK3N0YXRpYyB2b2lkCitzZXR1cF9hbXJuYiAodm9pZCkKK3sKKyAgY3R4X2ZhY3RvcnkgPSAiYW1ycGFyc2UiOworICBjdHhfc2lua190ZW1wbGF0ZSA9ICZzaW5rdGVtcGxhdGVfbmI7CisgIGN0eF9zcmNfdGVtcGxhdGUgPSAmc3JjdGVtcGxhdGVfbmI7CisgIGlucHV0X2NhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoU1JDX0NBUFNfTkIpOworICBnX2Fzc2VydCAoaW5wdXRfY2Fwcyk7CisgIGN0eF9pbnB1dF9jYXBzID0gaW5wdXRfY2FwczsKK30KKworc3RhdGljIHZvaWQKK3NldHVwX2FtcndiICh2b2lkKQoreworICBjdHhfZmFjdG9yeSA9ICJhbXJwYXJzZSI7CisgIGN0eF9zaW5rX3RlbXBsYXRlID0gJnNpbmt0ZW1wbGF0ZV93YjsKKyAgY3R4X3NyY190ZW1wbGF0ZSA9ICZzcmN0ZW1wbGF0ZV93YjsKKyAgaW5wdXRfY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChTUkNfQ0FQU19XQik7CisgIGdfYXNzZXJ0IChpbnB1dF9jYXBzKTsKKyAgY3R4X2lucHV0X2NhcHMgPSBpbnB1dF9jYXBzOworfQorCitzdGF0aWMgdm9pZAordGVhcmRvd24gKHZvaWQpCit7CisgIGdzdF9jYXBzX3VucmVmIChpbnB1dF9jYXBzKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfbmJfbm9ybWFsKQoreworICBnc3RfcGFyc2VyX3Rlc3Rfbm9ybWFsIChmcmFtZV9kYXRhX25iLCBzaXplb2YgKGZyYW1lX2RhdGFfbmIpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX25iX2RyYWluX3NpbmdsZSkKK3sKKyAgZ3N0X3BhcnNlcl90ZXN0X2RyYWluX3NpbmdsZSAoZnJhbWVfZGF0YV9uYiwgc2l6ZW9mIChmcmFtZV9kYXRhX25iKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9uYl9kcmFpbl9nYXJiYWdlKQoreworICBnc3RfcGFyc2VyX3Rlc3RfZHJhaW5fZ2FyYmFnZSAoZnJhbWVfZGF0YV9uYiwgc2l6ZW9mIChmcmFtZV9kYXRhX25iKSwKKyAgICAgIGdhcmJhZ2VfZnJhbWUsIHNpemVvZiAoZ2FyYmFnZV9mcmFtZSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfbmJfc3BsaXQpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9zcGxpdCAoZnJhbWVfZGF0YV9uYiwgc2l6ZW9mIChmcmFtZV9kYXRhX25iKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9uYl9za2lwX2dhcmJhZ2UpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9za2lwX2dhcmJhZ2UgKGZyYW1lX2RhdGFfbmIsIHNpemVvZiAoZnJhbWVfZGF0YV9uYiksCisgICAgICBnYXJiYWdlX2ZyYW1lLCBzaXplb2YgKGdhcmJhZ2VfZnJhbWUpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX25iX2RldGVjdF9zdHJlYW0pCit7CisgIEdzdFBhcnNlclRlc3QgcHRlc3Q7CisgIEdzdENhcHMgKm9sZF9jdHhfY2FwczsKKworICAvKiBubyBpbnB1dCBjYXBzLCBvdmVycmlkZSBjdHggKi8KKyAgb2xkX2N0eF9jYXBzID0gY3R4X2lucHV0X2NhcHM7CisgIGN0eF9pbnB1dF9jYXBzID0gTlVMTDsKKworICAvKiBBTVItTkIgaGVhZGVyICovCisgIGdzdF9wYXJzZXJfdGVzdF9pbml0ICgmcHRlc3QsIGZyYW1lX2hkcl9uYiwgc2l6ZW9mIChmcmFtZV9oZHJfbmIpLCAxKTsKKyAgLyogd2VsbCwgbm8gZ2FyYmFnZSwgZm9sbG93ZWQgYnkgcmVhbCBkYXRhICovCisgIHB0ZXN0LnNlcmllc1syXS5kYXRhID0gZnJhbWVfZGF0YV9uYjsKKyAgcHRlc3Quc2VyaWVzWzJdLnNpemUgPSBzaXplb2YgKGZyYW1lX2RhdGFfbmIpOworICBwdGVzdC5zZXJpZXNbMl0ubnVtID0gMTA7CisgIC8qIGhlYWRlciBnZXRzIGRyb3BwZWQsIHNvIC4uLiAqLworICAvKiBidWZmZXIgY291bnQgd2lsbCBub3QgbWF0Y2ggKi8KKyAgcHRlc3QuZnJhbWVkID0gRkFMU0U7CisgIC8qIHRvdGFsIHNpemUgYSBiaXQgbGVzcyAqLworICBwdGVzdC5kcm9wcGVkID0gc2l6ZW9mIChmcmFtZV9oZHJfbmIpOworCisgIC8qIENoZWNrIHRoYXQgdGhlIG5lZ290aWF0ZWQgY2FwcyBhcmUgYXMgZXhwZWN0ZWQgKi8KKyAgcHRlc3Quc2lua19jYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKFNJTktfQ0FQU19OQik7CisKKyAgZ3N0X3BhcnNlcl90ZXN0X3J1biAoJnB0ZXN0LCBOVUxMKTsKKworICBnc3RfY2Fwc191bnJlZiAocHRlc3Quc2lua19jYXBzKTsKKworICBjdHhfaW5wdXRfY2FwcyA9IG9sZF9jdHhfY2FwczsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX3diX25vcm1hbCkKK3sKKyAgZ3N0X3BhcnNlcl90ZXN0X25vcm1hbCAoZnJhbWVfZGF0YV93Yiwgc2l6ZW9mIChmcmFtZV9kYXRhX3diKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV93Yl9kcmFpbl9zaW5nbGUpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9kcmFpbl9zaW5nbGUgKGZyYW1lX2RhdGFfd2IsIHNpemVvZiAoZnJhbWVfZGF0YV93YikpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2Vfd2JfZHJhaW5fZ2FyYmFnZSkKK3sKKyAgZ3N0X3BhcnNlcl90ZXN0X2RyYWluX2dhcmJhZ2UgKGZyYW1lX2RhdGFfd2IsIHNpemVvZiAoZnJhbWVfZGF0YV93YiksCisgICAgICBnYXJiYWdlX2ZyYW1lLCBzaXplb2YgKGdhcmJhZ2VfZnJhbWUpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX3diX3NwbGl0KQoreworICBnc3RfcGFyc2VyX3Rlc3Rfc3BsaXQgKGZyYW1lX2RhdGFfd2IsIHNpemVvZiAoZnJhbWVfZGF0YV93YikpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2Vfd2Jfc2tpcF9nYXJiYWdlKQoreworICBnc3RfcGFyc2VyX3Rlc3Rfc2tpcF9nYXJiYWdlIChmcmFtZV9kYXRhX3diLCBzaXplb2YgKGZyYW1lX2RhdGFfd2IpLAorICAgICAgZ2FyYmFnZV9mcmFtZSwgc2l6ZW9mIChnYXJiYWdlX2ZyYW1lKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV93Yl9kZXRlY3Rfc3RyZWFtKQoreworICBHc3RQYXJzZXJUZXN0IHB0ZXN0OworICBHc3RDYXBzICpvbGRfY3R4X2NhcHM7CisKKyAgLyogbm8gaW5wdXQgY2Fwcywgb3ZlcnJpZGUgY3R4ICovCisgIG9sZF9jdHhfY2FwcyA9IGN0eF9pbnB1dF9jYXBzOworICBjdHhfaW5wdXRfY2FwcyA9IE5VTEw7CisKKyAgLyogQU1SLVdCIGhlYWRlciAqLworICBnc3RfcGFyc2VyX3Rlc3RfaW5pdCAoJnB0ZXN0LCBmcmFtZV9oZHJfd2IsIHNpemVvZiAoZnJhbWVfaGRyX3diKSwgMSk7CisgIC8qIHdlbGwsIG5vIGdhcmJhZ2UsIGZvbGxvd2VkIGJ5IHJlYWwgZGF0YSAqLworICBwdGVzdC5zZXJpZXNbMl0uZGF0YSA9IGZyYW1lX2RhdGFfd2I7CisgIHB0ZXN0LnNlcmllc1syXS5zaXplID0gc2l6ZW9mIChmcmFtZV9kYXRhX3diKTsKKyAgcHRlc3Quc2VyaWVzWzJdLm51bSA9IDEwOworICAvKiBoZWFkZXIgZ2V0cyBkcm9wcGVkLCBzbyAuLi4gKi8KKyAgLyogYnVmZmVyIGNvdW50IHdpbGwgbm90IG1hdGNoICovCisgIHB0ZXN0LmZyYW1lZCA9IEZBTFNFOworICAvKiB0b3RhbCBzaXplIGEgYml0IGxlc3MgKi8KKyAgcHRlc3QuZHJvcHBlZCA9IHNpemVvZiAoZnJhbWVfaGRyX3diKTsKKworICAvKiBDaGVjayB0aGF0IHRoZSBuZWdvdGlhdGVkIGNhcHMgYXJlIGFzIGV4cGVjdGVkICovCisgIHB0ZXN0LnNpbmtfY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChTSU5LX0NBUFNfV0IpOworCisgIGdzdF9wYXJzZXJfdGVzdF9ydW4gKCZwdGVzdCwgTlVMTCk7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKHB0ZXN0LnNpbmtfY2Fwcyk7CisKKyAgY3R4X2lucHV0X2NhcHMgPSBvbGRfY3R4X2NhcHM7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyoKKyAqIFRPRE86CisgKiAgIC0gQm90aCBwdXNoLSBhbmQgcHVsbC1tb2RlcyBuZWVkIHRvIGJlIHRlc3RlZAorICogICAgICAqIFB1bGwtbW9kZSAmIEVPUworICovCisKK3N0YXRpYyBTdWl0ZSAqCithbXJwYXJzZV9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJhbXJwYXJzZSIpOworICBUQ2FzZSAqdGNfY2hhaW47CisKKyAgLyogQU1SLU5CIHRlc3RzICovCisgIHRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiYW1ybmIiKTsKKyAgdGNhc2VfYWRkX2NoZWNrZWRfZml4dHVyZSAodGNfY2hhaW4sIHNldHVwX2Ftcm5iLCB0ZWFyZG93bik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9uYl9ub3JtYWwpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfbmJfZHJhaW5fc2luZ2xlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX25iX2RyYWluX2dhcmJhZ2UpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfbmJfc3BsaXQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfbmJfZGV0ZWN0X3N0cmVhbSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9uYl9za2lwX2dhcmJhZ2UpOworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKworICAvKiBBTVItV0IgdGVzdHMgKi8KKyAgdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJhbXJ3YiIpOworICB0Y2FzZV9hZGRfY2hlY2tlZF9maXh0dXJlICh0Y19jaGFpbiwgc2V0dXBfYW1yd2IsIHRlYXJkb3duKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX3diX25vcm1hbCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV93Yl9kcmFpbl9zaW5nbGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2Vfd2JfZHJhaW5fZ2FyYmFnZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV93Yl9zcGxpdCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV93Yl9kZXRlY3Rfc3RyZWFtKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX3diX3NraXBfZ2FyYmFnZSk7CisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoYW1ycGFyc2UpCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9hcGV2Mm11eC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXBldjJtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjE5MDdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXBldjJtdXguYwpAQCAtMCwwICsxLDQxMSBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciB0aGUgdGFnbGliLWJhc2VkIGFwZXYybXV4IGVsZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBURVNUX0FSVElTVCAgICAgICAgICAgIkFyIFRcMzAzXDI1NXN0IgorI2RlZmluZSBURVNUX1RJVExFICAgICAgICAgICAgIk1cMzAzXDI3NGxsZXJtaWxjaCEiCisjZGVmaW5lIFRFU1RfQUxCVU0gICAgICAgICAgICAiQm9vbSIKKyNkZWZpbmUgVEVTVF9EQVRFICAgICAgICAgICAgIGdfZGF0ZV9uZXdfZG15KDEsMSwyMDA2KQorI2RlZmluZSBURVNUX1RSQUNLX05VTUJFUiAgICAgNworI2RlZmluZSBURVNUX1RSQUNLX0NPVU5UICAgICAgMTkKKyNkZWZpbmUgVEVTVF9UUkFDS19HQUlOICAgICAgIDEuNDUKKyNkZWZpbmUgVEVTVF9BTEJVTV9HQUlOICAgICAgIDAuNzgKKworLyogZm9yIGR1bW15IG1wMyBmcmFtZSBzaXplZCBNUDNfRlJBTUVfU0laRSBieXRlcywKKyAqIHN0YXJ0OiBmZiBmYiBiMCA0NCAwMCAwMCAwOCAwMCAgMDAgNGIgMDAgMDAgMDAgMDAgMDAgMDAgKi8KK3N0YXRpYyBjb25zdCBndWludDggbXAzX2R1bW15aGRyW10gPSB7IDB4ZmYsIDB4ZmIsIDB4YjAsIDB4NDQsIDB4MDAsIDB4MDAsCisgIDB4MDgsIDB4MDAsIDB4NGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAKK307CisKKyNkZWZpbmUgTVAzX0ZSQU1FX1NJWkUgNjI2CisKK3N0YXRpYyBHc3RUYWdMaXN0ICoKK3Rlc3RfdGFnbGliX2FwZXYybXV4X2NyZWF0ZV90YWdzIChndWludDMyIG1hc2spCit7CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisKKyAgdGFncyA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisKKyAgaWYgKG1hc2sgJiAoMSA8PCAwKSkgeworICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ3MsIEdTVF9UQUdfTUVSR0VfS0VFUCwKKyAgICAgICAgR1NUX1RBR19BUlRJU1QsIFRFU1RfQVJUSVNULCBOVUxMKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDEpKSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9LRUVQLAorICAgICAgICBHU1RfVEFHX1RJVExFLCBURVNUX1RJVExFLCBOVUxMKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDIpKSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9LRUVQLAorICAgICAgICBHU1RfVEFHX0FMQlVNLCBURVNUX0FMQlVNLCBOVUxMKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDMpKSB7CisgICAgR0RhdGUgKmRhdGU7CisKKyAgICBkYXRlID0gVEVTVF9EQVRFOworICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ3MsIEdTVF9UQUdfTUVSR0VfS0VFUCwgR1NUX1RBR19EQVRFLCBkYXRlLCBOVUxMKTsKKyAgICBnX2RhdGVfZnJlZSAoZGF0ZSk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCA0KSkgeworICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ3MsIEdTVF9UQUdfTUVSR0VfS0VFUCwKKyAgICAgICAgR1NUX1RBR19UUkFDS19OVU1CRVIsIFRFU1RfVFJBQ0tfTlVNQkVSLCBOVUxMKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDUpKSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9LRUVQLAorICAgICAgICBHU1RfVEFHX1RSQUNLX0NPVU5ULCBURVNUX1RSQUNLX0NPVU5ULCBOVUxMKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDYpKSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9LRUVQLAorICAgICAgICBHU1RfVEFHX1RSQUNLX0dBSU4sIFRFU1RfVFJBQ0tfR0FJTiwgTlVMTCk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCA3KSkgeworICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ3MsIEdTVF9UQUdfTUVSR0VfS0VFUCwKKyAgICAgICAgR1NUX1RBR19BTEJVTV9HQUlOLCBURVNUX0FMQlVNX0dBSU4sIE5VTEwpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgOCkpIHsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDkpKSB7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAxMCkpIHsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDExKSkgeworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMTIpKSB7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAxMykpIHsKKyAgfQorICByZXR1cm4gdGFnczsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfdGFnbGliX2FwZXYybXV4X2NoZWNrX3RhZ3MgKEdzdFRhZ0xpc3QgKiB0YWdzLCBndWludDMyIG1hc2spCit7CisgIGlmIChtYXNrICYgKDEgPDwgMCkpIHsKKyAgICBnY2hhciAqcyA9IE5VTEw7CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ3MsIEdTVF9UQUdfQVJUSVNULCAmcykpOworICAgIGZhaWxfdW5sZXNzIChnX3N0cl9lcXVhbCAocywgVEVTVF9BUlRJU1QpKTsKKyAgICBnX2ZyZWUgKHMpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMSkpIHsKKyAgICBnY2hhciAqcyA9IE5VTEw7CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ3MsIEdTVF9UQUdfVElUTEUsICZzKSk7CisgICAgZmFpbF91bmxlc3MgKGdfc3RyX2VxdWFsIChzLCBURVNUX1RJVExFKSk7CisgICAgZ19mcmVlIChzKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDIpKSB7CisgICAgZ2NoYXIgKnMgPSBOVUxMOworCisgICAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nICh0YWdzLCBHU1RfVEFHX0FMQlVNLCAmcykpOworICAgIGZhaWxfdW5sZXNzIChnX3N0cl9lcXVhbCAocywgVEVTVF9BTEJVTSkpOworICAgIGdfZnJlZSAocyk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAzKSkgeworICAgIEdEYXRlICpzaG91bGRiZSwgKmRhdGUgPSBOVUxMOworCisgICAgc2hvdWxkYmUgPSBURVNUX0RBVEU7CisgICAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfZGF0ZSAodGFncywgR1NUX1RBR19EQVRFLCAmZGF0ZSkpOworICAgIGZhaWxfdW5sZXNzIChnX2RhdGVfY29tcGFyZSAoc2hvdWxkYmUsIGRhdGUpID09IDApOworICAgIGdfZGF0ZV9mcmVlIChzaG91bGRiZSk7CisgICAgZ19kYXRlX2ZyZWUgKGRhdGUpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgNCkpIHsKKyAgICBndWludCBudW07CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF91aW50ICh0YWdzLCBHU1RfVEFHX1RSQUNLX05VTUJFUiwgJm51bSkpOworICAgIGZhaWxfdW5sZXNzIChudW0gPT0gVEVTVF9UUkFDS19OVU1CRVIpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgNSkpIHsKKyAgICBndWludCBjb3VudDsKKworICAgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X3VpbnQgKHRhZ3MsIEdTVF9UQUdfVFJBQ0tfQ09VTlQsICZjb3VudCkpOworICAgIGZhaWxfdW5sZXNzIChjb3VudCA9PSBURVNUX1RSQUNLX0NPVU5UKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDYpKSB7CisgICAgZ2RvdWJsZSBnYWluOworCisgICAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdzLCBHU1RfVEFHX1RSQUNLX0dBSU4sICZnYWluKSk7CisgICAgZmFpbF91bmxlc3MgKGdhaW4gPT0gVEVTVF9UUkFDS19HQUlOKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDcpKSB7CisgICAgZ2RvdWJsZSBnYWluOworCisgICAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdzLCBHU1RfVEFHX0FMQlVNX0dBSU4sICZnYWluKSk7CisgICAgZmFpbF91bmxlc3MgKGdhaW4gPT0gVEVTVF9BTEJVTV9HQUlOKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDgpKSB7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCA5KSkgeworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMTApKSB7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAxMSkpIHsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDEyKSkgeworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMTMpKSB7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2ZpbGxfbXAzX2J1ZmZlciAoR3N0RWxlbWVudCAqIGZha2VzcmMsIEdzdEJ1ZmZlciAqIGJ1ZiwgR3N0UGFkICogcGFkLAorICAgIGd1aW50NjQgKiBwX29mZnNldCkKK3sKKyAgZ3NpemUgc2l6ZTsKKworICBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKworICBmYWlsX3VubGVzcyAoc2l6ZSA9PSBNUDNfRlJBTUVfU0laRSk7CisKKyAgR1NUX0xPRyAoImZpbGxpbmcgYnVmZmVyIHdpdGggZmFrZSBtcDMgZGF0YSwgb2Zmc2V0ID0gJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICpwX29mZnNldCk7CisKKyAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIG1wM19kdW1teWhkciwgc2l6ZW9mIChtcDNfZHVtbXloZHIpKTsKKworI2lmIDAKKyAgLyogY2FuJ3QgdXNlIGdzdF9idWZmZXJfc2V0X2NhcHMoKSBoZXJlIGJlY2F1c2UgdGhlIG1ldGFkYXRhIGlzbid0IHdyaXRhYmxlCisgICAqIGJlY2F1c2Ugb2YgdGhlIGV4dHJhIHJlZmNvdW50cyB0YWtlbiBieSB0aGUgc2lnbmFsIGVtaXNzaW9uIG1lY2hhbmlzbTsKKyAgICogd2Uga25vdyBpdCdzIGZpbmUgdG8gdXNlIEdTVF9CVUZGRVJfQ0FQUygpIGhlcmUgdGhvdWdoICovCisgIEdTVF9CVUZGRVJfQ0FQUyAoYnVmKSA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9tcGVnIiwgIm1wZWd2ZXJzaW9uIiwKKyAgICAgIEdfVFlQRV9JTlQsIDEsICJsYXllciIsIEdfVFlQRV9JTlQsIDMsIE5VTEwpOworI2VuZGlmCisKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPSAqcF9vZmZzZXQ7CisgICpwX29mZnNldCArPSBzaXplOworfQorCitzdGF0aWMgdm9pZAorZ290X2J1ZmZlciAoR3N0RWxlbWVudCAqIGZha2VzaW5rLCBHc3RCdWZmZXIgKiBidWYsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RCdWZmZXIgKiogcF9idWYpCit7CisgIGdpbnQ2NCBvZmY7CisgIEdzdE1hcEluZm8gbWFwOworCisgIG9mZiA9IEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgR1NUX0xPRyAoInNpemU9JSIgR19HU0laRV9GT1JNQVQgIiwgb2Zmc2V0PSUiIEdfR0lOVDY0X0ZPUk1BVCwgbWFwLnNpemUsIG9mZik7CisKKyAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfT0ZGU0VUX0lTX1ZBTElEIChidWYpKTsKKworICBpZiAoKnBfYnVmID09IE5VTEwgfHwgKG9mZiArIG1hcC5zaXplKSA+IGdzdF9idWZmZXJfZ2V0X3NpemUgKCpwX2J1ZikpIHsKKyAgICBHc3RCdWZmZXIgKm5ld2J1ZjsKKworICAgIC8qIG5vdCB2ZXJ5IGVsZWdhbnQsIGJ1dCB3aG8gY2FyZXMgKi8KKyAgICBuZXdidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG9mZiArIG1hcC5zaXplKTsKKyAgICBpZiAoKnBfYnVmKSB7CisgICAgICBHc3RNYXBJbmZvIHBtYXA7CisKKyAgICAgIGdzdF9idWZmZXJfbWFwICgqcF9idWYsICZwbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgZ3N0X2J1ZmZlcl9maWxsIChuZXdidWYsIDAsIHBtYXAuZGF0YSwgcG1hcC5zaXplKTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKCpwX2J1ZiwgJnBtYXApOworICAgIH0KKyAgICBnc3RfYnVmZmVyX2ZpbGwgKG5ld2J1Ziwgb2ZmLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAgIGlmICgqcF9idWYpCisgICAgICBnc3RfYnVmZmVyX3VucmVmICgqcF9idWYpOworICAgICpwX2J1ZiA9IG5ld2J1ZjsKKyAgfSBlbHNlIHsKKyAgICBnc3RfYnVmZmVyX2ZpbGwgKCpwX2J1Ziwgb2ZmLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3RhZ2xpYl9hcGV2Mm11eF9jaGVja19vdXRwdXRfYnVmZmVyIChHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludCBvZmY7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZ19hc3NlcnQgKG1hcC5zaXplICUgTVAzX0ZSQU1FX1NJWkUgPT0gMCk7CisKKyAgZm9yIChvZmYgPSAwOyBvZmYgPCBtYXAuc2l6ZTsgb2ZmICs9IE1QM19GUkFNRV9TSVpFKSB7CisgICAgZmFpbF91bmxlc3MgKG1lbWNtcCAobWFwLmRhdGEgKyBvZmYsIG1wM19kdW1teWhkciwKKyAgICAgICAgICAgIHNpemVvZiAobXAzX2R1bW15aGRyKSkgPT0gMCk7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfdGFnbGliX2FwZXYybXV4X3dpdGhfdGFncyAoR3N0VGFnTGlzdCAqIHRhZ3MsIGd1aW50MzIgbWFzaykKK3sKKyAgR3N0TWVzc2FnZSAqbXNnOworICBHc3RUYWdMaXN0ICp0YWdzX3JlYWQgPSBOVUxMOworICBHc3RFbGVtZW50ICpwaXBlbGluZSwgKmFwZXYybXV4LCAqYXBlZGVtdXgsICpmYWtlc3JjLCAqZmFrZXNpbms7CisgIEdzdEJ1cyAqYnVzOworICBndWludDY0IG9mZnNldDsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGdfYXNzZXJ0IChwaXBlbGluZSAhPSBOVUxMKTsKKworICBmYWtlc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNyYyIsICJmYWtlc3JjIik7CisgIGdfYXNzZXJ0IChmYWtlc3JjICE9IE5VTEwpOworCisgIGFwZXYybXV4ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXBldjJtdXgiLCAiYXBldjJtdXgiKTsKKyAgZ19hc3NlcnQgKGFwZXYybXV4ICE9IE5VTEwpOworCisgIGFwZWRlbXV4ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXBlZGVtdXgiLCAiYXBlZGVtdXgiKTsKKyAgZ19hc3NlcnQgKGFwZWRlbXV4ICE9IE5VTEwpOworCisgIGZha2VzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAiZmFrZXNpbmsiKTsKKyAgZ19hc3NlcnQgKGZha2VzaW5rICE9IE5VTEwpOworCisgIC8qIHNldCB1cCBzaW5rICovCisgIG91dGJ1ZiA9IE5VTEw7CisgIGdfb2JqZWN0X3NldCAoZmFrZXNpbmssICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoZmFrZXNpbmssICJoYW5kb2ZmIiwgR19DQUxMQkFDSyAoZ290X2J1ZmZlciksICZvdXRidWYpOworCisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIGZha2VzcmMpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBhcGV2Mm11eCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIGFwZWRlbXV4KTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgZmFrZXNpbmspOworCisgIGdzdF90YWdfc2V0dGVyX21lcmdlX3RhZ3MgKEdTVF9UQUdfU0VUVEVSIChhcGV2Mm11eCksIHRhZ3MsCisgICAgICBHU1RfVEFHX01FUkdFX0FQUEVORCk7CisKKyAgZ3N0X2VsZW1lbnRfbGlua19tYW55IChmYWtlc3JjLCBhcGV2Mm11eCwgYXBlZGVtdXgsIGZha2VzaW5rLCBOVUxMKTsKKworICAvKiBzZXQgdXAgc291cmNlICovCisgIGdfb2JqZWN0X3NldCAoZmFrZXNyYywgInNpZ25hbC1oYW5kb2ZmcyIsIFRSVUUsICJjYW4tYWN0aXZhdGUtcHVsbCIsIEZBTFNFLAorICAgICAgImZpbGx0eXBlIiwgMiwgInNpemV0eXBlIiwgMiwgInNpemVtYXgiLCBNUDNfRlJBTUVfU0laRSwKKyAgICAgICJudW0tYnVmZmVycyIsIDE2LCBOVUxMKTsKKworICBvZmZzZXQgPSAwOworICBnX3NpZ25hbF9jb25uZWN0IChmYWtlc3JjLCAiaGFuZG9mZiIsIEdfQ0FMTEJBQ0sgKGZpbGxfbXAzX2J1ZmZlciksICZvZmZzZXQpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2dldF9zdGF0ZSAocGlwZWxpbmUsIE5VTEwsIE5VTEwsCisgICAgICAgICAgLTEpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgYnVzID0gZ3N0X3BpcGVsaW5lX2dldF9idXMgKEdTVF9QSVBFTElORSAocGlwZWxpbmUpKTsKKworICBHU1RfTE9HICgiV2FpdGluZyBmb3IgdGFnIC4uLiIpOworICBtc2cgPQorICAgICAgZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX1RBRyB8IEdTVF9NRVNTQUdFX0VPUyB8IEdTVF9NRVNTQUdFX0VSUk9SLAorICAgICAgLTEpOworICBpZiAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FUlJPUikgeworICAgIEdFcnJvciAqZXJyOworICAgIGdjaGFyICpkYmc7CisKKyAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobXNnLCAmZXJyLCAmZGJnKTsKKyAgICBnX3ByaW50ZXJyICgiRVJST1IgZnJvbSBlbGVtZW50ICVzOiAlc1xuJXNcbiIsCisgICAgICAgIEdTVF9PQkpFQ1RfTkFNRSAobXNnLT5zcmMpLCBlcnItPm1lc3NhZ2UsIEdTVF9TVFJfTlVMTCAoZGJnKSk7CisgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgIGdfZnJlZSAoZGJnKTsKKyAgfSBlbHNlIGlmIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VPUykgeworICAgIGdfcHJpbnRlcnIgKCJFT1MgbWVzc2FnZSwgYnV0IHdlcmUgd2FpdGluZyBmb3IgVEFHUyFcbiIpOworICB9CisgIGZhaWxfdW5sZXNzIChtc2ctPnR5cGUgPT0gR1NUX01FU1NBR0VfVEFHKTsKKworICBnc3RfbWVzc2FnZV9wYXJzZV90YWcgKG1zZywgJnRhZ3NfcmVhZCk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworCisgIEdTVF9MT0cgKCJHb3QgdGFnczogJSIgR1NUX1BUUl9GT1JNQVQsIHRhZ3NfcmVhZCk7CisgIHRlc3RfdGFnbGliX2FwZXYybXV4X2NoZWNrX3RhZ3MgKHRhZ3NfcmVhZCwgbWFzayk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnc19yZWFkKTsKKworICBHU1RfTE9HICgiV2FpdGluZyBmb3IgRU9TIC4uLiIpOworICBtc2cgPSBnc3RfYnVzX3BvbGwgKGJ1cywgR1NUX01FU1NBR0VfRU9TIHwgR1NUX01FU1NBR0VfRVJST1IsIC0xKTsKKyAgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRVJST1IpIHsKKyAgICBHRXJyb3IgKmVycjsKKyAgICBnY2hhciAqZGJnOworCisgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1zZywgJmVyciwgJmRiZyk7CisgICAgZ19wcmludGVyciAoIkVSUk9SIGZyb20gZWxlbWVudCAlczogJXNcbiVzXG4iLAorICAgICAgICBHU1RfT0JKRUNUX05BTUUgKG1zZy0+c3JjKSwgZXJyLT5tZXNzYWdlLCBHU1RfU1RSX05VTEwgKGRiZykpOworICAgIGdfZXJyb3JfZnJlZSAoZXJyKTsKKyAgICBnX2ZyZWUgKGRiZyk7CisgIH0KKyAgZmFpbF91bmxlc3MgKG1zZy0+dHlwZSA9PSBHU1RfTUVTU0FHRV9FT1MpOworICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIEdTVF9MT0cgKCJHb3QgRU9TLCBzaHV0dGluZyBkb3duIC4uLiIpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKworICB0ZXN0X3RhZ2xpYl9hcGV2Mm11eF9jaGVja19vdXRwdXRfYnVmZmVyIChvdXRidWYpOworICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWYpOworCisgIEdTVF9MT0cgKCJEb25lIik7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2FwZXYybXV4KQoreworICBHc3RUYWdMaXN0ICp0YWdzOworICBnaW50IGk7CisKKyAgZ19yYW5kb21fc2V0X3NlZWQgKDI0NzE2NjI5NSk7CisKKyAgLyogaW50ZXJuYWwgY29uc2lzdGVuY3kgY2hlY2sgKi8KKyAgdGFncyA9IHRlc3RfdGFnbGliX2FwZXYybXV4X2NyZWF0ZV90YWdzICgweEZGRkZGRkZGKTsKKyAgdGVzdF90YWdsaWJfYXBldjJtdXhfY2hlY2tfdGFncyAodGFncywgMHhGRkZGRkZGRik7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFncyk7CisKKyAgLyogbm93IHRoZSByZWFsIHRlc3RzICovCisgIGZvciAoaSA9IDA7IGkgPCA1MDsgKytpKSB7CisgICAgZ3VpbnQzMiBtYXNrOworCisgICAgbWFzayA9IGdfcmFuZG9tX2ludCAoKTsKKyAgICBHU1RfTE9HICgidGFnIG1hc2sgPSAlMDh4IChpPSVkKSIsIG1hc2ssIGkpOworCisgICAgaWYgKG1hc2sgPT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogY3JlYXRlIHRhZ3MgKi8KKyAgICB0YWdzID0gdGVzdF90YWdsaWJfYXBldjJtdXhfY3JlYXRlX3RhZ3MgKG1hc2spOworICAgIEdTVF9MT0cgKCJ0YWdzIGZvciBtYXNrICUwOHggPSAlIiBHU1RfUFRSX0ZPUk1BVCwgbWFzaywgdGFncyk7CisKKyAgICAvKiBkb3VibGUtY2hlY2sgZm9yIGludGVybmFsIGNvbnNpc3RlbmN5ICovCisgICAgdGVzdF90YWdsaWJfYXBldjJtdXhfY2hlY2tfdGFncyAodGFncywgbWFzayk7CisKKyAgICAvKiB0ZXN0IHdpdGggcGlwZWxpbmUgKi8KKyAgICB0ZXN0X3RhZ2xpYl9hcGV2Mm11eF93aXRoX3RhZ3MgKHRhZ3MsIG1hc2spOworCisgICAgLyogZnJlZSB0YWdzICovCisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdzKTsKKyAgfQorfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCithcGV2Mm11eF9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJhcGV2Mm11eCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hcGV2Mm11eCk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChhcGV2Mm11eCk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9hc3BlY3RyYXRpb2Nyb3AuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2FzcGVjdHJhdGlvY3JvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZDZmYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hc3BlY3RyYXRpb2Nyb3AuYwpAQCAtMCwwICsxLDE3NSBAQAorLyogR1N0cmVhbWVyIHVuaXQgdGVzdCBmb3IgdGhlIGFzcGVjdHJhdGlvY3JvcCBlbGVtZW50CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisjZGVmaW5lIEFTUEVDVF9SQVRJT19DUk9QX0NBUFMgICAgICAgICAgICAgICAgICAgICAgXAorICBHU1RfVklERU9fQ0FQU19NQUtFICgieyBSR0J4LCB4UkdCLCBCR1J4LCB4QkdSLCAiIFwKKyAgICAgICJSR0JBLCBBUkdCLCBCR1JBLCBBQkdSLCBSR0IsIEJHUiwgQVlVViwgIiAgICBcCisgICAgICAiWVVZMiwgWVZZVSwgVVlWWSwgR1JBWTgsIEk0MjAsIFlWMTIsIFJHQjE2LCAiIFwKKyAgICAgICJSR0IxNSB9IikKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoQVNQRUNUX1JBVElPX0NST1BfQ0FQUykKKyAgICApOworCitzdGF0aWMgdm9pZAorY2hlY2tfYXNwZWN0cmF0aW9jcm9wIChjb25zdCBnY2hhciAqIGluX3N0cmluZywgY29uc3QgZ2NoYXIgKiBvdXRfc3RyaW5nLAorICAgIGdpbnQgaW5fc2l6ZSwgZ2ludCBvdXRfc2l6ZSwgZ2ludCBhcl9uLCBnaW50IGFyX2QpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisgIEdzdFBhZCAqcGFkX3BlZXI7CisgIEdzdFBhZCAqc2lua19wYWQgPSBOVUxMOworICBHc3RQYWQgKnNyY19wYWQ7CisgIEdzdEJ1ZmZlciAqbmV3OworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0QnVmZmVyICpidWZmZXJfb3V0OworICBHc3RDYXBzICppbmNhcHM7CisgIEdzdENhcHMgKm91dGNhcHM7CisKKyAgaW5jYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKGluX3N0cmluZyk7CisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoaW5fc2l6ZSk7CisgIG91dGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAob3V0X3N0cmluZyk7CisgIGJ1ZmZlcl9vdXQgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG91dF9zaXplKTsKKworICAvKiBjaGVjayB0aGF0IHRoZXJlIGFyZSBubyBidWZmZXJzIHdhaXRpbmcgKi8KKyAgZ3N0X2NoZWNrX2Ryb3BfYnVmZmVycyAoKTsKKworICAvKiBjcmVhdGUgdGhlIGVsZW1lbnQgKi8KKyAgZWxlbWVudCA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgiYXNwZWN0cmF0aW9jcm9wIik7CisKKyAgLyogc2V0IHRoZSByZXF1ZXN0ZWQgYXNwZWN0IHJhdGlvICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGVsZW1lbnQpLCAiYXNwZWN0LXJhdGlvIiwgYXJfbiwgYXJfZCwgTlVMTCk7CisKKyAgLyogY3JlYXRlIHRoZSBzcmMgcGFkICovCisgIHNyY19wYWQgPSBnc3RfcGFkX25ldyAoTlVMTCwgR1NUX1BBRF9TUkMpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNyY19wYWQsIFRSVUUpOworICBHU1RfREVCVUcgKCJzZXR0aW5nIGNhcHMgJXMgJSIgR1NUX1BUUl9GT1JNQVQsIGluX3N0cmluZywgaW5jYXBzKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAoc3JjX3BhZCwgZWxlbWVudCwgaW5jYXBzLCBHU1RfRk9STUFUX1RJTUUpOworCisgIHBhZF9wZWVyID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGVsZW1lbnQsICJzaW5rIik7CisgIGZhaWxfaWYgKHBhZF9wZWVyID09IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rIChzcmNfcGFkLCBwYWRfcGVlcikgPT0gR1NUX1BBRF9MSU5LX09LLAorICAgICAgIkNvdWxkIG5vdCBsaW5rIHNvdXJjZSBhbmQgJXMgc2luayBwYWRzIiwgR1NUX0VMRU1FTlRfTkFNRSAoZWxlbWVudCkpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWRfcGVlcik7CisKKyAgLyogY3JlYXRlIHRoZSBzaW5rIHBhZCAqLworICBwYWRfcGVlciA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChlbGVtZW50LCAic3JjIik7CisgIHNpbmtfcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rdGVtcGxhdGUsICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHBhZF9wZWVyLCBzaW5rX3BhZCkgPT0gR1NUX1BBRF9MSU5LX09LLAorICAgICAgIkNvdWxkIG5vdCBsaW5rIHNpbmsgYW5kICVzIHNvdXJjZSBwYWRzIiwgR1NUX0VMRU1FTlRfTkFNRSAoZWxlbWVudCkpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWRfcGVlcik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChzaW5rX3BhZCwgZ3N0X2NoZWNrX2NoYWluX2Z1bmMpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNpbmtfcGFkLCBUUlVFKTsKKworICAvKiBjb25maWd1cmUgdGhlIHNpbmsgcGFkICovCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChzcmNfcGFkLCBidWZmZXIpID09IEdTVF9GTE9XX09LLAorICAgICAgIkZhaWxlZCB0byBwdXNoIGJ1ZmZlciIpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsICJjb3VsZCBub3Qgc2V0IHRvIG51bGwiKTsKKworICAvKiBjaGVjayB0aGUgcmVzdWx0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA9PSAxKTsKKyAgbmV3ID0gR1NUX0JVRkZFUiAoYnVmZmVycy0+ZGF0YSk7CisgIGJ1ZmZlcnMgPSBnX2xpc3RfcmVtb3ZlIChidWZmZXJzLCBuZXcpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyX291dCkgPT0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAobmV3KSwKKyAgICAgICJzaXplIG9mIHRoZSBidWZmZXJzIGFyZSBub3QgdGhlIHNhbWUiKTsKKyAgeworICAgIEdzdENhcHMgKnNpbmtwYWRfY2FwczsKKworICAgIHNpbmtwYWRfY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoc2lua19wYWQpOworCisgICAgZ3N0X2NoZWNrX2NhcHNfZXF1YWwgKHNpbmtwYWRfY2Fwcywgb3V0Y2Fwcyk7CisKKyAgICBnc3RfY2Fwc191bnJlZiAoc2lua3BhZF9jYXBzKTsKKyAgfQorICBnc3RfYnVmZmVyX3VucmVmIChuZXcpOworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXJfb3V0KTsKKyAgZ3N0X2NhcHNfdW5yZWYgKG91dGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoaW5jYXBzKTsKKworICAvKiB0ZWFyZG93biB0aGUgZWxlbWVudCBhbmQgcGFkcyAqLworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNyY19wYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKGVsZW1lbnQpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNpbmtfcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoZWxlbWVudCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChlbGVtZW50KTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfbm9fY3JvcHBpbmcpCit7CisgIGNoZWNrX2FzcGVjdHJhdGlvY3JvcAorICAgICAgKCJ2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpWVVZMiwgd2lkdGg9KGludCkzMjAsIGhlaWdodD0oaW50KTI0MCwgZnJhbWVyYXRlPShmcmFjdGlvbikzMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpWVVZMiwgd2lkdGg9KGludCkzMjAsIGhlaWdodD0oaW50KTI0MCwgZnJhbWVyYXRlPShmcmFjdGlvbikzMC8xIiwKKyAgICAgIDE1MzYwMCwgMTUzNjAwLCA0LCAzKTsKKyAgY2hlY2tfYXNwZWN0cmF0aW9jcm9wCisgICAgICAoInZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylZVVkyLCB3aWR0aD0oaW50KTMyMCwgaGVpZ2h0PShpbnQpMzIwLCBmcmFtZXJhdGU9KGZyYWN0aW9uKTMwLzEsIHBpeGVsLWFzcGVjdC1yYXRpbz0oZnJhY3Rpb24pNC8zIiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpWVVZMiwgd2lkdGg9KGludCkzMjAsIGhlaWdodD0oaW50KTMyMCwgZnJhbWVyYXRlPShmcmFjdGlvbikzMC8xLCBwaXhlbC1hc3BlY3QtcmF0aW89KGZyYWN0aW9uKTQvMyIsCisgICAgICAyMDQ4MDAsIDIwNDgwMCwgNCwgMyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYXV0b2Nyb3BwaW5nKQoreworICBjaGVja19hc3BlY3RyYXRpb2Nyb3AKKyAgICAgICgidmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVlVWTIsIHdpZHRoPShpbnQpMzIwLCBoZWlnaHQ9KGludCkyNDAsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pMzAvMSwgcGl4ZWwtYXNwZWN0LXJhdGlvPShmcmFjdGlvbik0LzMiLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylZVVkyLCB3aWR0aD0oaW50KTI0MCwgaGVpZ2h0PShpbnQpMjQwLCBmcmFtZXJhdGU9KGZyYWN0aW9uKTMwLzEsIHBpeGVsLWFzcGVjdC1yYXRpbz0oZnJhY3Rpb24pNC8zIiwKKyAgICAgIDE1MzYwMCwgMTE1MjAwLCA0LCAzKTsKKworICBjaGVja19hc3BlY3RyYXRpb2Nyb3AKKyAgICAgICgidmlkZW8veC1yYXcsIGZvcm1hdD0oc3RyaW5nKVlVWTIsIHdpZHRoPShpbnQpMzIwLCBoZWlnaHQ9KGludCkyNDAsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pMzAvMSwgcGl4ZWwtYXNwZWN0LXJhdGlvPShmcmFjdGlvbikxNi85IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PShzdHJpbmcpWVVZMiwgd2lkdGg9KGludCkxODAsIGhlaWdodD0oaW50KTI0MCwgZnJhbWVyYXRlPShmcmFjdGlvbikzMC8xLCBwaXhlbC1hc3BlY3QtcmF0aW89KGZyYWN0aW9uKTE2LzkiLAorICAgICAgMTUzNjAwLCA4NjQwMCwgNCwgMyk7CisKKyAgY2hlY2tfYXNwZWN0cmF0aW9jcm9wCisgICAgICAoInZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylZVVkyLCB3aWR0aD0oaW50KTMyMCwgaGVpZ2h0PShpbnQpMjQwLCBmcmFtZXJhdGU9KGZyYWN0aW9uKTMwLzEsIHBpeGVsLWFzcGVjdC1yYXRpbz0oZnJhY3Rpb24pMTYvMTUiLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylZVVkyLCB3aWR0aD0oaW50KTMyMCwgaGVpZ2h0PShpbnQpMTkyLCBmcmFtZXJhdGU9KGZyYWN0aW9uKTMwLzEsIHBpeGVsLWFzcGVjdC1yYXRpbz0oZnJhY3Rpb24pMTYvMTUiLAorICAgICAgMTUzNjAwLCAxMjI4ODAsIDE2LCA5KTsKKworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCithc3BlY3RyYXRpb2Nyb3Bfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiYXNwZWN0cmF0aW9jcm9wIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X25vX2Nyb3BwaW5nKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2F1dG9jcm9wcGluZyk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChhc3BlY3RyYXRpb2Nyb3ApOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9hbXBsaWZ5LmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2FtcGxpZnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmUzYzJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9hbXBsaWZ5LmMKQEAgLTAsMCArMSw0NjcgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIHVuaXQgdGVzdCBmb3IgYXVkaW9hbXBsaWZ5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBHcmVhdGx5IGJhc2VkIG9uIHRoZSBhdWRpb3Bhbm9yYW1hIHVuaXQgdGVzdAorICogQ29weXJpZ2h0IChDKSAyMDA2IFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKK2dib29sZWFuIGhhdmVfZW9zID0gRkFMU0U7CisKKy8qIEZvciBlYXNlIG9mIHByb2dyYW1taW5nIHdlIHVzZSBnbG9iYWxzIHRvIGtlZXAgcmVmcyBmb3Igb3VyIGZsb2F0aW5nCisgKiBzcmMgYW5kIHNpbmsgcGFkcyB3ZSBjcmVhdGU7IG90aGVyd2lzZSB3ZSBhbHdheXMgaGF2ZSB0byBkbyBnZXRfcGFkLAorICogZ2V0X3BlZXIsIGFuZCB0aGVuIHJlbW92ZSByZWZlcmVuY2VzIGluIGV2ZXJ5IHRlc3QgZnVuY3Rpb24gKi8KK0dzdFBhZCAqbXlzcmNwYWQsICpteXNpbmtwYWQ7CisKKworI2RlZmluZSBBTVBMSUZZX0NBUFNfU1RSSU5HICAgIFwKKyAgICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAgICAgICAgICAgICAgXAorICAgICJyYXRlID0gKGludCkgNDQxMDAsICIgICAgICAgICAgICAgIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgICBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FKFMxNikKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsICBNQVggXSwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChTMTYpKSk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgIE1BWCBdLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKFMxNikpKTsKKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfYW1wbGlmeSAodm9pZCkKK3sKKyAgR3N0RWxlbWVudCAqYW1wbGlmeTsKKworICBHU1RfREVCVUcgKCJzZXR1cF9hbXBsaWZ5Iik7CisgIGFtcGxpZnkgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoImF1ZGlvYW1wbGlmeSIpOworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChhbXBsaWZ5LCAmc3JjdGVtcGxhdGUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGFtcGxpZnksICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworCisgIHJldHVybiBhbXBsaWZ5OworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF9hbXBsaWZ5IChHc3RFbGVtZW50ICogYW1wbGlmeSkKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF9hbXBsaWZ5Iik7CisKKyAgZ19saXN0X2ZvcmVhY2ggKGJ1ZmZlcnMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICBidWZmZXJzID0gTlVMTDsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkIChhbXBsaWZ5KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChhbXBsaWZ5KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGFtcGxpZnkpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXNzdGhyb3VnaCkKK3sKKyAgR3N0RWxlbWVudCAqYW1wbGlmeTsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludDE2IGluWzZdID0geyAyNDU3NiwgLTE2Mzg0LCAyNTYsIC0xMjgsIDAsIC0yNDU3NiB9OworICBnaW50MTYgcmVzWzZdOworCisgIGFtcGxpZnkgPSBzZXR1cF9hbXBsaWZ5ICgpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhbXBsaWZ5LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBTVBMSUZZX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGFtcGxpZnksIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBpbmJ1ZmZlciA9CisgICAgICBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwgaW4sIDEyLCAwLCAxMiwKKyAgICAgIE5VTEwsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKGluYnVmZmVyLCAwLCBpbiwgMTIpID09IDApOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBidXQgaXQgZW5kcyB1cCBiZWluZyBjb2xsZWN0ZWQgb24gdGhlIGdsb2JhbCBidWZmZXIgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2V4dHJhY3QgKG91dGJ1ZmZlciwgMCwgcmVzLCAxMikgPT0gMTIpOworICBHU1RfSU5GTworICAgICAgKCJleHBlY3RlZCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCByZWFsICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkIiwKKyAgICAgIGluWzBdLCBpblsxXSwgaW5bMl0sIGluWzNdLCBpbls0XSwgaW5bNV0sIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSwKKyAgICAgIHJlc1s0XSwgcmVzWzVdKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIDAsIGluLCAxMikgPT0gMCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2FtcGxpZnkgKGFtcGxpZnkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3plcm8pCit7CisgIEdzdEVsZW1lbnQgKmFtcGxpZnk7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdpbnQxNiBpbls2XSA9IHsgMjQ1NzYsIC0xNjM4NCwgMjU2LCAtMTI4LCAwLCAtMjQ1NzYgfTsKKyAgZ2ludDE2IG91dFs2XSA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworICBnaW50MTYgcmVzWzZdOworCisgIGFtcGxpZnkgPSBzZXR1cF9hbXBsaWZ5ICgpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhbXBsaWZ5KSwgImFtcGxpZmljYXRpb24iLCAwLjAsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhbXBsaWZ5LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBTVBMSUZZX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGFtcGxpZnksIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBpbmJ1ZmZlciA9CisgICAgICBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwgaW4sIDEyLCAwLCAxMiwKKyAgICAgIE5VTEwsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKGluYnVmZmVyLCAwLCBpbiwgMTIpID09IDApOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZXh0cmFjdCAob3V0YnVmZmVyLCAwLCByZXMsIDEyKSA9PSAxMik7CisgIEdTVF9JTkZPCisgICAgICAoImV4cGVjdGVkICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkIHJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQiLAorICAgICAgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdLCBvdXRbNF0sIG91dFs1XSwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwKKyAgICAgIHJlc1szXSwgcmVzWzRdLCByZXNbNV0pOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgb3V0LCAxMikgPT0gMCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2FtcGxpZnkgKGFtcGxpZnkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0XzA1MF9jbGlwKQoreworICBHc3RFbGVtZW50ICphbXBsaWZ5OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnaW50MTYgaW5bNl0gPSB7IDI0NTc2LCAtMTYzODQsIDI1NiwgLTEyOCwgMCwgLTI0NTc2IH07CisgIGdpbnQxNiBvdXRbNl0gPSB7IDEyMjg4LCAtODE5MiwgMTI4LCAtNjQsIDAsIC0xMjI4OCB9OworICBnaW50MTYgcmVzWzZdOworCisgIGFtcGxpZnkgPSBzZXR1cF9hbXBsaWZ5ICgpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhbXBsaWZ5KSwgImFtcGxpZmljYXRpb24iLCAwLjUsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhbXBsaWZ5LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBTVBMSUZZX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGFtcGxpZnksIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBpbmJ1ZmZlciA9CisgICAgICBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwgaW4sIDEyLCAwLCAxMiwKKyAgICAgIE5VTEwsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKGluYnVmZmVyLCAwLCBpbiwgMTIpID09IDApOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZXh0cmFjdCAob3V0YnVmZmVyLCAwLCByZXMsIDEyKSA9PSAxMik7CisgIEdTVF9JTkZPCisgICAgICAoImV4cGVjdGVkICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkIHJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQiLAorICAgICAgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdLCBvdXRbNF0sIG91dFs1XSwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwKKyAgICAgIHJlc1szXSwgcmVzWzRdLCByZXNbNV0pOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgb3V0LCAxMikgPT0gMCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2FtcGxpZnkgKGFtcGxpZnkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0XzIwMF9jbGlwKQoreworICBHc3RFbGVtZW50ICphbXBsaWZ5OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnaW50MTYgaW5bNl0gPSB7IDI0NTc2LCAtMTYzODQsIDI1NiwgLTEyOCwgMCwgLTI0NTc2IH07CisgIGdpbnQxNiBvdXRbNl0gPSB7IEdfTUFYSU5UMTYsIC0zMjc2OCwgNTEyLCAtMjU2LCAwLCBHX01JTklOVDE2IH07CisgIGdpbnQxNiByZXNbNl07CisKKyAgYW1wbGlmeSA9IHNldHVwX2FtcGxpZnkgKCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGFtcGxpZnkpLCAiYW1wbGlmaWNhdGlvbiIsIDIuMCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGFtcGxpZnksCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFNUExJRllfQ0FQU19TVFJJTkcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYW1wbGlmeSwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGluYnVmZmVyID0KKyAgICAgIGdzdF9idWZmZXJfbmV3X3dyYXBwZWRfZnVsbCAoR1NUX01FTU9SWV9GTEFHX1JFQURPTkxZLCBpbiwgMTIsIDAsIDEyLAorICAgICAgTlVMTCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoaW5idWZmZXIsIDAsIGluLCAxMikgPT0gMCk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9leHRyYWN0IChvdXRidWZmZXIsIDAsIHJlcywgMTIpID09IDEyKTsKKyAgR1NUX0lORk8KKyAgICAgICgiZXhwZWN0ZWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQgcmVhbCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsCisgICAgICBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10sIG91dFs0XSwgb3V0WzVdLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLAorICAgICAgcmVzWzNdLCByZXNbNF0sIHJlc1s1XSk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCAwLCBvdXQsIDEyKSA9PSAwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYW1wbGlmeSAoYW1wbGlmeSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfMDUwX3dyYXBfbmVnYXRpdmUpCit7CisgIEdzdEVsZW1lbnQgKmFtcGxpZnk7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdpbnQxNiBpbls2XSA9IHsgMjQ1NzYsIC0xNjM4NCwgMjU2LCAtMTI4LCAwLCAtMjQ1NzYgfTsKKyAgZ2ludDE2IG91dFs2XSA9IHsgMTIyODgsIC04MTkyLCAxMjgsIC02NCwgMCwgLTEyMjg4IH07CisgIGdpbnQxNiByZXNbNl07CisKKyAgYW1wbGlmeSA9IHNldHVwX2FtcGxpZnkgKCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGFtcGxpZnkpLCAiYW1wbGlmaWNhdGlvbiIsIDAuNSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGFtcGxpZnkpLCAiY2xpcHBpbmctbWV0aG9kIiwgMSwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGFtcGxpZnksCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFNUExJRllfQ0FQU19TVFJJTkcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYW1wbGlmeSwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGluYnVmZmVyID0KKyAgICAgIGdzdF9idWZmZXJfbmV3X3dyYXBwZWRfZnVsbCAoR1NUX01FTU9SWV9GTEFHX1JFQURPTkxZLCBpbiwgMTIsIDAsIDEyLAorICAgICAgTlVMTCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoaW5idWZmZXIsIDAsIGluLCAxMikgPT0gMCk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9leHRyYWN0IChvdXRidWZmZXIsIDAsIHJlcywgMTIpID09IDEyKTsKKyAgR1NUX0lORk8KKyAgICAgICgiZXhwZWN0ZWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQgcmVhbCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsCisgICAgICBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10sIG91dFs0XSwgb3V0WzVdLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLAorICAgICAgcmVzWzNdLCByZXNbNF0sIHJlc1s1XSk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCAwLCBvdXQsIDEyKSA9PSAwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYW1wbGlmeSAoYW1wbGlmeSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfMjAwX3dyYXBfbmVnYXRpdmUpCit7CisgIEdzdEVsZW1lbnQgKmFtcGxpZnk7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdpbnQxNiBpbls2XSA9IHsgMjQ1NzYsIC0xNjM4NCwgMjU2LCAtMTI4LCAwLCAtMjQ1NzYgfTsKKyAgZ2ludDE2IG91dFs2XSA9IHsgLTE2Mzg0LCAtMzI3NjgsIDUxMiwgLTI1NiwgMCwgMTYzODQgfTsKKyAgZ2ludDE2IHJlc1s2XTsKKworICBhbXBsaWZ5ID0gc2V0dXBfYW1wbGlmeSAoKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYW1wbGlmeSksICJhbXBsaWZpY2F0aW9uIiwgMi4wLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYW1wbGlmeSksICJjbGlwcGluZy1tZXRob2QiLCAxLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYW1wbGlmeSwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQU1QTElGWV9DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhbXBsaWZ5LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgaW5idWZmZXIgPQorICAgICAgZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksIGluLCAxMiwgMCwgMTIsCisgICAgICBOVUxMLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChpbmJ1ZmZlciwgMCwgaW4sIDEyKSA9PSAwKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2V4dHJhY3QgKG91dGJ1ZmZlciwgMCwgcmVzLCAxMikgPT0gMTIpOworICBHU1RfSU5GTworICAgICAgKCJleHBlY3RlZCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCByZWFsICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkIiwKKyAgICAgIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSwgb3V0WzRdLCBvdXRbNV0sIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sCisgICAgICByZXNbM10sIHJlc1s0XSwgcmVzWzVdKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIDAsIG91dCwgMTIpID09IDApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hbXBsaWZ5IChhbXBsaWZ5KTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF8wNTBfd3JhcF9wb3NpdGl2ZSkKK3sKKyAgR3N0RWxlbWVudCAqYW1wbGlmeTsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludDE2IGluWzZdID0geyAyNDU3NiwgLTE2Mzg0LCAyNTYsIC0xMjgsIDAsIC0yNDU3NiB9OworICBnaW50MTYgb3V0WzZdID0geyAxMjI4OCwgLTgxOTIsIDEyOCwgLTY0LCAwLCAtMTIyODggfTsKKyAgZ2ludDE2IHJlc1s2XTsKKworICBhbXBsaWZ5ID0gc2V0dXBfYW1wbGlmeSAoKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYW1wbGlmeSksICJhbXBsaWZpY2F0aW9uIiwgMC41LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYW1wbGlmeSksICJjbGlwcGluZy1tZXRob2QiLCAyLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYW1wbGlmeSwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQU1QTElGWV9DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhbXBsaWZ5LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgaW5idWZmZXIgPQorICAgICAgZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksIGluLCAxMiwgMCwgMTIsCisgICAgICBOVUxMLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChpbmJ1ZmZlciwgMCwgaW4sIDEyKSA9PSAwKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2V4dHJhY3QgKG91dGJ1ZmZlciwgMCwgcmVzLCAxMikgPT0gMTIpOworICBHU1RfSU5GTworICAgICAgKCJleHBlY3RlZCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCByZWFsICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkIiwKKyAgICAgIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSwgb3V0WzRdLCBvdXRbNV0sIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sCisgICAgICByZXNbM10sIHJlc1s0XSwgcmVzWzVdKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIDAsIG91dCwgMTIpID09IDApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hbXBsaWZ5IChhbXBsaWZ5KTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF8yMDBfd3JhcF9wb3NpdGl2ZSkKK3sKKyAgR3N0RWxlbWVudCAqYW1wbGlmeTsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludDE2IGluWzZdID0geyAyNDU3NiwgLTE2Mzg0LCAyNTYsIC0xMjgsIDAsIC0yNDU3NiB9OworICBnaW50MTYgb3V0WzZdID0geyAxNjM4MiwgLTMyNzY4LCA1MTIsIC0yNTYsIDAsIC0xNjM4NCB9OworICBnaW50MTYgcmVzWzZdOworCisgIGFtcGxpZnkgPSBzZXR1cF9hbXBsaWZ5ICgpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhbXBsaWZ5KSwgImFtcGxpZmljYXRpb24iLCAyLjAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhbXBsaWZ5KSwgImNsaXBwaW5nLW1ldGhvZCIsIDIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhbXBsaWZ5LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBTVBMSUZZX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGFtcGxpZnksIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBpbmJ1ZmZlciA9CisgICAgICBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwgaW4sIDEyLCAwLCAxMiwKKyAgICAgIE5VTEwsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKGluYnVmZmVyLCAwLCBpbiwgMTIpID09IDApOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZXh0cmFjdCAob3V0YnVmZmVyLCAwLCByZXMsIDEyKSA9PSAxMik7CisgIEdTVF9JTkZPCisgICAgICAoImV4cGVjdGVkICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkIHJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQiLAorICAgICAgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdLCBvdXRbNF0sIG91dFs1XSwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwKKyAgICAgIHJlc1szXSwgcmVzWzRdLCByZXNbNV0pOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgb3V0LCAxMikgPT0gMCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2FtcGxpZnkgKGFtcGxpZnkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCithbXBsaWZ5X3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImFtcGxpZnkiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFzc3Rocm91Z2gpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfemVybyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF8wNTBfY2xpcCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF8yMDBfY2xpcCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF8wNTBfd3JhcF9uZWdhdGl2ZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF8yMDBfd3JhcF9uZWdhdGl2ZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF8wNTBfd3JhcF9wb3NpdGl2ZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF8yMDBfd3JhcF9wb3NpdGl2ZSk7CisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoYW1wbGlmeSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJiYW5kLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2NoZWJiYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzNmUyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmJhbmQuYwpAQCAtMCwwICsxLDE2NzAgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogYXVkaW9jaGViYmFuZC5jOiBVbml0IHRlc3QgZm9yIHRoZSBhdWRpb2NoZWJiYW5kIGVsZW1lbnQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworI2luY2x1ZGUgPG1hdGguaD4KKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcKKyAqIHNyYyBhbmQgc2luayBwYWRzIHdlIGNyZWF0ZTsgb3RoZXJ3aXNlIHdlIGFsd2F5cyBoYXZlIHRvIGRvIGdldF9wYWQsCisgKiBnZXRfcGVlciwgYW5kIHRoZW4gcmVtb3ZlIHJlZmVyZW5jZXMgaW4gZXZlcnkgdGVzdCBmdW5jdGlvbiAqLworR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKKworI2RlZmluZSBCVUZGRVJfQ0FQU19TVFJJTkdfMzIgICAgICAgICAgIFwKKyAgICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAgICAgICAgICAgICAgXAorICAgICJyYXRlID0gKGludCkgNDQxMDAsICIgICAgICAgICAgICAgIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgICBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FKEYzMikKKworI2RlZmluZSBCVUZGRVJfQ0FQU19TVFJJTkdfNjQgICAgICAgICAgIFwKKyAgICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAgICAgICAgICAgICAgXAorICAgICJyYXRlID0gKGludCkgNDQxMDAsICIgICAgICAgICAgICAgIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgICBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FKEY2NCkKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSA0NDEwMCwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgIgorICAgICAgICBHU1RfQVVESU9fTkUgKEYzMikgIiwgIiBHU1RfQVVESU9fTkUgKEY2NCkgIiB9IikpOworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSA0NDEwMCwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgIgorICAgICAgICBHU1RfQVVESU9fTkUgKEYzMikgIiwgIiBHU1RfQVVESU9fTkUgKEY2NCkgIiB9IikpOworCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9hdWRpb2NoZWJiYW5kICh2b2lkKQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworCisgIEdTVF9ERUJVRyAoInNldHVwX2F1ZGlvY2hlYmJhbmQiKTsKKyAgYXVkaW9jaGViYmFuZCA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgiYXVkaW9jaGViYmFuZCIpOworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChhdWRpb2NoZWJiYW5kLCAmc3JjdGVtcGxhdGUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGF1ZGlvY2hlYmJhbmQsICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworCisgIHJldHVybiBhdWRpb2NoZWJiYW5kOworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF9hdWRpb2NoZWJiYW5kIChHc3RFbGVtZW50ICogYXVkaW9jaGViYmFuZCkKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF9hdWRpb2NoZWJiYW5kIik7CisKKyAgZ19saXN0X2ZvcmVhY2ggKGJ1ZmZlcnMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICBidWZmZXJzID0gTlVMTDsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkIChhdWRpb2NoZWJiYW5kKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChhdWRpb2NoZWJiYW5kKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGF1ZGlvY2hlYmJhbmQpOworfQorCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCAwIGlzIGVyYXNlZCB3aXRoIGJhbmRwYXNzIG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTFfMzJfYnBfMGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGViYmFuZCA9IHNldHVwX2F1ZGlvY2hlYmJhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInR5cGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJyaXBwbGUiLCAwLjI1LCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgMTAyNCAqIHNpemVvZiAoZ2Zsb2F0KSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmJhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEwMjQuMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4xKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJiYW5kIChhdWRpb2NoZWJiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCBiYW5kIGNlbnRlciBpcyBwcmVzZXJ2ZWQgd2l0aCBiYW5kcGFzcyBtb2RlIGFuZCBhIAorICogMjAwMEh6IGZyZXF1ZW5jeSBiYW5kIGFyb3VuZCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUxXzMyX2JwXzExMDI1aHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmJhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJiYW5kID0gc2V0dXBfYXVkaW9jaGViYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidHlwZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInJpcHBsZSIsIDAuMjUsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmJhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMDI0ICogc2l6ZW9mIChnZmxvYXQpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSA0KSB7CisgICAgaW5baV0gPSAwLjA7CisgICAgaW5baSArIDFdID0gMS4wOworICAgIGluW2kgKyAyXSA9IDAuMDsKKyAgICBpbltpICsgM10gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zID49IDAuNik7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIGVyYXNlZCB3aXRoIGJhbmRwYXNzIG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTFfMzJfYnBfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGViYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmJhbmQgPSBzZXR1cF9hdWRpb2NoZWJiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ0eXBlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicmlwcGxlIiwgMC4yNSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGViYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDEwMjQgKiBzaXplb2YgKGdmbG9hdCksIE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpICs9IDIpIHsKKyAgICBpbltpXSA9IDEuMDsKKyAgICBpbltpICsgMV0gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgMCBpcyBwcmVzZXJ2ZWQgd2l0aCBiYW5kcmVqZWN0IG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTFfMzJfYnJfMGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGViYmFuZCA9IHNldHVwX2F1ZGlvY2hlYmJhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcmVqZWN0ICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidHlwZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInJpcHBsZSIsIDAuMjUsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmJhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMDI0ICogc2l6ZW9mIChnZmxvYXQpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIGluW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGViYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTAyNC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmJhbmQgKGF1ZGlvY2hlYmJhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IGJhbmQgY2VudGVyIGlzIGVyYXNlZCB3aXRoIGJhbmRyZWplY3QgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMV8zMl9icl8xMTAyNWh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGViYmFuZCA9IHNldHVwX2F1ZGlvY2hlYmJhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcmVqZWN0ICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidHlwZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInJpcHBsZSIsIDAuMjUsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmJhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMDI0ICogc2l6ZW9mIChnZmxvYXQpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSA0KSB7CisgICAgaW5baV0gPSAwLjA7CisgICAgaW5baSArIDFdID0gMS4wOworICAgIGluW2kgKyAyXSA9IDAuMDsKKyAgICBpbltpICsgM10gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIHByZXNlcnZlZCB3aXRoIGJhbmRyZWplY3QgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMV8zMl9icl8yMjA1MGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGViYmFuZCA9IHNldHVwX2F1ZGlvY2hlYmJhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcmVqZWN0ICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidHlwZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInJpcHBsZSIsIDAuMjUsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmJhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMDI0ICogc2l6ZW9mIChnZmxvYXQpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGViYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTAyNC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmJhbmQgKGF1ZGlvY2hlYmJhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IDAgaXMgZXJhc2VkIHdpdGggYmFuZHBhc3MgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMV82NF9icF8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmJhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGViYmFuZCA9IHNldHVwX2F1ZGlvY2hlYmJhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInR5cGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJyaXBwbGUiLCAwLjI1LCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEwMjQgKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmJhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgYmFuZCBjZW50ZXIgaXMgcHJlc2VydmVkIHdpdGggYmFuZHBhc3MgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMV82NF9icF8xMTAyNWh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmJhbmQgPSBzZXR1cF9hdWRpb2NoZWJiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ0eXBlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicmlwcGxlIiwgMC4yNSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGViYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpICs9IDQpIHsKKyAgICBpbltpXSA9IDAuMDsKKyAgICBpbltpICsgMV0gPSAxLjA7CisgICAgaW5baSArIDJdID0gMC4wOworICAgIGluW2kgKyAzXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmJhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zID49IDAuNik7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIGVyYXNlZCB3aXRoIGJhbmRwYXNzIG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTFfNjRfYnBfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGViYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJiYW5kID0gc2V0dXBfYXVkaW9jaGViYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidHlwZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInJpcHBsZSIsIDAuMjUsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmJhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAyNCAqIHNpemVvZiAoZ2RvdWJsZSkpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGViYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEwMjQuMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4xKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJiYW5kIChhdWRpb2NoZWJiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCAwIGlzIHByZXNlcnZlZCB3aXRoIGJhbmRyZWplY3QgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMV82NF9icl8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmJhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGViYmFuZCA9IHNldHVwX2F1ZGlvY2hlYmJhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcmVqZWN0ICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidHlwZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInJpcHBsZSIsIDAuMjUsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmJhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAyNCAqIHNpemVvZiAoZ2RvdWJsZSkpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIGluW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGViYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEwMjQuMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPj0gMC45KTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJiYW5kIChhdWRpb2NoZWJiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCBiYW5kIGNlbnRlciBpcyBlcmFzZWQgd2l0aCBiYW5kcmVqZWN0IG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTFfNjRfYnJfMTEwMjVoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGViYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJiYW5kID0gc2V0dXBfYXVkaW9jaGViYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRyZWplY3QgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ0eXBlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicmlwcGxlIiwgMC4yNSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGViYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpICs9IDQpIHsKKyAgICBpbltpXSA9IDAuMDsKKyAgICBpbltpICsgMV0gPSAxLjA7CisgICAgaW5baSArIDJdID0gMC4wOworICAgIGluW2kgKyAzXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmJhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIHByZXNlcnZlZCB3aXRoIGJhbmRyZWplY3QgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMV82NF9icl8yMjA1MGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmJhbmQgPSBzZXR1cF9hdWRpb2NoZWJiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHJlamVjdCAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInR5cGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJyaXBwbGUiLCAwLjI1LCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEwMjQgKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gMikgeworICAgIGluW2ldID0gMS4wOworICAgIGluW2kgKyAxXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmJhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zID49IDAuOSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgMCBpcyBlcmFzZWQgd2l0aCBiYW5kcGFzcyBtb2RlIGFuZCBhIAorICogMjAwMEh6IGZyZXF1ZW5jeSBiYW5kIGFyb3VuZCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUyXzMyX2JwXzBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGViYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmJhbmQgPSBzZXR1cF9hdWRpb2NoZWJiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ0eXBlIiwgMiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicmlwcGxlIiwgNDAuMCwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGViYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDEwMjQgKiBzaXplb2YgKGdmbG9hdCksIE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgaW5baV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgYmFuZCBjZW50ZXIgaXMgcHJlc2VydmVkIHdpdGggYmFuZHBhc3MgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMl8zMl9icF8xMTAyNWh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGViYmFuZCA9IHNldHVwX2F1ZGlvY2hlYmJhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInR5cGUiLCAyLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJyaXBwbGUiLCA0MC4wLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgMTAyNCAqIHNpemVvZiAoZ2Zsb2F0KSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gNCkgeworICAgIGluW2ldID0gMC4wOworICAgIGluW2kgKyAxXSA9IDEuMDsKKyAgICBpbltpICsgMl0gPSAwLjA7CisgICAgaW5baSArIDNdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGViYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTAyNC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjYpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmJhbmQgKGF1ZGlvY2hlYmJhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHJhdGUvMiBpcyBlcmFzZWQgd2l0aCBiYW5kcGFzcyBtb2RlIGFuZCBhIAorICogMjAwMEh6IGZyZXF1ZW5jeSBiYW5kIGFyb3VuZCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUyXzMyX2JwXzIyMDUwaHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmJhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJiYW5kID0gc2V0dXBfYXVkaW9jaGViYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidHlwZSIsIDIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInJpcHBsZSIsIDQwLjAsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmJhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMDI0ICogc2l6ZW9mIChnZmxvYXQpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGViYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTAyNC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjEpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmJhbmQgKGF1ZGlvY2hlYmJhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IDAgaXMgcHJlc2VydmVkIHdpdGggYmFuZHJlamVjdCBtb2RlIGFuZCBhIAorICogMjAwMEh6IGZyZXF1ZW5jeSBiYW5kIGFyb3VuZCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUyXzMyX2JyXzBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGViYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmJhbmQgPSBzZXR1cF9hdWRpb2NoZWJiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHJlamVjdCAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInR5cGUiLCAyLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJyaXBwbGUiLCA0MC4wLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgMTAyNCAqIHNpemVvZiAoZ2Zsb2F0KSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmJhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEwMjQuMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPj0gMC45KTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJiYW5kIChhdWRpb2NoZWJiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCBiYW5kIGNlbnRlciBpcyBlcmFzZWQgd2l0aCBiYW5kcmVqZWN0IG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTJfMzJfYnJfMTEwMjVoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGViYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmJhbmQgPSBzZXR1cF9hdWRpb2NoZWJiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHJlamVjdCAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInR5cGUiLCAyLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJyaXBwbGUiLCA0MC4wLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgMTAyNCAqIHNpemVvZiAoZ2Zsb2F0KSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gNCkgeworICAgIGluW2ldID0gMC4wOworICAgIGluW2kgKyAxXSA9IDEuMDsKKyAgICBpbltpICsgMl0gPSAwLjA7CisgICAgaW5baSArIDNdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGViYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTAyNC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjEpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmJhbmQgKGF1ZGlvY2hlYmJhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHJhdGUvMiBpcyBwcmVzZXJ2ZWQgd2l0aCBiYW5kcmVqZWN0IG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTJfMzJfYnJfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGViYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmJhbmQgPSBzZXR1cF9hdWRpb2NoZWJiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHJlamVjdCAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInR5cGUiLCAyLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJyaXBwbGUiLCA0MC4wLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgMTAyNCAqIHNpemVvZiAoZ2Zsb2F0KSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gMikgeworICAgIGluW2ldID0gMS4wOworICAgIGluW2kgKyAxXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmJhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEwMjQuMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPj0gMC45KTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJiYW5kIChhdWRpb2NoZWJiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCAwIGlzIGVyYXNlZCB3aXRoIGJhbmRwYXNzIG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTJfNjRfYnBfMGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmJhbmQgPSBzZXR1cF9hdWRpb2NoZWJiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ0eXBlIiwgMiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicmlwcGxlIiwgNDAuMCwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGViYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgaW5baV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR182NCk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTAyNC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjEpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmJhbmQgKGF1ZGlvY2hlYmJhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IGJhbmQgY2VudGVyIGlzIHByZXNlcnZlZCB3aXRoIGJhbmRwYXNzIG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTJfNjRfYnBfMTEwMjVoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGViYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJiYW5kID0gc2V0dXBfYXVkaW9jaGViYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidHlwZSIsIDIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInJpcHBsZSIsIDQwLjAsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmJhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAyNCAqIHNpemVvZiAoZ2RvdWJsZSkpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSA0KSB7CisgICAgaW5baV0gPSAwLjA7CisgICAgaW5baSArIDFdID0gMS4wOworICAgIGluW2kgKyAyXSA9IDAuMDsKKyAgICBpbltpICsgM10gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR182NCk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTAyNC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjYpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmJhbmQgKGF1ZGlvY2hlYmJhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHJhdGUvMiBpcyBlcmFzZWQgd2l0aCBiYW5kcGFzcyBtb2RlIGFuZCBhIAorICogMjAwMEh6IGZyZXF1ZW5jeSBiYW5kIGFyb3VuZCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUyXzY0X2JwXzIyMDUwaHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmJhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGViYmFuZCA9IHNldHVwX2F1ZGlvY2hlYmJhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInR5cGUiLCAyLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJyaXBwbGUiLCA0MC4wLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEwMjQgKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gMikgeworICAgIGluW2ldID0gMS4wOworICAgIGluW2kgKyAxXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmJhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgMCBpcyBwcmVzZXJ2ZWQgd2l0aCBiYW5kcmVqZWN0IG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTJfNjRfYnJfMGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmJhbmQgPSBzZXR1cF9hdWRpb2NoZWJiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHJlamVjdCAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInR5cGUiLCAyLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJyaXBwbGUiLCA0MC4wLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEwMjQgKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmJhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMDI0LjApOworICBmYWlsX3VubGVzcyAocm1zID49IDAuOSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGViYmFuZCAoYXVkaW9jaGViYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgYmFuZCBjZW50ZXIgaXMgZXJhc2VkIHdpdGggYmFuZHJlamVjdCBtb2RlIGFuZCBhIAorICogMjAwMEh6IGZyZXF1ZW5jeSBiYW5kIGFyb3VuZCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUyXzY0X2JyXzExMDI1aHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmJhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGViYmFuZCA9IHNldHVwX2F1ZGlvY2hlYmJhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcmVqZWN0ICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidHlwZSIsIDIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInJpcHBsZSIsIDQwLjAsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmJhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAyNCAqIHNpemVvZiAoZ2RvdWJsZSkpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSA0KSB7CisgICAgaW5baV0gPSAwLjA7CisgICAgaW5baSArIDFdID0gMS4wOworICAgIGluW2kgKyAyXSA9IDAuMDsKKyAgICBpbltpICsgM10gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR182NCk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTAyNC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjEpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmJhbmQgKGF1ZGlvY2hlYmJhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHJhdGUvMiBpcyBwcmVzZXJ2ZWQgd2l0aCBiYW5kcmVqZWN0IG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTJfNjRfYnJfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGViYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJiYW5kID0gc2V0dXBfYXVkaW9jaGViYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRyZWplY3QgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGViYmFuZCksICJ0eXBlIiwgMiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAicmlwcGxlIiwgNDAuMCwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGViYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmJhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpICs9IDIpIHsKKyAgICBpbltpXSA9IDEuMDsKKyAgICBpbltpICsgMV0gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR182NCk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTAyNC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmJhbmQgKGF1ZGlvY2hlYmJhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCithdWRpb2NoZWJiYW5kX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImF1ZGlvY2hlYmJhbmQiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTFfMzJfYnBfMGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUxXzMyX2JwXzExMDI1aHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTFfMzJfYnBfMjIwNTBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMV8zMl9icl8waHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTFfMzJfYnJfMTEwMjVoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMV8zMl9icl8yMjA1MGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUxXzY0X2JwXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMV82NF9icF8xMTAyNWh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUxXzY0X2JwXzIyMDUwaHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTFfNjRfYnJfMGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUxXzY0X2JyXzExMDI1aHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTFfNjRfYnJfMjIwNTBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMl8zMl9icF8waHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTJfMzJfYnBfMTEwMjVoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMl8zMl9icF8yMjA1MGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUyXzMyX2JyXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMl8zMl9icl8xMTAyNWh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUyXzMyX2JyXzIyMDUwaHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTJfNjRfYnBfMGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUyXzY0X2JwXzExMDI1aHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTJfNjRfYnBfMjIwNTBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMl82NF9icl8waHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdHlwZTJfNjRfYnJfMTEwMjVoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMl82NF9icl8yMjA1MGh6KTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGF1ZGlvY2hlYmJhbmQpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9jaGVibGltaXQuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmxpbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5ZWFiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvY2hlYmxpbWl0LmMKQEAgLTAsMCArMSwxMDg2IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIGF1ZGlvY2hlYmxpbWl0LmM6IFVuaXQgdGVzdCBmb3IgdGhlIGF1ZGlvY2hlYmxpbWl0IGVsZW1lbnQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworI2luY2x1ZGUgPG1hdGguaD4KKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcKKyAqIHNyYyBhbmQgc2luayBwYWRzIHdlIGNyZWF0ZTsgb3RoZXJ3aXNlIHdlIGFsd2F5cyBoYXZlIHRvIGRvIGdldF9wYWQsCisgKiBnZXRfcGVlciwgYW5kIHRoZW4gcmVtb3ZlIHJlZmVyZW5jZXMgaW4gZXZlcnkgdGVzdCBmdW5jdGlvbiAqLworR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKKworI2RlZmluZSBCVUZGRVJfQ0FQU19TVFJJTkdfMzIgICAgICAgICAgIFwKKyAgICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAgICAgICAgICAgICAgXAorICAgICJyYXRlID0gKGludCkgNDQxMDAsICIgICAgICAgICAgICAgIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgICBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FKEYzMikKKworI2RlZmluZSBCVUZGRVJfQ0FQU19TVFJJTkdfNjQgICAgICAgICAgIFwKKyAgICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAgICAgICAgICAgICAgXAorICAgICJyYXRlID0gKGludCkgNDQxMDAsICIgICAgICAgICAgICAgIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgICBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FKEY2NCkKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSA0NDEwMCwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgIgorICAgICAgICBHU1RfQVVESU9fTkUgKEYzMikgIiwgIiBHU1RfQVVESU9fTkUgKEY2NCkgIiB9IikpOworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSA0NDEwMCwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIHsgIgorICAgICAgICBHU1RfQVVESU9fTkUgKEYzMikgIiwgIiBHU1RfQVVESU9fTkUgKEY2NCkgIiB9IikpOworCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9hdWRpb2NoZWJsaW1pdCAodm9pZCkKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGVibGltaXQ7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfYXVkaW9jaGVibGltaXQiKTsKKyAgYXVkaW9jaGVibGltaXQgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoImF1ZGlvY2hlYmxpbWl0Iik7CisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKGF1ZGlvY2hlYmxpbWl0LCAmc3JjdGVtcGxhdGUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGF1ZGlvY2hlYmxpbWl0LCAmc2lua3RlbXBsYXRlKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICByZXR1cm4gYXVkaW9jaGVibGltaXQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX2F1ZGlvY2hlYmxpbWl0IChHc3RFbGVtZW50ICogYXVkaW9jaGVibGltaXQpCit7CisgIEdTVF9ERUJVRyAoImNsZWFudXBfYXVkaW9jaGVibGltaXQiKTsKKworICBnX2xpc3RfZm9yZWFjaCAoYnVmZmVycywgKEdGdW5jKSBnc3RfbWluaV9vYmplY3RfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKGF1ZGlvY2hlYmxpbWl0KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChhdWRpb2NoZWJsaW1pdCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChhdWRpb2NoZWJsaW1pdCk7Cit9CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IDAgaXMgcHJlc2VydmVkIHdpdGggbG93cGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMV8zMl9scF8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmxpbWl0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGVibGltaXQgPSBzZXR1cF9hdWRpb2NoZWJsaW1pdCAoKTsKKyAgLyogU2V0IHRvIGxvd3Bhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJ0eXBlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInJpcHBsZSIsIDAuMjUsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmxpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAiY3V0b2ZmIiwgNDQxMDAgLyA0LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMjggKiBzaXplb2YgKGdmbG9hdCksIE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmxpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEyOC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmxpbWl0IChhdWRpb2NoZWJsaW1pdCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIGVyYXNlZCB3aXRoIGxvd3Bhc3MgbW9kZSBhbmQgYSBjdXRvZmYKKyAqIGF0IHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTFfMzJfbHBfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGVibGltaXQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJsaW1pdCA9IHNldHVwX2F1ZGlvY2hlYmxpbWl0ICgpOworICAvKiBTZXQgdG8gbG93cGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInR5cGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicmlwcGxlIiwgMC4yNSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGVibGltaXQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDEyOCAqIHNpemVvZiAoZ2Zsb2F0KSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGVibGltaXQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTI4LjApOworICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGVibGltaXQgKGF1ZGlvY2hlYmxpbWl0KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCAwIGlzIGVyYXNlZCB3aXRoIGhpZ2hwYXNzIG1vZGUgYW5kIGEgY3V0b2ZmCisgKiBhdCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUxXzMyX2hwXzBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGVibGltaXQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJsaW1pdCA9IHNldHVwX2F1ZGlvY2hlYmxpbWl0ICgpOworICAvKiBTZXQgdG8gaGlnaHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJ0eXBlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInJpcHBsZSIsIDAuMjUsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmxpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAiY3V0b2ZmIiwgNDQxMDAgLyA0LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMjggKiBzaXplb2YgKGdmbG9hdCksIE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmxpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEyOC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjEpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmxpbWl0IChhdWRpb2NoZWJsaW1pdCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIHByZXNlcnZlZCB3aXRoIGhpZ2hwYXNzIG1vZGUgYW5kIGEgY3V0b2ZmCisgKiBhdCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUxXzMyX2hwXzIyMDUwaHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmxpbWl0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGVibGltaXQgPSBzZXR1cF9hdWRpb2NoZWJsaW1pdCAoKTsKKyAgLyogU2V0IHRvIGhpZ2hwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAidHlwZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJyaXBwbGUiLCAwLjI1LCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJsaW1pdCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgImN1dG9mZiIsIDQ0MTAwIC8gNC4wLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgMTI4ICogc2l6ZW9mIChnZmxvYXQpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpICs9IDIpIHsKKyAgICBpbltpXSA9IDEuMDsKKyAgICBpbltpICsgMV0gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJsaW1pdCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMjguMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPj0gMC45KTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJsaW1pdCAoYXVkaW9jaGVibGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IDAgaXMgcHJlc2VydmVkIHdpdGggbG93cGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMV82NF9scF8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmxpbWl0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmxpbWl0ID0gc2V0dXBfYXVkaW9jaGVibGltaXQgKCk7CisgIC8qIFNldCB0byBsb3dwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAidHlwZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJyaXBwbGUiLCAwLjI1LCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJsaW1pdCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgImN1dG9mZiIsIDQ0MTAwIC8gNC4wLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgMTI4ICogc2l6ZW9mIChnZG91YmxlKSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmxpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMjguMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPj0gMC45KTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJsaW1pdCAoYXVkaW9jaGVibGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHJhdGUvMiBpcyBlcmFzZWQgd2l0aCBsb3dwYXNzIG1vZGUgYW5kIGEgY3V0b2ZmCisgKiBhdCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUxXzY0X2xwXzIyMDUwaHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmxpbWl0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmxpbWl0ID0gc2V0dXBfYXVkaW9jaGVibGltaXQgKCk7CisgIC8qIFNldCB0byBsb3dwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAidHlwZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJyaXBwbGUiLCAwLjI1LCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJsaW1pdCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgImN1dG9mZiIsIDQ0MTAwIC8gNC4wLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgMTI4ICogc2l6ZW9mIChnZG91YmxlKSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkgKz0gMikgeworICAgIGluW2ldID0gMS4wOworICAgIGluW2kgKyAxXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmxpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMjguMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4xKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJsaW1pdCAoYXVkaW9jaGVibGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IDAgaXMgZXJhc2VkIHdpdGggaGlnaHBhc3MgbW9kZSBhbmQgYSBjdXRvZmYKKyAqIGF0IHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTFfNjRfaHBfMGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJsaW1pdDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJsaW1pdCA9IHNldHVwX2F1ZGlvY2hlYmxpbWl0ICgpOworICAvKiBTZXQgdG8gaGlnaHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJ0eXBlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInJpcHBsZSIsIDAuMjUsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmxpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAiY3V0b2ZmIiwgNDQxMDAgLyA0LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMjggKiBzaXplb2YgKGdkb3VibGUpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIGluW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGVibGltaXQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEyOC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjEpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmxpbWl0IChhdWRpb2NoZWJsaW1pdCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIHByZXNlcnZlZCB3aXRoIGhpZ2hwYXNzIG1vZGUgYW5kIGEgY3V0b2ZmCisgKiBhdCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUxXzY0X2hwXzIyMDUwaHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmxpbWl0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmxpbWl0ID0gc2V0dXBfYXVkaW9jaGVibGltaXQgKCk7CisgIC8qIFNldCB0byBoaWdocGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInR5cGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicmlwcGxlIiwgMC4yNSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGVibGltaXQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDEyOCAqIHNpemVvZiAoZ2RvdWJsZSksIE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpICs9IDIpIHsKKyAgICBpbltpXSA9IDEuMDsKKyAgICBpbltpICsgMV0gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR182NCk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJsaW1pdCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTI4LjApOworICBmYWlsX3VubGVzcyAocm1zID49IDAuOSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGVibGltaXQgKGF1ZGlvY2hlYmxpbWl0KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCAwIGlzIHByZXNlcnZlZCB3aXRoIGxvd3Bhc3MgbW9kZSBhbmQgYSBjdXRvZmYKKyAqIGF0IHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTJfMzJfbHBfMGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJsaW1pdDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmxpbWl0ID0gc2V0dXBfYXVkaW9jaGVibGltaXQgKCk7CisgIC8qIFNldCB0byBsb3dwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAidHlwZSIsIDIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJyaXBwbGUiLCA0MC4wLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJsaW1pdCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgImN1dG9mZiIsIDQ0MTAwIC8gNC4wLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgMTI4ICogc2l6ZW9mIChnZmxvYXQpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgaW5baV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJsaW1pdCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMjguMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPj0gMC45KTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJsaW1pdCAoYXVkaW9jaGVibGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHJhdGUvMiBpcyBlcmFzZWQgd2l0aCBsb3dwYXNzIG1vZGUgYW5kIGEgY3V0b2ZmCisgKiBhdCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3R5cGUyXzMyX2xwXzIyMDUwaHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmxpbWl0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGVibGltaXQgPSBzZXR1cF9hdWRpb2NoZWJsaW1pdCAoKTsKKyAgLyogU2V0IHRvIGxvd3Bhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJ0eXBlIiwgMiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInJpcHBsZSIsIDQwLjAsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmxpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAiY3V0b2ZmIiwgNDQxMDAgLyA0LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCAxMjggKiBzaXplb2YgKGdmbG9hdCksIE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkgKz0gMikgeworICAgIGluW2ldID0gMS4wOworICAgIGluW2kgKyAxXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmxpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEyOC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjEpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmxpbWl0IChhdWRpb2NoZWJsaW1pdCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgMCBpcyBlcmFzZWQgd2l0aCBoaWdocGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMl8zMl9ocF8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvY2hlYmxpbWl0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGVibGltaXQgPSBzZXR1cF9hdWRpb2NoZWJsaW1pdCAoKTsKKyAgLyogU2V0IHRvIGhpZ2hwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicG9sZXMiLCA4LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAidHlwZSIsIDIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJyaXBwbGUiLCA0MC4wLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb2NoZWJsaW1pdCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgImN1dG9mZiIsIDQ0MTAwIC8gNC4wLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgMTI4ICogc2l6ZW9mIChnZmxvYXQpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgaW5baV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEJVRkZFUl9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb2NoZWJsaW1pdCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMjguMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4xKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJsaW1pdCAoYXVkaW9jaGVibGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHJhdGUvMiBpcyBwcmVzZXJ2ZWQgd2l0aCBoaWdocGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMl8zMl9ocF8yMjA1MGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJsaW1pdDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGF1ZGlvY2hlYmxpbWl0ID0gc2V0dXBfYXVkaW9jaGVibGltaXQgKCk7CisgIC8qIFNldCB0byBoaWdocGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInR5cGUiLCAyLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicmlwcGxlIiwgNDAuMCwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGVibGltaXQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDEyOCAqIHNpemVvZiAoZ2Zsb2F0KSwgTlVMTCk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGVibGltaXQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisKKyAgcm1zID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zID0gc3FydCAocm1zIC8gMTI4LjApOworICBmYWlsX3VubGVzcyAocm1zID49IDAuOSk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW9jaGVibGltaXQgKGF1ZGlvY2hlYmxpbWl0KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCAwIGlzIHByZXNlcnZlZCB3aXRoIGxvd3Bhc3MgbW9kZSBhbmQgYSBjdXRvZmYKKyAqIGF0IHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTJfNjRfbHBfMGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJsaW1pdDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJsaW1pdCA9IHNldHVwX2F1ZGlvY2hlYmxpbWl0ICgpOworICAvKiBTZXQgdG8gbG93cGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInBvbGVzIiwgOCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInR5cGUiLCAyLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAicmlwcGxlIiwgNDAuMCwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW9jaGVibGltaXQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMjggKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIGluW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChCVUZGRVJfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW9jaGVibGltaXQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIHJtcyA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgIHJtcyA9IHNxcnQgKHJtcyAvIDEyOC4wKTsKKyAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvY2hlYmxpbWl0IChhdWRpb2NoZWJsaW1pdCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIGVyYXNlZCB3aXRoIGxvd3Bhc3MgbW9kZSBhbmQgYSBjdXRvZmYKKyAqIGF0IHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTJfNjRfbHBfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW9jaGVibGltaXQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgYXVkaW9jaGVibGltaXQgPSBzZXR1cF9hdWRpb2NoZWJsaW1pdCAoKTsKKyAgLyogU2V0IHRvIGxvd3Bhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJ0eXBlIiwgMiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInJpcHBsZSIsIDQwLjAsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmxpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAiY3V0b2ZmIiwgNDQxMDAgLyA0LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTI4ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkgKz0gMikgeworICAgIGluW2ldID0gMS4wOworICAgIGluW2kgKyAxXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmxpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMjguMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4xKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJsaW1pdCAoYXVkaW9jaGVibGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IDAgaXMgZXJhc2VkIHdpdGggaGlnaHBhc3MgbW9kZSBhbmQgYSBjdXRvZmYKKyAqIGF0IHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdHlwZTJfNjRfaHBfMGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJsaW1pdDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJsaW1pdCA9IHNldHVwX2F1ZGlvY2hlYmxpbWl0ICgpOworICAvKiBTZXQgdG8gaGlnaHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJ0eXBlIiwgMiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInJpcHBsZSIsIDQwLjAsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmxpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAiY3V0b2ZmIiwgNDQxMDAgLyA0LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTI4ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmxpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMjguMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4xKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJsaW1pdCAoYXVkaW9jaGVibGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHJhdGUvMiBpcyBwcmVzZXJ2ZWQgd2l0aCBoaWdocGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF90eXBlMl82NF9ocF8yMjA1MGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb2NoZWJsaW1pdDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKworICBhdWRpb2NoZWJsaW1pdCA9IHNldHVwX2F1ZGlvY2hlYmxpbWl0ICgpOworICAvKiBTZXQgdG8gaGlnaHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJwb2xlcyIsIDgsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb2NoZWJsaW1pdCksICJ0eXBlIiwgMiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvY2hlYmxpbWl0KSwgInJpcHBsZSIsIDQwLjAsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvY2hlYmxpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW9jaGVibGltaXQpLCAiY3V0b2ZmIiwgNDQxMDAgLyA0LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTI4ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkgKz0gMikgeworICAgIGluW2ldID0gMS4wOworICAgIGluW2kgKyAxXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQlVGRkVSX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvY2hlYmxpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKworICBybXMgPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICBybXMgPSBzcXJ0IChybXMgLyAxMjguMCk7CisgIGZhaWxfdW5sZXNzIChybXMgPj0gMC45KTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb2NoZWJsaW1pdCAoYXVkaW9jaGVibGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworc3RhdGljIFN1aXRlICoKK2F1ZGlvY2hlYmxpbWl0X3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImF1ZGlvY2hlYmxpbWl0Iik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUxXzMyX2xwXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMV8zMl9scF8yMjA1MGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUxXzMyX2hwXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMV8zMl9ocF8yMjA1MGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUxXzY0X2xwXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMV82NF9scF8yMjA1MGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUxXzY0X2hwXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMV82NF9ocF8yMjA1MGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUyXzMyX2xwXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMl8zMl9scF8yMjA1MGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUyXzMyX2hwXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMl8zMl9ocF8yMjA1MGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUyXzY0X2xwXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMl82NF9scF8yMjA1MGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R5cGUyXzY0X2hwXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90eXBlMl82NF9ocF8yMjA1MGh6KTsKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChhdWRpb2NoZWJsaW1pdCk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2R5bmFtaWMuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZHluYW1pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViODJhMDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2R5bmFtaWMuYwpAQCAtMCwwICsxLDQ0MiBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBhdWRpb2R5bmFtaWMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIEdyZWF0bHkgYmFzZWQgb24gdGhlIGF1ZGlvcGFub3JhbWEgdW5pdCB0ZXN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworZ2Jvb2xlYW4gaGF2ZV9lb3MgPSBGQUxTRTsKKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcKKyAqIHNyYyBhbmQgc2luayBwYWRzIHdlIGNyZWF0ZTsgb3RoZXJ3aXNlIHdlIGFsd2F5cyBoYXZlIHRvIGRvIGdldF9wYWQsCisgKiBnZXRfcGVlciwgYW5kIHRoZW4gcmVtb3ZlIHJlZmVyZW5jZXMgaW4gZXZlcnkgdGVzdCBmdW5jdGlvbiAqLworR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKKworCisjZGVmaW5lIERZTkFNSUNfQ0FQU19TVFJJTkcgICAgXAorICAgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICAgICAgICAgICAgICBcCisgICAgInJhdGUgPSAoaW50KSA0NDEwMCwgIiAgICAgICAgICAgICAgXAorICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgIFwKKyAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUoUzE2KQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgIE1BWCBdLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykiIEdTVF9BVURJT19ORSAoUzE2KSkpOworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsICBNQVggXSwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChTMTYpKSk7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX2R5bmFtaWMgKHZvaWQpCit7CisgIEdzdEVsZW1lbnQgKmR5bmFtaWM7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfZHluYW1pYyIpOworICBkeW5hbWljID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJhdWRpb2R5bmFtaWMiKTsKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoZHluYW1pYywgJnNyY3RlbXBsYXRlKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChkeW5hbWljLCAmc2lua3RlbXBsYXRlKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICByZXR1cm4gZHluYW1pYzsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfZHluYW1pYyAoR3N0RWxlbWVudCAqIGR5bmFtaWMpCit7CisgIEdTVF9ERUJVRyAoImNsZWFudXBfZHluYW1pYyIpOworCisgIGdfbGlzdF9mb3JlYWNoIChidWZmZXJzLCAoR0Z1bmMpIGdzdF9taW5pX29iamVjdF91bnJlZiwgTlVMTCk7CisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKyAgYnVmZmVycyA9IE5VTEw7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAoZHluYW1pYyk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoZHluYW1pYyk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChkeW5hbWljKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFzc3Rocm91Z2gpCit7CisgIEdzdEVsZW1lbnQgKmR5bmFtaWM7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdpbnQxNiBpbls2XSA9IHsgMjQ1NzYsIC0xNjM4NCwgMjU2LCAtMTI4LCAwLCAtMjQ1NzYgfTsKKyAgZ2ludDE2IHJlc1s2XTsKKworICBkeW5hbWljID0gc2V0dXBfZHluYW1pYyAoKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZHluYW1pYywKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGluYnVmZmVyID0KKyAgICAgIGdzdF9idWZmZXJfbmV3X3dyYXBwZWRfZnVsbCAoR1NUX01FTU9SWV9GTEFHX1JFQURPTkxZLCBpbiwgMTIsIDAsIDEyLAorICAgICAgTlVMTCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoaW5idWZmZXIsIDAsIGluLCAxMikgPT0gMCk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoRFlOQU1JQ19DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBkeW5hbWljLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGJ1dCBpdCBlbmRzIHVwIGJlaW5nIGNvbGxlY3RlZCBvbiB0aGUgZ2xvYmFsIGJ1ZmZlciBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZXh0cmFjdCAob3V0YnVmZmVyLCAwLCByZXMsIDEyKSA9PSAxMik7CisgIEdTVF9JTkZPCisgICAgICAoImV4cGVjdGVkICUrNWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkIHJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCAlKzVkICUrNWQiLAorICAgICAgaW5bMF0sIGluWzFdLCBpblsyXSwgaW5bM10sIGluWzRdLCBpbls1XSwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdLAorICAgICAgcmVzWzRdLCByZXNbNV0pOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgaW4sIDEyKSA9PSAwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfZHluYW1pYyAoZHluYW1pYyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfY29tcHJlc3NfaGFyZF81MF81MCkKK3sKKyAgR3N0RWxlbWVudCAqZHluYW1pYzsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludDE2IGluWzhdID0geyAtMzAwMDAsIDI0NTc2LCAtMTYzODQsIDI1NiwgLTEyOCwgMCwgLTI0NTc2LCAzMDAwMCB9OworICBnaW50MTYgcmVzWzhdOworCisgIGR5bmFtaWMgPSBzZXR1cF9keW5hbWljICgpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChkeW5hbWljKSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZHluYW1pYyksICJjaGFyYWN0ZXJpc3RpY3MiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZHluYW1pYyksICJyYXRpbyIsIDAuNSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGR5bmFtaWMpLCAidGhyZXNob2xkIiwgMC41LCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZHluYW1pYywKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxNik7CisgIGdzdF9idWZmZXJfZmlsbCAoaW5idWZmZXIsIDAsIGluLCAxNik7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoaW5idWZmZXIsIDAsIGluLCAxNikgPT0gMCk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoRFlOQU1JQ19DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBkeW5hbWljLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9leHRyYWN0IChvdXRidWZmZXIsIDAsIHJlcywgMTYpID09IDE2KTsKKworICBmYWlsX3VubGVzcyAocmVzWzBdID4gaW5bMF0pOworICBmYWlsX3VubGVzcyAocmVzWzFdIDwgaW5bMV0pOworICBmYWlsX3VubGVzcyAocmVzWzJdID09IGluWzJdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1szXSA9PSBpblszXSk7CisgIGZhaWxfdW5sZXNzIChyZXNbNF0gPT0gaW5bNF0pOworICBmYWlsX3VubGVzcyAocmVzWzVdID09IGluWzVdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1s2XSA+IGluWzZdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1s3XSA8IGluWzddKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfZHluYW1pYyAoZHluYW1pYyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfY29tcHJlc3Nfc29mdF81MF81MCkKK3sKKyAgR3N0RWxlbWVudCAqZHluYW1pYzsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludDE2IGluWzhdID0geyAtMzAwMDAsIDI0NTc2LCAtMTYzODQsIDI1NiwgLTEyOCwgMCwgLTI0NTc2LCAzMDAwMCB9OworICBnaW50MTYgcmVzWzhdOworCisgIGR5bmFtaWMgPSBzZXR1cF9keW5hbWljICgpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChkeW5hbWljKSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZHluYW1pYyksICJjaGFyYWN0ZXJpc3RpY3MiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZHluYW1pYyksICJyYXRpbyIsIDAuNSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGR5bmFtaWMpLCAidGhyZXNob2xkIiwgMC41LCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZHluYW1pYywKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxNik7CisgIGdzdF9idWZmZXJfZmlsbCAoaW5idWZmZXIsIDAsIGluLCAxNik7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoaW5idWZmZXIsIDAsIGluLCAxNikgPT0gMCk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoRFlOQU1JQ19DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBkeW5hbWljLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9leHRyYWN0IChvdXRidWZmZXIsIDAsIHJlcywgMTYpID09IDE2KTsKKworICBmYWlsX3VubGVzcyAocmVzWzBdID4gaW5bMF0pOworICBmYWlsX3VubGVzcyAocmVzWzFdIDwgaW5bMV0pOworICBmYWlsX3VubGVzcyAocmVzWzJdID09IGluWzJdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1szXSA9PSBpblszXSk7CisgIGZhaWxfdW5sZXNzIChyZXNbNF0gPT0gaW5bNF0pOworICBmYWlsX3VubGVzcyAocmVzWzVdID09IGluWzVdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1s2XSA+IGluWzZdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1s3XSA8IGluWzddKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfZHluYW1pYyAoZHluYW1pYyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfY29tcHJlc3NfaGFyZF8xMDBfNTApCit7CisgIEdzdEVsZW1lbnQgKmR5bmFtaWM7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdpbnQxNiBpbls4XSA9IHsgLTMwMDAwLCAyNDU3NiwgLTE2Mzg0LCAyNTYsIC0xMjgsIDAsIC0yNDU3NiwgMzAwMDAgfTsKKyAgZ2ludDE2IHJlc1s4XTsKKworICBkeW5hbWljID0gc2V0dXBfZHluYW1pYyAoKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZHluYW1pYyksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGR5bmFtaWMpLCAiY2hhcmFjdGVyaXN0aWNzIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGR5bmFtaWMpLCAicmF0aW8iLCAwLjUsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChkeW5hbWljKSwgInRocmVzaG9sZCIsIDEuMCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGR5bmFtaWMsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTYpOworICBnc3RfYnVmZmVyX2ZpbGwgKGluYnVmZmVyLCAwLCBpbiwgMTYpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKGluYnVmZmVyLCAwLCBpbiwgMTYpID09IDApOworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKERZTkFNSUNfQ0FQU19TVFJJTkcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgZHluYW1pYywgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZXh0cmFjdCAob3V0YnVmZmVyLCAwLCByZXMsIDE2KSA9PSAxNik7CisKKyAgZmFpbF91bmxlc3MgKHJlc1swXSA9PSBpblswXSk7CisgIGZhaWxfdW5sZXNzIChyZXNbMV0gPT0gaW5bMV0pOworICBmYWlsX3VubGVzcyAocmVzWzJdID09IGluWzJdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1szXSA9PSBpblszXSk7CisgIGZhaWxfdW5sZXNzIChyZXNbNF0gPT0gaW5bNF0pOworICBmYWlsX3VubGVzcyAocmVzWzVdID09IGluWzVdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1s2XSA9PSBpbls2XSk7CisgIGZhaWxfdW5sZXNzIChyZXNbN10gPT0gaW5bN10pOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9keW5hbWljIChkeW5hbWljKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2V4cGFuZF9oYXJkXzUwXzIwMCkKK3sKKyAgR3N0RWxlbWVudCAqZHluYW1pYzsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludDE2IGluWzhdID0geyAtMzAwMDAsIDI0NTc2LCAtMTYzODMsIDI1NiwgLTEyOCwgMCwgLTI0NTc2LCAzMDAwMCB9OworICBnaW50MTYgcmVzWzhdOworCisgIGR5bmFtaWMgPSBzZXR1cF9keW5hbWljICgpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChkeW5hbWljKSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZHluYW1pYyksICJjaGFyYWN0ZXJpc3RpY3MiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZHluYW1pYyksICJyYXRpbyIsIDIuMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGR5bmFtaWMpLCAidGhyZXNob2xkIiwgMC41LCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZHluYW1pYywKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxNik7CisgIGdzdF9idWZmZXJfZmlsbCAoaW5idWZmZXIsIDAsIGluLCAxNik7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoaW5idWZmZXIsIDAsIGluLCAxNikgPT0gMCk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoRFlOQU1JQ19DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBkeW5hbWljLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9leHRyYWN0IChvdXRidWZmZXIsIDAsIHJlcywgMTYpID09IDE2KTsKKworICBmYWlsX3VubGVzcyAocmVzWzBdID09IGluWzBdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1sxXSA9PSBpblsxXSk7CisgIGZhaWxfdW5sZXNzIChyZXNbMl0gPiBpblsyXSk7CisgIGZhaWxfdW5sZXNzIChyZXNbM10gPCBpblszXSk7CisgIGZhaWxfdW5sZXNzIChyZXNbNF0gPiBpbls0XSk7CisgIGZhaWxfdW5sZXNzIChyZXNbNV0gPT0gaW5bNV0pOworICBmYWlsX3VubGVzcyAocmVzWzZdID09IGluWzZdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1s3XSA9PSBpbls3XSk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2R5bmFtaWMgKGR5bmFtaWMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2V4cGFuZF9zb2Z0XzUwXzIwMCkKK3sKKyAgR3N0RWxlbWVudCAqZHluYW1pYzsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludDE2IGluWzhdID0geyAtMzAwMDAsIDI0NTc2LCAtMTYzODMsIDI1NiwgLTEyOCwgMCwgLTI0NTc2LCAzMDAwMCB9OworICBnaW50MTYgcmVzWzhdOworCisgIGR5bmFtaWMgPSBzZXR1cF9keW5hbWljICgpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChkeW5hbWljKSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZHluYW1pYyksICJjaGFyYWN0ZXJpc3RpY3MiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZHluYW1pYyksICJyYXRpbyIsIDIuMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGR5bmFtaWMpLCAidGhyZXNob2xkIiwgMC41LCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZHluYW1pYywKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxNik7CisgIGdzdF9idWZmZXJfZmlsbCAoaW5idWZmZXIsIDAsIGluLCAxNik7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoaW5idWZmZXIsIDAsIGluLCAxNikgPT0gMCk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoRFlOQU1JQ19DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBkeW5hbWljLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9leHRyYWN0IChvdXRidWZmZXIsIDAsIHJlcywgMTYpID09IDE2KTsKKworICBmYWlsX3VubGVzcyAocmVzWzBdID09IGluWzBdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1sxXSA9PSBpblsxXSk7CisgIGZhaWxfdW5sZXNzIChyZXNbMl0gPiBpblsyXSk7CisgIGZhaWxfdW5sZXNzIChyZXNbM10gPCBpblszXSk7CisgIGZhaWxfdW5sZXNzIChyZXNbNF0gPiBpbls0XSk7CisgIGZhaWxfdW5sZXNzIChyZXNbNV0gPT0gaW5bNV0pOworICBmYWlsX3VubGVzcyAocmVzWzZdID09IGluWzZdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1s3XSA9PSBpbls3XSk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2R5bmFtaWMgKGR5bmFtaWMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2V4cGFuZF9oYXJkXzBfMjAwKQoreworICBHc3RFbGVtZW50ICpkeW5hbWljOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnaW50MTYgaW5bOF0gPSB7IC0zMDAwMCwgMjQ1NzYsIC0xNjM4MywgMjU2LCAtMTI4LCAwLCAtMjQ1NzYsIDMwMDAwIH07CisgIGdpbnQxNiByZXNbOF07CisKKyAgZHluYW1pYyA9IHNldHVwX2R5bmFtaWMgKCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGR5bmFtaWMpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChkeW5hbWljKSwgImNoYXJhY3RlcmlzdGljcyIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChkeW5hbWljKSwgInJhdGlvIiwgMi4wLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZHluYW1pYyksICJ0aHJlc2hvbGQiLCAwLjAsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChkeW5hbWljLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDE2KTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChpbmJ1ZmZlciwgMCwgaW4sIDE2KTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChpbmJ1ZmZlciwgMCwgaW4sIDE2KSA9PSAwKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChEWU5BTUlDX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGR5bmFtaWMsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2V4dHJhY3QgKG91dGJ1ZmZlciwgMCwgcmVzLCAxNikgPT0gMTYpOworCisgIGZhaWxfdW5sZXNzIChyZXNbMF0gPT0gaW5bMF0pOworICBmYWlsX3VubGVzcyAocmVzWzFdID09IGluWzFdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1syXSA9PSBpblsyXSk7CisgIGZhaWxfdW5sZXNzIChyZXNbM10gPT0gaW5bM10pOworICBmYWlsX3VubGVzcyAocmVzWzRdID09IGluWzRdKTsKKyAgZmFpbF91bmxlc3MgKHJlc1s1XSA9PSBpbls1XSk7CisgIGZhaWxfdW5sZXNzIChyZXNbNl0gPT0gaW5bNl0pOworICBmYWlsX3VubGVzcyAocmVzWzddID09IGluWzddKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfZHluYW1pYyAoZHluYW1pYyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2R5bmFtaWNfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiZHluYW1pYyIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXNzdGhyb3VnaCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9jb21wcmVzc19oYXJkXzUwXzUwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2NvbXByZXNzX3NvZnRfNTBfNTApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfY29tcHJlc3NfaGFyZF8xMDBfNTApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZXhwYW5kX2hhcmRfNTBfMjAwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2V4cGFuZF9zb2Z0XzUwXzIwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9leHBhbmRfaGFyZF8wXzIwMCk7CisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoZHluYW1pYyk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2VjaG8uYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvZWNoby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNWI3MTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2VjaG8uYwpAQCAtMCwwICsxLDI0MCBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworZ2Jvb2xlYW4gaGF2ZV9lb3MgPSBGQUxTRTsKKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcKKyAqIHNyYyBhbmQgc2luayBwYWRzIHdlIGNyZWF0ZTsgb3RoZXJ3aXNlIHdlIGFsd2F5cyBoYXZlIHRvIGRvIGdldF9wYWQsCisgKiBnZXRfcGVlciwgYW5kIHRoZW4gcmVtb3ZlIHJlZmVyZW5jZXMgaW4gZXZlcnkgdGVzdCBmdW5jdGlvbiAqLworR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKKworI2RlZmluZSBFQ0hPX0NBUFNfU1RSSU5HICAgIFwKKyAgICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgMiwgIiAgICAgICAgICAgICAgXAorICAgICJjaGFubmVsLW1hc2sgPSAoYml0bWFzaykgMywgIiAgICAgIFwKKyAgICAicmF0ZSA9IChpbnQpIDEwMDAwMCwgIiAgICAgICAgICAgICBcCisgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiICAgXAorICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORShGNjQpCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgIE1BWCBdLCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSB7ICIKKyAgICAgICAgR1NUX0FVRElPX05FIChGMzIpICIsICIgR1NUX0FVRElPX05FIChGNjQpICIgfSIpKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIDIgXSwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgIE1BWCBdLCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSB7ICIKKyAgICAgICAgR1NUX0FVRElPX05FIChGMzIpICIsICIgR1NUX0FVRElPX05FIChGNjQpICIgfSIpKTsKKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfZWNobyAodm9pZCkKK3sKKyAgR3N0RWxlbWVudCAqZWNobzsKKworICBHU1RfREVCVUcgKCJzZXR1cF9lY2hvIik7CisgIGVjaG8gPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoImF1ZGlvZWNobyIpOworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChlY2hvLCAmc3JjdGVtcGxhdGUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGVjaG8sICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworCisgIHJldHVybiBlY2hvOworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF9lY2hvIChHc3RFbGVtZW50ICogZWNobykKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF9lY2hvIik7CisKKyAgZ19saXN0X2ZvcmVhY2ggKGJ1ZmZlcnMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICBidWZmZXJzID0gTlVMTDsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkIChlY2hvKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChlY2hvKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGVjaG8pOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXNzdGhyb3VnaCkKK3sKKyAgR3N0RWxlbWVudCAqZWNobzsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSBpbltdID0geyAxLjAsIC0xLjAsIDAuMCwgMC41LCAtMC41LCAwLjAgfTsKKyAgZ2RvdWJsZSByZXNbNl07CisKKyAgZWNobyA9IHNldHVwX2VjaG8gKCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGVjaG8pLCAiZGVsYXkiLCAoR3N0Q2xvY2tUaW1lKSAxLCAiaW50ZW5zaXR5IiwgMC4wLAorICAgICAgImZlZWRiYWNrIiwgMC4wLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWNobywKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoRUNIT19DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBlY2hvLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgaW5idWZmZXIgPQorICAgICAgZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksIGluLCBzaXplb2YgKGluKSwgMCwKKyAgICAgIHNpemVvZiAoaW4pLCBOVUxMLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChpbmJ1ZmZlciwgMCwgaW4sIHNpemVvZiAoaW4pKSA9PSAwKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYnV0IGl0IGVuZHMgdXAgYmVpbmcgY29sbGVjdGVkIG9uIHRoZSBnbG9iYWwgYnVmZmVyIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9leHRyYWN0IChvdXRidWZmZXIsIDAsIHJlcywKKyAgICAgICAgICBzaXplb2YgKHJlcykpID09IHNpemVvZiAocmVzKSk7CisgIEdTVF9JTkZPCisgICAgICAoImV4cGVjdGVkICUrbGYgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmIHJlYWwgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYiLAorICAgICAgaW5bMF0sIGluWzFdLCBpblsyXSwgaW5bM10sIGluWzRdLCBpbls1XSwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdLAorICAgICAgcmVzWzRdLCByZXNbNV0pOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgaW4sIHNpemVvZiAoaW4pKSA9PSAwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfZWNobyAoZWNobyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZWNobykKK3sKKyAgR3N0RWxlbWVudCAqZWNobzsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSBpbltdID0geyAxLjAsIC0xLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCB9OworICBnZG91YmxlIG91dFtdID0geyAxLjAsIC0xLjAsIDAuMCwgMC4wLCAxLjAsIC0xLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCB9OworICBnZG91YmxlIHJlc1sxMF07CisKKyAgZWNobyA9IHNldHVwX2VjaG8gKCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGVjaG8pLCAiZGVsYXkiLCAoR3N0Q2xvY2tUaW1lKSAyMDAwMCwgImludGVuc2l0eSIsCisgICAgICAxLjAsICJmZWVkYmFjayIsIDAuMCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVjaG8sCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEVDSE9fQ0FQU19TVFJJTkcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgZWNobywgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGluYnVmZmVyID0KKyAgICAgIGdzdF9idWZmZXJfbmV3X3dyYXBwZWRfZnVsbCAoR1NUX01FTU9SWV9GTEFHX1JFQURPTkxZLCBpbiwgc2l6ZW9mIChpbiksIDAsCisgICAgICBzaXplb2YgKGluKSwgTlVMTCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoaW5idWZmZXIsIDAsIGluLCBzaXplb2YgKGluKSkgPT0gMCk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGJ1dCBpdCBlbmRzIHVwIGJlaW5nIGNvbGxlY3RlZCBvbiB0aGUgZ2xvYmFsIGJ1ZmZlciBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZXh0cmFjdCAob3V0YnVmZmVyLCAwLCByZXMsCisgICAgICAgICAgc2l6ZW9mIChyZXMpKSA9PSBzaXplb2YgKHJlcykpOworICBHU1RfSU5GTworICAgICAgKCJleHBlY3RlZCAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmIHJlYWwgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYgJStsZiIsCisgICAgICBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10sIG91dFs0XSwgb3V0WzVdLCBvdXRbNl0sIG91dFs3XSwgb3V0WzhdLAorICAgICAgb3V0WzldLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLCByZXNbM10sIHJlc1s0XSwgcmVzWzVdLCByZXNbNl0sIHJlc1s3XSwKKyAgICAgIHJlc1s4XSwgcmVzWzldKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIDAsIG91dCwgc2l6ZW9mIChvdXQpKSA9PSAwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfZWNobyAoZWNobyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZmVlZGJhY2spCit7CisgIEdzdEVsZW1lbnQgKmVjaG87CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgaW5bXSA9IHsgMS4wLCAtMS4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgfTsKKyAgZ2RvdWJsZSBvdXRbXSA9IHsgMS4wLCAtMS4wLCAwLjAsIDAuMCwgMS4wLCAtMS4wLCAwLjAsIDAuMCwgMS4wLCAtMS4wIH07CisgIGdkb3VibGUgcmVzWzEwXTsKKworICBlY2hvID0gc2V0dXBfZWNobyAoKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZWNobyksICJkZWxheSIsIChHc3RDbG9ja1RpbWUpIDIwMDAwLCAiaW50ZW5zaXR5IiwKKyAgICAgIDEuMCwgImZlZWRiYWNrIiwgMS4wLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWNobywKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoRUNIT19DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBlY2hvLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgaW5idWZmZXIgPQorICAgICAgZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksIGluLCBzaXplb2YgKGluKSwgMCwKKyAgICAgIHNpemVvZiAoaW4pLCBOVUxMLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChpbmJ1ZmZlciwgMCwgaW4sIHNpemVvZiAoaW4pKSA9PSAwKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYnV0IGl0IGVuZHMgdXAgYmVpbmcgY29sbGVjdGVkIG9uIHRoZSBnbG9iYWwgYnVmZmVyIGxpc3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9leHRyYWN0IChvdXRidWZmZXIsIDAsIHJlcywKKyAgICAgICAgICBzaXplb2YgKHJlcykpID09IHNpemVvZiAocmVzKSk7CisgIEdTVF9JTkZPCisgICAgICAoImV4cGVjdGVkICUrbGYgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYgcmVhbCAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmICUrbGYgJStsZiAlK2xmIiwKKyAgICAgIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSwgb3V0WzRdLCBvdXRbNV0sIG91dFs2XSwgb3V0WzddLCBvdXRbOF0sCisgICAgICBvdXRbOV0sIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSwgcmVzWzRdLCByZXNbNV0sIHJlc1s2XSwgcmVzWzddLAorICAgICAgcmVzWzhdLCByZXNbOV0pOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgb3V0LCBzaXplb2YgKG91dCkpID09IDApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9lY2hvIChlY2hvKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorYXVkaW9lY2hvX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImF1ZGlvZWNobyIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXNzdGhyb3VnaCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9lY2hvKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ZlZWRiYWNrKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGF1ZGlvZWNobyk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2ZpcmZpbHRlci5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9maXJmaWx0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGI0NTJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9maXJmaWx0ZXIuYwpAQCAtMCwwICsxLDE5MyBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKy8qIEZJWE1FIDAuMTE6IHN1cHByZXNzIHdhcm5pbmdzIGZvciBkZXByZWNhdGVkIEFQSSBzdWNoIGFzIEdWYWx1ZUFycmF5CisgKiB3aXRoIG5ld2VyIEdMaWIgdmVyc2lvbnMgKD49IDIuMzEuMCkgKi8KKyNkZWZpbmUgR0xJQl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKK3N0YXRpYyBnYm9vbGVhbiBoYXZlX2VvcyA9IEZBTFNFOworCitzdGF0aWMgZ2Jvb2xlYW4KK29uX21lc3NhZ2UgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR01haW5Mb29wICpsb29wID0gKEdNYWluTG9vcCAqKSB1c2VyX2RhdGE7CisKKyAgc3dpdGNoIChHU1RfTUVTU0FHRV9UWVBFIChtZXNzYWdlKSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6CisgICAgY2FzZSBHU1RfTUVTU0FHRV9XQVJOSU5HOgorICAgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHU1RfTUVTU0FHRV9FT1M6CisgICAgICBoYXZlX2VvcyA9IFRSVUU7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorb25fcmF0ZV9jaGFuZ2VkIChHc3RFbGVtZW50ICogZWxlbWVudCwgZ2ludCByYXRlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdWYWx1ZUFycmF5ICp2YTsKKyAgR1ZhbHVlIHYgPSB7IDAsIH07CisKKyAgZmFpbF91bmxlc3MgKHJhdGUgPiAwKTsKKworICB2YSA9IGdfdmFsdWVfYXJyYXlfbmV3ICg2KTsKKworICBnX3ZhbHVlX2luaXQgKCZ2LCBHX1RZUEVfRE9VQkxFKTsKKyAgZ192YWx1ZV9zZXRfZG91YmxlICgmdiwgMC4wKTsKKyAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKHZhLCAmdik7CisgIGdfdmFsdWVfcmVzZXQgKCZ2KTsKKyAgZ192YWx1ZV9zZXRfZG91YmxlICgmdiwgMC4wKTsKKyAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKHZhLCAmdik7CisgIGdfdmFsdWVfcmVzZXQgKCZ2KTsKKyAgZ192YWx1ZV9zZXRfZG91YmxlICgmdiwgMC4wKTsKKyAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKHZhLCAmdik7CisgIGdfdmFsdWVfcmVzZXQgKCZ2KTsKKyAgZ192YWx1ZV9zZXRfZG91YmxlICgmdiwgMC4wKTsKKyAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKHZhLCAmdik7CisgIGdfdmFsdWVfcmVzZXQgKCZ2KTsKKyAgZ192YWx1ZV9zZXRfZG91YmxlICgmdiwgMC4wKTsKKyAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKHZhLCAmdik7CisgIGdfdmFsdWVfcmVzZXQgKCZ2KTsKKyAgZ192YWx1ZV9zZXRfZG91YmxlICgmdiwgMS4wKTsKKyAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKHZhLCAmdik7CisgIGdfdmFsdWVfcmVzZXQgKCZ2KTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChlbGVtZW50KSwgImtlcm5lbCIsIHZhLCBOVUxMKTsKKworICBnX3ZhbHVlX2FycmF5X2ZyZWUgKHZhKTsKK30KKworc3RhdGljIGdib29sZWFuIGhhdmVfZGF0YSA9IEZBTFNFOworCitzdGF0aWMgdm9pZAorb25faGFuZG9mZiAoR3N0RWxlbWVudCAqIG9iamVjdCwgR3N0QnVmZmVyICogYnVmZmVyLCBHc3RQYWQgKiBwYWQsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBpZiAoIWhhdmVfZGF0YSkgeworICAgIEdzdE1hcEluZm8gbWFwOworICAgIGdkb3VibGUgKmRhdGE7CisKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIGRhdGEgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKworICAgIGZhaWxfdW5sZXNzIChtYXAuc2l6ZSA+IDUgKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgICBmYWlsX3VubGVzcyAoZGF0YVswXSA9PSAwLjApOworICAgIGZhaWxfdW5sZXNzIChkYXRhWzFdID09IDAuMCk7CisgICAgZmFpbF91bmxlc3MgKGRhdGFbMl0gPT0gMC4wKTsKKyAgICBmYWlsX3VubGVzcyAoZGF0YVszXSA9PSAwLjApOworICAgIGZhaWxfdW5sZXNzIChkYXRhWzRdID09IDAuMCk7CisgICAgZmFpbF91bmxlc3MgKGRhdGFbNV0gIT0gMC4wKTsKKworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgaGF2ZV9kYXRhID0gVFJVRTsKKyAgfQorfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9waXBlbGluZSkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmUsICpzcmMsICpjZmlsdGVyLCAqZmlsdGVyLCAqc2luazsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0QnVzICpidXM7CisgIEdNYWluTG9vcCAqbG9vcDsKKworICBoYXZlX2RhdGEgPSBGQUxTRTsKKyAgaGF2ZV9lb3MgPSBGQUxTRTsKKworICBwaXBlbGluZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInBpcGVsaW5lIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChwaXBlbGluZSAhPSBOVUxMKTsKKworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb3Rlc3RzcmMiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHNyYyAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc3JjKSwgIm51bS1idWZmZXJzIiwgMTAwMCwgTlVMTCk7CisKKyAgY2ZpbHRlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImNhcHNmaWx0ZXIiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGNmaWx0ZXIgIT0gTlVMTCk7CisjaWYgR19CWVRFX09SREVSID09IEdfQklHX0VORElBTgorICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwKKyAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiRjY0QkUiLCBOVUxMKTsKKyNlbHNlCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsICJGNjRMRSIsIE5VTEwpOworI2VuZGlmCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGNmaWx0ZXIpLCAiY2FwcyIsIGNhcHMsIE5VTEwpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgZmlsdGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW9maXJmaWx0ZXIiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGZpbHRlciAhPSBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoR19PQkpFQ1QgKGZpbHRlciksICJyYXRlLWNoYW5nZWQiLAorICAgICAgR19DQUxMQkFDSyAob25fcmF0ZV9jaGFuZ2VkKSwgTlVMTCk7CisKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChzaW5rICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzaW5rKSwgInNpZ25hbC1oYW5kb2ZmcyIsIFRSVUUsIE5VTEwpOworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoc2luayksICJoYW5kb2ZmIiwgR19DQUxMQkFDSyAob25faGFuZG9mZiksIE5VTEwpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjLCBjZmlsdGVyLCBmaWx0ZXIsIHNpbmssIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGlua19tYW55IChzcmMsIGNmaWx0ZXIsIGZpbHRlciwgc2luaywgTlVMTCkpOworCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKworICBidXMgPSBnc3RfcGlwZWxpbmVfZ2V0X2J1cyAoR1NUX1BJUEVMSU5FIChwaXBlbGluZSkpOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2ggKGJ1cyk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChidXMpLCAibWVzc2FnZSIsIEdfQ0FMTEJBQ0sgKG9uX21lc3NhZ2UpLCBsb29wKTsKKworICBmYWlsX2lmIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZmFpbF91bmxlc3MgKGhhdmVfZGF0YSk7CisgIGZhaWxfdW5sZXNzIChoYXZlX2Vvcyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsCisgICAgICAgICAgR1NUX1NUQVRFX05VTEwpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgZ3N0X2J1c19yZW1vdmVfc2lnbmFsX3dhdGNoIChidXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChHU1RfT0JKRUNUIChidXMpKTsKKyAgZ19tYWluX2xvb3BfdW5yZWYgKGxvb3ApOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2F1ZGlvZmlyZmlsdGVyX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImF1ZGlvZmlyZmlsdGVyIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BpcGVsaW5lKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGF1ZGlvZmlyZmlsdGVyKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvaWlyZmlsdGVyLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2lpcmZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMmM5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb2lpcmZpbHRlci5jCkBAIC0wLDAgKzEsMTkwIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyogRklYTUUgMC4xMTogc3VwcHJlc3Mgd2FybmluZ3MgZm9yIGRlcHJlY2F0ZWQgQVBJIHN1Y2ggYXMgR1ZhbHVlQXJyYXkKKyAqIHdpdGggbmV3ZXIgR0xpYiB2ZXJzaW9ucyAoPj0gMi4zMS4wKSAqLworI2RlZmluZSBHTElCX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworc3RhdGljIGdib29sZWFuIGhhdmVfZW9zID0gRkFMU0U7CisKK3N0YXRpYyBnYm9vbGVhbgorb25fbWVzc2FnZSAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHTWFpbkxvb3AgKmxvb3AgPSAoR01haW5Mb29wICopIHVzZXJfZGF0YTsKKworICBzd2l0Y2ggKEdTVF9NRVNTQUdFX1RZUEUgKG1lc3NhZ2UpKSB7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FUlJPUjoKKyAgICBjYXNlIEdTVF9NRVNTQUdFX1dBUk5JTkc6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VPUzoKKyAgICAgIGhhdmVfZW9zID0gVFJVRTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9yYXRlX2NoYW5nZWQgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBnaW50IHJhdGUsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR1ZhbHVlQXJyYXkgKnZhOworICBHVmFsdWUgdiA9IHsgMCwgfTsKKworICBmYWlsX3VubGVzcyAocmF0ZSA+IDApOworCisgIHZhID0gZ192YWx1ZV9hcnJheV9uZXcgKDYpOworCisgIGdfdmFsdWVfaW5pdCAoJnYsIEdfVFlQRV9ET1VCTEUpOworICBnX3ZhbHVlX3NldF9kb3VibGUgKCZ2LCAwLjApOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAodmEsICZ2KTsKKyAgZ192YWx1ZV9yZXNldCAoJnYpOworICBnX3ZhbHVlX3NldF9kb3VibGUgKCZ2LCAwLjApOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAodmEsICZ2KTsKKyAgZ192YWx1ZV9yZXNldCAoJnYpOworICBnX3ZhbHVlX3NldF9kb3VibGUgKCZ2LCAwLjApOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAodmEsICZ2KTsKKyAgZ192YWx1ZV9yZXNldCAoJnYpOworICBnX3ZhbHVlX3NldF9kb3VibGUgKCZ2LCAwLjApOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAodmEsICZ2KTsKKyAgZ192YWx1ZV9yZXNldCAoJnYpOworICBnX3ZhbHVlX3NldF9kb3VibGUgKCZ2LCAwLjApOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAodmEsICZ2KTsKKyAgZ192YWx1ZV9yZXNldCAoJnYpOworICBnX3ZhbHVlX3NldF9kb3VibGUgKCZ2LCAxLjApOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAodmEsICZ2KTsKKyAgZ192YWx1ZV9yZXNldCAoJnYpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGVsZW1lbnQpLCAiYiIsIHZhLCBOVUxMKTsKKworICBnX3ZhbHVlX2FycmF5X2ZyZWUgKHZhKTsKKworICB2YSA9IGdfdmFsdWVfYXJyYXlfbmV3ICg2KTsKKworICBnX3ZhbHVlX3NldF9kb3VibGUgKCZ2LCAxLjApOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAodmEsICZ2KTsKKyAgZ192YWx1ZV9yZXNldCAoJnYpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGVsZW1lbnQpLCAiYSIsIHZhLCBOVUxMKTsKKworICBnX3ZhbHVlX2FycmF5X2ZyZWUgKHZhKTsKK30KKworc3RhdGljIGdib29sZWFuIGhhdmVfZGF0YSA9IEZBTFNFOworCitzdGF0aWMgdm9pZAorb25faGFuZG9mZiAoR3N0RWxlbWVudCAqIG9iamVjdCwgR3N0QnVmZmVyICogYnVmZmVyLCBHc3RQYWQgKiBwYWQsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBpZiAoIWhhdmVfZGF0YSkgeworICAgIEdzdE1hcEluZm8gbWFwOworICAgIGdmbG9hdCAqZGF0YTsKKworICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpKTsKKyAgICBkYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKworICAgIGZhaWxfdW5sZXNzIChtYXAuc2l6ZSA+IDUgKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgICBmYWlsX3VubGVzcyAoZGF0YVswXSA9PSAwLjApOworICAgIGZhaWxfdW5sZXNzIChkYXRhWzFdID09IDAuMCk7CisgICAgZmFpbF91bmxlc3MgKGRhdGFbMl0gPT0gMC4wKTsKKyAgICBmYWlsX3VubGVzcyAoZGF0YVszXSA9PSAwLjApOworICAgIGZhaWxfdW5sZXNzIChkYXRhWzRdID09IDAuMCk7CisgICAgZmFpbF91bmxlc3MgKGRhdGFbNV0gIT0gMC4wKTsKKworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgICAgaGF2ZV9kYXRhID0gVFJVRTsKKyAgfQorfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9waXBlbGluZSkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmUsICpzcmMsICpmaWx0ZXIsICpzaW5rOworICBHc3RCdXMgKmJ1czsKKyAgR01haW5Mb29wICpsb29wOworCisgIGhhdmVfZGF0YSA9IEZBTFNFOworICBoYXZlX2VvcyA9IEZBTFNFOworCisgIHBpcGVsaW5lID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicGlwZWxpbmUiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHBpcGVsaW5lICE9IE5VTEwpOworCisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvdGVzdHNyYyIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoc3JjICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzcmMpLCAibnVtLWJ1ZmZlcnMiLCAxMDAwLCBOVUxMKTsKKworICBmaWx0ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb2lpcmZpbHRlciIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZmlsdGVyICE9IE5VTEwpOworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoZmlsdGVyKSwgInJhdGUtY2hhbmdlZCIsCisgICAgICBHX0NBTExCQUNLIChvbl9yYXRlX2NoYW5nZWQpLCBOVUxMKTsKKworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHNpbmsgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNpbmspLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChzaW5rKSwgImhhbmRvZmYiLCBHX0NBTExCQUNLIChvbl9oYW5kb2ZmKSwgTlVMTCk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMsIGZpbHRlciwgc2luaywgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rX21hbnkgKHNyYywgZmlsdGVyLCBzaW5rLCBOVUxMKSk7CisKKyAgbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgRkFMU0UpOworCisgIGJ1cyA9IGdzdF9waXBlbGluZV9nZXRfYnVzIChHU1RfUElQRUxJTkUgKHBpcGVsaW5lKSk7CisgIGdzdF9idXNfYWRkX3NpZ25hbF93YXRjaCAoYnVzKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoR19PQkpFQ1QgKGJ1cyksICJtZXNzYWdlIiwgR19DQUxMQkFDSyAob25fbWVzc2FnZSksIGxvb3ApOworCisgIGZhaWxfaWYgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKworICBmYWlsX3VubGVzcyAoaGF2ZV9kYXRhKTsKKyAgZmFpbF91bmxlc3MgKGhhdmVfZW9zKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwKKyAgICAgICAgICBHU1RfU1RBVEVfTlVMTCkgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBnc3RfYnVzX3JlbW92ZV9zaWduYWxfd2F0Y2ggKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKGJ1cykpOworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorYXVkaW9paXJmaWx0ZXJfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiYXVkaW9paXJmaWx0ZXIiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGlwZWxpbmUpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoYXVkaW9paXJmaWx0ZXIpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW9pbnZlcnQuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvaW52ZXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyMWZkZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvaW52ZXJ0LmMKQEAgLTAsMCArMSwyODQgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIHVuaXQgdGVzdCBmb3IgYXVkaW9pbnZlcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIEdyZWF0bHkgYmFzZWQgb24gdGhlIGF1ZGlvcGFub3JhbWEgdW5pdCB0ZXN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworZ2Jvb2xlYW4gaGF2ZV9lb3MgPSBGQUxTRTsKKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcKKyAqIHNyYyBhbmQgc2luayBwYWRzIHdlIGNyZWF0ZTsgb3RoZXJ3aXNlIHdlIGFsd2F5cyBoYXZlIHRvIGRvIGdldF9wYWQsCisgKiBnZXRfcGVlciwgYW5kIHRoZW4gcmVtb3ZlIHJlZmVyZW5jZXMgaW4gZXZlcnkgdGVzdCBmdW5jdGlvbiAqLworR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKKworCisjZGVmaW5lIElOVkVSVF9DQVBTX1NUUklORyAgICBcCisgICAgImF1ZGlvL3gtcmF3LCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpICJHU1RfQVVESU9fTkUoUzE2KSIsICIgICBcCisgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJhdGUgPSAoaW50KSA0NDEwMCIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzE2KSAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICJyYXRlID0gKGludCkgWyAxLCAgTUFYIF0iKQorICAgICk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChTMTYpICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgInJhdGUgPSAoaW50KSBbIDEsICBNQVggXSIpCisgICAgKTsKKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfaW52ZXJ0ICh2b2lkKQoreworICBHc3RFbGVtZW50ICppbnZlcnQ7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfaW52ZXJ0Iik7CisgIGludmVydCA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgiYXVkaW9pbnZlcnQiKTsKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoaW52ZXJ0LCAmc3JjdGVtcGxhdGUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGludmVydCwgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgcmV0dXJuIGludmVydDsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfaW52ZXJ0IChHc3RFbGVtZW50ICogaW52ZXJ0KQoreworICBHU1RfREVCVUcgKCJjbGVhbnVwX2ludmVydCIpOworCisgIGdfbGlzdF9mb3JlYWNoIChidWZmZXJzLCAoR0Z1bmMpIGdzdF9taW5pX29iamVjdF91bnJlZiwgTlVMTCk7CisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKyAgYnVmZmVycyA9IE5VTEw7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAoaW52ZXJ0KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChpbnZlcnQpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAoaW52ZXJ0KTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFzc3Rocm91Z2gpCit7CisgIEdzdEVsZW1lbnQgKmludmVydDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludDE2IGluWzRdID0geyAxNjM4NCwgLTI1NiwgMTI4LCAtNTEyIH07CisgIGdpbnQxNiAqcmVzOworICBHc3RNYXBJbmZvIG1hcDsKKworICBpbnZlcnQgPSBzZXR1cF9pbnZlcnQgKCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGludmVydCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg4KTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChpbmJ1ZmZlciwgMCwgaW4sIDgpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKGluYnVmZmVyLCAwLCBpbiwgOCkgPT0gMCk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoSU5WRVJUX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGludmVydCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBidXQgaXQgZW5kcyB1cCBiZWluZyBjb2xsZWN0ZWQgb24gdGhlIGdsb2JhbCBidWZmZXIgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnaW50MTYgKikgbWFwLmRhdGE7CisgIEdTVF9JTkZPICgiZXhwZWN0ZWQgJSs1ZCAlKzVkICUrNWQgJSs1ZCByZWFsICUrNWQgJSs1ZCAlKzVkICUrNWQiLAorICAgICAgaW5bMF0sIGluWzFdLCBpblsyXSwgaW5bM10sIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIDAsIGluLCA4KSA9PSAwKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfaW52ZXJ0IChpbnZlcnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3plcm8pCit7CisgIEdzdEVsZW1lbnQgKmludmVydDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludDE2IGluWzRdID0geyAxNjM4NCwgLTI1NiwgMTI4LCAtNTEyIH07CisgIGdpbnQxNiBvdXRbNF0gPSB7IDAsIDAsIDAsIDAgfTsKKyAgZ2ludDE2ICpyZXM7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGludmVydCA9IHNldHVwX2ludmVydCAoKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoaW52ZXJ0KSwgImRlZ3JlZSIsIDAuNSwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGludmVydCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg4KTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChpbmJ1ZmZlciwgMCwgaW4sIDgpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKGluYnVmZmVyLCAwLCBpbiwgOCkgPT0gMCk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoSU5WRVJUX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGludmVydCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdpbnQxNiAqKSBtYXAuZGF0YTsKKyAgR1NUX0lORk8gKCJleHBlY3RlZCAlKzVkICUrNWQgJSs1ZCAlKzVkIHJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsCisgICAgICBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10sIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIDAsIG91dCwgOCkgPT0gMCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2ludmVydCAoaW52ZXJ0KTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mdWxsX2ludmVyc2UpCit7CisgIEdzdEVsZW1lbnQgKmludmVydDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludDE2IGluWzRdID0geyAxNjM4NCwgLTI1NiwgMTI4LCAtNTEyIH07CisgIGdpbnQxNiBvdXRbNF0gPSB7IC0xNjM4NSwgMjU1LCAtMTI5LCA1MTEgfTsKKyAgZ2ludDE2ICpyZXM7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGludmVydCA9IHNldHVwX2ludmVydCAoKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoaW52ZXJ0KSwgImRlZ3JlZSIsIDEuMCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGludmVydCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg4KTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChpbmJ1ZmZlciwgMCwgaW4sIDgpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKGluYnVmZmVyLCAwLCBpbiwgOCkgPT0gMCk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoSU5WRVJUX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGludmVydCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdpbnQxNiAqKSBtYXAuZGF0YTsKKyAgR1NUX0lORk8gKCJleHBlY3RlZCAlKzVkICUrNWQgJSs1ZCAlKzVkIHJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsCisgICAgICBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10sIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIDAsIG91dCwgOCkgPT0gMCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2ludmVydCAoaW52ZXJ0KTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF8yNV9pbnZlcnNlKQoreworICBHc3RFbGVtZW50ICppbnZlcnQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdpbnQxNiBpbls0XSA9IHsgMTYzODQsIC0yNTYsIDEyOCwgLTUxMiB9OworICBnaW50MTYgb3V0WzRdID0geyA4MTkxLCAtMTI4LCA2MywgLTI1NiB9OworICBnaW50MTYgKnJlczsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgaW52ZXJ0ID0gc2V0dXBfaW52ZXJ0ICgpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChpbnZlcnQpLCAiZGVncmVlIiwgMC4yNSwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGludmVydCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg4KTsKKyAgZ3N0X2J1ZmZlcl9maWxsIChpbmJ1ZmZlciwgMCwgaW4sIDgpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKGluYnVmZmVyLCAwLCBpbiwgOCkgPT0gMCk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoSU5WRVJUX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGludmVydCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdpbnQxNiAqKSBtYXAuZGF0YTsKKyAgR1NUX0lORk8gKCJleHBlY3RlZCAlKzVkICUrNWQgJSs1ZCAlKzVkIHJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsCisgICAgICBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10sIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIDAsIG91dCwgOCkgPT0gMCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2ludmVydCAoaW52ZXJ0KTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgoraW52ZXJ0X3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImludmVydCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXNzdGhyb3VnaCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF96ZXJvKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2Z1bGxfaW52ZXJzZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF8yNV9pbnZlcnNlKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGludmVydCk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3Bhbm9yYW1hLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3Bhbm9yYW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1NzExOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1ZGlvcGFub3JhbWEuYwpAQCAtMCwwICsxLDgxOCBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBhdWRpb3Bhbm9yYW1hCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKK2dib29sZWFuIGhhdmVfZW9zID0gRkFMU0U7CisKKy8qIEZvciBlYXNlIG9mIHByb2dyYW1taW5nIHdlIHVzZSBnbG9iYWxzIHRvIGtlZXAgcmVmcyBmb3Igb3VyIGZsb2F0aW5nCisgKiBzcmMgYW5kIHNpbmsgcGFkcyB3ZSBjcmVhdGU7IG90aGVyd2lzZSB3ZSBhbHdheXMgaGF2ZSB0byBkbyBnZXRfcGFkLAorICogZ2V0X3BlZXIsIGFuZCB0aGVuIHJlbW92ZSByZWZlcmVuY2VzIGluIGV2ZXJ5IHRlc3QgZnVuY3Rpb24gKi8KK0dzdFBhZCAqbXlzcmNwYWQsICpteXNpbmtwYWQ7CisKKworI2RlZmluZSBQQU5PUkFNQV9TMTZfTU9OT19DQVBTX1NUUklORyAgIFwKKyAgICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAgICAgICAgICAgICAgXAorICAgICJyYXRlID0gKGludCkgNDQxMDAsICIgICAgICAgICAgICAgIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgICBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FKFMxNikKKworI2RlZmluZSBQQU5PUkFNQV9TMTZfU1RFUkVPX0NBUFNfU1RSSU5HIFwKKyAgICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgMiwgIiAgICAgICAgICAgICAgXAorICAgICJjaGFubmVsLW1hc2sgPSAoYml0bWFzaykgMywgIiAgICAgIFwKKyAgICAicmF0ZSA9IChpbnQpIDQ0MTAwLCAiICAgICAgICAgICAgICBcCisgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiICAgXAorICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORShTMTYpCisKKyNkZWZpbmUgUEFOT1JBTUFfRjMyX01PTk9fQ0FQU19TVFJJTkcgICBcCisgICAgImF1ZGlvL3gtcmF3LCAiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgICAgICAgICAgICAgIFwKKyAgICAicmF0ZSA9IChpbnQpIDQ0MTAwLCAiICAgICAgICAgICAgICBcCisgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiICAgXAorICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORShGMzIpCisKKyNkZWZpbmUgUEFOT1JBTUFfRjMyX1NURVJFT19DQVBTX1NUUklORyBcCisgICAgImF1ZGlvL3gtcmF3LCAiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJjaGFubmVscyA9IChpbnQpIDIsICIgICAgICAgICAgICAgIFwKKyAgICAiY2hhbm5lbC1tYXNrID0gKGJpdG1hc2spIDMsICIgICAgICBcCisgICAgInJhdGUgPSAoaW50KSA0NDEwMCwgIiAgICAgICAgICAgICAgXAorICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgIFwKKyAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUoRjMyKQorCisjZGVmaW5lIFBBTk9SQU1BX1dST05HX0NBUFNfU1RSSU5HICBcCisgICAgImF1ZGlvL3gtcmF3LCAiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJjaGFubmVscyA9IChpbnQpIDUsICIgICAgICAgICAgICAgIFwKKyAgICAicmF0ZSA9IChpbnQpIDQ0MTAwLCAiICAgICAgICAgICAgICBcCisgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiICAgXAorICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORShVMTYpCisKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZVsyXSA9IHsKKyAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICAgIEdTVF9QQURfU0lOSywKKyAgICAgIEdTVF9QQURfQUxXQVlTLAorICAgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAyLCAiCisgICAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsICBNQVggXSwgIgorICAgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzE2KSkKKyAgICAgICksCisgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgICBHU1RfUEFEX1NJTkssCisgICAgICBHU1RfUEFEX0FMV0FZUywKKyAgICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICAgImNoYW5uZWxzID0gKGludCkgMiwgIgorICAgICAgICAgICJyYXRlID0gKGludCkgWyAxLCAgTUFYIF0sICIKKyAgICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKEYzMikpCisgICAgICApLAorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIG1zcmN0ZW1wbGF0ZVsyXSA9IHsKKyAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgICAgR1NUX1BBRF9TUkMsCisgICAgICBHU1RfUEFEX0FMV0FZUywKKyAgICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIgorICAgICAgICAgICJyYXRlID0gKGludCkgWyAxLCAgTUFYIF0sICIKKyAgICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKFMxNikpCisgICAgICApLAorICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgICBHU1RfUEFEX1NSQywKKyAgICAgIEdTVF9QQURfQUxXQVlTLAorICAgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiCisgICAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsICBNQVggXSwgIgorICAgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoRjMyKSkKKyAgICAgICksCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3NyY3RlbXBsYXRlWzJdID0geworICBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgICBHU1RfUEFEX1NSQywKKyAgICAgIEdTVF9QQURfQUxXQVlTLAorICAgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAyLCAiCisgICAgICAgICAgInJhdGUgPSAoaW50KSBbIDEsICBNQVggXSwgIgorICAgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzE2KSkKKyAgICAgICksCisgIEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICAgIEdTVF9QQURfU1JDLAorICAgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAgICJjaGFubmVscyA9IChpbnQpIDIsICIKKyAgICAgICAgICAicmF0ZSA9IChpbnQpIFsgMSwgIE1BWCBdLCAiCisgICAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChGMzIpKQorICAgICAgKSwKK307CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX3Bhbm9yYW1hIChHc3RTdGF0aWNQYWRUZW1wbGF0ZSAqIHNyY3RlbXBsYXRlLCBnaW50IGZtdCwKKyAgICBjb25zdCBnY2hhciAqIGNhcHNfc3RyKQoreworICBHc3RFbGVtZW50ICpwYW5vcmFtYTsKKworICBHU1RfREVCVUcgKCJzZXR1cF9wYW5vcmFtYSIpOworICBwYW5vcmFtYSA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgiYXVkaW9wYW5vcmFtYSIpOworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChwYW5vcmFtYSwgJnNyY3RlbXBsYXRlW2ZtdF0pOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKHBhbm9yYW1hLCAmc2lua3RlbXBsYXRlW2ZtdF0pOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworCisgIGlmIChjYXBzX3N0cikgeworICAgIEdzdENhcHMgKmNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoY2Fwc19zdHIpOworICAgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBwYW5vcmFtYSwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIH0KKyAgcmV0dXJuIHBhbm9yYW1hOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9wYW5vcmFtYV9zMTZfbSAoZ2ludCBtZXRob2QsIGdmbG9hdCBwYW4pCit7CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hOworICBwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hIChtc3JjdGVtcGxhdGUsIDAsIFBBTk9SQU1BX1MxNl9NT05PX0NBUFNfU1RSSU5HKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAocGFub3JhbWEpLCAibWV0aG9kIiwgbWV0aG9kLCAicGFub3JhbWEiLCBwYW4sIE5VTEwpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBhbm9yYW1hLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIEdTVF9ERUJVRyAoInBhbm9yYW1hKG1vbm8pIHJlYWR5Iik7CisKKyAgcmV0dXJuIHBhbm9yYW1hOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9wYW5vcmFtYV9mMzJfbSAoZ2ludCBtZXRob2QsIGdmbG9hdCBwYW4pCit7CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hOworICBwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hIChtc3JjdGVtcGxhdGUsIDEsIFBBTk9SQU1BX0YzMl9NT05PX0NBUFNfU1RSSU5HKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAocGFub3JhbWEpLCAibWV0aG9kIiwgbWV0aG9kLCAicGFub3JhbWEiLCBwYW4sIE5VTEwpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBhbm9yYW1hLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIEdTVF9ERUJVRyAoInBhbm9yYW1hKG1vbm8pIHJlYWR5Iik7CisKKyAgcmV0dXJuIHBhbm9yYW1hOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9wYW5vcmFtYV9zMTZfcyAoZ2ludCBtZXRob2QsIGdmbG9hdCBwYW4pCit7CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hOworICBwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hIChzc3JjdGVtcGxhdGUsIDAsIFBBTk9SQU1BX1MxNl9TVEVSRU9fQ0FQU19TVFJJTkcpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChwYW5vcmFtYSksICJtZXRob2QiLCBtZXRob2QsICJwYW5vcmFtYSIsIHBhbiwgTlVMTCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGFub3JhbWEsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgR1NUX0RFQlVHICgicGFub3JhbWEoc3RlcmVvKSByZWFkeSIpOworCisgIHJldHVybiBwYW5vcmFtYTsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfcGFub3JhbWFfZjMyX3MgKGdpbnQgbWV0aG9kLCBnZmxvYXQgcGFuKQoreworICBHc3RFbGVtZW50ICpwYW5vcmFtYTsKKyAgcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYSAoc3NyY3RlbXBsYXRlLCAxLCBQQU5PUkFNQV9GMzJfU1RFUkVPX0NBUFNfU1RSSU5HKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAocGFub3JhbWEpLCAibWV0aG9kIiwgbWV0aG9kLCAicGFub3JhbWEiLCBwYW4sIE5VTEwpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBhbm9yYW1hLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIEdTVF9ERUJVRyAoInBhbm9yYW1hKHN0ZXJlbykgcmVhZHkiKTsKKworICByZXR1cm4gcGFub3JhbWE7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX3Bhbm9yYW1hIChHc3RFbGVtZW50ICogcGFub3JhbWEpCit7CisgIEdTVF9ERUJVRyAoImNsZWFuaW5nIHVwIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGFub3JhbWEsIEdTVF9TVEFURV9OVUxMKTsKKworICBnX2xpc3RfZm9yZWFjaCAoYnVmZmVycywgKEdGdW5jKSBnc3RfbWluaV9vYmplY3RfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKHBhbm9yYW1hKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChwYW5vcmFtYSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChwYW5vcmFtYSk7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorc2V0dXBfYnVmZmVyIChncG9pbnRlciBkYXRhLCBnc2l6ZSBzaXplKQoreworICByZXR1cm4gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksIGRhdGEsIHNpemUsIDAsCisgICAgICBzaXplLCBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK2RvX3Bhbm9yYW1hIChncG9pbnRlciBpbl9kYXRhLCBnc2l6ZSBpbl9zaXplLCBncG9pbnRlciBvdXRfZGF0YSwgZ3NpemUgb3V0X3NpemUpCit7CisgIEdzdEJ1ZmZlciAqaW4sICpvdXQ7CisKKyAgaW4gPSBzZXR1cF9idWZmZXIgKGluX2RhdGEsIGluX3NpemUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW4pID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0ID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZXh0cmFjdCAob3V0LCAwLCBvdXRfZGF0YSwgb3V0X3NpemUpID09IG91dF9zaXplKTsKK30KKworLyogdGhlIHRlc3RzICovCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3JlZl9jb3VudHMpCit7CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBnaW50MTYgaW5bMl0gPSB7IDE2Mzg0LCAtMjU2IH07CisKKyAgcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYSAobXNyY3RlbXBsYXRlLCAwLCBQQU5PUkFNQV9TMTZfTU9OT19DQVBTX1NUUklORyk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBhbm9yYW1hLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgaW5idWZmZXIgPSBzZXR1cF9idWZmZXIgKGluLCBzaXplb2YgKGluKSk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGJ1dCBpdCBlbmRzIHVwIGJlaW5nIGNvbGxlY3RlZCBvbiB0aGUgZ2xvYmFsIGJ1ZmZlciBsaXN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisgIGZhaWxfaWYgKGluYnVmZmVyID09IG91dGJ1ZmZlcik7CisKKyAgLyogY2xlYW51cCAqLworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwYW5vcmFtYSwKKyAgICAgICAgICBHU1RfU1RBVEVfTlVMTCkgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLCAiY291bGQgbm90IHNldCB0byBudWxsIik7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHBhbm9yYW1hLCAicGFub3JhbWEiLCAxKTsKKyAgY2xlYW51cF9wYW5vcmFtYSAocGFub3JhbWEpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3dyb25nX2NhcHMpCit7CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hOworICBHc3RCdWZmZXIgKmluYnVmZmVyOworICBnaW50MTYgaW5bMl0gPSB7IDE2Mzg0LCAtMjU2IH07CisgIEdzdEJ1cyAqYnVzOworICBHc3RNZXNzYWdlICptZXNzYWdlOworICBHc3RDYXBzICpjYXBzOworCisgIHBhbm9yYW1hID0gc2V0dXBfcGFub3JhbWEgKG1zcmN0ZW1wbGF0ZSwgMCwgTlVMTCk7CisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBhbm9yYW1hLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgaW5idWZmZXIgPSBzZXR1cF9idWZmZXIgKGluLCBzaXplb2YgKGluKSk7CisgIGdzdF9idWZmZXJfcmVmIChpbmJ1ZmZlcik7CisKKyAgLyogc2V0IGEgYnVzIGhlcmUgc28gd2UgYXZvaWQgZ2V0dGluZyBzdGF0ZSBjaGFuZ2UgbWVzc2FnZXMgKi8KKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAocGFub3JhbWEsIGJ1cyk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChQQU5PUkFNQV9XUk9OR19DQVBTX1NUUklORyk7CisgIC8qIHRoaXMgYWN0dWFsbHkgc3VjY2VlZHMsIGJlY2F1c2UgdGhlIGNhcHMgZXZlbnQgaXMgc3RpY2t5ICovCisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBwYW5vcmFtYSwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYW4gZXJyb3IgYmVjYXVzZSBpdCBjYW4ndCBuZWdvdGlhdGUgd2l0aCB3cm9uZyBjYXBzICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSwKKyAgICAgIEdTVF9GTE9XX05PVF9ORUdPVElBVEVEKTsKKyAgLyogLi4uIGFuZCB0aGUgYnVmZmVyIHdvdWxkIGhhdmUgYmVlbiBsb3N0IGlmIHdlIGRpZG4ndCByZWYgaXQgb3Vyc2VsdmVzICovCisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoaW5idWZmZXIpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMCk7CisKKyAgLyogcGFub3JhbWFfc2V0X2NhcHMgc2hvdWxkIG5vdCBoYXZlIGJlZW4gY2FsbGVkIHNpbmNlIGJhc2V0cmFuc2Zvcm0gY2F1Z2h0CisgICAqIHRoZSBuZWdvdGlhdGlvbiBwcm9ibGVtICovCisgIGZhaWxfaWYgKChtZXNzYWdlID0gZ3N0X2J1c19wb3AgKGJ1cykpICE9IE5VTEwpOworCisgIC8qIGNsZWFudXAgKi8KKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAocGFub3JhbWEsIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChHU1RfT0JKRUNUIChidXMpKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwYW5vcmFtYSwgR1NUX1NUQVRFX05VTEwpOworICBjbGVhbnVwX3Bhbm9yYW1hIChwYW5vcmFtYSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogcHJvY2Vzc2luZyBmb3IgbWV0aG9kPXBzeSAqLworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zMTZfbW9ub19taWRkbGUpCit7CisgIGdpbnQxNiBpblsyXSA9IHsgMTYzODQsIC0yNTYgfTsKKyAgZ2ludDE2IG91dFs0XSA9IHsgODE5MiwgODE5MiwgLTEyOCwgLTEyOCB9OworICBnaW50MTYgcmVzWzRdOworICBHc3RFbGVtZW50ICpwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hX3MxNl9tICgwLCAwLjApOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSk7CisgIEdTVF9JTkZPICgicmVhbCAlKzVkICUrNWQgJSs1ZCAlKzVkIiwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZmFpbF91bmxlc3MgKG1lbWNtcCAocmVzLCBvdXQsIHNpemVvZiAocmVzKSkgPT0gMCk7CisKKyAgY2xlYW51cF9wYW5vcmFtYSAocGFub3JhbWEpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3MxNl9tb25vX2xlZnQpCit7CisgIGdpbnQxNiBpblsyXSA9IHsgMTYzODQsIC0yNTYgfTsKKyAgZ2ludDE2IG91dFs0XSA9IHsgMTYzODQsIDAsIC0yNTYsIDAgfTsKKyAgZ2ludDE2IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9zMTZfbSAoMCwgLTEuMCk7CisKKyAgZG9fcGFub3JhbWEgKGluLCBzaXplb2YgKGluKSwgcmVzLCBzaXplb2YgKHJlcykpOworCisgIEdTVF9JTkZPICgiZXhwLiAlKzVkICUrNWQgJSs1ZCAlKzVkIiwgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdKTsKKyAgR1NUX0lORk8gKCJyZWFsICUrNWQgJSs1ZCAlKzVkICUrNWQiLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLCByZXNbM10pOworICBmYWlsX3VubGVzcyAobWVtY21wIChyZXMsIG91dCwgc2l6ZW9mIChyZXMpKSA9PSAwKTsKKworICBjbGVhbnVwX3Bhbm9yYW1hIChwYW5vcmFtYSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfczE2X21vbm9fcmlnaHQpCit7CisgIGdpbnQxNiBpblsyXSA9IHsgMTYzODQsIC0yNTYgfTsKKyAgZ2ludDE2IG91dFs0XSA9IHsgMCwgMTYzODQsIDAsIC0yNTYgfTsKKyAgZ2ludDE2IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9zMTZfbSAoMCwgMS4wKTsKKworICBkb19wYW5vcmFtYSAoaW4sIHNpemVvZiAoaW4pLCByZXMsIHNpemVvZiAocmVzKSk7CisKKyAgR1NUX0lORk8gKCJleHAuICUrNWQgJSs1ZCAlKzVkICUrNWQiLCBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10pOworICBHU1RfSU5GTyAoInJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZhaWxfdW5sZXNzIChtZW1jbXAgKHJlcywgb3V0LCBzaXplb2YgKHJlcykpID09IDApOworCisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zMTZfc3RlcmVvX21pZGRsZSkKK3sKKyAgZ2ludDE2IGluWzRdID0geyAxNjM4NCwgLTI1NiwgODE5MiwgMTI4IH07CisgIGdpbnQxNiByZXNbNF07CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hID0gc2V0dXBfcGFub3JhbWFfczE2X3MgKDAsIDAuMCk7CisKKyAgZG9fcGFub3JhbWEgKGluLCBzaXplb2YgKGluKSwgcmVzLCBzaXplb2YgKHJlcykpOworCisgIEdTVF9JTkZPICgiZXhwLiAlKzVkICUrNWQgJSs1ZCAlKzVkIiwgaW5bMF0sIGluWzFdLCBpblsyXSwgaW5bM10pOworICBHU1RfSU5GTyAoInJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZhaWxfdW5sZXNzIChtZW1jbXAgKHJlcywgaW4sIHNpemVvZiAocmVzKSkgPT0gMCk7CisKKyAgY2xlYW51cF9wYW5vcmFtYSAocGFub3JhbWEpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3MxNl9zdGVyZW9fbGVmdCkKK3sKKyAgZ2ludDE2IGluWzRdID0geyAxNjM4NCwgLTI1NiwgODE5MiwgMTI4IH07CisgIGdpbnQxNiBvdXRbNF0gPSB7IDE2Mzg0IC0gMjU2LCAwLCA4MTkyICsgMTI4LCAwIH07CisgIGdpbnQxNiByZXNbNF07CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hID0gc2V0dXBfcGFub3JhbWFfczE2X3MgKDAsIC0xLjApOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSk7CisgIEdTVF9JTkZPICgicmVhbCAlKzVkICUrNWQgJSs1ZCAlKzVkIiwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZmFpbF91bmxlc3MgKG1lbWNtcCAocmVzLCBvdXQsIHNpemVvZiAocmVzKSkgPT0gMCk7CisKKyAgY2xlYW51cF9wYW5vcmFtYSAocGFub3JhbWEpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3MxNl9zdGVyZW9fcmlnaHQpCit7CisgIGdpbnQxNiBpbls0XSA9IHsgMTYzODQsIC0yNTYsIDgxOTIsIDEyOCB9OworICBnaW50MTYgb3V0WzRdID0geyAwLCAtMjU2ICsgMTYzODQsIDAsIDEyOCArIDgxOTIgfTsKKyAgZ2ludDE2IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9zMTZfcyAoMCwgMS4wKTsKKworICBkb19wYW5vcmFtYSAoaW4sIHNpemVvZiAoaW4pLCByZXMsIHNpemVvZiAocmVzKSk7CisKKyAgR1NUX0lORk8gKCJleHAuICUrNWQgJSs1ZCAlKzVkICUrNWQiLCBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10pOworICBHU1RfSU5GTyAoInJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZhaWxfdW5sZXNzIChtZW1jbXAgKHJlcywgb3V0LCBzaXplb2YgKHJlcykpID09IDApOworCisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mMzJfbW9ub19taWRkbGUpCit7CisgIGdmbG9hdCBpblsyXSA9IHsgMC41LCAtMC4yIH07CisgIGdmbG9hdCBvdXRbNF0gPSB7IDAuMjUsIDAuMjUsIC0wLjEsIC0wLjEgfTsKKyAgZ2Zsb2F0IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9mMzJfbSAoMCwgMC4wKTsKKyAgZ2ludCBpOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs0LjJmICUrNC4yZiAlKzQuMmYgJSs0LjJmIiwgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdKTsKKyAgR1NUX0lORk8gKCJyZWFsICUrNC4yZiAlKzQuMmYgJSs0LjJmICUrNC4yZiIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgZmFpbF91bmxlc3MgKHJlc1tpXSA9PSBvdXRbaV0sICJkaWZmZXJlbmNlIGF0IHBvcz0lZCIsIGkpOworCisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mMzJfbW9ub19sZWZ0KQoreworICBnZmxvYXQgaW5bMl0gPSB7IDAuNSwgLTAuMiB9OworICBnZmxvYXQgb3V0WzRdID0geyAwLjUsIDAuMCwgLTAuMiwgMC4wIH07CisgIGdmbG9hdCByZXNbNF07CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hID0gc2V0dXBfcGFub3JhbWFfZjMyX20gKDAsIC0xLjApOworICBnaW50IGk7CisKKyAgZG9fcGFub3JhbWEgKGluLCBzaXplb2YgKGluKSwgcmVzLCBzaXplb2YgKHJlcykpOworCisgIEdTVF9JTkZPICgiZXhwLiAlKzQuMmYgJSs0LjJmICUrNC4yZiAlKzQuMmYiLCBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10pOworICBHU1RfSU5GTyAoInJlYWwgJSs0LjJmICUrNC4yZiAlKzQuMmYgJSs0LjJmIiwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICBmYWlsX3VubGVzcyAocmVzW2ldID09IG91dFtpXSwgImRpZmZlcmVuY2UgYXQgcG9zPSVkIiwgaSk7CisKKyAgY2xlYW51cF9wYW5vcmFtYSAocGFub3JhbWEpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2YzMl9tb25vX3JpZ2h0KQoreworICBnZmxvYXQgaW5bMl0gPSB7IDAuNSwgLTAuMiB9OworICBnZmxvYXQgb3V0WzRdID0geyAwLjAsIDAuNSwgMC4wLCAtMC4yIH07CisgIGdmbG9hdCByZXNbNF07CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hID0gc2V0dXBfcGFub3JhbWFfZjMyX20gKDAsIDEuMCk7CisgIGdpbnQgaTsKKworICBkb19wYW5vcmFtYSAoaW4sIHNpemVvZiAoaW4pLCByZXMsIHNpemVvZiAocmVzKSk7CisKKyAgR1NUX0lORk8gKCJleHAuICUrNC4yZiAlKzQuMmYgJSs0LjJmICUrNC4yZiIsIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSk7CisgIEdTVF9JTkZPICgicmVhbCAlKzQuMmYgJSs0LjJmICUrNC4yZiAlKzQuMmYiLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLCByZXNbM10pOworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIGZhaWxfdW5sZXNzIChyZXNbaV0gPT0gb3V0W2ldLCAiZGlmZmVyZW5jZSBhdCBwb3M9JWQiLCBpKTsKKworICBjbGVhbnVwX3Bhbm9yYW1hIChwYW5vcmFtYSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZjMyX3N0ZXJlb19taWRkbGUpCit7CisgIGdmbG9hdCBpbls0XSA9IHsgMC41LCAtMC4yLCAwLjI1LCAwLjEgfTsKKyAgZ2Zsb2F0IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9mMzJfcyAoMCwgMC4wKTsKKyAgZ2ludCBpOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs0LjJmICUrNC4yZiAlKzQuMmYgJSs0LjJmIiwgaW5bMF0sIGluWzFdLCBpblsyXSwgaW5bM10pOworICBHU1RfSU5GTyAoInJlYWwgJSs0LjJmICUrNC4yZiAlKzQuMmYgJSs0LjJmIiwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICBmYWlsX3VubGVzcyAocmVzW2ldID09IGluW2ldLCAiZGlmZmVyZW5jZSBhdCBwb3M9JWQiLCBpKTsKKworICBjbGVhbnVwX3Bhbm9yYW1hIChwYW5vcmFtYSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZjMyX3N0ZXJlb19sZWZ0KQoreworICBnZmxvYXQgaW5bNF0gPSB7IDAuNSwgLTAuMiwgMC4yNSwgMC4xIH07CisgIGdmbG9hdCBvdXRbNF0gPSB7IDAuNSAtIDAuMiwgMC4wLCAwLjI1ICsgMC4xLCAwLjAgfTsKKyAgZ2Zsb2F0IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9mMzJfcyAoMCwgLTEuMCk7CisgIGdpbnQgaTsKKworICBkb19wYW5vcmFtYSAoaW4sIHNpemVvZiAoaW4pLCByZXMsIHNpemVvZiAocmVzKSk7CisKKyAgR1NUX0lORk8gKCJleHAuICUrNC4yZiAlKzQuMmYgJSs0LjJmICUrNC4yZiIsIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSk7CisgIEdTVF9JTkZPICgicmVhbCAlKzQuMmYgJSs0LjJmICUrNC4yZiAlKzQuMmYiLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLCByZXNbM10pOworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIGZhaWxfdW5sZXNzIChyZXNbaV0gPT0gb3V0W2ldLCAiZGlmZmVyZW5jZSBhdCBwb3M9JWQiLCBpKTsKKworICBjbGVhbnVwX3Bhbm9yYW1hIChwYW5vcmFtYSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZjMyX3N0ZXJlb19yaWdodCkKK3sKKyAgZ2Zsb2F0IGluWzRdID0geyAwLjUsIC0wLjIsIDAuMjUsIDAuMSB9OworICBnZmxvYXQgb3V0WzRdID0geyAwLjAsIC0wLjIgKyAwLjUsIDAuMCwgMC4xICsgMC4yNSB9OworICBnZmxvYXQgcmVzWzRdOworICBHc3RFbGVtZW50ICpwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hX2YzMl9zICgwLCAxLjApOworICBnaW50IGk7CisKKyAgZG9fcGFub3JhbWEgKGluLCBzaXplb2YgKGluKSwgcmVzLCBzaXplb2YgKHJlcykpOworCisgIEdTVF9JTkZPICgiZXhwLiAlKzQuMmYgJSs0LjJmICUrNC4yZiAlKzQuMmYiLCBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10pOworICBHU1RfSU5GTyAoInJlYWwgJSs0LjJmICUrNC4yZiAlKzQuMmYgJSs0LjJmIiwgcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdKTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICBmYWlsX3VubGVzcyAocmVzW2ldID09IG91dFtpXSwgImRpZmZlcmVuY2UgYXQgcG9zPSVkIiwgaSk7CisKKyAgY2xlYW51cF9wYW5vcmFtYSAocGFub3JhbWEpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIHByb2Nlc3NpbmcgZm9yIG1ldGhvZD1zaW1wbGUgKi8KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfczE2X21vbm9fbWlkZGxlX3NpbXBsZSkKK3sKKyAgZ2ludDE2IGluWzJdID0geyAxNjM4NCwgLTI1NiB9OworICBnaW50MTYgb3V0WzRdID0geyAxNjM4NCwgMTYzODQsIC0yNTYsIC0yNTYgfTsKKyAgZ2ludDE2IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9zMTZfbSAoMSwgMC4wKTsKKworICBkb19wYW5vcmFtYSAoaW4sIHNpemVvZiAoaW4pLCByZXMsIHNpemVvZiAocmVzKSk7CisKKyAgR1NUX0lORk8gKCJleHAuICUrNWQgJSs1ZCAlKzVkICUrNWQiLCBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10pOworICBHU1RfSU5GTyAoInJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZhaWxfdW5sZXNzIChtZW1jbXAgKHJlcywgb3V0LCBzaXplb2YgKHJlcykpID09IDApOworCisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zMTZfbW9ub19sZWZ0X3NpbXBsZSkKK3sKKyAgZ2ludDE2IGluWzJdID0geyAxNjM4NCwgLTI1NiB9OworICBnaW50MTYgb3V0WzRdID0geyAxNjM4NCwgMCwgLTI1NiwgMCB9OworICBnaW50MTYgcmVzWzRdOworICBHc3RFbGVtZW50ICpwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hX3MxNl9tICgxLCAtMS4wKTsKKworICBkb19wYW5vcmFtYSAoaW4sIHNpemVvZiAoaW4pLCByZXMsIHNpemVvZiAocmVzKSk7CisKKyAgR1NUX0lORk8gKCJleHAuICUrNWQgJSs1ZCAlKzVkICUrNWQiLCBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10pOworICBHU1RfSU5GTyAoInJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZhaWxfdW5sZXNzIChtZW1jbXAgKHJlcywgb3V0LCBzaXplb2YgKHJlcykpID09IDApOworCisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zMTZfbW9ub19yaWdodF9zaW1wbGUpCit7CisgIGdpbnQxNiBpblsyXSA9IHsgMTYzODQsIC0yNTYgfTsKKyAgZ2ludDE2IG91dFs0XSA9IHsgMCwgMTYzODQsIDAsIC0yNTYgfTsKKyAgZ2ludDE2IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9zMTZfbSAoMSwgMS4wKTsKKworICBkb19wYW5vcmFtYSAoaW4sIHNpemVvZiAoaW4pLCByZXMsIHNpemVvZiAocmVzKSk7CisKKyAgR1NUX0lORk8gKCJleHAuICUrNWQgJSs1ZCAlKzVkICUrNWQiLCBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10pOworICBHU1RfSU5GTyAoInJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZhaWxfdW5sZXNzIChtZW1jbXAgKHJlcywgb3V0LCBzaXplb2YgKHJlcykpID09IDApOworCisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zMTZfc3RlcmVvX21pZGRsZV9zaW1wbGUpCit7CisgIGdpbnQxNiBpbls0XSA9IHsgMTYzODQsIC0yNTYsIDgxOTIsIDEyOCB9OworICBnaW50MTYgcmVzWzRdOworICBHc3RFbGVtZW50ICpwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hX3MxNl9zICgxLCAwLjApOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIGluWzBdLCBpblsxXSwgaW5bMl0sIGluWzNdKTsKKyAgR1NUX0lORk8gKCJyZWFsICUrNWQgJSs1ZCAlKzVkICUrNWQiLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLCByZXNbM10pOworICBmYWlsX3VubGVzcyAobWVtY21wIChyZXMsIGluLCBzaXplb2YgKHJlcykpID09IDApOworCisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zMTZfc3RlcmVvX2xlZnRfc2ltcGxlKQoreworICBnaW50MTYgaW5bNF0gPSB7IDE2Mzg0LCAtMjU2LCA4MTkyLCAxMjggfTsKKyAgZ2ludDE2IG91dFs0XSA9IHsgMTYzODQsIDAsIDgxOTIsIDAgfTsKKyAgZ2ludDE2IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9zMTZfcyAoMSwgLTEuMCk7CisKKyAgZG9fcGFub3JhbWEgKGluLCBzaXplb2YgKGluKSwgcmVzLCBzaXplb2YgKHJlcykpOworCisgIEdTVF9JTkZPICgiZXhwLiAlKzVkICUrNWQgJSs1ZCAlKzVkIiwgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdKTsKKyAgR1NUX0lORk8gKCJyZWFsICUrNWQgJSs1ZCAlKzVkICUrNWQiLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLCByZXNbM10pOworICBmYWlsX3VubGVzcyAobWVtY21wIChyZXMsIG91dCwgc2l6ZW9mIChyZXMpKSA9PSAwKTsKKworICBjbGVhbnVwX3Bhbm9yYW1hIChwYW5vcmFtYSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfczE2X3N0ZXJlb19yaWdodF9zaW1wbGUpCit7CisgIGdpbnQxNiBpbls0XSA9IHsgMTYzODQsIC0yNTYsIDgxOTIsIDEyOCB9OworICBnaW50MTYgb3V0WzRdID0geyAwLCAtMjU2LCAwLCAxMjggfTsKKyAgZ2ludDE2IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9zMTZfcyAoMSwgMS4wKTsKKworICBkb19wYW5vcmFtYSAoaW4sIHNpemVvZiAoaW4pLCByZXMsIHNpemVvZiAocmVzKSk7CisKKyAgR1NUX0lORk8gKCJleHAuICUrNWQgJSs1ZCAlKzVkICUrNWQiLCBvdXRbMF0sIG91dFsxXSwgb3V0WzJdLCBvdXRbM10pOworICBHU1RfSU5GTyAoInJlYWwgJSs1ZCAlKzVkICUrNWQgJSs1ZCIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZhaWxfdW5sZXNzIChtZW1jbXAgKHJlcywgb3V0LCBzaXplb2YgKHJlcykpID09IDApOworCisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2YzMl9tb25vX21pZGRsZV9zaW1wbGUpCit7CisgIGdmbG9hdCBpblsyXSA9IHsgMC41LCAtMC4yIH07CisgIGdmbG9hdCBvdXRbNF0gPSB7IDAuNSwgMC41LCAtMC4yLCAtMC4yIH07CisgIGdmbG9hdCByZXNbNF07CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hID0gc2V0dXBfcGFub3JhbWFfZjMyX20gKDEsIDAuMCk7CisgIGdpbnQgaTsKKworICBkb19wYW5vcmFtYSAoaW4sIHNpemVvZiAoaW4pLCByZXMsIHNpemVvZiAocmVzKSk7CisKKyAgR1NUX0lORk8gKCJleHAuICUrNC4yZiAlKzQuMmYgJSs0LjJmICUrNC4yZiIsIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSk7CisgIEdTVF9JTkZPICgicmVhbCAlKzQuMmYgJSs0LjJmICUrNC4yZiAlKzQuMmYiLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLCByZXNbM10pOworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIGZhaWxfdW5sZXNzIChyZXNbaV0gPT0gb3V0W2ldLCAiZGlmZmVyZW5jZSBhdCBwb3M9JWQiLCBpKTsKKworICBjbGVhbnVwX3Bhbm9yYW1hIChwYW5vcmFtYSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZjMyX21vbm9fbGVmdF9zaW1wbGUpCit7CisgIGdmbG9hdCBpblsyXSA9IHsgMC41LCAtMC4yIH07CisgIGdmbG9hdCBvdXRbNF0gPSB7IDAuNSwgMC4wLCAtMC4yLCAwLjAgfTsKKyAgZ2Zsb2F0IHJlc1s0XTsKKyAgR3N0RWxlbWVudCAqcGFub3JhbWEgPSBzZXR1cF9wYW5vcmFtYV9mMzJfbSAoMSwgLTEuMCk7CisgIGdpbnQgaTsKKworICBkb19wYW5vcmFtYSAoaW4sIHNpemVvZiAoaW4pLCByZXMsIHNpemVvZiAocmVzKSk7CisKKyAgR1NUX0lORk8gKCJleHAuICUrNC4yZiAlKzQuMmYgJSs0LjJmICUrNC4yZiIsIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSk7CisgIEdTVF9JTkZPICgicmVhbCAlKzQuMmYgJSs0LjJmICUrNC4yZiAlKzQuMmYiLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLCByZXNbM10pOworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIGZhaWxfdW5sZXNzIChyZXNbaV0gPT0gb3V0W2ldLCAiZGlmZmVyZW5jZSBhdCBwb3M9JWQiLCBpKTsKKworICBjbGVhbnVwX3Bhbm9yYW1hIChwYW5vcmFtYSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZjMyX21vbm9fcmlnaHRfc2ltcGxlKQoreworICBnZmxvYXQgaW5bMl0gPSB7IDAuNSwgLTAuMiB9OworICBnZmxvYXQgb3V0WzRdID0geyAwLjAsIDAuNSwgMC4wLCAtMC4yIH07CisgIGdmbG9hdCByZXNbNF07CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hID0gc2V0dXBfcGFub3JhbWFfZjMyX20gKDEsIDEuMCk7CisgIGdpbnQgaTsKKworICBkb19wYW5vcmFtYSAoaW4sIHNpemVvZiAoaW4pLCByZXMsIHNpemVvZiAocmVzKSk7CisKKyAgR1NUX0lORk8gKCJleHAuICUrNC4yZiAlKzQuMmYgJSs0LjJmICUrNC4yZiIsIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSk7CisgIEdTVF9JTkZPICgicmVhbCAlKzQuMmYgJSs0LjJmICUrNC4yZiAlKzQuMmYiLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLCByZXNbM10pOworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIGZhaWxfdW5sZXNzIChyZXNbaV0gPT0gb3V0W2ldLCAiZGlmZmVyZW5jZSBhdCBwb3M9JWQiLCBpKTsKKworICBjbGVhbnVwX3Bhbm9yYW1hIChwYW5vcmFtYSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZjMyX3N0ZXJlb19taWRkbGVfc2ltcGxlKQoreworICBnZmxvYXQgaW5bNF0gPSB7IDAuNSwgLTAuMiwgMC4yNSwgMC4xIH07CisgIGdmbG9hdCByZXNbNF07CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hID0gc2V0dXBfcGFub3JhbWFfZjMyX3MgKDEsIDAuMCk7CisgIGdpbnQgaTsKKworICBkb19wYW5vcmFtYSAoaW4sIHNpemVvZiAoaW4pLCByZXMsIHNpemVvZiAocmVzKSk7CisKKyAgR1NUX0lORk8gKCJleHAuICUrNC4yZiAlKzQuMmYgJSs0LjJmICUrNC4yZiIsIGluWzBdLCBpblsxXSwgaW5bMl0sIGluWzNdKTsKKyAgR1NUX0lORk8gKCJyZWFsICUrNC4yZiAlKzQuMmYgJSs0LjJmICUrNC4yZiIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgZmFpbF91bmxlc3MgKHJlc1tpXSA9PSBpbltpXSwgImRpZmZlcmVuY2UgYXQgcG9zPSVkIiwgaSk7CisKKyAgY2xlYW51cF9wYW5vcmFtYSAocGFub3JhbWEpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2YzMl9zdGVyZW9fbGVmdF9zaW1wbGUpCit7CisgIGdmbG9hdCBpbls0XSA9IHsgMC41LCAtMC4yLCAwLjI1LCAwLjEgfTsKKyAgZ2Zsb2F0IG91dFs0XSA9IHsgMC41LCAwLjAsIDAuMjUsIDAuMCB9OworICBnZmxvYXQgcmVzWzRdOworICBHc3RFbGVtZW50ICpwYW5vcmFtYSA9IHNldHVwX3Bhbm9yYW1hX2YzMl9zICgxLCAtMS4wKTsKKyAgZ2ludCBpOworCisgIGRvX3Bhbm9yYW1hIChpbiwgc2l6ZW9mIChpbiksIHJlcywgc2l6ZW9mIChyZXMpKTsKKworICBHU1RfSU5GTyAoImV4cC4gJSs0LjJmICUrNC4yZiAlKzQuMmYgJSs0LjJmIiwgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdKTsKKyAgR1NUX0lORk8gKCJyZWFsICUrNC4yZiAlKzQuMmYgJSs0LjJmICUrNC4yZiIsIHJlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXSk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgZmFpbF91bmxlc3MgKHJlc1tpXSA9PSBvdXRbaV0sICJkaWZmZXJlbmNlIGF0IHBvcz0lZCIsIGkpOworCisgIGNsZWFudXBfcGFub3JhbWEgKHBhbm9yYW1hKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mMzJfc3RlcmVvX3JpZ2h0X3NpbXBsZSkKK3sKKyAgZ2Zsb2F0IGluWzRdID0geyAwLjUsIC0wLjIsIDAuMjUsIDAuMSB9OworICBnZmxvYXQgb3V0WzRdID0geyAwLjAsIC0wLjIsIDAuMCwgMC4xIH07CisgIGdmbG9hdCByZXNbNF07CisgIEdzdEVsZW1lbnQgKnBhbm9yYW1hID0gc2V0dXBfcGFub3JhbWFfZjMyX3MgKDEsIDEuMCk7CisgIGdpbnQgaTsKKworICBkb19wYW5vcmFtYSAoaW4sIHNpemVvZiAoaW4pLCByZXMsIHNpemVvZiAocmVzKSk7CisKKyAgR1NUX0lORk8gKCJleHAuICUrNC4yZiAlKzQuMmYgJSs0LjJmICUrNC4yZiIsIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSk7CisgIEdTVF9JTkZPICgicmVhbCAlKzQuMmYgJSs0LjJmICUrNC4yZiAlKzQuMmYiLCByZXNbMF0sIHJlc1sxXSwgcmVzWzJdLCByZXNbM10pOworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIGZhaWxfdW5sZXNzIChyZXNbaV0gPT0gb3V0W2ldLCAiZGlmZmVyZW5jZSBhdCBwb3M9JWQiLCBpKTsKKworICBjbGVhbnVwX3Bhbm9yYW1hIChwYW5vcmFtYSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitzdGF0aWMgU3VpdGUgKgorcGFub3JhbWFfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgicGFub3JhbWEiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcmVmX2NvdW50cyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF93cm9uZ19jYXBzKTsKKyAgLyogcHJvY2Vzc2luZyBmb3IgbWV0aG9kPXBzeSAqLworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfczE2X21vbm9fbWlkZGxlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3MxNl9tb25vX2xlZnQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfczE2X21vbm9fcmlnaHQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfczE2X3N0ZXJlb19taWRkbGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfczE2X3N0ZXJlb19sZWZ0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3MxNl9zdGVyZW9fcmlnaHQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZjMyX21vbm9fbWlkZGxlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2YzMl9tb25vX2xlZnQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZjMyX21vbm9fcmlnaHQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZjMyX3N0ZXJlb19taWRkbGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZjMyX3N0ZXJlb19sZWZ0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2YzMl9zdGVyZW9fcmlnaHQpOworICAvKiBwcm9jZXNzaW5nIGZvciBtZXRob2Q9c2ltcGxlICovCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zMTZfbW9ub19taWRkbGVfc2ltcGxlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3MxNl9tb25vX2xlZnRfc2ltcGxlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3MxNl9tb25vX3JpZ2h0X3NpbXBsZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zMTZfc3RlcmVvX21pZGRsZV9zaW1wbGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfczE2X3N0ZXJlb19sZWZ0X3NpbXBsZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zMTZfc3RlcmVvX3JpZ2h0X3NpbXBsZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9mMzJfbW9ub19taWRkbGVfc2ltcGxlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2YzMl9tb25vX2xlZnRfc2ltcGxlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2YzMl9tb25vX3JpZ2h0X3NpbXBsZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9mMzJfc3RlcmVvX21pZGRsZV9zaW1wbGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZjMyX3N0ZXJlb19sZWZ0X3NpbXBsZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9mMzJfc3RlcmVvX3JpZ2h0X3NpbXBsZSk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChwYW5vcmFtYSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jYmFuZC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW93c2luY2JhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjM1YWJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW93c2luY2JhbmQuYwpAQCAtMCwwICsxLDExMzcgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogYXVkaW93c2luY2JhbmQuYzogVW5pdCB0ZXN0IGZvciB0aGUgYXVkaW93c2luY2JhbmQgZWxlbWVudAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisjaW5jbHVkZSA8bWF0aC5oPgorCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCisjZGVmaW5lIEFVRElPX1dTSU5DX0JBTkRfQ0FQU19TVFJJTkdfMzIgICAgICAgICAgXAorICAgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKEYzMikgIiwgIiBcCisgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiICAgICAgICAgICAgXAorICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmF0ZSA9IChpbnQpIDQ0MTAwIgorCisjZGVmaW5lIEFVRElPX1dTSU5DX0JBTkRfQ0FQU19TVFJJTkdfNjQgICAgICAgICAgXAorICAgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKEY2NCkgIiwgIiBcCisgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiICAgICAgICAgICAgXAorICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmF0ZSA9IChpbnQpIDQ0MTAwIgorCisjZGVmaW5lIEZPUk1BVFMgInsgIkdTVF9BVURJT19ORSAoRjMyKSIsIkdTVF9BVURJT19ORSAoRjY0KSIgfSIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEZPUk1BVFMgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAicmF0ZSA9IChpbnQpIDQ0MTAwIikKKyAgICApOworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEZPUk1BVFMgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAicmF0ZSA9IChpbnQpIDQ0MTAwIikKKyAgICApOworCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9hdWRpb3dzaW5jYmFuZCAodm9pZCkKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW93c2luY2JhbmQ7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfYXVkaW93c2luY2JhbmQiKTsKKyAgYXVkaW93c2luY2JhbmQgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoImF1ZGlvd3NpbmNiYW5kIik7CisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKGF1ZGlvd3NpbmNiYW5kLCAmc3JjdGVtcGxhdGUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGF1ZGlvd3NpbmNiYW5kLCAmc2lua3RlbXBsYXRlKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICByZXR1cm4gYXVkaW93c2luY2JhbmQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX2F1ZGlvd3NpbmNiYW5kIChHc3RFbGVtZW50ICogYXVkaW93c2luY2JhbmQpCit7CisgIEdTVF9ERUJVRyAoImNsZWFudXBfYXVkaW93c2luY2JhbmQiKTsKKworICBnX2xpc3RfZm9yZWFjaCAoYnVmZmVycywgKEdGdW5jKSBnc3RfbWluaV9vYmplY3RfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKGF1ZGlvd3NpbmNiYW5kKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChhdWRpb3dzaW5jYmFuZCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChhdWRpb3dzaW5jYmFuZCk7Cit9CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHJhdGUvMiBpcyBlcmFzZWQgd2l0aCBiYW5kcGFzcyBtb2RlIGFuZCBhIAorICogMjAwMEh6IGZyZXF1ZW5jeSBiYW5kIGFyb3VuZCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0XzMyX2JwXzBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW93c2luY2JhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR0xpc3QgKm5vZGU7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBhdWRpb3dzaW5jYmFuZCA9IHNldHVwX2F1ZGlvd3NpbmNiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsZW5ndGgiLCAzMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2JhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIGluW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19XU0lOQ19CQU5EX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvd3NpbmNiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPj0gMSk7CisKKyAgZm9yIChub2RlID0gYnVmZmVyczsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICBnaW50IGJ1ZmZlcl9sZW5ndGg7CisKKyAgICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhKSA9PSBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgICBidWZmZXJfbGVuZ3RoID0gbWFwLnNpemUgLyBzaXplb2YgKGdmbG9hdCk7CisKKyAgICBybXMgPSAwLjA7CisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9sZW5ndGg7IGkrKykKKyAgICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgICAgcm1zID0gc3FydCAocm1zIC8gYnVmZmVyX2xlbmd0aCk7CisgICAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjEpOworCisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKyAgfQorCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb3dzaW5jYmFuZCAoYXVkaW93c2luY2JhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHRoZSBiYW5kIGNlbnRlciBpcyBwcmVzZXJ2ZWQgd2l0aCBiYW5kcmVqZWN0IG1vZGUKKyAqIGFuZCBhIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF8zMl9icF8xMTAyNWh6KQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworICBHTGlzdCAqbm9kZTsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGF1ZGlvd3NpbmNiYW5kID0gc2V0dXBfYXVkaW93c2luY2JhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgImxlbmd0aCIsIDMxLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb3dzaW5jYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEwMjQgKiBzaXplb2YgKGdmbG9hdCkpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSA0KSB7CisgICAgaW5baV0gPSAwLjA7CisgICAgaW5baSArIDFdID0gMS4wOworICAgIGluW2kgKyAyXSA9IDAuMDsKKyAgICBpbltpICsgM10gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX1dTSU5DX0JBTkRfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW93c2luY2JhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIGVuc3VyZSBzZWdtZW50IChmb3JtYXQpIHByb3Blcmx5IHNldHVwICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA+PSAxKTsKKworICBmb3IgKG5vZGUgPSBidWZmZXJzOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgIGdpbnQgYnVmZmVyX2xlbmd0aDsKKworICAgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIG5vZGUtPmRhdGEpID09IE5VTEwpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICAgIGJ1ZmZlcl9sZW5ndGggPSBtYXAuc2l6ZSAvIHNpemVvZiAoZ2Zsb2F0KTsKKyAgICBybXMgPSAwLjA7CisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9sZW5ndGg7IGkrKykKKyAgICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgICAgcm1zID0gc3FydCAocm1zIC8gYnVmZmVyX2xlbmd0aCk7CisgICAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjQpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisgIH0KKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2JhbmQgKGF1ZGlvd3NpbmNiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHJhdGUvMiBpcyBlcmFzZWQgd2l0aCBiYW5kcmVqZWN0IG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfMzJfYnBfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW93c2luY2JhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR0xpc3QgKm5vZGU7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBhdWRpb3dzaW5jYmFuZCA9IHNldHVwX2F1ZGlvd3NpbmNiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsZW5ndGgiLCAzMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2JhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gMikgeworICAgIGluW2ldID0gMS4wOworICAgIGluW2kgKyAxXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fV1NJTkNfQkFORF9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb3dzaW5jYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID49IDEpOworCisgIGZvciAobm9kZSA9IGJ1ZmZlcnM7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisgICAgZ2ludCBidWZmZXJfbGVuZ3RoOworCisgICAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgbm9kZS0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHJlcyA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgICAgYnVmZmVyX2xlbmd0aCA9IG1hcC5zaXplIC8gc2l6ZW9mIChnZmxvYXQpOworICAgIHJtcyA9IDAuMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyX2xlbmd0aDsgaSsrKQorICAgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgICBybXMgPSBzcXJ0IChybXMgLyBidWZmZXJfbGVuZ3RoKTsKKyAgICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMyk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKyAgfQorCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb3dzaW5jYmFuZCAoYXVkaW93c2luY2JhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHJhdGUvMiBpcyBwcmVzZXJ2ZWQgd2l0aCBiYW5kcmVqZWN0IG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfMzJfYnJfMGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworICBHTGlzdCAqbm9kZTsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGF1ZGlvd3NpbmNiYW5kID0gc2V0dXBfYXVkaW93c2luY2JhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcmVqZWN0ICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibGVuZ3RoIiwgMzEsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvd3NpbmNiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAyNCAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgaW5baV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX1dTSU5DX0JBTkRfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW93c2luY2JhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIGVuc3VyZSBzZWdtZW50IChmb3JtYXQpIHByb3Blcmx5IHNldHVwICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA+PSAxKTsKKworICBmb3IgKG5vZGUgPSBidWZmZXJzOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgIGdpbnQgYnVmZmVyX2xlbmd0aDsKKworICAgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIG5vZGUtPmRhdGEpID09IE5VTEwpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICByZXMgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICAgIGJ1ZmZlcl9sZW5ndGggPSBtYXAuc2l6ZSAvIHNpemVvZiAoZ2Zsb2F0KTsKKyAgICBybXMgPSAwLjA7CisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9sZW5ndGg7IGkrKykKKyAgICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgICAgcm1zID0gc3FydCAocm1zIC8gYnVmZmVyX2xlbmd0aCk7CisgICAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisgIH0KKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2JhbmQgKGF1ZGlvd3NpbmNiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCB0aGUgYmFuZCBjZW50ZXIgaXMgZXJhc2VkIHdpdGggYmFuZHJlamVjdCBtb2RlCisgKiBhbmQgYSAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfMzJfYnJfMTEwMjVoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW93c2luY2JhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR0xpc3QgKm5vZGU7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBhdWRpb3dzaW5jYmFuZCA9IHNldHVwX2F1ZGlvd3NpbmNiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHJlamVjdCAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgImxlbmd0aCIsIDMxLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb3dzaW5jYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEwMjQgKiBzaXplb2YgKGdmbG9hdCkpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworCisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpICs9IDQpIHsKKyAgICBpbltpXSA9IDAuMDsKKyAgICBpbltpICsgMV0gPSAxLjA7CisgICAgaW5baSArIDJdID0gMC4wOworICAgIGluW2kgKyAzXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fV1NJTkNfQkFORF9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb3dzaW5jYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID49IDEpOworCisgIGZvciAobm9kZSA9IGJ1ZmZlcnM7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisgICAgZ2ludCBidWZmZXJfbGVuZ3RoOworCisgICAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgbm9kZS0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHJlcyA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgICAgYnVmZmVyX2xlbmd0aCA9IG1hcC5zaXplIC8gc2l6ZW9mIChnZmxvYXQpOworICAgIHJtcyA9IDAuMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyX2xlbmd0aDsgaSsrKQorICAgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgICBybXMgPSBzcXJ0IChybXMgLyBidWZmZXJfbGVuZ3RoKTsKKyAgICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMzUpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisgIH0KKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2JhbmQgKGF1ZGlvd3NpbmNiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHJhdGUvMiBpcyBwcmVzZXJ2ZWQgd2l0aCBiYW5kcmVqZWN0IG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfMzJfYnJfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW93c2luY2JhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR0xpc3QgKm5vZGU7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBhdWRpb3dzaW5jYmFuZCA9IHNldHVwX2F1ZGlvd3NpbmNiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHJlamVjdCAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgImxlbmd0aCIsIDMxLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb3dzaW5jYmFuZCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgImxvd2VyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCAtIDEwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJ1cHBlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgKyAxMDAwLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEwMjQgKiBzaXplb2YgKGdmbG9hdCkpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19XU0lOQ19CQU5EX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvd3NpbmNiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPj0gMSk7CisKKyAgZm9yIChub2RlID0gYnVmZmVyczsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICBnaW50IGJ1ZmZlcl9sZW5ndGg7CisKKyAgICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhKSA9PSBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgICBidWZmZXJfbGVuZ3RoID0gbWFwLnNpemUgLyBzaXplb2YgKGdmbG9hdCk7CisgICAgcm1zID0gMC4wOworICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJfbGVuZ3RoOyBpKyspCisgICAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICAgIHJtcyA9IHNxcnQgKHJtcyAvIGJ1ZmZlcl9sZW5ndGgpOworICAgIGZhaWxfdW5sZXNzIChybXMgPj0gMC45KTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworICB9CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvd3NpbmNiYW5kIChhdWRpb3dzaW5jYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBidWZmZXJzIHNtYWxsZXIgdGhhbiB0aGUga2VybmVsIHNpemUgYXJlIGhhbmRsZWQKKyAqIGNvcnJlY3RseSB3aXRob3V0IGFjY2Vzc2luZyB3cm9uZyBtZW1vcnkgYXJlYXMgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0XzMyX3NtYWxsX2J1ZmZlcikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW93c2luY2JhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW47CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBhdWRpb3dzaW5jYmFuZCA9IHNldHVwX2F1ZGlvd3NpbmNiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsZW5ndGgiLCAxMDEsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvd3NpbmNiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gNDQxMDAgLyAxNi4wLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgNDQxMDAgLyAxNi4wLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDIwICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDIwOyBpKyspCisgICAgaW5baV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX1dTSU5DX0JBTkRfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW93c2luY2JhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIGVuc3VyZSBzZWdtZW50IChmb3JtYXQpIHByb3Blcmx5IHNldHVwICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA+PSAxKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2JhbmQgKGF1ZGlvd3NpbmNiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisKKworCisKKworCisKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIGVyYXNlZCB3aXRoIGJhbmRwYXNzIG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfNjRfYnBfMGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR0xpc3QgKm5vZGU7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBhdWRpb3dzaW5jYmFuZCA9IHNldHVwX2F1ZGlvd3NpbmNiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsZW5ndGgiLCAzMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2JhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIGluW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19XU0lOQ19CQU5EX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvd3NpbmNiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPj0gMSk7CisKKyAgZm9yIChub2RlID0gYnVmZmVyczsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICBnaW50IGJ1ZmZlcl9sZW5ndGg7CisKKyAgICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhKSA9PSBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgICAgYnVmZmVyX2xlbmd0aCA9IG1hcC5zaXplIC8gc2l6ZW9mIChnZG91YmxlKTsKKyAgICBybXMgPSAwLjA7CisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9sZW5ndGg7IGkrKykKKyAgICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgICAgcm1zID0gc3FydCAocm1zIC8gYnVmZmVyX2xlbmd0aCk7CisgICAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjEpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisgIH0KKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2JhbmQgKGF1ZGlvd3NpbmNiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCB0aGUgYmFuZCBjZW50ZXIgaXMgcHJlc2VydmVkIHdpdGggYmFuZHJlamVjdCBtb2RlCisgKiBhbmQgYSAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfNjRfYnBfMTEwMjVoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW93c2luY2JhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdMaXN0ICpub2RlOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgYXVkaW93c2luY2JhbmQgPSBzZXR1cF9hdWRpb3dzaW5jYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibGVuZ3RoIiwgMzEsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvd3NpbmNiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAyNCAqIHNpemVvZiAoZ2RvdWJsZSkpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gNCkgeworICAgIGluW2ldID0gMC4wOworICAgIGluW2kgKyAxXSA9IDEuMDsKKyAgICBpbltpICsgMl0gPSAwLjA7CisgICAgaW5baSArIDNdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19XU0lOQ19CQU5EX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvd3NpbmNiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPj0gMSk7CisKKyAgZm9yIChub2RlID0gYnVmZmVyczsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICBnaW50IGJ1ZmZlcl9sZW5ndGg7CisKKyAgICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhKSA9PSBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgICAgYnVmZmVyX2xlbmd0aCA9IG1hcC5zaXplIC8gc2l6ZW9mIChnZG91YmxlKTsKKyAgICBybXMgPSAwLjA7CisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9sZW5ndGg7IGkrKykKKyAgICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgICAgcm1zID0gc3FydCAocm1zIC8gYnVmZmVyX2xlbmd0aCk7CisgICAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjQpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisgIH0KKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2JhbmQgKGF1ZGlvd3NpbmNiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHJhdGUvMiBpcyBlcmFzZWQgd2l0aCBiYW5kcmVqZWN0IG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfNjRfYnBfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW93c2luY2JhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdMaXN0ICpub2RlOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgYXVkaW93c2luY2JhbmQgPSBzZXR1cF9hdWRpb3dzaW5jYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgIm1vZGUiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibGVuZ3RoIiwgMzEsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvd3NpbmNiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAyNCAqIHNpemVvZiAoZ2RvdWJsZSkpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkgKz0gMikgeworICAgIGluW2ldID0gMS4wOworICAgIGluW2kgKyAxXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fV1NJTkNfQkFORF9DQVBTX1NUUklOR182NCk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb3dzaW5jYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID49IDEpOworCisgIGZvciAobm9kZSA9IGJ1ZmZlcnM7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisgICAgZ2ludCBidWZmZXJfbGVuZ3RoOworCisgICAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgbm9kZS0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworICAgIGJ1ZmZlcl9sZW5ndGggPSBtYXAuc2l6ZSAvIHNpemVvZiAoZ2RvdWJsZSk7CisgICAgcm1zID0gMC4wOworICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJfbGVuZ3RoOyBpKyspCisgICAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICAgIHJtcyA9IHNxcnQgKHJtcyAvIGJ1ZmZlcl9sZW5ndGgpOworICAgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4zKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworICB9CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvd3NpbmNiYW5kIChhdWRpb3dzaW5jYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIHByZXNlcnZlZCB3aXRoIGJhbmRyZWplY3QgbW9kZSBhbmQgYSAKKyAqIDIwMDBIeiBmcmVxdWVuY3kgYmFuZCBhcm91bmQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF82NF9icl8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvd3NpbmNiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworICBHTGlzdCAqbm9kZTsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGF1ZGlvd3NpbmNiYW5kID0gc2V0dXBfYXVkaW93c2luY2JhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcmVqZWN0ICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibGVuZ3RoIiwgMzEsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvd3NpbmNiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAyNCAqIHNpemVvZiAoZ2RvdWJsZSkpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fV1NJTkNfQkFORF9DQVBTX1NUUklOR182NCk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb3dzaW5jYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID49IDEpOworCisgIGZvciAobm9kZSA9IGJ1ZmZlcnM7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisgICAgZ2ludCBidWZmZXJfbGVuZ3RoOworCisgICAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgbm9kZS0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworICAgIGJ1ZmZlcl9sZW5ndGggPSBtYXAuc2l6ZSAvIHNpemVvZiAoZ2RvdWJsZSk7CisgICAgcm1zID0gMC4wOworICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJfbGVuZ3RoOyBpKyspCisgICAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICAgIHJtcyA9IHNxcnQgKHJtcyAvIGJ1ZmZlcl9sZW5ndGgpOworICAgIGZhaWxfdW5sZXNzIChybXMgPj0gMC45KTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworICB9CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvd3NpbmNiYW5kIChhdWRpb3dzaW5jYmFuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgdGhlIGJhbmQgY2VudGVyIGlzIGVyYXNlZCB3aXRoIGJhbmRyZWplY3QgbW9kZQorICogYW5kIGEgMjAwMEh6IGZyZXF1ZW5jeSBiYW5kIGFyb3VuZCByYXRlLzQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0XzY0X2JyXzExMDI1aHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvd3NpbmNiYW5kOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworICBHTGlzdCAqbm9kZTsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGF1ZGlvd3NpbmNiYW5kID0gc2V0dXBfYXVkaW93c2luY2JhbmQgKCk7CisgIC8qIFNldCB0byBiYW5kcmVqZWN0ICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibGVuZ3RoIiwgMzEsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvd3NpbmNiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gMTAwMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNiYW5kKSwgInVwcGVyLWZyZXF1ZW5jeSIsCisgICAgICA0NDEwMCAvIDQuMCArIDEwMDAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAyNCAqIHNpemVvZiAoZ2RvdWJsZSkpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSA0KSB7CisgICAgaW5baV0gPSAwLjA7CisgICAgaW5baSArIDFdID0gMS4wOworICAgIGluW2kgKyAyXSA9IDAuMDsKKyAgICBpbltpICsgM10gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX1dTSU5DX0JBTkRfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW93c2luY2JhbmQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIGVuc3VyZSBzZWdtZW50IChmb3JtYXQpIHByb3Blcmx5IHNldHVwICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA+PSAxKTsKKworICBmb3IgKG5vZGUgPSBidWZmZXJzOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgIGdpbnQgYnVmZmVyX2xlbmd0aDsKKworICAgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIG5vZGUtPmRhdGEpID09IE5VTEwpOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgICBidWZmZXJfbGVuZ3RoID0gbWFwLnNpemUgLyBzaXplb2YgKGdkb3VibGUpOworICAgIHJtcyA9IDAuMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyX2xlbmd0aDsgaSsrKQorICAgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgICBybXMgPSBzcXJ0IChybXMgLyBidWZmZXJfbGVuZ3RoKTsKKyAgICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMzUpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisgIH0KKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2JhbmQgKGF1ZGlvd3NpbmNiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IHJhdGUvMiBpcyBwcmVzZXJ2ZWQgd2l0aCBiYW5kcmVqZWN0IG1vZGUgYW5kIGEgCisgKiAyMDAwSHogZnJlcXVlbmN5IGJhbmQgYXJvdW5kIHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfNjRfYnJfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW93c2luY2JhbmQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdMaXN0ICpub2RlOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgYXVkaW93c2luY2JhbmQgPSBzZXR1cF9hdWRpb3dzaW5jYmFuZCAoKTsKKyAgLyogU2V0IHRvIGJhbmRyZWplY3QgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibW9kZSIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsZW5ndGgiLCAzMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2JhbmQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsb3dlci1mcmVxdWVuY3kiLAorICAgICAgNDQxMDAgLyA0LjAgLSAxMDAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgMTAwMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19XU0lOQ19CQU5EX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvd3NpbmNiYW5kLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPj0gMSk7CisKKyAgZm9yIChub2RlID0gYnVmZmVyczsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICBnaW50IGJ1ZmZlcl9sZW5ndGg7CisKKyAgICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhKSA9PSBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgICAgYnVmZmVyX2xlbmd0aCA9IG1hcC5zaXplIC8gc2l6ZW9mIChnZG91YmxlKTsKKyAgICBybXMgPSAwLjA7CisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9sZW5ndGg7IGkrKykKKyAgICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgICAgcm1zID0gc3FydCAocm1zIC8gYnVmZmVyX2xlbmd0aCk7CisgICAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisgIH0KKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2JhbmQgKGF1ZGlvd3NpbmNiYW5kKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGJ1ZmZlcnMgc21hbGxlciB0aGFuIHRoZSBrZXJuZWwgc2l6ZSBhcmUgaGFuZGxlZAorICogY29ycmVjdGx5IHdpdGhvdXQgYWNjZXNzaW5nIHdyb25nIG1lbW9yeSBhcmVhcyAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfNjRfc21hbGxfYnVmZmVyKQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jYmFuZDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW47CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBhdWRpb3dzaW5jYmFuZCA9IHNldHVwX2F1ZGlvd3NpbmNiYW5kICgpOworICAvKiBTZXQgdG8gYmFuZHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jYmFuZCksICJsZW5ndGgiLCAxMDEsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvd3NpbmNiYW5kLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAibG93ZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wIC0gNDQxMDAgLyAxNi4wLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2JhbmQpLCAidXBwZXItZnJlcXVlbmN5IiwKKyAgICAgIDQ0MTAwIC8gNC4wICsgNDQxMDAgLyAxNi4wLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDIwICogc2l6ZW9mIChnZG91YmxlKSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fV1NJTkNfQkFORF9DQVBTX1NUUklOR182NCk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb3dzaW5jYmFuZCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID49IDEpOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb3dzaW5jYmFuZCAoYXVkaW93c2luY2JhbmQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCithdWRpb3dzaW5jYmFuZF9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJhdWRpb3dzaW5jYmFuZCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF8zMl9icF8waHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfMzJfYnBfMTEwMjVoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF8zMl9icF8yMjA1MGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzMyX2JyXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF8zMl9icl8xMTAyNWh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzMyX2JyXzIyMDUwaHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfMzJfc21hbGxfYnVmZmVyKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzY0X2JwXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF82NF9icF8xMTAyNWh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzY0X2JwXzIyMDUwaHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfNjRfYnJfMGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzY0X2JyXzExMDI1aHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfNjRfYnJfMjIwNTBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF82NF9zbWFsbF9idWZmZXIpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoYXVkaW93c2luY2JhbmQpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW93c2luY2xpbWl0LmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hdWRpb3dzaW5jbGltaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjYzY2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXVkaW93c2luY2xpbWl0LmMKQEAgLTAsMCArMSw3ODggQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogYXVkaW93c2luY2xpbWl0LmM6IFVuaXQgdGVzdCBmb3IgdGhlIGF1ZGlvd3NpbmNsaW1pdCBlbGVtZW50CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXRyYW5zZm9ybS5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisjaW5jbHVkZSA8bWF0aC5oPgorCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCisjZGVmaW5lIEFVRElPX1dTSU5DX0xJTUlUX0NBUFNfU1RSSU5HXzMyICAgICAgICAgICBcCisgICAgImF1ZGlvL3gtcmF3LCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChGMzIpICIsICIgICBcCisgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiICAgICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJhdGUgPSAoaW50KSA0NDEwMCIKKworI2RlZmluZSBBVURJT19XU0lOQ19MSU1JVF9DQVBTX1NUUklOR182NCAgICAgICAgICAgXAorICAgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoRjY0KSAiLCAiICAgXAorICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgICAgICAgICAgICAgXAorICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyYXRlID0gKGludCkgNDQxMDAiCisKKyNkZWZpbmUgRk9STUFUUyAieyAiR1NUX0FVRElPX05FIChGMzIpIiwiR1NUX0FVRElPX05FIChGNjQpIiB9IgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgRk9STUFUUyAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICJyYXRlID0gKGludCkgNDQxMDAiKQorICAgICk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgRk9STUFUUyAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICJyYXRlID0gKGludCkgNDQxMDAiKQorICAgICk7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX2F1ZGlvd3NpbmNsaW1pdCAodm9pZCkKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW93c2luY2xpbWl0OworCisgIEdTVF9ERUJVRyAoInNldHVwX2F1ZGlvd3NpbmNsaW1pdCIpOworICBhdWRpb3dzaW5jbGltaXQgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoImF1ZGlvd3NpbmNsaW1pdCIpOworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChhdWRpb3dzaW5jbGltaXQsICZzcmN0ZW1wbGF0ZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoYXVkaW93c2luY2xpbWl0LCAmc2lua3RlbXBsYXRlKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICByZXR1cm4gYXVkaW93c2luY2xpbWl0OworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF9hdWRpb3dzaW5jbGltaXQgKEdzdEVsZW1lbnQgKiBhdWRpb3dzaW5jbGltaXQpCit7CisgIEdTVF9ERUJVRyAoImNsZWFudXBfYXVkaW93c2luY2xpbWl0Iik7CisKKyAgZ19saXN0X2ZvcmVhY2ggKGJ1ZmZlcnMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICBidWZmZXJzID0gTlVMTDsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkIChhdWRpb3dzaW5jbGltaXQpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKGF1ZGlvd3NpbmNsaW1pdCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChhdWRpb3dzaW5jbGltaXQpOworfQorCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCAwIGlzIHByZXNlcnZlZCB3aXRoIGxvd3Bhc3MgbW9kZSBhbmQgYSBjdXRvZmYKKyAqIGF0IHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfMzJfbHBfMGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jbGltaXQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW4sICpyZXMsIHJtczsKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgR0xpc3QgKm5vZGU7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBhdWRpb3dzaW5jbGltaXQgPSBzZXR1cF9hdWRpb3dzaW5jbGltaXQgKCk7CisgIC8qIFNldCB0byBsb3dwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJsZW5ndGgiLCAyMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2xpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgLyogY3V0b2ZmID0gc2FtcGxpbmcgcmF0ZSAvIDQsIGRhdGEgPSAwICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMjggKiBzaXplb2YgKGdmbG9hdCkpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgaW5baV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX1dTSU5DX0xJTUlUX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvd3NpbmNsaW1pdCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID49IDEpOworCisgIGZvciAobm9kZSA9IGJ1ZmZlcnM7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisgICAgZ2ludCBidWZmZXJfbGVuZ3RoOworCisgICAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgbm9kZS0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHJlcyA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgICAgYnVmZmVyX2xlbmd0aCA9IG1hcC5zaXplIC8gc2l6ZW9mIChnZmxvYXQpOworICAgIHJtcyA9IDAuMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyX2xlbmd0aDsgaSsrKQorICAgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgICBybXMgPSBzcXJ0IChybXMgLyBidWZmZXJfbGVuZ3RoKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworICAgIGZhaWxfdW5sZXNzIChybXMgPj0gMC45KTsKKyAgfQorCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb3dzaW5jbGltaXQgKGF1ZGlvd3NpbmNsaW1pdCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgcmF0ZS8yIGlzIGVyYXNlZCB3aXRoIGxvd3Bhc3MgbW9kZSBhbmQgYSBjdXRvZmYKKyAqIGF0IHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfMzJfbHBfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW93c2luY2xpbWl0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdMaXN0ICpub2RlOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgYXVkaW93c2luY2xpbWl0ID0gc2V0dXBfYXVkaW93c2luY2xpbWl0ICgpOworICAvKiBTZXQgdG8gbG93cGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jbGltaXQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jbGltaXQpLCAibGVuZ3RoIiwgMjEsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvd3NpbmNsaW1pdCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMjggKiBzaXplb2YgKGdmbG9hdCkpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpICs9IDIpIHsKKyAgICBpbltpXSA9IDEuMDsKKyAgICBpbltpICsgMV0gPSAtMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX1dTSU5DX0xJTUlUX0NBUFNfU1RSSU5HXzMyKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvd3NpbmNsaW1pdCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID49IDEpOworCisgIGZvciAobm9kZSA9IGJ1ZmZlcnM7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisgICAgZ2ludCBidWZmZXJfbGVuZ3RoOworCisgICAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgbm9kZS0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHJlcyA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgICAgYnVmZmVyX2xlbmd0aCA9IG1hcC5zaXplIC8gc2l6ZW9mIChnZmxvYXQpOworICAgIHJtcyA9IDAuMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVyX2xlbmd0aDsgaSsrKQorICAgICAgcm1zICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgICBybXMgPSBzcXJ0IChybXMgLyBidWZmZXJfbGVuZ3RoKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChvdXRidWZmZXIsICZtYXApOworICAgIGZhaWxfdW5sZXNzIChybXMgPD0gMC4xKTsKKyAgfQorCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9hdWRpb3dzaW5jbGltaXQgKGF1ZGlvd3NpbmNsaW1pdCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGVzdCBpZiBkYXRhIGNvbnRhaW5pbmcgb25seSBvbmUgZnJlcXVlbmN5IGNvbXBvbmVudAorICogYXQgMCBpcyBlcmFzZWQgd2l0aCBoaWdocGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF8zMl9ocF8waHopCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvd3NpbmNsaW1pdDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworICBHTGlzdCAqbm9kZTsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGF1ZGlvd3NpbmNsaW1pdCA9IHNldHVwX2F1ZGlvd3NpbmNsaW1pdCAoKTsKKyAgLyogU2V0IHRvIGhpZ2hwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJsZW5ndGgiLCAyMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2xpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgImN1dG9mZiIsIDQ0MTAwIC8gNC4wLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEyOCAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBpbltpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fV1NJTkNfTElNSVRfQ0FQU19TVFJJTkdfMzIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW93c2luY2xpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPj0gMSk7CisKKyAgZm9yIChub2RlID0gYnVmZmVyczsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICBnaW50IGJ1ZmZlcl9sZW5ndGg7CisKKyAgICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhKSA9PSBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgICBidWZmZXJfbGVuZ3RoID0gbWFwLnNpemUgLyBzaXplb2YgKGdmbG9hdCk7CisgICAgcm1zID0gMC4wOworICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJfbGVuZ3RoOyBpKyspCisgICAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICAgIHJtcyA9IHNxcnQgKHJtcyAvIGJ1ZmZlcl9sZW5ndGgpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisgICAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjEpOworICB9CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvd3NpbmNsaW1pdCAoYXVkaW93c2luY2xpbWl0KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCByYXRlLzIgaXMgcHJlc2VydmVkIHdpdGggaGlnaHBhc3MgbW9kZSBhbmQgYSBjdXRvZmYKKyAqIGF0IHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfMzJfaHBfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW93c2luY2xpbWl0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZmxvYXQgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdMaXN0ICpub2RlOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgYXVkaW93c2luY2xpbWl0ID0gc2V0dXBfYXVkaW93c2luY2xpbWl0ICgpOworICAvKiBTZXQgdG8gaGlnaHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgImxlbmd0aCIsIDIxLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb3dzaW5jbGltaXQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jbGltaXQpLCAiY3V0b2ZmIiwgNDQxMDAgLyA0LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTI4ICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19XU0lOQ19MSU1JVF9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb3dzaW5jbGltaXQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIGVuc3VyZSBzZWdtZW50IChmb3JtYXQpIHByb3Blcmx5IHNldHVwICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA+PSAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZm9yIChub2RlID0gYnVmZmVyczsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICBnaW50IGJ1ZmZlcl9sZW5ndGg7CisKKyAgICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhKSA9PSBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgcmVzID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgICBidWZmZXJfbGVuZ3RoID0gbWFwLnNpemUgLyBzaXplb2YgKGdmbG9hdCk7CisgICAgcm1zID0gMC4wOworICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJfbGVuZ3RoOyBpKyspCisgICAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICAgIHJtcyA9IHNxcnQgKHJtcyAvIGJ1ZmZlcl9sZW5ndGgpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisgICAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworICB9CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvd3NpbmNsaW1pdCAoYXVkaW93c2luY2xpbWl0KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGJ1ZmZlcnMgc21hbGxlciB0aGFuIHRoZSBrZXJuZWwgc2l6ZSBhcmUgaGFuZGxlZAorICogY29ycmVjdGx5IHdpdGhvdXQgYWNjZXNzaW5nIHdyb25nIG1lbW9yeSBhcmVhcyAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfMzJfc21hbGxfYnVmZmVyKQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jbGltaXQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdmbG9hdCAqaW47CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBhdWRpb3dzaW5jbGltaXQgPSBzZXR1cF9hdWRpb3dzaW5jbGltaXQgKCk7CisgIC8qIFNldCB0byBsb3dwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJsZW5ndGgiLCAxMDEsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvd3NpbmNsaW1pdCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgyMCAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKQorICAgIGluW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19XU0lOQ19MSU1JVF9DQVBTX1NUUklOR18zMik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb3dzaW5jbGltaXQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIGVuc3VyZSBzZWdtZW50IChmb3JtYXQpIHByb3Blcmx5IHNldHVwICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA+PSAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvd3NpbmNsaW1pdCAoYXVkaW93c2luY2xpbWl0KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCAwIGlzIHByZXNlcnZlZCB3aXRoIGxvd3Bhc3MgbW9kZSBhbmQgYSBjdXRvZmYKKyAqIGF0IHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfNjRfbHBfMGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jbGltaXQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdMaXN0ICpub2RlOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgYXVkaW93c2luY2xpbWl0ID0gc2V0dXBfYXVkaW93c2luY2xpbWl0ICgpOworICAvKiBTZXQgdG8gbG93cGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jbGltaXQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jbGltaXQpLCAibGVuZ3RoIiwgMjEsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvd3NpbmNsaW1pdCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIC8qIGN1dG9mZiA9IHNhbXBsaW5nIHJhdGUgLyA0LCBkYXRhID0gMCAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jbGltaXQpLCAiY3V0b2ZmIiwgNDQxMDAgLyA0LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTI4ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgaW5baV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX1dTSU5DX0xJTUlUX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvd3NpbmNsaW1pdCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID49IDEpOworCisgIGZvciAobm9kZSA9IGJ1ZmZlcnM7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisgICAgZ2ludCBidWZmZXJfbGVuZ3RoOworCisgICAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgbm9kZS0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworICAgIGJ1ZmZlcl9sZW5ndGggPSBtYXAuc2l6ZSAvIHNpemVvZiAoZ2RvdWJsZSk7CisgICAgcm1zID0gMC4wOworICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJfbGVuZ3RoOyBpKyspCisgICAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICAgIHJtcyA9IHNxcnQgKHJtcyAvIGJ1ZmZlcl9sZW5ndGgpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisgICAgZmFpbF91bmxlc3MgKHJtcyA+PSAwLjkpOworICB9CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvd3NpbmNsaW1pdCAoYXVkaW93c2luY2xpbWl0KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCByYXRlLzIgaXMgZXJhc2VkIHdpdGggbG93cGFzcyBtb2RlIGFuZCBhIGN1dG9mZgorICogYXQgcmF0ZS80ICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF82NF9scF8yMjA1MGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jbGltaXQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdMaXN0ICpub2RlOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgYXVkaW93c2luY2xpbWl0ID0gc2V0dXBfYXVkaW93c2luY2xpbWl0ICgpOworICAvKiBTZXQgdG8gbG93cGFzcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jbGltaXQpLCAibW9kZSIsIDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jbGltaXQpLCAibGVuZ3RoIiwgMjEsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvd3NpbmNsaW1pdCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMjggKiBzaXplb2YgKGdkb3VibGUpKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkgKz0gMikgeworICAgIGluW2ldID0gMS4wOworICAgIGluW2kgKyAxXSA9IC0xLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fV1NJTkNfTElNSVRfQ0FQU19TVFJJTkdfNjQpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgYXVkaW93c2luY2xpbWl0LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPj0gMSk7CisKKyAgZm9yIChub2RlID0gYnVmZmVyczsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICBnaW50IGJ1ZmZlcl9sZW5ndGg7CisKKyAgICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhKSA9PSBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgICAgYnVmZmVyX2xlbmd0aCA9IG1hcC5zaXplIC8gc2l6ZW9mIChnZG91YmxlKTsKKyAgICBybXMgPSAwLjA7CisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9sZW5ndGg7IGkrKykKKyAgICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgICAgcm1zID0gc3FydCAocm1zIC8gYnVmZmVyX2xlbmd0aCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKyAgICBmYWlsX3VubGVzcyAocm1zIDw9IDAuMSk7CisgIH0KKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2xpbWl0IChhdWRpb3dzaW5jbGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgZGF0YSBjb250YWluaW5nIG9ubHkgb25lIGZyZXF1ZW5jeSBjb21wb25lbnQKKyAqIGF0IDAgaXMgZXJhc2VkIHdpdGggaGlnaHBhc3MgbW9kZSBhbmQgYSBjdXRvZmYKKyAqIGF0IHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfNjRfaHBfMGh6KQoreworICBHc3RFbGVtZW50ICphdWRpb3dzaW5jbGltaXQ7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGdkb3VibGUgKmluLCAqcmVzLCBybXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdMaXN0ICpub2RlOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgYXVkaW93c2luY2xpbWl0ID0gc2V0dXBfYXVkaW93c2luY2xpbWl0ICgpOworICAvKiBTZXQgdG8gaGlnaHBhc3MgKi8KKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgImxlbmd0aCIsIDIxLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdWRpb3dzaW5jbGltaXQsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3dzaW5jbGltaXQpLCAiY3V0b2ZmIiwgNDQxMDAgLyA0LjAsIE5VTEwpOworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTI4ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgaW5baV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX1dTSU5DX0xJTUlUX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvd3NpbmNsaW1pdCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID49IDEpOworCisgIGZvciAobm9kZSA9IGJ1ZmZlcnM7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisgICAgZ2ludCBidWZmZXJfbGVuZ3RoOworCisgICAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgbm9kZS0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworICAgIGJ1ZmZlcl9sZW5ndGggPSBtYXAuc2l6ZSAvIHNpemVvZiAoZ2RvdWJsZSk7CisgICAgcm1zID0gMC4wOworICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJfbGVuZ3RoOyBpKyspCisgICAgICBybXMgKz0gcmVzW2ldICogcmVzW2ldOworICAgIHJtcyA9IHNxcnQgKHJtcyAvIGJ1ZmZlcl9sZW5ndGgpOworICAgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisgICAgZmFpbF91bmxlc3MgKHJtcyA8PSAwLjEpOworICB9CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2F1ZGlvd3NpbmNsaW1pdCAoYXVkaW93c2luY2xpbWl0KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0IGlmIGRhdGEgY29udGFpbmluZyBvbmx5IG9uZSBmcmVxdWVuY3kgY29tcG9uZW50CisgKiBhdCByYXRlLzIgaXMgcHJlc2VydmVkIHdpdGggaGlnaHBhc3MgbW9kZSBhbmQgYSBjdXRvZmYKKyAqIGF0IHJhdGUvNCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfNjRfaHBfMjIwNTBoeikKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW93c2luY2xpbWl0OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworICBHTGlzdCAqbm9kZTsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGF1ZGlvd3NpbmNsaW1pdCA9IHNldHVwX2F1ZGlvd3NpbmNsaW1pdCAoKTsKKyAgLyogU2V0IHRvIGhpZ2hwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJtb2RlIiwgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJsZW5ndGgiLCAyMSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXVkaW93c2luY2xpbWl0LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW93c2luY2xpbWl0KSwgImN1dG9mZiIsIDQ0MTAwIC8gNC4wLCBOVUxMKTsKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEyOCAqIHNpemVvZiAoZ2RvdWJsZSkpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSArPSAyKSB7CisgICAgaW5baV0gPSAxLjA7CisgICAgaW5baSArIDFdID0gLTEuMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19XU0lOQ19MSU1JVF9DQVBTX1NUUklOR182NCk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBhdWRpb3dzaW5jbGltaXQsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIGVuc3VyZSBzZWdtZW50IChmb3JtYXQpIHByb3Blcmx5IHNldHVwICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA+PSAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisKKyAgZm9yIChub2RlID0gYnVmZmVyczsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICBnaW50IGJ1ZmZlcl9sZW5ndGg7CisKKyAgICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhKSA9PSBOVUxMKTsKKworICAgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgICAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgICAgYnVmZmVyX2xlbmd0aCA9IG1hcC5zaXplIC8gc2l6ZW9mIChnZG91YmxlKTsKKyAgICBybXMgPSAwLjA7CisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9sZW5ndGg7IGkrKykKKyAgICAgIHJtcyArPSByZXNbaV0gKiByZXNbaV07CisgICAgcm1zID0gc3FydCAocm1zIC8gYnVmZmVyX2xlbmd0aCk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKyAgICBmYWlsX3VubGVzcyAocm1zID49IDAuOSk7CisgIH0KKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2xpbWl0IChhdWRpb3dzaW5jbGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFRlc3QgaWYgYnVmZmVycyBzbWFsbGVyIHRoYW4gdGhlIGtlcm5lbCBzaXplIGFyZSBoYW5kbGVkCisgKiBjb3JyZWN0bHkgd2l0aG91dCBhY2Nlc3Npbmcgd3JvbmcgbWVtb3J5IGFyZWFzICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF82NF9zbWFsbF9idWZmZXIpCit7CisgIEdzdEVsZW1lbnQgKmF1ZGlvd3NpbmNsaW1pdDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW47CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBhdWRpb3dzaW5jbGltaXQgPSBzZXR1cF9hdWRpb3dzaW5jbGltaXQgKCk7CisgIC8qIFNldCB0byBsb3dwYXNzICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJtb2RlIiwgMCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJsZW5ndGgiLCAxMDEsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF1ZGlvd3NpbmNsaW1pdCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGF1ZGlvd3NpbmNsaW1pdCksICJjdXRvZmYiLCA0NDEwMCAvIDQuMCwgTlVMTCk7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgyMCAqIHNpemVvZiAoZ2RvdWJsZSkpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW4gPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDIwOyBpKyspCisgICAgaW5baV0gPSAxLjA7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX1dTSU5DX0xJTUlUX0NBUFNfU1RSSU5HXzY0KTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF1ZGlvd3NpbmNsaW1pdCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID49IDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfYXVkaW93c2luY2xpbWl0IChhdWRpb3dzaW5jbGltaXQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCithdWRpb3dzaW5jbGltaXRfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiYXVkaW93c2luY2xpbWl0Iik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzMyX2xwXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF8zMl9scF8yMjA1MGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzMyX2hwXzBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF8zMl9ocF8yMjA1MGh6KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzMyX3NtYWxsX2J1ZmZlcik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF82NF9scF8waHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfNjRfbHBfMjIwNTBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF82NF9ocF8waHopOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfNjRfaHBfMjIwNTBoeik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF82NF9zbWFsbF9idWZmZXIpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoYXVkaW93c2luY2xpbWl0KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1dG9kZXRlY3QuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F1dG9kZXRlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTBmMWM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXV0b2RldGVjdC5jCkBAIC0wLDAgKzEsMjI2IEBACisvKiBHU3RyZWFtZXIgdW5pdCB0ZXN0IGZvciB0aGUgYXV0b2RldGVjdCBlbGVtZW50cworICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2VzaW5rLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKKy8qIGR1bW15IHNpbmsgZWxlbWVudHMgKi8KKworI2RlZmluZSBHU1RfVFlQRV9GQUtFX0FVRElPX1NJTksgKGdzdF9mYWtlX2F1ZGlvX3NpbmtfZ2V0X3R5cGUgKCkpCit0eXBlZGVmIEdzdEJhc2VTaW5rIEdzdEZha2VBdWRpb1Npbms7Cit0eXBlZGVmIEdzdEJhc2VTaW5rQ2xhc3MgR3N0RmFrZUF1ZGlvU2lua0NsYXNzOworR1R5cGUgZ3N0X2Zha2VfYXVkaW9fc2lua19nZXRfdHlwZSAodm9pZCk7CitHX0RFRklORV9UWVBFIChHc3RGYWtlQXVkaW9TaW5rLCBnc3RfZmFrZV9hdWRpb19zaW5rLCBHU1RfVFlQRV9CQVNFX1NJTkspOworCitzdGF0aWMgdm9pZAorZ3N0X2Zha2VfYXVkaW9fc2lua19jbGFzc19pbml0IChHc3RGYWtlQXVkaW9TaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHBhZF90ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgICBHU1RfUEFEX1NJTkssIEdTVF9QQURfQUxXQVlTLAorICAgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfQVVESU9fQ0FQU19NQUtFIChHU1RfQVVESU9fRk9STUFUU19BTEwpICI7ICIpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiRmFrZSBBdWRpbyBTaW5rIiwKKyAgICAgICJTaW5rL0F1ZGlvIiwgIkF1ZGlvIHNpbmsgZmFrZSBmb3IgdGVzdGluZyIsICJTdGVmYW4gU2F1ZXIiKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZwYWRfdGVtcGxhdGUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2Zha2VfYXVkaW9fc2lua19pbml0IChHc3RGYWtlQXVkaW9TaW5rICogc2luaykKK3sKK30KKworI2RlZmluZSBHU1RfVFlQRV9GQUtFX1ZJREVPX1NJTksgKGdzdF9mYWtlX3ZpZGVvX3NpbmtfZ2V0X3R5cGUgKCkpCit0eXBlZGVmIEdzdEJhc2VTaW5rIEdzdEZha2VWaWRlb1Npbms7Cit0eXBlZGVmIEdzdEJhc2VTaW5rQ2xhc3MgR3N0RmFrZVZpZGVvU2lua0NsYXNzOworR1R5cGUgZ3N0X2Zha2VfdmlkZW9fc2lua19nZXRfdHlwZSAodm9pZCk7CitHX0RFRklORV9UWVBFIChHc3RGYWtlVmlkZW9TaW5rLCBnc3RfZmFrZV92aWRlb19zaW5rLCBHU1RfVFlQRV9CQVNFX1NJTkspOworCitzdGF0aWMgdm9pZAorZ3N0X2Zha2VfdmlkZW9fc2lua19jbGFzc19pbml0IChHc3RGYWtlVmlkZW9TaW5rQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICpnc3RlbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKyAgc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHBhZF90ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgICBHU1RfUEFEX1NJTkssIEdTVF9QQURfQUxXQVlTLAorICAgICAgR1NUX1NUQVRJQ19DQVBTIChHU1RfVklERU9fQ0FQU19NQUtFIChHU1RfVklERU9fRk9STUFUU19BTEwpICI7ICIpKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19zZXRfc3RhdGljX21ldGFkYXRhIChnc3RlbGVtZW50X2NsYXNzLCAiRmFrZSBWaWRlbyBTaW5rIiwKKyAgICAgICJTaW5rL1ZpZGVvIiwgIlZpZGVvIHNpbmsgZmFrZSBmb3IgdGVzdGluZyIsICJTdGVmYW4gU2F1ZXIiKTsKKyAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3N0YXRpY19wYWRfdGVtcGxhdGUgKGdzdGVsZW1lbnRfY2xhc3MsICZwYWRfdGVtcGxhdGUpOworfQorCitzdGF0aWMgdm9pZAorZ3N0X2Zha2VfdmlkZW9fc2lua19pbml0IChHc3RGYWtlVmlkZW9TaW5rICogc2luaykKK3sKK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICBpZiAoIWdzdF9lbGVtZW50X3JlZ2lzdGVyIChwbHVnaW4sICJmYWtlYXVkaW9zaW5rIiwgR19NQVhJTlQsCisgICAgICAgICAgR1NUX1RZUEVfRkFLRV9BVURJT19TSU5LKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgImZha2V2aWRlb3NpbmsiLCBHX01BWElOVCwKKyAgICAgICAgICBHU1RfVFlQRV9GQUtFX1ZJREVPX1NJTkspKQorICAgIHJldHVybiBGQUxTRTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIHRlc3RzICovCisKK3N0YXRpYyB2b2lkCit0ZXN0X3BsdWdzX2Jlc3QgKEdzdEVsZW1lbnQgKiBzaW5rLCBHVHlwZSBleHBlY3RlZCkKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmV0OworICBHTGlzdCAqY2hpbGQ7CisKKyAgc3RhdGVfcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzaW5rLCBHU1RfU1RBVEVfUkVBRFkpOworICBmYWlsX3VubGVzcyAoc3RhdGVfcmV0ID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywgTlVMTCk7CisKKyAgY2hpbGQgPSBHU1RfQklOX0NISUxEUkVOIChzaW5rKTsKKyAgZmFpbF91bmxlc3MgKGNoaWxkICE9IE5VTEwsICJubyBlbGVtZW50cyBwbHVnZ2VkIik7CisgIGNrX2Fzc2VydF9pbnRfZXEgKGdfbGlzdF9sZW5ndGggKGNoaWxkKSwgMSk7CisgIGZhaWxfdW5sZXNzIChHX09CSkVDVF9UWVBFIChjaGlsZCksIGV4cGVjdGVkKTsKKworICAvKiBjbGVhbiB1cCAqLworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNpbmssIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2luayk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2F1dG92aWRlb3NpbmtfcGx1Z3NfYmVzdCkKK3sKKyAgR3N0RWxlbWVudCAqc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1dG92aWRlb3NpbmsiLCBOVUxMKTsKKworICB0ZXN0X3BsdWdzX2Jlc3QgKHNpbmssIEdTVF9UWVBFX0ZBS0VfVklERU9fU0lOSyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYXV0b2F1ZGlvc2lua19wbHVnc19iZXN0KQoreworICBHc3RFbGVtZW50ICpzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXV0b2F1ZGlvc2luayIsIE5VTEwpOworCisgIHRlc3RfcGx1Z3NfYmVzdCAoc2luaywgR1NUX1RZUEVfRkFLRV9BVURJT19TSU5LKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgdm9pZAordGVzdF9naG9zdHBhZF9lcnJvcl9jYXNlIChHc3RDYXBzICogY2FwcywgR3N0RWxlbWVudCAqIHNpbmssCisgICAgY29uc3QgZ2NoYXIgKiBmYWtlX3NpbmtfbmFtZSkKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmV0OworICBHc3RFbGVtZW50ICpwaXBlbGluZSwgKnNyYywgKmZpbHRlciwgKmZha2VzaW5rOworCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzcmMiLCBOVUxMKTsKKyAgZmlsdGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiY2Fwc2ZpbHRlciIsIE5VTEwpOworCisgIGdfb2JqZWN0X3NldCAoZmlsdGVyLCAiY2FwcyIsIGNhcHMsIE5VTEwpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMsIGZpbHRlciwgc2luaywgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmsgKHNyYywgZmlsdGVyKSwgIkZhaWxlZCB0byBsaW5rIHNyYyB0byBmaWx0ZXIiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmsgKGZpbHRlciwgc2luayksCisgICAgICAiRmFpbGVkIHRvIGxpbmsgZmlsdGVyIHRvIHNpbmsiKTsKKworICAvKiB0aGlzIHNob3VsZCBmYWlsLCB0aGVyZSdzIG5vIHN1Y2ggZm9ybWF0ICovCisgIHN0YXRlX3JldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QQVVTRUQpOworICBpZiAoc3RhdGVfcmV0ID09IEdTVF9TVEFURV9DSEFOR0VfQVNZTkMpIHsKKyAgICAvKiBtYWtlIHN1cmUgd2Ugd2FpdCBmb3IgdGhlIGFjdHVhbCBzdWNjZXNzL2ZhaWx1cmUgdG8gaGFwcGVuICovCisgICAgR3N0U3RhdGUgc3RhdGU7CisgICAgc3RhdGVfcmV0ID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChwaXBlbGluZSwgJnN0YXRlLCAmc3RhdGUsIEdTVF9DTE9DS19USU1FX05PTkUpOworICB9CisgIGZha2VzaW5rID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAoc2luayksIGZha2Vfc2lua19uYW1lKTsKKyAgaWYgKGZha2VzaW5rICE9IE5VTEwpIHsKKyAgICAvKiBubyByZWFsIHNpbmsgYXZhaWxhYmxlICovCisgICAgZmFpbF91bmxlc3MgKHN0YXRlX3JldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAgICJwaXBlbGluZSBfc2V0X3N0YXRlKCkgdG8gUEFVU0VEIGZhaWxlZCIpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGZha2VzaW5rKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBhdXRvdmlkZW9zaW5rIGNvbnRhaW5zIGEgcmVhbCB2aWRlbyBzaW5rICovCisgICAgZmFpbF91bmxlc3MgKHN0YXRlX3JldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUsCisgICAgICAgICJwaXBlbGluZSBfc2V0X3N0YXRlKCkgdG8gUEFVU0VEIHN1Y2NlZWRlZCBidXQgc2hvdWxkIGhhdmUgZmFpbGVkIik7CisKKyAgICAvKiBzbywgd2UgaGl0IGFuIGVycm9yIGFuZCB0cnkgdG8gc2h1dCBkb3duIHRoZSBwaXBlbGluZTsgdGhpcyBzaG91bGRuJ3QKKyAgICAgKiBkZWFkbG9jayBvciBibG9jayBhbnl3aGVyZSB3aGVuIGF1dG92aWRlb3NpbmsgcmVzZXRzIHRoZSBnaG9zdHBhZAorICAgICAqIHRhcmdldHMgZXRjLiAqLworICB9CisgIHN0YXRlX3JldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZmFpbF91bmxlc3MgKHN0YXRlX3JldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiU3RhdGUgY2hhbmdlIG9uIHBpcGVsaW5lIGZhaWxlZCIpOworCisgIC8qIGNsZWFuIHVwICovCisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYXV0b3ZpZGVvc2lua19naG9zdHBhZF9lcnJvcl9jYXNlKQoreworICBHc3RFbGVtZW50ICpzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXV0b3ZpZGVvc2luayIsIE5VTEwpOworICBHc3RDYXBzICpjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcmF3IiwgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsCisgICAgICAiQUJDRCIsIE5VTEwpOworCisgIHRlc3RfZ2hvc3RwYWRfZXJyb3JfY2FzZSAoY2Fwcywgc2luaywgImZha2UtdmlkZW8tc2luayIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2F1dG9hdWRpb3NpbmtfZ2hvc3RwYWRfZXJyb3JfY2FzZSkKK3sKKyAgR3N0RWxlbWVudCAqc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1dG9hdWRpb3NpbmsiLCBOVUxMKTsKKyAgR3N0Q2FwcyAqY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLAorICAgICAgIkFCQ0QiLCBOVUxMKTsKKworICB0ZXN0X2dob3N0cGFkX2Vycm9yX2Nhc2UgKGNhcHMsIHNpbmssICJmYWtlLWF1ZGlvLXNpbmsiKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorYXV0b2RldGVjdF9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJhdXRvZGV0ZWN0Iik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBnc3RfcGx1Z2luX3JlZ2lzdGVyX3N0YXRpYyAoR1NUX1ZFUlNJT05fTUFKT1IsCisgICAgICBHU1RfVkVSU0lPTl9NSU5PUiwKKyAgICAgICJhdXRvZGV0ZWN0LXRlc3QiLAorICAgICAgImF1dG9kZXRlY3QgdGVzdCBlbGVtZW50cyIsCisgICAgICBwbHVnaW5faW5pdCwKKyAgICAgIFZFUlNJT04sICJMR1BMIiwgUEFDS0FHRSwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2F1dG92aWRlb3NpbmtfcGx1Z3NfYmVzdCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hdXRvYXVkaW9zaW5rX3BsdWdzX2Jlc3QpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYXV0b3ZpZGVvc2lua19naG9zdHBhZF9lcnJvcl9jYXNlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2F1dG9hdWRpb3NpbmtfZ2hvc3RwYWRfZXJyb3JfY2FzZSk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChhdXRvZGV0ZWN0KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvYXZpbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkMjdmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aW11eC5jCkBAIC0wLDAgKzEsMjY5IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIGF2aW11eAorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IE1hcmsgTmF1d2VsYWVydHMgPG1hbmF1d0Bza3luZXQuYmU+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKKy8qIEZvciBlYXNlIG9mIHByb2dyYW1taW5nIHdlIHVzZSBnbG9iYWxzIHRvIGtlZXAgcmVmcyBmb3Igb3VyIGZsb2F0aW5nCisgKiBzcmMgYW5kIHNpbmsgcGFkcyB3ZSBjcmVhdGU7IG90aGVyd2lzZSB3ZSBhbHdheXMgaGF2ZSB0byBkbyBnZXRfcGFkLAorICogZ2V0X3BlZXIsIGFuZCB0aGVuIHJlbW92ZSByZWZlcmVuY2VzIGluIGV2ZXJ5IHRlc3QgZnVuY3Rpb24gKi8KK3N0YXRpYyBHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCisjZGVmaW5lIEFVRElPX0NBUFNfU1RSSU5HICJhdWRpby94LWFjMywgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyYXRlID0gKGludCkgODAwMCIKKyNkZWZpbmUgVklERU9fQ0FQU19TVFJJTkcgInZpZGVvL21wZWcsIG1wZWd2ZXJzaW9uID0gKGludCkgNCwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic3lzdGVtc3RyZWFtID0gKGJvb2wpIGZhbHNlLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aCA9IChpbnQpIDM4NCwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0ID0gKGludCkgMjg4LCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIDI1LzEiCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LW1zdmlkZW8iKSk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdmlkZW90ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFZJREVPX0NBUFNfU1RSSU5HKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNhdWRpb3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoQVVESU9fQ0FQU19TVFJJTkcpKTsKKworCisvKiBzZXR1cCBhbmQgdGVhcmRvd24gbmVlZHMgc29tZSBzcGVjaWFsIGhhbmRsaW5nIGZvciBtdXhlciAqLworc3RhdGljIEdzdFBhZCAqCitzZXR1cF9zcmNfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0aWNQYWRUZW1wbGF0ZSAqIHRlbXBsYXRlLCBHc3RDYXBzICogY2FwcywgY29uc3QgZ2NoYXIgKiBzaW5rbmFtZSkKK3sKKyAgR3N0UGFkICpzcmNwYWQsICpzaW5rcGFkOworCisgIEdTVF9ERUJVR19PQkpFQ1QgKGVsZW1lbnQsICJzZXR0aW5nIHVwIHNlbmRpbmcgcGFkIik7CisgIC8qIHNlbmRpbmcgcGFkICovCisgIHNyY3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICh0ZW1wbGF0ZSwgInNyYyIpOworICBmYWlsX2lmIChzcmNwYWQgPT0gTlVMTCwgIkNvdWxkIG5vdCBjcmVhdGUgYSBzcmNwYWQiKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoc3JjcGFkLCAic3JjcGFkIiwgMSk7CisKKyAgaWYgKCEoc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChlbGVtZW50LCBzaW5rbmFtZSkpKQorICAgIHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKGVsZW1lbnQsIHNpbmtuYW1lKTsKKyAgZmFpbF9pZiAoc2lua3BhZCA9PSBOVUxMLCAiQ291bGQgbm90IGdldCBzaW5rIHBhZCBmcm9tICVzIiwKKyAgICAgIEdTVF9FTEVNRU5UX05BTUUgKGVsZW1lbnQpKTsKKyAgLyogcmVmZXJlbmNlcyBhcmUgb3duZWQgYnk6IDEpIHVzLCAyKSBhdmltdXgsIDMpIGNvbGxlY3QgcGFkcyAqLworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChzaW5rcGFkLCAic2lua3BhZCIsIDMpOworICBpZiAoY2FwcykKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9zZXRfY2FwcyAoc3JjcGFkLCBjYXBzKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHNyY3BhZCwgc2lua3BhZCkgPT0gR1NUX1BBRF9MSU5LX09LLAorICAgICAgIkNvdWxkIG5vdCBsaW5rIHNvdXJjZSBhbmQgJXMgc2luayBwYWRzIiwgR1NUX0VMRU1FTlRfTkFNRSAoZWxlbWVudCkpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsgICAvKiBiZWNhdXNlIHdlIGdvdCBpdCBoaWdoZXIgdXAgKi8KKworICAvKiByZWZlcmVuY2VzIGFyZSBvd25lZCBieTogMSkgYXZpbXV4LCAyKSBjb2xsZWN0IHBhZHMgKi8KKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoc2lua3BhZCwgInNpbmtwYWQiLCAyKTsKKworICByZXR1cm4gc3JjcGFkOworfQorCitzdGF0aWMgdm9pZAordGVhcmRvd25fc3JjX3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIGNvbnN0IGdjaGFyICogc2lua25hbWUpCit7CisgIEdzdFBhZCAqc3JjcGFkLCAqc2lua3BhZDsKKyAgZ2NoYXIgKnBhZG5hbWU7CisKKyAgLyogY2xlYW4gdXAgZmxvYXRpbmcgc3JjIHBhZCAqLworICBwYWRuYW1lID0gZ19zdHJkdXAgKHNpbmtuYW1lKTsKKyAgbWVtY3B5IChzdHJjaHIgKHBhZG5hbWUsICclJyksICIwIiwgMik7CisgIGlmICghKHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZWxlbWVudCwgcGFkbmFtZSkpKQorICAgIHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKGVsZW1lbnQsIHBhZG5hbWUpOworICBnX2ZyZWUgKHBhZG5hbWUpOworICAvKiBwYWQgcmVmcyBoZWxkIGJ5IDEpIGF2aW11eCAyKSBjb2xsZWN0cGFkcyBhbmQgMykgdXMgKHRocm91Z2ggX2dldCkgKi8KKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoc2lua3BhZCwgInNpbmtwYWQiLCAzKTsKKyAgc3JjcGFkID0gZ3N0X3BhZF9nZXRfcGVlciAoc2lua3BhZCk7CisKKyAgZ3N0X3BhZF91bmxpbmsgKHNyY3BhZCwgc2lua3BhZCk7CisKKyAgLyogYWZ0ZXIgdW5saW5raW5nLCBwYWQgcmVmcyBzdGlsbCBoZWxkIGJ5CisgICAqIDEpIGF2aW11eCBhbmQgMikgY29sbGVjdHBhZHMgYW5kIDMpIHVzICh0aHJvdWdoIF9nZXQpICovCisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHNpbmtwYWQsICJzaW5rcGFkIiwgMyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworICAvKiBvbmUgbW9yZSByZWYgaXMgaGVsZCBieSBlbGVtZW50IGl0c2VsZiAqLworCisgIC8qIHBhZCByZWZzIGhlbGQgYnkgYm90aCBjcmVhdG9yIGFuZCB0aGlzIGZ1bmN0aW9uICh0aHJvdWdoIF9nZXRfcGVlcikgKi8KKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoc3JjcGFkLCAic3JjcGFkIiwgMik7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfYXZpbXV4IChHc3RTdGF0aWNQYWRUZW1wbGF0ZSAqIHNyY3RlbXBsYXRlLCBjb25zdCBnY2hhciAqIHNpbmtuYW1lKQoreworICBHc3RFbGVtZW50ICphdmltdXg7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfYXZpbXV4Iik7CisgIGF2aW11eCA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgiYXZpbXV4Iik7CisgIG15c3JjcGFkID0gc2V0dXBfc3JjX3BhZCAoYXZpbXV4LCBzcmN0ZW1wbGF0ZSwgTlVMTCwgc2lua25hbWUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGF2aW11eCwgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgcmV0dXJuIGF2aW11eDsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfYXZpbXV4IChHc3RFbGVtZW50ICogYXZpbXV4LCBjb25zdCBnY2hhciAqIHNpbmtuYW1lKQoreworICBHU1RfREVCVUcgKCJjbGVhbnVwX2F2aW11eCIpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF2aW11eCwgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgdGVhcmRvd25fc3JjX3BhZCAoYXZpbXV4LCBzaW5rbmFtZSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoYXZpbXV4KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGF2aW11eCk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19hdmltdXhfcGFkIChHc3RTdGF0aWNQYWRUZW1wbGF0ZSAqIHNyY3RlbXBsYXRlLAorICAgIGNvbnN0IGdjaGFyICogc3JjX2NhcHNfc3RyaW5nLCBjb25zdCBnY2hhciAqIGNodW5rX2lkLAorICAgIGNvbnN0IGdjaGFyICogc2lua25hbWUpCit7CisgIEdzdEVsZW1lbnQgKmF2aW11eDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgaW50IG51bV9idWZmZXJzOworICBpbnQgaTsKKyAgZ3VpbnQ4IGRhdGEwWzRdID0gIlJJRkYiOworICBndWludDggZGF0YTFbOF0gPSAiQVZJIExJU1QiOworICBndWludDggZGF0YTJbOF0gPSAiaGRybGF2aWgiOworICBndWludDggZGF0YTNbNF0gPSAiTElTVCI7CisgIGd1aW50OCBkYXRhNFs4XSA9ICJzdHJsc3RyaCI7CisgIGd1aW50OCBkYXRhNVs0XSA9ICJzdHJmIjsKKyAgZ3VpbnQ4IGRhdGE2WzRdID0gIkxJU1QiOworICBndWludDggZGF0YTdbNF0gPSAibW92aSI7CisKKyAgYXZpbXV4ID0gc2V0dXBfYXZpbXV4IChzcmN0ZW1wbGF0ZSwgc2lua25hbWUpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdmltdXgsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMSk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoc3JjX2NhcHNfc3RyaW5nKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF2aW11eCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBudW1fYnVmZmVycyA9IGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpOworICAvKiBhdCBsZWFzdCBleHBlY3QgYXZpIGhlYWRlciwgY2h1bmsgaGVhZGVyLCBjaHVuayBhbmQgcGFkZGluZyAqLworICBmYWlsX3VubGVzcyAobnVtX2J1ZmZlcnMgPj0gNCk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9idWZmZXJzOyArK2kpIHsKKyAgICBvdXRidWZmZXIgPSBHU1RfQlVGRkVSIChidWZmZXJzLT5kYXRhKTsKKyAgICBmYWlsX2lmIChvdXRidWZmZXIgPT0gTlVMTCk7CisgICAgYnVmZmVycyA9IGdfbGlzdF9yZW1vdmUgKGJ1ZmZlcnMsIG91dGJ1ZmZlcik7CisKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgIGNhc2UgMDp7ICAgICAgICAgICAgICAgICAvKiBjaGVjayByaWZmIGhlYWRlciAqLworICAgICAgICAvKiBhdmkgaGVhZGVyICovCisgICAgICAgIEdzdE1hcEluZm8gbWFwOworICAgICAgICBnc2l6ZSBzaXplOworICAgICAgICBndWludDggKmRhdGE7CisKKyAgICAgICAgZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgICAgZGF0YSA9IG1hcC5kYXRhOworICAgICAgICBzaXplID0gbWFwLnNpemU7CisKKyAgICAgICAgZmFpbF91bmxlc3MgKG1lbWNtcCAoZGF0YSwgZGF0YTAsIHNpemVvZiAoZGF0YTApKSA9PSAwKTsKKyAgICAgICAgZmFpbF91bmxlc3MgKG1lbWNtcCAoZGF0YSArIDgsIGRhdGExLCBzaXplb2YgKGRhdGExKSkgPT0gMCk7CisgICAgICAgIGZhaWxfdW5sZXNzIChtZW1jbXAgKGRhdGEgKyAyMCwgZGF0YTIsIHNpemVvZiAoZGF0YTIpKSA9PSAwKTsKKyAgICAgICAgLyogdmlkZW8gb3IgYXVkaW8gaGVhZGVyICovCisgICAgICAgIGRhdGEgKz0gMzIgKyA1NjsKKyAgICAgICAgZmFpbF91bmxlc3MgKG1lbWNtcCAoZGF0YSwgZGF0YTMsIHNpemVvZiAoZGF0YTMpKSA9PSAwKTsKKyAgICAgICAgZmFpbF91bmxlc3MgKG1lbWNtcCAoZGF0YSArIDgsIGRhdGE0LCBzaXplb2YgKGRhdGE0KSkgPT0gMCk7CisgICAgICAgIGZhaWxfdW5sZXNzIChtZW1jbXAgKGRhdGEgKyA3NiwgZGF0YTUsIHNpemVvZiAoZGF0YTUpKSA9PSAwKTsKKyAgICAgICAgLyogYXZpIGRhdGEgaGVhZGVyICovCisgICAgICAgIGRhdGEgPSBtYXAuZGF0YTsKKyAgICAgICAgZGF0YSArPSBzaXplIC0gMTI7CisgICAgICAgIGZhaWxfdW5sZXNzIChtZW1jbXAgKGRhdGEsIGRhdGE2LCBzaXplb2YgKGRhdGE2KSkgPT0gMCk7CisgICAgICAgIGRhdGEgKz0gODsKKyAgICAgICAgZmFpbF91bmxlc3MgKG1lbWNtcCAoZGF0YSwgZGF0YTcsIHNpemVvZiAoZGF0YTcpKSA9PSAwKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgLyogY2h1bmsgaGVhZGVyICovCisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWZmZXIpID09IDgpOworICAgICAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgY2h1bmtfaWQsIDQpID09IDApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZmZlcikgPT0gMSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgIC8qIGJ1ZmZlciB3ZSBwdXQgaW4sIG11c3QgYmUgcGFkZGVkIHRvIGV2ZW4gc2l6ZSAqLworICAgICAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0YnVmZmVyKSA9PSAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChvdXRidWZmZXIsICJvdXRidWZmZXIiLCAxKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworICAgIG91dGJ1ZmZlciA9IE5VTEw7CisgIH0KKworICBjbGVhbnVwX2F2aW11eCAoYXZpbXV4LCBzaW5rbmFtZSk7CisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKyAgYnVmZmVycyA9IE5VTEw7Cit9CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdmlkZW9fcGFkKQoreworICBjaGVja19hdmltdXhfcGFkICgmc3JjdmlkZW90ZW1wbGF0ZSwgVklERU9fQ0FQU19TVFJJTkcsICIwMGRiIiwgInZpZGVvXyV1Iik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9hdWRpb19wYWQpCit7CisgIGNoZWNrX2F2aW11eF9wYWQgKCZzcmNhdWRpb3RlbXBsYXRlLCBBVURJT19DQVBTX1NUUklORywgIjAwd2IiLCAiYXVkaW9fJXUiKTsKK30KKworR1NUX0VORF9URVNUOworCisKK3N0YXRpYyBTdWl0ZSAqCithdmltdXhfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiYXZpbXV4Iik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3ZpZGVvX3BhZCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hdWRpb19wYWQpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoYXZpbXV4KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2F2aXN1YnRpdGxlLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hdmlzdWJ0aXRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMDBiMTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9hdmlzdWJ0aXRsZS5jCkBAIC0wLDAgKzEsMjYzIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIGF2aXN1YnRpdGxlCisgKgorICogQ29weXJpZ2h0IChDKSA8MjAwNz4gVGhpanMgVmVybWVpciA8dGhpanN2ZXJtZWlyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyogRWxlbWVudC1DaGVja2xpc3QtVmVyc2lvbjogNSAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKK0dzdFBhZCAqbXlzaW5rcGFkOworR3N0UGFkICpteXNyY3BhZDsKKworZ3VpbnQ4IGF2aXN1Yl91dGZfOF93aXRoX2JvbVtdID0geworICAweDQ3LCAweDQxLCAweDQyLCAweDMyLCAweDAwLCAweDAyLCAweDAwLCAweDEwLAorICAweDAwLCAweDAwLCAweDAwLCAweDQ1LCAweDAwLCAweDZlLCAweDAwLCAweDY3LAorICAweDAwLCAweDZjLCAweDAwLCAweDY5LCAweDAwLCAweDczLCAweDAwLCAweDY4LAorICAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDhlLCAweDAwLCAweDAwLAorICAweDAwLCAweGVmLCAweGJiLCAweGJmLCAweDMxLCAweDBkLCAweDBhLCAweDMwLAorICAweDMwLCAweDNhLCAweDMwLCAweDMwLCAweDNhLCAweDMwLCAweDMwLCAweDJjLAorICAweDMxLCAweDMwLCAweDMwLCAweDIwLCAweDJkLCAweDJkLCAweDNlLCAweDIwLAorICAweDMwLCAweDMwLCAweDNhLCAweDMwLCAweDMwLCAweDNhLCAweDMwLCAweDMyLAorICAweDJjLCAweDMwLCAweDMwLCAweDMwLCAweDBkLCAweDBhLCAweDNjLCAweDYyLAorICAweDNlLCAweDQxLCAweDZlLCAweDIwLCAweDU1LCAweDU0LCAweDQ2LCAweDM4LAorICAweDIwLCAweDUzLCAweDc1LCAweDYyLCAweDc0LCAweDY5LCAweDc0LCAweDZjLAorICAweDY1LCAweDIwLCAweDc3LCAweDY5LCAweDc0LCAweDY4LCAweDIwLCAweDQyLAorICAweDRmLCAweDRkLCAweDNjLCAweDJmLCAweDYyLCAweDNlLCAweDBkLCAweDBhLAorICAweDBkLCAweDBhLCAweDMyLCAweDBkLCAweDBhLCAweDMwLCAweDMwLCAweDNhLAorICAweDMwLCAweDMwLCAweDNhLCAweDMwLCAweDMyLCAweDJjLCAweDMxLCAweDMwLAorICAweDMwLCAweDIwLCAweDJkLCAweDJkLCAweDNlLCAweDIwLCAweDMwLCAweDMwLAorICAweDNhLCAweDMwLCAweDMwLCAweDNhLCAweDMwLCAweDM0LCAweDJjLCAweDMwLAorICAweDMwLCAweDMwLCAweDBkLCAweDBhLCAweDUzLCAweDZmLCAweDZkLCAweDY1LAorICAweDc0LCAweDY4LCAweDY5LCAweDZlLCAweDY3LCAweDIwLCAweDZlLCAweDZmLAorICAweDZlLCAweDQxLCAweDUzLCAweDQzLCAweDQ5LCAweDQ5LCAweDIwLCAweDJkLAorICAweDIwLCAweGMyLCAweGI1LCAweGMzLCAweGI2LCAweGMzLCAweGE0LCAweGMzLAorICAweGJjLCAweGMzLCAweDlmLCAweDBkLCAweDBhLCAweDBkLCAweDBhCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtc3VidGl0bGUiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmNfdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1zdWJ0aXRsZS1hdmkiKQorICAgICk7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX2F2aXN1YnRpdGxlICh2b2lkKQoreworICBHc3RFbGVtZW50ICphdmlzdWJ0aXRsZTsKKyAgR3N0Q2FwcyAqc3JjY2FwczsKKworICBHU1RfREVCVUcgKCJzZXR1cF9hdmlzdWJ0aXRsZSIpOworICBhdmlzdWJ0aXRsZSA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgiYXZpc3VidGl0bGUiKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChhdmlzdWJ0aXRsZSwgJnNpbmtfdGVtcGxhdGUpOworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChhdmlzdWJ0aXRsZSwgJnNyY190ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIHNyY2NhcHMgPSBnc3RfY2Fwc19uZXdfZW1wdHlfc2ltcGxlICgiYXBwbGljYXRpb24veC1zdWJ0aXRsZS1hdmkiKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGF2aXN1YnRpdGxlLCBzcmNjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoc3JjY2Fwcyk7CisgIHJldHVybiBhdmlzdWJ0aXRsZTsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfYXZpc3VidGl0bGUgKEdzdEVsZW1lbnQgKiBhdmlzdWJ0aXRsZSkKK3sKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKGF2aXN1YnRpdGxlKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKGF2aXN1YnRpdGxlKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGF2aXN1YnRpdGxlKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3dyb25nX2J1ZmZlciAoZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgbGVuZ3RoKQoreworICBHc3RCdWZmZXIgKmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBsZW5ndGgsIDApOworICBHc3RFbGVtZW50ICphdmlzdWJ0aXRsZSA9IHNldHVwX2F2aXN1YnRpdGxlICgpOworCisgIGdzdF9idWZmZXJfZmlsbCAoYnVmZmVyLCAwLCBkYXRhLCBsZW5ndGgpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChhdmlzdWJ0aXRsZSwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworICBnc3RfYnVmZmVyX3JlZiAoYnVmZmVyKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoYnVmZmVyLCAiaW5idWZmZXIiLCAyKTsKKyAgLyogcHVzaCB0aGUgYnJva2VuIGJ1ZmZlciAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgYnVmZmVyKSA9PSBHU1RfRkxPV19FUlJPUiwKKyAgICAgICJhY2NlcHRlZCBhIGJyb2tlbiBidWZmZXIiKTsKKyAgLyogY2hlY2sgaWYgd2UgaGF2ZSB1bnJlZmZlZCB0aGlzIGJ1ZmZlciBvbiBmYWlsdXJlICovCisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF2aXN1YnRpdGxlLAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsICJjb3VsZCBub3Qgc2V0IHRvIG51bGwiKTsKKyAgY2xlYW51cF9hdmlzdWJ0aXRsZSAoYXZpc3VidGl0bGUpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfY29ycmVjdF9idWZmZXIgKGd1aW50OCAqIHNyY19kYXRhLCBndWludCBzcmNfc2l6ZSwgZ3VpbnQ4ICogZHN0X2RhdGEsCisgICAgZ3VpbnQgZHN0X3NpemUpCit7CisgIEdzdEJ1ZmZlciAqYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIHNyY19zaXplLCAwKTsKKyAgR3N0QnVmZmVyICpuZXdCdWZmZXI7CisgIEdzdEVsZW1lbnQgKmF2aXN1YnRpdGxlID0gc2V0dXBfYXZpc3VidGl0bGUgKCk7CisgIEdzdEV2ZW50ICpldmVudDsKKworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPT0gMCwgIkJ1ZmZlcnMgbGlzdCBuZWVkcyB0byBiZSBlbXB0eSIpOworICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZmZlciwgMCwgc3JjX2RhdGEsIHNyY19zaXplKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYXZpc3VidGl0bGUsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKyAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZWsgKDEuMCwgR1NUX0ZPUk1BVF9USU1FLCBHU1RfU0VFS19GTEFHX0ZMVVNILAorICAgICAgR1NUX1NFRUtfVFlQRV9TRVQsIDIgKiBHU1RfU0VDT05ELCBHU1RfU0VFS19UWVBFX1NFVCwgNSAqIEdTVF9TRUNPTkQpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2VuZF9ldmVudCAoYXZpc3VidGl0bGUsIGV2ZW50KSA9PSBGQUxTRSwKKyAgICAgICJTZWVraW5nIGlzIG5vdCBwb3NzaWJsZSB3aGVuIHRoZXJlIGlzIG5vIGJ1ZmZlciB5ZXQiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0ssCisgICAgICAibm90IGFjY2VwdGVkIGEgY29ycmVjdCBidWZmZXIiKTsKKyAgLyogd2UgZ2F2ZSBhd2F5IG91ciByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciwgZG9uJ3QgYXNzdW1lIGFueXRoaW5nICovCisgIGJ1ZmZlciA9IE5VTEw7CisgIC8qIGEgbmV3IGJ1ZmZlciBpcyBjcmVhdGVkIGluIHRoZSBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA9PSAxLAorICAgICAgIk5vIG5ldyBidWZmZXIgaW4gdGhlIGJ1ZmZlcnMgbGlzdCIpOworICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VlayAoMS4wLCBHU1RfRk9STUFUX1RJTUUsIEdTVF9TRUVLX0ZMQUdfRkxVU0gsCisgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgMiAqIEdTVF9TRUNPTkQsIEdTVF9TRUVLX1RZUEVfU0VULCA1ICogR1NUX1NFQ09ORCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZW5kX2V2ZW50IChhdmlzdWJ0aXRsZSwgZXZlbnQpID09IFRSVUUsCisgICAgICAic2Vla2luZyBzaG91bGQgYmUgd29ya2luZyBub3ciKTsKKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID09IDIsCisgICAgICAiQWZ0ZXIgc2Vla2luZyB3ZSBuZWVkIGFub3RoZXIgYnVmZmVyIGluIHRoZSBidWZmZXJzIik7CisgIG5ld0J1ZmZlciA9IEdTVF9CVUZGRVIgKGJ1ZmZlcnMtPmRhdGEpOworICBidWZmZXJzID0gZ19saXN0X3JlbW92ZSAoYnVmZmVycywgbmV3QnVmZmVyKTsKKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID09IDEsICJCdWZmZXJzIGxpc3QgbmVlZHMgdG8gYmUgZW1wdHkiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZ2V0X3NpemUgKG5ld0J1ZmZlcikgPT0gZHN0X3NpemUsCisgICAgICAic2l6ZSBvZiB0aGUgbmV3IGJ1ZmZlciBpcyB3cm9uZyAoICVkICE9ICVkKSIsCisgICAgICBnc3RfYnVmZmVyX2dldF9zaXplIChuZXdCdWZmZXIpLCBkc3Rfc2l6ZSk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAobmV3QnVmZmVyLCAwLCBkc3RfZGF0YSwgZHN0X3NpemUpID09IDAsCisgICAgICAiZGF0YSBvZiB0aGUgYnVmZmVyIGlzIG5vdCBjb3JyZWN0Iik7CisgIGdzdF9idWZmZXJfdW5yZWYgKG5ld0J1ZmZlcik7CisgIC8qIGZyZWUgdGhlIGJ1ZmZlciBmcm9tIHNlZWtpbmcgKi8KKyAgZ3N0X2J1ZmZlcl91bnJlZiAoR1NUX0JVRkZFUiAoYnVmZmVycy0+ZGF0YSkpOworICBidWZmZXJzID0gZ19saXN0X3JlbW92ZSAoYnVmZmVycywgYnVmZmVycy0+ZGF0YSk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGF2aXN1YnRpdGxlLAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsICJjb3VsZCBub3Qgc2V0IHRvIG51bGwiKTsKKyAgY2xlYW51cF9hdmlzdWJ0aXRsZSAoYXZpc3VidGl0bGUpOworfQorCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2F2aXN1YnRpdGxlX25lZ2F0aXZlKQoreworICBndWludDggd3JvbmdfbWFnaWNbXSA9CisgICAgICB7IDB4NDcsIDB4NDEsIDB4NDEsIDB4MzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMAorICB9OworICBndWludDggd3JvbmdfZml4ZWRfd29yZF8yW10gPSB7CisgICAgMHg0NywgMHg0MSwgMHg0MiwgMHgzMiwgMHgwMCwgMHgwMiwgMHgwMSwgMHgxMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDQ1LCAweDAwLCAweDZlLCAweDAwLCAweDY3LAorICAgIDB4MDAsIDB4NmMsIDB4MDAsIDB4NjksIDB4MDAsIDB4NzMsIDB4MDAsIDB4NjgKKyAgfTsKKyAgZ3VpbnQ4IHdyb25nX2xlbmd0aF9hZnRlcl9uYW1lW10gPSB7CisgICAgMHg0NywgMHg0MSwgMHg0MiwgMHgzMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgxMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDQ1LCAweDAwLCAweDZlLCAweDAwLCAweDY3LAorICAgIDB4MDAsIDB4NmMsIDB4MDAsIDB4NjksIDB4MDAsIDB4NzMsIDB4MDAsIDB4NjgKKyAgfTsKKyAgZ3VpbnQ4IHdyb25nX2ZpeGVkX3dvcmRfNFtdID0geworICAgIDB4NDcsIDB4NDEsIDB4NDIsIDB4MzIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MTAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NSwgMHgwMCwgMHg2ZSwgMHgwMCwgMHg2NywKKyAgICAweDAwLCAweDZjLCAweDAwLCAweDY5LCAweDAwLCAweDczLCAweDAwLCAweDY4LAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDEsIDB4OGUsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHhlZiwgMHhiYiwgMHhiZiwgMHgzMSwgMHgwZCwgMHgwYSwgMHgzMAorICB9OworICBndWludDggd3JvbmdfdG90YWxfbGVuZ3RoW10gPSB7CisgICAgMHg0NywgMHg0MSwgMHg0MiwgMHgzMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgxMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDQ1LCAweDAwLCAweDZlLCAweDAwLCAweDY3LAorICAgIDB4MDAsIDB4NmMsIDB4MDAsIDB4NjksIDB4MDAsIDB4NzMsIDB4MDAsIDB4NjgsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg4ZSwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweGVmLCAweGJiLCAweGJmLCAweDMxLCAweDBkLCAweDBhLCAweDMwCisgIH07CisgIC8qIHNpemUgb2YgdGhlIGJ1ZmZlciBtdXN0IGJlIGxhcmdlciB0aGFuIDExICovCisgIGNoZWNrX3dyb25nX2J1ZmZlciAoYXZpc3ViX3V0Zl84X3dpdGhfYm9tLCAxMSk7CisgIC8qIGJ1ZmZlciBtdXN0IHN0YXJ0IHdpdGggJ0dBQjJcMCcgKi8KKyAgY2hlY2tfd3JvbmdfYnVmZmVyICh3cm9uZ19tYWdpYywgMTQpOworICAvKiBuZXh0IHdvcmQgbXVzdCBiZSAyICovCisgIGNoZWNrX3dyb25nX2J1ZmZlciAod3JvbmdfZml4ZWRfd29yZF8yLCAyNCk7CisgIC8qIGxlbmd0aCBtdXN0IGJlIGxhcmdlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUgKyAxNyAqLworICBjaGVja193cm9uZ19idWZmZXIgKHdyb25nX2xlbmd0aF9hZnRlcl9uYW1lLCAyNCk7CisgIC8qIG5leHQgd29yZCBtdXN0IGJlIDQgKi8KKyAgY2hlY2tfd3JvbmdfYnVmZmVyICh3cm9uZ19maXhlZF93b3JkXzQsIDM2KTsKKyAgLyogY2hlY2sgd3JvbmcgdG90YWwgbGVuZ3RoICovCisgIGNoZWNrX3dyb25nX2J1ZmZlciAod3JvbmdfdG90YWxfbGVuZ3RoLCAzNik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYXZpc3VidGl0bGVfcG9zaXRpdmUpCit7CisgIGd1aW50OCBhdmlzdWJfdXRmXzhfd2l0aG91dF9ib21bXSA9IHsKKyAgICAweDQ3LCAweDQxLCAweDQyLCAweDMyLCAweDAwLCAweDAyLCAweDAwLCAweDEwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDUsIDB4MDAsIDB4NmUsIDB4MDAsIDB4NjcsCisgICAgMHgwMCwgMHg2YywgMHgwMCwgMHg2OSwgMHgwMCwgMHg3MywgMHgwMCwgMHg2OCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDhiLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MzEsIDB4MGQsIDB4MGEsIDB4MzAsCisgICAgMHgzMCwgMHgzYSwgMHgzMCwgMHgzMCwgMHgzYSwgMHgzMCwgMHgzMCwgMHgyYywKKyAgICAweDMxLCAweDMwLCAweDMwLCAweDIwLCAweDJkLCAweDJkLCAweDNlLCAweDIwLAorICAgIDB4MzAsIDB4MzAsIDB4M2EsIDB4MzAsIDB4MzAsIDB4M2EsIDB4MzAsIDB4MzIsCisgICAgMHgyYywgMHgzMCwgMHgzMCwgMHgzMCwgMHgwZCwgMHgwYSwgMHgzYywgMHg2MiwKKyAgICAweDNlLCAweDQxLCAweDZlLCAweDIwLCAweDU1LCAweDU0LCAweDQ2LCAweDM4LAorICAgIDB4MjAsIDB4NTMsIDB4NzUsIDB4NjIsIDB4NzQsIDB4NjksIDB4NzQsIDB4NmMsCisgICAgMHg2NSwgMHgyMCwgMHg3NywgMHg2OSwgMHg3NCwgMHg2OCwgMHgyMCwgMHg0MiwKKyAgICAweDRmLCAweDRkLCAweDNjLCAweDJmLCAweDYyLCAweDNlLCAweDBkLCAweDBhLAorICAgIDB4MGQsIDB4MGEsIDB4MzIsIDB4MGQsIDB4MGEsIDB4MzAsIDB4MzAsIDB4M2EsCisgICAgMHgzMCwgMHgzMCwgMHgzYSwgMHgzMCwgMHgzMiwgMHgyYywgMHgzMSwgMHgzMCwKKyAgICAweDMwLCAweDIwLCAweDJkLCAweDJkLCAweDNlLCAweDIwLCAweDMwLCAweDMwLAorICAgIDB4M2EsIDB4MzAsIDB4MzAsIDB4M2EsIDB4MzAsIDB4MzQsIDB4MmMsIDB4MzAsCisgICAgMHgzMCwgMHgzMCwgMHgwZCwgMHgwYSwgMHg1MywgMHg2ZiwgMHg2ZCwgMHg2NSwKKyAgICAweDc0LCAweDY4LCAweDY5LCAweDZlLCAweDY3LCAweDIwLCAweDZlLCAweDZmLAorICAgIDB4NmUsIDB4NDEsIDB4NTMsIDB4NDMsIDB4NDksIDB4NDksIDB4MjAsIDB4MmQsCisgICAgMHgyMCwgMHhjMiwgMHhiNSwgMHhjMywgMHhiNiwgMHhjMywgMHhhNCwgMHhjMywKKyAgICAweGJjLCAweGMzLCAweDlmLCAweDBkLCAweDBhLCAweDBkLCAweDBhCisgIH07CisgIGNoZWNrX2NvcnJlY3RfYnVmZmVyIChhdmlzdWJfdXRmXzhfd2l0aF9ib20sIDE3NSwgYXZpc3ViX3V0Zl84X3dpdGhfYm9tICsgMzYsCisgICAgICAxMzkpOworICBjaGVja19jb3JyZWN0X2J1ZmZlciAoYXZpc3ViX3V0Zl84X3dpdGhvdXRfYm9tLCAxNzIsCisgICAgICBhdmlzdWJfdXRmXzhfd2l0aG91dF9ib20gKyAzMywgMTM5KTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorYXZpc3VidGl0bGVfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiYXZpc3VidGl0bGUiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYXZpc3VidGl0bGVfbmVnYXRpdmUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYXZpc3VidGl0bGVfcG9zaXRpdmUpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoYXZpc3VidGl0bGUpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvY2Fwc3NldHRlci5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvY2Fwc3NldHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYWFkNDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9jYXBzc2V0dGVyLmMKQEAgLTAsMCArMSwyMzIgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIHVuaXQgdGVzdCBmb3IgY2Fwc3NldHRlcgorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDk+IE1hcmsgTmF1d2VsYWVydHMgPG1uYXV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitzdGF0aWMgR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKKworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX2NhcHNzZXR0ZXIgKHZvaWQpCit7CisgIEdzdEVsZW1lbnQgKmNhcHNzZXR0ZXI7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfY2Fwc3NldHRlciIpOworCisgIGNhcHNzZXR0ZXIgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoImNhcHNzZXR0ZXIiKTsKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoY2Fwc3NldHRlciwgJnNyY3RlbXBsYXRlKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChjYXBzc2V0dGVyLCAmc2lua3RlbXBsYXRlKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICByZXR1cm4gY2Fwc3NldHRlcjsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfY2Fwc3NldHRlciAoR3N0RWxlbWVudCAqIGNhcHNzZXR0ZXIpCit7CisgIEdTVF9ERUJVRyAoImNsZWFudXBfY2Fwc3NldHRlciIpOworCisgIGdzdF9jaGVja19kcm9wX2J1ZmZlcnMgKCk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKGNhcHNzZXR0ZXIpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKGNhcHNzZXR0ZXIpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAoY2Fwc3NldHRlcik7Cit9CisKK3N0YXRpYyB2b2lkCitwdXNoX2FuZF90ZXN0IChHc3RDYXBzICogcHJvcF9jYXBzLCBnYm9vbGVhbiBqb2luLCBnYm9vbGVhbiByZXBsYWNlLAorICAgIEdzdENhcHMgKiBpbl9jYXBzLCBHc3RDYXBzICogb3V0X2NhcHMpCit7CisgIEdzdEVsZW1lbnQgKmNhcHNzZXR0ZXI7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBHc3RDYXBzICpjdXJyZW50X291dDsKKworICBjYXBzc2V0dGVyID0gc2V0dXBfY2Fwc3NldHRlciAoKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoY2Fwc3NldHRlciwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfb2JqZWN0X3NldCAoY2Fwc3NldHRlciwgImpvaW4iLCBqb2luLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChjYXBzc2V0dGVyLCAicmVwbGFjZSIsIHJlcGxhY2UsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGNhcHNzZXR0ZXIsICJjYXBzIiwgcHJvcF9jYXBzLCBOVUxMKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHByb3BfY2Fwcyk7CisKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg0KTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoYnVmZmVyLCAiYnVmZmVyIiwgMSk7CisgIGdzdF9idWZmZXJfZmlsbCAoYnVmZmVyLCAwLCAiZGF0YSIsIDQpOworCisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBjYXBzc2V0dGVyLCBpbl9jYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoaW5fY2Fwcyk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0ssCisgICAgICAiRmFpbGVkIHB1c2hpbmcgYnVmZmVyIHRvIGNhcHNzZXR0ZXIiKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpID09IFRSVUUpOworCisgIC8qIC4uLiBidXQgaXQgc2hvdWxkIGVuZCB1cCBiZWluZyBjb2xsZWN0ZWQgb24gdGhlIGdsb2JhbCBidWZmZXIgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPT0gMSk7CisgIGJ1ZmZlciA9IGdfbGlzdF9maXJzdCAoYnVmZmVycyktPmRhdGE7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGJ1ZmZlciwgImJ1ZmZlciIsIDEpOworCisgIGN1cnJlbnRfb3V0ID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChteXNpbmtwYWQpOworICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfaXNfZXF1YWwgKG91dF9jYXBzLCBjdXJyZW50X291dCkpOworICBnc3RfY2Fwc191bnJlZiAoY3VycmVudF9vdXQpOworICBnc3RfY2Fwc191bnJlZiAob3V0X2NhcHMpOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9jYXBzc2V0dGVyIChjYXBzc2V0dGVyKTsKK30KKworI2RlZmluZSBTUkNfV0lEVEggICA4CisjZGVmaW5lIFNSQ19IRUlHSFQgMTIKKworc3RhdGljIEdzdENhcHMgKgorbWFrZV9zcmNfY2FwcyAodm9pZCkKK3sKKyAgcmV0dXJuIGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWZvbyIsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIFNSQ19XSURUSCwKKyAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBTUkNfSEVJR0hULCBOVUxMKTsKK30KKworLyogZG9uJ3QgdHJ5IHRoZXNlIGNhcHMgbXV0YXRpb25zIGF0IGhvbWUsIGZvbGtzICovCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X25fam9pbl9uX3JlcGxhY2UpCit7CisgIEdzdENhcHMgKmluX2NhcHMsICpwcm9wX2NhcHMsICpvdXRfY2FwczsKKworICBpbl9jYXBzID0gbWFrZV9zcmNfY2FwcyAoKTsKKyAgcHJvcF9jYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtYmFyIiwKKyAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIDIgKiBTUkNfV0lEVEgsIE5VTEwpOworICBvdXRfY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWJhciIsCisgICAgICAid2lkdGgiLCBHX1RZUEVfSU5ULCAyICogU1JDX1dJRFRILAorICAgICAgImhlaWdodCIsIEdfVFlQRV9JTlQsIFNSQ19IRUlHSFQsIE5VTEwpOworICBwdXNoX2FuZF90ZXN0IChwcm9wX2NhcHMsIEZBTFNFLCBGQUxTRSwgaW5fY2Fwcywgb3V0X2NhcHMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X25fam9pbl9yZXBsYWNlKQoreworICBHc3RDYXBzICppbl9jYXBzLCAqcHJvcF9jYXBzLCAqb3V0X2NhcHM7CisKKyAgaW5fY2FwcyA9IG1ha2Vfc3JjX2NhcHMgKCk7CisgIHByb3BfY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWJhciIsCisgICAgICAid2lkdGgiLCBHX1RZUEVfSU5ULCAyICogU1JDX1dJRFRILCBOVUxMKTsKKyAgb3V0X2NhcHMgPSBnc3RfY2Fwc19jb3B5IChwcm9wX2NhcHMpOworICBwdXNoX2FuZF90ZXN0IChwcm9wX2NhcHMsIEZBTFNFLCBUUlVFLCBpbl9jYXBzLCBvdXRfY2Fwcyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfam9pbl9uX3JlcGxhY2Vfbl9tYXRjaCkKK3sKKyAgR3N0Q2FwcyAqaW5fY2FwcywgKnByb3BfY2FwcywgKm91dF9jYXBzOworCisgIC8qIG5vbiBqb2luaW5nIGNhcHMgKi8KKyAgaW5fY2FwcyA9IG1ha2Vfc3JjX2NhcHMgKCk7CisgIHByb3BfY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWJhciIsCisgICAgICAid2lkdGgiLCBHX1RZUEVfSU5ULCAyICogU1JDX1dJRFRILCBOVUxMKTsKKyAgb3V0X2NhcHMgPSBnc3RfY2Fwc19jb3B5IChpbl9jYXBzKTsKKyAgcHVzaF9hbmRfdGVzdCAocHJvcF9jYXBzLCBUUlVFLCBGQUxTRSwgaW5fY2Fwcywgb3V0X2NhcHMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2pvaW5fbl9yZXBsYWNlX21hdGNoKQoreworICBHc3RDYXBzICppbl9jYXBzLCAqcHJvcF9jYXBzLCAqb3V0X2NhcHM7CisKKyAgLyogam9pbmluZyBjYXBzICovCisgIGluX2NhcHMgPSBtYWtlX3NyY19jYXBzICgpOworICBwcm9wX2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1mb28iLAorICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgMiAqIFNSQ19XSURUSCwgTlVMTCk7CisgIG91dF9jYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtZm9vIiwKKyAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIDIgKiBTUkNfV0lEVEgsCisgICAgICAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgU1JDX0hFSUdIVCwgTlVMTCk7CisgIHB1c2hfYW5kX3Rlc3QgKHByb3BfY2FwcywgVFJVRSwgRkFMU0UsIGluX2NhcHMsIG91dF9jYXBzKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9qb2luX3JlcGxhY2Vfbl9tYXRjaCkKK3sKKyAgR3N0Q2FwcyAqaW5fY2FwcywgKnByb3BfY2FwcywgKm91dF9jYXBzOworCisgIC8qIG5vbiBqb2luaW5nIGNhcHMgKi8KKyAgaW5fY2FwcyA9IG1ha2Vfc3JjX2NhcHMgKCk7CisgIHByb3BfY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWJhciIsCisgICAgICAid2lkdGgiLCBHX1RZUEVfSU5ULCAyICogU1JDX1dJRFRILCBOVUxMKTsKKyAgb3V0X2NhcHMgPSBnc3RfY2Fwc19jb3B5IChpbl9jYXBzKTsKKyAgcHVzaF9hbmRfdGVzdCAocHJvcF9jYXBzLCBUUlVFLCBUUlVFLCBpbl9jYXBzLCBvdXRfY2Fwcyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfam9pbl9yZXBsYWNlX21hdGNoKQoreworICBHc3RDYXBzICppbl9jYXBzLCAqcHJvcF9jYXBzLCAqb3V0X2NhcHM7CisKKyAgLyogam9pbmluZyBjYXBzICovCisgIGluX2NhcHMgPSBtYWtlX3NyY19jYXBzICgpOworICBwcm9wX2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1mb28iLAorICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgMiAqIFNSQ19XSURUSCwgTlVMTCk7CisgIG91dF9jYXBzID0gZ3N0X2NhcHNfY29weSAocHJvcF9jYXBzKTsKKyAgcHVzaF9hbmRfdGVzdCAocHJvcF9jYXBzLCBUUlVFLCBUUlVFLCBpbl9jYXBzLCBvdXRfY2Fwcyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2NhcHNzZXR0ZXJfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiY2Fwc3NldHRlciIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9uX2pvaW5fbl9yZXBsYWNlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X25fam9pbl9yZXBsYWNlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2pvaW5fbl9yZXBsYWNlX25fbWF0Y2gpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfam9pbl9uX3JlcGxhY2VfbWF0Y2gpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfam9pbl9yZXBsYWNlX25fbWF0Y2gpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfam9pbl9yZXBsYWNlX21hdGNoKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGNhcHNzZXR0ZXIpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvZGVpbnRlcmxhY2UuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJkYjFhNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsYWNlLmMKQEAgLTAsMCArMSwxMDUyIEBACisvKiBHU3RyZWFtZXIgdW5pdCB0ZXN0cyBmb3IgdGhlIGRlaW50ZXJsYWNlIGVsZW1lbnQKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworc3RhdGljIGdib29sZWFuCitnc3RfY2Fwc19pc19pbnRlcmxhY2VkIChHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0VmlkZW9JbmZvIGluZm87CisKKyAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2lzX2ZpeGVkIChjYXBzKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKSk7CisKKyAgcmV0dXJuIEdTVF9WSURFT19JTkZPX0lTX0lOVEVSTEFDRUQgKCZpbmZvKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfY3JlYXRlX2FuZF91bnJlZikKK3sKKyAgR3N0RWxlbWVudCAqZGVpbnRlcmxhY2U7CisKKyAgZGVpbnRlcmxhY2UgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJkZWludGVybGFjZSIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZGVpbnRlcmxhY2UgIT0gTlVMTCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChkZWludGVybGFjZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChkZWludGVybGFjZSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworI2RlZmluZSBDQVBTX1ZJREVPX0NPTU1PTiBcCisgICAgIndpZHRoPShpbnQpODAwLCBoZWlnaHQ9KGludCk2MDAsIGZyYW1lcmF0ZT0oZnJhY3Rpb24pMTUvMSIKKworI2RlZmluZSBDQVBTX0lNQUdFX0NPTU1PTiBcCisgICAgIndpZHRoPShpbnQpMzIwMCwgaGVpZ2h0PShpbnQpMzQwMCwgZnJhbWVyYXRlPShmcmFjdGlvbikwLzEiCisKKyNkZWZpbmUgQ0FQU19ZVVkyIFwKKyAgICAidmlkZW8veC1yYXcsICIgXAorICAgIENBUFNfVklERU9fQ09NTU9OICIsICIgXAorICAgICJmb3JtYXQ9KHN0cmluZylZVVkyIgorCisjZGVmaW5lIENBUFNfWVVZMl9JTlRFUkxBQ0VEIFwKKyAgICBDQVBTX1lVWTIgIiwgIiBcCisgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkIgorCisjZGVmaW5lIENBUFNfWVZZVSBcCisgICAgInZpZGVvL3gtcmF3LCAiIFwKKyAgICBDQVBTX1ZJREVPX0NPTU1PTiAiLCAiIFwKKyAgICAiZm9ybWF0PShzdHJpbmcpWVZZVSIKKworI2RlZmluZSBDQVBTX1lWWVVfSU5URVJMQUNFRCBcCisgICAgQ0FQU19ZVllVICIsICIgXAorICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIKKworI2RlZmluZSBDQVBTX1lVWTJfSU1BR0UgXAorICAgICJ2aWRlby94LXJhdywgIiBcCisgICAgQ0FQU19JTUFHRV9DT01NT04gIiwgIiBcCisgICAgImZvcm1hdD0oc3RyaW5nKVlVWTIiCisKKyNkZWZpbmUgQ0FQU19ZVVkyX0lOVEVSTEFDRURfSU1BR0UgXAorICAgIENBUFNfWVVZMl9JTUFHRSAiLCAiIFwKKyAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiCisKKyNkZWZpbmUgQ0FQU19ZVllVX0lNQUdFIFwKKyAgICAidmlkZW8veC1yYXcsICIgXAorICAgIENBUFNfSU1BR0VfQ09NTU9OICIsICIgXAorICAgICJmb3JtYXQ9KHN0cmluZylZVllVIgorCisjZGVmaW5lIENBUFNfWVZZVV9JTlRFUkxBQ0VEX0lNQUdFIFwKKyAgICBDQVBTX1lWWVVfSU1BR0UgIiwgIiBcCisgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkIgorCitzdGF0aWMgR3N0RWxlbWVudCAqZGVpbnRlcmxhY2U7CitzdGF0aWMgR3N0UGFkICpzcmNwYWQ7CitzdGF0aWMgR3N0UGFkICpzaW5rcGFkOworCitzdGF0aWMgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisKKy8qIHNldHMgdXAgZGVpbnRlcmxhY2UgYW5kIHNob3J0Y3V0IHBvaW50ZXJzIHRvIGl0cyBwYWRzICovCitzdGF0aWMgdm9pZAorc2V0dXBfZGVpbnRlcmxhY2UgKHZvaWQpCit7CisgIGRlaW50ZXJsYWNlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZGVpbnRlcmxhY2UiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGRlaW50ZXJsYWNlICE9IE5VTEwpOworCisgIHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZGVpbnRlcmxhY2UsICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChzaW5rcGFkICE9IE5VTEwpOworICBzcmNwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZGVpbnRlcmxhY2UsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKHNyY3BhZCAhPSBOVUxMKTsKK30KKworLyogc2V0cyB1cCBhIGJhc2ljIHRlc3QgcGlwZWxpbmUgY29udGFpbmluZzoKKyAqCisgKiB2aWRlb3Rlc3RzcmMgISBjYXBzZmlsdGVyICEgZGVpbnRlcmxhY2UgISBmYWtlc2luaworICoKKyAqIFRoZSBwYXJhbWV0ZXJzIHNldCB0aGUgY2Fwc2ZpbHRlciBjYXBzIGFuZCB0aGUgbnVtLWJ1ZmZlcnMKKyAqIHByb3BlcnR5IG9mIHZpZGVvdGVzdHNyYworICoKKyAqIEl0IGlzIHVzZWZ1bCBmb3IgYWRkaW5nIGJ1ZmZlciBwcm9iZXMgdG8gZGVpbnRlcmxhY2UgcGFkcworICogYW5kIHZhbGlkYXRpbmcgaW5wdXRzL291dHB1dHMKKyAqLworc3RhdGljIHZvaWQKK3NldHVwX3Rlc3RfcGlwZWxpbmUgKGdpbnQgbW9kZSwgR3N0Q2FwcyAqIGluZmlsdGVyY2FwcywgR3N0Q2FwcyAqIG91dGZpbHRlcmNhcHMsCisgICAgZ2ludCBudW1idWZmZXJzKQoreworICBHc3RFbGVtZW50ICpzcmM7CisgIEdzdEVsZW1lbnQgKmluZmlsdGVyOworICBHc3RFbGVtZW50ICpvdXRmaWx0ZXI7CisgIEdzdEVsZW1lbnQgKnNpbms7CisKKyAgc2V0dXBfZGVpbnRlcmxhY2UgKCk7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3ICgicGlwZWxpbmUiKTsKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgTlVMTCk7CisgIGluZmlsdGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiY2Fwc2ZpbHRlciIsICJpbmZpbHRlciIpOworICBvdXRmaWx0ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJjYXBzZmlsdGVyIiwgIm91dGZpbHRlciIpOworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCBOVUxMKTsKKyAgZmFpbF9pZiAoc3JjID09IE5VTEwpOworICBmYWlsX2lmIChpbmZpbHRlciA9PSBOVUxMKTsKKyAgZmFpbF9pZiAob3V0ZmlsdGVyID09IE5VTEwpOworICBmYWlsX2lmIChzaW5rID09IE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIGluZmlsdGVyKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBkZWludGVybGFjZSkpOworICBmYWlsX3VubGVzcyAoZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgb3V0ZmlsdGVyKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBzaW5rKSk7CisKKyAgLyogc2V0IHRoZSBwcm9wZXJ0aWVzICovCisgIGdfb2JqZWN0X3NldCAoZGVpbnRlcmxhY2UsICJtb2RlIiwgbW9kZSwgTlVMTCk7CisgIGlmIChudW1idWZmZXJzID4gMCkKKyAgICBnX29iamVjdF9zZXQgKHNyYywgIm51bS1idWZmZXJzIiwgbnVtYnVmZmVycywgTlVMTCk7CisgIGlmIChpbmZpbHRlcmNhcHMpCisgICAgZ19vYmplY3Rfc2V0IChpbmZpbHRlciwgImNhcHMiLCBpbmZpbHRlcmNhcHMsIE5VTEwpOworICBpZiAob3V0ZmlsdGVyY2FwcykKKyAgICBnX29iamVjdF9zZXQgKG91dGZpbHRlciwgImNhcHMiLCBvdXRmaWx0ZXJjYXBzLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGlua19tYW55IChzcmMsIGluZmlsdGVyLCBkZWludGVybGFjZSwgb3V0ZmlsdGVyLAorICAgICAgICAgIHNpbmssIE5VTEwpKTsKKyAgaWYgKGluZmlsdGVyY2FwcykKKyAgICBnc3RfY2Fwc191bnJlZiAoaW5maWx0ZXJjYXBzKTsKKyAgaWYgKG91dGZpbHRlcmNhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKG91dGZpbHRlcmNhcHMpOworfQorCisvKgorICogQ2hlY2tzIGlmIDIgYnVmZmVycyBhcmUgZXF1YWwKKyAqCisgKiBFcXVhbHMgbWVhbnMgc2FtZSBkYXRhCisgKi8KK3N0YXRpYyBnYm9vbGVhbgordGVzdF9idWZmZXJfZXF1YWxzIChHc3RCdWZmZXIgKiBidWZfYSwgR3N0QnVmZmVyICogYnVmX2IpCit7CisgIEdzdE1hcEluZm8gbTEsIG0yOworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmX2EsICZtMSwgR1NUX01BUF9SRUFEKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1Zl9iLCAmbTIsIEdTVF9NQVBfUkVBRCk7CisKKyAgaWYgKG0xLnNpemUgPT0gbTIuc2l6ZSkgeworICAgIHJlcyA9IG1lbWNtcCAobTEuZGF0YSwgbTIuZGF0YSwgbTEuc2l6ZSkgPT0gMDsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChidWZfYSwgJm0xKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmX2IsICZtMik7CisKKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEdzdFBhZFByb2JlUmV0dXJuCitzaW5rcGFkX2VucXVldWVfYnVmZmVyIChHc3RQYWQgKiBwYWQsIEdzdFBhZFByb2JlSW5mbyAqIGluZm8sIGdwb2ludGVyIGRhdGEpCit7CisgIEdRdWV1ZSAqcXVldWUgPSAoR1F1ZXVlICopIGRhdGE7CisgIEdzdEJ1ZmZlciAqYnVmID0gR1NUX1BBRF9QUk9CRV9JTkZPX0JVRkZFUiAoaW5mbyk7CisKKyAgLyogZW5xdWV1ZSBhIGNvcHkgZm9yIGJlaW5nIGNvbXBhcmVkIGxhdGVyICovCisgIGdfcXVldWVfcHVzaF90YWlsIChxdWV1ZSwgZ3N0X2J1ZmZlcl9jb3B5IChidWYpKTsKKworICByZXR1cm4gR1NUX1BBRF9QUk9CRV9PSzsKK30KKworLyoKKyAqIHBhZCBidWZmZXIgcHJvYmUgdGhhdCBjb21wYXJlcyB0aGUgYnVmZmVyIHdpdGggdGhlIHRvcCBvbmUKKyAqIGluIHRoZSBHUXVldWUgcGFzc2VkIGFzIHRoZSB1c2VyIGRhdGEKKyAqLworc3RhdGljIEdzdFBhZFByb2JlUmV0dXJuCitzcmNwYWRfZGVxdWV1ZV9hbmRfY29tcGFyZV9idWZmZXIgKEdzdFBhZCAqIHBhZCwgR3N0UGFkUHJvYmVJbmZvICogaW5mbywKKyAgICBncG9pbnRlciBkYXRhKQoreworICBHUXVldWUgKnF1ZXVlID0gKEdRdWV1ZSAqKSBkYXRhOworICBHc3RCdWZmZXIgKmJ1ZiA9IEdTVF9QQURfUFJPQkVfSU5GT19CVUZGRVIgKGluZm8pOworICBHc3RCdWZmZXIgKnF1ZXVlX2J1ZjsKKworICBxdWV1ZV9idWYgPSAoR3N0QnVmZmVyICopIGdfcXVldWVfcG9wX2hlYWQgKHF1ZXVlKTsKKyAgZmFpbF9pZiAocXVldWVfYnVmID09IE5VTEwpOworCisgIGZhaWxfdW5sZXNzICh0ZXN0X2J1ZmZlcl9lcXVhbHMgKGJ1ZiwgcXVldWVfYnVmKSk7CisKKyAgZ3N0X2J1ZmZlcl91bnJlZiAocXVldWVfYnVmKTsKKworICByZXR1cm4gR1NUX1BBRF9QUk9CRV9PSzsKK30KKworLyoKKyAqIFV0aWxpdHkgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIGEgcGlwZWxpbmUgd2l0aCBkZWludGVybGFjZSBmb3IKKyAqIHZhbGlkYXRpbmcgdGhhdCBpdCBvcGVyYXRlcyBpbiBwYXNzdGhyb3VnaCBtb2RlIHdoZW4gcmVjZWl2aW5nCisgKiBkYXRhIHdpdGggJ2luZmlsdGVyY2FwcycgYXMgdGhlIGlucHV0IGNhcHMgYW5kIG9wZXJhdGluZyBpbiAnbW9kZScgbW9kZQorICovCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2VfY2hlY2tfcGFzc3Rocm91Z2ggKGdpbnQgbW9kZSwgY29uc3QgZ2NoYXIgKiBpbmZpbHRlcmNhcHMpCit7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKyAgR1F1ZXVlICpxdWV1ZTsKKyAgR3N0Q2FwcyAqaW5jYXBzID0gTlVMTDsKKworICBpZiAoaW5maWx0ZXJjYXBzKQorICAgIGluY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChpbmZpbHRlcmNhcHMpOworCisgIHNldHVwX3Rlc3RfcGlwZWxpbmUgKG1vZGUsIGluY2FwcywgTlVMTCwgMjApOworCisgIHF1ZXVlID0gZ19xdWV1ZV9uZXcgKCk7CisKKyAgLyogc2V0IHVwIHByb2JlcyBmb3IgdGVzdGluZyAqLworICBnc3RfcGFkX2FkZF9wcm9iZSAoc2lua3BhZCwgR1NUX1BBRF9QUk9CRV9UWVBFX0JVRkZFUiwgc2lua3BhZF9lbnF1ZXVlX2J1ZmZlciwKKyAgICAgIHF1ZXVlLCBOVUxMKTsKKyAgZ3N0X3BhZF9hZGRfcHJvYmUgKHNyY3BhZCwgR1NUX1BBRF9QUk9CRV9UWVBFX0JVRkZFUiwKKyAgICAgIHNyY3BhZF9kZXF1ZXVlX2FuZF9jb21wYXJlX2J1ZmZlciwgcXVldWUsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORykgIT0KKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgbXNnID0gZ3N0X2J1c19wb2xsIChHU1RfRUxFTUVOVF9CVVMgKHBpcGVsaW5lKSwKKyAgICAgIEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfRU9TLCAtMSk7CisgIGlmIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VSUk9SKSB7CisgICAgR1NUX0VSUk9SICgiRVJST1I6ICUiIEdTVF9QVFJfRk9STUFULCBtc2cpOworICAgIGZhaWwgKCJVbmV4cGVjdGVkIGVycm9yIG1lc3NhZ2UiKTsKKyAgfQorICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKworICAvKiBxdWV1ZSBzaG91bGQgYmUgZW1wdHkgKi8KKyAgZmFpbF91bmxlc3MgKGdfcXVldWVfaXNfZW1wdHkgKHF1ZXVlKSk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKSA9PQorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKyAgZ19xdWV1ZV9mcmVlIChxdWV1ZSk7Cit9CisKKy8qCisgKiBTZXRzIHRoZSBjYXBzIG9uIGRlaW50ZXJsYWNlIHNpbmtwYWQgYW5kIHZhbGlkYXRlcyB0aGUKKyAqIGNhcHMgdGhhdCBpcyBzZXQgb24gdGhlIHNyY3BhZAorICovCitzdGF0aWMgdm9pZAorZGVpbnRlcmxhY2Vfc2V0X2NhcHNfYW5kX2NoZWNrIChHc3RDYXBzICogaW5wdXQsIGdib29sZWFuIG11c3RfZGVpbnRlcmxhY2UpCit7CisgIEdzdENhcHMgKm90aGVyY2FwcyA9IE5VTEw7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBnc3RfcGFkX3NlbmRfZXZlbnQgKHNpbmtwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgidGVzdCIpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfc2V0X2NhcHMgKHNpbmtwYWQsIGlucHV0KSk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfcGFkX3NlbmRfZXZlbnQgKHNpbmtwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKworICBnX29iamVjdF9nZXQgKHNyY3BhZCwgImNhcHMiLCAmb3RoZXJjYXBzLCBOVUxMKTsKKworICBpZiAobXVzdF9kZWludGVybGFjZSkgeworICAgIGZhaWxfaWYgKGdzdF9jYXBzX2lzX2ludGVybGFjZWQgKG90aGVyY2FwcykpOworICB9IGVsc2UgeworICAgIEdzdFN0cnVjdHVyZSAqczsKKworICAgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19pc19pbnRlcmxhY2VkIChpbnB1dCkgPT0KKyAgICAgICAgZ3N0X2NhcHNfaXNfaW50ZXJsYWNlZCAob3RoZXJjYXBzKSk7CisKKyAgICBvdGhlcmNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChvdGhlcmNhcHMpOworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChvdGhlcmNhcHMsIDApOworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChzLCAiaW50ZXJsYWNlLW1vZGUiKTsKKworICAgIGlucHV0ID0gZ3N0X2NhcHNfbWFrZV93cml0YWJsZSAoaW5wdXQpOworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChpbnB1dCwgMCk7CisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJpbnRlcmxhY2UtbW9kZSIpOworCisgICAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2lzX2VxdWFsIChpbnB1dCwgb3RoZXJjYXBzKSk7CisgIH0KKyAgZ3N0X2NhcHNfdW5yZWYgKGlucHV0KTsKKyAgZ3N0X2NhcHNfdW5yZWYgKG90aGVyY2Fwcyk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChjb25zdCBnY2hhciAqIGlucHV0LAorICAgIGdib29sZWFuIG11c3RfZGVpbnRlcmxhY2UpCit7CisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX2FuZF9jaGVjayAoZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKGlucHV0KSwKKyAgICAgIG11c3RfZGVpbnRlcmxhY2UpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tb2RlX2F1dG9fYWNjZXB0X2NhcHMpCit7CisgIHNldHVwX2RlaW50ZXJsYWNlICgpOworCisgIC8qIGF1dG8gbW9kZSAqLworICBnX29iamVjdF9zZXQgKGRlaW50ZXJsYWNlLCAibW9kZSIsIDAsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChkZWludGVybGFjZSwgR1NUX1NUQVRFX1BMQVlJTkcpID09CisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIC8qIHRyeSB0byBzZXQgbm9uIGludGVybGFjZWQgY2FwcyAqLworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lWWVUsIEZBTFNFKTsKKyAgZGVpbnRlcmxhY2Vfc2V0X3N0cmluZ19jYXBzX2FuZF9jaGVjayAoQ0FQU19ZVVkyLCBGQUxTRSk7CisgIGRlaW50ZXJsYWNlX3NldF9zdHJpbmdfY2Fwc19hbmRfY2hlY2sgKENBUFNfWVZZVV9JTUFHRSwgRkFMU0UpOworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lVWTJfSU1BR0UsIEZBTFNFKTsKKworICAvKiBub3cgdHJ5IHRvIHNldCBpbnRlcmxhY2VkIGNhcHMgKi8KKyAgZGVpbnRlcmxhY2Vfc2V0X3N0cmluZ19jYXBzX2FuZF9jaGVjayAoQ0FQU19ZVllVX0lOVEVSTEFDRUQsIFRSVUUpOworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lVWTJfSU5URVJMQUNFRCwgVFJVRSk7CisgIGRlaW50ZXJsYWNlX3NldF9zdHJpbmdfY2Fwc19hbmRfY2hlY2sgKENBUFNfWVZZVV9JTlRFUkxBQ0VEX0lNQUdFLCBUUlVFKTsKKyAgZGVpbnRlcmxhY2Vfc2V0X3N0cmluZ19jYXBzX2FuZF9jaGVjayAoQ0FQU19ZVVkyX0lOVEVSTEFDRURfSU1BR0UsIFRSVUUpOworCisgIC8qIGNsZWFudXAgKi8KKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGRlaW50ZXJsYWNlLCBHU1RfU1RBVEVfTlVMTCkgPT0KKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGRlaW50ZXJsYWNlKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tb2RlX2ZvcmNlZF9hY2NlcHRfY2FwcykKK3sKKyAgc2V0dXBfZGVpbnRlcmxhY2UgKCk7CisKKyAgLyogZm9yY2VkIG1vZGUgKi8KKyAgZ19vYmplY3Rfc2V0IChkZWludGVybGFjZSwgIm1vZGUiLCAxLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZGVpbnRlcmxhY2UsIEdTVF9TVEFURV9QTEFZSU5HKSA9PQorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICAvKiB0cnkgdG8gc2V0IG5vbiBpbnRlcmxhY2VkIGNhcHMgKi8KKyAgZGVpbnRlcmxhY2Vfc2V0X3N0cmluZ19jYXBzX2FuZF9jaGVjayAoQ0FQU19ZVllVLCBUUlVFKTsKKyAgZGVpbnRlcmxhY2Vfc2V0X3N0cmluZ19jYXBzX2FuZF9jaGVjayAoQ0FQU19ZVVkyLCBUUlVFKTsKKyAgZGVpbnRlcmxhY2Vfc2V0X3N0cmluZ19jYXBzX2FuZF9jaGVjayAoQ0FQU19ZVllVX0lNQUdFLCBUUlVFKTsKKyAgZGVpbnRlcmxhY2Vfc2V0X3N0cmluZ19jYXBzX2FuZF9jaGVjayAoQ0FQU19ZVVkyX0lNQUdFLCBUUlVFKTsKKworICAvKiBub3cgdHJ5IHRvIHNldCBpbnRlcmxhY2VkIGNhcHMgKi8KKyAgZGVpbnRlcmxhY2Vfc2V0X3N0cmluZ19jYXBzX2FuZF9jaGVjayAoQ0FQU19ZVllVX0lOVEVSTEFDRUQsIFRSVUUpOworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lVWTJfSU5URVJMQUNFRCwgVFJVRSk7CisgIGRlaW50ZXJsYWNlX3NldF9zdHJpbmdfY2Fwc19hbmRfY2hlY2sgKENBUFNfWVZZVV9JTlRFUkxBQ0VEX0lNQUdFLCBUUlVFKTsKKyAgZGVpbnRlcmxhY2Vfc2V0X3N0cmluZ19jYXBzX2FuZF9jaGVjayAoQ0FQU19ZVVkyX0lOVEVSTEFDRURfSU1BR0UsIFRSVUUpOworCisgIC8qIGNsZWFudXAgKi8KKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGRlaW50ZXJsYWNlLCBHU1RfU1RBVEVfTlVMTCkgPT0KKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGRlaW50ZXJsYWNlKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tb2RlX2Rpc2FibGVkX2FjY2VwdF9jYXBzKQoreworICBzZXR1cF9kZWludGVybGFjZSAoKTsKKworICAvKiBkaXNhYmxlZCBtb2RlICovCisgIGdfb2JqZWN0X3NldCAoZGVpbnRlcmxhY2UsICJtb2RlIiwgMiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGRlaW50ZXJsYWNlLCBHU1RfU1RBVEVfUExBWUlORykgPT0KKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgLyogdHJ5IHRvIHNldCBub24gaW50ZXJsYWNlZCBjYXBzICovCisgIGRlaW50ZXJsYWNlX3NldF9zdHJpbmdfY2Fwc19hbmRfY2hlY2sgKENBUFNfWVZZVSwgRkFMU0UpOworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lVWTIsIEZBTFNFKTsKKyAgZGVpbnRlcmxhY2Vfc2V0X3N0cmluZ19jYXBzX2FuZF9jaGVjayAoQ0FQU19ZVllVX0lNQUdFLCBGQUxTRSk7CisgIGRlaW50ZXJsYWNlX3NldF9zdHJpbmdfY2Fwc19hbmRfY2hlY2sgKENBUFNfWVVZMl9JTUFHRSwgRkFMU0UpOworCisgIC8qIG5vdyB0cnkgdG8gc2V0IGludGVybGFjZWQgY2FwcyAqLworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lWWVVfSU5URVJMQUNFRCwgRkFMU0UpOworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lVWTJfSU5URVJMQUNFRCwgRkFMU0UpOworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lWWVVfSU5URVJMQUNFRF9JTUFHRSwgRkFMU0UpOworICBkZWludGVybGFjZV9zZXRfc3RyaW5nX2NhcHNfYW5kX2NoZWNrIChDQVBTX1lVWTJfSU5URVJMQUNFRF9JTUFHRSwgRkFMU0UpOworCisgIC8qIGNsZWFudXAgKi8KKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGRlaW50ZXJsYWNlLCBHU1RfU1RBVEVfTlVMTCkgPT0KKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGRlaW50ZXJsYWNlKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tb2RlX2Rpc2FibGVkX3Bhc3N0aHJvdWdoKQoreworICAvKiAyIGlzIGRpc2FibGVkIG1vZGUgKi8KKyAgZGVpbnRlcmxhY2VfY2hlY2tfcGFzc3Rocm91Z2ggKDIsIENBUFNfWVVZMl9JTlRFUkxBQ0VEKTsKKyAgZGVpbnRlcmxhY2VfY2hlY2tfcGFzc3Rocm91Z2ggKDIsIENBUFNfWVZZVV9JTlRFUkxBQ0VEKTsKKyAgZGVpbnRlcmxhY2VfY2hlY2tfcGFzc3Rocm91Z2ggKDIsIENBUFNfWVVZMik7CisgIGRlaW50ZXJsYWNlX2NoZWNrX3Bhc3N0aHJvdWdoICgyLCBDQVBTX1lWWVUpOworCisgIGRlaW50ZXJsYWNlX2NoZWNrX3Bhc3N0aHJvdWdoICgyLCBDQVBTX1lVWTJfSU5URVJMQUNFRF9JTUFHRSk7CisgIGRlaW50ZXJsYWNlX2NoZWNrX3Bhc3N0aHJvdWdoICgyLCBDQVBTX1lWWVVfSU5URVJMQUNFRF9JTUFHRSk7CisgIGRlaW50ZXJsYWNlX2NoZWNrX3Bhc3N0aHJvdWdoICgyLCBDQVBTX1lVWTJfSU1BR0UpOworICBkZWludGVybGFjZV9jaGVja19wYXNzdGhyb3VnaCAoMiwgQ0FQU19ZVllVX0lNQUdFKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tb2RlX2F1dG9fZGVpbnRlcmxhY2VkX3Bhc3N0aHJvdWdoKQoreworICAvKiAwIGlzIGF1dG8gbW9kZSAqLworICBkZWludGVybGFjZV9jaGVja19wYXNzdGhyb3VnaCAoMCwgQ0FQU19ZVVkyKTsKKyAgZGVpbnRlcmxhY2VfY2hlY2tfcGFzc3Rocm91Z2ggKDAsIENBUFNfWVZZVSk7CisgIGRlaW50ZXJsYWNlX2NoZWNrX3Bhc3N0aHJvdWdoICgwLCBDQVBTX1lVWTJfSU1BR0UpOworICBkZWludGVybGFjZV9jaGVja19wYXNzdGhyb3VnaCAoMCwgQ0FQU19ZVllVX0lNQUdFKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgR3N0UGFkUHJvYmVSZXR1cm4KK2NhdGNoX2NhcHNfZXZlbnQgKEdzdFBhZCAqIHBhZCwgR3N0UGFkUHJvYmVJbmZvICogaW5mbywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RDYXBzICoqb3V0Y2FwcyA9IHVzZXJfZGF0YTsKKworICBpZiAoR1NUX0VWRU5UX1RZUEUgKGluZm8tPmRhdGEpID09IEdTVF9FVkVOVF9DQVBTKSB7CisgICAgZ19hc3NlcnQgKCpvdXRjYXBzID09IE5VTEwpOworCisgICAgZ3N0X2V2ZW50X3BhcnNlX2NhcHMgKEdTVF9FVkVOVCAoaW5mby0+ZGF0YSksIG91dGNhcHMpOworICAgIGdzdF9jYXBzX3JlZiAoKm91dGNhcHMpOworICB9CisKKyAgcmV0dXJuIEdTVF9QQURfUFJPQkVfT0s7Cit9CisKK3N0YXRpYyB2b2lkCitkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0IChnaW50IG1vZGUsIGdpbnQgZmllbGRzLAorICAgIGNvbnN0IGdjaGFyICogaW5wdXRfY2FwcywgY29uc3QgZ2NoYXIgKiBmaWx0ZXJfY2FwcywKKyAgICBjb25zdCBnY2hhciAqIG91dHB1dF9jYXBzKQoreworICBHc3RFbGVtZW50ICpkZWludGVybGFjZSwgKmNhcHNmaWx0ZXI7CisgIEdzdFBhZCAqc2lua3BhZCwgKnNyY3BhZDsKKyAgR3N0Q2FwcyAqY2FwcywgKm91dGNhcHNfYWN0dWFsID0gTlVMTDsKKyAgR3N0Q2FwcyAqb3V0Y2Fwc19leHBlY3RlZCA9IE5VTEw7CisKKyAgZGVpbnRlcmxhY2UgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJkZWludGVybGFjZSIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZGVpbnRlcmxhY2UgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoZGVpbnRlcmxhY2UsICJtb2RlIiwgbW9kZSwgImZpZWxkcyIsIGZpZWxkcywgTlVMTCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChmaWx0ZXJfY2Fwcyk7CisgIGZhaWxfdW5sZXNzIChjYXBzICE9IE5VTEwpOworICBjYXBzZmlsdGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiY2Fwc2ZpbHRlciIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGNhcHNmaWx0ZXIsICJjYXBzIiwgY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGluayAoZGVpbnRlcmxhY2UsIGNhcHNmaWx0ZXIpKTsKKworICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGRlaW50ZXJsYWNlLCAic2luayIpOworICBmYWlsX3VubGVzcyAoc2lua3BhZCk7CisKKyAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGNhcHNmaWx0ZXIsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKHNyY3BhZCk7CisKKyAgZ3N0X3BhZF9hZGRfcHJvYmUgKHNyY3BhZCwgR1NUX1BBRF9QUk9CRV9UWVBFX0VWRU5UX0RPV05TVFJFQU0sCisgICAgICBjYXRjaF9jYXBzX2V2ZW50LCAmb3V0Y2Fwc19hY3R1YWwsIE5VTEwpOworCisgIGlmIChvdXRwdXRfY2FwcykgeworICAgIG91dGNhcHNfZXhwZWN0ZWQgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAob3V0cHV0X2NhcHMpOworICAgIGZhaWxfdW5sZXNzIChvdXRjYXBzX2V4cGVjdGVkICE9IE5VTEwpOworICB9CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZGVpbnRlcmxhY2UsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGNhcHNmaWx0ZXIsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChpbnB1dF9jYXBzKTsKKyAgZmFpbF91bmxlc3MgKGNhcHMgIT0gTlVMTCk7CisgIGdzdF9wYWRfc2VuZF9ldmVudCAoc2lua3BhZCwgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBpZiAob3V0cHV0X2NhcHMpIHsKKyAgICBnY2hhciAqYWN0dWFsOworCisgICAgZmFpbF9pZiAob3V0Y2Fwc19hY3R1YWwgPT0gTlVMTCwgIkV4cGVjdGVkICVzLCBnb3Qgbm8gY2FwcyIsIG91dHB1dF9jYXBzKTsKKyAgICBhY3R1YWwgPSBnc3RfY2Fwc190b19zdHJpbmcgKG91dGNhcHNfYWN0dWFsKTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfaXNfZXF1YWwgKG91dGNhcHNfYWN0dWFsLCBvdXRjYXBzX2V4cGVjdGVkKSwKKyAgICAgICAgIkV4cGVjdGVkICVzLCBnb3QgJXMiLCBvdXRwdXRfY2FwcywgYWN0dWFsKTsKKyAgICBnX2ZyZWUgKGFjdHVhbCk7CisgIH0gZWxzZSB7CisgICAgZ2NoYXIgKmFjdHVhbDsKKworICAgIGFjdHVhbCA9IGdzdF9jYXBzX3RvX3N0cmluZyAob3V0Y2Fwc19hY3R1YWwpOworICAgIGZhaWxfaWYgKG91dGNhcHNfYWN0dWFsICE9IE5VTEwsICJFeHBlY3RlZCBuZWdvdGlhdGlvbiBmYWlsdXJlLCBnb3QgJXMiLAorICAgICAgICBhY3R1YWwpOworICAgIGdfZnJlZSAoYWN0dWFsKTsKKyAgfQorCisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGRlaW50ZXJsYWNlLAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChjYXBzZmlsdGVyLAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworICBnc3Rfb2JqZWN0X3VucmVmIChkZWludGVybGFjZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGNhcHNmaWx0ZXIpOworCisgIGlmIChvdXRjYXBzX2V4cGVjdGVkKQorICAgIGdzdF9jYXBzX3VucmVmIChvdXRjYXBzX2V4cGVjdGVkKTsKKyAgaWYgKG91dGNhcHNfYWN0dWFsKQorICAgIGdzdF9jYXBzX3VucmVmIChvdXRjYXBzX2FjdHVhbCk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X21vZGVfZGlzYWJsZWRfZXhwZWN0ZWRfY2FwcykKK3sKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMiwgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXciLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMiwgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXciLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMiwgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXciLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMiwgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXciLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMiwgMCwKKyAgICAgICJ2aWRlby94LXJhdyhtZW1vcnk6U29tZU1lbW9yeSksIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3KEFOWSkiLAorICAgICAgInZpZGVvL3gtcmF3KG1lbW9yeTpTb21lTWVtb3J5KSwgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDIsIDAsCisgICAgICAidmlkZW8veC1yYXcobWVtb3J5OlNvbWVNZW1vcnkpLCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyhBTlkpIiwKKyAgICAgICJ2aWRlby94LXJhdyhtZW1vcnk6U29tZU1lbW9yeSksIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgyLCAxLAorICAgICAgInZpZGVvL3gtcmF3KG1lbW9yeTpTb21lTWVtb3J5KSwgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcoQU5ZKSIsCisgICAgICAidmlkZW8veC1yYXcobWVtb3J5OlNvbWVNZW1vcnkpLCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMiwgMSwKKyAgICAgICJ2aWRlby94LXJhdyhtZW1vcnk6U29tZU1lbW9yeSksIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3KEFOWSkiLAorICAgICAgInZpZGVvL3gtcmF3KG1lbW9yeTpTb21lTWVtb3J5KSwgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDIsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDIsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDIsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDIsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDIsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIsIE5VTEwpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDIsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgyLCAxLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiLCBOVUxMKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgyLCAxLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbW9kZV9pbnRlcmxhY2VkX2V4cGVjdGVkX2NhcHMpCit7CisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDEsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9NDAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDEsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9NDAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDEsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDEsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDEsIDAsCisgICAgICAidmlkZW8veC1yYXcobWVtb3J5OlNvbWVNZW1vcnkpLCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwgInZpZGVvL3gtcmF3KEFOWSkiLCBOVUxMKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgxLCAwLAorICAgICAgInZpZGVvL3gtcmF3KG1lbW9yeTpTb21lTWVtb3J5KSwgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsICJ2aWRlby94LXJhdyhBTlkpIiwgTlVMTCk7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMSwgMSwKKyAgICAgICJ2aWRlby94LXJhdyhtZW1vcnk6U29tZU1lbW9yeSksIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLCAidmlkZW8veC1yYXcoQU5ZKSIsIE5VTEwpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDEsIDEsCisgICAgICAidmlkZW8veC1yYXcobWVtb3J5OlNvbWVNZW1vcnkpLCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwgInZpZGVvL3gtcmF3KEFOWSkiLCBOVUxMKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgxLCAwLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9djIxMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwgInZpZGVvL3gtcmF3IiwgTlVMTCk7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMSwgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsICJ2aWRlby94LXJhdyIsIE5VTEwpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDEsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLCAidmlkZW8veC1yYXciLCBOVUxMKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgxLCAxLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9djIxMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwgInZpZGVvL3gtcmF3IiwgTlVMTCk7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMSwgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiwgTlVMTCk7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMSwgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiwgTlVMTCk7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMSwgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiwgTlVMTCk7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMSwgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiwgTlVMTCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbW9kZV9hdXRvX2V4cGVjdGVkX2NhcHMpCit7CisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9NDAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDAsCisgICAgICAidmlkZW8veC1yYXcobWVtb3J5OlNvbWVNZW1vcnkpLCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyhBTlkpIiwKKyAgICAgICJ2aWRlby94LXJhdyhtZW1vcnk6U29tZU1lbW9yeSksIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgwLCAwLAorICAgICAgInZpZGVvL3gtcmF3KG1lbW9yeTpTb21lTWVtb3J5KSwgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcoQU5ZKSIsCisgICAgICAidmlkZW8veC1yYXcobWVtb3J5OlNvbWVNZW1vcnkpLCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMCwgMSwKKyAgICAgICJ2aWRlby94LXJhdyhtZW1vcnk6U29tZU1lbW9yeSksIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3KEFOWSkiLAorICAgICAgInZpZGVvL3gtcmF3KG1lbW9yeTpTb21lTWVtb3J5KSwgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDEsCisgICAgICAidmlkZW8veC1yYXcobWVtb3J5OlNvbWVNZW1vcnkpLCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyhBTlkpIiwKKyAgICAgICJ2aWRlby94LXJhdyhtZW1vcnk6U29tZU1lbW9yeSksIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgwLCAwLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9djIxMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgwLCAwLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9djIxMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgwLCAxLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9djIxMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgwLCAxLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9djIxMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgwLCAwLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiLCBOVUxMKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgwLCAwLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMCwgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiwgTlVMTCk7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMCwgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIsIE5VTEwpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgwLCAxLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9djIxMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiLCBOVUxMKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgwLCAxLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9djIxMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9djIxMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbW9kZV9hdXRvX3N0cmljdF9leHBlY3RlZF9jYXBzKQoreworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgzLCAwLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgzLCAwLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTQwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgzLCAxLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgzLCAxLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgzLCAwLAorICAgICAgInZpZGVvL3gtcmF3KG1lbW9yeTpTb21lTWVtb3J5KSwgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcoQU5ZKSIsCisgICAgICAidmlkZW8veC1yYXcobWVtb3J5OlNvbWVNZW1vcnkpLCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMywgMCwKKyAgICAgICJ2aWRlby94LXJhdyhtZW1vcnk6U29tZU1lbW9yeSksIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLCAidmlkZW8veC1yYXcoQU5ZKSIsIE5VTEwpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDMsIDEsCisgICAgICAidmlkZW8veC1yYXcobWVtb3J5OlNvbWVNZW1vcnkpLCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdyhBTlkpIiwKKyAgICAgICJ2aWRlby94LXJhdyhtZW1vcnk6U29tZU1lbW9yeSksIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgzLCAxLAorICAgICAgInZpZGVvL3gtcmF3KG1lbW9yeTpTb21lTWVtb3J5KSwgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsICJ2aWRlby94LXJhdyhBTlkpIiwgTlVMTCk7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMywgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXciLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9djIxMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMywgMCwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsICJ2aWRlby94LXJhdyIsIE5VTEwpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDMsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3IiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PXYyMTAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDMsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLCAidmlkZW8veC1yYXciLCBOVUxMKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgzLCAwLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiLCBOVUxMKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgzLCAwLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQiLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMywgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiwgTlVMTCk7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMywgMSwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPWludGVybGVhdmVkIiwKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDMsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIsIE5VTEwpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDMsIDAsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIsIE5VTEwpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDMsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIsIE5VTEwpOworCisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDMsIDEsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD12MjEwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCIsIE5VTEwpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ZpZWxkc19hdXRvX2V4cGVjdGVkX2NhcHMpCit7CisgIGRlaW50ZXJsYWNlX3NldF9jYXBzX3dpdGhfZmlsdGVyX2FuZF9jaGVja19yZXN1bHQgKDAsIDMsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1pbnRlcmxlYXZlZCwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTIwLzEiLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT0yMC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMCwgMywKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9NDAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGZvcm1hdD1JNDIwLCB3aWR0aD0zMjAsIGhlaWdodD0yNDAsICIKKyAgICAgICJpbnRlcmxhY2UtbW9kZT1wcm9ncmVzc2l2ZSwgZnJhbWVyYXRlPTQwLzEiKTsKKworICBkZWludGVybGFjZV9zZXRfY2Fwc193aXRoX2ZpbHRlcl9hbmRfY2hlY2tfcmVzdWx0ICgwLCAzLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9aW50ZXJsZWF2ZWQsIGZyYW1lcmF0ZT0yMC8xIiwKKyAgICAgICJ2aWRlby94LXJhdywgaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUiLAorICAgICAgInZpZGVvL3gtcmF3LCBmb3JtYXQ9STQyMCwgd2lkdGg9MzIwLCBoZWlnaHQ9MjQwLCAiCisgICAgICAiaW50ZXJsYWNlLW1vZGU9cHJvZ3Jlc3NpdmUsIGZyYW1lcmF0ZT00MC8xIik7CisKKyAgZGVpbnRlcmxhY2Vfc2V0X2NhcHNfd2l0aF9maWx0ZXJfYW5kX2NoZWNrX3Jlc3VsdCAoMCwgMywKKyAgICAgICJ2aWRlby94LXJhdywgZm9ybWF0PUk0MjAsIHdpZHRoPTMyMCwgaGVpZ2h0PTI0MCwgIgorICAgICAgImludGVybGFjZS1tb2RlPWludGVybGVhdmVkLCBmcmFtZXJhdGU9MjAvMSIsCisgICAgICAidmlkZW8veC1yYXcsIGludGVybGFjZS1tb2RlPXByb2dyZXNzaXZlLCBmcmFtZXJhdGU9MTUvMSIsIE5VTEwpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworCitzdGF0aWMgU3VpdGUgKgorZGVpbnRlcmxhY2Vfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiZGVpbnRlcmxhY2UiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9zZXRfdGltZW91dCAodGNfY2hhaW4sIDE4MCk7CisKKyAgaWYgKCFnc3RfcmVnaXN0cnlfY2hlY2tfZmVhdHVyZV92ZXJzaW9uIChnc3RfcmVnaXN0cnlfZ2V0ICgpLCAiZGVpbnRlcmxhY2UiLAorICAgICAgICAgIEdTVF9WRVJTSU9OX01BSk9SLCBHU1RfVkVSU0lPTl9NSU5PUiwgR1NUX1ZFUlNJT05fTUlDUk8pKSB7CisgICAgR1NUX0VSUk9SICgiRklYTUU6IHBvcnQgZGVpbnRlcmxhY2UgZWxlbWVudCIpOworICAgIHJldHVybiBzOworICB9CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2NyZWF0ZV9hbmRfdW5yZWYpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbW9kZV9hdXRvX2FjY2VwdF9jYXBzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X21vZGVfZm9yY2VkX2FjY2VwdF9jYXBzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X21vZGVfZGlzYWJsZWRfYWNjZXB0X2NhcHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbW9kZV9kaXNhYmxlZF9wYXNzdGhyb3VnaCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9tb2RlX2F1dG9fZGVpbnRlcmxhY2VkX3Bhc3N0aHJvdWdoKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbW9kZV9kaXNhYmxlZF9leHBlY3RlZF9jYXBzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X21vZGVfaW50ZXJsYWNlZF9leHBlY3RlZF9jYXBzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X21vZGVfYXV0b19leHBlY3RlZF9jYXBzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X21vZGVfYXV0b19zdHJpY3RfZXhwZWN0ZWRfY2Fwcyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9maWVsZHNfYXV0b19leHBlY3RlZF9jYXBzKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGRlaW50ZXJsYWNlKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvZGVpbnRlcmxlYXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI0NjEwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2RlaW50ZXJsZWF2ZS5jCkBAIC0wLDAgKzEsNjU3IEBACisvKiBHU3RyZWFtZXIgdW5pdCB0ZXN0cyBmb3IgdGhlIGludGVybGVhdmUgZWxlbWVudAorICogQ29weXJpZ2h0IChDKSAyMDA4IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfY3JlYXRlX2FuZF91bnJlZikKK3sKKyAgR3N0RWxlbWVudCAqZGVpbnRlcmxlYXZlOworCisgIGRlaW50ZXJsZWF2ZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImRlaW50ZXJsZWF2ZSIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZGVpbnRlcmxlYXZlICE9IE5VTEwpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZGVpbnRlcmxlYXZlLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGRlaW50ZXJsZWF2ZSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIEdzdFBhZCAqbXlzcmNwYWQsICoqbXlzaW5rcGFkczsKK3N0YXRpYyBnaW50IG5zaW5rcGFkczsKK3N0YXRpYyBHc3RCdXMgKmJ1czsKK3N0YXRpYyBHc3RFbGVtZW50ICpkZWludGVybGVhdmU7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKEYzMikgIiwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCBsYXlvdXQgPSAoc3RyaW5nKSB7aW50ZXJsZWF2ZWQsIG5vbi1pbnRlcmxlYXZlZH0sIHJhdGUgPSAoaW50KSB7MzIwMDAsIDQ4MDAwfSIpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoRjMyKSAiLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIHsgMiwgMyB9LCBsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgcmF0ZSA9IChpbnQpIHszMjAwMCwgNDgwMDB9IikpOworCisjZGVmaW5lIENBUFNfMzJraHogXAorICAgICAgICAiYXVkaW8veC1yYXcsICIgXAorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIkdTVF9BVURJT19ORSAoRjMyKSAiLCAiIFwKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMiwgbGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICAgICAgICAicmF0ZSA9IChpbnQpIDMyMDAwIgorCisjZGVmaW5lIENBUFNfNDhraHogXAorICAgICAgICAiYXVkaW8veC1yYXcsICIgXAorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIkdTVF9BVURJT19ORSAoRjMyKSAiLCAiIFwKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMiwgbGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICAgICAgICAicmF0ZSA9IChpbnQpIDQ4MDAwIgorCisjZGVmaW5lIENBUFNfNDhraHpfM0NIIFwKKyAgICAgICAgImF1ZGlvL3gtcmF3LCAiIFwKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICJHU1RfQVVESU9fTkUgKEYzMikgIiwgIiBcCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDMsIGxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiIFwKKyAgICAgICAgInJhdGUgPSAoaW50KSA0ODAwMCIKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2RlaW50ZXJsZWF2ZV9jaGFpbl9mdW5jIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworICBnZmxvYXQgKmluZGF0YTsKKworICBmYWlsX3VubGVzcyAoR1NUX0lTX0JVRkZFUiAoYnVmZmVyKSk7CisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGluZGF0YSA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG1hcC5zaXplLCA0ODAwMCAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIGZhaWxfdW5sZXNzIChpbmRhdGEgIT0gTlVMTCk7CisKKyAgaWYgKHN0cmNtcCAoR1NUX1BBRF9OQU1FIChwYWQpLCAic2luazAiKSA9PSAwKSB7CisgICAgZm9yIChpID0gMDsgaSA8IDQ4MDAwOyBpKyspCisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfZmxvYXQgKGluZGF0YVtpXSwgLTEuMCk7CisgIH0gZWxzZSBpZiAoc3RyY21wIChHU1RfUEFEX05BTUUgKHBhZCksICJzaW5rMSIpID09IDApIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDgwMDA7IGkrKykKKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19mbG9hdCAoaW5kYXRhW2ldLCAxLjApOworICB9IGVsc2UgeworICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgdm9pZAorZGVpbnRlcmxlYXZlX3BhZF9hZGRlZCAoR3N0RWxlbWVudCAqIHNyYywgR3N0UGFkICogcGFkLCBncG9pbnRlciBkYXRhKQoreworICBnY2hhciAqbmFtZTsKKyAgZ2ludCBsaW5rID0gR1BPSU5URVJfVE9fSU5UIChkYXRhKTsKKworICBpZiAobnNpbmtwYWRzID49IGxpbmspCisgICAgcmV0dXJuOworCisgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzaW5rJWQiLCBuc2lua3BhZHMpOworCisgIG15c2lua3BhZHNbbnNpbmtwYWRzXSA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNpbmt0ZW1wbGF0ZSwgbmFtZSk7CisgIGdfZnJlZSAobmFtZSk7CisgIGZhaWxfaWYgKG15c2lua3BhZHNbbnNpbmtwYWRzXSA9PSBOVUxMKTsKKworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAobXlzaW5rcGFkc1tuc2lua3BhZHNdLCBkZWludGVybGVhdmVfY2hhaW5fZnVuYyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHBhZCwgbXlzaW5rcGFkc1tuc2lua3BhZHNdKSA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZHNbbnNpbmtwYWRzXSwgVFJVRSk7CisgIG5zaW5rcGFkcysrOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF8yX2NoYW5uZWxzKQoreworICBHc3RQYWQgKnNpbmtwYWQ7CisgIGdpbnQgaTsKKyAgR3N0QnVmZmVyICppbmJ1ZjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbmRhdGE7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDY0IGNoYW5uZWxfbWFzayA9IDA7CisKKyAgbXlzaW5rcGFkcyA9IGdfbmV3MCAoR3N0UGFkICosIDIpOworICBuc2lua3BhZHMgPSAwOworCisgIGRlaW50ZXJsZWF2ZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImRlaW50ZXJsZWF2ZSIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZGVpbnRlcmxlYXZlICE9IE5VTEwpOworCisgIG15c3JjcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmN0ZW1wbGF0ZSwgInNyYyIpOworICBmYWlsX3VubGVzcyAobXlzcmNwYWQgIT0gTlVMTCk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQ0FQU180OGtoeik7CisgIGNoYW5uZWxfbWFzayB8PQorICAgICAgR19HVUlOVDY0X0NPTlNUQU5UICgxKSA8PCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUOworICBjaGFubmVsX21hc2sgfD0KKyAgICAgIEdfR1VJTlQ2NF9DT05TVEFOVCAoMSkgPDwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQ7CisgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjaGFubmVsLW1hc2siLCBHU1RfVFlQRV9CSVRNQVNLLCBjaGFubmVsX21hc2ssCisgICAgICBOVUxMKTsKKworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgZGVpbnRlcmxlYXZlLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworCisgIHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZGVpbnRlcmxlYXZlLCAic2luayIpOworICBmYWlsX3VubGVzcyAoc2lua3BhZCAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAobXlzcmNwYWQsIHNpbmtwYWQpID09IEdTVF9QQURfTElOS19PSyk7CisgIGdfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChkZWludGVybGVhdmUsICJwYWQtYWRkZWQiLAorICAgICAgR19DQUxMQkFDSyAoZGVpbnRlcmxlYXZlX3BhZF9hZGRlZCksIEdJTlRfVE9fUE9JTlRFUiAoMikpOworCisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChkZWludGVybGVhdmUsIGJ1cyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZGVpbnRlcmxlYXZlLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGluYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgyICogNDgwMDAgKiBzaXplb2YgKGdmbG9hdCkpOworICBpbmJ1ZiA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoaW5idWYpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbmRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMiAqIDQ4MDAwOyBpICs9IDIpIHsKKyAgICBpbmRhdGFbaV0gPSAtMS4wOworICAgIGluZGF0YVtpICsgMV0gPSAxLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWYsICZtYXApOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZikgPT0gR1NUX0ZMT1dfT0spOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGRlaW50ZXJsZWF2ZSwKKyAgICAgICAgICBHU1RfU1RBVEVfTlVMTCkgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnNpbmtwYWRzOyBpKyspCisgICAgZ19vYmplY3RfdW5yZWYgKG15c2lua3BhZHNbaV0pOworICBnX2ZyZWUgKG15c2lua3BhZHMpOworICBteXNpbmtwYWRzID0gTlVMTDsKKworICBnX29iamVjdF91bnJlZiAoZGVpbnRlcmxlYXZlKTsKKyAgZ3N0X2J1c19zZXRfZmx1c2hpbmcgKGJ1cywgVFJVRSk7CisgIGdfb2JqZWN0X3VucmVmIChidXMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKG15c3JjcGFkKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF8yX2NoYW5uZWxzXzFfbGlua2VkKQoreworICBHc3RQYWQgKnNpbmtwYWQ7CisgIGdpbnQgaTsKKyAgR3N0QnVmZmVyICppbmJ1ZjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Zsb2F0ICppbmRhdGE7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDY0IGNoYW5uZWxfbWFzayA9IDA7CisKKyAgbnNpbmtwYWRzID0gMDsKKyAgbXlzaW5rcGFkcyA9IGdfbmV3MCAoR3N0UGFkICosIDIpOworCisgIGRlaW50ZXJsZWF2ZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImRlaW50ZXJsZWF2ZSIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZGVpbnRlcmxlYXZlICE9IE5VTEwpOworCisgIG15c3JjcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmN0ZW1wbGF0ZSwgInNyYyIpOworICBmYWlsX3VubGVzcyAobXlzcmNwYWQgIT0gTlVMTCk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQ0FQU180OGtoeik7CisgIGNoYW5uZWxfbWFzayB8PQorICAgICAgR19HVUlOVDY0X0NPTlNUQU5UICgxKSA8PCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUOworICBjaGFubmVsX21hc2sgfD0KKyAgICAgIEdfR1VJTlQ2NF9DT05TVEFOVCAoMSkgPDwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQ7CisgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjaGFubmVsLW1hc2siLCBHU1RfVFlQRV9CSVRNQVNLLCBjaGFubmVsX21hc2ssCisgICAgICBOVUxMKTsKKworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgZGVpbnRlcmxlYXZlLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworCisgIHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZGVpbnRlcmxlYXZlLCAic2luayIpOworICBmYWlsX3VubGVzcyAoc2lua3BhZCAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAobXlzcmNwYWQsIHNpbmtwYWQpID09IEdTVF9QQURfTElOS19PSyk7CisgIGdfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChkZWludGVybGVhdmUsICJwYWQtYWRkZWQiLAorICAgICAgR19DQUxMQkFDSyAoZGVpbnRlcmxlYXZlX3BhZF9hZGRlZCksIEdJTlRfVE9fUE9JTlRFUiAoMSkpOworCisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChkZWludGVybGVhdmUsIGJ1cyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZGVpbnRlcmxlYXZlLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGluYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgyICogNDgwMDAgKiBzaXplb2YgKGdmbG9hdCkpOworICBpbmJ1ZiA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoaW5idWYpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbmRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMiAqIDQ4MDAwOyBpICs9IDIpIHsKKyAgICBpbmRhdGFbaV0gPSAtMS4wOworICAgIGluZGF0YVtpICsgMV0gPSAxLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWYsICZtYXApOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZikgPT0gR1NUX0ZMT1dfT0spOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGRlaW50ZXJsZWF2ZSwKKyAgICAgICAgICBHU1RfU1RBVEVfTlVMTCkgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnNpbmtwYWRzOyBpKyspCisgICAgZ19vYmplY3RfdW5yZWYgKG15c2lua3BhZHNbaV0pOworICBnX2ZyZWUgKG15c2lua3BhZHMpOworICBteXNpbmtwYWRzID0gTlVMTDsKKworICBnX29iamVjdF91bnJlZiAoZGVpbnRlcmxlYXZlKTsKKyAgZ3N0X2J1c19zZXRfZmx1c2hpbmcgKGJ1cywgVFJVRSk7CisgIGdfb2JqZWN0X3VucmVmIChidXMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKG15c3JjcGFkKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF8yX2NoYW5uZWxzX2NhcHNfY2hhbmdlKQoreworICBHc3RQYWQgKnNpbmtwYWQ7CisgIEdzdENhcHMgKmNhcHMsICpjYXBzMjsKKyAgR3N0Q2FwcyAqcmV0X2NhcHM7CisgIGdpbnQgaTsKKyAgR3N0QnVmZmVyICppbmJ1ZjsKKyAgZ2Zsb2F0ICppbmRhdGE7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDY0IGNoYW5uZWxfbWFzazsKKworICBuc2lua3BhZHMgPSAwOworICBteXNpbmtwYWRzID0gZ19uZXcwIChHc3RQYWQgKiwgMik7CisKKyAgZGVpbnRlcmxlYXZlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZGVpbnRlcmxlYXZlIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChkZWludGVybGVhdmUgIT0gTlVMTCk7CisKKyAgbXlzcmNwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNyY3RlbXBsYXRlLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChteXNyY3BhZCAhPSBOVUxMKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKENBUFNfNDhraHopOworICBjaGFubmVsX21hc2sgPSAwOworICBjaGFubmVsX21hc2sgfD0KKyAgICAgIEdfR1VJTlQ2NF9DT05TVEFOVCAoMSkgPDwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVDsKKyAgY2hhbm5lbF9tYXNrIHw9CisgICAgICBHX0dVSU5UNjRfQ09OU1RBTlQgKDEpIDw8IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUOworICBnc3RfY2Fwc19zZXRfc2ltcGxlIChjYXBzLCAiY2hhbm5lbC1tYXNrIiwgR1NUX1RZUEVfQklUTUFTSywgY2hhbm5lbF9tYXNrLAorICAgICAgTlVMTCk7CisKKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChkZWludGVybGVhdmUsICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChzaW5rcGFkICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rIChteXNyY3BhZCwgc2lua3BhZCkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ19vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworCisgIHJldF9jYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKG15c3JjcGFkLCBjYXBzKTsKKyAgZmFpbF9pZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKHJldF9jYXBzKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3BlZXJfcXVlcnlfYWNjZXB0X2NhcHMgKG15c3JjcGFkLCBjYXBzKSk7CisgIGdzdF9jYXBzX3VucmVmIChyZXRfY2Fwcyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBkZWludGVybGVhdmUsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisKKyAgZ19zaWduYWxfY29ubmVjdCAoZGVpbnRlcmxlYXZlLCAicGFkLWFkZGVkIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKGRlaW50ZXJsZWF2ZV9wYWRfYWRkZWQpLCBHSU5UX1RPX1BPSU5URVIgKDIpKTsKKworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAoZGVpbnRlcmxlYXZlLCBidXMpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGRlaW50ZXJsZWF2ZSwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBpbmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMiAqIDQ4MDAwICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgaW5idWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKGluYnVmKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW5kYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDIgKiA0ODAwMDsgaSArPSAyKSB7CisgICAgaW5kYXRhW2ldID0gLTEuMDsKKyAgICBpbmRhdGFbaSArIDFdID0gMS4wOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmLCAmbWFwKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWYpID09IEdTVF9GTE9XX09LKTsKKworICBjYXBzMiA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChDQVBTXzMya2h6KTsKKyAgY2hhbm5lbF9tYXNrID0gMDsKKyAgY2hhbm5lbF9tYXNrIHw9CisgICAgICBHX0dVSU5UNjRfQ09OU1RBTlQgKDEpIDw8IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQ7CisgIGNoYW5uZWxfbWFzayB8PQorICAgICAgR19HVUlOVDY0X0NPTlNUQU5UICgxKSA8PCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVDsKKyAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwczIsICJjaGFubmVsLW1hc2siLCBHU1RfVFlQRV9CSVRNQVNLLCBjaGFubmVsX21hc2ssCisgICAgICBOVUxMKTsKKyAgcmV0X2NhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAobXlzcmNwYWQsIGNhcHMyKTsKKyAgZmFpbF9pZiAoZ3N0X2NhcHNfaXNfZW1wdHkgKHJldF9jYXBzKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3BlZXJfcXVlcnlfYWNjZXB0X2NhcHMgKG15c3JjcGFkLCBjYXBzMikpOworICBnc3RfY2Fwc191bnJlZiAocmV0X2NhcHMpOworICBnc3RfcGFkX3NldF9jYXBzIChteXNyY3BhZCwgY2FwczIpOworCisgIGluYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgyICogNDgwMDAgKiBzaXplb2YgKGdmbG9hdCkpOworICBpbmJ1ZiA9IGdzdF9idWZmZXJfbWFrZV93cml0YWJsZSAoaW5idWYpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbmRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMiAqIDQ4MDAwOyBpICs9IDIpIHsKKyAgICBpbmRhdGFbaV0gPSAtMS4wOworICAgIGluZGF0YVtpICsgMV0gPSAxLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWYsICZtYXApOworCisgIC8qIFNob3VsZCB3b3JrIGZpbmUgYmVjYXVzZSB0aGUgY2FwcyBjaGFuZ2VkIGluIGEgY29tcGF0aWJsZSB3YXkgKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmKSA9PSBHU1RfRkxPV19PSyk7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMyKTsKKworICBjYXBzMiA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChDQVBTXzQ4a2h6XzNDSCk7CisgIGNoYW5uZWxfbWFzayA9IDA7CisgIGNoYW5uZWxfbWFzayB8PQorICAgICAgR19HVUlOVDY0X0NPTlNUQU5UICgxKSA8PCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUOworICBjaGFubmVsX21hc2sgfD0KKyAgICAgIEdfR1VJTlQ2NF9DT05TVEFOVCAoMSkgPDwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQ7CisgIGNoYW5uZWxfbWFzayB8PQorICAgICAgR19HVUlOVDY0X0NPTlNUQU5UICgxKSA8PCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9DRU5URVI7CisgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMyLCAiY2hhbm5lbC1tYXNrIiwgR1NUX1RZUEVfQklUTUFTSywgY2hhbm5lbF9tYXNrLAorICAgICAgTlVMTCk7CisgIHJldF9jYXBzID0gZ3N0X3BhZF9wZWVyX3F1ZXJ5X2NhcHMgKG15c3JjcGFkLCBjYXBzMik7CisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19pc19lbXB0eSAocmV0X2NhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHJldF9jYXBzKTsKKyAgZmFpbF9pZiAoZ3N0X3BhZF9wZWVyX3F1ZXJ5X2FjY2VwdF9jYXBzIChteXNyY3BhZCwgY2FwczIpKTsKKyAgZ3N0X3BhZF9zZXRfY2FwcyAobXlzcmNwYWQsIGNhcHMyKTsKKworICBpbmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMyAqIDQ4MDAwICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgaW5idWYgPSBnc3RfYnVmZmVyX21ha2Vfd3JpdGFibGUgKGluYnVmKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW5kYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDMgKiA0ODAwMDsgaSArPSAzKSB7CisgICAgaW5kYXRhW2ldID0gLTEuMDsKKyAgICBpbmRhdGFbaSArIDFdID0gMS4wOworICAgIGluZGF0YVtpICsgMl0gPSAwLjA7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWYsICZtYXApOworCisgIC8qIFNob3VsZCBicmVhayBiZWNhdXNlIHRoZSBjYXBzIGNoYW5nZWQgaW4gYW4gaW5jb21wYXRpYmxlIHdheSAqLworICBmYWlsX2lmIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZikgPT0gR1NUX0ZMT1dfT0spOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGRlaW50ZXJsZWF2ZSwKKyAgICAgICAgICBHU1RfU1RBVEVfTlVMTCkgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnNpbmtwYWRzOyBpKyspCisgICAgZ19vYmplY3RfdW5yZWYgKG15c2lua3BhZHNbaV0pOworICBnX2ZyZWUgKG15c2lua3BhZHMpOworICBteXNpbmtwYWRzID0gTlVMTDsKKworICBnX29iamVjdF91bnJlZiAoZGVpbnRlcmxlYXZlKTsKKyAgZ3N0X2J1c19zZXRfZmx1c2hpbmcgKGJ1cywgVFJVRSk7CisgIGdfb2JqZWN0X3VucmVmIChidXMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzMik7CisgIGdzdF9vYmplY3RfdW5yZWYgKG15c3JjcGFkKTsKK30KKworR1NUX0VORF9URVNUOworCisKKyNkZWZpbmUgU0FNUExFU19QRVJfQlVGRkVSICAxMAorI2RlZmluZSBOVU1fQ0hBTk5FTFMgICAgICAgIDgKKyNkZWZpbmUgU0FNUExFX1JBVEUgICAgICAgICA0NDEwMAorCitzdGF0aWMgZ3VpbnQgcGFkc19jcmVhdGVkOworCitzdGF0aWMgdm9pZAorc2V0X2NoYW5uZWxfcG9zaXRpb25zIChHc3RDYXBzICogY2FwcywgaW50IGNoYW5uZWxzLAorICAgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uICogY2hhbm5lbHBvc2l0aW9ucykKK3sKKyAgaW50IGM7CisgIGd1aW50NjQgY2hhbm5lbF9tYXNrID0gMDsKKworICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykKKyAgICBjaGFubmVsX21hc2sgfD0gR19HVUlOVDY0X0NPTlNUQU5UICgxKSA8PCBjaGFubmVscG9zaXRpb25zW2NdOworCisgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJjaGFubmVsLW1hc2siLCBHU1RfVFlQRV9CSVRNQVNLLCBjaGFubmVsX21hc2ssCisgICAgICBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3NyY19oYW5kb2ZmX2Zsb2F0MzJfOGNoIChHc3RFbGVtZW50ICogc3JjLCBHc3RCdWZmZXIgKiBidWYsIEdzdFBhZCAqIHBhZCwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGdmbG9hdCAqZGF0YSwgKnA7CisgIGd1aW50IHNpemUsIGksIGM7CisKKyAgc2l6ZSA9IHNpemVvZiAoZ2Zsb2F0KSAqIFNBTVBMRVNfUEVSX0JVRkZFUiAqIE5VTV9DSEFOTkVMUzsKKyAgZGF0YSA9IHAgPSAoZ2Zsb2F0ICopIGdfbWFsbG9jIChzaXplKTsKKworICBmb3IgKGkgPSAwOyBpIDwgU0FNUExFU19QRVJfQlVGRkVSOyArK2kpIHsKKyAgICBmb3IgKGMgPSAwOyBjIDwgTlVNX0NIQU5ORUxTOyArK2MpIHsKKyAgICAgICpwID0gKGdmbG9hdCkgKChpICogTlVNX0NIQU5ORUxTKSArIGMpOworICAgICAgKytwOworICAgIH0KKyAgfQorCisgIGlmIChnc3RfYnVmZmVyX25fbWVtb3J5IChidWYpKSB7CisgICAgZ3N0X2J1ZmZlcl9yZXBsYWNlX21lbW9yeV9yYW5nZSAoYnVmLCAwLCAtMSwKKyAgICAgICAgZ3N0X21lbW9yeV9uZXdfd3JhcHBlZCAoMCwgZGF0YSwgc2l6ZSwgMCwgc2l6ZSwgZGF0YSwgZ19mcmVlKSk7CisgIH0gZWxzZSB7CisgICAgZ3N0X2J1ZmZlcl9pbnNlcnRfbWVtb3J5IChidWYsIDAsCisgICAgICAgIGdzdF9tZW1vcnlfbmV3X3dyYXBwZWQgKDAsIGRhdGEsIHNpemUsIDAsIHNpemUsIGRhdGEsIGdfZnJlZSkpOworICB9CisgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpID0gMDsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikgPSAwOworfQorCitzdGF0aWMgR3N0UGFkUHJvYmVSZXR1cm4KK3NyY19ldmVudF9wcm9iZSAoR3N0UGFkICogcGFkLCBHc3RQYWRQcm9iZUluZm8gKiBpbmZvLCBncG9pbnRlciB1c2VyZGF0YSkKK3sKKyAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gbGF5b3V0W05VTV9DSEFOTkVMU107CisgIEdzdENhcHMgKmNhcHM7CisgIGd1aW50IGk7CisKKyAgaWYgKChpbmZvLT50eXBlICYgR1NUX1BBRF9QUk9CRV9UWVBFX0VWRU5UX0RPV05TVFJFQU0pCisgICAgICAmJiBHU1RfRVZFTlRfVFlQRSAoaW5mby0+ZGF0YSkgPT0gR1NUX0VWRU5UX1NUUkVBTV9TVEFSVCkgeworICAgIGdzdF9wYWRfcmVtb3ZlX3Byb2JlIChwYWQsIGluZm8tPmlkKTsKKworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgR1NUX0FVRElPX05FIChGMzIpLAorICAgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCBOVU1fQ0hBTk5FTFMsCisgICAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAiaW50ZXJsZWF2ZWQiLAorICAgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIFNBTVBMRV9SQVRFLCBOVUxMKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fQ0hBTk5FTFM7ICsraSkKKyAgICAgIGxheW91dFtpXSA9IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQgKyBpOworCisgICAgc2V0X2NoYW5uZWxfcG9zaXRpb25zIChjYXBzLCBOVU1fQ0hBTk5FTFMsIGxheW91dCk7CisgICAgZ3N0X3BhZF9zZXRfY2FwcyAocGFkLCBjYXBzKTsKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIH0KKworICByZXR1cm4gR1NUX1BBRF9QUk9CRV9PSzsKK30KKworc3RhdGljIEdzdFBhZFByb2JlUmV0dXJuCitmbG9hdF9idWZmZXJfY2hlY2tfcHJvYmUgKEdzdFBhZCAqIHBhZCwgR3N0UGFkUHJvYmVJbmZvICogaW5mbywKKyAgICBncG9pbnRlciB1c2VyZGF0YSkKK3sKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdmbG9hdCAqZGF0YTsKKyAgZ3VpbnQgcGFkbnVtLCBudW1wYWRzOworICBndWludCBudW0sIGk7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgR3N0QXVkaW9DaGFubmVsUG9zaXRpb24gKnBvczsKKyAgZ2ludCBjaGFubmVsczsKKyAgR3N0QnVmZmVyICpidWZmZXIgPSBHU1RfUEFEX1BST0JFX0lORk9fQlVGRkVSIChpbmZvKTsKKyAgR3N0QXVkaW9JbmZvIGF1ZGlvX2luZm87CisgIGd1aW50IHBhZF9pZCA9IEdQT0lOVEVSX1RPX1VJTlQgKHVzZXJkYXRhKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChzc2NhbmYgKEdTVF9QQURfTkFNRSAocGFkKSwgInNyY18ldSIsICZwYWRudW0pLCAxKTsKKworICBudW1wYWRzID0gcGFkc19jcmVhdGVkOworCisgIC8qIENoZWNrIGNhcHMgKi8KKyAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFkKTsKKyAgZmFpbF91bmxlc3MgKGNhcHMgIT0gTlVMTCk7CisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImNoYW5uZWxzIiwgJmNoYW5uZWxzKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGNoYW5uZWxzLCAxKTsKKworICBnc3RfYXVkaW9faW5mb19pbml0ICgmYXVkaW9faW5mbyk7CisgIGZhaWxfdW5sZXNzIChnc3RfYXVkaW9faW5mb19mcm9tX2NhcHMgKCZhdWRpb19pbmZvLCBjYXBzKSk7CisKKyAgcG9zID0gYXVkaW9faW5mby5wb3NpdGlvbjsKKyAgZmFpbF91bmxlc3MgKHBvcyAhPSBOVUxMCisgICAgICAmJiBwb3NbMF0gPT0gR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCArIHBhZF9pZCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBkYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgbnVtID0gbWFwLnNpemUgLyBzaXplb2YgKGdmbG9hdCk7CisKKyAgLyogQ2hlY2sgYnVmZmVyIGNvbnRlbnQgKi8KKyAgZm9yIChpID0gMDsgaSA8IG51bTsgKytpKSB7CisgICAgZ3VpbnQgdmFsLCByZXN0OworCisgICAgdmFsID0gKGd1aW50KSBkYXRhW2ldOworICAgIEdTVF9MT0cgKCIlc1sldV06ICU4ZiIsIEdTVF9QQURfTkFNRSAocGFkKSwgaSwgZGF0YVtpXSk7CisgICAgLyogY2FuJ3QgdXNlIHRoZSBtb2R1bG8gb3BlcmF0b3IgaW4gdGhlIGFzc2VydGlvbiBzdGF0ZW1lbnQsIHNpbmNlIGR1ZSB0bworICAgICAqIHRoZSB3YXkgaXQgZ2V0cyBleHBhbmRlZCBpdCB3b3VsZCBiZSBpbnRlcnByZXRlZCBhcyBhIHByaW50ZiBvcGVyYXRvcgorICAgICAqIGluIHRoZSBmYWlsdXJlIGNhc2UsIHdoaWNoIHdpbGwgcmVzdWx0IGluIHNlZ2ZhdWx0cyAqLworICAgIHJlc3QgPSB2YWwgJSBudW1wYWRzOworICAgIC8qIGNoZWNrIHRoYXQgdGhlIGZpcnN0IGNoYW5uZWwgaXMgb24gcGFkIHNyYzAsIHRoZSBzZWNvbmQgb24gc3JjMSBldGMuICovCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAocmVzdCwgcGFkbnVtKTsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIHJldHVybiBHU1RfUEFEX1BST0JFX09LOyAgICAgIC8qIGRvbid0IGRyb3AgZGF0YSAqLworfQorCitzdGF0aWMgdm9pZAorcGFkX2FkZGVkX3NldHVwX2RhdGFfY2hlY2tfZmxvYXQzMl84Y2hfY2IgKEdzdEVsZW1lbnQgKiBkZWludGVybGVhdmUsCisgICAgR3N0UGFkICogcGFkLCBHc3RFbGVtZW50ICogcGlwZWxpbmUpCit7CisgIEdzdEVsZW1lbnQgKnF1ZXVlLCAqc2luazsKKyAgR3N0UGFkICpzaW5rcGFkOworCisgIHF1ZXVlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicXVldWUiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHF1ZXVlICE9IE5VTEwpOworCisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoc2luayAhPSBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHF1ZXVlLCBzaW5rLCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKHF1ZXVlLCAic3JjIiwgc2luaywgInNpbmsiLAorICAgICAgR1NUX1BBRF9MSU5LX0NIRUNLX05PVEhJTkcpOworCisgIHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocXVldWUsICJzaW5rIik7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3BhZF9saW5rIChwYWQsIHNpbmtwYWQpLCBHU1RfUEFEX0xJTktfT0spOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKworICBnc3RfcGFkX2FkZF9wcm9iZSAocGFkLCBHU1RfUEFEX1BST0JFX1RZUEVfQlVGRkVSLCBmbG9hdF9idWZmZXJfY2hlY2tfcHJvYmUsCisgICAgICBHVUlOVF9UT19QT0lOVEVSIChwYWRzX2NyZWF0ZWQpLCBOVUxMKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNpbmssIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChxdWV1ZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIEdTVF9MT0cgKCJuZXcgcGFkOiAlcyIsIEdTVF9QQURfTkFNRSAocGFkKSk7CisgICsrcGFkc19jcmVhdGVkOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCittYWtlX2Zha2Vfc3JjXzhjaGFuc19mbG9hdDMyICh2b2lkKQoreworICBHc3RFbGVtZW50ICpzcmM7CisgIEdzdFBhZCAqcGFkOworCisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzcmMiLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChzcmMgIT0gTlVMTCwgImZhaWxlZCB0byBjcmVhdGUgZmFrZXNyYyBlbGVtZW50Iik7CisKKyAgZ19vYmplY3Rfc2V0IChzcmMsICJudW0tYnVmZmVycyIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNyYywgInNpZ25hbC1oYW5kb2ZmcyIsIFRSVUUsIE5VTEwpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNyYywgImhhbmRvZmYiLCBHX0NBTExCQUNLIChzcmNfaGFuZG9mZl9mbG9hdDMyXzhjaCksIE5VTEwpOworCisgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzcmMsICJzcmMiKTsKKyAgZ3N0X3BhZF9hZGRfcHJvYmUgKHBhZCwgR1NUX1BBRF9QUk9CRV9UWVBFX0VWRU5UX0RPV05TVFJFQU0sIHNyY19ldmVudF9wcm9iZSwKKyAgICAgIE5VTEwsIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworCisgIHJldHVybiBzcmM7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0XzhfY2hhbm5lbHNfZmxvYXQzMikKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmUsICpzcmMsICpkZWludGVybGVhdmU7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKworICBwaXBlbGluZSA9IChHc3RFbGVtZW50ICopIGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBmYWlsX3VubGVzcyAocGlwZWxpbmUgIT0gTlVMTCwgImZhaWxlZCB0byBjcmVhdGUgcGlwZWxpbmUiKTsKKworICBzcmMgPSBtYWtlX2Zha2Vfc3JjXzhjaGFuc19mbG9hdDMyICgpOworCisgIGRlaW50ZXJsZWF2ZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImRlaW50ZXJsZWF2ZSIsICJkZWludGVybGVhdmUiKTsKKyAgZmFpbF91bmxlc3MgKGRlaW50ZXJsZWF2ZSAhPSBOVUxMLCAiZmFpbGVkIHRvIGNyZWF0ZSBkZWludGVybGVhdmUgZWxlbWVudCIpOworICBnX29iamVjdF9zZXQgKGRlaW50ZXJsZWF2ZSwgImtlZXAtcG9zaXRpb25zIiwgVFJVRSwgTlVMTCk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMsIGRlaW50ZXJsZWF2ZSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmsgKHNyYywgZGVpbnRlcmxlYXZlKSwKKyAgICAgICJmYWlsZWQgdG8gbGluayBzcmMgPD0+IGRlaW50ZXJsZWF2ZSIpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGRlaW50ZXJsZWF2ZSwgInBhZC1hZGRlZCIsCisgICAgICBHX0NBTExCQUNLIChwYWRfYWRkZWRfc2V0dXBfZGF0YV9jaGVja19mbG9hdDMyXzhjaF9jYiksIHBpcGVsaW5lKTsKKworICBwYWRzX2NyZWF0ZWQgPSAwOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICBtc2cgPSBnc3RfYnVzX3BvbGwgKEdTVF9FTEVNRU5UX0JVUyAocGlwZWxpbmUpLCBHU1RfTUVTU0FHRV9FT1MsIC0xKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAocGFkc19jcmVhdGVkLCBOVU1fQ0hBTk5FTFMpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitkZWludGVybGVhdmVfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiZGVpbnRlcmxlYXZlIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2Vfc2V0X3RpbWVvdXQgKHRjX2NoYWluLCAxODApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfY3JlYXRlX2FuZF91bnJlZik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF8yX2NoYW5uZWxzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0XzJfY2hhbm5lbHNfMV9saW5rZWQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfMl9jaGFubmVsc19jYXBzX2NoYW5nZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF84X2NoYW5uZWxzX2Zsb2F0MzIpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoZGVpbnRlcmxlYXZlKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2R0bWYuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2R0bWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmFlMzZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvZHRtZi5jCkBAIC0wLDAgKzEsNTg4IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIGR0bWYgZWxlbWVudHMKKyAqIENvcHlyaWdodCAoQykgMjAxMyBDb2xsYWJvcmEgTHRkCisgKiAgIEBhdXRob3I6IE9saXZpZXIgQ3JldGUgPG9saXZpZXIuY3JldGVAY29sbGFib3JhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdHRlc3RjbG9jay5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKworLyogSW5jbHVkZSB0aGlzIGZyb20gdGhlIHBsdWdpbiB0byBnZXQgdGhlIGRlZmluZXMgKi8KKworI2luY2x1ZGUgIi4uLy4uL2dzdC9kdG1mL2dzdGR0bWZjb21tb24uaCIKKworI2RlZmluZSBFTkRfQklUICgxPDw3KQorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgYXVkaW9fc2lua190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgXCIiIEdTVF9BVURJT19ORSAoUzE2KSAiXCIsICIKKyAgICAgICAgInJhdGUgPSAiIEdTVF9BVURJT19SQVRFX1JBTkdFICIsICIgImNoYW5uZWxzID0gKGludCkgMSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHJ0cF9kdG1mX3NyY190ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgIm1lZGlhID0gKHN0cmluZykgXCJhdWRpb1wiLCAiCisgICAgICAgICJwYXlsb2FkID0gKGludCkgIiBHU1RfUlRQX1BBWUxPQURfRFlOQU1JQ19TVFJJTkcgIiwgIgorICAgICAgICAiY2xvY2stcmF0ZSA9IChpbnQpIFsgMCwgTUFYIF0sICIKKyAgICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIlRFTEVQSE9ORS1FVkVOVFwiIikKKyAgICApOworCisKK3N0YXRpYyB2b2lkCitjaGVja19nZXRfZHRtZl9ldmVudF9tZXNzYWdlIChHc3RCdXMgKiBidXMsIGdpbnQgbnVtYmVyLCBnaW50IHZvbHVtZSkKK3sKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgZ2Jvb2xlYW4gaGF2ZV9tZXNzYWdlID0gRkFMU0U7CisKKyAgd2hpbGUgKCFoYXZlX21lc3NhZ2UgJiYKKyAgICAgIChtZXNzYWdlID0gZ3N0X2J1c19wb3BfZmlsdGVyZWQgKGJ1cywgR1NUX01FU1NBR0VfRUxFTUVOVCkpICE9IE5VTEwpIHsKKyAgICBpZiAoZ3N0X21lc3NhZ2VfaGFzX25hbWUgKG1lc3NhZ2UsICJkdG1mLWV2ZW50IikpIHsKKyAgICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1lc3NhZ2UpOworICAgICAgZ2ludCBzdHlwZSwgc251bWJlciwgc21ldGhvZCwgc3ZvbHVtZTsKKworICAgICAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfZ2V0IChzLAorICAgICAgICAgICAgICAidHlwZSIsIEdfVFlQRV9JTlQsICZzdHlwZSwKKyAgICAgICAgICAgICAgIm51bWJlciIsIEdfVFlQRV9JTlQsICZzbnVtYmVyLAorICAgICAgICAgICAgICAibWV0aG9kIiwgR19UWVBFX0lOVCwgJnNtZXRob2QsCisgICAgICAgICAgICAgICJ2b2x1bWUiLCBHX1RZUEVfSU5ULCAmc3ZvbHVtZSwgTlVMTCkpOworCisgICAgICBmYWlsX3VubGVzcyAoc3R5cGUgPT0gMSk7CisgICAgICBmYWlsX3VubGVzcyAoc21ldGhvZCA9PSAxKTsKKyAgICAgIGZhaWxfdW5sZXNzIChzbnVtYmVyID09IG51bWJlcik7CisgICAgICBmYWlsX3VubGVzcyAoc3ZvbHVtZSA9PSB2b2x1bWUpOworICAgICAgaGF2ZV9tZXNzYWdlID0gVFJVRTsKKyAgICB9CisgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICB9CisKKyAgZmFpbF91bmxlc3MgKGhhdmVfbWVzc2FnZSk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19ub19kdG1mX2V2ZW50X21lc3NhZ2UgKEdzdEJ1cyAqIGJ1cykKK3sKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgZ2Jvb2xlYW4gaGF2ZV9tZXNzYWdlID0gRkFMU0U7CisKKyAgd2hpbGUgKCFoYXZlX21lc3NhZ2UgJiYKKyAgICAgIChtZXNzYWdlID0gZ3N0X2J1c19wb3BfZmlsdGVyZWQgKGJ1cywgR1NUX01FU1NBR0VfRUxFTUVOVCkpICE9IE5VTEwpIHsKKyAgICBpZiAoZ3N0X21lc3NhZ2VfaGFzX25hbWUgKG1lc3NhZ2UsICJkdG1mLWV2ZW50IikgfHwKKyAgICAgICAgZ3N0X21lc3NhZ2VfaGFzX25hbWUgKG1lc3NhZ2UsICJkdG1mLWV2ZW50LXByb2Nlc3NlZCIpIHx8CisgICAgICAgIGdzdF9tZXNzYWdlX2hhc19uYW1lIChtZXNzYWdlLCAiZHRtZi1ldmVudC1kcm9wcGVkIikpIHsKKyAgICAgIGhhdmVfbWVzc2FnZSA9IFRSVUU7CisgICAgfQorICAgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgfQorCisgIGZhaWxfdW5sZXNzICghaGF2ZV9tZXNzYWdlKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2J1ZmZlcnNfZHVyYXRpb24gKEdzdENsb2NrVGltZSBleHBlY3RlZF9kdXJhdGlvbikKK3sKKyAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uID0gMDsKKworICB3aGlsZSAoYnVmZmVycykgeworICAgIEdzdEJ1ZmZlciAqYnVmID0gYnVmZmVycy0+ZGF0YTsKKworICAgIGJ1ZmZlcnMgPSBnX2xpc3RfZGVsZXRlX2xpbmsgKGJ1ZmZlcnMsIGJ1ZmZlcnMpOworCisgICAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfRFVSQVRJT05fSVNfVkFMSUQgKGJ1ZikpOworICAgIGR1cmF0aW9uICs9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1Zik7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgfQorCisgIGZhaWxfdW5sZXNzIChkdXJhdGlvbiA9PSBleHBlY3RlZF9kdXJhdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX3J0cF9wYWNrZXQgKEdzdFBhZCAqIHNyYywgZ3VpbnQgdGltZXN0YW1wLCBnYm9vbGVhbiBtYXJrZXIsIGdib29sZWFuIGVuZCwKKyAgICBndWludCBudW1iZXIsIGd1aW50IHZvbHVtZSwgZ3VpbnQgZHVyYXRpb24pCit7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RSVFBCdWZmZXIgcnRwYnVmID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKyAgZ2NoYXIgKnBheWxvYWQ7CisgIHN0YXRpYyBndWludCBzZXFudW0gPSAxOworCisgIGJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoNCwgMCwgMCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcnRwX2J1ZmZlcl9tYXAgKGJ1ZiwgR1NUX01BUF9SRUFEV1JJVEUsICZydHBidWYpKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3NlcSAoJnJ0cGJ1Ziwgc2VxbnVtKyspOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfdGltZXN0YW1wICgmcnRwYnVmLCB0aW1lc3RhbXApOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwYnVmLCBtYXJrZXIpOworICBwYXlsb2FkID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHBidWYpOworICBwYXlsb2FkWzBdID0gbnVtYmVyOworICBwYXlsb2FkWzFdID0gdm9sdW1lIHwgKGVuZCA/IEVORF9CSVQgOiAwKTsKKyAgR1NUX1dSSVRFX1VJTlQxNl9CRSAocGF5bG9hZCArIDIsIGR1cmF0aW9uKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHBidWYpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChzcmMsIGJ1ZikgPT0gR1NUX0ZMT1dfT0spOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHBkdG1mZGVwYXkpCit7CisgIEdzdEVsZW1lbnQgKmR0bWZkZXBheTsKKyAgR3N0UGFkICpzcmMsICpzaW5rOworICBHc3RCdXMgKmJ1czsKKyAgR3N0Q2FwcyAqY2Fwc19pbjsKKyAgR3N0Q2FwcyAqZXhwZWN0ZWRfY2Fwc19vdXQ7CisgIEdzdENhcHMgKmNhcHNfb3V0OworCisgIGR0bWZkZXBheSA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgicnRwZHRtZmRlcGF5Iik7CisgIHNpbmsgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGR0bWZkZXBheSwgJmF1ZGlvX3NpbmtfdGVtcGxhdGUpOworICBzcmMgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoZHRtZmRlcGF5LCAmcnRwX2R0bWZfc3JjX3RlbXBsYXRlKTsKKworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAoZHRtZmRlcGF5LCBidXMpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc3JjLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzaW5rLCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChkdG1mZGVwYXksIEdTVF9TVEFURV9QTEFZSU5HKTsKKworCisgIGNhcHNfaW4gPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXBwbGljYXRpb24veC1ydHAiLAorICAgICAgImVuY29kaW5nLW5hbWUiLCBHX1RZUEVfU1RSSU5HLCAiVEVMRVBIT05FLUVWRU5UIiwKKyAgICAgICJtZWRpYSIsIEdfVFlQRV9TVFJJTkcsICJhdWRpbyIsCisgICAgICAiY2xvY2stcmF0ZSIsIEdfVFlQRV9JTlQsIDEwMDAsICJwYXlsb2FkIiwgR19UWVBFX0lOVCwgOTksIE5VTEwpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChzcmMsIGR0bWZkZXBheSwgY2Fwc19pbiwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHNfaW4pOworCisgIGNhcHNfb3V0ID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChzaW5rKTsKKyAgZXhwZWN0ZWRfY2Fwc19vdXQgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsIEdTVF9BVURJT19ORSAoUzE2KSwKKyAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgMTAwMCwgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMSwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19pc19lcXVhbF9maXhlZCAoY2Fwc19vdXQsIGV4cGVjdGVkX2NhcHNfb3V0KSk7CisgIGdzdF9jYXBzX3VucmVmIChleHBlY3RlZF9jYXBzX291dCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzX291dCk7CisKKyAgLyogU2luZ2xlIHBhY2tldCBEVE1GICovCisgIHNlbmRfcnRwX3BhY2tldCAoc3JjLCAyMDAsIFRSVUUsIFRSVUUsIDEsIDUsIDI1MCk7CisgIGNoZWNrX2dldF9kdG1mX2V2ZW50X21lc3NhZ2UgKGJ1cywgMSwgNSk7CisgIGNoZWNrX2J1ZmZlcnNfZHVyYXRpb24gKDI1MCAqIEdTVF9NU0VDT05EKTsKKworICAvKiBUd28gcGFja2V0IERUTUYgKi8KKyAgc2VuZF9ydHBfcGFja2V0IChzcmMsIDgwMCwgVFJVRSwgRkFMU0UsIDEsIDUsIDIwMCk7CisgIHNlbmRfcnRwX3BhY2tldCAoc3JjLCA4MDAsIEZBTFNFLCBUUlVFLCAxLCA1LCA0MDApOworICBjaGVja19idWZmZXJzX2R1cmF0aW9uICg0MDAgKiBHU1RfTVNFQ09ORCk7CisgIGNoZWNrX2dldF9kdG1mX2V2ZW50X21lc3NhZ2UgKGJ1cywgMSwgNSk7CisKKyAgLyogTG9uZyBEVE1GICovCisgIHNlbmRfcnRwX3BhY2tldCAoc3JjLCAzMDAwLCBUUlVFLCBGQUxTRSwgMSwgNSwgMjAwKTsKKyAgY2hlY2tfZ2V0X2R0bWZfZXZlbnRfbWVzc2FnZSAoYnVzLCAxLCA1KTsKKyAgY2hlY2tfYnVmZmVyc19kdXJhdGlvbiAoMjAwICogR1NUX01TRUNPTkQpOworICBzZW5kX3J0cF9wYWNrZXQgKHNyYywgMzAwMCwgRkFMU0UsIEZBTFNFLCAxLCA1LCA0MDApOworICBjaGVja19ub19kdG1mX2V2ZW50X21lc3NhZ2UgKGJ1cyk7CisgIGNoZWNrX2J1ZmZlcnNfZHVyYXRpb24gKDIwMCAqIEdTVF9NU0VDT05EKTsKKyAgc2VuZF9ydHBfcGFja2V0IChzcmMsIDMwMDAsIEZBTFNFLCBGQUxTRSwgMSwgNSwgNjAwKTsKKyAgY2hlY2tfbm9fZHRtZl9ldmVudF9tZXNzYWdlIChidXMpOworICBjaGVja19idWZmZXJzX2R1cmF0aW9uICgyMDAgKiBHU1RfTVNFQ09ORCk7CisKKyAgLyogTmV3IHdpdGhvdXQgZW5kIHRvIGxhc3QgKi8KKyAgc2VuZF9ydHBfcGFja2V0IChzcmMsIDQwMDAsIFRSVUUsIFRSVUUsIDEsIDUsIDI1MCk7CisgIGNoZWNrX2dldF9kdG1mX2V2ZW50X21lc3NhZ2UgKGJ1cywgMSwgNSk7CisgIGNoZWNrX2J1ZmZlcnNfZHVyYXRpb24gKDI1MCAqIEdTVF9NU0VDT05EKTsKKworICBjaGVja19ub19kdG1mX2V2ZW50X21lc3NhZ2UgKGJ1cyk7CisgIGZhaWxfdW5sZXNzIChidWZmZXJzID09IE5VTEwpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChkdG1mZGVwYXksIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc3JjLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc2luaywgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKGR0bWZkZXBheSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkIChkdG1mZGVwYXkpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAoZHRtZmRlcGF5KTsKK30KKworR1NUX0VORF9URVNUOworCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBydHBfZHRtZl9zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpIFwiYXVkaW9cIiwgIgorICAgICAgICAicGF5bG9hZCA9IChpbnQpIDk5LCAiCisgICAgICAgICJjbG9jay1yYXRlID0gKGludCkgMTAwMCwgIgorICAgICAgICAic2VxbnVtLW9mZnNldCA9ICh1aW50KSAzMzMsICIKKyAgICAgICAgInRpbWVzdGFtcC1vZmZzZXQgPSAodWludCkgNjY2LCAiCisgICAgICAgICJzc3JjID0gKHVpbnQpIDk5OSwgIgorICAgICAgICAibWF4cHRpbWUgPSAodWludCkgMjAsIGVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKSBcIlRFTEVQSE9ORS1FVkVOVFwiIikKKyAgICApOworCitHc3RFbGVtZW50ICpkdG1mc3JjOworR3N0UGFkICpzaW5rOworR3N0Q2xvY2sgKnRlc3RjbG9jazsKK0dzdEJ1cyAqYnVzOworCitzdGF0aWMgdm9pZAorY2hlY2tfbWVzc2FnZV9zdHJ1Y3R1cmUgKEdzdFN0cnVjdHVyZSAqIGV4cGVjdGVkX3MpCit7CisgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisgIGdib29sZWFuIGhhdmVfbWVzc2FnZSA9IEZBTFNFOworCisgIHdoaWxlICghaGF2ZV9tZXNzYWdlICYmCisgICAgICAobWVzc2FnZSA9IGdzdF9idXNfdGltZWRfcG9wX2ZpbHRlcmVkIChidXMsIEdTVF9DTE9DS19USU1FX05PTkUsCisgICAgICAgICAgICAgIEdTVF9NRVNTQUdFX0VMRU1FTlQpKSAhPSBOVUxMKSB7CisgICAgaWYgKGdzdF9tZXNzYWdlX2hhc19uYW1lIChtZXNzYWdlLCBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChleHBlY3RlZF9zKSkpIHsKKyAgICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1lc3NhZ2UpOworCisgICAgICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9pc19lcXVhbCAocywgZXhwZWN0ZWRfcykpOworICAgICAgaGF2ZV9tZXNzYWdlID0gVFJVRTsKKyAgICB9CisgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICB9CisKKyAgZmFpbF91bmxlc3MgKGhhdmVfbWVzc2FnZSk7CisKKyAgZ3N0X3N0cnVjdHVyZV9mcmVlIChleHBlY3RlZF9zKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3J0cF9idWZmZXIgKEdzdENsb2NrVGltZSB0cywgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uLCBnYm9vbGVhbiBzdGFydCwKKyAgICBnYm9vbGVhbiBlbmQsIGd1aW50IHJ0cHRzLCBndWludCBzc3JjLCBndWludCB2b2x1bWUsIGd1aW50IG51bWJlciwKKyAgICBndWludCBydHBkdXJhdGlvbikKK3sKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdzdFJUUEJ1ZmZlciBydHBidWZmZXIgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworICBnY2hhciAqcGF5bG9hZDsKKworICBnX211dGV4X2xvY2sgKCZjaGVja19tdXRleCk7CisgIHdoaWxlIChidWZmZXJzID09IE5VTEwpCisgICAgZ19jb25kX3dhaXQgKCZjaGVja19jb25kLCAmY2hlY2tfbXV0ZXgpOworICBnX211dGV4X3VubG9jayAoJmNoZWNrX211dGV4KTsKKyAgZmFpbF91bmxlc3MgKGJ1ZmZlcnMgIT0gTlVMTCk7CisKKyAgYnVmZmVyID0gYnVmZmVycy0+ZGF0YTsKKyAgYnVmZmVycyA9IGdfbGlzdF9kZWxldGVfbGluayAoYnVmZmVycywgYnVmZmVycyk7CisKKyAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfUFRTIChidWZmZXIpID09IHRzKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcikgPT0gZHVyYXRpb24pOworCisgIGZhaWxfdW5sZXNzIChnc3RfcnRwX2J1ZmZlcl9tYXAgKGJ1ZmZlciwgR1NUX01BUF9SRUFELCAmcnRwYnVmZmVyKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcnRwX2J1ZmZlcl9nZXRfbWFya2VyICgmcnRwYnVmZmVyKSA9PSBzdGFydCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wICgmcnRwYnVmZmVyKSA9PSBydHB0cyk7CisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cGJ1ZmZlcik7CisKKyAgZmFpbF91bmxlc3MgKHBheWxvYWRbMF0gPT0gbnVtYmVyKTsKKyAgZmFpbF91bmxlc3MgKChwYXlsb2FkWzFdICYgMHg3RikgPT0gdm9sdW1lKTsKKyAgZmFpbF91bmxlc3MgKCEgIShwYXlsb2FkWzFdICYgMHg4MCkgPT0gZW5kKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9SRUFEX1VJTlQxNl9CRSAocGF5bG9hZCArIDIpID09IHJ0cGR1cmF0aW9uKTsKKworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cGJ1ZmZlcik7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7Cit9CisKK2dpbnQgbWV0aG9kOworCitzdGF0aWMgdm9pZAorc2V0dXBfcnRwZHRtZnNyYyAodm9pZCkKK3sKKyAgdGVzdGNsb2NrID0gZ3N0X3Rlc3RfY2xvY2tfbmV3ICgpOworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKworICBtZXRob2QgPSAxOworICBkdG1mc3JjID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJydHBkdG1mc3JjIik7CisgIHNpbmsgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGR0bWZzcmMsICZydHBfZHRtZl9zaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAoZHRtZnNyYywgYnVzKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9jbG9jayAoZHRtZnNyYywgdGVzdGNsb2NrKSk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzaW5rLCBUUlVFKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZHRtZnNyYywgR1NUX1NUQVRFX1BMQVlJTkcpID09CisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworfQorCitzdGF0aWMgdm9pZAordGVhcmRvd25fZHRtZnNyYyAodm9pZCkKK3sKKyAgZ3N0X29iamVjdF91bnJlZiAodGVzdGNsb2NrKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzaW5rLCBGQUxTRSk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGR0bWZzcmMsIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKGR0bWZzcmMpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAoZHRtZnNyYyk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2R0bWZzcmNfaW52YWxpZF9ldmVudHMpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKworICAvKiBNaXNzaW5nIHN0YXJ0ICovCisgIHMgPSBnc3Rfc3RydWN0dXJlX25ldyAoImR0bWYtZXZlbnQiLAorICAgICAgInR5cGUiLCBHX1RZUEVfSU5ULCAxLCAibnVtYmVyIiwgR19UWVBFX0lOVCwgMywKKyAgICAgICJtZXRob2QiLCBHX1RZUEVfSU5ULCBtZXRob2QsICJ2b2x1bWUiLCBHX1RZUEVfSU5ULCA4LCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAoc2luaywKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwgcykpID09IEZBTFNFKTsKKworICAvKiBNaXNzaW5nIHZvbHVtZSAqLworICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJkdG1mLWV2ZW50IiwKKyAgICAgICJ0eXBlIiwgR19UWVBFX0lOVCwgMSwgIm51bWJlciIsIEdfVFlQRV9JTlQsIDMsCisgICAgICAibWV0aG9kIiwgR19UWVBFX0lOVCwgbWV0aG9kLCAic3RhcnQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKHNpbmssCisgICAgICAgICAgZ3N0X2V2ZW50X25ld19jdXN0b20gKEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU0sIHMpKSA9PSBGQUxTRSk7CisKKyAgLyogTWlzc2luZyBudW1iZXIgKi8KKyAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiZHRtZi1ldmVudCIsCisgICAgICAidHlwZSIsIEdfVFlQRV9JTlQsIDEsICJtZXRob2QiLCBHX1RZUEVfSU5ULCBtZXRob2QsCisgICAgICAidm9sdW1lIiwgR19UWVBFX0lOVCwgOCwgInN0YXJ0IiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChzaW5rLAorICAgICAgICAgIGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNLCBzKSkgPT0gRkFMU0UpOworCisgIC8qIE1pc3NpbmcgdHlwZSAqLworICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJkdG1mLWV2ZW50IiwKKyAgICAgICJudW1iZXIiLCBHX1RZUEVfSU5ULCAzLCAibWV0aG9kIiwgR19UWVBFX0lOVCwgbWV0aG9kLAorICAgICAgInZvbHVtZSIsIEdfVFlQRV9JTlQsIDgsICJzdGFydCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAoc2luaywKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X2N1c3RvbSAoR1NUX0VWRU5UX0NVU1RPTV9VUFNUUkVBTSwgcykpID09IEZBTFNFKTsKKworICAvKiBTdG9wIGJlZm9yZSBzdGFydCAqLworICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJkdG1mLWV2ZW50IiwKKyAgICAgICJ0eXBlIiwgR19UWVBFX0lOVCwgMSwgIm51bWJlciIsIEdfVFlQRV9JTlQsIDMsCisgICAgICAibWV0aG9kIiwgR19UWVBFX0lOVCwgbWV0aG9kLCAidm9sdW1lIiwgR19UWVBFX0lOVCwgOCwKKyAgICAgICJzdGFydCIsIEdfVFlQRV9CT09MRUFOLCBGQUxTRSwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKHNpbmssCisgICAgICAgICAgZ3N0X2V2ZW50X25ld19jdXN0b20gKEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU0sIHMpKSA9PSBGQUxTRSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChkdG1mc3JjLCBHU1RfU1RBVEVfTlVMTCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnRwZHRtZnNyY19taW5fZHVyYXRpb24pCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgR3N0Q2xvY2tJRCBpZDsKKyAgZ3VpbnQgdGltZXN0YW1wID0gMDsKKyAgR3N0Q2FwcyAqZXhwZWN0ZWRfY2FwcywgKmNhcHM7CisKKyAgLyogTWluaW11bSBkdXJhdGlvbiBkdG1mICovCisKKyAgcyA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiZHRtZi1ldmVudCIsCisgICAgICAidHlwZSIsIEdfVFlQRV9JTlQsIDEsICJudW1iZXIiLCBHX1RZUEVfSU5ULCAzLAorICAgICAgIm1ldGhvZCIsIEdfVFlQRV9JTlQsIDEsICJ2b2x1bWUiLCBHX1RZUEVfSU5ULCA4LAorICAgICAgInN0YXJ0IiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChzaW5rLAorICAgICAgICAgIGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNLAorICAgICAgICAgICAgICBnc3Rfc3RydWN0dXJlX2NvcHkgKHMpKSkpOworICBjaGVja19ub19kdG1mX2V2ZW50X21lc3NhZ2UgKGJ1cyk7CisgIGdzdF90ZXN0X2Nsb2NrX3dhaXRfZm9yX25leHRfcGVuZGluZ19pZCAoR1NUX1RFU1RfQ0xPQ0sgKHRlc3RjbG9jayksIE5VTEwpOworICBmYWlsX3VubGVzcyAoYnVmZmVycyA9PSBOVUxMKTsKKyAgaWQgPSBnc3RfdGVzdF9jbG9ja19wcm9jZXNzX25leHRfY2xvY2tfaWQgKEdTVF9URVNUX0NMT0NLICh0ZXN0Y2xvY2spKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9jbG9ja19pZF9nZXRfdGltZSAoaWQpID09IDApOworICBnc3RfY2xvY2tfaWRfdW5yZWYgKGlkKTsKKyAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAocywgImR0bWYtZXZlbnQtcHJvY2Vzc2VkIik7CisgIGNoZWNrX21lc3NhZ2Vfc3RydWN0dXJlIChzKTsKKworICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJkdG1mLWV2ZW50IiwKKyAgICAgICJ0eXBlIiwgR19UWVBFX0lOVCwgMSwgIm1ldGhvZCIsIEdfVFlQRV9JTlQsIDEsCisgICAgICAic3RhcnQiLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChzaW5rLAorICAgICAgICAgIGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNLAorICAgICAgICAgICAgICBnc3Rfc3RydWN0dXJlX2NvcHkgKHMpKSkpOworCisgIGNoZWNrX3J0cF9idWZmZXIgKDAsIDIwICogR1NUX01TRUNPTkQsIFRSVUUsIEZBTFNFLCA2NjYsIDk5OSwgOCwgMywgMjApOworCisgIGZvciAodGltZXN0YW1wID0gMjA7IHRpbWVzdGFtcCA8IE1JTl9QVUxTRV9EVVJBVElPTiArIDIwOyB0aW1lc3RhbXAgKz0gMjApIHsKKyAgICBnc3RfdGVzdF9jbG9ja19hZHZhbmNlX3RpbWUgKEdTVF9URVNUX0NMT0NLICh0ZXN0Y2xvY2spLAorICAgICAgICAyMCAqIEdTVF9NU0VDT05EICsgMSk7CisgICAgZ3N0X3Rlc3RfY2xvY2tfd2FpdF9mb3JfbmV4dF9wZW5kaW5nX2lkIChHU1RfVEVTVF9DTE9DSyAodGVzdGNsb2NrKSwgTlVMTCk7CisgICAgZmFpbF91bmxlc3MgKGJ1ZmZlcnMgPT0gTlVMTCk7CisgICAgaWQgPSBnc3RfdGVzdF9jbG9ja19wcm9jZXNzX25leHRfY2xvY2tfaWQgKEdTVF9URVNUX0NMT0NLICh0ZXN0Y2xvY2spKTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X2Nsb2NrX2lkX2dldF90aW1lIChpZCkgPT0gdGltZXN0YW1wICogR1NUX01TRUNPTkQpOworICAgIGdzdF9jbG9ja19pZF91bnJlZiAoaWQpOworCisgICAgaWYgKHRpbWVzdGFtcCA8IE1JTl9QVUxTRV9EVVJBVElPTikgeworICAgICAgY2hlY2tfcnRwX2J1ZmZlciAodGltZXN0YW1wICogR1NUX01TRUNPTkQsIDIwICogR1NUX01TRUNPTkQsIEZBTFNFLAorICAgICAgICAgIEZBTFNFLCA2NjYsIDk5OSwgOCwgMywgdGltZXN0YW1wICsgMjApOworICAgICAgY2hlY2tfbm9fZHRtZl9ldmVudF9tZXNzYWdlIChidXMpOworICAgIH0gZWxzZSB7CisgICAgICBnc3Rfc3RydWN0dXJlX3NldF9uYW1lIChzLCAiZHRtZi1ldmVudC1wcm9jZXNzZWQiKTsKKyAgICAgIGNoZWNrX21lc3NhZ2Vfc3RydWN0dXJlIChzKTsKKyAgICAgIGNoZWNrX3J0cF9idWZmZXIgKHRpbWVzdGFtcCAqIEdTVF9NU0VDT05ELAorICAgICAgICAgICgyMCArIE1JTl9JTlRFUl9ESUdJVF9JTlRFUlZBTCkgKiBHU1RfTVNFQ09ORCwgRkFMU0UsIFRSVUUsIDY2NiwKKyAgICAgICAgICA5OTksIDgsIDMsIHRpbWVzdGFtcCArIDIwKTsKKyAgICB9CisKKyAgICBmYWlsX3VubGVzcyAoYnVmZmVycyA9PSBOVUxMKTsKKyAgfQorCisKKyAgZmFpbF91bmxlc3MgKGdzdF90ZXN0X2Nsb2NrX3BlZWtfaWRfY291bnQgKEdTVF9URVNUX0NMT0NLICh0ZXN0Y2xvY2spKSA9PSAwKTsKKworICAvKiBjYXBzIGNoZWNrICovCisKKyAgZXhwZWN0ZWRfY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXJ0cCIsCisgICAgICAiZW5jb2RpbmctbmFtZSIsIEdfVFlQRV9TVFJJTkcsICJURUxFUEhPTkUtRVZFTlQiLAorICAgICAgIm1lZGlhIiwgR19UWVBFX1NUUklORywgImF1ZGlvIiwKKyAgICAgICJjbG9jay1yYXRlIiwgR19UWVBFX0lOVCwgMTAwMCwgInBheWxvYWQiLCBHX1RZUEVfSU5ULCA5OSwKKyAgICAgICJzZXFudW0tb2Zmc2V0IiwgR19UWVBFX1VJTlQsIDMzMywKKyAgICAgICJ0aW1lc3RhbXAtb2Zmc2V0IiwgR19UWVBFX1VJTlQsIDY2NiwKKyAgICAgICJzc3JjIiwgR19UWVBFX1VJTlQsIDk5OSwgInB0aW1lIiwgR19UWVBFX1VJTlQsIDIwLCBOVUxMKTsKKyAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoc2luayk7CisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChjYXBzLCBleHBlY3RlZF9jYXBzKSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGV4cGVjdGVkX2NhcHMpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZHRtZnNyYywgR1NUX1NUQVRFX05VTEwpOworCisgIGNoZWNrX25vX2R0bWZfZXZlbnRfbWVzc2FnZSAoYnVzKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgYXVkaW9fZHRtZnNyY19zaW5rX3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSBcIiIgR1NUX0FVRElPX05FIChTMTYpICJcIiwgIgorICAgICAgICAicmF0ZSA9IChpbnQpIDgwMDMsICIgImNoYW5uZWxzID0gKGludCkgMSIpCisgICAgKTsKK3N0YXRpYyB2b2lkCitzZXR1cF9kdG1mc3JjICh2b2lkKQoreworICB0ZXN0Y2xvY2sgPSBnc3RfdGVzdF9jbG9ja19uZXcgKCk7CisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworCisgIG1ldGhvZCA9IDI7CisgIGR0bWZzcmMgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoImR0bWZzcmMiKTsKKyAgc2luayA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoZHRtZnNyYywgJmF1ZGlvX2R0bWZzcmNfc2lua190ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGR0bWZzcmMsIGJ1cyk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfY2xvY2sgKGR0bWZzcmMsIHRlc3RjbG9jaykpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc2luaywgVFJVRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGR0bWZzcmMsIEdTVF9TVEFURV9QTEFZSU5HKSA9PQorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKK30KKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9kdG1mc3JjX21pbl9kdXJhdGlvbikKK3sKKyAgR3N0U3RydWN0dXJlICpzOworICBHc3RDbG9ja0lEIGlkOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wID0gMDsKKyAgR3N0Q2FwcyAqZXhwZWN0ZWRfY2FwcywgKmNhcHM7CisgIGd1aW50IGludGVydmFsOworCisgIGdfb2JqZWN0X2dldCAoZHRtZnNyYywgImludGVydmFsIiwgJmludGVydmFsLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGludGVydmFsID09IDUwKTsKKworICAvKiBNaW5pbXVtIGR1cmF0aW9uIGR0bWYgKi8KKyAgZ3N0X3Rlc3RfY2xvY2tfc2V0X3RpbWUgKEdTVF9URVNUX0NMT0NLICh0ZXN0Y2xvY2spLCAwKTsKKworICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJkdG1mLWV2ZW50IiwKKyAgICAgICJ0eXBlIiwgR19UWVBFX0lOVCwgMSwgIm51bWJlciIsIEdfVFlQRV9JTlQsIDMsCisgICAgICAibWV0aG9kIiwgR19UWVBFX0lOVCwgMiwgInZvbHVtZSIsIEdfVFlQRV9JTlQsIDgsCisgICAgICAic3RhcnQiLCBHX1RZUEVfQk9PTEVBTiwgVFJVRSwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKHNpbmssCisgICAgICAgICAgZ3N0X2V2ZW50X25ld19jdXN0b20gKEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU0sCisgICAgICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfY29weSAocykpKSk7CisKKyAgZ3N0X3Rlc3RfY2xvY2tfd2FpdF9mb3JfbmV4dF9wZW5kaW5nX2lkIChHU1RfVEVTVF9DTE9DSyAodGVzdGNsb2NrKSwgTlVMTCk7CisgIGlkID0gZ3N0X3Rlc3RfY2xvY2tfcHJvY2Vzc19uZXh0X2Nsb2NrX2lkIChHU1RfVEVTVF9DTE9DSyAodGVzdGNsb2NrKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfY2xvY2tfaWRfZ2V0X3RpbWUgKGlkKSA9PSAwKTsKKyAgZ3N0X2Nsb2NrX2lkX3VucmVmIChpZCk7CisKKyAgZ3N0X3N0cnVjdHVyZV9zZXRfbmFtZSAocywgImR0bWYtZXZlbnQtcHJvY2Vzc2VkIik7CisgIGNoZWNrX21lc3NhZ2Vfc3RydWN0dXJlIChzKTsKKworICBzID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJkdG1mLWV2ZW50IiwKKyAgICAgICJ0eXBlIiwgR19UWVBFX0lOVCwgMSwgIm1ldGhvZCIsIEdfVFlQRV9JTlQsIDIsCisgICAgICAic3RhcnQiLCBHX1RZUEVfQk9PTEVBTiwgRkFMU0UsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChzaW5rLAorICAgICAgICAgIGdzdF9ldmVudF9uZXdfY3VzdG9tIChHU1RfRVZFTlRfQ1VTVE9NX1VQU1RSRUFNLAorICAgICAgICAgICAgICBnc3Rfc3RydWN0dXJlX2NvcHkgKHMpKSkpOworCisgIGZvciAodGltZXN0YW1wID0gaW50ZXJ2YWwgKiBHU1RfTVNFQ09ORDsKKyAgICAgIHRpbWVzdGFtcCA8IChNSU5fUFVMU0VfRFVSQVRJT04gKyBNSU5fSU5URVJfRElHSVRfSU5URVJWQUwpICoKKyAgICAgIEdTVF9NU0VDT05EOyB0aW1lc3RhbXAgKz0gR1NUX01TRUNPTkQgKiBpbnRlcnZhbCkgeworICAgIGdzdF90ZXN0X2Nsb2NrX3dhaXRfZm9yX25leHRfcGVuZGluZ19pZCAoR1NUX1RFU1RfQ0xPQ0sgKHRlc3RjbG9jayksIE5VTEwpOworICAgIGdzdF90ZXN0X2Nsb2NrX2FkdmFuY2VfdGltZSAoR1NUX1RFU1RfQ0xPQ0sgKHRlc3RjbG9jayksCisgICAgICAgIGludGVydmFsICogR1NUX01TRUNPTkQpOworCisgICAgaWQgPSBnc3RfdGVzdF9jbG9ja19wcm9jZXNzX25leHRfY2xvY2tfaWQgKEdTVF9URVNUX0NMT0NLICh0ZXN0Y2xvY2spKTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X2Nsb2NrX2lkX2dldF90aW1lIChpZCkgPT0gdGltZXN0YW1wKTsKKyAgICBnc3RfY2xvY2tfaWRfdW5yZWYgKGlkKTsKKyAgfQorCisgIGdzdF9zdHJ1Y3R1cmVfc2V0X25hbWUgKHMsICJkdG1mLWV2ZW50LXByb2Nlc3NlZCIpOworICBjaGVja19tZXNzYWdlX3N0cnVjdHVyZSAocyk7CisKKyAgY2hlY2tfYnVmZmVyc19kdXJhdGlvbiAoKE1JTl9QVUxTRV9EVVJBVElPTiArIE1JTl9JTlRFUl9ESUdJVF9JTlRFUlZBTCkgKgorICAgICAgR1NUX01TRUNPTkQpOworCisgIGZhaWxfdW5sZXNzIChnc3RfdGVzdF9jbG9ja19wZWVrX2lkX2NvdW50IChHU1RfVEVTVF9DTE9DSyAodGVzdGNsb2NrKSkgPT0gMCk7CisKKyAgLyogY2FwcyBjaGVjayAqLworCisgIGV4cGVjdGVkX2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsIEdTVF9BVURJT19ORSAoUzE2KSwKKyAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgODAwMywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMSwgTlVMTCk7CisgIGNhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHNpbmspOworICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfY2FuX2ludGVyc2VjdCAoY2FwcywgZXhwZWN0ZWRfY2FwcykpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChleHBlY3RlZF9jYXBzKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGR0bWZzcmMsIEdTVF9TVEFURV9OVUxMKTsKKworICBjaGVja19ub19kdG1mX2V2ZW50X21lc3NhZ2UgKGJ1cyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2R0bWZfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiZHRtZiIpOworICBUQ2FzZSAqdGM7CisKKyAgdGMgPSB0Y2FzZV9jcmVhdGUgKCJydHBkdG1mZGVwYXkiKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjLCB0ZXN0X3J0cGR0bWZkZXBheSk7CisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGMpOworCisgIHRjID0gdGNhc2VfY3JlYXRlICgicnRwZHRtZnNyYyIpOworICB0Y2FzZV9hZGRfY2hlY2tlZF9maXh0dXJlICh0Yywgc2V0dXBfcnRwZHRtZnNyYywgdGVhcmRvd25fZHRtZnNyYyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0YywgdGVzdF9kdG1mc3JjX2ludmFsaWRfZXZlbnRzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjLCB0ZXN0X3J0cGR0bWZzcmNfbWluX2R1cmF0aW9uKTsKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Yyk7CisKKyAgdGMgPSB0Y2FzZV9jcmVhdGUgKCJkdG1mc3JjIik7CisgIHRjYXNlX2FkZF9jaGVja2VkX2ZpeHR1cmUgKHRjLCBzZXR1cF9kdG1mc3JjLCB0ZWFyZG93bl9kdG1mc3JjKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjLCB0ZXN0X2R0bWZzcmNfaW52YWxpZF9ldmVudHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGMsIHRlc3RfZHRtZnNyY19taW5fZHVyYXRpb24pOworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjKTsKKworICByZXR1cm4gczsKK30KKworCitHU1RfQ0hFQ0tfTUFJTiAoZHRtZik7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9lcXVhbGl6ZXIuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2VxdWFsaXplci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NjliZWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9lcXVhbGl6ZXIuYwpAQCAtMCwwICsxLDM4MCBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBlcXVhbGl6ZXIuYzogVW5pdCB0ZXN0IGZvciB0aGUgZXF1YWxpemVyIGVsZW1lbnQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2V0cmFuc2Zvcm0uaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworI2luY2x1ZGUgPG1hdGguaD4KKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcKKyAqIHNyYyBhbmQgc2luayBwYWRzIHdlIGNyZWF0ZTsgb3RoZXJ3aXNlIHdlIGFsd2F5cyBoYXZlIHRvIGRvIGdldF9wYWQsCisgKiBnZXRfcGVlciwgYW5kIHRoZW4gcmVtb3ZlIHJlZmVyZW5jZXMgaW4gZXZlcnkgdGVzdCBmdW5jdGlvbiAqLworR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKKworI2RlZmluZSBFUVVBTElaRVJfQ0FQU19TVFJJTkcgICAgICAgICAgICAgICAgICAgICBcCisgICAgImF1ZGlvL3gtcmF3LCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZm9ybWF0ID0gKHN0cmluZykgIkdTVF9BVURJT19ORSAoRjY0KSAiLCAiICAgXAorICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgICAgICAgICAgICBcCisgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmF0ZSA9IChpbnQpIDQ4MDAwIgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChGNjQpICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgInJhdGUgPSAoaW50KSA0ODAwMCIpCisgICAgKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKEY2NCkgIiwgIgorICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiAicmF0ZSA9IChpbnQpIDQ4MDAwIikKKyAgICApOworCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9lcXVhbGl6ZXIgKHZvaWQpCit7CisgIEdzdEVsZW1lbnQgKmVxdWFsaXplcjsKKworICBHU1RfREVCVUcgKCJzZXR1cF9lcXVhbGl6ZXIiKTsKKyAgZXF1YWxpemVyID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJlcXVhbGl6ZXItbmJhbmRzIik7CisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKGVxdWFsaXplciwgJnNyY3RlbXBsYXRlKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChlcXVhbGl6ZXIsICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworCisgIHJldHVybiBlcXVhbGl6ZXI7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX2VxdWFsaXplciAoR3N0RWxlbWVudCAqIGVxdWFsaXplcikKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF9lcXVhbGl6ZXIiKTsKKworICBnX2xpc3RfZm9yZWFjaCAoYnVmZmVycywgKEdGdW5jKSBnc3RfbWluaV9vYmplY3RfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKGVxdWFsaXplcik7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoZXF1YWxpemVyKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGVxdWFsaXplcik7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2VxdWFsaXplcl81YmFuZHNfcGFzc3Rocm91Z2gpCit7CisgIEdzdEVsZW1lbnQgKmVxdWFsaXplcjsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2RvdWJsZSAqaW4sICpyZXM7CisgIGdpbnQgaTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZXF1YWxpemVyID0gc2V0dXBfZXF1YWxpemVyICgpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChlcXVhbGl6ZXIpLCAibnVtLWJhbmRzIiwgNSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2NoaWxkX3Byb3h5X2dldF9jaGlsZHJlbl9jb3VudCAoR1NUX0NISUxEX1BST1hZCisgICAgICAgICAgKGVxdWFsaXplcikpLCA1KTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlcXVhbGl6ZXIsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAyNCAqIHNpemVvZiAoZ2RvdWJsZSkpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIGluW2ldID0gZ19yYW5kb21fZG91YmxlX3JhbmdlICgtMS4wLCAxLjApOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChFUVVBTElaRVJfQ0FQU19TVFJJTkcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgZXF1YWxpemVyLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisgIC8qIC4uLiBhbmQgcHV0cyBhIG5ldyBidWZmZXIgb24gdGhlIGdsb2JhbCBsaXN0ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA9PSAxKTsKKworICBnc3RfYnVmZmVyX21hcCAoR1NUX0JVRkZFUiAoYnVmZmVycy0+ZGF0YSksICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIHJlcyA9IChnZG91YmxlICopIG1hcC5kYXRhOworCisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2Zsb2F0IChpbltpXSwgcmVzW2ldKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoR1NUX0JVRkZFUiAoYnVmZmVycy0+ZGF0YSksICZtYXApOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9lcXVhbGl6ZXIgKGVxdWFsaXplcik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZXF1YWxpemVyXzViYW5kc19taW51c18yNCkKK3sKKyAgR3N0RWxlbWVudCAqZXF1YWxpemVyOworICBHc3RCdWZmZXIgKmluYnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zX2luLCBybXNfb3V0OworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGVxdWFsaXplciA9IHNldHVwX2VxdWFsaXplciAoKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZXF1YWxpemVyKSwgIm51bS1iYW5kcyIsIDUsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9jaGlsZF9wcm94eV9nZXRfY2hpbGRyZW5fY291bnQgKEdTVF9DSElMRF9QUk9YWQorICAgICAgICAgIChlcXVhbGl6ZXIpKSwgNSk7CisKKyAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworICAgIEdPYmplY3QgKmJhbmQgPQorICAgICAgICBnc3RfY2hpbGRfcHJveHlfZ2V0X2NoaWxkX2J5X2luZGV4IChHU1RfQ0hJTERfUFJPWFkgKGVxdWFsaXplciksIGkpOworICAgIGZhaWxfdW5sZXNzIChiYW5kICE9IE5VTEwpOworCisgICAgZ19vYmplY3Rfc2V0IChiYW5kLCAiZ2FpbiIsIC0yNC4wLCBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAoYmFuZCk7CisgIH0KKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlcXVhbGl6ZXIsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAyNCAqIHNpemVvZiAoZ2RvdWJsZSkpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbiA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIGluW2ldID0gZ19yYW5kb21fZG91YmxlX3JhbmdlICgtMS4wLCAxLjApOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisKKyAgcm1zX2luID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIHJtc19pbiArPSBpbltpXSAqIGluW2ldOworICBybXNfaW4gPSBzcXJ0IChybXNfaW4gLyAxMDI0KTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEVRVUFMSVpFUl9DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBlcXVhbGl6ZXIsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgLyogLi4uIGFuZCBwdXRzIGEgbmV3IGJ1ZmZlciBvbiB0aGUgZ2xvYmFsIGxpc3QgKi8KKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID09IDEpOworCisgIGdzdF9idWZmZXJfbWFwIChHU1RfQlVGRkVSIChidWZmZXJzLT5kYXRhKSwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgcmVzID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisKKyAgcm1zX291dCA9IDAuMDsKKyAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKKyAgICBybXNfb3V0ICs9IHJlc1tpXSAqIHJlc1tpXTsKKyAgcm1zX291dCA9IHNxcnQgKHJtc19vdXQgLyAxMDI0KTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoR1NUX0JVRkZFUiAoYnVmZmVycy0+ZGF0YSksICZtYXApOworCisgIGZhaWxfdW5sZXNzIChybXNfaW4gPiBybXNfb3V0KTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfZXF1YWxpemVyIChlcXVhbGl6ZXIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2VxdWFsaXplcl81YmFuZHNfcGx1c18xMikKK3sKKyAgR3N0RWxlbWVudCAqZXF1YWxpemVyOworICBHc3RCdWZmZXIgKmluYnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBnZG91YmxlICppbiwgKnJlcywgcm1zX2luLCBybXNfb3V0OworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGVxdWFsaXplciA9IHNldHVwX2VxdWFsaXplciAoKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZXF1YWxpemVyKSwgIm51bS1iYW5kcyIsIDUsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9jaGlsZF9wcm94eV9nZXRfY2hpbGRyZW5fY291bnQgKEdTVF9DSElMRF9QUk9YWQorICAgICAgICAgIChlcXVhbGl6ZXIpKSwgNSk7CisKKyAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworICAgIEdPYmplY3QgKmJhbmQgPQorICAgICAgICBnc3RfY2hpbGRfcHJveHlfZ2V0X2NoaWxkX2J5X2luZGV4IChHU1RfQ0hJTERfUFJPWFkgKGVxdWFsaXplciksIGkpOworICAgIGZhaWxfdW5sZXNzIChiYW5kICE9IE5VTEwpOworCisgICAgZ19vYmplY3Rfc2V0IChiYW5kLCAiZ2FpbiIsIDEyLjAsIE5VTEwpOworICAgIGdfb2JqZWN0X3VucmVmIChiYW5kKTsKKyAgfQorCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVxdWFsaXplciwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMDI0ICogc2l6ZW9mIChnZG91YmxlKSk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluID0gKGdkb3VibGUgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgaW5baV0gPSBnX3JhbmRvbV9kb3VibGVfcmFuZ2UgKC0xLjAsIDEuMCk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKworICBybXNfaW4gPSAwLjA7CisgIGZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCisgICAgcm1zX2luICs9IGluW2ldICogaW5baV07CisgIHJtc19pbiA9IHNxcnQgKHJtc19pbiAvIDEwMjQpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoRVFVQUxJWkVSX0NBUFNfU1RSSU5HKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGVxdWFsaXplciwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworICAvKiAuLi4gYW5kIHB1dHMgYSBuZXcgYnVmZmVyIG9uIHRoZSBnbG9iYWwgbGlzdCAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPT0gMSk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKEdTVF9CVUZGRVIgKGJ1ZmZlcnMtPmRhdGEpLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICByZXMgPSAoZ2RvdWJsZSAqKSBtYXAuZGF0YTsKKworICBybXNfb3V0ID0gMC4wOworICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorICAgIHJtc19vdXQgKz0gcmVzW2ldICogcmVzW2ldOworICBybXNfb3V0ID0gc3FydCAocm1zX291dCAvIDEwMjQpOworICBnc3RfYnVmZmVyX3VubWFwIChHU1RfQlVGRkVSIChidWZmZXJzLT5kYXRhKSwgJm1hcCk7CisKKyAgZmFpbF91bmxlc3MgKHJtc19pbiA8IHJtc19vdXQpOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9lcXVhbGl6ZXIgKGVxdWFsaXplcik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZXF1YWxpemVyX2JhbmRfbnVtYmVyX2NoYW5naW5nKQoreworICBHc3RFbGVtZW50ICplcXVhbGl6ZXI7CisgIGdpbnQgaTsKKworICBlcXVhbGl6ZXIgPSBzZXR1cF9lcXVhbGl6ZXIgKCk7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZXF1YWxpemVyKSwgIm51bS1iYW5kcyIsIDUsIE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfY2hpbGRfcHJveHlfZ2V0X2NoaWxkcmVuX2NvdW50IChHU1RfQ0hJTERfUFJPWFkKKyAgICAgICAgICAoZXF1YWxpemVyKSksIDUpOworCisgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICBHT2JqZWN0ICpiYW5kOworCisgICAgYmFuZCA9IGdzdF9jaGlsZF9wcm94eV9nZXRfY2hpbGRfYnlfaW5kZXggKEdTVF9DSElMRF9QUk9YWSAoZXF1YWxpemVyKSwgaSk7CisgICAgZmFpbF91bmxlc3MgKGJhbmQgIT0gTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKGJhbmQpOworICB9CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZXF1YWxpemVyKSwgIm51bS1iYW5kcyIsIDEwLCBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2NoaWxkX3Byb3h5X2dldF9jaGlsZHJlbl9jb3VudCAoR1NUX0NISUxEX1BST1hZCisgICAgICAgICAgKGVxdWFsaXplcikpLCAxMCk7CisKKyAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICBHT2JqZWN0ICpiYW5kOworCisgICAgYmFuZCA9IGdzdF9jaGlsZF9wcm94eV9nZXRfY2hpbGRfYnlfaW5kZXggKEdTVF9DSElMRF9QUk9YWSAoZXF1YWxpemVyKSwgaSk7CisgICAgZmFpbF91bmxlc3MgKGJhbmQgIT0gTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKGJhbmQpOworICB9CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2VxdWFsaXplciAoZXF1YWxpemVyKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9lcXVhbGl6ZXJfcHJlc2V0cykKK3sKKyAgR3N0RWxlbWVudCAqZXExLCAqZXEyOworICBnaW50IHR5cGU7CisgIGdkb3VibGUgZ2FpbiwgZnJlcTsKKworICBlcTEgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoImVxdWFsaXplci1uYmFuZHMiKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZXExKSwgIm51bS1iYW5kcyIsIDMsIE5VTEwpOworCisgIC8qIHNldCBwcm9wZXJ0aWVzIHRvIG5vbi1kZWZhdWx0cyAqLworICBnc3RfY2hpbGRfcHJveHlfc2V0ICgoR3N0Q2hpbGRQcm94eSAqKSBlcTEsCisgICAgICAiYmFuZDA6OnR5cGUiLCAwLCAiYmFuZDA6OmdhaW4iLCAtMy4wLCAiYmFuZDA6OmZyZXEiLCAxMDAuMCwKKyAgICAgICJiYW5kMTo6dHlwZSIsIDEsICJiYW5kMTo6Z2FpbiIsICszLjAsICJiYW5kMTo6ZnJlcSIsIDEwMDAuMCwKKyAgICAgICJiYW5kMjo6dHlwZSIsIDIsICJiYW5kMjo6Z2FpbiIsICs5LjAsICJiYW5kMjo6ZnJlcSIsIDEwMDAwLjAsIE5VTEwpOworCisgIC8qIHNhdmUgcHJlc2V0ICovCisgIGdzdF9wcmVzZXRfc2F2ZV9wcmVzZXQgKChHc3RQcmVzZXQgKikgZXExLCAiX3Rlc3RwcmVzZXRfIik7CisgIEdTVF9JTkZPX09CSkVDVCAoZXExLCAiUHJlc2V0IHNhdmVkIik7CisKKyAgZXEyID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJlcXVhbGl6ZXItbmJhbmRzIik7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGVxMiksICJudW0tYmFuZHMiLCAzLCBOVUxMKTsKKworICAvKiBsb2FkIHByZXNldCAqLworICBnc3RfcHJlc2V0X2xvYWRfcHJlc2V0ICgoR3N0UHJlc2V0ICopIGVxMiwgIl90ZXN0cHJlc2V0XyIpOworICBHU1RfSU5GT19PQkpFQ1QgKGVxMSwgIlByZXNldCBsb2FkZWQiKTsKKworICAvKiBjb21wYXJlIHByb3BlcnRpZXMgKi8KKyAgZ3N0X2NoaWxkX3Byb3h5X2dldCAoKEdzdENoaWxkUHJveHkgKikgZXEyLAorICAgICAgImJhbmQwOjp0eXBlIiwgJnR5cGUsICJiYW5kMDo6Z2FpbiIsICZnYWluLCAiYmFuZDA6OmZyZXEiLCAmZnJlcSwgTlVMTCk7CisgIGNrX2Fzc2VydF9pbnRfZXEgKHR5cGUsIDApOworICBmYWlsX3VubGVzcyAoZ2FpbiA9PSAtMy4wLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGZyZXEgPT0gMTAwLjAsIE5VTEwpOworICBnc3RfY2hpbGRfcHJveHlfZ2V0ICgoR3N0Q2hpbGRQcm94eSAqKSBlcTIsCisgICAgICAiYmFuZDE6OnR5cGUiLCAmdHlwZSwgImJhbmQxOjpnYWluIiwgJmdhaW4sICJiYW5kMTo6ZnJlcSIsICZmcmVxLCBOVUxMKTsKKyAgY2tfYXNzZXJ0X2ludF9lcSAodHlwZSwgMSk7CisgIGZhaWxfdW5sZXNzIChnYWluID09ICszLjAsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZnJlcSA9PSAxMDAwLjAsIE5VTEwpOworICBnc3RfY2hpbGRfcHJveHlfZ2V0ICgoR3N0Q2hpbGRQcm94eSAqKSBlcTIsCisgICAgICAiYmFuZDI6OnR5cGUiLCAmdHlwZSwgImJhbmQyOjpnYWluIiwgJmdhaW4sICJiYW5kMjo6ZnJlcSIsICZmcmVxLCBOVUxMKTsKKyAgY2tfYXNzZXJ0X2ludF9lcSAodHlwZSwgMik7CisgIGZhaWxfdW5sZXNzIChnYWluID09ICs5LjAsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZnJlcSA9PSAxMDAwMC4wLCBOVUxMKTsKKworICBnc3RfcHJlc2V0X2RlbGV0ZV9wcmVzZXQgKChHc3RQcmVzZXQgKikgZXExLCAiX3Rlc3RwcmVzZXRfIik7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChlcTEpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAoZXEyKTsKK30KKworR1NUX0VORF9URVNUOworCisKK3N0YXRpYyBTdWl0ZSAqCitlcXVhbGl6ZXJfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiZXF1YWxpemVyIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2VxdWFsaXplcl81YmFuZHNfcGFzc3Rocm91Z2gpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZXF1YWxpemVyXzViYW5kc19taW51c18yNCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9lcXVhbGl6ZXJfNWJhbmRzX3BsdXNfMTIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZXF1YWxpemVyX2JhbmRfbnVtYmVyX2NoYW5naW5nKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2VxdWFsaXplcl9wcmVzZXRzKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGVxdWFsaXplcik7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9mbGFjcGFyc2UuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2ZsYWNwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjZjMmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9mbGFjcGFyc2UuYwpAQCAtMCwwICsxLDI4NSBAQAorLyoKKyAqIEdTdHJlYW1lcgorICoKKyAqIHVuaXQgdGVzdCBmb3IgZmxhY3BhcnNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3Q6IFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgInBhcnNlci5oIgorCisjZGVmaW5lIFNSQ19DQVBTX1RNUEwgICJhdWRpby94LWZsYWMsIGZyYW1lZD0oYm9vbGVhbilmYWxzZSIKKyNkZWZpbmUgU0lOS19DQVBTX1RNUEwgICJhdWRpby94LWZsYWMsIGZyYW1lZD0oYm9vbGVhbil0cnVlIgorCitHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFNJTktfQ0FQU19UTVBMKQorICAgICk7CisKK0dzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoU1JDX0NBUFNfVE1QTCkKKyAgICApOworCisvKiBzb21lIGRhdGEgKi8KK3N0YXRpYyBndWludDggc3RyZWFtaW5mb19oZWFkZXJbXSA9IHsKKyAgMHg3ZiwgMHg0NiwgMHg0YywgMHg0MSwgMHg0MywgMHgwMSwgMHgwMCwgMHgwMCwKKyAgMHgwMiwgMHg2NiwgMHg0YywgMHg2MSwgMHg0MywgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgyMiwgMHgxMiwgMHgwMCwgMHgxMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYSwgMHhjNCwgMHg0MCwgMHhmMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIGd1aW50OCBjb21tZW50X2hlYWRlcltdID0geworICAweDg0LCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgZ3VpbnQ4IGZsYWNfZnJhbWVbXSA9IHsKKyAgMHhmZiwgMHhmOCwgMHhhOSwgMHgwOCwgMHgwMCwgMHg1MCwgMHgxOCwgMHgwNiwKKyAgMHg2YSwgMHgwYywgMHhjZSwgMHgxMywgMHgyNCwgMHgxOSwgMHg2OCwgMHgwMCwKKyAgMHg0NiwgMHgyMywgMHgwOCwgMHhjYSwgMHhjYiwgMHg1OCwgMHg5YywgMHgyNiwKKyAgMHg5MiwgMHgzMCwgMHhhNiwgMHgyOSwgMHg4YSwgMHhjYSwgMHhkMSwgMHgxOCwKKyAgMHhhZSwgMHgyNiwgMHg1YywgMHg5MCwgMHg2MCwgMHhiZiwgMHgxMSwgMHhhZCwKKyAgMHg0MywgMHgwMiwgMHgwNiwgMHgyNiwgMHhiZCwgMHgzNSwgMHhkZCwgMHhhMywKKyAgMHgxMSwgMHhhNiwgMHg0ZCwgMHgxOCwgMHg4YywgMHg5YSwgMHhlNCwgMHg2MiwKKyAgMHhkOSwgMHgyMywgMHgxMSwgMHg4YiwgMHhjYiwgMHg1NiwgMHg1NSwgMHg0NSwKKyAgMHhjMiwgMHgxOCwgMHg1NiwgMHhhMiwgMHhlMiwgMHhlMSwgMHgxOCwgMHg5OSwKKyAgMHg1NCwgMHg5OCwgMHg0NiwgMHg0ZCwgMHgwOCwgMHg3MCwgMHg5YSwgMHg2NCwKKyAgMHhjNCwgMHgxOCwgMHg0ZiwgMHgyNywgMHg2NCwgMHgzMSwgMHg2NiwgMHgyNywKKyAgMHg3OSwgMHgxOSwgMHgzYywgMHg4YywgMHg4YywgMHhhMywgMHg0NCwgMHgxOCwKKyAgMHgyMywgMHhkMiwgMHg2YiwgMHg4YiwgMHg2NCwgMHg4YywgMHgyMSwgMHg4NCwKKyAgMHhkNiwgMHgyMywgMHgxMywgMHgxMywgMHgyZCwgMHg0NCwgMHhjYSwgMHg1YSwKKyAgMHgyMywgMHgwOSwgMHg5MywgMHgyNSwgMHgxOCwgMHgxMCwgMHg2MSwgMHgzOCwKKyAgMHhiNCwgMHg2MCwgMHg4ZiwgMHgyYywgMHg4ZCwgMHgyNiwgMHhiNCwgMHhjOSwKKyAgMHhkOSwgMHgxOSwgMHgxOSwgMHgzNCwgMHhkNywgMHgzMSwgMHgwNiwgMHgxMCwKKyAgMHhjNCwgMHgzMCwgMHg4MywgMHgxNywgMHhlMiwgMHgwYywgMHgyYywgMHhjNCwKKyAgMHhjOCwgMHhjOSwgMHgzYywgMHg1ZSwgMHg5MywgMHgxMSwgMHg4YSwgMHg2MiwKKyAgMHg2NCwgMHg4YywgMHgyNiwgMHgyMywgMHgyMiwgMHgzMCwgMHg5YSwgMHg1OCwKKyAgMHg4NiwgMHgwNCwgMHgxOCwgMHg0YywgMHhhYiwgMHgyYiwgMHgyNiwgMHg1YywKKyAgMHg0NiwgMHg4OCwgMHhjYiwgMHhiMSwgMHgwZCwgMHgyNiwgMHhiYiwgMHg1ZSwKKyAgMHg4YywgMHhhNywgMHg2NCwgMHgzMSwgMHgzZCwgMHgzMSwgMHgwNiwgMHgyNiwKKyAgMHg0MywgMHgxNywgMHhhMywgMHgwOCwgMHg2MSwgMHgwNiwgMHgxNywgMHhjNCwKKyAgMHg2MiwgMHhlYywgMHg0ZCwgMHg0YiwgMHgyZSwgMHgyZCwgMHg0YSwgMHg5NCwKKyAgMHhhNCwgMHhjMiwgMHgzMSwgMHg0YywgMHg0YywgMHgyMCwgMHhjMCwgMHg4MywKKyAgMHgxNCwgMHg4YywgMHgyNywgMHg4YiwgMHgzMSwgMHgyMywgMHgyZiwgMHgyMywKKyAgMHgxMSwgMHg5MSwgMHg5NCwgMHg2NSwgMHgxYSwgMHgyMCwgMHhjMiwgMHgxOCwKKyAgMHg4NiwgMHg1MSwgMHg4OCwgMHg2MiwgMHg3YywgMHg0MywgMHgyZSwgMHhhMywKKyAgMHgwNCwgMHgxOCwgMHg4YywgMHgyMCwgMHhjMiwgMHhmNSwgMHhhYSwgMHg5NCwKKyAgMHhjMiwgMHgzMSwgMHgzMiwgMHhkMiwgMHhiMiwgMHhhMiwgMHgzMCwgMHhiYSwKKyAgMHgxMCwgMHhjMiwgMHhiNSwgMHg4OSwgMHhhNSwgMHgxOCwgMHgxMCwgMHg2MiwKKyAgMHg5YSwgMHgxMCwgMHg2MSwgMHgxOSwgMHg3MiwgMHg3MSwgMHgxYSwgMHhiOSwKKyAgMHgwYywgMHgyMywgMHg0NiwgMHgxMCwgMHg2MiwgMHg3OCwgMHg4MSwgMHg4MiwKKyAgMHgzZCwgMHg3NSwgMHhlYSwgMHg2YiwgMHg1MSwgMHg4YiwgMHg2MSwgMHgwNiwKKyAgMHgwOCwgMHg2MiwgMHgzMiwgMHg1ZSwgMHg4NCwgMHgxOCwgMHgyNywgMHgyNSwKKyAgMHhjMiwgMHg2YSwgMHg0YiwgMHg1MSwgMHgzMSwgMHgzNCwgMHg1ZSwgMHgyOSwKKyAgMHhhMSwgMHgzYywgMHg0ZCwgMHgyNiwgMHgyMywgMHgxMCwgMHhjMiwgMHg2YiwKKyAgMHhiMSwgMHgwZCwgMHgxMSwgMHhhZSwgMHg0NiwgMHg4OCwgMHgzMSwgMHgzNSwKKyAgMHhiMSwgMHgwNiwgMHgwOCwgMHg3OSwgMHg3ZSwgMHg0ZiwgMHg1MywgMHgyMywKKyAgMHgyOSwgMHhhNCwgMHgzMCwgMHgyMCwgMHgzMCwgMHgyMywgMHg1YSwgMHhiMiwKKyAgMHhjOCwgMHg2MCwgMHg5YywgMHg5MywgMHgxMywgMHgxNywgMHg5MiwgMHg5OCwKKyAgMHg0NiwgMHgxMywgMHg1NCwgMHg1MywgMHgwOCwgMHhjYiwgMHgxMywgMHhhMSwKKyAgMHgxYSwgMHg4OSwgMHhlNSwgMHg0NiwgMHgwOCwgMHgxOCwgMHgxMCwgMHgzMCwKKyAgMHg5ZCwgMHg2OCwgMHhjMiwgMHgxYywgMHg0NiwgMHg0NiwgMHhhZSwgMHg2MiwKKyAgMHgxYSwgMHg0NiwgMHg0ZSwgMHg0ZCwgMHgzNCwgMHg4YywgMHhiZCwgMHgyNiwKKyAgMHhjMCwgMHg0MCwgMHg2MiwgMHhjOSwgMHhhOSwgMHgzMSwgMHg3NCwgMHhhOCwKKyAgMHg5OSwgMHg1MiwgMHhiMCwgMHg4YywgMHhhOSwgMHgyOSwgMHg4NCwgMHg2MSwKKyAgMHgxOSwgMHg1NCwgMHg0MywgMHgwMiwgMHgwNiwgMHgwNCwgMHgzMiwgMHhlNSwKKyAgMHgxOCwgMHgyMSwgMHg5MSwgMHg4YiwgMHhmMiwgMHhjYywgMHgxMCwgMHgzMCwKKyAgMHg4ZSwgMHgyMywgMHhjNCwgMHg3NiwgMHg0MywgMHgwOCwgMHgzMCwgMHg4MywKKyAgMHgwOCwgMHg2MiwgMHg2YywgMHg0ZSwgMHhlMiwgMHgzNSwgMHg5NiwgMHhkMCwKKyAgMHg4ZSwgMHg4OSwgMHg5NywgMHg0MiwgMHgxOCwgMHg5MSwgMHg4NCwgMHg2MSwKKyAgMHgzYywgMHgyNiwgMHhhNSwgMHgyYywgMHg0ZSwgMHgxNywgMHg5NCwgMHhiOCwKKyAgMHhiNSwgMHhhNCwgMHhjYiwgMHg4OCwgMHhjOSwgMHg4NCwgMHgxOCwgMHhiOSwKKyAgMHg4NCwgMHgxOSwgMHgyMywgMHgyZCwgMHhhNCwgMHg2NCwgMHg2MiwgMHgxOCwKKyAgMHg4NiwgMHg1MywgMHg5MywgMHhjYiwgMHgzMCwgMHg4ZiwgMHgyZiwgMHg5MywKKyAgMHg1NSwgMHhjNCwgMHhkNywgMHgwOCwgMHg2MiwgMHhiOCwgMHg0NiwgMHg4NCwKKyAgMHg2OCwgMHhhMywgMHgwMiwgMHhhZiwgMHgzMworfTsKKworc3RhdGljIGd1aW50OCBnYXJiYWdlX2ZyYW1lW10gPSB7CisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKK307CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfZmxhY19ub3JtYWwpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9ub3JtYWwgKGZsYWNfZnJhbWUsIHNpemVvZiAoZmxhY19mcmFtZSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfZmxhY19kcmFpbl9zaW5nbGUpCit7CisgIGdzdF9wYXJzZXJfdGVzdF9kcmFpbl9zaW5nbGUgKGZsYWNfZnJhbWUsIHNpemVvZiAoZmxhY19mcmFtZSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfZmxhY19kcmFpbl9nYXJiYWdlKQoreworICAvKiBXZSBhbHdheXMgb3V0cHV0IHRoZSBhZnRlciBmcmFtZSBnYXJiYWdlIHRvbyBiZWNhdXNlIHdlCisgICAqIGhhdmUgbm8gd2F5IG9mIGRldGVjdGluZyBpdAorICAgKi8KKyNpZiAwCisgIGdzdF9wYXJzZXJfdGVzdF9kcmFpbl9nYXJiYWdlIChmbGFjX2ZyYW1lLCBzaXplb2YgKGZsYWNfZnJhbWUpLAorICAgICAgZ2FyYmFnZV9mcmFtZSwgc2l6ZW9mIChnYXJiYWdlX2ZyYW1lKSk7CisjZW5kaWYKKyAgZ3VpbnQ4IGZyYW1lW3NpemVvZiAoZmxhY19mcmFtZSkgKyBzaXplb2YgKGdhcmJhZ2VfZnJhbWUpXTsKKworICBtZW1jcHkgKGZyYW1lLCBmbGFjX2ZyYW1lLCBzaXplb2YgKGZsYWNfZnJhbWUpKTsKKyAgbWVtY3B5IChmcmFtZSArIHNpemVvZiAoZmxhY19mcmFtZSksIGdhcmJhZ2VfZnJhbWUsIHNpemVvZiAoZ2FyYmFnZV9mcmFtZSkpOworCisgIGdzdF9wYXJzZXJfdGVzdF9kcmFpbl9zaW5nbGUgKGZyYW1lLCBzaXplb2YgKGZyYW1lKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9mbGFjX3NwbGl0KQoreworICBnc3RfcGFyc2VyX3Rlc3Rfc3BsaXQgKGZsYWNfZnJhbWUsIHNpemVvZiAoZmxhY19mcmFtZSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfZmxhY19za2lwX2dhcmJhZ2UpCit7CisgIC8qIFdlIGFsd2F5cyBpbmNsdWRlIHRoZSBnYXJiYWdlIGludG8gdGhlIGZyYW1lIGJlY2F1c2UKKyAgICogd2UgaGF2ZSBubyBlYXN5IHdheSBmb3IgZmluZGluZyB0aGUgcmVhbCBlbmQgb2YgdGhlCisgICAqIGZyYW1lLiBUaGUgZGVjb2RlciB3aWxsIGxhdGVyIHNraXAgdGhlIGdhcmJhZ2UKKyAgICovCisjaWYgMAorICBnc3RfcGFyc2VyX3Rlc3Rfc2tpcF9nYXJiYWdlIChmbGFjX2ZyYW1lLCBzaXplb2YgKGZsYWNfZnJhbWUpLAorICAgICAgZ2FyYmFnZV9mcmFtZSwgc2l6ZW9mIChnYXJiYWdlX2ZyYW1lKSk7CisjZW5kaWYKKyAgZ3VpbnQ4IGZyYW1lW3NpemVvZiAoZmxhY19mcmFtZSkgKyBzaXplb2YgKGdhcmJhZ2VfZnJhbWUpXTsKKworICBtZW1jcHkgKGZyYW1lLCBmbGFjX2ZyYW1lLCBzaXplb2YgKGZsYWNfZnJhbWUpKTsKKyAgbWVtY3B5IChmcmFtZSArIHNpemVvZiAoZmxhY19mcmFtZSksIGdhcmJhZ2VfZnJhbWUsIHNpemVvZiAoZ2FyYmFnZV9mcmFtZSkpOworCisgIGdzdF9wYXJzZXJfdGVzdF9ub3JtYWwgKGZyYW1lLCBzaXplb2YgKGZyYW1lKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCisjZGVmaW5lIHN0cnVjdHVyZV9nZXRfaW50KHMsZikgXAorICAgIChnX3ZhbHVlX2dldF9pbnQoZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUocyxmKSkpCisjZGVmaW5lIGZhaWxfdW5sZXNzX3N0cnVjdHVyZV9maWVsZF9pbnRfZXF1YWxzKHMsZmllbGQsbnVtKSBcCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoc3RydWN0dXJlX2dldF9pbnQocyxmaWVsZCksIG51bSkKKy8qCisgKiBUZXN0IGlmIHRoZSBwYXJzZXIgaGFuZGxlcyByYXcgc3RyZWFtIGFuZCBjb2RlY19kYXRhIGluZm8gcHJvcGVybHkuCisgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX2ZsYWNfZGV0ZWN0X3N0cmVhbSkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0U3RydWN0dXJlICpzOworICBjb25zdCBHVmFsdWUgKnN0cmVhbWhlYWRlcjsKKyAgR0FycmF5ICpidWZhcnI7CisgIGdpbnQgaTsKKworICAvKiBQdXNoIHJhbmRvbSBkYXRhLiBJdCBzaG91bGQgZ2V0IHRocm91Z2ggc2luY2UgdGhlIHBhcnNlciBzaG91bGQgYmUKKyAgICogaW5pdGlhbGl6ZWQgYmVjYXVzZSBpdCBnb3QgY29kZWNfZGF0YSBpbiB0aGUgY2FwcyAqLworICBjYXBzID0gZ3N0X3BhcnNlcl90ZXN0X2dldF9vdXRwdXRfY2FwcyAoZmxhY19mcmFtZSwgc2l6ZW9mIChmbGFjX2ZyYW1lKSwKKyAgICAgIFNSQ19DQVBTX1RNUEwpOworICBmYWlsX3VubGVzcyAoY2FwcyAhPSBOVUxMKTsKKworICAvKiBDaGVjayB0aGF0IHRoZSBuZWdvdGlhdGVkIGNhcHMgYXJlIGFzIGV4cGVjdGVkICovCisgIC8qIFdoZW4gY29kZWNfZGF0YSBpcyBwcmVzZW50LCBwYXJzZXIgYXNzdW1lcyB0aGF0IGRhdGEgaXMgdmVyc2lvbiA0ICovCisgIEdTVF9MT0cgKCJmbGFjIG91dHB1dCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJhdWRpby94LWZsYWMiKSk7CisgIGZhaWxfdW5sZXNzX3N0cnVjdHVyZV9maWVsZF9pbnRfZXF1YWxzIChzLCAiY2hhbm5lbHMiLCAxKTsKKyAgZmFpbF91bmxlc3Nfc3RydWN0dXJlX2ZpZWxkX2ludF9lcXVhbHMgKHMsICJyYXRlIiwgNDQxMDApOworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHMsICJzdHJlYW1oZWFkZXIiKSk7CisgIHN0cmVhbWhlYWRlciA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAic3RyZWFtaGVhZGVyIik7CisgIGZhaWxfdW5sZXNzIChHX1ZBTFVFX1RZUEUgKHN0cmVhbWhlYWRlcikgPT0gR1NUX1RZUEVfQVJSQVkpOworICBidWZhcnIgPSBnX3ZhbHVlX3BlZWtfcG9pbnRlciAoc3RyZWFtaGVhZGVyKTsKKyAgZmFpbF91bmxlc3MgKGJ1ZmFyci0+bGVuID09IDIpOworICBmb3IgKGkgPSAwOyBpIDwgYnVmYXJyLT5sZW47IGkrKykgeworICAgIEdzdEJ1ZmZlciAqYnVmOworICAgIEdWYWx1ZSAqYnVmdmFsID0gJmdfYXJyYXlfaW5kZXggKGJ1ZmFyciwgR1ZhbHVlLCBpKTsKKworICAgIGZhaWxfdW5sZXNzIChHX1ZBTFVFX1RZUEUgKGJ1ZnZhbCkgPT0gR1NUX1RZUEVfQlVGRkVSKTsKKyAgICBidWYgPSBnX3ZhbHVlX3BlZWtfcG9pbnRlciAoYnVmdmFsKTsKKyAgICBpZiAoaSA9PSAwKSB7CisgICAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSA9PSBzaXplb2YgKHN0cmVhbWluZm9faGVhZGVyKSk7CisgICAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKGJ1ZiwgMCwgc3RyZWFtaW5mb19oZWFkZXIsCisgICAgICAgICAgICAgIHNpemVvZiAoc3RyZWFtaW5mb19oZWFkZXIpKSA9PSAwKTsKKyAgICB9IGVsc2UgaWYgKGkgPT0gMSkgeworICAgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikgPT0gc2l6ZW9mIChjb21tZW50X2hlYWRlcikpOworICAgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChidWYsIDAsIGNvbW1lbnRfaGVhZGVyLAorICAgICAgICAgICAgICBzaXplb2YgKGNvbW1lbnRfaGVhZGVyKSkgPT0gMCk7CisgICAgfQorICB9CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitmbGFjcGFyc2Vfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiZmxhY3BhcnNlIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworCisgIC8qIGluaXQgdGVzdCBjb250ZXh0ICovCisgIGN0eF9mYWN0b3J5ID0gImZsYWNwYXJzZSI7CisgIGN0eF9zaW5rX3RlbXBsYXRlID0gJnNpbmt0ZW1wbGF0ZTsKKyAgY3R4X3NyY190ZW1wbGF0ZSA9ICZzcmN0ZW1wbGF0ZTsKKyAgY3R4X2Rpc2NhcmQgPSAzOworICBjdHhfaGVhZGVyc1swXS5kYXRhID0gc3RyZWFtaW5mb19oZWFkZXI7CisgIGN0eF9oZWFkZXJzWzBdLnNpemUgPSBzaXplb2YgKHN0cmVhbWluZm9faGVhZGVyKTsKKyAgY3R4X2hlYWRlcnNbMV0uZGF0YSA9IGNvbW1lbnRfaGVhZGVyOworICBjdHhfaGVhZGVyc1sxXS5zaXplID0gc2l6ZW9mIChjb21tZW50X2hlYWRlcik7CisKKyAgLyogY3VzdG9tIG9mZnNldHMsIGFuZCB0cyBhbHdheXMgcmVwZWF0ZWRseSAwICovCisgIGN0eF9ub19tZXRhZGF0YSA9IFRSVUU7CisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfZmxhY19ub3JtYWwpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfZmxhY19kcmFpbl9zaW5nbGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfZmxhY19kcmFpbl9nYXJiYWdlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX2ZsYWNfc3BsaXQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2VfZmxhY19za2lwX2dhcmJhZ2UpOworCisgIC8qIE90aGVyIHRlc3RzICovCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9mbGFjX2RldGVjdF9zdHJlYW0pOworCisgIHJldHVybiBzOworfQorCisKKy8qCisgKiBUT0RPOgorICogICAtIEJvdGggcHVzaC0gYW5kIHB1bGwtbW9kZXMgbmVlZCB0byBiZSB0ZXN0ZWQKKyAqICAgICAgKiBQdWxsLW1vZGUgJiBFT1MKKyAqLworR1NUX0NIRUNLX01BSU4gKGZsYWNwYXJzZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZkZW11eC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2ZGVtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODk1NWJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvZmx2ZGVtdXguYwpAQCAtMCwwICsxLDU0NCBAQAorLyogR1N0cmVhbWVyIHVuaXQgdGVzdHMgZm9yIGZsdmRlbXV4CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICogQ29weXJpZ2h0IChDKSAyMDE2IEhhdmFyZCBHcmFmZiAgICAgICAgPGhhdmFyZEBwZXhpcC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RoYXJuZXNzLmg+CisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3RhZy90YWcuaD4KKworc3RhdGljIHZvaWQKK3BhZF9hZGRlZF9jYiAoR3N0RWxlbWVudCAqIGZsdmRlbXV4LCBHc3RQYWQgKiBwYWQsIEdzdEJpbiAqIHBpcGVsaW5lKQoreworICBHc3RFbGVtZW50ICpzaW5rOworCisgIHNpbmsgPSBnc3RfYmluX2dldF9ieV9uYW1lIChwaXBlbGluZSwgImZha2VzaW5rIik7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rIChmbHZkZW11eCwgc2luaykpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNpbmssIEdTVF9TVEFURV9QQVVTRUQpOworfQorCitzdGF0aWMgR3N0QnVzU3luY1JlcGx5CitlcnJvcl9jYiAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbXNnLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGlmIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VSUk9SKSB7CisgICAgY29uc3QgZ2NoYXIgKmZpbGUgPSAoY29uc3QgZ2NoYXIgKikgdXNlcl9kYXRhOworICAgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgICBnY2hhciAqZGJnID0gTlVMTDsKKworICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtc2csICZlcnIsICZkYmcpOworICAgIGdfZXJyb3IgKCJFUlJPUiBmb3IgJXM6ICVzXG4lc1xuIiwgZmlsZSwgZXJyLT5tZXNzYWdlLCBkYmcpOworICB9CisKKyAgcmV0dXJuIEdTVF9CVVNfUEFTUzsKK30KKworc3RhdGljIHZvaWQKK2hhbmRvZmZfY2IgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RCdWZmZXIgKiBidWYsIEdzdFBhZCAqIHBhZCwKKyAgICBnaW50ICogcF9jb3VudGVyKQoreworICAqcF9jb3VudGVyICs9IDE7CisgIEdTVF9MT0cgKCJjb3VudGVyID0gJWQiLCAqcF9jb3VudGVyKTsKK30KKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfZmlsZSAoY29uc3QgZ2NoYXIgKiBmaWxlLCBnYm9vbGVhbiBwdXNoX21vZGUsIGdpbnQgcmVwZWF0LAorICAgIGdpbnQgbnVtX2J1ZmZlcnMpCit7CisgIEdzdEVsZW1lbnQgKnNyYywgKnNlcCwgKnNpbmssICpmbHZkZW11eCwgKnBpcGVsaW5lOworICBHc3RCdXMgKmJ1czsKKyAgZ2NoYXIgKnBhdGg7CisgIGdpbnQgY291bnRlcjsKKworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBmYWlsX3VubGVzcyAocGlwZWxpbmUgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgcGlwZWxpbmUhIik7CisKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAocGlwZWxpbmUpOworCisgIC8qIGtpZHMsIGRvbid0IHVzZSBhIHN5bmMgaGFuZGxlciBmb3IgdGhpcyBhdCBob21lLCByZWFsbHk7IHdlIGRvIGJlY2F1c2UKKyAgICogd2UganVzdCB3YW50IHRvIGFib3J0IGFuZCBub3RoaW5nIGVsc2UgKi8KKyAgZ3N0X2J1c19zZXRfc3luY19oYW5kbGVyIChidXMsIGVycm9yX2NiLCAoZ3BvaW50ZXIpIGZpbGUsIE5VTEwpOworCisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZpbGVzcmMiLCAiZmlsZXNyYyIpOworICBmYWlsX3VubGVzcyAoc3JjICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlICdmaWxlc3JjJyBlbGVtZW50ISIpOworCisgIGlmIChwdXNoX21vZGUpIHsKKyAgICBzZXAgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJxdWV1ZSIsICJxdWV1ZSIpOworICAgIGZhaWxfdW5sZXNzIChzZXAgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgJ3F1ZXVlJyBlbGVtZW50Iik7CisgIH0gZWxzZSB7CisgICAgc2VwID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaWRlbnRpdHkiLCAiaWRlbnRpdHkiKTsKKyAgICBmYWlsX3VubGVzcyAoc2VwICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlICdpZGVudGl0eScgZWxlbWVudCIpOworICB9CisKKyAgZmx2ZGVtdXggPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmbHZkZW11eCIsICJmbHZkZW11eCIpOworICBmYWlsX3VubGVzcyAoZmx2ZGVtdXggIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgJ2ZsdmRlbXV4JyBlbGVtZW50ISIpOworCisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJmYWtlc2luayIpOworICBmYWlsX3VubGVzcyAoc2luayAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSAnZmFrZXNpbmsnIGVsZW1lbnQhIik7CisKKyAgZ19vYmplY3Rfc2V0IChzaW5rLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNpbmssICJoYW5kb2ZmIiwgR19DQUxMQkFDSyAoaGFuZG9mZl9jYiksICZjb3VudGVyKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHNyYywgc2VwLCBmbHZkZW11eCwgc2luaywgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmsgKHNyYywgc2VwKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rIChzZXAsIGZsdmRlbXV4KSk7CisKKyAgLyogY2FuJ3QgbGluayBmbHZkZW11eCBhbmQgc2luayB5ZXQsIGRvIHRoYXQgbGF0ZXIgKi8KKyAgZ19zaWduYWxfY29ubmVjdCAoZmx2ZGVtdXgsICJwYWQtYWRkZWQiLCBHX0NBTExCQUNLIChwYWRfYWRkZWRfY2IpLCBwaXBlbGluZSk7CisKKyAgcGF0aCA9IGdfYnVpbGRfZmlsZW5hbWUgKEdTVF9URVNUX0ZJTEVTX1BBVEgsIGZpbGUsIE5VTEwpOworICBHU1RfTE9HICgicHJvY2Vzc2luZyBmaWxlICclcyciLCBwYXRoKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMsICJsb2NhdGlvbiIsIHBhdGgsIE5VTEwpOworCisgIGRvIHsKKyAgICBHc3RTdGF0ZUNoYW5nZVJldHVybiBzdGF0ZV9yZXQ7CisgICAgR3N0TWVzc2FnZSAqbXNnOworCisgICAgR1NUX0xPRyAoInJlcGVhdD0lZCIsIHJlcGVhdCk7CisKKyAgICBjb3VudGVyID0gMDsKKworICAgIHN0YXRlX3JldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QQVVTRUQpOworICAgIGZhaWxfdW5sZXNzIChzdGF0ZV9yZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICAgIGlmIChzdGF0ZV9yZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9BU1lOQykgeworICAgICAgR1NUX0xPRyAoIndhaXRpbmcgZm9yIHBpcGVsaW5lIHRvIHJlYWNoIFBBVVNFRCBzdGF0ZSIpOworICAgICAgc3RhdGVfcmV0ID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChwaXBlbGluZSwgTlVMTCwgTlVMTCwgLTEpOworICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoc3RhdGVfcmV0LCBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworICAgIH0KKworICAgIEdTVF9MT0cgKCJQQVVTRUQsIGxldCdzIHJlYWQgYWxsIG9mIGl0Iik7CisKKyAgICBzdGF0ZV9yZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisgICAgZmFpbF91bmxlc3MgKHN0YXRlX3JldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgICAgbXNnID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX0VPUywgLTEpOworICAgIGZhaWxfdW5sZXNzIChtc2cgIT0gTlVMTCwgIkV4cGVjdGVkIEVPUyBtZXNzYWdlIG9uIGJ1cyEgKCVzKSIsIGZpbGUpOworCisgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisKKyAgICBpZiAobnVtX2J1ZmZlcnMgPj0gMCkgeworICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoY291bnRlciwgbnVtX2J1ZmZlcnMpOworICAgIH0KKworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKSwKKyAgICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICAgIC0tcmVwZWF0OworICB9IHdoaWxlIChyZXBlYXQgPiAwKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisKKyAgZ19mcmVlIChwYXRoKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcmV1c2VfcHVsbCkKK3sKKyAgcHJvY2Vzc19maWxlICgicGNtMTZzaW5lLmZsdiIsIEZBTFNFLCAzLCAxMjkpOworICBnc3RfdGFza19jbGVhbnVwX2FsbCAoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9yZXVzZV9wdXNoKQoreworICBwcm9jZXNzX2ZpbGUgKCJwY20xNnNpbmUuZmx2IiwgVFJVRSwgMywgMTI5KTsKKyAgZ3N0X3Rhc2tfY2xlYW51cF9hbGwgKCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIEdzdEJ1ZmZlciAqCitjcmVhdGVfYnVmZmVyIChndWludDggKiBkYXRhLCBnc2l6ZSBzaXplKQoreworICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWRfZnVsbCAoR1NUX01FTU9SWV9GTEFHX1JFQURPTkxZLAorICAgICAgZGF0YSwgc2l6ZSwgMCwgc2l6ZSwgTlVMTCwgTlVMTCk7CisgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgR1NUX0JVRkZFUl9EVFMgKGJ1ZikgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FOworICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZikgPSBHU1RfQlVGRkVSX09GRlNFVF9OT05FOworICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgdm9pZAorZmx2ZGVtdXhfcGFkX2FkZGVkIChHc3RFbGVtZW50ICogZmx2ZGVtdXgsIEdzdFBhZCAqIHNyY3BhZCwgR3N0SGFybmVzcyAqIGgpCit7CisgIEdzdENhcHMgKmNhcHM7CisgICh2b2lkKSBmbHZkZW11eDsKKworICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChzcmNwYWQpOworICBmYWlsX3VubGVzcyAoY2FwcyAhPSBOVUxMKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBnc3RfaGFybmVzc19hZGRfZWxlbWVudF9zcmNfcGFkIChoLCBzcmNwYWQpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zcGVleCkKK3sKKyAgZ3VpbnQ4IGZsdl9oZWFkZXIwW10gPSB7CisgICAgMHg0NiwgMHg0YywgMHg1NiwgMHgwMSwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwCisgIH07CisKKyAgZ3VpbnQ4IGZsdl9oZWFkZXIxW10gPSB7CisgICAgMHgxMiwgMHgwMCwgMHgwMCwgMHg3YywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDBhLCAweDZmLCAweDZlLAorICAgIDB4NGQsIDB4NjUsIDB4NzQsIDB4NjEsIDB4NDQsIDB4NjEsIDB4NzQsIDB4NjEsCisgICAgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHg2MSwKKyAgICAweDc1LCAweDY0LCAweDY5LCAweDZmLCAweDYzLCAweDZmLCAweDY0LCAweDY1LAorICAgIDB4NjMsIDB4NjksIDB4NjQsIDB4MDAsIDB4NDAsIDB4MjYsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZiwgMHg2ZCwgMHg2NSwKKyAgICAweDc0LCAweDYxLCAweDY0LCAweDYxLCAweDc0LCAweDYxLCAweDYzLCAweDcyLAorICAgIDB4NjUsIDB4NjEsIDB4NzQsIDB4NmYsIDB4NzIsIDB4MDIsIDB4MDAsIDB4MTMsCisgICAgMHg0NywgMHg1MywgMHg3NCwgMHg3MiwgMHg2NSwgMHg2MSwgMHg2ZCwgMHg2NSwKKyAgICAweDcyLCAweDIwLCAweDQ2LCAweDRjLCAweDU2LCAweDIwLCAweDZkLCAweDc1LAorICAgIDB4NzgsIDB4NjUsIDB4NzIsIDB4MDAsIDB4MGMsIDB4NjMsIDB4NzIsIDB4NjUsCisgICAgMHg2MSwgMHg3NCwgMHg2OSwgMHg2ZiwgMHg2ZSwgMHg2NCwgMHg2MSwgMHg3NCwKKyAgICAweDY1LCAweDAyLCAweDAwLCAweDE4LCAweDU3LCAweDY1LCAweDY0LCAweDIwLAorICAgIDB4NTMsIDB4NjUsIDB4NzAsIDB4MjAsIDB4MzIsIDB4MzMsIDB4MjAsIDB4MzEsCisgICAgMHgzMCwgMHgzYSwgMHgzNCwgMHgzOSwgMHgzYSwgMHgzNSwgMHgzNiwgMHgyMCwKKyAgICAweDMyLCAweDMwLCAweDMxLCAweDM1LCAweDAwLCAweDAwLCAweDA5LCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4ODcsCisgIH07CisKKyAgZ3VpbnQ4IHNwZWV4X2hlYWRlcjBbXSA9IHsKKyAgICAweDA4LCAweDAwLCAweDAwLCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjIsIDB4NTMsIDB4NzAsIDB4NjUsIDB4NjUsCisgICAgMHg3OCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgzMSwgMHgyZSwgMHgzMiwgMHg3MiwKKyAgICAweDYzLCAweDMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDgwLCAweDNlLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHg0MCwgMHgwMSwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1YywKKyAgfTsKKworICBndWludDggc3BlZXhfaGVhZGVyMVtdID0geworICAgIDB4MDgsIDB4MDAsIDB4MDAsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMiwgMHgxZiwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDQ1LCAweDZlLCAweDYzLCAweDZmLCAweDY0LCAweDY1LCAweDY0LCAweDIwLAorICAgIDB4NzcsIDB4NjksIDB4NzQsIDB4NjgsIDB4MjAsIDB4NDcsIDB4NTMsIDB4NzQsCisgICAgMHg3MiwgMHg2NSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHg3MiwgMHgyMCwgMHg1MywKKyAgICAweDcwLCAweDY1LCAweDY1LCAweDc4LCAweDY1LCAweDZlLCAweDYzLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzQsCisgIH07CisKKyAgZ3VpbnQ4IGJ1ZmZlcltdID0geworICAgIDB4MDgsIDB4MDAsIDB4MDAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMiwgMHgzNiwgMHg5ZCwgMHgxYiwgMHg5YSwKKyAgICAweDIwLCAweDAwLCAweDAxLCAweDY4LCAweGU4LCAweGU4LCAweGU4LCAweGU4LAorICAgIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ODQsIDB4MDAsIDB4YjQsIDB4NzQsIDB4NzQsCisgICAgMHg3NCwgMHg3NCwgMHg3NCwgMHg3NCwgMHg3NCwgMHg0MiwgMHgwMCwgMHg1YSwKKyAgICAweDNhLCAweDNhLCAweDNhLCAweDNhLCAweDNhLCAweDNhLCAweDNhLCAweDIxLAorICAgIDB4MDAsIDB4MmQsIDB4MWQsIDB4MWQsIDB4MWQsIDB4MWQsIDB4MWQsIDB4MWQsCisgICAgMHgxZCwgMHgxYiwgMHgzYiwgMHg2MCwgMHhhYiwgMHhhYiwgMHhhYiwgMHhhYiwKKyAgICAweGFiLCAweDBhLCAweGJhLCAweGJhLCAweGJhLCAweGJhLCAweGIwLCAweGFiLAorICAgIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4MGEsIDB4YmEsIDB4YmEsIDB4YmEsCisgICAgMHhiYSwgMHhiNywgMHgwMCwgMHgwMCwgMHgwMCwgMHg1MiwKKyAgfTsKKworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfcGFkbmFtZXMgKCJmbHZkZW11eCIsICJzaW5rIiwgTlVMTCk7CisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgsICJ2aWRlby94LWZsdiIpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGgtPmVsZW1lbnQsICJwYWQtYWRkZWQiLAorICAgICAgR19DQUxMQkFDSyAoZmx2ZGVtdXhfcGFkX2FkZGVkKSwgaCk7CisKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgY3JlYXRlX2J1ZmZlciAoZmx2X2hlYWRlcjAsIHNpemVvZiAoZmx2X2hlYWRlcjApKSk7CisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGNyZWF0ZV9idWZmZXIgKGZsdl9oZWFkZXIxLCBzaXplb2YgKGZsdl9oZWFkZXIxKSkpOworICBnc3RfaGFybmVzc19wdXNoIChoLCBjcmVhdGVfYnVmZmVyIChzcGVleF9oZWFkZXIwLCBzaXplb2YgKHNwZWV4X2hlYWRlcjApKSk7CisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGNyZWF0ZV9idWZmZXIgKHNwZWV4X2hlYWRlcjEsIHNpemVvZiAoc3BlZXhfaGVhZGVyMSkpKTsKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgY3JlYXRlX2J1ZmZlciAoYnVmZmVyLCBzaXplb2YgKGJ1ZmZlcikpKTsKKworICB7CisgICAgR3N0Q2FwcyAqY2FwczsKKyAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgY29uc3QgR1ZhbHVlICpzdHJlYW1oZWFkZXI7CisgICAgY29uc3QgR1ZhbHVlICpoZWFkZXI7CisgICAgY29uc3QgR1ZhbHVlICp2b3JiaXNjb21tZW50OworICAgIEdzdEJ1ZmZlciAqYnVmOworICAgIEdzdFRhZ0xpc3QgKmxpc3Q7CisgICAgZ2ludCByYXRlOworICAgIGdpbnQgY2hhbm5lbHM7CisKKyAgICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChoLT5zaW5rcGFkKTsKKyAgICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9oYXNfbmFtZSAocywgImF1ZGlvL3gtc3BlZXgiKSk7CisKKyAgICBzdHJlYW1oZWFkZXIgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgInN0cmVhbWhlYWRlciIpOworICAgIGZhaWxfdW5sZXNzIChzdHJlYW1oZWFkZXIgIT0gTlVMTCk7CisgICAgZmFpbF91bmxlc3MgKEdfVkFMVUVfSE9MRFMgKHN0cmVhbWhlYWRlciwgR1NUX1RZUEVfQVJSQVkpKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgyLCBnc3RfdmFsdWVfYXJyYXlfZ2V0X3NpemUgKHN0cmVhbWhlYWRlcikpOworCisgICAgaGVhZGVyID0gZ3N0X3ZhbHVlX2FycmF5X2dldF92YWx1ZSAoc3RyZWFtaGVhZGVyLCAwKTsKKyAgICBmYWlsX3VubGVzcyAoaGVhZGVyICE9IE5VTEwpOworICAgIGZhaWxfdW5sZXNzIChHX1ZBTFVFX0hPTERTIChoZWFkZXIsIEdTVF9UWVBFX0JVRkZFUikpOworICAgIGJ1ZiA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyIChoZWFkZXIpOworCisgICAgdm9yYmlzY29tbWVudCA9IGdzdF92YWx1ZV9hcnJheV9nZXRfdmFsdWUgKHN0cmVhbWhlYWRlciwgMSk7CisgICAgZmFpbF91bmxlc3MgKGhlYWRlciAhPSBOVUxMKTsKKyAgICBmYWlsX3VubGVzcyAoR19WQUxVRV9IT0xEUyAoaGVhZGVyLCBHU1RfVFlQRV9CVUZGRVIpKTsKKyAgICBidWYgPSBnc3RfdmFsdWVfZ2V0X2J1ZmZlciAodm9yYmlzY29tbWVudCk7CisgICAgbGlzdCA9IGdzdF90YWdfbGlzdF9mcm9tX3ZvcmJpc2NvbW1lbnRfYnVmZmVyIChidWYsIE5VTEwsIDAsIE5VTEwpOworICAgIGZhaWxfdW5sZXNzIChsaXN0ICE9IE5VTEwpOworICAgIGdzdF90YWdfbGlzdF91bnJlZiAobGlzdCk7CisKKyAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJyYXRlIiwgJnJhdGUpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDE2MDAwLCByYXRlKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgImNoYW5uZWxzIiwgJmNoYW5uZWxzKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgxLCBjaGFubmVscyk7CisKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIH0KKworICAvKiB3ZSBzaG91bGQgaGF2ZSBnb3R0ZW4gMnggc3BlZXgtaGVhZGVycywgYW5kIG9uZSBlbmNvZGVkIGJ1ZmZlciAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgzLCBnc3RfaGFybmVzc19idWZmZXJzX2luX3F1ZXVlIChoKSk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYWFjKQoreworICBndWludDggZmx2X2hlYWRlcltdID0geworICAgIDB4NDYsIDB4NGMsIDB4NTYsIDB4MDEsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDEyLCAweDAwLCAweDAwLCAweDJkLCAgICAgLyogc2NyaXB0IHRhZyAqLworICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsCisgICAgMHgwMCwgMHgwYSwgMHg2ZiwgMHg2ZSwgMHg0ZCwgMHg2NSwgMHg3NCwgMHg2MSwKKyAgICAweDQ0LCAweDYxLCAweDc0LCAweDYxLCAweDAzLCAweDAwLCAweDA2LCAweDUzLAorICAgIDB4NjUsIDB4NzIsIDB4NzYsIDB4NjUsIDB4NzIsIDB4MDIsIDB4MDAsIDB4MTEsCisgICAgMHg1MCwgMHg2NSwgMHg3OCwgMHg2OSwgMHg3MCwgMHgyMCwgMHg1MiwgMHg1NCwKKyAgICAweDRkLCAweDUwLCAweDIwLCAweDUzLCAweDY1LCAweDcyLCAweDc2LCAweDY1LAorICAgIDB4NzIsIDB4MDAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzgsCisgIH07CisKKyAgZ3VpbnQ4IGFhY19oZWFkZXJbXSA9IHsKKyAgICAweDA4LCAweDAwLCAweDAwLCAweDA0LCAgICAgLyogYXVkaW8gdGFnICovCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhZiwKKyAgICAweDAwLCAweDEzLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDBmLAorICB9OworCisgIGd1aW50OCBhYWNfYnVmZmVyW10gPSB7CisgICAgMHgwOCwgMHgwMCwgMHgwMSwgMHg1NywgICAgIC8qIGF1ZGlvIHRhZyAqLworICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YWYsCisgICAgMHgwMSwgMHgyMSwgMHgyMSwgMHg0NSwgMHgwMCwgMHgxNCwgMHg1MCwgMHgwMSwKKyAgICAweDQ2LCAweGYwLCAweDRkLCAweGZiLCAweDAxLCAweDNjLCAweDA4LCAweDQwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwNywgMHgwZSwgMHgwMCwgMHgwZCwgMHhmZiwgMHhlMiwgMHgxNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LAorICAgIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsCisgICAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgICAweGI0LCAweGI0LCAweGI0LCAweGJiLCAweGM2LCAweDg0LCAweDI5LCAweDY5LAorICAgIDB4NjksIDB4NjksIDB4NjksIDB4NjksIDB4NjksIDB4NjksIDB4NjksIDB4NjksCisgICAgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OSwKKyAgICAweDY5LCAweDY5LCAweDY5LCAweDY5LCAweDY5LCAweDY5LCAweDY5LCAweDY5LAorICAgIDB4NjksIDB4NjksIDB4NjksIDB4NjksIDB4NjksIDB4NjksIDB4NjksIDB4NjksCisgICAgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OSwgMHg3OCwgMHgwMCwgMHgwMCwKKyAgICAweDAxLCAweDYyCisgIH07CisKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ld193aXRoX3BhZG5hbWVzICgiZmx2ZGVtdXgiLCAic2luayIsIE5VTEwpOworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChoLCAidmlkZW8veC1mbHYiKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChoLT5lbGVtZW50LCAicGFkLWFkZGVkIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKGZsdmRlbXV4X3BhZF9hZGRlZCksIGgpOworCisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGNyZWF0ZV9idWZmZXIgKGZsdl9oZWFkZXIsIHNpemVvZiAoZmx2X2hlYWRlcikpKTsKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgY3JlYXRlX2J1ZmZlciAoYWFjX2hlYWRlciwgc2l6ZW9mIChhYWNfaGVhZGVyKSkpOworICBnc3RfaGFybmVzc19wdXNoIChoLCBjcmVhdGVfYnVmZmVyIChhYWNfYnVmZmVyLCBzaXplb2YgKGFhY19idWZmZXIpKSk7CisKKyAgeworICAgIEdzdENhcHMgKmNhcHM7CisgICAgY29uc3QgR3N0U3RydWN0dXJlICpzOworICAgIGdpbnQgbXBlZ3ZlcnNpb247CisgICAgZ2Jvb2xlYW4gZnJhbWVkOworICAgIGNvbnN0IGdjaGFyICpzdHJlYW1fZm9ybWF0OworICAgIGdpbnQgcmF0ZTsKKyAgICBnaW50IGNoYW5uZWxzOworICAgIGNvbnN0IEdWYWx1ZSAqY29kZWNfZGF0YTsKKworICAgIGNhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKGgtPnNpbmtwYWQpOworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKworICAgIGZhaWxfdW5sZXNzIChnc3Rfc3RydWN0dXJlX2hhc19uYW1lIChzLCAiYXVkaW8vbXBlZyIpKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAocywgIm1wZWd2ZXJzaW9uIiwgJm1wZWd2ZXJzaW9uKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICg0LCBtcGVndmVyc2lvbik7CisKKyAgICBnc3Rfc3RydWN0dXJlX2dldF9ib29sZWFuIChzLCAiZnJhbWVkIiwgJmZyYW1lZCk7CisgICAgZmFpbF91bmxlc3MgKGZyYW1lZCA9PSBUUlVFKTsKKworICAgIHN0cmVhbV9mb3JtYXQgPSBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKHMsICJzdHJlYW0tZm9ybWF0Iik7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoInJhdyIsIHN0cmVhbV9mb3JtYXQpOworCisgICAgZ3N0X3N0cnVjdHVyZV9nZXRfaW50IChzLCAicmF0ZSIsICZyYXRlKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgyNDAwMCwgcmF0ZSk7CisKKyAgICBnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHMsICJjaGFubmVscyIsICZjaGFubmVscyk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMiwgY2hhbm5lbHMpOworCisgICAgY29kZWNfZGF0YSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAiY29kZWNfZGF0YSIpOworICAgIGZhaWxfdW5sZXNzIChjb2RlY19kYXRhICE9IE5VTEwpOworICAgIGZhaWxfdW5sZXNzIChHX1ZBTFVFX0hPTERTIChjb2RlY19kYXRhLCBHU1RfVFlQRV9CVUZGRVIpKTsKKworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgfQorCisgIC8qIHdlIHNob3VsZCBoYXZlIGdvdHRlbiBvbmUgZW5jb2RlZCBidWZmZXIgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMSwgZ3N0X2hhcm5lc3NfYnVmZmVyc19pbl9xdWV1ZSAoaCkpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9oMjY0KQoreworICBndWludDggZmx2X2hlYWRlcltdID0geworICAgIDB4NDYsIDB4NGMsIDB4NTYsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDEyLCAweDAwLCAweDAwLCAweDJkLCAgICAgLyogc2NyaXB0IHRhZyAqLworICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsCisgICAgMHgwMCwgMHgwYSwgMHg2ZiwgMHg2ZSwgMHg0ZCwgMHg2NSwgMHg3NCwgMHg2MSwKKyAgICAweDQ0LCAweDYxLCAweDc0LCAweDYxLCAweDAzLCAweDAwLCAweDA2LCAweDUzLAorICAgIDB4NjUsIDB4NzIsIDB4NzYsIDB4NjUsIDB4NzIsIDB4MDIsIDB4MDAsIDB4MTEsCisgICAgMHg1MCwgMHg2NSwgMHg3OCwgMHg2OSwgMHg3MCwgMHgyMCwgMHg1MiwgMHg1NCwKKyAgICAweDRkLCAweDUwLCAweDIwLCAweDUzLCAweDY1LCAweDcyLCAweDc2LCAweDY1LAorICAgIDB4NzIsIDB4MDAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzgsCisgIH07CisKKyAgZ3VpbnQ4IGgyNjRfcGFja2V0MFtdID0geworICAgIDB4MDksIDB4MDAsIDB4MDAsIDB4MWUsICAgICAvKiB2aWRlbyB0YWcgKi8KKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE3LAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NDIsIDB4YzAsIDB4MWUsCisgICAgMHhmZiwgMHhlMSwgMHgwMCwgMHgwYSwgMHg2NywgMHg0MiwgMHhjMCwgMHgxZSwKKyAgICAweDk1LCAweGEwLCAweDI4LCAweDBiLCAweGRlLCAweDU0LCAweDAxLCAweDAwLAorICAgIDB4MDQsIDB4NjgsIDB4Y2UsIDB4M2MsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgyOQorICB9OworCisgIGd1aW50OCBoMjY0X3BhY2tldDFbXSA9IHsKKyAgICAweDA5LCAweDAwLCAweDAwLCAweDFiLCAgICAgLyogdmlkZW8gdGFnICovCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNywKKyAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBhLAorICAgIDB4NjcsIDB4NDIsIDB4YzAsIDB4MWUsIDB4OTUsIDB4YTAsIDB4MjgsIDB4MGIsCisgICAgMHhkZSwgMHg1NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg2OCwgMHhjZSwKKyAgICAweDNjLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDI2CisgIH07CisKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ld193aXRoX3BhZG5hbWVzICgiZmx2ZGVtdXgiLCAic2luayIsIE5VTEwpOworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChoLCAidmlkZW8veC1mbHYiKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChoLT5lbGVtZW50LCAicGFkLWFkZGVkIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKGZsdmRlbXV4X3BhZF9hZGRlZCksIGgpOworCisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGNyZWF0ZV9idWZmZXIgKGZsdl9oZWFkZXIsIHNpemVvZiAoZmx2X2hlYWRlcikpKTsKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgY3JlYXRlX2J1ZmZlciAoaDI2NF9wYWNrZXQwLCBzaXplb2YgKGgyNjRfcGFja2V0MCkpKTsKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgY3JlYXRlX2J1ZmZlciAoaDI2NF9wYWNrZXQxLCBzaXplb2YgKGgyNjRfcGFja2V0MSkpKTsKKworICB7CisgICAgR3N0Q2FwcyAqY2FwczsKKyAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgY29uc3QgZ2NoYXIgKnN0cmVhbV9mb3JtYXQ7CisgICAgY29uc3QgR1ZhbHVlICpjb2RlY19kYXRhOworCisgICAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAoaC0+c2lua3BhZCk7CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgICAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJ2aWRlby94LWgyNjQiKSk7CisKKyAgICBzdHJlYW1fZm9ybWF0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAic3RyZWFtLWZvcm1hdCIpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKCJhdmMiLCBzdHJlYW1fZm9ybWF0KTsKKworICAgIGNvZGVjX2RhdGEgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgImNvZGVjX2RhdGEiKTsKKyAgICBmYWlsX3VubGVzcyAoY29kZWNfZGF0YSAhPSBOVUxMKTsKKyAgICBmYWlsX3VubGVzcyAoR19WQUxVRV9IT0xEUyAoY29kZWNfZGF0YSwgR1NUX1RZUEVfQlVGRkVSKSk7CisKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIH0KKworICAvKiB3ZSBzaG91bGQgaGF2ZSBnb3R0ZW4gb25lIGVuY29kZWQgYnVmZmVyICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDEsIGdzdF9oYXJuZXNzX2J1ZmZlcnNfaW5fcXVldWUgKGgpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitzdGF0aWMgU3VpdGUgKgorZmx2ZGVtdXhfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiZmx2ZGVtdXgiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcmV1c2VfcHVzaCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9yZXVzZV9wdWxsKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfc3BlZXgpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYWFjKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2gyNjQpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoZmx2ZGVtdXgpCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZtdXguYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2Zsdm11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZjliOTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9mbHZtdXguYwpAQCAtMCwwICsxLDQ0OCBAQAorLyogR1N0cmVhbWVyIHVuaXQgdGVzdHMgZm9yIGZsdm11eAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaW0tUGhpbGlwcCBNw7xsbGVyICA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAxNiBIYXZhcmQgR3JhZmYgPGhhdmFyZEBwZXhpcC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgRGF2aWQgQnVjaG1hbm4gPGRhdmlkQHBleGlwLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9WQUxHUklORAorIyBpbmNsdWRlIDx2YWxncmluZC92YWxncmluZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0aGFybmVzcy5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitzdGF0aWMgR3N0QnVzU3luY1JlcGx5CitlcnJvcl9jYiAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbXNnLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGlmIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VSUk9SKSB7CisgICAgR0Vycm9yICplcnIgPSBOVUxMOworICAgIGdjaGFyICpkYmcgPSBOVUxMOworCisgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1zZywgJmVyciwgJmRiZyk7CisgICAgZ19lcnJvciAoIkVSUk9SOiAlc1xuJXNcbiIsIGVyci0+bWVzc2FnZSwgZGJnKTsKKyAgfQorCisgIHJldHVybiBHU1RfQlVTX1BBU1M7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kb2ZmX2NiIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0QnVmZmVyICogYnVmLCBHc3RQYWQgKiBwYWQsCisgICAgZ2ludCAqIHBfY291bnRlcikKK3sKKyAgKnBfY291bnRlciArPSAxOworICBHU1RfTE9HICgiY291bnRlciA9ICVkIiwgKnBfY291bnRlcik7Cit9CisKK3N0YXRpYyB2b2lkCittdXhfcGNtX2F1ZGlvIChndWludCBudW1fYnVmZmVycywgZ3VpbnQgcmVwZWF0KQoreworICBHc3RFbGVtZW50ICpzcmMsICpzaW5rLCAqZmx2bXV4LCAqY29udiwgKnBpcGVsaW5lOworICBHc3RQYWQgKnNpbmtwYWQsICpzcmNwYWQ7CisgIGdpbnQgY291bnRlcjsKKworICBHU1RfTE9HICgibnVtX2J1ZmZlcnMgPSAldSIsIG51bV9idWZmZXJzKTsKKworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBmYWlsX3VubGVzcyAocGlwZWxpbmUgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgcGlwZWxpbmUhIik7CisKKyAgLyoga2lkcywgZG9uJ3QgdXNlIGEgc3luYyBoYW5kbGVyIGZvciB0aGlzIGF0IGhvbWUsIHJlYWxseTsgd2UgZG8gYmVjYXVzZQorICAgKiB3ZSBqdXN0IHdhbnQgdG8gYWJvcnQgYW5kIG5vdGhpbmcgZWxzZSAqLworICBnc3RfYnVzX3NldF9zeW5jX2hhbmRsZXIgKEdTVF9FTEVNRU5UX0JVUyAocGlwZWxpbmUpLCBlcnJvcl9jYiwgTlVMTCwgTlVMTCk7CisKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW90ZXN0c3JjIiwgImF1ZGlvdGVzdHNyYyIpOworICBmYWlsX3VubGVzcyAoc3JjICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlICdhdWRpb3Rlc3RzcmMnIGVsZW1lbnQhIik7CisKKyAgZ19vYmplY3Rfc2V0IChzcmMsICJudW0tYnVmZmVycyIsIG51bV9idWZmZXJzLCBOVUxMKTsKKworICBjb252ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW9jb252ZXJ0IiwgImF1ZGlvY29udmVydCIpOworICBmYWlsX3VubGVzcyAoY29udiAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSAnYXVkaW9jb252ZXJ0JyBlbGVtZW50ISIpOworCisgIGZsdm11eCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZsdm11eCIsICJmbHZtdXgiKTsKKyAgZmFpbF91bmxlc3MgKGZsdm11eCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSAnZmx2bXV4JyBlbGVtZW50ISIpOworCisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJmYWtlc2luayIpOworICBmYWlsX3VubGVzcyAoc2luayAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSAnZmFrZXNpbmsnIGVsZW1lbnQhIik7CisKKyAgZ19vYmplY3Rfc2V0IChzaW5rLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNpbmssICJoYW5kb2ZmIiwgR19DQUxMQkFDSyAoaGFuZG9mZl9jYiksICZjb3VudGVyKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHNyYywgY29udiwgZmx2bXV4LCBzaW5rLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGluayAoc3JjLCBjb252KSk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rIChmbHZtdXgsIHNpbmspKTsKKworICAvKiBub3cgbGluayB0aGUgZWxlbWVudHMgKi8KKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoZmx2bXV4LCAiYXVkaW8iKTsKKyAgZmFpbF91bmxlc3MgKHNpbmtwYWQgIT0gTlVMTCwgIkNvdWxkIG5vdCBnZXQgYXVkaW8gcmVxdWVzdCBwYWQiKTsKKworICBzcmNwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoY29udiwgInNyYyIpOworICBmYWlsX3VubGVzcyAoc3JjcGFkICE9IE5VTEwsICJDb3VsZCBub3QgZ2V0IGF1ZGlvY29udmVydCdzIHNvdXJjZSBwYWQiKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcGFkX2xpbmsgKHNyY3BhZCwgc2lua3BhZCksIEdTVF9QQURfTElOS19PSyk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisKKyAgZG8geworICAgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHN0YXRlX3JldDsKKyAgICBHc3RNZXNzYWdlICptc2c7CisKKyAgICBHU1RfTE9HICgicmVwZWF0PSVkIiwgcmVwZWF0KTsKKworICAgIGNvdW50ZXIgPSAwOworCisgICAgc3RhdGVfcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BBVVNFRCk7CisgICAgZmFpbF91bmxlc3MgKHN0YXRlX3JldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgICAgaWYgKHN0YXRlX3JldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX0FTWU5DKSB7CisgICAgICBHU1RfTE9HICgid2FpdGluZyBmb3IgcGlwZWxpbmUgdG8gcmVhY2ggUEFVU0VEIHN0YXRlIik7CisgICAgICBzdGF0ZV9yZXQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKHBpcGVsaW5lLCBOVUxMLCBOVUxMLCAtMSk7CisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChzdGF0ZV9yZXQsIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgICAgfQorCisgICAgR1NUX0xPRyAoIlBBVVNFRCwgbGV0J3MgZG8gdGhlIHJlc3Qgb2YgaXQiKTsKKworICAgIHN0YXRlX3JldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgICBmYWlsX3VubGVzcyAoc3RhdGVfcmV0ICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgICBtc2cgPSBnc3RfYnVzX3BvbGwgKEdTVF9FTEVNRU5UX0JVUyAocGlwZWxpbmUpLCBHU1RfTUVTU0FHRV9FT1MsIC0xKTsKKyAgICBmYWlsX3VubGVzcyAobXNnICE9IE5VTEwsICJFeHBlY3RlZCBFT1MgbWVzc2FnZSBvbiBidXMhIik7CisKKyAgICBHU1RfTE9HICgiRU9TIik7CisgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisKKyAgICAvKiBzaG91bGQgaGF2ZSBzb21lIG91dHB1dCAqLworICAgIGZhaWxfdW5sZXNzIChjb3VudGVyID4gMik7CisKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCksCisgICAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgICAvKiByZXBlYXQgPSB0ZXN0IHJlLXVzYWJpbGl0eSAqLworICAgIC0tcmVwZWF0OworICB9IHdoaWxlIChyZXBlYXQgPiAwKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2luZGV4X3dyaXRpbmcpCit7CisgIC8qIG5vdGU6IHRoZXJlJ3MgYSBtYWdpYyAxMjggdmFsdWUgaW4gZmx2bXV4IHdoZW4gZG9pbmcgaW5kZXggd3JpdGluZyAqLworICBpZiAoKF9faV9fICUgMzMpID09IDEpCisgICAgbXV4X3BjbV9hdWRpbyAoX19pX18sIDIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorY3JlYXRlX2J1ZmZlciAoZ3VpbnQ4ICogZGF0YSwgZ3NpemUgc2l6ZSwKKyAgICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBHc3RDbG9ja1RpbWUgZHVyYXRpb24pCit7CisgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksCisgICAgICBkYXRhLCBzaXplLCAwLCBzaXplLCBOVUxMLCBOVUxMKTsKKyAgR1NUX0JVRkZFUl9QVFMgKGJ1ZikgPSB0aW1lc3RhbXA7CisgIEdTVF9CVUZGRVJfRFRTIChidWYpID0gdGltZXN0YW1wOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpID0gZHVyYXRpb247CisgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpID0gMDsKKyAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWYpID0gMDsKKyAgcmV0dXJuIGJ1ZjsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfc3BlZXhfc3RyZWFtYWJsZSkKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdE1hcEluZm8gbWFwID0gR1NUX01BUF9JTkZPX0lOSVQ7CisKKyAgZ3VpbnQ4IGhlYWRlcjBbXSA9IHsKKyAgICAweDUzLCAweDcwLCAweDY1LCAweDY1LCAweDc4LCAweDIwLCAweDIwLCAweDIwLAorICAgIDB4MzEsIDB4MmUsIDB4MzIsIDB4NzIsIDB4NjMsIDB4MzEsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4M2UsIDB4MDAsIDB4MDAsCisgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4NDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCisgIH07CisKKyAgZ3VpbnQ4IGhlYWRlcjFbXSA9IHsKKyAgICAweDFmLCAweDAwLCAweDAwLCAweDAwLCAweDQ1LCAweDZlLCAweDYzLCAweDZmLAorICAgIDB4NjQsIDB4NjUsIDB4NjQsIDB4MjAsIDB4NzcsIDB4NjksIDB4NzQsIDB4NjgsCisgICAgMHgyMCwgMHg0NywgMHg1MywgMHg3NCwgMHg3MiwgMHg2NSwgMHg2MSwgMHg2ZCwKKyAgICAweDY1LCAweDcyLCAweDIwLCAweDUzLCAweDcwLCAweDY1LCAweDY1LCAweDc4LAorICAgIDB4NjUsIDB4NmUsIDB4NjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEKKyAgfTsKKworICBndWludDggYnVmZmVyW10gPSB7CisgICAgMHgzNiwgMHg5ZCwgMHgxYiwgMHg5YSwgMHgyMCwgMHgwMCwgMHgwMSwgMHg2OCwKKyAgICAweGU4LCAweGU4LCAweGU4LCAweGU4LCAweGU4LCAweGU4LCAweGU4LCAweDg0LAorICAgIDB4MDAsIDB4YjQsIDB4NzQsIDB4NzQsIDB4NzQsIDB4NzQsIDB4NzQsIDB4NzQsCisgICAgMHg3NCwgMHg0MiwgMHgwMCwgMHg1YSwgMHgzYSwgMHgzYSwgMHgzYSwgMHgzYSwKKyAgICAweDNhLCAweDNhLCAweDNhLCAweDIxLCAweDAwLCAweDJkLCAweDFkLCAweDFkLAorICAgIDB4MWQsIDB4MWQsIDB4MWQsIDB4MWQsIDB4MWQsIDB4MWIsIDB4M2IsIDB4NjAsCisgICAgMHhhYiwgMHhhYiwgMHhhYiwgMHhhYiwgMHhhYiwgMHgwYSwgMHhiYSwgMHhiYSwKKyAgICAweGJhLCAweGJhLCAweGIwLCAweGFiLCAweGFiLCAweGFiLCAweGFiLCAweGFiLAorICAgIDB4MGEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YjcKKyAgfTsKKworICBHc3RDYXBzICpjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtc3BlZXgiLAorICAgICAgInJhdGUiLCBHX1RZUEVfSU5ULCAxNjAwMCwKKyAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDEsCisgICAgICBOVUxMKTsKKworICBjb25zdCBHc3RDbG9ja1RpbWUgYmFzZV90aW1lID0gMTIzNDU2Nzg5OworICBjb25zdCBHc3RDbG9ja1RpbWUgZHVyYXRpb25fbXMgPSAyMDsKKyAgY29uc3QgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uID0gZHVyYXRpb25fbXMgKiBHU1RfTVNFQ09ORDsKKworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfcGFkbmFtZXMgKCJmbHZtdXgiLCAiYXVkaW8iLCAic3JjIik7CisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2FwcyAoaCwgY2Fwcyk7CisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgInN0cmVhbWFibGUiLCAxLCBOVUxMKTsKKworICAvKiBwdXNoIHNwZWV4IGhlYWRlcjAgKi8KKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgY3JlYXRlX2J1ZmZlciAoaGVhZGVyMCwgc2l6ZW9mIChoZWFkZXIwKSwgYmFzZV90aW1lLCAwKSk7CisKKyAgLyogcHVzaCBzcGVleCBoZWFkZXIxICovCisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGNyZWF0ZV9idWZmZXIgKGhlYWRlcjEsIHNpemVvZiAoaGVhZGVyMSksIGJhc2VfdGltZSwgMCkpOworCisgIC8qIHB1c2ggc3BlZXggZGF0YSAqLworICBnc3RfaGFybmVzc19wdXNoIChoLCBjcmVhdGVfYnVmZmVyIChidWZmZXIsIHNpemVvZiAoYnVmZmVyKSwKKyAgICAgICAgICBiYXNlX3RpbWUsIGR1cmF0aW9uKSk7CisKKyAgLyogcHVzaCBzcGVleCBkYXRhIDIgKi8KKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgY3JlYXRlX2J1ZmZlciAoYnVmZmVyLCBzaXplb2YgKGJ1ZmZlciksCisgICAgICAgICAgYmFzZV90aW1lICsgZHVyYXRpb24sIGR1cmF0aW9uKSk7CisKKyAgLyogcHVsbCBvdXQgc3RyZWFtLXN0YXJ0IGV2ZW50ICovCisgIGdzdF9ldmVudF91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbF9ldmVudCAoaCkpOworCisgIC8qIHB1bGwgb3V0IGNhcHMgZXZlbnQgKi8KKyAgZ3N0X2V2ZW50X3VucmVmIChnc3RfaGFybmVzc19wdWxsX2V2ZW50IChoKSk7CisKKyAgLyogcHVsbCBvdXQgc2VnbWVudCBldmVudCBhbmQgdmVyaWZ5IHdlIGFyZSB1c2luZyBHU1RfRk9STUFUX1RJTUUgKi8KKyAgeworICAgIEdzdEV2ZW50ICpldmVudCA9IGdzdF9oYXJuZXNzX3B1bGxfZXZlbnQgKGgpOworICAgIGNvbnN0IEdzdFNlZ21lbnQgKnNlZ21lbnQ7CisgICAgZ3N0X2V2ZW50X3BhcnNlX3NlZ21lbnQgKGV2ZW50LCAmc2VnbWVudCk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZPUk1BVF9USU1FLCBzZWdtZW50LT5mb3JtYXQpOworICAgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICB9CisKKyAgLyogcHVsbCBGTFYgaGVhZGVyIGJ1ZmZlciAqLworICBidWYgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAvKiBwdWxsIE1ldGFkYXRhIGJ1ZmZlciAqLworICBidWYgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAvKiBwdWxsIGhlYWRlcjAgKi8KKyAgYnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKGJhc2VfdGltZSwgR1NUX0JVRkZFUl9QVFMgKGJ1ZikpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChiYXNlX3RpbWUsIEdTVF9CVUZGRVJfRFRTIChidWYpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgLyogMHgwOCBtZWFucyBpdCBpcyBhdWRpbyAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgweDA4LCBtYXAuZGF0YVswXSk7CisgIC8qIHRpbWVzdGFtcCBzaG91bGQgYmUgc3RhcnRpbmcgZnJvbSAwICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDB4MDAsIG1hcC5kYXRhWzZdKTsKKyAgLyogMHhiMiBtZWFucyBTcGVleCwgMTYwMDBIeiwgTW9ubyAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgweGIyLCBtYXAuZGF0YVsxMV0pOworICAvKiB2ZXJpZnkgY29udGVudCBpcyBpbnRhY3QgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMCwgbWVtY21wICgmbWFwLmRhdGFbMTJdLCBoZWFkZXIwLCBzaXplb2YgKGhlYWRlcjApKSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgLyogcHVsbCBoZWFkZXIxICovCisgIGJ1ZiA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChiYXNlX3RpbWUsIEdTVF9CVUZGRVJfUFRTIChidWYpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoYmFzZV90aW1lLCBHU1RfQlVGRkVSX0RUUyAoYnVmKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKDAsIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikpOworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAvKiAweDA4IG1lYW5zIGl0IGlzIGF1ZGlvICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDB4MDgsIG1hcC5kYXRhWzBdKTsKKyAgLyogdGltZXN0YW1wIHNob3VsZCBiZSBzdGFydGluZyBmcm9tIDAgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMHgwMCwgbWFwLmRhdGFbNl0pOworICAvKiAweGIyIG1lYW5zIFNwZWV4LCAxNjAwMEh6LCBNb25vICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDB4YjIsIG1hcC5kYXRhWzExXSk7CisgIC8qIHZlcmlmeSBjb250ZW50IGlzIGludGFjdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgwLCBtZW1jbXAgKCZtYXAuZGF0YVsxMl0sIGhlYWRlcjEsIHNpemVvZiAoaGVhZGVyMSkpKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAvKiBwdWxsIGRhdGEgKi8KKyAgYnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKGJhc2VfdGltZSwgR1NUX0JVRkZFUl9QVFMgKGJ1ZikpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChiYXNlX3RpbWUsIEdTVF9CVUZGRVJfRFRTIChidWYpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoZHVyYXRpb24sIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX09GRlNFVF9OT05FLCBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfT0ZGU0VUX05PTkUsCisgICAgICBHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZikpOworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAvKiAweDA4IG1lYW5zIGl0IGlzIGF1ZGlvICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDB4MDgsIG1hcC5kYXRhWzBdKTsKKyAgLyogdGltZXN0YW1wIHNob3VsZCBiZSBzdGFydGluZyBmcm9tIDAgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMHgwMCwgbWFwLmRhdGFbNl0pOworICAvKiAweGIyIG1lYW5zIFNwZWV4LCAxNjAwMEh6LCBNb25vICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDB4YjIsIG1hcC5kYXRhWzExXSk7CisgIC8qIHZlcmlmeSBjb250ZW50IGlzIGludGFjdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgwLCBtZW1jbXAgKCZtYXAuZGF0YVsxMl0sIGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpKSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgLyogcHVsbCBkYXRhICovCisgIGJ1ZiA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChiYXNlX3RpbWUgKyBkdXJhdGlvbiwgR1NUX0JVRkZFUl9QVFMgKGJ1ZikpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChiYXNlX3RpbWUgKyBkdXJhdGlvbiwgR1NUX0JVRkZFUl9EVFMgKGJ1ZikpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChkdXJhdGlvbiwgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfT0ZGU0VUX05PTkUsIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9PRkZTRVRfTk9ORSwKKyAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmKSk7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIC8qIDB4MDggbWVhbnMgaXQgaXMgYXVkaW8gKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMHgwOCwgbWFwLmRhdGFbMF0pOworICAvKiB0aW1lc3RhbXAgc2hvdWxkIHJlZmxlY3QgdGhlIGR1cmF0aW9uX21zICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGR1cmF0aW9uX21zLCBtYXAuZGF0YVs2XSk7CisgIC8qIDB4YjIgbWVhbnMgU3BlZXgsIDE2MDAwSHosIE1vbm8gKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMHhiMiwgbWFwLmRhdGFbMTFdKTsKKyAgLyogdmVyaWZ5IGNvbnRlbnQgaXMgaW50YWN0ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDAsIG1lbWNtcCAoJm1hcC5kYXRhWzEyXSwgYnVmZmVyLCBzaXplb2YgKGJ1ZmZlcikpKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIHZvaWQKK2NoZWNrX2J1Zl90eXBlX3RpbWVzdGFtcCAoR3N0QnVmZmVyICogYnVmLCBnaW50IHBhY2tldF90eXBlLCBnaW50IHRpbWVzdGFtcCkKK3sKKyAgR3N0TWFwSW5mbyBtYXAgPSBHU1RfTUFQX0lORk9fSU5JVDsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAocGFja2V0X3R5cGUsIG1hcC5kYXRhWzBdKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAodGltZXN0YW1wLCBtYXAuZGF0YVs2XSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2luY3JlYXNpbmdfdGltZXN0YW1wX3doZW5fcHRzX25vbmUpCit7CisgIGNvbnN0IGdpbnQgQVVESU8gPSAweDA4OworICBjb25zdCBnaW50IFZJREVPID0gMHgwOTsKKyAgZ2ludCB0aW1lc3RhbXAgPSAzOworICBHc3RDbG9ja1RpbWUgYmFzZV90aW1lID0gNDIgKiBHU1RfU0VDT05EOworICBHc3RQYWQgKmF1ZGlvX3NpbmssICp2aWRlb19zaW5rLCAqYXVkaW9fc3JjLCAqdmlkZW9fc3JjOworICBHc3RIYXJuZXNzICpoLCAqYXVkaW8sICp2aWRlbywgKmF1ZGlvX3EsICp2aWRlb19xOworICBHc3RDYXBzICphdWRpb19jYXBzLCAqdmlkZW9fY2FwczsKKyAgR3N0QnVmZmVyICpidWY7CisKKyAgaCA9IGdzdF9oYXJuZXNzX25ld193aXRoX3BhZG5hbWVzICgiZmx2bXV4IiwgTlVMTCwgInNyYyIpOworICBhdWRpbyA9IGdzdF9oYXJuZXNzX25ld193aXRoX2VsZW1lbnQgKGgtPmVsZW1lbnQsICJhdWRpbyIsIE5VTEwpOworICB2aWRlbyA9IGdzdF9oYXJuZXNzX25ld193aXRoX2VsZW1lbnQgKGgtPmVsZW1lbnQsICJ2aWRlbyIsIE5VTEwpOworICBhdWRpb19xID0gZ3N0X2hhcm5lc3NfbmV3ICgicXVldWUiKTsKKyAgdmlkZW9fcSA9IGdzdF9oYXJuZXNzX25ldyAoInF1ZXVlIik7CisKKyAgYXVkaW9fc2luayA9IEdTVF9QQURfUEVFUiAoYXVkaW8tPnNyY3BhZCk7CisgIHZpZGVvX3NpbmsgPSBHU1RfUEFEX1BFRVIgKHZpZGVvLT5zcmNwYWQpOworICBhdWRpb19zcmMgPSBHU1RfUEFEX1BFRVIgKGF1ZGlvX3EtPnNpbmtwYWQpOworICB2aWRlb19zcmMgPSBHU1RfUEFEX1BFRVIgKHZpZGVvX3EtPnNpbmtwYWQpOworCisgIGdzdF9wYWRfdW5saW5rIChhdWRpby0+c3JjcGFkLCBhdWRpb19zaW5rKTsKKyAgZ3N0X3BhZF91bmxpbmsgKHZpZGVvLT5zcmNwYWQsIHZpZGVvX3NpbmspOworICBnc3RfcGFkX3VubGluayAoYXVkaW9fc3JjLCBhdWRpb19xLT5zaW5rcGFkKTsKKyAgZ3N0X3BhZF91bmxpbmsgKHZpZGVvX3NyYywgdmlkZW9fcS0+c2lua3BhZCk7CisgIGdzdF9wYWRfbGluayAoYXVkaW9fc3JjLCBhdWRpb19zaW5rKTsKKyAgZ3N0X3BhZF9saW5rICh2aWRlb19zcmMsIHZpZGVvX3NpbmspOworCisgIGF1ZGlvX2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1zcGVleCIsCisgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIDE2MDAwLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzIChhdWRpb19xLCBhdWRpb19jYXBzKTsKKyAgdmlkZW9fY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWgyNjQiLAorICAgICAgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiYXZjIiwgTlVMTCk7CisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2FwcyAodmlkZW9fcSwgdmlkZW9fY2Fwcyk7CisKKyAgLyogUHVzaCBhdWRpbyArIHZpZGVvICsgYXVkaW8gd2l0aCBpbmNyZWFzaW5nIERUUywgYnV0IFBUUyBmb3IgdmlkZW8gaXMKKyAgICogR1NUX0NMT0NLX1RJTUVfTk9ORQorICAgKi8KKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgIEdTVF9CVUZGRVJfRFRTIChidWYpID0gdGltZXN0YW1wICogR1NUX01TRUNPTkQgKyBiYXNlX3RpbWU7CisgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gdGltZXN0YW1wICogR1NUX01TRUNPTkQgKyBiYXNlX3RpbWU7CisgIGdzdF9oYXJuZXNzX3B1c2ggKGF1ZGlvX3EsIGJ1Zik7CisKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgIEdTVF9CVUZGRVJfRFRTIChidWYpID0gKHRpbWVzdGFtcCArIDEpICogR1NUX01TRUNPTkQgKyBiYXNlX3RpbWU7CisgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgZ3N0X2hhcm5lc3NfcHVzaCAodmlkZW9fcSwgYnVmKTsKKworICBidWYgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgR1NUX0JVRkZFUl9EVFMgKGJ1ZikgPSAodGltZXN0YW1wICsgMikgKiBHU1RfTVNFQ09ORCArIGJhc2VfdGltZTsKKyAgR1NUX0JVRkZFUl9QVFMgKGJ1ZikgPSAodGltZXN0YW1wICsgMikgKiBHU1RfTVNFQ09ORCArIGJhc2VfdGltZTsKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoYXVkaW9fcSwgYnVmKTsKKworICAvKiBQdWxsIHR3byBtZXRhZGF0YSBwYWNrZXRzIG91dCAqLworICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChoKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKworICAvKiBDaGVjayB0aGF0IHdlIHJlY2VpdmUgdGhlIHBhY2tldHMgaW4gbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIG9yZGVyIGFuZAorICAgKiB0aGF0IHRoZWlyIHRpbWVzdGFtcHMgYXJlIGNvcnJlY3QgKHNob3VsZCBzdGFydCBhdCAwKQorICAgKi8KKyAgYnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGNoZWNrX2J1Zl90eXBlX3RpbWVzdGFtcCAoYnVmLCBBVURJTywgMCk7CisgIGJ1ZiA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBjaGVja19idWZfdHlwZV90aW1lc3RhbXAgKGJ1ZiwgVklERU8sIDEpOworCisgIC8qIHRlYXJkb3duICovCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGF1ZGlvKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKHZpZGVvKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGF1ZGlvX3EpOworICBnc3RfaGFybmVzc190ZWFyZG93biAodmlkZW9fcSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2Zsdm11eF9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJmbHZtdXgiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworICBnaW50IGxvb3AgPSA0OTk7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisKKyNpZmRlZiBIQVZFX1ZBTEdSSU5ECisgIGlmIChSVU5OSU5HX09OX1ZBTEdSSU5EKSB7CisgICAgbG9vcCA9IDE0MDsKKyAgfQorI2VuZGlmCisKKyAgdGNhc2VfYWRkX2xvb3BfdGVzdCAodGNfY2hhaW4sIHRlc3RfaW5kZXhfd3JpdGluZywgMSwgbG9vcCk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3NwZWV4X3N0cmVhbWFibGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaW5jcmVhc2luZ190aW1lc3RhbXBfd2hlbl9wdHNfbm9uZSk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChmbHZtdXgpCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9nZGtwaXhidWZvdmVybGF5LmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9nZGtwaXhidWZvdmVybGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0NTU1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2dka3BpeGJ1Zm92ZXJsYXkuYwpAQCAtMCwwICsxLDgwIEBACisvKiBHU3RyZWFtZXIgdW5pdCB0ZXN0IGZvciB0aGUgZ2RrcGl4YnVmb3ZlcmxheSBlbGVtZW50CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIGNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3NpbXBsZV9vdmVybGF5KQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZSwgKnNyYywgKm92ZXJsYXksICpzaW5rOworICBHc3RNZXNzYWdlICptc2c7CisgIEdzdEJ1cyAqYnVzOworCisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoc3JjICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKHNyYywgIm51bS1idWZmZXJzIiwgMywgTlVMTCk7CisKKyAgb3ZlcmxheSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImdka3BpeGJ1Zm92ZXJsYXkiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKG92ZXJsYXkgIT0gTlVMTCk7CisKKyNkZWZpbmUgSU1BR0VfUEFUSCBHU1RfVEVTVF9GSUxFU19QQVRIIEdfRElSX1NFUEFSQVRPUl9TICJpbWFnZS5qcGciCisgIGdfb2JqZWN0X3NldCAob3ZlcmxheSwgImxvY2F0aW9uIiwgSU1BR0VfUEFUSCwgTlVMTCk7CisKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChzaW5rICE9IE5VTEwpOworCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoTlVMTCk7CisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjLCBvdmVybGF5LCBzaW5rLCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19tYW55IChzcmMsIG92ZXJsYXksIHNpbmssIE5VTEwpOworCisgIC8qIHN0YXJ0IHByZXJvbGxpbmcgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9BU1lOQyk7CisKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAocGlwZWxpbmUpOworCisgIC8qIHdhaXQgZm9yIEVPUyAqLworICBtc2cgPSBnc3RfYnVzX3RpbWVkX3BvcF9maWx0ZXJlZCAoYnVzLCBHU1RfQ0xPQ0tfVElNRV9OT05FLCBHU1RfTUVTU0FHRV9FT1MpOworICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorZ2RrcGl4YnVmb3ZlcmxheV9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJnZGtwaXhidWZvdmVybGF5Iik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3NpbXBsZV9vdmVybGF5KTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGdka3BpeGJ1Zm92ZXJsYXkpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvZ2RrcGl4YnVmc2luay5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvZ2RrcGl4YnVmc2luay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODNjY2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9nZGtwaXhidWZzaW5rLmMKQEAgLTAsMCArMSwyOTMgQEAKKy8qIEdTdHJlYW1lciB1bml0IHRlc3QgZm9yIHRoZSBnZGtwaXhidWZzaW5rIGVsZW1lbnQKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKworI2luY2x1ZGUgPGdkay1waXhidWYvZ2RrLXBpeGJ1Zi5oPgorCisjZGVmaW5lIENBUFNfUkdCICJ2aWRlby94LXJhdywgZm9ybWF0PVJHQiIKKyNkZWZpbmUgQ0FQU19SR0JBICJ2aWRlby94LXJhdywgZm9ybWF0PVJHQkEiCisjZGVmaW5lIFd4SCAiLHdpZHRoPShpbnQpMzE5LGhlaWdodD0oaW50KTI0MSIKKworI2RlZmluZSBOX0JVRkZFUlMgNQorCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RFbGVtZW50ICpwaXBlOworICBHc3RFbGVtZW50ICpzcmM7CisgIEdzdEVsZW1lbnQgKmZpbHRlcjsKKyAgR3N0RWxlbWVudCAqc2luazsKK30gR3N0R2RrUGl4YnVmU2lua1Rlc3RDb250ZXh0OworCitzdGF0aWMgdm9pZAorZ2RrcGl4YnVmc2lua19pbml0X3Rlc3RfY29udGV4dCAoR3N0R2RrUGl4YnVmU2lua1Rlc3RDb250ZXh0ICogY3R4LAorICAgIGNvbnN0IGdjaGFyICogZmlsdGVyX2NhcHNfc3RyaW5nLCBnaW50IG51bV9idWZmZXJzKQoreworICBHc3RDYXBzICpjYXBzOworCisgIGZhaWxfdW5sZXNzIChjdHggIT0gTlVMTCk7CisKKyAgY3R4LT5waXBlID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGZhaWxfdW5sZXNzIChjdHgtPnBpcGUgIT0gTlVMTCk7CisgIGN0eC0+c3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgInNyYyIpOworICBmYWlsX3VubGVzcyAoY3R4LT5zcmMgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgdmlkZW90ZXN0c3JjIGVsZW1lbnQiKTsKKyAgY3R4LT5maWx0ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJjYXBzZmlsdGVyIiwgImZpbHRlciIpOworICBmYWlsX3VubGVzcyAoY3R4LT5maWx0ZXIgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgY2Fwc2ZpbHRlciBlbGVtZW50Iik7CisgIGN0eC0+c2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImdka3BpeGJ1ZnNpbmsiLCAic2luayIpOworICBmYWlsX3VubGVzcyAoY3R4LT5zaW5rICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIGdka3BpeGJ1ZnNpbmsgZWxlbWVudCIpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoZmlsdGVyX2NhcHNfc3RyaW5nKTsKKyAgZmFpbF91bmxlc3MgKGNhcHMgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoY3R4LT5maWx0ZXIsICJjYXBzIiwgY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBpZiAobnVtX2J1ZmZlcnMgPiAwKQorICAgIGdfb2JqZWN0X3NldCAoY3R4LT5zcmMsICJudW0tYnVmZmVycyIsIG51bV9idWZmZXJzLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKGN0eC0+cGlwZSksIGN0eC0+c3JjKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfYmluX2FkZCAoR1NUX0JJTiAoY3R4LT5waXBlKSwgY3R4LT5maWx0ZXIpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9iaW5fYWRkIChHU1RfQklOIChjdHgtPnBpcGUpLCBjdHgtPnNpbmspKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmsgKGN0eC0+c3JjLCBjdHgtPmZpbHRlcikpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGluayAoY3R4LT5maWx0ZXIsIGN0eC0+c2luaykpOworfQorCitzdGF0aWMgdm9pZAorZ2RrcGl4YnVmc2lua191bnNldF90ZXN0X2NvbnRleHQgKEdzdEdka1BpeGJ1ZlNpbmtUZXN0Q29udGV4dCAqIGN0eCkKK3sKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChjdHgtPnBpcGUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoY3R4LT5waXBlKTsKKyAgbWVtc2V0IChjdHgsIDAsIHNpemVvZiAoR3N0R2RrUGl4YnVmU2lua1Rlc3RDb250ZXh0KSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorY2hlY2tfbGFzdF9waXhidWYgKEdzdEdka1BpeGJ1ZlNpbmtUZXN0Q29udGV4dCAqIGN0eCwgZ3BvaW50ZXIgcGl4YnVmKQoreworICBncG9pbnRlciBsYXN0X3BiID0gTlVMTDsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIGdfb2JqZWN0X2dldCAoY3R4LT5zaW5rLCAibGFzdC1waXhidWYiLCAmbGFzdF9wYiwgTlVMTCk7CisKKyAgcmV0ID0gKGxhc3RfcGIgPT0gcGl4YnVmKTsKKworICBpZiAobGFzdF9wYikKKyAgICBnX29iamVjdF91bnJlZiAobGFzdF9wYik7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogZG9lc24ndCByZXR1cm4gYSByZWYgdG8gdGhlIHBpeGJ1ZiAqLworc3RhdGljIEdka1BpeGJ1ZiAqCitjaGVja19tZXNzYWdlX3BpeGJ1ZiAoR3N0TWVzc2FnZSAqIG1zZywgY29uc3QgZ2NoYXIgKiBuYW1lLCBnaW50IGNoYW5uZWxzLAorICAgIGdib29sZWFuIGhhc19hbHBoYSkKK3sKKyAgR2RrUGl4YnVmICpwaXhidWY7CisgIGNvbnN0IEdzdFN0cnVjdHVyZSAqczsKKworICBmYWlsX3VubGVzcyAoZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobXNnKSAhPSBOVUxMKTsKKworICBzID0gZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobXNnKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyksIG5hbWUpOworCisgIGZhaWxfdW5sZXNzIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAocywgInBpeGJ1ZiIpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkX3R5cGVkIChzLCAicGl4ZWwtYXNwZWN0LXJhdGlvIiwKKyAgICAgICAgICBHU1RfVFlQRV9GUkFDVElPTikpOworICBwaXhidWYgPQorICAgICAgR0RLX1BJWEJVRiAoZ192YWx1ZV9nZXRfb2JqZWN0IChnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgInBpeGJ1ZiIpKSk7CisgIGZhaWxfdW5sZXNzIChHREtfSVNfUElYQlVGIChwaXhidWYpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ2RrX3BpeGJ1Zl9nZXRfbl9jaGFubmVscyAocGl4YnVmKSwgY2hhbm5lbHMpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnZGtfcGl4YnVmX2dldF9oYXNfYWxwaGEgKHBpeGJ1ZiksIGhhc19hbHBoYSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdka19waXhidWZfZ2V0X3dpZHRoIChwaXhidWYpLCAzMTkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnZGtfcGl4YnVmX2dldF9oZWlnaHQgKHBpeGJ1ZiksIDI0MSk7CisKKyAgcmV0dXJuIHBpeGJ1ZjsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcmdiKQoreworICBHc3RHZGtQaXhidWZTaW5rVGVzdENvbnRleHQgY3R4OworICBHc3RNZXNzYWdlICptc2c7CisgIEdka1BpeGJ1ZiAqcGl4YnVmOworICBHc3RCdXMgKmJ1czsKKyAgZ2ludCBpOworCisgIGdka3BpeGJ1ZnNpbmtfaW5pdF90ZXN0X2NvbnRleHQgKCZjdHgsIENBUFNfUkdCIFd4SCwgTl9CVUZGRVJTKTsKKworICBmYWlsX3VubGVzcyAoY2hlY2tfbGFzdF9waXhidWYgKCZjdHgsIE5VTEwpKTsKKworICAvKiBzdGFydCBwcmVyb2xsaW5nICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoY3R4LnBpcGUsIEdTVF9TVEFURV9QQVVTRUQpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9BU1lOQyk7CisKKyAgLyogd2FpdCB1bnRpbCBwcmVyb2xsZWQgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChjdHgucGlwZSwgTlVMTCwgTlVMTCwgLTEpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChjdHgucGlwZSk7CisKKyAgLyogZmluZCBlbGVtZW50IG1lc3NhZ2UgZnJvbSBvdXIgZ2RrcGl4YnVmc2luaywgaWdub3JlIGVsZW1lbnQgbWVzc2FnZXMgZnJvbQorICAgKiBvdGhlciBlbGVtZW1lbnRzICh3aGljaCBqdXN0IHNlZW1zIHBydWRlbnQgdG8gZG8sIHdlIGRvbid0IGV4cGVjdCBhbnkpICovCisgIHdoaWxlICgxKSB7CisgICAgbXNnID0gZ3N0X2J1c19wb3BfZmlsdGVyZWQgKGJ1cywgR1NUX01FU1NBR0VfRUxFTUVOVCk7CisgICAgZmFpbF9pZiAobXNnID09IE5VTEwsICJFeHBlY3RlZCBlbGVtZW50IG1lc3NhZ2UgZnJvbSBnZGtwaXhidWZzaW5rIik7CisKKyAgICBpZiAobXNnLT5zcmMgPT0gR1NUX09CSkVDVCAoY3R4LnNpbmspKQorICAgICAgYnJlYWs7CisgIH0KKworICBwaXhidWYgPSBjaGVja19tZXNzYWdlX3BpeGJ1ZiAobXNnLCAicHJlcm9sbC1waXhidWYiLCAzLCBGQUxTRSk7CisgIGZhaWxfdW5sZXNzIChjaGVja19sYXN0X3BpeGJ1ZiAoJmN0eCwgcGl4YnVmKSk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworICBwaXhidWYgPSBOVUxMOworCisgIC8qIGFuZCBnbyEgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChjdHgucGlwZSwgR1NUX1NUQVRFX1BMQVlJTkcpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICAvKiBUaGlzIGlzIHJhY3ksIHN1cHBvc2VkIHRvIG1ha2Ugc3VyZSBsb2NraW5nIGFuZCByZWZjb3VudGluZyB3b3JrcyBhdAorICAgKiBsZWFzdCB0byBzb21lIGV4dGVudCAqLworICBmb3IgKGkgPSAwOyBpIDwgMTAwMDA7ICsraSkgeworICAgIGdwb2ludGVyIG9iaiA9IE5VTEw7CisKKyAgICBnX29iamVjdF9nZXQgKGN0eC5zaW5rLCAibGFzdC1waXhidWYiLCAmb2JqLCBOVUxMKTsKKyAgICBmYWlsX3VubGVzcyAob2JqID09IE5VTEwgfHwgR0RLX0lTX1BJWEJVRiAob2JqKSk7CisgICAgaWYgKG9iaikKKyAgICAgIGdfb2JqZWN0X3VucmVmIChvYmopOworICB9CisKKyAgLyogdGhlcmUgc2hvdWxkIGJlIGFzIG1hbnkgcGl4YnVmIG1lc3NhZ2VzIGFzIGJ1ZmZlcnMgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5fQlVGRkVSUzsgKytpKSB7CisgICAgLyogZmluZCBlbGVtZW50IG1lc3NhZ2UgZnJvbSBvdXIgZ2RrcGl4YnVmc2luaywgaWdub3JlIGVsZW1lbnQgbWVzc2FnZXMgZnJvbQorICAgICAqIG90aGVyIGVsZW1lbWVudHMgKHdoaWNoIGp1c3Qgc2VlbXMgcHJ1ZGVudCB0byBkbywgd2UgZG9uJ3QgZXhwZWN0IGFueSkgKi8KKyAgICB3aGlsZSAoMSkgeworICAgICAgbXNnID0gZ3N0X2J1c190aW1lZF9wb3BfZmlsdGVyZWQgKGJ1cywgLTEsIEdTVF9NRVNTQUdFX0VMRU1FTlQpOworICAgICAgZmFpbF9pZiAobXNnID09IE5VTEwsICJFeHBlY3RlZCBlbGVtZW50IG1lc3NhZ2UgZnJvbSBnZGtwaXhidWZzaW5rIik7CisgICAgICBpZiAobXNnLT5zcmMgPT0gR1NUX09CSkVDVCAoY3R4LnNpbmspKQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBwaXhidWYgPSBjaGVja19tZXNzYWdlX3BpeGJ1ZiAobXNnLCAicGl4YnVmIiwgMywgRkFMU0UpOworICAgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworICB9CisKKyAgLyogbm90ZTogd2UgZG9uJ3QgaG9sZCBhIHJlZiB0byBwaXhidWYgYW55IGxvbmdlciBoZXJlLCBidXQgaXQgc2hvdWxkIGJlIG9rICovCisgIGZhaWxfdW5sZXNzIChjaGVja19sYXN0X3BpeGJ1ZiAoJmN0eCwgcGl4YnVmKSk7CisgIHBpeGJ1ZiA9IE5VTEw7CisKKyAgZ2RrcGl4YnVmc2lua191bnNldF90ZXN0X2NvbnRleHQgKCZjdHgpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3JnYmEpCit7CisgIEdzdEdka1BpeGJ1ZlNpbmtUZXN0Q29udGV4dCBjdHg7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKyAgR2RrUGl4YnVmICpwaXhidWY7CisgIEdzdEJ1cyAqYnVzOworICBnaW50IGk7CisKKyAgZ2RrcGl4YnVmc2lua19pbml0X3Rlc3RfY29udGV4dCAoJmN0eCwgQ0FQU19SR0JBIFd4SCwgTl9CVUZGRVJTKTsKKworICBmYWlsX3VubGVzcyAoY2hlY2tfbGFzdF9waXhidWYgKCZjdHgsIE5VTEwpKTsKKworICAvKiBzdGFydCBwcmVyb2xsaW5nICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoY3R4LnBpcGUsIEdTVF9TVEFURV9QQVVTRUQpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9BU1lOQyk7CisKKyAgLyogd2FpdCB1bnRpbCBwcmVyb2xsZWQgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChjdHgucGlwZSwgTlVMTCwgTlVMTCwgLTEpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChjdHgucGlwZSk7CisKKyAgLyogZmluZCBlbGVtZW50IG1lc3NhZ2UgZnJvbSBvdXIgZ2RrcGl4YnVmc2luaywgaWdub3JlIGVsZW1lbnQgbWVzc2FnZXMgZnJvbQorICAgKiBvdGhlciBlbGVtZW1lbnRzICh3aGljaCBqdXN0IHNlZW1zIHBydWRlbnQgdG8gZG8sIHdlIGRvbid0IGV4cGVjdCBhbnkpICovCisgIHdoaWxlICgxKSB7CisgICAgbXNnID0gZ3N0X2J1c19wb3BfZmlsdGVyZWQgKGJ1cywgR1NUX01FU1NBR0VfRUxFTUVOVCk7CisgICAgZmFpbF9pZiAobXNnID09IE5VTEwsICJFeHBlY3RlZCBlbGVtZW50IG1lc3NhZ2UgZnJvbSBnZGtwaXhidWZzaW5rIik7CisKKyAgICBpZiAobXNnLT5zcmMgPT0gR1NUX09CSkVDVCAoY3R4LnNpbmspKQorICAgICAgYnJlYWs7CisgIH0KKworICBwaXhidWYgPSBjaGVja19tZXNzYWdlX3BpeGJ1ZiAobXNnLCAicHJlcm9sbC1waXhidWYiLCA0LCBUUlVFKTsKKyAgZmFpbF91bmxlc3MgKGNoZWNrX2xhc3RfcGl4YnVmICgmY3R4LCBwaXhidWYpKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgIHBpeGJ1ZiA9IE5VTEw7CisKKyAgLyogYW5kIGdvISAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGN0eC5waXBlLCBHU1RfU1RBVEVfUExBWUlORyksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIC8qIFRoaXMgaXMgcmFjeSwgc3VwcG9zZWQgdG8gbWFrZSBzdXJlIGxvY2tpbmcgYW5kIHJlZmNvdW50aW5nIHdvcmtzIGF0CisgICAqIGxlYXN0IHRvIHNvbWUgZXh0ZW50ICovCisgIGZvciAoaSA9IDA7IGkgPCAxMDAwMDsgKytpKSB7CisgICAgZ3BvaW50ZXIgb2JqID0gTlVMTDsKKworICAgIGdfb2JqZWN0X2dldCAoY3R4LnNpbmssICJsYXN0LXBpeGJ1ZiIsICZvYmosIE5VTEwpOworICAgIGZhaWxfdW5sZXNzIChvYmogPT0gTlVMTCB8fCBHREtfSVNfUElYQlVGIChvYmopKTsKKyAgICBpZiAob2JqKQorICAgICAgZ19vYmplY3RfdW5yZWYgKG9iaik7CisgIH0KKworICAvKiB0aGVyZSBzaG91bGQgYmUgYXMgbWFueSBwaXhidWYgbWVzc2FnZXMgYXMgYnVmZmVycyAqLworICBmb3IgKGkgPSAwOyBpIDwgTl9CVUZGRVJTOyArK2kpIHsKKyAgICAvKiBmaW5kIGVsZW1lbnQgbWVzc2FnZSBmcm9tIG91ciBnZGtwaXhidWZzaW5rLCBpZ25vcmUgZWxlbWVudCBtZXNzYWdlcyBmcm9tCisgICAgICogb3RoZXIgZWxlbWVtZW50cyAod2hpY2gganVzdCBzZWVtcyBwcnVkZW50IHRvIGRvLCB3ZSBkb24ndCBleHBlY3QgYW55KSAqLworICAgIHdoaWxlICgxKSB7CisgICAgICBtc2cgPSBnc3RfYnVzX3RpbWVkX3BvcF9maWx0ZXJlZCAoYnVzLCAtMSwgR1NUX01FU1NBR0VfRUxFTUVOVCk7CisgICAgICBmYWlsX2lmIChtc2cgPT0gTlVMTCwgIkV4cGVjdGVkIGVsZW1lbnQgbWVzc2FnZSBmcm9tIGdka3BpeGJ1ZnNpbmsiKTsKKyAgICAgIGlmIChtc2ctPnNyYyA9PSBHU1RfT0JKRUNUIChjdHguc2luaykpCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHBpeGJ1ZiA9IGNoZWNrX21lc3NhZ2VfcGl4YnVmIChtc2csICJwaXhidWYiLCA0LCBUUlVFKTsKKyAgICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKyAgfQorCisgIC8qIG5vdGU6IHdlIGRvbid0IGhvbGQgYSByZWYgdG8gcGl4YnVmIGFueSBsb25nZXIgaGVyZSwgYnV0IGl0IHNob3VsZCBiZSBvayAqLworICBmYWlsX3VubGVzcyAoY2hlY2tfbGFzdF9waXhidWYgKCZjdHgsIHBpeGJ1ZikpOworICBwaXhidWYgPSBOVUxMOworCisgIGdka3BpeGJ1ZnNpbmtfdW5zZXRfdGVzdF9jb250ZXh0ICgmY3R4KTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorZ2RrcGl4YnVmc2lua19zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJnZGtwaXhidWZzaW5rIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3JnYik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9yZ2JhKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGdka3BpeGJ1ZnNpbmspOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvaWN5ZGVtdXguYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2ljeWRlbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVlNDNiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2ljeWRlbXV4LmMKQEAgLTAsMCArMSwzNzggQEAKKy8qCisgKiBpY3lkZW11eC5jIC0gVGVzdCBpY3lkZW11eCBlbGVtZW50CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBTbWl0aCA8bXNtaXRoQGZsdWVuZG8uY29tPgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKKy8qIENodW5rIG9mIGRhdGE6IDggYnl0ZXMsIGZvbGxvd2VkIGJ5IGEgbWV0YWRhdGEtbGVuZ3RoIGJ5dGUgb2YgMiwgZm9sbG93ZWQgYnkKKyAqIHNvbWUgbWV0YWRhdGEgKDMyIGJ5dGVzKSwgdGhlbiBzb21lIG1vcmUgZGF0YS4KKyAqLworI2RlZmluZSBURVNUX01FVEFEQVRBIFwKKyAgICAiVGVzdCBtZXRhZGF0YSIKKyNkZWZpbmUgSUNZX01FVEFEQVRBIFwKKyAgICAiU3RyZWFtVGl0bGU9JyIgVEVTVF9NRVRBREFUQSAiJztcMFwwXDBcMCIKKworI2RlZmluZSBFTVBUWV9JQ1lfU1RSRUFNX1RJVExFX01FVEFEQVRBIFwKKyAgICAiU3RyZWFtVGl0bGU9Jyc7XDAiCisKKyNkZWZpbmUgSUNZX0RBVEEgXAorICAgICJhYWFhYWFhYSIgXAorICAgICJceDAyIiBcCisgICAgSUNZX01FVEFEQVRBIFwKKyAgICAiYmJiYmJiYmIiCisKKyNkZWZpbmUgSUNZX0RBVEFfRU1QVFlfTUVUQURBVEEgXAorICAgIElDWV9EQVRBIFwKKyAgICAiXHgwMCIgXAorICAgICJkZGRkZGRkZCIgXAorICAgICJceDAxIiBcCisgICAgRU1QVFlfSUNZX1NUUkVBTV9USVRMRV9NRVRBREFUQSBcCisgICAgImNjY2NjY2NjIgorCisjZGVmaW5lIElDWUNBUFMgImFwcGxpY2F0aW9uL3gtaWN5LCBtZXRhZGF0YS1pbnRlcnZhbCA9IChpbnQpOCIKKworI2RlZmluZSBTUkNfQ0FQUyAiYXBwbGljYXRpb24veC1pY3ksIG1ldGFkYXRhLWludGVydmFsID0gKGludClbMCwgTUFYXSIKKyNkZWZpbmUgU0lOS19DQVBTICAiQU5ZIgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChTUkNfQ0FQUykKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChTSU5LX0NBUFMpCisgICAgKTsKKworc3RhdGljIEdzdEVsZW1lbnQgKmljeWRlbXV4Oworc3RhdGljIEdzdEJ1cyAqYnVzOworR3N0UGFkICpzcmNwYWQsICpzaW5rcGFkOworCitzdGF0aWMgR3N0U3RhdGljQ2FwcyB0eXBlZmluZF9jYXBzID0KK0dTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworCitzdGF0aWMgZ2Jvb2xlYW4gZmFrZV90eXBlZmluZF9jYXBzOyAgICAgLyogRkFMU0UgKi8KKworc3RhdGljIHZvaWQKK3R5cGVmaW5kX3N1Y2NlZWQgKEdzdFR5cGVGaW5kICogdGYsIGdwb2ludGVyIHByaXZhdGUpCit7CisgIGlmIChmYWtlX3R5cGVmaW5kX2NhcHMpIHsKKyAgICBnc3RfdHlwZV9maW5kX3N1Z2dlc3QgKHRmLCBHU1RfVFlQRV9GSU5EX01BWElNVU0sCisgICAgICAgIGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZ0eXBlZmluZF9jYXBzKSk7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCit0ZXN0X2V2ZW50X2Z1bmMgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RFdmVudCAqIGV2ZW50KQoreworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiJXMgZXZlbnQ6ICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpLCBldmVudCk7CisKKyAgLyogYSBzaW5rIHdvdWxkIHBvc3QgdGFnIGV2ZW50cyBhcyBtZXNzYWdlcywgc28gZG8gdGhlIHNhbWUgaGVyZSwKKyAgICogZXNwLiBzaW5jZSB3ZSdyZSBwb2xsaW5nIG9uIHRoZSBidXMgd2FpdGluZyBmb3IgVEFHIG1lc3NhZ2VzLi4gKi8KKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX1RBRykgeworICAgIEdzdFRhZ0xpc3QgKnRhZ2xpc3Q7CisKKyAgICBnc3RfZXZlbnRfcGFyc2VfdGFnIChldmVudCwgJnRhZ2xpc3QpOworCisgICAgZ3N0X2J1c19wb3N0IChidXMsIGdzdF9tZXNzYWdlX25ld190YWcgKEdTVF9PQkpFQ1QgKHBhZCksCisgICAgICAgICAgICBnc3RfdGFnX2xpc3RfY29weSAodGFnbGlzdCkpKTsKKyAgfQorCisgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2ljeWRlbXV4X2ZvdW5kX3BhZCAoR3N0RWxlbWVudCAqIHNyYywgR3N0UGFkICogcGFkLCBncG9pbnRlciBkYXRhKQoreworICBHU1RfREVCVUcgKCJnb3QgbmV3IHBhZCAlIiBHU1RfUFRSX0ZPUk1BVCwgcGFkKTsKKworICAvKiBUdXJucyBvdXQgdGhhdCB0aGlzIGFzc2VydHMgYSByZWZjb3VudCB3aGljaCBpcyB3cm9uZyBmb3IgdGhpcworICAgKiBjYXNlIChhZGRpbmcgdGhlIHBhZCBmcm9tIGEgcGFkLWFkZGVkIGNhbGxiYWNrKSwgc28ganVzdCBkbyB0aGUgc2FtZQorICAgKiB0aGluZyBpbmxpbmUuLi4gKi8KKyAgLyogc2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoaWN5ZGVtdXgsICZzaW5rdGVtcGxhdGUsIE5VTEwpOyAqLworICBzaW5rcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rdGVtcGxhdGUsICJzaW5rIik7CisgIGZhaWxfaWYgKHNpbmtwYWQgPT0gTlVMTCwgIkNvdWxkbid0IGNyZWF0ZSBzaW5rcGFkIik7CisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChpY3lkZW11eCwgInNyYyIpOworICBmYWlsX2lmIChzcmNwYWQgPT0gTlVMTCwgIkZhaWxlZCB0byBnZXQgc3JjcGFkIGZyb20gaWN5ZGVtdXgiKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHNpbmtwYWQsIGdzdF9jaGVja19jaGFpbl9mdW5jKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHNpbmtwYWQsIHRlc3RfZXZlbnRfZnVuYyk7CisKKyAgR1NUX0RFQlVHICgiY2hlY2tpbmcgc3JjcGFkICVwIHJlZmNvdW50Iiwgc3JjcGFkKTsKKyAgLyogMSBmcm9tIGVsZW1lbnQsIDEgZnJvbSBzaWduYWwsIDEgZnJvbSB1cyAqLworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChzcmNwYWQsICJzcmNwYWQiLCAzKTsKKworICBHU1RfREVCVUcgKCJsaW5raW5nIHNyY3BhZCIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rIChzcmNwYWQsIHNpbmtwYWQpID09IEdTVF9QQURfTElOS19PSywKKyAgICAgICJGYWlsZWQgdG8gbGluayBwYWRzIik7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzaW5rcGFkLCBUUlVFKTsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorY3JlYXRlX2ljeWRlbXV4ICh2b2lkKQoreworICBpY3lkZW11eCA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgiaWN5ZGVtdXgiKTsKKyAgc3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKGljeWRlbXV4LCAmc3JjdGVtcGxhdGUpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc3JjcGFkLCBUUlVFKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChpY3lkZW11eCwgInBhZC1hZGRlZCIsIEdfQ0FMTEJBQ0sgKGljeWRlbXV4X2ZvdW5kX3BhZCksCisgICAgICBOVUxMKTsKKworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAoaWN5ZGVtdXgsIGJ1cyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoaWN5ZGVtdXgsIEdTVF9TVEFURV9QTEFZSU5HKSAhPQorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFLCAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgcmV0dXJuIGljeWRlbXV4OworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF9pY3lkZW11eCAodm9pZCkKK3sKKyAgZ3N0X2J1c19zZXRfZmx1c2hpbmcgKGJ1cywgVFJVRSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGJ1cyA9IE5VTEw7CisKKyAgZ3N0X2NoZWNrX2Ryb3BfYnVmZmVycyAoKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKGljeWRlbXV4KTsKKyAgaWYgKHNpbmtwYWQpCisgICAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChpY3lkZW11eCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChpY3lkZW11eCk7CisKKyAgc3JjcGFkID0gTlVMTDsKKyAgc2lua3BhZCA9IE5VTEw7CisgIGljeWRlbXV4ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3B1c2hfZGF0YSAoY29uc3QgZ3VpbnQ4ICogZGF0YSwgaW50IGxlbiwgZ2ludDY0IG9mZnNldCkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIEdzdEJ1ZmZlciAqYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChsZW4pOworCisgIGdzdF9idWZmZXJfZmlsbCAoYnVmZmVyLCAwLCBkYXRhLCBsZW4pOworCisgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpID0gb2Zmc2V0OworCisgIHJlcyA9IGdzdF9wYWRfcHVzaCAoc3JjcGFkLCBidWZmZXIpOworCisgIGZhaWxfdW5sZXNzIChyZXMgPT0gR1NUX0ZMT1dfT0ssICJGYWlsZWQgcHVzaGluZyBidWZmZXI6ICVkIiwgcmVzKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZGVtdXgpCit7CisgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisgIGNvbnN0IEdWYWx1ZSAqdGFnX3ZhbDsKKyAgY29uc3QgZ2NoYXIgKnRhZzsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBmYWlsX3VubGVzcyAoZ3N0X3R5cGVfZmluZF9yZWdpc3RlciAoTlVMTCwgInN1Y2Nlc3MiLCBHU1RfUkFOS19QUklNQVJZLAorICAgICAgICAgIHR5cGVmaW5kX3N1Y2NlZWQsIE5VTEwsIGdzdF9zdGF0aWNfY2Fwc19nZXQgKCZ0eXBlZmluZF9jYXBzKSwgTlVMTCwKKyAgICAgICAgICBOVUxMKSk7CisKKyAgZmFrZV90eXBlZmluZF9jYXBzID0gVFJVRTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKElDWUNBUFMpOworCisgIGNyZWF0ZV9pY3lkZW11eCAoKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAoc3JjcGFkLCBpY3lkZW11eCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKworICBwdXNoX2RhdGEgKChndWludDggKikgSUNZX0RBVEEsIHNpemVvZiAoSUNZX0RBVEEpLCAtMSk7CisKKyAgbWVzc2FnZSA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9UQUcsIC0xKTsKKyAgZmFpbF91bmxlc3MgKG1lc3NhZ2UgIT0gTlVMTCk7CisKKyAgZ3N0X21lc3NhZ2VfcGFyc2VfdGFnIChtZXNzYWdlLCAmdGFncyk7CisgIGZhaWxfdW5sZXNzICh0YWdzICE9IE5VTEwpOworCisgIHRhZ192YWwgPSBnc3RfdGFnX2xpc3RfZ2V0X3ZhbHVlX2luZGV4ICh0YWdzLCBHU1RfVEFHX1RJVExFLCAwKTsKKyAgZmFpbF91bmxlc3MgKHRhZ192YWwgIT0gTlVMTCk7CisKKyAgdGFnID0gZ192YWx1ZV9nZXRfc3RyaW5nICh0YWdfdmFsKTsKKyAgZmFpbF91bmxlc3MgKHRhZyAhPSBOVUxMKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChURVNUX01FVEFEQVRBLCAoY2hhciAqKSB0YWcpOworCisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFncyk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGNsZWFudXBfaWN5ZGVtdXggKCk7CisKKyAgZmFrZV90eXBlZmluZF9jYXBzID0gRkFMU0U7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZGVtdXhfZW1wdHlfZGF0YSkKK3sKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgR3N0VGFnTGlzdCAqdGFnczsKKyAgY29uc3QgR1ZhbHVlICp0YWdfdmFsOworICBjb25zdCBnY2hhciAqdGFnOworICBHc3RDYXBzICpjYXBzOworCisgIGZhaWxfdW5sZXNzIChnc3RfdHlwZV9maW5kX3JlZ2lzdGVyIChOVUxMLCAic3VjY2VzcyIsIEdTVF9SQU5LX1BSSU1BUlksCisgICAgICAgICAgdHlwZWZpbmRfc3VjY2VlZCwgTlVMTCwgZ3N0X3N0YXRpY19jYXBzX2dldCAoJnR5cGVmaW5kX2NhcHMpLCBOVUxMLAorICAgICAgICAgIE5VTEwpKTsKKworICBmYWtlX3R5cGVmaW5kX2NhcHMgPSBUUlVFOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoSUNZQ0FQUyk7CisKKyAgY3JlYXRlX2ljeWRlbXV4ICgpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChzcmNwYWQsIGljeWRlbXV4LCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworCisgIHB1c2hfZGF0YSAoKGd1aW50OCAqKSBJQ1lfREFUQV9FTVBUWV9NRVRBREFUQSwKKyAgICAgIHNpemVvZiAoSUNZX0RBVEFfRU1QVFlfTUVUQURBVEEpLCAtMSk7CisKKyAgbWVzc2FnZSA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9UQUcsIC0xKTsKKyAgZmFpbF91bmxlc3MgKG1lc3NhZ2UgIT0gTlVMTCk7CisKKyAgZ3N0X21lc3NhZ2VfcGFyc2VfdGFnIChtZXNzYWdlLCAmdGFncyk7CisgIGZhaWxfdW5sZXNzICh0YWdzICE9IE5VTEwpOworCisgIHRhZ192YWwgPSBnc3RfdGFnX2xpc3RfZ2V0X3ZhbHVlX2luZGV4ICh0YWdzLCBHU1RfVEFHX1RJVExFLCAwKTsKKyAgZmFpbF91bmxlc3MgKHRhZ192YWwgIT0gTlVMTCk7CisKKyAgdGFnID0gZ192YWx1ZV9nZXRfc3RyaW5nICh0YWdfdmFsKTsKKyAgZmFpbF91bmxlc3MgKHRhZyAhPSBOVUxMKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChURVNUX01FVEFEQVRBLCAoY2hhciAqKSB0YWcpOworCisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFncyk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworICBtZXNzYWdlID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX1RBRywgLTEpOworICBmYWlsX3VubGVzcyAobWVzc2FnZSAhPSBOVUxMKTsKKworICBnc3RfbWVzc2FnZV9wYXJzZV90YWcgKG1lc3NhZ2UsICZ0YWdzKTsKKyAgZmFpbF91bmxlc3MgKHRhZ3MgIT0gTlVMTCk7CisKKyAgdGFnX3ZhbCA9IGdzdF90YWdfbGlzdF9nZXRfdmFsdWVfaW5kZXggKHRhZ3MsIEdTVF9UQUdfVElUTEUsIDApOworICBmYWlsX3VubGVzcyAodGFnX3ZhbCA9PSBOVUxMKTsKKworICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgLyogRW5zdXJlIHRoYXQgbm8gZnVydGhlciB0YWcgbWVzc2FnZXMgYXJlIHJlY2VpdmVkLCBpLmUuIHRoZSBlbXB0eSBJQ1kgdGFnCisgICAqIGlzIHNraXBwZWQgKi8KKyAgbWVzc2FnZSA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9UQUcsIDEwMDAwMDAwMCk7CisgIGZhaWxfdW5sZXNzIChtZXNzYWdlID09IE5VTEwpOworCisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFncyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBjbGVhbnVwX2ljeWRlbXV4ICgpOworCisgIGZha2VfdHlwZWZpbmRfY2FwcyA9IEZBTFNFOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIHJ1biB0aGlzIHRlc3QgZmlyc3QgYmVmb3JlIHRoZSBjdXN0b20gdHlwZWZpbmQgZnVuY3Rpb24gaXMgc2V0IHVwICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF9maXJzdF9idWZfb2Zmc2V0X3doZW5fbWVyZ2VkX2Zvcl90eXBlZmluZGluZykKK3sKKyAgY29uc3QgZ3VpbnQ4IGJ1ZjFbXSA9IHsgJ00nIH07CisgIGNvbnN0IGd1aW50OCBidWYyW10gPSB7ICdQJywgJysnLCAweGZmLCAweGZiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKyAgfTsKKyAgR3N0Q2FwcyAqaWN5X2NhcHM7CisgIEdzdFBhZCAqaWN5X3NyY3BhZDsKKworICBmYWtlX3R5cGVmaW5kX2NhcHMgPSBGQUxTRTsKKworICBjcmVhdGVfaWN5ZGVtdXggKCk7CisKKyAgaWN5X2NhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoSUNZQ0FQUyk7CisKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAoc3JjcGFkLCBpY3lkZW11eCwgaWN5X2NhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisKKyAgcHVzaF9kYXRhIChidWYxLCBHX05fRUxFTUVOVFMgKGJ1ZjEpLCAwKTsKKworICAvKiBvbmUgYnl0ZSBpc24ndCByZWFsbHkgZW5vdWdoIGZvciB0eXBlZmluZGluZywgY2FuJ3QgaGF2ZSBhIHNyY3BhZCB5ZXQgKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChpY3lkZW11eCwgInNyYyIpID09IE5VTEwpOworCisgIHB1c2hfZGF0YSAoYnVmMiwgR19OX0VMRU1FTlRTIChidWYyKSwgLTEpOworCisgIC8qIHNob3VsZCBoYXZlIGJlZW4gZW5vdWdoIHRvIGNyZWF0ZSBhIGF1ZGlvL3gtbXVzZXBhY2sgc291cmNlIHBhZCAuLiAqLworICBpY3lfc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGljeWRlbXV4LCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChpY3lfc3JjcGFkICE9IE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChpY3lfc3JjcGFkKTsKKworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPiAwKTsKKworICAvKiBmaXJzdCBidWZmZXIgc2hvdWxkIGhhdmUgb2Zmc2V0IDAgZXZlbiBhZnRlciBpdCB3YXMgbWVyZ2VkIHdpdGggMm5kIGJ1ZiAqLworICBmYWlsX3VubGVzcyAoR1NUX0JVRkZFUl9PRkZTRVQgKEdTVF9CVUZGRVJfQ0FTVCAoYnVmZmVycy0+ZGF0YSkpID09IDApOworCisgIGdzdF9jYXBzX3VucmVmIChpY3lfY2Fwcyk7CisKKyAgY2xlYW51cF9pY3lkZW11eCAoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ub3RfbmVnb3RpYXRlZCkKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKworICBjcmVhdGVfaWN5ZGVtdXggKCk7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfQllURVMpOworICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJ0ZXN0IikpOworICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMCk7CisgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpID0gMDsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcGFkX3B1c2ggKHNyY3BhZCwgYnVmKSwgR1NUX0ZMT1dfTk9UX05FR09USUFURUQpOworICBidWYgPSBOVUxMOworCisgIGNsZWFudXBfaWN5ZGVtdXggKCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2ljeWRlbXV4X3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImljeWRlbXV4Iik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2RlbXV4KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2RlbXV4X2VtcHR5X2RhdGEpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZmlyc3RfYnVmX29mZnNldF93aGVuX21lcmdlZF9mb3JfdHlwZWZpbmRpbmcpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfbm90X25lZ290aWF0ZWQpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoaWN5ZGVtdXgpCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9pZDNkZW11eC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzZGVtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2I1MjRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzZGVtdXguYwpAQCAtMCwwICsxLDI4MyBAQAorLyogR1N0cmVhbWVyIHVuaXQgdGVzdHMgZm9yIGlkM2RlbXV4CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKwordHlwZWRlZiB2b2lkIChDaGVja1RhZ3NGdW5jKSAoY29uc3QgR3N0VGFnTGlzdCAqIHRhZ3MsIGNvbnN0IGdjaGFyICogZmlsZSk7CisKK3N0YXRpYyBHc3RCdXNTeW5jUmVwbHkKK2Vycm9yX2NiIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtc2csIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRVJST1IpIHsKKyAgICBjb25zdCBnY2hhciAqZmlsZSA9IChjb25zdCBnY2hhciAqKSB1c2VyX2RhdGE7CisgICAgR0Vycm9yICplcnIgPSBOVUxMOworICAgIGdjaGFyICpkYmcgPSBOVUxMOworCisgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1zZywgJmVyciwgJmRiZyk7CisgICAgZ19lcnJvciAoIkVSUk9SIGZvciAlczogJXNcbiVzXG4iLCBmaWxlLCBlcnItPm1lc3NhZ2UsIGRiZyk7CisgIH0KKworICByZXR1cm4gR1NUX0JVU19QQVNTOworfQorCitzdGF0aWMgR3N0VGFnTGlzdCAqCityZWFkX3RhZ3NfZnJvbV9maWxlIChjb25zdCBnY2hhciAqIGZpbGUsIGdib29sZWFuIHB1c2hfbW9kZSkKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmV0OworICBHc3RUYWdMaXN0ICp0YWdzID0gTlVMTDsKKyAgR3N0TWVzc2FnZSAqbXNnOworICBHc3RFbGVtZW50ICpzcmMsICpzZXAsICpzaW5rLCAqaWQzZGVtdXgsICpwaXBlbGluZTsKKyAgR3N0QnVzICpidXM7CisgIGdjaGFyICpwYXRoOworCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGZhaWxfdW5sZXNzIChwaXBlbGluZSAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSBwaXBlbGluZSEiKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChwaXBlbGluZSk7CisKKyAgLyoga2lkcywgZG9uJ3QgdXNlIGEgc3luYyBoYW5kbGVyIGZvciB0aGlzIGF0IGhvbWUsIHJlYWxseTsgd2UgZG8gYmVjYXVzZQorICAgKiB3ZSBqdXN0IHdhbnQgdG8gYWJvcnQgYW5kIG5vdGhpbmcgZWxzZSAqLworICBnc3RfYnVzX3NldF9zeW5jX2hhbmRsZXIgKGJ1cywgZXJyb3JfY2IsIChncG9pbnRlcikgZmlsZSwgTlVMTCk7CisKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmlsZXNyYyIsICJmaWxlc3JjIik7CisgIGZhaWxfdW5sZXNzIChzcmMgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgJ2ZpbGVzcmMnIGVsZW1lbnQhIik7CisKKyAgaWYgKHB1c2hfbW9kZSkgeworICAgIHNlcCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInF1ZXVlIiwgInF1ZXVlIik7CisgICAgZmFpbF91bmxlc3MgKHNlcCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSAncXVldWUnIGVsZW1lbnQiKTsKKyAgfSBlbHNlIHsKKyAgICBzZXAgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJpZGVudGl0eSIsICJpZGVudGl0eSIpOworICAgIGZhaWxfdW5sZXNzIChzZXAgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgJ2lkZW50aXR5JyBlbGVtZW50Iik7CisgIH0KKworICBpZDNkZW11eCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImlkM2RlbXV4IiwgImlkM2RlbXV4Iik7CisgIGZhaWxfdW5sZXNzIChpZDNkZW11eCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSAnaWQzZGVtdXgnIGVsZW1lbnQhIik7CisKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgImZha2VzaW5rIik7CisgIGZhaWxfdW5sZXNzIChzaW5rICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlICdmYWtlc2luaycgZWxlbWVudCEiKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHNyYywgc2VwLCBpZDNkZW11eCwgc2luaywgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmsgKHNyYywgc2VwKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rIChzZXAsIGlkM2RlbXV4KSk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rIChpZDNkZW11eCwgc2luaykpOworCisgIHBhdGggPSBnX2J1aWxkX2ZpbGVuYW1lIChHU1RfVEVTVF9GSUxFU19QQVRILCBmaWxlLCBOVUxMKTsKKyAgR1NUX0xPRyAoInJlYWRpbmcgZmlsZSAnJXMnIiwgcGF0aCk7CisgIGdfb2JqZWN0X3NldCAoc3JjLCAibG9jYXRpb24iLCBwYXRoLCBOVUxMKTsKKworICBzdGF0ZV9yZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgZmFpbF91bmxlc3MgKHN0YXRlX3JldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIGlmIChzdGF0ZV9yZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9BU1lOQykgeworICAgIEdTVF9MT0cgKCJ3YWl0aW5nIGZvciBwaXBlbGluZSB0byByZWFjaCBQQVVTRUQgc3RhdGUiKTsKKyAgICBzdGF0ZV9yZXQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKHBpcGVsaW5lLCBOVUxMLCBOVUxMLCAtMSk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoc3RhdGVfcmV0LCBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworICB9CisKKyAgR1NUX0xPRyAoIlBBVVNFRCwgbGV0J3MgcmV0cmlldmUgb3VyIHRhZ3MiKTsKKworICBtc2cgPSBnc3RfYnVzX3BvbGwgKGJ1cywgR1NUX01FU1NBR0VfVEFHLCAtMSk7CisgIGZhaWxfdW5sZXNzIChtc2cgIT0gTlVMTCwgIkV4cGVjdGVkIFRBRyBtZXNzYWdlIG9uIGJ1cyEgKCVzKSIsIGZpbGUpOworCisgIGdzdF9tZXNzYWdlX3BhcnNlX3RhZyAobXNnLCAmdGFncyk7CisgIGZhaWxfdW5sZXNzICh0YWdzICE9IE5VTEwsICJUQUcgbWVzc2FnZSBkaWQgbm90IGNvbnRhaW4gdGFnbGlzdCEgKCVzKSIsIGZpbGUpOworCisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKSwKKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKworICBnX2ZyZWUgKHBhdGgpOworCisgIEdTVF9JTkZPICgiJXM6IHRhZ3MgPSAlIiBHU1RfUFRSX0ZPUk1BVCwgZmlsZSwgdGFncyk7CisgIHJldHVybiB0YWdzOworfQorCitzdGF0aWMgdm9pZAorcnVuX2NoZWNrX2Zvcl9maWxlIChjb25zdCBnY2hhciAqIGZpbGVuYW1lLCBDaGVja1RhZ3NGdW5jICogY2hlY2tfZnVuYykKK3sKKyAgR3N0VGFnTGlzdCAqdGFnczsKKworICAvKiBmaXJzdCwgcHVsbC1iYXNlZCAqLworICB0YWdzID0gcmVhZF90YWdzX2Zyb21fZmlsZSAoZmlsZW5hbWUsIEZBTFNFKTsKKyAgZmFpbF91bmxlc3MgKHRhZ3MgIT0gTlVMTCwgIkZhaWxlZCB0byBleHRyYWN0IHRhZ3MgZnJvbSAnJXMnIiwgZmlsZW5hbWUpOworICBjaGVja19mdW5jICh0YWdzLCBmaWxlbmFtZSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFncyk7CisKKyAgLyogRklYTUU6IG5lZWQgdG8gZml4IGlkM2RlbXV4IGZvciBzaG9ydCBjb250ZW50IGluIHB1c2ggbW9kZSAqLworI2lmIDAKKyAgLyogbm93IHRyeSBwdXNoLWJhc2VkICovCisgIHRhZ3MgPSByZWFkX3RhZ3NfZnJvbV9maWxlIChmaWxlbmFtZSwgVFJVRSk7CisgIGZhaWxfdW5sZXNzICh0YWdzICE9IE5VTEwsICJGYWlsZWQgdG8gZXh0cmFjdCB0YWdzIGZyb20gJyVzJyIsIGZpbGVuYW1lKTsKKyAgY2hlY2tfZnVuYyAodGFncywgZmlsZW5hbWUpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ3MpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitjaGVja19kYXRlXzE5NzdfMDZfMjMgKGNvbnN0IEdzdFRhZ0xpc3QgKiB0YWdzLCBjb25zdCBnY2hhciAqIGZpbGUpCit7CisgIEdzdERhdGVUaW1lICpkYXRlID0gTlVMTDsKKworICBnc3RfdGFnX2xpc3RfZ2V0X2RhdGVfdGltZSAodGFncywgR1NUX1RBR19EQVRFX1RJTUUsICZkYXRlKTsKKyAgZmFpbF91bmxlc3MgKGRhdGUgIT0gTlVMTCwKKyAgICAgICJUYWdzIGZyb20gJXMgc2hvdWxkIGNvbnRhaW4gYSBHU1RfVEFHX0RBVEVfVElNRSB0YWciKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2RhdGVfdGltZV9nZXRfeWVhciAoZGF0ZSksIDE5NzcpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZGF0ZV90aW1lX2dldF9tb250aCAoZGF0ZSksIDYpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZGF0ZV90aW1lX2dldF9kYXkgKGRhdGUpLCAyMyk7CisgIGdzdF9kYXRlX3RpbWVfdW5yZWYgKGRhdGUpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF90ZGF0X3R5ZXIpCit7CisgIHJ1bl9jaGVja19mb3JfZmlsZSAoImlkMy00MDczNDktMS50YWciLCBjaGVja19kYXRlXzE5NzdfMDZfMjMpOworICBydW5fY2hlY2tfZm9yX2ZpbGUgKCJpZDMtNDA3MzQ5LTIudGFnIiwgY2hlY2tfZGF0ZV8xOTc3XzA2XzIzKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgdm9pZAorY2hlY2tfd2NvcCAoY29uc3QgR3N0VGFnTGlzdCAqIHRhZ3MsIGNvbnN0IGdjaGFyICogZmlsZSkKK3sKKyAgZ2NoYXIgKmNvcHlyaWdodCA9IE5VTEw7CisgIGdjaGFyICp1cmkgPSBOVUxMOworCisgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAodGFncywgR1NUX1RBR19MSUNFTlNFX1VSSSwgJnVyaSkpOworICBmYWlsX3VubGVzcyAodXJpICE9IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nICh1cmksCisgICAgICAiaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLyIpOworICBnX2ZyZWUgKHVyaSk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nICh0YWdzLCBHU1RfVEFHX0NPUFlSSUdIVCwgJmNvcHlyaWdodCkpOworICBmYWlsX3VubGVzcyAoY29weXJpZ2h0ICE9IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChjb3B5cmlnaHQsCisgICAgICAiIFN0ZWFkbWFuLiBMaWNlbnNlZCB0byB0aGUgcHVibGljIHVuZGVyIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzMuMC8gdmVyaWZ5IGF0IGh0dHA6Ly90ZXN0LmNvbSIpOworICBnX2ZyZWUgKGNvcHlyaWdodCk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3djb3ApCit7CisgIHJ1bl9jaGVja19mb3JfZmlsZSAoImlkMy00NDcwMDAtd2NvcC50YWciLCBjaGVja193Y29wKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgdm9pZAorY2hlY2tfdW5zeW5jX3YyMyAoY29uc3QgR3N0VGFnTGlzdCAqIHRhZ3MsIGNvbnN0IGdjaGFyICogZmlsZSkKK3sKKyAgZ2NoYXIgKmFsYnVtID0gTlVMTDsKKyAgZ2NoYXIgKnRpdGxlID0gTlVMTDsKKyAgZ2NoYXIgKmFydGlzdCA9IE5VTEw7CisKKyAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nICh0YWdzLCBHU1RfVEFHX1RJVExFLCAmdGl0bGUpKTsKKyAgZmFpbF91bmxlc3MgKHRpdGxlICE9IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nICh0aXRsZSwgIkFSVElTVCIpOyAgLyogc2ljICovCisgIGdfZnJlZSAodGl0bGUpOworCisgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X3N0cmluZyAodGFncywgR1NUX1RBR19BTEJVTSwgJmFsYnVtKSk7CisgIGZhaWxfdW5sZXNzIChhbGJ1bSAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoYWxidW0sICJBbGJ1bSIpOworICBnX2ZyZWUgKGFsYnVtKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ3MsIEdTVF9UQUdfQVJUSVNULCAmYXJ0aXN0KSk7CisgIGZhaWxfdW5sZXNzIChhcnRpc3QgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKGFydGlzdCwgIuiXneS6uiIpOworICBnX2ZyZWUgKGFydGlzdCk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3Vuc3luY192MjMpCit7CisgIHJ1bl9jaGVja19mb3JfZmlsZSAoImlkMy01Nzc0NjgtdW5zeW5jZWQtdGFnLnRhZyIsIGNoZWNrX3Vuc3luY192MjMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyB2b2lkCitjaGVja191bnN5bmNfdjI0IChjb25zdCBHc3RUYWdMaXN0ICogdGFncywgY29uc3QgZ2NoYXIgKiBmaWxlKQoreworICBjb25zdCBHVmFsdWUgKnZhbDsKKyAgR3N0U2FtcGxlICpzYW1wbGU7CisgIEdzdEJ1ZmZlciAqYnVmOworICBnY2hhciAqYWxidW0gPSBOVUxMOworICBnY2hhciAqdGl0bGUgPSBOVUxMOworICBnY2hhciAqYXJ0aXN0ID0gTlVMTDsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nICh0YWdzLCBHU1RfVEFHX1RJVExFLCAmdGl0bGUpKTsKKyAgZmFpbF91bmxlc3MgKHRpdGxlICE9IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nICh0aXRsZSwgIlN0YXJsaWdodCIpOworICBnX2ZyZWUgKHRpdGxlKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ3MsIEdTVF9UQUdfQUxCVU0sICZhbGJ1bSkpOworICBmYWlsX3VubGVzcyAoYWxidW0gIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKGFsYnVtLCAiTCdhbGJ1bVJvY2tWb2wuNCBDRDEiKTsKKyAgZ19mcmVlIChhbGJ1bSk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nICh0YWdzLCBHU1RfVEFHX0FSVElTVCwgJmFydGlzdCkpOworICBmYWlsX3VubGVzcyAoYXJ0aXN0ICE9IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChhcnRpc3QsICJNdXNlIik7CisgIGdfZnJlZSAoYXJ0aXN0KTsKKworICB2YWwgPSBnc3RfdGFnX2xpc3RfZ2V0X3ZhbHVlX2luZGV4ICh0YWdzLCBHU1RfVEFHX0lNQUdFLCAwKTsKKyAgZmFpbF91bmxlc3MgKHZhbCAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9WQUxVRV9IT0xEU19TQU1QTEUgKHZhbCkpOworICBzYW1wbGUgPSBnc3RfdmFsdWVfZ2V0X3NhbXBsZSAodmFsKTsKKyAgZmFpbF91bmxlc3MgKHNhbXBsZSAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9zYW1wbGVfZ2V0X2NhcHMgKHNhbXBsZSkgIT0gTlVMTCk7CisgIGJ1ZiA9IGdzdF9zYW1wbGVfZ2V0X2J1ZmZlciAoc2FtcGxlKTsKKyAgZmFpbF91bmxlc3MgKGJ1ZiAhPSBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobWFwLnNpemUsIDM4MDIyKTsKKyAgLyogY2hlY2sgZm9yIGpwZWcgc3RhcnQvZW5kIG1hcmtlcnMgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobWFwLmRhdGFbMF0sIDB4ZmYpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChtYXAuZGF0YVsxXSwgMHhkOCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG1hcC5kYXRhWzM4MDIwXSwgMHhmZik7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG1hcC5kYXRhWzM4MDIxXSwgMHhkOSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3Vuc3luY192MjQpCit7CisgIHJ1bl9jaGVja19mb3JfZmlsZSAoImlkMy01ODgxNDgtdW5zeW5jZWQtdjI0LnRhZyIsIGNoZWNrX3Vuc3luY192MjQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitpZDNkZW11eF9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJpZDNkZW11eCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90ZGF0X3R5ZXIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfd2NvcCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF91bnN5bmNfdjIzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3Vuc3luY192MjQpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoaWQzZGVtdXgpCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9pZDN2Mm11eC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzdjJtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTQ3ZjFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvaWQzdjJtdXguYwpAQCAtMCwwICsxLDUyMSBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciB0aGUgdGFnbGliLWJhc2VkIGlkM3YybXV4IGVsZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGltLVBoaWxpcHAgTcO8bGxlciAgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIFRFU1RfQVJUSVNUICAgICAgICAgICAiQXIgVFwzMDNcMjU1c3QiCisjZGVmaW5lIFRFU1RfVElUTEUgICAgICAgICAgICAiTVwzMDNcMjc0bGxlcm1pbGNoISIKKyNkZWZpbmUgVEVTVF9BTEJVTSAgICAgICAgICAgICJCb29tIgorI2RlZmluZSBURVNUX0RBVEUgICAgICAgICAgICAgZ19kYXRlX25ld19kbXkoMSwxLDIwMDYpCisjZGVmaW5lIFRFU1RfVFJBQ0tfTlVNQkVSICAgICA3CisjZGVmaW5lIFRFU1RfVFJBQ0tfQ09VTlQgICAgICAxOQorI2RlZmluZSBURVNUX1ZPTFVNRV9OVU1CRVIgICAgMgorI2RlZmluZSBURVNUX1ZPTFVNRV9DT1VOVCAgICAgMworI2RlZmluZSBURVNUX1RSQUNLX0dBSU4gICAgICAxLjQ1CisjZGVmaW5lIFRFU1RfQUxCVU1fR0FJTiAgICAgIDAuNzgKKyNkZWZpbmUgVEVTVF9UUkFDS19QRUFLICAgICAgMC44MworI2RlZmluZSBURVNUX0FMQlVNX1BFQUsgICAgICAwLjE4CisjZGVmaW5lIFRFU1RfQlBNICAgICAgICAgICAgIDExMy4wCisKKy8qIGZvciBkdW1teSBtcDMgZnJhbWUgc2l6ZWQgTVAzX0ZSQU1FX1NJWkUgYnl0ZXMsCisgKiBzdGFydDogZmYgZmIgYjAgNDQgMDAgMDAgMDggMDAgIDAwIDRiIDAwIDAwIDAwIDAwIDAwIDAwICovCitzdGF0aWMgY29uc3QgZ3VpbnQ4IG1wM19kdW1teWhkcltdID0geyAweGZmLCAweGZiLCAweGIwLCAweDQ0LCAweDAwLCAweDAwLAorICAweDA4LCAweDAwLCAweDRiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDAwCit9OworCisjZGVmaW5lIE1QM19GUkFNRV9TSVpFIDYyNgorCisvKiB0aGUgcGVhayBhbmQgZ2FpbiB2YWx1ZXMgYXJlIHN0b3JlZCBwcmV0dHkgcm91Z2hseSwgc28gY2hlY2sgdGhhdCB0aGV5J3JlCisgKiB3aXRoaW4gMiUgb2YgdGhlIGV4cGVjdGVkIHZhbHVlLgorICovCisjZGVmaW5lIGZhaWxfdW5sZXNzX3NvcnRhX2VxdWFsc19mbG9hdChhLCBiKQkJCQlcCitHX1NUTVRfU1RBUlQgewkJCQkJCQkJXAorICBkb3VibGUgZmlyc3QgPSBhOwkJCQkJCQlcCisgIGRvdWJsZSBzZWNvbmQgPSBiOwkJCQkJCQlcCisgIGZhaWxfdW5sZXNzKGZhYnMgKGZpcnN0IC0gc2Vjb25kKSA8ICgwLjAyICogZmFicyAoZmlyc3QpKSwJCVwKKyAgICAgICInIiAjYSAiJyAoJWcpIGlzIG5vdCBlcXVhbCB0byAnIiAjYiAiJyAoJWcpIiwgZmlyc3QsIHNlY29uZCk7CVwKK30gR19TVE1UX0VORDsKKworCitzdGF0aWMgR3N0VGFnTGlzdCAqCit0ZXN0X3RhZ2xpYl9pZDNtdXhfY3JlYXRlX3RhZ3MgKGd1aW50MzIgbWFzaykKK3sKKyAgR3N0VGFnTGlzdCAqdGFnczsKKworICB0YWdzID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKworICBpZiAobWFzayAmICgxIDw8IDApKSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9LRUVQLAorICAgICAgICBHU1RfVEFHX0FSVElTVCwgVEVTVF9BUlRJU1QsIE5VTEwpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMSkpIHsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX0tFRVAsCisgICAgICAgIEdTVF9UQUdfVElUTEUsIFRFU1RfVElUTEUsIE5VTEwpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMikpIHsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX0tFRVAsCisgICAgICAgIEdTVF9UQUdfQUxCVU0sIFRFU1RfQUxCVU0sIE5VTEwpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMykpIHsKKyAgICBHRGF0ZSAqZGF0ZTsKKworICAgIGRhdGUgPSBURVNUX0RBVEU7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9LRUVQLCBHU1RfVEFHX0RBVEUsIGRhdGUsIE5VTEwpOworICAgIGdfZGF0ZV9mcmVlIChkYXRlKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDQpKSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9LRUVQLAorICAgICAgICBHU1RfVEFHX1RSQUNLX05VTUJFUiwgVEVTVF9UUkFDS19OVU1CRVIsIE5VTEwpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgNSkpIHsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX0tFRVAsCisgICAgICAgIEdTVF9UQUdfVFJBQ0tfQ09VTlQsIFRFU1RfVFJBQ0tfQ09VTlQsIE5VTEwpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgNikpIHsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX0tFRVAsCisgICAgICAgIEdTVF9UQUdfQUxCVU1fVk9MVU1FX05VTUJFUiwgVEVTVF9WT0xVTUVfTlVNQkVSLCBOVUxMKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDcpKSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9LRUVQLAorICAgICAgICBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9DT1VOVCwgVEVTVF9WT0xVTUVfQ09VTlQsIE5VTEwpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgOCkpIHsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX0tFRVAsCisgICAgICAgIEdTVF9UQUdfVFJBQ0tfR0FJTiwgVEVTVF9UUkFDS19HQUlOLCBOVUxMKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDkpKSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9LRUVQLAorICAgICAgICBHU1RfVEFHX0FMQlVNX0dBSU4sIFRFU1RfQUxCVU1fR0FJTiwgTlVMTCk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAxMCkpIHsKKyAgICBnc3RfdGFnX2xpc3RfYWRkICh0YWdzLCBHU1RfVEFHX01FUkdFX0tFRVAsCisgICAgICAgIEdTVF9UQUdfVFJBQ0tfUEVBSywgVEVTVF9UUkFDS19QRUFLLCBOVUxMKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDExKSkgeworICAgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ3MsIEdTVF9UQUdfTUVSR0VfS0VFUCwKKyAgICAgICAgR1NUX1RBR19BTEJVTV9QRUFLLCBURVNUX0FMQlVNX1BFQUssIE5VTEwpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMTIpKSB7CisgICAgZ3N0X3RhZ19saXN0X2FkZCAodGFncywgR1NUX1RBR19NRVJHRV9LRUVQLAorICAgICAgICBHU1RfVEFHX0JFQVRTX1BFUl9NSU5VVEUsIFRFU1RfQlBNLCBOVUxMKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDEzKSkgeworICB9CisgIHJldHVybiB0YWdzOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3V0Zjhfc3RyaW5nX2luX2J1ZiAoR3N0QnVmZmVyICogYnVmLCBjb25zdCBnY2hhciAqIHMpCit7CisgIGdpbnQgaSwgbGVuOworICBHc3RNYXBJbmZvIG1hcDsKKworICBsZW4gPSBzdHJsZW4gKHMpOworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBmb3IgKGkgPSAwOyBpIDwgKG1hcC5zaXplIC0gbGVuKTsgKytpKSB7CisgICAgaWYgKG1lbWNtcCAobWFwLmRhdGEgKyBpLCBzLCBsZW4pID09IDApIHsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3RhZ2xpYl9pZDNtdXhfY2hlY2tfdGFnX2J1ZmZlciAoR3N0QnVmZmVyICogYnVmLCBndWludDMyIG1hc2spCit7CisgIC8qIG1ha2Ugc3VyZSBvdXIgVVRGLTggc3RyaW5nIGhhc24ndCBiZWVuIHB1dCBpbnRvIHRoZSB0YWcgYXMgSVNPLTg4NTktMSAqLworICBpZiAobWFzayAmICgxIDw8IDApKSB7CisgICAgZmFpbF91bmxlc3MgKHV0Zjhfc3RyaW5nX2luX2J1ZiAoYnVmLCBURVNUX0FSVElTVCkpOworICB9CisgIC8qIG1ha2Ugc3VyZSBvdXIgVVRGLTggc3RyaW5nIGhhc24ndCBiZWVuIHB1dCBpbnRvIHRoZSB0YWcgYXMgSVNPLTg4NTktMSAqLworICBpZiAobWFzayAmICgxIDw8IDEpKSB7CisgICAgZmFpbF91bmxlc3MgKHV0Zjhfc3RyaW5nX2luX2J1ZiAoYnVmLCBURVNUX1RJVExFKSk7CisgIH0KKyAgLyogbWFrZSBzdXJlIG91ciBVVEYtOCBzdHJpbmcgaGFzbid0IGJlZW4gcHV0IGludG8gdGhlIHRhZyBhcyBJU08tODg1OS0xICovCisgIGlmIChtYXNrICYgKDEgPDwgMikpIHsKKyAgICBmYWlsX3VubGVzcyAodXRmOF9zdHJpbmdfaW5fYnVmIChidWYsIFRFU1RfQUxCVU0pKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF90YWdsaWJfaWQzbXV4X2NoZWNrX3RhZ3MgKEdzdFRhZ0xpc3QgKiB0YWdzLCBndWludDMyIG1hc2spCit7CisgIGlmIChtYXNrICYgKDEgPDwgMCkpIHsKKyAgICBnY2hhciAqcyA9IE5VTEw7CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ3MsIEdTVF9UQUdfQVJUSVNULCAmcykpOworICAgIGZhaWxfdW5sZXNzIChnX3N0cl9lcXVhbCAocywgVEVTVF9BUlRJU1QpKTsKKyAgICBnX2ZyZWUgKHMpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMSkpIHsKKyAgICBnY2hhciAqcyA9IE5VTEw7CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ3MsIEdTVF9UQUdfVElUTEUsICZzKSk7CisgICAgZmFpbF91bmxlc3MgKGdfc3RyX2VxdWFsIChzLCBURVNUX1RJVExFKSk7CisgICAgZ19mcmVlIChzKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDIpKSB7CisgICAgZ2NoYXIgKnMgPSBOVUxMOworCisgICAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nICh0YWdzLCBHU1RfVEFHX0FMQlVNLCAmcykpOworICAgIGZhaWxfdW5sZXNzIChnX3N0cl9lcXVhbCAocywgVEVTVF9BTEJVTSkpOworICAgIGdfZnJlZSAocyk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCAzKSkgeworICAgIEdEYXRlICpzaG91bGRiZSwgKmRhdGUgPSBOVUxMOworCisgICAgc2hvdWxkYmUgPSBURVNUX0RBVEU7CisgICAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfZGF0ZSAodGFncywgR1NUX1RBR19EQVRFLCAmZGF0ZSkpOworICAgIGZhaWxfdW5sZXNzIChnX2RhdGVfY29tcGFyZSAoc2hvdWxkYmUsIGRhdGUpID09IDApOworICAgIGdfZGF0ZV9mcmVlIChzaG91bGRiZSk7CisgICAgZ19kYXRlX2ZyZWUgKGRhdGUpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgNCkpIHsKKyAgICBndWludCBudW07CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF91aW50ICh0YWdzLCBHU1RfVEFHX1RSQUNLX05VTUJFUiwgJm51bSkpOworICAgIGZhaWxfdW5sZXNzIChudW0gPT0gVEVTVF9UUkFDS19OVU1CRVIpOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgNSkpIHsKKyAgICBndWludCBjb3VudDsKKworICAgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X3VpbnQgKHRhZ3MsIEdTVF9UQUdfVFJBQ0tfQ09VTlQsICZjb3VudCkpOworICAgIGZhaWxfdW5sZXNzIChjb3VudCA9PSBURVNUX1RSQUNLX0NPVU5UKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDYpKSB7CisgICAgZ3VpbnQgbnVtOworCisgICAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfdWludCAodGFncywgR1NUX1RBR19BTEJVTV9WT0xVTUVfTlVNQkVSLAorICAgICAgICAgICAgJm51bSkpOworICAgIGZhaWxfdW5sZXNzIChudW0gPT0gVEVTVF9WT0xVTUVfTlVNQkVSKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDcpKSB7CisgICAgZ3VpbnQgY291bnQ7CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF91aW50ICh0YWdzLCBHU1RfVEFHX0FMQlVNX1ZPTFVNRV9DT1VOVCwKKyAgICAgICAgICAgICZjb3VudCkpOworICAgIGZhaWxfdW5sZXNzIChjb3VudCA9PSBURVNUX1ZPTFVNRV9DT1VOVCk7CisgIH0KKyAgaWYgKG1hc2sgJiAoMSA8PCA4KSkgeworICAgIGdkb3VibGUgZ2FpbjsKKworICAgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAodGFncywgR1NUX1RBR19UUkFDS19HQUlOLCAmZ2FpbikpOworICAgIGZhaWxfdW5sZXNzX3NvcnRhX2VxdWFsc19mbG9hdCAoZ2FpbiwgVEVTVF9UUkFDS19HQUlOKTsKKyAgfQorICBpZiAobWFzayAmICgxIDw8IDkpKSB7CisgICAgZ2RvdWJsZSBnYWluOworCisgICAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdzLCBHU1RfVEFHX0FMQlVNX0dBSU4sICZnYWluKSk7CisgICAgZmFpbF91bmxlc3Nfc29ydGFfZXF1YWxzX2Zsb2F0IChnYWluLCBURVNUX0FMQlVNX0dBSU4pOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMTApKSB7CisgICAgZ2RvdWJsZSBwZWFrOworCisgICAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdzLCBHU1RfVEFHX1RSQUNLX1BFQUssICZwZWFrKSk7CisgICAgZmFpbF91bmxlc3Nfc29ydGFfZXF1YWxzX2Zsb2F0IChwZWFrLCBURVNUX1RSQUNLX1BFQUspOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMTEpKSB7CisgICAgZ2RvdWJsZSBwZWFrOworCisgICAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdzLCBHU1RfVEFHX0FMQlVNX1BFQUssICZwZWFrKSk7CisgICAgZmFpbF91bmxlc3Nfc29ydGFfZXF1YWxzX2Zsb2F0IChwZWFrLCBURVNUX0FMQlVNX1BFQUspOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMTIpKSB7CisgICAgZ2RvdWJsZSBicG07CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ3MsIEdTVF9UQUdfQkVBVFNfUEVSX01JTlVURSwKKyAgICAgICAgICAgICZicG0pKTsKKyAgICBmYWlsX3VubGVzc19zb3J0YV9lcXVhbHNfZmxvYXQgKGJwbSwgVEVTVF9CUE0pOworICB9CisgIGlmIChtYXNrICYgKDEgPDwgMTMpKSB7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2ZpbGxfbXAzX2J1ZmZlciAoR3N0RWxlbWVudCAqIGZha2VzcmMsIEdzdEJ1ZmZlciAqIGJ1ZiwgR3N0UGFkICogcGFkLAorICAgIGd1aW50NjQgKiBwX29mZnNldCkKK3sKKyAgZ3NpemUgc2l6ZTsKKworICBzaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKTsKKworICBmYWlsX3VubGVzcyAoc2l6ZSA9PSBNUDNfRlJBTUVfU0laRSk7CisKKyAgR1NUX0xPRyAoImZpbGxpbmcgYnVmZmVyIHdpdGggZmFrZSBtcDMgZGF0YSwgb2Zmc2V0ID0gJSIgR19HVUlOVDY0X0ZPUk1BVCwKKyAgICAgICpwX29mZnNldCk7CisKKyAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsIG1wM19kdW1teWhkciwgc2l6ZW9mIChtcDNfZHVtbXloZHIpKTsKKworI2lmIDAKKyAgLyogY2FuJ3QgdXNlIGdzdF9idWZmZXJfc2V0X2NhcHMoKSBoZXJlIGJlY2F1c2UgdGhlIG1ldGFkYXRhIGlzbid0IHdyaXRhYmxlCisgICAqIGJlY2F1c2Ugb2YgdGhlIGV4dHJhIHJlZmNvdW50cyB0YWtlbiBieSB0aGUgc2lnbmFsIGVtaXNzaW9uIG1lY2hhbmlzbTsKKyAgICogd2Uga25vdyBpdCdzIGZpbmUgdG8gdXNlIEdTVF9CVUZGRVJfQ0FQUygpIGhlcmUgdGhvdWdoICovCisgIEdTVF9CVUZGRVJfQ0FQUyAoYnVmKSA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby9tcGVnIiwgIm1wZWd2ZXJzaW9uIiwKKyAgICAgIEdfVFlQRV9JTlQsIDEsICJsYXllciIsIEdfVFlQRV9JTlQsIDMsIE5VTEwpOworI2VuZGlmCisKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPSAqcF9vZmZzZXQ7CisgICpwX29mZnNldCArPSBzaXplOworfQorCitzdGF0aWMgdm9pZAorZ290X2J1ZmZlciAoR3N0RWxlbWVudCAqIGZha2VzaW5rLCBHc3RCdWZmZXIgKiBidWYsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RCdWZmZXIgKiogcF9idWYpCit7CisgIGdpbnQ2NCBvZmY7CisgIEdzdE1hcEluZm8gbWFwOworCisgIG9mZiA9IEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgR1NUX0xPRyAoInNpemU9JSIgR19HU0laRV9GT1JNQVQgIiwgb2Zmc2V0PSUiIEdfR0lOVDY0X0ZPUk1BVCwgbWFwLnNpemUsIG9mZik7CisKKyAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfT0ZGU0VUX0lTX1ZBTElEIChidWYpKTsKKworICBpZiAoKnBfYnVmID09IE5VTEwgfHwgKG9mZiArIG1hcC5zaXplKSA+IGdzdF9idWZmZXJfZ2V0X3NpemUgKCpwX2J1ZikpIHsKKyAgICBHc3RCdWZmZXIgKm5ld2J1ZjsKKworICAgIC8qIG5vdCB2ZXJ5IGVsZWdhbnQsIGJ1dCB3aG8gY2FyZXMgKi8KKyAgICBuZXdidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG9mZiArIG1hcC5zaXplKTsKKyAgICBpZiAoKnBfYnVmKSB7CisgICAgICBHc3RNYXBJbmZvIHBtYXA7CisKKyAgICAgIGdzdF9idWZmZXJfbWFwICgqcF9idWYsICZwbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgZ3N0X2J1ZmZlcl9maWxsIChuZXdidWYsIDAsIHBtYXAuZGF0YSwgcG1hcC5zaXplKTsKKyAgICAgIGdzdF9idWZmZXJfdW5tYXAgKCpwX2J1ZiwgJnBtYXApOworICAgIH0KKyAgICBnc3RfYnVmZmVyX2ZpbGwgKG5ld2J1Ziwgb2ZmLCBtYXAuZGF0YSwgbWFwLnNpemUpOworCisgICAgaWYgKCpwX2J1ZikKKyAgICAgIGdzdF9idWZmZXJfdW5yZWYgKCpwX2J1Zik7CisgICAgKnBfYnVmID0gbmV3YnVmOworICB9IGVsc2UgeworICAgIGdzdF9idWZmZXJfZmlsbCAoKnBfYnVmLCBvZmYsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfdGFnbGliX2lkM211eF9jaGVja19vdXRwdXRfYnVmZmVyIChHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludCBvZmY7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZ19hc3NlcnQgKG1hcC5zaXplICUgTVAzX0ZSQU1FX1NJWkUgPT0gMCk7CisKKyAgZm9yIChvZmYgPSAwOyBvZmYgPCBtYXAuc2l6ZTsgb2ZmICs9IE1QM19GUkFNRV9TSVpFKSB7CisgICAgZmFpbF91bmxlc3MgKG1lbWNtcCAobWFwLmRhdGEgKyBvZmYsIG1wM19kdW1teWhkciwKKyAgICAgICAgICAgIHNpemVvZiAobXAzX2R1bW15aGRyKSkgPT0gMCk7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKK30KKworc3RhdGljIHZvaWQKK2lkZW50aXR5X2NiIChHc3RFbGVtZW50ICogaWRlbnRpdHksIEdzdEJ1ZmZlciAqIGJ1ZiwgR3N0QnVmZmVyICoqIHBfdGFnYnVmKQoreworICBpZiAoKnBfdGFnYnVmID09IE5VTEwpIHsKKyAgICAqcF90YWdidWYgPSBnc3RfYnVmZmVyX3JlZiAoYnVmKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF90YWdsaWJfaWQzbXV4X3dpdGhfdGFncyAoR3N0VGFnTGlzdCAqIHRhZ3MsIGd1aW50MzIgbWFzaykKK3sKKyAgR3N0TWVzc2FnZSAqbXNnOworICBHc3RUYWdMaXN0ICp0YWdzX3JlYWQgPSBOVUxMOworICBHc3RFbGVtZW50ICpwaXBlbGluZSwgKmlkM211eCwgKmlkM2RlbXV4LCAqZmFrZXNyYywgKmlkZW50aXR5LCAqZmFrZXNpbms7CisgIEdzdEJ1cyAqYnVzOworICBndWludDY0IG9mZnNldDsKKyAgR3N0QnVmZmVyICpvdXRidWYgPSBOVUxMOworICBHc3RCdWZmZXIgKnRhZ2J1ZiA9IE5VTEw7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHN0YXRlX3Jlc3VsdDsKKworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBnX2Fzc2VydCAocGlwZWxpbmUgIT0gTlVMTCk7CisKKyAgZmFrZXNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzcmMiLCAiZmFrZXNyYyIpOworICBnX2Fzc2VydCAoZmFrZXNyYyAhPSBOVUxMKTsKKworICBpZDNtdXggPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJpZDN2Mm11eCIsICJpZDN2Mm11eCIpOworICBnX2Fzc2VydCAoaWQzbXV4ICE9IE5VTEwpOworCisgIGlkZW50aXR5ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaWRlbnRpdHkiLCAiaWRlbnRpdHkiKTsKKyAgZ19hc3NlcnQgKGlkZW50aXR5ICE9IE5VTEwpOworCisgIGlkM2RlbXV4ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaWQzZGVtdXgiLCAiaWQzZGVtdXgiKTsKKyAgZ19hc3NlcnQgKGlkM2RlbXV4ICE9IE5VTEwpOworCisgIGZha2VzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAiZmFrZXNpbmsiKTsKKyAgZ19hc3NlcnQgKGZha2VzaW5rICE9IE5VTEwpOworCisgIC8qIHNldCB1cCBzaW5rICovCisgIG91dGJ1ZiA9IE5VTEw7CisgIGdfb2JqZWN0X3NldCAoZmFrZXNpbmssICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoZmFrZXNpbmssICJoYW5kb2ZmIiwgR19DQUxMQkFDSyAoZ290X2J1ZmZlciksICZvdXRidWYpOworCisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIGZha2VzcmMpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBpZDNtdXgpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBpZGVudGl0eSk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIGlkM2RlbXV4KTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgZmFrZXNpbmspOworCisgIGdzdF90YWdfc2V0dGVyX21lcmdlX3RhZ3MgKEdTVF9UQUdfU0VUVEVSIChpZDNtdXgpLCB0YWdzLAorICAgICAgR1NUX1RBR19NRVJHRV9BUFBFTkQpOworCisgIGdzdF9lbGVtZW50X2xpbmtfbWFueSAoZmFrZXNyYywgaWQzbXV4LCBpZGVudGl0eSwgaWQzZGVtdXgsIGZha2VzaW5rLCBOVUxMKTsKKworICAvKiBzZXQgdXAgc291cmNlICovCisgIGdfb2JqZWN0X3NldCAoZmFrZXNyYywgInNpZ25hbC1oYW5kb2ZmcyIsIFRSVUUsICJjYW4tYWN0aXZhdGUtcHVsbCIsIEZBTFNFLAorICAgICAgImZpbGx0eXBlIiwgMiwgInNpemV0eXBlIiwgMiwgInNpemVtYXgiLCBNUDNfRlJBTUVfU0laRSwKKyAgICAgICJudW0tYnVmZmVycyIsIDE2LCBOVUxMKTsKKworICBvZmZzZXQgPSAwOworICBnX3NpZ25hbF9jb25uZWN0IChmYWtlc3JjLCAiaGFuZG9mZiIsIEdfQ0FMTEJBQ0sgKGZpbGxfbXAzX2J1ZmZlciksICZvZmZzZXQpOworCisgIC8qIHNldCB1cCBpZGVudGl0eSB0byBjYXRjaCB0YWcgYnVmZmVyICovCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGlkZW50aXR5LCAiaGFuZG9mZiIsIEdfQ0FMTEJBQ0sgKGlkZW50aXR5X2NiKSwgJnRhZ2J1Zik7CisKKyAgR1NUX0xPRyAoInNldHRpbmcgYW5kIGdldHRpbmcgc3RhdGUgLi4uIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgc3RhdGVfcmVzdWx0ID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChwaXBlbGluZSwgTlVMTCwgTlVMTCwgLTEpOworICBmYWlsX3VubGVzcyAoc3RhdGVfcmVzdWx0ID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJVbmV4cGVjdGVkIHJlc3VsdCBmcm9tIGdldF9zdGF0ZSgpLiBFeHBlY3RlZCBzdWNjZXNzLCBnb3QgJWQiLAorICAgICAgc3RhdGVfcmVzdWx0KTsKKworICBidXMgPSBnc3RfcGlwZWxpbmVfZ2V0X2J1cyAoR1NUX1BJUEVMSU5FIChwaXBlbGluZSkpOworCisgIEdTVF9MT0cgKCJXYWl0aW5nIGZvciB0YWcgLi4uIik7CisgIG1zZyA9CisgICAgICBnc3RfYnVzX3BvbGwgKGJ1cywgR1NUX01FU1NBR0VfVEFHIHwgR1NUX01FU1NBR0VfRU9TIHwgR1NUX01FU1NBR0VfRVJST1IsCisgICAgICAtMSk7CisgIGlmIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VSUk9SKSB7CisgICAgR0Vycm9yICplcnI7CisgICAgZ2NoYXIgKmRiZzsKKworICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtc2csICZlcnIsICZkYmcpOworICAgIGdfcHJpbnRlcnIgKCJFUlJPUiBmcm9tIGVsZW1lbnQgJXM6ICVzXG4lc1xuIiwKKyAgICAgICAgR1NUX09CSkVDVF9OQU1FIChtc2ctPnNyYyksIGVyci0+bWVzc2FnZSwgR1NUX1NUUl9OVUxMIChkYmcpKTsKKyAgICBnX2Vycm9yX2ZyZWUgKGVycik7CisgICAgZ19mcmVlIChkYmcpOworICB9IGVsc2UgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRU9TKSB7CisgICAgZ19wcmludGVyciAoIkVPUyBtZXNzYWdlLCBidXQgd2VyZSB3YWl0aW5nIGZvciBUQUdTIVxuIik7CisgIH0KKyAgZmFpbF91bmxlc3MgKG1zZy0+dHlwZSA9PSBHU1RfTUVTU0FHRV9UQUcpOworCisgIGdzdF9tZXNzYWdlX3BhcnNlX3RhZyAobXNnLCAmdGFnc19yZWFkKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisKKyAgR1NUX0xPRyAoIkdvdCB0YWdzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgdGFnc19yZWFkKTsKKyAgdGVzdF90YWdsaWJfaWQzbXV4X2NoZWNrX3RhZ3MgKHRhZ3NfcmVhZCwgbWFzayk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnc19yZWFkKTsKKworICBmYWlsX3VubGVzcyAodGFnYnVmICE9IE5VTEwpOworICB0ZXN0X3RhZ2xpYl9pZDNtdXhfY2hlY2tfdGFnX2J1ZmZlciAodGFnYnVmLCBtYXNrKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAodGFnYnVmKTsKKworICBHU1RfTE9HICgiV2FpdGluZyBmb3IgRU9TIC4uLiIpOworICBtc2cgPSBnc3RfYnVzX3BvbGwgKGJ1cywgR1NUX01FU1NBR0VfRU9TIHwgR1NUX01FU1NBR0VfRVJST1IsIC0xKTsKKyAgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRVJST1IpIHsKKyAgICBHRXJyb3IgKmVycjsKKyAgICBnY2hhciAqZGJnOworCisgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1zZywgJmVyciwgJmRiZyk7CisgICAgZ19wcmludGVyciAoIkVSUk9SIGZyb20gZWxlbWVudCAlczogJXNcbiVzXG4iLAorICAgICAgICBHU1RfT0JKRUNUX05BTUUgKG1zZy0+c3JjKSwgZXJyLT5tZXNzYWdlLCBHU1RfU1RSX05VTEwgKGRiZykpOworICAgIGdfZXJyb3JfZnJlZSAoZXJyKTsKKyAgICBnX2ZyZWUgKGRiZyk7CisgIH0KKyAgZmFpbF91bmxlc3MgKG1zZy0+dHlwZSA9PSBHU1RfTUVTU0FHRV9FT1MpOworICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIEdTVF9MT0cgKCJHb3QgRU9TLCBzaHV0dGluZyBkb3duIC4uLiIpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKworICB0ZXN0X3RhZ2xpYl9pZDNtdXhfY2hlY2tfb3V0cHV0X2J1ZmZlciAob3V0YnVmKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmKTsKKworICBHU1RfTE9HICgiRG9uZSIpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9pZDN2Mm11eCkKK3sKKyAgR3N0VGFnTGlzdCAqdGFnczsKKyAgZ2ludCBpOworCisgIGdfcmFuZG9tX3NldF9zZWVkICgyNDcxNjYyOTUpOworCisgIC8qIGludGVybmFsIGNvbnNpc3RlbmN5IGNoZWNrICovCisgIHRhZ3MgPSB0ZXN0X3RhZ2xpYl9pZDNtdXhfY3JlYXRlX3RhZ3MgKDB4RkZGRkZGRkYpOworICB0ZXN0X3RhZ2xpYl9pZDNtdXhfY2hlY2tfdGFncyAodGFncywgMHhGRkZGRkZGRik7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFncyk7CisKKyAgLyogbm93IHRoZSByZWFsIHRlc3RzICovCisgIGZvciAoaSA9IDA7IGkgPCA1MDsgKytpKSB7CisgICAgZ3VpbnQzMiBtYXNrOworCisgICAgbWFzayA9IGdfcmFuZG9tX2ludCAoKTsKKyAgICBHU1RfTE9HICgidGFnIG1hc2sgPSAlMDh4IChpPSVkKSIsIG1hc2ssIGkpOworCisgICAgaWYgKG1hc2sgPT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLyogY3JlYXRlIHRhZ3MgKi8KKyAgICB0YWdzID0gdGVzdF90YWdsaWJfaWQzbXV4X2NyZWF0ZV90YWdzIChtYXNrKTsKKyAgICBHU1RfTE9HICgidGFncyBmb3IgbWFzayAlMDh4ID0gJSIgR1NUX1BUUl9GT1JNQVQsIG1hc2ssIHRhZ3MpOworCisgICAgLyogZG91YmxlLWNoZWNrIGZvciBpbnRlcm5hbCBjb25zaXN0ZW5jeSAqLworICAgIHRlc3RfdGFnbGliX2lkM211eF9jaGVja190YWdzICh0YWdzLCBtYXNrKTsKKworICAgIC8qIHRlc3Qgd2l0aCBwaXBlbGluZSAqLworICAgIHRlc3RfdGFnbGliX2lkM211eF93aXRoX3RhZ3MgKHRhZ3MsIG1hc2spOworCisgICAgLyogZnJlZSB0YWdzICovCisgICAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdzKTsKKyAgfQorfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitpZDN2Mm11eF9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJpZDN2Mm11eCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9pZDN2Mm11eCk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChpZDN2Mm11eCk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9pbWFnZWZyZWV6ZS5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvaW1hZ2VmcmVlemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmVmZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvaW1hZ2VmcmVlemUuYwpAQCAtMCwwICsxLDU4NiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKK3N0YXRpYyBnYm9vbGVhbgorYnVzX2hhbmRsZXIgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIGdwb2ludGVyIGRhdGEpCit7CisgIEdNYWluTG9vcCAqbG9vcCA9IChHTWFpbkxvb3AgKikgZGF0YTsKKworICBzd2l0Y2ggKG1lc3NhZ2UtPnR5cGUpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VPUzoKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9XQVJOSU5HOgorICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6eworICAgICAgR0Vycm9yICpnZXJyb3I7CisgICAgICBnY2hhciAqZGVidWc7CisKKyAgICAgIGlmIChtZXNzYWdlLT50eXBlID09IEdTVF9NRVNTQUdFX1dBUk5JTkcpCisgICAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX3dhcm5pbmcgKG1lc3NhZ2UsICZnZXJyb3IsICZkZWJ1Zyk7CisgICAgICBlbHNlCisgICAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtZXNzYWdlLCAmZ2Vycm9yLCAmZGVidWcpOworICAgICAgZ19lcnJvciAoImVycm9yIGZyb20gJXM6ICVzICglcylcbiIsCisgICAgICAgICAgR1NUX0VMRU1FTlRfTkFNRSAoR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSksIGdlcnJvci0+bWVzc2FnZSwKKyAgICAgICAgICBHU1RfU1RSX05VTEwgKGRlYnVnKSk7CisgICAgICBnX2Vycm9yX2ZyZWUgKGdlcnJvcik7CisgICAgICBnX2ZyZWUgKGRlYnVnKTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9pbWFnZWZyZWV6ZSAoY29uc3QgR3N0Q2FwcyAqIGNhcHMxLCBjb25zdCBHc3RDYXBzICogY2FwczIsCisgICAgR0NhbGxiYWNrIHNpbmtfaGFuZG9mZiwgZ3BvaW50ZXIgc2lua19oYW5kb2ZmX2RhdGEpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RFbGVtZW50ICp2aWRlb3Rlc3RzcmMsICpjYXBzZmlsdGVyMSwgKmltYWdlZnJlZXplLCAqY2Fwc2ZpbHRlcjIsICpmYWtlc2luazsKKworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBmYWlsX3VubGVzcyAocGlwZWxpbmUgIT0gTlVMTCk7CisKKyAgdmlkZW90ZXN0c3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgInNyYyIpOworICBmYWlsX3VubGVzcyAodmlkZW90ZXN0c3JjICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKHZpZGVvdGVzdHNyYywgIm51bS1idWZmZXJzIiwgMSwgTlVMTCk7CisKKyAgY2Fwc2ZpbHRlcjEgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJjYXBzZmlsdGVyIiwgImZpbHRlcjEiKTsKKyAgZmFpbF91bmxlc3MgKGNhcHNmaWx0ZXIxICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKGNhcHNmaWx0ZXIxLCAiY2FwcyIsIGNhcHMxLCBOVUxMKTsKKworICBpbWFnZWZyZWV6ZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImltYWdlZnJlZXplIiwgImZyZWV6ZSIpOworICBmYWlsX3VubGVzcyAoaW1hZ2VmcmVlemUgIT0gTlVMTCk7CisKKyAgY2Fwc2ZpbHRlcjIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJjYXBzZmlsdGVyIiwgImZpbHRlcjIiKTsKKyAgZmFpbF91bmxlc3MgKGNhcHNmaWx0ZXIyICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKGNhcHNmaWx0ZXIyLCAiY2FwcyIsIGNhcHMyLCBOVUxMKTsKKworICBmYWtlc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgInNpbmsiKTsKKyAgZmFpbF91bmxlc3MgKGZha2VzaW5rICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKGZha2VzaW5rLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgImFzeW5jIiwgRkFMU0UsIE5VTEwpOworCisgIGlmIChzaW5rX2hhbmRvZmYpCisgICAgZ19zaWduYWxfY29ubmVjdCAoZmFrZXNpbmssICJoYW5kb2ZmIiwgc2lua19oYW5kb2ZmLCBzaW5rX2hhbmRvZmZfZGF0YSk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCB2aWRlb3Rlc3RzcmMsIGNhcHNmaWx0ZXIxLCBpbWFnZWZyZWV6ZSwKKyAgICAgIGNhcHNmaWx0ZXIyLCBmYWtlc2luaywgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmtfcGFkcyAodmlkZW90ZXN0c3JjLCAic3JjIiwgY2Fwc2ZpbHRlcjEsCisgICAgICAgICAgInNpbmsiKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rX3BhZHMgKGNhcHNmaWx0ZXIxLCAic3JjIiwgaW1hZ2VmcmVlemUsICJzaW5rIikpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGlua19wYWRzIChpbWFnZWZyZWV6ZSwgInNyYyIsIGNhcHNmaWx0ZXIyLCAic2luayIpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmtfcGFkcyAoY2Fwc2ZpbHRlcjIsICJzcmMiLCBmYWtlc2luaywgInNpbmsiKSk7CisKKyAgcmV0dXJuIHBpcGVsaW5lOworfQorCitzdGF0aWMgdm9pZAorc2lua19oYW5kb2ZmX2NiXzBfMSAoR3N0RWxlbWVudCAqIG9iamVjdCwgR3N0QnVmZmVyICogYnVmZmVyLCBHc3RQYWQgKiBwYWQsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBndWludCAqbl9idWZmZXJzID0gKGd1aW50ICopIHVzZXJfZGF0YTsKKworICBpZiAoKm5fYnVmZmVycyA9PSBHX01BWFVJTlQpCisgICAgcmV0dXJuOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpLCAwKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpLCAwKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWZmZXIpLCAxKTsKKworICAqbl9idWZmZXJzID0gKm5fYnVmZmVycyArIDE7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ltYWdlZnJlZXplXzBfMSkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdENhcHMgKmNhcHMxLCAqY2FwczI7CisgIEdzdEJ1cyAqYnVzOworICBHTWFpbkxvb3AgKmxvb3A7CisgIGd1aW50IG5fYnVmZmVycyA9IEdfTUFYVUlOVDsKKyAgZ3VpbnQgYnVzX3dhdGNoID0gMDsKKyAgR3N0VmlkZW9JbmZvIGkxLCBpMjsKKworICBnc3RfdmlkZW9faW5mb19pbml0ICgmaTEpOworICBnc3RfdmlkZW9faW5mb19zZXRfZm9ybWF0ICgmaTEsIEdTVF9WSURFT19GT1JNQVRfeFJHQiwgNjQwLCA0ODApOworICBpMS5mcHNfbiA9IDI1OworICBpMS5mcHNfZCA9IDE7CisgIGNhcHMxID0gZ3N0X3ZpZGVvX2luZm9fdG9fY2FwcyAoJmkxKTsKKworICBnc3RfdmlkZW9faW5mb19pbml0ICgmaTIpOworICBnc3RfdmlkZW9faW5mb19zZXRfZm9ybWF0ICgmaTIsIEdTVF9WSURFT19GT1JNQVRfeFJHQiwgNjQwLCA0ODApOworICBjYXBzMiA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZpMik7CisKKyAgcGlwZWxpbmUgPQorICAgICAgc2V0dXBfaW1hZ2VmcmVlemUgKGNhcHMxLCBjYXBzMiwgR19DQUxMQkFDSyAoc2lua19oYW5kb2ZmX2NiXzBfMSksCisgICAgICAmbl9idWZmZXJzKTsKKworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBUUlVFKTsKKyAgZmFpbF91bmxlc3MgKGxvb3AgIT0gTlVMTCk7CisKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAocGlwZWxpbmUpOworICBmYWlsX3VubGVzcyAoYnVzICE9IE5VTEwpOworICBidXNfd2F0Y2ggPSBnc3RfYnVzX2FkZF93YXRjaCAoYnVzLCBidXNfaGFuZGxlciwgbG9vcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgbl9idWZmZXJzID0gMDsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBnX21haW5fbG9vcF9ydW4gKGxvb3ApOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG5fYnVmZmVycywgMSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKyAgZ19tYWluX2xvb3BfdW5yZWYgKGxvb3ApOworICBnc3RfY2Fwc191bnJlZiAoY2FwczEpOworICBnc3RfY2Fwc191bnJlZiAoY2FwczIpOworICBnX3NvdXJjZV9yZW1vdmUgKGJ1c193YXRjaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIHZvaWQKK3NpbmtfaGFuZG9mZl9jYl8yNV8xXzBtc180MDBtcyAoR3N0RWxlbWVudCAqIG9iamVjdCwgR3N0QnVmZmVyICogYnVmZmVyLAorICAgIEdzdFBhZCAqIHBhZCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBndWludCAqbl9idWZmZXJzID0gKGd1aW50ICopIHVzZXJfZGF0YTsKKworICBpZiAoKm5fYnVmZmVycyA9PSBHX01BWFVJTlQpCisgICAgcmV0dXJuOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpLAorICAgICAgKm5fYnVmZmVycyAqIDQwICogR1NUX01TRUNPTkQpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpLCA0MCAqIEdTVF9NU0VDT05EKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZmZlciksICpuX2J1ZmZlcnMpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZmZlciksICpuX2J1ZmZlcnMgKyAxKTsKKworICAqbl9idWZmZXJzID0gKm5fYnVmZmVycyArIDE7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ltYWdlZnJlZXplXzI1XzFfMG1zXzQwMG1zKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0Q2FwcyAqY2FwczEsICpjYXBzMjsKKyAgR3N0QnVzICpidXM7CisgIEdNYWluTG9vcCAqbG9vcDsKKyAgZ3VpbnQgbl9idWZmZXJzID0gR19NQVhVSU5UOworICBndWludCBidXNfd2F0Y2ggPSAwOworICBHc3RWaWRlb0luZm8gaTEsIGkyOworCisgIGdzdF92aWRlb19pbmZvX2luaXQgKCZpMSk7CisgIGdzdF92aWRlb19pbmZvX3NldF9mb3JtYXQgKCZpMSwgR1NUX1ZJREVPX0ZPUk1BVF94UkdCLCA2NDAsIDQ4MCk7CisgIGkxLmZwc19uID0gMjU7CisgIGkxLmZwc19kID0gMTsKKyAgY2FwczEgPSBnc3RfdmlkZW9faW5mb190b19jYXBzICgmaTEpOworCisgIGdzdF92aWRlb19pbmZvX2luaXQgKCZpMik7CisgIGdzdF92aWRlb19pbmZvX3NldF9mb3JtYXQgKCZpMiwgR1NUX1ZJREVPX0ZPUk1BVF94UkdCLCA2NDAsIDQ4MCk7CisgIGkyLmZwc19uID0gMjU7CisgIGkyLmZwc19kID0gMTsKKyAgY2FwczIgPSBnc3RfdmlkZW9faW5mb190b19jYXBzICgmaTIpOworCisgIHBpcGVsaW5lID0KKyAgICAgIHNldHVwX2ltYWdlZnJlZXplIChjYXBzMSwgY2FwczIsCisgICAgICBHX0NBTExCQUNLIChzaW5rX2hhbmRvZmZfY2JfMjVfMV8wbXNfNDAwbXMpLCAmbl9idWZmZXJzKTsKKworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBUUlVFKTsKKyAgZmFpbF91bmxlc3MgKGxvb3AgIT0gTlVMTCk7CisKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAocGlwZWxpbmUpOworICBmYWlsX3VubGVzcyAoYnVzICE9IE5VTEwpOworICBidXNfd2F0Y2ggPSBnc3RfYnVzX2FkZF93YXRjaCAoYnVzLCBidXNfaGFuZGxlciwgbG9vcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BBVVNFRCksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZWVrIChwaXBlbGluZSwgMS4wLCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgICAgR1NUX1NFRUtfRkxBR19GTFVTSCwgR1NUX1NFRUtfVFlQRV9TRVQsIDAsIEdTVF9TRUVLX1RZUEVfU0VULAorICAgICAgICAgIDQwMCAqIEdTVF9NU0VDT05EKSk7CisKKyAgbl9idWZmZXJzID0gMDsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobl9idWZmZXJzLCAxMCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKyAgZ19tYWluX2xvb3BfdW5yZWYgKGxvb3ApOworICBnc3RfY2Fwc191bnJlZiAoY2FwczEpOworICBnc3RfY2Fwc191bnJlZiAoY2FwczIpOworICBnX3NvdXJjZV9yZW1vdmUgKGJ1c193YXRjaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIHZvaWQKK3NpbmtfaGFuZG9mZl9jYl8yNV8xXzIwMG1zXzQwMG1zIChHc3RFbGVtZW50ICogb2JqZWN0LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgR3N0UGFkICogcGFkLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGd1aW50ICpuX2J1ZmZlcnMgPSAoZ3VpbnQgKikgdXNlcl9kYXRhOworCisgIGlmICgqbl9idWZmZXJzID09IEdfTUFYVUlOVCkKKyAgICByZXR1cm47CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlciksCisgICAgICAyMDAgKiBHU1RfTVNFQ09ORCArICpuX2J1ZmZlcnMgKiA0MCAqIEdTVF9NU0VDT05EKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSwgNDAgKiBHU1RfTVNFQ09ORCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpLCA1ICsgKm5fYnVmZmVycyk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfT0ZGU0VUX0VORCAoYnVmZmVyKSwKKyAgICAgIDUgKyAqbl9idWZmZXJzICsgMSk7CisKKyAgKm5fYnVmZmVycyA9ICpuX2J1ZmZlcnMgKyAxOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9pbWFnZWZyZWV6ZV8yNV8xXzIwMG1zXzQwMG1zKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0Q2FwcyAqY2FwczEsICpjYXBzMjsKKyAgR3N0QnVzICpidXM7CisgIEdNYWluTG9vcCAqbG9vcDsKKyAgZ3VpbnQgbl9idWZmZXJzID0gR19NQVhVSU5UOworICBndWludCBidXNfd2F0Y2ggPSAwOworICBHc3RWaWRlb0luZm8gaTEsIGkyOworCisgIGdzdF92aWRlb19pbmZvX2luaXQgKCZpMSk7CisgIGdzdF92aWRlb19pbmZvX3NldF9mb3JtYXQgKCZpMSwgR1NUX1ZJREVPX0ZPUk1BVF94UkdCLCA2NDAsIDQ4MCk7CisgIGkxLmZwc19uID0gMjU7CisgIGkxLmZwc19kID0gMTsKKyAgY2FwczEgPSBnc3RfdmlkZW9faW5mb190b19jYXBzICgmaTEpOworCisgIGdzdF92aWRlb19pbmZvX2luaXQgKCZpMik7CisgIGdzdF92aWRlb19pbmZvX3NldF9mb3JtYXQgKCZpMiwgR1NUX1ZJREVPX0ZPUk1BVF94UkdCLCA2NDAsIDQ4MCk7CisgIGkyLmZwc19uID0gMjU7CisgIGkyLmZwc19kID0gMTsKKyAgY2FwczIgPSBnc3RfdmlkZW9faW5mb190b19jYXBzICgmaTIpOworCisgIHBpcGVsaW5lID0KKyAgICAgIHNldHVwX2ltYWdlZnJlZXplIChjYXBzMSwgY2FwczIsCisgICAgICBHX0NBTExCQUNLIChzaW5rX2hhbmRvZmZfY2JfMjVfMV8yMDBtc180MDBtcyksICZuX2J1ZmZlcnMpOworCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIFRSVUUpOworICBmYWlsX3VubGVzcyAobG9vcCAhPSBOVUxMKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChwaXBlbGluZSk7CisgIGZhaWxfdW5sZXNzIChidXMgIT0gTlVMTCk7CisgIGJ1c193YXRjaCA9IGdzdF9idXNfYWRkX3dhdGNoIChidXMsIGJ1c19oYW5kbGVyLCBsb29wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUEFVU0VEKSwKKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NlZWsgKHBpcGVsaW5lLCAxLjAsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgICBHU1RfU0VFS19GTEFHX0ZMVVNILCBHU1RfU0VFS19UWVBFX1NFVCwgMjAwICogR1NUX01TRUNPTkQsCisgICAgICAgICAgR1NUX1NFRUtfVFlQRV9TRVQsIDQwMCAqIEdTVF9NU0VDT05EKSk7CisKKyAgbl9idWZmZXJzID0gMDsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobl9idWZmZXJzLCA1KTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzMSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzMik7CisgIGdfc291cmNlX3JlbW92ZSAoYnVzX3dhdGNoKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgdm9pZAorc2lua19oYW5kb2ZmX2NiXzI1XzFfNDAwbXNfMG1zIChHc3RFbGVtZW50ICogb2JqZWN0LCBHc3RCdWZmZXIgKiBidWZmZXIsCisgICAgR3N0UGFkICogcGFkLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGd1aW50ICpuX2J1ZmZlcnMgPSAoZ3VpbnQgKikgdXNlcl9kYXRhOworCisgIGlmICgqbl9idWZmZXJzID09IEdfTUFYVUlOVCkKKyAgICByZXR1cm47CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlciksCisgICAgICA0MDAgKiBHU1RfTVNFQ09ORCAtICgqbl9idWZmZXJzICsgMSkgKiA0MCAqIEdTVF9NU0VDT05EKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSwgNDAgKiBHU1RfTVNFQ09ORCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfT0ZGU0VUIChidWZmZXIpLCAxMCAtICgqbl9idWZmZXJzICsgMSkpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX09GRlNFVF9FTkQgKGJ1ZmZlciksCisgICAgICAxMCAtICgqbl9idWZmZXJzICsgMSkgKyAxKTsKKworICAqbl9idWZmZXJzID0gKm5fYnVmZmVycyArIDE7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ltYWdlZnJlZXplXzI1XzFfNDAwbXNfMG1zKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0Q2FwcyAqY2FwczEsICpjYXBzMjsKKyAgR3N0QnVzICpidXM7CisgIEdNYWluTG9vcCAqbG9vcDsKKyAgZ3VpbnQgbl9idWZmZXJzID0gR19NQVhVSU5UOworICBndWludCBidXNfd2F0Y2ggPSAwOworICBHc3RWaWRlb0luZm8gaTEsIGkyOworCisgIGdzdF92aWRlb19pbmZvX2luaXQgKCZpMSk7CisgIGdzdF92aWRlb19pbmZvX3NldF9mb3JtYXQgKCZpMSwgR1NUX1ZJREVPX0ZPUk1BVF94UkdCLCA2NDAsIDQ4MCk7CisgIGkxLmZwc19uID0gMjU7CisgIGkxLmZwc19kID0gMTsKKyAgY2FwczEgPSBnc3RfdmlkZW9faW5mb190b19jYXBzICgmaTEpOworCisgIGdzdF92aWRlb19pbmZvX2luaXQgKCZpMik7CisgIGdzdF92aWRlb19pbmZvX3NldF9mb3JtYXQgKCZpMiwgR1NUX1ZJREVPX0ZPUk1BVF94UkdCLCA2NDAsIDQ4MCk7CisgIGkyLmZwc19uID0gMjU7CisgIGkyLmZwc19kID0gMTsKKyAgY2FwczIgPSBnc3RfdmlkZW9faW5mb190b19jYXBzICgmaTIpOworCisgIHBpcGVsaW5lID0KKyAgICAgIHNldHVwX2ltYWdlZnJlZXplIChjYXBzMSwgY2FwczIsCisgICAgICBHX0NBTExCQUNLIChzaW5rX2hhbmRvZmZfY2JfMjVfMV80MDBtc18wbXMpLCAmbl9idWZmZXJzKTsKKworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBUUlVFKTsKKyAgZmFpbF91bmxlc3MgKGxvb3AgIT0gTlVMTCk7CisKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAocGlwZWxpbmUpOworICBmYWlsX3VubGVzcyAoYnVzICE9IE5VTEwpOworICBidXNfd2F0Y2ggPSBnc3RfYnVzX2FkZF93YXRjaCAoYnVzLCBidXNfaGFuZGxlciwgbG9vcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BBVVNFRCksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZWVrIChwaXBlbGluZSwgLTEuMCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgIEdTVF9TRUVLX0ZMQUdfRkxVU0gsIEdTVF9TRUVLX1RZUEVfU0VULCAwLCBHU1RfU0VFS19UWVBFX1NFVCwKKyAgICAgICAgICA0MDAgKiBHU1RfTVNFQ09ORCkpOworCisgIG5fYnVmZmVycyA9IDA7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBnX21haW5fbG9vcF9ydW4gKGxvb3ApOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG5fYnVmZmVycywgMTApOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisgIGdfbWFpbl9sb29wX3VucmVmIChsb29wKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMxKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMyKTsKKyAgZ19zb3VyY2VfcmVtb3ZlIChidXNfd2F0Y2gpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyB2b2lkCitzaW5rX2hhbmRvZmZfY2JfMjVfMV8yMjBtc18zODBtcyAoR3N0RWxlbWVudCAqIG9iamVjdCwgR3N0QnVmZmVyICogYnVmZmVyLAorICAgIEdzdFBhZCAqIHBhZCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBndWludCAqbl9idWZmZXJzID0gKGd1aW50ICopIHVzZXJfZGF0YTsKKworICBpZiAoKm5fYnVmZmVycyA9PSBHX01BWFVJTlQpCisgICAgcmV0dXJuOworCisgIGlmICgqbl9idWZmZXJzID09IDApIHsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSwKKyAgICAgICAgMjIwICogR1NUX01TRUNPTkQpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlciksIDIwICogR1NUX01TRUNPTkQpOworICB9IGVsc2UgaWYgKCpuX2J1ZmZlcnMgPT0gNCkgeworICAgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpLAorICAgICAgICAzNjAgKiBHU1RfTVNFQ09ORCk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSwgMjAgKiBHU1RfTVNFQ09ORCk7CisgIH0gZWxzZSB7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlciksCisgICAgICAgIDIwMCAqIEdTVF9NU0VDT05EICsgKm5fYnVmZmVycyAqIDQwICogR1NUX01TRUNPTkQpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlciksIDQwICogR1NUX01TRUNPTkQpOworICB9CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZmZlciksIDUgKyAqbl9idWZmZXJzKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWZmZXIpLAorICAgICAgNSArICpuX2J1ZmZlcnMgKyAxKTsKKworICAqbl9idWZmZXJzID0gKm5fYnVmZmVycyArIDE7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ltYWdlZnJlZXplXzI1XzFfMjIwbXNfMzgwbXMpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RDYXBzICpjYXBzMSwgKmNhcHMyOworICBHc3RCdXMgKmJ1czsKKyAgR01haW5Mb29wICpsb29wOworICBndWludCBuX2J1ZmZlcnMgPSBHX01BWFVJTlQ7CisgIGd1aW50IGJ1c193YXRjaCA9IDA7CisgIEdzdFZpZGVvSW5mbyBpMSwgaTI7CisKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJmkxKTsKKyAgZ3N0X3ZpZGVvX2luZm9fc2V0X2Zvcm1hdCAoJmkxLCBHU1RfVklERU9fRk9STUFUX3hSR0IsIDY0MCwgNDgwKTsKKyAgaTEuZnBzX24gPSAyNTsKKyAgaTEuZnBzX2QgPSAxOworICBjYXBzMSA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZpMSk7CisKKyAgZ3N0X3ZpZGVvX2luZm9faW5pdCAoJmkyKTsKKyAgZ3N0X3ZpZGVvX2luZm9fc2V0X2Zvcm1hdCAoJmkyLCBHU1RfVklERU9fRk9STUFUX3hSR0IsIDY0MCwgNDgwKTsKKyAgaTIuZnBzX24gPSAyNTsKKyAgaTIuZnBzX2QgPSAxOworICBjYXBzMiA9IGdzdF92aWRlb19pbmZvX3RvX2NhcHMgKCZpMik7CisKKyAgcGlwZWxpbmUgPQorICAgICAgc2V0dXBfaW1hZ2VmcmVlemUgKGNhcHMxLCBjYXBzMiwKKyAgICAgIEdfQ0FMTEJBQ0sgKHNpbmtfaGFuZG9mZl9jYl8yNV8xXzIyMG1zXzM4MG1zKSwgJm5fYnVmZmVycyk7CisKKyAgbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgVFJVRSk7CisgIGZhaWxfdW5sZXNzIChsb29wICE9IE5VTEwpOworCisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKHBpcGVsaW5lKTsKKyAgZmFpbF91bmxlc3MgKGJ1cyAhPSBOVUxMKTsKKyAgYnVzX3dhdGNoID0gZ3N0X2J1c19hZGRfd2F0Y2ggKGJ1cywgYnVzX2hhbmRsZXIsIGxvb3ApOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QQVVTRUQpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2VlayAocGlwZWxpbmUsIDEuMCwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgICAgIEdTVF9TRUVLX0ZMQUdfRkxVU0gsIEdTVF9TRUVLX1RZUEVfU0VULCAyMjAgKiBHU1RfTVNFQ09ORCwKKyAgICAgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgMzgwICogR1NUX01TRUNPTkQpKTsKKworICBuX2J1ZmZlcnMgPSAwOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKSwKKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChuX2J1ZmZlcnMsIDUpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisgIGdfbWFpbl9sb29wX3VucmVmIChsb29wKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMxKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMyKTsKKyAgZ19zb3VyY2VfcmVtb3ZlIChidXNfd2F0Y2gpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ltYWdlZnJlZXplX2VvcykKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEVsZW1lbnQgKnNyYzsKKyAgR3N0Q2FwcyAqY2FwczEsICpjYXBzMjsKKyAgR3N0QnVzICpidXM7CisgIEdNYWluTG9vcCAqbG9vcDsKKyAgR3N0Rm9ybWF0IGZtdCA9IEdTVF9GT1JNQVRfVElNRTsKKyAgZ2ludDY0IHBvc2l0aW9uOworICBndWludCBidXNfd2F0Y2ggPSAwOworICBHc3RWaWRlb0luZm8gaTEsIGkyOworCisgIGdzdF92aWRlb19pbmZvX2luaXQgKCZpMSk7CisgIGdzdF92aWRlb19pbmZvX3NldF9mb3JtYXQgKCZpMSwgR1NUX1ZJREVPX0ZPUk1BVF94UkdCLCA2NDAsIDQ4MCk7CisgIGkxLmZwc19uID0gMjU7CisgIGkxLmZwc19kID0gMTsKKyAgY2FwczEgPSBnc3RfdmlkZW9faW5mb190b19jYXBzICgmaTEpOworCisgIGdzdF92aWRlb19pbmZvX2luaXQgKCZpMik7CisgIGdzdF92aWRlb19pbmZvX3NldF9mb3JtYXQgKCZpMiwgR1NUX1ZJREVPX0ZPUk1BVF94UkdCLCA2NDAsIDQ4MCk7CisgIGkyLmZwc19uID0gMjU7CisgIGkyLmZwc19kID0gMTsKKyAgY2FwczIgPSBnc3RfdmlkZW9faW5mb190b19jYXBzICgmaTIpOworCisgIHBpcGVsaW5lID0gc2V0dXBfaW1hZ2VmcmVlemUgKGNhcHMxLCBjYXBzMiwgTlVMTCwgTlVMTCk7CisKKyAgc3JjID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAocGlwZWxpbmUpLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChzcmMgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc3JjLCAibnVtLWJ1ZmZlcnMiLCAxMDAsIE5VTEwpOworCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIFRSVUUpOworICBmYWlsX3VubGVzcyAobG9vcCAhPSBOVUxMKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChwaXBlbGluZSk7CisgIGZhaWxfdW5sZXNzIChidXMgIT0gTlVMTCk7CisgIGJ1c193YXRjaCA9IGdzdF9idXNfYWRkX3dhdGNoIChidXMsIGJ1c19oYW5kbGVyLCBsb29wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUEFVU0VEKSwKKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NlZWsgKHBpcGVsaW5lLCAxLjAsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgICBHU1RfU0VFS19GTEFHX0ZMVVNILCBHU1RfU0VFS19UWVBFX1NFVCwgMCwgR1NUX1NFRUtfVFlQRV9TRVQsCisgICAgICAgICAgNDAwICogR1NUX01TRUNPTkQpKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyksCisgICAgICBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3F1ZXJ5X3Bvc2l0aW9uIChzcmMsIGZtdCwgJnBvc2l0aW9uKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKHBvc2l0aW9uLCA0MCAqIEdTVF9NU0VDT05EKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzMSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzMik7CisgIGdfc291cmNlX3JlbW92ZSAoYnVzX3dhdGNoKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgoraW1hZ2VmcmVlemVfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgiaW1hZ2VmcmVlemUiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgibGluZWFyIik7CisKKyAgLyogdGltZSBvdXQgYWZ0ZXIgMTIwcywgbm90IHRoZSBkZWZhdWx0IDMgKi8KKyAgdGNhc2Vfc2V0X3RpbWVvdXQgKHRjX2NoYWluLCAxMjApOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaW1hZ2VmcmVlemVfMF8xKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ltYWdlZnJlZXplXzI1XzFfMG1zXzQwMG1zKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ltYWdlZnJlZXplXzI1XzFfMjAwbXNfNDAwbXMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaW1hZ2VmcmVlemVfMjVfMV80MDBtc18wbXMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaW1hZ2VmcmVlemVfMjVfMV8yMjBtc18zODBtcyk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ltYWdlZnJlZXplX2Vvcyk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChpbWFnZWZyZWV6ZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9pbnRlcmxlYXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5ZDU2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2ludGVybGVhdmUuYwpAQCAtMCwwICsxLDgyNiBAQAorLyogR1N0cmVhbWVyIHVuaXQgdGVzdHMgZm9yIHRoZSBpbnRlcmxlYXZlIGVsZW1lbnQKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA4IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKiBGSVhNRSAwLjExOiBzdXBwcmVzcyB3YXJuaW5ncyBmb3IgZGVwcmVjYXRlZCBBUEkgc3VjaCBhcyBHVmFsdWVBcnJheQorICogd2l0aCBuZXdlciBHTGliIHZlcnNpb25zICg+PSAyLjMxLjApICovCisjZGVmaW5lIEdMSUJfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9WQUxHUklORAorIyBpbmNsdWRlIDx2YWxncmluZC92YWxncmluZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8tZW51bXR5cGVzLmg+CisKK3N0YXRpYyB2b2lkCitnc3RfY2hlY2tfc2V0dXBfZXZlbnRzX2ludGVybGVhdmUgKEdzdFBhZCAqIHNyY3BhZCwgR3N0RWxlbWVudCAqIGVsZW1lbnQsCisgICAgR3N0Q2FwcyAqIGNhcHMsIEdzdEZvcm1hdCBmb3JtYXQsIGNvbnN0IGdjaGFyICogc3RyZWFtX2lkKQoreworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIGZvcm1hdCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjcGFkLAorICAgICAgICAgIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0IChzdHJlYW1faWQpKSk7CisgIGlmIChjYXBzKQorICAgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSkpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2NyZWF0ZV9hbmRfdW5yZWYpCit7CisgIEdzdEVsZW1lbnQgKmludGVybGVhdmU7CisKKyAgaW50ZXJsZWF2ZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImludGVybGVhdmUiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGludGVybGVhdmUgIT0gTlVMTCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChpbnRlcmxlYXZlLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGludGVybGVhdmUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3JlcXVlc3RfcGFkcykKK3sKKyAgR3N0RWxlbWVudCAqaW50ZXJsZWF2ZTsKKyAgR3N0UGFkICpwYWQxLCAqcGFkMjsKKworICBpbnRlcmxlYXZlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaW50ZXJsZWF2ZSIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoaW50ZXJsZWF2ZSAhPSBOVUxMKTsKKworICBwYWQxID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChpbnRlcmxlYXZlLCAic2lua18ldSIpOworICBmYWlsX3VubGVzcyAocGFkMSAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoR1NUX09CSkVDVF9OQU1FIChwYWQxKSwgInNpbmtfMCIpOworCisgIHBhZDIgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKGludGVybGVhdmUsICJzaW5rXyV1Iik7CisgIGZhaWxfdW5sZXNzIChwYWQyICE9IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChHU1RfT0JKRUNUX05BTUUgKHBhZDIpLCAic2lua18xIik7CisKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgcGFkMik7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZDIpOworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChpbnRlcmxlYXZlLCBwYWQxKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGFkMSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChpbnRlcmxlYXZlLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGludGVybGVhdmUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBHc3RQYWQgKipteXNyY3BhZHMsICpteXNpbmtwYWQ7CitzdGF0aWMgR3N0QnVzICpidXM7CitzdGF0aWMgR3N0RWxlbWVudCAqaW50ZXJsZWF2ZTsKK3N0YXRpYyBnaW50IGhhdmVfZGF0YTsKK3N0YXRpYyBnZmxvYXQgaW5wdXRbMl07CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKEYzMikgIiwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAyLCBsYXlvdXQgPSAoc3RyaW5nKSB7aW50ZXJsZWF2ZWQsIG5vbi1pbnRlcmxlYXZlZH0sIHJhdGUgPSAoaW50KSA0ODAwMCIpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoRjMyKSAiLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsIGxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCByYXRlID0gKGludCkgNDgwMDAiKSk7CisKKyNkZWZpbmUgQ0FQU180OGtoeiBcCisgICAgICAgICJhdWRpby94LXJhdywgIiBcCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoRjMyKSAiLCAiIFwKKyAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgbGF5b3V0ID0gKHN0cmluZykgbm9uLWludGVybGVhdmVkLCIgXAorICAgICAgICAicmF0ZSA9IChpbnQpIDQ4MDAwIgorCitzdGF0aWMgR3N0Rmxvd1JldHVybgoraW50ZXJsZWF2ZV9jaGFpbl9mdW5jIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmZmVyKQoreworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2Zsb2F0ICpvdXRkYXRhOworICBnaW50IGk7CisKKyAgZmFpbF91bmxlc3MgKEdTVF9JU19CVUZGRVIgKGJ1ZmZlcikpOworICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBvdXRkYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobWFwLnNpemUsIDQ4MDAwICogMiAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIGZhaWxfdW5sZXNzIChvdXRkYXRhICE9IE5VTEwpOworCisjaWZkZWYgSEFWRV9WQUxHUklORAorICBpZiAoIShSVU5OSU5HX09OX1ZBTEdSSU5EKSkKKyNlbmRpZgorICAgIGZvciAoaSA9IDA7IGkgPCA0ODAwMCAqIDI7IGkgKz0gMikgeworICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2Zsb2F0IChvdXRkYXRhW2ldLCBpbnB1dFswXSk7CisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfZmxvYXQgKG91dGRhdGFbaSArIDFdLCBpbnB1dFsxXSk7CisgICAgfQorICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIGhhdmVfZGF0YSsrOworCisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaW50ZXJsZWF2ZV8yY2gpCit7CisgIEdzdEVsZW1lbnQgKnF1ZXVlOworICBHc3RQYWQgKnNpbmswLCAqc2luazEsICpzcmMsICp0bXA7CisgIEdzdENhcHMgKmNhcHM7CisgIGdpbnQgaTsKKyAgR3N0QnVmZmVyICppbmJ1ZjsKKyAgZ2Zsb2F0ICppbmRhdGE7CisgIEdzdE1hcEluZm8gbWFwOworCisgIG15c3JjcGFkcyA9IGdfbmV3MCAoR3N0UGFkICosIDIpOworCisgIGhhdmVfZGF0YSA9IDA7CisKKyAgaW50ZXJsZWF2ZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImludGVybGVhdmUiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGludGVybGVhdmUgIT0gTlVMTCk7CisKKyAgcXVldWUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJxdWV1ZSIsICJxdWV1ZSIpOworICBmYWlsX3VubGVzcyAocXVldWUgIT0gTlVMTCk7CisKKyAgc2luazAgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKGludGVybGVhdmUsICJzaW5rXyV1Iik7CisgIGZhaWxfdW5sZXNzIChzaW5rMCAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoR1NUX09CSkVDVF9OQU1FIChzaW5rMCksICJzaW5rXzAiKTsKKworICBzaW5rMSA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgInNpbmtfJXUiKTsKKyAgZmFpbF91bmxlc3MgKHNpbmsxICE9IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChHU1RfT0JKRUNUX05BTUUgKHNpbmsxKSwgInNpbmtfMSIpOworCisgIG15c3JjcGFkc1swXSA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc3JjdGVtcGxhdGUsICJzcmMwIik7CisgIGZhaWxfdW5sZXNzIChteXNyY3BhZHNbMF0gIT0gTlVMTCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChDQVBTXzQ4a2h6KTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZHNbMF0sIFRSVUUpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzX2ludGVybGVhdmUgKG15c3JjcGFkc1swXSwgaW50ZXJsZWF2ZSwgY2FwcywKKyAgICAgIEdTVF9GT1JNQVRfVElNRSwgIjAiKTsKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAobXlzcmNwYWRzWzBdKTsKKworICBteXNyY3BhZHNbMV0gPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNyY3RlbXBsYXRlLCAic3JjMSIpOworICBmYWlsX3VubGVzcyAobXlzcmNwYWRzWzFdICE9IE5VTEwpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWRzWzFdLCBUUlVFKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50c19pbnRlcmxlYXZlIChteXNyY3BhZHNbMV0sIGludGVybGVhdmUsIGNhcHMsCisgICAgICBHU1RfRk9STUFUX1RJTUUsICIxIik7CisgIGdzdF9wYWRfdXNlX2ZpeGVkX2NhcHMgKG15c3JjcGFkc1sxXSk7CisKKyAgdG1wID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHF1ZXVlLCAic2luayIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rIChteXNyY3BhZHNbMF0sIHRtcCkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wKTsKKyAgdG1wID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHF1ZXVlLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHRtcCwgc2luazApID09IEdTVF9QQURfTElOS19PSyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHRtcCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAobXlzcmNwYWRzWzFdLCBzaW5rMSkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKworICBteXNpbmtwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNpbmt0ZW1wbGF0ZSwgInNpbmsiKTsKKyAgZmFpbF91bmxlc3MgKG15c2lua3BhZCAhPSBOVUxMKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKG15c2lua3BhZCwgaW50ZXJsZWF2ZV9jaGFpbl9mdW5jKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworCisgIHNyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChpbnRlcmxlYXZlLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChzcmMgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHNyYywgbXlzaW5rcGFkKSA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmMpOworCisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChpbnRlcmxlYXZlLCBidXMpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGludGVybGVhdmUsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHF1ZXVlLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGlucHV0WzBdID0gLTEuMDsKKyAgaW5idWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDQ4MDAwICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW5kYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDQ4MDAwOyBpKyspCisgICAgaW5kYXRhW2ldID0gLTEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWYsICZtYXApOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZHNbMF0sIGluYnVmKSA9PSBHU1RfRkxPV19PSyk7CisKKyAgaW5wdXRbMV0gPSAxLjA7CisgIGluYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg0ODAwMCAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGluZGF0YSA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCA0ODAwMDsgaSsrKQorICAgIGluZGF0YVtpXSA9IDEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWYsICZtYXApOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZHNbMV0sIGluYnVmKSA9PSBHU1RfRkxPV19PSyk7CisKKyAgaW5idWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDQ4MDAwICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW5kYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDQ4MDAwOyBpKyspCisgICAgaW5kYXRhW2ldID0gLTEuMDsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWYsICZtYXApOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZHNbMF0sIGluYnVmKSA9PSBHU1RfRkxPV19PSyk7CisKKyAgaW5idWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDQ4MDAwICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW5kYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDQ4MDAwOyBpKyspCisgICAgaW5kYXRhW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZiwgJm1hcCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkc1sxXSwgaW5idWYpID09IEdTVF9GTE9XX09LKTsKKworICBmYWlsX3VubGVzcyAoaGF2ZV9kYXRhID09IDIpOworCisgIGdzdF9idXNfc2V0X2ZsdXNoaW5nIChidXMsIFRSVUUpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGludGVybGVhdmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChxdWV1ZSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKG15c3JjcGFkc1swXSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKG15c3JjcGFkc1sxXSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKG15c2lua3BhZCk7CisKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgc2luazApOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rMCk7CisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKGludGVybGVhdmUsIHNpbmsxKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2luazEpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGludGVybGVhdmUpOworICBnc3Rfb2JqZWN0X3VucmVmIChxdWV1ZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBnX2ZyZWUgKG15c3JjcGFkcyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaW50ZXJsZWF2ZV8yY2hfMWVvcykKK3sKKyAgR3N0RWxlbWVudCAqcXVldWU7CisgIEdzdFBhZCAqc2luazAsICpzaW5rMSwgKnNyYywgKnRtcDsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2ludCBpOworICBHc3RCdWZmZXIgKmluYnVmOworICBnZmxvYXQgKmluZGF0YTsKKyAgR3N0TWFwSW5mbyBtYXA7CisKKyAgbXlzcmNwYWRzID0gZ19uZXcwIChHc3RQYWQgKiwgMik7CisKKyAgaGF2ZV9kYXRhID0gMDsKKworICBpbnRlcmxlYXZlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaW50ZXJsZWF2ZSIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoaW50ZXJsZWF2ZSAhPSBOVUxMKTsKKworICBxdWV1ZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInF1ZXVlIiwgInF1ZXVlIik7CisgIGZhaWxfdW5sZXNzIChxdWV1ZSAhPSBOVUxMKTsKKworICBzaW5rMCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgInNpbmtfJXUiKTsKKyAgZmFpbF91bmxlc3MgKHNpbmswICE9IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChHU1RfT0JKRUNUX05BTUUgKHNpbmswKSwgInNpbmtfMCIpOworCisgIHNpbmsxID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChpbnRlcmxlYXZlLCAic2lua18ldSIpOworICBmYWlsX3VubGVzcyAoc2luazEgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKEdTVF9PQkpFQ1RfTkFNRSAoc2luazEpLCAic2lua18xIik7CisKKyAgbXlzcmNwYWRzWzBdID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmN0ZW1wbGF0ZSwgInNyYzAiKTsKKyAgZmFpbF91bmxlc3MgKG15c3JjcGFkc1swXSAhPSBOVUxMKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKENBUFNfNDhraHopOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkc1swXSwgVFJVRSk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHNfaW50ZXJsZWF2ZSAobXlzcmNwYWRzWzBdLCBpbnRlcmxlYXZlLCBjYXBzLAorICAgICAgR1NUX0ZPUk1BVF9USU1FLCAiMCIpOworICBnc3RfcGFkX3VzZV9maXhlZF9jYXBzIChteXNyY3BhZHNbMF0pOworCisgIG15c3JjcGFkc1sxXSA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc3JjdGVtcGxhdGUsICJzcmMxIik7CisgIGZhaWxfdW5sZXNzIChteXNyY3BhZHNbMV0gIT0gTlVMTCk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZHNbMV0sIFRSVUUpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzX2ludGVybGVhdmUgKG15c3JjcGFkc1sxXSwgaW50ZXJsZWF2ZSwgY2FwcywKKyAgICAgIEdTVF9GT1JNQVRfVElNRSwgIjEiKTsKKyAgZ3N0X3BhZF91c2VfZml4ZWRfY2FwcyAobXlzcmNwYWRzWzFdKTsKKworICB0bXAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocXVldWUsICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKG15c3JjcGFkc1swXSwgdG1wKSA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3Rfb2JqZWN0X3VucmVmICh0bXApOworICB0bXAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocXVldWUsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAodG1wLCBzaW5rMCkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rIChteXNyY3BhZHNbMV0sIHNpbmsxKSA9PSBHU1RfUEFEX0xJTktfT0spOworCisgIG15c2lua3BhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua3RlbXBsYXRlLCAic2luayIpOworICBmYWlsX3VubGVzcyAobXlzaW5rcGFkICE9IE5VTEwpOworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAobXlzaW5rcGFkLCBpbnRlcmxlYXZlX2NoYWluX2Z1bmMpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGludGVybGVhdmUsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKHNyYyAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAoc3JjLCBteXNpbmtwYWQpID09IEdTVF9QQURfTElOS19PSyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyYyk7CisKKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGludGVybGVhdmUsIGJ1cyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoaW50ZXJsZWF2ZSwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocXVldWUsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgaW5wdXRbMF0gPSAtMS4wOworICBpbmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoNDgwMDAgKiBzaXplb2YgKGdmbG9hdCkpOworICBnc3RfYnVmZmVyX21hcCAoaW5idWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBpbmRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgNDgwMDA7IGkrKykKKyAgICBpbmRhdGFbaV0gPSAtMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZiwgJm1hcCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkc1swXSwgaW5idWYpID09IEdTVF9GTE9XX09LKTsKKworICBpbnB1dFsxXSA9IDEuMDsKKyAgaW5idWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDQ4MDAwICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW5kYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDQ4MDAwOyBpKyspCisgICAgaW5kYXRhW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZiwgJm1hcCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkc1sxXSwgaW5idWYpID09IEdTVF9GTE9XX09LKTsKKworICBpbnB1dFswXSA9IDAuMDsKKyAgZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZHNbMF0sIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKworICBpbnB1dFsxXSA9IDEuMDsKKyAgaW5idWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDQ4MDAwICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgaW5kYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDQ4MDAwOyBpKyspCisgICAgaW5kYXRhW2ldID0gMS4wOworICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZiwgJm1hcCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkc1sxXSwgaW5idWYpID09IEdTVF9GTE9XX09LKTsKKworICBmYWlsX3VubGVzcyAoaGF2ZV9kYXRhID09IDIpOworCisgIGdzdF9idXNfc2V0X2ZsdXNoaW5nIChidXMsIFRSVUUpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGludGVybGVhdmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChxdWV1ZSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKG15c3JjcGFkc1swXSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKG15c3JjcGFkc1sxXSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKG15c2lua3BhZCk7CisKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgc2luazApOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rMCk7CisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKGludGVybGVhdmUsIHNpbmsxKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2luazEpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGludGVybGVhdmUpOworICBnc3Rfb2JqZWN0X3VucmVmIChxdWV1ZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBnX2ZyZWUgKG15c3JjcGFkcyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIHZvaWQKK3NyY19oYW5kb2ZmX2Zsb2F0MzIgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RCdWZmZXIgKiBidWZmZXIsIEdzdFBhZCAqIHBhZCwKKyAgICBnYm9vbGVhbiBpbnRlcmxlYXZlZCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBnaW50IG4gPSBHUE9JTlRFUl9UT19JTlQgKHVzZXJfZGF0YSk7CisgIGdmbG9hdCAqZGF0YTsKKyAgZ2ludCBpOworICBnc2l6ZSBzaXplOworICBHc3RDYXBzICpjYXBzOworICBndWludDY0IG1hc2s7CisgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHBvczsKKworICBzd2l0Y2ggKG4pIHsKKyAgICBjYXNlIDA6CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICAgIHBvcyA9IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBwb3MgPSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9SSUdIVDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBwb3MgPSBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9JTlZBTElEOworICAgICAgYnJlYWs7CisgIH0KKworICBtYXNrID0gR19HVUlOVDY0X0NPTlNUQU5UICgxKSA8PCBwb3M7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgR1NUX0FVRElPX05FIChGMzIpLAorICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMSwKKyAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCBpbnRlcmxlYXZlZCA/ICJpbnRlcmxlYXZlZCIgOiAibm9uLWludGVybGVhdmVkIiwKKyAgICAgICJjaGFubmVsLW1hc2siLCBHU1RfVFlQRV9CSVRNQVNLLCBtYXNrLCAicmF0ZSIsIEdfVFlQRV9JTlQsIDQ4MDAwLCBOVUxMKTsKKworICBnc3RfcGFkX3NldF9jYXBzIChwYWQsIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgc2l6ZSA9IDQ4MDAwICogc2l6ZW9mIChnZmxvYXQpOworICBkYXRhID0gZ19tYWxsb2MgKHNpemUpOworICBmb3IgKGkgPSAwOyBpIDwgNDgwMDA7IGkrKykKKyAgICBkYXRhW2ldID0gKG4gJSAyID09IDApID8gLTEuMCA6IDEuMDsKKworICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKGJ1ZmZlciwgZ3N0X21lbW9yeV9uZXdfd3JhcHBlZCAoMCwgZGF0YSwKKyAgICAgICAgICBzaXplLCAwLCBzaXplLCBkYXRhLCBnX2ZyZWUpKTsKKworICBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSA9IEdTVF9CVUZGRVJfT0ZGU0VUX05PTkU7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWZmZXIpID0gR1NUX0JVRkZFUl9PRkZTRVRfTk9ORTsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSA9IEdTVF9TRUNPTkQ7Cit9CisKK3N0YXRpYyB2b2lkCitzcmNfaGFuZG9mZl9mbG9hdDMyX2ludGVybGVhdmVkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0QnVmZmVyICogYnVmZmVyLAorICAgIEdzdFBhZCAqIHBhZCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBzcmNfaGFuZG9mZl9mbG9hdDMyIChlbGVtZW50LCBidWZmZXIsIHBhZCwgVFJVRSwgdXNlcl9kYXRhKTsKK30KKworc3RhdGljIHZvaWQKK3NyY19oYW5kb2ZmX2Zsb2F0MzJfbm9uX2ludGVybGVhdmVkIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0QnVmZmVyICogYnVmZmVyLAorICAgIEdzdFBhZCAqIHBhZCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBzcmNfaGFuZG9mZl9mbG9hdDMyIChlbGVtZW50LCBidWZmZXIsIHBhZCwgRkFMU0UsIHVzZXJfZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitzaW5rX2hhbmRvZmZfZmxvYXQzMiAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwgR3N0UGFkICogcGFkLAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ2ludCBpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2Zsb2F0ICpkYXRhOworICBHc3RDYXBzICpjYXBzLCAqY2NhcHM7CisgIGdpbnQgbiA9IEdQT0lOVEVSX1RPX0lOVCAodXNlcl9kYXRhKTsKKyAgZ3VpbnQ2NCBtYXNrOworCisgIGZhaWxfdW5sZXNzIChHU1RfSVNfQlVGRkVSIChidWZmZXIpKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobWFwLnNpemUsIDQ4MDAwICogMiAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlciksIEdTVF9TRUNPTkQpOworCisgIGlmIChuID09IDApIHsKKyAgICBHc3RBdWRpb0NoYW5uZWxQb3NpdGlvbiBwb3NbMl0gPQorICAgICAgICB7IEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX05PTkUsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX05PTkUgfTsKKyAgICBnc3RfYXVkaW9fY2hhbm5lbF9wb3NpdGlvbnNfdG9fbWFzayAocG9zLCAyLCBGQUxTRSwgJm1hc2spOworICB9IGVsc2UgaWYgKG4gPT0gMSkgeworICAgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHBvc1syXSA9IHsgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCwKKyAgICAgIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUCisgICAgfTsKKyAgICBnc3RfYXVkaW9fY2hhbm5lbF9wb3NpdGlvbnNfdG9fbWFzayAocG9zLCAyLCBGQUxTRSwgJm1hc2spOworICB9IGVsc2UgaWYgKG4gPT0gMikgeworICAgIEdzdEF1ZGlvQ2hhbm5lbFBvc2l0aW9uIHBvc1syXSA9IHsgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSLAorICAgICAgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9DRU5URVIKKyAgICB9OworICAgIGdzdF9hdWRpb19jaGFubmVsX3Bvc2l0aW9uc190b19tYXNrIChwb3MsIDIsIEZBTFNFLCAmbWFzayk7CisgIH0gZWxzZSB7CisgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQgKCk7CisgIH0KKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwKKyAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBHU1RfQVVESU9fTkUgKEYzMiksCisgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAyLCAicmF0ZSIsIEdfVFlQRV9JTlQsIDQ4MDAwLAorICAgICAgImxheW91dCIsIEdfVFlQRV9TVFJJTkcsICJpbnRlcmxlYXZlZCIsCisgICAgICAiY2hhbm5lbC1tYXNrIiwgR1NUX1RZUEVfQklUTUFTSywgbWFzaywgTlVMTCk7CisKKyAgY2NhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHBhZCk7CisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19pc19lcXVhbCAoY2FwcywgY2NhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisjaWZkZWYgSEFWRV9WQUxHUklORAorICBpZiAoIShSVU5OSU5HX09OX1ZBTEdSSU5EKSkKKyNlbmRpZgorICAgIGZvciAoaSA9IDA7IGkgPCA0ODAwMCAqIDI7IGkgKz0gMikgeworICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2Zsb2F0IChkYXRhW2ldLCAtMS4wKTsKKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19mbG9hdCAoZGF0YVtpICsgMV0sIDEuMCk7CisgICAgfQorICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworCisgIGhhdmVfZGF0YSsrOworfQorCitzdGF0aWMgdm9pZAordGVzdF9pbnRlcmxlYXZlXzJjaF9waXBlbGluZSAoZ2Jvb2xlYW4gaW50ZXJsZWF2ZWQpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lLCAqcXVldWUsICpzcmMxLCAqc3JjMiwgKmludGVybGVhdmUsICpzaW5rOworICBHc3RQYWQgKnNpbmtwYWQwLCAqc2lua3BhZDEsICp0bXAsICp0bXAyOworICBHc3RNZXNzYWdlICptc2c7CisgIHZvaWQgKnNyY19oYW5kb2ZmX2Zsb2F0MzIgPQorICAgICAgaW50ZXJsZWF2ZWQgPyAmc3JjX2hhbmRvZmZfZmxvYXQzMl9pbnRlcmxlYXZlZCA6CisgICAgICAmc3JjX2hhbmRvZmZfZmxvYXQzMl9ub25faW50ZXJsZWF2ZWQ7CisKKyAgaGF2ZV9kYXRhID0gMDsKKworICBwaXBlbGluZSA9IChHc3RFbGVtZW50ICopIGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBmYWlsX3VubGVzcyAocGlwZWxpbmUgIT0gTlVMTCk7CisKKyAgc3JjMSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzcmMiLCAic3JjMSIpOworICBmYWlsX3VubGVzcyAoc3JjMSAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMxLCAibnVtLWJ1ZmZlcnMiLCA0LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMxLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNyYzEsICJoYW5kb2ZmIiwgR19DQUxMQkFDSyAoc3JjX2hhbmRvZmZfZmxvYXQzMiksCisgICAgICBHSU5UX1RPX1BPSU5URVIgKDApKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjMSk7CisKKyAgc3JjMiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzcmMiLCAic3JjMiIpOworICBmYWlsX3VubGVzcyAoc3JjMiAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMyLCAibnVtLWJ1ZmZlcnMiLCA0LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMyLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNyYzIsICJoYW5kb2ZmIiwgR19DQUxMQkFDSyAoc3JjX2hhbmRvZmZfZmxvYXQzMiksCisgICAgICBHSU5UX1RPX1BPSU5URVIgKDEpKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjMik7CisKKyAgcXVldWUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJxdWV1ZSIsICJxdWV1ZSIpOworICBmYWlsX3VubGVzcyAocXVldWUgIT0gTlVMTCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIHF1ZXVlKTsKKworICBpbnRlcmxlYXZlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaW50ZXJsZWF2ZSIsICJpbnRlcmxlYXZlIik7CisgIGZhaWxfdW5sZXNzIChpbnRlcmxlYXZlICE9IE5VTEwpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBnc3Rfb2JqZWN0X3JlZiAoaW50ZXJsZWF2ZSkpOworCisgIHNpbmtwYWQwID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChpbnRlcmxlYXZlLCAic2lua18ldSIpOworICBmYWlsX3VubGVzcyAoc2lua3BhZDAgIT0gTlVMTCk7CisgIHRtcCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzcmMxLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHRtcCwgc2lua3BhZDApID09IEdTVF9QQURfTElOS19PSyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHRtcCk7CisKKyAgc2lua3BhZDEgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKGludGVybGVhdmUsICJzaW5rXyV1Iik7CisgIGZhaWxfdW5sZXNzIChzaW5rcGFkMSAhPSBOVUxMKTsKKyAgdG1wID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNyYzIsICJzcmMiKTsKKyAgdG1wMiA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChxdWV1ZSwgInNpbmsiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAodG1wLCB0bXAyKSA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3Rfb2JqZWN0X3VucmVmICh0bXApOworICBnc3Rfb2JqZWN0X3VucmVmICh0bXAyKTsKKyAgdG1wID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHF1ZXVlLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHRtcCwgc2lua3BhZDEpID09IEdTVF9QQURfTElOS19PSyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHRtcCk7CisKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgInNpbmsiKTsKKyAgZmFpbF91bmxlc3MgKHNpbmsgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc2luaywgInNpZ25hbC1oYW5kb2ZmcyIsIFRSVUUsIE5VTEwpOworICBnX3NpZ25hbF9jb25uZWN0IChzaW5rLCAiaGFuZG9mZiIsIEdfQ0FMTEJBQ0sgKHNpbmtfaGFuZG9mZl9mbG9hdDMyKSwKKyAgICAgIEdJTlRfVE9fUE9JTlRFUiAoMCkpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBzaW5rKTsKKyAgdG1wID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGludGVybGVhdmUsICJzcmMiKTsKKyAgdG1wMiA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzaW5rLCAic2luayIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rICh0bXAsIHRtcDIpID09IEdTVF9QQURfTElOS19PSyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHRtcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHRtcDIpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICBtc2cgPSBnc3RfYnVzX3BvbGwgKEdTVF9FTEVNRU5UX0JVUyAocGlwZWxpbmUpLCBHU1RfTUVTU0FHRV9FT1MsIC0xKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisKKyAgZmFpbF91bmxlc3MgKGhhdmVfZGF0YSA9PSA0KTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKGludGVybGVhdmUsIHNpbmtwYWQwKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZDApOworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChpbnRlcmxlYXZlLCBzaW5rcGFkMSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQxKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoaW50ZXJsZWF2ZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaW50ZXJsZWF2ZV8yY2hfcGlwZWxpbmVfaW50ZXJsZWF2ZWQpCit7CisgIHRlc3RfaW50ZXJsZWF2ZV8yY2hfcGlwZWxpbmUgKFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ludGVybGVhdmVfMmNoX3BpcGVsaW5lX25vbl9pbnRlcmxlYXZlZCkKK3sKKyAgdGVzdF9pbnRlcmxlYXZlXzJjaF9waXBlbGluZSAoRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ludGVybGVhdmVfMmNoX3BpcGVsaW5lX2lucHV0X2NoYW5wb3MpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lLCAqcXVldWUsICpzcmMxLCAqc3JjMiwgKmludGVybGVhdmUsICpzaW5rOworICBHc3RQYWQgKnNpbmtwYWQwLCAqc2lua3BhZDEsICp0bXAsICp0bXAyOworICBHc3RNZXNzYWdlICptc2c7CisKKyAgaGF2ZV9kYXRhID0gMDsKKworICBwaXBlbGluZSA9IChHc3RFbGVtZW50ICopIGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBmYWlsX3VubGVzcyAocGlwZWxpbmUgIT0gTlVMTCk7CisKKyAgc3JjMSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzcmMiLCAic3JjMSIpOworICBmYWlsX3VubGVzcyAoc3JjMSAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMxLCAibnVtLWJ1ZmZlcnMiLCA0LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMxLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNyYzEsICJoYW5kb2ZmIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKHNyY19oYW5kb2ZmX2Zsb2F0MzJfaW50ZXJsZWF2ZWQpLCBHSU5UX1RPX1BPSU5URVIgKDIpKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjMSk7CisKKyAgc3JjMiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzcmMiLCAic3JjMiIpOworICBmYWlsX3VubGVzcyAoc3JjMiAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMyLCAibnVtLWJ1ZmZlcnMiLCA0LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMyLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNyYzIsICJoYW5kb2ZmIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKHNyY19oYW5kb2ZmX2Zsb2F0MzJfaW50ZXJsZWF2ZWQpLCBHSU5UX1RPX1BPSU5URVIgKDMpKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjMik7CisKKyAgcXVldWUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJxdWV1ZSIsICJxdWV1ZSIpOworICBmYWlsX3VubGVzcyAocXVldWUgIT0gTlVMTCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIHF1ZXVlKTsKKworICBpbnRlcmxlYXZlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaW50ZXJsZWF2ZSIsICJpbnRlcmxlYXZlIik7CisgIGZhaWxfdW5sZXNzIChpbnRlcmxlYXZlICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKGludGVybGVhdmUsICJjaGFubmVsLXBvc2l0aW9ucy1mcm9tLWlucHV0IiwgVFJVRSwgTlVMTCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIGdzdF9vYmplY3RfcmVmIChpbnRlcmxlYXZlKSk7CisKKyAgc2lua3BhZDAgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKGludGVybGVhdmUsICJzaW5rXyV1Iik7CisgIGZhaWxfdW5sZXNzIChzaW5rcGFkMCAhPSBOVUxMKTsKKyAgdG1wID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNyYzEsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAodG1wLCBzaW5rcGFkMCkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wKTsKKworICBzaW5rcGFkMSA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgInNpbmtfJXUiKTsKKyAgZmFpbF91bmxlc3MgKHNpbmtwYWQxICE9IE5VTEwpOworICB0bXAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc3JjMiwgInNyYyIpOworICB0bXAyID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHF1ZXVlLCAic2luayIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rICh0bXAsIHRtcDIpID09IEdTVF9QQURfTElOS19PSyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHRtcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHRtcDIpOworICB0bXAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocXVldWUsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAodG1wLCBzaW5rcGFkMSkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wKTsKKworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworICBmYWlsX3VubGVzcyAoc2luayAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzaW5rLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNpbmssICJoYW5kb2ZmIiwgR19DQUxMQkFDSyAoc2lua19oYW5kb2ZmX2Zsb2F0MzIpLAorICAgICAgR0lOVF9UT19QT0lOVEVSICgxKSk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIHNpbmspOworICB0bXAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoaW50ZXJsZWF2ZSwgInNyYyIpOworICB0bXAyID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNpbmssICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHRtcCwgdG1wMikgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wMik7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIG1zZyA9IGdzdF9idXNfcG9sbCAoR1NUX0VMRU1FTlRfQlVTIChwaXBlbGluZSksIEdTVF9NRVNTQUdFX0VPUywgLTEpOworICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKworICBmYWlsX3VubGVzcyAoaGF2ZV9kYXRhID09IDQpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgc2lua3BhZDApOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkMCk7CisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKGludGVybGVhdmUsIHNpbmtwYWQxKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZDEpOworICBnc3Rfb2JqZWN0X3VucmVmIChpbnRlcmxlYXZlKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ludGVybGVhdmVfMmNoX3BpcGVsaW5lX2N1c3RvbV9jaGFucG9zKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZSwgKnF1ZXVlLCAqc3JjMSwgKnNyYzIsICppbnRlcmxlYXZlLCAqc2luazsKKyAgR3N0UGFkICpzaW5rcGFkMCwgKnNpbmtwYWQxLCAqdG1wLCAqdG1wMjsKKyAgR3N0TWVzc2FnZSAqbXNnOworICBHVmFsdWVBcnJheSAqYXJyOworICBHVmFsdWUgdmFsID0geyAwLCB9OworCisgIGhhdmVfZGF0YSA9IDA7CisKKyAgcGlwZWxpbmUgPSAoR3N0RWxlbWVudCAqKSBnc3RfcGlwZWxpbmVfbmV3ICgicGlwZWxpbmUiKTsKKyAgZmFpbF91bmxlc3MgKHBpcGVsaW5lICE9IE5VTEwpOworCisgIHNyYzEgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc3JjIiwgInNyYzEiKTsKKyAgZmFpbF91bmxlc3MgKHNyYzEgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc3JjMSwgIm51bS1idWZmZXJzIiwgNCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc3JjMSwgInNpZ25hbC1oYW5kb2ZmcyIsIFRSVUUsIE5VTEwpOworICBnX3NpZ25hbF9jb25uZWN0IChzcmMxLCAiaGFuZG9mZiIsCisgICAgICBHX0NBTExCQUNLIChzcmNfaGFuZG9mZl9mbG9hdDMyX2ludGVybGVhdmVkKSwgR0lOVF9UT19QT0lOVEVSICgwKSk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIHNyYzEpOworCisgIHNyYzIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc3JjIiwgInNyYzIiKTsKKyAgZmFpbF91bmxlc3MgKHNyYzIgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc3JjMiwgIm51bS1idWZmZXJzIiwgNCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc3JjMiwgInNpZ25hbC1oYW5kb2ZmcyIsIFRSVUUsIE5VTEwpOworICBnX3NpZ25hbF9jb25uZWN0IChzcmMyLCAiaGFuZG9mZiIsCisgICAgICBHX0NBTExCQUNLIChzcmNfaGFuZG9mZl9mbG9hdDMyX2ludGVybGVhdmVkKSwgR0lOVF9UT19QT0lOVEVSICgxKSk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIHNyYzIpOworCisgIHF1ZXVlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicXVldWUiLCAicXVldWUiKTsKKyAgZmFpbF91bmxlc3MgKHF1ZXVlICE9IE5VTEwpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBxdWV1ZSk7CisKKyAgaW50ZXJsZWF2ZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImludGVybGVhdmUiLCAiaW50ZXJsZWF2ZSIpOworICBmYWlsX3VubGVzcyAoaW50ZXJsZWF2ZSAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChpbnRlcmxlYXZlLCAiY2hhbm5lbC1wb3NpdGlvbnMtZnJvbS1pbnB1dCIsIEZBTFNFLCBOVUxMKTsKKyAgYXJyID0gZ192YWx1ZV9hcnJheV9uZXcgKDIpOworCisgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR1NUX1RZUEVfQVVESU9fQ0hBTk5FTF9QT1NJVElPTik7CisgIGdfdmFsdWVfc2V0X2VudW0gKCZ2YWwsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUik7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kIChhcnIsICZ2YWwpOworICBnX3ZhbHVlX3Jlc2V0ICgmdmFsKTsKKyAgZ192YWx1ZV9zZXRfZW51bSAoJnZhbCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9DRU5URVIpOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAoYXJyLCAmdmFsKTsKKyAgZ192YWx1ZV91bnNldCAoJnZhbCk7CisKKyAgZ19vYmplY3Rfc2V0IChpbnRlcmxlYXZlLCAiY2hhbm5lbC1wb3NpdGlvbnMiLCBhcnIsIE5VTEwpOworICBnX3ZhbHVlX2FycmF5X2ZyZWUgKGFycik7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIGdzdF9vYmplY3RfcmVmIChpbnRlcmxlYXZlKSk7CisKKyAgc2lua3BhZDAgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKGludGVybGVhdmUsICJzaW5rXyV1Iik7CisgIGZhaWxfdW5sZXNzIChzaW5rcGFkMCAhPSBOVUxMKTsKKyAgdG1wID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNyYzEsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAodG1wLCBzaW5rcGFkMCkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wKTsKKworICBzaW5rcGFkMSA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgInNpbmtfJXUiKTsKKyAgZmFpbF91bmxlc3MgKHNpbmtwYWQxICE9IE5VTEwpOworICB0bXAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc3JjMiwgInNyYyIpOworICB0bXAyID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHF1ZXVlLCAic2luayIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rICh0bXAsIHRtcDIpID09IEdTVF9QQURfTElOS19PSyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHRtcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHRtcDIpOworICB0bXAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocXVldWUsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAodG1wLCBzaW5rcGFkMSkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wKTsKKworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworICBmYWlsX3VubGVzcyAoc2luayAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzaW5rLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNpbmssICJoYW5kb2ZmIiwgR19DQUxMQkFDSyAoc2lua19oYW5kb2ZmX2Zsb2F0MzIpLAorICAgICAgR0lOVF9UT19QT0lOVEVSICgyKSk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIHNpbmspOworICB0bXAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoaW50ZXJsZWF2ZSwgInNyYyIpOworICB0bXAyID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNpbmssICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHRtcCwgdG1wMikgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodG1wMik7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIG1zZyA9IGdzdF9idXNfcG9sbCAoR1NUX0VMRU1FTlRfQlVTIChwaXBlbGluZSksIEdTVF9NRVNTQUdFX0VPUywgLTEpOworICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKworICBmYWlsX3VubGVzcyAoaGF2ZV9kYXRhID09IDQpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAoaW50ZXJsZWF2ZSwgc2lua3BhZDApOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkMCk7CisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKGludGVybGVhdmUsIHNpbmtwYWQxKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZDEpOworICBnc3Rfb2JqZWN0X3VucmVmIChpbnRlcmxlYXZlKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitpbnRlcmxlYXZlX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImludGVybGVhdmUiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9zZXRfdGltZW91dCAodGNfY2hhaW4sIDE4MCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9jcmVhdGVfYW5kX3VucmVmKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3JlcXVlc3RfcGFkcyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9pbnRlcmxlYXZlXzJjaCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9pbnRlcmxlYXZlXzJjaF8xZW9zKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ludGVybGVhdmVfMmNoX3BpcGVsaW5lX2ludGVybGVhdmVkKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ludGVybGVhdmVfMmNoX3BpcGVsaW5lX25vbl9pbnRlcmxlYXZlZCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9pbnRlcmxlYXZlXzJjaF9waXBlbGluZV9pbnB1dF9jaGFucG9zKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ludGVybGVhdmVfMmNoX3BpcGVsaW5lX2N1c3RvbV9jaGFucG9zKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGludGVybGVhdmUpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvanBlZ2RlYy5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvanBlZ2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YWM1MjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9qcGVnZGVjLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qIEdTdHJlYW1lcgorICogdW5pdCB0ZXN0IGZvciBqcGVnZGVjCisgKiBDb3B5cmlnaHQgKEMpIDwyMDEwPiBUaGlhZ28gU2FudG9zIDx0aGlhZ28uc291c2Euc2FudG9zQGNvbGxhYm9yYS5jby51az4KKyAqIENvcHlyaWdodCAoQykgPDIwMTI+IE1hdGhpYXMgSGFzc2VsbWFubiA8bWF0aGlhc0BvcGVuaXNtdXMuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdpby9naW8uaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvYXBwL2dzdGFwcHNpbmsuaD4KKyNpbmNsdWRlIDxnc3QvcGJ1dGlscy9nc3RkaXNjb3ZlcmVyLmg+CisKKy8qIFZlcmlmeSBqcGVnZGVjIGlzIHdvcmtpbmcgd2hlbiBleHBsaWN0bHkgcmVxdWVzdGVkIGJ5IGEgcGlwZWxpbmUuICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF9qcGVnZGVjX2V4cGxpY2l0KQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZSwgKnNvdXJjZSwgKmRlYywgKnNpbms7CisgIEdzdFNhbXBsZSAqc2FtcGxlOworCisgIC8qIGNvbnN0cnVjdCBhIHBpcGVsaW5lIHRoYXQgZXhwbGljaXRseSB1c2VzIGpwZWdkZWMgKi8KKyAgcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3IChOVUxMKTsKKyAgc291cmNlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmlsZXNyYyIsIE5VTEwpOworICBkZWMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJqcGVnZGVjIiwgTlVMTCk7CisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhcHBzaW5rIiwgTlVMTCk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBzb3VyY2UsIGRlYywgc2luaywgTlVMTCk7CisgIGdzdF9lbGVtZW50X2xpbmtfbWFueSAoc291cmNlLCBkZWMsIHNpbmssIE5VTEwpOworCisgIC8qIHBvaW50IHRoYXQgcGlwZWxpbmUgdG8gb3VyIHRlc3QgaW1hZ2UgKi8KKyAgeworICAgIGNoYXIgKmZpbGVuYW1lID0gZ19idWlsZF9maWxlbmFtZSAoR1NUX1RFU1RfRklMRVNfUEFUSCwgImltYWdlLmpwZyIsIE5VTEwpOworICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNvdXJjZSksICJsb2NhdGlvbiIsIGZpbGVuYW1lLCBOVUxMKTsKKyAgICBnX2ZyZWUgKGZpbGVuYW1lKTsKKyAgfQorCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICBzYW1wbGUgPSBnc3RfYXBwX3NpbmtfcHVsbF9zYW1wbGUgKEdTVF9BUFBfU0lOSyAoc2luaykpOworICBmYWlsX3VubGVzcyAoR1NUX0lTX1NBTVBMRSAoc2FtcGxlKSk7CisKKyAgLyogZG8gc29tZSBiYXNpYyBjaGVja3MgdG8gdmVyaWZ5IGltYWdlIGRlY29kaW5nICovCisgIHsKKyAgICBHc3RDYXBzICpkZWNvZGVkOworICAgIEdzdENhcHMgKmV4cGVjdGVkOworCisgICAgZGVjb2RlZCA9IGdzdF9zYW1wbGVfZ2V0X2NhcHMgKHNhbXBsZSk7CisgICAgZXhwZWN0ZWQgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoInZpZGVvL3gtcmF3LCB3aWR0aD0xMjAsIGhlaWdodD0xNjAiKTsKKworICAgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19pc19hbHdheXNfY29tcGF0aWJsZSAoZGVjb2RlZCwgZXhwZWN0ZWQpKTsKKworICAgIGdzdF9jYXBzX3VucmVmIChleHBlY3RlZCk7CisgIH0KKyAgZ3N0X3NhbXBsZV91bnJlZiAoc2FtcGxlKTsKKworICAvKiB3YWl0IGZvciBFT1MgKi8KKyAgc2FtcGxlID0gZ3N0X2FwcF9zaW5rX3B1bGxfc2FtcGxlIChHU1RfQVBQX1NJTksgKHNpbmspKTsKKyAgZmFpbF91bmxlc3MgKHNhbXBsZSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9hcHBfc2lua19pc19lb3MgKEdTVF9BUFBfU0lOSyAoc2luaykpKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBWZXJpZnkgSlBFRyBkaXNjb3ZlcnkgaXMgd29ya2luZy4gUmlnaHQgbm93IGpwZWdkZWMgd291bGQgYmUgdXNlZCwKKyAqIGJ1dCBJIGhhdmUgbm8gaWRlYSBob3cgdG8gYWN0dWFsbHkgdmVyaWZ5IHRoaXMuICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF9qcGVnZGVjX2Rpc2NvdmVyKQoreworICBHc3REaXNjb3ZlcmVyICpkaXNjbzsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgIGNoYXIgKnVyaTsKKyAgR3N0RGlzY292ZXJlckluZm8gKmluZm87CisgIEdzdERpc2NvdmVyZXJWaWRlb0luZm8gKnZpZGVvOworCisgIGRpc2NvID0gZ3N0X2Rpc2NvdmVyZXJfbmV3ICg1ICogR1NUX1NFQ09ORCwgJmVycm9yKTsKKworICBmYWlsX3VubGVzcyAoR1NUX0lTX0RJU0NPVkVSRVIgKGRpc2NvKSk7CisgIGZhaWxfdW5sZXNzIChlcnJvciA9PSBOVUxMLCAiJXMiLCAoZXJyb3IgPyBlcnJvci0+bWVzc2FnZSA6ICIiKSk7CisKKyAgeworICAgIEdGaWxlICp0ZXN0ZGlyID0gZ19maWxlX25ld19mb3JfcGF0aCAoR1NUX1RFU1RfRklMRVNfUEFUSCk7CisgICAgR0ZpbGUgKnRlc3RmaWxlID0gZ19maWxlX3Jlc29sdmVfcmVsYXRpdmVfcGF0aCAodGVzdGRpciwgImltYWdlLmpwZyIpOworICAgIHVyaSA9IGdfZmlsZV9nZXRfdXJpICh0ZXN0ZmlsZSk7CisgICAgZ19vYmplY3RfdW5yZWYgKHRlc3RmaWxlKTsKKyAgICBnX29iamVjdF91bnJlZiAodGVzdGRpcik7CisgIH0KKworICBpbmZvID0gZ3N0X2Rpc2NvdmVyZXJfZGlzY292ZXJfdXJpIChkaXNjbywgdXJpLCAmZXJyb3IpOworICBmYWlsX3VubGVzcyAoR1NUX0lTX0RJU0NPVkVSRVJfSU5GTyAoaW5mbykpOworICBmYWlsX3VubGVzcyAoZXJyb3IgPT0gTlVMTCwgIiVzOiAlcyIsIHVyaSwgKGVycm9yID8gZXJyb3ItPm1lc3NhZ2UgOiAiIikpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKGdzdF9kaXNjb3ZlcmVyX2luZm9fZ2V0X3VyaSAoaW5mbyksIHVyaSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9kaXNjb3ZlcmVyX2luZm9fZ2V0X3Jlc3VsdCAoaW5mbyksCisgICAgICBHU1RfRElTQ09WRVJFUl9PSyk7CisKKyAgdmlkZW8gPQorICAgICAgR1NUX0RJU0NPVkVSRVJfVklERU9fSU5GTyAoZ3N0X2Rpc2NvdmVyZXJfaW5mb19nZXRfc3RyZWFtX2luZm8gKGluZm8pKTsKKyAgZmFpbF91bmxlc3MgKHZpZGVvICE9IE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZGlzY292ZXJlcl92aWRlb19pbmZvX2lzX2ltYWdlICh2aWRlbykpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZGlzY292ZXJlcl92aWRlb19pbmZvX2dldF93aWR0aCAodmlkZW8pLCAxMjApOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfZGlzY292ZXJlcl92aWRlb19pbmZvX2dldF9oZWlnaHQgKHZpZGVvKSwgMTYwKTsKKworICBnc3RfZGlzY292ZXJlcl9pbmZvX3VucmVmICh2aWRlbyk7CisgIGdzdF9kaXNjb3ZlcmVyX2luZm9fdW5yZWYgKGluZm8pOworICBnX2ZyZWUgKHVyaSk7CisgIGdfb2JqZWN0X3VucmVmIChkaXNjbyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK2pwZWdkZWNfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgianBlZ2RlYyIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9qcGVnZGVjX2V4cGxpY2l0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2pwZWdkZWNfZGlzY292ZXIpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoanBlZ2RlYyk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9qcGVnZW5jLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9qcGVnZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5MWE3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL2pwZWdlbmMuYwpAQCAtMCwwICsxLDI0MCBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBqcGVnZW5jCisgKgorICogQ29weXJpZ2h0IChDKSA8MjAxMD4gVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2FwcC9nc3RhcHBzaW5rLmg+CisKKy8qIEZvciBlYXNlIG9mIHByb2dyYW1taW5nIHdlIHVzZSBnbG9iYWxzIHRvIGtlZXAgcmVmcyBmb3Igb3VyIGZsb2F0aW5nCisgKiBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitzdGF0aWMgR3N0UGFkICpteXNpbmtwYWQ7CitzdGF0aWMgR3N0UGFkICpteXNyY3BhZDsKKworI2RlZmluZSBKUEVHX0NBUFNfU1RSSU5HICJpbWFnZS9qcGVnIgorCisjZGVmaW5lIEpQRUdfQ0FQU19SRVNUUklDVElWRSAiaW1hZ2UvanBlZywgIiBcCisgICAgIndpZHRoID0gKGludCkgWzEwMCwgMjAwXSwgIiBcCisgICAgImZyYW1lcmF0ZSA9IChmcmFjdGlvbikgMjUvMSwgIiBcCisgICAgImV4dHJhcGFyYW1ldGVyID0gKHN0cmluZykgeyBhYmMsIGRlZiB9IgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUganBlZ19zaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKEpQRUdfQ0FQU19TVFJJTkcpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGFueV9zaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIGpwZWdfcmVzdHJpY3RpdmVfc2lua3RlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoSlBFR19DQVBTX1JFU1RSSUNUSVZFKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBhbnlfc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfanBlZ2VuYyAoR3N0U3RhdGljUGFkVGVtcGxhdGUgKiBzaW5rdGVtcGxhdGUpCit7CisgIEdzdEVsZW1lbnQgKmpwZWdlbmM7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfanBlZ2VuYyIpOworICBqcGVnZW5jID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJqcGVnZW5jIik7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoanBlZ2VuYywgc2lua3RlbXBsYXRlKTsKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoanBlZ2VuYywgJmFueV9zcmN0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgcmV0dXJuIGpwZWdlbmM7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX2pwZWdlbmMgKEdzdEVsZW1lbnQgKiBqcGVnZW5jKQoreworICBHU1RfREVCVUcgKCJjbGVhbnVwX2pwZWdlbmMiKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChqcGVnZW5jLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X2NoZWNrX2Ryb3BfYnVmZmVycyAoKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKGpwZWdlbmMpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAoanBlZ2VuYyk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChqcGVnZW5jKTsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitjcmVhdGVfdmlkZW9fYnVmZmVyIChHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEVsZW1lbnQgKmNmOworICBHc3RFbGVtZW50ICpzaW5rOworICBHc3RTYW1wbGUgKnNhbXBsZTsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgcGlwZWxpbmUgPQorICAgICAgZ3N0X3BhcnNlX2xhdW5jaAorICAgICAgKCJ2aWRlb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MSAhIGNhcHNmaWx0ZXIgbmFtZT1jZiAhIGFwcHNpbmsgbmFtZT1zaW5rIiwKKyAgICAgIE5VTEwpOworICBnX2Fzc2VydCAocGlwZWxpbmUgIT0gTlVMTCk7CisKKyAgY2YgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJjZiIpOworICBzaW5rID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAocGlwZWxpbmUpLCAic2luayIpOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGNmKSwgImNhcHMiLCBjYXBzLCBOVUxMKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgc2FtcGxlID0gZ3N0X2FwcF9zaW5rX3B1bGxfc2FtcGxlIChHU1RfQVBQX1NJTksgKHNpbmspKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2luayk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGNmKTsKKworICBidWZmZXIgPSBnc3Rfc2FtcGxlX2dldF9idWZmZXIgKHNhbXBsZSk7CisgIGdzdF9idWZmZXJfcmVmIChidWZmZXIpOworCisgIGdzdF9zYW1wbGVfdW5yZWYgKHNhbXBsZSk7CisKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9qcGVnZW5jX2dldGNhcHMpCit7CisgIEdzdEVsZW1lbnQgKmpwZWdlbmM7CisgIEdzdFBhZCAqc2lua3BhZDsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdpbnQgZnBzX247CisgIGdpbnQgZnBzX2Q7CisgIGNvbnN0IEdWYWx1ZSAqdmFsdWU7CisKKyAgLyogd2UgYXJlIGdvaW5nIHRvIGRvIHNvbWUgZ2V0IGNhcHMgdG8gY29uZmlybSBpdCBkb2Vzbid0IHJldHVybiBub24tc3Vic2V0CisgICAqIGNhcHMgKi8KKworICBqcGVnZW5jID0gc2V0dXBfanBlZ2VuYyAoJmFueV9zaW5rdGVtcGxhdGUpOworICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGpwZWdlbmMsICJzaW5rIik7CisgIC8qIHRoaXMgc2hvdWxkIGFzc2VydCBpZiBub24tc3Vic2V0ICovCisgIGNhcHMgPSBnc3RfcGFkX3F1ZXJ5X2NhcHMgKHNpbmtwYWQsIE5VTEwpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworICBjbGVhbnVwX2pwZWdlbmMgKGpwZWdlbmMpOworCisgIGpwZWdlbmMgPSBzZXR1cF9qcGVnZW5jICgmanBlZ19zaW5rdGVtcGxhdGUpOworICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGpwZWdlbmMsICJzaW5rIik7CisgIC8qIHRoaXMgc2hvdWxkIGFzc2VydCBpZiBub24tc3Vic2V0ICovCisgIGNhcHMgPSBnc3RfcGFkX3F1ZXJ5X2NhcHMgKHNpbmtwYWQsIE5VTEwpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworICBjbGVhbnVwX2pwZWdlbmMgKGpwZWdlbmMpOworCisgIC8qIG5vdyB1c2UgYSBtb3JlIHJlc3RyaWN0ZWQgb25lIGFuZCBjaGVjayB0aGUgcmVzdWx0aW5nIGNhcHMgKi8KKyAganBlZ2VuYyA9IHNldHVwX2pwZWdlbmMgKCZqcGVnX3Jlc3RyaWN0aXZlX3Npbmt0ZW1wbGF0ZSk7CisgIHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoanBlZ2VuYywgInNpbmsiKTsKKyAgLyogdGhpcyBzaG91bGQgYXNzZXJ0IGlmIG5vbi1zdWJzZXQgKi8KKyAgY2FwcyA9IGdzdF9wYWRfcXVlcnlfY2FwcyAoc2lua3BhZCwgTlVMTCk7CisgIHN0cnVjdHVyZSA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworCisgIC8qIGNoZWNrIHRoZSB3aWR0aCAqLworICB2YWx1ZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJ3aWR0aCIpOworICBmYWlsX3VubGVzcyAoZ3N0X3ZhbHVlX2dldF9pbnRfcmFuZ2VfbWluICh2YWx1ZSkgPT0gMTAwKTsKKyAgZmFpbF91bmxlc3MgKGdzdF92YWx1ZV9nZXRfaW50X3JhbmdlX21heCAodmFsdWUpID09IDIwMCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ZyYWN0aW9uIChzdHJ1Y3R1cmUsICJmcmFtZXJhdGUiLCAmZnBzX24sCisgICAgICAgICAgJmZwc19kKSk7CisgIGZhaWxfdW5sZXNzIChmcHNfbiA9PSAyNSk7CisgIGZhaWxfdW5sZXNzIChmcHNfZCA9PSAxKTsKKworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworICBjbGVhbnVwX2pwZWdlbmMgKGpwZWdlbmMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfanBlZ2VuY19kaWZmZXJlbnRfY2FwcykKK3sKKyAgR3N0RWxlbWVudCAqanBlZ2VuYzsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdENhcHMgKmFsbG93ZWRfY2FwczsKKworICAvKiBub3cgdXNlIGEgbW9yZSByZXN0cmljdGVkIG9uZSBhbmQgY2hlY2sgdGhlIHJlc3VsdGluZyBjYXBzICovCisgIGpwZWdlbmMgPSBzZXR1cF9qcGVnZW5jICgmYW55X3Npbmt0ZW1wbGF0ZSk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoanBlZ2VuYywgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIC8qIHB1c2ggZmlyc3QgYnVmZmVyIHdpdGggODAweDYwMCByZXNvbHV0aW9uICovCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1yYXciLCAid2lkdGgiLCBHX1RZUEVfSU5ULAorICAgICAgODAwLCAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgNjAwLCAiZnJhbWVyYXRlIiwKKyAgICAgIEdTVF9UWVBFX0ZSQUNUSU9OLCAxLCAxLCAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIkk0MjAiLCBOVUxMKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIGpwZWdlbmMsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzICgoYnVmZmVyID0gY3JlYXRlX3ZpZGVvX2J1ZmZlciAoY2FwcykpICE9IE5VTEwpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBidWZmZXIpID09IEdTVF9GTE9XX09LKTsKKworICAvKiBjaGVjayB0aGUgYWxsb3dlZCBjYXBzIHRvIHNlZSBpZiBhIHNlY29uZCBidWZmZXIgd2l0aCBhIGRpZmZlcmVudAorICAgKiBjYXBzIGNvdWxkIGJlIG5lZ290aWF0ZWQgKi8KKyAgYWxsb3dlZF9jYXBzID0gZ3N0X3BhZF9nZXRfYWxsb3dlZF9jYXBzIChteXNyY3BhZCk7CisKKyAgLyogdGhlIGNhcHMgd2Ugd2FudCB0byBuZWdvdGlhdGUgdG8gKi8KKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LXJhdyIsICJ3aWR0aCIsIEdfVFlQRV9JTlQsCisgICAgICA2NDAsICJoZWlnaHQiLCBHX1RZUEVfSU5ULCA0ODAsICJmcmFtZXJhdGUiLAorICAgICAgR1NUX1RZUEVfRlJBQ1RJT04sIDEsIDEsICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiSTQyMCIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfY2FuX2ludGVyc2VjdCAoYWxsb3dlZF9jYXBzLCBjYXBzKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3NldF9jYXBzIChteXNyY3BhZCwgY2FwcykpOworCisgIC8qIHB1c2ggc2Vjb25kIGJ1ZmZlciB3aXRoIDY0MHg0ODAgcmVzb2x1dGlvbiAqLworICBidWZmZXIgPSBjcmVhdGVfdmlkZW9fYnVmZmVyIChjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGFsbG93ZWRfY2Fwcyk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoanBlZ2VuYywgR1NUX1NUQVRFX05VTEwpOworICBjbGVhbnVwX2pwZWdlbmMgKGpwZWdlbmMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitqcGVnZW5jX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoImpwZWdlbmMiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfanBlZ2VuY19nZXRjYXBzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2pwZWdlbmNfZGlmZmVyZW50X2NhcHMpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoanBlZ2VuYyk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9sZXZlbC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmRlMGUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvbGV2ZWwuYwpAQCAtMCwwICsxLDYxMiBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBsZXZlbAorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8qIHN1cHByZXNzIHdhcm5pbmdzIGZvciBkZXByZWNhdGVkIEFQSSBzdWNoIGFzIEdWYWx1ZUFycmF5CisgKiB3aXRoIG5ld2VyIEdMaWIgdmVyc2lvbnMgKD49IDIuMzEuMCkgKi8KKyNkZWZpbmUgR0xJQl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisKKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcKKyAqIHNyYyBhbmQgc2luayBwYWRzIHdlIGNyZWF0ZTsgb3RoZXJ3aXNlIHdlIGFsd2F5cyBoYXZlIHRvIGRvIGdldF9wYWQsCisgKiBnZXRfcGVlciwgYW5kIHRoZW4gcmVtb3ZlIHJlZmVyZW5jZXMgaW4gZXZlcnkgdGVzdCBmdW5jdGlvbiAqLworc3RhdGljIEdzdFBhZCAqbXlzcmNwYWQsICpteXNpbmtwYWQ7CisKKyNkZWZpbmUgTEVWRUxfQ0FQU19URU1QTEFURV9TVFJJTkcgXAorICAiYXVkaW8veC1yYXcsICIgXAorICAgICJmb3JtYXQgPSAoc3RyaW5nKSB7ICJHU1RfQVVESU9fTkUoUzE2KSIsICJHU1RfQVVESU9fTkUoRjMyKSIgfSwgIiBcCisgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiIFwKKyAgICAicmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIgXAorICAgICJjaGFubmVscyA9IChpbnQpIFsgMSwgOCBdIgorCisvKiB3ZSB1c2UgcmF0ZSA9IDEwMDAgaGVyZSBmb3IgZWFzeSBidWZmZXIgc2l6ZSBjYWxjdWxhdGlvbnMgKi8KKyNkZWZpbmUgTEVWRUxfUzE2X0NBUFNfU1RSSU5HIFwKKyAgImF1ZGlvL3gtcmF3LCAiIFwKKyAgICAiZm9ybWF0ID0gKHN0cmluZykgIkdTVF9BVURJT19ORShTMTYpIiwgIiBcCisgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiIFwKKyAgICAicmF0ZSA9IChpbnQpIDEwMDAsICIgXAorICAgICJjaGFubmVscyA9IChpbnQpIDIsICIgIFwKKyAgICAiY2hhbm5lbC1tYXNrID0gKGJpdG1hc2spIDMiCisKKyNkZWZpbmUgTEVWRUxfRjMyX0NBUFNfU1RSSU5HIFwKKyAgImF1ZGlvL3gtcmF3LCAiIFwKKyAgICAiZm9ybWF0ID0gKHN0cmluZykgIkdTVF9BVURJT19ORShGMzIpIiwgIiBcCisgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiIFwKKyAgICAicmF0ZSA9IChpbnQpIDEwMDAsICIgXAorICAgICJjaGFubmVscyA9IChpbnQpIDIsICIgIFwKKyAgICAiY2hhbm5lbC1tYXNrID0gKGJpdG1hc2spIDMiCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKExFVkVMX0NBUFNfVEVNUExBVEVfU1RSSU5HKQorICAgICk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChMRVZFTF9DQVBTX1RFTVBMQVRFX1NUUklORykKKyAgICApOworCisvKiB0YWtlcyBvdmVyIHJlZmVyZW5jZSBmb3Igb3V0Y2FwcyAqLworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfbGV2ZWwgKGNvbnN0IGdjaGFyICogY2Fwc19zdHIpCit7CisgIEdzdEVsZW1lbnQgKmxldmVsOworICBHc3RDYXBzICpjYXBzOworCisgIEdTVF9ERUJVRyAoInNldHVwX2xldmVsIik7CisgIGxldmVsID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJsZXZlbCIpOworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChsZXZlbCwgJnNyY3RlbXBsYXRlKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChsZXZlbCwgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChjYXBzX3N0cik7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBsZXZlbCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIHJldHVybiBsZXZlbDsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfbGV2ZWwgKEdzdEVsZW1lbnQgKiBsZXZlbCkKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF9sZXZlbCIpOworCisgIGdzdF9jaGVja19kcm9wX2J1ZmZlcnMgKCk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKGxldmVsKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChsZXZlbCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChsZXZlbCk7Cit9CisKKy8qIGNyZWF0ZSBhIDAuMSBzZWMgYnVmZmVyIHN0ZXJlbyBidWZmZXIgKi8KK3N0YXRpYyBHc3RCdWZmZXIgKgorY3JlYXRlX3MxNl9idWZmZXIgKGdpbnQxNiB2YWxfbCwgZ2ludDE2IHZhbF9yKQoreworICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMiAqIDEwMCAqIHNpemVvZiAoZ2ludDE2KSk7CisgIEdzdE1hcEluZm8gbWFwOworICBnaW50IGo7CisgIGdpbnQxNiAqZGF0YTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgZGF0YSA9IChnaW50MTYgKikgbWFwLmRhdGE7CisgIGZvciAoaiA9IDA7IGogPCAxMDA7ICsraikgeworICAgICooZGF0YSsrKSA9IHZhbF9sOworICAgICooZGF0YSsrKSA9IHZhbF9yOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpID0gR19HVUlOVDY0X0NPTlNUQU5UICgwKTsKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitjcmVhdGVfZjMyX2J1ZmZlciAoZ2Zsb2F0IHZhbF9sLCBnZmxvYXQgdmFsX3IpCit7CisgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgyICogMTAwICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdpbnQgajsKKyAgZ2Zsb2F0ICpkYXRhOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBkYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChqID0gMDsgaiA8IDEwMDsgKytqKSB7CisgICAgKihkYXRhKyspID0gdmFsX2w7CisgICAgKihkYXRhKyspID0gdmFsX3I7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikgPSBHX0dVSU5UNjRfQ09OU1RBTlQgKDApOworICByZXR1cm4gYnVmOworfQorCisvKiB0ZXN0cyAqLworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9yZWZfY291bnRzKQoreworICBHc3RFbGVtZW50ICpsZXZlbDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0QnVzICpidXM7CisgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgbGV2ZWwgPSBzZXR1cF9sZXZlbCAoTEVWRUxfUzE2X0NBUFNfU1RSSU5HKTsKKyAgZ19vYmplY3Rfc2V0IChsZXZlbCwgInBvc3QtbWVzc2FnZXMiLCBUUlVFLAorICAgICAgImludGVydmFsIiwgKGd1aW50NjQpIEdTVF9TRUNPTkQgLyAxMCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGxldmVsLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisgIC8qIGNyZWF0ZSBhIGJ1cyB0byBnZXQgdGhlIGxldmVsIG1lc3NhZ2Ugb24gKi8KKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKGJ1cywgImJ1cyIsIDEpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChsZXZlbCwgYnVzKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoYnVzLCAiYnVzIiwgMik7CisKKyAgLyogY3JlYXRlIGEgZmFrZSAwLjEgc2VjIGJ1ZmZlciB3aXRoIGEgaGFsZi1hbXBsaXR1ZGUgYmxvY2sgc2lnbmFsICovCisgIGluYnVmZmVyID0gY3JlYXRlX3MxNl9idWZmZXIgKDE2NTM2LCAxNjUzNik7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGJ1dCBpdCBlbmRzIHVwIGJlaW5nIGNvbGxlY3RlZCBvbiB0aGUgZ2xvYmFsIGJ1ZmZlciBsaXN0ICovCisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGluYnVmZmVyID09IG91dGJ1ZmZlcik7CisKKyAgbWVzc2FnZSA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9FTEVNRU5ULCAtMSk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKG1lc3NhZ2UsICJtZXNzYWdlIiwgMSk7CisKKyAgZmFpbF91bmxlc3MgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpID09IEdTVF9PQkpFQ1QgKGxldmVsKSk7CisgIGZhaWxfdW5sZXNzIChHU1RfTUVTU0FHRV9UWVBFIChtZXNzYWdlKSA9PSBHU1RfTUVTU0FHRV9FTEVNRU5UKTsKKworICAvKiBjbGVhbiB1cCAqLworICAvKiBmbHVzaCBjdXJyZW50IG1lc3NhZ2VzLGFuZCBmdXR1cmUgc3RhdGUgY2hhbmdlIG1lc3NhZ2VzICovCisgIGdzdF9idXNfc2V0X2ZsdXNoaW5nIChidXMsIFRSVUUpOworCisgIC8qIG1lc3NhZ2UgaGFzIGEgcmVmIHRvIHRoZSBlbGVtZW50ICovCisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKGxldmVsLCAibGV2ZWwiLCAyKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChsZXZlbCwgImxldmVsIiwgMSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAobGV2ZWwsIE5VTEwpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChidXMsICJidXMiLCAxKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobGV2ZWwsCisgICAgICAgICAgR1NUX1NUQVRFX05VTEwpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywgImNvdWxkIG5vdCBzZXQgdG8gbnVsbCIpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChsZXZlbCwgImxldmVsIiwgMSk7CisgIGNsZWFudXBfbGV2ZWwgKGxldmVsKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tZXNzYWdlX2lzX3ZhbGlkKQoreworICBHc3RFbGVtZW50ICpsZXZlbDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlcjsKKyAgR3N0QnVzICpidXM7CisgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisgIGNvbnN0IEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBHc3RDbG9ja1RpbWUgZW5kdGltZSwgdHMsIGR1cmF0aW9uOworCisgIGxldmVsID0gc2V0dXBfbGV2ZWwgKExFVkVMX1MxNl9DQVBTX1NUUklORyk7CisgIGdfb2JqZWN0X3NldCAobGV2ZWwsICJwb3N0LW1lc3NhZ2VzIiwgVFJVRSwKKyAgICAgICJpbnRlcnZhbCIsIChndWludDY0KSBHU1RfU0VDT05EIC8gMTAsIE5VTEwpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGxldmVsLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIC8qIGNyZWF0ZSBhIGJ1cyB0byBnZXQgdGhlIGxldmVsIG1lc3NhZ2Ugb24gKi8KKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGxldmVsLCBidXMpOworCisgIC8qIGNyZWF0ZSBhIGZha2UgMC4xIHNlYyBidWZmZXIgd2l0aCBhIGhhbGYtYW1wbGl0dWRlIGJsb2NrIHNpZ25hbCBhbmQgcHVzaCAqLworICBpbmJ1ZmZlciA9IGNyZWF0ZV9zMTZfYnVmZmVyICgxNjUzNiwgMTY1MzYpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKworICBtZXNzYWdlID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX0VMRU1FTlQsIC0xKTsKKyAgZmFpbF91bmxlc3MgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIHN0cnVjdHVyZSA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1lc3NhZ2UpOworICBmYWlsX2lmIChzdHJ1Y3R1cmUgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSksICJsZXZlbCIpOworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9nZXRfY2xvY2tfdGltZSAoc3RydWN0dXJlLCAiZW5kdGltZSIsICZlbmR0aW1lKSk7CisgIGZhaWxfdW5sZXNzIChnc3Rfc3RydWN0dXJlX2dldF9jbG9ja190aW1lIChzdHJ1Y3R1cmUsICJ0aW1lc3RhbXAiLCAmdHMpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2Nsb2NrX3RpbWUgKHN0cnVjdHVyZSwgImR1cmF0aW9uIiwgJmR1cmF0aW9uKSk7CisKKyAgLyogY2xlYW4gdXAgKi8KKyAgLyogZmx1c2ggY3VycmVudCBtZXNzYWdlcyxhbmQgZnV0dXJlIHN0YXRlIGNoYW5nZSBtZXNzYWdlcyAqLworICBnc3RfYnVzX3NldF9mbHVzaGluZyAoYnVzLCBUUlVFKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChsZXZlbCwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobGV2ZWwsIEdTVF9TVEFURV9OVUxMKTsKKyAgY2xlYW51cF9sZXZlbCAobGV2ZWwpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ludDE2KQoreworICBHc3RFbGVtZW50ICpsZXZlbDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0QnVzICpidXM7CisgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisgIGNvbnN0IEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnaW50IGksIGo7CisgIGNvbnN0IEdWYWx1ZSAqbGlzdCwgKnZhbHVlOworICBnZG91YmxlIGRCOworICBjb25zdCBnY2hhciAqZmllbGRzWzNdID0geyAicm1zIiwgInBlYWsiLCAiZGVjYXkiIH07CisKKyAgbGV2ZWwgPSBzZXR1cF9sZXZlbCAoTEVWRUxfUzE2X0NBUFNfU1RSSU5HKTsKKyAgZ19vYmplY3Rfc2V0IChsZXZlbCwgInBvc3QtbWVzc2FnZXMiLCBUUlVFLAorICAgICAgImludGVydmFsIiwgKGd1aW50NjQpIEdTVF9TRUNPTkQgLyAxMCwgTlVMTCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobGV2ZWwsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgLyogY3JlYXRlIGEgYnVzIHRvIGdldCB0aGUgbGV2ZWwgbWVzc2FnZSBvbiAqLworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAobGV2ZWwsIGJ1cyk7CisKKyAgLyogY3JlYXRlIGEgZmFrZSAwLjEgc2VjIGJ1ZmZlciB3aXRoIGEgaGFsZi1hbXBsaXR1ZGUgYmxvY2sgc2lnbmFsICovCisgIGluYnVmZmVyID0gY3JlYXRlX3MxNl9idWZmZXIgKDE2NTM2LCAxNjUzNik7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChpbmJ1ZmZlciA9PSBvdXRidWZmZXIpOworCisgIG1lc3NhZ2UgPSBnc3RfYnVzX3BvbGwgKGJ1cywgR1NUX01FU1NBR0VfRUxFTUVOVCwgLTEpOworICBzdHJ1Y3R1cmUgPSBnc3RfbWVzc2FnZV9nZXRfc3RydWN0dXJlIChtZXNzYWdlKTsKKworICAvKiBibG9jayB3YXZlIG9mIGhhbGYgYW1wbGl0dWRlIGhhcyAtNS45NCBkQiBmb3Igcm1zLCBwZWFrIGFuZCBkZWNheSAqLworICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgR1ZhbHVlQXJyYXkgKmFycjsKKworICAgICAgbGlzdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsIGZpZWxkc1tqXSk7CisgICAgICBhcnIgPSBnX3ZhbHVlX2dldF9ib3hlZCAobGlzdCk7CisgICAgICB2YWx1ZSA9IGdfdmFsdWVfYXJyYXlfZ2V0X250aCAoYXJyLCBpKTsKKyAgICAgIGRCID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBHU1RfREVCVUcgKCIlcyBpcyAlbGYiLCBmaWVsZHNbal0sIGRCKTsKKyAgICAgIGZhaWxfaWYgKGRCIDwgLTYuMSk7CisgICAgICBmYWlsX2lmIChkQiA+IC01LjkpOworICAgIH0KKyAgfQorCisgIC8qIGNsZWFuIHVwICovCisgIC8qIGZsdXNoIGN1cnJlbnQgbWVzc2FnZXMsYW5kIGZ1dHVyZSBzdGF0ZSBjaGFuZ2UgbWVzc2FnZXMgKi8KKyAgZ3N0X2J1c19zZXRfZmx1c2hpbmcgKGJ1cywgVFJVRSk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAobGV2ZWwsIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGxldmVsLCBHU1RfU1RBVEVfTlVMTCk7CisgIGNsZWFudXBfbGV2ZWwgKGxldmVsKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9pbnQxNl9wYW5uZWQpCit7CisgIEdzdEVsZW1lbnQgKmxldmVsOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RCdXMgKmJ1czsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdpbnQgaSwgajsKKyAgY29uc3QgR1ZhbHVlICpsaXN0LCAqdmFsdWU7CisgIGdkb3VibGUgZEI7CisgIGNvbnN0IGdjaGFyICpmaWVsZHNbM10gPSB7ICJybXMiLCAicGVhayIsICJkZWNheSIgfTsKKworICBsZXZlbCA9IHNldHVwX2xldmVsIChMRVZFTF9TMTZfQ0FQU19TVFJJTkcpOworICBnX29iamVjdF9zZXQgKGxldmVsLCAicG9zdC1tZXNzYWdlcyIsIFRSVUUsCisgICAgICAiaW50ZXJ2YWwiLCAoZ3VpbnQ2NCkgR1NUX1NFQ09ORCAvIDMwLCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChsZXZlbCwgR1NUX1NUQVRFX1BMQVlJTkcpOworICAvKiBjcmVhdGUgYSBidXMgdG8gZ2V0IHRoZSBsZXZlbCBtZXNzYWdlIG9uICovCisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChsZXZlbCwgYnVzKTsKKworICAvKiBjcmVhdGUgYSBmYWtlIDAuMSBzZWMgYnVmZmVyIHdpdGggYSBoYWxmLWFtcGxpdHVkZSBibG9jayBzaWduYWwgKi8KKyAgaW5idWZmZXIgPSBjcmVhdGVfczE2X2J1ZmZlciAoMCwgMTY1MzYpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworICBmYWlsX3VubGVzcyAoaW5idWZmZXIgPT0gb3V0YnVmZmVyKTsKKworICAvKiBkbyBtdWx0aXBsZSBtZXNzYWdlcyBwZXIgYnVmZmVyLCB0byB2ZXJpZnkgdGhhdCB0aGUgaW5uZXIgbG9vcCBpbiBsZXZlbAorICAgKiBhZHZhbmNlcyB0aGUgcmVhZC1pbmRleCBjb3JyZWN0bHksIHNlZQorICAgKiBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU0MTQ0CisgICAqLworICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgR1NUX0RFQlVHICgiZ2V0IG1lc3NhZ2UgbnVtYmVyICVkIiwgaSk7CisgICAgbWVzc2FnZSA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9FTEVNRU5ULCAtMSk7CisgICAgc3RydWN0dXJlID0gZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobWVzc2FnZSk7CisKKyAgICAvKiBzaWxlbmNlIGhhcyAwIGRCIGZvciBybXMsIHBlYWsgYW5kIGRlY2F5ICovCisgICAgZm9yIChqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgR1ZhbHVlQXJyYXkgKmFycjsKKworICAgICAgbGlzdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsIGZpZWxkc1tqXSk7CisgICAgICBhcnIgPSBnX3ZhbHVlX2dldF9ib3hlZCAobGlzdCk7CisgICAgICB2YWx1ZSA9IGdfdmFsdWVfYXJyYXlfZ2V0X250aCAoYXJyLCAwKTsKKyAgICAgIGRCID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBHU1RfREVCVUcgKCIlc1swXSBpcyAlbGYiLCBmaWVsZHNbal0sIGRCKTsKKyNpZmRlZiBIQVZFX0lTSU5GCisgICAgICBmYWlsX3VubGVzcyAoaXNpbmYgKGRCKSk7CisjZWxpZiBkZWZpbmVkIChIQVZFX0ZQQ0xBU1MpCisgICAgICBmYWlsX3VubGVzcyAoZnBjbGFzcyAoZEIpID09IEZQX05JTkYpOworI2VuZGlmCisgICAgfQorICAgIC8qIGJsb2NrIHdhdmUgb2YgaGFsZiBhbXBsaXR1ZGUgaGFzIC01Ljk0IGRCIGZvciBybXMsIHBlYWsgYW5kIGRlY2F5ICovCisgICAgZm9yIChqID0gMDsgaiA8IDM7ICsraikgeworICAgICAgR1ZhbHVlQXJyYXkgKmFycjsKKworICAgICAgbGlzdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsIGZpZWxkc1tqXSk7CisgICAgICBhcnIgPSBnX3ZhbHVlX2dldF9ib3hlZCAobGlzdCk7CisgICAgICB2YWx1ZSA9IGdfdmFsdWVfYXJyYXlfZ2V0X250aCAoYXJyLCAxKTsKKyAgICAgIGRCID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICBHU1RfREVCVUcgKCIlc1sxXSBpcyAlbGYiLCBmaWVsZHNbal0sIGRCKTsKKyAgICAgIGZhaWxfaWYgKGRCIDwgLTYuMSk7CisgICAgICBmYWlsX2lmIChkQiA+IC01LjkpOworICAgIH0KKyAgICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIH0KKworICAvKiBjbGVhbiB1cCAqLworICAvKiBmbHVzaCBjdXJyZW50IG1lc3NhZ2VzLGFuZCBmdXR1cmUgc3RhdGUgY2hhbmdlIG1lc3NhZ2VzICovCisgIGdzdF9idXNfc2V0X2ZsdXNoaW5nIChidXMsIFRSVUUpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChsZXZlbCwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobGV2ZWwsIEdTVF9TVEFURV9OVUxMKTsKKyAgY2xlYW51cF9sZXZlbCAobGV2ZWwpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2Zsb2F0KQoreworICBHc3RFbGVtZW50ICpsZXZlbDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0QnVzICpidXM7CisgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisgIGNvbnN0IEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBnaW50IGksIGo7CisgIGNvbnN0IEdWYWx1ZSAqbGlzdCwgKnZhbHVlOworICBnZG91YmxlIGRCOworICBjb25zdCBnY2hhciAqZmllbGRzWzNdID0geyAicm1zIiwgInBlYWsiLCAiZGVjYXkiIH07CisKKyAgbGV2ZWwgPSBzZXR1cF9sZXZlbCAoTEVWRUxfRjMyX0NBUFNfU1RSSU5HKTsKKyAgZ19vYmplY3Rfc2V0IChsZXZlbCwgInBvc3QtbWVzc2FnZXMiLCBUUlVFLAorICAgICAgImludGVydmFsIiwgKGd1aW50NjQpIEdTVF9TRUNPTkQgLyAxMCwgTlVMTCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobGV2ZWwsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgLyogY3JlYXRlIGEgYnVzIHRvIGdldCB0aGUgbGV2ZWwgbWVzc2FnZSBvbiAqLworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAobGV2ZWwsIGJ1cyk7CisKKyAgLyogY3JlYXRlIGEgZmFrZSAwLjEgc2VjIGJ1ZmZlciB3aXRoIGEgaGFsZi1hbXBsaXR1ZGUgYmxvY2sgc2lnbmFsICovCisgIGluYnVmZmVyID0gY3JlYXRlX2YzMl9idWZmZXIgKDAuNSwgMC41KTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGluYnVmZmVyID09IG91dGJ1ZmZlcik7CisKKyAgbWVzc2FnZSA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9FTEVNRU5ULCAtMSk7CisgIHN0cnVjdHVyZSA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1lc3NhZ2UpOworCisgIC8qIGJsb2NrIHdhdmUgb2YgaGFsZiBhbXBsaXR1ZGUgaGFzIC01Ljk0IGRCIGZvciBybXMsIHBlYWsgYW5kIGRlY2F5ICovCisgIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBHVmFsdWVBcnJheSAqYXJyOworCisgICAgICBsaXN0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgZmllbGRzW2pdKTsKKyAgICAgIGFyciA9IGdfdmFsdWVfZ2V0X2JveGVkIChsaXN0KTsKKyAgICAgIHZhbHVlID0gZ192YWx1ZV9hcnJheV9nZXRfbnRoIChhcnIsIGkpOworICAgICAgZEIgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVRyAoIiVzIGlzICVsZiIsIGZpZWxkc1tqXSwgZEIpOworICAgICAgZmFpbF9pZiAoZEIgPCAtNi4xKTsKKyAgICAgIGZhaWxfaWYgKGRCID4gLTUuOSk7CisgICAgfQorICB9CisKKyAgLyogY2xlYW4gdXAgKi8KKyAgLyogZmx1c2ggY3VycmVudCBtZXNzYWdlcyxhbmQgZnV0dXJlIHN0YXRlIGNoYW5nZSBtZXNzYWdlcyAqLworICBnc3RfYnVzX3NldF9mbHVzaGluZyAoYnVzLCBUUlVFKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChsZXZlbCwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobGV2ZWwsIEdTVF9TVEFURV9OVUxMKTsKKyAgY2xlYW51cF9sZXZlbCAobGV2ZWwpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X21lc3NhZ2Vfb25fZW9zKQoreworICBHc3RFbGVtZW50ICpsZXZlbDsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0RXZlbnQgKmV2ZW50OworICBHc3RCdXMgKmJ1czsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdpbnQgaSwgajsKKyAgY29uc3QgR1ZhbHVlICpsaXN0LCAqdmFsdWU7CisgIGdkb3VibGUgZEI7CisKKyAgbGV2ZWwgPSBzZXR1cF9sZXZlbCAoTEVWRUxfUzE2X0NBUFNfU1RSSU5HKTsKKyAgZ19vYmplY3Rfc2V0IChsZXZlbCwgInBvc3QtbWVzc2FnZXMiLCBUUlVFLAorICAgICAgImludGVydmFsIiwgKGd1aW50NjQpIEdTVF9TRUNPTkQgLyA1LCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChsZXZlbCwgR1NUX1NUQVRFX1BMQVlJTkcpOworICAvKiBjcmVhdGUgYSBidXMgdG8gZ2V0IHRoZSBsZXZlbCBtZXNzYWdlIG9uICovCisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChsZXZlbCwgYnVzKTsKKworICAvKiBjcmVhdGUgYSBmYWtlIDAuMSBzZWMgYnVmZmVyIHdpdGggYSBoYWxmLWFtcGxpdHVkZSBibG9jayBzaWduYWwgKi8KKyAgaW5idWZmZXIgPSBjcmVhdGVfczE2X2J1ZmZlciAoMTY1MzYsIDE2NTM2KTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGluYnVmZmVyID09IG91dGJ1ZmZlcik7CisKKyAgbWVzc2FnZSA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9FTEVNRU5ULCAwKTsKKworICBldmVudCA9IGdzdF9ldmVudF9uZXdfZW9zICgpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZXZlbnQpID09IFRSVUUpOworCisgIG1lc3NhZ2UgPSBnc3RfYnVzX3BvbGwgKGJ1cywgR1NUX01FU1NBR0VfRUxFTUVOVCwgMCk7CisgIGZhaWxfdW5sZXNzIChtZXNzYWdlICE9IE5VTEwpOworICBzdHJ1Y3R1cmUgPSBnc3RfbWVzc2FnZV9nZXRfc3RydWN0dXJlIChtZXNzYWdlKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3RydWN0dXJlKSwgImxldmVsIik7CisKKyAgLyogYmxvY2sgd2F2ZSBvZiBoYWxmIGFtcGxpdHVkZSBoYXMgLTUuOTQgZEIgZm9yIHJtcywgcGVhayBhbmQgZGVjYXkgKi8KKyAgZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGNvbnN0IGdjaGFyICpmaWVsZHNbM10gPSB7ICJybXMiLCAicGVhayIsICJkZWNheSIgfTsKKyAgICBmb3IgKGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBHVmFsdWVBcnJheSAqYXJyOworCisgICAgICBsaXN0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgZmllbGRzW2pdKTsKKyAgICAgIGFyciA9IGdfdmFsdWVfZ2V0X2JveGVkIChsaXN0KTsKKyAgICAgIHZhbHVlID0gZ192YWx1ZV9hcnJheV9nZXRfbnRoIChhcnIsIGkpOworICAgICAgZEIgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKyAgICAgIEdTVF9ERUJVRyAoIiVzIGlzICVsZiIsIGZpZWxkc1tqXSwgZEIpOworICAgICAgZmFpbF9pZiAoZEIgPCAtNi4xKTsKKyAgICAgIGZhaWxfaWYgKGRCID4gLTUuOSk7CisgICAgfQorICB9CisKKyAgLyogY2xlYW4gdXAgKi8KKyAgLyogZmx1c2ggY3VycmVudCBtZXNzYWdlcyxhbmQgZnV0dXJlIHN0YXRlIGNoYW5nZSBtZXNzYWdlcyAqLworICBnc3RfYnVzX3NldF9mbHVzaGluZyAoYnVzLCBUUlVFKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChsZXZlbCwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobGV2ZWwsIEdTVF9TVEFURV9OVUxMKTsKKyAgY2xlYW51cF9sZXZlbCAobGV2ZWwpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X21lc3NhZ2VfY291bnQpCit7CisgIEdzdEVsZW1lbnQgKmxldmVsOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RCdXMgKmJ1czsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKworICBsZXZlbCA9IHNldHVwX2xldmVsIChMRVZFTF9TMTZfQ0FQU19TVFJJTkcpOworICBnX29iamVjdF9zZXQgKGxldmVsLCAicG9zdC1tZXNzYWdlcyIsIFRSVUUsCisgICAgICAiaW50ZXJ2YWwiLCAoZ3VpbnQ2NCkgR1NUX1NFQ09ORCAvIDIwLCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChsZXZlbCwgR1NUX1NUQVRFX1BMQVlJTkcpOworICAvKiBjcmVhdGUgYSBidXMgdG8gZ2V0IHRoZSBsZXZlbCBtZXNzYWdlIG9uICovCisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChsZXZlbCwgYnVzKTsKKworICAvKiBjcmVhdGUgYSBmYWtlIDAuMSBzZWMgYnVmZmVyIHdpdGggYSBoYWxmLWFtcGxpdHVkZSBibG9jayBzaWduYWwgKi8KKyAgaW5idWZmZXIgPSBjcmVhdGVfczE2X2J1ZmZlciAoMTY1MzYsIDE2NTM2KTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGluYnVmZmVyID09IG91dGJ1ZmZlcik7CisKKyAgLyogd2Ugc2hvdWxkIGdldCB0d28gbWVzc2FnZXMgcGVyIGJ1ZmZlciAqLworICBtZXNzYWdlID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX0VMRU1FTlQsIC0xKTsKKyAgZmFpbF91bmxlc3MgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgbWVzc2FnZSA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9FTEVNRU5ULCAtMSk7CisgIGZhaWxfdW5sZXNzIChtZXNzYWdlICE9IE5VTEwpOworICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAobGV2ZWwsIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGxldmVsLCBHU1RfU1RBVEVfTlVMTCk7CisgIGNsZWFudXBfbGV2ZWwgKGxldmVsKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tZXNzYWdlX3RpbWVzdGFtcHMpCit7CisgIEdzdEVsZW1lbnQgKmxldmVsOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RCdXMgKmJ1czsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIEdzdENsb2NrVGltZSB0czEsIGR1cjEsIHRzMjsKKworICBsZXZlbCA9IHNldHVwX2xldmVsIChMRVZFTF9TMTZfQ0FQU19TVFJJTkcpOworICBnX29iamVjdF9zZXQgKGxldmVsLCAicG9zdC1tZXNzYWdlcyIsIFRSVUUsCisgICAgICAiaW50ZXJ2YWwiLCAoZ3VpbnQ2NCkgR1NUX1NFQ09ORCAvIDIwLCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChsZXZlbCwgR1NUX1NUQVRFX1BMQVlJTkcpOworICAvKiBjcmVhdGUgYSBidXMgdG8gZ2V0IHRoZSBsZXZlbCBtZXNzYWdlIG9uICovCisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChsZXZlbCwgYnVzKTsKKworICAvKiBjcmVhdGUgYSBmYWtlIDAuMSBzZWMgYnVmZmVyIHdpdGggYSBoYWxmLWFtcGxpdHVkZSBibG9jayBzaWduYWwgKi8KKyAgaW5idWZmZXIgPSBjcmVhdGVfczE2X2J1ZmZlciAoMTY1MzYsIDE2NTM2KTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGluYnVmZmVyID09IG91dGJ1ZmZlcik7CisKKyAgLyogY2hlY2sgdGhhdCB0aW1lc3RhbXAgKyBkdXJhdGlvbiBpcyBjb250aWdvdXMgdG8gdGhlIG5leHQgdGltZXN0YW1wICovCisgIG1lc3NhZ2UgPSBnc3RfYnVzX3BvbGwgKGJ1cywgR1NUX01FU1NBR0VfRUxFTUVOVCwgLTEpOworICBzdHJ1Y3R1cmUgPSBnc3RfbWVzc2FnZV9nZXRfc3RydWN0dXJlIChtZXNzYWdlKTsKKyAgZ3N0X3N0cnVjdHVyZV9nZXRfY2xvY2tfdGltZSAoc3RydWN0dXJlLCAidGltZXN0YW1wIiwgJnRzMSk7CisgIGdzdF9zdHJ1Y3R1cmVfZ2V0X2Nsb2NrX3RpbWUgKHN0cnVjdHVyZSwgImR1cmF0aW9uIiwgJmR1cjEpOworICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgbWVzc2FnZSA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9FTEVNRU5ULCAtMSk7CisgIHN0cnVjdHVyZSA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1lc3NhZ2UpOworICBnc3Rfc3RydWN0dXJlX2dldF9jbG9ja190aW1lIChzdHJ1Y3R1cmUsICJ0aW1lc3RhbXAiLCAmdHMyKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQ2NCAodHMxICsgZHVyMSwgdHMyKTsKKworICBnc3RfZWxlbWVudF9zZXRfYnVzIChsZXZlbCwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobGV2ZWwsIEdTVF9TVEFURV9OVUxMKTsKKyAgY2xlYW51cF9sZXZlbCAobGV2ZWwpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitsZXZlbF9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJsZXZlbCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9yZWZfY291bnRzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X21lc3NhZ2VfaXNfdmFsaWQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaW50MTYpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaW50MTZfcGFubmVkKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2Zsb2F0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X21lc3NhZ2Vfb25fZW9zKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X21lc3NhZ2VfY291bnQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbWVzc2FnZV90aW1lc3RhbXBzKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGxldmVsKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thZGVtdXguYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thZGVtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDgxYzg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FkZW11eC5jCkBAIC0wLDAgKzEsMzIzIEBACisvKiBHU3RyZWFtZXIgdW5pdCB0ZXN0IGZvciBtYXRyb3NrYWRlbXV4CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGhhcm5lc3MuaD4KKworY29uc3QgZ2NoYXIgbWt2X3N1Yl9iYXNlNjRbXSA9CisgICAgIkdrWGZvd0VBQUFBQUFBQVVRb0tKYldGMGNtOXphMkVBUW9lQkFrS0ZnUUlZVTRCbkFRQUFBQUFBQWcwUlRadDBBUUFBQUFBQUFJeE4iCisgICAgInV3RUFBQUFBQUFBU1U2dUVGVW1wWmxPc2lBQUFBQUFBQUFDWVRic0JBQUFBQUFBQUVsT3JoQlpVcm10VHJJZ0FBQUFBQUFBQkV1eWEiCisgICAgIkFRQUFBQUFBQUJKVHE0UVFRNmR3VTZ5SS8vLy8vLy8vLy8vc21nRUFBQUFBQUFBU1U2dUVIRk83YTFPc2lQLy8vLy8vLy8vL1Ric0IiCisgICAgIkFBQUFBQUFBRWxPcmhCSlV3MmRUcklnQUFBQUFBQUFCOXhWSnFXWUJBQUFBQUFBQWJuT2trRHlsUVpKbHJMemlRbzgrZ3NyWlZ0VXEiCisgICAgIjE3R0REMEpBUkltSVFOR1VBQUFBQUFCTmdKOUhVM1J5WldGdFpYSWdjR3gxWjJsdUlIWmxjbk5wYjI0Z01TNDBMalVBVjBHWlIxTjAiCisgICAgImNtVmhiV1Z5SUUxaGRISnZjMnRoSUcxMWVHVnlBRVJoaUFaZlUwcmNFd2dBRmxTdWF3RUFBQUFBQUFBMHJnRUFBQUFBQUFBcjE0RUIiCisgICAgImc0RVJjOFdJb1dGOHBZbEVMaWRUYm9sVGRXSjBhWFJzWlFDR2pGTmZWRVZZVkM5VlZFWTRBQjlEdG5VQkFBQUFBQUFBbWVlQ0EraWciCisgICAgIkFRQUFBQUFBQUEyYmdnZlFvWWVCQUFBQVptOXZvQUVBQUFBQUFBQVVtNElIMEtHT2dRdTRBRHhwUG1KaGNqd3ZhVDZnQVFBQUFBQUEiCisgICAgIkFBMmJnZ2ZRb1llQkYzQUFZbUY2b0FFQUFBQUFBQUFPbTRJSDBLR0lnU2NRQUdiRHRnQ2dBUUFBQUFBQUFCV2JnZ2ZRb1krQk1zZ0EiCisgICAgIlBHaytZbUZ5UEM5cFBnQ2dBUUFBQUFBQUFBNmJnZ2ZRb1lpQlBvQUFZdVI2QUJKVXcyY0JBQUFBQUFBQUNuTnpBUUFBQUFBQUFBQT0iOworCitjb25zdCBnY2hhciBta3ZfdG9jX2Jhc2U2NFtdID0KKyAgICAiR2tYZm93RUFBQUFBQUFBVVFvS0piV0YwY205emEyRUFRb2VCQVVLRmdRRVlVNEJuQVFBQUFBQUFCVW9SVFp0MEFRQUFBQUFBQUl4TiIKKyAgICAidXdFQUFBQUFBQUFTVTZ1RUZVbXBabE9zaUFBQUFBQUFBQUNZVGJzQkFBQUFBQUFBRWxPcmhCWlVybXRUcklnQUFBQUFBQUFCR2syNyIKKyAgICAiQVFBQUFBQUFBQkpUcTRRUVE2ZHdVNnlJQUFBQUFBQUFBV0ZOdXdFQUFBQUFBQUFTVTZ1RUhGTzdhMU9zaUFBQUFBQUFBQU5yVGJzQiIKKyAgICAiQUFBQUFBQUFFbE9yaEJKVXcyZFRySWdBQUFBQUFBQURreFZKcVdZQkFBQUFBQUFBZG5Pa2tGZEpyWkFIN1lZNU1DdkpHUHdsNUU0cSIKKyAgICAiMTdHREQwSkFSSW1JUC9BQUFBQUFBQUJOZ0tkSFUzUnlaV0Z0WlhJZ2JXRjBjbTl6YTJGdGRYZ2dkbVZ5YzJsdmJpQXhMakV6TGpBdSIKKyAgICAiTVFCWFFabEhVM1J5WldGdFpYSWdUV0YwY205emEyRWdiWFY0WlhJQVJHR0lCMmlIMTJONURnQVdWSzVyQVFBQUFBQUFBRHV1QVFBQSIKKyAgICAiQUFBQUFETFhnUUdEZ1FKenhZZ0ppeFFhK1podlBTUGpnNE1QUWtCVGJvWkJkV1JwYndEaEFRQUFBQUFBQUFDR2hrRmZRVU16QUJCRCIKKyAgICAicDNBQkFBQUFBQUFCMzBXNUFRQUFBQUFBQWRWRnZJaTNEdVM0VFdlRlhVVzlnUUJGMjRFQVJkMkJBTFlCQUFBQUFBQUExSFBFaU9WMCIKKyAgICAiTDhlZXYrd2dWbFNHZFdsa0xqRUFrWUVBa29NZWhJQ1lnUUJGbUlFQmdBRUFBQUFBQUFBUWhZZGphR0Z3TGpFQVEzeUVkVzVrQUxZQiIKKyAgICAiQUFBQUFBQUFRblBFaUNXNWFqcEhSenl6VmxTSWRXbGtMakV1TVFDUmdRQ1NndzlDUUppQkFFV1lnUUdBQVFBQUFBQUFBQlNGaTI1bCIKKyAgICAiYzNSbFpDNHhMakVBUTN5RWRXNWtBTFlCQUFBQUFBQUFSSFBFaUE5a2xGcXRHa0JvVmxTSWRXbGtMakV1TWdDUmd3OUNRSktESG9TQSIKKyAgICAibUlFQVJaaUJBWUFCQUFBQUFBQUFGSVdMYm1WemRHVmtMekV1TWdCRGZJUjFibVFBdGdFQUFBQUFBQURZYzhTSWV1NFFScmpzY2R0VyIKKyAgICAiVklaMWFXUXVNZ0NSZ3g2RWdKS0RQUWtBbUlFQVJaaUJBWUFCQUFBQUFBQUFFSVdIWTJoaGNDNHlBRU44aEhWdVpBQzJBUUFBQUFBQSIKKyAgICAiQUVSenhJaWs3N0RNS3FSeXpGWlVpSFZwWkM0eUxqRUFrWU1laElDU2d5M0d3SmlCQUVXWWdRR0FBUUFBQUFBQUFCU0ZpMjVsYzNSbCIKKyAgICAiWkM0eUxqRUFRM3lFZFc1a0FMWUJBQUFBQUFBQVJIUEVpRHZ3dCs1K1Yxa3RWbFNJZFdsa0xqSXVNZ0NSZ3kzR3dKS0RQUWtBbUlFQSIKKyAgICAiUlppQkFZQUJBQUFBQUFBQUZJV0xibVZ6ZEdWa0x6SXVNZ0JEZklSMWJtUUFIME8yZFFFQUFBQUFBQUFUNTRFQW9BRUFBQUFBQUFBSCIKKyAgICAib1lXQkFBQUFBQnhUdTJzQkFBQUFBQUFBSExzQkFBQUFBQUFBRTdPQkFMY0JBQUFBQUFBQUIvZUJBZkdDQTB3U1ZNTm5BUUFBQUFBQSIKKyAgICAiQWF0emN3RUFBQUFBQUFBeFk4QUJBQUFBQUFBQUMyUEppTGNPNUxoTlo0VmRaOGdCQUFBQUFBQUFFa1dqaVVOUFRVMUZUbFJUQUVTSCIKKyAgICAiZzBWa0FITnpBUUFBQUFBQUFESmp3QUVBQUFBQUFBQUxZOFNJNVhRdng1Ni83Q0JueUFFQUFBQUFBQUFUUmFPSFFWSlVTVk5VQUVTSCIKKyAgICAiaG1GeWRDNHhBSE56QVFBQUFBQUFBRFJqd0FFQUFBQUFBQUFMWThTSUpibHFPa2RIUExObnlBRUFBQUFBQUFBVlJhT0hRVkpVU1ZOVSIKKyAgICAiQUVTSGlHRnlkQzR4TGpFQWMzTUJBQUFBQUFBQU5HUEFBUUFBQUFBQUFBdGp4SWdQWkpSYXJScEFhR2ZJQVFBQUFBQUFBQlZGbzRkQiIKKyAgICAiVWxSSlUxUUFSSWVJWVhKMExqRXVNZ0J6Y3dFQUFBQUFBQUF5WThBQkFBQUFBQUFBQzJQRWlIcnVFRWE0N0hIYlo4Z0JBQUFBQUFBQSIKKyAgICAiRTBXamgwRlNWRWxUVkFCRWg0WmhjblF1TWdCemN3RUFBQUFBQUFBMFk4QUJBQUFBQUFBQUMyUEVpS1R2c013cXBITE1aOGdCQUFBQSIKKyAgICAiQUFBQUZVV2poMEZTVkVsVFZBQkVoNGhoY25RdU1pNHhBSE56QVFBQUFBQUFBRFJqd0FFQUFBQUFBQUFMWThTSU8vQzM3bjVYV1MxbiIKKyAgICAieUFFQUFBQUFBQUFWUmFPSFFWSlVTVk5VQUVTSGlHRnlkQzR5TGpJQSI7CisKK3N0YXRpYyB2b2lkCitwYWRfYWRkZWRfY2IgKEdzdEVsZW1lbnQgKiBtYXRyb3NrYWRlbXV4LCBHc3RQYWQgKiBwYWQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0SGFybmVzcyAqaCA9IHVzZXJfZGF0YTsKKworICBHU1RfTE9HX09CSkVDVCAocGFkLCAiZ290IG5ldyBzb3VyY2UgcGFkIik7CisgIGdzdF9oYXJuZXNzX2FkZF9lbGVtZW50X3NyY19wYWQgKGgsIHBhZCk7Cit9CisKK3N0YXRpYyB2b2lkCitwdWxsX2FuZF9jaGVja19idWZmZXIgKEdzdEhhcm5lc3MgKiBoLCBHc3RDbG9ja1RpbWUgcHRzLCBHc3RDbG9ja1RpbWUgZHVyYXRpb24sCisgICAgY29uc3QgZ2NoYXIgKiBvdXRwdXQpCit7CisgIEdzdE1hcEluZm8gbWFwOworICBHc3RCdWZmZXIgKmJ1ZjsKKworICAvKiB3YWl0IGZvciBidWZmZXIgKi8KKyAgYnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisKKyAgLyogTWFrZSBzdXJlIHRoZXJlJ3Mgbm8gMC10ZXJtaW5hdG9yIGluIHRoZXJlICovCisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpKTsKKyAgR1NUX01FTURVTVAgKCJzdWJ0aXRsZSBidWZmZXIiLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICBmYWlsX3VubGVzcyAobWFwLnNpemUgPiAwKTsKKyAgZmFpbF91bmxlc3MgKG1hcC5kYXRhW21hcC5zaXplIC0gMV0gIT0gJ1wwJyk7CisgIGlmIChvdXRwdXQgIT0gTlVMTCAmJiBtZW1jbXAgKG1hcC5kYXRhLCBvdXRwdXQsIG1hcC5zaXplKSAhPSAwKSB7CisgICAgZ19wcmludGVyciAoIkdvdDpcbiIpOworICAgIGdzdF91dGlsX2R1bXBfbWVtIChtYXAuZGF0YSwgbWFwLnNpemUpOzsKKyAgICBnX3ByaW50ZXJyICgiV2FudGVkOlxuIik7CisgICAgZ3N0X3V0aWxfZHVtcF9tZW0gKChndWludDggKikgb3V0cHV0LCBzdHJsZW4gKG91dHB1dCkpOworICAgIGdfZXJyb3IgKCJEaWQgbm90IGdldCBvdXRwdXQgZXhwZWN0ZWQuIik7CisgIH0KKworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQ2NCAocHRzLCBHU1RfQlVGRkVSX1BUUyAoYnVmKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQ2NCAoZHVyYXRpb24sIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikpOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3N1Yl90ZXJtaW5hdG9yKQoreworICBHc3RIYXJuZXNzICpoOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgZ3VjaGFyICpta3ZfZGF0YTsKKyAgZ3NpemUgbWt2X3NpemU7CisKKyAgaCA9IGdzdF9oYXJuZXNzX25ld193aXRoX3BhZG5hbWVzICgibWF0cm9za2FkZW11eCIsICJzaW5rIiwgTlVMTCk7CisKKyAgZ19zaWduYWxfY29ubmVjdCAoaC0+ZWxlbWVudCwgInBhZC1hZGRlZCIsIEdfQ0FMTEJBQ0sgKHBhZF9hZGRlZF9jYiksIGgpOworCisgIG1rdl9kYXRhID0gZ19iYXNlNjRfZGVjb2RlIChta3Zfc3ViX2Jhc2U2NCwgJm1rdl9zaXplKTsKKyAgZmFpbF91bmxlc3MgKG1rdl9kYXRhICE9IE5VTEwpOworCisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgsICJ2aWRlby94LW1hdHJvc2thIik7CisKKyAgYnVmID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAobWt2X2RhdGEsIG1rdl9zaXplKTsKKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZikgPSAwOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCBnc3RfaGFybmVzc19wdXNoIChoLCBidWYpKTsKKyAgZ3N0X2hhcm5lc3NfcHVzaF9ldmVudCAoaCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworCisgIHB1bGxfYW5kX2NoZWNrX2J1ZmZlciAoaCwgMSAqIEdTVF9TRUNPTkQsIDIgKiBHU1RfU0VDT05ELCAiZm9vIik7CisgIHB1bGxfYW5kX2NoZWNrX2J1ZmZlciAoaCwgNCAqIEdTVF9TRUNPTkQsIDIgKiBHU1RfU0VDT05ELCAiPGk+YmFyPC9pPiIpOworICBwdWxsX2FuZF9jaGVja19idWZmZXIgKGgsIDcgKiBHU1RfU0VDT05ELCAyICogR1NUX1NFQ09ORCwgImJheiIpOworICBwdWxsX2FuZF9jaGVja19idWZmZXIgKGgsIDExICogR1NUX1NFQ09ORCwgMiAqIEdTVF9TRUNPTkQsICJmXDMwM1wyNjYiKTsKKyAgcHVsbF9hbmRfY2hlY2tfYnVmZmVyIChoLCAxNCAqIEdTVF9TRUNPTkQsIDIgKiBHU1RfU0VDT05ELCAiPGk+YmFyPC9pPiIpOworICAvKiBUaGUgaW5wdXQgaXMgaW52YWxpZCBVVEYtOCBoZXJlLCB3aGF0IGhhcHBlbnMgbWlnaHQgZGVwZW5kIG9uIGxvY2FsZSAqLworICBwdWxsX2FuZF9jaGVja19idWZmZXIgKGgsIDE3ICogR1NUX1NFQ09ORCwgMiAqIEdTVF9TRUNPTkQsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfaGFybmVzc190cnlfcHVsbCAoaCkgPT0gTlVMTCk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgMiB0b2MgZW50cmllcyAqLworc3RhdGljIHZvaWQKK2NoZWNrX3RvY19lbnRyaWVzIChjb25zdCBHc3RUb2NFbnRyeSAqIG9yaWdpbmFsLCBjb25zdCBHc3RUb2NFbnRyeSAqIG90aGVyKQoreworICBnaW50NjQgc3RhcnQsIHN0b3AsIG90aGVyX3N0YXJ0LCBvdGhlcl9zdG9wOworICBHc3RUb2NFbnRyeVR5cGUgb3JpZ2luYWxfdHlwZSwgb3RoZXJfdHlwZTsKKyAgY29uc3QgZ2NoYXIgKm9yaWdpbmFsX3N0cmluZ191aWQgPSBOVUxMLCAqb3RoZXJfc3RyaW5nX3VpZCA9IE5VTEw7CisgIEdzdFRhZ0xpc3QgKm9yaWdpbmFsX3RhZ3MsICpvdGhlcl90YWdzOworICBHTGlzdCAqY3VyLCAqb3RoZXJfY3VyOworCisgIG9yaWdpbmFsX3R5cGUgPSBnc3RfdG9jX2VudHJ5X2dldF9lbnRyeV90eXBlIChvcmlnaW5hbCk7CisgIG90aGVyX3R5cGUgPSBnc3RfdG9jX2VudHJ5X2dldF9lbnRyeV90eXBlIChvdGhlcik7CisgIGZhaWxfdW5sZXNzIChvcmlnaW5hbF90eXBlID09IG90aGVyX3R5cGUpOworCisgIGlmIChvcmlnaW5hbF90eXBlICE9IEdTVF9UT0NfRU5UUllfVFlQRV9FRElUSU9OKSB7CisgICAgb3JpZ2luYWxfc3RyaW5nX3VpZCA9IGdzdF90b2NfZW50cnlfZ2V0X3VpZCAob3JpZ2luYWwpOworICAgIG90aGVyX3N0cmluZ191aWQgPSBnc3RfdG9jX2VudHJ5X2dldF91aWQgKG90aGVyKTsKKyAgICBmYWlsX3VubGVzcyAoZ19zdHJjbXAwIChvcmlnaW5hbF9zdHJpbmdfdWlkLCBvdGhlcl9zdHJpbmdfdWlkKSA9PSAwKTsKKyAgfQorCisgIGlmIChvcmlnaW5hbF90eXBlICE9IEdTVF9UT0NfRU5UUllfVFlQRV9FRElUSU9OKSB7CisgICAgZ3N0X3RvY19lbnRyeV9nZXRfc3RhcnRfc3RvcF90aW1lcyAob3JpZ2luYWwsICZzdGFydCwgJnN0b3ApOworICAgIGdzdF90b2NfZW50cnlfZ2V0X3N0YXJ0X3N0b3BfdGltZXMgKG90aGVyLCAmb3RoZXJfc3RhcnQsICZvdGhlcl9zdG9wKTsKKworICAgIGZhaWxfdW5sZXNzIChzdGFydCA9PSBvdGhlcl9zdGFydCAmJiBzdG9wID09IG90aGVyX3N0b3ApOworICB9CisKKyAgLyogdGFncyAqLworICBvcmlnaW5hbF90YWdzID0gZ3N0X3RvY19lbnRyeV9nZXRfdGFncyAob3JpZ2luYWwpOworICBvdGhlcl90YWdzID0gZ3N0X3RvY19lbnRyeV9nZXRfdGFncyAob3RoZXIpOworICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2lzX2VxdWFsIChvcmlnaW5hbF90YWdzLCBvdGhlcl90YWdzKSk7CisKKyAgb3RoZXJfY3VyID0gZ3N0X3RvY19lbnRyeV9nZXRfc3ViX2VudHJpZXMgKG90aGVyKTsKKyAgZm9yIChjdXIgPSBnc3RfdG9jX2VudHJ5X2dldF9zdWJfZW50cmllcyAob3JpZ2luYWwpOyBjdXIgIT0gTlVMTDsKKyAgICAgIGN1ciA9IGN1ci0+bmV4dCkgeworICAgIGZhaWxfdW5sZXNzIChvdGhlcl9jdXIgIT0gTlVMTCk7CisKKyAgICBjaGVja190b2NfZW50cmllcyAoY3VyLT5kYXRhLCBvdGhlcl9jdXItPmRhdGEpOworCisgICAgb3RoZXJfY3VyID0gb3RoZXJfY3VyLT5uZXh0OworICB9Cit9CisKKy8qIENyZWF0ZSBhIG5ldyBjaGFwdGVyICovCitzdGF0aWMgR3N0VG9jRW50cnkgKgorbmV3X2NoYXB0ZXIgKGNvbnN0IGd1aW50IGNoYXB0ZXJfbmIsIGNvbnN0IGdpbnQ2NCBzdGFydCwgY29uc3QgZ2ludDY0IHN0b3ApCit7CisgIEdzdFRvY0VudHJ5ICp0b2NfZW50cnksICp0b2Nfc3ViX2VudHJ5OworICBHc3RUYWdMaXN0ICp0YWdzOworICBnY2hhciB0aXRsZVszMl07CisgIGdjaGFyIGFydGlzdFszMl07CisgIGdjaGFyIHN0cl91aWRbMzJdOworCisgIGdfc25wcmludGYgKHN0cl91aWQsIHNpemVvZiAoc3RyX3VpZCksICJ1aWQuJWQiLCBjaGFwdGVyX25iKTsKKyAgdG9jX2VudHJ5ID0gZ3N0X3RvY19lbnRyeV9uZXcgKEdTVF9UT0NfRU5UUllfVFlQRV9DSEFQVEVSLCBzdHJfdWlkKTsKKyAgZ3N0X3RvY19lbnRyeV9zZXRfc3RhcnRfc3RvcF90aW1lcyAodG9jX2VudHJ5LCBzdGFydCwgc3RvcCk7CisKKyAgZ19zbnByaW50ZiAodGl0bGUsIHNpemVvZiAodGl0bGUpLCAiY2hhcC4lZCIsIGNoYXB0ZXJfbmIpOworICBnX3NucHJpbnRmIChhcnRpc3QsIHNpemVvZiAoYXJ0aXN0KSwgImFydC4lZCIsIGNoYXB0ZXJfbmIpOworICB0YWdzID0gZ3N0X3RhZ19saXN0X25ldyAoR1NUX1RBR19USVRMRSwgdGl0bGUsIEdTVF9UQUdfQVJUSVNULCBhcnRpc3QsIE5VTEwpOworICBnc3RfdG9jX2VudHJ5X3NldF90YWdzICh0b2NfZW50cnksIHRhZ3MpOworCisgIGdfc25wcmludGYgKHN0cl91aWQsIHNpemVvZiAoc3RyX3VpZCksICJ1aWQuJWQuMSIsIGNoYXB0ZXJfbmIpOworICB0b2Nfc3ViX2VudHJ5ID0gZ3N0X3RvY19lbnRyeV9uZXcgKEdTVF9UT0NfRU5UUllfVFlQRV9DSEFQVEVSLCBzdHJfdWlkKTsKKyAgZ3N0X3RvY19lbnRyeV9zZXRfc3RhcnRfc3RvcF90aW1lcyAodG9jX3N1Yl9lbnRyeSwgc3RhcnQsIChzdGFydCArIHN0b3ApIC8gMik7CisKKyAgZ19zbnByaW50ZiAodGl0bGUsIHNpemVvZiAodGl0bGUpLCAibmVzdGVkLiVkLjEiLCBjaGFwdGVyX25iKTsKKyAgZ19zbnByaW50ZiAoYXJ0aXN0LCBzaXplb2YgKGFydGlzdCksICJhcnQuJWQuMSIsIGNoYXB0ZXJfbmIpOworICB0YWdzID0gZ3N0X3RhZ19saXN0X25ldyAoR1NUX1RBR19USVRMRSwgdGl0bGUsIEdTVF9UQUdfQVJUSVNULCBhcnRpc3QsIE5VTEwpOworICBnc3RfdG9jX2VudHJ5X3NldF90YWdzICh0b2Nfc3ViX2VudHJ5LCB0YWdzKTsKKworICBnc3RfdG9jX2VudHJ5X2FwcGVuZF9zdWJfZW50cnkgKHRvY19lbnRyeSwgdG9jX3N1Yl9lbnRyeSk7CisKKyAgZ19zbnByaW50ZiAoc3RyX3VpZCwgc2l6ZW9mIChzdHJfdWlkKSwgInVpZC4lZC4yIiwgY2hhcHRlcl9uYik7CisgIHRvY19zdWJfZW50cnkgPSBnc3RfdG9jX2VudHJ5X25ldyAoR1NUX1RPQ19FTlRSWV9UWVBFX0NIQVBURVIsIHN0cl91aWQpOworICBnc3RfdG9jX2VudHJ5X3NldF9zdGFydF9zdG9wX3RpbWVzICh0b2Nfc3ViX2VudHJ5LCAoc3RhcnQgKyBzdG9wKSAvIDIsIHN0b3ApOworCisgIGdfc25wcmludGYgKHRpdGxlLCBzaXplb2YgKHRpdGxlKSwgIm5lc3RlZC8lZC4yIiwgY2hhcHRlcl9uYik7CisgIGdfc25wcmludGYgKGFydGlzdCwgc2l6ZW9mIChhcnRpc3QpLCAiYXJ0LiVkLjIiLCBjaGFwdGVyX25iKTsKKyAgdGFncyA9IGdzdF90YWdfbGlzdF9uZXcgKEdTVF9UQUdfVElUTEUsIHRpdGxlLCBHU1RfVEFHX0FSVElTVCwgYXJ0aXN0LCBOVUxMKTsKKyAgZ3N0X3RvY19lbnRyeV9zZXRfdGFncyAodG9jX3N1Yl9lbnRyeSwgdGFncyk7CisKKyAgZ3N0X3RvY19lbnRyeV9hcHBlbmRfc3ViX2VudHJ5ICh0b2NfZW50cnksIHRvY19zdWJfZW50cnkpOworCisgIHJldHVybiB0b2NfZW50cnk7Cit9CisKKy8qIENyZWF0ZSBhIHJlZmVyZW5jZSB0b2Mgd2hpY2ggbWF0Y2hlcyB3aGF0IGlzIGV4cGVjdGVkIGluIG1rdl90b2NfYmFzZTY0ICovCitzdGF0aWMgR3N0VG9jICoKK25ld19yZWZlcmVuY2VfdG9jICh2b2lkKQoreworICBHc3RUb2MgKnJlZl90b2M7CisgIEdzdFRvY0VudHJ5ICp0b2NfZWRpdGlvbl9lbnRyeSwgKnRvY19lbnRyeTsKKyAgR3N0VGFnTGlzdCAqdGFnczsKKworICByZWZfdG9jID0gZ3N0X3RvY19uZXcgKEdTVF9UT0NfU0NPUEVfR0xPQkFMKTsKKworICB0b2NfZWRpdGlvbl9lbnRyeSA9IGdzdF90b2NfZW50cnlfbmV3IChHU1RfVE9DX0VOVFJZX1RZUEVfRURJVElPTiwgIjAwIik7CisgIHRhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3IChHU1RfVEFHX0NPTU1FTlQsICJFZCIsIE5VTEwpOworICBnc3RfdG9jX2VudHJ5X3NldF90YWdzICh0b2NfZWRpdGlvbl9lbnRyeSwgdGFncyk7CisKKyAgdG9jX2VudHJ5ID0gbmV3X2NoYXB0ZXIgKDEsIDAgKiBHU1RfTVNFQ09ORCwgMiAqIEdTVF9NU0VDT05EKTsKKyAgZ3N0X3RvY19lbnRyeV9hcHBlbmRfc3ViX2VudHJ5ICh0b2NfZWRpdGlvbl9lbnRyeSwgdG9jX2VudHJ5KTsKKworICB0b2NfZW50cnkgPSBuZXdfY2hhcHRlciAoMiwgMiAqIEdTVF9NU0VDT05ELCA0ICogR1NUX01TRUNPTkQpOworICBnc3RfdG9jX2VudHJ5X2FwcGVuZF9zdWJfZW50cnkgKHRvY19lZGl0aW9uX2VudHJ5LCB0b2NfZW50cnkpOworCisgIGdzdF90b2NfYXBwZW5kX2VudHJ5IChyZWZfdG9jLCB0b2NfZWRpdGlvbl9lbnRyeSk7CisKKyAgcmV0dXJuIHJlZl90b2M7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3RvY19kZW11eCkKK3sKKyAgR3N0SGFybmVzcyAqaDsKKyAgR3N0QnVmZmVyICpidWY7CisgIGd1Y2hhciAqbWt2X2RhdGE7CisgIGdzaXplIG1rdl9zaXplOworICBHc3RFdmVudCAqZXZlbnQ7CisgIGdib29sZWFuIHVwZGF0ZTsKKyAgR3N0VG9jICpyZWZfdG9jLCAqZGVtdXhlZF90b2MgPSBOVUxMOworICBHTGlzdCAqcmVmX2N1ciwgKmRlbXV4ZWRfY3VyOworCisgIGggPSBnc3RfaGFybmVzc19uZXdfd2l0aF9wYWRuYW1lcyAoIm1hdHJvc2thZGVtdXgiLCAic2luayIsIE5VTEwpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGgtPmVsZW1lbnQsICJwYWQtYWRkZWQiLCBHX0NBTExCQUNLIChwYWRfYWRkZWRfY2IpLCBoKTsKKworICBta3ZfZGF0YSA9IGdfYmFzZTY0X2RlY29kZSAobWt2X3RvY19iYXNlNjQsICZta3Zfc2l6ZSk7CisgIGZhaWxfdW5sZXNzIChta3ZfZGF0YSAhPSBOVUxMKTsKKworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChoLCAiYXVkaW8veC1tYXRyb3NrYSIpOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKG1rdl9kYXRhLCBta3Zfc2l6ZSk7CisgIEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpID0gMDsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgYnVmKSk7CisgIGdzdF9oYXJuZXNzX3B1c2hfZXZlbnQgKGgsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKworICBldmVudCA9IGdzdF9oYXJuZXNzX3RyeV9wdWxsX2V2ZW50IChoKTsKKyAgZmFpbF91bmxlc3MgKGV2ZW50ICE9IE5VTEwpOworCisgIHdoaWxlIChldmVudCAhPSBOVUxMKSB7CisgICAgaWYgKGV2ZW50LT50eXBlID09IEdTVF9FVkVOVF9UT0MpIHsKKyAgICAgIGdzdF9ldmVudF9wYXJzZV90b2MgKGV2ZW50LCAmZGVtdXhlZF90b2MsICZ1cGRhdGUpOworICAgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZ3N0X2V2ZW50X3VucmVmIChldmVudCk7CisgICAgZXZlbnQgPSBnc3RfaGFybmVzc190cnlfcHVsbF9ldmVudCAoaCk7CisgIH0KKworICBmYWlsX3VubGVzcyAoZGVtdXhlZF90b2MgIT0gTlVMTCk7CisgIHJlZl90b2MgPSBuZXdfcmVmZXJlbmNlX3RvYyAoKTsKKworICBkZW11eGVkX2N1ciA9IGdzdF90b2NfZ2V0X2VudHJpZXMgKGRlbXV4ZWRfdG9jKTsKKyAgZm9yIChyZWZfY3VyID0gZ3N0X3RvY19nZXRfZW50cmllcyAocmVmX3RvYyk7IHJlZl9jdXIgIT0gTlVMTDsKKyAgICAgIHJlZl9jdXIgPSByZWZfY3VyLT5uZXh0KSB7CisgICAgZmFpbF91bmxlc3MgKGRlbXV4ZWRfY3VyICE9IE5VTEwpOworCisgICAgY2hlY2tfdG9jX2VudHJpZXMgKHJlZl9jdXItPmRhdGEsIGRlbXV4ZWRfY3VyLT5kYXRhKTsKKyAgICBkZW11eGVkX2N1ciA9IGRlbXV4ZWRfY3VyLT5uZXh0OworICB9CisKKyAgZ3N0X3RvY191bnJlZiAocmVmX3RvYyk7CisgIGdzdF90b2NfdW5yZWYgKGRlbXV4ZWRfdG9jKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK21hdHJvc2thZGVtdXhfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgibWF0cm9za2FkZW11eCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zdWJfdGVybWluYXRvcik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90b2NfZGVtdXgpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAobWF0cm9za2FkZW11eCk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9tYXRyb3NrYW11eC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjgwNGJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FtdXguYwpAQCAtMCwwICsxLDEwMTkgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIHVuaXQgdGVzdCBmb3IgbWF0cm9za2FtdXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA1PiBNaWNoYWwgQmVuZXMgPG1pY2hhbC5iZW5lc0B4ZXJpcy5jej4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGhhcm5lc3MuaD4KKworI2RlZmluZSBBQzNfQ0FQU19TVFJJTkcgImF1ZGlvL3gtYWMzLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgInJhdGUgPSAoaW50KSA4MDAwIgorI2RlZmluZSBWT1JCSVNfVE1QTF9DQVBTX1NUUklORyAiYXVkaW8veC12b3JiaXMsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhdGUgPSAoaW50KSA4MDAwLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmVhbWhlYWRlcj0oYnVmZmVyKTwxMCwgMjAyMCwgMzAzMDMwPiIKKworc3RhdGljIEdzdEhhcm5lc3MgKgorc2V0dXBfbWF0cm9za2FtdXhfaGFybmVzcyAoY29uc3QgZ2NoYXIgKiBzcmNfcGFkX3N0cikKK3sKKyAgR3N0SGFybmVzcyAqaDsKKworICBoID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfcGFkbmFtZXMgKCJtYXRyb3NrYW11eCIsICJhdWRpb18ldSIsICJzcmMiKTsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoaCwgc3JjX3BhZF9zdHIpOworICBnc3RfaGFybmVzc19zZXRfc2lua19jYXBzX3N0ciAoaCwgInZpZGVvL3gtbWF0cm9za2E7IGF1ZGlvL3gtbWF0cm9za2EiKTsKKworICByZXR1cm4gaDsKK30KKworc3RhdGljIGdib29sZWFuCitzZWVrYWJsZV9zaW5rcGFkX3F1ZXJ5IChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0UXVlcnkgKiBxdWVyeSkKK3sKKyAgZ2Jvb2xlYW4gcmV0ID0gRkFMU0U7CisKKyAgaWYgKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkgPT0gR1NUX1FVRVJZX1NFRUtJTkcpIHsKKyAgICBnc3RfcXVlcnlfc2V0X3NlZWtpbmcgKHF1ZXJ5LCBHU1RfRk9STUFUX0JZVEVTLCBUUlVFLCAwLCAtMSk7CisgICAgcmV0ID0gVFJVRTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgY29tcGFyZV9idWZmZXJfdG9fZGF0YShidWZmZXIsIGRhdGEsIGRhdGFfc2l6ZSkgICAgICAgICAgICAgXAorR19TVE1UX1NUQVJUIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhX3NpemUsIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcikpOyAgIFwKK2ZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoYnVmZmVyLCAwLCBkYXRhLCBkYXRhX3NpemUpID09IDApOyAgXAorfSBHX1NUTVRfRU5ECisKK3N0YXRpYyB2b2lkCit0ZXN0X2VibWxfaGVhZGVyX3dpdGhfdmVyc2lvbiAoZ2ludCB2ZXJzaW9uLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YSwgZ3NpemUgZGF0YV9zaXplKQoreworICBHc3RIYXJuZXNzICpoOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworCisgIGggPSBzZXR1cF9tYXRyb3NrYW11eF9oYXJuZXNzIChBQzNfQ0FQU19TVFJJTkcpOworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJ2ZXJzaW9uIiwgdmVyc2lvbiwgTlVMTCk7CisKKyAgaW5idWZmZXIgPSBnc3RfaGFybmVzc19jcmVhdGVfYnVmZmVyIChoLCAxKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGluYnVmZmVyKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDIsIGdzdF9oYXJuZXNzX2J1ZmZlcnNfcmVjZWl2ZWQgKGgpKTsKKworICBvdXRidWZmZXIgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgY29tcGFyZV9idWZmZXJfdG9fZGF0YSAob3V0YnVmZmVyLCBkYXRhLCBkYXRhX3NpemUpOworICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZWJtbF9oZWFkZXJfdjEpCit7CisgIGd1aW50OCBkYXRhX3YxW10gPSB7CisgICAgMHgxYSwgMHg0NSwgMHhkZiwgMHhhMywgICAgIC8qIG1hc3RlciBJRCAqLworICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsCisgICAgMHg0MiwgMHg4MiwgICAgICAgICAgICAgICAgIC8qIGRvY3R5cGUgKi8KKyAgICAweDg5LCAgICAgICAgICAgICAgICAgICAgICAgLyogOSBieXRlcyAqLworICAgIDB4NmQsIDB4NjEsIDB4NzQsIDB4NzIsIDB4NmYsIDB4NzMsIDB4NmIsIDB4NjEsIDB4MDAsICAgICAgIC8qICJtYXRyb3NrYSIgKi8KKyAgICAweDQyLCAweDg3LCAgICAgICAgICAgICAgICAgLyogZG9jdHlwZXZlcnNpb24gKi8KKyAgICAweDgxLCAgICAgICAgICAgICAgICAgICAgICAgLyogMSBieXRlICovCisgICAgMHgwMSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgKi8KKyAgICAweDQyLCAweDg1LCAgICAgICAgICAgICAgICAgLyogZG9jdHlwZXJlYWR2ZXJzaW9uICovCisgICAgMHg4MSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgYnl0ZSAqLworICAgIDB4MDEsICAgICAgICAgICAgICAgICAgICAgICAvKiAxICovCisgIH07CisKKyAgdGVzdF9lYm1sX2hlYWRlcl93aXRoX3ZlcnNpb24gKDEsIGRhdGFfdjEsIHNpemVvZiAoZGF0YV92MSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2VibWxfaGVhZGVyX3YyKQoreworICBndWludDggZGF0YV92MltdID0geworICAgIDB4MWEsIDB4NDUsIDB4ZGYsIDB4YTMsICAgICAvKiBtYXN0ZXIgSUQgKi8KKyAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE0LAorICAgIDB4NDIsIDB4ODIsICAgICAgICAgICAgICAgICAvKiBkb2N0eXBlICovCisgICAgMHg4OSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDkgYnl0ZXMgKi8KKyAgICAweDZkLCAweDYxLCAweDc0LCAweDcyLCAweDZmLCAweDczLCAweDZiLCAweDYxLCAweDAwLCAgICAgICAvKiAibWF0cm9za2EiICovCisgICAgMHg0MiwgMHg4NywgICAgICAgICAgICAgICAgIC8qIGRvY3R5cGV2ZXJzaW9uICovCisgICAgMHg4MSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgYnl0ZSAqLworICAgIDB4MDIsICAgICAgICAgICAgICAgICAgICAgICAvKiAyICovCisgICAgMHg0MiwgMHg4NSwgICAgICAgICAgICAgICAgIC8qIGRvY3R5cGVyZWFkdmVyc2lvbiAqLworICAgIDB4ODEsICAgICAgICAgICAgICAgICAgICAgICAvKiAxIGJ5dGUgKi8KKyAgICAweDAyLCAgICAgICAgICAgICAgICAgICAgICAgLyogMiAqLworICB9OworCisgIHRlc3RfZWJtbF9oZWFkZXJfd2l0aF92ZXJzaW9uICgyLCBkYXRhX3YyLCBzaXplb2YgKGRhdGFfdjIpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3ZvcmJpc19oZWFkZXIpCit7CisgIEdzdEhhcm5lc3MgKmg7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIGdib29sZWFuIHZvcmJpc19oZWFkZXJfZm91bmQgPSBGQUxTRTsKKyAgZ2ludCBqOworICBnc2l6ZSBidWZmZXJfc2l6ZTsKKyAgZ3VpbnQ4IGRhdGFbXSA9CisgICAgICB7IDB4NjMsIDB4YTIsIDB4ODksIDB4MDIsIDB4MDEsIDB4MDIsIDB4MTAsIDB4MjAsIDB4MjAsIDB4MzAsIDB4MzAsCisgICAgMHgzMAorICB9OworCisgIGggPSBzZXR1cF9tYXRyb3NrYW11eF9oYXJuZXNzIChWT1JCSVNfVE1QTF9DQVBTX1NUUklORyk7CisKKyAgaW5idWZmZXIgPSBnc3RfaGFybmVzc19jcmVhdGVfYnVmZmVyIChoLCAxKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGluYnVmZmVyKSk7CisKKyAgb3V0YnVmZmVyID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIHdoaWxlIChvdXRidWZmZXIgIT0gTlVMTCkgeworICAgIGJ1ZmZlcl9zaXplID0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0YnVmZmVyKTsKKworICAgIGlmICghdm9yYmlzX2hlYWRlcl9mb3VuZCAmJiBidWZmZXJfc2l6ZSA+PSBzaXplb2YgKGRhdGEpKSB7CisgICAgICBmb3IgKGogPSAwOyBqIDw9IGJ1ZmZlcl9zaXplIC0gc2l6ZW9mIChkYXRhKTsgaisrKSB7CisgICAgICAgIGlmIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCBqLCBkYXRhLCBzaXplb2YgKGRhdGEpKSA9PSAwKSB7CisgICAgICAgICAgdm9yYmlzX2hlYWRlcl9mb3VuZCA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChvdXRidWZmZXIsICJvdXRidWZmZXIiLCAxKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworCisgICAgb3V0YnVmZmVyID0gZ3N0X2hhcm5lc3NfdHJ5X3B1bGwgKGgpOworICB9CisKKyAgZmFpbF91bmxlc3MgKHZvcmJpc19oZWFkZXJfZm91bmQpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCisKK3N0YXRpYyB2b2lkCit0ZXN0X2Jsb2NrX2dyb3VwX3dpdGhfdmVyc2lvbiAoZ2ludCB2ZXJzaW9uLAorICAgIGdjb25zdHBvaW50ZXIgZGF0YTAsIGdzaXplIGRhdGEwX3NpemUpCit7CisgIEdzdEhhcm5lc3MgKmg7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIGd1aW50OCBkYXRhMVtdID0geyAweDQyIH07CisKKyAgaCA9IHNldHVwX21hdHJvc2thbXV4X2hhcm5lc3MgKEFDM19DQVBTX1NUUklORyk7CisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgInZlcnNpb24iLCB2ZXJzaW9uLCBOVUxMKTsKKworICAvKiBHZW5lcmF0ZSB0aGUgaGVhZGVyICovCisgIGluYnVmZmVyID0gZ3N0X2hhcm5lc3NfY3JlYXRlX2J1ZmZlciAoaCwgMSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgaW5idWZmZXIpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoNSwgZ3N0X2hhcm5lc3NfYnVmZmVyc19yZWNlaXZlZCAoaCkpOworCisgIG91dGJ1ZmZlciA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBmYWlsX3VubGVzcyAob3V0YnVmZmVyICE9IE5VTEwpOworICB3aGlsZSAob3V0YnVmZmVyICE9IE5VTEwpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworICAgIG91dGJ1ZmZlciA9IGdzdF9oYXJuZXNzX3RyeV9wdWxsIChoKTsKKyAgfQorCisgIC8qIE5vdyBwdXNoIGEgYnVmZmVyICovCisgIGluYnVmZmVyID0gZ3N0X2hhcm5lc3NfY3JlYXRlX2J1ZmZlciAoaCwgMSk7CisgIGdzdF9idWZmZXJfZmlsbCAoaW5idWZmZXIsIDAsIGRhdGExLCBzaXplb2YgKGRhdGExKSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAxMDAwMDAwOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCBnc3RfaGFybmVzc19wdXNoIChoLCBpbmJ1ZmZlcikpOworCisgIG91dGJ1ZmZlciA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBjb21wYXJlX2J1ZmZlcl90b19kYXRhIChvdXRidWZmZXIsIGRhdGEwLCBkYXRhMF9zaXplKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmZmVyKTsKKworICBvdXRidWZmZXIgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgY29tcGFyZV9idWZmZXJfdG9fZGF0YSAob3V0YnVmZmVyLCBkYXRhMSwgc2l6ZW9mIChkYXRhMSkpOworICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYmxvY2tfZ3JvdXBfdjEpCit7CisgIGd1aW50OCBkYXRhMF92MVtdID0geyAweGEwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LAorICAgIDB4YTEsIDB4ODUsCisgICAgMHg4MSwgMHgwMCwgMHgwMSwgMHgwMAorICB9OworCisgIHRlc3RfYmxvY2tfZ3JvdXBfd2l0aF92ZXJzaW9uICgxLCBkYXRhMF92MSwgc2l6ZW9mIChkYXRhMF92MSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2Jsb2NrX2dyb3VwX3YyKQoreworICBndWludDggZGF0YTBfdjJbXSA9IHsgMHhhMywgMHg4NSwgMHg4MSwgMHgwMCwgMHgwMSwgMHgwMCB9OworCisgIHRlc3RfYmxvY2tfZ3JvdXBfd2l0aF92ZXJzaW9uICgyLCBkYXRhMF92Miwgc2l6ZW9mIChkYXRhMF92MikpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3Jlc2V0KQoreworICBHc3RIYXJuZXNzICpoOworICBHc3RCdWZmZXIgKmluYnVmZmVyOworICBHc3RCdWZmZXIgKm91dGJ1ZmZlcjsKKworICBoID0gc2V0dXBfbWF0cm9za2FtdXhfaGFybmVzcyAoQUMzX0NBUFNfU1RSSU5HKTsKKworICBpbmJ1ZmZlciA9IGdzdF9oYXJuZXNzX2NyZWF0ZV9idWZmZXIgKGgsIDEpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGluYnVmZmVyKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDUsIGdzdF9oYXJuZXNzX2J1ZmZlcnNfcmVjZWl2ZWQgKGgpKTsKKworICBvdXRidWZmZXIgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgZmFpbF91bmxlc3MgKG91dGJ1ZmZlciAhPSBOVUxMKTsKKyAgd2hpbGUgKG91dGJ1ZmZlciAhPSBOVUxMKSB7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmZmVyKTsKKyAgICBvdXRidWZmZXIgPSBnc3RfaGFybmVzc190cnlfcHVsbCAoaCk7CisgIH0KKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGgtPmVsZW1lbnQsIEdTVF9TVEFURV9OVUxMKSk7CisKKyAgZ3N0X2hhcm5lc3NfcGxheSAoaCk7CisKKyAgaW5idWZmZXIgPSBnc3RfaGFybmVzc19jcmVhdGVfYnVmZmVyIChoLCAxKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCBnc3RfaGFybmVzc19wdXNoIChoLCBpbmJ1ZmZlcikpOworCisgIG91dGJ1ZmZlciA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBmYWlsX3VubGVzcyAob3V0YnVmZmVyICE9IE5VTEwpOworICB3aGlsZSAob3V0YnVmZmVyICE9IE5VTEwpIHsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworICAgIG91dGJ1ZmZlciA9IGdzdF9oYXJuZXNzX3RyeV9wdWxsIChoKTsKKyAgfQorCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9saW5rX3dlYm1tdXhfd2VibV9zaW5rKQoreworICBHc3RIYXJuZXNzICpoOworCisgIGggPSBnc3RfaGFybmVzc19uZXdfd2l0aF9wYWRuYW1lcyAoIndlYm1tdXgiLCAiYXVkaW9fJXUiLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChoICE9IE5VTEwpOworCisgIGdzdF9oYXJuZXNzX3NldF9zaW5rX2NhcHNfc3RyIChoLCAidmlkZW8vd2VibTsgYXVkaW8vd2VibSIpOworCisgIGdzdF9oYXJuZXNzX3BsYXkgKGgpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoaC0+ZWxlbWVudCwgR1NUX1NUQVRFX05VTEwpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIGdpbnQ2NCB0aW1lY29kZXNjYWxlc1tdID0geworICBHU1RfVVNFQ09ORCwKKyAgR1NUX01TRUNPTkQsCisgIEdTVF9NU0VDT05EICogMTAsCisgIEdTVF9NU0VDT05EICogMTAwLAorICBHU1RfTVNFQ09ORCAqIDQwMCwKKyAgLyogRkFJTFM6ID8gR1NUX01TRUNPTkQgKiA1MDAsIGEgYnVnPyAqLworfTsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdGltZWNvZGVzY2FsZSkKK3sKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgZ3VpbnQ4IGRhdGFfaDBbXSA9IHsKKyAgICAweGEzLCAweDg1LCAweDgxLCAweDAwLCAweDAwLCAweDAwLAorICB9OworICBndWludDggZGF0YV9oMVtdID0geworICAgIDB4YTMsIDB4ODUsIDB4ODEsIDB4MDAsIDB4MDEsIDB4MDAsCisgIH07CisKKyAgR3N0SGFybmVzcyAqaCA9IHNldHVwX21hdHJvc2thbXV4X2hhcm5lc3MgKEFDM19DQVBTX1NUUklORyk7CisgIGdpbnQ2NCB0aW1lY29kZXNjYWxlID0gdGltZWNvZGVzY2FsZXNbX19pX19dOworCisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgInRpbWVjb2Rlc2NhbGUiLCB0aW1lY29kZXNjYWxlLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAidmVyc2lvbiIsIDIsIE5VTEwpOworCisgIC8qIEJ1ZmZlciAwICovCisgIGluYnVmZmVyID0gZ3N0X2hhcm5lc3NfY3JlYXRlX2J1ZmZlciAoaCwgMSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgaW5idWZmZXIpKTsKKworICAvKiBwdWxsIG91dCBoZWFkZXJzICovCisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChoKSk7CisKKyAgLyogdmVyaWZ5IGhlYWRlciBhbmQgZHJvcCB0aGUgZGF0YSAqLworICBvdXRidWZmZXIgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgY29tcGFyZV9idWZmZXJfdG9fZGF0YSAob3V0YnVmZmVyLCBkYXRhX2gwLCBzaXplb2YgKGRhdGFfaDApKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmZmVyKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworCisgIC8qIEJ1ZmZlciAxICovCisgIGluYnVmZmVyID0gZ3N0X2hhcm5lc3NfY3JlYXRlX2J1ZmZlciAoaCwgMSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSB0aW1lY29kZXNjYWxlOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgaW5idWZmZXIpKTsKKworICAvKiB2ZXJpZnkgaGVhZGVyIGFuZCBkcm9wIHRoZSBkYXRhICovCisgIG91dGJ1ZmZlciA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBjb21wYXJlX2J1ZmZlcl90b19kYXRhIChvdXRidWZmZXIsIGRhdGFfaDEsIHNpemVvZiAoZGF0YV9oMSkpOworICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChoKSk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIENyZWF0ZSBhIG5ldyBjaGFwdGVyICovCitzdGF0aWMgR3N0VG9jRW50cnkgKgorbmV3X2NoYXB0ZXIgKGNvbnN0IGd1aW50IGNoYXB0ZXJfbmIsIGNvbnN0IGdpbnQ2NCBzdGFydCwgY29uc3QgZ2ludDY0IHN0b3ApCit7CisgIEdzdFRvY0VudHJ5ICp0b2NfZW50cnksICp0b2Nfc3ViX2VudHJ5OworICBHc3RUYWdMaXN0ICp0YWdzOworICBnY2hhciB0aXRsZVszMl07CisgIGdjaGFyIGFydGlzdFszMl07CisgIGdjaGFyIHN0cl91aWRbMzJdOworCisgIGdfc25wcmludGYgKHN0cl91aWQsIHNpemVvZiAoc3RyX3VpZCksICJ1aWQuJWQiLCBjaGFwdGVyX25iKTsKKyAgdG9jX2VudHJ5ID0gZ3N0X3RvY19lbnRyeV9uZXcgKEdTVF9UT0NfRU5UUllfVFlQRV9DSEFQVEVSLCBzdHJfdWlkKTsKKyAgZ3N0X3RvY19lbnRyeV9zZXRfc3RhcnRfc3RvcF90aW1lcyAodG9jX2VudHJ5LCBzdGFydCwgc3RvcCk7CisKKyAgZ19zbnByaW50ZiAodGl0bGUsIHNpemVvZiAodGl0bGUpLCAiY2hhcC4lZCIsIGNoYXB0ZXJfbmIpOworICBnX3NucHJpbnRmIChhcnRpc3QsIHNpemVvZiAoYXJ0aXN0KSwgImFydC4lZCIsIGNoYXB0ZXJfbmIpOworICB0YWdzID0gZ3N0X3RhZ19saXN0X25ldyAoR1NUX1RBR19USVRMRSwgdGl0bGUsIEdTVF9UQUdfQVJUSVNULCBhcnRpc3QsIE5VTEwpOworICBnc3RfdG9jX2VudHJ5X3NldF90YWdzICh0b2NfZW50cnksIHRhZ3MpOworCisgIGdfc25wcmludGYgKHN0cl91aWQsIHNpemVvZiAoc3RyX3VpZCksICJ1aWQuJWQuMSIsIGNoYXB0ZXJfbmIpOworICB0b2Nfc3ViX2VudHJ5ID0gZ3N0X3RvY19lbnRyeV9uZXcgKEdTVF9UT0NfRU5UUllfVFlQRV9DSEFQVEVSLCBzdHJfdWlkKTsKKyAgZ3N0X3RvY19lbnRyeV9zZXRfc3RhcnRfc3RvcF90aW1lcyAodG9jX3N1Yl9lbnRyeSwgc3RhcnQsIChzdGFydCArIHN0b3ApIC8gMik7CisKKyAgZ19zbnByaW50ZiAodGl0bGUsIHNpemVvZiAodGl0bGUpLCAibmVzdGVkLiVkLjEiLCBjaGFwdGVyX25iKTsKKyAgZ19zbnByaW50ZiAoYXJ0aXN0LCBzaXplb2YgKGFydGlzdCksICJhcnQuJWQuMSIsIGNoYXB0ZXJfbmIpOworICB0YWdzID0gZ3N0X3RhZ19saXN0X25ldyAoR1NUX1RBR19USVRMRSwgdGl0bGUsIEdTVF9UQUdfQVJUSVNULCBhcnRpc3QsIE5VTEwpOworICBnc3RfdG9jX2VudHJ5X3NldF90YWdzICh0b2Nfc3ViX2VudHJ5LCB0YWdzKTsKKworICBnc3RfdG9jX2VudHJ5X2FwcGVuZF9zdWJfZW50cnkgKHRvY19lbnRyeSwgdG9jX3N1Yl9lbnRyeSk7CisKKyAgZ19zbnByaW50ZiAoc3RyX3VpZCwgc2l6ZW9mIChzdHJfdWlkKSwgInVpZC4lZC4yIiwgY2hhcHRlcl9uYik7CisgIHRvY19zdWJfZW50cnkgPSBnc3RfdG9jX2VudHJ5X25ldyAoR1NUX1RPQ19FTlRSWV9UWVBFX0NIQVBURVIsIHN0cl91aWQpOworICBnc3RfdG9jX2VudHJ5X3NldF9zdGFydF9zdG9wX3RpbWVzICh0b2Nfc3ViX2VudHJ5LCAoc3RhcnQgKyBzdG9wKSAvIDIsIHN0b3ApOworCisgIGdfc25wcmludGYgKHRpdGxlLCBzaXplb2YgKHRpdGxlKSwgIm5lc3RlZC8lZC4yIiwgY2hhcHRlcl9uYik7CisgIGdfc25wcmludGYgKGFydGlzdCwgc2l6ZW9mIChhcnRpc3QpLCAiYXJ0LiVkLjIiLCBjaGFwdGVyX25iKTsKKyAgdGFncyA9IGdzdF90YWdfbGlzdF9uZXcgKEdTVF9UQUdfVElUTEUsIHRpdGxlLCBHU1RfVEFHX0FSVElTVCwgYXJ0aXN0LCBOVUxMKTsKKyAgZ3N0X3RvY19lbnRyeV9zZXRfdGFncyAodG9jX3N1Yl9lbnRyeSwgdGFncyk7CisKKyAgZ3N0X3RvY19lbnRyeV9hcHBlbmRfc3ViX2VudHJ5ICh0b2NfZW50cnksIHRvY19zdWJfZW50cnkpOworCisgIHJldHVybiB0b2NfZW50cnk7Cit9CisKKy8qIENyZWF0ZSBhIHJlZmVyZW5jZSB0b2Mgd2hpY2ggaW5jbHVkZXMgYSBtYXN0ZXIgZWRpdGlvbiBlbnRyeSAqLworc3RhdGljIEdzdFRvYyAqCituZXdfcmVmZXJlbmNlX3RvYyAodm9pZCkKK3sKKyAgR3N0VG9jICpyZWZfdG9jOworICBHc3RUb2NFbnRyeSAqdG9jX2VkaXRpb25fZW50cnksICp0b2NfZW50cnk7CisgIEdzdFRhZ0xpc3QgKnRhZ3M7CisKKyAgcmVmX3RvYyA9IGdzdF90b2NfbmV3IChHU1RfVE9DX1NDT1BFX0dMT0JBTCk7CisKKyAgdG9jX2VkaXRpb25fZW50cnkgPSBnc3RfdG9jX2VudHJ5X25ldyAoR1NUX1RPQ19FTlRSWV9UWVBFX0VESVRJT04sICIwMCIpOworICB0YWdzID0gZ3N0X3RhZ19saXN0X25ldyAoR1NUX1RBR19DT01NRU5ULCAiRWQiLCBOVUxMKTsKKyAgZ3N0X3RvY19lbnRyeV9zZXRfdGFncyAodG9jX2VkaXRpb25fZW50cnksIHRhZ3MpOworCisgIHRvY19lbnRyeSA9IG5ld19jaGFwdGVyICgxLCAwICogR1NUX01TRUNPTkQsIDIgKiBHU1RfTVNFQ09ORCk7CisgIGdzdF90b2NfZW50cnlfYXBwZW5kX3N1Yl9lbnRyeSAodG9jX2VkaXRpb25fZW50cnksIHRvY19lbnRyeSk7CisKKyAgdG9jX2VudHJ5ID0gbmV3X2NoYXB0ZXIgKDIsIDIgKiBHU1RfTVNFQ09ORCwgNCAqIEdTVF9NU0VDT05EKTsKKyAgZ3N0X3RvY19lbnRyeV9hcHBlbmRfc3ViX2VudHJ5ICh0b2NfZWRpdGlvbl9lbnRyeSwgdG9jX2VudHJ5KTsKKworICBnc3RfdG9jX2FwcGVuZF9lbnRyeSAocmVmX3RvYywgdG9jX2VkaXRpb25fZW50cnkpOworCisgIHJldHVybiByZWZfdG9jOworfQorCisvKiBDcmVhdGUgYSB0b2Mgd2hpY2ggaW5jbHVkZXMgY2hhcHRlcnMgd2l0aG91dCBlZGl0aW9uIGVudHJ5ICovCitzdGF0aWMgR3N0VG9jICoKK25ld19ub19lZGl0aW9uX3RvYyAodm9pZCkKK3sKKyAgR3N0VG9jICpyZWZfdG9jOworICBHc3RUb2NFbnRyeSAqdG9jX2VudHJ5OworCisgIHJlZl90b2MgPSBnc3RfdG9jX25ldyAoR1NUX1RPQ19TQ09QRV9HTE9CQUwpOworCisgIHRvY19lbnRyeSA9IG5ld19jaGFwdGVyICgxLCAwICogR1NUX01TRUNPTkQsIDIgKiBHU1RfTVNFQ09ORCk7CisgIGdzdF90b2NfYXBwZW5kX2VudHJ5IChyZWZfdG9jLCB0b2NfZW50cnkpOworCisgIHRvY19lbnRyeSA9IG5ld19jaGFwdGVyICgyLCAyICogR1NUX01TRUNPTkQsIDQgKiBHU1RfTVNFQ09ORCk7CisgIGdzdF90b2NfYXBwZW5kX2VudHJ5IChyZWZfdG9jLCB0b2NfZW50cnkpOworCisgIHJldHVybiByZWZfdG9jOworfQorCitzdGF0aWMgZ3VpbnQ2NAorcmVhZF9pbnRlZ2VyIChHc3RNYXBJbmZvICogaW5mbywgZ3NpemUgKiBpbmRleCwgZ3VpbnQ2NCBsZW4pCit7CisgIGd1aW50NjQgdG90YWwgPSAwOworCisgIGZvciAoOyBsZW4gPiAwOyAtLWxlbikgeworICAgIHRvdGFsID0gKHRvdGFsIDw8IDgpIHwgR1NUX1JFQURfVUlOVDggKGluZm8tPmRhdGEgKyAqaW5kZXgpOworICAgICsrKCppbmRleCk7CisgIH0KKworICByZXR1cm4gdG90YWw7Cit9CisKK3N0YXRpYyBndWludDY0CityZWFkX2xlbmd0aCAoR3N0TWFwSW5mbyAqIGluZm8sIGdzaXplICogaW5kZXgpCit7CisgIGdpbnQgbGVuX21hc2sgPSAweDgwLCByZWFkID0gMTsKKyAgZ3VpbnQ2NCB0b3RhbDsKKyAgZ3VpbnQ4IGI7CisKKyAgYiA9IEdTVF9SRUFEX1VJTlQ4IChpbmZvLT5kYXRhICsgKmluZGV4KTsKKyAgKysoKmluZGV4KTsKKyAgdG90YWwgPSAoZ3VpbnQ2NCkgYjsKKyAgd2hpbGUgKHJlYWQgPD0gOCAmJiAhKHRvdGFsICYgbGVuX21hc2spKSB7CisgICAgcmVhZCsrOworICAgIGxlbl9tYXNrID4+PSAxOworICB9CisgIHRvdGFsICY9IChsZW5fbWFzayAtIDEpOworCisgIGZvciAoOyByZWFkID4gMTsgLS1yZWFkKSB7CisgICAgdG90YWwgPSAodG90YWwgPDwgOCkgfCBHU1RfUkVBRF9VSU5UOCAoaW5mby0+ZGF0YSArICppbmRleCk7CisgICAgKysoKmluZGV4KTsKKyAgfQorCisgIHJldHVybiB0b3RhbDsKK30KKworc3RhdGljIGdib29sZWFuCitjaGVja19pZCAoR3N0TWFwSW5mbyAqIGluZm8sIGdzaXplICogaW5kZXgsCisgICAgZ3VpbnQ4ICogdGFnLCBnaW50IHRhZ19sZW4sIGd1aW50NjQgKiBsZW4pCit7CisgIGlmIChtZW1jbXAgKGluZm8tPmRhdGEgKyAqaW5kZXgsIHRhZywgdGFnX2xlbikgPT0gMCkgeworICAgICppbmRleCArPSB0YWdfbGVuOworICAgICpsZW4gPSByZWFkX2xlbmd0aCAoaW5mbywgaW5kZXgpOworICAgIHJldHVybiBUUlVFOworICB9IGVsc2UgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2NoZWNrX2lkX3JlYWRfaW50IChHc3RNYXBJbmZvICogaW5mbywgZ3NpemUgKiBpbmRleCwKKyAgICBndWludDggKiB0YWcsIGdpbnQgdGFnX2xlbiwgZ3VpbnQ2NCAqIHZhbHVlKQoreworICBndWludDY0IGxlbjsKKworICBpZiAoY2hlY2tfaWQgKGluZm8sIGluZGV4LCB0YWcsIHRhZ19sZW4sICZsZW4pKSB7CisgICAgKnZhbHVlID0gcmVhZF9pbnRlZ2VyIChpbmZvLCBpbmRleCwgbGVuKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworLyogQ2hlY2sgdGhlIHRvYyBlbnRyeSBhZ2FpbnN0IHRoZSBtdXhlZCBidWZmZXIKKyAqIFJldHVybnMgdGhlIGludGVybmFsIFVJRCAqLworc3RhdGljIHZvaWQKK2NoZWNrX2NoYXB0ZXIgKEdzdFRvY0VudHJ5ICogdG9jX2VudHJ5LCBHc3RUb2NFbnRyeSAqIGludGVybmFsX3RvY19lbnRyeSwKKyAgICBHc3RNYXBJbmZvICogaW5mbywgZ3NpemUgKiBpbmRleCwgZ2ludCBsYXN0X29mZnNldCkKK3sKKyAgZ3VpbnQ2NCBsZW4sIHZhbHVlLCB1aWQ7CisgIGdpbnQ2NCBzdGFydF9yZWYsIGVuZF9yZWY7CisgIGdjaGFyIHNfdWlkWzMyXTsKKyAgY29uc3QgZ2NoYXIgKnN0cl91aWQ7CisgIEdzdFRvY0VudHJ5ICppbnRlcm5hbF9jaGFwdGVyOworICBHTGlzdCAqY3VyX3N1Yl9jaGFwOworICBHc3RUYWdMaXN0ICp0YWdzOworICBnY2hhciAqdGl0bGU7CisKKyAgZ3VpbnQ4IGNoYXB0ZXJfYXRvbVtdID0geyAweGI2IH07CisgIGd1aW50OCBjaGFwdGVyX3VpZFtdID0geyAweDczLCAweGM0IH07CisgIGd1aW50OCBjaGFwdGVyX3N0cl91aWRbXSA9IHsgMHg1NiwgMHg1NCB9OworICBndWludDggY2hhcHRlcl9zdGFydFtdID0geyAweDkxIH07CisgIGd1aW50OCBjaGFwdGVyX2VuZFtdID0geyAweDkyIH07CisgIGd1aW50OCBjaGFwdGVyX2ZsYWdfaGlkZGVuW10gPSB7IDB4OTggfTsKKyAgZ3VpbnQ4IGNoYXB0ZXJfZmxhZ19lbmFibGVkW10gPSB7IDB4NDUsIDB4OTggfTsKKyAgZ3VpbnQ4IGNoYXB0ZXJfc2VnbWVudF91aWRbXSA9IHsgMHg2ZSwgMHg2NyB9OworICBndWludDggY2hhcHRlcl9zZWdtZW50X2VkaXRpb25fdWlkW10gPSB7IDB4NmUsIDB4YmMgfTsKKyAgZ3VpbnQ4IGNoYXB0ZXJfcGh5c2ljYWxfZXF1aXZbXSA9IHsgMHg2MywgMHhjMyB9OworICBndWludDggY2hhcHRlcl90cmFja1tdID0geyAweDhmIH07CisgIGd1aW50OCBjaGFwdGVyX3RyYWNrX25iW10gPSB7IDB4ODkgfTsKKyAgZ3VpbnQ4IGNoYXB0ZXJfZGlzcGxheVtdID0geyAweDgwIH07CisgIGd1aW50OCBjaGFwdGVyX3N0cmluZ1tdID0geyAweDg1IH07CisgIGd1aW50OCBjaGFwdGVyX2xhbmd1YWdlW10gPSB7IDB4NDMsIDB4N2MgfTsKKworICBmYWlsX3VubGVzcyAoY2hlY2tfaWQgKGluZm8sIGluZGV4LCBjaGFwdGVyX2F0b20sCisgICAgICAgICAgc2l6ZW9mIChjaGFwdGVyX2F0b20pLCAmbGVuKSk7CisKKyAgZmFpbF91bmxlc3MgKGNoZWNrX2lkX3JlYWRfaW50IChpbmZvLCBpbmRleCwgY2hhcHRlcl91aWQsCisgICAgICAgICAgc2l6ZW9mIChjaGFwdGVyX3VpZCksICZ1aWQpKTsKKworICAvKiBvcHRpb25hbCBTdHJpbmdVSUQgKi8KKyAgaWYgKGNoZWNrX2lkIChpbmZvLCBpbmRleCwgY2hhcHRlcl9zdHJfdWlkLCBzaXplb2YgKGNoYXB0ZXJfc3RyX3VpZCksICZsZW4pKSB7CisgICAgc3RyX3VpZCA9IGdzdF90b2NfZW50cnlfZ2V0X3VpZCAodG9jX2VudHJ5KTsKKyAgICBmYWlsX3VubGVzcyAobWVtY21wIChpbmZvLT5kYXRhICsgKmluZGV4LCBzdHJfdWlkLCBzdHJsZW4gKHN0cl91aWQpKSA9PSAwKTsKKyAgICAqaW5kZXggKz0gbGVuOworICB9CisKKyAgZ3N0X3RvY19lbnRyeV9nZXRfc3RhcnRfc3RvcF90aW1lcyAodG9jX2VudHJ5LCAmc3RhcnRfcmVmLCAmZW5kX3JlZik7CisKKyAgZmFpbF91bmxlc3MgKGNoZWNrX2lkX3JlYWRfaW50IChpbmZvLCBpbmRleCwgY2hhcHRlcl9zdGFydCwKKyAgICAgICAgICBzaXplb2YgKGNoYXB0ZXJfc3RhcnQpLCAmdmFsdWUpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoc3RhcnRfcmVmLCB2YWx1ZSk7CisKKyAgLyogb3B0aW9uYWwgY2hhcHRlciBlbmQgKi8KKyAgaWYgKGNoZWNrX2lkX3JlYWRfaW50IChpbmZvLCBpbmRleCwgY2hhcHRlcl9lbmQsCisgICAgICAgICAgc2l6ZW9mIChjaGFwdGVyX2VuZCksICZ2YWx1ZSkpIHsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChlbmRfcmVmLCB2YWx1ZSk7CisgIH0KKworICBmYWlsX3VubGVzcyAoY2hlY2tfaWRfcmVhZF9pbnQgKGluZm8sIGluZGV4LCBjaGFwdGVyX2ZsYWdfaGlkZGVuLAorICAgICAgICAgIHNpemVvZiAoY2hhcHRlcl9mbGFnX2hpZGRlbiksICZ2YWx1ZSkpOworCisgIGZhaWxfdW5sZXNzIChjaGVja19pZF9yZWFkX2ludCAoaW5mbywgaW5kZXgsIGNoYXB0ZXJfZmxhZ19lbmFibGVkLAorICAgICAgICAgIHNpemVvZiAoY2hhcHRlcl9mbGFnX2VuYWJsZWQpLCAmdmFsdWUpKTsKKworICAvKiBvcHRpb25hbCBzZWdtZW50IFVJRCAqLworICBjaGVja19pZF9yZWFkX2ludCAoaW5mbywgaW5kZXgsIGNoYXB0ZXJfc2VnbWVudF91aWQsCisgICAgICBzaXplb2YgKGNoYXB0ZXJfc2VnbWVudF91aWQpLCAmdmFsdWUpOworCisgIC8qIG9wdGlvbmFsIHNlZ21lbnQgZWRpdGlvbiBVSUQgKi8KKyAgY2hlY2tfaWRfcmVhZF9pbnQgKGluZm8sIGluZGV4LCBjaGFwdGVyX3NlZ21lbnRfZWRpdGlvbl91aWQsCisgICAgICBzaXplb2YgKGNoYXB0ZXJfc2VnbWVudF9lZGl0aW9uX3VpZCksICZ2YWx1ZSk7CisKKyAgLyogb3B0aW9uYWwgcGh5c2ljYWwgZXF1aXYgKi8KKyAgY2hlY2tfaWRfcmVhZF9pbnQgKGluZm8sIGluZGV4LCBjaGFwdGVyX3BoeXNpY2FsX2VxdWl2LAorICAgICAgc2l6ZW9mIChjaGFwdGVyX3BoeXNpY2FsX2VxdWl2KSwgJnZhbHVlKTsKKworICAvKiBvcHRpb25hbCBjaGFwdGVyIHRyYWNrICovCisgIGlmIChjaGVja19pZCAoaW5mbywgaW5kZXgsIGNoYXB0ZXJfdHJhY2ssIHNpemVvZiAoY2hhcHRlcl90cmFjayksICZsZW4pKSB7CisgICAgZmFpbF91bmxlc3MgKGNoZWNrX2lkX3JlYWRfaW50IChpbmZvLCBpbmRleCwgY2hhcHRlcl90cmFja19uYiwKKyAgICAgICAgICAgIHNpemVvZiAoY2hhcHRlcl90cmFja19uYiksICZ2YWx1ZSkpOworICB9CisKKyAgLyogRklYTUU6IHRoZXJlIGNhbiBiZSBzZXZlcmFsIGNoYXB0ZXIgZGlzcGxheXMgKi8KKyAgaWYgKGNoZWNrX2lkIChpbmZvLCBpbmRleCwgY2hhcHRlcl9kaXNwbGF5LCBzaXplb2YgKGNoYXB0ZXJfZGlzcGxheSksICZsZW4pKSB7CisgICAgLyogY2hhcHRlciBkaXNwbGF5ICovCisgICAgZmFpbF91bmxlc3MgKGNoZWNrX2lkIChpbmZvLCBpbmRleCwgY2hhcHRlcl9zdHJpbmcsCisgICAgICAgICAgICBzaXplb2YgKGNoYXB0ZXJfc3RyaW5nKSwgJmxlbikpOworCisgICAgdGFncyA9IGdzdF90b2NfZW50cnlfZ2V0X3RhZ3MgKHRvY19lbnRyeSk7CisgICAgaWYgKGdzdF90YWdfbGlzdF9nZXRfdGFnX3NpemUgKHRhZ3MsIEdTVF9UQUdfVElUTEUpID4gMCkgeworICAgICAgZ3N0X3RhZ19saXN0X2dldF9zdHJpbmdfaW5kZXggKHRhZ3MsIEdTVF9UQUdfVElUTEUsIDAsICZ0aXRsZSk7CisgICAgICBmYWlsX3VubGVzcyAobWVtY21wIChpbmZvLT5kYXRhICsgKmluZGV4LCB0aXRsZSwgc3RybGVuICh0aXRsZSkpID09IDApOworICAgICAgZ19mcmVlICh0aXRsZSk7CisgICAgfQorICAgICppbmRleCArPSBsZW47CisKKyAgICBmYWlsX3VubGVzcyAoY2hlY2tfaWQgKGluZm8sIGluZGV4LCBjaGFwdGVyX2xhbmd1YWdlLAorICAgICAgICAgICAgc2l6ZW9mIChjaGFwdGVyX2xhbmd1YWdlKSwgJmxlbikpOworICAgIC8qIFRPRE86IGRlZmluZSBsYW5ndWFnZSAtIGFsd2F5cyAidW5kIiBBVE0gKi8KKyAgICAqaW5kZXggKz0gbGVuOworICB9CisKKyAgLyogVE9ETzogYWRkIHJlbWFpbmluZyBmaWVsZHMgKG5vdCB1c2VkIGluIGN1cnJlbnQgbWF0cm9za2EtbXV4KSAqLworCisgIGdfc25wcmludGYgKHNfdWlkLCBzaXplb2YgKHNfdWlkKSwgIiUiIEdfR0lOVDY0X0ZPUk1BVCwgdWlkKTsKKyAgaW50ZXJuYWxfY2hhcHRlciA9IGdzdF90b2NfZW50cnlfbmV3IChHU1RfVE9DX0VOVFJZX1RZUEVfQ0hBUFRFUiwgc191aWQpOworICBnc3RfdG9jX2VudHJ5X2FwcGVuZF9zdWJfZW50cnkgKGludGVybmFsX3RvY19lbnRyeSwgaW50ZXJuYWxfY2hhcHRlcik7CisKKyAgY3VyX3N1Yl9jaGFwID0gZ3N0X3RvY19lbnRyeV9nZXRfc3ViX2VudHJpZXMgKHRvY19lbnRyeSk7CisgIHdoaWxlIChjdXJfc3ViX2NoYXAgIT0gTlVMTCAmJiAqaW5kZXggPCBsYXN0X29mZnNldCkgeworICAgIGNoZWNrX2NoYXB0ZXIgKGN1cl9zdWJfY2hhcC0+ZGF0YSwgaW50ZXJuYWxfY2hhcHRlciwgaW5mbywKKyAgICAgICAgaW5kZXgsIGxhc3Rfb2Zmc2V0KTsKKyAgICBjdXJfc3ViX2NoYXAgPSBjdXJfc3ViX2NoYXAtPm5leHQ7CisgIH0KKworICBmYWlsX3VubGVzcyAoY3VyX3N1Yl9jaGFwID09IE5VTEwpOworfQorCisvKiBDaGVjayB0aGUgcmVmZXJlbmNlIHRvYyBhZ2FpbnN0IHRoZSBtdXhlZCBidWZmZXIgKi8KK3N0YXRpYyB2b2lkCitjaGVja190b2MgKEdzdFRvYyAqIHJlZl90b2MsIEdzdFRvYyAqIGludGVybmFsX3RvYywKKyAgICBHc3RNYXBJbmZvICogaW5mbywgZ3NpemUgKiBpbmRleCkKK3sKKyAgZ3VpbnQ2NCBsZW4sIHZhbHVlLCB1aWQ7CisgIGdjaGFyIHNfdWlkWzMyXTsKKyAgZ2ludCBsYXN0X29mZnNldDsKKyAgR0xpc3QgKmN1cl9lbnRyeSwgKmN1cl9jaGFwdGVyOworICBHc3RUb2NFbnRyeSAqaW50ZXJuYWxfZWRpdGlvbjsKKworICBndWludDggZWRpdGlvbl9lbnRyeVtdID0geyAweDQ1LCAweGI5IH07CisgIGd1aW50OCBlZGl0aW9uX3VpZFtdID0geyAweDQ1LCAweGJjIH07CisgIGd1aW50OCBlZGl0aW9uX2ZsYWdfaGlkZGVuW10gPSB7IDB4NDUsIDB4YmQgfTsKKyAgZ3VpbnQ4IGVkaXRpb25fZmxhZ19kZWZhdWx0W10gPSB7IDB4NDUsIDB4ZGIgfTsKKyAgZ3VpbnQ4IGVkaXRpb25fZmxhZ19vcmRlcmVkW10gPSB7IDB4NDUsIDB4ZGQgfTsKKworICAvKiBlZGl0aW9uIGVudHJ5ICovCisgIGZhaWxfdW5sZXNzIChjaGVja19pZCAoaW5mbywgaW5kZXgsIGVkaXRpb25fZW50cnksCisgICAgICAgICAgc2l6ZW9mIChlZGl0aW9uX2VudHJ5KSwgJmxlbikpOworICBsYXN0X29mZnNldCA9ICppbmRleCArIChnaW50KSBsZW47CisKKyAgY3VyX2VudHJ5ID0gZ3N0X3RvY19nZXRfZW50cmllcyAocmVmX3RvYyk7CisgIHdoaWxlIChjdXJfZW50cnkgIT0gTlVMTCAmJiAqaW5kZXggPCBsYXN0X29mZnNldCkgeworICAgIHVpZCA9IDA7CisgICAgY2hlY2tfaWRfcmVhZF9pbnQgKGluZm8sIGluZGV4LCBlZGl0aW9uX3VpZCwgc2l6ZW9mIChlZGl0aW9uX3VpZCksICZ1aWQpOworICAgIGdfc25wcmludGYgKHNfdWlkLCBzaXplb2YgKHNfdWlkKSwgIiUiIEdfR0lOVDY0X0ZPUk1BVCwgdWlkKTsKKyAgICBpbnRlcm5hbF9lZGl0aW9uID0gZ3N0X3RvY19lbnRyeV9uZXcgKEdTVF9UT0NfRU5UUllfVFlQRV9FRElUSU9OLCBzX3VpZCk7CisgICAgZ3N0X3RvY19hcHBlbmRfZW50cnkgKGludGVybmFsX3RvYywgaW50ZXJuYWxfZWRpdGlvbik7CisKKyAgICBmYWlsX3VubGVzcyAoY2hlY2tfaWRfcmVhZF9pbnQgKGluZm8sIGluZGV4LCBlZGl0aW9uX2ZsYWdfaGlkZGVuLAorICAgICAgICAgICAgc2l6ZW9mIChlZGl0aW9uX2ZsYWdfaGlkZGVuKSwgJnZhbHVlKSk7CisKKyAgICBmYWlsX3VubGVzcyAoY2hlY2tfaWRfcmVhZF9pbnQgKGluZm8sIGluZGV4LCBlZGl0aW9uX2ZsYWdfZGVmYXVsdCwKKyAgICAgICAgICAgIHNpemVvZiAoZWRpdGlvbl9mbGFnX2RlZmF1bHQpLCAmdmFsdWUpKTsKKworICAgIC8qIG9wdGlvbmFsICovCisgICAgY2hlY2tfaWRfcmVhZF9pbnQgKGluZm8sIGluZGV4LCBlZGl0aW9uX2ZsYWdfb3JkZXJlZCwKKyAgICAgICAgc2l6ZW9mIChlZGl0aW9uX2ZsYWdfb3JkZXJlZCksICZ2YWx1ZSk7CisKKyAgICBjdXJfY2hhcHRlciA9IGdzdF90b2NfZW50cnlfZ2V0X3N1Yl9lbnRyaWVzIChjdXJfZW50cnktPmRhdGEpOworICAgIHdoaWxlIChjdXJfY2hhcHRlciAhPSBOVUxMICYmICppbmRleCA8IGxhc3Rfb2Zmc2V0KSB7CisgICAgICBjaGVja19jaGFwdGVyIChjdXJfY2hhcHRlci0+ZGF0YSwgaW50ZXJuYWxfZWRpdGlvbiwgaW5mbywKKyAgICAgICAgICBpbmRleCwgbGFzdF9vZmZzZXQpOworICAgICAgY3VyX2NoYXB0ZXIgPSBjdXJfY2hhcHRlci0+bmV4dDsKKyAgICB9CisgICAgZmFpbF91bmxlc3MgKGN1cl9jaGFwdGVyID09IE5VTEwpOworCisgICAgY3VyX2VudHJ5ID0gY3VyX2VudHJ5LT5uZXh0OworICB9CisKKyAgZmFpbF91bmxlc3MgKGN1cl9lbnRyeSA9PSBOVUxMICYmICppbmRleCA9PSBsYXN0X29mZnNldCk7Cit9CisKK3N0YXRpYyBHc3RUb2NFbnRyeSAqCitmaW5kX3RvY19lbnRyeSAoR3N0VG9jRW50cnkgKiByZWZfdG9jX2VudHJ5LCBHc3RUb2NFbnRyeSAqIGludGVybmFsX3RvY19lbnRyeSwKKyAgICBndWludDY0IHVpZCkKK3sKKyAgR0xpc3QgKmN1cl9yZWZfZW50cnksICpjdXJfaW50ZXJuYWxfZW50cnk7CisgIGd1aW50NjQgaW50ZXJuYWxfdWlkOworICBHc3RUb2NFbnRyeSAqcmVzdWx0ID0gTlVMTDsKKworICBpbnRlcm5hbF91aWQgPSBnX2FzY2lpX3N0cnRvdWxsIChnc3RfdG9jX2VudHJ5X2dldF91aWQgKGludGVybmFsX3RvY19lbnRyeSksCisgICAgICBOVUxMLCAxMCk7CisgIGlmICh1aWQgPT0gaW50ZXJuYWxfdWlkKSB7CisgICAgcmVzdWx0ID0gcmVmX3RvY19lbnRyeTsKKyAgfSBlbHNlIHsKKyAgICBjdXJfcmVmX2VudHJ5ID0gZ3N0X3RvY19lbnRyeV9nZXRfc3ViX2VudHJpZXMgKHJlZl90b2NfZW50cnkpOworICAgIGN1cl9pbnRlcm5hbF9lbnRyeSA9IGdzdF90b2NfZW50cnlfZ2V0X3N1Yl9lbnRyaWVzIChpbnRlcm5hbF90b2NfZW50cnkpOworICAgIHdoaWxlIChjdXJfcmVmX2VudHJ5ICE9IE5VTEwgJiYgY3VyX2ludGVybmFsX2VudHJ5ICE9IE5VTEwpIHsKKyAgICAgIHJlc3VsdCA9IGZpbmRfdG9jX2VudHJ5IChjdXJfcmVmX2VudHJ5LT5kYXRhLCBjdXJfaW50ZXJuYWxfZW50cnktPmRhdGEsCisgICAgICAgICAgdWlkKTsKKworICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjdXJfcmVmX2VudHJ5ID0gY3VyX3JlZl9lbnRyeS0+bmV4dDsKKyAgICAgIGN1cl9pbnRlcm5hbF9lbnRyeSA9IGN1cl9pbnRlcm5hbF9lbnRyeS0+bmV4dDsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorZmluZF9hbmRfY2hlY2tfdGFncyAoR3N0VG9jICogcmVmX3RvYywgR3N0VG9jICogaW50ZXJuYWxfdG9jLCBHc3RNYXBJbmZvICogaW5mbywKKyAgICBndWludDY0IHVpZCwgZ2NoYXIgKiB0YWdfbmFtZSwgZ2NoYXIgKiB0YWdfc3RyaW5nKQoreworICBHTGlzdCAqY3VyX3JlZl9lbnRyeSwgKmN1cl9pbnRlcm5hbF9lbnRyeTsKKyAgR3N0VG9jRW50cnkgKnJlZl90b2NfZW50cnkgPSBOVUxMOworICBHc3RUYWdMaXN0ICp0YWdzOworICBjb25zdCBnY2hhciAqdGFnX3R5cGU7CisgIGdjaGFyICpjdXJfdGFnX3N0cmluZzsKKworICAvKiBmaW5kIHRoZSByZWZlcmVuY2UgdG9jIGVudHJ5IG1hdGNoaW5nIHRoZSBVSUQgKi8KKyAgY3VyX3JlZl9lbnRyeSA9IGdzdF90b2NfZ2V0X2VudHJpZXMgKHJlZl90b2MpOworICBjdXJfaW50ZXJuYWxfZW50cnkgPSBnc3RfdG9jX2dldF9lbnRyaWVzIChpbnRlcm5hbF90b2MpOworICB3aGlsZSAoY3VyX3JlZl9lbnRyeSAhPSBOVUxMICYmIGN1cl9pbnRlcm5hbF9lbnRyeSAhPSBOVUxMKSB7CisgICAgcmVmX3RvY19lbnRyeSA9IGZpbmRfdG9jX2VudHJ5IChjdXJfcmVmX2VudHJ5LT5kYXRhLAorICAgICAgICBjdXJfaW50ZXJuYWxfZW50cnktPmRhdGEsIHVpZCk7CisKKyAgICBpZiAocmVmX3RvY19lbnRyeSAhPSBOVUxMKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjdXJfcmVmX2VudHJ5ID0gY3VyX3JlZl9lbnRyeS0+bmV4dDsKKyAgICBjdXJfaW50ZXJuYWxfZW50cnkgPSBjdXJfaW50ZXJuYWxfZW50cnktPm5leHQ7CisgIH0KKworICBmYWlsX3VubGVzcyAocmVmX3RvY19lbnRyeSAhPSBOVUxMKTsKKworICBpZiAoZ19zdHJjbXAwICh0YWdfbmFtZSwgIkFSVElTVCIpID09IDApIHsKKyAgICB0YWdfdHlwZSA9IEdTVF9UQUdfQVJUSVNUOworICB9IGVsc2UgaWYgKGdfc3RyY21wMCAodGFnX25hbWUsICJDT01NRU5UUyIpID09IDApIHsKKyAgICB0YWdfdHlwZSA9IEdTVF9UQUdfQ09NTUVOVDsKKyAgfSBlbHNlIHsKKyAgICB0YWdfdHlwZSA9IE5VTEw7CisgIH0KKworICBmYWlsX3VubGVzcyAodGFnX3R5cGUgIT0gTlVMTCk7CisKKyAgdGFncyA9IGdzdF90b2NfZW50cnlfZ2V0X3RhZ3MgKHJlZl90b2NfZW50cnkpOworICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF90YWdfc2l6ZSAodGFncywgdGFnX3R5cGUpID4gMCk7CisgIGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nX2luZGV4ICh0YWdzLCB0YWdfdHlwZSwgMCwgJmN1cl90YWdfc3RyaW5nKTsKKyAgZmFpbF91bmxlc3MgKGdfc3RyY21wMCAoY3VyX3RhZ19zdHJpbmcsIHRhZ19zdHJpbmcpID09IDApOworICBnX2ZyZWUgKGN1cl90YWdfc3RyaW5nKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3RhZ3MgKEdzdFRvYyAqIHJlZl90b2MsIEdzdFRvYyAqIGludGVybmFsX3RvYywKKyAgICBHc3RNYXBJbmZvICogaW5mbywgZ3NpemUgKiBpbmRleCkKK3sKKyAgZ2Jvb2xlYW4gZm91bmRfdGFncyA9IEZBTFNFLCBtdXN0X2NoZWNrX3RhZyA9IEZBTFNFOworICBndWludDY0IGxlbiwgdmFsdWUsIHVpZDsKKyAgZ3NpemUgbGFzdF9vZmZzZXQsIG5leHRfdGFnOworICBnY2hhciAqdGFnX25hbWVfc3RyLCAqdGFnX3N0cmluZ19zdHI7CisgIGd1aW50OCB0YWdzW10gPSB7IDB4MTIsIDB4NTQsIDB4YzMsIDB4NjcgfTsKKyAgZ3VpbnQ4IHRhZ1tdID0geyAweDczLCAweDczIH07CisgIGd1aW50OCB0YWdfdGFyZ2V0c1tdID0geyAweDYzLCAweGMwIH07CisgIGd1aW50OCB0YWdfdGFyZ2V0X3R5cGVfdmFsdWVbXSA9IHsgMHg2OCwgMHhjYSB9OworICBndWludDggdGFnX3RhcmdldF90eXBlW10gPSB7IDB4NjMsIDB4Y2EgfTsKKyAgZ3VpbnQ4IHRhZ19lZGl0aW9uX3VpZFtdID0geyAweDYzLCAweGM5IH07CisgIGd1aW50OCB0YWdfY2hhcHRlcl91aWRbXSA9IHsgMHg2MywgMHhjNCB9OworICBndWludDggc2ltcGxlX3RhZ1tdID0geyAweDY3LCAweGM4IH07CisgIGd1aW50OCB0YWdfbmFtZVtdID0geyAweDQ1LCAweGEzIH07CisgIGd1aW50OCB0YWdfc3RyaW5nW10gPSB7IDB4NDQsIDB4ODcgfTsKKworICBpZiAoaW5mby0+c2l6ZSA+ICppbmRleCArIHNpemVvZiAodGFncykpIHsKKyAgICBmb3IgKDsgKmluZGV4IDwgaW5mby0+c2l6ZSAtIHNpemVvZiAodGFncyk7ICsrKCppbmRleCkpIHsKKyAgICAgIGlmIChtZW1jbXAgKGluZm8tPmRhdGEgKyAqaW5kZXgsIHRhZ3MsIHNpemVvZiAodGFncykpID09IDApIHsKKyAgICAgICAgKmluZGV4ICs9IHNpemVvZiAodGFncyk7CisKKyAgICAgICAgbGVuID0gcmVhZF9sZW5ndGggKGluZm8sIGluZGV4KTsKKyAgICAgICAgbGFzdF9vZmZzZXQgPSAqaW5kZXggKyBsZW47CisKKyAgICAgICAgZm91bmRfdGFncyA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZhaWxfdW5sZXNzIChmb3VuZF90YWdzKTsKKworICB3aGlsZSAoKmluZGV4IDwgbGFzdF9vZmZzZXQpIHsKKyAgICBmYWlsX3VubGVzcyAoY2hlY2tfaWQgKGluZm8sIGluZGV4LCB0YWcsIHNpemVvZiAodGFnKSwgJmxlbikpOworICAgIG5leHRfdGFnID0gKmluZGV4ICsgbGVuOworCisgICAgZmFpbF91bmxlc3MgKGNoZWNrX2lkIChpbmZvLCBpbmRleCwgdGFnX3RhcmdldHMsCisgICAgICAgICAgICBzaXplb2YgKHRhZ190YXJnZXRzKSwgJmxlbikpOworCisgICAgbXVzdF9jaGVja190YWcgPSBGQUxTRTsKKyAgICBjaGVja19pZF9yZWFkX2ludCAoaW5mbywgaW5kZXgsIHRhZ190YXJnZXRfdHlwZV92YWx1ZSwKKyAgICAgICAgc2l6ZW9mICh0YWdfdGFyZ2V0X3R5cGVfdmFsdWUpLCAmdmFsdWUpOworCisgICAgaWYgKGNoZWNrX2lkIChpbmZvLCBpbmRleCwgdGFnX3RhcmdldF90eXBlLCBzaXplb2YgKHRhZ190YXJnZXRfdHlwZSksICZsZW4pKSB7CisgICAgICAqaW5kZXggKz0gbGVuOworICAgIH0KKworICAgIGlmIChjaGVja19pZF9yZWFkX2ludCAoaW5mbywgaW5kZXgsIHRhZ19jaGFwdGVyX3VpZCwKKyAgICAgICAgICAgIHNpemVvZiAodGFnX2NoYXB0ZXJfdWlkKSwgJnVpZCkpIHsKKyAgICAgIG11c3RfY2hlY2tfdGFnID0gVFJVRTsKKyAgICB9IGVsc2UgaWYgKGNoZWNrX2lkX3JlYWRfaW50IChpbmZvLCBpbmRleCwgdGFnX2VkaXRpb25fdWlkLAorICAgICAgICAgICAgc2l6ZW9mICh0YWdfZWRpdGlvbl91aWQpLCAmdWlkKSkgeworICAgICAgbXVzdF9jaGVja190YWcgPSBUUlVFOworICAgIH0KKworICAgIGlmIChtdXN0X2NoZWNrX3RhZykgeworICAgICAgZmFpbF91bmxlc3MgKGNoZWNrX2lkIChpbmZvLCBpbmRleCwgc2ltcGxlX3RhZywKKyAgICAgICAgICAgICAgc2l6ZW9mIChzaW1wbGVfdGFnKSwgJmxlbikpOworCisgICAgICBmYWlsX3VubGVzcyAoY2hlY2tfaWQgKGluZm8sIGluZGV4LCB0YWdfbmFtZSwgc2l6ZW9mICh0YWdfbmFtZSksICZsZW4pKTsKKyAgICAgIHRhZ19uYW1lX3N0ciA9IGdfc3RybmR1cCAoKGdjaGFyICopIGluZm8tPmRhdGEgKyAqaW5kZXgsIGxlbik7CisgICAgICAqaW5kZXggKz0gbGVuOworCisgICAgICBmYWlsX3VubGVzcyAoY2hlY2tfaWQgKGluZm8sIGluZGV4LCB0YWdfc3RyaW5nLCBzaXplb2YgKHRhZ19zdHJpbmcpLAorICAgICAgICAgICAgICAmbGVuKSk7CisgICAgICB0YWdfc3RyaW5nX3N0ciA9IGdfc3RybmR1cCAoKGdjaGFyICopIGluZm8tPmRhdGEgKyAqaW5kZXgsIGxlbik7CisgICAgICAqaW5kZXggKz0gbGVuOworCisgICAgICBmaW5kX2FuZF9jaGVja190YWdzIChyZWZfdG9jLCBpbnRlcm5hbF90b2MsIGluZm8sIHVpZCwKKyAgICAgICAgICB0YWdfbmFtZV9zdHIsIHRhZ19zdHJpbmdfc3RyKTsKKworICAgICAgZ19mcmVlICh0YWdfbmFtZV9zdHIpOworICAgICAgZ19mcmVlICh0YWdfc3RyaW5nX3N0cik7CisgICAgfQorCisgICAgKmluZGV4ID0gbmV4dF90YWc7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3NlZ21lbnQgKEdzdFRvYyAqIHJlZl90b2MsIEdzdFRvYyAqIGludGVybmFsX3RvYywKKyAgICBHc3RNYXBJbmZvICogaW5mbywgZ3NpemUgKiBpbmRleCkKK3sKKyAgZ3VpbnQ4IG1hdHJvc2thX3NlZ21lbnRbXSA9IHsgMHgxOCwgMHg1MywgMHg4MCwgMHg2NyB9OworICBndWludDggbWF0cm9za2Ffc2Vla19pZF9jaGFwdGVyc1tdID0geyAweDUzLCAweGFiLCAweDg0LAorICAgIDB4MTAsIDB4NDMsIDB4QTcsIDB4NzAKKyAgfTsKKyAgZ3VpbnQ4IG1hdHJvc2thX3NlZWtfaWRfdGFnc1tdID0geyAweDUzLCAweGFiLCAweDg0LAorICAgIDB4MTIsIDB4NTQsIDB4YzMsIDB4NjcKKyAgfTsKKyAgZ3VpbnQ4IG1hdHJvc2thX3NlZWtfcG9zW10gPSB7IDB4NTMsIDB4YWMgfTsKKyAgZ3VpbnQ4IG1hdHJvc2thX2NoYXB0ZXJzW10gPSB7IDB4MTAsIDB4NDMsIDB4QTcsIDB4NzAgfTsKKworICBndWludDY0IGxlbiwgdmFsdWUsIHNlZ21lbnRfb2Zmc2V0LCBjaGFwdGVyc19vZmZzZXQsIHRhZ3Nfb2Zmc2V0OworICBnYm9vbGVhbiBmb3VuZF9jaGFwdGVyc19kZWNsYXJhdGlvbiA9IEZBTFNFLCBmb3VuZF90YWdzX2RlY2xhcmF0aW9uID0gRkFMU0U7CisKKyAgLyogU2VnbWVudCAqLworICBmYWlsX3VubGVzcyAoaW5mby0+c2l6ZSA+IHNpemVvZiAobWF0cm9za2Ffc2VnbWVudCkpOworICBmYWlsX3VubGVzcyAoY2hlY2tfaWQgKGluZm8sIGluZGV4LCBtYXRyb3NrYV9zZWdtZW50LAorICAgICAgICAgIHNpemVvZiAobWF0cm9za2Ffc2VnbWVudCksICZsZW4pKTsKKworICBzZWdtZW50X29mZnNldCA9ICppbmRleDsKKworICAvKiBTZWFyY2ggY2hhcHRlciBkZWNsYXJhdGlvbiBpbiBzZWVrIGhlYWQgKi8KKyAgZm9yICg7ICppbmRleCA8IGxlbiAtIHNpemVvZiAobWF0cm9za2Ffc2Vla19pZF9jaGFwdGVycyk7ICsrKCppbmRleCkpIHsKKyAgICBpZiAobWVtY21wIChpbmZvLT5kYXRhICsgKmluZGV4LCBtYXRyb3NrYV9zZWVrX2lkX2NoYXB0ZXJzLAorICAgICAgICAgICAgc2l6ZW9mIChtYXRyb3NrYV9zZWVrX2lkX2NoYXB0ZXJzKSkgPT0gMCkgeworICAgICAgKmluZGV4ICs9IHNpemVvZiAobWF0cm9za2Ffc2Vla19pZF9jaGFwdGVycyk7CisKKyAgICAgIGlmIChjaGVja19pZF9yZWFkX2ludCAoaW5mbywgaW5kZXgsIG1hdHJvc2thX3NlZWtfcG9zLAorICAgICAgICAgICAgICBzaXplb2YgKG1hdHJvc2thX3NlZWtfcG9zKSwgJnZhbHVlKSkgeworICAgICAgICAvKiBmb3VuZCBjaGFwdGVyIGRlY2xhcmF0aW9uICovCisgICAgICAgIGZvdW5kX2NoYXB0ZXJzX2RlY2xhcmF0aW9uID0gVFJVRTsKKyAgICAgICAgY2hhcHRlcnNfb2Zmc2V0ID0gc2VnbWVudF9vZmZzZXQgKyB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZmFpbF91bmxlc3MgKGZvdW5kX2NoYXB0ZXJzX2RlY2xhcmF0aW9uKTsKKworICAqaW5kZXggPSBjaGFwdGVyc19vZmZzZXQ7CisgIGlmIChjaGVja19pZCAoaW5mbywgaW5kZXgsIG1hdHJvc2thX2NoYXB0ZXJzLAorICAgICAgICAgIHNpemVvZiAobWF0cm9za2FfY2hhcHRlcnMpLCAmbGVuKSkgeworICAgIGNoZWNrX3RvYyAocmVmX3RvYywgaW50ZXJuYWxfdG9jLCBpbmZvLCBpbmRleCk7CisgIH0KKworICAvKiBTZWFyY2ggdGFncyBkZWNsYXJhdGlvbiBpbiBzZWVrIGhlYWQgKi8KKyAgZm9yICgqaW5kZXggPSBzZWdtZW50X29mZnNldDsgKmluZGV4IDwgbGVuIC0gc2l6ZW9mIChtYXRyb3NrYV9zZWVrX2lkX3RhZ3MpOworICAgICAgKysoKmluZGV4KSkgeworICAgIGlmIChtZW1jbXAgKGluZm8tPmRhdGEgKyAqaW5kZXgsIG1hdHJvc2thX3NlZWtfaWRfdGFncywKKyAgICAgICAgICAgIHNpemVvZiAobWF0cm9za2Ffc2Vla19pZF90YWdzKSkgPT0gMCkgeworICAgICAgKmluZGV4ICs9IHNpemVvZiAobWF0cm9za2Ffc2Vla19pZF90YWdzKTsKKworICAgICAgaWYgKGNoZWNrX2lkX3JlYWRfaW50IChpbmZvLCBpbmRleCwgbWF0cm9za2Ffc2Vla19wb3MsCisgICAgICAgICAgICAgIHNpemVvZiAobWF0cm9za2Ffc2Vla19wb3MpLCAmdmFsdWUpKSB7CisgICAgICAgIC8qIGZvdW5kIHRhZ3MgZGVjbGFyYXRpb24gKi8KKyAgICAgICAgZm91bmRfdGFnc19kZWNsYXJhdGlvbiA9IFRSVUU7CisgICAgICAgIHRhZ3Nfb2Zmc2V0ID0gc2VnbWVudF9vZmZzZXQgKyB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZmFpbF91bmxlc3MgKGZvdW5kX3RhZ3NfZGVjbGFyYXRpb24pOworCisgICppbmRleCA9IHRhZ3Nfb2Zmc2V0OworICBjaGVja190YWdzIChyZWZfdG9jLCBpbnRlcm5hbF90b2MsIGluZm8sIGluZGV4KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfdG9jIChnYm9vbGVhbiB3aXRoX2VkaXRpb24pCit7CisgIEdzdEhhcm5lc3MgKmg7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXIsICptZXJnZWRfYnVmZmVyOworICBHc3RNYXBJbmZvIGluZm87CisgIGd1aW50NjQgbGVuOworICBnc2l6ZSBpbmRleDsKKyAgR3N0VG9jU2V0dGVyICp0b2Nfc2V0dGVyOworICBHc3RUb2MgKnRlc3RfdG9jLCAqcmVmX3RvYywgKmludGVybmFsX3RvYzsKKworICBndWludDggZWJtbF9oZWFkZXJbXSA9IHsgMHgxYSwgMHg0NSwgMHhkZiwgMHhhMyB9OworCisgIGggPSBzZXR1cF9tYXRyb3NrYW11eF9oYXJuZXNzIChBQzNfQ0FQU19TVFJJTkcpOworCisgIC8qIE1ha2UgZWxlbWVudCBzZWVrYWJsZSAqLworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAoaC0+c2lua3BhZCwgc2Vla2FibGVfc2lua3BhZF9xdWVyeSk7CisKKyAgdG9jX3NldHRlciA9IEdTVF9UT0NfU0VUVEVSIChoLT5lbGVtZW50KTsKKyAgZmFpbF91bmxlc3MgKHRvY19zZXR0ZXIgIT0gTlVMTCk7CisKKyAgaWYgKHdpdGhfZWRpdGlvbikgeworICAgIHRlc3RfdG9jID0gbmV3X3JlZmVyZW5jZV90b2MgKCk7CisgIH0gZWxzZSB7CisgICAgdGVzdF90b2MgPSBuZXdfbm9fZWRpdGlvbl90b2MgKCk7CisgIH0KKyAgZ3N0X3RvY19zZXR0ZXJfc2V0X3RvYyAodG9jX3NldHRlciwgdGVzdF90b2MpOworICBnc3RfdG9jX3VucmVmICh0ZXN0X3RvYyk7CisKKyAgaW5idWZmZXIgPSBnc3RfaGFybmVzc19jcmVhdGVfYnVmZmVyIChoLCAxKTsKKyAgZ3N0X2J1ZmZlcl9tZW1zZXQgKGluYnVmZmVyLCAwLCAwLCAxKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGluYnVmZmVyKSA9IDEgKiBHU1RfTVNFQ09ORDsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGluYnVmZmVyKSk7CisKKyAgLyogc2VuZCBlb3MgdG8gZW5zdXJlIGV2ZXJ5dGhpbmcgaXMgd3JpdHRlbiAqLworICBmYWlsX3VubGVzcyAoZ3N0X2hhcm5lc3NfcHVzaF9ldmVudCAoaCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKyAgQVNTRVJUX01JTklfT0JKRUNUX1JFRkNPVU5UICh0ZXN0X3RvYywgInRlc3RfdG9jIiwgMSk7CisKKyAgb3V0YnVmZmVyID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGZhaWxfdW5sZXNzIChvdXRidWZmZXIgIT0gTlVMTCk7CisKKyAgLyogTWVyZ2UgYnVmZmVycyAqLworICBtZXJnZWRfYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgIHdoaWxlIChvdXRidWZmZXIgIT0gTlVMTCkgeworICAgIGlmIChvdXRidWZmZXItPm9mZnNldCA9PSBnc3RfYnVmZmVyX2dldF9zaXplIChtZXJnZWRfYnVmZmVyKSkgeworICAgICAgZ3N0X2J1ZmZlcl9hcHBlbmRfbWVtb3J5IChtZXJnZWRfYnVmZmVyLAorICAgICAgICAgIGdzdF9idWZmZXJfZ2V0X2FsbF9tZW1vcnkgKG91dGJ1ZmZlcikpOworICAgIH0gZWxzZSB7CisgICAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tYXAgKG91dGJ1ZmZlciwgJmluZm8sIEdTVF9NQVBfUkVBRCkpOworICAgICAgZ3N0X2J1ZmZlcl9maWxsIChtZXJnZWRfYnVmZmVyLCBvdXRidWZmZXItPm9mZnNldCwgaW5mby5kYXRhLCBpbmZvLnNpemUpOworICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmaW5mbyk7CisgICAgfQorCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmZmVyKTsKKyAgICBvdXRidWZmZXIgPSBnc3RfaGFybmVzc190cnlfcHVsbCAoaCk7CisgIH0KKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tYXAgKG1lcmdlZF9idWZmZXIsICZpbmZvLCBHU1RfTUFQX1JFQUQpKTsKKyAgaW5kZXggPSAwOworCisgIGZhaWxfdW5sZXNzIChjaGVja19pZCAoJmluZm8sICZpbmRleCwgZWJtbF9oZWFkZXIsCisgICAgICAgICAgc2l6ZW9mIChlYm1sX2hlYWRlciksICZsZW4pKTsKKyAgLyogc2tpcCBoZWFkZXIgKi8KKyAgaW5kZXggKz0gbGVuOworCisgIHJlZl90b2MgPSBuZXdfcmVmZXJlbmNlX3RvYyAoKTsKKyAgaW50ZXJuYWxfdG9jID0gZ3N0X3RvY19uZXcgKEdTVF9UT0NfU0NPUEVfR0xPQkFMKTsKKyAgY2hlY2tfc2VnbWVudCAocmVmX3RvYywgaW50ZXJuYWxfdG9jLCAmaW5mbywgJmluZGV4KTsKKyAgZ3N0X3RvY191bnJlZiAoaW50ZXJuYWxfdG9jKTsKKyAgZ3N0X3RvY191bnJlZiAocmVmX3RvYyk7CisKKyAgZ3N0X2J1ZmZlcl91bm1hcCAobWVyZ2VkX2J1ZmZlciwgJmluZm8pOworICBnc3RfYnVmZmVyX3VucmVmIChtZXJnZWRfYnVmZmVyKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF90b2Nfd2l0aF9lZGl0aW9uKQoreworICB0ZXN0X3RvYyAoVFJVRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdG9jX3dpdGhvdXRfZWRpdGlvbikKK3sKKyAgdGVzdF90b2MgKEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorbWF0cm9za2FtdXhfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgibWF0cm9za2FtdXgiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZWJtbF9oZWFkZXJfdjEpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZWJtbF9oZWFkZXJfdjIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfdm9yYmlzX2hlYWRlcik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ibG9ja19ncm91cF92MSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ibG9ja19ncm91cF92Mik7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3Jlc2V0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2xpbmtfd2VibW11eF93ZWJtX3NpbmspOworICB0Y2FzZV9hZGRfbG9vcF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90aW1lY29kZXNjYWxlLAorICAgICAgMCwgR19OX0VMRU1FTlRTICh0aW1lY29kZXNjYWxlcykpOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90b2Nfd2l0aF9lZGl0aW9uKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3RvY193aXRob3V0X2VkaXRpb24pOworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKG1hdHJvc2thbXV4KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thcGFyc2UuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL21hdHJvc2thcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2VmOGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvbWF0cm9za2FwYXJzZS5jCkBAIC0wLDAgKzEsMTMwIEBACisvKiBHU3RyZWFtZXIgdW5pdCB0ZXN0cyBmb3IgbWF0cm9za2FwYXJzZQorICogQ29weXJpZ2h0IChDKSAyMDExIFRpbS1QaGlsaXBwIE3DvGxsZXIgIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworc3RhdGljIHZvaWQKK3J1bl9jaGVja19mb3JfZmlsZSAoY29uc3QgZ2NoYXIgKiBmaWxlX25hbWUsIGdib29sZWFuIHB1c2hfbW9kZSkKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmV0OworICBHc3RNZXNzYWdlICptc2c7CisgIEdzdEVsZW1lbnQgKnNyYywgKnNlcCwgKnNpbmssICptYXRyb3NrYXBhcnNlLCAqcGlwZWxpbmU7CisgIEdzdEJ1cyAqYnVzOworICBnY2hhciAqcGF0aDsKKworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBmYWlsX3VubGVzcyAocGlwZWxpbmUgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgcGlwZWxpbmUhIik7CisKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAocGlwZWxpbmUpOworCisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZpbGVzcmMiLCAiZmlsZXNyYyIpOworICBmYWlsX3VubGVzcyAoc3JjICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlICdmaWxlc3JjJyBlbGVtZW50ISIpOworCisgIGlmIChwdXNoX21vZGUpIHsKKyAgICBzZXAgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJxdWV1ZSIsICJxdWV1ZSIpOworICAgIGZhaWxfdW5sZXNzIChzZXAgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgJ3F1ZXVlJyBlbGVtZW50Iik7CisgIH0gZWxzZSB7CisgICAgc2VwID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaWRlbnRpdHkiLCAiaWRlbnRpdHkiKTsKKyAgICBmYWlsX3VubGVzcyAoc2VwICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlICdpZGVudGl0eScgZWxlbWVudCIpOworICB9CisKKyAgbWF0cm9za2FwYXJzZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoIm1hdHJvc2thcGFyc2UiLCAibWF0cm9za2FwYXJzZSIpOworICBmYWlsX3VubGVzcyAobWF0cm9za2FwYXJzZSAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSBtYXRyb3NrYXBhcnNlIGVsZW1lbnQiKTsKKworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAiZmFrZXNpbmsiKTsKKyAgZmFpbF91bmxlc3MgKHNpbmsgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgJ2Zha2VzaW5rJyBlbGVtZW50ISIpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjLCBzZXAsIG1hdHJvc2thcGFyc2UsIHNpbmssIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rIChzcmMsIHNlcCkpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGluayAoc2VwLCBtYXRyb3NrYXBhcnNlKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rIChtYXRyb3NrYXBhcnNlLCBzaW5rKSk7CisKKyAgcGF0aCA9IGdfYnVpbGRfZmlsZW5hbWUgKEdTVF9URVNUX0ZJTEVTX1BBVEgsIGZpbGVfbmFtZSwgTlVMTCk7CisgIEdTVF9MT0cgKCJyZWFkaW5nIGZpbGUgJyVzJyIsIHBhdGgpOworICBnX29iamVjdF9zZXQgKHNyYywgImxvY2F0aW9uIiwgcGF0aCwgTlVMTCk7CisKKyAgc3RhdGVfcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BBVVNFRCk7CisgIGZhaWxfdW5sZXNzIChzdGF0ZV9yZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBpZiAoc3RhdGVfcmV0ID09IEdTVF9TVEFURV9DSEFOR0VfQVNZTkMpIHsKKyAgICBHU1RfTE9HICgid2FpdGluZyBmb3IgcGlwZWxpbmUgdG8gcmVhY2ggUEFVU0VEIHN0YXRlIik7CisgICAgc3RhdGVfcmV0ID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChwaXBlbGluZSwgTlVMTCwgTlVMTCwgLTEpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHN0YXRlX3JldCwgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKyAgfQorCisgIEdTVF9MT0cgKCJQQVVTRUQsIGxldCdzIHBsYXkgYSBsaXR0bGUuLiIpOworICBzdGF0ZV9yZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGZhaWxfdW5sZXNzIChzdGF0ZV9yZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBtc2cgPSBnc3RfYnVzX3BvbGwgKGJ1cywgR1NUX01FU1NBR0VfRU9TIHwgR1NUX01FU1NBR0VfRVJST1IsIC0xKTsKKyAgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRVJST1IpIHsKKyAgICBHRXJyb3IgKmVycjsKKyAgICBnY2hhciAqZGJnOworCisgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1zZywgJmVyciwgJmRiZyk7CisgICAgZ3N0X29iamVjdF9kZWZhdWx0X2Vycm9yIChHU1RfTUVTU0FHRV9TUkMgKG1zZyksIGVyciwgZGJnKTsKKyAgICBnX2Vycm9yICgiJXMgKCVzKSIsIGVyci0+bWVzc2FnZSwgZGJnKTsKKyAgICBnX2Vycm9yX2ZyZWUgKGVycik7CisgICAgZ19mcmVlIChkYmcpOworICB9CisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKSwKKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKworICBnX2ZyZWUgKHBhdGgpOworfQorCisjaWYgMAorR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfZmlsZV9wdWxsKQoreworICBydW5fY2hlY2tfZm9yX2ZpbGUgKCJwaW5rbm9pc2Utdm9yYmlzLm1rdiIsIFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CisjZW5kaWYKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfZmlsZV9wdXNoKQoreworICBydW5fY2hlY2tfZm9yX2ZpbGUgKCJwaW5rbm9pc2Utdm9yYmlzLm1rdiIsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorbWF0cm9za2FwYXJzZV9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJtYXRyb3NrYXBhcnNlIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyNpZiAwCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9maWxlX3B1bGwpOworI2VuZGlmCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9maWxlX3B1c2gpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAobWF0cm9za2FwYXJzZSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL21wZWdhdWRpb3BhcnNlLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9tcGVnYXVkaW9wYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNDRlOTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9tcGVnYXVkaW9wYXJzZS5jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBhYWNwYXJzZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0OiBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlICJwYXJzZXIuaCIKKworI2RlZmluZSBTUkNfQ0FQU19UTVBMICAgImF1ZGlvL21wZWcsIHBhcnNlZD0oYm9vbGVhbilmYWxzZSwgbXBlZ3ZlcnNpb249KGludCkxIgorI2RlZmluZSBTSU5LX0NBUFNfVE1QTCAgImF1ZGlvL21wZWcsIHBhcnNlZD0oYm9vbGVhbil0cnVlLCBtcGVndmVyc2lvbj0oaW50KTEiCisKK0dzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoU0lOS19DQVBTX1RNUEwpCisgICAgKTsKKworR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChTUkNfQ0FQU19UTVBMKQorICAgICk7CisKKy8qIHNvbWUgZGF0YSAqLworc3RhdGljIGd1aW50OCBtcDNfZnJhbWVbMzg0XSA9IHsKKyAgMHhmZiwgMHhmYiwgMHg5NCwgMHhjNCwgMHhmZiwgMHg4MywgMHhjMCwgMHgwMCwKKyAgMHgwMSwgMHhhNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwKKyAgMHgzNCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKK307CisKK3N0YXRpYyBndWludDggZ2FyYmFnZV9mcmFtZVtdID0geworICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmCit9OworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX25vcm1hbCkKK3sKKyAgZ3N0X3BhcnNlcl90ZXN0X25vcm1hbCAobXAzX2ZyYW1lLCBzaXplb2YgKG1wM19mcmFtZSkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2VfZHJhaW5fc2luZ2xlKQoreworICBnc3RfcGFyc2VyX3Rlc3RfZHJhaW5fc2luZ2xlIChtcDNfZnJhbWUsIHNpemVvZiAobXAzX2ZyYW1lKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9kcmFpbl9nYXJiYWdlKQoreworICBnc3RfcGFyc2VyX3Rlc3RfZHJhaW5fZ2FyYmFnZSAobXAzX2ZyYW1lLCBzaXplb2YgKG1wM19mcmFtZSksCisgICAgICBnYXJiYWdlX2ZyYW1lLCBzaXplb2YgKGdhcmJhZ2VfZnJhbWUpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX3NwbGl0KQoreworICBnc3RfcGFyc2VyX3Rlc3Rfc3BsaXQgKG1wM19mcmFtZSwgc2l6ZW9mIChtcDNfZnJhbWUpKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNlX3NraXBfZ2FyYmFnZSkKK3sKKyAgZ3N0X3BhcnNlcl90ZXN0X3NraXBfZ2FyYmFnZSAobXAzX2ZyYW1lLCBzaXplb2YgKG1wM19mcmFtZSksCisgICAgICBnYXJiYWdlX2ZyYW1lLCBzaXplb2YgKGdhcmJhZ2VfZnJhbWUpKTsKK30KKworR1NUX0VORF9URVNUOworCisKKyNkZWZpbmUgc3RydWN0dXJlX2dldF9pbnQocyxmKSBcCisgICAgKGdfdmFsdWVfZ2V0X2ludChnc3Rfc3RydWN0dXJlX2dldF92YWx1ZShzLGYpKSkKKyNkZWZpbmUgZmFpbF91bmxlc3Nfc3RydWN0dXJlX2ZpZWxkX2ludF9lcXVhbHMocyxmaWVsZCxudW0pIFwKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChzdHJ1Y3R1cmVfZ2V0X2ludChzLGZpZWxkKSwgbnVtKQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXJzZV9kZXRlY3Rfc3RyZWFtKQoreworICBHc3RTdHJ1Y3R1cmUgKnM7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgY2FwcyA9IGdzdF9wYXJzZXJfdGVzdF9nZXRfb3V0cHV0X2NhcHMgKG1wM19mcmFtZSwgc2l6ZW9mIChtcDNfZnJhbWUpLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoY2FwcyAhPSBOVUxMKTsKKworICBHU1RfTE9HICgibXBlZ2F1ZGlvIG91dHB1dCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUgKHMsICJhdWRpby9tcGVnIikpOworICBmYWlsX3VubGVzc19zdHJ1Y3R1cmVfZmllbGRfaW50X2VxdWFscyAocywgIm1wZWd2ZXJzaW9uIiwgMSk7CisgIGZhaWxfdW5sZXNzX3N0cnVjdHVyZV9maWVsZF9pbnRfZXF1YWxzIChzLCAibGF5ZXIiLCAzKTsKKyAgZmFpbF91bmxlc3Nfc3RydWN0dXJlX2ZpZWxkX2ludF9lcXVhbHMgKHMsICJjaGFubmVscyIsIDEpOworICBmYWlsX3VubGVzc19zdHJ1Y3R1cmVfZmllbGRfaW50X2VxdWFscyAocywgInJhdGUiLCA0ODAwMCk7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworc3RhdGljIFN1aXRlICoKK21wZWdhdWRpb3BhcnNlX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoIm1wZWdhdWRpb3BhcnNlIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworCisgIC8qIGluaXQgdGVzdCBjb250ZXh0ICovCisgIGN0eF9mYWN0b3J5ID0gIm1wZWdhdWRpb3BhcnNlIjsKKyAgY3R4X3NpbmtfdGVtcGxhdGUgPSAmc2lua3RlbXBsYXRlOworICBjdHhfc3JjX3RlbXBsYXRlID0gJnNyY3RlbXBsYXRlOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2Vfbm9ybWFsKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX2RyYWluX3NpbmdsZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9kcmFpbl9nYXJiYWdlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX3NwbGl0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BhcnNlX3NraXBfZ2FyYmFnZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYXJzZV9kZXRlY3Rfc3RyZWFtKTsKKworICByZXR1cm4gczsKK30KKworCisvKgorICogVE9ETzoKKyAqICAgLSBCb3RoIHB1c2gtIGFuZCBwdWxsLW1vZGVzIG5lZWQgdG8gYmUgdGVzdGVkCisgKiAgICAgICogUHVsbC1tb2RlICYgRU9TCisgKi8KK0dTVF9DSEVDS19NQUlOIChtcGVnYXVkaW9wYXJzZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9tcGcxMjNhdWRpb2RlYy5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvbXBnMTIzYXVkaW9kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGQ2ZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvbXBnMTIzYXVkaW9kZWMuYwpAQCAtMCwwICsxLDUzNCBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBtcGcxMjNhdWRpb2RlYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBDYXJsb3MgUmFmYWVsIEdpYW5pIDxkdkBwc2V1ZG90ZXJtaW5hbC5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKyNpbmNsdWRlIDxnc3QvZmZ0L2dzdGZmdC5oPgorI2luY2x1ZGUgPGdzdC9mZnQvZ3N0ZmZ0czE2Lmg+CisjaW5jbHVkZSA8Z3N0L2ZmdC9nc3RmZnRzMzIuaD4KKyNpbmNsdWRlIDxnc3QvZmZ0L2dzdGZmdGYzMi5oPgorI2luY2x1ZGUgPGdzdC9mZnQvZ3N0ZmZ0ZjY0Lmg+CisKKyNpbmNsdWRlIDxnc3QvYXBwL2dzdGFwcHNpbmsuaD4KKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcKKyAqIHNyYyBhbmQgc2luayBwYWRzIHdlIGNyZWF0ZTsgb3RoZXJ3aXNlIHdlIGFsd2F5cyBoYXZlIHRvIGRvIGdldF9wYWQsCisgKiBnZXRfcGVlciwgYW5kIHRoZW4gcmVtb3ZlIHJlZmVyZW5jZXMgaW4gZXZlcnkgdGVzdCBmdW5jdGlvbiAqLworc3RhdGljIEdzdFBhZCAqbXlzcmNwYWQsICpteXNpbmtwYWQ7CisKKworI2RlZmluZSBNUDJfU1RSRUFNX0ZJTEVOQU1FICJzdHJlYW0ubXAyIgorI2RlZmluZSBNUDNfQ0JSX1NUUkVBTV9GSUxFTkFNRSAiY2JyX3N0cmVhbS5tcDMiCisjZGVmaW5lIE1QM19WQlJfU1RSRUFNX0ZJTEVOQU1FICJ2YnJfc3RyZWFtLm1wMyIKKworCisvKiBtcGVnIDEgbGF5ZXIgMiBzdHJlYW0gY3JlYXRlZCB3aXRoOgorICogZ3N0LWxhdW5jaC0xLjAgLXYgYXVkaW90ZXN0c3JjIHdhdmU9c2luZSBmcmVxPTQ0MCB2b2x1bWU9MSBudW0tYnVmZmVycz0zMiAhIFwKKyAqICAgImF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTMTZMRSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludCk0NDEwMCwgY2hhbm5lbHM9KGludCkxIiAhIFwKKyAqICAgYXZlbmNfbXAyIGJpdHJhdGU9MzIwMDAgISB0ZWUgbmFtZT10IFwKKyAqICAgdC4gISBxdWV1ZSAhIGZha2VzaW5rIHNpbGVudD1mYWxzZSBcCisgKiAgIHQuICEgcXVldWUgISBmaWxlc2luayBsb2NhdGlvbj10ZXN0Lm1wMgorICoKKyAqIG1wZWcgMSBsYXllciAzIENCUiBzdHJlYW0gY3JlYXRlZCB3aXRoOgorICogZ3N0LWxhdW5jaC0xLjAgLXYgYXVkaW90ZXN0c3JjIHdhdmU9c2luZSBmcmVxPTQ0MCB2b2x1bWU9MSBudW0tYnVmZmVycz0zMiAhIFwKKyAqICAgImF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTMTZMRSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludCk0NDEwMCwgY2hhbm5lbHM9KGludCkxIiAhIFwKKyAqICAgbGFtZW1wM2VuYyBlbmNvZGluZy1lbmdpbmUtcXVhbGl0eT1oaWdoIGNicj10cnVlIHRhcmdldD1iaXRyYXRlIGJpdHJhdGU9MzIgISBcCisgKiAgICJhdWRpby9tcGVnLCByYXRlPShpbnQpNDQxMDAsIGNoYW5uZWxzPShpbnQpMSIgISB0ZWUgbmFtZT10IFwKKyAqICAgdC4gISBxdWV1ZSAhIGZha2VzaW5rIHNpbGVudD1mYWxzZSBcCisgKiAgIHQuICEgcXVldWUgISBmaWxlc2luayBsb2NhdGlvbj10ZXN0Lm1wMworICoKKyAqIG1wZWcgMSBsYXllciAzIFZCUiBzdHJlYW0gY3JlYXRlZCB3aXRoOgorICogZ3N0LWxhdW5jaC0xLjAgLXYgYXVkaW90ZXN0c3JjIHdhdmU9c2luZSBmcmVxPTQ0MCB2b2x1bWU9MSBudW0tYnVmZmVycz0zMiAhIFwKKyAqICAgImF1ZGlvL3gtcmF3LCBmb3JtYXQ9KHN0cmluZylTMTZMRSwgbGF5b3V0PShzdHJpbmcpaW50ZXJsZWF2ZWQsIHJhdGU9KGludCk0NDEwMCwgY2hhbm5lbHM9KGludCkxIiAhIFwKKyAqICAgbGFtZW1wM2VuYyBlbmNvZGluZy1lbmdpbmUtcXVhbGl0eT1oaWdoIGNicj1mYWxzZSB0YXJnZXQ9cXVhbGl0eSBxdWFsaXR5PTcgISBcCisgKiAgICJhdWRpby9tcGVnLCByYXRlPShpbnQpNDQxMDAsIGNoYW5uZWxzPShpbnQpMSIgISB0ZWUgbmFtZT10IFwKKyAqICAgdC4gISBxdWV1ZSAhIGZha2VzaW5rIHNpbGVudD1mYWxzZSBcCisgKiAgIHQuICEgcXVldWUgISBmaWxlc2luayBsb2NhdGlvbj10ZXN0Lm1wMworICovCisKKworLyogRkZUIHRlc3QgaGVscGVycyB0YWtlbiBmcm9tIGdzdC1wbHVnaW5zLWJhc2UgdGVzdHMvY2hlY2svYXVkaW9yZXNhbXBsZS5jICovCisKKyNkZWZpbmUgRkZUX0hFTFBFUlModHlwZSxmZnR0YWcsZmZ0dGFnMixzY2FsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBnZG91YmxlIG1hZ25pdHVkZSMjZmZ0dGFnIChjb25zdCBHc3RGRlQjI2ZmdHRhZyMjQ29tcGxleCAqYykgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2RvdWJsZSBtYWcgPSAoZ2RvdWJsZSkgYy0+ciAqIChnZG91YmxlKSBjLT5yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbWFnICs9IChnZG91YmxlKSBjLT5pICogKGdkb3VibGUpIGMtPmk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbWFnIC89IHNjYWxlICogc2NhbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbWFnID0gMTAuMCAqIGxvZzEwIChtYWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIG1hZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBnZG91YmxlIGZpbmRfbWFpbl9mcmVxdWVuY3lfc3BvdF8jI2ZmdHRhZyAoICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBHc3RGRlQjI2ZmdHRhZyMjQ29tcGxleCAqdiwgaW50IGVsZW1lbnRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2RvdWJsZSBtYXhtYWcgPSAtOTk5OTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IG1heGlkeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpPTA7IGk8ZWxlbWVudHM7ICsraSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZG91YmxlIG1hZyA9IG1hZ25pdHVkZSMjZmZ0dGFnICh2K2kpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobWFnID4gbWF4bWFnKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1heG1hZyA9IG1hZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1heGlkeCA9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIG1heGlkeCAvIChnZG91YmxlKSBlbGVtZW50czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBnYm9vbGVhbiBpc196ZXJvX2V4Y2VwdF8jI2ZmdHRhZyAoY29uc3QgR3N0RkZUIyNmZnR0YWcjI0NvbXBsZXggKnYsICAgIFwKKyAgICBpbnQgZWxlbWVudHMsIGdkb3VibGUgc3BvdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpPTA7IGk8ZWxlbWVudHM7ICsraSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZG91YmxlIHBvcyA9IGkgLyAoZ2RvdWJsZSkgZWxlbWVudHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZG91YmxlIG1hZyA9IG1hZ25pdHVkZSMjZmZ0dGFnICh2K2kpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZmFicyAocG9zIC0gc3BvdCkgPiAwLjAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmIChtYWcgPiAtMzUuMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR1NUX0xPRygiRm91bmQgbWFnbml0dWRlIGF0ICVmIDogJWYgKHBlYWsgYXQgJWYpXG4iLCBwb3MsIG1hZywgc3BvdCk7IFwKKyAgICAgICAgcmV0dXJuIEZBTFNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIFRSVUU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIGNoZWNrX21haW5fZnJlcXVlbmN5X3Nwb3RfIyNmZnR0YWcgKEdzdEJ1ZmZlciAqYnVmZmVyLCBnZG91YmxlICAgIFwKKyAgICBleHBlY3RlZF9zcG90KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR3N0TWFwSW5mbyBtYXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IG51bV9zYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2RvdWJsZSBhY3R1YWxfc3BvdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR3N0RkZUIyNmZnR0YWcgKmN0eDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR3N0RkZUIyNmZnR0YWcjI0NvbXBsZXggKmZmdGRhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9SRUFEKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbnVtX3NhbXBsZXMgPSBtYXAuc2l6ZSAvIHNpemVvZih0eXBlKSAmIH4xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY3R4ID0gZ3N0X2ZmdF8jI2ZmdHRhZzIjI19uZXcgKG51bV9zYW1wbGVzLCBGQUxTRSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZmZ0ZGF0YSA9IGdfbmV3IChHc3RGRlQjI2ZmdHRhZyMjQ29tcGxleCwgbnVtX3NhbXBsZXMgLyAyICsgMSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ3N0X2ZmdF8jI2ZmdHRhZzIjI193aW5kb3cgKGN0eCwgKHR5cGUqKW1hcC5kYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHU1RfRkZUX1dJTkRPV19IQU1NSU5HKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ3N0X2ZmdF8jI2ZmdHRhZzIjI19mZnQgKGN0eCwgKHR5cGUqKW1hcC5kYXRhLCBmZnRkYXRhKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYWN0dWFsX3Nwb3QgPSBmaW5kX21haW5fZnJlcXVlbmN5X3Nwb3RfIyNmZnR0YWcgKGZmdGRhdGEsICAgICAgICAgICAgICAgICAgIFwKKyAgICBudW1fc2FtcGxlcyAvIDIgKyAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR1NUX0xPRyAoIkV4cGVjdGVkIHNwb3Q6ICUuM2YgYWN0dWFsOiAlLjNmICVmIiwgZXhwZWN0ZWRfc3BvdCwgYWN0dWFsX3Nwb3QsIFwKKyAgICBmYWJzIChleHBlY3RlZF9zcG90IC0gYWN0dWFsX3Nwb3QpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZmFpbF91bmxlc3MgKGZhYnMgKGV4cGVjdGVkX3Nwb3QgLSBhY3R1YWxfc3BvdCkgPCAwLjA1LCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiQWN0dWFsIG1haW4gZnJlcXVlbmN5IHNwb3QgaXMgdG9vIGZhciBhd2F5IGZyb20gZXhwZWN0ZWQgb25lIik7ICAgICAgICAgIFwKKyAgZmFpbF91bmxlc3MgKGlzX3plcm9fZXhjZXB0XyMjZmZ0dGFnIChmZnRkYXRhLCBudW1fc2FtcGxlcyAvIDIgKyAxLCAgICAgICAgIFwKKyAgICBhY3R1YWxfc3BvdCksICJPbmUgc2Vjb25kYXJ5IHBlYWsgaW4gc3BlY3RydW0gZXhjZWVkcyB0aHJlc2hvbGQiKTsgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ3N0X2ZmdF8jI2ZmdHRhZzIjI19mcmVlIChjdHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ19mcmVlIChmZnRkYXRhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KK0ZGVF9IRUxQRVJTIChnaW50MzIsIFMzMiwgczMyLCAyMTQ3NDgzNjQ3LjApOworCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywgZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUgKFMzMikpCisgICAgKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBsYXllcjJfc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgbGF5ZXIzX3NyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCisKK3N0YXRpYyB2b2lkCitzZXR1cF9pbnB1dF9waXBlbGluZSAoZ2NoYXIgY29uc3QgKnN0cmVhbV9maWxlbmFtZSwgR3N0RWxlbWVudCAqKiBwaXBlbGluZSwKKyAgICBHc3RFbGVtZW50ICoqIGFwcHNpbmspCit7CisgIEdzdEVsZW1lbnQgKnNvdXJjZSwgKnBhcnNlcjsKKworICAqcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3IChOVUxMKTsKKyAgc291cmNlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmlsZXNyYyIsIE5VTEwpOworICBwYXJzZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJtcGVnYXVkaW9wYXJzZSIsIE5VTEwpOworICAqYXBwc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImFwcHNpbmsiLCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOICgqcGlwZWxpbmUpLCBzb3VyY2UsIHBhcnNlciwgKmFwcHNpbmssIE5VTEwpOworICBnc3RfZWxlbWVudF9saW5rX21hbnkgKHNvdXJjZSwgcGFyc2VyLCAqYXBwc2luaywgTlVMTCk7CisKKyAgeworICAgIGNoYXIgKmZ1bGxfZmlsZW5hbWUgPQorICAgICAgICBnX2J1aWxkX2ZpbGVuYW1lIChHU1RfVEVTVF9GSUxFU19QQVRILCBzdHJlYW1fZmlsZW5hbWUsIE5VTEwpOworICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNvdXJjZSksICJsb2NhdGlvbiIsIGZ1bGxfZmlsZW5hbWUsIE5VTEwpOworICAgIGdfZnJlZSAoZnVsbF9maWxlbmFtZSk7CisgIH0KKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKCpwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF9pbnB1dF9waXBlbGluZSAoR3N0RWxlbWVudCAqIHBpcGVsaW5lKQoreworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfbXBlZzFsYXllcjJkZWMgKHZvaWQpCit7CisgIEdzdEVsZW1lbnQgKm1wZzEyM2F1ZGlvZGVjOworICBHc3RDYXBzICpjYXBzOworCisgIEdTVF9ERUJVRyAoInNldHVwX21wZWcxbGF5ZXIyZGVjIik7CisgIG1wZzEyM2F1ZGlvZGVjID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJtcGcxMjNhdWRpb2RlYyIpOworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkIChtcGcxMjNhdWRpb2RlYywgJmxheWVyMl9zcmN0ZW1wbGF0ZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAobXBnMTIzYXVkaW9kZWMsICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworCisgIC8qIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHRyaWdnZXIgYSBzZXRfZm9ybWF0IGNhbGwgaW4gdGhlIGRlY29kZXI7CisgICAqIGZpeGVkIGNhcHMgZG9uJ3QgdHJpZ2dlciBpdCAqLworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL21wZWciLAorICAgICAgIm1wZWd2ZXJzaW9uIiwgR19UWVBFX0lOVCwgMSwKKyAgICAgICJsYXllciIsIEdfVFlQRV9JTlQsIDIsCisgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIDQ0MTAwLAorICAgICAgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMSwgInBhcnNlZCIsIEdfVFlQRV9CT09MRUFOLCBUUlVFLCBOVUxMKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIG1wZzEyM2F1ZGlvZGVjLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgcmV0dXJuIG1wZzEyM2F1ZGlvZGVjOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9tcGVnMWxheWVyM2RlYyAodm9pZCkKK3sKKyAgR3N0RWxlbWVudCAqbXBnMTIzYXVkaW9kZWM7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfbXBlZzFsYXllcjNkZWMiKTsKKyAgbXBnMTIzYXVkaW9kZWMgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoIm1wZzEyM2F1ZGlvZGVjIik7CisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKG1wZzEyM2F1ZGlvZGVjLCAmbGF5ZXIzX3NyY3RlbXBsYXRlKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChtcGcxMjNhdWRpb2RlYywgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgLyogVGhpcyBpcyBuZWNlc3NhcnkgdG8gdHJpZ2dlciBhIHNldF9mb3JtYXQgY2FsbCBpbiB0aGUgZGVjb2RlcjsKKyAgICogZml4ZWQgY2FwcyBkb24ndCB0cmlnZ2VyIGl0ICovCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8vbXBlZyIsCisgICAgICAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLAorICAgICAgImxheWVyIiwgR19UWVBFX0lOVCwgMywKKyAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgNDQxMDAsCisgICAgICAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLCAicGFyc2VkIiwgR19UWVBFX0JPT0xFQU4sIFRSVUUsIE5VTEwpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgbXBnMTIzYXVkaW9kZWMsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICByZXR1cm4gbXBnMTIzYXVkaW9kZWM7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX21wZzEyM2F1ZGlvZGVjIChHc3RFbGVtZW50ICogbXBnMTIzYXVkaW9kZWMpCit7CisgIEdTVF9ERUJVRyAoImNsZWFudXBfbXBlZzFsYXllcjJkZWMiKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChtcGcxMjNhdWRpb2RlYywgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKG1wZzEyM2F1ZGlvZGVjKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChtcGcxMjNhdWRpb2RlYyk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChtcGcxMjNhdWRpb2RlYyk7Cit9CisKK3N0YXRpYyB2b2lkCitydW5fZGVjb2RpbmdfdGVzdCAoR3N0RWxlbWVudCAqIG1wZzEyM2F1ZGlvZGVjLCBnY2hhciBjb25zdCAqZmlsZW5hbWUpCit7CisgIEdzdEJ1cyAqYnVzOworICB1bnNpZ25lZCBpbnQgbnVtX2lucHV0X2J1ZmZlcnMsIG51bV9kZWNvZGVkX2J1ZmZlcnM7CisgIGdpbnQgZXhwZWN0ZWRfc2l6ZTsKKyAgR3N0Q2FwcyAqb3V0X2NhcHMsICpjYXBzOworICBHc3RBdWRpb0luZm8gYXVkaW9pbmZvOworICBHc3RFbGVtZW50ICppbnB1dF9waXBlbGluZSwgKmlucHV0X2FwcHNpbms7CisgIGludCBpOworICBHc3RCdWZmZXIgKm91dGJ1ZmZlcjsKKworICAvKiA0NDAgSHogPSBmcmVxdWVuY3kgb2Ygc2luZSB3YXZlIGluIGF1ZGlvIGRhdGEKKyAgICogNDQxMDAgSHogPSBzYW1wbGUgcmF0ZQorICAgKiAoNDQxMDAgLyAyKSBIeiA9IE55cXVpc3QgZnJlcXVlbmN5ICovCisgIHN0YXRpYyBkb3VibGUgY29uc3QgZXhwZWN0ZWRfZnJlcXVlbmN5X3Nwb3QgPSA0NDAuMCAvICg0NDEwMC4wIC8gMi4wKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChtcGcxMjNhdWRpb2RlYywKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKworICBnc3RfZWxlbWVudF9zZXRfYnVzIChtcGcxMjNhdWRpb2RlYywgYnVzKTsKKworICBzZXR1cF9pbnB1dF9waXBlbGluZSAoZmlsZW5hbWUsICZpbnB1dF9waXBlbGluZSwgJmlucHV0X2FwcHNpbmspOworCisgIG51bV9pbnB1dF9idWZmZXJzID0gMDsKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBHc3RTYW1wbGUgKnNhbXBsZTsKKyAgICBHc3RCdWZmZXIgKmlucHV0X2J1ZmZlcjsKKworICAgIHNhbXBsZSA9IGdzdF9hcHBfc2lua19wdWxsX3NhbXBsZSAoR1NUX0FQUF9TSU5LIChpbnB1dF9hcHBzaW5rKSk7CisgICAgaWYgKHNhbXBsZSA9PSBOVUxMKQorICAgICAgYnJlYWs7CisKKyAgICBmYWlsX3VubGVzcyAoR1NUX0lTX1NBTVBMRSAoc2FtcGxlKSk7CisKKyAgICBpbnB1dF9idWZmZXIgPSBnc3Rfc2FtcGxlX2dldF9idWZmZXIgKHNhbXBsZSk7CisgICAgZmFpbF9pZiAoaW5wdXRfYnVmZmVyID09IE5VTEwpOworCisgICAgLyogVGhpcyBpcyBkb25lIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgLSBkb2NzIHNheSBsaWZldGltZSBvZiB0aGUgaW5wdXQgYnVmZmVyCisgICAgICogZGVwZW5kcyAqc29sZWx5KiBvbiB0aGUgc2FtcGxlICovCisgICAgaW5wdXRfYnVmZmVyID0gZ3N0X2J1ZmZlcl9jb3B5IChpbnB1dF9idWZmZXIpOworCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5wdXRfYnVmZmVyKSwgR1NUX0ZMT1dfT0spOworCisgICAgKytudW1faW5wdXRfYnVmZmVyczsKKworICAgIGdzdF9zYW1wbGVfdW5yZWYgKHNhbXBsZSk7CisgIH0KKworICBudW1fZGVjb2RlZF9idWZmZXJzID0gZ19saXN0X2xlbmd0aCAoYnVmZmVycyk7CisKKyAgLyogY2hlY2sgbnVtYmVyIG9mIGRlY29kZWQgYnVmZmVycyAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChudW1fZGVjb2RlZF9idWZmZXJzLCBudW1faW5wdXRfYnVmZmVycyAtIDIpOworCisgIGNhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKG15c2lua3BhZCk7CisgIEdTVF9MT0cgKCJvdXRwdXQgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgIGZhaWxfdW5sZXNzIChnc3RfYXVkaW9faW5mb19mcm9tX2NhcHMgKCZhdWRpb2luZm8sIGNhcHMpLAorICAgICAgIkdldHRpbmcgYXVkaW8gaW5mbyBmcm9tIGNhcHMgZmFpbGVkIik7CisKKyAgLyogY2hlY2sgY2FwcyAqLworICBvdXRfY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgR1NUX0FVRElPX05FIChTMzIpLAorICAgICAgImxheW91dCIsIEdfVFlQRV9TVFJJTkcsICJpbnRlcmxlYXZlZCIsCisgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIDQ0MTAwLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfaXNfZXF1YWxfZml4ZWQgKGNhcHMsIG91dF9jYXBzKSwgIkluY29ycmVjdCBvdXQgY2FwcyIpOworCisgIGdzdF9jYXBzX3VucmVmIChvdXRfY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAvKiBoZXJlLCB0ZXN0IGlmIGRlY29kZWQgZGF0YSBpcyBhIHNpbmUgdG9uZSwgYW5kIGlmIHRoZSBzaW5lIGZyZXF1ZW5jeSBpcyBhdCB0aGUKKyAgICogcmlnaHQgc3BvdCBpbiB0aGUgc3BlY3RydW0gKi8KKyAgZm9yIChpID0gMDsgaSA8IG51bV9kZWNvZGVkX2J1ZmZlcnM7ICsraSkgeworICAgIG91dGJ1ZmZlciA9IEdTVF9CVUZGRVIgKGJ1ZmZlcnMtPmRhdGEpOworICAgIGZhaWxfaWYgKG91dGJ1ZmZlciA9PSBOVUxMLCAiSW52YWxpZCBidWZmZXIgcmV0cmlldmVkIik7CisKKyAgICAvKiBNUEVHIDEgbGF5ZXIgMiB1c2VzIDExNTIgc2FtcGxlcyBwZXIgZnJhbWUgKi8KKyAgICBleHBlY3RlZF9zaXplID0gMTE1MiAqIEdTVF9BVURJT19JTkZPX0JQRiAoJmF1ZGlvaW5mbyk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0YnVmZmVyKSwgZXhwZWN0ZWRfc2l6ZSk7CisKKyAgICBjaGVja19tYWluX2ZyZXF1ZW5jeV9zcG90X1MzMiAob3V0YnVmZmVyLCBleHBlY3RlZF9mcmVxdWVuY3lfc3BvdCk7CisKKyAgICBidWZmZXJzID0gZ19saXN0X3JlbW92ZSAoYnVmZmVycywgb3V0YnVmZmVyKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworICAgIG91dGJ1ZmZlciA9IE5VTEw7CisgIH0KKworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGNsZWFudXBfaW5wdXRfcGlwZWxpbmUgKGlucHV0X3BpcGVsaW5lKTsKKyAgZ3N0X2J1c19zZXRfZmx1c2hpbmcgKGJ1cywgVFJVRSk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKG1wZzEyM2F1ZGlvZGVjLCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoR1NUX09CSkVDVCAoYnVzKSk7Cit9CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZGVjb2RlX21wZWcxbGF5ZXIyKQoreworICBHc3RFbGVtZW50ICptcGcxMjNhdWRpb2RlYzsKKyAgbXBnMTIzYXVkaW9kZWMgPSBzZXR1cF9tcGVnMWxheWVyMmRlYyAoKTsKKyAgcnVuX2RlY29kaW5nX3Rlc3QgKG1wZzEyM2F1ZGlvZGVjLCBNUDJfU1RSRUFNX0ZJTEVOQU1FKTsKKyAgY2xlYW51cF9tcGcxMjNhdWRpb2RlYyAobXBnMTIzYXVkaW9kZWMpOworICBtcGcxMjNhdWRpb2RlYyA9IE5VTEw7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9kZWNvZGVfbXBlZzFsYXllcjNfY2JyKQoreworICBHc3RFbGVtZW50ICptcGcxMjNhdWRpb2RlYzsKKyAgbXBnMTIzYXVkaW9kZWMgPSBzZXR1cF9tcGVnMWxheWVyM2RlYyAoKTsKKyAgcnVuX2RlY29kaW5nX3Rlc3QgKG1wZzEyM2F1ZGlvZGVjLCBNUDNfQ0JSX1NUUkVBTV9GSUxFTkFNRSk7CisgIGNsZWFudXBfbXBnMTIzYXVkaW9kZWMgKG1wZzEyM2F1ZGlvZGVjKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2RlY29kZV9tcGVnMWxheWVyM192YnIpCit7CisgIEdzdEVsZW1lbnQgKm1wZzEyM2F1ZGlvZGVjOworICBtcGcxMjNhdWRpb2RlYyA9IHNldHVwX21wZWcxbGF5ZXIzZGVjICgpOworICBydW5fZGVjb2RpbmdfdGVzdCAobXBnMTIzYXVkaW9kZWMsIE1QM19WQlJfU1RSRUFNX0ZJTEVOQU1FKTsKKyAgY2xlYW51cF9tcGcxMjNhdWRpb2RlYyAobXBnMTIzYXVkaW9kZWMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZGVjb2RlX2dhcmJhZ2VfbXBlZzFsYXllcjIpCit7CisgIEdzdEVsZW1lbnQgKm1wZzEyM2F1ZGlvZGVjOworICBHc3RCdWZmZXIgKmluYnVmZmVyOworICBHc3RCdXMgKmJ1czsKKyAgaW50IGksIG51bV9idWZmZXJzOworICBndWludDMyICp0bXBidWY7CisKKyAgbXBnMTIzYXVkaW9kZWMgPSBzZXR1cF9tcGVnMWxheWVyMmRlYyAoKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChtcGcxMjNhdWRpb2RlYywKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKworICAvKiBpbml0aWFsaXplIHRoZSBidWZmZXIgd2l0aCBzb21ldGhpbmcgdGhhdCBpcyBubyBtcGVnMiAqLworICB0bXBidWYgPSBnX25ldyAoZ3VpbnQzMiwgNDA5Nik7CisgIGZvciAoaSA9IDA7IGkgPCA0MDk2OyBpKyspIHsKKyAgICB0bXBidWZbaV0gPSBpOworICB9CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZCAodG1wYnVmLCA0MDk2ICogc2l6ZW9mIChndWludDMyKSk7CisKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIGdzdF9lbGVtZW50X3NldF9idXMgKG1wZzEyM2F1ZGlvZGVjLCBidXMpOworCisgIC8qIHNob3VsZCBiZSBwb3NzaWJsZSB0byBwdXNoIHdpdGhvdXQgcHJvYmxlbXMgYnV0IG5vdGhpbmcgZ2V0cyBkZWNvZGVkICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSwgR1NUX0ZMT1dfT0spOworCisgIG51bV9idWZmZXJzID0gZ19saXN0X2xlbmd0aCAoYnVmZmVycyk7CisKKyAgLyogc2hvdWxkIGJlIDAgYnVmZmVycyBhcyBkZWNvZGluZyBzaG91bGQndmUgYmVlbiBpbXBvc3NpYmxlICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG51bV9idWZmZXJzLCAwKTsKKworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGdzdF9idXNfc2V0X2ZsdXNoaW5nIChidXMsIFRSVUUpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChtcGcxMjNhdWRpb2RlYywgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKGJ1cykpOworICBjbGVhbnVwX21wZzEyM2F1ZGlvZGVjIChtcGcxMjNhdWRpb2RlYyk7CisgIG1wZzEyM2F1ZGlvZGVjID0gTlVMTDsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2RlY29kZV9nYXJiYWdlX21wZWcxbGF5ZXIzKQoreworICBHc3RFbGVtZW50ICptcGcxMjNhdWRpb2RlYzsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlcjsKKyAgR3N0QnVzICpidXM7CisgIGludCBpLCBudW1fYnVmZmVyczsKKyAgZ3VpbnQzMiAqdG1wYnVmOworCisgIG1wZzEyM2F1ZGlvZGVjID0gc2V0dXBfbXBlZzFsYXllcjNkZWMgKCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobXBnMTIzYXVkaW9kZWMsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisKKyAgLyogaW5pdGlhbGl6ZSB0aGUgYnVmZmVyIHdpdGggc29tZXRoaW5nIHRoYXQgaXMgbm8gbXBlZzIgKi8KKyAgdG1wYnVmID0gZ19uZXcgKGd1aW50MzIsIDQwOTYpOworICBmb3IgKGkgPSAwOyBpIDwgNDA5NjsgaSsrKSB7CisgICAgdG1wYnVmW2ldID0gaTsKKyAgfQorICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKHRtcGJ1ZiwgNDA5NiAqIHNpemVvZiAoZ3VpbnQzMikpOworCisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICBnc3RfZWxlbWVudF9zZXRfYnVzIChtcGcxMjNhdWRpb2RlYywgYnVzKTsKKworICAvKiBzaG91bGQgYmUgcG9zc2libGUgdG8gcHVzaCB3aXRob3V0IHByb2JsZW1zIGJ1dCBub3RoaW5nIGdldHMgZGVjb2RlZCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlciksIEdTVF9GTE9XX09LKTsKKworICBudW1fYnVmZmVycyA9IGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpOworCisgIC8qIHNob3VsZCBiZSAwIGJ1ZmZlcnMgYXMgZGVjb2Rpbmcgc2hvdWxkJ3ZlIGJlZW4gaW1wb3NzaWJsZSAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChudW1fYnVmZmVycywgMCk7CisKKyAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICBidWZmZXJzID0gTlVMTDsKKworICBnc3RfYnVzX3NldF9mbHVzaGluZyAoYnVzLCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAobXBnMTIzYXVkaW9kZWMsIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChHU1RfT0JKRUNUIChidXMpKTsKKyAgY2xlYW51cF9tcGcxMjNhdWRpb2RlYyAobXBnMTIzYXVkaW9kZWMpOworICBtcGcxMjNhdWRpb2RlYyA9IE5VTEw7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitzdGF0aWMgZ2Jvb2xlYW4KK2lzX3Rlc3RfZmlsZV9hdmFpbGFibGUgKGdjaGFyIGNvbnN0ICpmaWxlbmFtZSkKK3sKKyAgZ2Jvb2xlYW4gcmV0OworICBnY2hhciAqZnVsbF9maWxlbmFtZTsKKyAgZ2NoYXIgKmN3ZDsKKworICBjd2QgPSBnX2dldF9jdXJyZW50X2RpciAoKTsKKyAgZnVsbF9maWxlbmFtZSA9IGdfYnVpbGRfZmlsZW5hbWUgKGN3ZCwgR1NUX1RFU1RfRklMRVNfUEFUSCwgZmlsZW5hbWUsIE5VTEwpOworICByZXQgPQorICAgICAgZ19maWxlX3Rlc3QgKGZ1bGxfZmlsZW5hbWUsIEdfRklMRV9URVNUX0lTX1JFR1VMQVIgfCBHX0ZJTEVfVEVTVF9FWElTVFMpOworICBnX2ZyZWUgKGZ1bGxfZmlsZW5hbWUpOworICBnX2ZyZWUgKGN3ZCk7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBTdWl0ZSAqCittcGcxMjNhdWRpb2RlY19zdWl0ZSAodm9pZCkKK3sKKyAgR3N0UmVnaXN0cnkgKnJlZ2lzdHJ5OworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoIm1wZzEyM2F1ZGlvZGVjIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICByZWdpc3RyeSA9IGdzdF9yZWdpc3RyeV9nZXQgKCk7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIGlmIChnc3RfcmVnaXN0cnlfY2hlY2tfZmVhdHVyZV92ZXJzaW9uIChyZWdpc3RyeSwgImZpbGVzcmMiLAorICAgICAgICAgIEdTVF9WRVJTSU9OX01BSk9SLCBHU1RfVkVSU0lPTl9NSU5PUiwgMCkgJiYKKyAgICAgIGdzdF9yZWdpc3RyeV9jaGVja19mZWF0dXJlX3ZlcnNpb24gKHJlZ2lzdHJ5LCAibXBlZ2F1ZGlvcGFyc2UiLAorICAgICAgICAgIEdTVF9WRVJTSU9OX01BSk9SLCBHU1RfVkVSU0lPTl9NSU5PUiwgMCkgJiYKKyAgICAgIGdzdF9yZWdpc3RyeV9jaGVja19mZWF0dXJlX3ZlcnNpb24gKHJlZ2lzdHJ5LCAiYXBwc3JjIiwKKyAgICAgICAgICBHU1RfVkVSU0lPTl9NQUpPUiwgR1NUX1ZFUlNJT05fTUlOT1IsIDApKSB7CisgICAgaWYgKGlzX3Rlc3RfZmlsZV9hdmFpbGFibGUgKE1QMl9TVFJFQU1fRklMRU5BTUUpKQorICAgICAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2RlY29kZV9tcGVnMWxheWVyMik7CisgICAgaWYgKGlzX3Rlc3RfZmlsZV9hdmFpbGFibGUgKE1QM19DQlJfU1RSRUFNX0ZJTEVOQU1FKSkKKyAgICAgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9kZWNvZGVfbXBlZzFsYXllcjNfY2JyKTsKKyAgICBpZiAoaXNfdGVzdF9maWxlX2F2YWlsYWJsZSAoTVAzX1ZCUl9TVFJFQU1fRklMRU5BTUUpKQorICAgICAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2RlY29kZV9tcGVnMWxheWVyM192YnIpOworICB9CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9kZWNvZGVfZ2FyYmFnZV9tcGVnMWxheWVyMik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9kZWNvZGVfZ2FyYmFnZV9tcGVnMWxheWVyMyk7CisKKyAgcmV0dXJuIHM7Cit9CisKKworR1NUX0NIRUNLX01BSU4gKG1wZzEyM2F1ZGlvZGVjKQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsYXdkZWMuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL211bGF3ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I2ZjAzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL211bGF3ZGVjLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qIEdTdHJlYW1lciBNdWxhd0RlYyB1bml0IHRlc3RzCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitzdGF0aWMgR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKK3N0YXRpYyBHc3RFbGVtZW50ICptdWxhd2RlYyA9IE5VTEw7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXJhdywiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzE2KSAiLCAiCisgICAgICAgICJyYXRlID0gKGludCkgODAwMCwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICJsYXlvdXQgPSAoc3RyaW5nKWludGVybGVhdmVkIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1tdWxhdywiICJyYXRlID0gKGludCkgODAwMCwiICJjaGFubmVscyA9IChpbnQpIDEiKQorICAgICk7CisKK3N0YXRpYyB2b2lkCittdWxhd2RlY19zZXR1cCAodm9pZCkKK3sKKyAgR3N0Q2FwcyAqc3JjX2NhcHM7CisKKyAgc3JjX2NhcHMgPQorICAgICAgZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKCJhdWRpby94LW11bGF3LCIgInJhdGUgPSAoaW50KSA4MDAwLCIKKyAgICAgICJjaGFubmVscyA9IChpbnQpIDEiKTsKKworICBHU1RfREVCVUcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgbXVsYXdkZWMgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoIm11bGF3ZGVjIik7CisKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAobXVsYXdkZWMsICZzcmN0ZW1wbGF0ZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAobXVsYXdkZWMsICZzaW5rdGVtcGxhdGUpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIG11bGF3ZGVjLCBzcmNfY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKworICBnc3RfY2Fwc191bnJlZiAoc3JjX2NhcHMpOworfQorCitzdGF0aWMgdm9pZAorYnVmZmVyX3VucmVmICh2b2lkICpidWZmZXIsIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoR1NUX0JVRkZFUiAoYnVmZmVyKSk7Cit9CisKK3N0YXRpYyB2b2lkCittdWxhd2RlY190ZWFyZG93biAodm9pZCkKK3sKKyAgLyogZnJlZSBkZWNvZGVkIGJ1ZmZlcnMgKi8KKyAgZ19saXN0X2ZvcmVhY2ggKGJ1ZmZlcnMsIGJ1ZmZlcl91bnJlZiwgTlVMTCk7CisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKyAgYnVmZmVycyA9IE5VTEw7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAobXVsYXdkZWMpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKG11bGF3ZGVjKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKG11bGF3ZGVjKTsKKyAgbXVsYXdkZWMgPSBOVUxMOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9vbmVfYnVmZmVyKQoreworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgZ2ludCBidWZfc2l6ZSA9IDQwOTY7CisgIGd1aW50OCAqZHA7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobXVsYXdkZWMsIEdTVF9TVEFURV9QTEFZSU5HKSA9PQorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLCAiY291bGQgbm90IGNoYW5nZSBzdGF0ZSB0byBwbGF5aW5nIik7CisKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgIGRwID0gZ19tYWxsb2MwIChidWZfc2l6ZSk7CisgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAoYnVmZmVyLAorICAgICAgZ3N0X21lbW9yeV9uZXdfd3JhcHBlZCAoMCwgZHAsIGJ1Zl9zaXplLCAwLCBidWZfc2l6ZSwgZHAsIGdfZnJlZSkpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChidWZmZXIsICJidWZmZXIiLCAxKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisKKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID09IDEpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoR1NUX0JVRkZFUiAoZ19saXN0X2ZpcnN0IChidWZmZXJzKS0+ZGF0YSkpKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorbXVsYXdkZWNfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgibXVsYXdkZWMiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgibXVsYXdkZWMiKTsKKworICB0Y2FzZV9hZGRfY2hlY2tlZF9maXh0dXJlICh0Y19jaGFpbiwgbXVsYXdkZWNfc2V0dXAsIG11bGF3ZGVjX3RlYXJkb3duKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X29uZV9idWZmZXIpOworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKG11bGF3ZGVjKQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsYXdlbmMuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL211bGF3ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3ZjNlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL211bGF3ZW5jLmMKQEAgLTAsMCArMSwxNzYgQEAKKy8qIEdTdHJlYW1lciBNdWxhd0VuYyB1bml0IHRlc3RzCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitzdGF0aWMgR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKK3N0YXRpYyBHc3RFbGVtZW50ICptdWxhd2VuYyA9IE5VTEw7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LW11bGF3LCIgInJhdGUgPSAoaW50KSA4MDAwLCIgImNoYW5uZWxzID0gKGludCkgMSIpCisgICAgKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FIChTMTYpICIsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSA4MDAwLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgImxheW91dCA9IChzdHJpbmcpaW50ZXJsZWF2ZWQiKQorICAgICk7CisKK3N0YXRpYyB2b2lkCittdWxhd2VuY19zZXR1cCAodm9pZCkKK3sKKyAgR3N0Q2FwcyAqc3JjX2NhcHM7CisKKyAgc3JjX2NhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoImF1ZGlvL3gtcmF3LCIKKyAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORSAoUzE2KSAiLCAiCisgICAgICAicmF0ZSA9IChpbnQpIDgwMDAsICIKKyAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgImxheW91dCA9IChzdHJpbmcpaW50ZXJsZWF2ZWQiKTsKKworICBHU1RfREVCVUcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgbXVsYXdlbmMgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoIm11bGF3ZW5jIik7CisKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAobXVsYXdlbmMsICZzcmN0ZW1wbGF0ZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAobXVsYXdlbmMsICZzaW5rdGVtcGxhdGUpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIG11bGF3ZW5jLCBzcmNfY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKHNyY19jYXBzKTsKK30KKworc3RhdGljIHZvaWQKK2J1ZmZlcl91bnJlZiAodm9pZCAqYnVmZmVyLCB2b2lkICp1c2VyX2RhdGEpCit7CisgIGdzdF9idWZmZXJfdW5yZWYgKEdTVF9CVUZGRVIgKGJ1ZmZlcikpOworfQorCitzdGF0aWMgdm9pZAorbXVsYXdlbmNfdGVhcmRvd24gKHZvaWQpCit7CisgIC8qIGZyZWUgZW5jb2RlZCBidWZmZXJzICovCisgIGdfbGlzdF9mb3JlYWNoIChidWZmZXJzLCBidWZmZXJfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKG11bGF3ZW5jKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkIChtdWxhd2VuYyk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChtdWxhd2VuYyk7CisgIG11bGF3ZW5jID0gTlVMTDsKK30KKworc3RhdGljIGdib29sZWFuCitjaGVja19mb3JfbWF4aW11bV9iaXRyYXRlIChHc3RQYWQgKiBwYWQsIEdzdEV2ZW50ICoqIGV2ZW50cCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBnYm9vbGVhbiAqZm91bmRfbWF4aW11bV9iaXRyYXRlID0gKGdib29sZWFuICopIHVzZXJfZGF0YTsKKyAgR3N0RXZlbnQgKmV2ZW50ID0gKmV2ZW50cDsKKworICBpZiAoZXZlbnQtPnR5cGUgPT0gR1NUX0VWRU5UX1RBRykgeworICAgIEdzdFRhZ0xpc3QgKnRhZ2xpc3QgPSBOVUxMOworICAgIGd1aW50IHZhbHVlID0gMDsKKyAgICBnc3RfZXZlbnRfcGFyc2VfdGFnIChldmVudCwgJnRhZ2xpc3QpOworCisgICAgZmFpbF91bmxlc3MgKHRhZ2xpc3QgIT0gTlVMTCk7CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF91aW50ICh0YWdsaXN0LCBHU1RfVEFHX01BWElNVU1fQklUUkFURSwKKyAgICAgICAgICAgICZ2YWx1ZSkpOworCisgICAgLyogYml0cmF0ZSBuZWVkcyB0byBiZSBleGFjdGx5IHNhbXBsZSByYXRlICogY2hhbm5lbHMgKiA4ICovCisgICAgZmFpbF91bmxlc3MgKHZhbHVlID09IDgwMDAgKiAxICogOCk7CisKKyAgICAqZm91bmRfbWF4aW11bV9iaXRyYXRlID0gVFJVRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9vbmVfYnVmZmVyKQoreworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgZ2ludCBidWZfc2l6ZSA9IDQwOTY7CisgIGd1aW50OCAqZHA7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAobXVsYXdlbmMsIEdTVF9TVEFURV9QTEFZSU5HKSA9PQorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLCAiY291bGQgbm90IGNoYW5nZSBzdGF0ZSB0byBwbGF5aW5nIik7CisKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgIGRwID0gZ19tYWxsb2MwIChidWZfc2l6ZSk7CisgIGdzdF9idWZmZXJfYXBwZW5kX21lbW9yeSAoYnVmZmVyLAorICAgICAgZ3N0X21lbW9yeV9uZXdfd3JhcHBlZCAoMCwgZHAsIGJ1Zl9zaXplLCAwLCBidWZfc2l6ZSwgZHAsIGdfZnJlZSkpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChidWZmZXIsICJidWZmZXIiLCAxKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisKKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID09IDEpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoR1NUX0JVRkZFUiAoZ19saXN0X2ZpcnN0IChidWZmZXJzKS0+ZGF0YSkpKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF90YWdzKQoreworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgZ2ludCBidWZfc2l6ZSA9IDQwOTY7CisgIGd1aW50OCAqZHA7CisgIGdib29sZWFuIGZvdW5kX21heGltdW1fYml0cmF0ZSA9IEZBTFNFOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKG11bGF3ZW5jLCBHU1RfU1RBVEVfUExBWUlORykgPT0KKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywgImNvdWxkIG5vdCBjaGFuZ2Ugc3RhdGUgdG8gcGxheWluZyIpOworCisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3ICgpOworICBkcCA9IGdfbWFsbG9jMCAoYnVmX3NpemUpOworICBnc3RfYnVmZmVyX2FwcGVuZF9tZW1vcnkgKGJ1ZmZlciwKKyAgICAgIGdzdF9tZW1vcnlfbmV3X3dyYXBwZWQgKDAsIGRwLCBidWZfc2l6ZSwgMCwgYnVmX3NpemUsIGRwLCBnX2ZyZWUpKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoYnVmZmVyLCAiYnVmZmVyIiwgMSk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBnc3RfcGFkX3N0aWNreV9ldmVudHNfZm9yZWFjaCAobXlzaW5rcGFkLCBjaGVja19mb3JfbWF4aW11bV9iaXRyYXRlLAorICAgICAgJmZvdW5kX21heGltdW1fYml0cmF0ZSk7CisgIGZhaWxfdW5sZXNzIChmb3VuZF9tYXhpbXVtX2JpdHJhdGUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCittdWxhd2VuY19zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJtdWxhd2VuYyIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJtdWxhd2VuYyIpOworCisgIHRjYXNlX2FkZF9jaGVja2VkX2ZpeHR1cmUgKHRjX2NoYWluLCBtdWxhd2VuY19zZXR1cCwgbXVsYXdlbmNfdGVhcmRvd24pOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfb25lX2J1ZmZlcik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF90YWdzKTsKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChtdWxhd2VuYykKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvbXVsdGlmaWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdhYmZmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL211bHRpZmlsZS5jCkBAIC0wLDAgKzEsMzk5IEBACisvKiBHU3RyZWFtZXIgdW5pdCB0ZXN0IGZvciBtdWx0aWZpbGUgcGx1Z2luCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z2xpYi9nc3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitzdGF0aWMgR0xpc3QgKm1mc19tZXNzYWdlcyA9IE5VTEw7CisKK3N0YXRpYyB2b2lkCittZnNfY2hlY2tfbmV4dF9tZXNzYWdlIChjb25zdCBnY2hhciAqIGZpbGVuYW1lKQoreworICBHc3RNZXNzYWdlICptc2c7CisgIGNvbnN0IGdjaGFyICptc2dfZmlsZW5hbWU7CisgIGNvbnN0IEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworCisgIGZhaWxfdW5sZXNzIChtZnNfbWVzc2FnZXMgIT0gTlVMTCk7CisKKyAgbXNnID0gbWZzX21lc3NhZ2VzLT5kYXRhOworICBtZnNfbWVzc2FnZXMgPSBnX2xpc3RfZGVsZXRlX2xpbmsgKG1mc19tZXNzYWdlcywgbWZzX21lc3NhZ2VzKTsKKworICBzdHJ1Y3R1cmUgPSBnc3RfbWVzc2FnZV9nZXRfc3RydWN0dXJlIChtc2cpOworCisgIG1zZ19maWxlbmFtZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3N0cmluZyAoc3RydWN0dXJlLCAiZmlsZW5hbWUiKTsKKworICBmYWlsX3VubGVzcyAoc3RyY21wIChmaWxlbmFtZSwgbXNnX2ZpbGVuYW1lKSA9PSAwKTsKKworICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKK30KKworc3RhdGljIHZvaWQKK3J1bl9waXBlbGluZSAoR3N0RWxlbWVudCAqIHBpcGVsaW5lKQoreworICBHc3RNZXNzYWdlICptc2c7CisgIEdzdEJ1cyAqYnVzOworCisgIGJ1cyA9IGdzdF9waXBlbGluZV9nZXRfYnVzIChHU1RfUElQRUxJTkUgKHBpcGVsaW5lKSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BBVVNFRCk7CisgIGdzdF9lbGVtZW50X2dldF9zdGF0ZSAocGlwZWxpbmUsIE5VTEwsIE5VTEwsIC0xKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIHdoaWxlICgxKSB7CisgICAgbXNnID0KKyAgICAgICAgZ3N0X2J1c190aW1lZF9wb3BfZmlsdGVyZWQgKGJ1cywgR1NUX0NMT0NLX1RJTUVfTk9ORSwKKyAgICAgICAgR1NUX01FU1NBR0VfRU9TIHwgR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9FTEVNRU5UKTsKKworICAgIGZhaWxfdW5sZXNzIChtc2cgIT0gTlVMTCk7CisgICAgaWYgKG1zZykgeworICAgICAgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRUxFTUVOVCkgeworICAgICAgICBpZiAoZ3N0X21lc3NhZ2VfaGFzX25hbWUgKG1zZywgIkdzdE11bHRpRmlsZVNpbmsiKSkKKyAgICAgICAgICBtZnNfbWVzc2FnZXMgPSBnX2xpc3RfYXBwZW5kIChtZnNfbWVzc2FnZXMsIG1zZyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgZmFpbF91bmxlc3MgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRU9TKTsKKyAgICAgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworICAgIH0KKyAgICBicmVhazsKKyAgfQorCisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbXVsdGlmaWxlc2lua19rZXlfZnJhbWUpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RFbGVtZW50ICptZnM7CisgIGludCBpOworICBjb25zdCBnY2hhciAqdG1wZGlyOworICBnY2hhciAqbXlfdG1wZGlyOworICBnY2hhciAqdGVtcGxhdGU7CisgIGdjaGFyICptZnNfcGF0dGVybjsKKworICB0bXBkaXIgPSBnX2dldF90bXBfZGlyICgpOworICB0ZW1wbGF0ZSA9IGdfYnVpbGRfZmlsZW5hbWUgKHRtcGRpciwgIm11bHRpZmlsZS10ZXN0LVhYWFhYWCIsIE5VTEwpOworICBteV90bXBkaXIgPSBnX21rZHRlbXAgKHRlbXBsYXRlKTsKKyAgZmFpbF9pZiAobXlfdG1wZGlyID09IE5VTEwpOworCisgIHBpcGVsaW5lID0KKyAgICAgIGdzdF9wYXJzZV9sYXVuY2gKKyAgICAgICgidmlkZW90ZXN0c3JjIG51bS1idWZmZXJzPTEwICEgdmlkZW8veC1yYXcsZm9ybWF0PShzdHJpbmcpSTQyMCx3aWR0aD0zMjAsaGVpZ2h0PTI0MCAhIG11bHRpZmlsZXNpbmsgbmFtZT1tZnMiLAorICAgICAgTlVMTCk7CisgIGZhaWxfaWYgKHBpcGVsaW5lID09IE5VTEwpOworICBtZnMgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJtZnMiKTsKKyAgZmFpbF9pZiAobWZzID09IE5VTEwpOworICBtZnNfcGF0dGVybiA9IGdfYnVpbGRfZmlsZW5hbWUgKG15X3RtcGRpciwgIiUwNWQiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAobWZzKSwgImxvY2F0aW9uIiwgbWZzX3BhdHRlcm4sICJwb3N0LW1lc3NhZ2VzIiwgVFJVRSwKKyAgICAgIE5VTEwpOworICBnX29iamVjdF91bnJlZiAobWZzKTsKKyAgcnVuX3BpcGVsaW5lIChwaXBlbGluZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIGNoYXIgKnM7CisKKyAgICBzID0gZ19zdHJkdXBfcHJpbnRmIChtZnNfcGF0dGVybiwgaSk7CisgICAgZmFpbF9pZiAoZ19yZW1vdmUgKHMpICE9IDApOworCisgICAgbWZzX2NoZWNrX25leHRfbWVzc2FnZSAocyk7CisKKyAgICBnX2ZyZWUgKHMpOworICB9CisgIGZhaWxfaWYgKGdfcmVtb3ZlIChteV90bXBkaXIpICE9IDApOworCisgIGZhaWxfdW5sZXNzIChtZnNfbWVzc2FnZXMgPT0gTlVMTCk7CisgIGdfZnJlZSAobWZzX3BhdHRlcm4pOworICBnX2ZyZWUgKG15X3RtcGRpcik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbXVsdGlmaWxlc2lua19tYXhfZmlsZXMpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RFbGVtZW50ICptZnM7CisgIGludCBpOworICBjb25zdCBnY2hhciAqdG1wZGlyOworICBnY2hhciAqbXlfdG1wZGlyOworICBnY2hhciAqdGVtcGxhdGU7CisgIGdjaGFyICptZnNfcGF0dGVybjsKKworICB0bXBkaXIgPSBnX2dldF90bXBfZGlyICgpOworICB0ZW1wbGF0ZSA9IGdfYnVpbGRfZmlsZW5hbWUgKHRtcGRpciwgIm11bHRpZmlsZS10ZXN0LVhYWFhYWCIsIE5VTEwpOworICBteV90bXBkaXIgPSBnX21rZHRlbXAgKHRlbXBsYXRlKTsKKyAgZmFpbF9pZiAobXlfdG1wZGlyID09IE5VTEwpOworCisgIHBpcGVsaW5lID0KKyAgICAgIGdzdF9wYXJzZV9sYXVuY2gKKyAgICAgICgidmlkZW90ZXN0c3JjIG51bS1idWZmZXJzPTEwICEgdmlkZW8veC1yYXcsZm9ybWF0PShzdHJpbmcpSTQyMCx3aWR0aD0zMjAsaGVpZ2h0PTI0MCAhIG11bHRpZmlsZXNpbmsgbmFtZT1tZnMiLAorICAgICAgTlVMTCk7CisgIGZhaWxfaWYgKHBpcGVsaW5lID09IE5VTEwpOworICBtZnMgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJtZnMiKTsKKyAgZmFpbF9pZiAobWZzID09IE5VTEwpOworICBtZnNfcGF0dGVybiA9IGdfYnVpbGRfZmlsZW5hbWUgKG15X3RtcGRpciwgIiUwNWQiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAobWZzKSwgImxvY2F0aW9uIiwgbWZzX3BhdHRlcm4sICJtYXgtZmlsZXMiLCAzLCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKG1mcyk7CisgIHJ1bl9waXBlbGluZSAocGlwZWxpbmUpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisKKyAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworICAgIGNoYXIgKnM7CisKKyAgICBzID0gZ19zdHJkdXBfcHJpbnRmIChtZnNfcGF0dGVybiwgaSk7CisgICAgZmFpbF91bmxlc3MgKGdfcmVtb3ZlIChzKSAhPSAwKTsKKyAgICBnX2ZyZWUgKHMpOworICB9CisgIGZvciAoaSA9IDc7IGkgPCAxMDsgaSsrKSB7CisgICAgY2hhciAqczsKKworICAgIHMgPSBnX3N0cmR1cF9wcmludGYgKG1mc19wYXR0ZXJuLCBpKTsKKyAgICBmYWlsX2lmIChnX3JlbW92ZSAocykgIT0gMCk7CisgICAgZ19mcmVlIChzKTsKKyAgfQorICBmYWlsX2lmIChnX3JlbW92ZSAobXlfdG1wZGlyKSAhPSAwKTsKKworICBnX2ZyZWUgKG1mc19wYXR0ZXJuKTsKKyAgZ19mcmVlIChteV90bXBkaXIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X211bHRpZmlsZXNpbmtfa2V5X3VuaXQpCit7CisgIEdzdEVsZW1lbnQgKm1mczsKKyAgaW50IGk7CisgIGNvbnN0IGdjaGFyICp0bXBkaXI7CisgIGdjaGFyICpteV90bXBkaXI7CisgIGdjaGFyICp0ZW1wbGF0ZTsKKyAgZ2NoYXIgKm1mc19wYXR0ZXJuOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0UGFkICpzaW5rOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIEdzdEJ1cyAqYnVzOworCisgIHRtcGRpciA9IGdfZ2V0X3RtcF9kaXIgKCk7CisgIHRlbXBsYXRlID0gZ19idWlsZF9maWxlbmFtZSAodG1wZGlyLCAibXVsdGlmaWxlLXRlc3QtWFhYWFhYIiwgTlVMTCk7CisgIG15X3RtcGRpciA9IGdfbWtkdGVtcCAodGVtcGxhdGUpOworICBmYWlsX2lmIChteV90bXBkaXIgPT0gTlVMTCk7CisKKyAgbWZzID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgibXVsdGlmaWxlc2luayIsIE5VTEwpOworICBmYWlsX2lmIChtZnMgPT0gTlVMTCk7CisgIG1mc19wYXR0ZXJuID0gZ19idWlsZF9maWxlbmFtZSAobXlfdG1wZGlyLCAiJTA1ZCIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChtZnMpLCAibG9jYXRpb24iLCBtZnNfcGF0dGVybiwgIm5leHQtZmlsZSIsIDMsCisgICAgICAicG9zdC1tZXNzYWdlcyIsIFRSVUUsIE5VTEwpOworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAobWZzLCBidXMpOworICBmYWlsX2lmIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKG1mcywKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBzaW5rID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKG1mcywgInNpbmsiKTsKKworICBnc3RfcGFkX3NlbmRfZXZlbnQgKHNpbmssIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgidGVzdCIpKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9wYWRfc2VuZF9ldmVudCAoc2luaywgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoNCk7CisKKyAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsICJmb28iLCA0KTsKKyAgZmFpbF9pZiAoZ3N0X3BhZF9jaGFpbiAoc2luaywgZ3N0X2J1ZmZlcl9jb3B5IChidWYpKSAhPSBHU1RfRkxPV19PSyk7CisKKyAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsICJiYXIiLCA0KTsKKyAgZmFpbF9pZiAoZ3N0X3BhZF9jaGFpbiAoc2luaywgZ3N0X2J1ZmZlcl9jb3B5IChidWYpKSAhPSBHU1RfRkxPV19PSyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfc2VuZF9ldmVudCAoc2luaywKKyAgICAgICAgICBnc3RfdmlkZW9fZXZlbnRfbmV3X2Rvd25zdHJlYW1fZm9yY2Vfa2V5X3VuaXQgKEdTVF9DTE9DS19USU1FX05PTkUsCisgICAgICAgICAgICAgIEdTVF9DTE9DS19USU1FX05PTkUsIEdTVF9DTE9DS19USU1FX05PTkUsIFRSVUUsIDEpKSk7CisKKyAgZ3N0X2J1ZmZlcl9maWxsIChidWYsIDAsICJiYXoiLCA0KTsKKyAgZmFpbF9pZiAoZ3N0X3BhZF9jaGFpbiAoc2luaywgYnVmKSAhPSBHU1RfRkxPV19PSyk7CisKKyAgZ3N0X3BhZF9zZW5kX2V2ZW50IChzaW5rLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisKKyAgZmFpbF9pZiAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChtZnMsCisgICAgICAgICAgR1NUX1NUQVRFX05VTEwpID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKG1mcywgTlVMTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgIGNoYXIgKnM7CisgICAgR3N0TWVzc2FnZSAqbXNnOworCisgICAgcyA9IGdfc3RyZHVwX3ByaW50ZiAobWZzX3BhdHRlcm4sIGkpOworICAgIGZhaWxfaWYgKGdfcmVtb3ZlIChzKSAhPSAwKTsKKworICAgIG1zZyA9IGdzdF9idXNfcG9wX2ZpbHRlcmVkIChidXMsIEdTVF9NRVNTQUdFX0VMRU1FTlQpOworICAgIGZhaWxfdW5sZXNzIChtc2cgIT0gTlVMTCk7CisgICAgZmFpbF91bmxlc3MgKGdzdF9tZXNzYWdlX2hhc19uYW1lIChtc2csICJHc3RNdWx0aUZpbGVTaW5rIikpOworICAgIGZhaWxfdW5sZXNzIChzdHJjbXAgKHMsCisgICAgICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9zdHJpbmcgKGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1zZyksCisgICAgICAgICAgICAgICAgImZpbGVuYW1lIikpID09IDApOworCisgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgICAgZ19mcmVlIChzKTsKKyAgfQorICBmYWlsX2lmIChnX3JlbW92ZSAobXlfdG1wZGlyKSAhPSAwKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworICBnX2ZyZWUgKG1mc19wYXR0ZXJuKTsKKyAgZ19mcmVlIChteV90bXBkaXIpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rKTsKKyAgZ3N0X29iamVjdF91bnJlZiAobWZzKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tdWx0aWZpbGVzcmMpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RFbGVtZW50ICptZnM7CisgIGludCBpOworICBjb25zdCBnY2hhciAqdG1wZGlyOworICBnY2hhciAqbXlfdG1wZGlyOworICBnY2hhciAqdGVtcGxhdGU7CisgIGdjaGFyICptZnNfcGF0dGVybjsKKworICB0bXBkaXIgPSBnX2dldF90bXBfZGlyICgpOworICB0ZW1wbGF0ZSA9IGdfYnVpbGRfZmlsZW5hbWUgKHRtcGRpciwgIm11bHRpZmlsZS10ZXN0LVhYWFhYWCIsIE5VTEwpOworICBteV90bXBkaXIgPSBnX21rZHRlbXAgKHRlbXBsYXRlKTsKKyAgZmFpbF9pZiAobXlfdG1wZGlyID09IE5VTEwpOworCisgIHBpcGVsaW5lID0KKyAgICAgIGdzdF9wYXJzZV9sYXVuY2gKKyAgICAgICgidmlkZW90ZXN0c3JjIG51bS1idWZmZXJzPTEwICEgdmlkZW8veC1yYXcsZm9ybWF0PShzdHJpbmcpSTQyMCx3aWR0aD0zMjAsaGVpZ2h0PTI0MCAhIG11bHRpZmlsZXNpbmsgbmFtZT1tZnMiLAorICAgICAgTlVMTCk7CisgIGZhaWxfaWYgKHBpcGVsaW5lID09IE5VTEwpOworICBtZnMgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJtZnMiKTsKKyAgZmFpbF9pZiAobWZzID09IE5VTEwpOworICBtZnNfcGF0dGVybiA9IGdfYnVpbGRfZmlsZW5hbWUgKG15X3RtcGRpciwgIiUwNWQiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAobWZzKSwgImxvY2F0aW9uIiwgbWZzX3BhdHRlcm4sIE5VTEwpOworICBnX2ZyZWUgKG1mc19wYXR0ZXJuKTsKKyAgZ19vYmplY3RfdW5yZWYgKG1mcyk7CisgIHJ1bl9waXBlbGluZSAocGlwZWxpbmUpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisKKyAgcGlwZWxpbmUgPQorICAgICAgZ3N0X3BhcnNlX2xhdW5jaAorICAgICAgKCJtdWx0aWZpbGVzcmMgISB2aWRlby94LXJhdyxmb3JtYXQ9KHN0cmluZylJNDIwLHdpZHRoPTMyMCxoZWlnaHQ9MjQwLGZyYW1lcmF0ZT0xMC8xICEgZmFrZXNpbmsiLAorICAgICAgTlVMTCk7CisgIGZhaWxfaWYgKHBpcGVsaW5lID09IE5VTEwpOworICBtZnMgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJtdWx0aWZpbGVzcmMwIik7CisgIGZhaWxfaWYgKG1mcyA9PSBOVUxMKTsKKyAgbWZzX3BhdHRlcm4gPSBnX2J1aWxkX2ZpbGVuYW1lIChteV90bXBkaXIsICIlMDVkIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKG1mcyksICJsb2NhdGlvbiIsIG1mc19wYXR0ZXJuLCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKG1mcyk7CisgIHJ1bl9waXBlbGluZSAocGlwZWxpbmUpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisKKyAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICBjaGFyICpzOworCisgICAgcyA9IGdfc3RyZHVwX3ByaW50ZiAobWZzX3BhdHRlcm4sIGkpOworICAgIGZhaWxfaWYgKGdfcmVtb3ZlIChzKSAhPSAwKTsKKyAgICBnX2ZyZWUgKHMpOworICB9CisgIGZhaWxfaWYgKGdfcmVtb3ZlIChteV90bXBkaXIpICE9IDApOworCisgIGdfZnJlZSAobWZzX3BhdHRlcm4pOworICBnX2ZyZWUgKG15X3RtcGRpcik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQU19BTlkpOworCisvKiBtYWtlIHN1cmUgc3RvcF9pbmRleCBpcyBob25vdXJlZCBldmVuIGlmIHRoZSBuZXh0IHRhcmdldCBmaWxlIGV4aXN0cyAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbXVsdGlmaWxlc3JjX3N0b3BfaW5kZXgpCit7CisgIEdzdEVsZW1lbnQgKnNyYzsKKyAgR3N0RXZlbnQgKmV2ZW50OworICBHc3RQYWQgKnNpbmtwYWQ7CisgIGdjaGFyICpmbjsKKworICBzcmMgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoIm11bHRpZmlsZXNyYyIpOworICBmYWlsX3VubGVzcyAoc3JjICE9IE5VTEwpOworCisgIGZuID0gZ19idWlsZF9maWxlbmFtZSAoR1NUX1RFU1RfRklMRVNfUEFUSCwgImltYWdlLmpwZyIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNyYywgImxvY2F0aW9uIiwgZm4sIE5VTEwpOworICBnX2ZyZWUgKGZuKTsKKworICBnX29iamVjdF9zZXQgKHNyYywgInN0b3AtaW5kZXgiLCA1LCBOVUxMKTsKKworICBzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkX2J5X25hbWUgKHNyYywgJnNpbmt0ZW1wbGF0ZSwgInNyYyIpOworICBmYWlsX3VubGVzcyAoc2lua3BhZCAhPSBOVUxMKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzaW5rcGFkLCBUUlVFKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNyYywgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIGdzdF9lbGVtZW50X2dldF9zdGF0ZSAoc3JjLCBOVUxMLCBOVUxMLCAtMSk7CisKKyAgLyogYnVzeS1sb29wIGZvciBFT1MgKi8KKyAgZG8geworICAgIGdfdXNsZWVwIChHX1VTRUNfUEVSX1NFQyAvIDEwKTsKKyAgICBldmVudCA9IGdzdF9wYWRfZ2V0X3N0aWNreV9ldmVudCAoc2lua3BhZCwgR1NUX0VWRU5UX0VPUywgMCk7CisgIH0gd2hpbGUgKGV2ZW50ID09IE5VTEwpOworICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKworICAvKiBSYW5nZSBhcHBlYXJzIHRvIGJlIFsgc3RhcnQsIHN0b3AgXSAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgNSArIDEpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc3JjLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X2NoZWNrX2Ryb3BfYnVmZmVycyAoKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3BhZF9ieV9uYW1lIChzcmMsICJzcmMiKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKHNyYyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitzdGF0aWMgU3VpdGUgKgorbXVsdGlmaWxlX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoIm11bHRpZmlsZSIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X211bHRpZmlsZXNpbmtfa2V5X2ZyYW1lKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X211bHRpZmlsZXNpbmtfbWF4X2ZpbGVzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X211bHRpZmlsZXNpbmtfa2V5X3VuaXQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbXVsdGlmaWxlc3JjKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X211bHRpZmlsZXNyY19zdG9wX2luZGV4KTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKG11bHRpZmlsZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9wYXJzZXIuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZmZlZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9wYXJzZXIuYwpAQCAtMCwwICsxLDQzNSBAQAorLyoKKyAqIEdTdHJlYW1lcgorICoKKyAqIHVuaXQgdGVzdCBmb3IgKGF1ZGlvKSBwYXJzZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdDogU3RlZmFuIEtvc3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSAiZWxlbWVudHMvcGFyc2VyLmgiCisKKworLyogY29udGV4dCBzdGF0ZSB2YXJpYWJsZXMgKi8KK2NvbnN0IGdjaGFyICpjdHhfZmFjdG9yeTsKK0dzdFN0YXRpY1BhZFRlbXBsYXRlICpjdHhfc2lua190ZW1wbGF0ZTsKK0dzdFN0YXRpY1BhZFRlbXBsYXRlICpjdHhfc3JjX3RlbXBsYXRlOworR3N0Q2FwcyAqY3R4X2lucHV0X2NhcHM7CitHc3RDYXBzICpjdHhfb3V0cHV0X2NhcHM7CitndWludCBjdHhfZGlzY2FyZCA9IDA7CitkYXRhYmxvYiBjdHhfaGVhZGVyc1tNQVhfSEVBREVSU10gPSB7IHtOVUxMLCAwfSwgfTsKKworZ2Jvb2xlYW4gY3R4X25vX21ldGFkYXRhID0gRkFMU0U7CisKKy8qIGhlbHBlciB2YXJpYWJsZXMgKi8KK0dMaXN0ICpjdXJyZW50X2J1ZiA9IE5VTEw7CisKK0dzdFBhZCAqc3JjcGFkLCAqc2lua3BhZDsKK2d1aW50IGRhdGFvZmZzZXQgPSAwOworR3N0Q2xvY2tUaW1lIHRzX2NvdW50ZXIgPSAwOworZ2ludDY0IG9mZnNldF9jb3VudGVyID0gMDsKK2d1aW50IGJ1ZmZlcl9jb3VudGVyID0gMDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ3VpbnQgZGlzY2FyZDsKKyAgZ3VpbnQgYnVmZmVyc19iZWZvcmVfb2Zmc2V0X3NraXA7CisgIGd1aW50IG9mZnNldF9za2lwX2Ftb3VudDsKKyAgY29uc3QgZ3VpbnQ4ICpkYXRhX3RvX3ZlcmlmeTsKKyAgZ3VpbnQgZGF0YV90b192ZXJpZnlfc2l6ZTsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Jvb2xlYW4gbm9fbWV0YWRhdGE7Cit9IGJ1ZmZlcl92ZXJpZnlfZGF0YV9zOworCisvKiB0YWtlcyBhIGNvcHkgb2YgdGhlIHBhc3NlZCBidWZmZXIgZGF0YSAqLworc3RhdGljIEdzdEJ1ZmZlciAqCitidWZmZXJfbmV3IChjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmZXJfZGF0YSwgZ3VpbnQgc2l6ZSkKK3sKKyAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplKTsKKyAgaWYgKGJ1ZmZlcl9kYXRhKSB7CisgICAgZ3N0X2J1ZmZlcl9maWxsIChidWZmZXIsIDAsIGJ1ZmZlcl9kYXRhLCBzaXplKTsKKyAgfSBlbHNlIHsKKyAgICBndWludCBpOworICAgIEdzdE1hcEluZm8gbWFwOworCisgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgICAgLyogQ3JlYXRlIGEgcmVjb2duaXphYmxlIHBhdHRlcm4gKGxvb3AgMHgwMCAtPiAweGZmKSBpbiB0aGUgZGF0YSBibG9jayAqLworICAgIGZvciAoaSA9IDA7IGkgPCBtYXAuc2l6ZTsgaSsrKSB7CisgICAgICBtYXAuZGF0YVtpXSA9IGkgJSAweDEwMDsKKyAgICB9CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgfQorCisgIC8qIGdzdF9idWZmZXJfc2V0X2NhcHMgKGJ1ZmZlciwgR1NUX1BBRF9DQVBTIChzcmNwYWQpKTsgKi8KKyAgR1NUX0JVRkZFUl9PRkZTRVQgKGJ1ZmZlcikgPSBkYXRhb2Zmc2V0OworICBkYXRhb2Zmc2V0ICs9IHNpemU7CisgIHJldHVybiBidWZmZXI7Cit9CisKKy8qCisgKiBBZGRzIGJ1ZmZlciBzaXplcyB0b2dldGhlci4KKyAqLworc3RhdGljIHZvaWQKK2J1ZmZlcl9jb3VudF9zaXplICh2b2lkICpidWZmZXIsIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgZ3VpbnQgKnN1bSA9IChndWludCAqKSB1c2VyX2RhdGE7CisgICpzdW0gKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmZmVyKTsKK30KKworLyoKKyAqIFZlcmlmeSB0aGF0IGdpdmVuIGJ1ZmZlciBjb250YWlucyBwcmVkZWZpbmVkIEFEVFMgZnJhbWUuCisgKi8KK3N0YXRpYyB2b2lkCitidWZmZXJfdmVyaWZ5X2RhdGEgKHZvaWQgKmJ1ZmZlciwgdm9pZCAqdXNlcl9kYXRhKQoreworICBidWZmZXJfdmVyaWZ5X2RhdGFfcyAqdmRhdGE7CisKKyAgaWYgKCF1c2VyX2RhdGEpIHsKKyAgICByZXR1cm47CisgIH0KKworICB2ZGF0YSA9IChidWZmZXJfdmVyaWZ5X2RhdGFfcyAqKSB1c2VyX2RhdGE7CisKKyAgR1NUX0RFQlVHICgiZGlzY2FyZDogJWQiLCB2ZGF0YS0+ZGlzY2FyZCk7CisgIGlmICh2ZGF0YS0+ZGlzY2FyZCkgeworICAgIGJ1ZmZlcl9jb3VudGVyKys7CisgICAgaWYgKGJ1ZmZlcl9jb3VudGVyID09IHZkYXRhLT5kaXNjYXJkKSB7CisgICAgICBidWZmZXJfY291bnRlciA9IDA7CisgICAgICB2ZGF0YS0+ZGlzY2FyZCA9IDA7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2dldF9zaXplIChidWZmZXIpID09IHZkYXRhLT5kYXRhX3RvX3ZlcmlmeV9zaXplKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChidWZmZXIsIDAsIHZkYXRhLT5kYXRhX3RvX3ZlcmlmeSwKKyAgICAgICAgICB2ZGF0YS0+ZGF0YV90b192ZXJpZnlfc2l6ZSkgPT0gMCk7CisKKyAgaWYgKHZkYXRhLT5idWZmZXJzX2JlZm9yZV9vZmZzZXRfc2tpcCkgeworICAgIC8qIFRoaXMgaXMgZm9yIHNraXBwaW5nIHRoZSBnYXJiYWdlIGluIHNvbWUgdGVzdCBjYXNlcyAqLworICAgIGlmIChidWZmZXJfY291bnRlciA9PSB2ZGF0YS0+YnVmZmVyc19iZWZvcmVfb2Zmc2V0X3NraXApIHsKKyAgICAgIG9mZnNldF9jb3VudGVyICs9IHZkYXRhLT5vZmZzZXRfc2tpcF9hbW91bnQ7CisgICAgfQorICB9CisgIGlmICghdmRhdGEtPm5vX21ldGFkYXRhKSB7CisgICAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpID09IHRzX2NvdW50ZXIpOworICAgIGZhaWxfdW5sZXNzIChHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpICE9IDApOworICAgIGZhaWxfdW5sZXNzIChHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSA9PSBvZmZzZXRfY291bnRlcik7CisgIH0KKworICB0c19jb3VudGVyICs9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcik7CisgIG9mZnNldF9jb3VudGVyICs9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZmZlcik7CisgIGJ1ZmZlcl9jb3VudGVyKys7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX2VsZW1lbnQgKGNvbnN0IGdjaGFyICogZmFjdG9yeSwgR3N0U3RhdGljUGFkVGVtcGxhdGUgKiBzaW5rX3RlbXBsYXRlLAorICAgIEdzdENhcHMgKiBzaW5rX2NhcHMsIEdzdFN0YXRpY1BhZFRlbXBsYXRlICogc3JjX3RlbXBsYXRlLAorICAgIEdzdENhcHMgKiBzcmNfY2FwcykKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudDsKKyAgR3N0QnVzICpidXM7CisgIGdjaGFyICpjYXBzX3N0ciA9IE5VTEw7CisKKyAgZWxlbWVudCA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50IChmYWN0b3J5KTsKKyAgc3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKGVsZW1lbnQsIHNyY190ZW1wbGF0ZSk7CisgIGlmIChzaW5rX2NhcHMpIHsKKyAgICBjYXBzX3N0ciA9IGdzdF9jYXBzX3RvX3N0cmluZyAoc2lua19jYXBzKTsKKyAgICBzaW5rX3RlbXBsYXRlLT5zdGF0aWNfY2Fwcy5zdHJpbmcgPSBjYXBzX3N0cjsKKyAgfQorICBzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChlbGVtZW50LCBzaW5rX3RlbXBsYXRlKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzcmNwYWQsIFRSVUUpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChzcmNwYWQsIGVsZW1lbnQsIHNyY19jYXBzLCBHU1RfRk9STUFUX0JZVEVTKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzaW5rcGFkLCBUUlVFKTsKKworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAoZWxlbWVudCwgYnVzKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgdHNfY291bnRlciA9IG9mZnNldF9jb3VudGVyID0gYnVmZmVyX2NvdW50ZXIgPSAwOworICBidWZmZXJzID0gTlVMTDsKKyAgZ19mcmVlIChjYXBzX3N0cik7CisgIHJldHVybiBlbGVtZW50OworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF9lbGVtZW50IChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgR3N0QnVzICpidXM7CisKKyAgLyogRnJlZSBwYXJzZWQgYnVmZmVycyAqLworICBnc3RfY2hlY2tfZHJvcF9idWZmZXJzICgpOworCisgIGJ1cyA9IEdTVF9FTEVNRU5UX0JVUyAoZWxlbWVudCk7CisgIGdzdF9idXNfc2V0X2ZsdXNoaW5nIChidXMsIFRSVUUpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc3JjcGFkLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAoZWxlbWVudCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoZWxlbWVudCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChlbGVtZW50KTsKK30KKworLyogaW5pdHMgYSBzdGFuZGFyZCB0ZXN0ICovCit2b2lkCitnc3RfcGFyc2VyX3Rlc3RfaW5pdCAoR3N0UGFyc2VyVGVzdCAqIHB0ZXN0LCBndWludDggKiBkYXRhLCBndWludCBzaXplLAorICAgIGd1aW50IG51bSkKK3sKKyAgLyogbmVlZCB0aGVzZSAqLworICBmYWlsX3VubGVzcyAoY3R4X2ZhY3RvcnkgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChjdHhfc3JjX3RlbXBsYXRlICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoY3R4X3NpbmtfdGVtcGxhdGUgIT0gTlVMTCk7CisKKyAgLyogYmFzaWNzICovCisgIG1lbXNldCAocHRlc3QsIDAsIHNpemVvZiAoKnB0ZXN0KSk7CisgIHB0ZXN0LT5mYWN0b3J5ID0gY3R4X2ZhY3Rvcnk7CisgIHB0ZXN0LT5zaW5rX3RlbXBsYXRlID0gY3R4X3NpbmtfdGVtcGxhdGU7CisgIHB0ZXN0LT5zcmNfdGVtcGxhdGUgPSBjdHhfc3JjX3RlbXBsYXRlOworICBwdGVzdC0+ZnJhbWVkID0gVFJVRTsKKyAgLyogY291bGQgYmUgTlVMTCBpZiBub3QgcmVsZXZhbnQvbmVlZGVkICovCisgIHB0ZXN0LT5zcmNfY2FwcyA9IGN0eF9pbnB1dF9jYXBzOworICBwdGVzdC0+c2lua19jYXBzID0gY3R4X291dHB1dF9jYXBzOworICBtZW1jcHkgKHB0ZXN0LT5oZWFkZXJzLCBjdHhfaGVhZGVycywgc2l6ZW9mIChwdGVzdC0+aGVhZGVycykpOworICBwdGVzdC0+ZGlzY2FyZCA9IGN0eF9kaXNjYXJkOworICAvKiBzb21lIGRhdGEgdGhhdCBwbGVhc2VzIGNhbGxlciAqLworICBwdGVzdC0+c2VyaWVzWzBdLmRhdGEgPSBkYXRhOworICBwdGVzdC0+c2VyaWVzWzBdLnNpemUgPSBzaXplOworICBwdGVzdC0+c2VyaWVzWzBdLm51bSA9IG51bTsKKyAgcHRlc3QtPnNlcmllc1swXS5mcGIgPSAxOworICBwdGVzdC0+c2VyaWVzWzFdLmZwYiA9IDE7CisgIHB0ZXN0LT5zZXJpZXNbMl0uZnBiID0gMTsKKyAgcHRlc3QtPm5vX21ldGFkYXRhID0gY3R4X25vX21ldGFkYXRhOworfQorCisvKgorICogVGVzdCBpZiB0aGUgcGFyc2VyIHB1c2hlcyBjbGVhbiBkYXRhIHByb3Blcmx5LgorICovCit2b2lkCitnc3RfcGFyc2VyX3Rlc3RfcnVuIChHc3RQYXJzZXJUZXN0ICogdGVzdCwgR3N0Q2FwcyAqKiBvdXRfY2FwcykKK3sKKyAgYnVmZmVyX3ZlcmlmeV9kYXRhX3MgdmRhdGEgPSB7IDAsIDAsIDAsIE5VTEwsIDAsIE5VTEwsIEZBTFNFIH07CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisgIEdzdEJ1ZmZlciAqYnVmZmVyID0gTlVMTDsKKyAgR3N0Q2FwcyAqc3JjX2NhcHM7CisgIGd1aW50IGksIGosIGs7CisgIGd1aW50IGZyYW1lcyA9IDAsIHNpemUgPSAwOworCisgIGVsZW1lbnQgPSBzZXR1cF9lbGVtZW50ICh0ZXN0LT5mYWN0b3J5LCB0ZXN0LT5zaW5rX3RlbXBsYXRlLCBOVUxMLAorICAgICAgdGVzdC0+c3JjX3RlbXBsYXRlLCB0ZXN0LT5zcmNfY2Fwcyk7CisKKyAgLyogcHVzaCBzb21lIHNldHVwIGhlYWRlcnMgKi8KKyAgZm9yIChqID0gMDsgaiA8IEdfTl9FTEVNRU5UUyAodGVzdC0+aGVhZGVycykgJiYgdGVzdC0+aGVhZGVyc1tqXS5kYXRhOyBqKyspIHsKKyAgICBidWZmZXIgPSBidWZmZXJfbmV3ICh0ZXN0LT5oZWFkZXJzW2pdLmRhdGEsIHRlc3QtPmhlYWRlcnNbal0uc2l6ZSk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3BhZF9wdXNoIChzcmNwYWQsIGJ1ZmZlciksIEdTVF9GTE9XX09LKTsKKyAgfQorCisgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGVzdC0+c2VyaWVzW2pdLm51bTsgaSsrKSB7CisgICAgICAvKiBzYW5pdHkgZW5mb3JjaW5nICovCisgICAgICBmb3IgKGsgPSAwOyBrIDwgTUFYICgxLCB0ZXN0LT5zZXJpZXNbal0uZnBiKTsgaysrKSB7CisgICAgICAgIGlmICghaykKKyAgICAgICAgICBidWZmZXIgPSBidWZmZXJfbmV3ICh0ZXN0LT5zZXJpZXNbal0uZGF0YSwgdGVzdC0+c2VyaWVzW2pdLnNpemUpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBidWZmZXIgPSBnc3RfYnVmZmVyX2FwcGVuZCAoYnVmZmVyLAorICAgICAgICAgICAgICBidWZmZXJfbmV3ICh0ZXN0LT5zZXJpZXNbal0uZGF0YSwgdGVzdC0+c2VyaWVzW2pdLnNpemUpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3BhZF9wdXNoIChzcmNwYWQsIGJ1ZmZlciksIEdTVF9GTE9XX09LKTsKKyAgICAgIGlmIChqID09IDApCisgICAgICAgIHZkYXRhLmJ1ZmZlcnNfYmVmb3JlX29mZnNldF9za2lwKys7CisgICAgICBlbHNlIGlmIChqID09IDEpCisgICAgICAgIHZkYXRhLm9mZnNldF9za2lwX2Ftb3VudCArPSB0ZXN0LT5zZXJpZXNbal0uc2l6ZSAqIHRlc3QtPnNlcmllc1tqXS5mcGI7CisgICAgICBpZiAoaiAhPSAxKSB7CisgICAgICAgIGZyYW1lcyArPSB0ZXN0LT5zZXJpZXNbal0uZnBiOworICAgICAgICBzaXplICs9IHRlc3QtPnNlcmllc1tqXS5zaXplICogdGVzdC0+c2VyaWVzW2pdLmZwYjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKworICBpZiAoR19MSUtFTFkgKHRlc3QtPmZyYW1lZCkpCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgLSB0ZXN0LT5kaXNjYXJkLCBmcmFtZXMpOworCisgIC8qIGlmIGFsbCBmcmFtZXMgYXJlIGlkZW50aWNhbCwgZG8gZXh0ZW5kZWQgdGVzdCwKKyAgICogb3RoZXJ3aXNlIG9ubHkgdmVyaWZ5IHRvdGFsIGRhdGEgc2l6ZSAqLworICBpZiAodGVzdC0+c2VyaWVzWzBdLmRhdGEgJiYgKCF0ZXN0LT5zZXJpZXNbMl0uc2l6ZSB8fAorICAgICAgICAgICh0ZXN0LT5zZXJpZXNbMF0uc2l6ZSA9PSB0ZXN0LT5zZXJpZXNbMl0uc2l6ZSAmJiB0ZXN0LT5zZXJpZXNbMl0uZGF0YQorICAgICAgICAgICAgICAmJiAhbWVtY21wICh0ZXN0LT5zZXJpZXNbMF0uZGF0YSwgdGVzdC0+c2VyaWVzWzJdLmRhdGEsCisgICAgICAgICAgICAgICAgICB0ZXN0LT5zZXJpZXNbMF0uc2l6ZSkpKSkgeworICAgIHZkYXRhLmRhdGFfdG9fdmVyaWZ5ID0gdGVzdC0+c2VyaWVzWzBdLmRhdGE7CisgICAgdmRhdGEuZGF0YV90b192ZXJpZnlfc2l6ZSA9IHRlc3QtPnNlcmllc1swXS5zaXplOworICAgIHZkYXRhLmNhcHMgPSB0ZXN0LT5zaW5rX2NhcHM7CisgICAgdmRhdGEuZGlzY2FyZCA9IHRlc3QtPmRpc2NhcmQ7CisgICAgdmRhdGEubm9fbWV0YWRhdGEgPSB0ZXN0LT5ub19tZXRhZGF0YTsKKyAgICBnX2xpc3RfZm9yZWFjaCAoYnVmZmVycywgYnVmZmVyX3ZlcmlmeV9kYXRhLCAmdmRhdGEpOworICB9IGVsc2UgeworICAgIGd1aW50IGRhdGFzdW0gPSAwOworCisgICAgZ19saXN0X2ZvcmVhY2ggKGJ1ZmZlcnMsIGJ1ZmZlcl9jb3VudF9zaXplLCAmZGF0YXN1bSk7CisgICAgc2l6ZSAtPSB0ZXN0LT5kcm9wcGVkOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFzdW0sIHNpemUpOworICB9CisKKyAgc3JjX2NhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHNpbmtwYWQpOworICBHU1RfTE9HICgib3V0cHV0IGNhcHM6ICUiIEdTVF9QVFJfRk9STUFULCBzcmNfY2Fwcyk7CisKKyAgaWYgKHRlc3QtPnNpbmtfY2FwcykgeworICAgIEdTVF9MT0cgKCIlIiBHU1RfUFRSX0ZPUk1BVCAiID0gJSIgR1NUX1BUUl9GT1JNQVQgIiA/Iiwgc3JjX2NhcHMsCisgICAgICAgIHRlc3QtPnNpbmtfY2Fwcyk7CisgICAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2lzX2VxdWFsIChzcmNfY2FwcywgdGVzdC0+c2lua19jYXBzKSk7CisgIH0KKworICBpZiAob3V0X2NhcHMpCisgICAgKm91dF9jYXBzID0gc3JjX2NhcHM7CisgIGVsc2UKKyAgICBnc3RfY2Fwc191bnJlZiAoc3JjX2NhcHMpOworCisgIGNsZWFudXBfZWxlbWVudCAoZWxlbWVudCk7Cit9CisKKy8qCisgKiBUZXN0IGlmIHRoZSBwYXJzZXIgcHVzaGVzIGNsZWFuIGRhdGEgcHJvcGVybHkuCisgKi8KK3ZvaWQKK2dzdF9wYXJzZXJfdGVzdF9ub3JtYWwgKGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUpCit7CisgIEdzdFBhcnNlclRlc3QgcHRlc3Q7CisKKyAgZ3N0X3BhcnNlcl90ZXN0X2luaXQgKCZwdGVzdCwgZGF0YSwgc2l6ZSwgMTApOworICBnc3RfcGFyc2VyX3Rlc3RfcnVuICgmcHRlc3QsIE5VTEwpOworfQorCisvKgorICogVGVzdCBpZiBwYXJzZXIgZHJhaW5zIGl0cyBidWZmZXJzIHByb3Blcmx5LiBFdmVuIG9uZSBzaW5nbGUgZnJhbWUKKyAqIHNob3VsZCBiZSBkcmFpbmVkIGFuZCBwdXNoZWQgZm9yd2FyZCB3aGVuIEVPUyBvY2N1cnMuIFRoaXMgc2luZ2xlIGZyYW1lCisgKiBjYXNlIGlzIHNwZWNpYWwsIHNpbmNlIG5vcm1hbGx5IHRoZSBwYXJzZXIgbmVlZHMgbW9yZSBkYXRhIHRvIGJlIHN1cmUKKyAqIGFib3V0IHN0cmVhbSBmb3JtYXQuIEJ1dCBpdCBzaG91bGQgc3RpbGwgcHVzaCB0aGUgZnJhbWUgZm9yd2FyZCBpbiBFT1MuCisgKi8KK3ZvaWQKK2dzdF9wYXJzZXJfdGVzdF9kcmFpbl9zaW5nbGUgKGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUpCit7CisgIEdzdFBhcnNlclRlc3QgcHRlc3Q7CisKKyAgZ3N0X3BhcnNlcl90ZXN0X2luaXQgKCZwdGVzdCwgZGF0YSwgc2l6ZSwgMSk7CisgIGdzdF9wYXJzZXJfdGVzdF9ydW4gKCZwdGVzdCwgTlVMTCk7Cit9CisKKy8qCisgKiBNYWtlIHN1cmUgdGhhdCBwYXJzZXIgZG9lcyBub3QgZHJhaW4gZ2FyYmFnZSB3aGVuIEVPUyBvY2N1cnMuCisgKi8KK3ZvaWQKK2dzdF9wYXJzZXJfdGVzdF9kcmFpbl9nYXJiYWdlIChndWludDggKiBkYXRhLCBndWludCBzaXplLCBndWludDggKiBnYXJiYWdlLAorICAgIGd1aW50IGdzaXplKQoreworICBHc3RQYXJzZXJUZXN0IHB0ZXN0OworCisgIC8qIHByb3ZpZGUgZW5vdWdoIGluaXRpYWwgZnJhbWVzIHNpbmNlIGl0IG1heSB0YWtlIHNvbWUgcGFyc2VycyBzb21lCisgICAqIHRpbWUgdG8gYmUgY29udmluY2VkIG9mIHByb3BlciBzeW5jICovCisgIGdzdF9wYXJzZXJfdGVzdF9pbml0ICgmcHRlc3QsIGRhdGEsIHNpemUsIDEwKTsKKyAgcHRlc3Quc2VyaWVzWzFdLmRhdGEgPSBnYXJiYWdlOworICBwdGVzdC5zZXJpZXNbMV0uc2l6ZSA9IGdzaXplOworICBwdGVzdC5zZXJpZXNbMV0ubnVtID0gMTsKKyAgZ3N0X3BhcnNlcl90ZXN0X3J1biAoJnB0ZXN0LCBOVUxMKTsKK30KKworLyoKKyAqIFRlc3QgaWYgcGFyc2VyIHNwbGl0cyBhIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHR3byBmcmFtZXMgaW50byB0d28KKyAqIHNlcGFyYXRlIGJ1ZmZlcnMgcHJvcGVybHkuCisgKi8KK3ZvaWQKK2dzdF9wYXJzZXJfdGVzdF9zcGxpdCAoZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSkKK3sKKyAgR3N0UGFyc2VyVGVzdCBwdGVzdDsKKworICBnc3RfcGFyc2VyX3Rlc3RfaW5pdCAoJnB0ZXN0LCBkYXRhLCBzaXplLCAxMCk7CisgIHB0ZXN0LnNlcmllc1swXS5mcGIgPSAyOworICBnc3RfcGFyc2VyX3Rlc3RfcnVuICgmcHRlc3QsIE5VTEwpOworfQorCisvKgorICogVGVzdCBpZiB0aGUgcGFyc2VyIHNraXBzIGdhcmJhZ2UgYmV0d2VlbiBmcmFtZXMgcHJvcGVybHkuCisgKi8KK3ZvaWQKK2dzdF9wYXJzZXJfdGVzdF9za2lwX2dhcmJhZ2UgKGd1aW50OCAqIGRhdGEsIGd1aW50IHNpemUsIGd1aW50OCAqIGdhcmJhZ2UsCisgICAgZ3VpbnQgZ3NpemUpCit7CisgIEdzdFBhcnNlclRlc3QgcHRlc3Q7CisKKyAgZ3N0X3BhcnNlcl90ZXN0X2luaXQgKCZwdGVzdCwgZGF0YSwgc2l6ZSwgMTApOworICBwdGVzdC5zZXJpZXNbMV0uZGF0YSA9IGdhcmJhZ2U7CisgIHB0ZXN0LnNlcmllc1sxXS5zaXplID0gZ3NpemU7CisgIHB0ZXN0LnNlcmllc1sxXS5udW0gPSAxOworICBwdGVzdC5zZXJpZXNbMl0uZGF0YSA9IGRhdGE7CisgIHB0ZXN0LnNlcmllc1syXS5zaXplID0gc2l6ZTsKKyAgcHRlc3Quc2VyaWVzWzJdLm51bSA9IDEwOworICBnc3RfcGFyc2VyX3Rlc3RfcnVuICgmcHRlc3QsIE5VTEwpOworfQorCisvKgorICogVGVzdCBpZiB0aGUgc3JjIGNhcHMgYXJlIHNldCBhY2NvcmRpbmcgdG8gc3RyZWFtIGZvcm1hdC4KKyAqLwordm9pZAorZ3N0X3BhcnNlcl90ZXN0X291dHB1dF9jYXBzIChndWludDggKiBkYXRhLCBndWludCBzaXplLAorICAgIGNvbnN0IGdjaGFyICogaW5wdXRfY2FwcywgY29uc3QgZ2NoYXIgKiBvdXRwdXRfY2FwcykKK3sKKyAgR3N0UGFyc2VyVGVzdCBwdGVzdDsKKworICBnc3RfcGFyc2VyX3Rlc3RfaW5pdCAoJnB0ZXN0LCBkYXRhLCBzaXplLCAxMCk7CisgIGlmIChpbnB1dF9jYXBzKSB7CisgICAgcHRlc3Quc3JjX2NhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoaW5wdXRfY2Fwcyk7CisgICAgZmFpbF91bmxlc3MgKHB0ZXN0LnNyY19jYXBzICE9IE5VTEwpOworICB9CisgIGlmIChvdXRwdXRfY2FwcykgeworICAgIHB0ZXN0LnNpbmtfY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChvdXRwdXRfY2Fwcyk7CisgICAgZmFpbF91bmxlc3MgKHB0ZXN0LnNpbmtfY2FwcyAhPSBOVUxMKTsKKyAgfQorICBnc3RfcGFyc2VyX3Rlc3RfcnVuICgmcHRlc3QsIE5VTEwpOworICBpZiAocHRlc3Quc2lua19jYXBzKQorICAgIGdzdF9jYXBzX3VucmVmIChwdGVzdC5zaW5rX2NhcHMpOworICBpZiAocHRlc3Quc3JjX2NhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKHB0ZXN0LnNyY19jYXBzKTsKK30KKworLyoKKyAqIFRlc3QgaWYgdGhlIHNyYyBjYXBzIGFyZSBzZXQgYWNjb3JkaW5nIHRvIHN0cmVhbSBmb3JtYXQuCisgKi8KK0dzdENhcHMgKgorZ3N0X3BhcnNlcl90ZXN0X2dldF9vdXRwdXRfY2FwcyAoZ3VpbnQ4ICogZGF0YSwgZ3VpbnQgc2l6ZSwKKyAgICBjb25zdCBnY2hhciAqIGlucHV0X2NhcHMpCit7CisgIEdzdFBhcnNlclRlc3QgcHRlc3Q7CisgIEdzdENhcHMgKm91dF9jYXBzOworCisgIGdzdF9wYXJzZXJfdGVzdF9pbml0ICgmcHRlc3QsIGRhdGEsIHNpemUsIDEwKTsKKyAgaWYgKGlucHV0X2NhcHMpIHsKKyAgICBwdGVzdC5zcmNfY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChpbnB1dF9jYXBzKTsKKyAgICBmYWlsX3VubGVzcyAocHRlc3Quc3JjX2NhcHMgIT0gTlVMTCk7CisgIH0KKyAgZ3N0X3BhcnNlcl90ZXN0X3J1biAoJnB0ZXN0LCAmb3V0X2NhcHMpOworICBpZiAocHRlc3Quc3JjX2NhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKHB0ZXN0LnNyY19jYXBzKTsKKworICByZXR1cm4gb3V0X2NhcHM7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9wYXJzZXIuaCBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ODY3Y2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9wYXJzZXIuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciAoYXVkaW8pIHBhcnNlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0OiBTdGVmYW4gS29zdCA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworI2RlZmluZSBNQVhfSEVBREVSUyAxMAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZ3VpbnQ4ICAgICAqZGF0YTsKKyAgICBndWludCAgICAgICBzaXplOworfSBkYXRhYmxvYjsKKworLyogY29udGV4dCBzdGF0ZSB2YXJpYWJsZXM7IHRvIGJlIHNldCBieSB0ZXN0IHVzaW5nIHRoaXMgaGVscGVyICovCisvKiBtYW5kYXRvcnkgKi8KK2V4dGVybiBjb25zdCBnY2hhciAqY3R4X2ZhY3Rvcnk7CitleHRlcm4gR3N0U3RhdGljUGFkVGVtcGxhdGUgKmN0eF9zaW5rX3RlbXBsYXRlOworZXh0ZXJuIEdzdFN0YXRpY1BhZFRlbXBsYXRlICpjdHhfc3JjX3RlbXBsYXRlOworLyogb3B0aW9uYWwgKi8KK2V4dGVybiBHc3RDYXBzICpjdHhfaW5wdXRfY2FwczsKK2V4dGVybiBHc3RDYXBzICpjdHhfb3V0cHV0X2NhcHM7CitleHRlcm4gZ3VpbnQgY3R4X2Rpc2NhcmQ7CitleHRlcm4gZGF0YWJsb2IgY3R4X2hlYWRlcnNbTUFYX0hFQURFUlNdOworZXh0ZXJuIGdib29sZWFuIGN0eF9ub19tZXRhZGF0YTsKKworLyogbm8gcmVmcyB0YWtlbi9rZXB0LCBhbGwgdXAgdG8gY2FsbGVyICovCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBnY2hhciAgICAgICAgICAqZmFjdG9yeTsKKyAgR3N0U3RhdGljUGFkVGVtcGxhdGUgKnNpbmtfdGVtcGxhdGU7CisgIEdzdFN0YXRpY1BhZFRlbXBsYXRlICpzcmNfdGVtcGxhdGU7CisgIC8qIGNhcHMgdGhhdCBnbyBpbnRvIGVsZW1lbnQgKi8KKyAgR3N0Q2FwcyAgICAgICAgICAgICAgKnNyY19jYXBzOworICAvKiBvcHRpb25hbDogb3V0cHV0IGNhcHMgdG8gdmVyaWZ5ICovCisgIEdzdENhcHMgICAgICAgICAgICAgICpzaW5rX2NhcHM7CisgIC8qIGluaXRpYWwgaGVhZGVycyAqLworICBkYXRhYmxvYiAgICAgICAgICAgICAgaGVhZGVyc1tNQVhfSEVBREVSU107CisgIC8qIGluaXRpYWwgKGhlYWRlcikgb3V0cHV0IHRvIGZvcmVnbyBjaGVja2luZyAqLworICBndWludCAgICAgICAgICAgICAgICAgZGlzY2FyZDsKKyAgLyogc2VyaWVzIG9mIGJ1ZmZlcnM7IG1pZGRsZSBzZXJpZXMgY29uc2lkZXJlZCBnYXJiYWdlICovCisgIHN0cnVjdCB7CisgICAgLyogZGF0YSBhbmQgc2l6ZSAqLworICAgIGd1aW50OCAgICAgKmRhdGE7CisgICAgZ3VpbnQgICAgICBzaXplOworICAgIC8qIG51bSBvZiBmcmFtZXMgd2l0aCBhYm92ZSBkYXRhIHBlciBidWZmZXIgKi8KKyAgICBndWludCAgICAgIGZwYjsKKyAgICAvKiBudW0gb2YgYnVmZmVycyAqLworICAgIGd1aW50ICAgICAgbnVtOworICB9IHNlcmllc1szXTsKKyAgLyogc2lnaCwgd2VpcmQgY2FzZXMgKi8KKyAgZ2Jvb2xlYW4gICAgICAgICAgICAgIGZyYW1lZDsKKyAgZ3VpbnQgICAgICAgICAgICAgICAgIGRyb3BwZWQ7CisgIGdib29sZWFuICAgICAgICAgICAgICBub19tZXRhZGF0YTsKK30gR3N0UGFyc2VyVGVzdDsKKwordm9pZCBnc3RfcGFyc2VyX3Rlc3RfaW5pdCAoR3N0UGFyc2VyVGVzdCAqIHB0ZXN0LCBndWludDggKiBkYXRhLCBndWludCBzaXplLCBndWludCBudW0pOworCit2b2lkIGdzdF9wYXJzZXJfdGVzdF9ydW4gKEdzdFBhcnNlclRlc3QgKiB0ZXN0LCBHc3RDYXBzICoqIG91dF9jYXBzKTsKKwordm9pZCBnc3RfcGFyc2VyX3Rlc3Rfbm9ybWFsIChndWludDggKmRhdGEsIGd1aW50IHNpemUpOworCit2b2lkIGdzdF9wYXJzZXJfdGVzdF9kcmFpbl9zaW5nbGUgKGd1aW50OCAqZGF0YSwgZ3VpbnQgc2l6ZSk7CisKK3ZvaWQgZ3N0X3BhcnNlcl90ZXN0X2RyYWluX2dhcmJhZ2UgKGd1aW50OCAqZGF0YSwgZ3VpbnQgc2l6ZSwgZ3VpbnQ4ICpnYXJiYWdlLCBndWludCBnc2l6ZSk7CisKK3ZvaWQgZ3N0X3BhcnNlcl90ZXN0X3NwbGl0IChndWludDggKmRhdGEsIGd1aW50IHNpemUpOworCit2b2lkIGdzdF9wYXJzZXJfdGVzdF9za2lwX2dhcmJhZ2UgKGd1aW50OCAqZGF0YSwgZ3VpbnQgc2l6ZSwgZ3VpbnQ4ICpnYXJiYWdlLCBndWludCBnc2l6ZSk7CisKK3ZvaWQgZ3N0X3BhcnNlcl90ZXN0X291dHB1dF9jYXBzIChndWludDggKmRhdGEsIGd1aW50IHNpemUsIGNvbnN0IGdjaGFyICogaW5wdXRfY2FwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqIG91dHB1dF9jYXBzKTsKKworR3N0Q2FwcyAqZ3N0X3BhcnNlcl90ZXN0X2dldF9vdXRwdXRfY2FwcyAoZ3VpbnQ4ICpkYXRhLCBndWludCBzaXplLCBjb25zdCBnY2hhciAqIGlucHV0X2NhcHMpOworCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9xdGRlbXV4LmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9xdGRlbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiNjY5MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3F0ZGVtdXguYwpAQCAtMCwwICsxLDE1NCBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBxdGRlbXV4CisgKgorICogQ29weXJpZ2h0IChDKSA8MjAxNj4gRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAicXRkZW11eC5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RQYWQgKnNyY3BhZDsKKyAgZ3VpbnQgZXhwZWN0ZWRfc2l6ZTsKKyAgR3N0Q2xvY2tUaW1lIGV4cGVjdGVkX3RpbWU7Cit9IENvbW1vblRlc3REYXRhOworCitzdGF0aWMgR3N0UGFkUHJvYmVSZXR1cm4KK3F0ZGVtdXhfcHJvYmUgKEdzdFBhZCAqIHBhZCwgR3N0UGFkUHJvYmVJbmZvICogaW5mbywgQ29tbW9uVGVzdERhdGEgKiBkYXRhKQoreworICBHc3RCdWZmZXIgKmJ1ZiA9IEdTVF9QQURfUFJPQkVfSU5GT19CVUZGRVIgKGluZm8pOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZiksIGRhdGEtPmV4cGVjdGVkX3NpemUpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX1BUUyAoYnVmKSwgZGF0YS0+ZXhwZWN0ZWRfdGltZSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIHJldHVybiBHU1RfUEFEX1BST0JFX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkCitxdGRlbXV4X3BhZF9hZGRlZF9jYiAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIHBhZCwgQ29tbW9uVGVzdERhdGEgKiBkYXRhKQoreworICBkYXRhLT5zcmNwYWQgPSBwYWQ7CisgIGdzdF9wYWRfYWRkX3Byb2JlIChwYWQsIEdTVF9QQURfUFJPQkVfVFlQRV9CVUZGRVIsCisgICAgICAoR3N0UGFkUHJvYmVDYWxsYmFjaykgcXRkZW11eF9wcm9iZSwgZGF0YSwgTlVMTCk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3F0ZGVtdXhfaW5wdXRfZ2FwKQoreworICBHc3RFbGVtZW50ICpxdGRlbXV4OworICBHc3RQYWQgKnNpbmtwYWQ7CisgIENvbW1vblRlc3REYXRhIGRhdGEgPSB7IDAsIH07CisgIEdzdEJ1ZmZlciAqaW5idWY7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKyAgR3N0RXZlbnQgKmV2ZW50OworICBndWludCBpLCBvZmZzZXQ7CisgIEdzdENsb2NrVGltZSBwdHM7CisKKyAgLyogVGhlIGdvYWwgb2YgdGhpcyB0ZXN0IGlzIHRvIGNoZWNrIHRoYXQgcXRkZW11eCBjYW4gcHJvcGVybHkgaGFuZGxlCisgICAqIGZyYWdtZW50ZWQgaW5wdXQgZnJvbSBkYXNoZGVtdXgsIHdpdGggZ2FwcyBpbiBpdC4KKyAgICoKKyAgICogSW5wdXQgc2VnbWVudCA6CisgICAqICAgLSBUSU1FCisgICAqIElucHV0IGJ1ZmZlcnMgOgorICAgKiAgIC0gVGhlIG9mZnNldCBpcyBzZXQgb24gYnVmZmVycywgaXQgY29ycmVzcG9uZHMgdG8gdGhlIG9mZnNldAorICAgKiAgICAgd2l0aGluIHRoZSBjdXJyZW50IGZyYWdtZW50LgorICAgKiAgIC0gQnVmZmVyIG9mIHRoZSBiZWdpbm5pbmcgb2YgYSBmcmFnbWVudCBoYXMgdGhlIFBUUyBzZXQsIG90aGVycworICAgKiAgICAgZG9uJ3QuCisgICAqICAgLSBCeSBleHRlbnNpb24sIHRoZSBiZWdpbm5pbmcgb2YgYSBmcmFnbWVudCBhbHNvIGhhcyBhbiBvZmZzZXQKKyAgICogICAgIG9mIDAuCisgICAqLworCisgIHF0ZGVtdXggPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJxdGRlbXV4IiwgTlVMTCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocXRkZW11eCwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHF0ZGVtdXgsICJzaW5rIik7CisKKyAgLyogV2UnbGwgd2FudCB0byBrbm93IHdoZW4gdGhlIHNvdXJjZSBwYWQgaXMgYWRkZWQgKi8KKyAgZ19zaWduYWxfY29ubmVjdCAocXRkZW11eCwgInBhZC1hZGRlZCIsIChHQ2FsbGJhY2spIHF0ZGVtdXhfcGFkX2FkZGVkX2NiLAorICAgICAgJmRhdGEpOworCisgIC8qIFNlbmQgdGhlIGluaXRpYWwgU1RSRUFNX1NUQVJUIGFuZCBzZWdtZW50IChUSU1FKSBldmVudCAqLworICBldmVudCA9IGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgiVEVTVCIpOworICBHU1RfREVCVUcgKCJQdXNoaW5nIHN0cmVhbS1zdGFydCBldmVudCIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9zZW5kX2V2ZW50IChzaW5rcGFkLCBldmVudCkgPT0gVFJVRSk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpOworICBHU1RfREVCVUcgKCJQdXNoaW5nIHNlZ21lbnQgZXZlbnQiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfc2VuZF9ldmVudCAoc2lua3BhZCwgZXZlbnQpID09IFRSVUUpOworCisgIC8qIEZlZWQgdGhlIGluaXQgYnVmZmVyLCBzaG91bGQgY3JlYXRlIHRoZSBzb3VyY2UgcGFkICovCisgIGluYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChpbml0X21wNF9sZW4pOworICBnc3RfYnVmZmVyX2ZpbGwgKGluYnVmLCAwLCBpbml0X21wNCwgaW5pdF9tcDRfbGVuKTsKKyAgR1NUX0JVRkZFUl9QVFMgKGluYnVmKSA9IDA7CisgIEdTVF9CVUZGRVJfT0ZGU0VUIChpbmJ1ZikgPSAwOworICBHU1RfREVCVUcgKCJQdXNoaW5nIGhlYWRlciBidWZmZXIiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfY2hhaW4gKHNpbmtwYWQsIGluYnVmKSA9PSBHU1RfRkxPV19PSyk7CisKKyAgLyogTm93IHNlbmQgdGhlIHRydW4gb2YgdGhlIGZpcnN0IGZyYWdtZW50ICovCisgIGluYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzZWdfMV9tb29mX3NpemUpOworICBnc3RfYnVmZmVyX2ZpbGwgKGluYnVmLCAwLCBzZWdfMV9tNGYsIHNlZ18xX21vb2Zfc2l6ZSk7CisgIEdTVF9CVUZGRVJfUFRTIChpbmJ1ZikgPSAwOworICBHU1RfQlVGRkVSX09GRlNFVCAoaW5idWYpID0gMDsKKyAgLyogV2UgYXJlIHNpbXVsYXRpbmcgdGhhdCB0aGlzIGZyYWdtZW50IGNhbiBoYXBwZW4gYXQgYW55IHBvaW50ICovCisgIEdTVF9CVUZGRVJfRkxBR19TRVQgKGluYnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisgIEdTVF9ERUJVRyAoIlB1c2hpbmcgdHJ1biBidWZmZXIiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfY2hhaW4gKHNpbmtwYWQsIGluYnVmKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfaWYgKGRhdGEuc3JjcGFkID09IE5VTEwpOworCisgIC8qIFdlIGFyZSBub3cgcmVhZHkgdG8gc2VuZCBzb21lIGJ1ZmZlcnMgd2l0aCBnYXBzICovCisgIG9mZnNldCA9IHNlZ18xX3NhbXBsZV8wX29mZnNldDsKKyAgcHRzID0gMDsKKworICBHU1RfREVCVUcgKCJQdXNoaW5nIGdhcCdlZCBidWZmZXJzIik7CisgIGZvciAoaSA9IDA7IGkgPCAxMjk7IGkrKykgeworICAgIC8qIExldCdzIHNlbmQgb25lIGV2ZXJ5IDMgKi8KKyAgICBpZiAoKGkgJSAzKSA9PSAwKSB7CisgICAgICBHU1RfREVCVUcgKCJQdXNoaW5nIGJ1ZmZlciAjJWQgb2Zmc2V0OiUiIEdfR1VJTlQzMl9GT1JNQVQsIGksIG9mZnNldCk7CisgICAgICBpbmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2VnXzFfc2FtcGxlX3NpemVzW2ldKTsKKyAgICAgIGdzdF9idWZmZXJfZmlsbCAoaW5idWYsIDAsIHNlZ18xX200ZiArIG9mZnNldCwgc2VnXzFfc2FtcGxlX3NpemVzW2ldKTsKKyAgICAgIEdTVF9CVUZGRVJfT0ZGU0VUIChpbmJ1ZikgPSBvZmZzZXQ7CisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChpbmJ1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgICAgZGF0YS5leHBlY3RlZF90aW1lID0KKyAgICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKHB0cywgR1NUX1NFQ09ORCwgc2VnXzFfdGltZXNjYWxlKTsKKyAgICAgIGRhdGEuZXhwZWN0ZWRfc2l6ZSA9IHNlZ18xX3NhbXBsZV9zaXplc1tpXTsKKyAgICAgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2NoYWluIChzaW5rcGFkLCBpbmJ1ZikgPT0gR1NUX0ZMT1dfT0spOworICAgIH0KKyAgICAvKiBGaW5hbGx5IG1vdmUgb2Zmc2V0IGZvcndhcmQgKi8KKyAgICBvZmZzZXQgKz0gc2VnXzFfc2FtcGxlX3NpemVzW2ldOworICAgIHB0cyArPSBzZWdfMV9zYW1wbGVfZHVyYXRpb247CisgIH0KKworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChxdGRlbXV4LCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHF0ZGVtdXgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitxdGRlbXV4X3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInF0ZGVtdXgiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcXRkZW11eF9pbnB1dF9nYXApOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAocXRkZW11eCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3F0ZGVtdXguaCBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3F0ZGVtdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODQyNWYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcXRkZW11eC5oCkBAIC0wLDAgKzEsNDI1MSBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBxdGRlbXV4CisgKgorICogQ29weXJpZ2h0IChDKSA8MjAxNj4gRWR3YXJkIEhlcnZleSA8ZWR3YXJkQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdsaWIvZ3N0ZGlvLmg+CisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworLyogRnJhZ21lbnRzIHRha2VuIGZyb20gaHR0cDovL3d3dy5ib2submV0L2Rhc2gvdGVhcnNfb2Zfc3RlZWwvY2xlYXJ0ZXh0L3N0cmVhbS5tcGQKKyAqCisgKiBBdWRpbyBzdHJlYW0gKGFhYykKKyAqIEhlYWRlciArIGZpcnN0IGZyYWdtZW50CisgKi8KKworLyogaHR0cDovL3d3dy5ib2submV0L2Rhc2gvdGVhcnNfb2Zfc3RlZWwvY2xlYXJ0ZXh0L2F1ZGlvL2VuL2luaXQubXA0ICovCitzdGF0aWMgZ3VpbnQ4IGluaXRfbXA0W10gPSB7CisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4NjYsIDB4NzQsIDB4NzksIDB4NzAsIDB4NjksIDB4NzMsIDB4NmYsIDB4NmQsCisgIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NjksIDB4NzMsIDB4NmYsIDB4NmQsIDB4NjksIDB4NzMsIDB4NmYsIDB4MzIsCisgIDB4NjEsIDB4NzYsIDB4NjMsIDB4MzEsIDB4NmQsIDB4NzAsIDB4MzQsIDB4MzEsIDB4MDAsIDB4MDAsIDB4MDIsIDB4NTAsCisgIDB4NmQsIDB4NmYsIDB4NmYsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NmMsIDB4NmQsIDB4NzYsIDB4NjgsIDB4NjQsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDMsIDB4ZTgsIDB4MDAsIDB4MGIsIDB4MzMsIDB4ZDcsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsCisgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDEsIDB4YTQsIDB4NzQsIDB4NzIsIDB4NjEsIDB4NmIsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NWMsIDB4NzQsIDB4NmIsIDB4NjgsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGIsIDB4MzMsIDB4YmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NDAsCisgIDB4NmQsIDB4NjQsIDB4NjksIDB4NjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4NmQsIDB4NjQsIDB4NjgsIDB4NjQsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4YWMsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTUsIDB4YzcsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzUsIDB4NjgsIDB4NjQsIDB4NmMsIDB4NzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzMsIDB4NmYsIDB4NzUsIDB4NmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NjUsIDB4NmUsIDB4NzQsCisgIDB4NmYsIDB4MzQsIDB4MjAsIDB4NTMsIDB4NmYsIDB4NzUsIDB4NmUsIDB4NjQsIDB4MjAsIDB4NDgsIDB4NjEsIDB4NmUsCisgIDB4NjQsIDB4NmMsIDB4NjUsIDB4NzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZTMsIDB4NmQsIDB4NjksIDB4NmUsCisgIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4NzMsIDB4NmQsIDB4NjgsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjQsIDB4NjQsIDB4NjksIDB4NmUsCisgIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MWMsIDB4NjQsIDB4NzIsIDB4NjUsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4NzUsIDB4NzIsIDB4NmMsCisgIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTcsIDB4NzMsIDB4NzQsIDB4NjIsCisgIDB4NmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NWIsIDB4NzMsIDB4NzQsIDB4NzMsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NGIsIDB4NmQsIDB4NzAsIDB4MzQsCisgIDB4NjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4YWMsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjcsIDB4NjUsIDB4NzMsIDB4NjQsCisgIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MTEsCisgIDB4NDAsIDB4MTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4ZjQsIDB4MDEsIDB4MDAsIDB4MDEsIDB4ZjQsCisgIDB4MDEsIDB4MDUsIDB4MDIsIDB4MTIsIDB4MTAsIDB4MDYsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsCisgIDB4NzMsIDB4NzQsIDB4NzMsIDB4N2EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4NzMsIDB4NzQsIDB4NzMsIDB4NjMsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsCisgIDB4NzMsIDB4NzQsIDB4NzQsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4NzMsIDB4NzQsIDB4NjMsIDB4NmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzgsIDB4NmQsIDB4NzYsIDB4NjUsIDB4NzgsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4NmQsIDB4NjUsIDB4NjgsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MGIsIDB4MzMsIDB4ZDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4NzQsIDB4NzIsIDB4NjUsIDB4NzgsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK2d1aW50IGluaXRfbXA0X2xlbiA9IDYyNDsKKworLyogaHR0cDovL3d3dy5ib2submV0L2Rhc2gvdGVhcnNfb2Zfc3RlZWwvY2xlYXJ0ZXh0L2F1ZGlvL2VuL3NlZy0xLm00ZiAqLworc3RhdGljIGNvbnN0IGd1aW50OCBzZWdfMV9tNGZbXSA9IHsKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHg2MCwgMHg2ZCwgMHg2ZiwgMHg2ZiwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwKKyAgMHg2ZCwgMHg2NiwgMHg2OCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHg0OCwgMHg3NCwgMHg3MiwgMHg2MSwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwKKyAgMHg3NCwgMHg2NiwgMHg2OCwgMHg2NCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHg3NCwgMHg2NiwgMHg2NCwgMHg3NCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgxYywKKyAgMHg3NCwgMHg3MiwgMHg3NSwgMHg2ZSwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MSwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHg2OCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3MywKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3NCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHhkZCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgxMiwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhlOSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHhjZSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhiOSwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhhNSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHhhNCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg5YSwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg5MiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg4ZSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3ZCwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3ZCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg4MiwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3MSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg3MiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2YSwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1YSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2MywKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3OCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1NSwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg1ZSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2YSwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0ZCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg5ZiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg4MiwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2YywgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg1OCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg4MiwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg2ZCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg5NCwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1NiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2ZSwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg1ZSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg4NiwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1YywgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg2ZSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NywKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg2OCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1ZCwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg2ZCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg4OSwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2MSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg4MSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3ZCwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1YywgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg1OSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg5ZSwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3NCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg3MSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg5MSwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg4NywgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg0ZCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1MywKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhhNywgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg1NywgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhiZCwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhhOSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHhhNiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg5ZiwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg5NiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg4NSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg4YiwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3NywgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhiYSwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhiMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg4NywgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg4MSwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1MywgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHgxNSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgyNSwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgzYywgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg0NywgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgzNSwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg4NSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NywgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhhYiwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0NiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHhhNCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg5NywKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgzYywgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg2YSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhhMywKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1ZCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg4MywgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0NiwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg2ZiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1OCwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhhOSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg0OSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3YiwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg5MywgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHgzYSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg4ZCwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg4NSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3YywKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3NSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg1NiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1NywKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHhiNCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NywKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2ZSwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1ZSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHhhMywgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0YiwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhhYSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg5MSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3ZSwKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0NiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg5YiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2YywKKyAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1MiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMSwgMHg1OSwgMHgwMCwgMHgwMCwgMHhiZCwgMHgzMiwgMHg2ZCwgMHg2NCwgMHg2MSwgMHg3NCwKKyAgMHgyMSwgMHgxMSwgMHg0NSwgMHgwMCwgMHgxNCwgMHg1MCwgMHgwMSwgMHg0NiwgMHhmZiwgMHhmMSwgMHgwYSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1ZCwgMHhlOSwgMHg4MiwgMHgxNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiYywgMHgyMSwKKyAgMHgxYSwgMHg5MywgMHhhOSwgMHgwNCwgMHgzZSwgMHhhMywgMHg1OSwgMHg0MSwgMHg2NywgMHhhNiwgMHgxYywgMHgwMiwKKyAgMHg4MSwgMHg0YSwgMHgzZCwgMHgzZSwgMHg1ZCwgMHgzMCwgMHgxZiwgMHg1YiwgMHg1OSwgMHg0MSwgMHg0OSwgMHhkZSwKKyAgMHgyMiwgMHgxZSwgMHg4MSwgMHgwYiwgMHgzZiwgMHhmNiwgMHhmZiwgMHhmMSwgMHgwYSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwKKyAgMHg1ZCwgMHhlNiwgMHhjMiwgMHgxNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwKKyAgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiYywgMHgyMSwKKyAgMHgxYSwgMHg5MywgMHg4NSwgMHg5YSwgMHg5MiwgMHhjNiwgMHg0MSwgMHgzMCwgMHg5MSwgMHg4YywgMHg0NSwgMHgwOCwKKyAgMHhhNCwgMHhjNSwgMHg0NSwgMHgyMCwgMHhjYywgMHhkNiwgMHgyMiwgMHg4NCwgMHhhMSwgMHgwMiwgMHg1MywgMHgxYSwKKyAgMHhjOCwgMHg5YSwgMHg1MCwgMHgyMSwgMHg4OSwgMHhmZSwgMHg3MCwgMHgyNCwgMHg3NiwgMHg2NCwgMHg1YywgMHhlZSwKKyAgMHgxZSwgMHg3NiwgMHgyMCwgMHgwMywgMHg5MCwgMHg1MiwgMHg4OCwgMHgyMCwgMHhiOCwgMHhmMCwgMHg1OCwgMHhmMCwKKyAgMHgxZiwgMHhkOCwgMHhlYiwgMHgxNCwgMHg5YiwgMHgxZiwgMHhkZiwgMHhmMSwgMHhlOCwgMHhjZSwgMHhhOCwgMHhmMywKKyAgMHg5MywgMHhhNywgMHgzNCwgMHg5YSwgMHgyNiwgMHg5MiwgMHg5YiwgMHhiNywgMHhiZSwgMHg0MCwgMHhjYiwgMHhmMCwKKyAgMHhjYywgMHg4ZiwgMHgzNiwgMHg5OCwgMHg0OCwgMHgxOCwgMHhlNiwgMHgxNywgMHg2MSwgMHg1NiwgMHgyMywgMHgwZSwKKyAgMHgzMywgMHgyYSwgMHhjMiwgMHgzMiwgMHgwMSwgMHg1NywgMHhkYiwgMHg2ZSwgMHgwNSwgMHgyMiwgMHg1NiwgMHhjZCwKKyAgMHg2OSwgMHg5YiwgMHhiNiwgMHgyZSwgMHgxMiwgMHhiZiwgMHg0YSwgMHg3NiwgMHgyNCwgMHg2MCwgMHhjMCwgMHhlOCwKKyAgMHhkZCwgMHgyYiwgMHg1NywgMHg0ZCwgMHgyZSwgMHhkMywgMHgxOCwgMHg0ZSwgMHgxMCwgMHg2NCwgMHhjYiwgMHhiNiwKKyAgMHg3NCwgMHhiMCwgMHg5YiwgMHhkNCwgMHhkOSwgMHg4MywgMHgxMSwgMHhiNiwgMHgxNCwgMHhiOCwgMHhlZSwgMHhjMCwKKyAgMHhkZSwgMHgzNSwgMHhjNSwgMHhiNCwgMHgxZSwgMHg1MiwgMHhhMiwgMHhhNiwgMHg3NCwgMHgwNywgMHgyNSwgMHg5ZCwKKyAgMHhhNywgMHg1MiwgMHhhNCwgMHhjNiwgMHg0NSwgMHgwMywgMHhhZCwgMHhiNCwgMHgwMywgMHhkNCwgMHgwYiwgMHhjNiwKKyAgMHgxMiwgMHg0YiwgMHhkZiwgMHg1ZCwgMHg2NCwgMHhlYSwgMHhlYSwgMHhkYSwgMHg4NCwgMHgwMCwgMHg2ZiwgMHg0NiwKKyAgMHhlNCwgMHgzOSwgMHgxNiwgMHhmMiwgMHhjYSwgMHg4ZiwgMHhkMCwgMHgyOSwgMHgwZCwgMHhlZSwgMHg0NywgMHgzMiwKKyAgMHhiZSwgMHg1MSwgMHg2YiwgMHhlZiwgMHg1OSwgMHgxNSwgMHhlNSwgMHgxMywgMHgwYiwgMHg3NywgMHg5MiwgMHgxNSwKKyAgMHg3ZiwgMHgwNCwgMHg1ZCwgMHhlYSwgMHhjYSwgMHhjMCwgMHg0MCwgMHgzOSwgMHhhNSwgMHgxMiwgMHgxNSwgMHg3ZCwKKyAgMHhlYSwgMHgxMiwgMHhlNywgMHgyNSwgMHhmMiwgMHg5NCwgMHhiMSwgMHgyZSwgMHg3ZCwgMHg1NywgMHhkYywgMHg5OSwKKyAgMHhhZSwgMHhhMiwgMHhlYSwgMHgzMywgMHhiYSwgMHhhMSwgMHhjYiwgMHhjMSwgMHg1NCwgMHgzYiwgMHgwNiwgMHhlMywKKyAgMHgzNCwgMHg1MCwgMHhiYSwgMHg4OSwgMHhlYywgMHhhYSwgMHhlYywgMHg0NywgMHhlNiwgMHhkYywgMHgzYiwgMHhmYSwKKyAgMHgxYSwgMHhlMSwgMHhlOSwgMHhjNywgMHg0NiwgMHg0MCwgMHgxYywgMHhhMSwgMHg4OSwgMHg5OCwgMHgyMywgMHg4NCwKKyAgMHg2ZSwgMHhlOCwgMHhiYSwgMHg4YywgMHhjYiwgMHgwMSwgMHg0OCwgMHhhOCwgMHgyOCwgMHgxNiwgMHhhOCwgMHg2YiwKKyAgMHgyMiwgMHg2OSwgMHg0MCwgMHg4NiwgMHgyMCwgMHg3OSwgMHg4MywgMHgyMSwgMHg3YiwgMHg2ZiwgMHg2ZCwgMHhiNCwKKyAgMHhkYSwgMHg2ZSwgMHgzMSwgMHgyYSwgMHgyNiwgMHgxMiwgMHhhNSwgMHhiNywgMHg0YSwgMHg5MSwgMHgzMCwgMHg1NSwKKyAgMHhiNCwgMHhlNiwgMHg5OSwgMHg2YSwgMHhhNiwgMHgxMiwgMHgxZiwgMHg3MiwgMHhkYiwgMHg2NSwgMHhkYywgMHhiZSwKKyAgMHgxNywgMHgxNSwgMHg2YiwgMHhjMCwgMHg5ZSwgMHg1NSwgMHgyMCwgMHg4YywgMHhmNSwgMHgyNywgMHgzYywgMHgwOSwKKyAgMHg0MiwgMHhjYywgMHg3OCwgMHg4ZCwgMHgyNCwgMHgzNywgMHhiOSwgMHg0NSwgMHhkZCwgMHgxNCwgMHhhNSwgMHg5OSwKKyAgMHhkZSwgMHgxNSwgMHhhMCwgMHg1YSwgMHgzZSwgMHhmZSwgMHg4YywgMHhkNywgMHgyYSwgMHgxNCwgMHg1MiwgMHhlZiwKKyAgMHg2ZSwgMHg4NywgMHg5YywgMHgyMiwgMHg5ZCwgMHgwOCwgMHg2NSwgMHg1OSwgMHhiNSwgMHg2MCwgMHg3OCwgMHhmZCwKKyAgMHhjMywgMHgyZSwgMHg2YSwgMHg4OCwgMHgxMywgMHhjMiwgMHg0ZiwgMHg3MiwgMHg2YywgMHg5MiwgMHgwMiwgMHg0YywKKyAgMHg4OCwgMHhkNCwgMHhjNCwgMHg4MCwgMHhjMSwgMHg0OCwgMHg1NiwgMHg0YywgMHgzOSwgMHg5OCwgMHg1ZCwgMHg5ZCwKKyAgMHgzMSwgMHgzNSwgMHg4MSwgMHg0NywgMHg3MiwgMHg0ZCwgMHhlNSwgMHg3NywgMHg1NCwgMHhmOCwgMHg4OCwgMHhlNCwKKyAgMHgwNywgMHhhZCwgMHhhMSwgMHhhNiwgMHhhMSwgMHhlOSwgMHg2OSwgMHgxNiwgMHhhZCwgMHgzMywgMHg4OCwgMHg4NiwKKyAgMHhlZSwgMHgxOCwgMHhlYSwgMHgzNywgMHhjYSwgMHg4ZCwgMHhkOCwgMHg1ZiwgMHg5NSwgMHgwNCwgMHhjMywgMHg1NSwKKyAgMHg3NiwgMHg0NSwgMHhmNywgMHhkNSwgMHg5YywgMHgzMiwgMHg0ZSwgMHg4MCwgMHg4MCwgMHhkMCwgMHg5YywgMHg0MSwKKyAgMHhhNywgMHg1NCwgMHhiYywgMHgzNiwgMHg5MCwgMHhiMywgMHhjZiwgMHhjMCwgMHg3MCwgMHg0NiwgMHg0NSwgMHgzNCwKKyAgMHhjYSwgMHg5MywgMHgzYywgMHg2YiwgMHhhNiwgMHhlZCwgMHg0MCwgMHg4YSwgMHg5OCwgMHgyOSwgMHgxMiwgMHg3OCwKKyAgMHhkOSwgMHg2YywgMHgzNywgMHgwNCwgMHhhZCwgMHhmMywgMHgwOSwgMHg2ZSwgMHg2ZSwgMHhjZSwgMHhlOSwgMHgxYywKKyAgMHgyOSwgMHgwNSwgMHgwNiwgMHgwOCwgMHg2MywgMHg3ZSwgMHg0MywgMHgzYSwgMHgyZSwgMHgyZSwgMHhlZiwgMHg4NSwKKyAgMHhiNywgMHg4OSwgMHhjMCwgMHhmNSwgMHhmNSwgMHg3MiwgMHg5MCwgMHgxYywgMHgyMSwgMHgxYSwgMHg4OCwgMHgwNywKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZSwgMHhlZiwgMHg2NiwgMHhhMywgMHgzMSwgMHgxMSwgMHg2YywgMHg0NCwgMHgxMywKKyAgMHgxMiwgMHg4OCwgMHhlMSwgMHgwZSwgMHgxOCwgMHhlMywgMHg3MCwgMHhhMCwgMHgxNCwgMHgyYSwgMHhlOSwgMHgyOCwKKyAgMHg4MiwgMHg0NCwgMHhlNCwgMHg2OCwgMHgzOCwgMHgyMSwgMHgwOCwgMHgyYywgMHhhNCwgMHhkOSwgMHgxZSwgMHhjNCwKKyAgMHg3OSwgMHgyOCwgMHgxMCwgMHgyZSwgMHhlNCwgMHg3OCwgMHg1MiwgMHgyNCwgMHgyMSwgMHgxMSwgMHg4MywgMHhmNiwKKyAgMHhiYSwgMHhkNSwgMHhhOCwgMHhlNCwgMHhiYywgMHhmMSwgMHgzYywgMHg2NSwgMHgyNSwgMHg3YSwgMHhiNCwgMHg1YywKKyAgMHg4OSwgMHhjZSwgMHgxNCwgMHhiMiwgMHg4ZSwgMHg5MywgMHg1MiwgMHhmMywgMHg4MiwgMHg0YywgMHg0ZCwgMHg0MiwKKyAgMHg2OCwgMHhiNSwgMHhjOCwgMHgxNSwgMHhlYSwgMHhkMSwgMHgxZCwgMHhhNiwgMHhmMywgMHg4MywgMHhmNCwgMHgxZiwKKyAgMHgxOCwgMHg5NywgMHhiNywgMHg5OCwgMHhmZCwgMHg5YywgMHgxMywgMHg1YywgMHg5MCwgMHhlMSwgMHg3ZCwgMHg4OCwKKyAgMHhhZiwgMHg0ZiwgMHgxNiwgMHg4ZSwgMHg3ZSwgMHhmZSwgMHg5OSwgMHg3NCwgMHg4MCwgMHgyNSwgMHhlYSwgMHg5NiwKKyAgMHgxMywgMHgyMCwgMHgzZCwgMHhkZiwgMHg3OSwgMHgzZSwgMHg5MywgMHhkYiwgMHg3NCwgMHg5YSwgMHgxMSwgMHg0ZSwKKyAgMHhlOSwgMHhkOCwgMHg0MCwgMHgxYSwgMHgxYywgMHgwYywgMHgwNCwgMHg0NCwgMHg4ZSwgMHgxZSwgMHg4NiwgMHgzNCwKKyAgMHg0MiwgMHg2OCwgMHg2OCwgMHgwZSwgMHhmOSwgMHhjMiwgMHgxMiwgMHg0YiwgMHgwZSwgMHg1NywgMHgxMCwgMHhkNCwKKyAgMHg4MCwgMHhjMiwgMHhkMCwgMHhlOCwgMHg4YywgMHhjMiwgMHhiMiwgMHg5NywgMHg5OSwgMHhkZCwgMHhjZCwgMHgwOCwKKyAgMHhhYSwgMHg2YiwgMHg0NiwgMHhhYiwgMHg2YywgMHhhZiwgMHg5NywgMHg0YiwgMHg2ZiwgMHg4YiwgMHg2MiwgMHg4MSwKKyAgMHgyNSwgMHhlZCwgMHg0NCwgMHg5MCwgMHgyYiwgMHg3MSwgMHhkYiwgMHgxMiwgMHg0YywgMHg2ZCwgMHgwOCwgMHhiNSwKKyAgMHg4YiwgMHg0YiwgMHgxMiwgMHg5MiwgMHgyOCwgMHg4MywgMHhiYiwgMHhiNCwgMHg1NCwgMHgyZCwgMHgxNywgMHhiYywKKyAgMHgyNSwgMHg2NywgMHhiNSwgMHhmMiwgMHgwNiwgMHgyMCwgMHg4ZCwgMHg0NywgMHg3ZCwgMHg1ZCwgMHgyMywgMHg4OSwKKyAgMHhhOCwgMHg5ZCwgMHg5NCwgMHg2ZSwgMHgzYywgMHhjOSwgMHg0NiwgMHgxMiwgMHg2MCwgMHg0NiwgMHgyYywgMHg0YywKKyAgMHhiNiwgMHhlYiwgMHg0YiwgMHg1MSwgMHhmNiwgMHhkMiwgMHg0ZCwgMHg3YywgMHg3ZCwgMHgwNywgMHg0OSwgMHhiNSwKKyAgMHgzMCwgMHhjMCwgMHhjMywgMHg1MywgMHg2MiwgMHgxZiwgMHhmNCwgMHhhMiwgMHhiNiwgMHg3NiwgMHhkMiwgMHgzNSwKKyAgMHhkMSwgMHhhYSwgMHhiMSwgMHhmNSwgMHg5YSwgMHg4YywgMHg4MywgMHhkZSwgMHg2YywgMHhhOSwgMHgzNSwgMHhiYywKKyAgMHhjZiwgMHgyZCwgMHhhZCwgMHgyYiwgMHhmMSwgMHhmNywgMHg3OSwgMHhmZiwgMHg0OCwgMHgxZiwgMHhiMSwgMHhmYSwKKyAgMHgwZSwgMHgyZSwgMHgwNywgMHg1NywgMHg3YywgMHhlZCwgMHg3NiwgMHg3MCwgMHhmOSwgMHg3YSwgMHhmYywgMHg5ZSwKKyAgMHgxNywgMHg5YywgMHgwMSwgMHhkYiwgMHhkMCwgMHhjNiwgMHg0NiwgMHhiMCwgMHg1MCwgMHg2YywgMHgxNCwgMHgxYiwKKyAgMHgwYSwgMHg4OCwgMHhlMSwgMHhjMCwgMHhhOSwgMHg5YSwgMHgzMiwgMHgyYSwgMHhhZSwgMHhhYSwgMHhkNSwgMHg1MCwKKyAgMHg0NiwgMHg1YywgMHhjMiwgMHgyNSwgMHg1YiwgMHgwNSwgMHg2NywgMHhkOCwgMHhkNywgMHhjZiwgMHhhOSwgMHg0OSwKKyAgMHhhNiwgMHg2YiwgMHg5MCwgMHgyZiwgMHhiOCwgMHhhNywgMHgxNiwgMHgxYywgMHhhZSwgMHgwNSwgMHhiZCwgMHgxNCwKKyAgMHg2YSwgMHhiMiwgMHg2NCwgMHg3YywgMHhkOCwgMHgxYSwgMHhmZiwgMHg2NywgMHhjNCwgMHhiNCwgMHg0ZiwgMHgzZiwKKyAgMHg0OSwgMHhlNCwgMHhkYywgMHgwMiwgMHg2OCwgMHg5MCwgMHgxNSwgMHg2MiwgMHhkYSwgMHgxNywgMHhhZiwgMHgyNCwKKyAgMHgxOSwgMHhiYiwgMHg4YywgMHg1ZCwgMHgxOCwgMHg3YywgMHg5ZCwgMHg2MywgMHg4NSwgMHhmYSwgMHhhZCwgMHhiYSwKKyAgMHgxMCwgMHhiNiwgMHgwNSwgMHg2NCwgMHgwMCwgMHg0ZiwgMHg4ZiwgMHg1YywgMHhjZCwgMHhiOCwgMHg0YSwgMHhkNiwKKyAgMHg4ZSwgMHgyZSwgMHgwMiwgMHgzYiwgMHhlZSwgMHhlNiwgMHg0MywgMHhjYSwgMHhjYSwgMHgyOCwgMHgyZCwgMHgyNCwKKyAgMHg0NywgMHgxMSwgMHhkYSwgMHgxYSwgMHgwMywgMHhkZCwgMHhmMiwgMHhiZCwgMHgzYiwgMHg4OSwgMHg4ZCwgMHg1NCwKKyAgMHg4ZSwgMHhiMywgMHhiMSwgMHgyMSwgMHg4ZCwgMHhmYSwgMHhhZCwgMHhhNiwgMHg1OCwgMHg1ZCwgMHgxMywgMHgzOSwKKyAgMHgzZCwgMHhjNiwgMHhmZSwgMHhkMywgMHhlYywgMHhmMiwgMHg1NSwgMHhmOSwgMHg5YiwgMHgyNSwgMHgyMiwgMHgwNiwKKyAgMHg4MCwgMHhiYywgMHg5MywgMHg3NywgMHg3YiwgMHg0NiwgMHhiMywgMHgzMywgMHhhMywgMHg3YSwgMHhmMiwgMHg4MywKKyAgMHhhNCwgMHgxNywgMHgyYiwgMHgxNCwgMHg1YSwgMHg3NCwgMHhjNCwgMHg2MiwgMHhmNCwgMHhiYSwgMHg3OCwgMHhhNiwKKyAgMHhiNiwgMHhiZiwgMHg2MiwgMHgwMywgMHhlZCwgMHhjMiwgMHg3NSwgMHhhNywgMHhiNywgMHg4YywgMHg4ZiwgMHgwMiwKKyAgMHgxNCwgMHg3MSwgMHg4MSwgMHhhYSwgMHhiNywgMHhhYSwgMHhiMCwgMHg3OSwgMHg0ZSwgMHgxZiwgMHgzZCwgMHg0NywKKyAgMHg1NSwgMHhhYSwgMHg0MSwgMHg0OCwgMHg0MiwgMHhjOSwgMHg1YiwgMHhlYiwgMHhiYSwgMHg3ZCwgMHgzZCwgMHg0ZCwKKyAgMHgzNSwgMHg3MSwgMHg3YSwgMHhkNiwgMHg0ZSwgMHgyYywgMHhhZiwgMHgwNCwgMHg0MywgMHhjOCwgMHg2MywgMHgxZSwKKyAgMHhmMSwgMHhhMCwgMHgxYiwgMHg1NywgMHgwNywgMHg5NSwgMHhhNiwgMHhjMywgMHhlMywgMHgyZSwgMHhhNiwgMHg2ZSwKKyAgMHg0MSwgMHg1YSwgMHhhZSwgMHgzYywgMHhjZSwgMHhiMCwgMHhiZiwgMHhhMywgMHg3MSwgMHhlOCwgMHhiZSwgMHhmMywKKyAgMHhlZiwgMHg3ZCwgMHg1ZiwgMHgxZiwgMHhhMywgMHhhMywgMHhiNCwgMHhmMywgMHgwMCwgMHg3MCwgMHgyMSwgMHgxYSwKKyAgMHg5MywgMHg5ZCwgMHg4OSwgMHg5MCwgMHg5YSwgMHg2MSwgMHg1MCwgMHhkYywgMHgyMCwgMHhhNSwgMHg0NiwgMHgxMCwKKyAgMHhjOCwgMHg0ZCwgMHhlOCwgMHgwNSwgMHg0MCwgMHg0YiwgMHhhMCwgMHgxMiwgMHg5OSwgMHg4YiwgMHgyNywgMHgwNSwKKyAgMHhjNCwgMHg5NiwgMHg1ZiwgMHhjMywgMHg3YSwgMHg4NiwgMHhjYywgMHhlZCwgMHgyNSwgMHg4YSwgMHgyYSwgMHg5MCwKKyAgMHgxZSwgMHg5OSwgMHhkMCwgMHg0NiwgMHgyYywgMHgxZiwgMHgyZiwgMHg1MywgMHhlYywgMHg3ZCwgMHgwMywgMHhkNywKKyAgMHhjNywgMHg2ZiwgMHhjOSwgMHg2NCwgMHgxYywgMHg4YSwgMHhmZCwgMHhiNSwgMHgyYiwgMHg2MywgMHg4OSwgMHhmOSwKKyAgMHgzZSwgMHgxNiwgMHhjMCwgMHhiMCwgMHhiNywgMHhiYywgMHgzYiwgMHhhNCwgMHhkYSwgMHg2ZSwgMHhhYiwgMHg0NiwKKyAgMHg3YywgMHhmNywgMHg5MiwgMHg1ZiwgMHhmMCwgMHhkYSwgMHhlNiwgMHhmYywgMHg1NiwgMHgxYSwgMHgyNCwgMHhmMCwKKyAgMHhjYSwgMHhmNywgMHhhNSwgMHhhNSwgMHg3YiwgMHg3MCwgMHg3MCwgMHhhZiwgMHg4YiwgMHhjZCwgMHgxOCwgMHhlZCwKKyAgMHhjMywgMHg3YSwgMHg0YSwgMHgyNiwgMHg3ZCwgMHhmYiwgMHgyMiwgMHg5NCwgMHg5MiwgMHhkOSwgMHhjZCwgMHg5OCwKKyAgMHhkMywgMHgzYSwgMHgxZSwgMHg0MywgMHg3NCwgMHgyYiwgMHhmZCwgMHgwNywgMHg4ZCwgMHgyYiwgMHhhZCwgMHhmZSwKKyAgMHhlOSwgMHhhZSwgMHhhNCwgMHgxZCwgMHhhMSwgMHgyZiwgMHhhNywgMHhiMywgMHg1OSwgMHhmNCwgMHg1YywgMHg2ZSwKKyAgMHgzZSwgMHhmOCwgMHg4MiwgMHgzYiwgMHg0OSwgMHhlYiwgMHhhOSwgMHhmNSwgMHhmNywgMHhiNywgMHg4MywgMHgwNSwKKyAgMHhhZSwgMHg3NSwgMHg1NCwgMHgwMSwgMHg3MSwgMHhkNCwgMHhhNSwgMHgwMCwgMHg4YSwgMHg4NiwgMHg4MSwgMHg3YiwKKyAgMHhkMCwgMHgwNywgMHg3NywgMHhiYSwgMHg0NCwgMHhjNCwgMHg5NCwgMHgzZSwgMHg2ZiwgMHg1ZCwgMHgyYSwgMHg3NSwKKyAgMHgyYSwgMHg1YiwgMHgzOSwgMHg0YywgMHg2OCwgMHgzMiwgMHg2NSwgMHg4MiwgMHg2ZSwgMHg5YywgMHhmZiwgMHgzNSwKKyAgMHhkMCwgMHg3OCwgMHg3MywgMHhiMywgMHhiNywgMHg3ZiwgMHhhMiwgMHhjMywgMHg5MCwgMHhjYywgMHg4MywgMHg5MCwKKyAgMHg3OCwgMHg2OSwgMHhkNSwgMHhmMiwgMHhiYiwgMHg5ZCwgMHg3NSwgMHg0ZiwgMHgxZSwgMHhlMywgMHhiMCwgMHg3YiwKKyAgMHg4MCwgMHhlZiwgMHg2MiwgMHg5MiwgMHgzMiwgMHhhZSwgMHgwMiwgMHhkYSwgMHg5MiwgMHg5YywgMHg2YiwgMHgxYiwKKyAgMHg3ZiwgMHgwZSwgMHhjNywgMHg0YSwgMHhjMywgMHg0ZiwgMHg1YiwgMHgwOCwgMHhkMiwgMHhhYywgMHgyMiwgMHg3YiwKKyAgMHhhNSwgMHgxMCwgMHg5MCwgMHhhOSwgMHg1NSwgMHgyYiwgMHg4NiwgMHhmYywgMHgzZiwgMHhjNCwgMHhmOSwgMHg1ZiwKKyAgMHg3ZiwgMHhkZSwgMHg3MiwgMHhiZiwgMHg5ZiwgMHhkYSwgMHgwMCwgMHg3NCwgMHhiMSwgMHgzMiwgMHg5MiwgMHhjYywKKyAgMHg0YSwgMHgxYywgMHg4NCwgMHgxMCwgMHhlNywgMHg0MCwgMHhhMywgMHgyYywgMHgwMywgMHg3YSwgMHgwMCwgMHhiMCwKKyAgMHgyZSwgMHhhMSwgMHg2OSwgMHgzYSwgMHg2OSwgMHg2YSwgMHg1MiwgMHgwMiwgMHg0MiwgMHg5ZSwgMHhkYSwgMHg2NywKKyAgMHhmMiwgMHhlMiwgMHgxMSwgMHgzZCwgMHgyNywgMHg2NSwgMHgyMSwgMHg3MCwgMHg2MSwgMHg5MiwgMHhmZSwgMHgzMywKKyAgMHhjMywgMHg5ZiwgMHg4NywgMHg4NiwgMHhlZiwgMHgxMiwgMHgzNSwgMHhjOCwgMHg2YiwgMHgyMSwgMHhkZSwgMHg3MiwKKyAgMHhiNCwgMHhlNCwgMHhmZiwgMHg4NywgMHg1MiwgMHgyYSwgMHhhNCwgMHg4MywgMHg5OSwgMHhkNCwgMHg2YywgMHg1ZiwKKyAgMHhhYywgMHg2NywgMHhiNSwgMHgyNywgMHgyZSwgMHhlZCwgMHg1OCwgMHgwOCwgMHgwMCwgMHhhZiwgMHhjMCwgMHg2YiwKKyAgMHg4YSwgMHhkNywgMHhiNywgMHg4MSwgMHhiYywgMHg1YiwgMHg0YSwgMHgyNywgMHhjZSwgMHgxNSwgMHg3MCwgMHhhYywKKyAgMHg5ZiwgMHhmMiwgMHhiYSwgMHgzOSwgMHhkNCwgMHg5ZCwgMHhlNywgMHhiOCwgMHhjNCwgMHhkOSwgMHgzNywgMHg1ZSwKKyAgMHg5YiwgMHhhYSwgMHhmMCwgMHhmNiwgMHg1MSwgMHg5YiwgMHg1MCwgMHhmMSwgMHhiNywgMHgyNywgMHhiZCwgMHhhNywKKyAgMHg3NSwgMHg5ZiwgMHg5MiwgMHgxMCwgMHgzYywgMHhhMywgMHg3YywgMHgzOCwgMHgyZSwgMHg1ZiwgMHg5OSwgMHhmYywKKyAgMHhiZCwgMHgzZiwgMHgwMywgMHg1YSwgMHhjZCwgMHhkNywgMHhmZSwgMHhjMCwgMHgzZSwgMHgzNiwgMHg4ZCwgMHg3MywKKyAgMHhkYywgMHhmNiwgMHg4MiwgMHgwZCwgMHg3MiwgMHg0MiwgMHhiNCwgMHhkMywgMHgzOCwgMHhiYSwgMHhhOSwgMHgxNiwKKyAgMHgwYywgMHg4YywgMHhhZiwgMHg5NSwgMHgwMiwgMHhiYiwgMHhlNSwgMHg1NCwgMHg3YiwgMHhkYywgMHg1ZCwgMHhjOSwKKyAgMHhkNCwgMHhkZCwgMHgxMiwgMHhkNiwgMHhiYSwgMHg4OSwgMHg2YywgMHhiNSwgMHhmYiwgMHg2ZiwgMHg5YywgMHhhYiwKKyAgMHgzOCwgMHg3ZSwgMHhkYSwgMHg1NCwgMHgxZCwgMHhiYywgMHg2NywgMHhlYiwgMHhmMiwgMHhmZCwgMHhhZCwgMHg0NCwKKyAgMHhkMiwgMHg5YSwgMHg4NiwgMHg2YSwgMHgwYywgMHgzNiwgMHgwMCwgMHhjZCwgMHgxOCwgMHhlZSwgMHg5MCwgMHg1ZSwKKyAgMHgwNSwgMHgzMiwgMHgwYywgMHg5YiwgMHgzNSwgMHg3OCwgMHg4NSwgMHg2MiwgMHgyMiwgMHg2NSwgMHgwNiwgMHgxNywKKyAgMHgwNCwgMHhmMCwgMHg4OSwgMHg3OSwgMHhkMywgMHg0MSwgMHg5YiwgMHhjNywgMHg5ZiwgMHhiZCwgMHgyYiwgMHg2NywKKyAgMHg3NSwgMHg3ZiwgMHgwNiwgMHhmOSwgMHhhNSwgMHg2ZCwgMHg5YywgMHhmZiwgMHgwNywgMHhjMywgMHhlNywgMHg3ZiwKKyAgMHgxYiwgMHhmMywgMHgyZCwgMHgyZiwgMHhhNywgMHgwMCwgMHhlMCwgMHgyMSwgMHgxYSwgMHg5MywgMHhhNSwgMHgyMSwKKyAgMHg5MCwgMHg4NSwgMHgyMiwgMHhhMiwgMHg1OCwgMHg1MCwgMHg0MSwgMHgwOSwgMHhhYywgMHhjZCwgMHg2NCwgMHg1NCwKKyAgMHgwMiwgMHhiMSwgMHg3YiwgMHgwYiwgMHg1MCwgMHg1MiwgMHhjOCwgMHg5ZiwgMHhiMCwgMHg5OCwgMHgzZiwgMHhkNywKKyAgMHhlMywgMHg3OSwgMHg3NiwgMHhkMSwgMHg5YiwgMHhkZSwgMHg5OCwgMHgzOCwgMHg2MCwgMHg3YiwgMHhhOCwgMHhmMSwKKyAgMHgwOSwgMHgxMSwgMHgzNiwgMHg4YSwgMHg0YSwgMHhlMiwgMHhiMywgMHhhNSwgMHgyOSwgMHg3NSwgMHg2NiwgMHg5MywKKyAgMHhjMSwgMHhhNCwgMHhjZCwgMHg2ZCwgMHgwYywgMHhkOSwgMHgwMiwgMHgzNSwgMHg0MywgMHhmNSwgMHg2MSwgMHhiNiwKKyAgMHhhNCwgMHg3NiwgMHgyOSwgMHgwNiwgMHg3MSwgMHg3MCwgMHg4ZiwgMHhiZiwgMHhlOCwgMHg3MCwgMHhjOSwgMHg5NSwKKyAgMHg5ZSwgMHhmYywgMHhmOCwgMHhjMiwgMHgxMywgMHhlMywgMHg0OSwgMHg5NSwgMHg2MSwgMHgxYiwgMHg3OSwgMHgyNCwKKyAgMHhlMCwgMHg1OCwgMHg4MCwgMHg4YSwgMHg4MCwgMHhkMSwgMHg1OSwgMHhhNywgMHg5MSwgMHgwMiwgMHgxMSwgMHhkMywKKyAgMHg1ZCwgMHgyYSwgMHg4MCwgMHhhZiwgMHhkZiwgMHg5MCwgMHhlOCwgMHhlNCwgMHhiYywgMHg0NywgMHhiZCwgMHgyOCwKKyAgMHg4MiwgMHgwMiwgMHhkNCwgMHhiZCwgMHhjZSwgMHhhZCwgMHgwOCwgMHhmMCwgMHgwYiwgMHg0ZiwgMHhkYywgMHgzOSwKKyAgMHg1MCwgMHgxNSwgMHhiNywgMHg2YSwgMHhlNSwgMHg0ZiwgMHg5NCwgMHg3ZSwgMHg3YSwgMHg0MSwgMHhkOSwgMHhlMiwKKyAgMHgxZCwgMHgyYiwgMHhkNywgMHg4MCwgMHhjZiwgMHg4YSwgMHgyOCwgMHhiZCwgMHg2YywgMHg5NywgMHhjOCwgMHhlMywKKyAgMHg1NiwgMHg3ZSwgMHhhYiwgMHhiNiwgMHgwOSwgMHhkNywgMHhiNiwgMHg5YiwgMHhlOSwgMHhjYywgMHg1OSwgMHg3MywKKyAgMHg5NSwgMHg1ZSwgMHhhNCwgMHgyZCwgMHhlYSwgMHg3MCwgMHgxOSwgMHhkZCwgMHg2NiwgMHg4NywgMHhhMCwgMHhhYiwKKyAgMHgxYSwgMHhkMSwgMHgzOSwgMHg3MCwgMHgyNiwgMHhiNywgMHgzYSwgMHgyNywgMHg4NywgMHg3MCwgMHgzYiwgMHg3NywKKyAgMHg0NywgMHhjYSwgMHg4ZSwgMHgzOCwgMHhiOCwgMHg5NSwgMHhjNywgMHhiNiwgMHg5YiwgMHg4YSwgMHgyNiwgMHg2OCwKKyAgMHg4ZiwgMHhiYiwgMHhkZiwgMHgxOSwgMHgxOCwgMHhjOCwgMHg3NywgMHhjYSwgMHg5NCwgMHgyYywgMHg5NCwgMHg2ZSwKKyAgMHhhNSwgMHgzOCwgMHhkZSwgMHhkNiwgMHg2ZiwgMHg3NSwgMHg1YiwgMHg1OSwgMHhiYiwgMHhkOCwgMHhmNSwgMHg2OSwKKyAgMHg1NCwgMHhkMCwgMHhkOCwgMHhjNywgMHg1NywgMHg4YiwgMHhiMSwgMHhlNywgMHg2NywgMHhiZCwgMHhmOSwgMHgwMywKKyAgMHhiYSwgMHg2MCwgMHg4YSwgMHg4NywgMHg4MiwgMHhiOCwgMHg0ZSwgMHgwMCwgMHgyOSwgMHg1MCwgMHgwMSwgMHg1OCwKKyAgMHgyMCwgMHg5NCwgMHg5MCwgMHg1MCwgMHg1ZiwgMHhlNywgMHhmYSwgMHgyZiwgMHhlYiwgMHhkZiwgMHg1MSwgMHgwNywKKyAgMHhmZSwgMHhiNywgMHhkNywgMHg3MywgMHg5MSwgMHgxZSwgMHg4ZiwgMHhhNiwgMHgzZiwgMHhiOCwgMHhlOSwgMHhhNSwKKyAgMHgzMSwgMHgxZiwgMHgwZiwgMHhjMSwgMHgxYywgMHhmMiwgMHg2ZiwgMHhmNiwgMHgyOCwgMHhiNSwgMHg4YywgMHg5YywKKyAgMHg4MCwgMHgzYSwgMHgxZSwgMHg4NywgMHhmNiwgMHg3ZSwgMHgyMSwgMHg3NSwgMHg4MCwgMHg0MywgMHhiNCwgMHgyOCwKKyAgMHhmYywgMHgwNywgMHg4ZiwgMHgxMCwgMHgwMiwgMHgwMCwgMHg0NSwgMHg2ZCwgMHhjZCwgMHg3ZSwgMHgyYiwgMHhhZCwKKyAgMHhjZiwgMHhiMSwgMHg5NSwgMHhkZCwgMHhlNSwgMHhiMywgMHg3YSwgMHg0YiwgMHhmZiwgMHhjYywgMHhhNywgMHhhYSwKKyAgMHg1MSwgMHg0YSwgMHhhYiwgMHg5YiwgMHgxYiwgMHgzYywgMHg2YiwgMHhhNSwgMHg1OCwgMHhiMCwgMHhhZCwgMHgyYiwKKyAgMHg2MiwgMHg2ZCwgMHg3ZSwgMHg5OCwgMHg0MiwgMHgxYSwgMHg4NCwgMHhjZiwgMHhmNCwgMHg3MSwgMHg1NSwgMHg4OSwKKyAgMHg0OCwgMHhhYiwgMHhlYSwgMHgwMCwgMHgwMCwgMHhhMiwgMHgxMCwgMHg2YSwgMHg4ZCwgMHhlOCwgMHhlZCwgMHgzOSwKKyAgMHg3MCwgMHg2NiwgMHhkNCwgMHgxYiwgMHhjZCwgMHg3NywgMHgzMCwgMHgzZiwgMHg5YywgMHg3NSwgMHg3ZiwgMHhkNiwKKyAgMHhmYiwgMHg2NiwgMHgyOCwgMHgxNiwgMHhiZiwgMHgxZSwgMHg4YSwgMHgyYiwgMHg0NCwgMHg0OCwgMHg1NywgMHhhMSwKKyAgMHg2NywgMHhiZiwgMHg4MCwgMHg3NywgMHhkNywgMHgxYywgMHg2MywgMHg5ZCwgMHg2MSwgMHgzMCwgMHg4NiwgMHg5ZCwKKyAgMHgxOCwgMHg1ZiwgMHgxYywgMHhmMiwgMHhjMiwgMHhmZCwgMHgzNCwgMHhhMSwgMHg4ZCwgMHgxYSwgMHhmZCwgMHg1NiwKKyAgMHgxNCwgMHg2MywgMHg4MiwgMHhhMSwgMHhlZCwgMHg1YywgMHhkOSwgMHg0NSwgMHgwNSwgMHg4NiwgMHhjYSwgMHg4MSwKKyAgMHgxYywgMHg5YywgMHg4ZCwgMHgxZCwgMHg2NywgMHhiZCwgMHg1MSwgMHhhMCwgMHhhNywgMHg2NCwgMHgwZCwgMHhmOSwKKyAgMHg0NCwgMHg2ZCwgMHhhOCwgMHg2MiwgMHgyMiwgMHgzNywgMHg1MiwgMHhkMiwgMHhkNiwgMHgzMywgMHhkMiwgMHhjNSwKKyAgMHhkMiwgMHhiNywgMHgzMywgMHg3YSwgMHg3NiwgMHgzNiwgMHhlZSwgMHgzNywgMHg2MywgMHg5ZiwgMHgzMywgMHgxZiwKKyAgMHgyZSwgMHhhZiwgMHhjNiwgMHhlYiwgMHhmNywgMHg3NiwgMHg1ZSwgMHgxZiwgMHgyZiwgMHg5YiwgMHhjYywgMHgwMSwKKyAgMHhjMCwgMHgyMSwgMHgxYSwgMHg5MywgMHg5NSwgMHgxNSwgMHg5NCwgMHg4ZCwgMHgyMiwgMHgyMSwgMHg2MCwgMHg4MiwKKyAgMHgxNCwgMHg2ZiwgMHg1YiwgMHg4ZCwgMHhjNSwgMHhkMywgMHg3NiwgMHhhNSwgMHgwMCwgMHgwMiwgMHgxMSwgMHg1MSwKKyAgMHhmNiwgMHgxYSwgMHgwNSwgMHgwYSwgMHg5NiwgMHhiOCwgMHhmYiwgMHgzYiwgMHhmNywgMHgzYywgMHhmOSwgMHhiMywKKyAgMHhjNywgMHg0ZiwgMHhiZSwgMHg5YywgMHhiNCwgMHgyZCwgMHhiZiwgMHgzZSwgMHgzNSwgMHhjNCwgMHgwZSwgMHg1NCwKKyAgMHg2OCwgMHhiMCwgMHg2NCwgMHhjNiwgMHhhOSwgMHhjZCwgMHgwZSwgMHhkYSwgMHgwOSwgMHg1MCwgMHg1MywgMHhlNiwKKyAgMHg2NywgMHhjYiwgMHg0NiwgMHhiZSwgMHgyZCwgMHg0OCwgMHgyYSwgMHgwNiwgMHhiMSwgMHgxZiwgMHg2NCwgMHg0NSwKKyAgMHgyNSwgMHgyMiwgMHg4ZSwgMHgyOSwgMHhjZCwgMHg2MCwgMHg3YSwgMHg4YywgMHhiNCwgMHhmYSwgMHhlNSwgMHg1NSwKKyAgMHg4MiwgMHg5OSwgMHgzNywgMHhiMSwgMHhjMiwgMHgyYiwgMHhiOSwgMHg0MiwgMHg1NywgMHhkZSwgMHg4YiwgMHhkZSwKKyAgMHgxZCwgMHg2NiwgMHg1ZCwgMHhmNSwgMHhlNywgMHg5MSwgMHg3OCwgMHg2MywgMHgzMSwgMHgzZiwgMHg3YSwgMHgyZiwKKyAgMHhmNSwgMHhiZCwgMHg1NiwgMHhmOCwgMHhmNiwgMHg5OSwgMHhiZiwgMHg1YSwgMHhmMCwgMHgxNSwgMHhiNiwgMHhiYywKKyAgMHg0NywgMHhjOSwgMHhjZSwgMHg4NCwgMHg2NSwgMHg1NywgMHg1NywgMHg3YSwgMHg5NCwgMHg2NCwgMHgzYiwgMHgzMSwKKyAgMHg1ZCwgMHhkNSwgMHg4MSwgMHg5ZiwgMHg4NywgMHhmMiwgMHg3OSwgMHg3ZCwgMHgzZSwgMHg3OSwgMHg4NSwgMHg4NCwKKyAgMHg5MywgMHhkMSwgMHgyZiwgMHhjMSwgMHhkMSwgMHhmYiwgMHgwZSwgMHg4YywgMHgwYywgMHhkZCwgMHg5MSwgMHg1NywKKyAgMHhmOCwgMHg4ZSwgMHg4ZCwgMHhhYiwgMHhmNCwgMHg1ZCwgMHgwMywgMHhhMywgMHg3NywgMHgzOSwgMHhiNiwgMHhkNiwKKyAgMHhlOCwgMHg4NiwgMHg0MywgMHgxOCwgMHhmMCwgMHhhZCwgMHg1MCwgMHgwMSwgMHg5NywgMHhhMiwgMHhkZSwgMHhjOCwKKyAgMHg5OCwgMHgwYSwgMHg4YiwgMHg2ZCwgMHg0NywgMHgxMiwgMHg5MiwgMHhlMiwgMHg4ZSwgMHhjMSwgMHhjYiwgMHg2YiwKKyAgMHg4ZiwgMHgwNSwgMHgzYSwgMHg4OCwgMHhiMiwgMHhlOCwgMHg0ZiwgMHg2YSwgMHhkOSwgMHgyMCwgMHhmNywgMHhlZSwKKyAgMHgzZSwgMHgxNSwgMHg2YiwgMHhhMywgMHhiZCwgMHg4ZCwgMHhiZiwgMHgxNCwgMHg4MiwgMHg4ZCwgMHhhNiwgMHhjNiwKKyAgMHhlMCwgMHhiZSwgMHg1MywgMHgxYSwgMHgzZCwgMHhmYywgMHg5ZiwgMHg2NywgMHg4YSwgMHgzOSwgMHgwMSwgMHhjOSwKKyAgMHg4YSwgMHg5MSwgMHgyMywgMHgyMiwgMHgxOCwgMHg1MCwgMHgzNywgMHgwYiwgMHgyMiwgMHhiMiwgMHg1ZCwgMHgyOSwKKyAgMHg1NiwgMHgxNCwgMHgyYSwgMHg4MCwgMHgxMCwgMHg0MiwgMHg1MCwgMHhjNywgMHhmMiwgMHg0ZSwgMHg1YiwgMHhlOSwKKyAgMHhjYywgMHhhYiwgMHhjMywgMHg5YSwgMHhlOSwgMHhlZSwgMHgwYiwgMHg5MywgMHg1OSwgMHhjNSwgMHhkOCwgMHg0ZCwKKyAgMHg3MiwgMHhkZCwgMHg4MywgMHhiMywgMHgwYiwgMHhkNywgMHhkYiwgMHg5ZCwgMHgxYSwgMHg3NSwgMHg2YywgMHhmYywKKyAgMHgzOSwgMHg3OCwgMHg4YywgMHg5NiwgMHgzMiwgMHg2OCwgMHhjMSwgMHgwYSwgMHgwMCwgMHgyMSwgMHg3MiwgMHgxNiwKKyAgMHgwNCwgMHg3YiwgMHhmNiwgMHg1NSwgMHg0NiwgMHg4NSwgMHg3OCwgMHgwNiwgMHhkNCwgMHg4MywgMHg1MSwgMHhlMywKKyAgMHhhNCwgMHhkYiwgMHg1MCwgMHg5NiwgMHgzZSwgMHgxNiwgMHgwYywgMHgxNywgMHhlMCwgMHg5NCwgMHhkZCwgMHg2OCwKKyAgMHhlMSwgMHhmOCwgMHhlMSwgMHg4NywgMHg4ZiwgMHgyMiwgMHhiMywgMHg2NSwgMHg1NywgMHhhOSwgMHgwYSwgMHgyMiwKKyAgMHg1YywgMHg2NCwgMHhjOSwgMHhhMywgMHhjOSwgMHg2YiwgMHhiNSwgMHg2MSwgMHgzMSwgMHhiOCwgMHhmMCwgMHg2YSwKKyAgMHgyYSwgMHhiZCwgMHgxMywgMHgyZiwgMHhlNywgMHhkZCwgMHgxOCwgMHgwYywgMHg2YSwgMHg5ZiwgMHg3MSwgMHg3OSwKKyAgMHgwMCwgMHgxMSwgMHg1NiwgMHgzMSwgMHgwZCwgMHhlZSwgMHhiNiwgMHgzNCwgMHhkNSwgMHg4MSwgMHhlMywgMHhlOCwKKyAgMHg1YiwgMHhkOCwgMHgyMCwgMHgxYiwgMHgzZCwgMHhlNiwgMHg1MywgMHgxYSwgMHhhMiwgMHhiMywgMHg0OSwgMHg2NSwKKyAgMHgzNSwgMHg5NSwgMHg4ZiwgMHg2NCwgMHhjMSwgMHg3MiwgMHhlZSwgMHg5ZCwgMHhmZiwgMHgzYSwgMHgyZCwgMHhkZiwKKyAgMHhiNywgMHgxNywgMHhlYiwgMHhkZiwgMHg4NSwgMHgwZSwgMHg3NSwgMHg3YiwgMHgxMiwgMHhlNSwgMHhlMCwgMHg5ZiwKKyAgMHgxMSwgMHhhMywgMHgxNiwgMHg3ZSwgMHg5ZiwgMHgxZCwgMHg3MiwgMHg0NywgMHgzYywgMHhhZSwgMHgwNiwgMHg0MCwKKyAgMHg4MSwgMHg2MywgMHg4NSwgMHgwNCwgMHgwZCwgMHgxZSwgMHg0YiwgMHg3ZCwgMHgzZSwgMHhhNiwgMHg5YSwgMHhjNiwKKyAgMHg0NSwgMHg1ZiwgMHg5MywgMHhkZSwgMHhmNywgMHgwYiwgMHhjMywgMHhhZiwgMHhkMSwgMHg3OCwgMHg3ZSwgMHhlNCwKKyAgMHhhYiwgMHhlYSwgMHhmOCwgMHgxMSwgMHhlMSwgMHg3NiwgMHhkYSwgMHhkZSwgMHhkMCwgMHgwNywgMHgyMSwgMHgxYSwKKyAgMHg4OCwgMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZSwgMHhlZCwgMHg2NSwgMHhhMywgMHg0MSwgMHg0OSwgMHhlOCwKKyAgMHg2OCwgMHgyMywgMHg4NSwgMHgyYSwgMHhjYywgMHhkZSwgMHhhNCwgMHgwYSwgMHhkOCwgMHgwMiwgMHgwMCwgMHgxMiwKKyAgMHg1MCwgMHgzMCwgMHhmZiwgMHg0NiwgMHg4YywgMHg2NiwgMHhkOCwgMHhlYiwgMHhlMiwgMHgyNywgMHhkMSwgMHg1OSwKKyAgMHg3ZCwgMHhkNywgMHhjNiwgMHgxZCwgMHgyNiwgMHg0MywgMHgzNCwgMHhjYSwgMHhmMCwgMHgwYSwgMHhlZCwgMHg3MSwKKyAgMHhiZSwgMHg4MiwgMHgwMywgMHgxOCwgMHhlMiwgMHg4OCwgMHhiNCwgMHhkMywgMHgyYywgMHg2OCwgMHgxZSwgMHgyYiwKKyAgMHhkNCwgMHhjNiwgMHhlNywgMHhiNSwgMHg2NSwgMHgwMCwgMHg2NSwgMHhiYywgMHhiNSwgMHg4NywgMHhlNSwgMHhmMSwKKyAgMHgxNiwgMHg3MCwgMHhmNCwgMHgyNSwgMHhmMywgMHgzYywgMHg0NiwgMHg3MiwgMHg0ZSwgMHgwYiwgMHg3MywgMHgxMCwKKyAgMHgyMCwgMHgxNiwgMHhjNywgMHg3ZCwgMHhiZSwgMHg5OCwgMHg3YiwgMHgxYiwgMHhhNSwgMHgyNSwgMHg3YSwgMHhmYSwKKyAgMHg3NywgMHhlNCwgMHg4NywgMHgyMCwgMHhlOSwgMHg0ZSwgMHg0OCwgMHhmMSwgMHgzYiwgMHg0MiwgMHhjYiwgMHg1NywKKyAgMHhjMSwgMHg4YiwgMHhhNCwgMHhjYywgMHhhYiwgMHhiYSwgMHg3ZiwgMHg1ZSwgMHhmYiwgMHg4MSwgMHg5MywgMHhlNCwKKyAgMHhhOCwgMHhiNSwgMHhiMCwgMHhjYywgMHg0ZSwgMHg1YiwgMHhhMiwgMHhkNywgMHhiNywgMHgzOCwgMHgwNiwgMHg5YSwKKyAgMHg2NCwgMHg5ZCwgMHhmYSwgMHgxNSwgMHgzMywgMHgxZiwgMHg0NiwgMHg1MiwgMHhkMSwgMHgxMSwgMHgwYSwgMHgwMiwKKyAgMHhiZSwgMHg3NCwgMHhhZCwgMHgzYSwgMHgwMiwgMHg3OCwgMHgwNSwgMHhmYSwgMHg1YywgMHhlNCwgMHhhNywgMHg5NywKKyAgMHg0YiwgMHgyNiwgMHgwMSwgMHgzMywgMHgwOSwgMHhhMCwgMHhjOCwgMHhmZSwgMHhhYywgMHhiYSwgMHg4ZSwgMHg1YiwKKyAgMHg4MywgMHgwMywgMHhhMSwgMHg0NiwgMHhmOCwgMHhjYywgMHgyOSwgMHhkMSwgMHhjYiwgMHhiMCwgMHg4NiwgMHhkMCwKKyAgMHhiOCwgMHg1ZiwgMHg0NiwgMHhlZiwgMHhhMSwgMHg0MSwgMHg4ZCwgMHhhYiwgMHg1NiwgMHg4MiwgMHg0NiwgMHgyYSwKKyAgMHhhMSwgMHg0NCwgMHg0NCwgMHgwYiwgMHg3YSwgMHgxNiwgMHg1MCwgMHg3ZiwgMHg1MCwgMHhmYiwgMHgzMywgMHg4NCwKKyAgMHhmYiwgMHhlZSwgMHg5ZSwgMHg4YywgMHhmNiwgMHg0OSwgMHhmMSwgMHg1NiwgMHg0ZSwgMHg5NSwgMHg4NSwgMHg4MiwKKyAgMHg3ZSwgMHg3ZSwgMHgzZiwgMHg5OSwgMHhlOCwgMHhmZCwgMHgyZiwgMHg1NywgMHg1YywgMHhjMCwgMHgwZiwgMHgzZSwKKyAgMHhiNiwgMHgxYSwgMHgzYywgMHg4YSwgMHg4MywgMHg2MSwgMHg0MCwgMHg4YywgMHgzYiwgMHhiYSwgMHhhOSwgMHg0YSwKKyAgMHg5MiwgMHhiYSwgMHhjOCwgMHgwZCwgMHhjMCwgMHgwMCwgMHgxNSwgMHg2OCwgMHhlNCwgMHgzOSwgMHgyNywgMHgyNywKKyAgMHg0NCwgMHhhOCwgMHhhMCwgMHgyYSwgMHgzNiwgMHhhYSwgMHgzOSwgMHgxZiwgMHhiNywgMHhhYywgMHg1MiwgMHgwMywKKyAgMHg0MCwgMHgxMywgMHg2MywgMHgxZSwgMHgyZCwgMHg0NSwgMHg4MiwgMHg3YSwgMHgyNiwgMHg4YiwgMHg5YSwgMHgwOCwKKyAgMHhhNSwgMHg3YiwgMHhiNiwgMHgzOSwgMHg0ZSwgMHg5NiwgMHg1NiwgMHhhOCwgMHg2NSwgMHgxMywgMHhmNywgMHhjNSwKKyAgMHhmNCwgMHg0YSwgMHgzOCwgMHhhZCwgMHg0ZCwgMHgyNCwgMHg5ZCwgMHg2ZiwgMHg3MywgMHgyMywgMHg2MSwgMHg3NCwKKyAgMHhkZSwgMHgwYiwgMHgyZiwgMHg1YywgMHhiMywgMHgzYiwgMHgzNiwgMHhmNiwgMHhkYSwgMHg5YiwgMHhmMywgMHhlOSwKKyAgMHhmOCwgMHhhZCwgMHhjZSwgMHg0ZSwgMHhjNSwgMHhjOSwgMHg2MywgMHhlYywgMHhkMSwgMHhkMiwgMHhkYiwgMHhmMSwKKyAgMHhjMiwgMHhlNiwgMHgxNCwgMHg5ZCwgMHgzZCwgMHhkYSwgMHg3OCwgMHg1YSwgMHgxOSwgMHg2YSwgMHhlNCwgMHhlZCwKKyAgMHg2OSwgMHhmNSwgMHg1ZCwgMHgxZiwgMHg1NiwgMHhiZSwgMHg3YywgMHg5MSwgMHgyOCwgMHhkZSwgMHgwZiwgMHg1NCwKKyAgMHhmNywgMHhkMCwgMHg2YSwgMHgxYSwgMHgxMSwgMHgwMiwgMHgwNiwgMHhlOCwgMHgxNSwgMHg4ZSwgMHgyMywgMHg0ZiwKKyAgMHhjNSwgMHgzMywgMHg1OCwgMHg2YywgMHhhMywgMHgyMSwgMHg4MiwgMHg4NywgMHhjMSwgMHhjMywgMHgyZiwgMHgxYiwKKyAgMHgxMywgMHgzZCwgMHg4NiwgMHgyZCwgMHhlYywgMHhlMiwgMHgzNywgMHg2NSwgMHhlOSwgMHgyZCwgMHg5MywgMHhkYywKKyAgMHg1ZCwgMHgzYiwgMHg3YiwgMHg5YSwgMHhmNiwgMHg5OCwgMHhjNCwgMHgyMiwgMHg5ZCwgMHgyNCwgMHgxMCwgMHg5OSwKKyAgMHg5MywgMHgwZCwgMHg1YSwgMHg1MSwgMHhmNywgMHg5NywgMHhiMSwgMHg2MiwgMHhhNSwgMHg4YSwgMHg5MiwgMHg1MCwKKyAgMHhiNywgMHhmNywgMHhhZiwgMHgxZSwgMHg1ZiwgMHhkYiwgMHhiZiwgMHhiNCwgMHhmYywgMHhjOCwgMHg3MCwgMHgyMSwKKyAgMHgxYSwgMHg4OCwgMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZSwgMHhmMywgMHg2NSwgMHhhNSwgMHhhMCwgMHg4OCwKKyAgMHhlYSwgMHg0NCwgMHgyMSwgMHgwOSwgMHgwNSwgMHgwNCwgMHgxMCwgMHhiMywgMHg4OCwgMHg2ZSwgMHg1NiwgMHhhMCwKKyAgMHgwNiwgMHhjMCwgMHgwOSwgMHg0MiwgMHg1NSwgMHhhNSwgMHg3YiwgMHg4OSwgMHhiNywgMHg4YiwgMHhlMSwgMHhkMywKKyAgMHgyMCwgMHgzYiwgMHgxNiwgMHgwZSwgMHg5MywgMHhlZiwgMHg3YiwgMHhhYSwgMHhlMywgMHhmYSwgMHg5ZiwgMHhjYSwKKyAgMHg5MCwgMHhjNSwgMHg2YywgMHg1YiwgMHg2ZSwgMHg0ZCwgMHgwZCwgMHhkNywgMHg3NiwgMHhhNCwgMHg2OSwgMHgyMywKKyAgMHg5MiwgMHg1NiwgMHg2NSwgMHg0YiwgMHhlOSwgMHg2YSwgMHgwYSwgMHgzNiwgMHgyOSwgMHg2NSwgMHg4NywgMHhjZiwKKyAgMHhiYiwgMHgwMCwgMHgwNiwgMHgwYywgMHg0ZiwgMHg1MiwgMHhkZSwgMHhmNCwgMHg0YiwgMHg2NywgMHhjYiwgMHgyNSwKKyAgMHhmYywgMHhjZCwgMHhhZSwgMHhiYiwgMHgzNywgMHgxOSwgMHg5MCwgMHgyYiwgMHgwMywgMHg2OSwgMHg2ZiwgMHhiMiwKKyAgMHhhMSwgMHgyYywgMHg2MywgMHgxMSwgMHgyZCwgMHhlZiwgMHgyNCwgMHg5YiwgMHg2MSwgMHhjYSwgMHgyNCwgMHg4OCwKKyAgMHhkMiwgMHhlNCwgMHg4MywgMHg2MSwgMHg2MiwgMHhhNiwgMHg1MywgMHgwMywgMHg3NSwgMHgxMiwgMHhiNywgMHgzMCwKKyAgMHhlYSwgMHg0ZCwgMHgyYSwgMHhhNiwgMHg3MSwgMHg2NywgMHg2YSwgMHgyNiwgMHg4OCwgMHg2ZiwgMHg0OCwgMHg3MiwKKyAgMHg0YiwgMHgyNSwgMHg4YSwgMHhjOCwgMHg5ZCwgMHhjNSwgMHgwYywgMHg1ZCwgMHhkNSwgMHhkMiwgMHg2ZiwgMHhjOCwKKyAgMHg3MiwgMHg5NiwgMHgxYywgMHg0ZiwgMHhkNiwgMHhjOSwgMHg1NCwgMHg2OCwgMHgyZiwgMHg5OSwgMHgzMywgMHg5OSwKKyAgMHhiMCwgMHhjYiwgMHhiMiwgMHgwMiwgMHgxYSwgMHhmNCwgMHgwYywgMHhjZSwgMHg4OCwgMHhlZSwgMHg2ZSwgMHhlZiwKKyAgMHg2NSwgMHhlMCwgMHg0MSwgMHgwMiwgMHgyYywgMHgwMSwgMHgzNSwgMHhhMiwgMHg2MiwgMHg5ZSwgMHg0YywgMHgzMiwKKyAgMHgyNCwgMHg0NiwgMHg2MSwgMHgzYiwgMHhkNiwgMHhmMywgMHg4YiwgMHg4OSwgMHg2NCwgMHg0YiwgMHhmMiwgMHhhOSwKKyAgMHgwMCwgMHhmMywgMHhhOSwgMHgzZCwgMHhjNiwgMHgxOSwgMHg5YywgMHgyMywgMHg0YSwgMHhkZiwgMHhjMSwgMHg1NSwKKyAgMHg0NiwgMHhkOCwgMHg5YiwgMHhkOCwgMHgyZiwgMHhkYiwgMHg0NiwgMHhiYiwgMHg0YSwgMHg5MiwgMHg3NSwgMHg0MCwKKyAgMHhhMiwgMHgzYiwgMHgyZCwgMHhlYiwgMHg3MiwgMHgxNywgMHhkZiwgMHgxNywgMHhjNiwgMHgyMCwgMHhmMSwgMHhlYiwKKyAgMHg0NiwgMHgxMSwgMHgxMSwgMHg3MCwgMHgzNywgMHgwZSwgMHhkNSwgMHgwMSwgMHg1MywgMHg4YSwgMHg4MywgMHg2NSwKKyAgMHg0NSwgMHgwMCwgMHg0MCwgMHg5MCwgMHgwNCwgMHhhNywgMHg4ZCwgMHgyZiwgMHhmYiwgMHhiZiwgMHhhYywgMHhlYywKKyAgMHg1YSwgMHgwMSwgMHgyYywgMHhkMSwgMHhmOSwgMHg5YSwgMHg4YiwgMHgyNSwgMHg0YSwgMHgzZSwgMHg3YSwgMHhiYSwKKyAgMHg3NCwgMHg3MywgMHhiMCwgMHg0ZiwgMHgwOSwgMHhlMywgMHhiMywgMHhhNiwgMHgzYywgMHg4YywgMHgzOCwgMHg0YywKKyAgMHg3ZCwgMHg0OCwgMHhkYywgMHgzMiwgMHgwNSwgMHhlYiwgMHgyNywgMHhjYywgMHhjNiwgMHgwMywgMHhjYiwgMHg4NCwKKyAgMHg1MCwgMHhmMywgMHg3NSwgMHhlMCwgMHhlYSwgMHgzNCwgMHhkOSwgMHg0MSwgMHgwYiwgMHg5MSwgMHg5NCwgMHhkOSwKKyAgMHhlNywgMHg1NSwgMHhkMywgMHg0NiwgMHgyOSwgMHg4OCwgMHg2ZCwgMHg3MiwgMHg1NiwgMHgzZCwgMHhkYywgMHgzYSwKKyAgMHgwYiwgMHg4YSwgMHg5OCwgMHg0NSwgMHhiNSwgMHgxNywgMHg0NSwgMHgwZCwgMHg3MywgMHhlNSwgMHhmNSwgMHgwMiwKKyAgMHg5MSwgMHg1OCwgMHg2MiwgMHhkMywgMHhjMCwgMHhkNCwgMHhlOCwgMHg1YywgMHhmNCwgMHgyYSwgMHhlOSwgMHg4OSwKKyAgMHhmMywgMHg2OCwgMHg5NSwgMHhjYiwgMHgxMywgMHhhMSwgMHhlNCwgMHhjZSwgMHg3OCwgMHg4OSwgMHgxMiwgMHg0NywKKyAgMHhmZSwgMHhjZiwgMHhiMSwgMHg1ZiwgMHhmMiwgMHg1MiwgMHhmOCwgMHhkZSwgMHhlZiwgMHhkMiwgMHg3ZiwgMHg3NSwKKyAgMHhiOSwgMHhmMCwgMHgwOCwgMHg0MCwgMHgzNCwgMHgwZSwgMHhlNCwgMHhmMSwgMHgxYSwgMHg0MiwgMHg4MywgMHhiZCwKKyAgMHg1ZSwgMHhmYywgMHg0OSwgMHgzNywgMHgxMSwgMHg0NiwgMHg5YSwgMHg2YywgMHgzZCwgMHhkMiwgMHg5YSwgMHgxNywKKyAgMHg5YSwgMHg3MywgMHg1NywgMHhiNiwgMHhmNSwgMHg1MywgMHg4OSwgMHg2NywgMHhjMiwgMHhiMiwgMHg2YSwgMHhmNCwKKyAgMHhhZiwgMHhmMCwgMHgwOCwgMHhhZSwgMHhkOCwgMHg2ZCwgMHhhYywgMHg3MiwgMHhhYywgMHhlZiwgMHhlMiwgMHg4YiwKKyAgMHhmMywgMHg3OSwgMHg3YywgMHgxZiwgMHg1MywgMHhkNiwgMHhmYSwgMHhiZiwgMHgxMiwgMHgwMCwgMHgzOCwgMHgyMSwKKyAgMHgxYSwgMHg4OCwgMHgwMCwgMHg3ZiwgMHhmZiwgMHhmZiwgMHhmZSwgMHhlZCwgMHg2ZCwgMHg2MSwgMHhhMSwgMHg4OSwKKyAgMHhhYywgMHg0OCwgMHgxMiwgMHg4NCwgMHgwMSwgMHg1MSwgMHg5NSwgMHgyYSwgMHgwMywgMHg3NywgMHgwMCwgMHgwOCwKKyAgMHgyNCwgMHhkOCwgMHg5MywgMHhjMSwgMHgyYSwgMHg4OCwgMHg5MSwgMHg1NCwgMHg0MiwgMHgyOCwgMHg2NCwgMHhlMiwKKyAgMHgxMCwgMHg0YywgMHgzYSwgMHg4ZSwgMHgyNiwgMHgwNCwgMHgxZSwgMHhlOCwgMHhiMywgMHhjMiwgMHgzZSwgMHgwZSwKKyAgMHg3ZSwgMHg2ZCwgMHhmZCwgMHgxZCwgMHg2YiwgMHg0YywgMHg2OSwgMHhlZiwgMHhmZSwgMHg0NiwgMHg1MywgMHg3YywKKyAgMHgzYSwgMHhkMiwgMHhjNiwgMHhkNCwgMHhiOCwgMHgzOCwgMHg2MSwgMHgwNiwgMHhhMywgMHg1ZSwgMHg3ZSwgMHgwYSwKKyAgMHgwYiwgMHhkMSwgMHgzNCwgMHg1ZSwgMHg5NiwgMHg4YywgMHgyOCwgMHgxMiwgMHg1YSwgMHhjOCwgMHgyMCwgMHhhNCwKKyAgMHhjNiwgMHgyYiwgMHgwMCwgMHg4ZiwgMHgyMywgMHhiNiwgMHgwNiwgMHhlNywgMHhlMywgMHg4MCwgMHg5MSwgMHg4OCwKKyAgMHhkZiwgMHgzMCwgMHhhNSwgMHg4ZCwgMHg5YSwgMHg1NSwgMHg4MiwgMHhmMCwgMHgzMSwgMHg4ZCwgMHg0NywgMHgwYiwKKyAgMHgxNiwgMHhiZiwgMHg0NSwgMHg5MiwgMHg5NCwgMHhjNiwgMHg5OCwgMHgyMSwgMHhmMywgMHhkNSwgMHgwNywgMHhkOSwKKyAgMHhjYywgMHg3MSwgMHhlMywgMHgyNywgMHg1YSwgMHg1YSwgMHhiMSwgMHhmMSwgMHg4MSwgMHhmYywgMHgyYSwgMHgwNywKKyAgMHhmZCwgMHg0NSwgMHhmOCwgMHg2NSwgMHgzOSwgMHg4ZSwgMHg4OCwgMHg1NCwgMHhmZiwgMHg3ZCwgMHg3NCwgMHg0NSwKKyAgMHgwZiwgMHg4YiwgMHgzNSwgMHgyMSwgMHhmNCwgMHg1OSwgMHhlZCwgMHhmYiwgMHhhNiwgMHg3NiwgMHg3YywgMHg4ZCwKKyAgMHg5NSwgMHgxNCwgMHhlOSwgMHg5MCwgMHg4YSwgMHhmMywgMHg2OCwgMHgyNywgMHg4MCwgMHgzNSwgMHgzMCwgMHhhMiwKKyAgMHg0YywgMHg4YywgMHgxYSwgMHgxMCwgMHhlYSwgMHhjOCwgMHg4YywgMHhjOCwgMHhlNSwgMHhiNiwgMHgyMiwgMHgxZSwKKyAgMHhlNiwgMHhiMSwgMHg0YiwgMHgxMCwgMHg5YywgMHhhNCwgMHhkZiwgMHhjYywgMHgwMywgMHhlMCwgMHhkMSwgMHgzZSwKKyAgMHhmYiwgMHg2NSwgMHgzZCwgMHgwZCwgMHgyMCwgMHg3OCwgMHg5NSwgMHgyZSwgMHg4YywgMHg4MywgMHgzMiwgMHhlZiwKKyAgMHhjZCwgMHg4MywgMHgwOSwgMHgxNCwgMHgyMiwgMHg5NywgMHg4ZCwgMHg0YiwgMHgyMSwgMHgxZCwgMHg2ZSwgMHg4ZSwKKyAgMHhmMywgMHgzNSwgMHgxMywgMHhhMSwgMHg0NiwgMHg5NSwgMHg4NiwgMHg3ZiwgMHg3ZiwgMHg4NywgMHgxZiwgMHg0ZSwKKyAgMHg3MywgMHgwMCwgMHgwZiwgMHgzZSwgMHhjNSwgMHgyOSwgMHg0NSwgMHgwNiwgMHhjMSwgMHg4MSwgMHhiOCwgMHg3NiwKKyAgMHgwMCwgMHhhNCwgMHg1NCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg1OCwgMHgzNiwgMHg3NCwgMHgzNCwgMHhkNiwgMHhiNCwKKyAgMHhhMiwgMHgyOCwgMHgxZiwgMHg0YywgMHhkZCwgMHg3MiwgMHhjZSwgMHhhZSwgMHhiMCwgMHg3NCwgMHg3NiwgMHhlYywKKyAgMHg2YiwgMHg1MCwgMHhlZiwgMHhhNSwgMHg5OSwgMHgxMSwgMHg2NCwgMHgzZSwgMHg0ZiwgMHhhZSwgMHg3NywgMHg3YiwKKyAgMHhmZCwgMHhmMSwgMHhiZSwgMHg5ZSwgMHhhNiwgMHg2OCwgMHg0ZiwgMHhiNCwgMHg0YSwgMHgyYywgMHgzYiwgMHhjZiwKKyAgMHgwZCwgMHhkOCwgMHhhOCwgMHhlMiwgMHg4OCwgMHg4MywgMHgxNCwgMHg0YiwgMHgzMCwgMHhjNiwgMHg5NywgMHg3YiwKKyAgMHg2MiwgMHhiOCwgMHgwMywgMHgyMSwgMHg1OCwgMHg1ZCwgMHg3MywgMHg4YiwgMHg3MSwgMHgwMSwgMHhiNSwgMHg3NiwKKyAgMHgyMywgMHhlNiwgMHhiYywgMHg3NSwgMHhhZiwgMHhhMSwgMHhjZSwgMHgzNywgMHhlYSwgMHhiZCwgMHhlMSwgMHg0YywKKyAgMHhmNSwgMHg0MiwgMHgwZCwgMHg3MSwgMHg1YiwgMHhjMiwgMHhjNiwgMHgzZCwgMHhkOSwgMHhjNSwgMHgxYSwgMHg5MywKKyAgMHg3MywgMHhmZCwgMHg5ZiwgMHhkOCwgMHgzMywgMHhlMiwgMHgyNSwgMHgxMCwgMHg3YiwgMHhiNCwgMHhiZCwgMHg2MCwKKyAgMHhmNywgMHgxOSwgMHgzMSwgMHhjYSwgMHg4NiwgMHg5NywgMHg3MSwgMHhhYSwgMHg2YiwgMHg4OSwgMHg0NSwgMHg4NSwKKyAgMHg5NiwgMHhkNSwgMHhlZCwgMHg0MSwgMHgzMCwgMHg4MCwgMHhhMiwgMHg0MiwgMHg4OCwgMHhiYiwgMHhjOSwgMHhkNSwKKyAgMHhlZCwgMHhjYiwgMHg0OCwgMHg2NCwgMHg2MCwgMHg0ZSwgMHhhNiwgMHhmZCwgMHhhMywgMHhmMiwgMHhmNiwgMHgxMywKKyAgMHg3NCwgMHg4ZCwgMHhlNywgMHg0MSwgMHg1MSwgMHg4ZiwgMHg3NSwgMHg4ZCwgMHhhZiwgMHhkOSwgMHgxNiwgMHhiMSwKKyAgMHhhNywgMHg1NywgMHhjMCwgMHhmYSwgMHhiOSwgMHhmMCwgMHhmYywgMHhmZSwgMHhlYiwgMHg4ZCwgMHhiNCwgMHgwMywKKyAgMHgwNywgMHgyMSwgMHgxYSwgMHg4YywgMHgwMCwgMHgwMSwgMHhmZiwgMHhmZiwgMHhmZSwgMHhlZCwgMHg2ZiwgMHg2MiwKKyAgMHg4YSwgMHgxMCwgMHg4NCwgMHgzNCwgMHgxNCwgMHgxMSwgMHg0MiwgMHg2MiwgMHhhYSwgMHhmMywgMHg4MSwgMHg4OCwKKyAgMHgyOCwgMHg1MCwgMHgyMCwgMHgwNCwgMHg5MSwgMHg4MywgMHgzMiwgMHgzMSwgMHgxMSwgMHgzMCwgMHgyOCwgMHg3OCwKKyAgMHhkYSwgMHg0YiwgMHhmYSwgMHhiNiwgMHg3MSwgMHg4OSwgMHhhOCwgMHgxZSwgMHg5MywgMHg2MSwgMHhjZCwgMHg5YywKKyAgMHg1MywgMHg3MiwgMHg3MywgMHg3OSwgMHhmNiwgMHgxZiwgMHgyNCwgMHg1OCwgMHhmMywgMHg1YiwgMHg2NSwgMHhhNywKKyAgMHg5YiwgMHgyMywgMHhjOCwgMHg3MiwgMHhiOSwgMHg4ZSwgMHg4OCwgMHgxMSwgMHg2NSwgMHg0NywgMHhhNywgMHg4ZiwKKyAgMHg4OCwgMHg2OCwgMHhmOSwgMHgxNSwgMHhjNCwgMHg5NSwgMHgyNiwgMHhjZCwgMHgwZCwgMHhhOCwgMHg1ZiwgMHgxNiwKKyAgMHhkOCwgMHhlYywgMHhjNiwgMHhhNywgMHgzOCwgMHgwYiwgMHgwYywgMHgwYiwgMHgyMywgMHgwYSwgMHg5YiwgMHhhMiwKKyAgMHhjZiwgMHhjNywgMHgwZCwgMHgzZCwgMHgzNywgMHg4ZiwgMHg3YSwgMHg3ZCwgMHg1NywgMHhkNSwgMHg1OSwgMHgzNiwKKyAgMHg2MiwgMHg4NCwgMHhiYSwgMHhkZSwgMHhmMiwgMHg2NCwgMHg3NywgMHhlNywgMHhhNiwgMHg5NSwgMHg0ZCwgMHg3MywKKyAgMHgzYywgMHgwNywgMHg5YSwgMHhiOSwgMHhlNCwgMHg2NiwgMHgyMSwgMHhjMSwgMHgxZSwgMHg3MSwgMHgxMywgMHg2MCwKKyAgMHg3YiwgMHgyNCwgMHhhZCwgMHg0YiwgMHg2MSwgMHg0NywgMHg0MCwgMHhmNCwgMHhlYSwgMHhmMiwgMHhjNiwgMHhjZCwKKyAgMHgwNSwgMHg1YywgMHg0MiwgMHg5ZSwgMHg2ZSwgMHhiZSwgMHgxYSwgMHg0YiwgMHhhYiwgMHg5MCwgMHhiNSwgMHgyOSwKKyAgMHg4NywgMHg1MSwgMHg5ZSwgMHg2OSwgMHg3NywgMHhlZCwgMHg2OCwgMHgzMiwgMHhiNiwgMHhiZSwgMHhhMywgMHg5MywKKyAgMHg5YSwgMHg2NywgMHhjMiwgMHhkMywgMHhjNywgMHgxNywgMHg4NCwgMHhmMCwgMHg2MSwgMHg4OCwgMHg3NCwgMHhkNiwKKyAgMHg1MSwgMHg5MCwgMHg1YiwgMHg0MCwgMHg4NCwgMHgzNiwgMHg2NywgMHg0MCwgMHhhNCwgMHhjZiwgMHg2ZSwgMHhkZCwKKyAgMHgzNiwgMHg1YiwgMHhhOCwgMHhkZSwgMHhhNCwgMHg1YywgMHhmYiwgMHhjZiwgMHhmNywgMHhlNSwgMHgyNiwgMHg4NCwKKyAgMHg1ZCwgMHg0NiwgMHhiYSwgMHg2NCwgMHg4ZCwgMHg4MywgMHgwMCwgMHhhOSwgMHhiYSwgMHhkMiwgMHhkOCwgMHhiYywKKyAgMHg4ZCwgMHhjNiwgMHhiYywgMHhkZCwgMHhhZCwgMHg1OSwgMHhmYiwgMHg1MiwgMHg3ZiwgMHhlZCwgMHgyMSwgMHhjZCwKKyAgMHhkYiwgMHhiMSwgMHhkOSwgMHhmYywgMHhmZCwgMHgzZCwgMHg3OCwgMHhmOSwgMHg3YiwgMHg3OCwgMHgwMCwgMHgzYiwKKyAgMHhiMCwgMHg3ZSwgMHgyNSwgMHgxNCwgMHgxNCwgMHgxMSwgMHg0MiwgMHhlNiwgMHgyOSwgMHgyNSwgMHg1NCwgMHhhYiwKKyAgMHhhYSwgMHg1OCwgMHgzMCwgMHgwOCwgMHhhMSwgMHgxMSwgMHgxNCwgMHgyOSwgMHhiZCwgMHhlMywgMHg3YSwgMHg1YSwKKyAgMHgxMywgMHg5OSwgMHhhZiwgMHgwZSwgMHhjNywgMHgzYSwgMHg2OSwgMHg0MCwgMHg2NSwgMHgwMiwgMHhiMywgMHg0MSwKKyAgMHhkYSwgMHhiZiwgMHg1MSwgMHhiOSwgMHgyNywgMHhkMCwgMHhjMCwgMHgzMCwgMHg2NywgMHgzMCwgMHgzOCwgMHhjOCwKKyAgMHgwZiwgMHgwYSwgMHgwNCwgMHgzYywgMHg5NSwgMHgwZiwgMHg5MSwgMHg5NiwgMHgyOCwgMHg3ZSwgMHg1ZiwgMHg1NCwKKyAgMHg0OSwgMHgxMywgMHgyMCwgMHhkMywgMHhkMCwgMHg0OCwgMHhiYiwgMHhhZSwgMHgxMiwgMHgwMiwgMHg5NSwgMHhhMSwKKyAgMHhjMSwgMHg1YSwgMHg2NywgMHhkOSwgMHg0YiwgMHg3OSwgMHg1MCwgMHgyOCwgMHg1MywgMHhjOSwgMHgwMSwgMHgwYiwKKyAgMHhhZSwgMHhmYiwgMHhmMCwgMHg1ZCwgMHhhMSwgMHg2NywgMHhhMywgMHhjMiwgMHg0NywgMHgzNiwgMHg5ZiwgMHg3NywKKyAgMHhhOCwgMHg0MiwgMHg0YSwgMHhkNCwgMHhlZCwgMHhkYywgMHg2ZCwgMHgyYywgMHg3MCwgMHhjOCwgMHgxOSwgMHhjMiwKKyAgMHg0MiwgMHhkZSwgMHgwNCwgMHhkOCwgMHg4NCwgMHgxMSwgMHg3OCwgMHhmMSwgMHhkYSwgMHg5ZSwgMHhiYSwgMHg0ZSwKKyAgMHg0OSwgMHhjYywgMHg4OSwgMHgwMCwgMHhkYywgMHgzNCwgMHg4YSwgMHgxMCwgMHhhNiwgMHhjYSwgMHgxMiwgMHgwNSwKKyAgMHg3MSwgMHg1OCwgMHg0NCwgMHg4OCwgMHg1MywgMHg0ZiwgMHhiZiwgMHg4ZSwgMHg4MSwgMHhhMywgMHgxYSwgMHg0NiwKKyAgMHhhYSwgMHhmZCwgMHhmMSwgMHhkOSwgMHhjOCwgMHgwNCwgMHg4ZCwgMHg3NiwgMHg2OSwgMHgxZiwgMHg3NywgMHhhMywKKyAgMHg5ZiwgMHhiZiwgMHhmMCwgMHhmNCwgMHhlNiwgMHg0MCwgMHgzOCwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgzZiwKKyAgMHhmZiwgMHhmZiwgMHhmZSwgMHhmZiwgMHg2YywgMHg4MSwgMHhhMSwgMHgwYSwgMHgwOCwgMHgyNiwgMHgxNCwgMHgwOSwKKyAgMHg0MiwgMHhkMCwgMHhiNiwgMHg1YSwgMHhlNiwgMHhmNCwgMHgwMSwgMHg4MCwgMHg0MCwgMHgyYSwgMHhlYSwgMHhlOCwKKyAgMHgyZCwgMHg4ZSwgMHgyYSwgMHhmYSwgMHhhZSwgMHgwMSwgMHgxYiwgMHgzNiwgMHhjMywgMHhlZCwgMHhkNiwgMHg2NSwKKyAgMHg0MCwgMHhjMiwgMHhiOSwgMHgyNywgMHg4YywgMHhmMiwgMHgzNiwgMHg0OSwgMHhjMywgMHhmNSwgMHhhNiwgMHgxOSwKKyAgMHg3ZSwgMHhiOCwgMHhmNCwgMHg4NSwgMHgzMSwgMHgyMywgMHg5ZiwgMHg3ZSwgMHgyZiwgMHhhYSwgMHhlMSwgMHhlMSwKKyAgMHgwNywgMHg0MCwgMHg1MiwgMHhkMSwgMHgyOCwgMHhjOCwgMHgwNywgMHhmZSwgMHhjNiwgMHg1YywgMHg3ZiwgMHgzNCwKKyAgMHg3MCwgMHhiYSwgMHg3NCwgMHhlYywgMHg4NywgMHhlMSwgMHg4OSwgMHg3NCwgMHgwOSwgMHg4ZiwgMHhlOCwgMHg3ZSwKKyAgMHhmYSwgMHhmYywgMHg0ZCwgMHhmYywgMHg2NiwgMHgwMiwgMHhmNiwgMHhiMiwgMHg2MiwgMHg4NiwgMHgzOCwgMHhjOSwKKyAgMHg4YywgMHgwMywgMHgyMywgMHgwMiwgMHg0OCwgMHgwNCwgMHgxMiwgMHg1NiwgMHgxMiwgMHg3NCwgMHgyMCwgMHhkOSwKKyAgMHgwZSwgMHhiMywgMHhiZCwgMHg2YSwgMHgyOSwgMHgwOCwgMHhmMSwgMHhmNiwgMHhjOCwgMHg5YSwgMHgyOCwgMHhmYywKKyAgMHhkZSwgMHgxNCwgMHg2MCwgMHhiZSwgMHg2NiwgMHgzOSwgMHg2NCwgMHg2YSwgMHgzOCwgMHhkZCwgMHhkMSwgMHgxZSwKKyAgMHhiYSwgMHhkNywgMHg2YSwgMHhmMSwgMHg3YSwgMHhhOSwgMHg1ZiwgMHhiMywgMHg2ZiwgMHgzNCwgMHgyYSwgMHgyZiwKKyAgMHgyNywgMHg3NSwgMHhmMCwgMHhlZSwgMHg2OSwgMHgyYywgMHhjOCwgMHhmYiwgMHhkMiwgMHgxYSwgMHhmMSwgMHg3ZSwKKyAgMHhkYSwgMHhmNSwgMHhlYiwgMHgzMCwgMHhlMywgMHhmOSwgMHhjYywgMHgxMywgMHg4YSwgMHhiNSwgMHhjYiwgMHg5ZCwKKyAgMHg0YywgMHg5MCwgMHgyZSwgMHgzMSwgMHhiMiwgMHg2MSwgMHgyYSwgMHgzZCwgMHhkZCwgMHg5YywgMHhmYiwgMHhlYiwKKyAgMHhjNiwgMHg4MSwgMHhhMSwgMHhhOSwgMHg5MiwgMHhlYiwgMHg2YywgMHg4YywgMHhhOSwgMHg2YywgMHhjZSwgMHhiOSwKKyAgMHgyYiwgMHgwMiwgMHgxNCwgMHg0MywgMHg4NiwgMHgyMiwgMHgyOCwgMHgxNCwgMHg5YywgMHg0OSwgMHg3OSwgMHg3MiwKKyAgMHg5ZSwgMHhiMiwgMHg5MSwgMHhhMCwgMHg0YSwgMHg2NCwgMHg5ZCwgMHhiYSwgMHgyNSwgMHhkNiwgMHg3YSwgMHhiZCwKKyAgMHgxZiwgMHg5NywgMHhjZiwgMHhlMSwgMHhjOCwgMHgwMSwgMHhlMywgMHhkYSwgMHhhNiwgMHgyOCwgMHhhMCwgMHhhMCwKKyAgMHg2ZSwgMHgxZCwgMHg4MCwgMHg0YSwgMHg4OCwgMHgyOCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg2MCwgMHg1NiwgMHg5ZSwKKyAgMHhlZSwgMHhjNSwgMHg1NSwgMHhjZCwgMHgyOSwgMHg4MiwgMHg1NSwgMHg3OCwgMHhlZCwgMHhkNSwgMHhiMywgMHgyOSwKKyAgMHgwOSwgMHgzYSwgMHhkNywgMHgwYywgMHgwNiwgMHg3MiwgMHgxNSwgMHgwZiwgMHg5ZSwgMHgwOCwgMHhiYywgMHhlNywKKyAgMHhiNSwgMHhkMywgMHg0NiwgMHg4NCwgMHg0MiwgMHg3MywgMHhhMiwgMHhkYSwgMHgzMSwgMHhhOSwgMHgyNywgMHg2ZiwKKyAgMHg0YiwgMHhmNiwgMHhiMywgMHhhYywgMHhjMywgMHg5ZSwgMHhiNCwgMHhkNSwgMHhmOCwgMHhiYiwgMHg5ZiwgMHhiZCwKKyAgMHg5MSwgMHgyMiwgMHhiNSwgMHhmZCwgMHhiYSwgMHg5MSwgMHhjMSwgMHg2ZSwgMHhiMCwgMHhkNSwgMHg3MCwgMHgzOCwKKyAgMHg2MiwgMHgzYiwgMHgwNiwgMHgyMCwgMHhkYywgMHg2MiwgMHhjZCwgMHgxZiwgMHg2NywgMHhkOSwgMHhmMSwgMHhmMiwKKyAgMHhmYSwgMHgwMCwgMHhiMiwgMHgzMSwgMHgwMiwgMHgxZiwgMHgzZSwgMHhkZiwgMHg5NywgMHgyNSwgMHhhNiwgMHhlMSwKKyAgMHg1MSwgMHhiYSwgMHgzNywgMHg0YywgMHgxMiwgMHgxZCwgMHg0YywgMHgzYSwgMHhiZSwgMHg0MSwgMHhjNCwgMHgzYiwKKyAgMHgyNCwgMHg5ZiwgMHg1ZiwgMHhmOSwgMHhhYSwgMHg3YiwgMHhkZCwgMHg1YywgMHhhOCwgMHg0NiwgMHg3NywgMHhhMSwKKyAgMHg0YSwgMHhmNCwgMHgyNCwgMHhkMSwgMHhhYywgMHg0NiwgMHg0YywgMHhkYiwgMHhlYiwgMHg4MiwgMHg5OCwgMHgzMywKKyAgMHgzMywgMHg4ZCwgMHg2MiwgMHg0MCwgMHg5OCwgMHhjMSwgMHgzYSwgMHhlMywgMHgxMSwgMHhhYywgMHgyZSwgMHg5NywKKyAgMHg2ZiwgMHg2ZCwgMHg5MSwgMHhjNiwgMHhjOCwgMHg2MiwgMHg5NywgMHgxOSwgMHg4NiwgMHhkZCwgMHg3YiwgMHg4ZCwKKyAgMHhhZiwgMHhiMywgMHhkZiwgMHhmMCwgMHhmOCwgMHgxZCwgMHg0OCwgMHgwMywgMHgwNywgMHgyMSwgMHgxYSwgMHg4OCwKKyAgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHhmZSwgMHhmMSwgMHg2YSwgMHhhMywgMHhhMSwgMHhjMCwgMHgyNCwgMHg4NCwKKyAgMHgyMywgMHgwNiwgMHgwNiwgMHhhMSwgMHgwMCwgMHgxMCwgMHgxOCwgMHgwMCwgMHgxMCwgMHgxMiwgMHg1NCwgMHhkOCwKKyAgMHhjMCwgMHhjNSwgMHhmMiwgMHhhNCwgMHg4YSwgMHg3OSwgMHg0MCwgMHg4NCwgMHg2MywgMHhiOCwgMHg4YSwgMHgxYiwKKyAgMHg4NCwgMHgxMSwgMHgzMSwgMHg2NywgMHg3OCwgMHgyNCwgMHg4YSwgMHgwYywgMHhhYSwgMHgyYywgMHg4NiwgMHgyYiwKKyAgMHg3MCwgMHgxNCwgMHhiNSwgMHhlNSwgMHhiOSwgMHhiMCwgMHg5YiwgMHgyYSwgMHg0ZiwgMHgxNiwgMHg4ZCwgMHg4ZiwKKyAgMHg4MCwgMHhhOCwgMHhlMywgMHgwZCwgMHgzYywgMHhhZiwgMHg2NywgMHgwZiwgMHhhYSwgMHhlNCwgMHg5MiwgMHgyNCwKKyAgMHgyOCwgMHhmYywgMHgwZiwgMHgzYiwgMHgyYywgMHg3NywgMHg1NSwgMHg3MywgMHgyMSwgMHg4YiwgMHgyZCwgMHgwNywKKyAgMHhjMiwgMHgwMiwgMHhhOSwgMHg3ZSwgMHg0NywgMHhlYywgMHhiOCwgMHgyNSwgMHhjOCwgMHgyMCwgMHg4ZCwgMHhiMSwKKyAgMHgyMiwgMHhjMiwgMHhkYSwgMHg5MywgMHg0ZCwgMHgzYSwgMHhjYSwgMHhiZCwgMHg4YywgMHhkMywgMHgxNCwgMHhlYSwKKyAgMHg0YywgMHhkMywgMHgxNiwgMHgyNiwgMHg1YywgMHhhOCwgMHg0MSwgMHg5YiwgMHhhNSwgMHgwYywgMHg1YiwgMHhkNiwKKyAgMHgwNiwgMHgyYSwgMHhkYSwgMHg2YiwgMHhhZCwgMHg0NiwgMHg1YSwgMHg0NCwgMHg2NiwgMHg2MCwgMHg0MCwgMHgwMCwKKyAgMHgzYywgMHg0MSwgMHhkNSwgMHg0NSwgMHhkNiwgMHg1YywgMHg0OCwgMHhmNiwgMHg1YSwgMHhjOCwgMHhhMCwgMHhhNSwKKyAgMHgxNiwgMHg0NSwgMHg5NiwgMHgzMCwgMHg0OSwgMHgxMCwgMHhkMywgMHhkMywgMHhkNCwgMHg5OCwgMHg0ZCwgMHhiNywKKyAgMHhhNCwgMHg4OSwgMHg5YSwgMHhkZSwgMHhiNywgMHhjOCwgMHg4YiwgMHg2NCwgMHgwZCwgMHg1OSwgMHg4MSwgMHgwNCwKKyAgMHg1ZSwgMHhlZiwgMHg3ZSwgMHg2MSwgMHgxNCwgMHhjMiwgMHhiNSwgMHg3MSwgMHhkMSwgMHgxNiwgMHg1NCwgMHg5YSwKKyAgMHg0OCwgMHg5NywgMHhjYiwgMHgyNSwgMHhiYSwgMHhiYSwgMHhlYSwgMHhhNiwgMHg4MiwgMHg0NSwgMHgwZSwgMHgzOCwKKyAgMHg2MiwgMHg0YywgMHg4NiwgMHg4MiwgMHhlZCwgMHg1MiwgMHgyZCwgMHgxNiwgMHgxNSwgMHg2YiwgMHgzNCwgMHg5NiwKKyAgMHgxOCwgMHhiMSwgMHg4ZSwgMHgwOSwgMHg1OCwgMHg4OCwgMHg3OCwgMHhhNCwgMHg5YSwgMHhkNywgMHgyZSwgMHgzYiwKKyAgMHgzNywgMHg5NiwgMHg4NSwgMHg1NSwgMHhlZSwgMHhlZSwgMHg4ZSwgMHgxYywgMHgzZSwgMHgxZiwgMHgxZiwgMHhhMiwKKyAgMHgwMCwgMHgxZSwgMHg3ZSwgMHg2NSwgMHgyOCwgMHgyMiwgMHg4NywgMHg2MCwgMHgwYSwgMHg4MSwgMHg1NywgMHg4OCwKKyAgMHg1MCwgMHgwMCwgMHgyZSwgMHg1NSwgMHgwNSwgMHgyOCwgMHg2MiwgMHgzYSwgMHgwYywgMHhjNSwgMHhhZCwgMHhkMywKKyAgMHgzOCwgMHg2NywgMHhhZSwgMHgyZCwgMHhhNiwgMHgwMCwgMHgzMSwgMHg5ZSwgMHhiYywgMHg2YSwgMHgyNCwgMHgxNCwKKyAgMHhhZSwgMHhiMSwgMHg2NCwgMHhlZiwgMHgzMywgMHgxNCwgMHhhOCwgMHgwYywgMHgyOSwgMHgzMywgMHgyZCwgMHgyMCwKKyAgMHhiZSwgMHg1MCwgMHgzMywgMHg2ZCwgMHg2NywgMHgwMywgMHhiMiwgMHgzNywgMHg0MiwgMHg5MiwgMHgxNywgMHg0OSwKKyAgMHg0OCwgMHg0YSwgMHg1MiwgMHg0MSwgMHhhZCwgMHg0YywgMHg5ZCwgMHhiNSwgMHg3OSwgMHhkYywgMHg4NSwgMHgwNCwKKyAgMHgzMiwgMHgwYSwgMHg4YywgMHhhNiwgMHgzNywgMHgzMiwgMHg3OCwgMHg3OCwgMHgxMSwgMHg4ZiwgMHhkNCwgMHhjMSwKKyAgMHg5OSwgMHhmNiwgMHg1OSwgMHhhMCwgMHhjZCwgMHgwNiwgMHhhZiwgMHg3ZiwgMHhmMiwgMHg5YSwgMHhjMCwgMHgzNCwKKyAgMHgyNiwgMHgwMiwgMHg2YSwgMHg2OSwgMHg4MSwgMHgwMiwgMHg0MCwgMHhmMywgMHgwOCwgMHg2NCwgMHhhNCwgMHhmNCwKKyAgMHhmYiwgMHgzNiwgMHg0YiwgMHg5NywgMHhlMiwgMHhhNywgMHg4MSwgMHhiOSwgMHg0MiwgMHg5NCwgMHhjYSwgMHg1MiwKKyAgMHg1ZSwgMHg1ZCwgMHgwNywgMHgwMSwgMHg3MywgMHg1YywgMHhkZSwgMHhjMSwgMHgyNCwgMHhhZCwgMHhlMSwgMHg0NSwKKyAgMHgyYywgMHgwZiwgMHhiZiwgMHgxOSwgMHhjOSwgMHgxZCwgMHgxMiwgMHg1YSwgMHg1MiwgMHg4OCwgMHhiZiwgMHg1NywKKyAgMHgyZiwgMHg4ZiwgMHg0NiwgMHhiZSwgMHhmMCwgMHgwNywgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHhmZiwKKyAgMHhmZiwgMHhmZSwgMHhmZCwgMHg2YiwgMHhhMiwgMHgzMSwgMHgwNSwgMHg0NCwgMHg2NCwgMHgxMywgMHgxMSwgMHg0MiwKKyAgMHgxMCwgMHhlMSwgMHgyMiwgMHhhNSwgMHgyYSwgMHhhNSwgMHgwMCwgMHg4MCwgMHgyMiwgMHgyNSwgMHg2MCwgMHhmYSwKKyAgMHgxMiwgMHgwMSwgMHgxNSwgMHhmMSwgMHhlMywgMHhiZiwgMHhiOSwgMHhjMCwgMHg4NSwgMHgzZiwgMHg5ZiwgMHgyMCwKKyAgMHg4ZiwgMHhmMiwgMHg2NywgMHhiYSwgMHhjYiwgMHhlMSwgMHgyMywgMHhmYSwgMHg2YiwgMHgzNywgMHg2YiwgMHg5YywKKyAgMHg2ZSwgMHg4YSwgMHhhOCwgMHgwNywgMHhhMywgMHgzNywgMHhhZiwgMHg3OCwgMHg3YSwgMHg2YiwgMHg1NywgMHgxNywKKyAgMHhiNiwgMHg0NywgMHg3NCwgMHg4OCwgMHgxOCwgMHhlNywgMHhmOCwgMHhkNSwgMHgwNiwgMHg5OSwgMHhjOCwgMHhmYywKKyAgMHhmZCwgMHgzMywgMHg4NywgMHg3MiwgMHg2ZiwgMHhiNiwgMHg1MSwgMHg5NywgMHhiZCwgMHg4YywgMHhhZSwgMHgzMCwKKyAgMHg5NCwgMHgzNCwgMHhkMSwgMHgwMiwgMHgzYiwgMHhhYiwgMHgzZSwgMHhlZSwgMHhkMywgMHhmZiwgMHhiNSwgMHg3MCwKKyAgMHhjOSwgMHgyYywgMHhiNiwgMHg4NSwgMHg5YiwgMHg1NywgMHg5MSwgMHgwMCwgMHgzMCwgMHhkNSwgMHg4ZCwgMHg4NiwKKyAgMHg0YywgMHhiMywgMHg3NCwgMHg4ZSwgMHhjNSwgMHhmNCwgMHg1NiwgMHhjNiwgMHg5NSwgMHgzMywgMHg0ZSwgMHgxYiwKKyAgMHg2YywgMHgyMywgMHhjYSwgMHgyMiwgMHg3MSwgMHg4NCwgMHgwZCwgMHgwNiwgMHhiYSwgMHgyNCwgMHhmNSwgMHg1YiwKKyAgMHgwYywgMHg4MSwgMHg0NCwgMHgxYiwgMHg1NSwgMHgxZCwgMHg4NCwgMHg5NCwgMHhiNywgMHhlOCwgMHgzZCwgMHgyMSwKKyAgMHhjZCwgMHhhNywgMHhmZSwgMHgwZSwgMHhjYSwgMHg1OCwgMHhiMCwgMHhiMywgMHhkYSwgMHhlNCwgMHhiMSwgMHhlYywKKyAgMHgwYywgMHg1NiwgMHgyNSwgMHg5ZCwgMHgyZCwgMHhiZiwgMHg3ZCwgMHhjNywgMHgwMCwgMHg4YiwgMHgxMiwgMHg1YiwKKyAgMHhkMywgMHhmMSwgMHhjNCwgMHhiMiwgMHhiNiwgMHg4NSwgMHg5ZiwgMHhjMywgMHg0NiwgMHhhZCwgMHhkZiwgMHg0OSwKKyAgMHhiZSwgMHhkYiwgMHhhZSwgMHg5YywgMHg4YiwgMHhjMywgMHgwZiwgMHgzNiwgMHhmNywgMHhjYiwgMHhiYiwgMHgyYSwKKyAgMHg3YywgMHg5ZSwgMHhiZiwgMHhmNywgMHhlZiwgMHg4ZSwgMHhjMiwgMHg2OCwgMHhmNiwgMHhkYSwgMHg1YSwgMHg2YSwKKyAgMHhjNSwgMHgxMSwgMHg3NSwgMHgwZSwgMHg3YiwgMHhhZSwgMHhmOCwgMHhmNiwgMHg2MSwgMHhkNSwgMHhkZCwgMHhkZiwKKyAgMHhlYywgMHhmYiwgMHhlYiwgMHhhMiwgMHg0MCwgMHgxZSwgMHg3ZSwgMHg2NCwgMHhkNCwgMHgxOSwgMHg4YSwgMHgwOCwKKyAgMHhlMSwgMHhkOCwgMHgwMCwgMHhhOCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyZCwgMHgwMSwgMHhhZCwgMHgwYywgMHg4OSwKKyAgMHg4MCwgMHgyZSwgMHgzMCwgMHg4YSwgMHgwMCwgMHhiYywgMHgyMSwgMHgwNywgMHgwZSwgMHgwNSwgMHg1ZSwgMHg3YiwKKyAgMHhmNSwgMHg5NSwgMHg2OSwgMHg1ZiwgMHg2YiwgMHg4YywgMHg0MSwgMHg5ZSwgMHg0MywgMHg4MCwgMHg5MSwgMHg3MSwKKyAgMHgwMCwgMHgzMCwgMHg3MCwgMHhjOCwgMHg2MCwgMHg1ZCwgMHgyYSwgMHg4MSwgMHhlOCwgMHhjMSwgMHhiMCwgMHhlZCwKKyAgMHg1MSwgMHgxZCwgMHg3MywgMHhhYywgMHgzYiwgMHhlYSwgMHhhNSwgMHg4MywgMHg2NSwgMHg2NSwgMHhmMCwgMHg2YywKKyAgMHgyOSwgMHhmMywgMHhmNywgMHg5NiwgMHg4OSwgMHhhNywgMHhhZSwgMHhhMCwgMHhkYywgMHg3MSwgMHg1MywgMHg3MiwKKyAgMHgzYSwgMHgxYywgMHhlYiwgMHhiNiwgMHg1MCwgMHhjMiwgMHg2YiwgMHg0YiwgMHhkMywgMHgzNywgMHgyZiwgMHhiOCwKKyAgMHhjMiwgMHhjOSwgMHg0NCwgMHhiZSwgMHg0MywgMHhmMCwgMHgwZSwgMHhlOSwgMHgwYSwgMHhhMSwgMHgyNCwgMHg0MiwKKyAgMHhlZiwgMHgyNCwgMHg3MiwgMHhlZSwgMHhiOCwgMHg4ZSwgMHhhMCwgMHgwYywgMHg2NSwgMHhkMCwgMHhhYSwgMHhiYywKKyAgMHg1NywgMHgxZCwgMHg3OSwgMHg3MiwgMHgzMCwgMHgzNSwgMHg4MiwgMHhjMiwgMHg3ZCwgMHg5NCwgMHhiZSwgMHgxZSwKKyAgMHg0ZCwgMHgzYiwgMHgwMCwgMHgxMCwgMHhjYywgMHg4ZCwgMHg5MSwgMHg0YywgMHhhMCwgMHhkNCwgMHhmZCwgMHgzNiwKKyAgMHhjMSwgMHg3NiwgMHg1YywgMHg1MiwgMHgyOCwgMHgzOSwgMHg3YywgMHhiZiwgMHhmMiwgMHg3NSwgMHgxYSwgMHgxZSwKKyAgMHgyNiwgMHhjMCwgMHgwZSwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgzZiwgMHhmZiwgMHhmZiwgMHhmZSwgMHhmZCwKKyAgMHg2YywgMHhhMiwgMHhhMiwgMHgwNCwgMHhlYSwgMHg2NiwgMHgxYSwgMHg4NCwgMHgyMSwgMHg2NywgMHgwMCwgMHhhNSwKKyAgMHgwMCwgMHgwMCwgMHgwYiwgMHgyOCwgMHg3NywgMHhiZiwgMHhkOSwgMHhmOSwgMHhlNywgMHhkMCwgMHhmZiwgMHhkMCwKKyAgMHg0OCwgMHgwMSwgMHgyNiwgMHg0MCwgMHg1NCwgMHgwNywgMHhjNywgMHgzZCwgMHhlMSwgMHhkZCwgMHg3YiwgMHhmNywKKyAgMHhlYiwgMHhkYSwgMHhlZiwgMHg4NywgMHhjZiwgMHg1YiwgMHg0YiwgMHg1NywgMHhjOSwgMHhhMCwgMHhkZSwgMHgxZCwKKyAgMHhkYiwgMHhiOCwgMHgzOSwgMHgyNywgMHhmZiwgMHgzYSwgMHg3ZiwgMHg3NSwgMHhlOCwgMHgzMiwgMHg4MCwgMHgyYSwKKyAgMHhiOCwgMHhkYywgMHg2NCwgMHg4MywgMHhjYSwgMHg1MywgMHg0ZSwgMHg3ZiwgMHgzYiwgMHg3YywgMHg2MSwgMHhmMSwKKyAgMHgyYiwgMHgxOCwgMHg2MCwgMHg5NywgMHgzYiwgMHg3MiwgMHhiOSwgMHgzNywgMHgxYywgMHgyZCwgMHhlOSwgMHg5OSwKKyAgMHg2ZCwgMHg5NSwgMHgyMSwgMHgzZSwgMHhmOCwgMHhlMywgMHgwNiwgMHg3NywgMHhiMSwgMHhhZiwgMHhlZCwgMHhhYSwKKyAgMHhkMiwgMHgwNSwgMHg2NiwgMHgxMywgMHg1OSwgMHhhOSwgMHhmMCwgMHhhYSwgMHhjZCwgMHgxOCwgMHhlYSwgMHg5ZSwKKyAgMHgzMiwgMHhjNywgMHhjZSwgMHg3ZSwgMHg5NSwgMHg3MCwgMHhjNiwgMHhiNSwgMHhhNywgMHhlOSwgMHgwOCwgMHg1NywKKyAgMHhiNSwgMHhiYywgMHhiNCwgMHg5NiwgMHhmMSwgMHgyZiwgMHgxZSwgMHgzOCwgMHhhZCwgMHhiMywgMHg1NiwgMHgzNywKKyAgMHgyZCwgMHhkMywgMHg2ZSwgMHg1ZSwgMHgxMCwgMHhjZSwgMHgzNiwgMHhlYywgMHg4MiwgMHg4ZCwgMHhjMSwgMHgwZCwKKyAgMHhkNSwgMHhjOSwgMHhiZCwgMHhhZSwgMHhlOCwgMHhhMywgMHgwYSwgMHgyNCwgMHhjNCwgMHhlNSwgMHgzMywgMHg1MSwKKyAgMHg0NiwgMHhjMiwgMHhlMywgMHg4ZSwgMHhkYywgMHhlOCwgMHg0ZSwgMHgzMywgMHgxYiwgMHgyYSwgMHhmMywgMHg1NSwKKyAgMHhkNSwgMHg3ZCwgMHhhMiwgMHhlZiwgMHg1NywgMHhkZCwgMHhlMSwgMHgyNCwgMHg4NywgMHhlMSwgMHhlMSwgMHhhMCwKKyAgMHhmOSwgMHhkOSwgMHgxOSwgMHhlMiwgMHhkNiwgMHgxZCwgMHhkNCwgMHg2ZCwgMHhlZiwgMHgwYSwgMHhmMiwgMHhiYiwKKyAgMHhlZiwgMHhmNywgMHhmNCwgMHhiYywgMHhmNCwgMHg3YywgMHg1NywgMHg4ZCwgMHhlZCwgMHgzNSwgMHg5NiwgMHhmZCwKKyAgMHhlNywgMHgyNywgMHhiMiwgMHg0ZSwgMHg3MywgMHg3MiwgMHhlZCwgMHhkNywgMHhlYiwgMHg4ZiwgMHg1ZSwgMHg3YywKKyAgMHg3OSwgMHgwMCwgMHgzYywgMHhmYiwgMHg1NCwgMHg2MiwgMHhkMiwgMHgzYSwgMHgwYSwgMHgwNiwgMHhhMSwgMHhkYywKKyAgMHhhMCwgMHg1NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgyNiwgMHgwYywgMHg1NiwgMHg1ZSwgMHg1NSwgMHhiOSwKKyAgMHhiYywgMHg2NCwgMHg2MiwgMHg4ZCwgMHg3NCwgMHhjMSwgMHhhNywgMHhhMiwgMHgzOSwgMHg1NSwgMHg2ZSwgMHhlYywKKyAgMHhjMywgMHgzYiwgMHhjNywgMHg4NCwgMHg2NywgMHg3NSwgMHg1NywgMHhhNCwgMHg3NiwgMHg5MywgMHhmYywgMHhiMywKKyAgMHg3OCwgMHg2MSwgMHg4MSwgMHhlMywgMHhjZiwgMHhlMywgMHg0NCwgMHhkYywgMHhkYywgMHg2ZiwgMHhiNSwgMHg5YSwKKyAgMHgzOSwgMHhkZCwgMHhkMSwgMHgwMSwgMHhlYSwgMHhlZSwgMHhhZCwgMHgxNSwgMHg4NiwgMHg0MywgMHgzMCwgMHgzOSwKKyAgMHgwYSwgMHg1MiwgMHg5YywgMHg3ZCwgMHgyYywgMHg4NiwgMHhjMywgMHhkMCwgMHhiMCwgMHg4MSwgMHg0YSwgMHhkMiwKKyAgMHhjNSwgMHgxOCwgMHhkZiwgMHg1MSwgMHg1MiwgMHg4NCwgMHg5ZCwgMHhkZSwgMHgxNSwgMHg1MSwgMHgzMSwgMHg1NCwKKyAgMHgwZiwgMHgyOSwgMHhmYywgMHhkZiwgMHgwYywgMHhlNywgMHhkNywgMHg0OCwgMHhiNCwgMHg1MCwgMHhlZCwgMHhjYiwKKyAgMHhlZSwgMHhkYiwgMHhjNywgMHgxOSwgMHhjMiwgMHg2NCwgMHhjMSwgMHhkYywgMHg5NSwgMHgwNSwgMHgxYSwgMHgyYywKKyAgMHg1NiwgMHhjZCwgMHgyMCwgMHhmNCwgMHgwYywgMHg1YiwgMHg1NCwgMHg4ZiwgMHg5NiwgMHg4OSwgMHg5ZCwgMHg1YiwKKyAgMHgwMCwgMHgzMCwgMHg4YywgMHgxNywgMHhkMCwgMHg4NiwgMHhkMiwgMHg2MiwgMHg3NiwgMHg0MiwgMHgzOSwgMHg3NiwKKyAgMHg1MiwgMHhkYSwgMHhhMiwgMHhkNywgMHg1YiwgMHg3MywgMHgzZiwgMHgxYiwgMHhhNywgMHhjYiwgMHgxZiwgMHg1NywKKyAgMHgzZSwgMHg1ZCwgMHgxYywgMHgwMCwgMHgzOCwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMywgMHhmZiwgMHhmZiwKKyAgMHhmZSwgMHhmZCwgMHg2OCwgMHhhNCwgMHgzMCwgMHg5MCwgMHg0NCwgMHhkNCwgMHgyYywgMHgwZCwgMHhjMiwgMHgwMiwKKyAgMHgxMiwgMHg0YiwgMHhhMiwgMHg4NCwgMHgwMCwgMHgwMiwgMHgyMSwgMHg0MywgMHhkYiwgMHg0OCwgMHhhNCwgMHhkNSwKKyAgMHhiYiwgMHg4OSwgMHgxMSwgMHg1ZiwgMHhjNCwgMHhlNiwgMHg3MiwgMHg0OCwgMHgzZiwgMHgzZCwgMHhkNCwgMHhjNSwKKyAgMHhlMywgMHg2OSwgMHg5NCwgMHg1MCwgMHhmZCwgMHg1ZCwgMHhkOSwgMHgzZiwgMHg5MCwgMHhhNywgMHg3YywgMHhhZCwKKyAgMHg1NywgMHhlMywgMHg1YSwgMHg1ZCwgMHhhOCwgMHhlYSwgMHhhYywgMHg3MywgMHg2OSwgMHgxZCwgMHgyZSwgMHhjZiwKKyAgMHgzOSwgMHg0ZCwgMHhhYiwgMHhiZiwgMHgyYiwgMHg5ZSwgMHg3MCwgMHg1NywgMHg5YSwgMHhkMiwgMHgwZCwgMHg3ZCwKKyAgMHhhYSwgMHgzZiwgMHhhZiwgMHg0MiwgMHg4YSwgMHhmYiwgMHgxYywgMHhlYiwgMHhiZSwgMHgyMSwgMHhmOCwgMHgxMSwKKyAgMHg2ZCwgMHhiYSwgMHgzOCwgMHg4YywgMHhjMywgMHgzYSwgMHg2NiwgMHg2OSwgMHhmNiwgMHg1YiwgMHhlYSwgMHhlOCwKKyAgMHhhNSwgMHg4NywgMHg4ZSwgMHhkZSwgMHhlMiwgMHg0OCwgMHgwNywgMHhlNiwgMHg0YSwgMHgwNywgMHgwMywgMHhhNSwKKyAgMHg4NSwgMHhjNSwgMHg3YywgMHgwOSwgMHgwMSwgMHg4YywgMHg0MCwgMHhlOSwgMHgwNywgMHg0NCwgMHg5NywgMHhiYywKKyAgMHg0MSwgMHgxMSwgMHg5ZCwgMHhkZiwgMHg0MywgMHhhNSwgMHg2NCwgMHgwMSwgMHg5YywgMHgzZiwgMHg2ZiwgMHg5MiwKKyAgMHg1NiwgMHhlNywgMHgwMCwgMHg4NywgMHgxNiwgMHgzNywgMHgyMCwgMHhhMiwgMHhiMSwgMHhlOCwgMHg0YiwgMHg3NywKKyAgMHhhOCwgMHg4MCwgMHgzMCwgMHg2YSwgMHhiZCwgMHg1NiwgMHgwOCwgMHg0MiwgMHhiYSwgMHhlOSwgMHg3MCwgMHhhNiwKKyAgMHhhNSwgMHg2MCwgMHhmZSwgMHg1ZCwgMHhlZCwgMHgyNywgMHhkYSwgMHhhYiwgMHhkMiwgMHgyNSwgMHhhMSwgMHhjYiwKKyAgMHg2MSwgMHg1MywgMHg1YiwgMHgxNSwgMHhmNywgMHhiZiwgMHgyMywgMHhkMSwgMHhjZCwgMHg0OCwgMHhhOSwgMHgwMCwKKyAgMHg1YSwgMHg0NiwgMHhkZSwgMHhiOCwgMHgyMSwgMHgxMiwgMHgyNCwgMHhlZCwgMHgwOCwgMHg2NCwgMHgyNCwgMHg2MywKKyAgMHgwMiwgMHg0ZCwgMHg4NSwgMHg3NCwgMHgzNywgMHhhZiwgMHhjMSwgMHhhNywgMHg0ZSwgMHgwZCwgMHg3NSwgMHhlYiwKKyAgMHhlNSwgMHg1ZCwgMHgyOSwgMHg4YSwgMHg3MywgMHhlNSwgMHgxMywgMHgyMSwgMHg5OCwgMHhlNywgMHhkZSwgMHhiZCwKKyAgMHhkNiwgMHg3ZCwgMHhlYywgMHgzOCwgMHhkZCwgMHgzZCwgMHg0YywgMHgwMCwgMHgzZCwgMHhmYywgMHg0OSwgMHgyMiwKKyAgMHg1MiwgMHgyMiwgMHgwZSwgMHgwNiwgMHhlMSwgMHhkOCwgMHgwOSwgMHg0MywgMHgyZCwgMHg1NiwgMHgwMiwgMHg4MSwKKyAgMHgwMywgMHgzNSwgMHgwYSwgMHgxMywgMHgxMCwgMHhkYSwgMHg1YywgMHg2MSwgMHg1YiwgMHgxZCwgMHg4MiwgMHg4MywKKyAgMHgzZSwgMHg2NywgMHgxNiwgMHgwOSwgMHg4YiwgMHgwMCwgMHg4MiwgMHhhNywgMHgzZiwgMHg3NywgMHhlYSwgMHg3NSwKKyAgMHg3MywgMHhhNCwgMHg4ZiwgMHg2YiwgMHhhNSwgMHgzYywgMHhiNywgMHg0MywgMHg0NSwgMHgxYSwgMHg1YiwgMHhiZSwKKyAgMHg1NCwgMHg0ZCwgMHg0MSwgMHgxMiwgMHg3OCwgMHg2YiwgMHg1OSwgMHg1NSwgMHgzMywgMHgzMSwgMHg2ZCwgMHgzMSwKKyAgMHhiNiwgMHg5OSwgMHgyZCwgMHgyMSwgMHg2OSwgMHhlMiwgMHhlMywgMHhkMCwgMHhlNywgMHgzZCwgMHg4MSwgMHhkOSwKKyAgMHhlMywgMHhkZSwgMHhhNSwgMHg4NiwgMHg0ZCwgMHgzMSwgMHhkYSwgMHhjNiwgMHgxYSwgMHgxOCwgMHg3NiwgMHhiNywKKyAgMHhlMiwgMHg3YSwgMHgyZiwgMHgwNSwgMHhmNywgMHgzZSwgMHgzZSwgMHg0ZCwgMHg3YSwgMHg5YSwgMHhiYywgMHhiZiwKKyAgMHhiNCwgMHhlYSwgMHgzZSwgMHhjMywgMHhmZiwgMHhmOSwgMHgwZCwgMHhlYSwgMHgwZiwgMHgxMywgMHgyZSwgMHhkMCwKKyAgMHg5YSwgMHhiOCwgMHgxZiwgMHhhYywgMHgwZSwgMHhhNCwgMHhiNSwgMHgxNCwgMHg5MywgMHgxNSwgMHgwMSwgMHg0MiwKKyAgMHhkNSwgMHhjNiwgMHg0MiwgMHgzNSwgMHhiNiwgMHgwYiwgMHhjOCwgMHg4MCwgMHhhOCwgMHg2ZCwgMHhhNCwgMHhkYSwKKyAgMHg1ZCwgMHg1YywgMHhhZCwgMHgxMCwgMHgzNSwgMHgyZCwgMHgwMywgMHhkNywgMHg3YSwgMHg1OSwgMHhmYiwgMHhkZSwKKyAgMHhhZiwgMHhlMiwgMHhiNywgMHhmYiwgMHhlOSwgMHgwMCwgMHhlMCwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMSwgMHg2YSwgMHhhNCwgMHhhMCwgMHg4NSwgMHhjOCwgMHgyNiwgMHgwYywgMHgwYywKKyAgMHhjMiwgMHgwNSwgMHhlNSwgMHhlOSwgMHgyZSwgMHhhYiwgMHg1NCwgMHgxOCwgMHgwMCwgMHgwYiwgMHgyNSwgMHg0ZSwKKyAgMHg0NSwgMHg3OCwgMHg0MCwgMHhjNCwgMHhjYSwgMHhlMywgMHgyMSwgMHgyYywgMHhiYiwgMHhlYiwgMHg5ZCwgMHg3YSwKKyAgMHhlNiwgMHg4MywgMHgxZSwgMHg5MywgMHhmNywgMHhmMiwgMHgwZiwgMHgxYiwgMHgzNywgMHhhYywgMHg5ZCwgMHgwZCwKKyAgMHhhZCwgMHhiNywgMHg3MywgMHhiZiwgMHhiZiwgMHhmYywgMHg2ZiwgMHhhMiwgMHhiMywgMHhkZSwgMHhhYiwgMHhmNywKKyAgMHg4ZSwgMHhkZiwgMHg1ZSwgMHhkNSwgMHhlNSwgMHg1NSwgMHg5OSwgMHgyNiwgMHg1MSwgMHg0YSwgMHhkNCwgMHg5ZiwKKyAgMHhjZSwgMHhkNiwgMHgxYiwgMHhkZSwgMHhlZiwgMHgzNCwgMHgxMiwgMHg1NCwgMHg4YywgMHg2YSwgMHgxNiwgMHg1MCwKKyAgMHg4NCwgMHg1YywgMHhhMCwgMHhhNCwgMHg4MywgMHhhOSwgMHg4ZSwgMHgyNCwgMHgyMSwgMHgwZSwgMHhmZSwgMHhkOSwKKyAgMHhhYywgMHg2NywgMHhiMCwgMHgxZCwgMHgwOSwgMHg1ZSwgMHhkZCwgMHgzYywgMHhmNSwgMHhjOCwgMHg1NiwgMHgzNCwKKyAgMHhiYywgMHgyZCwgMHg0OSwgMHhjNCwgMHhhOSwgMHg0OCwgMHhjZCwgMHgzYiwgMHgzMCwgMHhhZCwgMHgzYywgMHg5MiwKKyAgMHg0MiwgMHgzNiwgMHhiMCwgMHhhNCwgMHg1ZCwgMHhiOCwgMHg3MiwgMHg5NSwgMHhkNywgMHhiYSwgMHgzMiwgMHg5NywKKyAgMHg4NCwgMHg5MiwgMHg5MywgMHhhNCwgMHgwYiwgMHg0OSwgMHg3OSwgMHg1ZSwgMHhjNywgMHg3NSwgMHgyMywgMHg3YSwKKyAgMHhkYSwgMHg1OSwgMHhhNSwgMHhmMywgMHg4YywgMHgzYiwgMHg5OSwgMHgxMCwgMHgxMCwgMHhmNiwgMHg1YywgMHg3ZiwKKyAgMHgwYSwgMHhlYywgMHgzYywgMHhiYywgMHgxYiwgMHhlNCwgMHhjNSwgMHgyMSwgMHgxOSwgMHg5MiwgMHhlNSwgMHg1MSwKKyAgMHg2OSwgMHgyZSwgMHgxZCwgMHhmOSwgMHhjYywgMHg2NSwgMHhhNiwgMHgzMywgMHgzZiwgMHg0NCwgMHg3NCwgMHhhOCwKKyAgMHgwNywgMHgyMiwgMHhkMiwgMHhhZSwgMHg5NCwgMHg1OCwgMHgyZiwgMHg5NCwgMHg4YSwgMHgwZCwgMHg5MiwgMHg3MSwKKyAgMHgyNywgMHg3YiwgMHg1YywgMHg4MSwgMHgyNSwgMHhjZiwgMHhhZiwgMHhhYSwgMHgwNCwgMHg2YywgMHgzMiwgMHg4ZiwKKyAgMHg4MiwgMHg0ZCwgMHgwNiwgMHgxMiwgMHhiYiwgMHgyZCwgMHhkYiwgMHgxZiwgMHg0YywgMHhmMywgMHg5ZiwgMHhkMCwKKyAgMHhmMiwgMHg4MSwgMHhlYiwgMHhlNiwgMHg0ZiwgMHgzMSwgMHhiMCwgMHhlMCwgMHgyYSwgMHgxZCwgMHg4MiwgMHhhMCwKKyAgMHhhOCwgMHgyYSwgMHg0OCwgMHgwMCwgMHgwMCwgMHg4NCwgMHhkOCwgMHgzYSwgMHgzMywgMHg1NSwgMHhiNywgMHg5YiwKKyAgMHgyZCwgMHgwYSwgMHgxMCwgMHgyMSwgMHg2MywgMHhjMSwgMHg3NSwgMHhiMSwgMHhmOSwgMHgzYSwgMHhkNywgMHhlNCwKKyAgMHg5NiwgMHgwMywgMHg5MiwgMHgxNSwgMHhiNSwgMHg2NiwgMHgzMSwgMHg5ZCwgMHgyZSwgMHhmMywgMHgwYiwgMHg2MiwKKyAgMHg1MSwgMHgxNCwgMHgwYSwgMHg2YywgMHhjOSwgMHg2MSwgMHhkNiwgMHgwNywgMHg4OCwgMHg1NiwgMHhmMCwgMHgwMSwKKyAgMHhhMiwgMHgzYiwgMHg4OCwgMHgxZCwgMHg0YSwgMHhhYiwgMHhkMSwgMHhhYiwgMHgzNiwgMHhiZiwgMHhkZCwgMHgxYSwKKyAgMHg1MywgMHgxOSwgMHhmYiwgMHg1NSwgMHgyOCwgMHgxZiwgMHhhYywgMHg2MywgMHhjZCwgMHgzNCwgMHg2OCwgMHg1NiwKKyAgMHgxNSwgMHg5NywgMHhhMSwgMHhlYiwgMHhiZCwgMHg0NCwgMHgxOSwgMHg3NywgMHg1ZCwgMHgxMywgMHg4YywgMHg3NiwKKyAgMHhkMiwgMHg3MiwgMHhhNSwgMHgzMiwgMHgxOSwgMHg0OSwgMHg3MywgMHhiZiwgMHg1NiwgMHg3NiwgMHg2MCwgMHg2OCwKKyAgMHhkOCwgMHhlMywgMHgzMywgMHgxMCwgMHhkMywgMHhlZCwgMHg5MiwgMHhhMSwgMHg5NywgMHhiNiwgMHg0YiwgMHhlOSwKKyAgMHgzMywgMHgwYSwgMHg2ZCwgMHg5MSwgMHhjNCwgMHg0ZSwgMHhiNiwgMHhlOSwgMHhkMywgMHg4OSwgMHhjMiwgMHg2YSwKKyAgMHhmYywgMHg2YSwgMHgwYywgMHgxMSwgMHgwOSwgMHgyMCwgMHg3YSwgMHhlNywgMHhlZCwgMHhlNywgMHhjZiwgMHhkYiwKKyAgMHhhZiwgMHhmMSwgMHhhMCwgMHgwNywgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHgwMywgMHg2YSwgMHhhMiwgMHg1OCwgMHhhMCwgMHg2OCwgMHg0MiwgMHg2YiwgMHgwZSwgMHgwNCwgMHg2MSwgMHgxMCwKKyAgMHhlOCwgMHgzNCwgMHhhNCwgMHhhOSwgMHg5MiwgMHhhMCwgMHgwNCwgMHgwYywgMHhiNCwgMHgzOSwgMHgxOSwgMHg3MiwKKyAgMHhiMywgMHgzNywgMHhlMSwgMHg3MiwgMHg2MCwgMHhmYSwgMHg1NywgMHhhNiwgMHg2OSwgMHg3ZCwgMHhkNSwgMHhhYiwKKyAgMHgzZCwgMHhjNywgMHhjNSwgMHg3MywgMHg0ZCwgMHhkZSwgMHhhZiwgMHhhOCwgMHg0ZSwgMHhlYywgMHhhMiwgMHg0ZCwKKyAgMHg4ZiwgMHhjYiwgMHhlMywgMHg5MywgMHhiMSwgMHhhYSwgMHgwMCwgMHhlYiwgMHgxOCwgMHg5ZCwgMHgyNSwgMHg3ZiwKKyAgMHg0OCwgMHhmYywgMHhmNSwgMHgzZSwgMHg0NiwgMHgwMSwgMHhhMiwgMHhkYywgMHhjOCwgMHg2YywgMHg2YiwgMHgyYiwKKyAgMHgyYywgMHhmZSwgMHgwNywgMHg4NiwgMHhiNSwgMHhkNywgMHgyMywgMHhmMiwgMHgwZSwgMHg3NiwgMHhmZSwgMHgxMiwKKyAgMHhkYiwgMHhiNywgMHg2NywgMHgxNSwgMHhlNiwgMHgwOCwgMHg5MSwgMHg1YSwgMHhkYSwgMHg5ZSwgMHg1OSwgMHg3MywKKyAgMHhhNSwgMHg4NSwgMHhkZiwgMHg1NSwgMHhlOSwgMHg4YiwgMHg4MCwgMHhiZiwgMHg4NywgMHg0ZiwgMHgxNiwgMHhiMywKKyAgMHgyMywgMHhjZCwgMHhhNCwgMHgzNiwgMHg1NCwgMHgyNywgMHgxNCwgMHhlOCwgMHgzZCwgMHg4YywgMHgzNSwgMHhjMiwKKyAgMHhjNSwgMHg2MiwgMHgxZiwgMHg1MSwgMHhkMCwgMHgyZSwgMHg1OCwgMHg3ZCwgMHg5ZSwgMHgxMSwgMHhhZSwgMHgxMywKKyAgMHhiMCwgMHhlMCwgMHgyNSwgMHgwYiwgMHgwMywgMHhlNiwgMHg5NCwgMHhhYiwgMHhkMSwgMHg3MywgMHhmOCwgMHhjYiwKKyAgMHhmMywgMHg0ZSwgMHhmNSwgMHhhOSwgMHg3ZSwgMHgxZCwgMHgxMCwgMHgyOSwgMHg2NSwgMHg5MCwgMHgxNywgMHg1NCwKKyAgMHhkYSwgMHg3OSwgMHg5NSwgMHg5OSwgMHg2NSwgMHhjNywgMHhkYiwgMHg0NSwgMHgzZSwgMHg5ZiwgMHg5NywgMHg1YSwKKyAgMHgzMSwgMHg4NiwgMHhjZCwgMHgxNSwgMHgxYywgMHgwMSwgMHhiOCwgMHhjMiwgMHhhMCwgMHgxYiwgMHg5NCwgMHg0YywKKyAgMHgzMywgMHg5MiwgMHhiYiwgMHg2MiwgMHhiMCwgMHhhOCwgMHhiMiwgMHg3OSwgMHhlYSwgMHg4OSwgMHhmMywgMHhjMiwKKyAgMHhhZCwgMHhiYSwgMHg3NSwgMHg2MSwgMHg5YywgMHhkMywgMHgxMywgMHg1NSwgMHhmYSwgMHhjNiwgMHg2ZSwgMHhmNSwKKyAgMHgzOCwgMHhiMywgMHg2NywgMHhjMiwgMHhkNiwgMHg4ZSwgMHg5YSwgMHg0OCwgMHgxMiwgMHhkNiwgMHgwOCwgMHhlOSwKKyAgMHhiZSwgMHhjMCwgMHhlNCwgMHg5NywgMHhjMiwgMHgxNCwgMHg0MiwgMHg0YSwgMHg5MSwgMHg2MSwgMHg4YiwgMHgxOCwKKyAgMHg4ZiwgMHhmYSwgMHhjZiwgMHg3ZCwgMHhmZiwgMHg1YiwgMHhlYSwgMHhlMCwgMHhmNywgMHhmMywgMHgxOSwgMHgzMCwKKyAgMHhlMCwgMHgyZSwgMHgxZCwgMHg4MCwgMHgwYSwgMHg0MiwgMHhhYSwgMHgwMCwgMHgwMCwgMHgyMywgMHgzNCwgMHgwYSwKKyAgMHg1ZiwgMHg5NCwgMHhhOSwgMHgwNiwgMHhlOCwgMHg1NywgMHhmNCwgMHgxZSwgMHg2NCwgMHg1MCwgMHhjZCwgMHgyYywKKyAgMHg3NiwgMHg5MiwgMHhmMSwgMHg1MSwgMHg3NCwgMHhmMCwgMHg2YSwgMHg1NSwgMHg5ZSwgMHhlNCwgMHg5MSwgMHhkNSwKKyAgMHgyYSwgMHg5MSwgMHhlZCwgMHg2OCwgMHg5MCwgMHgyYiwgMHgwNSwgMHhiMiwgMHg1NSwgMHhhYSwgMHgxMywgMHg2YiwKKyAgMHg5MiwgMHhiOCwgMHhlMSwgMHg1OSwgMHhlNywgMHgyMiwgMHhiZSwgMHhkZSwgMHg0NSwgMHhlMiwgMHhjOSwgMHhmNCwKKyAgMHg4MSwgMHgwYSwgMHg0YiwgMHgzMSwgMHg0MiwgMHgyOSwgMHgwZiwgMHhlOCwgMHg4OSwgMHgxNCwgMHg5YSwgMHgxZSwKKyAgMHhiMCwgMHhiNywgMHg4OCwgMHhhZSwgMHg0ZSwgMHhiZiwgMHg0ZCwgMHgzNCwgMHg2ZiwgMHhiMiwgMHhmOSwgMHg0NCwKKyAgMHgwMiwgMHhlYSwgMHgxOSwgMHhhOCwgMHhkMywgMHg2OCwgMHg5NSwgMHgxYSwgMHg2YywgMHhkZSwgMHhhMCwgMHgwMCwKKyAgMHg2MiwgMHgwZCwgMHg3YSwgMHgwMywgMHhiNywgMHg1MywgMHgwNiwgMHgzMSwgMHgyZiwgMHgwMiwgMHg1NywgMHgwZiwKKyAgMHg4ZiwgMHgxMywgMHg0OSwgMHg5NywgMHhhOSwgMHhhOSwgMHhjNiwgMHhmMCwgMHhiMywgMHhlOSwgMHhlYywgMHgyNCwKKyAgMHgwMywgMHgwNywgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgxZiwgMHhmZiwgMHhmZiwgMHgwNywgMHg2YSwKKyAgMHhhNCwgMHgzMSwgMHgxMCwgMHg0NCwgMHg5NCwgMHgyYywgMHgwZCwgMHg0MiwgMHgwMSwgMHg1YywgMHg0YiwgMHhkNSwKKyAgMHgyZSwgMHhhZSwgMHhhZiwgMHgyMSwgMHg0MCwgMHgwMiwgMHg1MiwgMHhkOCwgMHgzNSwgMHhmNywgMHhhNywgMHhmOCwKKyAgMHgxOSwgMHgxNCwgMHgwZiwgMHhlZiwgMHhiOSwgMHg0ZSwgMHhlOSwgMHgxZCwgMHhhNiwgMHgyZSwgMHhmZSwgMHg5OCwKKyAgMHhmZCwgMHgxMywgMHhiOCwgMHgyMiwgMHhiYSwgMHhiOSwgMHhmOSwgMHgxYSwgMHhlMiwgMHg1MSwgMHg0ZSwgMHg1YiwKKyAgMHhlZCwgMHhkYiwgMHg4ZiwgMHg1YiwgMHhiYywgMHhmMCwgMHgzOSwgMHhlNiwgMHg3NSwgMHg0YiwgMHhlOCwgMHgxZSwKKyAgMHhmOCwgMHg3YiwgMHgyZiwgMHgyNywgMHhiMSwgMHhjNywgMHg5OSwgMHhjNywgMHhmZiwgMHgxYywgMHg4YSwgMHhjMCwKKyAgMHhlOSwgMHg5YiwgMHg1NiwgMHhkNCwgMHgyYSwgMHg1NywgMHg3YiwgMHgzNCwgMHhmYiwgMHg2NSwgMHgwOSwgMHgzNCwKKyAgMHhiNSwgMHg5NSwgMHg3ZCwgMHgyMCwgMHg5NiwgMHgxZCwgMHg3MSwgMHhiMiwgMHg2OCwgMHg3MSwgMHhhZSwgMHhiNiwKKyAgMHg1YiwgMHgyYywgMHgzMSwgMHhiYSwgMHgyNSwgMHg1YywgMHgyYywgMHhmOCwgMHgyNSwgMHgwMCwgMHg5NiwgMHhhMywKKyAgMHg0OSwgMHgxYSwgMHgzOSwgMHhkMywgMHhhMSwgMHgwNywgMHg1MiwgMHhkMywgMHgzYSwgMHhkNiwgMHhiMSwgMHg1NCwKKyAgMHhlMSwgMHg3MSwgMHgyNCwgMHgwOCwgMHg5NCwgMHgxNSwgMHhlMiwgMHg3YywgMHgyNiwgMHhiNSwgMHhjNiwgMHgxMywKKyAgMHgwOSwgMHg1OCwgMHhjOCwgMHhiNywgMHg4YywgMHg0OCwgMHgwMywgMHg2YSwgMHhjYywgMHhkNSwgMHgxMywgMHg0NywKKyAgMHhjNiwgMHhiNywgMHg3OSwgMHg3MCwgMHg2MiwgMHg0MSwgMHgwYSwgMHhiMSwgMHhkNywgMHhmMCwgMHg4YiwgMHhlNSwKKyAgMHg2YiwgMHhkMCwgMHhjOSwgMHhlMSwgMHg3MywgMHg4YywgMHg2NywgMHgwNiwgMHg3NSwgMHgxYywgMHgxZCwgMHhhYywKKyAgMHhhMiwgMHhhOSwgMHhhNywgMHhkMywgMHhhNywgMHgwYywgMHgwZCwgMHhlZSwgMHg4NiwgMHg1ZiwgMHhkMywgMHg5NSwKKyAgMHg3OCwgMHhjMSwgMHhhZSwgMHgwMCwgMHgyMywgMHg1MywgMHg5ZCwgMHg5OCwgMHgyYywgMHhkYiwgMHg2NSwgMHg4NiwKKyAgMHhkMCwgMHgwYiwgMHg2ZSwgMHg3MCwgMHhhYiwgMHhhNywgMHhkOCwgMHhjYSwgMHg2NSwgMHhkNiwgMHgzNCwgMHgyNiwKKyAgMHgyNywgMHgyOCwgMHhmNSwgMHg1NSwgMHgzYSwgMHgwYSwgMHg1OCwgMHg1MiwgMHgyOCwgMHg2ZCwgMHgxNSwgMHg4NCwKKyAgMHg4NywgMHgxMCwgMHg5NSwgMHhmYywgMHhhMSwgMHg2NiwgMHg0ZCwgMHgyZCwgMHgzZiwgMHhhZiwgMHhhYSwgMHhmMSwKKyAgMHhmMiwgMHhlZSwgMHhmYSwgMHg2NCwgMHgwMSwgMHhlZiwgMHhlYywgMHgyZiwgMHg2MiwgMHgyOCwgMHg3NiwgMHgwMCwKKyAgMHgwNSwgMHg0NCwgMHg5NSwgMHg1MCwgMHgwMCwgMHgwOCwgMHhhYSwgMHgwOSwgMHhlZSwgMHg5OSwgMHhmYiwgMHg3ZiwKKyAgMHg2OSwgMHg5YSwgMHg2YywgMHg4MiwgMHg2ZCwgMHg3NCwgMHgxZCwgMHhlNCwgMHhiMSwgMHhjNiwgMHg0MSwgMHhhNSwKKyAgMHg2ZSwgMHgwMiwgMHgxMywgMHgyMSwgMHgyZCwgMHg1OSwgMHhjNCwgMHhmMCwgMHhkYSwgMHhkNiwgMHg0OSwgMHhlOCwKKyAgMHhhYywgMHhmNiwgMHhhNywgMHhlYSwgMHhmZCwgMHg1OSwgMHgzNywgMHhlMCwgMHgyYiwgMHhlNiwgMHhiZSwgMHgxNSwKKyAgMHhmOSwgMHhiZCwgMHhmZiwgMHhiNSwgMHhlNywgMHg2ZSwgMHhhMywgMHhlZSwgMHhiOSwgMHg5ZCwgMHg2YiwgMHg1YSwKKyAgMHhkZiwgMHhhZCwgMHhjMCwgMHgwMCwgMHg5YSwgMHg4ZSwgMHg2OCwgMHhkOSwgMHhlYSwgMHg5NiwgMHhjOCwgMHhlZSwKKyAgMHhhMSwgMHgxMywgMHhjNiwgMHhiNCwgMHhhZSwgMHhhYiwgMHhmOCwgMHgzMywgMHhkNywgMHgzNCwgMHhmYiwgMHhkZSwKKyAgMHg5YSwgMHg1OCwgMHgzNywgMHgwMiwgMHg4OCwgMHg4MCwgMHgyOCwgMHg2OCwgMHgzYSwgMHg4NywgMHg5ZSwgMHg3MCwKKyAgMHhlMiwgMHg3YiwgMHg2OSwgMHhiZSwgMHhlMCwgMHgwNiwgMHg4YywgMHhiZCwgMHgzZiwgMHgzZSwgMHhkYywgMHhmNiwKKyAgMHhjNiwgMHgyNCwgMHgwMywgMHgwNywgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHgwOSwgMHg2ZiwgMHg4MiwgMHgyMSwgMHg0NSwgMHg4OCwgMHgxNiwgMHgxYywgMHgwNSwgMHg0MiwgMHgyMiwgMHg0YywKKyAgMHgzZCwgMHg4YiwgMHg4MiwgMHg1MCwgMHhhNSwgMHgxMCwgMHgwNCwgMHg5NSwgMHgyNiwgMHgwYiwgMHhmNSwgMHg5OCwKKyAgMHgzZiwgMHgxYiwgMHhmMSwgMHg0MiwgMHg2MCwgMHgwNSwgMHg3NiwgMHg0ZiwgMHgyNiwgMHhlOSwgMHhiZCwgMHgwOSwKKyAgMHhmZiwgMHhmYiwgMHg3NywgMHg5OCwgMHgzYiwgMHhjMiwgMHg5MCwgMHhjYSwgMHg2ZSwgMHg4YiwgMHhjMiwgMHgwZCwKKyAgMHhhMiwgMHgwZSwgMHhmMywgMHg2ZSwgMHhiYSwgMHhlZCwgMHg3ZSwgMHg0YSwgMHhjYiwgMHg1NSwgMHg1MiwgMHg4ZCwKKyAgMHgyNSwgMHhiZCwgMHg1NCwgMHgxYSwgMHg1ZCwgMHgyYiwgMHhhMSwgMHg1NCwgMHhjYiwgMHg1NCwgMHhhMiwgMHg2YSwKKyAgMHhiMywgMHg0MiwgMHgzYSwgMHhkYiwgMHhkZiwgMHg0YSwgMHg1NiwgMHhkNSwgMHgwZiwgMHgzMiwgMHgwOCwgMHg3MiwKKyAgMHgyYiwgMHgyYywgMHg0OSwgMHg0NiwgMHgyNiwgMHhlNSwgMHg5MCwgMHgyOCwgMHhhZSwgMHgwMiwgMHgxZCwgMHgyMiwKKyAgMHg1NiwgMHgzMSwgMHg0OCwgMHg3ZiwgMHhkYywgMHhjOCwgMHg3NiwgMHhhNywgMHg0YiwgMHhhZiwgMHgzNiwgMHhhMSwKKyAgMHgyMiwgMHhlMSwgMHhhYiwgMHg1NywgMHg3MiwgMHhmNSwgMHg0NiwgMHhiMiwgMHg1NiwgMHg0NSwgMHgwMCwgMHgyZSwKKyAgMHhjNywgMHg3ZCwgMHg5NCwgMHg1MiwgMHg1MywgMHg5NCwgMHhlYiwgMHg3YywgMHhmNCwgMHg1NSwgMHg1YywgMHhhNywKKyAgMHhiOSwgMHg1NCwgMHgwYywgMHgzZiwgMHgwYSwgMHhkZSwgMHg5ZSwgMHg4YiwgMHhkZCwgMHg5MiwgMHg3MiwgMHhhZCwKKyAgMHhhOSwgMHg4ZiwgMHg2NSwgMHgyZCwgMHhkMiwgMHhhYywgMHhhMiwgMHhlYSwgMHg0MiwgMHg5NSwgMHg5NiwgMHg1NSwKKyAgMHgwMywgMHhkNCwgMHgzOCwgMHg0MywgMHhhMCwgMHg4YSwgMHhjZCwgMHg4YSwgMHhiYiwgMHhlMSwgMHgzOSwgMHhhMCwKKyAgMHhhNiwgMHg4ZCwgMHg1MSwgMHg2MywgMHg2OSwgMHgyYSwgMHg4NiwgMHg1OSwgMHhhZSwgMHg5NywgMHhmMCwgMHhkZCwKKyAgMHg1NiwgMHg0ZiwgMHg1MywgMHgzMSwgMHhlMiwgMHgwNiwgMHg1YywgMHg2YiwgMHhhMywgMHg2MSwgMHhjOSwgMHhhYywKKyAgMHg0MiwgMHhkYSwgMHgyYSwgMHgyMiwgMHhiNiwgMHg4MSwgMHgyYiwgMHhiYiwgMHg5ZiwgMHg1MywgMHg1MiwgMHhjYSwKKyAgMHg0ZCwgMHgxMSwgMHhhYSwgMHhiMywgMHg2MywgMHhlNywgMHhmNSwgMHg3NCwgMHhkNywgMHg2NywgMHhkNSwgMHg5ZSwKKyAgMHgwMCwgMHgwZiwgMHg1ZiwgMHgzMywgMHg4MSwgMHgwOSwgMHg4OCwgMHhlMSwgMHhkOCwgMHgwMCwgMHg1NCwgMHg5NSwKKyAgMHg1NiwgMHgwNSwgMHhiMCwgMHgwMSwgMHgxMCwgMHgwMywgMHg0MCwgMHhiOSwgMHgyOCwgMHg2OCwgMHgwYywgMHhlMCwKKyAgMHhiYywgMHg0YiwgMHhmYywgMHgxYiwgMHhhMywgMHgyMiwgMHg0YSwgMHhhYiwgMHg2OSwgMHgwNSwgMHgxMywgMHg1ZSwKKyAgMHg0ZSwgMHhkMSwgMHhiNywgMHgxMiwgMHhmMiwgMHgyOCwgMHg4MiwgMHhkMSwgMHg4OCwgMHg1MywgMHgxYiwgMHgwZSwKKyAgMHgwZSwgMHgxYSwgMHg5OSwgMHhhNywgMHhhOCwgMHgxMSwgMHg5NywgMHgzOCwgMHgxYSwgMHgzZCwgMHg1NCwgMHhlOSwKKyAgMHgzYiwgMHg1OCwgMHhlZiwgMHg0OCwgMHhlYSwgMHhkNCwgMHgwNSwgMHg5ZiwgMHg1MywgMHg2ZSwgMHgxOCwgMHgyMywKKyAgMHg1MCwgMHg4MiwgMHg0OSwgMHg0YiwgMHgzMiwgMHgxYiwgMHhlZCwgMHg3YSwgMHgwMCwgMHgyYywgMHhiYiwgMHhhOSwKKyAgMHhhZSwgMHhiNywgMHg0NiwgMHhiZSwgMHhkNywgMHgzNiwgMHhmZCwgMHg2MCwgMHgzNCwgMHhmZiwgMHg1MSwgMHgyYywKKyAgMHg3NiwgMHhlMCwgMHgwOSwgMHhkOCwgMHhhYiwgMHg2OCwgMHhjMiwgMHhkZCwgMHg0OSwgMHhkMiwgMHhkYiwgMHhhNiwKKyAgMHg1NCwgMHhiYSwgMHg4YSwgMHhiYSwgMHhiYSwgMHhmZSwgMHg0ZiwgMHg1NywgMHhkNywgMHhiOCwgMHhiYSwgMHgzZSwKKyAgMHg3MCwgMHgwZSwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHg3ZiwgMHhmZiwgMHhmZiwgMHgxMSwgMHg2ZiwKKyAgMHhhMSwgMHhiMSwgMHgxMCwgMHg2MiwgMHhjNiwgMHgyMCwgMHg4NSwgMHhhZCwgMHhlOSwgMHg2NywgMHhjMCwgMHhiNSwKKyAgMHgyZCwgMHhiYiwgMHgwMywgMHgwMiwgMHgwMiwgMHg0MywgMHhiMCwgMHhjNSwgMHhkZiwgMHhkMywgMHgxZiwgMHg2MywKKyAgMHhmMSwgMHg1MiwgMHgxYiwgMHgyZiwgMHgxZiwgMHg4MiwgMHg4MywgMHgxNSwgMHgwOCwgMHgzMiwgMHhmOCwgMHhhYiwKKyAgMHgxYywgMHhmZCwgMHg0ZiwgMHhjZSwgMHgzNCwgMHg4NywgMHg4YSwgMHhjNiwgMHhiOSwgMHgwZSwgMHgzNywgMHhmMSwKKyAgMHhhNSwgMHgzMSwgMHg3ZiwgMHg3YSwgMHgzYywgMHg5YSwgMHgzYSwgMHg1NiwgMHg2MCwgMHg3ZSwgMHhhZiwgMHgxOCwKKyAgMHg3MywgMHg2ZiwgMHg5MCwgMHgzNCwgMHhmNSwgMHg4ZSwgMHg2MywgMHg4ZiwgMHgzNSwgMHhkZCwgMHg3NiwgMHgxNywKKyAgMHhlMiwgMHg4ZCwgMHg1MSwgMHg4YywgMHg5ZiwgMHg1OCwgMHhiMywgMHgxOSwgMHg4NCwgMHhjYSwgMHg5YywgMHhjOSwKKyAgMHhiYywgMHhjMCwgMHg1NiwgMHhjYSwgMHgxMiwgMHg2ZiwgMHg4YywgMHhlZSwgMHhhMywgMHg3ZCwgMHg5NywgMHg0NSwKKyAgMHg1OSwgMHgzMiwgMHg5YSwgMHhjNSwgMHgyZiwgMHg1YiwgMHgzOSwgMHg1NywgMHg0MCwgMHhmNywgMHhjMSwgMHhmZCwKKyAgMHhmZCwgMHgxMywgMHgxOSwgMHhiOCwgMHhlZSwgMHg4YSwgMHhhYiwgMHhkNCwgMHhjYywgMHg2MywgMHhiZCwgMHgzOCwKKyAgMHhlYSwgMHg4ZCwgMHg3MCwgMHhhNCwgMHg0MCwgMHg4YywgMHhlMSwgMHg4OSwgMHhkNCwgMHg1MCwgMHgyMywgMHg3YywKKyAgMHg4OCwgMHg4YywgMHhlMSwgMHg2MiwgMHg4YiwgMHgyYywgMHhiNiwgMHhjYSwgMHg0ZCwgMHg4MSwgMHhmNiwgMHg2NiwKKyAgMHhiNiwgMHhhYywgMHhkYiwgMHhlOCwgMHhlZiwgMHhhYSwgMHhmZSwgMHg4YSwgMHgzYSwgMHg3OSwgMHg2MiwgMHg4NiwKKyAgMHg0YSwgMHhmZSwgMHhkOSwgMHhkZCwgMHhlYiwgMHhjMSwgMHhkOSwgMHhhNSwgMHgwMSwgMHgwMiwgMHg4NCwgMHg5NiwKKyAgMHg4YiwgMHgxNCwgMHg0MSwgMHg5YywgMHg5YSwgMHg4ZiwgMHgyNiwgMHgzZCwgMHhhZSwgMHhkYywgMHhhYywgMHhlZSwKKyAgMHg4YiwgMHgxNywgMHhkZSwgMHhiZiwgMHhhOSwgMHg0YywgMHhlYywgMHhjMywgMHhkZCwgMHgzZiwgMHhlMCwgMHgyNCwKKyAgMHg5NywgMHg0YywgMHhiMSwgMHgwYiwgMHg1MywgMHg2MiwgMHhmZSwgMHg1ZSwgMHgxMywgMHg0OCwgMHg0MiwgMHg3OCwKKyAgMHhmYywgMHhhNywgMHg5ZiwgMHhjZSwgMHg3ZiwgMHhiZiwgMHg5ZiwgMHhmMywgMHhjOCwgMHgwZiwgMHg1ZiwgMHg0NCwKKyAgMHgyMCwgMHhiMSwgMHgwNCwgMHhjMiwgMHg4MCwgMHhiOCwgMHg3NiwgMHgwMCwgMHgwNSwgMHgyZiwgMHgyZSwgMHhjMCwKKyAgMHg2MCwgMHgwMiwgMHhlYSwgMHhmMCwgMHg1OCwgMHg3NSwgMHg3ZSwgMHhjMywgMHg1NCwgMHhkMiwgMHg4MCwgMHg5YSwKKyAgMHg3MSwgMHg2OCwgMHg3MCwgMHg1NSwgMHhmOCwgMHg0YywgMHhmNSwgMHgzOCwgMHg1YSwgMHhkMiwgMHhhZSwgMHg0OCwKKyAgMHg4NSwgMHgxNiwgMHhiNywgMHg3OSwgMHhkMSwgMHg2OSwgMHg5NSwgMHhjYSwgMHgyMSwgMHgyMywgMHg3NCwgMHg2MiwKKyAgMHhiYywgMHhmMywgMHgyOCwgMHhhNCwgMHgzMCwgMHhkMCwgMHhhNywgMHhkOSwgMHhmYSwgMHhjMSwgMHgwMiwgMHgzNiwKKyAgMHhkNywgMHg3YiwgMHg3YywgMHg4YiwgMHg2MSwgMHhiZiwgMHhhYSwgMHg4MCwgMHhjMCwgMHhhNywgMHg4MSwgMHgxNywKKyAgMHg3YywgMHhhYSwgMHgyYSwgMHhkMywgMHg1YSwgMHhmOSwgMHhjNywgMHg4OCwgMHgyNiwgMHgwNywgMHhjYSwgMHhmNCwKKyAgMHgwZSwgMHhhZSwgMHg5OCwgMHgyMywgMHhiMSwgMHgzNiwgMHhjZSwgMHgzZSwgMHhjYiwgMHhiZCwgMHg1YywgMHhlNSwKKyAgMHgzMywgMHgxMywgMHhkMCwgMHhmYSwgMHhkZCwgMHhjMCwgMHg2YywgMHg5NCwgMHg4MSwgMHhiMCwgMHhkYiwgMHg4NCwKKyAgMHg2YSwgMHg4YywgMHg0ZCwgMHg5YywgMHhkOSwgMHgxYiwgMHg3MCwgMHg4ZiwgMHgyNywgMHgzNiwgMHg0MSwgMHgwYSwKKyAgMHhjOSwgMHhjYSwgMHhkNCwgMHhiZSwgMHg1NiwgMHgzZSwgMHgyNywgMHhjNywgMHhlMCwgMHg4MCwgMHgzOCwgMHgyMSwKKyAgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwZiwgMHhmZiwgMHhmZiwgMHgwNSwgMHg2YSwgMHhhMiwgMHg1OCwgMHg2OCwKKyAgMHg4YywgMHg0MiwgMHgxMSwgMHg5NCwgMHg4OCwgMHg4NCwgMHg2MSwgMHg0MCwgMHg0YywgMHgyMCwgMHgzOCwgMHgxNywKKyAgMHg2MCwgMHgwMSwgMHg0NCwgMHg0MCwgMHgxMiwgMHhhNywgMHg2MywgMHgyNiwgMHgwYiwgMHgwNSwgMHg5NSwgMHhmNCwKKyAgMHg3MiwgMHhmYywgMHgwYSwgMHg5MCwgMHg1NSwgMHhkMywgMHhmZiwgMHg4MiwgMHg0OSwgMHg2NCwgMHg4NCwgMHg1ZCwKKyAgMHg0MCwgMHhlOCwgMHhjYSwgMHgxMCwgMHg5MiwgMHg3OCwgMHgzOSwgMHg4YiwgMHhiZiwgMHhiYiwgMHg0NywgMHgzYywKKyAgMHhmYSwgMHhiZCwgMHhiYywgMHhkYSwgMHgxOCwgMHhiZCwgMHhkMywgMHhlNSwgMHg3NiwgMHgyYSwgMHgxNywgMHhkZSwKKyAgMHg4ZSwgMHhmZiwgMHhkZCwgMHg1MywgMHg2ZiwgMHg1ZiwgMHgwZiwgMHhkMiwgMHg2MywgMHg3MiwgMHg3MCwgMHhkOSwKKyAgMHgxZSwgMHg5NywgMHhjNCwgMHgzMSwgMHgzYSwgMHg0NCwgMHg1ZCwgMHgyNywgMHhmOCwgMHg2MSwgMHhkZiwgMHhhNiwKKyAgMHhlNCwgMHhlMSwgMHgxNiwgMHgyNywgMHgwNSwgMHhmOSwgMHg3MSwgMHhiMCwgMHg2YywgMHgyNiwgMHg4YSwgMHgxYywKKyAgMHhiNCwgMHg1OSwgMHg5YSwgMHgzOCwgMHg5OSwgMHgxNSwgMHhiMywgMHgxMiwgMHg0NiwgMHgyOCwgMHg0YSwgMHg4YSwKKyAgMHgzNSwgMHg4NSwgMHhjMSwgMHg3YywgMHhlMCwgMHg4YSwgMHhmNSwgMHg3MiwgMHhmMSwgMHhkOCwgMHg3YSwgMHhkNCwKKyAgMHhlYSwgMHhkNCwgMHg1NiwgMHhhNCwgMHgxMSwgMHgyNSwgMHgxYywgMHgyMiwgMHhiNCwgMHg0YywgMHhlZCwgMHhmZCwKKyAgMHg3YSwgMHg1YSwgMHg3NSwgMHhkNSwgMHhiOSwgMHhlMywgMHhhOSwgMHg4NywgMHgyMSwgMHg4MiwgMHhhMSwgMHhmMSwKKyAgMHgwYiwgMHg1ZiwgMHg0MCwgMHgxZCwgMHhmYywgMHgyZSwgMHg0MiwgMHhmYywgMHgxOCwgMHhiOCwgMHg4OSwgMHg3ZSwKKyAgMHhhYywgMHgzNywgMHhiYSwgMHhmMCwgMHhlNSwgMHhhYywgMHgyZCwgMHg1NCwgMHg1MiwgMHg0OCwgMHg4MCwgMHg3NiwKKyAgMHg0MiwgMHg0MywgMHhjZSwgMHg5NCwgMHgxMywgMHgyMywgMHhkYSwgMHgzNiwgMHg2MSwgMHgyOSwgMHhlOSwgMHhmMiwKKyAgMHhmZCwgMHg3ZCwgMHhkYiwgMHhhYiwgMHhjNCwgMHhkNywgMHg1ZiwgMHg0MCwgMHg1MiwgMHgyNiwgMHhjYiwgMHg2NywKKyAgMHg4ZCwgMHhjNiwgMHhkOCwgMHhkNCwgMHhkYywgMHhmMCwgMHhhOSwgMHgzNywgMHhkMiwgMHg3ZCwgMHhlNiwgMHg2MiwKKyAgMHg3NiwgMHhkZSwgMHg3YywgMHg0NywgMHhiOCwgMHhlYSwgMHgxNiwgMHg3MSwgMHgwNSwgMHhmYSwgMHhmOCwgMHgyYiwKKyAgMHgxYiwgMHhjMCwgMHg1YiwgMHgxYiwgMHg5OCwgMHhmMiwgMHgzOCwgMHhiZSwgMHhmNCwgMHhmMSwgMHg3YywgMHg4OCwKKyAgMHgzZCwgMHhmZCwgMHhjNSwgMHhhOCwgMHgyNiwgMHgxYiwgMHg4NywgMHg2MCwgMHgwMCwgMHgwNCwgMHg0YSwgMHg2OCwKKyAgMHg2YywgMHgxNiwgMHgyMiwgMHg4MCwgMHgwZiwgMHgzNCwgMHg3NywgMHhjZCwgMHg3OSwgMHg4OSwgMHg3MiwgMHg0OCwKKyAgMHg0MSwgMHg3OSwgMHg3MiwgMHgxYSwgMHg4YywgMHg2MiwgMHg5YiwgMHhhNSwgMHg4NSwgMHgyNiwgMHhkMSwgMHg2NCwKKyAgMHhjNiwgMHgzNSwgMHhlYSwgMHg5ZCwgMHg0YiwgMHg2MiwgMHgzNSwgMHhhNSwgMHg4ZiwgMHgyMywgMHg4MiwgMHgyNywKKyAgMHg4OCwgMHg1NCwgMHg5YSwgMHg5ZiwgMHhhMiwgMHg4NCwgMHgxNCwgMHg5YiwgMHhhMywgMHg3NCwgMHg0MiwgMHhmMCwKKyAgMHgxYSwgMHhlZCwgMHg5YSwgMHhhMiwgMHg5MywgMHg5MCwgMHhmNywgMHhhMSwgMHg1ZCwgMHgxMiwgMHg2NiwgMHhlNywKKyAgMHhmOSwgMHg1OSwgMHg3YiwgMHhmMiwgMHhjYiwgMHhjMiwgMHg2OSwgMHg4MSwgMHgwZiwgMHhmMywgMHg3MiwgMHg2NSwKKyAgMHhlZCwgMHgyMSwgMHgwZiwgMHg4MCwgMHhlYywgMHg0MiwgMHg1YSwgMHhlNywgMHg5NiwgMHhhMiwgMHhhZiwgMHhiYywKKyAgMHgyZiwgMHhjNywgMHgxNSwgMHgzMywgMHhiZiwgMHgzYywgMHhlNCwgMHhlYiwgMHhkNSwgMHhlNCwgMHhlYSwgMHhlOSwKKyAgMHhmOSwgMHhmYSwgMHhlZSwgMHhjYiwgMHg2OCwgMHgwNywgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHgwOSwgMHg2ZiwgMHhhMiwgMHgyMSwgMHg0OSwgMHg4OCwgMHgyNiwgMHgxYSwgMHg4NCwgMHgwYiwKKyAgMHgxZCwgMHgyZSwgMHhhMiwgMHhkMywgMHg5OSwgMHg1NiwgMHgwMCwgMHgwYiwgMHhjZCwgMHg1MywgMHgwNywgMHgyYiwKKyAgMHg5MiwgMHgzMCwgMHgyZSwgMHhiMiwgMHg2MywgMHhjMiwgMHg2NCwgMHgyMSwgMHgxMiwgMHgzYiwgMHhlYywgMHhjNiwKKyAgMHhkNCwgMHg2MCwgMHhlOSwgMHgyZiwgMHhmNCwgMHhjNiwgMHg1OCwgMHgyMSwgMHhiNSwgMHg2ZSwgMHhmNywgMHhjZSwKKyAgMHhjNSwgMHhlYSwgMHg4ZSwgMHhjZSwgMHhjNiwgMHg0YSwgMHg2MiwgMHhkYywgMHg1YSwgMHgxMywgMHg4MywgMHgyZiwKKyAgMHg5MCwgMHg3OCwgMHhhNywgMHg1NywgMHhlOCwgMHgxYSwgMHgyMSwgMHhmMSwgMHhhNCwgMHgyZiwgMHg5NiwgMHgyMiwKKyAgMHg5YiwgMHg3NCwgMHhmYywgMHhmNywgMHhmMywgMHhmYiwgMHgyMiwgMHg2ZCwgMHhiOSwgMHg2MCwgMHhhNSwgMHhhZiwKKyAgMHhiNCwgMHg3OSwgMHhhZiwgMHg2YiwgMHhlOSwgMHgxNiwgMHhlOCwgMHhhMywgMHgxZSwgMHgxZSwgMHgyYSwgMHgwYSwKKyAgMHhkMywgMHg1YSwgMHg5YiwgMHgwZSwgMHgxYSwgMHhjZiwgMHhiMCwgMHhlNiwgMHg3MSwgMHhhMSwgMHg5MCwgMHg2NCwKKyAgMHg4OCwgMHgzOSwgMHhiNiwgMHgzNCwgMHhlNCwgMHhmYywgMHg5NCwgMHhmYSwgMHg5MSwgMHgyMywgMHgwYiwgMHg0MCwKKyAgMHhjYywgMHg1MywgMHgxNCwgMHhkOSwgMHgwMiwgMHg1NCwgMHhhNiwgMHg0MCwgMHg2MCwgMHg0YywgMHgzMCwgMHgzZCwKKyAgMHg2ZSwgMHg1YiwgMHg5YywgMHhlMSwgMHg1OSwgMHgxNiwgMHhhMCwgMHhiMSwgMHg3YywgMHgyMiwgMHhiMSwgMHg1MCwKKyAgMHgxZSwgMHg0MiwgMHg5MiwgMHgwMiwgMHhmMCwgMHg5OCwgMHhkNCwgMHg3MSwgMHhkMCwgMHg5YywgMHhjOSwgMHg1MywKKyAgMHgxNCwgMHhkZiwgMHg4MSwgMHhmZCwgMHgwOSwgMHg4OSwgMHgxMywgMHg0NiwgMHg0YSwgMHg5OCwgMHg3YSwgMHgyZiwKKyAgMHhiYiwgMHhjNCwgMHgwMCwgMHg5YywgMHgyOCwgMHg0NSwgMHgxMCwgMHg4NCwgMHgzMiwgMHg3MSwgMHgyMSwgMHgwMSwKKyAgMHgyNywgMHg1MywgMHhjZiwgMHgxYSwgMHg4MywgMHhiZCwgMHg5NCwgMHg3ZiwgMHhmNCwgMHhlZSwgMHhiOSwgMHhiOSwKKyAgMHhmNSwgMHhjNywgMHhhMSwgMHg3ZiwgMHhkZiwgMHhmOSwgMHg2ZiwgMHhjYiwgMHg4NSwgMHgxYiwgMHhmMiwgMHgwZSwKKyAgMHgzNCwgMHg3NCwgMHhiYSwgMHhjYiwgMHhlOCwgMHhhNiwgMHg2ZSwgMHhkMywgMHhjNywgMHg1NCwgMHg4MywgMHg2MiwKKyAgMHg4OCwgMHhmNywgMHhiZCwgMHg5ZCwgMHg4ZCwgMHgzYiwgMHg1YiwgMHhkYiwgMHg4OSwgMHg2OCwgMHhjNywgMHhkOSwKKyAgMHhiZSwgMHhhZiwgMHhlNSwgMHhmMCwgMHhiMCwgMHgwMywgMHhkNywgMHhjYywgMHhlNCwgMHhjMiwgMHg4MSwgMHgyOCwKKyAgMHg3NiwgMHgwMCwgMHhhOCwgMHgwOSwgMHg1MCwgMHgwMiwgMHg4MCwgMHgyMiwgMHhlYSwgMHg4NSwgMHg5YiwgMHg4ZCwKKyAgMHg2OCwgMHhjNywgMHg5YiwgMHg5YSwgMHhiNCwgMHg5NywgMHhjYywgMHgzYSwgMHg5ZCwgMHhiOCwgMHg0MiwgMHgzMSwKKyAgMHg1ZSwgMHg4NSwgMHgzMCwgMHhmMSwgMHg0MCwgMHgyYywgMHhiNCwgMHg2NywgMHg5OCwgMHgwYiwgMHhkNiwgMHgwZCwKKyAgMHhjYywgMHg0NiwgMHg1OCwgMHhhNiwgMHhjYywgMHhiZCwgMHhjMCwgMHgzNSwgMHg2OSwgMHg0NCwgMHgwNSwgMHgyMywKKyAgMHhiZiwgMHg4OSwgMHhhMSwgMHg4ZCwgMHgzZSwgMHhhYSwgMHhiNCwgMHg5ZSwgMHgxYywgMHg0YSwgMHg2YiwgMHhlNSwKKyAgMHhmMSwgMHhmOCwgMHhhNSwgMHhlMywgMHhhZiwgMHhkYiwgMHhlOCwgMHhmNSwgMHgzMCwgMHg2OCwgMHg3MiwgMHgzNSwKKyAgMHhiNiwgMHgwMCwgMHgyZSwgMHg3NywgMHg4MiwgMHg5NSwgMHhkNiwgMHgzYiwgMHhhYywgMHg1YywgMHhjMywgMHg3ZiwKKyAgMHgwOSwgMHgzYywgMHhjOSwgMHhiZSwgMHg4OCwgMHg5ZSwgMHhkYSwgMHg3NywgMHg2YiwgMHg4MCwgMHhiNywgMHhhNSwKKyAgMHgxNiwgMHgzNCwgMHg0YiwgMHhiYSwgMHgwNSwgMHg4NiwgMHgwOSwgMHgwMCwgMHhkOSwgMHg5NywgMHhmOCwgMHhmNywKKyAgMHhjNywgMHg2OCwgMHhhMCwgMHgwNiwgMHhkZSwgMHg4YywgMHhlYywgMHg5OCwgMHg4ZCwgMHhjYSwgMHg4MCwgMHg4NCwKKyAgMHg2NCwgMHg3MywgMHhmYSwgMHhiYywgMHhiZCwgMHhkNSwgMHhlNywgMHg1ZSwgMHgwMCwgMHgxYywgMHgyMSwgMHgxYSwKKyAgMHg4OCwgMHgwMCwgMHgwMCwgMHgwZiwgMHhmZiwgMHhmZiwgMHgwYiwgMHg2YSwgMHhhNCwgMHhiMCwgMHhkMCwgMHg0MiwKKyAgMHhiNCwgMHgxYiwgMHgwZCwgMHhjMiwgMHgwOCwgMHg3OSwgMHgwYiwgMHhhNywgMHgwMiwgMHg5OSwgMHg2MCwgMHgwMCwKKyAgMHg5MSwgMHg0MSwgMHg0YywgMHhkNCwgMHg0MSwgMHhjNywgMHg4OCwgMHhlNSwgMHg0YSwgMHhjMCwgMHg3NiwgMHgyMCwKKyAgMHhhNSwgMHhmMywgMHhjNywgMHgzOSwgMHg0YSwgMHg1NCwgMHgwZCwgMHhjOSwgMHhkOSwgMHhmZCwgMHg5YiwgMHg2MSwKKyAgMHg0NCwgMHgzNCwgMHhjNCwgMHhhZSwgMHhjYiwgMHg3YywgMHgwNCwgMHgwYywgMHg5OSwgMHg1OCwgMHg5ZiwgMHg2MCwKKyAgMHg2MywgMHhlZiwgMHgyZSwgMHg1OSwgMHhmNCwgMHg4YSwgMHhmZSwgMHgwZiwgMHhkYywgMHgxOCwgMHhlOSwgMHg0ZiwKKyAgMHhkYiwgMHg1MiwgMHg2OCwgMHgxYiwgMHgxNywgMHhjZiwgMHhkZSwgMHg2NiwgMHhiNSwgMHg0YiwgMHg5YSwgMHg4NywKKyAgMHg4NCwgMHhhMywgMHhiMSwgMHhkMiwgMHhkNCwgMHg3NywgMHgwOSwgMHg4ZCwgMHg4MywgMHg4ZCwgMHhiMCwgMHg2OSwKKyAgMHg1YiwgMHg0OCwgMHhhOSwgMHg4MCwgMHgxMSwgMHhlMiwgMHg5OSwgMHhmOSwgMHhjOSwgMHgyZSwgMHgyOCwgMHg4YywKKyAgMHg1OSwgMHgwZSwgMHgyZSwgMHg3NiwgMHg0YiwgMHg0NiwgMHg1ZiwgMHhhNCwgMHhhYiwgMHg3MCwgMHhhMywgMHg0YiwKKyAgMHg3MiwgMHhhYywgMHgzZiwgMHhkNiwgMHg2NSwgMHgzNCwgMHhiMiwgMHg0NSwgMHhkMiwgMHg5YywgMHgxMiwgMHgwNSwKKyAgMHgyNSwgMHg2YywgMHhlOCwgMHg5ZCwgMHg3MywgMHhjNSwgMHg4MSwgMHg2ZiwgMHhkMiwgMHg4NiwgMHgxYiwgMHg2MSwKKyAgMHg2OCwgMHhhMiwgMHgzMywgMHhhNCwgMHhmMCwgMHhkZSwgMHg4YywgMHg1NywgMHgzYywgMHgxOSwgMHhmZSwgMHg1OSwKKyAgMHgwYywgMHg5ZSwgMHgzZSwgMHg1NCwgMHhkYywgMHg4NywgMHgwZSwgMHg1MCwgMHgyZCwgMHg2MiwgMHg5NywgMHgxZCwKKyAgMHgwOSwgMHhmMywgMHhiZCwgMHgyYywgMHgxNCwgMHgxYywgMHhkZCwgMHg4NywgMHg0NywgMHhkYiwgMHhjYSwgMHhlOCwKKyAgMHhkYSwgMHgwMCwgMHhjNywgMHgzZCwgMHhjYiwgMHgzMiwgMHgwMywgMHg4ZCwgMHhiNSwgMHg0YywgMHhhYiwgMHg5NSwKKyAgMHg0NywgMHhlZCwgMHhlYSwgMHgwOSwgMHg3ZiwgMHgzMiwgMHgyNiwgMHgxNCwgMHhjZCwgMHg2NywgMHgzYSwgMHhlYywKKyAgMHhjMywgMHhhOSwgMHgzYSwgMHg3YywgMHhiZiwgMHhiMSwgMHhkMSwgMHg2NSwgMHg4NSwgMHg0ZiwgMHg4NSwgMHgyYSwKKyAgMHgxOCwgMHgyMCwgMHg4NywgMHgzZSwgMHg1NywgMHhjNCwgMHhlMywgMHg2MywgMHhhYiwgMHhlMSwgMHhjZiwgMHgzOCwKKyAgMHgwMywgMHhlNywgMHhkYywgMHg1YywgMHhjNCwgMHgwMCwgMHhlYywgMHgwMCwgMHgwMiwgMHgyOCwgMHg5NiwgMHgzMiwKKyAgMHhjYSwgMHgwNSwgMHhhOCwgMHgyOCwgMHg4ZCwgMHhmNiwgMHg0YSwgMHhkNiwgMHg5NCwgMHhhNiwgMHhhNiwgMHhmOCwKKyAgMHg2OCwgMHg5MiwgMHgzMSwgMHhmOCwgMHg4YSwgMHgwMCwgMHg5YiwgMHg1MiwgMHg5MywgMHgxMCwgMHg0NSwgMHg5NywKKyAgMHhkMCwgMHg5ZCwgMHhlOCwgMHg5OCwgMHgyNiwgMHhhYywgMHgxOSwgMHgyMSwgMHg2YywgMHhhZSwgMHhkYywgMHgxYiwKKyAgMHgyYiwgMHgxNCwgMHhlMSwgMHg2NiwgMHg5NCwgMHg3NSwgMHgwNSwgMHg1MiwgMHgzMiwgMHhlNiwgMHhmYiwgMHhkMiwKKyAgMHhkZiwgMHg5MCwgMHg3MiwgMHhhMCwgMHg0MywgMHg1MiwgMHhjOCwgMHgwZSwgMHhiNCwgMHgxMSwgMHg2NSwgMHg5NCwKKyAgMHhmZSwgMHgxZSwgMHhkYSwgMHhhMSwgMHhjZSwgMHhiOSwgMHg3YiwgMHgzOSwgMHgxNywgMHg1ZSwgMHg5NiwgMHhlOCwKKyAgMHg1NywgMHhkNywgMHgzYywgMHhlOCwgMHg4MiwgMHgxNCwgMHhlMiwgMHhjMCwgMHhkNiwgMHhmNiwgMHg3NSwgMHg1NiwKKyAgMHgyNCwgMHgxMywgMHg2OSwgMHhmOCwgMHg4NywgMHhjZSwgMHg0NywgMHhkZCwgMHg5ZCwgMHg1YywgMHgyMSwgMHgxYSwKKyAgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMywgMHhmZiwgMHhmZiwgMHgwZiwgMHg2YSwgMHhhNCwgMHhiMSwgMHg4NSwgMHgyNCwKKyAgMHgzNiwgMHgyMiwgMHg4NCwgMHg1YSwgMHhlYSwgMHgyYiwgMHhhNiwgMHg5OCwgMHhkNCwgMHgxMCwgMHhhMCwgMHgwMCwKKyAgMHg5MCwgMHhhMSwgMHgxMCwgMHgyMiwgMHhhMCwgMHg3YywgMHg5MSwgMHgwNiwgMHg4YiwgMHg1MywgMHg3MiwgMHg0ZiwKKyAgMHhiMCwgMHg2NSwgMHg0MiwgMHg2NCwgMHgxMCwgMHhmZSwgMHg0ZiwgMHg3MSwgMHg0ZCwgMHgzOCwgMHg3ZSwgMHg3YSwKKyAgMHhkOSwgMHg1YiwgMHhiNywgMHgzZCwgMHg1MiwgMHg3MiwgMHg3OCwgMHgyMiwgMHhmZSwgMHhjNywgMHhkYywgMHhhYiwKKyAgMHhiNSwgMHg4YSwgMHg3NiwgMHgzNywgMHg1ZSwgMHhmMiwgMHhjMywgMHg4MywgMHhiMCwgMHg1MywgMHhmMCwgMHg1YywKKyAgMHg3MiwgMHhlNSwgMHg1NiwgMHhmNiwgMHg1ZSwgMHg1YiwgMHg5MywgMHgzNCwgMHhmMywgMHg5NiwgMHg4ZSwgMHhlNiwKKyAgMHgzNywgMHgxOSwgMHg1ZCwgMHgzMSwgMHgwMCwgMHgwZCwgMHgyYiwgMHhkNCwgMHg5YiwgMHhmYiwgMHhjZSwgMHg3NCwKKyAgMHg5NCwgMHg5MywgMHgyMywgMHhkMiwgMHg3NywgMHg1ZiwgMHg2OCwgMHgxMCwgMHhhOSwgMHgxZSwgMHg5NiwgMHhkZCwKKyAgMHhhMywgMHg0NSwgMHgxOCwgMHhjYiwgMHhjNCwgMHgxNywgMHg3ZiwgMHgyYiwgMHg0MCwgMHgyZCwgMHhiZSwgMHgzMiwKKyAgMHgyYSwgMHgxYSwgMHhjMSwgMHg0NCwgMHg1MCwgMHgzYiwgMHg5MSwgMHgwNCwgMHgxMSwgMHgzYSwgMHgzOCwgMHg2NSwKKyAgMHhlYSwgMHg4YiwgMHg5YywgMHgyNywgMHgxZSwgMHgwNiwgMHhjNSwgMHg2MiwgMHhhZCwgMHg5NCwgMHhiNCwgMHgyNywKKyAgMHg1ZCwgMHgyYSwgMHg3OSwgMHg1NCwgMHhlNywgMHg1MywgMHgwOCwgMHgwNSwgMHg1NSwgMHg2OCwgMHg1YSwgMHhmZiwKKyAgMHhhMSwgMHgyOCwgMHhkMywgMHg2MywgMHhiNCwgMHhhMiwgMHhiNSwgMHg3YywgMHgzMCwgMHgzOSwgMHhjYywgMHhiNiwKKyAgMHgxZSwgMHg2NywgMHgzYywgMHhjOSwgMHg4MCwgMHhhZiwgMHg1NCwgMHg1NSwgMHhjYywgMHhkMiwgMHg0MSwgMHg0ZCwKKyAgMHg1ZSwgMHhlNiwgMHhiYSwgMHhjNiwgMHgxNiwgMHg2YywgMHhlOCwgMHgzYywgMHgyOSwgMHg5OSwgMHgzNiwgMHg1NywKKyAgMHg2NiwgMHhmMiwgMHgxOSwgMHhmZiwgMHgzOCwgMHhmNiwgMHgyZSwgMHg3OCwgMHg1NSwgMHgzZCwgMHg3YSwgMHgyNCwKKyAgMHgxNywgMHg5YSwgMHhhYiwgMHg1ZSwgMHhlMCwgMHhlZSwgMHg3ZCwgMHg1NiwgMHgwZiwgMHg1MSwgMHhhNiwgMHgxYSwKKyAgMHhkYywgMHhlYiwgMHhjYiwgMHg1NCwgMHhmMiwgMHhlZCwgMHhmMiwgMHhjZiwgMHhjMywgMHgzZSwgMHg4ZiwgMHhmYSwKKyAgMHhiZiwgMHhjYywgMHgwMSwgMHhlZiwgMHhmMiwgMHgyYiwgMHg0MSwgMHgzMCwgMHhjYywgMHgzYiwgMHgwMCwgMHgwMCwKKyAgMHgxMiwgMHhhNCwgMHg1OCwgMHg1MCwgMHg0YSwgMHgyYSwgMHgwMiwgMHg3ZCwgMHhkOSwgMHhlMywgMHg4ZiwgMHg2ZiwKKyAgMHg2YiwgMHg1ZiwgMHhmYSwgMHg5MywgMHgxNiwgMHgxMywgMHhkYiwgMHgxMiwgMHgzNSwgMHhmYywgMHg1MiwgMHhiNiwKKyAgMHg5MSwgMHgwNCwgMHhlYiwgMHgxMCwgMHhhNCwgMHhmZCwgMHg2NSwgMHhkNywgMHg1MywgMHg4ZiwgMHgyYSwgMHhlNiwKKyAgMHg0ZiwgMHg0NiwgMHgwZCwgMHhmMSwgMHhlYSwgMHhiNiwgMHgwOCwgMHhiZiwgMHg5NCwgMHhkMiwgMHhiMCwgMHhiYiwKKyAgMHgzOCwgMHg1YywgMHg3ZCwgMHhjZSwgMHg4NywgMHgzMywgMHhjMiwgMHg0NSwgMHg4ZSwgMHhmZSwgMHg5MSwgMHgxZiwKKyAgMHhmZiwgMHhlNSwgMHhhZSwgMHg1NCwgMHgyMiwgMHg4OCwgMHhlYiwgMHhiNiwgMHg5NywgMHhiMSwgMHg0NSwgMHhjNCwKKyAgMHhjZSwgMHhjYywgMHg1NiwgMHg2MCwgMHgwMCwgMHhiMCwgMHg3MiwgMHhhMCwgMHg0MCwgMHgxMSwgMHg5MCwgMHhmMywKKyAgMHhjMywgMHg1NiwgMHg5YywgMHg0YiwgMHgwYSwgMHgzMywgMHhiNCwgMHgzMSwgMHhhZiwgMHhkZiwgMHg5ZiwgMHhkNCwKKyAgMHg3ZSwgMHhiYywgMHgzOCwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwNywgMHhmZiwgMHhmZiwgMHgwZiwKKyAgMHg3MCwgMHhhMSwgMHhiMSwgMHg0OCwgMHg2MiwgMHg2NCwgMHgwOCwgMHg4ZCwgMHg4NSwgMHgwMiwgMHg1MCwgMHg4MiwKKyAgMHg0NywgMHg5MiwgMHhkNiwgMHg0NCwgMHgwOSwgMHhiMCwgMHgxMCwgMHgxNiwgMHg5YiwgMHgxMiwgMHg3MCwgMHhiYywKKyAgMHg3MiwgMHhjZiwgMHgwNywgMHgyOCwgMHg1NCwgMHhhMSwgMHhlNywgMHg0YywgMHhhYSwgMHhjNywgMHhkZSwgMHhjNiwKKyAgMHg2OCwgMHhiZCwgMHhlNywgMHhhZCwgMHgwMywgMHhjMywgMHhiYSwgMHhjNSwgMHhkYywgMHg0OSwgMHg0MCwgMHhmMiwKKyAgMHhiYywgMHhhOCwgMHgwZCwgMHgzZiwgMHg1NCwgMHhlNiwgMHg5OSwgMHgyMSwgMHhkMywgMHg4YSwgMHg3NywgMHg4ZSwKKyAgMHg5ZCwgMHg5YywgMHgzMSwgMHhkNiwgMHg2MiwgMHgzMSwgMHhkZCwgMHgxZiwgMHg0OCwgMHhkMiwgMHgzNCwgMHg3NSwKKyAgMHgzYiwgMHg4MywgMHhkOSwgMHgyZiwgMHgxOSwgMHgyMiwgMHg5MywgMHhkYiwgMHhkNiwgMHgwNSwgMHg5NSwgMHgwMywKKyAgMHgyNywgMHhkNSwgMHg4NiwgMHg4YywgMHhlNiwgMHg1NywgMHg0ZCwgMHhlMCwgMHg5NywgMHhkMiwgMHg3MSwgMHhkYiwKKyAgMHhmNywgMHhkMywgMHgwNywgMHg0MCwgMHhmNiwgMHg3NiwgMHgzZCwgMHhmZCwgMHgxZSwgMHg4YiwgMHgyOCwgMHhkYSwKKyAgMHg3NSwgMHhkNSwgMHhkOCwgMHhiOCwgMHg1OSwgMHg1MSwgMHhiOSwgMHhmZiwgMHhkOCwgMHhlOSwgMHgyYywgMHg1YywKKyAgMHg1OSwgMHhkOSwgMHhkNywgMHhkZCwgMHg2NiwgMHg1YSwgMHgyZSwgMHhmZCwgMHhhNiwgMHhjNCwgMHhkOCwgMHg1ZCwKKyAgMHg2YiwgMHgzYiwgMHgwZiwgMHg0ZCwgMHgyYiwgMHg2MiwgMHgwOSwgMHg3MiwgMHhmNywgMHgxZCwgMHg5NywgMHhhZiwKKyAgMHhmNCwgMHg0ZSwgMHg2NCwgMHhhYywgMHhhMiwgMHhmNywgMHg2YywgMHhlYywgMHhkYSwgMHhhYSwgMHhhYSwgMHg0YSwKKyAgMHgzZiwgMHgxOSwgMHhkZCwgMHgxZCwgMHhkYywgMHhkZSwgMHg2YiwgMHg3YywgMHg2YSwgMHg0NCwgMHg0ZCwgMHhlMywKKyAgMHg4YSwgMHg0MywgMHg1ZiwgMHg4MywgMHhjYiwgMHgyZCwgMHg4ZCwgMHhiMCwgMHg2ZiwgMHhjOCwgMHg1MywgMHgyYywKKyAgMHgyNywgMHg2YywgMHgyMiwgMHg2YSwgMHg0MiwgMHg4OCwgMHg0NiwgMHhhNCwgMHhjNSwgMHhjOCwgMHg4ZSwgMHg3MSwKKyAgMHhjNCwgMHhmYiwgMHg3OCwgMHhkOSwgMHg2YywgMHg5MiwgMHg3YiwgMHg4NywgMHg1NiwgMHhkYSwgMHhmMiwgMHhjMSwKKyAgMHg4NiwgMHg1YSwgMHgxMSwgMHhiMSwgMHgwNiwgMHg2ZCwgMHg0YiwgMHhlOCwgMHgxYywgMHg2ZCwgMHg5MiwgMHgyYSwKKyAgMHhiYywgMHhhYSwgMHgxNSwgMHgzMSwgMHgyOSwgMHg3OCwgMHhkOSwgMHhkOSwgMHg0ZiwgMHgzYSwgMHhhZSwgMHg2MywKKyAgMHhlNSwgMHg5YiwgMHg5NywgMHg2NywgMHg1NSwgMHhlMywgMHhlNSwgMHhlMSwgMHhjOCwgMHgwMSwgMHhlZiwgMHhmMCwKKyAgMHgyYywgMHg0MSwgMHgzMCwgMHhkNCwgMHgzYiwgMHgwMCwgMHgwMCwgMHgyNiwgMHg0OCwgMHg4MCwgMHhhMSwgMHgwNSwKKyAgMHg5YiwgMHgxYiwgMHhiMCwgMHgwOCwgMHgyZSwgMHg5YywgMHhkNCwgMHg2YSwgMHgwNCwgMHhhNCwgMHhhMiwgMHhmNCwKKyAgMHgwNiwgMHgyYiwgMHhhZiwgMHg0OCwgMHg0YSwgMHgyNCwgMHhlZSwgMHg5YywgMHg4NywgMHgxNSwgMHg2OCwgMHg1NSwKKyAgMHgxMiwgMHg4NSwgMHg0NSwgMHg2NiwgMHg4NSwgMHgzOCwgMHhlYywgMHhmYiwgMHhlZSwgMHhkYiwgMHhhOCwgMHhmOSwKKyAgMHgyZSwgMHhjNiwgMHg3YiwgMHgyZCwgMHhiZSwgMHhkYywgMHhhMSwgMHhlOSwgMHgwMCwgMHhmYiwgMHg5MSwgMHgyZiwKKyAgMHhkOSwgMHgwMSwgMHg1ZiwgMHgyOCwgMHhiMSwgMHhiNywgMHhiZiwgMHg0ZCwgMHhiZCwgMHg3ZCwgMHgxMiwgMHhjNSwKKyAgMHhjNiwgMHhlZSwgMHhlYSwgMHgzYSwgMHg3OCwgMHg2MywgMHhiYSwgMHhlNiwgMHg3YywgMHhiMiwgMHhlMywgMHhkMSwKKyAgMHgzZSwgMHg0NiwgMHgxMCwgMHhiZiwgMHhkNywgMHg2MywgMHg5ZiwgMHg2NywgMHg3YiwgMHhhNywgMHhmOSwgMHhmMiwKKyAgMHhlNSwgMHg1NSwgMHg3ZiwgMHgwZCwgMHhiZiwgMHgwZSwgMHg1MSwgMHg5ZSwgMHhkZiwgMHg1NCwgMHhmNCwgMHg0MCwKKyAgMHgwNywgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwNywgMHhmZiwgMHhmZiwgMHgwZiwgMHg3MCwgMHhhMiwKKyAgMHgzMCwgMHhjZCwgMHhjOCwgMHgxOCwgMHgxOSwgMHg4NCwgMHgxNywgMHg3MCwgMHhiOSwgMHhhMiwgMHhlMiwgMHhhNiwKKyAgMHg1ZCwgMHg1MCwgMHgwMiwgMHgwOSwgMHgxMywgMHg5MSwgMHhmNCwgMHg4YywgMHhlYywgMHgyYSwgMHgwMCwgMHgxOCwKKyAgMHgwNCwgMHgzMiwgMHgyMywgMHgwNSwgMHhhYywgMHgzMiwgMHg2MywgMHg4ZiwgMHhiMywgMHhiYiwgMHg1OSwgMHg1YiwKKyAgMHgyMywgMHg2ZSwgMHhiYywgMHg1NywgMHhkNywgMHgyNiwgMHgyZCwgMHg1NSwgMHg0NywgMHhkNSwgMHgxOSwgMHgwYywKKyAgMHhhOCwgMHgzOCwgMHhhMiwgMHgyMiwgMHhlZiwgMHhmNiwgMHhjZSwgMHgyNSwgMHhkMCwgMHhiNiwgMHg0NiwgMHhmYywKKyAgMHhkMywgMHg1YSwgMHg0ZiwgMHgyZCwgMHhlMSwgMHhmYiwgMHg1ZSwgMHgyMywgMHg3MSwgMHg1NSwgMHg1ZiwgMHhmNSwKKyAgMHhmMywgMHgwOCwgMHhhYywgMHg0YywgMHhlNywgMHg0ZiwgMHg5ZCwgMHg2YiwgMHhjOSwgMHhlYiwgMHhmYiwgMHg2ZCwKKyAgMHg2ZiwgMHgxNywgMHg0MSwgMHgxYSwgMHhhNCwgMHg2YiwgMHg5YiwgMHgxYywgMHhkYSwgMHg0ZCwgMHg5YSwgMHg0YiwKKyAgMHhhMywgMHgyYywgMHg4MSwgMHgxMCwgMHg4MSwgMHg0MCwgMHg2MiwgMHg4MSwgMHgxNSwgMHg5MywgMHhlYiwgMHhiZCwKKyAgMHhlNiwgMHg5NywgMHg3OCwgMHg0OSwgMHhhNSwgMHg2OCwgMHgwZiwgMHgwYiwgMHgzNiwgMHgyNywgMHg5ZSwgMHhiYiwKKyAgMHg3YiwgMHhiOCwgMHhlMywgMHgyZCwgMHg4NCwgMHg4MCwgMHhkOCwgMHg4YiwgMHgxNCwgMHg2OSwgMHg5OCwgMHg4ZCwKKyAgMHgxMywgMHg2NCwgMHg5ZiwgMHgxMCwgMHgxYSwgMHgyYiwgMHhkNiwgMHgwOCwgMHg1ZCwgMHg2NCwgMHg5MSwgMHg1ZCwKKyAgMHgyZSwgMHgxYywgMHhmMCwgMHg5YywgMHhlZSwgMHhiNSwgMHg3MywgMHg2NiwgMHhmOCwgMHgzMywgMHhhNiwgMHg0MiwKKyAgMHg1MCwgMHhkMiwgMHhjMiwgMHhhMSwgMHgwNSwgMHgxNSwgMHhkOCwgMHhjNywgMHg0NSwgMHg5OSwgMHhiOCwgMHhiNSwKKyAgMHhiMiwgMHhmNiwgMHhiYywgMHgzYywgMHg1YywgMHg4MywgMHhiZiwgMHgwNiwgMHhmNCwgMHg3NiwgMHhhZiwgMHhiMSwKKyAgMHg4MSwgMHhlYSwgMHgwOCwgMHgwMiwgMHhmYywgMHgzNiwgMHgyNCwgMHgzZCwgMHgzZCwgMHgyYiwgMHgzYiwgMHhkNiwKKyAgMHhiNywgMHhkMCwgMHgxYiwgMHg0MywgMHgxMiwgMHg2YywgMHg1ZiwgMHg3YywgMHhjOSwgMHg1OCwgMHgzNywgMHg0OCwKKyAgMHhiOCwgMHg1NywgMHg4OSwgMHg2MSwgMHgxNiwgMHg1NSwgMHg2ZCwgMHg0OSwgMHhhNiwgMHg2NiwgMHg1MSwgMHhiMCwKKyAgMHhjMCwgMHhkNSwgMHgzYywgMHhhZCwgMHg5ZiwgMHhjZSwgMHhmYywgMHhiNywgMHhiYSwgMHgwZiwgMHg3ZiwgMHg4MSwKKyAgMHg2YiwgMHgwNiwgMHgwNiwgMHhhMSwgMHhkOCwgMHgwMCwgMHgwMCwgMHg4NSwgMHg0MCwgMHhhMCwgMHg4NCwgMHg4NiwKKyAgMHhjNCwgMHgwMCwgMHhjMiwgMHhkZCwgMHhjMiwgMHg5MCwgMHgzZSwgMHhhNiwgMHg1NSwgMHg0NSwgMHhiYywgMHhlNSwKKyAgMHg5YSwgMHg4MCwgMHg4YSwgMHg4YiwgMHg4YiwgMHhhZCwgMHhiZCwgMHg5NiwgMHhhYSwgMHgzMywgMHhjOSwgMHgzNiwKKyAgMHgyZSwgMHhmMSwgMHg5MSwgMHg5NCwgMHhiYywgMHhmZSwgMHgwZiwgMHg2ZSwgMHgxZSwgMHgxOCwgMHgxYiwgMHg4NCwKKyAgMHg2OSwgMHhhMCwgMHhiNCwgMHhiMSwgMHg5OCwgMHg3MCwgMHg3OCwgMHg0MiwgMHg1OCwgMHgwYiwgMHg5NCwgMHhkZSwKKyAgMHhlMywgMHg3MywgMHg5NCwgMHhiNCwgMHhjZCwgMHgzOCwgMHhlZSwgMHg1MCwgMHgzNCwgMHg1MSwgMHhhYiwgMHg0MiwKKyAgMHhjOSwgMHgyYiwgMHg5OSwgMHhjNiwgMHhmZCwgMHhmMSwgMHg4ZCwgMHg2YywgMHhiYywgMHg2ZCwgMHg0OSwgMHhhYywKKyAgMHgxZiwgMHg1MSwgMHg2ZCwgMHhiMSwgMHgxMCwgMHg3YSwgMHgxYywgMHhiYSwgMHg4OCwgMHg3MCwgMHg4MSwgMHg4MiwKKyAgMHg1YSwgMHg4OSwgMHg4YSwgMHgzMCwgMHg4MiwgMHg1NCwgMHg4ZiwgMHg0ZiwgMHg3ZCwgMHhlYiwgMHhmMSwgMHhlZiwKKyAgMHg5ZSwgMHg0MCwgMHgxYywgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwNywgMHhmZiwgMHhmZiwgMHgwNywKKyAgMHg3MywgMHg2MiwgMHg5OCwgMHg0OSwgMHg2OCwgMHgyNiwgMHgxOSwgMHg4NCwgMHgwNiwgMHg5OSwgMHg2ZCwgMHgwNSwKKyAgMHhkYiwgMHgyMCwgMHgyMCwgMHgyOCwgMHg0NCwgMHhhMCwgMHhlNywgMHhlMiwgMHg2MiwgMHhhNywgMHhmNCwgMHhmMiwKKyAgMHgyMSwgMHgwZSwgMHg1NywgMHgyNSwgMHhiYywgMHhkYSwgMHhjOCwgMHg5NCwgMHg1OCwgMHhiZSwgMHgwMywgMHg5OCwKKyAgMHhmZSwgMHg4ZiwgMHhjMSwgMHgxNSwgMHhmZCwgMHhhMywgMHg0NCwgMHhjYywgMHg1ZSwgMHhlMywgMHg4ZSwgMHgzZSwKKyAgMHhmOCwgMHhhMSwgMHg1MCwgMHg4MywgMHhiMSwgMHhlZiwgMHgyYSwgMHg2ZiwgMHg2NSwgMHg4OSwgMHg0ZiwgMHg5OSwKKyAgMHgzNiwgMHg1YywgMHhmMiwgMHg1NCwgMHg2YSwgMHhkZiwgMHg5MiwgMHgyMywgMHhkNiwgMHhmZiwgMHg0ZCwgMHhmMywKKyAgMHg4YywgMHg1ZSwgMHgzZSwgMHg5OCwgMHg2NiwgMHgyOCwgMHgzNCwgMHg0YSwgMHg3MiwgMHg5NywgMHgwOCwgMHgxNCwKKyAgMHhiOCwgMHhjZCwgMHgxNCwgMHgzZCwgMHg0NCwgMHhiNywgMHg2ZiwgMHg4NSwgMHg3MywgMHg5OCwgMHg3NSwgMHg0NSwKKyAgMHg3NiwgMHg2NiwgMHhlMywgMHgwOSwgMHg4OSwgMHhjNSwgMHgyMSwgMHhmMywgMHhiYSwgMHg5OCwgMHhkNiwgMHg4NCwKKyAgMHhmMywgMHhlMywgMHg5ZCwgMHgzMSwgMHhiMywgMHg5YywgMHhiNiwgMHhhOCwgMHg1MCwgMHg4YywgMHg0NSwgMHg4ZCwKKyAgMHgzZiwgMHg0NiwgMHhkZCwgMHg0OSwgMHg1NiwgMHg0ZSwgMHhhNCwgMHgwZCwgMHhjNiwgMHgxNywgMHgwZSwgMHhjNiwKKyAgMHhmYiwgMHgyNCwgMHg3ZSwgMHhjYiwgMHg3YywgMHgxYSwgMHg5NCwgMHgyMCwgMHg0ZiwgMHg1NywgMHgxYSwgMHhjNSwKKyAgMHhhNiwgMHgwMCwgMHhiOSwgMHhiOSwgMHhmYywgMHg1NCwgMHgwZSwgMHgxMywgMHhlMCwgMHg3NSwgMHg5YiwgMHgyMiwKKyAgMHg3OSwgMHg3ZSwgMHhiYywgMHg4NSwgMHgxZCwgMHhlYSwgMHhhNywgMHhiZiwgMHhkNSwgMHg4ZCwgMHhlYywgMHhhYywKKyAgMHg4MiwgMHhhOSwgMHg0YywgMHhhMCwgMHhmMywgMHgwYywgMHg0ZiwgMHgzYiwgMHhlMSwgMHhlNiwgMHgzMSwgMHg4MywKKyAgMHg0ZSwgMHg1NSwgMHhiMSwgMHgxZSwgMHg5MywgMHhkOSwgMHhlMCwgMHhhNCwgMHhjZSwgMHg5ZSwgMHhhZiwgMHgwYiwKKyAgMHg0NSwgMHhiNywgMHg3MCwgMHg3YSwgMHg1NSwgMHgxMiwgMHgxNCwgMHhkYiwgMHgxNCwgMHg5MiwgMHhhNywgMHgxOCwKKyAgMHgxZSwgMHg2OSwgMHg3YywgMHg5YiwgMHgzMiwgMHgwMCwgMHgzZiwgMHg3ZiwgMHg2NiwgMHhhOSwgMHhiOCwgMHg3ZCwKKyAgMHg2OSwgMHhkMSwgMHhkZiwgMHg0NiwgMHg5NSwgMHhkNywgMHg0NiwgMHhkOSwgMHhhYiwgMHg3YywgMHhiZSwgMHg5ZCwKKyAgMHhmOSwgMHhiOSwgMHhmNywgMHg3NCwgMHg4OCwgMHhmZiwgMHhkNSwgMHg0MCwgMHgxZSwgMHhiZiwgMHgwMiwgMHhkNiwKKyAgMHgyMiwgMHg4NywgMHg2MCwgMHgwMSwgMHgyOCwgMHgyYSwgMHg1ZCwgMHgxMCwgMHgxNCwgMHgwOCwgMHg4YywgMHgwMCwKKyAgMHgzNCwgMHg0YywgMHg3MywgMHhhNCwgMHhmYywgMHgzNywgMHg5MiwgMHg4NCwgMHhlMCwgMHhjZSwgMHg3NiwgMHhhNCwKKyAgMHgzMywgMHhkNiwgMHhmNCwgMHhkMCwgMHg5ZiwgMHg4YSwgMHhhYSwgMHhlYSwgMHg4NiwgMHg4OSwgMHgxNiwgMHhiYywKKyAgMHgzNCwgMHg2YiwgMHgyMywgMHgwOSwgMHhhNSwgMHgyZCwgMHhmMywgMHhiNywgMHhmOSwgMHg0NywgMHgyYSwgMHhkZiwKKyAgMHg1ZCwgMHgzOSwgMHg1YywgMHgzMCwgMHg1MywgMHgwYSwgMHg2OSwgMHg1ZCwgMHg0ZCwgMHg2NywgMHg3OCwgMHhkYSwKKyAgMHgzZSwgMHg1ZCwgMHg2NiwgMHg5NCwgMHg4YSwgMHg0MywgMHg2MCwgMHgwYiwgMHg5OCwgMHhjZCwgMHhhYiwgMHg1NCwKKyAgMHgwNSwgMHgwNiwgMHg4MSwgMHg4ZCwgMHhiNSwgMHhhMSwgMHg5OSwgMHhiYywgMHg4ZCwgMHhhMSwgMHg2NCwgMHhkMSwKKyAgMHg3NiwgMHg3ZCwgMHgyNSwgMHhkMywgMHg0NywgMHhhMiwgMHhjYSwgMHg2NCwgMHhmMiwgMHg1MSwgMHhkMywgMHg3ZCwKKyAgMHgzNiwgMHg3NSwgMHg2OSwgMHg5YiwgMHhjMSwgMHg2MiwgMHgyMywgMHgyYywgMHg0MywgMHhkZCwgMHg5YiwgMHhlOSwKKyAgMHhlOCwgMHhkZiwgMHhkMiwgMHgwMCwgMHhlMCwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMywgMHhmZiwKKyAgMHhmZiwgMHgxMywgMHg2ZiwgMHhhMiwgMHgzMSwgMHg4NSwgMHg4YywgMHg0MywgMHgwOCwgMHg2OCwgMHg5ZCwgMHgxMiwKKyAgMHhlMywgMHgyZSwgMHhjYSwgMHg1ZSwgMHg1ZSwgMHgwMCwgMHgwNSwgMHhkNSwgMHhlMCwgMHhkNiwgMHg1ZiwgMHg0YywKKyAgMHhiYiwgMHhjNiwgMHg0MCwgMHg2NSwgMHhmZCwgMHg1NiwgMHhkZiwgMHhmYSwgMHg3NywgMHg1ZCwgMHhlMCwgMHgwMCwKKyAgMHhkNiwgMHhlYywgMHg1MywgMHhhMCwgMHgyNywgMHg4ZCwgMHg4MywgMHhjMywgMHhmNywgMHgxZiwgMHhmNSwgMHg3OSwKKyAgMHhjMywgMHgzYiwgMHhiMywgMHhjYiwgMHg2NiwgMHhmNSwgMHg5YSwgMHhiZSwgMHgwOCwgMHg4MiwgMHgzMywgMHg4NiwKKyAgMHg3ZiwgMHhmNSwgMHgyNCwgMHg5MywgMHg4ZSwgMHg1NiwgMHhlMiwgMHhiOSwgMHhmOSwgMHgzMiwgMHg1YSwgMHhlYywKKyAgMHg1MiwgMHhjOSwgMHhmMSwgMHhjMywgMHgxZSwgMHg4MywgMHhlZCwgMHg1ZSwgMHgzNSwgMHhiZSwgMHhlZiwgMHgwMSwKKyAgMHhhNSwgMHhkNSwgMHgzOSwgMHgwYywgMHg3OCwgMHgzMSwgMHhhNSwgMHgwMCwgMHhkZiwgMHhjNSwgMHg1OSwgMHgxZiwKKyAgMHgwZiwgMHgxMiwgMHhmYywgMHhiMywgMHg2OSwgMHhjZSwgMHhiNywgMHgzMCwgMHhiMSwgMHgwZiwgMHg5MSwgMHg5MywKKyAgMHgxNiwgMHg1MywgMHg2YSwgMHhlNSwgMHhiNywgMHg3MSwgMHhkOCwgMHgzNSwgMHg5NiwgMHg4YiwgMHhhOCwgMHgxMSwKKyAgMHgzYiwgMHg4MSwgMHgyZSwgMHhiYywgMHhhMSwgMHgyYywgMHg4OSwgMHg1NiwgMHg1YywgMHhiNSwgMHhhNiwgMHg3NywKKyAgMHgyOSwgMHg3YiwgMHhhYywgMHgwOCwgMHg5NiwgMHhmMSwgMHg0MiwgMHhkYywgMHg0NSwgMHgxNiwgMHhmNiwgMHgxZCwKKyAgMHg1ZSwgMHgyNCwgMHgxNSwgMHhmZCwgMHgwYywgMHg1OSwgMHg0NCwgMHhhMSwgMHg2YSwgMHhkNSwgMHhkMiwgMHg1MSwKKyAgMHg4ZSwgMHgzMywgMHhhNCwgMHg0MiwgMHhkNiwgMHg1ZCwgMHhkMCwgMHhmMiwgMHg5NCwgMHhmYSwgMHg0ZiwgMHg3NiwKKyAgMHhmZSwgMHgwMywgMHhkYiwgMHg0OSwgMHg3OCwgMHg3YSwgMHhhMiwgMHg5YiwgMHhhMywgMHgwZCwgMHhhNCwgMHhjNSwKKyAgMHg0MywgMHhiMiwgMHhhYSwgMHg1YiwgMHgyZCwgMHhhZCwgMHg1ZiwgMHgxYiwgMHhhNSwgMHg2YywgMHhiNSwgMHhkOSwKKyAgMHgzMCwgMHhkMCwgMHg5OCwgMHhjOSwgMHg5MCwgMHhjZiwgMHhhNywgMHg0YSwgMHg4OSwgMHg5MSwgMHg5YiwgMHgwNCwKKyAgMHgwNSwgMHgzNiwgMHhkYiwgMHg4NSwgMHgzZCwgMHhmNywgMHg2NywgMHhlNiwgMHhjMywgMHg2YywgMHg3OCwgMHg2NywKKyAgMHhmZiwgMHhmZCwgMHhmZCwgMHg1YiwgMHhlNiwgMHhmZiwgMHg1MCwgMHgwZiwgMHg5ZiwgMHg5MywgMHg2MywgMHgxMCwKKyAgMHhjMywgMHhiMCwgMHgwMCwgMHgwMiwgMHhhYSwgMHhlMSwgMHg2MCwgMHhhMCwgMHg0OCwgMHhhYywgMHgwNiwgMHhkZSwKKyAgMHgwMiwgMHgxOSwgMHgzMCwgMHgxNCwgMHhkYiwgMHg2NCwgMHhhMiwgMHhmOCwgMHg2MiwgMHg2ZCwgMHhkNiwgMHgxMiwKKyAgMHgxMiwgMHg1YywgMHhhOSwgMHg3MywgMHg3NCwgMHg1NSwgMHgyYSwgMHhjNCwgMHhkNSwgMHhhMywgMHg3MiwgMHhhZCwKKyAgMHhkMywgMHhiNiwgMHhmYSwgMHg1MCwgMHg0YiwgMHhkNiwgMHg4ZCwgMHhkNywgMHg2OCwgMHgzMiwgMHg4NSwgMHhhOSwKKyAgMHhjZCwgMHg0ZiwgMHg2MSwgMHgxMCwgMHgwMCwgMHgwMiwgMHgzYywgMHhkOCwgMHhkOSwgMHg5OCwgMHgyNCwgMHg5ZSwKKyAgMHgwNCwgMHhkNCwgMHg0MSwgMHgwMSwgMHgyNCwgMHhmYSwgMHhkMCwgMHg3NiwgMHhlYSwgMHgzMywgMHhmMCwgMHhlZSwKKyAgMHgxMSwgMHgwNCwgMHgyNiwgMHhhMiwgMHg0NSwgMHhmMywgMHgxYSwgMHhhYSwgMHg4OCwgMHhhYSwgMHg4YSwgMHg4MiwKKyAgMHg0NCwgMHg3YywgMHhmNCwgMHhjNSwgMHhmZCwgMHg1MywgMHhmNiwgMHg3ZiwgMHhhOSwgMHhlYSwgMHg3ZCwgMHg1ZiwKKyAgMHg2YywgMHgzOCwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMywgMHhmZiwgMHhmZiwgMHhmZiwgMHgwOSwgMHg3MywKKyAgMHg2MywgMHgxMiwgMHgxMCwgMHg4YywgMHgyOCwgMHgxMiwgMHg4NCwgMHgxNiwgMHg0NSwgMHhlNywgMHg0ZSwgMHg1YSwKKyAgMHhmMywgMHg1OSwgMHg1YSwgMHg1MiwgMHg4MCwgMHg1OCwgMHgyNSwgMHgwNSwgMHhhMCwgMHg2YywgMHg5OCwgMHgxYywKKyAgMHg1NCwgMHg4MCwgMHg5NSwgMHgyOSwgMHgwMCwgMHg4MywgMHhkZCwgMHg4MiwgMHgxZiwgMHgxZSwgMHgxZSwgMHhjNCwKKyAgMHg0OSwgMHgwNCwgMHg4YSwgMHhkNiwgMHg1MSwgMHgzMiwgMHhjMywgMHg5OSwgMHg0NywgMHhiNSwgMHhiZCwgMHg4YiwKKyAgMHgxMCwgMHhkMSwgMHgxYiwgMHhmNywgMHgyMCwgMHgxMiwgMHg1YSwgMHgxZiwgMHgzMywgMHg3NSwgMHhiZSwgMHhhYSwKKyAgMHhkZiwgMHg3OCwgMHg4NywgMHg1MiwgMHg0MiwgMHgyNywgMHg5YSwgMHgxYywgMHg4ZSwgMHhkZCwgMHhmNCwgMHhlMSwKKyAgMHhlNCwgMHgyZSwgMHgyOSwgMHgwZSwgMHg0YSwgMHhkNSwgMHhmZSwgMHhlMywgMHgwNCwgMHg1NiwgMHg4OCwgMHg2NSwKKyAgMHhkMywgMHg1NywgMHgzYSwgMHhkMywgMHg4YSwgMHg3ZCwgMHhkZCwgMHgxNCwgMHhiZiwgMHhiZiwgMHgxYSwgMHhkYSwKKyAgMHhlMiwgMHhmYywgMHhmMywgMHg3MSwgMHhhOSwgMHg5ZSwgMHgyOCwgMHg1NiwgMHhjYSwgMHgyNSwgMHg2MiwgMHg5NSwKKyAgMHg5MCwgMHg5ZCwgMHgzYSwgMHg0YiwgMHhlOSwgMHg0YywgMHhlNiwgMHg4YywgMHg5MiwgMHg5ZCwgMHg0ZiwgMHg4ZiwKKyAgMHhiYiwgMHhjMywgMHhmNCwgMHgwOSwgMHgyZiwgMHg0YiwgMHhkZCwgMHgyYSwgMHg4NiwgMHhiOSwgMHg0OSwgMHg2OCwKKyAgMHg1MiwgMHgxMSwgMHg0MiwgMHgyNywgMHg4ZSwgMHg2MCwgMHg1NSwgMHgyYywgMHhhYiwgMHgyNSwgMHgwMCwgMHg4ZSwKKyAgMHhjMSwgMHgwNSwgMHhhZCwgMHgwOCwgMHgxMywgMHhkYSwgMHgxMiwgMHg4MywgMHgyNSwgMHgxNywgMHg2MSwgMHgwMiwKKyAgMHg3YSwgMHhkNCwgMHgwNywgMHg0MSwgMHhiYSwgMHgwMCwgMHgxYSwgMHhjMSwgMHg5MiwgMHgyMCwgMHg4YSwgMHgwNCwKKyAgMHg2YSwgMHg0YywgMHg0MywgMHgyMSwgMHhiOCwgMHg5MiwgMHgwZCwgMHhkNywgMHhlMSwgMHhiNCwgMHhjNSwgMHgyNCwKKyAgMHhjNywgMHhjMCwgMHg5ZCwgMHg5YSwgMHg5OSwgMHg1MCwgMHhhNCwgMHgzMiwgMHg0NCwgMHgzNywgMHg3ZCwgMHhiMywKKyAgMHhkYywgMHg3MSwgMHhjNywgMHg5YywgMHhiZSwgMHg3MiwgMHgxMCwgMHg5NCwgMHhmMiwgMHhkYywgMHg5NywgMHg0ZCwKKyAgMHgwMCwgMHhiNiwgMHg0YSwgMHhkNiwgMHg0ZCwgMHg4NywgMHhiMSwgMHgwNywgMHg5NCwgMHg0YiwgMHgyYSwgMHhlMSwKKyAgMHhlNywgMHhhNCwgMHhhNywgMHgxOCwgMHhkOSwgMHhmMiwgMHg1YSwgMHg4NSwgMHhhYiwgMHg2YSwgMHg0MywgMHgyOSwKKyAgMHg2MSwgMHg0ZCwgMHg4MiwgMHgyOCwgMHhhNiwgMHg4NCwgMHgzYiwgMHhmMiwgMHg5NywgMHg2YywgMHgwOSwgMHg1MywKKyAgMHg2OCwgMHg1ZiwgMHgwOCwgMHg0NiwgMHg1MywgMHhmZSwgMHhmMywgMHhlOSwgMHhkZiwgMHhkMywgMHhkZiwgMHhmOCwKKyAgMHg4MCwgMHgzZCwgMHg3YywgMHg1OCwgMHg0NCwgMHg3MSwgMHg0YSwgMHgwOSwgMHg4NywgMHgwMSwgMHg3MCwgMHhlYywKKyAgMHgwMCwgMHgyYSwgMHgyNCwgMHhhNCwgMHgwNSwgMHgwMCwgMHgyYywgMHg0MCwgMHg2OSwgMHg2OCwgMHg5NiwgMHgyMywKKyAgMHgyZSwgMHg1NywgMHg0MiwgMHgyMiwgMHhkMSwgMHhjOSwgMHhhNCwgMHgzYiwgMHhlMSwgMHg4MSwgMHg3MywgMHhkNiwKKyAgMHgyMiwgMHg3MywgMHg5YywgMHgxMiwgMHgyOSwgMHg5MCwgMHgzMCwgMHg4YSwgMHgxMiwgMHhkZSwgMHg0NCwgMHg0NCwKKyAgMHhlMCwgMHgyNSwgMHhhMSwgMHhlZCwgMHg0ZCwgMHg2NywgMHhjNiwgMHg5MywgMHhjZSwgMHg4YywgMHgwOCwgMHg5OSwKKyAgMHhiNCwgMHg0ZCwgMHgzYSwgMHg1YSwgMHhmZSwgMHg1MiwgMHg5MCwgMHg1ZCwgMHgzZiwgMHgxYywgMHg1NiwgMHg2NSwKKyAgMHhlNywgMHhhZiwgMHg5MSwgMHgwYSwgMHhlOCwgMHhjYiwgMHg5MywgMHhlOSwgMHgzYiwgMHg3MiwgMHg0YSwgMHg3NiwKKyAgMHhkMSwgMHhhMCwgMHhiYywgMHhiMCwgMHhlNSwgMHgwYSwgMHg3NywgMHgwYywgMHgwYywgMHg4OCwgMHgyNiwgMHhjMiwKKyAgMHhjNCwgMHg5MiwgMHhiZCwgMHhkNiwgMHgxMiwgMHg5NSwgMHgzNiwgMHg0YSwgMHg5NCwgMHhjNSwgMHhlOCwgMHhmMiwKKyAgMHg4YywgMHhkNywgMHhjYSwgMHg5MywgMHhjZiwgMHg1NCwgMHg5ZCwgMHg1ZCwgMHhjMiwgMHg3NCwgMHhlZiwgMHhiZSwKKyAgMHhiYywgMHgyZCwgMHg5ZiwgMHg5ZCwgMHhiNywgMHhjMiwgMHhmMywgMHhkZCwgMHhhZSwgMHhkMiwgMHg1MCwgMHg2ZSwKKyAgMHgxYywgMHgyOCwgMHhjZiwgMHhjNywgMHg4YywgMHhjNiwgMHgxOSwgMHhmNiwgMHhkYSwgMHg5YSwgMHhiNiwgMHhiYywKKyAgMHgxNywgMHgyYiwgMHhhOCwgMHhmMSwgMHhmNiwgMHg3MSwgMHhmNiwgMHg4MCwgMHg3MCwgMHgyMSwgMHgxYSwgMHg4OCwKKyAgMHgwMCwgMHgwMCwgMHg3ZiwgMHhmZiwgMHhmZiwgMHgwYiwgMHg2ZiwgMHhhMSwgMHhkOCwgMHg1OCwgMHhhOCwgMHgyMiwKKyAgMHgyYSwgMHgxOSwgMHg4NSwgMHgwMiwgMHg1MCwgMHg4MCwgMHgwZiwgMHg2NSwgMHg4ZCwgMHgyYSwgMHg1ZCwgMHg0YywKKyAgMHgyMCwgMHgwMCwgMHg5MywgMHg2MywgMHgxZiwgMHg4NCwgMHg5YywgMHg3MSwgMHgxMSwgMHg0NSwgMHgzMiwgMHgzMCwKKyAgMHg0NywgMHg0NSwgMHgxMCwgMHg5OCwgMHg0OSwgMHg1YiwgMHgzMCwgMHg5OCwgMHgwMywgMHg2ZSwgMHg4MywgMHhmMywKKyAgMHhkMiwgMHhlOCwgMHhjOCwgMHgwNCwgMHgxYSwgMHg4ZSwgMHg1NiwgMHgyZiwgMHgyNywgMHg2MSwgMHg5MCwgMHg3ZSwKKyAgMHg3NywgMHhlZCwgMHgzYiwgMHgxNCwgMHgxMSwgMHg5ZCwgMHgzNywgMHgwOSwgMHhhNiwgMHgyZiwgMHg0YywgMHhmZiwKKyAgMHhjYiwgMHhkOSwgMHhkMCwgMHg3NiwgMHg1NiwgMHg0NSwgMHhkNiwgMHg5NSwgMHg0NCwgMHgzYSwgMHg5OSwgMHhjNywKKyAgMHgzMCwgMHg3ZCwgMHhjZiwgMHgyYywgMHg5ZSwgMHg5YywgMHhjYSwgMHg3YiwgMHgyYywgMHg5NiwgMHg0YSwgMHg3YiwKKyAgMHg2YSwgMHg4NSwgMHg5MCwgMHg2ZCwgMHgwNywgMHhkMSwgMHhhZCwgMHhmZSwgMHg2OSwgMHgwNCwgMHg5NSwgMHhiNSwKKyAgMHhjNywgMHg4MiwgMHhhYywgMHhhNiwgMHgwZiwgMHgyYywgMHhhZiwgMHg4YiwgMHhmZiwgMHg1YSwgMHg3MiwgMHg1MiwKKyAgMHhkNCwgMHhiYiwgMHhmNywgMHg3MywgMHg2ZSwgMHg5OCwgMHg1MywgMHhmZCwgMHg1YiwgMHhiYiwgMHhlZiwgMHg4NiwKKyAgMHg3ZSwgMHhlYSwgMHhmNSwgMHhlYywgMHhmMCwgMHhhNywgMHhhNSwgMHhhNiwgMHhiOSwgMHg0NCwgMHhkZSwgMHg5YywKKyAgMHgwMSwgMHg2ZiwgMHhkMywgMHg1OSwgMHg1MCwgMHgyOCwgMHg2MywgMHg3YywgMHg1NiwgMHg5MywgMHgxNSwgMHg2YSwKKyAgMHgyNSwgMHgzZSwgMHhhYywgMHg4ZiwgMHhmMCwgMHgyMSwgMHg1NiwgMHhhYiwgMHgxYiwgMHgwOSwgMHhhOSwgMHhkOSwKKyAgMHhkOCwgMHgyYywgMHhmNiwgMHg0ZiwgMHhmZCwgMHgxMiwgMHgzNSwgMHgxNSwgMHgxYSwgMHg2OSwgMHhhNywgMHg5NiwKKyAgMHg0MywgMHgxNSwgMHhjOCwgMHg1MSwgMHhlNSwgMHg0NCwgMHg5OCwgMHgyYiwgMHg2NywgMHhmMSwgMHgyNiwgMHg2NCwKKyAgMHhmZCwgMHhkOSwgMHgxYSwgMHgzMiwgMHgzOCwgMHgxYSwgMHhiMiwgMHg1NCwgMHhlYiwgMHg4ZCwgMHgyNiwgMHgwMywKKyAgMHg4OCwgMHhkOCwgMHg2MCwgMHg2ZCwgMHgwMywgMHhjNSwgMHhkMCwgMHhjZSwgMHgzZCwgMHg2OCwgMHgzMSwgMHgwYSwKKyAgMHgwYSwgMHhjYywgMHhmOCwgMHgzNiwgMHgxOSwgMHhjZSwgMHgwMCwgMHg1NSwgMHg0NiwgMHgxMSwgMHg4NSwgMHg3MiwKKyAgMHg0YywgMHgyNywgMHg5MCwgMHhkZCwgMHhkNSwgMHhiYywgMHhkYiwgMHhjMywgMHgzZCwgMHhiNCwgMHg2MywgMHg1NiwKKyAgMHhlMCwgMHg1MSwgMHg5ZiwgMHgyOCwgMHg3YywgMHg0NSwgMHhkNiwgMHg4NSwgMHhlOSwgMHhmMywgMHgyNiwgMHgzYywKKyAgMHg3OCwgMHhmMSwgMHg2OSwgMHg2ZCwgMHgyOSwgMHg2ZiwgMHhkYywgMHhkNywgMHhkYSwgMHhkZCwgMHg1ZiwgMHg4YiwKKyAgMHg5ZiwgMHg4ZiwgMHg4ZiwgMHgxOCwgMHhkZCwgMHg1ZiwgMHg0ZiwgMHhkOSwgMHhhZiwgMHhmOSwgMHhmYiwgMHgzZSwKKyAgMHg2MCwgMHgwOCwgMHgwZiwgMHhhMCwgMHhjOSwgMHgwNCwgMHhjMSwgMHgxMCwgMHhlYywgMHgwMCwgMHgwMCwgMHgxZCwKKyAgMHgyMSwgMHgzMiwgMHhlOCwgMHgzMCwgMHg2NSwgMHhmMiwgMHgwMCwgMHgyNywgMHgwZCwgMHg1ZiwgMHhhNywgMHgwOSwKKyAgMHgyZiwgMHhmOSwgMHhlZiwgMHg0NSwgMHg2YSwgMHhkZSwgMHgzMiwgMHg4OCwgMHgyYSwgMHgyYywgMHhhNCwgMHgwOSwKKyAgMHg4NiwgMHg3ZCwgMHgxNywgMHhjMSwgMHhjMCwgMHhjZSwgMHgzNCwgMHgwNSwgMHhkNSwgMHg4ZCwgMHhmZSwgMHg1ZiwKKyAgMHhlMywgMHhiNywgMHg4ZiwgMHgxMCwgMHg1NCwgMHhiZiwgMHhlZSwgMHg5NiwgMHhkMywgMHhiNywgMHg5YywgMHgxZiwKKyAgMHg5ZCwgMHg5YywgMHgwNSwgMHhlMywgMHgyOCwgMHhhOSwgMHhiMywgMHg2NSwgMHhmMSwgMHhmMCwgMHhiNywgMHg0YiwKKyAgMHhmYiwgMHg3NCwgMHhiMSwgMHg3NywgMHg1OSwgMHhmZCwgMHhlZiwgMHhhYSwgMHhkNiwgMHgyNiwgMHg0YiwgMHhiMiwKKyAgMHgzMSwgMHhmZSwgMHg2ZiwgMHg3NSwgMHg5YywgMHg3YSwgMHgyMCwgMHgxNSwgMHg3MiwgMHg4OCwgMHg1YiwgMHgyNCwKKyAgMHhmNywgMHgzZCwgMHg0NCwgMHgyMCwgMHgwZiwgMHhkNSwgMHhjMywgMHgxZiwgMHhiNiwgMHgwMSwgMHhjMCwgMHgyMSwKKyAgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgxMSwgMHg3MiwgMHg4MywgMHgyMCwgMHhjOSwKKyAgMHg0YywgMHg0NSwgMHgwOCwgMHgwMywgMHgzNSwgMHhmMCwgMHg5NSwgMHhhMywgMHg0MCwgMHhhMCwgMHgwMCwgMHg5NSwKKyAgMHgyNiwgMHhjNywgMHhiYywgMHhmZSwgMHhjZSwgMHg3NywgMHg2NywgMHgxNSwgMHhlNywgMHg1MSwgMHhkMCwgMHgyMiwKKyAgMHg5MywgMHhjNywgMHhhMCwgMHg1NiwgMHg2OCwgMHhmYywgMHg3ZCwgMHg3OSwgMHhkMSwgMHg1ZSwgMHhlNSwgMHhlZiwKKyAgMHg3ZiwgMHgzZSwgMHhjNSwgMHhhMSwgMHhhMSwgMHhmZCwgMHhlMSwgMHg5ZiwgMHg5ZSwgMHgyZiwgMHhmOCwgMHg0NSwKKyAgMHgyNywgMHhiOCwgMHgzZCwgMHg3MiwgMHg0OSwgMHhmYywgMHg5NywgMHhlMywgMHg1MywgMHhmMCwgMHg3NywgMHg0ZiwKKyAgMHgyNCwgMHg1NSwgMHgxNywgMHg5YSwgMHg5ZiwgMHg2OSwgMHhjYywgMHg4NSwgMHg4NiwgMHhiYSwgMHg2MSwgMHg5NSwKKyAgMHg1ZCwgMHg4MywgMHhhOSwgMHhhOSwgMHg4NiwgMHhhYywgMHhkMywgMHg5MSwgMHhlNywgMHgzMiwgMHgzZCwgMHhlNCwKKyAgMHhiNCwgMHhmMSwgMHgxNSwgMHhkMywgMHg3MiwgMHhmZiwgMHgwZCwgMHg5NiwgMHg0YiwgMHg1YiwgMHhkMywgMHg3NywKKyAgMHhjOSwgMHgyMSwgMHg1MSwgMHhmMiwgMHg1MywgMHgyZCwgMHgzOSwgMHg0OSwgMHhhZCwgMHgxOSwgMHhjZSwgMHg2ZSwKKyAgMHhlZCwgMHgzYSwgMHhiMCwgMHgwMSwgMHgzMCwgMHhjZiwgMHg5NSwgMHg0ZSwgMHhhYSwgMHhkNiwgMHhjYSwgMHg3YSwKKyAgMHgwOSwgMHgzNywgMHg3ZSwgMHgzNCwgMHg2ZiwgMHg5OSwgMHg1ZCwgMHhkYSwgMHg0NSwgMHgzNSwgMHg2ZCwgMHg3ZCwKKyAgMHg5MiwgMHg2OCwgMHhkNSwgMHg3MSwgMHgyZiwgMHg1NywgMHhjZSwgMHgxMywgMHg1MiwgMHhiOCwgMHgwMywgMHhjZSwKKyAgMHg2OSwgMHg2NCwgMHhlYSwgMHg2ZCwgMHg2YSwgMHg1NywgMHhkMCwgMHhlOCwgMHg0ZSwgMHg2MCwgMHgzYywgMHg4NCwKKyAgMHhkYywgMHhjMywgMHgyMiwgMHg2YSwgMHgzZCwgMHgyMCwgMHg1MiwgMHhmZCwgMHg2MCwgMHgyNCwgMHgzYSwgMHhlZSwKKyAgMHhiZiwgMHhjMCwgMHhhNiwgMHgwMywgMHg3NywgMHhiYSwgMHg3MiwgMHg2NCwgMHg0ZCwgMHhhNCwgMHhkZiwgMHgzYywKKyAgMHgzYSwgMHg3MywgMHg5OSwgMHg2MywgMHg0MSwgMHhlMiwgMHhmNiwgMHhmMSwgMHhmYiwgMHgwZSwgMHhkZSwgMHgyZSwKKyAgMHg2YiwgMHgzNCwgMHhmMSwgMHhkOCwgMHgzMCwgMHhlMiwgMHg1MywgMHg0YSwgMHhhMCwgMHg0ZSwgMHg3OSwgMHhkMCwKKyAgMHg5MCwgMHhmNywgMHg5YSwgMHhjYywgMHg0MywgMHg5ZSwgMHgxNiwgMHgzNCwgMHhlNSwgMHg1OSwgMHg2ZiwgMHhkMCwKKyAgMHhkOCwgMHgwZCwgMHhiNiwgMHg4ZSwgMHgzNiwgMHg3NiwgMHg0YSwgMHg5YywgMHg2YywgMHgxOCwgMHhiZCwgMHhiZCwKKyAgMHgzZSwgMHg2ZCwgMHhjZCwgMHg0NSwgMHg1ZSwgMHg2YSwgMHhkYSwgMHhiYywgMHg2NiwgMHgyZSwgMHhiYywgMHg3ZiwKKyAgMHgxZSwgMHgzYiwgMHhlOSwgMHhkNywgMHhkOSwgMHhlMCwgMHgwMCwgMHhmOSwgMHhmYiwgMHgxNCwgMHhhMCwgMHg5OCwKKyAgMHg2YSwgMHgxZCwgMHg4MCwgMHgwMCwgMHgyNCwgMHhhNCwgMHhhMiwgMHhiNCwgMHgzMCwgMHgwOCwgMHg2MCwgMHg4NCwKKyAgMHg5NiwgMHhhZCwgMHg4ZCwgMHg4YiwgMHg1NSwgMHhlZCwgMHhiOSwgMHg1YSwgMHhhMSwgMHgwZSwgMHhkMCwgMHg4MCwKKyAgMHgxMCwgMHg0MSwgMHgwMSwgMHhjYywgMHhhYywgMHg3MSwgMHgxOSwgMHhlZCwgMHhiZSwgMHg1YywgMHhkMSwgMHhhNiwKKyAgMHgzMiwgMHg5YSwgMHhjNSwgMHhhNiwgMHg5YywgMHhhNSwgMHg0MiwgMHg5OSwgMHg2MCwgMHgxNSwgMHgzNSwgMHg3NCwKKyAgMHhjZiwgMHgxZSwgMHg2NCwgMHgwOSwgMHg3ZSwgMHgzOCwgMHgyZSwgMHhhOCwgMHhhNCwgMHgwYiwgMHgyZSwgMHgwOSwKKyAgMHg2OCwgMHg5ZiwgMHg2YywgMHhmOCwgMHhlMywgMHhkNywgMHhkNSwgMHgzNCwgMHg5MCwgMHg2YSwgMHgwOSwgMHg1ZSwKKyAgMHgwMywgMHhkZiwgMHhiNiwgMHhhYiwgMHhiMCwgMHhjMSwgMHhjYSwgMHhlYSwgMHhlNSwgMHg1MSwgMHhhYSwgMHg3OSwKKyAgMHg4MCwgMHg3NCwgMHg2ZSwgMHhjYSwgMHhjYywgMHhhNiwgMHhmNSwgMHg3YywgMHg3YywgMHhmMywgMHhlYSwgMHhjNywKKyAgMHhiZiwgMHg4MCwgMHgwNywgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwNywgMHhmZiwgMHhmZiwgMHgwZiwKKyAgMHg3MCwgMHhhMiwgMHgzMSwgMHgwZCwgMHgwNCwgMHg1NiwgMHgyMSwgMHg4NCwgMHgwMiwgMHgzYSwgMHg1ZSwgMHg4MSwKKyAgMHhhNSwgMHg0YSwgMHhjMCwgMHg0MCwgMHgyMiwgMHgzNiwgMHgzOSwgMHgxMCwgMHg4MiwgMHhhMCwgMHg2ZCwgMHgyYSwKKyAgMHhkMCwgMHhkMiwgMHhmYiwgMHg3MCwgMHg1OCwgMHg1NywgMHg3MiwgMHhhYiwgMHgwNiwgMHhmZiwgMHgxZiwgMHhkNCwKKyAgMHgzYiwgMHgzYSwgMHhiNSwgMHgyMSwgMHg2YSwgMHgzYywgMHg2ZiwgMHg1ZSwgMHgxZCwgMHhkNiwgMHgzZCwgMHhjNywKKyAgMHg2MSwgMHhjYywgMHhjOCwgMHhkNiwgMHhmYywgMHhjNywgMHhlOCwgMHgzOSwgMHhhNywgMHhhYSwgMHg3YSwgMHgwMiwKKyAgMHg1MywgMHgwNCwgMHg4YiwgMHg4YiwgMHhjNCwgMHg2ZSwgMHg1NiwgMHhkZCwgMHg3OCwgMHhhZSwgMHhmOSwgMHhhNiwKKyAgMHhhYiwgMHgxOCwgMHgzNywgMHg4NywgMHg4MSwgMHg2ZSwgMHgwOCwgMHgxZiwgMHhiZCwgMHhhYSwgMHgxOCwgMHg3MywKKyAgMHhkMCwgMHgwYiwgMHgyYywgMHgzZCwgMHhiZSwgMHgwMCwgMHhkNSwgMHg5MCwgMHg4ZCwgMHgxNywgMHgwMCwgMHhmYywKKyAgMHhmMCwgMHg4OSwgMHg0OSwgMHg5MiwgMHhmMywgMHhjZiwgMHg3NywgMHhjYSwgMHhiZCwgMHg5YiwgMHgzNywgMHgyMywKKyAgMHhjYiwgMHgzOCwgMHhmOSwgMHgxMiwgMHhhNSwgMHhkMywgMHhmNiwgMHg5YiwgMHhkOSwgMHhhMywgMHhmMSwgMHhkZiwKKyAgMHg4YywgMHg1NCwgMHhmOCwgMHhkMywgMHhjNSwgMHhhYSwgMHhkNSwgMHgwZCwgMHg1NywgMHg3NiwgMHgzZCwgMHhhMiwKKyAgMHg1YywgMHhjZCwgMHgzYSwgMHhjYywgMHhiOCwgMHg0ZSwgMHg1MSwgMHhkNSwgMHgyMCwgMHg0NywgMHg0NCwgMHgwNCwKKyAgMHgyMywgMHhiMCwgMHg3NiwgMHhkMSwgMHg4ZCwgMHhhYiwgMHgzYSwgMHg0ZCwgMHgxNSwgMHhhOSwgMHg3NSwgMHhjNSwKKyAgMHgwMywgMHg1MywgMHg2ZSwgMHg5MCwgMHgzOSwgMHg1MCwgMHg5OCwgMHg2NywgMHgwMCwgMHg4OSwgMHgzYywgMHhjNCwKKyAgMHg2NCwgMHgzMSwgMHg3MywgMHhiMCwgMHhmNSwgMHgxOCwgMHg3YSwgMHgzOCwgMHhjNCwgMHhhMywgMHg4NiwgMHg3OCwKKyAgMHhjMywgMHg1OCwgMHhjNCwgMHhlYSwgMHgwMCwgMHg2MSwgMHgzMiwgMHgxOCwgMHg2NiwgMHg0NSwgMHgyNSwgMHhmNCwKKyAgMHg4MiwgMHhmNywgMHhhZCwgMHgyNiwgMHhlZSwgMHhkYiwgMHg5YywgMHg2YywgMHhjMiwgMHhhMCwgMHg4ZSwgMHg1NCwKKyAgMHg1ZCwgMHhhYSwgMHhhOCwgMHhiNiwgMHg5YywgMHhmYiwgMHhhNSwgMHhjMywgMHhkZiwgMHhiZSwgMHgwYiwgMHhjYywKKyAgMHg0YSwgMHg0NywgMHg3NywgMHg4NywgMHg2NiwgMHhlNSwgMHhjNywgMHhlMywgMHhmZSwgMHg5MSwgMHhlYSwgMHhkZiwKKyAgMHgzYSwgMHgwZiwgMHg3ZiwgMHg4MSwgMHg2MiwgMHgwOSwgMHg4NiwgMHhhMSwgMHhkOCwgMHgyNSwgMHgwMCwgMHgxMSwKKyAgMHg1MiwgMHhhYywgMHgwMCwgMHgxMiwgMHgwMCwgMHgwNSwgMHgyMCwgMHg0NSwgMHgyNywgMHgzMiwgMHgxMCwgMHg0ZiwKKyAgMHg4MCwgMHgxMywgMHg5YSwgMHgxMywgMHhiMywgMHg0OCwgMHg1NiwgMHg1MywgMHg1NiwgMHgxMSwgMHg0YiwgMHg2NSwKKyAgMHhjMiwgMHgyYiwgMHhjNCwgMHg0NiwgMHg4YiwgMHhmZCwgMHgzZiwgMHhjMSwgMHg3ZSwgMHg2MiwgMHg4YywgMHg3MiwKKyAgMHgwMCwgMHg3NywgMHhiMywgMHhkOSwgMHg0OCwgMHgyNCwgMHgyMiwgMHgwMSwgMHhiNiwgMHg3NCwgMHhmMiwgMHhlZSwKKyAgMHg0NiwgMHg4MywgMHhiZSwgMHhmMywgMHg0MCwgMHgyMiwgMHg1MCwgMHg5MSwgMHhkZCwgMHg2ZSwgMHg0OCwgMHg1NCwKKyAgMHg0OSwgMHg3MCwgMHg2MywgMHhmNywgMHhhOCwgMHgyMiwgMHgxMCwgMHhhYSwgMHhiZiwgMHhjYSwgMHgyMCwgMHg1OCwKKyAgMHg1NywgMHg5ZiwgMHg3YywgMHhkNSwgMHhlZCwgMHhlMSwgMHhlOCwgMHhhNiwgMHhmOSwgMHgyNywgMHg3NiwgMHhjYiwKKyAgMHg3ZSwgMHhlZSwgMHhmZiwgMHgzZiwgMHhmMSwgMHg4YywgMHhmZCwgMHg5YywgMHhmOCwgMHgwMCwgMHg3MCwgMHgyMSwKKyAgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHg3ZiwgMHhmZiwgMHhmZiwgMHgxMywgMHg3MywgMHg2MiwgMHg5MiwgMHhkMCwKKyAgMHg0YywgMHgyOCwgMHgxMSwgMHg4NCwgMHgxYywgMHgwYiwgMHg2OSwgMHhkMCwgMHg1OSwgMHg0OSwgMHg4MCwgMHg4MCwKKyAgMHg0MiwgMHg2YywgMHg3OSwgMHgzZSwgMHgwNiwgMHg1YSwgMHg4NCwgMHg0NCwgMHg2OSwgMHg5NywgMHg3YiwgMHg3YiwKKyAgMHg5YywgMHg5YSwgMHg3MiwgMHg2NiwgMHgxNCwgMHgwYiwgMHhlNCwgMHgzYSwgMHgxNywgMHg2OCwgMHhmMCwgMHg0OSwKKyAgMHhkNCwgMHgzZSwgMHhmYywgMHhlNywgMHgxMCwgMHg5MCwgMHg3NiwgMHgyNSwgMHhhNCwgMHg1ZSwgMHg2YywgMHg4YSwKKyAgMHhlZCwgMHhlMSwgMHg3MiwgMHgyZiwgMHhhNCwgMHhiZSwgMHgyZSwgMHg5MCwgMHg3NSwgMHg5YiwgMHhmZiwgMHg4MywKKyAgMHgzNywgMHgyZiwgMHgzOCwgMHg5NiwgMHg3YywgMHhkOCwgMHg5ZSwgMHgyZCwgMHg2YSwgMHg0MiwgMHhmNiwgMHg4OSwKKyAgMHg2MCwgMHgxNywgMHg5NywgMHg0MiwgMHg3NSwgMHg0ZSwgMHg2OSwgMHg3MywgMHhkMywgMHhlZiwgMHhmNywgMHhjOCwKKyAgMHhjYiwgMHgzOCwgMHg5YiwgMHhiMCwgMHhlMywgMHhlOSwgMHgzNiwgMHg1MywgMHg3ZSwgMHhjNCwgMHgxZCwgMHhlNywKKyAgMHhiMiwgMHhmMywgMHgxZCwgMHg2ZCwgMHhjNywgMHg2NCwgMHg0ZiwgMHg3ZSwgMHg4ZiwgMHgzMSwgMHg4NiwgMHg5ZSwKKyAgMHg1OSwgMHgxNSwgMHg0NywgMHhjMywgMHhkYywgMHgzZSwgMHg3YiwgMHhlOSwgMHhiNiwgMHg0YiwgMHhiOSwgMHgxZiwKKyAgMHg2ZCwgMHgyNCwgMHgyYywgMHhjMywgMHhhNywgMHhjMiwgMHg0MCwgMHgzYSwgMHg1MCwgMHhiMiwgMHgwMywgMHhjMSwKKyAgMHgyMywgMHgwNCwgMHgyYSwgMHg1MCwgMHg3YSwgMHhiZSwgMHg3NiwgMHg4NSwgMHg0NCwgMHg5NSwgMHhjOCwgMHhjMCwKKyAgMHhhYiwgMHhjNSwgMHg4ZSwgMHgxYywgMHgxYywgMHgxNSwgMHhkNCwgMHhmNCwgMHg0MiwgMHhkMSwgMHg4NCwgMHhlNywKKyAgMHhjOSwgMHhhNSwgMHg3ZiwgMHhhZCwgMHgzZCwgMHg2YiwgMHgwMSwgMHg3NiwgMHgwMywgMHg5NCwgMHhjOCwgMHhlZSwKKyAgMHgxNiwgMHg2YSwgMHhkZCwgMHgxZSwgMHgxYiwgMHgzNywgMHg0MiwgMHg5NCwgMHgxZCwgMHhmZCwgMHhhYSwgMHg2MiwKKyAgMHhlMSwgMHhjYSwgMHgyYiwgMHgyOCwgMHg5YywgMHgxOCwgMHgyYSwgMHhlYSwgMHg2YywgMHg3MiwgMHg2YiwgMHhlZSwKKyAgMHg4MywgMHgyNiwgMHhhOCwgMHg4YiwgMHgwYSwgMHgxMSwgMHg5NCwgMHg4OCwgMHhhOCwgMHhlMCwgMHgwMCwgMHhmNCwKKyAgMHhjZiwgMHhhNSwgMHg0YSwgMHhlNCwgMHhiYSwgMHg5NiwgMHg1YiwgMHg1MSwgMHgyMSwgMHg3MCwgMHhkMiwgMHg5ZCwKKyAgMHg3MiwgMHgzNywgMHg5ZCwgMHhlMiwgMHhjMiwgMHgzMSwgMHhlNiwgMHg5OCwgMHg1MiwgMHg0YSwgMHgzYSwgMHgwOCwKKyAgMHg5MiwgMHgwMywgMHhjNSwgMHg5MiwgMHhkMywgMHgzZiwgMHgzZCwgMHhmZCwgMHg3ZiwgMHhjNCwgMHg3ZiwgMHhmNywKKyAgMHgwMywgMHhlNywgMHhkMSwgMHgwOCwgMHgyOCwgMHgyMiwgMHhhMCwgMHg2MCwgMHg2YSwgMHgxZCwgMHg4MCwgMHgwMCwKKyAgMHhhOCwgMHhhZCwgMHgwMCwgMHhjMSwgMHgwMSwgMHg2NywgMHgyMSwgMHg2YiwgMHg0OSwgMHg3NywgMHg5NSwgMHg5NywKKyAgMHg2NSwgMHgxNSwgMHhhOSwgMHhhMSwgMHhiZiwgMHg4NiwgMHg1NywgMHgyYSwgMHg4MiwgMHhlZSwgMHgzMywgMHhhMiwKKyAgMHhkNywgMHg5NywgMHhlMCwgMHg5ZSwgMHhhYiwgMHhiMCwgMHg0NiwgMHhiNSwgMHhjOCwgMHgxMywgMHg3MSwgMHgxMywKKyAgMHgwMywgMHg1NCwgMHhmMiwgMHg5MSwgMHgyMywgMHg0MSwgMHgxZSwgMHg3NywgMHgyZiwgMHhlOSwgMHg1MCwgMHg4NiwKKyAgMHhjMywgMHgxMywgMHgxZCwgMHg1NSwgMHhhMiwgMHg1OSwgMHg0ZSwgMHg5NSwgMHhiMSwgMHg1NCwgMHg4NiwgMHgwMywKKyAgMHgyNiwgMHg4YywgMHgyYiwgMHhlMywgMHg1MiwgMHg1OCwgMHg3ZSwgMHg3ZiwgMHg5MywgMHgxYywgMHgzYSwgMHg1MSwKKyAgMHgxYiwgMHg2MSwgMHhkYywgMHhmMiwgMHg3MiwgMHg5OCwgMHhhOSwgMHhhOSwgMHgwOSwgMHhkNywgMHgyMiwgMHhjOSwKKyAgMHhmMywgMHgzMywgMHg5MywgMHhjNSwgMHg1MSwgMHg1MywgMHgwNSwgMHg0NCwgMHhiYSwgMHg3MywgMHg5OCwgMHgwMCwKKyAgMHhhZCwgMHg4YywgMHg2NywgMHg0MiwgMHhmYywgMHg5YSwgMHhiNCwgMHg4YSwgMHg3NCwgMHg4ZCwgMHhmMSwgMHg4MCwKKyAgMHg0YSwgMHgyYywgMHhiMiwgMHgzYywgMHg2OCwgMHhjZCwgMHhkNiwgMHhiMywgMHg1ZCwgMHg3NSwgMHhlNywgMHgwMCwKKyAgMHgxYywgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwgMHhmZiwgMHgwZCwgMHg2ZiwgMHhhMiwKKyAgMHg0MSwgMHgxOCwgMHg0OCwgMHgzMSwgMHg0YiwgMHgxMSwgMHhjMiwgMHgwMCwgMHhiYiwgMHg1OCwgMHhlMCwgMHg0NSwKKyAgMHhkNiwgMHgyZiwgMHgwOCwgMHgwNCwgMHgyNiwgMHgwYiwgMHg0MCwgMHgyNCwgMHg2NCwgMHhkMCwgMHgyNiwgMHg2OCwKKyAgMHhhNCwgMHgyZCwgMHhjMSwgMHgyNCwgMHhjOSwgMHhlNCwgMHgwNSwgMHgyMCwgMHg4OCwgMHgwMSwgMHhmYiwgMHhiOSwKKyAgMHg3ZCwgMHg1MywgMHgzMCwgMHg3ZSwgMHhkOSwgMHhmYiwgMHhlMiwgMHgwMiwgMHgwNiwgMHhmMiwgMHhmMiwgMHg3YywKKyAgMHgxNCwgMHgzZiwgMHg1ZiwgMHg0NSwgMHg3NywgMHg4NiwgMHhjMCwgMHg5MCwgMHg3MiwgMHg0ZiwgMHgzMSwgMHhjMiwKKyAgMHg3NywgMHgxYywgMHg5NywgMHhiNywgMHgyNywgMHg0MiwgMHg3NSwgMHgxYSwgMHgzZCwgMHhkOSwgMHg5NCwgMHhmMSwKKyAgMHhhZiwgMHhlOCwgMHg5ZCwgMHgzYiwgMHg0ZiwgMHg1NiwgMHgwNSwgMHg3NSwgMHhiNCwgMHhjMSwgMHhlZSwgMHhmYSwKKyAgMHg0MiwgMHhiZCwgMHgxZSwgMHg3YiwgMHhlYywgMHgzOSwgMHg5NSwgMHg0MSwgMHhmMywgMHgwZiwgMHg0ZCwgMHg1NywKKyAgMHg1MywgMHg2YSwgMHhkNywgMHgyYywgMHhlMCwgMHgyMSwgMHgzMCwgMHhkOSwgMHg0ZiwgMHg5YywgMHhjNywgMHhiZSwKKyAgMHg1OSwgMHgwNSwgMHgwNiwgMHgwMCwgMHg0MSwgMHg5OCwgMHhjOCwgMHhhOCwgMHg0MiwgMHgwNiwgMHg1MCwgMHhhYywKKyAgMHg5MSwgMHg1MSwgMHhiNCwgMHhkMiwgMHg0NCwgMHgzZCwgMHhjZiwgMHhkZCwgMHhlNiwgMHgwYiwgMHgwYywgMHg0MSwKKyAgMHhhYSwgMHgzNywgMHg5MSwgMHhlMCwgMHgwOSwgMHgxNCwgMHhjMCwgMHg1ZCwgMHhiNSwgMHhlYiwgMHhjZiwgMHg2NiwKKyAgMHhmYSwgMHgwZCwgMHg5MSwgMHhmNiwgMHgxNywgMHg2OCwgMHg0YSwgMHg4NiwgMHg0OCwgMHhhNCwgMHhiNywgMHhiMSwKKyAgMHg4MSwgMHg2OSwgMHgzMiwgMHhmNiwgMHhkOSwgMHhiZiwgMHg0NCwgMHhlYywgMHgzMywgMHhhMSwgMHhjOSwgMHg0YywKKyAgMHhkZCwgMHhhZiwgMHgwNCwgMHhlMywgMHhmNiwgMHhlMSwgMHg1OSwgMHhiOSwgMHhkNywgMHgyYywgMHgyZiwgMHhhMywKKyAgMHg1ZCwgMHhiMywgMHhjOCwgMHg5NiwgMHgyNSwgMHg2NCwgMHhhYywgMHg3OCwgMHg1MywgMHhlNywgMHgyZiwgMHgxMywKKyAgMHg4ZSwgMHhkNiwgMHg4MCwgMHg0NywgMHg0MCwgMHg4YSwgMHg0ZSwgMHg2YSwgMHhkNCwgMHhlYywgMHhlZiwgMHhkOCwKKyAgMHhhZiwgMHg5NSwgMHg5NiwgMHgwZCwgMHg0NSwgMHgzNSwgMHhlOCwgMHgwNywgMHgwZCwgMHgyOSwgMHg1ZSwgMHhlNywKKyAgMHhhYiwgMHg4YSwgMHg4OSwgMHgzZCwgMHhhMiwgMHhjMSwgMHg0OCwgMHhhNiwgMHgwMywgMHg5NSwgMHgxMiwgMHgwZSwKKyAgMHg3OSwgMHhmMCwgMHhhYiwgMHhmOSwgMHhkYiwgMHg3ZiwgMHhkNywgMHhhYSwgMHhlYiwgMHgzNCwgMHhmYSwgMHg3YywKKyAgMHhiYSwgMHg3YSwgMHhkMiwgMHgwMCwgMHhmOSwgMHhmYywgMHgxNCwgMHhiMSwgMHgxNCwgMHgzYiwgMHgwMCwgMHgwMSwKKyAgMHgyYSwgMHg1NCwgMHhhMSwgMHgxMywgMHg0NSwgMHg2MCwgMHg1OSwgMHgzMCwgMHg2ZCwgMHg4ZiwgMHgzOCwgMHg1NSwKKyAgMHgzMywgMHg2NCwgMHgzYSwgMHg0MywgMHg1ZCwgMHg2YiwgMHg2MiwgMHhmZiwgMHg0OCwgMHhjNiwgMHgzNCwgMHg0ZiwKKyAgMHhlOCwgMHhlNywgMHhmOCwgMHhjNiwgMHgyOSwgMHg0MCwgMHg1MiwgMHhiYiwgMHg5NCwgMHgwMSwgMHgyYiwgMHg4ZiwKKyAgMHhmMiwgMHhhZSwgMHhmMiwgMHg1MiwgMHg5NywgMHhkYSwgMHg1MywgMHg0NywgMHgzYSwgMHhiMywgMHhjMiwgMHgzNCwKKyAgMHgxMywgMHgwYywgMHhlMCwgMHg0MSwgMHg3MiwgMHg4MCwgMHg1MSwgMHg4MiwgMHhjYSwgMHgzNCwgMHgyYywgMHhkNSwKKyAgMHhkNCwgMHhlYiwgMHg0NywgMHg1YiwgMHg0YSwgMHg1NywgMHg5NCwgMHhkYywgMHgyMiwgMHg4MCwgMHgyNSwgMHhhMCwKKyAgMHhhNSwgMHhjNiwgMHhhOCwgMHhlMSwgMHhmYiwgMHhiMCwgMHhiNSwgMHg5ZCwgMHgzMiwgMHhkOSwgMHgzNywgMHhlYiwKKyAgMHhhNiwgMHgzZiwgMHgyZCwgMHhmYiwgMHg3OCwgMHg3YSwgMHhmNywgMHgxOCwgMHhlNCwgMHgwMSwgMHhjMCwgMHgyMSwKKyAgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgxMywgMHg3MiwgMHg4MywgMHgyMSwgMHg0OSwKKyAgMHgwYywgMHg0NSwgMHgwOCwgMHgxMywgMHg1MCwgMHhlMSwgMHgxNSwgMHhjMSwgMHhhMiwgMHg5NCwgMHgwMCwgMHgxMCwKKyAgMHg5YiwgMHgxNSwgMHhhMSwgMHhjOCwgMHgxMCwgMHhiZCwgMHhkYSwgMHg0MiwgMHg5MCwgMHhlOCwgMHgwMSwgMHhlMywKKyAgMHhjMiwgMHhmMywgMHgzMSwgMHgyMywgMHg4YSwgMHhkMSwgMHgzNywgMHhkNCwgMHgzMSwgMHg5ZiwgMHgzZSwgMHhkOCwKKyAgMHhhNCwgMHgzMywgMHg1NywgMHhiMCwgMHhmZCwgMHhmZCwgMHg1MCwgMHg4MCwgMHhjOSwgMHhhYSwgMHgyMCwgMHg5ZiwKKyAgMHgwMywgMHg0YiwgMHhkOSwgMHgzMCwgMHg0ZiwgMHg0YiwgMHhlMywgMHg3OSwgMHhmOCwgMHhhZSwgMHg1ZCwgMHgwZiwKKyAgMHgxMiwgMHhjZCwgMHhhZCwgMHg3NiwgMHgxZSwgMHg5MSwgMHg4MiwgMHg1OSwgMHg1NCwgMHgyMSwgMHhhNywgMHgyNywKKyAgMHgyYywgMHgyNCwgMHg1NywgMHgxMywgMHg5MSwgMHgyNCwgMHg5NywgMHg0YSwgMHhhYSwgMHgyYSwgMHhhNSwgMHhlMywKKyAgMHg3OCwgMHhmOSwgMHhiNCwgMHhkZiwgMHg2ZiwgMHg3NywgMHg4ZiwgMHhmZSwgMHg4YywgMHg3ZiwgMHhkNywgMHgzYiwKKyAgMHhjNCwgMHg0ZCwgMHgwMiwgMHhiMywgMHg1YiwgMHgyYywgMHhhMiwgMHhmMiwgMHhmOCwgMHg2NCwgMHhkMywgMHhiOCwKKyAgMHg2YiwgMHhiMywgMHhhMCwgMHgxMywgMHhkOCwgMHg1MSwgMHgzZCwgMHhjMiwgMHgxMiwgMHhhMiwgMHhkMiwgMHg3MiwKKyAgMHgzMywgMHhlZSwgMHg2YiwgMHgyMCwgMHgyOSwgMHg2NSwgMHgwMSwgMHg0OSwgMHgzYSwgMHgyZSwgMHhjOCwgMHgyZSwKKyAgMHgwZCwgMHgyOSwgMHg1YSwgMHg2YiwgMHhlOCwgMHhkNywgMHg1OSwgMHhhMywgMHg1NSwgMHhkZSwgMHhkNSwgMHhkMywKKyAgMHg5MSwgMHg4NCwgMHg3OSwgMHg3MiwgMHg0YSwgMHg0ZSwgMHgxMSwgMHgxZCwgMHhhMiwgMHg5MCwgMHhjYywgMHg1NCwKKyAgMHhjNiwgMHg5MiwgMHg5MSwgMHhiMiwgMHhkMywgMHhhOCwgMHhjMywgMHhiMiwgMHgxNCwgMHg5OCwgMHhjMywgMHg3NCwKKyAgMHhlYSwgMHgzMiwgMHhkZiwgMHg5MywgMHg4MCwgMHg5MSwgMHg3NSwgMHg0MiwgMHg4NCwgMHhhNSwgMHg2OSwgMHhkNCwKKyAgMHgwMSwgMHg0NiwgMHgyOCwgMHhiYiwgMHhmOCwgMHg1NSwgMHgyNCwgMHhlMywgMHg5OCwgMHhlZSwgMHhjOSwgMHhjNiwKKyAgMHhmNywgMHg5YSwgMHg2ZSwgMHgwOSwgMHg5ZCwgMHhlMCwgMHgyYSwgMHg1NywgMHg1YSwgMHg2ZCwgMHhiYSwgMHg3MiwKKyAgMHg5MCwgMHg2NiwgMHg4YSwgMHgyYywgMHg3OSwgMHhiMiwgMHg2YSwgMHg4NiwgMHgxMSwgMHgyYywgMHhjMSwgMHhmNCwKKyAgMHg0NywgMHg2ZSwgMHgwYiwgMHg3MiwgMHhkOSwgMHg2YiwgMHgwMSwgMHhkYSwgMHhlOCwgMHgwMCwgMHgxOCwgMHhlNywKKyAgMHg4MywgMHg3OSwgMHg1ZSwgMHgzNiwgMHg0OSwgMHg0ZSwgMHgxZiwgMHhkNywgMHgxZiwgMHg3YywgMHhlMywgMHg3YywKKyAgMHg3YSwgMHg0MCwgMHgwZiwgMHg3ZiwgMHhiMSwgMHg1MiwgMHgwYSwgMHgwNCwgMHhlMSwgMHhkOCwgMHgwMCwgMHgwOSwKKyAgMHg0NiwgMHg1YywgMHg1NCwgMHg5MCwgMHg1MCwgMHgwYiwgMHhhMCwgMHg4ZCwgMHhhYiwgMHhhNCwgMHhjMywgMHgzNCwKKyAgMHgxNCwgMHg5NSwgMHhlYiwgMHg4NiwgMHhmYywgMHhlNiwgMHhhNCwgMHg0NCwgMHgyYSwgMHhhMiwgMHg4MiwgMHhjOSwKKyAgMHhlYywgMHgxOSwgMHgzMywgMHgzYiwgMHhmMCwgMHhmYywgMHg1YSwgMHg1YiwgMHhiOSwgMHg3OSwgMHg5ZiwgMHg1ZSwKKyAgMHhiNywgMHg3NywgMHhjMywgMHg0YiwgMHhlYSwgMHgyOSwgMHg2OSwgMHg3MSwgMHg4ZiwgMHgxYSwgMHg4OCwgMHg3YywKKyAgMHg3MywgMHgzZCwgMHg3NiwgMHg0ZSwgMHhmMiwgMHg4MywgMHgzMCwgMHgxMSwgMHhlMSwgMHg0OSwgMHhmNiwgMHg3ZCwKKyAgMHgxNSwgMHgwZSwgMHg4ZiwgMHg3MCwgMHhjMSwgMHhkZSwgMHhjMywgMHgzZSwgMHg5NCwgMHhlOCwgMHg1ZCwgMHgwMCwKKyAgMHhkZSwgMHhiZiwgMHhiZSwgMHhkMSwgMHhiYywgMHg0ZCwgMHgwYywgMHg2YiwgMHg5OCwgMHgzOSwgMHg0OCwgMHhlMSwKKyAgMHg0ZSwgMHgzNCwgMHg2MSwgMHg0MiwgMHhmMCwgMHg3YywgMHg0ZiwgMHgxYiwgMHg0ZiwgMHg1NywgMHhjNCwgMHhkMSwKKyAgMHhkMiwgMHhkOCwgMHgwMSwgMHhjMCwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHg3ZiwgMHhmZiwgMHhmZiwKKyAgMHgxMSwgMHg2ZiwgMHhhMiwgMHhjMSwgMHgwOCwgMHhjOCwgMHg1MSwgMHgwYiwgMHgxMiwgMHgwMiwgMHhhMSwgMHgwMCwKKyAgMHg5YSwgMHg0ZCwgMHg0NSwgMHhhZiwgMHgzOCwgMHhhNCwgMHhhYSwgMHg1NSwgMHg4MCwgMHgyNSwgMHg0OSwgMHg4MiwKKyAgMHhhMiwgMHgwNSwgMHgwNSwgMHg1MiwgMHg2ZiwgMHgyMiwgMHg3MCwgMHgxMCwgMHgyMSwgMHg2NywgMHhlNCwgMHg5MCwKKyAgMHg4NywgMHgwZSwgMHg4YiwgMHg1ZiwgMHg1OSwgMHg2YSwgMHhkOSwgMHg3MCwgMHgxYiwgMHhjMiwgMHhhNywgMHgxZSwKKyAgMHhlMiwgMHhlNiwgMHg4YiwgMHhhYywgMHg1YiwgMHg0ZCwgMHhkNiwgMHg0ZCwgMHgwNiwgMHhiNCwgMHhjZCwgMHgxOCwKKyAgMHhmMiwgMHhlZSwgMHg3MSwgMHhjMSwgMHg4OSwgMHgzNSwgMHg5MiwgMHgzMywgMHg4NiwgMHg3MywgMHg3MywgMHhiYiwKKyAgMHg3NiwgMHgzYSwgMHgxYywgMHhiOSwgMHg3MiwgMHhjZCwgMHgzNSwgMHgyZSwgMHhlNiwgMHg5OSwgMHg0ZCwgMHhlZiwKKyAgMHgyYiwgMHhjZiwgMHg4ZSwgMHhkYSwgMHg2NywgMHhiMSwgMHg2MiwgMHhkNSwgMHhiYiwgMHgxZCwgMHg0ZCwgMHg2ZCwKKyAgMHg5NiwgMHhhMSwgMHhiYywgMHhkNSwgMHgzMywgMHhiNSwgMHhkYiwgMHg0MywgMHhiYSwgMHhjMywgMHg5MCwgMHhlMCwKKyAgMHg1OSwgMHg4YSwgMHg2YSwgMHhlMCwgMHg0NSwgMHgyOCwgMHg1NCwgMHhhOCwgMHhlMywgMHgxNCwgMHg2OCwgMHg5MiwKKyAgMHhhNiwgMHg0NywgMHgyYSwgMHgwNiwgMHhlYSwgMHgzZiwgMHgyZCwgMHgxYiwgMHgwYywgMHg3ZSwgMHg2MiwgMHgxOCwKKyAgMHhlMiwgMHgzYiwgMHg3MCwgMHgzMywgMHgwOCwgMHhkOSwgMHgwZCwgMHg1MCwgMHhhYiwgMHhiMywgMHgzMywgMHhjYSwKKyAgMHgyNiwgMHhlZiwgMHhmMywgMHhjNSwgMHg3OCwgMHhhMSwgMHg2OSwgMHg4MCwgMHg4ZSwgMHg3YSwgMHg5MCwgMHhjMCwKKyAgMHg4YywgMHgxOCwgMHg2ZSwgMHg5ZSwgMHg3NSwgMHgzYSwgMHhjNCwgMHgzMSwgMHhiYiwgMHgwZCwgMHg5ZSwgMHhkOCwKKyAgMHg1MiwgMHhjYiwgMHhmNiwgMHgxZiwgMHhjNSwgMHg4NiwgMHg0YiwgMHhjZiwgMHgzOCwgMHhlNCwgMHgxNCwgMHhiMCwKKyAgMHg2OCwgMHhiZSwgMHgwYSwgMHg2MCwgMHg0NSwgMHhmMSwgMHgxMCwgMHhiMCwgMHhjOSwgMHg3NywgMHgzZSwgMHg2OSwKKyAgMHg2OCwgMHgyMCwgMHgzOCwgMHhhNiwgMHg2MywgMHhiMywgMHgzMiwgMHgwZCwgMHhjNywgMHg3NiwgMHg3MiwgMHg0MCwKKyAgMHgyNywgMHgyMiwgMHg2NywgMHgzMSwgMHhhNCwgMHgxMSwgMHhhOSwgMHg3YSwgMHgyYiwgMHg0NiwgMHhlNiwgMHhlYiwKKyAgMHgyYiwgMHg0YSwgMHgzNiwgMHg5OCwgMHhkMiwgMHhkMiwgMHhkOCwgMHgwZCwgMHg5NSwgMHg1NCwgMHgzNiwgMHgzYywKKyAgMHgyZiwgMHhlYSwgMHg5NywgMHhiMiwgMHg4MywgMHhiOCwgMHhkNSwgMHhlOCwgMHhjNCwgMHgyNCwgMHgzOSwgMHg3YiwKKyAgMHgxZSwgMHg4OCwgMHg5MywgMHhiMiwgMHgwNiwgMHg0NSwgMHhjZiwgMHg3ZSwgMHhlNSwgMHg5OSwgMHg1MiwgMHgyNiwKKyAgMHgzNywgMHg2YiwgMHgxOSwgMHhlYSwgMHhmYSwgMHg3OSwgMHg3YiwgMHgyYiwgMHhhNywgMHhkOSwgMHgwMCwgMHgwZiwKKyAgMHg3ZiwgMHg0MCwgMHgwYSwgMHgxMCwgMHg1NiwgMHhhMywgMHg4MSwgMHgzOCwgMHg3NiwgMHgwMCwgMHgwMiwgMHg1NSwKKyAgMHg0NCwgMHgwMCwgMHgwMCwgMHg5MCwgMHgyMiwgMHgyMCwgMHhjNCwgMHhkMCwgMHg2YSwgMHg1MCwgMHgzZCwgMHhhMiwKKyAgMHg3MCwgMHhmYSwgMHgzOCwgMHg4ZCwgMHg3NywgMHg5OSwgMHg5OCwgMHgwMCwgMHg1NSwgMHhmOSwgMHhmOCwgMHhlNywKKyAgMHg0MiwgMHg5MCwgMHgyYiwgMHg4ZCwgMHhjYSwgMHg2YiwgMHhkZCwgMHgzYSwgMHhjYSwgMHhiZSwgMHg2MiwgMHhkNCwKKyAgMHgyNCwgMHg0ZSwgMHg4ZiwgMHhjNSwgMHhmYiwgMHg1MiwgMHhkMCwgMHhkYiwgMHg3OSwgMHhlZSwgMHg2OSwgMHhhNiwKKyAgMHhlZSwgMHhkZCwgMHg4YiwgMHg1NCwgMHhlZiwgMHhjNSwgMHhmOCwgMHhlZiwgMHg0NSwgMHgxMywgMHgzZCwgMHg2YiwKKyAgMHhhNiwgMHhlZSwgMHgzYiwgMHgwYiwgMHgxMSwgMHg5OCwgMHhhYiwgMHg5NCwgMHg0YywgMHg3NywgMHhhYiwgMHhhMiwKKyAgMHhhZiwgMHgzNywgMHg2ZSwgMHhkYSwgMHg5MywgMHhlZCwgMHg4MSwgMHhjNywgMHhjYiwgMHhhYSwgMHg3NSwgMHhhYiwKKyAgMHg4YSwgMHgyNCwgMHg4NCwgMHhjNiwgMHgzYSwgMHhkNiwgMHhiNywgMHgzOSwgMHhlOCwgMHgyNSwgMHhlMywgMHhiMiwKKyAgMHhjNSwgMHg5ZSwgMHg1ZCwgMHgxNiwgMHg2NCwgMHg2NiwgMHgzNCwgMHhkZCwgMHg1NCwgMHhkMywgMHg1YywgMHg0MywKKyAgMHgyYSwgMHhmNywgMHgxYiwgMHg5MywgMHhmNywgMHhkYywgMHg4ZCwgMHgxZSwgMHhhNywgMHg4YiwgMHgwMCwgMHgxYywKKyAgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwgMHhmZiwgMHgxNSwgMHg2ZiwgMHhhMiwgMHg0MSwKKyAgMHg1MCwgMHg4MiwgMHg5NiwgMHgyMiwgMHg4NCwgMHgxZCwgMHgwNCwgMHg3MCwgMHgyYywgMHhiYiwgMHhhYSwgMHhiYSwKKyAgMHhhMCwgMHgxNCwgMHg1YSwgMHg2ZSwgMHhjMywgMHg3OCwgMHhjOSwgMHhlMiwgMHhmMCwgMHhmYiwgMHgzNiwgMHgzMSwKKyAgMHgxNywgMHg4MiwgMHhkZSwgMHgzMSwgMHgzOSwgMHgwMSwgMHhlMSwgMHg2MCwgMHhkNCwgMHg4MCwgMHhmNCwgMHgzOSwKKyAgMHhmOCwgMHgzNCwgMHgzMiwgMHhiYiwgMHgwZSwgMHhjZSwgMHg0NSwgMHhkNCwgMHgyZSwgMHg3NiwgMHhmMSwgMHg0NiwKKyAgMHhhYSwgMHg5MCwgMHg1OCwgMHg3NywgMHgzMiwgMHhmNCwgMHg1NiwgMHg2YSwgMHhjOSwgMHg3MSwgMHg4ZiwgMHhhMSwKKyAgMHg0MywgMHhmYywgMHgyYywgMHhmMywgMHg5MSwgMHg5MiwgMHhlNSwgMHgxYSwgMHgzMiwgMHgxMSwgMHg1ZiwgMHhiMSwKKyAgMHhkYSwgMHg0MCwgMHhhMSwgMHgwOCwgMHg5MywgMHgyZiwgMHhlZiwgMHhkYywgMHg2MywgMHgyNiwgMHg0NiwgMHg5MywKKyAgMHg1ZiwgMHhiOCwgMHg1ZCwgMHhiYywgMHg1MCwgMHhjYywgMHg3ZSwgMHgxOSwgMHhmNSwgMHg3NywgMHgyMywgMHg0YywKKyAgMHg5OCwgMHhjMiwgMHgyZiwgMHgxYSwgMHhmMywgMHhjNCwgMHgyNiwgMHgxZSwgMHgwYywgMHg2YiwgMHg3NCwgMHg4MywKKyAgMHgxNywgMHg0OSwgMHgyNSwgMHgxMSwgMHgzYywgMHgxNywgMHg4ZCwgMHg2YywgMHg4ZCwgMHhlNywgMHg2ZSwgMHgyMCwKKyAgMHgzMywgMHhkNCwgMHgyMiwgMHgzZCwgMHgyNCwgMHhiOCwgMHhlZiwgMHg0MiwgMHg1NywgMHhmNSwgMHg5ZiwgMHgwNywKKyAgMHg4YiwgMHg5YywgMHgzNSwgMHg0MywgMHhkZSwgMHg5YSwgMHg4NSwgMHg0OCwgMHg5NywgMHg4NCwgMHg2MSwgMHgyNiwKKyAgMHg0ZSwgMHhkNSwgMHhjZSwgMHhiZCwgMHhhNCwgMHhhNywgMHg4NSwgMHgwNiwgMHg5NCwgMHgzYywgMHhjOSwgMHhhMywKKyAgMHg2MiwgMHgzZSwgMHg0YSwgMHhmYSwgMHhmMiwgMHg3NiwgMHg1ZSwgMHg3NywgMHgzMiwgMHhmYSwgMHhhYiwgMHgwNSwKKyAgMHhlNiwgMHhlMSwgMHg3OSwgMHhmZSwgMHgzNCwgMHg4OCwgMHg2MCwgMHg2NCwgMHgxMywgMHhkYSwgMHg3NSwgMHgwOCwKKyAgMHg0OSwgMHg2ZiwgMHgxNiwgMHg0OSwgMHg0YSwgMHg1OSwgMHg2MywgMHhkOSwgMHhkOCwgMHhkMSwgMHg0ZSwgMHgxOSwKKyAgMHg4YywgMHhkNiwgMHg2OCwgMHgwMywgMHgwYiwgMHhhOSwgMHg1YSwgMHg5MywgMHhjMywgMHg2OCwgMHhiNSwgMHgyNCwKKyAgMHgxNywgMHhiYSwgMHg4MiwgMHg0YSwgMHg0ZSwgMHgyMCwgMHhhOCwgMHhmNCwgMHgwMCwgMHhkOCwgMHg2OCwgMHgxNCwKKyAgMHhhYywgMHg1MywgMHg4NCwgMHg1YSwgMHg5MSwgMHg1MywgMHg0NCwgMHhiMSwgMHgzZSwgMHg3YSwgMHhiYSwgMHhhYiwKKyAgMHhhNywgMHhkZiwgMHhmMSwgMHgwMCwgMHgzZSwgMHg3ZiwgMHgwNSwgMHgyOCwgMHgyNiwgMHgxMiwgMHg4NywgMHg2MCwKKyAgMHgwMCwgMHgwMiwgMHg1MiwgMHgyOSwgMHgyYywgMHgxOCwgMHg0NCwgMHg1MCwgMHhjNSwgMHg4MCwgMHhiNSwgMHgzOCwKKyAgMHg1MywgMHg5NywgMHgzYSwgMHg1YSwgMHgzNywgMHg5YSwgMHhiNiwgMHhjOSwgMHg0NywgMHg0OCwgMHhhYiwgMHhmZCwKKyAgMHgyOSwgMHg5ZSwgMHhiNiwgMHg0NSwgMHhhOSwgMHgwYiwgMHg1OCwgMHgyYSwgMHg5YiwgMHhmMCwgMHg2MCwgMHgwMCwKKyAgMHg5OSwgMHg2ZiwgMHhkOSwgMHhjZiwgMHg3YSwgMHhiMCwgMHg3YywgMHhjYSwgMHg1ZSwgMHg0OSwgMHg0ZiwgMHhhNCwKKyAgMHhkMCwgMHg5YSwgMHg1MiwgMHg4ZSwgMHhhZSwgMHg0NywgMHhlOSwgMHhkMiwgMHg0OSwgMHhmYywgMHg1OCwgMHhkMCwKKyAgMHgxNCwgMHhlZCwgMHg3OCwgMHgxYSwgMHg3NywgMHg2MywgMHgyZiwgMHgyZCwgMHhiNCwgMHg0ZiwgMHg3NiwgMHhiYiwKKyAgMHhhYywgMHhlYiwgMHhiMywgMHgwOSwgMHhhYywgMHg5ZiwgMHgwNSwgMHhhMiwgMHhkYiwgMHg2ZSwgMHhmNSwgMHhmMywKKyAgMHhlYywgMHhmOCwgMHg2ZiwgMHg2OCwgMHgwMCwgMHhlMCwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHhmZiwgMHhmZiwgMHgxMSwgMHg2ZiwgMHhhNCwgMHhhMCwgMHhjOSwgMHg0YywgMHg0MywgMHgwOCwgMHgwNSwgMHhiNCwKKyAgMHg5NywgMHg2ZCwgMHhmNSwgMHg1MSwgMHg2OSwgMHg4MCwgMHg0YSwgMHgwOCwgMHhhOSwgMHhiMSwgMHg1YSwgMHgzNCwKKyAgMHg4MSwgMHgwMCwgMHg0YywgMHhiMSwgMHg2NSwgMHgzOSwgMHhlNCwgMHg0OCwgMHgxYSwgMHgwYywgMHgzMywgMHgzNCwKKyAgMHg0ZiwgMHhiMSwgMHg3ZCwgMHg4MSwgMHhkMywgMHg2NywgMHhhMywgMHhiMCwgMHg3YSwgMHg0ZiwgMHg1NywgMHhjYSwKKyAgMHg4MywgMHhkZCwgMHg3YywgMHg5NywgMHg0NiwgMHgxMywgMHgyMCwgMHgyNSwgMHgxMSwgMHhiZSwgMHhiMiwgMHhiOCwKKyAgMHhiNiwgMHg3NywgMHhlNSwgMHhjNCwgMHhiYywgMHhhZiwgMHgyZCwgMHhlMSwgMHg5OCwgMHg5YSwgMHhlZiwgMHhlZiwKKyAgMHhkNywgMHhhNSwgMHg5NywgMHhhNSwgMHg0ZiwgMHgwNiwgMHhhYywgMHg1MCwgMHhhOSwgMHhmOCwgMHgwYiwgMHgwNywKKyAgMHhiNiwgMHg1NSwgMHgyMCwgMHhmNCwgMHg5MSwgMHhhZSwgMHgyOSwgMHhmNSwgMHhkOCwgMHhlYiwgMHg0ZCwgMHgxZSwKKyAgMHg5MCwgMHg5MywgMHg0OSwgMHhlMywgMHgwNiwgMHhlZSwgMHg5NSwgMHgzYiwgMHg0ZSwgMHhiYSwgMHhmMiwgMHg4MSwKKyAgMHgwZiwgMHg4YiwgMHgxNCwgMHgwNiwgMHg3OCwgMHg2NywgMHhhNCwgMHg3MCwgMHg2OSwgMHg2MiwgMHhjYywgMHg1NCwKKyAgMHhhNSwgMHhmMSwgMHhiMywgMHhhYiwgMHg5OSwgMHg2YSwgMHhjZCwgMHgwMywgMHg5MSwgMHhiYSwgMHg1MiwgMHhmNiwKKyAgMHhhZCwgMHhmYywgMHg3NiwgMHg2NiwgMHgxZSwgMHhjMywgMHhmZSwgMHhhZiwgMHhhMiwgMHhlZSwgMHg2YSwgMHgyMywKKyAgMHg0OCwgMHg3MCwgMHgzZiwgMHg0NSwgMHgzNywgMHg2NSwgMHhlMywgMHg0MywgMHgxMCwgMHgwZCwgMHgxOSwgMHg4NiwKKyAgMHg1OCwgMHhjOSwgMHgzNywgMHgxOCwgMHgwYSwgMHhjZCwgMHhhNSwgMHgyNSwgMHg4YSwgMHhkNiwgMHgwNiwgMHhmMywKKyAgMHgyYywgMHgxYywgMHhjMCwgMHg4MSwgMHhkZCwgMHg5MywgMHg4NywgMHg1NCwgMHgxNywgMHhmZCwgMHhjOSwgMHgzNywKKyAgMHgwNSwgMHgyNCwgMHgxOCwgMHgyOCwgMHg5NiwgMHhjYywgMHhlNywgMHgzYywgMHgwNywgMHg5NCwgMHhjNiwgMHhiOCwKKyAgMHhjMiwgMHg1YSwgMHhlZSwgMHg3NywgMHhlNiwgMHg1MiwgMHhhMSwgMHgyMSwgMHhlZCwgMHgyNywgMHhmOSwgMHgzZSwKKyAgMHg2NywgMHg1NiwgMHhhMywgMHgyYSwgMHgyYiwgMHg5NCwgMHg0NSwgMHgzOSwgMHgwYiwgMHg5YiwgMHgzOCwgMHhkNywKKyAgMHg0MCwgMHhkNywgMHg1ZSwgMHgwZCwgMHg1MiwgMHhkMSwgMHgxYywgMHg1NiwgMHg0NSwgMHgyYSwgMHg4MiwgMHhjOSwKKyAgMHgyNiwgMHgyOCwgMHg2NiwgMHhiMSwgMHg4YSwgMHg2ZCwgMHg5ZCwgMHgxNCwgMHg2NywgMHhiMiwgMHg4MCwgMHgyMSwKKyAgMHg3OSwgMHg4MywgMHg4MiwgMHhlZSwgMHhkZSwgMHhkZiwgMHhmZiwgMHg3YiwgMHhmZiwgMHhiOSwgMHhmMiwgMHgyMCwKKyAgMHhmOSwgMHhmYiwgMHgxNSwgMHgyMCwgMHg1OCwgMHg2NiwgMHgxZCwgMHg4MCwgMHg5NCwgMHgwMCwgMHgxNSwgMHg3NSwKKyAgMHgyYSwgMHgwMCwgMHgxMiwgMHg1NiwgMHgwMiwgMHg3NSwgMHhhMSwgMHgzNiwgMHg4NywgMHgzMiwgMHgzMSwgMHg0OCwKKyAgMHg5YSwgMHhjMywgMHgzMiwgMHhmMiwgMHgwYiwgMHhjMCwgMHhhNSwgMHg5ZCwgMHg3OCwgMHg2MiwgMHhhZSwgMHg4YywKKyAgMHhkNywgMHg0YSwgMHhlYiwgMHgxNiwgMHg2ZSwgMHhmZCwgMHg2NSwgMHgwZSwgMHg1NiwgMHhiYywgMHg2NSwgMHgzOCwKKyAgMHhmNSwgMHg2YiwgMHhmMSwgMHhiNywgMHhkNywgMHgwYSwgMHg1NCwgMHgzYSwgMHhmMywgMHhhYSwgMHg0NCwgMHg0ZiwKKyAgMHgxOSwgMHgwNSwgMHhlYywgMHhlMCwgMHhkZCwgMHhkOSwgMHhjZiwgMHg1OCwgMHg2MiwgMHgxYiwgMHgwYSwgMHhkOCwKKyAgMHhiYSwgMHhiYywgMHg3OCwgMHhmMCwgMHhlMSwgMHg2MiwgMHhlNywgMHgyYywgMHhiYSwgMHgzYSwgMHhhOCwgMHhhNywKKyAgMHgzMCwgMHgwOSwgMHg0YiwgMHhjMSwgMHgyNiwgMHg1MCwgMHg5MiwgMHhjYSwgMHg0NywgMHgxYSwgMHg2NywgMHhmZiwKKyAgMHhhYywgMHhmZiwgMHg3YiwgMHhkMSwgMHhiNiwgMHgwMywgMHgwNywgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwKKyAgMHgwNywgMHhmZiwgMHhmZiwgMHgxNywgMHg3MywgMHg4MiwgMHhhMCwgMHg0OSwgMHg2YywgMHg1NCwgMHgwOCwgMHgwZCwKKyAgMHgyZSwgMHg1YiwgMHhhNSwgMHgzOCwgMHgyZCwgMHg0YSwgMHgwNSwgMHgwMiwgMHhjNSwgMHg1MCwgMHg5MSwgMHgyZSwKKyAgMHhlOCwgMHg3ZCwgMHg2MywgMHg5NSwgMHgxYSwgMHg0MSwgMHg0OCwgMHhmMSwgMHhlYiwgMHhlMiwgMHg2NSwgMHg0ZCwKKyAgMHg4OCwgMHgyZSwgMHhkNCwgMHhkOSwgMHgzOSwgMHgwOCwgMHgyZSwgMHg0ZSwgMHhkOSwgMHhjOCwgMHhmZiwgMHg0NywKKyAgMHhlMSwgMHhkOSwgMHg4NiwgMHhjYywgMHgyNSwgMHgzOSwgMHg1NSwgMHhkMiwgMHgzYiwgMHg4MiwgMHg4ZCwgMHg0MywKKyAgMHhlOSwgMHhlOSwgMHhhNCwgMHhlMSwgMHg2YSwgMHg0OCwgMHhlNiwgMHg5YywgMHg1OCwgMHhkNSwgMHhkYywgMHg1MSwKKyAgMHhiZCwgMHhmYywgMHgzMywgMHgyZCwgMHg0YiwgMHhhZSwgMHhmNiwgMHgyZiwgMHhiNCwgMHhlYiwgMHhiZCwgMHg3MSwKKyAgMHhiMCwgMHg3MCwgMHhhOSwgMHgwYSwgMHhhOCwgMHhjZiwgMHhiOSwgMHhlZCwgMHhmYywgMHhlOCwgMHg4ZCwgMHhkNSwKKyAgMHg5NiwgMHhlMiwgMHhiNywgMHgzNiwgMHg5YiwgMHhjZCwgMHhkOSwgMHhlYSwgMHgxNCwgMHhhMSwgMHg1YiwgMHgwMCwKKyAgMHg1YiwgMHg2NCwgMHg2ZCwgMHg3MiwgMHgwYSwgMHhkMywgMHg0OCwgMHhjNCwgMHhiNywgMHhiYiwgMHhjYywgMHhiYSwKKyAgMHhhYywgMHhkYSwgMHgxNywgMHg4OSwgMHg0YiwgMHg5NSwgMHg1NywgMHgwNSwgMHg2MywgMHg3ZSwgMHgzYywgMHhhYSwKKyAgMHg3NSwgMHhiOCwgMHgxMiwgMHg0NCwgMHhiYSwgMHhjNiwgMHhkOSwgMHgzNiwgMHhiOSwgMHhmYiwgMHgxNCwgMHg3OCwKKyAgMHg0ZSwgMHg4NSwgMHgyYiwgMHg3MywgMHhmYywgMHhmNiwgMHgyNSwgMHhkZSwgMHg1MiwgMHg3YiwgMHg3NSwgMHg1MSwKKyAgMHhiNSwgMHgzZiwgMHhlYiwgMHhkNCwgMHgwZSwgMHg4OCwgMHgyMiwgMHg0MiwgMHgwMSwgMHhlOSwgMHhkMCwgMHg1NiwKKyAgMHhhOSwgMHgwOSwgMHgzMSwgMHg4NCwgMHg5ZCwgMHg2NywgMHhiZCwgMHg4NywgMHgwOCwgMHgzMiwgMHg1MCwgMHhiOSwKKyAgMHhiMSwgMHgzOCwgMHgxMCwgMHgxMCwgMHhlYiwgMHg3NSwgMHg0MCwgMHg0NCwgMHgzZCwgMHgyOSwgMHhmZCwgMHhiNCwKKyAgMHg2YiwgMHhkNSwgMHg3YSwgMHg1NSwgMHgyYywgMHhlNiwgMHg3ZCwgMHgxMCwgMHg5ZCwgMHgwYywgMHg0YywgMHhkMCwKKyAgMHg2YiwgMHgzMiwgMHg4NiwgMHg0MCwgMHgwNSwgMHhhYSwgMHhkMywgMHgxMCwgMHg5OSwgMHg4MiwgMHgxOCwgMHgxYiwKKyAgMHhhOSwgMHhkZiwgMHgyYiwgMHgyYSwgMHgwNCwgMHg4OSwgMHg0NSwgMHhlNiwgMHgyMywgMHg0MiwgMHg5MiwgMHhhZSwKKyAgMHhhNCwgMHhhNiwgMHg1MywgMHhiOCwgMHhlNSwgMHg5OCwgMHg4YywgMHhiOSwgMHhkZCwgMHg5YSwgMHg2MCwgMHg0NSwKKyAgMHg2ZCwgMHgwOCwgMHg1MiwgMHg2NSwgMHgyMywgMHgxOSwgMHg5NiwgMHhlYiwgMHhiMCwgMHhmZiwgMHhlOCwgMHg5ZiwKKyAgMHhmZSwgMHg1MSwgMHhhNywgMHg3NywgMHg3NywgMHhjZiwgMHhjMCwgMHgwOCwgMHg1NiwgMHg4MSwgMHg2MSwgMHg5OCwKKyAgMHg3NiwgMHgwMCwgMHgwMCwgMHg4YSwgMHgyNSwgMHg4MCwgMHhjMiwgMHg0NCwgMHhjMSwgMHhmOSwgMHg3NywgMHhiNiwKKyAgMHhhNiwgMHhmNSwgMHhkMSwgMHg4NiwgMHhlMSwgMHg1NiwgMHg4MCwgMHhkMCwgMHhhMiwgMHhhOCwgMHgyNywgMHhmNCwKKyAgMHhhYywgMHg1YywgMHg0MiwgMHgzMiwgMHg4YywgMHhjYSwgMHg3YSwgMHgzMywgMHhlYywgMHhmMywgMHg2YywgMHhkMCwKKyAgMHgyZCwgMHgzOSwgMHhjYSwgMHg2NiwgMHg4NCwgMHg0MywgMHgxZCwgMHgzZiwgMHgwMywgMHgyZCwgMHhjNSwgMHhhMiwKKyAgMHgzZSwgMHgzNiwgMHgyZiwgMHhlOCwgMHhjMywgMHgzNywgMHgwNCwgMHhlMiwgMHg3NCwgMHg1MywgMHhhZSwgMHgyZCwKKyAgMHg0ZCwgMHg1OSwgMHg0YiwgMHg2YywgMHhhZCwgMHgwOSwgMHhhOSwgMHgwMiwgMHhmYiwgMHg1ZCwgMHg1NiwgMHhlMSwKKyAgMHg2YywgMHg3NywgMHhlNCwgMHhmZCwgMHg5ZCwgMHgyYywgMHhhMywgMHhhMiwgMHgwMiwgMHhlMSwgMHhlYiwgMHg4MCwKKyAgMHg2ZSwgMHg1MywgMHg1MywgMHhmMywgMHhmYiwgMHhhNywgMHhmZiwgMHhmYSwgMHhmYywgMHg5ZiwgMHhmYiwgMHgxMCwKKyAgMHhlMCwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwNywgMHhmZiwgMHhmZiwgMHgxNSwgMHg3MywgMHg4MiwKKyAgMHhhYSwgMHgwOCwgMHhhYywgMHg0MywgMHgwOCwgMHgwYiwgMHhiMywgMHg0YiwgMHg4OSwgMHhjNSwgMHg0OCwgMHhhYiwKKyAgMHhhYywgMHgwMCwgMHg4NCwgMHg0YywgMHhkOCwgMHgyNiwgMHgzOCwgMHgxNywgMHg0YywgMHgwYiwgMHhhNCwgMHgxNiwKKyAgMHhlNCwgMHg5YSwgMHgyMCwgMHg5ZiwgMHg2NywgMHhjMSwgMHhjZiwgMHg1MSwgMHg4YiwgMHhiMiwgMHhhZSwgMHg4MiwKKyAgMHg3YSwgMHg5NiwgMHg0NiwgMHhjNCwgMHg3OCwgMHg3ZSwgMHgxZiwgMHgyOCwgMHg4NywgMHg4YywgMHhiNywgMHhiNCwKKyAgMHhhZSwgMHgzZiwgMHhjNCwgMHgyZCwgMHg3NCwgMHhlMiwgMHhiNiwgMHhjNywgMHhlYywgMHg3ZSwgMHg0OCwgMHg5OCwKKyAgMHg3OCwgMHhhZiwgMHg0NiwgMHgzOCwgMHhkMywgMHhhMSwgMHhhZiwgMHg1ZCwgMHg3OSwgMHg4ZSwgMHgzYiwgMHg5MSwKKyAgMHgyOCwgMHg0NSwgMHgzNywgMHg3NiwgMHgzZSwgMHg4YiwgMHhhMywgMHgyOSwgMHhjNCwgMHhhZCwgMHhhNywgMHg2ZCwKKyAgMHhlNCwgMHg4OSwgMHhiMSwgMHgxMCwgMHg2OCwgMHg5YiwgMHhkZCwgMHhiMywgMHhjYywgMHg2OSwgMHhmZCwgMHgwZCwKKyAgMHg0ZSwgMHhiNiwgMHhkOSwgMHgwZiwgMHhlZiwgMHg1OSwgMHgyYywgMHgzNCwgMHhiNywgMHhhOCwgMHhiMiwgMHhjZSwKKyAgMHg2ZCwgMHhjZCwgMHgwZCwgMHg5NCwgMHg1OCwgMHhmOCwgMHhiNywgMHg5NSwgMHhjYiwgMHhiYSwgMHg1NCwgMHg1NSwKKyAgMHgyNSwgMHg5ZiwgMHg1MSwgMHgyMCwgMHhjZCwgMHhkNCwgMHg3MCwgMHg4YiwgMHhjNSwgMHhmZCwgMHg2NCwgMHhjNCwKKyAgMHg0ZSwgMHhkNywgMHhhMywgMHhiNSwgMHhkOSwgMHhkNywgMHhjMiwgMHg2NSwgMHgyOSwgMHhlMSwgMHg1OSwgMHgxYSwKKyAgMHhkOSwgMHg2OSwgMHhiMiwgMHgyZSwgMHg1OCwgMHg0YiwgMHgxNywgMHg0YywgMHgzNywgMHg0YiwgMHg0NiwgMHhkNiwKKyAgMHhhZCwgMHhhZSwgMHg4MiwgMHhjOSwgMHg0MCwgMHg1MiwgMHg5NywgMHg0OCwgMHg2NCwgMHg5NSwgMHg5NSwgMHg1MCwKKyAgMHgwZCwgMHg0MiwgMHgxOCwgMHg2ZSwgMHhiMSwgMHg3OCwgMHg3MywgMHgyNCwgMHhjZSwgMHhiMCwgMHgxMCwgMHgwYywKKyAgMHgxNCwgMHhjMCwgMHg1YywgMHhhYSwgMHgzZCwgMHhiOCwgMHhhZSwgMHg1NCwgMHgxOSwgMHg1MywgMHg2NywgMHhlZCwKKyAgMHgxYywgMHgyOSwgMHgxNywgMHg4YywgMHg2ZCwgMHgwYywgMHg4YSwgMHgyZCwgMHgxMiwgMHgxNCwgMHgzYywgMHhiMiwKKyAgMHhiMSwgMHgzMywgMHg5NSwgMHg0YSwgMHgwOCwgMHhiNiwgMHhkNiwgMHhjZSwgMHhlMiwgMHgxMSwgMHg3ZiwgMHgwYiwKKyAgMHgxNiwgMHg4NiwgMHhjNywgMHg1YiwgMHhlYSwgMHhhZiwgMHgwNSwgMHhmZCwgMHhlNSwgMHg0OSwgMHgzZSwgMHgxMywKKyAgMHg0YiwgMHhkZSwgMHhhOSwgMHg5NSwgMHgwYSwgMHg3MywgMHhkMiwgMHgyNywgMHgxMiwgMHg0NywgMHgzNywgMHhjMCwKKyAgMHhlMiwgMHg1ZiwgMHhlYiwgMHgzNiwgMHgzZSwgMHgwNSwgMHhjMSwgMHhmNywgMHhmMCwgMHgyYiwgMHgyMSwgMHhiMCwKKyAgMHhjYywgMHgzYiwgMHgwMCwgMHgwMCwgMHgyYSwgMHgwYiwgMHgwMCwgMHgwMiwgMHhiNSwgMHhjOCwgMHhlMSwgMHgzOSwKKyAgMHgzMCwgMHhmYiwgMHg5MSwgMHg4NSwgMHg4YiwgMHhhMywgMHhiZSwgMHg4ZSwgMHhmNiwgMHgyMCwgMHg3NywgMHhhNiwKKyAgMHg3NiwgMHhmMiwgMHg2MiwgMHg0MiwgMHgyZCwgMHg3NiwgMHg5ZCwgMHg4MCwgMHg1ZSwgMHhiMCwgMHg2ZiwgMHhkOCwKKyAgMHhiZCwgMHgyYiwgMHhjOCwgMHgwZSwgMHg5NiwgMHhiZCwgMHgwNCwgMHg2OSwgMHhmMiwgMHhkNCwgMHg5MCwgMHg4MiwKKyAgMHgxNywgMHg4YiwgMHhlZCwgMHgzOSwgMHgwNSwgMHhmYiwgMHg2ZCwgMHhkMiwgMHg4MSwgMHhkMywgMHhiNywgMHhlMSwKKyAgMHhiNSwgMHgyOSwgMHg4MCwgMHhjMiwgMHhkOSwgMHgyOCwgMHgyYiwgMHg1MSwgMHg0MCwgMHhhYywgMHgyNCwgMHg1MywKKyAgMHg3OSwgMHhhMCwgMHg4OSwgMHgyMiwgMHhhNywgMHgzNCwgMHg1MiwgMHhmMCwgMHhkNSwgMHhmNywgMHhjYSwgMHgyNiwKKyAgMHhkNiwgMHhmYywgMHg2NiwgMHhjYiwgMHhmMSwgMHhmYSwgMHhjMiwgMHhlYywgMHg3NiwgMHhmZSwgMHhlNywgMHhmYSwKKyAgMHgyMCwgMHhlMCwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhmZiwgMHhmZiwgMHgxOSwgMHg2ZiwKKyAgMHhhMSwgMHhjMSwgMHhkMCwgMHg0NCwgMHg0NSwgMHgwOSwgMHgxNSwgMHg4OCwgMHg2MSwgMHgwNCwgMHg5NiwgMHg3MCwKKyAgMHg5NSwgMHg3MywgMHg1MywgMHgzOCwgMHhhYiwgMHgxNCwgMHgwMCwgMHgxMCwgMHhjMSwgMHg4MiwgMHg5MiwgMHg1YywKKyAgMHg3NywgMHgzMSwgMHg3MywgMHgwNiwgMHg0ZSwgMHgxMSwgMHgxNywgMHhiMiwgMHhjZiwgMHgzNywgMHhlNywgMHgzMCwKKyAgMHgzMCwgMHg3ZSwgMHgwMiwgMHhmNSwgMHhlMiwgMHgzNywgMHhiZSwgMHgzMywgMHhlZCwgMHgzZiwgMHgxYSwgMHhiNSwKKyAgMHhiMiwgMHg2YSwgMHg0MCwgMHg3OSwgMHg4NCwgMHhiYSwgMHg0YiwgMHg2ZSwgMHhmMywgMHhkYSwgMHhmNiwgMHgwYiwKKyAgMHg1ZSwgMHhhZiwgMHhjYywgMHgzOCwgMHhlMSwgMHhiOCwgMHhlZSwgMHhhYiwgMHhlMCwgMHgwZiwgMHhlNSwgMHgyYSwKKyAgMHg0YiwgMHg0NSwgMHg0YiwgMHgyMywgMHg1MywgMHg4MCwgMHhjZSwgMHg5OSwgMHhhYiwgMHhiZSwgMHgyNiwgMHhlYSwKKyAgMHgzOSwgMHg4YiwgMHgzNywgMHhiYywgMHg2YSwgMHg0ZSwgMHgxYiwgMHgyMywgMHgwMCwgMHhjZiwgMHg3NiwgMHg1ZiwKKyAgMHgxNCwgMHg2NiwgMHhlYiwgMHhmOCwgMHgyZiwgMHhlYywgMHhjOCwgMHg5ZCwgMHgyMywgMHgwYywgMHg3YSwgMHhmMiwKKyAgMHhkNywgMHg2ZiwgMHg0MiwgMHg3ZiwgMHg4ZSwgMHg3YywgMHhkYiwgMHgxOCwgMHg5ZSwgMHgzNiwgMHhiMiwgMHgzOCwKKyAgMHhhZSwgMHg2NywgMHgwMCwgMHg3NCwgMHgwYiwgMHg2NCwgMHg4YywgMHhkMCwgMHg2MywgMHhkMSwgMHgyZSwgMHg3NSwKKyAgMHhiOSwgMHg0NSwgMHgwMSwgMHhmOCwgMHhlMCwgMHgzMywgMHhjYiwgMHgyZSwgMHg5MywgMHg2MywgMHhhMSwgMHgxNCwKKyAgMHg4OSwgMHgxOSwgMHgzZSwgMHhhZiwgMHgzNiwgMHhjMywgMHhmOSwgMHgwMiwgMHhmMywgMHhlMCwgMHg5NSwgMHg3NywKKyAgMHhhYiwgMHg5OSwgMHhhNiwgMHhjNywgMHg1NCwgMHhlMCwgMHg1OCwgMHhiOCwgMHhhMCwgMHg4MywgMHgyMiwgMHhkMCwKKyAgMHhhNSwgMHg4MiwgMHg1YiwgMHgyOCwgMHg0NCwgMHhhZiwgMHhhMiwgMHhjOSwgMHhmZiwgMHg1NiwgMHg3MywgMHhhOSwKKyAgMHgxNCwgMHhjYywgMHgzZCwgMHg0NSwgMHg4MCwgMHhlMywgMHhhNCwgMHg2ZCwgMHgzNiwgMHgyNiwgMHgxNywgMHhhOCwKKyAgMHgwNSwgMHg1MiwgMHhhMywgMHhmNCwgMHhhNiwgMHg3NCwgMHhkYywgMHhhNSwgMHgxYywgMHg3NCwgMHg4MywgMHgyMCwKKyAgMHgyMSwgMHgzMywgMHg4YSwgMHgxZSwgMHgyMCwgMHgxNiwgMHgxOSwgMHg4OSwgMHgyNiwgMHgwNSwgMHhjYSwgMHhlYiwKKyAgMHg2YywgMHg2ZCwgMHg1MiwgMHhmNSwgMHgxYiwgMHg1ZCwgMHhjZiwgMHhhYSwgMHg0OCwgMHg5NiwgMHg4YiwgMHgxMiwKKyAgMHg2YSwgMHg4MCwgMHhhZSwgMHhlZSwgMHhiMiwgMHg5NywgMHg1MywgMHg2NCwgMHgxMCwgMHhjMiwgMHgxYSwgMHhjOSwKKyAgMHg5YSwgMHhhYywgMHhmZSwgMHgxNywgMHhlMCwgMHgzYSwgMHg5ZSwgMHhlMCwgMHgzZiwgMHg3ZSwgMHg4NSwgMHg2OCwKKyAgMHg0MywgMHgwZSwgMHhjMCwgMHgwMiwgMHg1MSwgMHgyYSwgMHhhMCwgMHg5MywgMHg0MCwgMHgyOCwgMHgzMiwgMHgwNiwKKyAgMHhkNiwgMHg4NSwgMHhhOSwgMHg0MSwgMHg0MSwgMHgyMSwgMHgxYiwgMHg1NywgMHg3YSwgMHhmMiwgMHg5MCwgMHhhMywKKyAgMHgzYSwgMHg4ZCwgMHg1MSwgMHhhYiwgMHg1MiwgMHhiMCwgMHg3OCwgMHgyOSwgMHhkOCwgMHg0ZSwgMHg4NywgMHg1YywKKyAgMHg5OCwgMHg2OSwgMHg1NSwgMHg5NiwgMHhjZCwgMHg1OCwgMHg5NiwgMHgzMywgMHgyOSwgMHhmYiwgMHgzNywgMHhkMywKKyAgMHg5MSwgMHg4ZCwgMHhlMiwgMHhhNiwgMHhmNywgMHgxZSwgMHgyOCwgMHhiOCwgMHhhNywgMHgxYSwgMHhiNywgMHgzZCwKKyAgMHgyMywgMHhmNywgMHhlZiwgMHg4YSwgMHg4MiwgMHhjNywgMHgxNiwgMHhjNywgMHhjNCwgMHgxMSwgMHhkNCwgMHgwNiwKKyAgMHg1MywgMHhkYSwgMHg5MywgMHgyZiwgMHg5YiwgMHhmNiwgMHg0YSwgMHg0ZSwgMHgyYywgMHgyZiwgMHg0YiwgMHhlMywKKyAgMHgzZiwgMHgzZiwgMHg1MCwgMHhlMCwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgzZiwgMHhmZiwgMHhmZiwKKyAgMHgxZCwgMHg3MywgMHg4MiwgMHhhMCwgMHhjOSwgMHgyOCwgMHgyNiwgMHgxYSwgMHg4NCwgMHgyZSwgMHhkMywgMHhhYiwKKyAgMHgyMSwgMHgxYywgMHgyNSwgMHhkNCwgMHg5YiwgMHgwMCwgMHgwNSwgMHhhYiwgMHgwNywgMHhkYywgMHhjOSwgMHg0MiwKKyAgMHgyZCwgMHg0MCwgMHgxYSwgMHgwNCwgMHg5MiwgMHhmYSwgMHgzOSwgMHg3ZSwgMHg1NSwgMHgxMywgMHg4YiwgMHg0MywKKyAgMHg1OCwgMHg4MywgMHhlMSwgMHhkOCwgMHgyMCwgMHhlYywgMHgwZiwgMHhkNCwgMHhjOSwgMHg1ZCwgMHgyYiwgMHhkMiwKKyAgMHgzZiwgMHg5NCwgMHgyNywgMHgzOCwgMHhkOSwgMHhkNSwgMHgxMiwgMHgwZSwgMHhiNywgMHhlZCwgMHg1YiwgMHgyNSwKKyAgMHhmNSwgMHhhYiwgMHhhMiwgMHg1YiwgMHhhMywgMHhiZCwgMHhhMywgMHgxYywgMHhlNSwgMHg5MSwgMHhkYiwgMHhmOCwKKyAgMHg1YiwgMHhiNiwgMHg4YywgMHg5YiwgMHhhNiwgMHg1MiwgMHgzOSwgMHhhMywgMHg5NiwgMHgyOCwgMHg2NCwgMHhjNSwKKyAgMHg2NSwgMHg2OCwgMHgwZCwgMHg1YSwgMHgzMiwgMHgzMCwgMHhjOSwgMHgzNCwgMHhjMCwgMHg4ZSwgMHg4NSwgMHhhYiwKKyAgMHhlZSwgMHhlNywgMHhmMCwgMHhjOCwgMHg5MSwgMHhjNywgMHgwMywgMHg3OSwgMHhiZCwgMHhmYiwgMHgzYiwgMHg3MiwKKyAgMHhiOCwgMHhkMCwgMHhkMiwgMHg0ZiwgMHhkZSwgMHhlOSwgMHg1ZCwgMHhjOSwgMHhhYSwgMHg3ZCwgMHhiOSwgMHg4MywKKyAgMHg1ZSwgMHhhMiwgMHg1MSwgMHgxNSwgMHg2ZCwgMHhlYSwgMHg2YiwgMHhiMiwgMHgzYiwgMHhiZSwgMHhjNiwgMHhiZiwKKyAgMHg2YiwgMHg1NCwgMHhkNiwgMHhkMywgMHgyMiwgMHg0OCwgMHgxMSwgMHhkNiwgMHgzYiwgMHhkNiwgMHgxYSwgMHhlYiwKKyAgMHhiYywgMHhjMywgMHg5YiwgMHgwNywgMHgwNSwgMHhkMywgMHhjYywgMHg3OCwgMHg2NiwgMHgzMCwgMHg1ZSwgMHg2YiwKKyAgMHhjMCwgMHgxOCwgMHgxOCwgMHhjZCwgMHhkZSwgMHgyNiwgMHgxYiwgMHg1NiwgMHgxNywgMHhlZSwgMHgwZiwgMHgxOSwKKyAgMHgxYywgMHhlNywgMHhhNSwgMHhjYiwgMHgxOCwgMHg0NywgMHg2MSwgMHhiMCwgMHg2NSwgMHhiYSwgMHg0ZSwgMHg0ZSwKKyAgMHgyMSwgMHg1ZiwgMHg3ZSwgMHhmMiwgMHg2ZSwgMHhhZiwgMHgzMCwgMHgxMywgMHgyZiwgMHg5MCwgMHhlZSwgMHhiMSwKKyAgMHg5OSwgMHhjZCwgMHg2YSwgMHgwZiwgMHhjZSwgMHgwZCwgMHhkNCwgMHg4MCwgMHgxMCwgMHgwMiwgMHhhYiwgMHhjNiwKKyAgMHg1OCwgMHg3YiwgMHhiYSwgMHgzMiwgMHg4NiwgMHg3OSwgMHgyYywgMHg1NSwgMHhmMywgMHhmZSwgMHg5OSwgMHgwMywKKyAgMHg3OSwgMHg3YSwgMHg0OCwgMHg1NywgMHg3YywgMHhjNywgMHhhMCwgMHg1MiwgMHhlZCwgMHgyZiwgMHg4NywgMHg5YSwKKyAgMHhjNiwgMHhmMywgMHgwZCwgMHhhNSwgMHgyYywgMHhkOSwgMHhjOSwgMHg5ZiwgMHhiOSwgMHhmZiwgMHg1OCwgMHg4NywKKyAgMHg2NiwgMHgyMiwgMHgyMSwgMHgzMiwgMHg0OCwgMHgzYSwgMHgzZSwgMHg5YSwgMHg2OSwgMHg5NSwgMHhhZSwgMHhkNywKKyAgMHg1YywgMHhlMywgMHg5NywgMHg0ZiwgMHg2OCwgMHgwMSwgMHhlZiwgMHhlYSwgMHg4MywgMHgxNiwgMHhiMSwgMHgxYywKKyAgMHgzYiwgMHgwMCwgMHgwMCwgMHhhOCwgMHhhMCwgMHgwMCwgMHgxMCwgMHg4YSwgMHgxNywgMHhhMywgMHg2MiwgMHhjYywKKyAgMHg4YiwgMHhmMiwgMHg2ZCwgMHgyNywgMHhjOSwgMHhjOSwgMHg0MCwgMHgyZiwgMHgyYiwgMHgyNywgMHhjOCwgMHhiYSwKKyAgMHgzMiwgMHg5MCwgMHgxYiwgMHg5NiwgMHg4YSwgMHhkOCwgMHg2YywgMHhhNSwgMHhjYSwgMHgyZiwgMHg3YSwgMHg0NCwKKyAgMHgxZCwgMHg5MywgMHg5YSwgMHg0YSwgMHg4ZCwgMHgwZCwgMHg2ZSwgMHg3MSwgMHg5MiwgMHhjNSwgMHgzYywgMHgxYSwKKyAgMHg4OSwgMHhmYSwgMHhhMSwgMHgwOCwgMHhkZiwgMHg3NiwgMHg4ZCwgMHg1OSwgMHhiNCwgMHg3ZCwgMHg4MywgMHgxYSwKKyAgMHgzOSwgMHg2ZCwgMHg5ZiwgMHhkNywgMHhiYiwgMHhmNiwgMHg0MSwgMHhhNiwgMHgwNCwgMHgyNiwgMHg3MSwgMHgzOCwKKyAgMHg1ZiwgMHgzZCwgMHg0NiwgMHgzMywgMHhiOSwgMHgzYywgMHhjMiwgMHg1YiwgMHgyMCwgMHhjYywgMHhlYywgMHhmYywKKyAgMHg1MywgMHg1YiwgMHg1OSwgMHhhOCwgMHhhNiwgMHhjNywgMHhjOSwgMHgyNiwgMHgyZiwgMHg3NiwgMHgwYiwgMHg0NSwKKyAgMHg5MiwgMHhjOSwgMHhmYywgMHhhNiwgMHg0MiwgMHgxOSwgMHg3NCwgMHhhNiwgMHgyNSwgMHgzZSwgMHhlMSwgMHhiZiwKKyAgMHg2NywgMHg2ZiwgMHg2YiwgMHhlOCwgMHg2YiwgMHg1YiwgMHg0ZSwgMHgzMywgMHg4MCwgMHgwZSwgMHgyMSwgMHgxYSwKKyAgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwgMHhmZiwgMHgxOSwgMHg3MywgMHg4MiwgMHgzMCwgMHhkMCwgMHg2NiwKKyAgMHgyMiwgMHgzMiwgMHgwNSwgMHg4NiwgMHhhMSwgMHgwNSwgMHg2OSwgMHg0YiwgMHhmOCwgMHgxNCwgMHhlMSwgMHg2OCwKKyAgMHgyOCwgMHgwMCwgMHgyMiwgMHgwNCwgMHhmYSwgMHhiOSwgMHhmYywgMHhkYywgMHhlZiwgMHhmOSwgMHhmYywgMHgxZCwKKyAgMHhhZCwgMHg2NCwgMHhhMSwgMHgxYiwgMHhjMCwgMHgzNiwgMHg0NSwgMHgxZiwgMHg0ZCwgMHhjYiwgMHg2MiwgMHhhNywKKyAgMHg3MywgMHhhMCwgMHgyYywgMHgxZiwgMHg4NCwgMHhkNSwgMHg5NCwgMHhlZiwgMHg3NCwgMHg2YSwgMHgxYywgMHhlNSwKKyAgMHhjYywgMHhmYiwgMHgwYywgMHg1OSwgMHhiMiwgMHhlOCwgMHgwNSwgMHgwYSwgMHgwYSwgMHg4OSwgMHg5ZSwgMHg4MywKKyAgMHhiMSwgMHg2NSwgMHgzMiwgMHgyOCwgMHg1MywgMHgxYSwgMHg0MSwgMHg0OSwgMHhhYiwgMHhiOCwgMHhhYywgMHg0NSwKKyAgMHhjZCwgMHhiZiwgMHg5OSwgMHhhNiwgMHgyYywgMHhiZCwgMHg0OCwgMHhlMiwgMHhjNiwgMHgyNiwgMHg1YywgMHgwMywKKyAgMHhiNCwgMHhhNywgMHg3MywgMHhiNSwgMHhlZSwgMHhjYSwgMHg2YiwgMHg5YywgMHhlMSwgMHg2YywgMHg0YSwgMHg5MywKKyAgMHg0YSwgMHg4MiwgMHg5MywgMHhiMiwgMHg2NiwgMHhkOCwgMHg2NiwgMHgwYywgMHg4NiwgMHhkZSwgMHg2YiwgMHgzNywKKyAgMHgxNywgMHg0ZSwgMHg5NCwgMHg3MSwgMHhhNywgMHgxZSwgMHhlZiwgMHg1MywgMHg4NiwgMHg2NSwgMHg0ZCwgMHg1MCwKKyAgMHg5NywgMHhhYSwgMHg2ZSwgMHg0ZiwgMHg1ZCwgMHhiYywgMHgxYSwgMHg3NywgMHhiNiwgMHhkYSwgMHgzMSwgMHg0YSwKKyAgMHgxZCwgMHhhNywgMHg5ZSwgMHhkMCwgMHgyMiwgMHgzOCwgMHg1OCwgMHg2OCwgMHg3YSwgMHgwMSwgMHgxNSwgMHg5NSwKKyAgMHg1YywgMHhjNSwgMHg5ZCwgMHhkMiwgMHhhZSwgMHhkYiwgMHhiMSwgMHg1NCwgMHg5ZSwgMHhjYiwgMHgyZSwgMHgyMywKKyAgMHhiNSwgMHg5NiwgMHhkNSwgMHhkMiwgMHg1YSwgMHg5MSwgMHhlYSwgMHhjZiwgMHgyMywgMHg0NiwgMHg4NSwgMHhlYiwKKyAgMHhkMSwgMHhiYywgMHg2NywgMHhiZiwgMHgxNCwgMHg3YSwgMHg5ZiwgMHhhYywgMHhhNSwgMHgzMSwgMHg4MCwgMHgzZSwKKyAgMHgxMCwgMHg3YywgMHg3NiwgMHgyMSwgMHhlOSwgMHg1NSwgMHgwMiwgMHgwZCwgMHgyMiwgMHhkNCwgMHg4MCwgMHhhYywKKyAgMHgwMCwgMHg4YiwgMHgxYSwgMHg5MiwgMHg4NCwgMHhlMSwgMHhiNSwgMHgzOSwgMHg4YywgMHhjOSwgMHg2ZiwgMHgwMCwKKyAgMHg3ZiwgMHg2MSwgMHhiZSwgMHhiNiwgMHgxYywgMHhjMiwgMHgwZCwgMHhmNCwgMHgwMiwgMHhhYywgMHhjYywgMHgwMCwKKyAgMHg1YywgMHgxOCwgMHgyYSwgMHg2MCwgMHg0MiwgMHg3YiwgMHgyYywgMHgxMSwgMHhjNywgMHhmMCwgMHg0NCwgMHg1NiwKKyAgMHgzNywgMHgzZSwgMHhhOSwgMHhmOSwgMHg1MSwgMHhjMywgMHg2NiwgMHhiOSwgMHg4MywgMHhiNywgMHgxZSwgMHg5ZiwKKyAgMHg5YSwgMHgyNCwgMHgwMCwgMHhmYiwgMHhmYywgMHgxNCwgMHhhMCwgMHg1OCwgMHg2NiwgMHgxZCwgMHg4MCwgMHgwMCwKKyAgMHg1NCwgMHhhOSwgMHgyYSwgMHg1NCwgMHg5OSwgMHg2MSwgMHg4MiwgMHhjMCwgMHgyYiwgMHgxYSwgMHg3ZSwgMHhiYSwKKyAgMHhhOSwgMHg3YiwgMHg0NCwgMHg1ZCwgMHgxNSwgMHgyMSwgMHhhZSwgMHg0YiwgMHg0MSwgMHgyNSwgMHhiNCwgMHg0OCwKKyAgMHg3MCwgMHhlOCwgMHg3MiwgMHg5OSwgMHg3YiwgMHgyYSwgMHg0MSwgMHg3MiwgMHg0OSwgMHgzYywgMHgzMiwgMHhiOCwKKyAgMHg4NywgMHg4MCwgMHg1YSwgMHg0OCwgMHhlMywgMHgwYywgMHg3NCwgMHhiNywgMHhmMiwgMHgwNiwgMHhjOSwgMHg0NCwKKyAgMHgzZCwgMHgyYywgMHhkNSwgMHg4ZCwgMHgwNiwgMHgzOCwgMHhjNCwgMHg1MywgMHg0MiwgMHhhNSwgMHhkNywgMHhkYSwKKyAgMHgyZSwgMHgxNiwgMHg0NSwgMHg4YSwgMHhmMiwgMHhiMCwgMHhkMiwgMHg5NywgMHg2NCwgMHg2NiwgMHgxOCwgMHhhMywKKyAgMHhjMCwgMHg2YSwgMHgwOSwgMHhjMywgMHhlZiwgMHhkZCwgMHg1YywgMHgzYywgMHg4MCwgMHhlMCwgMHgyMSwgMHgxYSwKKyAgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgxOSwgMHg2ZiwgMHhhNCwgMHhhMSwgMHgwOSwgMHgyYywKKyAgMHg0MywgMHgwOSwgMHgxYywgMHhmMCwgMHg1NCwgMHhlYSwgMHg1YSwgMHhkMiwgMHhkYSwgMHg1NCwgMHg5NCwgMHgyOCwKKyAgMHgxMCwgMHgyNSwgMHg2MCwgMHhkZCwgMHgzNSwgMHg4NCwgMHg5ZiwgMHhiZiwgMHhlMiwgMHhkNywgMHgzNSwgMHg1NywKKyAgMHgyYiwgMHg5YywgMHg4YywgMHgzNSwgMHg1ZSwgMHg1MywgMHhkNCwgMHhiMiwgMHgyMiwgMHgyMCwgMHgwZSwgMHgyOSwKKyAgMHhkNSwgMHg3NSwgMHhiOCwgMHhmZiwgMHgwNywgMHhmMCwgMHhhZiwgMHg3YywgMHgwZCwgMHhiMywgMHhjYiwgMHg1ZSwKKyAgMHg3ZCwgMHhjMywgMHhkYSwgMHg3MywgMHhlMywgMHg5MywgMHhjOCwgMHg3OSwgMHhiZiwgMHhkOCwgMHg2NiwgMHgyOSwKKyAgMHgxYSwgMHhmZiwgMHhhNCwgMHhkMiwgMHhjNywgMHhkNywgMHhkNywgMHhlNSwgMHhhYywgMHhkNSwgMHhiZCwgMHhlNiwKKyAgMHg3YywgMHhhZiwgMHgxNSwgMHhmNywgMHg5MywgMHhiNywgMHgyOCwgMHgyZSwgMHhjZiwgMHgwMSwgMHg0MywgMHgyNiwKKyAgMHhhMywgMHg4ZSwgMHhmMCwgMHgzOCwgMHhhYSwgMHhkZiwgMHhjNCwgMHgyNCwgMHgxZSwgMHg3MiwgMHhmZCwgMHg4YiwKKyAgMHgyNSwgMHgyMCwgMHg4MSwgMHg3ZiwgMHgzYSwgMHhjMiwgMHhhZiwgMHgzMiwgMHgzMCwgMHhiMSwgMHgxMywgMHg5MywKKyAgMHg0OSwgMHgxYiwgMHg3YiwgMHg4YSwgMHg2MSwgMHgwYiwgMHgyOCwgMHhhNCwgMHg0OSwgMHgyMiwgMHgxZCwgMHhhNCwKKyAgMHgzZCwgMHg0OCwgMHhkMywgMHg3YSwgMHhkMywgMHgyMCwgMHhhZiwgMHg4NCwgMHgzMywgMHhhMCwgMHgzNywgMHg5ZiwKKyAgMHg0NCwgMHg0ZSwgMHhiMywgMHhkNCwgMHg3ZSwgMHhlZCwgMHg2MiwgMHg4YiwgMHhhOSwgMHhkMCwgMHg3ZiwgMHhiNywKKyAgMHhjOCwgMHhhZiwgMHhhMCwgMHhiNiwgMHhjOSwgMHgwNSwgMHhlMCwgMHg2OSwgMHgzZCwgMHg0MCwgMHgwZSwgMHg4MiwKKyAgMHg0MSwgMHg1MCwgMHhjMiwgMHgzNywgMHgwNywgMHgzMCwgMHhhOSwgMHhmZiwgMHg0NywgMHhkNiwgMHg3NSwgMHgzMywKKyAgMHhmNywgMHg2NywgMHg1YywgMHgzNywgMHgxOCwgMHgwYSwgMHhkZSwgMHg4NCwgMHg5OSwgMHg3ZCwgMHgyOSwgMHgwOCwKKyAgMHgzMywgMHhjMCwgMHhjZiwgMHgwOSwgMHhiZiwgMHgzYSwgMHgyMiwgMHgzYiwgMHg1YSwgMHhmMywgMHhmYSwgMHgwMywKKyAgMHhkZSwgMHhjNywgMHhhNCwgMHhkNSwgMHgzZiwgMHgzNCwgMHhiZCwgMHg2YSwgMHhmZSwgMHhmZSwgMHhiYiwgMHgzNSwKKyAgMHgxMCwgMHg1OCwgMHgwNCwgMHgyNSwgMHgwMCwgMHgyMiwgMHhjZSwgMHg2ZCwgMHhiNSwgMHhjMCwgMHgyMywgMHhiZSwKKyAgMHg5NCwgMHhkZiwgMHhhOCwgMHgwYSwgMHhjYSwgMHgxNSwgMHgyYSwgMHgyNywgMHhlNywgMHhkZSwgMHg5OSwgMHg2MSwKKyAgMHgzMSwgMHgzNSwgMHhlOSwgMHhkYSwgMHgxNSwgMHhkOCwgMHhmOCwgMHgzMSwgMHhkOCwgMHg1YywgMHhmMiwgMHhjMCwKKyAgMHhiNiwgMHhjYiwgMHgxOCwgMHg4NiwgMHgxOSwgMHgzYywgMHhhNywgMHhjNywgMHhiZCwgMHgwMCwgMHgzZiwgMHg3ZSwKKyAgMHhjNSwgMHgwNCwgMHgzNiwgMHgxOCwgMHg4NywgMHg2MCwgMHgwMCwgMHgwNCwgMHhhMSwgMHg2YywgMHhkMCwgMHgwMSwKKyAgMHgwZSwgMHg0MiwgMHgzZCwgMHg0MCwgMHg2NiwgMHg5NSwgMHhkNCwgMHhiOCwgMHgxMSwgMHhiMSwgMHhiZiwgMHhiYiwKKyAgMHhhMiwgMHhjYywgMHgxYywgMHhhYiwgMHhkMSwgMHgyYiwgMHhhMSwgMHhmMywgMHgxMywgMHgyMiwgMHhjZCwgMHhkYiwKKyAgMHgxNCwgMHg3NywgMHg1ZCwgMHg3ZCwgMHg4ZSwgMHg4MSwgMHg3ZiwgMHg0MSwgMHhiYywgMHg2MSwgMHhlNSwgMHhmZSwKKyAgMHgzOSwgMHhkNywgMHhjZiwgMHgwYiwgMHhiZSwgMHg0ZiwgMHg3MiwgMHhmYSwgMHg4ZiwgMHhmMSwgMHhiYSwgMHg1OSwKKyAgMHhkZSwgMHhjYSwgMHhiYywgMHhiMywgMHgyYiwgMHg3YSwgMHhhNywgMHg4YSwgMHhhZCwgMHg5MiwgMHg1NCwgMHg0OCwKKyAgMHg0YiwgMHhiNywgMHhmOCwgMHgzNSwgMHg3MSwgMHhhZiwgMHg2NywgMHg3NiwgMHhjYywgMHgyZiwgMHg3YiwgMHgzYiwKKyAgMHhhNywgMHgwNywgMHgwZCwgMHg5NCwgMHg0OSwgMHg1YywgMHhlOSwgMHg4ZiwgMHhmMywgMHhhZSwgMHgyNywgMHhmZCwKKyAgMHhiZiwgMHg4NiwgMHgxMCwgMHhlMCwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhmZiwgMHhmZiwKKyAgMHgxOSwgMHg2ZiwgMHhhNCwgMHhiMCwgMHg4OCwgMHhlOCwgMHg0NiwgMHgyMSwgMHg4NCwgMHgwNCwgMHhhZiwgMHgyNiwKKyAgMHg3MCwgMHhhOSwgMHhkMywgMHhhNSwgMHg1NCwgMHg0MCwgMHhhMSwgMHgyOSwgMHg2YSwgMHg5YiwgMHgxNiwgMHg4MSwKKyAgMHgyZSwgMHhhNSwgMHhjYiwgMHg4MSwgMHgyMCwgMHg5NCwgMHhlNywgMHg2NSwgMHg1ZCwgMHhjMSwgMHg5ZCwgMHgxMSwKKyAgMHg3MiwgMHg3ZCwgMHgxMywgMHg5YSwgMHgyNSwgMHg2OCwgMHgwYiwgMHg5MSwgMHhiOCwgMHg3NiwgMHg3YiwgMHg2OCwKKyAgMHhiNiwgMHhlOSwgMHgxMiwgMHgwMSwgMHgzYywgMHhjZSwgMHgzZSwgMHgzNSwgMHhjNSwgMHg3YywgMHg4YiwgMHg1NSwKKyAgMHhkOCwgMHgxYSwgMHg0MiwgMHg5OSwgMHhlMSwgMHhiMSwgMHhjMywgMHg4NSwgMHhkZiwgMHgyMCwgMHhkZSwgMHg2OSwKKyAgMHg1YywgMHhiMSwgMHhkNiwgMHg3YSwgMHg5NywgMHgwMiwgMHhhZSwgMHhjNiwgMHhjMywgMHg0ZSwgMHhmZCwgMHhhYywKKyAgMHg1OSwgMHg0YywgMHhjMCwgMHg2MiwgMHgzOSwgMHg1ZSwgMHhkZCwgMHgyMCwgMHhkZSwgMHhkZiwgMHg1ZiwgMHg2MSwKKyAgMHhkNSwgMHhkNiwgMHhiZSwgMHgxYSwgMHgxNSwgMHgyZSwgMHg4YSwgMHhjMCwgMHhlOSwgMHhhNCwgMHhmOCwgMHhhYywKKyAgMHg5YSwgMHg1YSwgMHg4ZCwgMHg0MiwgMHgzYiwgMHgxZSwgMHhkMCwgMHhjMSwgMHg1YiwgMHhhMiwgMHg5NCwgMHg1YywKKyAgMHhhYywgMHg1MiwgMHgyZiwgMHgzMSwgMHg4NSwgMHg0ZCwgMHgxMywgMHg0NSwgMHgwNywgMHgzOSwgMHg5NCwgMHg4NCwKKyAgMHgyNiwgMHg5ZCwgMHhmYywgMHg2NywgMHgxOCwgMHgxYywgMHhkYSwgMHg1MiwgMHg2YiwgMHg4OSwgMHg1ZiwgMHhhMSwKKyAgMHg1MiwgMHgwYSwgMHgyZiwgMHg5YywgMHhhOSwgMHg1NSwgMHg1ZCwgMHhmZiwgMHgyOSwgMHg2MCwgMHgyYiwgMHgyOCwKKyAgMHhmNSwgMHgyYiwgMHg2MCwgMHg3MiwgMHg5YywgMHgyMiwgMHhhZSwgMHg2YSwgMHhlOCwgMHhhMSwgMHg4MiwgMHhiYSwKKyAgMHgyYiwgMHg2YiwgMHhmZCwgMHhjMCwgMHgzYywgMHhjYSwgMHg5NCwgMHhhMSwgMHhmNSwgMHg3MywgMHhlZiwgMHhlYywKKyAgMHg4ZiwgMHg1NywgMHgyOCwgMHhiZCwgMHhhYiwgMHgwYiwgMHgzZiwgMHgzMywgMHgwMywgMHhmNywgMHg3OCwgMHgwYywKKyAgMHhhMSwgMHgxNSwgMHhjNCwgMHgzMSwgMHg0NiwgMHhkOCwgMHg4MiwgMHgyZSwgMHgxZiwgMHgwZCwgMHgzYiwgMHgxYiwKKyAgMHgyYywgMHhlMywgMHg1MSwgMHhmMywgMHhmNSwgMHhkZCwgMHg3NiwgMHhjNSwgMHhhMywgMHhhZCwgMHg2OCwgMHhmOSwKKyAgMHg4NiwgMHhlOCwgMHgwYSwgMHhhNCwgMHgwYiwgMHhlNSwgMHhhOCwgMHgxYiwgMHgzNSwgMHhhMiwgMHg3YiwgMHhhZCwKKyAgMHhhZCwgMHg4NiwgMHg5NSwgMHg5YSwgMHg1NiwgMHhlMSwgMHhkOCwgMHgxMiwgMHhmMywgMHhlZCwgMHg0YywgMHhmNCwKKyAgMHg2MSwgMHg2NSwgMHgzNiwgMHgxOCwgMHgxNSwgMHhkMywgMHhhYywgMHhiNCwgMHg0MSwgMHhhZSwgMHg0OSwgMHg0ZiwKKyAgMHg4NSwgMHgzNywgMHgyNiwgMHg0MywgMHg0ZCwgMHg5ZSwgMHg2OSwgMHhmMiwgMHhmZSwgMHhmNSwgMHhkMywgMHhiZiwKKyAgMHhjMSwgMHhlNSwgMHg4MSwgMHhmZiwgMHhmNCwgMHgwMywgMHgxNCwgMHgyMCwgMHg1OCwgMHg2NiwgMHgxZCwgMHg4MCwKKyAgMHgwMCwgMHgwOSwgMHg0OCwgMHg3MCwgMHg2MCwgMHg0MSwgMHhiMCwgMHhiZCwgMHg1NSwgMHgyYSwgMHhiMSwgMHgyOSwKKyAgMHg3YSwgMHhiZiwgMHhjYiwgMHhiYywgMHhhYiwgMHhiNCwgMHgwZSwgMHg4YSwgMHg1MCwgMHg5NCwgMHgzOCwgMHgwYywKKyAgMHhmMCwgMHhiMSwgMHg3YywgMHgzMiwgMHhkYSwgMHgwMCwgMHgyOSwgMHhhZCwgMHg1ZSwgMHg2MiwgMHg0YiwgMHg3NSwKKyAgMHg4ZSwgMHg1ZCwgMHg1MiwgMHhmMywgMHhiNywgMHgwMywgMHhhMiwgMHgwMCwgMHgwZiwgMHg0YSwgMHhhOCwgMHg1YywKKyAgMHhhYSwgMHgxYSwgMHhhYywgMHgxYiwgMHg4NSwgMHgyNywgMHg1OSwgMHgzYiwgMHg4YSwgMHhhYSwgMHgwMCwgMHgzMCwKKyAgMHgyMSwgMHgzMiwgMHhhZSwgMHg1MSwgMHg0YSwgMHgwNiwgMHg0YiwgMHhhOCwgMHhkMCwgMHhmNCwgMHg3ZCwgMHhjZiwKKyAgMHhiOSwgMHg2OSwgMHg4NywgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzZiwgMHhmZiwgMHgyNSwKKyAgMHg3MywgMHg4MywgMHgyMSwgMHg0OCwgMHg4OCwgMHg0NiwgMHgxOSwgMHg4NSwgMHgwNCwgMHhlOSwgMHg2NywgMHg0ZCwKKyAgMHgwYiwgMHg1YSwgMHhlYSwgMHg0YywgMHg4MCwgMHgwNSwgMHg1OSwgMHg0MywgMHg0YiwgMHg2MCwgMHhlMCwgMHhmNiwKKyAgMHg0ZSwgMHhiOCwgMHhhZSwgMHg4OSwgMHhmOCwgMHg0ZSwgMHgyNSwgMHg1MSwgMHgxNCwgMHhlYywgMHg0NiwgMHg5ZiwKKyAgMHhiOCwgMHg3NywgMHhhZCwgMHg5NCwgMHg0OSwgMHgwMywgMHhiMCwgMHg3ZSwgMHhkMSwgMHhkNywgMHg1ZCwgMHg0NywKKyAgMHgyOCwgMHg4NiwgMHg5MywgMHhlZiwgMHhkNywgMHgwZCwgMHhiNywgMHhhMSwgMHg3NCwgMHg2YywgMHgxMywgMHhjZSwKKyAgMHgyNCwgMHgyNywgMHhmNiwgMHhlYywgMHg0NSwgMHgwZSwgMHhiMCwgMHg2MiwgMHg1MSwgMHg4ZiwgMHhjMSwgMHg1MCwKKyAgMHhhYiwgMHhkYywgMHg5MiwgMHgwNiwgMHg0NiwgMHhjNSwgMHhlMSwgMHhmNCwgMHhhZCwgMHgzOSwgMHg2ZCwgMHhlOCwKKyAgMHhkNSwgMHgyOCwgMHgwNSwgMHhmMywgMHg0OSwgMHhjMSwgMHg2MywgMHgwYSwgMHhmZSwgMHgyMywgMHg3OCwgMHgyNiwKKyAgMHg1YiwgMHg2ZiwgMHhhNSwgMHhhOCwgMHg5MiwgMHhlYywgMHg3NCwgMHhlMCwgMHg0MSwgMHhmNiwgMHhiNSwgMHgwOSwKKyAgMHgyMywgMHgzYywgMHhkZCwgMHgxNywgMHg5OSwgMHhhMywgMHhhZCwgMHhkMywgMHg3NSwgMHgzOCwgMHg1YiwgMHhlNSwKKyAgMHg3OSwgMHhkYSwgMHgwZSwgMHhjYiwgMHgxYSwgMHhjZiwgMHhlYiwgMHg5ZiwgMHgyNCwgMHg0NSwgMHhhNSwgMHhjNSwKKyAgMHg0NSwgMHhlOSwgMHgzOSwgMHg2NCwgMHg1YywgMHhlNSwgMHgwZCwgMHhlNCwgMHg4OCwgMHgzZiwgMHhlNSwgMHgwMCwKKyAgMHgyYywgMHhmYiwgMHg0MywgMHgxNSwgMHhhOCwgMHgwMSwgMHg4YiwgMHhlNSwgMHg0YSwgMHhlMywgMHg3NiwgMHhkZiwKKyAgMHgxZiwgMHhlNCwgMHhlYSwgMHhkZiwgMHg4MSwgMHgwNiwgMHg2NywgMHg2NSwgMHg4NSwgMHg0ZSwgMHg5ZiwgMHhmMCwKKyAgMHhlYSwgMHgzNiwgMHg0YSwgMHgwNSwgMHg5NiwgMHg3MiwgMHhmMywgMHg0OSwgMHgyZSwgMHhlZCwgMHgzZiwgMHgzNiwKKyAgMHhkMCwgMHhmZSwgMHhmNSwgMHg2MiwgMHhiNCwgMHhlZiwgMHg3NCwgMHg3ZiwgMHhiNywgMHg0YSwgMHg5MiwgMHgzNSwKKyAgMHg0NywgMHhmYiwgMHg0ZSwgMHg0MywgMHg5MSwgMHhlYywgMHhhOCwgMHhmOCwgMHhkYywgMHhiNywgMHhkOSwgMHg2ZCwKKyAgMHgzYSwgMHgzNywgMHgyNywgMHg3ZiwgMHg3OCwgMHgzOSwgMHg2MCwgMHg5YSwgMHgyOCwgMHg5NiwgMHgyMywgMHhkOCwKKyAgMHhiMiwgMHg5NiwgMHgwYSwgMHg4MCwgMHgyOCwgMHg1MiwgMHg3MCwgMHgzZSwgMHg2NiwgMHgyZCwgMHhkNCwgMHg2NCwKKyAgMHhhMiwgMHhiZSwgMHhiNiwgMHhhOCwgMHg1YSwgMHhkZCwgMHgzOCwgMHg1NSwgMHg5YiwgMHhlZiwgMHg0OSwgMHgyNywKKyAgMHhlZCwgMHhjZCwgMHhjOSwgMHg1MiwgMHg4MiwgMHg4ZCwgMHg4NywgMHgxMywgMHg3NSwgMHhkNSwgMHg0ZCwgMHgxNywKKyAgMHg1MSwgMHgyNiwgMHg1MywgMHhlNSwgMHgzYiwgMHhkMSwgMHgyZiwgMHhkMiwgMHhiZiwgMHhmZCwgMHhiZiwgMHhkZCwKKyAgMHgzYywgMHhkMCwgMHg3ZCwgMHhmZSwgMHg4YSwgMHgxMCwgMHg4YSwgMHgxZCwgMHg4MCwgMHgwOSwgMHg0MSwgMHgzMSwKKyAgMHg3OCwgMHg4OSwgMHg5NywgMHg2MSwgMHg4MCwgMHgwMiwgMHgzNCwgMHhkYiwgMHhiMywgMHg0MywgMHgyYSwgMHgwOSwKKyAgMHg1OCwgMHg4YywgMHhjOSwgMHgxNSwgMHhhZCwgMHgxNiwgMHgzMSwgMHgwZiwgMHg0MSwgMHg2OCwgMHgyYSwgMHgwMiwKKyAgMHhiYSwgMHg3OCwgMHg1NSwgMHhjMiwgMHg0OSwgMHg1NCwgMHg0MiwgMHgzZCwgMHgyZCwgMHg3NiwgMHhjNSwgMHhlNiwKKyAgMHgwOCwgMHgyYywgMHhiMiwgMHg3MSwgMHg0MywgMHhiMSwgMHhmYywgMHg3NywgMHhhYywgMHg2ZCwgMHg3ZSwgMHg0ZSwKKyAgMHgxMSwgMHg1NywgMHhjNiwgMHhkNCwgMHhkZCwgMHgyOCwgMHg1NiwgMHg5MiwgMHgwNywgMHhlYywgMHhlZSwgMHg4ZiwKKyAgMHgwYywgMHhlNSwgMHgwMiwgMHgxMSwgMHg5ZCwgMHhjZSwgMHg2NywgMHhkZCwgMHhjZiwgMHhhYSwgMHgwMCwgMHgxYywKKyAgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwgMHhmZiwgMHgxOSwgMHg2ZiwgMHhhMiwgMHhjMSwKKyAgMHg1OCwgMHg2NCwgMHg0NCwgMHgzMywgMHgwZCwgMHg0MiwgMHgwNywgMHgxYiwgMHg5NywgMHg2NiwgMHg5NSwgMHhjMSwKKyAgMHhhYiwgMHhhOSwgMHgyYSwgMHgxNCwgMHgwMCwgMHg5NSwgMHgwMywgMHgzZiwgMHhkNCwgMHhjOCwgMHhiMSwgMHg5YywKKyAgMHg0YSwgMHg1YiwgMHgzNiwgMHg2NiwgMHgzYywgMHgyMSwgMHgwOSwgMHhlOCwgMHhlZCwgMHg5ZSwgMHhhYywgMHhkOCwKKyAgMHhkYSwgMHg5YiwgMHg0NSwgMHhkOSwgMHg3ZSwgMHgxNiwgMHhjZSwgMHgwYywgMHhiMiwgMHgxNiwgMHhjNCwgMHhjYSwKKyAgMHgwYiwgMHgzMCwgMHgxOSwgMHgxNywgMHgzNCwgMHhlNSwgMHhlZCwgMHhkZiwgMHg3YywgMHg3NiwgMHg1ZiwgMHgzNCwKKyAgMHg2NiwgMHhhOCwgMHg5NCwgMHgwMSwgMHg0MiwgMHhlNiwgMHhhNCwgMHg2ZiwgMHg5YywgMHgyZCwgMHhmYywgMHg4ZiwKKyAgMHhlNywgMHhhOCwgMHgxMywgMHgyYiwgMHgyOCwgMHhjOCwgMHg3MiwgMHg2MywgMHg2OSwgMHhhYiwgMHhiOSwgMHgwYiwKKyAgMHgyNCwgMHhmNiwgMHg3ZCwgMHg0MywgMHgyMSwgMHg4NCwgMHhhZSwgMHg1NCwgMHgzNSwgMHg1YywgMHhmYywgMHhjMCwKKyAgMHgxYSwgMHg3MiwgMHg1OSwgMHg0OCwgMHg4YywgMHhkNSwgMHgzNiwgMHg1MSwgMHhkMCwgMHg5ZCwgMHg0YywgMHg0ZiwKKyAgMHg1YSwgMHhkYSwgMHhkNSwgMHg0YiwgMHg0NSwgMHg3NSwgMHgwMSwgMHgxMSwgMHgxYSwgMHg3OCwgMHhlZCwgMHhlZCwKKyAgMHgzYiwgMHhhNSwgMHhhYiwgMHg4MSwgMHg0YiwgMHg2MiwgMHhmYywgMHg4YSwgMHg1YiwgMHhhYywgMHg0NSwgMHgwZiwKKyAgMHg0NCwgMHgzZSwgMHgzNiwgMHg0YSwgMHg0YywgMHgwOSwgMHgwOCwgMHhjZSwgMHhmNywgMHhlYSwgMHgxYywgMHgyYiwKKyAgMHhiMywgMHgyMCwgMHhhNCwgMHhjNCwgMHhlNSwgMHhiNSwgMHg2ZCwgMHg4YiwgMHgyYSwgMHhhYywgMHhhYywgMHgyNSwKKyAgMHg1MywgMHgzYiwgMHgyYywgMHg5YSwgMHg4OCwgMHhjZCwgMHhjMCwgMHg4ZiwgMHhlMywgMHg1MywgMHhmNSwgMHg5MywKKyAgMHgwNiwgMHgzZiwgMHg2NCwgMHhmZCwgMHg2NCwgMHg0NSwgMHhhZSwgMHg3ZiwgMHhkOSwgMHgzNiwgMHhhMywgMHhmMSwKKyAgMHgxZCwgMHhjZSwgMHhhNywgMHgzYiwgMHhhMSwgMHg2NSwgMHg4MywgMHhmMSwgMHhjMiwgMHg0MCwgMHhkMCwgMHhhNywKKyAgMHgxMCwgMHhlMywgMHg2YSwgMHg4MCwgMHg0NCwgMHg3NSwgMHg0NiwgMHhjYSwgMHgwZiwgMHgzZSwgMHg0YSwgMHg1YiwKKyAgMHgzMiwgMHhhNiwgMHg2MiwgMHgxMCwgMHg2NSwgMHg2MCwgMHg0NywgMHgxYywgMHg5NCwgMHhjYywgMHhhOSwgMHg0MywKKyAgMHg5YiwgMHhiZSwgMHhiMSwgMHhjNiwgMHg1NSwgMHgwOSwgMHgzMCwgMHhmYywgMHgzZSwgMHgyYywgMHhkZCwgMHg5NCwKKyAgMHg1ZiwgMHhkNSwgMHg2NiwgMHgzOCwgMHg0MiwgMHhkNSwgMHg0MywgMHhjZSwgMHgwMiwgMHhmNywgMHhiOCwgMHg5NSwKKyAgMHhjZSwgMHhmNCwgMHhjMSwgMHgwYywgMHg4ZiwgMHg2YiwgMHg1ZSwgMHg4NSwgMHgzZCwgMHhiNiwgMHhjOCwgMHhiMywKKyAgMHhkMiwgMHhhZCwgMHg1NywgMHg4NCwgMHhiOSwgMHg3NCwgMHhmNSwgMHhmMywgMHhmYiwgMHgzOCwgMHhlZiwgMHg3ZSwKKyAgMHgwMCwgMHgxMCwgMHgxZiwgMHhjMSwgMHg0YSwgMHgwOSwgMHg0NywgMHhiMCwgMHgwMCwgMHg5NCwgMHgyYSwgMHhlOCwKKyAgMHgyNSwgMHgxZCwgMHgxOCwgMHgwMSwgMHhiMCwgMHgwMiwgMHgzMiwgMHhlYSwgMHg5ZSwgMHg3NywgMHhlMSwgMHhhZiwKKyAgMHgyOSwgMHgzYywgMHg0MiwgMHg5NCwgMHhiNCwgMHhkNiwgMHhiMSwgMHgwMSwgMHg1MiwgMHhlNCwgMHhiMSwgMHgyZiwKKyAgMHgxNiwgMHg3YiwgMHg5MiwgMHg2NiwgMHgyNywgMHgyOCwgMHgyYiwgMHgxMywgMHg4MiwgMHhiNSwgMHgyMCwgMHg1MCwKKyAgMHhjZCwgMHhiOSwgMHg5NywgMHhhZiwgMHhkYywgMHgwYiwgMHg2MywgMHhjNCwgMHhjZiwgMHg3YiwgMHg0NCwgMHg3ZCwKKyAgMHg3NSwgMHgzNywgMHg3ZiwgMHg3MiwgMHhlNiwgMHhlZSwgMHgyNSwgMHhkOCwgMHhjNSwgMHgxYiwgMHhkNiwgMHhiZSwKKyAgMHg1MSwgMHgwZSwgMHhjZSwgMHhiYiwgMHg5ZSwgMHg5ZCwgMHg0ZCwgMHg3MywgMHg5OCwgMHg5OCwgMHg4MCwgMHgwZSwKKyAgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhmZiwgMHhmZiwgMHgxNSwgMHg2ZiwgMHhhMiwgMHg0MSwKKyAgMHhjOCwgMHhjOCwgMHgxMSwgMHgyMywgMHgwNSwgMHgwNCwgMHhhMiwgMHgwMCwgMHgzOCwgMHgzYSwgMHhkZSwgMHg5NiwKKyAgMHhiYiwgMHhhMiwgMHhlYSwgMHg4MCwgMHgxNSwgMHg3OCwgMHg5OCwgMHgyNCwgMHhmNCwgMHhlNCwgMHhlYSwgMHg5MywKKyAgMHhmNCwgMHhkYiwgMHgxYSwgMHgxMSwgMHgxMCwgMHg5ZiwgMHgyYSwgMHg4NiwgMHg4MiwgMHg4MSwgMHhiYywgMHhiYywKKyAgMHg5MywgMHhmOCwgMHg4ZSwgMHhjYiwgMHgxMCwgMHg5ZCwgMHhhMywgMHg5MCwgMHhjNywgMHg0NCwgMHgxYiwgMHhiYiwKKyAgMHg3OSwgMHg4YiwgMHgzOCwgMHg5MywgMHgxOCwgMHg3YiwgMHgwMiwgMHhkMCwgMHgwZiwgMHg1MCwgMHg0ZiwgMHg1MSwKKyAgMHhjNSwgMHhjYiwgMHhhOSwgMHhlMiwgMHhmZCwgMHg5NywgMHg5YSwgMHg2MywgMHhhYSwgMHg0NSwgMHg1MiwgMHhmMywKKyAgMHhhNiwgMHhlMCwgMHhkNywgMHhhZiwgMHgwZSwgMHg5NiwgMHgwNiwgMHhlZCwgMHg0ZiwgMHhlOSwgMHgxZiwgMHg0NywKKyAgMHg4NiwgMHgxOCwgMHgyOSwgMHhjZiwgMHhhZSwgMHhlMywgMHhiOSwgMHhjZCwgMHgxNywgMHhjNywgMHhjMSwgMHg0NiwKKyAgMHg0NywgMHg3MiwgMHgxNSwgMHg0ZSwgMHhkZCwgMHgyNiwgMHg3MSwgMHgxOCwgMHg0OSwgMHgzMiwgMHhhYywgMHhhNSwKKyAgMHhlNiwgMHg0OCwgMHg2OCwgMHhmOCwgMHg4YywgMHhjNSwgMHhiYiwgMHg4NSwgMHg4YSwgMHhmOSwgMHg3YiwgMHgyZSwKKyAgMHgwYiwgMHhjYSwgMHhlZCwgMHg2MiwgMHg1YSwgMHhlMiwgMHg3MiwgMHhhNiwgMHg1NiwgMHg1ZCwgMHhkZCwgMHg0YywKKyAgMHhkZSwgMHhiZiwgMHgxZSwgMHg1ZCwgMHg4NCwgMHhmNCwgMHhiMywgMHgyNywgMHgxYywgMHhhMiwgMHgwNSwgMHgwMywKKyAgMHg5NCwgMHgwNSwgMHgxNiwgMHhkMywgMHg4YiwgMHg0YywgMHg2OCwgMHg4MywgMHhiOSwgMHgyYSwgMHgzOSwgMHhlYiwKKyAgMHg4NCwgMHhjOCwgMHhjYiwgMHg4NCwgMHhiZSwgMHg0YywgMHhlNiwgMHg1OSwgMHgwNSwgMHhlZCwgMHhiYiwgMHhiMywKKyAgMHg1OSwgMHg1ZSwgMHg3ZSwgMHhlNywgMHhkZCwgMHhmOSwgMHhkMCwgMHhkZSwgMHgzMiwgMHg1NSwgMHg0NiwgMHg0OCwKKyAgMHhjMSwgMHg0ZCwgMHg0MywgMHhmMiwgMHhlMywgMHhlOCwgMHg2NSwgMHg5MSwgMHhiNywgMHg0ZiwgMHg0ZCwgMHgyNywKKyAgMHgzYSwgMHg2MywgMHhkMywgMHhjMywgMHhkMywgMHgwZSwgMHhhOCwgMHhjMiwgMHhlYSwgMHg2NiwgMHhhNiwgMHg2YywKKyAgMHg5ZSwgMHg1ZiwgMHg2ZSwgMHhjMywgMHg4MiwgMHg4NywgMHgyMywgMHgyMSwgMHg2NCwgMHgzNCwgMHgxNCwgMHg5NCwKKyAgMHhmNSwgMHhiYSwgMHhjOSwgMHg2NywgMHg0YywgMHgzNiwgMHg5YywgMHhlNCwgMHg2YiwgMHhhZiwgMHg2ZSwgMHhlOSwKKyAgMHg3NCwgMHhmNSwgMHgyMiwgMHg3OSwgMHhjNSwgMHhmYiwgMHg0MCwgMHg5MSwgMHhjYSwgMHhmZCwgMHg1OCwgMHg5ZiwKKyAgMHg4ZiwgMHg0NSwgMHhmYSwgMHg2MCwgMHhkMiwgMHg3YiwgMHhhYiwgMHgxYiwgMHhlZCwgMHg4MCwgMHgwOCwgMHgwZiwKKyAgMHhkMCwgMHgwOCwgMHg1MiwgMHg4MSwgMHg2MSwgMHg5OCwgMHg3NiwgMHgwMCwgMHgwMCwgMHg0MiwgMHg5MSwgMHhjMCwKKyAgMHgyMiwgMHg5MCwgMHhlYywgMHgyOCwgMHgyMywgMHg5YSwgMHg0MSwgMHg3OSwgMHhjMCwgMHg0NSwgMHgzYiwgMHhjYywKKyAgMHgyMSwgMHgzNSwgMHg5OSwgMHgwYiwgMHg5YywgMHg1MiwgMHgwYSwgMHhkMiwgMHgzNiwgMHhmNywgMHhlZCwgMHhjYiwKKyAgMHgxYiwgMHg4MiwgMHgxMCwgMHg0YywgMHg5MiwgMHg5NSwgMHg3YiwgMHgyNiwgMHg3OCwgMHg0NCwgMHhjZSwgMHhjZiwKKyAgMHhiNCwgMHgxNiwgMHg2OCwgMHg2YywgMHhhZiwgMHg5NCwgMHg0NSwgMHg2OCwgMHgxNSwgMHhhMiwgMHhlNiwgMHhhMiwKKyAgMHhjYiwgMHhkOCwgMHgxZSwgMHg2NCwgMHhhZiwgMHg0MiwgMHg1NCwgMHg5MywgMHhlNSwgMHg1NCwgMHg5ZCwgMHhjMiwKKyAgMHgwMCwgMHg3NSwgMHg5ZSwgMHhlYSwgMHg5MiwgMHgwZiwgMHhiYSwgMHg3NywgMHhkZSwgMHhjNywgMHhmNCwgMHhlOCwKKyAgMHg4NywgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwgMHhmZiwgMHgxNywgMHg2ZiwgMHhhNCwKKyAgMHhiMCwgMHg5MCwgMHhlNCwgMHg0NCwgMHgxMywgMHgwOCwgMHg0MiwgMHgwMSwgMHg2OSwgMHg3YywgMHgwZCwgMHgzMywKKyAgMHg1NywgMHg1MSwgMHgxYywgMHhlOCwgMHgwMCwgMHg4NywgMHgyMiwgMHhkNSwgMHgwZCwgMHhhNiwgMHhmMiwgMHgwOSwKKyAgMHg2NSwgMHg0ZiwgMHgxOCwgMHg5OCwgMHgyMCwgMHgxMiwgMHg4ZiwgMHgwMiwgMHhhMiwgMHg5MywgMHg1OSwgMHg5NCwKKyAgMHg4MiwgMHg0NSwgMHg5MCwgMHg1ZCwgMHhjNiwgMHhmYywgMHg5ZCwgMHhlNSwgMHhiNSwgMHgwMCwgMHgyNiwgMHgyOSwKKyAgMHg1MCwgMHgzNSwgMHg0ZSwgMHgxNywgMHhkOCwgMHgwZiwgMHgxZSwgMHhhZiwgMHg5YiwgMHg5YiwgMHhiZiwgMHhjZiwKKyAgMHg5MiwgMHhiNiwgMHg2NiwgMHg4ZSwgMHhkZCwgMHgzMiwgMHgzNSwgMHhjOSwgMHg5OCwgMHgyZSwgMHgzYSwgMHhiNiwKKyAgMHhhYSwgMHg4ZCwgMHgyNCwgMHgxZCwgMHhkMSwgMHgyZSwgMHg5NiwgMHgyMiwgMHhiNSwgMHhjNiwgMHg2NCwgMHg3MCwKKyAgMHhmOSwgMHgzNywgMHg5ZiwgMHg4ZCwgMHhlNCwgMHgwZiwgMHhiOCwgMHhhNiwgMHhhZiwgMHhmNSwgMHg4OSwgMHgxZSwKKyAgMHgyZSwgMHgzYSwgMHhiZSwgMHg1MywgMHg1NiwgMHgwMSwgMHhkNCwgMHg4MCwgMHgxNiwgMHgwOSwgMHg1MCwgMHhjYSwKKyAgMHhlOSwgMHgwOCwgMHgzZSwgMHgwNCwgMHhjMiwgMHg4NiwgMHhkNCwgMHg4MCwgMHg2OSwgMHhlNiwgMHg4OCwgMHhkZCwKKyAgMHhlMCwgMHg3YiwgMHhiYywgMHg2MCwgMHgyYywgMHhlMCwgMHg4YiwgMHgzOSwgMHg3YiwgMHhkMCwgMHhmMSwgMHhmNCwKKyAgMHgyNywgMHgxOSwgMHgwYywgMHhiZCwgMHgxOCwgMHg5ZCwgMHgzOCwgMHgyMSwgMHhkYSwgMHhmZCwgMHhmNCwgMHhlMiwKKyAgMHhlZCwgMHgwYSwgMHg3NCwgMHgzYSwgMHg4YywgMHgzZCwgMHg5OSwgMHhlMiwgMHg1ZSwgMHg3MiwgMHhlMCwgMHgwMiwKKyAgMHhjNiwgMHg1MywgMHg0OSwgMHg1NiwgMHg2OSwgMHhhZiwgMHgyZiwgMHgzNCwgMHhiMywgMHg1NSwgMHg5NSwgMHg4NywKKyAgMHg1NiwgMHgxMCwgMHhlNSwgMHg1MCwgMHgyZiwgMHgyYSwgMHg0YSwgMHg3OCwgMHg3NCwgMHgzOCwgMHg1ZCwgMHhkYiwKKyAgMHg0NywgMHg1OCwgMHhhYywgMHhhZSwgMHg3OSwgMHg1NiwgMHgxYywgMHhjMiwgMHg2YywgMHg2YywgMHhhNywgMHg0YSwKKyAgMHhlNCwgMHg1MywgMHhlOCwgMHg3ZCwgMHgzNCwgMHg1NSwgMHg5YSwgMHg2MCwgMHg4MiwgMHhmZSwgMHg0YywgMHg0ZiwKKyAgMHg0NCwgMHgzOSwgMHg4YywgMHhjMCwgMHgxZCwgMHg2YiwgMHhjNiwgMHg1NywgMHhjYywgMHg2MywgMHgxNywgMHgwZCwKKyAgMHgxOSwgMHhkYSwgMHg2NywgMHhhZCwgMHgwNiwgMHg3ZSwgMHg1MywgMHhlOCwgMHg1MCwgMHg4YiwgMHhkMSwgMHhlZCwKKyAgMHhmNCwgMHg0MCwgMHgwNywgMHhhNiwgMHhkOSwgMHgzMCwgMHgxYiwgMHhlYSwgMHhkOSwgMHgyOCwgMHhkYywgMHgzYywKKyAgMHgyYSwgMHg5ZSwgMHhkNCwgMHgxNCwgMHg1MywgMHhjMiwgMHg4YiwgMHhlYywgMHgxYiwgMHhhZSwgMHhiYiwgMHg1ZiwKKyAgMHg2ZiwgMHg5NiwgMHgxMCwgMHg3ZiwgMHhmZSwgMHgwYSwgMHg5OCwgMHg2NiwgMHgxZCwgMHg4MCwgMHgwNSwgMHg0MCwKKyAgMHgyYSwgMHgyYSwgMHg0YywgMHhlYSwgMHhiMCwgMHgwNiwgMHhhOSwgMHhjOCwgMHhmYiwgMHhhYiwgMHhmZCwgMHgzNCwKKyAgMHhlNSwgMHhkMCwgMHg5MSwgMHhiMiwgMHg0YSwgMHhhYiwgMHhkOCwgMHg1YSwgMHgwOCwgMHhhNywgMHg3MiwgMHhmMSwKKyAgMHgyMCwgMHgwMiwgMHhjNSwgMHg1ZCwgMHgwNSwgMHhlMCwgMHhhZSwgMHhkOCwgMHg1YSwgMHgyMywgMHg0MSwgMHg2MSwKKyAgMHg2NCwgMHhiNiwgMHhjYSwgMHg3OCwgMHhmZiwgMHhhNiwgMHg3YSwgMHhlZCwgMHhhMCwgMHhiNiwgMHg0ZCwgMHg1YSwKKyAgMHg3NywgMHg4NSwgMHhkOSwgMHg3NywgMHhlNCwgMHhiOSwgMHhlMywgMHg2OSwgMHgwYywgMHg1YiwgMHg0NCwgMHhkNCwKKyAgMHg0ZSwgMHgwNCwgMHg5NSwgMHg1YywgMHgzMiwgMHg5ZCwgMHgwZiwgMHg3OCwgMHhlNCwgMHgxOSwgMHgwOCwgMHhlYiwKKyAgMHhhNiwgMHhiNSwgMHgyMSwgMHhmNiwgMHhkZCwgMHgxMiwgMHgxOCwgMHg0MywgMHgwNywgMHgyMSwgMHgxYSwgMHg4OCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgzZiwgMHhmZiwgMHgxZCwgMHg2ZiwgMHhhNCwgMHhiMSwgMHgxMCwgMHhhMiwgMHgzNCwKKyAgMHgxMywgMHgwYywgMHhjMiwgMHgwNiwgMHg5MiwgMHgzYSwgMHgwZSwgMHgyMiwgMHg1OSwgMHg3NCwgMHgyOCwgMHgyOCwKKyAgMHhiNCwgMHgzNiwgMHgyYSwgMHgwOCwgMHg2NCwgMHg2MCwgMHg4MiwgMHgzOSwgMHg3NSwgMHg2NSwgMHg3MywgMHhmYywKKyAgMHgyNywgMHgyYywgMHg1NiwgMHhlMSwgMHhmZSwgMHhkZCwgMHg1NSwgMHgwZSwgMHhlNiwgMHg3ZSwgMHg2YiwgMHg0NywKKyAgMHg4NCwgMHg3NiwgMHg2ZCwgMHg2MCwgMHgzOSwgMHhiNCwgMHg5OCwgMHgwNywgMHhjZSwgMHgxNywgMHgwNSwgMHhjOSwKKyAgMHgxOSwgMHhlOCwgMHhhZiwgMHhjNSwgMHg2ZSwgMHg5ZCwgMHg4MSwgMHhlYywgMHgzYywgMHhhZCwgMHg5NiwgMHg2NCwKKyAgMHg3YywgMHhlNSwgMHhjMSwgMHg5ZSwgMHg3NSwgMHg4YywgMHhkOSwgMHhjYywgMHhkNiwgMHhhOSwgMHgxZiwgMHgxOSwKKyAgMHg2OCwgMHg0YywgMHhmYiwgMHg2MywgMHhhNSwgMHhkNywgMHgzMywgMHg4ZCwgMHgxNSwgMHg3YiwgMHg5OCwgMHhkMCwKKyAgMHhhNCwgMHhhOCwgMHg3MywgMHg2NywgMHhmNiwgMHgzZiwgMHgyMiwgMHhhOSwgMHgzNSwgMHgyMywgMHgzNywgMHhmNywKKyAgMHg2YSwgMHg2ZiwgMHhiNCwgMHhlZCwgMHhkNCwgMHgyOCwgMHg3YywgMHgxOSwgMHgxZCwgMHgzMywgMHhmNiwgMHgxMSwKKyAgMHhlNiwgMHgwZCwgMHg4YSwgMHhkZCwgMHhkZCwgMHhhYiwgMHg5YywgMHgzYSwgMHhjOSwgMHhkYSwgMHg5NCwgMHg5NSwKKyAgMHg2ZCwgMHg1MywgMHhmNSwgMHhmYiwgMHg1YSwgMHg3MywgMHg5ZCwgMHg0OCwgMHgzNiwgMHg1YSwgMHgyYywgMHhmNiwKKyAgMHhmYSwgMHgwYSwgMHhlZSwgMHgzOSwgMHg5ZiwgMHgxNCwgMHg5ZCwgMHhlZiwgMHhkMywgMHg4MCwgMHg0ZiwgMHgyNCwKKyAgMHgzOSwgMHhlMywgMHgzYywgMHgyYSwgMHhkNSwgMHg3MywgMHg5NSwgMHg2MCwgMHgwOCwgMHg5OCwgMHhhYSwgMHhkZCwKKyAgMHg3OCwgMHg4YiwgMHgzZCwgMHgwNiwgMHhhZiwgMHhhZSwgMHg2NSwgMHhiNiwgMHhhNSwgMHhmNSwgMHhjZSwgMHgxMiwKKyAgMHg4YiwgMHgwNywgMHhhZCwgMHg0ZiwgMHgwOCwgMHgxMywgMHg3NCwgMHg5NywgMHg3MSwgMHgyNiwgMHhmMiwgMHg1NSwKKyAgMHg3YSwgMHhhYiwgMHhhYiwgMHg4OSwgMHg3NSwgMHgxOCwgMHgwMCwgMHg1MSwgMHhlNiwgMHg3MiwgMHg2NSwgMHg3NywKKyAgMHgxMiwgMHhiZSwgMHhiOCwgMHhkOSwgMHhkYywgMHg2NiwgMHg2MCwgMHhlMSwgMHhhNiwgMHhmMiwgMHgzYywgMHhlZCwKKyAgMHhiOSwgMHgwYywgMHg3MCwgMHgwZiwgMHg4ZiwgMHhmYiwgMHgxYywgMHg0OCwgMHg0MCwgMHgyNSwgMHgwZSwgMHgzOCwKKyAgMHhmZCwgMHhiZiwgMHhjZCwgMHg0YiwgMHg0MSwgMHg5ZCwgMHgzOCwgMHg5NiwgMHg4NywgMHhlYywgMHhmOSwgMHg2MCwKKyAgMHhlNywgMHgzNCwgMHhmNCwgMHg2ZiwgMHgyMCwgMHgzNSwgMHg2YiwgMHgxOSwgMHg5ZCwgMHg4MywgMHgwYiwgMHg4NiwKKyAgMHhmYSwgMHgyZSwgMHgyZiwgMHg2YSwgMHhjZiwgMHg0ZCwgMHgxYSwgMHg3YSwgMHhiNSwgMHhkYiwgMHhiMywgMHg4YiwKKyAgMHg1ZCwgMHhkOSwgMHhhNywgMHhmZSwgMHhhMywgMHhiMSwgMHhmOSwgMHg0ZiwgMHg1NywgMHgwNywgMHhkZiwgMHhlOCwKKyAgMHhhNSwgMHg4NiwgMHg2MSwgMHhkOCwgMHgwMCwgMHgxNSwgMHgwMiwgMHhhNSwgMHgxMiwgMHgyYywgMHhjMSwgMHgyYSwKKyAgMHhjMCwgMHhlMSwgMHg1YSwgMHhhMSwgMHhmOSwgMHgxYywgMHhiYSwgMHhjZSwgMHg5NywgMHg4NywgMHgwMCwgMHg5ZCwKKyAgMHg2NSwgMHgzYiwgMHgwZCwgMHhjYSwgMHhlMSwgMHgwNSwgMHgxMywgMHhhMCwgMHgzMywgMHgzMSwgMHg4YiwgMHg3MywKKyAgMHgzMCwgMHg1OSwgMHgxZCwgMHgzYiwgMHhhMSwgMHhlYiwgMHhmNSwgMHg1MywgMHg5ZiwgMHgzNiwgMHgzZiwgMHhhZCwKKyAgMHhhNiwgMHhhYywgMHg3NSwgMHhiNCwgMHhhYywgMHhjYiwgMHgzZSwgMHg3OSwgMHgzMCwgMHhlMCwgMHgxOCwgMHhjNCwKKyAgMHhjOSwgMHg2OCwgMHhkYiwgMHg3YywgMHhjOCwgMHgxNSwgMHgwZiwgMHgzOSwgMHg5ZSwgMHg0NiwgMHgzYiwgMHg5MSwKKyAgMHgyZiwgMHhhYywgMHhjZSwgMHhjYiwgMHhmYSwgMHg2OCwgMHhjNSwgMHhiYiwgMHg5ZiwgMHg4NiwgMHhmYywgMHhlNywKKyAgMHgyMCwgMHgzOCwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhmZiwgMHhmZiwgMHgxNywgMHg3MCwKKyAgMHhhNCwgMHhhMywgMHgxOCwgMHg4NiwgMHgxMCwgMHgwYiwgMHgzOCwgMHg2OCwgMHhkNSwgMHgzYSwgMHg0YSwgMHg1NSwKKyAgMHg1OCwgMHgwMiwgMHg5NiwgMHg2MCwgMHgyNCwgMHgxMCwgMHgxMiwgMHg4YywgMHhiMiwgMHg0YSwgMHgyOSwgMHgyYywKKyAgMHgxYiwgMHhjOCwgMHgyMSwgMHgzNywgMHg3YywgMHhiYiwgMHg0MiwgMHg4ZSwgMHgwNCwgMHgzZiwgMHhkMywgMHg3ZSwKKyAgMHg5MywgMHg5OCwgMHg2YiwgMHg0MCwgMHg2OCwgMHhmZSwgMHhmNywgMHhkNCwgMHgzYiwgMHg5ZSwgMHg4YiwgMHgyZCwKKyAgMHhkNiwgMHg3OSwgMHg3MCwgMHhiZCwgMHhjNSwgMHhlMiwgMHg3YiwgMHg2NywgMHhiZCwgMHg5YiwgMHhiNiwgMHhmYywKKyAgMHgzNSwgMHg5NywgMHg0OSwgMHg0NiwgMHgxYywgMHhkNSwgMHhjNywgMHhkMCwgMHhhZCwgMHg5OSwgMHgzOSwgMHg3MiwKKyAgMHg0MywgMHgyYSwgMHgyNCwgMHg1MSwgMHgyYiwgMHhlZCwgMHhkZCwgMHg2ZSwgMHgzNSwgMHhlMSwgMHhjNSwgMHg3ZCwKKyAgMHhiYiwgMHhhYiwgMHg1NiwgMHhhYiwgMHhiYiwgMHg1NywgMHg5MywgMHg5NywgMHg2ZCwgMHgwZSwgMHhhZiwgMHg5YiwKKyAgMHhjOSwgMHg3ZiwgMHgyZCwgMHhhOSwgMHg4ZSwgMHg4YywgMHg1YywgMHgzZSwgMHhiZSwgMHhlOSwgMHg2MiwgMHhjYiwKKyAgMHg4NSwgMHg2ZCwgMHgyMiwgMHg5OSwgMHgyYiwgMHgzYywgMHg4OSwgMHgzOSwgMHg5NCwgMHgwZCwgMHg2MiwgMHg1NCwKKyAgMHgzNCwgMHg2YSwgMHg1OCwgMHg4NiwgMHhiYiwgMHg0ZiwgMHg3ZCwgMHg4NywgMHg3YywgMHg2MywgMHg2NSwgMHg1ZiwKKyAgMHg4YywgMHg5YywgMHg5ZiwgMHg4NywgMHgzYSwgMHg2YywgMHgyOCwgMHgyZCwgMHhjZSwgMHgzZSwgMHg1MCwgMHhlNywKKyAgMHgwNCwgMHhlMSwgMHhkNCwgMHhjZCwgMHg0MCwgMHgxOCwgMHg4MCwgMHgwZCwgMHhhMSwgMHgzZSwgMHgwZSwgMHgxNywKKyAgMHhlZCwgMHg1NSwgMHgyMywgMHhlMywgMHhhNSwgMHgzOCwgMHgwZiwgMHhhZCwgMHg2OSwgMHg1NywgMHhiZSwgMHg4MywKKyAgMHg2OCwgMHg0MCwgMHg5NiwgMHhjZSwgMHhiNywgMHgwNiwgMHg2OCwgMHgzYywgMHg3MiwgMHgxZSwgMHg1MSwgMHhmMywKKyAgMHg5MSwgMHg1YSwgMHhkMSwgMHgzMCwgMHhmYSwgMHhlMCwgMHgyYiwgMHgzYSwgMHhjMCwgMHg4YiwgMHgwZCwgMHg3NiwKKyAgMHhhMSwgMHg2NywgMHg1MSwgMHg1NSwgMHg3YywgMHhiZCwgMHhlMiwgMHg3OCwgMHg5YywgMHg5MCwgMHg2NSwgMHgwYiwKKyAgMHg3YSwgMHhiNSwgMHgwMiwgMHgzMCwgMHg1ZSwgMHhkYiwgMHgzOSwgMHg5NSwgMHhlYSwgMHgzMCwgMHg3NCwgMHgyMSwKKyAgMHhkOSwgMHhkZSwgMHhiMCwgMHgwMywgMHgxMywgMHhkNywgMHgxOCwgMHhkMSwgMHgxYywgMHhiOSwgMHgwZCwgMHhhMCwKKyAgMHgwMCwgMHhhYywgMHgwOCwgMHgxMiwgMHgyNCwgMHg5MSwgMHg3ZSwgMHg4NiwgMHgzZCwgMHhlZCwgMHgyYywgMHg2MSwKKyAgMHgzYSwgMHg2MiwgMHgyMCwgMHgwZiwgMHgxMiwgMHg5YiwgMHhlNywgMHg5OCwgMHg5ZSwgMHhjMCwgMHgzNiwgMHhkNywKKyAgMHg1MywgMHg3ZiwgMHg5MywgMHg0YywgMHg1NywgMHhkZiwgMHhmNSwgMHg4YiwgMHhhYywgMHg5YiwgMHgyYSwgMHhhOCwKKyAgMHg2YSwgMHgyNiwgMHg5MiwgMHgzYywgMHgyNSwgMHhmZiwgMHhlZCwgMHgzYiwgMHg2ZiwgMHhkMywgMHhmZiwgMHhlZSwKKyAgMHgwNywgMHhmZiwgMHhkMCwgMHg5MCwgMHg4ZSwgMHhjNCwgMHgxMCwgMHhlYywgMHgwMCwgMHgyYSwgMHg1MiwgMHgwOSwKKyAgMHg0NSwgMHgzNCwgMHgwNCwgMHgxMCwgMHhlYywgMHgwMSwgMHg1NSwgMHhjZSwgMHhhOCwgMHgyMSwgMHgzNCwgMHhhMiwKKyAgMHgwMCwgMHg3NCwgMHg4MiwgMHhjMSwgMHgwYSwgMHg0OSwgMHhjOCwgMHg0NCwgMHgxNiwgMHg3YywgMHgxMiwgMHhlMiwKKyAgMHg0MiwgMHgxOCwgMHhkYywgMHg2OSwgMHg3MCwgMHgwNSwgMHg4MiwgMHhhYywgMHhlYSwgMHgzYSwgMHg5MywgMHhkOCwKKyAgMHgxZiwgMHhkMywgMHhkMiwgMHhmZSwgMHhhOSwgMHhhNywgMHg2YywgMHhkMiwgMHgzMywgMHhmMSwgMHg4YSwgMHg2MCwKKyAgMHhiMSwgMHg2MCwgMHg2OCwgMHgwOCwgMHg0ZCwgMHg1MCwgMHgzNSwgMHgwNiwgMHg3NywgMHgwZCwgMHhlMywgMHg5YywKKyAgMHhhZCwgMHgzNCwgMHg0NSwgMHhiMywgMHgzMywgMHgwNSwgMHgzNCwgMHgyNiwgMHgyYSwgMHhlYSwgMHg1OCwgMHg0YywKKyAgMHhlNSwgMHg1ZCwgMHgwYSwgMHg3NywgMHgwNSwgMHhlZSwgMHhiMywgMHgyNCwgMHhiZiwgMHg4YywgMHg2NCwgMHg3ZCwKKyAgMHgwOSwgMHgyYSwgMHg2YSwgMHhiMywgMHhjYiwgMHgzZiwgMHg1ZiwgMHhjYiwgMHhkZCwgMHgwMCwgMHhlMCwgMHgyMSwKKyAgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHhmZiwgMHgyMSwgMHg3MywgMHg4MiwgMHhhMiwgMHhjNCwKKyAgMHgyOCwgMHgyNiwgMHgxYSwgMHg4NCwgMHgxYywgMHgyYywgMHhiNywgMHgwYSwgMHg3MSwgMHg1MiwgMHhlYywgMHg1MiwKKyAgMHg0MSwgMHgxOCwgMHgxMCwgMHhjMSwgMHg1YywgMHg4YSwgMHg2NiwgMHg4NywgMHg5NCwgMHgzMSwgMHhmOCwgMHg2ZCwKKyAgMHhiYywgMHgxOCwgMHhkYywgMHg0YywgMHg5OSwgMHhjNywgMHhkYiwgMHg1ZSwgMHhmMywgMHg2ZiwgMHhlMCwgMHhhNywKKyAgMHhmMiwgMHg2OSwgMHg2NCwgMHgxOCwgMHhlZiwgMHgyYiwgMHgwYiwgMHg0MywgMHg3ZSwgMHgwOCwgMHg5YSwgMHgxOSwKKyAgMHhmOSwgMHg0ZCwgMHhkZCwgMHhjZCwgMHgxOSwgMHgyZSwgMHhlNiwgMHg4MSwgMHhlMiwgMHhmYSwgMHhhYiwgMHhiNCwKKyAgMHhmYywgMHgwYiwgMHhjOCwgMHhiYSwgMHhlMiwgMHgwZiwgMHgxMSwgMHgzYSwgMHg1YiwgMHhmYiwgMHhjZCwgMHhhOCwKKyAgMHg1MywgMHhiMywgMHg5MiwgMHhkYywgMHg1YywgMHg2OCwgMHhkNSwgMHgxNSwgMHg3ZCwgMHhjOCwgMHgxYywgMHg4OSwKKyAgMHg0ZSwgMHhkMywgMHg5MywgMHg3MywgMHgwNCwgMHg0OSwgMHgwYiwgMHg4ZSwgMHg5MCwgMHhkNCwgMHgwNywgMHhkMiwKKyAgMHhiOSwgMHg4YSwgMHhkYSwgMHg2MCwgMHgwNCwgMHgxNiwgMHgwNiwgMHhlZSwgMHgwMSwgMHg1NCwgMHhiZSwgMHhlNiwKKyAgMHg5NSwgMHhhYiwgMHg1ZCwgMHgxOCwgMHgzNCwgMHgwNCwgMHg5OSwgMHgxZCwgMHhjYywgMHhjYiwgMHgxMCwgMHg3YywKKyAgMHhkYywgMHg2ZCwgMHg4ZiwgMHg4MywgMHhjZiwgMHgwZCwgMHgzYywgMHg4YywgMHgwMCwgMHg0NiwgMHhmYSwgMHg4MSwKKyAgMHgzNSwgMHg3NSwgMHhjMywgMHhmNCwgMHhjMiwgMHhhOSwgMHgwNiwgMHg1MywgMHhkMSwgMHgxNywgMHgxMiwgMHg0NywKKyAgMHg1YiwgMHg1NiwgMHgwZCwgMHg5NCwgMHhmMywgMHg3ZSwgMHgyNSwgMHg0ZSwgMHg0ZiwgMHhmNywgMHgzMCwgMHg5ZSwKKyAgMHhmZiwgMHg5ZSwgMHgwZSwgMHhmNSwgMHg1YywgMHgzYSwgMHg4NywgMHgyMSwgMHhiYSwgMHhmNiwgMHhhYSwgMHg0YiwKKyAgMHgzYSwgMHhiOCwgMHgxZSwgMHhhZiwgMHgyNiwgMHhhMCwgMHgwMywgMHg2YiwgMHg3ZSwgMHhlOSwgMHg0NCwgMHhmYywKKyAgMHhmMCwgMHgxNiwgMHg1ZCwgMHg3OCwgMHg4MywgMHg1YiwgMHg3ZCwgMHgxYiwgMHg5ZCwgMHhmMSwgMHhiNCwgMHg3NywKKyAgMHgwMiwgMHgzZSwgMHhkMCwgMHgxYSwgMHhjNCwgMHgyYiwgMHg5YSwgMHg5MCwgMHhlOSwgMHhkZSwgMHhhNSwgMHhkMCwKKyAgMHg4OCwgMHhkNywgMHg5ZSwgMHgyYiwgMHhmMiwgMHg5NiwgMHhkOCwgMHgyYiwgMHhkNSwgMHg5YSwgMHgzMSwgMHhjMywKKyAgMHhmMCwgMHhiNSwgMHgxMSwgMHhhOCwgMHgxMywgMHg0ZSwgMHhhZCwgMHg4NywgMHg5MSwgMHhiMywgMHg2NCwgMHg2YywKKyAgMHgwYywgMHg2YSwgMHhhOCwgMHgwYiwgMHg1OSwgMHg2MCwgMHhkNCwgMHhjMiwgMHhhYywgMHg4YiwgMHgzYSwgMHgyOSwKKyAgMHg1OCwgMHgxOCwgMHhkYSwgMHgwMSwgMHgyMSwgMHgyMiwgMHg1NywgMHg1ZCwgMHhkYiwgMHg1MSwgMHhhMCwgMHg1ZSwKKyAgMHg3MywgMHhjNywgMHgxYywgMHgzOSwgMHg3NywgMHhmNiwgMHgwMCwgMHgxZiwgMHg3ZiwgMHhlMiwgMHgxMSwgMHhhMCwKKyAgMHhkOCwgMHg0NiwgMHgxZCwgMHg4MCwgMHgwNCwgMHhhMiwgMHhhMiwgMHhhMiwgMHhhZSwgMHhhNSwgMHg0YSwgMHg0OSwKKyAgMHgxNCwgMHgyZCwgMHg4MCwgMHg4NCwgMHhkNSwgMHg2NCwgMHg4ZiwgMHgxYiwgMHhjOCwgMHg0YiwgMHg4NSwgMHhkNywKKyAgMHhlMSwgMHgwNiwgMHhlYywgMHg2YywgMHg1NSwgMHhkOCwgMHg5MCwgMHgzMSwgMHgxYywgMHhlYywgMHhkNCwgMHg2ZiwKKyAgMHg4ZSwgMHhlMiwgMHhjNCwgMHg5YiwgMHhhZiwgMHg0MSwgMHhhOSwgMHhjYiwgMHgyZCwgMHg5NCwgMHhmOSwgMHhkNCwKKyAgMHhhYSwgMHgwNiwgMHhkYiwgMHg5NiwgMHg5ZSwgMHg4ZiwgMHg0NiwgMHg1NCwgMHhmMiwgMHhlYiwgMHhhZSwgMHg2MywKKyAgMHg5ZSwgMHg5ZCwgMHhkMiwgMHg3NiwgMHg2MSwgMHgxNCwgMHgxYiwgMHhlNywgMHgyMywgMHhlMywgMHhjZCwgMHhlNCwKKyAgMHg2MiwgMHhmMiwgMHhlMSwgMHhjMCwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwgMHhmZiwKKyAgMHgxZiwgMHg3MywgMHg4MywgMHgyMywgMHg1OCwgMHg2NiwgMHgxMCwgMHg0NywgMHgxZCwgMHhkNywgMHhlMCwgMHhlYSwKKyAgMHg5NiwgMHhhYiwgMHhiNSwgMHg1YiwgMHgyYywgMHg0YSwgMHhjOCwgMHg0YSwgMHhiYywgMHg5NCwgMHgzNSwgMHhmZSwKKyAgMHg0MSwgMHgxYywgMHg5OCwgMHg3OSwgMHgzYywgMHg1OSwgMHgwOSwgMHhhNCwgMHg0YSwgMHg0ZiwgMHhkYSwgMHhkOCwKKyAgMHhjYiwgMHhhZCwgMHg4NywgMHhmNiwgMHg5YiwgMHhkYiwgMHhhNywgMHhlZSwgMHgxOSwgMHgwNywgMHg5OCwgMHgzZSwKKyAgMHhhMSwgMHg4ZSwgMHhlNiwgMHgxYywgMHhlMiwgMHhlNywgMHhkNywgMHhkNywgMHgwZiwgMHhhNiwgMHg3MCwgMHhkYywKKyAgMHg0NywgMHhhOCwgMHhlZCwgMHg2MSwgMHg3YiwgMHg2YywgMHg4ZCwgMHgxMywgMHhhNywgMHhmNiwgMHgyNiwgMHgyZiwKKyAgMHhmOSwgMHhjZSwgMHhhMiwgMHhmMSwgMHhhOSwgMHgzMCwgMHgzMiwgMHhjYywgMHg0OSwgMHhhNiwgMHg4ZiwgMHg3ZCwKKyAgMHg3MiwgMHhmYiwgMHhmYSwgMHg2ZSwgMHg4ZSwgMHhiYiwgMHgwZiwgMHg1NSwgMHg1NSwgMHhmMiwgMHgwNCwgMHg2MiwKKyAgMHhhYiwgMHhhMSwgMHhlOSwgMHhlNywgMHhmMiwgMHhkNywgMHhhMSwgMHhhOCwgMHg0MCwgMHg5YywgMHgyNywgMHgyNCwKKyAgMHhlNSwgMHg1YywgMHhkOCwgMHgxMiwgMHhkNywgMHhhMCwgMHg2NywgMHg5MSwgMHhiOSwgMHhiMCwgMHg0MCwgMHhiZSwKKyAgMHg0ZiwgMHg0NCwgMHg3ZSwgMHg0OCwgMHg0OSwgMHhlZCwgMHhiYiwgMHg5YywgMHg3MywgMHg0ZCwgMHhmMSwgMHg2ZCwKKyAgMHg1YSwgMHhkMiwgMHg1NSwgMHg2NSwgMHg2ZiwgMHhlOSwgMHg1MCwgMHg0NiwgMHhlMiwgMHg3NCwgMHg1NywgMHhhYywKKyAgMHg5ZCwgMHgxZSwgMHgzMiwgMHg1NywgMHg4NywgMHgwOSwgMHg2NywgMHg4ZCwgMHgzNiwgMHhmYSwgMHg5MywgMHgyOSwKKyAgMHgzNiwgMHhjZiwgMHgyYiwgMHhlYiwgMHhkYiwgMHg5ZiwgMHhiMywgMHhiZSwgMHhlNiwgMHg3NywgMHhjMywgMHg3NCwKKyAgMHg1MCwgMHg0MCwgMHgzNSwgMHhlMiwgMHhiMiwgMHg5NCwgMHhmOCwgMHgyMiwgMHhkNCwgMHg2OSwgMHhhZSwgMHgzNywKKyAgMHhlNCwgMHgxNywgMHg0ZiwgMHg0YSwgMHg0ZSwgMHgyNSwgMHhkZCwgMHg3ZCwgMHg3MCwgMHgxMywgMHhmOCwgMHhjMSwKKyAgMHhiZiwgMHgxMCwgMHhmNywgMHgxYSwgMHgyYywgMHhjOSwgMHhhMywgMHg1ZSwgMHg4MywgMHgwMSwgMHg2NywgMHgyZiwKKyAgMHhkYiwgMHgyZCwgMHgyNywgMHhiMiwgMHg3NCwgMHg3NSwgMHhmMiwgMHg1YywgMHgwMCwgMHg5MSwgMHhmNSwgMHhjYywKKyAgMHg3MSwgMHhkMywgMHg0MSwgMHhmMywgMHhlNiwgMHhlMywgMHhiMywgMHhiMSwgMHg1MSwgMHg4NCwgMHhlMSwgMHgzNiwKKyAgMHg1NCwgMHgwYSwgMHhlOCwgMHhkZCwgMHg3MiwgMHhmNCwgMHg0ZCwgMHg2OCwgMHhkMywgMHg1MiwgMHhlYiwgMHg5NCwKKyAgMHhiMCwgMHg3NCwgMHgyMywgMHhiNCwgMHgyOCwgMHg3OCwgMHg5MSwgMHhhMiwgMHg0YywgMHg3MSwgMHhiMywgMHgwOSwKKyAgMHg5NiwgMHg4OSwgMHhmNywgMHhhMCwgMHgxOCwgMHhjYSwgMHgxMiwgMHgzNSwgMHhmNiwgMHg1MCwgMHg5NiwgMHg2MCwKKyAgMHg3MywgMHg1MCwgMHhiNywgMHhkYywgMHhmNCwgMHhiYywgMHhmMiwgMHhkNywgMHgzMywgMHhmZCwgMHhhOCwgMHhlNSwKKyAgMHg0ZiwgMHhmZiwgMHgyNywgMHgwNywgMHg0MiwgMHhmMiwgMHhlMCwgMHhmOSwgMHhmYywgMHgxNCwgMHgyMSwgMHgxOCwKKyAgMHgyYSwgMHgxZCwgMHg4MCwgMHg1NCwgMHgwYSwgMHg5NSwgMHgwMCwgMHhiYywgMHg4MCwgMHgwNCwgMHg0MCwgMHgxMSwKKyAgMHhmMSwgMHgwMCwgMHgxNSwgMHgzMiwgMHg0NSwgMHg2MiwgMHg3MCwgMHhiNSwgMHgwOCwgMHhlYywgMHg5NCwgMHhhYiwKKyAgMHhmYiwgMHg0MiwgMHg5ZCwgMHhlNywgMHgxNCwgMHhlZSwgMHhjMSwgMHgzNCwgMHhmMiwgMHg1ZiwgMHhjMiwgMHg5YSwKKyAgMHhiYywgMHgyZCwgMHhkZSwgMHgzOCwgMHhjNywgMHhhYywgMHg3MiwgMHg5NywgMHhhZSwgMHg2NywgMHg4NSwgMHhiNSwKKyAgMHhlOSwgMHgxNSwgMHhhMSwgMHgwZiwgMHhiYSwgMHhjNywgMHhhMiwgMHg3MSwgMHhmZSwgMHhhNSwgMHhhYiwgMHhmOSwKKyAgMHhmOCwgMHgxNSwgMHgyOSwgMHhiYSwgMHgwZiwgMHgxZCwgMHgxZSwgMHg0NSwgMHg3YiwgMHgzZiwgMHg4NSwgMHgxMiwKKyAgMHhlMywgMHg0YSwgMHg0YiwgMHgxMCwgMHhhYiwgMHg5NCwgMHhkOCwgMHhjNiwgMHgyZCwgMHhlZiwgMHhlMywgMHhhYywKKyAgMHg3ZCwgMHhmZCwgMHg2ZSwgMHgwMCwgMHgxYywgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMywgMHhmZiwKKyAgMHhmZiwgMHgyMSwgMHg3MywgMHhhMywgMHgyMywgMHg5OCwgMHg0NiwgMHgxMCwgMHgzNCwgMHhkMywgMHg4NiwgMHg2YiwKKyAgMHg0ZCwgMHgxYSwgMHg1MiwgMHhlNiwgMHg1NCwgMHgwOCwgMHhhNCwgMHgwYywgMHgxMywgMHhlOSwgMHg0OCwgMHgyNCwKKyAgMHhmNSwgMHhhNCwgMHg3ZiwgMHhkMiwgMHhlMywgMHhkMiwgMHhmYywgMHg4NiwgMHhiNiwgMHhiMywgMHg5OSwgMHhmYSwKKyAgMHhlYywgMHg2ZCwgMHgyNSwgMHhiYywgMHgyZSwgMHg1YywgMHg3MSwgMHhmNiwgMHgyZCwgMHgxZiwgMHgxNiwgMHg0YiwKKyAgMHg0NSwgMHg5ZCwgMHhjZiwgMHhhZSwgMHhhNiwgMHg3MywgMHg3OSwgMHhjNiwgMHhiNiwgMHhjOCwgMHhmMCwgMHgwYiwKKyAgMHgyYiwgMHhiMCwgMHgzOSwgMHg1ZCwgMHhiMywgMHg0YiwgMHhiOSwgMHg1NSwgMHgxYywgMHg5OCwgMHhjYywgMHhjMSwKKyAgMHhlYSwgMHgxMiwgMHhhMywgMHhiNSwgMHgyMiwgMHhkZSwgMHhlNiwgMHhkMCwgMHhlZSwgMHgyNiwgMHhjNCwgMHhlMywKKyAgMHg5YywgMHg5YSwgMHg1YywgMHhkYSwgMHhmMiwgMHg2YywgMHg1NiwgMHhjNywgMHgzMSwgMHgxYiwgMHgwYiwgMHgyZSwKKyAgMHg3OCwgMHg2MSwgMHg1MCwgMHg5NiwgMHgzNSwgMHhmMywgMHhmNiwgMHg3MywgMHg3NiwgMHhmMCwgMHg2NiwgMHgwNCwKKyAgMHhjZSwgMHhmMiwgMHg1MSwgMHg0ZCwgMHg4YywgMHg1MCwgMHg2YSwgMHhhYSwgMHhhZSwgMHgxNCwgMHhjOCwgMHhjZiwKKyAgMHg1NCwgMHgzMSwgMHg3YiwgMHgwNiwgMHgzZCwgMHg2ZCwgMHg2MSwgMHhlYywgMHg3ZiwgMHgyYSwgMHg3ZCwgMHg2NywKKyAgMHgwZCwgMHg5NSwgMHg0ZSwgMHgxOSwgMHg4NCwgMHg1MCwgMHhiOCwgMHhkMiwgMHhiNSwgMHg4ZiwgMHhmMCwgMHhiMiwKKyAgMHhkOSwgMHg0YywgMHgyNCwgMHgyOCwgMHg3YywgMHhkMCwgMHgxMCwgMHhjMywgMHgwYSwgMHgwMCwgMHhmMCwgMHg4NSwKKyAgMHgwYSwgMHg0OSwgMHg1MiwgMHhhYywgMHhmNywgMHgzYSwgMHgyMywgMHhlNywgMHgyMSwgMHgxOCwgMHgyYiwgMHg5NSwKKyAgMHg5MiwgMHhiZCwgMHgwOCwgMHhhOSwgMHhkNiwgMHg0OSwgMHg3ZCwgMHg0MywgMHhmMywgMHgzZiwgMHg0YSwgMHgyNCwKKyAgMHgwMCwgMHgxNiwgMHg1NywgMHg4ZSwgMHhjZiwgMHhjOCwgMHgxNCwgMHg0NSwgMHgxNSwgMHhiYSwgMHgxNywgMHg1ZiwKKyAgMHg3OCwgMHhkMSwgMHgxYiwgMHg2MywgMHg0NiwgMHhlNSwgMHhkMywgMHhjOSwgMHg2YSwgMHg2MCwgMHg5ZCwgMHhhMywKKyAgMHhjMiwgMHg4NywgMHhlYiwgMHgyZCwgMHhhOSwgMHhjNywgMHg5ZCwgMHg4MywgMHg4NiwgMHg4NiwgMHhiNSwgMHhiZSwKKyAgMHg0YywgMHgwOCwgMHhkNywgMHg3NSwgMHhmNCwgMHgzYywgMHgxZSwgMHgzNSwgMHhmZSwgMHhkYywgMHg0NywgMHg0NCwKKyAgMHg0NCwgMHg0YywgMHgwZSwgMHg3MiwgMHg5ZCwgMHhjNiwgMHhlMSwgMHg4YSwgMHg1YiwgMHg4ZiwgMHhkZSwgMHgyOCwKKyAgMHg2OSwgMHgzZiwgMHg5MCwgMHg3NCwgMHg3ZiwgMHg4MywgMHhkMiwgMHgyOCwgMHgxMiwgMHg1MiwgMHgyMSwgMHg5NSwKKyAgMHhlYywgMHg3NSwgMHhjZCwgMHhkZiwgMHg1YywgMHhmYywgMHgzMCwgMHhiMSwgMHgyYiwgMHhkYiwgMHg0NSwgMHhjNCwKKyAgMHgyNSwgMHg2MiwgMHg3MSwgMHgxZSwgMHg4NSwgMHhkMiwgMHhiZiwgMHg2MywgMHg5NiwgMHgwZiwgMHhiZiwgMHg5MSwKKyAgMHg1YSwgMHgwOSwgMHg4NiwgMHg2MSwgMHhkOCwgMHgwMCwgMHgxNCwgMHgyZCwgMHg1MiwgMHg4MCwgMHg0MCwgMHg1NSwKKyAgMHhhNiwgMHhjMywgMHhmNywgMHg1OCwgMHgwYiwgMHg2ZCwgMHgyOSwgMHg3YSwgMHg5YSwgMHhjMSwgMHhiOSwgMHg1NCwKKyAgMHg1MCwgMHgwMCwgMHgxMywgMHgwYiwgMHg2ZiwgMHhiYSwgMHgxMCwgMHhiNywgMHgyZSwgMHg5NCwgMHg1YSwgMHg3MCwKKyAgMHhiYywgMHhmYywgMHhjMywgMHhmNSwgMHg5YSwgMHgzNCwgMHg4OSwgMHgwZCwgMHhjZiwgMHg0YywgMHg3NywgMHgxNiwKKyAgMHhhZiwgMHg3MiwgMHg5OSwgMHg4OCwgMHg1ZiwgMHgzNywgMHg4YiwgMHg5YSwgMHg1NCwgMHgwYiwgMHhhOCwgMHg5OCwKKyAgMHhlMCwgMHhhMCwgMHg1YywgMHg5NSwgMHhkNCwgMHhjZCwgMHgxMiwgMHhhMiwgMHgzNywgMHgwOSwgMHgyYiwgMHg0MSwKKyAgMHg3NiwgMHhhZCwgMHgyYywgMHhhZSwgMHgxYywgMHg4YiwgMHgyOCwgMHhjYSwgMHgyYywgMHhkZCwgMHg2NywgMHgwOSwKKyAgMHgyYSwgMHhiYiwgMHgwNCwgMHhlMCwgMHhiZCwgMHhmOCwgMHg3NSwgMHhkOSwgMHhjNSwgMHhiOSwgMHhkMCwgMHhmNCwKKyAgMHg2MSwgMHhjMCwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHhmZiwgMHgxOSwgMHg2ZiwKKyAgMHhhNCwgMHhiMCwgMHhkMSwgMHgwMiwgMHgxNCwgMHgyMywgMHgwNCwgMHhjMiwgMHgwMiwgMHg1MywgMHhjYywgMHgwZCwKKyAgMHgyNiwgMHhhMCwgMHg4MCwgMHgwYywgMHg0MiwgMHg0ZCwgMHg4ZCwgMHg3OCwgMHg0OSwgMHg2YiwgMHg5NCwgMHgxMiwKKyAgMHg0MiwgMHhkOSwgMHgyNSwgMHgzOSwgMHg3NCwgMHgxYSwgMHg0OSwgMHgzYywgMHgwNCwgMHg2MywgMHg4NCwgMHg5OCwKKyAgMHhkZCwgMHhjNSwgMHhmOSwgMHg4ZSwgMHhjNSwgMHgyNiwgMHg4NCwgMHhhMCwgMHg4NywgMHhmYSwgMHgxZCwgMHgyNywKKyAgMHhhNCwgMHhhZSwgMHgzZiwgMHhkNCwgMHgxZiwgMHhjOCwgMHhmOSwgMHhmYiwgMHhlZiwgMHgzMCwgMHg1ZSwgMHgwZiwKKyAgMHg1NSwgMHg3MywgMHg0ZiwgMHgzMCwgMHg2NiwgMHg0OSwgMHgyNywgMHg3NCwgMHg0MywgMHg5OSwgMHg3ZSwgMHg2ZCwKKyAgMHgzNCwgMHhkMywgMHg0ZiwgMHg1MCwgMHg4NiwgMHhhNCwgMHgzMywgMHgyZSwgMHgwMiwgMHhjNSwgMHhhNCwgMHg5OCwKKyAgMHhmYSwgMHhiYiwgMHg1ZCwgMHg4ZSwgMHg0ZSwgMHhjNCwgMHhjOSwgMHgzZiwgMHg1YSwgMHhiOSwgMHg0NywgMHgxNywKKyAgMHhlNywgMHg3NSwgMHg1NiwgMHhhNiwgMHhjMCwgMHg2NCwgMHhhZSwgMHgzZCwgMHg3MiwgMHg4OSwgMHgxOCwgMHgwYiwKKyAgMHgzMiwgMHhhMiwgMHgwMSwgMHgzNiwgMHg2NSwgMHhlZSwgMHhlMywgMHgzNCwgMHgxNywgMHg0OSwgMHhhYSwgMHhiNywKKyAgMHhmNywgMHhjMCwgMHg1ZiwgMHhhMSwgMHg4NCwgMHg4ZiwgMHgzNywgMHgxZCwgMHg3NywgMHg1OSwgMHg0OCwgMHhjNiwKKyAgMHg5NiwgMHhhMywgMHgwOCwgMHg5YywgMHhkZiwgMHhkMywgMHhhZiwgMHg4NSwgMHg1NywgMHgxNCwgMHhiMCwgMHg5NCwKKyAgMHgyZSwgMHg4MiwgMHhjZSwgMHgwYywgMHg2YSwgMHhhMiwgMHgyMiwgMHhkNCwgMHg0NywgMHgyNywgMHgzYSwgMHg1YiwKKyAgMHgxYSwgMHhlNSwgMHg5NywgMHg2NiwgMHhhMSwgMHg1YiwgMHgwNiwgMHgwMCwgMHgyOCwgMHhmZCwgMHhiYiwgMHg4ZSwKKyAgMHg1YywgMHg4MCwgMHgzMCwgMHg1YSwgMHg3YiwgMHhiZCwgMHhmZCwgMHg0NywgMHgyZCwgMHgwOSwgMHg4YSwgMHhiZiwKKyAgMHg1ZCwgMHhkMSwgMHg3MCwgMHhkNywgMHg2ZCwgMHg1MywgMHg3MywgMHgyYywgMHgxNSwgMHhjYywgMHhiOSwgMHg1YSwKKyAgMHg3MywgMHhjMSwgMHhmNywgMHhiZSwgMHgyYywgMHgxNiwgMHg1ZiwgMHg0NywgMHhkYywgMHhiZiwgMHhjMiwgMHhkZiwKKyAgMHhhMSwgMHg3OSwgMHg1OSwgMHhkMywgMHgzYiwgMHgwOSwgMHgwNiwgMHgyMCwgMHg0MywgMHg4ZSwgMHgxOSwgMHhiZCwKKyAgMHhhMCwgMHg5NywgMHhhMSwgMHgyMywgMHgyOSwgMHg1MCwgMHhkNywgMHhhZCwgMHg5NiwgMHgzMSwgMHg2NCwgMHhjZCwKKyAgMHgzZiwgMHg2NywgMHhlOSwgMHgxMiwgMHgwOCwgMHg2MCwgMHg1OCwgMHgwMywgMHg0YywgMHg2YiwgMHg3MCwgMHhjMSwKKyAgMHhkZSwgMHhiZSwgMHgzNywgMHhhNCwgMHgzMiwgMHg1ZSwgMHhjYywgMHg0ZCwgMHg5YiwgMHg1NywgMHhkNSwgMHgxMywKKyAgMHhlYSwgMHgzNywgMHhiOCwgMHg3NSwgMHgxNywgMHg1NCwgMHhiNiwgMHhmOCwgMHg3NSwgMHgzZiwgMHhmZiwgMHg1NywKKyAgMHg5ZSwgMHg3YiwgMHgyMCwgMHg3ZSwgMHhmZiwgMHg4OCwgMHg0NCwgMHg0MywgMHg0MCwgMHhiMCwgMHg4NCwgMHgzYiwKKyAgMHgwMCwgMHgwMCwgMHg5NCwgMHg1MiwgMHgwMiwgMHg1NCwgMHhhNCwgMHgwOCwgMHhjMCwgMHgwMCwgMHhiMiwgMHhiNCwKKyAgMHg1MCwgMHg4MywgMHhhNywgMHhiOCwgMHhjNiwgMHg4OCwgMHgzMywgMHg0NiwgMHhlYywgMHg0OCwgMHgyZCwgMHgyZiwKKyAgMHhmMiwgMHhjMSwgMHgwZiwgMHhkNSwgMHhjMywgMHgzZCwgMHgxOSwgMHhhOSwgMHg3NywgMHgzNCwgMHgwZCwgMHhjNiwKKyAgMHgyNiwgMHg4NCwgMHgyNCwgMHgzNywgMHhjOCwgMHgwYSwgMHhjMiwgMHg5MywgMHg5ZCwgMHhhMywgMHgyZCwgMHg2YSwKKyAgMHgxMSwgMHgzNSwgMHg4MywgMHgxMiwgMHg0NSwgMHhhYSwgMHg5NCwgMHg2MywgMHg5NywgMHhkMywgMHgzNywgMHg1YywKKyAgMHgyMSwgMHhjMCwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzZiwgMHgzMSwgMHg3MiwKKyAgMHg4NCwgMHgyMywgMHgxOCwgMHg2YSwgMHgxNiwgMHhhMiwgMHhlYSwgMHhmYSwgMHgzZCwgMHg5MSwgMHg4ZSwgMHg5NSwKKyAgMHg3MiwgMHg1NCwgMHhkNSwgMHgwNSwgMHgyMCwgMHgwOCwgMHgxOCwgMHg5ZiwgMHgzZSwgMHhlOCwgMHhhZCwgMHgxNywKKyAgMHhlZiwgMHg2ZCwgMHhlMCwgMHg3YywgMHhjNCwgMHgzNywgMHgyNSwgMHg3MywgMHhjZCwgMHhjZCwgMHg5YiwgMHgyMywKKyAgMHgyYiwgMHhkZSwgMHg3NiwgMHgyNSwgMHhjZCwgMHgyZCwgMHgxYSwgMHg2MiwgMHhlZSwgMHgzYywgMHgyYiwgMHgxZCwKKyAgMHhlNSwgMHhiZSwgMHgzNSwgMHhkMiwgMHgzNywgMHg0MSwgMHgyZCwgMHgzMCwgMHhlZSwgMHgxZSwgMHhiNiwgMHhiZCwKKyAgMHg1ZiwgMHg5NCwgMHg5ZCwgMHhmMywgMHhiMSwgMHgzOCwgMHg2NSwgMHhmZSwgMHg3MywgMHhjYiwgMHgxZSwgMHhjYiwKKyAgMHg3YSwgMHhhNiwgMHg1YiwgMHg3MiwgMHhjOSwgMHg2NSwgMHg2NCwgMHg3YywgMHhmMSwgMHhhNCwgMHhmMywgMHhlNiwKKyAgMHgxNSwgMHg3MSwgMHgyOCwgMHhkMiwgMHhkMSwgMHhlYiwgMHhjNywgMHgwNywgMHhkYywgMHhhYywgMHg1ZCwgMHhjYSwKKyAgMHg3NCwgMHg2ZCwgMHhhMSwgMHg3OCwgMHgzYiwgMHg5OSwgMHhkMywgMHg3MCwgMHg1NywgMHg4ZiwgMHg4YywgMHgyNCwKKyAgMHg2YiwgMHhjNCwgMHhjMywgMHg0NywgMHhiMSwgMHhlMiwgMHhhZiwgMHg4ZCwgMHgxNiwgMHhiNiwgMHg1ZSwgMHg0NiwKKyAgMHhlZSwgMHg1ZSwgMHg3ZiwgMHg5NSwgMHgzMCwgMHg3NCwgMHgyYywgMHgzNiwgMHg0YywgMHgxYSwgMHhlMSwgMHgzNywKKyAgMHhkYSwgMHgwNCwgMHhiYywgMHgyZCwgMHg0MCwgMHhmYSwgMHhjZiwgMHg0MiwgMHg2OCwgMHg1NiwgMHhiNCwgMHg1YywKKyAgMHg4MiwgMHg5NiwgMHg2MCwgMHg0ZiwgMHhlZiwgMHg3ZCwgMHg4MywgMHgyOCwgMHhjYiwgMHhiMiwgMHgwMCwgMHgyYywKKyAgMHgwYiwgMHhmMywgMHhlMywgMHhjOCwgMHhiOCwgMHg1YywgMHgzNSwgMHhiZCwgMHg3NSwgMHg2ZiwgMHg2YywgMHgwOSwKKyAgMHgyMywgMHg0NSwgMHhlYSwgMHhhOCwgMHgwNSwgMHg0ZSwgMHg0MiwgMHgwYywgMHg5OSwgMHgwMCwgMHg1ZiwgMHgyMSwKKyAgMHgwOCwgMHhhZiwgMHg4YiwgMHg5NywgMHgzMSwgMHg4NCwgMHgxYiwgMHhhZiwgMHhlYywgMHgzNiwgMHg3MiwgMHgxYiwKKyAgMHhlZiwgMHhmNywgMHg4NCwgMHg0YiwgMHg0MSwgMHg5MywgMHg4OCwgMHg2MiwgMHg4YiwgMHhjMSwgMHhlZiwgMHhiMSwKKyAgMHg5NiwgMHhkZiwgMHhjNSwgMHg3NywgMHgzOCwgMHg2YSwgMHgwYSwgMHgzYSwgMHg3NSwgMHhiYiwgMHhiOCwgMHgxZiwKKyAgMHg4NCwgMHhiMCwgMHg2MSwgMHg5ZCwgMHg2MywgMHhiNiwgMHg0MywgMHg3ZiwgMHg5ZSwgMHg4YiwgMHhmNSwgMHhkZSwKKyAgMHgxMiwgMHhiMiwgMHg0NCwgMHhhOCwgMHg4NywgMHg3NSwgMHgyNSwgMHg3MywgMHg4ZCwgMHhhZSwgMHg3NSwgMHg0YiwKKyAgMHg3MCwgMHg5NSwgMHhjYiwgMHgxYSwgMHg1NiwgMHhjNSwgMHg2NiwgMHgwYSwgMHhiNCwgMHhkMCwgMHhiYSwgMHg1OSwKKyAgMHhlOCwgMHg5ZCwgMHhhYywgMHg4ZSwgMHgzOSwgMHg1OSwgMHg5YywgMHhmZCwgMHg3NiwgMHg4YSwgMHhkNSwgMHgzNiwKKyAgMHgzYiwgMHg1NywgMHgzYywgMHg3YSwgMHgzNywgMHhjNywgMHhiZiwgMHhmZCwgMHgwMCwgMHgwZiwgMHg5ZiwgMHhmMywKKyAgMHgyMCwgMHg1OCwgMHg2YSwgMHgxZCwgMHg4MCwgMHgwYSwgMHg0MCwgMHgwMiwgMHg2NSwgMHhkMCwgMHg4YSwgMHg5NSwKKyAgMHgwYSwgMHgwYSwgMHgyZiwgMHg4NSwgMHhiZCwgMHg0OCwgMHg1OCwgMHgxNSwgMHgwYSwgMHhjYywgMHhjOCwgMHgyOCwKKyAgMHg4OSwgMHhhNywgMHgwZSwgMHgzMCwgMHhkOCwgMHhkMywgMHg1YSwgMHg1ZCwgMHg3NywgMHg2ZCwgMHgzNSwgMHhkMSwKKyAgMHg0OSwgMHgyZCwgMHg3NiwgMHgzNSwgMHg1NSwgMHhiNCwgMHgwNiwgMHhhYSwgMHg0NiwgMHgwNCwgMHg5OCwgMHg5NiwKKyAgMHgyYiwgMHg0OSwgMHg5NywgMHhlNSwgMHhhNCwgMHg0NywgMHhkZCwgMHhmMiwgMHhlMCwgMHgwMSwgMHhjMCwgMHgyMSwKKyAgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgxZCwgMHg3MSwgMHhhNCwgMHgzMCwgMHg1MCwKKyAgMHg4YywgMHgxNCwgMHgzMywgMHgxMSwgMHgwMiwgMHgwNSwgMHhlYiwgMHg2ZSwgMHg5YSwgMHhiMSwgMHgxZCwgMHgxNSwKKyAgMHhhMywgMHgyNiwgMHg1OCwgMHgyYSwgMHhjYSwgMHhiZSwgMHg0NSwgMHg2MiwgMHg2MiwgMHgxMCwgMHgyNSwgMHg5MywKKyAgMHgzOCwgMHhiYiwgMHg4YSwgMHg1NywgMHg2ZiwgMHg5ZSwgMHgxMywgMHg5NywgMHgzNywgMHhmMSwgMHg1ZCwgMHg4NSwKKyAgMHg5MCwgMHg5OSwgMHhhYSwgMHgzMCwgMHgyMiwgMHg3MCwgMHg4MywgMHhhZiwgMHg5NiwgMHhiNCwgMHhjNiwgMHhhMywKKyAgMHhjNiwgMHg1NCwgMHg4NCwgMHg5YiwgMHhhYSwgMHg4ZCwgMHg0MywgMHhkZSwgMHhkYywgMHgzYSwgMHg0YSwgMHhlNCwKKyAgMHhiZSwgMHhiZCwgMHg5YywgMHg3YSwgMHhjYiwgMHhkOCwgMHgzYywgMHhlMiwgMHhmMCwgMHg5YiwgMHgyMSwgMHhmYiwKKyAgMHg0MiwgMHg0NiwgMHg5MywgMHgwZCwgMHg0NCwgMHhiYiwgMHg4MywgMHg1NywgMHgwMiwgMHhjNiwgMHhlZSwgMHhiOSwKKyAgMHhlNSwgMHhjNSwgMHg4YSwgMHhkMiwgMHg3YywgMHgzMSwgMHg4YiwgMHgwOCwgMHgzOCwgMHhiNywgMHhmOSwgMHg4ZCwKKyAgMHg0OSwgMHgzNywgMHg0ZiwgMHhhZSwgMHhhYiwgMHg5NCwgMHg2MiwgMHhhOCwgMHhhMCwgMHgzMiwgMHhlYywgMHgxMCwKKyAgMHg2ZiwgMHhmOSwgMHgyYSwgMHhjMywgMHg0NywgMHhjMSwgMHg3MiwgMHhlZSwgMHgzOSwgMHhhMCwgMHgzZCwgMHg1NCwKKyAgMHhmMiwgMHg1NywgMHgwMCwgMHgyNCwgMHgzMCwgMHg3OSwgMHgyOSwgMHg1NywgMHgzNiwgMHgyNSwgMHhkNSwgMHgzYywKKyAgMHhjMSwgMHg0MiwgMHhjZCwgMHg1YSwgMHgwNCwgMHg5ZCwgMHg2NiwgMHhjZCwgMHg2MiwgMHhkYSwgMHgxZCwgMHgxOSwKKyAgMHg5MiwgMHg2OSwgMHg1ZCwgMHg0MCwgMHhiNiwgMHg0MCwgMHg5MCwgMHg2ZCwgMHg3NywgMHg5YiwgMHg0ZSwgMHhhYiwKKyAgMHgyYywgMHg2NiwgMHgzOCwgMHhmZiwgMHgwNSwgMHg0NiwgMHhhZCwgMHhiZSwgMHgxYSwgMHg0MywgMHg2YywgMHhkNywKKyAgMHhmNiwgMHg4ZiwgMHhlYiwgMHg4ZiwgMHhjNywgMHg0NywgMHg3NCwgMHgzMSwgMHgwMSwgMHhkMSwgMHhkYSwgMHg3NiwKKyAgMHhiNCwgMHg3ZCwgMHgwNiwgMHg2OSwgMHhiOSwgMHhlMywgMHg5YiwgMHhhOCwgMHhiOCwgMHg5NCwgMHgzOSwgMHg0MCwKKyAgMHgzZiwgMHg2NSwgMHg0OSwgMHg4ZCwgMHg4ZCwgMHgzMSwgMHhkNiwgMHhkMywgMHgzNiwgMHhjOCwgMHg1ZiwgMHhjOSwKKyAgMHhiNiwgMHhjYSwgMHg4MiwgMHgzOSwgMHg0ZiwgMHg1OSwgMHg5ZCwgMHg1MiwgMHhiOSwgMHg4ZiwgMHhjYSwgMHhmNywKKyAgMHg0NSwgMHhkZSwgMHg2ZiwgMHgwMSwgMHg1MCwgMHhkNSwgMHgxNSwgMHg0MSwgMHgzMywgMHhhZSwgMHg2ZSwgMHgxOCwKKyAgMHgwMSwgMHg0YSwgMHg0OCwgMHgxNywgMHg2ZiwgMHg4OCwgMHgxYSwgMHhiZSwgMHhiZiwgMHg3OCwgMHhkYiwgMHhmYywKKyAgMHgxNiwgMHgxYywgMHhmOCwgMHgzYiwgMHgzOCwgMHg2NywgMHg3YywgMHg0NywgMHg5NiwgMHg4OSwgMHg2ZSwgMHg4NSwKKyAgMHgwOSwgMHgyZCwgMHgxNSwgMHg5MiwgMHg2NiwgMHhjMiwgMHhlOCwgMHg3YiwgMHg2MiwgMHgxZCwgMHhjZSwgMHg2MSwKKyAgMHg2MSwgMHgzOSwgMHg4MCwgMHhhZiwgMHhhNCwgMHhhNywgMHgyOSwgMHgwYiwgMHg1NiwgMHgyZiwgMHgxNywgMHg2OCwKKyAgMHhjNywgMHhjNywgMHhmYSwgMHhmMywgMHhkZCwgMHhkYiwgMHg2ZiwgMHg3ZSwgMHhmOSwgMHhmMSwgMHgxZiwgMHhhZCwKKyAgMHg3ZCwgMHhkMSwgMHhkZCwgMHhkZCwgMHhmMywgMHhmNiwgMHgyOSwgMHg0MSwgMHgzMCwgMHhkNCwgMHgzYiwgMHgwMCwKKyAgMHgwYSwgMHg4NCwgMHhjOCwgMHhhOSwgMHg1MSwgMHg2MCwgMHgwOCwgMHg0YSwgMHgwYSwgMHg3ZCwgMHhhMywgMHg4NSwKKyAgMHgzMiwgMHg3MywgMHhmYiwgMHhkMiwgMHgxNSwgMHhiNSwgMHg5ZCwgMHg2MiwgMHgyNSwgMHg1YywgMHgxMywgMHhjOCwKKyAgMHhmZCwgMHhkYSwgMHhiOCwgMHgxMCwgMHg4ZSwgMHg0YywgMHhkOCwgMHhlOCwgMHhhZCwgMHhhMSwgMHgzYSwgMHhiYywKKyAgMHgzNywgMHg2ZSwgMHhjOSwgMHhjMiwgMHgwOCwgMHgxNSwgMHgyNiwgMHhjNywgMHg3OCwgMHg0ZSwgMHhkZSwgMHg5MywKKyAgMHhkNSwgMHhhNCwgMHg4NCwgMHg4MCwgMHhkMCwgMHhiYSwgMHgwYywgMHhkZiwgMHhhOSwgMHhkZSwgMHhiMCwgMHgxNSwKKyAgMHhiMiwgMHhmZCwgMHhjNiwgMHgzNCwgMHhkMSwgMHg0MywgMHhjNCwgMHg5NSwgMHg4OSwgMHhkMiwgMHg0MiwgMHhiNCwKKyAgMHhhYiwgMHgyMSwgMHg1NSwgMHg3NCwgMHhmNSwgMHhlMiwgMHhjZSwgMHg3MywgMHg2YiwgMHg4YywgMHhhNiwgMHgwMCwKKyAgMHgwMSwgMHg5OCwgMHhkMiwgMHhjMSwgMHg3OSwgMHhlNiwgMHhhMSwgMHg0ZCwgMHhmZSwgMHhmZiwgMHg2NywgMHg0NiwKKyAgMHgzOSwgMHg3MCwgMHhlZCwgMHg4MCwgMHgwZSwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwKKyAgMHhmZiwgMHgxZCwgMHg2YywgMHhhNiwgMHgzMCwgMHhkMCwgMHhlNCwgMHgzNCwgMHgwYiwgMHgwYywgMHhjMiwgMHgwMSwKKyAgMHhhNSwgMHhkYiwgMHg4ZiwgMHg1NywgMHhhZSwgMHgxYSwgMHg0NSwgMHhlZSwgMHhmMiwgMHgxMiwgMHg5MiwgMHg4OSwKKyAgMHgyYSwgMHg2YywgMHg1YSwgMHg0NiwgMHgyNCwgMHhkMSwgMHg5MSwgMHg0YSwgMHhlYywgMHg0MiwgMHg2NSwgMHg2NSwKKyAgMHg1MCwgMHhhOCwgMHg5OSwgMHg0MiwgMHg0ZCwgMHg1MCwgMHg3OCwgMHgxYiwgMHhmNywgMHhiNSwgMHgzZSwgMHhhMywKKyAgMHhjNSwgMHg3YSwgMHhjMiwgMHhhMywgMHgxNywgMHg0NCwgMHg2NCwgMHgwMCwgMHhiOSwgMHg3ZiwgMHgzZiwgMHgzZCwKKyAgMHg0NywgMHg3ZCwgMHg5MywgMHg1OCwgMHgwZSwgMHg5NywgMHhlYSwgMHgyOCwgMHhkZiwgMHgxMywgMHhmZiwgMHhiNSwKKyAgMHg5ZiwgMHhkNCwgMHhmZSwgMHg3ZSwgMHg4YiwgMHhjZiwgMHg3NSwgMHhhYywgMHhmNSwgMHhhYywgMHg5NywgMHhiMCwKKyAgMHg1NCwgMHgwOSwgMHg5YiwgMHg5MSwgMHhiNywgMHhjZiwgMHg3NCwgMHhkYSwgMHhmZSwgMHgyMywgMHgzNywgMHhkOCwKKyAgMHg3YywgMHg2ZCwgMHg5ZSwgMHgxZSwgMHgwNSwgMHhlNiwgMHgyZiwgMHgzOCwgMHhkOSwgMHg1OSwgMHg0MCwgMHgyNiwKKyAgMHgyNiwgMHhiOSwgMHgwMywgMHg4MSwgMHhhNywgMHhkMSwgMHhjNSwgMHgyNSwgMHg1ZiwgMHg0ZSwgMHgyYSwgMHhkMCwKKyAgMHgxZCwgMHhkOCwgMHgzYywgMHg3OCwgMHg1YiwgMHg3MCwgMHhmOCwgMHhmOSwgMHhlOSwgMHhlOCwgMHgyYywgMHhhZSwKKyAgMHhlNSwgMHg2ZSwgMHg0OSwgMHgxMywgMHhlZCwgMHhmZCwgMHg1MiwgMHg5YSwgMHg0MSwgMHhlMCwgMHhkMCwgMHhiNSwKKyAgMHhiNiwgMHhmMiwgMHgyNSwgMHg4MiwgMHgxYywgMHg4MiwgMHg4MywgMHgyNSwgMHg5OCwgMHgyYSwgMHhlNywgMHg4ZCwKKyAgMHgwOCwgMHhkMCwgMHgyNCwgMHg4YywgMHgwNCwgMHhhNSwgMHg3NCwgMHg0YSwgMHg4NCwgMHg2YiwgMHg4MiwgMHgyNywKKyAgMHg4NCwgMHhlYiwgMHg0NSwgMHhiMywgMHg3OSwgMHg1YywgMHg3ZSwgMHg1OCwgMHg1YywgMHg1ZSwgMHgyZiwgMHgxYywKKyAgMHg0NSwgMHg4MCwgMHgzNSwgMHg3ZSwgMHgwNCwgMHgzMSwgMHhlZiwgMHg2NywgMHg4MiwgMHgzMCwgMHhmYywgMHhhNSwKKyAgMHhiYywgMHhlZSwgMHgyZiwgMHg0NywgMHg2MywgMHg0MywgMHg2ZCwgMHgzNiwgMHg0ZSwgMHg1OSwgMHhjMCwgMHgyMSwKKyAgMHhlMSwgMHhiYSwgMHg4NCwgMHg3NSwgMHg2YywgMHhhOCwgMHgyMSwgMHgyMSwgMHg5NiwgMHgyNCwgMHg3MCwgMHhkZSwKKyAgMHg0ZiwgMHhiOCwgMHgxMCwgMHg4NCwgMHgwYywgMHgxNywgMHg4NywgMHgwOSwgMHg4MiwgMHhjZSwgMHg5OSwgMHhlZSwKKyAgMHhlYiwgMHgyMSwgMHg3YiwgMHhhNSwgMHhhZCwgMHhhOCwgMHg2OSwgMHg5NiwgMHhmMywgMHgzYiwgMHhlNywgMHg3OSwKKyAgMHg4OCwgMHg3OCwgMHhiNCwgMHg4YywgMHhmMywgMHg2MywgMHgzNCwgMHhlMCwgMHhmYiwgMHgwMywgMHg3MywgMHgxOCwKKyAgMHhhMSwgMHg1YywgMHhkNywgMHgxNSwgMHhkMiwgMHhmNywgMHg4NiwgMHhiZSwgMHhmZSwgMHhkZSwgMHgxNywgMHgxMSwKKyAgMHg3ZCwgMHgxZSwgMHgxYywgMHhiZSwgMHg3OCwgMHgzZSwgMHg3ZSwgMHhjNSwgMHgyOCwgMHgzNiwgMHgxMiwgMHg4NywKKyAgMHg2MCwgMHgwMCwgMHg1NCwgMHgxNSwgMHgxNSwgMHg2YywgMHgwMCwgMHgwNCwgMHgwZCwgMHg4YiwgMHhkOCwgMHg5OCwKKyAgMHgwYiwgMHhhNCwgMHgyOSwgMHg2YSwgMHgyMiwgMHhhYSwgMHhlMCwgMHgwNSwgMHg2ZCwgMHhhZiwgMHg3NywgMHhiZCwKKyAgMHgxOSwgMHhmNiwgMHhiYywgMHhhNSwgMHg1ZCwgMHgyZCwgMHhiNiwgMHgwYywgMHgzMywgMHg5YiwgMHgxNiwgMHhlNywKKyAgMHgwYSwgMHhmNCwgMHg1ZCwgMHhlNywgMHhjMiwgMHg0NSwgMHgwNCwgMHhjZCwgMHg1NiwgMHgzYiwgMHhkNywgMHgwMywKKyAgMHg1OSwgMHhjNywgMHhmZCwgMHg5YSwgMHg3NCwgMHgzZiwgMHg3ZCwgMHg1NywgMHhmOCwgMHg4MCwgMHg2ZSwgMHg3OCwKKyAgMHg0ZSwgMHhjNiwgMHgzMywgMHg2ZiwgMHg1YywgMHgyOCwgMHg1YiwgMHgyNSwgMHhiNywgMHg0YywgMHhjZCwgMHgyMCwKKyAgMHhjZSwgMHg2NywgMHg3ZSwgMHg1MiwgMHg1OSwgMHgxNCwgMHhkMywgMHg2ZSwgMHhmOCwgMHg2ZCwgMHhiOSwgMHhjZiwKKyAgMHg3ZiwgMHhiNywgMHhhNywgMHg4MCwgMHgwNywgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwKKyAgMHhmZiwgMHgyMSwgMHg2ZiwgMHhhMywgMHhjMCwgMHhkOCwgMHg2OCwgMHhhNiwgMHgxYSwgMHg4NCwgMHgxMywgMHhjOCwKKyAgMHgyNywgMHgxNCwgMHhlMSwgMHg1YSwgMHg4YSwgMHhkNCwgMHhhOCwgMHhjNCwgMHhjNSwgMHg4NCwgMHgzMCwgMHg2YiwKKyAgMHhmMiwgMHg2MSwgMHg5NSwgMHg4MywgMHhiNiwgMHhkZSwgMHgyNSwgMHgwYywgMHgwYywgMHhhOCwgMHhhYSwgMHg4NCwKKyAgMHg0YiwgMHgxYywgMHhkZiwgMHhjYiwgMHgzOCwgMHg1NywgMHhmNywgMHgyYywgMHgyMiwgMHgxMSwgMHg4NywgMHhmNCwKKyAgMHgwNCwgMHhkNCwgMHhhZSwgMHhlMiwgMHhmYiwgMHgzNiwgMHgwMCwgMHg4OSwgMHg2OSwgMHgxNywgMHg4NSwgMHgwOCwKKyAgMHgxZSwgMHg0OSwgMHg0MywgMHg5OCwgMHhlNywgMHhiOSwgMHgxYiwgMHhhNywgMHhhZiwgMHhiOCwgMHhmYSwgMHg0NCwKKyAgMHg2YiwgMHhjMiwgMHgzNSwgMHhmZSwgMHg4YywgMHhiMCwgMHhmOCwgMHg2NSwgMHgwMCwgMHhiOCwgMHg2NiwgMHg2ZiwKKyAgMHhkOCwgMHg3YSwgMHgwNSwgMHhkMywgMHhjNiwgMHg2MywgMHhkYywgMHgzYiwgMHg4NCwgMHg3NSwgMHhhYSwgMHhhMywKKyAgMHg1YiwgMHhlOCwgMHg1YSwgMHhlNiwgMHgzNSwgMHhjZiwgMHhmNCwgMHhkZSwgMHhkNywgMHgxYSwgMHg4MSwgMHg2ZiwKKyAgMHg5NiwgMHg0YywgMHg5YiwgMHgxOSwgMHg1MiwgMHhjNSwgMHgzYSwgMHg5YiwgMHgwYywgMHhmOCwgMHhkMSwgMHhhMiwKKyAgMHhjNywgMHgwYywgMHgyYywgMHg5NSwgMHhkYywgMHgyOCwgMHhhZiwgMHg2NSwgMHg2NiwgMHhlOCwgMHgzNCwgMHgxZSwKKyAgMHgwMiwgMHg5ZiwgMHg2YSwgMHgwYSwgMHg2MCwgMHg0ZSwgMHg5ZSwgMHgyNiwgMHhiMywgMHgyYiwgMHg2NywgMHg1YywKKyAgMHgxOSwgMHhiNiwgMHgwMiwgMHgwMiwgMHg0YywgMHg2OCwgMHhkMywgMHgyNCwgMHhmMywgMHhjMiwgMHg4OCwgMHgzYSwKKyAgMHg4MCwgMHhiZiwgMHgwYywgMHg2MywgMHg4MSwgMHgwOSwgMHg2ZiwgMHhhYSwgMHhhMiwgMHgzYSwgMHhiNCwgMHg3NCwKKyAgMHhlZCwgMHg4OCwgMHgwYiwgMHgwMiwgMHg5YiwgMHg3NSwgMHg1ZCwgMHgyZiwgMHgzNywgMHg4ZiwgMHgzNywgMHgwMSwKKyAgMHg3NSwgMHgyZCwgMHhlYiwgMHg1YSwgMHg4NiwgMHhiYiwgMHhiOCwgMHhmZSwgMHg5YiwgMHgxMywgMHg2NiwgMHhkMiwKKyAgMHg1MiwgMHgwNCwgMHgyNiwgMHg2YywgMHg5ZCwgMHgyYiwgMHgyZiwgMHhhOSwgMHgwMywgMHhkMSwgMHhjNywgMHgxYiwKKyAgMHgyMywgMHg3OCwgMHgyYiwgMHg4OCwgMHg0OSwgMHg5MCwgMHgwMiwgMHg0NywgMHhiZCwgMHhkYiwgMHhjZCwgMHg1ZCwKKyAgMHgzZSwgMHgyMSwgMHhjNCwgMHg0NywgMHg5MCwgMHgxZiwgMHg5NSwgMHg5MSwgMHg1MSwgMHhhMSwgMHhjZCwgMHhmNSwKKyAgMHhjNywgMHg4MCwgMHgwMiwgMHgwNSwgMHgxOCwgMHg2YywgMHgxMSwgMHhlNywgMHg1OCwgMHhjNCwgMHgwZCwgMHgwNywKKyAgMHhlYiwgMHgwYiwgMHhhZiwgMHg3ZSwgMHg2ZiwgMHhjNywgMHgwOSwgMHg5NSwgMHg0YSwgMHhmMywgMHg2YiwgMHg4YywKKyAgMHgwMCwgMHgwOSwgMHgzYiwgMHhjNiwgMHg0NiwgMHg1MCwgMHg5ZCwgMHhiZCwgMHg3MSwgMHhkNywgMHhiYiwgMHg4YSwKKyAgMHgwOSwgMHg2MywgMHg2NywgMHg3NywgMHg1MCwgMHhlMywgMHhkZiwgMHg4NSwgMHgyNSwgMHgxMiwgMHg3NCwgMHg2MywKKyAgMHgxYywgMHhmZCwgMHg5ZCwgMHg5NSwgMHgwMCwgMHgwZiwgMHg5ZiwgMHhjMCwgMHgyOCwgMHg5MSwgMHgwMiwgMHhjMywKKyAgMHg1MCwgMHhlYywgMHhhOSwgMHg1MSwgMHgyOCwgMHhhOCwgMHgwNSwgMHg0OSwgMHg0OSwgMHg4MCwgMHgyMCwgMHgzOSwKKyAgMHg0YywgMHhkYSwgMHhjOSwgMHhiNSwgMHg2YSwgMHg5NCwgMHg3ZiwgMHgzYSwgMHg3MiwgMHhiYiwgMHg4ZCwgMHg2YiwKKyAgMHhjYSwgMHg4YywgMHg5OSwgMHhhNywgMHhlNSwgMHhjMSwgMHgzMiwgMHgwMywgMHg3YiwgMHhkNiwgMHg4YywgMHgzYywKKyAgMHhjZSwgMHg0ZCwgMHgyOSwgMHhlYywgMHg5ZSwgMHg2MCwgMHgxNSwgMHgxNiwgMHg2NCwgMHhiZSwgMHg0MCwgMHgwMiwKKyAgMHg2OSwgMHg0NSwgMHhlNywgMHgzYywgMHg2YywgMHhiYiwgMHgyYywgMHg5NiwgMHhjMiwgMHgxNywgMHg2MSwgMHhlYSwKKyAgMHhiNSwgMHgwZiwgMHg4NCwgMHg5MSwgMHg0ZCwgMHhhZCwgMHgzNywgMHg4NywgMHg3MywgMHg5NiwgMHhmNSwgMHhlYywKKyAgMHg5MCwgMHgwZSwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgxYiwgMHg2ZiwKKyAgMHhhNSwgMHgzMCwgMHg5MSwgMHg2YywgMHgzMywgMHgwOCwgMHgwNSwgMHhkOSwgMHhjMSwgMHgxYSwgMHg2YSwgMHg5MywKKyAgMHg1NCwgMHgwNSwgMHgxMCwgMHg0OCwgMHhjMSwgMHg1OCwgMHgxYiwgMHhkNywgMHhiMiwgMHgxZCwgMHgxYywgMHg3YSwKKyAgMHhkZSwgMHg5MiwgMHgyNiwgMHg0MSwgMHg3OSwgMHgxNSwgMHgwZiwgMHg3NCwgMHg4MCwgMHg5MCwgMHg0OSwgMHgyMCwKKyAgMHg5OCwgMHgyZSwgMHhmNSwgMHhkNywgMHg0MywgMHg5NSwgMHg0ZCwgMHhkNCwgMHg3ZiwgMHhlOCwgMHhlMywgMHhkYywKKyAgMHhhMCwgMHg0ZCwgMHhhOCwgMHg5NywgMHg1MSwgMHhlNywgMHg3ZiwgMHhhNCwgMHhmYSwgMHgwZiwgMHhjZiwgMHhiOCwKKyAgMHhmMCwgMHg5OSwgMHgxZiwgMHg5YywgMHhhOSwgMHg1ZSwgMHhmMywgMHhlZCwgMHg1ZCwgMHhmYywgMHhlOCwgMHhmOSwKKyAgMHg1YywgMHhmNSwgMHhiZiwgMHgzMSwgMHgyOSwgMHg1MCwgMHhkMSwgMHg1YywgMHgyNywgMHg2MSwgMHhmZiwgMHg3MywKKyAgMHhjZiwgMHg4MiwgMHhkYiwgMHhiMywgMHg2ZSwgMHg2ZCwgMHg3ZiwgMHhiMSwgMHg2ZCwgMHg0ZiwgMHg4YSwgMHhiMiwKKyAgMHg1OSwgMHgwZCwgMHg1MywgMHhlMiwgMHgzMiwgMHg0ZCwgMHhjZCwgMHg5OCwgMHhhMywgMHhiOCwgMHhkOCwgMHhiNiwKKyAgMHgzZCwgMHgzYSwgMHhkYiwgMHgwOCwgMHgzMCwgMHhiMiwgMHg0MCwgMHhhYSwgMHgwNCwgMHhmYywgMHgzNSwgMHg5YSwKKyAgMHgxNiwgMHhhMSwgMHg4MCwgMHg0NiwgMHhhMywgMHgxYiwgMHhiNywgMHhhZSwgMHhhOSwgMHhkNCwgMHg1ZCwgMHhlNiwKKyAgMHhkNSwgMHg1NCwgMHhlOSwgMHg2OCwgMHhmNSwgMHhlNywgMHg5OSwgMHg2YSwgMHhkNCwgMHhiYywgMHgzZiwgMHhkMSwKKyAgMHhiYywgMHg0YywgMHg0ZCwgMHgzZSwgMHhmOCwgMHgwMiwgMHhlNSwgMHg5NywgMHgxZiwgMHhmMywgMHg1ZCwgMHg5MywKKyAgMHg5OCwgMHg5ZCwgMHgzMSwgMHg2YywgMHhhOCwgMHgzMSwgMHgyYSwgMHhkNywgMHg1MCwgMHhkMiwgMHhlYiwgMHgzOCwKKyAgMHg1NCwgMHg3NSwgMHg1ZSwgMHhmNiwgMHhjMSwgMHg3MCwgMHg1NCwgMHgyMSwgMHg5MiwgMHg1MSwgMHhlNSwgMHg2NiwKKyAgMHhhYywgMHg2MywgMHgzZSwgMHg5MCwgMHhiNCwgMHg4NiwgMHg2NSwgMHhlYiwgMHg0MywgMHhjNSwgMHhmZiwgMHg3YSwKKyAgMHgwYywgMHgzNywgMHgxYywgMHhmMywgMHhiNywgMHgyMywgMHgyYiwgMHg1NywgMHg5ZCwgMHg1ZiwgMHg4YiwgMHgxMCwKKyAgMHhhMiwgMHg0MSwgMHgyMiwgMHgwMCwgMHg5OSwgMHgwYywgMHg2MiwgMHgwNiwgMHgzZSwgMHg1YiwgMHhlMywgMHgzNCwKKyAgMHhhMCwgMHg1YSwgMHhlYywgMHgzOCwgMHgwNCwgMHg2MSwgMHgyNiwgMHg3ZCwgMHg5ZCwgMHhmZCwgMHg2NSwgMHhiYywKKyAgMHg5YiwgMHg3ZiwgMHgxYywgMHgwZiwgMHg0YywgMHg5ZiwgMHhkZiwgMHg2YSwgMHhhMCwgMHg3NSwgMHgwNiwgMHg3NywKKyAgMHgzMywgMHhiNywgMHg1NiwgMHg2NCwgMHhkYSwgMHhhYSwgMHg1YiwgMHg2NCwgMHhhZSwgMHhmZSwgMHhmMSwgMHhhZSwKKyAgMHhlNywgMHg3NywgMHhiYiwgMHgwZCwgMHhlMSwgMHhhNiwgMHgyNywgMHhmMiwgMHgzYywgMHhiZSwgMHgxMywgMHhlYywKKyAgMHhhMywgMHhhNywgMHhhNiwgMHhiMiwgMHg1NywgMHhmZSwgMHhiYSwgMHhmNywgMHhlYSwgMHhlYSwgMHhkOSwgMHhkNSwKKyAgMHg1ZCwgMHhkNSwgMHg3MSwgMHg1ZSwgMHhmZCwgMHg3OSwgMHgwZiwgMHhkMywgMHg3YywgMHg5ZiwgMHhkYywgMHg5ZiwKKyAgMHgwNCwgMHgxZiwgMHg3ZiwgMHg2MiwgMHg3MiwgMHgxYSwgMHgwOSwgMHg4NCwgMHhhMSwgMHhlNiwgMHgwYSwgMHg4OSwKKyAgMHg0MiwgMHhhMCwgMHgxNSwgMHgyYSwgMHgyMCwgMHgwOCwgMHgxMCwgMHgwZiwgMHgwYywgMHg0MCwgMHgzNywgMHgyZSwKKyAgMHgwMCwgMHhlZiwgMHhhNSwgMHhlYSwgMHhhYywgMHhhNywgMHgyMiwgMHhiNSwgMHgxYSwgMHg2YiwgMHhiNiwgMHg1MCwKKyAgMHg4ZSwgMHhlYiwgMHhlMCwgMHhkNiwgMHgyYiwgMHhhMSwgMHhhOSwgMHg4MiwgMHgzYiwgMHg4NCwgMHhiNSwgMHhhNCwKKyAgMHhjMiwgMHg2MCwgMHg0NywgMHhmNCwgMHg3MSwgMHg3NSwgMHhlZSwgMHg5MCwgMHg3ZSwgMHhmZiwgMHhmMCwgMHgyZSwKKyAgMHg4YywgMHhmMSwgMHgyNSwgMHhmZSwgMHgzMCwgMHg5MSwgMHhiNiwgMHg5YywgMHhiMywgMHg2NiwgMHhiOCwgMHgwMywKKyAgMHhhYSwgMHhhNCwgMHg5MywgMHgzNywgMHg3NywgMHgwMiwgMHhkYSwgMHg4ZCwgMHg3YiwgMHhjZSwgMHhhYiwgMHgzYiwKKyAgMHg1NywgMHhkZiwgMHgyNCwgMHhkZSwgMHgxNCwgMHhhOCwgMHgxZSwgMHhjYiwgMHhlYSwgMHg5ZCwgMHhmNSwgMHhkMywKKyAgMHg5ZSwgMHhhZiwgMHg5ZiwgMHhhNywgMHhiYiwgMHg4MCwgMHgwNywgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHhmZiwgMHhmZiwgMHgyNywgMHg2ZiwgMHhhNSwgMHgzMCwgMHg5MCwgMHg2YywgMHgxNCwgMHgzYiwgMHgwZCwKKyAgMHg0MiwgMHgwNCwgMHhkNSwgMHhhYywgMHhmMywgMHg5NywgMHg1YSwgMHg5YywgMHg1ZiwgMHg3YSwgMHg2YSwgMHg5MCwKKyAgMHg1MiwgMHgyMywgMHg3YSwgMHg2MCwgMHg0YSwgMHg0MCwgMHhjYSwgMHhjNiwgMHhiOSwgMHgzMCwgMHg1MCwgMHgxMSwKKyAgMHgyYSwgMHhiYiwgMHgzZiwgMHgzYSwgMHg5NywgMHhlYywgMHhkZSwgMHgyMSwgMHhjZCwgMHgzNSwgMHg2NywgMHhlNSwKKyAgMHg2NiwgMHgwZSwgMHg2YiwgMHhmYSwgMHg3YywgMHhmNSwgMHhlMCwgMHhiYSwgMHgyMiwgMHg1NCwgMHgxZSwgMHhlYywKKyAgMHhhZSwgMHg0NiwgMHgzZCwgMHgzNSwgMHhkNiwgMHg0OSwgMHhiMCwgMHg4MiwgMHhmNCwgMHhhYywgMHgzYSwgMHg5YiwKKyAgMHhhNywgMHgyMywgMHg4OSwgMHg4YSwgMHhmOSwgMHhkMSwgMHg2ZCwgMHhhOSwgMHhiMiwgMHg1OCwgMHgyZSwgMHg4OCwKKyAgMHhkYSwgMHgxMSwgMHhiYiwgMHgzYiwgMHhlNiwgMHhkNywgMHgzZCwgMHg2ZSwgMHhiOCwgMHgxZiwgMHhiNSwgMHhiZSwKKyAgMHhiNSwgMHhkNywgMHg5YSwgMHg2NSwgMHhiOSwgMHgwZSwgMHg4NywgMHg3NiwgMHhmYywgMHhkYSwgMHhmMywgMHg2NSwKKyAgMHg3YywgMHhhZCwgMHg5YSwgMHhkMSwgMHhjMywgMHhiYywgMHg0MywgMHgzYywgMHg0NywgMHg0OSwgMHgwZCwgMHgyMCwKKyAgMHhiNiwgMHg0MSwgMHg3OSwgMHgwZSwgMHhmNCwgMHg3NCwgMHg5MSwgMHgyYywgMHhkNSwgMHgzMiwgMHg5OSwgMHhkYiwKKyAgMHg2NiwgMHg5NSwgMHgwMywgMHg0NywgMHg1YSwgMHg4MiwgMHhhNSwgMHg4MywgMHgxNCwgMHg3NCwgMHg1NywgMHgwYiwKKyAgMHgzZSwgMHg2OCwgMHg2YiwgMHg2NSwgMHg0MSwgMHhkYywgMHg0OSwgMHhjNSwgMHg3ZSwgMHg5NCwgMHgyMSwgMHg2MywKKyAgMHg4NSwgMHg0MiwgMHg3MiwgMHg5YywgMHg5NSwgMHgwYywgMHhiNiwgMHhkMCwgMHg5NSwgMHg0MSwgMHg1NiwgMHhmMSwKKyAgMHhkNSwgMHhlOSwgMHg3MywgMHgxZSwgMHgyOCwgMHg3NywgMHhhMCwgMHhmZSwgMHg4MSwgMHgyYiwgMHhlMCwgMHhiYSwKKyAgMHg3ZiwgMHg4ZCwgMHg4NCwgMHg3NywgMHgxMiwgMHhkYSwgMHg0ZCwgMHgwZSwgMHhhOCwgMHgyNywgMHhhNSwgMHhhOSwKKyAgMHhhNiwgMHgwMSwgMHg1YywgMHhhOSwgMHgzZCwgMHhiMywgMHgyNSwgMHg0NywgMHgwYSwgMHgxYiwgMHhlZSwgMHhmMSwKKyAgMHg1YSwgMHhjZCwgMHg0YywgMHgyMywgMHg1YywgMHg0MSwgMHg0NCwgMHg5NSwgMHg2MywgMHgwNSwgMHgzOCwgMHhlNywKKyAgMHg2NywgMHhjYiwgMHhiMiwgMHhjMCwgMHhlNiwgMHhiYiwgMHhiYywgMHhiZSwgMHhmZiwgMHgxMCwgMHhiMiwgMHg3YywKKyAgMHg3ZSwgMHhkYiwgMHg4NSwgMHgwMCwgMHgzNiwgMHhiZCwgMHhhZiwgMHg2NywgMHhhZCwgMHhmZSwgMHgyOSwgMHhmZSwKKyAgMHgyNSwgMHhmNiwgMHg5ZCwgMHg2MywgMHg3NywgMHg3OSwgMHhlNSwgMHg3ZiwgMHhiYSwgMHg3ZCwgMHg1NSwgMHhmNSwKKyAgMHgwYiwgMHhkNCwgMHg0MywgMHhlZiwgMHg1NywgMHg0NiwgMHgyMSwgMHgwZCwgMHg3NCwgMHg5YywgMHg2OSwgMHhkMSwKKyAgMHg1ZCwgMHgzMiwgMHhhZiwgMHgzZiwgMHgyNCwgMHhlNSwgMHgyNSwgMHgzNywgMHgzMSwgMHhlNiwgMHhjYywgMHhiMSwKKyAgMHg3NCwgMHg4MiwgMHhkMiwgMHg2NywgMHgzNSwgMHhkNCwgMHhjMSwgMHg5YiwgMHg1YywgMHg2OCwgMHhiYSwgMHhkYiwKKyAgMHhlZiwgMHg4YiwgMHg0NSwgMHhkNywgMHg4ZiwgMHg0NywgMHgzZiwgMHg2ZSwgMHg3YSwgMHhhMCwgMHgwMSwgMHhmYiwKKyAgMHhmNiwgMHgyYiwgMHg2MSwgMHhhOCwgMHg3NiwgMHg1NCwgMHhhOCwgMHgxNSwgMHgyYSwgMHgyOSwgMHgxMywgMHgyNSwKKyAgMHgyNSwgMHgwMCwgMHgxMCwgMHhhMCwgMHgwMCwgMHhhYywgMHgxNSwgMHg5MCwgMHgwMiwgMHg4MCwgMHg4NSwgMHg4NSwKKyAgMHgwNSwgMHg5ZSwgMHg3NCwgMHgwZSwgMHgwMiwgMHgwOCwgMHhhOSwgMHgxOCwgMHhjNSwgMHg1NCwgMHhkMCwgMHg4NCwKKyAgMHgzZiwgMHg1ZCwgMHhiNSwgMHg5MywgMHgxYywgMHg1OSwgMHhkNCwgMHgwZiwgMHhjZSwgMHgzYywgMHhkZSwgMHg0OSwKKyAgMHg3OCwgMHg0MSwgMHhjOSwgMHhlNCwgMHg1OSwgMHhmMywgMHhjMCwgMHgxYSwgMHgwZCwgMHgxMiwgMHhkYiwgMHg4YSwKKyAgMHg0YiwgMHg5NiwgMHg3OCwgMHhiNiwgMHhiNywgMHgxMCwgMHhiOSwgMHgyOSwgMHg3YSwgMHhkNCwgMHgxMSwgMHg5YSwKKyAgMHhhMSwgMHg4YSwgMHg0OSwgMHg2ZCwgMHg0MCwgMHg5ZSwgMHhmYiwgMHg3MSwgMHhlZSwgMHhmOCwgMHg1ZiwgMHgwOCwKKyAgMHgwMCwgMHhlMCwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzZiwgMHgyMywgMHg3MSwKKyAgMHhhMSwgMHhjMSwgMHg1MiwgMHgwMiwgMHgxMCwgMHgxMiwgMHhlNCwgMHhiNCwgMHg5YSwgMHhiMywgMHg0OSwgMHg1NywKKyAgMHgyOSwgMHgzOSwgMHhlMCwgMHgzMiwgMHhkNCwgMHg4ZSwgMHg0NywgMHg4YywgMHhlNSwgMHg3NiwgMHg3YywgMHhhZSwKKyAgMHgzZiwgMHgyZSwgMHgzZSwgMHg0OSwgMHgxNiwgMHgxMiwgMHhkZSwgMHgyNSwgMHg2NCwgMHg0YywgMHg0MywgMHhhNywKKyAgMHhmZSwgMHhiZiwgMHg1MSwgMHgxYiwgMHhhNCwgMHgzNiwgMHhjZCwgMHg0YiwgMHhkZCwgMHhiYywgMHgxMywgMHg0NywKKyAgMHhmZSwgMHhkZiwgMHg0YywgMHhiMSwgMHg3MiwgMHhjNywgMHgxYSwgMHg1MywgMHgwMSwgMHhkNSwgMHg0NiwgMHg3MywKKyAgMHgwNCwgMHg0ZCwgMHhiMSwgMHg1NywgMHg2NywgMHgxZCwgMHgzZSwgMHg5NSwgMHg2YSwgMHg4YywgMHhiMCwgMHhiYSwKKyAgMHgxMCwgMHg5OCwgMHhlNSwgMHhmOSwgMHgzMSwgMHgyMiwgMHg3MiwgMHg3MSwgMHgxYSwgMHg3YiwgMHhlYSwgMHhmOSwKKyAgMHg5ZCwgMHg2OCwgMHhjNywgMHhkNiwgMHhmMSwgMHhhNywgMHhlMywgMHhhOSwgMHhiYiwgMHgwZiwgMHg1OCwgMHhiNSwKKyAgMHgwZSwgMHg2YywgMHgwMiwgMHgxNiwgMHgzMywgMHhlMCwgMHg5YywgMHg1NiwgMHg5NCwgMHhmOSwgMHhkMSwgMHg3NiwKKyAgMHhjYSwgMHgzNSwgMHhkNiwgMHg2ZiwgMHg2OSwgMHg0YiwgMHhiMywgMHg5OSwgMHg4MywgMHg2NywgMHgyZCwgMHg5ZCwKKyAgMHhmZSwgMHgxZiwgMHhlMSwgMHg5MywgMHgyYiwgMHhiMiwgMHg2YiwgMHg2YywgMHhkZCwgMHgxYiwgMHgyNywgMHhjYiwKKyAgMHg5OCwgMHhjMiwgMHg3NywgMHg3YiwgMHg5MSwgMHhhNCwgMHgxNywgMHg0NSwgMHg2NiwgMHgzZSwgMHhlZiwgMHhkYSwKKyAgMHg2ZSwgMHg0MSwgMHhiZiwgMHhiOSwgMHgzYywgMHg1YiwgMHgxMCwgMHhkNCwgMHhiMSwgMHg2NSwgMHgzNiwgMHhiMSwKKyAgMHgwYywgMHgwMywgMHgyYSwgMHgzYywgMHgwZSwgMHhkNywgMHg3YiwgMHg2MSwgMHhjNSwgMHg3YywgMHg0OCwgMHgxMiwKKyAgMHgyZCwgMHhmNCwgMHg3YiwgMHgxNywgMHhjNSwgMHg4YywgMHhkMiwgMHg4MCwgMHhkYywgMHhkMCwgMHg1MCwgMHgyZiwKKyAgMHg3MSwgMHg1YSwgMHg2YSwgMHgzZiwgMHhkOCwgMHgyMSwgMHhiZiwgMHgwMiwgMHhmMywgMHg3ZSwgMHhmNiwgMHhmOCwKKyAgMHhiYywgMHhjNCwgMHgwNSwgMHhlMywgMHhiNSwgMHhiMiwgMHgyMCwgMHgxNiwgMHhjZiwgMHgxOCwgMHg1OSwgMHg5YywKKyAgMHhmZiwgMHgwZCwgMHg3NiwgMHg1YywgMHgwNiwgMHg2NywgMHg1YywgMHhiYiwgMHg4MywgMHhkNCwgMHhkOSwgMHg4OSwKKyAgMHg5YiwgMHgyMCwgMHhmYiwgMHgyOCwgMHhjZSwgMHhiNSwgMHgyZiwgMHg4OSwgMHhjMCwgMHg1NSwgMHgyMywgMHhkNywKKyAgMHg5OCwgMHg3NiwgMHg2YiwgMHg0OCwgMHgyYywgMHgzYywgMHgzNCwgMHhmNSwgMHg5MywgMHg4NiwgMHgwMCwgMHg3NywKKyAgMHgzOCwgMHhmMSwgMHgwZiwgMHg5NiwgMHhiNywgMHgxMiwgMHhiNSwgMHg5NiwgMHg5NywgMHg4MywgMHg1ZCwgMHg2ZCwKKyAgMHg5YSwgMHgxMiwgMHg1ZSwgMHg4NCwgMHhjZSwgMHhiNCwgMHhmOSwgMHg5ZiwgMHhmZiwgMHg2ZiwgMHhkYSwgMHhmMCwKKyAgMHhjOCwgMHgwZiwgMHhmZiwgMHhmMywgMHgyMSwgMHgxNCwgMHgzYiwgMHg1NCwgMHhhOCwgMHhhNCwgMHg1NCwgMHg5OSwKKyAgMHgyOCwgMHg4YSwgMHg0NCwgMHg5NCwgMHhjOCwgMHg5OSwgMHg3MywgMHgyNSwgMHg1OCwgMHgxMCwgMHgzZCwgMHhhZiwKKyAgMHgwNiwgMHgwMCwgMHg5MiwgMHg0OSwgMHg2NiwgMHgzMywgMHg5OCwgMHg0MCwgMHg5YywgMHgxMywgMHgxZiwgMHg1NCwKKyAgMHgzNCwgMHhmZCwgMHgxOSwgMHhiNCwgMHg2MywgMHg3NiwgMHhmZSwgMHhkNCwgMHhlNywgMHg0MiwgMHhkMywgMHgzZiwKKyAgMHg5MiwgMHgwMywgMHhkMywgMHg3YSwgMHhlOSwgMHg5ZiwgMHg1ZSwgMHg2YiwgMHg4YywgMHg4MCwgMHg3MCwgMHgyMSwKKyAgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxZiwgMHgxZiwgMHg3MCwgMHhhMiwgMHg0MSwgMHg1OCwKKyAgMHg0OCwgMHhkNiwgMHgwOCwgMHg4NCwgMHgwMCwgMHhlMywgMHg1NiwgMHg0NCwgMHhiYiwgMHhhOCwgMHg5NywgMHg1MCwKKyAgMHgwMCwgMHhhOSwgMHg1MywgMHhiMSwgMHg4MywgMHgyMiwgMHhkZCwgMHgwZSwgMHg1NiwgMHgzNSwgMHgxNSwgMHg1OCwKKyAgMHg4MSwgMHg1NSwgMHhlNywgMHg0NCwgMHg5OCwgMHgzZiwgMHgzZiwgMHhmOSwgMHgyYSwgMHhjOCwgMHg3ZiwgMHhhMiwKKyAgMHg0YywgMHgwMSwgMHg5OSwgMHgwMSwgMHg5YSwgMHhmZiwgMHgxNSwgMHhlNiwgMHhiYywgMHg2ZCwgMHgyMCwgMHg3MywKKyAgMHgwMiwgMHgzYywgMHhjZSwgMHhkMiwgMHgzNCwgMHhjMSwgMHhhZCwgMHgzNCwgMHg2ZiwgMHhmYiwgMHg1ZCwgMHg0MiwKKyAgMHhlYiwgMHg1ZSwgMHg2NSwgMHhlNCwgMHhjNiwgMHhkNCwgMHhmMSwgMHhjZiwgMHhiMywgMHhkZCwgMHhmMiwgMHhmZiwKKyAgMHg5NywgMHgwYiwgMHg1NSwgMHhlYywgMHhhOCwgMHgxYiwgMHhiMywgMHhlZiwgMHg0YiwgMHhmNCwgMHhhZCwgMHgzNywKKyAgMHg1MSwgMHg5MywgMHhhOCwgMHhmNCwgMHgxYSwgMHg1YywgMHg1MywgMHgzYSwgMHg4MywgMHgwZSwgMHg1NiwgMHhmMSwKKyAgMHg4ZSwgMHg1ZSwgMHhmZiwgMHgyMiwgMHhmMCwgMHhmZiwgMHg1YSwgMHhkMywgMHg1MCwgMHgzZCwgMHg2MiwgMHg4YiwKKyAgMHgwYSwgMHgzMywgMHgxYSwgMHgyZSwgMHg4YSwgMHgwZiwgMHhkNCwgMHg2NSwgMHg0NiwgMHgyYiwgMHgyYSwgMHhiZiwKKyAgMHg1YywgMHg1ZiwgMHhlMywgMHg3MSwgMHg3NCwgMHg0NCwgMHg1OSwgMHg3YiwgMHg5OSwgMHg0MSwgMHg4OSwgMHhhMSwKKyAgMHhjMiwgMHgwNiwgMHg1NCwgMHgxNCwgMHgyZCwgMHhlMSwgMHg2NCwgMHg4NywgMHhlZiwgMHg0OCwgMHg3NywgMHg0OCwKKyAgMHg3MiwgMHg5MiwgMHhiMCwgMHgzMSwgMHhiYiwgMHg4ZCwgMHhhOSwgMHgyMCwgMHgwNiwgMHhiNCwgMHg5MiwgMHg2ZCwKKyAgMHgxZCwgMHgxZiwgMHgyYywgMHgwNiwgMHhkNiwgMHgzYywgMHg0MywgMHgzZCwgMHhmMywgMHg4OCwgMHhmZSwgMHgxMCwKKyAgMHg4ZCwgMHg2YywgMHhjOCwgMHhjMSwgMHgyNiwgMHhhYywgMHhiOCwgMHg0NSwgMHgxZiwgMHgxNSwgMHg0MiwgMHgyOCwKKyAgMHgzZiwgMHgwZiwgMHgxYSwgMHhiNSwgMHhmMSwgMHhlMSwgMHgwYiwgMHhlOCwgMHhiZSwgMHg0OCwgMHg4NiwgMHgwMiwKKyAgMHg3NiwgMHg2ZiwgMHhjYiwgMHg3YywgMHgyZiwgMHhkNSwgMHhmMSwgMHhhZCwgMHhiYiwgMHhhMSwgMHgwMCwgMHg3ZCwKKyAgMHg5YSwgMHgxNCwgMHg2ZCwgMHhjMSwgMHg0YSwgMHhlZiwgMHhhNywgMHg3YiwgMHhjOCwgMHg2OCwgMHg5NywgMHgxZiwKKyAgMHg0NSwgMHhhMSwgMHg0NCwgMHg2YywgMHgwNSwgMHgzZSwgMHhkNiwgMHgyYiwgMHhlNywgMHg0NCwgMHg4ZCwgMHg1NywKKyAgMHhkMywgMHgxZiwgMHg2YywgMHg2ZiwgMHhiNSwgMHgxMywgMHhhMywgMHhiNSwgMHhjZiwgMHhlNCwgMHg0ZiwgMHgxYywKKyAgMHgzYywgMHgxOCwgMHgzOCwgMHg3MywgMHg0OCwgMHgzYiwgMHhhMSwgMHgyMiwgMHhjMiwgMHg3NCwgMHhmNywgMHg0MCwKKyAgMHhkMCwgMHg1ZCwgMHhkZCwgMHg2ZiwgMHhiMSwgMHhjYywgMHg4YiwgMHhhOCwgMHhkMiwgMHhkNiwgMHg3YSwgMHgxZCwKKyAgMHgxZCwgMHg5MiwgMHg1YywgMHg0YywgMHg1NiwgMHhjMSwgMHgzZSwgMHg0ZCwgMHgzYywgMHg1YiwgMHg1YywgMHg5ZiwKKyAgMHg1ZiwgMHhjZiwgMHg2ZCwgMHhjMSwgMHhmYiwgMHhmZSwgMHg3NCwgMHgyNiwgMHhkMSwgMHg1NSwgMHgyYSwgMHgyYSwKKyAgMHg1MSwgMHgwMCwgMHgxMCwgMHhhMSwgMHg1MSwgMHg1MiwgMHg0MiwgMHg4MSwgMHg2YSwgMHhlMywgMHhiNywgMHhmZSwKKyAgMHgzMSwgMHhmNywgMHgwMSwgMHgzZiwgMHgyMiwgMHgyMCwgMHg2MCwgMHg1MiwgMHg5OSwgMHg3MCwgMHgwNiwgMHg4MCwKKyAgMHg0MywgMHhhZCwgMHg2YSwgMHgzZCwgMHgzNywgMHgxZSwgMHhjMiwgMHg0NSwgMHgxNywgMHgwYSwgMHg2OSwgMHhkZCwKKyAgMHhkZiwgMHgwNywgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwNywgMHhmZiwgMHhmZiwgMHgyYiwgMHg2ZiwKKyAgMHhhNSwgMHgzMCwgMHg1MCwgMHg4YywgMHg1NCwgMHgxYiwgMHgwZCwgMHg0MiwgMHgwZSwgMHgzNSwgMHg2ZCwgMHgyZCwKKyAgMHg2OSwgMHg3NSwgMHhhOSwgMHg2MywgMHg1NSwgMHg0MiwgMHgwMywgMHgyZCwgMHg1NywgMHg0MywgMHhiZiwgMHg3MCwKKyAgMHg2MiwgMHg1MiwgMHhiNSwgMHg5MiwgMHhiZSwgMHg4MywgMHhmNCwgMHhiMCwgMHg0OSwgMHg1MCwgMHgzYywgMHhhOSwKKyAgMHg3MCwgMHhhMSwgMHhkOCwgMHgzNSwgMHhlZCwgMHhjYiwgMHhkYiwgMHhmZSwgMHgwNSwgMHhlMywgMHgzZSwgMHgxMCwKKyAgMHg5OSwgMHgwYiwgMHgzMiwgMHgwZiwgMHg0YiwgMHhmZSwgMHg4ZiwgMHhkMiwgMHg3OCwgMHhjNywgMHg0OCwgMHhlMSwKKyAgMHg0YywgMHg1ZiwgMHgxNywgMHhhYSwgMHg3OSwgMHg5NywgMHg4MywgMHhjNiwgMHg5ZCwgMHgzMSwgMHhhNCwgMHhhMywKKyAgMHgyYSwgMHg1YiwgMHhiOSwgMHhlNSwgMHhjNCwgMHhjOCwgMHgyZSwgMHg3MCwgMHg1MiwgMHhkOSwgMHgwZSwgMHhjZCwKKyAgMHgyNywgMHhmZSwgMHgzZSwgMHg0OCwgMHg2NywgMHg3YSwgMHg2ZCwgMHg2MiwgMHhjMiwgMHhiZiwgMHg0NSwgMHhlYSwKKyAgMHgxMiwgMHgwYiwgMHhlMywgMHg3NCwgMHg1MCwgMHhkNywgMHgzZiwgMHg0MywgMHgwMywgMHgwZiwgMHgzOCwgMHg0MSwKKyAgMHhiNywgMHg5ZCwgMHgxZSwgMHg5YSwgMHgxMCwgMHg4OCwgMHg0ZCwgMHhmYiwgMHg5NSwgMHgzNCwgMHhhZSwgMHg0MiwKKyAgMHg0MSwgMHg0OCwgMHg2NywgMHgzYywgMHg1ZCwgMHgyOCwgMHgxZCwgMHg0ZiwgMHgzZSwgMHhjNSwgMHg3MCwgMHhiMCwKKyAgMHhmNywgMHgyYiwgMHhhOSwgMHg2NiwgMHgxZCwgMHhhYSwgMHgxMiwgMHgwMiwgMHhiYywgMHg2NCwgMHhlYiwgMHg2YiwKKyAgMHg2NCwgMHg0OSwgMHg5MiwgMHg0NiwgMHgxMywgMHg0ZCwgMHg2NSwgMHhkYywgMHg1MiwgMHg5ZCwgMHg4OSwgMHg0YywKKyAgMHg0YiwgMHg1NiwgMHgzMywgMHg4NCwgMHg4MywgMHgxMywgMHg4OSwgMHhlMiwgMHg0MCwgMHg1OSwgMHg0YSwgMHg0NywKKyAgMHhiZCwgMHhkMCwgMHhkOCwgMHg3OSwgMHhlOSwgMHhlOSwgMHhmYiwgMHhmNywgMHhjMCwgMHg3NiwgMHhlYiwgMHhiNiwKKyAgMHgwYiwgMHhhYywgMHgyMiwgMHg4MCwgMHhkZCwgMHg3NCwgMHhhZSwgMHg1NCwgMHg0NiwgMHg0MywgMHg3MywgMHgyMywKKyAgMHhkNCwgMHhjMiwgMHgwYywgMHgwOSwgMHg3YywgMHg5MSwgMHg1MSwgMHgzMywgMHg4MywgMHg5ZSwgMHgxYywgMHg1NCwKKyAgMHg4NiwgMHg1MywgMHgyOSwgMHg2ZSwgMHg0NiwgMHhiZCwgMHgwOSwgMHg0YSwgMHg0NCwgMHg2NiwgMHg5NiwgMHhiMCwKKyAgMHhjMSwgMHhjNiwgMHgyZCwgMHgzYSwgMHhkOSwgMHhlMCwgMHhiOCwgMHgyYywgMHgwMSwgMHhhMywgMHgwNSwgMHg4NiwKKyAgMHgxMCwgMHhmMSwgMHg3YSwgMHg1YiwgMHg0ZCwgMHhmMiwgMHhlNCwgMHg1MSwgMHg3ZCwgMHg3YiwgMHg0YywgMHgzNiwKKyAgMHhlMCwgMHg2NiwgMHg3YiwgMHhiMiwgMHgzOCwgMHgxMCwgMHhmYywgMHgxOSwgMHhkZSwgMHg1YSwgMHg2NiwgMHg4ZiwKKyAgMHhhNiwgMHg0NCwgMHg1MiwgMHhlOCwgMHg3MCwgMHg5ZSwgMHg3NCwgMHhhZSwgMHhlYiwgMHg5YywgMHhiOSwgMHgwMCwKKyAgMHgwMywgMHhiOSwgMHg0NSwgMHg2MiwgMHg2ZCwgMHgyMCwgMHhhOSwgMHgwOSwgMHg1ZiwgMHgzZSwgMHgxZCwgMHhmZiwKKyAgMHg1YywgMHg2NywgMHgyZCwgMHg1OCwgMHhjZiwgMHg5NCwgMHhiMywgMHg1ZiwgMHg3ZiwgMHhiNywgMHhlZCwgMHhmNCwKKyAgMHhjNywgMHhkMSwgMHhkYiwgMHhkYiwgMHhlMCwgMHgwMCwgMHhmYiwgMHhmOCwgMHgzNiwgMHgxMCwgMHg5OCwgMHg2NiwKKyAgMHgxZCwgMHg5NCwgMHg4NCwgMHhhNSwgMHg0NSwgMHg1ZSwgMHg0MiwgMHg5MiwgMHg4MCwgMHg0MCwgMHgyMiwgMHg2YywKKyAgMHg2ZCwgMHg0ZiwgMHgxNCwgMHg5MCwgMHg5ZCwgMHg2MSwgMHgyZCwgMHg4MCwgMHgxMiwgMHg4MiwgMHg4NCwgMHgwMiwKKyAgMHhmNiwgMHg0MywgMHg1NCwgMHhiYywgMHgzNCwgMHhlZiwgMHg2NiwgMHgzOCwgMHhmMywgMHhlZCwgMHgwZCwgMHg4YywKKyAgMHg0ZSwgMHhhZSwgMHhmNCwgMHg2OCwgMHg0NiwgMHhkOCwgMHgzNiwgMHgyZiwgMHhhOSwgMHgzOSwgMHhkNywgMHg3NiwKKyAgMHhiNSwgMHhiNywgMHhiNCwgMHhiNiwgMHgzZiwgMHhkYywgMHg1YiwgMHg2ZSwgMHg1MywgMHg3NCwgMHhlYywgMHg2NCwKKyAgMHhiOCwgMHg1MSwgMHhlOSwgMHg4NSwgMHhhNywgMHgzYSwgMHhhYywgMHg0NSwgMHhkNSwgMHg3MiwgMHg3OCwgMHgyOSwKKyAgMHhkZSwgMHg3ZiwgMHg3OSwgMHg0YywgMHg4ZSwgMHg0NCwgMHhiYSwgMHg1YiwgMHg4NSwgMHg0ZSwgMHg2NiwgMHhlNiwKKyAgMHg2MCwgMHhkNiwgMHg5MCwgMHgyNywgMHgxYSwgMHg2YSwgMHhhOCwgMHhiNywgMHg2NCwgMHhjOCwgMHhkMywgMHg2NSwKKyAgMHhjYSwgMHg4OSwgMHg0ZiwgMHg4MywgMHhjYiwgMHg1ZSwgMHg3NiwgMHg0YywgMHg1MiwgMHg2OSwgMHhmYiwgMHg4ZiwKKyAgMHg5ZiwgMHhmNCwgMHhkZSwgMHg0OCwgMHg3MCwgMHgyMSwgMHgxYSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywKKyAgMHhmZiwgMHgyMywgMHg2ZiwgMHhhNSwgMHgyMiwgMHgwOCwgMHg2OCwgMHg2MCwgMHg0MywgMHhhYywgMHhiNywgMHgwMSwKKyAgMHhjMiwgMHhkMSwgMHgyZSwgMHg5MiwgMHg5MSwgMHg0MSwgMHgyOSwgMHgzMCwgMHg1YSwgMHg0YSwgMHg5ZCwgMHhkNywKKyAgMHg3NiwgMHgyOCwgMHg5MSwgMHhkMywgMHg1YywgMHg0MywgMHhjNywgMHhhNywgMHg5ZiwgMHg0ZiwgMHg1OCwgMHgxYSwKKyAgMHhkNCwgMHg0NiwgMHhmNywgMHg5ZSwgMHhlZCwgMHgyMiwgMHg2MywgMHhhOCwgMHhmMywgMHhhNCwgMHgzNCwgMHgyNywKKyAgMHg0ZCwgMHhkOCwgMHgxYywgMHg4OSwgMHhjYywgMHg1YSwgMHg4NiwgMHg4ZSwgMHhlZCwgMHhkZSwgMHhiMiwgMHg4NSwKKyAgMHg1NywgMHhkNSwgMHg0YywgMHg3MywgMHg0NiwgMHhmNCwgMHgxYywgMHhmNiwgMHhlZiwgMHg4MiwgMHg2NiwgMHhiZCwKKyAgMHhhOSwgMHg2NCwgMHg2YywgMHhmYSwgMHgyNCwgMHg5YiwgMHg2MywgMHg3NiwgMHhmZiwgMHgyYSwgMHhiZiwgMHhkYSwKKyAgMHg2YSwgMHgwZiwgMHhiNiwgMHhiMiwgMHg1ZCwgMHg0OCwgMHhkZiwgMHgwZCwgMHhkNCwgMHg2OSwgMHhlNCwgMHhiOCwKKyAgMHhkYiwgMHg2OSwgMHg4ZSwgMHgwYSwgMHgzMywgMHg3YSwgMHhhOCwgMHg4ZCwgMHg1ZSwgMHg3NSwgMHhhNywgMHgwMSwKKyAgMHg4MSwgMHhjYSwgMHg0YywgMHg1NSwgMHhkMywgMHhhNSwgMHg5MCwgMHg2NSwgMHg1YSwgMHhkMywgMHgwZCwgMHg1NCwKKyAgMHg4NSwgMHg2MiwgMHhjMSwgMHgzMywgMHhkMCwgMHg5OCwgMHg4OSwgMHhmYywgMHgzMSwgMHg4NiwgMHg2MCwgMHgzMSwKKyAgMHg1YywgMHg1OSwgMHgyZSwgMHgxYSwgMHg0MiwgMHgxOCwgMHgyYywgMHgwMywgMHg5YSwgMHhjYywgMHgxOCwgMHg3ZCwKKyAgMHg3ZiwgMHhmNSwgMHhiZSwgMHg2NSwgMHg4ZiwgMHhhMiwgMHg5MywgMHg0OSwgMHhlOCwgMHhiNiwgMHgxNSwgMHhlYSwKKyAgMHhlNywgMHhiNSwgMHg4YiwgMHg3ZSwgMHg0MSwgMHgzZiwgMHgxNCwgMHhmNCwgMHg3NCwgMHhjMCwgMHg3ZiwgMHg5NSwKKyAgMHgxYSwgMHgwYywgMHhiYywgMHhjMSwgMHgzYywgMHhlMCwgMHg4ZCwgMHg0YiwgMHg2NywgMHg0MCwgMHg5OCwgMHgyYiwKKyAgMHg5NiwgMHhlOCwgMHg3MywgMHgwYSwgMHgwNiwgMHhlYywgMHgwMiwgMHhmYiwgMHg5YiwgMHg4NywgMHgwNCwgMHgwNiwKKyAgMHhmZCwgMHg1MywgMHg0YiwgMHhmOCwgMHg1ZiwgMHgwNywgMHhkZCwgMHhkOSwgMHhiYiwgMHg0OSwgMHhlYSwgMHg4NSwKKyAgMHhhMCwgMHhmMCwgMHhmZSwgMHgxZCwgMHgwMywgMHhhNiwgMHhlOCwgMHgwOSwgMHhhMywgMHgyNSwgMHg3NywgMHgxOSwKKyAgMHhmMSwgMHhhMCwgMHhmZSwgMHg4MSwgMHg4MCwgMHg4MywgMHg1ZSwgMHgyNCwgMHg3MSwgMHhkOSwgMHg2MiwgMHhlNSwKKyAgMHgyMCwgMHgyYSwgMHhlOCwgMHhjZSwgMHg4ZiwgMHhmNCwgMHg4YSwgMHhmOCwgMHg2NiwgMHhmNywgMHhkMSwgMHhlYiwKKyAgMHg2MiwgMHhkNCwgMHgwYSwgMHhlNSwgMHhlMywgMHg3ZCwgMHg4YSwgMHhhZCwgMHhlYSwgMHhhYSwgMHgxZCwgMHhhNSwKKyAgMHg0MSwgMHhjMSwgMHhhMiwgMHgzYiwgMHhjOCwgMHgzNywgMHg4YSwgMHg1NywgMHgxMCwgMHgxZCwgMHg3NywgMHg3NywKKyAgMHg3ZSwgMHhmZiwgMHg4OCwgMHg0OCwgMHg4MiwgMHg2MSwgMHgxOCwgMHg3OSwgMHhiYSwgMHgwNCwgMHg1NSwgMHgyNSwKKyAgMHgyNSwgMHg0MiwgMHhhMiwgMHg1NSwgMHg0NCwgMHhhNSwgMHg4MSwgMHgwMSwgMHgzZiwgMHhmZCwgMHg1ZCwgMHg1MiwKKyAgMHhjOSwgMHgwNSwgMHhlZiwgMHgzNSwgMHg5ZCwgMHgyOCwgMHg4YywgMHhiOSwgMHhhMiwgMHhhOCwgMHgwMiwgMHhhYSwKKyAgMHg2MywgMHgyMSwgMHhhYSwgMHhhNSwgMHhhMiwgMHhhZCwgMHgwYSwgMHg5ZSwgMHgwZSwgMHgzYSwgMHg5ZSwgMHg2MSwKKyAgMHgyMiwgMHg5NSwgMHg0NSwgMHg4NiwgMHhmMywgMHhkYywgMHgxNSwgMHhiMiwgMHgwMywgMHg5OSwgMHg5ZCwgMHg4NCwKKyAgMHgwNCwgMHg3NCwgMHhkNSwgMHg0MSwgMHgwZCwgMHhhOSwgMHhlNSwgMHgzNiwgMHgzZCwgMHg5ZSwgMHhkMCwgMHg3MCwKKyAgMHgyMSwgMHgxYSwgMHg4ZiwgMHhmZiwgMHhjMCwgMHg3ZiwgMHhmZiwgMHhmZiwgMHgxOSwgMHg2ZiwgMHhhNCwgMHhiMSwKKyAgMHgxMSwgMHg2YywgMHgyNSwgMHgwOCwgMHgxNSwgMHg1ZCwgMHgyNSwgMHhjYSwgMHhhYiwgMHg1ZCwgMHg3MSwgMHg2NSwKKyAgMHhhOCwgMHgyMiwgMHg4MSwgMHg1NywgMHg1NCwgMHgyOCwgMHg5NSwgMHg3NywgMHg4OSwgMHgyNSwgMHgyOCwgMHg5MiwKKyAgMHg0NiwgMHg0YywgMHgyNCwgMHgyMCwgMHg5MSwgMHg1ZCwgMHg4MywgMHhlMywgMHhiMywgMHhiZSwgMHhiYiwgMHg2NSwKKyAgMHhkNiwgMHg2MSwgMHhmYiwgMHg1ZiwgMHg2NiwgMHg1MSwgMHg5ZSwgMHhlNywgMHg0ZCwgMHgzZiwgMHhhNSwgMHhjMCwKKyAgMHg3ZiwgMHg2ZSwgMHg5MCwgMHhjYSwgMHg4MSwgMHg4ZCwgMHgzZSwgMHhlMSwgMHg2MSwgMHhlMSwgMHgxYywgMHhhOSwKKyAgMHgwZCwgMHhmNSwgMHgwOCwgMHg5NiwgMHg4NCwgMHhmYSwgMHhkNywgMHgxNywgMHg2OSwgMHgyYywgMHgyNywgMHg3OCwKKyAgMHhiYSwgMHhlMywgMHg5YSwgMHhjMCwgMHhjZiwgMHhmYywgMHhlNywgMHgyMSwgMHhiYSwgMHhmNSwgMHg5ZSwgMHgzNCwKKyAgMHhmNSwgMHhiNSwgMHhmMSwgMHg5NiwgMHhiMywgMHg5ZiwgMHg2ZSwgMHgwOCwgMHhhOSwgMHgzOCwgMHg0MSwgMHg3YSwKKyAgMHg4MywgMHhmNSwgMHgyYSwgMHhkOCwgMHg0OSwgMHhmMiwgMHhmMiwgMHg1NSwgMHg1MiwgMHhhYiwgMHhlYSwgMHg1ZiwKKyAgMHg5NSwgMHgzMSwgMHg1ZiwgMHg0ZSwgMHg1ZCwgMHgzNiwgMHgzMiwgMHhiZCwgMHg4ZiwgMHhhZSwgMHg0NSwgMHgzOCwKKyAgMHg3NSwgMHhjOSwgMHg1NiwgMHhhMSwgMHhiNCwgMHg1MiwgMHhjZSwgMHg0NywgMHhjMSwgMHg1NywgMHhkYywgMHhhNywKKyAgMHhiMywgMHg2MCwgMHgxZSwgMHgxYiwgMHhjNSwgMHgwYiwgMHg5NiwgMHhmZCwgMHgwNSwgMHhhMiwgMHhjYywgMHhlNSwKKyAgMHhkZiwgMHg3ZiwgMHgzYSwgMHg1OCwgMHhiMywgMHgxNywgMHg4NywgMHg1NywgMHg1OSwgMHg2MSwgMHhkMSwgMHgyOSwKKyAgMHg3MCwgMHgyNCwgMHhiNSwgMHg4MSwgMHhjMCwgMHg0MSwgMHg1NSwgMHhjOCwgMHgzYSwgMHhkNiwgMHhiMiwgMHgwZiwKKyAgMHgzNywgMHhmMywgMHhhMSwgMHhlMCwgMHg3NywgMHhlMCwgMHgwOSwgMHg1MywgMHg4NSwgMHhiOSwgMHgxZSwgMHhlMiwKKyAgMHhiZiwgMHgzNywgMHhlNywgMHg2NCwgMHg2YSwgMHhlYSwgMHgzZSwgMHgzZCwgMHhlZiwgMHhmZCwgMHgxYywgMHgxMywKKyAgMHhlOCwgMHgyMiwgMHhjMiwgMHhmNCwgMHgwNywgMHg0MSwgMHhkNCwgMHhiYSwgMHhlNywgMHg1OSwgMHg1NCwgMHg1YiwKKyAgMHg3NCwgMHhkNSwgMHgwOCwgMHg2YywgMHhiZCwgMHg1NiwgMHg1OSwgMHg2NywgMHhhOSwgMHg2NywgMHhhOSwgMHgzMSwKKyAgMHg4MSwgMHhkZSwgMHhmYywgMHgyMSwgMHg0NSwgMHg3NSwgMHg1OCwgMHhiNSwgMHg2MywgMHg3ZSwgMHhlOCwgMHg4ZSwKKyAgMHhjMiwgMHgzZSwgMHgzMiwgMHg1MywgMHgxNywgMHgxMCwgMHhhZSwgMHhkYSwgMHhkZiwgMHgxYiwgMHhmNiwgMHgzYywKKyAgMHg3NiwgMHhhNywgMHg1MCwgMHg1ZiwgMHhkNSwgMHhhMCwgMHgzYiwgMHg4MiwgMHg0ZSwgMHhmNiwgMHhmYSwgMHg3YiwKKyAgMHg0ZSwgMHgxMywgMHhhOSwgMHhjZCwgMHg3NSwgMHhkNCwgMHg1MSwgMHg4YiwgMHgwMywgMHhlYywgMHhjMiwgMHg1MiwKKyAgMHg0MCwgMHg3NiwgMHgxNCwgMHhhNiwgMHg1MCwgMHhhNSwgMHgwMiwgMHhmYiwgMHg1MSwgMHgzYSwgMHg3ZCwgMHg1ZiwKKyAgMHgzYywgMHhmNywgMHhlYywgMHgwMCwgMHg4YywgMHhiMiwgMHg1MiwgMHhiYywgMHhjOCwgMHg1MywgMHg3MywgMHgwOCwKKyAgMHhjMiwgMHgwMSwgMHhiNCwgMHhmOCwgMHhkMywgMHg5OCwgMHg4YywgMHhiOCwgMHg1OCwgMHgwMCwgMHgyYiwgMHg1NCwKKyAgMHgxYiwgMHgyNywgMHg3NCwgMHg3YywgMHgxNCwgMHg3ZCwgMHhiOCwgMHhmMSwgMHg0ZSwgMHg2OCwgMHhmYSwgMHhjZCwKKyAgMHg3NCwgMHg4OSwgMHgwYywgMHg1ZSwgMHg4MSwgMHg1YywgMHhjYiwgMHhkZCwgMHgzOSwgMHg5NCwgMHgxMSwgMHhjNiwKKyAgMHgwMSwgMHgzMCwgMHgxOSwgMHg4OCwgMHg1NywgMHgxYSwgMHhhMywgMHg2YSwgMHhhNiwgMHhhZCwgMHgyNSwgMHg5MiwKKyAgMHhiZiwgMHhmNSwgMHhmMywgMHhmYSwgMHhiOCwgMHhmMywgMHgxMywgMHhmMSwgMHgyZiwgMHhjMiwgMHgwMCwgMHg3OSwKKyAgMHhkNSwgMHgzNCwgMHgwOSwgMHg5YiwgMHhhMCwgMHhhNSwgMHgwYywgMHhkZCwgMHhiNSwgMHhlOSwgMHgyYSwgMHhmNiwKKyAgMHg4ZSwgMHg1OSwgMHg5MiwgMHg4MywgMHg4OCwgMHgwNSwgMHhlOSwgMHg4MSwgMHgwYiwgMHhhNywgMHg1NSwgMHhjNiwKKyAgMHhkZCwgMHg4OSwgMHgwYSwgMHg0ZCwgMHhkOSwgMHhjOCwgMHgyZCwgMHhiMywgMHgzMCwgMHgwOCwgMHg1MiwgMHgwMiwKKyAgMHg4NSwgMHgxMywgMHhjYiwgMHhjNSwgMHgxMiwgMHgxMywgMHg4NywgMHg2MiwgMHgxMCwgMHg0ZSwgMHhiYSwgMHg2YSwKKyAgMHhiOCwgMHhiMSwgMHhkMiwgMHgzYywgMHhjYywgMHhlZSwgMHg2NiwgMHhhOSwgMHhkZiwgMHhlOSwgMHhkYSwgMHhmYywKKyAgMHhhNCwgMHhiMSwgMHgxOCwgMHg2ZSwgMHg1OCwgMHg0NCwgMHg2YywgMHg2NywgMHhhNSwgMHg1NCwgMHg0NSwgMHhlOSwKKyAgMHg1MywgMHg0ZSwgMHhhMSwgMHgzMiwgMHg4MiwgMHg3YywgMHhkNywgMHg4MywgMHhlYywgMHhmYSwgMHg5YiwgMHg0MSwKKyAgMHhjMCwgMHgyMSwgMHgxYSwgMHg4ZiwgMHhmMCwgMHgwNywgMHhmZiwgMHhmZiwgMHhmZiwgMHgxZCwgMHg2ZiwgMHhhNCwKKyAgMHhiMCwgMHhkMSwgMHhhYywgMHgxNywgMHgwOCwgMHgxMiwgMHhhOCwgMHhmMiwgMHhiNCwgMHg3MCwgMHg5NSwgMHg2ZCwKKyAgMHgyOCwgMHg4MiwgMHg5MiwgMHg4OSwgMHg1MCwgMHgwOSwgMHgwOSwgMHg2NCwgMHg5YywgMHhkYSwgMHg4OSwgMHg4NCwKKyAgMHgwMiwgMHgzMiwgMHg2MSwgMHhhYiwgMHg3NywgMHg4NiwgMHhhNCwgMHg0OSwgMHgwYSwgMHg2ZSwgMHgyNCwgMHgyMSwKKyAgMHg3MCwgMHg1YywgMHg0YiwgMHhkYiwgMHgzZiwgMHgzZiwgMHg4NCwgMHhmNSwgMHhhZiwgMHhkNCwgMHgzYiwgMHgyMiwKKyAgMHg5ZiwgMHhmMSwgMHgwYiwgMHg5MywgMHhjMCwgMHg3MiwgMHgzNiwgMHhiYywgMHg3YywgMHhmZCwgMHhhMywgMHg5YiwKKyAgMHhkNSwgMHgyMSwgMHgxNywgMHhhZiwgMHg1ZSwgMHhkMiwgMHg2ZCwgMHhkYywgMHhiOSwgMHgzMSwgMHgzYywgMHg0YywKKyAgMHg3YywgMHg4ZiwgMHg1OCwgMHgyNiwgMHhhOCwgMHg3MCwgMHg3NiwgMHgyZiwgMHgxNiwgMHhiZCwgMHg5MywgMHg3YiwKKyAgMHgxNiwgMHhjMSwgMHg1ZCwgMHg2MiwgMHhlOSwgMHhhNCwgMHg4ZSwgMHhmNywgMHg4OSwgMHg1NSwgMHhiMiwgMHhjMCwKKyAgMHg5MiwgMHhhNiwgMHhhYiwgMHgxYSwgMHhiZSwgMHgzMSwgMHg4MCwgMHhlMSwgMHhhYywgMHhiNiwgMHgwYSwgMHg2NCwKKyAgMHg3NCwgMHhmNSwgMHg3YiwgMHgxYiwgMHhiNiwgMHhmMSwgMHgyOCwgMHg3OSwgMHhiZSwgMHg5NywgMHgyNCwgMHhmZiwKKyAgMHgyMywgMHg1NiwgMHhkMSwgMHgzZSwgMHgzOCwgMHg4NywgMHg2MywgMHgzNSwgMHhkNCwgMHhkNSwgMHgzNSwgMHhhNSwKKyAgMHg1NSwgMHhiYiwgMHg1NiwgMHg3MSwgMHg1ZSwgMHhmZSwgMHhiOSwgMHgzOCwgMHg1MSwgMHgxYywgMHhhZiwgMHgyNywKKyAgMHgwYywgMHhjZSwgMHg2MiwgMHgzNywgMHhhOSwgMHhjMiwgMHgyNCwgMHg3MywgMHg5NCwgMHhlOSwgMHg2YywgMHhlZCwKKyAgMHg0ZCwgMHhlMCwgMHgzMSwgMHg0ZiwgMHg1MywgMHhkZCwgMHhhZiwgMHg0MywgMHg1MywgMHg5NywgMHgwZCwgMHhkNSwKKyAgMHgxMiwgMHg4MywgMHg3ZSwgMHg5OSwgMHgzOSwgMHg5NiwgMHgyZSwgMHg0OSwgMHhhMSwgMHg1ZCwgMHhhZSwgMHhkYywKKyAgMHgwNiwgMHgzYywgMHg3NywgMHg4MiwgMHhlMywgMHgwNiwgMHhiNCwgMHg4MywgMHg1OCwgMHg2ZCwgMHgxZSwgMHg5MCwKKyAgMHgxZiwgMHhkMCwgMHhjZCwgMHgyMiwgMHg0NCwgMHg3MiwgMHhkYiwgMHg3ZCwgMHhmNywgMHhhYSwgMHhmYSwgMHhmYiwKKyAgMHgwYSwgMHgwNCwgMHgyNCwgMHg3ZiwgMHg1ZiwgMHhmZSwgMHgyMSwgMHgzZCwgMHgyNiwgMHg2ZiwgMHhhOSwgMHhhNSwKKyAgMHg4ZCwgMHgxZCwgMHhmNywgMHhhYSwgMHg5MCwgMHg4MCwgMHhjNCwgMHgzOSwgMHgwMSwgMHgxMiwgMHgzOCwgMHgxOSwKKyAgMHhkMiwgMHhjOCwgMHg2OCwgMHgzYywgMHg4ZCwgMHg3NywgMHhhMCwgMHhiYiwgMHgzYSwgMHhmMywgMHgxNiwgMHgwMywKKyAgMHg3ZCwgMHhjZiwgMHhmOCwgMHg2NywgMHhkOSwgMHhkYSwgMHgwMCwgMHgzNCwgMHgxNywgMHg0NiwgMHg3OSwgMHhjYywKKyAgMHg5YywgMHhhZCwgMHgxMSwgMHgyYSwgMHgwOSwgMHgyNywgMHhiMCwgMHhhNSwgMHg0NywgMHg1ZSwgMHgwZiwgMHgwYSwKKyAgMHhlYiwgMHg3OCwgMHgxZSwgMHgwZSwgMHg4ZiwgMHgzMCwgMHgwNCwgMHg4NSwgMHg5ZiwgMHhkMiwgMHhjNywgMHgxMiwKKyAgMHg4MCwgMHg4NSwgMHgwOCwgMHgzMSwgMHgwOCwgMHgxZSwgMHhkYiwgMHg0YSwgMHg0NSwgMHg2NSwgMHhmNSwgMHg1NiwKKyAgMHgxNiwgMHgwOSwgMHg0MSwgMHg2YSwgMHhlNCwgMHg1YiwgMHg1YiwgMHgzYiwgMHg4MiwgMHg0MywgMHgzZSwgMHg3ZSwKKyAgMHgzZiwgMHhlMiwgMHg4YSwgMHhjMCwgMHgwZSwgMHhlNiwgMHg0ZiwgMHhhZCwgMHg1MywgMHhjOCwgMHhkZiwgMHhkOSwKKyAgMHhhZSwgMHhiYiwgMHhkZCwgMHhmNSwgMHhmZiwgMHhjZiwgMHgxNCwgMHhlZCwgMHhjZiwgMHg3MSwgMHg1ZSwgMHgxYiwKKyAgMHgyNywgMHhkZCwgMHhjNiwgMHhmMSwgMHg1NiwgMHg0NiwgMHg4NiwgMHg5OSwgMHg4NiwgMHhiOCwgMHg5MSwgMHhlOCwKKyAgMHg1OCwgMHg2OSwgMHhkZSwgMHg4MSwgMHgxMSwgMHg5NSwgMHhmMiwgMHg3OCwgMHg3ZSwgMHgzMCwgMHg4NywgMHhhYSwKKyAgMHhhOSwgMHhkNywgMHg5YywgMHg0NSwgMHg5OSwgMHhhMiwgMHhiNiwgMHg0OSwgMHhiNiwgMHg2OSwgMHg2NSwgMHg5NSwKKyAgMHg5NSwgMHg0NiwgMHg5MSwgMHgyMiwgMHhlOSwgMHg2NywgMHhlZiwgMHgzOSwgMHg2NSwgMHhiNiwgMHg1MCwgMHgxMiwKKyAgMHhmZCwgMHhjMCwgMHgwNCwgMHg3NywgMHg4OSwgMHhhOCwgMHgzNCwgMHgyZCwgMHgyMywgMHhmYSwgMHhmNCwgMHhkZiwKKyAgMHhhNywgMHhmYiwgMHhmZCwgMHg5OSwgMHhlYSwgMHg1MSwgMHgyZiwgMHhmNCwgMHg0NSwgMHgxYSwgMHgxMiwgMHg5ZiwKKyAgMHg5MywgMHg4MiwgMHg3YywgMHhlNCwgMHgyNCwgMHhkZiwgMHhjYiwgMHhmNCwgMHg3YywgMHhmZCwgMHg4MywgMHg0ZiwKKyAgMHg2ZiwgMHgwZCwgMHhkNCwgMHhmMCwgMHg2YSwgMHgwNywgMHgyMSwgMHgxYSwgMHg4ZiwgMHhlMCwgMHgyZiwgMHg3ZiwKKyAgMHhmZiwgMHhmZiwgMHgxZCwgMHg2ZiwgMHhhMiwgMHhjMSwgMHg1MiwgMHgwNiwgMHgxMCwgMHgwNiwgMHg4ZCwgMHgyYSwKKyAgMHhlYiwgMHg4OSwgMHg3NSwgMHg2YiwgMHg1NSwgMHg0MiwgMHg1NCwgMHg1MCwgMHg0NSwgMHgwMiwgMHgyMiwgMHg1OSwKKyAgMHgzOCwgMHhhOCwgMHhjOCwgMHg0NSwgMHgyNywgMHgyZSwgMHhiZSwgMHgwNiwgMHg1OCwgMHgzMSwgMHgwMCwgMHgzYSwKKyAgMHhkZCwgMHg5ZiwgMHg1YSwgMHg4ZSwgMHg1YywgMHgxNiwgMHgwNCwgMHgxYywgMHgwOCwgMHg3ZCwgMHg3MywgMHhmZCwKKyAgMHg3YywgMHhhYSwgMHgzZiwgMHg5ZiwgMHhkYSwgMHhiOCwgMHg3MSwgMHgzMSwgMHg5NywgMHhmMywgMHgyYywgMHgwYiwKKyAgMHg2NiwgMHgxMiwgMHhjYiwgMHg4NiwgMHhkOCwgMHg1ZCwgMHgwMSwgMHg4YiwgMHhkYSwgMHhhMSwgMHg5OCwgMHgyNCwKKyAgMHgyZCwgMHhiZCwgMHg5ZiwgMHgyNCwgMHg0OSwgMHgyYSwgMHg2ZiwgMHhkZCwgMHg3MiwgMHhhOCwgMHg2NywgMHg4OCwKKyAgMHgxNSwgMHg3MywgMHgxMywgMHhhYywgMHgzZCwgMHhlNCwgMHgxYiwgMHhjZiwgMHhjMCwgMHg2YiwgMHg4NCwgMHhhMiwKKyAgMHg1ZiwgMHgyNywgMHgzZSwgMHhmMywgMHhkNiwgMHgzOSwgMHgzYSwgMHg4YiwgMHgwOSwgMHgzZCwgMHgzOCwgMHhlNCwKKyAgMHgyNiwgMHg4MywgMHg3OCwgMHg3YSwgMHg1YywgMHhkMSwgMHhiOCwgMHhkNiwgMHg2NCwgMHhkYywgMHhkMSwgMHhiZiwKKyAgMHhkNiwgMHgyMCwgMHg2ZSwgMHhkMiwgMHg0NywgMHg0MywgMHg0YywgMHgzOSwgMHgzOCwgMHgzNCwgMHg3NCwgMHg2MywKKyAgMHg4NywgMHhmMSwgMHg2ZSwgMHhlYSwgMHhkMywgMHgwYywgMHhmYiwgMHg3MSwgMHg0ZSwgMHgyYywgMHgyNCwgMHgyOCwKKyAgMHg3MCwgMHhiMiwgMHhhZiwgMHhkNywgMHhhOSwgMHg2ZiwgMHg1NCwgMHgyZSwgMHgxYiwgMHhjYSwgMHhiNSwgMHg3YiwKKyAgMHg2YiwgMHg1YiwgMHg5MCwgMHgxMSwgMHg5NiwgMHgyOCwgMHhkNCwgMHg1ZSwgMHhkYywgMHgzYSwgMHhlNiwgMHg1NCwKKyAgMHgyMywgMHgxZiwgMHgyMSwgMHg4YywgMHgwYywgMHg5NywgMHhiYSwgMHhiMCwgMHg4NCwgMHgzYywgMHg4YSwgMHhkZCwKKyAgMHg1ZSwgMHhkNCwgMHhkOSwgMHgwZiwgMHgwZSwgMHg5YSwgMHhiYiwgMHhlNiwgMHgyYSwgMHhiMSwgMHg5MCwgMHgzYiwKKyAgMHg0NywgMHhlOCwgMHhmMywgMHg0MSwgMHgwZCwgMHhlMywgMHg1NiwgMHg1ZCwgMHg5NCwgMHg1YiwgMHhkNCwgMHg0MywKKyAgMHg3MywgMHgzZiwgMHg3MSwgMHg3OSwgMHhkYSwgMHgxZSwgMHhhYiwgMHg2ZCwgMHg2MSwgMHg1NSwgMHhlYywgMHg3NiwKKyAgMHg1NCwgMHg2YSwgMHhiNywgMHg2MywgMHg0MSwgMHgzZCwgMHgzMCwgMHg3MiwgMHhmNywgMHhhNywgMHgwNSwgMHg4ZSwKKyAgMHg5OSwgMHg5YSwgMHhhZCwgMHg3MSwgMHgxZCwgMHgyNSwgMHhiZiwgMHhkNCwgMHg4NiwgMHg5OSwgMHg2ZSwgMHg3MCwKKyAgMHgxMCwgMHgxNSwgMHgzNywgMHg0YiwgMHhkNiwgMHhkZCwgMHgzNSwgMHhmMCwgMHgyNCwgMHg5YywgMHg1YiwgMHhiNiwKKyAgMHhmZSwgMHhmYSwgMHgwMiwgMHhkYywgMHhkOSwgMHhmNywgMHg5ZSwgMHhkNiwgMHgwMCwgMHg5MywgMHhiMywgMHhmOSwKKyAgMHhhOCwgMHg1MCwgMHg3NCwgMHgxOCwgMHg4NCwgMHgwNCwgMHgyYSwgMHg0MSwgMHg4OCwgMHg0MywgMHg0NiwgMHg0YSwKKyAgMHhjYSwgMHg5ZiwgMHgxMCwgMHhiOCwgMHhlMCwgMHg0MSwgMHgwMywgMHg2YiwgMHgyNSwgMHgwOSwgMHgxNiwgMHhlNywKKyAgMHg5YiwgMHhiZCwgMHhiZSwgMHgwZSwgMHhkZCwgMHg4NCwgMHg2MSwgMHhiNywgMHgyZSwgMHg1OCwgMHg3NCwgMHg0MywKKyAgMHhiZCwgMHhmYywgMHg1NSwgMHhkOCwgMHg3MiwgMHgxNCwgMHgzYiwgMHg1ZiwgMHhhYSwgMHhmMywgMHhkNiwgMHhhOCwKKyAgMHhkNSwgMHg0MCwgMHgyMSwgMHhjYywgMHgzZCwgMHgyMCwgMHhiYSwgMHhjMCwgMHg0ZiwgMHgxYSwgMHg1MCwgMHg0YiwKKyAgMHg5OCwgMHg1YywgMHg1NCwgMHgzZSwgMHg3OCwgMHhkMSwgMHhjYywgMHhlOCwgMHgxYSwgMHhkZSwgMHg2MiwgMHhiOCwKKyAgMHhiNiwgMHhjNCwgMHg4YiwgMHgwNSwgMHgzMiwgMHgxYiwgMHhjNSwgMHhmOSwgMHg0NSwgMHhmYiwgMHg5MiwgMHg0OSwKKyAgMHg2NiwgMHg0ZSwgMHgxMCwgMHgzYywgMHhmOCwgMHg1YSwgMHhiMiwgMHhhYywgMHhiYSwgMHhiNCwgMHgzNywgMHhkMSwKKyAgMHg3ZSwgMHhkMywgMHgwMCwgMHg4NCwgMHhiYywgMHhmYSwgMHgzMywgMHg4OSwgMHg3ZSwgMHg2OCwgMHg5NiwgMHgwMCwKKyAgMHg1NywgMHg4MywgMHg4MSwgMHhkMiwgMHgxOCwgMHhiZSwgMHg3NCwgMHg0YiwgMHg4YiwgMHg4ZCwgMHg2ZSwgMHgwMCwKKyAgMHg0NCwgMHg2OSwgMHg2MiwgMHhhNiwgMHgzZCwgMHhiOSwgMHhiMiwgMHhkMCwgMHg1MCwgMHhkNywgMHgxNSwgMHhjNSwKKyAgMHg3MywgMHg3NywgMHg3MCwgMHg5NSwgMHgzZCwgMHhhMSwgMHhiNywgMHgwNywgMHgxZSwgMHgzOSwgMHhjNCwgMHg4NCwKKyAgMHgyMCwgMHhmOCwgMHg2YSwgMHhiNSwgMHhiZiwgMHhhZiwgMHhkYywgMHgzOCwgMHgyMSwgMHgxYSwgMHg5NCwgMHg3NSwKKyAgMHhiZSwgMHg5MiwgMHhjMSwgMHg0NCwgMHgxMSwgMHgxMCwgMHhhMCwgMHg0NywgMHgwNCwgMHgxNywgMHgxMywgMHg1NSwKKyAgMHg1YSwgMHg4YywgMHg4NCwgMHgxNCwgMHg4MCwgMHhhMSwgMHg1OSwgMHgwZSwgMHg2NiwgMHgxYywgMHg0NiwgMHhhNywKKyAgMHhhYiwgMHg5ZCwgMHgyMywgMHg2NSwgMHg2OCwgMHg5NiwgMHg4YSwgMHhlOCwgMHgyMCwgMHhkOSwgMHhlNSwgMHg5ZiwKKyAgMHhkNSwgMHg4MywgMHg5NiwgMHg5ZiwgMHhjYywgMHg3ZiwgMHg3ZiwgMHhkOSwgMHgzYiwgMHgyNSwgMHgyZCwgMHg5YSwKKyAgMHg2MiwgMHgxMCwgMHgwOSwgMHg5OCwgMHhlMiwgMHhmZCwgMHhhNSwgMHhhZCwgMHgzYSwgMHgxYiwgMHhiOCwgMHhlNiwKKyAgMHgxYywgMHhmOSwgMHhkZiwgMHhmNCwgMHhjYSwgMHg3NCwgMHhkMCwgMHg2YiwgMHhmZCwgMHhiMCwgMHhmMSwgMHg4ZCwKKyAgMHhhMywgMHhlNSwgMHg0MCwgMHgzZiwgMHhiNCwgMHgzZSwgMHg5YiwgMHgwZiwgMHg0MSwgMHgwNywgMHhhYywgMHhkNywKKyAgMHgzMSwgMHg1OSwgMHg1NSwgMHg2NCwgMHhiOSwgMHg5YSwgMHg4MSwgMHgxYSwgMHgyOSwgMHg1NSwgMHhmMSwgMHg4YSwKKyAgMHg1YywgMHhkYiwgMHgwNiwgMHg5MiwgMHg5ZCwgMHg2OCwgMHhkMCwgMHhhYiwgMHgxOCwgMHgxMiwgMHg2NCwgMHgxOCwKKyAgMHgzMSwgMHhhOCwgMHhkZiwgMHgxNCwgMHg5YiwgMHgzNiwgMHg2MCwgMHgzYiwgMHhhMiwgMHhjYywgMHhhOSwgMHhmNSwKKyAgMHhkOSwgMHgwYSwgMHg5ZCwgMHg1ZSwgMHg0NSwgMHgzOCwgMHhhMCwgMHhiYywgMHgxZCwgMHgwNiwgMHhhNiwgMHgxYywKKyAgMHhkZiwgMHhhOSwgMHhiYywgMHgzOSwgMHhkNiwgMHhlZSwgMHgxNywgMHg5YSwgMHgzMCwgMHg2MiwgMHhlYiwgMHg1ZCwKKyAgMHhkYiwgMHhkMCwgMHg4NywgMHgyZCwgMHhkOSwgMHg5YywgMHhjOCwgMHhlMSwgMHgyNywgMHg1YSwgMHgwZSwgMHgxMiwKKyAgMHgwOSwgMHg2ZCwgMHhiOCwgMHhhOSwgMHhhMCwgMHg5MCwgMHhiMiwgMHgxNSwgMHhiNSwgMHhiMiwgMHg3YiwgMHhjYywKKyAgMHg2NiwgMHg5MSwgMHhiMCwgMHgzYSwgMHgyNSwgMHg1NCwgMHg4MCwgMHhkYSwgMHg4NCwgMHhkNiwgMHhiOSwgMHhhOSwKKyAgMHhiYiwgMHg3MiwgMHhkYSwgMHg3NCwgMHg1NSwgMHhlYSwgMHhlNywgMHg2MywgMHgyNywgMHg0MiwgMHhiYywgMHgwMywKKyAgMHg5ZiwgMHg2YSwgMHg1ZSwgMHg4MywgMHgyYiwgMHg3NSwgMHgyNCwgMHhjOSwgMHhjOCwgMHhhZSwgMHhkZSwgMHg2ZSwKKyAgMHg5NywgMHgwNywgMHgxYiwgMHhjOCwgMHhlMywgMHhiMiwgMHhmZSwgMHg1MSwgMHgyNSwgMHg4YywgMHgyZCwgMHhlYiwKKyAgMHgxYywgMHgxOSwgMHg0YiwgMHhmYiwgMHg1OCwgMHgzZSwgMHgxZCwgMHhkNCwgMHg1YSwgMHhkMCwgMHgxOSwgMHgyNSwKKyAgMHg5MCwgMHgzZCwgMHg0NCwgMHg5ZCwgMHhkNywgMHg2ZCwgMHhjZCwgMHg4YywgMHgzZiwgMHg2ZiwgMHhjOCwgMHhiOCwKKyAgMHg3ZiwgMHhlZSwgMHgxNiwgMHhlNCwgMHg5YSwgMHg5ZCwgMHg3YSwgMHg2YSwgMHhiMywgMHhiYiwgMHhiYywgMHg4ZCwKKyAgMHg4ZSwgMHg5OSwgMHgwOCwgMHgxMiwgMHgwMSwgMHgwNCwgMHhlOCwgMHgzMSwgMHgwOCwgMHgxNywgMHg3NSwgMHgzOCwKKyAgMHg0MSwgMHgyMywgMHhhMiwgMHhhMSwgMHgwMCwgMHg0MiwgMHg4MywgMHhmYSwgMHg5NCwgMHg1MCwgMHhlNCwgMHhlZSwKKyAgMHgwZCwgMHhjNywgMHhkOSwgMHgxNiwgMHg1NywgMHhiZSwgMHg4YiwgMHhkZiwgMHhiNCwgMHhhZSwgMHhkMCwgMHhhMCwKKyAgMHhhNywgMHhkNSwgMHgxOCwgMHg5YSwgMHg0NCwgMHg0YywgMHg1OCwgMHgxZCwgMHhkNCwgMHhiNCwgMHgyZCwgMHgzOSwKKyAgMHgzMSwgMHhmYSwgMHg5ZCwgMHgxYSwgMHg3YSwgMHhiNCwgMHg5OCwgMHhjYiwgMHhkOSwgMHgyNywgMHhmMiwgMHhjNCwKKyAgMHhhYywgMHg1ZiwgMHg0YywgMHg1MSwgMHg2MywgMHhiZiwgMHg1NiwgMHgxYSwgMHhlNCwgMHg3NywgMHg4YywgMHhmYywKKyAgMHhhMSwgMHg1NywgMHhiNiwgMHg2OCwgMHg2NiwgMHhlYSwgMHhiMywgMHhlYSwgMHg2YSwgMHhjYiwgMHg4ZCwgMHgyZiwKKyAgMHg3ZiwgMHg4ZSwgMHg0NCwgMHhlMCwgMHgzMiwgMHg0MCwgMHg4YywgMHg1YSwgMHgyYSwgMHgyZCwgMHhlNSwgMHhiOCwKKyAgMHhjOSwgMHgyMSwgMHgwOSwgMHhmYiwgMHhjYSwgMHg3OSwgMHgzNCwgMHg0NywgMHhiMCwgMHg5MCwgMHg5NCwgMHg2ZiwKKyAgMHhkZSwgMHg5MSwgMHgxMiwgMHgxZSwgMHhkNSwgMHgxNSwgMHg4MiwgMHg2OSwgMHg0ZSwgMHhmMCwgMHg3MCwgMHgwYSwKKyAgMHhjYywgMHg0NywgMHg1MCwgMHgwMiwgMHg0YiwgMHhmOCwgMHhhZSwgMHhmMSwgMHgxMiwgMHhjNSwgMHhjNiwgMHhlZSwKKyAgMHg3MywgMHgyMSwgMHgwZCwgMHgzZSwgMHhhZiwgMHgzMywgMHg1OSwgMHg0NCwgMHg1YiwgMHgzMywgMHhlNywgMHhkZSwKKyAgMHhjNSwgMHhkZCwgMHgwNSwgMHhmZCwgMHg5ZSwgMHg1ZCwgMHgxYiwgMHg1MiwgMHhiZSwgMHhlOSwgMHhlMiwgMHhlNiwKKyAgMHg5MywgMHg0OCwgMHg3MCwgMHgyMSwgMHgxYSwgMHg5NCwgMHg5NSwgMHhiZSwgMHg4YiwgMHgwNSwgMHg0MSwgMHg5MiwKKyAgMHhkOCwgMHg0NiwgMHgxMCwgMHg1ZiwgMHg0MSwgMHg3MCwgMHg2OCwgMHhlMywgMHgxMiwgMHhjMCwgMHgwMCwgMHgyZiwKKyAgMHg5MSwgMHg5MywgMHg0MiwgMHg0MCwgMHg0NSwgMHhlZSwgMHhkMiwgMHg2ZiwgMHg4MywgMHhiNCwgMHgyYywgMHhkMSwKKyAgMHgxMCwgMHgxMCwgMHhmZSwgMHhjNSwgMHhhNCwgMHgzZiwgMHgxYiwgMHg5MiwgMHgzMiwgMHg1MSwgMHgyOSwgMHgyYSwKKyAgMHhiYSwgMHg1ZCwgMHhmYywgMHg1YiwgMHg0NCwgMHgxNiwgMHg2YiwgMHhmZiwgMHgzNywgMHgwMywgMHgzMywgMHhlZSwKKyAgMHgzNSwgMHhjNSwgMHg3NSwgMHhhZSwgMHgxNSwgMHhkMiwgMHgzMCwgMHhkNiwgMHg1ZCwgMHhlMCwgMHhlNiwgMHg4YywKKyAgMHg3MiwgMHgyYiwgMHg5OSwgMHg1NCwgMHg2NiwgMHhhOSwgMHhlYiwgMHg1ZiwgMHhjYiwgMHgwMiwgMHhjNywgMHgzYiwKKyAgMHhhMSwgMHgxYywgMHg0YSwgMHg4NCwgMHhmNiwgMHhmYiwgMHgzYSwgMHg0YiwgMHg3NiwgMHg4MywgMHgyZiwgMHhhNCwKKyAgMHg2MCwgMHg4MSwgMHg0OCwgMHg0NiwgMHg3MSwgMHg5MywgMHg3NCwgMHg1MCwgMHhlYywgMHhhOSwgMHhmOCwgMHhlNSwKKyAgMHg1NiwgMHgwOSwgMHhiYiwgMHg3YSwgMHg5NCwgMHhjMCwgMHg4YywgMHhmNiwgMHg5OSwgMHg3YywgMHhkNSwgMHgzNSwKKyAgMHgwNCwgMHg0NSwgMHg0NiwgMHg0MCwgMHgzNCwgMHg5MiwgMHhjNCwgMHhhMSwgMHhjMSwgMHgzMiwgMHg2MSwgMHg1MCwKKyAgMHg2NywgMHhkZSwgMHhiYywgMHhkYiwgMHhkMiwgMHg4NSwgMHgyZSwgMHgwMSwgMHg0MiwgMHhhMywgMHgyOSwgMHg3NywKKyAgMHhjMSwgMHhhNSwgMHg0MiwgMHhlNCwgMHg4NCwgMHg4NCwgMHg1NSwgMHgzOCwgMHgxMCwgMHhkZCwgMHg5OCwgMHg2YywKKyAgMHhmNSwgMHhhZSwgMHhmOSwgMHhlOCwgMHg4NCwgMHg3MiwgMHg5YiwgMHhlYywgMHhiOSwgMHgxZiwgMHhhMiwgMHgwNywKKyAgMHg0MiwgMHhhNSwgMHhiZSwgMHg3MywgMHg2OSwgMHg3YiwgMHgxYywgMHhkNCwgMHhmNywgMHgxOSwgMHg0ZCwgMHgyYiwKKyAgMHg2MiwgMHg0YiwgMHg0NCwgMHhlNiwgMHhhNSwgMHg2NiwgMHhhYiwgMHhmYywgMHhhYSwgMHg2MywgMHgzYywgMHhiMSwKKyAgMHhlMiwgMHg2MiwgMHhhNCwgMHhkNywgMHhjYiwgMHgyZSwgMHhlOCwgMHg4MCwgMHg3ZCwgMHgwYywgMHhiNiwgMHg2OCwKKyAgMHhjMCwgMHhjNywgMHhmNCwgMHhmYiwgMHg4MSwgMHg2NSwgMHhiNCwgMHg2ZiwgMHg1OCwgMHhiMiwgMHgxMSwgMHhkOCwKKyAgMHg3ZiwgMHg2MywgMHhkZCwgMHg1NywgMHgxMywgMHhiNCwgMHgyMywgMHg1OCwgMHg0NCwgMHgzNiwgMHg4OCwgMHg5MCwKKyAgMHhhZSwgMHhjMSwgMHg0YywgMHgwZSwgMHhjNywgMHgxMCwgMHgyNSwgMHhjMywgMHgwNywgMHg2OSwgMHgyNSwgMHgwYywKKyAgMHg5YywgMHg3YywgMHhkZiwgMHg3NCwgMHgyNCwgMHg2ZCwgMHgxMCwgMHhlMSwgMHg5MiwgMHgwNCwgMHg0MiwgMHgwYSwKKyAgMHg5MCwgMHhlMywgMHg4MiwgMHg5MywgMHg0ZCwgMHgzMSwgMHgwOCwgMHhlMywgMHg5NCwgMHgxMCwgMHhjNSwgMHhlMCwKKyAgMHhhNiwgMHg3NCwgMHg0MywgMHhhNywgMHhiYywgMHhlNywgMHg4YywgMHg1NSwgMHhkOSwgMHg4ZSwgMHhlZCwgMHg4OCwKKyAgMHhhZiwgMHg2YiwgMHg1OCwgMHg4MSwgMHhmMiwgMHhkZCwgMHgyYiwgMHgxMSwgMHg2OSwgMHhkNiwgMHg5MywgMHg2ZSwKKyAgMHhmYywgMHhkZSwgMHgxZCwgMHg0ZCwgMHgxZSwgMHhhZiwgMHg5NSwgMHg0MywgMHgzMiwgMHg0YywgMHgzYywgMHgzYywKKyAgMHhhZSwgMHg1ZSwgMHhiZiwgMHg1ZCwgMHhhYiwgMHhjYiwgMHhmYiwgMHhhOCwgMHhkZCwgMHhhZiwgMHgwNCwgMHg2YywKKyAgMHhhNSwgMHg1NCwgMHhjMiwgMHg5ZSwgMHg4ZCwgMHgwZSwgMHhlZiwgMHg1NywgMHgyZSwgMHg4ZCwgMHhkOSwgMHhiNiwKKyAgMHgxNCwgMHhkYiwgMHg1YiwgMHgxYSwgMHgwZiwgMHg2ZSwgMHg3NSwgMHhjOCwgMHg5OSwgMHhkNCwgMHgwOCwgMHhiNCwKKyAgMHg2MiwgMHhjMCwgMHg3NiwgMHgwYiwgMHg0MSwgMHg0NywgMHgzMywgMHg2ZiwgMHg2NywgMHhjZiwgMHg1NiwgMHgzNiwKKyAgMHg4YywgMHgzNywgMHgwMCwgMHg1MCwgMHg0YywgMHgwMiwgMHg1ZCwgMHgzYiwgMHg2OCwgMHhjNiwgMHhkNiwgMHgwNCwKKyAgMHgwMCwgMHgxNiwgMHg4YywgMHg5OCwgMHg0MywgMHgzZCwgMHhiOCwgMHhmNCwgMHhhYywgMHg4NSwgMHgyOSwgMHgwYiwKKyAgMHhjNCwgMHg5YSwgMHhlMCwgMHgyNiwgMHgzNCwgMHgxYywgMHhiOSwgMHg3YiwgMHhhNiwgMHg2MiwgMHhjOSwgMHhkNSwKKyAgMHg4MiwgMHg3ZiwgMHgzZCwgMHgzZSwgMHgzOCwgMHg0NiwgMHgyMiwgMHhkZiwgMHg2ZCwgMHg2YywgMHgwZiwgMHgzZiwKKyAgMHhjYywgMHgzZCwgMHg3NSwgMHg3ZiwgMHgwNCwgMHg5MCwgMHg5NiwgMHhiOSwgMHhlNCwgMHgzYiwgMHhhZCwgMHgxMCwKKyAgMHg3MCwgMHgyMSwgMHgxYSwgMHg5NCwgMHhhZCwgMHhiZSwgMHg4YywgMHhjNCwgMHgyMiwgMHg5OCwgMHg4OSwgMHg0MSwKKyAgMHg1ZCwgMHgxZCwgMHgwZSwgMHg4MCwgMHhlMSwgMHg1NiwgMHgwMCwgMHgwMCwgMHgwNiwgMHhiZSwgMHhhOSwgMHhjNSwKKyAgMHhkZCwgMHhiNCwgMHgzOSwgMHg2OCwgMHgyMywgMHg1NiwgMHhhMywgMHhlZiwgMHgzYywgMHhmZiwgMHhiZCwgMHg3NSwKKyAgMHg2YywgMHhmOCwgMHhjOCwgMHgyNywgMHhlNSwgMHgyMywgMHg5ZiwgMHgyMSwgMHg4ZSwgMHhlYywgMHhkMSwgMHhlZSwKKyAgMHg1ZCwgMHhlYiwgMHhkMiwgMHg3OCwgMHg1ZCwgMHg5NywgMHhkMSwgMHg5NiwgMHgxNiwgMHgyMSwgMHg5NCwgMHgxZSwKKyAgMHhiMCwgMHhjYSwgMHhjMCwgMHgyMiwgMHhlOSwgMHgwZiwgMHgwYywgMHhhYSwgMHhiMiwgMHhjNCwgMHhjMSwgMHhjNywKKyAgMHg5MSwgMHhhYywgMHhiMiwgMHg4YiwgMHgwNiwgMHg5NCwgMHhlOSwgMHgxNywgMHhiZiwgMHgxYSwgMHg5YiwgMHg4YywKKyAgMHgxOSwgMHhhYywgMHhkZSwgMHhhOSwgMHg2NCwgMHgyNSwgMHhkOSwgMHgyOCwgMHgxNiwgMHgzNiwgMHgyZCwgMHg0NSwKKyAgMHg5NiwgMHgxOSwgMHhlZiwgMHgwZCwgMHhkMCwgMHg1ZSwgMHg5ZSwgMHgxZiwgMHg3NCwgMHhhZCwgMHgwMSwgMHg5ZCwKKyAgMHgyYSwgMHg5YSwgMHhiYiwgMHhlNSwgMHhiOSwgMHhlOSwgMHhlZiwgMHhmNywgMHhiYiwgMHhkNywgMHhmYywgMHgzZiwKKyAgMHg4NywgMHgxNywgMHhkNiwgMHhiZCwgMHg5NywgMHhmMiwgMHhlZCwgMHhlNywgMHg5YywgMHhmOSwgMHgzYywgMHhjNSwKKyAgMHg5YSwgMHgzOCwgMHgzOSwgMHg5YiwgMHhhYiwgMHhlNCwgMHgxYSwgMHg2YywgMHhjYSwgMHhiZCwgMHg4NiwgMHgzOCwKKyAgMHg5MCwgMHhjNywgMHhjNiwgMHgxNSwgMHhlMCwgMHg4ZiwgMHgyNCwgMHg5MywgMHg2OSwgMHgwMiwgMHhiZSwgMHg5NCwKKyAgMHgyMCwgMHhmYiwgMHg4MywgMHhlOCwgMHhjYywgMHg0NywgMHhlNiwgMHgyZCwgMHgyYSwgMHgyMywgMHgwNSwgMHg4OSwKKyAgMHg3NiwgMHg1YSwgMHgwOSwgMHg5NiwgMHgyZCwgMHhhNiwgMHg1ZCwgMHgyNCwgMHg2YSwgMHg1YywgMHg4MSwgMHg4ZCwKKyAgMHg5OSwgMHg1NCwgMHg5MSwgMHhkNiwgMHg2MSwgMHg3YSwgMHg2MiwgMHg2OCwgMHhjMSwgMHg2NCwgMHg1MCwgMHgwYSwKKyAgMHhlNSwgMHgyMywgMHgzZSwgMHhiNCwgMHg2ZiwgMHgzMywgMHgzYSwgMHg4MCwgMHgwMCwgMHg2MCwgMHgzMCwgMHg3NiwKKyAgMHhkZSwgMHhlZiwgMHg0NCwgMHhjMCwgMHg3MywgMHhhOSwgMHgzMywgMHhiZSwgMHg2NCwgMHhhNiwgMHhhZSwgMHg4MiwKKyAgMHg2ZCwgMHg4MCwgMHgwMSwgMHgxZiwgMHg2NywgMHhhNCwgMHg0MSwgMHhkNCwgMHg2MywgMHgxMCwgMHgwMiwgMHg0OSwKKyAgMHhhNiwgMHg1ZCwgMHhiNCwgMHhjYiwgMHg1YSwgMHg1MiwgMHgyMCwgMHhjMSwgMHg5NiwgMHgxNywgMHgzNSwgMHg5ZSwKKyAgMHgwNiwgMHg3NSwgMHg5MSwgMHgyNiwgMHg2MSwgMHhmZiwgMHg3NiwgMHhjNywgMHgwZSwgMHg3YSwgMHhiOCwgMHhlYSwKKyAgMHg3MCwgMHgxMywgMHgyYiwgMHhjOSwgMHgyMCwgMHgzOSwgMHgzYywgMHgzZSwgMHg0NSwgMHg4YywgMHhiMCwgMHhjMiwKKyAgMHhkNSwgMHg0YywgMHg4ZiwgMHgwMSwgMHhhMCwgMHg0ZSwgMHhkOCwgMHhmNCwgMHgzYSwgMHgzZSwgMHgxZiwgMHg1ZiwKKyAgMHgzYywgMHg4NSwgMHhlZiwgMHhmNywgMHg1YiwgMHg1ZCwgMHhjZiwgMHg0ZiwgMHhkNCwgMHhlYSwgMHg4OSwgMHhlNywKKyAgMHhjMywgMHg0NSwgMHgwZiwgMHhjMiwgMHhhZSwgMHg3MiwgMHg5OCwgMHg1NiwgMHgzYywgMHhmYywgMHg3NSwgMHgwZSwKKyAgMHhlZiwgMHg3NiwgMHhjZCwgMHg1MCwgMHg1OCwgMHhkYSwgMHhmZCwgMHhlYywgMHgzYiwgMHg3NSwgMHg0ZCwgMHhlMywKKyAgMHg0YSwgMHhiOSwgMHg0NCwgMHg0MiwgMHg1OCwgMHhjYSwgMHg2MCwgMHgwMCwgMHg3MiwgMHhmOSwgMHhlNSwgMHg3NywKKyAgMHg0YSwgMHg1ZiwgMHgyYSwgMHg5NiwgMHg4NiwgMHhlMywgMHgwMSwgMHgzMiwgMHgwZSwgMHg2YiwgMHhkZSwgMHhjOSwKKyAgMHgxNSwgMHgxNSwgMHg0NSwgMHg1NCwgMHgyNiwgMHgyZSwgMHg0NSwgMHg0MCwgMHg1ZSwgMHhjYiwgMHgyOSwgMHhkNSwKKyAgMHg5NSwgMHg0ZCwgMHgyYSwgMHgwOCwgMHgyMiwgMHhmOSwgMHg1ZSwgMHg3NCwgMHhlOCwgMHhlMSwgMHgyNSwgMHgyNywKKyAgMHhmMCwgMHg2MiwgMHg5NSwgMHg5MywgMHg0YSwgMHgwYSwgMHgyYywgMHgyNiwgMHhhYywgMHhkMCwgMHg2OCwgMHg2MCwKKyAgMHg5NSwgMHhkOSwgMHgxYiwgMHg3ZiwgMHgzYiwgMHhhYywgMHgwYSwgMHg3NywgMHhmMCwgMHgyMSwgMHhlNSwgMHhjNiwKKyAgMHg3ZSwgMHg1ZCwgMHg3YywgMHg3ZSwgMHg3MCwgMHhlMCwgMHgyMSwgMHgxYSwgMHg4ZCwgMHhjZiwgMHg5MCwgMHgxZiwKKyAgMHhmZiwgMHhmZiwgMHgyZCwgMHg2ZiwgMHg4MiwgMHgzMSwgMHg1MCwgMHg0NiwgMHhiMiwgMHgxYSwgMHgwNCwgMHg0MiwKKyAgMHgxZSwgMHg2MywgMHg5YiwgMHhiNiwgMHhhMiwgMHhjOSwgMHg2OSwgMHhiZSwgMHgxMCwgMHgwNCwgMHhhMSwgMHgwMCwKKyAgMHgyYSwgMHg0OSwgMHhlMSwgMHg3NCwgMHg3YSwgMHhmNywgMHg3MSwgMHhmZCwgMHgyNSwgMHhjNSwgMHhmOCwgMHgzMiwKKyAgMHgwMSwgMHgxNywgMHg2MywgMHhhYywgMHg0OSwgMHhhNCwgMHhiZSwgMHhlOSwgMHhkOCwgMHg5ZiwgMHhmMywgMHhmNSwKKyAgMHhhNCwgMHhmNSwgMHg4OSwgMHhiOSwgMHg3MiwgMHhlNSwgMHhiMCwgMHhjNSwgMHg4OCwgMHg2OSwgMHgxOSwgMHhjNCwKKyAgMHg0MywgMHg1NywgMHhjNywgMHgzMywgMHg4YSwgMHhhNiwgMHg3MiwgMHhkYSwgMHhiNiwgMHgxNSwgMHg5YywgMHhiMywKKyAgMHg3YywgMHhiMCwgMHg2YywgMHgyNiwgMHgxMCwgMHg4NiwgMHg1ZSwgMHg3NSwgMHg1NiwgMHhhMywgMHg4MCwgMHg0YiwKKyAgMHhhZiwgMHhjYSwgMHhmOSwgMHhhMywgMHhjNCwgMHg5ZCwgMHg2ZiwgMHhlYywgMHg0ZSwgMHg2OCwgMHg2OCwgMHg1OCwKKyAgMHhiOSwgMHg0NCwgMHgzNywgMHg2YywgMHg3NiwgMHg4MCwgMHgwOSwgMHg4NCwgMHhhMSwgMHg3YywgMHhhMywgMHgxZCwKKyAgMHhmNCwgMHhkNiwgMHg4MywgMHg4NSwgMHhkNywgMHg3OSwgMHgwNCwgMHg3MywgMHg4MiwgMHgwZCwgMHgwOCwgMHhjNiwKKyAgMHg5OCwgMHgxNSwgMHhiMiwgMHhmOSwgMHg5NCwgMHg2MywgMHgwNywgMHhhNSwgMHg2ZSwgMHgxOSwgMHgzNCwgMHhkNywKKyAgMHg0YywgMHhiZSwgMHg5MSwgMHg2YiwgMHhjZSwgMHgzMSwgMHg5YiwgMHg1YSwgMHgxMywgMHhjOCwgMHgxNiwgMHg4NCwKKyAgMHg2ZSwgMHhkMSwgMHhkNiwgMHhiNiwgMHhjZCwgMHhhMywgMHgzYiwgMHhjOCwgMHhkZCwgMHg2NCwgMHhlZiwgMHhmNSwKKyAgMHgwOCwgMHg3NSwgMHg3YSwgMHg1MCwgMHhiMSwgMHg3NywgMHgyZSwgMHg5MiwgMHhjMSwgMHhkOCwgMHhhYSwgMHg4MywKKyAgMHgxNCwgMHgxMSwgMHg4OCwgMHg1YiwgMHg0MiwgMHg1NywgMHg1MiwgMHg1MiwgMHhmOSwgMHhiYSwgMHhhOCwgMHgzMSwKKyAgMHhlYiwgMHg4MiwgMHg4MSwgMHgzZCwgMHgyOSwgMHgzNywgMHg3ZCwgMHgzOCwgMHg0OCwgMHhhYiwgMHgwZCwgMHhhMywKKyAgMHg1MCwgMHgyYiwgMHgyOCwgMHhjZCwgMHgyOSwgMHhmYywgMHg0NiwgMHhmMywgMHgzOSwgMHg2NSwgMHg1OCwgMHgyNCwKKyAgMHg2YywgMHhmNCwgMHg1YiwgMHgxNSwgMHgyMSwgMHgwNCwgMHgyZSwgMHgyMiwgMHgwMCwgMHg2OCwgMHg4MCwgMHhkNCwKKyAgMHg1YywgMHg2OCwgMHhiMSwgMHg0MiwgMHg2MSwgMHgwMCwgMHgzOSwgMHhiYSwgMHhlZiwgMHg0ZSwgMHhlMiwgMHhlYSwKKyAgMHhiZSwgMHg2MSwgMHhjNywgMHg1ZSwgMHgyNiwgMHhkZSwgMHhlMiwgMHg4MiwgMHgyZSwgMHg0MSwgMHgyMiwgMHhhOCwKKyAgMHg4OSwgMHg5MywgMHhlNSwgMHhjZSwgMHhlZiwgMHhlOSwgMHg5NCwgMHhkMCwgMHhkMCwgMHgzNiwgMHgwOSwgMHg3NiwKKyAgMHgxZSwgMHhkOSwgMHg5ZCwgMHhlYiwgMHhlYywgMHg2NywgMHhkMSwgMHhlYiwgMHg5YywgMHhiYiwgMHg5MiwgMHgzNiwKKyAgMHgzZiwgMHhhMiwgMHg1MywgMHg3MSwgMHgzNCwgMHhlNCwgMHg4ZCwgMHgyYSwgMHhjYywgMHhlZiwgMHhjZiwgMHhiOSwKKyAgMHgyNCwgMHhkNiwgMHhjYSwgMHgxYywgMHhjZiwgMHhlYiwgMHhlNSwgMHg3MCwgMHgxZiwgMHg0ZSwgMHhkNiwgMHhmZCwKKyAgMHg0ZCwgMHhiMCwgMHg2ZSwgMHhiYSwgMHgzNCwgMHhmMiwgMHgzMSwgMHhlZiwgMHgxYiwgMHgxNCwgMHgyNiwgMHg4YSwKKyAgMHgzZCwgMHhjYSwgMHhhYSwgMHgyNywgMHhmNywgMHhmNSwgMHgwNiwgMHgxZSwgMHg0ZCwgMHg2NiwgMHhhZSwgMHhjMSwKKyAgMHg0OCwgMHgwNywgMHg0ZSwgMHhiNCwgMHgzNywgMHhjMSwgMHg0MCwgMHgzMywgMHg1NSwgMHgzZiwgMHgxNCwgMHhkZCwKKyAgMHgwMiwgMHg4YiwgMHgxMywgMHg5YiwgMHg5NCwgMHg2MCwgMHgwNCwgMHgzYywgMHgxNSwgMHhiOCwgMHg5ZCwgMHg1MCwKKyAgMHg4ZiwgMHgzMSwgMHg3YiwgMHgwNSwgMHhhMywgMHg2OCwgMHgyOSwgMHhhYSwgMHhiZiwgMHgzOSwgMHg3ZCwgMHhlZCwKKyAgMHgyOCwgMHgxMSwgMHg0YiwgMHgzYSwgMHhhNywgMHgwZCwgMHgzYywgMHg3ZCwgMHhlMywgMHg3YSwgMHg0OCwgMHhhNiwKKyAgMHgxNiwgMHhhYSwgMHhlOCwgMHgyNSwgMHgxMSwgMHg3YiwgMHg1YSwgMHhhYiwgMHg0ZCwgMHhlZCwgMHgwYywgMHg1ZSwKKyAgMHg2NywgMHg2ZSwgMHgyOCwgMHg4NCwgMHhmNCwgMHgyYiwgMHgxOCwgMHgzOCwgMHg1NiwgMHgyMSwgMHhlYSwgMHgzNCwKKyAgMHgyZCwgMHg1NiwgMHhjMCwgMHgwMCwgMHhlMCwgMHgyMSwgMHgxYSwgMHg4ZiwgMHhjZSwgMHgxOCwgMHgxZiwgMHhmZiwKKyAgMHhmZiwgMHgyZCwgMHg3MCwgMHg4MSwgMHhiMSwgMHg4OCwgMHg4MiwgMHhhMywgMHgxYiwgMHg1OCwgMHhiOCwgMHhkNCwKKyAgMHgyZSwgMHhiOCwgMHgxMSwgMHgyYywgMHhiMCwgMHgwMCwgMHgwNSwgMHgwNywgMHgyZiwgMHhhOSwgMHg3MSwgMHhmZiwKKyAgMHhkNCwgMHgzMSwgMHhmOCwgMHhmNywgMHg5ZiwgMHg0MiwgMHg3MCwgMHgwYiwgMHg5ZSwgMHg5NSwgMHhhNCwgMHgzMywKKyAgMHg0NSwgMHhjYiwgMHhkZSwgMHg3OCwgMHg0ZSwgMHgxNywgMHhlYywgMHhiYywgMHhkZCwgMHhmOCwgMHg4ZSwgMHgzZiwKKyAgMHhiMiwgMHhlMiwgMHhmMCwgMHhmMywgMHhmYiwgMHg3NywgMHgzNCwgMHhhMiwgMHhhNCwgMHg3MSwgMHg4ZiwgMHhiNiwKKyAgMHgzOSwgMHhjNiwgMHg5OCwgMHg5MSwgMHgxYiwgMHhhZiwgMHhmZSwgMHg3YiwgMHg5NywgMHg1MCwgMHhlMywgMHhkMCwKKyAgMHhiMCwgMHg3OCwgMHgzYiwgMHgyYiwgMHhjZCwgMHhjNCwgMHg1ZCwgMHhhYiwgMHhlNCwgMHhlMywgMHg1NSwgMHg1ZCwKKyAgMHhjYSwgMHhlOSwgMHg2YywgMHhlMywgMHg0MSwgMHg3OSwgMHg4OSwgMHhmNiwgMHg1NCwgMHgzMiwgMHhiMywgMHhhNCwKKyAgMHg2MCwgMHg3YiwgMHhlNywgMHgzMiwgMHg3NiwgMHhmMiwgMHhkMiwgMHgyNSwgMHg1NSwgMHhhNSwgMHg2MSwgMHhkNCwKKyAgMHg5YSwgMHhlNywgMHhjYSwgMHg0YywgMHhkNiwgMHhhMiwgMHgwOCwgMHhiYSwgMHhmOCwgMHg4YSwgMHgyYiwgMHhiMCwKKyAgMHhjNCwgMHgwYSwgMHg0OCwgMHhlMSwgMHhiOSwgMHg0NCwgMHg1YywgMHg4MSwgMHg5MCwgMHhhNCwgMHgyMCwgMHgxZCwKKyAgMHg0NywgMHgyYiwgMHgxYywgMHhjZSwgMHg2NSwgMHhhMCwgMHg2NSwgMHhmOCwgMHhjYywgMHhlMSwgMHg3NywgMHg5ZSwKKyAgMHg2YiwgMHgxMiwgMHhhZiwgMHhhZCwgMHhiOSwgMHg0NywgMHhmZSwgMHhjZCwgMHgzOCwgMHg3YiwgMHhhNywgMHg2MCwKKyAgMHg4NiwgMHhlNCwgMHhiNywgMHg2NiwgMHg4YywgMHg2MCwgMHg4YSwgMHg0OCwgMHhhMSwgMHg5NiwgMHg1MywgMHhjOCwKKyAgMHgyNywgMHhiNywgMHhkZiwgMHhhNywgMHgwYSwgMHg1YSwgMHg1MSwgMHhhNCwgMHhhMCwgMHhlMSwgMHg2ZSwgMHg3MSwKKyAgMHg2MywgMHhiZCwgMHhhYiwgMHg1ZiwgMHhlYiwgMHhlMSwgMHhhMCwgMHg5YSwgMHg1OCwgMHhiYiwgMHgyOCwgMHg2ZSwKKyAgMHgzNCwgMHgzNiwgMHhlYiwgMHgzOCwgMHgwNCwgMHhiNSwgMHhiYSwgMHg5MCwgMHg2NiwgMHgxNywgMHgyNCwgMHgxYiwKKyAgMHhiYiwgMHhkMSwgMHg3NiwgMHg4NSwgMHg5NiwgMHhiNiwgMHhhMSwgMHg0NCwgMHhhNSwgMHgwMCwgMHgxNCwgMHg2YywKKyAgMHgyNiwgMHgxNywgMHg0NywgMHgxYiwgMHhjMSwgMHhmNCwgMHg5MywgMHg1YiwgMHhhYSwgMHhhOSwgMHhmZCwgMHg0NCwKKyAgMHhhYiwgMHgxYSwgMHg1YSwgMHgyNiwgMHgyOCwgMHg3NCwgMHhmMywgMHhiOCwgMHg0NywgMHg2NCwgMHgyMiwgMHgyNywKKyAgMHhhZiwgMHg1OCwgMHhlMywgMHg4YiwgMHgwNywgMHg5ZiwgMHg1MCwgMHhlNCwgMHg4ZSwgMHhlNiwgMHhlZCwgMHhlOSwKKyAgMHgwZCwgMHg3ZiwgMHhkZSwgMHg1ZCwgMHhhZSwgMHhkOSwgMHgwMiwgMHg2MSwgMHgxNSwgMHg1YiwgMHgzNCwgMHg2YywKKyAgMHgyMCwgMHgyZCwgMHgzOSwgMHgzNSwgMHg2OSwgMHgzYiwgMHhkZSwgMHhlMSwgMHg2MSwgMHhjOCwgMHhkYywgMHhiMCwKKyAgMHg3NSwgMHgzNywgMHg4MiwgMHg0YSwgMHg4MiwgMHhkZCwgMHhhOCwgMHgzOSwgMHg4NSwgMHg0NywgMHg4MCwgMHg0YiwKKyAgMHg0OCwgMHhiZSwgMHhkYSwgMHhmNCwgMHhjNSwgMHg3OSwgMHg4MiwgMHg5MiwgMHhiZiwgMHgwYSwgMHg4NCwgMHg5ZCwKKyAgMHg2NiwgMHg1OCwgMHgzZiwgMHhkNiwgMHhjMCwgMHhlMywgMHhkNywgMHhlMCwgMHhlMSwgMHgxYywgMHg2NiwgMHgwOCwKKyAgMHhkNSwgMHg0OSwgMHg5NCwgMHg2OSwgMHgwMCwgMHgyZCwgMHgzYywgMHg2MSwgMHg2MSwgMHgyMSwgMHgxNCwgMHg0YywKKyAgMHhlOSwgMHgyYSwgMHgxZCwgMHg0YywgMHhkNywgMHhkOSwgMHgwNywgMHhkNCwgMHg0MiwgMHgwOSwgMHhiNSwgMHg0NywKKyAgMHhiYSwgMHg3NywgMHg4NiwgMHg1MiwgMHhhMiwgMHhhOCwgMHg1ZSwgMHhhNSwgMHg2YiwgMHg0MCwgMHg2YSwgMHg3MywKKyAgMHg0NywgMHgyZSwgMHgwYywgMHgyYiwgMHg0YiwgMHg4NywgMHhiZiwgMHg2NSwgMHgxZiwgMHhkNiwgMHg0NCwgMHhmNywKKyAgMHgyYiwgMHg0ZSwgMHg5ZiwgMHg2OSwgMHhmZiwgMHgwYywgMHg1NywgMHgwZSwgMHgyMSwgMHgyYSwgMHg4ZiwgMHg4NywKKyAgMHg1ZCwgMHgzYiwgMHhmZiwgMHhmZiwgMHgyNSwgMHg2NywgMHhhNiwgMHg0MCwgMHhkOCwgMHg2MiwgMHhiMiwgMHgyOCwKKyAgMHg4NCwgMHgxOSwgMHhhNSwgMHhhZiwgMHgzYSwgMHg1NSwgMHg2YSwgMHgyMiwgMHhjOCwgMHgwNCwgMHhhMSwgMHgwMCwKKyAgMHgyMSwgMHhkNSwgMHgwMCwgMHgzMywgMHgwMSwgMHgyOCwgMHg0NiwgMHgyNCwgMHgxMywgMHhkZCwgMHg2ZSwgMHg5NywKKyAgMHg0OSwgMHhkMCwgMHg5NiwgMHgxMywgMHg0ZCwgMHgxOSwgMHg0ZCwgMHhmYiwgMHg4ZSwgMHg1MCwgMHhiNSwgMHg3NCwKKyAgMHg1OSwgMHgwZiwgMHg5NCwgMHhkZSwgMHhkZiwgMHg2YywgMHhkOCwgMHg5ZSwgMHg1YiwgMHhiYiwgMHg1NCwgMHg4MSwKKyAgMHgzNCwgMHhmNSwgMHg2MCwgMHhiMCwgMHhkYiwgMHg2ZiwgMHhlZCwgMHg3MiwgMHgzMywgMHhmOSwgMHhkZiwgMHhmMCwKKyAgMHhmYiwgMHhlNiwgMHg4YiwgMHg2MiwgMHg4YiwgMHgyYywgMHg3ZSwgMHg3OCwgMHg0YywgMHg2YywgMHg4YiwgMHhhNiwKKyAgMHgxNSwgMHhiOCwgMHgwOSwgMHhmNSwgMHg3NCwgMHhlZSwgMHhiMywgMHg0MCwgMHg5NCwgMHg5ZiwgMHg1ZCwgMHgxMSwKKyAgMHgwMywgMHg3YywgMHg0ZiwgMHgxZCwgMHhiMiwgMHhjOSwgMHg2OCwgMHg0YiwgMHg1ZSwgMHhmZSwgMHgxZCwgMHgwMCwKKyAgMHhlNCwgMHgxMywgMHg3MywgMHhhYywgMHhmYiwgMHhlNiwgMHhiZSwgMHg3NSwgMHgxNCwgMHg3ZSwgMHhmMiwgMHg5YywKKyAgMHhlNCwgMHgwOSwgMHhlNiwgMHgxMSwgMHg0YiwgMHg2NiwgMHgzNCwgMHg0ZSwgMHhmMCwgMHhmZCwgMHgyMiwgMHg4YiwKKyAgMHhhNiwgMHg3YywgMHg2MCwgMHhmNSwgMHhjMiwgMHg1ZCwgMHhhNiwgMHhlNywgMHg2YiwgMHg0YSwgMHgzMSwgMHg0MSwKKyAgMHhhNiwgMHg2ZCwgMHgzMiwgMHg5MiwgMHg0MiwgMHhkZiwgMHgzYiwgMHhkNSwgMHhkYSwgMHg1ZCwgMHhiZCwgMHhiYywKKyAgMHhlOSwgMHhiZCwgMHgwOSwgMHg4NywgMHg2ZSwgMHgyOCwgMHhiMSwgMHg1MiwgMHgxNSwgMHhiMiwgMHg5NCwgMHhhMSwKKyAgMHgyNCwgMHg0MSwgMHhiYywgMHg1ZCwgMHg1ZSwgMHg2YywgMHgzZiwgMHhhMCwgMHhjMCwgMHg0YSwgMHhjYiwgMHg5YywKKyAgMHg1MywgMHg3YywgMHg5MiwgMHg1MywgMHhlOSwgMHgzMSwgMHhiZSwgMHg3ZiwgMHhlNSwgMHg0NiwgMHhkOCwgMHg5MSwKKyAgMHg1YiwgMHg2YSwgMHhlYSwgMHhjYiwgMHgzZiwgMHgxMSwgMHhlNiwgMHg2YiwgMHhlMCwgMHgxMiwgMHhmNiwgMHg4YSwKKyAgMHg2OSwgMHg5OCwgMHgwNCwgMHgyZCwgMHgzMywgMHg0ZSwgMHg4OCwgMHhiNSwgMHhkMSwgMHg2YiwgMHg0YSwgMHhkMiwKKyAgMHgzNCwgMHgyOCwgMHg4ZCwgMHhkOCwgMHgwNiwgMHhhYSwgMHgwOSwgMHhhZiwgMHhhMCwgMHg1YSwgMHg3YywgMHg5MCwKKyAgMHhhOSwgMHhiYywgMHg3NSwgMHhkZCwgMHhhNiwgMHg5YywgMHgwYywgMHhlNCwgMHgyNywgMHgwZSwgMHg1ZCwgMHg1ZSwKKyAgMHg4OCwgMHhkZiwgMHgyYSwgMHg4OSwgMHg1ZSwgMHgyMywgMHhkNCwgMHg5ZCwgMHhhYSwgMHg5NywgMHhiNywgMHhlNywKKyAgMHhmYywgMHhmZSwgMHg3MSwgMHgxZSwgMHhkZSwgMHg0ZSwgMHgzMiwgMHhjZCwgMHg4ZCwgMHhmNCwgMHg2ZiwgMHgzNywKKyAgMHg1NywgMHg4YywgMHgwYSwgMHhhYSwgMHhlYSwgMHgxOCwgMHhhMywgMHg3MCwgMHg4ZSwgMHgxOCwgMHgxNywgMHhjOCwKKyAgMHg0MSwgMHg0YywgMHhjYywgMHhhOCwgMHg2OCwgMHgxNCwgMHhhYiwgMHhjYywgMHgwMSwgMHgzMiwgMHgzNSwgMHhmMSwKKyAgMHhmMSwgMHhiZSwgMHg2MSwgMHhhMywgMHg4ZSwgMHg4MSwgMHhkMywgMHhiYiwgMHg3NiwgMHhlZSwgMHg5ZSwgMHhmMywKKyAgMHg2ZSwgMHgxYywgMHg2ZCwgMHhmMCwgMHhjNywgMHgxNiwgMHhkYiwgMHgzYywgMHg0MCwgMHg1MiwgMHgyYiwgMHhjZCwKKyAgMHg0OCwgMHhiOCwgMHhhMCwgMHgzMywgMHg5ZCwgMHg4MSwgMHg0OCwgMHhiMSwgMHgyOCwgMHgxMCwgMHg1NiwgMHhmNywKKyAgMHgyZiwgMHgwYiwgMHg4MCwgMHg1MiwgMHgwOSwgMHg0MSwgMHg5MSwgMHg2NSwgMHg2ZSwgMHgwMCwgMHgwYiwgMHg0YiwKKyAgMHgxYSwgMHhkOSwgMHhmMSwgMHg0MSwgMHg3NCwgMHg1NCwgMHhhNywgMHg5MSwgMHhhNywgMHhkYywgMHgxYSwgMHhmNSwKKyAgMHhjOSwgMHgzZSwgMHg0MSwgMHhjMCwgMHgyMSwgMHg0YywgMHhkOCwgMHhmYiwgMHhmZiwgMHg1ZiwgMHhmZiwgMHhmZiwKKyAgMHgwMCwgMHhjNiwgMHhkYSwgMHhhNCwgMHhjOCwgMHg3NSwgMHhiOCwgMHg2OCwgMHg4YSwgMHg1YywgMHg0NCwgMHgzYSwKKyAgMHhmMCwgMHhlNywgMHhiMywgMHg4NywgMHgwMCwgMHg3ZSwgMHg4ZSwgMHgzYSwgMHhiNiwgMHg5MCwgMHhhZiwgMHhlMSwKKyAgMHhkNiwgMHg5YSwgMHgxNSwgMHhhNywgMHhiOSwgMHhjMSwgMHg2MSwgMHg0MiwgMHhkNSwgMHgzZiwgMHg5OCwgMHhmMiwKKyAgMHgyZiwgMHhjMCwgMHg2NSwgMHg3MCwgMHhmZCwgMHg3NiwgMHg2YywgMHg2ZSwgMHhkZCwgMHg4NiwgMHhjNywgMHg3YywKKyAgMHg0ZiwgMHg4ZCwgMHgzNiwgMHhmNSwgMHg2YywgMHgwYywgMHg1OSwgMHgxYSwgMHhiMiwgMHgwZiwgMHg1ZiwgMHgxZSwKKyAgMHgzOSwgMHgyNywgMHg1YywgMHgwOCwgMHhhZCwgMHgzMiwgMHgyOCwgMHgxNCwgMHg5NCwgMHgwZCwgMHgxZiwgMHgzMSwKKyAgMHgwNiwgMHhmOCwgMHgyZSwgMHg4NiwgMHgxOSwgMHhkZCwgMHgyZiwgMHg0ZiwgMHhiYSwgMHg2ZCwgMHgxNSwgMHhhNiwKKyAgMHgzOCwgMHgyYSwgMHg5NCwgMHhlZSwgMHgyYSwgMHhhYSwgMHgwYiwgMHhlYSwgMHg0MiwgMHhjMCwgMHg5OSwgMHg2YiwKKyAgMHgxNiwgMHg3MywgMHg3YywgMHhhYSwgMHhhNiwgMHg5NSwgMHgyZSwgMHgyYiwgMHgwMSwgMHg0ZiwgMHhhYiwgMHhmNywKKyAgMHhiNSwgMHg5MSwgMHg3OCwgMHg2MiwgMHhiYywgMHg5ZSwgMHhiMywgMHhkNSwgMHgyMiwgMHg2MiwgMHgwMywgMHgzOCwKKyAgMHhhMiwgMHhiMywgMHg2NSwgMHhjOSwgMHgyYywgMHg4YSwgMHhjYSwgMHg4NiwgMHg4MiwgMHhmYywgMHhlNiwgMHhkMiwKKyAgMHg2YywgMHgyMiwgMHg3ZSwgMHg1YiwgMHg0NiwgMHgyZSwgMHg3YywgMHhmOCwgMHg1YywgMHhkNywgMHg2YiwgMHg2NiwKKyAgMHg5OSwgMHg4NSwgMHg2YywgMHg5YywgMHg1ZiwgMHg2NiwgMHhkNywgMHgwZiwgMHg4YywgMHg1OSwgMHg1ZSwgMHhlZSwKKyAgMHg3MywgMHg1NywgMHgxMiwgMHhhMSwgMHhjZiwgMHhkNiwgMHg4ZSwgMHhmNiwgMHg1YiwgMHhlYSwgMHhkNCwgMHgyOSwKKyAgMHhmNSwgMHg3ZSwgMHg1NSwgMHhhNiwgMHg1MiwgMHgwMywgMHg2YSwgMHhjMCwgMHhlOSwgMHg4YywgMHhjMywgMHhkNywKKyAgMHg0OSwgMHgxYywgMHgzYiwgMHgwZCwgMHg0NywgMHgwOSwgMHg5MCwgMHg5NiwgMHhkYywgMHgzYiwgMHgxNywgMHgzYiwKKyAgMHhiNywgMHgwMSwgMHg0NSwgMHg5NSwgMHg1NSwgMHg2NCwgMHg3YSwgMHg0NSwgMHg5NSwgMHhlNywgMHg5MywgMHg3YywKKyAgMHgyZSwgMHgzMiwgMHhiYywgMHhhNCwgMHgyNiwgMHhlYSwgMHg5YiwgMHg2ZCwgMHg4YywgMHhlMCwgMHhlYSwgMHhjMCwKKyAgMHg1NSwgMHg3OSwgMHhjNSwgMHg0ZSwgMHhmNSwgMHg4NiwgMHhiNywgMHhiOSwgMHgzZiwgMHhhZiwgMHgxOCwgMHhhMiwKKyAgMHhhYywgMHhjNCwgMHg1MiwgMHgzYSwgMHhjYywgMHg1MywgMHhkNywgMHgwNywgMHg5YiwgMHhiNSwgMHg4YywgMHhhNCwKKyAgMHhmMiwgMHhkMywgMHg0NiwgMHgzZiwgMHhhYiwgMHhhZSwgMHgxZiwgMHg1NCwgMHg1MiwgMHhmZSwgMHg0MCwgMHhmYSwKKyAgMHhhNiwgMHhkZCwgMHg4MywgMHhjYSwgMHg0MSwgMHgwMSwgMHg0YSwgMHg2NSwgMHg3MiwgMHhlMCwgMHg0MSwgMHhkYiwKKyAgMHhiNCwgMHhiZSwgMHhjNywgMHhmZSwgMHg2YSwgMHg1NiwgMHgyMiwgMHg5NSwgMHg3NywgMHgxZiwgMHg2MiwgMHg0NCwKKyAgMHhjNCwgMHg2ZCwgMHhjYSwgMHg2YywgMHgzMiwgMHg2MCwgMHhjMywgMHg1NiwgMHg0MCwgMHgzNSwgMHhjNCwgMHg2MCwKKyAgMHhiNywgMHg4MiwgMHhmNSwgMHgwOCwgMHhlYSwgMHgxMiwgMHgwNCwgMHg2MiwgMHgwOSwgMHg5YiwgMHhkYywgMHhkMSwKKyAgMHgzMCwgMHhhNCwgMHhlNSwgMHg0MSwgMHgzYSwgMHg4MiwgMHhiNCwgMHgyZiwgMHgwMSwgMHgyOCwgMHhhYywgMHhhZSwKKyAgMHg0MywgMHhkNCwgMHg1ZCwgMHg3ZSwgMHhjMSwgMHhhNywgMHhhNywgMHgyZCwgMHgzNiwgMHgwMiwgMHg0NSwgMHg1OSwKKyAgMHg3NiwgMHg0ZSwgMHhkMywgMHhiNCwgMHg5NywgMHg2OSwgMHg1ZCwgMHhkNywgMHhkMywgMHhkOCwgMHgwNCwgMHhlMiwKKyAgMHgwOCwgMHg5NiwgMHhmOCwgMHhkYywgMHgyMSwgMHgzNiwgMHg5MiwgMHhhYSwgMHhmMSwgMHhmMSwgMHhlNSwgMHhjNiwKKyAgMHgwOCwgMHhkZCwgMHhjMSwgMHg4NiwgMHg5OCwgMHg4MCwgMHg0NSwgMHgzMCwgMHhiMiwgMHgyMSwgMHg1OSwgMHhjNywKKyAgMHgyNCwgMHg2ZSwgMHg1YiwgMHhmMSwgMHgzMSwgMHg3NSwgMHhiMywgMHgzOSwgMHg5YiwgMHg1MSwgMHg2NCwgMHgxOSwKKyAgMHg3OSwgMHhkNCwgMHgzNiwgMHhkNiwgMHg1ZiwgMHg2MSwgMHg2ZSwgMHgwYSwgMHg4ZSwgMHgwMCwgMHhhMiwgMHhiMiwKKyAgMHg2NSwgMHgxNCwgMHhiMCwgMHhiNSwgMHg0NCwgMHg0OSwgMHgyZiwgMHg1YSwgMHg0ZSwgMHhmNywgMHg4YywgMHhkYSwKKyAgMHg1ZiwgMHgyOSwgMHg4MywgMHg4MywgMHhhMSwgMHhiZiwgMHhmMSwgMHhiNSwgMHgxOCwgMHg1MSwgMHhiOCwgMHhlOSwKKyAgMHg2YSwgMHgxYSwgMHgwYSwgMHg4MCwgMHhlYiwgMHhlMiwgMHgzMCwgMHhlZSwgMHg3ZCwgMHhiOCwgMHhkMSwgMHg5MywKKyAgMHg4NCwgMHgzYiwgMHgxYywgMHhkYiwgMHgzNSwgMHg2YSwgMHhkNywgMHgxZSwgMHhhMywgMHhlYywgMHhmZiwgMHgxZCwKKyAgMHhhYiwgMHgwNywgMHgyMSwgMHg0YywgMHg2YywgMHhjMCwgMHgwMCwgMHhiZiwgMHhjMCwgMHgwNCwgMHgxZiwgMHhjNiwKKyAgMHhkYywgMHg0NiwgMHgzNiwgMHhmMSwgMHhlYiwgMHg1MCwgMHg4ZCwgMHg4ZCwgMHhiNiwgMHg1MCwgMHg2YiwgMHg0OCwKKyAgMHhkNywgMHg5MSwgMHg4ZiwgMHhkYSwgMHhlOSwgMHhlZCwgMHg3OSwgMHgyZCwgMHg2ZiwgMHhlYiwgMHhjNiwgMHhhZCwKKyAgMHg3NywgMHhkMywgMHgzMSwgMHhmYiwgMHg2YSwgMHg5ZiwgMHgwZSwgMHgyNywgMHgwMCwgMHgxMCwgMHgyMSwgMHg2NCwKKyAgMHhlNCwgMHhlNiwgMHgzNSwgMHgyZCwgMHgzZCwgMHhkZSwgMHg4OSwgMHg4ZSwgMHhhZSwgMHhkNywgMHg5NywgMHg1YiwKKyAgMHg5NywgMHg1NSwgMHgzYSwgMHhiYywgMHg3MSwgMHgzMywgMHhjNSwgMHg3MywgMHhhYSwgMHhmNSwgMHhiNywgMHgxOSwKKyAgMHg0NCwgMHhiMiwgMHgwOCwgMHgzMywgMHhjMiwgMHg1OSwgMHhlOSwgMHgzMywgMHg5MywgMHgwYiwgMHhlZSwgMHgxNywKKyAgMHhhNiwgMHg3NiwgMHhlMCwgMHg3MSwgMHhlMSwgMHg2OSwgMHgxZiwgMHg4MiwgMHg3MCwgMHhiYSwgMHhhZSwgMHhiMiwKKyAgMHhmNiwgMHgxMywgMHhiMSwgMHhhZCwgMHgyMiwgMHgzYywgMHg5YSwgMHgwZSwgMHhjYSwgMHg3YywgMHgzNCwgMHhkMiwKKyAgMHg0OSwgMHhlNywgMHgwYSwgMHhiOSwgMHg2ZiwgMHg3MCwgMHg3NywgMHgzZSwgMHg4NSwgMHgzYSwgMHg3OSwgMHg2OCwKKyAgMHhkZiwgMHgxZCwgMHhmYSwgMHhkMCwgMHgyMCwgMHg0OSwgMHgxMCwgMHgyMiwgMHhkNCwgMHhlYiwgMHhiNiwgMHhmNywKKyAgMHhhMCwgMHg4ZSwgMHg5MSwgMHgwMiwgMHhmNiwgMHgyZSwgMHgwMiwgMHg4ZSwgMHhiNiwgMHgyZCwgMHg4ZCwgMHhmMywKKyAgMHhmOSwgMHg1YSwgMHhhMiwgMHhlNCwgMHg5YSwgMHg1ZSwgMHhhYiwgMHhkYywgMHgwNiwgMHhkMCwgMHhhNSwgMHhmMywKKyAgMHhhMywgMHgzMiwgMHg3ZiwgMHg4YSwgMHg3MCwgMHg0ZSwgMHg0MSwgMHg1ZCwgMHg4MywgMHg2NywgMHhhNiwgMHg1NywKKyAgMHhlMywgMHhlZiwgMHgxNiwgMHgyNSwgMHg4NiwgMHg5YiwgMHhiYSwgMHg2OCwgMHhiZiwgMHgyOCwgMHhkMiwgMHgzZCwKKyAgMHgyMywgMHgzYywgMHhmYSwgMHgwMiwgMHhlNiwgMHhkZSwgMHhjYSwgMHgwOSwgMHg4NywgMHgzMiwgMHg4MiwgMHgxMywKKyAgMHgzZiwgMHhiMCwgMHhmOSwgMHg4NSwgMHg5ZSwgMHg1MiwgMHgzYiwgMHg5YiwgMHhkMSwgMHhmMywgMHg0ZSwgMHg2NSwKKyAgMHgyOCwgMHg4OSwgMHhjMiwgMHhiZiwgMHhmNywgMHg1ZiwgMHhkNywgMHhkMiwgMHg0OSwgMHg1ZSwgMHg2NCwgMHg1MiwKKyAgMHhlYiwgMHg5MCwgMHg0MywgMHgyZSwgMHhiMSwgMHgxZCwgMHg3NCwgMHg5OCwgMHhjMiwgMHg5YywgMHg1ZCwgMHhmMSwKKyAgMHg5NiwgMHg3ZSwgMHg0ZiwgMHgzOSwgMHhlNywgMHhkOSwgMHgxZiwgMHhkMCwgMHg5YywgMHg2OSwgMHhhMCwgMHhmYywKKyAgMHg5ZCwgMHgxZiwgMHg4MiwgMHhkMSwgMHhhNSwgMHgwOCwgMHg4NSwgMHgyOCwgMHhhNiwgMHg5MiwgMHgyMSwgMHhkYiwKKyAgMHg4YiwgMHhlMiwgMHg3ZCwgMHgwOSwgMHhjYSwgMHhhNCwgMHhjYywgMHg5YSwgMHhlMCwgMHg5NSwgMHhjOCwgMHgzOCwKKyAgMHg3NSwgMHgyNywgMHgwZCwgMHg3ZCwgMHgyZiwgMHg1OSwgMHhhZiwgMHhjYywgMHhlMywgMHgyYiwgMHg1NywgMHg0NCwKKyAgMHgxYSwgMHhiZSwgMHgzYSwgMHgyNSwgMHg0OSwgMHhkMSwgMHg2OCwgMHgxNywgMHgwOCwgMHhkYiwgMHhmNiwgMHg1MSwKKyAgMHhjOSwgMHg4YSwgMHhjYiwgMHgyNCwgMHg4MCwgMHgwZiwgMHhiYywgMHg5MiwgMHg4ZCwgMHgwZSwgMHhlZSwgMHg2YiwKKyAgMHg4YiwgMHg1MywgMHg0ZiwgMHgyNCwgMHg5OCwgMHg3ZSwgMHhhMiwgMHhkMiwgMHgxZSwgMHhjMCwgMHhmMSwgMHg3MywKKyAgMHg0MSwgMHhhMCwgMHhhZiwgMHgyMiwgMHg4YSwgMHgyNCwgMHg5MywgMHhkYiwgMHhiNiwgMHhjYiwgMHhiOSwgMHgyMCwKKyAgMHhiZCwgMHhlZSwgMHg0NywgMHg2YiwgMHg2NCwgMHgwOSwgMHg0ZiwgMHgwNSwgMHg4MSwgMHg1YiwgMHgyMCwgMHgwYSwKKyAgMHhjMSwgMHgxNCwgMHhjNSwgMHhhMCwgMHg0MCwgMHgwNiwgMHgxZCwgMHhjYSwgMHhkOCwgMHg4NCwgMHgyYSwgMHgzMCwKKyAgMHhkMSwgMHhlYiwgMHgwNywgMHgxNiwgMHgxMSwgMHhjZCwgMHhhNCwgMHhjMCwgMHgyNSwgMHhjNywgMHg5OCwgMHg5ZiwKKyAgMHg5NiwgMHg4MywgMHhlZSwgMHg5MywgMHgwOCwgMHg3YiwgMHgzZiwgMHhlOCwgMHgzZCwgMHg2MSwgMHhmYiwgMHg2NSwKKyAgMHhjMywgMHg1OSwgMHgwOCwgMHhmYSwgMHgxNiwgMHgzYiwgMHgyMywgMHgwMCwgMHhmOCwgMHg1MiwgMHgwNywgMHhhZCwKKyAgMHhhZSwgMHhhOCwgMHg4NiwgMHgwZiwgMHgzNSwgMHgwZiwgMHg0NywgMHhlMiwgMHhhOCwgMHhlZiwgMHg3YiwgMHhlOCwKKyAgMHhmNSwgMHhkYywgMHg4NSwgMHhmOCwgMHhkYSwgMHhmMCwgMHhhOCwgMHg0NiwgMHg3NSwgMHg5NywgMHgwNSwgMHg4YywKKyAgMHgwMiwgMHg2MywgMHg1NiwgMHg0ZiwgMHg1NiwgMHhmYiwgMHgwOCwgMHg5MCwgMHgxZSwgMHgxYSwgMHhjNCwgMHhkYiwKKyAgMHg0YSwgMHgzZSwgMHgxYiwgMHgzOSwgMHhiOSwgMHhlMiwgMHg3MSwgMHgzNSwgMHg0MSwgMHhhMCwgMHhkMSwgMHgzOSwKKyAgMHg1OCwgMHhlMCwgMHgyMSwgMHg0YywgMHhkOSwgMHg0NiwgMHg1YywgMHg0NCwgMHgzYSwgMHhlYSwgMHgyMSwgMHhiNywKKyAgMHgyOSwgMHhhNCwgMHgwMywgMHg3YSwgMHg5MywgMHgyMywgMHg0NywgMHhiMCwgMHhiNSwgMHhhMywgMHhmOCwgMHhkMywKKyAgMHg4ZSwgMHgwMSwgMHg3ZCwgMHg3ZiwgMHgwMSwgMHhjNCwgMHg1NCwgMHg3ZSwgMHg0NywgMHhiMSwgMHg3MywgMHg2MiwKKyAgMHgwNSwgMHgyOSwgMHg5MiwgMHhjNiwgMHg1NywgMHhhNywgMHg2MywgMHhlMCwgMHhjYiwgMHhjNSwgMHg5NSwgMHhjYiwKKyAgMHg5ZSwgMHgzZiwgMHg3NCwgMHg1YiwgMHhmZCwgMHg4ZSwgMHgyYSwgMHhhNSwgMHhjNiwgMHg2NiwgMHhlOCwgMHg4OSwKKyAgMHgwYSwgMHg5ZSwgMHg4MiwgMHgzOSwgMHgyZiwgMHhjMywgMHgzMCwgMHhiYiwgMHhlOSwgMHgyZCwgMHg5NywgMHhhYSwKKyAgMHgwNywgMHg5OSwgMHg3NSwgMHg5YiwgMHg0OSwgMHhkMywgMHg0OSwgMHg1MiwgMHg4NSwgMHg4NiwgMHg1NCwgMHg5NSwKKyAgMHhkZCwgMHg2OCwgMHgwNSwgMHg1NywgMHg4MSwgMHhkYSwgMHgwZSwgMHhlOSwgMHhjMSwgMHhhNSwgMHg4NCwgMHgyMiwKKyAgMHg4OCwgMHhmMiwgMHhkZCwgMHgxZiwgMHhiNywgMHg2YywgMHhmMCwgMHhkYiwgMHhlMywgMHhjNCwgMHhhOSwgMHhiOSwKKyAgMHgyZiwgMHg3OSwgMHg5MywgMHgxMCwgMHhiNCwgMHg2NCwgMHhmNywgMHhhNCwgMHhlNywgMHhiZiwgMHhmOCwgMHg3ZCwKKyAgMHhmOSwgMHhmYiwgMHhhNiwgMHhkNiwgMHgzNSwgMHg0NywgMHhjZCwgMHg1NSwgMHg1YiwgMHg0MywgMHg5MywgMHg5NiwKKyAgMHgxMywgMHg1ZiwgMHhlYywgMHg4NSwgMHg4OSwgMHgxOCwgMHhhNywgMHg3ZSwgMHgwYiwgMHhhOCwgMHhiZiwgMHg2OCwKKyAgMHg0OCwgMHgyMSwgMHg4YywgMHhkYywgMHhiZCwgMHgzYiwgMHgyZSwgMHhiMiwgMHg1MCwgMHg0OCwgMHg0OCwgMHgwYiwKKyAgMHg5ZiwgMHgxMCwgMHgyMSwgMHhmMiwgMHg2NSwgMHgwMCwgMHgxZCwgMHhiYywgMHg0ZSwgMHg1YSwgMHg1ZiwgMHhiYiwKKyAgMHgyMiwgMHgyMywgMHhmMCwgMHgwNCwgMHgwOCwgMHg5YywgMHhkMSwgMHgyMCwgMHg0MSwgMHgwYSwgMHhlYSwgMHgwMiwKKyAgMHg0OSwgMHhjZiwgMHhhZSwgMHg5NCwgMHg2MSwgMHg0ZiwgMHg1MCwgMHgwMCwgMHhjZCwgMHg5ZiwgMHhmMCwgMHgwMCwKKyAgMHgwNiwgMHhhZCwgMHhjOSwgMHhmNSwgMHhlNSwgMHg5ZCwgMHhhZSwgMHg0YywgMHhlZiwgMHgyNCwgMHgxMSwgMHhjYSwKKyAgMHhhZCwgMHgyNiwgMHg3NCwgMHhjYiwgMHg2ZiwgMHhlNSwgMHhjZiwgMHhjZiwgMHhlMSwgMHhmNSwgMHhiMCwgMHhiZCwKKyAgMHg3NiwgMHg0NywgMHg1MCwgMHhmNiwgMHhhYSwgMHhkOCwgMHhlOSwgMHg2MSwgMHg4OSwgMHg1NCwgMHhhNywgMHgxMywKKyAgMHhhMywgMHgwMSwgMHg2NCwgMHhmYiwgMHhkYiwgMHhmZCwgMHhkNywgMHg5NCwgMHg1MCwgMHg4YywgMHhiNSwgMHgwOCwKKyAgMHhmOSwgMHhiYSwgMHg0OCwgMHg2ZCwgMHhhNSwgMHhhMSwgMHg2OSwgMHg4NywgMHg0ZCwgMHgzOCwgMHgzNCwgMHhiMiwKKyAgMHhiZiwgMHg2ZCwgMHgzOCwgMHhiNSwgMHhiNCwgMHg5YSwgMHhmZSwgMHhjMSwgMHhkMywgMHhkMCwgMHg4MSwgMHg0YSwKKyAgMHg2NCwgMHhkNywgMHhmMywgMHhmOSwgMHgzNiwgMHg3NCwgMHhiYSwgMHhhZiwgMHhhNSwgMHg1MywgMHhmNiwgMHg2YSwKKyAgMHg1NiwgMHgyOSwgMHhkMywgMHhkMiwgMHgwMSwgMHhlZCwgMHg1YiwgMHgwOCwgMHg0MywgMHgyOSwgMHhlNiwgMHg3NCwKKyAgMHg2OCwgMHhkMiwgMHgzZiwgMHg5YiwgMHhkMSwgMHg3ZSwgMHgwNywgMHhhMiwgMHhmOCwgMHgyOCwgMHg2MywgMHg5MywKKyAgMHg1OSwgMHg3YSwgMHhkYSwgMHhiNSwgMHgwMSwgMHgzMCwgMHhiOSwgMHg0MSwgMHg2NCwgMHgxMywgMHhhNSwgMHg0YiwKKyAgMHgwNCwgMHgwMiwgMHgyNSwgMHg0YSwgMHg1MSwgMHhmZCwgMHg4YSwgMHgzYSwgMHg3YSwgMHgxZiwgMHgzOSwgMHhiNywKKyAgMHhkNSwgMHhiNCwgMHg0MSwgMHgwMCwgMHgwZiwgMHhlMywgMHhlYSwgMHhkYiwgMHg2MSwgMHhmMSwgMHhmNiwgMHg3ZiwKKyAgMHhiNCwgMHhiNSwgMHgwYSwgMHhkYiwgMHg4YiwgMHhmZCwgMHhmNywgMHgxYywgMHhiZCwgMHg1MiwgMHgyOSwgMHhjNCwKKyAgMHg2YywgMHhjNSwgMHhkMSwgMHgzOSwgMHg3NywgMHg4ZCwgMHhhNSwgMHg3MCwgMHhlZSwgMHhlYSwgMHhjOCwgMHgxMiwKKyAgMHhiMCwgMHgyOSwgMHhhMCwgMHhiYywgMHhkMywgMHg0NiwgMHhlOCwgMHgwNCwgMHg0YSwgMHg5YiwgMHg2MiwgMHhlZiwKKyAgMHg5MiwgMHhlMCwgMHg0OSwgMHgxNSwgMHgzMywgMHhlNiwgMHhkMSwgMHhmMSwgMHg1YywgMHhiNywgMHgzZSwgMHg4NSwKKyAgMHhiMCwgMHhjMiwgMHgwYywgMHhjYiwgMHhlNSwgMHhkMiwgMHgyMiwgMHg1OCwgMHgxYywgMHgyMSwgMHg0YywgMHg2ZCwKKyAgMHg0OSwgMHhkZiwgMHgwOCwgMHhjNSwgMHg1ZCwgMHg4MiwgMHg4OCwgMHg2NSwgMHhhYSwgMHg2YywgMHg0YSwgMHgwYSwKKyAgMHhiYSwgMHg4YywgMHg2MiwgMHhmOSwgMHg3ZCwgMHg3MCwgMHg3NCwgMHgzZiwgMHg0OSwgMHg0ZSwgMHhiYywgMHhlOSwKKyAgMHg1NywgMHhiZCwgMHg3ZiwgMHgwNiwgMHhiOCwgMHhlYSwgMHgyNSwgMHhkNiwgMHhmZCwgMHgwNiwgMHhiNCwgMHg1OCwKKyAgMHgzYiwgMHg3MywgMHg2MywgMHhkZCwgMHg2MSwgMHhiNiwgMHhhMSwgMHhiZCwgMHhhYiwgMHhmYywgMHgxZCwgMHhjNSwKKyAgMHhhYSwgMHhiMiwgMHg0YiwgMHg3NSwgMHhlZiwgMHgzYSwgMHg4YiwgMHhhYSwgMHg1ZiwgMHgyNiwgMHhiOSwgMHg5NSwKKyAgMHhiZiwgMHgxYiwgMHg1YSwgMHhkYSwgMHgxYSwgMHg3MCwgMHgyOSwgMHgyZCwgMHhlZSwgMHg4NSwgMHgxMSwgMHg1NCwKKyAgMHgwNCwgMHgyMCwgMHg0MCwgMHhmNCwgMHg0ZSwgMHhkNywgMHg5ZiwgMHhjMSwgMHhjOCwgMHhkMCwgMHgyYywgMHhmNywKKyAgMHhkZCwgMHhkNCwgMHg2ZiwgMHgxMywgMHhkNiwgMHg3ZSwgMHg1MiwgMHg0NSwgMHhhYywgMHhiMCwgMHg2MywgMHhlYiwKKyAgMHg5NCwgMHg4OSwgMHg0MSwgMHg2MiwgMHg4NywgMHg2NCwgMHhiMSwgMHg2OCwgMHhjZiwgMHg1NywgMHhiMiwgMHg2ZiwKKyAgMHgxNSwgMHg2YiwgMHgyMCwgMHg2NywgMHhjOCwgMHhkOSwgMHgzNCwgMHhhOSwgMHgzZiwgMHg0NywgMHg1NSwgMHhmNywKKyAgMHgxMywgMHg2NywgMHg3YiwgMHg3NCwgMHg1NywgMHg0MiwgMHhlMywgMHg3NSwgMHhkYiwgMHhlNCwgMHhkMywgMHg5MywKKyAgMHg1MiwgMHhjOCwgMHg5MywgMHgyMCwgMHg1NCwgMHg4OCwgMHg5NCwgMHgzZCwgMHhiZCwgMHhkOSwgMHhiZCwgMHhhYywKKyAgMHgzNiwgMHgwMCwgMHhhYywgMHg0ZSwgMHgxOSwgMHhjZSwgMHgxYiwgMHg0ZiwgMHg5ZSwgMHg3MywgMHg2NCwgMHgxNCwKKyAgMHg1NiwgMHgyMSwgMHhmOSwgMHgyZCwgMHhmOSwgMHhjOCwgMHhiYiwgMHgzNywgMHhhYSwgMHg3MSwgMHgxOCwgMHg5YiwKKyAgMHhhZiwgMHhkZCwgMHhhMywgMHhmZCwgMHhiZiwgMHg4MCwgMHg2MywgMHhkMiwgMHg2MSwgMHhhZSwgMHhiZiwgMHgzYiwKKyAgMHg2YiwgMHhmOCwgMHg4YiwgMHgzNiwgMHhhMywgMHg1NSwgMHg1ZiwgMHg3ZiwgMHhiYywgMHhhZSwgMHhhZiwgMHg5NCwKKyAgMHg1NSwgMHgyMiwgMHg1MiwgMHhiNywgMHg1ZCwgMHhjOCwgMHhmYiwgMHg2OCwgMHhiZSwgMHg0ZSwgMHgzNSwgMHgwNywKKyAgMHg0OSwgMHgyMSwgMHg4NiwgMHgwNywgMHg2MCwgMHhhZSwgMHg0OCwgMHg3MywgMHhlMiwgMHhmZSwgMHg3NywgMHg3OSwKKyAgMHhkNywgMHg1NywgMHgxZCwgMHgyMiwgMHg3NywgMHhkYiwgMHg1YywgMHg5NSwgMHgwMCwgMHhhNCwgMHg4YiwgMHhiYSwKKyAgMHgzNywgMHhmNCwgMHgyZSwgMHg2YiwgMHg5NywgMHhhNSwgMHgyZSwgMHg2OSwgMHgzMSwgMHhiNiwgMHgyMiwgMHhmNiwKKyAgMHhjNCwgMHg5ZiwgMHg3ZSwgMHg1MCwgMHhlYiwgMHhhNSwgMHhhOSwgMHgxNiwgMHhkNywgMHgzZSwgMHg1OSwgMHhlNCwKKyAgMHg0NCwgMHg4YiwgMHhhNCwgMHgxYywgMHg4YSwgMHhhOCwgMHgzYywgMHhkMSwgMHg1YSwgMHgzMCwgMHgxNSwgMHg0MCwKKyAgMHhjMiwgMHg4ZiwgMHhjMywgMHhmYiwgMHhkOSwgMHhkNiwgMHhiYywgMHhiNCwgMHgzZiwgMHhhMCwgMHhmMywgMHhlYywKKyAgMHhiMywgMHhmYiwgMHg3MCwgMHg3ZiwgMHgyMSwgMHhjMCwgMHg3ZSwgMHg2OSwgMHhmNCwgMHg4OCwgMHhjMCwgMHhlZSwKKyAgMHg2ZiwgMHg5NiwgMHhmMywgMHg3YiwgMHg2MywgMHgxYSwgMHgzNywgMHg2MSwgMHhiNywgMHhjMCwgMHg2NSwgMHhhNCwKKyAgMHhiMCwgMHg3YywgMHg4ZSwgMHgzNCwgMHg3NCwgMHg0MywgMHhkZCwgMHg5NCwgMHhiMSwgMHgwNywgMHg3ZCwgMHhiZCwKKyAgMHhkMSwgMHg4YSwgMHgyYywgMHgzNSwgMHhmMSwgMHgwZCwgMHg3NywgMHgwMywgMHhlOSwgMHhkMiwgMHg3MiwgMHhhYSwKKyAgMHgxNCwgMHhjZiwgMHgzNywgMHhjOCwgMHgxOCwgMHg1ZSwgMHg1OCwgMHg4MiwgMHg1NiwgMHg4OCwgMHhhMCwgMHhmMCwKKyAgMHgxZSwgMHhkNSwgMHgzYiwgMHg0OSwgMHhjOCwgMHhhYiwgMHg0NCwgMHhmMCwgMHg3YywgMHhmNywgMHhhNywgMHg1ZSwKKyAgMHhiNSwgMHgxZCwgMHhhYSwgMHhmNiwgMHgzZCwgMHg0ZiwgMHhhMiwgMHgxYiwgMHgxOCwgMHg2MiwgMHgyNiwgMHgzOCwKKyAgMHg5MSwgMHg3MywgMHhmMCwgMHhkNCwgMHhhNCwgMHgwMiwgMHg3MywgMHg5OSwgMHg2OCwgMHgwYiwgMHg4NCwgMHhhNiwKKyAgMHgxNSwgMHhiYywgMHg0MSwgMHg2NCwgMHgxYywgMHhhYywgMHg4NiwgMHhjNSwgMHhjMywgMHgwNywgMHgyMSwgMHg0YywKKyAgMHgzNywgMHg0NywgMHg1ZCwgMHg2NCwgMHg3NiwgMHhlNSwgMHgzNSwgMHhiNywgMHgyMSwgMHgzMSwgMHgzOCwgMHgwNiwKKyAgMHhlYywgMHgyMywgMHhhNCwgMHg0OCwgMHhiNSwgMHhiYSwgMHhmZCwgMHgyOCwgMHg0OSwgMHg5YSwgMHg1YiwgMHhlNCwKKyAgMHg1NywgMHg1YSwgMHg5YSwgMHgzZSwgMHhjMiwgMHhmNSwgMHg3YSwgMHg5NCwgMHhlOSwgMHhhNSwgMHhiMSwgMHg5NCwKKyAgMHg5MSwgMHg1MiwgMHg1OCwgMHgzZiwgMHhiYiwgMHhhYywgMHgxNiwgMHg3MCwgMHg5NiwgMHhkYywgMHhjYSwgMHgwZiwKKyAgMHhjNSwgMHg2ZiwgMHgxYSwgMHg3MiwgMHgwYiwgMHhhMiwgMHg1ZCwgMHgyZSwgMHgzNiwgMHhmOSwgMHg2NywgMHhmZSwKKyAgMHgwNSwgMHgwZSwgMHg5ZiwgMHhkMywgMHhmNywgMHgxYywgMHg4YSwgMHhjZCwgMHhkYiwgMHg4ZSwgMHg4NiwgMHhlOCwKKyAgMHhjYSwgMHgzNywgMHgwYiwgMHgyNiwgMHg2NCwgMHhkYSwgMHgxNCwgMHgwOCwgMHhjNywgMHg2ZCwgMHg4ZiwgMHgxNywKKyAgMHhhMSwgMHhiNSwgMHgxYiwgMHgxNywgMHhmNSwgMHg3OSwgMHhjNiwgMHg2ZiwgMHhhNywgMHhhZSwgMHhhYSwgMHhlMSwKKyAgMHhlNywgMHgyMCwgMHhlYSwgMHhhYywgMHhjZiwgMHg3NywgMHhjYSwgMHhmNSwgMHhlMywgMHg1NywgMHg3MCwgMHg0MSwKKyAgMHgwMiwgMHg5ZCwgMHg0ZCwgMHgwNywgMHhkMywgMHgxOCwgMHhiNywgMHgxOSwgMHg1YiwgMHhlMCwgMHg4OSwgMHg1NywKKyAgMHgwMCwgMHhmMywgMHhhZSwgMHhmMiwgMHg5OCwgMHg2MywgMHg5ZSwgMHgzYSwgMHgzZCwgMHg2NiwgMHhmOSwgMHhiMSwKKyAgMHhjMSwgMHg1NiwgMHgxMCwgMHgxMCwgMHhhYywgMHg2MSwgMHg2NiwgMHhiYiwgMHgwYSwgMHhhNSwgMHgwZSwgMHg5YiwKKyAgMHhlYSwgMHhjNSwgMHg3YSwgMHhkNSwgMHg5NywgMHhmOCwgMHgzYiwgMHg5OSwgMHgxMiwgMHg5YSwgMHg2YiwgMHg2YSwKKyAgMHgwNSwgMHgzNCwgMHgwMSwgMHhmYywgMHgzMiwgMHg0YiwgMHhhOCwgMHg0MiwgMHg2OCwgMHg4MCwgMHgzZiwgMHg0ZiwKKyAgMHhjMiwgMHg4YywgMHg1MCwgMHhjZCwgMHhmNywgMHhlOSwgMHhhYSwgMHg2OSwgMHhmYywgMHg1MywgMHhhNSwgMHg3ZCwKKyAgMHgxNiwgMHhjYywgMHhmMSwgMHgzZiwgMHgwNSwgMHg5YywgMHgyOCwgMHg3YywgMHg1NywgMHgyNiwgMHhlZCwgMHhkOSwKKyAgMHg4NywgMHhlYSwgMHgzYiwgMHgxMiwgMHhhZiwgMHg0OSwgMHhiOSwgMHhmOSwgMHhlNSwgMHhjOSwgMHhjMywgMHhmYywKKyAgMHhjNiwgMHg1MSwgMHgwZiwgMHhjYywgMHg1NCwgMHhjMywgMHhlOSwgMHhlYiwgMHg1NCwgMHgzMywgMHgxNSwgMHgwNiwKKyAgMHg1OSwgMHhmNCwgMHhkYywgMHg1ZCwgMHhkMywgMHg1ZCwgMHhkMywgMHhlMiwgMHg4MywgMHhhNSwgMHg1YiwgMHg0NiwKKyAgMHhkYSwgMHgzYywgMHg2ZiwgMHg2ZiwgMHhiMSwgMHg5MywgMHg5MywgMHg1YSwgMHgxMiwgMHg5ZiwgMHgzOCwgMHg2NCwKKyAgMHhiZiwgMHgwNiwgMHgwNCwgMHg0MiwgMHg0OSwgMHg5NiwgMHhlNywgMHgyYiwgMHhlNCwgMHhhMywgMHhkNSwgMHg0NywKKyAgMHg2NCwgMHhiNSwgMHg4MCwgMHhkNywgMHhlYSwgMHg3ZSwgMHg1ZCwgMHg5OCwgMHgzNiwgMHgwMCwgMHgxNCwgMHgxNywKKyAgMHgwMiwgMHgzZSwgMHgyMCwgMHg3MywgMHgxMCwgMHgzOSwgMHg4NCwgMHg2OCwgMHgzOSwgMHg4MiwgMHg2YywgMHgzOCwKKyAgMHgxMiwgMHg2NiwgMHg1ZCwgMHhmNywgMHhjMCwgMHhlNCwgMHgzZiwgMHhlYSwgMHhkMiwgMHhkOCwgMHhjYSwgMHg0OCwKKyAgMHhhOSwgMHgyYywgMHgxYywgMHg5ZiwgMHhkYiwgMHg0NywgMHg2YywgMHg5MCwgMHhkYywgMHg0ZiwgMHhhOSwgMHhkZCwKKyAgMHg1NywgMHgxNiwgMHhiMCwgMHgyZSwgMHhiZSwgMHhhYiwgMHhkMSwgMHhiMSwgMHhkZCwgMHg3NCwgMHhhZSwgMHg1YSwKKyAgMHgxOSwgMHgyMCwgMHg1MSwgMHhjNCwgMHhiYSwgMHhkZiwgMHg2ZiwgMHhhMiwgMHgzZSwgMHhmZiwgMHgxNiwgMHhiNiwKKyAgMHhjZiwgMHg3MSwgMHhmMCwgMHhlYSwgMHgzYSwgMHg0NywgMHgxZiwgMHhhZSwgMHgxZiwgMHg2MSwgMHhlOSwgMHhhMSwKKyAgMHhjMCwgMHgyMSwgMHg3YSwgMHg5NCwgMHhkNSwgMHg1NSwgMHg4OCwgMHgzMSwgMHg1MSwgMHgyYSwgMHg3MCwgMHhkOCwKKyAgMHhlNSwgMHg0NywgMHgwYiwgMHg3NSwgMHgyYSwgMHhkMywgMHg4ZCwgMHg0NSwgMHg1MCwgMHhlMCwgMHg4NSwgMHhiMiwKKyAgMHg2NiwgMHg2ZSwgMHgzOSwgMHg2YSwgMHg5MywgMHhiZiwgMHgxMywgMHhlMywgMHhlZSwgMHgzOCwgMHhiZiwgMHhmOCwKKyAgMHhhNCwgMHhiYywgMHg1NiwgMHhhZCwgMHg4YiwgMHhmMywgMHgyZSwgMHg5YiwgMHg2MCwgMHhmNiwgMHhjYywgMHg2ZSwKKyAgMHg4YiwgMHg4YywgMHgwMSwgMHg5NCwgMHg0YSwgMHg1MSwgMHhiMSwgMHhkYiwgMHg3NSwgMHg1NywgMHhlYywgMHhjYiwKKyAgMHg4NCwgMHhkYSwgMHgzNCwgMHhkMywgMHg3YywgMHhlOCwgMHg1NywgMHgxMiwgMHgxOSwgMHg4YiwgMHhlMywgMHg1YSwKKyAgMHgzMSwgMHhhMSwgMHhiYSwgMHhlZSwgMHg3ZCwgMHg3MywgMHhlNywgMHg3OCwgMHgzOCwgMHhkZiwgMHg3ZSwgMHhmNCwKKyAgMHgwYSwgMHg1YiwgMHhkMiwgMHhmZSwgMHhkZCwgMHg4NywgMHhhOSwgMHg3ZiwgMHg1MywgMHg2NCwgMHhlNSwgMHgxMywKKyAgMHhhYywgMHg5MiwgMHhkZiwgMHg0OCwgMHgyZCwgMHhlNCwgMHg5MiwgMHhiZCwgMHgzYywgMHhjOSwgMHg2NCwgMHgyMSwKKyAgMHhhMywgMHgzNiwgMHg1NSwgMHhhNywgMHhiMSwgMHg2NywgMHg5ZCwgMHgzNywgMHg2NSwgMHg5NiwgMHg1ZCwgMHg1NCwKKyAgMHgyNSwgMHhiZCwgMHhmOSwgMHg0ZSwgMHg3OSwgMHhkNCwgMHhmNywgMHgwYywgMHhiNSwgMHhhYywgMHhmMCwgMHgyMiwKKyAgMHhlMiwgMHgyNywgMHg0ZiwgMHg2ZiwgMHhkNiwgMHhiNSwgMHg5NywgMHgyZSwgMHg5MiwgMHhlZSwgMHg5NCwgMHgyNCwKKyAgMHgwNSwgMHgyNiwgMHhhNCwgMHhlNywgMHhkMywgMHg1ZiwgMHgyMCwgMHg4NSwgMHhlNywgMHgzMCwgMHhjNywgMHgzMiwKKyAgMHhmMiwgMHg1ZCwgMHg3YSwgMHg0NiwgMHg4NSwgMHhjNywgMHgyYSwgMHhkNSwgMHgwMCwgMHg2NCwgMHg5OCwgMHhhNywKKyAgMHgwYiwgMHg0MCwgMHgyNCwgMHhhOCwgMHg2ZSwgMHhlNSwgMHg0YSwgMHgyZSwgMHg0OCwgMHg4NSwgMHgyZiwgMHg4ZSwKKyAgMHg1YiwgMHg0YSwgMHhhZiwgMHhhZCwgMHg4MywgMHhlOSwgMHhjYiwgMHgwNCwgMHg3NiwgMHg2MywgMHg2YiwgMHg0NywKKyAgMHgxOCwgMHg0YSwgMHhkOSwgMHhkOCwgMHg4MCwgMHg3YSwgMHgwOCwgMHgzMCwgMHg1NiwgMHgwMCwgMHgxZiwgMHhjOSwKKyAgMHgwOCwgMHgwYiwgMHg2NSwgMHg4ZCwgMHhkZiwgMHg4MCwgMHgwMCwgMHgwMCwgMHhhOSwgMHhjOSwgMHhiNywgMHg2NCwKKyAgMHhlOCwgMHhlZCwgMHgwYSwgMHhmZCwgMHhmYSwgMHg3NSwgMHhmZiwgMHgwYSwgMHg5ZSwgMHg3ZSwgMHhmOSwgMHhkNywKKyAgMHgzMiwgMHhkMCwgMHg5ZCwgMHhkOCwgMHg5NiwgMHg3NCwgMHg2ZSwgMHhiZSwgMHhiOSwgMHg5MiwgMHgwMiwgMHgzOSwKKyAgMHgwMSwgMHg3ZCwgMHg3OSwgMHg1MywgMHg3YSwgMHgyMCwgMHgxOCwgMHg5OCwgMHhlOCwgMHgwMSwgMHg0MiwgMHhiOSwKKyAgMHhhMywgMHg4ZiwgMHgxOCwgMHgwOSwgMHg1ZSwgMHg0YiwgMHg4ZSwgMHg3NSwgMHgxOCwgMHgyZiwgMHhlOSwgMHg4OSwKKyAgMHhhZSwgMHhiYywgMHhlZSwgMHg1YywgMHhhNCwgMHg0MCwgMHhiZSwgMHhhMywgMHhhNywgMHhlZiwgMHgyOSwgMHg0YywKKyAgMHhjNCwgMHgwZSwgMHgyMSwgMHgxYSwgMHg5NCwgMHhhZCwgMHg5NiwgMHg5NSwgMHg2MiwgMHhhNCwgMHgxMSwgMHgwNSwKKyAgMHhhMCwgMHgzNywgMHgxNSwgMHg4MiwgMHg4NSwgMHhkZSwgMHhiNSwgMHg1NiwgMHhkNiwgMHg4ZSwgMHgyYiwgMHg2ZCwKKyAgMHgwMiwgMHhjYiwgMHg2NCwgMHg4YiwgMHhjNywgMHhiYSwgMHg2MiwgMHhkYiwgMHhmOCwgMHg2ZiwgMHg1NSwgMHhkMiwKKyAgMHgzZiwgMHg2ZSwgMHhjNCwgMHg3ZiwgMHg1YiwgMHg2MiwgMHgwMiwgMHgzZiwgMHhmNywgMHhmYywgMHhkMywgMHg5NCwKKyAgMHhiNywgMHg1NSwgMHg3NSwgMHg0YiwgMHg5NiwgMHg2NiwgMHg1NCwgMHhiOCwgMHg5YiwgMHg1OCwgMHhkYSwgMHhhYywKKyAgMHhjZiwgMHhjZCwgMHg1OCwgMHg5MiwgMHg2YywgMHhmYywgMHg3NywgMHgyOSwgMHhkZSwgMHg3OCwgMHg5OCwgMHg1YywKKyAgMHhjMiwgMHhkZCwgMHg5NiwgMHg3NCwgMHhlYywgMHgyZCwgMHhjNywgMHg5OCwgMHhiNCwgMHg3NywgMHgxNSwgMHhjYiwKKyAgMHg0MiwgMHhjYiwgMHg1ZiwgMHg1ZiwgMHg5ZCwgMHg4NSwgMHhjYSwgMHg1YywgMHgzMywgMHhiZiwgMHg2OCwgMHhmNiwKKyAgMHhlZiwgMHhhOSwgMHhlNiwgMHgwYSwgMHgzMSwgMHg1MCwgMHg1ZiwgMHhmZiwgMHgzZCwgMHgxNywgMHg5MCwgMHg0OCwKKyAgMHhiMSwgMHhlZiwgMHgxNCwgMHgzMywgMHgxNiwgMHgwZiwgMHhkZCwgMHg1OSwgMHhmZSwgMHg0YSwgMHgwMiwgMHhhZSwKKyAgMHhmYiwgMHg3MSwgMHg0NiwgMHgxNiwgMHg0NiwgMHgzNiwgMHgzNCwgMHhjOSwgMHg5MiwgMHg0MSwgMHgyNCwgMHg5MywKKyAgMHg4ZSwgMHgwNCwgMHgxNCwgMHg0NywgMHg2MiwgMHgyYSwgMHg1OSwgMHhkYywgMHg0ZCwgMHhhNSwgMHg4YSwgMHhhMiwKKyAgMHhjNSwgMHg2NSwgMHgxMSwgMHhlMywgMHgxNSwgMHg2YiwgMHg4MywgMHhlMSwgMHg2NywgMHg0ZSwgMHg4NywgMHg3ZCwKKyAgMHhjNCwgMHgzZCwgMHhkMiwgMHg1MSwgMHg1YiwgMHg2ZSwgMHg1ZCwgMHg2MSwgMHgwNSwgMHhhOSwgMHgzZSwgMHg5MCwKKyAgMHgxMSwgMHgxYSwgMHgyNiwgMHhiZCwgMHgwYiwgMHg5MiwgMHg5ZSwgMHgwYiwgMHg2NSwgMHgwMiwgMHg4YSwgMHhhOCwKKyAgMHg0YSwgMHg2NSwgMHhkNSwgMHgzYSwgMHgzZiwgMHg2YiwgMHhmNywgMHgxNCwgMHg5ZCwgMHgxMiwgMHhiNCwgMHhlMCwKKyAgMHhhYywgMHgwYiwgMHg0OCwgMHhlMSwgMHhiYSwgMHg2ZSwgMHhkMCwgMHg4OSwgMHg3MywgMHhhNSwgMHhjOSwgMHhkZSwKKyAgMHgwYywgMHhiMiwgMHhmNCwgMHg2NywgMHg3MywgMHg2ZCwgMHg4YywgMHhjMiwgMHg0YSwgMHhkNiwgMHgwNywgMHhiMCwKKyAgMHg4MiwgMHg4NSwgMHhhNywgMHgzNiwgMHhiYSwgMHgwNywgMHhmMiwgMHgwYSwgMHgwMSwgMHg2YywgMHg5MSwgMHg3OCwKKyAgMHhmNywgMHg0OCwgMHg0YywgMHgzYiwgMHgxYiwgMHgyZiwgMHhjZCwgMHg5YSwgMHgyYSwgMHg0NSwgMHhjNCwgMHgxZCwKKyAgMHhlZiwgMHhmYSwgMHg2MywgMHg5YiwgMHhmMCwgMHg2MCwgMHgyYywgMHhjYywgMHg2YiwgMHgyNywgMHgyZiwgMHhjNywKKyAgMHgxYiwgMHgwNSwgMHgxYSwgMHg1YSwgMHg4MSwgMHg0MCwgMHgyMiwgMHhiZSwgMHhiMSwgMHhiZiwgMHhjMiwgMHg2MSwKKyAgMHhkOCwgMHgwMCwgMHhhYSwgMHhjMywgMHgzMSwgMHg5ZSwgMHhlMCwgMHgwMCwgMHhiYSwgMHgwNiwgMHg1YSwgMHhhNCwKKyAgMHg4YywgMHgwYSwgMHgxMiwgMHhiMiwgMHg1MSwgMHhmYywgMHg4YiwgMHhjYywgMHg0ZSwgMHg4MiwgMHhhNiwgMHgwMCwKKyAgMHg0OSwgMHg3MCwgMHgzZCwgMHhiOSwgMHgwYSwgMHgwMywgMHgwNywgMHgyMSwgMHgxYSwgMHg5NCwgMHhjNSwgMHhiMiwKKyAgMHg5NCwgMHhjNCwgMHg0MSwgMHgwOSwgMHgwOCwgMHg0MiwgMHg1MiwgMHgxMCwgMHgwNSwgMHhiOCwgMHhhOSwgMHgyZiwKKyAgMHg4MSwgMHhlMSwgMHg4NCwgMHhhZSwgMHhiNSwgMHg3NywgMHg3NywgMHhhYiwgMHg0MSwgMHgyOCwgMHgwYiwgMHgxYywKKyAgMHhjZCwgMHhjNywgMHhiZCwgMHhiYywgMHg3MiwgMHg2MCwgMHhmYiwgMHg5ZiwgMHgzMSwgMHgyZCwgMHhkYywgMHhiMiwKKyAgMHgyMywgMHhlYiwgMHhhNiwgMHgyYiwgMHhlNCwgMHhkNCwgMHg5YiwgMHgxNCwgMHhmNiwgMHgyNiwgMHhjMywgMHhlMywKKyAgMHhkZCwgMHhlYiwgMHhiMywgMHgyOCwgMHhkYiwgMHg2NywgMHhjNCwgMHhiYiwgMHg1NiwgMHg2NCwgMHgwZSwgMHg1OSwKKyAgMHgxNywgMHg2OCwgMHhhZSwgMHg3YywgMHhlZCwgMHhkZiwgMHhiNCwgMHg2NiwgMHgzYiwgMHg2ZCwgMHg2ZSwgMHhhMywKKyAgMHhmMiwgMHhmNiwgMHhkOCwgMHg3NywgMHg4ZCwgMHhhYiwgMHhjOSwgMHg3ZSwgMHhlMywgMHg5NCwgMHhmMSwgMHg4YSwKKyAgMHg4OCwgMHg1YywgMHgxYywgMHg4NiwgMHhkZiwgMHhmMiwgMHhkNCwgMHgxOSwgMHhiZiwgMHhkNCwgMHgzNiwgMHhhMCwKKyAgMHhjNSwgMHhhZCwgMHg2MSwgMHg2MSwgMHhjYSwgMHg2ZiwgMHg1NiwgMHhiMCwgMHg3MiwgMHhlYSwgMHhhZSwgMHhhOSwKKyAgMHgzYiwgMHhhYiwgMHgxMywgMHg5NywgMHg1NiwgMHgyZiwgMHgwZiwgMHg1NywgMHhlZiwgMHhlNiwgMHg0NCwgMHg5ZSwKKyAgMHhjOSwgMHhmOSwgMHhjYSwgMHhkNywgMHg1ZCwgMHhjOSwgMHg2MywgMHhlNSwgMHg4NywgMHhkZiwgMHgwYSwgMHg1MywKKyAgMHhhOSwgMHhlYiwgMHhmOSwgMHg1YiwgMHhlNiwgMHg5ZiwgMHg2YSwgMHhiYSwgMHhlMywgMHhhNiwgMHg3OSwgMHg2MCwKKyAgMHg1NiwgMHgwOCwgMHgxZCwgMHgwMywgMHg2OCwgMHhiMSwgMHgzZCwgMHgzNiwgMHg1NywgMHg1ZSwgMHg4NSwgMHgwMiwKKyAgMHg1YSwgMHg0YSwgMHhkOSwgMHhmOCwgMHg2NSwgMHg2NCwgMHhiMywgMHg3MywgMHhjNywgMHgyNCwgMHg0ZSwgMHhkMiwKKyAgMHgxMywgMHgyZCwgMHgzMywgMHgzZSwgMHg1NCwgMHg2NSwgMHhjYywgMHhiOSwgMHg1MiwgMHhjZCwgMHgyYiwgMHg1NCwKKyAgMHhmYiwgMHhkNCwgMHg3MywgMHgxYiwgMHhlNCwgMHg4ZSwgMHgxYywgMHhhZCwgMHg0MCwgMHg2OCwgMHg5NCwgMHhlYSwKKyAgMHg4OSwgMHgwYSwgMHhmZSwgMHg5MCwgMHhhZCwgMHhlZiwgMHg0NSwgMHgzZSwgMHgxYiwgMHhkYiwgMHg1YiwgMHhmNywKKyAgMHg5NCwgMHg4NCwgMHhlZCwgMHhmNywgMHg0MiwgMHhkNiwgMHhkMiwgMHg2MiwgMHgxMiwgMHgzZiwgMHhkZCwgMHhiNiwKKyAgMHhjOCwgMHhhNiwgMHgzYywgMHhhNSwgMHg5ZCwgMHg4OCwgMHgwNywgMHg3MCwgMHg4MSwgMHhjNiwgMHgwMCwgMHgzNywKKyAgMHg2YSwgMHhhZiwgMHhmMiwgMHhkNiwgMHgwYiwgMHhkYSwgMHhkNCwgMHhjMCwgMHhkMSwgMHg1MSwgMHhjZiwgMHhhNywKKyAgMHgzMCwgMHhmMSwgMHg0NywgMHhhZiwgMHhmOCwgMHg5MywgMHgwNSwgMHhlNywgMHg4NywgMHhlMiwgMHgzZCwgMHhhMywKKyAgMHgwZiwgMHg4OCwgMHhiMiwgMHg1MiwgMHhkMSwgMHgyMCwgMHhhNiwgMHgxMiwgMHgwNywgMHg1YiwgMHhlZCwgMHhlMiwKKyAgMHhkNCwgMHhmYSwgMHg4MCwgMHgyOSwgMHhlNSwgMHhiNiwgMHg3YiwgMHgzYSwgMHg1YSwgMHhjZCwgMHg4MCwgMHg4MCwKKyAgMHgwMSwgMHgxNCwgMHg5NCwgMHg0YSwgMHgyMSwgMHg2OCwgMHhkZSwgMHg5MCwgMHhkYiwgMHg0ZiwgMHg1MCwgMHg0OCwKKyAgMHg0OCwgMHg5MSwgMHg1NSwgMHg2NSwgMHhlZiwgMHgyMSwgMHhhMSwgMHhlYSwgMHhmMiwgMHgzMSwgMHhjNSwgMHg3MSwKKyAgMHhiNSwgMHhlNCwgMHhjMywgMHg0MSwgMHg0ZiwgMHhhNCwgMHg1ZCwgMHg4MCwgMHhiOCwgMHg1NCwgMHgxYywgMHgyMSwKKyAgMHgxYSwgMHg5NCwgMHhiNSwgMHhhMiwgMHg5YywgMHhjNCwgMHg0MSwgMHgxMiwgMHgwNCwgMHhjMCwgMHgxMSwgMHg1NSwKKyAgMHg1OSwgMHg1MSwgMHg0ZCwgMHg3NSwgMHhjNiwgMHhhOSwgMHhjMiwgMHhkNiwgMHgwMSwgMHg0MCwgMHg2YiwgMHhjOSwKKyAgMHg0OSwgMHhhNCwgMHgwMiwgMHgzYSwgMHg3ZSwgMHhhMywgMHgxZCwgMHgxMiwgMHg4ZiwgMHhmOSwgMHg3ZCwgMHhjNCwKKyAgMHgzZCwgMHhmNSwgMHgzNSwgMHg0MywgMHg4YiwgMHhiNCwgMHgxZCwgMHg3NywgMHgxZiwgMHgzZCwgMHhlNSwgMHg0YiwKKyAgMHgzYiwgMHg2NiwgMHgwOCwgMHhiNywgMHhkYywgMHgxNSwgMHg1NywgMHg2YywgMHhlNCwgMHhmNCwgMHhhZSwgMHhhMSwKKyAgMHg5YSwgMHg1OCwgMHhiMSwgMHg3MywgMHgwOSwgMHhlYSwgMHgwOCwgMHhmNCwgMHg3YSwgMHhjZSwgMHgyMywgMHgzMCwKKyAgMHhlNywgMHhmZSwgMHg4NiwgMHgzNywgMHg2MCwgMHhmMywgMHhiZSwgMHhmOSwgMHhjNCwgMHg2YSwgMHg0NiwgMHgwMSwKKyAgMHg5ZSwgMHg4MiwgMHgzNywgMHgzOSwgMHhjNiwgMHg3OCwgMHhiZSwgMHg1NSwgMHg5ZSwgMHg2NiwgMHgwMSwgMHhiYiwKKyAgMHg0YiwgMHhjOSwgMHg0NywgMHg1YiwgMHhhOCwgMHg3NCwgMHhmYSwgMHhjYiwgMHgyNSwgMHgzOCwgMHgxYSwgMHgzNywKKyAgMHg4YiwgMHgzZSwgMHg5OCwgMHg1OCwgMHg3NiwgMHg4ZCwgMHg5NywgMHgzMSwgMHhlZiwgMHhkMywgMHg4ZiwgMHhkZiwKKyAgMHhiOCwgMHg2ZSwgMHhhMiwgMHg5NCwgMHhjYywgMHhlZCwgMHhmOCwgMHhlOCwgMHhlOSwgMHg4NywgMHhlOCwgMHg3MiwKKyAgMHhlZSwgMHhiZiwgMHhjMSwgMHgyNCwgMHgxMSwgMHg0YywgMHhhNiwgMHhhZCwgMHg2YywgMHhiZSwgMHhjNywgMHg4OCwKKyAgMHhhMSwgMHgyMCwgMHgwMCwgMHg4ZCwgMHhiNCwgMHhjMiwgMHgyOCwgMHhkZCwgMHhlZSwgMHhlYywgMHgyMywgMHg1MiwKKyAgMHg3MiwgMHgyZiwgMHhiNSwgMHg3NSwgMHg3OSwgMHg1NywgMHg0ZCwgMHg5MSwgMHhhMCwgMHgxZCwgMHg2OSwgMHhiMCwKKyAgMHhmMywgMHg2MiwgMHgzZCwgMHg5ZSwgMHg0MCwgMHg0MywgMHg0YSwgMHhhYiwgMHg2MiwgMHhiYywgMHg1YiwgMHgzOSwKKyAgMHgyMiwgMHg5OSwgMHhjMCwgMHg3OCwgMHg5ZSwgMHg0YSwgMHg2MCwgMHhiNywgMHhjMywgMHg0ZSwgMHhmNCwgMHgxOCwKKyAgMHg2MSwgMHhkYywgMHg4ZiwgMHgxNiwgMHgzMywgMHhhOCwgMHhjMCwgMHhhZSwgMHg4NiwgMHgxNywgMHgyZCwgMHg4OCwKKyAgMHg5YywgMHhiYiwgMHg0ZCwgMHg1YiwgMHg0OSwgMHhiMywgMHhmMCwgMHhkNCwgMHg0ZSwgMHg4YSwgMHgyNSwgMHg2YywKKyAgMHhlNSwgMHgxOCwgMHgzOSwgMHgyMSwgMHhjMSwgMHhjNywgMHg1ZCwgMHg2NiwgMHgxMywgMHgzNCwgMHg5NCwgMHgzMCwKKyAgMHgwZCwgMHhjMiwgMHgwMywgMHgxMCwgMHg4MCwgMHhjNCwgMHgyMCwgMHgyMSwgMHg2YSwgMHg1OCwgMHgyZSwgMHg4YSwKKyAgMHg2MywgMHhlZiwgMHhlNywgMHg4MiwgMHg4NSwgMHg5YiwgMHhkMCwgMHgyNCwgMHhjMywgMHg3MSwgMHg4NiwgMHhmZCwKKyAgMHhlZSwgMHgzMywgMHhjOSwgMHhlMiwgMHhiOCwgMHg2NiwgMHg3ZiwgMHhlMSwgMHhmZCwgMHhlZSwgMHhiNywgMHhkYSwKKyAgMHgxZCwgMHhkZiwgMHhkMywgMHgwMywgMHhhMCwgMHhiYSwgMHg1ZCwgMHhjNiwgMHhiZSwgMHhiNiwgMHhhYiwgMHg2YiwKKyAgMHhiZiwgMHg4NCwgMHhhMSwgMHg1ZSwgMHg5MywgMHhiZiwgMHhhZSwgMHhkMSwgMHg1OSwgMHhjYSwgMHhkYSwgMHhiYywKKyAgMHg2OSwgMHhjMCwgMHg0MywgMHhmNywgMHgwMCwgMHgwNCwgMHhiNCwgMHg0NywgMHg4NywgMHgzNSwgMHg4MiwgMHg3NSwKKyAgMHg1NCwgMHg0MiwgMHhkYywgMHhhMiwgMHgwOSwgMHg0NCwgMHhiOSwgMHg5ZSwgMHg2MCwgMHgwNiwgMHgzNywgMHg0YiwKKyAgMHhjNiwgMHg3MywgMHhhMSwgMHg3MiwgMHhjYywgMHhjMSwgMHg5NywgMHgzNSwgMHgzZiwgMHhiZSwgMHhhZSwgMHhiMCwKKyAgMHhhMCwgMHgwNywgMHgyMSwgMHgyYSwgMHg5NCwgMHhhZCwgMHhkOSwgMHgwMywgMHgwMiwgMHg2MSwgMHgyMCwgMHg4NSwKKyAgMHhhMCwgMHg0NSwgMHhlYywgMHhjNSwgMHg2MiwgMHhlYiwgMHg1YywgMHg2OSwgMHg3NywgMHgyMCwgMHhiMSwgMHg4MywKKyAgMHg0ZCwgMHg4NiwgMHhjNywgMHhhOCwgMHg0YiwgMHg0ZCwgMHg1OSwgMHhhZCwgMHgyNiwgMHg3MSwgMHhmZSwgMHg1MiwKKyAgMHhiOCwgMHg0NywgMHg4ZiwgMHhlMSwgMHg3MiwgMHg5OCwgMHgyMSwgMHhkNywgMHg0OCwgMHhiOCwgMHhjZiwgMHhjMywKKyAgMHhmOCwgMHhmZSwgMHg3YiwgMHhjMiwgMHg3YSwgMHhjMiwgMHg5MiwgMHg2OSwgMHg4MSwgMHhlNCwgMHg5ZSwgMHhmZSwKKyAgMHhkYSwgMHg3NywgMHgwYywgMHg3YiwgMHg5NiwgMHhiOSwgMHgwZiwgMHg2YSwgMHhlNiwgMHg4NywgMHgxNCwgMHgzYiwKKyAgMHg4YiwgMHhkNiwgMHhmYiwgMHhhNSwgMHhkMSwgMHg5OCwgMHgzNCwgMHg3NCwgMHg3MywgMHhlMiwgMHg3YiwgMHg0NywKKyAgMHgyZiwgMHg2MSwgMHg1OSwgMHhiOSwgMHg1MywgMHg3ZSwgMHhmNiwgMHhhZiwgMHhkNywgMHhhMCwgMHhkZCwgMHgwYiwKKyAgMHg0ZSwgMHg2MCwgMHhjMywgMHhhNywgMHhjOCwgMHg4OCwgMHgzMywgMHg2NywgMHg2NywgMHg2NSwgMHhiYywgMHhjMSwKKyAgMHg0YiwgMHhlMSwgMHhiYiwgMHg0NywgMHhhNywgMHhhYywgMHhhYiwgMHg4ZiwgMHgxYywgMHhjMSwgMHhhZCwgMHhiYywKKyAgMHhhNywgMHg0ZSwgMHg1ZSwgMHg1OCwgMHhkNCwgMHgzOSwgMHhhZSwgMHgwNywgMHgxOCwgMHhjNCwgMHgxNSwgMHhmNCwKKyAgMHgxMiwgMHg5MiwgMHhmMywgMHgzOSwgMHhkYiwgMHgwYSwgMHgxMCwgMHg4MSwgMHg1MywgMHg3YSwgMHhlMiwgMHhhOCwKKyAgMHhkNCwgMHg2YSwgMHg3YSwgMHhiYSwgMHg5NiwgMHhiZSwgMHhkNiwgMHgxMCwgMHhjMCwgMHg1NSwgMHhjZCwgMHhhZSwKKyAgMHg3ZSwgMHg2MiwgMHg2YywgMHg3OCwgMHhlZSwgMHhlZCwgMHgxOSwgMHg5OCwgMHhlOSwgMHhjNCwgMHgzMCwgMHg3MCwKKyAgMHgwMywgMHhiZCwgMHhhOCwgMHgxYiwgMHhlYywgMHhkOSwgMHhmZiwgMHhhOCwgMHgyZCwgMHhkMywgMHg0MSwgMHg3OSwKKyAgMHgwZCwgMHg3YywgMHhlMiwgMHg2YSwgMHg0MCwgMHgzYiwgMHg1MiwgMHgyOSwgMHg0MiwgMHg1NCwgMHg1NCwgMHhkYywKKyAgMHhhYSwgMHhjZiwgMHhkZiwgMHgzZiwgMHhhYSwgMHhiMiwgMHg4NSwgMHgxNSwgMHhmMywgMHg0MiwgMHgzYywgMHg2MiwKKyAgMHhjOCwgMHgyYywgMHg0NSwgMHgxOCwgMHgyNiwgMHg0OCwgMHgxNywgMHg0ZCwgMHg1YiwgMHgwNCwgMHhmMCwgMHgxMiwKKyAgMHg5YiwgMHhkOCwgMHg2NywgMHg4NSwgMHhkMywgMHgxMiwgMHgyOCwgMHhhNSwgMHhhYywgMHgwNCwgMHhhNSwgMHhhNSwKKyAgMHgwOCwgMHgwNSwgMHhhMCwgMHg4MCwgMHhjNCwgMHgyMCwgMHg2MSwgMHg1MCwgMHgwYywgMHgwMSwgMHg4MSwgMHhkNywKKyAgMHhlZSwgMHhhMCwgMHg1ZSwgMHgwOCwgMHhiZiwgMHgzMCwgMHhjZiwgMHg1ZCwgMHg3MywgMHhjZSwgMHg3ZiwgMHg3NCwKKyAgMHhmNCwgMHhjZiwgMHgyNywgMHhjZSwgMHg1MSwgMHhhNywgMHg4MSwgMHhmNywgMHg5NiwgMHg1ZCwgMHhkYiwgMHhhZCwKKyAgMHgyOCwgMHhkNiwgMHgwNiwgMHgwMSwgMHhlZSwgMHgxMCwgMHg5MSwgMHgyZiwgMHhiMCwgMHhkZSwgMHg0MCwgMHgwMSwKKyAgMHgxMiwgMHg3OSwgMHhhNCwgMHhiYiwgMHg4YiwgMHhjNSwgMHg3MCwgMHhkZSwgMHhiNiwgMHg0ZSwgMHhkYywgMHgzMywKKyAgMHg5MiwgMHg0MSwgMHhlMSwgMHg0MiwgMHgyOCwgMHgyYiwgMHg4OCwgMHg4NSwgMHhlYSwgMHg3MCwgMHgyNiwgMHg4NiwKKyAgMHhmNSwgMHg4MCwgMHgxOCwgMHhlZiwgMHgxMCwgMHhiOCwgMHgzMywgMHgzNSwgMHg1YiwgMHgxMCwgMHgwZSwgMHgyMSwKKyAgMHg0YywgMHhjNywgMHg0NywgMHg1ZCwgMHg2MiwgMHgzYSwgMHhlNCwgMHg0MSwgMHg5NywgMHg5YSwgMHgxYSwgMHhiZSwKKyAgMHg1ZCwgMHg4OSwgMHg0YywgMHhiOSwgMHhlNywgMHg1NiwgMHgxZiwgMHhjMCwgMHg3OSwgMHhmMiwgMHgzMiwgMHhmZiwKKyAgMHg4YSwgMHgzYywgMHg5ZCwgMHg0ZCwgMHg2MywgMHhmNiwgMHg1MiwgMHhmYywgMHhkZSwgMHg5NSwgMHhhMiwgMHgwNSwKKyAgMHgyNSwgMHg0ZSwgMHhiOCwgMHhiMywgMHg4NSwgMHg4MywgMHgxNywgMHhmYSwgMHgzZSwgMHg1MywgMHhmNiwgMHg0YiwKKyAgMHhlMywgMHg4NiwgMHg1MiwgMHgzMSwgMHgwYSwgMHgzZiwgMHhjZiwgMHgxZiwgMHhjNywgMHhmMSwgMHgwYSwgMHg4MCwKKyAgMHgxMSwgMHhkYywgMHhhYSwgMHg1YSwgMHg2ZiwgMHgyMiwgMHg3OCwgMHg0YSwgMHhiNiwgMHg3NCwgMHgxNywgMHhkMywKKyAgMHhhNiwgMHgyMCwgMHg3ZiwgMHhiMiwgMHhhMywgMHg1OSwgMHhlNCwgMHhkMywgMHg1NCwgMHhiYywgMHhlNywgMHgxZCwKKyAgMHg1NywgMHg3NywgMHg0ZiwgMHg5MiwgMHgxZCwgMHg2ZiwgMHhjNiwgMHg1YSwgMHgyMSwgMHhiYywgMHhiMiwgMHg3MSwKKyAgMHhhMCwgMHg4NiwgMHg0MiwgMHgzNywgMHg5YywgMHhhNywgMHhiNywgMHg2OSwgMHgxOSwgMHhiYiwgMHg0NywgMHg3YSwKKyAgMHhjMSwgMHgwMywgMHhmMywgMHgxNiwgMHg2MSwgMHgzZCwgMHg1ZSwgMHhiZCwgMHhiZSwgMHhiMiwgMHg0NywgMHhlMCwKKyAgMHgzZSwgMHg2MiwgMHg5ZiwgMHhlMSwgMHg5NSwgMHg2OCwgMHgwMywgMHhkNSwgMHhmYiwgMHg3YiwgMHg3NiwgMHhkZiwKKyAgMHgwMCwgMHgxMCwgMHg3MSwgMHgyNywgMHhlMiwgMHg5OCwgMHg4OSwgMHhkNSwgMHhkZiwgMHhmNiwgMHhhZiwgMHhlMCwKKyAgMHhkOSwgMHhkMSwgMHg1OSwgMHhkYywgMHg2YSwgMHg5ZCwgMHhjZCwgMHg5ZiwgMHgyMCwgMHgyYiwgMHg5NCwgMHhlOSwKKyAgMHhkYiwgMHgwZiwgMHg2MSwgMHgyNSwgMHhiYywgMHg3MywgMHg5MSwgMHgwMCwgMHgxNiwgMHhkYywgMHg5MywgMHhjNywKKyAgMHhhNywgMHhhMywgMHhmNiwgMHhiYSwgMHhkZiwgMHhhNCwgMHg3MiwgMHg0OCwgMHgxNywgMHhhZSwgMHhjZCwgMHhmYSwKKyAgMHg0ZiwgMHg3OSwgMHhmNSwgMHg5ZSwgMHhiMywgMHgxYSwgMHgzNSwgMHhmMCwgMHg3ZiwgMHgyNywgMHg5MiwgMHg3YiwKKyAgMHhhYSwgMHhhMCwgMHgxZSwgMHhlZiwgMHhjYSwgMHhjMSwgMHhhOSwgMHhjMiwgMHhlZSwgMHhmNiwgMHhmYSwgMHg5MSwKKyAgMHhmMywgMHgzYywgMHgwOSwgMHhmOCwgMHhmNiwgMHg3MCwgMHgyYywgMHgxOCwgMHhkZiwgMHgwOSwgMHhiOSwgMHgzOSwKKyAgMHhhYSwgMHg5OSwgMHgzMSwgMHg0YSwgMHhkMSwgMHgwNiwgMHhmYSwgMHhkZiwgMHhiZCwgMHg4MSwgMHgxYiwgMHg0MCwKKyAgMHg3YiwgMHgyOSwgMHg3MywgMHhjYSwgMHg4YiwgMHgwOSwgMHg1NywgMHg3OSwgMHhiOSwgMHhiZSwgMHgzNiwgMHhjZCwKKyAgMHgzNywgMHgzMywgMHg2OCwgMHhiNCwgMHgyMywgMHg5NCwgMHg1OSwgMHg1YSwgMHg3NywgMHhmZCwgMHhlOSwgMHgwNCwKKyAgMHg4YSwgMHhhOCwgMHgxNCwgMHg1OSwgMHgwYywgMHg2MCwgMHgxNSwgMHg4NCwgMHhkNSwgMHhkZiwgMHhhYiwgMHg1MiwKKyAgMHhmMSwgMHhlYiwgMHg0MCwgMHhlMCwgMHg3NSwgMHgzYSwgMHgzZCwgMHg3NywgMHg1NywgMHhlMCwgMHhjNiwgMHg1OSwKKyAgMHg0ZSwgMHhhZSwgMHg4OCwgMHgxZiwgMHhlYywgMHhlNSwgMHhmNCwgMHhjYywgMHgzMCwgMHhjOCwgMHgwMiwgMHg1OCwKKyAgMHhiZSwgMHg5MSwgMHg1MCwgMHgwNCwgMHg5NSwgMHgxNCwgMHg1MCwgMHg0ZiwgMHgwMiwgMHhhNCwgMHhlOCwgMHgzOSwKKyAgMHg5OCwgMHgxYywgMHhkMSwgMHg2MiwgMHgwNiwgMHgwOCwgMHgyMSwgMHg0MSwgMHgwNSwgMHhmYywgMHgzZCwgMHhhZCwKKyAgMHg1ZiwgMHhkOSwgMHhjZCwgMHg4NSwgMHg5NywgMHhlNSwgMHgwMiwgMHg5MiwgMHhhMywgMHgxYywgMHhhZiwgMHgzYSwKKyAgMHg4MCwgMHhkZiwgMHg3MSwgMHg3ZCwgMHgyNiwgMHhmNSwgMHhkZCwgMHg2NiwgMHhhNiwgMHg5NSwgMHg2ZiwgMHgwYywKKyAgMHg4MCwgMHg2NiwgMHhmYywgMHgyZiwgMHg0NywgMHgzYywgMHg2OCwgMHhhOCwgMHhlNiwgMHhhMiwgMHgyMSwgMHgzNCwKKyAgMHg4MiwgMHgzYSwgMHg3NSwgMHgwOCwgMHg0YSwgMHg3NiwgMHhjOCwgMHgxOSwgMHgwZiwgMHhjOCwgMHgxNSwgMHgwYiwKKyAgMHgzYiwgMHg3ZiwgMHg0YSwgMHhmNCwgMHhkOSwgMHg2ZSwgMHg5YiwgMHhlMiwgMHg2NiwgMHg1ZiwgMHg5YSwgMHhlNSwKKyAgMHgzZSwgMHg4YiwgMHg3NiwgMHg5OCwgMHhkMywgMHg1NCwgMHg0YSwgMHgyNCwgMHg2MSwgMHgzZSwgMHg3MSwgMHhiYSwKKyAgMHgxMSwgMHgwNSwgMHg5OCwgMHgwNywgMHgyMSwgMHg3YSwgMHg5NCwgMHhjNSwgMHhkYSwgMHgwOCwgMHg4MywgMHgxNiwKKyAgMHhiMywgMHg4MSwgMHg0ZSwgMHgxMiwgMHg5YiwgMHgwOSwgMHhhMiwgMHhmYywgMHg4YiwgMHg0MCwgMHgwMCwgMHgwZSwKKyAgMHg3ZCwgMHg2MSwgMHg5ZSwgMHhmYSwgMHg1YiwgMHgzNCwgMHhmYiwgMHhjYiwgMHg4ZiwgMHg4ZCwgMHgyZCwgMHg1MCwKKyAgMHg2YywgMHgxYywgMHg1YiwgMHhjYiwgMHhmOSwgMHg0ZSwgMHgyZCwgMHgwZCwgMHg3YywgMHhmYSwgMHgwZiwgMHg4MiwKKyAgMHhlZSwgMHhiYywgMHgyMywgMHgzMSwgMHg2MywgMHhhOSwgMHgwYywgMHhlNywgMHgzMywgMHhkMiwgMHgzYywgMHg2ZCwKKyAgMHhkNywgMHg1OSwgMHg5MywgMHhlOCwgMHgzMiwgMHg4ZSwgMHg3MywgMHhjNywgMHgzMywgMHhjMywgMHhjZSwgMHhlNiwKKyAgMHhlYywgMHgzYiwgMHgwYiwgMHg3MywgMHg1NSwgMHgxZSwgMHhmMiwgMHgxYiwgMHg2OCwgMHg4MywgMHhlYSwgMHgzNSwKKyAgMHhhOCwgMHhmZCwgMHgzMywgMHhmMCwgMHhkYiwgMHg4MSwgMHg4ZSwgMHgwOSwgMHhhMSwgMHhhYywgMHgxZCwgMHg5ZiwKKyAgMHg0NCwgMHg4YiwgMHg1MSwgMHhjOCwgMHgzOSwgMHhiNiwgMHhlNywgMHhlZSwgMHhiZCwgMHg0NSwgMHhjYywgMHhmMCwKKyAgMHg1YSwgMHhhMywgMHhhMCwgMHhmNiwgMHg1NSwgMHg1ZiwgMHg5MSwgMHhhNywgMHhhOSwgMHhjNSwgMHgzYiwgMHhkOCwKKyAgMHhiMSwgMHhhZSwgMHhjZCwgMHg1YSwgMHg4OSwgMHgzOCwgMHg5ZiwgMHg0YSwgMHgwYywgMHg4NCwgMHgyNCwgMHg5NSwKKyAgMHhiOSwgMHgxNSwgMHg5OSwgMHhjOSwgMHg1ZSwgMHg2NiwgMHg1MiwgMHg3NSwgMHg3ZCwgMHhmYywgMHg1ZSwgMHgyYiwKKyAgMHgzOCwgMHhkYiwgMHgxYywgMHg2YSwgMHg4NCwgMHg2MywgMHhlOCwgMHg1YiwgMHg5ZCwgMHgyMywgMHgyZCwgMHhmNCwKKyAgMHgwNiwgMHgyOCwgMHgwNiwgMHhiMiwgMHgyMSwgMHgwOCwgMHgxMywgMHg4MCwgMHg3NiwgMHg1YSwgMHg2ZiwgMHgwYSwKKyAgMHg1YiwgMHhjOCwgMHg5ZSwgMHg5NywgMHg4MiwgMHhiZCwgMHhlNywgMHgzMywgMHg4MSwgMHhiNSwgMHg1NCwgMHgzNywKKyAgMHhiMiwgMHg1MSwgMHhmMCwgMHhjNywgMHg4MSwgMHg5MiwgMHg5MywgMHhiZiwgMHgxOCwgMHhkMiwgMHhiMywgMHhhZiwKKyAgMHg1NiwgMHg1YiwgMHhlMywgMHg5NywgMHhiMiwgMHgxZiwgMHgzZiwgMHhkNiwgMHhhOSwgMHhjNiwgMHg5MSwgMHhiMSwKKyAgMHhkMiwgMHgzNywgMHhjMywgMHhjNiwgMHgzNiwgMHhlMywgMHhkZCwgMHhjYSwgMHg3MCwgMHhhYywgMHhlOSwgMHg5ZiwKKyAgMHhhNCwgMHg2MywgMHhkOSwgMHg2YSwgMHhkMiwgMHhmYiwgMHhkMywgMHgzNCwgMHhkZiwgMHg5NCwgMHg2MSwgMHgxYywKKyAgMHhhYSwgMHg1NSwgMHg0YSwgMHhiNCwgMHhlYSwgMHg4NCwgMHgxMSwgMHg1ZCwgMHhmYywgMHg5YSwgMHg2ZCwgMHgxOCwKKyAgMHhjYSwgMHgwNywgMHhmMCwgMHgwNCwgMHhhZCwgMHg5ZSwgMHgwOCwgMHg4NCwgMHgxMSwgMHhkOCwgMHg4ZSwgMHhjMSwKKyAgMHg5MCwgMHhiMSwgMHg4MCwgMHgwZiwgMHg4NiwgMHg5NiwgMHg1OCwgMHgyMSwgMHg2MCwgMHgwZSwgMHhlZSwgMHg4OCwKKyAgMHhlNiwgMHg0MSwgMHgxZCwgMHgzYSwgMHg3YiwgMHg5MSwgMHhiOSwgMHg5ZiwgMHhiNSwgMHgxNiwgMHgyMywgMHhmMiwKKyAgMHg4YSwgMHgzNywgMHhhNCwgMHg2OCwgMHgxYiwgMHhiMSwgMHhhNiwgMHgyOCwgMHg0YiwgMHg0ZSwgMHg2MCwgMHgyYywKKyAgMHg4OSwgMHg2NiwgMHg1MywgMHg0YywgMHg1NCwgMHgwZSwgMHgxZiwgMHhkZiwgMHg5OSwgMHg2OSwgMHg4NiwgMHg2NSwKKyAgMHhiOSwgMHhiNCwgMHgyYSwgMHhjYSwgMHg1MSwgMHg0YSwgMHgyOCwgMHgwMCwgMHg0ZiwgMHg2YSwgMHg1MSwgMHgwNiwKKyAgMHhmNywgMHg0NywgMHhjYSwgMHg3NCwgMHg5ZSwgMHhhZiwgMHhkNCwgMHhiNiwgMHgyMCwgMHgyNCwgMHhkZCwgMHhmNCwKKyAgMHg0ZCwgMHgxMCwgMHgwNywgMHgxMCwgMHgyZCwgMHg1MiwgMHg4YywgMHgwYywgMHhmNSwgMHgwMCwgMHgwMiwgMHg3YywKKyAgMHg3NiwgMHg4OSwgMHgwNCwgMHhlZSwgMHgyZCwgMHgxMCwgMHg1OCwgMHg5MCwgMHg1MSwgMHg1MiwgMHhlNCwgMHhiMSwKKyAgMHgxMSwgMHhhYywgMHgxNiwgMHg4ZCwgMHg1MiwgMHg4NCwgMHhmMSwgMHgwMCwgMHgwMCwgMHgzOSwgMHgwZCwgMHhlOSwKKyAgMHg2ZCwgMHgxMCwgMHhlMCwgMHgyMSwgMHgxYSwgMHg5NCwgMHhkNSwgMHhjZSwgMHg4YiwgMHg2MSwgMHg4MSwgMHgzMCwKKyAgMHg4OCwgMHg2OCwgMHg1MSwgMHgxOSwgMHgwNCwgMHgwMiwgMHg4NSwgMHhhMywgMHgyZSwgMHgwYywgMHgxMSwgMHhhZSwKKyAgMHgyZiwgMHg4MCwgMHgyYywgMHg4MywgMHgxYSwgMHgyZCwgMHg5NSwgMHhhOSwgMHg1MiwgMHgzOCwgMHgwMCwgMHg3NCwKKyAgMHg5NywgMHhkZiwgMHhmZCwgMHhmYiwgMHhhNCwgMHhmNywgMHg0NiwgMHhlYSwgMHg3MSwgMHg3OCwgMHhiNywgMHhkNCwKKyAgMHhiYSwgMHgxMywgMHg1MSwgMHg2ZCwgMHgxYiwgMHhiYywgMHg1NSwgMHhlYiwgMHhmZiwgMHg0MiwgMHgzYSwgMHgyOSwKKyAgMHhkYiwgMHhkYiwgMHhhMCwgMHgyOCwgMHgzMCwgMHhmOCwgMHgyNSwgMHg2NiwgMHg1ZiwgMHhjMCwgMHg0NywgMHhkYiwKKyAgMHhmNywgMHgyMiwgMHgyOSwgMHhmMywgMHg3NiwgMHg3OSwgMHhiYSwgMHg0MiwgMHhkMywgMHhkNCwgMHg1ZiwgMHhkNiwKKyAgMHg2NywgMHhmMCwgMHhhZiwgMHg5ZSwgMHg5ZSwgMHhmOSwgMHg5OSwgMHhmMCwgMHhmOCwgMHgyOCwgMHhjOCwgMHgwMCwKKyAgMHhmNiwgMHgwNywgMHhkMiwgMHg3ZSwgMHg2YiwgMHhhZCwgMHg3MywgMHgwMywgMHhlYSwgMHg5NSwgMHhiOCwgMHgyOSwKKyAgMHhmOSwgMHgzNCwgMHg5MSwgMHhjZiwgMHhiNywgMHhlNSwgMHhlOSwgMHg3YywgMHg1YSwgMHgyZiwgMHgwYiwgMHhiNywKKyAgMHhjNywgMHhkOSwgMHg0YSwgMHhiYiwgMHg3OSwgMHg1MSwgMHhkYiwgMHgwZSwgMHg2NywgMHg5NSwgMHg3YSwgMHg0NiwKKyAgMHg3ZCwgMHg0YiwgMHg5OCwgMHgxYSwgMHhmMywgMHhkOSwgMHgzOCwgMHgxYiwgMHhiNCwgMHhmNSwgMHg1OCwgMHhmYiwKKyAgMHgwYywgMHgwNywgMHgwNiwgMHhmYiwgMHg4ZSwgMHg5ZCwgMHhhMCwgMHg4NiwgMHhiOCwgMHhkNywgMHg5ZiwgMHhiMywKKyAgMHg5YSwgMHg4NywgMHg2ZSwgMHhmZCwgMHg0ZiwgMHg1MiwgMHhlMSwgMHhhYywgMHhiNiwgMHg5YSwgMHgyOCwgMHgxZiwKKyAgMHhkZCwgMHhhOCwgMHg4MywgMHg1MSwgMHg4NywgMHhlZCwgMHgxMiwgMHhmMCwgMHgzZCwgMHg4NiwgMHg0YSwgMHg2YiwKKyAgMHg4YywgMHg3MSwgMHgzNSwgMHhkZCwgMHg3ZSwgMHhlMywgMHhiZiwgMHhjMSwgMHg5NCwgMHgxNiwgMHhhMiwgMHhlMCwKKyAgMHg3ZiwgMHgzNywgMHhiMiwgMHhiMywgMHg2MCwgMHhiNCwgMHhjZCwgMHgwMywgMHhlNCwgMHhhNCwgMHgyNywgMHhhMCwKKyAgMHgxNCwgMHg1YSwgMHg3NywgMHgzMiwgMHgxMSwgMHgxNywgMHgzMywgMHgyZCwgMHg2MCwgMHhhZSwgMHg4ZSwgMHgwZSwKKyAgMHg0NiwgMHgxYywgMHhmOSwgMHhhNiwgMHg4NSwgMHg2MCwgMHg3MiwgMHhmZCwgMHhhYywgMHgxMCwgMHg0YiwgMHhhZSwKKyAgMHhkNiwgMHgwMywgMHg0NiwgMHg5YiwgMHhiMywgMHhiNywgMHhlZiwgMHhiYSwgMHg2NSwgMHhmZCwgMHhkYSwgMHhlZSwKKyAgMHgxOSwgMHgwMywgMHg1NywgMHg1OSwgMHgyZSwgMHhjMSwgMHg2YywgMHhhZSwgMHgwZSwgMHgzOSwgMHg4MSwgMHgxYywKKyAgMHhjNCwgMHg4NSwgMHg4MiwgMHg3NywgMHhiYywgMHg4NCwgMHg2OCwgMHg5OCwgMHhkYSwgMHhiNiwgMHhiMywgMHhlYiwKKyAgMHgyYSwgMHg0MCwgMHhlMywgMHhiMywgMHhjOCwgMHhkYywgMHgwYywgMHhjMCwgMHgyYywgMHgyOCwgMHgzZSwgMHgzYiwKKyAgMHg3ZiwgMHhhNywgMHhkYywgMHg3ZiwgMHhmNywgMHhlYywgMHhkOSwgMHg2OSwgMHhhYiwgMHhiMiwgMHg2MiwgMHg4ZSwKKyAgMHhjOCwgMHgwMSwgMHhjOCwgMHg4MCwgMHg2MiwgMHgxNiwgMHgxOSwgMHgwYywgMHg0NiwgMHgwMiwgMHgxMywgMHg5OSwKKyAgMHg3MCwgMHgyMCwgMHgxNywgMHhlYywgMHhkMCwgMHhkMCwgMHgxYywgMHg2MCwgMHhiNiwgMHg1MiwgMHhhNywgMHg0MCwKKyAgMHgwMCwgMHgxMywgMHhkZSwgMHhhYiwgMHg3ZiwgMHg5OSwgMHg4NSwgMHg0MCwgMHg2YSwgMHhiNSwgMHg0MSwgMHgyMywKKyAgMHhiNiwgMHgwOSwgMHhmNywgMHg5NywgMHg5OSwgMHgwNCwgMHhiMywgMHg5OSwgMHg3MiwgMHhiYSwgMHg4NSwgMHhhMCwKKyAgMHhhOSwgMHg5OSwgMHg4MiwgMHgwNSwgMHg5MiwgMHg4NCwgMHgwOSwgMHg0YSwgMHgyYSwgMHhiMSwgMHhhZiwgMHhjZCwKKyAgMHhiZCwgMHhmNywgMHg2NiwgMHg5YywgMHgyNiwgMHhlMywgMHhmMywgMHgwNywgMHg2ZiwgMHgzZiwgMHgyZiwgMHhlMywKKyAgMHhmYywgMHhmZSwgMHgzOSwgMHhmMSwgMHhjMywgMHhhZiwgMHg2NywgMHg5MiwgMHhmOSwgMHhmMCwgMHhkNywgMHgzYywKKyAgMHg4YywgMHg4ZSwgMHgyZCwgMHg2ZCwgMHg1MywgMHg1NiwgMHg3NCwgMHgwMywgMHhiMywgMHhjZCwgMHg2NSwgMHhlNSwKKyAgMHg2YiwgMHg4YSwgMHg0ZSwgMHg5ZSwgMHg4ZSwgMHg3OCwgMHhjMCwgMHgyNCwgMHhlYywgMHg5YSwgMHhhNiwgMHgwMSwKKyAgMHg3NSwgMHg0MSwgMHg5YSwgMHgzYiwgMHgzZSwgMHgzYywgMHgyNCwgMHhkMSwgMHg2OSwgMHgxZSwgMHhjYywgMHhjYywKKyAgMHgyZiwgMHg5NCwgMHgyNSwgMHhjMSwgMHg2ZiwgMHg5NSwgMHg5YiwgMHg2YywgMHgzMywgMHgwMCwgMHg0YSwgMHhjMCwKKyAgMHhjYiwgMHgyZiwgMHg4YSwgMHgzZSwgMHg1OCwgMHgwOSwgMHgxNSwgMHg3OSwgMHg0MCwgMHgxYywgMHgyMSwgMHgxYSwKKyAgMHg5NCwgMHhjZCwgMHg5ZSwgMHg5ZSwgMHhjMywgMHg0MSwgMHgxMiwgMHgwNCwgMHhlNiwgMHg0OCwgMHhkMywgMHgyYywKKyAgMHg1MywgMHg2MywgMHg4YiwgMHhlMiwgMHhmNCwgMHg5NiwgMHg1YSwgMHgwMCwgMHg1OCwgMHg1ZiwgMHg3OCwgMHhhYywKKyAgMHgwNywgMHg4YSwgMHhmNiwgMHhiMywgMHhhYiwgMHgwYywgMHhmMCwgMHgxZSwgMHhmNiwgMHhiYywgMHhhZiwgMHhlYiwKKyAgMHg1YywgMHhiZCwgMHg2NSwgMHhmMCwgMHhiNiwgMHg3YiwgMHhjYSwgMHhiZSwgMHg4ZSwgMHhiYiwgMHgxMywgMHg3ZCwKKyAgMHhhZiwgMHgwZSwgMHhjZiwgMHgzMiwgMHhhZiwgMHhlNiwgMHhmMiwgMHgwYywgMHhlOSwgMHgzMywgMHhiMCwgMHg3NiwKKyAgMHgwOCwgMHg1YSwgMHhmZiwgMHg5NywgMHg2NiwgMHhkZSwgMHhjOSwgMHg0NSwgMHhjNiwgMHhmNywgMHhhYywgMHg4NywKKyAgMHg5MSwgMHhkZiwgMHhmZiwgMHg3NywgMHg5YywgMHg3ZSwgMHg5MywgMHhhZSwgMHhlNCwgMHhlNCwgMHhiOSwgMHgwNSwKKyAgMHg1NywgMHg3YiwgMHhmMywgMHhiMywgMHg1YSwgMHgyMSwgMHhlZiwgMHg0ZCwgMHhiMSwgMHgxNCwgMHg5NywgMHgxYiwKKyAgMHg5OSwgMHgzNSwgMHg5ZCwgMHhiNSwgMHhhNiwgMHg2YywgMHhlMSwgMHg2ZCwgMHgxOSwgMHg1NSwgMHgwYSwgMHg0MywKKyAgMHgwYywgMHg4ZCwgMHgyMCwgMHg0YiwgMHhkNywgMHgyYywgMHg2NCwgMHgwMiwgMHg1NCwgMHg3NywgMHg0YiwgMHg2ZiwKKyAgMHg1NSwgMHg1MSwgMHg3NywgMHhjMCwgMHhmZSwgMHhiZCwgMHhkZSwgMHhmZCwgMHgyYSwgMHhmNiwgMHhjZSwgMHgwMywKKyAgMHg3OCwgMHgxZCwgMHg3NCwgMHg1NCwgMHhjZSwgMHgxYSwgMHg3OSwgMHg3NywgMHhhMCwgMHhhNiwgMHg3MSwgMHg1ZCwKKyAgMHhkMSwgMHhlMiwgMHhhOSwgMHg3ZCwgMHgzMSwgMHg0OCwgMHgwMCwgMHgyNSwgMHgyMiwgMHg1MCwgMHg0NiwgMHg2MywKKyAgMHg0ZCwgMHgyZCwgMHg1OSwgMHhjZSwgMHg3MCwgMHhhNSwgMHhkNCwgMHhiMSwgMHg4MywgMHg3NiwgMHg3NCwgMHgxNiwKKyAgMHgyOSwgMHg1ZiwgMHg3MCwgMHgyZiwgMHhlNywgMHhkYiwgMHhiYSwgMHhlNiwgMHhjMywgMHhlMSwgMHg0NiwgMHhjMCwKKyAgMHhiOSwgMHhkYSwgMHgzZiwgMHg3ZCwgMHg4YiwgMHhmNCwgMHg2NywgMHg4YiwgMHhkNiwgMHhmMywgMHg2MiwgMHg4ZiwKKyAgMHgxMywgMHhlNywgMHhmMiwgMHgwMSwgMHhmMiwgMHg5ZiwgMHhjNywgMHg5NCwgMHg0MSwgMHg0NiwgMHg3NywgMHhjYiwKKyAgMHhiNSwgMHg2MywgMHhmMywgMHg4NywgMHhlMSwgMHhmZCwgMHg3MiwgMHg1YiwgMHg3NSwgMHg0MiwgMHg1YSwgMHg5NCwKKyAgMHg4NSwgMHgwMSwgMHhiOCwgMHg4NiwgMHgwOCwgMHgxMCwgMHgxMCwgMHg4ZCwgMHg0MSwgMHhiZSwgMHhhYSwgMHg2ZCwKKyAgMHg0YiwgMHg3MCwgMHg1YiwgMHg1YSwgMHhiNSwgMHhkYywgMHgwNiwgMHg5OCwgMHgxOCwgMHgxYSwgMHg0OSwgMHhiZiwKKyAgMHhlYiwgMHhhNiwgMHg4YywgMHhiNiwgMHg2YiwgMHhmMCwgMHg1NywgMHgyYywgMHgyZiwgMHhlYiwgMHhiYiwgMHgyZCwKKyAgMHg1MSwgMHg0MSwgMHg2NSwgMHg0ZCwgMHg2ZSwgMHg2YSwgMHg0YiwgMHhlMywgMHhjMiwgMHg4YywgMHhiNCwgMHg4MSwKKyAgMHg1YywgMHgwMiwgMHg0NSwgMHgzNywgMHhlOSwgMHhmZSwgMHg0ZSwgMHg4NSwgMHhiMSwgMHg4MCwgMHgyMCwgMHg1YywKKyAgMHgwMCwgMHg4OCwgMHgyMiwgMHhhMiwgMHg0OSwgMHg1MCwgMHgwMiwgMHg4MiwgMHhjMiwgMHhlNiwgMHgxYSwgMHg0NywKKyAgMHg3ZCwgMHgyMiwgMHg1OCwgMHg1YSwgMHgxZSwgMHg1YiwgMHhhMSwgMHg1OSwgMHgyNywgMHg5ZSwgMHhmMCwgMHgwNCwKKyAgMHg0NiwgMHg4OCwgMHgwNSwgMHhmYSwgMHg2NywgMHg5OCwgMHgxNSwgMHg0MywgMHg1MSwgMHgxZiwgMHg1OCwgMHg1NiwKKyAgMHg2NywgMHhjYiwgMHhmOCwgMHhmOCwgMHg0MCwgMHgwNywgMHg3ZCwgMHhjYSwgMHg1NiwgMHgzOSwgMHg4MywgMHgwNywKKyAgMHgyMSwgMHgxYSwgMHg5NCwgMHhhZCwgMHhjNiwgMHg4OSwgMHgwNywgMHg0NywgMHgwMCwgMHgxNiwgMHgxYiwgMHhhNCwKKyAgMHhlOSwgMHhhZCwgMHg0YywgMHhlYSwgMHg0OSwgMHg2MCwgMHhhNCwgMHgwNSwgMHhiMiwgMHg3NywgMHgxMiwgMHg0NywKKyAgMHhlYywgMHhiYSwgMHg0MCwgMHhjYiwgMHhmMywgMHg3MiwgMHg2ZCwgMHgzZCwgMHg2YywgMHg5ZCwgMHg2ZCwgMHgyZCwKKyAgMHhiNiwgMHg0YywgMHg1NywgMHhmYiwgMHhlNywgMHg4OSwgMHhiNywgMHg0YSwgMHhmOCwgMHgzZSwgMHg1MCwgMHg2MCwKKyAgMHg3MSwgMHg2NiwgMHhjYiwgMHhmNCwgMHg0MiwgMHgzMSwgMHhkMCwgMHgzMSwgMHgxNywgMHhlYywgMHg4ZCwgMHg5MiwKKyAgMHgyOSwgMHg1OCwgMHhhZSwgMHg3YywgMHg5MCwgMHhiYywgMHhlYiwgMHgzZiwgMHhlOSwgMHhmZCwgMHg1YiwgMHg4NCwKKyAgMHhjMCwgMHgyOCwgMHg3MSwgMHg3MCwgMHhhNywgMHhhYiwgMHhiZSwgMHhkOSwgMHhkNiwgMHhmZCwgMHg2MywgMHhlMCwKKyAgMHhiNCwgMHhjNiwgMHg1YywgMHhkNSwgMHg1OCwgMHg5NiwgMHgyZiwgMHhjNSwgMHgxNywgMHhmOSwgMHg4ZSwgMHgxNiwKKyAgMHgzMiwgMHhiZiwgMHhkMCwgMHhiZCwgMHg4ZiwgMHg5NSwgMHg1MywgMHg3MiwgMHhhNSwgMHhlZiwgMHhmYSwgMHg4ZCwKKyAgMHg1YSwgMHgzMywgMHhhMSwgMHhlZCwgMHgzYSwgMHg3NiwgMHg3OSwgMHhiZCwgMHgwZCwgMHg3ZSwgMHg1NSwgMHgxOCwKKyAgMHg3MywgMHgzYiwgMHgyYSwgMHhlYywgMHg2MCwgMHg4NSwgMHgxMiwgMHgzNywgMHhlNiwgMHgwYywgMHg3OSwgMHg2ZiwKKyAgMHgyNiwgMHhjYywgMHgyZCwgMHhjNiwgMHhhMCwgMHgzMiwgMHgwYSwgMHg0ZiwgMHg3NiwgMHgzOCwgMHhiNCwgMHhkZiwKKyAgMHg2MSwgMHg2ZiwgMHhhNSwgMHgxMSwgMHgzMSwgMHhkNCwgMHg0NSwgMHhjNywgMHg4MSwgMHg4MiwgMHhkYiwgMHg0MCwKKyAgMHg4NCwgMHhkZiwgMHg0MCwgMHg4NiwgMHhkZiwgMHgwMCwgMHgxMywgMHgyOCwgMHg4MCwgMHhhNiwgMHhmOSwgMHgwNiwKKyAgMHgyYywgMHg0OCwgMHgyMiwgMHhkOCwgMHg4OCwgMHgwOSwgMHg2OCwgMHgyNCwgMHhlZSwgMHhjOCwgMHg1OCwgMHg2NCwKKyAgMHhiNCwgMHg5NSwgMHg1ZiwgMHhjOSwgMHgwMiwgMHhjNywgMHgzYywgMHgxYywgMHg3NiwgMHgzYywgMHhhYSwgMHgwYSwKKyAgMHg2NSwgMHg3NSwgMHgyYiwgMHhjYSwgMHgwOCwgMHg0ZiwgMHgxYiwgMHhkMiwgMHhjZiwgMHhlYSwgMHhjYywgMHgwYSwKKyAgMHg1ZSwgMHg2YiwgMHgzZiwgMHg1MSwgMHg1ZiwgMHhlZiwgMHgzNywgMHhjZCwgMHgyMiwgMHhlNCwgMHgyMCwgMHhlYSwKKyAgMHhhZiwgMHhjZCwgMHgxYywgMHg4MSwgMHhiYiwgMHg1MCwgMHg5YywgMHhiNywgMHg5YiwgMHg2MiwgMHg5MCwgMHg4ZCwKKyAgMHg2MCwgMHg1OCwgMHgwNSwgMHg4NiwgMHg2MSwgMHg5YSwgMHgxYiwgMHgzMCwgMHg1NiwgMHhhNiwgMHg0ZSwgMHhkMCwKKyAgMHgxMCwgMHgzZiwgMHg2ZSwgMHgwYSwgMHg2OSwgMHg3MiwgMHhiMywgMHg4NSwgMHhlYywgMHgyZCwgMHgzNSwgMHg5OSwKKyAgMHgzMSwgMHhmZiwgMHgyNSwgMHg4OCwgMHhiNiwgMHgzOCwgMHg0NSwgMHg1NSwgMHg1OCwgMHhkNSwgMHg0NSwgMHg2ZSwKKyAgMHg3MSwgMHgwMCwgMHhhMCwgMHhiNSwgMHg5ZSwgMHg0YSwgMHg3ZSwgMHhhMywgMHhiYiwgMHhiYywgMHhhNSwgMHg5ZCwKKyAgMHg5MCwgMHgwMywgMHg3MiwgMHg4MCwgMHg1MCwgMHhhMiwgMHg3NCwgMHgwOCwgMHgwOCwgMHg0NiwgMHgwMSwgMHg1MiwKKyAgMHhhOCwgMHg4NSwgMHhiZCwgMHg5YywgMHg1YSwgMHhlMCwgMHgwMCwgMHgyMiwgMHg5ZSwgMHhiMSwgMHhjYywgMHhiYywKKyAgMHg1NywgMHhkMywgMHg1OSwgMHg2MywgMHhjNywgMHhiYywgMHg2MywgMHg0YywgMHhlNiwgMHg1YSwgMHg3MywgMHgzZCwKKyAgMHhkNiwgMHgyMCwgMHg0OSwgMHhmNSwgMHg0YiwgMHgwNCwgMHg3MCwgMHhiMCwgMHhhOCwgMHg2MywgMHg0NiwgMHhiNCwKKyAgMHhjOCwgMHgxMCwgMHg5MiwgMHgyMSwgMHgzOCwgMHgxOCwgMHhkNSwgMHhjZSwgMHgzZiwgMHgzNywgMHhiZCwgMHhjNSwKKyAgMHgwOSwgMHgwMiwgMHgwMCwgMHgyOSwgMHgwNCwgMHg5NiwgMHhlMCwgMHgzOCwgMHg4OSwgMHg2ZiwgMHhmZiwgMHg3YywKKyAgMHhiMywgMHg0YiwgMHhmMiwgMHgwYSwgMHhmNSwgMHgzNywgMHg3MywgMHgwNywgMHhmYSwgMHg0YywgMHhjYywgMHgzNywKKyAgMHg5MSwgMHg2NiwgMHgwYiwgMHg1ZCwgMHhiMSwgMHg1NSwgMHhiMywgMHhhNSwgMHg2ZCwgMHhlNywgMHhjZSwgMHg4NCwKKyAgMHg2ZCwgMHg4YywgMHhjNCwgMHhmMSwgMHhhYywgMHg2NCwgMHg3MiwgMHg4NSwgMHgzMSwgMHhlOCwgMHhiYywgMHg3ZSwKKyAgMHg5MCwgMHhiYiwgMHgwNCwgMHg2NywgMHhhMiwgMHgwYiwgMHhiYywgMHg3NCwgMHhhMiwgMHgwMCwgMHhmYiwgMHg3OSwKKyAgMHgzZiwgMHg1ZSwgMHhiZCwgMHhiOSwgMHgzZSwgMHhlMiwgMHg5YiwgMHhlZSwgMHg4ZSwgMHhlNiwgMHhkMiwgMHg5YywKKyAgMHg4OCwgMHhhZSwgMHhiZiwgMHg1MCwgMHhhNSwgMHhiOSwgMHhmYSwgMHhmOSwgMHg2OSwgMHhlOSwgMHhiMCwgMHgzOCwKKyAgMHgyMSwgMHgxYSwgMHg5NCwgMHhkNSwgMHg5ZSwgMHhhNiwgMHhjMywgMHg0NCwgMHgwOSwgMHg1NSwgMHgyMiwgMHhhNSwKKyAgMHhiNSwgMHg1OSwgMHg3OSwgMHhjOSwgMHgzNSwgMHhhNiwgMHhiOCwgMHg5NCwgMHg5YSwgMHhiOSwgMHgyYSwgMHhhZiwKKyAgMHgwOCwgMHg1MSwgMHhhYywgMHg5ZCwgMHg0MiwgMHg5MCwgMHgwYSwgMHgwNSwgMHg1MywgMHhjMywgMHhhZSwgMHg2ZSwKKyAgMHhiZCwgMHg5NywgMHg3YSwgMHhlMSwgMHhmYiwgMHg5OCwgMHg3ZiwgMHgwZiwgMHgyNCwgMHhjNiwgMHgxOCwgMHg5NSwKKyAgMHgyNywgMHhhNSwgMHg5MywgMHhkNywgMHhmYiwgMHgxNiwgMHhjZSwgMHhkNywgMHg3YiwgMHg3ZSwgMHhhYiwgMHg2OSwKKyAgMHgxOSwgMHg1YiwgMHhlZCwgMHg1ZSwgMHhjMSwgMHg2ZSwgMHhiZCwgMHg1YywgMHhiYywgMHhkYiwgMHg5OCwgMHg1NiwKKyAgMHgyOSwgMHhkZiwgMHhmYiwgMHhhNywgMHhiMiwgMHg3OCwgMHgzNCwgMHhkYiwgMHhlNSwgMHg4NiwgMHgxNywgMHgwNSwKKyAgMHhlYiwgMHhlOCwgMHhmMiwgMHhlOSwgMHhkYywgMHg4NSwgMHg1MCwgMHgxYSwgMHhlZCwgMHgxYSwgMHhiOSwgMHgxNiwKKyAgMHhhMiwgMHg3NiwgMHg0ZiwgMHg1MSwgMHhmNiwgMHhiZCwgMHg4ZCwgMHg1ZSwgMHgxMCwgMHgxZiwgMHhkYiwgMHhkNSwKKyAgMHhkNSwgMHhjNywgMHhiMiwgMHhiMiwgMHg1ZSwgMHgyZSwgMHgxNiwgMHgwNSwgMHgwNSwgMHg1NCwgMHg4OCwgMHg1YSwKKyAgMHhhYywgMHgzNCwgMHg1ZCwgMHgwOCwgMHg2MiwgMHgwNywgMHg2YiwgMHhkYSwgMHhkMCwgMHhlMCwgMHgzYSwgMHgwNSwKKyAgMHg1NiwgMHhhNywgMHhmOSwgMHhiZSwgMHhiNywgMHg1MiwgMHhlMywgMHg5OSwgMHg2NCwgMHhhZCwgMHgwZiwgMHg5NSwKKyAgMHhjNSwgMHhmNSwgMHg1NiwgMHg1YSwgMHhhNywgMHg0MiwgMHhjOCwgMHhkZSwgMHgzMiwgMHg1MywgMHg2YywgMHgyNiwKKyAgMHg5ZiwgMHg5ZSwgMHg1YywgMHgyNiwgMHgwOSwgMHg2OCwgMHgwNiwgMHg4NywgMHg5YSwgMHg1MCwgMHg4MiwgMHgyYSwKKyAgMHhhNSwgMHg5MiwgMHgyOCwgMHgwYiwgMHg4NSwgMHgxNiwgMHhlNywgMHg0ZCwgMHg3MiwgMHgxYywgMHhmNywgMHg1MCwKKyAgMHg4NywgMHgyZSwgMHg2NSwgMHg0NSwgMHhkMywgMHhlNCwgMHhkOSwgMHhhOSwgMHg4MywgMHhjZCwgMHgwYiwgMHhjZCwKKyAgMHg3NCwgMHgwNiwgMHgwMiwgMHg1NSwgMHg1ZCwgMHg3MywgMHhkMCwgMHhiNiwgMHg5MiwgMHhlNiwgMHhiMywgMHgxYSwKKyAgMHhhZiwgMHgwZCwgMHg5OSwgMHhlNSwgMHhkYywgMHg1NywgMHhhNywgMHhlYywgMHhlNCwgMHgwNiwgMHhjYiwgMHhkOSwKKyAgMHg3NCwgMHhjYSwgMHg3YSwgMHhlZSwgMHg4MCwgMHgwYywgMHgxYSwgMHhlYywgMHg4OCwgMHhmYywgMHg3YiwgMHgzZCwKKyAgMHhlNiwgMHgwNiwgMHhlMiwgMHg1YywgMHg1MCwgMHhjYSwgMHhhNCwgMHhjYiwgMHgxMSwgMHg2ZSwgMHgzZSwgMHgyOCwKKyAgMHg2MSwgMHhiNCwgMHhlMSwgMHg5MiwgMHhlNCwgMHhlZSwgMHg5YiwgMHg4OCwgMHgwMSwgMHg2OCwgMHgzZiwgMHgyYiwKKyAgMHg0NSwgMHg0MCwgMHgzZCwgMHgxYSwgMHhhMSwgMHg2YiwgMHg4MCwgMHg5NiwgMHhhMywgMHhiMiwgMHgwMCwgMHg2YSwKKyAgMHgyMSwgMHgyMywgMHgxMCwgMHg1MiwgMHgwMiwgMHgxMSwgMHhhYiwgMHgyZSwgMHg2ZiwgMHg0YywgMHhiMSwgMHg0MSwKKyAgMHhlNiwgMHhkMiwgMHg0MywgMHhjYywgMHhhMCwgMHg1OCwgMHhkNiwgMHg1OCwgMHg5MSwgMHgxNywgMHgyNCwgMHgwMCwKKyAgMHgzYSwgMHgwNSwgMHg1MywgMHhjMywgMHhiMywgMHg2ZSwgMHgwNywgMHg3ZCwgMHhmMSwgMHg5YSwgMHhkNiwgMHgzMCwKKyAgMHhlMywgMHhiYywgMHg1YSwgMHhkOCwgMHg3OCwgMHg5YSwgMHg4MywgMHgxYywgMHhmOSwgMHgzYiwgMHgwZSwgMHhjYiwKKyAgMHhkOCwgMHhhMCwgMHg0NCwgMHg1MiwgMHgyNywgMHgwMywgMHg1NCwgMHhiZCwgMHg1NywgMHgzNywgMHg0MiwgMHhmNSwKKyAgMHhmYSwgMHhmNSwgMHhjYSwgMHg0MCwgMHg3ZSwgMHgxYywgMHhmOCwgMHgwYSwgMHg3ZCwgMHhjZiwgMHg4OSwgMHhjYiwKKyAgMHhiNiwgMHhmOSwgMHg5ZSwgMHhhZSwgMHhiYiwgMHg3MCwgMHhhNywgMHg4ZiwgMHg3NCwgMHhiZCwgMHg3MSwgMHg4NSwKKyAgMHg5MywgMHg1YiwgMHg4MywgMHgyNSwgMHg2YiwgMHg0YSwgMHgzYiwgMHhiMiwgMHgzYSwgMHg5YSwgMHgxMCwgMHhiMiwKKyAgMHgzYSwgMHhiNCwgMHgzOCwgMHgyMSwgMHgwOSwgMHg4MCwgMHhmOSwgMHhjZSwgMHg2MSwgMHg3NCwgMHhjYiwgMHg3NiwKKyAgMHgwYSwgMHg0MSwgMHg0OSwgMHhhMywgMHhiYiwgMHgzNSwgMHhmZiwgMHg4ZSwgMHhlOSwgMHhmYiwgMHhlYiwgMHg4MSwKKyAgMHg5NywgMHgxYSwgMHg4NywgMHg0ZiwgMHhhOSwgMHhkMywgMHgwNywgMHg0ZiwgMHg3NiwgMHgxZiwgMHg0NywgMHg0ZiwKKyAgMHg3NCwgMHg4OCwgMHgyMiwgMHhkNSwgMHgwMSwgMHg5NCwgMHgwMCwgMHgwNSwgMHg3ZiwgMHg4OCwgMHgzOCwgMHgyMSwKKyAgMHgxYSwgMHg5NCwgMHhjNSwgMHhjZSwgMHg4YywgMHhjMywgMHgyNCwgMHg4OSwgMHg0MCwgMHgxYSwgMHhjYSwgMHgxNCwKKyAgMHgxMywgMHhhMCwgMHhiYiwgMHg5NywgMHhhYSwgMHhhMCwgMHhiOCwgMHhhMywgMHg1OSwgMHg2MiwgMHg5MiwgMHgxYywKKyAgMHg3MywgMHhjNywgMHgyOCwgMHgxMSwgMHgyYywgMHhhNiwgMHg3OCwgMHhiNywgMHhjNSwgMHg0ZCwgMHhiZSwgMHhiZSwKKyAgMHhkMSwgMHhkOCwgMHhiZSwgMHgyNSwgMHg4MywgMHg5OCwgMHhmNywgMHgyNSwgMHhlOSwgMHg4MiwgMHg2NywgMHgxYywKKyAgMHg5OCwgMHgwYiwgMHhiMCwgMHg5YiwgMHhiNywgMHgyYiwgMHg4MiwgMHgzNCwgMHg4YiwgMHhlNywgMHgwYSwgMHhhYiwKKyAgMHg4NiwgMHg2ZCwgMHhkOCwgMHg3ZCwgMHgzZCwgMHhmZiwgMHg2OSwgMHhlNiwgMHhmNSwgMHhmMCwgMHgwZCwgMHgyNSwKKyAgMHg2NSwgMHhiNCwgMHhlMiwgMHgzNiwgMHhkNiwgMHhhMywgMHhiMCwgMHg2MSwgMHhkMiwgMHgzNywgMHgzMCwgMHg1MiwKKyAgMHg4ZSwgMHgxNiwgMHhiZSwgMHhmYiwgMHg2YywgMHhlYywgMHg3ZSwgMHg0YSwgMHhjYSwgMHg1OSwgMHhjYywgMHhjZSwKKyAgMHgyMiwgMHhmOSwgMHg4ZCwgMHhlZSwgMHgxYiwgMHg0OCwgMHgzZSwgMHgyZiwgMHhiYSwgMHg5NiwgMHgyZiwgMHgwYywKKyAgMHg1OCwgMHhhYiwgMHgyYSwgMHgzNSwgMHhkYSwgMHg3YywgMHgyYiwgMHgxNCwgMHhjYywgMHhkOSwgMHgyYiwgMHg3ZCwKKyAgMHgxMSwgMHg2ZSwgMHhjZCwgMHg3MywgMHg4NSwgMHhlNSwgMHhlZiwgMHg3NSwgMHhhOCwgMHg2MSwgMHg4YiwgMHg5ZCwKKyAgMHg2MiwgMHgxMiwgMHhhYiwgMHgxMiwgMHhiYiwgMHhmOSwgMHhkNywgMHhkNCwgMHhkMSwgMHhkNiwgMHgyYiwgMHhmOCwKKyAgMHhhYiwgMHhhYiwgMHgyNiwgMHgzZCwgMHhiMiwgMHhhNSwgMHhiNSwgMHg0MiwgMHgwYSwgMHg1NCwgMHhhNiwgMHg2YSwKKyAgMHgzZSwgMHgzMiwgMHgwNiwgMHg4NywgMHg0YSwgMHg4ZSwgMHhlNywgMHhhNSwgMHgwNiwgMHg3NywgMHg1MSwgMHgxYywKKyAgMHg2MiwgMHg1NSwgMHg3MSwgMHhhMCwgMHhkOSwgMHhkNCwgMHg1ZCwgMHg2YSwgMHhhMSwgMHgyOSwgMHg1MiwgMHg3NywKKyAgMHhkYiwgMHg4NiwgMHg3YywgMHg2OSwgMHg2NCwgMHgzMSwgMHhjZiwgMHg0YiwgMHgxNCwgMHg2NiwgMHgzNiwgMHgyYiwKKyAgMHg1OSwgMHg3NiwgMHg2MSwgMHgyOCwgMHg0MCwgMHgwMywgMHhjZSwgMHhjMCwgMHg4ZSwgMHg4YywgMHg3MiwgMHhhMywKKyAgMHgzOCwgMHgxMywgMHgwNiwgMHgxMCwgMHhhMiwgMHgwOCwgMHg3OSwgMHg4NywgMHgzOSwgMHhmMCwgMHhmNSwgMHg1OCwKKyAgMHg3OSwgMHgwZCwgMHg3OCwgMHhmZCwgMHhjYSwgMHg2NiwgMHhkMywgMHgyYiwgMHg1YywgMHhlNCwgMHgxNywgMHgxZiwKKyAgMHhiYSwgMHg3YiwgMHhmOCwgMHg5YywgMHgxZiwgMHgyMSwgMHgxMiwgMHgzNywgMHhmMSwgMHhiZiwgMHg5NiwgMHg0ZCwKKyAgMHg3MiwgMHhkNywgMHhmMSwgMHgxZCwgMHhjYSwgMHhjZCwgMHgxMCwgMHg0YywgMHhkMiwgMHg1MCwgMHhjMCwgMHgzNCwKKyAgMHgxMCwgMHg0NCwgMHg0YSwgMHhiYSwgMHg2NiwgMHhlNCwgMHhiMCwgMHgwZiwgMHhmMSwgMHgzNCwgMHg4ZCwgMHg2NSwKKyAgMHg4YSwgMHg0OCwgMHg3MSwgMHhjZiwgMHgxYywgMHhhMCwgMHg0NCwgMHhiMiwgMHg5NywgMHhkNiwgMHgzOCwgMHhmNiwKKyAgMHhiMywgMHg4YywgMHhmMiwgMHg1ZSwgMHhhNiwgMHhkYiwgMHg3ZSwgMHhiZCwgMHhiYywgMHgzMywgMHgzYywgMHhiMiwKKyAgMHg0NywgMHgxZSwgMHhmNiwgMHgzYywgMHg0MCwgMHgwYywgMHgzYywgMHgwMiwgMHhkNCwgMHhkZiwgMHgzZiwgMHhmZSwKKyAgMHhmYiwgMHhiOCwgMHhmZiwgMHhhNywgMHg4NywgMHhhZCwgMHhlMCwgMHgwMCwgMHgzNiwgMHg4MCwgMHg5NiwgMHg4MCwKKyAgMHgwMCwgMHg2OSwgMHgwZSwgMHgyMSwgMHgyYSwgMHg5NCwgMHhiNSwgMHhhMiwgMHg4ZiwgMHg2NCwgMHg4MSwgMHhiMSwKKyAgMHg4OCwgMHg4OCwgMHgyMiwgMHg0MCwgMHgwYiwgMHg2NSwgMHhlZiwgMHg1MiwgMHg4NSwgMHhjZCwgMHgzOCwgMHg2NywKKyAgMHgxMywgMHg0MCwgMHgwMCwgMHgwZCwgMHgyNywgMHhlYSwgMHgxZCwgMHg1NywgMHhjOSwgMHgwNCwgMHg1MCwgMHg3ZSwKKyAgMHhlYiwgMHhhNywgMHg0OSwgMHgwOSwgMHgxMywgMHhmMSwgMHg5YywgMHg5YywgMHg1MSwgMHhmNiwgMHg2ZiwgMHg1OCwKKyAgMHhlNiwgMHg2ZiwgMHg3NCwgMHhlMiwgMHhhYSwgMHhmNCwgMHgxZiwgMHg1YiwgMHg5MSwgMHhkYiwgMHgyYSwgMHgyMSwKKyAgMHg1OCwgMHhkOSwgMHhlYiwgMHg1NiwgMHhkYywgMHhkZSwgMHg0OCwgMHgzYSwgMHgwNywgMHg1MSwgMHhkYSwgMHgxZSwKKyAgMHhmYiwgMHg1OCwgMHhiZSwgMHhkMiwgMHgyNCwgMHg1NCwgMHhlYywgMHhhZCwgMHg5YiwgMHhjOCwgMHgyYywgMHgyYSwKKyAgMHgzMywgMHg0MywgMHhmYSwgMHhhYiwgMHg4NywgMHgwYSwgMHhhYSwgMHhhMiwgMHg1NiwgMHgxYiwgMHg4MiwgMHhmYSwKKyAgMHgzMSwgMHhmMSwgMHg4NCwgMHhlZSwgMHgzYywgMHhkNCwgMHg5NywgMHhjZSwgMHg2NiwgMHhkYiwgMHhkZSwgMHgyZCwKKyAgMHg5YiwgMHg0ZCwgMHg5ZiwgMHg2ZCwgMHg3OCwgMHg1OCwgMHg0ZiwgMHhmMywgMHgyMywgMHg0OCwgMHhkMCwgMHgwMCwKKyAgMHg5NiwgMHhhZSwgMHhlNSwgMHhjMCwgMHhiZiwgMHg5ZiwgMHhiMCwgMHhkZSwgMHg3YywgMHg1NywgMHg3ZiwgMHg3NSwKKyAgMHg1YSwgMHhhNSwgMHg5MSwgMHhkMiwgMHhmMywgMHg1MiwgMHhhYywgMHhkMCwgMHhlOSwgMHhjNywgMHgxNywgMHg3YiwKKyAgMHgyNiwgMHgwNywgMHgxMiwgMHhhZSwgMHhiOSwgMHgwMSwgMHgwMCwgMHg4OCwgMHg4ZCwgMHg4ZCwgMHg5OCwgMHhjMiwKKyAgMHgwYiwgMHgwNywgMHg2MiwgMHg3OCwgMHgxOCwgMHg0MywgMHg5ZSwgMHhkZCwgMHhjZiwgMHhjZCwgMHhlMCwgMHg0MSwKKyAgMHhjZiwgMHgxOSwgMHg0MiwgMHg0OCwgMHgzNCwgMHhlYSwgMHhhOSwgMHhmZiwgMHgxOSwgMHg1OSwgMHhmNywgMHg4NywKKyAgMHhkMiwgMHgxMSwgMHg3OCwgMHg0NywgMHhiYSwgMHg0ZCwgMHhlZCwgMHg5MiwgMHhhNSwgMHg5NiwgMHhjZSwgMHhmZCwKKyAgMHgzMCwgMHg4YSwgMHhmNiwgMHgwNCwgMHhhZSwgMHg2ZiwgMHg4NiwgMHg0NSwgMHhlNCwgMHhiMiwgMHhlNywgMHhmYywKKyAgMHg3YiwgMHhjMywgMHg2MSwgMHgwMSwgMHg2NiwgMHhiMCwgMHhlZCwgMHhkZiwgMHgyZSwgMHgwZSwgMHhmYywgMHgwMCwKKyAgMHhhNCwgMHg2MywgMHg1YywgMHgyYiwgMHhjNywgMHg2MSwgMHgzMCwgMHgwMiwgMHhmNSwgMHg2OCwgMHg3MywgMHg3YSwKKyAgMHgxYiwgMHg2YiwgMHg2ZCwgMHg3NCwgMHhmNywgMHhmZCwgMHhiOSwgMHg3NSwgMHg5NywgMHhjNiwgMHg2ZiwgMHhjMywKKyAgMHhhMCwgMHgwMCwgMHgyNSwgMHgyYywgMHhkMCwgMHg2NCwgMHgxOCwgMHhlYywgMHgwMCwgMHgzMiwgMHgwMiwgMHhkZSwKKyAgMHhkMCwgMHg3NCwgMHg1OCwgMHgwOCwgMHhhMCwgMHg2MSwgMHhmZCwgMHhjNCwgMHg4MiwgMHhmNSwgMHhkYSwgMHhiZCwKKyAgMHgwNSwgMHgwNSwgMHhmOCwgMHg2NywgMHhmNSwgMHhiMywgMHhmNCwgMHhiOSwgMHgzNSwgMHgxZSwgMHhkZiwgMHhjNSwKKyAgMHhjNSwgMHg2NywgMHhiZCwgMHg0MSwgMHgyNywgMHg0OSwgMHg2YywgMHg0MywgMHhhZCwgMHg3YSwgMHhkYywgMHhmZSwKKyAgMHhhMSwgMHg5YSwgMHhhYSwgMHhiZiwgMHg5YSwgMHg1NCwgMHhmMiwgMHg3ZSwgMHgzMSwgMHhkOSwgMHhhZSwgMHhmNiwKKyAgMHhlMywgMHgwOCwgMHhiMCwgMHgxZSwgMHg0ZiwgMHgxNiwgMHhkZiwgMHhiZCwgMHhkZSwgMHhlOCwgMHgwMSwgMHg5MywKKyAgMHgwMCwgMHgwNSwgMHg0NiwgMHhlZSwgMHgyMSwgMHgyOCwgMHgwMCwgMHg0YSwgMHg5ZCwgMHgwYywgMHgwOCwgMHg0MCwKKyAgMHgxMSwgMHg1YywgMHg0YSwgMHg1NSwgMHhkYiwgMHg2YiwgMHg3OCwgMHhiMiwgMHgxMSwgMHgyMiwgMHg3ZiwgMHhkMCwKKyAgMHgwYywgMHgxOSwgMHgxMywgMHhkMSwgMHhhOSwgMHg3MywgMHg4YywgMHgzMCwgMHhkMiwgMHhiNSwgMHg5ZiwgMHgwOCwKKyAgMHg5NCwgMHhmYiwgMHhlZCwgMHg4NiwgMHhkOCwgMHgxNSwgMHgyOSwgMHgxMywgMHhjOSwgMHg3NSwgMHg0MiwgMHhjMywKKyAgMHgyYywgMHgwYSwgMHg3YSwgMHhmMCwgMHgwNywgMHgyMSwgMHg0YywgMHhjZCwgMHg0NiwgMHhkZCwgMHg2MiwgMHgzYSwKKyAgMHhlYSwgMHgzMSwgMHg5NiwgMHhhYSwgMHgyMywgMHgxNywgMHg3OCwgMHg3MSwgMHg2ZSwgMHhiOCwgMHgyNSwgMHgxZiwKKyAgMHhjMiwgMHhkZCwgMHgzYSwgMHgyMSwgMHhmZCwgMHgyNywgMHhiNSwgMHg3OSwgMHhkNCwgMHg0MSwgMHhmYywgMHg1ZCwKKyAgMHg5ZSwgMHg2OSwgMHg3YSwgMHhiMCwgMHhhMiwgMHg0MywgMHhjOCwgMHg2YiwgMHg3NywgMHhkOCwgMHhlNiwgMHgyNCwKKyAgMHgyOSwgMHg1NiwgMHg5MSwgMHg5MSwgMHg2MSwgMHhlYSwgMHgzOCwgMHg0ZCwgMHg1ZiwgMHg5ZiwgMHg2OSwgMHhmNSwKKyAgMHhhNSwgMHg5YiwgMHg4NiwgMHg5OCwgMHhhNSwgMHg1NiwgMHg4ZiwgMHhmMywgMHgwYiwgMHhlYSwgMHgyZiwgMHhmMiwKKyAgMHhlYywgMHgyYiwgMHgxYywgMHg0NiwgMHgzZCwgMHhmNSwgMHhmOCwgMHg5YSwgMHhjYiwgMHg2MywgMHhjYiwgMHg3ZiwKKyAgMHgwOSwgMHg3ZSwgMHgzZCwgMHg5NSwgMHgwMiwgMHgwYywgMHhkZSwgMHhlYiwgMHg5NCwgMHgyZSwgMHg5NCwgMHg2OCwKKyAgMHhiZCwgMHgzYSwgMHhmNSwgMHgyMiwgMHgwOSwgMHg1OSwgMHg0MCwgMHgzMSwgMHgwZCwgMHhhMiwgMHgwMywgMHgwNywKKyAgMHgwZSwgMHhjNSwgMHhiZSwgMHgzZCwgMHhiMywgMHhjYiwgMHgzMiwgMHhkYywgMHg4YSwgMHhkNSwgMHg5YSwgMHhkYywKKyAgMHg1ZiwgMHg3NiwgMHg3OCwgMHg0YSwgMHgyOSwgMHg0YywgMHg5NiwgMHg4MywgMHg4MiwgMHhlYiwgMHg0MCwgMHhlMCwKKyAgMHhiMSwgMHg2OSwgMHhlNCwgMHg5OCwgMHhkZCwgMHgzYiwgMHgxMiwgMHg4MCwgMHg4ZCwgMHg2OSwgMHgwMiwgMHg3OSwKKyAgMHhhYywgMHg0OCwgMHg5ZCwgMHgzNSwgMHhmZiwgMHg3ZSwgMHhmZSwgMHhmNywgMHhlYiwgMHhhZiwgMHhkMiwgMHg3MSwKKyAgMHgzYywgMHhhZSwgMHgxMywgMHhhMiwgMHhhOSwgMHhjYSwgMHhiNiwgMHhlYywgMHhmZSwgMHhiZCwgMHgwMiwgMHhmZiwKKyAgMHhiNywgMHgyZCwgMHg3ZCwgMHg0MCwgMHhiMCwgMHg0YywgMHgxYSwgMHg0YywgMHhlMiwgMHhlYSwgMHg2NSwgMHg2NCwKKyAgMHgzZCwgMHgyZiwgMHhkZSwgMHhmYiwgMHhhMywgMHhiYywgMHg2OSwgMHg1NiwgMHhiYiwgMHhkNCwgMHgzMiwgMHhiZSwKKyAgMHg3YywgMHg3ZCwgMHhiNiwgMHgzOSwgMHgyMywgMHgxNywgMHhjOSwgMHhmMiwgMHg2YiwgMHhiNCwgMHhhYSwgMHhiYywKKyAgMHgyOSwgMHgzNiwgMHgzYSwgMHg3YSwgMHgyNCwgMHg1OCwgMHg1ZCwgMHgwMCwgMHgxMCwgMHg1YywgMHg0MiwgMHg2OCwKKyAgMHgyNiwgMHg4YSwgMHhiMiwgMHgzYSwgMHg1MiwgMHgyNSwgMHg5MSwgMHg5YywgMHg2YiwgMHg0ZiwgMHgwZiwgMHgyNSwKKyAgMHgyZiwgMHgyYSwgMHg1YSwgMHhjOSwgMHg0ZCwgMHgxOCwgMHhhMywgMHgzYiwgMHgyYywgMHg0NywgMHhkYSwgMHg2NiwKKyAgMHgzOCwgMHgwZCwgMHhlMSwgMHhkNiwgMHhkYSwgMHgwZCwgMHhiMywgMHg1MCwgMHg3OCwgMHg0NSwgMHhmMSwgMHhjNSwKKyAgMHhmMCwgMHgzZiwgMHhiMiwgMHg5ZiwgMHg3MSwgMHhhNiwgMHg5ZiwgMHhkOSwgMHhjMywgMHhhZCwgMHg3MSwgMHg0YiwKKyAgMHgzZiwgMHg2MSwgMHhlYywgMHg3OSwgMHgwMSwgMHgxNSwgMHhmMiwgMHhkZCwgMHhmYiwgMHhlOSwgMHg1MiwgMHg3MCwKKyAgMHgzOCwgMHhjZCwgMHhmZSwgMHgzYiwgMHgwMSwgMHhmNiwgMHhiMCwgMHhlMywgMHgyOCwgMHg4ZCwgMHgyOCwgMHg2MiwKKyAgMHgwOCwgMHgzMiwgMHhkZSwgMHg0YSwgMHhjOCwgMHg5YywgMHgwNSwgMHgzMywgMHg5MSwgMHg1ZCwgMHgyNCwgMHg1NCwKKyAgMHg0NiwgMHgxZSwgMHg0NiwgMHhlNSwgMHg2ZiwgMHhlZiwgMHhkMCwgMHhlMiwgMHg2OSwgMHg5ZCwgMHhhNywgMHgyMiwKKyAgMHg2YSwgMHhhMSwgMHhiZSwgMHhjYiwgMHhlNywgMHhjYywgMHgzZiwgMHhlYSwgMHhmYywgMHg5NywgMHgwOCwgMHg3ZSwKKyAgMHgyNywgMHhkOCwgMHg4YSwgMHhhNywgMHg0ZiwgMHgxZCwgMHgyZSwgMHg5MiwgMHg0NiwgMHhkMywgMHg5MCwgMHhjYSwKKyAgMHg5MCwgMHgzZCwgMHhjNywgMHg0MywgMHg5MCwgMHgzYywgMHg3OSwgMHgxZSwgMHg1ZiwgMHhhMywgMHg2ZSwgMHg4YiwKKyAgMHgxMiwgMHhhMiwgMHg4YywgMHhkYiwgMHg2YSwgMHg1YywgMHhkMywgMHg0YywgMHhiYSwgMHgwZCwgMHg1OCwgMHgzOSwKKyAgMHhjMSwgMHg4MiwgMHg4NiwgMHhkNCwgMHhkZSwgMHhmZCwgMHhiZCwgMHgwYywgMHhmOCwgMHhjYywgMHg2ZCwgMHgzOCwKKyAgMHg4NSwgMHgxMSwgMHg1OSwgMHg5YywgMHhkMiwgMHg4ZCwgMHgzNiwgMHgyNSwgMHhlNSwgMHg3ZCwgMHhjOSwgMHg1NCwKKyAgMHgzNywgMHg2YiwgMHg5NCwgMHhiOCwgMHg1YSwgMHhjZSwgMHg4NCwgMHg2YSwgMHg1ZSwgMHhiOCwgMHhlOSwgMHhhMiwKKyAgMHgzMywgMHgxNCwgMHhkYSwgMHg4MCwgMHg0NCwgMHhhNCwgMHg4MCwgMHhiYSwgMHg2YiwgMHhkZCwgMHgwZCwgMHhkNywKKyAgMHg1NSwgMHg4YSwgMHgzMSwgMHg0MiwgMHgwYywgMHhmZCwgMHgwYywgMHgwNCwgMHg3OSwgMHhjZCwgMHg1YiwgMHhhMywKKyAgMHg0OCwgMHg2MywgMHg2NCwgMHgzOCwgMHgyMSwgMHg3YSwgMHg4YywgMHgwMCwgMHg3ZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHgyZCwgMHg2ZCwgMHhhNCwgMHhiMCwgMHhjOCwgMHg4MiwgMHhkMCwgMHg4MiwgMHhhMywgMHg1NSwgMHg5MiwgMHhiNywKKyAgMHg3YSwgMHg5YywgMHgxYSwgMHhhZCwgMHgwMCwgMHg0MCwgMHg1MCwgMHgxMywgMHgxMiwgMHgzMiwgMHgxYSwgMHhiMSwKKyAgMHhmYSwgMHg0OCwgMHgwNSwgMHhkZiwgMHg1YiwgMHhmYSwgMHhmMSwgMHgyMSwgMHg0MywgMHhmNywgMHg1YSwgMHg4OSwKKyAgMHgxNSwgMHgxMCwgMHhmNywgMHhkNCwgMHhhYywgMHgwYywgMHgzNywgMHhkYywgMHgxZiwgMHgxMiwgMHg1NiwgMHhhNiwKKyAgMHg4YywgMHhmYiwgMHhmZCwgMHhiNywgMHg3MCwgMHhiNywgMHhkYiwgMHgzOSwgMHg4OSwgMHhkOSwgMHg5OCwgMHg1ZiwKKyAgMHhiYSwgMHhjMywgMHg5NCwgMHhiOSwgMHg4ZiwgMHg4OCwgMHhjMSwgMHhmNSwgMHg2ZSwgMHg0NywgMHg1NywgMHhhZSwKKyAgMHhkNywgMHhlNywgMHgzMywgMHhiZiwgMHgxNywgMHhkNywgMHg1OCwgMHg3ZSwgMHg4YSwgMHg0NywgMHhjYSwgMHhlZCwKKyAgMHgxZCwgMHhlNywgMHg4ZCwgMHg2MSwgMHgzOSwgMHhlOSwgMHg0NSwgMHgxOCwgMHg2OSwgMHhlZiwgMHg3MSwgMHhiNiwKKyAgMHhmOCwgMHhiMCwgMHgxOSwgMHg3ZiwgMHgyYywgMHhlYSwgMHhiNywgMHg4NywgMHhlZSwgMHgwMywgMHgxNywgMHhlNCwKKyAgMHg0OSwgMHhkYSwgMHgzNywgMHgyYSwgMHhjMywgMHhlNSwgMHg3NywgMHgwNywgMHg1ZCwgMHg2ZSwgMHhkMSwgMHhmYywKKyAgMHg2MiwgMHhlYSwgMHg0MywgMHhkOSwgMHgwYywgMHgwMCwgMHgyYSwgMHhhZCwgMHg0OSwgMHg0NSwgMHhlYiwgMHg5MSwKKyAgMHhhNiwgMHg1NSwgMHgyMSwgMHg0MCwgMHg5MCwgMHg0YiwgMHg3YSwgMHg0YSwgMHg2NCwgMHg3YywgMHg5MiwgMHg5NywKKyAgMHhjOSwgMHg5NCwgMHhlMCwgMHhhZSwgMHg3OCwgMHg0MCwgMHg1ZCwgMHhmMCwgMHg5ZCwgMHg0NSwgMHg3ZSwgMHg2OSwKKyAgMHg0MCwgMHgxNSwgMHg2NCwgMHg3NiwgMHg1YiwgMHg3YSwgMHhiMiwgMHg0OSwgMHg2NSwgMHhhZSwgMHg1NiwgMHhjMSwKKyAgMHgxMSwgMHg5OSwgMHg2NiwgMHhkZCwgMHhkMSwgMHg5MSwgMHgzOCwgMHgwMiwgMHhmNiwgMHgxNSwgMHg4NCwgMHhlMiwKKyAgMHg0NiwgMHgxNiwgMHg4YSwgMHg4MCwgMHhmNSwgMHgxMSwgMHhjYywgMHg0YywgMHg1NiwgMHhmMCwgMHhhMiwgMHg2MywKKyAgMHg4ZCwgMHg0MSwgMHgzNywgMHg2YywgMHg4MiwgMHgxMCwgMHhjMCwgMHgyOCwgMHg1MSwgMHg4YSwgMHgzMCwgMHgyNiwKKyAgMHg5MSwgMHg2ZSwgMHhkYSwgMHhhZSwgMHhhZiwgMHhjOCwgMHg1ZCwgMHg4YiwgMHgwMCwgMHgwOSwgMHhiZSwgMHgxNywKKyAgMHhlZiwgMHg3NywgMHg0NCwgMHhhNSwgMHgwYywgMHg4YywgMHg5OCwgMHg4NCwgMHg5ZiwgMHgyYywgMHg5NCwgMHg2OCwKKyAgMHgzYywgMHg3MSwgMHhkZCwgMHg0ZiwgMHhmZCwgMHhhOSwgMHg1MCwgMHg3NSwgMHgzMSwgMHg3ZCwgMHgwNywgMHhkNywKKyAgMHhiNSwgMHg4ZSwgMHhmYywgMHhlNiwgMHhhZiwgMHhhNCwgMHhlYywgMHhjZSwgMHhlMiwgMHg5YiwgMHg3NywgMHhhZSwKKyAgMHhiMiwgMHhlNiwgMHgyYywgMHhmMywgMHhhZCwgMHg2NCwgMHg4YiwgMHg1NiwgMHgyNSwgMHg2MCwgMHgyNywgMHgyNiwKKyAgMHhhNSwgMHhmYiwgMHg2OCwgMHg2NiwgMHhkNiwgMHhhOSwgMHhhMSwgMHgxOSwgMHhhMywgMHg1MSwgMHg5NSwgMHg5NSwKKyAgMHhjZiwgMHhiMiwgMHg5NSwgMHg2YywgMHg4MSwgMHgxYSwgMHgyZCwgMHgzMSwgMHg0ZSwgMHgyYSwgMHg2ZCwgMHg0MCwKKyAgMHhkMCwgMHhhZiwgMHgwYiwgMHhkOCwgMHgxYSwgMHgyNCwgMHhiNiwgMHg5NywgMHg1OCwgMHhiMCwgMHgzYSwgMHhjMCwKKyAgMHgxMCwgMHhhYSwgMHg3NSwgMHgyMiwgMHgxMywgMHg4OCwgMHgwMCwgMHgwYywgMHg0OCwgMHhlNSwgMHgzNiwgMHg4MSwKKyAgMHgyOCwgMHg2MSwgMHg0MiwgMHgwMSwgMHhjMSwgMHgzMCwgMHhhZiwgMHg3MiwgMHhmNiwgMHhjOSwgMHhhNiwgMHg4MCwKKyAgMHg4MiwgMHhmNiwgMHhhMiwgMHg4OSwgMHg0YywgMHg5NiwgMHhiYiwgMHg2NywgMHg0MCwgMHgzNCwgMHhhZCwgMHg4MiwKKyAgMHgwMSwgMHg4NywgMHgyNCwgMHgwMywgMHgwNywgMHgyMSwgMHgxYSwgMHg5NCwgMHhiNSwgMHhjZSwgMHg4YSwgMHhjMiwKKyAgMHgyMywgMHgyMCwgMHg0OCwgMHg2OCwgMHgzMiwgMHgxOSwgMHg4NSwgMHhmNCwgMHg1MSwgMHgwYSwgMHg0NSwgMHhhZiwKKyAgMHg4NCwgMHhiOCwgMHg0MCwgMHgwMSwgMHg4MywgMHg2MCwgMHhkYiwgMHg4MSwgMHhkMCwgMHhkMywgMHgxYywgMHhhZSwKKyAgMHgyMiwgMHgzMCwgMHg1MSwgMHg1MCwgMHhjMCwgMHg5OSwgMHgxNywgMHgyNiwgMHg5NywgMHhlMCwgMHgyNSwgMHg2MSwKKyAgMHg3ZSwgMHhmNCwgMHg5OCwgMHg4YiwgMHg1MiwgMHhhMywgMHg5MiwgMHhiZSwgMHg1YSwgMHg1YiwgMHgzNywgMHhkYSwKKyAgMHhiMywgMHg2NiwgMHg2OCwgMHhiYywgMHhmMywgMHgyZCwgMHgzNywgMHg3YiwgMHhmZiwgMHhkYSwgMHg3YiwgMHhlNywKKyAgMHhlYiwgMHgyNiwgMHgzOCwgMHg3ZSwgMHg2OSwgMHgyZSwgMHgxZiwgMHhmOCwgMHg1ZCwgMHgzMSwgMHg1ZiwgMHhmNywKKyAgMHhlNywgMHg0OSwgMHgzYSwgMHg3NCwgMHg1ZSwgMHg5YiwgMHhjNywgMHg1MiwgMHg5OCwgMHgyZSwgMHgxZiwgMHgxOCwKKyAgMHhhMSwgMHgwZiwgMHg5YywgMHgyYywgMHg3MSwgMHg3YywgMHhkNywgMHg3NSwgMHhkOSwgMHgzNiwgMHg5OCwgMHhiYSwKKyAgMHhkNywgMHgxNCwgMHhlNiwgMHhmYSwgMHg0NywgMHgxYywgMHg2NiwgMHhhZiwgMHg5NSwgMHg5MCwgMHhiNiwgMHg2ZiwKKyAgMHhmNCwgMHhiZCwgMHg3ZCwgMHgwZiwgMHhhYSwgMHhlOCwgMHgzYSwgMHhhZiwgMHgzOCwgMHhkYSwgMHhjZSwgMHhlOCwKKyAgMHhjMiwgMHhiMiwgMHhmMywgMHhkYSwgMHg3NiwgMHhhNSwgMHg0MywgMHhkMywgMHgwYSwgMHgyMSwgMHg4OCwgMHgzNCwKKyAgMHg0NCwgMHgwMiwgMHg2YiwgMHg5MCwgMHgxNSwgMHgyOSwgMHg0OSwgMHg3NiwgMHhjYywgMHhmYSwgMHg2MCwgMHg2OCwKKyAgMHg4OSwgMHhmZCwgMHg3ZCwgMHhlMywgMHhhZCwgMHhhMCwgMHhhZCwgMHg4NSwgMHhhMiwgMHgyYiwgMHhiMiwgMHg1MiwKKyAgMHgzNCwgMHg0MiwgMHg3OCwgMHhiOSwgMHgzNiwgMHg0ZCwgMHgwMiwgMHg5MCwgMHhjZSwgMHhjMywgMHg5NSwgMHhiZCwKKyAgMHg3OSwgMHg3NSwgMHg5ZSwgMHgxZSwgMHhkZCwgMHg5NCwgMHg3MiwgMHhkMywgMHg2MSwgMHhjYSwgMHg4MSwgMHhlNCwKKyAgMHhkOSwgMHg3NiwgMHhkNiwgMHhkOSwgMHhkMSwgMHhlNCwgMHg2OCwgMHhkMSwgMHhmYSwgMHgzNCwgMHg0OSwgMHg2YiwKKyAgMHhmZCwgMHhhZSwgMHg1YSwgMHg5NCwgMHhkNiwgMHgzNiwgMHg5NCwgMHhmNCwgMHgyMCwgMHgwNiwgMHg0MCwgMHgzZSwKKyAgMHg2ZSwgMHg3NSwgMHg4NSwgMHg4YywgMHhhZCwgMHhhYSwgMHhjNCwgMHgyNiwgMHgzMywgMHhkNSwgMHg5YiwgMHgzZiwKKyAgMHg1MywgMHgwMiwgMHhlOSwgMHhiMiwgMHhjMiwgMHhhYywgMHgwNSwgMHhhNSwgMHg4YywgMHgzOSwgMHg0YiwgMHg4YSwKKyAgMHg5MywgMHhkMiwgMHhjMiwgMHhkZiwgMHgyNCwgMHg5MiwgMHgyYywgMHgxMiwgMHg1ZSwgMHgzNSwgMHg3NiwgMHhmYiwKKyAgMHhhMSwgMHhlNSwgMHg2YywgMHgyZSwgMHg5NiwgMHhiYSwgMHgwZSwgMHhiYiwgMHgxZCwgMHhkZSwgMHgwMCwgMHgxMywKKyAgMHg1NiwgMHg4OCwgMHg0MiwgMHgxOCwgMHg1ZSwgMHgwMiwgMHgxMSwgMHhiYSwgMHhhMywgMHgzOCwgMHg2NSwgMHhjYSwKKyAgMHhhYiwgMHg2MCwgMHhlMSwgMHg3MSwgMHhkMywgMHg4NCwgMHgxNSwgMHgyYSwgMHhhZSwgMHg4MCwgMHhjMywgMHg4YywKKyAgMHg4MiwgMHg3NCwgMHg4NywgMHhlNCwgMHhiMiwgMHgxMywgMHhlNywgMHhlMSwgMHhlYiwgMHg3ZSwgMHg5MiwgMHhjYSwKKyAgMHg3YywgMHgwNiwgMHgxMSwgMHhlOSwgMHg5NSwgMHg1NywgMHg1NCwgMHhmYywgMHhhZiwgMHg2MywgMHhiZiwgMHgxMywKKyAgMHhhMSwgMHg4NiwgMHhlZSwgMHg2ZSwgMHgxNCwgMHhlMCwgMHg4YSwgMHhiMiwgMHgwYywgMHg5ZCwgMHhkMywgMHhlZCwKKyAgMHgwYywgMHhmOCwgMHgxOSwgMHg2ZSwgMHgzMSwgMHg5ZiwgMHgyMCwgMHgwMiwgMHgzZCwgMHhkMCwgMHhiNywgMHgzNSwKKyAgMHhmYywgMHhmMiwgMHhlZiwgMHgxYywgMHhhOCwgMHgxMiwgMHg2OSwgMHgxYSwgMHgyZiwgMHhjZiwgMHgxZiwgMHhhOCwKKyAgMHhiOCwgMHg1NCwgMHhiMCwgMHg2OSwgMHg0OSwgMHgzMSwgMHg1MywgMHg4ZiwgMHhjNCwgMHhlOCwgMHgwMSwgMHhiMSwKKyAgMHg5NiwgMHhkMCwgMHhkMiwgMHhjNywgMHhkMCwgMHhkYSwgMHhiMSwgMHg1MiwgMHhiNCwgMHgwMCwgMHgyMCwgMHgzNiwKKyAgMHhkNSwgMHgzOSwgMHg0NSwgMHgyOCwgMHg4OCwgMHhkNiwgMHhlMCwgMHg4OCwgMHgwYSwgMHhmYiwgMHhhMywgMHhhOCwKKyAgMHgyNSwgMHgxMSwgMHg2NCwgMHgwYSwgMHg1YywgMHgxNCwgMHg3MCwgMHgwZSwgMHgyMSwgMHgxYSwgMHg5NCwgMHhiZCwKKyAgMHhkNiwgMHgwNywgMHg0MSwgMHgyMSwgMHg4YiwgMHg4MywgMHg3YiwgMHhlYSwgMHhlZiwgMHg3YSwgMHg1NCwgMHg2NSwKKyAgMHg3NCwgMHgyNywgMHg5NiwgMHg5NywgMHg0MCwgMHgwMCwgMHgwYywgMHhlMywgMHg5NSwgMHg4OSwgMHhmYSwgMHg5ZiwKKyAgMHhkNiwgMHhmNSwgMHhmZiwgMHg3NywgMHg4ZSwgMHhiNSwgMHgwZSwgMHgxZCwgMHgxZSwgMHhiZCwgMHhlNCwgMHg0YSwKKyAgMHg3MiwgMHhmMiwgMHhkZSwgMHg3ZCwgMHg2OSwgMHgxZCwgMHg3MSwgMHg5NiwgMHhhNywgMHhhNywgMHhhNywgMHhiYywKKyAgMHg0NSwgMHhkOSwgMHhkNiwgMHgxMywgMHhjNSwgMHg1MywgMHg5OCwgMHg5MiwgMHg2NCwgMHg5OCwgMHhjZiwgMHg3ZiwKKyAgMHhjNiwgMHhlZiwgMHgxZCwgMHgxMSwgMHg5NiwgMHhhMCwgMHhiZiwgMHgwZiwgMHhhMywgMHg1YiwgMHhkMSwgMHgxZCwKKyAgMHhhOSwgMHhhMSwgMHhmOSwgMHg1ZSwgMHhkYSwgMHhmYiwgMHg4ZiwgMHgzMCwgMHhiOSwgMHg3MywgMHg5NCwgMHhkZCwKKyAgMHg5YSwgMHgzMSwgMHgxZCwgMHg2ZCwgMHgzYSwgMHgxMywgMHgzMCwgMHg5MSwgMHg1YSwgMHg3ZiwgMHg5ZCwgMHhmNSwKKyAgMHg2NCwgMHg3NiwgMHgyNCwgMHgyYSwgMHgwMywgMHhiMCwgMHhiMSwgMHg2YiwgMHgyNSwgMHgzYywgMHg1ZiwgMHg0MCwKKyAgMHg5OCwgMHgyNiwgMHg4NywgMHgxNywgMHhiNCwgMHgzMSwgMHhmOCwgMHg5NCwgMHhmYywgMHhjOSwgMHhjYSwgMHg1OSwKKyAgMHgzMywgMHg1MiwgMHg2MSwgMHg4NiwgMHhlMiwgMHhhOSwgMHhiNiwgMHhkMiwgMHgxNCwgMHg1MiwgMHg5NywgMHhhYSwKKyAgMHgxNiwgMHg0ZSwgMHgyZCwgMHg1ZSwgMHhmOSwgMHg1YSwgMHg4MywgMHg2NCwgMHgwMSwgMHhiMCwgMHg4MiwgMHg0MywKKyAgMHg0NiwgMHg4MiwgMHg2MywgMHg3OCwgMHhmNiwgMHhlNywgMHg4MSwgMHgwZSwgMHg0YiwgMHgzMSwgMHhkNiwgMHg3NCwKKyAgMHhlOCwgMHhmOSwgMHhmMiwgMHg2ZSwgMHg2OSwgMHg5ZiwgMHgyYSwgMHhkOCwgMHgwYSwgMHg0MywgMHgzNCwgMHgzOSwKKyAgMHhjMywgMHg0YiwgMHhiYSwgMHg5OCwgMHg0OCwgMHg0MiwgMHg0OSwgMHg0MywgMHgzYiwgMHg5OCwgMHg0NywgMHg2ZSwKKyAgMHg5MSwgMHgzMiwgMHg5MiwgMHg0NSwgMHgyNCwgMHhlNCwgMHhiZCwgMHhhNiwgMHhiOSwgMHg2NSwgMHg1NywgMHg1MSwKKyAgMHgzYiwgMHgyYSwgMHg0ZSwgMHhjNywgMHgwYSwgMHg3OSwgMHgzNCwgMHgxNSwgMHhjNywgMHhiMSwgMHhiNywgMHg5YiwKKyAgMHg5YSwgMHgxNCwgMHg0NywgMHg3MCwgMHg0YywgMHg1YSwgMHgxOCwgMHhlNiwgMHg4MCwgMHgxOCwgMHhjMCwgMHg5MiwKKyAgMHhhMSwgMHg0NSwgMHg1ZSwgMHhlYywgMHg4NywgMHg0OSwgMHhmOCwgMHgxNiwgMHgyZCwgMHhjOCwgMHgwNCwgMHg2MiwKKyAgMHhlNiwgMHg3NiwgMHhkMywgMHg1YywgMHgzNiwgMHg0ZCwgMHgyNiwgMHhlNCwgMHhhMywgMHg2YSwgMHhkZSwgMHg2OSwKKyAgMHhmYywgMHg5NywgMHhkNCwgMHg3OSwgMHhlMSwgMHhjYSwgMHhhYSwgMHhjMywgMHhkNiwgMHhiMywgMHgzMCwgMHhjZSwKKyAgMHhiOCwgMHhkNSwgMHgwNywgMHhiZSwgMHg4MiwgMHg3YSwgMHg2MCwgMHgyMCwgMHgzNSwgMHhjOCwgMHg2ZSwgMHgxZCwKKyAgMHg4ZSwgMHhkNywgMHhkZiwgMHg1ZCwgMHhiNSwgMHgxMiwgMHg5NSwgMHg3MCwgMHg2NSwgMHhlNSwgMHgyOSwgMHgzMCwKKyAgMHg4NywgMHhlMiwgMHhlZiwgMHg1MCwgMHgwMiwgMHhlYiwgMHhjNiwgMHhmMCwgMHhkZSwgMHgwYiwgMHgzZiwgMHhkYywKKyAgMHg2OSwgMHgwOCwgMHg2ZSwgMHhjMCwgMHgwMCwgMHg4NCwgMHhiMiwgMHg1NiwgMHg3NSwgMHhkZiwgMHhhNiwgMHhiNSwKKyAgMHg4MCwgMHhmMSwgMHgzZCwgMHhkYywgMHg3YywgMHg3OSwgMHgyYiwgMHg2YSwgMHg4MCwgMHgwNywgMHhiOCwgMHgyYSwKKyAgMHgwOSwgMHhjYiwgMHg2MywgMHgyOCwgMHhkYSwgMHgwMCwgMHgxNCwgMHhjMiwgMHgwMCwgMHgzOCwgMHgyMSwgMHgxYSwKKyAgMHg5NCwgMHhhNSwgMHhkMiwgMHgwYSwgMHg4MSwgMHgxOCwgMHgwMiwgMHhhYSwgMHgyNiwgMHg5NSwgMHg4OCwgMHgzOCwKKyAgMHg1ZCwgMHhjZCwgMHgwMCwgMHgwMCwgMHgwNywgMHhmZiwgMHhjNCwgMHhjZCwgMHgzYiwgMHgyNywgMHg4ZSwgMHhjZCwKKyAgMHg0OSwgMHgzMCwgMHgwZiwgMHgxZSwgMHgxNiwgMHhkMywgMHg2ZiwgMHgxMiwgMHhlMSwgMHhmZSwgMHgyNSwgMHhiOSwKKyAgMHhiZSwgMHhlNywgMHg0MCwgMHgxMSwgMHgyYiwgMHhlZCwgMHhhNSwgMHhkYiwgMHg3MywgMHhkMywgMHg5OSwgMHhiZSwKKyAgMHgwZCwgMHhhMywgMHg3ZCwgMHg3MSwgMHg0YSwgMHhkMSwgMHgxMywgMHg1ZSwgMHg1YywgMHhhNSwgMHg2NiwgMHhmYSwKKyAgMHhmNiwgMHg5NiwgMHg5ZSwgMHhlMCwgMHg2ZiwgMHg3ZCwgMHhhNSwgMHg4ZSwgMHhmOSwgMHgyZiwgMHhiNSwgMHgxOCwKKyAgMHgxMiwgMHg0MSwgMHhhNCwgMHgzZSwgMHhlYSwgMHhjNSwgMHhhNSwgMHhlMSwgMHg3NCwgMHg3ZiwgMHhkNSwgMHhmYywKKyAgMHgwNywgMHhkMCwgMHgyNCwgMHg1NywgMHg1YywgMHg2NywgMHg1NywgMHhjZCwgMHg5OCwgMHhiNiwgMHhjMywgMHhkMiwKKyAgMHg2NywgMHg2NSwgMHg0MCwgMHg1OSwgMHg1YywgMHgxOSwgMHg4YSwgMHg3OSwgMHg3NywgMHg1YywgMHhmYiwgMHgxZSwKKyAgMHgzNywgMHgzNywgMHhlYiwgMHg1ZiwgMHhiMiwgMHg5NiwgMHgzNCwgMHg5ZiwgMHg2NSwgMHhmZiwgMHhkMCwgMHhlZiwKKyAgMHg4YSwgMHgyMSwgMHg0YSwgMHg1YywgMHg3NSwgMHg0OSwgMHg1OSwgMHg3NiwgMHhlYiwgMHgwZCwgMHgzNywgMHhlMywKKyAgMHhkZCwgMHhlZiwgMHgxNSwgMHg2YywgMHg4MCwgMHhlOCwgMHhkMywgMHg2MSwgMHhjNSwgMHhhZSwgMHgwZiwgMHhkZiwKKyAgMHhkMCwgMHg0MSwgMHg4ZCwgMHgzOSwgMHhiZSwgMHg5YywgMHgyZCwgMHg3ZCwgMHg5YiwgMHgyZiwgMHgxZCwgMHgwYSwKKyAgMHhkMywgMHhkZSwgMHg5ZCwgMHhiOSwgMHhjYiwgMHg3ZSwgMHg5OSwgMHg1ZSwgMHgzYywgMHhkMSwgMHgxYiwgMHg2ZCwKKyAgMHg2YSwgMHg5YywgMHhkNiwgMHgwNywgMHhlNywgMHg2MywgMHg0NSwgMHhmMCwgMHg1NCwgMHg3NiwgMHgyYiwgMHhiYywKKyAgMHg2NSwgMHg0ZSwgMHg5NiwgMHgyZCwgMHg0MywgMHgzNCwgMHg1NywgMHg5ZSwgMHg3NSwgMHg5OSwgMHgyNCwgMHhiZCwKKyAgMHhlZiwgMHgzOCwgMHhlZiwgMHg0MiwgMHgxZiwgMHg2ZSwgMHhhYywgMHgyZCwgMHhkYSwgMHg2ZiwgMHg5ZSwgMHhmMCwKKyAgMHhiZCwgMHhkNywgMHg4YywgMHgzMSwgMHhlMSwgMHg3YywgMHgyNiwgMHgwMSwgMHgzMywgMHg2YiwgMHg2MSwgMHhhYSwKKyAgMHg4MCwgMHg2MiwgMHhkMCwgMHgxMiwgMHg1NCwgMHhiOCwgMHhiNSwgMHg0YSwgMHg2YywgMHgxYywgMHgzYywgMHg5ZiwKKyAgMHgwMCwgMHhkMywgMHgyOCwgMHgwOCwgMHgzNiwgMHg0NSwgMHhjNCwgMHhlMiwgMHgxMCwgMHhmOCwgMHhhMywgMHhlOCwKKyAgMHhmYywgMHg0MywgMHgyMywgMHhkMywgMHg3ZSwgMHhkOSwgMHg3OSwgMHgzMSwgMHhjNywgMHg4ZCwgMHhhZCwgMHhiNiwKKyAgMHg3MiwgMHhhYSwgMHhjOSwgMHg2OSwgMHhmMiwgMHhhYSwgMHhjNywgMHg4NCwgMHg5MywgMHhkYiwgMHhiMywgMHg4OSwKKyAgMHg1NiwgMHhjNCwgMHgzNywgMHhmMSwgMHhmMSwgMHhlNCwgMHhkMCwgMHgwYiwgMHhjZCwgMHg2ZSwgMHgyOCwgMHgwYSwKKyAgMHg2NywgMHg1YiwgMHg4OSwgMHg5MCwgMHhlZSwgMHhiYywgMHg1ZSwgMHg1YSwgMHhkYywgMHg5MywgMHgxNywgMHgyOCwKKyAgMHg1OCwgMHgwYiwgMHgxYywgMHhkOSwgMHg5NCwgMHhkYywgMHg4OSwgMHgzOCwgMHgyMiwgMHgwMiwgMHgxNCwgMHgxYywKKyAgMHhkYiwgMHhjYiwgMHhjOSwgMHgwOSwgMHg0MSwgMHgxMCwgMHhiZiwgMHg1ZCwgMHg5NSwgMHhhNywgMHhlNywgMHg2NSwKKyAgMHg5MiwgMHhkNiwgMHhhMCwgMHg1NCwgMHhhYSwgMHg5NiwgMHgyZCwgMHg2MCwgMHgxMCwgMHhiMCwgMHgwMCwgMHgxYSwKKyAgMHhlMCwgMHg3MCwgMHgyMSwgMHgxYSwgMHg5NCwgMHhkNSwgMHhjZSwgMHg4NywgMHgwMywgMHg0MCwgMHg5MSwgMHg5NCwKKyAgMHg4MiwgMHg2MSwgMHg1ZCwgMHgxNiwgMHg5YSwgMHgxNSwgMHg0MiwgMHg1ZCwgMHhkZCwgMHhhZCwgMHgwMCwgMHg0YywKKyAgMHgwYiwgMHgxMiwgMHg3OCwgMHhiNiwgMHgyNiwgMHhlNywgMHhjYSwgMHhlMywgMHhkMCwgMHgyNiwgMHgzYywgMHhiZiwKKyAgMHhhOSwgMHgzNCwgMHgzNywgMHhlNCwgMHgzMywgMHhlYywgMHg4OSwgMHg0ZCwgMHgzYiwgMHg2MiwgMHgzNCwgMHhmNywKKyAgMHgyNSwgMHhlNiwgMHhkZSwgMHhjMiwgMHhkMiwgMHgxZCwgMHg5MywgMHhmMywgMHg1MSwgMHhjZiwgMHg5NSwgMHg2YywKKyAgMHg5ZSwgMHg5YiwgMHhmZCwgMHg1ZiwgMHg4MywgMHg2YiwgMHg2ZSwgMHgyOCwgMHg2ZSwgMHgzOCwgMHhmOCwgMHg5NSwKKyAgMHg3ZiwgMHg3MiwgMHhhOSwgMHhlNiwgMHhiZSwgMHhkZCwgMHhmMSwgMHg5YywgMHg3NywgMHhkOCwgMHgxOSwgMHgwMCwKKyAgMHgzYywgMHhiZCwgMHg0YiwgMHg2NSwgMHg1MCwgMHg3ZSwgMHhkMywgMHgzYywgMHg2YiwgMHg5ZSwgMHg2NywgMHhlMiwKKyAgMHhkZSwgMHg3NCwgMHhlNiwgMHg5ZCwgMHg2ZCwgMHhlNywgMHgzZSwgMHgyMSwgMHg1NCwgMHg1ZSwgMHg5ZiwgMHhhMywKKyAgMHg2NCwgMHg2YywgMHhhZiwgMHhlMSwgMHhkYiwgMHgwYiwgMHhiNSwgMHhkOSwgMHgzOSwgMHhjNCwgMHg5ZiwgMHgyOSwKKyAgMHhkYiwgMHhmMiwgMHhkYiwgMHhlOSwgMHgzOCwgMHhjOCwgMHhlYywgMHg0ZSwgMHhkMiwgMHg2NSwgMHhkMiwgMHhkMywKKyAgMHg1MSwgMHhlMCwgMHg5ZCwgMHgyNCwgMHhjOCwgMHhjNiwgMHg0NCwgMHgwMiwgMHgyOSwgMHg4ZSwgMHgzOCwgMHhlZiwKKyAgMHhiNSwgMHg4NiwgMHgxYywgMHhmMCwgMHg5ZSwgMHg3YSwgMHg2NCwgMHgwMCwgMHg5MSwgMHgyMywgMHhmNiwgMHg5MCwKKyAgMHhhYSwgMHg3YywgMHg5NiwgMHhmNiwgMHgzMSwgMHg0NSwgMHhlYiwgMHgxZCwgMHg0YiwgMHhmYiwgMHhlOSwgMHg2NiwKKyAgMHgzYywgMHhjZiwgMHg0MiwgMHhhNiwgMHg5NywgMHgzOSwgMHg5YiwgMHg1OCwgMHg3OSwgMHg2NCwgMHgxZCwgMHgwMywKKyAgMHgyOSwgMHg1YiwgMHg2OCwgMHhlZCwgMHgxMywgMHgyNCwgMHgxYSwgMHhhNSwgMHg3YywgMHgzYiwgMHhjYywgMHhhMywKKyAgMHhhMywgMHgwOCwgMHg1MywgMHg3MywgMHg2YiwgMHgyOCwgMHg0NiwgMHhiNywgMHg5MiwgMHg0OSwgMHgzMCwgMHg2MSwKKyAgMHg2OCwgMHgyNywgMHgzNCwgMHg5NSwgMHg0OSwgMHgxOSwgMHhjYSwgMHgzNiwgMHg4OCwgMHhhNSwgMHgxMCwgMHgyMSwKKyAgMHgzOCwgMHhlMCwgMHg1OCwgMHhjNywgMHhmNiwgMHg5YiwgMHhlNCwgMHg3NSwgMHg2NiwgMHhhNSwgMHgxZCwgMHhhZiwKKyAgMHg4ZiwgMHhhYSwgMHgwOCwgMHhlYywgMHhiZSwgMHgwZiwgMHgwZCwgMHgzYywgMHhiZiwgMHhlZiwgMHg2ZSwgMHg4MCwKKyAgMHg5OSwgMHhhNywgMHgzMCwgMHg5MCwgMHhjMiwgMHgyMCwgMHgxMCwgMHhjMSwgMHg2OCwgMHhkZSwgMHhhMiwgMHhiOCwKKyAgMHhiMywgMHhjMCwgMHg2OSwgMHhkMywgMHg1ZCwgMHgwYiwgMHgwMiwgMHg4MCwgMHg3MywgMHhiYiwgMHhlZSwgMHhlMywKKyAgMHhlZCwgMHg3NSwgMHhlMiwgMHg2ZCwgMHg1NCwgMHg3MiwgMHg3ZiwgMHg1NywgMHhjZSwgMHgyZiwgMHgzNiwgMHhmMywKKyAgMHgzZCwgMHg1MiwgMHhhNSwgMHg0YSwgMHhmMSwgMHg2MywgMHgzMywgMHg5NywgMHhkMywgMHgzYSwgMHg3YiwgMHg3ZiwKKyAgMHhkOCwgMHhiZSwgMHhmMywgMHg3OSwgMHhlMiwgMHg3OSwgMHg3NywgMHgxYSwgMHhkNywgMHg2OCwgMHg2ZCwgMHhmNiwKKyAgMHg2MiwgMHg5YiwgMHg4NSwgMHg0YiwgMHgzMywgMHgyYywgMHgwMiwgMHg1MCwgMHgyZiwgMHg4NCwgMHhkMCwgMHg1NiwKKyAgMHhiYywgMHgyNiwgMHhhNSwgMHhmMCwgMHg5MiwgMHg2ZCwgMHg3NCwgMHg3OCwgMHhkOSwgMHg2NSwgMHgxOSwgMHgyNiwKKyAgMHhiOCwgMHhhNCwgMHg3YiwgMHhhZCwgMHgxOSwgMHgxMCwgMHg5OCwgMHgwNCwgMHhjMCwgMHg2YSwgMHgxNSwgMHg0MywKKyAgMHhmNywgMHgwMCwgMHhhMiwgMHgyZSwgMHg3MCwgMHg5YywgMHhhOCwgMHgwYiwgMHhkMiwgMHgwYiwgMHg5NSwgMHgyMSwKKyAgMHgxNCwgMHg0YiwgMHhjMSwgMHg0OCwgMHg1ZiwgMHg5MiwgMHg3YSwgMHg0MiwgMHg3MiwgMHhhMiwgMHhiMCwgMHg3YSwKKyAgMHgyNiwgMHgwMiwgMHg5MSwgMHg4MCwgMHgxOSwgMHg3ZSwgMHg2NiwgMHg0MCwgMHgzOCwgMHgyMSwgMHgxYSwgMHg5NCwKKyAgMHhiNSwgMHhjZSwgMHg4NiwgMHhjMywgMHg0MiwgMHgwYiwgMHg0OCwgMHgxNywgMHgyMiwgMHhhOCwgMHgwOSwgMHg3YywKKyAgMHgyZSwgMHg2OCwgMHgwMCwgMHgwMCwgMHg2MywgMHg4YywgMHg5OCwgMHgyYSwgMHhkNCwgMHhjZSwgMHg2ZiwgMHhlOCwKKyAgMHhlMCwgMHhlOCwgMHhjMSwgMHg4MywgMHg0MCwgMHg5OSwgMHhiZSwgMHhiMywgMHg3ZiwgMHhlMiwgMHhiYSwgMHhjNCwKKyAgMHgxMSwgMHg3ZiwgMHhjZSwgMHhkOCwgMHg3NCwgMHg3NywgMHhiNCwgMHhlYywgMHg4YywgMHhjZCwgMHg5OCwgMHhlMiwKKyAgMHg1ZSwgMHg1ZSwgMHgxZiwgMHg1MSwgMHhmMCwgMHg3NSwgMHg2ZSwgMHhhOCwgMHhkMiwgMHhhZSwgMHg0OCwgMHgyNiwKKyAgMHhiYiwgMHg1NywgMHg5ZCwgMHgwMSwgMHgzMSwgMHhmZCwgMHg2NywgMHgyZSwgMHhmZCwgMHgyNywgMHhjYywgMHg5YywKKyAgMHg1ZCwgMHhmYiwgMHgzMywgMHgyNywgMHgxNiwgMHhlOSwgMHg5YywgMHg4MiwgMHgxZiwgMHhiMCwgMHg3MCwgMHg0YywKKyAgMHhhNSwgMHg5MywgMHg0NSwgMHhlMSwgMHg1NiwgMHg5NiwgMHhiOCwgMHgzYiwgMHhmMywgMHg2NCwgMHg3ZiwgMHg5YiwKKyAgMHhkMiwgMHhmZCwgMHg2NywgMHgzMCwgMHhlYywgMHgwZiwgMHg4YSwgMHhiOSwgMHg0ZSwgMHg3YSwgMHg4ZSwgMHg3YiwKKyAgMHhjMSwgMHg3MywgMHhmOSwgMHhlZSwgMHg0ZiwgMHg1ZCwgMHg4MiwgMHg4NywgMHhhYiwgMHhhOSwgMHhkNywgMHgzMSwKKyAgMHhmMiwgMHg1MiwgMHg5NCwgMHgyOSwgMHg5NywgMHgxYiwgMHhhOCwgMHgwMiwgMHgzOSwgMHg5NiwgMHhhYiwgMHhhNywKKyAgMHg1MCwgMHhmMCwgMHg3ZiwgMHg0NywgMHg4NywgMHg5ZiwgMHhhOCwgMHg3ZiwgMHgzNCwgMHhiMiwgMHhjMiwgMHgwZiwKKyAgMHgxNywgMHhmOCwgMHg0YSwgMHgxNSwgMHhiNCwgMHg2MywgMHg0MiwgMHhjZSwgMHhlZSwgMHhhNiwgMHgyMSwgMHhjYiwKKyAgMHgyMSwgMHg0ZiwgMHgyZCwgMHhhYywgMHhhNiwgMHhjOCwgMHg4NiwgMHg1NiwgMHg2NywgMHhlMSwgMHg3MCwgMHhmMSwKKyAgMHhiMiwgMHg4ZiwgMHhmNSwgMHhmZSwgMHg2YywgMHg3MCwgMHhmMCwgMHhlZCwgMHhjYywgMHhlZSwgMHgyNSwgMHg5YSwKKyAgMHg1OCwgMHg3YiwgMHhjMiwgMHhkNywgMHg4MSwgMHgzNywgMHgzMSwgMHgxZiwgMHhlMywgMHhiYSwgMHg1MSwgMHg3MSwKKyAgMHhiNSwgMHgxNCwgMHg5NiwgMHhkZiwgMHg1NiwgMHg2MSwgMHgyNywgMHhiMCwgMHgwYSwgMHhiMiwgMHg4ZCwgMHhiNywKKyAgMHhjOSwgMHg3NCwgMHg1YiwgMHhhNSwgMHg0OSwgMHgyZSwgMHhhNiwgMHhiZiwgMHg3YywgMHgyMywgMHhlOCwgMHhhNywKKyAgMHhmNiwgMHhhNSwgMHhlMywgMHhiNiwgMHgwMSwgMHgyZiwgMHg2OCwgMHg4MywgMHg4MSwgMHgwNCwgMHg0OCwgMHgyMSwKKyAgMHgwOCwgMHgwOCwgMHg2MCwgMHhiMiwgMHgwYywgMHg5MiwgMHhhMCwgMHg3YiwgMHg1YiwgMHg4ZSwgMHgyOCwgMHhhYiwKKyAgMHgxOCwgMHgyMCwgMHgyYSwgMHhiMCwgMHg3MCwgMHhkNywgMHgxMywgMHg3ZSwgMHgzOSwgMHhiZSwgMHgzYiwgMHgwNiwKKyAgMHg2ZiwgMHhlYSwgMHhlMywgMHhmNywgMHg0MCwgMHhmOCwgMHhjZCwgMHg5MywgMHgxNCwgMHgxYywgMHgzMywgMHhmNywKKyAgMHgwYSwgMHhkMSwgMHhhNCwgMHhkNiwgMHhjZSwgMHgxNCwgMHg2YywgMHhiMywgMHhiNiwgMHhkNSwgMHhlYywgMHgwNiwKKyAgMHgyNSwgMHg5YywgMHgyMiwgMHgyNiwgMHgyOCwgMHg4MSwgMHg2OSwgMHhmZCwgMHg0NiwgMHg4YywgMHgwNSwgMHhhZiwKKyAgMHg1ZSwgMHg4MSwgMHhmYywgMHhhYSwgMHhlYiwgMHgyOCwgMHg4MSwgMHgxOCwgMHgzOCwgMHgzYywgMHgzNCwgMHhjMywKKyAgMHhmOSwgMHhlYywgMHgwMiwgMHhkOCwgMHg4MCwgMHg4MCwgMHg1OCwgMHgwNSwgMHg0YSwgMHhhNSwgMHgwMiwgMHhkMCwKKyAgMHg0YywgMHg5NCwgMHgxMiwgMHg1NiwgMHhiNiwgMHg4MiwgMHgyMCwgMHgwMSwgMHgxYiwgMHg0MCwgMHg0MiwgMHg0MSwKKyAgMHg0MSwgMHgyMywgMHhmOCwgMHhiYywgMHg5MCwgMHg5NCwgMHg2ZSwgMHgzZiwgMHg3ZiwgMHhhYywgMHg2ZCwgMHhhMywKKyAgMHhjMCwgMHg1YSwgMHg3OSwgMHgxNSwgMHgwZSwgMHgyMSwgMHgxYSwgMHg5NCwgMHhkZCwgMHhjZSwgMHg4OSwgMHg2MywKKyAgMHhhMSwgMHhhMSwgMHg5OCwgMHgyNCwgMHg2MiwgMHg0YiwgMHg1NiwgMHg3MCwgMHhiNiwgMHg0NiwgMHhlYywgMHhkNSwKKyAgMHhmNCwgMHhlOSwgMHhhYiwgMHg5YiwgMHhhMCwgMHg5MywgMHgwMCwgMHgxYywgMHgxZSwgMHhiMywgMHhlOSwgMHhiNiwKKyAgMHhlOCwgMHhiNywgMHg0NywgMHhlNywgMHhmYywgMHg0YiwgMHgwZSwgMHhmYSwgMHg4NSwgMHgwNiwgMHgxYSwgMHg4MCwKKyAgMHgzYSwgMHhmZiwgMHhmMSwgMHg3ZiwgMHg2YiwgMHg1OCwgMHg4OCwgMHhjYywgMHhlMCwgMHg3MSwgMHg0MSwgMHhlMSwKKyAgMHg1OSwgMHg3YSwgMHg4OCwgMHgyNywgMHhhNywgMHhmNiwgMHgwNiwgMHgwNiwgMHgwYSwgMHg3YSwgMHhjMiwgMHhmNywKKyAgMHg2YywgMHgyNiwgMHg1MCwgMHgwNywgMHhhMywgMHhmZCwgMHg5MywgMHhhNywgMHhmZiwgMHgzZCwgMHhmOCwgMHg1ZiwKKyAgMHgxZiwgMHhlZSwgMHg4YywgMHhkMSwgMHhjYywgMHhmOSwgMHhmZiwgMHgyNCwgMHg2OSwgMHhiOSwgMHgxOSwgMHg2NCwKKyAgMHg4OSwgMHg0NCwgMHg0OSwgMHgwMSwgMHhjMCwgMHg1MSwgMHhmOSwgMHg3ZiwgMHg1YywgMHhmMiwgMHgzYywgMHhjMiwKKyAgMHg4YSwgMHgxZiwgMHhlNiwgMHg1OSwgMHg3MywgMHhhYiwgMHhiOSwgMHhiMiwgMHgxYiwgMHhhYiwgMHhhZSwgMHg3YiwKKyAgMHhjNywgMHhlNSwgMHg2MSwgMHhiMywgMHhiZCwgMHg0MCwgMHhkMiwgMHg5NCwgMHg5OCwgMHg5ZSwgMHg4NSwgMHg2NSwKKyAgMHg0NywgMHhlOCwgMHhhNCwgMHgzNywgMHg3ZiwgMHg2MCwgMHhlNSwgMHhmYSwgMHgwZCwgMHg1YSwgMHg3NiwgMHhiYywKKyAgMHhkNiwgMHgwOCwgMHhiOSwgMHg0YiwgMHhhZSwgMHgzNiwgMHgyZCwgMHhmYSwgMHhlYSwgMHg4MCwgMHhlOCwgMHg4ZSwKKyAgMHhlMywgMHhmNCwgMHgwZCwgMHg2ZiwgMHhmZSwgMHhkZCwgMHg2ZCwgMHhmZSwgMHg1ZiwgMHhmZiwgMHhiMiwgMHhhOCwKKyAgMHhiZiwgMHg0ZCwgMHg2OCwgMHg4NywgMHg4ZSwgMHgwMywgMHhhNiwgMHhmYiwgMHg1MywgMHhjNSwgMHhmYSwgMHhhMywKKyAgMHhhMCwgMHhhYSwgMHg1MCwgMHg3ZSwgMHhkYiwgMHhlMCwgMHg3YSwgMHg1YiwgMHhmNiwgMHg3OCwgMHg2NiwgMHhjNywKKyAgMHhhNCwgMHgzNSwgMHgzZSwgMHg4NSwgMHhjZCwgMHg1OSwgMHg4NywgMHhlMywgMHhiMywgMHg1YywgMHgxNiwgMHgxZCwKKyAgMHhhNSwgMHhlYiwgMHgxYiwgMHhhZiwgMHg2YiwgMHhiOSwgMHg5NiwgMHg0NiwgMHhkOSwgMHhiMSwgMHhlOCwgMHgxYSwKKyAgMHg5ZiwgMHhkMiwgMHhlZCwgMHhkYiwgMHg2ZCwgMHg3YSwgMHhhMywgMHg2NCwgMHhjNSwgMHhkYywgMHgyMywgMHhhNCwKKyAgMHg2YiwgMHhkMywgMHg1MiwgMHgyYiwgMHg1MCwgMHhlNCwgMHhjOCwgMHhjMSwgMHg5MiwgMHg1OSwgMHgwZSwgMHg1YywKKyAgMHgyMSwgMHhjZCwgMHhhYiwgMHgyZCwgMHg1MiwgMHgzZCwgMHgyYywgMHhhZiwgMHhlYywgMHhiNSwgMHg4OCwgMHhkZCwKKyAgMHhjZSwgMHgzMiwgMHhmNywgMHg4MywgMHgxZiwgMHhkMiwgMHg4YSwgMHhkOCwgMHhmMiwgMHgyMywgMHhiYywgMHhkOCwKKyAgMHhjZiwgMHg4YywgMHhiYywgMHhhOSwgMHg4MSwgMHhkMSwgMHgzNCwgMHg5NywgMHhkNywgMHhlMiwgMHhkNSwgMHgwMiwKKyAgMHg3YSwgMHhkZiwgMHg1OSwgMHgzZiwgMHhhMSwgMHg4MSwgMHgwYiwgMHhmZCwgMHg2NiwgMHg5YSwgMHhjZSwgMHg3OSwKKyAgMHgyOSwgMHhmMiwgMHg2YiwgMHhhZSwgMHhjZCwgMHgxOCwgMHgzNSwgMHhiNywgMHhkYywgMHhmZiwgMHhhYSwgMHg4ZSwKKyAgMHg2MSwgMHgyMCwgMHgxNywgMHgxYywgMHhiZSwgMHg0MCwgMHgwNiwgMHg4MiwgMHg0OCwgMHhiYywgMHhlMSwgMHhiMywKKyAgMHhkMywgMHg0MiwgMHgwMywgMHhhYiwgMHg3ZCwgMHgyNiwgMHhiZCwgMHg3ZSwgMHhlMywgMHg2OSwgMHhlNywgMHhkYiwKKyAgMHg1NiwgMHg3NCwgMHgwMCwgMHgwNCwgMHhjNSwgMHhiMSwgMHg4OCwgMHg2MywgMHg0MSwgMHg4OCwgMHg4MCwgMHg2MiwKKyAgMHgxMCwgMHg0MCwgMHg5OCwgMHgyMywgMHg3MywgMHg1MiwgMHg5OCwgMHg4MSwgMHg2ZiwgMHgyYiwgMHhmNiwgMHg1OCwKKyAgMHgwNSwgMHg4ZCwgMHg4MywgMHg0YSwgMHhmNiwgMHhlZCwgMHg4NSwgMHgxOSwgMHhkMywgMHg0ZSwgMHhhOCwgMHhkYiwKKyAgMHhkMiwgMHhmZSwgMHg5NywgMHhjZSwgMHg4YywgMHgxMSwgMHhhMywgMHhlMSwgMHgwZSwgMHgxMSwgMHgyMCwgMHgyOCwKKyAgMHhiOSwgMHhlMywgMHhmOSwgMHgxZCwgMHgyMiwgMHgyZCwgMHhjMCwgMHgwYywgMHhhMSwgMHg3NiwgMHhmYywgMHg0MiwKKyAgMHg1OCwgMHg3MiwgMHg4NiwgMHhkMiwgMHgyMiwgMHhmMCwgMHhjNCwgMHg3ZiwgMHg2ZiwgMHhkYSwgMHgwMiwgMHg1YywKKyAgMHhmZSwgMHg2NiwgMHgzMywgMHg3MCwgMHg4OSwgMHhkNywgMHg4OCwgMHgxOSwgMHhjYiwgMHgyYywgMHg5NSwgMHg0NCwKKyAgMHhmMiwgMHgwMSwgMHg0YywgMHhiZSwgMHhlNSwgMHhjNSwgMHg0NSwgMHgzNiwgMHhhYywgMHgyOCwgMHg1ZiwgMHhlZiwKKyAgMHg4MywgMHgyZiwgMHhjZiwgMHhhZiwgMHhlZiwgMHg3ZiwgMHgxNSwgMHhlNSwgMHg3MCwgMHhlMCwgMHgyMSwgMHgxYSwKKyAgMHg5NCwgMHhiNSwgMHhhYSwgMHg5NSwgMHgwNSwgMHg0MSwgMHg4YiwgMHg4MCwgMHg1MiwgMHhmMCwgMHhjNSwgMHg1NCwKKyAgMHg3OSwgMHg0ZSwgMHgzMiwgMHg1ZCwgMHg5YSwgMHgxOCwgMHg2OCwgMHhhMSwgMHhhYywgMHg5ZCwgMHhhMCwgMHgxMiwKKyAgMHgwYSwgMHgwNSwgMHg2OSwgMHhlMCwgMHhhZSwgMHhhNywgMHg1NCwgMHgyNiwgMHg5NywgMHhjZCwgMHhmYSwgMHhlZCwKKyAgMHg4ZCwgMHg2OSwgMHg5YywgMHg5MSwgMHhjOSwgMHgxYSwgMHg2ZCwgMHhjZiwgMHg2OCwgMHhhMiwgMHg4ZiwgMHg5NSwKKyAgMHgwYiwgMHhmYiwgMHhlZSwgMHg0YiwgMHhiNiwgMHhmYywgMHg4YiwgMHg1YiwgMHhhYiwgMHg1ZSwgMHg5YywgMHg1ZCwKKyAgMHhhNSwgMHgzYywgMHgzYSwgMHhhYiwgMHg0ZSwgMHg1ZSwgMHhiNywgMHg5ZSwgMHhkMywgMHhiMCwgMHgzYywgMHgxYSwKKyAgMHhmYywgMHg1MCwgMHhlZSwgMHg1OCwgMHhlZiwgMHgwOSwgMHgyNCwgMHgwZSwgMHhhNywgMHgzZiwgMHgyYSwgMHhlMywKKyAgMHhiZCwgMHg2OSwgMHgxOSwgMHhhNSwgMHhjMSwgMHgzNiwgMHg2NSwgMHhhZCwgMHgyZSwgMHhjZCwgMHhmMCwgMHhiYSwKKyAgMHg5MywgMHhlZCwgMHhjZiwgMHgzOSwgMHhjMywgMHhiOSwgMHg3MiwgMHhlNSwgMHhmZiwgMHg3NSwgMHg4MSwgMHhkMCwKKyAgMHgzNiwgMHg2YiwgMHhmYywgMHg4ZiwgMHgxNiwgMHg0NiwgMHhhNSwgMHhhOCwgMHhkNiwgMHhmYSwgMHg3YywgMHhjNSwKKyAgMHgzMCwgMHg1YSwgMHhjYywgMHg5MywgMHg0YywgMHhhNiwgMHg5OCwgMHg4MSwgMHhiNCwgMHg5MCwgMHhjMywgMHhjMywKKyAgMHg0ZSwgMHg1OSwgMHg2ZCwgMHhiZSwgMHhiMywgMHhhNiwgMHhmMywgMHgxNCwgMHgyOCwgMHg0YywgMHg0MCwgMHhjZSwKKyAgMHhkNywgMHhmZiwgMHhiNywgMHgzZiwgMHg3MCwgMHhjNSwgMHhiNiwgMHg2NSwgMHg1ZSwgMHhiZCwgMHg5YSwgMHg0MCwKKyAgMHhjNSwgMHhhMSwgMHhlYiwgMHg4MiwgMHg0YiwgMHg2MywgMHg3NSwgMHgwMSwgMHhlMCwgMHg5YSwgMHhkNCwgMHhhOCwKKyAgMHhhYywgMHg0NSwgMHhhZCwgMHhkOSwgMHg5NiwgMHhhOCwgMHhlYywgMHhkNSwgMHg0YiwgMHhhNywgMHgzZiwgMHg1MCwKKyAgMHhhMCwgMHhhNCwgMHhjYiwgMHhkMiwgMHg2MCwgMHg5MCwgMHg3ZiwgMHhmYiwgMHg0ZiwgMHg5MCwgMHhkOSwgMHg3MCwKKyAgMHg2YiwgMHhkNiwgMHg1OSwgMHg1MywgMHhkYywgMHg2YiwgMHgwYywgMHg0YSwgMHg0NiwgMHg4YywgMHgyMiwgMHgzNywKKyAgMHg4OCwgMHg0YSwgMHhkOSwgMHhlOCwgMHhlOCwgMHg4MSwgMHgxMCwgMHgxNCwgMHg0OCwgMHgwMiwgMHgxMywgMHg4MCwKKyAgMHgxMSwgMHhlMSwgMHg4MCwgMHhmNiwgMHgzNSwgMHhmOCwgMHhiMywgMHgxNywgMHg0MSwgMHhhYywgMHg5ZCwgMHhhMCwKKyAgMHgxMiwgMHgwYSwgMHgwNSwgMHg2OCwgMHhmYywgMHhiYywgMHg0YSwgMHg4ZiwgMHhiYywgMHhmZSwgMHhmNSwgMHgxYiwKKyAgMHhlMiwgMHg3YSwgMHgzZiwgMHhjZiwgMHgxNiwgMHhmYiwgMHgyMywgMHhiMywgMHg0OSwgMHg4OCwgMHg3MywgMHgyOCwKKyAgMHgzYSwgMHgzMSwgMHhlZiwgMHgwOSwgMHg4MCwgMHhiZCwgMHhlMywgMHhjMiwgMHhiYiwgMHhjNCwgMHhkNiwgMHhlZSwKKyAgMHgzYiwgMHhlYiwgMHg0ZSwgMHg3YiwgMHg2ZSwgMHgxOCwgMHgzMywgMHgyMCwgMHgxOSwgMHgwNCwgMHhhNSwgMHhkZSwKKyAgMHg2OSwgMHg5MCwgMHhkMCwgMHgzOCwgMHgzYywgMHg0ZCwgMHg1NSwgMHg0ZSwgMHgzYSwgMHg2NCwgMHhjZiwgMHhhZSwKKyAgMHhkNywgMHhkYSwgMHgyMCwgMHg1MSwgMHhkYiwgMHhmNiwgMHgzOCwgMHg0ZiwgMHhlNywgMHgwYiwgMHhmMiwgMHgwOSwKKyAgMHg1YywgMHgwZiwgMHgwOCwgMHgwMCwgMHg4ZCwgMHhkNCwgMHg5ZCwgMHhhZSwgMHg1NiwgMHhlOSwgMHgyYiwgMHgyMCwKKyAgMHgwNiwgMHg0NiwgMHgwMCwgMHgzMSwgMHhjMCwgMHgzNCwgMHgzMiwgMHhhNSwgMHg2MSwgMHg3YSwgMHg0NSwgMHg5MywKKyAgMHgxMCwgMHgwMywgMHgwNywgMHgyMSwgMHgxYSwgMHg5NCwgMHhjNSwgMHhiYSwgMHg5NiwgMHg4MywgMHgxMywgMHg5MCwKKyAgMHg4NCwgMHhhMiwgMHgyMywgMHg3NywgMHg2YiwgMHgzNiwgMHhjOSwgMHgxZSwgMHg2NSwgMHhhYSwgMHhlYywgMHg4MSwKKyAgMHg5YywgMHgwNiwgMHgwNCwgMHg5YSwgMHgwMiwgMHg0MywgMHgzZiwgMHhmMCwgMHg3ZCwgMHgwNywgMHhmZiwgMHgyYiwKKyAgMHhhNSwgMHgzZSwgMHhiNywgMHg2YywgMHg3ZCwgMHhiZiwgMHhiNSwgMHgyZCwgMHgyNCwgMHg1ZCwgMHhjMSwgMHhiZSwKKyAgMHgyYiwgMHg1MCwgMHg2NywgMHhkNCwgMHhmYiwgMHgyNiwgMHg0OCwgMHhmMywgMHhiNSwgMHhiZSwgMHhlYiwgMHg5OSwKKyAgMHg4MSwgMHhhNSwgMHhlNywgMHhmMSwgMHhjYywgMHhlMSwgMHhmYSwgMHg5NywgMHg0ZCwgMHg1NiwgMHhjMywgMHhjOSwKKyAgMHg3ZSwgMHhlZCwgMHhmZiwgMHg5NCwgMHg2MSwgMHgxZSwgMHg3MSwgMHhmZSwgMHg4ZiwgMHhiMiwgMHhiOSwgMHgzNCwKKyAgMHhkZSwgMHgyMiwgMHgzZSwgMHg3YSwgMHhmNywgMHg1MywgMHhlYiwgMHgzYiwgMHhjZiwgMHhjMiwgMHhmYiwgMHhmNywKKyAgMHg1YSwgMHhmMiwgMHhhYSwgMHg4NSwgMHhkZCwgMHg3OSwgMHgzNSwgMHg1YiwgMHhhYSwgMHg3ZiwgMHhiYSwgMHg3YSwKKyAgMHhjZCwgMHg1NiwgMHgzNywgMHg3ZCwgMHg3NywgMHg2NSwgMHhjNiwgMHhlMywgMHg2YiwgMHgzYiwgMHg2ZSwgMHgyNiwKKyAgMHgzMywgMHgyNCwgMHhhMSwgMHg0YiwgMHhiOSwgMHhkYSwgMHhjZCwgMHhhNiwgMHgxNCwgMHg2MiwgMHg5NywgMHgxZSwKKyAgMHhlNiwgMHg1YiwgMHg5MCwgMHg1OCwgMHhiNSwgMHg2YiwgMHgxMiwgMHg2NiwgMHhkOCwgMHhhYywgMHg1NCwgMHg3MCwKKyAgMHg2NiwgMHg1YSwgMHhkOSwgMHg0OSwgMHg2YSwgMHhkNSwgMHg0OSwgMHg5MCwgMHg4NiwgMHg2NCwgMHhhOCwgMHhhZCwKKyAgMHgxNywgMHhjMCwgMHg4MiwgMHg5MywgMHg3YywgMHhhZCwgMHg4OSwgMHhhOCwgMHg0MSwgMHg2OCwgMHg2YiwgMHhhMywKKyAgMHhiNywgMHhjMSwgMHg0ZCwgMHgyNiwgMHg2YiwgMHgyZiwgMHhiZCwgMHg1NCwgMHhkYiwgMHg3NywgMHg0OCwgMHg5YywKKyAgMHhlNiwgMHg0MiwgMHg1ZiwgMHhhOSwgMHhiMiwgMHg5YSwgMHhlMiwgMHgyNSwgMHg1OCwgMHg0NiwgMHhhYiwgMHg5NCwKKyAgMHg0NSwgMHg3ZCwgMHg1MSwgMHhiNCwgMHgxNCwgMHg0OCwgMHg4OSwgMHhkNiwgMHg2NSwgMHgzNCwgMHhlMSwgMHg5ZCwKKyAgMHhhNSwgMHgyNSwgMHhjYSwgMHgyOCwgMHg5OSwgMHg1NSwgMHg5ZSwgMHhhNSwgMHg4YiwgMHg5OCwgMHhhNCwgMHg5ZCwKKyAgMHg4YiwgMHhkMSwgMHg4YSwgMHgzMywgMHg5YSwgMHgxMSwgMHg0MSwgMHg3MiwgMHhkMSwgMHgwNCwgMHhkNSwgMHhiYywKKyAgMHhkMiwgMHg0NCwgMHgxNywgMHgwNCwgMHg2YSwgMHhhYSwgMHhlZCwgMHg0YSwgMHg1NCwgMHg1YiwgMHg4MSwgMHhhZSwKKyAgMHgwZSwgMHgwMCwgMHgwMSwgMHg2YywgMHhhZCwgMHg1OCwgMHgwZSwgMHg3OCwgMHgwMCwgMHhhMywgMHg5YywgMHgyYSwKKyAgMHgyMiwgMHhiZiwgMHg0ZSwgMHhiOCwgMHhkYSwgMHg5NCwgMHgyZCwgMHhiYSwgMHg0ZSwgMHgyMiwgMHhkMywgMHg4NywKKyAgMHhmYywgMHg2ZSwgMHg1MywgMHg5MSwgMHhlMSwgMHg1NCwgMHg3YywgMHg0ZSwgMHhlNiwgMHhjYywgMHhkYywgMHg0NiwKKyAgMHgzOCwgMHhmZSwgMHgwNCwgMHhiMCwgMHgxNiwgMHhjYiwgMHhmZSwgMHg0NSwgMHgxZCwgMHhjYSwgMHhlYywgMHg5YiwKKyAgMHhlYSwgMHhmZiwgMHgzOCwgMHhlNiwgMHhjOSwgMHg4MSwgMHhhOSwgMHg1MSwgMHgyMiwgMHhhMSwgMHhmZCwgMHg5ZiwKKyAgMHhhYiwgMHhlMywgMHhlNiwgMHhkNCwgMHg3MywgMHg3NywgMHg5YiwgMHhiZSwgMHg3ZiwgMHgwZCwgMHhlZCwgMHhiZiwKKyAgMHg4ZiwgMHg0ZCwgMHhhOCwgMHgwMCwgMHhmNywgMHg4NywgMHhlMywgMHhlMywgMHhjZiwgMHg0MCwgMHg1OCwgMHgwMCwKKyAgMHgzMSwgMHgzOSwgMHhjYiwgMHgyNiwgMHg2NywgMHg3ZCwgMHhjYiwgMHgyNiwgMHg2OCwgMHg3ZCwgMHgxMSwgMHgxZCwKKyAgMHhkNCwgMHg1NSwgMHg1MiwgMHhiYiwgMHgxZSwgMHgxNywgMHhkNiwgMHgwOSwgMHhkYSwgMHgxZiwgMHg4YywgMHg5MCwKKyAgMHhiNywgMHhkNywgMHhhNywgMHg2YSwgMHhkOSwgMHg3MSwgMHg5MSwgMHg1ZSwgMHg5ZSwgMHgyYiwgMHhmMSwgMHg5YywKKyAgMHhhMSwgMHg0YywgMHg3OSwgMHg0MCwgMHgzYywgMHg1YSwgMHg4YiwgMHg1NCwgMHhiMSwgMHg0MCwgMHgwMCwgMHhlZCwKKyAgMHg5YiwgMHgyYSwgMHg4MSwgMHg5ZSwgMHg5YSwgMHhkMywgMHg0YSwgMHgwYywgMHhmMCwgMHgwZSwgMHgyMSwgMHgxYSwKKyAgMHg4ZSwgMHhjYSwgMHgxZiwgMHhmZiwgMHg2ZiwgMHhmZiwgMHgzNSwgMHg2NSwgMHhhOCwgMHg0MSwgMHg5MCwgMHhhNCwKKyAgMHg3MSwgMHgxOCwgMHgwYSwgMHg1NSwgMHgzMywgMHg0MiwgMHhhNSwgMHhkZSwgMHhhYywgMHhkNywgMHgxNSwgMHhhYSwKKyAgMHhiMCwgMHgwMCwgMHhkNiwgMHg0OCwgMHg4NiwgMHg3YSwgMHgwNSwgMHg3YiwgMHgyMCwgMHhiYiwgMHg4ZCwgMHhjYSwKKyAgMHhlNSwgMHg4ZCwgMHg2YiwgMHgxMiwgMHg5MCwgMHgwOCwgMHgwOSwgMHg5NCwgMHhiOCwgMHhmNCwgMHgzZSwgMHg3MSwKKyAgMHg2ZSwgMHgyMywgMHhkNSwgMHgzOSwgMHg4YiwgMHg3OSwgMHg3NiwgMHhjYywgMHg2NCwgMHgxZSwgMHg2YiwgMHhhYSwKKyAgMHhmNCwgMHhhYSwgMHhlNiwgMHgyMCwgMHhhNiwgMHg4ZiwgMHg5NSwgMHg2NSwgMHgwZSwgMHhjZCwgMHgxYywgMHg2OCwKKyAgMHgwOSwgMHhhYiwgMHgyNywgMHgyYSwgMHg5YiwgMHg1ZSwgMHg2OSwgMHhiOCwgMHhlNiwgMHg1YywgMHhiNywgMHgyZSwKKyAgMHg4MCwgMHg4NywgMHg0ZiwgMHhlMywgMHg1YywgMHg3MSwgMHhkYSwgMHhhNCwgMHhhOCwgMHhjYiwgMHhjMywgMHhkNiwKKyAgMHg3MSwgMHg1YiwgMHhjOCwgMHg2NSwgMHgyYSwgMHg4MCwgMHgyZCwgMHhiYiwgMHhkZCwgMHg1ZCwgMHg0NCwgMHg1MiwKKyAgMHgxOSwgMHg5YywgMHhlMywgMHg3NiwgMHg0ZCwgMHg1ZCwgMHg3MSwgMHgwNCwgMHgyMCwgMHg1YSwgMHhkMywgMHgyZCwKKyAgMHgwOCwgMHg0NCwgMHg4YSwgMHg0OCwgMHhiNSwgMHgyNiwgMHgzNywgMHgxMSwgMHg2YywgMHgyYSwgMHgxYywgMHgxNiwKKyAgMHgzNSwgMHg1MSwgMHg3MywgMHg4MiwgMHg5MCwgMHg0NCwgMHg2MywgMHg4NCwgMHg0MCwgMHg2ZCwgMHg4OCwgMHg1MiwKKyAgMHgyMCwgMHhiNiwgMHgxMywgMHg4MiwgMHg0YywgMHgwYiwgMHg4MiwgMHgxNSwgMHgyOCwgMHgyNSwgMHgzZCwgMHgzYSwKKyAgMHhhNSwgMHhhYiwgMHhjZCwgMHg2OCwgMHg2ZSwgMHhhNiwgMHhlZiwgMHg1NSwgMHhiMywgMHgzNiwgMHg3OCwgMHgzMCwKKyAgMHgyYSwgMHhiYywgMHg3NSwgMHhmNiwgMHg5MSwgMHgyNywgMHgzZCwgMHg2YywgMHhkNSwgMHhjYiwgMHgyYywgMHg1NSwKKyAgMHg2YSwgMHhkZCwgMHhkNiwgMHg0ZCwgMHhkZiwgMHgxNCwgMHhmMiwgMHgzNywgMHg5NSwgMHg0ZiwgMHg2ZiwgMHgxYywKKyAgMHhmYywgMHg4ZSwgMHg0OCwgMHg4NCwgMHhmYiwgMHgzOCwgMHhkNywgMHg5ZiwgMHhjZSwgMHgxYywgMHg0MCwgMHg1ZiwKKyAgMHhlYiwgMHhhYiwgMHhlNCwgMHhlNCwgMHhmZiwgMHhjZSwgMHhlZSwgMHhlNiwgMHhlNiwgMHhkMywgMHhmYywgMHg5YywKKyAgMHhlNywgMHg1YSwgMHhlOCwgMHg2YywgMHg4NywgMHgyMSwgMHhiMywgMHg1OSwgMHhjMSwgMHg4YSwgMHhkNSwgMHg5MiwKKyAgMHgxNiwgMHg0OCwgMHg1OSwgMHhjYywgMHhmNSwgMHhkNSwgMHg5NywgMHg3NSwgMHgwZiwgMHhmZiwgMHg3NCwgMHgzOSwKKyAgMHg3MCwgMHgxMSwgMHhmYSwgMHg4NCwgMHhjNSwgMHhhZSwgMHg4YSwgMHhjNSwgMHgyMiwgMHgwMCwgMHg4NSwgMHhlMywKKyAgMHg3NCwgMHg1NiwgMHhjMiwgMHhkOSwgMHg0OSwgMHhhZCwgMHgzNCwgMHg3MSwgMHhhZCwgMHg1MiwgMHhlMiwgMHgyMiwKKyAgMHgwYiwgMHg2NSwgMHgyZiwgMHg3ZiwgMHg4MiwgMHgwNywgMHg0NiwgMHg3MSwgMHg1NSwgMHgzOCwgMHgwZSwgMHhjZCwKKyAgMHhlYiwgMHgwOCwgMHgzZiwgMHgzYSwgMHg0NiwgMHgzOCwgMHgxOCwgMHgyNiwgMHg0NCwgMHg3ZCwgMHg3MywgMHhmYSwKKyAgMHgxYywgMHgzZCwgMHgyMywgMHgwNSwgMHg4MSwgMHhjOCwgMHg1NCwgMHg5ZSwgMHhmMywgMHg4ZSwgMHgwZSwgMHgwZSwKKyAgMHhhMywgMHgyMCwgMHhhMCwgMHhmZiwgMHg0MywgMHg4NiwgMHhmOCwgMHg4ZCwgMHhjZiwgMHg2MCwgMHg4MywgMHhiMywKKyAgMHg2MiwgMHg1NSwgMHg4OSwgMHhmNSwgMHhlMywgMHgxZSwgMHgyZiwgMHhlMCwgMHgxMiwgMHg5NSwgMHgyOSwgMHg3YywKKyAgMHg1MSwgMHg3MiwgMHgwYywgMHhlOCwgMHg0NCwgMHg1MywgMHg5ZiwgMHg3YiwgMHg1NCwgMHg4MSwgMHg3ZSwgMHg3ZCwKKyAgMHgwOCwgMHhhNywgMHhiZiwgMHg3NSwgMHgzNywgMHgzNCwgMHhiYiwgMHg2MywgMHhhZiwgMHg2ZiwgMHg1MSwgMHg2YywKKyAgMHgzYywgMHg1ZCwgMHhjMSwgMHhmZSwgMHgyYSwgMHgyNSwgMHgyYSwgMHg3ZiwgMHg2YywgMHgzZCwgMHg1ZCwgMHhhMywKKyAgMHgxYiwgMHgxMCwgMHg0YywgMHhhNSwgMHhhOCwgMHhiZCwgMHhjZiwgMHg0ZSwgMHg3ZiwgMHhjMywgMHgzZCwgMHhhZiwKKyAgMHgyZiwgMHhmYSwgMHgwNSwgMHgxMSwgMHgwMCwgMHhjZCwgMHg0YywgMHhjMCwgMHg5MCwgMHhhMSwgMHg3OSwgMHhhNywKKyAgMHgxMSwgMHg0MSwgMHg2OSwgMHhhNywgMHg2ZSwgMHhiYSwgMHgxMywgMHgwMCwgMHgwYiwgMHg2YywgMHg1MCwgMHg0YSwKKyAgMHhkNSwgMHgxYiwgMHg2MCwgMHgyYywgMHgxYywgMHgyMSwgMHgxYSwgMHg4ZCwgMHgwOCwgMHg1ZiwgMHgzNCwgMHgwNywKKyAgMHhmZCwgMHgzNywgMHg1NCwgMHg2MSwgMHgwYywgMHg0MCwgMHg2YywgMHhhZSwgMHgwYSwgMHg4NSwgMHg1NywgMHgzNCwKKyAgMHgxYSwgMHg1YywgMHhiMSwgMHhlNiwgMHhkYSwgMHg1ZSwgMHgxMSwgMHg1YSwgMHg1YiwgMHgyYSwgMHg0MiwgMHhlMCwKKyAgMHg3MCwgMHg3ZiwgMHg3YiwgMHg0ZSwgMHhiMywgMHg4NywgMHhiZCwgMHg3ZSwgMHhlZSwgMHhjMSwgMHg5NiwgMHg2MiwKKyAgMHg3ZiwgMHg1NSwgMHg1OCwgMHg1ZCwgMHg2ZCwgMHhlYywgMHgwZiwgMHgzZSwgMHhkOSwgMHgxZiwgMHgwZSwgMHg2YiwKKyAgMHgwZiwgMHgxOCwgMHhlNSwgMHhhZCwgMHhhZSwgMHgzNiwgMHgzYSwgMHhiOCwgMHhiYywgMHhmNSwgMHhjYiwgMHg1YiwKKyAgMHhiYywgMHgxYiwgMHg4OSwgMHgyOSwgMHhhMywgMHhmOCwgMHhjNSwgMHgxOCwgMHg2YiwgMHhkNCwgMHg5ZCwgMHg5MywKKyAgMHg1ZSwgMHhkYSwgMHhhMiwgMHhhZSwgMHhlNiwgMHg1ZCwgMHhmMywgMHg3NiwgMHg0NiwgMHhiNiwgMHgxYiwgMHgyNywKKyAgMHgyYiwgMHg3NSwgMHg3YSwgMHgwNCwgMHhhMywgMHgyMywgMHgxNCwgMHhhNCwgMHhhMywgMHg3OCwgMHhiNywgMHgyMywKKyAgMHhmOSwgMHhkMywgMHhiMywgMHgzYywgMHhhYiwgMHg2MCwgMHg4NywgMHg5ZiwgMHhmZCwgMHg1YSwgMHgyNiwgMHhhZSwKKyAgMHhiMywgMHg2ZiwgMHhiOSwgMHgxMCwgMHhiOCwgMHgwOSwgMHhhOCwgMHg1NCwgMHgxMywgMHhjNSwgMHg1YSwgMHg2MiwKKyAgMHhiNCwgMHg1NywgMHgwMiwgMHg2YywgMHgzMiwgMHgwYiwgMHg1MiwgMHgzMiwgMHg4YywgMHgzNCwgMHgyOSwgMHg2OCwKKyAgMHgzMCwgMHg1ZiwgMHg3ZiwgMHg1MiwgMHhkMiwgMHg5ZCwgMHhlMywgMHg2NCwgMHg5YiwgMHg2NSwgMHg4NSwgMHg3NCwKKyAgMHgxNiwgMHg0MiwgMHhlMSwgMHg3MCwgMHgwOSwgMHgyNywgMHgzOCwgMHg2ZCwgMHg5ZCwgMHhiNiwgMHg0MiwgMHg4NiwKKyAgMHg4NiwgMHhlYiwgMHgzMSwgMHhjNiwgMHg3MiwgMHhkNCwgMHg2OCwgMHgwZiwgMHgyNSwgMHg4NiwgMHg5YSwgMHhiOSwKKyAgMHg2OCwgMHhiMCwgMHgxNiwgMHg0NCwgMHg0NiwgMHhlNiwgMHg2MywgMHg3MywgMHg0ZiwgMHgxYywgMHgxNSwgMHhkOSwKKyAgMHg4YiwgMHhiNiwgMHhmZiwgMHgwNywgMHhjZSwgMHhhZCwgMHgwZSwgMHgzNiwgMHhjNCwgMHhjMywgMHg0ZiwgMHhhNSwKKyAgMHg1YiwgMHhiZSwgMHg4ZSwgMHgzNiwgMHhlOCwgMHg0MCwgMHhlMiwgMHgxZSwgMHhmMSwgMHgzOSwgMHhmMiwgMHgxNCwKKyAgMHgyMCwgMHhmOCwgMHhjZiwgMHg4NiwgMHg4MSwgMHg1MywgMHhjYywgMHg4MCwgMHgwYSwgMHgzYSwgMHhjYSwgMHg3MSwKKyAgMHgwNiwgMHgwOSwgMHhhMSwgMHgwOSwgMHgxNSwgMHgyYSwgMHg5ZiwgMHg0MCwgMHg5MiwgMHgwMSwgMHhhYSwgMHgyNiwKKyAgMHhhYiwgMHg5ZCwgMHgyNSwgMHhlOCwgMHhiZCwgMHg4NSwgMHhkYywgMHg0ZiwgMHhmMywgMHg4ZSwgMHg0MSwgMHhlZiwKKyAgMHgyMywgMHgwMiwgMHg5NiwgMHhiYSwgMHhjYywgMHhhNCwgMHg5ZiwgMHg5ZiwgMHgzYSwgMHhmYiwgMHg1OCwgMHhkYywKKyAgMHgzZCwgMHg1OCwgMHhmZiwgMHhjYywgMHgzZSwgMHg1YywgMHg2MCwgMHg0ZSwgMHhjMiwgMHhmZiwgMHg4NCwgMHhlNSwKKyAgMHg1ZSwgMHhhNCwgMHg4ZCwgMHgzZiwgMHhiYiwgMHg2NiwgMHg2YiwgMHhjMCwgMHgyMCwgMHhkYSwgMHg1ZSwgMHg0YywKKyAgMHhkMywgMHhjZiwgMHhiMiwgMHg3NCwgMHgxMywgMHgwNCwgMHhhNywgMHgzMSwgMHhjOSwgMHg3YywgMHgzMCwgMHhkMywKKyAgMHgwYSwgMHgxNCwgMHhhNSwgMHhiMSwgMHg5MiwgMHgzYywgMHgyNSwgMHgyZSwgMHg5OCwgMHg2ZCwgMHgxNCwgMHg1ZSwKKyAgMHgzYywgMHgzZSwgMHg0MCwgMHgxNiwgMHgwMiwgMHg2MCwgMHgxYywgMHgyMSwgMHgxYSwgMHg4ZiwgMHg4MCwgMHgxZSwKKyAgMHgwYywgMHgwMCwgMHg1ZiwgMHgzZiwgMHg2NywgMHhhNywgMHhiMCwgMHhjNiwgMHgyNCwgMHg5YywgMHgzMSwgMHgyYSwKKyAgMHhhOCwgMHg1MiwgMHg0ZSwgMHg5MiwgMHhkMSwgMHhhYiwgMHgzNCwgMHgxMiwgMHg4NSwgMHg5NiwgMHhjOSwgMHg5MiwKKyAgMHhiMCwgMHgzYywgMHhlMywgMHg5ZSwgMHgzNSwgMHhmZSwgMHg5NCwgMHhmOSwgMHhlZSwgMHg2ZSwgMHg4MSwgMHgzYSwKKyAgMHhiYiwgMHhiYiwgMHg5OSwgMHgzMSwgMHgzYywgMHgzYiwgMHg4YywgMHgxYSwgMHhmMiwgMHhkMSwgMHhiMywgMHg4OSwKKyAgMHg1NSwgMHhjYSwgMHg4ZCwgMHg4MiwgMHg3ZCwgMHhjMiwgMHgzMiwgMHhlMywgMHhhYiwgMHg4YywgMHhkNywgMHg0YSwKKyAgMHhiNywgMHg2NCwgMHg2MCwgMHhhZSwgMHg4OSwgMHg3ZSwgMHhhZCwgMHhiOCwgMHhlNCwgMHgxNSwgMHhlZSwgMHhkNywKKyAgMHg5ZSwgMHgzZiwgMHgzOSwgMHhjMCwgMHg0MSwgMHg2MywgMHhiNSwgMHhiOSwgMHgyOSwgMHg3MiwgMHhiNCwgMHhkYiwKKyAgMHgwYSwgMHhmYiwgMHhkNCwgMHhlOCwgMHhlNCwgMHhjOCwgMHg1NSwgMHhiNywgMHhkYywgMHgxNiwgMHg2NywgMHgwOSwKKyAgMHgxZCwgMHgzYiwgMHg3YywgMHg0MywgMHg1YiwgMHgzMCwgMHg2MiwgMHg0NywgMHgxOSwgMHg0OSwgMHgxMSwgMHg4NywKKyAgMHgyNCwgMHg4ZCwgMHg2OCwgMHg4MywgMHhiNCwgMHg0OCwgMHg5MiwgMHgwNSwgMHhkNSwgMHg3MSwgMHhlZSwgMHhiMSwKKyAgMHhhYiwgMHhjNywgMHhjZiwgMHhiNiwgMHg3MSwgMHhhMiwgMHhiYiwgMHhlMiwgMHg0NSwgMHhhNiwgMHgxMiwgMHg2YywKKyAgMHgwOSwgMHhlNCwgMHg4YSwgMHg4OSwgMHhhNSwgMHg4YiwgMHg3NSwgMHg0OSwgMHgyOCwgMHg4YywgMHg0MCwgMHg2MCwKKyAgMHg5YSwgMHgyYiwgMHg2OCwgMHgxNiwgMHg1MCwgMHhkMSwgMHg0ZiwgMHg0NSwgMHhlMSwgMHgwMSwgMHgxOCwgMHg5YiwKKyAgMHhlMSwgMHg4ZSwgMHg1MCwgMHhmNSwgMHgyOCwgMHhlNSwgMHg0NiwgMHgxYSwgMHgxNywgMHhiYiwgMHhmMSwgMHhiMiwKKyAgMHhmMywgMHg4ZCwgMHhhOCwgMHg0YywgMHg0YSwgMHhjNSwgMHhhMSwgMHg0MCwgMHg1MSwgMHg3MiwgMHgxYiwgMHhlYiwKKyAgMHg2YSwgMHhmNCwgMHg4MywgMHhjNywgMHgwNCwgMHg4MSwgMHgzZiwgMHg2ZCwgMHhhNCwgMHhiMCwgMHg5MCwgMHhjMiwKKyAgMHhjNSwgMHgyMCwgMHgwMiwgMHg1OCwgMHhlNCwgMHhiZCwgMHg3ZCwgMHg2ZiwgMHg2NSwgMHg5MiwgMHhlMSwgMHhlNywKKyAgMHg3YywgMHgyZSwgMHg4MiwgMHg3NCwgMHg0ZCwgMHhmNSwgMHhjYiwgMHg5ZSwgMHg2MiwgMHhkMywgMHg4OSwgMHhlNywKKyAgMHgwNiwgMHg1NCwgMHgyYywgMHg4YywgMHgwOCwgMHg1YywgMHg4OSwgMHg5OSwgMHgzMCwgMHhhNywgMHhmZiwgMHgzMywKKyAgMHhmMywgMHhlNiwgMHg4MSwgMHg3NCwgMHg5NywgMHg5OSwgMHhhYiwgMHg3MCwgMHg2MywgMHhkMCwgMHg3MywgMHgxZiwKKyAgMHhlYywgMHg5MCwgMHgxMiwgMHg5YywgMHhkZiwgMHg4YSwgMHhmNCwgMHg5YSwgMHgzMywgMHhjZSwgMHhiZSwgMHg5OSwKKyAgMHgyNSwgMHhjYywgMHhlYSwgMHg3NywgMHhiNiwgMHgxNCwgMHgxMywgMHhlYywgMHg3MiwgMHhjNCwgMHg2MCwgMHg4OSwKKyAgMHgzMCwgMHg0MiwgMHhlNywgMHg4MiwgMHg1NiwgMHgzMCwgMHgxOSwgMHg4MywgMHgxNSwgMHhmNiwgMHhkZSwgMHg1NSwKKyAgMHgyMCwgMHhmNSwgMHg3YiwgMHhjMCwgMHhhMiwgMHhlZSwgMHgxZSwgMHgyOSwgMHhkYiwgMHhlNywgMHg4NywgMHg5MCwKKyAgMHg3YywgMHhkOCwgMHhhYiwgMHhlYywgMHg5OSwgMHg3NCwgMHgwNCwgMHhiZSwgMHgyYywgMHgwOCwgMHg5NSwgMHgxMCwKKyAgMHgwMCwgMHg5OCwgMHhlOSwgMHgxOCwgMHgxYywgMHg2MywgMHgyZSwgMHgwNiwgMHgxNywgMHg0MywgMHhiZSwgMHhhZCwKKyAgMHgxZSwgMHg3YiwgMHhhZiwgMHg1MCwgMHhhMCwgMHhjMCwgMHhhZSwgMHg5NiwgMHhiZCwgMHg0OCwgMHgzMiwgMHhiMywKKyAgMHhjMSwgMHg1YywgMHhiOSwgMHgyMiwgMHgzOCwgMHhhMCwgMHhhYywgMHgxMSwgMHg1MywgMHhhMSwgMHhlMiwgMHgwMiwKKyAgMHhjNSwgMHg2YiwgMHgzNiwgMHhhYSwgMHhhYywgMHg2MCwgMHhkMiwgMHg0NSwgMHgxOSwgMHg1NywgMHgzZSwgMHg5NywKKyAgMHgzMiwgMHg0NywgMHhkYSwgMHgzZSwgMHg3NCwgMHgxMSwgMHg3YywgMHgyOCwgMHhiZSwgMHhjNSwgMHgzOCwgMHhlOSwKKyAgMHhkNCwgMHg5ZiwgMHhmOSwgMHhiNSwgMHg1MSwgMHg1YywgMHgxYiwgMHg2YSwgMHg5YiwgMHgwNSwgMHg2NSwgMHg5NywKKyAgMHg1NiwgMHgxZCwgMHhmMSwgMHhmNiwgMHg1MywgMHg1OCwgMHg3NywgMHgyYywgMHhhMiwgMHg1MCwgMHhhOSwgMHhmMCwKKyAgMHhhMywgMHg4NywgMHgzZiwgMHg1ZSwgMHhkYywgMHg0OSwgMHg4MSwgMHhjMCwgMHgyMSwgMHgyYSwgMHg4ZSwgMHg4MCwKKyAgMHgwNCwgMHgwMCwgMHgwMCwgMHgxZiwgMHgzYiwgMHg2NiwgMHhhNywgMHgzMCwgMHg5MCwgMHg2MywgMHgxNSwgMHhjMSwKKyAgMHgzMiwgMHgxOCwgMHgwZSwgMHgxMSwgMHhhZCwgMHgzNCwgMHhiMiwgMHg1MCwgMHhiOCwgMHg2YywgMHgwZSwgMHg0NywKKyAgMHg5YiwgMHhmZSwgMHgzNywgMHhjNSwgMHg2ZCwgMHgwMCwgMHgxMywgMHgxOCwgMHgzMSwgMHhjNCwgMHhiOCwgMHgyYywKKyAgMHgyMywgMHg1ZCwgMHg2ZCwgMHgwOCwgMHg2ZiwgMHg2NSwgMHhjMiwgMHhkMSwgMHhmMCwgMHg3OSwgMHgwOCwgMHhmYywKKyAgMHhlZCwgMHhiYywgMHg3YywgMHg3NSwgMHg4MiwgMHg4OSwgMHg0YywgMHg2YywgMHg4ZCwgMHg3MCwgMHgwOSwgMHhlNywKKyAgMHhlNCwgMHg5MSwgMHg1OCwgMHg5NywgMHg5YiwgMHg2MywgMHg2OSwgMHhiYiwgMHg1MiwgMHhkYSwgMHgwZSwgMHhjOCwKKyAgMHhmYSwgMHg1YywgMHhlZSwgMHgxOSwgMHgyYywgMHgwYSwgMHg3NSwgMHhjMSwgMHhjMywgMHgwMCwgMHg0NCwgMHg2NCwKKyAgMHg2YywgMHhhOSwgMHg3OCwgMHg0YSwgMHgxYiwgMHhlNCwgMHhjNCwgMHhhZiwgMHgyMywgMHgwYywgMHhiMiwgMHhiYSwKKyAgMHg4NCwgMHg0NiwgMHhlMywgMHgwOCwgMHg5NywgMHg4NiwgMHg1NSwgMHgxMCwgMHg3NiwgMHhjNCwgMHhjNiwgMHhiMSwKKyAgMHg0NCwgMHgzMSwgMHhiZSwgMHg4YiwgMHg0NCwgMHhhYiwgMHhkNywgMHg4YSwgMHg5NSwgMHhiNiwgMHg0NSwgMHg0NSwKKyAgMHgyOSwgMHgwOCwgMHg1NiwgMHhlZSwgMHgwOCwgMHgwNSwgMHg2ZiwgMHg5MCwgMHg4OCwgMHgwNCwgMHhlMiwgMHgwMywKKyAgMHgzYywgMHgzZCwgMHhkYywgMHg0OCwgMHg0OCwgMHgxMiwgMHgwYSwgMHhiMywgMHg2YiwgMHg0NCwgMHg5MiwgMHhkNCwKKyAgMHg5YywgMHhjZSwgMHg5OCwgMHgyNywgMHhlNSwgMHhhMywgMHg5MCwgMHgzMSwgMHhkYiwgMHg3OCwgMHhkMiwgMHgyMCwKKyAgMHg2YiwgMHhmOCwgMHhiNiwgMHg1ZiwgMHg1ZiwgMHg2YSwgMHg2NiwgMHhkMCwgMHhiNSwgMHgwMCwgMHgxMywgMHg5NywKKyAgMHgwOCwgMHgzMywgMHgwZCwgMHgwYSwgMHgyYywgMHgyYSwgMHg5OCwgMHg2NSwgMHgyZCwgMHgxMywgMHg1YiwgMHg0YywKKyAgMHhkNywgMHgwNiwgMHg2YSwgMHhhYywgMHgxYSwgMHgyNywgMHg5OCwgMHhkMCwgMHhhMywgMHhkOCwgMHg1YywgMHhiNiwKKyAgMHgwZSwgMHgxYywgMHhmNCwgMHhiNywgMHgxNywgMHhmYiwgMHhhNSwgMHgxMiwgMHg4ZSwgMHgwNywgMHgzYiwgMHgzZSwKKyAgMHg1MiwgMHgwNiwgMHgzZCwgMHgyZSwgMHgwNCwgMHgxZSwgMHg5YSwgMHhiYywgMHgyMywgMHgxYywgMHgyNywgMHhhZSwKKyAgMHg3NiwgMHgyZCwgMHg2NCwgMHgwYywgMHhmOSwgMHg3NSwgMHgwZSwgMHg5OSwgMHhhNywgMHhhZSwgMHg5MSwgMHg2ZCwKKyAgMHhiYywgMHg1NiwgMHhmYSwgMHg1MCwgMHhlMywgMHg1OSwgMHg4YiwgMHg0MywgMHg0NiwgMHhiOSwgMHg3YiwgMHg1OSwKKyAgMHhmNSwgMHgzNSwgMHgyZiwgMHhhOCwgMHgzYiwgMHhhZCwgMHgzNywgMHg3NCwgMHgzYSwgMHgyNSwgMHgzNCwgMHhmNywKKyAgMHg1YSwgMHgxNCwgMHhmNiwgMHhiMiwgMHhlZCwgMHhiMSwgMHgyYywgMHgxYSwgMHhlZSwgMHgyOSwgMHhjOCwgMHhmYywKKyAgMHg5YSwgMHg0ZCwgMHg2NSwgMHhkNSwgMHgyOSwgMHg1NywgMHgwMCwgMHg2NywgMHg4NywgMHgzMiwgMHg2ZiwgMHhmNiwKKyAgMHg0YSwgMHhkYSwgMHg4MiwgMHg1YywgMHg2YywgMHhlOSwgMHgxMywgMHhlOCwgMHgyZiwgMHgxZCwgMHgyNSwgMHhjYSwKKyAgMHg5YSwgMHhjOSwgMHgwZCwgMHg1OSwgMHg4NSwgMHhlNiwgMHhhNiwgMHg5NCwgMHhiMiwgMHhhNiwgMHg5OSwgMHg4YSwKKyAgMHgyYywgMHhhYiwgMHg2OCwgMHhjMywgMHhiNSwgMHgzYywgMHg2YiwgMHhhYiwgMHhjYywgMHhlOSwgMHhmNCwgMHgyOSwKKyAgMHgyOCwgMHhlMCwgMHhjYSwgMHhhYiwgMHg1ZiwgMHgzYSwgMHg2ZiwgMHhhNSwgMHhjZSwgMHhkNSwgMHhmOSwgMHhjYSwKKyAgMHgzYywgMHhiYywgMHg5OSwgMHhiMSwgMHg3ZCwgMHgzNSwgMHhkNiwgMHgxYiwgMHgwOCwgMHgzYywgMHhkMiwgMHg4MiwKKyAgMHhjMywgMHgyMCwgMHhlNiwgMHgwYiwgMHgwYSwgMHhkYSwgMHhmMCwgMHhkYSwgMHhmYSwgMHhjNiwgMHhhNCwgMHgyYywKKyAgMHgwMywgMHg2OCwgMHgwYSwgMHgwYiwgMHgwYiwgMHgwMSwgMHg0OSwgMHhkMiwgMHg0YiwgMHhjMSwgMHhhMiwgMHg3MSwKKyAgMHg1YSwgMHhkOCwgMHgwMCwgMHg3MCwgMHgyMSwgMHg0YywgMHgzNiwgMHg4MCwgMHgwYywgMHhhMCwgMHhkZiwgMHhiZiwKKyAgMHhmZiwgMHhjYSwgMHhkNSwgMHg0NCwgMHgzNiwgMHhhMywgMHgzMywgMHhiNywgMHgyMSwgMHgyMiwgMHgxNiwgMHgwNiwKKyAgMHhlYywgMHgyNCwgMHgyMiwgMHhjMCwgMHg4NywgMHg5ZCwgMHg3YywgMHgxOCwgMHg3ZiwgMHg3NSwgMHg0YiwgMHhlOCwKKyAgMHhmYSwgMHhjNywgMHg1ZiwgMHhkZCwgMHgyYSwgMHg2OSwgMHhhMSwgMHhlMCwgMHgyZSwgMHhjMCwgMHg3YywgMHhlZiwKKyAgMHg3MCwgMHg1YywgMHhmYywgMHhhYSwgMHhiNywgMHhhMiwgMHg3MCwgMHgzMiwgMHhmZSwgMHhmZCwgMHg5MCwgMHgzYywKKyAgMHhiOSwgMHgxMCwgMHg4MiwgMHg1NCwgMHhiMSwgMHhjYywgMHg3NiwgMHg0ZCwgMHhiOSwgMHhjMSwgMHhlNiwgMHgyOCwKKyAgMHg2NywgMHhjNiwgMHg4NiwgMHg5NSwgMHgzYiwgMHhmZiwgMHhkYywgMHg5MSwgMHg0MywgMHg5ZSwgMHg0ZCwgMHgzZSwKKyAgMHhiMywgMHhlMiwgMHgxNywgMHgyZSwgMHgzYiwgMHgyYiwgMHhjOSwgMHgyZSwgMHgwYywgMHhlOCwgMHg2YiwgMHhjZiwKKyAgMHhlZiwgMHgyYSwgMHg0ZCwgMHg5YywgMHg0MSwgMHg1NiwgMHhkYSwgMHhhYiwgMHhlMCwgMHg1ZiwgMHhkZCwgMHg5OSwKKyAgMHg0NywgMHhhYSwgMHg3MCwgMHhlZiwgMHg2MiwgMHg5ZCwgMHg4OCwgMHg5ZiwgMHgyNywgMHg5MSwgMHhkMiwgMHhkZCwKKyAgMHg5OCwgMHhiNCwgMHg3YSwgMHgzOCwgMHhmMSwgMHg1OSwgMHg0ZSwgMHgzYiwgMHhkZiwgMHhlYSwgMHhjYywgMHg3YiwKKyAgMHgwZCwgMHgxYywgMHg5MCwgMHgwMiwgMHhmYiwgMHhmYiwgMHgzNywgMHg0MywgMHhmZCwgMHg1NSwgMHgyOCwgMHgwMiwKKyAgMHhiZiwgMHgwZSwgMHg0NSwgMHgwYiwgMHgyNywgMHhkNCwgMHg3OSwgMHhjMCwgMHhhNiwgMHg0ZiwgMHhlZCwgMHg2YywKKyAgMHhiNywgMHg0MywgMHg1ZSwgMHg2MCwgMHg2OCwgMHgxZiwgMHgzYSwgMHg1YSwgMHhjMSwgMHhmOSwgMHhkOCwgMHhiNSwKKyAgMHg5YywgMHg3ZCwgMHgzNSwgMHhiNSwgMHhiYiwgMHg3YiwgMHgxNywgMHhlYywgMHg0ZSwgMHhkZiwgMHg4NiwgMHhmMSwKKyAgMHg1ZiwgMHg0NSwgMHg0MywgMHg1YSwgMHhiYiwgMHg0YiwgMHhhMSwgMHgxMywgMHhkMSwgMHg2MCwgMHg2MCwgMHhkZSwKKyAgMHg3YSwgMHhjZCwgMHhjMCwgMHhkYSwgMHhiYywgMHhhNCwgMHgzNiwgMHhjNCwgMHgxMSwgMHg4NiwgMHhlYSwgMHg3OCwKKyAgMHg0YywgMHg2NywgMHg4ZiwgMHgyZSwgMHgzNSwgMHgxMSwgMHhjNCwgMHg4OCwgMHg4MiwgMHg2NCwgMHhhNCwgMHgyMiwKKyAgMHhkOSwgMHhjOSwgMHg5YSwgMHg2NywgMHg3MywgMHhhNSwgMHgyNiwgMHhmNSwgMHgzYiwgMHgyNiwgMHhiNSwgMHgyNCwKKyAgMHgxZiwgMHg2ZiwgMHg2NCwgMHhhMywgMHhiOCwgMHg1MCwgMHg5OCwgMHgyNSwgMHhlZiwgMHgwZSwgMHhiYSwgMHgwNSwKKyAgMHgxMCwgMHhjYiwgMHg1NCwgMHg5MCwgMHg4YywgMHgwNywgMHg2NiwgMHg5YiwgMHgxMSwgMHgyMSwgMHg4NCwgMHg5NiwKKyAgMHgzYywgMHhiZSwgMHgzZiwgMHhhMCwgMHg0ZSwgMHgxNywgMHhhZSwgMHhiZiwgMHhiNSwgMHgxNSwgMHg3YSwgMHg1ZiwKKyAgMHg2YSwgMHhhYiwgMHgzNCwgMHhkNCwgMHg3MywgMHgwMCwgMHg3MSwgMHhjYywgMHhmMCwgMHg2NSwgMHg0NCwgMHhmYiwKKyAgMHhiMywgMHg4NywgMHg2OSwgMHhlZSwgMHg4ZiwgMHg0OCwgMHg4YiwgMHgzMiwgMHg0MiwgMHgyOSwgMHhkMSwgMHgzNSwKKyAgMHg3NSwgMHhhYSwgMHhhNywgMHhiYiwgMHg0MiwgMHhjMiwgMHhlNywgMHg0YywgMHg0NywgMHg3MiwgMHg4MywgMHhlYSwKKyAgMHgzNiwgMHhjZCwgMHgwOCwgMHg5OCwgMHhhYSwgMHg3MCwgMHg3NywgMHhmYSwgMHhjZSwgMHhjZSwgMHhhOSwgMHhjNywKKyAgMHg3MCwgMHg1NiwgMHg1NywgMHhmYywgMHhiYiwgMHg4OCwgMHg5MiwgMHg1NywgMHg0MiwgMHhiYSwgMHhhYSwgMHgzMiwKKyAgMHg1YywgMHg3ZSwgMHg5ZCwgMHhiOCwgMHgyOCwgMHhhMSwgMHgzYSwgMHgzZSwgMHgyMiwgMHhiMiwgMHgxNSwgMHhhZCwKKyAgMHgwNSwgMHgyMiwgMHhiZSwgMHg1ZSwgMHhmZCwgMHg1ZCwgMHhlYSwgMHhhZiwgMHgyNSwgMHg2ZCwgMHgwZCwgMHg5ZCwKKyAgMHgzMSwgMHhkYSwgMHg3NywgMHhjYywgMHgwZSwgMHhjMCwgMHg3OSwgMHhjMCwgMHgwZCwgMHg1MywgMHg0NiwgMHgxNSwKKyAgMHg3MCwgMHg3OCwgMHg1ZCwgMHgzYiwgMHgxMCwgMHhkNiwgMHg1NCwgMHg0OCwgMHhiOSwgMHgyMSwgMHg3NSwgMHgxZSwKKyAgMHg3OSwgMHhhZiwgMHg4YSwgMHgxOSwgMHgzYywgMHgwYywgMHgzMywgMHgyYywgMHhlNSwgMHg2OCwgMHgxYSwgMHhlMSwKKyAgMHhkNSwgMHg0MywgMHg1NiwgMHhiYiwgMHg0YiwgMHg1YywgMHgxOSwgMHg4YSwgMHhmMCwgMHgyMSwgMHg3YSwgMHg4ZCwKKyAgMHg4OCwgMHgwNSwgMHgzZiwgMHg0MSwgMHhiZiwgMHgzOSwgMHg2OCwgMHg4NiwgMHhhMSwgMHg0NiwgMHgwNywgMHgzYywKKyAgMHgxOSwgMHg5MiwgMHgyYSwgMHgxNCwgMHhjYiwgMHhiYiwgMHhjZCwgMHgxMiwgMHhiYSwgMHg5NywgMHhkMywgMHg5MSwKKyAgMHhhOCwgMHg0MywgMHg1OSwgMHg1MiwgMHhiOCwgMHgzZiwgMHhmMCwgMHgzYSwgMHgwMywgMHg1OCwgMHhlOCwgMHg1ZiwKKyAgMHhkNCwgMHgyZiwgMHhiYywgMHgzYywgMHg0NywgMHgwZiwgMHg5MiwgMHhmMywgMHgyZiwgMHgzNywgMHhlMSwgMHhmYSwKKyAgMHhlYiwgMHg0NCwgMHhkMiwgMHhkMiwgMHgyZSwgMHg5OSwgMHg1NywgMHg2NywgMHg0OSwgMHhiYiwgMHhjNywgMHhkNSwKKyAgMHgyYiwgMHhmNCwgMHg4ZCwgMHhiMCwgMHg5MiwgMHhkNiwgMHgxYywgMHgwOSwgMHg4YSwgMHg0NSwgMHgzYSwgMHhmNiwKKyAgMHg2ZSwgMHg2MCwgMHhkNiwgMHhlZiwgMHhjZSwgMHhkZSwgMHg2NywgMHg4OCwgMHgzYywgMHgyMSwgMHhkYiwgMHg2NiwKKyAgMHgwMCwgMHg4OCwgMHg1ZSwgMHg4OSwgMHgyMiwgMHhlYiwgMHg2NCwgMHg5YywgMHg0NSwgMHg5OSwgMHg0OCwgMHgxYywKKyAgMHhhNCwgMHgwMiwgMHgzOCwgMHhlZiwgMHg0MiwgMHgwMCwgMHg3NywgMHgxYSwgMHhkNCwgMHg5NywgMHhhZiwgMHg3YiwKKyAgMHgwMCwgMHhmMywgMHhlOSwgMHgzZCwgMHhkZSwgMHgyYiwgMHg2OSwgMHgwMiwgMHhiZiwgMHg2YSwgMHhmMCwgMHg0OSwKKyAgMHhiMywgMHg1ZiwgMHhiZiwgMHhjMywgMHhmOCwgMHgwZCwgMHgyMCwgMHg4MSwgMHgwOSwgMHgzZiwgMHg1YiwgMHg0YSwKKyAgMHgyMSwgMHhhNywgMHg1NSwgMHg2NiwgMHhiZiwgMHhhYSwgMHg3MywgMHgwNywgMHgzZCwgMHgyMCwgMHhiZCwgMHhhOSwKKyAgMHhiNSwgMHhhNiwgMHhmYiwgMHg0MCwgMHgzYiwgMHg4YSwgMHg3MCwgMHhiYywgMHg2OCwgMHhiYiwgMHg0NSwgMHg0YiwKKyAgMHhkOCwgMHhkYSwgMHhiNCwgMHg5MywgMHhiOCwgMHhhMSwgMHgzOSwgMHg5YywgMHhlOSwgMHg0NCwgMHgxYiwgMHhjMCwKKyAgMHgzOSwgMHgyNCwgMHg0ZCwgMHgyZCwgMHg3MywgMHgwZCwgMHg1ZiwgMHhjMCwgMHgxMywgMHhiNiwgMHhlYSwgMHgzYSwKKyAgMHgwNCwgMHg0YSwgMHg4NywgMHgxNCwgMHgyYywgMHhlZCwgMHhjZiwgMHgxYiwgMHg5MiwgMHgzNywgMHhjMiwgMHhhMiwKKyAgMHhlNCwgMHgxNiwgMHhmNiwgMHgyZSwgMHgyZiwgMHg2YiwgMHg5NywgMHgyOCwgMHgwNywgMHg3MCwgMHg0MSwgMHhlMywKKyAgMHhkYiwgMHg5ZSwgMHgwOSwgMHg3OSwgMHhiOCwgMHhhZCwgMHgxMywgMHhlNiwgMHhhZSwgMHgzMywgMHhmNCwgMHg1NCwKKyAgMHhmNywgMHgwMywgMHg4OSwgMHgyNSwgMHg0MiwgMHgwZiwgMHhmYSwgMHg0NSwgMHgzYywgMHg1YSwgMHhmMiwgMHg2YSwKKyAgMHg5ZSwgMHhmMiwgMHhkNCwgMHgwYSwgMHhmNiwgMHhkMywgMHgxMSwgMHg5ZSwgMHg0MiwgMHgwZiwgMHg2MiwgMHhkMiwKKyAgMHhmZSwgMHg2OSwgMHhmYSwgMHg3ZSwgMHg1NywgMHhlNCwgMHgyZiwgMHgxOSwgMHhjNiwgMHgzZiwgMHg1ZCwgMHhhYiwKKyAgMHhkZiwgMHg1OSwgMHhmMSwgMHg5OSwgMHg3YiwgMHhkZCwgMHg3YiwgMHgwNiwgMHg1ZSwgMHhiZCwgMHhmMiwgMHhiZiwKKyAgMHgxZSwgMHhhNSwgMHhlZiwgMHg2NiwgMHg1YSwgMHg5NSwgMHhkNCwgMHg0MiwgMHgwMSwgMHgzYiwgMHg2YywgMHhkNSwKKyAgMHgwZCwgMHg1MiwgMHg0YiwgMHhhOSwgMHhiMywgMHg3OCwgMHg4ZiwgMHg1MSwgMHhhMiwgMHgxOSwgMHhkYSwgMHg3OCwKKyAgMHhiZCwgMHg0MCwgMHg0MSwgMHhjNCwgMHhiNywgMHhmMSwgMHhmZSwgMHhmNCwgMHgzNiwgMHg1MywgMHhkNywgMHgwOCwKKyAgMHg4OCwgMHhkMSwgMHhhYywgMHhmNywgMHhjMCwgMHhkZSwgMHg4ZCwgMHhiMiwgMHg4NywgMHhjNSwgMHg4MCwgMHg5YywKKyAgMHgzMCwgMHg1YiwgMHhlMCwgMHgyNSwgMHhhMSwgMHgxNiwgMHhhMSwgMHgzMSwgMHg1YSwgMHg3OSwgMHgyYSwgMHhiZiwKKyAgMHg3YSwgMHhhMSwgMHg0MiwgMHg0YywgMHg2MCwgMHgxNCwgMHg5YSwgMHhhZiwgMHg5MiwgMHgyZSwgMHhhNSwgMHg0YywKKyAgMHgzMywgMHhhZCwgMHg4YywgMHhlMywgMHhhNywgMHhjMCwgMHg3NywgMHgwZiwgMHg3OSwgMHgxMSwgMHg1MiwgMHg2MCwKKyAgMHhhNCwgMHg4YSwgMHgwYiwgMHg0ZCwgMHg2OCwgMHgwYiwgMHgzZiwgMHhjZSwgMHhiZiwgMHg3NywgMHg1ZiwgMHgxMywKKyAgMHg1ZiwgMHg1YywgMHg4MiwgMHg0NCwgMHhiOSwgMHg1YSwgMHg0ZSwgMHgxMiwgMHhiMiwgMHgyOSwgMHg1YSwgMHhhMCwKKyAgMHg1MiwgMHg4MywgMHg2MSwgMHg2MCwgMHhlMCwgMHgyMSwgMHgxYSwgMHg4ZiwgMHhmMCwgMHgwMCwgMHgxZiwgMHg2NywKKyAgMHg4YiwgMHgzOSwgMHg2OSwgMHg4NiwgMHhhOSwgMHg0ZCwgMHhlNSwgMHg1NiwgMHg4NCwgMHgyYiwgMHgwNiwgMHhmNSwKKyAgMHhhMSwgMHgxMSwgMHg2YiwgMHg5ZSwgMHhkNSwgMHg5OCwgMHgyNywgMHg5YSwgMHgwMywgMHhiMywgMHgwZSwgMHg4OCwKKyAgMHg0MCwgMHg3OSwgMHg2ZSwgMHhlMiwgMHhiOSwgMHg5NywgMHg3OSwgMHgyZCwgMHg4ZSwgMHg2NSwgMHg2ZiwgMHhkNSwKKyAgMHhmNCwgMHgwMywgMHhjYywgMHgxYiwgMHg1YSwgMHhjNiwgMHhiNiwgMHg0NiwgMHhhMywgMHg1ZCwgMHg0YSwgMHhjZiwKKyAgMHg2MywgMHg1OCwgMHg4ZCwgMHg3NywgMHg0OSwgMHgzNSwgMHhlOCwgMHgyMCwgMHg5NywgMHgyMCwgMHg4OCwgMHhmYiwKKyAgMHhhNiwgMHg5MywgMHhkYiwgMHgyMCwgMHg1ZSwgMHhhYSwgMHgyNSwgMHhjYywgMHg2OSwgMHg3ZCwgMHg1YSwgMHgwMSwKKyAgMHhkMiwgMHgxYSwgMHgwZCwgMHhjMSwgMHgxNCwgMHhiZiwgMHg0OSwgMHhmMiwgMHhiNCwgMHg0MywgMHg0MiwgMHhiZSwKKyAgMHgzMSwgMHgxNCwgMHhjNCwgMHhhOSwgMHhhYiwgMHg0YywgMHhhMCwgMHg5ZiwgMHg0NiwgMHg4YSwgMHg5ZSwgMHgzMywKKyAgMHg4ZCwgMHg3YiwgMHhlOSwgMHhhNywgMHg0MywgMHg4ZiwgMHgyNywgMHgxNiwgMHhmYiwgMHg2MSwgMHhkNywgMHg1MywKKyAgMHg4YywgMHhlYiwgMHgxZCwgMHgwZiwgMHgyOCwgMHhkNiwgMHhjZiwgMHgzZSwgMHg5YywgMHhmYywgMHhhYywgMHg5YywKKyAgMHhmMywgMHhhZCwgMHhlMiwgMHg5YiwgMHg5YiwgMHhkOSwgMHhkNywgMHhkNiwgMHg2YiwgMHg5MCwgMHg1NywgMHg0MSwKKyAgMHg0ZCwgMHgzMiwgMHgwMCwgMHhiZiwgMHgzZSwgMHg0MiwgMHg4MSwgMHg1NiwgMHgzNCwgMHhiOSwgMHg3OSwgMHgyYiwKKyAgMHhiOCwgMHhkMCwgMHhkNywgMHhjMSwgMHhiMiwgMHgyZSwgMHhiYiwgMHhiNiwgMHgyNSwgMHg4MywgMHhiZCwgMHhkOCwKKyAgMHg0NiwgMHgxNywgMHg4ZCwgMHhjYywgMHhhMCwgMHhiMCwgMHgyYSwgMHgwMSwgMHg0MSwgMHgxMSwgMHhhNSwgMHgxMSwKKyAgMHgxNCwgMHg0ZCwgMHg3MiwgMHg5MCwgMHhjOCwgMHgwNCwgMHhmNCwgMHgxZSwgMHhjZiwgMHg0OCwgMHgxMiwgMHhhMCwKKyAgMHg0NCwgMHg0OCwgMHgxMSwgMHg1YiwgMHg0YSwgMHhlNywgMHg4MywgMHhkMiwgMHg0YiwgMHgxOSwgMHg3NiwgMHg0ZSwKKyAgMHgwMywgMHg1NywgMHg3NCwgMHhkNSwgMHg5OCwgMHg3OSwgMHhkOCwgMHgxOSwgMHgwOCwgMHgyYiwgMHhmYywgMHhiYSwKKyAgMHg1NiwgMHgzZiwgMHhhYiwgMHg3NywgMHhhNywgMHg3YywgMHgxOSwgMHhmZSwgMHgxOSwgMHgyOCwgMHgxMSwgMHhiYywKKyAgMHg0NywgMHgyZCwgMHhmYywgMHhhZSwgMHg4MSwgMHg5MiwgMHg5ZCwgMHgzMywgMHhjOSwgMHhmNywgMHhjNiwgMHg1MSwKKyAgMHg5YiwgMHgzNCwgMHhlNywgMHg3YywgMHg2YSwgMHhlNCwgMHhkOSwgMHhkZiwgMHg2NywgMHhjMCwgMHgwMSwgMHhjNSwKKyAgMHhjNCwgMHg5NiwgMHgwYSwgMHg5MSwgMHhiZSwgMHhjNywgMHhlNCwgMHhmNCwgMHg4ZSwgMHhjNywgMHgyNywgMHhjMywKKyAgMHg1OSwgMHgyYiwgMHhiMCwgMHg3MSwgMHhmYSwgMHhiZSwgMHg2NSwgMHg2NCwgMHhiYiwgMHhjYiwgMHgzNSwgMHgyZCwKKyAgMHgzMywgMHgxYywgMHhkMiwgMHgyNiwgMHhmNCwgMHhmYSwgMHhkNSwgMHg4NywgMHhhMiwgMHg1MSwgMHgxYSwgMHhhOSwKKyAgMHhjNywgMHhjYywgMHg1NCwgMHg4MywgMHhiMSwgMHg2YywgMHhjNCwgMHgwNCwgMHhhYiwgMHg5ZiwgMHgwOSwgMHhmZSwKKyAgMHg4NiwgMHg1MSwgMHhiZiwgMHhlNSwgMHhkNywgMHhkZCwgMHgxZSwgMHgxNCwgMHhmZiwgMHhhYSwgMHhkMiwgMHhkNCwKKyAgMHg1OCwgMHgwOSwgMHg4NCwgMHg5MywgMHhmMSwgMHg2ZCwgMHg3MywgMHg1ZiwgMHhhYSwgMHgzNywgMHgxMiwgMHhjYSwKKyAgMHgxNiwgMHg5NCwgMHgwMCwgMHgwNiwgMHg3ZiwgMHhkZCwgMHgwYywgMHg2YSwgMHgwYywgMHgxMiwgMHhkYiwgMHhhNiwKKyAgMHhjYywgMHhiNSwgMHhlZiwgMHgzNCwgMHg1MywgMHg5MiwgMHg2NSwgMHg3OSwgMHhkNywgMHgyZCwgMHg2MCwgMHgwYywKKyAgMHhmNywgMHhjYiwgMHgwYywgMHgyMCwgMHgxMywgMHhlMywgMHhhZiwgMHg2YSwgMHg5ZSwgMHg0YiwgMHhjZiwgMHhkZiwKKyAgMHg5NiwgMHhmMiwgMHhkNCwgMHg4MiwgMHhiZiwgMHhlNiwgMHhmYiwgMHg4OCwgMHgxNCwgMHg0NiwgMHhkNSwgMHg5NCwKKyAgMHg3YywgMHg5ZCwgMHhkMiwgMHgxMSwgMHgwMSwgMHhjMCwgMHgyMSwgMHgxYSwgMHg5NCwgMHhlZCwgMHhiYSwgMHg5OCwKKyAgMHhjMywgMHgzMiwgMHhhMCwgMHg4NCwgMHhjYiwgMHhhNCwgMHgyMCwgMHgyYiwgMHgyZCwgMHgxYywgMHgxOSwgMHhjMSwKKyAgMHg2MiwgMHhlOCwgMHgyNiwgMHhhYywgMHgwOSwgMHhhZCwgMHg0YSwgMHgwZCwgMHhkNywgMHhhZCwgMHhmZSwgMHhiZiwKKyAgMHgzNSwgMHg4ZiwgMHhiNSwgMHg0NywgMHg1MiwgMHg3OSwgMHg5NiwgMHhhZCwgMHhlMywgMHhhNiwgMHhlMiwgMHg4ZiwKKyAgMHgzOSwgMHhmYiwgMHg2ZSwgMHhjNSwgMHg3MiwgMHhmNiwgMHgxNCwgMHhkNiwgMHg5MiwgMHg3NiwgMHg5ZCwgMHg4NSwKKyAgMHhlNiwgMHhkOSwgMHhjNCwgMHhlNywgMHgwOCwgMHhkYiwgMHg3NSwgMHhiNywgMHgwMywgMHg0YSwgMHgzNSwgMHg4MywKKyAgMHg0ZSwgMHg1ZiwgMHgxOCwgMHhmOCwgMHgxNSwgMHgwYywgMHhiZiwgMHg5NSwgMHg0ZSwgMHgzNiwgMHg3ZSwgMHhhYSwKKyAgMHg2MSwgMHg3YiwgMHhmMywgMHhlNywgMHhjNiwgMHhjNywgMHg1NiwgMHgzNiwgMHg0YywgMHhiOSwgMHhlZiwgMHg3NywKKyAgMHhiYSwgMHg5OSwgMHg1YywgMHg5ZSwgMHhhYywgMHhmMywgMHhiYywgMHhhMiwgMHhmYiwgMHhkOCwgMHg1OSwgMHg2YywKKyAgMHg1YSwgMHgwNSwgMHg1MiwgMHhiZiwgMHgzMywgMHg0OCwgMHhkNSwgMHhmMywgMHg5NywgMHg4NiwgMHhmZCwgMHhkNywKKyAgMHgxNSwgMHg1YiwgMHhlNSwgMHhlNiwgMHgwNCwgMHgwNCwgMHhmMSwgMHg4ZCwgMHhhMywgMHgxMCwgMHgwMSwgMHhiYSwKKyAgMHhhNywgMHhhMywgMHgxYiwgMHg0YiwgMHg2ZSwgMHhhZSwgMHhhZiwgMHgyZiwgMHgwNSwgMHgwNiwgMHhkZiwgMHgyYiwKKyAgMHhkMiwgMHgxYiwgMHg4OSwgMHhjOSwgMHg4ZSwgMHhjYSwgMHgxOSwgMHgyYSwgMHhhYSwgMHhkMiwgMHg1OCwgMHg3NywKKyAgMHg0YiwgMHgyMywgMHg1YiwgMHgxYywgMHg2MSwgMHgwNCwgMHg3YSwgMHhlMSwgMHhiZCwgMHg0NywgMHg3OCwgMHhjZCwKKyAgMHg5YywgMHhmNiwgMHg1NSwgMHhmNSwgMHhhNiwgMHhiNiwgMHg2MCwgMHg5MiwgMHgyZSwgMHgyNiwgMHgwOCwgMHgxNSwKKyAgMHg4MywgMHgzMCwgMHgxNiwgMHg1MCwgMHgyMSwgMHg1YywgMHgwZiwgMHhmZCwgMHgwNiwgMHhkNSwgMHgwOCwgMHg4MCwKKyAgMHgzNCwgMHg0NCwgMHhkNSwgMHg1NiwgMHg3OSwgMHhhYSwgMHg4MiwgMHgxNiwgMHg1NywgMHg2YiwgMHgzZSwgMHgzYywKKyAgMHhmYSwgMHhlYywgMHg2MCwgMHhiZiwgMHgzNiwgMHgzOSwgMHg3OCwgMHhjNSwgMHhkYywgMHhkZCwgMHgyMywgMHhlOSwKKyAgMHg2MiwgMHg3NSwgMHg5NywgMHg3NCwgMHgwZCwgMHhlYiwgMHhlMywgMHg2OCwgMHg5OCwgMHgyZCwgMHhjMiwgMHg5NywKKyAgMHg1ZSwgMHg2OSwgMHg3MiwgMHhkMSwgMHhiMiwgMHgzMywgMHhhNywgMHg3YywgMHg3YSwgMHg1MSwgMHg5NSwgMHg0MSwKKyAgMHgzOSwgMHg0ZCwgMHhiMSwgMHg0MSwgMHhjMSwgMHgwNCwgMHgxMCwgMHgzOCwgMHg4NCwgMHgwNCwgMHgyMSwgMHgyNSwKKyAgMHhkNSwgMHg0NSwgMHg5NCwgMHhhMCwgMHg0OCwgMHhmZiwgMHg0MCwgMHgxNywgMHhjOCwgMHg2YSwgMHg3MywgMHhmYywKKyAgMHg1YywgMHg3NSwgMHg0YiwgMHgzOSwgMHg3OSwgMHg1NiwgMHhhYiwgMHhkNCwgMHgzZCwgMHg4YiwgMHhhZCwgMHg1OCwKKyAgMHhiMSwgMHhkOSwgMHg4MywgMHhmMywgMHhjYywgMHhlMSwgMHhiOSwgMHhiNiwgMHg0NSwgMHhjNSwgMHhkZCwgMHgzMSwKKyAgMHg2MywgMHhjNywgMHg0YywgMHgxYiwgMHg2NywgMHg5MSwgMHgyZSwgMHg3ZSwgMHg5ZiwgMHhhOSwgMHg0NSwgMHgyMywKKyAgMHhmMSwgMHgxYywgMHg3MiwgMHg5ZSwgMHgyMywgMHg2YSwgMHhjMywgMHgxMiwgMHg4OCwgMHg3MywgMHgyMywgMHgzMywKKyAgMHhlMCwgMHhkNiwgMHgwOCwgMHg4NiwgMHg0MCwgMHgzYSwgMHg0ZSwgMHg4ZSwgMHhjNCwgMHhiYSwgMHgzNSwgMHgyMiwKKyAgMHg3MiwgMHg5YSwgMHgyYSwgMHg1NSwgMHg1MCwgMHg1NiwgMHgwNiwgMHg0OSwgMHgyMSwgMHgzNywgMHgyYSwgMHgyNSwKKyAgMHhmNSwgMHg2MSwgMHhjMCwgMHhmZCwgMHg5ZSwgMHhlZCwgMHgxNywgMHg1YywgMHg1MSwgMHgxYywgMHg2MSwgMHhjMCwKKyAgMHgyMSwgMHgxYSwgMHg5NCwgMHhjZCwgMHhhMiwgMHg4OSwgMHg2OSwgMHhhMiwgMHhiMCwgMHhkNCwgMHg0OCwgMHg2MSwKKyAgMHgyOCwgMHg2MiwgMHgzMiwgMHhlNCwgMHg0YSwgMHg0MSwgMHhhMiwgMHgyNSwgMHg1ZCwgMHhhMCwgMHhjYiwgMHgyYywKKyAgMHgwYywgMHg0YSwgMHg4MCwgMHgyNywgMHgwNiwgMHhjMCwgMHg0NywgMHgwMSwgMHhjYywgMHg1NSwgMHgxMCwgMHg3ZCwKKyAgMHg0YSwgMHhlYSwgMHg2NiwgMHg4MCwgMHhlOSwgMHhjYSwgMHg4MSwgMHg1NCwgMHg4OSwgMHg2MiwgMHg5MSwgMHgyYSwKKyAgMHg0YywgMHgyZiwgMHgwOCwgMHhhYSwgMHhlNSwgMHgwNSwgMHgwZSwgMHg0NiwgMHg1MywgMHg1NCwgMHg1NywgMHgxOSwKKyAgMHhiOSwgMHg2NSwgMHg2MSwgMHg2NCwgMHhhZCwgMHg2MSwgMHgzOCwgMHg3MCwgMHhlZCwgMHhlZCwgMHg5NSwgMHgxYiwKKyAgMHg0NywgMHhmMCwgMHhjOCwgMHhmYiwgMHgzNywgMHgzYiwgMHhhNiwgMHgwYSwgMHg5NCwgMHg1ZCwgMHg5NywgMHgzNCwKKyAgMHg5NCwgMHhjMSwgMHg4NCwgMHhjZiwgMHgxYSwgMHhkZCwgMHhiYSwgMHg4ZSwgMHhiMCwgMHgwNCwgMHgwMywgMHg0YiwKKyAgMHhkMSwgMHg0YiwgMHg3NywgMHg1ZiwgMHhiNiwgMHg1MiwgMHhiZSwgMHhlOCwgMHg5MCwgMHhlMCwgMHg3MSwgMHhiYywKKyAgMHg4MSwgMHg4NCwgMHg2OCwgMHg1ZiwgMHg5NCwgMHhmYywgMHg0NywgMHhlNywgMHgzOSwgMHhiMywgMHg1YSwgMHg2NiwKKyAgMHg1NSwgMHgyYiwgMHg2NiwgMHhhMywgMHhhNSwgMHg3MiwgMHg3YSwgMHgxMiwgMHhlNCwgMHgyNiwgMHg1ZCwgMHhhNCwKKyAgMHg0YiwgMHgzNCwgMHhjYSwgMHhhYSwgMHgzNywgMHhiNCwgMHhjMiwgMHg4YywgMHhkMCwgMHgwYiwgMHg5YywgMHgxMywKKyAgMHg0ZiwgMHg4ZiwgMHg5ZCwgMHgxYiwgMHhkMSwgMHgzYiwgMHgzNywgMHgyMywgMHhjNywgMHhiMCwgMHg1NSwgMHg4YywKKyAgMHg5ZSwgMHg1ZSwgMHhlZCwgMHg4MSwgMHhiZSwgMHgwYSwgMHhjZCwgMHg1MCwgMHg3OSwgMHgyZCwgMHg1YSwgMHhjMCwKKyAgMHhlMCwgMHhkNywgMHg2NywgMHgxNiwgMHg5MSwgMHg5MywgMHg0YiwgMHg1NiwgMHhhNiwgMHhiOSwgMHg4MCwgMHg1ZSwKKyAgMHgyYSwgMHhhMCwgMHgyYywgMHgyYiwgMHg1NywgMHgwYiwgMHg0YSwgMHg1MSwgMHg5MSwgMHgyZCwgMHg1MywgMHg5ZSwKKyAgMHg2YywgMHg3MiwgMHhmMiwgMHhiYiwgMHhkZSwgMHg4MCwgMHgxMCwgMHgwMSwgMHg2MCwgMHgzYiwgMHgxNiwgMHgzYiwKKyAgMHg1NSwgMHg2YiwgMHhhOCwgMHhiMiwgMHgxNiwgMHhlYSwgMHg4MSwgMHgzYiwgMHg5MSwgMHg0ZCwgMHgxYywgMHgwZiwKKyAgMHg5NCwgMHhlNiwgMHg4MSwgMHhkMiwgMHg1MSwgMHg5MSwgMHg5YywgMHgxYSwgMHhkNSwgMHgwOCwgMHhkMywgMHg3NiwKKyAgMHgzZCwgMHgwNywgMHhiZiwgMHhhYiwgMHg1YywgMHhiNiwgMHgyNSwgMHgyMywgMHg5MCwgMHhmNCwgMHgyMywgMHg2NCwKKyAgMHg4ZCwgMHgxMCwgMHg5MiwgMHgxNywgMHg5MCwgMHgyMywgMHgwYiwgMHg2YiwgMHg4OCwgMHg2YSwgMHhiZCwgMHhmNywKKyAgMHgwYSwgMHg0NiwgMHg2MCwgMHg5OSwgMHhhNywgMHhiMSwgMHgyOCwgMHg0OCwgMHgxMCwgMHhhMSwgMHgyYiwgMHg3YSwKKyAgMHg0YSwgMHg5NiwgMHhkYSwgMHg1NSwgMHgxMywgMHhhZSwgMHg0NSwgMHgxNiwgMHg5MiwgMHhlYSwgMHhkMywgMHgwOSwKKyAgMHg3MiwgMHhhZiwgMHg1MCwgMHg2OCwgMHhlZiwgMHhmMiwgMHg1OCwgMHgxZCwgMHhlYSwgMHg2MCwgMHhiMCwgMHg4OSwKKyAgMHg4YiwgMHg1ZCwgMHg2MywgMHgwOSwgMHhlMiwgMHhkMywgMHg3ZiwgMHhiNSwgMHhmMSwgMHhmOCwgMHg3OSwgMHgzMywKKyAgMHg3YSwgMHgyMywgMHgwNiwgMHgyYiwgMHgyYywgMHhiZCwgMHg0NywgMHg2ZCwgMHg5MiwgMHgzNSwgMHgzMSwgMHg3NCwKKyAgMHg4YSwgMHg2OSwgMHg3NCwgMHg5NCwgMHhjNSwgMHg2OSwgMHgxMCwgMHg0NCwgMHhkMSwgMHg3MiwgMHgzNSwgMHg2MiwKKyAgMHg5NiwgMHg2ZCwgMHg5YiwgMHg3OSwgMHhmZiwgMHhkYiwgMHhmZCwgMHhmZiwgMHhkZiwgMHhmZSwgMHg2ZiwgMHhjZiwKKyAgMHhmMSwgMHhmYSwgMHgzYywgMHgzMywgMHhiOCwgMHgzMSwgMHhjMCwgMHgyMSwgMHgxYSwgMHg4ZiwgMHg3OCwgMHg0ZSwKKyAgMHgwZiwgMHhjZiwgMHhmZiwgMHgzYiwgMHg0ZiwgMHhiMCwgMHhkMSwgMHgxOCwgMHhjNCwgMHgyMSwgMHg3MiwgMHgxOSwKKyAgMHg5ZSwgMHg3MiwgMHg2NSwgMHhlNSwgMHg1NSwgMHg5MiwgMHhhMiwgMHhlNSwgMHg0OSwgMHg1YSwgMHg2YiwgMHhhZCwKKyAgMHhlMCwgMHg2OSwgMHhkNSwgMHg4NSwgMHg5MywgMHhmZSwgMHgwZiwgMHhmMiwgMHg3MywgMHg3ZiwgMHhhMiwgMHhlOSwKKyAgMHg1ZiwgMHhkMCwgMHhmYiwgMHhkZiwgMHhmZiwgMHhmYSwgMHgyOSwgMHhhZSwgMHg0NywgMHg1YiwgMHg4MywgMHhmZSwKKyAgMHhiYywgMHgzMiwgMHhmNywgMHhmYSwgMHg3NywgMHg5NiwgMHhjNywgMHhjOSwgMHhiYSwgMHhiMCwgMHhhNiwgMHg5NiwKKyAgMHg1NCwgMHg2ZCwgMHhhZSwgMHg2YSwgMHhmNSwgMHgwNiwgMHg2ZSwgMHgwNSwgMHhjNSwgMHg3NCwgMHg1YiwgMHg4OCwKKyAgMHhkNSwgMHhkOCwgMHhlZSwgMHhmMCwgMHg3NSwgMHhlMCwgMHhjYywgMHgyZSwgMHgzMSwgMHgzNSwgMHg0ZCwgMHgyNiwKKyAgMHg1YiwgMHg1MCwgMHhhMCwgMHhkNiwgMHhkZSwgMHhlZCwgMHgyYywgMHhlNSwgMHg1NSwgMHhlZSwgMHhhMiwgMHg5NCwKKyAgMHg2OSwgMHg3NywgMHhiOSwgMHg4MiwgMHhhYiwgMHg2NCwgMHgyYywgMHhlNiwgMHhkMiwgMHhmMiwgMHg1MCwgMHgwNywKKyAgMHg1MywgMHgxNCwgMHgzYywgMHhjZSwgMHgwYywgMHhhZCwgMHg4MywgMHgwOSwgMHhhYywgMHg5MywgMHhmNywgMHhkNywKKyAgMHhmNSwgMHgyZiwgMHgwZiwgMHg4ZiwgMHg5YiwgMHhiZSwgMHhjMywgMHhkYSwgMHg5MSwgMHg2MCwgMHgxNCwgMHgxMiwKKyAgMHg5OCwgMHhmZSwgMHg2MCwgMHhiYiwgMHhjOSwgMHgyOCwgMHg1MywgMHg1YiwgMHg1NywgMHhjYSwgMHgzMCwgMHhjNywKKyAgMHgxZCwgMHhiOSwgMHg3NCwgMHgyMywgMHgzOSwgMHg3OCwgMHg0MiwgMHgwMCwgMHhhNywgMHhkMywgMHg0MSwgMHg2YiwKKyAgMHhmZSwgMHhmMiwgMHg4ZSwgMHg3NywgMHgzOCwgMHg1MCwgMHg1OCwgMHgxMCwgMHhlNSwgMHhhZCwgMHhmYiwgMHhhYSwKKyAgMHhlZiwgMHg5MSwgMHgzNCwgMHhiMywgMHg1NiwgMHg5MSwgMHg5OCwgMHhhYSwgMHhmNiwgMHg5MCwgMHgxMSwgMHgwMCwKKyAgMHgxNCwgMHg0NCwgMHgzMSwgMHg3MiwgMHhkZiwgMHhiNywgMHg5NCwgMHgxOCwgMHg2ZiwgMHgwMCwgMHg5OSwgMHhhNCwKKyAgMHg1OSwgMHhkOCwgMHg3NiwgMHg0NCwgMHgwOCwgMHgxMCwgMHg4MiwgMHgwMSwgMHg0MCwgMHg5MCwgMHg4MCwgMHgyNCwKKyAgMHgxMCwgMHgxMCwgMHg5OCwgMHg0NiwgMHg0NiwgMHgzNywgMHg3YywgMHhkNywgMHhiNywgMHg2OCwgMHg4ZCwgMHg1NywKKyAgMHhjNSwgMHgzYywgMHg5YSwgMHg2OCwgMHgxNiwgMHhjZSwgMHg5OSwgMHg3MCwgMHhjNywgMHg2ZSwgMHgxOSwgMHgyZCwKKyAgMHhlMywgMHhiYywgMHhkNywgMHhhYywgMHg5ZSwgMHgyZSwgMHhhMiwgMHhhZiwgMHg2YywgMHhjMSwgMHg2MSwgMHgzZiwKKyAgMHgyZiwgMHhmMCwgMHhmNiwgMHgzOCwgMHgzZSwgMHhjNywgMHg4YiwgMHhkMywgMHg3MywgMHg3YiwgMHgyZiwgMHhhZSwKKyAgMHhjOSwgMHg4MCwgMHhmNSwgMHhjNywgMHhjMiwgMHg5MiwgMHgwNiwgMHg0MywgMHhhNCwgMHg3YywgMHg1OSwgMHgwOCwKKyAgMHg2ZCwgMHhiZSwgMHg3YiwgMHhiMiwgMHhjOCwgMHgwMCwgMHgxZiwgMHgxYywgMHhiNiwgMHhiYywgMHhmNCwgMHg2YywKKyAgMHg0OSwgMHhmNiwgMHg3MywgMHgwYiwgMHgzNywgMHhjYywgMHgxOSwgMHgyOSwgMHg2MywgMHhiMSwgMHhkZiwgMHg3ZiwKKyAgMHg5NCwgMHhjNCwgMHgzOCwgMHhjNywgMHhmZiwgMHg3MiwgMHhjMCwgMHgzNSwgMHhkNywgMHg2NCwgMHgzYiwgMHgxMCwKKyAgMHhmNCwgMHhjNCwgMHg3MywgMHhjYywgMHg3MCwgMHgzYywgMHhjMSwgMHhjOCwgMHgyOSwgMHhjYywgMHhjMywgMHg0OSwKKyAgMHhiOSwgMHhiNywgMHhlNiwgMHgxMSwgMHhhMywgMHhlOSwgMHhhNSwgMHhlYSwgMHg4ZSwgMHg1YiwgMHhkOSwgMHhiYywKKyAgMHg3NiwgMHg3YywgMHhlMywgMHg3MCwgMHg2MiwgMHgzMywgMHhlZiwgMHgwMywgMHgxNSwgMHgwZCwgMHhmNywgMHg1NywKKyAgMHg3MCwgMHgyYiwgMHhkNSwgMHg3NSwgMHg0OSwgMHgzMCwgMHgwOCwgMHg3OCwgMHhkZCwgMHg5MiwgMHgyMCwgMHg1ZCwKKyAgMHhmYSwgMHhjNiwgMHhlMywgMHg2YSwgMHhlMiwgMHg2MCwgMHgwMCwgMHg2MiwgMHgwMCwgMHhkNywgMHhiNSwgMHhhOCwKKyAgMHhhNCwgMHgwMywgMHgwNywgMHgyMSwgMHgxYSwgMHg4ZiwgMHhkMCwgMHgwNywgMHgwYSwgMHgwMCwgMHgwZiwgMHg0MywKKyAgMHg0YiwgMHg4MywgMHhkMCwgMHg5OCwgMHhjMywgMHgwNywgMHgwYSwgMHhlNywgMHg0YiwgMHg4YSwgMHg3MiwgMHhiOCwKKyAgMHg0NiwgMHg4NSwgMHg1ZCwgMHhhZCwgMHhlNywgMHgxOCwgMHgzYSwgMHg3NCwgMHgwZSwgMHg3YiwgMHhjZCwgMHg3MywKKyAgMHg2ZiwgMHgyYywgMHhmNSwgMHhkMiwgMHg1ZCwgMHg3NywgMHhlOCwgMHhiZiwgMHg3YiwgMHhjOSwgMHg4NSwgMHhkYiwKKyAgMHg2ZCwgMHgyMywgMHg3NSwgMHg0NywgMHg1NSwgMHg1YiwgMHg4MCwgMHg5MCwgMHhjYiwgMHg1ZCwgMHg4NSwgMHg0OCwKKyAgMHhkYiwgMHhjOSwgMHg4ZCwgMHg1NSwgMHhjNywgMHg1ZCwgMHhhMywgMHhiNywgMHhhNSwgMHhlMCwgMHhjMCwgMHhmYywKKyAgMHhlYiwgMHgwNiwgMHhkMSwgMHhlZCwgMHgzZiwgMHhlZCwgMHgzNiwgMHhkYiwgMHhhZiwgMHhiYSwgMHhkZiwgMHg0MywKKyAgMHg4NywgMHhiOSwgMHhjNSwgMHg3ZCwgMHhmNCwgMHgwNywgMHgxZCwgMHhjNywgMHg3OSwgMHg0YSwgMHg5ZCwgMHgyNSwKKyAgMHgxOCwgMHg4ZCwgMHgxZCwgMHhkNywgMHhhNywgMHgzZCwgMHg5MiwgMHgzNywgMHg3NSwgMHgyMCwgMHg5YSwgMHg4NSwKKyAgMHhkMCwgMHhlOSwgMHg5NCwgMHgwNiwgMHhlNCwgMHhhYywgMHhlNiwgMHhhZSwgMHg5NiwgMHhmZCwgMHg1NSwgMHg3NywKKyAgMHhmMywgMHg3MSwgMHgwYiwgMHgxYywgMHhlNCwgMHgzYSwgMHgxZSwgMHhkZiwgMHhlZSwgMHhjNiwgMHhkMCwgMHgyMCwKKyAgMHgxYywgMHgxZSwgMHgwYywgMHg3YSwgMHg3ZiwgMHg2YywgMHhmYiwgMHhiMywgMHhmMiwgMHg5YywgMHhkNCwgMHhiZCwKKyAgMHg4NSwgMHg5ZiwgMHhjYiwgMHgyZiwgMHhkYiwgMHg4MSwgMHgxMCwgMHg4ZCwgMHhkMiwgMHgwMCwgMHg0YiwgMHg0NywKKyAgMHgzZCwgMHgyZiwgMHhkZSwgMHgzZCwgMHgzYSwgMHhkZiwgMHg4OCwgMHgxNywgMHg4NSwgMHg2OSwgMHhlMiwgMHgzMiwKKyAgMHhkNywgMHhmZCwgMHhiNiwgMHgxMCwgMHg1NiwgMHg3MCwgMHg0MiwgMHhhYiwgMHg0NSwgMHhkMiwgMHhkYywgMHgwNSwKKyAgMHhlNiwgMHgwMCwgMHg3YywgMHhiNCwgMHgyZiwgMHg2NiwgMHhkZiwgMHhiYywgMHg1ZiwgMHgyZiwgMHhkNywgMHhmYywKKyAgMHg0NCwgMHgwMiwgMHg2YSwgMHhlMSwgMHg0NiwgMHg4MSwgMHhiMSwgMHg1MCwgMHhjMiwgMHg2MSwgMHhiNywgMHg3NiwKKyAgMHhjOSwgMHg4YiwgMHhjNCwgMHg4YiwgMHg1YSwgMHg2YiwgMHgyNiwgMHg5MCwgMHgwMSwgMHhhZiwgMHhhOCwgMHgxOSwKKyAgMHgxMywgMHg0YSwgMHhjMCwgMHhiMSwgMHgwMSwgMHgxZCwgMHg2NywgMHhlNiwgMHgzNiwgMHhkNiwgMHg1ZiwgMHhkOCwKKyAgMHg3YiwgMHhjZSwgMHg5MiwgMHg0NSwgMHhiNywgMHgzMiwgMHhkYywgMHg2NywgMHg5ZSwgMHhhYywgMHg5OCwgMHhjZCwKKyAgMHg5NywgMHhhMiwgMHhkMiwgMHg3ZiwgMHgzZiwgMHhiNiwgMHgyMiwgMHg4YSwgMHhiNywgMHhlNiwgMHhlNiwgMHhhYiwKKyAgMHg4ZSwgMHg2MywgMHg0YSwgMHhhZiwgMHhmNiwgMHhiZiwgMHgxMywgMHhiYywgMHhlNSwgMHg0MiwgMHg2ZCwgMHhmOCwKKyAgMHhkYiwgMHhhMSwgMHhiYSwgMHg4NSwgMHg0MSwgMHhhZSwgMHhiNCwgMHg0MCwgMHgyMywgMHgwMCwgMHg4YSwgMHg2MSwKKyAgMHg0NywgMHgxOCwgMHg3MSwgMHg0MCwgMHg5ZSwgMHgyNywgMHgzYSwgMHhmZCwgMHg0ZiwgMHg1ZCwgMHhiYywgMHhlZiwKKyAgMHgxYywgMHg3YiwgMHgwOSwgMHhjNiwgMHhhZSwgMHg2ZiwgMHg5OCwgMHhhYSwgMHhhMywgMHgwMSwgMHhmMCwgMHg5YSwKKyAgMHg4NiwgMHg4MSwgMHg5NSwgMHhiMywgMHhjYSwgMHhkNiwgMHhiMSwgMHgyMiwgMHg4OCwgMHg5MCwgMHgyNSwgMHhmNiwKKyAgMHg1YiwgMHgwYSwgMHg0YiwgMHg3MSwgMHg0MCwgMHgyMSwgMHhiNSwgMHg2YywgMHhkMiwgMHg5MSwgMHgyNywgMHg4YywKKyAgMHg0NCwgMHhjZSwgMHg1YSwgMHg2NCwgMHg4MSwgMHg2ZCwgMHgwNiwgMHgzMCwgMHgwYSwgMHg4MSwgMHg5NCwgMHgxZiwKKyAgMHg3OCwgMHg2YywgMHg3ZSwgMHg4MSwgMHgzZiwgMHhmNCwgMHhiNywgMHg1MywgMHg1MywgMHhkMywgMHgyYywgMHg5NywKKyAgMHg5NCwgMHhiNiwgMHgxNSwgMHhlMSwgMHg4NiwgMHhiYywgMHgzYSwgMHg1ZiwgMHhjMywgMHg2ZiwgMHg4YywgMHhhZCwKKyAgMHg2NywgMHhlMywgMHg4YiwgMHg2OSwgMHg5ZSwgMHg3YiwgMHgxZCwgMHhkYSwgMHgyYywgMHgwYSwgMHgyYywgMHhhYiwKKyAgMHhjYSwgMHhhZiwgMHhmZCwgMHhmMiwgMHhlMywgMHhmNywgMHhkZCwgMHgzNCwgMHhjMywgMHg3NiwgMHhkNywgMHhkNSwKKyAgMHhkZiwgMHhlMywgMHg5ZCwgMHhiYiwgMHhlMiwgMHhjOSwgMHgwMiwgMHgzZCwgMHhkYSwgMHg1NywgMHhlOCwgMHhkOSwKKyAgMHg0MywgMHg2NCwgMHhmNywgMHgyYywgMHhlYywgMHg0ZSwgMHg3ZCwgMHg4YywgMHhjMiwgMHhlZSwgMHg1OCwgMHg2MCwKKyAgMHgzMCwgMHg5ZSwgMHgwNywgMHhlYSwgMHgyZCwgMHhhNywgMHgwOSwgMHg3YSwgMHhmMSwgMHhiNSwgMHg0OCwgMHg3MCwKKyAgMHg1ZCwgMHhhYiwgMHg2YSwgMHg2ZCwgMHg2MSwgMHhiNywgMHhmZSwgMHhjMCwgMHgwNywgMHhjZSwgMHgwMSwgMHhmMiwKKyAgMHhmZCwgMHg2MiwgMHhmOSwgMHhiZiwgMHhhMCwgMHgwMywgMHgwNywgMHgyMSwgMHgxYSwgMHg4YiwgMHhjOCwgMHgwNywKKyAgMHgwYywgMHgwMCwgMHgwMSwgMHgzZCwgMHg2NiwgMHhhNiwgMHhhOSwgMHgxOCwgMHg0MywgMHgxNSwgMHg1NiwgMHhmMywKKyAgMHhlOCwgMHgwNiwgMHhlOCwgMHgxNiwgMHg0MywgMHg4MSwgMHhmYSwgMHhmNiwgMHhhMiwgMHhmNCwgMHg2OCwgMHgxNiwKKyAgMHhiNiwgMHg3NiwgMHgxNSwgMHhmMywgMHgzNCwgMHhjNCwgMHhlMSwgMHg1ZSwgMHg3OCwgMHhjMywgMHgxMCwgMHg5OSwKKyAgMHgzYiwgMHgwYSwgMHgxNywgMHgyOCwgMHhkNSwgMHgyMCwgMHhlMywgMHhiMywgMHhhNSwgMHhjNiwgMHg0ZCwgMHgxYSwKKyAgMHg0ZCwgMHg0ZiwgMHgxYiwgMHgwMiwgMHg5OCwgMHhiMCwgMHgzMiwgMHhjMywgMHg2NSwgMHg2MSwgMHhjYywgMHgzYSwKKyAgMHhjZiwgMHg5MCwgMHg2ZiwgMHgyYywgMHgwMCwgMHgzNCwgMHhhNSwgMHhlYiwgMHhiNCwgMHhhMywgMHhmMCwgMHgzNywKKyAgMHg0OSwgMHgxOSwgMHgyMCwgMHgyZSwgMHhlNywgMHg3OCwgMHgwNiwgMHgxNiwgMHgxMCwgMHgyNywgMHgzNSwgMHg0YSwKKyAgMHhmMywgMHg4NSwgMHhmMiwgMHg3NywgMHg3NCwgMHhiMywgMHg2ZiwgMHhhZiwgMHgyYywgMHhjYSwgMHhjOCwgMHg5NywKKyAgMHgxOCwgMHg0YSwgMHg2MSwgMHg1YSwgMHg5ZiwgMHg1MSwgMHgyNSwgMHg5NCwgMHhhOSwgMHhjNSwgMHg3MiwgMHhiZSwKKyAgMHgxYSwgMHg4MywgMHgxZSwgMHg3YywgMHhkOSwgMHg5MSwgMHhiNSwgMHhhMiwgMHg0NywgMHgyMSwgMHg4NiwgMHg0OSwKKyAgMHhkOCwgMHgyNywgMHg5NSwgMHgxMCwgMHgzOCwgMHg4ZSwgMHgxOCwgMHg5OCwgMHg4MiwgMHhmNiwgMHg4YywgMHg3OCwKKyAgMHhkNCwgMHhiMiwgMHhjOCwgMHhlZSwgMHhhOCwgMHg4NCwgMHhiYiwgMHhmNiwgMHhkNiwgMHg5ZCwgMHg2NSwgMHg0OSwKKyAgMHhmNywgMHg5ZSwgMHgxMSwgMHgyNywgMHg4MywgMHg5NCwgMHgxNCwgMHg5MiwgMHhiNCwgMHg4MCwgMHgwMCwgMHgwMCwKKyAgMHg5MywgMHg1MSwgMHg1NiwgMHg4YywgMHgwZCwgMHhhZCwgMHhiYiwgMHgwMiwgMHg2ZSwgMHhlMCwgMHhjMywgMHg4MiwKKyAgMHgwMCwgMHg1MCwgMHhhNCwgMHgzMSwgMHg1MCwgMHg5ZSwgMHgxYywgMHhkOCwgMHg0ZCwgMHhlYSwgMHhiMiwgMHhkMCwKKyAgMHhiZCwgMHg2NCwgMHhiMCwgMHgyMiwgMHg2OSwgMHhkMCwgMHgxZiwgMHg2ZSwgMHg0OSwgMHgyYiwgMHg1NCwgMHhjNywKKyAgMHg5OCwgMHhkZCwgMHg2YiwgMHg0ZiwgMHhhYSwgMHg2MiwgMHg1MiwgMHg4OSwgMHhmMywgMHhiMSwgMHhhMCwgMHgzOSwKKyAgMHhjOCwgMHg0NSwgMHg0NSwgMHhiZCwgMHg3MiwgMHhjNSwgMHgxMCwgMHhiZCwgMHhhZCwgMHhiYSwgMHg2MywgMHhiYSwKKyAgMHhiMCwgMHg1MSwgMHg2NywgMHg5OSwgMHhiMSwgMHgzNCwgMHg3NywgMHhlNCwgMHhiNiwgMHg3OCwgMHgxYywgMHgzNSwKKyAgMHgwOCwgMHhmYiwgMHhmYSwgMHgwMSwgMHg3MiwgMHg2MSwgMHg5NSwgMHgzOCwgMHgzYywgMHg1YiwgMHhjMCwgMHgzNCwKKyAgMHgzNiwgMHhkYSwgMHhmZSwgMHg0YiwgMHg4OCwgMHhkZSwgMHg5OSwgMHg0YSwgMHg2ZCwgMHgzMCwgMHgwYSwgMHg4ZCwKKyAgMHg2NSwgMHgzZiwgMHg3ZSwgMHhhYSwgMHg0ZiwgMHg0MywgMHgwYywgMHgxOCwgMHhiMCwgMHg0YywgMHgzMiwgMHg4NCwKKyAgMHg3MiwgMHg3MywgMHhmNiwgMHgwMywgMHhkYywgMHhmOSwgMHgwOCwgMHhiMiwgMHgwMywgMHgyMiwgMHhjYywgMHhhMSwKKyAgMHgwNywgMHg2MywgMHhiMywgMHg0NSwgMHg4NSwgMHgzNSwgMHhmMSwgMHgzZiwgMHhiMSwgMHhhMSwgMHg1MCwgMHg2YiwKKyAgMHg3NSwgMHgwZiwgMHgwYSwgMHgxYSwgMHg4OCwgMHg5ZiwgMHg1YiwgMHg0ZCwgMHhkYSwgMHhlMiwgMHgyMiwgMHg3NSwKKyAgMHhjZSwgMHgwOSwgMHhkZiwgMHhhZiwgMHg0MCwgMHhiNywgMHhlZiwgMHg0NywgMHg2YSwgMHg0OCwgMHg0MywgMHg3ZSwKKyAgMHhhNywgMHgwYSwgMHhkMSwgMHg1MSwgMHhlMywgMHhhNSwgMHhiYywgMHg4YiwgMHgxYiwgMHg5ZiwgMHg4MiwgMHg4NSwKKyAgMHhkMCwgMHg0MSwgMHgwNSwgMHhiMCwgMHg4MywgMHhhMiwgMHgzMCwgMHg3MywgMHgwMiwgMHg0NCwgMHgwMCwgMHg4ZSwKKyAgMHgyYiwgMHhmMSwgMHhiYywgMHhjYSwgMHg4MiwgMHhkOCwgMHg3NiwgMHhhZCwgMHgxMSwgMHg0ZiwgMHg0NSwgMHhmMSwKKyAgMHg3ZiwgMHg4ZiwgMHg0MywgMHhkYywgMHgwMCwgMHhlMCwgMHgyMSwgMHgxYSwgMHg4YiwgMHhjMCwgMHgwZiwgMHg4ZiwKKyAgMHg0MSwgMHhjZiwgMHg0MywgMHg1MiwgMHg2NCwgMHgxMCwgMHhjNSwgMHhhYSwgMHhlMywgMHgxNiwgMHgyNSwgMHgxNSwKKyAgMHgwNiwgMHg2YSwgMHhjMiwgMHhjYiwgMHgzZSwgMHhiMywgMHgwNSwgMHhiYSwgMHhjMCwgMHgwNywgMHhjYywgMHhhOCwKKyAgMHgzMiwgMHgzYywgMHgwZSwgMHhmZSwgMHgzNiwgMHhlMywgMHhkOCwgMHhiOSwgMHg2MiwgMHg0ZiwgMHg0MSwgMHhjMiwKKyAgMHg2MCwgMHg5NywgMHg5OSwgMHg5MSwgMHhmNCwgMHgyZSwgMHgyNywgMHhhMCwgMHhjYiwgMHg0MiwgMHhhOCwgMHhjOSwKKyAgMHhkMywgMHgzMCwgMHhkOSwgMHhkMywgMHhjYiwgMHgzMywgMHgwMCwgMHg1MywgMHgzYywgMHg2MywgMHhjNSwgMHgyMSwKKyAgMHgwYiwgMHhmOCwgMHgzYiwgMHg4MCwgMHg1NiwgMHg1OSwgMHgwNiwgMHg3NiwgMHhhYSwgMHg0NSwgMHg5NywgMHgwOCwKKyAgMHhmNiwgMHg2ZCwgMHhmYywgMHg4NywgMHg2ZiwgMHg2ZiwgMHhhNSwgMHgxYSwgMHhhYywgMHg3YSwgMHgyYywgMHg3MiwKKyAgMHhkZCwgMHg1NCwgMHg3YSwgMHg3MSwgMHhkMCwgMHhmOCwgMHg3OCwgMHhjZiwgMHg3ZCwgMHhhYSwgMHg5NywgMHg5YSwKKyAgMHhjOCwgMHgwNSwgMHhiYywgMHgwZCwgMHgxMCwgMHhlNiwgMHgxYSwgMHhlZiwgMHgzZSwgMHhjZiwgMHhjNSwgMHhiMywKKyAgMHhkYywgMHgzMiwgMHhiYiwgMHg2MywgMHhjMCwgMHgwNywgMHg0MSwgMHg0ZiwgMHhjMCwgMHhlZiwgMHgzOCwgMHg2OSwKKyAgMHg4ZCwgMHg1OCwgMHg3MiwgMHg2ZiwgMHhjMCwgMHhjYSwgMHgyNCwgMHgwMywgMHhlMCwgMHhhMCwgMHg0NSwgMHg5MiwKKyAgMHhkNCwgMHg0OSwgMHgyOCwgMHhkOCwgMHgwMCwgMHgxNiwgMHg2MSwgMHg5NCwgMHgyYywgMHhjZCwgMHgyNCwgMHhmZiwKKyAgMHg5NCwgMHhmZSwgMHgzOSwgMHhhNSwgMHg0MiwgMHgyMywgMHhlNywgMHgyZCwgMHgxNiwgMHhiNCwgMHhmZiwgMHg1NSwKKyAgMHg3NywgMHhmZSwgMHhmNywgMHhjMSwgMHhhNiwgMHg4ZSwgMHgyNiwgMHhmMCwgMHg4NSwgMHhlOCwgMHgwMCwgMHgwNSwKKyAgMHhiOSwgMHhlNCwgMHgwZSwgMHgzZSwgMHgxMSwgMHg4MCwgMHg1MiwgMHhlMCwgMHg0ZiwgMHhkYywgMHgxMCwgMHg5MCwKKyAgMHgzMSwgMHgyMiwgMHgwNCwgMHg0NiwgMHg0MiwgMHgxNCwgMHg5YSwgMHg3MywgMHg5YSwgMHgzNywgMHg3NCwgMHg0MywKKyAgMHg3NywgMHhjNSwgMHgyMCwgMHhlMCwgMHg1OSwgMHgzYSwgMHgwZCwgMHg2OCwgMHgxNSwgMHgyZCwgMHhhNywgMHhhNCwKKyAgMHg1OSwgMHhlYywgMHg3NSwgMHhhYSwgMHg3MywgMHg3OCwgMHgxNywgMHhkZCwgMHgzMSwgMHhkNywgMHhjNiwgMHhlOSwKKyAgMHgwOSwgMHhiZCwgMHhmNCwgMHg3OSwgMHg2MiwgMHgxZiwgMHg3MiwgMHg0ZSwgMHg2ZiwgMHhiYiwgMHhhMCwgMHg1MywKKyAgMHhjNSwgMHg0YywgMHg2OCwgMHgzZCwgMHg2ZSwgMHg3ZCwgMHg1NywgMHgyMywgMHhjNywgMHgzMiwgMHhiNCwgMHgzNiwKKyAgMHhlYywgMHgyZiwgMHgwYSwgMHhmMSwgMHhkYSwgMHg3MywgMHg5OSwgMHhiZiwgMHhjZCwgMHgxOSwgMHgzOSwgMHg4YywKKyAgMHg0YywgMHgyMCwgMHhhZSwgMHhmNSwgMHg0MCwgMHg4NSwgMHhkYSwgMHgzMiwgMHhiNywgMHhmNCwgMHg2OCwgMHgzZSwKKyAgMHg5OCwgMHg5NCwgMHg0YywgMHgxMiwgMHgxZiwgMHhhNCwgMHhmNiwgMHgwNCwgMHg1NywgMHg0NywgMHgxYiwgMHhjYSwKKyAgMHhmYSwgMHhhOCwgMHg4ZCwgMHg5OCwgMHg0YywgMHg5OSwgMHg5MiwgMHhjOSwgMHg5MiwgMHgxMCwgMHgwYiwgMHgwOSwKKyAgMHgwYywgMHhhYiwgMHhlOSwgMHg3NSwgMHhkNywgMHg5NCwgMHg4MSwgMHhhYywgMHg0NSwgMHg4NywgMHhmMCwgMHhjNCwKKyAgMHhhYywgMHg3NSwgMHhiNCwgMHhjNSwgMHgzYiwgMHg0NSwgMHg4ZSwgMHhkYywgMHg5NCwgMHhlNSwgMHhkMiwgMHg2NSwKKyAgMHhjMywgMHhlOSwgMHhlZSwgMHg5YywgMHg0MCwgMHgyNSwgMHhiNSwgMHgxOSwgMHgxMiwgMHg2OCwgMHhkOCwgMHg5ZCwKKyAgMHhhMiwgMHg0NSwgMHg4NCwgMHgyMiwgMHgxNCwgMHg4ZCwgMHg0NywgMHgyOCwgMHhlOSwgMHg3YiwgMHhhYSwgMHg2YiwKKyAgMHg1YiwgMHhjMiwgMHgzNCwgMHg4YywgMHhlMCwgMHg2MCwgMHgwYSwgMHg4YywgMHg3NywgMHgwNywgMHgyMSwgMHgxYSwKKyAgMHg4ZiwgMHhkNiwgMHgxZiwgMHhjZiwgMHhlNywgMHhmYiwgMHgzNywgMHg2NiwgMHhhNSwgMHg1OCwgMHg2OCwgMHg1MCwKKyAgMHg3NCwgMHgxMSwgMHhiOSwgMHg0YSwgMHg3MywgMHgzYSwgMHhhZCwgMHhkZCwgMHhhOSwgMHgwYSwgMHhkNSwgMHg0YiwKKyAgMHg1NSwgMHhjMiwgMHgxNywgMHg4MywgMHg0ZSwgMHhhMCwgMHg2YSwgMHhmYywgMHhiYywgMHhkYSwgMHhlMCwgMHhmZSwKKyAgMHg5NywgMHhkNSwgMHgxMiwgMHg2OCwgMHgxYywgMHgxYiwgMHhkZiwgMHg5ZCwgMHgyMSwgMHgxOCwgMHg3ZCwgMHhhNSwKKyAgMHg3NSwgMHhjNCwgMHg2YSwgMHgyYSwgMHgwYSwgMHg3OCwgMHg0MywgMHgwZCwgMHhkMSwgMHg5MiwgMHg0OSwgMHgwMCwKKyAgMHhiMSwgMHg5NCwgMHg2ZSwgMHhhMCwgMHg0YSwgMHg2ZCwgMHg4NCwgMHg5NCwgMHg5YiwgMHhmYywgMHhkMywgMHg1MywKKyAgMHhhZiwgMHgxYywgMHhmNCwgMHhlZSwgMHgzMiwgMHhlNSwgMHgyYywgMHgwMSwgMHg0MSwgMHhjNSwgMHgxOSwgMHhiYiwKKyAgMHg4MCwgMHhhYiwgMHhkYiwgMHhiMiwgMHg1ZSwgMHg3MywgMHgwYiwgMHg5MSwgMHhiNCwgMHg4OCwgMHhjNiwgMHhlMSwKKyAgMHg1OSwgMHg3NSwgMHg3NywgMHg5ZCwgMHhiMSwgMHg3NCwgMHg0ZSwgMHhhYiwgMHg2NCwgMHg2YSwgMHhkMSwgMHgzNywKKyAgMHhhZCwgMHg5MCwgMHhjMywgMHg4YiwgMHgyOCwgMHg2YywgMHgyYSwgMHg5MCwgMHg5ZCwgMHhiYywgMHg0MiwgMHg5NCwKKyAgMHgyMCwgMHhjMCwgMHhhNCwgMHhiYywgMHg2OSwgMHhkMCwgMHg5ZSwgMHg5NSwgMHhmZCwgMHgxYSwgMHg2NCwgMHgyOSwKKyAgMHhlYiwgMHhhNCwgMHhjNiwgMHg4YiwgMHhmMSwgMHg0MywgMHgxMCwgMHg1MCwgMHgxMSwgMHg3OSwgMHgwNywgMHhkZiwKKyAgMHhmYiwgMHhlNywgMHg1MywgMHg3YiwgMHg1OCwgMHgyNiwgMHg3MywgMHgwOCwgMHg2MywgMHhhNywgMHgxZSwgMHg1ZSwKKyAgMHhlNSwgMHg5OCwgMHhkNSwgMHg5NywgMHhhZiwgMHhkYiwgMHhmNiwgMHgxYywgMHhjMCwgMHgwMCwgMHgwNSwgMHg0NiwKKyAgMHhkYywgMHhmMCwgMHg0ZSwgMHhmYiwgMHg3YSwgMHg4NSwgMHgxMSwgMHgwOSwgMHgzOSwgMHg3NywgMHg4NiwgMHgwNywKKyAgMHgxMywgMHg4ZSwgMHg5ZCwgMHhhZCwgMHhhOSwgMHg1MiwgMHgzNSwgMHg0MCwgMHgwYSwgMHgwMCwgMHgwMywgMHgzNCwKKyAgMHg1MiwgMHhjNiwgMHg0ZiwgMHgwYiwgMHhhMywgMHg3MiwgMHhmMiwgMHhlMSwgMHgwMCwgMHg0ZCwgMHhkYiwgMHg5OCwKKyAgMHhhMCwgMHgxOCwgMHgxOSwgMHgxMCwgMHg0NiwgMHg4MSwgMHgxMSwgMHg4MCwgMHhjNCwgMHg2MCwgMHgyNSwgMHg1MywKKyAgMHg5NSwgMHhhOCwgMHg2OCwgMHhhNiwgMHg3NCwgMHg4ZCwgMHgyMSwgMHg3YSwgMHgzNCwgMHhkMywgMHg0MSwgMHg0ZCwKKyAgMHg0MSwgMHhlNSwgMHhhNSwgMHhhNiwgMHgxOSwgMHg4ZCwgMHhjZSwgMHg1MCwgMHgyNSwgMHgzZiwgMHg0ZSwgMHhiYiwKKyAgMHhjOCwgMHhkYiwgMHgyZSwgMHgwYiwgMHg0YywgMHhhZSwgMHg1OSwgMHgzNSwgMHg1YSwgMHg2MSwgMHhhNywgMHg2NywKKyAgMHg0MCwgMHhmZSwgMHhlZCwgMHhjNCwgMHgzZCwgMHhkYSwgMHgzYSwgMHgwZSwgMHgxZCwgMHgyNSwgMHhlMiwgMHgzOSwKKyAgMHgzNCwgMHgzYiwgMHg0YiwgMHgwZCwgMHhjYywgMHgzZSwgMHg5MywgMHhhNSwgMHhmYSwgMHhmYywgMHgzYSwgMHg1MSwKKyAgMHg1YywgMHg5YiwgMHgxZSwgMHhiNSwgMHhhOSwgMHgwMiwgMHhkMCwgMHg0MiwgMHhiMiwgMHhjYywgMHg1ZSwgMHg3OCwKKyAgMHg0MSwgMHg5ZSwgMHgwOCwgMHhjNywgMHgwYywgMHhjZiwgMHhlNSwgMHg0MywgMHhiZCwgMHhhOSwgMHhkNSwgMHgwMywKKyAgMHhhNSwgMHhiNiwgMHhkMSwgMHg5NCwgMHgxOCwgMHgzMCwgMHgxOCwgMHhjZCwgMHg5ZCwgMHhmYywgMHhmOSwgMHgzZSwKKyAgMHgxNiwgMHhhNiwgMHg5NCwgMHhkMiwgMHhkYSwgMHg1OCwgMHgyMCwgMHg2MiwgMHhlNywgMHgzZSwgMHg4YywgMHg2MCwKKyAgMHg2MCwgMHgyOCwgMHg4OSwgMHgxMywgMHgwNSwgMHhlYiwgMHgyNSwgMHhkYiwgMHg3NiwgMHhjNCwgMHhiYSwgMHgxMiwKKyAgMHhmNCwgMHhmOSwgMHgzYiwgMHg1ZSwgMHhiYSwgMHg2NCwgMHhiOSwgMHhjNiwgMHhjZCwgMHhiMiwgMHhkNSwgMHhlOCwKKyAgMHg5NywgMHg5OSwgMHgxMiwgMHg2ZiwgMHgxZiwgMHhlOCwgMHgwMCwgMHgwNCwgMHhiNywgMHg2MCwgMHgwZSwgMHgyMSwKKyAgMHgxYSwgMHg5NCwgMHhjZCwgMHhjNiwgMHg4ZiwgMHgwMywgMHg0MSwgMHg5OSwgMHgxMCwgMHg2MiwgMHg1MSwgMHhjZSwKKyAgMHhkNiwgMHhiOCwgMHg3MSwgMHhjOCwgMHhiNCwgMHg1YSwgMHhkMiwgMHgyYywgMHhiYywgMHgxNiwgMHhlMCwgMHgwZCwKKyAgMHhmYiwgMHhmMCwgMHhiYiwgMHhhYywgMHg4OCwgMHgwMywgMHhkZSwgMHhiNSwgMHhmNywgMHhlMSwgMHhhMCwgMHgxYiwKKyAgMHhhZSwgMHhmMSwgMHg1YSwgMHhlZCwgMHhkZCwgMHhiZSwgMHg3NiwgMHg5YywgMHhlMiwgMHhlOCwgMHg2NCwgMHhkOSwKKyAgMHgzYywgMHhmNSwgMHhiMCwgMHhlYSwgMHg3ZSwgMHg3ZSwgMHg0ZSwgMHhiMSwgMHg3YywgMHgzZCwgMHhkNSwgMHgzZSwKKyAgMHgwMiwgMHg1ZSwgMHg5ZCwgMHhjYSwgMHg1ZiwgMHhhMywgMHg1YywgMHg4MywgMHg3ZCwgMHhmMywgMHgzMywgMHgwMywKKyAgMHg1NiwgMHhmMiwgMHg5YywgMHgwYiwgMHhkYywgMHg3MSwgMHgxNSwgMHg3YywgMHhkZiwgMHgwNiwgMHhhMywgMHhiZSwKKyAgMHgwZCwgMHg4ZSwgMHgxMywgMHhhMywgMHhiMywgMHgyZCwgMHgzNSwgMHhjZCwgMHg2NywgMHg2YSwgMHhlYywgMHgzMywKKyAgMHhmYiwgMHhlZiwgMHg5OCwgMHg1MCwgMHgxOCwgMHhmYiwgMHgwNCwgMHhiMSwgMHg0YywgMHg4MCwgMHhjNCwgMHhkZCwKKyAgMHhhNSwgMHg3YiwgMHhhYiwgMHg4MywgMHhiMCwgMHhjMSwgMHg0MCwgMHgxYiwgMHhlOSwgMHg4ZiwgMHhiMCwgMHgzNCwKKyAgMHhlYSwgMHgwOSwgMHgwNiwgMHg1NSwgMHg0YywgMHg5MCwgMHhhZiwgMHhjYywgMHg0NCwgMHg4OCwgMHg2MCwgMHg0NCwKKyAgMHhhMCwgMHhhZCwgMHg5OCwgMHg5NCwgMHg5ZSwgMHg5OSwgMHg0MiwgMHhkNywgMHhlOCwgMHhiYiwgMHg4ZSwgMHhiYSwKKyAgMHg4YSwgMHhjZSwgMHhlOSwgMHg4MSwgMHg1YSwgMHhkOCwgMHhjZCwgMHhjZCwgMHg2OCwgMHhhZCwgMHg5YiwgMHg2YywKKyAgMHg1NywgMHg1ZSwgMHg4NiwgMHhkMSwgMHgyNSwgMHgzYywgMHgzNiwgMHhhMCwgMHgwMywgMHhkMSwgMHgxNCwgMHg1NywKKyAgMHg5NywgMHg4OSwgMHhkMiwgMHhhNSwgMHg3MiwgMHhmOCwgMHgyNywgMHhkNCwgMHhiZSwgMHhlNywgMHhlNywgMHhlYiwKKyAgMHg1NywgMHg0MywgMHhmOCwgMHhiZCwgMHgxZiwgMHhiOSwgMHhhYiwgMHgxMSwgMHgzMCwgMHg1OCwgMHhlMCwgMHhhOSwKKyAgMHg2YiwgMHg1NiwgMHhiZCwgMHg3NCwgMHhmYiwgMHgxOSwgMHhmNSwgMHgzNCwgMHhmOSwgMHhjZCwgMHhiZSwgMHg5ZiwKKyAgMHg5YiwgMHgwMywgMHg1YSwgMHg1NywgMHg5ZCwgMHhhMywgMHhhMCwgMHhiMCwgMHhiNSwgMHhjOCwgMHg3OCwgMHhkOCwKKyAgMHg1ZCwgMHhjZSwgMHg0MywgMHg3ZSwgMHhjZSwgMHgzOCwgMHg4MSwgMHhiMywgMHg3MywgMHhhYSwgMHhhOCwgMHhlMSwKKyAgMHgyYywgMHgwNCwgMHg4NSwgMHg0ZCwgMHg0MiwgMHhmMSwgMHg4MiwgMHhhMSwgMHgyOSwgMHhlZCwgMHgwYSwgMHg2ZiwKKyAgMHgwZCwgMHg1OSwgMHg4YywgMHhkOSwgMHhkNiwgMHgwMCwgMHgyNiwgMHg2OSwgMHgzNiwgMHg0OCwgMHgyYSwgMHg5NCwKKyAgMHgwNiwgMHg0MSwgMHgwMSwgMHg4OCwgMHg4MCwgMHhjMiwgMHg0NiwgMHhlMywgMHg2ZCwgMHg2MywgMHg4YSwgMHgyOCwKKyAgMHgwNywgMHgwZSwgMHhiYSwgMHg3NCwgMHgwNSwgMHhiZCwgMHgzYiwgMHgzYiwgMHhjZSwgMHg4MywgMHg2ZSwgMHg5YiwKKyAgMHhmYywgMHg1NSwgMHg2MiwgMHhiNSwgMHhlNiwgMHhmYSwgMHg4YSwgMHhiNiwgMHgxYywgMHg3NCwgMHhiNCwgMHg3MiwKKyAgMHhjNywgMHhkMywgMHg1NiwgMHhlMiwgMHg5ZCwgMHgxMSwgMHg3NiwgMHg1ZCwgMHhlYSwgMHhjNywgMHgyZCwgMHhiZSwKKyAgMHgyYSwgMHgwNiwgMHhhNiwgMHg3MSwgMHg1NCwgMHhlMCwgMHg5ZiwgMHg4ZCwgMHhjNCwgMHgzOSwgMHhiNiwgMHg5NCwKKyAgMHgxZCwgMHhmMCwgMHgyMCwgMHg3MCwgMHhlYywgMHg2MywgMHg5ZCwgMHg3NSwgMHg0MCwgMHg1YywgMHgzMSwgMHg0ZSwKKyAgMHg2NCwgMHhiMiwgMHhkNSwgMHhhMiwgMHgzMywgMHg4MywgMHg3YSwgMHg0ZSwgMHhhMSwgMHg3ZCwgMHgzMywgMHgxNSwKKyAgMHhjYiwgMHhmZCwgMHhlMywgMHhlMSwgMHhkNSwgMHhiMCwgMHg1ZSwgMHhkNCwgMHhhMywgMHhhMSwgMHgxZSwgMHgzNSwKKyAgMHgwMSwgMHhiZSwgMHg2YSwgMHgxMSwgMHgyMSwgMHhjMywgMHg1NCwgMHg4YiwgMHgwZiwgMHhkZiwgMHhiYSwgMHhjNSwKKyAgMHgyZCwgMHgxNCwgMHgxMywgMHgwMCwgMHhlMCwgMHgyMSwgMHgxYSwgMHg5NCwgMHhkZCwgMHhjYSwgMHgxMiwgMHg4MywKKyAgMHgxMSwgMHgxMSwgMHgwNCwgMHhjNCwgMHg2YywgMHhkZiwgMHgxOCwgMHhlOSwgMHg1MCwgMHgxNSwgMHg3MiwgMHhhNiwKKyAgMHg5YSwgMHgzYSwgMHhlNCwgMHhhMywgMHg1MCwgMHgwNiwgMHhhYSwgMHg5OCwgMHg3MSwgMHg3ZiwgMHhhZSwgMHg3MywKKyAgMHgyNywgMHg3OSwgMHhmNywgMHg1NiwgMHhiZCwgMHhiNCwgMHg0YywgMHg3NiwgMHgwZCwgMHg2ZSwgMHgwZiwgMHg5NCwKKyAgMHg5ZSwgMHgxOCwgMHgzNywgMHgzYiwgMHhiYiwgMHg1NSwgMHhiOSwgMHhmZCwgMHgzNiwgMHhmMywgMHg1ZCwgMHg3MiwKKyAgMHhlNCwgMHgwOCwgMHg1YiwgMHgxYSwgMHg3YiwgMHg4NSwgMHg5MCwgMHgwNCwgMHgwOCwgMHhlMywgMHg5NywgMHg1ZCwKKyAgMHgxZSwgMHgxZCwgMHhhMywgMHg2MywgMHg1OSwgMHhlOSwgMHg2MiwgMHgwZSwgMHhmYywgMHhjMiwgMHg3YywgMHg2MywKKyAgMHg5NiwgMHg1ZiwgMHg5MiwgMHg1ZiwgMHgwZCwgMHhlYywgMHhlZSwgMHgzNiwgMHhkOSwgMHhiOCwgMHhiZSwgMHhhOCwKKyAgMHg4YiwgMHhhYywgMHgzNSwgMHg3NCwgMHhhNywgMHhmYiwgMHhmZiwgMHhiZSwgMHg5ZiwgMHg3MywgMHhiYiwgMHhlOSwKKyAgMHg2ZSwgMHg2YSwgMHhmNCwgMHhjZCwgMHhiMSwgMHhlNCwgMHg4ZCwgMHhkMSwgMHgyMiwgMHgyYiwgMHhmMCwgMHgwZSwKKyAgMHhjMywgMHg5MywgMHgzNywgMHgxMCwgMHhiMiwgMHg3ZSwgMHgzNSwgMHgyNiwgMHhkYywgMHhkOSwgMHg3MSwgMHhlNiwKKyAgMHg4YywgMHhiMCwgMHhhNiwgMHgxNCwgMHhjMSwgMHgxYSwgMHgyYywgMHhiNCwgMHgzNiwgMHhmNCwgMHhmNSwgMHhkNCwKKyAgMHgzMiwgMHhmMCwgMHg2MSwgMHg2MywgMHg0ZiwgMHhhMCwgMHg3YSwgMHg3MiwgMHgwOCwgMHhjOCwgMHgxZCwgMHg3YSwKKyAgMHg2NSwgMHhjNywgMHhkYSwgMHhjYiwgMHg0YSwgMHgzYywgMHg4MiwgMHg2NCwgMHgxOCwgMHg2NSwgMHhiOSwgMHhjNSwKKyAgMHhhZCwgMHg1ZiwgMHhiZSwgMHhkOCwgMHhiNCwgMHgwMSwgMHg1OSwgMHhiYiwgMHg2ZSwgMHhlYiwgMHhlYiwgMHgxZiwKKyAgMHg0YywgMHg5YywgMHhiYSwgMHgxMSwgMHg2MiwgMHhmZiwgMHgzYSwgMHgzOCwgMHgxZSwgMHg1YywgMHg5ZCwgMHhkNSwKKyAgMHg4ZSwgMHg3MSwgMHg5YiwgMHg5ZSwgMHg2MCwgMHhmNCwgMHhiMSwgMHg1YywgMHg5ZSwgMHhlZSwgMHg3NiwgMHg1NywKKyAgMHg5NiwgMHgyOCwgMHhiOCwgMHg4MiwgMHg2MiwgMHg1NCwgMHgwMCwgMHhlNiwgMHg5MCwgMHhmZiwgMHg1ZSwgMHg2NywKKyAgMHhkNCwgMHg4YywgMHg3NSwgMHgzMywgMHhhYiwgMHhhYSwgMHg3MCwgMHhjOCwgMHgwYiwgMHhkZCwgMHgwOSwgMHg0ZiwKKyAgMHgwZCwgMHg5MiwgMHgwYywgMHhlMCwgMHgyMCwgMHhkNiwgMHg1OSwgMHg3MCwgMHg5NCwgMHhlYywgMHgxMywgMHhkNiwKKyAgMHhmNywgMHgyMywgMHgwYywgMHg4MiwgMHgwMiwgMHgxMSwgMHgwMCwgMHhjNCwgMHgyMCwgMHg3MSwgMHgyMiwgMHg3NSwKKyAgMHg4YywgMHg2NSwgMHhjMiwgMHg1MCwgMHgwOSwgMHg3NywgMHgzZSwgMHgzYSwgMHhhYiwgMHgwNSwgMHhkMSwgMHhmYSwKKyAgMHg5YiwgMHg5MywgMHg0OCwgMHg3NSwgMHhmNywgMHhmNiwgMHg5OCwgMHhlNywgMHgzYiwgMHgyOCwgMHhhOSwgMHhkYywKKyAgMHgyZiwgMHhmMiwgMHhkNCwgMHhiOSwgMHg2MSwgMHhhMSwgMHhjMywgMHg0NywgMHg1YiwgMHhjMywgMHhlNSwgMHg0NiwKKyAgMHhkNywgMHg0OSwgMHg2NCwgMHhmOSwgMHhiNiwgMHg0YiwgMHgyOCwgMHg2NiwgMHgwZSwgMHhiNCwgMHg2ZSwgMHhlNiwKKyAgMHhkZiwgMHhmOCwgMHgwYywgMHgyMywgMHhiMywgMHgxNSwgMHg0NCwgMHg1OSwgMHhlOSwgMHhlYywgMHhiZiwgMHg3ZCwKKyAgMHgyYywgMHg3YiwgMHhjOSwgMHg5ZiwgMHgyNiwgMHg3NywgMHgxZCwgMHgzMywgMHg1MSwgMHg1NCwgMHgzMCwgMHhlMiwKKyAgMHg0ZCwgMHg0MiwgMHgyMCwgMHhiOCwgMHg1MiwgMHg2YywgMHg0YiwgMHg4ZiwgMHhlOCwgMHhhZSwgMHhhMCwgMHgxMiwKKyAgMHgzMCwgMHhhNSwgMHgxMiwgMHg1MiwgMHgwMSwgMHg5YywgMHg4OSwgMHgyMywgMHg2YiwgMHgyMywgMHgxMSwgMHg2MSwKKyAgMHhjNCwgMHhmYywgMHg3MywgMHhhOCwgMHg5NCwgMHgwMCwgMHgzOCwgMHgyMSwgMHgxYSwgMHg4ZCwgMHgyNCwgMHgwZiwKKyAgMHhmZiwgMHg4NSwgMHhmZiwgMHgzNywgMHg2YiwgMHhhMiwgMHg1OCwgMHg2OCwgMHhiMCwgMHg0NiwgMHgxOCwgMHhiOCwKKyAgMHg2ZiwgMHgyZCwgMHhjNSwgMHgyNCwgMHhkYywgMHgxMSwgMHhjMCwgMHhhNSwgMHhiNCwgMHg3NSwgMHg1OSwgMHhiMSwKKyAgMHhkNSwgMHg4MSwgMHg2NCwgMHhkMywgMHhmZiwgMHg1ZCwgMHhkZCwgMHgzOSwgMHhhMiwgMHg4NiwgMHgwNSwgMHgyMywKKyAgMHgwYywgMHg3NCwgMHhjOCwgMHg0YywgMHg3OCwgMHgxMCwgMHgyMSwgMHg5MCwgMHhjNywgMHg0NiwgMHgyMywgMHhhNSwKKyAgMHg1YSwgMHgxOCwgMHgxZCwgMHgwOSwgMHhkNSwgMHhiNiwgMHhhNiwgMHhkMSwgMHgzNiwgMHgzNCwgMHgyOCwgMHg3MSwKKyAgMHhlYiwgMHgxZCwgMHg1ZSwgMHhkNCwgMHgzMiwgMHhkNiwgMHhkYSwgMHhkOSwgMHgzYywgMHhmNiwgMHhjNywgMHg4NywKKyAgMHhlNCwgMHg5NiwgMHg0ZSwgMHhjYSwgMHgyOCwgMHgwZiwgMHgxYywgMHg3MywgMHg1MSwgMHhlYiwgMHhmNCwgMHhlYiwKKyAgMHgzNiwgMHg1YiwgMHg1YywgMHhkZiwgMHg0MSwgMHhhYywgMHg5NywgMHhjYiwgMHgzYSwgMHg2ZCwgMHg2YiwgMHg2MywKKyAgMHgyMiwgMHgxNSwgMHgzZiwgMHhhMywgMHgzMywgMHhkMCwgMHhkZiwgMHgyYSwgMHg5NSwgMHgxZCwgMHg2NSwgMHhiNSwKKyAgMHhlZiwgMHgwZSwgMHgyNiwgMHhhZCwgMHhiNiwgMHhlOCwgMHg0ZCwgMHhjNywgMHhiOCwgMHg5OSwgMHhhNywgMHgxMCwKKyAgMHg3YywgMHg2NiwgMHgxOCwgMHhjYSwgMHg0MywgMHg4OCwgMHhmMCwgMHg2NCwgMHgxNSwgMHg4NSwgMHg4NywgMHhmNCwKKyAgMHhlYiwgMHg4OCwgMHgyYSwgMHhlMiwgMHhhNiwgMHg2NSwgMHhjMSwgMHhkOSwgMHg5MywgMHhmYiwgMHgxYSwgMHg4ZiwKKyAgMHg2OCwgMHhjNiwgMHhlNiwgMHhhZSwgMHhiMSwgMHg2OSwgMHhkNiwgMHhkOSwgMHg4ZSwgMHhkMCwgMHgyOCwgMHg5MSwKKyAgMHgyMiwgMHg0MSwgMHhhNCwgMHhlMSwgMHg1NywgMHgzNCwgMHg1NSwgMHg5ZSwgMHgyZiwgMHg1YywgMHhiMCwgMHhmOSwKKyAgMHg2MywgMHg4ZiwgMHg2YywgMHg2MSwgMHg2MSwgMHgxOCwgMHg0MywgMHhkNCwgMHg0YSwgMHhhNSwgMHhmYywgMHgyMiwKKyAgMHgzNCwgMHhmYywgMHg3MywgMHg2YywgMHhlNywgMHhiYiwgMHhjOSwgMHg5OCwgMHgzOSwgMHgwOCwgMHgyNywgMHg5MiwKKyAgMHhhOCwgMHhjYiwgMHhiNiwgMHgwYywgMHg3ZiwgMHgzOCwgMHhlMCwgMHg0YSwgMHgzYSwgMHgwOSwgMHg4OSwgMHg1YSwKKyAgMHhhMCwgMHg5YSwgMHhiNSwgMHgyNiwgMHhhYSwgMHgxMiwgMHhhMSwgMHgyYSwgMHg1OCwgMHgyMSwgMHhiNiwgMHhiZSwKKyAgMHgzYiwgMHgwMiwgMHg2ZSwgMHhkZiwgMHgwMywgMHg2MiwgMHhhMiwgMHg0NCwgMHgyOCwgMHgxMSwgMHg0MiwgMHg2MywKKyAgMHgwMCwgMHgyMCwgMHg4OCwgMHhlMSwgMHg0YiwgMHg1YSwgMHg0ZCwgMHgwYiwgMHgyZSwgMHg1ZSwgMHgwNSwgMHgxNCwKKyAgMHhkYSwgMHg0NSwgMHhmZSwgMHhiYSwgMHg2MiwgMHhjMywgMHhmMCwgMHg3MiwgMHhkMCwgMHgwMSwgMHhmOCwgMHgwOCwKKyAgMHhjYiwgMHg2ZSwgMHhkYSwgMHg4MiwgMHg4MiwgMHg2NiwgMHhjYSwgMHg5MCwgMHgwZiwgMHhjNiwgMHhjNywgMHg0ZCwKKyAgMHhkNCwgMHgwNSwgMHhkOSwgMHhkMiwgMHgxNCwgMHhhMCwgMHg0YiwgMHg0ZSwgMHgzNiwgMHgyNywgMHgxZCwgMHhmZSwKKyAgMHg1MiwgMHhkMywgMHg1ZCwgMHhhNiwgMHg0ZiwgMHgxOCwgMHhmYiwgMHhjMywgMHg4MiwgMHg3YiwgMHg4YywgMHhiYywKKyAgMHhlZSwgMHg5MSwgMHhkMCwgMHg5ZCwgMHhkMywgMHhiZSwgMHhiZCwgMHhlNiwgMHhiOCwgMHg4ZiwgMHhkNCwgMHhhMywKKyAgMHg4ZSwgMHg3YywgMHg0MywgMHgwZiwgMHg1NCwgMHgwMSwgMHg5ZiwgMHhlZCwgMHg0MiwgMHg0ZiwgMHg3NiwgMHg3MCwKKyAgMHhiMywgMHhkYSwgMHg3MiwgMHg4NSwgMHgwYiwgMHgyMSwgMHgwMiwgMHhmMiwgMHhmYSwgMHg3NCwgMHgyZiwgMHg4ZSwKKyAgMHg4ZCwgMHgzNiwgMHhmNSwgMHgyOCwgMHg5MSwgMHhhOCwgMHgyNCwgMHgxZSwgMHhlNywgMHhjNCwgMHhiNiwgMHg2NCwKKyAgMHg0MSwgMHgyNCwgMHg3ZCwgMHg3YywgMHg3MywgMHgyYywgMHg4ZCwgMHgyYSwgMHgzOCwgMHgxZiwgMHgxZiwgMHg1OSwKKyAgMHhmMCwgMHg3NSwgMHg1OCwgMHg4ZCwgMHg2ZSwgMHgxYywgMHg4ZiwgMHg0ZSwgMHg0NywgMHhhYSwgMHg3OCwgMHhhNCwKKyAgMHg2NywgMHgwMywgMHhhZSwgMHhjMSwgMHg4ZCwgMHg0YSwgMHg1MSwgMHhhNCwgMHhhZiwgMHg0NSwgMHgyNCwgMHhiNSwKKyAgMHgyYiwgMHg4MSwgMHhmNSwgMHg0MywgMHhjMCwgMHg0MiwgMHgzNCwgMHhiMiwgMHgxYSwgMHg0NSwgMHg3NCwgMHg4OSwKKyAgMHhhNywgMHhkYiwgMHg4MCwgMHgwZSwgMHg0NiwgMHhlNywgMHg2MCwgMHhhNSwgMHg0NCwgMHgwMywgMHg0YywgMHhmNiwKKyAgMHgzZSwgMHhlZiwgMHhjYywgMHgwMCwgMHg5MCwgMHg1ZCwgMHg0NCwgMHhjNSwgMHg0NCwgMHhmNiwgMHg4MywgMHhlNywKKyAgMHgwYiwgMHhkZiwgMHgxMywgMHgzZCwgMHg4MCwgMHg3MCwgMHgyMSwgMHgxYSwgMHg4ZiwgMHhmMCwgMHgwNywgMHhjZiwKKyAgMHgxZSwgMHhmZiwgMHgzZiwgMHg2NiwgMHhhNiwgMHhiMSwgMHg4NiwgMHgyNiwgMHg1NiwgMHg5MywgMHhhYSwgMHg1NSwKKyAgMHgyOCwgMHgwNCwgMHg4MiwgMHhiYSwgMHhkNSwgMHhkZSwgMHhkMCwgMHg5NywgMHhjMCwgMHg1YiwgMHgyYSwgMHg0OSwKKyAgMHgyNCwgMHhmZiwgMHhjMSwgMHgzYiwgMHhiNiwgMHgwYywgMHg1YiwgMHgxYywgMHhjMiwgMHhhMSwgMHhiOSwgMHhhNywKKyAgMHgzNCwgMHhkYiwgMHhjNywgMHg2ZSwgMHg0OSwgMHg3OSwgMHhkNCwgMHg2YywgMHg2YywgMHgwYSwgMHhiNywgMHhlYiwKKyAgMHg1NSwgMHg2MiwgMHg3YSwgMHhkMSwgMHg1NywgMHg0MiwgMHgxYSwgMHg0NiwgMHhhYSwgMHhmNywgMHg4MSwgMHg1NSwKKyAgMHhjZCwgMHgxNCwgMHhhOSwgMHgxNCwgMHhjYiwgMHhmYSwgMHg2NSwgMHgxNiwgMHg2NSwgMHhlNiwgMHg2NCwgMHhjZSwKKyAgMHg5MSwgMHg3NywgMHg0NSwgMHhlYywgMHg5YiwgMHhlYywgMHgxNywgMHg0YiwgMHhiOCwgMHgzMSwgMHg0OSwgMHg1YSwKKyAgMHg1MywgMHg4ZSwgMHhhYiwgMHhjOSwgMHg0OSwgMHhkNywgMHgxYywgMHg5MywgMHhmOCwgMHgxZiwgMHgyNSwgMHgxMiwKKyAgMHgzNSwgMHg3YiwgMHgzNCwgMHg4OSwgMHg1ZiwgMHg5ZiwgMHgyNywgMHg2MSwgMHgwYSwgMHhkYywgMHgyYiwgMHgwMCwKKyAgMHg3NywgMHgwMiwgMHg2NSwgMHg2MiwgMHhhNSwgMHhlOCwgMHhhMywgMHhiNywgMHgwZCwgMHhmYywgMHhlZSwgMHhhNiwKKyAgMHg3OSwgMHg4MiwgMHhjNiwgMHgzZiwgMHhhNywgMHgzYywgMHg1NiwgMHhmMCwgMHhkNiwgMHg4MCwgMHhjOCwgMHhkZCwKKyAgMHg3MSwgMHgzMywgMHgyMywgMHg2YiwgMHg4MiwgMHhkMSwgMHgwNSwgMHhjOSwgMHg4NCwgMHg4MCwgMHgxMywgMHg4NSwKKyAgMHhkNCwgMHhhOCwgMHg4NSwgMHg4NSwgMHgyMCwgMHg2YSwgMHgyNSwgMHg3NSwgMHgzYiwgMHgxYSwgMHhkZCwgMHhlNSwKKyAgMHg0YywgMHg5MCwgMHgyYSwgMHgwYiwgMHg4NSwgMHhhZCwgMHhiMCwgMHg1MCwgMHgyZCwgMHgyOSwgMHhiYywgMHgyYiwKKyAgMHg0NSwgMHhhZiwgMHg3ZCwgMHgzYywgMHgwMCwgMHg5YywgMHhiOCwgMHg5OSwgMHgxOCwgMHg0MywgMHgzMSwgMHg1NSwKKyAgMHg5NSwgMHg0YiwgMHgwMCwgMHg0NCwgMHhiMSwgMHg2NiwgMHhiZCwgMHg5MiwgMHhhYSwgMHhlNCwgMHg5NywgMHg1MCwKKyAgMHgzZCwgMHg1NSwgMHhhZSwgMHg2OCwgMHg2ZSwgMHhkYSwgMHg2YiwgMHhkZCwgMHhiNSwgMHhlNywgMHhlZSwgMHg3YiwKKyAgMHgwMywgMHg1ZCwgMHgwYSwgMHg5YSwgMHgyNSwgMHg5MiwgMHhlNywgMHgyZSwgMHhjNiwgMHhlNCwgMHhiOCwgMHg0OCwKKyAgMHgyYiwgMHg4YiwgMHhjOSwgMHhlNSwgMHhhYSwgMHgxMiwgMHgzMywgMHgyZCwgMHgyMSwgMHg2MywgMHg0MiwgMHg1NCwKKyAgMHg3NywgMHg0MSwgMHg3YiwgMHhkNywgMHhhMywgMHgyOCwgMHg2MCwgMHhlMSwgMHg5YywgMHhhOCwgMHhiZCwgMHhjMSwKKyAgMHhkZCwgMHgyOSwgMHhkYywgMHg5OCwgMHg1NCwgMHg4ZSwgMHg4NSwgMHg2YywgMHg0NywgMHg4MywgMHgzNywgMHg3NSwKKyAgMHhlYiwgMHhlZiwgMHhjMywgMHhhMSwgMHhlMywgMHhmMCwgMHhkMCwgMHg3OCwgMHhlZSwgMHgzNCwgMHhiMywgMHg2MywKKyAgMHg1NSwgMHhiMiwgMHhlMiwgMHgwMCwgMHg1MiwgMHg3MCwgMHg3NSwgMHhkNSwgMHhmZiwgMHhhMSwgMHgwMCwgMHgyMywKKyAgMHgwMCwgMHhkOSwgMHg3YywgMHhiZSwgMHhjYSwgMHhkYSwgMHg5MywgMHgzMiwgMHhhOCwgMHhkNiwgMHgyZSwgMHg4OCwKKyAgMHg5YSwgMHhlYiwgMHgyNywgMHg0MCwgMHhhMCwgMHg3YiwgMHg2NCwgMHgyZCwgMHgxMiwgMHgzMywgMHhiMywgMHhkNSwKKyAgMHhlZCwgMHhlYSwgMHhjNSwgMHhlOCwgMHg3YiwgMHgxYSwgMHg0YywgMHgwMiwgMHgzNSwgMHhhNCwgMHg4MCwgMHhiNSwKKyAgMHhkMCwgMHg5OCwgMHgxMCwgMHgyYSwgMHhlYiwgMHg0MiwgMHg4YiwgMHhiNywgMHgyYSwgMHg1MiwgMHg0ZCwgMHgzMCwKKyAgMHgwZSwgMHgyMSwgMHgxYSwgMHg4ZiwgMHhjMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHhmZiwgMHgzNSwgMHg2YiwgMHhhNSwKKyAgMHhiMSwgMHgwNiwgMHgwMCwgMHg0NiwgMHg5NCwgMHhkYSwgMHgxNywgMHg5NywgMHhjNSwgMHhhMywgMHgyZSwgMHhkYSwKKyAgMHgwNCwgMHg0MCwgMHgxZiwgMHg3NCwgMHhmNCwgMHg0ZSwgMHgyZSwgMHhmOCwgMHgzYSwgMHg1NywgMHg1MiwgMHg3NywKKyAgMHhmNSwgMHhhNCwgMHg2YSwgMHg5YywgMHg1MiwgMHhjOSwgMHhmOCwgMHgyNywgMHhlOSwgMHhhNywgMHg5NiwgMHgwNywKKyAgMHhmYywgMHg0MiwgMHhlNywgMHg0MiwgMHg3MywgMHgzZiwgMHg0NSwgMHg2OSwgMHg1ZiwgMHhkZSwgMHhlYSwgMHhjZCwKKyAgMHhlYiwgMHhlYSwgMHhhOSwgMHg3ZSwgMHg3NiwgMHhjMSwgMHgyZiwgMHg1OSwgMHg1YywgMHhmZCwgMHg5YSwgMHhkNSwKKyAgMHhiMCwgMHg1YywgMHgyNywgMHhjMSwgMHg1YywgMHg1YiwgMHgwOSwgMHgzYywgMHhiNywgMHg2ZCwgMHhkYSwgMHg3MywKKyAgMHhmYSwgMHhjNiwgMHhjNSwgMHg2NSwgMHhjNCwgMHg2MCwgMHg3OCwgMHhlNiwgMHgyYSwgMHgzZSwgMHg1ZCwgMHhiYSwKKyAgMHhiNCwgMHg1NCwgMHgyYiwgMHgxOCwgMHgxOCwgMHhkNywgMHg5NSwgMHgyMiwgMHhhMCwgMHg5YSwgMHgzOCwgMHhkNCwKKyAgMHgzMiwgMHhhNCwgMHgwOSwgMHgzNiwgMHhmMywgMHgyMiwgMHhlMSwgMHgwMywgMHhjMiwgMHg0MCwgMHg4NCwgMHgxMywKKyAgMHg0NywgMHgzNywgMHg2NSwgMHgzNiwgMHhhZiwgMHg3NSwgMHg1ZCwgMHhkOCwgMHg3YiwgMHg2NiwgMHhmYiwgMHhjZCwKKyAgMHg4ZSwgMHgzYSwgMHgzYSwgMHhlMSwgMHg4YSwgMHhiOSwgMHgzMCwgMHgxOSwgMHgwNCwgMHgwMCwgMHhkMiwgMHg5OCwKKyAgMHg2OSwgMHhhNSwgMHhjYiwgMHhjMiwgMHhmMiwgMHg2ZiwgMHg4ZiwgMHgyMCwgMHhiYiwgMHgxMywgMHhlZCwgMHhlNSwKKyAgMHgwYSwgMHg3MywgMHg5MCwgMHg0YywgMHgxNywgMHg1MiwgMHgyZCwgMHgzOCwgMHg4MywgMHg3ZSwgMHhmOCwgMHhkMywKKyAgMHgxNCwgMHg3MSwgMHgxNywgMHg4NCwgMHg2ZCwgMHg2YiwgMHhkZSwgMHgwMiwgMHgyZiwgMHgzNCwgMHgzNywgMHg2NiwKKyAgMHg5MywgMHg5MSwgMHgwYSwgMHgyNywgMHgxZSwgMHgzOCwgMHg2MiwgMHg4NCwgMHg2YywgMHhhMCwgMHg1MiwgMHhkNywKKyAgMHhhNCwgMHhlMiwgMHg5NCwgMHhjZSwgMHg4MywgMHg2OSwgMHhiNiwgMHgxOCwgMHgwMiwgMHg3NiwgMHhlNywgMHg0MywKKyAgMHg2MSwgMHgxMCwgMHg5OCwgMHg0OCwgMHgxMiwgMHgzMCwgMHg5ZCwgMHg2MCwgMHgwMCwgMHgyMiwgMHhlNiwgMHg0ZiwKKyAgMHgyYiwgMHg0MywgMHg0YSwgMHgzYSwgMHhjMiwgMHhlMCwgMHgzNywgMHgxMCwgMHgzZiwgMHhlNCwgMHgzNiwgMHhiOCwKKyAgMHg0NCwgMHg1MywgMHhiMSwgMHhmOSwgMHg1MywgMHg1MSwgMHhkNiwgMHhhOCwgMHgyNSwgMHgwNiwgMHg3MCwgMHhiZCwKKyAgMHg1MCwgMHhlYywgMHhkZSwgMHhmYiwgMHhhZiwgMHg4MCwgMHhjYSwgMHhjMCwgMHhmMywgMHg5YywgMHhkMSwgMHhjOSwKKyAgMHgzMywgMHgyZCwgMHgwMiwgMHg1MiwgMHg4MywgMHhjNSwgMHg3YiwgMHg1YSwgMHg2NywgMHg0MywgMHhmOCwgMHhmZiwKKyAgMHg1MiwgMHgzNiwgMHhhYywgMHhkMiwgMHg2NCwgMHhlMSwgMHg5MiwgMHgzOCwgMHg3YSwgMHhhMiwgMHhlYywgMHg1ZCwKKyAgMHg4YSwgMHgzYywgMHgwOCwgMHgyZSwgMHg4ZSwgMHgzNiwgMHhlYywgMHg4ZSwgMHg2MiwgMHg1MSwgMHg4MiwgMHhlNiwKKyAgMHhjZSwgMHg1MywgMHg4OCwgMHhkYiwgMHg3MiwgMHhkMCwgMHgzYSwgMHg3YiwgMHg4YiwgMHhkZSwgMHhiZiwgMHgxZiwKKyAgMHgwYSwgMHg4OSwgMHgxYywgMHhjNSwgMHhhYiwgMHhjOCwgMHhhNSwgMHg1OSwgMHhiZCwgMHgxYiwgMHhiNSwgMHhmYywKKyAgMHhhOSwgMHg5OSwgMHgyMywgMHhmMSwgMHgxNywgMHgyZCwgMHhiZSwgMHhjNCwgMHhmNSwgMHg5YywgMHg0ZCwgMHhlMywKKyAgMHg3YiwgMHgyYywgMHg5YiwgMHg2NSwgMHg4ZiwgMHg1ZiwgMHhlMywgMHgxMywgMHg5MCwgMHgwOCwgMHhhZCwgMHgzOCwKKyAgMHhhZCwgMHhkNCwgMHhkZSwgMHg1YiwgMHhiZCwgMHhmOSwgMHgzMiwgMHg3YywgMHgxMywgMHhlYiwgMHhlNiwgMHhlNywKKyAgMHhiNiwgMHgxYSwgMHgyMSwgMHg2OSwgMHhjNiwgMHgyZiwgMHgyNCwgMHg2YiwgMHgwOCwgMHgyOSwgMHhkMSwgMHg0YywKKyAgMHgzNCwgMHhkMSwgMHgzMSwgMHg4OCwgMHg4NCwgMHgzZCwgMHhhOSwgMHhmMCwgMHhlOSwgMHg1OSwgMHhhMSwgMHgxOSwKKyAgMHg5NywgMHg0ZSwgMHg3OSwgMHhjZCwgMHhlYiwgMHhjYiwgMHg5ZSwgMHgyNywgMHg0YiwgMHgyMywgMHgzMiwgMHgyMywKKyAgMHhhNiwgMHg2ZCwgMHgwNiwgMHgwOCwgMHhiMCwgMHhlOCwgMHg1MywgMHg4MiwgMHg3MCwgMHhhYSwgMHgzMiwgMHgzOSwKKyAgMHg4MCwgMHhlZiwgMHgxNiwgMHg4MiwgMHhkYywgMHhlZSwgMHg3ZiwgMHg3MCwgMHg3MCwgMHg0YSwgMHhkMSwgMHhjYiwKKyAgMHg0ZSwgMHg5NCwgMHgyYSwgMHg0YiwgMHgyYSwgMHg1NywgMHgwNSwgMHg0NSwgMHg0NiwgMHgxYywgMHg2NywgMHgwMiwKKyAgMHgyZiwgMHhkMywgMHgxOCwgMHhmMiwgMHg5MiwgMHgwMywgMHgwNywgMHgyMSwgMHgxYSwgMHg4ZCwgMHgwMCwgMHgwMCwKKyAgMHgwZSwgMHgwMSwgMHhmZiwgMHgzNywgMHg2NCwgMHhhNywgMHhiMiwgMHg0OCwgMHg0MiwgMHg0NCwgMHgxMCwgMHg5OCwKKyAgMHgyNCwgMHg4MywgMHgyNSwgMHg1OCwgMHhiYiwgMHhiYSwgMHhiNCwgMHgzNCwgMHhiOCwgMHgwMCwgMHg1OCwgMHg2YywKKyAgMHhlZSwgMHhkZiwgMHhmYSwgMHg4ZCwgMHgxMCwgMHgyZiwgMHgxYiwgMHhjNCwgMHg0OSwgMHg4MCwgMHhiYSwgMHhlZiwKKyAgMHhjZSwgMHhkYiwgMHhmOCwgMHg3ZCwgMHgzYiwgMHgxYiwgMHg2YSwgMHhjYSwgMHhmZCwgMHg5MiwgMHg2YiwgMHg1ZiwKKyAgMHgyNSwgMHhhYiwgMHg2MiwgMHhmMCwgMHgyNiwgMHgxNCwgMHgzYywgMHg0NywgMHg5NSwgMHg0OCwgMHgzNiwgMHg4YSwKKyAgMHg4MiwgMHg3NSwgMHg0YywgMHg2ZiwgMHg4MSwgMHhlNiwgMHhiZCwgMHgyMywgMHgxNywgMHgzMywgMHgwZiwgMHg0YywKKyAgMHhmYiwgMHgyNSwgMHg1YywgMHgyNiwgMHgxZSwgMHgyYiwgMHhhNywgMHg4NywgMHhmYywgMHg5NCwgMHhjZCwgMHgyZSwKKyAgMHg0MywgMHg2MywgMHg0MCwgMHhkMCwgMHhmNCwgMHhhZiwgMHhmZSwgMHgwZiwgMHhlNiwgMHg0ZCwgMHg4ZCwgMHg2NiwKKyAgMHg5ZSwgMHhmYywgMHg3MywgMHhhZSwgMHhlYSwgMHgzYywgMHg2NCwgMHhhMiwgMHhjYSwgMHhhNywgMHg1MSwgMHhhNiwKKyAgMHhhZSwgMHhhYiwgMHgxZiwgMHg2NiwgMHg2MSwgMHg2MCwgMHhkZCwgMHg5YywgMHhiYiwgMHhkYiwgMHhiMywgMHgwZiwKKyAgMHg4ZiwgMHg2NywgMHg3ZCwgMHgzYywgMHgzOCwgMHhhMiwgMHg2NywgMHgxMiwgMHhlZiwgMHhiZSwgMHg0OSwgMHhmMywKKyAgMHg4MCwgMHg4YywgMHhlMSwgMHg5ZCwgMHg5ZCwgMHgyNSwgMHg0MCwgMHgzNywgMHg5ZCwgMHg2MSwgMHg0YSwgMHg5OSwKKyAgMHgyNywgMHhjZSwgMHgwYywgMHg4MCwgMHg2MCwgMHhmOCwgMHhmZSwgMHhkYiwgMHgxYywgMHhhZiwgMHhhMywgMHhmYiwKKyAgMHgzNCwgMHhlOCwgMHgwNCwgMHgwYiwgMHgyOSwgMHhmNSwgMHg4YSwgMHg3NCwgMHg0MywgMHg4NCwgMHg2MiwgMHg1MiwKKyAgMHgzOSwgMHhmOCwgMHgwNSwgMHhhMiwgMHhkNiwgMHg2MSwgMHhkNywgMHgxNCwgMHg4NywgMHhlOCwgMHhlNSwgMHg1MywKKyAgMHg0NiwgMHg1ZSwgMHgxZCwgMHgyOSwgMHgxYiwgMHg1ZSwgMHhhNSwgMHg0NCwgMHg5NiwgMHhlZCwgMHhhNywgMHgzOCwKKyAgMHgyMSwgMHg0MSwgMHhiNSwgMHg0MSwgMHg2YiwgMHhkOCwgMHgyYSwgMHg0ZCwgMHg0MCwgMHhiZiwgMHg5ZiwgMHg4OSwKKyAgMHgyZCwgMHg2NSwgMHg2ZSwgMHgxMywgMHhmNiwgMHhmYSwgMHgzYiwgMHg4NSwgMHgwYSwgMHgyZSwgMHg3MSwgMHg0YywKKyAgMHgwMCwgMHg2NCwgMHhiMiwgMHhlNSwgMHgzZiwgMHgwYiwgMHhmMCwgMHg4ZSwgMHgwOSwgMHhjMSwgMHg2MCwgMHgxMSwKKyAgMHgyOSwgMHhkNSwgMHgzYSwgMHg2NSwgMHg0YywgMHhlNiwgMHgyZSwgMHhhMSwgMHgyNiwgMHg5MywgMHgwYiwgMHhiNywKKyAgMHhjMSwgMHgzZiwgMHg4NiwgMHg2ZiwgMHhhOCwgMHhjYywgMHg0OSwgMHg4MCwgMHhkMSwgMHg1MCwgMHhhYSwgMHhlYywKKyAgMHg1ZSwgMHgyZCwgMHgzZCwgMHg3OCwgMHhjNiwgMHg0ZiwgMHgzZSwgMHhjYywgMHhjOCwgMHhhNCwgMHgwMCwgMHhjZiwKKyAgMHhmOSwgMHg3OCwgMHg3NywgMHhjMCwgMHg0NiwgMHg4ZSwgMHg0NywgMHhmNiwgMHg5ZSwgMHhmOSwgMHg4ZCwgMHg0NiwKKyAgMHhiNywgMHg4NywgMHhjYiwgMHgxNiwgMHhjZiwgMHgzNSwgMHhlYSwgMHhkNSwgMHg3YiwgMHgwNywgMHg2NCwgMHhhZSwKKyAgMHg3MCwgMHgxOCwgMHhkZCwgMHg1OCwgMHhiYywgMHhmMiwgMHhmNywgMHhhOCwgMHg0OSwgMHgwNywgMHgyNiwgMHg5YywKKyAgMHhjYiwgMHg0NCwgMHg1ZiwgMHgxNSwgMHg3MywgMHhmMSwgMHhiNiwgMHhjYiwgMHgwNSwgMHhlOSwgMHhlNiwgMHhiZSwKKyAgMHg2MCwgMHhkZCwgMHhjZSwgMHhkOSwgMHgwNywgMHg2NSwgMHhkMSwgMHhmNCwgMHhjOSwgMHg2OSwgMHgyYSwgMHg0MiwKKyAgMHg5YiwgMHhmMCwgMHhmNCwgMHg4OSwgMHgxNCwgMHg0MywgMHg1NiwgMHhmNiwgMHhkOSwgMHgyMywgMHg0NiwgMHhiMiwKKyAgMHhmMywgMHg4MCwgMHhhNywgMHgyZCwgMHg4MSwgMHg3OSwgMHg5MiwgMHg0YywgMHhmNywgMHgxNiwgMHgzMiwgMHhmMSwKKyAgMHhiNiwgMHgyZCwgMHg3YiwgMHgxMywgMHg5ZiwgMHhkYSwgMHhhYiwgMHg1ZSwgMHg0MSwgMHgzNiwgMHhiNSwgMHg1NywKKyAgMHg4YywgMHgxMywgMHhmZiwgMHhkYSwgMHhlNywgMHg3YSwgMHg0YSwgMHhkNSwgMHhhYywgMHhkMCwgMHg0MCwgMHhhYiwKKyAgMHg4OCwgMHhiNCwgMHgxMSwgMHgwZSwgMHgwMCwgMHgwMSwgMHg1MiwgMHg0NSwgMHgxZiwgMHhhZCwgMHg4MiwgMHg2NSwKKyAgMHgyOSwgMHg5YiwgMHhjOSwgMHhlYSwgMHhlNCwgMHg5YiwgMHg5ZCwgMHg0ZSwgMHg3NCwgMHgxMSwgMHg0NCwgMHgwZSwKKyAgMHgyMSwgMHgxYSwgMHg4ZiwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHgzMSwgMHg2OCwgMHhhMiwgMHhjMSwKKyAgMHhkMCwgMHhhMywgMHgxMCwgMHgwOSwgMHg1NiwgMHg2ZiwgMHg0YiwgMHgyNSwgMHg2YSwgMHgwZCwgMHg1OCwgMHhjZCwKKyAgMHg1ZCwgMHg1MywgMHg3YywgMHgzMiwgMHhjNSwgMHgwMCwgMHgwOSwgMHgzNCwgMHg3YiwgMHhlNiwgMHhhMywgMHgxZiwKKyAgMHhjNCwgMHg0YSwgMHhjMSwgMHhiYSwgMHgxNiwgMHhmMSwgMHhmZiwgMHgyYywgMHg3NSwgMHgzMCwgMHhmMCwgMHg1ZSwKKyAgMHg2OCwgMHhjZiwgMHg3YSwgMHhhMiwgMHgyMywgMHg2OSwgMHg3MSwgMHg1OSwgMHg1YiwgMHhmNywgMHhmNCwgMHgzNywKKyAgMHgwNiwgMHg3NSwgMHhjOCwgMHhhNCwgMHgyYywgMHhjZiwgMHhjZCwgMHhlNCwgMHg1OSwgMHhkYywgMHhjZCwgMHg1OSwKKyAgMHhhZSwgMHgzNCwgMHg3YywgMHgyYywgMHgzNiwgMHhiYiwgMHg5NCwgMHhjMSwgMHhkYiwgMHg3MCwgMHhlNiwgMHhmMywKKyAgMHgwNCwgMHg5YiwgMHgwOSwgMHg1ZSwgMHg5NCwgMHhjOSwgMHgyZCwgMHhkOSwgMHgyMywgMHg3OCwgMHhmNywgMHg5YSwKKyAgMHg0OSwgMHhjZCwgMHhhMiwgMHg4ZCwgMHhmNSwgMHhhYiwgMHg1YywgMHgyNywgMHg1ZiwgMHg4YywgMHhhZiwgMHhkMywKKyAgMHg0ZiwgMHg5YSwgMHgwMCwgMHhjYSwgMHhmNSwgMHg1NSwgMHg3OSwgMHg3NywgMHg4OSwgMHg4MCwgMHhhOSwgMHg0NSwKKyAgMHhlOSwgMHgwMiwgMHgwNSwgMHhjMSwgMHgwMiwgMHhiNywgMHg1MSwgMHg0MiwgMHgxMCwgMHgwMSwgMHgyYiwgMHg3ZSwKKyAgMHhhNiwgMHhhMSwgMHg0MiwgMHhhOSwgMHg5NiwgMHg4YywgMHhhNywgMHgzMiwgMHg1MSwgMHg1YiwgMHg0MCwgMHgzOSwKKyAgMHgwMCwgMHgwNSwgMHg5NSwgMHhmMywgMHg1NiwgMHg3ZCwgMHg2YSwgMHhjNywgMHg4MSwgMHhjZSwgMHg1ZCwgMHg4MCwKKyAgMHgwOSwgMHhkNSwgMHgyMCwgMHg0ZCwgMHhkZCwgMHhkMCwgMHg0YywgMHgxNCwgMHgyMCwgMHhiMSwgMHgyYiwgMHgyOSwKKyAgMHg5NywgMHgxNCwgMHg5YywgMHhmMSwgMHg2YiwgMHgwZCwgMHgzOCwgMHhiNCwgMHgwYiwgMHgzYSwgMHgwOCwgMHgwZSwKKyAgMHhjNiwgMHhmYywgMHgxNiwgMHg2MywgMHhmNywgMHhhOSwgMHg5YywgMHg4YSwgMHg3ZiwgMHgzMSwgMHhkMSwgMHhmZiwKKyAgMHg2NSwgMHhhOSwgMHg4OSwgMHhhYywgMHgyZCwgMHhkNSwgMHg0YywgMHgzMSwgMHgxZSwgMHg5MSwgMHhjNywgMHhjYiwKKyAgMHhhYSwgMHhhNCwgMHg5YSwgMHhjYywgMHg5OCwgMHhlZiwgMHg1NCwgMHg5MywgMHgxMCwgMHg3MCwgMHgxMywgMHg3MCwKKyAgMHgwZCwgMHg5MSwgMHg3NywgMHg5YiwgMHhiOCwgMHhmMSwgMHhkNywgMHgyNiwgMHg3ZiwgMHhmMSwgMHg5NywgMHhhZSwKKyAgMHhkYiwgMHg1NywgMHhkZiwgMHg4ZCwgMHhjYSwgMHhhMCwgMHhlNiwgMHg2ZCwgMHhkMSwgMHhiMiwgMHhiMSwgMHg1YywKKyAgMHg1ZiwgMHgyYywgMHgzYiwgMHhiNSwgMHhiZSwgMHhiMSwgMHhkNSwgMHg5NCwgMHgxOCwgMHgzMSwgMHgzZCwgMHhhZCwKKyAgMHg0ZiwgMHgzNiwgMHgzYiwgMHgyMywgMHgxNywgMHhkMCwgMHhhYywgMHhlNiwgMHgyOCwgMHhlZSwgMHhlMywgMHhjMywKKyAgMHhhMiwgMHhiMSwgMHg0ZCwgMHhiOSwgMHgzNywgMHhlNCwgMHg1NywgMHgzNCwgMHgzMSwgMHg1NiwgMHgyOSwgMHg4OSwKKyAgMHhlNywgMHhkOCwgMHg4YiwgMHg2NSwgMHhiNSwgMHg3MCwgMHhkYiwgMHgzOCwgMHg0NiwgMHg2NSwgMHg1OSwgMHhjMiwKKyAgMHg5MCwgMHg4YSwgMHhiYywgMHhjMiwgMHg4YywgMHgzNSwgMHgzZSwgMHgwZSwgMHg1YSwgMHg2MSwgMHgxYSwgMHhkYiwKKyAgMHgzMCwgMHhhMiwgMHg1MCwgMHg3NywgMHgzYiwgMHg3NSwgMHgyYSwgMHgxYiwgMHhhYSwgMHhmMiwgMHgzMSwgMHhiYSwKKyAgMHg4MywgMHg5MywgMHg4YSwgMHhiYSwgMHg4MiwgMHg0ZSwgMHg2YywgMHg1NywgMHg4NiwgMHg5NiwgMHhkOSwgMHg1OSwKKyAgMHhiMiwgMHhjNywgMHg0NSwgMHhkMSwgMHhlYiwgMHg1MSwgMHgzOSwgMHhlNiwgMHhiZCwgMHhkYywgMHg3MCwgMHhkMywKKyAgMHhjMiwgMHgxNywgMHhhNSwgMHgyOSwgMHhjZiwgMHgxOSwgMHhmMSwgMHhmMSwgMHg2MiwgMHg4YiwgMHgyNSwgMHg3ZiwKKyAgMHhiYywgMHgwYiwgMHgyOSwgMHg3OCwgMHhhMSwgMHhmNiwgMHhjNSwgMHhiMiwgMHhmNywgMHg1ZiwgMHhjYiwgMHg4NCwKKyAgMHhiOCwgMHhkYywgMHgxYiwgMHg3MywgMHg1OCwgMHgxYSwgMHgzMywgMHg0YywgMHhhYSwgMHg1NSwgMHgyYywgMHhhZSwKKyAgMHg0YSwgMHgzMiwgMHgyNSwgMHgxOSwgMHg4MywgMHg4MSwgMHhhNywgMHgyYSwgMHg0MCwgMHhlMCwgMHgyMSwgMHgxYSwKKyAgMHg4ZiwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwZiwgMHhmZiwgMHgzZiwgMHg2YSwgMHg4NCwgMHhhMCwgMHg4NiwgMHhhOSwKKyAgMHhiNywgMHhjMSwgMHgxNSwgMHgyYSwgMHg5NSwgMHhhMSwgMHg1YSwgMHgzOCwgMHg2OSwgMHhhYiwgMHhhMywgMHgwMywKKyAgMHg4MCwgMHgxOSwgMHg2YiwgMHg3MiwgMHg3ZSwgMHg2NSwgMHg3YywgMHhiNiwgMHhlMywgMHhlOCwgMHg5YywgMHg2NiwKKyAgMHhiYywgMHhlMSwgMHg0MSwgMHg3MywgMHhlYSwgMHg0MiwgMHhkYywgMHg0ZiwgMHhkYywgMHgzNSwgMHhmZCwgMHg3MywKKyAgMHhjZiwgMHg0OCwgMHhlYiwgMHhmYiwgMHhiNywgMHhlMCwgMHgyMiwgMHg4YiwgMHg3ZiwgMHg5YiwgMHg0MCwgMHg4OSwKKyAgMHgzOCwgMHgwOSwgMHg0ZiwgMHg4NiwgMHgxYiwgMHgwMiwgMHg5ZiwgMHgxNywgMHg4OCwgMHg5YiwgMHgwZCwgMHhhNSwKKyAgMHhlMCwgMHgzOSwgMHgyYiwgMHhjNiwgMHgyMiwgMHg0NSwgMHg2MiwgMHgzNywgMHhlNCwgMHg0MywgMHgyZCwgMHhiOCwKKyAgMHg4ZCwgMHhjMCwgMHg2ZiwgMHg1ZiwgMHg2ZSwgMHhlYywgMHg3YywgMHhiYiwgMHg5NCwgMHgyMCwgMHg4YiwgMHhjOSwKKyAgMHg5ZiwgMHg5NCwgMHgyYywgMHgxNSwgMHhhYSwgMHhiMSwgMHgwMiwgMHg2MiwgMHgyNywgMHgxMiwgMHg3OSwgMHhlNCwKKyAgMHgwNCwgMHgwMCwgMHg5ZCwgMHg2NiwgMHhjYiwgMHg3YSwgMHhmYywgMHg1ZSwgMHg5OSwgMHhjNCwgMHg0YywgMHg1OSwKKyAgMHgxOCwgMHhhOCwgMHg4MSwgMHhkOCwgMHg1YiwgMHhhYSwgMHg4MCwgMHgwMCwgMHg1NSwgMHg2NCwgMHhmNiwgMHgwMSwKKyAgMHg5NywgMHgyMSwgMHgwZiwgMHg2YSwgMHhmOSwgMHg3ZSwgMHg3NCwgMHg1MCwgMHhjOCwgMHhiMiwgMHhlMCwgMHgxNCwKKyAgMHgxNiwgMHhmYSwgMHgzOSwgMHgxNCwgMHg1ZSwgMHg5MCwgMHgxZCwgMHhhZCwgMHgxYywgMHgwMSwgMHhhZCwgMHhmYiwKKyAgMHgyMSwgMHg3MSwgMHhkMSwgMHg2OCwgMHg4YSwgMHgwNywgMHhhNiwgMHg0MiwgMHgzYywgMHgyNCwgMHg2ZCwgMHg1NSwKKyAgMHgyZiwgMHg3ZiwgMHg3MiwgMHhmMSwgMHhhYSwgMHhjOCwgMHgzZSwgMHhiZiwgMHg0MiwgMHg4MCwgMHg5NSwgMHg3MywKKyAgMHgzNywgMHgzYiwgMHhhMSwgMHhjNywgMHgwNiwgMHhkNywgMHg3YywgMHhhZCwgMHhlYiwgMHhmOSwgMHhkYywgMHg3ZCwKKyAgMHhmMSwgMHg0MSwgMHgwMywgMHg0NywgMHhmNywgMHhmNywgMHg0ZiwgMHg3MSwgMHhmNywgMHhlNywgMHg3MiwgMHg5ZSwKKyAgMHg5MywgMHhlNSwgMHg4YywgMHg4ZCwgMHhiNywgMHgzNywgMHgzZCwgMHhlMywgMHhjZiwgMHgzYywgMHhhYiwgMHgzMywKKyAgMHgwNywgMHhhOCwgMHhmNSwgMHhlZSwgMHgzOCwgMHhjZSwgMHgzYiwgMHhmOSwgMHgzYywgMHhkYSwgMHg3MywgMHhlMSwKKyAgMHhiMSwgMHgyYSwgMHg2YSwgMHg1OSwgMHg3YiwgMHgwYywgMHhhMiwgMHg0MCwgMHgxYSwgMHhiNSwgMHhjNSwgMHhiZCwKKyAgMHhiMiwgMHg3ZiwgMHg1ZCwgMHgzNiwgMHhlMCwgMHg5ZCwgMHg4YywgMHhhZSwgMHgwYSwgMHgzMCwgMHhkYywgMHhiNiwKKyAgMHgxNywgMHg0ZSwgMHhmMSwgMHg2ZiwgMHhhMiwgMHg1MCwgMHhhYSwgMHgyMywgMHhhOCwgMHhlMCwgMHg0NywgMHgyNywKKyAgMHgwZCwgMHhlZiwgMHg0OSwgMHg0ZiwgMHhkZiwgMHhiNCwgMHhjOSwgMHhkMSwgMHgzYSwgMHhiZSwgMHgxMSwgMHg0MiwKKyAgMHhhNSwgMHgzOCwgMHhhZCwgMHhkNiwgMHhkMCwgMHg4ZiwgMHhhMCwgMHg5MywgMHg4OSwgMHgwZSwgMHhmZCwgMHgxNCwKKyAgMHhkOCwgMHg4NiwgMHgwOCwgMHhmMCwgMHg4MSwgMHhiYSwgMHg5NSwgMHg1MiwgMHg2YywgMHhjYywgMHg4YSwgMHgwYiwKKyAgMHhkYSwgMHg2MiwgMHgxMCwgMHgwNCwgMHg1MCwgMHgyYiwgMHhkYSwgMHhlNCwgMHhjZSwgMHg2MiwgMHgxMiwgMHhhNCwKKyAgMHgwMCwgMHg4MywgMHg3MiwgMHg4MSwgMHgwMiwgMHg5NiwgMHhiMiwgMHhhOSwgMHgyMSwgMHgxMCwgMHgwMCwgMHgzOCwKKyAgMHgyMSwgMHgxYSwgMHg4YSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhmZiwgMHgzNywgMHg2NSwgMHhhNCwgMHhkOCwKKyAgMHhlOCwgMHg2YywgMHgzYSwgMHgxMywgMHgwOCwgMHg1ZSwgMHgwYiwgMHhkNSwgMHg2NCwgMHhhYSwgMHhkNSwgMHg1NCwKKyAgMHhkMSwgMHgxYSwgMHg1YywgMHgwYiwgMHgwMSwgMHgwZSwgMHgwMiwgMHg0NywgMHhlZiwgMHgwZiwgMHgyNiwgMHhjOSwKKyAgMHhhMCwgMHhjMSwgMHg4MSwgMHgzNiwgMHg2NSwgMHg3MywgMHg1MiwgMHhkOCwgMHhhYywgMHg0MiwgMHg1ZiwgMHg4YSwKKyAgMHhlNiwgMHgzYiwgMHg1NywgMHhlYSwgMHhlZiwgMHgzOCwgMHg1YiwgMHgxZCwgMHg2MiwgMHgzMywgMHg0NSwgMHgyNiwKKyAgMHg5NSwgMHhhMywgMHhhNSwgMHg5OSwgMHg3NiwgMHg0ZiwgMHhmNywgMHg3ZiwgMHg5YiwgMHhlNiwgMHg1NSwgMHhjYSwKKyAgMHgyOSwgMHhiZSwgMHgwYSwgMHhlMSwgMHg4YywgMHgzMSwgMHhhMCwgMHgxMiwgMHgzNCwgMHg1OCwgMHg1NiwgMHgxNywKKyAgMHhhNCwgMHhmNSwgMHg2NywgMHg2NiwgMHg2OSwgMHgwYywgMHg1NSwgMHgxNSwgMHg5ZiwgMHg5OCwgMHg1MiwgMHhlMywKKyAgMHg2YiwgMHhmYywgMHgzZCwgMHgxZCwgMHg4NiwgMHhkMSwgMHg4NiwgMHhjMiwgMHhmZCwgMHhmNiwgMHhmMywgMHgyMCwKKyAgMHhhNCwgMHg4YSwgMHgxYiwgMHgyNSwgMHhmOCwgMHgyZiwgMHg3NCwgMHhhZCwgMHhkYiwgMHhhZSwgMHhlOCwgMHg4MywKKyAgMHg1YiwgMHgxZSwgMHg3OSwgMHhkZCwgMHg1YSwgMHgzZSwgMHgzNCwgMHgyMSwgMHg5YywgMHhmYiwgMHg3MiwgMHhhMCwKKyAgMHgxZiwgMHgyYywgMHgwNSwgMHhkNywgMHhlYywgMHhmNCwgMHhlYSwgMHhjOCwgMHg2MCwgMHg5MCwgMHhjNiwgMHg5YywKKyAgMHhjNCwgMHhiOSwgMHg1MSwgMHgzZCwgMHg3OSwgMHhkMywgMHg2ZCwgMHhiNCwgMHgyNiwgMHg3OSwgMHhkOCwgMHg0NSwKKyAgMHgwOCwgMHg4MiwgMHgxNSwgMHhiNywgMHgzOSwgMHg3MiwgMHg0YywgMHgxOCwgMHg5MywgMHhiYywgMHg1MiwgMHgxMiwKKyAgMHg1YSwgMHgwNSwgMHgyZCwgMHgyYiwgMHhjYSwgMHhlMSwgMHgyMiwgMHg4NCwgMHhhZiwgMHg2YiwgMHgyNSwgMHg3MSwKKyAgMHg5YSwgMHg1NywgMHg1ZCwgMHhjNywgMHhkNywgMHg3OCwgMHhmZiwgMHg0NSwgMHg0OCwgMHhkMSwgMHgyOCwgMHhkYSwKKyAgMHg2OSwgMHg5OCwgMHgwNywgMHg1MiwgMHhhMCwgMHgwMCwgMHg4ZiwgMHhlNSwgMHg3YiwgMHhlZCwgMHg2ZSwgMHg2NywKKyAgMHgwMCwgMHg5YiwgMHhiOCwgMHhkMSwgMHg1OCwgMHhhMiwgMHhmNSwgMHg0NiwgMHhmYywgMHgyZSwgMHhkNiwgMHhhYSwKKyAgMHhlYiwgMHgzNCwgMHgxNywgMHg3NywgMHgyMiwgMHgxYSwgMHhhMywgMHhhMiwgMHhjYiwgMHgwNiwgMHhlYywgMHhmMSwKKyAgMHgxMiwgMHhiMCwgMHg2ZSwgMHg2NiwgMHhjZSwgMHhkMSwgMHhhNywgMHhhNCwgMHhkMiwgMHg0YywgMHgzNCwgMHhiNywKKyAgMHgzMiwgMHg2YSwgMHg3ZCwgMHg0NywgMHhkNiwgMHg1YSwgMHg5NywgMHgwOCwgMHgyMCwgMHgzMCwgMHhmNCwgMHhkNywKKyAgMHg5YiwgMHg0YSwgMHg5MSwgMHgzNywgMHgwNywgMHgxMiwgMHhlNiwgMHgwZSwgMHg2MiwgMHhmMiwgMHhiZSwgMHhiMiwKKyAgMHhhYiwgMHgzZSwgMHg2ZSwgMHgwNywgMHhjNywgMHg5ZiwgMHgxOSwgMHhlYiwgMHhjOSwgMHg3YywgMHg4ZiwgMHg1MiwKKyAgMHhjOCwgMHg5YywgMHhjMywgMHg5OSwgMHg5ZiwgMHg3MywgMHgxNiwgMHhhMSwgMHgyYSwgMHg5YSwgMHhmOCwgMHg1YSwKKyAgMHg0NywgMHhjMywgMHgyMCwgMHgxNywgMHhiYiwgMHgyNywgMHg2YSwgMHg0ZiwgMHhlNCwgMHhmYywgMHhhYywgMHg0ZCwKKyAgMHhhZiwgMHhhYSwgMHhiZiwgMHhmMiwgMHhjNCwgMHhkMiwgMHgyYSwgMHhiYywgMHg2YiwgMHg3ZSwgMHg5ZiwgMHg0ZCwKKyAgMHg5NiwgMHhlMCwgMHgwZCwgMHhkYywgMHhiMSwgMHhjZiwgMHhiMCwgMHg3OCwgMHgzYSwgMHhlMywgMHg1NiwgMHg4ZSwKKyAgMHg5MSwgMHgxMywgMHhkMywgMHhmNiwgMHg1OSwgMHg2MSwgMHgwMCwgMHhmOCwgMHg0YiwgMHhhNCwgMHg3MiwgMHhjYiwKKyAgMHgyNiwgMHhkYiwgMHg2NiwgMHg3NCwgMHg2NSwgMHhkNSwgMHhhMiwgMHg3MSwgMHhiMSwgMHg0NCwgMHg2NSwgMHg0NywKKyAgMHgwNiwgMHhjOSwgMHg3MywgMHgxYiwgMHhhMiwgMHg5NiwgMHgwMywgMHhhNCwgMHg2MCwgMHhhMCwgMHg4OCwgMHhkZSwKKyAgMHgzOCwgMHg3NSwgMHhmNiwgMHhmNiwgMHhlNSwgMHhkNiwgMHhkYSwgMHhlMSwgMHg1YiwgMHhkYSwgMHg5NywgMHgxMCwKKyAgMHg0ZiwgMHhhNiwgMHg2YywgMHgzMSwgMHhkZiwgMHgyYywgMHgxYiwgMHg5NywgMHg1MCwgMHhiMSwgMHg3OCwgMHhjZCwKKyAgMHhiYSwgMHhmZCwgMHgxMCwgMHhhMywgMHg5MiwgMHg0MywgMHgxYSwgMHg2NiwgMHhhMywgMHgyMSwgMHgxMSwgMHgxMCwKKyAgMHgyYSwgMHg4YSwgMHg5NCwgMHhkMCwgMHgyZCwgMHhkMywgMHgxMiwgMHhlYiwgMHg4MCwgMHg5YywgMHg3NywgMHgzOCwKKyAgMHhjMSwgMHgzMCwgMHgwZSwgMHgyMSwgMHgxYSwgMHg4ZSwgMHg4MCwgMHgwNCwgMHgwZiwgMHgwMSwgMHhiZiwgMHgzMywKKyAgMHg2NywgMHhhMywgMHhkOCwgMHg2MCwgMHhhOCwgMHgzNiwgMHgxOCwgMHhjMCwgMHgxMSwgMHhlMiwgMHg1YywgMHhjNiwKKyAgMHhhNSwgMHg2MiwgMHhlMiwgMHhkMSwgMHg2YiwgMHhkNiwgMHhhMSwgMHg4NSwgMHhjMCwgMHgxYywgMHgxOCwgMHg4OCwKKyAgMHg5MSwgMHhhNCwgMHgzZSwgMHgzYiwgMHg5YiwgMHhiOSwgMHhkNywgMHgyMSwgMHgwNywgMHhiYywgMHgzNCwgMHg0NywKKyAgMHg4ZSwgMHhmNiwgMHg1NiwgMHg5ZCwgMHg4NCwgMHg2YywgMHhmYywgMHgxYiwgMHgxNiwgMHgwNSwgMHg3MSwgMHhhYSwKKyAgMHgxMiwgMHg1MywgMHgzZCwgMHg1YiwgMHhjNCwgMHhhNCwgMHg5YiwgMHhiYiwgMHhiOSwgMHhkOCwgMHg3ZiwgMHhkMCwKKyAgMHg2YywgMHg4ZCwgMHg4YiwgMHg4NCwgMHhkZiwgMHhmMywgMHhlNywgMHg1YiwgMHg2OCwgMHgzMywgMHg0ZiwgMHg0MSwKKyAgMHhhYSwgMHhjYSwgMHhiZiwgMHg2ZiwgMHhiYywgMHg5NSwgMHgxYywgMHgzNywgMHhhMiwgMHhkNCwgMHhkMCwgMHhjZSwKKyAgMHgyNSwgMHg1NywgMHg0MywgMHhiOSwgMHg0ZiwgMHg1MywgMHhjNSwgMHg5MywgMHgwNCwgMHhlMiwgMHhiYSwgMHgzOSwKKyAgMHg2OCwgMHhkMSwgMHhmZSwgMHgwYSwgMHhhYSwgMHhiMywgMHhhOCwgMHhkOSwgMHgzMCwgMHhiZCwgMHg5YSwgMHg2NywKKyAgMHgwYiwgMHg2YywgMHgyOSwgMHhlZiwgMHgwOCwgMHg0ZCwgMHg1MSwgMHg4MiwgMHg5MywgMHgzMiwgMHhjZSwgMHg4MiwKKyAgMHgwMCwgMHhhOCwgMHgwNywgMHg4MywgMHg3NywgMHg2YSwgMHhjMSwgMHgyMywgMHg1MCwgMHgwYiwgMHg0NSwgMHgyNSwKKyAgMHg2MCwgMHgxZSwgMHg2OCwgMHgwMSwgMHg3NSwgMHhhNCwgMHg0YiwgMHgzMywgMHhhZCwgMHgxZSwgMHg5ZiwgMHhkMCwKKyAgMHgwMSwgMHg2ZSwgMHhiMSwgMHhiYywgMHgyNywgMHg0NCwgMHg1YiwgMHhhZSwgMHgwOCwgMHhkZiwgMHgzMiwgMHg0YSwKKyAgMHhkMiwgMHgzYywgMHhiMCwgMHgwMSwgMHgzOCwgMHhlZSwgMHgxMywgMHhhNiwgMHg5OSwgMHgyZCwgMHgxZCwgMHg4MywKKyAgMHg3MywgMHgxMywgMHg3NCwgMHg2YSwgMHhkZCwgMHhhOCwgMHgyNiwgMHhlZCwgMHhkNCwgMHg4NCwgMHgwOCwgMHgwYywKKyAgMHg1NCwgMHg0MSwgMHgxMiwgMHg5OSwgMHg4ZCwgMHg4OSwgMHgxNiwgMHhhOSwgMHgxNSwgMHhjNCwgMHg4ZSwgMHg4NSwKKyAgMHhiOCwgMHg5NywgMHgwYiwgMHg0YSwgMHgwZCwgMHhjOCwgMHhjNSwgMHhkOSwgMHgxYiwgMHhiMywgMHgyZSwgMHgzNCwKKyAgMHg4YiwgMHhmMywgMHg2NywgMHhjNywgMHhkNiwgMHg4MywgMHhlMSwgMHhkYiwgMHg5YSwgMHhiNywgMHgyNywgMHhkNCwKKyAgMHg3NCwgMHg2MywgMHhlMywgMHg3NSwgMHhmNiwgMHg1NCwgMHhjYSwgMHgzZSwgMHg2NSwgMHhhNywgMHhkZCwgMHg5OCwKKyAgMHg2ZCwgMHhiNSwgMHg4YSwgMHg2MSwgMHhhZiwgMHhlYiwgMHg2YiwgMHg5ZCwgMHhhNSwgMHhkMCwgMHhmMywgMHhmZSwKKyAgMHhkMSwgMHg4YywgMHhmNywgMHhlNywgMHhkOSwgMHhmZCwgMHgzMiwgMHhjYiwgMHhmNiwgMHg2YiwgMHg2ZSwgMHhkNiwKKyAgMHg2MSwgMHhlZCwgMHhiNiwgMHgwMSwgMHg2OSwgMHgxZCwgMHhkMSwgMHhmMiwgMHgxYywgMHhjNiwgMHhjYSwgMHhhZiwKKyAgMHgwZCwgMHgxZCwgMHhjNiwgMHhhZSwgMHg3OCwgMHhmOCwgMHhkYywgMHgzZiwgMHgyOSwgMHhjMCwgMHhmOSwgMHgxNiwKKyAgMHg3MCwgMHg1YSwgMHhkYywgMHgzZiwgMHg2MywgMHhhYywgMHhjMCwgMHhkOSwgMHg5NywgMHg1NywgMHhmMywgMHg4YywKKyAgMHg0YywgMHgxNiwgMHg3MSwgMHg0MiwgMHhiNSwgMHg1NywgMHhjMywgMHg3MCwgMHg4OSwgMHg1MiwgMHhlNCwgMHgxMSwKKyAgMHhmNSwgMHg1ZSwgMHhmZiwgMHg4NSwgMHgzZiwgMHg3ZCwgMHhlYiwgMHhjNywgMHgyNiwgMHhjOSwgMHg5NSwgMHgxMiwKKyAgMHgyYiwgMHg0ZSwgMHgzMywgMHgyNiwgMHgwMiwgMHg3ZCwgMHg0OCwgMHhiYiwgMHg2NCwgMHg3ZiwgMHgxZSwgMHhkNiwKKyAgMHgxNCwgMHhlOSwgMHg0MCwgMHg5NCwgMHg5MiwgMHg0YSwgMHg0NSwgMHhlZCwgMHgyNCwgMHgzNywgMHg3NiwgMHhiNSwKKyAgMHhmZSwgMHhjOCwgMHhiOSwgMHg5MSwgMHgxMSwgMHhkMywgMHg2OCwgMHg3NCwgMHg2YywgMHg3MywgMHg4OCwgMHg0NiwKKyAgMHg0YSwgMHg1MCwgMHg4YSwgMHhmMywgMHg4MiwgMHhjMCwgMHhlMCwgMHgyMSwgMHgxYSwgMHg4ZSwgMHgwMCwgMHg5ZSwKKyAgMHgwZiwgMHgxZiwgMHhmZiwgMHgzMywgMHg2NSwgMHhhNywgMHgzMSwgMHg4NiwgMHgyMCwgMHg1NSwgMHhhOSwgMHhjZSwKKyAgMHgzMiwgMHhkOSwgMHhkMSwgMHg2OCwgMHg0YiwgMHhmMywgMHg3MCwgMHgwOSwgMHg2YiwgMHgyZCwgMHg5NCwgMHgzOCwKKyAgMHgwMiwgMHg0NywgMHgyZSwgMHg2NCwgMHg5ZCwgMHgwMSwgMHhmNSwgMHg2YiwgMHgxYywgMHg3NiwgMHgzMSwgMHg0OCwKKyAgMHgzMCwgMHhmOSwgMHg3ZiwgMHgxZSwgMHg5YiwgMHgwMCwgMHgwYSwgMHg0OSwgMHhiNCwgMHhmOCwgMHg2YSwgMHgwNywKKyAgMHhkYSwgMHhhNSwgMHg2ZSwgMHgwZSwgMHhmMSwgMHg5YiwgMHhkNSwgMHg5NywgMHhlZSwgMHg4NiwgMHhlMiwgMHg5NiwKKyAgMHgzNSwgMHg4NiwgMHgyMSwgMHhjMCwgMHg2ZSwgMHg3OCwgMHg0ZiwgMHgwZCwgMHgyMSwgMHg2YSwgMHg3NCwgMHhjZSwKKyAgMHg3OSwgMHhjMCwgMHhkZSwgMHg2OCwgMHg4YiwgMHhhYSwgMHhlYSwgMHhmMSwgMHhlMiwgMHg5NCwgMHgxOCwgMHhhOCwKKyAgMHgzYiwgMHg2NSwgMHg1OCwgMHgxMCwgMHhjYiwgMHhmOCwgMHg3ZSwgMHgyYSwgMHgxMywgMHhjNSwgMHhmNSwgMHhhNCwKKyAgMHg2NiwgMHhhMywgMHgzYywgMHhlNiwgMHhhMiwgMHgwNCwgMHg4NCwgMHgwNCwgMHhhOCwgMHg0OCwgMHg1NywgMHhiOCwKKyAgMHg2NCwgMHhhNywgMHgyNiwgMHg1NiwgMHhlMywgMHgyMiwgMHhkYywgMHgwMCwgMHhhNSwgMHgwMCwgMHg3ZiwgMHg3YSwKKyAgMHhkYywgMHg0NiwgMHg1MSwgMHg4NSwgMHhlYywgMHg1NiwgMHg2NSwgMHg0ZCwgMHhhNywgMHhkNiwgMHhmZiwgMHg4NywKKyAgMHhlZiwgMHhhMCwgMHhiMCwgMHg4NCwgMHgwNCwgMHhkNSwgMHgyNiwgMHg0NiwgMHg2OSwgMHhiOCwgMHg5ZiwgMHhkYywKKyAgMHhjYywgMHgyMywgMHg3YSwgMHg0MSwgMHgyZCwgMHgyOCwgMHg1MywgMHgzNywgMHhjOSwgMHg5ZSwgMHg4YSwgMHgyZCwKKyAgMHgyNCwgMHhhMCwgMHg2OSwgMHgyYywgMHgyOCwgMHg0NCwgMHhjYSwgMHgwYSwgMHgwMiwgMHgyYywgMHg4OCwgMHg2NSwKKyAgMHhkYiwgMHg0NCwgMHhlNCwgMHhiMCwgMHg1MiwgMHg1YiwgMHhhOSwgMHgwYywgMHgxMCwgMHgyMiwgMHgwOCwgMHg1YSwKKyAgMHhmNiwgMHgzYywgMHg1MCwgMHg1ZSwgMHg4MSwgMHgzNCwgMHgzNSwgMHhlNiwgMHhkYSwgMHg4NSwgMHg5MCwgMHg4MCwKKyAgMHg2MCwgMHgzMSwgMHg0ZCwgMHhmNSwgMHg1ZiwgMHhlMiwgMHgxZCwgMHhlZSwgMHgwZSwgMHgzMiwgMHhjMywgMHhiZSwKKyAgMHhhNywgMHg3OCwgMHhmYSwgMHg2NCwgMHhjYywgMHgxNiwgMHg1NCwgMHg5YiwgMHg4ZiwgMHhhOSwgMHhmMywgMHg0ZCwKKyAgMHhiMywgMHgxNCwgMHg1OCwgMHgzMiwgMHgxYywgMHhjOSwgMHgyOSwgMHhmMywgMHhkYywgMHg5NSwgMHgwMywgMHg5MiwKKyAgMHhiNCwgMHgzYywgMHg1ZCwgMHhiZCwgMHgxMSwgMHhmYiwgMHgyYiwgMHg2MiwgMHhhMSwgMHg2NiwgMHhiYywgMHhiOCwKKyAgMHg3MSwgMHgwMiwgMHhlMCwgMHg2MiwgMHg4MywgMHg4OSwgMHhjOCwgMHhkMSwgMHgxNiwgMHg1NSwgMHgwZiwgMHhiOCwKKyAgMHg3YywgMHgwNCwgMHg2YywgMHhkNywgMHhhZSwgMHgwMiwgMHgzZSwgMHhiMiwgMHg5MywgMHhhZiwgMHgyZiwgMHhjYiwKKyAgMHg0YywgMHgzNiwgMHg4NSwgMHgzMiwgMHhmMSwgMHgwYywgMHhhYywgMHhiMCwgMHg1YSwgMHhkNSwgMHg1ZSwgMHg4NywKKyAgMHhlMCwgMHhlNSwgMHgyOSwgMHg1NiwgMHhjNSwgMHhhYiwgMHhjMiwgMHg0MywgMHhmNSwgMHg4MSwgMHgzYywgMHgwNywKKyAgMHg4OCwgMHg0NSwgMHgwNSwgMHhiOCwgMHgxOCwgMHg2NywgMHhmMCwgMHhmYiwgMHhmZSwgMHhiZSwgMHg2MCwgMHg4YSwKKyAgMHgzNSwgMHg0NCwgMHg1MSwgMHhiYywgMHg1ZCwgMHg1YSwgMHg1NCwgMHg5OCwgMHg5OCwgMHgzOSwgMHg0ZSwgMHg5NiwKKyAgMHg1ZCwgMHgyNCwgMHhlNywgMHgyMywgMHgxNSwgMHg0YSwgMHhjMiwgMHg2YSwgMHgyNCwgMHg1YiwgMHg3NCwgMHg4MCwKKyAgMHg4MCwgMHgyMiwgMHgyMywgMHgxNCwgMHg5NywgMHg3OSwgMHhiZiwgMHg1MCwgMHgwNywgMHgyMSwgMHgxYSwgMHg4ZiwKKyAgMHhjMCwgMHgzZSwgMHgzZiwgMHhmZSwgMHhmZiwgMHgzYiwgMHg2OCwgMHhhMywgMHg1OCwgMHhlMCwgMHhlYywgMHgyNCwKKyAgMHgxMCwgMHhiOCwgMHhkZiwgMHgxNSwgMHgyZSwgMHg3NywgMHhjMiwgMHgyOSwgMHg0YiwgMHgyZSwgMHg0YSwgMHg1OSwKKyAgMHgxYywgMHgyMywgMHgwZSwgMHgwYiwgMHgyZCwgMHg5NCwgMHhiYywgMHgwMCwgMHg5NywgMHgxYywgMHhlMiwgMHg3ZiwKKyAgMHg0OCwgMHgxZiwgMHgyMywgMHg5OCwgMHhlNCwgMHg4ZiwgMHg1YiwgMHg3MiwgMHg1YiwgMHg3MiwgMHgwMywgMHg3YiwKKyAgMHg0NywgMHgyZCwgMHg1MywgMHhiNCwgMHhkZiwgMHg5NiwgMHg5MCwgMHhiYSwgMHhlNSwgMHgwMSwgMHg2MiwgMHhkMywKKyAgMHg1YSwgMHg5NywgMHg5NSwgMHhhZSwgMHhkMywgMHgyYSwgMHg0YiwgMHg3NSwgMHgzYiwgMHgzOSwgMHhhNCwgMHgzMiwKKyAgMHhmNSwgMHhiYywgMHhlNiwgMHhlNywgMHhjYSwgMHg0YiwgMHg1NiwgMHhlMCwgMHgzYiwgMHg3NywgMHg1MiwgMHhiOCwKKyAgMHhlNiwgMHg2NCwgMHhhOSwgMHg3OCwgMHhkZSwgMHg4NiwgMHg4NywgMHg0YSwgMHhjMiwgMHg3ZCwgMHg4ZiwgMHgyMiwKKyAgMHgzNywgMHhiZCwgMHhiOSwgMHg3NywgMHhlYywgMHhkNywgMHg2ZiwgMHg2NSwgMHhkNCwgMHhlYywgMHhkOCwgMHg1MCwKKyAgMHg5MiwgMHgyOCwgMHgxNSwgMHgzNSwgMHg5MywgMHg2ZCwgMHhmOSwgMHhmNSwgMHhkNywgMHg5MCwgMHhiNCwgMHgyOCwKKyAgMHhjNiwgMHgyNSwgMHhjMywgMHgzYSwgMHhkOSwgMHgyMSwgMHhlYiwgMHg2OSwgMHhmNywgMHhlZCwgMHg3NiwgMHg5NSwKKyAgMHhiNiwgMHhkMywgMHhkZiwgMHhjMSwgMHg0ZSwgMHhiMiwgMHhkMywgMHg2MCwgMHg1MSwgMHg1ZCwgMHgwMCwgMHg1NywKKyAgMHg1NSwgMHg5NywgMHgzNiwgMHg1YSwgMHhkNiwgMHgyNywgMHgyMiwgMHhhMSwgMHg1MSwgMHg4MywgMHhlMSwgMHhjOSwKKyAgMHgwMiwgMHgwYywgMHgwNiwgMHg5MywgMHhjOSwgMHgxZCwgMHhlMiwgMHhmNSwgMHg5MCwgMHgwMiwgMHg0NCwgMHgwMCwKKyAgMHg4ZCwgMHhhNSwgMHhmNCwgMHg5ZCwgMHgzMywgMHg2NCwgMHhjOSwgMHhiZSwgMHgyMiwgMHhjMSwgMHg1YiwgMHhmOSwKKyAgMHg0YywgMHgzMSwgMHg3NywgMHhkYiwgMHgxOCwgMHhjZCwgMHgyYiwgMHg4YSwgMHhhMCwgMHgwNSwgMHgzYiwgMHgyYSwKKyAgMHgxNywgMHgyYSwgMHgwNSwgMHhlNSwgMHhiZSwgMHg1MSwgMHhhYiwgMHg5ZiwgMHg0OSwgMHg3NCwgMHg2YSwgMHhiOCwKKyAgMHg0ZSwgMHg1YSwgMHhhOCwgMHg2YywgMHg1YSwgMHgxYSwgMHgwNCwgMHgwYywgMHgyMywgMHgwMSwgMHhhMCwgMHg0MCwKKyAgMHg2MiwgMHg0MiwgMHg5YiwgMHg1MiwgMHhkNywgMHg0YSwgMHgzNSwgMHg3NSwgMHg2YiwgMHhmYywgMHgyMiwgMHhlYywKKyAgMHg1YiwgMHgyOSwgMHg3OCwgMHgwMSwgMHgyZSwgMHgzOSwgMHgxMiwgMHgyNywgMHg4YSwgMHg3NiwgMHg0NywgMHgzZiwKKyAgMHhhYywgMHg5MSwgMHhkYywgMHg3MCwgMHhlYSwgMHgzMywgMHhjYSwgMHgyNiwgMHg2MCwgMHhlNiwgMHhlZSwgMHg4YSwKKyAgMHg3NiwgMHhjOSwgMHhhMSwgMHhhOCwgMHg4MywgMHhkZSwgMHg1YywgMHhjMywgMHg3MSwgMHhkYiwgMHg1MiwgMHg2ZCwKKyAgMHgyZiwgMHg5YSwgMHg4ZiwgMHgwYywgMHg5NiwgMHg5MywgMHg1OSwgMHhkNCwgMHgzMSwgMHgxZSwgMHhhMSwgMHg3OSwKKyAgMHg3MywgMHgxNCwgMHhjYiwgMHg5NSwgMHhjNCwgMHhhYSwgMHhmNywgMHg5NCwgMHhkMywgMHg1MiwgMHg3ZCwgMHhmZSwKKyAgMHg4ZiwgMHg1MCwgMHhmMiwgMHg4ZSwgMHgzOSwgMHg4YywgMHhhYywgMHg0MCwgMHg0MCwgMHg5MiwgMHhlZiwgMHg3MiwKKyAgMHhlOCwgMHgxOSwgMHg3MiwgMHgzNiwgMHhiNSwgMHg4YywgMHg2ZSwgMHgzMCwgMHgzZiwgMHg3OSwgMHhlZiwgMHg0NywKKyAgMHhiNSwgMHhlNSwgMHhiZiwgMHg1NywgMHhmOCwgMHg5NCwgMHg4MCwgMHgxMSwgMHgxMiwgMHg5ZCwgMHhhMiwgMHhlNCwKKyAgMHhiZiwgMHg4NCwgMHhhMywgMHhlYiwgMHg2OCwgMHgzYiwgMHg0ZiwgMHhhZSwgMHg1OCwgMHg3MywgMHhmNSwgMHg2MywKKyAgMHgwYywgMHg2MCwgMHgxMSwgMHg5NCwgMHg2MCwgMHgxYworfTsKKworZ3VpbnQgc2VnXzFfbTRmX2xlbiA9IDQ5NTU0OworZ3VpbnQgc2VnXzFfbW9vZl9zaXplID0gMTEyMDsKK2d1aW50IHNlZ18xX3NhbXBsZV8wX29mZnNldCA9IDExMjg7CisKK3N0YXRpYyBjb25zdCBndWludCBzZWdfMV9zYW1wbGVfc2l6ZXNbXSA9IHsKKyAgMzcxLCAzNzIsIDQ3NywgNTMwLCA0ODksIDQ2MiwgNDQxLCA0MjEsIDQyMCwgNDEwLCA0MDIsIDM5OCwgMzgxLCAzODEsIDM4NiwKKyAgMzg2LCAzNjksIDM3MCwgMzYyLCAzNDYsIDM1NywgMzU1LCAzNzYsIDMzNiwgMzQxLCAzNTgsIDM1MCwgMzYyLCAzMzMsIDQxNSwKKyAgMzg2LCAzNjQsIDM0NCwgMzg2LCAzNTgsIDM2NSwgNDA0LCAzNDIsIDM2MSwgMzY2LCAzNjEsIDM1MCwgMzkwLCAzNDgsIDM2NiwKKyAgMzU5LCAzNTcsIDM2MCwgMzQ5LCAzNTYsIDM2NSwgMzkzLCAzNTMsIDM4NSwgMzgxLCAzNDgsIDM0NSwgNDE0LCAzNzIsIDM2OSwKKyAgNDAxLCAzOTEsIDMzMywgMzM5LCA0MjMsIDM0MywgNDQ1LCA0MjUsIDQyMiwgNDE1LCA0MDYsIDM4OSwgMzk1LCAzNzUsIDM1NiwKKyAgNDQyLCA0MzIsIDM5MSwgMzg1LCAzMzksIDI3NywgMjkzLCAzMTYsIDMyNywgMzA5LCAzODksIDM1OSwgNDI3LCAzMjYsIDQyMCwKKyAgNDA3LCAzMTYsIDM2MiwgNDE5LCAzNDksIDM4NywgMzI2LCAzMjgsIDM2NywgMzQ0LCA0MjUsIDMyOSwgMzc5LCA0MDMsIDMxNCwKKyAgMzk3LCAzNjgsIDM4OSwgMzgwLCAzNzMsIDM0MiwgMzQzLCAzNjgsIDQzNiwgMzU5LCAzNTIsIDM2MSwgMzY2LCAzNTAsIDQxOSwKKyAgMzMxLCA0MjYsIDQwMSwgMzgyLCAzMjYsIDQxMSwgMzY0LCAzMzgsIDM0NQorfTsKKworLyogaW4gdGltZXNjYWxlICovCitHc3RDbG9ja1RpbWUgc2VnXzFfc2FtcGxlX2R1cmF0aW9uID0gMTAyNDsKK2d1aW50MzIgc2VnXzFfdGltZXNjYWxlID0gNDQxMDA7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9xdG11eC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDJiNDA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcXRtdXguYwpAQCAtMCwwICsxLDE2MjggQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIHVuaXQgdGVzdCBmb3IgcXRtdXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA4PiBNYXJrIE5hdXdlbGFlcnRzIDxtbmF1d0B1c2Vycy5zZi5uZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnbGliL2dzdGRpby5oPgorCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L3BidXRpbHMvZW5jb2RpbmctcHJvZmlsZS5oPgorCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitzdGF0aWMgR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKKworI2RlZmluZSBWSURFT19SQVdfQ0FQU19TVFJJTkcgInZpZGVvL3gtcmF3IgorCisjZGVmaW5lIEFVRElPX0NBUFNfU1RSSU5HICJhdWRpby9tcGVnLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtcGVndmVyc2lvbiA9IChpbnQpIDEsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgImxheWVyID0gKGludCkgMywgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAyLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyYXRlID0gKGludCkgNDgwMDAiCisKKyNkZWZpbmUgQVVESU9fQUFDX1RNUExfQ0FQU19TVFJJTkcgImF1ZGlvL21wZWcsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXBlZ3ZlcnNpb249KGludCk0LCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWxzPShpbnQpMSwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYXRlPShpbnQpNDQxMDAsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtLWZvcm1hdD0oc3RyaW5nKXJhdywgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZXZlbD0oc3RyaW5nKTIsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzZS1wcm9maWxlPShzdHJpbmcpbGMsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvZmlsZT0oc3RyaW5nKWxjIgorLyogY29kZWNfZGF0YSBzaG91bGRuJ3QgYmUgaW4gdGhlIHRlbXBsYXRlIGNhcHMsIG9ubHkgaW4gdGhlIGFjdHVhbCBjYXBzICovCisjZGVmaW5lIEFVRElPX0FBQ19DQVBTX1NUUklORyBBVURJT19BQUNfVE1QTF9DQVBTX1NUUklORyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBjb2RlY19kYXRhPShidWZmZXIpMTIwOCIKKworI2RlZmluZSBWSURFT19DQVBTX1NUUklORyAidmlkZW8vbXBlZywgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibXBlZ3ZlcnNpb24gPSAoaW50KSA0LCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW1zdHJlYW0gPSAoYm9vbGVhbikgZmFsc2UsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpZHRoID0gKGludCkgMzg0LCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWlnaHQgPSAoaW50KSAyODgsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lcmF0ZSA9IChmcmFjdGlvbikgMjUvMSIKKworI2RlZmluZSBWSURFT19UTVBMX0NBUFNfSDI2NF9TVFJJTkcgInZpZGVvL3gtaDI2NCwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2lkdGg9KGludCkzMjAsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlaWdodD0oaW50KTI0MCwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWVyYXRlPShmcmFjdGlvbikzMC8xLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwaXhlbC1hc3BlY3QtcmF0aW89KGZyYWN0aW9uKTEvMSwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtLWZvcm1hdD0oc3RyaW5nKWF2YywgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxpZ25tZW50PShzdHJpbmcpYXUsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxldmVsPShzdHJpbmcpMiwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvZmlsZT0oc3RyaW5nKWhpZ2giCisvKiBjb2RlY19kYXRhIHNob3VsZG4ndCBiZSBpbiB0aGUgdGVtcGxhdGUgY2Fwcywgb25seSBpbiB0aGUgYWN0dWFsIGNhcHMgKi8KKyNkZWZpbmUgVklERU9fQ0FQU19IMjY0X1NUUklORyBWSURFT19UTVBMX0NBUFNfSDI2NF9TVFJJTkcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGNvZGVjX2RhdGE9KGJ1ZmZlcikwMTY0MDAxNGZmZTEwMDE4Njc2NDAwMTRhIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjZDk0MTQxZmIwMTEwMDAwMDAzMDAxNzczNTk0MDAwZjE0Mjk5NjAwIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMDAwNTY4ZWJlY2IyMmMiCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby9xdWlja3RpbWUiKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN2aWRlb3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoVklERU9fQ0FQU19TVFJJTkcpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3ZpZGVvaDI2NHRlbXBsYXRlID0KK0dTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFZJREVPX1RNUExfQ0FQU19IMjY0X1NUUklORykpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdmlkZW9yYXd0ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChWSURFT19SQVdfQ0FQU19TVFJJTkcpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY2F1ZGlvdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChBVURJT19DQVBTX1NUUklORykpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjYXVkaW9hYWN0ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChBVURJT19BQUNfVE1QTF9DQVBTX1NUUklORykpOworCisvKiBzZXR1cCBhbmQgdGVhcmRvd24gbmVlZHMgc29tZSBzcGVjaWFsIGhhbmRsaW5nIGZvciBtdXhlciAqLworc3RhdGljIEdzdFBhZCAqCitzZXR1cF9zcmNfcGFkIChHc3RFbGVtZW50ICogZWxlbWVudCwKKyAgICBHc3RTdGF0aWNQYWRUZW1wbGF0ZSAqIHRlbXBsYXRlLCBjb25zdCBnY2hhciAqIHNpbmtuYW1lKQoreworICBHc3RQYWQgKnNyY3BhZCwgKnNpbmtwYWQ7CisKKyAgR1NUX0RFQlVHX09CSkVDVCAoZWxlbWVudCwgInNldHRpbmcgdXAgc2VuZGluZyBwYWQiKTsKKyAgLyogc2VuZGluZyBwYWQgKi8KKyAgc3JjcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKHRlbXBsYXRlLCAic3JjIik7CisgIGZhaWxfaWYgKHNyY3BhZCA9PSBOVUxMLCAiQ291bGQgbm90IGNyZWF0ZSBhIHNyY3BhZCIpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChzcmNwYWQsICJzcmNwYWQiLCAxKTsKKworICBpZiAoIShzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGVsZW1lbnQsIHNpbmtuYW1lKSkpCisgICAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoZWxlbWVudCwgc2lua25hbWUpOworICBmYWlsX2lmIChzaW5rcGFkID09IE5VTEwsICJDb3VsZCBub3QgZ2V0IHNpbmsgcGFkIGZyb20gJXMiLAorICAgICAgR1NUX0VMRU1FTlRfTkFNRSAoZWxlbWVudCkpOworICAvKiByZWZlcmVuY2VzIGFyZSBvd25lZCBieTogMSkgdXMsIDIpIHF0bXV4LCAzKSBjb2xsZWN0IHBhZHMgKi8KKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoc2lua3BhZCwgInNpbmtwYWQiLCAzKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAoc3JjcGFkLCBzaW5rcGFkKSA9PSBHU1RfUEFEX0xJTktfT0ssCisgICAgICAiQ291bGQgbm90IGxpbmsgc291cmNlIGFuZCAlcyBzaW5rIHBhZHMiLCBHU1RfRUxFTUVOVF9OQU1FIChlbGVtZW50KSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOyAgIC8qIGJlY2F1c2Ugd2UgZ290IGl0IGhpZ2hlciB1cCAqLworCisgIC8qIHJlZmVyZW5jZXMgYXJlIG93bmVkIGJ5OiAxKSBxdG11eCwgMikgY29sbGVjdCBwYWRzICovCisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHNpbmtwYWQsICJzaW5rcGFkIiwgMik7CisKKyAgcmV0dXJuIHNyY3BhZDsKK30KKworc3RhdGljIHZvaWQKK3RlYXJkb3duX3NyY19wYWQgKEdzdFBhZCAqIHNyY3BhZCkKK3sKKyAgR3N0UGFkICpzaW5rcGFkOworCisgIC8qIGNsZWFuIHVwIGZsb2F0aW5nIHNyYyBwYWQgKi8KKyAgc2lua3BhZCA9IGdzdF9wYWRfZ2V0X3BlZXIgKHNyY3BhZCk7CisgIGZhaWxfaWYgKHNpbmtwYWQgPT0gTlVMTCk7CisgIC8qIHBhZCByZWZzIGhlbGQgYnkgMSkgcXRtdXggMikgY29sbGVjdHBhZHMgYW5kIDMpIHVzICh0aHJvdWdoIF9nZXRfcGVlcikgKi8KKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoc2lua3BhZCwgInNpbmtwYWQiLCAzKTsKKworICBnc3RfcGFkX3VubGluayAoc3JjcGFkLCBzaW5rcGFkKTsKKworICAvKiBhZnRlciB1bmxpbmtpbmcsIHBhZCByZWZzIHN0aWxsIGhlbGQgYnkKKyAgICogMSkgcXRtdXggYW5kIDIpIGNvbGxlY3RwYWRzIGFuZCAzKSB1cyAodGhyb3VnaCBfZ2V0X3BlZXIpICovCisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHNpbmtwYWQsICJzaW5rcGFkIiwgMyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworICAvKiBvbmUgbW9yZSByZWYgaXMgaGVsZCBieSBlbGVtZW50IGl0c2VsZiAqLworCisgIC8qIHBhZCByZWZzIGhlbGQgYnkgY3JlYXRvciAqLworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChzcmNwYWQsICJzcmNwYWQiLCAxKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKK30KKworZ2Jvb2xlYW4gZG93bnN0cmVhbV9pc19zZWVrYWJsZTsKK3N0YXRpYyBnYm9vbGVhbgorcXRtdXhfc2lua3BhZF9xdWVyeSAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdFF1ZXJ5ICogcXVlcnkpCit7CisgIGdib29sZWFuIHJldCA9IEZBTFNFOworCisgIGlmIChHU1RfUVVFUllfVFlQRSAocXVlcnkpID09IEdTVF9RVUVSWV9TRUVLSU5HKSB7CisgICAgZ3N0X3F1ZXJ5X3NldF9zZWVraW5nIChxdWVyeSwgR1NUX0ZPUk1BVF9CWVRFUywgZG93bnN0cmVhbV9pc19zZWVrYWJsZSwgMCwKKyAgICAgICAgLTEpOworICAgIHJldCA9IFRSVUU7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9xdG11eCAoR3N0U3RhdGljUGFkVGVtcGxhdGUgKiBzcmN0ZW1wbGF0ZSwgY29uc3QgZ2NoYXIgKiBzaW5rbmFtZSwKKyAgICBnYm9vbGVhbiBzZWVrYWJsZSkKK3sKKyAgR3N0RWxlbWVudCAqcXRtdXg7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfcXRtdXgiKTsKKyAgcXRtdXggPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoInF0bXV4Iik7CisgIG15c3JjcGFkID0gc2V0dXBfc3JjX3BhZCAocXRtdXgsIHNyY3RlbXBsYXRlLCBzaW5rbmFtZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAocXRtdXgsICZzaW5rdGVtcGxhdGUpOworCisgIGRvd25zdHJlYW1faXNfc2Vla2FibGUgPSBzZWVrYWJsZTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKG15c2lua3BhZCwgcXRtdXhfc2lua3BhZF9xdWVyeSk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICByZXR1cm4gcXRtdXg7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX3F0bXV4IChHc3RFbGVtZW50ICogcXRtdXgsIGNvbnN0IGdjaGFyICogc2lua25hbWUpCit7CisgIEdTVF9ERUJVRyAoImNsZWFudXBfcXRtdXgiKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChxdG11eCwgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgdGVhcmRvd25fc3JjX3BhZCAobXlzcmNwYWQpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKHF0bXV4KTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKHF0bXV4KTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3F0bXV4X3BhZCAoR3N0U3RhdGljUGFkVGVtcGxhdGUgKiBzcmN0ZW1wbGF0ZSwgY29uc3QgZ2NoYXIgKiBzaW5rbmFtZSwKKyAgICBndWludDMyIGR0c19tZXRob2QpCit7CisgIEdzdEVsZW1lbnQgKnF0bXV4OworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBpbnQgbnVtX2J1ZmZlcnM7CisgIGludCBpOworICBndWludDggZGF0YTBbMTJdID0gIlwwMDBcMDAwXDAwMFwwMjRmdHlwcXQgICI7CisgIGd1aW50OCBkYXRhMVsxNl0gPSAiXDAwMFwwMDBcMDAwXDAxMGZyZWVcMDAwXDAwMFwwMDBcMDAwbWRhdCI7CisgIGd1aW50OCBkYXRhMls0XSA9ICJtb292IjsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIHF0bXV4ID0gc2V0dXBfcXRtdXggKHNyY3RlbXBsYXRlLCBzaW5rbmFtZSwgVFJVRSk7CisgIGdfb2JqZWN0X3NldCAocXRtdXgsICJkdHMtbWV0aG9kIiwgZHRzX21ldGhvZCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHF0bXV4LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJ0ZXN0IikpOworCisgIGNhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAobXlzcmNwYWQpOworICBnc3RfcGFkX3NldF9jYXBzIChteXNyY3BhZCwgY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEpOworICBnc3RfYnVmZmVyX21lbXNldCAoaW5idWZmZXIsIDAsIDAsIDEpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoaW5idWZmZXIpID0gNDAgKiBHU1RfTVNFQ09ORDsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKworICAvKiBzZW5kIGVvcyB0byBoYXZlIG1vb3Ygd3JpdHRlbiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpID09IFRSVUUpOworCisgIG51bV9idWZmZXJzID0gZ19saXN0X2xlbmd0aCAoYnVmZmVycyk7CisgIC8qIGF0IGxlYXN0IGV4cGVjdCBmdHlwLCBtZGF0IGhlYWRlciwgYnVmZmVyIGNodW5rIGFuZCBtb292ICovCisgIGZhaWxfdW5sZXNzIChudW1fYnVmZmVycyA+PSA0KTsKKworICAvKiBjbGVhbiB1cCBmaXJzdCB0byBjbGVhciBhbnkgcGVuZGluZyByZWZzIGluIHN0aWNreSBjYXBzICovCisgIGNsZWFudXBfcXRtdXggKHF0bXV4LCBzaW5rbmFtZSk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9idWZmZXJzOyArK2kpIHsKKyAgICBvdXRidWZmZXIgPSBHU1RfQlVGRkVSIChidWZmZXJzLT5kYXRhKTsKKyAgICBmYWlsX2lmIChvdXRidWZmZXIgPT0gTlVMTCk7CisgICAgYnVmZmVycyA9IGdfbGlzdF9yZW1vdmUgKGJ1ZmZlcnMsIG91dGJ1ZmZlcik7CisKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgIHsKKyAgICAgICAgLyogZnR5cCBoZWFkZXIgKi8KKyAgICAgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dGJ1ZmZlcikgPj0gMjApOworICAgICAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgZGF0YTAsCisgICAgICAgICAgICAgICAgc2l6ZW9mIChkYXRhMCkpID09IDApOworICAgICAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMTYsIGRhdGEwICsgOCwgNCkgPT0gMCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgIC8qIG1kYXQgaGVhZGVyICovCisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWZmZXIpID09IDE2KTsKKyAgICAgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIDAsIGRhdGExLCBzaXplb2YgKGRhdGExKSkKKyAgICAgICAgICAgID09IDApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAvKiBidWZmZXIgd2UgcHV0IGluICovCisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWZmZXIpID09IDEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAvKiBtb292ICovCisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWZmZXIpID4gOCk7CisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCA0LCBkYXRhMiwKKyAgICAgICAgICAgICAgICBzaXplb2YgKGRhdGEyKSkgPT0gMCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAob3V0YnVmZmVyLCAib3V0YnVmZmVyIiwgMSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmZmVyKTsKKyAgICBvdXRidWZmZXIgPSBOVUxMOworICB9CisKKyAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICBidWZmZXJzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3F0bXV4X3BhZF9mcmFnbWVudGVkIChHc3RTdGF0aWNQYWRUZW1wbGF0ZSAqIHNyY3RlbXBsYXRlLAorICAgIGNvbnN0IGdjaGFyICogc2lua25hbWUsIGd1aW50MzIgZHRzX21ldGhvZCwgZ2Jvb2xlYW4gc3RyZWFtYWJsZSkKK3sKKyAgR3N0RWxlbWVudCAqcXRtdXg7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisgIGludCBudW1fYnVmZmVyczsKKyAgaW50IGk7CisgIGd1aW50OCBkYXRhMFsxMl0gPSAiXDAwMFwwMDBcMDAwXDAyNGZ0eXBxdCAgIjsKKyAgZ3VpbnQ4IGRhdGExWzRdID0gIm1kYXQiOworICBndWludDggZGF0YTJbNF0gPSAibW9vdiI7CisgIGd1aW50OCBkYXRhM1s0XSA9ICJtb29mIjsKKyAgZ3VpbnQ4IGRhdGE0WzRdID0gIm1mcmEiOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisKKyAgcXRtdXggPSBzZXR1cF9xdG11eCAoc3JjdGVtcGxhdGUsIHNpbmtuYW1lLCAhc3RyZWFtYWJsZSk7CisgIGdfb2JqZWN0X3NldCAocXRtdXgsICJkdHMtbWV0aG9kIiwgZHRzX21ldGhvZCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAocXRtdXgsICJmcmFnbWVudC1kdXJhdGlvbiIsIDIwMDAsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHF0bXV4LCAic3RyZWFtYWJsZSIsIHN0cmVhbWFibGUsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChxdG11eCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgidGVzdCIpKTsKKworICBjYXBzID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKG15c3JjcGFkKTsKKyAgZ3N0X3BhZF9zZXRfY2FwcyAobXlzcmNwYWQsIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxKTsKKyAgZ3N0X2J1ZmZlcl9tZW1zZXQgKGluYnVmZmVyLCAwLCAwLCAxKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGluYnVmZmVyKSA9IDQwICogR1NUX01TRUNPTkQ7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisKKyAgLyogc2VuZCBlb3MgdG8gaGF2ZSBhbGwgd3JpdHRlbiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpID09IFRSVUUpOworCisgIG51bV9idWZmZXJzID0gZ19saXN0X2xlbmd0aCAoYnVmZmVycyk7CisgIC8qIGF0IGxlYXN0IGV4cGVjdCBmdHlwLCBtb292LCBtb29mLCBtZGF0IGhlYWRlciwgYnVmZmVyIGNodW5rCisgICAqIGFuZCBvcHRpb25hbGx5IG1mcmEgKi8KKyAgZmFpbF91bmxlc3MgKG51bV9idWZmZXJzID49IDUpOworCisgIC8qIGNsZWFuIHVwIGZpcnN0IHRvIGNsZWFyIGFueSBwZW5kaW5nIHJlZnMgaW4gc3RpY2t5IGNhcHMgKi8KKyAgY2xlYW51cF9xdG11eCAocXRtdXgsIHNpbmtuYW1lKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2J1ZmZlcnM7ICsraSkgeworICAgIG91dGJ1ZmZlciA9IEdTVF9CVUZGRVIgKGJ1ZmZlcnMtPmRhdGEpOworICAgIGZhaWxfaWYgKG91dGJ1ZmZlciA9PSBOVUxMKTsKKyAgICBidWZmZXJzID0gZ19saXN0X3JlbW92ZSAoYnVmZmVycywgb3V0YnVmZmVyKTsKKworICAgIHN3aXRjaCAoaSkgeworICAgICAgY2FzZSAwOgorICAgICAgeworICAgICAgICAvKiBmdHlwIGhlYWRlciAqLworICAgICAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0YnVmZmVyKSA+PSAyMCk7CisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCAwLCBkYXRhMCwKKyAgICAgICAgICAgICAgICBzaXplb2YgKGRhdGEwKSkgPT0gMCk7CisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCAxNiwgZGF0YTAgKyA4LCA0KSA9PSAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgLyogbW9vdiAqLworICAgICAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0YnVmZmVyKSA+IDgpOworICAgICAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgNCwgZGF0YTIsCisgICAgICAgICAgICAgICAgc2l6ZW9mIChkYXRhMikpID09IDApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAvKiBtb29mICovCisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWZmZXIpID4gOCk7CisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCA0LCBkYXRhMywKKyAgICAgICAgICAgICAgICBzaXplb2YgKGRhdGEzKSkgPT0gMCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgIC8qIG1kYXQgaGVhZGVyICovCisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWZmZXIpID09IDgpOworICAgICAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgNCwgZGF0YTEsCisgICAgICAgICAgICAgICAgc2l6ZW9mIChkYXRhMSkpID09IDApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAvKiBidWZmZXIgd2UgcHV0IGluICovCisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWZmZXIpID09IDEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNTogICAgICAgICAgICAgICAgICAvKiBtZnJhICovCisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2dldF9zaXplIChvdXRidWZmZXIpID4gOCk7CisgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCA0LCBkYXRhNCwKKyAgICAgICAgICAgICAgICBzaXplb2YgKGRhdGE0KSkgPT0gMCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAob3V0YnVmZmVyLCAib3V0YnVmZmVyIiwgMSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0YnVmZmVyKTsKKyAgICBvdXRidWZmZXIgPSBOVUxMOworICB9CisKKyAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICBidWZmZXJzID0gTlVMTDsKK30KKworLyogZHRzLW1ldGhvZCBkZCAqLworCitHU1RfU1RBUlRfVEVTVCAodGVzdF92aWRlb19wYWRfZGQpCit7CisgIGNoZWNrX3F0bXV4X3BhZCAoJnNyY3ZpZGVvdGVtcGxhdGUsICJ2aWRlb18ldSIsIDApOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2F1ZGlvX3BhZF9kZCkKK3sKKyAgY2hlY2tfcXRtdXhfcGFkICgmc3JjYXVkaW90ZW1wbGF0ZSwgImF1ZGlvXyV1IiwgMCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF92aWRlb19wYWRfZnJhZ19kZCkKK3sKKyAgY2hlY2tfcXRtdXhfcGFkX2ZyYWdtZW50ZWQgKCZzcmN2aWRlb3RlbXBsYXRlLCAidmlkZW9fJXUiLCAwLCBGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYXVkaW9fcGFkX2ZyYWdfZGQpCit7CisgIGNoZWNrX3F0bXV4X3BhZF9mcmFnbWVudGVkICgmc3JjYXVkaW90ZW1wbGF0ZSwgImF1ZGlvXyV1IiwgMCwgRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdmlkZW9fcGFkX2ZyYWdfZGRfc3RyZWFtYWJsZSkKK3sKKyAgY2hlY2tfcXRtdXhfcGFkX2ZyYWdtZW50ZWQgKCZzcmN2aWRlb3RlbXBsYXRlLCAidmlkZW9fJXUiLCAwLCBUUlVFKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2F1ZGlvX3BhZF9mcmFnX2RkX3N0cmVhbWFibGUpCit7CisgIGNoZWNrX3F0bXV4X3BhZF9mcmFnbWVudGVkICgmc3JjYXVkaW90ZW1wbGF0ZSwgImF1ZGlvXyV1IiwgMCwgVFJVRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogZHRzLW1ldGhvZCByZW9yZGVyICovCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3ZpZGVvX3BhZF9yZW9yZGVyKQoreworICBjaGVja19xdG11eF9wYWQgKCZzcmN2aWRlb3RlbXBsYXRlLCAidmlkZW9fJXUiLCAxKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9hdWRpb19wYWRfcmVvcmRlcikKK3sKKyAgY2hlY2tfcXRtdXhfcGFkICgmc3JjYXVkaW90ZW1wbGF0ZSwgImF1ZGlvXyV1IiwgMSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF92aWRlb19wYWRfZnJhZ19yZW9yZGVyKQoreworICBjaGVja19xdG11eF9wYWRfZnJhZ21lbnRlZCAoJnNyY3ZpZGVvdGVtcGxhdGUsICJ2aWRlb18ldSIsIDEsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9hdWRpb19wYWRfZnJhZ19yZW9yZGVyKQoreworICBjaGVja19xdG11eF9wYWRfZnJhZ21lbnRlZCAoJnNyY2F1ZGlvdGVtcGxhdGUsICJhdWRpb18ldSIsIDEsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3ZpZGVvX3BhZF9mcmFnX3Jlb3JkZXJfc3RyZWFtYWJsZSkKK3sKKyAgY2hlY2tfcXRtdXhfcGFkX2ZyYWdtZW50ZWQgKCZzcmN2aWRlb3RlbXBsYXRlLCAidmlkZW9fJXUiLCAxLCBUUlVFKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2F1ZGlvX3BhZF9mcmFnX3Jlb3JkZXJfc3RyZWFtYWJsZSkKK3sKKyAgY2hlY2tfcXRtdXhfcGFkX2ZyYWdtZW50ZWQgKCZzcmNhdWRpb3RlbXBsYXRlLCAiYXVkaW9fJXUiLCAxLCBUUlVFKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBkdHMtbWV0aG9kIGFzYyAqLworCitHU1RfU1RBUlRfVEVTVCAodGVzdF92aWRlb19wYWRfYXNjKQoreworICBjaGVja19xdG11eF9wYWQgKCZzcmN2aWRlb3RlbXBsYXRlLCAidmlkZW9fJXUiLCAyKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9hdWRpb19wYWRfYXNjKQoreworICBjaGVja19xdG11eF9wYWQgKCZzcmNhdWRpb3RlbXBsYXRlLCAiYXVkaW9fJXUiLCAyKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3ZpZGVvX3BhZF9mcmFnX2FzYykKK3sKKyAgY2hlY2tfcXRtdXhfcGFkX2ZyYWdtZW50ZWQgKCZzcmN2aWRlb3RlbXBsYXRlLCAidmlkZW9fJXUiLCAyLCBGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYXVkaW9fcGFkX2ZyYWdfYXNjKQoreworICBjaGVja19xdG11eF9wYWRfZnJhZ21lbnRlZCAoJnNyY2F1ZGlvdGVtcGxhdGUsICJhdWRpb18ldSIsIDIsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3ZpZGVvX3BhZF9mcmFnX2FzY19zdHJlYW1hYmxlKQoreworICBjaGVja19xdG11eF9wYWRfZnJhZ21lbnRlZCAoJnNyY3ZpZGVvdGVtcGxhdGUsICJ2aWRlb18ldSIsIDIsIFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYXVkaW9fcGFkX2ZyYWdfYXNjX3N0cmVhbWFibGUpCit7CisgIGNoZWNrX3F0bXV4X3BhZF9mcmFnbWVudGVkICgmc3JjYXVkaW90ZW1wbGF0ZSwgImF1ZGlvXyV1IiwgMiwgVFJVRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcmV1c2UpCit7CisgIEdzdEVsZW1lbnQgKnF0bXV4ID0gc2V0dXBfcXRtdXggKCZzcmN2aWRlb3RlbXBsYXRlLCAidmlkZW9fJXUiLCBUUlVFKTsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocXRtdXgsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChxdG11eCwgR1NUX1NUQVRFX05VTEwpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHF0bXV4LCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJ0ZXN0IikpOworCisgIGNhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAobXlzcmNwYWQpOworICBnc3RfcGFkX3NldF9jYXBzIChteXNyY3BhZCwgY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAvKiBlbnN1cmUgc2VnbWVudCAoZm9ybWF0KSBwcm9wZXJseSBzZXR1cCAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDEpOworICBmYWlsX3VubGVzcyAoaW5idWZmZXIgIT0gTlVMTCk7CisgIGdzdF9idWZmZXJfbWVtc2V0IChpbmJ1ZmZlciwgMCwgMCwgMSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChpbmJ1ZmZlcikgPSA0MCAqIEdTVF9NU0VDT05EOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworCisgIC8qIHNlbmQgZW9zIHRvIGhhdmUgYWxsIHdyaXR0ZW4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSA9PSBUUlVFKTsKKworICBjbGVhbnVwX3F0bXV4IChxdG11eCwgInZpZGVvXyV1Iik7CisgIGdzdF9jaGVja19kcm9wX2J1ZmZlcnMgKCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIEdzdEVuY29kaW5nQ29udGFpbmVyUHJvZmlsZSAqCitjcmVhdGVfcXRtdXhfcHJvZmlsZSAoY29uc3QgZ2NoYXIgKiB2YXJpYW50KQoreworICBHc3RFbmNvZGluZ0NvbnRhaW5lclByb2ZpbGUgKmNwcm9mOworICBHc3RDYXBzICpjYXBzOworCisgIGlmICh2YXJpYW50ID09IE5VTEwpIHsKKyAgICBjYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5X3NpbXBsZSAoInZpZGVvL3F1aWNrdGltZSIpOworICB9IGVsc2UgeworICAgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8vcXVpY2t0aW1lIiwKKyAgICAgICAgInZhcmlhbnQiLCBHX1RZUEVfU1RSSU5HLCB2YXJpYW50LCBOVUxMKTsKKyAgfQorCisgIGNwcm9mID0gZ3N0X2VuY29kaW5nX2NvbnRhaW5lcl9wcm9maWxlX25ldyAoIk5hbWUiLCAiYmxhaCIsIGNhcHMsIE5VTEwpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgIlMxNkJFIiwKKyAgICAgICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDIsICJyYXRlIiwgR19UWVBFX0lOVCwgNDQxMDAsIE5VTEwpOworICBnc3RfZW5jb2RpbmdfY29udGFpbmVyX3Byb2ZpbGVfYWRkX3Byb2ZpbGUgKGNwcm9mLAorICAgICAgR1NUX0VOQ09ESU5HX1BST0ZJTEUgKGdzdF9lbmNvZGluZ19hdWRpb19wcm9maWxlX25ldyAoY2FwcywgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgMSkpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIHJldHVybiBjcHJvZjsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZW5jb2RlYmluX3F0bXV4KQoreworICBHc3RFbmNvZGluZ0NvbnRhaW5lclByb2ZpbGUgKmNwcm9mOworICBHc3RFbGVtZW50ICplbmM7CisgIEdzdFBhZCAqcGFkOworCisgIGVuYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImVuY29kZWJpbiIsIE5VTEwpOworICBpZiAoZW5jID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIC8qIE1ha2Ugc3VyZSBlbmNvZGViaW4gZmluZHMgYSBtdXhlciBmb3IgYSBwcm9maWxlIHdpdGggYSB2YXJpYW50IGZpZWxkIC4uICovCisgIGNwcm9mID0gY3JlYXRlX3F0bXV4X3Byb2ZpbGUgKCJhcHBsZSIpOworICBnX29iamVjdF9zZXQgKGVuYywgInByb2ZpbGUiLCBjcHJvZiwgTlVMTCk7CisgIGdzdF9lbmNvZGluZ19wcm9maWxlX3VucmVmIChjcHJvZik7CisKKyAgLyogc2hvdWxkIGhhdmUgY3JlYXRlZCBhIHBhZCBhZnRlciBzZXR0aW5nIHRoZSBwcm9maWxlICovCisgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChlbmMsICJhdWRpb18wIik7CisgIGZhaWxfdW5sZXNzIChwYWQgIT0gTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGVuYyk7CisKKyAgLyogLi4uIGFuZCBmb3IgYSBwcm9maWxlIHdpdGhvdXQgYSB2YXJpYW50IGZpZWxkICovCisgIGVuYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImVuY29kZWJpbiIsIE5VTEwpOworICBjcHJvZiA9IGNyZWF0ZV9xdG11eF9wcm9maWxlIChOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChlbmMsICJwcm9maWxlIiwgY3Byb2YsIE5VTEwpOworICBnc3RfZW5jb2RpbmdfcHJvZmlsZV91bnJlZiAoY3Byb2YpOworCisgIC8qIHNob3VsZCBoYXZlIGNyZWF0ZWQgYSBwYWQgYWZ0ZXIgc2V0dGluZyB0aGUgcHJvZmlsZSAqLworICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZW5jLCAiYXVkaW9fMCIpOworICBmYWlsX3VubGVzcyAocGFkICE9IE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChlbmMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIEZha2UgbXAzIGVuY29kZXIgZm9yIHRlc3QgKi8KK3R5cGVkZWYgR3N0RWxlbWVudCBUZXN0TXAzRW5jOwordHlwZWRlZiBHc3RFbGVtZW50Q2xhc3MgVGVzdE1wM0VuY0NsYXNzOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjX3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL21wZWcsIG1wZWd2ZXJzaW9uPTEsIGxheWVyPVsxLDNdIikKKyAgICApOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua190ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3IikKKyAgICApOworCitzdGF0aWMgR1R5cGUgdGVzdF9tcDNfZW5jX2dldF90eXBlICh2b2lkKTsKK3N0YXRpYyB2b2lkIHRlc3RfaW5wdXRfcHVzaF9zZWdtZW50X3N0YXJ0IChncG9pbnRlciB1c2VyX2RhdGEsCisgICAgR3N0Q2xvY2tUaW1lIHN0YXJ0KTsKKworR19ERUZJTkVfVFlQRSAoVGVzdE1wM0VuYywgdGVzdF9tcDNfZW5jLCBHU1RfVFlQRV9FTEVNRU5UKTsKKworc3RhdGljIHZvaWQKK3Rlc3RfbXAzX2VuY19jbGFzc19pbml0IChUZXN0TXAzRW5jQ2xhc3MgKiBrbGFzcykKK3sKKyAgR3N0RWxlbWVudENsYXNzICplbGVtZW50X2NsYXNzID0gR1NUX0VMRU1FTlRfQ0xBU1MgKGtsYXNzKTsKKworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNpbmtfdGVtcGxhdGUpOworICBnc3RfZWxlbWVudF9jbGFzc19hZGRfc3RhdGljX3BhZF90ZW1wbGF0ZSAoZWxlbWVudF9jbGFzcywgJnNyY190ZW1wbGF0ZSk7CisKKyAgZ3N0X2VsZW1lbnRfY2xhc3Nfc2V0X21ldGFkYXRhIChlbGVtZW50X2NsYXNzLCAiTVBFRzEgQXVkaW8gRW5jb2RlciIsCisgICAgICAiQ29kZWMvRW5jb2Rlci9BdWRpbyIsICJQcmV0ZW5kcyB0byBlbmNvZGUgbXAzIiwgIkZvbyBCYXIgPGZvb0BiYXIuY29tPiIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9tcDNfZW5jX2luaXQgKFRlc3RNcDNFbmMgKiBtcDNlbmMpCit7CisgIEdzdFBhZCAqcGFkOworCisgIHBhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc2lua190ZW1wbGF0ZSwgInNpbmsiKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAobXAzZW5jLCBwYWQpOworCisgIHBhZCA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc3JjX3RlbXBsYXRlLCAic3JjIik7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKG1wM2VuYywgcGFkKTsKK30KKworc3RhdGljIGdib29sZWFuCitwbHVnaW5faW5pdCAoR3N0UGx1Z2luICogcGx1Z2luKQoreworICByZXR1cm4gZ3N0X2VsZW1lbnRfcmVnaXN0ZXIgKHBsdWdpbiwgInRlc3RtcDNlbmMiLCBHU1RfUkFOS19OT05FLAorICAgICAgdGVzdF9tcDNfZW5jX2dldF90eXBlICgpKTsKK30KKworc3RhdGljIEdzdEVuY29kaW5nQ29udGFpbmVyUHJvZmlsZSAqCitjcmVhdGVfbXA0bXV4X3Byb2ZpbGUgKHZvaWQpCit7CisgIEdzdEVuY29kaW5nQ29udGFpbmVyUHJvZmlsZSAqY3Byb2Y7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby9xdWlja3RpbWUiLAorICAgICAgInZhcmlhbnQiLCBHX1RZUEVfU1RSSU5HLCAiaXNvIiwgTlVMTCk7CisKKyAgY3Byb2YgPSBnc3RfZW5jb2RpbmdfY29udGFpbmVyX3Byb2ZpbGVfbmV3ICgiTmFtZSIsICJibGFoIiwgY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL21wZWciLCAibXBlZ3ZlcnNpb24iLCBHX1RZUEVfSU5ULCAxLAorICAgICAgImxheWVyIiwgR19UWVBFX0lOVCwgMywgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMiwgInJhdGUiLCBHX1RZUEVfSU5ULAorICAgICAgNDQxMDAsIE5VTEwpOworICBnc3RfZW5jb2RpbmdfY29udGFpbmVyX3Byb2ZpbGVfYWRkX3Byb2ZpbGUgKGNwcm9mLAorICAgICAgR1NUX0VOQ09ESU5HX1BST0ZJTEUgKGdzdF9lbmNvZGluZ19hdWRpb19wcm9maWxlX25ldyAoY2FwcywgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgMSkpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIHJldHVybiBjcHJvZjsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZW5jb2RlYmluX21wNG11eCkKK3sKKyAgR3N0RW5jb2RpbmdDb250YWluZXJQcm9maWxlICpjcHJvZjsKKyAgR3N0UGx1Z2luRmVhdHVyZSAqZmVhdHVyZTsKKyAgR3N0RWxlbWVudCAqZW5jLCAqbXV4OworICBHc3RQYWQgKnBhZDsKKworICAvKiBuZWVkIGEgZmFrZSBtcDMgZW5jb2RlciBiZWNhdXNlIG1wNCBvbmx5IGFjY2VwdHMgZW5jb2RlZCBmb3JtYXRzICovCisgIGdzdF9wbHVnaW5fcmVnaXN0ZXJfc3RhdGljIChHU1RfVkVSU0lPTl9NQUpPUiwgR1NUX1ZFUlNJT05fTUlOT1IsCisgICAgICAiZmFrZW1wM2VuYyIsICJmYWtlbXAzZW5jIiwgcGx1Z2luX2luaXQsIFZFUlNJT04sICJMR1BMIiwKKyAgICAgICJnc3QtcGx1Z2lucy1nb29kIiwgR1NUX1BBQ0tBR0VfTkFNRSwgR1NUX1BBQ0tBR0VfT1JJR0lOKTsKKworICBmZWF0dXJlID0gZ3N0X3JlZ2lzdHJ5X2ZpbmRfZmVhdHVyZSAoZ3N0X3JlZ2lzdHJ5X2dldCAoKSwgInRlc3RtcDNlbmMiLAorICAgICAgR1NUX1RZUEVfRUxFTUVOVF9GQUNUT1JZKTsKKyAgZ3N0X3BsdWdpbl9mZWF0dXJlX3NldF9yYW5rIChmZWF0dXJlLCBHU1RfUkFOS19QUklNQVJZICsgMTAwKTsKKworICBlbmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJlbmNvZGViaW4iLCBOVUxMKTsKKyAgaWYgKGVuYyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICAvKiBNYWtlIHN1cmUgZW5jb2RlYmluIGZpbmRzIG1wNG11eCBldmVuIHRob3VnaCBxdG11eCBvdXRwdXRzIGEgc3VwZXJzZXQgKi8KKyAgY3Byb2YgPSBjcmVhdGVfbXA0bXV4X3Byb2ZpbGUgKCk7CisgIGdfb2JqZWN0X3NldCAoZW5jLCAicHJvZmlsZSIsIGNwcm9mLCBOVUxMKTsKKyAgZ3N0X2VuY29kaW5nX3Byb2ZpbGVfdW5yZWYgKGNwcm9mKTsKKworICAvKiBzaG91bGQgaGF2ZSBjcmVhdGVkIGEgcGFkIGFmdGVyIHNldHRpbmcgdGhlIHByb2ZpbGUgKi8KKyAgcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGVuYywgImF1ZGlvXzAiKTsKKyAgZmFpbF91bmxlc3MgKHBhZCAhPSBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGFkKTsKKworICBtdXggPSBnc3RfYmluX2dldF9ieV9pbnRlcmZhY2UgKEdTVF9CSU4gKGVuYyksIEdTVF9UWVBFX1RBR19TRVRURVIpOworICBmYWlsX3VubGVzcyAobXV4ICE9IE5VTEwpOworICB7CisgICAgR3N0RWxlbWVudEZhY3RvcnkgKmYgPSBnc3RfZWxlbWVudF9nZXRfZmFjdG9yeSAobXV4KTsKKworICAgIC8qIG1ha2Ugc3VyZSB3ZSBnb3QgbXA0bXV4IGZvciB2YXJpYW50PWlzbyAqLworICAgIEdTVF9JTkZPICgibXV4ZXI6ICVzIiwgR19PQkpFQ1RfVFlQRV9OQU1FIChtdXgpKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChHU1RfT0JKRUNUX05BTUUgKGYpLCAibXA0bXV4Iik7CisgIH0KKyAgZ3N0X29iamVjdF91bnJlZiAobXV4KTsKKyAgZ3N0X29iamVjdF91bnJlZiAoZW5jKTsKKworICBnc3RfcGx1Z2luX2ZlYXR1cmVfc2V0X3JhbmsgKGZlYXR1cmUsIEdTVF9SQU5LX05PTkUpOworICBnc3Rfb2JqZWN0X3VucmVmIChmZWF0dXJlKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgZ2Jvb2xlYW4KK2V4dHJhY3RfdGFncyAoY29uc3QgZ2NoYXIgKiBsb2NhdGlvbiwgR3N0VGFnTGlzdCAqKiB0YWdsaXN0KQoreworICBnYm9vbGVhbiByZXQgPSBUUlVFOworICBHc3RFbGVtZW50ICpzcmM7CisgIEdzdEJ1cyAqYnVzOworICBHc3RFbGVtZW50ICpwaXBlbGluZSA9CisgICAgICBnc3RfcGFyc2VfbGF1bmNoICgiZmlsZXNyYyBuYW1lPXNyYyAhIHF0ZGVtdXggISBmYWtlc2luayIsIE5VTEwpOworCisgIHNyYyA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgInNyYyIpOworICBnX29iamVjdF9zZXQgKHNyYywgImxvY2F0aW9uIiwgbG9jYXRpb24sIE5VTEwpOworCisgIGJ1cyA9IGdzdF9waXBlbGluZV9nZXRfYnVzIChHU1RfUElQRUxJTkUgKHBpcGVsaW5lKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORykKKyAgICAgICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgaWYgKCp0YWdsaXN0ID09IE5VTEwpIHsKKyAgICAqdGFnbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIH0KKworICB3aGlsZSAoMSkgeworICAgIEdzdE1lc3NhZ2UgKm1zZyA9IGdzdF9idXNfdGltZWRfcG9wX2ZpbHRlcmVkIChidXMsIEdTVF9DTE9DS19USU1FX05PTkUsCisgICAgICAgIEdTVF9NRVNTQUdFX1RBRyB8IEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfRU9TKTsKKworICAgIGlmIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VPUykgeworICAgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRVJST1IpIHsKKyAgICAgIHJldCA9IEZBTFNFOworICAgICAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfVEFHKSB7CisgICAgICBHc3RUYWdMaXN0ICp0YWdzOworCisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV90YWcgKG1zZywgJnRhZ3MpOworICAgICAgZ3N0X3RhZ19saXN0X2luc2VydCAoKnRhZ2xpc3QsIHRhZ3MsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSk7CisgICAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ3MpOworICAgIH0KKyAgICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKyAgfQorCisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAordGVzdF9hdmVyYWdlX2JpdHJhdGVfY3VzdG9tIChjb25zdCBnY2hhciAqIGVsZW1lbnRuYW1lLAorICAgIEdzdFN0YXRpY1BhZFRlbXBsYXRlICogdG1wbCwgY29uc3QgZ2NoYXIgKiBjYXBzX3N0ciwKKyAgICBjb25zdCBnY2hhciAqIHNpbmtwYWRuYW1lKQoreworICBnY2hhciAqbG9jYXRpb247CisgIEdzdEVsZW1lbnQgKnF0bXV4OworICBHc3RFbGVtZW50ICpmaWxlc2luazsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgaW50IGk7CisgIGdpbnQgYnl0ZXNbXSA9IHsgMTYsIDIyLCAxMiB9OworICBnaW50NjQgZHVyYXRpb25zW10gPSB7IEdTVF9TRUNPTkQgKiAzLCBHU1RfU0VDT05EICogNSwgR1NUX1NFQ09ORCAqIDIgfTsKKyAgZ2ludDY0IHRvdGFsX2J5dGVzID0gMDsKKyAgR3N0Q2xvY2tUaW1lIHRvdGFsX2R1cmF0aW9uID0gMDsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGxvY2F0aW9uID0gZ19zdHJkdXBfcHJpbnRmICgiJXMvJXMtJWQiLCBnX2dldF90bXBfZGlyICgpLCAicXRtdXh0ZXN0IiwKKyAgICAgIGdfcmFuZG9tX2ludCAoKSk7CisgIEdTVF9JTkZPICgiVXNpbmcgbG9jYXRpb24gJXMgZm9yIGJpdHJhdGUgdGVzdCIsIGxvY2F0aW9uKTsKKyAgcXRtdXggPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoZWxlbWVudG5hbWUpOworICBmaWxlc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZpbGVzaW5rIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoZmlsZXNpbmssICJsb2NhdGlvbiIsIGxvY2F0aW9uLCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfbGluayAocXRtdXgsIGZpbGVzaW5rKTsKKyAgbXlzcmNwYWQgPSBzZXR1cF9zcmNfcGFkIChxdG11eCwgdG1wbCwgc2lua3BhZG5hbWUpOworICBmYWlsX3VubGVzcyAobXlzcmNwYWQgIT0gTlVMTCk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworCisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZmlsZXNpbmssCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSwKKyAgICAgICJjb3VsZCBub3Qgc2V0IGZpbGVzaW5rIHRvIHBsYXlpbmciKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocXRtdXgsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICBnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoInRlc3QiKSk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChjYXBzX3N0cik7CisgIGdzdF9wYWRfc2V0X2NhcHMgKG15c3JjcGFkLCBjYXBzKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIC8qIGVuc3VyZSBzZWdtZW50IChmb3JtYXQpIHByb3Blcmx5IHNldHVwICovCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKGJ5dGVzW2ldKTsKKyAgICBnc3RfYnVmZmVyX21lbXNldCAoaW5idWZmZXIsIDAsIDAsIGJ5dGVzW2ldKTsKKyAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gdG90YWxfZHVyYXRpb247CisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoaW5idWZmZXIpID0gKEdzdENsb2NrVGltZSkgZHVyYXRpb25zW2ldOworICAgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAgIHRvdGFsX2J5dGVzICs9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGluYnVmZmVyKTsKKyAgICB0b3RhbF9kdXJhdGlvbiArPSBHU1RfQlVGRkVSX0RVUkFUSU9OIChpbmJ1ZmZlcik7CisgICAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIH0KKworICAvKiBzZW5kIGVvcyB0byBoYXZlIG1vb3Ygd3JpdHRlbiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpID09IFRSVUUpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocXRtdXgsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChmaWxlc2luaywgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9jaGVja19kcm9wX2J1ZmZlcnMgKCk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgdGVhcmRvd25fc3JjX3BhZCAobXlzcmNwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChmaWxlc2luayk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChxdG11eCk7CisKKyAgLyogY2hlY2sgdGhlIGJpdHJhdGUgdGFnICovCisgIHsKKyAgICBHc3RUYWdMaXN0ICp0YWdsaXN0ID0gTlVMTDsKKyAgICBndWludCBiaXRyYXRlID0gMDsKKyAgICBndWludCBleHBlY3RlZDsKKworICAgIGZhaWxfdW5sZXNzIChleHRyYWN0X3RhZ3MgKGxvY2F0aW9uLCAmdGFnbGlzdCkpOworCisgICAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfdWludCAodGFnbGlzdCwgR1NUX1RBR19CSVRSQVRFLCAmYml0cmF0ZSkpOworCisgICAgZXhwZWN0ZWQgPQorICAgICAgICAoZ3VpbnQpIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAoKGd1aW50NjQpIHRvdGFsX2J5dGVzLAorICAgICAgICAoZ3VpbnQ2NCkgOCAqIEdTVF9TRUNPTkQsIChndWludDY0KSB0b3RhbF9kdXJhdGlvbik7CisgICAgZmFpbF91bmxlc3MgKGJpdHJhdGUgPT0gZXhwZWN0ZWQpOworICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnbGlzdCk7CisgIH0KKworICAvKiBkZWxldGUgZmlsZSAqLworICBnX3VubGluayAobG9jYXRpb24pOworICBnX2ZyZWUgKGxvY2F0aW9uKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYXZlcmFnZV9iaXRyYXRlKQoreworICB0ZXN0X2F2ZXJhZ2VfYml0cmF0ZV9jdXN0b20gKCJtcDRtdXgiLCAmc3JjYXVkaW9hYWN0ZW1wbGF0ZSwKKyAgICAgIEFVRElPX0FBQ19DQVBTX1NUUklORywgImF1ZGlvXyV1Iik7CisgIHRlc3RfYXZlcmFnZV9iaXRyYXRlX2N1c3RvbSAoIm1wNG11eCIsICZzcmN2aWRlb2gyNjR0ZW1wbGF0ZSwKKyAgICAgIFZJREVPX0NBUFNfSDI2NF9TVFJJTkcsICJ2aWRlb18ldSIpOworCisgIHRlc3RfYXZlcmFnZV9iaXRyYXRlX2N1c3RvbSAoInF0bXV4IiwgJnNyY2F1ZGlvYWFjdGVtcGxhdGUsCisgICAgICBBVURJT19BQUNfQ0FQU19TVFJJTkcsICJhdWRpb18ldSIpOworICB0ZXN0X2F2ZXJhZ2VfYml0cmF0ZV9jdXN0b20gKCJxdG11eCIsICZzcmN2aWRlb2gyNjR0ZW1wbGF0ZSwKKyAgICAgIFZJREVPX0NBUFNfSDI2NF9TVFJJTkcsICJ2aWRlb18ldSIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0cnVjdCBUZXN0SW5wdXREYXRhCit7CisgIEdzdFBhZCAqc3JjcGFkOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIEdMaXN0ICppbnB1dDsKKyAgR1RocmVhZCAqdGhyZWFkOworCisgIC8qIFdoZW4gY29tcGFyaW5nIHRzLCB0aGUgaW5wdXQgd2lsbCBiZSBzdWJ0cmFjdGVkIGZyb20gdGhpcyAqLworICBnaW50NjQgdHNfb2Zmc2V0OworICAvKiBEdWUgdG8gRFRTLCB0aGUgc2VnbWVudCBzdGFydCBtaWdodCBiZSBzaGlmdGVkIHNvIHRoaXMgbGlzdAorICAgKiBpcyB1c2VkIHRvIHZlZml0eSBlYWNoIHJlY2VpdmVkIHNlZ21lbnRzICovCisgIEdMaXN0ICpleHBlY3RlZF9zZWdtZW50X3N0YXJ0OworCisgIEdzdENsb2NrVGltZSBleHBlY3RlZF9nYXBfdHM7CisgIEdzdENsb2NrVGltZSBleHBlY3RlZF9nYXBfZHVyYXRpb247CisgIGdib29sZWFuIGdhcF9yZWNlaXZlZDsKKworICBHc3RQYWQgKnNpbmtwYWQ7CisKKyAgR0xpc3QgKm91dHB1dF9pdGVyOworfTsKKworc3RhdGljIHZvaWQKK3Rlc3RfaW5wdXRfZGF0YV9pbml0IChzdHJ1Y3QgVGVzdElucHV0RGF0YSAqZGF0YSkKK3sKKyAgZGF0YS0+dHNfb2Zmc2V0ID0gMDsKKyAgZGF0YS0+ZXhwZWN0ZWRfc2VnbWVudF9zdGFydCA9IE5VTEw7CisgIGRhdGEtPmV4cGVjdGVkX2dhcF90cyA9IDA7CisgIGRhdGEtPmV4cGVjdGVkX2dhcF9kdXJhdGlvbiA9IDA7CisgIGRhdGEtPmdhcF9yZWNlaXZlZCA9IEZBTFNFOworICBkYXRhLT5zcmNwYWQgPSBOVUxMOworICBkYXRhLT5zaW5rcGFkID0gTlVMTDsKKyAgZGF0YS0+aW5wdXQgPSBOVUxMOworICBkYXRhLT50aHJlYWQgPSBOVUxMOworCisgIHRlc3RfaW5wdXRfcHVzaF9zZWdtZW50X3N0YXJ0IChkYXRhLCAwKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfaW5wdXRfZGF0YV9jbGVhbiAoc3RydWN0IFRlc3RJbnB1dERhdGEgKmRhdGEpCit7CisgIGdfbGlzdF9mcmVlX2Z1bGwgKGRhdGEtPmlucHV0LCAoR0Rlc3Ryb3lOb3RpZnkpIGdzdF9taW5pX29iamVjdF91bnJlZik7CisKKyAgaWYgKGRhdGEtPnNpbmtwYWQpIHsKKyAgICBnc3RfcGFkX3NldF9hY3RpdmUgKGRhdGEtPnNpbmtwYWQsIEZBTFNFKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChkYXRhLT5zaW5rcGFkKTsKKyAgfQorCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoZGF0YS0+c3JjcGFkLCBGQUxTRSk7CisgIHRlYXJkb3duX3NyY19wYWQgKGRhdGEtPnNyY3BhZCk7Cit9CisKK3N0YXRpYyBncG9pbnRlcgordGVzdF9pbnB1dF9wdXNoX2RhdGEgKGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgc3RydWN0IFRlc3RJbnB1dERhdGEgKmRhdGEgPSB1c2VyX2RhdGE7CisgIEdMaXN0ICppdGVyOworICBHc3RGbG93UmV0dXJuIGZsb3c7CisKKyAgZm9yIChpdGVyID0gZGF0YS0+aW5wdXQ7IGl0ZXI7IGl0ZXIgPSBnX2xpc3RfbmV4dCAoaXRlcikpIHsKKyAgICBpZiAoR1NUX0lTX0JVRkZFUiAoaXRlci0+ZGF0YSkpIHsKKyAgICAgIEdTVF9JTkZPICgiUHVzaGluZyBidWZmZXIgJSIgR1NUX1BUUl9GT1JNQVQgIiBvbiBwYWQ6ICVzOiVzIiwgaXRlci0+ZGF0YSwKKyAgICAgICAgICBHU1RfREVCVUdfUEFEX05BTUUgKGRhdGEtPnNyY3BhZCkpOworICAgICAgZmxvdyA9CisgICAgICAgICAgZ3N0X3BhZF9wdXNoIChkYXRhLT5zcmNwYWQsCisgICAgICAgICAgZ3N0X2J1ZmZlcl9yZWYgKChHc3RCdWZmZXIgKikgaXRlci0+ZGF0YSkpOworICAgICAgZmFpbF91bmxlc3MgKGZsb3cgPT0gR1NUX0ZMT1dfT0spOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfSU5GT19PQkpFQ1QgKGRhdGEtPnNyY3BhZCwgIlB1c2hpbmcgZXZlbnQ6ICUiCisgICAgICAgICAgR1NUX1BUUl9GT1JNQVQsIGl0ZXItPmRhdGEpOworICAgICAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAoZGF0YS0+c3JjcGFkLAorICAgICAgICAgICAgICBnc3RfZXZlbnRfcmVmICgoR3N0RXZlbnQgKikgaXRlci0+ZGF0YSkpID09IFRSVUUpOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfaW5wdXRfcHVzaF9zZWdtZW50X3N0YXJ0IChncG9pbnRlciB1c2VyX2RhdGEsIEdzdENsb2NrVGltZSBzdGFydCkKK3sKKyAgc3RydWN0IFRlc3RJbnB1dERhdGEgKmRhdGEgPSB1c2VyX2RhdGE7CisgIEdzdENsb2NrVGltZSAqc3RhcnRfZGF0YSA9IGdfbWFsbG9jIChzaXplb2YgKEdzdENsb2NrVGltZSkpOworCisgICpzdGFydF9kYXRhID0gc3RhcnQ7CisgIGRhdGEtPmV4cGVjdGVkX3NlZ21lbnRfc3RhcnQgPSBnX2xpc3RfYXBwZW5kIChkYXRhLT5leHBlY3RlZF9zZWdtZW50X3N0YXJ0LAorICAgICAgc3RhcnRfZGF0YSk7Cit9CisKK3N0YXRpYyBHc3RDbG9ja1RpbWUKK3Rlc3RfaW5wdXRfcG9wX3NlZ21lbnRfc3RhcnQgKGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgc3RydWN0IFRlc3RJbnB1dERhdGEgKmRhdGEgPSB1c2VyX2RhdGE7CisgIEdzdENsb2NrVGltZSBzdGFydCA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIEdzdENsb2NrVGltZSAqc3RhcnRfZGF0YTsKKworICBpZiAoZGF0YS0+ZXhwZWN0ZWRfc2VnbWVudF9zdGFydCkgeworICAgIHN0YXJ0X2RhdGEgPSBkYXRhLT5leHBlY3RlZF9zZWdtZW50X3N0YXJ0LT5kYXRhOworICAgIGRhdGEtPmV4cGVjdGVkX3NlZ21lbnRfc3RhcnQgPQorICAgICAgICBnX2xpc3RfZGVsZXRlX2xpbmsgKGRhdGEtPmV4cGVjdGVkX3NlZ21lbnRfc3RhcnQsCisgICAgICAgIGRhdGEtPmV4cGVjdGVkX3NlZ21lbnRfc3RhcnQpOworICAgIHN0YXJ0ID0gKnN0YXJ0X2RhdGE7CisgICAgZ19mcmVlIChzdGFydF9kYXRhKTsKKyAgfQorCisgIHJldHVybiBzdGFydDsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitjcmVhdGVfYnVmZmVyIChHc3RDbG9ja1RpbWUgcHRzLCBHc3RDbG9ja1RpbWUgZHRzLCBHc3RDbG9ja1RpbWUgZHVyYXRpb24sCisgICAgZ3VpbnQgYnl0ZXMpCit7CisgIEdzdEJ1ZmZlciAqYnVmOworICBndWludDggKmRhdGE7CisKKyAgZGF0YSA9IGdfbWFsbG9jMCAoYnl0ZXMpOworICBidWYgPSBnc3RfYnVmZmVyX25ld193cmFwcGVkIChkYXRhLCBieXRlcyk7CisgIEdTVF9CVUZGRVJfUFRTIChidWYpID0gcHRzOworICBHU1RfQlVGRkVSX0RUUyAoYnVmKSA9IGR0czsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmKSA9IGR1cmF0aW9uOworICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorX3Rlc3Rfc2lua19wYWRfY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIHN0cnVjdCBUZXN0SW5wdXREYXRhICp0ZXN0X2RhdGEgPSBnX29iamVjdF9nZXRfcWRhdGEgKEdfT0JKRUNUIChwYWQpLAorICAgICAgZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcgKCJ0ZXN0LW11eC1wYWQiKSk7CisgIEdzdEJ1ZmZlciAqZXhwZWN0ZWRfYnVmZmVyOworCisgIGZhaWxfdW5sZXNzICh0ZXN0X2RhdGEtPm91dHB1dF9pdGVyKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9JU19CVUZGRVIgKHRlc3RfZGF0YS0+b3V0cHV0X2l0ZXItPmRhdGEpKTsKKyAgZXhwZWN0ZWRfYnVmZmVyID0gdGVzdF9kYXRhLT5vdXRwdXRfaXRlci0+ZGF0YTsKKworICBmYWlsX3VubGVzcyAoR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcikgPT0KKyAgICAgIChHU1RfQlVGRkVSX1BUU19JU19WQUxJRCAoZXhwZWN0ZWRfYnVmZmVyKSA/CisgICAgICAgICAgR1NUX0JVRkZFUl9QVFMgKGV4cGVjdGVkX2J1ZmZlcikgLQorICAgICAgICAgIHRlc3RfZGF0YS0+dHNfb2Zmc2V0IDogR1NUX0JVRkZFUl9QVFMgKGV4cGVjdGVkX2J1ZmZlcikpKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfRFRTIChidWZmZXIpID09CisgICAgICAoR1NUX0JVRkZFUl9EVFNfSVNfVkFMSUQgKGV4cGVjdGVkX2J1ZmZlcikgPworICAgICAgICAgIEdTVF9CVUZGRVJfRFRTIChleHBlY3RlZF9idWZmZXIpIC0KKyAgICAgICAgICB0ZXN0X2RhdGEtPnRzX29mZnNldCA6IEdTVF9CVUZGRVJfRFRTIChidWZmZXIpKSk7CisgIGZhaWxfdW5sZXNzIChHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpID09CisgICAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChleHBlY3RlZF9idWZmZXIpKTsKKworICB0ZXN0X2RhdGEtPm91dHB1dF9pdGVyID0gZ19saXN0X25leHQgKHRlc3RfZGF0YS0+b3V0cHV0X2l0ZXIpOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIHZvaWQKK2NvbXBhcmVfZXZlbnQgKEdzdEV2ZW50ICogZXZlbnQsIEdzdEV2ZW50ICogZXhwZWN0ZWQpCit7CisgIGZhaWxfdW5sZXNzIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9UWVBFIChleHBlY3RlZCkpOworICBzd2l0Y2ggKEdTVF9FVkVOVF9UWVBFIChldmVudCkpIHsKKyAgICBjYXNlIEdTVF9FVkVOVF9DQVBTOnsKKyAgICAgIEdzdENhcHMgKmNhcHMsICpleHBlY3RlZF9jYXBzOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfY2FwcyAoZXZlbnQsICZjYXBzKTsKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChleHBlY3RlZCwgJmV4cGVjdGVkX2NhcHMpOworICAgICAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2Nhbl9pbnRlcnNlY3QgKGNhcHMsIGV4cGVjdGVkX2NhcHMpKTsKKyAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitfdGVzdF9zaW5rX3BhZF9ldmVudCAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIHN0cnVjdCBUZXN0SW5wdXREYXRhICp0ZXN0X2RhdGEgPSBnX29iamVjdF9nZXRfcWRhdGEgKEdfT0JKRUNUIChwYWQpLAorICAgICAgZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcgKCJ0ZXN0LW11eC1wYWQiKSk7CisKKyAgc3dpdGNoIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpKSB7CisgICAgY2FzZSBHU1RfRVZFTlRfU1RSRUFNX1NUQVJUOgorICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgY2FzZSBHU1RfRVZFTlRfRU9TOgorICAgICAgZmFpbF91bmxlc3MgKHRlc3RfZGF0YS0+b3V0cHV0X2l0ZXIpOworICAgICAgZmFpbF91bmxlc3MgKEdTVF9JU19FVkVOVCAodGVzdF9kYXRhLT5vdXRwdXRfaXRlci0+ZGF0YSkpOworICAgICAgY29tcGFyZV9ldmVudCAoZXZlbnQsIHRlc3RfZGF0YS0+b3V0cHV0X2l0ZXItPmRhdGEpOworICAgICAgdGVzdF9kYXRhLT5vdXRwdXRfaXRlciA9IGdfbGlzdF9uZXh0ICh0ZXN0X2RhdGEtPm91dHB1dF9pdGVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX0VWRU5UX1NFR01FTlQ6eworICAgICAgY29uc3QgR3N0U2VnbWVudCAqc2VnbWVudDsKKworICAgICAgZmFpbF91bmxlc3MgKHRlc3RfZGF0YS0+b3V0cHV0X2l0ZXIpOworICAgICAgZmFpbF91bmxlc3MgKEdTVF9JU19FVkVOVCAodGVzdF9kYXRhLT5vdXRwdXRfaXRlci0+ZGF0YSkpOworICAgICAgZ3N0X2V2ZW50X3BhcnNlX3NlZ21lbnQgKGV2ZW50LCAmc2VnbWVudCk7CisgICAgICBmYWlsX3VubGVzcyAoc2VnbWVudC0+c3RhcnQgPT0gdGVzdF9pbnB1dF9wb3Bfc2VnbWVudF9zdGFydCAodGVzdF9kYXRhKSk7CisgICAgICB0ZXN0X2RhdGEtPm91dHB1dF9pdGVyID0gZ19saXN0X25leHQgKHRlc3RfZGF0YS0+b3V0cHV0X2l0ZXIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX0VWRU5UX0dBUDp7CisgICAgICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wOworICAgICAgR3N0Q2xvY2tUaW1lIGR1cmF0aW9uOworICAgICAgZ3N0X2V2ZW50X3BhcnNlX2dhcCAoZXZlbnQsICZ0aW1lc3RhbXAsICZkdXJhdGlvbik7CisgICAgICBmYWlsX3VubGVzcyAodGltZXN0YW1wID09IHRlc3RfZGF0YS0+ZXhwZWN0ZWRfZ2FwX3RzKTsKKyAgICAgIGZhaWxfdW5sZXNzIChkdXJhdGlvbiA9PSB0ZXN0X2RhdGEtPmV4cGVjdGVkX2dhcF9kdXJhdGlvbik7CisgICAgICB0ZXN0X2RhdGEtPmdhcF9yZWNlaXZlZCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfRVZFTlRfVEFHOgorICAgICAgLyogaWdub3JlIHRoaXMgZXZlbnQgKi8KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHU1RfRVJST1JfT0JKRUNUIChwYWQsICJVbmV4cGVjdGVkIGV2ZW50OiAlIiBHU1RfUFRSX0ZPUk1BVCwgZXZlbnQpOworICAgICAgZmFpbCAoIlVuZXhwZWN0ZWQgZXZlbnQgcmVjZWl2ZWQgJXMiLCBHU1RfRVZFTlRfVFlQRV9OQU1FIChldmVudCkpOworICAgICAgYnJlYWs7CisgIH0KKworICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitfdGVzdF9wYWRfYWRkZWRfY2IgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBHc3RQYWQgKiBwYWQsIGdwb2ludGVyIHVkYXRhKQoreworICBHc3RDYXBzICpjYXBzOworICBzdHJ1Y3QgVGVzdElucHV0RGF0YSAqKmlucHV0cyA9IHVkYXRhOworICBnaW50IGkgPSAtMTsKKyAgY29uc3QgZ2NoYXIgKm5hbWU7CisgIGNvbnN0IGdjaGFyICpzdHJuYW1lOworCisgIGNhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHBhZCk7CisgIHN0cm5hbWUgPSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKSk7CisgIGlmIChnX3N0cl9oYXNfcHJlZml4IChzdHJuYW1lLCAidmlkZW8vIikpIHsKKyAgICBpID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogdmlkZW8gaXMgMCwgYXVkaW8gaXMgMSAqLworICAgIG5hbWUgPSAidmlkZW9zaW5rIjsKKyAgfSBlbHNlIHsKKyAgICBpID0gMTsKKyAgICBuYW1lID0gImF1ZGlvc2luayI7CisgIH0KKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGZhaWxfdW5sZXNzIChpICE9IC0xKTsKKyAgZmFpbF91bmxlc3MgKGlucHV0c1tpXS0+c2lua3BhZCA9PSBOVUxMKTsKKyAgaW5wdXRzW2ldLT5zaW5rcGFkID0gZ3N0X3BhZF9uZXcgKG5hbWUsIEdTVF9QQURfU0lOSyk7CisgIGlucHV0c1tpXS0+b3V0cHV0X2l0ZXIgPSBpbnB1dHNbaV0tPmlucHV0OworICBnX29iamVjdF9zZXRfcWRhdGEgKEdfT0JKRUNUIChpbnB1dHNbaV0tPnNpbmtwYWQpLAorICAgICAgZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcgKCJ0ZXN0LW11eC1wYWQiKSwgaW5wdXRzW2ldKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKGlucHV0c1tpXS0+c2lua3BhZCwgX3Rlc3Rfc2lua19wYWRfY2hhaW4pOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAoaW5wdXRzW2ldLT5zaW5rcGFkLCBfdGVzdF9zaW5rX3BhZF9ldmVudCk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoaW5wdXRzW2ldLT5zaW5rcGFkLCBUUlVFKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAocGFkLCBpbnB1dHNbaV0tPnNpbmtwYWQpID09IEdTVF9QQURfTElOS19PSyk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19vdXRwdXQgKGNvbnN0IGdjaGFyICogbG9jYXRpb24sIHN0cnVjdCBUZXN0SW5wdXREYXRhICppbnB1dDEsCisgICAgc3RydWN0IFRlc3RJbnB1dERhdGEgKmlucHV0MikKK3sKKyAgR3N0RWxlbWVudCAqZmlsZXNyYzsKKyAgR3N0RWxlbWVudCAqZGVtdXg7CisgIHN0cnVjdCBUZXN0SW5wdXREYXRhICppbnB1dHNbMl0gPSB7IGlucHV0MSwgaW5wdXQyIH07CisKKyAgZmlsZXNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZpbGVzcmMiLCBOVUxMKTsKKyAgZGVtdXggPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJxdGRlbXV4IiwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmsgKGZpbGVzcmMsIGRlbXV4KSk7CisKKyAgZ19vYmplY3Rfc2V0IChmaWxlc3JjLCAibG9jYXRpb24iLCBsb2NhdGlvbiwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGRlbXV4LCAicGFkLWFkZGVkIiwgKEdDYWxsYmFjaykgX3Rlc3RfcGFkX2FkZGVkX2NiLCBpbnB1dHMpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGRlbXV4LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChmaWxlc3JjLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIC8qIEZJWE1FIHVzZSBhIG1haW4gbG9vcCAqLworICBnX3VzbGVlcCAoMiAqIEdfVVNFQ19QRVJfU0VDKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChkZW11eCwKKyAgICAgICAgICBHU1RfU1RBVEVfTlVMTCkgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZmlsZXNyYywKKyAgICAgICAgICBHU1RfU1RBVEVfTlVMTCkgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoZmlsZXNyYyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGRlbXV4KTsKK30KKworLyogTXV4ZXMgYSBmaWxlIHdpdGggcXRtdXggdXNpbmcgdGhlIGlucHV0cyBwcm92aWRlZCBhbmQKKyAqIHRoZW4gdmVyaWZpZXMgdGhhdCB0aGUgZ2VuZXJhdGVkIGZpbGUgY29ycmVzcG9uZHMgdG8gdGhlCisgKiBkYXRhIGluIHRoZSBpbnB1dHMgKi8KK3N0YXRpYyB2b2lkCitydW5fbXV4aW5nX3Rlc3QgKHN0cnVjdCBUZXN0SW5wdXREYXRhICppbnB1dDEsIHN0cnVjdCBUZXN0SW5wdXREYXRhICppbnB1dDIpCit7CisgIGdjaGFyICpsb2NhdGlvbjsKKyAgR3N0RWxlbWVudCAqcXRtdXg7CisgIEdzdEVsZW1lbnQgKmZpbGVzaW5rOworCisgIGxvY2F0aW9uID0gZ19zdHJkdXBfcHJpbnRmICgiJXMvJXMtJWQiLCBnX2dldF90bXBfZGlyICgpLCAicXRtdXh0ZXN0IiwKKyAgICAgIGdfcmFuZG9tX2ludCAoKSk7CisgIHF0bXV4ID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJxdG11eCIpOworICBmaWxlc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZpbGVzaW5rIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoZmlsZXNpbmssICJsb2NhdGlvbiIsIGxvY2F0aW9uLCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfbGluayAocXRtdXgsIGZpbGVzaW5rKTsKKworICBpbnB1dDEtPnNyY3BhZCA9IHNldHVwX3NyY19wYWQgKHF0bXV4LCAmc3JjdmlkZW9yYXd0ZW1wbGF0ZSwgInZpZGVvXyV1Iik7CisgIGZhaWxfdW5sZXNzIChpbnB1dDEtPnNyY3BhZCAhPSBOVUxMKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChpbnB1dDEtPnNyY3BhZCwgVFJVRSk7CisKKyAgaW5wdXQyLT5zcmNwYWQgPSBzZXR1cF9zcmNfcGFkIChxdG11eCwgJnNyY2F1ZGlvYWFjdGVtcGxhdGUsICJhdWRpb18ldSIpOworICBmYWlsX3VubGVzcyAoaW5wdXQyLT5zcmNwYWQgIT0gTlVMTCk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoaW5wdXQyLT5zcmNwYWQsIFRSVUUpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGZpbGVzaW5rLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUsCisgICAgICAiY291bGQgbm90IHNldCBmaWxlc2luayB0byBwbGF5aW5nIik7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHF0bXV4LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgaW5wdXQxLT50aHJlYWQgPQorICAgICAgZ190aHJlYWRfbmV3ICgidGVzdC1wdXNoLWRhdGEtMSIsIHRlc3RfaW5wdXRfcHVzaF9kYXRhLCBpbnB1dDEpOworICBpbnB1dDItPnRocmVhZCA9CisgICAgICBnX3RocmVhZF9uZXcgKCJ0ZXN0LXB1c2gtZGF0YS0yIiwgdGVzdF9pbnB1dF9wdXNoX2RhdGEsIGlucHV0Mik7CisKKyAgLyogRklYTUUgc2V0IGEgbWFpbmxvb3AgYW5kIHdhaXQgZm9yIEVPUyAqLworCisgIGdfdGhyZWFkX2pvaW4gKGlucHV0MS0+dGhyZWFkKTsKKyAgZ190aHJlYWRfam9pbiAoaW5wdXQyLT50aHJlYWQpOworICBpbnB1dDEtPnRocmVhZCA9IE5VTEw7CisgIGlucHV0Mi0+dGhyZWFkID0gTlVMTDsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHF0bXV4LCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZmlsZXNpbmssIEdTVF9TVEFURV9OVUxMKTsKKworICBjaGVja19vdXRwdXQgKGxvY2F0aW9uLCBpbnB1dDEsIGlucHV0Mik7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoZmlsZXNpbmspOworICB0ZXN0X2lucHV0X2RhdGFfY2xlYW4gKGlucHV0MSk7CisgIHRlc3RfaW5wdXRfZGF0YV9jbGVhbiAoaW5wdXQyKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKHF0bXV4KTsKKworICAvKiBkZWxldGUgZmlsZSAqLworICBnX3VubGluayAobG9jYXRpb24pOworICBnX2ZyZWUgKGxvY2F0aW9uKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbXV4aW5nKQoreworICBzdHJ1Y3QgVGVzdElucHV0RGF0YSBpbnB1dDEsIGlucHV0MjsKKyAgR3N0Q2FwcyAqY2FwczsKKworICB0ZXN0X2lucHV0X2RhdGFfaW5pdCAoJmlucHV0MSk7CisgIHRlc3RfaW5wdXRfZGF0YV9pbml0ICgmaW5wdXQyKTsKKworICAvKiBDcmVhdGUgdGhlIGlucHV0cywgYWZ0ZXIgY2FsbGluZyB0aGUgcnVuIGJlbG93LCBhbGwgdGhpcyBkYXRhIGlzCisgICAqIHRyYW5zZmVyZWQgdG8gaXQgYW5kIHdlIGhhdmUgbm8gbmVlZCB0byBjbGVhbiB1cCAqLworICBpbnB1dDEuaW5wdXQgPSBOVUxMOworICBpbnB1dDEuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoInRlc3QtMSIpKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nCisgICAgICAoInZpZGVvL3gtcmF3LCB3aWR0aD0oaW50KTgwMCwgaGVpZ2h0PShpbnQpNjAwLCAiCisgICAgICAiZnJhbWVyYXRlPShmcmFjdGlvbikxLzEsIGZvcm1hdD0oc3RyaW5nKVJHQiIpOworICBpbnB1dDEuaW5wdXQgPSBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGdzdF9ldmVudF9uZXdfY2FwcyAoY2FwcykpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZpbnB1dDEuc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmaW5wdXQxLnNlZ21lbnQpKTsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoMCwgR1NUX0NMT0NLX1RJTUVfTk9ORSwKKyAgICAgICAgICBHU1RfU0VDT05ELCA4MDAgKiA2MDAgKiAzKSk7CisgIGlucHV0MS5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGNyZWF0ZV9idWZmZXIgKDEgKiBHU1RfU0VDT05ELAorICAgICAgICAgIEdTVF9DTE9DS19USU1FX05PTkUsIEdTVF9TRUNPTkQsIDgwMCAqIDYwMCAqIDMpKTsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoMiAqIEdTVF9TRUNPTkQsCisgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSwgR1NUX1NFQ09ORCwgODAwICogNjAwICogMykpOworICBpbnB1dDEuaW5wdXQgPSBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKworICBpbnB1dDIuaW5wdXQgPSBOVUxMOworICBpbnB1dDIuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoInRlc3QtMiIpKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19BQUNfQ0FQU19TVFJJTkcpOworICBpbnB1dDIuaW5wdXQgPSBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGdzdF9ldmVudF9uZXdfY2FwcyAoY2FwcykpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZpbnB1dDIuc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgaW5wdXQyLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmaW5wdXQyLnNlZ21lbnQpKTsKKyAgaW5wdXQyLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoMCwgMCwgR1NUX1NFQ09ORCwgNDA5NikpOworICBpbnB1dDIuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBjcmVhdGVfYnVmZmVyICgxICogR1NUX1NFQ09ORCwKKyAgICAgICAgICAxICogR1NUX1NFQ09ORCwgR1NUX1NFQ09ORCwgNDA5NikpOworICBpbnB1dDIuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBjcmVhdGVfYnVmZmVyICgyICogR1NUX1NFQ09ORCwKKyAgICAgICAgICAyICogR1NUX1NFQ09ORCwgR1NUX1NFQ09ORCwgNDA5NikpOworICBpbnB1dDIuaW5wdXQgPSBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKworICBydW5fbXV4aW5nX3Rlc3QgKCZpbnB1dDEsICZpbnB1dDIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbXV4aW5nX25vbl96ZXJvX3NlZ21lbnQpCit7CisgIHN0cnVjdCBUZXN0SW5wdXREYXRhIGlucHV0MSwgaW5wdXQyOworICBHc3RDYXBzICpjYXBzOworCisgIHRlc3RfaW5wdXRfZGF0YV9pbml0ICgmaW5wdXQxKTsKKyAgdGVzdF9pbnB1dF9kYXRhX2luaXQgKCZpbnB1dDIpOworCisgIC8qIENyZWF0ZSB0aGUgaW5wdXRzLCBhZnRlciBjYWxsaW5nIHRoZSBydW4gYmVsb3csIGFsbCB0aGlzIGRhdGEgaXMKKyAgICogdHJhbnNmZXJlZCB0byBpdCBhbmQgd2UgaGF2ZSBubyBuZWVkIHRvIGNsZWFuIHVwICovCisgIGlucHV0MS5pbnB1dCA9IE5VTEw7CisgIGlucHV0MS5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgidGVzdC0xIikpOworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcKKyAgICAgICgidmlkZW8veC1yYXcsIHdpZHRoPShpbnQpODAwLCBoZWlnaHQ9KGludCk2MDAsICIKKyAgICAgICJmcmFtZXJhdGU9KGZyYWN0aW9uKTEvMSwgZm9ybWF0PShzdHJpbmcpUkdCIik7CisgIGlucHV0MS5pbnB1dCA9IGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJmlucHV0MS5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBpbnB1dDEuc2VnbWVudC5zdGFydCA9IDEwICogR1NUX1NFQ09ORDsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmaW5wdXQxLnNlZ21lbnQpKTsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoMTAgKiBHU1RfU0VDT05ELAorICAgICAgICAgIEdTVF9DTE9DS19USU1FX05PTkUsIEdTVF9TRUNPTkQsIDgwMCAqIDYwMCAqIDMpKTsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoMTEgKiBHU1RfU0VDT05ELAorICAgICAgICAgIEdTVF9DTE9DS19USU1FX05PTkUsIEdTVF9TRUNPTkQsIDgwMCAqIDYwMCAqIDMpKTsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoMTIgKiBHU1RfU0VDT05ELAorICAgICAgICAgIEdTVF9DTE9DS19USU1FX05PTkUsIEdTVF9TRUNPTkQsIDgwMCAqIDYwMCAqIDMpKTsKKyAgaW5wdXQxLmlucHV0ID0gZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgIGlucHV0MS50c19vZmZzZXQgPSBHU1RfU0VDT05EICogMTA7CisKKyAgaW5wdXQyLmlucHV0ID0gTlVMTDsKKyAgaW5wdXQyLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJ0ZXN0LTIiKSk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fQUFDX0NBUFNfU1RSSU5HKTsKKyAgaW5wdXQyLmlucHV0ID0gZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBnc3RfZXZlbnRfbmV3X2NhcHMgKGNhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBnc3Rfc2VnbWVudF9pbml0ICgmaW5wdXQyLnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGlucHV0Mi5zZWdtZW50LnN0YXJ0ID0gMTAgKiBHU1RfU0VDT05EOworICBpbnB1dDIuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZpbnB1dDIuc2VnbWVudCkpOworICBpbnB1dDIuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBjcmVhdGVfYnVmZmVyICgxMCAqIEdTVF9TRUNPTkQsCisgICAgICAgICAgMTAgKiBHU1RfU0VDT05ELCBHU1RfU0VDT05ELCA0MDk2KSk7CisgIGlucHV0Mi5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGNyZWF0ZV9idWZmZXIgKDExICogR1NUX1NFQ09ORCwKKyAgICAgICAgICAxMSAqIEdTVF9TRUNPTkQsIEdTVF9TRUNPTkQsIDQwOTYpKTsKKyAgaW5wdXQyLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoMTIgKiBHU1RfU0VDT05ELAorICAgICAgICAgIDEyICogR1NUX1NFQ09ORCwgR1NUX1NFQ09ORCwgNDA5NikpOworICBpbnB1dDIuaW5wdXQgPSBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgaW5wdXQyLnRzX29mZnNldCA9IEdTVF9TRUNPTkQgKiAxMDsKKworICBydW5fbXV4aW5nX3Rlc3QgKCZpbnB1dDEsICZpbnB1dDIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbXV4aW5nX25vbl96ZXJvX3NlZ21lbnRfZGlmZmVyZW50KQoreworICBzdHJ1Y3QgVGVzdElucHV0RGF0YSBpbnB1dDEsIGlucHV0MjsKKyAgR3N0Q2FwcyAqY2FwczsKKworICB0ZXN0X2lucHV0X2RhdGFfaW5pdCAoJmlucHV0MSk7CisgIHRlc3RfaW5wdXRfZGF0YV9pbml0ICgmaW5wdXQyKTsKKworICAvKiBDcmVhdGUgdGhlIGlucHV0cywgYWZ0ZXIgY2FsbGluZyB0aGUgcnVuIGJlbG93LCBhbGwgdGhpcyBkYXRhIGlzCisgICAqIHRyYW5zZmVyZWQgdG8gaXQgYW5kIHdlIGhhdmUgbm8gbmVlZCB0byBjbGVhbiB1cCAqLworICBpbnB1dDEuaW5wdXQgPSBOVUxMOworICBpbnB1dDEuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoInRlc3QtMSIpKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nCisgICAgICAoInZpZGVvL3gtcmF3LCB3aWR0aD0oaW50KTgwMCwgaGVpZ2h0PShpbnQpNjAwLCAiCisgICAgICAiZnJhbWVyYXRlPShmcmFjdGlvbikxLzEsIGZvcm1hdD0oc3RyaW5nKVJHQiIpOworICBpbnB1dDEuaW5wdXQgPSBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGdzdF9ldmVudF9uZXdfY2FwcyAoY2FwcykpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZpbnB1dDEuc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgaW5wdXQxLnNlZ21lbnQuc3RhcnQgPSA1ICogR1NUX1NFQ09ORDsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmaW5wdXQxLnNlZ21lbnQpKTsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoNSAqIEdTVF9TRUNPTkQsCisgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSwgR1NUX1NFQ09ORCwgODAwICogNjAwICogMykpOworICBpbnB1dDEuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBjcmVhdGVfYnVmZmVyICg2ICogR1NUX1NFQ09ORCwKKyAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FLCBHU1RfU0VDT05ELCA4MDAgKiA2MDAgKiAzKSk7CisgIGlucHV0MS5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGNyZWF0ZV9idWZmZXIgKDcgKiBHU1RfU0VDT05ELAorICAgICAgICAgIEdTVF9DTE9DS19USU1FX05PTkUsIEdTVF9TRUNPTkQsIDgwMCAqIDYwMCAqIDMpKTsKKyAgaW5wdXQxLmlucHV0ID0gZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgIGlucHV0MS50c19vZmZzZXQgPSBHU1RfU0VDT05EICogNTsKKworICBpbnB1dDIuaW5wdXQgPSBOVUxMOworICBpbnB1dDIuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoInRlc3QtMiIpKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChBVURJT19BQUNfQ0FQU19TVFJJTkcpOworICBpbnB1dDIuaW5wdXQgPSBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGdzdF9ldmVudF9uZXdfY2FwcyAoY2FwcykpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZpbnB1dDIuc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgaW5wdXQyLnNlZ21lbnQuc3RhcnQgPSAxMCAqIEdTVF9TRUNPTkQ7CisgIGlucHV0Mi5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmlucHV0Mi5zZWdtZW50KSk7CisgIGlucHV0Mi5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGNyZWF0ZV9idWZmZXIgKDEwICogR1NUX1NFQ09ORCwKKyAgICAgICAgICAxMCAqIEdTVF9TRUNPTkQsIEdTVF9TRUNPTkQsIDQwOTYpKTsKKyAgaW5wdXQyLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoMTEgKiBHU1RfU0VDT05ELAorICAgICAgICAgIDExICogR1NUX1NFQ09ORCwgR1NUX1NFQ09ORCwgNDA5NikpOworICBpbnB1dDIuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBjcmVhdGVfYnVmZmVyICgxMiAqIEdTVF9TRUNPTkQsCisgICAgICAgICAgMTIgKiBHU1RfU0VDT05ELCBHU1RfU0VDT05ELCA0MDk2KSk7CisgIGlucHV0Mi5pbnB1dCA9IGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworICBpbnB1dDIudHNfb2Zmc2V0ID0gR1NUX1NFQ09ORCAqIDEwOworCisgIHJ1bl9tdXhpbmdfdGVzdCAoJmlucHV0MSwgJmlucHV0Mik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbXV4aW5nX2R0c19vdXRzaWRlX3NlZ21lbnQpCit7CisgIHN0cnVjdCBUZXN0SW5wdXREYXRhIGlucHV0MSwgaW5wdXQyOworICBHc3RDYXBzICpjYXBzOworCisgIHRlc3RfaW5wdXRfZGF0YV9pbml0ICgmaW5wdXQxKTsKKyAgdGVzdF9pbnB1dF9kYXRhX2luaXQgKCZpbnB1dDIpOworCisgIC8qIENyZWF0ZSB0aGUgaW5wdXRzLCBhZnRlciBjYWxsaW5nIHRoZSBydW4gYmVsb3csIGFsbCB0aGlzIGRhdGEgaXMKKyAgICogdHJhbnNmZXJlZCB0byBpdCBhbmQgd2UgaGF2ZSBubyBuZWVkIHRvIGNsZWFuIHVwICovCisgIGlucHV0MS5pbnB1dCA9IE5VTEw7CisgIGlucHV0MS5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgidGVzdC0xIikpOworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcKKyAgICAgICgidmlkZW8veC1oMjY0LCB3aWR0aD0oaW50KTgwMCwgaGVpZ2h0PShpbnQpNjAwLCAiCisgICAgICAiZnJhbWVyYXRlPShmcmFjdGlvbikxLzEsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylhdmMsIGNvZGVjX2RhdGE9KGJ1ZmZlcikwMDAwLCIKKyAgICAgICIgYWxpZ25tZW50PShzdHJpbmcpYXUsIGxldmVsPShpbnQpMiwgcHJvZmlsZT0oc3RyaW5nKWhpZ2giKTsKKyAgaW5wdXQxLmlucHV0ID0gZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBnc3RfZXZlbnRfbmV3X2NhcHMgKGNhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBnc3Rfc2VnbWVudF9pbml0ICgmaW5wdXQxLnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGlucHV0MS5zZWdtZW50LnN0YXJ0ID0gMSAqIEdTVF9TRUNPTkQ7CisgIGlucHV0MS5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmlucHV0MS5zZWdtZW50KSk7CisgIGlucHV0MS5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGNyZWF0ZV9idWZmZXIgKDEgKiBHU1RfU0VDT05ELAorICAgICAgICAgIDAsIEdTVF9TRUNPTkQsIDQwOTYpKTsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoMiAqIEdTVF9TRUNPTkQsCisgICAgICAgICAgMSAqIEdTVF9TRUNPTkQsIEdTVF9TRUNPTkQsIDQwOTYpKTsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoMyAqIEdTVF9TRUNPTkQsCisgICAgICAgICAgMiAqIEdTVF9TRUNPTkQsIEdTVF9TRUNPTkQsIDQwOTYpKTsKKyAgaW5wdXQxLmlucHV0ID0gZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgIC8qIEZpcnN0IERUUyBpcyAwLCBmaXJzdCBQVFMgaXMgMXMuIFRoZSBzZWdtZW50IHN0YXJ0IGJlaW5nIDEsIHRoaXMgbWVhbnMKKyAgICogcnVubmluZyB0aW1lIC0xcyBhbmQgMC4gU28gdGhlIG91dHB1dCBzZWdtZW50IHNob3VsZCBzdGFydCBmcm9tIDFzIHRvIGtlZXAKKyAgICogdGhlIHNhbWUgcnVubmluZyB0aW1lICovCisgIHRlc3RfaW5wdXRfcG9wX3NlZ21lbnRfc3RhcnQgKCZpbnB1dDEpOworICB0ZXN0X2lucHV0X3B1c2hfc2VnbWVudF9zdGFydCAoJmlucHV0MSwgR1NUX1NFQ09ORCk7CisKKyAgaW5wdXQyLmlucHV0ID0gTlVMTDsKKyAgaW5wdXQyLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJ0ZXN0LTIiKSk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoQVVESU9fQUFDX0NBUFNfU1RSSU5HKTsKKyAgaW5wdXQyLmlucHV0ID0gZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBnc3RfZXZlbnRfbmV3X2NhcHMgKGNhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBnc3Rfc2VnbWVudF9pbml0ICgmaW5wdXQyLnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGlucHV0Mi5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmlucHV0Mi5zZWdtZW50KSk7CisgIGlucHV0Mi5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGNyZWF0ZV9idWZmZXIgKDAsIDAsIEdTVF9TRUNPTkQsCisgICAgICAgICAgNDQxMDAgKiA0ICogMikpOworICBpbnB1dDIuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBjcmVhdGVfYnVmZmVyIChHU1RfU0VDT05ELCBHU1RfU0VDT05ELAorICAgICAgICAgIEdTVF9TRUNPTkQsIDQ0MTAwICogNCAqIDIpKTsKKyAgaW5wdXQyLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoMiAqIEdTVF9TRUNPTkQsCisgICAgICAgICAgMiAqIEdTVF9TRUNPTkQsIEdTVF9TRUNPTkQsIDQ0MTAwICogNCAqIDIpKTsKKyAgaW5wdXQyLmlucHV0ID0gZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisKKyAgcnVuX211eGluZ190ZXN0ICgmaW5wdXQxLCAmaW5wdXQyKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tdXhpbmdfaW5pdGlhbF9nYXApCit7CisgIHN0cnVjdCBUZXN0SW5wdXREYXRhIGlucHV0MSwgaW5wdXQyOworICBHc3RDYXBzICpjYXBzOworCisgIHRlc3RfaW5wdXRfZGF0YV9pbml0ICgmaW5wdXQxKTsKKyAgdGVzdF9pbnB1dF9kYXRhX2luaXQgKCZpbnB1dDIpOworCisgIC8qIENyZWF0ZSB0aGUgaW5wdXRzLCBhZnRlciBjYWxsaW5nIHRoZSBydW4gYmVsb3csIGFsbCB0aGlzIGRhdGEgaXMKKyAgICogdHJhbnNmZXJlZCB0byBpdCBhbmQgd2UgaGF2ZSBubyBuZWVkIHRvIGNsZWFuIHVwICovCisgIGlucHV0MS5pbnB1dCA9IE5VTEw7CisgIGlucHV0MS5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgidGVzdC0xIikpOworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcKKyAgICAgICgidmlkZW8veC1oMjY0LCB3aWR0aD0oaW50KTgwMCwgaGVpZ2h0PShpbnQpNjAwLCAiCisgICAgICAiZnJhbWVyYXRlPShmcmFjdGlvbikxLzEsIHN0cmVhbS1mb3JtYXQ9KHN0cmluZylhdmMsIGNvZGVjX2RhdGE9KGJ1ZmZlcikwMDAwLCIKKyAgICAgICIgYWxpZ25tZW50PShzdHJpbmcpYXUsIGxldmVsPShpbnQpMiwgcHJvZmlsZT0oc3RyaW5nKWhpZ2giKTsKKyAgaW5wdXQxLmlucHV0ID0gZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBnc3RfZXZlbnRfbmV3X2NhcHMgKGNhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBnc3Rfc2VnbWVudF9pbml0ICgmaW5wdXQxLnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGlucHV0MS5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJmlucHV0MS5zZWdtZW50KSk7CisgIC8qIER1cGxpY2F0ZSB0aGUgc2VnbWVudCB0byBwbGVhc2UgdGhlIGhhcm5lc3MgKi8KKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmaW5wdXQxLnNlZ21lbnQpKTsKKyAgaW5wdXQxLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0MS5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoMSAqIEdTVF9TRUNPTkQsCisgICAgICAgICAgMCwgR1NUX1NFQ09ORCwgNDA5NikpOworICBpbnB1dDEuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBjcmVhdGVfYnVmZmVyICgyICogR1NUX1NFQ09ORCwKKyAgICAgICAgICAxICogR1NUX1NFQ09ORCwgR1NUX1NFQ09ORCwgNDA5NikpOworICBpbnB1dDEuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQxLmlucHV0LCBjcmVhdGVfYnVmZmVyICgzICogR1NUX1NFQ09ORCwKKyAgICAgICAgICAyICogR1NUX1NFQ09ORCwgR1NUX1NFQ09ORCwgNDA5NikpOworICBpbnB1dDEuaW5wdXQgPSBnX2xpc3RfYXBwZW5kIChpbnB1dDEuaW5wdXQsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKworICAvKiBXZSBleHBlY3QgYSAxcyBnYXAgYXQgdGhlIHN0YXJ0ICovCisgIGlucHV0MS5leHBlY3RlZF9nYXBfZHVyYXRpb24gPSBHU1RfU0VDT05EOworICAvKiBUaGVyZSB3aWxsIGJlIHR3byBzZWdtZW50cywgZmlyc3QgaXMgMCwgc28gbGVhdmUgaXQgdGhlcmUsIHNlY29uZCBzaG91bGQKKyAgICogbWF0Y2ggdGhlIGZpcnN0IENUVFMgKFBUUyAtIERUUykgKi8KKyAgdGVzdF9pbnB1dF9wdXNoX3NlZ21lbnRfc3RhcnQgKCZpbnB1dDEsIEdTVF9TRUNPTkQpOworCisgIGlucHV0Mi5pbnB1dCA9IE5VTEw7CisgIGlucHV0Mi5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgidGVzdC0yIikpOworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX0FBQ19DQVBTX1NUUklORyk7CisgIGlucHV0Mi5pbnB1dCA9IGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJmlucHV0Mi5zZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBpbnB1dDIuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZpbnB1dDIuc2VnbWVudCkpOworICBpbnB1dDIuaW5wdXQgPQorICAgICAgZ19saXN0X2FwcGVuZCAoaW5wdXQyLmlucHV0LCBjcmVhdGVfYnVmZmVyICgwLCAwLCBHU1RfU0VDT05ELAorICAgICAgICAgIDQ0MTAwICogNCAqIDIpKTsKKyAgaW5wdXQyLmlucHV0ID0KKyAgICAgIGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgY3JlYXRlX2J1ZmZlciAoR1NUX1NFQ09ORCwgR1NUX1NFQ09ORCwKKyAgICAgICAgICBHU1RfU0VDT05ELCA0NDEwMCAqIDQgKiAyKSk7CisgIGlucHV0Mi5pbnB1dCA9CisgICAgICBnX2xpc3RfYXBwZW5kIChpbnB1dDIuaW5wdXQsIGNyZWF0ZV9idWZmZXIgKDIgKiBHU1RfU0VDT05ELAorICAgICAgICAgIDIgKiBHU1RfU0VDT05ELCBHU1RfU0VDT05ELCA0NDEwMCAqIDQgKiAyKSk7CisgIGlucHV0Mi5pbnB1dCA9IGdfbGlzdF9hcHBlbmQgKGlucHV0Mi5pbnB1dCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpOworCisgIHJ1bl9tdXhpbmdfdGVzdCAoJmlucHV0MSwgJmlucHV0Mik7CisKKyAgZmFpbF91bmxlc3MgKGlucHV0MS5nYXBfcmVjZWl2ZWQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitxdG11eF9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJxdG11eCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgLyogYXZvaWQgZ2xpYiB3YXJuaW5ncyB3aGVuIHNldHRpbmcgZGVwcmVjYXRlZCBkdHMtbWV0aG9kIHByb3BlcnR5ICovCisgIGdfc2V0ZW52ICgiR19FTkFCTEVfRElBR05PU1RJQyIsICIwIiwgVFJVRSk7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF92aWRlb19wYWRfZGQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYXVkaW9fcGFkX2RkKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3ZpZGVvX3BhZF9mcmFnX2RkKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2F1ZGlvX3BhZF9mcmFnX2RkKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3ZpZGVvX3BhZF9mcmFnX2RkX3N0cmVhbWFibGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYXVkaW9fcGFkX2ZyYWdfZGRfc3RyZWFtYWJsZSk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3ZpZGVvX3BhZF9yZW9yZGVyKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2F1ZGlvX3BhZF9yZW9yZGVyKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3ZpZGVvX3BhZF9mcmFnX3Jlb3JkZXIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYXVkaW9fcGFkX2ZyYWdfcmVvcmRlcik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF92aWRlb19wYWRfZnJhZ19yZW9yZGVyX3N0cmVhbWFibGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYXVkaW9fcGFkX2ZyYWdfcmVvcmRlcl9zdHJlYW1hYmxlKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdmlkZW9fcGFkX2FzYyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hdWRpb19wYWRfYXNjKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3ZpZGVvX3BhZF9mcmFnX2FzYyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hdWRpb19wYWRfZnJhZ19hc2MpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdmlkZW9fcGFkX2ZyYWdfYXNjX3N0cmVhbWFibGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYXVkaW9fcGFkX2ZyYWdfYXNjX3N0cmVhbWFibGUpOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hdmVyYWdlX2JpdHJhdGUpOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9yZXVzZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9lbmNvZGViaW5fcXRtdXgpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZW5jb2RlYmluX21wNG11eCk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X211eGluZyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9tdXhpbmdfbm9uX3plcm9fc2VnbWVudCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9tdXhpbmdfbm9uX3plcm9fc2VnbWVudF9kaWZmZXJlbnQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbXV4aW5nX2R0c19vdXRzaWRlX3NlZ21lbnQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbXV4aW5nX2luaXRpYWxfZ2FwKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHF0bXV4KQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcmdhbmFseXNpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYmJiYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9yZ2FuYWx5c2lzLmMKQEAgLTAsMCArMSwxOTc5IEBACisvKiBHU3RyZWFtZXIgUmVwbGF5R2FpbiBhbmFseXNpcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSZW5lIFN0YWRsZXIgPG1haWxAcmVuZXN0YWRsZXIuZGU+CisgKgorICogcmdhbmFseXNpcy5jOiBVbml0IHRlc3QgZm9yIHRoZSByZ2FuYWx5c2lzIGVsZW1lbnQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKiBTb21lIHRoaW5ncyB0byBub3RlIGFib3V0IHRoZSBSTVMgd2luZG93IGxlbmd0aCBvZiB0aGUgYW5hbHlzaXMgYWxnb3JpdGhtIGFuZAorICogdGh1cyB0aGUgaW1wbGVtZW50YXRpb24gdXNlZCBpbiB0aGUgZWxlbWVudDogUHJvY2Vzc2luZyBkaXZpZGVzIGlucHV0IGRhdGEKKyAqIGludG8gNTBtcyB3aW5kb3dzIGF0IHNvbWUgcG9pbnQuICBTb21lIGRldGFpbHMgYWJvdXQgdGhpcyB0aGF0IG5vcm1hbGx5IGRvCisgKiBub3QgbWF0dGVyOgorICoKKyAqICAxLiBBdCB0aGUgZW5kIG9mIGEgc3RyZWFtLCB0aGUgcmVtYWluZGVyIG9mIGRhdGEgdGhhdCBkaWQgbm90IGZpbGwgdXAgdGhlCisgKiAgICAgbGFzdCA1MG1zIHdpbmRvdyBpcyBzaW1wbHkgZGlzY2FyZGVkLgorICoKKyAqICAyLiBJZiB0aGUgc2FtcGxlIHJhdGUgY2hhbmdlcyBkdXJpbmcgYSBzdHJlYW0sIHRoZSBjdXJyZW50bHkgcnVubmluZyB3aW5kb3cKKyAqICAgICBpcyBkaXNjYXJkZWQgYW5kIHRoZSBlcXVhbCBsb3VkbmVzcyBmaWx0ZXIgZ2V0cyByZXNldCBhcyBpZiBhIG5ldyBzdHJlYW0KKyAqICAgICBzdGFydGVkLgorICoKKyAqICAzLiBGb3IgdGhlIGFsYnVtIGdhaW4sIGl0IGlzIG5vdCBlbnRpcmVseSBjb3JyZWN0IHRvIHRoaW5rIG9mIG9idGFpbmluZyBpdAorICogICAgIGxpa2UgImFzIGlmIGFsbCB0aGUgdHJhY2tzIGFyZSBhbmFseXplZCBhcyBvbmUgdHJhY2siLiAgVGhlcmUgaXNuJ3QgYQorICogICAgIHNlcGFyYXRlIHdpbmRvdyBiZWluZyB0cmFja2VkIGZvciBhbGJ1bSBwcm9jZXNzaW5nLCBzbyBhdCBzdHJlYW0gKHRyYWNrKQorICogICAgIGVuZCwgdGhlIHJlbWFpbmluZyB1bmZpbGxlZCB3aW5kb3cgZG9lcyBub3QgY29udHJpYnV0ZSB0byB0aGUgYWxidW0gZ2FpbgorICogICAgIGVpdGhlci4KKyAqCisgKiAgNC4gSWYgYSB3YXZlZm9ybSB3aXRoIGEgcmVzdWx0IGdhaW4gRyBpcyBjb25jYXRlbmF0ZWQgdG8gaXRzZWxmIGFuZCB0aGUKKyAqICAgICByZXN1bHQgcHJvY2Vzc2VkIGFzIGEgdHJhY2ssIHRoZSBnYWluIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBHIGlmIGFuZCBvbmx5CisgKiAgICAgaWYgdGhlIGR1cmF0aW9uIG9mIHRoZSBvcmlnaW5hbCB3YXZlZm9ybSBpcyBub3QgYW4gaW50ZWdlciBtdWx0aXBsZSBvZgorICogICAgIDUwbXMuICBJZiB0aGUgb3JpZ2luYWwgd2F2ZWZvcm0gZ2V0cyBwcm9jZXNzZWQgYXMgYSBzaW5nbGUgdHJhY2sgYW5kIHRoZW4KKyAqICAgICB0aGUgc2FtZSBkYXRhIGFnYWluIGFzIGEgc3Vic2VxdWVudCB0cmFjaywgdGhlIGFsYnVtIHJlc3VsdCBnYWluIHdpbGwKKyAqICAgICBhbHdheXMgbWF0Y2ggRyAodGhpcyBpcyBpbXBsaWVkIGJ5IDMuKS4KKyAqCisgKiAgNS4gQSBzdHJlYW0gc2hvcnRlciB0aGFuIDUwbXMgY2Fubm90IGJlIGFuYWx5emVkLiAgQXQgODAwMCBhbmQgNDgwMDAgSHosCisgKiAgICAgdGhpcyBjb3JyZXNwb25kcyB0byA0MDAgcmVzcC4gMjQwMCBmcmFtZXMuICBJZiBhIHN0cmVhbSBpcyBzaG9ydGVyIHRoYW4KKyAqICAgICA1MG1zLCB0aGUgZWxlbWVudCB3aWxsIG5vdCBnZW5lcmF0ZSB0YWdzIGF0IEVPUyAob25seSBpZiBhbiBhbGJ1bQorICogICAgIGZpbmlzaGVkLCBidXQgb25seSBhbGJ1bSB0YWdzIGFyZSBnZW5lcmF0ZWQgdGhlbikuICBUaGlzIGlzIG5vdCBhbgorICogICAgIGVycm9uZW91cyBjb25kaXRpb24sIHRoZSBlbGVtZW50IHNob3VsZCBiZWhhdmUgbm9ybWFsbHkuCisgKgorICogVGhlIGxpbWl0YXRpb25zIG91dGxpbmVkIGluIDEuLTQuIGRvIG5vdCBhcHBseSB0byB0aGUgcGVhayB2YWx1ZXMuICBFdmVyeQorICogc2luZ2xlIHNhbXBsZSBpcyBhY2NvdW50ZWQgZm9yIHdoZW4gbG9va2luZyBmb3IgdGhlIHBlYWsuICBUaHVzIHRoZSBhbGJ1bQorICogcGVhayBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGFsbCB0cmFjayBwZWFrcy4KKyAqCisgKiBJbiBub3JtYWwgZGF5LXRvLWRheSB1c2UsIHRoZXNlIGxpdHRsZSBmYWN0cyBhcmUgdW5saWtlbHkgdG8gYmUgcmVsZXZhbnQsIGJ1dAorICogdGhleSBoYXZlIHRvIGJlIGtlcHQgaW4gbWluZCBmb3Igd3JpdGluZyB0aGUgdGVzdHMgaGVyZS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKy8qIEZvciBlYXNlIG9mIHByb2dyYW1taW5nIHdlIHVzZSBnbG9iYWxzIHRvIGtlZXAgcmVmcyBmb3Igb3VyIGZsb2F0aW5nIHNyYyBhbmQKKyAqIHNpbmsgcGFkcyB3ZSBjcmVhdGU7IG90aGVyd2lzZSB3ZSBhbHdheXMgaGF2ZSB0byBkbyBnZXRfcGFkLCBnZXRfcGVlciwgYW5kCisgKiB0aGVuIHJlbW92ZSByZWZlcmVuY2VzIGluIGV2ZXJ5IHRlc3QgZnVuY3Rpb24gKi8KK3N0YXRpYyBHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworc3RhdGljIEdzdEJ1cyAqbXlidXM7CisKKy8qIE1hcHBpbmcgZnJvbSBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzIHRvIHRoZSBjb3JyZWN0IHJlc3VsdCBnYWluIGZvciB0aGUKKyAqIGZvbGxvd2luZyB0ZXN0IHdhdmVmb3JtOiAyMCAqIDUxMiBzYW1wbGVzIHdpdGggYSBxdWFydGVyLWZ1bGwgYW1wbGl0dWRlIG9mCisgKiB0b2dnbGluZyBzaWduLCBjaGFuZ2luZyBldmVyeSA0OCBzYW1wbGVzIGFuZCBzdGFydGluZyB3aXRoIHRoZSBwb3NpdGl2ZQorICogdmFsdWUuCisgKgorICogRXZlbiBpZiB3ZSB3b3VsZCBnZW5lcmF0ZSBhIHdhdmUgZGVzY3JpYmluZyBhIHNpZ25hbCB3aXRoIHRoZSBzYW1lIGZyZXF1ZW5jeQorICogYXQgZWFjaCBzYW1wbGluZyByYXRlLCB0aGUgcmVzdWx0cyB3b3VsZCB2YXJ5IChzbGlnaHRseSkuICBIZW5jZSB0aGUgc2ltcGxlCisgKiBnZW5lcmF0aW9uIG1ldGhvZCwgc2luY2Ugd2UgY2Fubm90IHVzZSBhIGNvbnN0YW50IHZhbHVlIGFzIGV4cGVjdGVkIHJlc3VsdAorICogYW55d2F5cy4gIEZvciBhbGwgc2FtcGxlIHJhdGVzLCBjaGFuZ2luZyB0aGUgc2lnbiBldmVyeSA0OCBmcmFtZXMgZ2l2ZXMgYQorICogc2FuZSBmcmVxdWVuY3kuICBCdWZmZXJzIGNvbnRhaW5pbmcgZGF0YSB0aGF0IGZvcm1zIHN1Y2ggYSB3YXZlZm9ybSBpcworICogY3JlYXRlZCB1c2luZyB0aGUgdGVzdF9idWZmZXJfc3F1YXJlX3tmbG9hdCxpbnQxNn1fe21vbm8sc3RlcmVvfSBmdW5jdGlvbnMKKyAqIGJlbG93LgorICoKKyAqIFRoZSByZXN1bHRzIGhhdmUgYmVlbiBjaGVja2VkIGFnYWluc3Qgd2hhdCB0aGUgbWV0YWZsYWMgYW5kIHdhdmVnYWluIHByb2dyYW1zCisgKiBnZW5lcmF0ZSBmb3Igc3VjaCBhIHN0cmVhbS4gIElmIHlvdSB3YW50IHRvIHZlcmlmeSB0aGVzZSwgYmUgc3VyZSB0aGF0IHRoZQorICogbWV0YWZsYWMgcHJvZ3JhbSBkb2VzIG5vdCBwcm9kdWNlIGluY29ycmVjdCByZXN1bHRzIGluIHlvdXIgZW52aXJvbm1lbnQ6IEkKKyAqIGZvdW5kIGEgc3RyYW5nZSBidWcgaW4gdGhlIChkZWZhY3RvKSByZWZlcmVuY2UgY29kZSBmb3IgdGhlIGFuYWx5c2lzIHRoYXQKKyAqIHNvbWV0aW1lcyBsZWFkcyB0byBpbmNvcnJlY3QgUk1TIHdpbmRvdyBsZW5ndGhzLiAqLworCitzdHJ1Y3QgcmF0ZV90ZXN0Cit7CisgIGd1aW50IHNhbXBsZV9yYXRlOworICBnZG91YmxlIGdhaW47Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJhdGVfdGVzdCBzdXBwb3J0ZWRfcmF0ZXNbXSA9IHsKKyAgezgwMDAsIC0wLjkxfSwKKyAgezExMDI1LCAtMi44MH0sCisgIHsxMjAwMCwgLTMuMTN9LAorICB7MTYwMDAsIC00LjI2fSwKKyAgezIyMDUwLCAtNS42NH0sCisgIHsyNDAwMCwgLTUuODd9LAorICB7MzIwMDAsIC02LjAzfSwKKyAgezQ0MTAwLCAtNi4yMH0sCisgIHs0ODAwMCwgLTYuMTR9Cit9OworCisvKiBMb29rdXAgdGhlIGNvcnJlY3QgZ2FpbiBhZGp1c3RtZW50IHJlc3VsdCBpbiBhYm92ZSBhcnJheS4gKi8KKworc3RhdGljIGdkb3VibGUKK2dldF9leHBlY3RlZF9nYWluIChndWludCBzYW1wbGVfcmF0ZSkKK3sKKyAgZ2ludCBpOworCisgIGZvciAoaSA9IEdfTl9FTEVNRU5UUyAoc3VwcG9ydGVkX3JhdGVzKTsgaS0tOykKKyAgICBpZiAoc3VwcG9ydGVkX3JhdGVzW2ldLnNhbXBsZV9yYXRlID09IHNhbXBsZV9yYXRlKQorICAgICAgcmV0dXJuIHN1cHBvcnRlZF9yYXRlc1tpXS5nYWluOworICBnX3JldHVybl92YWxfaWZfcmVhY2hlZCAoMC4wKTsKK30KKworI2RlZmluZSBTSUxFTkNFX0dBSU4gNjQuODIKKworI2RlZmluZSBSRVBMQVlfR0FJTl9DQVBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJjaGFubmVscyA9IChpbnQpIHsgMSwgMiB9LCAiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInJhdGUgPSAoaW50KSB7IDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAiICAgXAorICAiMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAgfSIKKworI2RlZmluZSBSR19BTkFMWVNJU19DQVBTX1RFTVBMQVRFX1NUUklORyAgICAgIFwKKyAgImF1ZGlvL3gtcmF3LCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJmb3JtYXQgPSAoc3RyaW5nKSAiR1NUX0FVRElPX05FIChGMzIpICIsICIgXAorICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgICAgICAgICAgIFwKKyAgUkVQTEFZX0dBSU5fQ0FQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICI7ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImZvcm1hdCA9IChzdHJpbmcpICJHU1RfQVVESU9fTkUgKFMxNikgIiwgIiBcCisgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgICAgICAgICAgXAorICBSRVBMQVlfR0FJTl9DQVBTCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFJHX0FOQUxZU0lTX0NBUFNfVEVNUExBVEVfU1RSSU5HKQorICAgICk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChSR19BTkFMWVNJU19DQVBTX1RFTVBMQVRFX1NUUklORykKKyAgICApOworCitzdGF0aWMgZ2Jvb2xlYW4KK215c2lua19ldmVudF9mdW5jIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0RXZlbnQgKiBldmVudCkKK3sKKyAgR1NUX0xPR19PQkpFQ1QgKHBhZCwgIiVzIGV2ZW50OiAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIEdTVF9FVkVOVF9UWVBFX05BTUUgKGV2ZW50KSwgZXZlbnQpOworCisgIC8qIGEgc2luayB3b3VsZCBwb3N0IHRhZyBldmVudHMgYXMgbWVzc2FnZXMsIHNvIGRvIHRoZSBzYW1lIGhlcmUsCisgICAqIGVzcC4gc2luY2Ugd2UncmUgcG9sbGluZyBvbiB0aGUgYnVzIHdhaXRpbmcgZm9yIFRBRyBtZXNzYWdlcy4uICovCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9UQUcpIHsKKyAgICBHc3RUYWdMaXN0ICp0YWdsaXN0OworCisgICAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAoZXZlbnQsICZ0YWdsaXN0KTsKKworICAgIGdzdF9idXNfcG9zdCAobXlidXMsIGdzdF9tZXNzYWdlX25ld190YWcgKEdTVF9PQkpFQ1QgKG15c2lua3BhZCksCisgICAgICAgICAgICBnc3RfdGFnX2xpc3RfY29weSAodGFnbGlzdCkpKTsKKyAgfQorCisgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfcmdhbmFseXNpcyAodm9pZCkKK3sKKyAgR3N0RWxlbWVudCAqYW5hbHlzaXM7CisgIEdzdEJ1cyAqYnVzOworCisgIEdTVF9ERUJVRyAoInNldHVwX3JnYW5hbHlzaXMiKTsKKyAgYW5hbHlzaXMgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoInJnYW5hbHlzaXMiKTsKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoYW5hbHlzaXMsICZzcmN0ZW1wbGF0ZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoYW5hbHlzaXMsICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9ldmVudF9mdW5jdGlvbiAobXlzaW5rcGFkLCBteXNpbmtfZXZlbnRfZnVuYyk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKGFuYWx5c2lzLCBidXMpOworCisgIG15YnVzID0gYnVzOyAgICAgICAgICAgICAgICAgIC8qIGtlZXAgcmVmICovCisKKyAgcmV0dXJuIGFuYWx5c2lzOworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF9yZ2FuYWx5c2lzIChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF9yZ2FuYWx5c2lzIik7CisKKyAgZ19saXN0X2ZvcmVhY2ggKGJ1ZmZlcnMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICBidWZmZXJzID0gTlVMTDsKKworICBnc3Rfb2JqZWN0X3VucmVmIChteWJ1cyk7CisgIG15YnVzID0gTlVMTDsKKworICAvKiBUaGUgYnVzIG93bnMgcmVmZXJlbmNlcyB0byB0aGUgZWxlbWVudDogKi8KKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAoZWxlbWVudCwgTlVMTCk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAoZWxlbWVudCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoZWxlbWVudCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChlbGVtZW50KTsKK30KKworc3RhdGljIHZvaWQKK3NldF9wbGF5aW5nX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgIkNvdWxkIG5vdCBzZXQgc3RhdGUgdG8gUExBWUlORyIpOworfQorCitzdGF0aWMgdm9pZAorc2VuZF9mbHVzaF9ldmVudHMgKEdzdEVsZW1lbnQgKiBlbGVtZW50KQoreworICBnYm9vbGVhbiByZXM7CisgIEdzdFBhZCAqcGFkOworCisgIHBhZCA9IG15c3JjcGFkOworICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHBhZCwgZ3N0X2V2ZW50X25ld19mbHVzaF9zdGFydCAoKSk7CisgIGZhaWxfdW5sZXNzIChyZXMsICJmbHVzaC1zdGFydCBldmVuIG5vdCBoYW5kbGVkdCIpOworICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHBhZCwgZ3N0X2V2ZW50X25ld19mbHVzaF9zdG9wIChUUlVFKSk7CisgIGZhaWxfdW5sZXNzIChyZXMsICJmbHVzaC1zdG9wIGV2ZW50IG5vdCBoYW5kbGVkIik7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIGdib29sZWFuIHJlczsKKyAgR3N0UGFkICpwYWQ7CisKKyAgcGFkID0gbXlzcmNwYWQ7CisgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAocGFkLCBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoInRlc3QiKSk7CisgIGZhaWxfdW5sZXNzIChyZXMsICJTVFJFQU1fU1RBUlQgZXZlbnQgbm90IGhhbmRsZWQiKTsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfY2Fwc19ldmVudCAoY29uc3QgZ2NoYXIgKiBmb3JtYXQsIGdpbnQgc2FtcGxlX3JhdGUsIGdpbnQgY2hhbm5lbHMpCit7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgZm9ybWF0LAorICAgICAgInJhdGUiLCBHX1RZUEVfSU5ULCBzYW1wbGVfcmF0ZSwgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgY2hhbm5lbHMsCisgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwgTlVMTCk7CisgIGlmIChjaGFubmVscyA9PSAyKSB7CisgICAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoY2FwcywKKyAgICAgICAgImNoYW5uZWwtbWFzayIsIEdTVF9UWVBFX0JJVE1BU0ssCisgICAgICAgIEdfR1VJTlQ2NF9DT05TVEFOVCAoMHgwMDAwMDAwMDAwMDAwMDAzKSwgTlVMTCk7CisgIH0KKyAgZ3N0X3BhZF9zZXRfY2FwcyAobXlzcmNwYWQsIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX3NlZ21lbnRfZXZlbnQgKEdzdEVsZW1lbnQgKiBlbGVtZW50KQoreworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIGdib29sZWFuIHJlczsKKyAgR3N0UGFkICpwYWQ7CisKKyAgcGFkID0gbXlzcmNwYWQ7CisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHBhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworICBmYWlsX3VubGVzcyAocmVzLCAiU0VHTUVOVCBldmVudCBub3QgaGFuZGxlZCIpOworfQorCitzdGF0aWMgdm9pZAorc2VuZF9lb3NfZXZlbnQgKEdzdEVsZW1lbnQgKiBlbGVtZW50KQoreworICBHc3RCdXMgKmJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKGVsZW1lbnQpOworICBHc3RQYWQgKnBhZCA9IG15c3JjcGFkOworICBnYm9vbGVhbiByZXM7CisKKyAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKTsKKyAgZmFpbF91bmxlc3MgKHJlcywgIkVPUyBldmVudCBub3QgaGFuZGxlZCIpOworCisgIC8qIFRoZXJlIGlzIG5vIHNpbmsgZWxlbWVudCwgc28gX3dlXyBwb3N0IHRoZSBFT1MgbWVzc2FnZSBvbiB0aGUgYnVzIGhlcmUuICBPZgorICAgKiBjb3Vyc2Ugd2UgZ2VuZXJhdGUgYW55IEVPUyBvdXJzZWx2ZXMsIGJ1dCB0aGlzIGFsbG93cyB1cyB0byBwb2xsIGZvciB0aGUKKyAgICogRU9TIG1lc3NhZ2UgaW4gcG9sbF9lb3MgaWYgd2UgZXhwZWN0IHRoZSBlbGVtZW50IHRvIF9ub3RfIGdlbmVyYXRlIGEgVEFHCisgICAqIG1lc3NhZ2UuICBUaGF0J3MgYmV0dGVyIHRoYW4gd2FpdGluZyBmb3IgYSB0aW1lb3V0IHRvIGxhcHNlLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X2J1c19wb3N0IChidXMsIGdzdF9tZXNzYWdlX25ld19lb3MgKE5VTEwpKSk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfdGFnX2V2ZW50IChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0VGFnTGlzdCAqIHRhZ19saXN0KQoreworICBHc3RQYWQgKnBhZCA9IG15c3JjcGFkOworICBHc3RFdmVudCAqZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3RhZyAodGFnX2xpc3QpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKHBhZCwgZXZlbnQpLAorICAgICAgIkNhbm5vdCBzZW5kIFRBRyBldmVudDogTm90IGhhbmRsZWQuIik7Cit9CisKK3N0YXRpYyB2b2lkCitwb2xsX2VvcyAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdEJ1cyAqYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAoZWxlbWVudCk7CisgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgbWVzc2FnZSA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9FT1MgfCBHU1RfTUVTU0FHRV9UQUcsIEdTVF9TRUNPTkQpOworICBmYWlsX3VubGVzcyAobWVzc2FnZSAhPSBOVUxMLCAiQ291bGQgbm90IHBvbGwgZm9yIEVPUyBtZXNzYWdlOiBUaW1lZCBvdXQiKTsKKyAgZmFpbF91bmxlc3MgKG1lc3NhZ2UtPnR5cGUgPT0gR1NUX01FU1NBR0VfRU9TLAorICAgICAgIkNvdWxkIG5vdCBwb2xsIGZvciBlb3MgbWVzc2FnZTogZ290IG1lc3NhZ2Ugb2YgdHlwZSAlcyBpbnN0ZWFkIiwKKyAgICAgIGdzdF9tZXNzYWdlX3R5cGVfZ2V0X25hbWUgKG1lc3NhZ2UtPnR5cGUpKTsKKworICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7Cit9CisKK3N0YXRpYyBHc3RUYWdMaXN0ICoKK3BvbGxfdGFnc19vbmx5IChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgR3N0QnVzICpidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChlbGVtZW50KTsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisKKyAgbWVzc2FnZSA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9UQUcsIEdTVF9TRUNPTkQpOworICBmYWlsX3VubGVzcyAobWVzc2FnZSAhPSBOVUxMLCAiQ291bGQgbm90IHBvbGwgZm9yIFRBRyBtZXNzYWdlOiBUaW1lZCBvdXQiKTsKKworICBnc3RfbWVzc2FnZV9wYXJzZV90YWcgKG1lc3NhZ2UsICZ0YWdfbGlzdCk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKworICByZXR1cm4gdGFnX2xpc3Q7Cit9CisKKy8qIFRoaXMgYWxzbyBwb2xscyBmb3IgRU9TIHNpbmNlIHRoZSBUQUcgbWVzc2FnZSBjb21lcyByaWdodCBiZWZvcmUgdGhlIGVuZCBvZgorICogc3RyZWFtcy4gKi8KKworc3RhdGljIEdzdFRhZ0xpc3QgKgorcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0ID0gcG9sbF90YWdzX29ubHkgKGVsZW1lbnQpOworCisgIHBvbGxfZW9zIChlbGVtZW50KTsKKworICByZXR1cm4gdGFnX2xpc3Q7Cit9CisKKyNkZWZpbmUgTUFUQ0hfUEVBSyhwMSwgcDIpICgocDEgPCBwMiArIDFlLTYpICYmIChwMiA8IHAxICsgMWUtNikpCisjZGVmaW5lIE1BVENIX0dBSU4oZzEsIGcyKSAoKGcxIDwgZzIgKyAxZS0xMykgJiYgKGcyIDwgZzEgKyAxZS0xMykpCisKK3N0YXRpYyB2b2lkCitmYWlsX3VubGVzc190cmFja19nYWluIChjb25zdCBHc3RUYWdMaXN0ICogdGFnX2xpc3QsIGdkb3VibGUgZ2FpbikKK3sKKyAgZ2RvdWJsZSByZXN1bHQ7CisKKyAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwgR1NUX1RBR19UUkFDS19HQUlOLCAmcmVzdWx0KSwKKyAgICAgICJUYWcgbGlzdCBjb250YWlucyBubyB0cmFjayBnYWluIHZhbHVlIik7CisgIGZhaWxfdW5sZXNzIChNQVRDSF9HQUlOIChnYWluLCByZXN1bHQpLAorICAgICAgIlRyYWNrIGdhaW4gJSsuMmYgZG9lcyBub3QgbWF0Y2gsIGV4cGVjdGVkICUrLjJmIiwgcmVzdWx0LCBnYWluKTsKK30KKworc3RhdGljIHZvaWQKK2ZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKGNvbnN0IEdzdFRhZ0xpc3QgKiB0YWdfbGlzdCwgZ2RvdWJsZSBwZWFrKQoreworICBnZG91YmxlIHJlc3VsdDsKKworICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ19saXN0LCBHU1RfVEFHX1RSQUNLX1BFQUssICZyZXN1bHQpLAorICAgICAgIlRhZyBsaXN0IGNvbnRhaW5zIG5vIHRyYWNrIHBlYWsgdmFsdWUiKTsKKyAgZmFpbF91bmxlc3MgKE1BVENIX1BFQUsgKHBlYWssIHJlc3VsdCksCisgICAgICAiVHJhY2sgcGVhayAlZiBkb2VzIG5vdCBtYXRjaCwgZXhwZWN0ZWQgJWYiLCByZXN1bHQsIHBlYWspOworfQorCitzdGF0aWMgdm9pZAorZmFpbF91bmxlc3NfYWxidW1fZ2FpbiAoY29uc3QgR3N0VGFnTGlzdCAqIHRhZ19saXN0LCBnZG91YmxlIGdhaW4pCit7CisgIGdkb3VibGUgcmVzdWx0OworCisgIGZhaWxfdW5sZXNzIChnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAodGFnX2xpc3QsIEdTVF9UQUdfQUxCVU1fR0FJTiwgJnJlc3VsdCksCisgICAgICAiVGFnIGxpc3QgY29udGFpbnMgbm8gYWxidW0gZ2FpbiB2YWx1ZSIpOworICBmYWlsX3VubGVzcyAoTUFUQ0hfR0FJTiAocmVzdWx0LCBnYWluKSwKKyAgICAgICJBbGJ1bSBnYWluICUrLjJmIGRvZXMgbm90IG1hdGNoLCBleHBlY3RlZCAlKy4yZiIsIHJlc3VsdCwgZ2Fpbik7Cit9CisKK3N0YXRpYyB2b2lkCitmYWlsX3VubGVzc19hbGJ1bV9wZWFrIChjb25zdCBHc3RUYWdMaXN0ICogdGFnX2xpc3QsIGdkb3VibGUgcGVhaykKK3sKKyAgZ2RvdWJsZSByZXN1bHQ7CisKKyAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwgR1NUX1RBR19BTEJVTV9QRUFLLCAmcmVzdWx0KSwKKyAgICAgICJUYWcgbGlzdCBjb250YWlucyBubyBhbGJ1bSBwZWFrIHZhbHVlIik7CisgIGZhaWxfdW5sZXNzIChNQVRDSF9QRUFLIChwZWFrLCByZXN1bHQpLAorICAgICAgIkFsYnVtIHBlYWsgJWYgZG9lcyBub3QgbWF0Y2gsIGV4cGVjdGVkICVmIiwgcmVzdWx0LCBwZWFrKTsKK30KKworc3RhdGljIHZvaWQKK2ZhaWxfaWZfdHJhY2tfdGFncyAoY29uc3QgR3N0VGFnTGlzdCAqIHRhZ19saXN0KQoreworICBnZG91YmxlIHJlc3VsdDsKKworICBmYWlsX2lmIChnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAodGFnX2xpc3QsIEdTVF9UQUdfVFJBQ0tfR0FJTiwgJnJlc3VsdCksCisgICAgICAiVGFnIGxpc3QgY29udGFpbnMgdHJhY2sgZ2FpbiB2YWx1ZSAoYnV0IHNob3VsZCBub3QpIik7CisgIGZhaWxfaWYgKGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwgR1NUX1RBR19UUkFDS19QRUFLLCAmcmVzdWx0KSwKKyAgICAgICJUYWcgbGlzdCBjb250YWlucyB0cmFjayBwZWFrIHZhbHVlIChidXQgc2hvdWxkIG5vdCkiKTsKK30KKworc3RhdGljIHZvaWQKK2ZhaWxfaWZfYWxidW1fdGFncyAoY29uc3QgR3N0VGFnTGlzdCAqIHRhZ19saXN0KQoreworICBnZG91YmxlIHJlc3VsdDsKKworICBmYWlsX2lmIChnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAodGFnX2xpc3QsIEdTVF9UQUdfQUxCVU1fR0FJTiwgJnJlc3VsdCksCisgICAgICAiVGFnIGxpc3QgY29udGFpbnMgYWxidW0gZ2FpbiB2YWx1ZSAoYnV0IHNob3VsZCBub3QpIik7CisgIGZhaWxfaWYgKGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwgR1NUX1RBR19BTEJVTV9QRUFLLCAmcmVzdWx0KSwKKyAgICAgICJUYWcgbGlzdCBjb250YWlucyBhbGJ1bSBwZWFrIHZhbHVlIChidXQgc2hvdWxkIG5vdCkiKTsKK30KKworc3RhdGljIHZvaWQKK2ZhaWxfdW5sZXNzX251bV90cmFja3MgKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBndWludCBudW1fdHJhY2tzKQoreworICBndWludCBjdXJyZW50OworCisgIGdfb2JqZWN0X2dldCAoZWxlbWVudCwgIm51bS10cmFja3MiLCAmY3VycmVudCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChjdXJyZW50ID09IG51bV90cmFja3MsCisgICAgICAibnVtLXRyYWNrcyBwcm9wZXJ0eSBoYXMgaW5jb3JyZWN0IHZhbHVlICV1LCBleHBlY3RlZCAldSIsCisgICAgICBjdXJyZW50LCBudW1fdHJhY2tzKTsKK30KKworLyogRnVuY3Rpb25zIHRoYXQgY3JlYXRlIGJ1ZmZlcnMgd2l0aCBjb25zdGFudCBzYW1wbGUgdmFsdWVzLCBmb3IgcGVhaworICogdGVzdHMuICovCisKK3N0YXRpYyBHc3RCdWZmZXIgKgordGVzdF9idWZmZXJfY29uc3RfZmxvYXRfbW9ubyAoZ2ludCBzYW1wbGVfcmF0ZSwgZ3NpemUgbl9mcmFtZXMsIGdmbG9hdCB2YWx1ZSkKK3sKKyAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG5fZnJhbWVzICogc2l6ZW9mIChnZmxvYXQpKTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdmbG9hdCAqZGF0YTsKKyAgZ2ludCBpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBkYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gbl9mcmFtZXM7IGktLTspCisgICAgKmRhdGErKyA9IHZhbHVlOworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGJ1ZiwgImJ1ZiIsIDEpOworCisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgordGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvIChnaW50IHNhbXBsZV9yYXRlLCBnc2l6ZSBuX2ZyYW1lcywKKyAgICBnZmxvYXQgdmFsdWVfbCwgZ2Zsb2F0IHZhbHVlX3IpCit7CisgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChuX2ZyYW1lcyAqIHNpemVvZiAoZ2Zsb2F0KSAqIDIpOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2Zsb2F0ICpkYXRhOworICBnaW50IGk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSBuX2ZyYW1lczsgaS0tOykgeworICAgICpkYXRhKysgPSB2YWx1ZV9sOworICAgICpkYXRhKysgPSB2YWx1ZV9yOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoYnVmLCAiYnVmIiwgMSk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCit0ZXN0X2J1ZmZlcl9jb25zdF9pbnQxNl9tb25vIChnaW50IHNhbXBsZV9yYXRlLCBnaW50IGRlcHRoLCBnc2l6ZSBuX2ZyYW1lcywKKyAgICBnaW50MTYgdmFsdWUpCit7CisgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChuX2ZyYW1lcyAqIHNpemVvZiAoZ2ludDE2KSk7CisgIGdpbnQxNiAqZGF0YTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdpbnQgaTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgZGF0YSA9IChnaW50MTYgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IG5fZnJhbWVzOyBpLS07KQorICAgICpkYXRhKysgPSB2YWx1ZTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChidWYsICJidWYiLCAxKTsKKworICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK3Rlc3RfYnVmZmVyX2NvbnN0X2ludDE2X3N0ZXJlbyAoZ2ludCBzYW1wbGVfcmF0ZSwgZ2ludCBkZXB0aCwgZ3NpemUgbl9mcmFtZXMsCisgICAgZ2ludDE2IHZhbHVlX2wsIGdpbnQxNiB2YWx1ZV9yKQoreworICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobl9mcmFtZXMgKiBzaXplb2YgKGdpbnQxNikgKiAyKTsKKyAgZ2ludDE2ICpkYXRhOworICBHc3RNYXBJbmZvIG1hcDsKKyAgZ2ludCBpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBkYXRhID0gKGdpbnQxNiAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gbl9mcmFtZXM7IGktLTspIHsKKyAgICAqZGF0YSsrID0gdmFsdWVfbDsKKyAgICAqZGF0YSsrID0gdmFsdWVfcjsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGJ1ZiwgImJ1ZiIsIDEpOworCisgIHJldHVybiBidWY7Cit9CisKKy8qIEZ1bmN0aW9ucyB0aGF0IGNyZWF0ZSBkYXRhIGJ1ZmZlcnMgY29udGFpbmluZyBzcXVhcmUgc2lnbmFsCisgKiB3YXZlZm9ybXMuICovCisKK3N0YXRpYyBHc3RCdWZmZXIgKgordGVzdF9idWZmZXJfc3F1YXJlX2Zsb2F0X21vbm8gKGdpbnQgKiBhY2N1bXVsYXRvciwgZ2ludCBzYW1wbGVfcmF0ZSwKKyAgICBnc2l6ZSBuX2ZyYW1lcywgZ2Zsb2F0IHZhbHVlKQoreworICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAobl9mcmFtZXMgKiBzaXplb2YgKGdmbG9hdCkpOworICBnZmxvYXQgKmRhdGE7CisgIEdzdE1hcEluZm8gbWFwOworICBnaW50IGk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGRhdGEgPSAoZ2Zsb2F0ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSBuX2ZyYW1lczsgaS0tOykgeworICAgICphY2N1bXVsYXRvciArPSAxOworICAgICphY2N1bXVsYXRvciAlPSA5NjsKKworICAgIGlmICgqYWNjdW11bGF0b3IgPCA0OCkKKyAgICAgICpkYXRhKysgPSB2YWx1ZTsKKyAgICBlbHNlCisgICAgICAqZGF0YSsrID0gLXZhbHVlOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoYnVmLCAiYnVmIiwgMSk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCit0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfc3RlcmVvIChnaW50ICogYWNjdW11bGF0b3IsIGdpbnQgc2FtcGxlX3JhdGUsCisgICAgZ3NpemUgbl9mcmFtZXMsIGdmbG9hdCB2YWx1ZV9sLCBnZmxvYXQgdmFsdWVfcikKK3sKKyAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKG5fZnJhbWVzICogc2l6ZW9mIChnZmxvYXQpICogMik7CisgIGdmbG9hdCAqZGF0YTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdpbnQgaTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgZGF0YSA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IG5fZnJhbWVzOyBpLS07KSB7CisgICAgKmFjY3VtdWxhdG9yICs9IDE7CisgICAgKmFjY3VtdWxhdG9yICU9IDk2OworCisgICAgaWYgKCphY2N1bXVsYXRvciA8IDQ4KSB7CisgICAgICAqZGF0YSsrID0gdmFsdWVfbDsKKyAgICAgICpkYXRhKysgPSB2YWx1ZV9yOworICAgIH0gZWxzZSB7CisgICAgICAqZGF0YSsrID0gLXZhbHVlX2w7CisgICAgICAqZGF0YSsrID0gLXZhbHVlX3I7CisgICAgfQorICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoYnVmLCAiYnVmIiwgMSk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCit0ZXN0X2J1ZmZlcl9zcXVhcmVfaW50MTZfbW9ubyAoZ2ludCAqIGFjY3VtdWxhdG9yLCBnaW50IHNhbXBsZV9yYXRlLAorICAgIGdpbnQgZGVwdGgsIGdzaXplIG5fZnJhbWVzLCBnaW50MTYgdmFsdWUpCit7CisgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChuX2ZyYW1lcyAqIHNpemVvZiAoZ2ludDE2KSk7CisgIGdpbnQxNiAqZGF0YTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdpbnQgaTsKKworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgZGF0YSA9IChnaW50MTYgKikgbWFwLmRhdGE7CisgIGZvciAoaSA9IG5fZnJhbWVzOyBpLS07KSB7CisgICAgKmFjY3VtdWxhdG9yICs9IDE7CisgICAgKmFjY3VtdWxhdG9yICU9IDk2OworCisgICAgaWYgKCphY2N1bXVsYXRvciA8IDQ4KQorICAgICAgKmRhdGErKyA9IHZhbHVlOworICAgIGVsc2UKKyAgICAgICpkYXRhKysgPSAtTUFYICh2YWx1ZSwgLTMyNzY3KTsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGJ1ZiwgImJ1ZiIsIDEpOworCisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgordGVzdF9idWZmZXJfc3F1YXJlX2ludDE2X3N0ZXJlbyAoZ2ludCAqIGFjY3VtdWxhdG9yLCBnaW50IHNhbXBsZV9yYXRlLAorICAgIGdpbnQgZGVwdGgsIGdzaXplIG5fZnJhbWVzLCBnaW50MTYgdmFsdWVfbCwgZ2ludDE2IHZhbHVlX3IpCit7CisgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChuX2ZyYW1lcyAqIHNpemVvZiAoZ2ludDE2KSAqIDIpOworICBnaW50MTYgKmRhdGE7CisgIEdzdE1hcEluZm8gbWFwOworICBnaW50IGk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGRhdGEgPSAoZ2ludDE2ICopIG1hcC5kYXRhOworICBmb3IgKGkgPSBuX2ZyYW1lczsgaS0tOykgeworICAgICphY2N1bXVsYXRvciArPSAxOworICAgICphY2N1bXVsYXRvciAlPSA5NjsKKworICAgIGlmICgqYWNjdW11bGF0b3IgPCA0OCkgeworICAgICAgKmRhdGErKyA9IHZhbHVlX2w7CisgICAgICAqZGF0YSsrID0gdmFsdWVfcjsKKyAgICB9IGVsc2UgeworICAgICAgKmRhdGErKyA9IC1NQVggKHZhbHVlX2wsIC0zMjc2Nyk7CisgICAgICAqZGF0YSsrID0gLU1BWCAodmFsdWVfciwgLTMyNzY3KTsKKyAgICB9CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChidWYsICJidWYiLCAxKTsKKworICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgdm9pZAorcHVzaF9idWZmZXIgKEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgLyogZ3N0X3BhZF9wdXNoIHN0ZWFscyBhIHJlZmVyZW5jZS4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGJ1ZikgPT0gR1NUX0ZMT1dfT0spOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChidWYsICJidWYiLCAxKTsKK30KKworLyoqKiBTdGFydCBvZiB0aGUgdGVzdHMuICoqKi8KKworLyogVGhpcyB0ZXN0IGxvb2tzIHJlZHVuZGFudCwgYnV0IGVhcmx5IHZlcnNpb25zIG9mIHRoZSBlbGVtZW50CisgKiBjcmFzaGVkIHdoZW4gZG9pbmcsIHdlbGwsIG5vdGhpbmc6ICovCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X25vX2J1ZmZlcikKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnYW5hbHlzaXMgKCk7CisKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHBvbGxfZW9zIChlbGVtZW50KTsKKworICBjbGVhbnVwX3JnYW5hbHlzaXMgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X25vX2J1ZmZlcl9hbGJ1bV8xKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmdhbmFseXNpcyAoKTsKKworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisKKyAgLyogU2luZ2xlIHRyYWNrOiAqLworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgcG9sbF9lb3MgKGVsZW1lbnQpOworCisgIC8qIEZpcnN0IGFsYnVtOiAqLworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJudW0tdHJhY2tzIiwgMywgTlVMTCk7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHBvbGxfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMik7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHBvbGxfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMSk7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHBvbGxfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMCk7CisKKyAgLyogU2Vjb25kIGFsYnVtOiAqLworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJudW0tdHJhY2tzIiwgMiwgTlVMTCk7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHBvbGxfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMSk7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHBvbGxfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMCk7CisKKyAgLyogU2luZ2xlIHRyYWNrOiAqLworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgcG9sbF9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc19udW1fdHJhY2tzIChlbGVtZW50LCAwKTsKKworICBjbGVhbnVwX3JnYW5hbHlzaXMgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X25vX2J1ZmZlcl9hbGJ1bV8yKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmdhbmFseXNpcyAoKTsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisgIGdpbnQgYWNjdW11bGF0b3IgPSAwOworICBnaW50IGk7CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAibnVtLXRyYWNrcyIsIDMsIE5VTEwpOworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisKKyAgLyogTm8gYnVmZmVyIGZvciB0aGUgZmlyc3QgdHJhY2suICovCisgIHNlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICAvKiBObyB0YWdzIHNob3VsZCBiZSBwb3N0ZWQsIHRoZXJlIHdhcyBub3RoaW5nIHRvIGFuYWx5emU6ICovCisgIHBvbGxfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMik7CisKKyAgLyogQSB0ZXN0IHdhdmVmb3JtIHdpdGgga25vd24gZ2FpbiByZXN1bHQgYXMgc2Vjb25kIHRyYWNrOiAqLworCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKEYzMiksIDQ0MTAwLCAxKTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgZm9yIChpID0gMjA7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9tb25vICgmYWNjdW11bGF0b3IsIDQ0MTAwLCA1MTIsCisgICAgICAgICAgICAwLjI1KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuMjUpOworICBmYWlsX3VubGVzc190cmFja19nYWluICh0YWdfbGlzdCwgLTYuMjApOworICAvKiBBbGJ1bSBpcyBub3QgZmluaXNoZWQgeWV0OiAqLworICBmYWlsX2lmX2FsYnVtX3RhZ3MgKHRhZ19saXN0KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisgIGZhaWxfdW5sZXNzX251bV90cmFja3MgKGVsZW1lbnQsIDEpOworCisgIC8qIE5vIGJ1ZmZlciBmb3IgdGhlIGxhc3QgdHJhY2suICovCisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfYWxidW1fcGVhayAodGFnX2xpc3QsIDAuMjUpOworICBmYWlsX3VubGVzc19hbGJ1bV9nYWluICh0YWdfbGlzdCwgLTYuMjApOworICAvKiBObyB0cmFjayB0YWdzIHNob3VsZCBiZSBwb3N0ZWQsIGFzIHRoZXJlIHdhcyBubyBkYXRhIGZvciBpdDogKi8KKyAgZmFpbF9pZl90cmFja190YWdzICh0YWdfbGlzdCk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworICBmYWlsX3VubGVzc19udW1fdHJhY2tzIChlbGVtZW50LCAwKTsKKworICBjbGVhbnVwX3JnYW5hbHlzaXMgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2VtcHR5X2J1ZmZlcnMpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ2FuYWx5c2lzICgpOworCisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKworICAvKiBTaW5nbGUgdHJhY2s6ICovCisgIHNlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKEYzMiksIDQ0MTAwLCAyKTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X3N0ZXJlbyAoNDQxMDAsIDAsIDAuMCwgMC4wKSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgcG9sbF9lb3MgKGVsZW1lbnQpOworCisgIC8qIEZpcnN0IGFsYnVtOiAqLworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJudW0tdHJhY2tzIiwgMiwgTlVMTCk7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvICg0NDEwMCwgMCwgMC4wLCAwLjApKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICBwb2xsX2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX251bV90cmFja3MgKGVsZW1lbnQsIDEpOworCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X3N0ZXJlbyAoNDQxMDAsIDAsIDAuMCwgMC4wKSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgcG9sbF9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc19udW1fdHJhY2tzIChlbGVtZW50LCAwKTsKKworICAvKiBTZWNvbmQgYWxidW0sIHdpdGggYSBzaW5nbGUgdHJhY2s6ICovCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgIm51bS10cmFja3MiLCAxLCBOVUxMKTsKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvICg0NDEwMCwgMCwgMC4wLCAwLjApKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICBwb2xsX2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX251bV90cmFja3MgKGVsZW1lbnQsIDApOworCisgIC8qIFNpbmdsZSB0cmFjazogKi8KKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvICg0NDEwMCwgMCwgMC4wLCAwLjApKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICBwb2xsX2VvcyAoZWxlbWVudCk7CisKKyAgY2xlYW51cF9yZ2FuYWx5c2lzIChlbGVtZW50KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBUZXN0cyBmb3IgY29ycmVjdG5lc3Mgb2YgdGhlIHBlYWsgdmFsdWVzLiAqLworCisvKiBGbG9hdCBwZWFrIHRlc3QuICBGb3Igc3RlcmVvLCBvbmUgY2hhbm5lbCBoYXMgdGhlIGNvbnN0YW50IHZhbHVlIG9mIC0xLjM2OSwKKyAqIHRoZSBvdGhlciBvbmUgMC4wLiAgVGhpcyB0ZXN0cyBtYW55IHRoaW5nczogVGhlIHJlc3VsdCBwZWFrIHZhbHVlIHNob3VsZAorICogb2NjdXIgb24gYW55IGNoYW5uZWwuICBUaGUgcGVhayBpcyBvZiBjb3Vyc2UgdGhlIGFic29sdXRlIGFtcGxpdHVkZSwgc28gMS4zNjkKKyAqIHNob3VsZCBiZSB0aGUgcmVzdWx0LiAgVGhpcyB3aWxsIGFsc28gZGV0ZWN0IGlmIHRoZSBjb2RlIHVzZXMgdGhlIGFic29sdXRlCisgKiB2YWx1ZSBkdXJpbmcgdGhlIGNvbXBhcmlzb24uICBJZiBpdCBpcyBidWdneSBpdCB3aWxsIHJldHVybiAwLjAgc2luY2UgMC4wID4KKyAqIC0xLjM2OS4gIEZ1cnRoZXJtb3JlLCB0aGlzIG1ha2VzIHN1cmUgdGhhdCB0aGVyZSBpcyBubyBwcm9ibGVtIHdpdGggaGVhZHJvb20KKyAqIChleGNlZWRpbmcgMGRCRlMpLiAgSW4gdGhlIHdpbGQgeW91IGdldCBmbG9hdCBzYW1wbGVzID4gMS4wIGZyb20gc3R1ZmYgbGlrZQorICogdm9yYmlzLiAqLworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wZWFrX2Zsb2F0KQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmdhbmFseXNpcyAoKTsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChGMzIpLCA4MDAwLCAyKTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X3N0ZXJlbyAoODAwMCwgNTEyLCAtMS4zNjksIDAuMCkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAxLjM2OSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIC8qIFN3YXBwZWQgY2hhbm5lbHMuICovCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X3N0ZXJlbyAoODAwMCwgNTEyLCAwLjAsIC0xLjM2OSkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAxLjM2OSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIC8qIE1vbm8uICovCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKEYzMiksIDgwMDAsIDEpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfbW9ubyAoODAwMCwgNTEyLCAtMS4zNjkpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMS4zNjkpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICBjbGVhbnVwX3JnYW5hbHlzaXMgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BlYWtfaW50MTZfMTYpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ2FuYWx5c2lzICgpOworICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsKKworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisKKyAgLyogSGFsZiBhbXBsaXR1ZGUuICovCisgIHNlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKFMxNiksIDgwMDAsIDIpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfaW50MTZfc3RlcmVvICg4MDAwLCAxNiwgNTEyLCAxIDw8IDE0LCAwKSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuNSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIC8qIFN3YXBwZWQgY2hhbm5lbHMuICovCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKFMxNiksIDgwMDAsIDIpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfaW50MTZfc3RlcmVvICg4MDAwLCAxNiwgNTEyLCAwLCAxIDw8IDE0KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuNSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIC8qIE1vbm8uICovCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKFMxNiksIDgwMDAsIDEpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfaW50MTZfbW9ubyAoODAwMCwgMTYsIDUxMiwgMSA8PCAxNCkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjUpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICAvKiBIYWxmIGFtcGxpdHVkZSwgbmVnYXRpdmUgdmFyaWFudC4gKi8KKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoUzE2KSwgODAwMCwgMik7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9pbnQxNl9zdGVyZW8gKDgwMDAsIDE2LCA1MTIsIC0oMSA8PCAxNCksIDApKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC41KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgLyogU3dhcHBlZCBjaGFubmVscy4gKi8KKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoUzE2KSwgODAwMCwgMik7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9pbnQxNl9zdGVyZW8gKDgwMDAsIDE2LCA1MTIsIDAsIC0oMSA8PCAxNCkpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC41KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgLyogTW9uby4gKi8KKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoUzE2KSwgODAwMCwgMSk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9pbnQxNl9tb25vICg4MDAwLCAxNiwgNTEyLCAtKDEgPDwgMTQpKSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuNSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisKKyAgLyogTm93IGNoZWNrIGZvciBjb3JyZWN0IG5vcm1hbGl6YXRpb24gb2YgdGhlIHBlYWsgdmFsdWU6IFNhbXBsZQorICAgKiB2YWx1ZXMgb2YgdGhpcyBmb3JtYXQgcmFuZ2UgZnJvbSAtMzI3NjggdG8gMzI3NjcuICBTbyBmb3IgdGhlCisgICAqIGhpZ2hlc3QgcG9zaXRpdmUgYW1wbGl0dWRlIHdlIGRvIG5vdCByZWFjaCAxLjAsIG9ubHkgZm9yCisgICAqIC0zMjc2OCEgKi8KKworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChTMTYpLCA4MDAwLCAyKTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2ludDE2X3N0ZXJlbyAoODAwMCwgMTYsIDUxMiwgMzI3NjcsIDApKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMzI3NjcuIC8gMzI3NjguKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgLyogU3dhcHBlZCBjaGFubmVscy4gKi8KKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoUzE2KSwgODAwMCwgMik7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9pbnQxNl9zdGVyZW8gKDgwMDAsIDE2LCA1MTIsIDAsIDMyNzY3KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDMyNzY3LiAvIDMyNzY4Lik7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIC8qIE1vbm8uICovCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKFMxNiksIDgwMDAsIDEpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfaW50MTZfbW9ubyAoODAwMCwgMTYsIDUxMiwgMzI3NjcpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMzI3NjcuIC8gMzI3NjguKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKworICAvKiBOZWdhdGl2ZSB2YXJpYW50LCByZWFjaGluZyAxLjAuICovCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKFMxNiksIDgwMDAsIDIpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfaW50MTZfc3RlcmVvICg4MDAwLCAxNiwgNTEyLCAtMzI3NjgsIDApKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMS4wKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgLyogU3dhcHBlZCBjaGFubmVscy4gKi8KKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoUzE2KSwgODAwMCwgMik7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9pbnQxNl9zdGVyZW8gKDgwMDAsIDE2LCA1MTIsIDAsIC0zMjc2OCkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAxLjApOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICAvKiBNb25vLiAqLworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChTMTYpLCA4MDAwLCAxKTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2ludDE2X21vbm8gKDgwMDAsIDE2LCA1MTIsIC0zMjc2OCkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAxLjApOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICBjbGVhbnVwX3JnYW5hbHlzaXMgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BlYWtfYWxidW0pCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ2FuYWx5c2lzICgpOworICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsKKworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJudW0tdHJhY2tzIiwgMiwgTlVMTCk7CisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChGMzIpLCA4MDAwLCAyKTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X3N0ZXJlbyAoODAwMCwgMTAyNCwgMS4wLCAwLjApKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMS4wKTsKKyAgZmFpbF9pZl9hbGJ1bV90YWdzICh0YWdfbGlzdCk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworICBmYWlsX3VubGVzc19udW1fdHJhY2tzIChlbGVtZW50LCAxKTsKKworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9mbG9hdF9zdGVyZW8gKDgwMDAsIDEwMjQsIDAuMCwgMC41KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuNSk7CisgIGZhaWxfdW5sZXNzX2FsYnVtX3BlYWsgKHRhZ19saXN0LCAxLjApOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMCk7CisKKyAgLyogVHJ5IGEgc2Vjb25kIGFsYnVtOiAqLworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJudW0tdHJhY2tzIiwgMywgTlVMTCk7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvICg4MDAwLCAxMDI0LCAwLjQsIDAuNCkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjQpOworICBmYWlsX2lmX2FsYnVtX3RhZ3MgKHRhZ19saXN0KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisgIGZhaWxfdW5sZXNzX251bV90cmFja3MgKGVsZW1lbnQsIDIpOworCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X3N0ZXJlbyAoODAwMCwgMTAyNCwgMC40NSwgMC40NSkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjQ1KTsKKyAgZmFpbF9pZl9hbGJ1bV90YWdzICh0YWdfbGlzdCk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworICBmYWlsX3VubGVzc19udW1fdHJhY2tzIChlbGVtZW50LCAxKTsKKworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9mbG9hdF9zdGVyZW8gKDgwMDAsIDEwMjQsIDAuMiwgMC4yKSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuMik7CisgIGZhaWxfdW5sZXNzX2FsYnVtX3BlYWsgKHRhZ19saXN0LCAwLjQ1KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisgIGZhaWxfdW5sZXNzX251bV90cmFja3MgKGVsZW1lbnQsIDApOworCisgIC8qIEFuZCBub3cgYSBzaW5nbGUgdHJhY2ssIG5vdCBpbiBhbGJ1bSBtb2RlIChudW0tdHJhY2tzIGlzIDAKKyAgICogbm93KTogKi8KKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvICg4MDAwLCAxMDI0LCAwLjEsIDAuMSkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjEpOworICBmYWlsX2lmX2FsYnVtX3RhZ3MgKHRhZ19saXN0KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgY2xlYW51cF9yZ2FuYWx5c2lzIChlbGVtZW50KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBTd2l0Y2hpbmcgZnJvbSB0cmFjayB0byBhbGJ1bSBtb2RlLiAqLworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wZWFrX3RyYWNrX2FsYnVtKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmdhbmFseXNpcyAoKTsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworCisgIHNlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKEYzMiksIDgwMDAsIDEpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfbW9ubyAoODAwMCwgMTAyNCwgMS4wKSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDEuMCk7CisgIGZhaWxfaWZfYWxidW1fdGFncyAodGFnX2xpc3QpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJudW0tdHJhY2tzIiwgMSwgTlVMTCk7CisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X21vbm8gKDgwMDAsIDEwMjQsIDAuNSkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjUpOworICBmYWlsX3VubGVzc19hbGJ1bV9wZWFrICh0YWdfbGlzdCwgMC41KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisgIGZhaWxfdW5sZXNzX251bV90cmFja3MgKGVsZW1lbnQsIDApOworCisgIGNsZWFudXBfcmdhbmFseXNpcyAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogRGlzYWJsaW5nIGFsYnVtIHByb2Nlc3NpbmcgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGFsYnVtLiAgUHJvYmFibHkgYSByYXJlIGVkZ2UKKyAqIGNhc2UgYW5kIGFwcGxpY2F0aW9ucyBzaG91bGQgbm90IHJlbHkgb24gdGhpcyB0byB3b3JrLiAgVGhleSBuZWVkIHRvIHNlbmQgdGhlCisgKiBlbGVtZW50IHRvIHRoZSBSRUFEWSBzdGF0ZSB0byBjbGVhciB1cCBhZnRlciBhbiBhYm9ydGVkIGFsYnVtIGFueXdheSBzaW5jZQorICogdGhleSBtaWdodCBuZWVkIHRvIHByb2Nlc3MgYW5vdGhlciBhbGJ1bSBhZnRlcndhcmRzLiAqLworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wZWFrX2FsYnVtX2Fib3J0X3RvX3RyYWNrKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmdhbmFseXNpcyAoKTsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAibnVtLXRyYWNrcyIsIDIsIE5VTEwpOworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisKKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoRjMyKSwgODAwMCwgMik7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9jb25zdF9mbG9hdF9zdGVyZW8gKDgwMDAsIDEwMjQsIDEuMCwgMC4wKSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDEuMCk7CisgIGZhaWxfaWZfYWxidW1fdGFncyAodGFnX2xpc3QpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMSk7CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAibnVtLXRyYWNrcyIsIDAsIE5VTEwpOworCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X3N0ZXJlbyAoODAwMCwgMTAyNCwgMC4wLCAwLjUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC41KTsKKyAgZmFpbF9pZl9hbGJ1bV90YWdzICh0YWdfbGlzdCk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIGNsZWFudXBfcmdhbmFseXNpcyAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZ2Fpbl9hbGJ1bSkKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnYW5hbHlzaXMgKCk7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworICBnaW50IGFjY3VtdWxhdG9yOworICBnaW50IGk7CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAibnVtLXRyYWNrcyIsIDMsIE5VTEwpOworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisKKyAgLyogVGhlIHRocmVlIHRyYWNrcyBhcmUgY29uc3RydWN0ZWQgc3VjaCB0aGF0IGlmIGFueSBvZiB0aGVzZSBpcyBpbiBmYWN0CisgICAqIGlnbm9yZWQgZm9yIHRoZSBhbGJ1bSBnYWluLCB0aGUgYWxidW0gZ2FpbiB3aWxsIGRpZmZlci4gKi8KKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoRjMyKSwgNDQxMDAsIDIpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBhY2N1bXVsYXRvciA9IDA7CisgIGZvciAoaSA9IDg7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8gKCZhY2N1bXVsYXRvciwgNDQxMDAsIDUxMiwKKyAgICAgICAgICAgIDAuNzUsIDAuNzUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC43NSk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCAtMTUuNzApOworICBmYWlsX2lmX2FsYnVtX3RhZ3MgKHRhZ19saXN0KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBhY2N1bXVsYXRvciA9IDA7CisgIGZvciAoaSA9IDEyOyBpLS07KQorICAgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfc3RlcmVvICgmYWNjdW11bGF0b3IsIDQ0MTAwLCA1MTIsCisgICAgICAgICAgICAwLjUsIDAuNSkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjUpOworICBmYWlsX3VubGVzc190cmFja19nYWluICh0YWdfbGlzdCwgLTEyLjIyKTsKKyAgZmFpbF9pZl9hbGJ1bV90YWdzICh0YWdfbGlzdCk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgYWNjdW11bGF0b3IgPSAwOworICBmb3IgKGkgPSAxODA7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8gKCZhY2N1bXVsYXRvciwgNDQxMDAsIDUxMiwKKyAgICAgICAgICAgIDAuMjUsIDAuMjUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworCisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjI1KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfZ2FpbiAodGFnX2xpc3QsIC02LjIwKTsKKyAgZmFpbF91bmxlc3NfYWxidW1fcGVhayAodGFnX2xpc3QsIDAuNzUpOworICAvKiBTdHJhbmdlbHksIHdhdmVnYWluIHJlcG9ydHMgLTEyLjE3IGZvciB0aGUgYWxidW0sIGJ1dCB0aGUgZml4ZWQKKyAgICogbWV0YWZsYWMgYWdyZWVzIHRvIHVzLiAgQ291bGQgYmUgYSAzMjc2NyB2cy4gMzI3NjggaXNzdWUuICovCisgIGZhaWxfdW5sZXNzX2FsYnVtX2dhaW4gKHRhZ19saXN0LCAtMTIuMTgpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICBjbGVhbnVwX3JnYW5hbHlzaXMgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIENoZWNrcyBlbnN1cmluZyB0aGF0IHRoZSAiZm9yY2VkIiBwcm9wZXJ0eSB3b3JrcyBhcyBhZHZlcnRpc2VkLiAqLworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mb3JjZWQpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ2FuYWx5c2lzICgpOworICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsKKyAgZ2ludCBhY2N1bXVsYXRvciA9IDA7CisgIGdpbnQgaTsKKworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJmb3JjZWQiLCBGQUxTRSwgTlVMTCk7CisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChGMzIpLCA0NDEwMCwgMik7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgLyogUHJvdmlkZWQgdmFsdWVzIGFyZSB0b3RhbGx5IGFyYml0cmFyeS4gKi8KKyAgZ3N0X3RhZ19saXN0X2FkZCAodGFnX2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgR1NUX1RBR19UUkFDS19QRUFLLCAxLjAsIEdTVF9UQUdfVFJBQ0tfR0FJTiwgMi4yMSwgTlVMTCk7CisgIHNlbmRfdGFnX2V2ZW50IChlbGVtZW50LCB0YWdfbGlzdCk7CisKKyAgZm9yIChpID0gMjA7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X3N0ZXJlbyAoNDQxMDAsIDUxMiwgMC41LCAwLjUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworCisgIC8qIFRoaXMgZmFpbHMgaWYgYSB0YWcgbWVzc2FnZSBpcyBnZW5lcmF0ZWQ6ICovCisgIC8qIFNhbWUgdmFsdWVzIGFzIGFib3ZlICovCisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCAyLjIxKTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDEuMCk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIC8qIE5vdyBiYWNrIHRvIGEgdHJhY2sgd2l0aG91dCB0YWdzLiAqLworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIGZvciAoaSA9IDIwOyBpLS07KQorICAgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfc3RlcmVvICgmYWNjdW11bGF0b3IsIDQ0MTAwLCA1MTIsCisgICAgICAgICAgICAwLjI1LCAwLjI1KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuMjUpOworICBmYWlsX3VubGVzc190cmFja19nYWluICh0YWdfbGlzdCwgZ2V0X2V4cGVjdGVkX2dhaW4gKDQ0MTAwKSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIGNsZWFudXBfcmdhbmFseXNpcyAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogU2VuZGluZyB0cmFjayBnYWluIGFuZCBwZWFrIGluIHNlcGFyYXRlIHRhZyBsaXN0cy4gKi8KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZm9yY2VkX3NlcGFyYXRlKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmdhbmFseXNpcyAoKTsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisgIGdpbnQgYWNjdW11bGF0b3IgPSAwOworICBnaW50IGk7CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAiZm9yY2VkIiwgRkFMU0UsIE5VTEwpOworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisKKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoRjMyKSwgNDQxMDAsIDIpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwgR1NUX1RBR19UUkFDS19HQUlOLCAyLjIxLAorICAgICAgTlVMTCk7CisgIHNlbmRfdGFnX2V2ZW50IChlbGVtZW50LCB0YWdfbGlzdCk7CisKKyAgdGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdfbGlzdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsIEdTVF9UQUdfVFJBQ0tfUEVBSywgMS4wLAorICAgICAgTlVMTCk7CisgIHNlbmRfdGFnX2V2ZW50IChlbGVtZW50LCB0YWdfbGlzdCk7CisKKyAgZm9yIChpID0gMjA7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8gKCZhY2N1bXVsYXRvciwgNDQxMDAsIDUxMiwKKyAgICAgICAgICAgIDAuNSwgMC41KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKworICAvKiBTYW1lIHZhbHVlcyBhcyBhYm92ZSAqLworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19vbmx5IChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfZ2FpbiAodGFnX2xpc3QsIDIuMjEpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMS4wKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgLyogTm93IGEgdHJhY2sgd2l0aG91dCB0YWdzLiAqLworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIGFjY3VtdWxhdG9yID0gMDsKKyAgZm9yIChpID0gMjA7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8gKCZhY2N1bXVsYXRvciwgNDQxMDAsIDUxMiwKKyAgICAgICAgICAgIDAuMjUsIDAuMjUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC4yNSk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCBnZXRfZXhwZWN0ZWRfZ2FpbiAoNDQxMDApKTsKKyAgZmFpbF9pZl9hbGJ1bV90YWdzICh0YWdfbGlzdCk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIGNsZWFudXBfcmdhbmFseXNpcyAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogQSBUQUcgZXZlbnQgaXMgc2VudCBfYWZ0ZXJfIGRhdGEgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQuICBJbiByZWFsCisgKiBwaXBlbGluZXMsIHRoaXMgY291bGQgaGFwcGVuIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcmdhbmFseXNpcyBlbGVtZW50IChieQorICogYWNjaWRlbnQpLiAgV2hpbGUgaXQgd291bGQgaGF2ZSBhbmFseXplZCBhbGwgdGhlIGRhdGEgcHJpb3IgdG8gcmVjZWl2aW5nIHRoZQorICogZXZlbnQsIEkgZXhwZWN0IGl0IHRvIG5vdCBwb3N0IGl0cyByZXN1bHRzIGlmIG5vdCBmb3JjZWQuICBUaGlzIHRlc3QgaXMKKyAqIGFsbW9zdCBlcXVpdmFsZW50IHRvIHRlc3RfZm9yY2VkLiAqLworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mb3JjZWRfYWZ0ZXJfZGF0YSkKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnYW5hbHlzaXMgKCk7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworICBnaW50IGFjY3VtdWxhdG9yID0gMDsKKyAgZ2ludCBpOworCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgImZvcmNlZCIsIEZBTFNFLCBOVUxMKTsKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworCisgIHNlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKEYzMiksIDgwMDAsIDIpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBmb3IgKGkgPSAyMDsgaS0tOykKKyAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfY29uc3RfZmxvYXRfc3RlcmVvICg4MDAwLCA1MTIsIDAuNSwgMC41KSk7CisKKyAgdGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdfbGlzdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsCisgICAgICBHU1RfVEFHX1RSQUNLX1BFQUssIDEuMCwgR1NUX1RBR19UUkFDS19HQUlOLCAyLjIxLCBOVUxMKTsKKyAgc2VuZF90YWdfZXZlbnQgKGVsZW1lbnQsIHRhZ19saXN0KTsKKworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisKKyAgLyogU2FtZSB2YWx1ZXMgYXMgYWJvdmUgKi8KKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfZ2FpbiAodGFnX2xpc3QsIDIuMjEpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMS4wKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICAvKiBOb3cgYmFjayB0byBhIG5vcm1hbCB0cmFjaywgdGhpcyBvbmUgaGFzIG5vIHRhZ3M6ICovCisgIGZvciAoaSA9IDIwOyBpLS07KQorICAgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfc3RlcmVvICgmYWNjdW11bGF0b3IsIDgwMDAsIDUxMiwgMC4yNSwKKyAgICAgICAgICAgIDAuMjUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC4yNSk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCBnZXRfZXhwZWN0ZWRfZ2FpbiAoODAwMCkpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICBjbGVhbnVwX3JnYW5hbHlzaXMgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIExpa2UgdGVzdF9mb3JjZWQsIGJ1dCAqYW5hbHl6ZSogYW4gYWxidW0gYWZ0ZXJ3YXJkcy4gIFRoZSB0d28gdGVzdHMgZm9sbG93aW5nCisgKiB0aGlzIG9uZSBjaGVjayB0aGUgKnNraXBwaW5nKiBvZiBhbGJ1bXMuICovCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ZvcmNlZF9hbGJ1bSkKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnYW5hbHlzaXMgKCk7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworICBnaW50IGFjY3VtdWxhdG9yOworICBnaW50IGk7CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAiZm9yY2VkIiwgRkFMU0UsIE5VTEwpOworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisKKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoRjMyKSwgNDQxMDAsIDIpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIC8qIFByb3ZpZGVkIHZhbHVlcyBhcmUgdG90YWxseSBhcmJpdHJhcnkuICovCisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgIEdTVF9UQUdfVFJBQ0tfUEVBSywgMS4wLCBHU1RfVEFHX1RSQUNLX0dBSU4sIDIuMjEsIE5VTEwpOworICBzZW5kX3RhZ19ldmVudCAoZWxlbWVudCwgdGFnX2xpc3QpOworCisgIGFjY3VtdWxhdG9yID0gMDsKKyAgZm9yIChpID0gMjA7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8gKCZhY2N1bXVsYXRvciwgNDQxMDAsIDUxMiwKKyAgICAgICAgICAgIDAuNSwgMC41KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKworICAvKiBTYW1lIHZhbHVlcyBhcyBhYm92ZSAqLworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19nYWluICh0YWdfbGlzdCwgMi4yMSk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAxLjApOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICAvKiBOb3cgYW4gYWxidW0gd2l0aG91dCB0YWdzLiAqLworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJudW0tdHJhY2tzIiwgMiwgTlVMTCk7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBhY2N1bXVsYXRvciA9IDA7CisgIGZvciAoaSA9IDIwOyBpLS07KQorICAgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfc3RlcmVvICgmYWNjdW11bGF0b3IsIDQ0MTAwLCA1MTIsCisgICAgICAgICAgICAwLjI1LCAwLjI1KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuMjUpOworICBmYWlsX3VubGVzc190cmFja19nYWluICh0YWdfbGlzdCwgZ2V0X2V4cGVjdGVkX2dhaW4gKDQ0MTAwKSk7CisgIGZhaWxfaWZfYWxidW1fdGFncyAodGFnX2xpc3QpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMSk7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBhY2N1bXVsYXRvciA9IDA7CisgIGZvciAoaSA9IDIwOyBpLS07KQorICAgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfc3RlcmVvICgmYWNjdW11bGF0b3IsIDQ0MTAwLCA1MTIsCisgICAgICAgICAgICAwLjI1LCAwLjI1KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuMjUpOworICBmYWlsX3VubGVzc190cmFja19nYWluICh0YWdfbGlzdCwgZ2V0X2V4cGVjdGVkX2dhaW4gKDQ0MTAwKSk7CisgIGZhaWxfdW5sZXNzX2FsYnVtX3BlYWsgKHRhZ19saXN0LCAwLjI1KTsKKyAgZmFpbF91bmxlc3NfYWxidW1fZ2FpbiAodGFnX2xpc3QsIGdldF9leHBlY3RlZF9nYWluICg0NDEwMCkpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMCk7CisKKyAgY2xlYW51cF9yZ2FuYWx5c2lzIChlbGVtZW50KTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mb3JjZWRfYWxidW1fc2tpcCkKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnYW5hbHlzaXMgKCk7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworICBnaW50IGFjY3VtdWxhdG9yID0gMDsKKyAgZ2ludCBpOworCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgImZvcmNlZCIsIEZBTFNFLCAibnVtLXRyYWNrcyIsIDIsIE5VTEwpOworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisKKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoRjMyKSwgODAwMCwgMik7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgLyogUHJvdmlkZWQgdmFsdWVzIGFyZSB0b3RhbGx5IGFyYml0cmFyeS4gKi8KKyAgZ3N0X3RhZ19saXN0X2FkZCAodGFnX2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAorICAgICAgR1NUX1RBR19UUkFDS19QRUFLLCAwLjc1LCBHU1RfVEFHX1RSQUNLX0dBSU4sIDIuMjEsCisgICAgICBHU1RfVEFHX0FMQlVNX1BFQUssIDAuODAsIEdTVF9UQUdfQUxCVU1fR0FJTiwgLTAuMTEsIE5VTEwpOworICBzZW5kX3RhZ19ldmVudCAoZWxlbWVudCwgdGFnX2xpc3QpOworCisgIGZvciAoaSA9IDIwOyBpLS07KQorICAgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfc3RlcmVvICgmYWNjdW11bGF0b3IsIDgwMDAsIDUxMiwgMC4yNSwKKyAgICAgICAgICAgIDAuMjUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworCisgIC8qIFNhbWUgdmFsdWVzIGFzIGFib3ZlICovCisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCAyLjIxKTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuNzUpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICBmYWlsX3VubGVzc19udW1fdHJhY2tzIChlbGVtZW50LCAxKTsKKworICAvKiBUaGlzIHRyYWNrIGhhcyBubyB0YWdzLCBidXQgbmVlZHMgdG8gYmUgc2tpcHBlZCBhbnl3YXlzIHNpbmNlIHdlCisgICAqIGFyZSBpbiBhbGJ1bSBwcm9jZXNzaW5nIG1vZGUuICovCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgZm9yIChpID0gMjA7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X3N0ZXJlbyAoODAwMCwgNTEyLCAwLjAsIDAuMCkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHBvbGxfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfbnVtX3RyYWNrcyAoZWxlbWVudCwgMCk7CisKKyAgLyogTm9ybWFsIHRyYWNrIGFmdGVyIHRoZSBhbGJ1bS4gIE9mIGNvdXJzZSBub3QgdG8gYmUgc2tpcHBlZC4gKi8KKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBhY2N1bXVsYXRvciA9IDA7CisgIGZvciAoaSA9IDIwOyBpLS07KQorICAgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfc3RlcmVvICgmYWNjdW11bGF0b3IsIDgwMDAsIDUxMiwgMC4yNSwKKyAgICAgICAgICAgIDAuMjUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC4yNSk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCBnZXRfZXhwZWN0ZWRfZ2FpbiAoODAwMCkpOworICBmYWlsX2lmX2FsYnVtX3RhZ3MgKHRhZ19saXN0KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgY2xlYW51cF9yZ2FuYWx5c2lzIChlbGVtZW50KTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mb3JjZWRfYWxidW1fbm9fc2tpcCkKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnYW5hbHlzaXMgKCk7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworICBnaW50IGFjY3VtdWxhdG9yID0gMDsKKyAgZ2ludCBpOworCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgImZvcmNlZCIsIEZBTFNFLCAibnVtLXRyYWNrcyIsIDIsIE5VTEwpOworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisKKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoRjMyKSwgODAwMCwgMik7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIGZvciAoaSA9IDIwOyBpLS07KQorICAgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfc3RlcmVvICgmYWNjdW11bGF0b3IsIDgwMDAsIDUxMiwgMC4yNSwKKyAgICAgICAgICAgIDAuMjUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC4yNSk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCBnZXRfZXhwZWN0ZWRfZ2FpbiAoODAwMCkpOworICBmYWlsX2lmX2FsYnVtX3RhZ3MgKHRhZ19saXN0KTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisgIGZhaWxfdW5sZXNzX251bV90cmFja3MgKGVsZW1lbnQsIDEpOworCisgIC8qIFRoZSBzZWNvbmQgdHJhY2sgaGFzIGluZGVlZCBmdWxsIHRhZ3MsIGJ1dCBhbHRob3VnaCBiZWluZyBub3QgZm9yY2VkLCB0aGlzCisgICAqIG9uZSBoYXMgdG8gYmUgcHJvY2Vzc2VkIGJlY2F1c2UgYWxidW0gcHJvY2Vzc2luZyBpcyBvbi4gKi8KKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIC8qIFByb3ZpZGVkIHZhbHVlcyBhcmUgdG90YWxseSBhcmJpdHJhcnkuICovCisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgIEdTVF9UQUdfVFJBQ0tfUEVBSywgMC43NSwgR1NUX1RBR19UUkFDS19HQUlOLCAyLjIxLAorICAgICAgR1NUX1RBR19BTEJVTV9QRUFLLCAwLjgwLCBHU1RfVEFHX0FMQlVNX0dBSU4sIC0wLjExLCBOVUxMKTsKKyAgc2VuZF90YWdfZXZlbnQgKGVsZW1lbnQsIHRhZ19saXN0KTsKKyAgZm9yIChpID0gMjA7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X3N0ZXJlbyAoODAwMCwgNTEyLCAwLjAsIDAuMCkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisKKyAgLyogdGhlIGZpcnN0IGJhdGNoIGZyb20gdGhlIHRhZ3MgKi8KKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3Nfb25seSAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjc1KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfZ2FpbiAodGFnX2xpc3QsIDIuMjEpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsKKworICAvKiB0aGUgc2Vjb25kIGZyb20gdGhlIHByb2Nlc3NpbmcgKi8KKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuMCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCBTSUxFTkNFX0dBSU4pOworICAvKiBTZWNvbmQgdHJhY2sgd2FzIGp1c3Qgc2lsZW5jZSBzbyB0aGUgYWxidW0gcGVhayBlcXVhbHMgdGhlIGZpcnN0CisgICAqIHRyYWNrJ3MgcGVhay4gKi8KKyAgZmFpbF91bmxlc3NfYWxidW1fcGVhayAodGFnX2xpc3QsIDAuMjUpOworICAvKiBTdGF0aXN0aWNhbCBwcm9jZXNzaW5nIGxlYWRzIHRvIHRoZSBzZWNvbmQgdHJhY2sgYmVpbmcKKyAgICogaWdub3JlZCBmb3IgdGhlIGdhaW4gKGJlY2F1c2UgaXQgaXMgc28gc2hvcnQpOiAqLworICBmYWlsX3VubGVzc19hbGJ1bV9nYWluICh0YWdfbGlzdCwgZ2V0X2V4cGVjdGVkX2dhaW4gKDgwMDApKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisgIGZhaWxfdW5sZXNzX251bV90cmFja3MgKGVsZW1lbnQsIDApOworCisgIGNsZWFudXBfcmdhbmFseXNpcyAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZm9yY2VkX2Fib3J0X2FsYnVtX25vX3NraXApCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ2FuYWx5c2lzICgpOworICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsKKyAgZ2ludCBhY2N1bXVsYXRvciA9IDA7CisgIGdpbnQgaTsKKworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJmb3JjZWQiLCBGQUxTRSwgIm51bS10cmFja3MiLCAyLCBOVUxMKTsKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworCisgIHNlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChlbGVtZW50KTsKKyAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKEYzMiksIDgwMDAsIDIpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworICBmb3IgKGkgPSAyMDsgaS0tOykKKyAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfc3F1YXJlX2Zsb2F0X3N0ZXJlbyAoJmFjY3VtdWxhdG9yLCA4MDAwLCA1MTIsIDAuMjUsCisgICAgICAgICAgICAwLjI1KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuMjUpOworICBmYWlsX3VubGVzc190cmFja19nYWluICh0YWdfbGlzdCwgZ2V0X2V4cGVjdGVkX2dhaW4gKDgwMDApKTsKKyAgZmFpbF9pZl9hbGJ1bV90YWdzICh0YWdfbGlzdCk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworICBmYWlsX3VubGVzc19udW1fdHJhY2tzIChlbGVtZW50LCAxKTsKKworICAvKiBEaXNhYmxpbmcgYWxidW0gcHJvY2Vzc2luZyBiZWZvcmUgZW5kIG9mIGFsYnVtOiAqLworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJudW0tdHJhY2tzIiwgMCwgTlVMTCk7CisKKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworCisgIC8qIFByb2Nlc3NpbmcgYSB0cmFjayB0aGF0IGhhcyB0byBiZSBza2lwcGVkLiAqLworICB0YWdfbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIC8qIFByb3ZpZGVkIHZhbHVlcyBhcmUgdG90YWxseSBhcmJpdHJhcnkuICovCisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwKKyAgICAgIEdTVF9UQUdfVFJBQ0tfUEVBSywgMC43NSwgR1NUX1RBR19UUkFDS19HQUlOLCAyLjIxLAorICAgICAgR1NUX1RBR19BTEJVTV9QRUFLLCAwLjgwLCBHU1RfVEFHX0FMQlVNX0dBSU4sIC0wLjExLCBOVUxMKTsKKyAgc2VuZF90YWdfZXZlbnQgKGVsZW1lbnQsIHRhZ19saXN0KTsKKyAgZm9yIChpID0gMjA7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX2NvbnN0X2Zsb2F0X3N0ZXJlbyAoODAwMCwgNTEyLCAwLjAsIDAuMCkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuNzUpOworICBmYWlsX3VubGVzc190cmFja19nYWluICh0YWdfbGlzdCwgMi4yMSk7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIGNsZWFudXBfcmdhbmFseXNpcyAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcmVmZXJlbmNlX2xldmVsKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmdhbmFseXNpcyAoKTsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisgIGdkb3VibGUgcmVmX2xldmVsOworICBnaW50IGFjY3VtdWxhdG9yID0gMDsKKyAgZ2ludCBpOworCisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChGMzIpLCA0NDEwMCwgMik7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisgIGZvciAoaSA9IDIwOyBpLS07KQorICAgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfc3RlcmVvICgmYWNjdW11bGF0b3IsIDQ0MTAwLCA1MTIsCisgICAgICAgICAgICAwLjI1LCAwLjI1KSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuMjUpOworICBmYWlsX3VubGVzc190cmFja19nYWluICh0YWdfbGlzdCwgZ2V0X2V4cGVjdGVkX2dhaW4gKDQ0MTAwKSk7CisgIGZhaWxfaWZfYWxidW1fdGFncyAodGFnX2xpc3QpOworICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ19saXN0LCBHU1RfVEFHX1JFRkVSRU5DRV9MRVZFTCwKKyAgICAgICAgICAmcmVmX2xldmVsKSAmJiBNQVRDSF9HQUlOIChyZWZfbGV2ZWwsIDg5LiksCisgICAgICAiSW5jb3JyZWN0IHJlZmVyZW5jZSBsZXZlbCB0YWciKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAicmVmZXJlbmNlLWxldmVsIiwgODMuLCAibnVtLXRyYWNrcyIsIDIsIE5VTEwpOworCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgZm9yIChpID0gMjA7IGktLTspCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9mbG9hdF9zdGVyZW8gKCZhY2N1bXVsYXRvciwgNDQxMDAsIDUxMiwKKyAgICAgICAgICAgIDAuMjUsIDAuMjUpKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC4yNSk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCBnZXRfZXhwZWN0ZWRfZ2FpbiAoNDQxMDApIC0gNi4pOworICBmYWlsX2lmX2FsYnVtX3RhZ3MgKHRhZ19saXN0KTsKKyAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwgR1NUX1RBR19SRUZFUkVOQ0VfTEVWRUwsCisgICAgICAgICAgJnJlZl9sZXZlbCkgJiYgTUFUQ0hfR0FJTiAocmVmX2xldmVsLCA4My4pLAorICAgICAgIkluY29ycmVjdCByZWZlcmVuY2UgbGV2ZWwgdGFnIik7CisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgYWNjdW11bGF0b3IgPSAwOworICBmb3IgKGkgPSAyMDsgaS0tOykKKyAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfc3F1YXJlX2Zsb2F0X3N0ZXJlbyAoJmFjY3VtdWxhdG9yLCA0NDEwMCwgNTEyLAorICAgICAgICAgICAgMC4yNSwgMC4yNSkpOworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7CisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjI1KTsKKyAgZmFpbF91bmxlc3NfdHJhY2tfZ2FpbiAodGFnX2xpc3QsIGdldF9leHBlY3RlZF9nYWluICg0NDEwMCkgLSA2Lik7CisgIGZhaWxfdW5sZXNzX2FsYnVtX3BlYWsgKHRhZ19saXN0LCAwLjI1KTsKKyAgLyogV2UgcHJvdmlkZWQgdGhlIHNhbWUgd2F2ZWZvcm0gdHdpY2UsIHdpdGggYSByZXNldCBzZXBhcmF0aW5nCisgICAqIHRoZW0uICBUaGVyZWZvcmUsIHRoZSBhbGJ1bSBnYWluIG1hdGNoZXMgdGhlIHRyYWNrIGdhaW4uICovCisgIGZhaWxfdW5sZXNzX2FsYnVtX2dhaW4gKHRhZ19saXN0LCBnZXRfZXhwZWN0ZWRfZ2FpbiAoNDQxMDApIC0gNi4pOworICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ19saXN0LCBHU1RfVEFHX1JFRkVSRU5DRV9MRVZFTCwKKyAgICAgICAgICAmcmVmX2xldmVsKSAmJiBNQVRDSF9HQUlOIChyZWZfbGV2ZWwsIDgzLiksCisgICAgICAiSW5jb3JyZWN0IHJlZmVyZW5jZSBsZXZlbCB0YWciKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgY2xlYW51cF9yZ2FuYWx5c2lzIChlbGVtZW50KTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9hbGxfZm9ybWF0cykKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnYW5hbHlzaXMgKCk7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworICBnaW50IGFjY3VtdWxhdG9yID0gMDsKKyAgZ2ludCBpLCBqOworCisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOworICBmb3IgKGkgPSBHX05fRUxFTUVOVFMgKHN1cHBvcnRlZF9yYXRlcyk7IGktLTspIHsKKyAgICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgICAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKEYzMiksIHN1cHBvcnRlZF9yYXRlc1tpXS5zYW1wbGVfcmF0ZSwgMik7CisgICAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKyAgICBhY2N1bXVsYXRvciA9IDA7CisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfc3RlcmVvICgmYWNjdW11bGF0b3IsCisgICAgICAgICAgICAgIHN1cHBvcnRlZF9yYXRlc1tpXS5zYW1wbGVfcmF0ZSwgNTEyLCAwLjI1LCAwLjI1KSk7CisgICAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKEYzMiksIHN1cHBvcnRlZF9yYXRlc1tpXS5zYW1wbGVfcmF0ZSwgMSk7CisgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKKyAgICAgIHB1c2hfYnVmZmVyICh0ZXN0X2J1ZmZlcl9zcXVhcmVfZmxvYXRfbW9ubyAoJmFjY3VtdWxhdG9yLAorICAgICAgICAgICAgICBzdXBwb3J0ZWRfcmF0ZXNbaV0uc2FtcGxlX3JhdGUsIDUxMiwgMC4yNSkpOworICAgIHNlbmRfY2Fwc19ldmVudCAoR1NUX0FVRElPX05FIChTMTYpLCBzdXBwb3J0ZWRfcmF0ZXNbaV0uc2FtcGxlX3JhdGUsIDIpOworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfc3F1YXJlX2ludDE2X3N0ZXJlbyAoJmFjY3VtdWxhdG9yLAorICAgICAgICAgICAgICBzdXBwb3J0ZWRfcmF0ZXNbaV0uc2FtcGxlX3JhdGUsIDE2LCA1MTIsIDEgPDwgMTMsIDEgPDwgMTMpKTsKKyAgICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoUzE2KSwgc3VwcG9ydGVkX3JhdGVzW2ldLnNhbXBsZV9yYXRlLCAxKTsKKyAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQorICAgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9pbnQxNl9tb25vICgmYWNjdW11bGF0b3IsCisgICAgICAgICAgICAgIHN1cHBvcnRlZF9yYXRlc1tpXS5zYW1wbGVfcmF0ZSwgMTYsIDUxMiwgMSA8PCAxMykpOworICAgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKyAgICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOworICAgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjI1KTsKKyAgICBmYWlsX3VubGVzc190cmFja19nYWluICh0YWdfbGlzdCwgc3VwcG9ydGVkX3JhdGVzW2ldLmdhaW4pOworICAgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOworICB9CisKKyAgY2xlYW51cF9yZ2FuYWx5c2lzIChlbGVtZW50KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBDaGVja3MgZW5zdXJpbmcgYWxsIGFkdmVydGlzZWQgc3VwcG9ydGVkIHNhbXBsZSByYXRlcyBhcmUgcmVhbGx5CisgKiBhY2NlcHRlZCwgZm9yIGludGVnZXIgYW5kIGZsb2F0LCBtb25vIGFuZCBzdGVyZW8uICBUaGlzIGFsc28KKyAqIHZlcmlmaWVzIHRoYXQgdGhlIGNvcnJlY3QgZ2FpbiBpcyBjb21wdXRlZCBmb3IgYWxsIGZvcm1hdHMgKGV4Y2VwdAorICogb2RkIGJpdCBkZXB0aHMpLiAqLworCisjZGVmaW5lIE1BS0VfR0FJTl9URVNUX0ZMT0FUX01PTk8oc2FtcGxlX3JhdGUpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHU1RfU1RBUlRfVEVTVCAodGVzdF9nYWluX2Zsb2F0X21vbm9fIyNzYW1wbGVfcmF0ZSkgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ2FuYWx5c2lzICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2ludCBhY2N1bXVsYXRvciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoRjMyKSwgc2FtcGxlX3JhdGUsIDEpOyAgICAgICAgICAgICAgIFwKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfc3F1YXJlX2Zsb2F0X21vbm8gKCZhY2N1bXVsYXRvciwgICAgICAgICBcCisgICAgICAgICAgICBzYW1wbGVfcmF0ZSwgNTEyLCAwLjI1KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC4yNSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZmFpbF91bmxlc3NfdHJhY2tfZ2FpbiAodGFnX2xpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBnZXRfZXhwZWN0ZWRfZ2FpbiAoc2FtcGxlX3JhdGUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGVhbnVwX3JnYW5hbHlzaXMgKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorR1NUX0VORF9URVNUOworCisjZGVmaW5lIE1BS0VfR0FJTl9URVNUX0ZMT0FUX1NURVJFTyhzYW1wbGVfcmF0ZSkgICAgICAgICAgICAgICAgICAgICAgXAorICBHU1RfU1RBUlRfVEVTVCAodGVzdF9nYWluX2Zsb2F0X3N0ZXJlb18jI3NhbXBsZV9yYXRlKSAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ2FuYWx5c2lzICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2ludCBhY2N1bXVsYXRvciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoRjMyKSwgc2FtcGxlX3JhdGUsIDIpOyAgICAgICAgICAgICAgIFwKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfc3F1YXJlX2Zsb2F0X3N0ZXJlbyAoJmFjY3VtdWxhdG9yLCAgICAgICBcCisgICAgICAgICAgICBzYW1wbGVfcmF0ZSwgNTEyLCAwLjI1LCAwLjI1KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGFnX2xpc3QgPSBwb2xsX3RhZ3NfZm9sbG93ZWRfYnlfZW9zIChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmYWlsX3VubGVzc190cmFja19wZWFrICh0YWdfbGlzdCwgMC4yNSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZmFpbF91bmxlc3NfdHJhY2tfZ2FpbiAodGFnX2xpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBnZXRfZXhwZWN0ZWRfZ2FpbiAoc2FtcGxlX3JhdGUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRhZ19saXN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGVhbnVwX3JnYW5hbHlzaXMgKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorR1NUX0VORF9URVNUOworCisjZGVmaW5lIE1BS0VfR0FJTl9URVNUX0lOVDE2X01PTk8oc2FtcGxlX3JhdGUsIGRlcHRoKSAgICAgICAgICAgICAgICAgXAorICBHU1RfU1RBUlRfVEVTVCAodGVzdF9nYWluX2ludDE2XyMjZGVwdGgjI19tb25vXyMjc2FtcGxlX3JhdGUpICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ2FuYWx5c2lzICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ2ludCBhY2N1bXVsYXRvciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzZW5kX2NhcHNfZXZlbnQgKEdTVF9BVURJT19ORSAoUzE2KSwgc2FtcGxlX3JhdGUsIDEpOyAgICAgICAgICAgICAgIFwKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwdXNoX2J1ZmZlciAodGVzdF9idWZmZXJfc3F1YXJlX2ludDE2X21vbm8gKCZhY2N1bXVsYXRvciwgICAgICAgICBcCisgICAgICAgICAgICBzYW1wbGVfcmF0ZSwgZGVwdGgsIDUxMiwgMSA8PCAoMTMgKyBkZXB0aCAtIDE2KSkpOyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRhZ19saXN0ID0gcG9sbF90YWdzX2ZvbGxvd2VkX2J5X2VvcyAoZWxlbWVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZmFpbF91bmxlc3NfdHJhY2tfcGVhayAodGFnX2xpc3QsIDAuMjUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZhaWxfdW5sZXNzX3RyYWNrX2dhaW4gKHRhZ19saXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZ2V0X2V4cGVjdGVkX2dhaW4gKHNhbXBsZV9yYXRlKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xlYW51cF9yZ2FuYWx5c2lzIChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0dTVF9FTkRfVEVTVDsKKworI2RlZmluZSBNQUtFX0dBSU5fVEVTVF9JTlQxNl9TVEVSRU8oc2FtcGxlX3JhdGUsIGRlcHRoKSAgICAgICAgICAgICAgIFwKKyAgR1NUX1NUQVJUX1RFU1QgKHRlc3RfZ2Fpbl9pbnQxNl8jI2RlcHRoIyNfc3RlcmVvXyMjc2FtcGxlX3JhdGUpICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmdhbmFseXNpcyAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdpbnQgYWNjdW11bGF0b3IgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2VuZF9jYXBzX2V2ZW50IChHU1RfQVVESU9fTkUgKFMxNiksIHNhbXBsZV9yYXRlLCAyKTsgICAgICAgICAgICAgICBcCisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpID0gMDsgaSA8IDIwOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHVzaF9idWZmZXIgKHRlc3RfYnVmZmVyX3NxdWFyZV9pbnQxNl9zdGVyZW8gKCZhY2N1bXVsYXRvciwgICAgICAgXAorICAgICAgICAgICAgc2FtcGxlX3JhdGUsIGRlcHRoLCA1MTIsIDEgPDwgKDEzICsgZGVwdGggLSAxNiksICAgICAgICAgIFwKKyAgICAgICAgICAgIDEgPDwgKDEzICsgZGVwdGggLSAxNikpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0YWdfbGlzdCA9IHBvbGxfdGFnc19mb2xsb3dlZF9ieV9lb3MgKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZhaWxfdW5sZXNzX3RyYWNrX3BlYWsgKHRhZ19saXN0LCAwLjI1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmYWlsX3VubGVzc190cmFja19nYWluICh0YWdfbGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGdldF9leHBlY3RlZF9nYWluIChzYW1wbGVfcmF0ZSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdzdF90YWdfbGlzdF91bnJlZiAodGFnX2xpc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsZWFudXBfcmdhbmFseXNpcyAoZWxlbWVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitHU1RfRU5EX1RFU1Q7CisKK01BS0VfR0FJTl9URVNUX0ZMT0FUX01PTk8gKDgwMDApOworTUFLRV9HQUlOX1RFU1RfRkxPQVRfTU9OTyAoMTEwMjUpOworTUFLRV9HQUlOX1RFU1RfRkxPQVRfTU9OTyAoMTIwMDApOworTUFLRV9HQUlOX1RFU1RfRkxPQVRfTU9OTyAoMTYwMDApOworTUFLRV9HQUlOX1RFU1RfRkxPQVRfTU9OTyAoMjIwNTApOworTUFLRV9HQUlOX1RFU1RfRkxPQVRfTU9OTyAoMjQwMDApOworTUFLRV9HQUlOX1RFU1RfRkxPQVRfTU9OTyAoMzIwMDApOworTUFLRV9HQUlOX1RFU1RfRkxPQVRfTU9OTyAoNDQxMDApOworTUFLRV9HQUlOX1RFU1RfRkxPQVRfTU9OTyAoNDgwMDApOworCitNQUtFX0dBSU5fVEVTVF9GTE9BVF9TVEVSRU8gKDgwMDApOworTUFLRV9HQUlOX1RFU1RfRkxPQVRfU1RFUkVPICgxMTAyNSk7CitNQUtFX0dBSU5fVEVTVF9GTE9BVF9TVEVSRU8gKDEyMDAwKTsKK01BS0VfR0FJTl9URVNUX0ZMT0FUX1NURVJFTyAoMTYwMDApOworTUFLRV9HQUlOX1RFU1RfRkxPQVRfU1RFUkVPICgyMjA1MCk7CitNQUtFX0dBSU5fVEVTVF9GTE9BVF9TVEVSRU8gKDI0MDAwKTsKK01BS0VfR0FJTl9URVNUX0ZMT0FUX1NURVJFTyAoMzIwMDApOworTUFLRV9HQUlOX1RFU1RfRkxPQVRfU1RFUkVPICg0NDEwMCk7CitNQUtFX0dBSU5fVEVTVF9GTE9BVF9TVEVSRU8gKDQ4MDAwKTsKKworTUFLRV9HQUlOX1RFU1RfSU5UMTZfTU9OTyAoODAwMCwgMTYpOworTUFLRV9HQUlOX1RFU1RfSU5UMTZfTU9OTyAoMTEwMjUsIDE2KTsKK01BS0VfR0FJTl9URVNUX0lOVDE2X01PTk8gKDEyMDAwLCAxNik7CitNQUtFX0dBSU5fVEVTVF9JTlQxNl9NT05PICgxNjAwMCwgMTYpOworTUFLRV9HQUlOX1RFU1RfSU5UMTZfTU9OTyAoMjIwNTAsIDE2KTsKK01BS0VfR0FJTl9URVNUX0lOVDE2X01PTk8gKDI0MDAwLCAxNik7CitNQUtFX0dBSU5fVEVTVF9JTlQxNl9NT05PICgzMjAwMCwgMTYpOworTUFLRV9HQUlOX1RFU1RfSU5UMTZfTU9OTyAoNDQxMDAsIDE2KTsKK01BS0VfR0FJTl9URVNUX0lOVDE2X01PTk8gKDQ4MDAwLCAxNik7CisKK01BS0VfR0FJTl9URVNUX0lOVDE2X1NURVJFTyAoODAwMCwgMTYpOworTUFLRV9HQUlOX1RFU1RfSU5UMTZfU1RFUkVPICgxMTAyNSwgMTYpOworTUFLRV9HQUlOX1RFU1RfSU5UMTZfU1RFUkVPICgxMjAwMCwgMTYpOworTUFLRV9HQUlOX1RFU1RfSU5UMTZfU1RFUkVPICgxNjAwMCwgMTYpOworTUFLRV9HQUlOX1RFU1RfSU5UMTZfU1RFUkVPICgyMjA1MCwgMTYpOworTUFLRV9HQUlOX1RFU1RfSU5UMTZfU1RFUkVPICgyNDAwMCwgMTYpOworTUFLRV9HQUlOX1RFU1RfSU5UMTZfU1RFUkVPICgzMjAwMCwgMTYpOworTUFLRV9HQUlOX1RFU1RfSU5UMTZfU1RFUkVPICg0NDEwMCwgMTYpOworTUFLRV9HQUlOX1RFU1RfSU5UMTZfU1RFUkVPICg0ODAwMCwgMTYpOworCitzdGF0aWMgU3VpdGUgKgorcmdhbmFseXNpc19zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJyZ2FuYWx5c2lzIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfbm9fYnVmZmVyKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X25vX2J1ZmZlcl9hbGJ1bV8xKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X25vX2J1ZmZlcl9hbGJ1bV8yKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2VtcHR5X2J1ZmZlcnMpOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wZWFrX2Zsb2F0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BlYWtfaW50MTZfMTYpOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wZWFrX2FsYnVtKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BlYWtfdHJhY2tfYWxidW0pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGVha19hbGJ1bV9hYm9ydF90b190cmFjayk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5fYWxidW0pOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9mb3JjZWQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZm9yY2VkX3NlcGFyYXRlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ZvcmNlZF9hZnRlcl9kYXRhKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ZvcmNlZF9hbGJ1bSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9mb3JjZWRfYWxidW1fc2tpcCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9mb3JjZWRfYWxidW1fbm9fc2tpcCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9mb3JjZWRfYWJvcnRfYWxidW1fbm9fc2tpcCk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3JlZmVyZW5jZV9sZXZlbCk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2FsbF9mb3JtYXRzKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9mbG9hdF9tb25vXzgwMDApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9mbG9hdF9tb25vXzExMDI1KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5fZmxvYXRfbW9ub18xMjAwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2Zsb2F0X21vbm9fMTYwMDApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9mbG9hdF9tb25vXzIyMDUwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5fZmxvYXRfbW9ub18yNDAwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2Zsb2F0X21vbm9fMzIwMDApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9mbG9hdF9tb25vXzQ0MTAwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5fZmxvYXRfbW9ub180ODAwMCk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5fZmxvYXRfc3RlcmVvXzgwMDApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9mbG9hdF9zdGVyZW9fMTEwMjUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9mbG9hdF9zdGVyZW9fMTIwMDApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9mbG9hdF9zdGVyZW9fMTYwMDApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9mbG9hdF9zdGVyZW9fMjIwNTApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9mbG9hdF9zdGVyZW9fMjQwMDApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9mbG9hdF9zdGVyZW9fMzIwMDApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9mbG9hdF9zdGVyZW9fNDQxMDApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9mbG9hdF9zdGVyZW9fNDgwMDApOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2ludDE2XzE2X21vbm9fODAwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2ludDE2XzE2X21vbm9fMTEwMjUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9pbnQxNl8xNl9tb25vXzEyMDAwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5faW50MTZfMTZfbW9ub18xNjAwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2ludDE2XzE2X21vbm9fMjIwNTApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9pbnQxNl8xNl9tb25vXzI0MDAwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhaW5faW50MTZfMTZfbW9ub18zMjAwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2ludDE2XzE2X21vbm9fNDQxMDApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9pbnQxNl8xNl9tb25vXzQ4MDAwKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2Fpbl9pbnQxNl8xNl9zdGVyZW9fODAwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2ludDE2XzE2X3N0ZXJlb18xMTAyNSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2ludDE2XzE2X3N0ZXJlb18xMjAwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2ludDE2XzE2X3N0ZXJlb18xNjAwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2ludDE2XzE2X3N0ZXJlb18yMjA1MCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2ludDE2XzE2X3N0ZXJlb18yNDAwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2ludDE2XzE2X3N0ZXJlb18zMjAwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2ludDE2XzE2X3N0ZXJlb180NDEwMCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYWluX2ludDE2XzE2X3N0ZXJlb180ODAwMCk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChyZ2FuYWx5c2lzKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3JnbGltaXRlci5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcmdsaW1pdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJjZTIyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3JnbGltaXRlci5jCkBAIC0wLDAgKzEsMjc1IEBACisvKiBHU3RyZWFtZXIgUmVwbGF5R2FpbiBsaW1pdGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlbmUgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKyAqCisgKiByZ2xpbWl0ZXIuYzogVW5pdCB0ZXN0IGZvciB0aGUgcmdsaW1pdGVyIGVsZW1lbnQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisKKy8qIEZvciBlYXNlIG9mIHByb2dyYW1taW5nIHdlIHVzZSBnbG9iYWxzIHRvIGtlZXAgcmVmcyBmb3Igb3VyIGZsb2F0aW5nCisgKiBzcmMgYW5kIHNpbmsgcGFkcyB3ZSBjcmVhdGU7IG90aGVyd2lzZSB3ZSBhbHdheXMgaGF2ZSB0byBkbyBnZXRfcGFkLAorICogZ2V0X3BlZXIsIGFuZCB0aGVuIHJlbW92ZSByZWZlcmVuY2VzIGluIGV2ZXJ5IHRlc3QgZnVuY3Rpb24gKi8KK3N0YXRpYyBHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCisjZGVmaW5lIFJHX0xJTUlURVJfQ0FQU19URU1QTEFURV9TVFJJTkcgICAgICAgXAorICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImZvcm1hdCA9IChzdHJpbmcpICJHU1RfQVVESU9fTkUgKEYzMikgIiwgIiBcCisgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgICAgICAgICAgXAorICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdLCAiICAgICAgICAgICAgIFwKKyAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdIgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChSR19MSU1JVEVSX0NBUFNfVEVNUExBVEVfU1RSSU5HKQorICAgICk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChSR19MSU1JVEVSX0NBUFNfVEVNUExBVEVfU1RSSU5HKQorICAgICk7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX3JnbGltaXRlciAodm9pZCkKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudDsKKworICBHU1RfREVCVUcgKCJzZXR1cF9yZ2xpbWl0ZXIiKTsKKyAgZWxlbWVudCA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgicmdsaW1pdGVyIik7CisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKGVsZW1lbnQsICZzcmN0ZW1wbGF0ZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoZWxlbWVudCwgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgcmV0dXJuIGVsZW1lbnQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX3JnbGltaXRlciAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdTVF9ERUJVRyAoImNsZWFudXBfcmdsaW1pdGVyIik7CisKKyAgZ19saXN0X2ZvcmVhY2ggKGJ1ZmZlcnMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICBidWZmZXJzID0gTlVMTDsKKworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAoZWxlbWVudCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoZWxlbWVudCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChlbGVtZW50KTsKK30KKworc3RhdGljIHZvaWQKK3NldF9wbGF5aW5nX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgIkNvdWxkIG5vdCBzZXQgc3RhdGUgdG8gUExBWUlORyIpOworfQorCitzdGF0aWMgY29uc3QgZ2Zsb2F0IHRlc3RfaW5wdXRbXSA9IHsKKyAgLTIuMCwgLTEuMCwgLTAuNzUsIC0wLjUsIC0wLjI1LCAwLjAsIDAuMjUsIDAuNSwgMC43NSwgMS4wLCAyLjAKK307CisKK3N0YXRpYyBjb25zdCBnZmxvYXQgdGVzdF9vdXRwdXRbXSA9IHsKKyAgLTAuOTk3NTI3Mzc2ODQzMzY1MjMsICAgICAgICAgLyogLTIuMCAgKi8KKyAgLTAuODgwNzk3MDc3OTc3ODgyNDMsICAgICAgICAgLyogLTEuMCAgKi8KKyAgLTAuNzMxMDU4NTc4NjMwMDA0OSwgICAgICAgICAgLyogLTAuNzUgKi8KKyAgLTAuNSwgLTAuMjUsIDAuMCwgMC4yNSwgMC41LAorICAwLjczMTA1ODU3ODYzMDAwNDksICAgICAgICAgICAvKiAwLjc1ICovCisgIDAuODgwNzk3MDc3OTc3ODgyNDMsICAgICAgICAgIC8qIDEuMCAgKi8KKyAgMC45OTc1MjczNzY4NDMzNjUyMywgICAgICAgICAgLyogMi4wICAqLworfTsKKworc3RhdGljIHZvaWQKK3NldHVwX2V2ZW50cyAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIDQ0MTAwLCAiY2hhbm5lbHMiLCBHX1RZUEVfSU5ULCAxLAorICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsIEdTVF9BVURJT19ORSAoRjMyKSwKKyAgICAgICJsYXlvdXQiLCBHX1RZUEVfU1RSSU5HLCAiaW50ZXJsZWF2ZWQiLCBOVUxMKTsKKworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgZWxlbWVudCwgY2FwcywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2NyZWF0ZV90ZXN0X2J1ZmZlciAodm9pZCkKK3sKKyAgR3N0QnVmZmVyICpidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHNpemVvZiAodGVzdF9pbnB1dCkpOworCisgIGdzdF9idWZmZXJfZmlsbCAoYnVmLCAwLCB0ZXN0X2lucHV0LCBzaXplb2YgKHRlc3RfaW5wdXQpKTsKKworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChidWYsICJidWYiLCAxKTsKKworICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgdm9pZAordmVyaWZ5X3Rlc3RfYnVmZmVyIChHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdE1hcEluZm8gbWFwOworICBnZmxvYXQgKm91dHB1dDsKKyAgZ2ludCBpOworCisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIG91dHB1dCA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZhaWxfdW5sZXNzIChtYXAuc2l6ZSA9PSBzaXplb2YgKHRlc3Rfb3V0cHV0KSk7CisKKyAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAodGVzdF9pbnB1dCk7IGkrKykKKyAgICBmYWlsX3VubGVzcyAoQUJTIChvdXRwdXRbaV0gLSB0ZXN0X291dHB1dFtpXSkgPCAxLmUtNiwKKyAgICAgICAgIkluY29ycmVjdCBvdXRwdXQgdmFsdWUgJS42ZiBmb3IgaW5wdXQgJS4yZiwgZXhwZWN0ZWQgJS42ZiIsCisgICAgICAgIG91dHB1dFtpXSwgdGVzdF9pbnB1dFtpXSwgdGVzdF9vdXRwdXRbaV0pOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7Cit9CisKKy8qIFN0YXJ0IG9mIHRlc3RzLiAqLworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ub19idWZmZXIpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ2xpbWl0ZXIgKCk7CisKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworCisgIGNsZWFudXBfcmdsaW1pdGVyIChlbGVtZW50KTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9kaXNhYmxlZCkKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnbGltaXRlciAoKTsKKyAgR3N0QnVmZmVyICpidWYsICpvdXRfYnVmOworCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgImVuYWJsZWQiLCBGQUxTRSwgTlVMTCk7CisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKyAgc2V0dXBfZXZlbnRzIChlbGVtZW50KTsKKworICBidWYgPSBjcmVhdGVfdGVzdF9idWZmZXIgKCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBidWYpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID09IDEpOworICBvdXRfYnVmID0gYnVmZmVycy0+ZGF0YTsKKyAgZmFpbF9pZiAob3V0X2J1ZiA9PSBOVUxMKTsKKyAgYnVmZmVycyA9IGdfbGlzdF9yZW1vdmUgKGJ1ZmZlcnMsIG91dF9idWYpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChvdXRfYnVmLCAib3V0X2J1ZiIsIDEpOworICBmYWlsX3VubGVzcyAoYnVmID09IG91dF9idWYpOworICBnc3RfYnVmZmVyX3VucmVmIChvdXRfYnVmKTsKKworICBjbGVhbnVwX3JnbGltaXRlciAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbGltaXRpbmcpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ2xpbWl0ZXIgKCk7CisgIEdzdEJ1ZmZlciAqYnVmLCAqb3V0X2J1ZjsKKworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisgIHNldHVwX2V2ZW50cyAoZWxlbWVudCk7CisKKyAgLyogTXV0YWJsZSB2YXJpYW50LiAqLworICBidWYgPSBjcmVhdGVfdGVzdF9idWZmZXIgKCk7CisgIEdTVF9ERUJVRyAoInB1c2ggbXV0YWJsZSBidWZmZXIiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGJ1ZikgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPT0gMSk7CisgIG91dF9idWYgPSBidWZmZXJzLT5kYXRhOworICBmYWlsX2lmIChvdXRfYnVmID09IE5VTEwpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChvdXRfYnVmLCAib3V0X2J1ZiIsIDEpOworICB2ZXJpZnlfdGVzdF9idWZmZXIgKG91dF9idWYpOworCisgIC8qIEltbXV0YWJsZSB2YXJpYW50LiAqLworICBidWYgPSBjcmVhdGVfdGVzdF9idWZmZXIgKCk7CisgIC8qIEV4dHJhIHJlZjogKi8KKyAgZ3N0X2J1ZmZlcl9yZWYgKGJ1Zik7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGJ1ZiwgImJ1ZiIsIDIpOworICBHU1RfREVCVUcgKCJwdXNoIGltbXV0YWJsZSBidWZmZXIiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGJ1ZikgPT0gR1NUX0ZMT1dfT0spOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChidWYsICJidWYiLCAxKTsKKyAgZmFpbF91bmxlc3MgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID09IDIpOworICBvdXRfYnVmID0gZ19saXN0X2xhc3QgKGJ1ZmZlcnMpLT5kYXRhOworICBmYWlsX2lmIChvdXRfYnVmID09IE5VTEwpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChvdXRfYnVmLCAib3V0X2J1ZiIsIDEpOworICBmYWlsX3VubGVzcyAoYnVmICE9IG91dF9idWYpOworICAvKiBEcm9wIG91ciBleHRyYSByZWY6ICovCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIHZlcmlmeV90ZXN0X2J1ZmZlciAob3V0X2J1Zik7CisKKyAgY2xlYW51cF9yZ2xpbWl0ZXIgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2dhcCkKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3JnbGltaXRlciAoKTsKKyAgR3N0QnVmZmVyICpidWYsICpvdXRfYnVmOworICBHc3RNYXBJbmZvIG0xLCBtMjsKKworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisgIHNldHVwX2V2ZW50cyAoZWxlbWVudCk7CisKKyAgYnVmID0gY3JlYXRlX3Rlc3RfYnVmZmVyICgpOworICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWYsIEdTVF9CVUZGRVJfRkxBR19HQVApOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgYnVmKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA9PSAxKTsKKyAgb3V0X2J1ZiA9IGJ1ZmZlcnMtPmRhdGE7CisgIGZhaWxfaWYgKG91dF9idWYgPT0gTlVMTCk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKG91dF9idWYsICJvdXRfYnVmIiwgMSk7CisKKyAgLyogVmVyaWZ5IHRoYXQgdGhlIGJhc2VjbGFzcyBkb2VzIG5vdCBsaWZ0IHRoZSBHQVAgZmxhZzogKi8KKyAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKG91dF9idWYsIEdTVF9CVUZGRVJfRkxBR19HQVApKTsKKworICBnc3RfYnVmZmVyX21hcCAob3V0X2J1ZiwgJm0xLCBHU1RfTUFQX1JFQUQpOworICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbTIsIEdTVF9NQVBfUkVBRCk7CisKKyAgZ19hc3NlcnQgKG0xLnNpemUgPT0gbTIuc2l6ZSk7CisgIC8qIFdlIGNoZWF0ZWQgYnkgcGFzc2luZyBhbiBpbnB1dCBidWZmZXIgd2l0aCBub24tc2lsZW5jZSB0aGF0IGhhcyB0aGUgR0FQCisgICAqIGZsYWcgc2V0LiAgVGhlIGVsZW1lbnQgY2Fubm90IGtub3cgdGhhdCBob3dldmVyIGFuZCBtdXN0IGhhdmUgc2tpcHBlZAorICAgKiBhZGp1c3RpbmcgdGhlIGJ1ZmZlciBiZWNhdXNlIG9mIHRoZSBmbGFnLCB3aGljaCB3ZSBjYW4gZWFzaWx5IHZlcmlmeTogKi8KKyAgZmFpbF9pZiAobWVtY21wIChtMS5kYXRhLCBtMi5kYXRhLCBtMS5zaXplKSAhPSAwKTsKKworICBnc3RfYnVmZmVyX3VubWFwIChvdXRfYnVmLCAmbTEpOworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtMik7CisKKyAgY2xlYW51cF9yZ2xpbWl0ZXIgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCityZ2xpbWl0ZXJfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgicmdsaW1pdGVyIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfbm9fYnVmZmVyKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2Rpc2FibGVkKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2xpbWl0aW5nKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dhcCk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChyZ2xpbWl0ZXIpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvcmd2b2x1bWUuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3Jndm9sdW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhZThiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3Jndm9sdW1lLmMKQEAgLTAsMCArMSw2NzggQEAKKy8qIEdTdHJlYW1lciBSZXBsYXlHYWluIHZvbHVtZSBhZGp1c3RtZW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlbmUgU3RhZGxlciA8bWFpbEByZW5lc3RhZGxlci5kZT4KKyAqCisgKiByZ3ZvbHVtZS5jOiBVbml0IHRlc3QgZm9yIHRoZSByZ3ZvbHVtZSBlbGVtZW50CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorCisjaW5jbHVkZSA8bWF0aC5oPgorCitzdGF0aWMgR0xpc3QgKmV2ZW50cyA9IE5VTEw7CisKKy8qIEZvciBlYXNlIG9mIHByb2dyYW1taW5nIHdlIHVzZSBnbG9iYWxzIHRvIGtlZXAgcmVmcyBmb3Igb3VyIGZsb2F0aW5nIHNyYyBhbmQKKyAqIHNpbmsgcGFkcyB3ZSBjcmVhdGU7IG90aGVyd2lzZSB3ZSBhbHdheXMgaGF2ZSB0byBkbyBnZXRfcGFkLCBnZXRfcGVlciwgYW5kCisgKiB0aGVuIHJlbW92ZSByZWZlcmVuY2VzIGluIGV2ZXJ5IHRlc3QgZnVuY3Rpb24gKi8KK3N0YXRpYyBHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCisjZGVmaW5lIFJHX1ZPTFVNRV9DQVBTX1RFTVBMQVRFX1NUUklORyAgICAgICAgXAorICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImZvcm1hdCA9IChzdHJpbmcpICJHU1RfQVVESU9fTkUgKEYzMikgIiwgIiBcCisgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgICAgICAgICAgXAorICAiY2hhbm5lbHMgPSAoaW50KSBbIDEsIE1BWCBdLCAiICAgICAgICAgICAgIFwKKyAgInJhdGUgPSAoaW50KSBbIDEsIE1BWCBdIgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChSR19WT0xVTUVfQ0FQU19URU1QTEFURV9TVFJJTkcpCisgICAgKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFJHX1ZPTFVNRV9DQVBTX1RFTVBMQVRFX1NUUklORykKKyAgICApOworCitzdGF0aWMgR3N0QnVmZmVyICp0ZXN0X2J1ZmZlcl9uZXcgKGdmbG9hdCB2YWx1ZSk7CisKKy8qIGdzdGNoZWNrIHNldHMgdXAgYSBjaGFpbiBmdW5jdGlvbiB0aGF0IGFwcGVuZHMgYnVmZmVycyB0byBhIGdsb2JhbCBsaXN0LgorICogVGhpcyBpcyBvdXIgZXF1aXZhbGVudCBvZiB0aGF0IGZvciBldmVudCBoYW5kbGluZy4gKi8KK3N0YXRpYyBnYm9vbGVhbgorZXZlbnRfZnVuYyAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdTVF9ERUJVRyAoInJlY2VpdmVkIGV2ZW50ICVwICglcykiLCBldmVudCwgR1NUX0VWRU5UX1RZUEVfTkFNRSAoZXZlbnQpKTsKKyAgZXZlbnRzID0gZ19saXN0X2FwcGVuZCAoZXZlbnRzLCBldmVudCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX3Jndm9sdW1lICh2b2lkKQoreworICBHc3RFbGVtZW50ICplbGVtZW50OworCisgIEdTVF9ERUJVRyAoInNldHVwX3Jndm9sdW1lIik7CisgIGVsZW1lbnQgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoInJndm9sdW1lIik7CisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKGVsZW1lbnQsICZzcmN0ZW1wbGF0ZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoZWxlbWVudCwgJnNpbmt0ZW1wbGF0ZSk7CisKKyAgLyogQ2FwdHVyZSBldmVudHMsIHRvIHRlc3QgdGFnIGZpbHRlcmluZyBiZWhhdmlvcjogKi8KKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKG15c2lua3BhZCwgZXZlbnRfZnVuYyk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICByZXR1cm4gZWxlbWVudDsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfZW1wdHlfYnVmZmVyICh2b2lkKQoreworICBHc3RCdWZmZXIgKmJ1ZjsKKworICBidWYgPSB0ZXN0X2J1ZmZlcl9uZXcgKDAuMCk7CisgIGdzdF9idWZmZXJfcmVzaXplIChidWYsIDAsIDApOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWYpID0gMDsKKyAgR1NUX0JVRkZFUl9PRkZTRVRfRU5EIChidWYpID0gR1NUX0JVRkZFUl9PRkZTRVQgKGJ1Zik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBidWYpID09IEdTVF9GTE9XX09LKTsKKworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPT0gMSk7CisgIGZhaWxfdW5sZXNzIChidWZmZXJzLT5kYXRhID09IGJ1Zik7CisgIGdzdF9taW5pX29iamVjdF91bnJlZiAoKEdzdE1pbmlPYmplY3QgKikgYnVmZmVycy0+ZGF0YSk7CisgIGJ1ZmZlcnMgPSBnX2xpc3RfcmVtb3ZlIChidWZmZXJzLCBidWYpOworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF9yZ3ZvbHVtZSAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdTVF9ERUJVRyAoImNsZWFudXBfcmd2b2x1bWUiKTsKKworICBnX2xpc3RfZm9yZWFjaCAoYnVmZmVycywgKEdGdW5jKSBnc3RfbWluaV9vYmplY3RfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGdfbGlzdF9mb3JlYWNoIChldmVudHMsIChHRnVuYykgZ3N0X21pbmlfb2JqZWN0X3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGV2ZW50cyk7CisgIGV2ZW50cyA9IE5VTEw7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAoZWxlbWVudCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoZWxlbWVudCk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChlbGVtZW50KTsKK30KKworc3RhdGljIHZvaWQKK3NldF9wbGF5aW5nX3N0YXRlIChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgIkNvdWxkIG5vdCBzZXQgc3RhdGUgdG8gUExBWUlORyIpOworfQorCitzdGF0aWMgdm9pZAorc2V0X251bGxfc3RhdGUgKEdzdEVsZW1lbnQgKiBlbGVtZW50KQoreworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiQ291bGQgbm90IHNldCBzdGF0ZSB0byBOVUxMIik7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX2ZsdXNoX2V2ZW50cyAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIGdib29sZWFuIHJlczsKKworICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0YXJ0ICgpKTsKKyAgZmFpbF91bmxlc3MgKHJlcywgImZsdXNoLXN0YXJ0IGV2ZW4gbm90IGhhbmRsZWQiKTsKKworICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0b3AgKFRSVUUpKTsKKyAgZmFpbF91bmxlc3MgKHJlcywgImZsdXNoLXN0b3AgZXZlbnQgbm90IGhhbmRsZWQiKTsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfc3RyZWFtX3N0YXJ0X2V2ZW50IChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHJlcyA9IGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgidGVzdCIpKTsKKyAgZmFpbF91bmxlc3MgKHJlcywgIlNUUkVBTV9TVEFSVCBldmVudCBub3QgaGFuZGxlZCIpOworfQorCitzdGF0aWMgdm9pZAorc2VuZF9jYXBzX2V2ZW50IChHc3RFbGVtZW50ICogZWxlbWVudCkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoImF1ZGlvL3gtcmF3LCBmb3JtYXQgPSAiIEdTVF9BVURJT19ORSAoRjMyKSAiLCAiCisgICAgICAibGF5b3V0ID0gaW50ZXJsZWF2ZWQsIHJhdGUgPSA4MDAwLCBjaGFubmVscyA9IDEiKTsKKyAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZ3N0X2V2ZW50X25ld19jYXBzIChjYXBzKSk7CisgIGZhaWxfdW5sZXNzIChyZXMsICJDQVBTIGV2ZW50IG5vdCBoYW5kbGVkIik7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfc2VnbWVudF9ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSk7CisgIGZhaWxfdW5sZXNzIChyZXMsICJTRUdNRU5UIGV2ZW50IG5vdCBoYW5kbGVkIik7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX2Vvc19ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQpCit7CisgIEdzdEV2ZW50ICpldmVudCA9IGdzdF9ldmVudF9uZXdfZW9zICgpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBldmVudCksCisgICAgICAiUHVzaGluZyBFT1MgZXZlbnQgZmFpbGVkIik7Cit9CisKK3N0YXRpYyBHc3RFdmVudCAqCitzZW5kX3RhZ19ldmVudCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIEdMaXN0ICpsOworICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsKKyAgZ2RvdWJsZSBkdW1teTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoZXZlbnQtPnR5cGUgPT0gR1NUX0VWRU5UX1RBRywgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGV2ZW50KSwKKyAgICAgICJQdXNoaW5nIHRhZyBldmVudCBmYWlsZWQiKTsKKworICBldmVudCA9IE5VTEw7CisKKyAgZm9yIChsID0gZ19saXN0X2xhc3QgKGV2ZW50cyk7IGw7IGwgPSBsLT5wcmV2KSB7CisgICAgaWYgKEdTVF9FVkVOVF9UWVBFIChsLT5kYXRhKSA9PSBHU1RfRVZFTlRfVEFHKSB7CisgICAgICBldmVudCA9IGwtPmRhdGE7CisgICAgICBldmVudHMgPSBnX2xpc3RfZGVsZXRlX2xpbmsgKGV2ZW50cywgbCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBFdmVudCBnb3QgZmlsdGVyZWQgb3V0ICovCisgIGlmIChldmVudCA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGZhaWxfdW5sZXNzIChldmVudC0+dHlwZSA9PSBHU1RfRVZFTlRfVEFHKTsKKyAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAoZXZlbnQsICZ0YWdfbGlzdCk7CisKKyAgLyogVGhlIGVsZW1lbnQgaXMgc3VwcG9zZWQgdG8gZmlsdGVyIG91dCBSZXBsYXlHYWluIHJlbGF0ZWQgdGFncy4gKi8KKyAgZmFpbF9pZiAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ19saXN0LCBHU1RfVEFHX1RSQUNLX0dBSU4sICZkdW1teSksCisgICAgICAidGFnIGV2ZW50IHN0aWxsIGNvbnRhaW5zIHRyYWNrIGdhaW4gdGFnIik7CisgIGZhaWxfaWYgKGdzdF90YWdfbGlzdF9nZXRfZG91YmxlICh0YWdfbGlzdCwgR1NUX1RBR19UUkFDS19QRUFLLCAmZHVtbXkpLAorICAgICAgInRhZyBldmVudCBzdGlsbCBjb250YWlucyB0cmFjayBwZWFrIHRhZyIpOworICBmYWlsX2lmIChnc3RfdGFnX2xpc3RfZ2V0X2RvdWJsZSAodGFnX2xpc3QsIEdTVF9UQUdfQUxCVU1fR0FJTiwgJmR1bW15KSwKKyAgICAgICJ0YWcgZXZlbnQgc3RpbGwgY29udGFpbnMgYWxidW0gZ2FpbiB0YWciKTsKKyAgZmFpbF9pZiAoZ3N0X3RhZ19saXN0X2dldF9kb3VibGUgKHRhZ19saXN0LCBHU1RfVEFHX0FMQlVNX1BFQUssICZkdW1teSksCisgICAgICAidGFnIGV2ZW50IHN0aWxsIGNvbnRhaW5zIGFsYnVtIHBlYWsgdGFnIik7CisKKyAgcmV0dXJuIGV2ZW50OworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK3Rlc3RfYnVmZmVyX25ldyAoZ2Zsb2F0IHZhbHVlKQoreworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGdmbG9hdCAqZGF0YTsKKyAgZ2ludCBpOworCisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoOCAqIHNpemVvZiAoZ2Zsb2F0KSk7CisgIGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBkYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICBkYXRhW2ldID0gdmFsdWU7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChidWYsICJidWYiLCAxKTsKKworICByZXR1cm4gYnVmOworfQorCisjZGVmaW5lIE1BVENIX0dBSU4oZzEsIGcyKSAoKGcxIDwgZzIgKyAxZS02KSAmJiAoZzIgPCBnMSArIDFlLTYpKQorCitzdGF0aWMgdm9pZAorZmFpbF91bmxlc3NfdGFyZ2V0X2dhaW4gKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBnZG91YmxlIGV4cGVjdGVkX2dhaW4pCit7CisgIGdkb3VibGUgcHJvcF9nYWluOworCisgIGdfb2JqZWN0X2dldCAoZWxlbWVudCwgInRhcmdldC1nYWluIiwgJnByb3BfZ2FpbiwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKE1BVENIX0dBSU4gKHByb3BfZ2FpbiwgZXhwZWN0ZWRfZ2FpbiksCisgICAgICAiVGFyZ2V0IGdhaW4gaXMgJS4yZiBkQiwgZXhwZWN0ZWQgJS4yZiBkQiIsIHByb3BfZ2FpbiwgZXhwZWN0ZWRfZ2Fpbik7Cit9CisKK3N0YXRpYyB2b2lkCitmYWlsX3VubGVzc19yZXN1bHRfZ2FpbiAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIGdkb3VibGUgZXhwZWN0ZWRfZ2FpbikKK3sKKyAgR3N0QnVmZmVyICppbnB1dF9idWYsICpvdXRwdXRfYnVmOworICBnZmxvYXQgKmRhdGE7CisgIGdmbG9hdCBpbnB1dF9zYW1wbGUsIG91dHB1dF9zYW1wbGU7CisgIGdkb3VibGUgZ2FpbiwgcHJvcF9nYWluOworICBnYm9vbGVhbiBpc19wYXNzdGhyb3VnaCwgZXhwZWN0X3Bhc3N0aHJvdWdoOworICBnaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA9PSAwKTsKKworICBpbnB1dF9zYW1wbGUgPSAxLjA7CisgIGlucHV0X2J1ZiA9IHRlc3RfYnVmZmVyX25ldyAoaW5wdXRfc2FtcGxlKTsKKworICAvKiBXZSBrZWVwIGFuIGV4dHJhIHJlZmVyZW5jZSB0byBkZXRlY3QgcGFzc3Rocm91Z2ggbW9kZS4gKi8KKyAgZ3N0X2J1ZmZlcl9yZWYgKGlucHV0X2J1Zik7CisgIC8qIFB1c2hpbmcgc3RlYWxzIGEgcmVmZXJlbmNlLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5wdXRfYnVmKSA9PSBHU1RfRkxPV19PSyk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGlucHV0X2J1Zik7CisKKyAgLyogVGhlIG91dHB1dCBidWZmZXIgZW5kcyB1cCBvbiB0aGUgZ2xvYmFsIGJ1ZmZlciBsaXN0LiAqLworICBmYWlsX3VubGVzcyAoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgPT0gMSk7CisgIG91dHB1dF9idWYgPSBidWZmZXJzLT5kYXRhOworICBmYWlsX2lmIChvdXRwdXRfYnVmID09IE5VTEwpOworCisgIGJ1ZmZlcnMgPSBnX2xpc3RfcmVtb3ZlIChidWZmZXJzLCBvdXRwdXRfYnVmKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAob3V0cHV0X2J1ZiwgIm91dHB1dF9idWYiLCAxKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfYnVmZmVyX2dldF9zaXplIChvdXRwdXRfYnVmKSwKKyAgICAgIDggKiBzaXplb2YgKGdmbG9hdCkpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRwdXRfYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBkYXRhID0gKGdmbG9hdCAqKSBtYXAuZGF0YTsKKworICBvdXRwdXRfc2FtcGxlID0gKmRhdGE7CisgIGZhaWxfaWYgKG91dHB1dF9zYW1wbGUgPT0gMC4wLCAiRmlyc3Qgb3V0cHV0IHNhbXBsZSBpcyB6ZXJvIik7CisgIGZvciAoaSA9IDE7IGkgPCA4OyBpKyspIHsKKyAgICBmYWlsX3VubGVzcyAob3V0cHV0X3NhbXBsZSA9PSBkYXRhW2ldLCAiT3V0cHV0IHNhbXBsZXMgbm90IHVuaWZvcm0iKTsKKyAgfTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0cHV0X2J1ZiwgJm1hcCk7CisKKyAgZ2FpbiA9IDIwLiAqIGxvZzEwIChvdXRwdXRfc2FtcGxlIC8gaW5wdXRfc2FtcGxlKTsKKyAgZmFpbF91bmxlc3MgKE1BVENIX0dBSU4gKGdhaW4sIGV4cGVjdGVkX2dhaW4pLAorICAgICAgIkFwcGxpZWQgZ2FpbiBpcyAlLjJmIGRCLCBleHBlY3RlZCAlLjJmIGRCIiwgZ2FpbiwgZXhwZWN0ZWRfZ2Fpbik7CisgIGdfb2JqZWN0X2dldCAoZWxlbWVudCwgInJlc3VsdC1nYWluIiwgJnByb3BfZ2FpbiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChNQVRDSF9HQUlOIChwcm9wX2dhaW4sIGV4cGVjdGVkX2dhaW4pLAorICAgICAgIlJlc3VsdCBnYWluIGlzICUuMmYgZEIsIGV4cGVjdGVkICUuMmYgZEIiLCBwcm9wX2dhaW4sIGV4cGVjdGVkX2dhaW4pOworCisgIGlzX3Bhc3N0aHJvdWdoID0gKG91dHB1dF9idWYgPT0gaW5wdXRfYnVmKTsKKyAgZXhwZWN0X3Bhc3N0aHJvdWdoID0gTUFUQ0hfR0FJTiAoZXhwZWN0ZWRfZ2FpbiwgKzAuMDApOworICBmYWlsX3VubGVzcyAoaXNfcGFzc3Rocm91Z2ggPT0gZXhwZWN0X3Bhc3N0aHJvdWdoLAorICAgICAgZXhwZWN0X3Bhc3N0aHJvdWdoCisgICAgICA/ICJFeHBlY3RlZCBvcGVyYXRpb24gaW4gcGFzc3Rocm91Z2ggbW9kZSIKKyAgICAgIDogIkluY29ycmVjdCBwYXNzdGhyb3VnaCBiZWhhdmlvdXIiKTsKKworICBnc3RfYnVmZmVyX3VucmVmIChvdXRwdXRfYnVmKTsKK30KKworc3RhdGljIHZvaWQKK2ZhaWxfdW5sZXNzX2dhaW4gKEdzdEVsZW1lbnQgKiBlbGVtZW50LCBnZG91YmxlIGV4cGVjdGVkX2dhaW4pCit7CisgIGZhaWxfdW5sZXNzX3RhcmdldF9nYWluIChlbGVtZW50LCBleHBlY3RlZF9nYWluKTsKKyAgZmFpbF91bmxlc3NfcmVzdWx0X2dhaW4gKGVsZW1lbnQsIGV4cGVjdGVkX2dhaW4pOworfQorCisvKiBTdGFydCBvZiB0ZXN0cy4gKi8KKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfbm9fYnVmZmVyKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmd2b2x1bWUgKCk7CisKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworICBzZXRfbnVsbF9zdGF0ZSAoZWxlbWVudCk7CisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworCisgIGNsZWFudXBfcmd2b2x1bWUgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2V2ZW50cykKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3Jndm9sdW1lICgpOworICBHc3RFdmVudCAqZXZlbnQ7CisgIEdzdEV2ZW50ICpuZXdfZXZlbnQ7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworICBnY2hhciAqYXJ0aXN0OworCisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworCisgIHNlbmRfZW1wdHlfYnVmZmVyICgpOworCisgIHRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZ3N0X3RhZ19saXN0X2FkZCAodGFnX2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgIEdTVF9UQUdfVFJBQ0tfR0FJTiwgKzQuOTUsIEdTVF9UQUdfVFJBQ0tfUEVBSywgMC41OTQ2MywKKyAgICAgIEdTVF9UQUdfQUxCVU1fR0FJTiwgLTEuNTQsIEdTVF9UQUdfQUxCVU1fUEVBSywgMC42OTM0MTUsCisgICAgICBHU1RfVEFHX0FSVElTVCwgIkZvb2JhciIsIE5VTEwpOworICBldmVudCA9IGdzdF9ldmVudF9uZXdfdGFnICh0YWdfbGlzdCk7CisgIG5ld19ldmVudCA9IHNlbmRfdGFnX2V2ZW50IChlbGVtZW50LCBldmVudCk7CisgIGdzdF9ldmVudF9wYXJzZV90YWcgKG5ld19ldmVudCwgJnRhZ19saXN0KTsKKyAgZmFpbF91bmxlc3MgKGdzdF90YWdfbGlzdF9nZXRfc3RyaW5nICh0YWdfbGlzdCwgR1NUX1RBR19BUlRJU1QsICZhcnRpc3QpKTsKKyAgZmFpbF91bmxlc3MgKGdfc3RyX2VxdWFsIChhcnRpc3QsICJGb29iYXIiKSk7CisgIGdfZnJlZSAoYXJ0aXN0KTsKKyAgZ3N0X2V2ZW50X3VucmVmIChuZXdfZXZlbnQpOworCisgIC8qIFNhbWUgYXMgYWJvdmUsIGJ1dCB3aXRoIGEgbm9uLXdyaXRhYmxlIGV2ZW50LiAqLworCisgIHRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZ3N0X3RhZ19saXN0X2FkZCAodGFnX2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgIEdTVF9UQUdfVFJBQ0tfR0FJTiwgKzQuOTUsIEdTVF9UQUdfVFJBQ0tfUEVBSywgMC41OTQ2MywKKyAgICAgIEdTVF9UQUdfQUxCVU1fR0FJTiwgLTEuNTQsIEdTVF9UQUdfQUxCVU1fUEVBSywgMC42OTM0MTUsCisgICAgICBHU1RfVEFHX0FSVElTVCwgIkZvb2JhciIsIE5VTEwpOworICBnc3RfdGFnX2xpc3RfcmVmICh0YWdfbGlzdCk7CisgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld190YWcgKHRhZ19saXN0KTsKKyAgbmV3X2V2ZW50ID0gc2VuZF90YWdfZXZlbnQgKGVsZW1lbnQsIGV2ZW50KTsKKworICAvKiBNYWtlIHN1cmUgb3VyIHRhZ3Mgd2VyZW4ndCBtb2RpZmllZCBpbiBwbGFjZSB3aGlsZSB3ZSBzdGlsbCBnb3QgYSByZWYgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoNSwgZ3N0X3RhZ19saXN0X25fdGFncyAodGFnX2xpc3QpKTsKKyAgZ3N0X3RhZ19saXN0X3VucmVmICh0YWdfbGlzdCk7CisKKyAgZ3N0X2V2ZW50X3BhcnNlX3RhZyAobmV3X2V2ZW50LCAmdGFnX2xpc3QpOworICBmYWlsX3VubGVzcyAoZ3N0X3RhZ19saXN0X2dldF9zdHJpbmcgKHRhZ19saXN0LCBHU1RfVEFHX0FSVElTVCwgJmFydGlzdCkpOworICBmYWlsX3VubGVzcyAoZ19zdHJfZXF1YWwgKGFydGlzdCwgIkZvb2JhciIpKTsKKyAgZ19mcmVlIChhcnRpc3QpOworICBnc3RfZXZlbnRfdW5yZWYgKG5ld19ldmVudCk7CisKKyAgY2xlYW51cF9yZ3ZvbHVtZSAoZWxlbWVudCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfc2ltcGxlKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmd2b2x1bWUgKCk7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgImFsYnVtLW1vZGUiLCBGQUxTRSwgImhlYWRyb29tIiwgKzAuMDAsCisgICAgICAicHJlLWFtcCIsIC02LjAwLCAiZmFsbGJhY2stZ2FpbiIsICsxLjIzLCBOVUxMKTsKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisKKyAgc2VuZF9lbXB0eV9idWZmZXIgKCk7CisKKyAgdGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdfbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgR1NUX1RBR19UUkFDS19HQUlOLCAtMy40NSwgR1NUX1RBR19UUkFDS19QRUFLLCAxLjAsCisgICAgICBHU1RfVEFHX0FMQlVNX0dBSU4sICsyLjA5LCBHU1RfVEFHX0FMQlVNX1BFQUssIDEuMCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChzZW5kX3RhZ19ldmVudCAoZWxlbWVudCwgZ3N0X2V2ZW50X25ld190YWcgKHRhZ19saXN0KSkgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2dhaW4gKGVsZW1lbnQsIC05LjQ1KTsgICAgLyogcHJlLWFtcCArIHRyYWNrIGdhaW4gKi8KKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgImFsYnVtLW1vZGUiLCBUUlVFLCBOVUxMKTsKKworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisKKyAgdGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdfbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgR1NUX1RBR19UUkFDS19HQUlOLCAtMy40NSwgR1NUX1RBR19UUkFDS19QRUFLLCAxLjAsCisgICAgICBHU1RfVEFHX0FMQlVNX0dBSU4sICsyLjA5LCBHU1RfVEFHX0FMQlVNX1BFQUssIDEuMCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChzZW5kX3RhZ19ldmVudCAoZWxlbWVudCwgZ3N0X2V2ZW50X25ld190YWcgKHRhZ19saXN0KSkgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2dhaW4gKGVsZW1lbnQsIC0zLjkxKTsgICAgLyogcHJlLWFtcCArIGFsYnVtIGdhaW4gKi8KKworICAvKiBTd2l0Y2hpbmcgYmFjayB0byB0cmFjayBtb2RlIGluIHRoZSBtaWRkbGUgb2YgYSBzdHJlYW06ICovCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgImFsYnVtLW1vZGUiLCBGQUxTRSwgTlVMTCk7CisgIGZhaWxfdW5sZXNzX2dhaW4gKGVsZW1lbnQsIC05LjQ1KTsgICAgLyogcHJlLWFtcCArIHRyYWNrIGdhaW4gKi8KKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworCisgIGNsZWFudXBfcmd2b2x1bWUgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIElmIHRoZXJlIGFyZSBubyBnYWluIHRhZ3MgYXQgYWxsLCB0aGUgZmFsbGJhY2sgZ2FpbiBpcyB1c2VkLiAqLworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mYWxsYmFja19nYWluKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmd2b2x1bWUgKCk7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworCisgIC8qIEZpcnN0IHNvbWUgdHJhY2sgd2hlcmUgZmFsbGJhY2sgZG9lcyBfbm90XyBhcHBseS4gKi8KKworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJhbGJ1bS1tb2RlIiwgRkFMU0UsICJoZWFkcm9vbSIsIDEwLjAwLAorICAgICAgInByZS1hbXAiLCAtNi4wMCwgImZhbGxiYWNrLWdhaW4iLCAtMy4wMCwgTlVMTCk7CisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworCisgIHNlbmRfZW1wdHlfYnVmZmVyICgpOworCisgIHRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZ3N0X3RhZ19saXN0X2FkZCAodGFnX2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgIEdTVF9UQUdfVFJBQ0tfR0FJTiwgKzMuNSwgR1NUX1RBR19UUkFDS19QRUFLLCAxLjAsCisgICAgICBHU1RfVEFHX0FMQlVNX0dBSU4sIC0wLjUsIEdTVF9UQUdfQUxCVU1fUEVBSywgMS4wLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHNlbmRfdGFnX2V2ZW50IChlbGVtZW50LCBnc3RfZXZlbnRfbmV3X3RhZyAodGFnX2xpc3QpKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZ2FpbiAoZWxlbWVudCwgLTIuNTApOyAgICAvKiBwcmUtYW1wICsgdHJhY2sgZ2FpbiAqLworICBzZW5kX2Vvc19ldmVudCAoZWxlbWVudCk7CisKKyAgLyogTm93IGEgdHJhY2sgY29tcGxldGVseSBtaXNzaW5nIHRhZ3MuICovCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKworICBmYWlsX3VubGVzc19nYWluIChlbGVtZW50LCAtOS4wMCk7ICAgIC8qIHByZS1hbXAgKyBmYWxsYmFjay1nYWluICovCisKKyAgLyogQ2hhbmdpbmcgdGhlIGZhbGxiYWNrIGdhaW4gaW4gdGhlIG1pZGRsZSBvZiBhIHN0cmVhbSwgZ29pbmcgdG8gcGFzcy10aHJvdWdoCisgICAqIG1vZGU6ICovCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgImZhbGxiYWNrLWdhaW4iLCArNi4wMCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzX2dhaW4gKGVsZW1lbnQsICswLjAwKTsgICAgLyogcHJlLWFtcCArIGZhbGxiYWNrLWdhaW4gKi8KKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworCisgIC8qIFZlcmlmeSB0aGF0IHJlc3VsdCBnYWluIGlzIHNldCB0byArMC4wMCB3aXRoIHByZS1hbXAgKyBmYWxsYmFjay1nYWluID4KKyAgICogKzAuMDAgYW5kIG5vIGhlYWRyb29tLiAqLworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAiZmFsbGJhY2stZ2FpbiIsICsxMi4wMCwgImhlYWRyb29tIiwgKzAuMDAsIE5VTEwpOworICBmYWlsX3VubGVzc190YXJnZXRfZ2FpbiAoZWxlbWVudCwgKzYuMDApOyAgICAgLyogcHJlLWFtcCArIGZhbGxiYWNrLWdhaW4gKi8KKyAgZmFpbF91bmxlc3NfcmVzdWx0X2dhaW4gKGVsZW1lbnQsICswLjAwKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworCisgIGNsZWFudXBfcmd2b2x1bWUgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIElmIGFsYnVtIGdhaW4gaXMgdG8gYmUgcHJlZmVycmVkIGJ1dCBub3QgYXZhaWxhYmxlLCB0aGUgdHJhY2sgZ2FpbiBpcyB0byBiZQorICogdGFrZW4gaW5zdGVhZC4gKi8KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZmFsbGJhY2tfdHJhY2spCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQgPSBzZXR1cF9yZ3ZvbHVtZSAoKTsKKyAgR3N0VGFnTGlzdCAqdGFnX2xpc3Q7CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAiYWxidW0tbW9kZSIsIFRSVUUsICJoZWFkcm9vbSIsICswLjAwLAorICAgICAgInByZS1hbXAiLCAtNi4wMCwgImZhbGxiYWNrLWdhaW4iLCArMS4yMywgTlVMTCk7CisgIHNldF9wbGF5aW5nX3N0YXRlIChlbGVtZW50KTsKKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworCisgIHNlbmRfZW1wdHlfYnVmZmVyICgpOworCisgIHRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZ3N0X3RhZ19saXN0X2FkZCAodGFnX2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgIEdTVF9UQUdfVFJBQ0tfR0FJTiwgKzIuMTEsIEdTVF9UQUdfVFJBQ0tfUEVBSywgMS4wLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHNlbmRfdGFnX2V2ZW50IChlbGVtZW50LCBnc3RfZXZlbnRfbmV3X3RhZyAodGFnX2xpc3QpKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZ2FpbiAoZWxlbWVudCwgLTMuODkpOyAgICAvKiBwcmUtYW1wICsgdHJhY2sgZ2FpbiAqLworCisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKworICBjbGVhbnVwX3Jndm9sdW1lIChlbGVtZW50KTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBJZiB0cmFjayBnYWluIGlzIHRvIGJlIHByZWZlcnJlZCBidXQgbm90IGF2YWlsYWJsZSwgdGhlIGFsYnVtIGdhaW4gaXMgdG8gYmUKKyAqIHRha2VuIGluc3RlYWQuICovCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ZhbGxiYWNrX2FsYnVtKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmd2b2x1bWUgKCk7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgImFsYnVtLW1vZGUiLCBGQUxTRSwgImhlYWRyb29tIiwgKzAuMDAsCisgICAgICAicHJlLWFtcCIsIC02LjAwLCAiZmFsbGJhY2stZ2FpbiIsICsxLjIzLCBOVUxMKTsKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisKKyAgc2VuZF9lbXB0eV9idWZmZXIgKCk7CisKKyAgdGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdfbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgR1NUX1RBR19BTEJVTV9HQUlOLCArMy43MywgR1NUX1RBR19BTEJVTV9QRUFLLCAxLjAsIE5VTEwpOworICBmYWlsX3VubGVzcyAoc2VuZF90YWdfZXZlbnQgKGVsZW1lbnQsIGdzdF9ldmVudF9uZXdfdGFnICh0YWdfbGlzdCkpID09IE5VTEwpOworICBmYWlsX3VubGVzc19nYWluIChlbGVtZW50LCAtMi4yNyk7ICAgIC8qIHByZS1hbXAgKyBhbGJ1bSBnYWluICovCisKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworCisgIGNsZWFudXBfcmd2b2x1bWUgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2hlYWRyb29tKQoreworICBHc3RFbGVtZW50ICplbGVtZW50ID0gc2V0dXBfcmd2b2x1bWUgKCk7CisgIEdzdFRhZ0xpc3QgKnRhZ19saXN0OworCisgIGdfb2JqZWN0X3NldCAoZWxlbWVudCwgImFsYnVtLW1vZGUiLCBGQUxTRSwgImhlYWRyb29tIiwgKzAuMDAsCisgICAgICAicHJlLWFtcCIsICswLjAwLCAiZmFsbGJhY2stZ2FpbiIsICsxLjIzLCBOVUxMKTsKKyAgc2V0X3BsYXlpbmdfc3RhdGUgKGVsZW1lbnQpOworICBzZW5kX3N0cmVhbV9zdGFydF9ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfY2Fwc19ldmVudCAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisKKyAgc2VuZF9lbXB0eV9idWZmZXIgKCk7CisKKyAgdGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdfbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgR1NUX1RBR19UUkFDS19HQUlOLCArMy41MCwgR1NUX1RBR19UUkFDS19QRUFLLCAxLjAsIE5VTEwpOworICBmYWlsX3VubGVzcyAoc2VuZF90YWdfZXZlbnQgKGVsZW1lbnQsIGdzdF9ldmVudF9uZXdfdGFnICh0YWdfbGlzdCkpID09IE5VTEwpOworICBmYWlsX3VubGVzc190YXJnZXRfZ2FpbiAoZWxlbWVudCwgKzMuNTApOyAgICAgLyogcHJlLWFtcCArIHRyYWNrIGdhaW4gKi8KKyAgZmFpbF91bmxlc3NfcmVzdWx0X2dhaW4gKGVsZW1lbnQsICswLjAwKTsKKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworCisgIHNlbmRfZmx1c2hfZXZlbnRzIChlbGVtZW50KTsKKyAgc2VuZF9zZWdtZW50X2V2ZW50IChlbGVtZW50KTsKKworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJoZWFkcm9vbSIsICsyLjAwLCBOVUxMKTsKKyAgdGFnX2xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3X2VtcHR5ICgpOworICBnc3RfdGFnX2xpc3RfYWRkICh0YWdfbGlzdCwgR1NUX1RBR19NRVJHRV9SRVBMQUNFLAorICAgICAgR1NUX1RBR19UUkFDS19HQUlOLCArOS4xOCwgR1NUX1RBR19UUkFDS19QRUFLLCAwLjY4NzE0OSwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChzZW5kX3RhZ19ldmVudCAoZWxlbWVudCwgZ3N0X2V2ZW50X25ld190YWcgKHRhZ19saXN0KSkgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX3RhcmdldF9nYWluIChlbGVtZW50LCArOS4xOCk7ICAgICAvKiBwcmUtYW1wICsgdHJhY2sgZ2FpbiAqLworICAvKiBSZXN1bHQgaXMgMjAuICogbG9nMTAgKDEuIC8gcGVhaykgKyBoZWFkcm9vbS4gKi8KKyAgZmFpbF91bmxlc3NfcmVzdWx0X2dhaW4gKGVsZW1lbnQsIDUuMjU4OTgxNjIzODMwMzMzNSk7CisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKworICBzZW5kX2ZsdXNoX2V2ZW50cyAoZWxlbWVudCk7CisgIHNlbmRfc2VnbWVudF9ldmVudCAoZWxlbWVudCk7CisKKyAgZ19vYmplY3Rfc2V0IChlbGVtZW50LCAiYWxidW0tbW9kZSIsIFRSVUUsIE5VTEwpOworICB0YWdfbGlzdCA9IGdzdF90YWdfbGlzdF9uZXdfZW1wdHkgKCk7CisgIGdzdF90YWdfbGlzdF9hZGQgKHRhZ19saXN0LCBHU1RfVEFHX01FUkdFX1JFUExBQ0UsCisgICAgICBHU1RfVEFHX0FMQlVNX0dBSU4sICs1LjUwLCBHU1RfVEFHX0FMQlVNX1BFQUssIDEuMCwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChzZW5kX3RhZ19ldmVudCAoZWxlbWVudCwgZ3N0X2V2ZW50X25ld190YWcgKHRhZ19saXN0KSkgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX3RhcmdldF9nYWluIChlbGVtZW50LCArNS41MCk7ICAgICAvKiBwcmUtYW1wICsgYWxidW0gZ2FpbiAqLworICBmYWlsX3VubGVzc19yZXN1bHRfZ2FpbiAoZWxlbWVudCwgKzIuMDApOyAgICAgLyogaGVhZHJvb20gKi8KKyAgc2VuZF9lb3NfZXZlbnQgKGVsZW1lbnQpOworCisgIGNsZWFudXBfcmd2b2x1bWUgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3JlZmVyZW5jZV9sZXZlbCkKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudCA9IHNldHVwX3Jndm9sdW1lICgpOworICBHc3RUYWdMaXN0ICp0YWdfbGlzdDsKKworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsCisgICAgICAiYWxidW0tbW9kZSIsIEZBTFNFLAorICAgICAgImhlYWRyb29tIiwgKzAuMDAsICJwcmUtYW1wIiwgKzAuMDAsICJmYWxsYmFjay1nYWluIiwgKzEuMjMsIE5VTEwpOworICBzZXRfcGxheWluZ19zdGF0ZSAoZWxlbWVudCk7CisKKyAgc2VuZF9zdHJlYW1fc3RhcnRfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX2NhcHNfZXZlbnQgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworCisgIHNlbmRfZW1wdHlfYnVmZmVyICgpOworCisgIHRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZ3N0X3RhZ19saXN0X2FkZCAodGFnX2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgIEdTVF9UQUdfVFJBQ0tfR0FJTiwgMC4wMCwgR1NUX1RBR19UUkFDS19QRUFLLCAwLjIsCisgICAgICBHU1RfVEFHX1JFRkVSRU5DRV9MRVZFTCwgODMuLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHNlbmRfdGFnX2V2ZW50IChlbGVtZW50LCBnc3RfZXZlbnRfbmV3X3RhZyAodGFnX2xpc3QpKSA9PSBOVUxMKTsKKyAgLyogQmVjYXVzZSBvdXIgYXV0aG9yYXRpdmUgcmVmZXJlbmNlIGlzIDg5IGRCLCB3ZSBidW1wIGl0IHVwIGJ5ICs2IGRCLiAqLworICBmYWlsX3VubGVzc19nYWluIChlbGVtZW50LCArNi4wMCk7ICAgIC8qIHByZS1hbXAgKyB0cmFjayBnYWluICovCisgIHNlbmRfZW9zX2V2ZW50IChlbGVtZW50KTsKKworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJhbGJ1bS1tb2RlIiwgVFJVRSwgTlVMTCk7CisKKyAgLyogU2FtZSBhcyBhYm92ZSwgYnV0IHdpdGggYWxidW0gZ2Fpbi4gKi8KKyAgc2VuZF9mbHVzaF9ldmVudHMgKGVsZW1lbnQpOworICBzZW5kX3NlZ21lbnRfZXZlbnQgKGVsZW1lbnQpOworCisgIHRhZ19saXN0ID0gZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKTsKKyAgZ3N0X3RhZ19saXN0X2FkZCAodGFnX2xpc3QsIEdTVF9UQUdfTUVSR0VfUkVQTEFDRSwKKyAgICAgIEdTVF9UQUdfVFJBQ0tfR0FJTiwgMS4yMywgR1NUX1RBR19UUkFDS19QRUFLLCAwLjEsCisgICAgICBHU1RfVEFHX0FMQlVNX0dBSU4sIDAuMDAsIEdTVF9UQUdfQUxCVU1fUEVBSywgMC4yLAorICAgICAgR1NUX1RBR19SRUZFUkVOQ0VfTEVWRUwsIDgzLiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChzZW5kX3RhZ19ldmVudCAoZWxlbWVudCwgZ3N0X2V2ZW50X25ld190YWcgKHRhZ19saXN0KSkgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2dhaW4gKGVsZW1lbnQsICs2LjAwKTsgICAgLyogcHJlLWFtcCArIGFsYnVtIGdhaW4gKi8KKworICBjbGVhbnVwX3Jndm9sdW1lIChlbGVtZW50KTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorcmd2b2x1bWVfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgicmd2b2x1bWUiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ub19idWZmZXIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZXZlbnRzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3NpbXBsZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9mYWxsYmFja19nYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ZhbGxiYWNrX3RyYWNrKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ZhbGxiYWNrX2FsYnVtKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2hlYWRyb29tKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3JlZmVyZW5jZV9sZXZlbCk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChyZ3ZvbHVtZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHAtcGF5bG9hZGluZy5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTUyMjA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwLXBheWxvYWRpbmcuYwpAQCAtMCwwICsxLDE2ODIgQEAKKy8qIEdTdHJlYW1lciBSVFAgcGF5bG9hZGVyIHVuaXQgdGVzdHMKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQgaXRzIHN1YnNpZGFyeSgtaWVzKQorICogICAgICAgICAgICAgICBjb250YWN0OiA8c3RlZmFuLmtvc3RAbm9raWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGhhcm5lc3MuaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9iYXNlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgUkVMRUFTRV9FTEVNRU5UKHgpIGlmKHgpIHtnc3Rfb2JqZWN0X3VucmVmKHgpOyB4ID0gTlVMTDt9CisKKyNkZWZpbmUgTE9PUF9DT1VOVCAxCisKKy8qCisgKiBSVFAgcGlwZWxpbmUgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSByZXF1aXJlZCBlbGVtZW50cy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEVsZW1lbnQgKmFwcHNyYzsKKyAgR3N0RWxlbWVudCAqcnRwcGF5OworICBHc3RFbGVtZW50ICpydHBkZXBheTsKKyAgR3N0RWxlbWVudCAqZmFrZXNpbms7CisgIGNvbnN0IGd1aW50OCAqZnJhbWVfZGF0YTsKKyAgaW50IGZyYW1lX2RhdGFfc2l6ZTsKKyAgaW50IGZyYW1lX2NvdW50OworICBHc3RFdmVudCAqY3VzdG9tX2V2ZW50OworfSBydHBfcGlwZWxpbmU7CisKKy8qCisgKiBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgaW4gdGhlIGNoYWluIGxpc3QgZnVuY3Rpb24gd2hlbiB1c2luZyBidWZmZXIgbGlzdHMKKyAqLworc3RhdGljIGd1aW50IGNoYWluX2xpc3RfYnl0ZXNfcmVjZWl2ZWQ7CisKKy8qCisgKiBDaGFpbiBsaXN0IGZ1bmN0aW9uIGZvciB0ZXN0aW5nIGJ1ZmZlciBsaXN0cworICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgorcnRwX3BpcGVsaW5lX2NoYWluX2xpc3QgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXJMaXN0ICogbGlzdCkKK3sKKyAgZ3VpbnQgaSwgbGVuOworCisgIGZhaWxfaWYgKCFsaXN0KTsKKyAgLyoKKyAgICogQ291bnQgdGhlIHNpemUgb2YgdGhlIHBheWxvYWQgaW4gdGhlIGJ1ZmZlciBsaXN0LgorICAgKi8KKyAgbGVuID0gZ3N0X2J1ZmZlcl9saXN0X2xlbmd0aCAobGlzdCk7CisgIEdTVF9MT0cgKCJsaXN0IGxlbmd0aCAldSIsIGxlbik7CisKKyAgLyogTG9vcCB0aHJvdWdoIGFsbCBncm91cHMgKi8KKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgR3N0QnVmZmVyICpwYXlidWY7CisgICAgR3N0TWVtb3J5ICptZW07CisgICAgZ2ludCBzaXplOworCisgICAgcGF5YnVmID0gZ3N0X2J1ZmZlcl9saXN0X2dldCAobGlzdCwgaSk7CisgICAgLyogb25seSBjb3VudCByZWFsIGRhdGEgd2hpY2ggaXMgZXhwZWN0ZWQgaW4gbGFzdCBtZW1vcnkgYmxvY2sgKi8KKyAgICBHU1RfTE9HICgibl9tZW1vcnkgJWQiLCBnc3RfYnVmZmVyX25fbWVtb3J5IChwYXlidWYpKTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9uX21lbW9yeSAocGF5YnVmKSA+IDEpOworICAgIG1lbSA9IGdzdF9idWZmZXJfZ2V0X21lbW9yeV9yYW5nZSAocGF5YnVmLCBnc3RfYnVmZmVyX25fbWVtb3J5IChwYXlidWYpIC0gMSwKKyAgICAgICAgMSk7CisgICAgc2l6ZSA9IGdzdF9tZW1vcnlfZ2V0X3NpemVzIChtZW0sIE5VTEwsIE5VTEwpOworICAgIGdzdF9tZW1vcnlfdW5yZWYgKG1lbSk7CisgICAgY2hhaW5fbGlzdF9ieXRlc19yZWNlaXZlZCArPSBzaXplOworICAgIEdTVF9MT0cgKCJzaXplICVkLCB0b3RhbCAldSIsIHNpemUsIGNoYWluX2xpc3RfYnl0ZXNfcmVjZWl2ZWQpOworICB9CisgIGdzdF9idWZmZXJfbGlzdF91bnJlZiAobGlzdCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorcnRwX3BpcGVsaW5lX2NoYWluIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIHBhcmVudCwgR3N0QnVmZmVyICogYnVmKQoreworICBHc3RCdWZmZXJMaXN0ICpsaXN0OworCisgIGxpc3QgPSBnc3RfYnVmZmVyX2xpc3RfbmV3X3NpemVkICgxKTsKKyAgZ3N0X2J1ZmZlcl9saXN0X2FkZCAobGlzdCwgYnVmKTsKKyAgcmV0dXJuIHJ0cF9waXBlbGluZV9jaGFpbl9saXN0IChwYWQsIHBhcmVudCwgbGlzdCk7Cit9CisKKy8qCisgKiBSVFAgYnVzIGNhbGxiYWNrLgorICovCitzdGF0aWMgZ2Jvb2xlYW4KK3J0cF9idXNfY2FsbGJhY2sgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIGdwb2ludGVyIGRhdGEpCit7CisgIEdNYWluTG9vcCAqbWFpbmxvb3AgPSAoR01haW5Mb29wICopIGRhdGE7CisKKyAgc3dpdGNoIChHU1RfTUVTU0FHRV9UWVBFIChtZXNzYWdlKSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6CisgICAgeworICAgICAgR0Vycm9yICplcnI7CisKKyAgICAgIGdjaGFyICpkZWJ1ZzsKKworICAgICAgZ2NoYXIgKmVsZW1lbnRfbmFtZTsKKworICAgICAgZWxlbWVudF9uYW1lID0gKG1lc3NhZ2UtPnNyYykgPyBnc3Rfb2JqZWN0X2dldF9uYW1lIChtZXNzYWdlLT5zcmMpIDogTlVMTDsKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtZXNzYWdlLCAmZXJyLCAmZGVidWcpOworICAgICAgZ19wcmludCAoIlxuRXJyb3IgZnJvbSBlbGVtZW50ICVzOiAlc1xuJXNcblxuIiwKKyAgICAgICAgICBHU1RfU1RSX05VTEwgKGVsZW1lbnRfbmFtZSksIGVyci0+bWVzc2FnZSwgKGRlYnVnKSA/IGRlYnVnIDogIiIpOworICAgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgICAgZ19mcmVlIChkZWJ1Zyk7CisgICAgICBnX2ZyZWUgKGVsZW1lbnRfbmFtZSk7CisKKyAgICAgIGZhaWxfaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1lc3NhZ2UpID09IEdTVF9NRVNTQUdFX0VSUk9SKTsKKworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobWFpbmxvb3ApOworICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHU1RfTUVTU0FHRV9FT1M6CisgICAgeworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobWFpbmxvb3ApOworICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgIHsKKyAgICB9CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKgorICogQ3JlYXRlcyBhIFJUUCBwaXBlbGluZSBmb3Igb25lIHRlc3QuCisgKiBAcGFyYW0gZnJhbWVfZGF0YSBQb2ludGVyIHRvIHRoZSBmcmFtZSBkYXRhIHdoaWNoIGlzIHVzZWQgdG8gcGFzcyB0aHJ1IHBheS9kZXBheWxvYWRlcnMuCisgKiBAcGFyYW0gZnJhbWVfZGF0YV9zaXplIEZyYW1lIGRhdGEgc2l6ZSBpbiBieXRlcy4KKyAqIEBwYXJhbSBmcmFtZV9jb3VudCBGcmFtZSBjb3VudC4KKyAqIEBwYXJhbSBmaWx0ZXJjYXBzIENhcHMgZmlsdGVycy4KKyAqIEBwYXJhbSBwYXkgUGF5bG9hZGVyIG5hbWUuCisgKiBAcGFyYW0gZGVwYXkgRGVwYXlsb2FkZXIgbmFtZS4KKyAqIEByZXR1cm4KKyAqIFJldHVybnMgcG9pbnRlciB0byB0aGUgUlRQIHBpcGVsaW5lLgorICogVGhlIHVzZXIgbXVzdCBmcmVlIHRoZSBSVFAgcGlwZWxpbmUgd2hlbiBpdCdzIG5vdCB1c2VkIGFueW1vcmUuCisgKi8KK3N0YXRpYyBydHBfcGlwZWxpbmUgKgorcnRwX3BpcGVsaW5lX2NyZWF0ZSAoY29uc3QgZ3VpbnQ4ICogZnJhbWVfZGF0YSwgaW50IGZyYW1lX2RhdGFfc2l6ZSwKKyAgICBpbnQgZnJhbWVfY291bnQsIGNvbnN0IGNoYXIgKmZpbHRlcmNhcHMsIGNvbnN0IGNoYXIgKnBheSwgY29uc3QgY2hhciAqZGVwYXkpCit7CisgIGdjaGFyICpwaXBlbGluZV9uYW1lOworICBydHBfcGlwZWxpbmUgKnA7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycy4gKi8KKyAgaWYgKCFmcmFtZV9kYXRhIHx8ICFwYXkgfHwgIWRlcGF5KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBSVFAgcGlwZWxpbmUuICovCisgIHAgPSAocnRwX3BpcGVsaW5lICopIG1hbGxvYyAoc2l6ZW9mIChydHBfcGlwZWxpbmUpKTsKKworICBwLT5mcmFtZV9kYXRhID0gZnJhbWVfZGF0YTsKKyAgcC0+ZnJhbWVfZGF0YV9zaXplID0gZnJhbWVfZGF0YV9zaXplOworICBwLT5mcmFtZV9jb3VudCA9IGZyYW1lX2NvdW50OworICBwLT5jdXN0b21fZXZlbnQgPSBOVUxMOworCisgIC8qIENyZWF0ZSBlbGVtZW50cy4gKi8KKyAgcGlwZWxpbmVfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoIiVzLSVzLXBpcGVsaW5lIiwgcGF5LCBkZXBheSk7CisgIHAtPnBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAocGlwZWxpbmVfbmFtZSk7CisgIGdfZnJlZSAocGlwZWxpbmVfbmFtZSk7CisgIHAtPmFwcHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImFwcHNyYyIsIE5VTEwpOworICBwLT5ydHBwYXkgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKHBheSwgTlVMTCk7CisgIHAtPnJ0cGRlcGF5ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlIChkZXBheSwgTlVMTCk7CisgIHAtPmZha2VzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCBOVUxMKTsKKworICAvKiBPbmUgb3IgbW9yZSBlbGVtZW50cyBhcmUgbm90IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IG9yIGZhaWxlZCB0byBjcmVhdGUgcD8gKi8KKyAgaWYgKCFwLT5waXBlbGluZSB8fCAhcC0+YXBwc3JjIHx8ICFwLT5ydHBwYXkgfHwgIXAtPnJ0cGRlcGF5IHx8ICFwLT5mYWtlc2luaykgeworICAgIC8qIFJlbGVhc2UgY3JlYXRlZCBlbGVtZW50cy4gKi8KKyAgICBSRUxFQVNFX0VMRU1FTlQgKHAtPnBpcGVsaW5lKTsKKyAgICBSRUxFQVNFX0VMRU1FTlQgKHAtPmFwcHNyYyk7CisgICAgUkVMRUFTRV9FTEVNRU5UIChwLT5ydHBwYXkpOworICAgIFJFTEVBU0VfRUxFTUVOVCAocC0+cnRwZGVwYXkpOworICAgIFJFTEVBU0VfRUxFTUVOVCAocC0+ZmFrZXNpbmspOworCisgICAgLyogUmVsZWFzZSBhbGxvY2F0ZWQgbWVtb3J5LiAqLworICAgIGZyZWUgKHApOworCisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvKiBTZXQgc3JjIHByb3BlcnRpZXMuICovCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoZmlsdGVyY2Fwcyk7CisgIGdfb2JqZWN0X3NldCAocC0+YXBwc3JjLCAiZG8tdGltZXN0YW1wIiwgVFJVRSwgImNhcHMiLCBjYXBzLAorICAgICAgImZvcm1hdCIsIEdTVF9GT1JNQVRfVElNRSwgTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAvKiBBZGQgZWxlbWVudHMgdG8gdGhlIHBpcGVsaW5lLiAqLworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocC0+cGlwZWxpbmUpLCBwLT5hcHBzcmMpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocC0+cGlwZWxpbmUpLCBwLT5ydHBwYXkpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocC0+cGlwZWxpbmUpLCBwLT5ydHBkZXBheSk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwLT5waXBlbGluZSksIHAtPmZha2VzaW5rKTsKKworICAvKiBMaW5rIGVsZW1lbnRzLiAqLworICBnc3RfZWxlbWVudF9saW5rIChwLT5hcHBzcmMsIHAtPnJ0cHBheSk7CisgIGdzdF9lbGVtZW50X2xpbmsgKHAtPnJ0cHBheSwgcC0+cnRwZGVwYXkpOworICBnc3RfZWxlbWVudF9saW5rIChwLT5ydHBkZXBheSwgcC0+ZmFrZXNpbmspOworCisgIHJldHVybiBwOworfQorCisvKgorICogRGVzdHJveXMgdGhlIFJUUCBwaXBlbGluZS4KKyAqIEBwYXJhbSBwIFBvaW50ZXIgdG8gdGhlIFJUUCBwaXBlbGluZS4KKyAqLworc3RhdGljIHZvaWQKK3J0cF9waXBlbGluZV9kZXN0cm95IChydHBfcGlwZWxpbmUgKiBwKQoreworICAvKiBDaGVjayBwYXJhbWV0ZXJzLiAqLworICBpZiAocCA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogUmVsZWFzZSBwaXBlbGluZS4gKi8KKyAgUkVMRUFTRV9FTEVNRU5UIChwLT5waXBlbGluZSk7CisKKyAgLyogUmVsZWFzZSBhbGxvY2F0ZWQgbWVtb3J5LiAqLworICBmcmVlIChwKTsKK30KKworc3RhdGljIEdzdFBhZFByb2JlUmV0dXJuCitwYXlfZXZlbnRfcHJvYmVfY2IgKEdzdFBhZCAqIHBhZCwgR3N0UGFkUHJvYmVJbmZvICogaW5mbywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBydHBfcGlwZWxpbmUgKnAgPSAocnRwX3BpcGVsaW5lICopIHVzZXJfZGF0YTsKKyAgR3N0RXZlbnQgKmV2ZW50ID0gR1NUX1BBRF9QUk9CRV9JTkZPX0RBVEEgKGluZm8pOworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9DVVNUT01fRE9XTlNUUkVBTSkgeworICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqczAgPSBnc3RfZXZlbnRfZ2V0X3N0cnVjdHVyZSAocC0+Y3VzdG9tX2V2ZW50KTsKKyAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnMxID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKGV2ZW50KTsKKyAgICBpZiAoZ3N0X3N0cnVjdHVyZV9pc19lcXVhbCAoczAsIHMxKSkgeworICAgICAgcmV0dXJuIEdTVF9QQURfUFJPQkVfRFJPUDsKKyAgICB9CisgIH0KKworICByZXR1cm4gR1NUX1BBRF9QUk9CRV9PSzsKK30KKworc3RhdGljIEdzdFBhZFByb2JlUmV0dXJuCitkZXBheV9ldmVudF9wcm9iZV9jYiAoR3N0UGFkICogcGFkLCBHc3RQYWRQcm9iZUluZm8gKiBpbmZvLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIHJ0cF9waXBlbGluZSAqcCA9IChydHBfcGlwZWxpbmUgKikgdXNlcl9kYXRhOworICBHc3RFdmVudCAqZXZlbnQgPSBHU1RfUEFEX1BST0JFX0lORk9fREFUQSAoaW5mbyk7CisKKyAgaWYgKEdTVF9FVkVOVF9UWVBFIChldmVudCkgPT0gR1NUX0VWRU5UX0NVU1RPTV9ET1dOU1RSRUFNKSB7CisgICAgY29uc3QgR3N0U3RydWN0dXJlICpzMCA9IGdzdF9ldmVudF9nZXRfc3RydWN0dXJlIChwLT5jdXN0b21fZXZlbnQpOworICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqczEgPSBnc3RfZXZlbnRfZ2V0X3N0cnVjdHVyZSAoZXZlbnQpOworICAgIGlmIChnc3Rfc3RydWN0dXJlX2lzX2VxdWFsIChzMCwgczEpKSB7CisgICAgICBnc3RfZXZlbnRfdW5yZWYgKHAtPmN1c3RvbV9ldmVudCk7CisgICAgICBwLT5jdXN0b21fZXZlbnQgPSBOVUxMOworICAgIH0KKyAgfQorCisgIHJldHVybiBHU1RfUEFEX1BST0JFX09LOworfQorCisvKgorICogUnVucyB0aGUgUlRQIHBpcGVsaW5lLgorICogQHBhcmFtIHAgUG9pbnRlciB0byB0aGUgUlRQIHBpcGVsaW5lLgorICovCitzdGF0aWMgdm9pZAorcnRwX3BpcGVsaW5lX3J1biAocnRwX3BpcGVsaW5lICogcCkKK3sKKyAgR3N0Rmxvd1JldHVybiBmbG93X3JldDsKKyAgR01haW5Mb29wICptYWlubG9vcCA9IE5VTEw7CisgIEdzdEJ1cyAqYnVzOworICBnaW50IGksIGo7CisKKyAgLyogQ2hlY2sgcGFyYW1ldGVycy4gKi8KKyAgaWYgKHAgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8qIENyZWF0ZSBtYWlubG9vcC4gKi8KKyAgbWFpbmxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKyAgaWYgKCFtYWlubG9vcCkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8qIEFkZCBidXMgY2FsbGJhY2suICovCisgIGJ1cyA9IGdzdF9waXBlbGluZV9nZXRfYnVzIChHU1RfUElQRUxJTkUgKHAtPnBpcGVsaW5lKSk7CisKKyAgZ3N0X2J1c19hZGRfd2F0Y2ggKGJ1cywgcnRwX2J1c19jYWxsYmFjaywgKGdwb2ludGVyKSBtYWlubG9vcCk7CisKKyAgLyogU2V0IHBpcGVsaW5lIHRvIFBMQVlJTkcuICovCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocC0+cGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICAvKiBQdXNoIGN1c3RvbSBldmVudCBpbnRvIHRoZSBwaXBlbGluZSAqLworICBpZiAocC0+Y3VzdG9tX2V2ZW50KSB7CisgICAgR3N0UGFkICpzcmNwYWQ7CisKKyAgICAvKiBJbnN0YWxsIGEgcHJvYmUgdG8gZHJvcCB0aGUgZXZlbnQgYWZ0ZXIgaXQgYmVpbmcgc2VyaWFsaXplZCAqLworICAgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChwLT5ydHBwYXksICJzcmMiKTsKKyAgICBnc3RfcGFkX2FkZF9wcm9iZSAoc3JjcGFkLCBHU1RfUEFEX1BST0JFX1RZUEVfRVZFTlRfRE9XTlNUUkVBTSwKKyAgICAgICAgcGF5X2V2ZW50X3Byb2JlX2NiLCBwLCBOVUxMKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworCisgICAgLyogSW5zdGFsbCBhIHByb2JlIHRvIHRyYWNlIHRoZSBkZXNlcmlhbGl6ZWQgZXZlbnQgYWZ0ZXIgZGVwYXlsb2FkaW5nICovCisgICAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHAtPnJ0cGRlcGF5LCAic3JjIik7CisgICAgZ3N0X3BhZF9hZGRfcHJvYmUgKHNyY3BhZCwgR1NUX1BBRF9QUk9CRV9UWVBFX0VWRU5UX0RPV05TVFJFQU0sCisgICAgICAgIGRlcGF5X2V2ZW50X3Byb2JlX2NiLCBwLCBOVUxMKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworICAgIC8qIFNlbmQgdGhlIGV2ZW50ICovCisgICAgZ3N0X2VsZW1lbnRfc2VuZF9ldmVudCAocC0+YXBwc3JjLCBnc3RfZXZlbnRfcmVmIChwLT5jdXN0b21fZXZlbnQpKTsKKyAgfQorCisgIC8qIFB1c2ggZGF0YSBpbnRvIHRoZSBwaXBlbGluZSAqLworICBmb3IgKGkgPSAwOyBpIDwgTE9PUF9DT1VOVDsgaSsrKSB7CisgICAgY29uc3QgZ3VpbnQ4ICpkYXRhID0gcC0+ZnJhbWVfZGF0YTsKKworICAgIGZvciAoaiA9IDA7IGogPCBwLT5mcmFtZV9jb3VudDsgaisrKSB7CisgICAgICBHc3RCdWZmZXIgKmJ1ZjsKKworICAgICAgYnVmID0KKyAgICAgICAgICBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwKKyAgICAgICAgICAoZ3VpbnQ4ICopIGRhdGEsIHAtPmZyYW1lX2RhdGFfc2l6ZSwgMCwgcC0+ZnJhbWVfZGF0YV9zaXplLCBOVUxMLAorICAgICAgICAgIE5VTEwpOworCisgICAgICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHAtPmFwcHNyYywgInB1c2gtYnVmZmVyIiwgYnVmLCAmZmxvd19yZXQpOworICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZmxvd19yZXQsIEdTVF9GTE9XX09LKTsKKyAgICAgIGRhdGEgKz0gcC0+ZnJhbWVfZGF0YV9zaXplOworCisgICAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIH0KKyAgfQorCisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAocC0+YXBwc3JjLCAiZW5kLW9mLXN0cmVhbSIsICZmbG93X3JldCk7CisKKyAgLyogUnVuIG1haW5sb29wLiAqLworICBnX21haW5fbG9vcF9ydW4gKG1haW5sb29wKTsKKworICAvKiBTZXQgcGlwZWxpbmUgdG8gTlVMTC4gKi8KKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwLT5waXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworCisgIC8qIFJlbGVhc2UgbWFpbmxvb3AuICovCisgIGdfbWFpbl9sb29wX3VucmVmIChtYWlubG9vcCk7CisKKyAgZ3N0X2J1c19yZW1vdmVfd2F0Y2ggKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgZmFpbF9pZiAocC0+Y3VzdG9tX2V2ZW50KTsKK30KKworLyoKKyAqIEVuYWJsZXMgYnVmZmVyIGxpc3RzIGFuZCBhZGRzIGEgY2hhaW5fbGlzdF9mdW5jdGlvbiB0byB0aGUgZGVwYXlsb2FkZXIuCisgKiBAcGFyYW0gcCBQb2ludGVyIHRvIHRoZSBSVFAgcGlwZWxpbmUuCisgKi8KK3N0YXRpYyB2b2lkCitydHBfcGlwZWxpbmVfZW5hYmxlX2xpc3RzIChydHBfcGlwZWxpbmUgKiBwKQoreworICBHc3RQYWQgKnBhZDsKKworICAvKiBBZGQgY2hhaW4gbGlzdCBmdW5jdGlvbiBmb3IgdGhlIGJ1ZmZlciBsaXN0IHRlc3RzICovCisgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChwLT5ydHBkZXBheSwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fbGlzdF9mdW5jdGlvbiAocGFkLAorICAgICAgR1NUX0RFQlVHX0ZVTkNQVFIgKHJ0cF9waXBlbGluZV9jaGFpbl9saXN0KSk7CisgIC8qIC4uIHRvIHNhdGlzZnkgdGhpcyBzaWxseSB0ZXN0IGNvZGUgaW4gY2FzZSBzb21lb25lIGRhcmVzIHB1c2ggYSBidWZmZXIgKi8KKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKHBhZCwgR1NUX0RFQlVHX0ZVTkNQVFIgKHJ0cF9waXBlbGluZV9jaGFpbikpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworfQorCisvKgorICogQ3JlYXRlcyB0aGUgUlRQIHBpcGVsaW5lIGFuZCBydW5zIHRoZSB0ZXN0IHVzaW5nIHRoZSBwaXBlbGluZS4KKyAqIEBwYXJhbSBmcmFtZV9kYXRhIFBvaW50ZXIgdG8gdGhlIGZyYW1lIGRhdGEgd2hpY2ggaXMgdXNlZCB0byBwYXNzIHRocnUgcGF5L2RlcGF5bG9hZGVycy4KKyAqIEBwYXJhbSBmcmFtZV9kYXRhX3NpemUgRnJhbWUgZGF0YSBzaXplIGluIGJ5dGVzLgorICogQHBhcmFtIGZyYW1lX2NvdW50IEZyYW1lIGNvdW50LgorICogQHBhcmFtIGZpbHRlcmNhcHMgQ2FwcyBmaWx0ZXJzLgorICogQHBhcmFtIHBheSBQYXlsb2FkZXIgbmFtZS4KKyAqIEBwYXJhbSBkZXBheSBEZXBheWxvYWRlciBuYW1lLgorICogQGJ5dGVzX3NlbnQgYnl0ZXMgdGhhdCB3aWxsIGJlIHNlbnQsIHVzZWQgd2hlbiB0ZXN0aW5nIGJ1ZmZlciBsaXN0cworICogQG10dV9zaXplIHNldCBtdHUgc2l6ZSB3aGVuIHRlc3RpbmcgbGlzdHMKKyAqIEB1c2VfbGlzdHMgZW5hYmxlIGJ1ZmZlciBsaXN0cworICovCitzdGF0aWMgdm9pZAorcnRwX3BpcGVsaW5lX3Rlc3QgKGNvbnN0IGd1aW50OCAqIGZyYW1lX2RhdGEsIGludCBmcmFtZV9kYXRhX3NpemUsCisgICAgaW50IGZyYW1lX2NvdW50LCBjb25zdCBjaGFyICpmaWx0ZXJjYXBzLCBjb25zdCBjaGFyICpwYXksIGNvbnN0IGNoYXIgKmRlcGF5LAorICAgIGd1aW50IGJ5dGVzX3NlbnQsIGd1aW50IG10dV9zaXplLCBnYm9vbGVhbiB1c2VfbGlzdHMpCit7CisgIC8qIENyZWF0ZSBSVFAgcGlwZWxpbmUuICovCisgIHJ0cF9waXBlbGluZSAqcCA9CisgICAgICBydHBfcGlwZWxpbmVfY3JlYXRlIChmcmFtZV9kYXRhLCBmcmFtZV9kYXRhX3NpemUsIGZyYW1lX2NvdW50LCBmaWx0ZXJjYXBzLAorICAgICAgcGF5LCBkZXBheSk7CisKKyAgaWYgKHAgPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8qIHNldCBtdHUgc2l6ZSBpZiBuZWVkZWQgKi8KKyAgaWYgKG10dV9zaXplID4gMCkgeworICAgIGdfb2JqZWN0X3NldCAocC0+cnRwcGF5LCAibXR1IiwgbXR1X3NpemUsIE5VTEwpOworICB9CisKKyAgaWYgKHVzZV9saXN0cykgeworICAgIHJ0cF9waXBlbGluZV9lbmFibGVfbGlzdHMgKHApOworICAgIGNoYWluX2xpc3RfYnl0ZXNfcmVjZWl2ZWQgPSAwOworICB9CisKKyAgLyogUnVuIFJUUCBwaXBlbGluZS4gKi8KKyAgcnRwX3BpcGVsaW5lX3J1biAocCk7CisKKyAgLyogRGVzdHJveSBSVFAgcGlwZWxpbmUuICovCisgIHJ0cF9waXBlbGluZV9kZXN0cm95IChwKTsKKworICBpZiAodXNlX2xpc3RzKSB7CisgICAgLyogJ25leHQgTkFMJyBpbmRpY2F0b3IgaXMgNCBieXRlcyAqLworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGNoYWluX2xpc3RfYnl0ZXNfcmVjZWl2ZWQsIGJ5dGVzX3NlbnQgKiBMT09QX0NPVU5UKTsKKyAgfQorfQorCitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9pbGJjX2ZyYW1lX2RhdGFbXSA9CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgaW50IHJ0cF9pbGJjX2ZyYW1lX2RhdGFfc2l6ZSA9IDIwOworCitzdGF0aWMgaW50IHJ0cF9pbGJjX2ZyYW1lX2NvdW50ID0gMTsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9pbGJjKQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2lsYmNfZnJhbWVfZGF0YSwgcnRwX2lsYmNfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX2lsYmNfZnJhbWVfY291bnQsICJhdWRpby94LWlMQkMsbW9kZT0yMCIsICJydHBpbGJjcGF5IiwKKyAgICAgICJydHBpbGJjZGVwYXkiLCAwLCAwLCBGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKK3N0YXRpYyBjb25zdCBndWludDggcnRwX2dzbV9mcmFtZV9kYXRhW10gPQorICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIGludCBydHBfZ3NtX2ZyYW1lX2RhdGFfc2l6ZSA9IDIwOworCitzdGF0aWMgaW50IHJ0cF9nc21fZnJhbWVfY291bnQgPSAxOworCitHU1RfU1RBUlRfVEVTVCAocnRwX2dzbSkKK3sKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9nc21fZnJhbWVfZGF0YSwgcnRwX2dzbV9mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfZ3NtX2ZyYW1lX2NvdW50LCAiYXVkaW8veC1nc20scmF0ZT04MDAwLGNoYW5uZWxzPTEiLCAicnRwZ3NtcGF5IiwKKyAgICAgICJydHBnc21kZXBheSIsIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfYW1yX2ZyYW1lX2RhdGFbXSA9CisgICAgeyAweDNjLCAweDI0LCAweDAzLCAweGIzLCAweDQ4LCAweDEwLCAweDY4LCAweDQ2LCAweDZjLCAweGVjLCAweDAzLAorICAweDdhLCAweDM3LCAweDE2LCAweDQxLCAweDQxLCAweGMwLCAweDAwLCAweDBkLCAweGNkLCAweDEyLCAweGVkLAorICAweGFkLCAweDgwLCAweDAwLCAweDAwLCAweDExLCAweDMxLCAweDAwLCAweDAwLCAweDBkLCAweGEwCit9OworCitzdGF0aWMgaW50IHJ0cF9hbXJfZnJhbWVfZGF0YV9zaXplID0gMzI7CisKK3N0YXRpYyBpbnQgcnRwX2Ftcl9mcmFtZV9jb3VudCA9IDE7CisKK0dTVF9TVEFSVF9URVNUIChydHBfYW1yKQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2Ftcl9mcmFtZV9kYXRhLCBydHBfYW1yX2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9hbXJfZnJhbWVfY291bnQsICJhdWRpby9BTVIsY2hhbm5lbHM9MSxyYXRlPTgwMDAiLCAicnRwYW1ycGF5IiwKKyAgICAgICJydHBhbXJkZXBheSIsIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfcGNtYV9mcmFtZV9kYXRhW10gPQorICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIGludCBydHBfcGNtYV9mcmFtZV9kYXRhX3NpemUgPSAyMDsKKworc3RhdGljIGludCBydHBfcGNtYV9mcmFtZV9jb3VudCA9IDE7CisKK0dTVF9TVEFSVF9URVNUIChydHBfcGNtYSkKK3sKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9wY21hX2ZyYW1lX2RhdGEsIHJ0cF9wY21hX2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9wY21hX2ZyYW1lX2NvdW50LCAiYXVkaW8veC1hbGF3LGNoYW5uZWxzPTEscmF0ZT04MDAwIiwgInJ0cHBjbWFwYXkiLAorICAgICAgInJ0cHBjbWFkZXBheSIsIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfcGNtdV9mcmFtZV9kYXRhW10gPQorICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIGludCBydHBfcGNtdV9mcmFtZV9kYXRhX3NpemUgPSAyMDsKKworc3RhdGljIGludCBydHBfcGNtdV9mcmFtZV9jb3VudCA9IDE7CisKK0dTVF9TVEFSVF9URVNUIChydHBfcGNtdSkKK3sKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9wY211X2ZyYW1lX2RhdGEsIHJ0cF9wY211X2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9wY211X2ZyYW1lX2NvdW50LCAiYXVkaW8veC1tdWxhdyxjaGFubmVscz0xLHJhdGU9ODAwMCIsICJydHBwY211cGF5IiwKKyAgICAgICJydHBwY211ZGVwYXkiLCAwLCAwLCBGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKK3N0YXRpYyBjb25zdCBndWludDggcnRwX21wYV9mcmFtZV9kYXRhW10gPQorICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIGludCBydHBfbXBhX2ZyYW1lX2RhdGFfc2l6ZSA9IDIwOworCitzdGF0aWMgaW50IHJ0cF9tcGFfZnJhbWVfY291bnQgPSAxOworCitHU1RfU1RBUlRfVEVTVCAocnRwX21wYSkKK3sKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9tcGFfZnJhbWVfZGF0YSwgcnRwX21wYV9mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfbXBhX2ZyYW1lX2NvdW50LCAiYXVkaW8vbXBlZyxtcGVndmVyc2lvbj0xIiwgInJ0cG1wYXBheSIsCisgICAgICAicnRwbXBhZGVwYXkiLCAwLCAwLCBGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfaDI2MV9mcmFtZV9kYXRhW10gPSB7CisgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4NGMsIDB4NDAsIDB4MDAsCisgIDB4MTUsIDB4MTAsCit9OworCitzdGF0aWMgaW50IHJ0cF9oMjYxX2ZyYW1lX2RhdGFfc2l6ZSA9IDE0Oworc3RhdGljIGludCBydHBfaDI2MV9mcmFtZV9jb3VudCA9IDE7CisKK0dTVF9TVEFSVF9URVNUIChydHBfaDI2MSkKK3sKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9oMjYxX2ZyYW1lX2RhdGEsIHJ0cF9oMjYxX2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9oMjYxX2ZyYW1lX2NvdW50LCAidmlkZW8veC1oMjYxIiwgInJ0cGgyNjFwYXkiLCAicnRwaDI2MWRlcGF5IiwKKyAgICAgIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9oMjYzX2ZyYW1lX2RhdGFbXSA9CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgaW50IHJ0cF9oMjYzX2ZyYW1lX2RhdGFfc2l6ZSA9IDIwOworCitzdGF0aWMgaW50IHJ0cF9oMjYzX2ZyYW1lX2NvdW50ID0gMTsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9oMjYzKQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2gyNjNfZnJhbWVfZGF0YSwgcnRwX2gyNjNfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX2gyNjNfZnJhbWVfY291bnQsCisgICAgICAidmlkZW8veC1oMjYzLHZhcmlhbnQ9KHN0cmluZylpdHUsaDI2M3ZlcnNpb249aDI2MyIsCisgICAgICAicnRwaDI2M3BheSIsICJydHBoMjYzZGVwYXkiLCAwLCAwLCBGQUxTRSk7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfaDI2M19mcmFtZV9kYXRhLCBydHBfaDI2M19mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfaDI2M19mcmFtZV9jb3VudCwKKyAgICAgICJ2aWRlby94LWgyNjMsdmFyaWFudD0oc3RyaW5nKWl0dSxoMjYzdmVyc2lvbj1oMjYzLHdpZHRoPTEwLGhlaWdodD0yMCIsCisgICAgICAicnRwaDI2M3BheSIsICJydHBoMjYzZGVwYXkiLCAwLCAwLCBGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKK3N0YXRpYyBjb25zdCBndWludDggcnRwX2gyNjNwX2ZyYW1lX2RhdGFbXSA9CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgaW50IHJ0cF9oMjYzcF9mcmFtZV9kYXRhX3NpemUgPSAyMDsKKworc3RhdGljIGludCBydHBfaDI2M3BfZnJhbWVfY291bnQgPSAxOworCitHU1RfU1RBUlRfVEVTVCAocnRwX2gyNjNwKQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2gyNjNwX2ZyYW1lX2RhdGEsIHJ0cF9oMjYzcF9mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfaDI2M3BfZnJhbWVfY291bnQsICJ2aWRlby94LWgyNjMsdmFyaWFudD0oc3RyaW5nKWl0dSwiCisgICAgICAiaDI2M3ZlcnNpb249KHN0cmluZyloMjYzIiwgInJ0cGgyNjNwcGF5IiwgInJ0cGgyNjNwZGVwYXkiLCAwLCAwLCBGQUxTRSk7CisKKyAgLyogcGF5bG9hZGVyIHNob3VsZCBhY2NlcHQgYW55IGlucHV0IHRoYXQgbWF0Y2hlcyB0aGUgdGVtcGxhdGUgY2FwcworICAgKiBpZiB0aGVyZSdzIGp1c3QgYSB1ZHBzaW5rIG9yIGZha2VzaW5rIGRvd25zdHJlYW0gKi8KKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9oMjYzcF9mcmFtZV9kYXRhLCBydHBfaDI2M3BfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX2gyNjNwX2ZyYW1lX2NvdW50LCAidmlkZW8veC1oMjYzLHZhcmlhbnQ9KHN0cmluZylpdHUsIgorICAgICAgImgyNjN2ZXJzaW9uPShzdHJpbmcpaDI2MyIsICJydHBoMjYzcHBheSIsICJpZGVudGl0eSIsIDAsIDAsIEZBTFNFKTsKKworICAvKiBkZWZhdWx0IG91dHB1dCBvZiBhdmVuY19oMjYzcCAqLworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2gyNjNwX2ZyYW1lX2RhdGEsIHJ0cF9oMjYzcF9mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfaDI2M3BfZnJhbWVfY291bnQsICJ2aWRlby94LWgyNjMsdmFyaWFudD0oc3RyaW5nKWl0dSwiCisgICAgICAiaDI2M3ZlcnNpb249KHN0cmluZyloMjYzcCwgYW5uZXgtZj0oYm9vbGVhbil0cnVlLCAiCisgICAgICAiYW5uZXgtaj0oYm9vbGVhbil0cnVlLCBhbm5leC1pPShib29sZWFuKXRydWUsIGFubmV4LXQ9KGJvb2xlYW4pdHJ1ZSIsCisgICAgICAicnRwaDI2M3BwYXkiLCAiaWRlbnRpdHkiLCAwLCAwLCBGQUxTRSk7CisKKyAgLyogcGF5ICEgZGVwYXkgc2hvdWxkIGFsc28gd29yayB3aXRoIGFueSBpbnB1dCAqLworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2gyNjNwX2ZyYW1lX2RhdGEsIHJ0cF9oMjYzcF9mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfaDI2M3BfZnJhbWVfY291bnQsICJ2aWRlby94LWgyNjMsdmFyaWFudD0oc3RyaW5nKWl0dSwiCisgICAgICAiaDI2M3ZlcnNpb249KHN0cmluZyloMjYzcCwgYW5uZXgtZj0oYm9vbGVhbil0cnVlLCAiCisgICAgICAiYW5uZXgtaj0oYm9vbGVhbil0cnVlLCBhbm5leC1pPShib29sZWFuKXRydWUsIGFubmV4LXQ9KGJvb2xlYW4pdHJ1ZSIsCisgICAgICAicnRwaDI2M3BwYXkiLCAicnRwaDI2M3BkZXBheSIsIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfaDI2NF9mcmFtZV9kYXRhW10gPQorICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIGludCBydHBfaDI2NF9mcmFtZV9kYXRhX3NpemUgPSAyMDsKKworc3RhdGljIGludCBydHBfaDI2NF9mcmFtZV9jb3VudCA9IDE7CisKK0dTVF9TVEFSVF9URVNUIChydHBfaDI2NCkKK3sKKyAgLyogRklYTUUgMC4xMTogZnVsbHkgc3BlY2lmeSBoMjY0IGNhcHMgKGFuZCBtYWtlIHBheWxvYWRlciBjaGVjaykgKi8KKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9oMjY0X2ZyYW1lX2RhdGEsIHJ0cF9oMjY0X2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9oMjY0X2ZyYW1lX2NvdW50LAorICAgICAgInZpZGVvL3gtaDI2NCxzdHJlYW0tZm9ybWF0PShzdHJpbmcpYnl0ZS1zdHJlYW0sYWxpZ25tZW50PShzdHJpbmcpbmFsIiwKKyAgICAgICJydHBoMjY0cGF5IiwgInJ0cGgyNjRkZXBheSIsIDAsIDAsIEZBTFNFKTsKKworICAvKiBjb25maWctaW50ZXJ2YWwgcHJvcGVydHkgdXNlZCB0byBiZSBvZiB1aW50IHR5cGUsIHdhcyBjaGFuZ2VkIHRvIGludCwKKyAgICogbWFrZSBzdXJlIG9sZCBHVmFsdWUgc3R1ZmYgc3RpbGwgd29ya3MgKi8KKyAgeworICAgIEdWYWx1ZSB2YWwgPSBHX1ZBTFVFX0lOSVQ7CisgICAgR3N0RWxlbWVudCAqcnRwaDI2NHBheTsKKyAgICBHUGFyYW1TcGVjICpwc3BlYzsKKworCisgICAgcnRwaDI2NHBheSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cGgyNjRwYXkiLCBOVUxMKTsKKyAgICBwc3BlYyA9IGdfb2JqZWN0X2NsYXNzX2ZpbmRfcHJvcGVydHkgKEdfT0JKRUNUX0dFVF9DTEFTUyAocnRwaDI2NHBheSksCisgICAgICAgICJjb25maWctaW50ZXJ2YWwiKTsKKyAgICBmYWlsX3VubGVzcyAocHNwZWMtPnZhbHVlX3R5cGUgPT0gR19UWVBFX0lOVCk7CisgICAgZ192YWx1ZV9pbml0ICgmdmFsLCBHX1RZUEVfVUlOVCk7CisgICAgZ192YWx1ZV9zZXRfdWludCAoJnZhbCwgMTApOworICAgIGdfb2JqZWN0X3NldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKHJ0cGgyNjRwYXkpLCAiY29uZmlnLWludGVydmFsIiwgJnZhbCk7CisgICAgZ192YWx1ZV9zZXRfdWludCAoJnZhbCwgMCk7CisgICAgZ19vYmplY3RfZ2V0X3Byb3BlcnR5IChHX09CSkVDVCAocnRwaDI2NHBheSksICJjb25maWctaW50ZXJ2YWwiLCAmdmFsKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgxMCwgZ192YWx1ZV9nZXRfdWludCAoJnZhbCkpOworICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHJ0cGgyNjRwYXkpLCAiY29uZmlnLWludGVydmFsIiwgLTEsIE5VTEwpOworICAgIGdfb2JqZWN0X2dldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKHJ0cGgyNjRwYXkpLCAiY29uZmlnLWludGVydmFsIiwgJnZhbCk7CisgICAgZmFpbF91bmxlc3MgKGdfdmFsdWVfZ2V0X3VpbnQgKCZ2YWwpID09IEdfTUFYVUlOVCk7CisgICAgZ192YWx1ZV91bnNldCAoJnZhbCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocnRwaDI2NHBheSk7CisgIH0KK30KKworR1NUX0VORF9URVNUOworCisvKiBIMjY0IGRhdGEgZ2VuZXJhdGVkIHdpdGg6CisgKiB2aWRlb3Rlc3RzcmMgcGF0dGVybj1ibGFjayAhIHZpZGVvL3gtcmF3LHdpZHRoPTE2LGhlaWdodD0xNiAhIG9wZW5oMjY0ZW5jICovCitzdGF0aWMgY29uc3QgZ3VpbnQ4IGgyNjRfMTZ4MTZfYmxhY2tfYnNbXSA9IHsKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NywgMHg0MiwgMHhkMCwgMHgwYiwKKyAgMHg4YywgMHg4ZCwgMHg0ZSwgMHg0MCwgMHgzYywgMHgyMiwgMHgxMSwgMHhhOCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2OCwgMHhjZSwgMHgzYywgMHg4MCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NSwgMHhiOCwgMHgwMCwgMHgwNCwKKyAgMHgwMCwgMHgwMCwgMHgwOSwgMHhlNCwgMHhjNSwgMHgwMCwgMHgwMSwgMHgxOSwKKyAgMHhmYworfTsKKworc3RhdGljIEdzdFNhbXBsZSAqCitydHBfaDI2NGRlcGF5X3J1biAoY29uc3QgZ2NoYXIgKiBzdHJlYW1fZm9ybWF0KQoreworICBHc3RIYXJuZXNzICpoOworICBHc3RTYW1wbGUgKnNhbXBsZTsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdEV2ZW50ICplOworICBHc3RDYXBzICpvdXRfY2FwczsKKyAgR3N0Q2FwcyAqaW5fY2FwczsKKyAgZ2Jvb2xlYW4gc2Vlbl9jYXBzID0gRkFMU0U7CisgIGdzaXplIHNpemU7CisKKyAgaCA9IGdzdF9oYXJuZXNzX25ld19wYXJzZSAoInJ0cGgyNjRwYXkgISBydHBoMjY0ZGVwYXkiKTsKKworICAvKiBPdXIgaW5wdXQgZGF0YSBpcyBpbiBieXRlLXN0cmVhbSBmb3JtYXQgKG5vdCB0aGF0IGl0IG1hdHRlcnMpICovCisgIGluX2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgidmlkZW8veC1oMjY0IiwKKyAgICAgICJzdHJlYW0tZm9ybWF0IiwgR19UWVBFX1NUUklORywgImJ5dGUtc3RyZWFtIiwKKyAgICAgICJhbGlnbm1lbnQiLCBHX1RZUEVfU1RSSU5HLCAiYXUiLAorICAgICAgInByb2ZpbGUiLCBHX1RZUEVfU1RSSU5HLCAiYmFzZWxpbmUiLAorICAgICAgIndpZHRoIiwgR19UWVBFX0lOVCwgMTYsCisgICAgICAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgMTYsICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwgMzAsIDEsIE5VTEwpOworCisgIC8qIEZvcmNlIHJ0cGgyNjRkZXBheSB0byBvdXRwdXQgZm9ybWF0IGFzIHJlcXVlc3RlZCAqLworICBvdXRfY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJ2aWRlby94LWgyNjQiLAorICAgICAgInN0cmVhbS1mb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCBzdHJlYW1fZm9ybWF0LAorICAgICAgImFsaWdubWVudCIsIEdfVFlQRV9TVFJJTkcsICJhdSIsIE5VTEwpOworCisgIGdzdF9oYXJuZXNzX3NldF9jYXBzIChoLCBpbl9jYXBzLCBvdXRfY2Fwcyk7CisgIGluX2NhcHMgPSBOVUxMOworICBvdXRfY2FwcyA9IE5VTEw7CisKKyAgZ3N0X2hhcm5lc3NfcGxheSAoaCk7CisKKyAgc2l6ZSA9IHNpemVvZiAoaDI2NF8xNngxNl9ibGFja19icyk7CisgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGdfbWVtZHVwIChoMjY0XzE2eDE2X2JsYWNrX2JzLCBzaXplKSwgc2l6ZSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9oYXJuZXNzX3B1c2ggKGgsIGJ1ZiksIEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9oYXJuZXNzX3B1c2hfZXZlbnQgKGgsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisKKyAgd2hpbGUgKChlID0gZ3N0X2hhcm5lc3NfdHJ5X3B1bGxfZXZlbnQgKGgpKSkgeworICAgIGlmIChHU1RfRVZFTlRfVFlQRSAoZSkgPT0gR1NUX0VWRU5UX0NBUFMpIHsKKyAgICAgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworCisgICAgICBnc3RfZXZlbnRfcGFyc2VfY2FwcyAoZSwgJmNhcHMpOworICAgICAgZ3N0X2NhcHNfcmVwbGFjZSAoJm91dF9jYXBzLCBjYXBzKTsKKyAgICAgIHNlZW5fY2FwcyA9IFRSVUU7CisgICAgfQorICAgIGdzdF9ldmVudF91bnJlZiAoZSk7CisgIH0KKyAgZmFpbF91bmxlc3MgKHNlZW5fY2Fwcyk7CisKKyAgYnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIHNhbXBsZSA9IGdzdF9zYW1wbGVfbmV3IChidWYsIG91dF9jYXBzLCBOVUxMLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgZ3N0X2NhcHNfcmVwbGFjZSAoJm91dF9jYXBzLCBOVUxMKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7CisgIHJldHVybiBzYW1wbGU7Cit9CisKK0dTVF9TVEFSVF9URVNUIChydHBfaDI2NGRlcGF5X2F2YykKK3sKKyAgY29uc3QgR1ZhbHVlICp2YWw7CisgIEdzdFN0cnVjdHVyZSAqc3Q7CisgIEdzdE1hcEluZm8gbWFwID0gR1NUX01BUF9JTkZPX0lOSVQ7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RTYW1wbGUgKnM7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgcyA9IHJ0cF9oMjY0ZGVwYXlfcnVuICgiYXZjIik7CisKKyAgLyogbXVzdCBoYXZlIGNvZGVjX2RhdGEgaW4gb3V0cHV0IGNhcHMgKi8KKyAgY2FwcyA9IGdzdF9zYW1wbGVfZ2V0X2NhcHMgKHMpOworICBzdCA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBHU1RfTE9HICgiY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHN0LCAic3RyZWFtLWZvcm1hdCIpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzdCwgImFsaWdubWVudCIpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfaGFzX2ZpZWxkIChzdCwgImxldmVsIikpOworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9oYXNfZmllbGQgKHN0LCAicHJvZmlsZSIpKTsKKyAgdmFsID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0LCAiY29kZWNfZGF0YSIpOworICBmYWlsX3VubGVzcyAodmFsICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoR1NUX1ZBTFVFX0hPTERTX0JVRkZFUiAodmFsKSk7CisgIC8qIGNoZWNrIGNvZGVjX2RhdGEsIHNob3VsZG4ndCBjb250YWluIHRyYWlsaW5nIHplcm9zICovCisgIGJ1ZiA9IGdzdF92YWx1ZV9nZXRfYnVmZmVyICh2YWwpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKSk7CisgIHsKKyAgICBndWludCBudW1fc3BzLCBudW1fcHBzLCBsZW47CisgICAgZ3VpbnQ4ICpkYXRhOworCisgICAgR1NUX01FTURVTVAgKCJILjI2NCBjb2RlY19kYXRhIiwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChtYXAuZGF0YVswXSwgMSk7CisgICAgbnVtX3NwcyA9IG1hcC5kYXRhWzVdICYgMHgxZjsKKyAgICBkYXRhID0gbWFwLmRhdGEgKyA2OworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG51bV9zcHMsIDEpOworICAgIGxlbiA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoZGF0YSk7CisgICAgZGF0YSArPSAyOworICAgIC8qIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gdHJhaWxpbmcgemVyb3MgaW4gdGhlIFNQUyAqLworICAgIGZhaWxfdW5sZXNzIChkYXRhW2xlbiAtIDFdICE9IDApOworICAgIGRhdGEgKz0gbGVuOworICAgIG51bV9wcHMgPSAqZGF0YSsrOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG51bV9wcHMsIDEpOworICAgIGxlbiA9IEdTVF9SRUFEX1VJTlQxNl9CRSAoZGF0YSk7CisgICAgZGF0YSArPSAyOworICAgIC8qIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gdHJhaWxpbmcgemVyb3MgaW4gdGhlIFBQUyAqLworICAgIGZhaWxfdW5sZXNzIChkYXRhW2xlbiAtIDFdICE9IDApOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgYnVmID0gZ3N0X3NhbXBsZV9nZXRfYnVmZmVyIChzKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCkpOworICBHU1RfTUVNRFVNUCAoIkguMjY0IEFWQyBmcmFtZSIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIGZhaWxfdW5sZXNzIChtYXAuc2l6ZSA+PSA0ICsgMTMpOworICAvKiBXYW50IElEUiBzbGljZSBhcyB2ZXJ5IGZpcnN0IHRoaW5nLgorICAgKiBXZSBhc3N1bWUgbmFsIHNpemUgbWFya2VycyBhcmUgNCBieXRlcyBoZXJlLiAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChtYXAuZGF0YVs0XSAmIDB4MWYsIDUpOworICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgIGdzdF9zYW1wbGVfdW5yZWYgKHMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUIChydHBfaDI2NGRlcGF5X2J5dGVzdHJlYW0pCit7CisgIEdzdEJ5dGVSZWFkZXIgYnI7CisgIEdzdFN0cnVjdHVyZSAqc3Q7CisgIEdzdE1hcEluZm8gbWFwID0gR1NUX01BUF9JTkZPX0lOSVQ7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RTYW1wbGUgKnM7CisgIEdzdENhcHMgKmNhcHM7CisgIGd1aW50MzIgZHc7CisgIGd1aW50OCBiOworICBndWludCBvZmYsIGxlZnQ7CisKKyAgcyA9IHJ0cF9oMjY0ZGVwYXlfcnVuICgiYnl0ZS1zdHJlYW0iKTsKKworICAvKiBtdXN0IG5vdCBoYXZlIGNvZGVjX2RhdGEgaW4gb3V0cHV0IGNhcHMgKi8KKyAgY2FwcyA9IGdzdF9zYW1wbGVfZ2V0X2NhcHMgKHMpOworICBzdCA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICBHU1RfTE9HICgiY2FwczogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworICBmYWlsX2lmIChnc3Rfc3RydWN0dXJlX2hhc19maWVsZCAoc3QsICJjb2RlY19kYXRhIikpOworCisgIGJ1ZiA9IGdzdF9zYW1wbGVfZ2V0X2J1ZmZlciAocyk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpKTsKKyAgR1NUX01FTURVTVAgKCJILjI2NCBieXRlLXN0cmVhbSBmcmFtZSIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgIGZhaWxfdW5sZXNzIChtYXAuc2l6ZSA+IDQwKTsKKyAgZ3N0X2J5dGVfcmVhZGVyX2luaXQgKCZiciwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgLyogV2UgYXNzdW1lIG5hbCBzeW5jIG1hcmtlcnMgYXJlIDQgYnl0ZXMuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDMyX2JlICgmYnIsICZkdykpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkdywgMHgwMDAwMDAwMSk7CisgIC8qIFdhbnQgU1BTIGFzIHZlcnkgZmlyc3QgdGhpbmcgKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZiciwgJmIpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoYiAmIDB4MWYsIDcpOworICAvKiBUaGVuLCB3ZSB3YW50IHRoZSBQUFMgKi8KKyAgbGVmdCA9IGdzdF9ieXRlX3JlYWRlcl9nZXRfcmVtYWluaW5nICgmYnIpOworICBvZmYgPSBnc3RfYnl0ZV9yZWFkZXJfbWFza2VkX3NjYW5fdWludDMyICgmYnIsIDB4ZmZmZmZmZmYsIDEsIDAsIGxlZnQpOworICBmYWlsX2lmIChvZmYgPT0gKGd1aW50KSAtIDEpOworICBnc3RfYnl0ZV9yZWFkZXJfc2tpcCAoJmJyLCBvZmYgKyA0KTsKKyAgZmFpbF91bmxlc3MgKGdzdF9ieXRlX3JlYWRlcl9nZXRfdWludDggKCZiciwgJmIpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoYiAmIDB4MWYsIDgpOworICAvKiBGSVhNRTogbG9va3MgbGlrZSB3ZSBnZXQgdHdvIHNldHMgb2YgU1BTL1BQUyA/ISAqLworICBsZWZ0ID0gZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKCZicik7CisgIG9mZiA9IGdzdF9ieXRlX3JlYWRlcl9tYXNrZWRfc2Nhbl91aW50MzIgKCZiciwgMHhmZmZmZmZmZiwgMSwgMCwgbGVmdCk7CisgIGZhaWxfaWYgKG9mZiA9PSAoZ3VpbnQpIC0gMSk7CisgIGdzdF9ieXRlX3JlYWRlcl9za2lwICgmYnIsIG9mZiArIDQpOworICBsZWZ0ID0gZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKCZicik7CisgIG9mZiA9IGdzdF9ieXRlX3JlYWRlcl9tYXNrZWRfc2Nhbl91aW50MzIgKCZiciwgMHhmZmZmZmZmZiwgMSwgMCwgbGVmdCk7CisgIGZhaWxfaWYgKG9mZiA9PSAoZ3VpbnQpIC0gMSk7CisgIGdzdF9ieXRlX3JlYWRlcl9za2lwICgmYnIsIG9mZiArIDQpOworICAvKiBGaW5hbGx5LCB3ZSB3YW50IGFuIElEUiBzbGljZSAqLworICBsZWZ0ID0gZ3N0X2J5dGVfcmVhZGVyX2dldF9yZW1haW5pbmcgKCZicik7CisgIG9mZiA9IGdzdF9ieXRlX3JlYWRlcl9tYXNrZWRfc2Nhbl91aW50MzIgKCZiciwgMHhmZmZmZmZmZiwgMSwgMCwgbGVmdCk7CisgIGZhaWxfaWYgKG9mZiA9PSAoZ3VpbnQpIC0gMSk7CisgIGdzdF9ieXRlX3JlYWRlcl9za2lwICgmYnIsIG9mZiArIDQpOworICBmYWlsX3VubGVzcyAoZ3N0X2J5dGVfcmVhZGVyX2dldF91aW50OCAoJmJyLCAmYikpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChiICYgMHgxZiwgNSk7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgZ3N0X3NhbXBsZV91bnJlZiAocyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfaDI2NF9saXN0X2x0X210dV9mcmFtZV9kYXRhW10gPQorICAgIC8qIG5vdCBwYWNrZXRpemVkLCBuZXh0IE5BTCBzdGFydHMgd2l0aCAwMDAxICovCit7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsCisgIDB4YWQsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGQsIDB4MTAKK307CisKK3N0YXRpYyBpbnQgcnRwX2gyNjRfbGlzdF9sdF9tdHVfZnJhbWVfZGF0YV9zaXplID0gMTY7CisKK3N0YXRpYyBpbnQgcnRwX2gyNjRfbGlzdF9sdF9tdHVfZnJhbWVfY291bnQgPSAyOworCisvKiBOQUwgPSA0IGJ5dGVzICovCisvKiBhbHNvIDIgYnl0ZXMgRlUtQSBoZWFkZXIgZWFjaCB0aW1lICovCitzdGF0aWMgaW50IHJ0cF9oMjY0X2xpc3RfbHRfbXR1X2J5dGVzX3NlbnQgPSAyICogKDE2IC0gNCk7CisKK3N0YXRpYyBpbnQgcnRwX2gyNjRfbGlzdF9sdF9tdHVfbXR1X3NpemUgPSAxMDI0OworCitHU1RfU1RBUlRfVEVTVCAocnRwX2gyNjRfbGlzdF9sdF9tdHUpCit7CisgIC8qIEZJWE1FIDAuMTE6IGZ1bGx5IHNwZWNpZnkgaDI2NCBjYXBzIChhbmQgbWFrZSBwYXlsb2FkZXIgY2hlY2spICovCisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfaDI2NF9saXN0X2x0X210dV9mcmFtZV9kYXRhLAorICAgICAgcnRwX2gyNjRfbGlzdF9sdF9tdHVfZnJhbWVfZGF0YV9zaXplLCBydHBfaDI2NF9saXN0X2x0X210dV9mcmFtZV9jb3VudCwKKyAgICAgICJ2aWRlby94LWgyNjQsc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWJ5dGUtc3RyZWFtLGFsaWdubWVudD0oc3RyaW5nKW5hbCIsCisgICAgICAicnRwaDI2NHBheSIsICJydHBoMjY0ZGVwYXkiLAorICAgICAgcnRwX2gyNjRfbGlzdF9sdF9tdHVfYnl0ZXNfc2VudCwgcnRwX2gyNjRfbGlzdF9sdF9tdHVfbXR1X3NpemUsIFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9oMjY0X2xpc3RfbHRfbXR1X2ZyYW1lX2RhdGFfYXZjW10gPQorICAgIC8qIHBhY2tldGl6ZWQgZGF0YSAqLworeyAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDAwLCAweDAwLAorICAweGFkLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDBkLCAweDAwCit9OworCisvKiBOQUwgPSA0IGJ5dGVzICovCitzdGF0aWMgaW50IHJ0cF9oMjY0X2xpc3RfbHRfbXR1X2J5dGVzX3NlbnRfYXZjID0gMiAqICgxNiAtIDIgKiA0KTsKKworLy9zdGF0aWMgaW50IHJ0cF9oMjY0X2xpc3RfbHRfbXR1X210dV9zaXplID0gMTAyNDsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9oMjY0X2xpc3RfbHRfbXR1X2F2YykKK3sKKyAgLyogRklYTUUgMC4xMTogZnVsbHkgc3BlY2lmeSBoMjY0IGNhcHMgKGFuZCBtYWtlIHBheWxvYWRlciBjaGVjaykgKi8KKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9oMjY0X2xpc3RfbHRfbXR1X2ZyYW1lX2RhdGFfYXZjLAorICAgICAgcnRwX2gyNjRfbGlzdF9sdF9tdHVfZnJhbWVfZGF0YV9zaXplLCBydHBfaDI2NF9saXN0X2x0X210dV9mcmFtZV9jb3VudCwKKyAgICAgICJ2aWRlby94LWgyNjQsc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWF2YyxhbGlnbm1lbnQ9KHN0cmluZylhdSwiCisgICAgICAiY29kZWNfZGF0YT0oYnVmZmVyKTAxNjQwMDE0ZmZlMTAwMTg2NzY0MDAxNGFjZDk0MTQxZmIwMTEwMDAwMDAzMDAxNzczNTk0MDAwZjE0Mjk5NjAwMTAwMDU2OGViZWNiMjJjIiwKKyAgICAgICJydHBoMjY0cGF5IiwgInJ0cGgyNjRkZXBheSIsCisgICAgICBydHBfaDI2NF9saXN0X2x0X210dV9ieXRlc19zZW50X2F2YywgcnRwX2gyNjRfbGlzdF9sdF9tdHVfbXR1X3NpemUsIFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9oMjY0X2xpc3RfZ3RfbXR1X2ZyYW1lX2RhdGFbXSA9CisgICAgLyogbm90IHBhY2tldGl6ZWQsIG5leHQgTkFMIHN0YXJ0cyB3aXRoIDAwMDEgKi8KK3sgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMAorfTsKKworc3RhdGljIGludCBydHBfaDI2NF9saXN0X2d0X210dV9mcmFtZV9kYXRhX3NpemUgPSA2NDsKKworc3RhdGljIGludCBydHBfaDI2NF9saXN0X2d0X210dV9mcmFtZV9jb3VudCA9IDE7CisKKy8qIE5BTCA9IDQgYnl0ZXMuIFdoZW4gZGF0YSBkb2VzIG5vdCBmaXQgaW50byAxIG10dSwgMSBieXRlIHdpbGwgYmUgc2tpcHBlZCAqLworc3RhdGljIGludCBydHBfaDI2NF9saXN0X2d0X210dV9ieXRlc19zZW50ID0gMSAqICg2NCAtIDQpIC0gMTsKKworc3RhdGljIGludCBydHBfaDI2NF9saXN0X2d0X210dV9tdHlfc2l6ZSA9IDI4OworCitHU1RfU1RBUlRfVEVTVCAocnRwX2gyNjRfbGlzdF9ndF9tdHUpCit7CisgIC8qIEZJWE1FIDAuMTE6IGZ1bGx5IHNwZWNpZnkgaDI2NCBjYXBzIChhbmQgbWFrZSBwYXlsb2FkZXIgY2hlY2spICovCisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfaDI2NF9saXN0X2d0X210dV9mcmFtZV9kYXRhLAorICAgICAgcnRwX2gyNjRfbGlzdF9ndF9tdHVfZnJhbWVfZGF0YV9zaXplLCBydHBfaDI2NF9saXN0X2d0X210dV9mcmFtZV9jb3VudCwKKyAgICAgICJ2aWRlby94LWgyNjQsc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWJ5dGUtc3RyZWFtLGFsaWdubWVudD0oc3RyaW5nKW5hbCIsCisgICAgICAicnRwaDI2NHBheSIsICJydHBoMjY0ZGVwYXkiLAorICAgICAgcnRwX2gyNjRfbGlzdF9ndF9tdHVfYnl0ZXNfc2VudCwgcnRwX2gyNjRfbGlzdF9ndF9tdHVfbXR5X3NpemUsIFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9oMjY0X2xpc3RfZ3RfbXR1X2ZyYW1lX2RhdGFfYXZjW10gPQorICAgIC8qIHBhY2tldGl6ZWQgZGF0YSAqLworeyAweDAwLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCisvKiBOQUwgPSA0IGJ5dGVzLiBXaGVuIGRhdGEgZG9lcyBub3QgZml0IGludG8gMSBtdHUsIDEgYnl0ZSB3aWxsIGJlIHNraXBwZWQgKi8KK3N0YXRpYyBpbnQgcnRwX2gyNjRfbGlzdF9ndF9tdHVfYnl0ZXNfc2VudF9hdmMgPSAxICogKDY0IC0gMiAqIDQgLSAyICogMSk7CisKK0dTVF9TVEFSVF9URVNUIChydHBfaDI2NF9saXN0X2d0X210dV9hdmMpCit7CisgIC8qIEZJWE1FIDAuMTE6IGZ1bGx5IHNwZWNpZnkgaDI2NCBjYXBzIChhbmQgbWFrZSBwYXlsb2FkZXIgY2hlY2spICovCisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfaDI2NF9saXN0X2d0X210dV9mcmFtZV9kYXRhX2F2YywKKyAgICAgIHJ0cF9oMjY0X2xpc3RfZ3RfbXR1X2ZyYW1lX2RhdGFfc2l6ZSwgcnRwX2gyNjRfbGlzdF9ndF9tdHVfZnJhbWVfY291bnQsCisgICAgICAidmlkZW8veC1oMjY0LHN0cmVhbS1mb3JtYXQ9KHN0cmluZylhdmMsYWxpZ25tZW50PShzdHJpbmcpYXUsIgorICAgICAgImNvZGVjX2RhdGE9KGJ1ZmZlcikwMTY0MDAxNGZmZTEwMDE4Njc2NDAwMTRhY2Q5NDE0MWZiMDExMDAwMDAwMzAwMTc3MzU5NDAwMGYxNDI5OTYwMDEwMDA1NjhlYmVjYjIyYyIsCisgICAgICAicnRwaDI2NHBheSIsICJydHBoMjY0ZGVwYXkiLAorICAgICAgcnRwX2gyNjRfbGlzdF9ndF9tdHVfYnl0ZXNfc2VudF9hdmMsIHJ0cF9oMjY0X2xpc3RfZ3RfbXR1X210eV9zaXplLCBUUlVFKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9oMjY1X2ZyYW1lX2RhdGFbXSA9IHsKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIGludCBydHBfaDI2NV9mcmFtZV9kYXRhX3NpemUgPSAyMDsKKworc3RhdGljIGludCBydHBfaDI2NV9mcmFtZV9jb3VudCA9IDE7CisKK0dTVF9TVEFSVF9URVNUIChydHBfaDI2NSkKK3sKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9oMjY1X2ZyYW1lX2RhdGEsIHJ0cF9oMjY1X2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9oMjY1X2ZyYW1lX2NvdW50LAorICAgICAgInZpZGVvL3gtaDI2NSxzdHJlYW0tZm9ybWF0PShzdHJpbmcpYnl0ZS1zdHJlYW0sYWxpZ25tZW50PShzdHJpbmcpbmFsIiwKKyAgICAgICJydHBoMjY1cGF5IiwgInJ0cGgyNjVkZXBheSIsIDAsIDAsIEZBTFNFKTsKKworICAvKiBjb25maWctaW50ZXJ2YWwgcHJvcGVydHkgdXNlZCB0byBiZSBvZiB1aW50IHR5cGUsIHdhcyBjaGFuZ2VkIHRvIGludCwKKyAgICogbWFrZSBzdXJlIG9sZCBHVmFsdWUgc3R1ZmYgc3RpbGwgd29ya3MgKi8KKyAgeworICAgIEdWYWx1ZSB2YWwgPSBHX1ZBTFVFX0lOSVQ7CisgICAgR3N0RWxlbWVudCAqcnRwaDI2NXBheTsKKyAgICBHUGFyYW1TcGVjICpwc3BlYzsKKworCisgICAgcnRwaDI2NXBheSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cGgyNjVwYXkiLCBOVUxMKTsKKyAgICBwc3BlYyA9IGdfb2JqZWN0X2NsYXNzX2ZpbmRfcHJvcGVydHkgKEdfT0JKRUNUX0dFVF9DTEFTUyAocnRwaDI2NXBheSksCisgICAgICAgICJjb25maWctaW50ZXJ2YWwiKTsKKyAgICBmYWlsX3VubGVzcyAocHNwZWMtPnZhbHVlX3R5cGUgPT0gR19UWVBFX0lOVCk7CisgICAgZ192YWx1ZV9pbml0ICgmdmFsLCBHX1RZUEVfVUlOVCk7CisgICAgZ192YWx1ZV9zZXRfdWludCAoJnZhbCwgMTApOworICAgIGdfb2JqZWN0X3NldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKHJ0cGgyNjVwYXkpLCAiY29uZmlnLWludGVydmFsIiwgJnZhbCk7CisgICAgZ192YWx1ZV9zZXRfdWludCAoJnZhbCwgMCk7CisgICAgZ19vYmplY3RfZ2V0X3Byb3BlcnR5IChHX09CSkVDVCAocnRwaDI2NXBheSksICJjb25maWctaW50ZXJ2YWwiLCAmdmFsKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgxMCwgZ192YWx1ZV9nZXRfdWludCAoJnZhbCkpOworICAgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHJ0cGgyNjVwYXkpLCAiY29uZmlnLWludGVydmFsIiwgLTEsIE5VTEwpOworICAgIGdfb2JqZWN0X2dldF9wcm9wZXJ0eSAoR19PQkpFQ1QgKHJ0cGgyNjVwYXkpLCAiY29uZmlnLWludGVydmFsIiwgJnZhbCk7CisgICAgZmFpbF91bmxlc3MgKGdfdmFsdWVfZ2V0X3VpbnQgKCZ2YWwpID09IEdfTUFYVUlOVCk7CisgICAgZ192YWx1ZV91bnNldCAoJnZhbCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocnRwaDI2NXBheSk7CisgIH0KK30KKworR1NUX0VORF9URVNUOworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfaDI2NV9saXN0X2x0X210dV9mcmFtZV9kYXRhW10gPSB7CisgIC8qIG5vdCBwYWNrZXRpemVkLCBuZXh0IE5BTFUgc3RhcnRzIHdpdGggMHgwMDAwMDAwMSAqLworICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwCit9OworCitzdGF0aWMgaW50IHJ0cF9oMjY1X2xpc3RfbHRfbXR1X2ZyYW1lX2RhdGFfc2l6ZSA9IDE2OworCitzdGF0aWMgaW50IHJ0cF9oMjY1X2xpc3RfbHRfbXR1X2ZyYW1lX2NvdW50ID0gMjsKKworLyogMyBieXRlcyBzdGFydCBjb2RlIHByZWZpeGVkIHdpdGggb25lIHplcm8gYnl0ZSwgTkFMVSBoZWFkZXIgaXMgaW4gcGF5bG9hZCAqLworc3RhdGljIGludCBydHBfaDI2NV9saXN0X2x0X210dV9ieXRlc19zZW50ID0gMiAqICgxNiAtIDMgLSAxKTsKKworc3RhdGljIGludCBydHBfaDI2NV9saXN0X2x0X210dV9tdHVfc2l6ZSA9IDEwMjQ7CisKK0dTVF9TVEFSVF9URVNUIChydHBfaDI2NV9saXN0X2x0X210dSkKK3sKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9oMjY1X2xpc3RfbHRfbXR1X2ZyYW1lX2RhdGEsCisgICAgICBydHBfaDI2NV9saXN0X2x0X210dV9mcmFtZV9kYXRhX3NpemUsIHJ0cF9oMjY1X2xpc3RfbHRfbXR1X2ZyYW1lX2NvdW50LAorICAgICAgInZpZGVvL3gtaDI2NSxzdHJlYW0tZm9ybWF0PShzdHJpbmcpYnl0ZS1zdHJlYW0sYWxpZ25tZW50PShzdHJpbmcpbmFsIiwKKyAgICAgICJydHBoMjY1cGF5IiwgInJ0cGgyNjVkZXBheSIsIHJ0cF9oMjY1X2xpc3RfbHRfbXR1X2J5dGVzX3NlbnQsCisgICAgICBydHBfaDI2NV9saXN0X2x0X210dV9tdHVfc2l6ZSwgVFJVRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKK3N0YXRpYyBjb25zdCBndWludDggcnRwX2gyNjVfbGlzdF9sdF9tdHVfZnJhbWVfZGF0YV9odmMxW10gPSB7CisgIC8qIHBhY2tldGl6ZWQgZGF0YSAqLworICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDA5LCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorfTsKKworLyogbGVuZ3RoIHNpemUgaXMgMyBieXRlcyAqLworc3RhdGljIGludCBydHBfaDI2NV9saXN0X2x0X210dV9ieXRlc19zZW50X2h2YzEgPSAyICogKDE2IC0gMiAqIDMpOworCisKK0dTVF9TVEFSVF9URVNUIChydHBfaDI2NV9saXN0X2x0X210dV9odmMxKQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2gyNjVfbGlzdF9sdF9tdHVfZnJhbWVfZGF0YV9odmMxLAorICAgICAgcnRwX2gyNjVfbGlzdF9sdF9tdHVfZnJhbWVfZGF0YV9zaXplLCBydHBfaDI2NV9saXN0X2x0X210dV9mcmFtZV9jb3VudCwKKyAgICAgICJ2aWRlby94LWgyNjUsc3RyZWFtLWZvcm1hdD0oc3RyaW5nKWh2YzEsYWxpZ25tZW50PShzdHJpbmcpYXUsIgorICAgICAgImNvZGVjX2RhdGE9KGJ1ZmZlcikwMTAxYzAwMDAwMDA4MDAwMDAwMDAwMDA5OWYwMDBmY2ZkZjhmODAwMDAwMjAzYTAwMDAxMCIKKyAgICAgICIwMTg0MDAxMGMwMWZmZmYwMWMwMDAwMDAzMDA4MDAwMDAwMzAwMDAwMzAwOTlhYzA5MDBhMTAwMDEwMDMwNDIwMTAxMDFjMDAiCisgICAgICAiMDAwMDMwMDgwMDAwMDAzMDAwMDAzMDA5OWEwMGEwODBmMWZlMzZiYmI1Mzc3NzI1ZDYwMmRjMDQwNDA0MTAwMDAwMzAwMDEwIgorICAgICAgIjAwMDAzMDAwYTA4MDBhMjAwMDEwMDA3NDQwMWMxNzJiMDIyNDAiLAorICAgICAgInJ0cGgyNjVwYXkiLCAicnRwaDI2NWRlcGF5IiwgcnRwX2gyNjVfbGlzdF9sdF9tdHVfYnl0ZXNfc2VudF9odmMxLAorICAgICAgcnRwX2gyNjVfbGlzdF9sdF9tdHVfbXR1X3NpemUsIFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9oMjY1X2xpc3RfZ3RfbXR1X2ZyYW1lX2RhdGFbXSA9IHsKKyAgLyogbm90IHBhY2tldGl6ZWQsIG5leHQgTkFMIHN0YXJ0cyB3aXRoIDB4MDAwMDAxICovCisgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MTAKK307CisKK3N0YXRpYyBjb25zdCBpbnQgcnRwX2gyNjVfbGlzdF9ndF9tdHVfZnJhbWVfZGF0YV9zaXplID0gNjI7CisKK3N0YXRpYyBjb25zdCBpbnQgcnRwX2gyNjVfbGlzdF9ndF9tdHVfZnJhbWVfY291bnQgPSAxOworCisvKiBzdGFydCBjb2RlIGlzIDMgYnl0ZXMsIE5BTFUgaGVhZGVyIGlzIDIgYnl0ZXMgKi8KK3N0YXRpYyBpbnQgcnRwX2gyNjVfbGlzdF9ndF9tdHVfYnl0ZXNfc2VudCA9IDEgKiAoNjIgLSAzIC0gMik7CisKK3N0YXRpYyBpbnQgcnRwX2gyNjVfbGlzdF9ndF9tdHVfbXR1X3NpemUgPSAyODsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9oMjY1X2xpc3RfZ3RfbXR1KQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2gyNjVfbGlzdF9ndF9tdHVfZnJhbWVfZGF0YSwKKyAgICAgIHJ0cF9oMjY1X2xpc3RfZ3RfbXR1X2ZyYW1lX2RhdGFfc2l6ZSwgcnRwX2gyNjVfbGlzdF9ndF9tdHVfZnJhbWVfY291bnQsCisgICAgICAidmlkZW8veC1oMjY1LHN0cmVhbS1mb3JtYXQ9KHN0cmluZylieXRlLXN0cmVhbSxhbGlnbm1lbnQ9KHN0cmluZyluYWwiLAorICAgICAgInJ0cGgyNjVwYXkiLCAicnRwaDI2NWRlcGF5IiwgcnRwX2gyNjVfbGlzdF9ndF9tdHVfYnl0ZXNfc2VudCwKKyAgICAgIHJ0cF9oMjY1X2xpc3RfZ3RfbXR1X210dV9zaXplLCBUUlVFKTsKK30KKworR1NUX0VORF9URVNUOworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfaDI2NV9saXN0X2d0X210dV9mcmFtZV9kYXRhX2h2YzFbXSA9IHsKKyAgLyogcGFja2V0aXplZCBkYXRhICovCisgIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKKy8qIGxlbmd0aCBzaXplIGlzIDMgYnl0ZXMsIE5BTFUgaGVhZGVyIGlzIDIgYnl0ZXMgKi8KK3N0YXRpYyBpbnQgcnRwX2gyNjVfbGlzdF9ndF9tdHVfYnl0ZXNfc2VudF9odmMxID0gMSAqICg2MiAtIDIgKiAzIC0gMiAqIDIpOworCitHU1RfU1RBUlRfVEVTVCAocnRwX2gyNjVfbGlzdF9ndF9tdHVfaHZjMSkKK3sKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9oMjY1X2xpc3RfZ3RfbXR1X2ZyYW1lX2RhdGFfaHZjMSwKKyAgICAgIHJ0cF9oMjY1X2xpc3RfZ3RfbXR1X2ZyYW1lX2RhdGFfc2l6ZSwgcnRwX2gyNjVfbGlzdF9ndF9tdHVfZnJhbWVfY291bnQsCisgICAgICAidmlkZW8veC1oMjY1LHN0cmVhbS1mb3JtYXQ9KHN0cmluZylodmMxLGFsaWdubWVudD0oc3RyaW5nKWF1LCIKKyAgICAgICJjb2RlY19kYXRhPShidWZmZXIpMDEwMWMwMDAwMDAwODAwMDAwMDAwMDAwOTlmMDAwZmNmZGY4ZjgwMDAwMDIwM2EwMDAwMTAiCisgICAgICAiMDE4NDAwMTBjMDFmZmZmMDFjMDAwMDAwMzAwODAwMDAwMDMwMDAwMDMwMDk5YWMwOTAwYTEwMDAxMDAzMDQyMDEwMTAxYzAwIgorICAgICAgIjAwMDAzMDA4MDAwMDAwMzAwMDAwMzAwOTlhMDBhMDgwZjFmZTM2YmJiNTM3NzcyNWQ2MDJkYzA0MDQwNDEwMDAwMDMwMDAxMCIKKyAgICAgICIwMDAwMzAwMGEwODAwYTIwMDAxMDAwNzQ0MDFjMTcyYjAyMjQwIiwKKyAgICAgICJydHBoMjY1cGF5IiwgInJ0cGgyNjVkZXBheSIsIHJ0cF9oMjY1X2xpc3RfZ3RfbXR1X2J5dGVzX3NlbnRfaHZjMSwKKyAgICAgIHJ0cF9oMjY1X2xpc3RfZ3RfbXR1X210dV9zaXplLCBUUlVFKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBLTFYgZGF0YSBmcm9tIERheV9GbGlnaHQubXBnICovCitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9LTFZfZnJhbWVfZGF0YVtdID0geworICAweDA2LCAweDBlLCAweDJiLCAweDM0LCAweDAyLCAweDBiLCAweDAxLCAweDAxLAorICAweDBlLCAweDAxLCAweDAzLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAorICAweDgxLCAweDkxLCAweDAyLCAweDA4LCAweDAwLCAweDA0LCAweDZjLCAweDhlLAorICAweDIwLCAweDAzLCAweDgzLCAweDg1LCAweDQxLCAweDAxLCAweDAxLCAweDA1LAorICAweDAyLCAweDNkLCAweDNiLCAweDA2LCAweDAyLCAweDE1LCAweDgwLCAweDA3LAorICAweDAyLCAweDAxLCAweDUyLCAweDBiLCAweDAzLCAweDQ1LCAweDRmLCAweDRlLAorICAweDBjLCAweDBlLCAweDQ3LCAweDY1LCAweDZmLCAweDY0LCAweDY1LCAweDc0LAorICAweDY5LCAweDYzLCAweDIwLCAweDU3LCAweDQ3LCAweDUzLCAweDM4LCAweDM0LAorICAweDBkLCAweDA0LCAweDRkLCAweGM0LCAweGRjLCAweGJiLCAweDBlLCAweDA0LAorICAweGIxLCAweGE4LCAweDZjLCAweGZlLCAweDBmLCAweDAyLCAweDFmLCAweDRhLAorICAweDEwLCAweDAyLCAweDAwLCAweDg1LCAweDExLCAweDAyLCAweDAwLCAweDRiLAorICAweDEyLCAweDA0LCAweDIwLCAweGM4LCAweGQyLCAweDdkLCAweDEzLCAweDA0LAorICAweGZjLCAweGRkLCAweDAyLCAweGQ4LCAweDE0LCAweDA0LCAweGZlLCAweGI4LAorICAweGNiLCAweDYxLCAweDE1LCAweDA0LCAweDAwLCAweDhmLCAweDNlLCAweDYxLAorICAweDE2LCAweDA0LCAweDAwLCAweDAwLCAweDAxLCAweGM5LCAweDE3LCAweDA0LAorICAweDRkLCAweGRkLCAweDhjLCAweDJhLCAweDE4LCAweDA0LCAweGIxLCAweGJlLAorICAweDllLCAweGY0LCAweDE5LCAweDAyLCAweDBiLCAweDg1LCAweDI4LCAweDA0LAorICAweDRkLCAweGRkLCAweDhjLCAweDJhLCAweDI5LCAweDA0LCAweGIxLCAweGJlLAorICAweDllLCAweGY0LCAweDJhLCAweDAyLCAweDBiLCAweDg1LCAweDM4LCAweDAxLAorICAweDJlLCAweDM5LCAweDA0LCAweDAwLCAweDhkLCAweGQ0LCAweDI5LCAweDAxLAorICAweDAyLCAweDFjLCAweDVmCit9OworCitHU1RfU1RBUlRfVEVTVCAocnRwX2tsdikKK3sKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9LTFZfZnJhbWVfZGF0YSwgR19OX0VMRU1FTlRTIChydHBfS0xWX2ZyYW1lX2RhdGEpLCAxLAorICAgICAgIm1ldGEveC1rbHYsIHBhcnNlZD0oYm9vbCl0cnVlIiwgInJ0cGtsdnBheSIsICJydHBrbHZkZXBheSIsIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAocnRwX2tsdl9mcmFnbWVudGVkKQoreworICAvKiBmb3JjZSBzdXBlci1zbWFsbCBtdHUgb2YgNjAgdG8gZnJhZ21lbnQgS0xWIHVuaXQgKi8KKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9LTFZfZnJhbWVfZGF0YSwgc2l6ZW9mIChydHBfS0xWX2ZyYW1lX2RhdGEpLCAxLAorICAgICAgIm1ldGEveC1rbHYsIHBhcnNlZD0oYm9vbCl0cnVlIiwgInJ0cGtsdnBheSIsICJydHBrbHZkZXBheSIsCisgICAgICBzaXplb2YgKHJ0cF9LTFZfZnJhbWVfZGF0YSksIDYwLCBGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfTDE2X2ZyYW1lX2RhdGFbXSA9CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgaW50IHJ0cF9MMTZfZnJhbWVfZGF0YV9zaXplID0gMjA7CisKK3N0YXRpYyBpbnQgcnRwX0wxNl9mcmFtZV9jb3VudCA9IDE7CisKK0dTVF9TVEFSVF9URVNUIChydHBfTDE2KQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX0wxNl9mcmFtZV9kYXRhLCBydHBfTDE2X2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9MMTZfZnJhbWVfY291bnQsCisgICAgICAiYXVkaW8veC1yYXcsZm9ybWF0PVMxNkJFLHJhdGU9MSxjaGFubmVscz0xLGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkIiwKKyAgICAgICJydHBMMTZwYXkiLCAicnRwTDE2ZGVwYXkiLCAwLCAwLCBGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfTDI0X2ZyYW1lX2RhdGFbXSA9CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgaW50IHJ0cF9MMjRfZnJhbWVfZGF0YV9zaXplID0gMjQ7CisKK3N0YXRpYyBpbnQgcnRwX0wyNF9mcmFtZV9jb3VudCA9IDE7CisKK0dTVF9TVEFSVF9URVNUIChydHBfTDI0KQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX0wyNF9mcmFtZV9kYXRhLCBydHBfTDI0X2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9MMjRfZnJhbWVfY291bnQsCisgICAgICAiYXVkaW8veC1yYXcsZm9ybWF0PVMyNEJFLHJhdGU9MSxjaGFubmVscz0xLGxheW91dD0oc3RyaW5nKWludGVybGVhdmVkIiwKKyAgICAgICJydHBMMjRwYXkiLCAicnRwTDI0ZGVwYXkiLCAwLCAwLCBGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKK3N0YXRpYyBjb25zdCBndWludDggcnRwX21wMnRfZnJhbWVfZGF0YVtdID0KKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBpbnQgcnRwX21wMnRfZnJhbWVfZGF0YV9zaXplID0gMjA7CisKK3N0YXRpYyBpbnQgcnRwX21wMnRfZnJhbWVfY291bnQgPSAxOworCitHU1RfU1RBUlRfVEVTVCAocnRwX21wMnQpCit7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfbXAydF9mcmFtZV9kYXRhLCBydHBfbXAydF9mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfbXAydF9mcmFtZV9jb3VudCwgInZpZGVvL21wZWd0cyxwYWNrZXRzaXplPTE4OCxzeXN0ZW1zdHJlYW09dHJ1ZSIsCisgICAgICAicnRwbXAydHBheSIsICJydHBtcDJ0ZGVwYXkiLCAwLCAwLCBGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKK3N0YXRpYyBjb25zdCBndWludDggcnRwX21wNHZfZnJhbWVfZGF0YVtdID0KKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBpbnQgcnRwX21wNHZfZnJhbWVfZGF0YV9zaXplID0gMjA7CisKK3N0YXRpYyBpbnQgcnRwX21wNHZfZnJhbWVfY291bnQgPSAxOworCitHU1RfU1RBUlRfVEVTVCAocnRwX21wNHYpCit7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfbXA0dl9mcmFtZV9kYXRhLCBydHBfbXA0dl9mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfbXA0dl9mcmFtZV9jb3VudCwgInZpZGVvL21wZWcsbXBlZ3ZlcnNpb249NCxzeXN0ZW1zdHJlYW09ZmFsc2UiLAorICAgICAgInJ0cG1wNHZwYXkiLCAicnRwbXA0dmRlcGF5IiwgMCwgMCwgRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9tcDR2X2xpc3RfZnJhbWVfZGF0YVtdID0KKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBpbnQgcnRwX21wNHZfbGlzdF9mcmFtZV9kYXRhX3NpemUgPSAyMDsKKworc3RhdGljIGludCBydHBfbXA0dl9saXN0X2ZyYW1lX2NvdW50ID0gMTsKKworc3RhdGljIGludCBydHBfbXA0dl9saXN0X2J5dGVzX3NlbnQgPSAxICogMjA7CisKK0dTVF9TVEFSVF9URVNUIChydHBfbXA0dl9saXN0KQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX21wNHZfbGlzdF9mcmFtZV9kYXRhLCBydHBfbXA0dl9saXN0X2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9tcDR2X2xpc3RfZnJhbWVfY291bnQsCisgICAgICAidmlkZW8vbXBlZyxtcGVndmVyc2lvbj00LHN5c3RlbXN0cmVhbT1mYWxzZSxjb2RlY19kYXRhPShidWZmZXIpMDAwMDAxYjAwMSIsCisgICAgICAicnRwbXA0dnBheSIsICJydHBtcDR2ZGVwYXkiLCBydHBfbXA0dl9saXN0X2J5dGVzX3NlbnQsIDAsIFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9tcDRnX2ZyYW1lX2RhdGFbXSA9CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgaW50IHJ0cF9tcDRnX2ZyYW1lX2RhdGFfc2l6ZSA9IDIwOworCitzdGF0aWMgaW50IHJ0cF9tcDRnX2ZyYW1lX2NvdW50ID0gMTsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9tcDRnKQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX21wNGdfZnJhbWVfZGF0YSwgcnRwX21wNGdfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX21wNGdfZnJhbWVfY291bnQsCisgICAgICAidmlkZW8vbXBlZyxtcGVndmVyc2lvbj00LHN5c3RlbXN0cmVhbT1mYWxzZSxjb2RlY19kYXRhPShidWZmZXIpMDAwMDAxYjAwMSIsCisgICAgICAicnRwbXA0Z3BheSIsICJydHBtcDRnZGVwYXkiLCAwLCAwLCBGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKK3N0YXRpYyBjb25zdCBndWludDggcnRwX3RoZW9yYV9mcmFtZV9kYXRhW10gPQorICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIGludCBydHBfdGhlb3JhX2ZyYW1lX2RhdGFfc2l6ZSA9IDIwOworCitzdGF0aWMgaW50IHJ0cF90aGVvcmFfZnJhbWVfY291bnQgPSAxOworCitHU1RfU1RBUlRfVEVTVCAocnRwX3RoZW9yYSkKK3sKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF90aGVvcmFfZnJhbWVfZGF0YSwgcnRwX3RoZW9yYV9mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfdGhlb3JhX2ZyYW1lX2NvdW50LCAidmlkZW8veC10aGVvcmEiLCAicnRwdGhlb3JhcGF5IiwKKyAgICAgICJydHB0aGVvcmFkZXBheSIsIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworc3RhdGljIGNvbnN0IGd1aW50OCBydHBfdm9yYmlzX2ZyYW1lX2RhdGFbXSA9CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgaW50IHJ0cF92b3JiaXNfZnJhbWVfZGF0YV9zaXplID0gMjA7CisKK3N0YXRpYyBpbnQgcnRwX3ZvcmJpc19mcmFtZV9jb3VudCA9IDE7CisKK0dTVF9TVEFSVF9URVNUIChydHBfdm9yYmlzKQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX3ZvcmJpc19mcmFtZV9kYXRhLCBydHBfdm9yYmlzX2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF92b3JiaXNfZnJhbWVfY291bnQsICJhdWRpby94LXZvcmJpcyIsICJydHB2b3JiaXNwYXkiLAorICAgICAgInJ0cHZvcmJpc2RlcGF5IiwgMCwgMCwgRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9qcGVnX2ZyYW1lX2RhdGFbXSA9CisgICAgeyAvKiBTT0YgKi8gMHhGRiwgMHhDMCwgMHgwMCwgMHgxMSwgMHgwOCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwOCwKKyAgMHgwMywgMHgwMCwgMHgyMSwgMHgwOCwgMHgwMSwgMHgxMSwgMHgwOCwgMHgwMiwgMHgxMSwgMHgwOCwKKyAgLyogRFFUICovIDB4RkYsIDB4REIsIDB4MDAsIDB4NDMsIDB4MDgsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIC8qIERBVEEgKi8gMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIGludCBydHBfanBlZ19mcmFtZV9kYXRhX3NpemUgPSBzaXplb2YgKHJ0cF9qcGVnX2ZyYW1lX2RhdGEpOworCitzdGF0aWMgaW50IHJ0cF9qcGVnX2ZyYW1lX2NvdW50ID0gMTsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9qcGVnKQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2pwZWdfZnJhbWVfZGF0YSwgcnRwX2pwZWdfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX2pwZWdfZnJhbWVfY291bnQsICJ2aWRlby94LWpwZWcsaGVpZ2h0PTY0MCx3aWR0aD00ODAiLCAicnRwanBlZ3BheSIsCisgICAgICAicnRwanBlZ2RlcGF5IiwgMCwgMCwgRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUIChydHBfanBlZ193aWR0aF9ncmVhdGVyX3RoYW5fMjA0MCkKK3sKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9qcGVnX2ZyYW1lX2RhdGEsIHJ0cF9qcGVnX2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9qcGVnX2ZyYW1lX2NvdW50LCAidmlkZW8veC1qcGVnLGhlaWdodD0yMDQ4LHdpZHRoPTQ4MCIsICJydHBqcGVncGF5IiwKKyAgICAgICJydHBqcGVnZGVwYXkiLCAwLCAwLCBGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9qcGVnX2hlaWdodF9ncmVhdGVyX3RoYW5fMjA0MCkKK3sKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9qcGVnX2ZyYW1lX2RhdGEsIHJ0cF9qcGVnX2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9qcGVnX2ZyYW1lX2NvdW50LCAidmlkZW8veC1qcGVnLGhlaWdodD02NDAsd2lkdGg9MjA0OCIsICJydHBqcGVncGF5IiwKKyAgICAgICJydHBqcGVnZGVwYXkiLCAwLCAwLCBGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9qcGVnX3dpZHRoX2FuZF9oZWlnaHRfZ3JlYXRlcl90aGFuXzIwNDApCit7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfanBlZ19mcmFtZV9kYXRhLCBydHBfanBlZ19mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfanBlZ19mcmFtZV9jb3VudCwgInZpZGVvL3gtanBlZyxoZWlnaHQ9MjA0OCx3aWR0aD0yMDQ4IiwgInJ0cGpwZWdwYXkiLAorICAgICAgInJ0cGpwZWdkZXBheSIsIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9qcGVnX2xpc3RfZnJhbWVfZGF0YVtdID0KKyAgICB7IC8qIFNPRiAqLyAweEZGLCAweEMwLCAweDAwLCAweDExLCAweDA4LCAweDAwLCAweDA4LCAweDAwLCAweDA4LAorICAweDAzLCAweDAwLCAweDIxLCAweDA4LCAweDAxLCAweDExLCAweDA4LCAweDAyLCAweDExLCAweDA4LAorICAvKiBEUVQgKi8gMHhGRiwgMHhEQiwgMHgwMCwgMHg0MywgMHgwOCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgLyogREFUQSAqLyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgaW50IHJ0cF9qcGVnX2xpc3RfZnJhbWVfZGF0YV9zaXplID0gc2l6ZW9mIChydHBfanBlZ19saXN0X2ZyYW1lX2RhdGEpOworCitzdGF0aWMgaW50IHJ0cF9qcGVnX2xpc3RfZnJhbWVfY291bnQgPSAxOworCitzdGF0aWMgaW50IHJ0cF9qcGVnX2xpc3RfYnl0ZXNfc2VudCA9IDEgKiBzaXplb2YgKHJ0cF9qcGVnX2xpc3RfZnJhbWVfZGF0YSk7CisKK0dTVF9TVEFSVF9URVNUIChydHBfanBlZ19saXN0KQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2pwZWdfbGlzdF9mcmFtZV9kYXRhLCBydHBfanBlZ19saXN0X2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9qcGVnX2xpc3RfZnJhbWVfY291bnQsICJ2aWRlby94LWpwZWcsaGVpZ2h0PTY0MCx3aWR0aD00ODAiLAorICAgICAgInJ0cGpwZWdwYXkiLCAicnRwanBlZ2RlcGF5IiwgcnRwX2pwZWdfbGlzdF9ieXRlc19zZW50LCAwLCBUUlVFKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAocnRwX2pwZWdfbGlzdF93aWR0aF9ncmVhdGVyX3RoYW5fMjA0MCkKK3sKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9qcGVnX2xpc3RfZnJhbWVfZGF0YSwgcnRwX2pwZWdfbGlzdF9mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfanBlZ19saXN0X2ZyYW1lX2NvdW50LCAidmlkZW8veC1qcGVnLGhlaWdodD0yMDQ4LHdpZHRoPTQ4MCIsCisgICAgICAicnRwanBlZ3BheSIsICJydHBqcGVnZGVwYXkiLCBydHBfanBlZ19saXN0X2J5dGVzX3NlbnQsIDAsIFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUIChydHBfanBlZ19saXN0X2hlaWdodF9ncmVhdGVyX3RoYW5fMjA0MCkKK3sKKyAgcnRwX3BpcGVsaW5lX3Rlc3QgKHJ0cF9qcGVnX2xpc3RfZnJhbWVfZGF0YSwgcnRwX2pwZWdfbGlzdF9mcmFtZV9kYXRhX3NpemUsCisgICAgICBydHBfanBlZ19saXN0X2ZyYW1lX2NvdW50LCAidmlkZW8veC1qcGVnLGhlaWdodD02NDAsd2lkdGg9MjA0OCIsCisgICAgICAicnRwanBlZ3BheSIsICJydHBqcGVnZGVwYXkiLCBydHBfanBlZ19saXN0X2J5dGVzX3NlbnQsIDAsIFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUIChydHBfanBlZ19saXN0X3dpZHRoX2FuZF9oZWlnaHRfZ3JlYXRlcl90aGFuXzIwNDApCit7CisgIHJ0cF9waXBlbGluZV90ZXN0IChydHBfanBlZ19saXN0X2ZyYW1lX2RhdGEsIHJ0cF9qcGVnX2xpc3RfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX2pwZWdfbGlzdF9mcmFtZV9jb3VudCwgInZpZGVvL3gtanBlZyxoZWlnaHQ9MjA0OCx3aWR0aD0yMDQ4IiwKKyAgICAgICJydHBqcGVncGF5IiwgInJ0cGpwZWdkZXBheSIsIHJ0cF9qcGVnX2xpc3RfYnl0ZXNfc2VudCwgMCwgVFJVRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIHZvaWQKK3J0cF9qcGVnX2RvX3BhY2tldF9sb3NzIChnZG91YmxlIHByb2IsIGdpbnQgbnVtX2V4cGVjdGVkKQoreworICBHc3RIYXJuZXNzICpoOworICBnYm9vbGVhbiBlb3MgPSBGQUxTRTsKKyAgZ2NoYXIgKnM7CisgIGd1aW50IGksIGJ1ZmZlcl9jb3VudDsKKworICBzID0gZ19zdHJkdXBfcHJpbnRmICgidmlkZW90ZXN0c3JjIHBhdHRlcm49YmFsbCBudW0tYnVmZmVycz0xMDAgISAiCisgICAgICAianBlZ2VuYyBxdWFsaXR5PTUwICEgcnRwanBlZ3BheSAhIGlkZW50aXR5IGRyb3AtcHJvYmFiaWxpdHk9JWcgISAiCisgICAgICAicnRwanBlZ2RlcGF5IiwgcHJvYik7CisgIEdTVF9JTkZPICgicnVubmluZyBwaXBlbGluZSAlcyIsIHMpOworICBoID0gZ3N0X2hhcm5lc3NfbmV3X3BhcnNlIChzKTsKKyAgZ19mcmVlIChzKTsKKworICBnc3RfaGFybmVzc19wbGF5IChoKTsKKworICBkbyB7CisgICAgR3N0RXZlbnQgKmV2ZW50OworCisgICAgZXZlbnQgPSBnc3RfaGFybmVzc19wdWxsX2V2ZW50IChoKTsKKyAgICBlb3MgPSAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSA9PSBHU1RfRVZFTlRfRU9TKTsKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKKyAgfSB3aGlsZSAoIWVvcyk7CisKKyAgYnVmZmVyX2NvdW50ID0gZ3N0X2hhcm5lc3NfYnVmZmVyc19yZWNlaXZlZCAoaCk7CisgIEdTVF9JTkZPICgiR290ICV1IGJ1ZmZlcnMiLCBidWZmZXJfY291bnQpOworCisgIGlmIChudW1fZXhwZWN0ZWQgPj0gMCkgeworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG51bV9leHBlY3RlZCwgYnVmZmVyX2NvdW50KTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJfY291bnQ7ICsraSkgeworICAgIEdzdEJ1ZmZlciAqYnVmOworICAgIEdzdE1hcEluZm8gbWFwOworICAgIGd1aW50MTYgc29pLCBlb2k7CisKKyAgICBidWYgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgICBmYWlsX3VubGVzcyAoYnVmICE9IE5VTEwpOworCisgICAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWFwIChidWYsICZtYXAsIEdTVF9NQVBfUkVBRCkpOworICAgIEdTVF9NRU1EVU1QICgianBlZyBmcmFtZSIsIG1hcC5kYXRhLCBtYXAuc2l6ZSk7CisgICAgZmFpbF91bmxlc3MgKG1hcC5zaXplID4gNCk7CisgICAgc29pID0gR1NUX1JFQURfVUlOVDE2X0JFIChtYXAuZGF0YSk7CisgICAgZmFpbF91bmxlc3MgKHNvaSA9PSAweGZmZDgsICJleHBlY3RlZCBKUEVHIGZyYW1lIHN0YXJ0IEZGRDggbm90ICUwMlgiLCBzb2kpOworICAgIGVvaSA9IEdTVF9SRUFEX1VJTlQxNl9CRSAobWFwLmRhdGEgKyBtYXAuc2l6ZSAtIDIpOworICAgIGZhaWxfdW5sZXNzIChlb2kgPT0gMHhmZmQ5LCAiZXhwZWN0ZWQgSlBFRyBmcmFtZSBlbmQgRkZEOSBub3QgJTAyWCIsIGVvaSk7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmLCAmbWFwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICB9CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfU1RBUlRfVEVTVCAocnRwX2pwZWdfcGFja2V0X2xvc3MpCit7CisgIGdkb3VibGUgcHJvYmFiaWxpdGllc1tdID0geyAwLjAsIDAuMDAxLCAwLjAxLCAwLjEsIDAuMiwgMC41LCAxLjAgfTsKKyAgZ2ludCBudW1fZXhwZWN0ZWRbXSA9IHsgMTAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAgfTsKKworICBHU1RfSU5GTyAoIlN0YXJ0IGl0ZXJhdGlvbiAlZCIsIF9faV9fKTsKKyAgZmFpbF91bmxlc3MgKF9faV9fIDwgR19OX0VMRU1FTlRTIChwcm9iYWJpbGl0aWVzKSk7CisgIHJ0cF9qcGVnX2RvX3BhY2tldF9sb3NzIChwcm9iYWJpbGl0aWVzW19faV9fXSwgbnVtX2V4cGVjdGVkW19faV9fXSk7CisgIEdTVF9JTkZPICgiRG9uZSB3aXRoIGl0ZXJhdGlvbiAlZCIsIF9faV9fKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9nNzI5X2ZyYW1lX2RhdGFbXSA9CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgaW50IHJ0cF9nNzI5X2ZyYW1lX2RhdGFfc2l6ZSA9IDIyOworCitzdGF0aWMgaW50IHJ0cF9nNzI5X2ZyYW1lX2NvdW50ID0gMTsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9nNzI5KQoreworICBydHBfcGlwZWxpbmVfdGVzdCAocnRwX2c3MjlfZnJhbWVfZGF0YSwgcnRwX2c3MjlfZnJhbWVfZGF0YV9zaXplLAorICAgICAgcnRwX2c3MjlfZnJhbWVfY291bnQsICJhdWRpby9HNzI5LHJhdGU9ODAwMCxjaGFubmVscz0xIiwgInJ0cGc3MjlwYXkiLAorICAgICAgInJ0cGc3MjlkZXBheSIsIDAsIDAsIEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgY29uc3QgZ3VpbnQ4IHJ0cF9nc3RfZnJhbWVfZGF0YVtdID0KKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBpbnQgcnRwX2dzdF9mcmFtZV9kYXRhX3NpemUgPSAyMjsKKworc3RhdGljIGludCBydHBfZ3N0X2ZyYW1lX2NvdW50ID0gMTsKKworR1NUX1NUQVJUX1RFU1QgKHJ0cF9nc3RfY3VzdG9tX2V2ZW50KQoreworICAvKiBDcmVhdGUgUlRQIHBpcGVsaW5lLiAqLworICBydHBfcGlwZWxpbmUgKnAgPQorICAgICAgcnRwX3BpcGVsaW5lX2NyZWF0ZSAocnRwX2dzdF9mcmFtZV9kYXRhLCBydHBfZ3N0X2ZyYW1lX2RhdGFfc2l6ZSwKKyAgICAgIHJ0cF9nc3RfZnJhbWVfY291bnQsICJhcHBsaWNhdGlvbi94LXRlc3QiLAorICAgICAgInJ0cGdzdHBheSIsICJydHBnc3RkZXBheSIpOworCisgIGlmIChwID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKworICBwLT5jdXN0b21fZXZlbnQgPQorICAgICAgZ3N0X2V2ZW50X25ld19jdXN0b20gKEdTVF9FVkVOVF9DVVNUT01fRE9XTlNUUkVBTSwKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgidGVzdCIsICJmb28iLCBHX1RZUEVfSU5ULCAxLCBOVUxMKSk7CisKKyAgLyogUnVuIFJUUCBwaXBlbGluZS4gKi8KKyAgcnRwX3BpcGVsaW5lX3J1biAocCk7CisKKyAgLyogRGVzdHJveSBSVFAgcGlwZWxpbmUuICovCisgIHJ0cF9waXBlbGluZV9kZXN0cm95IChwKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAocnRwX3ZvcmJpc19yZW5lZ290aWF0ZSkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEVsZW1lbnQgKmVuYywgKnBheSwgKmRlcGF5LCAqZGVjLCAqc2luazsKKyAgR3N0UGFkICpzaW5rcGFkLCAqc3JjcGFkOworICBHc3RDYXBzICp0ZW1wbGNhcHMsICpjYXBzLCAqZmlsdGVyLCAqc3JjY2FwczsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIEdzdEF1ZGlvSW5mbyBpbmZvOworCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoTlVMTCk7CisgIGVuYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZvcmJpc2VuYyIsIE5VTEwpOworICBwYXkgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHB2b3JiaXNwYXkiLCBOVUxMKTsKKyAgZGVwYXkgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHB2b3JiaXNkZXBheSIsIE5VTEwpOworICBkZWMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2b3JiaXNkZWMiLCBOVUxMKTsKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc2luaywgImFzeW5jIiwgRkFMU0UsIE5VTEwpOworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIGVuYywgcGF5LCBkZXBheSwgZGVjLCBzaW5rLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmtfbWFueSAoZW5jLCBwYXksIGRlcGF5LCBkZWMsIHNpbmssIE5VTEwpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpLAorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGVuYywgInNpbmsiKTsKKyAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGRlYywgInNyYyIpOworCisgIHRlbXBsY2FwcyA9IGdzdF9wYWRfZ2V0X3BhZF90ZW1wbGF0ZV9jYXBzIChzaW5rcGFkKTsKKyAgZmlsdGVyID0KKyAgICAgIGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDIsICJyYXRlIiwKKyAgICAgIEdfVFlQRV9JTlQsIDQ0MTAwLCBOVUxMKTsKKyAgY2FwcyA9IGdzdF9jYXBzX2ludGVyc2VjdCAodGVtcGxjYXBzLCBmaWx0ZXIpOworICBjYXBzID0gZ3N0X2NhcHNfZml4YXRlIChjYXBzKTsKKworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfc2VuZF9ldmVudCAoc2lua3BhZCwKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoInRlc3QiKSkpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9zZW5kX2V2ZW50IChzaW5rcGFkLCBnc3RfZXZlbnRfbmV3X2NhcHMgKGNhcHMpKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3NlbmRfZXZlbnQgKHNpbmtwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisKKyAgZ3N0X2F1ZGlvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgY2Fwcyk7CisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoNDQxMDAgKiBpbmZvLmJwZik7CisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBnc3RfYXVkaW9fZm9ybWF0X2ZpbGxfc2lsZW5jZSAoaW5mby5maW5mbywgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmbWFwKTsKKyAgR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcikgPSAwOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpID0gMSAqIEdTVF9TRUNPTkQ7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3BhZF9jaGFpbiAoc2lua3BhZCwgYnVmZmVyKSwgR1NUX0ZMT1dfT0spOworCisgIHNyY2NhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHNyY3BhZCk7CisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChzcmNjYXBzLCBjYXBzKSk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChmaWx0ZXIpOworICBmaWx0ZXIgPQorICAgICAgZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImF1ZGlvL3gtcmF3IiwgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMiwgInJhdGUiLAorICAgICAgR19UWVBFX0lOVCwgNDgwMDAsIE5VTEwpOworICBjYXBzID0gZ3N0X2NhcHNfaW50ZXJzZWN0ICh0ZW1wbGNhcHMsIGZpbHRlcik7CisgIGNhcHMgPSBnc3RfY2Fwc19maXhhdGUgKGNhcHMpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3NlbmRfZXZlbnQgKHNpbmtwYWQsIGdzdF9ldmVudF9uZXdfY2FwcyAoY2FwcykpKTsKKworICBnc3RfYXVkaW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKTsKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICg0ODAwMCAqIGluZm8uYnBmKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGdzdF9hdWRpb19mb3JtYXRfZmlsbF9zaWxlbmNlIChpbmZvLmZpbmZvLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICBnc3RfYnVmZmVyX3VubWFwIChidWZmZXIsICZtYXApOworICBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKSA9IDA7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcikgPSAxICogR1NUX1NFQ09ORDsKKyAgR1NUX0JVRkZFUl9GTEFHX1NFVCAoYnVmZmVyLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3BhZF9jaGFpbiAoc2lua3BhZCwgYnVmZmVyKSwgR1NUX0ZMT1dfT0spOworCisgIHNyY2NhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHNyY3BhZCk7CisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19jYW5faW50ZXJzZWN0IChzcmNjYXBzLCBjYXBzKSk7CisgIGdzdF9jYXBzX3VucmVmIChzcmNjYXBzKTsKKworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChmaWx0ZXIpOworICBnc3RfY2Fwc191bnJlZiAodGVtcGxjYXBzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qCisgKiBDcmVhdGVzIHRoZSB0ZXN0IHN1aXRlLgorICoKKyAqIFJldHVybnM6IHBvaW50ZXIgdG8gdGhlIHRlc3Qgc3VpdGUuCisgKi8KK3N0YXRpYyBTdWl0ZSAqCitydHBfcGF5bG9hZGluZ19zdWl0ZSAodm9pZCkKK3sKKyAgR3N0UmVnaXN0cnkgKnJlZ2lzdHJ5ID0gZ3N0X3JlZ2lzdHJ5X2dldCAoKTsKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJydHBfZGF0YV90ZXN0Iik7CisKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgibGluZWFyIik7CisKKyAgLyogU2V0IHRpbWVvdXQgdG8gNjAgc2Vjb25kcy4gKi8KKyAgdGNhc2Vfc2V0X3RpbWVvdXQgKHRjX2NoYWluLCA2MCk7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX2lsYmMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9nc20pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9hbXIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9wY21hKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfcGNtdSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX21wYSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX2gyNjEpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9oMjYzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfaDI2M3ApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9oMjY0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfaDI2NGRlcGF5X2F2Yyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX2gyNjRkZXBheV9ieXRlc3RyZWFtKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfaDI2NF9saXN0X2x0X210dSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX2gyNjRfbGlzdF9sdF9tdHVfYXZjKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfaDI2NF9saXN0X2d0X210dSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX2gyNjRfbGlzdF9ndF9tdHVfYXZjKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfaDI2NSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX2gyNjVfbGlzdF9sdF9tdHUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9oMjY1X2xpc3RfbHRfbXR1X2h2YzEpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9oMjY1X2xpc3RfZ3RfbXR1KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfaDI2NV9saXN0X2d0X210dV9odmMxKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfa2x2KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfa2x2X2ZyYWdtZW50ZWQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9MMTYpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9MMjQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9tcDJ0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfbXA0dik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX21wNHZfbGlzdCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX21wNGcpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF90aGVvcmEpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF92b3JiaXMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9qcGVnKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfanBlZ193aWR0aF9ncmVhdGVyX3RoYW5fMjA0MCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX2pwZWdfaGVpZ2h0X2dyZWF0ZXJfdGhhbl8yMDQwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfanBlZ193aWR0aF9hbmRfaGVpZ2h0X2dyZWF0ZXJfdGhhbl8yMDQwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfanBlZ19saXN0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfanBlZ19saXN0X3dpZHRoX2dyZWF0ZXJfdGhhbl8yMDQwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfanBlZ19saXN0X2hlaWdodF9ncmVhdGVyX3RoYW5fMjA0MCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX2pwZWdfbGlzdF93aWR0aF9hbmRfaGVpZ2h0X2dyZWF0ZXJfdGhhbl8yMDQwKTsKKyAgaWYgKGdzdF9yZWdpc3RyeV9jaGVja19mZWF0dXJlX3ZlcnNpb24gKHJlZ2lzdHJ5LCAianBlZ2VuYyIsIDEsIDAsIDApCisgICAgICAmJiBnc3RfcmVnaXN0cnlfY2hlY2tfZmVhdHVyZV92ZXJzaW9uIChyZWdpc3RyeSwgInZpZGVvdGVzdHNyYyIsIDEsIDAsIDApKQorICAgIHRjYXNlX2FkZF9sb29wX3Rlc3QgKHRjX2NoYWluLCBydHBfanBlZ19wYWNrZXRfbG9zcywgMCwgNyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgcnRwX2c3MjkpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHJ0cF9nc3RfY3VzdG9tX2V2ZW50KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCBydHBfdm9yYmlzX3JlbmVnb3RpYXRlKTsKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChydHBfcGF5bG9hZGluZykKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGF1eC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2ZTI3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGF1eC5jCkBAIC0wLDAgKzEsNDE4IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ29sbGFib3JhIEx0ZC4KKyAqICAgQGF1dGhvciBKdWxpZW4gSXNvcmNlIDxqdWxpZW4uaXNvcmNlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNvbnNpc3RlbmN5Y2hlY2tlci5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3R0ZXN0Y2xvY2suaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCitzdGF0aWMgZ2Jvb2xlYW4gc2VuZF9waXBlbGluZV9lb3MgPSBGQUxTRTsKK3N0YXRpYyBnYm9vbGVhbiByZWNlaXZlX3BpcGVsaW5lX2VvcyA9IEZBTFNFOworCitzdGF0aWMgdm9pZAorbWVzc2FnZV9yZWNlaXZlZCAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgR3N0UGlwZWxpbmUgKiBiaW4pCit7CisgIEdTVF9JTkZPICgiYnVzIG1lc3NhZ2UgZnJvbSBcIiUiIEdTVF9QVFJfRk9STUFUICJcIjogJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpLCBtZXNzYWdlKTsKKworICBzd2l0Y2ggKG1lc3NhZ2UtPnR5cGUpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VPUzoKKyAgICAgIGlmICghc3RyY21wICgicGlwZWxpbmVfc2VuZCIsCisgICAgICAgICAgICAgIEdTVF9PQkpFQ1RfTkFNRSAoR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSkpKQorICAgICAgICBzZW5kX3BpcGVsaW5lX2VvcyA9IFRSVUU7CisgICAgICBlbHNlIGlmICghc3RyY21wICgicGlwZWxpbmVfcmVjZWl2ZSIsCisgICAgICAgICAgICAgIEdTVF9PQkpFQ1RfTkFNRSAoR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSkpKQorICAgICAgICByZWNlaXZlX3BpcGVsaW5lX2VvcyA9IFRSVUU7CisgICAgICBlbHNlCisgICAgICAgIGZhaWwgKCJVbmtub3duIHBpcGVsaW5lOiAlcyIsCisgICAgICAgICAgICBHU1RfT0JKRUNUX05BTUUgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSkpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01FU1NBR0VfV0FSTklORzp7CisgICAgICBHRXJyb3IgKmdlcnJvcjsKKyAgICAgIGdjaGFyICpkZWJ1ZzsKKworICAgICAgZ3N0X21lc3NhZ2VfcGFyc2Vfd2FybmluZyAobWVzc2FnZSwgJmdlcnJvciwgJmRlYnVnKTsKKyAgICAgIGdzdF9vYmplY3RfZGVmYXVsdF9lcnJvciAoR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSwgZ2Vycm9yLCBkZWJ1Zyk7CisgICAgICBnX2Vycm9yX2ZyZWUgKGdlcnJvcik7CisgICAgICBnX2ZyZWUgKGRlYnVnKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VSUk9SOnsKKyAgICAgIEdFcnJvciAqZ2Vycm9yOworICAgICAgZ2NoYXIgKmRlYnVnOworCisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobWVzc2FnZSwgJmdlcnJvciwgJmRlYnVnKTsKKyAgICAgIGdzdF9vYmplY3RfZGVmYXVsdF9lcnJvciAoR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSwgZ2Vycm9yLCBkZWJ1Zyk7CisgICAgICBnX2Vycm9yX2ZyZWUgKGdlcnJvcik7CisgICAgICBnX2ZyZWUgKGRlYnVnKTsKKyAgICAgIGZhaWwgKCJFcnJvciEiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ3VpbnQgY291bnQ7CisgIGd1aW50IG5iX3BhY2tldHM7CisgIGd1aW50IGRyb3BfZXZlcnlfbl9wYWNrZXRzOworfSBSVFhTZW5kRGF0YTsKKworc3RhdGljIEdzdFBhZFByb2JlUmV0dXJuCitydHBydHhzZW5kX3NyY3BhZF9wcm9iZSAoR3N0UGFkICogcGFkLCBHc3RQYWRQcm9iZUluZm8gKiBpbmZvLAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0UGFkUHJvYmVSZXR1cm4gcmV0ID0gR1NUX1BBRF9QUk9CRV9PSzsKKworICBpZiAoaW5mby0+dHlwZSA9PSAoR1NUX1BBRF9QUk9CRV9UWVBFX0JVRkZFUiB8IEdTVF9QQURfUFJPQkVfVFlQRV9QVVNIKSkgeworICAgIEdzdEJ1ZmZlciAqYnVmZmVyID0gR1NUX0JVRkZFUiAoaW5mby0+ZGF0YSk7CisgICAgUlRYU2VuZERhdGEgKnJ0eGRhdGEgPSAoUlRYU2VuZERhdGEgKikgdXNlcl9kYXRhOworICAgIEdzdFJUUEJ1ZmZlciBydHAgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworICAgIGd1aW50IHBheWxvYWRfdHlwZSA9IDA7CisKKyAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGJ1ZmZlciwgR1NUX01BUF9SRUFELCAmcnRwKTsKKyAgICBwYXlsb2FkX3R5cGUgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF90eXBlICgmcnRwKTsKKworICAgIC8qIG1haW4gc3RyZWFtIHBhY2tldHMgKi8KKyAgICBpZiAocGF5bG9hZF90eXBlID09IDk2KSB7CisgICAgICAvKiBjb3VudCBwYWNrZXRzIG9mIHRoZSBtYWluIHN0cmVhbSAqLworICAgICAgKytydHhkYXRhLT5uYl9wYWNrZXRzOworICAgICAgLyogZHJvcCBzb21lIHBhY2tldHMgKi8KKyAgICAgIGlmIChydHhkYXRhLT5jb3VudCA8IHJ0eGRhdGEtPmRyb3BfZXZlcnlfbl9wYWNrZXRzKSB7CisgICAgICAgICsrcnR4ZGF0YS0+Y291bnQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBkcm9wIGEgcGFja2V0IGV2ZXJ5ICdydHhkYXRhLT5jb3VudCcgcGFja2V0cyAqLworICAgICAgICBydHhkYXRhLT5jb3VudCA9IDE7CisgICAgICAgIHJldCA9IEdTVF9QQURfUFJPQkVfRFJPUDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogcmV0cmFuc21pc3Npb24gcGFja2V0cyAqLworICAgIH0KKworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9ydHBiaW5yZWNlaXZlX3BhZF9hZGRlZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIG5ld1BhZCwKKyAgICBncG9pbnRlciBkYXRhKQoreworICBHc3RFbGVtZW50ICpydHBkZXBheWxvYWRlciA9IEdTVF9FTEVNRU5UIChkYXRhKTsKKworICBnY2hhciAqcGFkTmFtZSA9IGdzdF9wYWRfZ2V0X25hbWUgKG5ld1BhZCk7CisgIGlmIChnX3N0cl9oYXNfcHJlZml4IChwYWROYW1lLCAicmVjdl9ydHBfc3JjXyIpKSB7CisgICAgR3N0UGFkICpzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHJ0cGRlcGF5bG9hZGVyLCAic2luayIpOworICAgIGdzdF9wYWRfbGluayAobmV3UGFkLCBzaW5rcGFkKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKyAgfQorICBnX2ZyZWUgKHBhZE5hbWUpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK29uX3RpbWVvdXQgKGdwb2ludGVyIGRhdGEpCit7CisgIEdzdEV2ZW50ICplb3MgPSBnc3RfZXZlbnRfbmV3X2VvcyAoKTsKKyAgaWYgKCFnc3RfZWxlbWVudF9zZW5kX2V2ZW50IChHU1RfRUxFTUVOVCAoZGF0YSksIGVvcykpIHsKKyAgICBHU1RfRVJST1IgKCJmYWlsZWQgdG8gc2VuZCBlbmQgb2Ygc3RyZWFtIGV2ZW50Iik7CisgICAgZ3N0X2V2ZW50X3VucmVmIChlb3MpOworICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCityZXF1ZXN0X2F1eF9yZWNlaXZlIChHc3RFbGVtZW50ICogcnRwYmluLCBndWludCBzZXNzaWQsIEdzdEVsZW1lbnQgKiByZWNlaXZlKQoreworICBHc3RFbGVtZW50ICpiaW47CisgIEdzdFBhZCAqcGFkOworCisgIEdTVF9JTkZPICgiY3JlYXRpbmcgQVVYIHJlY2VpdmVyIik7CisgIGJpbiA9IGdzdF9iaW5fbmV3IChOVUxMKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKGJpbiksIHJlY2VpdmUpOworCisgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChyZWNlaXZlLCAic3JjIik7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgZ3N0X2dob3N0X3BhZF9uZXcgKCJzcmNfMCIsIHBhZCkpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocmVjZWl2ZSwgInNpbmsiKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoYmluLCBnc3RfZ2hvc3RfcGFkX25ldyAoInNpbmtfMCIsIHBhZCkpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworCisgIHJldHVybiBiaW47Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3JlcXVlc3RfYXV4X3NlbmQgKEdzdEVsZW1lbnQgKiBydHBiaW4sIGd1aW50IHNlc3NpZCwgR3N0RWxlbWVudCAqIHNlbmQpCit7CisgIEdzdEVsZW1lbnQgKmJpbjsKKyAgR3N0UGFkICpwYWQ7CisKKyAgR1NUX0lORk8gKCJjcmVhdGluZyBBVVggc2VuZGVyIik7CisgIGJpbiA9IGdzdF9iaW5fbmV3IChOVUxMKTsKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKGJpbiksIHNlbmQpOworCisgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzZW5kLCAic3JjIik7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgZ3N0X2dob3N0X3BhZF9uZXcgKCJzcmNfMCIsIHBhZCkpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2VuZCwgInNpbmsiKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoYmluLCBnc3RfZ2hvc3RfcGFkX25ldyAoInNpbmtfMCIsIHBhZCkpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworCisgIHJldHVybiBiaW47Cit9CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfc2ltcGxlX3J0cGJpbl9hdXgpCit7CisgIEdzdEVsZW1lbnQgKmJpbnNlbmQsICpydHBiaW5zZW5kLCAqc3JjLCAqZW5jb2RlciwgKnJ0cHBheWxvYWRlciwKKyAgICAgICpydHBydHhzZW5kLCAqc2VuZHJ0cF91ZHBzaW5rLCAqc2VuZHJ0Y3BfdWRwc2luaywgKnNlbmRydGNwX3VkcHNyYzsKKyAgR3N0RWxlbWVudCAqYmlucmVjZWl2ZSwgKnJ0cGJpbnJlY2VpdmUsICpyZWN2cnRwX3VkcHNyYywgKnJlY3ZydGNwX3VkcHNyYywKKyAgICAgICpyZWN2cnRjcF91ZHBzaW5rLCAqcnRwcnR4cmVjZWl2ZSwgKnJ0cGRlcGF5bG9hZGVyLCAqZGVjb2RlciwgKmNvbnZlcnRlciwKKyAgICAgICpzaW5rOworICBHc3RCdXMgKmJ1c3NlbmQ7CisgIEdzdEJ1cyAqYnVzcmVjZWl2ZTsKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RDYXBzICpydHBjYXBzID0gTlVMTDsKKyAgR3N0U3RydWN0dXJlICpwdF9tYXA7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHN0YXRlX3JlcyA9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKyAgR3N0UGFkICpzcmNwYWQgPSBOVUxMOworICBndWludCBuYl9ydHhfc2VuZF9wYWNrZXRzID0gMDsKKyAgZ3VpbnQgbmJfcnR4X3JlY3ZfcGFja2V0cyA9IDA7CisgIFJUWFNlbmREYXRhIHNlbmRfcnR4ZGF0YTsKKyAgc2VuZF9ydHhkYXRhLmNvdW50ID0gMTsKKyAgc2VuZF9ydHhkYXRhLm5iX3BhY2tldHMgPSAwOworICBzZW5kX3J0eGRhdGEuZHJvcF9ldmVyeV9uX3BhY2tldHMgPSAyNTsKKworICBHU1RfSU5GTyAoInByZXBhcmluZyB0ZXN0Iik7CisKKyAgLyogYnVpbGQgcGlwZWxpbmUgKi8KKyAgYmluc2VuZCA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZV9zZW5kIik7CisgIGJ1c3NlbmQgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChiaW5zZW5kKTsKKyAgZ3N0X2J1c19hZGRfc2lnbmFsX3dhdGNoX2Z1bGwgKGJ1c3NlbmQsIEdfUFJJT1JJVFlfSElHSCk7CisKKyAgYmlucmVjZWl2ZSA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZV9yZWNlaXZlIik7CisgIGJ1c3JlY2VpdmUgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChiaW5yZWNlaXZlKTsKKyAgZ3N0X2J1c19hZGRfc2lnbmFsX3dhdGNoX2Z1bGwgKGJ1c3JlY2VpdmUsIEdfUFJJT1JJVFlfSElHSCk7CisKKyAgcnRwYmluc2VuZCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cGJpbiIsICJydHBiaW5zZW5kIik7CisgIGdfb2JqZWN0X3NldCAocnRwYmluc2VuZCwgImxhdGVuY3kiLCAyMDAsICJkby1yZXRyYW5zbWlzc2lvbiIsIFRSVUUsIE5VTEwpOworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb3Rlc3RzcmMiLCAic3JjIik7CisgIGVuY29kZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhbGF3ZW5jIiwgImVuY29kZXIiKTsKKyAgcnRwcGF5bG9hZGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwcGNtYXBheSIsICJydHBwYXlsb2FkZXIiKTsKKyAgcnRwcnR4c2VuZCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cHJ0eHNlbmQiLCAicnRwcnR4c2VuZCIpOworICBzZW5kcnRwX3VkcHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzaW5rIiwgInNlbmRydHBfdWRwc2luayIpOworICBnX29iamVjdF9zZXQgKHNlbmRydHBfdWRwc2luaywgImhvc3QiLCAiMTI3LjAuMC4xIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc2VuZHJ0cF91ZHBzaW5rLCAicG9ydCIsIDUwMDYsIE5VTEwpOworICBzZW5kcnRjcF91ZHBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc2luayIsICJzZW5kcnRjcF91ZHBzaW5rIik7CisgIGdfb2JqZWN0X3NldCAoc2VuZHJ0Y3BfdWRwc2luaywgImhvc3QiLCAiMTI3LjAuMC4xIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc2VuZHJ0Y3BfdWRwc2luaywgInBvcnQiLCA1MDA3LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzZW5kcnRjcF91ZHBzaW5rLCAic3luYyIsIEZBTFNFLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzZW5kcnRjcF91ZHBzaW5rLCAiYXN5bmMiLCBGQUxTRSwgTlVMTCk7CisgIHNlbmRydGNwX3VkcHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNyYyIsICJzZW5kcnRjcF91ZHBzcmMiKTsKKyAgZ19vYmplY3Rfc2V0IChzZW5kcnRjcF91ZHBzcmMsICJwb3J0IiwgNTAwOSwgTlVMTCk7CisKKyAgcnRwYmlucmVjZWl2ZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cGJpbiIsICJydHBiaW5yZWNlaXZlIik7CisgIGdfb2JqZWN0X3NldCAocnRwYmlucmVjZWl2ZSwgImxhdGVuY3kiLCAyMDAsICJkby1yZXRyYW5zbWlzc2lvbiIsIFRSVUUsIE5VTEwpOworICByZWN2cnRwX3VkcHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNyYyIsICJyZWN2cnRwX3VkcHNyYyIpOworICBnX29iamVjdF9zZXQgKHJlY3ZydHBfdWRwc3JjLCAicG9ydCIsIDUwMDYsIE5VTEwpOworICBydHBjYXBzID0KKyAgICAgIGdzdF9jYXBzX2Zyb21fc3RyaW5nCisgICAgICAoImFwcGxpY2F0aW9uL3gtcnRwLG1lZGlhPShzdHJpbmcpYXVkaW8sY2xvY2stcmF0ZT0oaW50KTgwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKVBDTUEscGF5bG9hZD0oaW50KTk2Iik7CisgIGdfb2JqZWN0X3NldCAocmVjdnJ0cF91ZHBzcmMsICJjYXBzIiwgcnRwY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChydHBjYXBzKTsKKyAgcmVjdnJ0Y3BfdWRwc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc3JjIiwgInJlY3ZydGNwX3VkcHNyYyIpOworICBnX29iamVjdF9zZXQgKHJlY3ZydGNwX3VkcHNyYywgInBvcnQiLCA1MDA3LCBOVUxMKTsKKyAgcmVjdnJ0Y3BfdWRwc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNpbmsiLCAicmVjdnJ0Y3BfdWRwc2luayIpOworICBnX29iamVjdF9zZXQgKHJlY3ZydGNwX3VkcHNpbmssICJob3N0IiwgIjEyNy4wLjAuMSIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHJlY3ZydGNwX3VkcHNpbmssICJwb3J0IiwgNTAwOSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAocmVjdnJ0Y3BfdWRwc2luaywgInN5bmMiLCBGQUxTRSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAocmVjdnJ0Y3BfdWRwc2luaywgImFzeW5jIiwgRkFMU0UsIE5VTEwpOworICBydHBydHhyZWNlaXZlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwcnR4cmVjZWl2ZSIsICJydHBydHhyZWNlaXZlIik7CisgIHJ0cGRlcGF5bG9hZGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwcGNtYWRlcGF5IiwgInJ0cGRlcGF5bG9hZGVyIik7CisgIGRlY29kZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhbGF3ZGVjIiwgImRlY29kZXIiKTsKKyAgY29udmVydGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiaWRlbnRpdHkiLCAiY29udmVydGVyIik7CisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJzaW5rIik7CisgIGdfb2JqZWN0X3NldCAoc2luaywgInN5bmMiLCBUUlVFLCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChiaW5zZW5kKSwgcnRwYmluc2VuZCwgc3JjLCBlbmNvZGVyLCBydHBwYXlsb2FkZXIsCisgICAgICBzZW5kcnRwX3VkcHNpbmssIHNlbmRydGNwX3VkcHNpbmssIHNlbmRydGNwX3VkcHNyYywgTlVMTCk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAoYmlucmVjZWl2ZSksIHJ0cGJpbnJlY2VpdmUsCisgICAgICByZWN2cnRwX3VkcHNyYywgcmVjdnJ0Y3BfdWRwc3JjLCByZWN2cnRjcF91ZHBzaW5rLAorICAgICAgcnRwZGVwYXlsb2FkZXIsIGRlY29kZXIsIGNvbnZlcnRlciwgc2luaywgTlVMTCk7CisKKyAgZ19zaWduYWxfY29ubmVjdCAocnRwYmlucmVjZWl2ZSwgInBhZC1hZGRlZCIsCisgICAgICBHX0NBTExCQUNLIChvbl9ydHBiaW5yZWNlaXZlX3BhZF9hZGRlZCksIHJ0cGRlcGF5bG9hZGVyKTsKKworICBwdF9tYXAgPSBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLXB0LW1hcCIsCisgICAgICAiOTYiLCBHX1RZUEVfVUlOVCwgOTksIE5VTEwpOworICBnX29iamVjdF9zZXQgKHJ0cHBheWxvYWRlciwgInB0IiwgOTYsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHJ0cHBheWxvYWRlciwgInNlcW51bS1vZmZzZXQiLCAxLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChydHBydHhzZW5kLCAicGF5bG9hZC10eXBlLW1hcCIsIHB0X21hcCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAocnRwcnR4cmVjZWl2ZSwgInBheWxvYWQtdHlwZS1tYXAiLCBwdF9tYXAsIE5VTEwpOworICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHB0X21hcCk7CisKKyAgLyogc2V0IHJ0cCBhdXggcmVjZWl2ZSAqLworICBnX3NpZ25hbF9jb25uZWN0IChydHBiaW5yZWNlaXZlLCAicmVxdWVzdC1hdXgtcmVjZWl2ZXIiLCAoR0NhbGxiYWNrKQorICAgICAgcmVxdWVzdF9hdXhfcmVjZWl2ZSwgcnRwcnR4cmVjZWl2ZSk7CisgIC8qIHNldCBydHAgYXV4IHNlbmQgKi8KKyAgZ19zaWduYWxfY29ubmVjdCAocnRwYmluc2VuZCwgInJlcXVlc3QtYXV4LXNlbmRlciIsIChHQ2FsbGJhY2spCisgICAgICByZXF1ZXN0X2F1eF9zZW5kLCBydHBydHhzZW5kKTsKKworICAvKiBnc3QtbGF1bmNoLTEuMCBydHBiaW4gbmFtZT1ydHBiaW4gYXVkaW90ZXN0c3JjICEgYW1ybmJlbmMgISBydHBhbXJwYXkgISBcCisgICAqIHJ0cGJpbi5zZW5kX3J0cF9zaW5rXzEgcnRwYmluLnNlbmRfcnRwX3NyY18xICEgdWRwc2luayBob3N0PSIxMjcuMC4wLjEiIFwKKyAgICogcG9ydD01MDAyIHJ0cGJpbi5zZW5kX3J0Y3Bfc3JjXzEgISB1ZHBzaW5rIGhvc3Q9IjEyNy4wLjAuMSIgcG9ydD01MDAzIFwKKyAgICogc3luYz1mYWxzZSBhc3luYz1mYWxzZSAgdWRwc3JjIHBvcnQ9NTAwNyAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18xCisgICAqLworCisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKHNyYywgZW5jb2Rlcik7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKGVuY29kZXIsIHJ0cHBheWxvYWRlcik7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgIHJlcyA9CisgICAgICBnc3RfZWxlbWVudF9saW5rX3BhZHNfZnVsbCAocnRwcGF5bG9hZGVyLCAic3JjIiwgcnRwYmluc2VuZCwKKyAgICAgICJzZW5kX3J0cF9zaW5rXzAiLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgIHJlcyA9CisgICAgICBnc3RfZWxlbWVudF9saW5rX3BhZHNfZnVsbCAocnRwYmluc2VuZCwgInNlbmRfcnRwX3NyY18wIiwgc2VuZHJ0cF91ZHBzaW5rLAorICAgICAgInNpbmsiLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgIHJlcyA9CisgICAgICBnc3RfZWxlbWVudF9saW5rX3BhZHNfZnVsbCAocnRwYmluc2VuZCwgInNlbmRfcnRjcF9zcmNfMCIsCisgICAgICBzZW5kcnRjcF91ZHBzaW5rLCAic2luayIsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0KKyAgICAgIGdzdF9lbGVtZW50X2xpbmtfcGFkc19mdWxsIChzZW5kcnRjcF91ZHBzcmMsICJzcmMiLCBydHBiaW5zZW5kLAorICAgICAgInJlY3ZfcnRjcF9zaW5rXzAiLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisKKyAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHJ0cGJpbnNlbmQsICJzZW5kX3J0cF9zcmNfMCIpOworICBnc3RfcGFkX2FkZF9wcm9iZSAoc3JjcGFkLAorICAgICAgKEdTVF9QQURfUFJPQkVfVFlQRV9CVUZGRVIgfCBHU1RfUEFEX1BST0JFX1RZUEVfUFVTSCksCisgICAgICAoR3N0UGFkUHJvYmVDYWxsYmFjaykgcnRwcnR4c2VuZF9zcmNwYWRfcHJvYmUsICZzZW5kX3J0eGRhdGEsIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworCisgIC8qIGdzdC1sYXVuY2gtMS4wIHJ0cGJpbiBuYW1lPXJ0cGJpbiB1ZHBzcmMgY2Fwcz0iYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZylhdWRpbywgXAorICAgKiBjbG9jay1yYXRlPShpbnQpODAwMCxlbmNvZGluZy1uYW1lPShzdHJpbmcpQU1SLGVuY29kaW5nLXBhcmFtcz0oc3RyaW5nKTEsbworICAgKiBjdGV0LWFsaWduPShzdHJpbmcpMSIgcG9ydD01MDAyICEgcnRwYmluLnJlY3ZfcnRwX3NpbmtfMSBydHBiaW4uICEgcnRwYW1yZGVwYXkgISBcCisgICAqIGFtcm5iZGVjICEgZmFrZXNpbmsgc3luYz1UcnVlICB1ZHBzcmMgcG9ydD01MDAzICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzEgXAorICAgKiBydHBiaW4uc2VuZF9ydGNwX3NyY18xICEgdWRwc2luayBob3N0PSIxMjcuMC4wLjEiIHBvcnQ9NTAwNyBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlCisgICAqLworCisgIHJlcyA9CisgICAgICBnc3RfZWxlbWVudF9saW5rX3BhZHNfZnVsbCAocmVjdnJ0cF91ZHBzcmMsICJzcmMiLCBydHBiaW5yZWNlaXZlLAorICAgICAgInJlY3ZfcnRwX3NpbmtfMCIsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0KKyAgICAgIGdzdF9lbGVtZW50X2xpbmtfcGFkc19mdWxsIChydHBkZXBheWxvYWRlciwgInNyYyIsIGRlY29kZXIsICJzaW5rIiwKKyAgICAgIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAoZGVjb2RlciwgY29udmVydGVyKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0KKyAgICAgIGdzdF9lbGVtZW50X2xpbmtfcGFkc19mdWxsIChjb252ZXJ0ZXIsICJzcmMiLCBzaW5rLCAic2luayIsCisgICAgICBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgIHJlcyA9CisgICAgICBnc3RfZWxlbWVudF9saW5rX3BhZHNfZnVsbCAocmVjdnJ0Y3BfdWRwc3JjLCAic3JjIiwgcnRwYmlucmVjZWl2ZSwKKyAgICAgICJyZWN2X3J0Y3Bfc2lua18wIiwgR1NUX1BBRF9MSU5LX0NIRUNLX05PVEhJTkcpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICByZXMgPQorICAgICAgZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKHJ0cGJpbnJlY2VpdmUsICJzZW5kX3J0Y3Bfc3JjXzAiLAorICAgICAgcmVjdnJ0Y3BfdWRwc2luaywgInNpbmsiLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzc2VuZCwgIm1lc3NhZ2U6OmVycm9yIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwKKyAgICAgIGJpbnNlbmQpOworICBnX3NpZ25hbF9jb25uZWN0IChidXNzZW5kLCAibWVzc2FnZTo6d2FybmluZyIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsCisgICAgICBiaW5zZW5kKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzc2VuZCwgIm1lc3NhZ2U6OmVvcyIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsCisgICAgICBiaW5zZW5kKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChidXNyZWNlaXZlLCAibWVzc2FnZTo6ZXJyb3IiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLAorICAgICAgYmlucmVjZWl2ZSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1c3JlY2VpdmUsICJtZXNzYWdlOjp3YXJuaW5nIiwKKyAgICAgIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsIGJpbnJlY2VpdmUpOworICBnX3NpZ25hbF9jb25uZWN0IChidXNyZWNlaXZlLCAibWVzc2FnZTo6ZW9zIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwKKyAgICAgIGJpbnJlY2VpdmUpOworCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmlucmVjZWl2ZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW5zZW5kLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBnX3RpbWVvdXRfYWRkICg1MDAwLCBvbl90aW1lb3V0LCBiaW5zZW5kKTsKKyAgZ190aW1lb3V0X2FkZCAoNTAwMCwgb25fdGltZW91dCwgYmlucmVjZWl2ZSk7CisKKyAgR1NUX0lORk8gKCJlbnRlciBtYWlubG9vcCIpOworICB3aGlsZSAoIXNlbmRfcGlwZWxpbmVfZW9zICYmICFyZWNlaXZlX3BpcGVsaW5lX2VvcykKKyAgICBnX21haW5fY29udGV4dF9pdGVyYXRpb24gKE5VTEwsIFRSVUUpOworICBHU1RfSU5GTyAoImV4aXQgbWFpbmxvb3AiKTsKKworICAvKiBjaGVjayB0aGF0IEZCIE5BQ0sgaXMgd29ya2luZyAqLworICBnX29iamVjdF9nZXQgKEdfT0JKRUNUIChydHBydHhzZW5kKSwgIm51bS1ydHgtcmVxdWVzdHMiLCAmbmJfcnR4X3NlbmRfcGFja2V0cywKKyAgICAgIE5VTEwpOworICBnX29iamVjdF9nZXQgKEdfT0JKRUNUIChydHBydHhyZWNlaXZlKSwgIm51bS1ydHgtcmVxdWVzdHMiLAorICAgICAgJm5iX3J0eF9yZWN2X3BhY2tldHMsIE5VTEwpOworCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluc2VuZCwgR1NUX1NUQVRFX05VTEwpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW5yZWNlaXZlLCBHU1RfU1RBVEVfTlVMTCk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBHU1RfSU5GTyAoIm5iX3J0eF9zZW5kX3BhY2tldHMgJWQiLCBuYl9ydHhfc2VuZF9wYWNrZXRzKTsKKyAgR1NUX0lORk8gKCJuYl9ydHhfcmVjdl9wYWNrZXRzICVkIiwgbmJfcnR4X3JlY3ZfcGFja2V0cyk7CisgIGZhaWxfaWYgKG5iX3J0eF9zZW5kX3BhY2tldHMgPCAxKTsKKyAgZmFpbF9pZiAobmJfcnR4X3JlY3ZfcGFja2V0cyA8IDEpOworCisgIC8qIGNsZWFudXAgKi8KKyAgZ3N0X2J1c19yZW1vdmVfc2lnbmFsX3dhdGNoIChidXNzZW5kKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzc2VuZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJpbnNlbmQpOworCisgIGdzdF9idXNfcmVtb3ZlX3NpZ25hbF93YXRjaCAoYnVzcmVjZWl2ZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1c3JlY2VpdmUpOworICBnc3Rfb2JqZWN0X3VucmVmIChiaW5yZWNlaXZlKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorcnRwYXV4X3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInJ0cGF1eCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgdGNhc2Vfc2V0X3RpbWVvdXQgKHRjX2NoYWluLCAxMDAwMCk7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3NpbXBsZV9ydHBiaW5fYXV4KTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHJ0cGF1eCk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW4uYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MWNkNjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW4uYwpAQCAtMCwwICsxLDkyNCBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBnc3RydHBiaW4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA5PiBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0dGVzdGNsb2NrLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRjcGJ1ZmZlci5oPgorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYWRzKQoreworICBHc3RFbGVtZW50ICplbGVtZW50OworICBHc3RQYWQgKnBhZDsKKworICBlbGVtZW50ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwc2Vzc2lvbiIsIE5VTEwpOworCisgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoZWxlbWVudCwgInJlY3ZfcnRjcF9zaW5rIik7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGVsZW1lbnQpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2NsZWFudXBfc2VuZCkKK3sKKyAgR3N0RWxlbWVudCAqcnRwYmluOworICBHc3RQYWQgKnJ0cF9zaW5rLCAqcnRwX3NyYywgKnJ0Y3Bfc3JjOworICBHT2JqZWN0ICpzZXNzaW9uOworICBnaW50IGNvdW50ID0gMjsKKworICBydHBiaW4gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBiaW4iLCAicnRwYmluIik7CisKKyAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAvKiByZXF1ZXN0IHNlc3Npb24gMCAqLworICAgIHJ0cF9zaW5rID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBiaW4sICJzZW5kX3J0cF9zaW5rXzAiKTsKKyAgICBmYWlsX3VubGVzcyAocnRwX3NpbmsgIT0gTlVMTCk7CisgICAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAocnRwX3NpbmssICJydHBfc2luayIsIDIpOworCisgICAgLyogdGhpcyBzdGF0aWMgcGFkIHNob3VsZCBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgbm93ICovCisgICAgcnRwX3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydHBiaW4sICJzZW5kX3J0cF9zcmNfMCIpOworICAgIGZhaWxfdW5sZXNzIChydHBfc3JjICE9IE5VTEwpOworICAgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHJ0cF9zcmMsICJydHBfc3JjIiwgMik7CisKKyAgICAvKiB3ZSBzaG91bGQgYmUgYWJsZSB0byBnZXQgYW4gaW50ZXJuYWwgc2Vzc2lvbiAwIG5vdyAqLworICAgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAocnRwYmluLCAiZ2V0LWludGVybmFsLXNlc3Npb24iLCAwLCAmc2Vzc2lvbik7CisgICAgZmFpbF91bmxlc3MgKHNlc3Npb24gIT0gTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHNlc3Npb24pOworCisgICAgLyogZ2V0IHRoZSBzZW5kIFJUQ1AgcGFkIHRvbyAqLworICAgIHJ0Y3Bfc3JjID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBiaW4sICJzZW5kX3J0Y3Bfc3JjXzAiKTsKKyAgICBmYWlsX3VubGVzcyAocnRjcF9zcmMgIT0gTlVMTCk7CisgICAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAocnRjcF9zcmMsICJydGNwX3NyYyIsIDIpOworCisgICAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAocnRwYmluLCBydHBfc2luayk7CisgICAgLyogd2Ugc2hvdWxkIG9ubHkgaGF2ZSBvdXIgcmVmcyB0byB0aGUgcGFkcyBub3cgKi8KKyAgICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChydHBfc2luaywgInJ0cF9zaW5rIiwgMSk7CisgICAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAocnRwX3NyYywgInJ0cF9zcmMiLCAxKTsKKyAgICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChydGNwX3NyYywgInJ0cF9zcmMiLCAyKTsKKworICAgIC8qIHRoZSBvdGhlciBwYWQgc2hvdWxkIGJlIGdvbmUgbm93ICovCisgICAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydHBiaW4sICJzZW5kX3J0cF9zcmNfMCIpID09IE5VTEwpOworCisgICAgLyogaW50ZXJuYWwgc2Vzc2lvbiBzaG91bGQgc3RpbGwgYmUgdGhlcmUgKi8KKyAgICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHJ0cGJpbiwgImdldC1pbnRlcm5hbC1zZXNzaW9uIiwgMCwgJnNlc3Npb24pOworICAgIGZhaWxfdW5sZXNzIChzZXNzaW9uICE9IE5VTEwpOworICAgIGdfb2JqZWN0X3VucmVmIChzZXNzaW9uKTsKKworICAgIC8qIHJlbGVhc2UgdGhlIFJUQ1AgcGFkICovCisgICAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAocnRwYmluLCBydGNwX3NyYyk7CisgICAgLyogd2Ugc2hvdWxkIG9ubHkgaGF2ZSBvdXIgcmVmcyB0byB0aGUgcGFkcyBub3cgKi8KKyAgICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChydHBfc2luaywgInJ0cF9zaW5rIiwgMSk7CisgICAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAocnRwX3NyYywgInJ0cF9zcmMiLCAxKTsKKyAgICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChydGNwX3NyYywgInJ0cF9zcmMiLCAxKTsKKworICAgIC8qIHRoZSBzZXNzaW9uIHNob3VsZCBiZSBnb25lIG5vdyAqLworICAgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAocnRwYmluLCAiZ2V0LWludGVybmFsLXNlc3Npb24iLCAwLCAmc2Vzc2lvbik7CisgICAgZmFpbF91bmxlc3MgKHNlc3Npb24gPT0gTlVMTCk7CisKKyAgICAvKiB1bnJlZiB0aGUgcmVxdWVzdCBwYWQgYW5kIHRoZSBzdGF0aWMgcGFkICovCisgICAgZ3N0X29iamVjdF91bnJlZiAocnRwX3NpbmspOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cF9zcmMpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHJ0Y3Bfc3JjKTsKKyAgfQorCisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cGJpbik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ3VpbnQxNiBzZXFudW07CisgIGdib29sZWFuIHBhZF9hZGRlZDsKKyAgR3N0UGFkICpwYWQ7CisgIEdNdXRleCBsb2NrOworICBHQ29uZCBjb25kOworICBHc3RQYWQgKnNpbmtwYWQ7CisgIEdMaXN0ICpwYWRzOworICBHc3RDYXBzICpjYXBzOworfSBDbGVhbnVwRGF0YTsKKworc3RhdGljIHZvaWQKK2luaXRfZGF0YSAoQ2xlYW51cERhdGEgKiBkYXRhKQoreworICBkYXRhLT5zZXFudW0gPSAxMDsKKyAgZGF0YS0+cGFkX2FkZGVkID0gRkFMU0U7CisgIGdfbXV0ZXhfaW5pdCAoJmRhdGEtPmxvY2spOworICBnX2NvbmRfaW5pdCAoJmRhdGEtPmNvbmQpOworICBkYXRhLT5wYWRzID0gTlVMTDsKKyAgZGF0YS0+Y2FwcyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbl9kYXRhIChDbGVhbnVwRGF0YSAqIGRhdGEpCit7CisgIGdfbGlzdF9mb3JlYWNoIChkYXRhLT5wYWRzLCAoR0Z1bmMpIGdzdF9vYmplY3RfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoZGF0YS0+cGFkcyk7CisgIGdfbXV0ZXhfY2xlYXIgKCZkYXRhLT5sb2NrKTsKKyAgZ19jb25kX2NsZWFyICgmZGF0YS0+Y29uZCk7CisgIGlmIChkYXRhLT5jYXBzKQorICAgIGdzdF9jYXBzX3VucmVmIChkYXRhLT5jYXBzKTsKK30KKworc3RhdGljIGd1aW50OCBydHBfcGFja2V0W10gPSB7IDB4ODAsIDB4NjAsIDB4OTQsIDB4YmMsIDB4OGYsIDB4MzcsIDB4NGUsIDB4YjgsCisgIDB4NDQsIDB4YTgsIDB4ZjMsIDB4N2MsIDB4MDYsIDB4NmEsIDB4MGMsIDB4Y2UsCisgIDB4MTMsIDB4MjUsIDB4MTksIDB4NjksIDB4MWYsIDB4OTMsIDB4MjUsIDB4OWQsCisgIDB4MmIsIDB4ODIsIDB4MzEsIDB4M2IsIDB4MzYsIDB4YzEsIDB4M2MsIDB4MTMKK307CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitjaGFpbl9ydHBfcGFja2V0IChHc3RQYWQgKiBwYWQsIENsZWFudXBEYXRhICogZGF0YSkKK3sKKyAgR3N0Rmxvd1JldHVybiByZXM7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGlmIChkYXRhLT5jYXBzID09IE5VTEwpIHsKKyAgICBkYXRhLT5jYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKCJhcHBsaWNhdGlvbi94LXJ0cCwiCisgICAgICAgICJtZWRpYT0oc3RyaW5nKWF1ZGlvLCBjbG9jay1yYXRlPShpbnQpNDQxMDAsICIKKyAgICAgICAgImVuY29kaW5nLW5hbWU9KHN0cmluZylMMTYsIGVuY29kaW5nLXBhcmFtcz0oc3RyaW5nKTEsIGNoYW5uZWxzPShpbnQpMSIpOworICAgIGRhdGEtPnNlcW51bSA9IDA7CisgIH0KKworICBnc3RfcGFkX3NlbmRfZXZlbnQgKHBhZCwgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKEdTVF9PQkpFQ1RfTkFNRSAocGFkKSkpOworICBnc3RfcGFkX3NlbmRfZXZlbnQgKHBhZCwgZ3N0X2V2ZW50X25ld19jYXBzIChkYXRhLT5jYXBzKSk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfcGFkX3NlbmRfZXZlbnQgKHBhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZW9mIChydHBfcGFja2V0KSk7CisgIGdzdF9idWZmZXJfbWFwIChidWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBtZW1jcHkgKG1hcC5kYXRhLCBydHBfcGFja2V0LCBzaXplb2YgKHJ0cF9wYWNrZXQpKTsKKworICBtYXAuZGF0YVsyXSA9IChkYXRhLT5zZXFudW0gPj4gOCkgJiAweGZmOworICBtYXAuZGF0YVszXSA9IGRhdGEtPnNlcW51bSAmIDB4ZmY7CisKKyAgZGF0YS0+c2VxbnVtKys7CisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgcmVzID0gZ3N0X3BhZF9jaGFpbiAocGFkLCBidWZmZXIpOworCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitkdW1teV9jaGFpbiAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rX2ZhY3RvcnkgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIpKTsKKworCitzdGF0aWMgR3N0UGFkICoKK21ha2Vfc2lua3BhZCAoQ2xlYW51cERhdGEgKiBkYXRhKQoreworICBHc3RQYWQgKnBhZDsKKworICBwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNpbmtfZmFjdG9yeSwgInNpbmsiKTsKKworICBnc3RfcGFkX3NldF9jaGFpbl9mdW5jdGlvbiAocGFkLCBkdW1teV9jaGFpbik7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAocGFkLCBUUlVFKTsKKworICBkYXRhLT5wYWRzID0gZ19saXN0X3ByZXBlbmQgKGRhdGEtPnBhZHMsIHBhZCk7CisKKyAgcmV0dXJuIHBhZDsKK30KKworc3RhdGljIHZvaWQKK3BhZF9hZGRlZF9jYiAoR3N0RWxlbWVudCAqIHJ0cGJpbiwgR3N0UGFkICogcGFkLCBDbGVhbnVwRGF0YSAqIGRhdGEpCit7CisgIEdzdFBhZCAqc2lua3BhZDsKKworICBHU1RfREVCVUcgKCJwYWQgYWRkZWQgJXM6JXNcbiIsIEdTVF9ERUJVR19QQURfTkFNRSAocGFkKSk7CisKKyAgaWYgKEdTVF9QQURfSVNfU0lOSyAocGFkKSkKKyAgICByZXR1cm47CisKKyAgZmFpbF91bmxlc3MgKGRhdGEtPnBhZF9hZGRlZCA9PSBGQUxTRSk7CisKKyAgc2lua3BhZCA9IG1ha2Vfc2lua3BhZCAoZGF0YSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHBhZCwgc2lua3BhZCkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKworICBnX211dGV4X2xvY2sgKCZkYXRhLT5sb2NrKTsKKyAgZGF0YS0+cGFkX2FkZGVkID0gVFJVRTsKKyAgZGF0YS0+cGFkID0gcGFkOworICBnX2NvbmRfc2lnbmFsICgmZGF0YS0+Y29uZCk7CisgIGdfbXV0ZXhfdW5sb2NrICgmZGF0YS0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCitwYWRfcmVtb3ZlZF9jYiAoR3N0RWxlbWVudCAqIHJ0cGJpbiwgR3N0UGFkICogcGFkLCBDbGVhbnVwRGF0YSAqIGRhdGEpCit7CisgIEdTVF9ERUJVRyAoInBhZCByZW1vdmVkICVzOiVzXG4iLCBHU1RfREVCVUdfUEFEX05BTUUgKHBhZCkpOworCisgIGlmIChkYXRhLT5wYWQgIT0gcGFkKQorICAgIHJldHVybjsKKworICBmYWlsX3VubGVzcyAoZGF0YS0+cGFkX2FkZGVkID09IFRSVUUpOworCisgIGdfbXV0ZXhfbG9jayAoJmRhdGEtPmxvY2spOworICBkYXRhLT5wYWRfYWRkZWQgPSBGQUxTRTsKKyAgZ19jb25kX3NpZ25hbCAoJmRhdGEtPmNvbmQpOworICBnX211dGV4X3VubG9jayAoJmRhdGEtPmxvY2spOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9jbGVhbnVwX3JlY3YpCit7CisgIEdzdEVsZW1lbnQgKnJ0cGJpbjsKKyAgR3N0UGFkICpydHBfc2luazsKKyAgQ2xlYW51cERhdGEgZGF0YTsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RGbG93UmV0dXJuIHJlczsKKyAgZ2ludCBjb3VudCA9IDI7CisKKyAgaW5pdF9kYXRhICgmZGF0YSk7CisKKyAgcnRwYmluID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwYmluIiwgInJ0cGJpbiIpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cGJpbiwgInBhZC1hZGRlZCIsIChHQ2FsbGJhY2spIHBhZF9hZGRlZF9jYiwgJmRhdGEpOworICBnX3NpZ25hbF9jb25uZWN0IChydHBiaW4sICJwYWQtcmVtb3ZlZCIsIChHQ2FsbGJhY2spIHBhZF9yZW1vdmVkX2NiLCAmZGF0YSk7CisKKyAgcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChydHBiaW4sIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZmFpbF91bmxlc3MgKHJldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIHdoaWxlIChjb3VudC0tKSB7CisgICAgLyogcmVxdWVzdCBzZXNzaW9uIDAgKi8KKyAgICBydHBfc2luayA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwYmluLCAicmVjdl9ydHBfc2lua18wIik7CisgICAgZmFpbF91bmxlc3MgKHJ0cF9zaW5rICE9IE5VTEwpOworICAgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHJ0cF9zaW5rLCAicnRwX3NpbmsiLCAyKTsKKworICAgIC8qIG5vIHNvdXJjZXBhZHMgYXJlIGNyZWF0ZWQgeWV0ICovCisgICAgZmFpbF91bmxlc3MgKHJ0cGJpbi0+bnVtc2lua3BhZHMgPT0gMSk7CisgICAgZmFpbF91bmxlc3MgKHJ0cGJpbi0+bnVtc3JjcGFkcyA9PSAwKTsKKworICAgIHJlcyA9IGNoYWluX3J0cF9wYWNrZXQgKHJ0cF9zaW5rLCAmZGF0YSk7CisgICAgR1NUX0RFQlVHICgicmVzICVkLCAlc1xuIiwgcmVzLCBnc3RfZmxvd19nZXRfbmFtZSAocmVzKSk7CisgICAgZmFpbF91bmxlc3MgKHJlcyA9PSBHU1RfRkxPV19PSyk7CisKKyAgICByZXMgPSBjaGFpbl9ydHBfcGFja2V0IChydHBfc2luaywgJmRhdGEpOworICAgIEdTVF9ERUJVRyAoInJlcyAlZCwgJXNcbiIsIHJlcywgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJlcykpOworICAgIGZhaWxfdW5sZXNzIChyZXMgPT0gR1NUX0ZMT1dfT0spOworCisgICAgLyogd2Ugd2FpdCBmb3IgdGhlIG5ldyBwYWQgdG8gYXBwZWFyIG5vdyAqLworICAgIGdfbXV0ZXhfbG9jayAoJmRhdGEubG9jayk7CisgICAgd2hpbGUgKCFkYXRhLnBhZF9hZGRlZCkKKyAgICAgIGdfY29uZF93YWl0ICgmZGF0YS5jb25kLCAmZGF0YS5sb2NrKTsKKyAgICBnX211dGV4X3VubG9jayAoJmRhdGEubG9jayk7CisKKyAgICAvKiBzb3VyY2VwYWQgY3JlYXRlZCBub3cgKi8KKyAgICBmYWlsX3VubGVzcyAocnRwYmluLT5udW1zaW5rcGFkcyA9PSAxKTsKKyAgICBmYWlsX3VubGVzcyAocnRwYmluLT5udW1zcmNwYWRzID09IDEpOworCisgICAgLyogcmVtb3ZlIHRoZSBzZXNzaW9uICovCisgICAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAocnRwYmluLCBydHBfc2luayk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocnRwX3NpbmspOworCisgICAgLyogcGFkIHNob3VsZCBiZSBnb25lIG5vdyAqLworICAgIGdfbXV0ZXhfbG9jayAoJmRhdGEubG9jayk7CisgICAgd2hpbGUgKGRhdGEucGFkX2FkZGVkKQorICAgICAgZ19jb25kX3dhaXQgKCZkYXRhLmNvbmQsICZkYXRhLmxvY2spOworICAgIGdfbXV0ZXhfdW5sb2NrICgmZGF0YS5sb2NrKTsKKworICAgIC8qIG5vdGhpbmcgbGVmdCBhbnltb3JlIG5vdyAqLworICAgIGZhaWxfdW5sZXNzIChydHBiaW4tPm51bXNpbmtwYWRzID09IDApOworICAgIGZhaWxfdW5sZXNzIChydHBiaW4tPm51bXNyY3BhZHMgPT0gMCk7CisgIH0KKworICByZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHJ0cGJpbiwgR1NUX1NUQVRFX05VTEwpOworICBmYWlsX3VubGVzcyAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwYmluKTsKKworICBjbGVhbl9kYXRhICgmZGF0YSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfY2xlYW51cF9yZWN2MikKK3sKKyAgR3N0RWxlbWVudCAqcnRwYmluOworICBHc3RQYWQgKnJ0cF9zaW5rOworICBDbGVhbnVwRGF0YSBkYXRhOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdEZsb3dSZXR1cm4gcmVzOworICBnaW50IGNvdW50ID0gMjsKKworICBpbml0X2RhdGEgKCZkYXRhKTsKKworICBydHBiaW4gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBiaW4iLCAicnRwYmluIik7CisKKyAgZ19zaWduYWxfY29ubmVjdCAocnRwYmluLCAicGFkLWFkZGVkIiwgKEdDYWxsYmFjaykgcGFkX2FkZGVkX2NiLCAmZGF0YSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cGJpbiwgInBhZC1yZW1vdmVkIiwgKEdDYWxsYmFjaykgcGFkX3JlbW92ZWRfY2IsICZkYXRhKTsKKworICByZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHJ0cGJpbiwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBmYWlsX3VubGVzcyAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgLyogcmVxdWVzdCBzZXNzaW9uIDAgKi8KKyAgcnRwX3NpbmsgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgInJlY3ZfcnRwX3NpbmtfMCIpOworICBmYWlsX3VubGVzcyAocnRwX3NpbmsgIT0gTlVMTCk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHJ0cF9zaW5rLCAicnRwX3NpbmsiLCAyKTsKKworICB3aGlsZSAoY291bnQtLSkgeworICAgIC8qIG5vIHNvdXJjZXBhZHMgYXJlIGNyZWF0ZWQgeWV0ICovCisgICAgZmFpbF91bmxlc3MgKHJ0cGJpbi0+bnVtc2lua3BhZHMgPT0gMSk7CisgICAgZmFpbF91bmxlc3MgKHJ0cGJpbi0+bnVtc3JjcGFkcyA9PSAwKTsKKworICAgIHJlcyA9IGNoYWluX3J0cF9wYWNrZXQgKHJ0cF9zaW5rLCAmZGF0YSk7CisgICAgR1NUX0RFQlVHICgicmVzICVkLCAlc1xuIiwgcmVzLCBnc3RfZmxvd19nZXRfbmFtZSAocmVzKSk7CisgICAgZmFpbF91bmxlc3MgKHJlcyA9PSBHU1RfRkxPV19PSyk7CisKKyAgICByZXMgPSBjaGFpbl9ydHBfcGFja2V0IChydHBfc2luaywgJmRhdGEpOworICAgIEdTVF9ERUJVRyAoInJlcyAlZCwgJXNcbiIsIHJlcywgZ3N0X2Zsb3dfZ2V0X25hbWUgKHJlcykpOworICAgIGZhaWxfdW5sZXNzIChyZXMgPT0gR1NUX0ZMT1dfT0spOworCisgICAgLyogd2Ugd2FpdCBmb3IgdGhlIG5ldyBwYWQgdG8gYXBwZWFyIG5vdyAqLworICAgIGdfbXV0ZXhfbG9jayAoJmRhdGEubG9jayk7CisgICAgd2hpbGUgKCFkYXRhLnBhZF9hZGRlZCkKKyAgICAgIGdfY29uZF93YWl0ICgmZGF0YS5jb25kLCAmZGF0YS5sb2NrKTsKKyAgICBnX211dGV4X3VubG9jayAoJmRhdGEubG9jayk7CisKKyAgICAvKiBzb3VyY2VwYWQgY3JlYXRlZCBub3cgKi8KKyAgICBmYWlsX3VubGVzcyAocnRwYmluLT5udW1zaW5rcGFkcyA9PSAxKTsKKyAgICBmYWlsX3VubGVzcyAocnRwYmluLT5udW1zcmNwYWRzID09IDEpOworCisgICAgLyogY2hhbmdlIHN0YXRlICovCisgICAgcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChydHBiaW4sIEdTVF9TVEFURV9OVUxMKTsKKyAgICBmYWlsX3VubGVzcyAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgICAvKiBwYWQgc2hvdWxkIGJlIGdvbmUgbm93ICovCisgICAgZ19tdXRleF9sb2NrICgmZGF0YS5sb2NrKTsKKyAgICB3aGlsZSAoZGF0YS5wYWRfYWRkZWQpCisgICAgICBnX2NvbmRfd2FpdCAoJmRhdGEuY29uZCwgJmRhdGEubG9jayk7CisgICAgZ19tdXRleF91bmxvY2sgKCZkYXRhLmxvY2spOworCisgICAgLyogYmFjayB0byBwbGF5aW5nIGZvciB0aGUgbmV4dCByb3VuZCAqLworICAgIHJldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocnRwYmluLCBHU1RfU1RBVEVfUExBWUlORyk7CisgICAgZmFpbF91bmxlc3MgKHJldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworICB9CisKKyAgLyogcmVtb3ZlIHRoZSBzZXNzaW9uICovCisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgcnRwX3NpbmspOworICBnc3Rfb2JqZWN0X3VucmVmIChydHBfc2luayk7CisKKyAgLyogbm90aGluZyBsZWZ0IGFueW1vcmUgbm93ICovCisgIGZhaWxfdW5sZXNzIChydHBiaW4tPm51bXNpbmtwYWRzID09IDApOworICBmYWlsX3VubGVzcyAocnRwYmluLT5udW1zcmNwYWRzID09IDApOworCisgIHJldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocnRwYmluLCBHU1RfU1RBVEVfTlVMTCk7CisgIGZhaWxfdW5sZXNzIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChydHBiaW4pOworCisgIGNsZWFuX2RhdGEgKCZkYXRhKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9yZXF1ZXN0X3BhZF9ieV90ZW1wbGF0ZV9uYW1lKQoreworICBHc3RFbGVtZW50ICpydHBiaW47CisgIEdzdFBhZCAqcnRwX3NpbmsxLCAqcnRwX3NpbmsyLCAqcnRwX3NpbmszOworCisgIHJ0cGJpbiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cGJpbiIsICJydHBiaW4iKTsKKyAgcnRwX3NpbmsxID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBiaW4sICJyZWN2X3J0cF9zaW5rXyV1Iik7CisgIGZhaWxfdW5sZXNzIChydHBfc2luazEgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKEdTVF9QQURfTkFNRSAocnRwX3NpbmsxKSwgInJlY3ZfcnRwX3NpbmtfMCIpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChydHBfc2luazEsICJydHBfc2luazEiLCAyKTsKKworICBydHBfc2luazIgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgInJlY3ZfcnRwX3NpbmtfJXUiKTsKKyAgZmFpbF91bmxlc3MgKHJ0cF9zaW5rMiAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoR1NUX1BBRF9OQU1FIChydHBfc2luazIpLCAicmVjdl9ydHBfc2lua18xIik7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHJ0cF9zaW5rMiwgInJ0cF9zaW5rMiIsIDIpOworCisgIHJ0cF9zaW5rMyA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwYmluLCAicmVjdl9ydHBfc2lua18ldSIpOworICBmYWlsX3VubGVzcyAocnRwX3NpbmszICE9IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChHU1RfUEFEX05BTUUgKHJ0cF9zaW5rMyksICJyZWN2X3J0cF9zaW5rXzIiKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAocnRwX3NpbmszLCAicnRwX3NpbmszIiwgMik7CisKKworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChydHBiaW4sIHJ0cF9zaW5rMik7CisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgcnRwX3NpbmsxKTsKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAocnRwYmluLCBydHBfc2luazMpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChydHBfc2luazMsICJydHBfc2luazMiLCAxKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAocnRwX3NpbmsyLCAicnRwX3NpbmsyIiwgMSk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHJ0cF9zaW5rMSwgInJ0cF9zaW5rIiwgMSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cF9zaW5rMSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cF9zaW5rMik7CisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cF9zaW5rMyk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwYmluKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgR3N0RWxlbWVudCAqCitlbmNvZGVyX2NiIChHc3RFbGVtZW50ICogcnRwYmluLCBndWludCBzZXNzaWQsIEdzdEVsZW1lbnQgKiBiaW4pCit7CisgIEdzdFBhZCAqc3JjcGFkLCAqc2lua3BhZDsKKworICBmYWlsX3VubGVzcyAoc2Vzc2lkID09IDIpOworCisgIEdTVF9ERUJVRyAoIm1ha2luZyBlbmNvZGVyIik7CisgIHNpbmtwYWQgPSBnc3RfZ2hvc3RfcGFkX25ld19ub190YXJnZXQgKCJydHBfc2lua18yIiwgR1NUX1BBRF9TSU5LKTsKKyAgc3JjcGFkID0gZ3N0X2dob3N0X3BhZF9uZXdfbm9fdGFyZ2V0ICgicnRwX3NyY18yIiwgR1NUX1BBRF9TUkMpOworCisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgc2lua3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgc3JjcGFkKTsKKworICByZXR1cm4gZ3N0X29iamVjdF9yZWYgKGJpbik7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK2VuY29kZXJfY2IyIChHc3RFbGVtZW50ICogcnRwYmluLCBndWludCBzZXNzaWQsIEdzdEVsZW1lbnQgKiBiaW4pCit7CisgIEdzdFBhZCAqc3JjcGFkLCAqc2lua3BhZDsKKworICBmYWlsX3VubGVzcyAoc2Vzc2lkID09IDMpOworCisgIEdTVF9ERUJVRyAoIm1ha2luZyBlbmNvZGVyIik7CisgIHNpbmtwYWQgPSBnc3RfZ2hvc3RfcGFkX25ld19ub190YXJnZXQgKCJydHBfc2lua18zIiwgR1NUX1BBRF9TSU5LKTsKKyAgc3JjcGFkID0gZ3N0X2dob3N0X3BhZF9uZXdfbm9fdGFyZ2V0ICgicnRwX3NyY18zIiwgR1NUX1BBRF9TUkMpOworCisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgc2lua3BhZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgc3JjcGFkKTsKKworICByZXR1cm4gZ3N0X29iamVjdF9yZWYgKGJpbik7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2VuY29kZXIpCit7CisgIEdzdEVsZW1lbnQgKnJ0cGJpbiwgKmJpbjsKKyAgR3N0UGFkICpydHBfc2luazEsICpydHBfc2luazI7CisgIGd1bG9uZyBpZDsKKworICBiaW4gPSBnc3RfYmluX25ldyAoInJ0cGVuYyIpOworCisgIHJ0cGJpbiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cGJpbiIsICJydHBiaW4iKTsKKworICBpZCA9IGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cGJpbiwgInJlcXVlc3QtcnRwLWVuY29kZXIiLCAoR0NhbGxiYWNrKSBlbmNvZGVyX2NiLAorICAgICAgYmluKTsKKworICBydHBfc2luazEgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgInNlbmRfcnRwX3NpbmtfMiIpOworICBmYWlsX3VubGVzcyAocnRwX3NpbmsxICE9IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChHU1RfUEFEX05BTUUgKHJ0cF9zaW5rMSksICJzZW5kX3J0cF9zaW5rXzIiKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAocnRwX3NpbmsxLCAicnRwX3NpbmsxIiwgMik7CisKKyAgZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0IChydHBiaW4sIGlkKTsKKworICBpZCA9IGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cGJpbiwgInJlcXVlc3QtcnRwLWVuY29kZXIiLCAoR0NhbGxiYWNrKSBlbmNvZGVyX2NiMiwKKyAgICAgIGJpbik7CisKKyAgcnRwX3NpbmsyID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBiaW4sICJzZW5kX3J0cF9zaW5rXzMiKTsKKyAgZmFpbF91bmxlc3MgKHJ0cF9zaW5rMiAhPSBOVUxMKTsKKworICAvKiByZW1vdmUgdGhlIHNlc3Npb24gKi8KKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAocnRwYmluLCBydHBfc2luazEpOworICBnc3Rfb2JqZWN0X3VucmVmIChydHBfc2luazEpOworCisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgcnRwX3NpbmsyKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwX3NpbmsyKTsKKworICAvKiBub3RoaW5nIGxlZnQgYW55bW9yZSBub3cgKi8KKyAgZmFpbF91bmxlc3MgKHJ0cGJpbi0+bnVtc2lua3BhZHMgPT0gMCk7CisgIGZhaWxfdW5sZXNzIChydHBiaW4tPm51bXNyY3BhZHMgPT0gMCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwYmluKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYmluKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgR3N0RWxlbWVudCAqCitkZWNvZGVyX2NiIChHc3RFbGVtZW50ICogcnRwYmluLCBndWludCBzZXNzaWQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0RWxlbWVudCAqYmluOworICBHc3RQYWQgKnNyY3BhZCwgKnNpbmtwYWQ7CisKKyAgYmluID0gZ3N0X2Jpbl9uZXcgKE5VTEwpOworCisgIEdTVF9ERUJVRyAoIm1ha2luZyBkZWNvZGVyIik7CisgIHNpbmtwYWQgPSBnc3RfZ2hvc3RfcGFkX25ld19ub190YXJnZXQgKCJydHBfc2luayIsIEdTVF9QQURfU0lOSyk7CisgIHNyY3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X25vX3RhcmdldCAoInJ0cF9zcmMiLCBHU1RfUEFEX1NSQyk7CisKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoYmluLCBzaW5rcGFkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoYmluLCBzcmNwYWQpOworCisgIHJldHVybiBiaW47Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2RlY29kZXIpCit7CisgIEdzdEVsZW1lbnQgKnJ0cGJpbjsKKyAgR3N0UGFkICpydHBfc2luazEsICpydHBfc2luazI7CisgIGd1bG9uZyBpZDsKKworCisgIHJ0cGJpbiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cGJpbiIsICJydHBiaW4iKTsKKworICBpZCA9IGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cGJpbiwgInJlcXVlc3QtcnRwLWRlY29kZXIiLCAoR0NhbGxiYWNrKSBkZWNvZGVyX2NiLAorICAgICAgTlVMTCk7CisKKyAgcnRwX3NpbmsxID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBiaW4sICJyZWN2X3J0cF9zaW5rXzIiKTsKKyAgZmFpbF91bmxlc3MgKHJ0cF9zaW5rMSAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoR1NUX1BBRF9OQU1FIChydHBfc2luazEpLCAicmVjdl9ydHBfc2lua18yIik7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHJ0cF9zaW5rMSwgInJ0cF9zaW5rMSIsIDIpOworCisgIHJ0cF9zaW5rMiA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwYmluLCAicmVjdl9ydHBfc2lua18zIik7CisgIGZhaWxfdW5sZXNzIChydHBfc2luazIgIT0gTlVMTCk7CisKKyAgZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0IChydHBiaW4sIGlkKTsKKworICAvKiByZW1vdmUgdGhlIHNlc3Npb24gKi8KKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAocnRwYmluLCBydHBfc2luazEpOworICBnc3Rfb2JqZWN0X3VucmVmIChydHBfc2luazEpOworCisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgcnRwX3NpbmsyKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwX3NpbmsyKTsKKworICAvKiBub3RoaW5nIGxlZnQgYW55bW9yZSBub3cgKi8KKyAgZmFpbF91bmxlc3MgKHJ0cGJpbi0+bnVtc2lua3BhZHMgPT0gMCk7CisgIGZhaWxfdW5sZXNzIChydHBiaW4tPm51bXNyY3BhZHMgPT0gMCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwYmluKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgR3N0RWxlbWVudCAqCithdXhfc2VuZGVyX2NiIChHc3RFbGVtZW50ICogcnRwYmluLCBndWludCBzZXNzaWQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0RWxlbWVudCAqYmluOworICBHc3RQYWQgKnNyY3BhZCwgKnNpbmtwYWQ7CisKKyAgYmluID0gKEdzdEVsZW1lbnQgKikgdXNlcl9kYXRhOworCisgIEdTVF9ERUJVRyAoIm1ha2luZyBBVVggc2VuZGVyIik7CisgIHNpbmtwYWQgPSBnc3RfZ2hvc3RfcGFkX25ld19ub190YXJnZXQgKCJzaW5rXzIiLCBHU1RfUEFEX1NJTkspOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIHNpbmtwYWQpOworCisgIHNyY3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X25vX3RhcmdldCAoInNyY18yIiwgR1NUX1BBRF9TUkMpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIHNyY3BhZCk7CisgIHNyY3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X25vX3RhcmdldCAoInNyY18xIiwgR1NUX1BBRF9TUkMpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIHNyY3BhZCk7CisgIHNyY3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X25vX3RhcmdldCAoInNyY18zIiwgR1NUX1BBRF9TUkMpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIHNyY3BhZCk7CisKKyAgcmV0dXJuIGJpbjsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYXV4X3NlbmRlcikKK3sKKyAgR3N0RWxlbWVudCAqcnRwYmluOworICBHc3RQYWQgKnJ0cF9zaW5rMSwgKnJ0cF9zcmMsICpydGNwX3NyYzsKKyAgZ3Vsb25nIGlkOworICBHc3RFbGVtZW50ICphdXhfc2VuZGVyID0gZ3N0X29iamVjdF9yZWZfc2luayAoZ3N0X2Jpbl9uZXcgKCJhdXgtc2VuZGVyIikpOworCisgIGdzdF9vYmplY3RfcmVmIChhdXhfc2VuZGVyKTsKKworICBydHBiaW4gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBiaW4iLCAicnRwYmluIik7CisKKyAgaWQgPSBnX3NpZ25hbF9jb25uZWN0IChydHBiaW4sICJyZXF1ZXN0LWF1eC1zZW5kZXIiLAorICAgICAgKEdDYWxsYmFjaykgYXV4X3NlbmRlcl9jYiwgYXV4X3NlbmRlcik7CisKKyAgcnRwX3NpbmsxID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBiaW4sICJzZW5kX3J0cF9zaW5rXzIiKTsKKyAgZmFpbF91bmxlc3MgKHJ0cF9zaW5rMSAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoR1NUX1BBRF9OQU1FIChydHBfc2luazEpLCAic2VuZF9ydHBfc2lua18yIik7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHJ0cF9zaW5rMSwgInJ0cF9zaW5rMSIsIDIpOworCisgIGdfc2lnbmFsX2hhbmRsZXJfZGlzY29ubmVjdCAocnRwYmluLCBpZCk7CisKKyAgcnRwX3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydHBiaW4sICJzZW5kX3J0cF9zcmNfMiIpOworICBmYWlsX3VubGVzcyAocnRwX3NyYyAhPSBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwX3NyYyk7CisKKyAgcnRwX3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydHBiaW4sICJzZW5kX3J0cF9zcmNfMSIpOworICBmYWlsX3VubGVzcyAocnRwX3NyYyAhPSBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwX3NyYyk7CisKKyAgcnRjcF9zcmMgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgInNlbmRfcnRjcF9zcmNfMSIpOworICBmYWlsX3VubGVzcyAocnRjcF9zcmMgIT0gTlVMTCk7CisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgcnRjcF9zcmMpOworICBnc3Rfb2JqZWN0X3VucmVmIChydGNwX3NyYyk7CisKKyAgcnRwX3NyYyA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydHBiaW4sICJzZW5kX3J0cF9zcmNfMyIpOworICBmYWlsX3VubGVzcyAocnRwX3NyYyAhPSBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwX3NyYyk7CisKKyAgLyogcmVtb3ZlIHRoZSBzZXNzaW9uICovCisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgcnRwX3NpbmsxKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwX3NpbmsxKTsKKworICAvKiBXZSBoYXZlIHNpbmtlZCB0aGUgaW5pdGlhbCByZWZlcmVuY2UgYmVmb3JlIHJldHVybmluZyBpdAorICAgKiBpbiB0aGUgcmVxdWVzdCBjYWxsYmFjaywgdGhlIHJlZiBjb3VudCBzaG91bGQgbm93IGJlIDEgYmVjYXVzZQorICAgKiB0aGUgcmV0dXJuIG9mIHRoZSBzaWduYWwgaXMgdHJhbnNmZXIgZnVsbCwgYW5kIHJ0cGJpbiBzaG91bGQKKyAgICogaGF2ZSByZWxlYXNlZCB0aGF0IHJlZmVyZW5jZSBieSBub3csIGJ1dCB3ZSBoYWQgdGFrZW4gYW4KKyAgICogZXh0cmEgcmVmZXJlbmNlIHRvIHBlcmZvcm0gdGhpcyBjaGVjaworICAgKi8KKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoYXV4X3NlbmRlciwgImF1eC1zZW5kZXIiLCAxKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChhdXhfc2VuZGVyKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwYmluKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgR3N0RWxlbWVudCAqCithdXhfcmVjZWl2ZXJfY2IgKEdzdEVsZW1lbnQgKiBydHBiaW4sIGd1aW50IHNlc3NpZCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RFbGVtZW50ICpiaW47CisgIEdzdFBhZCAqc3JjcGFkLCAqc2lua3BhZDsKKworICBiaW4gPSBnc3RfYmluX25ldyAoTlVMTCk7CisKKyAgR1NUX0RFQlVHICgibWFraW5nIEFVWCByZWNlaXZlciIpOworICBzcmNwYWQgPSBnc3RfZ2hvc3RfcGFkX25ld19ub190YXJnZXQgKCJzcmNfMiIsIEdTVF9QQURfU1JDKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoYmluLCBzcmNwYWQpOworCisgIHNpbmtwYWQgPSBnc3RfZ2hvc3RfcGFkX25ld19ub190YXJnZXQgKCJzaW5rXzIiLCBHU1RfUEFEX1NJTkspOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIHNpbmtwYWQpOworICBzaW5rcGFkID0gZ3N0X2dob3N0X3BhZF9uZXdfbm9fdGFyZ2V0ICgic2lua18xIiwgR1NUX1BBRF9TSU5LKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoYmluLCBzaW5rcGFkKTsKKyAgc2lua3BhZCA9IGdzdF9naG9zdF9wYWRfbmV3X25vX3RhcmdldCAoInNpbmtfMyIsIEdTVF9QQURfU0lOSyk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgc2lua3BhZCk7CisKKyAgcmV0dXJuIGJpbjsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYXV4X3JlY2VpdmVyKQoreworICBHc3RFbGVtZW50ICpydHBiaW47CisgIEdzdFBhZCAqcnRwX3NpbmsxLCAqcnRwX3NpbmsyLCAqcnRjcF9zaW5rOworICBndWxvbmcgaWQ7CisKKyAgcnRwYmluID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwYmluIiwgInJ0cGJpbiIpOworCisgIGlkID0gZ19zaWduYWxfY29ubmVjdCAocnRwYmluLCAicmVxdWVzdC1hdXgtcmVjZWl2ZXIiLAorICAgICAgKEdDYWxsYmFjaykgYXV4X3JlY2VpdmVyX2NiLCBOVUxMKTsKKworICBydHBfc2luazEgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgInJlY3ZfcnRwX3NpbmtfMiIpOworICBmYWlsX3VubGVzcyAocnRwX3NpbmsxICE9IE5VTEwpOworCisgIHJ0cF9zaW5rMiA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwYmluLCAicmVjdl9ydHBfc2lua18xIik7CisgIGZhaWxfdW5sZXNzIChydHBfc2luazIgIT0gTlVMTCk7CisKKyAgZ19zaWduYWxfaGFuZGxlcl9kaXNjb25uZWN0IChydHBiaW4sIGlkKTsKKworICBydGNwX3NpbmsgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgInJlY3ZfcnRjcF9zaW5rXzEiKTsKKyAgZmFpbF91bmxlc3MgKHJ0Y3Bfc2luayAhPSBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAocnRwYmluLCBydGNwX3NpbmspOworICBnc3Rfb2JqZWN0X3VucmVmIChydGNwX3NpbmspOworCisgIC8qIHJlbW92ZSB0aGUgc2Vzc2lvbiAqLworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChydHBiaW4sIHJ0cF9zaW5rMSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cF9zaW5rMSk7CisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHJ0cGJpbiwgcnRwX3NpbmsyKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwX3NpbmsyKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChydHBiaW4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3NlbmRlcl9lb3MpCit7CisgIEdzdEVsZW1lbnQgKnJ0cHNlc3Npb247CisgIEdzdEJ1ZmZlciAqcnRwX2J1ZmZlcjsKKyAgR3N0QnVmZmVyICpydGNwX2J1ZmZlcjsKKyAgR3N0UlRQQnVmZmVyIHJ0cGJ1ZiA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisgIEdzdFJUQ1BCdWZmZXIgcnRjcGJ1ZiA9IEdTVF9SVENQX0JVRkZFUl9JTklUOworICBHc3RSVENQUGFja2V0IHJ0Y3BwYWNrZXQ7CisgIHN0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSByZWN2X3RtcGwgPQorICAgICAgR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwgR1NUX1BBRF9TSU5LLCBHU1RfUEFEX0FMV0FZUywKKyAgICAgIEdTVF9TVEFUSUNfQ0FQUyAoIkFOWSIpKTsKKyAgR3N0UGFkICpzZW5kX3J0cF9zaW5rOworICBHc3RQYWQgKnJlY3ZfcnRjcF9zaW5rOworICBHc3RDYXBzICpjYXBzOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIEdzdFBhZCAqcnRwX3NpbmssICpydGNwX3Npbms7CisgIEdzdENsb2NrICpjbG9jazsKKyAgR3N0VGVzdENsb2NrICp0Y2xvY2s7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgZ3VpbnQgc3NyYyA9IDE7CisgIGd1aW50MzIgc3NyY19pbiwgcGFja2V0X2NvdW50LCBvY3RldF9jb3VudDsKKyAgZ2Jvb2xlYW4gZ290X2J5ZSA9IEZBTFNFOworCisgIGNsb2NrID0gZ3N0X3Rlc3RfY2xvY2tfbmV3ICgpOworICBnc3Rfc3lzdGVtX2Nsb2NrX3NldF9kZWZhdWx0IChjbG9jayk7CisgIHRjbG9jayA9IEdTVF9URVNUX0NMT0NLIChjbG9jayk7CisgIGdzdF90ZXN0X2Nsb2NrX3NldF90aW1lICh0Y2xvY2ssIDApOworCisgIHJ0cHNlc3Npb24gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBzZXNzaW9uIiwgTlVMTCk7CisgIHNlbmRfcnRwX3NpbmsgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cHNlc3Npb24sICJzZW5kX3J0cF9zaW5rIik7CisgIHJlY3ZfcnRjcF9zaW5rID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBzZXNzaW9uLCAicmVjdl9ydGNwX3NpbmsiKTsKKworCisgIHJ0cF9zaW5rID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkX2J5X25hbWUgKHJ0cHNlc3Npb24sICZyZWN2X3RtcGwsCisgICAgICAic2VuZF9ydHBfc3JjIik7CisgIHJ0Y3Bfc2luayA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZF9ieV9uYW1lIChydHBzZXNzaW9uLCAmcmVjdl90bXBsLAorICAgICAgInNlbmRfcnRjcF9zcmMiKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0cF9zaW5rLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChydGNwX3NpbmssIFRSVUUpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocnRwc2Vzc2lvbiwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIC8qIFNlbmQgaW5pdGlhbCBldmVudHMgKi8KKworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfc2VuZF9ldmVudCAoc2VuZF9ydHBfc2luaywKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoImlkIikpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfc2VuZF9ldmVudCAoc2VuZF9ydHBfc2luaywKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3NlbmRfZXZlbnQgKHJlY3ZfcnRjcF9zaW5rLAorICAgICAgICAgIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgiaWQiKSkpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9zZW5kX2V2ZW50IChyZWN2X3J0Y3Bfc2luaywKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIC8qIEdldCB0aGUgc3VnZ2VzdGVkIFNTUkMgZnJvbSB0aGUgcnRwc2Vzc2lvbiAqLworCisgIGNhcHMgPSBnc3RfcGFkX3F1ZXJ5X2NhcHMgKHNlbmRfcnRwX3NpbmssIE5VTEwpOworICBzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisgIGdzdF9zdHJ1Y3R1cmVfZ2V0IChzLCAic3NyYyIsIEdfVFlQRV9VSU5ULCAmc3NyYywgTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAvKiBTZW5kIGEgUlRQIHBhY2tldCAqLworCisgIHJ0cF9idWZmZXIgPSBnc3RfcnRwX2J1ZmZlcl9uZXdfYWxsb2NhdGUgKDEwLCAwLCAwKTsKKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChydHBfYnVmZmVyLCBHU1RfTUFQX1JFQURXUklURSwgJnJ0cGJ1Zik7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9zc3JjICgmcnRwYnVmLCAxKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3NlcSAoJnJ0cGJ1ZiwgMCk7CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwYnVmKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9jaGFpbiAoc2VuZF9ydHBfc2luaywgcnRwX2J1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworCisgIC8qIE1ha2Ugc3VyZSBpdCB3ZW50IHRocm91Z2ggKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX3VubGVzc19lcXVhbHNfcG9pbnRlciAoYnVmZmVycy0+ZGF0YSwgcnRwX2J1ZmZlcik7CisgIGdzdF9jaGVja19kcm9wX2J1ZmZlcnMgKCk7CisKKyAgLyogQWR2YW5jZSB0aW1lIGFuZCBzZW5kIGEgcGFja2V0IHRvIHByZXZlbnQgc291cmNlIHNlbmRlciB0aW1lb3V0ICovCisgIGdzdF90ZXN0X2Nsb2NrX3NldF90aW1lICh0Y2xvY2ssIDEgKiBHU1RfU0VDT05EKTsKKworICAvKiBKdXN0IHNlbmQgYSBzZW5kIHBhY2tldCB0byBwcmV2ZW50IHRpbWVvdXQgKi8KKyAgcnRwX2J1ZmZlciA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMTAsIDAsIDApOworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKHJ0cF9idWZmZXIsIEdTVF9NQVBfUkVBRFdSSVRFLCAmcnRwYnVmKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3NzcmMgKCZydHBidWYsIDEpOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfc2VxICgmcnRwYnVmLCAxKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3RpbWVzdGFtcCAoJnJ0cGJ1ZiwgMTApOworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cGJ1Zik7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfY2hhaW4gKHNlbmRfcnRwX3NpbmssIHJ0cF9idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKworICAvKiBNYWtlIHN1cmUgaXQgd2VudCB0aHJvdWdoICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3BvaW50ZXIgKGJ1ZmZlcnMtPmRhdGEsIHJ0cF9idWZmZXIpOworICBnc3RfY2hlY2tfZHJvcF9idWZmZXJzICgpOworCisgIC8qIEFkdmFuY2UgY2xvY2sgdHdpY2UgYW5kIHdlIHNob3VkbCBoYXZlIG9uZSBSVENQIHBhY2tldCBhdCBsZWFzdCAqLworICBnc3RfdGVzdF9jbG9ja19jcmFuayAodGNsb2NrKTsKKyAgZ3N0X3Rlc3RfY2xvY2tfY3JhbmsgKHRjbG9jayk7CisKKyAgZ19tdXRleF9sb2NrICgmY2hlY2tfbXV0ZXgpOworICB3aGlsZSAoYnVmZmVycyA9PSBOVUxMKQorICAgIGdfY29uZF93YWl0ICgmY2hlY2tfY29uZCwgJmNoZWNrX211dGV4KTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3J0Y3BfYnVmZmVyX21hcCAoYnVmZmVycy0+ZGF0YSwgR1NUX01BUF9SRUFELCAmcnRjcGJ1ZikpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcnRjcF9idWZmZXJfZ2V0X2ZpcnN0X3BhY2tldCAoJnJ0Y3BidWYsICZydGNwcGFja2V0KSk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3J0Y3BfcGFja2V0X2dldF90eXBlICgmcnRjcHBhY2tldCksCisgICAgICBHU1RfUlRDUF9UWVBFX1NSKTsKKyAgZ3N0X3J0Y3BfcGFja2V0X3NyX2dldF9zZW5kZXJfaW5mbyAoJnJ0Y3BwYWNrZXQsICZzc3JjX2luLCBOVUxMLCBOVUxMLAorICAgICAgJnBhY2tldF9jb3VudCwgJm9jdGV0X2NvdW50KTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAocGFja2V0X2NvdW50LCAyKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAob2N0ZXRfY291bnQsIDIwKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3J0Y3BfcGFja2V0X21vdmVfdG9fbmV4dCAoJnJ0Y3BwYWNrZXQpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3J0Y3BfcGFja2V0X2dldF90eXBlICgmcnRjcHBhY2tldCksCisgICAgICBHU1RfUlRDUF9UWVBFX1NERVMpOworCisgIGdzdF9ydGNwX2J1ZmZlcl91bm1hcCAoJnJ0Y3BidWYpOworICBnc3RfY2hlY2tfZHJvcF9idWZmZXJzICgpOworCisgIGdfbXV0ZXhfdW5sb2NrICgmY2hlY2tfbXV0ZXgpOworCisKKyAgLyogQ3JlYXRlIGFuZCBzZW5kIGEgdmFsaWQgUlRDUCByZXBseSBwYWNrZXQgKi8KKyAgcnRjcF9idWZmZXIgPSBnc3RfcnRjcF9idWZmZXJfbmV3ICgxNTAwKTsKKyAgZ3N0X3J0Y3BfYnVmZmVyX21hcCAocnRjcF9idWZmZXIsIEdTVF9NQVBfUkVBRFdSSVRFLCAmcnRjcGJ1Zik7CisgIGdzdF9ydGNwX2J1ZmZlcl9hZGRfcGFja2V0ICgmcnRjcGJ1ZiwgR1NUX1JUQ1BfVFlQRV9SUiwgJnJ0Y3BwYWNrZXQpOworICBnc3RfcnRjcF9wYWNrZXRfcnJfc2V0X3NzcmMgKCZydGNwcGFja2V0LCBzc3JjICsgMSk7CisgIGdzdF9ydGNwX3BhY2tldF9hZGRfcmIgKCZydGNwcGFja2V0LCBzc3JjLCAwLCAwLCAwLCAwLCAwLCAwKTsKKyAgZ3N0X3J0Y3BfYnVmZmVyX2FkZF9wYWNrZXQgKCZydGNwYnVmLCBHU1RfUlRDUF9UWVBFX1NERVMsICZydGNwcGFja2V0KTsKKyAgZ3N0X3J0Y3BfcGFja2V0X3NkZXNfYWRkX2l0ZW0gKCZydGNwcGFja2V0LCBzc3JjICsgMSk7CisgIGdzdF9ydGNwX3BhY2tldF9zZGVzX2FkZF9lbnRyeSAoJnJ0Y3BwYWNrZXQsIEdTVF9SVENQX1NERVNfQ05BTUUsIDMsCisgICAgICAoZ3VpbnQ4ICopICJhQGEiKTsKKyAgZ3N0X3J0Y3BfcGFja2V0X3NkZXNfYWRkX2VudHJ5ICgmcnRjcHBhY2tldCwgR1NUX1JUQ1BfU0RFU19OQU1FLCAyLAorICAgICAgKGd1aW50OCAqKSAiYWEiKTsKKyAgZ3N0X3J0Y3BfcGFja2V0X3NkZXNfYWRkX2VudHJ5ICgmcnRjcHBhY2tldCwgR1NUX1JUQ1BfU0RFU19FTkQsIDAsCisgICAgICAoZ3VpbnQ4ICopICIiKTsKKyAgZ3N0X3J0Y3BfYnVmZmVyX3VubWFwICgmcnRjcGJ1Zik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2NoYWluIChyZWN2X3J0Y3Bfc2luaywgcnRjcF9idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKworCisgIC8qIFNlbmQgYSBFT1MgdG8gdHJpZ2dlciBzZW5kaW5nIGEgQllFIG1lc3NhZ2UgKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfc2VuZF9ldmVudCAoc2VuZF9ydHBfc2luaywgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKworICAvKiBDcmFuayB0byBwcm9jZXNzIEVPUyBhbmQgd2FpdCBmb3IgQllFICovCisgIGZvciAoOzspIHsKKyAgICBnc3RfdGVzdF9jbG9ja19jcmFuayAodGNsb2NrKTsKKyAgICBnX211dGV4X2xvY2sgKCZjaGVja19tdXRleCk7CisgICAgd2hpbGUgKGJ1ZmZlcnMgPT0gTlVMTCkKKyAgICAgIGdfY29uZF93YWl0ICgmY2hlY2tfY29uZCwgJmNoZWNrX211dGV4KTsKKworICAgIGZhaWxfdW5sZXNzIChnc3RfcnRjcF9idWZmZXJfbWFwIChnX2xpc3RfbGFzdCAoYnVmZmVycyktPmRhdGEsIEdTVF9NQVBfUkVBRCwKKyAgICAgICAgICAgICZydGNwYnVmKSk7CisgICAgZmFpbF91bmxlc3MgKGdzdF9ydGNwX2J1ZmZlcl9nZXRfZmlyc3RfcGFja2V0ICgmcnRjcGJ1ZiwgJnJ0Y3BwYWNrZXQpKTsKKworICAgIHdoaWxlIChnc3RfcnRjcF9wYWNrZXRfbW92ZV90b19uZXh0ICgmcnRjcHBhY2tldCkpIHsKKyAgICAgIGlmIChnc3RfcnRjcF9wYWNrZXRfZ2V0X3R5cGUgKCZydGNwcGFja2V0KSA9PSBHU1RfUlRDUF9UWVBFX0JZRSkgeworICAgICAgICBnb3RfYnllID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGdfbXV0ZXhfdW5sb2NrICgmY2hlY2tfbXV0ZXgpOworICAgIGdzdF9ydGNwX2J1ZmZlcl91bm1hcCAoJnJ0Y3BidWYpOworCisgICAgaWYgKGdvdF9ieWUpCisgICAgICBicmVhazsKKyAgfQorCisgIGdzdF9jaGVja19kcm9wX2J1ZmZlcnMgKCk7CisKKworICBmYWlsX3VubGVzcyAoR1NUX1BBRF9JU19FT1MgKHJ0cF9zaW5rKSk7CisgIGZhaWxfdW5sZXNzIChHU1RfUEFEX0lTX0VPUyAocnRjcF9zaW5rKSk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChydHBfc2luaywgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHJ0Y3Bfc2luaywgRkFMU0UpOworCisgIGdzdF9jaGVja190ZWFyZG93bl9wYWRfYnlfbmFtZSAocnRwc2Vzc2lvbiwgInNlbmRfcnRwX3NyYyIpOworICBnc3RfY2hlY2tfdGVhcmRvd25fcGFkX2J5X25hbWUgKHJ0cHNlc3Npb24sICJzZW5kX3J0Y3Bfc3JjIik7CisgIGdzdF9lbGVtZW50X3JlbGVhc2VfcmVxdWVzdF9wYWQgKHJ0cHNlc3Npb24sIHNlbmRfcnRwX3NpbmspOworICBnc3Rfb2JqZWN0X3VucmVmIChzZW5kX3J0cF9zaW5rKTsKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAocnRwc2Vzc2lvbiwgcmVjdl9ydGNwX3NpbmspOworICBnc3Rfb2JqZWN0X3VucmVmIChyZWN2X3J0Y3Bfc2luayk7CisKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKHJ0cHNlc3Npb24pOworCisgIGdzdF9zeXN0ZW1fY2xvY2tfc2V0X2RlZmF1bHQgKE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChjbG9jayk7CisKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorcnRwYmluX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInJ0cGJpbiIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wYWRzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2NsZWFudXBfc2VuZCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9jbGVhbnVwX3JlY3YpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfY2xlYW51cF9yZWN2Mik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9yZXF1ZXN0X3BhZF9ieV90ZW1wbGF0ZV9uYW1lKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2VuY29kZXIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZGVjb2Rlcik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hdXhfc2VuZGVyKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2F1eF9yZWNlaXZlcik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zZW5kZXJfZW9zKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHJ0cGJpbik7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW5fYnVmZmVyX2xpc3QuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGJpbl9idWZmZXJfbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YTc3OTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBiaW5fYnVmZmVyX2xpc3QuYwpAQCAtMCwwICsxLDMzNSBAQAorLyogR1N0cmVhbWVyCisgKgorICogVW5pdCB0ZXN0IGZvciBnc3RydHBiaW4gc2VuZGluZyBydHAgcGFja2V0cyB1c2luZyBHc3RCdWZmZXJMaXN0LgorICogQ29weXJpZ2h0IChDKSAyMDA5IEJyYW5rbyBTdWJhc2ljIDxicmFua28gZG90IHN1YmFzaWMgYXQgYXhpcyBkb3QgY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisKKworI2lmIDAKKworLyogVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdCBSVFAgcGFja2V0cyBzZW50IGFzIGJ1ZmZlciBsaXN0cyBhcmUgc2VudCB0aHJvdWdoCisgKiB0aGUgcnRwYmluIGFzIHRoZXkgYXJlIHN1cHBvc2VkIHRvLCBhbmQgbm90IGNvcnJ1cHRlZCBpbiBhbnkgd2F5LgorICovCisKKworI2RlZmluZSBURVNUX0NBUFMgXAorICAiYXBwbGljYXRpb24veC1ydHAsICIgICAgICAgICAgICAgICAgXAorICAibWVkaWE9KHN0cmluZyl2aWRlbywgIiAgICAgICAgICAgICAgXAorICAiY2xvY2stcmF0ZT0oaW50KTkwMDAwLCAiICAgICAgICAgICAgXAorICAiZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjQsICIgICAgICAgXAorICAicHJvZmlsZS1sZXZlbC1pZD0oc3RyaW5nKTRkNDAxNSwgIiAgXAorICAicGF5bG9hZD0oaW50KTk2LCAiICAgICAgICAgICAgICAgICAgXAorICAic3NyYz0oZ3VpbnQpMjYzMzIzNzQzMiwgIiAgICAgICAgICAgXAorICAiY2xvY2stYmFzZT0oZ3VpbnQpMTg2ODI2NzAxNSwgIiAgICAgXAorICAic2VxbnVtLWJhc2U9KGd1aW50KTU0MjI5IgorCisKKy8qIFJUUCBoZWFkZXJzIGFuZCB0aGUgZmlyc3QgMiBieXRlcyBvZiB0aGUgcGF5bG9hZCAoRlUgaW5kaWNhdG9yIGFuZCBGVSBoZWFkZXIpCisgKi8KK3N0YXRpYyBjb25zdCBndWludDggcnRwX2hlYWRlclsyXVsxNF0gPSB7CisgIHsweDgwLCAweDYwLCAweGJiLCAweGI3LCAweDVjLCAweGU5LCAweDA5LAorICAgICAgMHgwZCwgMHhmNSwgMHg5YywgMHg0MywgMHg1NSwgMHgxYywgMHg4Nn0sCisgIHsweDgwLCAweDYwLCAweGJiLCAweGI4LCAweDVjLCAweGU5LCAweDA5LAorICAgICAgMHgwZCwgMHhmNSwgMHg5YywgMHg0MywgMHg1NSwgMHgxYywgMHg0Nn0KK307CisKK3N0YXRpYyBjb25zdCBndWludCBydHBfaGVhZGVyX2xlbltdID0geworICBzaXplb2YgcnRwX2hlYWRlclswXSwKKyAgc2l6ZW9mIHJ0cF9oZWFkZXJbMV0KK307CisKK3N0YXRpYyBHc3RCdWZmZXIgKmhlYWRlcl9idWZmZXJbMl0gPSB7IE5VTEwsIE5VTEwgfTsKKworCisvKiBTb21lIHBheWxvYWQuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpwYXlsb2FkID0KKyAgICAiMDEyMzQ1Njc4OUFCU0RFRjAxMjM0NTY3ODlBQlNERUYwMTIzNDU2Nzg5QUJTREVGMDEyMzQ1Njc4OUFCU0RFRjAxMjM0NTY3ODlBQlNERUYiCisgICAgIjAxMjM0NTY3ODlBQlNERUYwMTIzNDU2Nzg5QUJTREVGMDEyMzQ1Njc4OUFCU0RFRjAxMjM0NTY3ODlBQlNERUYwMTIzNDU2Nzg5QUJTREVGIgorICAgICIwMTIzNDU2Nzg5QUJTREVGMDEyMzQ1Njc4OUFCU0RFRjAxMjM0NTY3ODlBQlNERUYwMTIzNDU2Nzg5QUJTREVGMDEyMzQ1Njc4OUFCU0RFRiIKKyAgICAiMDEyMzQ1Njc4OUFCU0RFRjAxMjM0NTY3ODlBQlNERUYwMTIzNDU2Nzg5QUJTREVGMDEyMzQ1Njc4OUFCU0RFRjAxMjM0NTY3ODlBQlNERUYiCisgICAgIjAxMjM0NTY3ODlBQlNERUYwMTIzNDU2Nzg5QUJTREVGMDEyMzQ1Njc4OUFCU0RFRjAxMjM0NTY3ODlBQlNERUYwMTIzNDU2Nzg5QUJTREVGIgorICAgICIwMTIzNDU2Nzg5QUJTREVGMDEyMzQ1Njc4OUFCU0RFRjAxMjM0NTY3ODlBQlNERUYwMTIzNDU2Nzg5QUJTREVGMDEyMzQ1Njc4OUFCU0RFRiIKKyAgICAiMDEyMzQ1Njc4OUFCU0RFRjAxMjM0NTYiOworCitzdGF0aWMgY29uc3QgZ3VpbnQgcGF5bG9hZF9vZmZzZXRbXSA9IHsKKyAgMCwgNDk4Cit9OworCitzdGF0aWMgY29uc3QgZ3VpbnQgcGF5bG9hZF9sZW5bXSA9IHsKKyAgNDk4LCA1Cit9OworCisKK3N0YXRpYyBHc3RCdWZmZXIgKm9yaWdpbmFsX2J1ZmZlciA9IE5VTEw7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImFwcGxpY2F0aW9uL3gtcnRwIikpOworCisKK3N0YXRpYyBHc3RCdWZmZXIgKgorX2NyZWF0ZV9vcmlnaW5hbF9idWZmZXIgKHZvaWQpCit7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgaWYgKG9yaWdpbmFsX2J1ZmZlciAhPSBOVUxMKQorICAgIHJldHVybiBvcmlnaW5hbF9idWZmZXI7CisKKyAgb3JpZ2luYWxfYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgIGZhaWxfdW5sZXNzIChvcmlnaW5hbF9idWZmZXIgIT0gTlVMTCk7CisKKyAgZ3N0X2J1ZmZlcl9zZXRfZGF0YSAob3JpZ2luYWxfYnVmZmVyLCAoZ3VpbnQ4ICopIHBheWxvYWQsIHN0cmxlbiAocGF5bG9hZCkpOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3JpZ2luYWxfYnVmZmVyKSA9CisgICAgICBnc3RfY2xvY2tfZ2V0X2ludGVybmFsX3RpbWUgKGdzdF9zeXN0ZW1fY2xvY2tfb2J0YWluICgpKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKFRFU1RfQ0FQUyk7CisgIGZhaWxfdW5sZXNzIChjYXBzICE9IE5VTEwpOworICBnc3RfYnVmZmVyX3NldF9jYXBzIChvcmlnaW5hbF9idWZmZXIsIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgcmV0dXJuIG9yaWdpbmFsX2J1ZmZlcjsKK30KKworc3RhdGljIEdzdEJ1ZmZlckxpc3QgKgorX2NyZWF0ZV9idWZmZXJfbGlzdCAodm9pZCkKK3sKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdDsKKyAgR3N0QnVmZmVyTGlzdEl0ZXJhdG9yICppdDsKKyAgR3N0QnVmZmVyICpvcmlnX2J1ZmZlcjsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisKKyAgb3JpZ19idWZmZXIgPSBfY3JlYXRlX29yaWdpbmFsX2J1ZmZlciAoKTsKKyAgZmFpbF9pZiAob3JpZ19idWZmZXIgPT0gTlVMTCk7CisKKyAgbGlzdCA9IGdzdF9idWZmZXJfbGlzdF9uZXcgKCk7CisgIGZhaWxfaWYgKGxpc3QgPT0gTlVMTCk7CisKKyAgaXQgPSBnc3RfYnVmZmVyX2xpc3RfaXRlcmF0ZSAobGlzdCk7CisgIGZhaWxfaWYgKGl0ID09IE5VTEwpOworCisgIC8qKiogRmlyc3QgZ3JvdXAsIGkuZS4gZmlyc3QgcGFja2V0LiAqKi8KKyAgZ3N0X2J1ZmZlcl9saXN0X2l0ZXJhdG9yX2FkZF9ncm91cCAoaXQpOworCisgIC8qIENyZWF0ZSBidWZmZXIgd2l0aCBSVFAgaGVhZGVyIGFuZCBhZGQgaXQgdG8gdGhlIDFzdCBncm91cCAqLworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ldyAoKTsKKyAgR1NUX0JVRkZFUl9NQUxMT0NEQVRBIChidWZmZXIpID0gZ19tZW1kdXAgKCZydHBfaGVhZGVyWzBdLCBydHBfaGVhZGVyX2xlblswXSk7CisgIEdTVF9CVUZGRVJfREFUQSAoYnVmZmVyKSA9IEdTVF9CVUZGRVJfTUFMTE9DREFUQSAoYnVmZmVyKTsKKyAgR1NUX0JVRkZFUl9TSVpFIChidWZmZXIpID0gcnRwX2hlYWRlcl9sZW5bMF07CisgIGdzdF9idWZmZXJfY29weV9tZXRhZGF0YSAoYnVmZmVyLCBvcmlnX2J1ZmZlciwgR1NUX0JVRkZFUl9DT1BZX0FMTCk7CisgIGhlYWRlcl9idWZmZXJbMF0gPSBidWZmZXI7CisgIGdzdF9idWZmZXJfbGlzdF9pdGVyYXRvcl9hZGQgKGl0LCBidWZmZXIpOworCisgIC8qIENyZWF0ZSB0aGUgcGF5bG9hZCBidWZmZXIgYW5kIGFkZCBpdCB0byB0aGUgMXN0IGdyb3VwCisgICAqLworICBidWZmZXIgPQorICAgICAgZ3N0X2J1ZmZlcl9jcmVhdGVfc3ViIChvcmlnX2J1ZmZlciwgcGF5bG9hZF9vZmZzZXRbMF0sIHBheWxvYWRfbGVuWzBdKTsKKyAgZmFpbF9pZiAoYnVmZmVyID09IE5VTEwpOworICBnc3RfYnVmZmVyX2xpc3RfaXRlcmF0b3JfYWRkIChpdCwgYnVmZmVyKTsKKworCisgIC8qKiogIFNlY29uZCBncm91cCwgaS5lLiBzZWNvbmQgcGFja2V0LiAqKiovCisKKyAgLyogQ3JlYXRlIGEgbmV3IGdyb3VwIHRvIGhvbGQgdGhlIHJ0cCBoZWFkZXIgYW5kIHRoZSBwYXlsb2FkICovCisgIGdzdF9idWZmZXJfbGlzdF9pdGVyYXRvcl9hZGRfZ3JvdXAgKGl0KTsKKworICAvKiBDcmVhdGUgYnVmZmVyIHdpdGggUlRQIGhlYWRlciBhbmQgYWRkIGl0IHRvIHRoZSAybmQgZ3JvdXAgKi8KKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXcgKCk7CisgIEdTVF9CVUZGRVJfTUFMTE9DREFUQSAoYnVmZmVyKSA9IGdfbWVtZHVwICgmcnRwX2hlYWRlclsxXSwgcnRwX2hlYWRlcl9sZW5bMV0pOworICBHU1RfQlVGRkVSX0RBVEEgKGJ1ZmZlcikgPSBHU1RfQlVGRkVSX01BTExPQ0RBVEEgKGJ1ZmZlcik7CisgIEdTVF9CVUZGRVJfU0laRSAoYnVmZmVyKSA9IHJ0cF9oZWFkZXJfbGVuWzFdOworICBnc3RfYnVmZmVyX2NvcHlfbWV0YWRhdGEgKGJ1ZmZlciwgb3JpZ19idWZmZXIsIEdTVF9CVUZGRVJfQ09QWV9BTEwpOworICBoZWFkZXJfYnVmZmVyWzFdID0gYnVmZmVyOworCisgIC8qIEFkZCB0aGUgcnRwIGhlYWRlciB0byB0aGUgYnVmZmVyIGxpc3QgKi8KKyAgZ3N0X2J1ZmZlcl9saXN0X2l0ZXJhdG9yX2FkZCAoaXQsIGJ1ZmZlcik7CisKKyAgLyogQ3JlYXRlIHRoZSBwYXlsb2FkIGJ1ZmZlciBhbmQgYWRkIGl0IHRvIHRoZSAyZCBncm91cAorICAgKi8KKyAgYnVmZmVyID0KKyAgICAgIGdzdF9idWZmZXJfY3JlYXRlX3N1YiAob3JpZ19idWZmZXIsIHBheWxvYWRfb2Zmc2V0WzFdLCBwYXlsb2FkX2xlblsxXSk7CisgIGZhaWxfaWYgKGJ1ZmZlciA9PSBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9saXN0X2l0ZXJhdG9yX2FkZCAoaXQsIGJ1ZmZlcik7CisKKyAgZ3N0X2J1ZmZlcl9saXN0X2l0ZXJhdG9yX2ZyZWUgKGl0KTsKKworICByZXR1cm4gbGlzdDsKK30KKworCitzdGF0aWMgdm9pZAorX2NoZWNrX2hlYWRlciAoR3N0QnVmZmVyICogYnVmZmVyLCBndWludCBpbmRleCkKK3sKKyAgZ3VpbnQ4ICpkYXRhOworCisgIGZhaWxfaWYgKGJ1ZmZlciA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGluZGV4IDwgMik7CisKKyAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfU0laRSAoYnVmZmVyKSA9PSBydHBfaGVhZGVyX2xlbltpbmRleF0pOworCisgIC8qIENhbid0IGRvIGEgbWVtY21wKCkgb24gdGhlIHdob2xlIGhlYWRlciwgY2F1c2UgdGhlIFNTUkMgKGJ5dGVzIDgtMTEpIHdpbGwKKyAgICogbW9zdCBsaWtlbHkgYmUgY2hhbmdlZCBpbiBnc3RydHBiaW4uCisgICAqLworICBmYWlsX3VubGVzcyAoKGRhdGEgPSBHU1RfQlVGRkVSX0RBVEEgKGJ1ZmZlcikpICE9IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0ICgqKGd1aW50NjQgKikgZGF0YSwgKihndWludDY0ICopIHJ0cF9oZWFkZXJbaW5kZXhdKTsKKyAgZmFpbF91bmxlc3MgKCooZ3VpbnQxNiAqKSAoZGF0YSArIDEyKSA9PQorICAgICAgKihndWludDE2ICopIChydHBfaGVhZGVyW2luZGV4XSArIDEyKSk7Cit9CisKKworc3RhdGljIHZvaWQKK19jaGVja19wYXlsb2FkIChHc3RCdWZmZXIgKiBidWZmZXIsIGd1aW50IGluZGV4KQoreworICBmYWlsX2lmIChidWZmZXIgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChpbmRleCA8IDIpOworCisgIGZhaWxfdW5sZXNzIChHU1RfQlVGRkVSX1NJWkUgKGJ1ZmZlcikgPT0gcGF5bG9hZF9sZW5baW5kZXhdKTsKKyAgZmFpbF9pZiAoR1NUX0JVRkZFUl9EQVRBIChidWZmZXIpICE9CisgICAgICAoZ3BvaW50ZXIpIChwYXlsb2FkICsgcGF5bG9hZF9vZmZzZXRbaW5kZXhdKSk7CisgIGZhaWxfaWYgKG1lbWNtcCAoR1NUX0JVRkZFUl9EQVRBIChidWZmZXIpLCBwYXlsb2FkICsgcGF5bG9hZF9vZmZzZXRbaW5kZXhdLAorICAgICAgICAgIHBheWxvYWRfbGVuW2luZGV4XSkpOworfQorCisKK3N0YXRpYyB2b2lkCitfY2hlY2tfZ3JvdXAgKEdzdEJ1ZmZlckxpc3RJdGVyYXRvciAqIGl0LCBndWludCBpbmRleCwgR3N0Q2FwcyAqIGNhcHMpCit7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworCisgIGZhaWxfdW5sZXNzIChpdCAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbGlzdF9pdGVyYXRvcl9uX2J1ZmZlcnMgKGl0KSA9PSAyKTsKKyAgZmFpbF91bmxlc3MgKGNhcHMgIT0gTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKChidWZmZXIgPSBnc3RfYnVmZmVyX2xpc3RfaXRlcmF0b3JfbmV4dCAoaXQpKSAhPSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcikgPT0KKyAgICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChvcmlnaW5hbF9idWZmZXIpKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfaXNfZXF1YWwgKEdTVF9CVUZGRVJfQ0FQUyAob3JpZ2luYWxfYnVmZmVyKSwKKyAgICAgICAgICBHU1RfQlVGRkVSX0NBUFMgKGJ1ZmZlcikpKTsKKworICBfY2hlY2tfaGVhZGVyIChidWZmZXIsIGluZGV4KTsKKworICBmYWlsX3VubGVzcyAoKGJ1ZmZlciA9IGdzdF9idWZmZXJfbGlzdF9pdGVyYXRvcl9uZXh0IChpdCkpICE9IE5VTEwpOworICBfY2hlY2tfcGF5bG9hZCAoYnVmZmVyLCBpbmRleCk7Cit9CisKKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK19zaW5rX2NoYWluX2xpc3QgKEdzdFBhZCAqIHBhZCwgR3N0QnVmZmVyTGlzdCAqIGxpc3QpCit7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdEJ1ZmZlckxpc3RJdGVyYXRvciAqaXQ7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChURVNUX0NBUFMpOworICBmYWlsX3VubGVzcyAoY2FwcyAhPSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoR1NUX0lTX0JVRkZFUl9MSVNUIChsaXN0KSk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2xpc3Rfbl9ncm91cHMgKGxpc3QpID09IDIpOworCisgIGl0ID0gZ3N0X2J1ZmZlcl9saXN0X2l0ZXJhdGUgKGxpc3QpOworICBmYWlsX2lmIChpdCA9PSBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9saXN0X2l0ZXJhdG9yX25leHRfZ3JvdXAgKGl0KSk7CisgIF9jaGVja19ncm91cCAoaXQsIDAsIGNhcHMpOworCisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX2xpc3RfaXRlcmF0b3JfbmV4dF9ncm91cCAoaXQpKTsKKyAgX2NoZWNrX2dyb3VwIChpdCwgMSwgY2Fwcyk7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICBnc3RfYnVmZmVyX2xpc3RfaXRlcmF0b3JfZnJlZSAoaXQpOworCisgIGdzdF9idWZmZXJfbGlzdF91bnJlZiAobGlzdCk7CisKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCisKK3N0YXRpYyB2b2lkCitfc2V0X2NoYWluX2Z1bmN0aW9ucyAoR3N0UGFkICogcGFkKQoreworICBnc3RfcGFkX3NldF9jaGFpbl9saXN0X2Z1bmN0aW9uIChwYWQsIF9zaW5rX2NoYWluX2xpc3QpOworfQorCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2J1ZmZlcmxpc3QpCit7CisgIEdzdEVsZW1lbnQgKnJ0cGJpbjsKKyAgR3N0UGFkICpzaW5rcGFkOworICBHc3RQYWQgKnNyY3BhZDsKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdDsKKworICBsaXN0ID0gX2NyZWF0ZV9idWZmZXJfbGlzdCAoKTsKKyAgZmFpbF91bmxlc3MgKGxpc3QgIT0gTlVMTCk7CisKKyAgcnRwYmluID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJnc3RydHBiaW4iKTsKKworICBzcmNwYWQgPQorICAgICAgZ3N0X2NoZWNrX3NldHVwX3NyY19wYWRfYnlfbmFtZSAocnRwYmluLCAmc3JjdGVtcGxhdGUsICJzZW5kX3J0cF9zaW5rXzAiKTsKKyAgZmFpbF9pZiAoc3JjcGFkID09IE5VTEwpOworICBzaW5rcGFkID0KKyAgICAgIGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZF9ieV9uYW1lIChydHBiaW4sICZzaW5rdGVtcGxhdGUsCisgICAgICAic2VuZF9ydHBfc3JjXzAiKTsKKyAgZmFpbF9pZiAoc2lua3BhZCA9PSBOVUxMKTsKKworICBfc2V0X2NoYWluX2Z1bmN0aW9ucyAoc2lua3BhZCk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzaW5rcGFkLCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChydHBiaW4sIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9saXN0IChzcmNwYWQsIGxpc3QpID09IEdTVF9GTE9XX09LKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzaW5rcGFkLCBGQUxTRSk7CisKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3BhZF9ieV9uYW1lIChydHBiaW4sICJzZW5kX3J0cF9zcmNfMCIpOworICBnc3RfY2hlY2tfdGVhcmRvd25fcGFkX2J5X25hbWUgKHJ0cGJpbiwgInNlbmRfcnRwX3NpbmtfMCIpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAocnRwYmluKTsKK30KKworR1NUX0VORF9URVNUOworCisjZW5kaWYKKworCitzdGF0aWMgU3VpdGUgKgorYnVmZmVybGlzdF9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJCdWZmZXJMaXN0Iik7CisKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIC8qIHRpbWUgb3V0IGFmdGVyIDMwcy4gKi8KKyAgdGNhc2Vfc2V0X3RpbWVvdXQgKHRjX2NoYWluLCAxMCk7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisjaWYgMAorICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYnVmZmVybGlzdCk7CisjZW5kaWYKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKGJ1ZmZlcmxpc3QpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYnVuZGxlLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBidW5kbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjQ3N2UxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwYnVuZGxlLmMKQEAgLTAsMCArMSwzOTAgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBJZ2FsaWEgUy5MLgorICogICBAYXV0aG9yIFBoaWxpcHBlIE5vcm1hbmQgPHBoaWxuQGlnYWxpYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3Rjb25zaXN0ZW5jeWNoZWNrZXIuaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0dGVzdGNsb2NrLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworc3RhdGljIEdNYWluTG9vcCAqbWFpbl9sb29wOworCitzdGF0aWMgdm9pZAorbWVzc2FnZV9yZWNlaXZlZCAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgR3N0UGlwZWxpbmUgKiBiaW4pCit7CisgIEdTVF9JTkZPICgiYnVzIG1lc3NhZ2UgZnJvbSBcIiUiIEdTVF9QVFJfRk9STUFUICJcIjogJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpLCBtZXNzYWdlKTsKKworICBzd2l0Y2ggKG1lc3NhZ2UtPnR5cGUpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VPUzoKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKG1haW5fbG9vcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX1dBUk5JTkc6eworICAgICAgR0Vycm9yICpnZXJyb3I7CisgICAgICBnY2hhciAqZGVidWc7CisKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX3dhcm5pbmcgKG1lc3NhZ2UsICZnZXJyb3IsICZkZWJ1Zyk7CisgICAgICBnc3Rfb2JqZWN0X2RlZmF1bHRfZXJyb3IgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSksIGdlcnJvciwgZGVidWcpOworICAgICAgZ19lcnJvcl9mcmVlIChnZXJyb3IpOworICAgICAgZ19mcmVlIChkZWJ1Zyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FUlJPUjp7CisgICAgICBHRXJyb3IgKmdlcnJvcjsKKyAgICAgIGdjaGFyICpkZWJ1ZzsKKworICAgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1lc3NhZ2UsICZnZXJyb3IsICZkZWJ1Zyk7CisgICAgICBnc3Rfb2JqZWN0X2RlZmF1bHRfZXJyb3IgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSksIGdlcnJvciwgZGVidWcpOworICAgICAgZ19lcnJvcl9mcmVlIChnZXJyb3IpOworICAgICAgZ19mcmVlIChkZWJ1Zyk7CisgICAgICBmYWlsICgiRXJyb3IhIik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitvbl9ydHBiaW5yZWNlaXZlX3BhZF9hZGRlZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIEdzdFBhZCAqIG5ld19wYWQsCisgICAgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmUgPSBHU1RfRUxFTUVOVCAoZGF0YSk7CisgIGdjaGFyICpwYWRfbmFtZSA9IGdzdF9wYWRfZ2V0X25hbWUgKG5ld19wYWQpOworCisgIGlmIChnX3N0cl9oYXNfcHJlZml4IChwYWRfbmFtZSwgInJlY3ZfcnRwX3NyY18iKSkgeworICAgIEdzdENhcHMgKmNhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKG5ld19wYWQpOworICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICAgIGNvbnN0IGdjaGFyICptZWRpYV90eXBlID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAibWVkaWEiKTsKKyAgICBnY2hhciAqZGVwYXlsb2FkZXJfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoIiVzX3J0cGRlcGF5bG9hZGVyIiwgbWVkaWFfdHlwZSk7CisgICAgR3N0RWxlbWVudCAqcnRwZGVwYXlsb2FkZXIgPQorICAgICAgICBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksIGRlcGF5bG9hZGVyX25hbWUpOworICAgIEdzdFBhZCAqc2lua3BhZDsKKworICAgIGdfZnJlZSAoZGVwYXlsb2FkZXJfbmFtZSk7CisgICAgZmFpbF91bmxlc3MgKHJ0cGRlcGF5bG9hZGVyICE9IE5VTEwsIE5VTEwpOworCisgICAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydHBkZXBheWxvYWRlciwgInNpbmsiKTsKKyAgICBnc3RfcGFkX2xpbmsgKG5ld19wYWQsIHNpbmtwYWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cGRlcGF5bG9hZGVyKTsKKworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgfQorICBnX2ZyZWUgKHBhZF9uYW1lKTsKK30KKworc3RhdGljIGd1aW50Citvbl9idW5kbGVkX3NzcmMgKEdzdEVsZW1lbnQgKiBydHBiaW4sIGd1aW50IHNzcmMsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgc3RhdGljIGdib29sZWFuIGNyZWF0ZV9zZXNzaW9uID0gRkFMU0U7CisgIGd1aW50IHNlc3Npb25faWQgPSAwOworCisgIGlmIChjcmVhdGVfc2Vzc2lvbikgeworICAgIHNlc3Npb25faWQgPSAxOworICB9IGVsc2UgeworICAgIGNyZWF0ZV9zZXNzaW9uID0gVFJVRTsKKyAgICAvKiB1c2UgZXhpc3Rpbmcgc2Vzc2lvbiAwLCBhIG5ldyBzZXNzaW9uIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhlIG5leHQgZGlzY292ZXJlZCBidW5kbGVkIFNTUkMgKi8KKyAgfQorICByZXR1cm4gc2Vzc2lvbl9pZDsKK30KKworc3RhdGljIEdzdENhcHMgKgorb25fcmVxdWVzdF9wdF9tYXAgKEdzdEVsZW1lbnQgKiBydHBiaW4sIGd1aW50IHNlc3Npb25faWQsIGd1aW50IHB0LAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisgIGlmIChwdCA9PSA5NikgeworICAgIGNhcHMgPQorICAgICAgICBnc3RfY2Fwc19mcm9tX3N0cmluZworICAgICAgICAoImFwcGxpY2F0aW9uL3gtcnRwLG1lZGlhPShzdHJpbmcpYXVkaW8sZW5jb2RpbmctbmFtZT0oc3RyaW5nKVBDTUEsY2xvY2stcmF0ZT0oaW50KTgwMDAiKTsKKyAgfSBlbHNlIGlmIChwdCA9PSAxMDApIHsKKyAgICBjYXBzID0KKyAgICAgICAgZ3N0X2NhcHNfZnJvbV9zdHJpbmcKKyAgICAgICAgKCJhcHBsaWNhdGlvbi94LXJ0cCxtZWRpYT0oc3RyaW5nKXZpZGVvLGVuY29kaW5nLW5hbWU9KHN0cmluZylSQVcsY2xvY2stcmF0ZT0oaW50KTkwMDAwLHNhbXBsaW5nPShzdHJpbmcpXCJZQ2JDci00OjI6MFwiLGRlcHRoPShzdHJpbmcpOCx3aWR0aD0oc3RyaW5nKTMyMCxoZWlnaHQ9KHN0cmluZykyNDAiKTsKKyAgfQorICByZXR1cm4gY2FwczsKK30KKworCitzdGF0aWMgR3N0RWxlbWVudCAqCitjcmVhdGVfcGlwZWxpbmUgKGdib29sZWFuIHNlbmQpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lLCAqcnRwYmluLCAqYXVkaW9zcmMsICphdWRpb19lbmNvZGVyLAorICAgICAgKmF1ZGlvX3J0cHBheWxvYWRlciwgKnNlbmRydHBfdWRwc2luaywgKnJlY3ZfcnRwX3VkcHNyYywKKyAgICAgICpzZW5kX3J0Y3BfdWRwc2luaywgKnJlY3ZfcnRjcF91ZHBzcmMsICpzZW5kcnRjcF9mdW5uZWwsICpzZW5kcnRwX2Z1bm5lbDsKKyAgR3N0RWxlbWVudCAqYXVkaW9fcnRwZGVwYXlsb2FkZXIsICphdWRpb19kZWNvZGVyLCAqYXVkaW9fc2luazsKKyAgR3N0RWxlbWVudCAqdmlkZW9zcmMsICp2aWRlb19ydHBwYXlsb2FkZXIsICp2aWRlb19ydHBkZXBheWxvYWRlciwgKnZpZGVvX3Npbms7CisgIGdib29sZWFuIHJlczsKKyAgR3N0UGFkICpmdW5uZWxfcGFkLCAqcnRwX3NyY19wYWQ7CisgIEdzdENhcHMgKnJ0cGNhcHM7CisgIGdpbnQgcnRwX3VkcF9wb3J0ID0gNTAwMTsKKyAgZ2ludCBydGNwX3VkcF9wb3J0ID0gNTAwMjsKKworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKHNlbmQgPyAicGlwZWxpbmVfc2VuZCIgOiAicGlwZWxpbmVfcmVjZWl2ZSIpOworCisgIHJ0cGJpbiA9CisgICAgICBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBiaW4iLAorICAgICAgc2VuZCA/ICJydHBiaW5fc2VuZCIgOiAicnRwYmluX3JlY2VpdmUiKTsKKyAgZ19vYmplY3Rfc2V0IChydHBiaW4sICJsYXRlbmN5IiwgMjAwLCBOVUxMKTsKKworICBpZiAoIXNlbmQpIHsKKyAgICBnX3NpZ25hbF9jb25uZWN0IChydHBiaW4sICJvbi1idW5kbGVkLXNzcmMiLAorICAgICAgICBHX0NBTExCQUNLIChvbl9idW5kbGVkX3NzcmMpLCBOVUxMKTsKKyAgICBnX3NpZ25hbF9jb25uZWN0IChydHBiaW4sICJyZXF1ZXN0LXB0LW1hcCIsCisgICAgICAgIEdfQ0FMTEJBQ0sgKG9uX3JlcXVlc3RfcHRfbWFwKSwgTlVMTCk7CisgIH0KKworICBnX3NpZ25hbF9jb25uZWN0IChydHBiaW4sICJwYWQtYWRkZWQiLAorICAgICAgR19DQUxMQkFDSyAob25fcnRwYmlucmVjZWl2ZV9wYWRfYWRkZWQpLCBwaXBlbGluZSk7CisKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgcnRwYmluKTsKKworICBpZiAoc2VuZCkgeworICAgIGF1ZGlvc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW90ZXN0c3JjIiwgTlVMTCk7CisgICAgYXVkaW9fZW5jb2RlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImFsYXdlbmMiLCBOVUxMKTsKKyAgICBhdWRpb19ydHBwYXlsb2FkZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBwY21hcGF5IiwgTlVMTCk7CisgICAgZ19vYmplY3Rfc2V0IChhdWRpb19ydHBwYXlsb2FkZXIsICJwdCIsIDk2LCBOVUxMKTsKKyAgICBnX29iamVjdF9zZXQgKGF1ZGlvX3J0cHBheWxvYWRlciwgInNlcW51bS1vZmZzZXQiLCAxLCBOVUxMKTsKKworICAgIHZpZGVvc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgTlVMTCk7CisgICAgdmlkZW9fcnRwcGF5bG9hZGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwdnJhd3BheSIsIE5VTEwpOworICAgIGdfb2JqZWN0X3NldCAodmlkZW9fcnRwcGF5bG9hZGVyLCAicHQiLCAxMDAsICJzZXFudW0tb2Zmc2V0IiwgMSwgTlVMTCk7CisKKyAgICBnX29iamVjdF9zZXQgKGF1ZGlvc3JjLCAibnVtLWJ1ZmZlcnMiLCA1LCBOVUxMKTsKKyAgICBnX29iamVjdF9zZXQgKHZpZGVvc3JjLCAibnVtLWJ1ZmZlcnMiLCA1LCBOVUxMKTsKKworICAgIC8qIG11eGVkIHJ0Y3AgKi8KKyAgICBzZW5kcnRjcF9mdW5uZWwgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmdW5uZWwiLCAic2VuZF9ydGNwX2Z1bm5lbCIpOworICAgIHNlbmRfcnRjcF91ZHBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc2luayIsIE5VTEwpOworICAgIGdfb2JqZWN0X3NldCAoc2VuZF9ydGNwX3VkcHNpbmssICJob3N0IiwgIjEyNy4wLjAuMSIsIE5VTEwpOworICAgIGdfb2JqZWN0X3NldCAoc2VuZF9ydGNwX3VkcHNpbmssICJwb3J0IiwgcnRjcF91ZHBfcG9ydCwgTlVMTCk7CisgICAgZ19vYmplY3Rfc2V0IChzZW5kX3J0Y3BfdWRwc2luaywgInN5bmMiLCBGQUxTRSwgTlVMTCk7CisgICAgZ19vYmplY3Rfc2V0IChzZW5kX3J0Y3BfdWRwc2luaywgImFzeW5jIiwgRkFMU0UsIE5VTEwpOworCisgICAgLyogb3V0Z29pbmcgYnVuZGxlZCBzdHJlYW0gKi8KKyAgICBzZW5kcnRwX2Z1bm5lbCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZ1bm5lbCIsICJzZW5kX3J0cF9mdW5uZWwiKTsKKyAgICBzZW5kcnRwX3VkcHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzaW5rIiwgTlVMTCk7CisgICAgZ19vYmplY3Rfc2V0IChzZW5kcnRwX3VkcHNpbmssICJob3N0IiwgIjEyNy4wLjAuMSIsIE5VTEwpOworICAgIGdfb2JqZWN0X3NldCAoc2VuZHJ0cF91ZHBzaW5rLCAicG9ydCIsIHJ0cF91ZHBfcG9ydCwgTlVMTCk7CisKKyAgICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIGF1ZGlvc3JjLCBhdWRpb19lbmNvZGVyLAorICAgICAgICBhdWRpb19ydHBwYXlsb2FkZXIsIHNlbmRydHBfdWRwc2luaywgc2VuZF9ydGNwX3VkcHNpbmssCisgICAgICAgIHNlbmRydHBfZnVubmVsLCBzZW5kcnRjcF9mdW5uZWwsIHZpZGVvc3JjLCB2aWRlb19ydHBwYXlsb2FkZXIsIE5VTEwpOworCisgICAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAoYXVkaW9zcmMsIGF1ZGlvX2VuY29kZXIpOworICAgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgICAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAoYXVkaW9fZW5jb2RlciwgYXVkaW9fcnRwcGF5bG9hZGVyKTsKKyAgICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICAgIHJlcyA9CisgICAgICAgIGdzdF9lbGVtZW50X2xpbmtfcGFkc19mdWxsIChhdWRpb19ydHBwYXlsb2FkZXIsICJzcmMiLCBydHBiaW4sCisgICAgICAgICJzZW5kX3J0cF9zaW5rXzAiLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgICAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKworICAgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKHZpZGVvc3JjLCB2aWRlb19ydHBwYXlsb2FkZXIpOworICAgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgICAgcmVzID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKHZpZGVvX3J0cHBheWxvYWRlciwgInNyYyIsIHJ0cGJpbiwKKyAgICAgICAgInNlbmRfcnRwX3NpbmtfMSIsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworCisgICAgcmVzID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKHNlbmRydHBfZnVubmVsLCAic3JjIiwgc2VuZHJ0cF91ZHBzaW5rLAorICAgICAgICAic2luayIsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworCisgICAgZnVubmVsX3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoc2VuZHJ0cF9mdW5uZWwsICJzaW5rXyV1Iik7CisgICAgcnRwX3NyY19wYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocnRwYmluLCAic2VuZF9ydHBfc3JjXzAiKTsKKyAgICByZXMgPSBnc3RfcGFkX2xpbmsgKHJ0cF9zcmNfcGFkLCBmdW5uZWxfcGFkKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChmdW5uZWxfcGFkKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChydHBfc3JjX3BhZCk7CisKKyAgICBmdW5uZWxfcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChzZW5kcnRwX2Z1bm5lbCwgInNpbmtfJXUiKTsKKyAgICBydHBfc3JjX3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydHBiaW4sICJzZW5kX3J0cF9zcmNfMSIpOworICAgIHJlcyA9IGdzdF9wYWRfbGluayAocnRwX3NyY19wYWQsIGZ1bm5lbF9wYWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKGZ1bm5lbF9wYWQpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHJ0cF9zcmNfcGFkKTsKKworICAgIHJlcyA9CisgICAgICAgIGdzdF9lbGVtZW50X2xpbmtfcGFkc19mdWxsIChzZW5kcnRjcF9mdW5uZWwsICJzcmMiLCBzZW5kX3J0Y3BfdWRwc2luaywKKyAgICAgICAgInNpbmsiLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgICAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKworICAgIGZ1bm5lbF9wYWQgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHNlbmRydGNwX2Z1bm5lbCwgInNpbmtfJXUiKTsKKyAgICBydHBfc3JjX3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwYmluLCAic2VuZF9ydGNwX3NyY18wIik7CisgICAgcmVzID0KKyAgICAgICAgZ3N0X3BhZF9saW5rX2Z1bGwgKHJ0cF9zcmNfcGFkLCBmdW5uZWxfcGFkLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgICAgZ3N0X29iamVjdF91bnJlZiAoZnVubmVsX3BhZCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocnRwX3NyY19wYWQpOworCisgICAgZnVubmVsX3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoc2VuZHJ0Y3BfZnVubmVsLCAic2lua18ldSIpOworICAgIHJ0cF9zcmNfcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBiaW4sICJzZW5kX3J0Y3Bfc3JjXzEiKTsKKyAgICByZXMgPQorICAgICAgICBnc3RfcGFkX2xpbmtfZnVsbCAocnRwX3NyY19wYWQsIGZ1bm5lbF9wYWQsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChmdW5uZWxfcGFkKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChydHBfc3JjX3BhZCk7CisKKyAgfSBlbHNlIHsKKyAgICByZWN2X3J0cF91ZHBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzcmMiLCBOVUxMKTsKKyAgICBnX29iamVjdF9zZXQgKHJlY3ZfcnRwX3VkcHNyYywgInBvcnQiLCBydHBfdWRwX3BvcnQsIE5VTEwpOworICAgIHJ0cGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoImFwcGxpY2F0aW9uL3gtcnRwIik7CisgICAgZ19vYmplY3Rfc2V0IChyZWN2X3J0cF91ZHBzcmMsICJjYXBzIiwgcnRwY2FwcywgTlVMTCk7CisgICAgZ3N0X2NhcHNfdW5yZWYgKHJ0cGNhcHMpOworCisgICAgcmVjdl9ydGNwX3VkcHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNyYyIsIE5VTEwpOworICAgIGdfb2JqZWN0X3NldCAocmVjdl9ydGNwX3VkcHNyYywgInBvcnQiLCBydGNwX3VkcF9wb3J0LCBOVUxMKTsKKworICAgIGF1ZGlvX3J0cGRlcGF5bG9hZGVyID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwcGNtYWRlcGF5IiwgImF1ZGlvX3J0cGRlcGF5bG9hZGVyIik7CisgICAgYXVkaW9fZGVjb2RlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImFsYXdkZWMiLCBOVUxMKTsKKyAgICBhdWRpb19zaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCBOVUxMKTsKKyAgICBnX29iamVjdF9zZXQgKGF1ZGlvX3NpbmssICJzeW5jIiwgVFJVRSwgTlVMTCk7CisKKyAgICB2aWRlb19ydHBkZXBheWxvYWRlciA9CisgICAgICAgIGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cHZyYXdkZXBheSIsICJ2aWRlb19ydHBkZXBheWxvYWRlciIpOworICAgIHZpZGVvX3NpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsIE5VTEwpOworICAgIGdfb2JqZWN0X3NldCAodmlkZW9fc2luaywgInN5bmMiLCBUUlVFLCBOVUxMKTsKKworICAgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgcmVjdl9ydHBfdWRwc3JjLCByZWN2X3J0Y3BfdWRwc3JjLAorICAgICAgICBhdWRpb19ydHBkZXBheWxvYWRlciwgYXVkaW9fZGVjb2RlciwgYXVkaW9fc2luaywgdmlkZW9fcnRwZGVwYXlsb2FkZXIsCisgICAgICAgIHZpZGVvX3NpbmssIE5VTEwpOworCisgICAgcmVzID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKGF1ZGlvX3J0cGRlcGF5bG9hZGVyLCAic3JjIiwgYXVkaW9fZGVjb2RlciwKKyAgICAgICAgInNpbmsiLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgICAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgICByZXMgPSBnc3RfZWxlbWVudF9saW5rIChhdWRpb19kZWNvZGVyLCBhdWRpb19zaW5rKTsKKyAgICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworCisgICAgcmVzID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKHZpZGVvX3J0cGRlcGF5bG9hZGVyLCAic3JjIiwgdmlkZW9fc2luaywKKyAgICAgICAgInNpbmsiLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgICAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKworICAgIC8qIHJlcXVlc3QgYSBzaW5nbGUgcmVjZWl2aW5nIFJUUCBzZXNzaW9uLiAqLworICAgIHJlcyA9CisgICAgICAgIGdzdF9lbGVtZW50X2xpbmtfcGFkc19mdWxsIChyZWN2X3J0Y3BfdWRwc3JjLCAic3JjIiwgcnRwYmluLAorICAgICAgICAicmVjdl9ydGNwX3NpbmtfMCIsIEdTVF9QQURfTElOS19DSEVDS19OT1RISU5HKTsKKyAgICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICAgIHJlcyA9CisgICAgICAgIGdzdF9lbGVtZW50X2xpbmtfcGFkc19mdWxsIChyZWN2X3J0cF91ZHBzcmMsICJzcmMiLCBydHBiaW4sCisgICAgICAgICJyZWN2X3J0cF9zaW5rXzAiLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgICAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgfQorCisgIHJldHVybiBwaXBlbGluZTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfc2ltcGxlX3J0cGJpbl9idW5kbGUpCit7CisgIEdzdEVsZW1lbnQgKnNlbmRfcGlwZWxpbmUsICpyZWN2X3BpcGVsaW5lOworICBHc3RCdXMgKnNlbmRfYnVzLCAqcmVjdl9idXM7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHN0YXRlX3JlcyA9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKyAgR3N0RWxlbWVudCAqcnRwYmluX3JlY2VpdmU7CisgIEdPYmplY3QgKnJ0cF9zZXNzaW9uOworCisgIG1haW5fbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgRkFMU0UpOworCisgIHNlbmRfcGlwZWxpbmUgPSBjcmVhdGVfcGlwZWxpbmUgKFRSVUUpOworICByZWN2X3BpcGVsaW5lID0gY3JlYXRlX3BpcGVsaW5lIChGQUxTRSk7CisKKyAgc2VuZF9idXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChzZW5kX3BpcGVsaW5lKTsKKyAgZ3N0X2J1c19hZGRfc2lnbmFsX3dhdGNoX2Z1bGwgKHNlbmRfYnVzLCBHX1BSSU9SSVRZX0hJR0gpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNlbmRfYnVzLCAibWVzc2FnZTo6ZXJyb3IiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLAorICAgICAgc2VuZF9waXBlbGluZSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNlbmRfYnVzLCAibWVzc2FnZTo6d2FybmluZyIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsCisgICAgICBzZW5kX3BpcGVsaW5lKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoc2VuZF9idXMsICJtZXNzYWdlOjplb3MiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLAorICAgICAgc2VuZF9waXBlbGluZSk7CisKKyAgcmVjdl9idXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChyZWN2X3BpcGVsaW5lKTsKKyAgZ3N0X2J1c19hZGRfc2lnbmFsX3dhdGNoX2Z1bGwgKHJlY3ZfYnVzLCBHX1BSSU9SSVRZX0hJR0gpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJlY3ZfYnVzLCAibWVzc2FnZTo6ZXJyb3IiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLAorICAgICAgcmVjdl9waXBlbGluZSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJlY3ZfYnVzLCAibWVzc2FnZTo6d2FybmluZyIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsCisgICAgICByZWN2X3BpcGVsaW5lKTsKKyAgZ19zaWduYWxfY29ubmVjdCAocmVjdl9idXMsICJtZXNzYWdlOjplb3MiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLAorICAgICAgcmVjdl9waXBlbGluZSk7CisKKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChyZWN2X3BpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNlbmRfcGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIEdTVF9JTkZPICgiZW50ZXIgbWFpbmxvb3AiKTsKKyAgZ19tYWluX2xvb3BfcnVuIChtYWluX2xvb3ApOworICBHU1RfSU5GTyAoImV4aXQgbWFpbmxvb3AiKTsKKworICBydHBiaW5fcmVjZWl2ZSA9CisgICAgICBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChyZWN2X3BpcGVsaW5lKSwgInJ0cGJpbl9yZWNlaXZlIik7CisgIGZhaWxfaWYgKHJ0cGJpbl9yZWNlaXZlID09IE5VTEwsIE5VTEwpOworCisgIC8qIENoZWNrIHRoYXQgMiBSVFAgc2Vzc2lvbnMgd2hlcmUgY3JlYXRlZCB3aGlsZSBvbmx5IG9uZSB3YXMgZXhwbGljaXRlbHkgcmVxdWVzdGVkLiAqLworICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHJ0cGJpbl9yZWNlaXZlLCAiZ2V0LWludGVybmFsLXNlc3Npb24iLCAwLAorICAgICAgJnJ0cF9zZXNzaW9uKTsKKyAgZmFpbF9pZiAocnRwX3Nlc3Npb24gPT0gTlVMTCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChydHBfc2Vzc2lvbik7CisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAocnRwYmluX3JlY2VpdmUsICJnZXQtaW50ZXJuYWwtc2Vzc2lvbiIsIDEsCisgICAgICAmcnRwX3Nlc3Npb24pOworICBmYWlsX2lmIChydHBfc2Vzc2lvbiA9PSBOVUxMLCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKHJ0cF9zZXNzaW9uKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChydHBiaW5fcmVjZWl2ZSk7CisKKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzZW5kX3BpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHJlY3ZfcGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIC8qIGNsZWFudXAgKi8KKyAgZ19tYWluX2xvb3BfdW5yZWYgKG1haW5fbG9vcCk7CisKKyAgZ3N0X2J1c19yZW1vdmVfc2lnbmFsX3dhdGNoIChzZW5kX2J1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNlbmRfYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2VuZF9waXBlbGluZSk7CisKKyAgZ3N0X2J1c19yZW1vdmVfc2lnbmFsX3dhdGNoIChyZWN2X2J1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHJlY3ZfYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocmVjdl9waXBlbGluZSk7CisKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorcnRwYnVuZGxlX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInJ0cGJ1bmRsZSIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgdGNhc2Vfc2V0X3RpbWVvdXQgKHRjX2NoYWluLCAxMDAwMCk7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3NpbXBsZV9ydHBiaW5fYnVuZGxlKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHJ0cGJ1bmRsZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBjb2xsaXNpb24uYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGNvbGxpc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZjY2NWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBjb2xsaXNpb24uYwpAQCAtMCwwICsxLDQ2MiBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIENvbGxhYm9yYSBMdGQuCisgKiAgIEBhdXRob3IgSnVsaWVuIElzb3JjZSA8anVsaWVuLmlzb3JjZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9uZXQvZ3N0bmV0YWRkcmVzc21ldGEuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRjcGJ1ZmZlci5oPgorCitzdGF0aWMgR01haW5Mb29wICptYWluX2xvb3A7CitzdGF0aWMgR3N0UGFkICpzcmNwYWQ7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0Y3AiKQorICAgICk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0Y3AiKQorICAgICk7CisKK3N0YXRpYyB2b2lkCittZXNzYWdlX3JlY2VpdmVkIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBHc3RQaXBlbGluZSAqIGJpbikKK3sKKyAgR1NUX0lORk8gKCJidXMgbWVzc2FnZSBmcm9tIFwiJSIgR1NUX1BUUl9GT1JNQVQgIlwiOiAlIiBHU1RfUFRSX0ZPUk1BVCwKKyAgICAgIEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSksIG1lc3NhZ2UpOworCisgIHN3aXRjaCAobWVzc2FnZS0+dHlwZSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRU9TOgorICAgICAgZ19tYWluX2xvb3BfcXVpdCAobWFpbl9sb29wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01FU1NBR0VfV0FSTklORzp7CisgICAgICBHRXJyb3IgKmdlcnJvcjsKKyAgICAgIGdjaGFyICpkZWJ1ZzsKKworICAgICAgZ3N0X21lc3NhZ2VfcGFyc2Vfd2FybmluZyAobWVzc2FnZSwgJmdlcnJvciwgJmRlYnVnKTsKKyAgICAgIGdzdF9vYmplY3RfZGVmYXVsdF9lcnJvciAoR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSwgZ2Vycm9yLCBkZWJ1Zyk7CisgICAgICBnX2Vycm9yX2ZyZWUgKGdlcnJvcik7CisgICAgICBnX2ZyZWUgKGRlYnVnKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VSUk9SOnsKKyAgICAgIEdFcnJvciAqZ2Vycm9yOworICAgICAgZ2NoYXIgKmRlYnVnOworCisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobWVzc2FnZSwgJmdlcnJvciwgJmRlYnVnKTsKKyAgICAgIGdzdF9vYmplY3RfZGVmYXVsdF9lcnJvciAoR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSwgZ2Vycm9yLCBkZWJ1Zyk7CisgICAgICBnX2Vycm9yX2ZyZWUgKGdlcnJvcik7CisgICAgICBnX2ZyZWUgKGRlYnVnKTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKG1haW5fbG9vcCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorY3JlYXRlX3J0Y3BfYXBwIChndWludDMyIHNzcmMsIGd1aW50IGNvdW50KQoreworICBHSW5ldEFkZHJlc3MgKmluZXRfYWRkcl8wOworICBndWludDE2IHBvcnQgPSA1Njc4ICsgY291bnQ7CisgIEdTb2NrZXRBZGRyZXNzICpzb2NrZXRfYWRkcl8wOworICBHc3RCdWZmZXIgKnJ0Y3BfYnVmZmVyOworICBHc3RSVENQUGFja2V0ICpydGNwX3BhY2tldCA9IE5VTEw7CisgIEdzdFJUQ1BCdWZmZXIgcnRjcCA9IEdTVF9SVENQX0JVRkZFUl9JTklUOworCisgIGluZXRfYWRkcl8wID0gZ19pbmV0X2FkZHJlc3NfbmV3X2Zyb21fc3RyaW5nICgiMTkyLjE2OC4xLjEiKTsKKyAgc29ja2V0X2FkZHJfMCA9IGdfaW5ldF9zb2NrZXRfYWRkcmVzc19uZXcgKGluZXRfYWRkcl8wLCBwb3J0KTsKKyAgZ19vYmplY3RfdW5yZWYgKGluZXRfYWRkcl8wKTsKKworICBydGNwX2J1ZmZlciA9IGdzdF9ydGNwX2J1ZmZlcl9uZXcgKDE0MDApOworICBnc3RfYnVmZmVyX2FkZF9uZXRfYWRkcmVzc19tZXRhIChydGNwX2J1ZmZlciwgc29ja2V0X2FkZHJfMCk7CisgIGdfb2JqZWN0X3VucmVmIChzb2NrZXRfYWRkcl8wKTsKKworICAvKiBuZWVkIHRvIGJlZ2luIHdpdGggcnIgKi8KKyAgZ3N0X3J0Y3BfYnVmZmVyX21hcCAocnRjcF9idWZmZXIsIEdTVF9NQVBfUkVBRFdSSVRFLCAmcnRjcCk7CisgIHJ0Y3BfcGFja2V0ID0gZ19zbGljZV9uZXcwIChHc3RSVENQUGFja2V0KTsKKyAgZ3N0X3J0Y3BfYnVmZmVyX2FkZF9wYWNrZXQgKCZydGNwLCBHU1RfUlRDUF9UWVBFX1JSLCBydGNwX3BhY2tldCk7CisgIGdzdF9ydGNwX3BhY2tldF9ycl9zZXRfc3NyYyAocnRjcF9wYWNrZXQsIHNzcmMpOworICBnX3NsaWNlX2ZyZWUgKEdzdFJUQ1BQYWNrZXQsIHJ0Y3BfcGFja2V0KTsKKworICAvKiB1c2VmdWwgdG8gbWFrZSB0aGUgcnRjcCBidWZmZXIgdmFsaWQgKi8KKyAgcnRjcF9wYWNrZXQgPSBnX3NsaWNlX25ldzAgKEdzdFJUQ1BQYWNrZXQpOworICBnc3RfcnRjcF9idWZmZXJfYWRkX3BhY2tldCAoJnJ0Y3AsIEdTVF9SVENQX1RZUEVfQVBQLCBydGNwX3BhY2tldCk7CisgIGdfc2xpY2VfZnJlZSAoR3N0UlRDUFBhY2tldCwgcnRjcF9wYWNrZXQpOworICBnc3RfcnRjcF9idWZmZXJfdW5tYXAgKCZydGNwKTsKKworICByZXR1cm4gcnRjcF9idWZmZXI7Cit9CisKK3N0YXRpYyBndWludCBuYl9zc3JjX2NoYW5nZXM7CitzdGF0aWMgZ3VpbnQgc3NyY19wcmV2OworCitzdGF0aWMgR3N0UGFkUHJvYmVSZXR1cm4KK3J0cHNlc3Npb25fc2lua3BhZF9wcm9iZSAoR3N0UGFkICogcGFkLCBHc3RQYWRQcm9iZUluZm8gKiBpbmZvLAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0UGFkUHJvYmVSZXR1cm4gcmV0ID0gR1NUX1BBRF9QUk9CRV9PSzsKKworICBpZiAoaW5mby0+dHlwZSA9PSAoR1NUX1BBRF9QUk9CRV9UWVBFX0JVRkZFUiB8IEdTVF9QQURfUFJPQkVfVFlQRV9QVVNIKSkgeworICAgIEdzdEJ1ZmZlciAqYnVmZmVyID0gR1NUX0JVRkZFUiAoaW5mby0+ZGF0YSk7CisgICAgR3N0UlRQQnVmZmVyIHJ0cCA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisgICAgR3N0QnVmZmVyICpydGNwX2J1ZmZlciA9IDA7CisgICAgZ3VpbnQgc3NyYyA9IDA7CisKKyAgICAvKiByZXRyaWV2ZSBjdXJyZW50IHNzcmMgKi8KKyAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGJ1ZmZlciwgR1NUX01BUF9SRUFELCAmcnRwKTsKKyAgICBzc3JjID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3NzcmMgKCZydHApOworICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAgIC8qIGlmIG5vdCBmaXJzdCBidWZmZXIsIGNoZWNrIHRoYXQgb3VyIHNzcmMgaGFzIGNoYW5nZWQgKi8KKyAgICBpZiAoc3NyY19wcmV2ICE9IC0xICYmIHNzcmMgIT0gc3NyY19wcmV2KQorICAgICAgKytuYl9zc3JjX2NoYW5nZXM7CisKKyAgICAvKiB1cGRhdGUgcHJldiBzc3JjICovCisgICAgc3NyY19wcmV2ID0gc3NyYzsKKworICAgIC8qIGZlaW50IGEgY29sbGlzaW9uIG9uIHJlY3ZfcnRjcF9zaW5rIHBhZCBvZiBnc3RydHBzZXNzaW9uCisgICAgICogKG5vdGUgdGhhdCBhZnRlciBiZWluZyBtYXJrZWQgYXMgY29sbGllZCB0aGUgcnRwc2Vzc2lvbiBpZ25vcmVzCisgICAgICogYWxsIG5vbiBieWUgcGFja2V0cykKKyAgICAgKi8KKyAgICBydGNwX2J1ZmZlciA9IGNyZWF0ZV9ydGNwX2FwcCAoc3NyYywgbmJfc3NyY19jaGFuZ2VzKTsKKworICAgIC8qIHB1c2ggY29sbGllZCBwYWNrZXQgb24gcmVjdl9ydGNwX3NpbmsgKi8KKyAgICBnc3RfcGFkX3B1c2ggKHNyY3BhZCwgcnRjcF9idWZmZXIpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK2Zha2VfdWRwX3NpbmtfY2hhaW5fZnVuYyAoR3N0UGFkICogcGFkLCBHc3RPYmplY3QgKiBwYXJlbnQsIEdzdEJ1ZmZlciAqIGJ1ZmZlcikKK3sKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCisvKiBUaGlzIHRlc3QgYnVpbGQgdGhlIHBpcGVsaW5lIGF1ZGlvdGVzdHNyYyAhIGFsYXdlbmMgISBydHBwY21hcGF5ICEgXAorICogcnRwc2Vzc2lvbiAhIGZha2VzaW5rCisgKiBJdCBtYW51YWxseSBwdXNocyBidWZmZXIgaW50byBydHBzZXNzaW9uIHdpdGggc2FtZSBzc3JjIGJ1dCBkaWZmZXJlbnQKKyAqIGlwIHNvIHRoYXQgY29sbGlzaW9uIGNhbiBiZSBkZXRlY3RlZAorICogVGhlIHRlc3QgY2hlY2tzIHRoYXQgdGhlIHBheWxvYWRlciBjaGFuZ2UgdGhlaXIgc3NyYworICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tYXN0ZXJfc3NyY19jb2xsaXNpb24pCit7CisgIEdzdEVsZW1lbnQgKmJpbiwgKnNyYywgKmVuY29kZXIsICpydHBwYXlsb2FkZXIsICpydHBzZXNzaW9uLCAqc2luazsKKyAgR3N0QnVzICpidXMgPSBOVUxMOworICBnYm9vbGVhbiByZXMgPSBGQUxTRTsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworICBHc3RQYWQgKnNpbmtwYWQgPSBOVUxMOworICBHc3RQYWQgKnJ0Y3Bfc2lua3BhZCA9IE5VTEw7CisgIEdzdFBhZCAqZmFrZV91ZHBfc2lua3BhZCA9IE5VTEw7CisgIEdzdFBhZCAqcnRjcF9zcmNwYWQgPSBOVUxMOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiBzdGF0ZV9yZXMgPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkU7CisKKyAgR1NUX0lORk8gKCJwcmVwYXJpbmcgdGVzdCIpOworCisgIG5iX3NzcmNfY2hhbmdlcyA9IDA7CisgIHNzcmNfcHJldiA9IC0xOworCisgIC8qIGJ1aWxkIHBpcGVsaW5lICovCisgIGJpbiA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChiaW4pOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2hfZnVsbCAoYnVzLCBHX1BSSU9SSVRZX0hJR0gpOworCisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvdGVzdHNyYyIsICJzcmMiKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMsICJudW0tYnVmZmVycyIsIDUsIE5VTEwpOworICBlbmNvZGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYWxhd2VuYyIsIE5VTEwpOworICBydHBwYXlsb2FkZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBwY21hcGF5IiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAocnRwcGF5bG9hZGVyLCAicHQiLCA4LCBOVUxMKTsKKyAgcnRwc2Vzc2lvbiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cHNlc3Npb24iLCBOVUxMKTsKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgInNpbmsiKTsKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAoYmluKSwgc3JjLCBlbmNvZGVyLCBydHBwYXlsb2FkZXIsCisgICAgICBydHBzZXNzaW9uLCBzaW5rLCBOVUxMKTsKKworICAvKiBsaW5rIGVsZW1lbnRzICovCisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKHNyYywgZW5jb2Rlcik7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKGVuY29kZXIsIHJ0cHBheWxvYWRlcik7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmtfcGFkc19mdWxsIChydHBwYXlsb2FkZXIsICJzcmMiLAorICAgICAgcnRwc2Vzc2lvbiwgInNlbmRfcnRwX3NpbmsiLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmtfcGFkc19mdWxsIChydHBzZXNzaW9uLCAic2VuZF9ydHBfc3JjIiwKKyAgICAgIHNpbmssICJzaW5rIiwgR1NUX1BBRF9MSU5LX0NIRUNLX05PVEhJTkcpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworCisgIC8qIGFkZCBwcm9iZSBvbiBydHBzZXNzaW9uIHNpbmsgcGFkIHRvIGluZHVjZSBjb2xsaXNpb24gKi8KKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydHBzZXNzaW9uLCAic2VuZF9ydHBfc2luayIpOworICBnc3RfcGFkX2FkZF9wcm9iZSAoc2lua3BhZCwKKyAgICAgIChHU1RfUEFEX1BST0JFX1RZUEVfQlVGRkVSIHwgR1NUX1BBRF9QUk9CRV9UWVBFX1BVU0gpLAorICAgICAgKEdzdFBhZFByb2JlQ2FsbGJhY2spIHJ0cHNlc3Npb25fc2lua3BhZF9wcm9iZSwgTlVMTCwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworCisgIC8qIHNldHVwIHJ0Y3AgbGluayAqLworICBzcmNwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNyY3RlbXBsYXRlLCAic3JjIik7CisgIHJ0Y3Bfc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwc2Vzc2lvbiwgInJlY3ZfcnRjcF9zaW5rIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHNyY3BhZCwgcnRjcF9zaW5rcGFkKSA9PSBHU1RfUEFEX0xJTktfT0ssIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChydGNwX3NpbmtwYWQpOworICByZXMgPSBnc3RfcGFkX3NldF9hY3RpdmUgKHNyY3BhZCwgVFJVRSk7CisgIGZhaWxfaWYgKHJlcyA9PSBGQUxTRSk7CisgIHJlcyA9CisgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwKKyAgICAgIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgibXlfcnRjcF9zdHJlYW1faWQiKSk7CisgIGZhaWxfaWYgKHJlcyA9PSBGQUxTRSk7CisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICByZXMgPSBnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworICBmYWlsX2lmIChyZXMgPT0gRkFMU0UpOworCisgIGZha2VfdWRwX3NpbmtwYWQgPSBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnNpbmt0ZW1wbGF0ZSwgInNpbmsiKTsKKyAgZ3N0X3BhZF9zZXRfY2hhaW5fZnVuY3Rpb24gKGZha2VfdWRwX3NpbmtwYWQsIGZha2VfdWRwX3NpbmtfY2hhaW5fZnVuYyk7CisgIHJ0Y3Bfc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBzZXNzaW9uLCAic2VuZF9ydGNwX3NyYyIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rIChydGNwX3NyY3BhZCwgZmFrZV91ZHBfc2lua3BhZCkgPT0gR1NUX1BBRF9MSU5LX09LLAorICAgICAgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHJ0Y3Bfc3JjcGFkKTsKKyAgcmVzID0gZ3N0X3BhZF9zZXRfYWN0aXZlIChmYWtlX3VkcF9zaW5rcGFkLCBUUlVFKTsKKyAgZmFpbF9pZiAocmVzID09IEZBTFNFKTsKKworICAvKiBjb25uZWN0IG1lc3NhZ2VzICovCisgIG1haW5fbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgRkFMU0UpOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjplcnJvciIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsIGJpbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6Ondhcm5pbmciLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjplb3MiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBHU1RfSU5GTyAoInJ1bm5pbmcgbWFpbiBsb29wIik7CisgIGdfbWFpbl9sb29wX3J1biAobWFpbl9sb29wKTsKKworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX05VTEwpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgLyogY2xlYW51cCAqLworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChmYWtlX3VkcF9zaW5rcGFkKTsKKyAgZ19tYWluX2xvb3BfdW5yZWYgKG1haW5fbG9vcCk7CisgIGdzdF9idXNfcmVtb3ZlX3NpZ25hbF93YXRjaCAoYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYmluKTsKKworICAvKiBjaGVjayByZXN1bHRzICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG5iX3NzcmNfY2hhbmdlcywgNCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIGd1aW50IHNzcmNfYmVmb3JlOworc3RhdGljIGd1aW50IHNzcmNfYWZ0ZXI7CitzdGF0aWMgZ3VpbnQgcnR4X3NzcmNfYmVmb3JlOworc3RhdGljIGd1aW50IHJ0eF9zc3JjX2FmdGVyOworCitzdGF0aWMgR3N0UGFkUHJvYmVSZXR1cm4KK3J0cHNlc3Npb25fc2lua3BhZF9wcm9iZTIgKEdzdFBhZCAqIHBhZCwgR3N0UGFkUHJvYmVJbmZvICogaW5mbywKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFBhZFByb2JlUmV0dXJuIHJldCA9IEdTVF9QQURfUFJPQkVfT0s7CisKKyAgaWYgKGluZm8tPnR5cGUgPT0gKEdTVF9QQURfUFJPQkVfVFlQRV9CVUZGRVIgfCBHU1RfUEFEX1BST0JFX1RZUEVfUFVTSCkpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZmZlciA9IEdTVF9CVUZGRVIgKGluZm8tPmRhdGEpOworICAgIEdzdFJUUEJ1ZmZlciBydHAgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworICAgIGd1aW50IHBheWxvYWRfdHlwZSA9IDA7CisKKyAgICBzdGF0aWMgZ2ludCBpID0gMDsKKworICAgIC8qIHJldHJpZXZlIGN1cnJlbnQgc3NyYyBmb3IgcmV0cmFuc21pc3Npb24gc3RyZWFtIG9ubHkgKi8KKyAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGJ1ZmZlciwgR1NUX01BUF9SRUFELCAmcnRwKTsKKyAgICBwYXlsb2FkX3R5cGUgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF90eXBlICgmcnRwKTsKKyAgICBpZiAocGF5bG9hZF90eXBlID09IDk5KSB7CisgICAgICBpZiAoaSA8IDMpCisgICAgICAgIHJ0eF9zc3JjX2JlZm9yZSA9IGdzdF9ydHBfYnVmZmVyX2dldF9zc3JjICgmcnRwKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcnR4X3NzcmNfYWZ0ZXIgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfc3NyYyAoJnJ0cCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGFzayB0byByZXRyYW5zbWl0IGV2ZXJ5IHBhY2tldCAqLworICAgICAgR3N0RXZlbnQgKmV2ZW50ID0gZ3N0X2V2ZW50X25ld19jdXN0b20gKEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU0sCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJHc3RSVFBSZXRyYW5zbWlzc2lvblJlcXVlc3QiLAorICAgICAgICAgICAgICAic2VxbnVtIiwgR19UWVBFX1VJTlQsIGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKCZydHApLAorICAgICAgICAgICAgICAic3NyYyIsIEdfVFlQRV9VSU5ULCBnc3RfcnRwX2J1ZmZlcl9nZXRfc3NyYyAoJnJ0cCksCisgICAgICAgICAgICAgIE5VTEwpKTsKKyAgICAgIGdzdF9wYWRfcHVzaF9ldmVudCAocGFkLCBldmVudCk7CisKKyAgICAgIGlmIChpIDwgMykKKyAgICAgICAgc3NyY19iZWZvcmUgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfc3NyYyAoJnJ0cCk7CisgICAgICBlbHNlCisgICAgICAgIHNzcmNfYWZ0ZXIgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfc3NyYyAoJnJ0cCk7CisgICAgfQorICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICAgIC8qIGZlaW50IGEgY29sbGlzaW9uIG9uIHJlY3ZfcnRjcF9zaW5rIHBhZCBvZiBnc3RydHBzZXNzaW9uCisgICAgICogKG5vdGUgdGhhdCBhZnRlciBiZWluZyBtYXJrZWQgYXMgY29sbGllZCB0aGUgcnRwc2Vzc2lvbiBpZ25vcmVzCisgICAgICogYWxsIG5vbiBieWUgcGFja2V0cykKKyAgICAgKi8KKyAgICBpZiAoaSA9PSAyKSB7CisgICAgICBHc3RCdWZmZXIgKnJ0Y3BfYnVmZmVyID0gY3JlYXRlX3J0Y3BfYXBwIChydHhfc3NyY19iZWZvcmUsIDApOworCisgICAgICAvKiBwdXNoIGNvbGxpZWQgcGFja2V0IG9uIHJlY3ZfcnRjcF9zaW5rICovCisgICAgICBnc3RfcGFkX3B1c2ggKHNyY3BhZCwgcnRjcF9idWZmZXIpOworICAgIH0KKworICAgICsraTsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qIFRoaXMgdGVzdCBidWlsZCB0aGUgcGlwZWxpbmUgYXVkaW90ZXN0c3JjICEgYWxhd2VuYyAhIHJ0cHBjbWFwYXkgISBcCisgKiBydHBydHhzZW5kICEgcnRwc2Vzc2lvbiAhIGZha2VzaW5rCisgKiBJdCBtYW51YWxseSBwdXNocyBidWZmZXIgaW50byBydHBzZXNzaW9uIHdpdGggc2FtZSBzc3JjIHRoYW4gcnR4IHN0cmVhbQorICogYnV0IGRpZmZlcmVudCBpcCBzbyB0aGF0IGNvbGxpc2lvbiBjYW4gYmUgZGV0ZWN0ZWQKKyAqIFRoZSB0ZXN0IGNoZWNrcyB0aGF0IHRoZSBydHggZWxlbWVudHMgY2hhbmdlcyBpdHMgc3NyYyB3aGVyZWFzCisgKiB0aGUgcGF5bG9hZGVyIGtlZXBzIGl0cyBtYXN0ZXIgc3NyYworICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHhfc3NyY19jb2xsaXNpb24pCit7CisgIEdzdEVsZW1lbnQgKmJpbiwgKnNyYywgKmVuY29kZXIsICpydHBwYXlsb2FkZXIsICpydHBydHhzZW5kLCAqcnRwc2Vzc2lvbiwKKyAgICAgICpzaW5rOworICBHc3RCdXMgKmJ1cyA9IE5VTEw7CisgIGdib29sZWFuIHJlcyA9IEZBTFNFOworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIEdzdFBhZCAqc2lua3BhZCA9IE5VTEw7CisgIEdzdFBhZCAqcnRjcF9zaW5rcGFkID0gTlVMTDsKKyAgR3N0UGFkICpmYWtlX3VkcF9zaW5rcGFkID0gTlVMTDsKKyAgR3N0UGFkICpydGNwX3NyY3BhZCA9IE5VTEw7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHN0YXRlX3JlcyA9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRTsKKyAgR3N0U3RydWN0dXJlICpwdF9tYXA7CisKKyAgR1NUX0lORk8gKCJwcmVwYXJpbmcgdGVzdCIpOworCisgIC8qIGJ1aWxkIHBpcGVsaW5lICovCisgIGJpbiA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChiaW4pOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2hfZnVsbCAoYnVzLCBHX1BSSU9SSVRZX0hJR0gpOworCisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvdGVzdHNyYyIsICJzcmMiKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMsICJudW0tYnVmZmVycyIsIDUsIE5VTEwpOworICBlbmNvZGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYWxhd2VuYyIsIE5VTEwpOworICBydHBwYXlsb2FkZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBwY21hcGF5IiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAocnRwcGF5bG9hZGVyLCAicHQiLCA4LCBOVUxMKTsKKyAgcnRwcnR4c2VuZCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cHJ0eHNlbmQiLCBOVUxMKTsKKyAgcHRfbWFwID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1wdC1tYXAiLAorICAgICAgIjgiLCBHX1RZUEVfVUlOVCwgOTksIE5VTEwpOworICBnX29iamVjdF9zZXQgKHJ0cHJ0eHNlbmQsICJwYXlsb2FkLXR5cGUtbWFwIiwgcHRfbWFwLCBOVUxMKTsKKyAgZ3N0X3N0cnVjdHVyZV9mcmVlIChwdF9tYXApOworICBydHBzZXNzaW9uID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwc2Vzc2lvbiIsIE5VTEwpOworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChiaW4pLCBzcmMsIGVuY29kZXIsIHJ0cHBheWxvYWRlciwgcnRwcnR4c2VuZCwKKyAgICAgIHJ0cHNlc3Npb24sIHNpbmssIE5VTEwpOworCisgIC8qIGxpbmsgZWxlbWVudHMgKi8KKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAoc3JjLCBlbmNvZGVyKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAoZW5jb2RlciwgcnRwcGF5bG9hZGVyKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAocnRwcGF5bG9hZGVyLCBydHBydHhzZW5kKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGlua19wYWRzX2Z1bGwgKHJ0cHJ0eHNlbmQsICJzcmMiLAorICAgICAgcnRwc2Vzc2lvbiwgInNlbmRfcnRwX3NpbmsiLCBHU1RfUEFEX0xJTktfQ0hFQ0tfTk9USElORyk7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmtfcGFkc19mdWxsIChydHBzZXNzaW9uLCAic2VuZF9ydHBfc3JjIiwKKyAgICAgIHNpbmssICJzaW5rIiwgR1NUX1BBRF9MSU5LX0NIRUNLX05PVEhJTkcpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworCisgIC8qIGFkZCBwcm9iZSBvbiBydHBzZXNzaW9uIHNpbmsgcGFkIHRvIGluZHVjZSBjb2xsaXNpb24gKi8KKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydHBzZXNzaW9uLCAic2VuZF9ydHBfc2luayIpOworICBnc3RfcGFkX2FkZF9wcm9iZSAoc2lua3BhZCwKKyAgICAgIChHU1RfUEFEX1BST0JFX1RZUEVfQlVGRkVSIHwgR1NUX1BBRF9QUk9CRV9UWVBFX1BVU0gpLAorICAgICAgKEdzdFBhZFByb2JlQ2FsbGJhY2spIHJ0cHNlc3Npb25fc2lua3BhZF9wcm9iZTIsIE5VTEwsIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKworICAvKiBzZXR1cCBydGNwIGxpbmsgKi8KKyAgc3JjcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzcmN0ZW1wbGF0ZSwgInNyYyIpOworICBydGNwX3NpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHJ0cHNlc3Npb24sICJyZWN2X3J0Y3Bfc2luayIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9saW5rIChzcmNwYWQsIHJ0Y3Bfc2lua3BhZCkgPT0gR1NUX1BBRF9MSU5LX09LLCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocnRjcF9zaW5rcGFkKTsKKyAgcmVzID0gZ3N0X3BhZF9zZXRfYWN0aXZlIChzcmNwYWQsIFRSVUUpOworICBmYWlsX2lmIChyZXMgPT0gRkFMU0UpOworICByZXMgPQorICAgICAgZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmNwYWQsCisgICAgICBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoIm15X3J0Y3Bfc3RyZWFtX2lkIikpOworICBmYWlsX2lmIChyZXMgPT0gRkFMU0UpOworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgcmVzID0gZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKyAgZmFpbF9pZiAocmVzID09IEZBTFNFKTsKKworICBmYWtlX3VkcF9zaW5rcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rdGVtcGxhdGUsICJzaW5rIik7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChmYWtlX3VkcF9zaW5rcGFkLCBmYWtlX3VkcF9zaW5rX2NoYWluX2Z1bmMpOworICBydGNwX3NyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwc2Vzc2lvbiwgInNlbmRfcnRjcF9zcmMiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAocnRjcF9zcmNwYWQsIGZha2VfdWRwX3NpbmtwYWQpID09IEdTVF9QQURfTElOS19PSywKKyAgICAgIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChydGNwX3NyY3BhZCk7CisgIHJlcyA9IGdzdF9wYWRfc2V0X2FjdGl2ZSAoZmFrZV91ZHBfc2lua3BhZCwgVFJVRSk7CisgIGZhaWxfaWYgKHJlcyA9PSBGQUxTRSk7CisKKyAgLyogY29ubmVjdCBtZXNzYWdlcyAqLworICBtYWluX2xvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6ZXJyb3IiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjp3YXJuaW5nIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6ZW9zIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgR1NUX0lORk8gKCJydW5uaW5nIG1haW4gbG9vcCIpOworICBnX21haW5fbG9vcF9ydW4gKG1haW5fbG9vcCk7CisKKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9OVUxMKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIC8qIGNsZWFudXAgKi8KKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoZmFrZV91ZHBfc2lua3BhZCk7CisgIGdfbWFpbl9sb29wX3VucmVmIChtYWluX2xvb3ApOworICBnc3RfYnVzX3JlbW92ZV9zaWduYWxfd2F0Y2ggKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJpbik7CisKKyAgLyogY2hlY2sgcmVzdWx0cyAqLworICBmYWlsX2lmIChydHhfc3NyY19iZWZvcmUgPT0gcnR4X3NzcmNfYWZ0ZXIpOworICBmYWlsX2lmIChzc3JjX2JlZm9yZSAhPSBzc3JjX2FmdGVyKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorcnRwY29sbGlzaW9uX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInJ0cGNvbGxpc2lvbiIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgdGNhc2Vfc2V0X3RpbWVvdXQgKHRjX2NoYWluLCAxMCk7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X21hc3Rlcl9zc3JjX2NvbGxpc2lvbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHhfc3NyY19jb2xsaXNpb24pOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAocnRwY29sbGlzaW9uKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGgyNjEuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGgyNjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzM0ZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaDI2MS5jCkBAIC0wLDAgKzEsMTQyIEBACisjaW5jbHVkZSA8Z3N0L2NoZWNrL2NoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGhhcm5lc3MuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCisjZGVmaW5lIEgyNjFfUlRQX0NBUFNfU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhcHBsaWNhdGlvbi94LXJ0cCxtZWRpYT12aWRlbyxlbmNvZGluZy1uYW1lPUgyNjEsY2xvY2stcmF0ZT05MDAwMCxwYXlsb2FkPTMxIgorCit0eXBlZGVmIHN0cnVjdCBfR3N0UnRwSDI2MVBheUhlYWRlcgoreworI2lmIEdfQllURV9PUkRFUiA9PSBHX0xJVFRMRV9FTkRJQU4KKyAgdW5zaWduZWQgaW50IHY6MTsgICAgICAgICAgICAgLyogTW90aW9uIHZlY3RvciBmbGFnICovCisgIHVuc2lnbmVkIGludCBpOjE7ICAgICAgICAgICAgIC8qIEludHJhIGVuY29kZWQgZGF0YSAqLworICB1bnNpZ25lZCBpbnQgZWJpdDozOyAgICAgICAgICAvKiBFbmQgcG9zaXRpb24gKi8KKyAgdW5zaWduZWQgaW50IHNiaXQ6MzsgICAgICAgICAgLyogU3RhcnQgcG9zaXRpb24gKi8KKworICB1bnNpZ25lZCBpbnQgbWJhcDE6NDsgICAgICAgICAvKiBNQiBhZGRyZXNzIHByZWRpY3RvciAtIHBhcnQxICovCisgIHVuc2lnbmVkIGludCBnb2JuOjQ7ICAgICAgICAgIC8qIEdPQiBudW1iZXIgKi8KKworICB1bnNpZ25lZCBpbnQgaG12ZDE6MjsgICAgICAgICAvKiBIb3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgZGF0YSAtIHBhcnQxICovCisgIHVuc2lnbmVkIGludCBxdWFudDo1OyAgICAgICAgIC8qIFF1YW50aXplciAqLworICB1bnNpZ25lZCBpbnQgbWJhcDI6MTsgICAgICAgICAvKiBNQiBhZGRyZXNzIHByZWRpY3RvciAtIHBhcnQyICovCisKKyAgdW5zaWduZWQgaW50IHZtdmQ6NTsgICAgICAgICAgLyogSG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGRhdGEgLSBwYXJ0MSAqLworICB1bnNpZ25lZCBpbnQgaG12ZDI6MzsgICAgICAgICAvKiBWZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGRhdGEgKi8KKyNlbGlmIEdfQllURV9PUkRFUiA9PSBHX0JJR19FTkRJQU4KKyAgdW5zaWduZWQgaW50IHNiaXQ6MzsgICAgICAgICAgLyogU3RhcnQgcG9zaXRpb24gKi8KKyAgdW5zaWduZWQgaW50IGViaXQ6MzsgICAgICAgICAgLyogRW5kIHBvc2l0aW9uICovCisgIHVuc2lnbmVkIGludCBpOjE7ICAgICAgICAgICAgIC8qIEludHJhIGVuY29kZWQgZGF0YSAqLworICB1bnNpZ25lZCBpbnQgdjoxOyAgICAgICAgICAgICAvKiBNb3Rpb24gdmVjdG9yIGZsYWcgKi8KKworICB1bnNpZ25lZCBpbnQgZ29ibjo0OyAgICAgICAgICAvKiBHT0IgbnVtYmVyICovCisgIHVuc2lnbmVkIGludCBtYmFwMTo0OyAgICAgICAgIC8qIE1CIGFkZHJlc3MgcHJlZGljdG9yIC0gcGFydDEgKi8KKworICB1bnNpZ25lZCBpbnQgbWJhcDI6MTsgICAgICAgICAvKiBNQiBhZGRyZXNzIHByZWRpY3RvciAtIHBhcnQyICovCisgIHVuc2lnbmVkIGludCBxdWFudDo1OyAgICAgICAgIC8qIFF1YW50aXplciAqLworICB1bnNpZ25lZCBpbnQgaG12ZDE6MjsgICAgICAgICAvKiBIb3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgZGF0YSAtIHBhcnQxICovCisKKyAgdW5zaWduZWQgaW50IGhtdmQyOjM7ICAgICAgICAgLyogVmVydGljYWwgbW90aW9uIHZlY3RvciBkYXRhICovCisgIHVuc2lnbmVkIGludCB2bXZkOjU7ICAgICAgICAgIC8qIEhvcml6b250YWwgbW90aW9uIHZlY3RvciBkYXRhIC0gcGFydDEgKi8KKyNlbHNlCisjZXJyb3IgIkdfQllURV9PUkRFUiBzaG91bGQgYmUgYmlnIG9yIGxpdHRsZSBlbmRpYW4uIgorI2VuZGlmCit9IEdzdFJ0cEgyNjFQYXlIZWFkZXI7CisKKyNkZWZpbmUgR1NUX1JUUF9IMjYxX1BBWUxPQURfSEVBREVSX0xFTiA0CisKK3N0YXRpYyBndWludDggKgorY3JlYXRlX2gyNjFfcGF5bG9hZCAoZ2ludCBzYml0LCBnaW50IGViaXQsIGdpbnQgcHNjLCBnc2l6ZSBzaXplKQoreworICBHc3RSdHBIMjYxUGF5SGVhZGVyIGhlYWRlcjsKKyAgY29uc3QgZ2ludCBoZWFkZXJfbGVuID0gNDsKKyAgZ3VpbnQ4ICpkYXRhID0gZ19tYWxsb2MwIChzaXplKTsKKworICBtZW1zZXQgKCZoZWFkZXIsIDB4MDAsIHNpemVvZiAoaGVhZGVyKSk7CisKKyAgaGVhZGVyLnNiaXQgPSBzYml0OworICBoZWFkZXIuZWJpdCA9IGViaXQ7CisKKyAgbWVtc2V0IChkYXRhLCAweGZmLCBzaXplKTsKKyAgbWVtY3B5IChkYXRhLCAmaGVhZGVyLCBoZWFkZXJfbGVuKTsKKworICBpZiAocHNjKSB7CisgICAgZ3VpbnQzMiB3b3JkID0gMHgwMDAxMDBmZiA+PiBzYml0OworICAgIGRhdGFbaGVhZGVyX2xlbiArIDBdID0gKHdvcmQgPj4gMjQpICYgMHhmZjsKKyAgICBkYXRhW2hlYWRlcl9sZW4gKyAxXSA9ICh3b3JkID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVtoZWFkZXJfbGVuICsgMl0gPSAod29yZCA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVtoZWFkZXJfbGVuICsgM10gPSAod29yZCA+PiAwKSAmIDB4ZmY7CisgIH0KKworICByZXR1cm4gZGF0YTsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitjcmVhdGVfcnRwX2NvcHlfcGF5bG9hZCAoY29uc3QgZ3VpbnQ4ICogZGF0YSwgZ3NpemUgc2l6ZSwgZ3VpbnQgdHMsIGd1aW50MTYgc2VxLAorICAgIGdib29sZWFuIG1hcmtlciwgZ3VpbnQgY3NyY3MpCit7CisgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChzaXplLCAwLCBjc3Jjcyk7CisgIEdzdFJUUEJ1ZmZlciBydHAgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworCisgIGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKworICBnc3RfcnRwX2J1ZmZlcl9zZXRfc2VxICgmcnRwLCBzZXEpOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBtYXJrZXIpOworICBtZW1jcHkgKGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKSwgZGF0YSwgc2l6ZSk7CisKKyAgR1NUX0JVRkZFUl9QVFMgKGJ1ZikgPSAodHMpICogKEdTVF9TRUNPTkQgLyAzMCk7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZikgPSAoR1NUX1NFQ09ORCAvIDMwKTsKKworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaDI2M2RlcGF5X2VtcHR5X3BheWxvYWQpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBoMjYxZGVwYXkiKTsKKyAgZ2ludCBzYml0ID0gNDsKKyAgZ2ludCBlYml0ID0gNDsKKyAgZ3NpemUgc2l6ZTsKKyAgZ3VpbnQ4ICpwYXlsb2FkOworICBndWludCBzZXEgPSAwOworCisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgsIEgyNjFfUlRQX0NBUFNfU1RSKTsKKworICAvKiBGaXJzdCBzZW5kIGEgcHJvcGVyIHBhY2tldCB3aXRoIHBpY3R1cmUgc3RhcnQgY29kZSAqLworICBzaXplID0gMTAwOworICBwYXlsb2FkID0gY3JlYXRlX2gyNjFfcGF5bG9hZCAoc2JpdCwgZWJpdCwgVFJVRSwgc2l6ZSk7CisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGNyZWF0ZV9ydHBfY29weV9wYXlsb2FkIChwYXlsb2FkLCBzaXplLCAwLCBzZXErKywgRkFMU0UsCisgICAgICAgICAgMCkpOworICBnX2ZyZWUgKHBheWxvYWQpOworCisgIC8qIE5vdCBhIGNvbXBsZXRlIGZyYW1lICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9oYXJuZXNzX2J1ZmZlcnNfcmVjZWl2ZWQgKGgpLCAwKTsKKworICAvKiBTZWNvbmQgYnVmZmVyIGhhcyBpbnZhbGlkIGVtcHR5IHBheWxvYWQgKi8KKyAgc2l6ZSA9IEdTVF9SVFBfSDI2MV9QQVlMT0FEX0hFQURFUl9MRU47CisgIHBheWxvYWQgPSBjcmVhdGVfaDI2MV9wYXlsb2FkIChzYml0LCBlYml0LCBGQUxTRSwgc2l6ZSk7CisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGNyZWF0ZV9ydHBfY29weV9wYXlsb2FkIChwYXlsb2FkLCBzaXplLCAwLCBzZXErKywgVFJVRSwKKyAgICAgICAgICAwKSk7CisgIGdfZnJlZSAocGF5bG9hZCk7CisKKyAgLyogSW52YWxpZCBwYXlsb2FkIHNob3VsZCBiZSBkcm9wcGVkICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9oYXJuZXNzX2J1ZmZlcnNfcmVjZWl2ZWQgKGgpLCAwKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK3J0cGgyNjFfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgicnRwaDI2MSIpOworICBUQ2FzZSAqdGNfY2hhaW47CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCAodGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJoMjYxZGVwYXkiKSkpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaDI2M2RlcGF5X2VtcHR5X3BheWxvYWQpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAocnRwaDI2MSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBoMjYzLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBoMjYzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhjMDE5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGgyNjMuYwpAQCAtMCwwICsxLDMzOCBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFBleGlwIEFTCisgKiAgIEBhdXRob3IgU3RpYW4gU2VsbmVzIDxzdGlhbkBwZXhpcC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9jaGVjay5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RoYXJuZXNzLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworI2RlZmluZSBSVFBfSDI2M19DQVBTX1NUUihwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYXBwbGljYXRpb24veC1ydHAsbWVkaWE9dmlkZW8sZW5jb2RpbmctbmFtZT1IMjYzLGNsb2NrLXJhdGU9OTAwMDAsIiAgXAorICAicGF5bG9hZD0iIEdfU1RSSU5HSUZZKHApCisKKyNkZWZpbmUgSDI2M1BfUlRQX0NBUFNfU1RSKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImFwcGxpY2F0aW9uL3gtcnRwLG1lZGlhPXZpZGVvLGVuY29kaW5nLW5hbWU9SDI2My0xOTk4LGNsb2NrLXJhdGU9OTAwMDAsIiBcCisgICJwYXlsb2FkPSJHX1NUUklOR0lGWShwKQorCitzdGF0aWMgZ2Jvb2xlYW4KK2hhdmVfZWxlbWVudCAoY29uc3QgZ2NoYXIgKiBlbGVtZW50X25hbWUpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisgIGdib29sZWFuIHJldDsKKworICBlbGVtZW50ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlIChlbGVtZW50X25hbWUsIE5VTEwpOworICByZXQgPSBlbGVtZW50ICE9IE5VTEw7CisKKyAgaWYgKGVsZW1lbnQpCisgICAgZ3N0X29iamVjdF91bnJlZiAoZWxlbWVudCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitjcmVhdGVfcnRwX2J1ZmZlciAoZ3VpbnQ4ICogZGF0YSwgZ3NpemUgc2l6ZSwgZ3VpbnQgdHMsIGdpbnQgc2VxbnVtKQoreworICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19jb3B5X2RhdGEgKGRhdGEsIHNpemUpOworICBHc3RSVFBCdWZmZXIgcnRwID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKworICBHU1RfQlVGRkVSX1BUUyAoYnVmKSA9ICh0cykgKiAoR1NUX1NFQ09ORCAvIDMwKTsKKworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGJ1ZiwgR1NUX01BUF9XUklURSwgJnJ0cCk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9zZXEgKCZydHAsIHNlcW51bSk7CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICByZXR1cm4gYnVmOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9oMjYzZGVwYXlfc3RhcnRfcGFja2V0X3Rvb19zbWFsbF9tb2RlX2EpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBoMjYzZGVwYXkiKTsKKyAgZ3VpbnQ4IHBhY2tldFtdID0geworICAgIDB4ODAsIDB4YTIsIDB4MTcsIDB4NjIsIDB4NTcsIDB4YmIsIDB4NDgsIDB4OTgsIDB4NGEsIDB4NTksIDB4ZTgsIDB4ZGMsCisgICAgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMAorICB9OworCisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgsIFJUUF9IMjYzX0NBUFNfU1RSICgzNCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGNyZWF0ZV9ydHBfYnVmZmVyIChwYWNrZXQsIHNpemVvZiAocGFja2V0KSwgMCwgMCkpKTsKKworICAvKiBQYWNrZXQgc2hvdWxkIGJlIGRyb3BwZWQgYW5kIGRlcGF5bG9hZGVyIG5vdCBjcmFzaCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgwLCBnc3RfaGFybmVzc19idWZmZXJzX3JlY2VpdmVkIChoKSk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2gyNjNkZXBheV9zdGFydF9wYWNrZXRfdG9vX3NtYWxsX21vZGVfYikKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGgyNjNkZXBheSIpOworICBndWludDggcGFja2V0W10gPSB7CisgICAgMHg4MCwgMHhhMiwgMHgxNywgMHg2MiwgMHg1NywgMHhiYiwgMHg0OCwgMHg5OCwgMHg0YSwgMHg1OSwgMHhlOCwgMHhkYywKKyAgICAweDgwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCisgIH07CisKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoaCwgUlRQX0gyNjNfQ0FQU19TVFIgKDM0KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgY3JlYXRlX3J0cF9idWZmZXIgKHBhY2tldCwgc2l6ZW9mIChwYWNrZXQpLCAwLCAwKSkpOworCisgIC8qIFBhY2tldCBzaG91bGQgYmUgZHJvcHBlZCBhbmQgZGVwYXlsb2FkZXIgbm90IGNyYXNoICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDAsIGdzdF9oYXJuZXNzX2J1ZmZlcnNfcmVjZWl2ZWQgKGgpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaDI2M2RlcGF5X3N0YXJ0X3BhY2tldF90b29fc21hbGxfbW9kZV9jKQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwaDI2M2RlcGF5Iik7CisgIGd1aW50OCBwYWNrZXRbXSA9IHsKKyAgICAweDgwLCAweGEyLCAweDE3LCAweDYyLCAweDU3LCAweGJiLCAweDQ4LCAweDk4LCAweDRhLCAweDU5LCAweGU4LCAweGRjLAorICAgIDB4YzAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKyAgfTsKKworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChoLCBSVFBfSDI2M19DQVBTX1NUUiAoMzQpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoLCBjcmVhdGVfcnRwX2J1ZmZlciAocGFja2V0LCBzaXplb2YgKHBhY2tldCksIDAsIDApKSk7CisKKyAgLyogUGFja2V0IHNob3VsZCBiZSBkcm9wcGVkIGFuZCBkZXBheWxvYWRlciBub3QgY3Jhc2ggKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMCwgZ3N0X2hhcm5lc3NfYnVmZmVyc19yZWNlaXZlZCAoaCkpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9oMjYzcGF5X21vZGVfYl9zbm93KQoreworICAvKiBQYXlsb2FkaW5nIG9uZSBsYXJnZSBmcmFtZSAobGlrZSBzbm93KSBpcyBtb3JlIGxpa2VseSB0byB1c2UgbW9kZSBiIGFuZAorICAgKiB0cmlnZ2VyIGlzc3VlcyBpbiB2YWxncmluZCBzZWVuIHByZXZpb3VzbHkgbGlrZSBkb3VibGUgZnJlZSwgaW52YWxpZCByZWFkCisgICAqIGV0Yy4gKi8KKyAgR3N0SGFybmVzcyAqaDsKKyAgZ3VpbnQgZnJhbWVzID0gMTsKKyAgZ3VpbnQgaTsKKworICBpZiAoIWhhdmVfZWxlbWVudCAoImF2ZW5jX2gyNjMiKSkKKyAgICByZXR1cm47CisKKyAgaCA9IGdzdF9oYXJuZXNzX25ld19wYXJzZQorICAgICAgKCJhdmVuY19oMjYzIHJ0cC1wYXlsb2FkLXNpemU9MSAhIHJ0cGgyNjNwYXkgbXR1PTEzNTAgIik7CisgIGdzdF9oYXJuZXNzX2FkZF9zcmNfcGFyc2UgKGgsCisgICAgICAidmlkZW90ZXN0c3JjIHBhdHRlcm49c25vdyBpcy1saXZlPTEgISAiCisgICAgICAiY2Fwc2ZpbHRlciBjYXBzPVwidmlkZW8veC1yYXcsZm9ybWF0PUk0MjAsd2lkdGg9MTc2LGhlaWdodD0xNDRcIiIsIFRSVUUpOworCisgIGZvciAoaSA9IDA7IGkgPCBmcmFtZXM7IGkrKykKKyAgICBnc3RfaGFybmVzc19wdXNoX2Zyb21fc3JjIChoKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9oYXJuZXNzX2J1ZmZlcnNfcmVjZWl2ZWQgKGgpID49IGZyYW1lcyk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkKCkgbWF5IHJldHVybiBhIGNvcHkgb2YgdGhlIHBheWxvYWQuIFRoaXMgdGVzdAorICogbWFrZXMgc3VyZSB0aGF0IHRoZSBydHBoMjYzcGRlcGF5IGFsc28gcHJvZHVjZXMgdGhlIGNvcnJlY3Qgb3V0cHV0IGluIHRoaXMKKyAqIGNhc2UuICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF9oMjYzcGRlcGF5X2ZyYWdtZW50ZWRfbWVtb3J5X25vbl93cml0YWJsZV9idWZmZXIpCit7CisgIEdzdEhhcm5lc3MgKmg7CisgIEdzdEJ1ZmZlciAqaGVhZGVyX2J1ZiwgKnBheWxvYWRfYnVmLCAqYnVmOworICBHc3RSVFBCdWZmZXIgcnRwID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKyAgZ3VpbnQ4IGhlYWRlcltdID0geworICAgIDB4MDQsIDB4MDAKKyAgfTsKKyAgZ3VpbnQ4IHBheWxvYWRbXSA9IHsKKyAgICAweDgwLCAweDAyLCAweDFjLCAweGI4LCAweDAxLCAweDAwLCAweDExLCAweGUwLCAweDQ0LCAweGM0CisgIH07CisgIGd1aW50OCBmcmFtZVtdID0geworICAgIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDIsIDB4MWMsIDB4YjgsIDB4MDEsIDB4MDAsIDB4MTEsIDB4ZTAsIDB4NDQsIDB4YzQKKyAgfTsKKworICBoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwaDI2M3BkZXBheSIpOworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChoLCAiYXBwbGljYXRpb24veC1ydHAsIG1lZGlhPXZpZGVvLCAiCisgICAgICAiY2xvY2stcmF0ZT05MDAwMCwgZW5jb2RpbmctbmFtZT1IMjYzLTE5OTgiKTsKKworICAvKiBQYWNrZXQgd2l0aCBNPTEsIFA9MSAqLworICBoZWFkZXJfYnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChzaXplb2YgKGhlYWRlciksIDAsIDApOworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGhlYWRlcl9idWYsIEdTVF9NQVBfV1JJVEUsICZydHApOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBUUlVFKTsKKyAgbWVtY3B5IChnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCksIGhlYWRlciwgc2l6ZW9mIChoZWFkZXIpKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIHBheWxvYWRfYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIHNpemVvZiAocGF5bG9hZCksIE5VTEwpOworICBnc3RfYnVmZmVyX2ZpbGwgKHBheWxvYWRfYnVmLCAwLCBwYXlsb2FkLCBzaXplb2YgKHBheWxvYWQpKTsKKyAgYnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKGhlYWRlcl9idWYsIHBheWxvYWRfYnVmKTsKKworICBnc3RfaGFybmVzc19wdXNoIChoLCBnc3RfYnVmZmVyX3JlZiAoYnVmKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgYnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoYnVmLCAwLCBmcmFtZSwgc2l6ZW9mIChmcmFtZSkpID09IDApOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCgpIG1heSByZXR1cm4gYSBjb3B5IG9mIHRoZSBwYXlsb2FkLiBUaGlzIHRlc3QKKyAqIG1ha2VzIHN1cmUgdGhhdCB0aGUgcnRwaDI2M3BkZXBheSBhbHNvIHByb2R1Y2VzIHRoZSBjb3JyZWN0IG91dHB1dCBpbiB0aGlzCisgKiBjYXNlLiAqLworR1NUX1NUQVJUX1RFU1QKKyAgICAodGVzdF9oMjYzcGRlcGF5X2ZyYWdtZW50ZWRfbWVtb3J5X25vbl93cml0YWJsZV9idWZmZXJfc3BsaXRfZnJhbWUpIHsKKyAgR3N0SGFybmVzcyAqaDsKKyAgR3N0QnVmZmVyICpoZWFkZXJfYnVmLCAqcGF5bG9hZF9idWYsICpidWY7CisgIEdzdFJUUEJ1ZmZlciBydHAgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworICBndWludDggaGVhZGVyW10gPSB7CisgICAgMHgwNCwgMHgwMAorICB9OworICBndWludDggcGF5bG9hZFtdID0geworICAgIDB4ODAsIDB4MDIsIDB4MWMsIDB4YjgsIDB4MDEsIDB4MDAsIDB4MTEsIDB4ZTAsIDB4NDQsIDB4YzQKKyAgfTsKKyAgZ3VpbnQ4IGZyYW1lW10gPSB7CisgICAgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMiwgMHgxYywgMHhiOCwgMHgwMSwgMHgwMCwgMHgxMSwgMHhlMCwgMHg0NCwgMHhjNAorICB9OworCisgIGggPSBnc3RfaGFybmVzc19uZXcgKCJydHBoMjYzcGRlcGF5Iik7CisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgsICJhcHBsaWNhdGlvbi94LXJ0cCwgbWVkaWE9dmlkZW8sICIKKyAgICAgICJjbG9jay1yYXRlPTkwMDAwLCBlbmNvZGluZy1uYW1lPUgyNjMtMTk5OCIpOworCisgIC8qIEZpcnN0IHBhY2tldCwgTT0wLCBQPTEgKi8KKyAgaGVhZGVyX2J1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoc2l6ZW9mIChoZWFkZXIpLCAwLCAwKTsKKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChoZWFkZXJfYnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X21hcmtlciAoJnJ0cCwgRkFMU0UpOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfc2VxICgmcnRwLCAwKTsKKyAgbWVtY3B5IChnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCksIGhlYWRlciwgc2l6ZW9mIChoZWFkZXIpKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIHBheWxvYWRfYnVmID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIHNpemVvZiAocGF5bG9hZCksIE5VTEwpOworICBnc3RfYnVmZmVyX2ZpbGwgKHBheWxvYWRfYnVmLCAwLCBwYXlsb2FkLCBzaXplb2YgKHBheWxvYWQpKTsKKyAgYnVmID0gZ3N0X2J1ZmZlcl9hcHBlbmQgKGhlYWRlcl9idWYsIHBheWxvYWRfYnVmKTsKKworICBnc3RfaGFybmVzc19wdXNoIChoLCBnc3RfYnVmZmVyX3JlZiAoYnVmKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9oYXJuZXNzX2J1ZmZlcnNfcmVjZWl2ZWQgKGgpLCAwKTsKKworICAvKiBTZWNvbmQgcGFja2V0LCBNPTEsIFA9MSAqLworICBoZWFkZXJfYnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChzaXplb2YgKGhlYWRlciksIDAsIDApOworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGhlYWRlcl9idWYsIEdTVF9NQVBfV1JJVEUsICZydHApOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfbWFya2VyICgmcnRwLCBUUlVFKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3NlcSAoJnJ0cCwgMSk7CisgIG1lbWNweSAoZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHApLCBoZWFkZXIsIHNpemVvZiAoaGVhZGVyKSk7CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwKTsKKworICBwYXlsb2FkX2J1ZiA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBzaXplb2YgKHBheWxvYWQpLCBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tZW1zZXQgKHBheWxvYWRfYnVmLCAwLCAwLCAxMCk7CisgIGJ1ZiA9IGdzdF9idWZmZXJfYXBwZW5kIChoZWFkZXJfYnVmLCBwYXlsb2FkX2J1Zik7CisKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ3N0X2J1ZmZlcl9yZWYgKGJ1ZikpOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfaGFybmVzc19idWZmZXJzX3JlY2VpdmVkIChoKSwgMSk7CisKKyAgYnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAoYnVmLCAwLCBmcmFtZSwgc2l6ZW9mIChmcmFtZSkpID09IDApOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9oMjYzcGRlcGF5X2RvbnRfcHVzaF9lbXB0eV9mcmFtZSkKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGgyNjNwZGVwYXkiKTsKKworICAvKiBQYWNrZXQgdGhhdCBvbmx5IGNvbnRhaW5zIGhlYWRlciBpbmZvcm1hdGlvbiBhbmQgYW4gZXh0cmEgcGljdHVyZSBoZWFkZXIKKyAgICogKFBMRU4gPiAwKS4gUGFydGx5IGhhbmRjcmFmdGVkIHBhY2tldC4gT3JpZ2luYWxseSB0aGlzIHBhY2tldCBkaWQgbm90CisgICAqIGhhdmUgUD0xIChoZW5jZSBpdCB3YXMgbm90IHN0YXJ0IG9mIGEgcGljdHVyZSkuIFdpdGggYm90aCBQPTEgYW5kIE09MSB3ZQorICAgKiBvbmx5IG5lZWQgb25lIHBhY2tldCB0byByZXByb2R1Y2UgdGhlIGlzc3VlIHdoZXJlIHRyeWluZyB0byBwdXNoIGFuIGVtcHR5CisgICAqIGZyYW1lIHdoZW4gUExFTiBpcyBzZXQgKi8KKyAgZ3VpbnQ4IHBhY2tldFtdID0geworICAgIDB4ODAsIDB4ZTgsIDB4YmMsIDB4YWEsIDB4MTQsIDB4MTIsIDB4MTYsIDB4NWMsIDB4YjgsIDB4NGUsIDB4MzksIDB4MDQsCisgICAgMHgyNSwgMHgwMCwgMHg1NCwgMHgzOSwgMHhkMCwgMHgxMiwgMHgwNiwgMHg5ZSwgMHhiNSwgMHgwYSwgMHhmNSwgMHhlOCwKKyAgICAweDMyLCAweGViLCAweGQwLCAweDZiLCAweGQ2LCAweGEyLCAweGZhLCAweGQ0LCAweDNkLCAweGQ3LCAweGEwLCAweDJiLAorICAgIDB4MjQsIDB4OTcsIDB4YzMsIDB4YmYsIDB4YzAsIDB4YmIsIDB4ZDcsIDB4YTAsCisgIH07CisKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoaCwgSDI2M1BfUlRQX0NBUFNfU1RSICgxMDApKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgZ3N0X2hhcm5lc3NfcHVzaCAoaCwKKyAgICAgICAgICBjcmVhdGVfcnRwX2J1ZmZlciAocGFja2V0LCBzaXplb2YgKHBhY2tldCksIDAsIDApKSk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2hhcm5lc3NfYnVmZmVyc19yZWNlaXZlZCAoaCksIDApOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9oMjYzcHBheV9ub25fZml4ZWRfY2FwcykKK3sKKyAgR3N0SGFybmVzcyAqaDsKKyAgZ3VpbnQ4IGZyYW1lW10gPSB7CisgICAgMHgwMCwgMHgwMCwgMHg4MCwgMHgwNiwgMHgxYywgMHhhOCwgMHgwMSwgMHgwNCwgMHg5MSwgMHhlMCwgMHgzNywgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICB9OworCisgIGggPSBnc3RfaGFybmVzc19uZXdfcGFyc2UgKCJydHBoMjYzcHBheSIpOworCisgIC8qIFNldCBub24tZml4ZWQgY2FwcyBhZnRlciBwYXlsb2FkZXIgKi8KKyAgZ3N0X2hhcm5lc3Nfc2V0X2NhcHNfc3RyIChoLCAidmlkZW8veC1oMjYzLCB2YXJpYW50PShzdHJpbmcpaXR1IiwKKyAgICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgY2xvY2stcmF0ZT1bMSwgTUFYXSIpOworCisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdzdF9idWZmZXJfbmV3X3dyYXBwZWRfZnVsbCAoR1NUX01FTU9SWV9GTEFHX1JFQURPTkxZLAorICAgICAgICAgIGZyYW1lLCBzaXplb2YgKGZyYW1lKSwgMCwgc2l6ZW9mIChmcmFtZSksIE5VTEwsIE5VTEwpKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgxLCBnc3RfaGFybmVzc19idWZmZXJzX3JlY2VpdmVkIChoKSk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitydHBoMjYzX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInJ0cGgyNjMiKTsKKyAgVENhc2UgKnRjX2NoYWluOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgKHRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiaDI2M2RlcGF5IikpKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2gyNjNkZXBheV9zdGFydF9wYWNrZXRfdG9vX3NtYWxsX21vZGVfYSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9oMjYzZGVwYXlfc3RhcnRfcGFja2V0X3Rvb19zbWFsbF9tb2RlX2IpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaDI2M2RlcGF5X3N0YXJ0X3BhY2tldF90b29fc21hbGxfbW9kZV9jKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsICh0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImgyNjNwYXkiKSkpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfaDI2M3BheV9tb2RlX2Jfc25vdyk7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCAodGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJoMjYzcGRlcGF5IikpKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLAorICAgICAgdGVzdF9oMjYzcGRlcGF5X2ZyYWdtZW50ZWRfbWVtb3J5X25vbl93cml0YWJsZV9idWZmZXIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sCisgICAgICB0ZXN0X2gyNjNwZGVwYXlfZnJhZ21lbnRlZF9tZW1vcnlfbm9uX3dyaXRhYmxlX2J1ZmZlcl9zcGxpdF9mcmFtZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9oMjYzcGRlcGF5X2RvbnRfcHVzaF9lbXB0eV9mcmFtZSk7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCAodGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJoMjYzcHBheSIpKSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9oMjYzcHBheV9ub25fZml4ZWRfY2Fwcyk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChydHBoMjYzKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGgyNjQuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cGgyNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjNlMWJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaDI2NC5jCkBAIC0wLDAgKzEsMzExIEBACisvKiBHU3RyZWFtZXIgUlRQIEguMjY0IHVuaXQgdGVzdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBDZW50cmljdWxhciBMdGQKKyAqICAgQGF1dGhvcjogVGltLVBoaWxpcHAgTcO8bGxlciA8dGltQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2NoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2FwcC9hcHAuaD4KKworI2RlZmluZSBBTExPQ0FUT1JfQ1VTVE9NX1NZU01FTSAiQ3VzdG9tU3lzTWVtIgorCitzdGF0aWMgR3N0QWxsb2NhdG9yICpjdXN0b21fc3lzbWVtX2FsbG9jYXRvcjsgICAvKiBOVUxMICovCisKKy8qIEN1c3RvbSBtZW1vcnkgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0TWVtb3J5IG1lbTsKKyAgZ3VpbnQ4ICpkYXRhOworICBndWludDggKmFsbG9jZGF0YTsKK30gQ3VzdG9tU3lzbWVtOworCitzdGF0aWMgQ3VzdG9tU3lzbWVtICoKK2N1c3RvbV9zeXNtZW1fbmV3IChHc3RNZW1vcnlGbGFncyBmbGFncywgZ3NpemUgbWF4c2l6ZSwgZ3NpemUgYWxpZ24sCisgICAgZ3NpemUgb2Zmc2V0LCBnc2l6ZSBzaXplKQoreworICBnc2l6ZSBhb2Zmc2V0LCBwYWRkaW5nOworICBDdXN0b21TeXNtZW0gKm1lbTsKKworICAvKiBlbnN1cmUgY29uZmlndXJlZCBhbGlnbm1lbnQgKi8KKyAgYWxpZ24gfD0gZ3N0X21lbW9yeV9hbGlnbm1lbnQ7CisgIC8qIGFsbG9jYXRlIG1vcmUgdG8gY29tcGVuc2F0ZSBmb3IgYWxpZ25tZW50ICovCisgIG1heHNpemUgKz0gYWxpZ247CisKKyAgbWVtID0gZ19uZXcwIChDdXN0b21TeXNtZW0sIDEpOworCisgIG1lbS0+YWxsb2NkYXRhID0gZ19tYWxsb2MgKG1heHNpemUpOworCisgIG1lbS0+ZGF0YSA9IG1lbS0+YWxsb2NkYXRhOworCisgIC8qIGRvIGFsaWdubWVudCAqLworICBpZiAoKGFvZmZzZXQgPSAoKGd1aW50cHRyKSBtZW0tPmRhdGEgJiBhbGlnbikpKSB7CisgICAgYW9mZnNldCA9IChhbGlnbiArIDEpIC0gYW9mZnNldDsKKyAgICBtZW0tPmRhdGEgKz0gYW9mZnNldDsKKyAgICBtYXhzaXplIC09IGFvZmZzZXQ7CisgIH0KKworICBpZiAob2Zmc2V0ICYmIChmbGFncyAmIEdTVF9NRU1PUllfRkxBR19aRVJPX1BSRUZJWEVEKSkKKyAgICBtZW1zZXQgKG1lbS0+ZGF0YSwgMCwgb2Zmc2V0KTsKKworICBwYWRkaW5nID0gbWF4c2l6ZSAtIChvZmZzZXQgKyBzaXplKTsKKyAgaWYgKHBhZGRpbmcgJiYgKGZsYWdzICYgR1NUX01FTU9SWV9GTEFHX1pFUk9fUEFEREVEKSkKKyAgICBtZW1zZXQgKG1lbS0+ZGF0YSArIG9mZnNldCArIHNpemUsIDAsIHBhZGRpbmcpOworCisgIGdzdF9tZW1vcnlfaW5pdCAoR1NUX01FTU9SWV9DQVNUIChtZW0pLCBmbGFncywgY3VzdG9tX3N5c21lbV9hbGxvY2F0b3IsCisgICAgICBOVUxMLCBtYXhzaXplLCBhbGlnbiwgb2Zmc2V0LCBzaXplKTsKKworICByZXR1cm4gbWVtOworfQorCitzdGF0aWMgZ3BvaW50ZXIKK2N1c3RvbV9zeXNtZW1fbWFwIChDdXN0b21TeXNtZW0gKiBtZW0sIGdzaXplIG1heHNpemUsIEdzdE1hcEZsYWdzIGZsYWdzKQoreworICByZXR1cm4gbWVtLT5kYXRhOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2N1c3RvbV9zeXNtZW1fdW5tYXAgKEN1c3RvbVN5c21lbSAqIG1lbSkKK3sKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBDdXN0b21TeXNtZW0gKgorY3VzdG9tX3N5c21lbV9jb3B5IChDdXN0b21TeXNtZW0gKiBtZW0sIGdzc2l6ZSBvZmZzZXQsIGdzaXplIHNpemUpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9yZWFjaGVkIChOVUxMKTsKK30KKworc3RhdGljIEN1c3RvbVN5c21lbSAqCitjdXN0b21fc3lzbWVtX3NoYXJlIChDdXN0b21TeXNtZW0gKiBtZW0sIGdzc2l6ZSBvZmZzZXQsIGdzaXplIHNpemUpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9yZWFjaGVkIChOVUxMKTsKK30KKworc3RhdGljIGdib29sZWFuCitjdXN0b21fc3lzbWVtX2lzX3NwYW4gKEN1c3RvbVN5c21lbSAqIG1lbTEsIEN1c3RvbVN5c21lbSAqIG1lbTIsIGdzaXplICogb2Zmc2V0KQoreworICBnX3JldHVybl92YWxfaWZfcmVhY2hlZCAoRkFMU0UpOworfQorCisvKiBDdXN0b20gYWxsb2NhdG9yICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdEFsbG9jYXRvciBhbGxvY2F0b3I7Cit9IEN1c3RvbVN5c21lbUFsbG9jYXRvcjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0QWxsb2NhdG9yQ2xhc3MgYWxsb2NhdG9yX2NsYXNzOworfSBDdXN0b21TeXNtZW1BbGxvY2F0b3JDbGFzczsKKworR1R5cGUgY3VzdG9tX3N5c21lbV9hbGxvY2F0b3JfZ2V0X3R5cGUgKHZvaWQpOworR19ERUZJTkVfVFlQRSAoQ3VzdG9tU3lzbWVtQWxsb2NhdG9yLCBjdXN0b21fc3lzbWVtX2FsbG9jYXRvciwKKyAgICBHU1RfVFlQRV9BTExPQ0FUT1IpOworCitzdGF0aWMgR3N0TWVtb3J5ICoKK2N1c3RvbV9zeXNtZW1fYWxsb2NhdG9yX2FsbG9jIChHc3RBbGxvY2F0b3IgKiBhbGxvY2F0b3IsIGdzaXplIHNpemUsCisgICAgR3N0QWxsb2NhdGlvblBhcmFtcyAqIHBhcmFtcykKK3sKKyAgZ3NpemUgbWF4c2l6ZSA9IHNpemUgKyBwYXJhbXMtPnByZWZpeCArIHBhcmFtcy0+cGFkZGluZzsKKworICByZXR1cm4gKEdzdE1lbW9yeSAqKSBjdXN0b21fc3lzbWVtX25ldyAocGFyYW1zLT5mbGFncywKKyAgICAgIG1heHNpemUsIHBhcmFtcy0+YWxpZ24sIHBhcmFtcy0+cHJlZml4LCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2N1c3RvbV9zeXNtZW1fYWxsb2NhdG9yX2ZyZWUgKEdzdEFsbG9jYXRvciAqIGFsbG9jYXRvciwgR3N0TWVtb3J5ICogbWVtKQoreworICBDdXN0b21TeXNtZW0gKmNzbWVtID0gKEN1c3RvbVN5c21lbSAqKSBtZW07CisKKyAgZ19mcmVlIChjc21lbS0+YWxsb2NkYXRhKTsKKyAgZ19mcmVlIChjc21lbSk7Cit9CisKK3N0YXRpYyB2b2lkCitjdXN0b21fc3lzbWVtX2FsbG9jYXRvcl9jbGFzc19pbml0IChDdXN0b21TeXNtZW1BbGxvY2F0b3JDbGFzcyAqIGtsYXNzKQoreworICBHc3RBbGxvY2F0b3JDbGFzcyAqYWxsb2NhdG9yX2NsYXNzID0gKEdzdEFsbG9jYXRvckNsYXNzICopIGtsYXNzOworCisgIGFsbG9jYXRvcl9jbGFzcy0+YWxsb2MgPSBjdXN0b21fc3lzbWVtX2FsbG9jYXRvcl9hbGxvYzsKKyAgYWxsb2NhdG9yX2NsYXNzLT5mcmVlID0gY3VzdG9tX3N5c21lbV9hbGxvY2F0b3JfZnJlZTsKK30KKworc3RhdGljIHZvaWQKK2N1c3RvbV9zeXNtZW1fYWxsb2NhdG9yX2luaXQgKEN1c3RvbVN5c21lbUFsbG9jYXRvciAqIGFsbG9jYXRvcikKK3sKKyAgR3N0QWxsb2NhdG9yICphbGxvYyA9IEdTVF9BTExPQ0FUT1JfQ0FTVCAoYWxsb2NhdG9yKTsKKworICBhbGxvYy0+bWVtX3R5cGUgPSBBTExPQ0FUT1JfQ1VTVE9NX1NZU01FTTsKKyAgYWxsb2MtPm1lbV9tYXAgPSAoR3N0TWVtb3J5TWFwRnVuY3Rpb24pIGN1c3RvbV9zeXNtZW1fbWFwOworICBhbGxvYy0+bWVtX3VubWFwID0gKEdzdE1lbW9yeVVubWFwRnVuY3Rpb24pIGN1c3RvbV9zeXNtZW1fdW5tYXA7CisgIGFsbG9jLT5tZW1fY29weSA9IChHc3RNZW1vcnlDb3B5RnVuY3Rpb24pIGN1c3RvbV9zeXNtZW1fY29weTsKKyAgYWxsb2MtPm1lbV9zaGFyZSA9IChHc3RNZW1vcnlTaGFyZUZ1bmN0aW9uKSBjdXN0b21fc3lzbWVtX3NoYXJlOworICBhbGxvYy0+bWVtX2lzX3NwYW4gPSAoR3N0TWVtb3J5SXNTcGFuRnVuY3Rpb24pIGN1c3RvbV9zeXNtZW1faXNfc3BhbjsKK30KKworLyogQXBwU2luayBzdWJjbGFzcyBwcm9wb3Npbmcgb3VyIGN1c3RvbSBhbGxvY2F0b3IgdG8gdXBzdHJlYW0gKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0QXBwU2luayBhcHBzaW5rOworfSBDTWVtQXBwU2luazsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0QXBwU2lua0NsYXNzIGFwcHNpbms7Cit9IENNZW1BcHBTaW5rQ2xhc3M7CisKK0dUeXBlIGNfbWVtX2FwcF9zaW5rX2dldF90eXBlICh2b2lkKTsKKworR19ERUZJTkVfVFlQRSAoQ01lbUFwcFNpbmssIGNfbWVtX2FwcF9zaW5rLCBHU1RfVFlQRV9BUFBfU0lOSyk7CisKK3N0YXRpYyB2b2lkCitjX21lbV9hcHBfc2lua19pbml0IChDTWVtQXBwU2luayAqIGNtZW1zaW5rKQoreworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2NfbWVtX2FwcF9zaW5rX3Byb3Bvc2VfYWxsb2NhdGlvbiAoR3N0QmFzZVNpbmsgKiBzaW5rLCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBnc3RfcXVlcnlfYWRkX2FsbG9jYXRpb25fcGFyYW0gKHF1ZXJ5LCBjdXN0b21fc3lzbWVtX2FsbG9jYXRvciwgTlVMTCk7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorY19tZW1fYXBwX3NpbmtfY2xhc3NfaW5pdCAoQ01lbUFwcFNpbmtDbGFzcyAqIGtsYXNzKQoreworICBHc3RCYXNlU2lua0NsYXNzICpiYXNlc2lua19jbGFzcyA9IChHc3RCYXNlU2lua0NsYXNzICopIGtsYXNzOworCisgIGJhc2VzaW5rX2NsYXNzLT5wcm9wb3NlX2FsbG9jYXRpb24gPSBjX21lbV9hcHBfc2lua19wcm9wb3NlX2FsbG9jYXRpb247Cit9CisKKyNkZWZpbmUgUlRQX0gyNjRfRklMRSBHU1RfVEVTVF9GSUxFU19QQVRIIEdfRElSX1NFUEFSQVRPUl9TICJoMjY0LnJ0cCIKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnRwaDI2NGRlcGF5X3dpdGhfZG93bnN0cmVhbV9hbGxvY2F0b3IpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lLCAqc3JjLCAqZGVwYXksICpzaW5rOworICBHc3RNZW1vcnkgKm1lbTsKKyAgR3N0U2FtcGxlICpzYW1wbGU7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RDYXBzICpjYXBzOworCisgIGN1c3RvbV9zeXNtZW1fYWxsb2NhdG9yID0KKyAgICAgIGdfb2JqZWN0X25ldyAoY3VzdG9tX3N5c21lbV9hbGxvY2F0b3JfZ2V0X3R5cGUgKCksIE5VTEwpOworCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXBwc3JjIiwgTlVMTCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXJ0cCIsCisgICAgICAibWVkaWEiLCBHX1RZUEVfU1RSSU5HLCAidmlkZW8iLAorICAgICAgInBheWxvYWQiLCBHX1RZUEVfSU5ULCA5NiwKKyAgICAgICJjbG9jay1yYXRlIiwgR19UWVBFX0lOVCwgOTAwMDAsCisgICAgICAiZW5jb2RpbmctbmFtZSIsIEdfVFlQRV9TVFJJTkcsICJIMjY0IiwKKyAgICAgICJzc3JjIiwgR19UWVBFX1VJTlQsIDE5OTA2ODM4MTAsCisgICAgICAidGltZXN0YW1wLW9mZnNldCIsIEdfVFlQRV9VSU5ULCAzNjk3NTgzNDQ2LAorICAgICAgInNlcW51bS1vZmZzZXQiLCBHX1RZUEVfVUlOVCwgMTU1NjgsCisgICAgICAiYS1mcmFtZXJhdGUiLCBHX1RZUEVfU1RSSU5HLCAiMzAiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMsICJmb3JtYXQiLCBHU1RfRk9STUFUX1RJTUUsICJjYXBzIiwgY2FwcywgTlVMTCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIHNyYyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBkZXBheSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cGgyNjRkZXBheSIsIE5VTEwpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBkZXBheSk7CisKKyAgc2luayA9IGdfb2JqZWN0X25ldyAoY19tZW1fYXBwX3NpbmtfZ2V0X3R5cGUgKCksIE5VTEwpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBzaW5rKTsKKworICBnc3RfZWxlbWVudF9saW5rX21hbnkgKHNyYywgZGVwYXksIHNpbmssIE5VTEwpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QQVVTRUQpOworCisgIHsKKyAgICBnY2hhciAqZGF0YSwgKnBkYXRhOworICAgIGdzaXplIGxlbjsKKworICAgIGZhaWxfdW5sZXNzIChnX2ZpbGVfZ2V0X2NvbnRlbnRzIChSVFBfSDI2NF9GSUxFLCAmZGF0YSwgJmxlbiwgTlVMTCkpOworICAgIGZhaWxfdW5sZXNzIChsZW4gPiAyKTsKKworICAgIHBkYXRhID0gZGF0YTsKKyAgICB3aGlsZSAobGVuID4gMikgeworICAgICAgR3N0Rmxvd1JldHVybiBmbG93OworICAgICAgZ3VpbnQxNiBwYWNrZXRfbGVuOworCisgICAgICBwYWNrZXRfbGVuID0gR1NUX1JFQURfVUlOVDE2X0JFIChwZGF0YSk7CisgICAgICBHU1RfSU5GTyAoInJ0cCBwYWNrZXQgbGVuZ3RoOiAldSAoYnl0ZXMgbGVmdDogJXUpIiwgcGFja2V0X2xlbiwKKyAgICAgICAgICAoZ3VpbnQpIGxlbik7CisgICAgICBmYWlsX3VubGVzcyAobGVuID49IDIgKyBwYWNrZXRfbGVuKTsKKworICAgICAgZmxvdyA9IGdzdF9hcHBfc3JjX3B1c2hfYnVmZmVyIChHU1RfQVBQX1NSQyAoc3JjKSwKKyAgICAgICAgICBnc3RfYnVmZmVyX25ld193cmFwcGVkIChnX21lbWR1cCAocGRhdGEgKyAyLCBwYWNrZXRfbGVuKSwKKyAgICAgICAgICAgICAgcGFja2V0X2xlbikpOworCisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChmbG93LCBHU1RfRkxPV19PSyk7CisKKyAgICAgIHBkYXRhICs9IDIgKyBwYWNrZXRfbGVuOworICAgICAgbGVuIC09IDIgKyBwYWNrZXRfbGVuOworICAgIH0KKworICAgIGdfZnJlZSAoZGF0YSk7CisgIH0KKworICBnc3RfYXBwX3NyY19lbmRfb2Zfc3RyZWFtIChHU1RfQVBQX1NSQyAoc3JjKSk7CisKKyAgc2FtcGxlID0gZ3N0X2FwcF9zaW5rX3B1bGxfcHJlcm9sbCAoR1NUX0FQUF9TSU5LIChzaW5rKSk7CisgIGZhaWxfdW5sZXNzIChzYW1wbGUgIT0gTlVMTCk7CisKKyAgYnVmID0gZ3N0X3NhbXBsZV9nZXRfYnVmZmVyIChzYW1wbGUpOworCisgIEdTVF9MT0cgKCJidWZmZXIgaGFzICV1IG1lbW9yaWVzIiwgZ3N0X2J1ZmZlcl9uX21lbW9yeSAoYnVmKSk7CisgIEdTVF9MT0cgKCJidWZmZXIgc2l6ZTogJXUiLCAoZ3VpbnQpIGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZikpOworCisgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX25fbWVtb3J5IChidWYpID4gMCk7CisgIG1lbSA9IGdzdF9idWZmZXJfcGVla19tZW1vcnkgKGJ1ZiwgMCk7CisgIGZhaWxfdW5sZXNzIChtZW0gIT0gTlVMTCk7CisKKyAgR1NUX0xPRyAoImJ1ZmZlciBtZW1vcnkgdHlwZTogJXMiLCBtZW0tPmFsbG9jYXRvci0+bWVtX3R5cGUpOworICBmYWlsX3VubGVzcyAoZ3N0X21lbW9yeV9pc190eXBlIChtZW0sIEFMTE9DQVRPUl9DVVNUT01fU1lTTUVNKSk7CisKKyAgZ3N0X3NhbXBsZV91bnJlZiAoc2FtcGxlKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIGdfb2JqZWN0X3VucmVmIChjdXN0b21fc3lzbWVtX2FsbG9jYXRvcik7CisgIGN1c3RvbV9zeXNtZW1fYWxsb2NhdG9yID0gTlVMTDsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorcnRwaDI2NF9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJydHBoMjY0Iik7CisgIFRDYXNlICp0Y19jaGFpbjsKKworICB0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoInJ0cGgyNjRkZXBheSIpOworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3J0cGgyNjRkZXBheV93aXRoX2Rvd25zdHJlYW1fYWxsb2NhdG9yKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHJ0cGgyNjQpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBqaXR0ZXJidWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzEzYTBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwaml0dGVyYnVmZmVyLmMKQEAgLTAsMCArMSwyMTg1IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24gYW5kIGl0cyBzdWJzaWRhcnkoLWllcykKKyAqICAgICAgICAgICAgICAgY29udGFjdDogPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBDaXNjbyBTeXN0ZW1zLCBJbmMKKyAqICAgICAgICAgICAgICAgQXV0aG9yczogS2VsbGV5IFJvZ2VycyA8a2Vscm9AY2lzY28uY29tPgorICogICAgICAgICAgICAgICBIYXZhcmQgR3JhZmYgPGhncmFmZkBjaXNjby5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNiBQZXhpcCBBUworICogICAgICAgICAgICAgICBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwPgorICogICAgICAgICAgICAgICBIYXZhcmQgR3JhZmYgPGhhdmFyZEBwZXhpcD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdHRlc3RjbG9jay5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RoYXJuZXNzLmg+CisKKyNpbmNsdWRlIDxnc3QvcnRwL2dzdHJ0cGJ1ZmZlci5oPgorCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitzdGF0aWMgR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKKy8qIHdlIGFsc28gaGF2ZSBhIGxpc3Qgb2Ygc3JjIGJ1ZmZlcnMgKi8KK3N0YXRpYyBHTGlzdCAqaW5idWZmZXJzID0gTlVMTDsKK3N0YXRpYyBnaW50IG51bV9kcm9wcGVkID0gMDsKKworI2RlZmluZSBSVFBfQ0FQU19TVFJJTkcgICAgXAorICAgICJhcHBsaWNhdGlvbi94LXJ0cCwgIiAgICAgICAgICAgICAgIFwKKyAgICAibWVkaWEgPSAoc3RyaW5nKWF1ZGlvLCAiICAgICAgICAgICBcCisgICAgInBheWxvYWQgPSAoaW50KSAwLCAiICAgICAgICAgICAgICAgXAorICAgICJjbG9jay1yYXRlID0gKGludCkgODAwMCwgIiAgICAgICAgIFwKKyAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpUENNVSIKKworI2RlZmluZSBSVFBfRlJBTUVfU0laRSAyMAorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKQorICAgICk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICAgImNsb2NrLXJhdGUgPSAoaW50KSBbIDEsIDIxNDc0ODM2NDcgXSIpCisgICAgKTsKKworc3RhdGljIHZvaWQKK2J1ZmZlcl9kcm9wcGVkIChncG9pbnRlciBkYXRhLCBHc3RNaW5pT2JqZWN0ICogb2JqKQoreworICBHU1RfREVCVUcgKCJkcm9wcGluZyBidWZmZXIgJXAiLCBvYmopOworICBudW1fZHJvcHBlZCsrOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9qaXR0ZXJidWZmZXIgKGdpbnQgbnVtX2J1ZmZlcnMpCit7CisgIEdzdEVsZW1lbnQgKmppdHRlcmJ1ZmZlcjsKKyAgR3N0Q2xvY2sgKmNsb2NrOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgLyogYSAyMCBzYW1wbGUgYXVkaW8gYmxvY2sgKDIsNSBtcykgZ2VuZXJhdGVkIHdpdGgKKyAgICogZ3N0LWxhdW5jaCBhdWRpb3Rlc3RzcmMgd2F2ZT1zaWxlbmNlIGJsb2Nrc2l6ZT00MCBudW0tYnVmZmVycz0zICEKKyAgICogICAgImF1ZGlvL3gtcmF3LGNoYW5uZWxzPTEscmF0ZT04MDAwIiAhIG11bGF3ZW5jICEgcnRwcGNtdXBheSAhCisgICAqICAgICBmYWtlc2luayBkdW1wPTEKKyAgICovCisgIGd1aW50OCBpbltdID0geworICAgIC8qIGZpcnN0IDQgYnl0ZXMgYXJlIHJ0cC1oZWFkZXIsIG5leHQgNCBieXRlcyBhcmUgdGltZXN0YW1wICovCisgICAgMHg4MCwgMHg4MCwgMHgxYywgMHgyNCwgMHg0NiwgMHhjZCwgMHhiNywgMHgxMSwgMHgzYywgMHgzYSwgMHg3YywgMHg1YiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKKyAgfTsKKyAgR3N0Q2xvY2tUaW1lIHRzID0gR19HVUlOVDY0X0NPTlNUQU5UICgwKTsKKyAgR3N0Q2xvY2tUaW1lIHRzbyA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoUlRQX0ZSQU1FX1NJWkUsIEdTVF9TRUNPTkQsIDgwMDApOworICAvKmd1aW50IGxhdGVuY3kgPSBHU1RfVElNRV9BU19NU0VDT05EUyAobnVtX2J1ZmZlcnMgKiB0c28pOyAqLworICBnaW50IGk7CisKKyAgR1NUX0RFQlVHICgic2V0dXBfaml0dGVyYnVmZmVyIik7CisgIGppdHRlcmJ1ZmZlciA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgicnRwaml0dGVyYnVmZmVyIik7CisgIC8qIHdlIG5lZWQgYSBjbG9jayBoZXJlICovCisgIGNsb2NrID0gZ3N0X3N5c3RlbV9jbG9ja19vYnRhaW4gKCk7CisgIGdzdF9lbGVtZW50X3NldF9jbG9jayAoaml0dGVyYnVmZmVyLCBjbG9jayk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGNsb2NrKTsKKyAgLyogc2V0dXAgbGF0ZW5jeSAqLworICAvKiBsYXRlbmN5IHdvdWxkIGJlIDcgZm9yIDMgYnVmZmVycyBoZXJlLCBkZWZhdWx0IGlzIDIwMAorICAgICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChqaXR0ZXJidWZmZXIpLCAibGF0ZW5jeSIsIGxhdGVuY3ksIE5VTEwpOworICAgICBHU1RfSU5GT19PQkpFQ1QgKGppdHRlcmJ1ZmZlciwgInNldCBsYXRlbmN5IHRvICV1IG1zIiwgbGF0ZW5jeSk7CisgICAqLworCisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKGppdHRlcmJ1ZmZlciwgJnNyY3RlbXBsYXRlKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChqaXR0ZXJidWZmZXIsICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworCisgIC8qIGNyZWF0ZSBuIGJ1ZmZlcnMgKi8KKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChSVFBfQ0FQU19TVFJJTkcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgaml0dGVyYnVmZmVyLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9idWZmZXJzOyBpKyspIHsKKyAgICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHNpemVvZiAoaW4pKTsKKyAgICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZmZlciwgMCwgaW4sIHNpemVvZiAoaW4pKTsKKyAgICBHU1RfQlVGRkVSX0RUUyAoYnVmZmVyKSA9IHRzOworICAgIEdTVF9CVUZGRVJfUFRTIChidWZmZXIpID0gdHM7CisgICAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSA9IHRzbzsKKyAgICBnc3RfbWluaV9vYmplY3Rfd2Vha19yZWYgKEdTVF9NSU5JX09CSkVDVCAoYnVmZmVyKSwgYnVmZmVyX2Ryb3BwZWQsIE5VTEwpOworICAgIEdTVF9ERUJVRyAoImNyZWF0ZWQgYnVmZmVyOiAlcCIsIGJ1ZmZlcik7CisKKyAgICBpZiAoIWkpCisgICAgICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKTsKKworICAgIGluYnVmZmVycyA9IGdfbGlzdF9hcHBlbmQgKGluYnVmZmVycywgYnVmZmVyKTsKKworICAgIC8qIGhhY2tpc2ggd2F5IHRvIHVwZGF0ZSB0aGUgcnRwIGhlYWRlciAqLworICAgIGluWzFdID0gMHgwMDsKKyAgICBpblszXSsrOyAgICAgICAgICAgICAgICAgICAgLyogc2VxbnVtYmVyICovCisgICAgaW5bN10gKz0gUlRQX0ZSQU1FX1NJWkU7ICAgIC8qIGluYy4gdGltZXN0YW1wIHdpdGggZnJhbWVzaXplICovCisgICAgdHMgKz0gdHNvOworICB9CisgIG51bV9kcm9wcGVkID0gMDsKKworICByZXR1cm4gaml0dGVyYnVmZmVyOworfQorCitzdGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4KK3N0YXJ0X2ppdHRlcmJ1ZmZlciAoR3N0RWxlbWVudCAqIGppdHRlcmJ1ZmZlcikKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0OworICBHc3RDbG9ja1RpbWUgbm93OworICBHc3RDbG9jayAqY2xvY2s7CisKKyAgY2xvY2sgPSBnc3RfZWxlbWVudF9nZXRfY2xvY2sgKGppdHRlcmJ1ZmZlcik7CisgIG5vdyA9IGdzdF9jbG9ja19nZXRfdGltZSAoY2xvY2spOworICBnc3Rfb2JqZWN0X3VucmVmIChjbG9jayk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X2Jhc2VfdGltZSAoaml0dGVyYnVmZmVyLCBub3cpOworICByZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGppdHRlcmJ1ZmZlciwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX2ppdHRlcmJ1ZmZlciAoR3N0RWxlbWVudCAqIGppdHRlcmJ1ZmZlcikKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF9qaXR0ZXJidWZmZXIiKTsKKworICBnX2xpc3RfZm9yZWFjaCAoYnVmZmVycywgKEdGdW5jKSBnc3RfbWluaV9vYmplY3RfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGdfbGlzdF9mcmVlIChpbmJ1ZmZlcnMpOworICBpbmJ1ZmZlcnMgPSBOVUxMOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKGppdHRlcmJ1ZmZlcik7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoaml0dGVyYnVmZmVyKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGppdHRlcmJ1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19qaXR0ZXJidWZmZXJfcmVzdWx0cyAoR3N0RWxlbWVudCAqIGppdHRlcmJ1ZmZlciwgZ2ludCBudW1fYnVmZmVycykKK3sKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdMaXN0ICpub2RlOworICBHc3RDbG9ja1RpbWUgdHMgPSBHX0dVSU5UNjRfQ09OU1RBTlQgKDApOworICBHc3RDbG9ja1RpbWUgdHNvID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlIChSVFBfRlJBTUVfU0laRSwgR1NUX1NFQ09ORCwgODAwMCk7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDE2IHByZXZfc24gPSAwLCBjdXJfc247CisgIGd1aW50MzIgcHJldl90cyA9IDAsIGN1cl90czsKKworICAvKiBzbGVlcCBmb3IgdHdpY2UgdGhlIGxhdGVuY3kgKi8KKyAgZ191c2xlZXAgKDQwMCAqIDEwMDApOworCisgIEdTVF9JTkZPICgib2YgJWQgYnVmZmVyICVkLyVkIHJlY2VpdmVkL2Ryb3BwZWQiLCBudW1fYnVmZmVycywKKyAgICAgIGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCBudW1fZHJvcHBlZCk7CisgIC8qIGlmIHRoaXMgZmFpbHMsIG5vdCBhbGwgYnVmZmVycyBoYXZlIGJlZW4gcHJvY2Vzc2VkICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSArIG51bV9kcm9wcGVkKSwgbnVtX2J1ZmZlcnMpOworCisgIC8qIGNoZWNrIHRoZSBidWZmZXIgbGlzdCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgbnVtX2J1ZmZlcnMpOworICBmb3IgKG5vZGUgPSBidWZmZXJzOyBub2RlOyBub2RlID0gZ19saXN0X25leHQgKG5vZGUpKSB7CisgICAgZmFpbF9pZiAoKGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgbm9kZS0+ZGF0YSkgPT0gTlVMTCk7CisgICAgZmFpbF9pZiAoR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcikgIT0gdHMpOworICAgIGZhaWxfaWYgKEdTVF9CVUZGRVJfRFRTIChidWZmZXIpICE9IHRzKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIGN1cl9zbiA9ICgoZ3VpbnQxNikgbWFwLmRhdGFbMl0gPDwgOCkgfCBtYXAuZGF0YVszXTsKKyAgICBjdXJfdHMgPSAoKGd1aW50MzIpIG1hcC5kYXRhWzRdIDw8IDI0KSB8ICgoZ3VpbnQzMikgbWFwLmRhdGFbNV0gPDwgMTYpIHwKKyAgICAgICAgKChndWludDMyKSBtYXAuZGF0YVs2XSA8PCA4KSB8IG1hcC5kYXRhWzddOworICAgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZmZlciwgJm1hcCk7CisKKyAgICBpZiAobm9kZSAhPSBidWZmZXJzKSB7CisgICAgICBmYWlsX3VubGVzcyAoY3VyX3NuID4gcHJldl9zbik7CisgICAgICBmYWlsX3VubGVzcyAoY3VyX3RzID4gcHJldl90cyk7CisKKyAgICAgIHByZXZfc24gPSBjdXJfc247CisgICAgICBwcmV2X3RzID0gY3VyX3RzOworICAgIH0KKyAgICB0cyArPSB0c287CisgIH0KK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcHVzaF9mb3J3YXJkX3NlcSkKK3sKKyAgR3N0RWxlbWVudCAqaml0dGVyYnVmZmVyOworICBjb25zdCBndWludCBudW1fYnVmZmVycyA9IDM7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBHTGlzdCAqbm9kZTsKKworICBqaXR0ZXJidWZmZXIgPSBzZXR1cF9qaXR0ZXJidWZmZXIgKG51bV9idWZmZXJzKTsKKyAgZmFpbF91bmxlc3MgKHN0YXJ0X2ppdHRlcmJ1ZmZlciAoaml0dGVyYnVmZmVyKQorICAgICAgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLCAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgLyogcHVzaCBidWZmZXJzOiAwLDEsMiwgKi8KKyAgZm9yIChub2RlID0gaW5idWZmZXJzOyBub2RlOyBub2RlID0gZ19saXN0X25leHQgKG5vZGUpKSB7CisgICAgYnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhOworICAgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBidWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgfQorCisgIC8qIGNoZWNrIHRoZSBidWZmZXIgbGlzdCAqLworICBjaGVja19qaXR0ZXJidWZmZXJfcmVzdWx0cyAoaml0dGVyYnVmZmVyLCBudW1fYnVmZmVycyk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2ppdHRlcmJ1ZmZlciAoaml0dGVyYnVmZmVyKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wdXNoX2JhY2t3YXJkX3NlcSkKK3sKKyAgR3N0RWxlbWVudCAqaml0dGVyYnVmZmVyOworICBjb25zdCBndWludCBudW1fYnVmZmVycyA9IDQ7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBHTGlzdCAqbm9kZTsKKworICBqaXR0ZXJidWZmZXIgPSBzZXR1cF9qaXR0ZXJidWZmZXIgKG51bV9idWZmZXJzKTsKKyAgZmFpbF91bmxlc3MgKHN0YXJ0X2ppdHRlcmJ1ZmZlciAoaml0dGVyYnVmZmVyKQorICAgICAgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLCAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgLyogcHVzaCBidWZmZXJzOiAwLDMsMiwxICovCisgIGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgaW5idWZmZXJzLT5kYXRhOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGZvciAobm9kZSA9IGdfbGlzdF9sYXN0IChpbmJ1ZmZlcnMpOyBub2RlICE9IGluYnVmZmVyczsKKyAgICAgIG5vZGUgPSBnX2xpc3RfcHJldmlvdXMgKG5vZGUpKSB7CisgICAgYnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBub2RlLT5kYXRhOworICAgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBidWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgfQorCisgIC8qIGNoZWNrIHRoZSBidWZmZXIgbGlzdCAqLworICBjaGVja19qaXR0ZXJidWZmZXJfcmVzdWx0cyAoaml0dGVyYnVmZmVyLCBudW1fYnVmZmVycyk7CisKKyAgLyogY2xlYW51cCAqLworICBjbGVhbnVwX2ppdHRlcmJ1ZmZlciAoaml0dGVyYnVmZmVyKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wdXNoX3Vub3JkZXJlZCkKK3sKKyAgR3N0RWxlbWVudCAqaml0dGVyYnVmZmVyOworICBjb25zdCBndWludCBudW1fYnVmZmVycyA9IDQ7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworCisgIGppdHRlcmJ1ZmZlciA9IHNldHVwX2ppdHRlcmJ1ZmZlciAobnVtX2J1ZmZlcnMpOworICBmYWlsX3VubGVzcyAoc3RhcnRfaml0dGVyYnVmZmVyIChqaXR0ZXJidWZmZXIpCisgICAgICA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICAvKiBwdXNoIGJ1ZmZlcnM7IDAsMiwxLDMgKi8KKyAgYnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBpbmJ1ZmZlcnMtPmRhdGE7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBidWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgYnVmZmVyID0gZ19saXN0X250aF9kYXRhIChpbmJ1ZmZlcnMsIDIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIGJ1ZmZlciA9IGdfbGlzdF9udGhfZGF0YSAoaW5idWZmZXJzLCAxKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICBidWZmZXIgPSBnX2xpc3RfbnRoX2RhdGEgKGluYnVmZmVycywgMyk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBidWZmZXIpID09IEdTVF9GTE9XX09LKTsKKworICAvKiBjaGVjayB0aGUgYnVmZmVyIGxpc3QgKi8KKyAgY2hlY2tfaml0dGVyYnVmZmVyX3Jlc3VsdHMgKGppdHRlcmJ1ZmZlciwgbnVtX2J1ZmZlcnMpOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9qaXR0ZXJidWZmZXIgKGppdHRlcmJ1ZmZlcik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYmFzZXRpbWUpCit7CisgIEdzdEVsZW1lbnQgKmppdHRlcmJ1ZmZlcjsKKyAgY29uc3QgZ3VpbnQgbnVtX2J1ZmZlcnMgPSAzOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR0xpc3QgKm5vZGU7CisgIEdzdENsb2NrVGltZSB0c28gPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKFJUUF9GUkFNRV9TSVpFLCBHU1RfU0VDT05ELCA4MDAwKTsKKworICBqaXR0ZXJidWZmZXIgPSBzZXR1cF9qaXR0ZXJidWZmZXIgKG51bV9idWZmZXJzKTsKKyAgZmFpbF91bmxlc3MgKHN0YXJ0X2ppdHRlcmJ1ZmZlciAoaml0dGVyYnVmZmVyKQorICAgICAgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLCAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgLyogcHVzaCBidWZmZXJzOiAyLDEsMCAqLworICBmb3IgKG5vZGUgPSBnX2xpc3RfbGFzdCAoaW5idWZmZXJzKTsgbm9kZTsgbm9kZSA9IGdfbGlzdF9wcmV2aW91cyAobm9kZSkpIHsKKyAgICBidWZmZXIgPSAoR3N0QnVmZmVyICopIG5vZGUtPmRhdGE7CisgICAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICB9CisKKyAgLyogc2xlZXAgZm9yIHR3aWNlIHRoZSBsYXRlbmN5ICovCisgIGdfdXNsZWVwICg0MDAgKiAxMDAwKTsKKworICAvKiBpZiB0aGlzIGZhaWxzLCBub3QgYWxsIGJ1ZmZlcnMgaGF2ZSBiZWVuIHByb2Nlc3NlZCAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgoZ19saXN0X2xlbmd0aCAoYnVmZmVycykgKyBudW1fZHJvcHBlZCksIG51bV9idWZmZXJzKTsKKworICBidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGE7CisgIGZhaWxfdW5sZXNzIChHU1RfQlVGRkVSX0RUUyAoYnVmZmVyKSAhPSAobnVtX2J1ZmZlcnMgKiB0c28pKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfUFRTIChidWZmZXIpICE9IChudW1fYnVmZmVycyAqIHRzbykpOworCisgIC8qIGNsZWFudXAgKi8KKyAgY2xlYW51cF9qaXR0ZXJidWZmZXIgKGppdHRlcmJ1ZmZlcik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIEdzdENhcHMgKgorcmVxdWVzdF9wdF9tYXAgKEdzdEVsZW1lbnQgKiBqaXR0ZXJidWZmZXIsIGd1aW50IHB0KQoreworICBmYWlsX3VubGVzcyAocHQgPT0gMCk7CisKKyAgcmV0dXJuIGdzdF9jYXBzX2Zyb21fc3RyaW5nIChSVFBfQ0FQU19TVFJJTkcpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9jbGVhcl9wdF9tYXApCit7CisgIEdzdEVsZW1lbnQgKmppdHRlcmJ1ZmZlcjsKKyAgY29uc3QgZ3VpbnQgbnVtX2J1ZmZlcnMgPSAxMDsKKyAgZ2ludCBpOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR0xpc3QgKm5vZGU7CisKKyAgaml0dGVyYnVmZmVyID0gc2V0dXBfaml0dGVyYnVmZmVyIChudW1fYnVmZmVycyk7CisgIGZhaWxfdW5sZXNzIChzdGFydF9qaXR0ZXJidWZmZXIgKGppdHRlcmJ1ZmZlcikKKyAgICAgID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGppdHRlcmJ1ZmZlciwgInJlcXVlc3QtcHQtbWFwIiwgKEdDYWxsYmFjaykKKyAgICAgIHJlcXVlc3RfcHRfbWFwLCBOVUxMKTsKKworICAvKiBwdXNoIGJ1ZmZlcnM6IDAsMSwyLCAqLworICBmb3IgKG5vZGUgPSBpbmJ1ZmZlcnMsIGkgPSAwOyBub2RlICYmIGkgPCAzOyBub2RlID0gZ19saXN0X25leHQgKG5vZGUpLCBpKyspIHsKKyAgICBidWZmZXIgPSAoR3N0QnVmZmVyICopIG5vZGUtPmRhdGE7CisgICAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICB9CisKKyAgZ191c2xlZXAgKDQwMCAqIDEwMDApOworCisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAoaml0dGVyYnVmZmVyLCAiY2xlYXItcHQtbWFwIiwgTlVMTCk7CisKKyAgZm9yICg7IG5vZGUgJiYgaSA8IDEwOyBub2RlID0gZ19saXN0X25leHQgKG5vZGUpLCBpKyspIHsKKyAgICBidWZmZXIgPSAoR3N0QnVmZmVyICopIG5vZGUtPmRhdGE7CisgICAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICB9CisKKyAgLyogY2hlY2sgdGhlIGJ1ZmZlciBsaXN0ICovCisgIGNoZWNrX2ppdHRlcmJ1ZmZlcl9yZXN1bHRzIChqaXR0ZXJidWZmZXIsIG51bV9idWZmZXJzKTsKKworICAvKiBjbGVhbnVwICovCisgIGNsZWFudXBfaml0dGVyYnVmZmVyIChqaXR0ZXJidWZmZXIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKyNkZWZpbmUgVEVTVF9CVUZfQ0xPQ0tfUkFURSA4MDAwCisjZGVmaW5lIFRFU1RfQlVGX1BUIDAKKyNkZWZpbmUgVEVTVF9CVUZfU1NSQyAweDAxQkFEQkFECisjZGVmaW5lIFRFU1RfQlVGX01TICAyMAorI2RlZmluZSBURVNUX0JVRl9EVVJBVElPTiAoVEVTVF9CVUZfTVMgKiBHU1RfTVNFQ09ORCkKKyNkZWZpbmUgVEVTVF9CVUZfU0laRSAoNjQwMDAgKiBURVNUX0JVRl9NUyAvIDEwMDApCisjZGVmaW5lIFRFU1RfUlRQX1RTX0RVUkFUSU9OIChURVNUX0JVRl9DTE9DS19SQVRFICogVEVTVF9CVUZfTVMgLyAxMDAwKQorCitzdGF0aWMgR3N0Q2FwcyAqCitnZW5lcmF0ZV9jYXBzICh2b2lkKQoreworICByZXR1cm4gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtcnRwIiwKKyAgICAgICJtZWRpYSIsIEdfVFlQRV9TVFJJTkcsICJhdWRpbyIsCisgICAgICAiY2xvY2stcmF0ZSIsIEdfVFlQRV9JTlQsIFRFU1RfQlVGX0NMT0NLX1JBVEUsCisgICAgICAiZW5jb2RpbmctbmFtZSIsIEdfVFlQRV9TVFJJTkcsICJURVNUIiwKKyAgICAgICJwYXlsb2FkIiwgR19UWVBFX0lOVCwgVEVTVF9CVUZfUFQsCisgICAgICAic3NyYyIsIEdfVFlQRV9VSU5ULCBURVNUX0JVRl9TU1JDLCBOVUxMKTsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9mdWxsIChHc3RDbG9ja1RpbWUgZHRzLCBndWludCBzZXFfbnVtLCBndWludDMyIHJ0cF90cykKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgZ3VpbnQgaTsKKyAgR3N0UlRQQnVmZmVyIHJ0cCA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisKKyAgYnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChURVNUX0JVRl9TSVpFLCAwLCAwKTsKKyAgR1NUX0JVRkZFUl9EVFMgKGJ1ZikgPSBkdHM7CisKKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChidWYsIEdTVF9NQVBfUkVBRFdSSVRFLCAmcnRwKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3BheWxvYWRfdHlwZSAoJnJ0cCwgVEVTVF9CVUZfUFQpOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfc2VxICgmcnRwLCBzZXFfbnVtKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3RpbWVzdGFtcCAoJnJ0cCwgcnRwX3RzKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3NzcmMgKCZydHAsIFRFU1RfQlVGX1NTUkMpOworCisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisgIGZvciAoaSA9IDA7IGkgPCBURVNUX0JVRl9TSVpFOyBpKyspCisgICAgcGF5bG9hZFtpXSA9IDB4ZmY7CisKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ2VuZXJhdGVfdGVzdF9idWZmZXIgKGd1aW50IHNlcV9udW0pCit7CisgIHJldHVybiBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9mdWxsIChzZXFfbnVtICogVEVTVF9CVUZfRFVSQVRJT04sCisgICAgICBzZXFfbnVtLCBzZXFfbnVtICogVEVTVF9SVFBfVFNfRFVSQVRJT04pOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2dlbmVyYXRlX3Rlc3RfYnVmZmVyX3J0eCAoR3N0Q2xvY2tUaW1lIGR0cywgZ3VpbnQgc2VxX251bSkKK3sKKyAgR3N0QnVmZmVyICpidWZmZXIgPSBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9mdWxsIChkdHMsIHNlcV9udW0sCisgICAgICBzZXFfbnVtICogVEVTVF9SVFBfVFNfRFVSQVRJT04pOworICBHU1RfQlVGRkVSX0ZMQUdfU0VUIChidWZmZXIsIEdTVF9SVFBfQlVGRkVSX0ZMQUdfUkVUUkFOU01JU1NJT04pOworICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgdm9pZAorcHVzaF90ZXN0X2J1ZmZlciAoR3N0SGFybmVzcyAqIGgsIGd1aW50IHNlcV9udW0pCit7CisgIGdzdF9oYXJuZXNzX3NldF90aW1lIChoLCBzZXFfbnVtICogVEVTVF9CVUZfRFVSQVRJT04pOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgZ3N0X2hhcm5lc3NfcHVzaCAoaCwKKyAgICAgICAgICBnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoc2VxX251bSkpKTsKK30KKworc3RhdGljIGdpbnQKK2dldF9ydHBfc2VxX251bSAoR3N0QnVmZmVyICogYnVmKQoreworICBHc3RSVFBCdWZmZXIgcnRwID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKyAgZ2ludCBzZXE7CisgIGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQUQsICZydHApOworICBzZXEgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfc2VxICgmcnRwKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworICByZXR1cm4gc2VxOworfQorCisjZGVmaW5lIHZlcmlmeV9sb3N0X2V2ZW50KGgsIGV4cF9zZXEsIGV4cF90cywgZXhwX2R1cikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHc3RFdmVudCAqX2V2ZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgR3N0U3RydWN0dXJlICpfczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IEdWYWx1ZSAqX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBndWludCBfc2VxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR3N0Q2xvY2tUaW1lIF90czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdzdENsb2NrVGltZSBfZHVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfZXZlbnQgPSBnc3RfaGFybmVzc19wdWxsX2V2ZW50IChoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmFpbF91bmxlc3MgKF9ldmVudCAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9zID0gZ3N0X2V2ZW50X2dldF9zdHJ1Y3R1cmUgKF9ldmVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmYWlsX3VubGVzcyAoX3MgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKF9zLCAic2VxbnVtIiwgJl9zZXEpKTsgICAgICAgICAgICAgICAgXAorICAgIF92YWx1ZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChfcywgInRpbWVzdGFtcCIpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmYWlsX3VubGVzcyAoX3ZhbHVlICYmIEdfVkFMVUVfSE9MRFNfVUlOVDY0IChfdmFsdWUpKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3RzID0gZ192YWx1ZV9nZXRfdWludDY0IChfdmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF92YWx1ZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChfcywgImR1cmF0aW9uIik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmYWlsX3VubGVzcyAoX3ZhbHVlICYmIEdfVkFMVUVfSE9MRFNfVUlOVDY0IChfdmFsdWUpKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgX2R1ciA9IGdfdmFsdWVfZ2V0X3VpbnQ2NCAoX3ZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKChndWludDE2KShleHBfc2VxKSwgX3NlcSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChleHBfdHMsIF90cyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoZXhwX2R1ciwgX2R1cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdzdF9ldmVudF91bnJlZiAoX2V2ZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBHX1NUTVRfRU5ECisKKworI2RlZmluZSB2ZXJpZnlfcnR4X2V2ZW50KGgsIGV4cF9zZXEsIGV4cF90cywgZXhwX2RlbGF5LCBleHBfc3BhY2luZykgICAgICAgICAgIFwKKyAgR19TVE1UX1NUQVJUIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR3N0RXZlbnQgKl9ldmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqX3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBHVmFsdWUgKl92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ3VpbnQgX3NlcTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdzdENsb2NrVGltZSBfdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBndWludCBfZGVsYXk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR3N0Q2xvY2tUaW1lIF9zcGFjaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9ldmVudCA9IGdzdF9oYXJuZXNzX3B1bGxfdXBzdHJlYW1fZXZlbnQgKGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmYWlsX3VubGVzcyAoX2V2ZW50ICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3MgPSBnc3RfZXZlbnRfZ2V0X3N0cnVjdHVyZSAoX2V2ZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZhaWxfdW5sZXNzIChfcyAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9nZXRfdWludCAoX3MsICJzZXFudW0iLCAmX3NlcSkpOyAgICAgICAgICAgICAgICBcCisgICAgX3ZhbHVlID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKF9zLCAicnVubmluZy10aW1lIik7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZhaWxfdW5sZXNzIChfdmFsdWUgJiYgR19WQUxVRV9IT0xEU19VSU5UNjQgKF92YWx1ZSkpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfdHMgPSBnX3ZhbHVlX2dldF91aW50NjQgKF92YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfZ2V0X3VpbnQgKF9zLCAiZGVsYXkiLCAmX2RlbGF5KSk7ICAgICAgICAgICAgICAgXAorICAgIF92YWx1ZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChfcywgInBhY2tldC1zcGFjaW5nIik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBmYWlsX3VubGVzcyAoX3ZhbHVlICYmIEdfVkFMVUVfSE9MRFNfVUlOVDY0IChfdmFsdWUpKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3NwYWNpbmcgPSBnX3ZhbHVlX2dldF91aW50NjQgKF92YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKChndWludDE2KShleHBfc2VxKSwgX3NlcSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChleHBfdHMsIF90cyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZXhwX2RlbGF5LCBfZGVsYXkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKGV4cF9zcGFjaW5nLCBfc3BhY2luZyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnc3RfZXZlbnRfdW5yZWYgKF9ldmVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gR19TVE1UX0VORAorCitzdGF0aWMgZ2Jvb2xlYW4KK3ZlcmlmeV9qYl9zdGF0cyAoR3N0RWxlbWVudCAqIGpiLCBHc3RTdHJ1Y3R1cmUgKiBleHBlY3RlZCkKK3sKKyAgZ2Jvb2xlYW4gcmV0OworICBHc3RTdHJ1Y3R1cmUgKmFjdHVhbDsKKyAgZ19vYmplY3RfZ2V0IChqYiwgInN0YXRzIiwgJmFjdHVhbCwgTlVMTCk7CisKKyAgcmV0ID0gZ3N0X3N0cnVjdHVyZV9pc19zdWJzZXQgKGFjdHVhbCwgZXhwZWN0ZWQpOworCisgIGlmICghcmV0KSB7CisgICAgZ2NoYXIgKmVfc3RyID0gZ3N0X3N0cnVjdHVyZV90b19zdHJpbmcgKGV4cGVjdGVkKTsKKyAgICBnY2hhciAqYV9zdHIgPSBnc3Rfc3RydWN0dXJlX3RvX3N0cmluZyAoYWN0dWFsKTsKKyAgICBmYWlsX3VubGVzcyAocmV0LCAiJXMgaXMgbm90IGEgc3Vic2V0IG9mICVzIiwgZV9zdHIsIGFfc3RyKTsKKyAgICBnX2ZyZWUgKGVfc3RyKTsKKyAgICBnX2ZyZWUgKGFfc3RyKTsKKyAgfQorCisgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoZXhwZWN0ZWQpOworICBnc3Rfc3RydWN0dXJlX2ZyZWUgKGFjdHVhbCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGd1aW50Citjb25zdHJ1Y3RfZGV0ZXJtaW5pc3RpY19pbml0aWFsX3N0YXRlIChHc3RIYXJuZXNzICogaCwgZ2ludCBsYXRlbmN5X21zKQoreworICBndWludCBuZXh0X3NlcW51bSA9IGxhdGVuY3lfbXMgLyBURVNUX0JVRl9NUyArIDE7CisgIGd1aW50IHNlcW51bTsKKyAgZ2ludCBpOworCisgIGdfYXNzZXJ0IChsYXRlbmN5X21zICUgVEVTVF9CVUZfTVMgPT0gMCk7CisKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzIChoLCBnZW5lcmF0ZV9jYXBzICgpKTsKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAibGF0ZW5jeSIsIGxhdGVuY3lfbXMsIE5VTEwpOworCisgIC8qIFdoZW4gdGhlIGZpcnN0IHBhY2tldCBhcnJpdmVzIGluIHRoZSBqaXR0ZXJidWZmZXIsIGl0IHdpbGwgY3JlYXRlIGEKKyAgICogdGltZW91dCBmb3IgdGhpcyBwYWNrZXQgZXF1YWwgdG8gdGhlIGxhdGVuY3kgb2YgdGhlIGppdHRlcmJ1ZmZlci4KKyAgICogVGhpcyBpcyBrbm93biBhcyBERUFETElORSBpbnRlcm5hbGx5LCBhbmQgaXMgbWVhbnQgdG8gYWxsb3cgdGhlIHN0cmVhbQorICAgKiB0byBidWZmZXIgYSBiaXQgYmVmb3JlIHN0YXJ0aW5nIHRvIHB1c2ggaXQgb3V0LCB0byBnZXQgc29tZSBpZGVhcyBhYm91dAorICAgKiB0aGUgbmF0dXJlIG9mIHRoZSBzdHJlYW0uIChwYWNrZXRzcGFjaW5nLCBqaXR0ZXIgZXRjLikKKyAgICoKKyAgICogV2hlbiB3cml0aW5nIHRlc3RzIHVzaW5nIHRoZSB0ZXN0LWNsb2NrLCBpdCBpdCBoZW5jZSBpbXBvcnRhbnQgdG8ga25vdworICAgKiB0aGF0IGJ5IHNpbXBseSBhZHZhbmNpbmcgdGhlIGNsb2NrIHRvIHRoaXMgdGltZW91dCwgeW91IGFyZSBiYXNpY2FsbHkKKyAgICogZGVzY3JpYmluZyBhIHN0cmVhbSB0aGF0IGhhZCBvbmUgaW5pdGlhbCBwYWNrZXQsIGFuZCB0aGVuIG5vdGhpbmcgYXQgYWxsCisgICAqIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGxhdGVuY3kgKDEwMG1zIGluIHRoaXMgdGVzdCksIHdoaWNoIGlzIG5vdCBhIHZlcnkKKyAgICogdXN1YWwgc2NlbmFyaW8uCisgICAqCisgICAqIEluc3RlYWQsIGEgcGF0dGVybiB1c2VkIHRocm91Z2hvdXQgdGhpcyB0ZXN0LXN1aXRlLCBpcyB0byBrZWVwIHRoZSBidWZmZXJzCisgICAqIGFycml2aW5nIGF0IHRoZWlyIG9wdGltYWwgdGltZSwgdW50aWwgdGhlIERFQURMSU5FIGlzIHJlYWNoZWQsIGFuZCB0aGF0CisgICAqIHRoZW4gYmVjb21lcyB0aGUgInN0YXJ0aW5nLXBvaW50IiBmb3IgdGhlIHRlc3QsIGJlY2F1c2UgYXQgdGhpcyB0aW1lCisgICAqIHRoZXJlIHNob3VsZCBub3cgYmUgbm8gd2FpdGluZyB0aW1lcnMgKHVubGVzcyB1c2luZyBydHgpIGFuZCB3ZSBoYXZlCisgICAqIGEgImNsZWFuIiBzdGF0ZSB0byBjcmFmdCB0aGUgdGVzdCBmcm9tLgorICAgKi8KKworICAvKiBQYWNrZXQgMCBhcnJpdmVzIGF0IHRpbWUgMG1zLCBQYWNrZXQgNSBhcnJpdmVzIGF0IHRpbWUgMTAwbXMgKi8KKyAgZm9yIChzZXFudW0gPSAwOyBzZXFudW0gPCBuZXh0X3NlcW51bTsgc2VxbnVtKyspIHsKKyAgICBwdXNoX3Rlc3RfYnVmZmVyIChoLCBzZXFudW0pOworICAgIGdzdF9oYXJuZXNzX3dhaXRfZm9yX2Nsb2NrX2lkX3dhaXRzIChoLCAxLCA2MCk7CisgIH0KKworICAvKiBXZSByZWxlYXNlIHRoZSBERUFETElORSB0aW1lciBmb3IgcGFja2V0IDAsIHZlcmlmeSB0aGUgdGltZSBpcyBpbmRlZWQKKyAgICogQGxhdGVuY3lfbXMgKDEwMG1zKSBhbmQgcHVsbCBvdXQgYWxsIHRoZSBidWZmZXJzIHRoYXQgaGF2ZSBiZWVuIHJlbGVhc2VkLAorICAgKiBhbmQgdmVyaWZ5IHRoZWlyIFBUUyBhbmQgc2VxdWVuY2UgbnVtYmVycy4KKyAgICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludDY0IChsYXRlbmN5X21zICogR1NUX01TRUNPTkQsCisgICAgICBnc3RfY2xvY2tfZ2V0X3RpbWUgKEdTVF9FTEVNRU5UX0NMT0NLIChoLT5lbGVtZW50KSkpOworICBmb3IgKHNlcW51bSA9IDA7IHNlcW51bSA8IG5leHRfc2VxbnVtOyBzZXFudW0rKykgeworICAgIEdzdEJ1ZmZlciAqYnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoc2VxbnVtICogVEVTVF9CVUZfRFVSQVRJT04sCisgICAgICAgIEdTVF9CVUZGRVJfUFRTIChidWYpKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChzZXFudW0sIGdldF9ydHBfc2VxX251bSAoYnVmKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgfQorCisgIC8qIGRyb3AgR3N0RXZlbnRTdHJlYW1TdGFydCAmIEdzdEV2ZW50Q2FwcyAmIEdzdEV2ZW50U2VnbWVudCAqLworICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgIGdzdF9ldmVudF91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbF9ldmVudCAoaCkpOworCisgIC8qIGRyb3AgcmVjb25maWd1cmUgZXZlbnQgKi8KKyAgZ3N0X2V2ZW50X3VucmVmIChnc3RfaGFybmVzc19wdWxsX3Vwc3RyZWFtX2V2ZW50IChoKSk7CisKKyAgLyogVmVyaWZ5IHRoYXQgYXQgdGhpcyBwb2ludCBvdXIgcXVldWVzIGFyZSBlbXB0eSAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgwLCBnc3RfaGFybmVzc19idWZmZXJzX2luX3F1ZXVlIChoKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDAsIGdzdF9oYXJuZXNzX2V2ZW50c19pbl9xdWV1ZSAoaCkpOworCisgIHJldHVybiBuZXh0X3NlcW51bTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbG9zdF9ldmVudCkKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgZ2ludCBsYXRlbmN5X21zID0gMTAwOworICBndWludCBuZXh0X3NlcW51bTsKKyAgZ3VpbnQgbWlzc2luZ19zZXFudW07CisKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAiZG8tbG9zdCIsIFRSVUUsIE5VTEwpOworICBuZXh0X3NlcW51bSA9IGNvbnN0cnVjdF9kZXRlcm1pbmlzdGljX2luaXRpYWxfc3RhdGUgKGgsIGxhdGVuY3lfbXMpOworCisgIC8qIFdlIHdpbGwgbm93IGNyZWF0ZSBhIGdhcCBpbiB0aGUgc3RyZWFtLCBieSBza2lwcGluZyBvbmUgc2VxdWVuY2UtbnVtYmVyLAorICAgKiBhbmQgcHVzaCB0aGUgZm9sbG93aW5nIHBhY2tldC4KKyAgICovCisgIG1pc3Npbmdfc2VxbnVtID0gbmV4dF9zZXFudW07CisgIG5leHRfc2VxbnVtICs9IDE7CisgIHB1c2hfdGVzdF9idWZmZXIgKGgsIG5leHRfc2VxbnVtKTsKKworICAvKiBUaGlzIHBhY2tldCAoQG5leHRfc2VxbnVtKSB3aWxsIG5vdyBiZSBoZWxkIGJhY2ssIGF3YWl0aW5nIHRoZSBtaXNzaW5nIG9uZSwKKyAgICogdmVyaWZ5IHRoYXQgdGhpcyBpcyB0aGUgY2FzZToKKyAgICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDAsIGdzdF9oYXJuZXNzX2J1ZmZlcnNfaW5fcXVldWUgKGgpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMCwgZ3N0X2hhcm5lc3NfZXZlbnRzX2luX3F1ZXVlIChoKSk7CisKKyAgLyogVGhlIGxvc3QtdGltZW91dCBmb3IgdGhlIG1pc3NpbmcgcGFja2V0IHdpbGwgbm93IGJlIGl0cyBwdHMgKyBsYXRlbmN5LCBzbworICAgKiBub3cgd2Ugd2lsbCBzaW1wbHkgY3JhbmsgdGhlIGNsb2NrIHRvIGFkdmFuY2UgdG8gdGhpcyBwb2ludCBpbiB0aW1lLCBhbmQKKyAgICogY2hlY2sgdGhhdCB3ZSBnZXQgYSBsb3N0LWV2ZW50LCBhcyB3ZWxsIGFzIHRoZSBsYXN0IHBhY2tldCB3ZSBwdXNoZWQgaW4uCisgICAqLworICBnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCk7CisgIHZlcmlmeV9sb3N0X2V2ZW50IChoLCBtaXNzaW5nX3NlcW51bSwKKyAgICAgIG1pc3Npbmdfc2VxbnVtICogVEVTVF9CVUZfRFVSQVRJT04sIFRFU1RfQlVGX0RVUkFUSU9OKTsKKworICBidWYgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAobmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiwKKyAgICAgIEdTVF9CVUZGRVJfUFRTIChidWYpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobmV4dF9zZXFudW0sIGdldF9ydHBfc2VxX251bSAoYnVmKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgZmFpbF91bmxlc3MgKHZlcmlmeV9qYl9zdGF0cyAoaC0+ZWxlbWVudCwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLWppdHRlcmJ1ZmZlci1zdGF0cyIsCisgICAgICAgICAgICAgICJudW0tcHVzaGVkIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIG5leHRfc2VxbnVtLAorICAgICAgICAgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMSwgTlVMTCkpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfb25seV9vbmVfbG9zdF9ldmVudF9vbl9sYXJnZV9nYXBzKQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwaml0dGVyYnVmZmVyIik7CisgIEdzdFRlc3RDbG9jayAqdGVzdGNsb2NrOworICBHc3RCdWZmZXIgKm91dF9idWY7CisgIGd1aW50IG5leHRfc2VxbnVtOworICBnaW50IGxhdGVuY3lfbXMgPSAyMDA7CisgIGdpbnQgbnVtX2xvc3RfZXZlbnRzID0gbGF0ZW5jeV9tcyAvIFRFU1RfQlVGX01TOworICBnaW50IGk7CisKKyAgdGVzdGNsb2NrID0gZ3N0X2hhcm5lc3NfZ2V0X3Rlc3RjbG9jayAoaCk7CisgIC8qIE5lZWQgdG8gc2V0IG1heC1taXNvcmRlci10aW1lIGFuZCBtYXgtZHJvcG91dC10aW1lIHRvIDAgc28gdGhlCisgICAqIGppdHRlcmJ1ZmZlciBkb2VzIG5vdCBiYXNlIHRoZW0gb24gcGFja2V0IHJhdGUgY2FsY3VsYXRpb25zLgorICAgKiBJZiBpdCBkb2VzLCBvdXQgZ2FwIGlzIGJpZyBlbm91Z2ggdG8gYmUgY29uc2lkZXJlZCBhIG5ldyBzdHJlYW0gYW5kCisgICAqIHdlIHdhaXQgZm9yIGEgZmV3IGNvbnNlY3V0aXZlIHBhY2tldHMganVzdCB0byBiZSBzdXJlCisgICAqLworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1sb3N0IiwgVFJVRSwKKyAgICAgICJtYXgtbWlzb3JkZXItdGltZSIsIDAsICJtYXgtZHJvcG91dC10aW1lIiwgMCwgTlVMTCk7CisgIG5leHRfc2VxbnVtID0gY29uc3RydWN0X2RldGVybWluaXN0aWNfaW5pdGlhbF9zdGF0ZSAoaCwgbGF0ZW5jeV9tcyk7CisKKyAgLyogbW92ZSB0aW1lIGFoZWFkIHRvIGp1c3QgYmVmb3JlIDEwIHNlY29uZHMgKi8KKyAgZ3N0X2hhcm5lc3Nfc2V0X3RpbWUgKGgsIDEwICogR1NUX1NFQ09ORCAtIDEpOworCisgIC8qIGNoZWNrIHRoYXQgd2UgaGF2ZSBubyBwZW5kaW5nIHdhaXRzICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDAsIGdzdF90ZXN0X2Nsb2NrX3BlZWtfaWRfY291bnQgKHRlc3RjbG9jaykpOworCisgIC8qIGEgYnVmZmVyIG5vdyBhcnJpdmVzIHBlcmZlY3RseSBvbiB0aW1lICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ2VuZXJhdGVfdGVzdF9idWZmZXIgKDUwMCkpKTsKKworICAvKiByZWxlYXNlIHRoZSB3YWl0LCBhZHZhbmNpbmcgdGhlIGNsb2NrIHRvIDEwIHNlYyAqLworICBmYWlsX3VubGVzcyAoZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpKTsKKworICAvKiB3ZSBzaG91bGQgbm93IHJlY2VpdmUgYSBwYWNrZXQtbG9zdC1ldmVudCBmb3IgYnVmZmVycyAxMSB0aHJvdWdoIDQ4OSAuLi4gKi8KKyAgdmVyaWZ5X2xvc3RfZXZlbnQgKGgsIG5leHRfc2VxbnVtLAorICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiwgVEVTVF9CVUZfRFVSQVRJT04gKiAoNDkwIC0gbmV4dF9zZXFudW0pKTsKKworICAvKiAuLi4gYXMgd2VsbCBhcyA0OTAgKHNpbmNlIGF0IDEwIHNlYyA0OTAgaXMgdG9vIGxhdGUpICovCisgIHZlcmlmeV9sb3N0X2V2ZW50IChoLCA0OTAsIDQ5MCAqIFRFU1RfQlVGX0RVUkFUSU9OLCBURVNUX0JVRl9EVVJBVElPTik7CisKKyAgLyogd2UgZ2V0IGFzIG1hbnkgbG9zdCBldmVudHMgYXMgdGhlIHRoZSBudW1iZXIgb2YgKgorICAgKiBidWZmZXJzIHRoZSBqaXR0ZXJidWZmZXIgaXMgYWJsZSB0byB3YWl0IGZvciAqLworICBmb3IgKGkgPSAxOyBpIDwgbnVtX2xvc3RfZXZlbnRzOyBpKyspIHsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpKTsKKyAgICB2ZXJpZnlfbG9zdF9ldmVudCAoaCwgNDkwICsgaSwgKDQ5MCArIGkpICogVEVTVF9CVUZfRFVSQVRJT04sCisgICAgICAgIFRFU1RfQlVGX0RVUkFUSU9OKTsKKyAgfQorCisgIC8qIGFuZCB0aGVuIHRoZSBidWZmZXIgaXMgcmVsZWFzZWQgKi8KKyAgb3V0X2J1ZiA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBmYWlsX3VubGVzcyAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAob3V0X2J1ZiwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoNTAwLCBnZXRfcnRwX3NlcV9udW0gKG91dF9idWYpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoMTAgKiBHU1RfU0VDT05ELCBHU1RfQlVGRkVSX0RUUyAob3V0X2J1ZikpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0ICgxMCAqIEdTVF9TRUNPTkQsIEdTVF9CVUZGRVJfUFRTIChvdXRfYnVmKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKG91dF9idWYpOworCisgIGZhaWxfdW5sZXNzICh2ZXJpZnlfamJfc3RhdHMgKGgtPmVsZW1lbnQsCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1qaXR0ZXJidWZmZXItc3RhdHMiLAorICAgICAgICAgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgNDg5LCBOVUxMKSkpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHRlc3RjbG9jayk7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF90d29fbG9zdF9vbmVfYXJyaXZlc19pbl90aW1lKQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwaml0dGVyYnVmZmVyIik7CisgIEdzdFRlc3RDbG9jayAqdGVzdGNsb2NrOworICBHc3RDbG9ja0lEIGlkOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgZ2ludCBsYXRlbmN5X21zID0gMTAwOworICBndWludCBuZXh0X3NlcW51bTsKKyAgZ3VpbnQgZmlyc3RfbWlzc2luZzsKKyAgZ3VpbnQgc2Vjb25kX21pc3Npbmc7CisgIGd1aW50IGN1cnJlbnRfYXJyaXZlZDsKKworICB0ZXN0Y2xvY2sgPSBnc3RfaGFybmVzc19nZXRfdGVzdGNsb2NrIChoKTsKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAiZG8tbG9zdCIsIFRSVUUsIE5VTEwpOworICBuZXh0X3NlcW51bSA9IGNvbnN0cnVjdF9kZXRlcm1pbmlzdGljX2luaXRpYWxfc3RhdGUgKGgsIGxhdGVuY3lfbXMpOworCisgIC8qIGhvcCBvdmVyIDIgcGFja2V0cyBhbmQgbWFrZSBhbm90aGVyIG9uZSAoZ2FwIG9mIDIpICovCisgIGZpcnN0X21pc3NpbmcgPSBuZXh0X3NlcW51bTsKKyAgc2Vjb25kX21pc3NpbmcgPSBuZXh0X3NlcW51bSArIDE7CisgIGN1cnJlbnRfYXJyaXZlZCA9IG5leHRfc2VxbnVtICsgMjsKKyAgcHVzaF90ZXN0X2J1ZmZlciAoaCwgY3VycmVudF9hcnJpdmVkKTsKKworICAvKiB2ZXJpZnkgdGhhdCB0aGUgaml0dGVyYnVmZmVyIG5vdyB3YWl0IGZvciB0aGUgbGF0ZXN0IG1vbWVudCBpdCBjYW4gcHVzaCB0aGUKKyAgICogQGZpcnN0X21pc3NpbmcgcGFja2V0IG91dC4KKyAgICovCisgIGdzdF90ZXN0X2Nsb2NrX3dhaXRfZm9yX25leHRfcGVuZGluZ19pZCAodGVzdGNsb2NrLCAmaWQpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChmaXJzdF9taXNzaW5nICogVEVTVF9CVUZfRFVSQVRJT04gKworICAgICAgbGF0ZW5jeV9tcyAqIEdTVF9NU0VDT05ELCBnc3RfY2xvY2tfaWRfZ2V0X3RpbWUgKGlkKSk7CisgIGdzdF9jbG9ja19pZF91bnJlZiAoaWQpOworCisgIC8qIGxldCB0aGUgdGltZSBleHBpcmUuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKSk7CisKKyAgLyogd2Ugc2hvdWxkIG5vdyByZWNlaXZlIGEgcGFja2V0LWxvc3QtZXZlbnQgKi8KKyAgdmVyaWZ5X2xvc3RfZXZlbnQgKGgsIGZpcnN0X21pc3NpbmcsCisgICAgICBmaXJzdF9taXNzaW5nICogVEVTVF9CVUZfRFVSQVRJT04sIFRFU1RfQlVGX0RVUkFUSU9OKTsKKworICAvKiBAc2Vjb25kX21pc3Npbmcgbm93IGFycml2ZXMganVzdCBpbiB0aW1lICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ2VuZXJhdGVfdGVzdF9idWZmZXIgKHNlY29uZF9taXNzaW5nKSkpOworCisgIC8qIHZlcmlmeSB0aGF0IEBzZWNvbmRfbWlzc2luZyBtYWRlIGl0IHRocm91Z2ghICovCisgIGJ1ZiA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBmYWlsX3VubGVzcyAoR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChzZWNvbmRfbWlzc2luZywgZ2V0X3J0cF9zZXFfbnVtIChidWYpKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICAvKiBhbmQgc2VlIHRoYXQgQGN1cnJlbnRfYXJyaXZlZCBub3cgYWxzbyBpcyBwdXNoZWQgKi8KKyAgYnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGZhaWxfdW5sZXNzICghR1NUX0JVRkZFUl9GTEFHX0lTX1NFVCAoYnVmLCBHU1RfQlVGRkVSX0ZMQUdfRElTQ09OVCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChjdXJyZW50X2Fycml2ZWQsIGdldF9ydHBfc2VxX251bSAoYnVmKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgZmFpbF91bmxlc3MgKHZlcmlmeV9qYl9zdGF0cyAoaC0+ZWxlbWVudCwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLWppdHRlcmJ1ZmZlci1zdGF0cyIsCisgICAgICAgICAgICAgICJudW0tcHVzaGVkIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIG5leHRfc2VxbnVtICsgMiwKKyAgICAgICAgICAgICAgIm51bS1sb3N0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDEsIE5VTEwpKSk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAodGVzdGNsb2NrKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2xhdGVfcGFja2V0c19zdGlsbF9tYWtlc19sb3N0X2V2ZW50cykKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBHc3RCdWZmZXIgKm91dF9idWY7CisgIGdpbnQgbGF0ZW5jeV9tcyA9IDEwMDsKKyAgZ3VpbnQgbmV4dF9zZXFudW07CisgIGd1aW50IHNlcW51bTsKKyAgR3N0Q2xvY2tUaW1lIG5vdzsKKworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1sb3N0IiwgVFJVRSwgTlVMTCk7CisgIG5leHRfc2VxbnVtID0gY29uc3RydWN0X2RldGVybWluaXN0aWNfaW5pdGlhbF9zdGF0ZSAoaCwgbGF0ZW5jeV9tcyk7CisKKyAgLyoganVtcCAxMCBzZWNvbmRzIGZvcndhcmQgaW4gdGltZSAqLworICBub3cgPSAxMCAqIEdTVF9TRUNPTkQ7CisgIGdzdF9oYXJuZXNzX3NldF90aW1lIChoLCBub3cpOworCisgIC8qIHB1c2ggYSBwYWNrZXQgd2l0aCBhIGdhcCBvZiAyLCB0aGF0IG5vdyBpcyB2ZXJ5IGxhdGUgKi8KKyAgc2VxbnVtID0gbmV4dF9zZXFudW0gKyAyOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgZ3N0X2hhcm5lc3NfcHVzaCAoaCwKKyAgICAgICAgICBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9mdWxsIChub3csCisgICAgICAgICAgICAgIHNlcW51bSwgc2VxbnVtICogVEVTVF9SVFBfVFNfRFVSQVRJT04pKSk7CisKKyAgLyogd2Ugc2hvdWxkIG5vdyByZWNlaXZlIHBhY2tldC1sb3N0LWV2ZW50cyBmb3IgdGhlIGdhcCAKKyAgICogRklYTUU6IFRoZSB0aW1lb3V0IGFuZCBkdXJhdGlvbiBoZXJlIGFyZSBhIGJpdCBjcmFwLi4uCisgICAqLworICB2ZXJpZnlfbG9zdF9ldmVudCAoaCwgbmV4dF9zZXFudW0sIDM0MDAgKiBHU1RfTVNFQ09ORCwgNjUwMCAqIEdTVF9NU0VDT05EKTsKKyAgdmVyaWZ5X2xvc3RfZXZlbnQgKGgsIG5leHRfc2VxbnVtICsgMSwKKyAgICAgIDk5MDAgKiBHU1RfTVNFQ09ORCwgMzMwMCAqIEdTVF9NU0VDT05EKTsKKworICAvKiB2ZXJpZnkgdGhhdCBwYWNrZXQgQHNlcW51bSBtYWRlIGl0IHRocm91Z2ghICovCisgIG91dF9idWYgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKG91dF9idWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHNlcW51bSwgZ2V0X3J0cF9zZXFfbnVtIChvdXRfYnVmKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKG91dF9idWYpOworCisgIGZhaWxfdW5sZXNzICh2ZXJpZnlfamJfc3RhdHMgKGgtPmVsZW1lbnQsCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1qaXR0ZXJidWZmZXItc3RhdHMiLAorICAgICAgICAgICAgICAibnVtLXB1c2hlZCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSBuZXh0X3NlcW51bSArIDEsCisgICAgICAgICAgICAgICJudW0tbG9zdCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAyLCBOVUxMKSkpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X251bV9sYXRlX3doZW5fY29uc2lkZXJlZF9sb3N0X2Fycml2ZXMpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgZ2Jvb2xlYW4gZG9fbG9zdCA9IF9faV9fICE9IDA7CisgIGdpbnQgbGF0ZW5jeV9tcyA9IDEwMDsKKyAgZ3VpbnQgbmV4dF9zZXFudW07CisKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAiZG8tbG9zdCIsIGRvX2xvc3QsIE5VTEwpOworICBuZXh0X3NlcW51bSA9IGNvbnN0cnVjdF9kZXRlcm1pbmlzdGljX2luaXRpYWxfc3RhdGUgKGgsIGxhdGVuY3lfbXMpOworCisgIC8qIGdhcCBvZiAxICovCisgIHB1c2hfdGVzdF9idWZmZXIgKGgsIG5leHRfc2VxbnVtICsgMSk7CisKKyAgLyogY3JhbmsgdG8gdHJpZ2dlciBsb3N0LWV2ZW50ICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKworICBpZiAoZG9fbG9zdCkgeworICAgIC8qIHdlIHNob3VsZCBub3cgcmVjZWl2ZSBwYWNrZXQtbG9zdC1ldmVudHMgZm9yIHRoZSBtaXNzaW5nIHBhY2tldCAqLworICAgIHZlcmlmeV9sb3N0X2V2ZW50IChoLCBuZXh0X3NlcW51bSwKKyAgICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiwgVEVTVF9CVUZfRFVSQVRJT04pOworICB9CisKKyAgLyogcHVsbCBvdXQgdGhlIHB1c2hlZCBwYWNrZXQgKi8KKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworCisgIC8qIHdlIGhhdmUgb25lIGxvc3QgcGFja2V0IGluIHRoZSBzdGF0cyAqLworICBmYWlsX3VubGVzcyAodmVyaWZ5X2piX3N0YXRzIChoLT5lbGVtZW50LAorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtaml0dGVyYnVmZmVyLXN0YXRzIiwKKyAgICAgICAgICAgICAgIm51bS1wdXNoZWQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgbmV4dF9zZXFudW0gKyAxLAorICAgICAgICAgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMSwKKyAgICAgICAgICAgICAgIm51bS1sYXRlIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsIE5VTEwpKSk7CisKKyAgLyogdGhlIG1pc3NpbmcgcGFja2V0IG5vdyBhcnJpdmVzICh0b28gbGF0ZSkgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlciAobmV4dF9zZXFudW0pKSk7CisKKyAgLyogYW5kIHRoaXMgaW5jcmVtZW50cyBudW0tbGF0ZSAqLworICBmYWlsX3VubGVzcyAodmVyaWZ5X2piX3N0YXRzIChoLT5lbGVtZW50LAorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtaml0dGVyYnVmZmVyLXN0YXRzIiwKKyAgICAgICAgICAgICAgIm51bS1wdXNoZWQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgbmV4dF9zZXFudW0gKyAxLAorICAgICAgICAgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMSwKKyAgICAgICAgICAgICAgIm51bS1sYXRlIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDEsIE5VTEwpKSk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2xvc3RfZXZlbnRfdXNlc19wdHMpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgR3N0Q2xvY2tUaW1lIG5vdzsKKyAgZ2ludCBsYXRlbmN5X21zID0gMTAwOworICBndWludCBuZXh0X3NlcW51bTsKKyAgZ3VpbnQgbG9zdF9zZXFudW07CisKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAiZG8tbG9zdCIsIFRSVUUsIE5VTEwpOworICBuZXh0X3NlcW51bSA9IGNvbnN0cnVjdF9kZXRlcm1pbmlzdGljX2luaXRpYWxfc3RhdGUgKGgsIGxhdGVuY3lfbXMpOworCisgIC8qIGhvcCBvdmVyIDEgcGFja2V0cyBhbmQgbWFrZSBhbm90aGVyIG9uZSAoZ2FwIG9mIDEpLCBidXQgZHVlIHRvCisgICAgIG5ldHdvcmsgZGVsYXlzLCB0aGlzIHBhY2tldHMgaXMgYWxzbyBncm9zc2x5IGxhdGUgKi8KKyAgbG9zdF9zZXFudW0gPSBuZXh0X3NlcW51bTsKKyAgbmV4dF9zZXFudW0gKz0gMTsKKworICAvKiBhZHZhbmNlIHRoZSBjbG9jayB0byB0aGUgbGF0ZXN0IHRpbWUgcGFja2V0IEBuZXh0X3NlcW51bSBjb3VsZCBhcnJpdmUgKi8KKyAgbm93ID0gbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiArIGxhdGVuY3lfbXMgKiBHU1RfTVNFQ09ORDsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3RpbWUgKGgsIG5vdyk7CisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKG5vdywgbmV4dF9zZXFudW0sCisgICAgICAgICAgbmV4dF9zZXFudW0gKiBURVNUX1JUUF9UU19EVVJBVElPTikpOworCisgIC8qIHdlIHNob3VsZCBub3cgaGF2ZSByZWNlaXZlZCBhIHBhY2tldC1sb3N0LWV2ZW50IGZvciBidWZmZXIgMyAqLworICB2ZXJpZnlfbG9zdF9ldmVudCAoaCwgbG9zdF9zZXFudW0sCisgICAgICBsb3N0X3NlcW51bSAqIFRFU1RfQlVGX0RVUkFUSU9OLCBURVNUX0JVRl9EVVJBVElPTik7CisKKyAgLyogYW5kIHB1bGwgb3V0IHBhY2tldCA0ICovCisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKworICBmYWlsX3VubGVzcyAodmVyaWZ5X2piX3N0YXRzIChoLT5lbGVtZW50LAorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtaml0dGVyYnVmZmVyLXN0YXRzIiwKKyAgICAgICAgICAgICAgIm51bS1wdXNoZWQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgbmV4dF9zZXFudW0sCisgICAgICAgICAgICAgICJudW0tbG9zdCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAxLCBOVUxMKSkpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9sb3N0X2V2ZW50X3dpdGhfYmFja3dhcmRzX3J0cHRpbWUpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgZ2ludCBsYXRlbmN5X21zID0gNDA7CisKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAiZG8tbG9zdCIsIFRSVUUsIE5VTEwpOworICBjb25zdHJ1Y3RfZGV0ZXJtaW5pc3RpY19pbml0aWFsX3N0YXRlIChoLCBsYXRlbmN5X21zKTsKKworICAvKgorICAgKiBGb3IgdmlkZW8gdXNpbmcgQi1mcmFtZXMsIGFuIGV4cGVjdGVkIHNlcXVlbmNlCisgICAqIGNvdWxkIGJlIGxpa2UgdGhpczoKKyAgICogKEkgPSBJLWZyYW1lLCBQID0gUC1mcmFtZSwgQiA9IEItZnJhbWUpCisgICAqICAgICAgICAgICAgICAgX19fICAgX19fICAgX19fICAgX19fICAgX19fCisgICAqICAgICAgICAgIC4uLiB8IDMgfCB8IDQgfCB8IDUgfCB8IDYgfCB8IDcgfAorICAgKiAgICAgICAgICAgICAgIOKAk+KAk+KAkyAgIOKAk+KAk+KAkyAgIOKAk+KAk+KAkyAgIOKAk+KAk+KAkyAgIOKAk+KAk+KAkworICAgKiBydHB0aW1lOiAgICAgICAzKEkpICA1KFApICA1KFApICA0KEIpICA2KFApCisgICAqIGFycml2YWwoZHRzKTogIDMgICAgIDUgICAgIDUgICAgIDUgICAgIDYKKyAgICoKKyAgICogTm90aWNlIGhlcmUgdGhhdCBwYWNrZXQgNiAodGhlIEIgZnJhbWUpIG1ha2UKKyAgICogdGhlIHJ0cHRpbWUgZ28gYmFja3dhcmRzLgorICAgKgorICAgKiBCdXQgd2UgZ2V0IHRoaXM6CisgICAqICAgICAgICAgICAgICAgX19fICAgX19fICAgXyBfICAgX19fICAgX19fCisgICAqICAgICAgICAgIC4uLiB8IDMgfCB8IDQgfCB8ICAgfCB8IDYgfCB8IDcgfAorICAgKiAgICAgICAgICAgICAgIOKAk+KAk+KAkyAgIOKAk+KAk+KAkyAgIC0gLSAgIOKAk+KAk+KAkyAgIOKAk+KAk+KAkworICAgKiBydHB0aW1lOiAgICAgICAzKEkpICA1KFApICAgICAgICA0KEIpICA2KFApCisgICAqIGFycml2YWwoZHRzKTogIDMgICAgIDUgICAgICAgICAgIDUgICAgIDYKKyAgICoKKyAgICovCisKKyAgLyogc2VxbnVtIDMgKi8KKyAgcHVzaF90ZXN0X2J1ZmZlciAoaCwgMyk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKworICAvKiBzZXFudW0gNCwgYXJyaXZpbmcgYXQgdGltZSA1IHdpdGggcnRwdGltZSA1ICovCisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsCisgICAgICBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9mdWxsICg1ICogVEVTVF9CVUZfRFVSQVRJT04sCisgICAgICAgICAgNCwgNSAqIFRFU1RfUlRQX1RTX0RVUkFUSU9OKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKworICAvKiBzZXFudW0gNiwgYXJyaXZpbmcgYXQgdGltZSA1IHdpdGggcnRwdGltZSA0LAorICAgICBtYWtpbmcgYSBnYXAgZm9yIG1pc3Npbmcgc2VxbnVtIDUgKi8KKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwKKyAgICAgIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKDUgKiBURVNUX0JVRl9EVVJBVElPTiwKKyAgICAgICAgICA2LCA0ICogVEVTVF9SVFBfVFNfRFVSQVRJT04pKTsKKworICAvKiBzZXFudW0gNywgYXJyaXZpbmcgYXQgdGltZSA2IHdpdGggcnRwdGltZSA2ICovCisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsCisgICAgICBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9mdWxsICg2ICogVEVTVF9CVUZfRFVSQVRJT04sCisgICAgICAgICAgNywgNiAqIFRFU1RfUlRQX1RTX0RVUkFUSU9OKSk7CisKKyAgLyogd2Ugc2hvdWxkIG5vdyBoYXZlIHJlY2VpdmVkIGEgcGFja2V0LWxvc3QtZXZlbnQgZm9yIHNlcW51bSA1LAorICAgICB3aXRoIHRpbWUgNSBhbmQgMCBkdXJhdGlvbiAqLworICBnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCk7CisgIHZlcmlmeV9sb3N0X2V2ZW50IChoLCA1LCA1ICogVEVTVF9CVUZfRFVSQVRJT04sIDApOworCisgIC8qIGFuZCBwdWxsIG91dCA2IGFuZCA3ICovCisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworCisgIGZhaWxfdW5sZXNzICh2ZXJpZnlfamJfc3RhdHMgKGgtPmVsZW1lbnQsCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1qaXR0ZXJidWZmZXItc3RhdHMiLAorICAgICAgICAgICAgICAibnVtLXB1c2hlZCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSA3LAorICAgICAgICAgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMSwgTlVMTCkpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYWxsX3BhY2tldHNfYXJlX3RpbWVzdGFtcGVkX3plcm8pCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgR3N0QnVmZmVyICpvdXRfYnVmOworICBnaW50IGpiX2xhdGVuY3lfbXMgPSAxMDA7CisgIGdpbnQgaSwgYjsKKworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHMgKGgsIGdlbmVyYXRlX2NhcHMgKCkpOworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1sb3N0IiwgVFJVRSwgImxhdGVuY3kiLCBqYl9sYXRlbmN5X21zLCBOVUxMKTsKKworICAvKiBhZHZhbmNlIHRoZSBjbG9jayB3aXRoIDEwIHNlY29uZHMgKi8KKyAgZ3N0X2hhcm5lc3Nfc2V0X3RpbWUgKGgsIDEwICogR1NUX1NFQ09ORCk7CisKKyAgLyogcHVzaCB0aGUgZmlyc3QgYnVmZmVyIHRocm91Z2ggKi8KKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVzaF9hbmRfcHVsbCAoaCwgZ2VuZXJhdGVfdGVzdF9idWZmZXIgKDApKSk7CisKKyAgLyogcHVzaCBzb21lIGJ1ZmZlcnMgaW4sIGFsbCB0aW1lc3RhbXBlZCAwICovCisgIGZvciAoYiA9IDE7IGIgPCAzOyBiKyspIHsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwKKyAgICAgICAgICAgIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKDAgKiBHU1RfTVNFQ09ORCwgYiwgMCkpKTsKKworICAgIC8qIGNoZWNrIGZvciB0aGUgYnVmZmVyIGNvbWluZyBvdXQgdGhhdCB3YXMgcHVzaGVkIGluICovCisgICAgb3V0X2J1ZiA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKDAsIEdTVF9CVUZGRVJfRFRTIChvdXRfYnVmKSk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoMCwgR1NUX0JVRkZFUl9QVFMgKG91dF9idWYpKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRfYnVmKTsKKyAgfQorCisgIC8qIGhvcCBvdmVyIDIgcGFja2V0cyBhbmQgbWFrZSBhbm90aGVyIG9uZSAoZ2FwIG9mIDIpICovCisgIGIgPSA1OworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKDAgKiBHU1RfTVNFQ09ORCwgYiwgMCkpKTsKKworICAvKiBkcm9wIEdzdEV2ZW50U3RyZWFtU3RhcnQgJiBHc3RFdmVudENhcHMgJiBHc3RFdmVudFNlZ21lbnQgKi8KKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGxfZXZlbnQgKGgpKTsKKworICAvKiB3ZSBzaG91bGQgbm93IHJlY2VpdmUgcGFja2V0LWxvc3QtZXZlbnRzIGZvciBidWZmZXIgMyBhbmQgNCAqLworICB2ZXJpZnlfbG9zdF9ldmVudCAoaCwgMywgMCwgMCk7CisgIHZlcmlmeV9sb3N0X2V2ZW50IChoLCA0LCAwLCAwKTsKKworICAvKiB2ZXJpZnkgdGhhdCBidWZmZXIgNSBtYWRlIGl0IHRocm91Z2ghICovCisgIG91dF9idWYgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKG91dF9idWYsIEdTVF9CVUZGRVJfRkxBR19ESVNDT05UKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDUsIGdldF9ydHBfc2VxX251bSAob3V0X2J1ZikpOworICBnc3RfYnVmZmVyX3VucmVmIChvdXRfYnVmKTsKKworICBmYWlsX3VubGVzcyAodmVyaWZ5X2piX3N0YXRzIChoLT5lbGVtZW50LAorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtaml0dGVyYnVmZmVyLXN0YXRzIiwKKyAgICAgICAgICAgICAgIm51bS1wdXNoZWQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgNCwKKyAgICAgICAgICAgICAgIm51bS1sb3N0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDIsIE5VTEwpKSk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3Jlb3JkZXJfb2Zfbm9uX2VxdWlkaXN0YW50X3BhY2tldHMpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgR3N0VGVzdENsb2NrICp0ZXN0Y2xvY2s7CisgIGdpbnQgbGF0ZW5jeV9tcyA9IDU7CisgIEdzdENsb2NrSUQgcGVuZGluZ19pZDsKKyAgR3N0Q2xvY2tUaW1lIHRpbWU7CisgIGdpbnQgc2VxLCBmcmFtZTsKKyAgZ2ludCBudW1faW5pdF9mcmFtZXMgPSAxOworICBjb25zdCBHc3RDbG9ja1RpbWUgZnJhbWVfZHVyID0gVEVTVF9CVUZfRFVSQVRJT047CisgIGNvbnN0IGd1aW50MzIgZnJhbWVfcnRwX3RzX2R1ciA9IFRFU1RfUlRQX1RTX0RVUkFUSU9OOworCisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2FwcyAoaCwgZ2VuZXJhdGVfY2FwcyAoKSk7CisgIHRlc3RjbG9jayA9IGdzdF9oYXJuZXNzX2dldF90ZXN0Y2xvY2sgKGgpOworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1sb3N0IiwgVFJVRSwgImxhdGVuY3kiLCBsYXRlbmN5X21zLCBOVUxMKTsKKworICBmb3IgKGZyYW1lID0gMCwgc2VxID0gMDsgZnJhbWUgPCBudW1faW5pdF9mcmFtZXM7IGZyYW1lKyssIHNlcSArPSAyKSB7CisgICAgLyogUHVzaCBhIGNvdXBsZSBvZiBwYWNrZXRzIHdpdGggaWRlbnRpY2FsIHRpbWVzdGFtcCwgdHlwaWNhbCBmb3IgYSB2aWRlbworICAgICAqIHN0cmVhbSB3aGVyZSBvbmUgZnJhbWUgZ2VuZXJhdGVzIG11bHRpcGxlIHBhY2tldHMuICovCisgICAgZ3N0X2hhcm5lc3Nfc2V0X3RpbWUgKGgsIGZyYW1lICogZnJhbWVfZHVyKTsKKyAgICBnc3RfaGFybmVzc19wdXNoIChoLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9mdWxsIChmcmFtZSAqIGZyYW1lX2R1ciwKKyAgICAgICAgICAgIHNlcSwgZnJhbWUgKiBmcmFtZV9ydHBfdHNfZHVyKSk7CisgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ2VuZXJhdGVfdGVzdF9idWZmZXJfZnVsbCAoZnJhbWUgKiBmcmFtZV9kdXIsCisgICAgICAgICAgICBzZXEgKyAxLCBmcmFtZSAqIGZyYW1lX3J0cF90c19kdXIpKTsKKworICAgIGlmIChmcmFtZSA9PSAwKQorICAgICAgLyogZGVhZGxpbmUgZm9yIGJ1ZmZlciAwIGV4cGlyZXMgKi8KKyAgICAgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKworICAgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChoKSk7CisgIH0KKworICAvKiBGaW5hbGx5IHB1c2ggdGhlIGxhc3QgZnJhbWUgcmVvcmRlcmVkICovCisgIGdzdF9oYXJuZXNzX3NldF90aW1lIChoLCBmcmFtZSAqIGZyYW1lX2R1cik7CisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKGZyYW1lICogZnJhbWVfZHVyLAorICAgICAgICAgIHNlcSArIDEsIGZyYW1lICogZnJhbWVfcnRwX3RzX2R1cikpOworCisgIC8qIENoZWNrIHRoZSBzY2hlZHVsZWQgbG9zdCB0aW1lci4gVGhlIGV4cGVjdGVkIGFycml2YWwgb2YgdGhpcyBwYWNrZXQKKyAgICogc2hvdWxkIGJlIGFzc3VtZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIGxhc3QgcGFja2V0IHJlY2VpdmVkIHNpbmNlIHdlCisgICAqIGRvbid0IGtub3cgd2V0aGVyIHRoZSBtaXNzaW5nIHBhY2tldCBiZWxvbmdlZCB0byB0aGlzIG9yIHByZXZpb3VzCisgICAqIGZyYW1lLiAqLworICBnc3RfdGVzdF9jbG9ja193YWl0X2Zvcl9uZXh0X3BlbmRpbmdfaWQgKHRlc3RjbG9jaywgJnBlbmRpbmdfaWQpOworICB0aW1lID0gZ3N0X2Nsb2NrX2lkX2dldF90aW1lIChwZW5kaW5nX2lkKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludDY0ICh0aW1lLCBmcmFtZSAqIGZyYW1lX2R1ciArIGxhdGVuY3lfbXMgKiBHU1RfTVNFQ09ORCk7CisgIGdzdF9jbG9ja19pZF91bnJlZiAocGVuZGluZ19pZCk7CisKKyAgLyogQW5kIHRoZW4gbWlzc2luZyBwYWNrZXQgYXJyaXZlcyBqdXN0IGluIHRpbWUgKi8KKyAgZ3N0X2hhcm5lc3Nfc2V0X3RpbWUgKGgsIHRpbWUgLSAxKTsKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ2VuZXJhdGVfdGVzdF9idWZmZXJfZnVsbCAodGltZSAtIDEsIHNlcSwKKyAgICAgICAgICBmcmFtZSAqIGZyYW1lX3J0cF90c19kdXIpKTsKKworICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChoKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKworICBnc3Rfb2JqZWN0X3VucmVmICh0ZXN0Y2xvY2spOworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbG9zc19lcXVpZGlzdGFudF9zcGFjaW5nX3dpdGhfcGFyYW1ldGVyX3BhY2tldHMpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgZ2ludCBsYXRlbmN5X21zID0gNTsKKyAgZ2ludCBzZXEsIGZyYW1lOworICBnaW50IG51bV9pbml0X2ZyYW1lcyA9IDEwOworICBnaW50IGk7CisKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzIChoLCBnZW5lcmF0ZV9jYXBzICgpKTsKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAiZG8tbG9zdCIsIFRSVUUsICJsYXRlbmN5IiwgbGF0ZW5jeV9tcywgTlVMTCk7CisKKyAgLyogZHJvcCBzdHJlYW0tc3RhcnQsIGNhcHMsIHNlZ21lbnQgKi8KKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGxfZXZlbnQgKGgpKTsKKworICBmb3IgKGZyYW1lID0gMCwgc2VxID0gMDsgZnJhbWUgPCBudW1faW5pdF9mcmFtZXM7IGZyYW1lKyssIHNlcSsrKSB7CisgICAgZ3N0X2hhcm5lc3Nfc2V0X3RpbWUgKGgsIGZyYW1lICogVEVTVF9CVUZfRFVSQVRJT04pOworICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKGZyYW1lICogVEVTVF9CVUZfRFVSQVRJT04sCisgICAgICAgICAgICBzZXEsIGZyYW1lICogVEVTVF9SVFBfVFNfRFVSQVRJT04pKTsKKworICAgIGlmIChmcmFtZSA9PSAwKQorICAgICAgLyogZGVhZGxpbmUgZm9yIGJ1ZmZlciAwIGV4cGlyZXMgKi8KKyAgICAgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKworICAgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKyAgfQorCisgIC8qIFB1c2ggdGhyZWUgcGFja2V0cyB3aXRoIHNhbWUgcnRwdGltZSwgc2ltdWxhdGluZyBwYXJhbWV0ZXIgcGFja2V0cyArCisgICAqIGZyYW1lLiBUaGlzIHNob3VsZCBub3QgZGlzYWJsZSBlcXVpZGlzdGFudCBtb2RlIGFzIGl0IGlzIGNvbW1vbiBmb3IKKyAgICogY2VydGFpbiBhdWRpbyBjb2RlY3MuICovCisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBnc3RfaGFybmVzc19zZXRfdGltZSAoaCwgZnJhbWUgKiBURVNUX0JVRl9EVVJBVElPTik7CisgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ2VuZXJhdGVfdGVzdF9idWZmZXJfZnVsbCAoZnJhbWUgKiBURVNUX0JVRl9EVVJBVElPTiwKKyAgICAgICAgICAgIHNlcSsrLCBmcmFtZSAqIFRFU1RfUlRQX1RTX0RVUkFUSU9OKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworICB9CisgIGZyYW1lKys7CisKKyAgLyogRmluYWxseSBwdXNoIHRoZSBsYXN0IHBhY2tldCBpbnRyb2R1Y2luZyBhIGdhcCAqLworICBnc3RfaGFybmVzc19zZXRfdGltZSAoaCwgZnJhbWUgKiBURVNUX0JVRl9EVVJBVElPTik7CisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKGZyYW1lICogVEVTVF9CVUZfRFVSQVRJT04sCisgICAgICAgICAgc2VxICsgMSwgZnJhbWUgKiBURVNUX1JUUF9UU19EVVJBVElPTikpOworCisgIC8qIENoZWNrIHRoYXQgdGhlIGxvc3QgZXZlbnQgaGFzIGJlZW4gZ2VuZXJhdGVkIGFzc3VtaW5nIGVxdWlkaXN0YW50CisgICAqIHNwYWNpbmcuICovCisgIHZlcmlmeV9sb3N0X2V2ZW50IChoLCBzZXEsCisgICAgICBmcmFtZSAqIFRFU1RfQlVGX0RVUkFUSU9OIC0gVEVTVF9CVUZfRFVSQVRJT04gLyAyLCBURVNUX0JVRl9EVVJBVElPTiAvIDIpOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitzdGF0aWMgdm9pZAorZ3N0X3Rlc3RfY2xvY2tfc2V0X3RpbWVfYW5kX3Byb2Nlc3MgKEdzdFRlc3RDbG9jayAqIHRlc3RjbG9jaywKKyAgICBHc3RDbG9ja1RpbWUgdGltZSkKK3sKKyAgR3N0Q2xvY2tJRCBpZCwgdGlkOworICBnc3RfdGVzdF9jbG9ja193YWl0X2Zvcl9uZXh0X3BlbmRpbmdfaWQgKHRlc3RjbG9jaywgJmlkKTsKKyAgZ3N0X3Rlc3RfY2xvY2tfc2V0X3RpbWUgKHRlc3RjbG9jaywgdGltZSk7CisgIHRpZCA9IGdzdF90ZXN0X2Nsb2NrX3Byb2Nlc3NfbmV4dF9jbG9ja19pZCAodGVzdGNsb2NrKTsKKyAgZ19hc3NlcnQgKHRpZCA9PSBpZCk7CisgIGdzdF9jbG9ja19pZF91bnJlZiAodGlkKTsKKyAgZ3N0X2Nsb2NrX2lkX3VucmVmIChpZCk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3J0eF9leHBlY3RlZF9uZXh0KQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwaml0dGVyYnVmZmVyIik7CisgIGdpbnQgbGF0ZW5jeV9tcyA9IDIwMDsKKyAgZ3VpbnQgbmV4dF9zZXFudW07CisgIEdzdENsb2NrVGltZSB0aW1lb3V0OworICBnaW50IHJ0eF9kZWxheV9tczsKKyAgY29uc3QgR3N0Q2xvY2tUaW1lIHJ0eF9yZXRyeV90aW1lb3V0X21zID0gNDA7CisKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAiZG8tbG9zdCIsIFRSVUUsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1yZXRyYW5zbWlzc2lvbiIsIFRSVUUsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJydHgtcmV0cnktcGVyaW9kIiwgMTIwLCBOVUxMKTsKKyAgbmV4dF9zZXFudW0gPSBjb25zdHJ1Y3RfZGV0ZXJtaW5pc3RpY19pbml0aWFsX3N0YXRlIChoLCBsYXRlbmN5X21zKTsKKworICAvKiBBdCB0aGlzIHBvaW50IHRoZXJlIGlzIGFscmVhZHkgZXhpc3RpbmcgYSBydHgtdGltZXIgZm9yIEBuZXh0X3NlcW51bSwKKyAgICogdGhhdCB3aWxsIGhhdmUgYSB0aW1lb3V0IG9mIHRoZSBleHBlY3RlZCBhcnJpdmFsLXRpbWUgZm9yIHRoYXQgc2VxbnVtLAorICAgKiBhbmQgYSBkZWxheSBlcXVhbCB0byAyKmppdHRlcj09MCBhbmQgMC41KnBhY2tldF9zcGFjaW5nPT0xMG1zICovCisgIHRpbWVvdXQgPSBuZXh0X3NlcW51bSAqIFRFU1RfQlVGX0RVUkFUSU9OOworICBydHhfZGVsYXlfbXMgPSAwLjUgKiBURVNUX0JVRl9NUzsKKworICAvKiBXZSBjcmFuayB0aGUgY2xvY2sgdG8gdGltZS1vdXQgdGhlIG5leHQgc2NoZWR1bGVkIHRpbWVyICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgdmVyaWZ5X3J0eF9ldmVudCAoaCwgbmV4dF9zZXFudW0sIHRpbWVvdXQsIHJ0eF9kZWxheV9tcywgVEVTVF9CVUZfRFVSQVRJT04pOworCisgIC8qIG5vdyB3ZSB3YWl0IGZvciB0aGUgbmV4dCB0aW1lb3V0LCBhbGwgZm9sbG93aW5nIHRpbWVvdXRzIDQwbXMgaW4gdGhlCisgICAqIGZ1dHVyZSBiZWNhdXNlIHRoaXMgaXMgcnR4LXJldHJ5LXRpbWVvdXQgKi8KKyAgcnR4X2RlbGF5X21zICs9IHJ0eF9yZXRyeV90aW1lb3V0X21zOworICBnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCk7CisgIHZlcmlmeV9ydHhfZXZlbnQgKGgsIG5leHRfc2VxbnVtLCB0aW1lb3V0LCBydHhfZGVsYXlfbXMsIFRFU1RfQlVGX0RVUkFUSU9OKTsKKworICAvKiBBbmQgYSB0aGlyZCB0aW1lLi4uICovCisgIHJ0eF9kZWxheV9tcyArPSBydHhfcmV0cnlfdGltZW91dF9tczsKKyAgZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpOworICB2ZXJpZnlfcnR4X2V2ZW50IChoLCBuZXh0X3NlcW51bSwgdGltZW91dCwgcnR4X2RlbGF5X21zLCBURVNUX0JVRl9EVVJBVElPTik7CisKKyAgLyogd2Ugc2hvdWxkIG5vdyByZWNlaXZlIGEgcGFja2V0LWxvc3QtZXZlbnQgZm9yIHBhY2tldCBAbmV4dF9zZXFudW0gKi8KKyAgZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpOworICB2ZXJpZnlfbG9zdF9ldmVudCAoaCwgbmV4dF9zZXFudW0sIHRpbWVvdXQsIFRFU1RfQlVGX0RVUkFUSU9OKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnR4X3R3b19taXNzaW5nKQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwaml0dGVyYnVmZmVyIik7CisgIGdpbnQgbGF0ZW5jeV9tcyA9IDIwMDsKKyAgZ3VpbnQgbmV4dF9zZXFudW07CisgIEdzdENsb2NrVGltZSBsYXN0X3J0eF9yZXF1ZXN0LCBub3c7CisgIGdpbnQgcnR4X2RlbGF5X21zID0gMC41ICogVEVTVF9CVUZfTVM7CisKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAiZG8tcmV0cmFuc21pc3Npb24iLCBUUlVFLCBOVUxMKTsKKyAgbmV4dF9zZXFudW0gPSBjb25zdHJ1Y3RfZGV0ZXJtaW5pc3RpY19pbml0aWFsX3N0YXRlIChoLCBsYXRlbmN5X21zKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMTEsIG5leHRfc2VxbnVtKTsKKworICAvKgorICAgKiBUaGUgZXhwZWN0ZWQgc2VxdWVuY2Ugb2YgYnVmZmVycyBpcyB0aGlzOgorICAgKiAgICAgIF9fX18gICBfX19fICAgX19fXyAgIF9fX18KKyAgICogLi4uIHwgMTAgfCB8IDExIHwgfCAxMiB8IHwgMTMgfAorICAgKiAgICAgIOKAk+KAk+KAk+KAkyAgIOKAk+KAk+KAk+KAkyAgIOKAk+KAk+KAk+KAkyAgIOKAk+KAk+KAk+KAkworICAgKiAgICAgIDIwMG1zICAyMjBtcyAgMjQwbXMgIDI2MG1zCisgICAqCisgICAqIEJ1dCBpbnN0ZWFkIHdlIGdldCB0aGlzOgorICAgKiAgICAgIF9fX18gICAgXyBfICAgIF8gXyAgIF9fX18KKyAgICogLi4uIHwgMTAgfCAgfCAgIHwgIHwgICB8IHwgMTMgfAorICAgKiAgICAgIOKAk+KAk+KAk+KAkyAgICAtIC0gICAgLSAtICAg4oCT4oCT4oCT4oCTCisgICAqICAgICAgMjAwbXMgICAgICAgICAgICAgICAgMjYwbXMKKyAgICoKKyAgICogTm93IGl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIG5leHQgdGhpbmcgdGhhdCBoYXBwZW5zIGlzIHRoYXQKKyAgICogdGhlIFJUWCB0aW1lb3V0IGZvciBwYWNrZXQgMTEgd2lsbCBoYXBwZW4gYXQgdGltZSAyMzBtcywgc28gd2UgY3JhbmsKKyAgICogdGhlIHRpbWVyIHRocmVhZCB0byBhZHZhbmNlIHRoZSB0aW1lIHRvIHRoaXM6CisgICAqLworICBnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCk7CisgIHZlcmlmeV9ydHhfZXZlbnQgKGgsIDExLCAxMSAqIFRFU1RfQlVGX0RVUkFUSU9OLAorICAgICAgcnR4X2RlbGF5X21zLCBURVNUX0JVRl9EVVJBVElPTik7CisgIGxhc3RfcnR4X3JlcXVlc3QgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKEdTVF9FTEVNRU5UX0NMT0NLIChoLT5lbGVtZW50KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQ2NCAobGFzdF9ydHhfcmVxdWVzdCwKKyAgICAgIDExICogVEVTVF9CVUZfRFVSQVRJT04gKyBydHhfZGVsYXlfbXMgKiBHU1RfTVNFQ09ORCk7CisgIGdzdF9oYXJuZXNzX3dhaXRfZm9yX2Nsb2NrX2lkX3dhaXRzIChoLCAxLCA2MCk7CisKKyAgLyogVGhlIG5leHQgc2NoZWR1bGVkIFJUWCBmb3IgcGFja2V0IDExIGlzIG5vdyBhdCAyMzAgKyA0MCA9IDI3MG1zLAorICAgICBzbyB0aGUgbmV4dCB0aGluZyB0aGF0IGhhcHBlbnMgaXMgdGhhdCBidWZmZXIgMTMgYXJyaXZlcyBpbiBwZXJmZWN0IHRpbWU6ICovCisgIG5vdyA9IDEzICogVEVTVF9CVUZfRFVSQVRJT047CisgIGdzdF9oYXJuZXNzX3NldF90aW1lIChoLCBub3cpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgsCisgICAgICAgICAgZ2VuZXJhdGVfdGVzdF9idWZmZXJfZnVsbCAobm93LCAxMywgMTMgKiBURVNUX1JUUF9UU19EVVJBVElPTikpKTsKKworICAvKgorICAgKgorICAgKiBUaGlzIHdpbGwgZXN0aW1hdGUgdGhlIGR0cyBvbiB0aGUgdHdvIG1pc3NpbmcgcGFja2V0cyB0bzoKKyAgICogICAgICBfX19fICAgX19fXworICAgKiAuLi4gfCAxMSB8IHwgMTIgfCAuLi4KKyAgICogICAgICDigJPigJPigJPigJMgICDigJPigJPigJPigJMKKyAgICogICAgICAyMjBtcyAgMjQwbXMKKyAgICoKKyAgICogQW5kIGdpdmVuIHRoZWlyIHJlZ3VsYXIgaW50ZXJzcGFjaW5nIG9mIDIwbXMsIGl0IHdpbGwgc2NoZWR1bGUgdHdvIFJUWAorICAgKiB0aW1lcnMgZm9yIHRoZW0gbGlrZSBzbzoKKyAgICoKKyAgICogICAgICBfX19fICAgX19fXworICAgKiAuLi4gfCAxMSB8IHwgMTIgfCAuLi4KKyAgICogICAgICDigJPigJPigJPigJMgICDigJPigJPigJPigJMKKyAgICogICAgICAyMzBtcyAgMjUwbXMKKyAgICoKKyAgICogVGhlcmUgYXJlIGhvd2V2ZXIgdHdvIHByb2JsZW1zLCBwYWNrZXQgMTEgd2UgaGF2ZSBhbHJlYWR5IHNlbnQgb25lIFJUWCBmb3IKKyAgICogYW5kIGl0cyB0aW1lb3V0IGlzIGN1cnJlbnRseSBhdCAyNzBtcywgc28gd2Ugc2hvdWxkIG5vdCB0YW1wZXIgd2l0aCB0aGF0LAorICAgKiBhbmQgYXMgZm9yIHBhY2tldCAxMiwgMjUwbXMgaGFzIGFscmVhZHkgZXhwaXJlZCwgc28gd2Ugbm93IGV4cGVjdCB0byBzZWUKKyAgICogYW4gcnR4LWV2ZW50IGJlaW5nIHNlbnQgZm9yIHBhY2tldCAxMiBpbW1lZGlhdGVseToKKyAgICovCisgIHZlcmlmeV9ydHhfZXZlbnQgKGgsIDEyLCAxMiAqIFRFU1RfQlVGX0RVUkFUSU9OLAorICAgICAgcnR4X2RlbGF5X21zLCBURVNUX0JVRl9EVVJBVElPTik7CisKKyAgLyogYW5kIGFub3RoZXIgY3Jhbmsgd2lsbCBzZWUgdGhlIHNlY29uZCBSVFggZXZlbnQgYmVpbmcgc2VudCBmb3IgcGFja2V0IDExICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgcnR4X2RlbGF5X21zICs9IDQwOworICB2ZXJpZnlfcnR4X2V2ZW50IChoLCAxMSwgMTEgKiBURVNUX0JVRl9EVVJBVElPTiwKKyAgICAgIHJ0eF9kZWxheV9tcywgVEVTVF9CVUZfRFVSQVRJT04pOworICBsYXN0X3J0eF9yZXF1ZXN0ID0gZ3N0X2Nsb2NrX2dldF90aW1lIChHU1RfRUxFTUVOVF9DTE9DSyAoaC0+ZWxlbWVudCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50NjQgKGxhc3RfcnR4X3JlcXVlc3QsCisgICAgICAxMSAqIFRFU1RfQlVGX0RVUkFUSU9OICsgcnR4X2RlbGF5X21zICogR1NUX01TRUNPTkQpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHhfYnVmZmVyX2Fycml2ZXNfanVzdF9pbl90aW1lKQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwaml0dGVyYnVmZmVyIik7CisgIGdpbnQgbGF0ZW5jeV9tcyA9IDUgKiBURVNUX0JVRl9NUzsKKyAgZ2ludCBuZXh0X3NlcW51bTsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdzdENsb2NrVGltZSBub3csIGxhc3RfcnR4X3JlcXVlc3Q7CisgIGdpbnQgcnR4X2RlbGF5X21zID0gMC41ICogVEVTVF9CVUZfTVM7CisKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAiZG8tcmV0cmFuc21pc3Npb24iLCBUUlVFLAorICAgICAgInJ0eC1tYXgtcmV0cmllcyIsIDEsIE5VTEwpOworICBuZXh0X3NlcW51bSA9IGNvbnN0cnVjdF9kZXRlcm1pbmlzdGljX2luaXRpYWxfc3RhdGUgKGgsIGxhdGVuY3lfbXMpOworCisgIC8qIENyYW5rIGNsb2NrIHRvIHNlbmQgcmV0cmFuc21pc3Npb24gZXZlbnRzIHJlcXVlc3Rpbmcgc2VxbnVtIDYgd2hpY2ggaGFzCisgICAqIG5vdCBhcnJpdmVkIHlldC4gKi8KKyAgZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpOworICB2ZXJpZnlfcnR4X2V2ZW50IChoLCBuZXh0X3NlcW51bSwKKyAgICAgIG5leHRfc2VxbnVtICogVEVTVF9CVUZfRFVSQVRJT04sIHJ0eF9kZWxheV9tcywgVEVTVF9CVUZfRFVSQVRJT04pOworCisgIGxhc3RfcnR4X3JlcXVlc3QgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKEdTVF9FTEVNRU5UX0NMT0NLIChoLT5lbGVtZW50KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQ2NCAobGFzdF9ydHhfcmVxdWVzdCwKKyAgICAgIG5leHRfc2VxbnVtICogVEVTVF9CVUZfRFVSQVRJT04gKyBydHhfZGVsYXlfbXMgKiBHU1RfTVNFQ09ORCk7CisKKyAgLyogc2VxbnVtIDYgYXJyaXZlcyBqdXN0IGJlZm9yZSBpdCB0aW1lcyBvdXQgYW5kIGlzIGNvbnNpZGVyZWQgbG9zdCAqLworICBub3cgPSAyMDAgKiBHU1RfTVNFQ09ORDsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3RpbWUgKGgsIG5vdyk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCBnc3RfaGFybmVzc19wdXNoIChoLAorICAgICAgICAgIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX3J0eCAobm93LCBuZXh0X3NlcW51bSkpKTsKKyAgYnVmZmVyID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG5leHRfc2VxbnVtLCBnZXRfcnRwX3NlcV9udW0gKGJ1ZmZlcikpOworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIGZhaWxfdW5sZXNzICh2ZXJpZnlfamJfc3RhdHMgKGgtPmVsZW1lbnQsCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1qaXR0ZXJidWZmZXItc3RhdHMiLAorICAgICAgICAgICAgICAibnVtLXB1c2hlZCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSBuZXh0X3NlcW51bSArIDEsCisgICAgICAgICAgICAgICJudW0tbG9zdCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAicnR4LWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDEsCisgICAgICAgICAgICAgICJydHgtc3VjY2Vzcy1jb3VudCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAxLAorICAgICAgICAgICAgICAicnR4LXBlci1wYWNrZXQiLCBHX1RZUEVfRE9VQkxFLCAxLjAsCisgICAgICAgICAgICAgICJydHgtcnR0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIChub3cgLSBsYXN0X3J0eF9yZXF1ZXN0KSwKKyAgICAgICAgICAgICAgTlVMTCkpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnR4X2J1ZmZlcl9hcnJpdmVzX3Rvb19sYXRlKQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwaml0dGVyYnVmZmVyIik7CisgIGdpbnQgbGF0ZW5jeV9tcyA9IDUgKiBURVNUX0JVRl9NUzsKKyAgZ2ludCBuZXh0X3NlcW51bTsKKyAgR3N0Q2xvY2tUaW1lIG5vdywgbGFzdF9ydHhfcmVxdWVzdDsKKyAgZ2ludCBydHhfZGVsYXlfbXMgPSAwLjUgKiBURVNUX0JVRl9NUzsKKworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1yZXRyYW5zbWlzc2lvbiIsIFRSVUUsCisgICAgICAiZG8tbG9zdCIsIFRSVUUsICJydHgtbWF4LXJldHJpZXMiLCAxLCBOVUxMKTsKKyAgbmV4dF9zZXFudW0gPSBjb25zdHJ1Y3RfZGV0ZXJtaW5pc3RpY19pbml0aWFsX3N0YXRlIChoLCBsYXRlbmN5X21zKTsKKworICAvKiBDcmFuayBjbG9jayB0byBzZW5kIHJldHJhbnNtaXNzaW9uIGV2ZW50cyByZXF1ZXN0aW5nIHNlcW51bSA2IHdoaWNoIGhhcworICAgKiBub3QgYXJyaXZlZCB5ZXQuICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgdmVyaWZ5X3J0eF9ldmVudCAoaCwgbmV4dF9zZXFudW0sCisgICAgICBuZXh0X3NlcW51bSAqIFRFU1RfQlVGX0RVUkFUSU9OLCBydHhfZGVsYXlfbXMsIFRFU1RfQlVGX0RVUkFUSU9OKTsKKworICBsYXN0X3J0eF9yZXF1ZXN0ID0gZ3N0X2Nsb2NrX2dldF90aW1lIChHU1RfRUxFTUVOVF9DTE9DSyAoaC0+ZWxlbWVudCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50NjQgKGxhc3RfcnR4X3JlcXVlc3QsCisgICAgICBuZXh0X3NlcW51bSAqIFRFU1RfQlVGX0RVUkFUSU9OICsgcnR4X2RlbGF5X21zICogR1NUX01TRUNPTkQpOworCisgIC8qIHBhY2tldCBAbmV4dF9zZXFudW0gaXMgY29uc2lkZXJlZCBsb3N0ICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgdmVyaWZ5X2xvc3RfZXZlbnQgKGgsIG5leHRfc2VxbnVtLAorICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiwgVEVTVF9CVUZfRFVSQVRJT04pOworCisgIC8qIHBhY2tldCBAbmV4dF9zZXFudW0gYXJyaXZlcyB0b28gbGF0ZSAqLworICBub3cgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKEdTVF9FTEVNRU5UX0NMT0NLIChoLT5lbGVtZW50KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCBnc3RfaGFybmVzc19wdXNoIChoLAorICAgICAgICAgIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX3J0eCAobm93LCBuZXh0X3NlcW51bSkpKTsKKworICBmYWlsX3VubGVzcyAodmVyaWZ5X2piX3N0YXRzIChoLT5lbGVtZW50LAorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtaml0dGVyYnVmZmVyLXN0YXRzIiwKKyAgICAgICAgICAgICAgIm51bS1wdXNoZWQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgbmV4dF9zZXFudW0sCisgICAgICAgICAgICAgICJudW0tbG9zdCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAxLAorICAgICAgICAgICAgICAibnVtLWxhdGUiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMSwKKyAgICAgICAgICAgICAgIm51bS1kdXBsaWNhdGVzIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsCisgICAgICAgICAgICAgICJydHgtY291bnQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMSwKKyAgICAgICAgICAgICAgInJ0eC1zdWNjZXNzLWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsCisgICAgICAgICAgICAgICJydHgtcGVyLXBhY2tldCIsIEdfVFlQRV9ET1VCTEUsIDEuMCwKKyAgICAgICAgICAgICAgInJ0eC1ydHQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgKG5vdyAtIGxhc3RfcnR4X3JlcXVlc3QpLAorICAgICAgICAgICAgICBOVUxMKSkpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHhfb3JpZ2luYWxfYnVmZmVyX2RvZXNfbm90X3VwZGF0ZV9ydHhfc3RhdHMpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgZ2ludCBsYXRlbmN5X21zID0gMTAwOworICBnaW50IG5leHRfc2VxbnVtOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgR3N0Q2xvY2tUaW1lIG5vdywgbGFzdF9ydHhfcmVxdWVzdDsKKyAgZ2ludCBydHhfZGVsYXlfbXMgPSAwLjUgKiBURVNUX0JVRl9NUzsKKworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1yZXRyYW5zbWlzc2lvbiIsIFRSVUUsCisgICAgICAicnR4LW1heC1yZXRyaWVzIiwgMSwgTlVMTCk7CisgIG5leHRfc2VxbnVtID0gY29uc3RydWN0X2RldGVybWluaXN0aWNfaW5pdGlhbF9zdGF0ZSAoaCwgbGF0ZW5jeV9tcyk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDYsIG5leHRfc2VxbnVtKTsKKworICAvKiBDcmFuayBjbG9jayB0byBzZW5kIHJldHJhbnNtaXNzaW9uIGV2ZW50cyByZXF1ZXN0aW5nIEBuZXh0X3NlcW51bSB3aGljaCBoYXMKKyAgICogbm90IGFycml2ZWQgeWV0LiAqLworICBnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCk7CisgIHZlcmlmeV9ydHhfZXZlbnQgKGgsIG5leHRfc2VxbnVtLAorICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiwgcnR4X2RlbGF5X21zLCBURVNUX0JVRl9EVVJBVElPTik7CisKKyAgbGFzdF9ydHhfcmVxdWVzdCA9IGdzdF9jbG9ja19nZXRfdGltZSAoR1NUX0VMRU1FTlRfQ0xPQ0sgKGgtPmVsZW1lbnQpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludDY0IChsYXN0X3J0eF9yZXF1ZXN0LAorICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiArIHJ0eF9kZWxheV9tcyAqIEdTVF9NU0VDT05EKTsKKworICAvKiBPUklHSU5BTCBzZXFudW0gNiBhcnJpdmVzIGp1c3QgYmVmb3JlIGl0IHRpbWVzIG91dCBhbmQgaXMgY29uc2lkZXJlZAorICAgKiBsb3N0LiAqLworICBub3cgPSAyMDAgKiBHU1RfTVNFQ09ORDsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3RpbWUgKGgsIG5vdyk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCBnc3RfaGFybmVzc19wdXNoIChoLAorICAgICAgICAgIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKG5vdywKKyAgICAgICAgICAgICAgbmV4dF9zZXFudW0sIG5leHRfc2VxbnVtICogVEVTVF9SVFBfVFNfRFVSQVRJT04pKSk7CisgIGJ1ZmZlciA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChuZXh0X3NlcW51bSwgZ2V0X3J0cF9zZXFfbnVtIChidWZmZXIpKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICAvKiBkdWUgdG8gdGhlIGFkdmFuY2UgaW4gdGltZSwgd2Ugd2lsbCBub3cgYWxzbyBoYXZlIHNlbnQKKyAgICAgYW4gcnR4LXJlcXVlc3QgZm9yIDcgKi8KKyAgbmV4dF9zZXFudW0rKzsKKyAgdmVyaWZ5X3J0eF9ldmVudCAoaCwgbmV4dF9zZXFudW0sCisgICAgICBuZXh0X3NlcW51bSAqIFRFU1RfQlVGX0RVUkFUSU9OLCBydHhfZGVsYXlfbXMsIFRFU1RfQlVGX0RVUkFUSU9OKTsKKworICAvKiBUaGUgb3JpZ2luYWwgYnVmZmVyIGRvZXMgbm90IGNvdW50IGluIHRoZSBSVFggc3RhdHMuICovCisgIGZhaWxfdW5sZXNzICh2ZXJpZnlfamJfc3RhdHMgKGgtPmVsZW1lbnQsCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1qaXR0ZXJidWZmZXItc3RhdHMiLAorICAgICAgICAgICAgICAibnVtLXB1c2hlZCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSBuZXh0X3NlcW51bSwKKyAgICAgICAgICAgICAgIm51bS1sb3N0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsCisgICAgICAgICAgICAgICJudW0tbGF0ZSIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAibnVtLWR1cGxpY2F0ZXMiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwKKyAgICAgICAgICAgICAgInJ0eC1jb3VudCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAyLAorICAgICAgICAgICAgICAicnR4LXN1Y2Nlc3MtY291bnQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwKKyAgICAgICAgICAgICAgInJ0eC1wZXItcGFja2V0IiwgR19UWVBFX0RPVUJMRSwgMC4wLAorICAgICAgICAgICAgICAicnR4LXJ0dCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLCBOVUxMKSkpOworCisgIC8qIE5vdyB0aGUgcmV0cmFuc21pdHRlZCBwYWNrZXQgYXJyaXZlcyBhbmQgc3RhdHMgc2hvdWxkIGJlIHVwZGF0ZWQuIE5vdGUKKyAgICogdGhhdCB0aGUgYnVmZmVyIGFycml2ZXMgaW4gdGltZSBhbmQgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGxhdGUsIGJ1dAorICAgKiBhIGR1cGxpY2F0ZS4gKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIGdzdF9oYXJuZXNzX3B1c2ggKGgsCisgICAgICAgICAgZ2VuZXJhdGVfdGVzdF9idWZmZXJfcnR4IChub3csIDYpKSk7CisKKyAgZmFpbF91bmxlc3MgKHZlcmlmeV9qYl9zdGF0cyAoaC0+ZWxlbWVudCwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLWppdHRlcmJ1ZmZlci1zdGF0cyIsCisgICAgICAgICAgICAgICJudW0tcHVzaGVkIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIG5leHRfc2VxbnVtLAorICAgICAgICAgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwKKyAgICAgICAgICAgICAgIm51bS1sYXRlIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsCisgICAgICAgICAgICAgICJudW0tZHVwbGljYXRlcyIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAxLAorICAgICAgICAgICAgICAicnR4LWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDIsCisgICAgICAgICAgICAgICJydHgtc3VjY2Vzcy1jb3VudCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAicnR4LXBlci1wYWNrZXQiLCBHX1RZUEVfRE9VQkxFLCAxLjAsCisgICAgICAgICAgICAgICJydHgtcnR0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIChub3cgLSBsYXN0X3J0eF9yZXF1ZXN0KSwKKyAgICAgICAgICAgICAgTlVMTCkpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnR4X2R1cGxpY2F0ZV9wYWNrZXRfdXBkYXRlc19ydHhfc3RhdHMpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgZ2ludCBsYXRlbmN5X21zID0gMTAwOworICBnaW50IG5leHRfc2VxbnVtOworICBHc3RDbG9ja1RpbWUgbm93LCBydHhfcmVxdWVzdF82LCBydHhfcmVxdWVzdF83OworICBnaW50IHJ0eF9kZWxheV9tcyA9IDAuNSAqIFRFU1RfQlVGX01TOworICBnaW50IGk7CisKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAiZG8tcmV0cmFuc21pc3Npb24iLCBUUlVFLCBOVUxMKTsKKyAgbmV4dF9zZXFudW0gPSBjb25zdHJ1Y3RfZGV0ZXJtaW5pc3RpY19pbml0aWFsX3N0YXRlIChoLCBsYXRlbmN5X21zKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoNiwgbmV4dF9zZXFudW0pOworCisgIC8qIFB1c2ggcGFja2V0IDggc28gdGhhdCA2IGFuZCA3IGlzIG1pc3NpbmcgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoOCkpKTsKKworICAvKiBXYWl0IGZvciBOQUNLcyBvbiA2IGFuZCA3ICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgdmVyaWZ5X3J0eF9ldmVudCAoaCwgNiwgNiAqIFRFU1RfQlVGX0RVUkFUSU9OLAorICAgICAgcnR4X2RlbGF5X21zLCBURVNUX0JVRl9EVVJBVElPTik7CisgIHJ0eF9yZXF1ZXN0XzYgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKEdTVF9FTEVNRU5UX0NMT0NLIChoLT5lbGVtZW50KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQ2NCAocnR4X3JlcXVlc3RfNiwKKyAgICAgIDYgKiBURVNUX0JVRl9EVVJBVElPTiArIHJ0eF9kZWxheV9tcyAqIEdTVF9NU0VDT05EKTsKKworICBnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCk7CisgIHZlcmlmeV9ydHhfZXZlbnQgKGgsCisgICAgICA3LCA3ICogVEVTVF9CVUZfRFVSQVRJT04sIHJ0eF9kZWxheV9tcywgVEVTVF9CVUZfRFVSQVRJT04pOworICBydHhfcmVxdWVzdF83ID0gZ3N0X2Nsb2NrX2dldF90aW1lIChHU1RfRUxFTUVOVF9DTE9DSyAoaC0+ZWxlbWVudCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50NjQgKHJ0eF9yZXF1ZXN0XzcsCisgICAgICA3ICogVEVTVF9CVUZfRFVSQVRJT04gKyBydHhfZGVsYXlfbXMgKiBHU1RfTVNFQ09ORCk7CisKKyAgLyogT3JpZ2luYWwgcGFja2V0IDcgYXJyaXZlcyAqLworICBub3cgPSAxNTAgKiBHU1RfTVNFQ09ORDsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3RpbWUgKGgsIG5vdyk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCBnc3RfaGFybmVzc19wdXNoIChoLAorICAgICAgICAgIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKG5vdywgNywgNyAqIFRFU1RfUlRQX1RTX0RVUkFUSU9OKSkpOworCisgIC8qIFdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIHBhY2tldCA2LCBzbyA3IHNob3VsZCBub3QgYmUgcHVzaGVkICovCisgIGdzdF9oYXJuZXNzX3dhaXRfZm9yX2Nsb2NrX2lkX3dhaXRzIChoLCAxLCA2MCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9oYXJuZXNzX2J1ZmZlcnNfaW5fcXVldWUgKGgpLCAwKTsKKworICAvKiBUaGUgb3JpZ2luYWwgYnVmZmVyIGRvZXMgbm90IGNvdW50IGluIHRoZSBSVFggc3RhdHMuICovCisgIGZhaWxfdW5sZXNzICh2ZXJpZnlfamJfc3RhdHMgKGgtPmVsZW1lbnQsCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1qaXR0ZXJidWZmZXItc3RhdHMiLAorICAgICAgICAgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwKKyAgICAgICAgICAgICAgIm51bS1sYXRlIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsCisgICAgICAgICAgICAgICJudW0tZHVwbGljYXRlcyIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAicnR4LWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDIsCisgICAgICAgICAgICAgICJydHgtc3VjY2Vzcy1jb3VudCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAicnR4LXBlci1wYWNrZXQiLCBHX1RZUEVfRE9VQkxFLCAwLjAsCisgICAgICAgICAgICAgICJydHgtcnR0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsIE5VTEwpKSk7CisKKyAgLyogUHVzaCBSVFggcGFja2V0IDcuIFNob3VsZCBiZSBkcm9wcGVkIGFzIGR1cGxpY2F0ZSBidXQgdXBkYXRlIFJUWCBzdGF0cy4gKi8KKyAgbm93ID0gMTYwICogR1NUX01TRUNPTkQ7CisgIGdzdF9oYXJuZXNzX3NldF90aW1lIChoLCBub3cpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgZ3N0X2hhcm5lc3NfcHVzaCAoaCwKKyAgICAgICAgICBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9ydHggKG5vdywgNykpKTsKKyAgZ3N0X2hhcm5lc3Nfd2FpdF9mb3JfY2xvY2tfaWRfd2FpdHMgKGgsIDEsIDYwKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2hhcm5lc3NfYnVmZmVyc19pbl9xdWV1ZSAoaCksIDApOworCisgIC8qIENoZWNrIFJUWCBzdGF0cyB3aXRoIHVwZGF0ZWQgbnVtLWR1cGxpY2F0ZXMgYW5kIHJ0eC1ydHQgZmllbGRzICovCisgIGZhaWxfdW5sZXNzICh2ZXJpZnlfamJfc3RhdHMgKGgtPmVsZW1lbnQsCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1qaXR0ZXJidWZmZXItc3RhdHMiLAorICAgICAgICAgICAgICAibnVtLXB1c2hlZCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSBuZXh0X3NlcW51bSwKKyAgICAgICAgICAgICAgIm51bS1sb3N0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsCisgICAgICAgICAgICAgICJudW0tbGF0ZSIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAibnVtLWR1cGxpY2F0ZXMiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMSwKKyAgICAgICAgICAgICAgInJ0eC1jb3VudCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAyLAorICAgICAgICAgICAgICAicnR4LXN1Y2Nlc3MtY291bnQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwKKyAgICAgICAgICAgICAgInJ0eC1wZXItcGFja2V0IiwgR19UWVBFX0RPVUJMRSwgMS4wLAorICAgICAgICAgICAgICAicnR4LXJ0dCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAobm93IC0gcnR4X3JlcXVlc3RfNyksCisgICAgICAgICAgICAgIE5VTEwpKSk7CisKKyAgLyogUlRYIHBhY2tldCA2IGFycml2ZXMsIGJvdGggNiwgNyBhbmQgOCBpcyByZWFkeSB0byBiZSBwdWxsZWQgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIGdzdF9oYXJuZXNzX3B1c2ggKGgsCisgICAgICAgICAgZ2VuZXJhdGVfdGVzdF9idWZmZXJfcnR4IChub3csIDYpKSk7CisKKyAgZm9yIChpID0gNjsgaSA8PSA4OyBpKyspIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGksIGdldF9ydHBfc2VxX251bSAoYnVmKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgfQorCisgIC8qIFJUWCBzdGF0cyBpcyB1cGRhdGVkIHdpdGggc3VjY2VzcyBjb3VudCBpbmNyZWFzZWQuICovCisgIGZhaWxfdW5sZXNzICh2ZXJpZnlfamJfc3RhdHMgKGgtPmVsZW1lbnQsCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1qaXR0ZXJidWZmZXItc3RhdHMiLAorICAgICAgICAgICAgICAibnVtLXB1c2hlZCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSBuZXh0X3NlcW51bSArIDMsCisgICAgICAgICAgICAgICJudW0tbG9zdCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAibnVtLWxhdGUiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwKKyAgICAgICAgICAgICAgIm51bS1kdXBsaWNhdGVzIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDEsCisgICAgICAgICAgICAgICJydHgtY291bnQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMiwKKyAgICAgICAgICAgICAgInJ0eC1zdWNjZXNzLWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDEsCisgICAgICAgICAgICAgICJydHgtcGVyLXBhY2tldCIsIEdfVFlQRV9ET1VCTEUsIDEuMCwKKyAgICAgICAgICAgICAgInJ0eC1ydHQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkKKyAgICAgICAgICAgICAgLyogVXNlIHRoZSBydHgtcnR0IGZvcm11bGEuIENhbiBiZSBzdWJqZWN0IHRvIGNoYW5nZSB0aG91Z2guICovCisgICAgICAgICAgICAgICgobm93IC0gcnR4X3JlcXVlc3RfNikgKyA0NyAqIChub3cgLSBydHhfcmVxdWVzdF83KSkgLyA0OCwKKyAgICAgICAgICAgICAgTlVMTCkpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnR4X2J1ZmZlcl9hcnJpdmVzX2FmdGVyX2xvc3RfdXBkYXRlc19ydHhfc3RhdHMpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgZ2ludCBsYXRlbmN5X21zID0gMTAwOworICBnaW50IG5leHRfc2VxbnVtOworICBHc3RDbG9ja1RpbWUgbm93LCBsYXN0X3J0eF9yZXF1ZXN0OworICBnaW50IHJ0eF9kZWxheV9tcyA9IDAuNSAqIFRFU1RfQlVGX01TOworCisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgImRvLXJldHJhbnNtaXNzaW9uIiwgVFJVRSwKKyAgICAgICJkby1sb3N0IiwgVFJVRSwgInJ0eC1tYXgtcmV0cmllcyIsIDEsIE5VTEwpOworICBuZXh0X3NlcW51bSA9IGNvbnN0cnVjdF9kZXRlcm1pbmlzdGljX2luaXRpYWxfc3RhdGUgKGgsIGxhdGVuY3lfbXMpOworCisgIC8qIENyYW5rIGNsb2NrIHRvIHNlbmQgcmV0cmFuc21pc3Npb24gZXZlbnRzIHJlcXVlc3Rpbmcgc2VxbnVtIDYgd2hpY2ggaGFzCisgICAqIG5vdCBhcnJpdmVkIHlldC4gKi8KKyAgZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpOworICB2ZXJpZnlfcnR4X2V2ZW50IChoLCBuZXh0X3NlcW51bSwKKyAgICAgIG5leHRfc2VxbnVtICogVEVTVF9CVUZfRFVSQVRJT04sIHJ0eF9kZWxheV9tcywgVEVTVF9CVUZfRFVSQVRJT04pOworCisgIGxhc3RfcnR4X3JlcXVlc3QgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKEdTVF9FTEVNRU5UX0NMT0NLIChoLT5lbGVtZW50KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQ2NCAobGFzdF9ydHhfcmVxdWVzdCwKKyAgICAgIG5leHRfc2VxbnVtICogVEVTVF9CVUZfRFVSQVRJT04gKyBydHhfZGVsYXlfbXMgKiBHU1RfTVNFQ09ORCk7CisKKyAgLyogc2VxbnVtIDYgaXMgY29uc2lkZXJlZCBsb3N0ICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgdmVyaWZ5X2xvc3RfZXZlbnQgKGgsIG5leHRfc2VxbnVtLAorICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiwgVEVTVF9CVUZfRFVSQVRJT04pOworCisgIC8qIHNlcW51bSA2IGFycml2ZXMgdG9vIGxhdGUgKi8KKyAgbm93ID0gZ3N0X2Nsb2NrX2dldF90aW1lIChHU1RfRUxFTUVOVF9DTE9DSyAoaC0+ZWxlbWVudCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgZ3N0X2hhcm5lc3NfcHVzaCAoaCwKKyAgICAgICAgICBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9ydHggKG5vdywgbmV4dF9zZXFudW0pKSk7CisKKyAgZmFpbF91bmxlc3MgKHZlcmlmeV9qYl9zdGF0cyAoaC0+ZWxlbWVudCwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLWppdHRlcmJ1ZmZlci1zdGF0cyIsCisgICAgICAgICAgICAgICJudW0tcHVzaGVkIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIG5leHRfc2VxbnVtLAorICAgICAgICAgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMSwKKyAgICAgICAgICAgICAgIm51bS1sYXRlIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDEsCisgICAgICAgICAgICAgICJudW0tZHVwbGljYXRlcyIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAicnR4LWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDEsCisgICAgICAgICAgICAgICJydHgtc3VjY2Vzcy1jb3VudCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAicnR4LXBlci1wYWNrZXQiLCBHX1RZUEVfRE9VQkxFLCAxLjAsCisgICAgICAgICAgICAgICJydHgtcnR0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIChub3cgLSBsYXN0X3J0eF9yZXF1ZXN0KSwKKyAgICAgICAgICAgICAgTlVMTCkpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnR4X3J0dF9sYXJnZXJfdGhhbl9yZXRyeV90aW1lb3V0KQoreworICAvKiBXaGVuIFJUVCBpcyBsYXJnZXIgdGhhbiByZXRyeSBwZXJpb2Qgd2Ugd2lsbCBzZW5kIHR3byBvciBtb3JlIHJlcXVlc3RzCisgICAqIGJlZm9yZSByZWNlaXZpbmcgYW55IHJldHJhbnNtaXNzaW9uIHBhY2tldHMgKi8KKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBnaW50IGxhdGVuY3lfbXMgPSAxMDA7CisgIGdpbnQgbmV4dF9zZXFudW07CisgIGdpbnQgcnR4X3JldHJ5X3RpbWVvdXRfbXMgPSAyMDsKKyAgZ2ludCBydHhfZGVsYXlfbXMgPSAwLjUgKiBURVNUX0JVRl9NUzsKKyAgZ2ludCBydHQgPSBydHhfcmV0cnlfdGltZW91dF9tcyAqIEdTVF9NU0VDT05EICsgMTsKKyAgR3N0Q2xvY2tUaW1lIG5vdywgZmlyc3RfcmVxdWVzdCwgc2Vjb25kX3JlcXVlc3Q7CisKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAiZG8tcmV0cmFuc21pc3Npb24iLCBUUlVFLAorICAgICAgInJ0eC1yZXRyeS10aW1lb3V0IiwgcnR4X3JldHJ5X3RpbWVvdXRfbXMsIE5VTEwpOworICBuZXh0X3NlcW51bSA9IGNvbnN0cnVjdF9kZXRlcm1pbmlzdGljX2luaXRpYWxfc3RhdGUgKGgsIGxhdGVuY3lfbXMpOworCisgIC8qIFdhaXQgZm9yIGZpcnN0IE5BQ0sgb24gNiAqLworICBnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCk7CisgIHZlcmlmeV9ydHhfZXZlbnQgKGgsIG5leHRfc2VxbnVtLAorICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiwgcnR4X2RlbGF5X21zLCBURVNUX0JVRl9EVVJBVElPTik7CisgIGZpcnN0X3JlcXVlc3QgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKEdTVF9FTEVNRU5UX0NMT0NLIChoLT5lbGVtZW50KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQ2NCAoZmlyc3RfcmVxdWVzdCwKKyAgICAgIG5leHRfc2VxbnVtICogVEVTVF9CVUZfRFVSQVRJT04gKyBydHhfZGVsYXlfbXMgKiBHU1RfTVNFQ09ORCk7CisKKyAgLyogUGFja2V0IEBuZXh0X3NlcW51bSArIDEgYXJyaXZlcyBpbiB0aW1lIChzbyB0aGF0IHdlIGF2b2lkIGl0cyBFWFBFQ1RFRAorICAgKiB0aW1lcnMgdG8gaW50ZXJmZXIgd2l0aCBvdXIgdGVzdCkgKi8KKyAgcHVzaF90ZXN0X2J1ZmZlciAoaCwgbmV4dF9zZXFudW0gKyAxKTsKKworICAvKiBTaW11bGF0aW5nIFJUVCA+IHJ0eC1yZXRyeS10aW1lb3V0LCB3ZSBzZW5kIGEgbmV3IE5BQ0sgYmVmb3JlIHJlY2VpdmluZworICAgKiB0aGUgUlRYIHBhY2tldC4gV2FpdCBmb3Igc2Vjb25kIE5BQ0sgb24gQG5leHRfc2VxbnVtICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgcnR4X2RlbGF5X21zICs9IHJ0eF9yZXRyeV90aW1lb3V0X21zOworICB2ZXJpZnlfcnR4X2V2ZW50IChoLCBuZXh0X3NlcW51bSwKKyAgICAgIG5leHRfc2VxbnVtICogVEVTVF9CVUZfRFVSQVRJT04sIHJ0eF9kZWxheV9tcywgVEVTVF9CVUZfRFVSQVRJT04pOworICBzZWNvbmRfcmVxdWVzdCA9IGdzdF9jbG9ja19nZXRfdGltZSAoR1NUX0VMRU1FTlRfQ0xPQ0sgKGgtPmVsZW1lbnQpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludDY0IChzZWNvbmRfcmVxdWVzdCwKKyAgICAgIG5leHRfc2VxbnVtICogVEVTVF9CVUZfRFVSQVRJT04gKyBydHhfZGVsYXlfbXMgKiBHU1RfTVNFQ09ORCk7CisKKyAgLyogVGhlIGZpcnN0IHJldHJhbnNtaXR0ZWQgcGFja2V0IGFycml2ZXMgKi8KKyAgbm93ID0gZmlyc3RfcmVxdWVzdCArIHJ0dDsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3RpbWUgKGgsIG5vdyk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCBnc3RfaGFybmVzc19wdXNoIChoLAorICAgICAgICAgIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX3J0eCAobm93LCBuZXh0X3NlcW51bSkpKTsKKworICAvKiBQdWxsIHBhY2tldHMgQG5leHRfc2VxbnVtIGFuZCBAbmV4dF9zZXFudW0gKyAxICovCisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworCisgIC8qIFN0YXRzIHNob3VsZCBiZSB1cGRhdGVkLiBOb3RlIHRoYXQgUlRUIGlzIG5vdCB1cGRhdGVkIHNpbmNlIHdlIGNhbm5vdCBiZQorICAgKiBzdXJlIHdoZXRoZXIgdGhlIFJUWCBwYWNrZXQgaXMgaW4gcmVzcG9uc2UgdG8gdGhlIGZpcnN0IG9yIHNlY29uZCBOQUNLLiAqLworICBmYWlsX3VubGVzcyAodmVyaWZ5X2piX3N0YXRzIChoLT5lbGVtZW50LAorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtaml0dGVyYnVmZmVyLXN0YXRzIiwKKyAgICAgICAgICAgICAgIm51bS1wdXNoZWQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgbmV4dF9zZXFudW0gKyAyLAorICAgICAgICAgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwKKyAgICAgICAgICAgICAgIm51bS1sYXRlIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsCisgICAgICAgICAgICAgICJudW0tZHVwbGljYXRlcyIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAwLAorICAgICAgICAgICAgICAicnR4LWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDIsCisgICAgICAgICAgICAgICJydHgtc3VjY2Vzcy1jb3VudCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAxLAorICAgICAgICAgICAgICAicnR4LXBlci1wYWNrZXQiLCBHX1RZUEVfRE9VQkxFLCAyLjAsCisgICAgICAgICAgICAgICJydHgtcnR0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsIE5VTEwpKSk7CisKKyAgLyogUGFja2V0IEBuZXh0X3NlcW51bSArIDIgYXJyaXZlcyBpbiB0aW1lICovCisgIHB1c2hfdGVzdF9idWZmZXIgKGgsIG5leHRfc2VxbnVtICsgMik7CisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKworICAvKiBOb3cgdGhlIHNlY29uZCByZXRyYW5zbWl0dGVkIHBhY2tldCBhcnJpdmVzICovCisgIG5vdyA9IHNlY29uZF9yZXF1ZXN0ICsgcnR0OworICBnc3RfaGFybmVzc19zZXRfdGltZSAoaCwgbm93KTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIGdzdF9oYXJuZXNzX3B1c2ggKGgsCisgICAgICAgICAgZ2VuZXJhdGVfdGVzdF9idWZmZXJfcnR4IChub3csIG5leHRfc2VxbnVtKSkpOworCisgIC8qIFRoZSBzdGF0cyBpcyB1cGRhdGVkIHdpdGggdGhlIGNvcnJlY3QgUlRULiAqLworICBmYWlsX3VubGVzcyAodmVyaWZ5X2piX3N0YXRzIChoLT5lbGVtZW50LAorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtaml0dGVyYnVmZmVyLXN0YXRzIiwKKyAgICAgICAgICAgICAgIm51bS1wdXNoZWQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgbmV4dF9zZXFudW0gKyAzLAorICAgICAgICAgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwKKyAgICAgICAgICAgICAgIm51bS1sYXRlIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsCisgICAgICAgICAgICAgICJudW0tZHVwbGljYXRlcyIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAxLAorICAgICAgICAgICAgICAicnR4LWNvdW50IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDIsCisgICAgICAgICAgICAgICJydHgtc3VjY2Vzcy1jb3VudCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAxLAorICAgICAgICAgICAgICAicnR4LXBlci1wYWNrZXQiLCBHX1RZUEVfRE9VQkxFLCAyLjAsCisgICAgICAgICAgICAgICJydHgtcnR0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIHJ0dCwgTlVMTCkpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnR4X25vX3JlcXVlc3RfaWZfdGltZV9wYXN0X3JldHJ5X3BlcmlvZCkKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBjb25zdCBnaW50IGxhdGVuY3lfbXMgPSAyMDA7CisgIGNvbnN0IGdpbnQgcmV0cnlfcGVyaW9kX21zID0gMTIwOworICBHc3RUZXN0Q2xvY2sgKnRlc3RjbG9jazsKKyAgR3N0Q2xvY2tJRCBwZW5kaW5nX2lkOworICBHc3RDbG9ja1RpbWUgdGltZTsKKyAgZ2ludCBpOworCisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2FwcyAoaCwgZ2VuZXJhdGVfY2FwcyAoKSk7CisgIHRlc3RjbG9jayA9IGdzdF9oYXJuZXNzX2dldF90ZXN0Y2xvY2sgKGgpOworCisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgImRvLWxvc3QiLCBUUlVFLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAiZG8tcmV0cmFuc21pc3Npb24iLCBUUlVFLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAibGF0ZW5jeSIsIGxhdGVuY3lfbXMsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJydHgtcmV0cnktcGVyaW9kIiwgcmV0cnlfcGVyaW9kX21zLCBOVUxMKTsKKworICAvKiBwdXNoIHRoZSBmaXJzdCBjb3VwbGUgb2YgYnVmZmVycyAqLworICBwdXNoX3Rlc3RfYnVmZmVyIChoLCAwKTsKKyAgcHVzaF90ZXN0X2J1ZmZlciAoaCwgMSk7CisKKyAgLyogZHJvcCByZWNvbmZpZ3VyZSBldmVudCAqLworICBnc3RfZXZlbnRfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGxfdXBzdHJlYW1fZXZlbnQgKGgpKTsKKyAgLyogZHJvcCBHc3RFdmVudFN0cmVhbVN0YXJ0ICYgR3N0RXZlbnRDYXBzICYgR3N0RXZlbnRTZWdtZW50ICovCisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgZ3N0X2V2ZW50X3VucmVmIChnc3RfaGFybmVzc19wdWxsX2V2ZW50IChoKSk7CisKKyAgLyogV2FpdCBmb3IgdGhlIGZpcnN0IEVYUEVDVEVEIHRpbWVyIHRvIGJlIHNjaGVkdWxlZCAqLworICBnc3RfdGVzdF9jbG9ja193YWl0X2Zvcl9uZXh0X3BlbmRpbmdfaWQgKHRlc3RjbG9jaywgJnBlbmRpbmdfaWQpOworICB0aW1lID0gZ3N0X2Nsb2NrX2lkX2dldF90aW1lIChwZW5kaW5nX2lkKTsKKyAgZ3N0X2Nsb2NrX2lkX3VucmVmIChwZW5kaW5nX2lkKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludDY0ICh0aW1lLCAyICogVEVTVF9CVUZfRFVSQVRJT04gKyAxMCAqIEdTVF9NU0VDT05EKTsKKworICAvKiBMZXQgdGhlIGZpcnN0IEVYUEVDVEVEIHRpbWVyIHRpbWUgb3V0IGFuZCBiZSBzZW50LiBIb3dldmVyLCBzZXQgdGhlICdub3cnCisgICAqIHRpbWUgdG8gYmUgcGFzdCB0aGUgcmV0cnktcGVyaW9kIHNpbXVsYXRpbmcgdGhhdCB0aGUgaml0dGVyYnVmZmVyIGhhcyB0b28KKyAgICogbXVjaCB0byBkbyBhbmQgaXMgbm90IGFibGUgdG8gcHJvY2VzcyBhbGwgdGltZXJzIGluIHJlYWwtdGltZS4gSW4gdGhpcworICAgKiBjYXNlIHRoZSBqaXR0ZXJidWZmZXIgc2hvdWxkIG5vdCBzY2hlZHVsZSBhIG5ldyBFWFBFQ1RFRCB0aW1lciBhcyB0aGF0CisgICAqIHdvdWxkIGp1c3QgbWFrZSBtYXR0ZXJzIHdvcnNlIChtb3JlIHVubmVjZXNzYXJ5IHByb2Nlc3Npbmcgb2YgYSByZXF1ZXN0CisgICAqIHRoYXQgaXMgYWxyZWFkeSB0b28gbGF0ZSB0byBiZSB2YWx1YWJsZSkuIEluIHByYWN0aWNlIHRoaXMgdHlwaWNhbGx5CisgICAqIGhhcHBlbnMgZm9yIGhpZ2ggbG9zcyBuZXR3b3JrcyB3aXRoIGxvdyBSVFQuICovCisgIGdzdF90ZXN0X2Nsb2NrX3NldF90aW1lX2FuZF9wcm9jZXNzICh0ZXN0Y2xvY2ssCisgICAgICAyICogVEVTVF9CVUZfRFVSQVRJT04gKyByZXRyeV9wZXJpb2RfbXMgKiBHU1RfTVNFQ09ORCArIDEpOworCisgIC8qIFZlcmlmeSB0aGUgZXZlbnQuIEl0IGNvdWxkIGJlIGFyZ3VlZCB0aGF0IHRoaXMgcmVxdWVzdCBpcyBhbHJlYWR5IHRvbworICAgKiBsYXRlIGFuZCB1bm5lY2Vzc2FyeS4gSG93ZXZlciwgaW4gb3JkZXIgdG8ga2VlcCB0aGluZ3Mgc2ltcGxlIChmb3Igbm93KQorICAgKiB3ZSBqdXN0IGtlZXAgdGhlIGFscmVhZHkgc2NlaGR1bGVkIEVYUEVDVEVEIHRpbWVyLCBidXQgcmVmcmFpbiBmcm9tCisgICAqIHNjaGVkdWxlZCBhbm90aGVyIEVYUEVDVEVEIHRpbWVyICovCisgIHZlcmlmeV9ydHhfZXZlbnQgKGgsIDIsIDIgKiBURVNUX0JVRl9EVVJBVElPTiwgMTAsIFRFU1RfQlVGX0RVUkFUSU9OKTsKKworICAvKiAiY3JhbmsiIHRvIHJlYWNoIHRoZSBERUFETElORSBmb3IgcGFja2V0IDAgKi8KKyAgZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpOworICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChoKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgwLCBnc3RfaGFybmVzc191cHN0cmVhbV9ldmVudHNfaW5fcXVldWUgKGgpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMCwgZ3N0X2hhcm5lc3NfZXZlbnRzX2luX3F1ZXVlIChoKSk7CisKKyAgLyogImNyYW5rIiB0byB0aW1lIG91dCB0aGUgTE9TVCBldmVudCAqLworICBnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCk7CisgIHZlcmlmeV9sb3N0X2V2ZW50IChoLCAyLCAyICogVEVTVF9CVUZfRFVSQVRJT04sIFRFU1RfQlVGX0RVUkFUSU9OKTsKKworICBnc3Rfb2JqZWN0X3VucmVmICh0ZXN0Y2xvY2spOworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnR4X3NhbWVfZGVsYXlfYW5kX3JldHJ5X3RpbWVvdXQpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgZ2ludCBsYXRlbmN5X21zID0gNSAqIFRFU1RfQlVGX01TOworICBnaW50IG5leHRfc2VxbnVtOworICBnaW50IHJ0eF9kZWxheV9tcyA9IDIwOworICBHc3RDbG9ja1RpbWUgbGFzdF9ydHhfcmVxdWVzdDsKKworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1yZXRyYW5zbWlzc2lvbiIsIFRSVUUsCisgICAgICAicnR4LW1heC1yZXRyaWVzIiwgMywgInJ0eC1kZWxheSIsIHJ0eF9kZWxheV9tcywKKyAgICAgICJydHgtcmV0cnktdGltZW91dCIsIHJ0eF9kZWxheV9tcywgTlVMTCk7CisgIG5leHRfc2VxbnVtID0gY29uc3RydWN0X2RldGVybWluaXN0aWNfaW5pdGlhbF9zdGF0ZSAoaCwgbGF0ZW5jeV9tcyk7CisKKyAgLyogQ3JhbmsgY2xvY2sgdG8gc2VuZCByZXRyYW5zbWlzc2lvbiBldmVudHMgcmVxdWVzdGluZyBzZXFudW0gNiB3aGljaCBoYXMKKyAgICogbm90IGFycml2ZWQgeWV0LiAqLworICBnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCk7CisgIHZlcmlmeV9ydHhfZXZlbnQgKGgsIG5leHRfc2VxbnVtLAorICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiwgcnR4X2RlbGF5X21zLCBURVNUX0JVRl9EVVJBVElPTik7CisgIC8qIGZpcnN0IHJ0eCBmb3IgcGFja2V0IEBuZXh0X3NlcW51bSBzaG91bGQgYXJyaXZlIGF0IHRoZSByaWdodCB0aW1lICovCisgIGxhc3RfcnR4X3JlcXVlc3QgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKEdTVF9FTEVNRU5UX0NMT0NLIChoLT5lbGVtZW50KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQ2NCAobGFzdF9ydHhfcmVxdWVzdCwKKyAgICAgIG5leHRfc2VxbnVtICogVEVTVF9CVUZfRFVSQVRJT04gKyBydHhfZGVsYXlfbXMgKiBHU1RfTVNFQ09ORCk7CisKKyAgLyogdmVyaWZ5IHdlIGhhdmUgcHVsbGVkIG91dCBhbGwgcnR4LWV2ZW50cyAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgwLCBnc3RfaGFybmVzc191cHN0cmVhbV9ldmVudHNfaW5fcXVldWUgKGgpKTsKKworICAvKiBub3cgY3JhbmsgdG8gZ2V0IHRoZSBzZWNvbmQgYXR0ZW1wdCBhdCBwYWNrZXQgQG5leHRfc2VxbnVtICovCisgIGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKTsKKyAgdmVyaWZ5X3J0eF9ldmVudCAoaCwgbmV4dF9zZXFudW0sCisgICAgICBuZXh0X3NlcW51bSAqIFRFU1RfQlVGX0RVUkFUSU9OLCBydHhfZGVsYXlfbXMgKiAyLCBURVNUX0JVRl9EVVJBVElPTik7CisKKyAgLyogc2Vjb25kIHJ0eCBmb3Igc2VxbnVtIDYgc2hvdWxkIGFycml2ZSBhdCAxNDAgKyAyMG1zICovCisgIGxhc3RfcnR4X3JlcXVlc3QgPSBnc3RfY2xvY2tfZ2V0X3RpbWUgKEdTVF9FTEVNRU5UX0NMT0NLIChoLT5lbGVtZW50KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQ2NCAobGFzdF9ydHhfcmVxdWVzdCwKKyAgICAgIG5leHRfc2VxbnVtICogVEVTVF9CVUZfRFVSQVRJT04gKyBydHhfZGVsYXlfbXMgKiAyICogR1NUX01TRUNPTkQpOworCisgIC8qIHZlcmlmeSB3ZSBoYXZlIHB1bGxlZCBvdXQgYWxsIHJ0eC1ldmVudHMgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMCwgZ3N0X2hhcm5lc3NfdXBzdHJlYW1fZXZlbnRzX2luX3F1ZXVlIChoKSk7CisKKyAgZmFpbF91bmxlc3MgKHZlcmlmeV9qYl9zdGF0cyAoaC0+ZWxlbWVudCwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLWppdHRlcmJ1ZmZlci1zdGF0cyIsCisgICAgICAgICAgICAgICJudW0tcHVzaGVkIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIG5leHRfc2VxbnVtLAorICAgICAgICAgICAgICAibnVtLWxvc3QiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMCwKKyAgICAgICAgICAgICAgInJ0eC1jb3VudCIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAyLCBOVUxMKSkpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHhfd2l0aF9iYWNrd2FyZHNfcnRwdGltZSkKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBnaW50IGxhdGVuY3lfbXMgPSA0MDsKKworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJkby1yZXRyYW5zbWlzc2lvbiIsIFRSVUUsIE5VTEwpOworICBjb25zdHJ1Y3RfZGV0ZXJtaW5pc3RpY19pbml0aWFsX3N0YXRlIChoLCBsYXRlbmN5X21zKTsKKworICAvKgorICAgKiBGb3IgdmlkZW8gdXNpbmcgQi1mcmFtZXMsIGFuIGV4cGVjdGVkIHNlcXVlbmNlCisgICAqIGNvdWxkIGJlIGxpa2UgdGhpczoKKyAgICogKEkgPSBJLWZyYW1lLCBQID0gUC1mcmFtZSwgQiA9IEItZnJhbWUpCisgICAqICAgICAgICAgICAgICAgX19fICAgX19fICAgX19fCisgICAqICAgICAgICAgIC4uLiB8IDMgfCB8IDQgfCB8IDUgfAorICAgKiAgICAgICAgICAgICAgIOKAk+KAk+KAkyAgIOKAk+KAk+KAkyAgIOKAk+KAk+KAkworICAgKiBydHB0aW1lOiAgICAgICAzKEkpICA1KFApICA0KEIpCisgICAqIGFycml2YWwoZHRzKTogIDMgICAgIDUgICAgIDUKKyAgICoKKyAgICogTm90aWNlIGhlcmUgdGhhdCBwYWNrZXQgNSAodGhlIEIgZnJhbWUpIG1ha2UKKyAgICogdGhlIHJ0cHRpbWUgZ28gYmFja3dhcmRzLgorICAgKi8KKworICAvKiBzZXFudW0gMywgYXJyaXZpbmcgYXQgdGltZSAzIHdpdGggcnRwdGltZSAzICovCisgIHB1c2hfdGVzdF9idWZmZXIgKGgsIDMpOworICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChoKSk7CisKKyAgLyogc2VxbnVtIDQsIGFycml2aW5nIGF0IHRpbWUgNSB3aXRoIHJ0cHRpbWUgNSAqLworICBnc3RfaGFybmVzc19wdXNoIChoLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9mdWxsICg1ICogVEVTVF9CVUZfRFVSQVRJT04sCisgICAgICAgICAgNCwgNSAqIFRFU1RfUlRQX1RTX0RVUkFUSU9OKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGwgKGgpKTsKKworICAvKiBzZXFudW0gNSwgYXJyaXZpbmcgYXQgdGltZSA1IHdpdGggcnRwdGltZSA0ICovCisgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKDUgKiBURVNUX0JVRl9EVVJBVElPTiwKKyAgICAgICAgICA1LCA0ICogVEVTVF9SVFBfVFNfRFVSQVRJT04pKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworCisgIC8qIGNyYW5rIHRvIHRpbWUtb3V0IHRoZSBydHgtcmVxdWVzdCBmb3Igc2VxbnVtIDYsIHRoZSBwb2ludCBoZXJlCisgICAgIGJlaW5nIHRoYXQgdGhlIGJhY2t3YXJkcyBydHB0aW1lIGRpZCBub3QgbWVzcyB1cCB0aGUgdGltZW91dCBmb3IKKyAgICAgdGhlIHJ0eCBldmVudCAqLworICBnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCk7CisgIHZlcmlmeV9ydHhfZXZlbnQgKGgsIDYsIDUgKiBURVNUX0JVRl9EVVJBVElPTiArIDE1ICogR1NUX01TRUNPTkQsCisgICAgICAxNywgMzUgKiBHU1RfTVNFQ09ORCk7CisKKyAgZmFpbF91bmxlc3MgKHZlcmlmeV9qYl9zdGF0cyAoaC0+ZWxlbWVudCwKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLWppdHRlcmJ1ZmZlci1zdGF0cyIsCisgICAgICAgICAgICAgICJudW0tcHVzaGVkIiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDYsCisgICAgICAgICAgICAgICJydHgtY291bnQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMSwKKyAgICAgICAgICAgICAgIm51bS1sb3N0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDAsIE5VTEwpKSk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3J0eF90aW1lcl9yZXVzZSkKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBnaW50IGxhdGVuY3lfbXMgPSA1ICogVEVTVF9CVUZfTVM7CisgIGdpbnQgcnR4X2RlbGF5X21zID0gMC41ICogVEVTVF9CVUZfTVM7CisgIGd1aW50IG5leHRfc2VxbnVtOworCisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgImRvLXJldHJhbnNtaXNzaW9uIiwgVFJVRSwKKyAgICAgICJkby1sb3N0IiwgVFJVRSwgInJ0eC1tYXgtcmV0cmllcyIsIDEsIE5VTEwpOworICBuZXh0X3NlcW51bSA9IGNvbnN0cnVjdF9kZXRlcm1pbmlzdGljX2luaXRpYWxfc3RhdGUgKGgsIGxhdGVuY3lfbXMpOworCisgIC8qIGNyYW5rIHRvIHRpbWVvdXQgdGhlIG9ubHkgcnR4LXJlcXVlc3QsIGFuZCB0aGUgdGltZXIgd2lsbAorICAgKiBub3cgcmVzY2hlZHVsZSBhcyBhIGxvc3QtdGltZXIgaW50ZXJuYWxseSAqLworICBnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCk7CisgIHZlcmlmeV9ydHhfZXZlbnQgKGgsIG5leHRfc2VxbnVtLAorICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiwgcnR4X2RlbGF5X21zLCBURVNUX0JVRl9EVVJBVElPTik7CisKKyAgLyogYnV0IG5vdyBidWZmZXIgNiBhcnJpdmVzLCBhbmQgdGhpcyBzaG91bGQgbm93IHJldXNlIHRoZSBsb3N0LXRpbWVyCisgICAqIGZvciA2LCBhcyBhbiBleHBlY3RlZC10aW1lciBmb3IgNyAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyIChuZXh0X3NlcW51bSkpKTsKKworICAvKiBub3cgY3JhbmsgdG8gdGltZW91dCB0aGUgZXhwZWN0ZWQtdGltZXIgZm9yIDcgYW5kIHZlcmlmeSAqLworICBuZXh0X3NlcW51bSsrOworICBnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCk7CisgIHZlcmlmeV9ydHhfZXZlbnQgKGgsIG5leHRfc2VxbnVtLAorICAgICAgbmV4dF9zZXFudW0gKiBURVNUX0JVRl9EVVJBVElPTiwgcnR4X2RlbGF5X21zLCBURVNUX0JVRl9EVVJBVElPTik7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2RlYWRsaW5lX3RzX29mZnNldCkKK3sKKyAgR3N0SGFybmVzcyAqaCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBHc3RUZXN0Q2xvY2sgKnRlc3RjbG9jazsKKyAgR3N0Q2xvY2tJRCBpZDsKKyAgY29uc3QgZ2ludCBqYl9sYXRlbmN5X21zID0gMTA7CisKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzIChoLCBnZW5lcmF0ZV9jYXBzICgpKTsKKyAgdGVzdGNsb2NrID0gZ3N0X2hhcm5lc3NfZ2V0X3Rlc3RjbG9jayAoaCk7CisKKyAgZ19vYmplY3Rfc2V0IChoLT5lbGVtZW50LCAibGF0ZW5jeSIsIGpiX2xhdGVuY3lfbXMsIE5VTEwpOworCisgIC8qIHB1c2ggdGhlIGZpcnN0IGJ1ZmZlciBpbiAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyICgwKSkpOworCisgIC8qIHdhaXRfbmV4dF90aW1lb3V0KCkgc3luY3Mgb24gdGhlIGRlYWRsaW5lIHRpbWVyICovCisgIGdzdF90ZXN0X2Nsb2NrX3dhaXRfZm9yX25leHRfcGVuZGluZ19pZCAodGVzdGNsb2NrLCAmaWQpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChqYl9sYXRlbmN5X21zICogR1NUX01TRUNPTkQsCisgICAgICBnc3RfY2xvY2tfaWRfZ2V0X3RpbWUgKGlkKSk7CisgIGdzdF9jbG9ja19pZF91bnJlZiAoaWQpOworCisgIC8qIGFkZCB0cy1vZmZzZXQgd2hpbGUgd2FpdGluZyAqLworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJ0cy1vZmZzZXQiLCAyMCAqIEdTVF9NU0VDT05ELCBOVUxMKTsKKworICBnc3RfdGVzdF9jbG9ja19zZXRfdGltZV9hbmRfcHJvY2VzcyAodGVzdGNsb2NrLCBqYl9sYXRlbmN5X21zICogR1NUX01TRUNPTkQpOworCisgIC8qIHdhaXRfbmV4dF90aW1lb3V0KCkgc3luY3Mgb24gdGhlIG5ldyBkZWFkbGluZSB0aW1lciAqLworICBnc3RfdGVzdF9jbG9ja193YWl0X2Zvcl9uZXh0X3BlbmRpbmdfaWQgKHRlc3RjbG9jaywgJmlkKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoKDIwICsgamJfbGF0ZW5jeV9tcykgKiBHU1RfTVNFQ09ORCwKKyAgICAgIGdzdF9jbG9ja19pZF9nZXRfdGltZSAoaWQpKTsKKyAgZ3N0X2Nsb2NrX2lkX3VucmVmIChpZCk7CisKKyAgLyogbm93IG1ha2UgZGVhZGxpbmUgdGltZXIgdGltZW91dCAqLworICBnc3RfdGVzdF9jbG9ja19zZXRfdGltZV9hbmRfcHJvY2VzcyAodGVzdGNsb2NrLAorICAgICAgKDIwICsgamJfbGF0ZW5jeV9tcykgKiBHU1RfTVNFQ09ORCk7CisKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoZ3N0X2hhcm5lc3NfcHVsbCAoaCkpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHRlc3RjbG9jayk7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wdXNoX2JpZ19nYXApCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgR3N0QnVmZmVyICpidWY7CisgIGNvbnN0IGdpbnQgbnVtX2NvbnNlY3V0aXZlID0gNTsKKyAgZ2ludCBpOworCisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2FwcyAoaCwgZ2VuZXJhdGVfY2FwcyAoKSk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9jb25zZWN1dGl2ZTsgaSsrKQorICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgICBnc3RfaGFybmVzc19wdXNoIChoLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoMTAwMCArIGkpKSk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKSk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9jb25zZWN1dGl2ZTsgaSsrKSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgxMDAwICsgaSwgZ2V0X3J0cF9zZXFfbnVtIChidWYpKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICB9CisKKyAgLyogUHVzaCBtb3JlIHBhY2tldHMgZnJvbSBhIGRpZmZlcmVudCBzZXF1ZW5jZSBudW1iZXIgZG9tYWluCisgICAqIHRvIHRyaWdnZXIgImJpZyBnYXAiIGxvZ2ljLiAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbnNlY3V0aXZlOyBpKyspCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyICgyMDAwMCArIGkpKSk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9oYXJuZXNzX2NyYW5rX3NpbmdsZV9jbG9ja193YWl0IChoKSk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9jb25zZWN1dGl2ZTsgaSsrKSB7CisgICAgR3N0QnVmZmVyICpidWYgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgyMDAwMCArIGksIGdldF9ydHBfc2VxX251bSAoYnVmKSk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgfQorCisgIC8qIEZpbmFsIGJ1ZmZlciBzaG91bGQgYmUgcHVzaGVkIHN0cmFpZ2h0IHRocm91Z2ggKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoMjAwMDAgKyBudW1fY29uc2VjdXRpdmUpKSk7CisgIGJ1ZiA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgyMDAwMCArIG51bV9jb25zZWN1dGl2ZSwgZ2V0X3J0cF9zZXFfbnVtIChidWYpKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ3VpbnQgc2VxbnVtX29mZnNldDsKKyAgZ3VpbnQgbGF0ZV9idWZmZXI7Cit9IFRlc3RMYXRlQXJyaXZhbElucHV0OworCitzdGF0aWMgY29uc3QgVGVzdExhdGVBcnJpdmFsSW5wdXQKKyAgICB0ZXN0X2NvbnNpZGVyZWRfbG9zdF9wYWNrZXRfaW5fbGFyZ2VfZ2FwX2Fycml2ZXNfaW5wdXRbXSA9IHsKKyAgezAsIDF9LCB7MCwgMn0sIHs2NTUzNSwgMX0sIHs2NTUzNSwgMn0sIHs2NTUzNCwgMX0sIHs2NTUzNCwgMn0KK307CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2NvbnNpZGVyZWRfbG9zdF9wYWNrZXRfaW5fbGFyZ2VfZ2FwX2Fycml2ZXMpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBqaXR0ZXJidWZmZXIiKTsKKyAgR3N0VGVzdENsb2NrICp0ZXN0Y2xvY2s7CisgIEdzdENsb2NrSUQgaWQ7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBnaW50IGpiX2xhdGVuY3lfbXMgPSAyMDsKKyAgY29uc3QgVGVzdExhdGVBcnJpdmFsSW5wdXQgKnRlc3RfaW5wdXQgPQorICAgICAgJnRlc3RfY29uc2lkZXJlZF9sb3N0X3BhY2tldF9pbl9sYXJnZV9nYXBfYXJyaXZlc19pbnB1dFtfX2lfX107CisgIGd1aW50IHNlcV9vZmZzZXQgPSB0ZXN0X2lucHV0LT5zZXFudW1fb2Zmc2V0OworICBndWludCBsYXRlX2J1ZmZlciA9IHRlc3RfaW5wdXQtPmxhdGVfYnVmZmVyOworICBnaW50IGk7CisKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzIChoLCBnZW5lcmF0ZV9jYXBzICgpKTsKKyAgdGVzdGNsb2NrID0gZ3N0X2hhcm5lc3NfZ2V0X3Rlc3RjbG9jayAoaCk7CisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgImRvLWxvc3QiLCBUUlVFLCAibGF0ZW5jeSIsIGpiX2xhdGVuY3lfbXMsIE5VTEwpOworCisgIC8qIGZpcnN0IHB1c2ggYnVmZmVyIDAgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoLCBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9mdWxsICgwICogVEVTVF9CVUZfRFVSQVRJT04sCisgICAgICAgICAgICAgIDAgKyBzZXFfb2Zmc2V0LCAwICogVEVTVF9SVFBfVFNfRFVSQVRJT04pKSk7CisgIGZhaWxfdW5sZXNzIChnc3RfaGFybmVzc19jcmFua19zaW5nbGVfY2xvY2tfd2FpdCAoaCkpOworICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChoKSk7CisKKyAgLyogZHJvcCBHc3RFdmVudFN0cmVhbVN0YXJ0ICYgR3N0RXZlbnRDYXBzICYgR3N0RXZlbnRTZWdtZW50ICovCisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgZ3N0X2V2ZW50X3VucmVmIChnc3RfaGFybmVzc19wdWxsX2V2ZW50IChoKSk7CisKKyAgLyogaG9wIG92ZXIgMyBwYWNrZXRzLCBhbmQgcHVzaCBidWZmZXIgNCAoZ2FwIG9mIDMpICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ2VuZXJhdGVfdGVzdF9idWZmZXJfZnVsbCAoNCAqIFRFU1RfQlVGX0RVUkFUSU9OLAorICAgICAgICAgICAgICA0ICsgc2VxX29mZnNldCwgNCAqIFRFU1RfUlRQX1RTX0RVUkFUSU9OKSkpOworCisgIC8qIHRoZSBqaXR0ZXJidWZmZXIgc2hvdWxkIGJlIHdhaXRpbmcgZm9yIHRoZSB0aW1lb3V0IG9mIGEgImxhcmdlIGdhcCB0aW1lciIKKyAgICogZm9yIGJ1ZmZlciAxIGFuZCAyICovCisgIGdzdF90ZXN0X2Nsb2NrX3dhaXRfZm9yX25leHRfcGVuZGluZ19pZCAodGVzdGNsb2NrLCAmaWQpOworICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0ICgxICogVEVTVF9CVUZfRFVSQVRJT04gKworICAgICAgamJfbGF0ZW5jeV9tcyAqIEdTVF9NU0VDT05ELCBnc3RfY2xvY2tfaWRfZ2V0X3RpbWUgKGlkKSk7CisgIGdzdF9jbG9ja19pZF91bnJlZiAoaWQpOworCisgIC8qIG5vdyBidWZmZXIgMSBzbmVha3MgaW4gYmVmb3JlIHRoZSBsb3N0IGV2ZW50IGZvciBidWZmZXIgMSBhbmQgMiBpcworICAgKiBwcm9jZXNzZWQgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoLAorICAgICAgICAgIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKGxhdGVfYnVmZmVyICogVEVTVF9CVUZfRFVSQVRJT04sCisgICAgICAgICAgICAgIGxhdGVfYnVmZmVyICsgc2VxX29mZnNldCwgbGF0ZV9idWZmZXIgKiBURVNUX1JUUF9UU19EVVJBVElPTikpKTsKKworICAvKiB0aW1lIG91dCBmb3IgbG9zdCBwYWNrZXRzIDEgYW5kIDIgKG9uZSBldmVudCwgZG91YmxlIGR1cmF0aW9uKSAqLworICBmYWlsX3VubGVzcyAoZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpKTsKKyAgdmVyaWZ5X2xvc3RfZXZlbnQgKGgsIDEgKyBzZXFfb2Zmc2V0LCAxICogVEVTVF9CVUZfRFVSQVRJT04sCisgICAgICAyICogVEVTVF9CVUZfRFVSQVRJT04pOworCisgIC8qIHRpbWUgb3V0IGZvciBsb3N0IHBhY2tldHMgMyAqLworICBmYWlsX3VubGVzcyAoZ3N0X2hhcm5lc3NfY3Jhbmtfc2luZ2xlX2Nsb2NrX3dhaXQgKGgpKTsKKyAgdmVyaWZ5X2xvc3RfZXZlbnQgKGgsIDMgKyBzZXFfb2Zmc2V0LCAzICogVEVTVF9CVUZfRFVSQVRJT04sCisgICAgICAxICogVEVTVF9CVUZfRFVSQVRJT04pOworCisgIC8qIGJ1ZmZlciA0IGlzIHB1c2hlZCBhcyBub3JtYWwgKi8KKyAgYnVmZmVyID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKCg0ICsgc2VxX29mZnNldCkgJiAweGZmZmYsIGdldF9ydHBfc2VxX251bSAoYnVmZmVyKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZmZlcik7CisKKyAgLyogd2UgaGF2ZSBsb3N0IDMsIGFuZCBvbmUgb2YgdGhlbSBhcnJpdmVkIGV2ZW50dWFsbHksIGJ1dCB0b28gbGF0ZSAqLworICBmYWlsX3VubGVzcyAodmVyaWZ5X2piX3N0YXRzIChoLT5lbGVtZW50LAorICAgICAgICAgIGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtaml0dGVyYnVmZmVyLXN0YXRzIiwKKyAgICAgICAgICAgICAgIm51bS1wdXNoZWQiLCBHX1RZUEVfVUlOVDY0LCAoZ3VpbnQ2NCkgMiwKKyAgICAgICAgICAgICAgIm51bS1sb3N0IiwgR19UWVBFX1VJTlQ2NCwgKGd1aW50NjQpIDMsCisgICAgICAgICAgICAgICJudW0tbGF0ZSIsIEdfVFlQRV9VSU5UNjQsIChndWludDY0KSAxLCBOVUxMKSkpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHRlc3RjbG9jayk7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wZXJmb3JtYW5jZSkKK3sKKyAgR3N0SGFybmVzcyAqaCA9CisgICAgICBnc3RfaGFybmVzc19uZXdfcGFyc2UKKyAgICAgICgicnRwaml0dGVyYnVmZmVyIGRvLWxvc3Q9MSBkby1yZXRyYW5zbWlzc2lvbj0xIGxhdGVuY3k9MTAwMCIpOworICBHVGltZXIgKnRpbWVyID0gZ190aW1lcl9uZXcgKCk7CisgIGNvbnN0IGdkb3VibGUgdGVzdF9kdXJhdGlvbiA9IDIuMDsKKyAgZ3VpbnQgYnVmZmVyc19wdXNoZWQgPSAwOworICBndWludCBidWZmZXJzX3JlY2VpdmVkOworCisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2FwcyAoaCwgZ2VuZXJhdGVfY2FwcyAoKSk7CisgIGdzdF9oYXJuZXNzX3VzZV9zeXN0ZW1jbG9jayAoaCk7CisKKyAgd2hpbGUgKGdfdGltZXJfZWxhcHNlZCAodGltZXIsIE5VTEwpIDwgdGVzdF9kdXJhdGlvbikgeworICAgIC8qIFNpbXVsYXRlIDFtcyBwYWNrZXRzICovCisgICAgZ3VpbnQgbiA9IGJ1ZmZlcnNfcHVzaGVkICogMjsgICAgICAgLy8gZXZlcnkgcGFja2V0IGFsc28gcHJvZHVjZXMgYSBnYXAKKyAgICBndWludDE2IHNlcW51bSA9IG4gJiAweGZmZmY7CisgICAgZ3VpbnQzMiBydHBfdHMgPSBuICogODsKKyAgICBHc3RDbG9ja1RpbWUgZHRzID0gbiAqIEdTVF9NU0VDT05EOworICAgIGdzdF9oYXJuZXNzX3B1c2ggKGgsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyX2Z1bGwgKGR0cywgc2VxbnVtLCBydHBfdHMpKTsKKyAgICBidWZmZXJzX3B1c2hlZCsrOworICAgIGdfdXNsZWVwIChHX1VTRUNfUEVSX1NFQyAvIDEwMDAwKTsKKyAgfQorICBnX3RpbWVyX2Rlc3Ryb3kgKHRpbWVyKTsKKworICBidWZmZXJzX3JlY2VpdmVkID0gZ3N0X2hhcm5lc3NfYnVmZmVyc19yZWNlaXZlZCAoaCk7CisgIEdTVF9JTkZPICgiUHVzaGVkICVkLCByZWNlaXZlZCAlZCAoJS4xZiUlKSIsIGJ1ZmZlcnNfcHVzaGVkLCBidWZmZXJzX3JlY2VpdmVkLAorICAgICAgMTAwLjAgKiBidWZmZXJzX3JlY2VpdmVkIC8gYnVmZmVyc19wdXNoZWQpOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorcnRwaml0dGVyYnVmZmVyX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInJ0cGppdHRlcmJ1ZmZlciIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wdXNoX2ZvcndhcmRfc2VxKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3B1c2hfYmFja3dhcmRfc2VxKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3B1c2hfdW5vcmRlcmVkKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2Jhc2V0aW1lKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2NsZWFyX3B0X21hcCk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2xvc3RfZXZlbnQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfb25seV9vbmVfbG9zdF9ldmVudF9vbl9sYXJnZV9nYXBzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3R3b19sb3N0X29uZV9hcnJpdmVzX2luX3RpbWUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbGF0ZV9wYWNrZXRzX3N0aWxsX21ha2VzX2xvc3RfZXZlbnRzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2xvc3RfZXZlbnRfdXNlc19wdHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbG9zdF9ldmVudF93aXRoX2JhY2t3YXJkc19ydHB0aW1lKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYWxsX3BhY2tldHNfYXJlX3RpbWVzdGFtcGVkX3plcm8pOworICB0Y2FzZV9hZGRfbG9vcF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9udW1fbGF0ZV93aGVuX2NvbnNpZGVyZWRfbG9zdF9hcnJpdmVzLCAwLAorICAgICAgMik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9yZW9yZGVyX29mX25vbl9lcXVpZGlzdGFudF9wYWNrZXRzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLAorICAgICAgdGVzdF9sb3NzX2VxdWlkaXN0YW50X3NwYWNpbmdfd2l0aF9wYXJhbWV0ZXJfcGFja2V0cyk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3J0eF9leHBlY3RlZF9uZXh0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3J0eF90d29fbWlzc2luZyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHhfYnVmZmVyX2Fycml2ZXNfanVzdF9pbl90aW1lKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3J0eF9idWZmZXJfYXJyaXZlc190b29fbGF0ZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHhfb3JpZ2luYWxfYnVmZmVyX2RvZXNfbm90X3VwZGF0ZV9ydHhfc3RhdHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcnR4X2R1cGxpY2F0ZV9wYWNrZXRfdXBkYXRlc19ydHhfc3RhdHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sCisgICAgICB0ZXN0X3J0eF9idWZmZXJfYXJyaXZlc19hZnRlcl9sb3N0X3VwZGF0ZXNfcnR4X3N0YXRzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3J0eF9ydHRfbGFyZ2VyX3RoYW5fcmV0cnlfdGltZW91dCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHhfbm9fcmVxdWVzdF9pZl90aW1lX3Bhc3RfcmV0cnlfcGVyaW9kKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3J0eF9zYW1lX2RlbGF5X2FuZF9yZXRyeV90aW1lb3V0KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3J0eF93aXRoX2JhY2t3YXJkc19ydHB0aW1lKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3J0eF90aW1lcl9yZXVzZSk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2RlYWRsaW5lX3RzX29mZnNldCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9wdXNoX2JpZ19nYXApOworCisgIHRjYXNlX2FkZF9sb29wX3Rlc3QgKHRjX2NoYWluLAorICAgICAgdGVzdF9jb25zaWRlcmVkX2xvc3RfcGFja2V0X2luX2xhcmdlX2dhcF9hcnJpdmVzLCAwLAorICAgICAgR19OX0VMRU1FTlRTICh0ZXN0X2NvbnNpZGVyZWRfbG9zdF9wYWNrZXRfaW5fbGFyZ2VfZ2FwX2Fycml2ZXNfaW5wdXQpKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGVyZm9ybWFuY2UpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAocnRwaml0dGVyYnVmZmVyKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cG11eC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUwMzg4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cG11eC5jCkBAIC0wLDAgKzEsNTUyIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIHJ0cG11eCBlbGVtZW50cworICoKKyAqIENvcHlyaWdodCAyMDA5IENvbGxhYm9yYSBMdGQuCisgKiAgQGF1dGhvcjogT2xpdmllciBDcmV0ZSA8b2xpdmllci5jcmV0ZUBjb2xsYWJvcmEuY28udWs+CisgKiBDb3B5cmlnaHQgMjAwOSBOb2tpYSBDb3JwLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0aGFybmVzcy5oPgorI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXBwbGljYXRpb24veC1ydHAiKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhcHBsaWNhdGlvbi94LXJ0cCIpKTsKKwordHlwZWRlZiB2b2lkICgqY2hlY2tfY2IpIChHc3RQYWQgKiBwYWQsIGludCBpKTsKKworc3RhdGljIGdib29sZWFuCitxdWVyeV9mdW5jIChHc3RQYWQgKiBwYWQsIEdzdE9iamVjdCAqIG5vcGFyZW50LCBHc3RRdWVyeSAqIHF1ZXJ5KQoreworICBzd2l0Y2ggKEdTVF9RVUVSWV9UWVBFIChxdWVyeSkpIHsKKyAgICBjYXNlIEdTVF9RVUVSWV9DQVBTOgorICAgIHsKKyAgICAgIEdzdENhcHMgKipjYXBzID0gZ19vYmplY3RfZ2V0X2RhdGEgKEdfT0JKRUNUIChwYWQpLCAiY2FwcyIpOworCisgICAgICBmYWlsX3VubGVzcyAoY2FwcyAhPSBOVUxMICYmICpjYXBzICE9IE5VTEwpOworICAgICAgZ3N0X3F1ZXJ5X3NldF9jYXBzX3Jlc3VsdCAocXVlcnksICpjYXBzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9RVUVSWV9BQ0NFUFRfQ0FQUzoKKyAgICAgIGdzdF9xdWVyeV9zZXRfYWNjZXB0X2NhcHNfcmVzdWx0IChxdWVyeSwgVFJVRSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEdzdENhcHMgKgorcmVtb3ZlX3NzcmNfZnJvbV9jYXBzIChHc3RDYXBzICogY2FwcykKK3sKKyAgR3N0Q2FwcyAqY29weSA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworICBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjb3B5LCAwKTsKKyAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKHMsICJzc3JjIik7CisgIHJldHVybiBjb3B5OworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2V2ZW50X2Z1bmMgKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogbm9wYXJlbnQsIEdzdEV2ZW50ICogZXZlbnQpCit7CisgIHN3aXRjaCAoR1NUX0VWRU5UX1RZUEUgKGV2ZW50KSkgeworICAgIGNhc2UgR1NUX0VWRU5UX0NBUFM6CisgICAgeworICAgICAgR3N0Q2FwcyAqY2FwczsKKyAgICAgIEdzdENhcHMgKipjYXBzMiA9IGdfb2JqZWN0X2dldF9kYXRhIChHX09CSkVDVCAocGFkKSwgImNhcHMiKTsKKyAgICAgIEdzdENhcHMgKmNhcHNfbm9fc3NyYzsKKyAgICAgIEdzdENhcHMgKmNhcHMyX25vX3NzcmM7CisKKyAgICAgIGdzdF9ldmVudF9wYXJzZV9jYXBzIChldmVudCwgJmNhcHMpOworICAgICAgY2Fwc19ub19zc3JjID0gcmVtb3ZlX3NzcmNfZnJvbV9jYXBzIChjYXBzKTsKKyAgICAgIGNhcHMyX25vX3NzcmMgPSByZW1vdmVfc3NyY19mcm9tX2NhcHMgKCpjYXBzMik7CisKKyAgICAgIGZhaWxfdW5sZXNzIChjYXBzMiAhPSBOVUxMICYmICpjYXBzMiAhPSBOVUxMKTsKKyAgICAgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19pc19maXhlZCAoY2FwcykpOworICAgICAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2lzX2ZpeGVkICgqY2FwczIpKTsKKworICAgICAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2lzX2VxdWFsX2ZpeGVkIChjYXBzX25vX3NzcmMsIGNhcHMyX25vX3NzcmMpKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChjYXBzX25vX3NzcmMpOworICAgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMyX25vX3NzcmMpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGdzdF9ldmVudF91bnJlZiAoZXZlbnQpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAordGVzdF9iYXNpYyAoY29uc3QgZ2NoYXIgKiBlbGVtX25hbWUsIGNvbnN0IGdjaGFyICogc2luazIsIGludCBjb3VudCwKKyAgICBjaGVja19jYiBjYikKK3sKKyAgR3N0RWxlbWVudCAqcnRwbXV4ID0gTlVMTDsKKyAgR3N0UGFkICpyZXFwYWQxID0gTlVMTDsKKyAgR3N0UGFkICpyZXFwYWQyID0gTlVMTDsKKyAgR3N0UGFkICpzcmMxID0gTlVMTDsKKyAgR3N0UGFkICpzcmMyID0gTlVMTDsKKyAgR3N0UGFkICpzaW5rID0gTlVMTDsKKyAgR3N0QnVmZmVyICppbmJ1ZiA9IE5VTEw7CisgIEdzdENhcHMgKnNyYzFjYXBzID0gTlVMTDsKKyAgR3N0Q2FwcyAqc3JjMmNhcHMgPSBOVUxMOworICBHc3RDYXBzICpzaW5rY2FwcyA9IE5VTEw7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdFNlZ21lbnQgc2VnbWVudDsKKyAgaW50IGk7CisKKyAgcnRwbXV4ID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKGVsZW1fbmFtZSk7CisKKyAgcmVxcGFkMSA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwbXV4LCAic2lua18xIik7CisgIGZhaWxfdW5sZXNzIChyZXFwYWQxICE9IE5VTEwpOworICByZXFwYWQyID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBtdXgsIHNpbmsyKTsKKyAgZmFpbF91bmxlc3MgKHJlcXBhZDIgIT0gTlVMTCk7CisgIHNpbmsgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWRfYnlfbmFtZSAocnRwbXV4LCAmc2lua3RlbXBsYXRlLCAic3JjIik7CisKKyAgc3JjMSA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc3JjdGVtcGxhdGUsICJzcmMiKTsKKyAgc3JjMiA9IGdzdF9wYWRfbmV3X2Zyb21fc3RhdGljX3RlbXBsYXRlICgmc3JjdGVtcGxhdGUsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAoc3JjMSwgcmVxcGFkMSkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAoc3JjMiwgcmVxcGFkMikgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X3BhZF9zZXRfcXVlcnlfZnVuY3Rpb24gKHNyYzEsIHF1ZXJ5X2Z1bmMpOworICBnc3RfcGFkX3NldF9xdWVyeV9mdW5jdGlvbiAoc3JjMiwgcXVlcnlfZnVuYyk7CisgIGdzdF9wYWRfc2V0X3F1ZXJ5X2Z1bmN0aW9uIChzaW5rLCBxdWVyeV9mdW5jKTsKKyAgZ3N0X3BhZF9zZXRfZXZlbnRfZnVuY3Rpb24gKHNpbmssIGV2ZW50X2Z1bmMpOworICBnX29iamVjdF9zZXRfZGF0YSAoR19PQkpFQ1QgKHNyYzEpLCAiY2FwcyIsICZzcmMxY2Fwcyk7CisgIGdfb2JqZWN0X3NldF9kYXRhIChHX09CSkVDVCAoc3JjMiksICJjYXBzIiwgJnNyYzJjYXBzKTsKKyAgZ19vYmplY3Rfc2V0X2RhdGEgKEdfT0JKRUNUIChzaW5rKSwgImNhcHMiLCAmc2lua2NhcHMpOworCisgIHNyYzFjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtcnRwIiwKKyAgICAgICJjbG9jay1yYXRlIiwgR19UWVBFX0lOVCwgMSwgInNzcmMiLCBHX1RZUEVfVUlOVCwgMTEsIE5VTEwpOworICBzcmMyY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXJ0cCIsCisgICAgICAiY2xvY2stcmF0ZSIsIEdfVFlQRV9JTlQsIDIsICJzc3JjIiwgR19UWVBFX1VJTlQsIDEyLCBOVUxMKTsKKyAgc2lua2NhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXBwbGljYXRpb24veC1ydHAiLAorICAgICAgImNsb2NrLXJhdGUiLCBHX1RZUEVfSU5ULCAzLCAic3NyYyIsIEdfVFlQRV9VSU5ULCAxMywgTlVMTCk7CisKKyAgY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChzcmMxLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2lzX2VtcHR5IChjYXBzKSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBnc3RfY2Fwc19zZXRfc2ltcGxlIChzcmMyY2FwcywgImNsb2NrLXJhdGUiLCBHX1RZUEVfSU5ULCAzLCBOVUxMKTsKKyAgY2FwcyA9IGdzdF9wYWRfcGVlcl9xdWVyeV9jYXBzIChzcmMxLCBOVUxMKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGdfb2JqZWN0X3NldCAocnRwbXV4LCAic2VxbnVtLW9mZnNldCIsIDEwMCwgInRpbWVzdGFtcC1vZmZzZXQiLCAxMDAwLAorICAgICAgInNzcmMiLCA1NSwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocnRwbXV4LAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNpbmssIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNyYzEsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNyYzIsIFRSVUUpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKHNyYzEsCisgICAgICAgICAgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJzdHJlYW0xIikpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjMiwKKyAgICAgICAgICBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoInN0cmVhbTIiKSkpOworCisgIGdzdF9jYXBzX3NldF9zaW1wbGUgKHNpbmtjYXBzLAorICAgICAgInBheWxvYWQiLCBHX1RZUEVfSU5ULCA5OCwgInNlcW51bS1vZmZzZXQiLCBHX1RZUEVfVUlOVCwgMTAwLAorICAgICAgInRpbWVzdGFtcC1vZmZzZXQiLCBHX1RZUEVfVUlOVCwgMTAwMCwgInNzcmMiLCBHX1RZUEVfVUlOVCwgNjYsIE5VTEwpOworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoImFwcGxpY2F0aW9uL3gtcnRwIiwKKyAgICAgICJwYXlsb2FkIiwgR19UWVBFX0lOVCwgOTgsICJjbG9jay1yYXRlIiwgR19UWVBFX0lOVCwgMywKKyAgICAgICJzZXFudW0tb2Zmc2V0IiwgR19UWVBFX1VJTlQsIDU2LCAidGltZXN0YW1wLW9mZnNldCIsIEdfVFlQRV9VSU5ULCA1NywKKyAgICAgICJzc3JjIiwgR19UWVBFX1VJTlQsIDY2LCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfc2V0X2NhcHMgKHNyYzEsIGNhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGNhcHMgPSBnc3RfcGFkX3BlZXJfcXVlcnlfY2FwcyAoc2luaywgTlVMTCk7CisgIGZhaWxfaWYgKGdzdF9jYXBzX2lzX2VtcHR5IChjYXBzKSk7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIHNlZ21lbnQuc3RhcnQgPSAxMDAwMDA7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKHNyYzEsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKSk7CisgIHNlZ21lbnQuc3RhcnQgPSAwOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmMyLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBHc3RSVFBCdWZmZXIgcnRwYnVmZmVyID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKworICAgIGluYnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlICgxMCwgMCwgMCk7CisgICAgR1NUX0JVRkZFUl9QVFMgKGluYnVmKSA9IGkgKiAxMDAwICsgMTAwMDAwOworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGluYnVmKSA9IDEwMDA7CisKKyAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGluYnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwYnVmZmVyKTsKKworICAgIGdzdF9ydHBfYnVmZmVyX3NldF92ZXJzaW9uICgmcnRwYnVmZmVyLCAyKTsKKyAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfcGF5bG9hZF90eXBlICgmcnRwYnVmZmVyLCA5OCk7CisgICAgZ3N0X3J0cF9idWZmZXJfc2V0X3NzcmMgKCZydHBidWZmZXIsIDQ0KTsKKyAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfdGltZXN0YW1wICgmcnRwYnVmZmVyLCAyMDAgKyBpKTsKKyAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfc2VxICgmcnRwYnVmZmVyLCAyMDAwICsgaSk7CisgICAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHBidWZmZXIpOworICAgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKHNyYzEsIGluYnVmKSA9PSBHU1RfRkxPV19PSyk7CisKKyAgICBpZiAoYnVmZmVycykKKyAgICAgIGZhaWxfdW5sZXNzIChHU1RfQlVGRkVSX1BUUyAoYnVmZmVycy0+ZGF0YSkgPT0gaSAqIDEwMDAsICIlbGxkIiwKKyAgICAgICAgICBHU1RfQlVGRkVSX1BUUyAoYnVmZmVycy0+ZGF0YSkpOworCisgICAgY2IgKHNyYzIsIGkpOworCisgICAgZ19saXN0X2ZvcmVhY2ggKGJ1ZmZlcnMsIChHRnVuYykgZ3N0X2J1ZmZlcl91bnJlZiwgTlVMTCk7CisgICAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICAgIGJ1ZmZlcnMgPSBOVUxMOworICB9CisKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNpbmssIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChzcmMxLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc3JjMiwgRkFMU0UpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChydHBtdXgsCisgICAgICAgICAgR1NUX1NUQVRFX05VTEwpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisgIGdzdF9jaGVja190ZWFyZG93bl9wYWRfYnlfbmFtZSAocnRwbXV4LCAic3JjIik7CisgIGdzdF9vYmplY3RfdW5yZWYgKHJlcXBhZDEpOworICBnc3Rfb2JqZWN0X3VucmVmIChyZXFwYWQyKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3BhZF9ieV9uYW1lIChydHBtdXgsICJzaW5rXzEiKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3BhZF9ieV9uYW1lIChydHBtdXgsIHNpbmsyKTsKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAocnRwbXV4LCByZXFwYWQxKTsKKyAgZ3N0X2VsZW1lbnRfcmVsZWFzZV9yZXF1ZXN0X3BhZCAocnRwbXV4LCByZXFwYWQyKTsKKworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzcmMxY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzcmMyY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3JlcGxhY2UgKCZzaW5rY2FwcywgTlVMTCk7CisKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKHJ0cG11eCk7Cit9CisKK3N0YXRpYyB2b2lkCitiYXNpY19jaGVja19jYiAoR3N0UGFkICogcGFkLCBpbnQgaSkKK3sKKyAgR3N0UlRQQnVmZmVyIHJ0cGJ1ZmZlciA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisgIGZhaWxfdW5sZXNzIChidWZmZXJzICYmIGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpID09IDEpOworCisgIGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmZmVycy0+ZGF0YSwgR1NUX01BUF9SRUFELCAmcnRwYnVmZmVyKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoNjYsIGdzdF9ydHBfYnVmZmVyX2dldF9zc3JjICgmcnRwYnVmZmVyKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQ2NCAoMjAwIC0gNTcgKyAxMDAwICsgaSwKKyAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF90aW1lc3RhbXAgKCZydHBidWZmZXIpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMTAwICsgMSArIGksIGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKCZydHBidWZmZXIpKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHBidWZmZXIpOworfQorCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3J0cG11eF9iYXNpYykKK3sKKyAgdGVzdF9iYXNpYyAoInJ0cG11eCIsICJzaW5rXzIiLCAxMCwgYmFzaWNfY2hlY2tfY2IpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3J0cGR0bWZtdXhfYmFzaWMpCit7CisgIHRlc3RfYmFzaWMgKCJydHBkdG1mbXV4IiwgInNpbmtfMiIsIDEwLCBiYXNpY19jaGVja19jYik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIHZvaWQKK2xvY2tfY2hlY2tfY2IgKEdzdFBhZCAqIHBhZCwgaW50IGkpCit7CisgIEdzdEJ1ZmZlciAqaW5idWY7CisKKyAgaWYgKGkgJSAyKSB7CisgICAgZmFpbF91bmxlc3MgKGJ1ZmZlcnMgPT0gTlVMTCk7CisgIH0gZWxzZSB7CisgICAgR3N0UlRQQnVmZmVyIHJ0cGJ1ZmZlciA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisKKyAgICBmYWlsX3VubGVzcyAoYnVmZmVycyAmJiBnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA9PSAxKTsKKyAgICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGJ1ZmZlcnMtPmRhdGEsIEdTVF9NQVBfUkVBRCwgJnJ0cGJ1ZmZlcik7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoNjYsIGdzdF9ydHBfYnVmZmVyX2dldF9zc3JjICgmcnRwYnVmZmVyKSk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludDY0ICgyMDAgLSA1NyArIDEwMDAgKyBpLAorICAgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wICgmcnRwYnVmZmVyKSk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMTAwICsgMSArIGksIGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKCZydHBidWZmZXIpKTsKKyAgICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cGJ1ZmZlcik7CisKKyAgICBpbmJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAoMTAsIDAsIDApOworICAgIEdTVF9CVUZGRVJfUFRTIChpbmJ1ZikgPSBpICogMTAwMCArIDUwMDsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChpbmJ1ZikgPSAxMDAwOworICAgIGdzdF9ydHBfYnVmZmVyX21hcCAoaW5idWYsIEdTVF9NQVBfV1JJVEUsICZydHBidWZmZXIpOworICAgIGdzdF9ydHBfYnVmZmVyX3NldF92ZXJzaW9uICgmcnRwYnVmZmVyLCAyKTsKKyAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfcGF5bG9hZF90eXBlICgmcnRwYnVmZmVyLCA5OCk7CisgICAgZ3N0X3J0cF9idWZmZXJfc2V0X3NzcmMgKCZydHBidWZmZXIsIDQ0KTsKKyAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfdGltZXN0YW1wICgmcnRwYnVmZmVyLCAyMDAgKyBpKTsKKyAgICBnc3RfcnRwX2J1ZmZlcl9zZXRfc2VxICgmcnRwYnVmZmVyLCAyMDAwICsgaSk7CisgICAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHBidWZmZXIpOworICAgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKHBhZCwgaW5idWYpID09IEdTVF9GTE9XX09LKTsKKworCisgICAgZ19saXN0X2ZvcmVhY2ggKGJ1ZmZlcnMsIChHRnVuYykgZ3N0X2J1ZmZlcl91bnJlZiwgTlVMTCk7CisgICAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICAgIGJ1ZmZlcnMgPSBOVUxMOworICB9Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3J0cGR0bWZtdXhfbG9jaykKK3sKKyAgdGVzdF9iYXNpYyAoInJ0cGR0bWZtdXgiLCAicHJpb3JpdHlfc2lua18yIiwgMTAsIGxvY2tfY2hlY2tfY2IpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ2VuZXJhdGVfdGVzdF9idWZmZXIgKGd1aW50IHNlcV9udW0sIGd1aW50IHNzcmMpCit7CisgIEdzdEJ1ZmZlciAqYnVmOworICBndWludDggKnBheWxvYWQ7CisgIGd1aW50IGk7CisgIEdzdFJUUEJ1ZmZlciBydHAgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworICBnc2l6ZSBzaXplID0gMTA7CisKKyAgYnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChzaXplLCAwLCAwKTsKKyAgR1NUX0JVRkZFUl9EVFMgKGJ1ZikgPSBHU1RfTVNFQ09ORCAqIDIwICogc2VxX251bTsKKyAgR1NUX0JVRkZFUl9QVFMgKGJ1ZikgPSBHU1RfTVNFQ09ORCAqIDIwICogc2VxX251bTsKKworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGJ1ZiwgR1NUX01BUF9SRUFEV1JJVEUsICZydHApOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfcGF5bG9hZF90eXBlICgmcnRwLCAwKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3NlcSAoJnJ0cCwgc2VxX251bSk7CisgIGdzdF9ydHBfYnVmZmVyX3NldF90aW1lc3RhbXAgKCZydHAsIDE2MCAqIHNlcV9udW0pOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfc3NyYyAoJnJ0cCwgc3NyYyk7CisKKyAgcGF5bG9hZCA9IGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkICgmcnRwKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICBwYXlsb2FkW2ldID0gMHhmZjsKKworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGd1aW50MzIKK19ydHBfYnVmZmVyX2dldF9zc3JjIChHc3RCdWZmZXIgKiBidWYpCit7CisgIEdzdFJUUEJ1ZmZlciBydHAgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworICBndWludDMyIHJldDsKKyAgZ19hc3NlcnQgKGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQUQsICZydHApKTsKKyAgcmV0ID0gZ3N0X3J0cF9idWZmZXJfZ2V0X3NzcmMgKCZydHApOworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cCk7CisgIHJldHVybiByZXQ7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3J0cG11eF9zc3JjX3Byb3BlcnR5KQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfcGFkbmFtZXMgKCJydHBtdXgiLCBOVUxMLCAic3JjIik7CisgIEdzdEhhcm5lc3MgKmgwID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfZWxlbWVudCAoaC0+ZWxlbWVudCwgInNpbmtfMCIsIE5VTEwpOworICBHc3RIYXJuZXNzICpoMSA9IGdzdF9oYXJuZXNzX25ld193aXRoX2VsZW1lbnQgKGgtPmVsZW1lbnQsICJzaW5rXzEiLCBOVUxMKTsKKyAgR3N0QnVmZmVyICpidWYwOworICBHc3RCdWZmZXIgKmJ1ZjE7CisKKyAgLyogc2V0IHNzcmMgdG8gMTExMTExICovCisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwgInNzcmMiLCAxMTExMTEsIE5VTEwpOworCisgIC8qIGJvdGggc2lua3BhZHMgaGF2ZSB0aGVpciBvd24gaWRlYSBvZiB3aGF0IHRoZSBzc3JjIHNob3VsZCBiZSAqLworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChoMCwgImFwcGxpY2F0aW9uL3gtcnRwLCBzc3JjPSh1aW50KTIyMjIyMiIpOworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChoMSwgImFwcGxpY2F0aW9uL3gtcnRwLCBzc3JjPSh1aW50KTMzMzMzMyIpOworCisgIC8qIHB1c2ggb24gYm90aCBzaW5rcGFkcyB3aXRoIGRpZmZlcmVudCBzc3JjICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaDAsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyICgwLCAyMjIyMjIpKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaDEsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyICgwLCAzMzMzMzMpKSk7CisKKyAgYnVmMCA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBidWYxID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisKKyAgLyogd2UgZXhwZWN0IHRoZSBzc3JjIHRvIGJlIHdoYXQgd2Ugc3BlY2lmaWVkIGluIHRoZSBwcm9wZXJ0eSAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgxMTExMTEsIF9ydHBfYnVmZmVyX2dldF9zc3JjIChidWYwKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDExMTExMSwgX3J0cF9idWZmZXJfZ2V0X3NzcmMgKGJ1ZjEpKTsKKworICBnc3RfYnVmZmVyX3VucmVmIChidWYwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmMSk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgwKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgxKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3J0cG11eF9zc3JjX3Byb3BlcnR5X25vdF9zZXQpCit7CisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXdfd2l0aF9wYWRuYW1lcyAoInJ0cG11eCIsIE5VTEwsICJzcmMiKTsKKyAgR3N0SGFybmVzcyAqaDAgPSBnc3RfaGFybmVzc19uZXdfd2l0aF9lbGVtZW50IChoLT5lbGVtZW50LCAic2lua18wIiwgTlVMTCk7CisgIEdzdEhhcm5lc3MgKmgxID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfZWxlbWVudCAoaC0+ZWxlbWVudCwgInNpbmtfMSIsIE5VTEwpOworICBHc3RCdWZmZXIgKmJ1ZjA7CisgIEdzdEJ1ZmZlciAqYnVmMTsKKworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChoMCwgImFwcGxpY2F0aW9uL3gtcnRwLCBzc3JjPSh1aW50KTIyMjIyMiIpOworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChoMSwgImFwcGxpY2F0aW9uL3gtcnRwLCBzc3JjPSh1aW50KTMzMzMzMyIpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaDAsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyICgwLCAyMjIyMjIpKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaDEsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyICgwLCAzMzMzMzMpKSk7CisKKyAgYnVmMCA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBidWYxID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisKKyAgLyogd2UgZXhwZWN0IHRoZSBzc3JjIHRvIGJlIHRoZSBmaXJzdCBzc3JjIHRoYXQgY2FtZSBpbiAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgyMjIyMjIsIF9ydHBfYnVmZmVyX2dldF9zc3JjIChidWYwKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDIyMjIyMiwgX3J0cF9idWZmZXJfZ2V0X3NzcmMgKGJ1ZjEpKTsKKworICBnc3RfYnVmZmVyX3VucmVmIChidWYwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmMSk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgwKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgxKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3J0cG11eF9zc3JjX2Rvd25zdHJlYW1fY2FuX292ZXJydWxlKQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfcGFkbmFtZXMgKCJydHBtdXgiLCBOVUxMLCAic3JjIik7CisgIEdzdEhhcm5lc3MgKmgwID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfZWxlbWVudCAoaC0+ZWxlbWVudCwgInNpbmtfMCIsIE5VTEwpOworICBHc3RIYXJuZXNzICpoMSA9IGdzdF9oYXJuZXNzX25ld193aXRoX2VsZW1lbnQgKGgtPmVsZW1lbnQsICJzaW5rXzEiLCBOVUxMKTsKKyAgR3N0QnVmZmVyICpidWYwOworICBHc3RCdWZmZXIgKmJ1ZjE7CisKKyAgLyogZG93bnN0cmVhbSBpcyBzcGVjaWZ5aW5nIDQ0NDQ0NCBhcyBzc3JjICovCisgIGdzdF9oYXJuZXNzX3NldF9zaW5rX2NhcHNfc3RyIChoLCAiYXBwbGljYXRpb24veC1ydHAsIHNzcmM9KHVpbnQpNDQ0NDQ0Iik7CisKKyAgLyogcnRwbXV4IHNzcmMgaXMgc2V0IHRvIDExMTExMSAqLworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsICJzc3JjIiwgMTExMTExLCBOVUxMKTsKKworICAvKiB3aGlsZSB1cHN0cmVhbSBzc3JjIGlzIDIyMjIyMiBhbmQgMzMzMzMzICovCisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgwLCAiYXBwbGljYXRpb24veC1ydHAsIHNzcmM9KHVpbnQpMjIyMjIyIik7CisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgxLCAiYXBwbGljYXRpb24veC1ydHAsIHNzcmM9KHVpbnQpMzMzMzMzIik7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoMCwgZ2VuZXJhdGVfdGVzdF9idWZmZXIgKDAsIDIyMjIyMikpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoMSwgZ2VuZXJhdGVfdGVzdF9idWZmZXIgKDAsIDMzMzMzMykpKTsKKworICBidWYwID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGJ1ZjEgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKworICAvKiB3ZSBleHBlY3QgdGhlIHNzcmMgdG8gYmUgZG93bnN0cmVhbSBzc3JjICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDQ0NDQ0NCwgX3J0cF9idWZmZXJfZ2V0X3NzcmMgKGJ1ZjApKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoNDQ0NDQ0LCBfcnRwX2J1ZmZlcl9nZXRfc3NyYyAoYnVmMSkpOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZjApOworICBnc3RfYnVmZmVyX3VucmVmIChidWYxKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaDApOworICBnc3RfaGFybmVzc190ZWFyZG93biAoaDEpOworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnRwbXV4X3NzcmNfZG93bnN0cmVhbV9keW5hbWljKQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3X3BhcnNlICgicnRwbXV4ICEgY2Fwc2ZpbHRlciIpOworICBHc3RFbGVtZW50ICpydHBtdXggPSBnc3RfaGFybmVzc19maW5kX2VsZW1lbnQgKGgsICJydHBtdXgiKTsKKyAgR3N0RWxlbWVudCAqY2Fwc2ZpbHRlciA9IGdzdF9oYXJuZXNzX2ZpbmRfZWxlbWVudCAoaCwgImNhcHNmaWx0ZXIiKTsKKworICBHc3RIYXJuZXNzICpoMCA9IGdzdF9oYXJuZXNzX25ld193aXRoX2VsZW1lbnQgKHJ0cG11eCwgInNpbmtfMCIsIE5VTEwpOworICBHc3RIYXJuZXNzICpoMSA9IGdzdF9oYXJuZXNzX25ld193aXRoX2VsZW1lbnQgKHJ0cG11eCwgInNpbmtfMSIsIE5VTEwpOworICBHc3RDYXBzICpjYXBzOworICBHc3RCdWZmZXIgKmJ1ZjA7CisgIEdzdEJ1ZmZlciAqYnVmMTsKKworICBnc3RfaGFybmVzc19wbGF5IChoKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKCJhcHBsaWNhdGlvbi94LXJ0cCwgc3NyYz0odWludCk0NDQ0NDQiKTsKKyAgZ19vYmplY3Rfc2V0IChjYXBzZmlsdGVyLCAiY2FwcyIsIGNhcHMsIE5VTEwpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgLyogd2hpbGUgdXBzdHJlYW0gc3NyYyBpcyAyMjIyMjIgYW5kIDMzMzMzMyAqLworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChoMCwgImFwcGxpY2F0aW9uL3gtcnRwLCBzc3JjPSh1aW50KTIyMjIyMiIpOworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChoMSwgImFwcGxpY2F0aW9uL3gtcnRwLCBzc3JjPSh1aW50KTMzMzMzMyIpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaDAsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyICgwLCAyMjIyMjIpKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLAorICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaDEsIGdlbmVyYXRlX3Rlc3RfYnVmZmVyICgwLCAzMzMzMzMpKSk7CisKKyAgLyogd2UgZXhwZWN0IHRoZSBzc3JjIHRvIGJlIGRvd25zdHJlYW0gc3NyYyAoNDQ0NDQ0KSAqLworICBidWYwID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGJ1ZjEgPSBnc3RfaGFybmVzc19wdWxsIChoKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoNDQ0NDQ0LCBfcnRwX2J1ZmZlcl9nZXRfc3NyYyAoYnVmMCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICg0NDQ0NDQsIF9ydHBfYnVmZmVyX2dldF9zc3JjIChidWYxKSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1ZjApOworICBnc3RfYnVmZmVyX3VucmVmIChidWYxKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKCJhcHBsaWNhdGlvbi94LXJ0cCwgc3NyYz0odWludCk1NTU1NTUiKTsKKyAgZ19vYmplY3Rfc2V0IChjYXBzZmlsdGVyLCAiY2FwcyIsIGNhcHMsIE5VTEwpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoMCwgZ2VuZXJhdGVfdGVzdF9idWZmZXIgKDAsIDIyMjIyMikpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19wdXNoIChoMSwgZ2VuZXJhdGVfdGVzdF9idWZmZXIgKDAsIDMzMzMzMykpKTsKKworICAvKiB3ZSBleHBlY3QgdGhlIHNzcmMgdG8gYmUgdGhlIG5ldyBkb3duc3RyZWFtIHNzcmMgKDU1NTU1NSkgKi8KKyAgYnVmMCA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworICBidWYxID0gZ3N0X2hhcm5lc3NfcHVsbCAoaCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDU1NTU1NSwgX3J0cF9idWZmZXJfZ2V0X3NzcmMgKGJ1ZjApKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoNTU1NTU1LCBfcnRwX2J1ZmZlcl9nZXRfc3NyYyAoYnVmMSkpOworICBnc3RfYnVmZmVyX3VucmVmIChidWYwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmMSk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocnRwbXV4KTsKKyAgZ3N0X29iamVjdF91bnJlZiAoY2Fwc2ZpbHRlcik7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoMCk7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoMSk7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorcnRwbXV4X3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInJ0cG11eCIpOworICBUQ2FzZSAqdGNfY2hhaW47CisKKyAgdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJydHBtdXhfYmFzaWMiKTsKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHBtdXhfYmFzaWMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcnRwbXV4X3NzcmNfcHJvcGVydHkpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcnRwbXV4X3NzcmNfcHJvcGVydHlfbm90X3NldCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHBtdXhfc3NyY19kb3duc3RyZWFtX2Nhbl9vdmVycnVsZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHBtdXhfc3NyY19kb3duc3RyZWFtX2R5bmFtaWMpOworCisgIHRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgicnRwZHRtZm11eF9iYXNpYyIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcnRwZHRtZm11eF9iYXNpYyk7CisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworCisgIHRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgicnRwZHRtZm11eF9sb2NrIik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHBkdG1mbXV4X2xvY2spOworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHJ0cG11eCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwcnR4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVkNDFjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHJ0eC5jCkBAIC0wLDAgKzEsNjc2IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ29sbGFib3JhIEx0ZC4KKyAqICAgQGF1dGhvciBKdWxpZW4gSXNvcmNlIDxqdWxpZW4uaXNvcmNlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RoYXJuZXNzLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydHBidWZmZXIuaD4KKworI2RlZmluZSB2ZXJpZnlfYnVmKGJ1ZiwgaXNfcnR4LCBleHBlY3RlZF9zc3JjLCBleHB0ZWRfcHQsIGV4cGVjdGVkX3NlcW51bSkgICAgICAgXAorICBHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdzdFJUUEJ1ZmZlciBfcnRwID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZhaWxfdW5sZXNzIChnc3RfcnRwX2J1ZmZlcl9tYXAgKGJ1ZiwgR1NUX01BUF9SRUFELCAmX3J0cCkpOyAgICAgICAgICAgICAgICAgXAorICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9ydHBfYnVmZmVyX2dldF9zc3JjICgmX3J0cCksIGV4cGVjdGVkX3NzcmMpOyAgICAgXAorICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX3R5cGUgKCZfcnRwKSwgZXhwdGVkX3B0KTsgXAorICAgIGlmICghKGlzX3J0eCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAoJl9ydHApLCBleHBlY3RlZF9zZXFudW0pOyAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX1JFQURfVUlOVDE2X0JFIChnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAgICAgXAorICAgICAgICAgICAgICAoJl9ydHApKSwgZXhwZWN0ZWRfc2VxbnVtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmX3J0cCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IEdfU1RNVF9FTkQKKworI2RlZmluZSBwdWxsX2FuZF92ZXJpZnkoaCwgaXNfcnR4LCBleHBlY3RlZF9zc3JjLCBleHB0ZWRfcHQsIGV4cGVjdGVkX3NlcW51bSkgXAorICBHX1NUTVRfU1RBUlQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdzdEJ1ZmZlciAqX2J1ZiA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZlcmlmeV9idWYgKF9idWYsIGlzX3J0eCwgZXhwZWN0ZWRfc3NyYywgZXhwdGVkX3B0LCBleHBlY3RlZF9zZXFudW0pOyAgICAgXAorICAgIGdzdF9idWZmZXJfdW5yZWYgKF9idWYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IEdfU1RNVF9FTkQKKworI2RlZmluZSBwdXNoX3B1bGxfYW5kX3ZlcmlmeShoLCBidWYsIGlzX3J0eCwgZXhwZWN0ZWRfc3NyYywgZXhwdGVkX3B0LCBleHBlY3RlZF9zZXFudW0pIFwKKyAgR19TVE1UX1NUQVJUIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgYnVmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHB1bGxfYW5kX3ZlcmlmeSAoaCwgaXNfcnR4LCBleHBlY3RlZF9zc3JjLCBleHB0ZWRfcHQsIGV4cGVjdGVkX3NlcW51bSk7ICAgICAgICAgICAgIFwKKyAgfSBHX1NUTVRfRU5ECisKK3N0YXRpYyBHc3RFdmVudCAqCitjcmVhdGVfcnR4X2V2ZW50IChndWludDMyIHNzcmMsIGd1aW50OCBwYXlsb2FkX3R5cGUsIGd1aW50MTYgc2VxbnVtKQoreworICByZXR1cm4gZ3N0X2V2ZW50X25ld19jdXN0b20gKEdTVF9FVkVOVF9DVVNUT01fVVBTVFJFQU0sCisgICAgICBnc3Rfc3RydWN0dXJlX25ldyAoIkdzdFJUUFJldHJhbnNtaXNzaW9uUmVxdWVzdCIsCisgICAgICAgICAgInNlcW51bSIsIEdfVFlQRV9VSU5ULCBzZXFudW0sCisgICAgICAgICAgInNzcmMiLCBHX1RZUEVfVUlOVCwgc3NyYywKKyAgICAgICAgICAicGF5bG9hZC10eXBlIiwgR19UWVBFX1VJTlQsIHBheWxvYWRfdHlwZSwgTlVMTCkpOworfQorCitzdGF0aWMgdm9pZAorY29tcGFyZV9ydHBfcGFja2V0cyAoR3N0QnVmZmVyICogYSwgR3N0QnVmZmVyICogYikKK3sKKyAgR3N0UlRQQnVmZmVyIHJ0cF9hID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKyAgR3N0UlRQQnVmZmVyIHJ0cF9iID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGEsIEdTVF9NQVBfUkVBRCwgJnJ0cF9hKTsKKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChiLCBHU1RfTUFQX1JFQUQsICZydHBfYik7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3J0cF9idWZmZXJfZ2V0X2hlYWRlcl9sZW4gKCZydHBfYSksCisgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfaGVhZGVyX2xlbiAoJnJ0cF9iKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9ydHBfYnVmZmVyX2dldF92ZXJzaW9uICgmcnRwX2EpLAorICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X3ZlcnNpb24gKCZydHBfYikpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcnRwX2J1ZmZlcl9nZXRfc3NyYyAoJnJ0cF9hKSwKKyAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF9zc3JjICgmcnRwX2IpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3J0cF9idWZmZXJfZ2V0X3NlcSAoJnJ0cF9hKSwKKyAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF9zZXEgKCZydHBfYikpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcnRwX2J1ZmZlcl9nZXRfY3NyY19jb3VudCAoJnJ0cF9hKSwKKyAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF9jc3JjX2NvdW50ICgmcnRwX2IpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3J0cF9idWZmZXJfZ2V0X21hcmtlciAoJnJ0cF9hKSwKKyAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF9tYXJrZXIgKCZydHBfYikpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZF90eXBlICgmcnRwX2EpLAorICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfdHlwZSAoJnJ0cF9iKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9ydHBfYnVmZmVyX2dldF90aW1lc3RhbXAgKCZydHBfYSksCisgICAgICBnc3RfcnRwX2J1ZmZlcl9nZXRfdGltZXN0YW1wICgmcnRwX2IpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3J0cF9idWZmZXJfZ2V0X2V4dGVuc2lvbiAoJnJ0cF9hKSwKKyAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF9leHRlbnNpb24gKCZydHBfYikpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAoJnJ0cF9hKSwKKyAgICAgIGdzdF9ydHBfYnVmZmVyX2dldF9wYXlsb2FkX2xlbiAoJnJ0cF9iKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG1lbWNtcCAoZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHBfYSksCisgICAgICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHBfYiksCisgICAgICAgICAgZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWRfbGVuICgmcnRwX2EpKSwgMCk7CisKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHBfYSk7CisgIGdzdF9ydHBfYnVmZmVyX3VubWFwICgmcnRwX2IpOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2NyZWF0ZV9ydHBfYnVmZmVyIChndWludDMyIHNzcmMsIGd1aW50OCBwYXlsb2FkX3R5cGUsIGd1aW50MTYgc2VxbnVtKQoreworICBHc3RSVFBCdWZmZXIgcnRwYnVmID0gR1NUX1JUUF9CVUZGRVJfSU5JVDsKKyAgZ3VpbnQgcGF5bG9hZF9zaXplID0gMjk7CisgIGd1aW50NjQgdGltZXN0YW1wID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlX2ludCAoc2VxbnVtLCA5MDAwMCwgMzApOworICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9ydHBfYnVmZmVyX25ld19hbGxvY2F0ZSAocGF5bG9hZF9zaXplLCAwLCAwKTsKKworICBnc3RfcnRwX2J1ZmZlcl9tYXAgKGJ1ZiwgR1NUX01BUF9XUklURSwgJnJ0cGJ1Zik7CisgIGdzdF9ydHBfYnVmZmVyX3NldF9zc3JjICgmcnRwYnVmLCBzc3JjKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3BheWxvYWRfdHlwZSAoJnJ0cGJ1ZiwgcGF5bG9hZF90eXBlKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3NlcSAoJnJ0cGJ1Ziwgc2VxbnVtKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3RpbWVzdGFtcCAoJnJ0cGJ1ZiwgKGd1aW50MzIpIHRpbWVzdGFtcCk7CisgIG1lbXNldCAoZ3N0X3J0cF9idWZmZXJfZ2V0X3BheWxvYWQgKCZydHBidWYpLCAweDI5LCBwYXlsb2FkX3NpemUpOworICBnc3RfcnRwX2J1ZmZlcl91bm1hcCAoJnJ0cGJ1Zik7CisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorY3JlYXRlX3J0cF9idWZmZXJfd2l0aF90aW1lc3RhbXAgKGd1aW50MzIgc3NyYywgZ3VpbnQ4IHBheWxvYWRfdHlwZSwKKyAgICBndWludDE2IHNlcW51bSwgZ3VpbnQzMiB0aW1lc3RhbXApCit7CisgIEdzdFJUUEJ1ZmZlciBydHBidWYgPSBHU1RfUlRQX0JVRkZFUl9JTklUOworICBHc3RCdWZmZXIgKmJ1ZiA9IGNyZWF0ZV9ydHBfYnVmZmVyIChzc3JjLCBwYXlsb2FkX3R5cGUsIHNlcW51bSk7CisgIGdzdF9ydHBfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1dSSVRFLCAmcnRwYnVmKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3RpbWVzdGFtcCAoJnJ0cGJ1ZiwgdGltZXN0YW1wKTsKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHBidWYpOworICByZXR1cm4gYnVmOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHhzZW5kX3J0eHJlY2VpdmUpCit7CisgIGNvbnN0IGd1aW50IHBhY2tldHNfbnVtID0gNTsKKyAgZ3VpbnQgbWFzdGVyX3NzcmMgPSAxMjM0NTY3OworICBndWludCBtYXN0ZXJfcHQgPSA5NjsKKyAgZ3VpbnQgcnR4X3B0ID0gOTk7CisgIEdzdFN0cnVjdHVyZSAqcHRfbWFwOworICBHc3RCdWZmZXIgKmluYnVmc1s1XTsKKyAgR3N0SGFybmVzcyAqaHJlY3YgPSBnc3RfaGFybmVzc19uZXcgKCJydHBydHhyZWNlaXZlIik7CisgIEdzdEhhcm5lc3MgKmhzZW5kID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwcnR4c2VuZCIpOworICBnaW50IGk7CisKKyAgcHRfbWFwID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1wdC1tYXAiLAorICAgICAgIjk2IiwgR19UWVBFX1VJTlQsIHJ0eF9wdCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoaHJlY3YtPmVsZW1lbnQsICJwYXlsb2FkLXR5cGUtbWFwIiwgcHRfbWFwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChoc2VuZC0+ZWxlbWVudCwgInBheWxvYWQtdHlwZS1tYXAiLCBwdF9tYXAsIE5VTEwpOworCisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGhzZW5kLCAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICJtZWRpYSA9IChzdHJpbmcpdmlkZW8sIHBheWxvYWQgPSAoaW50KTk2LCAiCisgICAgICAic3NyYyA9ICh1aW50KTEyMzQ1NjcsIGNsb2NrLXJhdGUgPSAoaW50KTkwMDAwLCAiCisgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpUkFXIik7CisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGhyZWN2LCAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICJtZWRpYSA9IChzdHJpbmcpdmlkZW8sIHBheWxvYWQgPSAoaW50KTk2LCAiCisgICAgICAic3NyYyA9ICh1aW50KTEyMzQ1NjcsIGNsb2NrLXJhdGUgPSAoaW50KTkwMDAwLCAiCisgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpUkFXIik7CisKKyAgLyogUHVzaCAncGFja2V0c19udW0nIHBhY2tldHMgdGhyb3VnaCBydHhzZW5kIHRvIHJ0eHJlY2VpdmUgKi8KKyAgZm9yIChpID0gMDsgaSA8IHBhY2tldHNfbnVtOyArK2kpIHsKKyAgICBpbmJ1ZnNbaV0gPSBjcmVhdGVfcnRwX2J1ZmZlciAobWFzdGVyX3NzcmMsIG1hc3Rlcl9wdCwgMTAwICsgaSk7CisgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaHNlbmQsIGdzdF9idWZmZXJfcmVmIChpbmJ1ZnNbaV0pKTsKKyAgICBnc3RfaGFybmVzc19wdXNoIChocmVjdiwgZ3N0X2hhcm5lc3NfcHVsbCAoaHNlbmQpKTsKKyAgICBwdWxsX2FuZF92ZXJpZnkgKGhyZWN2LCBGQUxTRSwgbWFzdGVyX3NzcmMsIG1hc3Rlcl9wdCwgMTAwICsgaSk7CisgIH0KKworICAvKiBHZXR0aW5nIHJpZCBvZiByZWNvbmZpZ3VyZSBldmVudC4gUHJlcGFyYXRpb24gYmVmb3JlIHRoZSBuZXh0IHN0ZXAgKi8KKyAgZ3N0X2V2ZW50X3VucmVmIChnc3RfaGFybmVzc19wdWxsX3Vwc3RyZWFtX2V2ZW50IChocmVjdikpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfaGFybmVzc191cHN0cmVhbV9ldmVudHNfaW5fcXVldWUgKGhyZWN2KSwgMCk7CisKKyAgLyogUHVzaCAncGFja2V0c19udW0nIFJUWCBldmVudHMgdGhyb3VnaCBydHhyZWNlaXZlIHRvIHJ0eHNlbmQuCisgICAgIFB1c2ggUlRYIHBhY2tldHMgZnJvbSBydHhzZW5kIHRvIHJ0eHJlY2VpdmUgYW5kCisgICAgIGNoZWNrIHRoYXQgdGhlIHBhY2tldCBwcm9kdWNlZCBvdXQgb2YgUlRYIHBhY2tldCBpcyB0aGUgc2FtZQorICAgICBhcyBhbiBvcmlnaW5hbCBwYWNrZXQgKi8KKyAgZm9yIChpID0gMDsgaSA8IHBhY2tldHNfbnVtOyArK2kpIHsKKyAgICBHc3RCdWZmZXIgKm91dGJ1ZjsKKyAgICBnc3RfaGFybmVzc19wdXNoX3Vwc3RyZWFtX2V2ZW50IChocmVjdiwKKyAgICAgICAgY3JlYXRlX3J0eF9ldmVudCAobWFzdGVyX3NzcmMsIG1hc3Rlcl9wdCwgMTAwICsgaSkpOworICAgIGdzdF9oYXJuZXNzX3B1c2hfdXBzdHJlYW1fZXZlbnQgKGhzZW5kLAorICAgICAgICBnc3RfaGFybmVzc19wdWxsX3Vwc3RyZWFtX2V2ZW50IChocmVjdikpOworICAgIGdzdF9oYXJuZXNzX3B1c2ggKGhyZWN2LCBnc3RfaGFybmVzc19wdWxsIChoc2VuZCkpOworCisgICAgb3V0YnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaHJlY3YpOworICAgIGNvbXBhcmVfcnRwX3BhY2tldHMgKGluYnVmc1tpXSwgb3V0YnVmKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChpbmJ1ZnNbaV0pOworICAgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1Zik7CisgIH0KKworICAvKiBDaGVjayBSVFggc3RhdHMgKi8KKyAgeworICAgIGd1aW50IHJ0eF9yZXF1ZXN0czsKKyAgICBndWludCBydHhfcGFja2V0czsKKyAgICBndWludCBydHhfYXNzb2NfcGFja2V0czsKKyAgICBnX29iamVjdF9nZXQgKEdfT0JKRUNUIChoc2VuZC0+ZWxlbWVudCksCisgICAgICAgICJudW0tcnR4LXJlcXVlc3RzIiwgJnJ0eF9yZXF1ZXN0cywKKyAgICAgICAgIm51bS1ydHgtcGFja2V0cyIsICZydHhfcGFja2V0cywgTlVMTCk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAocnR4X3BhY2tldHMsIHBhY2tldHNfbnVtKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChydHhfcmVxdWVzdHMsIHBhY2tldHNfbnVtKTsKKworICAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKGhyZWN2LT5lbGVtZW50KSwKKyAgICAgICAgIm51bS1ydHgtcmVxdWVzdHMiLCAmcnR4X3JlcXVlc3RzLAorICAgICAgICAibnVtLXJ0eC1wYWNrZXRzIiwgJnJ0eF9wYWNrZXRzLAorICAgICAgICAibnVtLXJ0eC1hc3NvYy1wYWNrZXRzIiwgJnJ0eF9hc3NvY19wYWNrZXRzLCBOVUxMKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChydHhfcGFja2V0cywgcGFja2V0c19udW0pOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHJ0eF9yZXF1ZXN0cywgcGFja2V0c19udW0pOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHJ0eF9hc3NvY19wYWNrZXRzLCBwYWNrZXRzX251bSk7CisgIH0KKworICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHB0X21hcCk7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChocmVjdik7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoc2VuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnR4c2VuZF9ydHhyZWNlaXZlX3dpdGhfcGFja2V0X2xvc3MpCit7CisgIGd1aW50IHBhY2tldHNfbnVtID0gMjA7CisgIGd1aW50IG1hc3Rlcl9zc3JjID0gMTIzNDU2NzsKKyAgZ3VpbnQgbWFzdGVyX3B0ID0gOTY7CisgIGd1aW50IHJ0eF9wdCA9IDk5OworICBndWludCBzZXFudW0gPSAxMDA7CisgIGd1aW50IGV4cGVjdGVkX3J0eF9wYWNrZXRzID0gMDsKKyAgR3N0U3RydWN0dXJlICpwdF9tYXA7CisgIEdzdEhhcm5lc3MgKmhyZWN2ID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwcnR4cmVjZWl2ZSIpOworICBHc3RIYXJuZXNzICpoc2VuZCA9IGdzdF9oYXJuZXNzX25ldyAoInJ0cHJ0eHNlbmQiKTsKKyAgZ2ludCBkcm9wX250aF9wYWNrZXQsIGk7CisKKyAgcHRfbWFwID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1wdC1tYXAiLAorICAgICAgIjk2IiwgR19UWVBFX1VJTlQsIHJ0eF9wdCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoaHJlY3YtPmVsZW1lbnQsICJwYXlsb2FkLXR5cGUtbWFwIiwgcHRfbWFwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChoc2VuZC0+ZWxlbWVudCwgInBheWxvYWQtdHlwZS1tYXAiLCBwdF9tYXAsIE5VTEwpOworCisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGhzZW5kLCAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICJtZWRpYSA9IChzdHJpbmcpdmlkZW8sIHBheWxvYWQgPSAoaW50KTk2LCAiCisgICAgICAic3NyYyA9ICh1aW50KTEyMzQ1NjcsIGNsb2NrLXJhdGUgPSAoaW50KTkwMDAwLCAiCisgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpUkFXIik7CisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGhyZWN2LCAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICJtZWRpYSA9IChzdHJpbmcpdmlkZW8sIHBheWxvYWQgPSAoaW50KTk2LCAiCisgICAgICAic3NyYyA9ICh1aW50KTEyMzQ1NjcsIGNsb2NrLXJhdGUgPSAoaW50KTkwMDAwLCAiCisgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpUkFXIik7CisKKyAgLyogR2V0dGluZyByaWQgb2YgcmVjb25maWd1cmUgZXZlbnQuIE1ha2luZyBzdXJlIHRoZXJlIGlzIG5vIHVwc3RyZWFtCisgICAgIGV2ZW50cyBpbiB0aGUgcXVldWUuIFByZXBhcmF0aW9uIHN0ZXAgYmVmb3JlIHRoZSB0ZXN0LiAqLworICBnc3RfZXZlbnRfdW5yZWYgKGdzdF9oYXJuZXNzX3B1bGxfdXBzdHJlYW1fZXZlbnQgKGhyZWN2KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9oYXJuZXNzX3Vwc3RyZWFtX2V2ZW50c19pbl9xdWV1ZSAoaHJlY3YpLCAwKTsKKworICAvKiBQdXNoICdwYWNrZXRzX251bScgcGFja2V0cyB0aHJvdWdoIHJ0eHNlbmQgdG8gcnR4cmVjZWl2ZSBsb29zaW5nIGV2ZXJ5CisgICAgICdkcm9wX2V2ZXJ5X25fcGFja2V0cycgcGFja2V0LiBXaGVuIHdlIGxvb3NlIHRoZSBwYWNrZXQgd2Ugc2VuZCBSVFggZXZlbnQKKyAgICAgdGhyb3VnaCBydHhyZWNlaXZlIHRvIHJ0eHNlbmQsIGFuZCB2ZXJpZnkgdGhlIHBhY2tldCB3YXMgcmV0cmFuc21pdHRlZCAqLworICBmb3IgKGRyb3BfbnRoX3BhY2tldCA9IDI7IGRyb3BfbnRoX3BhY2tldCA8IDEwOyArK2Ryb3BfbnRoX3BhY2tldCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBwYWNrZXRzX251bTsgKytpLCArK3NlcW51bSkgeworICAgICAgR3N0QnVmZmVyICpvdXRidWY7CisgICAgICBHc3RCdWZmZXIgKmluYnVmID0gY3JlYXRlX3J0cF9idWZmZXIgKG1hc3Rlcl9zc3JjLCBtYXN0ZXJfcHQsIHNlcW51bSk7CisgICAgICBnYm9vbGVhbiBkcm9wX3RoaXNfcGFja2V0ID0gKChpICsgMSkgJSBkcm9wX250aF9wYWNrZXQpID09IDA7CisKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGhzZW5kLCBnc3RfYnVmZmVyX3JlZiAoaW5idWYpKTsKKyAgICAgIGlmIChkcm9wX3RoaXNfcGFja2V0KSB7CisgICAgICAgIC8qIERyb3BwaW5nIG9yaWdpbmFsIHBhY2tldCAqLworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChoc2VuZCkpOworICAgICAgICAvKiBSZXF1ZXN0aW5nIHJldHJhbnNtaXNzaW9uICovCisgICAgICAgIGdzdF9oYXJuZXNzX3B1c2hfdXBzdHJlYW1fZXZlbnQgKGhyZWN2LAorICAgICAgICAgICAgY3JlYXRlX3J0eF9ldmVudCAobWFzdGVyX3NzcmMsIG1hc3Rlcl9wdCwgc2VxbnVtKSk7CisgICAgICAgIGdzdF9oYXJuZXNzX3B1c2hfdXBzdHJlYW1fZXZlbnQgKGhzZW5kLAorICAgICAgICAgICAgZ3N0X2hhcm5lc3NfcHVsbF91cHN0cmVhbV9ldmVudCAoaHJlY3YpKTsKKyAgICAgICAgLyogUHVzaGluZyBSVFggcGFja2V0IHRvIHJ0eHJlY2VpdmUgKi8KKyAgICAgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaHJlY3YsIGdzdF9oYXJuZXNzX3B1bGwgKGhzZW5kKSk7CisgICAgICAgICsrZXhwZWN0ZWRfcnR4X3BhY2tldHM7CisgICAgICB9IGVsc2UgeworICAgICAgICBnc3RfaGFybmVzc19wdXNoIChocmVjdiwgZ3N0X2hhcm5lc3NfcHVsbCAoaHNlbmQpKTsKKyAgICAgIH0KKworICAgICAgLyogV2UgbWFraW5nIHN1cmUgZXZlcnkgYnVmZmVyIHdlIHB1bGwgaXMgdGhlIHNhbWUgYXMgb3JpZ2luYWwgaW5wdXQKKyAgICAgICAgIGJ1ZmZlciAqLworICAgICAgb3V0YnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaHJlY3YpOworICAgICAgY29tcGFyZV9ydHBfcGFja2V0cyAoaW5idWYsIG91dGJ1Zik7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChpbmJ1Zik7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWYpOworCisgICAgICAvKgorICAgICAgICAgV2Ugc2hvdWxkIG5vdCBoYXZlIGFueSBwYWNrZXRzIGluIHRoZSBoYXJuZXNzIHF1ZXVlIGJ5IHRoaXMgcG9pbnQuIEl0CisgICAgICAgICBtZWFucyBydHhzZW5kIGRpZG4ndCBzZW5kIG1vcmUgcGFja2V0cyB0aGFuIFJUWCBldmVudHMgYW5kIHJ0eHJlY2VpdmUKKyAgICAgICAgIGRpZG4ndCBwcm9kdWNlIG1vcmUgdGhhbiBvbmUgcGFja2V0IHBlciBSVFggcGFja2V0LgorICAgICAgICovCisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfaGFybmVzc19idWZmZXJzX2luX3F1ZXVlIChoc2VuZCksIDApOworICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2hhcm5lc3NfYnVmZmVyc19pbl9xdWV1ZSAoaHJlY3YpLCAwKTsKKyAgICB9CisgIH0KKworICAvKiBDaGVjayBSVFggc3RhdHMgKi8KKyAgeworICAgIGd1aW50IHJ0eF9yZXF1ZXN0czsKKyAgICBndWludCBydHhfcGFja2V0czsKKyAgICBndWludCBydHhfYXNzb2NfcGFja2V0czsKKyAgICBnX29iamVjdF9nZXQgKEdfT0JKRUNUIChoc2VuZC0+ZWxlbWVudCksCisgICAgICAgICJudW0tcnR4LXJlcXVlc3RzIiwgJnJ0eF9yZXF1ZXN0cywKKyAgICAgICAgIm51bS1ydHgtcGFja2V0cyIsICZydHhfcGFja2V0cywgTlVMTCk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAocnR4X3BhY2tldHMsIGV4cGVjdGVkX3J0eF9wYWNrZXRzKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChydHhfcmVxdWVzdHMsIGV4cGVjdGVkX3J0eF9wYWNrZXRzKTsKKworICAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKGhyZWN2LT5lbGVtZW50KSwKKyAgICAgICAgIm51bS1ydHgtcmVxdWVzdHMiLCAmcnR4X3JlcXVlc3RzLAorICAgICAgICAibnVtLXJ0eC1wYWNrZXRzIiwgJnJ0eF9wYWNrZXRzLAorICAgICAgICAibnVtLXJ0eC1hc3NvYy1wYWNrZXRzIiwgJnJ0eF9hc3NvY19wYWNrZXRzLCBOVUxMKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChydHhfcGFja2V0cywgZXhwZWN0ZWRfcnR4X3BhY2tldHMpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHJ0eF9yZXF1ZXN0cywgZXhwZWN0ZWRfcnR4X3BhY2tldHMpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHJ0eF9hc3NvY19wYWNrZXRzLCBleHBlY3RlZF9ydHhfcGFja2V0cyk7CisgIH0KKworICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHB0X21hcCk7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChocmVjdik7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoc2VuZCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgR3N0SGFybmVzcyAqaDsKKyAgZ3VpbnQgbWFzdGVyX3NzcmM7CisgIGd1aW50IG1hc3Rlcl9wdDsKKyAgZ3VpbnQgcnR4X3NzcmM7CisgIGd1aW50IHJ0eF9wdDsKKyAgZ3VpbnQgc2VxbnVtOworICBndWludCBleHBlY3RlZF9ydHhfcGFja2V0czsKK30gUnR4U2VuZGVyOworCitzdGF0aWMgR3N0U3RydWN0dXJlICoKK2NyZWF0ZV9ydHhzZW5kZXJzIChSdHhTZW5kZXIgKiBzZW5kZXJzLCBndWludCBzZW5kZXJzX251bSkKK3sKKyAgR3N0U3RydWN0dXJlICpyZWN2X3B0X21hcCA9CisgICAgICBnc3Rfc3RydWN0dXJlX25ld19lbXB0eSAoImFwcGxpY2F0aW9uL3gtcnRwLXB0LW1hcCIpOworICBnaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNlbmRlcnNfbnVtOyArK2kpIHsKKyAgICBnY2hhciAqbWFzdGVyX3B0X3N0cjsKKyAgICBnY2hhciAqbWFzdGVyX2NhcHNfc3RyOworICAgIEdzdFN0cnVjdHVyZSAqc2VuZF9wdF9tYXA7CisKKyAgICBzZW5kZXJzW2ldLmggPSBnc3RfaGFybmVzc19uZXcgKCJydHBydHhzZW5kIik7CisgICAgc2VuZGVyc1tpXS5tYXN0ZXJfc3NyYyA9IDEyMzQ1NjcgKyBpOworICAgIHNlbmRlcnNbaV0ucnR4X3NzcmMgPSA3NjU0MzIxICsgaTsKKyAgICBzZW5kZXJzW2ldLm1hc3Rlcl9wdCA9IDgwICsgaTsKKyAgICBzZW5kZXJzW2ldLnJ0eF9wdCA9IDIwICsgaTsKKyAgICBzZW5kZXJzW2ldLnNlcW51bSA9IGkgKiAxMDAwOworICAgIHNlbmRlcnNbaV0uZXhwZWN0ZWRfcnR4X3BhY2tldHMgPSAwOworCisgICAgbWFzdGVyX3B0X3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoIiV1Iiwgc2VuZGVyc1tpXS5tYXN0ZXJfcHQpOworICAgIG1hc3Rlcl9jYXBzX3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAgICJtZWRpYSA9IChzdHJpbmcpdmlkZW8sIHBheWxvYWQgPSAoaW50KSV1LCAiCisgICAgICAgICJzc3JjID0gKHVpbnQpJXUsIGNsb2NrLXJhdGUgPSAoaW50KTkwMDAwLCAiCisgICAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZylSQVciLAorICAgICAgICBzZW5kZXJzW2ldLm1hc3Rlcl9wdCwgc2VuZGVyc1tpXS5tYXN0ZXJfc3NyYyk7CisKKyAgICBzZW5kX3B0X21hcCA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtcHQtbWFwIiwKKyAgICAgICAgbWFzdGVyX3B0X3N0ciwgR19UWVBFX1VJTlQsIHNlbmRlcnNbaV0ucnR4X3B0LCBOVUxMKTsKKyAgICBnc3Rfc3RydWN0dXJlX3NldCAocmVjdl9wdF9tYXAsCisgICAgICAgIG1hc3Rlcl9wdF9zdHIsIEdfVFlQRV9VSU5ULCBzZW5kZXJzW2ldLnJ0eF9wdCwgTlVMTCk7CisKKyAgICBnX29iamVjdF9zZXQgKHNlbmRlcnNbaV0uaC0+ZWxlbWVudCwgInBheWxvYWQtdHlwZS1tYXAiLCBzZW5kX3B0X21hcCwgTlVMTCk7CisgICAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoc2VuZGVyc1tpXS5oLCBtYXN0ZXJfY2Fwc19zdHIpOworCisgICAgZ3N0X3N0cnVjdHVyZV9mcmVlIChzZW5kX3B0X21hcCk7CisgICAgZ19mcmVlIChtYXN0ZXJfcHRfc3RyKTsKKyAgICBnX2ZyZWUgKG1hc3Rlcl9jYXBzX3N0cik7CisgIH0KKyAgcmV0dXJuIHJlY3ZfcHRfbWFwOworfQorCitzdGF0aWMgZ3VpbnQKK2NoZWNrX3J0eHNlbmRlcnNfc3RhdHNfYW5kX3RlYXJkb3duIChSdHhTZW5kZXIgKiBzZW5kZXJzLCBndWludCBzZW5kZXJzX251bSkKK3sKKyAgZ3VpbnQgdG90YWxfcGFrZXRzX251bSA9IDA7CisgIGdpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2VuZGVyc19udW07ICsraSkgeworICAgIGd1aW50IHJ0eF9yZXF1ZXN0czsKKyAgICBndWludCBydHhfcGFja2V0czsKKyAgICBnX29iamVjdF9nZXQgKEdfT0JKRUNUIChzZW5kZXJzW2ldLmgtPmVsZW1lbnQpLAorICAgICAgICAibnVtLXJ0eC1yZXF1ZXN0cyIsICZydHhfcmVxdWVzdHMsCisgICAgICAgICJudW0tcnR4LXBhY2tldHMiLCAmcnR4X3BhY2tldHMsIE5VTEwpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHJ0eF9wYWNrZXRzLCBzZW5kZXJzW2ldLmV4cGVjdGVkX3J0eF9wYWNrZXRzKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChydHhfcmVxdWVzdHMsIHNlbmRlcnNbaV0uZXhwZWN0ZWRfcnR4X3BhY2tldHMpOworICAgIHRvdGFsX3Bha2V0c19udW0gKz0gcnR4X3BhY2tldHM7CisKKyAgICBnc3RfaGFybmVzc190ZWFyZG93biAoc2VuZGVyc1tpXS5oKTsKKyAgfQorICByZXR1cm4gdG90YWxfcGFrZXRzX251bTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfbXVsdGlfcnR4c2VuZF9ydHhyZWNlaXZlX3dpdGhfcGFja2V0X2xvc3MpCit7CisgIGd1aW50IHNlbmRlcnNfbnVtID0gNTsKKyAgZ3VpbnQgcGFja2V0c19udW0gPSAxMDsKKyAgZ3VpbnQgdG90YWxfcGFrZXRzX251bSA9IHNlbmRlcnNfbnVtICogcGFja2V0c19udW07CisgIGd1aW50IHRvdGFsX2Ryb3BwZWRfcGFja2V0cyA9IDA7CisgIFJ0eFNlbmRlciBzZW5kZXJzWzVdOworICBHc3RTdHJ1Y3R1cmUgKnB0X21hcDsKKyAgR3N0SGFybmVzcyAqaHJlY3YgPSBnc3RfaGFybmVzc19uZXcgKCJydHBydHhyZWNlaXZlIik7CisgIGdpbnQgZHJvcF9udGhfcGFja2V0LCBpLCBqOworCisgIHB0X21hcCA9IGNyZWF0ZV9ydHhzZW5kZXJzIChzZW5kZXJzLCA1KTsKKyAgZ19vYmplY3Rfc2V0IChocmVjdi0+ZWxlbWVudCwgInBheWxvYWQtdHlwZS1tYXAiLCBwdF9tYXAsIE5VTEwpOworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChocmVjdiwgImFwcGxpY2F0aW9uL3gtcnRwLCAiCisgICAgICAibWVkaWEgPSAoc3RyaW5nKXZpZGVvLCBwYXlsb2FkID0gKGludCk4MCwgIgorICAgICAgInNzcmMgPSAodWludCkxMjM0NTY3LCBjbG9jay1yYXRlID0gKGludCk5MDAwMCwgIgorICAgICAgImVuY29kaW5nLW5hbWUgPSAoc3RyaW5nKVJBVyIpOworCisgIC8qIEdldHRpbmcgcmlkIG9mIHJlY29uZmlndXJlIGV2ZW50LiBNYWtpbmcgc3VyZSB0aGVyZSBpcyBubyB1cHN0cmVhbQorICAgICBldmVudHMgaW4gdGhlIHF1ZXVlLiBQcmVwYXJhdGlvbiBzdGVwIGJlZm9yZSB0aGUgdGVzdC4gKi8KKyAgZ3N0X2V2ZW50X3VucmVmIChnc3RfaGFybmVzc19wdWxsX3Vwc3RyZWFtX2V2ZW50IChocmVjdikpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfaGFybmVzc191cHN0cmVhbV9ldmVudHNfaW5fcXVldWUgKGhyZWN2KSwgMCk7CisKKyAgLyogV2UgYXJlIGdvaW5nIHRvIHB1c2ggdGhlIDFzdCBwYWNrZXQgZnJvbSB0aGUgMXN0IHNlbmRlciwgMm5kIGZyb20gdGhlIDJuZCwKKyAgICAgM3JkIGZyb20gdGhlIDNyZCwgZXRjLiB1bnRpbCBhbGwgdGhlIHNlbmRlcnMgd2lsbCBwdXNoICdwYWNrZXRzX251bScgcGFja2V0cy4KKyAgICAgV2Ugd2lsbCBkcm9wIGV2ZXJ5ICdkcm9wX250aF9wYWNrZXQnIHBhY2tldCBhbmQgcmVxdWVzdCBpdHMgcmV0cmFuc21pc3Npb24KKyAgICAgZnJvbSBhbGwgdGhlIHNlbmRlcnMuIEJlY2F1c2Ugb25seSBvbmUgb2YgdGhlbSBjYW4gcHJvZHVjZSBSVFggcGFja2V0LgorICAgICBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBvdGhlciBzZW5kZXJzIHdpbGwgaWdub3JlIHRoZSBSVFggZXZlbnQgdGhleQorICAgICBjYW4ndCBhY3QgdXBvbi4KKyAgICovCisgIGZvciAoZHJvcF9udGhfcGFja2V0ID0gMjsgZHJvcF9udGhfcGFja2V0IDwgNTsgKytkcm9wX250aF9wYWNrZXQpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxfcGFrZXRzX251bTsgKytpKSB7CisgICAgICBSdHhTZW5kZXIgKnNlbmRlciA9ICZzZW5kZXJzW2kgJSBzZW5kZXJzX251bV07CisgICAgICBnYm9vbGVhbiBkcm9wX3RoaXNfcGFja2V0ID0gKChpICsgMSkgJSBkcm9wX250aF9wYWNrZXQpID09IDA7CisgICAgICBHc3RCdWZmZXIgKm91dGJ1ZiwgKmluYnVmOworICAgICAgaW5idWYgPQorICAgICAgICAgIGNyZWF0ZV9ydHBfYnVmZmVyIChzZW5kZXItPm1hc3Rlcl9zc3JjLCBzZW5kZXItPm1hc3Rlcl9wdCwKKyAgICAgICAgICBzZW5kZXItPnNlcW51bSk7CisKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKHNlbmRlci0+aCwgZ3N0X2J1ZmZlcl9yZWYgKGluYnVmKSk7CisgICAgICBpZiAoZHJvcF90aGlzX3BhY2tldCkgeworICAgICAgICBHc3RFdmVudCAqcnR4ZXZlbnQ7CisgICAgICAgIC8qIERyb3BwaW5nIG9yaWdpbmFsIHBhY2tldCAqLworICAgICAgICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChzZW5kZXItPmgpKTsKKworICAgICAgICAvKiBQdXNoaW5nIFJUWCBldmVudCB0aHJvdWdoIHJ0eHJlY2VpdmUgdG8gYWxsIHRoZSBzZW5kZXJzICovCisgICAgICAgIGdzdF9oYXJuZXNzX3B1c2hfdXBzdHJlYW1fZXZlbnQgKGhyZWN2LAorICAgICAgICAgICAgY3JlYXRlX3J0eF9ldmVudCAoc2VuZGVyLT5tYXN0ZXJfc3NyYywgc2VuZGVyLT5tYXN0ZXJfcHQsCisgICAgICAgICAgICAgICAgc2VuZGVyLT5zZXFudW0pKTsKKyAgICAgICAgcnR4ZXZlbnQgPSBnc3RfaGFybmVzc19wdWxsX3Vwc3RyZWFtX2V2ZW50IChocmVjdik7CisKKyAgICAgICAgLyogLi4uIHRvIGFsbCB0aGUgc2VuZGVycyAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2VuZGVyc19udW07ICsraikKKyAgICAgICAgICBnc3RfaGFybmVzc19wdXNoX3Vwc3RyZWFtX2V2ZW50IChzZW5kZXJzW2pdLmgsCisgICAgICAgICAgICAgIGdzdF9ldmVudF9yZWYgKHJ0eGV2ZW50KSk7CisgICAgICAgIGdzdF9ldmVudF91bnJlZiAocnR4ZXZlbnQpOworCisgICAgICAgIC8qIFB1c2hpbmcgUlRYIHBhY2tldCB0byBydHhyZWNlaXZlICovCisgICAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGhyZWN2LCBnc3RfaGFybmVzc19wdWxsIChzZW5kZXItPmgpKTsKKyAgICAgICAgKytzZW5kZXItPmV4cGVjdGVkX3J0eF9wYWNrZXRzOworICAgICAgICArK3RvdGFsX2Ryb3BwZWRfcGFja2V0czsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdzdF9oYXJuZXNzX3B1c2ggKGhyZWN2LCBnc3RfaGFybmVzc19wdWxsIChzZW5kZXItPmgpKTsKKyAgICAgIH0KKworICAgICAgLyogSXQgc2hvdWxkIG5vdCBtYXR0ZXIgd2hldGhlciB0aGUgYnVmZmVyIHdhcyBkcm9wcGVkIChhbmQgcmV0cmFuc21pdHRlZCkKKyAgICAgICAgIG9yIGl0IHdlbnQgc3RyYWlnaHQgdGhyb3VnaCBydHhzZW5kIHRvIHJ0eHJlY2VpdmUuIFdlIHNob3VsZCBhbHdheXMgcHVsbAorICAgICAgICAgdGhlIHNhbWUgYnVmZmVyIHRoYXQgd2FzIHB1c2hlZCAqLworICAgICAgb3V0YnVmID0gZ3N0X2hhcm5lc3NfcHVsbCAoaHJlY3YpOworICAgICAgY29tcGFyZV9ydHBfcGFja2V0cyAoaW5idWYsIG91dGJ1Zik7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChpbmJ1Zik7CisgICAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWYpOworCisgICAgICAvKgorICAgICAgICAgV2Ugc2hvdWxkIG5vdCBoYXZlIGFueSBwYWNrZXRzIGluIHRoZSBoYXJuZXNzIHF1ZXVlIGJ5IHRoaXMgcG9pbnQuIEl0CisgICAgICAgICBtZWFucyBvdXIgc2VuZGVycyBkaWRuJ3QgcHJvZHVjZSB0aGUgcGFja2V0cyBmb3IgdGhlIHVua25vd24gUlRYIGV2ZW50LgorICAgICAgICovCisgICAgICBmb3IgKGogPSAwOyBqIDwgc2VuZGVyc19udW07ICsraikKKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2hhcm5lc3NfYnVmZmVyc19pbl9xdWV1ZSAoc2VuZGVyc1tqXS5oKSwgMCk7CisKKyAgICAgICsrc2VuZGVyLT5zZXFudW07CisgICAgfQorICB9CisKKyAgLyogQ2hlY2sgUlRYIHN0YXRzICovCisgIHsKKyAgICBndWludCB0b3RhbF9ydHhfcGFja2V0czsKKyAgICBndWludCBydHhfcmVxdWVzdHM7CisgICAgZ3VpbnQgcnR4X3BhY2tldHM7CisgICAgZ3VpbnQgcnR4X2Fzc29jX3BhY2tldHM7CisKKyAgICB0b3RhbF9ydHhfcGFja2V0cyA9CisgICAgICAgIGNoZWNrX3J0eHNlbmRlcnNfc3RhdHNfYW5kX3RlYXJkb3duIChzZW5kZXJzLCBzZW5kZXJzX251bSk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAodG90YWxfcnR4X3BhY2tldHMsIHRvdGFsX2Ryb3BwZWRfcGFja2V0cyk7CisKKyAgICBnX29iamVjdF9nZXQgKEdfT0JKRUNUIChocmVjdi0+ZWxlbWVudCksCisgICAgICAgICJudW0tcnR4LXJlcXVlc3RzIiwgJnJ0eF9yZXF1ZXN0cywKKyAgICAgICAgIm51bS1ydHgtcGFja2V0cyIsICZydHhfcGFja2V0cywKKyAgICAgICAgIm51bS1ydHgtYXNzb2MtcGFja2V0cyIsICZydHhfYXNzb2NfcGFja2V0cywgTlVMTCk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAocnR4X3BhY2tldHMsIHRvdGFsX3J0eF9wYWNrZXRzKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChydHhfcmVxdWVzdHMsIHRvdGFsX3J0eF9wYWNrZXRzKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChydHhfYXNzb2NfcGFja2V0cywgdG90YWxfcnR4X3BhY2tldHMpOworICB9CisKKyAgZ3N0X3N0cnVjdHVyZV9mcmVlIChwdF9tYXApOworICBnc3RfaGFybmVzc190ZWFyZG93biAoaHJlY3YpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyB2b2lkCit0ZXN0X3J0eHNlbmRlcl9wYWNrZXRfcmV0ZW50aW9uIChnYm9vbGVhbiB0ZXN0X3dpdGhfdGltZSkKK3sKKyAgZ3VpbnQgbWFzdGVyX3NzcmMgPSAxMjM0NTY3OworICBndWludCBtYXN0ZXJfcHQgPSA5NjsKKyAgZ3VpbnQgcnR4X3NzcmMgPSA3NjU0MzIxOworICBndWludCBydHhfcHQgPSA5OTsKKyAgZ2ludCBudW1fYnVmZmVycyA9IHRlc3Rfd2l0aF90aW1lID8gMzAgOiAxMDsKKyAgZ2ludCBoYWxmX2J1ZmZlcnMgPSBudW1fYnVmZmVycyAvIDI7CisgIGd1aW50IHRpbWVzdGFtcF9kZWx0YSA9IDkwMDAwIC8gMzA7CisgIGd1aW50IHRpbWVzdGFtcCA9IEdfTUFYVUlOVDMyIC0gaGFsZl9idWZmZXJzICogdGltZXN0YW1wX2RlbHRhOworICBHc3RIYXJuZXNzICpoOworICBHc3RTdHJ1Y3R1cmUgKnB0X21hcCA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtcHQtbWFwIiwKKyAgICAgICI5NiIsIEdfVFlQRV9VSU5ULCBydHhfcHQsIE5VTEwpOworICBHc3RTdHJ1Y3R1cmUgKnNzcmNfbWFwID0gZ3N0X3N0cnVjdHVyZV9uZXcgKCJhcHBsaWNhdGlvbi94LXJ0cC1zc3JjLW1hcCIsCisgICAgICAiMTIzNDU2NyIsIEdfVFlQRV9VSU5ULCBydHhfc3NyYywgTlVMTCk7CisgIGdpbnQgaSwgajsKKworICBoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwcnR4c2VuZCIpOworCisgIC8qIEluIGJvdGggY2FzZXMgd2Ugd2FudCB0aGUgcnR4c2VuZCBxdWV1ZSB0byBzdG9yZSAnaGFsZl9idWZmZXJzJworICAgICBhbW91bnQgb2YgYnVmZmVycyBhdCBtb3N0LiBJbiBtYXgtc2l6ZS1wYWNrZXRzIG1vZGUsIGl0J3MgdHJpdmlhbC4KKyAgICAgSW4gbWF4LXNpemUtdGltZSBtb2RlLCB3ZSBzcGVjaWZ5IGFsbW9zdCBoYWxmIGEgc2Vjb25kLCB3aGljaCBpcworICAgICB0aGUgZXF1aXZhbGVudCBvZiAxNSBmcmFtZXMgaW4gYSAzMGZwcyB2aWRlbyBzdHJlYW0uCisgICAqLworICBnX29iamVjdF9zZXQgKGgtPmVsZW1lbnQsCisgICAgICAibWF4LXNpemUtcGFja2V0cyIsIHRlc3Rfd2l0aF90aW1lID8gMCA6IGhhbGZfYnVmZmVycywKKyAgICAgICJtYXgtc2l6ZS10aW1lIiwgdGVzdF93aXRoX3RpbWUgPyA0OTkgOiAwLAorICAgICAgInBheWxvYWQtdHlwZS1tYXAiLCBwdF9tYXAsICJzc3JjLW1hcCIsIHNzcmNfbWFwLCBOVUxMKTsKKworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChoLCAiYXBwbGljYXRpb24veC1ydHAsICIKKyAgICAgICJtZWRpYSA9IChzdHJpbmcpdmlkZW8sIHBheWxvYWQgPSAoaW50KTk2LCAiCisgICAgICAic3NyYyA9ICh1aW50KTEyMzQ1NjcsIGNsb2NrLXJhdGUgPSAoaW50KTkwMDAwLCAiCisgICAgICAiZW5jb2RpbmctbmFtZSA9IChzdHJpbmcpUkFXIik7CisKKyAgLyogTm93IHB1c2ggYWxsIGJ1ZmZlcnMgYW5kIHJlcXVlc3QgcmV0cmFuc21pc3Npb24gZXZlcnkgdGltZSBmb3IgYWxsIG9mIHRoZW0gKi8KKyAgZm9yIChpID0gMDsgaSA8IG51bV9idWZmZXJzOyArK2ksIHRpbWVzdGFtcCArPSB0aW1lc3RhbXBfZGVsdGEpIHsKKyAgICAvKiBSZXF1ZXN0IHRvIHJldHJhbnNtaXQgYWxsIHRoZSBwcmV2aW91cyBvbmVzICovCisgICAgZm9yIChqID0gMDsgaiA8IGk7ICsraikgeworICAgICAgZ3VpbnQgcnR4X3NlcW51bSA9IDB4MTAwICsgajsKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2hfdXBzdHJlYW1fZXZlbnQgKGgsCisgICAgICAgICAgY3JlYXRlX3J0eF9ldmVudCAobWFzdGVyX3NzcmMsIG1hc3Rlcl9wdCwgcnR4X3NlcW51bSkpOworCisgICAgICAvKiBQdWxsIG9ubHkgdGhlIG9uZXMgc3VwcG9zZWQgdG8gYmUgcmV0cmFuc21pdGVkICovCisgICAgICBpZiAoaiA+PSBpIC0gaGFsZl9idWZmZXJzKQorICAgICAgICBwdWxsX2FuZF92ZXJpZnkgKGgsIFRSVUUsIHJ0eF9zc3JjLCBydHhfcHQsIHJ0eF9zZXFudW0pOworICAgIH0KKyAgICAvKiBDaGVjayB0aGVyZSBubyBleHRyYSBidWZmZXJzIGluIHRoZSBoYXJuZXNzIHF1ZXVlICovCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2hhcm5lc3NfYnVmZmVyc19pbl9xdWV1ZSAoaCksIDApOworCisgICAgLyogV2UgY3JlYXRlIFJUUCBidWZmZXJzIHdpdGggdGltZXN0YW1wcyB0aGF0IHdpbGwgZXZlbnR1YWx5IHdyYXAgYXJvdW5kIDAKKyAgICAgICB0byBiZSBzdXJlLCBydHBydHhzZW5kIGNhbiBoYW5kbGUgaXQgcHJvcGVybHkgKi8KKyAgICBwdXNoX3B1bGxfYW5kX3ZlcmlmeSAoaCwKKyAgICAgICAgY3JlYXRlX3J0cF9idWZmZXJfd2l0aF90aW1lc3RhbXAgKG1hc3Rlcl9zc3JjLCBtYXN0ZXJfcHQsIDB4MTAwICsgaSwKKyAgICAgICAgICAgIHRpbWVzdGFtcCksIEZBTFNFLCBtYXN0ZXJfc3NyYywgbWFzdGVyX3B0LCAweDEwMCArIGkpOworICB9CisKKyAgZ3N0X3N0cnVjdHVyZV9mcmVlIChwdF9tYXApOworICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHNzcmNfbWFwKTsKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ydHhzZW5kZXJfbWF4X3NpemVfcGFja2V0cykKK3sKKyAgdGVzdF9ydHhzZW5kZXJfcGFja2V0X3JldGVudGlvbiAoRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3J0eHNlbmRlcl9tYXhfc2l6ZV90aW1lKQoreworICB0ZXN0X3J0eHNlbmRlcl9wYWNrZXRfcmV0ZW50aW9uIChUUlVFKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgdm9pZAordGVzdF9ydHhxdWV1ZV9wYWNrZXRfcmV0ZW50aW9uIChnYm9vbGVhbiB0ZXN0X3dpdGhfdGltZSkKK3sKKyAgZ3VpbnQgc3NyYyA9IDEyMzQ1Njc7CisgIGd1aW50IHB0ID0gOTY7CisgIGdpbnQgbnVtX2J1ZmZlcnMgPSB0ZXN0X3dpdGhfdGltZSA/IDMwIDogMTA7CisgIGdpbnQgaGFsZl9idWZmZXJzID0gbnVtX2J1ZmZlcnMgLyAyOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wX2RlbHRhID0gR1NUX1NFQ09ORCAvIDMwOworICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wID0gMDsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdEhhcm5lc3MgKmg7CisgIGdpbnQgaSwgajsKKworICBoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwcnR4cXVldWUiKTsKKworICAvKiBJbiBib3RoIGNhc2VzIHdlIHdhbnQgdGhlIHJ0eHF1ZXVlIHRvIHN0b3JlICdoYWxmX2J1ZmZlcnMnCisgICAgIGFtb3VudCBvZiBidWZmZXJzIGF0IG1vc3QuIEluIG1heC1zaXplLXBhY2tldHMgbW9kZSwgaXQncyB0cml2aWFsLgorICAgICBJbiBtYXgtc2l6ZS10aW1lIG1vZGUsIHdlIHNwZWNpZnkgYWxtb3N0IGhhbGYgYSBzZWNvbmQsIHdoaWNoIGlzCisgICAgIHRoZSBlcXVpdmFsZW50IG9mIDE1IGZyYW1lcyBpbiBhIDMwZnBzIHZpZGVvIHN0cmVhbS4KKyAgICovCisgIGdfb2JqZWN0X3NldCAoaC0+ZWxlbWVudCwKKyAgICAgICJtYXgtc2l6ZS1wYWNrZXRzIiwgdGVzdF93aXRoX3RpbWUgPyAwIDogaGFsZl9idWZmZXJzLAorICAgICAgIm1heC1zaXplLXRpbWUiLCB0ZXN0X3dpdGhfdGltZSA/IDQ5OCA6IDAsIE5VTEwpOworCisgIGdzdF9oYXJuZXNzX3NldF9zcmNfY2Fwc19zdHIgKGgsICJhcHBsaWNhdGlvbi94LXJ0cCwgIgorICAgICAgIm1lZGlhID0gKHN0cmluZyl2aWRlbywgcGF5bG9hZCA9IChpbnQpOTYsICIKKyAgICAgICJzc3JjID0gKHVpbnQpMTIzNDU2NywgY2xvY2stcmF0ZSA9IChpbnQpOTAwMDAsICIKKyAgICAgICJlbmNvZGluZy1uYW1lID0gKHN0cmluZylSQVciKTsKKworICAvKiBOb3cgcHVzaCBhbGwgYnVmZmVycyBhbmQgcmVxdWVzdCByZXRyYW5zbWlzc2lvbiBldmVyeSB0aW1lIGZvciBhbGwgb2YgdGhlbS4KKyAgICogTm90ZSB0aGF0IHJ0cHJ0eHF1ZXVlIHNlbmRzIHJldHJhbnNtaXNzaW9ucyBpbiBjaGFpbigpLCBqdXN0IGJlZm9yZQorICAgKiBwdXNoaW5nIG91dCB0aGUgY2hhaW5lZCBidWZmZXIsIGEgZGlmZmVyZW50aWF0aW9uIGZyb20gcnRwcnR4c2VuZCBhYm92ZQorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IG51bV9idWZmZXJzOyArK2ksIHRpbWVzdGFtcCArPSB0aW1lc3RhbXBfZGVsdGEpIHsKKyAgICAvKiBSZXF1ZXN0IHRvIHJldHJhbnNtaXQgYWxsIHRoZSBwcmV2aW91cyBvbmVzICovCisgICAgZm9yIChqID0gMDsgaiA8IGk7ICsraikgeworICAgICAgZ3VpbnQgcnR4X3NlcW51bSA9IDB4MTAwICsgajsKKyAgICAgIGdzdF9oYXJuZXNzX3B1c2hfdXBzdHJlYW1fZXZlbnQgKGgsCisgICAgICAgICAgY3JlYXRlX3J0eF9ldmVudCAoc3NyYywgcHQsIHJ0eF9zZXFudW0pKTsKKyAgICB9CisKKyAgICAvKiBwdXNoIG9uZSBwYWNrZXQgKi8KKyAgICBidWYgPSBjcmVhdGVfcnRwX2J1ZmZlciAoc3NyYywgcHQsIDB4MTAwICsgaSk7CisgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikgPSB0aW1lc3RhbXA7CisgICAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgYnVmKTsKKworICAgIC8qIFB1bGwgdGhlIG9uZXMgc3VwcG9zZWQgdG8gYmUgcmV0cmFuc21pdHRlZCAqLworICAgIGZvciAoaiA9IDA7IGogPCBpOyArK2opIHsKKyAgICAgIGd1aW50IHJ0eF9zZXFudW0gPSAweDEwMCArIGo7CisgICAgICBpZiAoaiA+PSBpIC0gaGFsZl9idWZmZXJzKQorICAgICAgICBwdWxsX2FuZF92ZXJpZnkgKGgsIEZBTFNFLCBzc3JjLCBwdCwgcnR4X3NlcW51bSk7CisgICAgfQorCisgICAgLyogVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIHBhY2tldCByZW1haW5pbmcgaW4gdGhlIHF1ZXVlIG5vdyAqLworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9oYXJuZXNzX2J1ZmZlcnNfaW5fcXVldWUgKGgpLCAxKTsKKworICAgIC8qIHB1bGwgdGhlIG9uZSB0aGF0IHdlIGp1c3QgcHVzaGVkIChjb21lcyBhZnRlciB0aGUgcmV0cmFuc21pdHRlZCBvbmVzKSAqLworICAgIHB1bGxfYW5kX3ZlcmlmeSAoaCwgRkFMU0UsIHNzcmMsIHB0LCAweDEwMCArIGkpOworCisgICAgLyogQ2hlY2sgdGhlcmUgbm8gZXh0cmEgYnVmZmVycyBpbiB0aGUgaGFybmVzcyBxdWV1ZSAqLworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9oYXJuZXNzX2J1ZmZlcnNfaW5fcXVldWUgKGgpLCAwKTsKKyAgfQorCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnR4cXVldWVfbWF4X3NpemVfcGFja2V0cykKK3sKKyAgdGVzdF9ydHhxdWV1ZV9wYWNrZXRfcmV0ZW50aW9uIChGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnR4cXVldWVfbWF4X3NpemVfdGltZSkKK3sKKyAgdGVzdF9ydHhxdWV1ZV9wYWNrZXRfcmV0ZW50aW9uIChUUlVFKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorcnRwcnR4X3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInJ0cHJ0eCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgdGNhc2Vfc2V0X3RpbWVvdXQgKHRjX2NoYWluLCAxMjApOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHhzZW5kX3J0eHJlY2VpdmUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcnR4c2VuZF9ydHhyZWNlaXZlX3dpdGhfcGFja2V0X2xvc3MpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbXVsdGlfcnR4c2VuZF9ydHhyZWNlaXZlX3dpdGhfcGFja2V0X2xvc3MpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcnR4c2VuZGVyX21heF9zaXplX3BhY2tldHMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcnR4c2VuZGVyX21heF9zaXplX3RpbWUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcnR4cXVldWVfbWF4X3NpemVfcGFja2V0cyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9ydHhxdWV1ZV9tYXhfc2l6ZV90aW1lKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHJ0cHJ0eCk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBzZXNzaW9uLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHBzZXNzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5MjVlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3J0cHNlc3Npb24uYwpAQCAtMCwwICsxLDcyNiBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBnc3RydHBzZXNzaW9uCisgKgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gV2ltIFRheW1hbnMgPHdpbS50YXltYW5zQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBDb2xsYWJvcmEgTHRkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjZGVmaW5lIEdMSUJfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGhhcm5lc3MuaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0dGVzdGNsb2NrLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGhhcm5lc3MuaD4KKworI2luY2x1ZGUgPGdzdC9ydHAvZ3N0cnRwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L3J0cC9nc3RydGNwYnVmZmVyLmg+CisjaW5jbHVkZSA8Z3N0L25ldC9nc3RuZXRhZGRyZXNzbWV0YS5oPgorCisjZGVmaW5lIFRFU1RfQlVGX0NMT0NLX1JBVEUgODAwMAorI2RlZmluZSBURVNUX0JVRl9QVCAwCisjZGVmaW5lIFRFU1RfQlVGX1NTUkMgMHgwMUJBREJBRAorI2RlZmluZSBURVNUX0JVRl9NUyAgMjAKKyNkZWZpbmUgVEVTVF9CVUZfRFVSQVRJT04gKFRFU1RfQlVGX01TICogR1NUX01TRUNPTkQpCisjZGVmaW5lIFRFU1RfQlVGX1NJWkUgKDY0MDAwICogVEVTVF9CVUZfTVMgLyAxMDAwKQorI2RlZmluZSBURVNUX1JUUF9UU19EVVJBVElPTiAoVEVTVF9CVUZfQ0xPQ0tfUkFURSAqIFRFU1RfQlVGX01TIC8gMTAwMCkKKworc3RhdGljIEdzdENhcHMgKgorZ2VuZXJhdGVfY2FwcyAodm9pZCkKK3sKKyAgcmV0dXJuIGdzdF9jYXBzX25ld19zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXJ0cCIsCisgICAgICAiY2xvY2stcmF0ZSIsIEdfVFlQRV9JTlQsIFRFU1RfQlVGX0NMT0NLX1JBVEUsCisgICAgICAicGF5bG9hZCIsIEdfVFlQRV9JTlQsIFRFU1RfQlVGX1BULAorICAgICAgTlVMTCk7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ2VuZXJhdGVfdGVzdF9idWZmZXJfZnVsbCAoR3N0Q2xvY2tUaW1lIGR0cywKKyAgICBndWludCBzZXFfbnVtLCBndWludDMyIHJ0cF90cywgZ3VpbnQgc3NyYykKK3sKKyAgR3N0QnVmZmVyICpidWY7CisgIGd1aW50OCAqcGF5bG9hZDsKKyAgZ3VpbnQgaTsKKyAgR3N0UlRQQnVmZmVyIHJ0cCA9IEdTVF9SVFBfQlVGRkVSX0lOSVQ7CisKKyAgYnVmID0gZ3N0X3J0cF9idWZmZXJfbmV3X2FsbG9jYXRlIChURVNUX0JVRl9TSVpFLCAwLCAwKTsKKyAgR1NUX0JVRkZFUl9EVFMgKGJ1ZikgPSBkdHM7CisKKyAgZ3N0X3J0cF9idWZmZXJfbWFwIChidWYsIEdTVF9NQVBfUkVBRFdSSVRFLCAmcnRwKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3BheWxvYWRfdHlwZSAoJnJ0cCwgVEVTVF9CVUZfUFQpOworICBnc3RfcnRwX2J1ZmZlcl9zZXRfc2VxICgmcnRwLCBzZXFfbnVtKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3RpbWVzdGFtcCAoJnJ0cCwgcnRwX3RzKTsKKyAgZ3N0X3J0cF9idWZmZXJfc2V0X3NzcmMgKCZydHAsIHNzcmMpOworCisgIHBheWxvYWQgPSBnc3RfcnRwX2J1ZmZlcl9nZXRfcGF5bG9hZCAoJnJ0cCk7CisgIGZvciAoaSA9IDA7IGkgPCBURVNUX0JVRl9TSVpFOyBpKyspCisgICAgcGF5bG9hZFtpXSA9IDB4ZmY7CisKKyAgZ3N0X3J0cF9idWZmZXJfdW5tYXAgKCZydHApOworCisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBHc3RCdWZmZXIgKgorZ2VuZXJhdGVfdGVzdF9idWZmZXIgKGd1aW50IHNlcV9udW0sIGd1aW50IHNzcmMpCit7CisgIHJldHVybiBnZW5lcmF0ZV90ZXN0X2J1ZmZlcl9mdWxsIChzZXFfbnVtICogVEVTVF9CVUZfRFVSQVRJT04sCisgICAgICBzZXFfbnVtLCBzZXFfbnVtICogVEVTVF9SVFBfVFNfRFVSQVRJT04sIHNzcmMpOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICBHc3RIYXJuZXNzICpzZW5kX3J0cF9oOworICBHc3RIYXJuZXNzICpyZWN2X3J0cF9oOworICBHc3RIYXJuZXNzICpydGNwX2g7CisKKyAgR3N0RWxlbWVudCAqc2Vzc2lvbjsKKyAgR09iamVjdCAqaW50ZXJuYWxfc2Vzc2lvbjsKKyAgR3N0VGVzdENsb2NrICp0ZXN0Y2xvY2s7CisgIEdzdENhcHMgKmNhcHM7Cit9IFNlc3Npb25IYXJuZXNzOworCitzdGF0aWMgR3N0Q2FwcyAqCitfcHRfbWFwX3JlcXVlc3RlZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIGd1aW50IHB0LCBncG9pbnRlciBkYXRhKQoreworICBTZXNzaW9uSGFybmVzcyAqaCA9IGRhdGE7CisgIHJldHVybiBnc3RfY2Fwc19jb3B5IChoLT5jYXBzKTsKK30KKworc3RhdGljIFNlc3Npb25IYXJuZXNzICoKK3Nlc3Npb25faGFybmVzc19uZXcgKHZvaWQpCit7CisgIFNlc3Npb25IYXJuZXNzICpoID0gZ19uZXcwIChTZXNzaW9uSGFybmVzcywgMSk7CisgIGgtPmNhcHMgPSBnZW5lcmF0ZV9jYXBzICgpOworCisgIGgtPnRlc3RjbG9jayA9IEdTVF9URVNUX0NMT0NLX0NBU1QgKGdzdF90ZXN0X2Nsb2NrX25ldyAoKSk7CisgIGdzdF9zeXN0ZW1fY2xvY2tfc2V0X2RlZmF1bHQgKEdTVF9DTE9DS19DQVNUIChoLT50ZXN0Y2xvY2spKTsKKworICBoLT5zZXNzaW9uID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwc2Vzc2lvbiIsIE5VTEwpOworICBnc3RfZWxlbWVudF9zZXRfY2xvY2sgKGgtPnNlc3Npb24sIEdTVF9DTE9DS19DQVNUIChoLT50ZXN0Y2xvY2spKTsKKworICBoLT5zZW5kX3J0cF9oID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfZWxlbWVudCAoaC0+c2Vzc2lvbiwKKyAgICAgICJzZW5kX3J0cF9zaW5rIiwgInNlbmRfcnRwX3NyYyIpOworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHMgKGgtPnNlbmRfcnRwX2gsIGdzdF9jYXBzX2NvcHkgKGgtPmNhcHMpKTsKKworICBoLT5yZWN2X3J0cF9oID0gZ3N0X2hhcm5lc3NfbmV3X3dpdGhfZWxlbWVudCAoaC0+c2Vzc2lvbiwKKyAgICAgICJyZWN2X3J0cF9zaW5rIiwgInJlY3ZfcnRwX3NyYyIpOworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHMgKGgtPnJlY3ZfcnRwX2gsIGdzdF9jYXBzX2NvcHkgKGgtPmNhcHMpKTsKKworICBoLT5ydGNwX2ggPSBnc3RfaGFybmVzc19uZXdfd2l0aF9lbGVtZW50IChoLT5zZXNzaW9uLAorICAgICAgInJlY3ZfcnRjcF9zaW5rIiwgInNlbmRfcnRjcF9zcmMiKTsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoaC0+cnRjcF9oLCAiYXBwbGljYXRpb24veC1ydGNwIik7CisKKyAgZ19zaWduYWxfY29ubmVjdCAoaC0+c2Vzc2lvbiwgInJlcXVlc3QtcHQtbWFwIiwKKyAgICAgIChHQ2FsbGJhY2spIF9wdF9tYXBfcmVxdWVzdGVkLCBoKTsKKworICBnX29iamVjdF9nZXQgKGgtPnNlc3Npb24sICJpbnRlcm5hbC1zZXNzaW9uIiwgJmgtPmludGVybmFsX3Nlc3Npb24sIE5VTEwpOworCisgIHJldHVybiBoOworfQorCitzdGF0aWMgdm9pZAorc2Vzc2lvbl9oYXJuZXNzX2ZyZWUgKFNlc3Npb25IYXJuZXNzICogaCkKK3sKKyAgZ3N0X3N5c3RlbV9jbG9ja19zZXRfZGVmYXVsdCAoTlVMTCk7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGgtPmNhcHMpOworICBnc3Rfb2JqZWN0X3VucmVmIChoLT50ZXN0Y2xvY2spOworCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoLT5ydGNwX2gpOworICBnc3RfaGFybmVzc190ZWFyZG93biAoaC0+cmVjdl9ydHBfaCk7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoLT5zZW5kX3J0cF9oKTsKKworICBnX29iamVjdF91bnJlZiAoaC0+aW50ZXJuYWxfc2Vzc2lvbik7CisgIGdzdF9vYmplY3RfdW5yZWYgKGgtPnNlc3Npb24pOworICBnX2ZyZWUgKGgpOworfQorCitzdGF0aWMgR3N0Rmxvd1JldHVybgorc2Vzc2lvbl9oYXJuZXNzX3NlbmRfcnRwIChTZXNzaW9uSGFybmVzcyAqIGgsIEdzdEJ1ZmZlciAqIGJ1ZikKK3sKKyAgcmV0dXJuIGdzdF9oYXJuZXNzX3B1c2ggKGgtPnNlbmRfcnRwX2gsIGJ1Zik7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCitzZXNzaW9uX2hhcm5lc3NfcmVjdl9ydHAgKFNlc3Npb25IYXJuZXNzICogaCwgR3N0QnVmZmVyICogYnVmKQoreworICByZXR1cm4gZ3N0X2hhcm5lc3NfcHVzaCAoaC0+cmVjdl9ydHBfaCwgYnVmKTsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK3Nlc3Npb25faGFybmVzc19yZWN2X3J0Y3AgKFNlc3Npb25IYXJuZXNzICogaCwgR3N0QnVmZmVyICogYnVmKQoreworICByZXR1cm4gZ3N0X2hhcm5lc3NfcHVzaCAoaC0+cnRjcF9oLCBidWYpOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK3Nlc3Npb25faGFybmVzc19wdWxsX3J0Y3AgKFNlc3Npb25IYXJuZXNzICogaCkKK3sKKyAgcmV0dXJuIGdzdF9oYXJuZXNzX3B1bGwgKGgtPnJ0Y3BfaCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXNzaW9uX2hhcm5lc3NfY3JhbmtfY2xvY2sgKFNlc3Npb25IYXJuZXNzICogaCkKK3sKKyAgZ3N0X3Rlc3RfY2xvY2tfY3JhbmsgKGgtPnRlc3RjbG9jayk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorc2Vzc2lvbl9oYXJuZXNzX2FkdmFuY2VfYW5kX2NyYW5rIChTZXNzaW9uSGFybmVzcyAqIGgsCisgICAgR3N0Q2xvY2tUaW1lIGRlbHRhKQoreworICBHc3RDbG9ja0lEIHJlcywgcGVuZGluZzsKKyAgZ2Jvb2xlYW4gcmVzdWx0OworICBnc3RfdGVzdF9jbG9ja193YWl0X2Zvcl9uZXh0X3BlbmRpbmdfaWQgKGgtPnRlc3RjbG9jaywgJnBlbmRpbmcpOworICBnc3RfdGVzdF9jbG9ja19hZHZhbmNlX3RpbWUgKGgtPnRlc3RjbG9jaywgZGVsdGEpOworICByZXMgPSBnc3RfdGVzdF9jbG9ja19wcm9jZXNzX25leHRfY2xvY2tfaWQgKGgtPnRlc3RjbG9jayk7CisgIGlmIChyZXMgPT0gcGVuZGluZykKKyAgICByZXN1bHQgPSBUUlVFOworICBlbHNlCisgICAgcmVzdWx0ID0gRkFMU0U7CisgIGlmIChyZXMpCisgICAgZ3N0X2Nsb2NrX2lkX3VucmVmIChyZXMpOworICBnc3RfY2xvY2tfaWRfdW5yZWYgKHBlbmRpbmcpOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorc2Vzc2lvbl9oYXJuZXNzX3Byb2R1Y2VfcnRjcCAoU2Vzc2lvbkhhcm5lc3MgKiBoLCBnaW50IG51bV9ydGNwX3BhY2tldHMpCit7CisgIC8qIGR1ZSB0byByYW5kb21uZXNzIGluIHJlc2NoZWR1bGluZyBvZiBSVENQIHRpbWVvdXQsIHdlIG5lZWQgdG8KKyAgICAga2VlcCBjcmFua2luZyB1bnRpbCB3ZSBoYXZlIHRoZSBkZXNpcmVkIGFtb3VudCBvZiBwYWNrZXRzICovCisgIHdoaWxlIChnc3RfaGFybmVzc19idWZmZXJzX2luX3F1ZXVlIChoLT5ydGNwX2gpIDwgbnVtX3J0Y3BfcGFja2V0cykKKyAgICBzZXNzaW9uX2hhcm5lc3NfY3JhbmtfY2xvY2sgKGgpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tdWx0aXBsZV9zc3JjX3JyKQoreworICBTZXNzaW9uSGFybmVzcyAqaCA9IHNlc3Npb25faGFybmVzc19uZXcgKCk7CisgIEdzdEZsb3dSZXR1cm4gcmVzOworICBHc3RCdWZmZXIgKmluX2J1ZiwgKm91dF9idWY7CisgIEdzdFJUQ1BCdWZmZXIgcnRjcCA9IEdTVF9SVENQX0JVRkZFUl9JTklUOworICBHc3RSVENQUGFja2V0IHJ0Y3BfcGFja2V0OworICBnaW50IGksIGo7CisKKyAgZ3VpbnQgc3NyY3NbXSA9IHsKKyAgICAweDAxQkFEQkFELAorICAgIDB4REVBREJFRUYsCisgIH07CisKKyAgLyogcmVjZWl2ZSBidWZmZXJzIHdpdGggbXVsdGlwbGUgc3NyY3MgKi8KKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCBHX05fRUxFTUVOVFMgKHNzcmNzKTsgaisrKSB7CisgICAgICBpbl9idWYgPSBnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoaSwgc3NyY3Nbal0pOworICAgICAgcmVzID0gc2Vzc2lvbl9oYXJuZXNzX3JlY3ZfcnRwIChoLCBpbl9idWYpOworICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIHJlcyk7CisgICAgfQorICB9CisKKyAgLyogY3JhbmsgdGhlIHJ0Y3AtdGhyZWFkIGFuZCBwdWxsIG91dCB0aGUgcnRjcC1wYWNrZXQgd2UgaGF2ZSBnZW5lcmF0ZWQgKi8KKyAgc2Vzc2lvbl9oYXJuZXNzX2NyYW5rX2Nsb2NrIChoKTsKKyAgb3V0X2J1ZiA9IHNlc3Npb25faGFybmVzc19wdWxsX3J0Y3AgKGgpOworCisgIC8qIHZlcmlmeSB3ZSBoYXZlIHJlcG9ydCBibG9ja3MgZm9yIGJvdGggc3NyY3MgKi8KKyAgZ19hc3NlcnQgKG91dF9idWYgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfcnRjcF9idWZmZXJfdmFsaWRhdGUgKG91dF9idWYpKTsKKyAgZ3N0X3J0Y3BfYnVmZmVyX21hcCAob3V0X2J1ZiwgR1NUX01BUF9SRUFELCAmcnRjcCk7CisgIGdfYXNzZXJ0IChnc3RfcnRjcF9idWZmZXJfZ2V0X2ZpcnN0X3BhY2tldCAoJnJ0Y3AsICZydGNwX3BhY2tldCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfUlRDUF9UWVBFX1JSLAorICAgICAgZ3N0X3J0Y3BfcGFja2V0X2dldF90eXBlICgmcnRjcF9wYWNrZXQpKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHX05fRUxFTUVOVFMgKHNzcmNzKSwKKyAgICAgIGdzdF9ydGNwX3BhY2tldF9nZXRfcmJfY291bnQgKCZydGNwX3BhY2tldCkpOworCisgIGZvciAoaiA9IDA7IGogPCBHX05fRUxFTUVOVFMgKHNzcmNzKTsgaisrKSB7CisgICAgZ3VpbnQzMiBzc3JjOworICAgIGdzdF9ydGNwX3BhY2tldF9nZXRfcmIgKCZydGNwX3BhY2tldCwgaiwgJnNzcmMsCisgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHNzcmNzW2pdLCBzc3JjKTsKKyAgfQorCisgIGdzdF9ydGNwX2J1ZmZlcl91bm1hcCAoJnJ0Y3ApOworICBnc3RfYnVmZmVyX3VucmVmIChvdXRfYnVmKTsKKworICBzZXNzaW9uX2hhcm5lc3NfZnJlZSAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogVGhpcyB2ZXJpZmllcyB0aGF0IHJ0cHNlc3Npb24gd2lsbCBjb3JyZWN0bHkgcGxhY2UgUkJzIHJvdW5kLXJvYmluCisgKiBhY3Jvc3MgbXVsdGlwbGUgUlJzIHdoZW4gdGhlcmUgYXJlIHRvbyBtYW55IHNlbmRlcnMgdGhhdCB0aGVpciBSQnMKKyAqIGRvIG5vdCBmaXQgaW4gb25lIFJSICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF9tdWx0aXBsZV9zZW5kZXJzX3JvdW5kcm9iaW5fcmJzKQoreworICBTZXNzaW9uSGFybmVzcyAqaCA9IHNlc3Npb25faGFybmVzc19uZXcgKCk7CisgIEdzdEZsb3dSZXR1cm4gcmVzOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0UlRDUEJ1ZmZlciBydGNwID0gR1NUX1JUQ1BfQlVGRkVSX0lOSVQ7CisgIEdzdFJUQ1BQYWNrZXQgcnRjcF9wYWNrZXQ7CisgIGdpbnQgaSwgaiwgazsKKyAgZ3VpbnQzMiBzc3JjOworICBHSGFzaFRhYmxlICpyYl9zc3JjcywgKnRtcF9zZXQ7CisKKyAgZ19vYmplY3Rfc2V0IChoLT5pbnRlcm5hbF9zZXNzaW9uLCAiaW50ZXJuYWwtc3NyYyIsIDB4REVBREJFRUYsIE5VTEwpOworCisgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsgICAgIC8qIGN5Y2xlcyBiZXR3ZWVuIFJSIHJlcG9ydHMgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgNTsgaisrKSB7ICAgLyogcGFja2V0cyBwZXIgc3NyYyAqLworICAgICAgZ2ludCBzZXEgPSAoaSAqIDUpICsgajsKKyAgICAgIGZvciAoayA9IDA7IGsgPCAzNTsgaysrKSB7ICAgICAgICAvKiBudW1iZXIgb2Ygc3NyY3MgKi8KKyAgICAgICAgYnVmID0gZ2VuZXJhdGVfdGVzdF9idWZmZXIgKHNlcSwgMTAwMDAgKyBrKTsKKyAgICAgICAgcmVzID0gc2Vzc2lvbl9oYXJuZXNzX3JlY3ZfcnRwIChoLCBidWYpOworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgcmVzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByYl9zc3JjcyA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19kaXJlY3RfaGFzaCwgZ19kaXJlY3RfZXF1YWwsIE5VTEwsCisgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdfaGFzaF90YWJsZV91bnJlZik7CisKKyAgLyogdmVyaWZ5IHRoZSBydGNwIHBhY2tldHMgKi8KKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgIGd1aW50IGV4cGVjdGVkX3JiX2NvdW50ID0gKGkgPCAxKSA/IEdTVF9SVENQX01BWF9SQl9DT1VOVCA6CisgICAgICAgICgzNSAtIEdTVF9SVENQX01BWF9SQl9DT1VOVCk7CisKKyAgICBzZXNzaW9uX2hhcm5lc3NfcHJvZHVjZV9ydGNwIChoLCAxKTsKKyAgICBidWYgPSBzZXNzaW9uX2hhcm5lc3NfcHVsbF9ydGNwIChoKTsKKyAgICBnX2Fzc2VydCAoYnVmICE9IE5VTEwpOworICAgIGZhaWxfdW5sZXNzIChnc3RfcnRjcF9idWZmZXJfdmFsaWRhdGUgKGJ1ZikpOworCisgICAgZ3N0X3J0Y3BfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQUQsICZydGNwKTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3J0Y3BfYnVmZmVyX2dldF9maXJzdF9wYWNrZXQgKCZydGNwLCAmcnRjcF9wYWNrZXQpKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfUlRDUF9UWVBFX1JSLAorICAgICAgICBnc3RfcnRjcF9wYWNrZXRfZ2V0X3R5cGUgKCZydGNwX3BhY2tldCkpOworCisgICAgc3NyYyA9IGdzdF9ydGNwX3BhY2tldF9ycl9nZXRfc3NyYyAoJnJ0Y3BfcGFja2V0KTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgweERFQURCRUVGLCBzc3JjKTsKKworICAgIC8qIGluc3BlY3QgdGhlIFJCcyAqLworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGV4cGVjdGVkX3JiX2NvdW50LAorICAgICAgICBnc3RfcnRjcF9wYWNrZXRfZ2V0X3JiX2NvdW50ICgmcnRjcF9wYWNrZXQpKTsKKworICAgIGlmIChpID09IDApIHsKKyAgICAgIHRtcF9zZXQgPSBnX2hhc2hfdGFibGVfbmV3IChnX2RpcmVjdF9oYXNoLCBnX2RpcmVjdF9lcXVhbCk7CisgICAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChyYl9zc3JjcywgR1VJTlRfVE9fUE9JTlRFUiAoc3NyYyksIHRtcF9zZXQpOworICAgIH0gZWxzZSB7CisgICAgICB0bXBfc2V0ID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAocmJfc3NyY3MsIEdVSU5UX1RPX1BPSU5URVIgKHNzcmMpKTsKKyAgICAgIGdfYXNzZXJ0ICh0bXBfc2V0KTsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgZXhwZWN0ZWRfcmJfY291bnQ7IGorKykgeworICAgICAgZ3N0X3J0Y3BfcGFja2V0X2dldF9yYiAoJnJ0Y3BfcGFja2V0LCBqLCAmc3NyYywgTlVMTCwgTlVMTCwKKyAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0X2NtcGludCAoc3NyYywgPj0sIDEwMDAwKTsKKyAgICAgIGdfYXNzZXJ0X2NtcGludCAoc3NyYywgPD0sIDEwMDM1KTsKKyAgICAgIGdfaGFzaF90YWJsZV9hZGQgKHRtcF9zZXQsIEdVSU5UX1RPX1BPSU5URVIgKHNzcmMpKTsKKyAgICB9CisKKyAgICBnc3RfcnRjcF9idWZmZXJfdW5tYXAgKCZydGNwKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICB9CisKKyAgLyogbm93IHZlcmlmeSBhbGwgcmVjZWl2ZWQgc3NyY3MgaGF2ZSBiZWVuIHJlcG9ydGVkICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDEsIGdfaGFzaF90YWJsZV9zaXplIChyYl9zc3JjcykpOworICB0bXBfc2V0ID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAocmJfc3NyY3MsIEdVSU5UX1RPX1BPSU5URVIgKDB4REVBREJFRUYpKTsKKyAgZ19hc3NlcnQgKHRtcF9zZXQpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgzNSwgZ19oYXNoX3RhYmxlX3NpemUgKHRtcF9zZXQpKTsKKworICBnX2hhc2hfdGFibGVfdW5yZWYgKHJiX3NzcmNzKTsKKyAgc2Vzc2lvbl9oYXJuZXNzX2ZyZWUgKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ludGVybmFsX3NvdXJjZXNfdGltZW91dCkKK3sKKyAgU2Vzc2lvbkhhcm5lc3MgKmggPSBzZXNzaW9uX2hhcm5lc3NfbmV3ICgpOworICBndWludCBpbnRlcm5hbF9zc3JjOworICBndWludDMyIHNzcmM7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RSVENQQnVmZmVyIHJ0Y3AgPSBHU1RfUlRDUF9CVUZGRVJfSU5JVDsKKyAgR3N0UlRDUFBhY2tldCBydGNwX3BhY2tldDsKKyAgR3N0UlRDUFR5cGUgcnRjcF90eXBlOworICBHc3RGbG93UmV0dXJuIHJlczsKKyAgZ2ludCBpLCBqOworICBHc3RDYXBzICpjYXBzOworICBnYm9vbGVhbiBzZWVuX2J5ZTsKKworICBnX29iamVjdF9zZXQgKGgtPmludGVybmFsX3Nlc3Npb24sICJpbnRlcm5hbC1zc3JjIiwgMHhERUFEQkVFRiwgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoaC0+aW50ZXJuYWxfc2Vzc2lvbiwgImludGVybmFsLXNzcmMiLCAmaW50ZXJuYWxfc3NyYywgTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDB4REVBREJFRUYsIGludGVybmFsX3NzcmMpOworCisgIGZvciAoaSA9IDE7IGkgPCA0OyBpKyspIHsKKyAgICBidWYgPSBnZW5lcmF0ZV90ZXN0X2J1ZmZlciAoaSwgMHhCRUVGREVBRCk7CisgICAgcmVzID0gc2Vzc2lvbl9oYXJuZXNzX3JlY3ZfcnRwIChoLCBidWYpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCByZXMpOworICB9CisKKyAgLyogdmVyaWZ5IHRoYXQgcnRwc2Vzc2lvbiBoYXMgc2VudCBSUiBmb3IgYW4gaW50ZXJuYWxseS1jcmVhdGVkCisgICAqIFJUUFNvdXJjZSB0aGF0IGlzIHVzaW5nIHRoZSBpbnRlcm5hbC1zc3JjICovCisgIHNlc3Npb25faGFybmVzc19wcm9kdWNlX3J0Y3AgKGgsIDEpOworICBidWYgPSBzZXNzaW9uX2hhcm5lc3NfcHVsbF9ydGNwIChoKTsKKworICBmYWlsX3VubGVzcyAoYnVmICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X3J0Y3BfYnVmZmVyX3ZhbGlkYXRlIChidWYpKTsKKyAgZ3N0X3J0Y3BfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQUQsICZydGNwKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9ydGNwX2J1ZmZlcl9nZXRfZmlyc3RfcGFja2V0ICgmcnRjcCwgJnJ0Y3BfcGFja2V0KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9SVENQX1RZUEVfUlIsCisgICAgICBnc3RfcnRjcF9wYWNrZXRfZ2V0X3R5cGUgKCZydGNwX3BhY2tldCkpOworICBzc3JjID0gZ3N0X3J0Y3BfcGFja2V0X3JyX2dldF9zc3JjICgmcnRjcF9wYWNrZXQpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChzc3JjLCBpbnRlcm5hbF9zc3JjKTsKKyAgZ3N0X3J0Y3BfYnVmZmVyX3VubWFwICgmcnRjcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisKKyAgLyogb2ssIG5vdyBsZXQncyBwdXNoIHNvbWUgUlRQIHBhY2tldHMgKi8KKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhcHBsaWNhdGlvbi94LXJ0cCIsCisgICAgICAic3NyYyIsIEdfVFlQRV9VSU5ULCAweDAxQkFEQkFELCBOVUxMKTsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzIChoLT5zZW5kX3J0cF9oLCBjYXBzKTsKKworICBmb3IgKGkgPSAxOyBpIDwgNDsgaSsrKSB7CisgICAgYnVmID0gZ2VuZXJhdGVfdGVzdF9idWZmZXIgKGksIDB4MDFCQURCQUQpOworICAgIHJlcyA9IHNlc3Npb25faGFybmVzc19zZW5kX3J0cCAoaCwgYnVmKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywgcmVzKTsKKyAgfQorCisgIC8qIGludGVybmFsIHNzcmMgbXVzdCBoYXZlIGNoYW5nZWQgYWxyZWFkeSAqLworICBnX29iamVjdF9nZXQgKGgtPmludGVybmFsX3Nlc3Npb24sICJpbnRlcm5hbC1zc3JjIiwgJmludGVybmFsX3NzcmMsIE5VTEwpOworICBmYWlsX3VubGVzcyAoaW50ZXJuYWxfc3NyYyAhPSBzc3JjKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMHgwMUJBREJBRCwgaW50ZXJuYWxfc3NyYyk7CisKKyAgLyogdmVyaWZ5IFNSIGFuZCBSUiAqLworICBqID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgIHNlc3Npb25faGFybmVzc19wcm9kdWNlX3J0Y3AgKGgsIDEpOworICAgIGJ1ZiA9IHNlc3Npb25faGFybmVzc19wdWxsX3J0Y3AgKGgpOworICAgIGdfYXNzZXJ0IChidWYgIT0gTlVMTCk7CisgICAgZmFpbF91bmxlc3MgKGdzdF9ydGNwX2J1ZmZlcl92YWxpZGF0ZSAoYnVmKSk7CisgICAgZ3N0X3J0Y3BfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQUQsICZydGNwKTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3J0Y3BfYnVmZmVyX2dldF9maXJzdF9wYWNrZXQgKCZydGNwLCAmcnRjcF9wYWNrZXQpKTsKKyAgICBydGNwX3R5cGUgPSBnc3RfcnRjcF9wYWNrZXRfZ2V0X3R5cGUgKCZydGNwX3BhY2tldCk7CisKKyAgICBpZiAocnRjcF90eXBlID09IEdTVF9SVENQX1RZUEVfU1IpIHsKKyAgICAgIGdzdF9ydGNwX3BhY2tldF9zcl9nZXRfc2VuZGVyX2luZm8gKCZydGNwX3BhY2tldCwgJnNzcmMsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgTlVMTCk7CisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChpbnRlcm5hbF9zc3JjLCBzc3JjKTsKKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDB4MDFCQURCQUQsIHNzcmMpOworICAgICAgaiB8PSAweDE7CisgICAgfSBlbHNlIGlmIChydGNwX3R5cGUgPT0gR1NUX1JUQ1BfVFlQRV9SUikgeworICAgICAgc3NyYyA9IGdzdF9ydGNwX3BhY2tldF9ycl9nZXRfc3NyYyAoJnJ0Y3BfcGFja2V0KTsKKyAgICAgIGZhaWxfdW5sZXNzIChpbnRlcm5hbF9zc3JjICE9IHNzcmMpOworICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMHhERUFEQkVFRiwgc3NyYyk7CisgICAgICBqIHw9IDB4MjsKKyAgICB9CisgICAgZ3N0X3J0Y3BfYnVmZmVyX3VubWFwICgmcnRjcCk7CisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmKTsKKyAgfQorICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgweDMsIGopOyAvKiB2ZXJpZnkgd2UgZ290IGJvdGggU1IgYW5kIFJSICovCisKKyAgLyogZ28gMzAgc2Vjb25kcyBpbiB0aGUgZnV0dXJlIGFuZCBvYnNlcnZlIGJvdGggc291cmNlcyB0aW1pbmcgb3V0OgorICAgKiAweERFQURCRUVGIC0+IEJZRSwgMHgwMUJBREJBRCAtPiBiZWNvbWVzIHJlY2VpdmVyIG9ubHkgKi8KKyAgZmFpbF91bmxlc3MgKHNlc3Npb25faGFybmVzc19hZHZhbmNlX2FuZF9jcmFuayAoaCwgMzAgKiBHU1RfU0VDT05EKSk7CisKKyAgLyogdmVyaWZ5IEJZRSBhbmQgUlIgKi8KKyAgaiA9IDA7CisgIHNlZW5fYnllID0gRkFMU0U7CisgIHdoaWxlICghc2Vlbl9ieWUpIHsKKyAgICBzZXNzaW9uX2hhcm5lc3NfcHJvZHVjZV9ydGNwIChoLCAxKTsKKyAgICBidWYgPSBzZXNzaW9uX2hhcm5lc3NfcHVsbF9ydGNwIChoKTsKKyAgICBmYWlsX3VubGVzcyAoYnVmICE9IE5VTEwpOworICAgIGZhaWxfdW5sZXNzIChnc3RfcnRjcF9idWZmZXJfdmFsaWRhdGUgKGJ1ZikpOworICAgIGdzdF9ydGNwX2J1ZmZlcl9tYXAgKGJ1ZiwgR1NUX01BUF9SRUFELCAmcnRjcCk7CisgICAgZmFpbF91bmxlc3MgKGdzdF9ydGNwX2J1ZmZlcl9nZXRfZmlyc3RfcGFja2V0ICgmcnRjcCwgJnJ0Y3BfcGFja2V0KSk7CisgICAgcnRjcF90eXBlID0gZ3N0X3J0Y3BfcGFja2V0X2dldF90eXBlICgmcnRjcF9wYWNrZXQpOworCisgICAgaWYgKHJ0Y3BfdHlwZSA9PSBHU1RfUlRDUF9UWVBFX1JSKSB7CisgICAgICBzc3JjID0gZ3N0X3J0Y3BfcGFja2V0X3JyX2dldF9zc3JjICgmcnRjcF9wYWNrZXQpOworICAgICAgaWYgKHNzcmMgPT0gMHgwMUJBREJBRCkgeworICAgICAgICBqIHw9IDB4MTsKKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoaW50ZXJuYWxfc3NyYywgc3NyYyk7CisgICAgICAgIC8qIDIgPT4gUlIsIFNERVMuIFRoZXJlIGlzIG5vIEJZRSBoZXJlICovCisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDIsIGdzdF9ydGNwX2J1ZmZlcl9nZXRfcGFja2V0X2NvdW50ICgmcnRjcCkpOworICAgICAgfSBlbHNlIGlmIChzc3JjID09IDB4REVBREJFRUYpIHsKKyAgICAgICAgaiB8PSAweDI7CisgICAgICAgIGdfYXNzZXJ0X2NtcGludCAoc3NyYywgIT0sIGludGVybmFsX3NzcmMpOworICAgICAgICAvKiAzID0+IFJSLCBTREVTLCBCWUUgKi8KKyAgICAgICAgaWYgKGdzdF9ydGNwX2J1ZmZlcl9nZXRfcGFja2V0X2NvdW50ICgmcnRjcCkgPT0gMykgeworICAgICAgICAgIGZhaWxfdW5sZXNzIChnc3RfcnRjcF9wYWNrZXRfbW92ZV90b19uZXh0ICgmcnRjcF9wYWNrZXQpKTsKKyAgICAgICAgICBmYWlsX3VubGVzcyAoZ3N0X3J0Y3BfcGFja2V0X21vdmVfdG9fbmV4dCAoJnJ0Y3BfcGFja2V0KSk7CisgICAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX1JUQ1BfVFlQRV9CWUUsCisgICAgICAgICAgICAgIGdzdF9ydGNwX3BhY2tldF9nZXRfdHlwZSAoJnJ0Y3BfcGFja2V0KSk7CisgICAgICAgICAgc2Vlbl9ieWUgPSBUUlVFOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGdzdF9ydGNwX2J1ZmZlcl91bm1hcCAoJnJ0Y3ApOworICAgIGdzdF9idWZmZXJfdW5yZWYgKGJ1Zik7CisgIH0KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoMHgzLCBqKTsgLyogdmVyaWZ5IHdlIGdvdCBib3RoIEJZRSBhbmQgUlIgKi8KKworICBzZXNzaW9uX2hhcm5lc3NfZnJlZSAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ3VpbnQ4IHN1YnR5cGU7CisgIGd1aW50MzIgc3NyYzsKKyAgZ2NoYXIgKm5hbWU7CisgIEdzdEJ1ZmZlciAqZGF0YTsKK30gUlRDUEFwcFJlc3VsdDsKKworc3RhdGljIHZvaWQKK29uX2FwcF9ydGNwX2NiIChHT2JqZWN0ICogc2Vzc2lvbiwgZ3VpbnQgc3VidHlwZSwgZ3VpbnQgc3NyYywKKyAgICBjb25zdCBnY2hhciAqIG5hbWUsIEdzdEJ1ZmZlciAqIGRhdGEsIFJUQ1BBcHBSZXN1bHQgKiByZXN1bHQpCit7CisgIHJlc3VsdC0+c3VidHlwZSA9IHN1YnR5cGU7CisgIHJlc3VsdC0+c3NyYyA9IHNzcmM7CisgIHJlc3VsdC0+bmFtZSA9IGdfc3RyZHVwIChuYW1lKTsKKyAgcmVzdWx0LT5kYXRhID0gZGF0YSA/IGdzdF9idWZmZXJfcmVmIChkYXRhKSA6IE5VTEw7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3JlY2VpdmVfcnRjcF9hcHBfcGFja2V0KQoreworICBTZXNzaW9uSGFybmVzcyAqaCA9IHNlc3Npb25faGFybmVzc19uZXcgKCk7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RSVENQQnVmZmVyIHJ0Y3AgPSBHU1RfUlRDUF9CVUZGRVJfSU5JVDsKKyAgR3N0UlRDUFBhY2tldCBwYWNrZXQ7CisgIFJUQ1BBcHBSZXN1bHQgcmVzdWx0ID0geyAwIH07CisgIGd1aW50OCBkYXRhW10gPSB7IDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQgfTsKKworICBnX3NpZ25hbF9jb25uZWN0IChoLT5pbnRlcm5hbF9zZXNzaW9uLCAib24tYXBwLXJ0Y3AiLAorICAgICAgR19DQUxMQkFDSyAob25fYXBwX3J0Y3BfY2IpLCAmcmVzdWx0KTsKKworICAvKiBQdXNoIEFQUCBidWZmZXIgd2l0aCBubyBkYXRhICovCisgIGJ1ZiA9IGdzdF9ydGNwX2J1ZmZlcl9uZXcgKDEwMDApOworICBmYWlsX3VubGVzcyAoZ3N0X3J0Y3BfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQURXUklURSwgJnJ0Y3ApKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9ydGNwX2J1ZmZlcl9hZGRfcGFja2V0ICgmcnRjcCwgR1NUX1JUQ1BfVFlQRV9BUFAsICZwYWNrZXQpKTsKKyAgZ3N0X3J0Y3BfcGFja2V0X2FwcF9zZXRfc3VidHlwZSAoJnBhY2tldCwgMjEpOworICBnc3RfcnRjcF9wYWNrZXRfYXBwX3NldF9zc3JjICgmcGFja2V0LCAweDExMTExMTExKTsKKyAgZ3N0X3J0Y3BfcGFja2V0X2FwcF9zZXRfbmFtZSAoJnBhY2tldCwgIlRlc3QiKTsKKyAgZ3N0X3J0Y3BfYnVmZmVyX3VubWFwICgmcnRjcCk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIHNlc3Npb25faGFybmVzc19yZWN2X3J0Y3AgKGgsIGJ1ZikpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDIxLCByZXN1bHQuc3VidHlwZSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDB4MTExMTExMTEsIHJlc3VsdC5zc3JjKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoIlRlc3QiLCByZXN1bHQubmFtZSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19wb2ludGVyIChOVUxMLCByZXN1bHQuZGF0YSk7CisKKyAgZ19mcmVlIChyZXN1bHQubmFtZSk7CisKKyAgLyogUHVzaCBBUFAgYnVmZmVyIHdpdGggZGF0YSAqLworICBtZW1zZXQgKCZyZXN1bHQsIDAsIHNpemVvZiAocmVzdWx0KSk7CisgIGJ1ZiA9IGdzdF9ydGNwX2J1ZmZlcl9uZXcgKDEwMDApOworICBmYWlsX3VubGVzcyAoZ3N0X3J0Y3BfYnVmZmVyX21hcCAoYnVmLCBHU1RfTUFQX1JFQURXUklURSwgJnJ0Y3ApKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9ydGNwX2J1ZmZlcl9hZGRfcGFja2V0ICgmcnRjcCwgR1NUX1JUQ1BfVFlQRV9BUFAsICZwYWNrZXQpKTsKKyAgZ3N0X3J0Y3BfcGFja2V0X2FwcF9zZXRfc3VidHlwZSAoJnBhY2tldCwgMjIpOworICBnc3RfcnRjcF9wYWNrZXRfYXBwX3NldF9zc3JjICgmcGFja2V0LCAweDIyMjIyMjIyKTsKKyAgZ3N0X3J0Y3BfcGFja2V0X2FwcF9zZXRfbmFtZSAoJnBhY2tldCwgIlRlc3QiKTsKKyAgZ3N0X3J0Y3BfcGFja2V0X2FwcF9zZXRfZGF0YV9sZW5ndGggKCZwYWNrZXQsIHNpemVvZiAoZGF0YSkgLyA0KTsKKyAgbWVtY3B5IChnc3RfcnRjcF9wYWNrZXRfYXBwX2dldF9kYXRhICgmcGFja2V0KSwgZGF0YSwgc2l6ZW9mIChkYXRhKSk7CisgIGdzdF9ydGNwX2J1ZmZlcl91bm1hcCAoJnJ0Y3ApOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9GTE9XX09LLCBzZXNzaW9uX2hhcm5lc3NfcmVjdl9ydGNwIChoLCBidWYpKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgyMiwgcmVzdWx0LnN1YnR5cGUpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgweDIyMjIyMjIyLCByZXN1bHQuc3NyYyk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKCJUZXN0IiwgcmVzdWx0Lm5hbWUpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKHJlc3VsdC5kYXRhLCAwLCBkYXRhLCBzaXplb2YgKGRhdGEpKSA9PSAwKTsKKworICBnX2ZyZWUgKHJlc3VsdC5uYW1lKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAocmVzdWx0LmRhdGEpOworCisgIHNlc3Npb25faGFybmVzc19mcmVlIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgdm9pZAorc3RhdHNfdGVzdF9jYiAoR09iamVjdCAqIG9iamVjdCwgR1BhcmFtU3BlYyAqIHNwZWMsIGdwb2ludGVyIGRhdGEpCit7CisgIGd1aW50IG51bV9zb3VyY2VzID0gMDsKKyAgZ2Jvb2xlYW4gKmNiX2NhbGxlZCA9IGRhdGE7CisgIGdfYXNzZXJ0ICgqY2JfY2FsbGVkID09IEZBTFNFKTsKKyAgKmNiX2NhbGxlZCA9IFRSVUU7CisKKyAgLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGEgcnRwc2Vzc2lvbiBwcm9wZXJ0eQorICAgICB3aXRob3V0IGludHJvZHVjaW5nIHRoZSBkZWFkbG9jayAqLworICBnX29iamVjdF9nZXQgKG9iamVjdCwgIm51bS1zb3VyY2VzIiwgJm51bV9zb3VyY2VzLCBOVUxMKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZG9udF9sb2NrX29uX3N0YXRzKQoreworICBHc3RIYXJuZXNzICpoX3J0Y3A7CisgIEdzdEhhcm5lc3MgKmhfc2VuZDsKKyAgR3N0Q2xvY2sgKmNsb2NrID0gZ3N0X3Rlc3RfY2xvY2tfbmV3ICgpOworICBHc3RUZXN0Q2xvY2sgKnRlc3RjbG9jayA9IEdTVF9URVNUX0NMT0NLIChjbG9jayk7CisgIGdib29sZWFuIGNiX2NhbGxlZCA9IEZBTFNFOworCisgIC8qIHVzZSB0ZXN0Y2xvY2sgYXMgdGhlIHN5c3RlbWNsb2NrIHRvIGNhcHR1cmUgdGhlIHJ0Y3AgdGhyZWFkIHdhaXRzICovCisgIGdzdF9zeXN0ZW1fY2xvY2tfc2V0X2RlZmF1bHQgKEdTVF9DTE9DSyAodGVzdGNsb2NrKSk7CisKKyAgaF9ydGNwID0KKyAgICAgIGdzdF9oYXJuZXNzX25ld193aXRoX3BhZG5hbWVzICgicnRwc2Vzc2lvbiIsICJyZWN2X3J0Y3Bfc2luayIsCisgICAgICAic2VuZF9ydGNwX3NyYyIpOworICBoX3NlbmQgPQorICAgICAgZ3N0X2hhcm5lc3NfbmV3X3dpdGhfZWxlbWVudCAoaF9ydGNwLT5lbGVtZW50LCAic2VuZF9ydHBfc2luayIsCisgICAgICAic2VuZF9ydHBfc3JjIik7CisKKyAgLyogY29ubmVjdCB0byB0aGUgc3RhdHMtcmVwb3J0aW5nICovCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGhfcnRjcC0+ZWxlbWVudCwgIm5vdGlmeTo6c3RhdHMiLAorICAgICAgR19DQUxMQkFDSyAoc3RhdHNfdGVzdF9jYiksICZjYl9jYWxsZWQpOworCisgIC8qICJjcmFuayIgYW5kIGNoZWNrIHRoZSBzdGF0cyAqLworICBnX2Fzc2VydCAoZ3N0X3Rlc3RfY2xvY2tfY3JhbmsgKHRlc3RjbG9jaykpOworICBnc3RfYnVmZmVyX3VucmVmIChnc3RfaGFybmVzc19wdWxsIChoX3J0Y3ApKTsKKyAgZmFpbF91bmxlc3MgKGNiX2NhbGxlZCk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGhfc2VuZCk7CisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoX3J0Y3ApOworICBnc3Rfb2JqZWN0X3VucmVmIChjbG9jayk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIHZvaWQKK3N1c3BpY2lvdXNfYnllX2NiIChHT2JqZWN0ICogb2JqZWN0LCBHUGFyYW1TcGVjICogc3BlYywgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR1ZhbHVlQXJyYXkgKnN0YXRzX2FycjsKKyAgR3N0U3RydWN0dXJlICpzdGF0cywgKmludGVybmFsX3N0YXRzOworICBnYm9vbGVhbiAqY2JfY2FsbGVkID0gZGF0YTsKKyAgZ2Jvb2xlYW4gaW50ZXJuYWwgPSBGQUxTRSwgc2VudF9ieWUgPSBUUlVFOworICBndWludCBzc3JjID0gMDsKKyAgZ3VpbnQgaTsKKworICBnX2Fzc2VydCAoKmNiX2NhbGxlZCA9PSBGQUxTRSk7CisgICpjYl9jYWxsZWQgPSBUUlVFOworCisgIGdfb2JqZWN0X2dldCAob2JqZWN0LCAic3RhdHMiLCAmc3RhdHMsIE5VTEwpOworICBzdGF0c19hcnIgPQorICAgICAgZ192YWx1ZV9nZXRfYm94ZWQgKGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdGF0cywgInNvdXJjZS1zdGF0cyIpKTsKKyAgZ19hc3NlcnQgKHN0YXRzX2FyciAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHN0YXRzX2Fyci0+bl92YWx1ZXMgPj0gMSk7CisKKyAgZm9yIChpID0gMDsgaSA8IHN0YXRzX2Fyci0+bl92YWx1ZXM7IGkrKykgeworICAgIGludGVybmFsX3N0YXRzID0gZ192YWx1ZV9nZXRfYm94ZWQgKGdfdmFsdWVfYXJyYXlfZ2V0X250aCAoc3RhdHNfYXJyLCBpKSk7CisgICAgZ19hc3NlcnQgKGludGVybmFsX3N0YXRzICE9IE5VTEwpOworCisgICAgZ3N0X3N0cnVjdHVyZV9nZXQgKGludGVybmFsX3N0YXRzLAorICAgICAgICAic3NyYyIsIEdfVFlQRV9VSU5ULCAmc3NyYywKKyAgICAgICAgImludGVybmFsIiwgR19UWVBFX0JPT0xFQU4sICZpbnRlcm5hbCwKKyAgICAgICAgInJlY2VpdmVkLWJ5ZSIsIEdfVFlQRV9CT09MRUFOLCAmc2VudF9ieWUsIE5VTEwpOworCisgICAgaWYgKHNzcmMgPT0gMHhERUFEQkVFRikgeworICAgICAgZmFpbF91bmxlc3MgKGludGVybmFsKTsKKyAgICAgIGZhaWxfdW5sZXNzICghc2VudF9ieWUpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHNzcmMsIDB4REVBREJFRUYpOworCisgIGdzdF9zdHJ1Y3R1cmVfZnJlZSAoc3RhdHMpOworfQorCitzdGF0aWMgR3N0QnVmZmVyICoKK2NyZWF0ZV9ieWVfcnRjcCAoZ3VpbnQzMiBzc3JjKQoreworICBHc3RSVENQUGFja2V0IHBhY2tldDsKKyAgR3N0UlRDUEJ1ZmZlciBydGNwID0gR1NUX1JUQ1BfQlVGRkVSX0lOSVQ7CisgIEdTb2NrZXRBZGRyZXNzICpzYWRkcjsKKyAgR3N0QnVmZmVyICpidWZmZXIgPSBnc3RfcnRjcF9idWZmZXJfbmV3ICgxMDAwKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3J0Y3BfYnVmZmVyX21hcCAoYnVmZmVyLCBHU1RfTUFQX1JFQURXUklURSwgJnJ0Y3ApKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9ydGNwX2J1ZmZlcl9hZGRfcGFja2V0ICgmcnRjcCwgR1NUX1JUQ1BfVFlQRV9CWUUsICZwYWNrZXQpKTsKKyAgZ3N0X3J0Y3BfcGFja2V0X2J5ZV9hZGRfc3NyYyAoJnBhY2tldCwgc3NyYyk7CisgIGdzdF9ydGNwX2J1ZmZlcl91bm1hcCAoJnJ0Y3ApOworCisgIC8qIE5lZWQgdG8gYWRkIG1ldGEgdG8gdHJpZ2dlciBjb2xsaXNpb24gZGV0ZWN0aW9uICovCisgIHNhZGRyID0gZ19pbmV0X3NvY2tldF9hZGRyZXNzX25ld19mcm9tX3N0cmluZyAoIjEyNy4wLjAuMSIsIDM0OTApOworICBnc3RfYnVmZmVyX2FkZF9uZXRfYWRkcmVzc19tZXRhIChidWZmZXIsIHNhZGRyKTsKKyAgZ19vYmplY3RfdW5yZWYgKHNhZGRyKTsKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaWdub3JlX3N1c3BpY2lvdXNfYnllKQoreworICBTZXNzaW9uSGFybmVzcyAqaCA9IHNlc3Npb25faGFybmVzc19uZXcgKCk7CisgIGdib29sZWFuIGNiX2NhbGxlZCA9IEZBTFNFOworCisgIC8qIGNvbm5lY3QgdG8gdGhlIHN0YXRzLXJlcG9ydGluZyAqLworICBnX3NpZ25hbF9jb25uZWN0IChoLT5zZXNzaW9uLCAibm90aWZ5OjpzdGF0cyIsCisgICAgICBHX0NBTExCQUNLIChzdXNwaWNpb3VzX2J5ZV9jYiksICZjYl9jYWxsZWQpOworCisgIC8qIFB1c2ggUlRQIGJ1ZmZlciBtYWtpbmcgb3VyIGludGVybmFsIFNTUkM9MHhERUFEQkVFRiAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgIHNlc3Npb25faGFybmVzc19zZW5kX3J0cCAoaCwgZ2VuZXJhdGVfdGVzdF9idWZmZXIgKDAsIDB4REVBREJFRUYpKSk7CisKKyAgLyogUmVjZWl2ZSBCWUUgUlRDUCByZWZlcmVuY2luZyBvdXIgaW50ZXJuYWwgU1NSQyghPyEpICgweERFQURCRUVGKSAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfRkxPV19PSywKKyAgICAgIHNlc3Npb25faGFybmVzc19yZWN2X3J0Y3AgKGgsIGNyZWF0ZV9ieWVfcnRjcCAoMHhERUFEQkVFRikpKTsKKworICAvKiAiY3JhbmsiIGFuZCBjaGVjayB0aGUgc3RhdHMgKi8KKyAgc2Vzc2lvbl9oYXJuZXNzX2NyYW5rX2Nsb2NrIChoKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoc2Vzc2lvbl9oYXJuZXNzX3B1bGxfcnRjcCAoaCkpOworICBmYWlsX3VubGVzcyAoY2JfY2FsbGVkKTsKKworICBzZXNzaW9uX2hhcm5lc3NfZnJlZSAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaWxsZWdhbF9ydGNwX2ZiX3BhY2tldCkKK3sKKyAgU2Vzc2lvbkhhcm5lc3MgKmggPSBzZXNzaW9uX2hhcm5lc3NfbmV3ICgpOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgLyogWmVybyBsZW5ndGggUlRDUCBmZWVkYmFjayBwYWNrZXQgKHJlZHVjZWQgc2l6ZSkgKi8KKyAgY29uc3QgZ3VpbnQ4IHJ0Y3BfemVyb19mYl9wa3RbXSA9IHsgMHg4ZiwgMHhjZSwgMHgwMCwgMHgwMCB9OworCisgIGdfb2JqZWN0X3NldCAoaC0+aW50ZXJuYWxfc2Vzc2lvbiwgImludGVybmFsLXNzcmMiLCAweERFQURCRUVGLCBOVUxMKTsKKworICBidWYgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHNpemVvZiAocnRjcF96ZXJvX2ZiX3BrdCkpOworICBnc3RfYnVmZmVyX2ZpbGwgKGJ1ZiwgMCwgcnRjcF96ZXJvX2ZiX3BrdCwgc2l6ZW9mIChydGNwX3plcm9fZmJfcGt0KSk7CisgIEdTVF9CVUZGRVJfRFRTIChidWYpID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZikgPSBHX0dVSU5UNjRfQ09OU1RBTlQgKDApOworCisgIC8qIFB1c2ggdGhlIHBhY2tldCwgdGhpcyBkaWQgcHJldmlvdXNseSBjcmFzaCBiZWNhdXNlIGxlbmd0aCBvZiBwYWNrZXQgd2FzCisgICAqIG5ldmVyIHZhbGlkYXRlZC4gKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssIHNlc3Npb25faGFybmVzc19yZWN2X3J0Y3AgKGgsIGJ1ZikpOworCisgIHNlc3Npb25faGFybmVzc19mcmVlIChoKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorcnRwc2Vzc2lvbl9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJydHBzZXNzaW9uIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X211bHRpcGxlX3NzcmNfcnIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbXVsdGlwbGVfc2VuZGVyc19yb3VuZHJvYmluX3Jicyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9pbnRlcm5hbF9zb3VyY2VzX3RpbWVvdXQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcmVjZWl2ZV9ydGNwX2FwcF9wYWNrZXQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZG9udF9sb2NrX29uX3N0YXRzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2lnbm9yZV9zdXNwaWNpb3VzX2J5ZSk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2lsbGVnYWxfcnRjcF9mYl9wYWNrZXQpOworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHJ0cHNlc3Npb24pOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwdnA5LmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy9ydHB2cDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjMwNjllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvcnRwdnA5LmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBQZXhpcCBBUworICogICBAYXV0aG9yIFN0aWFuIFNlbG5lcyA8c3RpYW5AcGV4aXAuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svY2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0aGFybmVzcy5oPgorCisjZGVmaW5lIFJUUF9WUDlfQ0FQU19TVFIgXAorICAiYXBwbGljYXRpb24veC1ydHAsbWVkaWE9dmlkZW8sZW5jb2RpbmctbmFtZT1WUDksY2xvY2stcmF0ZT05MDAwMCxwYXlsb2FkPTk2IgorCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2RlcGF5X2ZsZXhpYmxlX21vZGUpCit7CisgIC8qIGItYml0LCBlLWJpdCwgZi1iaXQgYW5kIG1hcmtlciBiaXQgc2V0ICovCisgIC8qIEZpcnN0IHBhY2tldCBvZiBmaXJzdCBmcmFtZSwgaGFuZGNyYWZ0ZWQgdG8gYWxzbyBzZXQgdGhlIGUtYml0IGFuZCBtYXJrZXIKKyAgICogYml0IGluIGFkZGl0aW9uIHRvIGNoYW5naW5nIHRoZSBzZXFudW0gKi8KKyAgZ3VpbnQ4IGludHJhW10gPSB7CisgICAgMHg4MCwgMHhmNCwgMHgwMCwgMHgwMCwgMHg0OSwgMHhiNSwgMHhiZSwgMHgzMiwgMHhiMSwgMHgwMSwgMHg2NCwgMHhkMSwKKyAgICAweGJjLCAweDk4LCAweGJmLCAweDAwLCAweDgzLCAweDQ5LCAweDgzLCAweDQyLCAweDAwLCAweDc3LCAweGYwLCAweDQzLAorICAgIDB4NzEsIDB4ZDgsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4NjYsIDB4ODAsIDB4NjAsIDB4MGUsIDB4ZjAsIDB4NWYsIDB4ZmQsCisgIH07CisgIC8qIGItYml0LCBlLWJpdCwgcC1iaXQsIGYtYml0IGFuZCBtYXJrZXIgYml0IHNldCAqLworICAvKiBGaXJzdCBwYWNrZXQgb2Ygc2Vjb25kIGZyYW1lLCBoYW5kY3JhZnRlZCB0byBhbHNvIHNldCB0aGUgZS1iaXQgYW5kCisgICAqIG1hcmtlciBiaXQgaW4gYWRkaXRpb24gdG8gY2hhbmdpbmcgdGhlIHNlcW51bSAqLworICBndWludDggaW50ZXJbXSA9IHsKKyAgICAweDgwLCAweGY0LCAweDAwLCAweDAxLCAweDQ5LCAweGI2LCAweDAyLCAweGMwLCAweGIxLCAweDAxLCAweDY0LCAweGQxLAorICAgIDB4ZmMsIDB4OTgsIDB4YzAsIDB4MDAsIDB4MDIsIDB4ODcsIDB4MDEsIDB4MDAsIDB4MDksIDB4M2YsIDB4MWMsIDB4MTIsCisgICAgMHgwZSwgMHgwYywgMHhkMCwgMHgxYiwgMHhhNywgMHg4MCwgMHg4MCwgMHhiMCwgMHgxOCwgMHgwZiwgMHhkYSwgMHgxMSwKKyAgfTsKKworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3ICgicnRwdnA5ZGVwYXkiKTsKKyAgZ3N0X2hhcm5lc3Nfc2V0X3NyY19jYXBzX3N0ciAoaCwgUlRQX1ZQOV9DQVBTX1NUUik7CisKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksCisgICAgICAgICAgaW50cmEsIHNpemVvZiAoaW50cmEpLCAwLCBzaXplb2YgKGludHJhKSwgTlVMTCwgTlVMTCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgxLCBnc3RfaGFybmVzc19idWZmZXJzX3JlY2VpdmVkIChoKSk7CisKKyAgZ3N0X2hhcm5lc3NfcHVzaCAoaCwgZ3N0X2J1ZmZlcl9uZXdfd3JhcHBlZF9mdWxsIChHU1RfTUVNT1JZX0ZMQUdfUkVBRE9OTFksCisgICAgICAgICAgaW50ZXIsIHNpemVvZiAoaW50ZXIpLCAwLCBzaXplb2YgKGludGVyKSwgTlVMTCwgTlVMTCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgyLCBnc3RfaGFybmVzc19idWZmZXJzX3JlY2VpdmVkIChoKSk7CisKKyAgZ3N0X2hhcm5lc3NfdGVhcmRvd24gKGgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2RlcGF5X25vbl9mbGV4aWJsZV9tb2RlKQoreworICAvKiBiLWJpdCwgZS1iaXQgYW5kICBtYXJrZXIgYml0IHNldC4gZi1iaXQgTk9UIHNldCAqLworICAvKiBGaXJzdCBwYWNrZXQgb2YgZmlyc3QgZnJhbWUsIGhhbmRjcmFmdGVkIHRvIGFsc28gc2V0IHRoZSBlLWJpdCBhbmQgbWFya2VyCisgICAqIGJpdCBpbiBhZGRpdGlvbiB0byBjaGFuZ2luZyB0aGUgc2VxbnVtICovCisgIGd1aW50OCBpbnRyYVtdID0geworICAgIDB4ODAsIDB4ZjQsIDB4MDAsIDB4MDAsIDB4NDksIDB4ODgsIDB4ZDksIDB4ZjgsIDB4YTAsIDB4NmMsIDB4NjUsIDB4NmMsCisgICAgMHg4YywgMHg5OCwgMHhjMCwgMHg4NywgMHgwMSwgMHgwMiwgMHg0OSwgMHgzZiwgMHgxYywgMHgxMiwgMHgwZSwgMHgwYywKKyAgICAweGQwLCAweDFiLCAweGI5LCAweDgwLCAweDgwLCAweGIwLCAweDE4LCAweDBmLCAweGE2LCAweDRkLCAweDAxLCAweGE1CisgIH07CisgIC8qIGItYml0LCBlLWJpdCwgcC1iaXQgIGFuZCBtYXJrZXIgYml0IHNldC4gZi1iaXQgTk9UIHNldCAqLworICAvKiBGaXJzdCBwYWNrZXQgb2Ygc2Vjb25kIGZyYW1lLCBoYW5kY3JhZnRlZCB0byBhbHNvIHNldCB0aGUgZS1iaXQgYW5kCisgICAqIG1hcmtlciBiaXQgaW4gYWRkaXRpb24gdG8gY2hhbmdpbmcgdGhlIHNlcW51bSAqLworICBndWludDggaW50ZXJbXSA9IHsKKyAgICAweDgwLCAweGY0LCAweDAwLCAweDAxLCAweDQ5LCAweDg4LCAweGU1LCAweDM4LCAweGEwLCAweDZjLCAweDY1LCAweDZjLAorICAgIDB4Y2MsIDB4OTgsIDB4YzEsIDB4ODcsIDB4MDEsIDB4MDIsIDB4NDksIDB4M2YsIDB4MWMsIDB4MTIsIDB4MGUsIDB4MGMsCisgICAgMHhkMCwgMHgxYiwgMHg5NywgMHg4MCwgMHg4MCwgMHhiMCwgMHgxOCwgMHgwZiwgMHg4YSwgMHg5ZiwgMHgwMSwgMHhiYworICB9OworCisgIEdzdEhhcm5lc3MgKmggPSBnc3RfaGFybmVzc19uZXcgKCJydHB2cDlkZXBheSIpOworICBnc3RfaGFybmVzc19zZXRfc3JjX2NhcHNfc3RyIChoLCBSVFBfVlA5X0NBUFNfU1RSKTsKKworICBnc3RfaGFybmVzc19wdXNoIChoLCBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwKKyAgICAgICAgICBpbnRyYSwgc2l6ZW9mIChpbnRyYSksIDAsIHNpemVvZiAoaW50cmEpLCBOVUxMLCBOVUxMKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDEsIGdzdF9oYXJuZXNzX2J1ZmZlcnNfcmVjZWl2ZWQgKGgpKTsKKworICBnc3RfaGFybmVzc19wdXNoIChoLCBnc3RfYnVmZmVyX25ld193cmFwcGVkX2Z1bGwgKEdTVF9NRU1PUllfRkxBR19SRUFET05MWSwKKyAgICAgICAgICBpbnRlciwgc2l6ZW9mIChpbnRlciksIDAsIHNpemVvZiAoaW50ZXIpLCBOVUxMLCBOVUxMKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKDIsIGdzdF9oYXJuZXNzX2J1ZmZlcnNfcmVjZWl2ZWQgKGgpKTsKKworICBnc3RfaGFybmVzc190ZWFyZG93biAoaCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCisKK3N0YXRpYyBTdWl0ZSAqCitydHB2cDlfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgicnRwdnA5Iik7CisgIFRDYXNlICp0Y19jaGFpbjsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsICh0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoInZwOWRlcGF5IikpKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2RlcGF5X2ZsZXhpYmxlX21vZGUpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZGVwYXlfbm9uX2ZsZXhpYmxlX21vZGUpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAocnRwdnA5KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3NoYXBld2lwZS5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvc2hhcGV3aXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5MDA4NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3NoYXBld2lwZS5jCkBAIC0wLDAgKzEsMzE2IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKK2dib29sZWFuIGhhdmVfZW9zID0gRkFMU0U7CisKKy8qIEZvciBlYXNlIG9mIHByb2dyYW1taW5nIHdlIHVzZSBnbG9iYWxzIHRvIGtlZXAgcmVmcyBmb3Igb3VyIGZsb2F0aW5nCisgKiBzcmMgYW5kIHNpbmsgcGFkcyB3ZSBjcmVhdGU7IG90aGVyd2lzZSB3ZSBhbHdheXMgaGF2ZSB0byBkbyBnZXRfcGFkLAorICogZ2V0X3BlZXIsIGFuZCB0aGVuIHJlbW92ZSByZWZlcmVuY2VzIGluIGV2ZXJ5IHRlc3QgZnVuY3Rpb24gKi8KK0dzdFBhZCAqbXl2aWRlb3NyY3BhZCwgKm15bWFza3NyY3BhZCwgKm15c2lua3BhZDsKKworCisjZGVmaW5lIFNIQVBFV0lQRV9WSURFT19DQVBTX1NUUklORyAgICBcCisgICAgInZpZGVvL3gtcmF3LCAiIFwKKyAgICAiZm9ybWF0ID0gKHN0cmluZylBWVVWLCAiIFwKKyAgICAid2lkdGggPSA0MDAsICIgXAorICAgICJoZWlnaHQgPSA0MDAsICIgXAorICAgICJmcmFtZXJhdGUgPSAwLzEiCisKKyNkZWZpbmUgU0hBUEVXSVBFX01BU0tfQ0FQU19TVFJJTkcgICAgXAorICAgICJ2aWRlby94LXJhdywgIiBcCisgICAgImZvcm1hdCA9IChzdHJpbmcpR1JBWTgsICIgXAorICAgICJ3aWR0aCA9IDQwMCwgIiBcCisgICAgImhlaWdodCA9IDQwMCwgIiBcCisgICAgImZyYW1lcmF0ZSA9IDAvMSIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoU0hBUEVXSVBFX1ZJREVPX0NBUFNfU1RSSU5HKQorICAgICk7CitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgdmlkZW9zcmN0ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInZpZGVvc3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFNIQVBFV0lQRV9WSURFT19DQVBTX1NUUklORykKKyAgICApOworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIG1hc2tzcmN0ZW1wbGF0ZSA9CitHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoIm1hc2tzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoU0hBUEVXSVBFX01BU0tfQ0FQU19TVFJJTkcpCisgICAgKTsKKworCitzdGF0aWMgR3N0QnVmZmVyICpvdXRwdXQgPSBOVUxMOworCitzdGF0aWMgR3N0Rmxvd1JldHVybgorb25fY2hhaW4gKEdzdFBhZCAqIHBhZCwgR3N0T2JqZWN0ICogcGFyZW50LCBHc3RCdWZmZXIgKiBidWZmZXIpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChvdXRwdXQgPT0gTlVMTCwgR1NUX0ZMT1dfRVJST1IpOworCisgIG91dHB1dCA9IGJ1ZmZlcjsKKyAgcmV0dXJuIEdTVF9GTE9XX09LOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9nZW5lcmFsKQoreworICBHc3RFbGVtZW50ICpzaGFwZXdpcGUsICp2aWRlb3NyYywgKm1hc2tzcmMsICpzaW5rLCAqYmluOworICBHc3RQYWQgKnA7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdEJ1ZmZlciAqbWFzaywgKmlucHV0OworICBndWludCBpLCBqOworICBndWludDggKmRhdGE7CisgIEdzdE1hcEluZm8gbWFwOworCisgIGJpbiA9IGdzdF9iaW5fbmV3ICgibXlzaGFwZXdpcGUiKTsKKyAgdmlkZW9zcmMgPSBnc3RfYmluX25ldyAoIm15dmlkZW9zcmMiKTsKKyAgbWFza3NyYyA9IGdzdF9iaW5fbmV3ICgibXltYXNrc3JjIik7CisgIHNpbmsgPSBnc3RfYmluX25ldyAoIm15c2luayIpOworICBzaGFwZXdpcGUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJzaGFwZXdpcGUiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHNoYXBld2lwZSAhPSBOVUxMKTsKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAoYmluKSwgdmlkZW9zcmMsIG1hc2tzcmMsIHNoYXBld2lwZSwgc2luaywgTlVMTCk7CisKKyAgbXl2aWRlb3NyY3BhZCA9CisgICAgICBnc3RfcGFkX25ld19mcm9tX3N0YXRpY190ZW1wbGF0ZSAoJnZpZGVvc3JjdGVtcGxhdGUsICJ2aWRlb3NyYyIpOworICBnc3RfZWxlbWVudF9hZGRfcGFkICh2aWRlb3NyYywgbXl2aWRlb3NyY3BhZCk7CisKKyAgbXltYXNrc3JjcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZtYXNrc3JjdGVtcGxhdGUsICJtYXNrc3JjIik7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKG1hc2tzcmMsIG15bWFza3NyY3BhZCk7CisKKyAgbXlzaW5rcGFkID0gZ3N0X3BhZF9uZXdfZnJvbV9zdGF0aWNfdGVtcGxhdGUgKCZzaW5rdGVtcGxhdGUsICJzaW5rIik7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKHNpbmssIG15c2lua3BhZCk7CisgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uIChteXNpbmtwYWQsIG9uX2NoYWluKTsKKworICBwID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNoYXBld2lwZSwgInZpZGVvX3NpbmsiKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfbGluayAobXl2aWRlb3NyY3BhZCwgcCkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocCk7CisgIHAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2hhcGV3aXBlLCAibWFza19zaW5rIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKG15bWFza3NyY3BhZCwgcCkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocCk7CisgIHAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2hhcGV3aXBlLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX2xpbmsgKHAsIG15c2lua3BhZCkgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoU0hBUEVXSVBFX01BU0tfQ0FQU19TVFJJTkcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteW1hc2tzcmNwYWQsIG1hc2tzcmMsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKFNIQVBFV0lQRV9WSURFT19DQVBTX1NUUklORyk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15dmlkZW9zcmNwYWQsIHZpZGVvc3JjLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgbWFzayA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoNDAwICogNDAwKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKG1hc2ssICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBkYXRhID0gbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCA0MDA7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCA0MDA7IGorKykgeworICAgICAgaWYgKGkgPCAxMDAgJiYgaiA8IDEwMCkKKyAgICAgICAgZGF0YVswXSA9IDA7CisgICAgICBlbHNlIGlmIChpIDwgMjAwICYmIGogPCAyMDApCisgICAgICAgIGRhdGFbMF0gPSA4NTsKKyAgICAgIGVsc2UgaWYgKGkgPCAzMDAgJiYgaiA8IDMwMCkKKyAgICAgICAgZGF0YVswXSA9IDE3MDsKKyAgICAgIGVsc2UKKyAgICAgICAgZGF0YVswXSA9IDI1NDsKKyAgICAgIGRhdGErKzsKKyAgICB9CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAobWFzaywgJm1hcCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXltYXNrc3JjcGFkLCBtYXNrKSA9PSBHU1RfRkxPV19PSyk7CisKKyAgaW5wdXQgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDQwMCAqIDQwMCAqIDQpOworICBnc3RfYnVmZmVyX21hcCAoaW5wdXQsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBkYXRhID0gbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCA0MDA7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCA0MDA7IGorKykgeworICAgICAgLyogVGhpcyBpcyBncmVlbiAqLworICAgICAgZGF0YVswXSA9IDI1NTsgICAgICAgICAgICAvKiBBICovCisgICAgICBkYXRhWzFdID0gMTczOyAgICAgICAgICAgIC8qIFkgKi8KKyAgICAgIGRhdGFbMl0gPSA0MjsgICAgICAgICAgICAgLyogVSAqLworICAgICAgZGF0YVszXSA9IDI2OyAgICAgICAgICAgICAvKiBWICovCisgICAgICBkYXRhICs9IDQ7CisgICAgfQorICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGlucHV0LCAmbWFwKTsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzaGFwZXdpcGUpLCAicG9zaXRpb24iLCAwLjAsIE5VTEwpOworICBvdXRwdXQgPSBOVUxMOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXZpZGVvc3JjcGFkLAorICAgICAgICAgIGdzdF9idWZmZXJfcmVmIChpbnB1dCkpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKG91dHB1dCAhPSBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dHB1dCwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDQwMDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IDQwMDsgaisrKSB7CisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzBdLCAyNTUpOyAgICAvKiBBICovCisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzFdLCAxNzMpOyAgICAvKiBZICovCisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzJdLCA0Mik7ICAgICAvKiBVICovCisgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzNdLCAyNik7ICAgICAvKiBWICovCisgICAgICBkYXRhICs9IDQ7CisgICAgfQorICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKG91dHB1dCwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKG91dHB1dCk7CisgIG91dHB1dCA9IE5VTEw7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc2hhcGV3aXBlKSwgInBvc2l0aW9uIiwgMC4xLCBOVUxMKTsKKyAgb3V0cHV0ID0gTlVMTDsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXl2aWRlb3NyY3BhZCwKKyAgICAgICAgICBnc3RfYnVmZmVyX3JlZiAoaW5wdXQpKSA9PSBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChvdXRwdXQgIT0gTlVMTCk7CisgIGdzdF9idWZmZXJfbWFwIChvdXRwdXQsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisgIGRhdGEgPSBtYXAuZGF0YTsKKyAgZm9yIChpID0gMDsgaSA8IDQwMDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IDQwMDsgaisrKSB7CisgICAgICBpZiAoaSA8IDEwMCAmJiBqIDwgMTAwKSB7CisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMF0sIDApOyAgICAvKiBBICovCisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMV0sIDE3Myk7ICAvKiBZICovCisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMl0sIDQyKTsgICAvKiBVICovCisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbM10sIDI2KTsgICAvKiBWICovCisgICAgICB9IGVsc2UgeworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzBdLCAyNTUpOyAgLyogQSAqLworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzFdLCAxNzMpOyAgLyogWSAqLworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzJdLCA0Mik7ICAgLyogVSAqLworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzNdLCAyNik7ICAgLyogViAqLworICAgICAgfQorICAgICAgZGF0YSArPSA0OworICAgIH0KKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChvdXRwdXQsICZtYXApOworICBnc3RfYnVmZmVyX3VucmVmIChvdXRwdXQpOworICBvdXRwdXQgPSBOVUxMOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNoYXBld2lwZSksICJwb3NpdGlvbiIsIDAuMzQsIE5VTEwpOworICBvdXRwdXQgPSBOVUxMOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXZpZGVvc3JjcGFkLAorICAgICAgICAgIGdzdF9idWZmZXJfcmVmIChpbnB1dCkpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKG91dHB1dCAhPSBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dHB1dCwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgNDAwOyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgNDAwOyBqKyspIHsKKyAgICAgIGlmIChpIDwgMjAwICYmIGogPCAyMDApIHsKKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVswXSwgMCk7ICAgIC8qIEEgKi8KKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVsxXSwgMTczKTsgIC8qIFkgKi8KKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVsyXSwgNDIpOyAgIC8qIFUgKi8KKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVszXSwgMjYpOyAgIC8qIFYgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMF0sIDI1NSk7ICAvKiBBICovCisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMV0sIDE3Myk7ICAvKiBZICovCisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMl0sIDQyKTsgICAvKiBVICovCisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbM10sIDI2KTsgICAvKiBWICovCisgICAgICB9CisgICAgICBkYXRhICs9IDQ7CisgICAgfQorICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKG91dHB1dCwgJm1hcCk7CisgIGdzdF9idWZmZXJfdW5yZWYgKG91dHB1dCk7CisgIG91dHB1dCA9IE5VTEw7CisKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc2hhcGV3aXBlKSwgInBvc2l0aW9uIiwgMC42NywgTlVMTCk7CisgIG91dHB1dCA9IE5VTEw7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15dmlkZW9zcmNwYWQsCisgICAgICAgICAgZ3N0X2J1ZmZlcl9yZWYgKGlucHV0KSkgPT0gR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAob3V0cHV0ICE9IE5VTEwpOworICBnc3RfYnVmZmVyX21hcCAob3V0cHV0LCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBkYXRhID0gbWFwLmRhdGE7CisgIGZvciAoaSA9IDA7IGkgPCA0MDA7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCA0MDA7IGorKykgeworICAgICAgaWYgKGkgPCAzMDAgJiYgaiA8IDMwMCkgeworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzBdLCAwKTsgICAgLyogQSAqLworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzFdLCAxNzMpOyAgLyogWSAqLworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzJdLCA0Mik7ICAgLyogVSAqLworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChkYXRhWzNdLCAyNik7ICAgLyogViAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVswXSwgMjU1KTsgIC8qIEEgKi8KKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVsxXSwgMTczKTsgIC8qIFkgKi8KKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVsyXSwgNDIpOyAgIC8qIFUgKi8KKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YVszXSwgMjYpOyAgIC8qIFYgKi8KKyAgICAgIH0KKyAgICAgIGRhdGEgKz0gNDsKKyAgICB9CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0cHV0LCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0cHV0KTsKKyAgb3V0cHV0ID0gTlVMTDsKKworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzaGFwZXdpcGUpLCAicG9zaXRpb24iLCAxLjAsIE5VTEwpOworICBvdXRwdXQgPSBOVUxMOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXZpZGVvc3JjcGFkLAorICAgICAgICAgIGdzdF9idWZmZXJfcmVmIChpbnB1dCkpID09IEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKG91dHB1dCAhPSBOVUxMKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKG91dHB1dCwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgZGF0YSA9IG1hcC5kYXRhOworICBmb3IgKGkgPSAwOyBpIDwgNDAwOyBpKyspIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgNDAwOyBqKyspIHsKKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMF0sIDApOyAgICAgIC8qIEEgKi8KKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMV0sIDE3Myk7ICAgIC8qIFkgKi8KKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMl0sIDQyKTsgICAgIC8qIFUgKi8KKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbM10sIDI2KTsgICAgIC8qIFYgKi8KKyAgICAgIGRhdGEgKz0gNDsKKyAgICB9CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0cHV0LCAmbWFwKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0cHV0KTsKKyAgb3V0cHV0ID0gTlVMTDsKKworICBnc3RfYnVmZmVyX3VucmVmIChpbnB1dCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIHAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2hhcGV3aXBlLCAidmlkZW9fc2luayIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF91bmxpbmsgKG15dmlkZW9zcmNwYWQsIHApKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocCk7CisgIHAgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2hhcGV3aXBlLCAibWFza19zaW5rIik7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3VubGluayAobXltYXNrc3JjcGFkLCBwKSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHApOworICBwID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNoYXBld2lwZSwgInNyYyIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF91bmxpbmsgKHAsIG15c2lua3BhZCkpOworICBnc3Rfb2JqZWN0X3VucmVmIChwKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChiaW4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBTdWl0ZSAqCitzaGFwZXdpcGVfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgic2hhcGV3aXBlIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2Vfc2V0X3RpbWVvdXQgKHRjX2NoYWluLCAxODApOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ2VuZXJhbCk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChzaGFwZXdpcGUpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvc291cGh0dHBzcmMuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkNGRiYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3NvdXBodHRwc3JjLmMKQEAgLTAsMCArMSw2ODEgQEAKKy8qIEdTdHJlYW1lciB1bml0IHRlc3RzIGZvciB0aGUgc291cGh0dHBzcmMgZWxlbWVudAorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBXb3V0ZXIgQ2xvZXRlbnMgPHdvdXRlckBtaW5kLmJlPgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMsIFhpbWlhbiwgSW5jLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliL2dwcmludGYuaD4KKworI2RlZmluZSBTT1VQX1ZFUlNJT05fTUlOX1JFUVVJUkVEIChTT1VQX1ZFUlNJT05fMl80MCkKKyNpbmNsdWRlIDxsaWJzb3VwL3NvdXAuaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworI2lmICFkZWZpbmVkKFNPVVBfTUlOT1JfVkVSU0lPTikgfHwgU09VUF9NSU5PUl9WRVJTSU9OIDwgNDQKKyNkZWZpbmUgU291cFN0YXR1cyBTb3VwS25vd25TdGF0dXNDb2RlCisjZW5kaWYKKworCitnYm9vbGVhbiByZWRpcmVjdCA9IFRSVUU7CisKK3N0YXRpYyBjb25zdCBjaGFyICoqY29va2llcyA9IE5VTEw7CisKKy8qIFZhcmlhYmxlcyBmb3IgYXV0aGVudGljYXRpb24gdGVzdHMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICp1c2VyX2lkID0gTlVMTDsKK3N0YXRpYyBjb25zdCBjaGFyICp1c2VyX3B3ID0gTlVMTDsKK3N0YXRpYyBjb25zdCBjaGFyICpnb29kX3VzZXIgPSAiZ29vZF91c2VyIjsKK3N0YXRpYyBjb25zdCBjaGFyICpiYWRfdXNlciA9ICJiYWRfdXNlciI7CitzdGF0aWMgY29uc3QgY2hhciAqZ29vZF9wdyA9ICJnb29kX3B3IjsKK3N0YXRpYyBjb25zdCBjaGFyICpiYWRfcHcgPSAiYmFkX3B3IjsKK3N0YXRpYyBjb25zdCBjaGFyICpyZWFsbSA9ICJTT1VQSFRUUFNSQ19SRUFMTSI7CitzdGF0aWMgY29uc3QgY2hhciAqYmFzaWNfYXV0aF9wYXRoID0gIi9iYXNpY19hdXRoIjsKK3N0YXRpYyBjb25zdCBjaGFyICpkaWdlc3RfYXV0aF9wYXRoID0gIi9kaWdlc3RfYXV0aCI7CisKK3N0YXRpYyBjb25zdCBjaGFyICpzc2xfY2VydF9maWxlID0gR1NUX1RFU1RfRklMRVNfUEFUSCAiL3Rlc3QtY2VydC5wZW0iOworc3RhdGljIGNvbnN0IGNoYXIgKnNzbF9rZXlfZmlsZSA9IEdTVF9URVNUX0ZJTEVTX1BBVEggIi90ZXN0LWtleS5wZW0iOworCitzdGF0aWMgZ3VpbnQgZ2V0X3BvcnRfZnJvbV9zZXJ2ZXIgKFNvdXBTZXJ2ZXIgKiBzZXJ2ZXIpOworc3RhdGljIFNvdXBTZXJ2ZXIgKnJ1bl9zZXJ2ZXIgKGdib29sZWFuIHVzZV9odHRwcyk7CisKK3N0YXRpYyB2b2lkCitoYW5kb2ZmX2NiIChHc3RFbGVtZW50ICogZmFrZXNpbmssIEdzdEJ1ZmZlciAqIGJ1ZiwgR3N0UGFkICogcGFkLAorICAgIEdzdEJ1ZmZlciAqKiBwX291dGJ1ZikKK3sKKyAgR1NUX0xPRyAoImhhbmRvZmYsIGJ1ZiA9ICVwIiwgYnVmKTsKKyAgaWYgKCpwX291dGJ1ZiA9PSBOVUxMKQorICAgICpwX291dGJ1ZiA9IGdzdF9idWZmZXJfcmVmIChidWYpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2Jhc2ljX2F1dGhfY2IgKFNvdXBBdXRoRG9tYWluICogZG9tYWluLCBTb3VwTWVzc2FnZSAqIG1zZywKKyAgICBjb25zdCBjaGFyICp1c2VybmFtZSwgY29uc3QgY2hhciAqcGFzc3dvcmQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgLyogVGhlcmUgaXMgb25seSBvbmUgZ29vZCBsb2dpbiBmb3IgdGVzdGluZyAqLworICByZXR1cm4gKHN0cmNtcCAodXNlcm5hbWUsIGdvb2RfdXNlcikgPT0gMCkKKyAgICAgICYmIChzdHJjbXAgKHBhc3N3b3JkLCBnb29kX3B3KSA9PSAwKTsKK30KKworCitzdGF0aWMgY2hhciAqCitkaWdlc3RfYXV0aF9jYiAoU291cEF1dGhEb21haW4gKiBkb21haW4sIFNvdXBNZXNzYWdlICogbXNnLAorICAgIGNvbnN0IGNoYXIgKnVzZXJuYW1lLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIC8qIFRoZXJlIGlzIG9ubHkgb25lIGdvb2QgbG9naW4gZm9yIHRlc3RpbmcgKi8KKyAgaWYgKHN0cmNtcCAodXNlcm5hbWUsIGdvb2RfdXNlcikgPT0gMCkKKyAgICByZXR1cm4gc291cF9hdXRoX2RvbWFpbl9kaWdlc3RfZW5jb2RlX3Bhc3N3b3JkIChnb29kX3VzZXIsIHJlYWxtLCBnb29kX3B3KTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorcnVuX3Rlc3QgKGdib29sZWFuIHVzZV9odHRwcywgY29uc3QgZ2NoYXIgKiBwYXRoLCBnaW50IGV4cGVjdGVkKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdEVsZW1lbnQgKnBpcGUsICpzcmMsICpzaW5rOworICBHc3RCdWZmZXIgKmJ1ZiA9IE5VTEw7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKyAgZ2NoYXIgKnVybDsKKyAgZ2Jvb2xlYW4gcmVzID0gRkFMU0U7CisgIFNvdXBTZXJ2ZXIgKnNlcnZlcjsKKyAgZ3VpbnQgcG9ydDsKKworICBzZXJ2ZXIgPSBydW5fc2VydmVyICh1c2VfaHR0cHMpOworICBpZiAoc2VydmVyID09IE5VTEwpIHsKKyAgICBnX3ByaW50ICgiRmFpbGVkIHRvIHN0YXJ0IHVwICVzIHNlcnZlciIsIHVzZV9odHRwcyA/ICJIVFRQUyIgOiAiSFRUUCIpOworICAgIC8qIHNraXAgdGhpcyB0ZXN0ICovCisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBwaXBlID0gZ3N0X3BpcGVsaW5lX25ldyAoTlVMTCk7CisKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgic291cGh0dHBzcmMiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHNyYyAhPSBOVUxMKTsKKworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHNpbmsgIT0gTlVMTCk7CisKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGUpLCBzcmMpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZSksIHNpbmspOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGluayAoc3JjLCBzaW5rKSk7CisKKyAgcG9ydCA9IGdldF9wb3J0X2Zyb21fc2VydmVyIChzZXJ2ZXIpOworICB1cmwgPSBnX3N0cmR1cF9wcmludGYgKCIlczovLzEyNy4wLjAuMToldSVzIiwKKyAgICAgIHVzZV9odHRwcyA/ICJodHRwcyIgOiAiaHR0cCIsIHBvcnQsIHBhdGgpOworICBmYWlsX3VubGVzcyAodXJsICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKHNyYywgImxvY2F0aW9uIiwgdXJsLCBOVUxMKTsKKyAgZ19mcmVlICh1cmwpOworCisgIGlmICh1c2VfaHR0cHMpIHsKKyAgICBHVGxzRGF0YWJhc2UgKnRsc2RiOworICAgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICAgIGdjaGFyICpwYXRoOworCisgICAgLyogR1Rsc0ZpbGVEYXRhYmFzZSBuZWVkcyBhbiBhYnNvbHV0ZSBwYXRoLiBVc2luZyBhIHJlbGF0aXZlIG9uZQorICAgICAqIGNhdXNlcyBhIHdhcm5pbmcgZnJvbSBHTGliLU5ldCBmb2xsb3dlZCBieSBhIHNlZ2ZhdWx0IGluIEdudVRMUyAqLworICAgIGlmIChnX3BhdGhfaXNfYWJzb2x1dGUgKHNzbF9jZXJ0X2ZpbGUpKSB7CisgICAgICBwYXRoID0gZ19zdHJkdXAgKHNzbF9jZXJ0X2ZpbGUpOworICAgIH0gZWxzZSB7CisgICAgICBwYXRoID0gZ19idWlsZF9maWxlbmFtZSAoZ19nZXRfY3VycmVudF9kaXIgKCksIHNzbF9jZXJ0X2ZpbGUsIE5VTEwpOworICAgIH0KKworICAgIHRsc2RiID0gZ190bHNfZmlsZV9kYXRhYmFzZV9uZXcgKHBhdGgsICZlcnJvcik7CisgICAgZmFpbF91bmxlc3MgKHRsc2RiLCAiRmFpbGVkIHRvIGxvYWQgY2VydGlmaWNhdGU6ICVzIiwgZXJyb3ItPm1lc3NhZ2UpOworCisgICAgZ19vYmplY3Rfc2V0IChzcmMsICJ0bHMtZGF0YWJhc2UiLCB0bHNkYiwgTlVMTCk7CisKKyAgICBnX29iamVjdF91bnJlZiAodGxzZGIpOworICAgIGdfZnJlZSAocGF0aCk7CisgIH0KKworICBnX29iamVjdF9zZXQgKHNyYywgImF1dG9tYXRpYy1yZWRpcmVjdCIsIHJlZGlyZWN0LCBOVUxMKTsKKyAgaWYgKGNvb2tpZXMgIT0gTlVMTCkKKyAgICBnX29iamVjdF9zZXQgKHNyYywgImNvb2tpZXMiLCBjb29raWVzLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzaW5rLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNpbmssICJwcmVyb2xsLWhhbmRvZmYiLCBHX0NBTExCQUNLIChoYW5kb2ZmX2NiKSwgJmJ1Zik7CisKKyAgaWYgKHVzZXJfaWQgIT0gTlVMTCkKKyAgICBnX29iamVjdF9zZXQgKHNyYywgInVzZXItaWQiLCB1c2VyX2lkLCBOVUxMKTsKKyAgaWYgKHVzZXJfcHcgIT0gTlVMTCkKKyAgICBnX29iamVjdF9zZXQgKHNyYywgInVzZXItcHciLCB1c2VyX3B3LCBOVUxMKTsKKworICByZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGUsIEdTVF9TVEFURV9QQVVTRUQpOworICBpZiAocmV0ICE9IEdTVF9TVEFURV9DSEFOR0VfQVNZTkMpIHsKKyAgICBHU1RfREVCVUcgKCJmYWlsZWQgdG8gc3RhcnQgdXAgc291cCBodHRwIHNyYywgcmV0ID0gJWQiLCByZXQpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBtc2cgPSBnc3RfYnVzX3BvbGwgKEdTVF9FTEVNRU5UX0JVUyAocGlwZSksCisgICAgICBHU1RfTUVTU0FHRV9FT1MgfCBHU1RfTUVTU0FHRV9FUlJPUiwgLTEpOworICBpZiAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FUlJPUikgeworICAgIGdjaGFyICpkZWJ1ZyA9IE5VTEw7CisgICAgR0Vycm9yICplcnIgPSBOVUxMOworICAgIGdpbnQgcmMgPSAtMTsKKworICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtc2csICZlcnIsICZkZWJ1Zyk7CisgICAgR1NUX0lORk8gKCJlcnJvcjogJXMiLCBlcnItPm1lc3NhZ2UpOworICAgIGlmIChnX3N0cl9oYXNfc3VmZml4IChlcnItPm1lc3NhZ2UsICJOb3QgRm91bmQiKSkKKyAgICAgIHJjID0gNDA0OworICAgIGVsc2UgaWYgKGdfc3RyX2hhc19zdWZmaXggKGVyci0+bWVzc2FnZSwgIkZvcmJpZGRlbiIpKQorICAgICAgcmMgPSA0MDM7CisgICAgZWxzZSBpZiAoZ19zdHJfaGFzX3N1ZmZpeCAoZXJyLT5tZXNzYWdlLCAiVW5hdXRob3JpemVkIikpCisgICAgICByYyA9IDQwMTsKKyAgICBlbHNlIGlmIChnX3N0cl9oYXNfc3VmZml4IChlcnItPm1lc3NhZ2UsICJGb3VuZCIpKQorICAgICAgcmMgPSAzMDI7CisgICAgR1NUX0lORk8gKCJkZWJ1ZzogJXMiLCBkZWJ1Zyk7CisgICAgLyogc2hvdWxkIG5vdCd2ZSBnb3R0ZW4gYW55IG91dHB1dCBpbiBjYXNlIG9mIGEgNDB4IGVycm9yLiBXYWl0IGEgYml0CisgICAgICogdG8gZ2l2ZSB0aGUgc3RyZWFtaW5nIHRocmVhZCBhIGNoYW5jZSB0byBwdXNoIG91dCBhIGJ1ZmZlciBhbmQgdHJpZ2dlcgorICAgICAqIG91ciBjYWxsYmFjayBiZWZvcmUgc2h1dHRpbmcgZG93biB0aGUgcGlwZWxpbmUgKi8KKyAgICBnX3VzbGVlcCAoR19VU0VDX1BFUl9TRUMgLyAyKTsKKyAgICBmYWlsX3VubGVzcyAoYnVmID09IE5VTEwpOworICAgIGdfZXJyb3JfZnJlZSAoZXJyKTsKKyAgICBnX2ZyZWUgKGRlYnVnKTsKKyAgICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKyAgICBHU1RfREVCVUcgKCJHb3QgSFRUUCBlcnJvciAldSwgZXhwZWN0ZWQgJXUiLCByYywgZXhwZWN0ZWQpOworICAgIHJlcyA9IChyYyA9PSBleHBlY3RlZCk7CisgICAgZ290byBkb25lOworICB9CisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworCisgIC8qIGRvbid0IHdhaXQgZm9yIG1vcmUgdGhhbiAxMCBzZWNvbmRzICovCisgIHJldCA9IGdzdF9lbGVtZW50X2dldF9zdGF0ZSAocGlwZSwgTlVMTCwgTlVMTCwgMTAgKiBHU1RfU0VDT05EKTsKKyAgR1NUX0xPRyAoInJldCA9ICV1IiwgcmV0KTsKKworICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAvKiB3ZSB3YW50IHRvIHRlc3QgdGhlIGJ1ZmZlciBvZmZzZXQsIG5vdGhpbmcgZWxzZTsgaWYgdGhlcmUncyBhIGZhaWx1cmUKKyAgICAgKiBpdCBtaWdodCBiZSBmb3IgbG90cyBvZiByZWFzb25zIChubyBuZXR3b3JrIGNvbm5lY3Rpb24sIHdoYXRldmVyKSwgd2UncmUKKyAgICAgKiBub3QgaW50ZXJlc3RlZCBpbiB0aG9zZSAqLworICAgIEdTVF9ERUJVRyAoImRpZG4ndCBtYW5hZ2UgdG8gZ2V0IGRhdGEgd2l0aGluIDEwIHNlY29uZHMsIHNraXBwaW5nIHRlc3QiKTsKKyAgICByZXMgPSBUUlVFOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIEdTVF9ERUJVRyAoImJ1ZmZlciBvZmZzZXQgPSAlIiBHX0dVSU5UNjRfRk9STUFULCBHU1RfQlVGRkVSX09GRlNFVCAoYnVmKSk7CisKKyAgLyogZmlyc3QgYnVmZmVyIHNob3VsZCBoYXZlIGEgMCBvZmZzZXQgKi8KKyAgZmFpbF91bmxlc3MgKEdTVF9CVUZGRVJfT0ZGU0VUIChidWYpID09IDApOworICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICByZXMgPSAoZXhwZWN0ZWQgPT0gMCk7CisKK2RvbmU6CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGUpOworICBnc3Rfb2JqZWN0X3VucmVmIChzZXJ2ZXIpOworICByZXR1cm4gcmVzOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9maXJzdF9idWZmZXJfaGFzX29mZnNldCkKK3sKKyAgZmFpbF91bmxlc3MgKHJ1bl90ZXN0IChGQUxTRSwgIi8iLCAwKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfbm90X2ZvdW5kKQoreworICBmYWlsX3VubGVzcyAocnVuX3Rlc3QgKEZBTFNFLCAiLzQwNCIsIDQwNCkpOworICBmYWlsX3VubGVzcyAocnVuX3Rlc3QgKEZBTFNFLCAiLzQwNC13aXRoLWRhdGEiLCA0MDQpKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mb3JiaWRkZW4pCit7CisgIGZhaWxfdW5sZXNzIChydW5fdGVzdCAoRkFMU0UsICIvNDAzIiwgNDAzKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcmVkaXJlY3Rfbm8pCit7CisgIHJlZGlyZWN0ID0gRkFMU0U7CisgIGZhaWxfdW5sZXNzIChydW5fdGVzdCAoRkFMU0UsICIvMzAyIiwgMzAyKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcmVkaXJlY3RfeWVzKQoreworICByZWRpcmVjdCA9IFRSVUU7CisgIGZhaWxfdW5sZXNzIChydW5fdGVzdCAoRkFMU0UsICIvMzAyIiwgMCkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2h0dHBzKQoreworICBmYWlsX3VubGVzcyAocnVuX3Rlc3QgKFRSVUUsICIvIiwgMCkpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2Nvb2tpZXMpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyICpiaXNjb3R0aVtdID0geyAiZGVsYWNyZT15dW1taWUiLCAia29la2plPWx1IiwgTlVMTCB9OworICBnYm9vbGVhbiByZXM7CisKKyAgY29va2llcyA9IGJpc2NvdHRpOworICByZXMgPSBydW5fdGVzdCAoRkFMU0UsICIvIiwgMCk7CisgIGNvb2tpZXMgPSBOVUxMOworICBmYWlsX3VubGVzcyAocmVzKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9nb29kX3VzZXJfYmFzaWNfYXV0aCkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHVzZXJfaWQgPSBnb29kX3VzZXI7CisgIHVzZXJfcHcgPSBnb29kX3B3OworICByZXMgPSBydW5fdGVzdCAoRkFMU0UsIGJhc2ljX2F1dGhfcGF0aCwgMCk7CisgIEdTVF9ERUJVRyAoIkJhc2ljIEF1dGggdXNlciAlcyBwYXNzd29yZCAlcyByZXMgPSAlZCIsIHVzZXJfaWQsIHVzZXJfcHcsIHJlcyk7CisgIHVzZXJfaWQgPSB1c2VyX3B3ID0gTlVMTDsKKyAgZmFpbF91bmxlc3MgKHJlcyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfYmFkX3VzZXJfYmFzaWNfYXV0aCkKK3sKKyAgZ2Jvb2xlYW4gcmVzOworCisgIHVzZXJfaWQgPSBiYWRfdXNlcjsKKyAgdXNlcl9wdyA9IGdvb2RfcHc7CisgIHJlcyA9IHJ1bl90ZXN0IChGQUxTRSwgYmFzaWNfYXV0aF9wYXRoLCA0MDEpOworICBHU1RfREVCVUcgKCJCYXNpYyBBdXRoIHVzZXIgJXMgcGFzc3dvcmQgJXMgcmVzID0gJWQiLCB1c2VyX2lkLCB1c2VyX3B3LCByZXMpOworICB1c2VyX2lkID0gdXNlcl9wdyA9IE5VTEw7CisgIGZhaWxfdW5sZXNzIChyZXMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2JhZF9wYXNzd29yZF9iYXNpY19hdXRoKQoreworICBnYm9vbGVhbiByZXM7CisKKyAgdXNlcl9pZCA9IGdvb2RfdXNlcjsKKyAgdXNlcl9wdyA9IGJhZF9wdzsKKyAgcmVzID0gcnVuX3Rlc3QgKEZBTFNFLCBiYXNpY19hdXRoX3BhdGgsIDQwMSk7CisgIEdTVF9ERUJVRyAoIkJhc2ljIEF1dGggdXNlciAlcyBwYXNzd29yZCAlcyByZXMgPSAlZCIsIHVzZXJfaWQsIHVzZXJfcHcsIHJlcyk7CisgIHVzZXJfaWQgPSB1c2VyX3B3ID0gTlVMTDsKKyAgZmFpbF91bmxlc3MgKHJlcyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZ29vZF91c2VyX2RpZ2VzdF9hdXRoKQoreworICBnYm9vbGVhbiByZXM7CisKKyAgdXNlcl9pZCA9IGdvb2RfdXNlcjsKKyAgdXNlcl9wdyA9IGdvb2RfcHc7CisgIHJlcyA9IHJ1bl90ZXN0IChGQUxTRSwgZGlnZXN0X2F1dGhfcGF0aCwgMCk7CisgIEdTVF9ERUJVRyAoIkRpZ2VzdCBBdXRoIHVzZXIgJXMgcGFzc3dvcmQgJXMgcmVzID0gJWQiLCB1c2VyX2lkLCB1c2VyX3B3LCByZXMpOworICB1c2VyX2lkID0gdXNlcl9wdyA9IE5VTEw7CisgIGZhaWxfdW5sZXNzIChyZXMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2JhZF91c2VyX2RpZ2VzdF9hdXRoKQoreworICBnYm9vbGVhbiByZXM7CisKKyAgdXNlcl9pZCA9IGJhZF91c2VyOworICB1c2VyX3B3ID0gZ29vZF9wdzsKKyAgcmVzID0gcnVuX3Rlc3QgKEZBTFNFLCBkaWdlc3RfYXV0aF9wYXRoLCA0MDEpOworICBHU1RfREVCVUcgKCJEaWdlc3QgQXV0aCB1c2VyICVzIHBhc3N3b3JkICVzIHJlcyA9ICVkIiwgdXNlcl9pZCwgdXNlcl9wdywgcmVzKTsKKyAgdXNlcl9pZCA9IHVzZXJfcHcgPSBOVUxMOworICBmYWlsX3VubGVzcyAocmVzKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9iYWRfcGFzc3dvcmRfZGlnZXN0X2F1dGgpCit7CisgIGdib29sZWFuIHJlczsKKworICB1c2VyX2lkID0gZ29vZF91c2VyOworICB1c2VyX3B3ID0gYmFkX3B3OworICByZXMgPSBydW5fdGVzdCAoRkFMU0UsIGRpZ2VzdF9hdXRoX3BhdGgsIDQwMSk7CisgIEdTVF9ERUJVRyAoIkRpZ2VzdCBBdXRoIHVzZXIgJXMgcGFzc3dvcmQgJXMgcmVzID0gJWQiLCB1c2VyX2lkLCB1c2VyX3B3LCByZXMpOworICB1c2VyX2lkID0gdXNlcl9wdyA9IE5VTEw7CisgIGZhaWxfdW5sZXNzIChyZXMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBnYm9vbGVhbiBpY3lfY2FwcyA9IEZBTFNFOworCitzdGF0aWMgdm9pZAorZ290X2J1ZmZlciAoR3N0RWxlbWVudCAqIGZha2VzaW5rLCBHc3RCdWZmZXIgKiBidWYsIEdzdFBhZCAqIHBhZCwKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgR3N0Q2FwcyAqY2FwczsKKworICAvKiBDYXBzIGNhbiBiZSBhbnl0aGluZyBpZiB3ZSBkb24ndCBleGNlcHQgaWN5IGNhcHMgKi8KKyAgaWYgKCFpY3lfY2FwcykKKyAgICByZXR1cm47CisKKyAgLyogT3RoZXJ3aXNlIHRoZXkgX211c3RfIGJlICJhcHBsaWNhdGlvbi94LWljeSIgKi8KKyAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFkKTsKKyAgZmFpbF91bmxlc3MgKGNhcHMgIT0gTlVMTCk7CisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyksICJhcHBsaWNhdGlvbi94LWljeSIpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2ljeV9zdHJlYW0pCit7CisgIEdzdEVsZW1lbnQgKnBpcGUsICpzcmMsICpzaW5rOworCisgIEdzdE1lc3NhZ2UgKm1zZzsKKworICBwaXBlID0gZ3N0X3BpcGVsaW5lX25ldyAoTlVMTCk7CisKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgic291cGh0dHBzcmMiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHNyYyAhPSBOVUxMKTsKKworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHNpbmsgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc2luaywgInNpZ25hbC1oYW5kb2ZmcyIsIFRSVUUsIE5VTEwpOworICBnX3NpZ25hbF9jb25uZWN0IChzaW5rLCAiaGFuZG9mZiIsIEdfQ0FMTEJBQ0sgKGdvdF9idWZmZXIpLCBOVUxMKTsKKworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZSksIHNyYyk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlKSwgc2luayk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rIChzcmMsIHNpbmspKTsKKworICAvKiBSYWRpb25vbXkgSG90NDBNdXNpYyBzaG91dGNhc3Qgc3RyZWFtICovCisgIGdfb2JqZWN0X3NldCAoc3JjLCAibG9jYXRpb24iLAorICAgICAgImh0dHA6Ly9zdHJlYW1pbmcucmFkaW9ub215LmNvbTo4MC9Ib3Q0ME11c2ljIiwgTlVMTCk7CisKKyAgLyogRU9TIGFmdGVyIHRoZSBmaXJzdCBidWZmZXIgKi8KKyAgZ19vYmplY3Rfc2V0IChzcmMsICJudW0tYnVmZmVycyIsIDEsIE5VTEwpOworICBpY3lfY2FwcyA9IFRSVUU7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBtc2cgPSBnc3RfYnVzX3BvbGwgKEdTVF9FTEVNRU5UX0JVUyAocGlwZSksCisgICAgICBHU1RfTUVTU0FHRV9FT1MgfCBHU1RfTUVTU0FHRV9FUlJPUiwgLTEpOworCisgIHN3aXRjaCAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRU9TOgorICAgICAgR1NUX0RFQlVHICgic3VjY2Vzcywgd2UncmUgZG9uZSBoZXJlIik7CisgICAgICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6eworICAgICAgR0Vycm9yICplcnIgPSBOVUxMOworCisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobXNnLCAmZXJyLCBOVUxMKTsKKyAgICAgIEdTVF9JTkZPICgiRXJyb3Igd2l0aCBJQ1kgbXAzIHNob3V0Y2FzdCBzdHJlYW06ICVzIiwgZXJyLT5tZXNzYWdlKTsKKyAgICAgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworICAgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWN5X2NhcHMgPSBGQUxTRTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK3NvdXBodHRwc3JjX3N1aXRlICh2b2lkKQoreworICBUQ2FzZSAqdGNfY2hhaW4sICp0Y19pbnRlcm5ldDsKKyAgU3VpdGUgKnM7CisKKyAgLyogd2UgZG9uJ3Qgc3VwcG9ydCBleGNlcHRpb25zIGZyb20gdGhlIHByb3h5LCBzbyBqdXN0IHVuc2V0IHRoZSBlbnZpcm9ubWVudAorICAgKiB2YXJpYWJsZSAtIGluIGNhc2UgaXQncyBzZXQgaW4gdGhlIHRlc3QgZW52aXJvbm1lbnQgaXQgd291bGQgb3RoZXJ3aXNlCisgICAqIHByZXZlbnQgdXMgZnJvbSBjb25uZWN0aW5nIHRvIGxvY2FsaG9zdCAobGlrZSBqZW5raW5zLnFhLnVidW50dS5jb20pICovCisgIGdfdW5zZXRlbnYgKCJodHRwX3Byb3h5Iik7CisKKyAgcyA9IHN1aXRlX2NyZWF0ZSAoInNvdXBodHRwc3JjIik7CisgIHRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworICB0Y19pbnRlcm5ldCA9IHRjYXNlX2NyZWF0ZSAoImludGVybmV0Iik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9maXJzdF9idWZmZXJfaGFzX29mZnNldCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9yZWRpcmVjdF95ZXMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcmVkaXJlY3Rfbm8pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfbm90X2ZvdW5kKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ZvcmJpZGRlbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9jb29raWVzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2dvb2RfdXNlcl9iYXNpY19hdXRoKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2JhZF91c2VyX2Jhc2ljX2F1dGgpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfYmFkX3Bhc3N3b3JkX2Jhc2ljX2F1dGgpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZ29vZF91c2VyX2RpZ2VzdF9hdXRoKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2JhZF91c2VyX2RpZ2VzdF9hdXRoKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2JhZF9wYXNzd29yZF9kaWdlc3RfYXV0aCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9odHRwcyk7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19pbnRlcm5ldCk7CisgIHRjYXNlX3NldF90aW1lb3V0ICh0Y19pbnRlcm5ldCwgMjUwKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2ludGVybmV0LCB0ZXN0X2ljeV9zdHJlYW0pOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoc291cGh0dHBzcmMpOworCitzdGF0aWMgdm9pZAorZG9fZ2V0IChTb3VwTWVzc2FnZSAqIG1zZywgY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgZ2Jvb2xlYW4gc2VuZF9lcnJvcl9kb2MgPSBGQUxTRTsKKyAgY2hhciAqdXJpOworCisgIGludCBidWZsZW4gPSA0MDk2OworCisgIFNvdXBTdGF0dXMgc3RhdHVzID0gU09VUF9TVEFUVVNfT0s7CisKKyAgdXJpID0gc291cF91cmlfdG9fc3RyaW5nIChzb3VwX21lc3NhZ2VfZ2V0X3VyaSAobXNnKSwgRkFMU0UpOworICBHU1RfREVCVUcgKCJyZXF1ZXN0OiBcIiVzXCIiLCB1cmkpOworCisgIGlmICghc3RyY21wIChwYXRoLCAiLzMwMSIpKQorICAgIHN0YXR1cyA9IFNPVVBfU1RBVFVTX01PVkVEX1BFUk1BTkVOVExZOworICBlbHNlIGlmICghc3RyY21wIChwYXRoLCAiLzMwMiIpKQorICAgIHN0YXR1cyA9IFNPVVBfU1RBVFVTX01PVkVEX1RFTVBPUkFSSUxZOworICBlbHNlIGlmICghc3RyY21wIChwYXRoLCAiLzMwNyIpKQorICAgIHN0YXR1cyA9IFNPVVBfU1RBVFVTX1RFTVBPUkFSWV9SRURJUkVDVDsKKyAgZWxzZSBpZiAoIXN0cmNtcCAocGF0aCwgIi80MDMiKSkKKyAgICBzdGF0dXMgPSBTT1VQX1NUQVRVU19GT1JCSURERU47CisgIGVsc2UgaWYgKCFzdHJjbXAgKHBhdGgsICIvNDA0IikpCisgICAgc3RhdHVzID0gU09VUF9TVEFUVVNfTk9UX0ZPVU5EOworICBlbHNlIGlmICghc3RyY21wIChwYXRoLCAiLzQwNC13aXRoLWRhdGEiKSkgeworICAgIHN0YXR1cyA9IFNPVVBfU1RBVFVTX05PVF9GT1VORDsKKyAgICBzZW5kX2Vycm9yX2RvYyA9IFRSVUU7CisgIH0KKworICBpZiAoU09VUF9TVEFUVVNfSVNfUkVESVJFQ1RJT04gKHN0YXR1cykpIHsKKyAgICBjaGFyICpyZWRpcl91cmk7CisKKyAgICByZWRpcl91cmkgPSBnX3N0cmR1cF9wcmludGYgKCIlcy1yZWRpcmVjdGVkIiwgdXJpKTsKKyAgICBzb3VwX21lc3NhZ2VfaGVhZGVyc19hcHBlbmQgKG1zZy0+cmVzcG9uc2VfaGVhZGVycywgIkxvY2F0aW9uIiwgcmVkaXJfdXJpKTsKKyAgICBnX2ZyZWUgKHJlZGlyX3VyaSk7CisgIH0KKyAgaWYgKHN0YXR1cyAhPSAoU291cFN0YXR1cykgU09VUF9TVEFUVVNfT0sgJiYgIXNlbmRfZXJyb3JfZG9jKQorICAgIGdvdG8gbGVhdmU7CisKKyAgaWYgKG1zZy0+bWV0aG9kID09IFNPVVBfTUVUSE9EX0dFVCkgeworICAgIGNoYXIgKmJ1ZjsKKworICAgIGJ1ZiA9IGdfbWFsbG9jIChidWZsZW4pOworICAgIG1lbXNldCAoYnVmLCAwLCBidWZsZW4pOworICAgIHNvdXBfbWVzc2FnZV9ib2R5X2FwcGVuZCAobXNnLT5yZXNwb25zZV9ib2R5LCBTT1VQX01FTU9SWV9UQUtFLAorICAgICAgICBidWYsIGJ1Zmxlbik7CisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIG1zZy0+bWV0aG9kID09IFNPVVBfTUVUSE9EX0hFQUQgKi8KKworICAgIGNoYXIgKmxlbmd0aDsKKworICAgIC8qIFdlIGNvdWxkIGp1c3QgdXNlIHRoZSBzYW1lIGNvZGUgZm9yIGJvdGggR0VUIGFuZAorICAgICAqIEhFQUQuIEJ1dCB3ZSdsbCBvcHRpbWl6ZSBhbmQgYXZvaWQgdGhlIGV4dHJhCisgICAgICogbWFsbG9jLgorICAgICAqLworICAgIGxlbmd0aCA9IGdfc3RyZHVwX3ByaW50ZiAoIiVsdSIsIChndWxvbmcpIGJ1Zmxlbik7CisgICAgc291cF9tZXNzYWdlX2hlYWRlcnNfYXBwZW5kIChtc2ctPnJlc3BvbnNlX2hlYWRlcnMsCisgICAgICAgICJDb250ZW50LUxlbmd0aCIsIGxlbmd0aCk7CisgICAgZ19mcmVlIChsZW5ndGgpOworICB9CisKK2xlYXZlOgorICBzb3VwX21lc3NhZ2Vfc2V0X3N0YXR1cyAobXNnLCBzdGF0dXMpOworICBnX2ZyZWUgKHVyaSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9oZWFkZXIgKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLCBncG9pbnRlciBkYXRhKQoreworICBHU1RfREVCVUcgKCJoZWFkZXI6ICVzOiAlcyIsIG5hbWUsIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK3NlcnZlcl9jYWxsYmFjayAoU291cFNlcnZlciAqIHNlcnZlciwgU291cE1lc3NhZ2UgKiBtc2csCisgICAgY29uc3QgY2hhciAqcGF0aCwgR0hhc2hUYWJsZSAqIHF1ZXJ5LAorICAgIFNvdXBDbGllbnRDb250ZXh0ICogY29udGV4dCwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR1NUX0RFQlVHICgiJXMgJXMgSFRUUC8xLiVkIiwgbXNnLT5tZXRob2QsIHBhdGgsCisgICAgICBzb3VwX21lc3NhZ2VfZ2V0X2h0dHBfdmVyc2lvbiAobXNnKSk7CisgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2ZvcmVhY2ggKG1zZy0+cmVxdWVzdF9oZWFkZXJzLCBwcmludF9oZWFkZXIsIE5VTEwpOworICBpZiAobXNnLT5yZXF1ZXN0X2JvZHktPmxlbmd0aCkKKyAgICBHU1RfREVCVUcgKCIlcyIsIG1zZy0+cmVxdWVzdF9ib2R5LT5kYXRhKTsKKworICBpZiAobXNnLT5tZXRob2QgPT0gU09VUF9NRVRIT0RfR0VUIHx8IG1zZy0+bWV0aG9kID09IFNPVVBfTUVUSE9EX0hFQUQpCisgICAgZG9fZ2V0IChtc2csIHBhdGgpOworICBlbHNlCisgICAgc291cF9tZXNzYWdlX3NldF9zdGF0dXMgKG1zZywgU09VUF9TVEFUVVNfTk9UX0lNUExFTUVOVEVEKTsKKworICBHU1RfREVCVUcgKCIgIC0+ICVkICVzIiwgbXNnLT5zdGF0dXNfY29kZSwgbXNnLT5yZWFzb25fcGhyYXNlKTsKK30KKworc3RhdGljIGd1aW50CitnZXRfcG9ydF9mcm9tX3NlcnZlciAoU291cFNlcnZlciAqIHNlcnZlcikKK3sKKyAgR1NMaXN0ICp1cmlzOworICBndWludCBwb3J0OworCisgIHVyaXMgPSBzb3VwX3NlcnZlcl9nZXRfdXJpcyAoc2VydmVyKTsKKyAgZ19hc3NlcnQgKGdfc2xpc3RfbGVuZ3RoICh1cmlzKSA9PSAxKTsKKyAgcG9ydCA9IHNvdXBfdXJpX2dldF9wb3J0ICh1cmlzLT5kYXRhKTsKKyAgZ19zbGlzdF9mcmVlX2Z1bGwgKHVyaXMsIChHRGVzdHJveU5vdGlmeSkgc291cF91cmlfZnJlZSk7CisKKyAgcmV0dXJuIHBvcnQ7Cit9CisKK3N0YXRpYyBTb3VwU2VydmVyICoKK3J1bl9zZXJ2ZXIgKGdib29sZWFuIHVzZV9odHRwcykKK3sKKyAgU291cFNlcnZlciAqc2VydmVyID0gc291cF9zZXJ2ZXJfbmV3IChOVUxMLCBOVUxMKTsKKyAgU291cFNlcnZlckxpc3Rlbk9wdGlvbnMgbGlzdGVuX2ZsYWdzID0gMDsKKyAgZ3VpbnQgcG9ydDsKKworCisgIGlmICh1c2VfaHR0cHMpIHsKKyAgICBHVGxzQmFja2VuZCAqYmFja2VuZCA9IGdfdGxzX2JhY2tlbmRfZ2V0X2RlZmF1bHQgKCk7CisgICAgR0Vycm9yICplcnIgPSBOVUxMOworCisgICAgaWYgKGJhY2tlbmQgPT0gTlVMTCB8fCAhZ190bHNfYmFja2VuZF9zdXBwb3J0c190bHMgKGJhY2tlbmQpKSB7CisgICAgICBHU1RfSU5GTyAoIk5vIFRMUyBzdXBwb3J0Iik7CisgICAgICBnX29iamVjdF91bnJlZiAoc2VydmVyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghc291cF9zZXJ2ZXJfc2V0X3NzbF9jZXJ0X2ZpbGUgKHNlcnZlciwgc3NsX2NlcnRfZmlsZSwgc3NsX2tleV9maWxlLAorICAgICAgICAgICZlcnIpKSB7CisgICAgICBHU1RfSU5GTyAoIkZhaWxlZCB0byBsb2FkIGNlcnRpZmljYXRlOiAlcyIsIGVyci0+bWVzc2FnZSk7CisgICAgICBnX29iamVjdF91bnJlZiAoc2VydmVyKTsKKyAgICAgIGdfZXJyb3JfZnJlZSAoZXJyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGxpc3Rlbl9mbGFncyB8PSBTT1VQX1NFUlZFUl9MSVNURU5fSFRUUFM7CisgIH0KKworICBzb3VwX3NlcnZlcl9hZGRfaGFuZGxlciAoc2VydmVyLCBOVUxMLCBzZXJ2ZXJfY2FsbGJhY2ssIE5VTEwsIE5VTEwpOworCisgIHsKKyAgICBTb3VwQXV0aERvbWFpbiAqZG9tYWluOworCisgICAgZG9tYWluID0gc291cF9hdXRoX2RvbWFpbl9iYXNpY19uZXcgKFNPVVBfQVVUSF9ET01BSU5fUkVBTE0sIHJlYWxtLAorICAgICAgICBTT1VQX0FVVEhfRE9NQUlOX0JBU0lDX0FVVEhfQ0FMTEJBQ0ssIGJhc2ljX2F1dGhfY2IsCisgICAgICAgIFNPVVBfQVVUSF9ET01BSU5fQUREX1BBVEgsIGJhc2ljX2F1dGhfcGF0aCwgTlVMTCk7CisgICAgc291cF9zZXJ2ZXJfYWRkX2F1dGhfZG9tYWluIChzZXJ2ZXIsIGRvbWFpbik7CisgICAgZ19vYmplY3RfdW5yZWYgKGRvbWFpbik7CisKKyAgICBkb21haW4gPSBzb3VwX2F1dGhfZG9tYWluX2RpZ2VzdF9uZXcgKFNPVVBfQVVUSF9ET01BSU5fUkVBTE0sIHJlYWxtLAorICAgICAgICBTT1VQX0FVVEhfRE9NQUlOX0RJR0VTVF9BVVRIX0NBTExCQUNLLCBkaWdlc3RfYXV0aF9jYiwKKyAgICAgICAgU09VUF9BVVRIX0RPTUFJTl9BRERfUEFUSCwgZGlnZXN0X2F1dGhfcGF0aCwgTlVMTCk7CisgICAgc291cF9zZXJ2ZXJfYWRkX2F1dGhfZG9tYWluIChzZXJ2ZXIsIGRvbWFpbik7CisgICAgZ19vYmplY3RfdW5yZWYgKGRvbWFpbik7CisgIH0KKworICB7CisgICAgR1NvY2tldEFkZHJlc3MgKmFkZHJlc3M7CisgICAgR0Vycm9yICplcnIgPSBOVUxMOworCisgICAgYWRkcmVzcyA9CisgICAgICAgIGdfaW5ldF9zb2NrZXRfYWRkcmVzc19uZXdfZnJvbV9zdHJpbmcgKCIwLjAuMC4wIiwKKyAgICAgICAgU09VUF9BRERSRVNTX0FOWV9QT1JUKTsKKyAgICBzb3VwX3NlcnZlcl9saXN0ZW4gKHNlcnZlciwgYWRkcmVzcywgbGlzdGVuX2ZsYWdzLCAmZXJyKTsKKyAgICBnX29iamVjdF91bnJlZiAoYWRkcmVzcyk7CisKKyAgICBpZiAoZXJyKSB7CisgICAgICBHU1RfRVJST1IgKCJGYWlsZWQgdG8gc3RhcnQgJXMgc2VydmVyOiAlcyIsCisgICAgICAgICAgdXNlX2h0dHBzID8gIkhUVFBTIiA6ICJIVFRQIiwgZXJyLT5tZXNzYWdlKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXIpOworICAgICAgZ19lcnJvcl9mcmVlIChlcnIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisKKyAgcG9ydCA9IGdldF9wb3J0X2Zyb21fc2VydmVyIChzZXJ2ZXIpOworICBHU1RfREVCVUcgKCIlcyBzZXJ2ZXIgbGlzdGVuaW5nIG9uIHBvcnQgJXUiLCB1c2VfaHR0cHMgPyAiSFRUUFMiIDogIkhUVFAiLAorICAgICAgcG9ydCk7CisKKyAgLyogY2hlY2sgaWYgd2UgY2FuIGNvbm5lY3QgdG8gb3VyIGxvY2FsIGh0dHAgc2VydmVyICovCisgIHsKKyAgICBHU29ja2V0Q29ubmVjdGlvbiAqY29ubjsKKyAgICBHU29ja2V0Q2xpZW50ICpjbGllbnQ7CisKKyAgICBjbGllbnQgPSBnX3NvY2tldF9jbGllbnRfbmV3ICgpOworICAgIGdfc29ja2V0X2NsaWVudF9zZXRfdGltZW91dCAoY2xpZW50LCAyKTsKKyAgICBjb25uID0KKyAgICAgICAgZ19zb2NrZXRfY2xpZW50X2Nvbm5lY3RfdG9faG9zdCAoY2xpZW50LCAiMTI3LjAuMC4xIiwgcG9ydCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKGNvbm4gPT0gTlVMTCkgeworICAgICAgR1NUX0lORk8gKCJDb3VsZG4ndCBjb25uZWN0IHRvIDEyNy4wLjAuMToldSIsIHBvcnQpOworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgICAgICBnX29iamVjdF91bnJlZiAoc2VydmVyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGdfb2JqZWN0X3VucmVmIChjb25uKTsKKyAgICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgfQorCisgIHJldHVybiBzZXJ2ZXI7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9zcGVjdHJ1bS5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvc3BlY3RydW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTdiZTAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvc3BlY3RydW0uYwpAQCAtMCwwICsxLDU0MSBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBzcGVjdHJ1bQorICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDc+IFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworZ2Jvb2xlYW4gaGF2ZV9lb3MgPSBGQUxTRTsKKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcKKyAqIHNyYyBhbmQgc2luayBwYWRzIHdlIGNyZWF0ZTsgb3RoZXJ3aXNlIHdlIGFsd2F5cyBoYXZlIHRvIGRvIGdldF9wYWQsCisgKiBnZXRfcGVlciwgYW5kIHRoZW4gcmVtb3ZlIHJlZmVyZW5jZXMgaW4gZXZlcnkgdGVzdCBmdW5jdGlvbiAqLworR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKKworI2RlZmluZSBTUEVDVF9DQVBTX1RFTVBMQVRFX1NUUklORyBcCisgICAgImF1ZGlvL3gtcmF3LCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICIgcmF0ZSA9IChpbnQpIFsgMSwgTUFYIF0sICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIGNoYW5uZWxzID0gKGludCkgWyAxLCBNQVggXSwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICIgZm9ybWF0ID0gKHN0cmluZykgeyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHU1RfQVVESU9fTkUoUzE2KSAiLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR1NUX0FVRElPX05FKFMzMikgIiwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdTVF9BVURJT19ORShGMzIpICIsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHU1RfQVVESU9fTkUoRjY0KSAiIH0iCisKKyNkZWZpbmUgU1BFQ1RfQ0FQU19TVFJJTkdfUzE2IFwKKyAgImF1ZGlvL3gtcmF3LCAiIFwKKyAgICAicmF0ZSA9IChpbnQpIDQ0MTAwLCAiIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORShTMTYpCisKKyNkZWZpbmUgU1BFQ1RfQ0FQU19TVFJJTkdfUzMyIFwKKyAgImF1ZGlvL3gtcmF3LCAiIFwKKyAgICAicmF0ZSA9IChpbnQpIDQ0MTAwLCAiIFwKKyAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiIFwKKyAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEdTVF9BVURJT19ORShTMzIpCisKKyNkZWZpbmUgU1BFQ1RfQ0FQU19TVFJJTkdfRjMyIFwKKyAgICAiYXVkaW8veC1yYXcsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiByYXRlID0gKGludCkgNDQxMDAsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICIgY2hhbm5lbHMgPSAoaW50KSAxLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIGxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiIFwKKyAgICAiIGZvcm1hdCA9IChzdHJpbmcpICIgR1NUX0FVRElPX05FKEYzMikKKworI2RlZmluZSBTUEVDVF9DQVBTX1NUUklOR19GNjQgXAorICAgICJhdWRpby94LXJhdywgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiIHJhdGUgPSAoaW50KSA0NDEwMCwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIiBjaGFubmVscyA9IChpbnQpIDEsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICIgbGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICAgICIgZm9ybWF0ID0gKHN0cmluZykgIiBHU1RfQVVESU9fTkUoRjY0KQorCisjZGVmaW5lIFNQRUNUX0JBTkRTIDI1NgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChTUEVDVF9DQVBTX1RFTVBMQVRFX1NUUklORykKKyAgICApOworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoU1BFQ1RfQ0FQU19URU1QTEFURV9TVFJJTkcpCisgICAgKTsKKworLyogdGFrZXMgb3ZlciByZWZlcmVuY2UgZm9yIG91dGNhcHMgKi8KK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX3NwZWN0cnVtIChjb25zdCBnY2hhciAqIGNhcHNfc3RyKQoreworICBHc3RFbGVtZW50ICpzcGVjdHJ1bTsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBHU1RfREVCVUcgKCJzZXR1cF9zcGVjdHJ1bSIpOworICBzcGVjdHJ1bSA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgic3BlY3RydW0iKTsKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoc3BlY3RydW0sICZzcmN0ZW1wbGF0ZSk7CisgIG15c2lua3BhZCA9IGdzdF9jaGVja19zZXR1cF9zaW5rX3BhZCAoc3BlY3RydW0sICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoY2Fwc19zdHIpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgc3BlY3RydW0sIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICByZXR1cm4gc3BlY3RydW07Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX3NwZWN0cnVtIChHc3RFbGVtZW50ICogc3BlY3RydW0pCit7CisgIEdTVF9ERUJVRyAoImNsZWFudXBfc3BlY3RydW0iKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkIChzcGVjdHJ1bSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoc3BlY3RydW0pOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAoc3BlY3RydW0pOworCisgIGdfbGlzdF9mb3JlYWNoIChidWZmZXJzLCAoR0Z1bmMpIGdzdF9taW5pX29iamVjdF91bnJlZiwgTlVMTCk7CisgIGdfbGlzdF9mcmVlIChidWZmZXJzKTsKKyAgYnVmZmVycyA9IE5VTEw7Cit9CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfaW50MTYpCit7CisgIEdzdEVsZW1lbnQgKnNwZWN0cnVtOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RCdXMgKmJ1czsKKyAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGludCBpLCBqOworICBnaW50MTYgKmRhdGE7CisgIEdzdE1hcEluZm8gbWFwOworICBjb25zdCBHVmFsdWUgKmxpc3QsICp2YWx1ZTsKKyAgR3N0Q2xvY2tUaW1lIGVuZHRpbWU7CisgIGdmbG9hdCBsZXZlbDsKKworICBzcGVjdHJ1bSA9IHNldHVwX3NwZWN0cnVtIChTUEVDVF9DQVBTX1NUUklOR19TMTYpOworICBnX29iamVjdF9zZXQgKHNwZWN0cnVtLCAicG9zdC1tZXNzYWdlcyIsIFRSVUUsICJpbnRlcnZhbCIsIEdTVF9TRUNPTkQgLyAxMDAsCisgICAgICAiYmFuZHMiLCBTUEVDVF9CQU5EUywgInRocmVzaG9sZCIsIC04MCwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc3BlY3RydW0sCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICAvKiBjcmVhdGUgYSAxIHNlYyBidWZmZXIgd2l0aCBhbiAxMTAyNSBIeiBzaW5lIHdhdmUgKi8KKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgNDQxMDAgKiBzaXplb2YgKGdpbnQxNiksIDApOworICBnc3RfYnVmZmVyX21hcCAoaW5idWZmZXIsICZtYXAsIEdTVF9NQVBfV1JJVEUpOworICBkYXRhID0gKGdpbnQxNiAqKSBtYXAuZGF0YTsKKyAgZm9yIChqID0gMDsgaiA8IDQ0MTAwOyBqICs9IDQpIHsKKyAgICAqZGF0YSA9IDA7CisgICAgKytkYXRhOworICAgICpkYXRhID0gMzI3Njc7CisgICAgKytkYXRhOworICAgICpkYXRhID0gMDsKKyAgICArK2RhdGE7CisgICAgKmRhdGEgPSAtMzI3Njc7CisgICAgKytkYXRhOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIGNyZWF0ZSBhIGJ1cyB0byBnZXQgdGhlIHNwZWN0cnVtIG1lc3NhZ2Ugb24gKi8KKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKGJ1cywgImJ1cyIsIDEpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChzcGVjdHJ1bSwgYnVzKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoYnVzLCAiYnVzIiwgMik7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBidXQgaXQgZW5kcyB1cCBiZWluZyBjb2xsZWN0ZWQgb24gdGhlIGdsb2JhbCBidWZmZXIgbGlzdCAqLworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChpbmJ1ZmZlciA9PSBvdXRidWZmZXIpOworCisgIG1lc3NhZ2UgPSBnc3RfYnVzX3BvbGwgKGJ1cywgR1NUX01FU1NBR0VfRUxFTUVOVCwgLTEpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChtZXNzYWdlLCAibWVzc2FnZSIsIDEpOworCisgIGZhaWxfdW5sZXNzIChtZXNzYWdlICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSA9PSBHU1RfT0JKRUNUIChzcGVjdHJ1bSkpOworICBmYWlsX3VubGVzcyAoR1NUX01FU1NBR0VfVFlQRSAobWVzc2FnZSkgPT0gR1NUX01FU1NBR0VfRUxFTUVOVCk7CisgIHN0cnVjdHVyZSA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1lc3NhZ2UpOworICBmYWlsX2lmIChzdHJ1Y3R1cmUgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKChjaGFyICopIGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSksCisgICAgICAic3BlY3RydW0iKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2Nsb2NrX3RpbWUgKHN0cnVjdHVyZSwgImVuZHRpbWUiLCAmZW5kdGltZSkpOworCisgIGxpc3QgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAibWFnbml0dWRlIik7CisgIGZvciAoaSA9IDA7IGkgPCBTUEVDVF9CQU5EUzsgKytpKSB7CisgICAgdmFsdWUgPSBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKGxpc3QsIGkpOworICAgIGxldmVsID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICBHU1RfREVCVUcgKCJiYW5kWyUzZF0gaXMgJS4yZiIsIGksIGxldmVsKTsKKyAgICAvKiBPbmx5IHRoZSBiYW5kcyBpbiB0aGUgbWlkZGxlIHNob3VsZCBoYXZlIGEgbGV2ZWwgYWJvdmUgNjAgKi8KKyAgICBmYWlsX2lmICgoaSA9PSBTUEVDVF9CQU5EUyAvIDIgfHwgaSA9PSBTUEVDVF9CQU5EUyAvIDIgLSAxKQorICAgICAgICAmJiBsZXZlbCA8IC0yMC4wKTsKKyAgICBmYWlsX2lmICgoaSAhPSBTUEVDVF9CQU5EUyAvIDIgJiYgaSAhPSBTUEVDVF9CQU5EUyAvIDIgLSAxKQorICAgICAgICAmJiBsZXZlbCA+IC0yMC4wKTsKKyAgfQorICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworICBmYWlsX3VubGVzcyAoaW5idWZmZXIgPT0gb3V0YnVmZmVyKTsKKworICAvKiBjbGVhbiB1cCAqLworICAvKiBmbHVzaCBjdXJyZW50IG1lc3NhZ2VzLGFuZCBmdXR1cmUgc3RhdGUgY2hhbmdlIG1lc3NhZ2VzICovCisgIGdzdF9idXNfc2V0X2ZsdXNoaW5nIChidXMsIFRSVUUpOworCisgIC8qIG1lc3NhZ2UgaGFzIGEgcmVmIHRvIHRoZSBlbGVtZW50ICovCisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHNwZWN0cnVtLCAic3BlY3RydW0iLCAyKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChzcGVjdHJ1bSwgInNwZWN0cnVtIiwgMSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAoc3BlY3RydW0sIE5VTEwpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChidXMsICJidXMiLCAxKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc3BlY3RydW0sCisgICAgICAgICAgR1NUX1NUQVRFX05VTEwpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywgImNvdWxkIG5vdCBzZXQgdG8gbnVsbCIpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChzcGVjdHJ1bSwgInNwZWN0cnVtIiwgMSk7CisgIGNsZWFudXBfc3BlY3RydW0gKHNwZWN0cnVtKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9pbnQzMikKK3sKKyAgR3N0RWxlbWVudCAqc3BlY3RydW07CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdEJ1cyAqYnVzOworICBHc3RNZXNzYWdlICptZXNzYWdlOworICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgaW50IGksIGo7CisgIGdpbnQzMiAqZGF0YTsKKyAgR3N0TWFwSW5mbyBtYXA7CisgIGNvbnN0IEdWYWx1ZSAqbGlzdCwgKnZhbHVlOworICBHc3RDbG9ja1RpbWUgZW5kdGltZTsKKyAgZ2Zsb2F0IGxldmVsOworCisgIHNwZWN0cnVtID0gc2V0dXBfc3BlY3RydW0gKFNQRUNUX0NBUFNfU1RSSU5HX1MzMik7CisgIGdfb2JqZWN0X3NldCAoc3BlY3RydW0sICJwb3N0LW1lc3NhZ2VzIiwgVFJVRSwgImludGVydmFsIiwgR1NUX1NFQ09ORCAvIDEwMCwKKyAgICAgICJiYW5kcyIsIFNQRUNUX0JBTkRTLCAidGhyZXNob2xkIiwgLTgwLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzcGVjdHJ1bSwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIC8qIGNyZWF0ZSBhIDEgc2VjIGJ1ZmZlciB3aXRoIGFuIDExMDI1IEh6IHNpbmUgd2F2ZSAqLworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCA0NDEwMCAqIHNpemVvZiAoZ2ludDMyKSwgMCk7CisgIGdzdF9idWZmZXJfbWFwIChpbmJ1ZmZlciwgJm1hcCwgR1NUX01BUF9XUklURSk7CisgIGRhdGEgPSAoZ2ludDMyICopIG1hcC5kYXRhOworICBmb3IgKGogPSAwOyBqIDwgNDQxMDA7IGogKz0gNCkgeworICAgICpkYXRhID0gMDsKKyAgICArK2RhdGE7CisgICAgKmRhdGEgPSAyMTQ3NDgzNjQ3OworICAgICsrZGF0YTsKKyAgICAqZGF0YSA9IDA7CisgICAgKytkYXRhOworICAgICpkYXRhID0gLTIxNDc0ODM2NDc7CisgICAgKytkYXRhOworICB9CisgIGdzdF9idWZmZXJfdW5tYXAgKGluYnVmZmVyLCAmbWFwKTsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIC8qIGNyZWF0ZSBhIGJ1cyB0byBnZXQgdGhlIHNwZWN0cnVtIG1lc3NhZ2Ugb24gKi8KKyAgYnVzID0gZ3N0X2J1c19uZXcgKCk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKGJ1cywgImJ1cyIsIDEpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChzcGVjdHJ1bSwgYnVzKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoYnVzLCAiYnVzIiwgMik7CisKKyAgLyogcHVzaGluZyBnaXZlcyBhd2F5IG15IHJlZmVyZW5jZSAuLi4gKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSA9PSBHU1RfRkxPV19PSyk7CisgIC8qIC4uLiBidXQgaXQgZW5kcyB1cCBiZWluZyBjb2xsZWN0ZWQgb24gdGhlIGdsb2JhbCBidWZmZXIgbGlzdCAqLworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChpbmJ1ZmZlciA9PSBvdXRidWZmZXIpOworCisgIG1lc3NhZ2UgPSBnc3RfYnVzX3BvbGwgKGJ1cywgR1NUX01FU1NBR0VfRUxFTUVOVCwgLTEpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChtZXNzYWdlLCAibWVzc2FnZSIsIDEpOworCisgIGZhaWxfdW5sZXNzIChtZXNzYWdlICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSA9PSBHU1RfT0JKRUNUIChzcGVjdHJ1bSkpOworICBmYWlsX3VubGVzcyAoR1NUX01FU1NBR0VfVFlQRSAobWVzc2FnZSkgPT0gR1NUX01FU1NBR0VfRUxFTUVOVCk7CisgIHN0cnVjdHVyZSA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1lc3NhZ2UpOworICBmYWlsX2lmIChzdHJ1Y3R1cmUgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKChjaGFyICopIGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHN0cnVjdHVyZSksCisgICAgICAic3BlY3RydW0iKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2Nsb2NrX3RpbWUgKHN0cnVjdHVyZSwgImVuZHRpbWUiLCAmZW5kdGltZSkpOworCisgIGxpc3QgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoc3RydWN0dXJlLCAibWFnbml0dWRlIik7CisgIGZvciAoaSA9IDA7IGkgPCBTUEVDVF9CQU5EUzsgKytpKSB7CisgICAgdmFsdWUgPSBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKGxpc3QsIGkpOworICAgIGxldmVsID0gZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICBHU1RfREVCVUcgKCJiYW5kWyUzZF0gaXMgJS4yZiIsIGksIGxldmVsKTsKKyAgICAvKiBPbmx5IHRoZSBiYW5kcyBpbiB0aGUgbWlkZGxlIHNob3VsZCBoYXZlIGEgbGV2ZWwgYWJvdmUgNjAgKi8KKyAgICBmYWlsX2lmICgoaSA9PSBTUEVDVF9CQU5EUyAvIDIgfHwgaSA9PSBTUEVDVF9CQU5EUyAvIDIgLSAxKQorICAgICAgICAmJiBsZXZlbCA8IC0yMC4wKTsKKyAgICBmYWlsX2lmICgoaSAhPSBTUEVDVF9CQU5EUyAvIDIgJiYgaSAhPSBTUEVDVF9CQU5EUyAvIDIgLSAxKQorICAgICAgICAmJiBsZXZlbCA+IC0yMC4wKTsKKyAgfQorICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworICBmYWlsX3VubGVzcyAoaW5idWZmZXIgPT0gb3V0YnVmZmVyKTsKKworICAvKiBjbGVhbiB1cCAqLworICAvKiBmbHVzaCBjdXJyZW50IG1lc3NhZ2VzLGFuZCBmdXR1cmUgc3RhdGUgY2hhbmdlIG1lc3NhZ2VzICovCisgIGdzdF9idXNfc2V0X2ZsdXNoaW5nIChidXMsIFRSVUUpOworCisgIC8qIG1lc3NhZ2UgaGFzIGEgcmVmIHRvIHRoZSBlbGVtZW50ICovCisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHNwZWN0cnVtLCAic3BlY3RydW0iLCAyKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1lc3NhZ2UpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChzcGVjdHJ1bSwgInNwZWN0cnVtIiwgMSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAoc3BlY3RydW0sIE5VTEwpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChidXMsICJidXMiLCAxKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc3BlY3RydW0sCisgICAgICAgICAgR1NUX1NUQVRFX05VTEwpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywgImNvdWxkIG5vdCBzZXQgdG8gbnVsbCIpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChzcGVjdHJ1bSwgInNwZWN0cnVtIiwgMSk7CisgIGNsZWFudXBfc3BlY3RydW0gKHNwZWN0cnVtKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mbG9hdDMyKQoreworICBHc3RFbGVtZW50ICpzcGVjdHJ1bTsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgR3N0QnVzICpidXM7CisgIEdzdE1lc3NhZ2UgKm1lc3NhZ2U7CisgIGNvbnN0IEdzdFN0cnVjdHVyZSAqc3RydWN0dXJlOworICBpbnQgaSwgajsKKyAgZ2Zsb2F0ICpkYXRhOworICBHc3RNYXBJbmZvIG1hcDsKKyAgY29uc3QgR1ZhbHVlICpsaXN0LCAqdmFsdWU7CisgIEdzdENsb2NrVGltZSBlbmR0aW1lOworICBnZmxvYXQgbGV2ZWw7CisKKyAgc3BlY3RydW0gPSBzZXR1cF9zcGVjdHJ1bSAoU1BFQ1RfQ0FQU19TVFJJTkdfRjMyKTsKKyAgZ19vYmplY3Rfc2V0IChzcGVjdHJ1bSwgInBvc3QtbWVzc2FnZXMiLCBUUlVFLCAiaW50ZXJ2YWwiLCBHU1RfU0VDT05EIC8gMTAwLAorICAgICAgImJhbmRzIiwgU1BFQ1RfQkFORFMsICJ0aHJlc2hvbGQiLCAtODAsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNwZWN0cnVtLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgLyogY3JlYXRlIGEgMSBzZWMgYnVmZmVyIHdpdGggYW4gMTEwMjUgSHogc2luZSB3YXZlICovCisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIDQ0MTAwICogc2l6ZW9mIChnZmxvYXQpLCAwKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgZGF0YSA9IChnZmxvYXQgKikgbWFwLmRhdGE7CisgIGZvciAoaiA9IDA7IGogPCA0NDEwMDsgaiArPSA0KSB7CisgICAgKmRhdGEgPSAwLjA7CisgICAgKytkYXRhOworICAgICpkYXRhID0gMS4wOworICAgICsrZGF0YTsKKyAgICAqZGF0YSA9IDAuMDsKKyAgICArK2RhdGE7CisgICAgKmRhdGEgPSAtMS4wOworICAgICsrZGF0YTsKKyAgfQorICBnc3RfYnVmZmVyX3VubWFwIChpbmJ1ZmZlciwgJm1hcCk7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKworICAvKiBjcmVhdGUgYSBidXMgdG8gZ2V0IHRoZSBzcGVjdHJ1bSBtZXNzYWdlIG9uICovCisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChidXMsICJidXMiLCAxKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAoc3BlY3RydW0sIGJ1cyk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKGJ1cywgImJ1cyIsIDIpOworCisgIC8qIHB1c2hpbmcgZ2l2ZXMgYXdheSBteSByZWZlcmVuY2UgLi4uICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworICAvKiAuLi4gYnV0IGl0IGVuZHMgdXAgYmVpbmcgY29sbGVjdGVkIG9uIHRoZSBnbG9iYWwgYnVmZmVyIGxpc3QgKi8KKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGZhaWxfaWYgKChvdXRidWZmZXIgPSAoR3N0QnVmZmVyICopIGJ1ZmZlcnMtPmRhdGEpID09IE5VTEwpOworICBmYWlsX3VubGVzcyAoaW5idWZmZXIgPT0gb3V0YnVmZmVyKTsKKworICBtZXNzYWdlID0gZ3N0X2J1c19wb2xsIChidXMsIEdTVF9NRVNTQUdFX0VMRU1FTlQsIC0xKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAobWVzc2FnZSwgIm1lc3NhZ2UiLCAxKTsKKworICBmYWlsX3VubGVzcyAobWVzc2FnZSAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSkgPT0gR1NUX09CSkVDVCAoc3BlY3RydW0pKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9NRVNTQUdFX1RZUEUgKG1lc3NhZ2UpID09IEdTVF9NRVNTQUdFX0VMRU1FTlQpOworICBzdHJ1Y3R1cmUgPSBnc3RfbWVzc2FnZV9nZXRfc3RydWN0dXJlIChtZXNzYWdlKTsKKyAgZmFpbF9pZiAoc3RydWN0dXJlID09IE5VTEwpOworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nICgoY2hhciAqKSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzdHJ1Y3R1cmUpLAorICAgICAgInNwZWN0cnVtIik7CisgIGZhaWxfdW5sZXNzIChnc3Rfc3RydWN0dXJlX2dldF9jbG9ja190aW1lIChzdHJ1Y3R1cmUsICJlbmR0aW1lIiwgJmVuZHRpbWUpKTsKKworICBsaXN0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHN0cnVjdHVyZSwgIm1hZ25pdHVkZSIpOworICBmb3IgKGkgPSAwOyBpIDwgU1BFQ1RfQkFORFM7ICsraSkgeworICAgIHZhbHVlID0gZ3N0X3ZhbHVlX2xpc3RfZ2V0X3ZhbHVlIChsaXN0LCBpKTsKKyAgICBsZXZlbCA9IGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisgICAgR1NUX0RFQlVHICgiYmFuZFslM2RdIGlzICUuMmYiLCBpLCBsZXZlbCk7CisgICAgLyogT25seSB0aGUgYmFuZHMgaW4gdGhlIG1pZGRsZSBzaG91bGQgaGF2ZSBhIGxldmVsIGFib3ZlIDYwICovCisgICAgZmFpbF9pZiAoKGkgPT0gU1BFQ1RfQkFORFMgLyAyIHx8IGkgPT0gU1BFQ1RfQkFORFMgLyAyIC0gMSkKKyAgICAgICAgJiYgbGV2ZWwgPCAtMjAuMCk7CisgICAgZmFpbF9pZiAoKGkgIT0gU1BFQ1RfQkFORFMgLyAyICYmIGkgIT0gU1BFQ1RfQkFORFMgLyAyIC0gMSkKKyAgICAgICAgJiYgbGV2ZWwgPiAtMjAuMCk7CisgIH0KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGluYnVmZmVyID09IG91dGJ1ZmZlcik7CisKKyAgLyogY2xlYW4gdXAgKi8KKyAgLyogZmx1c2ggY3VycmVudCBtZXNzYWdlcyxhbmQgZnV0dXJlIHN0YXRlIGNoYW5nZSBtZXNzYWdlcyAqLworICBnc3RfYnVzX3NldF9mbHVzaGluZyAoYnVzLCBUUlVFKTsKKworICAvKiBtZXNzYWdlIGhhcyBhIHJlZiB0byB0aGUgZWxlbWVudCAqLworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChzcGVjdHJ1bSwgInNwZWN0cnVtIiwgMik7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoc3BlY3RydW0sICJzcGVjdHJ1bSIsIDEpOworCisgIGdzdF9lbGVtZW50X3NldF9idXMgKHNwZWN0cnVtLCBOVUxMKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoYnVzLCAiYnVzIiwgMSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNwZWN0cnVtLAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsICJjb3VsZCBub3Qgc2V0IHRvIG51bGwiKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoc3BlY3RydW0sICJzcGVjdHJ1bSIsIDEpOworICBjbGVhbnVwX3NwZWN0cnVtIChzcGVjdHJ1bSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZmxvYXQ2NCkKK3sKKyAgR3N0RWxlbWVudCAqc3BlY3RydW07CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIEdzdEJ1cyAqYnVzOworICBHc3RNZXNzYWdlICptZXNzYWdlOworICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnN0cnVjdHVyZTsKKyAgaW50IGksIGo7CisgIGdkb3VibGUgKmRhdGE7CisgIEdzdE1hcEluZm8gbWFwOworICBjb25zdCBHVmFsdWUgKmxpc3QsICp2YWx1ZTsKKyAgR3N0Q2xvY2tUaW1lIGVuZHRpbWU7CisgIGdmbG9hdCBsZXZlbDsKKworICBzcGVjdHJ1bSA9IHNldHVwX3NwZWN0cnVtIChTUEVDVF9DQVBTX1NUUklOR19GNjQpOworICBnX29iamVjdF9zZXQgKHNwZWN0cnVtLCAicG9zdC1tZXNzYWdlcyIsIFRSVUUsICJpbnRlcnZhbCIsIEdTVF9TRUNPTkQgLyAxMDAsCisgICAgICAiYmFuZHMiLCBTUEVDVF9CQU5EUywgInRocmVzaG9sZCIsIC04MCwgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc3BlY3RydW0sCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUywKKyAgICAgICJjb3VsZCBub3Qgc2V0IHRvIHBsYXlpbmciKTsKKworICAvKiBjcmVhdGUgYSAxIHNlYyBidWZmZXIgd2l0aCBhbiAxMTAyNSBIeiBzaW5lIHdhdmUgKi8KKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbGxvY2F0ZSAoTlVMTCwgNDQxMDAgKiBzaXplb2YgKGdkb3VibGUpLCAwKTsKKyAgZ3N0X2J1ZmZlcl9tYXAgKGluYnVmZmVyLCAmbWFwLCBHU1RfTUFQX1dSSVRFKTsKKyAgZGF0YSA9IChnZG91YmxlICopIG1hcC5kYXRhOworICBmb3IgKGogPSAwOyBqIDwgNDQxMDA7IGogKz0gNCkgeworICAgICpkYXRhID0gMC4wOworICAgICsrZGF0YTsKKyAgICAqZGF0YSA9IDEuMDsKKyAgICArK2RhdGE7CisgICAgKmRhdGEgPSAwLjA7CisgICAgKytkYXRhOworICAgICpkYXRhID0gLTEuMDsKKyAgICArK2RhdGE7CisgIH0KKyAgZ3N0X2J1ZmZlcl91bm1hcCAoaW5idWZmZXIsICZtYXApOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisKKyAgLyogY3JlYXRlIGEgYnVzIHRvIGdldCB0aGUgc3BlY3RydW0gbWVzc2FnZSBvbiAqLworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoYnVzLCAiYnVzIiwgMSk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKHNwZWN0cnVtLCBidXMpOworICBBU1NFUlRfT0JKRUNUX1JFRkNPVU5UIChidXMsICJidXMiLCAyKTsKKworICAvKiBwdXNoaW5nIGdpdmVzIGF3YXkgbXkgcmVmZXJlbmNlIC4uLiAqLworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgLyogLi4uIGJ1dCBpdCBlbmRzIHVwIGJlaW5nIGNvbGxlY3RlZCBvbiB0aGUgZ2xvYmFsIGJ1ZmZlciBsaXN0ICovCisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ19saXN0X2xlbmd0aCAoYnVmZmVycyksIDEpOworICBmYWlsX2lmICgob3V0YnVmZmVyID0gKEdzdEJ1ZmZlciAqKSBidWZmZXJzLT5kYXRhKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGluYnVmZmVyID09IG91dGJ1ZmZlcik7CisKKyAgbWVzc2FnZSA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9FTEVNRU5ULCAtMSk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKG1lc3NhZ2UsICJtZXNzYWdlIiwgMSk7CisKKyAgZmFpbF91bmxlc3MgKG1lc3NhZ2UgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpID09IEdTVF9PQkpFQ1QgKHNwZWN0cnVtKSk7CisgIGZhaWxfdW5sZXNzIChHU1RfTUVTU0FHRV9UWVBFIChtZXNzYWdlKSA9PSBHU1RfTUVTU0FHRV9FTEVNRU5UKTsKKyAgc3RydWN0dXJlID0gZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobWVzc2FnZSk7CisgIGZhaWxfaWYgKHN0cnVjdHVyZSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX3N0cmluZyAoKGNoYXIgKikgZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAoc3RydWN0dXJlKSwKKyAgICAgICJzcGVjdHJ1bSIpOworICBmYWlsX3VubGVzcyAoZ3N0X3N0cnVjdHVyZV9nZXRfY2xvY2tfdGltZSAoc3RydWN0dXJlLCAiZW5kdGltZSIsICZlbmR0aW1lKSk7CisKKyAgbGlzdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJtYWduaXR1ZGUiKTsKKyAgZm9yIChpID0gMDsgaSA8IFNQRUNUX0JBTkRTOyArK2kpIHsKKyAgICB2YWx1ZSA9IGdzdF92YWx1ZV9saXN0X2dldF92YWx1ZSAobGlzdCwgaSk7CisgICAgbGV2ZWwgPSBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgIEdTVF9ERUJVRyAoImJhbmRbJTNkXSBpcyAlLjJmIiwgaSwgbGV2ZWwpOworICAgIC8qIE9ubHkgdGhlIGJhbmRzIGluIHRoZSBtaWRkbGUgc2hvdWxkIGhhdmUgYSBsZXZlbCBhYm92ZSA2MCAqLworICAgIGZhaWxfaWYgKChpID09IFNQRUNUX0JBTkRTIC8gMiB8fCBpID09IFNQRUNUX0JBTkRTIC8gMiAtIDEpCisgICAgICAgICYmIGxldmVsIDwgLTIwLjApOworICAgIGZhaWxfaWYgKChpICE9IFNQRUNUX0JBTkRTIC8gMiAmJiBpICE9IFNQRUNUX0JBTkRTIC8gMiAtIDEpCisgICAgICAgICYmIGxldmVsID4gLTIwLjApOworICB9CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpLCAxKTsKKyAgZmFpbF9pZiAoKG91dGJ1ZmZlciA9IChHc3RCdWZmZXIgKikgYnVmZmVycy0+ZGF0YSkgPT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChpbmJ1ZmZlciA9PSBvdXRidWZmZXIpOworCisgIC8qIGNsZWFuIHVwICovCisgIC8qIGZsdXNoIGN1cnJlbnQgbWVzc2FnZXMsYW5kIGZ1dHVyZSBzdGF0ZSBjaGFuZ2UgbWVzc2FnZXMgKi8KKyAgZ3N0X2J1c19zZXRfZmx1c2hpbmcgKGJ1cywgVFJVRSk7CisKKyAgLyogbWVzc2FnZSBoYXMgYSByZWYgdG8gdGhlIGVsZW1lbnQgKi8KKyAgQVNTRVJUX09CSkVDVF9SRUZDT1VOVCAoc3BlY3RydW0sICJzcGVjdHJ1bSIsIDIpOworICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHNwZWN0cnVtLCAic3BlY3RydW0iLCAxKTsKKworICBnc3RfZWxlbWVudF9zZXRfYnVzIChzcGVjdHJ1bSwgTlVMTCk7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKGJ1cywgImJ1cyIsIDEpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzcGVjdHJ1bSwKKyAgICAgICAgICBHU1RfU1RBVEVfTlVMTCkgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLCAiY291bGQgbm90IHNldCB0byBudWxsIik7CisgIEFTU0VSVF9PQkpFQ1RfUkVGQ09VTlQgKHNwZWN0cnVtLCAic3BlY3RydW0iLCAxKTsKKyAgY2xlYW51cF9zcGVjdHJ1bSAoc3BlY3RydW0pOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworc3RhdGljIFN1aXRlICoKK3NwZWN0cnVtX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInNwZWN0cnVtIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ludDE2KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2ludDMyKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2Zsb2F0MzIpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZmxvYXQ2NCk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChzcGVjdHJ1bSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy9zcGxpdG11eC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvc3BsaXRtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmI3OGQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvc3BsaXRtdXguYwpAQCAtMCwwICsxLDc5MyBAQAorLyogR1N0cmVhbWVyIHVuaXQgdGVzdCBmb3Igc3BsaXRtdXhzcmMvc2luayBlbGVtZW50cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxNSBKYW4gU2NobWlkdCA8amFuQGNlbnRyaWN1bGFyLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdsaWIvZ3N0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvYXBwL2FwcC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitnY2hhciAqdG1wZGlyID0gTlVMTDsKK0dzdENsb2NrVGltZSBmaXJzdF90czsKK0dzdENsb2NrVGltZSBsYXN0X3RzOworZ2RvdWJsZSBjdXJyZW50X3JhdGU7CisKK3N0YXRpYyB2b2lkCit0ZW1wZGlyX3NldHVwICh2b2lkKQoreworICBjb25zdCBnY2hhciAqc3lzdG1wID0gZ19nZXRfdG1wX2RpciAoKTsKKyAgdG1wZGlyID0gZ19idWlsZF9maWxlbmFtZSAoc3lzdG1wLCAic3BsaXRtdXgtdGVzdC1YWFhYWFgiLCBOVUxMKTsKKyAgLyogUmV3cml0ZXMgdG1wZGlyIHRlbXBsYXRlIGlucHV0OiAqLworICB0bXBkaXIgPSBnX21rZHRlbXAgKHRtcGRpcik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZW1wZGlyX2NsZWFudXAgKHZvaWQpCit7CisgIEdEaXIgKmQ7CisgIGNvbnN0IGdjaGFyICpmOworCisgIGZhaWxfaWYgKHRtcGRpciA9PSBOVUxMKTsKKworICBkID0gZ19kaXJfb3BlbiAodG1wZGlyLCAwLCBOVUxMKTsKKyAgZmFpbF9pZiAoZCA9PSBOVUxMKTsKKworICB3aGlsZSAoKGYgPSBnX2Rpcl9yZWFkX25hbWUgKGQpKSAhPSBOVUxMKSB7CisgICAgZ2NoYXIgKmZuYW1lID0gZ19idWlsZF9maWxlbmFtZSAodG1wZGlyLCBmLCBOVUxMKTsKKyAgICBmYWlsX2lmIChnX3JlbW92ZSAoZm5hbWUpICE9IDAsICJGYWlsZWQgdG8gcmVtb3ZlIHRtcCBmaWxlICVzIiwgZm5hbWUpOworICAgIGdfZnJlZSAoZm5hbWUpOworICB9CisgIGdfZGlyX2Nsb3NlIChkKTsKKworICBmYWlsX2lmIChnX3JlbW92ZSAodG1wZGlyKSAhPSAwLCAiRmFpbGVkIHRvIGRlbGV0ZSB0bXBkaXIgJXMiLCB0bXBkaXIpOworCisgIGdfZnJlZSAodG1wZGlyKTsKKyAgdG1wZGlyID0gTlVMTDsKK30KKworc3RhdGljIGd1aW50Citjb3VudF9maWxlcyAoY29uc3QgZ2NoYXIgKiB0YXJnZXQpCit7CisgIEdEaXIgKmQ7CisgIGNvbnN0IGdjaGFyICpmOworICBndWludCByZXQgPSAwOworCisgIGQgPSBnX2Rpcl9vcGVuICh0YXJnZXQsIDAsIE5VTEwpOworICBmYWlsX2lmIChkID09IE5VTEwpOworCisgIHdoaWxlICgoZiA9IGdfZGlyX3JlYWRfbmFtZSAoZCkpICE9IE5VTEwpCisgICAgcmV0Kys7CisgIGdfZGlyX2Nsb3NlIChkKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZHVtcF9lcnJvciAoR3N0TWVzc2FnZSAqIG1zZykKK3sKKyAgR0Vycm9yICplcnIgPSBOVUxMOworICBnY2hhciAqZGJnX2luZm87CisKKyAgZmFpbF91bmxlc3MgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRVJST1IpOworCisgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtc2csICZlcnIsICZkYmdfaW5mbyk7CisKKyAgZ19wcmludGVyciAoIkVSUk9SIGZyb20gZWxlbWVudCAlczogJXNcbiIsCisgICAgICBHU1RfT0JKRUNUX05BTUUgKG1zZy0+c3JjKSwgZXJyLT5tZXNzYWdlKTsKKyAgZ19wcmludGVyciAoIkRlYnVnZ2luZyBpbmZvOiAlc1xuIiwgKGRiZ19pbmZvKSA/IGRiZ19pbmZvIDogIm5vbmUiKTsKKyAgZ19lcnJvcl9mcmVlIChlcnIpOworICBnX2ZyZWUgKGRiZ19pbmZvKTsKK30KKworc3RhdGljIEdzdE1lc3NhZ2UgKgorcnVuX3BpcGVsaW5lIChHc3RFbGVtZW50ICogcGlwZWxpbmUpCit7CisgIEdzdEJ1cyAqYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAoR1NUX0VMRU1FTlQgKHBpcGVsaW5lKSk7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIG1zZyA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9FT1MgfCBHU1RfTUVTU0FHRV9FUlJPUiwgLTEpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKworICBpZiAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FUlJPUikKKyAgICBkdW1wX2Vycm9yIChtc2cpOworCisgIHJldHVybiBtc2c7Cit9CisKK3N0YXRpYyB2b2lkCitzZWVrX3BpcGVsaW5lIChHc3RFbGVtZW50ICogcGlwZWxpbmUsIGdkb3VibGUgcmF0ZSwgR3N0Q2xvY2tUaW1lIHN0YXJ0LAorICAgIEdzdENsb2NrVGltZSBlbmQpCit7CisgIC8qIFBhdXNlIHRoZSBwaXBlbGluZSwgc2VlayB0byB0aGUgZGVzaXJlZCByYW5nZSAvIHJhdGUsIHdhaXQgZm9yIFBBVVNFRCBhZ2FpbiwgdGhlbgorICAgKiBjbGVhciB0aGUgdHJhY2tpbmcgdmFycyBmb3Igc3RhcnRfdHMgLyBlbmRfdHMgKi8KKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BBVVNFRCk7CisgIGdzdF9lbGVtZW50X2dldF9zdGF0ZSAocGlwZWxpbmUsIE5VTEwsIE5VTEwsIEdTVF9DTE9DS19USU1FX05PTkUpOworCisgIC8qIHNwZWNpZmljIGVuZCB0aW1lIG5vdCBpbXBsZW1lbnRlZDogKi8KKyAgZmFpbF91bmxlc3MgKGVuZCA9PSBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKworICBnc3RfZWxlbWVudF9zZWVrIChwaXBlbGluZSwgcmF0ZSwgR1NUX0ZPUk1BVF9USU1FLAorICAgICAgR1NUX1NFRUtfRkxBR19GTFVTSCB8IEdTVF9TRUVLX0ZMQUdfQUNDVVJBVEUsIEdTVF9TRUVLX1RZUEVfU0VULCBzdGFydCwKKyAgICAgIEdTVF9TRUVLX1RZUEVfRU5ELCAwKTsKKworICAvKiBXYWl0IGZvciB0aGUgcGlwZWxpbmUgdG8gcHJlcm9sbCBhZ2FpbiAqLworICBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKHBpcGVsaW5lLCBOVUxMLCBOVUxMLCBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKworICBHU1RfTE9HICgiU2Vla2VkIHBpcGVsaW5lLiBSYXRlICVmIHRpbWUgcmFuZ2UgJSIgR1NUX1RJTUVfRk9STUFUICIgdG8gJSIKKyAgICAgIEdTVF9USU1FX0ZPUk1BVCwgcmF0ZSwgR1NUX1RJTUVfQVJHUyAoc3RhcnQpLCBHU1RfVElNRV9BUkdTIChlbmQpKTsKKworICAvKiBDbGVhciB0cmFja2luZyB2YXJpYWJsZXMgbm93IHRoYXQgdGhlIHNlZWsgaXMgY29tcGxldGUgKi8KKyAgZmlyc3RfdHMgPSBsYXN0X3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgY3VycmVudF9yYXRlID0gcmF0ZTsKK307CisKK3N0YXRpYyB2b2lkCityZWNlaXZlX2hhbmRvZmYgKEdzdEVsZW1lbnQgKiBvYmplY3QgR19HTlVDX1VOVVNFRCwgR3N0QnVmZmVyICogYnVmLAorICAgIEdzdFBhZCAqIGFyZzEgR19HTlVDX1VOVVNFRCwgZ3BvaW50ZXIgdXNlcl9kYXRhIEdfR05VQ19VTlVTRUQpCit7CisgIEdzdENsb2NrVGltZSBzdGFydCA9IEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWYpOworICBHc3RDbG9ja1RpbWUgZW5kID0gc3RhcnQ7CisKKyAgaWYgKEdTVF9CVUZGRVJfRFVSQVRJT05fSVNfVkFMSUQgKGJ1ZikpCisgICAgZW5kICs9IEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1Zik7CisKKyAgR1NUX0xPRyAoIkdvdCBidWZmZXIgJSIgR1NUX1RJTUVfRk9STUFUICIgdG8gJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoc3RhcnQpLCBHU1RfVElNRV9BUkdTIChlbmQpKTsKKworICAvKiBDaGVjayB0aW1lIGlzIG1vdmluZyBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uICovCisgIGlmIChjdXJyZW50X3JhdGUgPiAwKSB7CisgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChmaXJzdF90cykpCisgICAgICBmYWlsX3VubGVzcyAoc3RhcnQgPj0gZmlyc3RfdHMsCisgICAgICAgICAgIlRpbWVzdGFtcHMgd2VudCBiYWNrd2FyZCBkdXJpbmcgZm9yd2FyZCBwbGF5LCAlIiBHU1RfVElNRV9GT1JNQVQKKyAgICAgICAgICAiIDwgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChzdGFydCksCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZmlyc3RfdHMpKTsKKyAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKGxhc3RfdHMpKQorICAgICAgZmFpbF91bmxlc3MgKGVuZCA+PSBsYXN0X3RzLAorICAgICAgICAgICJUaW1lc3RhbXBzIHdlbnQgYmFja3dhcmQgZHVyaW5nIGZvcndhcmQgcGxheSwgJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAgICAgIiA8ICUiIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAoZW5kKSwgR1NUX1RJTUVfQVJHUyAobGFzdF90cykpOworICB9IGVsc2UgeworICAgIGZhaWxfdW5sZXNzIChzdGFydCA8PSBmaXJzdF90cywKKyAgICAgICAgIlRpbWVzdGFtcHMgd2VudCBmb3J3YXJkIGR1cmluZyByZXZlcnNlIHBsYXksICUiIEdTVF9USU1FX0ZPUk1BVCAiID4gJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChzdGFydCksIEdTVF9USU1FX0FSR1MgKGZpcnN0X3RzKSk7CisgICAgZmFpbF91bmxlc3MgKGVuZCA8PSBsYXN0X3RzLAorICAgICAgICAiVGltZXN0YW1wcyB3ZW50IGZvcndhcmQgZHVyaW5nIHJldmVyc2UgcGxheSwgJSIgR1NUX1RJTUVfRk9STUFUICIgPiAlIgorICAgICAgICBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGVuZCksIEdTVF9USU1FX0FSR1MgKGxhc3RfdHMpKTsKKyAgfQorCisgIC8qIHVwZGF0ZSB0aGUgcmFuZ2Ugb2YgdGltZXN0YW1wcyB3ZSd2ZSBlbmNvdW50ZXJlZCAqLworICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChmaXJzdF90cykgfHwgc3RhcnQgPCBmaXJzdF90cykKKyAgICBmaXJzdF90cyA9IHN0YXJ0OworICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElEIChsYXN0X3RzKSB8fCBlbmQgPiBsYXN0X3RzKQorICAgIGxhc3RfdHMgPSBlbmQ7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3BsYXliYWNrIChjb25zdCBnY2hhciAqIGluX3BhdHRlcm4sIEdzdENsb2NrVGltZSBleHBfZmlyc3RfdGltZSwKKyAgICBHc3RDbG9ja1RpbWUgZXhwX2xhc3RfdGltZSkKK3sKKyAgR3N0TWVzc2FnZSAqbXNnOworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0RWxlbWVudCAqZmFrZXNpbms7CisgIGdjaGFyICp1cmk7CisKKyAgcGlwZWxpbmUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJwbGF5YmluIiwgTlVMTCk7CisgIGZhaWxfaWYgKHBpcGVsaW5lID09IE5VTEwpOworCisgIGZha2VzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCBOVUxMKTsKKyAgZmFpbF9pZiAoZmFrZXNpbmsgPT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHBpcGVsaW5lKSwgInZpZGVvLXNpbmsiLCBmYWtlc2luaywgTlVMTCk7CisKKyAgdXJpID0gZ19zdHJkdXBfcHJpbnRmICgic3BsaXRtdXg6Ly8lcyIsIGluX3BhdHRlcm4pOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHBpcGVsaW5lKSwgInVyaSIsIHVyaSwgTlVMTCk7CisgIGdfZnJlZSAodXJpKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChmYWtlc2luaywgImhhbmRvZmYiLCAoR0NhbGxiYWNrKSByZWNlaXZlX2hhbmRvZmYsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChmYWtlc2luayksICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCBOVUxMKTsKKworICAvKiB0ZXN0IGZvcndhcmRzICovCisgIHNlZWtfcGlwZWxpbmUgKHBpcGVsaW5lLCAxLjAsIDAsIC0xKTsKKyAgZmFpbF91bmxlc3MgKGZpcnN0X3RzID09IEdTVF9DTE9DS19USU1FX05PTkUpOworICBtc2cgPSBydW5fcGlwZWxpbmUgKHBpcGVsaW5lKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRU9TKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisKKyAgLyogQ2hlY2sgd2Ugc2F3IHRoZSBlbnRpcmUgcmFuZ2Ugb2YgdmFsdWVzICovCisgIGZhaWxfdW5sZXNzIChmaXJzdF90cyA9PSBleHBfZmlyc3RfdGltZSwKKyAgICAgICJFeHBlY3RlZCBzdGFydCBvZiBwbGF5YmFjayByYW5nZSAwLCBnb3QgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoZmlyc3RfdHMpKTsKKyAgZmFpbF91bmxlc3MgKGxhc3RfdHMgPT0gZXhwX2xhc3RfdGltZSwKKyAgICAgICJFeHBlY3RlZCBlbmQgb2YgcGxheWJhY2sgcmFuZ2UgM3MsIGdvdCAlIiBHU1RfVElNRV9GT1JNQVQsCisgICAgICBHU1RfVElNRV9BUkdTIChsYXN0X3RzKSk7CisKKyAgLyogVGVzdCBiYWNrd2FyZHMgKi8KKyAgc2Vla19waXBlbGluZSAocGlwZWxpbmUsIC0xLjAsIDAsIC0xKTsKKyAgbXNnID0gcnVuX3BpcGVsaW5lIChwaXBlbGluZSk7CisgIGZhaWxfdW5sZXNzIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VPUyk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworICAvKiBDaGVjayB3ZSBzYXcgdGhlIGVudGlyZSByYW5nZSBvZiB2YWx1ZXMgKi8KKyAgZmFpbF91bmxlc3MgKGZpcnN0X3RzID09IGV4cF9maXJzdF90aW1lLAorICAgICAgIkV4cGVjdGVkIHN0YXJ0IG9mIHBsYXliYWNrIHJhbmdlICUiIEdTVF9USU1FX0ZPUk1BVAorICAgICAgIiwgZ290ICUiIEdTVF9USU1FX0ZPUk1BVCwgR1NUX1RJTUVfQVJHUyAoZXhwX2ZpcnN0X3RpbWUpLAorICAgICAgR1NUX1RJTUVfQVJHUyAoZmlyc3RfdHMpKTsKKyAgZmFpbF91bmxlc3MgKGxhc3RfdHMgPT0gZXhwX2xhc3RfdGltZSwKKyAgICAgICJFeHBlY3RlZCBlbmQgb2YgcGxheWJhY2sgcmFuZ2UgJSIgR1NUX1RJTUVfRk9STUFUCisgICAgICAiLCBnb3QgJSIgR1NUX1RJTUVfRk9STUFULCBHU1RfVElNRV9BUkdTIChleHBfbGFzdF90aW1lKSwKKyAgICAgIEdTVF9USU1FX0FSR1MgKGxhc3RfdHMpKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3NwbGl0bXV4c3JjKQoreworICBnY2hhciAqaW5fcGF0dGVybiA9CisgICAgICBnX2J1aWxkX2ZpbGVuYW1lIChHU1RfVEVTVF9GSUxFU19QQVRILCAic3BsaXR2aWRlbyoub2dnIiwgTlVMTCk7CisgIHRlc3RfcGxheWJhY2sgKGluX3BhdHRlcm4sIDAsIDMgKiBHU1RfU0VDT05EKTsKKyAgZ19mcmVlIChpbl9wYXR0ZXJuKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgZ2NoYXIgKioKK3NyY19mb3JtYXRfbG9jYXRpb25fY2IgKEdzdEVsZW1lbnQgKiBzcGxpdG11eHNyYywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBnY2hhciAqKnJlc3VsdCA9IGdfbWFsbG9jMF9uICg0LCBzaXplb2YgKGdjaGFyICopKTsKKyAgcmVzdWx0WzBdID0gZ19idWlsZF9maWxlbmFtZSAoR1NUX1RFU1RfRklMRVNfUEFUSCwgInNwbGl0dmlkZW8wMC5vZ2ciLCBOVUxMKTsKKyAgcmVzdWx0WzFdID0gZ19idWlsZF9maWxlbmFtZSAoR1NUX1RFU1RfRklMRVNfUEFUSCwgInNwbGl0dmlkZW8wMS5vZ2ciLCBOVUxMKTsKKyAgcmVzdWx0WzJdID0gZ19idWlsZF9maWxlbmFtZSAoR1NUX1RFU1RfRklMRVNfUEFUSCwgInNwbGl0dmlkZW8wMi5vZ2ciLCBOVUxMKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfc3BsaXRtdXhzcmNfZm9ybWF0X2xvY2F0aW9uKQoreworICBHc3RNZXNzYWdlICptc2c7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RFbGVtZW50ICpzcmM7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisgIHBpcGVsaW5lID0gZ3N0X3BhcnNlX2xhdW5jaCAoInNwbGl0bXV4c3JjIG5hbWU9c3BsaXRzcmMgISBkZWNvZGViaW4gIgorICAgICAgIiEgZmFrZXNpbmsiLCAmZXJyb3IpOworICBnX2Fzc2VydF9ub19lcnJvciAoZXJyb3IpOworICBmYWlsX2lmIChwaXBlbGluZSA9PSBOVUxMKTsKKworICBzcmMgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJzcGxpdHNyYyIpOworICBnX3NpZ25hbF9jb25uZWN0IChzcmMsICJmb3JtYXQtbG9jYXRpb24iLAorICAgICAgKEdDYWxsYmFjaykgc3JjX2Zvcm1hdF9sb2NhdGlvbl9jYiwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChzcmMpOworCisgIG1zZyA9IHJ1bl9waXBlbGluZSAocGlwZWxpbmUpOworCisgIGlmIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VSUk9SKQorICAgIGR1bXBfZXJyb3IgKG1zZyk7CisgIGZhaWxfdW5sZXNzIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VPUyk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIGdjaGFyICoKK2NoZWNrX2Zvcm1hdF9sb2NhdGlvbiAoR3N0RWxlbWVudCAqIG9iamVjdCwKKyAgICBndWludCBmcmFnbWVudF9pZCwgR3N0U2FtcGxlICogZmlyc3Rfc2FtcGxlKQoreworICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9zYW1wbGVfZ2V0X2J1ZmZlciAoZmlyc3Rfc2FtcGxlKTsKKworICAvKiBNdXN0IGhhdmUgYSBidWZmZXIgKi8KKyAgZmFpbF9pZiAoYnVmID09IE5VTEwpOworICBHU1RfTE9HICgiTmV3IGZpbGUgLSBmaXJzdCBidWZmZXIgJSIgR1NUX1RJTUVfRk9STUFULAorICAgICAgR1NUX1RJTUVfQVJHUyAoR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZikpKTsKKworICByZXR1cm4gTlVMTDsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfc3BsaXRtdXhzaW5rKQoreworICBHc3RNZXNzYWdlICptc2c7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RFbGVtZW50ICpzaW5rOworICBHc3RQYWQgKnNwbGl0bXV4X3NpbmtfcGFkOworICBHc3RQYWQgKmVuY19zcmNfcGFkOworICBnY2hhciAqZGVzdF9wYXR0ZXJuOworICBndWludCBjb3VudDsKKyAgZ2NoYXIgKmluX3BhdHRlcm47CisKKyAgLyogVGhpcyBwaXBlbGluZSBoYXMgYSBzbWFsbCB0aW1lIGN1dG9mZiAtIGl0IHNob3VsZCBzdGFydCBhIG5ldyBmaWxlCisgICAqIGV2ZXJ5IEdPUCwgaWUgMSBzZWNvbmQgKi8KKyAgcGlwZWxpbmUgPQorICAgICAgZ3N0X3BhcnNlX2xhdW5jaAorICAgICAgKCJ2aWRlb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MTUgISB2aWRlby94LXJhdyx3aWR0aD04MCxoZWlnaHQ9NjQsZnJhbWVyYXRlPTUvMSAhIHZpZGVvY29udmVydCAhIgorICAgICAgIiBxdWV1ZSAhIHRoZW9yYWVuYyBrZXlmcmFtZS1mb3JjZT01ICEgc3BsaXRtdXhzaW5rIG5hbWU9c3BsaXRzaW5rICIKKyAgICAgICIgbWF4LXNpemUtdGltZT0xMDAwMDAwIG1heC1zaXplLWJ5dGVzPTEwMDAwMDAgbXV4ZXI9b2dnbXV4IiwgTlVMTCk7CisgIGZhaWxfaWYgKHBpcGVsaW5lID09IE5VTEwpOworICBzaW5rID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAocGlwZWxpbmUpLCAic3BsaXRzaW5rIik7CisgIGZhaWxfaWYgKHNpbmsgPT0gTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNpbmssICJmb3JtYXQtbG9jYXRpb24tZnVsbCIsCisgICAgICAoR0NhbGxiYWNrKSBjaGVja19mb3JtYXRfbG9jYXRpb24sIE5VTEwpOworICBkZXN0X3BhdHRlcm4gPSBnX2J1aWxkX2ZpbGVuYW1lICh0bXBkaXIsICJvdXQlMDVkLm9nZyIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzaW5rKSwgImxvY2F0aW9uIiwgZGVzdF9wYXR0ZXJuLCBOVUxMKTsKKyAgZ19mcmVlIChkZXN0X3BhdHRlcm4pOworICBnX29iamVjdF91bnJlZiAoc2luayk7CisKKyAgbXNnID0gcnVuX3BpcGVsaW5lIChwaXBlbGluZSk7CisKKyAgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRVJST1IpCisgICAgZHVtcF9lcnJvciAobXNnKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRU9TKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisKKyAgLyogdW5saW5rIG1hbnVhbGx5IGFuZCByZWxhc2UgcmVxdWVzdCBwYWQgdG8gZW5zdXJlIHRoYXQgd2UgKmNhbiogZG8gdGhhdAorICAgKiAtIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NTM2MjIgKi8KKyAgc2luayA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgInNwbGl0c2luayIpOworICBmYWlsX2lmIChzaW5rID09IE5VTEwpOworICBzcGxpdG11eF9zaW5rX3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzaW5rLCAidmlkZW8iKTsKKyAgZmFpbF9pZiAoc3BsaXRtdXhfc2lua19wYWQgPT0gTlVMTCk7CisgIGVuY19zcmNfcGFkID0gZ3N0X3BhZF9nZXRfcGVlciAoc3BsaXRtdXhfc2lua19wYWQpOworICBmYWlsX2lmIChlbmNfc3JjX3BhZCA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfdW5saW5rIChlbmNfc3JjX3BhZCwgc3BsaXRtdXhfc2lua19wYWQpKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoZW5jX3NyY19wYWQpOworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChzaW5rLCBzcGxpdG11eF9zaW5rX3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNwbGl0bXV4X3NpbmtfcGFkKTsKKyAgLyogYXQgdGhpcyBwb2ludCB0aGUgcGFkIG11c3QgYmUgcmVsZWFhc2VkIC0gdHJ5IHRvIGZpbmQgaXQgYWdhaW4gdG8gdmVyaWZ5ICovCisgIHNwbGl0bXV4X3NpbmtfcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNpbmssICJ2aWRlbyIpOworICBmYWlsX2lmIChzcGxpdG11eF9zaW5rX3BhZCAhPSBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKHNpbmspOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKworICBjb3VudCA9IGNvdW50X2ZpbGVzICh0bXBkaXIpOworICBmYWlsX3VubGVzcyAoY291bnQgPT0gMywgIkV4cGVjdGVkIDMgb3V0cHV0IGZpbGVzLCBnb3QgJWQiLCBjb3VudCk7CisKKyAgaW5fcGF0dGVybiA9IGdfYnVpbGRfZmlsZW5hbWUgKHRtcGRpciwgIm91dCoub2dnIiwgTlVMTCk7CisgIHRlc3RfcGxheWJhY2sgKGluX3BhdHRlcm4sIDAsIDMgKiBHU1RfU0VDT05EKTsKKyAgZ19mcmVlIChpbl9wYXR0ZXJuKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgR3N0UGFkUHJvYmVSZXR1cm4KK2ludGVyY2VwdF9zdHJlYW1fc3RhcnQgKEdzdFBhZCAqIHBhZCwgR3N0UGFkUHJvYmVJbmZvICogaW5mbywKKyAgICBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdEV2ZW50ICpldmVudCA9IGdzdF9wYWRfcHJvYmVfaW5mb19nZXRfZXZlbnQgKGluZm8pOworCisgIGlmIChHU1RfRVZFTlRfVFlQRSAoZXZlbnQpID09IEdTVF9FVkVOVF9TVFJFQU1fU1RBUlQpIHsKKyAgICBHc3RTdHJlYW1GbGFncyBmbGFnczsKKyAgICBldmVudCA9IGdzdF9ldmVudF9tYWtlX3dyaXRhYmxlIChldmVudCk7CisgICAgZ3N0X2V2ZW50X3BhcnNlX3N0cmVhbV9mbGFncyAoZXZlbnQsICZmbGFncyk7CisgICAgZ3N0X2V2ZW50X3NldF9zdHJlYW1fZmxhZ3MgKGV2ZW50LCBmbGFncyB8IEdTVF9TVFJFQU1fRkxBR19TUEFSU0UpOworICAgIEdTVF9QQURfUFJPQkVfSU5GT19EQVRBIChpbmZvKSA9IGV2ZW50OworICB9CisKKyAgcmV0dXJuIEdTVF9QQURfUFJPQkVfT0s7Cit9CisKK3N0YXRpYyBHc3RGbG93UmV0dXJuCituZXdfc2FtcGxlX3ZlcmlmeV9jb250aW51b3VzX3RpbWVzdGFtcHMgKEdzdEFwcFNpbmsgKiBhcHBzaW5rLAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0U2FtcGxlICpzYW1wbGU7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBHc3RDbG9ja1RpbWUgKnByZXZfdHMgPSB1c2VyX2RhdGE7CisgIEdzdENsb2NrVGltZSBuZXdfdHM7CisKKyAgc2FtcGxlID0gZ3N0X2FwcF9zaW5rX3B1bGxfc2FtcGxlIChhcHBzaW5rKTsKKyAgYnVmZmVyID0gZ3N0X3NhbXBsZV9nZXRfYnVmZmVyIChzYW1wbGUpOworCisgIG5ld190cyA9IEdTVF9CVUZGRVJfUFRTIChidWZmZXIpOworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKCpwcmV2X3RzKSkgeworICAgIGZhaWxfdW5sZXNzICgqcHJldl90cyA8IG5ld190cywKKyAgICAgICAgIiVzOiBwcmV2X3RzICglIiBHU1RfVElNRV9GT1JNQVQgIikgPj0gbmV3X3RzICglIiBHU1RfVElNRV9GT1JNQVQgIikiLAorICAgICAgICBHU1RfT0JKRUNUX05BTUUgKGFwcHNpbmspLCBHU1RfVElNRV9BUkdTICgqcHJldl90cyksCisgICAgICAgIEdTVF9USU1FX0FSR1MgKG5ld190cykpOworICB9CisKKyAgKnByZXZfdHMgPSBuZXdfdHM7CisgIGdzdF9zYW1wbGVfdW5yZWYgKHNhbXBsZSk7CisgIHJldHVybiBHU1RfRkxPV19PSzsKK30KKworc3RhdGljIEdzdEZsb3dSZXR1cm4KK25ld19zYW1wbGVfdmVyaWZ5XzFzZWNfb2Zmc2V0IChHc3RBcHBTaW5rICogYXBwc2luaywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RTYW1wbGUgKnNhbXBsZTsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdzdENsb2NrVGltZSAqcHJldl90cyA9IHVzZXJfZGF0YTsKKyAgR3N0Q2xvY2tUaW1lIG5ld190czsKKworICBzYW1wbGUgPSBnc3RfYXBwX3NpbmtfcHVsbF9zYW1wbGUgKGFwcHNpbmspOworICBidWZmZXIgPSBnc3Rfc2FtcGxlX2dldF9idWZmZXIgKHNhbXBsZSk7CisKKyAgbmV3X3RzID0gR1NUX0JVRkZFUl9QVFMgKGJ1ZmZlcik7CisgIGlmIChHU1RfQ0xPQ0tfVElNRV9JU19WQUxJRCAoKnByZXZfdHMpKSB7CisgICAgZmFpbF91bmxlc3MgKG5ld190cyA+ICgqcHJldl90cyArIDkwMCAqIEdTVF9NU0VDT05EKSwKKyAgICAgICAgIiVzOiBwcmV2X3RzICglIiBHU1RfVElNRV9GT1JNQVQgIikgKyAwLjlzID49IG5ld190cyAoJSIKKyAgICAgICAgR1NUX1RJTUVfRk9STUFUICIpIiwgR1NUX09CSkVDVF9OQU1FIChhcHBzaW5rKSwKKyAgICAgICAgR1NUX1RJTUVfQVJHUyAoKnByZXZfdHMpLCBHU1RfVElNRV9BUkdTIChuZXdfdHMpKTsKKyAgfQorCisgICpwcmV2X3RzID0gbmV3X3RzOworICBnc3Rfc2FtcGxlX3VucmVmIChzYW1wbGUpOworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKKy8qIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03NjEwODYgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X3NwbGl0bXV4c3JjX3NwYXJzZV9zdHJlYW1zKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0RWxlbWVudCAqZWxlbWVudDsKKyAgZ2NoYXIgKmRlc3RfcGF0dGVybjsKKyAgR3N0RWxlbWVudCAqYXBwc3JjOworICBHc3RQYWQgKmFwcHNyY19zcmM7CisgIEdzdEJ1cyAqYnVzOworICBHc3RNZXNzYWdlICptc2c7CisgIGdpbnQgaTsKKworICAvKiBnZW5lcmF0ZSBmaWxlcyAqLworCisgIC8qIGluIHRoaXMgdGVzdCwgd2UgaGF2ZSA1c2VjIG9mIGRhdGEgd2l0aCBmaWxlcyBzcGxpdCBhdCAxc2VjIGludGVydmFscyAqLworICBwaXBlbGluZSA9CisgICAgICBnc3RfcGFyc2VfbGF1bmNoCisgICAgICAoInZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz03NSAhIgorICAgICAgIiAgdmlkZW8veC1yYXcsd2lkdGg9ODAsaGVpZ2h0PTY0LGZyYW1lcmF0ZT0xNS8xICEiCisgICAgICAiICB0aGVvcmFlbmMga2V5ZnJhbWUtZm9yY2U9NSAhIHNwbGl0bXV4c2luayBuYW1lPXNwbGl0c2luayIKKyAgICAgICIgICAgbWF4LXNpemUtdGltZT0xMDAwMDAwMDAwIG11eGVyPW1hdHJvc2thbXV4IgorICAgICAgIiBhdWRpb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MTAwIHNhbXBsZXNwZXJidWZmZXI9MTAyNCAhIgorICAgICAgIiAgYXVkaW8veC1yYXcscmF0ZT0yMDAwMCAhIHZvcmJpc2VuYyAhIHNwbGl0c2luay5hdWRpb18ldSIKKyAgICAgICIgYXBwc3JjIG5hbWU9YXBwc3JjIGZvcm1hdD10aW1lIGNhcHM9dGV4dC94LXJhdyxmb3JtYXQ9dXRmOCAhIgorICAgICAgIiAgc3BsaXRzaW5rLnN1YnRpdGxlXyV1IiwgTlVMTCk7CisgIGZhaWxfaWYgKHBpcGVsaW5lID09IE5VTEwpOworCisgIGVsZW1lbnQgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJzcGxpdHNpbmsiKTsKKyAgZmFpbF9pZiAoZWxlbWVudCA9PSBOVUxMKTsKKyAgZGVzdF9wYXR0ZXJuID0gZ19idWlsZF9maWxlbmFtZSAodG1wZGlyLCAib3V0JTA1ZC5vZ2ciLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZWxlbWVudCksICJsb2NhdGlvbiIsIGRlc3RfcGF0dGVybiwgTlVMTCk7CisgIGdfY2xlYXJfcG9pbnRlciAoJmRlc3RfcGF0dGVybiwgZ19mcmVlKTsKKyAgZ19jbGVhcl9vYmplY3QgKCZlbGVtZW50KTsKKworICBhcHBzcmMgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJhcHBzcmMiKTsKKyAgZmFpbF9pZiAoYXBwc3JjID09IE5VTEwpOworCisgIC8qIGFkZCB0aGUgU1BBUlNFIGZsYWcgb24gdGhlIHN0cmVhbS1zdGFydCBldmVudCBvZiB0aGUgc3VidGl0bGUgc3RyZWFtICovCisgIGFwcHNyY19zcmMgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoYXBwc3JjLCAic3JjIik7CisgIGZhaWxfaWYgKGFwcHNyY19zcmMgPT0gTlVMTCk7CisgIGdzdF9wYWRfYWRkX3Byb2JlIChhcHBzcmNfc3JjLCBHU1RfUEFEX1BST0JFX1RZUEVfRVZFTlRfRE9XTlNUUkVBTSwKKyAgICAgIGludGVyY2VwdF9zdHJlYW1fc3RhcnQsIE5VTEwsIE5VTEwpOworICBnX2NsZWFyX29iamVjdCAoJmFwcHNyY19zcmMpOworCisgIGJ1cyA9IGdzdF9waXBlbGluZV9nZXRfYnVzIChHU1RfUElQRUxJTkUgKHBpcGVsaW5lKSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIC8qIHB1c2ggc3VidGl0bGVzLCBvbmUgcGVyIHNlY29uZCwgc3RhcnRpbmcgZnJvbSB0PTEwMG1zICovCisgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCA1LCBOVUxMKTsKKyAgICBHc3RNYXBJbmZvIGluZm87CisKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmZmVyLCAmaW5mbywgR1NUX01BUF9XUklURSk7CisgICAgc3RyY3B5ICgoY2hhciAqKSBpbmZvLmRhdGEsICJ0ZXN0Iik7CisgICAgZ3N0X2J1ZmZlcl91bm1hcCAoYnVmZmVyLCAmaW5mbyk7CisKKyAgICBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKSA9IGkgKiBHU1RfU0VDT05EICsgMTAwICogR1NUX01TRUNPTkQ7CisgICAgR1NUX0JVRkZFUl9EVFMgKGJ1ZmZlcikgPSBHU1RfQlVGRkVSX1BUUyAoYnVmZmVyKTsKKworICAgIGZhaWxfaWYgKGdzdF9hcHBfc3JjX3B1c2hfYnVmZmVyIChHU1RfQVBQX1NSQyAoYXBwc3JjKSwgYnVmZmVyKQorICAgICAgICAhPSBHU1RfRkxPV19PSyk7CisgIH0KKyAgZmFpbF9pZiAoZ3N0X2FwcF9zcmNfZW5kX29mX3N0cmVhbSAoR1NUX0FQUF9TUkMgKGFwcHNyYykpICE9IEdTVF9GTE9XX09LKTsKKworICBtc2cgPSBnc3RfYnVzX3RpbWVkX3BvcF9maWx0ZXJlZCAoYnVzLCA1ICogR1NUX1NFQ09ORCwgR1NUX01FU1NBR0VfRU9TKTsKKyAgZ19jbGVhcl9wb2ludGVyICgmbXNnLCBnc3RfbWVzc2FnZV91bnJlZik7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdfY2xlYXJfb2JqZWN0ICgmYXBwc3JjKTsKKyAgZ19jbGVhcl9vYmplY3QgKCZidXMpOworICBnX2NsZWFyX29iamVjdCAoJnBpcGVsaW5lKTsKKworICAvKiByZWFkIGFuZCB2ZXJpZnkgKi8KKworICBwaXBlbGluZSA9CisgICAgICBnc3RfcGFyc2VfbGF1bmNoCisgICAgICAoInNwbGl0bXV4c3JjIG5hbWU9c3BsaXRzcmMiCisgICAgICAiIHNwbGl0c3JjLiAhIHRoZW9yYWRlYyAhIGFwcHNpbmsgbmFtZT12c2luayBzeW5jPWZhbHNlIGVtaXQtc2lnbmFscz10cnVlIgorICAgICAgIiBzcGxpdHNyYy4gISB2b3JiaXNkZWMgISBhcHBzaW5rIG5hbWU9YXNpbmsgc3luYz1mYWxzZSBlbWl0LXNpZ25hbHM9dHJ1ZSIKKyAgICAgICIgc3BsaXRzcmMuICEgdGV4dC94LXJhdyAhIGFwcHNpbmsgbmFtZT10c2luayBzeW5jPWZhbHNlIGVtaXQtc2lnbmFscz10cnVlIiwKKyAgICAgIE5VTEwpOworICBmYWlsX2lmIChwaXBlbGluZSA9PSBOVUxMKTsKKworICBlbGVtZW50ID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAocGlwZWxpbmUpLCAic3BsaXRzcmMiKTsKKyAgZmFpbF9pZiAoZWxlbWVudCA9PSBOVUxMKTsKKyAgZGVzdF9wYXR0ZXJuID0gZ19idWlsZF9maWxlbmFtZSAodG1wZGlyLCAib3V0Ki5vZ2ciLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZWxlbWVudCksICJsb2NhdGlvbiIsIGRlc3RfcGF0dGVybiwgTlVMTCk7CisgIGdfY2xlYXJfcG9pbnRlciAoJmRlc3RfcGF0dGVybiwgZ19mcmVlKTsKKyAgZ19jbGVhcl9vYmplY3QgKCZlbGVtZW50KTsKKworICB7CisgICAgR3N0Q2xvY2tUaW1lIHZzaW5rX3ByZXZfdHMgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworICAgIEdzdENsb2NrVGltZSBhc2lua19wcmV2X3RzID0gR1NUX0NMT0NLX1RJTUVfTk9ORTsKKyAgICBHc3RDbG9ja1RpbWUgdHNpbmtfcHJldl90cyA9IEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgICAvKiB2ZXJpZnkgdGhhdCB0aW1lc3RhbXBzIGFyZSBjb250aW51b3VzbHkgaW5jcmVhc2luZyBmb3IgYXVkaW8gKyB2aWRlby4KKyAgICAgKiBpZiB3ZSBoaXQgYnVnIDc2MTA4NiwgdGltZXN0YW1wcyB3aWxsIGp1bXAgYWJvdXQgLTkwMG1zIGFmdGVyIHN3aXRjaGluZworICAgICAqIHRvIGEgbmV3IHBhcnQsIGJlY2F1c2UgdGhpcyBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBsYXN0IHN1YnRpdGxlCisgICAgICogcHRzIGFuZCB0aGUgbGFzdCBhdWRpby92aWRlbyBwdHMgKi8KKyAgICBlbGVtZW50ID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAocGlwZWxpbmUpLCAidnNpbmsiKTsKKyAgICBnX3NpZ25hbF9jb25uZWN0IChlbGVtZW50LCAibmV3LXNhbXBsZSIsCisgICAgICAgIChHQ2FsbGJhY2spIG5ld19zYW1wbGVfdmVyaWZ5X2NvbnRpbnVvdXNfdGltZXN0YW1wcywgJnZzaW5rX3ByZXZfdHMpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmZWxlbWVudCk7CisKKyAgICBlbGVtZW50ID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAocGlwZWxpbmUpLCAiYXNpbmsiKTsKKyAgICBnX3NpZ25hbF9jb25uZWN0IChlbGVtZW50LCAibmV3LXNhbXBsZSIsCisgICAgICAgIChHQ2FsbGJhY2spIG5ld19zYW1wbGVfdmVyaWZ5X2NvbnRpbnVvdXNfdGltZXN0YW1wcywgJmFzaW5rX3ByZXZfdHMpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmZWxlbWVudCk7CisKKyAgICAvKiBhbHNvIHZlcmlmeSB0aGF0IHN1YnRpdGxlIHRpbWVzdGFtcHMgYXJlIGluY3JlYXNpbmcgYnkgYWJvdXQgMXMuCisgICAgICogaWYgd2UgaGl0IGJ1ZyA3NjEwODYsIHRpbWVzdGFtcHMgd2lsbCBpbmNyZWFzZSBieSBleGFjdGx5IDEwMG1zIGluc3RlYWQsCisgICAgICogYmVjYXVzZSB0aGlzIGlzIHRoZSByZWxhdGl2ZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwYXJ0J3Mgc3RhcnQgdGltZQorICAgICAqIChyZW1lbWJlciBhIG5ldyBwYXJ0IHN0YXJ0cyBldmVyeSAxc2VjKSBhbmQgdGhlIHN1YnRpdGxlJ3MgcHRzIGluIHRoYXQKKyAgICAgKiBwYXJ0LCB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBtYXhfdHMgb2YgdGhlIHByZXZpb3VzIHBhcnQsIHdoaWNoCisgICAgICogZXF1YWxzIHRoZSBsYXN0IHN1YnRpdGxlJ3MgcHRzIChhbmQgc2hvdWxkIG5vdCEpICovCisgICAgZWxlbWVudCA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgInRzaW5rIik7CisgICAgZ19zaWduYWxfY29ubmVjdCAoZWxlbWVudCwgIm5ldy1zYW1wbGUiLAorICAgICAgICAoR0NhbGxiYWNrKSBuZXdfc2FtcGxlX3ZlcmlmeV8xc2VjX29mZnNldCwgJnRzaW5rX3ByZXZfdHMpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmZWxlbWVudCk7CisKKyAgICBtc2cgPSBydW5fcGlwZWxpbmUgKHBpcGVsaW5lKTsKKyAgfQorCisgIGlmIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VSUk9SKQorICAgIGR1bXBfZXJyb3IgKG1zZyk7CisgIGZhaWxfdW5sZXNzIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VPUyk7CisKKyAgZ19jbGVhcl9wb2ludGVyICgmbXNnLCBnc3RfbWVzc2FnZV91bnJlZik7CisgIGdfY2xlYXJfb2JqZWN0ICgmcGlwZWxpbmUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0cnVjdCBDYXBzQ2hhbmdlRGF0YQoreworICBndWludCBjb3VudDsKKyAgR3N0RWxlbWVudCAqY2Y7Cit9OworCitzdGF0aWMgR3N0UGFkUHJvYmVSZXR1cm4KK3N3aXRjaF9jYXBzIChHc3RQYWQgKiBwYWQsIEdzdFBhZFByb2JlSW5mbyAqIGluZm8sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgc3RydWN0IENhcHNDaGFuZ2VEYXRhICpkYXRhID0gKHN0cnVjdCBDYXBzQ2hhbmdlRGF0YSAqKSAodXNlcl9kYXRhKTsKKworICBpZiAoZGF0YS0+Y291bnQgPT0gNCkgeworICAgIEdTVF9JTkZPICgiU2F3IDUgYnVmZmVycyB0byB0aGUgZW5jb2Rlci4gU3dpdGNoaW5nIGNhcHMiKTsKKyAgICBnc3RfdXRpbF9zZXRfb2JqZWN0X2FyZyAoR19PQkpFQ1QgKGRhdGEtPmNmKSwgImNhcHMiLAorICAgICAgICAidmlkZW8veC1yYXcsd2lkdGg9MTYwLGhlaWdodD0xMjgsZnJhbWVyYXRlPTEwLzEiKTsKKyAgfQorICBkYXRhLT5jb3VudCsrOworICByZXR1cm4gR1NUX1BBRF9QUk9CRV9PSzsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfc3BsaXRtdXhzcmNfY2Fwc19jaGFuZ2UpCit7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEVsZW1lbnQgKnNpbms7CisgIEdzdEVsZW1lbnQgKmNmOworICBHc3RQYWQgKnNpbmtwYWQ7CisgIGdjaGFyICpkZXN0X3BhdHRlcm47CisgIGd1aW50IGNvdW50OworICBnY2hhciAqaW5fcGF0dGVybjsKKyAgc3RydWN0IENhcHNDaGFuZ2VEYXRhIGRhdGE7CisKKyAgLyogVGhpcyB0ZXN0IGNyZWF0ZXMgYSBuZXcgZmlsZSBvbmx5IGJ5IGNoYW5naW5nIHRoZSBjYXBzLCB3aGljaAorICAgKiBxdG11eCB3aWxsIHJlamVjdCAoZm9yIG5vdyAtIGlmIHF0bXV4IHN0YXJ0cyBzdXBwb3J0aW5nIGNhcHMKKyAgICogY2hhbmdlcywgdGhpcyB0ZXN0IHdpbGwgYnJlYWsgYW5kIG5lZWQgZml4aW5nL2Rpc2FibGluZyAqLworICBwaXBlbGluZSA9CisgICAgICBnc3RfcGFyc2VfbGF1bmNoCisgICAgICAoInZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0xMCAhIgorICAgICAgIiAgY2Fwc2ZpbHRlciBuYW1lPWMgY2Fwcz12aWRlby94LXJhdyx3aWR0aD04MCxoZWlnaHQ9NjQsZnJhbWVyYXRlPTEwLzEgISIKKyAgICAgICIgIGpwZWdlbmMgISBzcGxpdG11eHNpbmsgbmFtZT1zcGxpdHNpbmsgbXV4ZXI9cXRtdXgiLCBOVUxMKTsKKyAgZmFpbF9pZiAocGlwZWxpbmUgPT0gTlVMTCk7CisgIHNpbmsgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJzcGxpdHNpbmsiKTsKKyAgZmFpbF9pZiAoc2luayA9PSBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoc2luaywgImZvcm1hdC1sb2NhdGlvbi1mdWxsIiwKKyAgICAgIChHQ2FsbGJhY2spIGNoZWNrX2Zvcm1hdF9sb2NhdGlvbiwgTlVMTCk7CisgIGRlc3RfcGF0dGVybiA9IGdfYnVpbGRfZmlsZW5hbWUgKHRtcGRpciwgIm91dCUwNWQubXA0IiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNpbmspLCAibG9jYXRpb24iLCBkZXN0X3BhdHRlcm4sIE5VTEwpOworICBnX2ZyZWUgKGRlc3RfcGF0dGVybik7CisgIGdfb2JqZWN0X3VucmVmIChzaW5rKTsKKworICBjZiA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgImMiKTsKKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChjZiwgInNpbmsiKTsKKworICBkYXRhLmNmID0gY2Y7CisgIGRhdGEuY291bnQgPSAwOworCisgIGdzdF9wYWRfYWRkX3Byb2JlIChzaW5rcGFkLCBHU1RfUEFEX1BST0JFX1RZUEVfQlVGRkVSLAorICAgICAgc3dpdGNoX2NhcHMsICZkYXRhLCBOVUxMKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoY2YpOworCisgIG1zZyA9IHJ1bl9waXBlbGluZSAocGlwZWxpbmUpOworCisgIGlmIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VSUk9SKQorICAgIGR1bXBfZXJyb3IgKG1zZyk7CisgIGZhaWxfdW5sZXNzIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VPUyk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtc2cpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKworICBjb3VudCA9IGNvdW50X2ZpbGVzICh0bXBkaXIpOworICBmYWlsX3VubGVzcyAoY291bnQgPT0gMiwgIkV4cGVjdGVkIDIgb3V0cHV0IGZpbGVzLCBnb3QgJWQiLCBjb3VudCk7CisKKyAgaW5fcGF0dGVybiA9IGdfYnVpbGRfZmlsZW5hbWUgKHRtcGRpciwgIm91dCoubXA0IiwgTlVMTCk7CisgIHRlc3RfcGxheWJhY2sgKGluX3BhdHRlcm4sIDAsIEdTVF9TRUNPTkQpOworICBnX2ZyZWUgKGluX3BhdHRlcm4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3NwbGl0bXV4c3JjX3JvYnVzdF9tdXgpCit7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEVsZW1lbnQgKnNpbms7CisgIGdjaGFyICpkZXN0X3BhdHRlcm47CisgIGdjaGFyICppbl9wYXR0ZXJuOworCisgIC8qIFRoaXMgdGVzdCBjcmVhdGVzIGEgbmV3IGZpbGUgb25seSBieSBjaGFuZ2luZyB0aGUgY2Fwcywgd2hpY2gKKyAgICogcXRtdXggd2lsbCByZWplY3QgKGZvciBub3cgLSBpZiBxdG11eCBzdGFydHMgc3VwcG9ydGluZyBjYXBzCisgICAqIGNoYW5nZXMsIHRoaXMgdGVzdCB3aWxsIGJyZWFrIGFuZCBuZWVkIGZpeGluZy9kaXNhYmxpbmcgKi8KKyAgcGlwZWxpbmUgPQorICAgICAgZ3N0X3BhcnNlX2xhdW5jaAorICAgICAgKCJ2aWRlb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MTAgISIKKyAgICAgICIgIHZpZGVvL3gtcmF3LHdpZHRoPTgwLGhlaWdodD02NCxmcmFtZXJhdGU9MTAvMSAhIgorICAgICAgIiAganBlZ2VuYyAhIHNwbGl0bXV4c2luayBuYW1lPXNwbGl0c2luayBtdXhlcj1cInF0bXV4IHJlc2VydmVkLWJ5dGVzLXBlci1zZWM9MjAwIHJlc2VydmVkLW1vb3YtdXBkYXRlLXBlcmlvZD0xMDAwMDAwMDAgXCIgbWF4LXNpemUtdGltZT01MDAwMDAwMDAgdXNlLXJvYnVzdC1tdXhpbmc9dHJ1ZSIsCisgICAgICBOVUxMKTsKKyAgZmFpbF9pZiAocGlwZWxpbmUgPT0gTlVMTCk7CisgIHNpbmsgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJzcGxpdHNpbmsiKTsKKyAgZmFpbF9pZiAoc2luayA9PSBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoc2luaywgImZvcm1hdC1sb2NhdGlvbi1mdWxsIiwKKyAgICAgIChHQ2FsbGJhY2spIGNoZWNrX2Zvcm1hdF9sb2NhdGlvbiwgTlVMTCk7CisgIGRlc3RfcGF0dGVybiA9IGdfYnVpbGRfZmlsZW5hbWUgKHRtcGRpciwgIm91dCUwNWQubXA0IiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNpbmspLCAibG9jYXRpb24iLCBkZXN0X3BhdHRlcm4sIE5VTEwpOworICBnX2ZyZWUgKGRlc3RfcGF0dGVybik7CisgIGdfb2JqZWN0X3VucmVmIChzaW5rKTsKKworICBtc2cgPSBydW5fcGlwZWxpbmUgKHBpcGVsaW5lKTsKKworICBpZiAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FUlJPUikKKyAgICBkdW1wX2Vycm9yIChtc2cpOworICBmYWlsX3VubGVzcyAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FT1MpOworICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisKKyAgLyogVW5saWtlIG90aGVyIHRlc3RzLCB3ZSBkb24ndCBjaGVjayBhbiBleHBsaWNpdCBmaWxlIHNpemUsIGJlY2F1c2UgdGhlIG92ZXJmbG93IGRldGVjdGlvbgorICAgKiBjYW4gYmUgcmFjeSAoZGVwZW5kcyBvbiBleGFjdGx5IHdoZW4gYnVmZmVycyBnZXQgaGFuZGVkIHRvIHRoZSBtdXhlciBhbmQgd2hlbiBpdCB1cGRhdGVzIHRoZQorICAgKiByZXNlcnZlZCBkdXJhdGlvbiBwcm9wZXJ0eS4gQWxsIHdlIGNhcmUgYWJvdXQgaXMgdGhhdCB0aGUgbXV4aW5nIGRpZG4ndCBmYWlsIGJlY2F1c2Ugc3BhY2UgcmFuIG91dCAqLworCisgIGluX3BhdHRlcm4gPSBnX2J1aWxkX2ZpbGVuYW1lICh0bXBkaXIsICJvdXQqLm1wNCIsIE5VTEwpOworICB0ZXN0X3BsYXliYWNrIChpbl9wYXR0ZXJuLCAwLCBHU1RfU0VDT05EKTsKKyAgZ19mcmVlIChpbl9wYXR0ZXJuKTsKK30KKworR1NUX0VORF9URVNUOworCisvKiBGb3IgdmVyaWZ5aW5nIGJ1ZyBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzYyODkzICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zcGxpdG11eHNpbmtfcmV1c2Vfc2ltcGxlKQoreworICBHc3RFbGVtZW50ICpzaW5rOworICBHc3RQYWQgKnBhZDsKKworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgic3BsaXRtdXhzaW5rIiwgTlVMTCk7CisgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAoc2luaywgInZpZGVvIik7CisgIGZhaWxfdW5sZXNzIChwYWQgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc2luaywgImxvY2F0aW9uIiwgIi9kZXYvbnVsbCIsIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHNpbmssCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfQVNZTkMpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzaW5rLAorICAgICAgICAgIEdTVF9TVEFURV9OVUxMKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzaW5rLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX0FTWU5DKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoc2luaywKKyAgICAgICAgICBHU1RfU1RBVEVfTlVMTCkgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkIChzaW5rLCBwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorc3BsaXRtdXhfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgic3BsaXRtdXgiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworICBUQ2FzZSAqdGNfY2hhaW5fYmFzaWMgPSB0Y2FzZV9jcmVhdGUgKCJiYXNpYyIpOworICBUQ2FzZSAqdGNfY2hhaW5fY29tcGxleCA9IHRjYXNlX2NyZWF0ZSAoImNvbXBsZXgiKTsKKyAgVENhc2UgKnRjX2NoYWluX21wNF9qcGVnID0gdGNhc2VfY3JlYXRlICgiY2Fwc19jaGFuZ2UiKTsKKyAgZ2Jvb2xlYW4gaGF2ZV90aGVvcmEsIGhhdmVfb2dnLCBoYXZlX3ZvcmJpcywgaGF2ZV9tYXRyb3NrYSwgaGF2ZV9xdG11eCwKKyAgICAgIGhhdmVfanBlZzsKKworICAvKiB3ZSBhc3N1bWUgdGhhdCBpZiBlbmNvZGVyL211eGVyIGFyZSB0aGVyZSwgZGVjb2Rlci9kZW11eGVyIHdpbGwgYmUgYSB3ZWxsICovCisgIGhhdmVfdGhlb3JhID0gZ3N0X3JlZ2lzdHJ5X2NoZWNrX2ZlYXR1cmVfdmVyc2lvbiAoZ3N0X3JlZ2lzdHJ5X2dldCAoKSwKKyAgICAgICJ0aGVvcmFlbmMiLCBHU1RfVkVSU0lPTl9NQUpPUiwgR1NUX1ZFUlNJT05fTUlOT1IsIDApOworICBoYXZlX29nZyA9IGdzdF9yZWdpc3RyeV9jaGVja19mZWF0dXJlX3ZlcnNpb24gKGdzdF9yZWdpc3RyeV9nZXQgKCksCisgICAgICAib2dnbXV4IiwgR1NUX1ZFUlNJT05fTUFKT1IsIEdTVF9WRVJTSU9OX01JTk9SLCAwKTsKKyAgaGF2ZV92b3JiaXMgPSBnc3RfcmVnaXN0cnlfY2hlY2tfZmVhdHVyZV92ZXJzaW9uIChnc3RfcmVnaXN0cnlfZ2V0ICgpLAorICAgICAgInZvcmJpc2VuYyIsIEdTVF9WRVJTSU9OX01BSk9SLCBHU1RfVkVSU0lPTl9NSU5PUiwgMCk7CisgIGhhdmVfbWF0cm9za2EgPSBnc3RfcmVnaXN0cnlfY2hlY2tfZmVhdHVyZV92ZXJzaW9uIChnc3RfcmVnaXN0cnlfZ2V0ICgpLAorICAgICAgIm1hdHJvc2thbXV4IiwgR1NUX1ZFUlNJT05fTUFKT1IsIEdTVF9WRVJTSU9OX01JTk9SLCAwKTsKKyAgaGF2ZV9xdG11eCA9IGdzdF9yZWdpc3RyeV9jaGVja19mZWF0dXJlX3ZlcnNpb24gKGdzdF9yZWdpc3RyeV9nZXQgKCksCisgICAgICAicXRtdXgiLCBHU1RfVkVSU0lPTl9NQUpPUiwgR1NUX1ZFUlNJT05fTUlOT1IsIDApOworICBoYXZlX2pwZWcgPSBnc3RfcmVnaXN0cnlfY2hlY2tfZmVhdHVyZV92ZXJzaW9uIChnc3RfcmVnaXN0cnlfZ2V0ICgpLAorICAgICAgImpwZWdlbmMiLCBHU1RfVkVSU0lPTl9NQUpPUiwgR1NUX1ZFUlNJT05fTUlOT1IsIDApOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluX2Jhc2ljKTsKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbl9jb21wbGV4KTsKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbl9tcDRfanBlZyk7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluX2Jhc2ljLCB0ZXN0X3NwbGl0bXV4c2lua19yZXVzZV9zaW1wbGUpOworCisgIGlmIChoYXZlX3RoZW9yYSAmJiBoYXZlX29nZykgeworICAgIHRjYXNlX2FkZF9jaGVja2VkX2ZpeHR1cmUgKHRjX2NoYWluLCB0ZW1wZGlyX3NldHVwLCB0ZW1wZGlyX2NsZWFudXApOworCisgICAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3NwbGl0bXV4c3JjKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfc3BsaXRtdXhzcmNfZm9ybWF0X2xvY2F0aW9uKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfc3BsaXRtdXhzaW5rKTsKKworICAgIGlmIChoYXZlX21hdHJvc2thICYmIGhhdmVfdm9yYmlzKSB7CisgICAgICB0Y2FzZV9hZGRfY2hlY2tlZF9maXh0dXJlICh0Y19jaGFpbl9jb21wbGV4LCB0ZW1wZGlyX3NldHVwLAorICAgICAgICAgIHRlbXBkaXJfY2xlYW51cCk7CisKKyAgICAgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbl9jb21wbGV4LCB0ZXN0X3NwbGl0bXV4c3JjX3NwYXJzZV9zdHJlYW1zKTsKKyAgICB9IGVsc2UgeworICAgICAgR1NUX0lORk8gKCJTa2lwcGluZyB0ZXN0cywgbWlzc2luZyBwbHVnaW5zOiBtYXRyb3NrYSBhbmQvb3Igdm9yYmlzIik7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9JTkZPICgiU2tpcHBpbmcgdGVzdHMsIG1pc3NpbmcgcGx1Z2luczogdGhlb3JhIGFuZC9vciBvZ2ciKTsKKyAgfQorCisKKyAgaWYgKGhhdmVfcXRtdXggJiYgaGF2ZV9qcGVnKSB7CisgICAgdGNhc2VfYWRkX2NoZWNrZWRfZml4dHVyZSAodGNfY2hhaW5fbXA0X2pwZWcsIHRlbXBkaXJfc2V0dXAsCisgICAgICAgIHRlbXBkaXJfY2xlYW51cCk7CisgICAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluX21wNF9qcGVnLCB0ZXN0X3NwbGl0bXV4c3JjX2NhcHNfY2hhbmdlKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW5fbXA0X2pwZWcsIHRlc3Rfc3BsaXRtdXhzcmNfcm9idXN0X211eCk7CisgIH0gZWxzZSB7CisgICAgR1NUX0lORk8gKCJTa2lwcGluZyB0ZXN0cywgbWlzc2luZyBwbHVnaW5zOiBqcGVnZW5jIG9yIG1wNG11eCIpOworICB9CisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoc3BsaXRtdXgpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc2luay5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc2luay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOGI3MjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzaW5rLmMKQEAgLTAsMCArMSwyNTggQEAKKy8qIEdTdHJlYW1lciB1ZHBzaW5rIHVuaXQgdGVzdHMKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBeGlzIENvbW11bmljYXRpb25zIDxkZXYtZ3N0cmVhbWVyQGF4aXMuY29tPgorICogQGF1dGhvciBPZ255YW4gVG9uY2hldiA8b2dueWFuQGF4aXMuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2Jhc2UvZ3N0YmFzZXNpbmsuaD4KKyNpbmNsdWRlIDxnaW8vZ2lvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFNfQU5ZKTsKKworI2RlZmluZSBSVFBfSEVBREVSX1NJWkUgMTIKKyNkZWZpbmUgUlRQX1BBWUxPQURfU0laRSAxMDI0CisKKy8qCisgKiBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgaW4gdGhlIHJlbmRlciBmdW5jdGlvbiB3aGVuIHVzaW5nIGJ1ZmZlciBsaXN0cworICovCitzdGF0aWMgZ3VpbnQgcmVuZGVyX2xpc3RfYnl0ZXNfcmVjZWl2ZWQ7CisKKy8qCisgKiBSZW5kZXIgZnVuY3Rpb24gZm9yIHRlc3RpbmcgdWRwc2luayB3aXRoIGJ1ZmZlciBsaXN0cworICovCitzdGF0aWMgR3N0Rmxvd1JldHVybgordWRwc2lua19yZW5kZXJfbGlzdCAoR3N0QmFzZVNpbmsgKiBzaW5rLCBHc3RCdWZmZXJMaXN0ICogbGlzdCkKK3sKKyAgZ3VpbnQgaSwgbnVtOworCisgIG51bSA9IGdzdF9idWZmZXJfbGlzdF9sZW5ndGggKGxpc3QpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZiA9IGdzdF9idWZmZXJfbGlzdF9nZXQgKGxpc3QsIGkpOworICAgIGdzaXplIHNpemUgPSBnc3RfYnVmZmVyX2dldF9zaXplIChidWYpOworCisgICAgR1NUX0RFQlVHICgicmVuZGVyZWQgJSIgR19HU0laRV9GT1JNQVQgIiBieXRlcyIsIHNpemUpOworICAgIHJlbmRlcl9saXN0X2J5dGVzX3JlY2VpdmVkICs9IHNpemU7CisgIH0KKworICByZXR1cm4gR1NUX0ZMT1dfT0s7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfcmVuZGVyX2xpc3RfZnVuY3Rpb24gKEdzdEVsZW1lbnQgKiBic2luaykKK3sKKyAgR3N0QmFzZVNpbmtDbGFzcyAqYnNjbGFzczsKKworICBic2NsYXNzID0gR1NUX0JBU0VfU0lOS19HRVRfQ0xBU1MgKChHc3RCYXNlU2luayAqKSBic2luayk7CisKKyAgLyogQWRkIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgYnVmZmVyIGxpc3QgdGVzdHMgKi8KKyAgYnNjbGFzcy0+cmVuZGVyX2xpc3QgPSB1ZHBzaW5rX3JlbmRlcl9saXN0OworfQorCitzdGF0aWMgR3N0QnVmZmVyTGlzdCAqCitjcmVhdGVfYnVmZmVyX2xpc3QgKGd1aW50ICogZGF0YV9zaXplKQoreworICBHc3RCdWZmZXJMaXN0ICpsaXN0OworICBHc3RCdWZmZXIgKnJ0cF9idWZmZXI7CisgIEdzdEJ1ZmZlciAqZGF0YV9idWZmZXI7CisKKyAgbGlzdCA9IGdzdF9idWZmZXJfbGlzdF9uZXcgKCk7CisKKyAgLyoqKiBGaXJzdCBncm91cCwgaS5lLiBmaXJzdCBwYWNrZXQuICoqLworCisgIC8qIENyZWF0ZSB0aGUgUlRQIGhlYWRlciBidWZmZXIgKi8KKyAgcnRwX2J1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBSVFBfSEVBREVSX1NJWkUsIE5VTEwpOworICBnc3RfYnVmZmVyX21lbXNldCAocnRwX2J1ZmZlciwgMCwgMCwgUlRQX0hFQURFUl9TSVpFKTsKKworICAvKiBDcmVhdGUgdGhlIGJ1ZmZlciB0aGF0IGhvbGRzIHRoZSBwYXlsb2FkICovCisgIGRhdGFfYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIFJUUF9QQVlMT0FEX1NJWkUsIE5VTEwpOworICBnc3RfYnVmZmVyX21lbXNldCAoZGF0YV9idWZmZXIsIDAsIDAsIFJUUF9QQVlMT0FEX1NJWkUpOworCisgIC8qIENyZWF0ZSBhIG5ldyBncm91cCB0byBob2xkIHRoZSBydHAgaGVhZGVyIGFuZCB0aGUgcGF5bG9hZCAqLworICBnc3RfYnVmZmVyX2xpc3RfYWRkIChsaXN0LCBnc3RfYnVmZmVyX2FwcGVuZCAocnRwX2J1ZmZlciwgZGF0YV9idWZmZXIpKTsKKworICAvKioqICBTZWNvbmQgZ3JvdXAsIGkuZS4gc2Vjb25kIHBhY2tldC4gKioqLworCisgIC8qIENyZWF0ZSB0aGUgUlRQIGhlYWRlciBidWZmZXIgKi8KKyAgcnRwX2J1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FsbG9jYXRlIChOVUxMLCBSVFBfSEVBREVSX1NJWkUsIE5VTEwpOworICBnc3RfYnVmZmVyX21lbXNldCAocnRwX2J1ZmZlciwgMCwgMCwgUlRQX0hFQURFUl9TSVpFKTsKKworICAvKiBDcmVhdGUgdGhlIGJ1ZmZlciB0aGF0IGhvbGRzIHRoZSBwYXlsb2FkICovCisgIGRhdGFfYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYWxsb2NhdGUgKE5VTEwsIFJUUF9QQVlMT0FEX1NJWkUsIE5VTEwpOworICBnc3RfYnVmZmVyX21lbXNldCAoZGF0YV9idWZmZXIsIDAsIDAsIFJUUF9QQVlMT0FEX1NJWkUpOworCisgIC8qIENyZWF0ZSBhIG5ldyBncm91cCB0byBob2xkIHRoZSBydHAgaGVhZGVyIGFuZCB0aGUgcGF5bG9hZCAqLworICBnc3RfYnVmZmVyX2xpc3RfYWRkIChsaXN0LCBnc3RfYnVmZmVyX2FwcGVuZCAocnRwX2J1ZmZlciwgZGF0YV9idWZmZXIpKTsKKworICAvKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGRhdGEgKi8KKyAgKmRhdGFfc2l6ZSA9IDIgKiBSVFBfSEVBREVSX1NJWkUgKyAyICogUlRQX1BBWUxPQURfU0laRTsKKworICByZXR1cm4gbGlzdDsKK30KKworc3RhdGljIHZvaWQKK3VkcHNpbmtfdGVzdCAoZ2Jvb2xlYW4gdXNlX2J1ZmZlcl9saXN0cykKK3sKKyAgR3N0U2VnbWVudCBzZWdtZW50OworICBHc3RFbGVtZW50ICp1ZHBzaW5rOworICBHc3RQYWQgKnNyY3BhZDsKKyAgR3N0QnVmZmVyTGlzdCAqbGlzdDsKKyAgZ3VpbnQgZGF0YV9zaXplOworCisgIGxpc3QgPSBjcmVhdGVfYnVmZmVyX2xpc3QgKCZkYXRhX3NpemUpOworCisgIHVkcHNpbmsgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoInVkcHNpbmsiKTsKKyAgaWYgKHVzZV9idWZmZXJfbGlzdHMpCisgICAgc2V0X3JlbmRlcl9saXN0X2Z1bmN0aW9uICh1ZHBzaW5rKTsKKworICBzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZF9ieV9uYW1lICh1ZHBzaW5rLCAmc3JjdGVtcGxhdGUsICJzaW5rIik7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlICh1ZHBzaW5rLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc3JjcGFkLCBUUlVFKTsKKworICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwgZ3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQgKCJoZXkgdGhlcmUhIikpOworCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWdtZW50LCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwgZ3N0X2V2ZW50X25ld19zZWdtZW50ICgmc2VnbWVudCkpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9wYWRfcHVzaF9saXN0IChzcmNwYWQsIGxpc3QpLCBHU1RfRkxPV19PSyk7CisKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3BhZF9ieV9uYW1lICh1ZHBzaW5rLCAic2luayIpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAodWRwc2luayk7CisKKyAgaWYgKHVzZV9idWZmZXJfbGlzdHMpCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZGF0YV9zaXplLCByZW5kZXJfbGlzdF9ieXRlc19yZWNlaXZlZCk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3VkcHNpbmspCit7CisgIHVkcHNpbmtfdGVzdCAoRkFMU0UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdWRwc2lua19idWZmZXJsaXN0KQoreworICB1ZHBzaW5rX3Rlc3QgKFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3VkcHNpbmtfY2xpZW50X2FkZF9yZW1vdmUpCit7CisgIEdzdEVsZW1lbnQgKnVkcHNpbms7CisKKyAgLyogTm90ZToga2VlcCBpbiBtaW5kIHRoYXQgdGhlc2UgYXJlIGluIGFkZGl0aW9uIHRvIHRoZSBjbGllbnQgYWRkZWQgYnkKKyAgICogdGhlIGhvc3QvcG9ydCBwcm9wZXJ0aWVzIChieSBkZWZhdWx0ICdsb2NhbGhvc3Q6NTAwNCcgKi8KKworICB1ZHBzaW5rID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJ1ZHBzaW5rIik7CisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAodWRwc2luaywgInJlbW92ZSIsICJsb2NhbGhvc3QiLCA1MDA0LCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodWRwc2luayk7CisKKyAgdWRwc2luayA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgidWRwc2luayIpOworICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHVkcHNpbmssICJhZGQiLCAiMTI3LjAuMC4xIiwgNTU1NCwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHVkcHNpbmspOworCisgIHVkcHNpbmsgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoInVkcHNpbmsiKTsKKyAgZ19zaWduYWxfZW1pdF9ieV9uYW1lICh1ZHBzaW5rLCAiYWRkIiwgIjEyNy4wLjAuMSIsIDU1NTQsIE5VTEwpOworICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHVkcHNpbmssICJhZGQiLCAiMTI3LjAuMC4xIiwgNTU1NCwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHVkcHNpbmspOworCisgIHVkcHNpbmsgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoInVkcHNpbmsiKTsKKyAgZ19zaWduYWxfZW1pdF9ieV9uYW1lICh1ZHBzaW5rLCAiYWRkIiwgIjEyNy4wLjAuMSIsIDU1NTQsIE5VTEwpOworICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHVkcHNpbmssICJyZW1vdmUiLCAiMTI3LjAuMC4xIiwgNTU1NCwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHVkcHNpbmspOworCisgIHVkcHNpbmsgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoInVkcHNpbmsiKTsKKyAgZ19zaWduYWxfZW1pdF9ieV9uYW1lICh1ZHBzaW5rLCAiYWRkIiwgIjEyNy4wLjAuMSIsIDU1NTQsIE5VTEwpOworICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHVkcHNpbmssICJyZW1vdmUiLCAiMTI3LjAuMC4xIiwgNTU1NSwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHVkcHNpbmspOworCisgIHVkcHNpbmsgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoInVkcHNpbmsiKTsKKyAgZ19zaWduYWxfZW1pdF9ieV9uYW1lICh1ZHBzaW5rLCAiYWRkIiwgIjEyNy4wLjAuMSIsIDU1NTQsIE5VTEwpOworICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHVkcHNpbmssICJhZGQiLCAiMTI3LjAuMC4xIiwgNTU1NSwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHVkcHNpbmspOworCisgIHVkcHNpbmsgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoInVkcHNpbmsiKTsKKyAgZ19zaWduYWxfZW1pdF9ieV9uYW1lICh1ZHBzaW5rLCAiYWRkIiwgIjEyNy4wLjAuMSIsIDU1NTQsIE5VTEwpOworICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHVkcHNpbmssICJhZGQiLCAiMTAuMi4wLjEiLCA1NTU0LCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodWRwc2luayk7CisKKyAgdWRwc2luayA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgidWRwc2luayIpOworICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHVkcHNpbmssICJhZGQiLCAiMTI3LjAuMC4xIiwgNTU1NCwgTlVMTCk7CisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAodWRwc2luaywgImFkZCIsICIxMC4yLjAuMSIsIDU1NTQsIE5VTEwpOworICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHVkcHNpbmssICJyZW1vdmUiLCAiMTI3LjAuMC4xIiwgNTU1NCwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHVkcHNpbmspOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3VkcHNpbmtfZHNjcCkKK3sKKyAgR3N0RWxlbWVudCAqdWRwc2luazsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgIEdTb2NrZXQgKnNvY2s0LCAqc29jazY7CisKKyAgc29jazQgPQorICAgICAgZ19zb2NrZXRfbmV3IChHX1NPQ0tFVF9GQU1JTFlfSVBWNCwgR19TT0NLRVRfVFlQRV9EQVRBR1JBTSwKKyAgICAgIEdfU09DS0VUX1BST1RPQ09MX1VEUCwgJmVycm9yKTsKKyAgZmFpbF91bmxlc3MgKHNvY2s0ICE9IE5VTEwgJiYgZXJyb3IgPT0gTlVMTCk7CisgIHNvY2s2ID0KKyAgICAgIGdfc29ja2V0X25ldyAoR19TT0NLRVRfRkFNSUxZX0lQVjYsIEdfU09DS0VUX1RZUEVfREFUQUdSQU0sCisgICAgICBHX1NPQ0tFVF9QUk9UT0NPTF9VRFAsICZlcnJvcik7CisgIGZhaWxfdW5sZXNzIChzb2NrNiAhPSBOVUxMICYmIGVycm9yID09IE5VTEwpOworCisgIHVkcHNpbmsgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoInVkcHNpbmsiKTsKKyAgZ19zaWduYWxfZW1pdF9ieV9uYW1lICh1ZHBzaW5rLCAiYWRkIiwgIjEyNy4wLjAuMSIsIDU1NTQsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHVkcHNpbmssICJzb2NrZXQiLCBzb2NrNCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAodWRwc2luaywgInNvY2tldC12NiIsIHNvY2s2LCBOVUxMKTsKKworICBBU1NFUlRfU0VUX1NUQVRFICh1ZHBzaW5rLCBHU1RfU1RBVEVfUkVBRFksIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgZ19vYmplY3Rfc2V0ICh1ZHBzaW5rLCAicW9zLWRzY3AiLCAwLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0ICh1ZHBzaW5rLCAicW9zLWRzY3AiLCA2MywgTlVMTCk7CisKKyAgQVNTRVJUX1NFVF9TVEFURSAodWRwc2luaywgR1NUX1NUQVRFX05VTEwsIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAodWRwc2luayk7CisgIGdfb2JqZWN0X3VucmVmIChzb2NrNCk7CisgIGdfb2JqZWN0X3VucmVmIChzb2NrNik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK3VkcHNpbmtfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgidWRwc2lua190ZXN0Iik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImxpbmVhciIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF91ZHBzaW5rKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3VkcHNpbmtfYnVmZmVybGlzdCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF91ZHBzaW5rX2NsaWVudF9hZGRfcmVtb3ZlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3VkcHNpbmtfZHNjcCk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOICh1ZHBzaW5rKQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc3JjLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy91ZHBzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTllODI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvdWRwc3JjLmMKQEAgLTAsMCArMSwyNjMgQEAKKy8qIEdTdHJlYW1lciBVRFAgc291cmNlIHVuaXQgdGVzdHMKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaW0tUGhpbGlwcCBNw7xsbGVyIDx0aW0gY2VudHJpY3VsYXIgbmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z2lvL2dpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTX0FOWSk7CisKK3N0YXRpYyBnYm9vbGVhbgordWRwc3JjX3NldHVwIChHc3RFbGVtZW50ICoqIHVkcHNyYywgR1NvY2tldCAqKiBzb2NrZXQsCisgICAgR3N0UGFkICoqIHNpbmtwYWQsIEdTb2NrZXRBZGRyZXNzICoqIHNhKQoreworICBHSW5ldEFkZHJlc3MgKmlhOworICBpbnQgcG9ydCA9IDA7CisgIGdjaGFyICpzOworCisgICp1ZHBzcmMgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoInVkcHNyYyIpOworICBmYWlsX3VubGVzcyAoKnVkcHNyYyAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0ICgqdWRwc3JjLCAicG9ydCIsIDAsIE5VTEwpOworCisgICpzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkX2J5X25hbWUgKCp1ZHBzcmMsICZzaW5rdGVtcGxhdGUsICJzcmMiKTsKKyAgZmFpbF91bmxlc3MgKCpzaW5rcGFkICE9IE5VTEwpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKCpzaW5rcGFkLCBUUlVFKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKCp1ZHBzcmMsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZ19vYmplY3RfZ2V0ICgqdWRwc3JjLCAicG9ydCIsICZwb3J0LCBOVUxMKTsKKyAgR1NUX0lORk8gKCJ1ZHBzcmMgcG9ydCA9ICVkIiwgcG9ydCk7CisKKyAgKnNvY2tldCA9IGdfc29ja2V0X25ldyAoR19TT0NLRVRfRkFNSUxZX0lQVjQsIEdfU09DS0VUX1RZUEVfREFUQUdSQU0sCisgICAgICBHX1NPQ0tFVF9QUk9UT0NPTF9VRFAsIE5VTEwpOworCisgIGlmICgqc29ja2V0ID09IE5VTEwpIHsKKyAgICBHU1RfV0FSTklORyAoIkNvdWxkIG5vdCBjcmVhdGUgSVB2NCBVRFAgc29ja2V0IGZvciB1bml0IHRlc3QiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpYSA9IGdfaW5ldF9hZGRyZXNzX25ld19sb29wYmFjayAoR19TT0NLRVRfRkFNSUxZX0lQVjQpOworICBzID0gZ19pbmV0X2FkZHJlc3NfdG9fc3RyaW5nIChpYSk7CisgIEdTVF9MT0cgKCJpbmV0IGFkZHJlc3MgJXMiLCBzKTsKKyAgZ19mcmVlIChzKTsKKyAgKnNhID0gZ19pbmV0X3NvY2tldF9hZGRyZXNzX25ldyAoaWEsIHBvcnQpOworICBnX29iamVjdF91bnJlZiAoaWEpOworCisgIHJldHVybiBUUlVFOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF91ZHBzcmNfZW1wdHlfcGFja2V0KQoreworICBHU29ja2V0QWRkcmVzcyAqc2EgPSBOVUxMOworICBHc3RFbGVtZW50ICp1ZHBzcmMgPSBOVUxMOworICBHU29ja2V0ICpzb2NrZXQgPSBOVUxMOworICBHc3RQYWQgKnNpbmtwYWQgPSBOVUxMOworCisgIGlmICghdWRwc3JjX3NldHVwICgmdWRwc3JjLCAmc29ja2V0LCAmc2lua3BhZCwgJnNhKSkKKyAgICBnb3RvIG5vX3NvY2tldDsKKworICBpZiAoZ19zb2NrZXRfc2VuZF90byAoc29ja2V0LCBzYSwgIkhlTEwwIiwgMCwgTlVMTCwgTlVMTCkgPT0gMCkgeworICAgIEdTVF9JTkZPICgic2VudCAwIGJ5dGVzIik7CisgICAgaWYgKGdfc29ja2V0X3NlbmRfdG8gKHNvY2tldCwgc2EsICJIZUxMMCIsIDYsIE5VTEwsIE5VTEwpID09IDYpIHsKKyAgICAgIEdzdE1hcEluZm8gbWFwOworICAgICAgR3N0QnVmZmVyICpidWY7CisgICAgICBndWludCBsZW4gPSAwOworCisgICAgICBHU1RfSU5GTyAoInNlbnQgNiBieXRlcyIpOworCisgICAgICBnX211dGV4X2xvY2sgKCZjaGVja19tdXRleCk7CisgICAgICBsZW4gPSBnX2xpc3RfbGVuZ3RoIChidWZmZXJzKTsKKyAgICAgIHdoaWxlIChsZW4gPCAxKSB7CisgICAgICAgIGdfY29uZF93YWl0ICgmY2hlY2tfY29uZCwgJmNoZWNrX211dGV4KTsKKyAgICAgICAgbGVuID0gZ19saXN0X2xlbmd0aCAoYnVmZmVycyk7CisgICAgICAgIEdTVF9JTkZPICgiJXUgYnVmZmVycyIsIGxlbik7CisgICAgICB9CisKKyAgICAgIC8qIHdhaXQgYSBiaXQgbW9yZSBmb3IgYSBzZWNvbmQgYnVmZmVyICovCisgICAgICBpZiAobGVuIDwgMikgeworICAgICAgICBnX2NvbmRfd2FpdF91bnRpbCAoJmNoZWNrX2NvbmQsICZjaGVja19tdXRleCwKKyAgICAgICAgICAgIGdfZ2V0X21vbm90b25pY190aW1lICgpICsgR19USU1FX1NQQU5fU0VDT05EIC8gMTAwKTsKKworICAgICAgICBsZW4gPSBnX2xpc3RfbGVuZ3RoIChidWZmZXJzKTsKKyAgICAgICAgR1NUX0lORk8gKCIldSBidWZmZXJzIiwgbGVuKTsKKyAgICAgIH0KKworICAgICAgZmFpbF91bmxlc3MgKGxlbiA9PSAxIHx8IGxlbiA9PSAyKTsKKworICAgICAgLyogbGFzdCBidWZmZXIgc2hvdWxkIGJlIG91ciBIZUxMMCBzdHJpbmcgKi8KKyAgICAgIGJ1ZiA9IEdTVF9CVUZGRVIgKGdfbGlzdF9udGhfZGF0YSAoYnVmZmVycywgbGVuIC0gMSkpOworICAgICAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG1hcC5zaXplLCA2KTsKKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19zdHJpbmcgKChnY2hhciAqKSBtYXAuZGF0YSwgIkhlTEwwIik7CisgICAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgICAgICAvKiBpZiB0aGVyZSdzIGFub3RoZXIgYnVmZmVyLCBpdCBzaG91bGQgYmUgMCBieXRlcyAqLworICAgICAgaWYgKGxlbiA9PSAyKSB7CisgICAgICAgIGJ1ZiA9IEdTVF9CVUZGRVIgKGdfbGlzdF9udGhfZGF0YSAoYnVmZmVycywgMCkpOworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfYnVmZmVyX2dldF9zaXplIChidWYpLCAwKTsKKyAgICAgIH0KKyAgICAgIGdfbXV0ZXhfdW5sb2NrICgmY2hlY2tfbXV0ZXgpOworICAgIH0gZWxzZSB7CisgICAgICBHU1RfV0FSTklORyAoInNlbmRfdG8oNiBieXRlcykgZmFpbGVkIik7CisgICAgfQorICB9IGVsc2UgeworICAgIEdTVF9XQVJOSU5HICgic2VuZF90bygwIGJ5dGVzKSBmYWlsZWQiKTsKKyAgfQorCitub19zb2NrZXQ6CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlICh1ZHBzcmMsIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3RfY2hlY2tfZHJvcF9idWZmZXJzICgpOworICBnc3RfY2hlY2tfdGVhcmRvd25fcGFkX2J5X25hbWUgKHVkcHNyYywgInNyYyIpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAodWRwc3JjKTsKKworICBnX29iamVjdF91bnJlZiAoc29ja2V0KTsKKyAgZ19vYmplY3RfdW5yZWYgKHNhKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF91ZHBzcmMpCit7CisgIEdTb2NrZXRBZGRyZXNzICpzYSA9IE5VTEw7CisgIEdzdEVsZW1lbnQgKnVkcHNyYyA9IE5VTEw7CisgIEdTb2NrZXQgKnNvY2tldCA9IE5VTEw7CisgIEdzdFBhZCAqc2lua3BhZCA9IE5VTEw7CisgIEdzdEJ1ZmZlciAqYnVmOworICBHc3RNZW1vcnkgKm1lbTsKKyAgZ2NoYXIgZGF0YVs0ODAwMF07CisgIGdzaXplIG1heF9zaXplOworICBpbnQgaSwgbGVuID0gMDsKKyAgZ3NzaXplIHNlbnQ7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBpIDwgR19OX0VMRU1FTlRTIChkYXRhKTsgKytpKQorICAgIGRhdGFbaV0gPSBpICYgMHhmZjsKKworICBpZiAoIXVkcHNyY19zZXR1cCAoJnVkcHNyYywgJnNvY2tldCwgJnNpbmtwYWQsICZzYSkpCisgICAgZ290byBub19zb2NrZXQ7CisKKyAgaWYgKChzZW50ID0gZ19zb2NrZXRfc2VuZF90byAoc29ja2V0LCBzYSwgZGF0YSwgNDgwMDAsIE5VTEwsICZlcnIpKSA9PSAtMSkKKyAgICBnb3RvIHNlbmRfZmFpbHVyZTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoc2VudCwgNDgwMDApOworCisgIGlmICgoc2VudCA9IGdfc29ja2V0X3NlbmRfdG8gKHNvY2tldCwgc2EsIGRhdGEsIDIxMDAwLCBOVUxMLCAmZXJyKSkgPT0gLTEpCisgICAgZ290byBzZW5kX2ZhaWx1cmU7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHNlbnQsIDIxMDAwKTsKKworICBpZiAoKHNlbnQgPSBnX3NvY2tldF9zZW5kX3RvIChzb2NrZXQsIHNhLCBkYXRhLCA1MDAsIE5VTEwsICZlcnIpKSA9PSAtMSkKKyAgICBnb3RvIHNlbmRfZmFpbHVyZTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoc2VudCwgNTAwKTsKKworICBpZiAoKHNlbnQgPSBnX3NvY2tldF9zZW5kX3RvIChzb2NrZXQsIHNhLCBkYXRhLCAxNjAwLCBOVUxMLCAmZXJyKSkgPT0gLTEpCisgICAgZ290byBzZW5kX2ZhaWx1cmU7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHNlbnQsIDE2MDApOworCisgIGlmICgoc2VudCA9IGdfc29ja2V0X3NlbmRfdG8gKHNvY2tldCwgc2EsIGRhdGEsIDE0MDAsIE5VTEwsICZlcnIpKSA9PSAtMSkKKyAgICBnb3RvIHNlbmRfZmFpbHVyZTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoc2VudCwgMTQwMCk7CisKKyAgR1NUX0lORk8gKCJzZW50IHNvbWUgcGFja2V0cyIpOworCisgIGdfbXV0ZXhfbG9jayAoJmNoZWNrX211dGV4KTsKKyAgbGVuID0gZ19saXN0X2xlbmd0aCAoYnVmZmVycyk7CisgIHdoaWxlIChsZW4gPCA1KSB7CisgICAgZ19jb25kX3dhaXQgKCZjaGVja19jb25kLCAmY2hlY2tfbXV0ZXgpOworICAgIGxlbiA9IGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpOworICAgIEdTVF9JTkZPICgiJXUgYnVmZmVycyIsIGxlbik7CisgIH0KKworICAvKiBjaGVjayB0aGF0IGxhcmdlIHBhY2tldHMgYXJlIG1hZGUgdXAgb2YgbXVsdGlwbGUgbWVtb3J5IGNodW5rcyBhbmQgdGhhdAorICAgKiB0aGUgZmlyc3Qgb25lIGlzIGZhaXJseSBzbWFsbCAqLworICBidWYgPSBHU1RfQlVGRkVSIChnX2xpc3RfbnRoX2RhdGEgKGJ1ZmZlcnMsIDApKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSwgNDgwMDApOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfYnVmZmVyX25fbWVtb3J5IChidWYpLCAyKTsKKyAgbWVtID0gZ3N0X2J1ZmZlcl9wZWVrX21lbW9yeSAoYnVmLCAwKTsKKyAgZ3N0X21lbW9yeV9nZXRfc2l6ZXMgKG1lbSwgTlVMTCwgJm1heF9zaXplKTsKKyAgZmFpbF91bmxlc3MgKG1heF9zaXplIDw9IDIwMDApOworCisgIGJ1ZiA9IEdTVF9CVUZGRVIgKGdfbGlzdF9udGhfZGF0YSAoYnVmZmVycywgMSkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfYnVmZmVyX2dldF9zaXplIChidWYpLCAyMTAwMCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9idWZmZXJfbl9tZW1vcnkgKGJ1ZiksIDIpOworICBtZW0gPSBnc3RfYnVmZmVyX3BlZWtfbWVtb3J5IChidWYsIDApOworICBnc3RfbWVtb3J5X2dldF9zaXplcyAobWVtLCBOVUxMLCAmbWF4X3NpemUpOworICBmYWlsX3VubGVzcyAobWF4X3NpemUgPD0gMjAwMCk7CisKKyAgYnVmID0gR1NUX0JVRkZFUiAoZ19saXN0X250aF9kYXRhIChidWZmZXJzLCAyKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZiksIDUwMCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9idWZmZXJfbl9tZW1vcnkgKGJ1ZiksIDEpOworICBtZW0gPSBnc3RfYnVmZmVyX3BlZWtfbWVtb3J5IChidWYsIDApOworICBnc3RfbWVtb3J5X2dldF9zaXplcyAobWVtLCBOVUxMLCAmbWF4X3NpemUpOworICBmYWlsX3VubGVzcyAobWF4X3NpemUgPD0gMjAwMCk7CisKKyAgYnVmID0gR1NUX0JVRkZFUiAoZ19saXN0X250aF9kYXRhIChidWZmZXJzLCAzKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9idWZmZXJfZ2V0X3NpemUgKGJ1ZiksIDE2MDApOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfYnVmZmVyX25fbWVtb3J5IChidWYpLCAyKTsKKyAgbWVtID0gZ3N0X2J1ZmZlcl9wZWVrX21lbW9yeSAoYnVmLCAwKTsKKyAgZ3N0X21lbW9yeV9nZXRfc2l6ZXMgKG1lbSwgTlVMTCwgJm1heF9zaXplKTsKKyAgZmFpbF91bmxlc3MgKG1heF9zaXplIDw9IDIwMDApOworCisgIGJ1ZiA9IEdTVF9CVUZGRVIgKGdfbGlzdF9udGhfZGF0YSAoYnVmZmVycywgNCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfYnVmZmVyX2dldF9zaXplIChidWYpLCAxNDAwKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X2J1ZmZlcl9uX21lbW9yeSAoYnVmKSwgMSk7CisgIG1lbSA9IGdzdF9idWZmZXJfcGVla19tZW1vcnkgKGJ1ZiwgMCk7CisgIGdzdF9tZW1vcnlfZ2V0X3NpemVzIChtZW0sIE5VTEwsICZtYXhfc2l6ZSk7CisgIGZhaWxfdW5sZXNzIChtYXhfc2l6ZSA8PSAyMDAwKTsKKworICBnX2xpc3RfZm9yZWFjaCAoYnVmZmVycywgKEdGdW5jKSBnc3RfYnVmZmVyX3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICBidWZmZXJzID0gTlVMTDsKKworICBnX211dGV4X3VubG9jayAoJmNoZWNrX211dGV4KTsKKworbm9fc29ja2V0Ogorc2VuZF9mYWlsdXJlOgorICBpZiAoZXJyKSB7CisgICAgR1NUX1dBUk5JTkcgKCJTb2NrZXQgc2VuZCBlcnJvciwgc2tpcHBpbmcgdGVzdDogJXMiLCBlcnItPm1lc3NhZ2UpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICB9CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlICh1ZHBzcmMsIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3RfY2hlY2tfZHJvcF9idWZmZXJzICgpOworICBnc3RfY2hlY2tfdGVhcmRvd25fcGFkX2J5X25hbWUgKHVkcHNyYywgInNyYyIpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAodWRwc3JjKTsKKworICBnX29iamVjdF91bnJlZiAoc29ja2V0KTsKKyAgZ19vYmplY3RfdW5yZWYgKHNhKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgordWRwc3JjX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInVkcHNyYyIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJ1ZHBzcmMiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3VkcHNyY19lbXB0eV9wYWNrZXQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdWRwc3JjKTsKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOICh1ZHBzcmMpCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2JveC5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9ib3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDI2NTM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9ib3guYwpAQCAtMCwwICsxLDIyNCBAQAorLyogR1N0cmVhbWVyCisgKiB1bml0IHRlc3QgZm9yIHRoZSB2aWRlb2JveCBlbGVtZW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJhdmkgS2lyYW4gSyBOIDxyYXZpLmtpcmFuQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCit0eXBlZGVmIHN0cnVjdCBfR3N0VmlkZW9Cb3hUZXN0Q29udGV4dAoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0RWxlbWVudCAqc3JjOworICBHc3RFbGVtZW50ICpmaWx0ZXI7CisgIEdzdEVsZW1lbnQgKmJveDsKKyAgR3N0RWxlbWVudCAqZmlsdGVyMjsKKyAgR3N0RWxlbWVudCAqc2luazsKK30gR3N0VmlkZW9Cb3hUZXN0Q29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgX0Zvcm1hdENvbnZlcnNpb24KK3sKKyAgY29uc3QgZ2NoYXIgKmluX2NhcHM7CisgIGNvbnN0IGdjaGFyICpvdXRfY2FwczsKKyAgZ2Jvb2xlYW4gZXhwZWN0ZWRfcmVzdWx0OworfSBGb3JtYXRDb252ZXJzaW9uOworCisKKy8qCisgKiBVcGRhdGUgdGhpcyB0YWJsZSBhcyBhbmQgd2hlbiB0aGUgY29udmVyc2lvbiBpcyBzdXBwb3J0ZWQob3IgdW5zdXBwb3J0ZWQpIGluIHZpZGVvYm94CisgKi8KK3N0YXRpYyBjb25zdCBGb3JtYXRDb252ZXJzaW9uIGNvbnZlcnNpb25fdGFibGVbXSA9IHsKKyAgeyJ2aWRlby94LXJhdyxmb3JtYXQ9e1JHQkF9IiwgInZpZGVvL3gtcmF3LGZvcm1hdD17QVlVVn0iLCBUUlVFfSwKKyAgeyJ2aWRlby94LXJhdyxmb3JtYXQ9e0FZVVZ9IiwgInZpZGVvL3gtcmF3LGZvcm1hdD17UkdCQX0iLCBUUlVFfSwKKyAgeyJ2aWRlby94LXJhdyxmb3JtYXQ9e0k0MjB9IiwgInZpZGVvL3gtcmF3LGZvcm1hdD17QVlVVn0iLCBUUlVFfSwKKyAgeyJ2aWRlby94LXJhdyxmb3JtYXQ9e0FZVVZ9IiwgInZpZGVvL3gtcmF3LGZvcm1hdD17STQyMH0iLCBUUlVFfSwKKyAgeyJ2aWRlby94LXJhdyxmb3JtYXQ9e0k0MjB9IiwgInZpZGVvL3gtcmF3LGZvcm1hdD17WVYxMn0iLCBUUlVFfSwKKyAgeyJ2aWRlby94LXJhdyxmb3JtYXQ9e1lWMTJ9IiwgInZpZGVvL3gtcmF3LGZvcm1hdD17QVlVVn0iLCBUUlVFfSwKKyAgeyJ2aWRlby94LXJhdyxmb3JtYXQ9e1lWMTJ9IiwgInZpZGVvL3gtcmF3LGZvcm1hdD17STQyMH0iLCBUUlVFfSwKKyAgeyJ2aWRlby94LXJhdyxmb3JtYXQ9e0FZVVZ9IiwgInZpZGVvL3gtcmF3LGZvcm1hdD17WVYxMn0iLCBUUlVFfSwKKyAgeyJ2aWRlby94LXJhdyxmb3JtYXQ9e0FZVVZ9IiwgInZpZGVvL3gtcmF3LGZvcm1hdD17eFJHQn0iLCBUUlVFfSwKKyAgeyJ2aWRlby94LXJhdyxmb3JtYXQ9e3hSR0J9IiwgInZpZGVvL3gtcmF3LGZvcm1hdD17eFJHQn0iLCBUUlVFfSwKKyAgeyJ2aWRlby94LXJhdyxmb3JtYXQ9e3hSR0J9IiwgInZpZGVvL3gtcmF3LGZvcm1hdD17QVlVVn0iLCBUUlVFfSwKKyAgeyJ2aWRlby94LXJhdyxmb3JtYXQ9e0dSQVk4fSIsICJ2aWRlby94LXJhdyxmb3JtYXQ9e0dSQVkxNl9MRX0iLCBGQUxTRX0sCisgIHsidmlkZW8veC1yYXcsZm9ybWF0PXtHUkFZOH0iLCAidmlkZW8veC1yYXcsZm9ybWF0PXtHUkFZMTZfQkV9IiwgRkFMU0V9LAorICB7InZpZGVvL3gtcmF3LGZvcm1hdD17WTQ0NH0iLCAidmlkZW8veC1yYXcsZm9ybWF0PXtZNDJCfSIsIEZBTFNFfSwKKyAgeyJ2aWRlby94LXJhdyxmb3JtYXQ9e1k0NDR9IiwgInZpZGVvL3gtcmF3LGZvcm1hdD17WTQxQn0iLCBGQUxTRX0sCisgIHsidmlkZW8veC1yYXcsZm9ybWF0PXtZNDJCfSIsICJ2aWRlby94LXJhdyxmb3JtYXQ9e1k0MUJ9IiwgRkFMU0V9Cit9OworCisKK3N0YXRpYyBnYm9vbGVhbgorYnVzX2hhbmRsZXIgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIGdwb2ludGVyIGRhdGEpCit7CisgIEdNYWluTG9vcCAqbG9vcCA9IChHTWFpbkxvb3AgKikgZGF0YTsKKworICBzd2l0Y2ggKG1lc3NhZ2UtPnR5cGUpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VPUzp7CisgICAgICBHU1RfTE9HICgiRU9TIGV2ZW50IHJlY2VpdmVkIik7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VSUk9SOnsKKyAgICAgIEdFcnJvciAqZ2Vycm9yOworICAgICAgZ2NoYXIgKmRlYnVnOworICAgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1lc3NhZ2UsICZnZXJyb3IsICZkZWJ1Zyk7CisgICAgICBnX2Vycm9yICgiRXJyb3IgZnJvbSAlczogJXMgKCVzKVxuIiwKKyAgICAgICAgICBHU1RfRUxFTUVOVF9OQU1FIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpKSwgZ2Vycm9yLT5tZXNzYWdlLAorICAgICAgICAgIEdTVF9TVFJfTlVMTCAoZGVidWcpKTsKKyAgICAgIGdfZXJyb3JfZnJlZSAoZ2Vycm9yKTsKKyAgICAgIGdfZnJlZSAoZGVidWcpOworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfTUVTU0FHRV9XQVJOSU5HOnsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAordmlkZW9ib3hfdGVzdF9pbml0X2NvbnRleHQgKEdzdFZpZGVvQm94VGVzdENvbnRleHQgKiBjdHgpCit7CisgIGZhaWxfdW5sZXNzIChjdHggIT0gTlVMTCk7CisKKyAgY3R4LT5waXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBmYWlsX3VubGVzcyAoY3R4LT5waXBlbGluZSAhPSBOVUxMKTsKKyAgY3R4LT5zcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChjdHgtPnNyYyAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSB2aWRlb3Rlc3RzcmMgZWxlbWVudCIpOworICBjdHgtPmZpbHRlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImNhcHNmaWx0ZXIiLCAiZmlsdGVyIik7CisgIGZhaWxfdW5sZXNzIChjdHgtPmZpbHRlciAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSBjYXBzZmlsdGVyIGVsZW1lbnQiKTsKKyAgY3R4LT5ib3ggPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb2JveCIsICJib3giKTsKKyAgZmFpbF91bmxlc3MgKGN0eC0+Ym94ICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIHZpZGVvYm94IGVsZW1lbnQiKTsKKyAgY3R4LT5maWx0ZXIyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiY2Fwc2ZpbHRlciIsICJmaWx0ZXIyIik7CisgIGZhaWxfdW5sZXNzIChjdHgtPmZpbHRlcjIgIT0gTlVMTCwKKyAgICAgICJGYWlsZWQgdG8gY3JlYXRlIHNlY29uZCBjYXBzZmlsdGVyIGVsZW1lbnQiKTsKKyAgY3R4LT5zaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworICBmYWlsX3VubGVzcyAoY3R4LT5zaW5rICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIGZha2VzaW5rIGVsZW1lbnQiKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChjdHgtPnBpcGVsaW5lKSwgY3R4LT5zcmMsIGN0eC0+ZmlsdGVyLAorICAgICAgY3R4LT5ib3gsIGN0eC0+ZmlsdGVyMiwgY3R4LT5zaW5rLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmtfbWFueSAoY3R4LT5zcmMsIGN0eC0+ZmlsdGVyLCBjdHgtPmJveCwKKyAgICAgICAgICBjdHgtPmZpbHRlcjIsIGN0eC0+c2luaywgTlVMTCkgPT0gVFJVRSwgIkNhbiBub3QgbGluayBlbGVtZW50cyIpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGN0eC0+cGlwZWxpbmUsCisgICAgICAgICAgR1NUX1NUQVRFX1JFQURZKSAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUsCisgICAgICAiY291bGRuJ3Qgc2V0IHBpcGVsaW5lIHRvIFJFQURZIHN0YXRlIik7CisKKyAgR1NUX0xPRyAoInZpZGVvYm94IGNvbnRleHQgaW5pdGVkIik7Cit9CisKK3N0YXRpYyB2b2lkCit2aWRlb2JveF90ZXN0X2RlaW5pdF9jb250ZXh0IChHc3RWaWRlb0JveFRlc3RDb250ZXh0ICogY3R4KQoreworICBHU1RfTE9HICgiZGVpbml0aW5nIHZpZGVvYm94IGNvbnRleHQiKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGN0eC0+cGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoY3R4LT5waXBlbGluZSk7CisgIG1lbXNldCAoY3R4LCAweDAwLCBzaXplb2YgKEdzdFZpZGVvQm94VGVzdENvbnRleHQpKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfY2Fwc190cmFuc2Zvcm0pCit7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHN0YXRlX3JldDsKKyAgR3N0VmlkZW9Cb3hUZXN0Q29udGV4dCBjdHg7CisgIGd1aW50IGNvbnZlcnNpb25zX3Rlc3Rfc2l6ZTsKKyAgZ3VpbnQgaXRyOworICBnYm9vbGVhbiBsaW5rX3JlczsKKyAgR01haW5Mb29wICpsb29wOworICBHc3RCdXMgKmJ1czsKKworICB2aWRlb2JveF90ZXN0X2luaXRfY29udGV4dCAoJmN0eCk7CisgIGdzdF91dGlsX3NldF9vYmplY3RfYXJnIChHX09CSkVDVCAoY3R4LnNyYyksICJudW0tYnVmZmVycyIsICIxIik7CisKKyAgbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgVFJVRSk7CisgIGZhaWxfdW5sZXNzIChsb29wICE9IE5VTEwpOworCisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKGN0eC5waXBlbGluZSk7CisgIGZhaWxfdW5sZXNzIChidXMgIT0gTlVMTCk7CisKKyAgZ3N0X2J1c19hZGRfd2F0Y2ggKGJ1cywgYnVzX2hhbmRsZXIsIGxvb3ApOworCisgIGNvbnZlcnNpb25zX3Rlc3Rfc2l6ZSA9IEdfTl9FTEVNRU5UUyAoY29udmVyc2lvbl90YWJsZSk7CisgIGZvciAoaXRyID0gMDsgaXRyIDwgY29udmVyc2lvbnNfdGVzdF9zaXplOyBpdHIrKykgeworICAgIGdzdF9lbGVtZW50X3VubGlua19tYW55IChjdHguc3JjLCBjdHguZmlsdGVyLCBjdHguYm94LCBjdHguZmlsdGVyMiwKKyAgICAgICAgY3R4LnNpbmssIE5VTEwpOworICAgIGdzdF91dGlsX3NldF9vYmplY3RfYXJnIChHX09CSkVDVCAoY3R4LmZpbHRlciksICJjYXBzIiwKKyAgICAgICAgY29udmVyc2lvbl90YWJsZVtpdHJdLmluX2NhcHMpOworICAgIGdzdF91dGlsX3NldF9vYmplY3RfYXJnIChHX09CSkVDVCAoY3R4LmZpbHRlcjIpLCAiY2FwcyIsCisgICAgICAgIGNvbnZlcnNpb25fdGFibGVbaXRyXS5vdXRfY2Fwcyk7CisKKyAgICAvKiBMaW5rIHdpdGggbmV3IGlucHV0IGFuZCBvdXRwdXQgZm9ybWF0IGZyb20gY29udmVyc2lvbiB0YWJsZSAqLworICAgIGxpbmtfcmVzID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfbGlua19tYW55IChjdHguc3JjLCBjdHguZmlsdGVyLCBjdHguYm94LCBjdHguZmlsdGVyMiwKKyAgICAgICAgY3R4LnNpbmssIE5VTEwpOworCisgICAgLyogQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBmb3JtYXQgY29udmVyc2lvbiBpcyBzdXBwb3J0ZWQgb3Igbm90IGJ5IHZpZGVvYm94ICovCisgICAgZmFpbF91bmxlc3MgKGxpbmtfcmVzID09IGNvbnZlcnNpb25fdGFibGVbaXRyXS5leHBlY3RlZF9yZXN1bHQsCisgICAgICAgICJ2aWRlb2JveCBjYW4gbm90IGNvbnZlcnQgZnJvbSAnJXMnJyB0byAnJXMnIiwKKyAgICAgICAgY29udmVyc2lvbl90YWJsZVtpdHJdLmluX2NhcHMsIGNvbnZlcnNpb25fdGFibGVbaXRyXS5vdXRfY2Fwcyk7CisKKyAgICBpZiAobGlua19yZXMgPT0gRkFMU0UpIHsKKyAgICAgIEdTVF9MT0cgKCJlbGVtZW50cyBsaW5raW5nIGZhaWxlZCIpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgc3RhdGVfcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChjdHgucGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgICBmYWlsX3VubGVzcyAoc3RhdGVfcmV0ICE9IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSwKKyAgICAgICAgImNvdWxkbid0IHNldCBwaXBlbGluZSB0byBQTEFZSU5HIHN0YXRlIik7CisKKyAgICBnX21haW5fbG9vcF9ydW4gKGxvb3ApOworCisgICAgc3RhdGVfcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChjdHgucGlwZWxpbmUsIEdTVF9TVEFURV9SRUFEWSk7CisgICAgZmFpbF91bmxlc3MgKHN0YXRlX3JldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUsCisgICAgICAgICJjb3VsZG4ndCBzZXQgcGlwZWxpbmUgdG8gUkVBRFkgc3RhdGUiKTsKKyAgfQorCisgIGdzdF9idXNfcmVtb3ZlX3dhdGNoIChidXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisKKyAgdmlkZW9ib3hfdGVzdF9kZWluaXRfY29udGV4dCAoJmN0eCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitzdGF0aWMgU3VpdGUgKgordmlkZW9ib3hfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgidmlkZW9ib3giKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfY2Fwc190cmFuc2Zvcm0pOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAodmlkZW9ib3gpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb2Nyb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTc2ZTVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9jcm9wLmMKQEAgLTAsMCArMSw4MTkgQEAKKy8qIEdTdHJlYW1lciB1bml0IHRlc3QgZm9yIHRoZSB2aWRlb2Nyb3AgZWxlbWVudAorICogQ29weXJpZ2h0IChDKSAyMDA2IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmZGVmIEhBVkVfVkFMR1JJTkQKKyMgaW5jbHVkZSA8dmFsZ3JpbmQvdmFsZ3JpbmQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RiYXNldHJhbnNmb3JtLmg+CisKKy8qIHJldHVybiBhIGxpc3Qgb2YgY2FwcyB3aGVyZSB3ZSBvbmx5IG5lZWQgdG8gc2V0CisgKiB3aWR0aCBhbmQgaGVpZ2h0IHRvIGdldCBmaXhlZCBjYXBzICovCitzdGF0aWMgR0xpc3QgKgordmlkZW9fY3JvcF9nZXRfdGVzdF9jYXBzIChHc3RFbGVtZW50ICogdmlkZW9jcm9wKQoreworICBHc3RDYXBzICp0ZW1wbCwgKmFsbG93ZWRfY2FwczsKKyAgR3N0UGFkICpzcmNwYWQ7CisgIEdMaXN0ICpsaXN0ID0gTlVMTDsKKyAgZ3VpbnQgaTsKKworICBzcmNwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAodmlkZW9jcm9wLCAic3JjIik7CisgIGZhaWxfdW5sZXNzIChzcmNwYWQgIT0gTlVMTCk7CisgIHRlbXBsID0gZ3N0X3BhZF9nZXRfcGFkX3RlbXBsYXRlX2NhcHMgKHNyY3BhZCk7CisgIGZhaWxfdW5sZXNzICh0ZW1wbCAhPSBOVUxMKTsKKworICBhbGxvd2VkX2NhcHMgPSBnc3RfY2Fwc19ub3JtYWxpemUgKHRlbXBsKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZ3N0X2NhcHNfZ2V0X3NpemUgKGFsbG93ZWRfY2Fwcyk7ICsraSkgeworICAgIEdzdFN0cnVjdHVyZSAqbmV3X3N0cnVjdHVyZTsKKyAgICBHc3RDYXBzICpzaW5nbGVfY2FwczsKKworICAgIHNpbmdsZV9jYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworICAgIG5ld19zdHJ1Y3R1cmUgPQorICAgICAgICBnc3Rfc3RydWN0dXJlX2NvcHkgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFsbG93ZWRfY2FwcywgaSkpOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfc3RydWN0dXJlLCAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sCisgICAgICAgIDEsIDEsIE5VTEwpOworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChuZXdfc3RydWN0dXJlLCAid2lkdGgiKTsKKyAgICBnc3Rfc3RydWN0dXJlX3JlbW92ZV9maWVsZCAobmV3X3N0cnVjdHVyZSwgImhlaWdodCIpOworICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKHNpbmdsZV9jYXBzLCBuZXdfc3RydWN0dXJlKTsKKworICAgIEdTVF9ERUJVRyAoImhhdmUgY2FwcyAlIiBHU1RfUFRSX0ZPUk1BVCwgc2luZ2xlX2NhcHMpOworICAgIC8qIHNob3VsZCBiZSBmaXhlZCB3aXRob3V0IHdpZHRoL2hlaWdodCAqLworICAgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19pc19maXhlZCAoc2luZ2xlX2NhcHMpKTsKKworICAgIGxpc3QgPSBnX2xpc3RfcHJlcGVuZCAobGlzdCwgc2luZ2xlX2NhcHMpOworICB9CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGFsbG93ZWRfY2Fwcyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisKKyAgcmV0dXJuIGxpc3Q7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3VuaXRfc2l6ZXMpCit7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqY3NwX2tsYXNzLCAqdmNyb3Bfa2xhc3M7CisgIEdzdEVsZW1lbnQgKnZpZGVvY3JvcCwgKmNzcDsKKyAgR0xpc3QgKmNhcHNfbGlzdCwgKmw7CisKKyAgdmlkZW9jcm9wID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW9jcm9wIiwgInZpZGVvY3JvcCIpOworICBmYWlsX3VubGVzcyAodmlkZW9jcm9wICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIHZpZGVvY3JvcCBlbGVtZW50Iik7CisgIHZjcm9wX2tsYXNzID0gR1NUX0JBU0VfVFJBTlNGT1JNX0dFVF9DTEFTUyAodmlkZW9jcm9wKTsKKworICBjc3AgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb2NvbnZlcnQiLCAiY3NwIik7CisgIGZhaWxfdW5sZXNzIChjc3AgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgdmlkZW9jb252ZXJ0IGVsZW1lbnQiKTsKKyAgY3NwX2tsYXNzID0gR1NUX0JBU0VfVFJBTlNGT1JNX0dFVF9DTEFTUyAoY3NwKTsKKworICBjYXBzX2xpc3QgPSB2aWRlb19jcm9wX2dldF90ZXN0X2NhcHMgKHZpZGVvY3JvcCk7CisKKyAgZm9yIChsID0gY2Fwc19saXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KSB7CisgICAgY29uc3Qgc3RydWN0CisgICAgeworICAgICAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICAgIH0gc2l6ZXNfdG9fdHJ5W10gPSB7CisgICAgICB7CisgICAgICAxNjAsIDEyMH0sIHsKKyAgICAgIDE2MSwgMTIwfSwgeworICAgICAgMTYwLCAxMjF9LCB7CisgICAgICAxNjEsIDEyMX0sIHsKKyAgICAgIDE1OSwgMTIwfSwgeworICAgICAgMTYwLCAxMTl9LCB7CisgICAgICAxNTksIDExOX0sIHsKKyAgICAgIDE1OSwgMTIxfQorICAgIH07CisgICAgR3N0U3RydWN0dXJlICpzOworICAgIEdzdENhcHMgKmNhcHM7CisgICAgZ2ludCBpOworCisgICAgY2FwcyA9IGdzdF9jYXBzX2NvcHkgKEdTVF9DQVBTIChsLT5kYXRhKSk7CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICAgIGZhaWxfdW5sZXNzIChzICE9IE5VTEwpOworCisgICAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAoc2l6ZXNfdG9fdHJ5KTsgKytpKSB7CisgICAgICBnY2hhciAqY2Fwc19zdHI7CisgICAgICBnc2l6ZSBjc3Bfc2l6ZSA9IDA7CisgICAgICBnc2l6ZSB2Y19zaXplID0gMDsKKworICAgICAgZ3N0X3N0cnVjdHVyZV9zZXQgKHMsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHNpemVzX3RvX3RyeVtpXS53aWR0aCwKKyAgICAgICAgICAiaGVpZ2h0IiwgR19UWVBFX0lOVCwgc2l6ZXNfdG9fdHJ5W2ldLmhlaWdodCwgTlVMTCk7CisKKyAgICAgIGNhcHNfc3RyID0gZ3N0X2NhcHNfdG9fc3RyaW5nIChjYXBzKTsKKyAgICAgIEdTVF9JTkZPICgiVGVzdGluZyB1bml0IHNpemUgZm9yICVzIiwgY2Fwc19zdHIpOworCisgICAgICAvKiBza2lwIGlmIHZpZGVvY29udmVydCBkb2Vzbid0IHN1cHBvcnQgdGhlc2UgY2FwcworICAgICAgICogKG9ubHkgd29ya3Mgd2l0aCBnc3QtcGx1Z2lucy1iYXNlIDAuMTAuOS4xIG9yIGxhdGVyKSAqLworICAgICAgaWYgKCFjc3Bfa2xhc3MtPmdldF91bml0X3NpemUgKChHc3RCYXNlVHJhbnNmb3JtICopIGNzcCwgY2FwcywgJmNzcF9zaXplKSkgeworICAgICAgICBHU1RfSU5GTyAoInZpZGVvY29udmVydCBkb2VzIG5vdCBzdXBwb3J0IGZvcm1hdCAlcyIsIGNhcHNfc3RyKTsKKyAgICAgICAgZ19mcmVlIChjYXBzX3N0cik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBmYWlsX3VubGVzcyAodmNyb3Bfa2xhc3MtPmdldF91bml0X3NpemUgKChHc3RCYXNlVHJhbnNmb3JtICopIHZpZGVvY3JvcCwKKyAgICAgICAgICAgICAgY2FwcywgJnZjX3NpemUpKTsKKworICAgICAgZmFpbF91bmxlc3MgKHZjX3NpemUgPT0gY3NwX3NpemUsCisgICAgICAgICAgInZpZGVvY3JvcCBhbmQgdmlkZW9jb252ZXJ0IHJldHVybiBkaWZmZXJlbnQgdW5pdCBzaXplcyBmb3IgIgorICAgICAgICAgICJjYXBzICVzOiB2Y19zaXplPSVkLCBjc3Bfc2l6ZT0lZCIsIGNhcHNfc3RyLCB2Y19zaXplLCBjc3Bfc2l6ZSk7CisKKyAgICAgIGdfZnJlZSAoY2Fwc19zdHIpOworICAgIH0KKworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgfQorCisgIGdfbGlzdF9mb3JlYWNoIChjYXBzX2xpc3QsIChHRnVuYykgZ3N0X2NhcHNfdW5yZWYsIE5VTEwpOworICBnX2xpc3RfZnJlZSAoY2Fwc19saXN0KTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChjc3ApOworICBnc3Rfb2JqZWN0X3VucmVmICh2aWRlb2Nyb3ApOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RFbGVtZW50ICpzcmM7CisgIEdzdEVsZW1lbnQgKmZpbHRlcjsKKyAgR3N0RWxlbWVudCAqY3JvcDsKKyAgR3N0RWxlbWVudCAqZmlsdGVyMjsKKyAgR3N0RWxlbWVudCAqc2luazsKKyAgR3N0QnVmZmVyICpsYXN0X2J1ZjsKKyAgR3N0Q2FwcyAqbGFzdF9jYXBzOworfSBHc3RWaWRlb0Nyb3BUZXN0Q29udGV4dDsKKworc3RhdGljIHZvaWQKK2hhbmRvZmZfY2IgKEdzdEVsZW1lbnQgKiBzaW5rLCBHc3RCdWZmZXIgKiBidWYsIEdzdFBhZCAqIHBhZCwKKyAgICBHc3RWaWRlb0Nyb3BUZXN0Q29udGV4dCAqIGN0eCkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKworICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZjdHgtPmxhc3RfYnVmLCBidWYpOworICBjYXBzID0gZ3N0X3BhZF9nZXRfY3VycmVudF9jYXBzIChwYWQpOworICBnc3RfY2Fwc19yZXBsYWNlICgmY3R4LT5sYXN0X2NhcHMsIGNhcHMpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7Cit9CisKK3N0YXRpYyB2b2lkCit2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZ19pbml0X2NvbnRleHQgKEdzdFZpZGVvQ3JvcFRlc3RDb250ZXh0ICogY3R4KQoreworICBmYWlsX3VubGVzcyAoY3R4ICE9IE5VTEwpOworCisgIGN0eC0+cGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3ICgicGlwZWxpbmUiKTsKKyAgZmFpbF91bmxlc3MgKGN0eC0+cGlwZWxpbmUgIT0gTlVMTCk7CisgIGN0eC0+c3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgInNyYyIpOworICBmYWlsX3VubGVzcyAoY3R4LT5zcmMgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgdmlkZW90ZXN0c3JjIGVsZW1lbnQiKTsKKyAgY3R4LT5maWx0ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJjYXBzZmlsdGVyIiwgImZpbHRlciIpOworICBmYWlsX3VubGVzcyAoY3R4LT5maWx0ZXIgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgY2Fwc2ZpbHRlciBlbGVtZW50Iik7CisgIGN0eC0+Y3JvcCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvY3JvcCIsICJjcm9wIik7CisgIGZhaWxfdW5sZXNzIChjdHgtPmNyb3AgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgdmlkZW9jcm9wIGVsZW1lbnQiKTsKKyAgY3R4LT5maWx0ZXIyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiY2Fwc2ZpbHRlciIsICJmaWx0ZXIyIik7CisgIGZhaWxfdW5sZXNzIChjdHgtPmZpbHRlcjIgIT0gTlVMTCwKKyAgICAgICJGYWlsZWQgdG8gY3JlYXRlIHNlY29uZCBjYXBzZmlsdGVyIGVsZW1lbnQiKTsKKyAgY3R4LT5zaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworICBmYWlsX3VubGVzcyAoY3R4LT5zaW5rICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIGZha2VzaW5rIGVsZW1lbnQiKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChjdHgtPnBpcGVsaW5lKSwgY3R4LT5zcmMsIGN0eC0+ZmlsdGVyLAorICAgICAgY3R4LT5jcm9wLCBjdHgtPmZpbHRlcjIsIGN0eC0+c2luaywgTlVMTCk7CisgIGdzdF9lbGVtZW50X2xpbmtfbWFueSAoY3R4LT5zcmMsIGN0eC0+ZmlsdGVyLCBjdHgtPmNyb3AsIGN0eC0+ZmlsdGVyMiwKKyAgICAgIGN0eC0+c2luaywgTlVMTCk7CisKKyAgLyogc2V0IHBhdHRlcm4gdG8gJ3JlZCcgLSBmb3Igb3VyIHB1cnBvc2VzIGl0IGRvZXNuJ3QgbWF0dGVyIGFueXdheSAqLworICBnX29iamVjdF9zZXQgKGN0eC0+c3JjLCAicGF0dGVybiIsIDQsIE5VTEwpOworCisgIGdfb2JqZWN0X3NldCAoY3R4LT5zaW5rLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGN0eC0+c2luaywgInByZXJvbGwtaGFuZG9mZiIsIEdfQ0FMTEJBQ0sgKGhhbmRvZmZfY2IpLCBjdHgpOworCisgIGN0eC0+bGFzdF9idWYgPSBOVUxMOworICBjdHgtPmxhc3RfY2FwcyA9IE5VTEw7CisKKyAgR1NUX0xPRyAoImNvbnRleHQgaW5pdGVkIik7Cit9CisKK3N0YXRpYyB2b2lkCit2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZ19kZWluaXRfY29udGV4dCAoR3N0VmlkZW9Dcm9wVGVzdENvbnRleHQgKiBjdHgpCit7CisgIEdTVF9MT0cgKCJkZWluaXRpbmcgY29udGV4dCIpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoY3R4LT5waXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChjdHgtPnBpcGVsaW5lKTsKKyAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmY3R4LT5sYXN0X2J1ZiwgTlVMTCk7CisgIGdzdF9jYXBzX3JlcGxhY2UgKCZjdHgtPmxhc3RfY2FwcywgTlVMTCk7CisgIG1lbXNldCAoY3R4LCAweDAwLCBzaXplb2YgKEdzdFZpZGVvQ3JvcFRlc3RDb250ZXh0KSk7Cit9CisKK3R5cGVkZWYgdm9pZCAoKkdzdFZpZGVvQ3JvcFRlc3RCdWZmZXJGdW5jKSAoR3N0QnVmZmVyICogYnVmZmVyLCBHc3RDYXBzICogY2Fwcyk7CisKK3N0YXRpYyB2b2lkCit2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoR3N0VmlkZW9Dcm9wVGVzdENvbnRleHQgKiBjdHgsIEdzdENhcHMgKiBpbl9jYXBzLAorICAgIEdzdENhcHMgKiBvdXRfY2FwcywgZ2ludCBsZWZ0LCBnaW50IHJpZ2h0LCBnaW50IHRvcCwgZ2ludCBib3R0b20sCisgICAgR3N0VmlkZW9Dcm9wVGVzdEJ1ZmZlckZ1bmMgZnVuYykKK3sKKyAgR1NUX0xPRyAoImxydGIgPSAlMDN1ICUwM3UgJTAzdSAlMDN1LCBpbl9jYXBzID0gJSIgR1NUX1BUUl9GT1JNQVQKKyAgICAgICIsIG91dF9jYXBzID0gJSIgR1NUX1BUUl9GT1JNQVQsIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgaW5fY2FwcywKKyAgICAgIG91dF9jYXBzKTsKKworICBnX29iamVjdF9zZXQgKGN0eC0+ZmlsdGVyLCAiY2FwcyIsIGluX2NhcHMsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGN0eC0+ZmlsdGVyMiwgImNhcHMiLCBvdXRfY2FwcywgTlVMTCk7CisKKyAgZ19vYmplY3Rfc2V0IChjdHgtPmNyb3AsICJsZWZ0IiwgbGVmdCwgInJpZ2h0IiwgcmlnaHQsICJ0b3AiLCB0b3AsCisgICAgICAiYm90dG9tIiwgYm90dG9tLCBOVUxMKTsKKworICAvKiB0aGlzIHdpbGwgZmFpbCBpZiB2aWRlb3Rlc3RzcmMgZG9lc24ndCBzdXBwb3J0IG91ciBmb3JtYXQ7IHdlIG5lZWQKKyAgICogdmlkZW90ZXN0c3JjIGZyb20gLWJhc2UgQ1ZTIDAuMTAuOS4xIHdpdGggUkdCQSBhbmQgQVlVViBzdXBwb3J0ICovCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGN0eC0+cGlwZWxpbmUsCisgICAgICAgICAgR1NUX1NUQVRFX1BBVVNFRCkgIT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2dldF9zdGF0ZSAoY3R4LT5waXBlbGluZSwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAtMSkgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBpZiAoZnVuYyAhPSBOVUxMKSB7CisgICAgZnVuYyAoY3R4LT5sYXN0X2J1ZiwgY3R4LT5sYXN0X2NhcHMpOworICB9CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChjdHgtPnBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja18xeDFfYnVmZmVyIChHc3RCdWZmZXIgKiBidWYsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RWaWRlb0luZm8gaW5mbzsKKyAgR3N0VmlkZW9GcmFtZSBmcmFtZTsKKyAgLyogdGhlIGV4YWN0IHZhbHVlcyB3ZSBjaGVjayBmb3IgY29tZSBmcm9tIHZpZGVvdGVzdHNyYyAqLworICBzdGF0aWMgY29uc3QgZ3VpbnQgeXV2X3ZhbHVlc1tdID0geyA4MSwgOTAsIDI0MCwgMjU1IH07CisgIHN0YXRpYyBjb25zdCBndWludCByZ2JfdmFsdWVzW10gPSB7IDB4ZmYsIDAsIDAsIDI1NSB9OworICBzdGF0aWMgY29uc3QgZ3VpbnQgZ3JheThfdmFsdWVzW10gPSB7IDB4NTEgfTsKKyAgc3RhdGljIGNvbnN0IGd1aW50IGdyYXkxNl92YWx1ZXNbXSA9IHsgMHg1MTUxIH07CisgIGNvbnN0IGd1aW50ICp2YWx1ZXM7CisgIGd1aW50IGk7CisgIGNvbnN0IEdzdFZpZGVvRm9ybWF0SW5mbyAqZmluZm87CisKKyAgZmFpbF91bmxlc3MgKGJ1ZiAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGNhcHMgIT0gTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF92aWRlb19pbmZvX2Zyb21fY2FwcyAoJmluZm8sIGNhcHMpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF92aWRlb19mcmFtZV9tYXAgKCZmcmFtZSwgJmluZm8sIGJ1ZiwgR1NUX01BUF9SRUFEKSk7CisKKyAgZmluZm8gPSBpbmZvLmZpbmZvOworCisgIGlmIChHU1RfVklERU9fSU5GT19JU19ZVVYgKCZpbmZvKSkKKyAgICB2YWx1ZXMgPSB5dXZfdmFsdWVzOworICBlbHNlIGlmIChHU1RfVklERU9fSU5GT19JU19HUkFZICgmaW5mbykpCisgICAgaWYgKEdTVF9WSURFT19GT1JNQVRfSU5GT19CSVRTIChmaW5mbykgPT0gOCkKKyAgICAgIHZhbHVlcyA9IGdyYXk4X3ZhbHVlczsKKyAgICBlbHNlCisgICAgICB2YWx1ZXMgPSBncmF5MTZfdmFsdWVzOworICBlbHNlCisgICAgdmFsdWVzID0gcmdiX3ZhbHVlczsKKworICBHU1RfTUVNRFVNUCAoImJ1ZmZlciIsIEdTVF9WSURFT19GUkFNRV9QTEFORV9EQVRBICgmZnJhbWUsIDApLCA4KTsKKworICBmb3IgKGkgPSAwOyBpIDwgR1NUX1ZJREVPX0ZSQU1FX05fQ09NUE9ORU5UUyAoJmZyYW1lKTsgaSsrKSB7CisgICAgZ3VpbnQ4ICpkYXRhID0gR1NUX1ZJREVPX0ZSQU1FX0NPTVBfREFUQSAoJmZyYW1lLCBpKTsKKworICAgIEdTVF9ERUJVRyAoIlc6ICVkIiwgR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX1dfU1VCIChmaW5mbywgaSkpOworICAgIEdTVF9ERUJVRyAoIkg6ICVkIiwgR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX0hfU1VCIChmaW5mbywgaSkpOworCisgICAgaWYgKEdTVF9WSURFT19GT1JNQVRfSU5GT19XX1NVQiAoZmluZm8sCisgICAgICAgICAgICBpKSA+PSBHU1RfVklERU9fRlJBTUVfV0lEVEggKCZmcmFtZSkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoR1NUX1ZJREVPX0ZPUk1BVF9JTkZPX0hfU1VCIChmaW5mbywKKyAgICAgICAgICAgIGkpID49IEdTVF9WSURFT19GUkFNRV9IRUlHSFQgKCZmcmFtZSkpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChHU1RfVklERU9fRk9STUFUX0lORk9fQklUUyAoZmluZm8pID09IDgpIHsKKyAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGRhdGFbMF0sIHZhbHVlc1tpXSk7CisgICAgfSBlbHNlIGlmIChHU1RfVklERU9fRk9STUFUX0lORk9fQklUUyAoZmluZm8pID09IDE2KSB7CisgICAgICBndWludDE2IHBpeGVscywgdmFsOworICAgICAgZ2ludCBkZXB0aDsKKworICAgICAgaWYgKEdTVF9WSURFT19GT1JNQVRfSU5GT19JU19MRSAoZmluZm8pKQorICAgICAgICBwaXhlbHMgPSBHU1RfUkVBRF9VSU5UMTZfTEUgKGRhdGEpOworICAgICAgZWxzZQorICAgICAgICBwaXhlbHMgPSBHU1RfUkVBRF9VSU5UMTZfQkUgKGRhdGEpOworCisgICAgICBkZXB0aCA9IEdTVF9WSURFT19GT1JNQVRfSU5GT19ERVBUSCAoZmluZm8sIGkpOworICAgICAgdmFsID0gcGl4ZWxzID4+IEdTVF9WSURFT19GT1JNQVRfSU5GT19TSElGVCAoZmluZm8sIGkpOworICAgICAgdmFsID0gdmFsICYgKCgxIDw8IGRlcHRoKSAtIDEpOworCisgICAgICBHU1RfREVCVUcgKCJ2YWwgJTA4eCAlZCA6ICVkIiwgcGl4ZWxzLCBpLCB2YWwpOworICAgICAgaWYgKGRlcHRoIDw9IDgpIHsKKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAodmFsLCB2YWx1ZXNbaV0gPj4gKDggLSBkZXB0aCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAodmFsLCB2YWx1ZXNbaV0gPj4gKDE2IC0gZGVwdGgpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgIH0KKyAgfQorCisgIGdzdF92aWRlb19mcmFtZV91bm1hcCAoJmZyYW1lKTsKKworICAvKgorICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50ICgocGl4ZWwgJiBybWFzaykgPj4gcnNoaWZ0LCAweGZmKTsKKyAgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoKHBpeGVsICYgZ21hc2spID4+IGdzaGlmdCwgMHgwMCk7CisgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKChwaXhlbCAmIGJtYXNrKSA+PiBic2hpZnQsIDB4MDApOworICAgKi8KK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfY3JvcF90b18xeDEpCit7CisgIEdzdFZpZGVvQ3JvcFRlc3RDb250ZXh0IGN0eDsKKyAgR0xpc3QgKmNhcHNfbGlzdCwgKm5vZGU7CisKKyAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmdfaW5pdF9jb250ZXh0ICgmY3R4KTsKKworICBjYXBzX2xpc3QgPSB2aWRlb19jcm9wX2dldF90ZXN0X2NhcHMgKGN0eC5jcm9wKTsKKworICBmb3IgKG5vZGUgPSBjYXBzX2xpc3Q7IG5vZGUgIT0gTlVMTDsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICBHc3RTdHJ1Y3R1cmUgKnM7CisgICAgR3N0Q2FwcyAqY2FwczsKKworICAgIGNhcHMgPSBnc3RfY2Fwc19jb3B5IChHU1RfQ0FQUyAobm9kZS0+ZGF0YSkpOworICAgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgICBmYWlsX3VubGVzcyAocyAhPSBOVUxMKTsKKworICAgIEdTVF9JTkZPICgidGVzdGluZyBmb3JtYXQ6ICUiIEdTVF9QVFJfRk9STUFULCBjYXBzKTsKKworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAid2lkdGgiLCBHX1RZUEVfSU5ULCAxNjAsCisgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCAxNjAsIE5VTEwpOworCisgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGNhcHMsIE5VTEwsIDE1OSwgMCwgMTU5LCAwLAorICAgICAgICBjaGVja18xeDFfYnVmZmVyKTsKKyAgICAvKiBjb21tZW50ZWQgb3V0IGJlY2F1c2UgdGhleSBkb24ndCByZWFsbHkgYWRkIGFueXRoaW5nIHVzZWZ1bCBjaGVjay13aXNlOgorICAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBjYXBzLCBOVUxMLCAwLCAxNTksIDAsIDE1OSwgY2hlY2tfMXgxX2J1ZmZlcik7CisgICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGNhcHMsIE5VTEwsIDE1OSwgMCwgMCwgMTU5LCBjaGVja18xeDFfYnVmZmVyKTsKKyAgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgY2FwcywgTlVMTCwgMCwgMTU5LCAxNTksIDAsIGNoZWNrXzF4MV9idWZmZXIpOworICAgICAqLworICAgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgfQorICBnX2xpc3RfZm9yZWFjaCAoY2Fwc19saXN0LCAoR0Z1bmMpIGdzdF9jYXBzX3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGNhcHNfbGlzdCk7CisKKyAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmdfZGVpbml0X2NvbnRleHQgKCZjdHgpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2Nyb3BwaW5nKQoreworICBHc3RWaWRlb0Nyb3BUZXN0Q29udGV4dCBjdHg7CisgIHN0cnVjdAorICB7CisgICAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICB9IHNpemVzX3RvX3RyeVtdID0geworICAgIHsKKyAgICAxNjAsIDE2MH0sIHsKKyAgICAxNjEsIDE2MH0sIHsKKyAgICAxNjAsIDE2MX0sIHsKKyAgICAxNjEsIDE2MX0sIHsKKyAgICAxNTksIDE2MH0sIHsKKyAgICAxNjAsIDE1OX0sIHsKKyAgICAxNTksIDE1OX0sIHsKKyAgICAxNTksIDE2MX0KKyAgfTsKKyAgR0xpc3QgKmNhcHNfbGlzdCwgKm5vZGU7CisgIGdpbnQgaTsKKworICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZ19pbml0X2NvbnRleHQgKCZjdHgpOworCisgIGNhcHNfbGlzdCA9IHZpZGVvX2Nyb3BfZ2V0X3Rlc3RfY2FwcyAoY3R4LmNyb3ApOworICBub2RlID0gZ19saXN0X250aCAoY2Fwc19saXN0LCBfX2lfXyk7CisKKyAgaWYgKG5vZGUgIT0gTlVMTCkgeworICAgIEdzdFN0cnVjdHVyZSAqczsKKyAgICBHc3RDYXBzICpjYXBzOworCisgICAgY2FwcyA9IGdzdF9jYXBzX2NvcHkgKEdTVF9DQVBTIChub2RlLT5kYXRhKSk7CisgICAgcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICAgIGZhaWxfdW5sZXNzIChzICE9IE5VTEwpOworCisgICAgR1NUX0lORk8gKCJ0ZXN0aW5nIGZvcm1hdDogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgICAgZm9yIChpID0gMDsgaSA8IEdfTl9FTEVNRU5UUyAoc2l6ZXNfdG9fdHJ5KTsgKytpKSB7CisgICAgICBHc3RDYXBzICppbl9jYXBzLCAqb3V0X2NhcHM7CisKKyAgICAgIEdTVF9JTkZPICgiIC0gJWQgeCAlZCIsIHNpemVzX3RvX3RyeVtpXS53aWR0aCwgc2l6ZXNfdG9fdHJ5W2ldLmhlaWdodCk7CisKKyAgICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChzLCAid2lkdGgiLCBHX1RZUEVfSU5ULCBzaXplc190b190cnlbaV0ud2lkdGgsCisgICAgICAgICAgImhlaWdodCIsIEdfVFlQRV9JTlQsIHNpemVzX3RvX3RyeVtpXS5oZWlnaHQsIE5VTEwpOworICAgICAgaW5fY2FwcyA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworCisgICAgICBnc3Rfc3RydWN0dXJlX3NldCAocywgIndpZHRoIiwgR19UWVBFX0lOVCwgMSwgImhlaWdodCIsIEdfVFlQRV9JTlQsIDEsCisgICAgICAgICAgTlVMTCk7CisgICAgICBvdXRfY2FwcyA9IGdzdF9jYXBzX2NvcHkgKGNhcHMpOworCisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2FwcywgTlVMTCwgMCwgMCwgMCwgMCwgTlVMTCk7CisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2FwcywgTlVMTCwgMSwgMCwgMCwgMCwgTlVMTCk7CisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2FwcywgTlVMTCwgMCwgMSwgMCwgMCwgTlVMTCk7CisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2FwcywgTlVMTCwgMCwgMCwgMSwgMCwgTlVMTCk7CisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2FwcywgTlVMTCwgMCwgMCwgMCwgMSwgTlVMTCk7CisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2FwcywgTlVMTCwgNjMsIDAsIDAsIDAsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIE5VTEwsIDAsIDYzLCAwLCAwLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBOVUxMLCAwLCAwLCA2MywgMCwgTlVMTCk7CisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2FwcywgTlVMTCwgMCwgMCwgMCwgNjMsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIE5VTEwsIDYzLCAwLCAwLCAxLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBOVUxMLCAwLCA2MywgMSwgMCwgTlVMTCk7CisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2FwcywgTlVMTCwgMCwgMSwgNjMsIDAsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIE5VTEwsIDEsIDAsIDAsIDYzLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBOVUxMLCAwLCAwLCAwLCAwLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBOVUxMLCAzMiwgMCwgMCwgMTI4LCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBOVUxMLCAwLCAzMiwgMTI4LCAwLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBOVUxMLCAwLCAxMjgsIDMyLCAwLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBOVUxMLCAxMjgsIDAsIDAsIDMyLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBOVUxMLCAxLCAxLCAxLCAxLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBOVUxMLCA2MywgNjMsIDYzLCA2MywgTlVMTCk7CisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2FwcywgTlVMTCwgNjQsIDY0LCA2NCwgNjQsIE5VTEwpOworCisgICAgICAvKiBEeW5hbWljIGNyb3BwaW5nICovCisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2Fwcywgb3V0X2NhcHMsIC0xLCAtMSwgLTEsIC0xLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBvdXRfY2FwcywgMCwgLTEsIC0xLCAtMSwgTlVMTCk7CisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2Fwcywgb3V0X2NhcHMsIC0xLCAwLCAtMSwgLTEsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIG91dF9jYXBzLCAtMSwgLTEsIDAsIC0xLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBvdXRfY2FwcywgLTEsIC0xLCAtMSwgMCwgTlVMTCk7CisgICAgICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZyAoJmN0eCwgaW5fY2Fwcywgb3V0X2NhcHMsIDEwLCAtMSwgMTAsIC0xLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBvdXRfY2FwcywgLTEsIDEwLCAtMSwgMTAsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIG91dF9jYXBzLAorICAgICAgICAgIHNpemVzX3RvX3RyeVtpXS53aWR0aCAtIDEsIC0xLCAtMSwgLTEsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIG91dF9jYXBzLCAtMSwKKyAgICAgICAgICBzaXplc190b190cnlbaV0ud2lkdGggLSAxLCAtMSwgLTEsIE5VTEwpOworICAgICAgdmlkZW9jcm9wX3Rlc3RfY3JvcHBpbmcgKCZjdHgsIGluX2NhcHMsIG91dF9jYXBzLCAtMSwgLTEsCisgICAgICAgICAgc2l6ZXNfdG9fdHJ5W2ldLmhlaWdodCAtIDEsIC0xLCBOVUxMKTsKKyAgICAgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nICgmY3R4LCBpbl9jYXBzLCBvdXRfY2FwcywgLTEsIC0xLCAtMSwKKyAgICAgICAgICBzaXplc190b190cnlbaV0uaGVpZ2h0IC0gMSwgTlVMTCk7CisKKyAgICAgIGdzdF9jYXBzX3VucmVmIChpbl9jYXBzKTsKKyAgICAgIGdzdF9jYXBzX3VucmVmIChvdXRfY2Fwcyk7CisgICAgfQorCisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICB9IGVsc2UgeworICAgIEdTVF9JTkZPICgibm8gY2FwcyAjJWQiLCBfX2lfXyk7CisgIH0KKyAgZ19saXN0X2ZvcmVhY2ggKGNhcHNfbGlzdCwgKEdGdW5jKSBnc3RfY2Fwc191bnJlZiwgTlVMTCk7CisgIGdfbGlzdF9mcmVlIChjYXBzX2xpc3QpOworCisgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nX2RlaW5pdF9jb250ZXh0ICgmY3R4KTsKK30KKworR1NUX0VORF9URVNUOworCisKK3N0YXRpYyBHc3RQYWRQcm9iZVJldHVybgorYnVmZmVyX3Byb2JlX2NiIChHc3RQYWQgKiBwYWQsIEdzdFBhZFByb2JlSW5mbyAqIGluZm8sIGdwb2ludGVyIGRhdGEpCit7CisgIEdzdEJ1ZmZlciAqKnBfYnVmID0gZGF0YTsKKyAgR3N0QnVmZmVyICpidWYgPSBHU1RfUEFEX1BST0JFX0lORk9fQlVGRkVSIChpbmZvKTsKKworICBnc3RfYnVmZmVyX3JlcGxhY2UgKHBfYnVmLCBidWYpOworCisgIHJldHVybiBHU1RfUEFEX1BST0JFX09LOyAgICAgIC8qIGtlZXAgZGF0YSAqLworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9wYXNzdGhyb3VnaCkKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmV0OworICBHc3RWaWRlb0Nyb3BUZXN0Q29udGV4dCBjdHg7CisgIEdzdFBhZCAqc3JjcGFkOworICBHc3RCdWZmZXIgKmdlbl9idWYgPSBOVUxMOyAgICAvKiBidWZmZXIgZ2VuZXJhdGVkIGJ5IHZpZGVvdGVzdHNyYyAqLworCisgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nX2luaXRfY29udGV4dCAoJmN0eCk7CisKKyAgZ19vYmplY3Rfc2V0IChjdHguc3JjLCAibnVtLWJ1ZmZlcnMiLCAxLCBOVUxMKTsKKworICBzcmNwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoY3R4LnNyYywgInNyYyIpOworICBmYWlsX3VubGVzcyAoc3JjcGFkICE9IE5VTEwpOworICBnc3RfcGFkX2FkZF9wcm9iZSAoc3JjcGFkLCBHU1RfUEFEX1BST0JFX1RZUEVfQlVGRkVSLCBidWZmZXJfcHJvYmVfY2IsCisgICAgICAmZ2VuX2J1ZiwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisKKyAgZ19vYmplY3Rfc2V0IChjdHguY3JvcCwgImxlZnQiLCAwLCAicmlnaHQiLCAwLCAidG9wIiwgMCwgImJvdHRvbSIsIDAsIE5VTEwpOworCisgIHN0YXRlX3JldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoY3R4LnBpcGVsaW5lLCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgZmFpbF91bmxlc3MgKHN0YXRlX3JldCAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUsCisgICAgICAiY291bGRuJ3Qgc2V0IHBpcGVsaW5lIHRvIFBBVVNFRCBzdGF0ZSIpOworCisgIHN0YXRlX3JldCA9IGdzdF9lbGVtZW50X2dldF9zdGF0ZSAoY3R4LnBpcGVsaW5lLCBOVUxMLCBOVUxMLCAtMSk7CisgIGZhaWxfdW5sZXNzIChzdGF0ZV9yZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgInBpcGVsaW5lIGZhaWxlZCB0byBnbyB0byBQQVVTRUQgc3RhdGUiKTsKKworICBmYWlsX3VubGVzcyAoZ2VuX2J1ZiAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGN0eC5sYXN0X2J1ZiAhPSBOVUxMKTsKKworICAvKiBwYXNzIHRocm91Z2ggc2hvdWxkIGRvIG5vdGhpbmcgKi8KKyAgZmFpbF91bmxlc3MgKGdlbl9idWYgPT0gY3R4Lmxhc3RfYnVmKTsKKworICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZ19kZWluaXRfY29udGV4dCAoJmN0eCk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX01JTklfT0JKRUNUX1JFRkNPVU5UX1ZBTFVFIChnZW5fYnVmKSwgMSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKGdlbl9idWYpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK3N0YXRpYyBnaW50Citub3Rnc3RfdmFsdWVfbGlzdF9nZXRfbnRoX2ludCAoY29uc3QgR1ZhbHVlICogbGlzdF92YWwsIGd1aW50IG4pCit7CisgIGNvbnN0IEdWYWx1ZSAqdjsKKworICBmYWlsX3VubGVzcyAoR1NUX1ZBTFVFX0hPTERTX0xJU1QgKGxpc3RfdmFsKSk7CisgIGZhaWxfdW5sZXNzIChuIDwgZ3N0X3ZhbHVlX2xpc3RfZ2V0X3NpemUgKGxpc3RfdmFsKSk7CisKKyAgdiA9IGdzdF92YWx1ZV9saXN0X2dldF92YWx1ZSAobGlzdF92YWwsIG4pOworICBmYWlsX3VubGVzcyAoR19WQUxVRV9IT0xEU19JTlQgKHYpKTsKKyAgcmV0dXJuIGdfdmFsdWVfZ2V0X2ludCAodik7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2NhcHNfdHJhbnNmb3JtKQoreworICBHc3RWaWRlb0Nyb3BUZXN0Q29udGV4dCBjdHg7CisgIEdzdEJhc2VUcmFuc2Zvcm1DbGFzcyAqa2xhc3M7CisgIEdzdEJhc2VUcmFuc2Zvcm0gKmNyb3A7CisgIGNvbnN0IEdWYWx1ZSAqd192YWw7CisgIGNvbnN0IEdWYWx1ZSAqaF92YWw7CisgIEdzdENhcHMgKmNhcHMsICphZGpfY2FwczsKKworICB2aWRlb2Nyb3BfdGVzdF9jcm9wcGluZ19pbml0X2NvbnRleHQgKCZjdHgpOworCisgIGNyb3AgPSBHU1RfQkFTRV9UUkFOU0ZPUk0gKGN0eC5jcm9wKTsKKyAga2xhc3MgPSBHU1RfQkFTRV9UUkFOU0ZPUk1fR0VUX0NMQVNTIChjdHguY3JvcCk7CisgIGZhaWxfdW5sZXNzIChrbGFzcyAhPSBOVUxMKTsKKworICBjYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcmF3IiwKKyAgICAgICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiSTQyMCIsCisgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sIDEsIDEsCisgICAgICAid2lkdGgiLCBHX1RZUEVfSU5ULCAyMDAsICJoZWlnaHQiLCBHX1RZUEVfSU5ULCAxMDAsIE5VTEwpOworCisgIC8qIGJ5IGRlZmF1bHQsIGl0IHNob3VsZCBiZSBubyBjcm9wcGluZyBhbmQgaGVuY2UgcGFzc3Rocm91Z2ggKi8KKyAgYWRqX2NhcHMgPSBrbGFzcy0+dHJhbnNmb3JtX2NhcHMgKGNyb3AsIEdTVF9QQURfU1JDLCBjYXBzLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGFkal9jYXBzICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfaXNfZXF1YWwgKGFkal9jYXBzLCBjYXBzKSk7CisgIGdzdF9jYXBzX3VucmVmIChhZGpfY2Fwcyk7CisKKyAgYWRqX2NhcHMgPSBrbGFzcy0+dHJhbnNmb3JtX2NhcHMgKGNyb3AsIEdTVF9QQURfU0lOSywgY2FwcywgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChhZGpfY2FwcyAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2lzX2VxdWFsIChhZGpfY2FwcywgY2FwcykpOworICBnc3RfY2Fwc191bnJlZiAoYWRqX2NhcHMpOworCisgIC8qIG1ha2Ugc3VyZSB0aGF0J3Mgc3RpbGwgdHJ1ZSBhZnRlciBjaGFuZ2luZyBwcm9wZXJ0aWVzIGJhY2sgYW5kIGZvcnRoICovCisgIGdfb2JqZWN0X3NldCAoY3R4LmNyb3AsICJsZWZ0IiwgMSwgInJpZ2h0IiwgMywgInRvcCIsIDUsICJib3R0b20iLCA3LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChjdHguY3JvcCwgImxlZnQiLCAwLCAicmlnaHQiLCAwLCAidG9wIiwgMCwgImJvdHRvbSIsIDAsIE5VTEwpOworCisgIGFkal9jYXBzID0ga2xhc3MtPnRyYW5zZm9ybV9jYXBzIChjcm9wLCBHU1RfUEFEX1NSQywgY2FwcywgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChhZGpfY2FwcyAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2lzX2VxdWFsIChhZGpfY2FwcywgY2FwcykpOworICBnc3RfY2Fwc191bnJlZiAoYWRqX2NhcHMpOworCisgIGFkal9jYXBzID0ga2xhc3MtPnRyYW5zZm9ybV9jYXBzIChjcm9wLCBHU1RfUEFEX1NJTkssIGNhcHMsIE5VTEwpOworICBmYWlsX3VubGVzcyAoYWRqX2NhcHMgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19pc19lcXVhbCAoYWRqX2NhcHMsIGNhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGFkal9jYXBzKTsKKworICAvKiBub3cgY2hlY2sgYWRqdXN0bWVudHMgbWFkZSAuLi4gKi8KKyAgZ19vYmplY3Rfc2V0IChjdHguY3JvcCwgImxlZnQiLCAxLCAicmlnaHQiLCAzLCAidG9wIiwgNSwgImJvdHRvbSIsIDcsIE5VTEwpOworCisgIC8qID09PT09PT09PSAoMSkgZml4ZWQgdmFsdWUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgLyogc2luayA9PiBzb3VyY2UsIHNvdXJjZSBtdXN0IGJlIGJpZ2dlciBpZiB3ZSBjcm9wIHN0dWZmIG9mZiAqLworICBhZGpfY2FwcyA9IGtsYXNzLT50cmFuc2Zvcm1fY2FwcyAoY3JvcCwgR1NUX1BBRF9TUkMsIGNhcHMsIE5VTEwpOworICBmYWlsX3VubGVzcyAoYWRqX2NhcHMgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19nZXRfc2l6ZSAoYWRqX2NhcHMpID09IDEpOworICB3X3ZhbCA9CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoYWRqX2NhcHMsIDApLCAid2lkdGgiKTsKKyAgZmFpbF91bmxlc3MgKHdfdmFsICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoR19WQUxVRV9IT0xEU19JTlQgKHdfdmFsKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfdmFsdWVfZ2V0X2ludCAod192YWwpLCAyMDAgKyAoMSArIDMpKTsKKyAgaF92YWwgPQorICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFkal9jYXBzLCAwKSwgImhlaWdodCIpOworICBmYWlsX3VubGVzcyAoaF92YWwgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChHX1ZBTFVFX0hPTERTX0lOVCAoaF92YWwpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ192YWx1ZV9nZXRfaW50IChoX3ZhbCksIDEwMCArICg1ICsgNykpOworICBnc3RfY2Fwc191bnJlZiAoYWRqX2NhcHMpOworCisgIC8qIHNvdXJjZSA9PiBzaW5rIGJlY29tZXMgc21hbGxlciAqLworICBhZGpfY2FwcyA9IGtsYXNzLT50cmFuc2Zvcm1fY2FwcyAoY3JvcCwgR1NUX1BBRF9TSU5LLCBjYXBzLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGFkal9jYXBzICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfZ2V0X3NpemUgKGFkal9jYXBzKSA9PSAxKTsKKyAgd192YWwgPQorICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFkal9jYXBzLCAwKSwgIndpZHRoIik7CisgIGZhaWxfdW5sZXNzICh3X3ZhbCAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKEdfVkFMVUVfSE9MRFNfSU5UICh3X3ZhbCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX3ZhbHVlX2dldF9pbnQgKHdfdmFsKSwgMjAwIC0gKDEgKyAzKSk7CisgIGhfdmFsID0KKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhZGpfY2FwcywgMCksICJoZWlnaHQiKTsKKyAgZmFpbF91bmxlc3MgKGhfdmFsICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoR19WQUxVRV9IT0xEU19JTlQgKGhfdmFsKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdfdmFsdWVfZ2V0X2ludCAoaF92YWwpLCAxMDAgLSAoNSArIDcpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGFkal9jYXBzKTsKKworICAvKiA9PT09PT09PT0gKDIpIHJhbmdlIChzaW1wbGUgYWRqdXN0bWVudCkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIGdzdF9zdHJ1Y3R1cmVfc2V0IChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKSwKKyAgICAgICJ3aWR0aCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMTAwMCwgMjAwMCwKKyAgICAgICJoZWlnaHQiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDMwMDAsIDQwMDAsIE5VTEwpOworCisgIC8qIHNpbmsgPT4gc291cmNlLCBzb3VyY2UgbXVzdCBiZSBiaWdnZXIgaWYgd2UgY3JvcCBzdHVmZiBvZmYgKi8KKyAgYWRqX2NhcHMgPSBrbGFzcy0+dHJhbnNmb3JtX2NhcHMgKGNyb3AsIEdTVF9QQURfU1JDLCBjYXBzLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGFkal9jYXBzICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfZ2V0X3NpemUgKGFkal9jYXBzKSA9PSAxKTsKKyAgd192YWwgPQorICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFkal9jYXBzLCAwKSwgIndpZHRoIik7CisgIGZhaWxfdW5sZXNzICh3X3ZhbCAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9WQUxVRV9IT0xEU19JTlRfUkFOR0UgKHdfdmFsKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF92YWx1ZV9nZXRfaW50X3JhbmdlX21pbiAod192YWwpLCAxMDAwICsgKDEgKyAzKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF92YWx1ZV9nZXRfaW50X3JhbmdlX21heCAod192YWwpLCAyMDAwICsgKDEgKyAzKSk7CisgIGhfdmFsID0KKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhZGpfY2FwcywgMCksICJoZWlnaHQiKTsKKyAgZmFpbF91bmxlc3MgKGhfdmFsICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoR1NUX1ZBTFVFX0hPTERTX0lOVF9SQU5HRSAoaF92YWwpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3ZhbHVlX2dldF9pbnRfcmFuZ2VfbWluIChoX3ZhbCksIDMwMDAgKyAoNSArIDcpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3ZhbHVlX2dldF9pbnRfcmFuZ2VfbWF4IChoX3ZhbCksIDQwMDAgKyAoNSArIDcpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGFkal9jYXBzKTsKKworICAvKiBzb3VyY2UgPT4gc2luayBiZWNvbWVzIHNtYWxsZXIgKi8KKyAgYWRqX2NhcHMgPSBrbGFzcy0+dHJhbnNmb3JtX2NhcHMgKGNyb3AsIEdTVF9QQURfU0lOSywgY2FwcywgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChhZGpfY2FwcyAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2dldF9zaXplIChhZGpfY2FwcykgPT0gMSk7CisgIHdfdmFsID0KKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhZGpfY2FwcywgMCksICJ3aWR0aCIpOworICBmYWlsX3VubGVzcyAod192YWwgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChHU1RfVkFMVUVfSE9MRFNfSU5UX1JBTkdFICh3X3ZhbCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfdmFsdWVfZ2V0X2ludF9yYW5nZV9taW4gKHdfdmFsKSwgMTAwMCAtICgxICsgMykpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfdmFsdWVfZ2V0X2ludF9yYW5nZV9tYXggKHdfdmFsKSwgMjAwMCAtICgxICsgMykpOworICBoX3ZhbCA9CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoYWRqX2NhcHMsIDApLCAiaGVpZ2h0Iik7CisgIGZhaWxfdW5sZXNzIChoX3ZhbCAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9WQUxVRV9IT0xEU19JTlRfUkFOR0UgKGhfdmFsKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF92YWx1ZV9nZXRfaW50X3JhbmdlX21pbiAoaF92YWwpLCAzMDAwIC0gKDUgKyA3KSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF92YWx1ZV9nZXRfaW50X3JhbmdlX21heCAoaF92YWwpLCA0MDAwIC0gKDUgKyA3KSk7CisgIGdzdF9jYXBzX3VucmVmIChhZGpfY2Fwcyk7CisKKyAgLyogPT09PT09PT09ICgzKSByYW5nZSAoYWRqdXN0bWVudCBhdCBib3VuZGFyeSkgPT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICBnc3Rfc3RydWN0dXJlX3NldCAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCksCisgICAgICAid2lkdGgiLCBHU1RfVFlQRV9JTlRfUkFOR0UsIDIsIEdfTUFYSU5ULAorICAgICAgImhlaWdodCIsIEdTVF9UWVBFX0lOVF9SQU5HRSwgMiwgR19NQVhJTlQsIE5VTEwpOworCisgIC8qIHNpbmsgPT4gc291cmNlLCBzb3VyY2UgbXVzdCBiZSBiaWdnZXIgaWYgd2UgY3JvcCBzdHVmZiBvZmYgKi8KKyAgYWRqX2NhcHMgPSBrbGFzcy0+dHJhbnNmb3JtX2NhcHMgKGNyb3AsIEdTVF9QQURfU1JDLCBjYXBzLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGFkal9jYXBzICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoZ3N0X2NhcHNfZ2V0X3NpemUgKGFkal9jYXBzKSA9PSAxKTsKKyAgd192YWwgPQorICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFkal9jYXBzLCAwKSwgIndpZHRoIik7CisgIGZhaWxfdW5sZXNzICh3X3ZhbCAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9WQUxVRV9IT0xEU19JTlRfUkFOR0UgKHdfdmFsKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF92YWx1ZV9nZXRfaW50X3JhbmdlX21pbiAod192YWwpLCAyICsgKDEgKyAzKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF92YWx1ZV9nZXRfaW50X3JhbmdlX21heCAod192YWwpLCBHX01BWElOVCk7CisgIGhfdmFsID0KKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhZGpfY2FwcywgMCksICJoZWlnaHQiKTsKKyAgZmFpbF91bmxlc3MgKGhfdmFsICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoR1NUX1ZBTFVFX0hPTERTX0lOVF9SQU5HRSAoaF92YWwpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3ZhbHVlX2dldF9pbnRfcmFuZ2VfbWluIChoX3ZhbCksIDIgKyAoNSArIDcpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3ZhbHVlX2dldF9pbnRfcmFuZ2VfbWF4IChoX3ZhbCksIEdfTUFYSU5UKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGFkal9jYXBzKTsKKworICAvKiBzb3VyY2UgPT4gc2luayBiZWNvbWVzIHNtYWxsZXIgKi8KKyAgYWRqX2NhcHMgPSBrbGFzcy0+dHJhbnNmb3JtX2NhcHMgKGNyb3AsIEdTVF9QQURfU0lOSywgY2FwcywgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChhZGpfY2FwcyAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2dldF9zaXplIChhZGpfY2FwcykgPT0gMSk7CisgIHdfdmFsID0KKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhZGpfY2FwcywgMCksICJ3aWR0aCIpOworICBmYWlsX3VubGVzcyAod192YWwgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChHU1RfVkFMVUVfSE9MRFNfSU5UX1JBTkdFICh3X3ZhbCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfdmFsdWVfZ2V0X2ludF9yYW5nZV9taW4gKHdfdmFsKSwgMSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF92YWx1ZV9nZXRfaW50X3JhbmdlX21heCAod192YWwpLAorICAgICAgR19NQVhJTlQgLSAoMSArIDMpKTsKKyAgaF92YWwgPQorICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFkal9jYXBzLCAwKSwgImhlaWdodCIpOworICBmYWlsX3VubGVzcyAoaF92YWwgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChHU1RfVkFMVUVfSE9MRFNfSU5UX1JBTkdFIChoX3ZhbCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfdmFsdWVfZ2V0X2ludF9yYW5nZV9taW4gKGhfdmFsKSwgMSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF92YWx1ZV9nZXRfaW50X3JhbmdlX21heCAoaF92YWwpLAorICAgICAgR19NQVhJTlQgLSAoNSArIDcpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGFkal9jYXBzKTsKKworICAvKiA9PT09PT09PT0gKDQpIGxpc3Qgb2YgdmFsdWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgIHsKKyAgICBHVmFsdWUgbGlzdCA9IHsgMCwgfTsKKyAgICBHVmFsdWUgaXZhbCA9IHsgMCwgfTsKKworICAgIGdfdmFsdWVfaW5pdCAoJml2YWwsIEdfVFlQRV9JTlQpOworICAgIGdfdmFsdWVfaW5pdCAoJmxpc3QsIEdTVF9UWVBFX0xJU1QpOworICAgIGdfdmFsdWVfc2V0X2ludCAoJml2YWwsIDIpOworICAgIGdzdF92YWx1ZV9saXN0X2FwcGVuZF92YWx1ZSAoJmxpc3QsICZpdmFsKTsKKyAgICBnX3ZhbHVlX3NldF9pbnQgKCZpdmFsLCBHX01BWElOVCk7CisgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJml2YWwpOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKSwgIndpZHRoIiwgJmxpc3QpOworICAgIGdfdmFsdWVfdW5zZXQgKCZsaXN0KTsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmaXZhbCk7CisKKyAgICBnX3ZhbHVlX2luaXQgKCZpdmFsLCBHX1RZUEVfSU5UKTsKKyAgICBnX3ZhbHVlX2luaXQgKCZsaXN0LCBHU1RfVFlQRV9MSVNUKTsKKyAgICBnX3ZhbHVlX3NldF9pbnQgKCZpdmFsLCA1KTsKKyAgICBnc3RfdmFsdWVfbGlzdF9hcHBlbmRfdmFsdWUgKCZsaXN0LCAmaXZhbCk7CisgICAgZ192YWx1ZV9zZXRfaW50ICgmaXZhbCwgMTAwMCk7CisgICAgZ3N0X3ZhbHVlX2xpc3RfYXBwZW5kX3ZhbHVlICgmbGlzdCwgJml2YWwpOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0X3ZhbHVlIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKSwgImhlaWdodCIsICZsaXN0KTsKKyAgICBnX3ZhbHVlX3Vuc2V0ICgmbGlzdCk7CisgICAgZ192YWx1ZV91bnNldCAoJml2YWwpOworICB9CisKKyAgLyogc2luayA9PiBzb3VyY2UsIHNvdXJjZSBtdXN0IGJlIGJpZ2dlciBpZiB3ZSBjcm9wIHN0dWZmIG9mZiAqLworICBhZGpfY2FwcyA9IGtsYXNzLT50cmFuc2Zvcm1fY2FwcyAoY3JvcCwgR1NUX1BBRF9TUkMsIGNhcHMsIE5VTEwpOworICBmYWlsX3VubGVzcyAoYWRqX2NhcHMgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChnc3RfY2Fwc19nZXRfc2l6ZSAoYWRqX2NhcHMpID09IDEpOworICB3X3ZhbCA9CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoYWRqX2NhcHMsIDApLCAid2lkdGgiKTsKKyAgZmFpbF91bmxlc3MgKHdfdmFsICE9IE5VTEwpOworICBmYWlsX3VubGVzcyAoR1NUX1ZBTFVFX0hPTERTX0xJU1QgKHdfdmFsKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG5vdGdzdF92YWx1ZV9saXN0X2dldF9udGhfaW50ICh3X3ZhbCwgMCksCisgICAgICAyICsgKDEgKyAzKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG5vdGdzdF92YWx1ZV9saXN0X2dldF9udGhfaW50ICh3X3ZhbCwgMSksIEdfTUFYSU5UKTsKKyAgaF92YWwgPQorICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFkal9jYXBzLCAwKSwgImhlaWdodCIpOworICBmYWlsX3VubGVzcyAoaF92YWwgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChHU1RfVkFMVUVfSE9MRFNfTElTVCAoaF92YWwpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobm90Z3N0X3ZhbHVlX2xpc3RfZ2V0X250aF9pbnQgKGhfdmFsLCAwKSwKKyAgICAgIDUgKyAoNSArIDcpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobm90Z3N0X3ZhbHVlX2xpc3RfZ2V0X250aF9pbnQgKGhfdmFsLCAxKSwKKyAgICAgIDEwMDAgKyAoNSArIDcpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGFkal9jYXBzKTsKKworICAvKiBzb3VyY2UgPT4gc2luayBiZWNvbWVzIHNtYWxsZXIgKi8KKyAgYWRqX2NhcHMgPSBrbGFzcy0+dHJhbnNmb3JtX2NhcHMgKGNyb3AsIEdTVF9QQURfU0lOSywgY2FwcywgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChhZGpfY2FwcyAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9jYXBzX2dldF9zaXplIChhZGpfY2FwcykgPT0gMSk7CisgIHdfdmFsID0KKyAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChhZGpfY2FwcywgMCksICJ3aWR0aCIpOworICBmYWlsX3VubGVzcyAod192YWwgIT0gTlVMTCk7CisgIGZhaWxfdW5sZXNzIChHU1RfVkFMVUVfSE9MRFNfTElTVCAod192YWwpKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobm90Z3N0X3ZhbHVlX2xpc3RfZ2V0X250aF9pbnQgKHdfdmFsLCAwKSwgMSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG5vdGdzdF92YWx1ZV9saXN0X2dldF9udGhfaW50ICh3X3ZhbCwgMSksCisgICAgICBHX01BWElOVCAtICgxICsgMykpOworICBoX3ZhbCA9CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAoZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoYWRqX2NhcHMsIDApLCAiaGVpZ2h0Iik7CisgIGZhaWxfdW5sZXNzIChoX3ZhbCAhPSBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9WQUxVRV9IT0xEU19MSVNUIChoX3ZhbCkpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChub3Rnc3RfdmFsdWVfbGlzdF9nZXRfbnRoX2ludCAoaF92YWwsIDApLCAxKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobm90Z3N0X3ZhbHVlX2xpc3RfZ2V0X250aF9pbnQgKGhfdmFsLCAxKSwKKyAgICAgIDEwMDAgLSAoNSArIDcpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGFkal9jYXBzKTsKKworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIHZpZGVvY3JvcF90ZXN0X2Nyb3BwaW5nX2RlaW5pdF9jb250ZXh0ICgmY3R4KTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgordmlkZW9jcm9wX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInZpZGVvY3JvcCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyNpZmRlZiBIQVZFX1ZBTEdSSU5ECisgIGlmIChSVU5OSU5HX09OX1ZBTEdSSU5EKSB7CisgICAgLyogb3VyIHRlc3RzIHRha2UgcXVpdGUgYSBsb25nIHRpbWUsIHNvIGluY3JlYXNlCisgICAgICogdGltZW91dCAofjI1IG1pbnV0ZXMgb24gbXkgMS42R0h6IEFNRCBLNykgKi8KKyAgICB0Y2FzZV9zZXRfdGltZW91dCAodGNfY2hhaW4sIDMwICogNjApOworICB9IGVsc2UKKyNlbmRpZgorICB7CisgICAgLyogaW5jcmVhc2UgdGltZW91dCwgdGhlc2UgdGVzdHMgdGFrZSBhIGxvbmcgdGltZSAoNjAgc2VjcyBoZXJlKSAqLworICAgIHRjYXNlX3NldF90aW1lb3V0ICh0Y19jaGFpbiwgMiAqIDYwKTsKKyAgfQorCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfY3JvcF90b18xeDEpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfY2Fwc190cmFuc2Zvcm0pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFzc3Rocm91Z2gpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdW5pdF9zaXplcyk7CisgIHRjYXNlX2FkZF9sb29wX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2Nyb3BwaW5nLCAwLCAyNSk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOICh2aWRlb2Nyb3ApOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvdmlkZW9maWx0ZXIuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NjMDJmNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvZmlsdGVyLmMKQEAgLTAsMCArMSwyNjYgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIHVuaXQgdGVzdCBmb3IgdmlkZW9maWx0ZXIgZWxlbWVudHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCitnYm9vbGVhbiBoYXZlX2VvcyA9IEZBTFNFOworCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCisjZGVmaW5lIFZJREVPX0NBUFNfVEVNUExBVEVfU1RSSU5HIFwKKyAgR1NUX1ZJREVPX0NBUFNfTUFLRSAoInsgSTQyMCwgQVlVViwgWVVZMiwgVVlWWSwgWVZZVSwgeFJHQiB9IikKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoVklERU9fQ0FQU19URU1QTEFURV9TVFJJTkcpCisgICAgKTsKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFZJREVPX0NBUFNfVEVNUExBVEVfU1RSSU5HKQorICAgICk7CisKKy8qIHRha2VzIG92ZXIgcmVmZXJlbmNlIGZvciBvdXRjYXBzICovCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF9maWx0ZXIgKGNvbnN0IGdjaGFyICogbmFtZSwgY29uc3QgZ2NoYXIgKiBwcm9wLCB2YV9saXN0IHZhcl9hcmdzKQoreworICBHc3RFbGVtZW50ICplbGVtZW50OworCisgIEdTVF9ERUJVRyAoInNldHVwX2VsZW1lbnQiKTsKKyAgZWxlbWVudCA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50IChuYW1lKTsKKyAgZ19vYmplY3Rfc2V0X3ZhbGlzdCAoR19PQkpFQ1QgKGVsZW1lbnQpLCBwcm9wLCB2YXJfYXJncyk7CisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKGVsZW1lbnQsICZzcmN0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKGVsZW1lbnQsICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgcmV0dXJuIGVsZW1lbnQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX2ZpbHRlciAoR3N0RWxlbWVudCAqIGZpbHRlcikKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF9lbGVtZW50Iik7CisKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKGZpbHRlcik7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoZmlsdGVyKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKGZpbHRlcik7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19maWx0ZXJfY2FwcyAoY29uc3QgZ2NoYXIgKiBuYW1lLCBHc3RFdmVudCAqIGV2ZW50LCBHc3RDYXBzICogY2FwcywKKyAgICBnaW50IHNpemUsIGdpbnQgbnVtX2J1ZmZlcnMsIGNvbnN0IGdjaGFyICogcHJvcCwgdmFfbGlzdCB2YXJhcmdzKQoreworICBHc3RFbGVtZW50ICpmaWx0ZXI7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXIsICpvdXRidWZmZXI7CisgIGdpbnQgaTsKKyAgR3N0U2VnbWVudCBzZWdtZW50OworCisgIGZpbHRlciA9IHNldHVwX2ZpbHRlciAobmFtZSwgcHJvcCwgdmFyYXJncyk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGZpbHRlciwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTLAorICAgICAgImNvdWxkIG5vdCBzZXQgdG8gcGxheWluZyIpOworCisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKG15c3JjcGFkLCBmaWx0ZXIsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisKKyAgLyogZW5zdXJlIHNlZ21lbnQgKGZvcm1hdCkgcHJvcGVybHkgc2V0dXAgKi8KKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZ21lbnQsIEdTVF9GT1JNQVRfVElNRSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWdtZW50KSkpOworCisgIGlmIChldmVudCkKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZXZlbnQpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2J1ZmZlcnM7ICsraSkgeworICAgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplKTsKKyAgICAvKiBtYWtlcyB2YWxncmluZCdzIG1lbWNoZWNrIGhhcHBpZXIgKi8KKyAgICBnc3RfYnVmZmVyX21lbXNldCAoaW5idWZmZXIsIDAsIDAsIHNpemUpOworICAgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICAgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpID09IEdTVF9GTE9XX09LKTsKKyAgfQorCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA9PSBudW1fYnVmZmVycyk7CisKKyAgLyogY2xlYW4gdXAgYnVmZmVycyAqLworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2J1ZmZlcnM7ICsraSkgeworICAgIG91dGJ1ZmZlciA9IEdTVF9CVUZGRVIgKGJ1ZmZlcnMtPmRhdGEpOworICAgIGZhaWxfaWYgKG91dGJ1ZmZlciA9PSBOVUxMKTsKKworICAgIHN3aXRjaCAoaSkgeworICAgICAgY2FzZSAwOgorICAgICAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAob3V0YnVmZmVyKSA9PSBzaXplKTsKKyAgICAgICAgLyogbm8gY2hlY2sgb24gZmlsdGVyIG9wZXJhdGlvbiBpdHNlbGYgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgYnVmZmVycyA9IGdfbGlzdF9yZW1vdmUgKGJ1ZmZlcnMsIG91dGJ1ZmZlcik7CisKKyAgICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChvdXRidWZmZXIsICJvdXRidWZmZXIiLCAxKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworICAgIG91dGJ1ZmZlciA9IE5VTEw7CisgIH0KKworICBjbGVhbnVwX2ZpbHRlciAoZmlsdGVyKTsKKyAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICBidWZmZXJzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2ZpbHRlcl92YXJhcmdzIChjb25zdCBnY2hhciAqIG5hbWUsIEdzdEV2ZW50ICogZXZlbnQsIGdpbnQgbnVtX2J1ZmZlcnMsCisgICAgY29uc3QgZ2NoYXIgKiBwcm9wLCB2YV9saXN0IHZhcmFyZ3MpCit7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QKKyAgeworICAgIGNvbnN0IGludCB3aWR0aCwgaGVpZ2h0OworICB9IHJlc29sdXRpb25zW10gPSB7IHsKKyAgMzg0LCAyODh9LCB7CisgIDM4NSwgMjg5fSwgeworICAzODUsIDM4NX19OworICBnaW50IGksIG4sIHI7CisgIGdpbnQgc2l6ZTsKKyAgR3N0Q2FwcyAqYWxsY2FwcywgKnRlbXBsID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKFZJREVPX0NBUFNfVEVNUExBVEVfU1RSSU5HKTsKKworICBhbGxjYXBzID0gZ3N0X2NhcHNfbm9ybWFsaXplICh0ZW1wbCk7CisKKyAgbiA9IGdzdF9jYXBzX2dldF9zaXplIChhbGxjYXBzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgR3N0U3RydWN0dXJlICpzID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoYWxsY2FwcywgaSk7CisgICAgR3N0Q2FwcyAqY2FwcyA9IGdzdF9jYXBzX25ld19lbXB0eSAoKTsKKworICAgIGdzdF9jYXBzX2FwcGVuZF9zdHJ1Y3R1cmUgKGNhcHMsIGdzdF9zdHJ1Y3R1cmVfY29weSAocykpOworCisgICAgLyogdHJ5IHZhcmlvdXMgcmVzb2x1dGlvbnMgKi8KKyAgICBmb3IgKHIgPSAwOyByIDwgR19OX0VMRU1FTlRTIChyZXNvbHV0aW9ucyk7ICsrcikgeworICAgICAgR3N0VmlkZW9JbmZvIGluZm87CisgICAgICB2YV9saXN0IGFyZ3NfY3A7CisKKyAgICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKyAgICAgIGdzdF9jYXBzX3NldF9zaW1wbGUgKGNhcHMsICJ3aWR0aCIsIEdfVFlQRV9JTlQsIHJlc29sdXRpb25zW3JdLndpZHRoLAorICAgICAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCByZXNvbHV0aW9uc1tyXS5oZWlnaHQsCisgICAgICAgICAgImZyYW1lcmF0ZSIsIEdTVF9UWVBFX0ZSQUNUSU9OLCAyNSwgMSwgTlVMTCk7CisKKyAgICAgIEdTVF9ERUJVRyAoIlRlc3Rpbmcgd2l0aCBjYXBzOiAlIiBHU1RfUFRSX0ZPUk1BVCwgY2Fwcyk7CisgICAgICBnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMgKCZpbmZvLCBjYXBzKTsKKyAgICAgIHNpemUgPSBHU1RfVklERU9fSU5GT19TSVpFICgmaW5mbyk7CisKKyAgICAgIGlmIChldmVudCkKKyAgICAgICAgZ3N0X2V2ZW50X3JlZiAoZXZlbnQpOworCisgICAgICB2YV9jb3B5IChhcmdzX2NwLCB2YXJhcmdzKTsKKyAgICAgIGNoZWNrX2ZpbHRlcl9jYXBzIChuYW1lLCBldmVudCwgY2Fwcywgc2l6ZSwgbnVtX2J1ZmZlcnMsIHByb3AsIGFyZ3NfY3ApOworICAgICAgdmFfZW5kIChhcmdzX2NwKTsKKyAgICB9CisKKyAgICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIH0KKworICBnc3RfY2Fwc191bnJlZiAoYWxsY2Fwcyk7CisgIGlmIChldmVudCkKKyAgICBnc3RfZXZlbnRfdW5yZWYgKGV2ZW50KTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2ZpbHRlciAoY29uc3QgZ2NoYXIgKiBuYW1lLCBnaW50IG51bV9idWZmZXJzLCBjb25zdCBnY2hhciAqIHByb3AsIC4uLikKK3sKKyAgdmFfbGlzdCB2YXJhcmdzOworICB2YV9zdGFydCAodmFyYXJncywgcHJvcCk7CisgIGNoZWNrX2ZpbHRlcl92YXJhcmdzIChuYW1lLCBOVUxMLCBudW1fYnVmZmVycywgcHJvcCwgdmFyYXJncyk7CisgIHZhX2VuZCAodmFyYXJncyk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19maWx0ZXJfd2l0aF9ldmVudCAoY29uc3QgZ2NoYXIgKiBuYW1lLCBHc3RFdmVudCAqIGV2ZW50LAorICAgIGdpbnQgbnVtX2J1ZmZlcnMsIGNvbnN0IGdjaGFyICogcHJvcCwgLi4uKQoreworICB2YV9saXN0IHZhcmFyZ3M7CisgIHZhX3N0YXJ0ICh2YXJhcmdzLCBwcm9wKTsKKyAgY2hlY2tfZmlsdGVyX3ZhcmFyZ3MgKG5hbWUsIGV2ZW50LCBudW1fYnVmZmVycywgcHJvcCwgdmFyYXJncyk7CisgIHZhX2VuZCAodmFyYXJncyk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3ZpZGVvYmFsYW5jZSkKK3sKKyAgY2hlY2tfZmlsdGVyICgidmlkZW9iYWxhbmNlIiwgMiwgTlVMTCk7CisgIGNoZWNrX2ZpbHRlciAoInZpZGVvYmFsYW5jZSIsIDIsICJzYXR1cmF0aW9uIiwgMC41LCAiaHVlIiwgMC44LCBOVUxMKTsKK30KKworR1NUX0VORF9URVNUOworCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3ZpZGVvZmxpcCkKK3sKKyAgR3N0RXZlbnQgKmV2ZW50OworCisgIC8qIHRoZXNlIHdlIGNhbiBoYW5kbGUgd2l0aCB0aGUgY2FwcyAqLworICBjaGVja19maWx0ZXIgKCJ2aWRlb2ZsaXAiLCAyLCAibWV0aG9kIiwgMCwgTlVMTCk7CisgIGNoZWNrX2ZpbHRlciAoInZpZGVvZmxpcCIsIDIsICJtZXRob2QiLCAyLCBOVUxMKTsKKyAgY2hlY2tfZmlsdGVyICgidmlkZW9mbGlwIiwgMiwgIm1ldGhvZCIsIDQsIE5VTEwpOworICBjaGVja19maWx0ZXIgKCJ2aWRlb2ZsaXAiLCAyLCAibWV0aG9kIiwgNSwgTlVMTCk7CisKKyAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3RhZyAoZ3N0X3RhZ19saXN0X25ld19lbXB0eSAoKSk7CisgIGNoZWNrX2ZpbHRlcl93aXRoX2V2ZW50ICgidmlkZW9mbGlwIiwgZXZlbnQsIDIsICJtZXRob2QiLCA4LCBOVUxMKTsKKworICBldmVudCA9IGdzdF9ldmVudF9uZXdfdGFnIChnc3RfdGFnX2xpc3RfbmV3IChHU1RfVEFHX0lNQUdFX09SSUVOVEFUSU9OLAorICAgICAgICAgICJyb3RhdGUtMTgwIiwgTlVMTCkpOworICBjaGVja19maWx0ZXJfd2l0aF9ldmVudCAoInZpZGVvZmxpcCIsIGV2ZW50LCAyLCAibWV0aG9kIiwgOCwgTlVMTCk7CisKKyAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3RhZyAoZ3N0X3RhZ19saXN0X25ldyAoR1NUX1RBR19JTUFHRV9PUklFTlRBVElPTiwKKyAgICAgICAgICAiaW52YWxpZCIsIE5VTEwpKTsKKyAgY2hlY2tfZmlsdGVyX3dpdGhfZXZlbnQgKCJ2aWRlb2ZsaXAiLCBldmVudCwgMiwgIm1ldGhvZCIsIDgsIE5VTEwpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2dhbW1hKQoreworICBjaGVja19maWx0ZXIgKCJnYW1tYSIsIDIsIE5VTEwpOworICBjaGVja19maWx0ZXIgKCJnYW1tYSIsIDIsICJnYW1tYSIsIDIuMCwgTlVMTCk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitzdGF0aWMgU3VpdGUgKgordmlkZW9maWx0ZXJfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgidmlkZW9maWx0ZXIiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdmlkZW9iYWxhbmNlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3ZpZGVvZmxpcCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nYW1tYSk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOICh2aWRlb2ZpbHRlcik7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb21peGVyLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy92aWRlb21peGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY4ZDFmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3ZpZGVvbWl4ZXIuYwpAQCAtMCwwICsxLDEwNzEgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIHVuaXQgdGVzdCBmb3IgdmlkZW1peGVyCisgKgorICogQ29weXJpZ2h0IChDKSA8MjAwNT4gVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorICogQ29weXJpZ2h0IChDKSA8MjAxMz4gVGhpYmF1bHQgU2F1bmllciA8dGhpYmF1bHQuc2F1bmllckBjb2xsYWJvcmEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1ZBTEdSSU5ECisjIGluY2x1ZGUgPHZhbGdyaW5kL3ZhbGdyaW5kLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNvbnNpc3RlbmN5Y2hlY2tlci5oPgorI2luY2x1ZGUgPGdzdC9iYXNlL2dzdGJhc2VzcmMuaD4KKworI2RlZmluZSBWSURFT19DQVBTX1NUUklORyAgICAgICAgICAgICAgIFwKKyAgICAidmlkZW8veC1yYXcsICIgICAgICAgICAgICAgICAgIFwKKyAgICAid2lkdGggPSAoaW50KSAzMjAsICIgICAgICAgICAgICAgICBcCisgICAgImhlaWdodCA9IChpbnQpIDI0MCwgIiAgICAgICAgICAgICAgXAorICAgICJmcmFtZXJhdGUgPSAoZnJhY3Rpb24pIDI1LzEgLCAiICAgIFwKKyAgICAiZm9ybWF0ID0gKHN0cmluZykgSTQyMCIKKworc3RhdGljIEdNYWluTG9vcCAqbWFpbl9sb29wOworCisvKiBtYWtlIHN1cmUgZG93bnN0cmVhbSBnZXRzIGEgQ0FQUyBldmVudCBiZWZvcmUgYnVmZmVycyBhcmUgc2VudCAqLworR1NUX1NUQVJUX1RFU1QgKHRlc3RfY2FwcykKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmUsICpzcmMsICp2aWRlb21peGVyLCAqc2luazsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmVzOworICBHc3RDYXBzICpjYXBzOworICBHc3RQYWQgKnBhZDsKKworICAvKiBidWlsZCBwaXBlbGluZSAqLworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworCisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsICJzcmMxIik7CisgIHZpZGVvbWl4ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb21peGVyIiwgInZpZGVvbWl4ZXIiKTsKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgInNpbmsiKTsKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMsIHZpZGVvbWl4ZXIsIHNpbmssIE5VTEwpOworCisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rX21hbnkgKHNyYywgdmlkZW9taXhlciwgc2luaywgTlVMTCkpOworCisgIC8qIHByZXBhcmUgcGxheWluZyAqLworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0FTWU5DKTsKKworICAvKiB3YWl0IGZvciBwcmVyb2xsICovCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X2dldF9zdGF0ZSAocGlwZWxpbmUsIE5VTEwsIE5VTEwsIEdTVF9DTE9DS19USU1FX05PTkUpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUyk7CisKKyAgLyogY2hlY2sgY2FwcyBvbiBmYWtlc2luayAqLworICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2luaywgInNpbmsiKTsKKyAgY2FwcyA9IGdzdF9wYWRfZ2V0X2N1cnJlbnRfY2FwcyAocGFkKTsKKyAgZmFpbF91bmxlc3MgKGNhcHMgIT0gTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGFkKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgdm9pZAorbWVzc2FnZV9yZWNlaXZlZCAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgR3N0UGlwZWxpbmUgKiBiaW4pCit7CisgIEdTVF9JTkZPICgiYnVzIG1lc3NhZ2UgZnJvbSBcIiUiIEdTVF9QVFJfRk9STUFUICJcIjogJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpLCBtZXNzYWdlKTsKKworICBzd2l0Y2ggKG1lc3NhZ2UtPnR5cGUpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VPUzoKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKG1haW5fbG9vcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX1dBUk5JTkc6eworICAgICAgR0Vycm9yICpnZXJyb3I7CisgICAgICBnY2hhciAqZGVidWc7CisKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX3dhcm5pbmcgKG1lc3NhZ2UsICZnZXJyb3IsICZkZWJ1Zyk7CisgICAgICBnc3Rfb2JqZWN0X2RlZmF1bHRfZXJyb3IgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSksIGdlcnJvciwgZGVidWcpOworICAgICAgZ19lcnJvcl9mcmVlIChnZXJyb3IpOworICAgICAgZ19mcmVlIChkZWJ1Zyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FUlJPUjp7CisgICAgICBHRXJyb3IgKmdlcnJvcjsKKyAgICAgIGdjaGFyICpkZWJ1ZzsKKworICAgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1lc3NhZ2UsICZnZXJyb3IsICZkZWJ1Zyk7CisgICAgICBnc3Rfb2JqZWN0X2RlZmF1bHRfZXJyb3IgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSksIGdlcnJvciwgZGVidWcpOworICAgICAgZ19lcnJvcl9mcmVlIChnZXJyb3IpOworICAgICAgZ19mcmVlIChkZWJ1Zyk7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChtYWluX2xvb3ApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCisKK3N0YXRpYyBHc3RGb3JtYXQgZm9ybWF0ID0gR1NUX0ZPUk1BVF9VTkRFRklORUQ7CitzdGF0aWMgZ2ludDY0IHBvc2l0aW9uID0gLTE7CisKK3N0YXRpYyB2b2lkCit0ZXN0X2V2ZW50X21lc3NhZ2VfcmVjZWl2ZWQgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsCisgICAgR3N0UGlwZWxpbmUgKiBiaW4pCit7CisgIEdTVF9JTkZPICgiYnVzIG1lc3NhZ2UgZnJvbSBcIiUiIEdTVF9QVFJfRk9STUFUICJcIjogJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpLCBtZXNzYWdlKTsKKworICBzd2l0Y2ggKG1lc3NhZ2UtPnR5cGUpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX1NFR01FTlRfRE9ORToKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX3NlZ21lbnRfZG9uZSAobWVzc2FnZSwgJmZvcm1hdCwgJnBvc2l0aW9uKTsKKyAgICAgIEdTVF9JTkZPICgicmVjZWl2ZWQgc2VnbWVudF9kb25lIDogJSIgR19HSU5UNjRfRk9STUFULCBwb3NpdGlvbik7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChtYWluX2xvb3ApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgYnJlYWs7CisgIH0KK30KKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9ldmVudCkKK3sKKyAgR3N0RWxlbWVudCAqYmluLCAqc3JjMSwgKnNyYzIsICp2aWRlb21peGVyLCAqc2luazsKKyAgR3N0QnVzICpidXM7CisgIEdzdEV2ZW50ICpzZWVrX2V2ZW50OworICBHc3RTdGF0ZUNoYW5nZVJldHVybiBzdGF0ZV9yZXM7CisgIGdib29sZWFuIHJlczsKKyAgR3N0UGFkICpzcmNwYWQsICpzaW5rcGFkOworICBHc3RTdHJlYW1Db25zaXN0ZW5jeSAqY2hrXzEsICpjaGtfMiwgKmNoa18zOworCisgIEdTVF9JTkZPICgicHJlcGFyaW5nIHRlc3QiKTsKKworICAvKiBidWlsZCBwaXBlbGluZSAqLworICBiaW4gPSBnc3RfcGlwZWxpbmVfbmV3ICgicGlwZWxpbmUiKTsKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAoYmluKTsKKyAgZ3N0X2J1c19hZGRfc2lnbmFsX3dhdGNoX2Z1bGwgKGJ1cywgR19QUklPUklUWV9ISUdIKTsKKworICBzcmMxID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgInNyYzEiKTsKKyAgc3JjMiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsICJzcmMyIik7CisgIHZpZGVvbWl4ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb21peGVyIiwgInZpZGVvbWl4ZXIiKTsKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgInNpbmsiKTsKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAoYmluKSwgc3JjMSwgc3JjMiwgdmlkZW9taXhlciwgc2luaywgTlVMTCk7CisKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAoc3JjMSwgdmlkZW9taXhlcik7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKHNyYzIsIHZpZGVvbWl4ZXIpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICByZXMgPSBnc3RfZWxlbWVudF9saW5rICh2aWRlb21peGVyLCBzaW5rKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKworICBzcmNwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAodmlkZW9taXhlciwgInNyYyIpOworICBjaGtfMyA9IGdzdF9jb25zaXN0ZW5jeV9jaGVja2VyX25ldyAoc3JjcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKworICAvKiBjcmVhdGUgY29uc2lzdGVuY3kgY2hlY2tlcnMgZm9yIHRoZSBwYWRzICovCisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzcmMxLCAic3JjIik7CisgIGNoa18xID0gZ3N0X2NvbnNpc3RlbmN5X2NoZWNrZXJfbmV3IChzcmNwYWQpOworICBzaW5rcGFkID0gZ3N0X3BhZF9nZXRfcGVlciAoc3JjcGFkKTsKKyAgZ3N0X2NvbnNpc3RlbmN5X2NoZWNrZXJfYWRkX3BhZCAoY2hrXzMsIHNpbmtwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKworICBzcmNwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc3JjMiwgInNyYyIpOworICBjaGtfMiA9IGdzdF9jb25zaXN0ZW5jeV9jaGVja2VyX25ldyAoc3JjcGFkKTsKKyAgc2lua3BhZCA9IGdzdF9wYWRfZ2V0X3BlZXIgKHNyY3BhZCk7CisgIGdzdF9jb25zaXN0ZW5jeV9jaGVja2VyX2FkZF9wYWQgKGNoa18zLCBzaW5rcGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisKKyAgc2Vla19ldmVudCA9IGdzdF9ldmVudF9uZXdfc2VlayAoMS4wLCBHU1RfRk9STUFUX1RJTUUsCisgICAgICBHU1RfU0VFS19GTEFHX1NFR01FTlQgfCBHU1RfU0VFS19GTEFHX0ZMVVNILAorICAgICAgR1NUX1NFRUtfVFlQRV9TRVQsIChHc3RDbG9ja1RpbWUpIDAsCisgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgKEdzdENsb2NrVGltZSkgMiAqIEdTVF9TRUNPTkQpOworCisgIGZvcm1hdCA9IEdTVF9GT1JNQVRfVU5ERUZJTkVEOworICBwb3NpdGlvbiA9IC0xOworCisgIG1haW5fbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgRkFMU0UpOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjpzZWdtZW50LWRvbmUiLAorICAgICAgKEdDYWxsYmFjaykgdGVzdF9ldmVudF9tZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjplcnJvciIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsIGJpbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6Ondhcm5pbmciLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjplb3MiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworCisgIEdTVF9JTkZPICgic3RhcnRpbmcgdGVzdCIpOworCisgIC8qIHByZXBhcmUgcGxheWluZyAqLworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX1BBVVNFRCk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICAvKiB3YWl0IGZvciBjb21wbGV0aW9uICovCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X2dldF9zdGF0ZSAoYmluLCBOVUxMLCBOVUxMLCBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIHJlcyA9IGdzdF9lbGVtZW50X3NlbmRfZXZlbnQgKGJpbiwgc2Vla19ldmVudCk7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisKKyAgLyogcnVuIHBpcGVsaW5lICovCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBHU1RfSU5GTyAoInJ1bm5pbmcgbWFpbiBsb29wIik7CisgIGdfbWFpbl9sb29wX3J1biAobWFpbl9sb29wKTsKKworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX05VTEwpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgY2tfYXNzZXJ0X2ludF9lcSAocG9zaXRpb24sIDIgKiBHU1RfU0VDT05EKTsKKworICAvKiBjbGVhbnVwICovCisgIGdfbWFpbl9sb29wX3VucmVmIChtYWluX2xvb3ApOworICBnc3RfY29uc2lzdGVuY3lfY2hlY2tlcl9mcmVlIChjaGtfMSk7CisgIGdzdF9jb25zaXN0ZW5jeV9jaGVja2VyX2ZyZWUgKGNoa18yKTsKKyAgZ3N0X2NvbnNpc3RlbmN5X2NoZWNrZXJfZnJlZSAoY2hrXzMpOworICBnc3RfYnVzX3JlbW92ZV9zaWduYWxfd2F0Y2ggKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJpbik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIGd1aW50IHBsYXlfY291bnQgPSAwOworc3RhdGljIEdzdEV2ZW50ICpwbGF5X3NlZWtfZXZlbnQgPSBOVUxMOworCitzdGF0aWMgdm9pZAordGVzdF9wbGF5X3R3aWNlX21lc3NhZ2VfcmVjZWl2ZWQgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsCisgICAgR3N0UGlwZWxpbmUgKiBiaW4pCit7CisgIGdib29sZWFuIHJlczsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmVzOworCisgIEdTVF9JTkZPICgiYnVzIG1lc3NhZ2UgZnJvbSBcIiUiIEdTVF9QVFJfRk9STUFUICJcIjogJSIgR1NUX1BUUl9GT1JNQVQsCisgICAgICBHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpLCBtZXNzYWdlKTsKKworICBzd2l0Y2ggKG1lc3NhZ2UtPnR5cGUpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX1NFR01FTlRfRE9ORToKKyAgICAgIHBsYXlfY291bnQrKzsKKyAgICAgIGlmIChwbGF5X2NvdW50ID09IDEpIHsKKyAgICAgICAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChHU1RfRUxFTUVOVCAoYmluKSwgR1NUX1NUQVRFX1JFQURZKTsKKyAgICAgICAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgICAgICAgIC8qIHByZXBhcmUgcGxheWluZyBhZ2FpbiAqLworICAgICAgICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKEdTVF9FTEVNRU5UIChiaW4pLCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgICAgICAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgICAgICAgIC8qIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKyAgICAgICAgc3RhdGVfcmVzID0KKyAgICAgICAgICAgIGdzdF9lbGVtZW50X2dldF9zdGF0ZSAoR1NUX0VMRU1FTlQgKGJpbiksIE5VTEwsIE5VTEwsCisgICAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKyAgICAgICAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgICAgICAgIHJlcyA9IGdzdF9lbGVtZW50X3NlbmRfZXZlbnQgKEdTVF9FTEVNRU5UIChiaW4pLAorICAgICAgICAgICAgZ3N0X2V2ZW50X3JlZiAocGxheV9zZWVrX2V2ZW50KSk7CisgICAgICAgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisKKyAgICAgICAgc3RhdGVfcmVzID0KKyAgICAgICAgICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoR1NUX0VMRU1FTlQgKGJpbiksIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgICAgICAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ19tYWluX2xvb3BfcXVpdCAobWFpbl9sb29wKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX2Fzc2VydF9ub3RfcmVhY2hlZCAoKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGxheV90d2ljZSkKK3sKKyAgR3N0RWxlbWVudCAqYmluLCAqc3JjMSwgKnNyYzIsICp2aWRlb21peGVyLCAqc2luazsKKyAgR3N0QnVzICpidXM7CisgIGdib29sZWFuIHJlczsKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gc3RhdGVfcmVzOworICBHc3RQYWQgKnNyY3BhZDsKKyAgR3N0U3RyZWFtQ29uc2lzdGVuY3kgKmNvbnNpc3Q7CisKKyAgR1NUX0lORk8gKCJwcmVwYXJpbmcgdGVzdCIpOworCisgIC8qIGJ1aWxkIHBpcGVsaW5lICovCisgIGJpbiA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChiaW4pOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2hfZnVsbCAoYnVzLCBHX1BSSU9SSVRZX0hJR0gpOworCisgIHNyYzEgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCAic3JjMSIpOworICBzcmMyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgInNyYzIiKTsKKyAgdmlkZW9taXhlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvbWl4ZXIiLCAidmlkZW9taXhlciIpOworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChiaW4pLCBzcmMxLCBzcmMyLCB2aWRlb21peGVyLCBzaW5rLCBOVUxMKTsKKworICByZXMgPSBnc3RfZWxlbWVudF9saW5rIChzcmMxLCB2aWRlb21peGVyKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAoc3JjMiwgdmlkZW9taXhlcik7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKHZpZGVvbWl4ZXIsIHNpbmspOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworCisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkICh2aWRlb21peGVyLCAic3JjIik7CisgIGNvbnNpc3QgPSBnc3RfY29uc2lzdGVuY3lfY2hlY2tlcl9uZXcgKHNyY3BhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisKKyAgcGxheV9zZWVrX2V2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWVrICgxLjAsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgIEdTVF9TRUVLX0ZMQUdfU0VHTUVOVCB8IEdTVF9TRUVLX0ZMQUdfRkxVU0gsCisgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgKEdzdENsb2NrVGltZSkgMCwKKyAgICAgIEdTVF9TRUVLX1RZUEVfU0VULCAoR3N0Q2xvY2tUaW1lKSAyICogR1NUX1NFQ09ORCk7CisKKyAgcGxheV9jb3VudCA9IDA7CisKKyAgbWFpbl9sb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OnNlZ21lbnQtZG9uZSIsCisgICAgICAoR0NhbGxiYWNrKSB0ZXN0X3BsYXlfdHdpY2VfbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6ZXJyb3IiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjp3YXJuaW5nIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6ZW9zIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKworICBHU1RfSU5GTyAoInN0YXJ0aW5nIHRlc3QiKTsKKworICAvKiBwcmVwYXJlIHBsYXlpbmcgKi8KKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9QQVVTRUQpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgLyogd2FpdCBmb3IgY29tcGxldGlvbiAqLworICBzdGF0ZV9yZXMgPQorICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChHU1RfRUxFTUVOVCAoYmluKSwgTlVMTCwgTlVMTCwKKyAgICAgIEdTVF9DTE9DS19USU1FX05PTkUpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgcmVzID0gZ3N0X2VsZW1lbnRfc2VuZF9ldmVudCAoYmluLCBnc3RfZXZlbnRfcmVmIChwbGF5X3NlZWtfZXZlbnQpKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKworICBHU1RfSU5GTyAoInNlZWtlZCIpOworCisgIC8qIHJ1biBwaXBlbGluZSAqLworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgZ19tYWluX2xvb3BfcnVuIChtYWluX2xvb3ApOworCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfTlVMTCk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBja19hc3NlcnRfaW50X2VxIChwbGF5X2NvdW50LCAyKTsKKworICAvKiBjbGVhbnVwICovCisgIGdfbWFpbl9sb29wX3VucmVmIChtYWluX2xvb3ApOworICBnc3RfY29uc2lzdGVuY3lfY2hlY2tlcl9mcmVlIChjb25zaXN0KTsKKyAgZ3N0X2V2ZW50X3VucmVmIChwbGF5X3NlZWtfZXZlbnQpOworICBnc3RfYnVzX3JlbW92ZV9zaWduYWxfd2F0Y2ggKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJpbik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGxheV90d2ljZV90aGVuX2FkZF9hbmRfcGxheV9hZ2FpbikKK3sKKyAgR3N0RWxlbWVudCAqYmluLCAqc3JjMSwgKnNyYzIsICpzcmMzLCAqdmlkZW9taXhlciwgKnNpbms7CisgIEdzdEJ1cyAqYnVzOworICBnYm9vbGVhbiByZXM7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHN0YXRlX3JlczsKKyAgZ2ludCBpOworICBHc3RQYWQgKnNyY3BhZDsKKyAgR3N0U3RyZWFtQ29uc2lzdGVuY3kgKmNvbnNpc3Q7CisKKyAgR1NUX0lORk8gKCJwcmVwYXJpbmcgdGVzdCIpOworCisgIC8qIGJ1aWxkIHBpcGVsaW5lICovCisgIGJpbiA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChiaW4pOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2hfZnVsbCAoYnVzLCBHX1BSSU9SSVRZX0hJR0gpOworCisgIHNyYzEgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCAic3JjMSIpOworICBzcmMyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgInNyYzIiKTsKKyAgdmlkZW9taXhlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvbWl4ZXIiLCAidmlkZW9taXhlciIpOworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChiaW4pLCBzcmMxLCBzcmMyLCB2aWRlb21peGVyLCBzaW5rLCBOVUxMKTsKKworICBzcmNwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAodmlkZW9taXhlciwgInNyYyIpOworICBjb25zaXN0ID0gZ3N0X2NvbnNpc3RlbmN5X2NoZWNrZXJfbmV3IChzcmNwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworCisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKHNyYzEsIHZpZGVvbWl4ZXIpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICByZXMgPSBnc3RfZWxlbWVudF9saW5rIChzcmMyLCB2aWRlb21peGVyKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAodmlkZW9taXhlciwgc2luayk7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisKKyAgcGxheV9zZWVrX2V2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWVrICgxLjAsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgIEdTVF9TRUVLX0ZMQUdfU0VHTUVOVCB8IEdTVF9TRUVLX0ZMQUdfRkxVU0gsCisgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgKEdzdENsb2NrVGltZSkgMCwKKyAgICAgIEdTVF9TRUVLX1RZUEVfU0VULCAoR3N0Q2xvY2tUaW1lKSAyICogR1NUX1NFQ09ORCk7CisKKyAgbWFpbl9sb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OnNlZ21lbnQtZG9uZSIsCisgICAgICAoR0NhbGxiYWNrKSB0ZXN0X3BsYXlfdHdpY2VfbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6ZXJyb3IiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjp3YXJuaW5nIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6ZW9zIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKworICAvKiBydW4gaXQgdHdpY2UgKi8KKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgIHBsYXlfY291bnQgPSAwOworCisgICAgR1NUX0lORk8gKCJzdGFydGluZyB0ZXN0LWxvb3AgJWQiLCBpKTsKKworICAgIC8qIHByZXBhcmUgcGxheWluZyAqLworICAgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgICAvKiB3YWl0IGZvciBjb21wbGV0aW9uICovCisgICAgc3RhdGVfcmVzID0KKyAgICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChHU1RfRUxFTUVOVCAoYmluKSwgTlVMTCwgTlVMTCwKKyAgICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisgICAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgICAgcmVzID0gZ3N0X2VsZW1lbnRfc2VuZF9ldmVudCAoYmluLCBnc3RfZXZlbnRfcmVmIChwbGF5X3NlZWtfZXZlbnQpKTsKKyAgICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworCisgICAgR1NUX0lORk8gKCJzZWVrZWQiKTsKKworICAgIC8qIHJ1biBwaXBlbGluZSAqLworICAgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfUExBWUlORyk7CisgICAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgICAgZ19tYWluX2xvb3BfcnVuIChtYWluX2xvb3ApOworCisgICAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9SRUFEWSk7CisgICAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgICAgY2tfYXNzZXJ0X2ludF9lcSAocGxheV9jb3VudCwgMik7CisKKyAgICAvKiBwbHVnIGFub3RoZXIgc291cmNlICovCisgICAgaWYgKGkgPT0gMCkgeworICAgICAgc3JjMyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsICJzcmMzIik7CisgICAgICBnc3RfYmluX2FkZCAoR1NUX0JJTiAoYmluKSwgc3JjMyk7CisKKyAgICAgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKHNyYzMsIHZpZGVvbWl4ZXIpOworICAgICAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgICB9CisKKyAgICBnc3RfY29uc2lzdGVuY3lfY2hlY2tlcl9yZXNldCAoY29uc2lzdCk7CisgIH0KKworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX05VTEwpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgLyogY2xlYW51cCAqLworICBnX21haW5fbG9vcF91bnJlZiAobWFpbl9sb29wKTsKKyAgZ3N0X2V2ZW50X3VucmVmIChwbGF5X3NlZWtfZXZlbnQpOworICBnc3RfY29uc2lzdGVuY3lfY2hlY2tlcl9mcmVlIChjb25zaXN0KTsKKyAgZ3N0X2J1c19yZW1vdmVfc2lnbmFsX3dhdGNoIChidXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChiaW4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKKy8qIGNoZWNrIGlmIGFkZGluZyBwYWRzIHdvcmsgYXMgZXhwZWN0ZWQgKi8KK0dTVF9TVEFSVF9URVNUICh0ZXN0X2FkZF9wYWQpCit7CisgIEdzdEVsZW1lbnQgKmJpbiwgKnNyYzEsICpzcmMyLCAqdmlkZW9taXhlciwgKnNpbms7CisgIEdzdEJ1cyAqYnVzOworICBHc3RQYWQgKnNyY3BhZDsKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RTdGF0ZUNoYW5nZVJldHVybiBzdGF0ZV9yZXM7CisKKyAgR1NUX0lORk8gKCJwcmVwYXJpbmcgdGVzdCIpOworCisgIC8qIGJ1aWxkIHBpcGVsaW5lICovCisgIGJpbiA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChiaW4pOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2hfZnVsbCAoYnVzLCBHX1BSSU9SSVRZX0hJR0gpOworCisgIHNyYzEgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCAic3JjMSIpOworICBnX29iamVjdF9zZXQgKHNyYzEsICJudW0tYnVmZmVycyIsIDQsIE5VTEwpOworICBzcmMyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgInNyYzIiKTsKKyAgLyogb25lIGJ1ZmZlciBsZXNzLCB3ZSBjb25uZWN0IHdpdGggMSBidWZmZXIgb2YgZGVsYXkgKi8KKyAgZ19vYmplY3Rfc2V0IChzcmMyLCAibnVtLWJ1ZmZlcnMiLCAzLCBOVUxMKTsKKyAgdmlkZW9taXhlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvbWl4ZXIiLCAidmlkZW9taXhlciIpOworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChiaW4pLCBzcmMxLCB2aWRlb21peGVyLCBzaW5rLCBOVUxMKTsKKworICByZXMgPSBnc3RfZWxlbWVudF9saW5rIChzcmMxLCB2aWRlb21peGVyKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAodmlkZW9taXhlciwgc2luayk7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisKKyAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHZpZGVvbWl4ZXIsICJzcmMiKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc3JjcGFkKTsKKworICBtYWluX2xvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6c2VnbWVudC1kb25lIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwKKyAgICAgIGJpbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OmVycm9yIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6d2FybmluZyIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsIGJpbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OmVvcyIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsIGJpbik7CisKKyAgR1NUX0lORk8gKCJzdGFydGluZyB0ZXN0Iik7CisKKyAgLyogcHJlcGFyZSBwbGF5aW5nICovCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIC8qIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKyAgc3RhdGVfcmVzID0KKyAgICAgIGdzdF9lbGVtZW50X2dldF9zdGF0ZSAoR1NUX0VMRU1FTlQgKGJpbiksIE5VTEwsIE5VTEwsCisgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIC8qIGFkZCBvdGhlciBlbGVtZW50ICovCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKGJpbiksIHNyYzIsIE5VTEwpOworCisgIC8qIG5vdyBsaW5rIHRoZSBzZWNvbmQgZWxlbWVudCAqLworICByZXMgPSBnc3RfZWxlbWVudF9saW5rIChzcmMyLCB2aWRlb21peGVyKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKworICAvKiBzZXQgdG8gUEFVU0VEIGFzIHdlbGwgKi8KKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzcmMyLCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIC8qIG5vdyBwbGF5IGFsbCAqLworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgZ19tYWluX2xvb3BfcnVuIChtYWluX2xvb3ApOworCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfTlVMTCk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICAvKiBjbGVhbnVwICovCisgIGdfbWFpbl9sb29wX3VucmVmIChtYWluX2xvb3ApOworICBnc3RfYnVzX3JlbW92ZV9zaWduYWxfd2F0Y2ggKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJpbik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworLyogY2hlY2sgaWYgcmVtb3ZpbmcgcGFkcyB3b3JrIGFzIGV4cGVjdGVkICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF9yZW1vdmVfcGFkKQoreworICBHc3RFbGVtZW50ICpiaW4sICpzcmMsICp2aWRlb21peGVyLCAqc2luazsKKyAgR3N0QnVzICpidXM7CisgIEdzdFBhZCAqcGFkLCAqc3JjcGFkOworICBnYm9vbGVhbiByZXM7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHN0YXRlX3JlczsKKworICBHU1RfSU5GTyAoInByZXBhcmluZyB0ZXN0Iik7CisKKyAgLyogYnVpbGQgcGlwZWxpbmUgKi8KKyAgYmluID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKGJpbik7CisgIGdzdF9idXNfYWRkX3NpZ25hbF93YXRjaF9mdWxsIChidXMsIEdfUFJJT1JJVFlfSElHSCk7CisKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgInNyYyIpOworICBnX29iamVjdF9zZXQgKHNyYywgIm51bS1idWZmZXJzIiwgNCwgTlVMTCk7CisgIHZpZGVvbWl4ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb21peGVyIiwgInZpZGVvbWl4ZXIiKTsKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgInNpbmsiKTsKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAoYmluKSwgc3JjLCB2aWRlb21peGVyLCBzaW5rLCBOVUxMKTsKKworICByZXMgPSBnc3RfZWxlbWVudF9saW5rIChzcmMsIHZpZGVvbWl4ZXIpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICByZXMgPSBnc3RfZWxlbWVudF9saW5rICh2aWRlb21peGVyLCBzaW5rKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKworICAvKiBjcmVhdGUgYW4gdW5jb25uZWN0ZWQgc2lua3BhZCBpbiB2aWRlb21peGVyICovCisgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAodmlkZW9taXhlciwgInNpbmtfJXUiKTsKKyAgZmFpbF9pZiAocGFkID09IE5VTEwsIE5VTEwpOworCisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkICh2aWRlb21peGVyLCAic3JjIik7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisKKyAgbWFpbl9sb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OnNlZ21lbnQtZG9uZSIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsCisgICAgICBiaW4pOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjplcnJvciIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsIGJpbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6Ondhcm5pbmciLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjplb3MiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworCisgIEdTVF9JTkZPICgic3RhcnRpbmcgdGVzdCIpOworCisgIC8qIHByZXBhcmUgcGxheWluZywgdGhpcyB3aWxsIG5vdCBwcmVyb2xsIGFzIHZpZGVvbWl4ZXIgaXMgd2FpdGluZworICAgKiBvbiB0aGUgdW5jb25uZWN0ZWQgc2lua3BhZC4gKi8KKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9QQVVTRUQpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgLyogd2FpdCBmb3IgY29tcGxldGlvbiBmb3Igb25lIHNlY29uZCwgd2lsbCByZXR1cm4gQVNZTkMgKi8KKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChHU1RfRUxFTUVOVCAoYmluKSwgTlVMTCwgTlVMTCwgR1NUX1NFQ09ORCk7CisgIGNrX2Fzc2VydF9pbnRfZXEgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9BU1lOQyk7CisKKyAgLyogZ2V0IHJpZCBvZiB0aGUgcGFkIG5vdywgdmlkZW9taXhlciBzaG91bGQgc3RvcCB3YWl0aW5nIG9uIGl0IGFuZAorICAgKiBjb250aW51ZSB0aGUgcHJlcm9sbCAqLworICBnc3RfZWxlbWVudF9yZWxlYXNlX3JlcXVlc3RfcGFkICh2aWRlb21peGVyLCBwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworCisgIC8qIHdhaXQgZm9yIGNvbXBsZXRpb24sIHNob3VsZCB3b3JrIG5vdyAqLworICBzdGF0ZV9yZXMgPQorICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChHU1RfRUxFTUVOVCAoYmluKSwgTlVMTCwgTlVMTCwKKyAgICAgIEdTVF9DTE9DS19USU1FX05PTkUpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgLyogbm93IHBsYXkgYWxsICovCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGNrX2Fzc2VydF9pbnRfbmUgKHN0YXRlX3JlcywgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBnX21haW5fbG9vcF9ydW4gKG1haW5fbG9vcCk7CisKKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9OVUxMKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIC8qIGNsZWFudXAgKi8KKyAgZ19tYWluX2xvb3BfdW5yZWYgKG1haW5fbG9vcCk7CisgIGdzdF9idXNfcmVtb3ZlX3NpZ25hbF93YXRjaCAoYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoR19PQkpFQ1QgKGJ1cykpOworICBnc3Rfb2JqZWN0X3VucmVmIChHX09CSkVDVCAoYmluKSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitzdGF0aWMgR3N0QnVmZmVyICpoYW5kb2ZmX2J1ZmZlciA9IE5VTEw7CitzdGF0aWMgdm9pZAoraGFuZG9mZl9idWZmZXJfY2IgKEdzdEVsZW1lbnQgKiBmYWtlc2luaywgR3N0QnVmZmVyICogYnVmZmVyLCBHc3RQYWQgKiBwYWQsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHU1RfREVCVUcgKCJnb3QgYnVmZmVyICVwIiwgYnVmZmVyKTsKKyAgZ3N0X2J1ZmZlcl9yZXBsYWNlICgmaGFuZG9mZl9idWZmZXIsIGJ1ZmZlcik7Cit9CisKKy8qIGNoZWNrIGlmIGNsaXBwaW5nIHdvcmtzIGFzIGV4cGVjdGVkICovCitHU1RfU1RBUlRfVEVTVCAodGVzdF9jbGlwKQoreworICBHc3RTZWdtZW50IHNlZ21lbnQ7CisgIEdzdEVsZW1lbnQgKmJpbiwgKnZpZGVvbWl4ZXIsICpzaW5rOworICBHc3RCdXMgKmJ1czsKKyAgR3N0UGFkICpzaW5rcGFkOworICBnYm9vbGVhbiByZXM7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHN0YXRlX3JlczsKKyAgR3N0Rmxvd1JldHVybiByZXQ7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdzdENhcHMgKmNhcHM7CisKKyAgR1NUX0lORk8gKCJwcmVwYXJpbmcgdGVzdCIpOworCisgIC8qIGJ1aWxkIHBpcGVsaW5lICovCisgIGJpbiA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChiaW4pOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2hfZnVsbCAoYnVzLCBHX1BSSU9SSVRZX0hJR0gpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OmVycm9yIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6d2FybmluZyIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsIGJpbik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OmVvcyIsIChHQ2FsbGJhY2spIG1lc3NhZ2VfcmVjZWl2ZWQsIGJpbik7CisKKyAgLyoganVzdCBhbiB2aWRlb21peGVyIGFuZCBhIGZha2VzaW5rICovCisgIHZpZGVvbWl4ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb21peGVyIiwgInZpZGVvbWl4ZXIiKTsKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgInNpbmsiKTsKKyAgZ19vYmplY3Rfc2V0IChzaW5rLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKHNpbmssICJoYW5kb2ZmIiwgKEdDYWxsYmFjaykgaGFuZG9mZl9idWZmZXJfY2IsIE5VTEwpOworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChiaW4pLCB2aWRlb21peGVyLCBzaW5rLCBOVUxMKTsKKworICByZXMgPSBnc3RfZWxlbWVudF9saW5rICh2aWRlb21peGVyLCBzaW5rKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKworICAvKiBzZXQgdG8gcGxheWluZyAqLworICBzdGF0ZV9yZXMgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgLyogY3JlYXRlIGFuIHVuY29ubmVjdGVkIHNpbmtwYWQgaW4gdmlkZW9taXhlciwgc2hvdWxkIGFsc28gYXV0b21hdGljYWxseSBhY3RpdmF0ZQorICAgKiB0aGUgcGFkICovCisgIHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfcmVxdWVzdF9wYWQgKHZpZGVvbWl4ZXIsICJzaW5rXyV1Iik7CisgIGZhaWxfaWYgKHNpbmtwYWQgPT0gTlVMTCwgTlVMTCk7CisKKyAgZ3N0X3BhZF9zZW5kX2V2ZW50IChzaW5rcGFkLCBnc3RfZXZlbnRfbmV3X3N0cmVhbV9zdGFydCAoInRlc3QiKSk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChWSURFT19DQVBTX1NUUklORyk7CisKKyAgZ3N0X3BhZF9zZXRfY2FwcyAoc2lua3BhZCwgY2Fwcyk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICAvKiBzZW5kIHNlZ21lbnQgdG8gdmlkZW9taXhlciAqLworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKyAgc2VnbWVudC5zdGFydCA9IEdTVF9TRUNPTkQ7CisgIHNlZ21lbnQuc3RvcCA9IDIgKiBHU1RfU0VDT05EOworICBzZWdtZW50LnRpbWUgPSAwOworICBldmVudCA9IGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpOworICBnc3RfcGFkX3NlbmRfZXZlbnQgKHNpbmtwYWQsIGV2ZW50KTsKKworICAvKiBzaG91bGQgYmUgY2xpcHBlZCBhbmQgb2sgKi8KKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMTUyMDApOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSA9IDA7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcikgPSAyNTAgKiBHU1RfTVNFQ09ORDsKKyAgR1NUX0RFQlVHICgicHVzaGluZyBidWZmZXIgJXAiLCBidWZmZXIpOworICByZXQgPSBnc3RfcGFkX2NoYWluIChzaW5rcGFkLCBidWZmZXIpOworICBja19hc3NlcnRfaW50X2VxIChyZXQsIEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGhhbmRvZmZfYnVmZmVyID09IE5VTEwpOworCisgIC8qIHNob3VsZCBiZSBwYXJ0aWFsbHkgY2xpcHBlZCAqLworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDExNTIwMCk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpID0gOTAwICogR1NUX01TRUNPTkQ7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcikgPSAyNTAgKiBHU1RfTVNFQ09ORDsKKyAgR1NUX0RFQlVHICgicHVzaGluZyBidWZmZXIgJXAiLCBidWZmZXIpOworICByZXQgPSBnc3RfcGFkX2NoYWluIChzaW5rcGFkLCBidWZmZXIpOworICBja19hc3NlcnRfaW50X2VxIChyZXQsIEdTVF9GTE9XX09LKTsKKyAgZmFpbF91bmxlc3MgKGhhbmRvZmZfYnVmZmVyICE9IE5VTEwpOworICBnc3RfYnVmZmVyX3JlcGxhY2UgKCZoYW5kb2ZmX2J1ZmZlciwgTlVMTCk7CisKKyAgLyogc2hvdWxkIG5vdCBiZSBjbGlwcGVkICovCisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTE1MjAwKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcikgPSAxICogR1NUX1NFQ09ORDsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSA9IDI1MCAqIEdTVF9NU0VDT05EOworICBHU1RfREVCVUcgKCJwdXNoaW5nIGJ1ZmZlciAlcCIsIGJ1ZmZlcik7CisgIHJldCA9IGdzdF9wYWRfY2hhaW4gKHNpbmtwYWQsIGJ1ZmZlcik7CisgIGNrX2Fzc2VydF9pbnRfZXEgKHJldCwgR1NUX0ZMT1dfT0spOworICBmYWlsX3VubGVzcyAoaGFuZG9mZl9idWZmZXIgIT0gTlVMTCk7CisgIGdzdF9idWZmZXJfcmVwbGFjZSAoJmhhbmRvZmZfYnVmZmVyLCBOVUxMKTsKKworICAvKiBzaG91bGQgYmUgY2xpcHBlZCBhbmQgb2sgKi8KKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgxMTUyMDApOworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSA9IDIgKiBHU1RfU0VDT05EOworICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpID0gMjUwICogR1NUX01TRUNPTkQ7CisgIEdTVF9ERUJVRyAoInB1c2hpbmcgYnVmZmVyICVwIiwgYnVmZmVyKTsKKyAgcmV0ID0gZ3N0X3BhZF9jaGFpbiAoc2lua3BhZCwgYnVmZmVyKTsKKyAgY2tfYXNzZXJ0X2ludF9lcSAocmV0LCBHU1RfRkxPV19PSyk7CisgIGZhaWxfdW5sZXNzIChoYW5kb2ZmX2J1ZmZlciA9PSBOVUxMKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X2J1c19yZW1vdmVfc2lnbmFsX3dhdGNoIChidXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChiaW4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2R1cmF0aW9uX2lzX21heCkKK3sKKyAgR3N0RWxlbWVudCAqYmluLCAqc3JjWzNdLCAqdmlkZW9taXhlciwgKnNpbms7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHN0YXRlX3JlczsKKyAgR3N0Rm9ybWF0IGZvcm1hdCA9IEdTVF9GT1JNQVRfVElNRTsKKyAgZ2Jvb2xlYW4gcmVzOworICBnaW50NjQgZHVyYXRpb247CisKKyAgR1NUX0lORk8gKCJwcmVwYXJpbmcgdGVzdCIpOworCisgIC8qIGJ1aWxkIHBpcGVsaW5lICovCisgIGJpbiA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworCisgIC8qIDMgc291cmNlcywgYW4gdmlkZW9taXhlciBhbmQgYSBmYWtlc2luayAqLworICBzcmNbMF0gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCBOVUxMKTsKKyAgc3JjWzFdID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgTlVMTCk7CisgIHNyY1syXSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsIE5VTEwpOworICB2aWRlb21peGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW9taXhlciIsICJ2aWRlb21peGVyIik7CisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJzaW5rIik7CisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKGJpbiksIHNyY1swXSwgc3JjWzFdLCBzcmNbMl0sIHZpZGVvbWl4ZXIsIHNpbmssCisgICAgICBOVUxMKTsKKworICBnc3RfZWxlbWVudF9saW5rIChzcmNbMF0sIHZpZGVvbWl4ZXIpOworICBnc3RfZWxlbWVudF9saW5rIChzcmNbMV0sIHZpZGVvbWl4ZXIpOworICBnc3RfZWxlbWVudF9saW5rIChzcmNbMl0sIHZpZGVvbWl4ZXIpOworICBnc3RfZWxlbWVudF9saW5rICh2aWRlb21peGVyLCBzaW5rKTsKKworICAvKiBpcmtzLCBkdXJhdGlvbiBpcyByZXNldCBvbiBiYXNlc3JjICovCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgZmFpbF91bmxlc3MgKHN0YXRlX3JlcyAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUsIE5VTEwpOworCisgIC8qIHNldCBkdXJhdGlvbnMgb24gc3JjICovCisgIEdTVF9CQVNFX1NSQyAoc3JjWzBdKS0+c2VnbWVudC5kdXJhdGlvbiA9IDEwMDA7CisgIEdTVF9CQVNFX1NSQyAoc3JjWzFdKS0+c2VnbWVudC5kdXJhdGlvbiA9IDMwMDA7CisgIEdTVF9CQVNFX1NSQyAoc3JjWzJdKS0+c2VnbWVudC5kdXJhdGlvbiA9IDIwMDA7CisKKyAgLyogc2V0IHRvIHBsYXlpbmcgKi8KKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZmFpbF91bmxlc3MgKHN0YXRlX3JlcyAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUsIE5VTEwpOworCisgIC8qIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKyAgc3RhdGVfcmVzID0KKyAgICAgIGdzdF9lbGVtZW50X2dldF9zdGF0ZSAoR1NUX0VMRU1FTlQgKGJpbiksIE5VTEwsIE5VTEwsCisgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKyAgZmFpbF91bmxlc3MgKHN0YXRlX3JlcyAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUsIE5VTEwpOworCisgIHJlcyA9IGdzdF9lbGVtZW50X3F1ZXJ5X2R1cmF0aW9uIChHU1RfRUxFTUVOVCAoYmluKSwgZm9ybWF0LCAmZHVyYXRpb24pOworICBmYWlsX3VubGVzcyAocmVzLCBOVUxMKTsKKworICBja19hc3NlcnRfaW50X2VxIChkdXJhdGlvbiwgMzAwMCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYmluKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9kdXJhdGlvbl91bmtub3duX292ZXJyaWRlcykKK3sKKyAgR3N0RWxlbWVudCAqYmluLCAqc3JjWzNdLCAqdmlkZW9taXhlciwgKnNpbms7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHN0YXRlX3JlczsKKyAgR3N0Rm9ybWF0IGZvcm1hdCA9IEdTVF9GT1JNQVRfVElNRTsKKyAgZ2Jvb2xlYW4gcmVzOworICBnaW50NjQgZHVyYXRpb247CisKKyAgR1NUX0lORk8gKCJwcmVwYXJpbmcgdGVzdCIpOworCisgIC8qIGJ1aWxkIHBpcGVsaW5lICovCisgIGJpbiA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworCisgIC8qIDMgc291cmNlcywgYW4gdmlkZW9taXhlciBhbmQgYSBmYWtlc2luayAqLworICBzcmNbMF0gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCBOVUxMKTsKKyAgc3JjWzFdID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgTlVMTCk7CisgIHNyY1syXSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsIE5VTEwpOworICB2aWRlb21peGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW9taXhlciIsICJ2aWRlb21peGVyIik7CisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJzaW5rIik7CisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKGJpbiksIHNyY1swXSwgc3JjWzFdLCBzcmNbMl0sIHZpZGVvbWl4ZXIsIHNpbmssCisgICAgICBOVUxMKTsKKworICBnc3RfZWxlbWVudF9saW5rIChzcmNbMF0sIHZpZGVvbWl4ZXIpOworICBnc3RfZWxlbWVudF9saW5rIChzcmNbMV0sIHZpZGVvbWl4ZXIpOworICBnc3RfZWxlbWVudF9saW5rIChzcmNbMl0sIHZpZGVvbWl4ZXIpOworICBnc3RfZWxlbWVudF9saW5rICh2aWRlb21peGVyLCBzaW5rKTsKKworICAvKiBpcmtzLCBkdXJhdGlvbiBpcyByZXNldCBvbiBiYXNlc3JjICovCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgZmFpbF91bmxlc3MgKHN0YXRlX3JlcyAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUsIE5VTEwpOworCisgIC8qIHNldCBkdXJhdGlvbnMgb24gc3JjICovCisgIEdTVF9CQVNFX1NSQyAoc3JjWzBdKS0+c2VnbWVudC5kdXJhdGlvbiA9IEdTVF9DTE9DS19USU1FX05PTkU7CisgIEdTVF9CQVNFX1NSQyAoc3JjWzFdKS0+c2VnbWVudC5kdXJhdGlvbiA9IDMwMDA7CisgIEdTVF9CQVNFX1NSQyAoc3JjWzJdKS0+c2VnbWVudC5kdXJhdGlvbiA9IDIwMDA7CisKKyAgLyogc2V0IHRvIHBsYXlpbmcgKi8KKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZmFpbF91bmxlc3MgKHN0YXRlX3JlcyAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUsIE5VTEwpOworCisgIC8qIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKyAgc3RhdGVfcmVzID0KKyAgICAgIGdzdF9lbGVtZW50X2dldF9zdGF0ZSAoR1NUX0VMRU1FTlQgKGJpbiksIE5VTEwsIE5VTEwsCisgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKyAgZmFpbF91bmxlc3MgKHN0YXRlX3JlcyAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUsIE5VTEwpOworCisgIHJlcyA9IGdzdF9lbGVtZW50X3F1ZXJ5X2R1cmF0aW9uIChHU1RfRUxFTUVOVCAoYmluKSwgZm9ybWF0LCAmZHVyYXRpb24pOworICBmYWlsX3VubGVzcyAocmVzLCBOVUxMKTsKKworICBja19hc3NlcnRfaW50X2VxIChkdXJhdGlvbiwgR1NUX0NMT0NLX1RJTUVfTk9ORSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYmluKTsKK30KKworR1NUX0VORF9URVNUOworCisKK3N0YXRpYyBnYm9vbGVhbiBsb29wZWQgPSBGQUxTRTsKKworc3RhdGljIHZvaWQKK2xvb3Bfc2VnbWVudF9kb25lIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBHc3RFbGVtZW50ICogYmluKQoreworICBHU1RfSU5GTyAoImJ1cyBtZXNzYWdlIGZyb20gXCIlIiBHU1RfUFRSX0ZPUk1BVCAiXCI6ICUiIEdTVF9QVFJfRk9STUFULAorICAgICAgR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSwgbWVzc2FnZSk7CisKKyAgaWYgKGxvb3BlZCkgeworICAgIGdfbWFpbl9sb29wX3F1aXQgKG1haW5fbG9vcCk7CisgIH0gZWxzZSB7CisgICAgR3N0RXZlbnQgKnNlZWtfZXZlbnQ7CisgICAgZ2Jvb2xlYW4gcmVzOworCisgICAgc2Vla19ldmVudCA9IGdzdF9ldmVudF9uZXdfc2VlayAoMS4wLCBHU1RfRk9STUFUX1RJTUUsCisgICAgICAgIEdTVF9TRUVLX0ZMQUdfU0VHTUVOVCwKKyAgICAgICAgR1NUX1NFRUtfVFlQRV9TRVQsIChHc3RDbG9ja1RpbWUpIDAsCisgICAgICAgIEdTVF9TRUVLX1RZUEVfU0VULCAoR3N0Q2xvY2tUaW1lKSAxICogR1NUX1NFQ09ORCk7CisKKyAgICByZXMgPSBnc3RfZWxlbWVudF9zZW5kX2V2ZW50IChiaW4sIHNlZWtfZXZlbnQpOworICAgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgICAgbG9vcGVkID0gVFJVRTsKKyAgfQorfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9sb29wKQoreworICBHc3RFbGVtZW50ICpiaW4sICpzcmMxLCAqc3JjMiwgKnZpZGVvbWl4ZXIsICpzaW5rOworICBHc3RCdXMgKmJ1czsKKyAgR3N0RXZlbnQgKnNlZWtfZXZlbnQ7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHN0YXRlX3JlczsKKyAgZ2Jvb2xlYW4gcmVzOworCisgIEdTVF9JTkZPICgicHJlcGFyaW5nIHRlc3QiKTsKKworICAvKiBidWlsZCBwaXBlbGluZSAqLworICBiaW4gPSBnc3RfcGlwZWxpbmVfbmV3ICgicGlwZWxpbmUiKTsKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAoYmluKTsKKyAgZ3N0X2J1c19hZGRfc2lnbmFsX3dhdGNoX2Z1bGwgKGJ1cywgR19QUklPUklUWV9ISUdIKTsKKworICBzcmMxID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW90ZXN0c3JjIiwgInNyYzEiKTsKKyAgc3JjMiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsICJzcmMyIik7CisgIHZpZGVvbWl4ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb21peGVyIiwgInZpZGVvbWl4ZXIiKTsKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgInNpbmsiKTsKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAoYmluKSwgc3JjMSwgc3JjMiwgdmlkZW9taXhlciwgc2luaywgTlVMTCk7CisKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGluayAoc3JjMSwgdmlkZW9taXhlcik7CisgIGZhaWxfdW5sZXNzIChyZXMgPT0gVFJVRSwgTlVMTCk7CisgIHJlcyA9IGdzdF9lbGVtZW50X2xpbmsgKHNyYzIsIHZpZGVvbWl4ZXIpOworICBmYWlsX3VubGVzcyAocmVzID09IFRSVUUsIE5VTEwpOworICByZXMgPSBnc3RfZWxlbWVudF9saW5rICh2aWRlb21peGVyLCBzaW5rKTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKworICBzZWVrX2V2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWVrICgxLjAsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgIEdTVF9TRUVLX0ZMQUdfU0VHTUVOVCB8IEdTVF9TRUVLX0ZMQUdfRkxVU0gsCisgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgKEdzdENsb2NrVGltZSkgMCwgR1NUX1NFRUtfVFlQRV9TRVQsCisgICAgICAoR3N0Q2xvY2tUaW1lKSAyICogR1NUX1NFQ09ORCk7CisKKyAgbWFpbl9sb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OnNlZ21lbnQtZG9uZSIsCisgICAgICAoR0NhbGxiYWNrKSBsb29wX3NlZ21lbnRfZG9uZSwgYmluKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6ZXJyb3IiLCAoR0NhbGxiYWNrKSBtZXNzYWdlX3JlY2VpdmVkLCBiaW4pOworICBnX3NpZ25hbF9jb25uZWN0IChidXMsICJtZXNzYWdlOjp3YXJuaW5nIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6ZW9zIiwgKEdDYWxsYmFjaykgbWVzc2FnZV9yZWNlaXZlZCwgYmluKTsKKworICBHU1RfSU5GTyAoInN0YXJ0aW5nIHRlc3QiKTsKKworICAvKiBwcmVwYXJlIHBsYXlpbmcgKi8KKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9QQVVTRUQpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgLyogd2FpdCBmb3IgY29tcGxldGlvbiAqLworICBzdGF0ZV9yZXMgPQorICAgICAgZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChHU1RfRUxFTUVOVCAoYmluKSwgTlVMTCwgTlVMTCwKKyAgICAgIEdTVF9DTE9DS19USU1FX05PTkUpOworICBja19hc3NlcnRfaW50X25lIChzdGF0ZV9yZXMsIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSk7CisKKyAgcmVzID0gZ3N0X2VsZW1lbnRfc2VuZF9ldmVudCAoYmluLCBzZWVrX2V2ZW50KTsKKyAgZmFpbF91bmxlc3MgKHJlcyA9PSBUUlVFLCBOVUxMKTsKKworICAvKiBydW4gcGlwZWxpbmUgKi8KKyAgc3RhdGVfcmVzID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgY2tfYXNzZXJ0X2ludF9uZSAoc3RhdGVfcmVzLCBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUpOworCisgIEdTVF9JTkZPICgicnVubmluZyBtYWluIGxvb3AiKTsKKyAgZ19tYWluX2xvb3BfcnVuIChtYWluX2xvb3ApOworCisgIHN0YXRlX3JlcyA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgLyogY2xlYW51cCAqLworICBnX21haW5fbG9vcF91bnJlZiAobWFpbl9sb29wKTsKKyAgZ3N0X2J1c19yZW1vdmVfc2lnbmFsX3dhdGNoIChidXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChiaW4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKKyNpZiAwCitHU1RfU1RBUlRfVEVTVCAodGVzdF9mbHVzaF9zdGFydF9mbHVzaF9zdG9wKQoreworICBHc3RQYWRUZW1wbGF0ZSAqc2lua190ZW1wbGF0ZTsKKyAgR3N0UGFkICp0bXBwYWQsICpzaW5rcGFkMSwgKnNpbmtwYWQyLCAqdmlkZW9taXhlcl9zcmM7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lLCAqc3JjMSwgKnNyYzIsICp2aWRlb21peGVyLCAqc2luazsKKworICBHU1RfSU5GTyAoInByZXBhcmluZyB0ZXN0Iik7CisKKyAgLyogYnVpbGQgcGlwZWxpbmUgKi8KKyAgcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3ICgicGlwZWxpbmUiKTsKKyAgc3JjMSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsICJzcmMxIik7CisgIHNyYzIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCAic3JjMiIpOworICB2aWRlb21peGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW9taXhlciIsICJ2aWRlb21peGVyIik7CisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJzaW5rIik7CisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjMSwgc3JjMiwgdmlkZW9taXhlciwgc2luaywgTlVMTCk7CisKKyAgc2lua190ZW1wbGF0ZSA9CisgICAgICBnc3RfZWxlbWVudF9jbGFzc19nZXRfcGFkX3RlbXBsYXRlIChHU1RfRUxFTUVOVF9HRVRfQ0xBU1MgKHZpZGVvbWl4ZXIpLAorICAgICAgInNpbmtfJXUiKTsKKyAgZmFpbF91bmxlc3MgKEdTVF9JU19QQURfVEVNUExBVEUgKHNpbmtfdGVtcGxhdGUpKTsKKyAgc2lua3BhZDEgPSBnc3RfZWxlbWVudF9yZXF1ZXN0X3BhZCAodmlkZW9taXhlciwgc2lua190ZW1wbGF0ZSwgTlVMTCwgTlVMTCk7CisgIHRtcHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzcmMxLCAic3JjIik7CisgIGdzdF9wYWRfbGluayAodG1wcGFkLCBzaW5rcGFkMSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHRtcHBhZCk7CisKKyAgc2lua3BhZDIgPSBnc3RfZWxlbWVudF9yZXF1ZXN0X3BhZCAodmlkZW9taXhlciwgc2lua190ZW1wbGF0ZSwgTlVMTCwgTlVMTCk7CisgIHRtcHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChzcmMyLCAic3JjIik7CisgIGdzdF9wYWRfbGluayAodG1wcGFkLCBzaW5rcGFkMik7CisgIGdzdF9vYmplY3RfdW5yZWYgKHRtcHBhZCk7CisKKyAgZ3N0X2VsZW1lbnRfbGluayAodmlkZW9taXhlciwgc2luayk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChwaXBlbGluZSwgTlVMTCwgTlVMTCwKKyAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIHZpZGVvbWl4ZXJfc3JjID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHZpZGVvbWl4ZXIsICJzcmMiKTsKKyAgZmFpbF9pZiAoR1NUX1BBRF9JU19GTFVTSElORyAodmlkZW9taXhlcl9zcmMpKTsKKyAgZ3N0X3BhZF9zZW5kX2V2ZW50IChzaW5rcGFkMSwgZ3N0X2V2ZW50X25ld19mbHVzaF9zdGFydCAoKSk7CisgIGZhaWxfdW5sZXNzIChHU1RfUEFEX0lTX0ZMVVNISU5HICh2aWRlb21peGVyX3NyYykpOworICBnc3RfcGFkX3NlbmRfZXZlbnQgKHNpbmtwYWQxLCBnc3RfZXZlbnRfbmV3X2ZsdXNoX3N0b3AgKFRSVUUpKTsKKyAgZmFpbF9pZiAoR1NUX1BBRF9JU19GTFVTSElORyAodmlkZW9taXhlcl9zcmMpKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodmlkZW9taXhlcl9zcmMpOworCisgIC8qIGNsZWFudXAgKi8KKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkMSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQyKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworfQorCitHU1RfRU5EX1RFU1Q7CisjZW5kaWYKKworc3RhdGljIFN1aXRlICoKK3ZpZGVvbWl4ZXJfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgidmlkZW9taXhlciIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9jYXBzKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2V2ZW50KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3BsYXlfdHdpY2UpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGxheV90d2ljZV90aGVuX2FkZF9hbmRfcGxheV9hZ2Fpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hZGRfcGFkKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3JlbW92ZV9wYWQpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfY2xpcCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9kdXJhdGlvbl9pc19tYXgpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZHVyYXRpb25fdW5rbm93bl9vdmVycmlkZXMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfbG9vcCk7CisgIC8qIFRoaXMgdGVzdCBpcyByYWN5IGFuZCBvY2Nhc2lvbmFsbHkgZmFpbHMgaW4gaW50ZXJlc3Rpbmcgd2F5cworICAgKiBqdXN0IGxpa2UgdGhlIGNvcnJlc3BvbmRpbmcgYWRkZXIgdGVzdCBkb2VzL2RpZCwgc2VlCisgICAqIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD03MDg4OTEKKyAgICogSXQncyB1bmxpa2VseSB0aGF0IGl0IHdpbGwgZXZlciBiZSBmaXhlZCBmb3IgdmlkZW9taXhlci9jb2xsZWN0cGFkcywKKyAgICogYXMgaXQgd29ya3MgZmluZSB3aXRoIGNvbXBvc2l0b3IgKi8KKyNpZiAwCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9mbHVzaF9zdGFydF9mbHVzaF9zdG9wKTsKKyNlbmRpZgorCisgIC8qIFVzZSBhIGxvbmdlciB0aW1lb3V0ICovCisjaWZkZWYgSEFWRV9WQUxHUklORAorICBpZiAoUlVOTklOR19PTl9WQUxHUklORCkgeworICAgIHRjYXNlX3NldF90aW1lb3V0ICh0Y19jaGFpbiwgNSAqIDYwKTsKKyAgfSBlbHNlCisjZW5kaWYKKyAgeworICAgIC8qIHRoaXMgaXMgc2hvcnRlciB0aGFuIHRoZSBkZWZhdWx0IDYwIHNlY29uZHM/ISAodHBtKSAqLworICAgIC8qIHRjYXNlX3NldF90aW1lb3V0ICh0Y19jaGFpbiwgNik7ICovCisgIH0KKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHZpZGVvbWl4ZXIpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvdnA4ZGVjLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy92cDhkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWJkNzBhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvdnA4ZGVjLmMKQEAgLTAsMCArMSwyNjYgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgSTQyMCwgIgorICAgICAgICAid2lkdGggPSAoaW50KSBbMSwgTUFYXSwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgWzEsIE1BWF0sICIgImZyYW1lcmF0ZSA9IChmcmFjdGlvbikgWzAsIE1BWF0iKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgSTQyMCwgIgorICAgICAgICAid2lkdGggPSAoaW50KSBbMSwgTUFYXSwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgWzEsIE1BWF0sICIgImZyYW1lcmF0ZSA9IChmcmFjdGlvbikgWzAsIE1BWF0iKSk7CisKK3N0YXRpYyBHc3RQYWQgKnNpbmtwYWQsICpzcmNwYWQ7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX3ZwOGRlYyAoY29uc3QgZ2NoYXIgKiBzcmNfY2Fwc19zdHIpCit7CisgIEdzdEVsZW1lbnQgKmJpbjsKKyAgR3N0RWxlbWVudCAqdnA4ZW5jLCAqdnA4ZGVjOworICBHc3RDYXBzICpzcmNjYXBzID0gTlVMTDsKKyAgR3N0QnVzICpidXM7CisgIEdzdFBhZCAqZ2hvc3RwYWQsICp0YXJnZXRwYWQ7CisKKyAgaWYgKHNyY19jYXBzX3N0cikgeworICAgIHNyY2NhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoc3JjX2NhcHNfc3RyKTsKKyAgICBmYWlsX3VubGVzcyAoc3JjY2FwcyAhPSBOVUxMKTsKKyAgfQorCisgIGJpbiA9IGdzdF9iaW5fbmV3ICgiYmluIik7CisKKyAgdnA4ZW5jID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJ2cDhlbmMiKTsKKyAgZmFpbF91bmxlc3MgKHZwOGVuYyAhPSBOVUxMKTsKKyAgdnA4ZGVjID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJ2cDhkZWMiKTsKKyAgZmFpbF91bmxlc3MgKHZwOGRlYyAhPSBOVUxMKTsKKworICBnX29iamVjdF9zZXQgKHZwOGVuYywgIm5hbWUiLCAiZW5jb2RlciIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHZwOGRlYywgIm5hbWUiLCAiZGVjb2RlciIsIE5VTEwpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKGJpbiksIHZwOGVuYywgdnA4ZGVjLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmtfcGFkcyAodnA4ZW5jLCAic3JjIiwgdnA4ZGVjLCAic2luayIpKTsKKworICB0YXJnZXRwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAodnA4ZW5jLCAic2luayIpOworICBmYWlsX3VubGVzcyAodGFyZ2V0cGFkICE9IE5VTEwpOworICBnaG9zdHBhZCA9IGdzdF9naG9zdF9wYWRfbmV3ICgic2luayIsIHRhcmdldHBhZCk7CisgIGZhaWxfdW5sZXNzIChnaG9zdHBhZCAhPSBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoYmluLCBnaG9zdHBhZCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHRhcmdldHBhZCk7CisKKyAgdGFyZ2V0cGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHZwOGRlYywgInNyYyIpOworICBmYWlsX3VubGVzcyAodGFyZ2V0cGFkICE9IE5VTEwpOworICBnaG9zdHBhZCA9IGdzdF9naG9zdF9wYWRfbmV3ICgic3JjIiwgdGFyZ2V0cGFkKTsKKyAgZmFpbF91bmxlc3MgKGdob3N0cGFkICE9IE5VTEwpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIGdob3N0cGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAodGFyZ2V0cGFkKTsKKworICBzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoYmluLCAmc3JjdGVtcGxhdGUpOworICBzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkIChiaW4sICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc2lua3BhZCwgVFJVRSk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKHNyY3BhZCwgYmluLCBzcmNjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworCisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBnc3RfZWxlbWVudF9zZXRfYnVzIChiaW4sIGJ1cyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgaWYgKHNyY2NhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIGJ1ZmZlcnMgPSBOVUxMOworICByZXR1cm4gYmluOworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF92cDhkZWMgKEdzdEVsZW1lbnQgKiBiaW4pCit7CisgIEdzdEJ1cyAqYnVzOworCisgIC8qIEZyZWUgcGFyc2VkIGJ1ZmZlcnMgKi8KKyAgZ3N0X2NoZWNrX2Ryb3BfYnVmZmVycyAoKTsKKworICBidXMgPSBHU1RfRUxFTUVOVF9CVVMgKGJpbik7CisgIGdzdF9idXNfc2V0X2ZsdXNoaW5nIChidXMsIFRSVUUpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc3JjcGFkLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc2lua3BhZCwgRkFMU0UpOworCisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkIChiaW4pOworICBnc3RfY2hlY2tfdGVhcmRvd25fc2lua19wYWQgKGJpbik7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50IChiaW4pOworfQorCitzdGF0aWMgdm9pZAorX2dzdF92cDhfdGVzdF9jaGVja19vdXRwdXRfY2FwcyAoZ2ludCB3aWR0aCwgZ2ludCBoZWlnaHQsIGdpbnQgZnBzX24sCisgICAgZ2ludCBmcHNfZCkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisgIGdpbnQgY2Fwc193LCBjYXBzX2gsIGNhcHNfZnBzbiwgY2Fwc19mcHNkOworCisgIGNhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKHNpbmtwYWQpOworICBmYWlsX3VubGVzcyAoY2FwcyAhPSBOVUxMKTsKKyAgc3RydWN0dXJlID0gZ3N0X2NhcHNfZ2V0X3N0cnVjdHVyZSAoY2FwcywgMCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ludCAoc3RydWN0dXJlLCAid2lkdGgiLCAmY2Fwc193KSk7CisgIGZhaWxfdW5sZXNzIChnc3Rfc3RydWN0dXJlX2dldF9pbnQgKHN0cnVjdHVyZSwgImhlaWdodCIsICZjYXBzX2gpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2ZyYWN0aW9uIChzdHJ1Y3R1cmUsICJmcmFtZXJhdGUiLCAmY2Fwc19mcHNuLAorICAgICAgICAgICZjYXBzX2Zwc2QpKTsKKworICBmYWlsX3VubGVzcyAod2lkdGggPT0gY2Fwc193KTsKKyAgZmFpbF91bmxlc3MgKGhlaWdodCA9PSBjYXBzX2gpOworICBmYWlsX3VubGVzcyAoZnBzX24gPT0gY2Fwc19mcHNuKTsKKyAgZmFpbF91bmxlc3MgKGZwc19kID09IGNhcHNfZnBzZCk7CisKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9kZWNvZGVfc2ltcGxlKQoreworICBHc3RFbGVtZW50ICpiaW47CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBnaW50IGk7CisgIEdMaXN0ICpsOworICBHc3RTZWdtZW50IHNlZzsKKworICBiaW4gPQorICAgICAgc2V0dXBfdnA4ZGVjCisgICAgICAoInZpZGVvL3gtcmF3LGZvcm1hdD0oc3RyaW5nKUk0MjAsd2lkdGg9KGludCkzMjAsaGVpZ2h0PShpbnQpMjQwLGZyYW1lcmF0ZT0oZnJhY3Rpb24pMjUvMSIpOworCisgIGdzdF9zZWdtZW50X2luaXQgKCZzZWcsIEdTVF9GT1JNQVRfVElNRSk7CisgIHNlZy5zdG9wID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlICgyMCwgR1NUX1NFQ09ORCwgMjUpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZykpKTsKKworICBidWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKDMyMCAqIDI0MCArIDIgKiAxNjAgKiAxMjApOworICBnc3RfYnVmZmVyX21lbXNldCAoYnVmZmVyLCAwLCAwLCAtMSk7CisKKyAgZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoaSwgR1NUX1NFQ09ORCwgMjUpOworICAgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcikgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKDEsIEdTVF9TRUNPTkQsIDI1KTsKKyAgICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChzcmNwYWQsIGdzdF9idWZmZXJfcmVmIChidWZmZXIpKSA9PSBHU1RfRkxPV19PSyk7CisgIH0KKworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKHNyY3BhZCwgZ3N0X2V2ZW50X25ld19lb3MgKCkpKTsKKworICAvKiBBbGwgYnVmZmVycyBtdXN0IGJlIHRoZXJlIG5vdyAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMjApOworCisgIGZvciAobCA9IGJ1ZmZlcnMsIGkgPSAwOyBsOyBsID0gbC0+bmV4dCwgaSsrKSB7CisgICAgYnVmZmVyID0gbC0+ZGF0YTsKKworICAgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpLAorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGksIEdTVF9TRUNPTkQsIDI1KSk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSwKKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlICgxLCBHU1RfU0VDT05ELCAyNSkpOworICB9CisKKyAgY2xlYW51cF92cDhkZWMgKGJpbik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9kZWNvZGVfY2Fwc19jaGFuZ2UpCit7CisgIEdzdEVsZW1lbnQgKmJpbjsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdzdFNlZ21lbnQgc2VnOworICBHc3RFbGVtZW50ICplbmNvZGVyOworICBHc3RDYXBzICpjYXBzOworCisgIGJpbiA9CisgICAgICBzZXR1cF92cDhkZWMKKyAgICAgICgidmlkZW8veC1yYXcsZm9ybWF0PShzdHJpbmcpSTQyMCx3aWR0aD0oaW50KTMyMCxoZWlnaHQ9KGludCkyNDAsZnJhbWVyYXRlPShmcmFjdGlvbikyNS8xIik7CisKKyAgZ3N0X3NlZ21lbnRfaW5pdCAoJnNlZywgR1NUX0ZPUk1BVF9USU1FKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWcpKSk7CisKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgzMjAgKiAyNDAgKyAyICogMTYwICogMTIwKTsKKyAgZ3N0X2J1ZmZlcl9tZW1zZXQgKGJ1ZmZlciwgMCwgMCwgLTEpOworCisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlICgwLCBHU1RfU0VDT05ELCAyNSk7CisgIEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlcikgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKDEsIEdTVF9TRUNPTkQsIDI1KTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAoc3JjcGFkLCBidWZmZXIpID09IEdTVF9GTE9XX09LKTsKKworICAvKiBhdCB0aGlzIHBvaW50LCB0aGUgb3V0cHV0IGNhcHMgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBpbnB1dCAqLworICBfZ3N0X3ZwOF90ZXN0X2NoZWNrX291dHB1dF9jYXBzICgzMjAsIDI0MCwgMjUsIDEpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGdfbGlzdF9mcmVlX2Z1bGwgKGJ1ZmZlcnMsIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIC8qIG5vdyBjaGFuZ2UgdGhlIGNhcHMgKi8KKyAgZW5jb2RlciA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKGJpbiksICJlbmNvZGVyIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZW5jb2RlciwgR1NUX1NUQVRFX05VTEwpOworICBnc3RfZWxlbWVudF9zeW5jX3N0YXRlX3dpdGhfcGFyZW50IChlbmNvZGVyKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoZW5jb2Rlcik7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZworICAgICAgKCJ2aWRlby94LXJhdyxmb3JtYXQ9KHN0cmluZylJNDIwLHdpZHRoPShpbnQpNjQsIgorICAgICAgImhlaWdodD0oaW50KTMyLGZyYW1lcmF0ZT0oZnJhY3Rpb24pMzAvMSIpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmNwYWQsIGdzdF9ldmVudF9uZXdfY2FwcyAoY2FwcykpKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWcpKSk7CisgIGJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoNjQgKiAzMiArIDIgKiAzMiAqIDE2KTsKKyAgZ3N0X2J1ZmZlcl9tZW1zZXQgKGJ1ZmZlciwgMCwgMCwgLTEpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcikgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKDAsIEdTVF9TRUNPTkQsIDMwKTsKKyAgR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoMSwgR1NUX1NFQ09ORCwgMzApOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoIChzcmNwYWQsIGJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworCisgIC8qIGF0IHRoaXMgcG9pbnQsIHRoZSBvdXRwdXQgY2FwcyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIGlucHV0ICovCisgIF9nc3RfdnA4X3Rlc3RfY2hlY2tfb3V0cHV0X2NhcHMgKDY0LCAzMiwgMzAsIDEpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMSk7CisgIGdfbGlzdF9mcmVlX2Z1bGwgKGJ1ZmZlcnMsIChHRGVzdHJveU5vdGlmeSkgZ3N0X2J1ZmZlcl91bnJlZik7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGNsZWFudXBfdnA4ZGVjIChiaW4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworc3RhdGljIFN1aXRlICoKK3ZwOGRlY19zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJ2cDhkZWMiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9kZWNvZGVfc2ltcGxlKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2RlY29kZV9jYXBzX2NoYW5nZSk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOICh2cDhkZWMpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvdnA4ZW5jLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy92cDhlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmIxZDkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvdnA4ZW5jLmMKQEAgLTAsMCArMSwxNjggQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzaW5rdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNpbmsiLAorICAgIEdTVF9QQURfU0lOSywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXZwOCwgIgorICAgICAgICAid2lkdGggPSAoaW50KSBbMSwgTUFYXSwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgWzEsIE1BWF0sICIgImZyYW1lcmF0ZSA9IChmcmFjdGlvbikgWzAsIE1BWF0iKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJ2aWRlby94LXJhdywgIgorICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgSTQyMCwgIgorICAgICAgICAid2lkdGggPSAoaW50KSBbMSwgTUFYXSwgIgorICAgICAgICAiaGVpZ2h0ID0gKGludCkgWzEsIE1BWF0sICIgImZyYW1lcmF0ZSA9IChmcmFjdGlvbikgWzAsIE1BWF0iKSk7CisKK3N0YXRpYyBHc3RQYWQgKnNpbmtwYWQsICpzcmNwYWQ7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX3ZwOGVuYyAoY29uc3QgZ2NoYXIgKiBzcmNfY2Fwc19zdHIpCit7CisgIEdzdEVsZW1lbnQgKnZwOGVuYzsKKyAgR3N0Q2FwcyAqc3JjY2FwcyA9IE5VTEw7CisgIEdzdEJ1cyAqYnVzOworCisgIGlmIChzcmNfY2Fwc19zdHIpIHsKKyAgICBzcmNjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKHNyY19jYXBzX3N0cik7CisgICAgZmFpbF91bmxlc3MgKHNyY2NhcHMgIT0gTlVMTCk7CisgIH0KKworICB2cDhlbmMgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoInZwOGVuYyIpOworICBmYWlsX3VubGVzcyAodnA4ZW5jICE9IE5VTEwpOworICBzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAodnA4ZW5jLCAmc3JjdGVtcGxhdGUpOworICBzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkICh2cDhlbmMsICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKHNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc2lua3BhZCwgVFJVRSk7CisgIGdzdF9jaGVja19zZXR1cF9ldmVudHMgKHNyY3BhZCwgdnA4ZW5jLCBzcmNjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworCisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworICBnc3RfZWxlbWVudF9zZXRfYnVzICh2cDhlbmMsIGJ1cyk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAodnA4ZW5jLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSAhPSBHU1RfU1RBVEVfQ0hBTkdFX0ZBSUxVUkUsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgaWYgKHNyY2NhcHMpCisgICAgZ3N0X2NhcHNfdW5yZWYgKHNyY2NhcHMpOworCisgIGJ1ZmZlcnMgPSBOVUxMOworICByZXR1cm4gdnA4ZW5jOworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF92cDhlbmMgKEdzdEVsZW1lbnQgKiB2cDhlbmMpCit7CisgIEdzdEJ1cyAqYnVzOworCisgIC8qIEZyZWUgcGFyc2VkIGJ1ZmZlcnMgKi8KKyAgZ3N0X2NoZWNrX2Ryb3BfYnVmZmVycyAoKTsKKworICBidXMgPSBHU1RfRUxFTUVOVF9CVVMgKHZwOGVuYyk7CisgIGdzdF9idXNfc2V0X2ZsdXNoaW5nIChidXMsIFRSVUUpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc3JjcGFkLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAoc2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAodnA4ZW5jKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkICh2cDhlbmMpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAodnA4ZW5jKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZW5jb2RlX3NpbXBsZSkKK3sKKyAgR3N0RWxlbWVudCAqdnA4ZW5jOworICBHc3RCdWZmZXIgKmJ1ZmZlcjsKKyAgZ2ludCBpOworICBHTGlzdCAqbDsKKyAgR3N0Q2FwcyAqb3V0Y2FwczsKKyAgR3N0U2VnbWVudCBzZWc7CisKKyAgdnA4ZW5jID0KKyAgICAgIHNldHVwX3ZwOGVuYworICAgICAgKCJ2aWRlby94LXJhdyxmb3JtYXQ9KHN0cmluZylJNDIwLHdpZHRoPShpbnQpMzIwLGhlaWdodD0oaW50KTI0MCxmcmFtZXJhdGU9KGZyYWN0aW9uKTI1LzEiKTsKKworICBnX29iamVjdF9zZXQgKHZwOGVuYywgImxhZy1pbi1mcmFtZXMiLCA1LCBOVUxMKTsKKworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnLCBHU1RfRk9STUFUX1RJTUUpOworICBzZWcuc3RvcCA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoMjAsIEdTVF9TRUNPTkQsIDI1KTsKKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAoc3JjcGFkLCBnc3RfZXZlbnRfbmV3X3NlZ21lbnQgKCZzZWcpKSk7CisKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jICgzMjAgKiAyNDAgKyAyICogMTYwICogMTIwKTsKKyAgZ3N0X2J1ZmZlcl9tZW1zZXQgKGJ1ZmZlciwgMCwgMCwgLTEpOworCisgIGZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGJ1ZmZlcikgPSBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGksIEdTVF9TRUNPTkQsIDI1KTsKKyAgICBHU1RfQlVGRkVSX0RVUkFUSU9OIChidWZmZXIpID0gZ3N0X3V0aWxfdWludDY0X3NjYWxlICgxLCBHU1RfU0VDT05ELCAyNSk7CisgICAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaCAoc3JjcGFkLCBnc3RfYnVmZmVyX3JlZiAoYnVmZmVyKSkgPT0gR1NUX0ZMT1dfT0spOworICB9CisKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKworICAvKiBPbmx5IDUgYnVmZmVycyBhcmUgYWxsb3dlZCB0byBiZSBxdWV1ZWQgbm93ICovCisgIGZhaWxfdW5sZXNzIChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSA+IDE1KTsKKworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9wdXNoX2V2ZW50IChzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisKKworICAvKiBBbGwgYnVmZmVycyBtdXN0IGJlIHRoZXJlIG5vdyAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnX2xpc3RfbGVuZ3RoIChidWZmZXJzKSwgMjApOworCisgIG91dGNhcHMgPQorICAgICAgZ3N0X2NhcHNfZnJvbV9zdHJpbmcKKyAgICAgICgidmlkZW8veC12cDgsd2lkdGg9KGludCkzMjAsaGVpZ2h0PShpbnQpMjQwLGZyYW1lcmF0ZT0oZnJhY3Rpb24pMjUvMSIpOworCisgIGZvciAobCA9IGJ1ZmZlcnMsIGkgPSAwOyBsOyBsID0gbC0+bmV4dCwgaSsrKSB7CisgICAgYnVmZmVyID0gbC0+ZGF0YTsKKworICAgIGlmIChpID09IDApCisgICAgICBmYWlsX2lmIChHU1RfQlVGRkVSX0ZMQUdfSVNfU0VUIChidWZmZXIsIEdTVF9CVUZGRVJfRkxBR19ERUxUQV9VTklUKSk7CisKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfdWludDY0IChHU1RfQlVGRkVSX1RJTUVTVEFNUCAoYnVmZmVyKSwKKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlIChpLCBHU1RfU0VDT05ELCAyNSkpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfRFVSQVRJT04gKGJ1ZmZlciksCisgICAgICAgIGdzdF91dGlsX3VpbnQ2NF9zY2FsZSAoMSwgR1NUX1NFQ09ORCwgMjUpKTsKKyAgfQorCisgIGdzdF9jYXBzX3VucmVmIChvdXRjYXBzKTsKKworICBjbGVhbnVwX3ZwOGVuYyAodnA4ZW5jKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgordnA4ZW5jX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInZwOGVuYyIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2VuY29kZV9zaW1wbGUpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAodnA4ZW5jKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3ZwOWVuYy5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvdnA5ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiZTBlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3ZwOWVuYy5jCkBAIC0wLDAgKzEsNzggQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBTdGlhbiBTZWxuZXMgPHN0aWFuQHBleGlwLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RoYXJuZXNzLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVvLmg+CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2VuY29kZV9sYWdfaW5fZnJhbWVzKQoreworICBHc3RIYXJuZXNzICpoID0gZ3N0X2hhcm5lc3NfbmV3X3BhcnNlICgidnA5ZW5jIGxhZy1pbi1mcmFtZXM9NSBjcHUtdXNlZD04ICIKKyAgICAgICJkZWFkbGluZT0xIik7CisgIGdpbnQgaTsKKworICBnc3RfaGFybmVzc19hZGRfc3JjX3BhcnNlIChoLCAidmlkZW90ZXN0c3JjIGlzLWxpdmU9dHJ1ZSBwYXR0ZXJuPWJsYWNrICEgIgorICAgICAgImNhcHNmaWx0ZXIgY2Fwcz1cInZpZGVvL3gtcmF3LHdpZHRoPTMyMCxoZWlnaHQ9MjQwLGZyYW1lcmF0ZT0yNS8xXCIiLAorICAgICAgVFJVRSk7CisKKyAgLyogUHVzaCAyMCBidWZmZXJzIGludG8gdGhlIGVuY29kZXIgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0ZMT1dfT0ssCisgICAgICBnc3RfaGFybmVzc19zcmNfY3JhbmtfYW5kX3B1c2hfbWFueSAoaCwgMjAsIDIwKSk7CisKKyAgLyogT25seSA1IGJ1ZmZlcnMgYXJlIGFsbG93ZWQgdG8gYmUgcXVldWVkIG5vdyAqLworICBmYWlsX3VubGVzcyAoZ3N0X2hhcm5lc3NfYnVmZmVyc19yZWNlaXZlZCAoaCkgPiAxNSk7CisKKyAgLyogRU9TIHdpbGwgY2F1c2UgdGhlIHJlbWFpbmluZyBidWZmZXJzIHRvIGJlIGRyYWluZWQgKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9oYXJuZXNzX3B1c2hfZXZlbnQgKGgsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9oYXJuZXNzX2J1ZmZlcnNfcmVjZWl2ZWQgKGgpLCAyMCk7CisKKyAgZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICBHc3RCdWZmZXIgKmJ1ZmZlciA9IGdzdF9oYXJuZXNzX3B1bGwgKGgpOworCisgICAgaWYgKGkgPT0gMCkKKyAgICAgIGZhaWxfaWYgKEdTVF9CVUZGRVJfRkxBR19JU19TRVQgKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0RFTFRBX1VOSVQpKTsKKworICAgIGZhaWxfdW5sZXNzX2VxdWFsc191aW50NjQgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChidWZmZXIpLAorICAgICAgICBnc3RfdXRpbF91aW50NjRfc2NhbGUgKGksIEdTVF9TRUNPTkQsIDI1KSk7CisgICAgZmFpbF91bmxlc3NfZXF1YWxzX3VpbnQ2NCAoR1NUX0JVRkZFUl9EVVJBVElPTiAoYnVmZmVyKSwKKyAgICAgICAgZ3N0X3V0aWxfdWludDY0X3NjYWxlICgxLCBHU1RfU0VDT05ELCAyNSkpOworCisgICAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgfQorCisgIGdzdF9oYXJuZXNzX3RlYXJkb3duIChoKTsKK30KKworR1NUX0VORF9URVNUOworCisKK3N0YXRpYyBTdWl0ZSAqCit2cDllbmNfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgidnA5ZW5jIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZW5jb2RlX2xhZ19pbl9mcmFtZXMpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAodnA5ZW5jKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tkZWMuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2VkMDVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja2RlYy5jCkBAIC0wLDAgKzEsMjQzIEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIHdhdnBhY2tkZWMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitzdGF0aWMgR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKKworI2lmIEdfQllURV9PUkRFUiA9PSBHX0JJR19FTkRJQU4KKyNkZWZpbmUgQVVESU9fRk9STUFUICJTMTZCRSIKKyNlbHNlCisjZGVmaW5lIEFVRElPX0ZPUk1BVCAiUzE2TEUiCisjZW5kaWYKKworZ3VpbnQ4IHRlc3RfZnJhbWVbXSA9IHsKKyAgMHg3NywgMHg3NiwgMHg3MCwgMHg2QiwgICAgICAgLyogInd2cGsiICovCisgIDB4MkUsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgIC8qIGNrU2l6ZSAqLworICAweDA0LCAweDA0LCAgICAgICAgICAgICAgICAgICAvKiB2ZXJzaW9uICovCisgIDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRyYWNrX25vICovCisgIDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4X25vICovCisgIDB4MDAsIDB4NjQsIDB4MDAsIDB4MDAsICAgICAgIC8qIHRvdGFsX3NhbXBsZXMgKi8KKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgLyogYmxvY2tfaW5kZXggKi8KKyAgMHgwMCwgMHg2NCwgMHgwMCwgMHgwMCwgICAgICAgLyogYmxvY2tfc2FtcGxlcyAqLworICAweDA1LCAweDE4LCAweDgwLCAweDA0LCAgICAgICAvKiBmbGFncyAqLworICAweEZGLCAweEFGLCAweDgwLCAweDYwLCAgICAgICAvKiBjcmMgKi8KKyAgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwgICAgICAgLyogZGF0YSAqLworICAweDA0LCAweDAwLCAweDA1LCAweDAzLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDhBLCAweDAyLAorICAweDAwLCAweDAwLCAweEZGLCAweDdGLAorICAweDAwLCAweEU0LAorfTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtcmF3LCAiCisgICAgICAgICJmb3JtYXQgPSAoc3RyaW5nKSAiIEFVRElPX0ZPUk1BVCAiLCAiCisgICAgICAgICJsYXlvdXQgPSAoc3RyaW5nKSBpbnRlcmxlYXZlZCwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiICJyYXRlID0gKGludCkgNDQxMDAiKQorICAgICk7CisKKyNkZWZpbmUgV0FWUEFDS19DQVBTICJhdWRpby94LXdhdnBhY2ssICIgXAorICAgICAgICAiZGVwdGggPSAoaW50KSAxNiwgIiBcCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgInJhdGUgPSAoaW50KSA0NDEwMCwgIiAiZnJhbWVkID0gKGJvb2xlYW4pIHRydWUiCisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKFdBVlBBQ0tfQ0FQUykKKyAgICApOworCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF93YXZwYWNrZGVjICh2b2lkKQoreworICBHc3RFbGVtZW50ICp3YXZwYWNrZGVjOworICBHc3RDYXBzICpjYXBzOworCisgIEdTVF9ERUJVRyAoInNldHVwX3dhdnBhY2tkZWMiKTsKKyAgd2F2cGFja2RlYyA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgid2F2cGFja2RlYyIpOworICBteXNyY3BhZCA9IGdzdF9jaGVja19zZXR1cF9zcmNfcGFkICh3YXZwYWNrZGVjLCAmc3JjdGVtcGxhdGUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKHdhdnBhY2tkZWMsICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoV0FWUEFDS19DQVBTKTsKKyAgZ3N0X2NoZWNrX3NldHVwX2V2ZW50cyAobXlzcmNwYWQsIHdhdnBhY2tkZWMsIGNhcHMsIEdTVF9GT1JNQVRfVElNRSk7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlICh3YXZwYWNrZGVjLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgcmV0dXJuIHdhdnBhY2tkZWM7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX3dhdnBhY2tkZWMgKEdzdEVsZW1lbnQgKiB3YXZwYWNrZGVjKQoreworICBHU1RfREVCVUcgKCJjbGVhbnVwX3dhdnBhY2tkZWMiKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlICh3YXZwYWNrZGVjLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAod2F2cGFja2RlYyk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAod2F2cGFja2RlYyk7CisgIGdzdF9jaGVja190ZWFyZG93bl9lbGVtZW50ICh3YXZwYWNrZGVjKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZGVjb2RlX2ZyYW1lKQoreworICBHc3RFbGVtZW50ICp3YXZwYWNrZGVjOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RCdXMgKmJ1czsKKyAgaW50IGk7CisgIEdzdE1hcEluZm8gbWFwOworCisgIHdhdnBhY2tkZWMgPSBzZXR1cF93YXZwYWNrZGVjICgpOworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZW9mICh0ZXN0X2ZyYW1lKSk7CisgIGdzdF9idWZmZXJfZmlsbCAoaW5idWZmZXIsIDAsIHRlc3RfZnJhbWUsIHNpemVvZiAodGVzdF9mcmFtZSkpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworCisgIGdzdF9lbGVtZW50X3NldF9idXMgKHdhdnBhY2tkZWMsIGJ1cyk7CisKKyAgLyogc2hvdWxkIGRlY29kZSB0aGUgYnVmZmVyIHdpdGhvdXQgcHJvYmxlbXMgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpLCBHU1RfRkxPV19PSyk7CisKKyAgb3V0YnVmZmVyID0gR1NUX0JVRkZFUiAoYnVmZmVycy0+ZGF0YSk7CisKKyAgZmFpbF9pZiAob3V0YnVmZmVyID09IE5VTEwpOworCisgIGdzdF9idWZmZXJfbWFwIChvdXRidWZmZXIsICZtYXAsIEdTVF9NQVBfUkVBRCk7CisKKyAgLyogdW5jb21wcmVzc2VkIGRhdGEgc2hvdWxkIGJlIDEwMjQwMCBieXRlcyAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChtYXAuc2l6ZSwgNTEyMDApOworCisgIC8qIGFuZCBhbGwgYnl0ZXMgbXVzdCBiZSAwLCBpLmUuIHNpbGVuY2UgKi8KKyAgZm9yIChpID0gMDsgaSA8IDUxMjAwOyBpKyspCisgICAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAobWFwLmRhdGFbaV0sIDApOworCisgIGdzdF9idWZmZXJfdW5tYXAgKG91dGJ1ZmZlciwgJm1hcCk7CisKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAob3V0YnVmZmVyLCAib3V0YnVmZmVyIiwgMSk7CisgIGdzdF9idWZmZXJfdW5yZWYgKG91dGJ1ZmZlcik7CisgIG91dGJ1ZmZlciA9IE5VTEw7CisKKyAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICBidWZmZXJzID0gTlVMTDsKKworICBnc3RfYnVzX3NldF9mbHVzaGluZyAoYnVzLCBUUlVFKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAod2F2cGFja2RlYywgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKGJ1cykpOworICBjbGVhbnVwX3dhdnBhY2tkZWMgKHdhdnBhY2tkZWMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2RlY29kZV9mcmFtZV93aXRoX2Jyb2tlbl9oZWFkZXIpCit7CisgIEdzdEVsZW1lbnQgKndhdnBhY2tkZWM7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXI7CisgIEdzdEJ1cyAqYnVzOworICBHc3RNZXNzYWdlICptZXNzYWdlOworCisgIHdhdnBhY2tkZWMgPSBzZXR1cF93YXZwYWNrZGVjICgpOworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZW9mICh0ZXN0X2ZyYW1lKSk7CisgIGdzdF9idWZmZXJfZmlsbCAoaW5idWZmZXIsIDAsIHRlc3RfZnJhbWUsIHNpemVvZiAodGVzdF9mcmFtZSkpOworICAvKiBicmVhayBoZWFkZXIgKi8KKyAgZ3N0X2J1ZmZlcl9tZW1zZXQgKGluYnVmZmVyLCAyLCAnZScsIDEpOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworCisgIGdzdF9lbGVtZW50X3NldF9idXMgKHdhdnBhY2tkZWMsIGJ1cyk7CisKKyAgLyogc2hvdWxkIGZhaWwgZ3JhY2VmdWxseSAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlciksIEdTVF9GTE9XX0VSUk9SKTsKKworICBmYWlsX2lmICgobWVzc2FnZSA9IGdzdF9idXNfcG9wIChidXMpKSA9PSBOVUxMKTsKKyAgZmFpbF91bmxlc3NfbWVzc2FnZV9lcnJvciAobWVzc2FnZSwgU1RSRUFNLCBERUNPREUpOworICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAod2F2cGFja2RlYywgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKGJ1cykpOworICBjbGVhbnVwX3dhdnBhY2tkZWMgKHdhdnBhY2tkZWMpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2RlY29kZV9mcmFtZV93aXRoX2luY29tcGxldGVfZnJhbWUpCit7CisgIEdzdEVsZW1lbnQgKndhdnBhY2tkZWM7CisgIEdzdEJ1ZmZlciAqaW5idWZmZXI7CisgIEdzdEJ1cyAqYnVzOworICBHc3RNZXNzYWdlICptZXNzYWdlOworCisgIHdhdnBhY2tkZWMgPSBzZXR1cF93YXZwYWNrZGVjICgpOworICBidXMgPSBnc3RfYnVzX25ldyAoKTsKKworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoc2l6ZW9mICh0ZXN0X2ZyYW1lKSAtIDIpOworICBnc3RfYnVmZmVyX2ZpbGwgKGluYnVmZmVyLCAwLCB0ZXN0X2ZyYW1lLCBzaXplb2YgKHRlc3RfZnJhbWUpIC0gMik7CisgIEFTU0VSVF9CVUZGRVJfUkVGQ09VTlQgKGluYnVmZmVyLCAiaW5idWZmZXIiLCAxKTsKKyAgR1NUX0JVRkZFUl9USU1FU1RBTVAgKGluYnVmZmVyKSA9IDA7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X2J1cyAod2F2cGFja2RlYywgYnVzKTsKKworICAvKiBzaG91bGQgZmFpbCBncmFjZWZ1bGx5ICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSwgR1NUX0ZMT1dfRVJST1IpOworCisgIGZhaWxfaWYgKChtZXNzYWdlID0gZ3N0X2J1c19wb3AgKGJ1cykpID09IE5VTEwpOworICBmYWlsX3VubGVzc19tZXNzYWdlX2Vycm9yIChtZXNzYWdlLCBTVFJFQU0sIERFQ09ERSk7CisgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKworCisgIGdzdF9lbGVtZW50X3NldF9idXMgKHdhdnBhY2tkZWMsIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChHU1RfT0JKRUNUIChidXMpKTsKKyAgY2xlYW51cF93YXZwYWNrZGVjICh3YXZwYWNrZGVjKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgord2F2cGFja2RlY19zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJ3YXZwYWNrZGVjIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2RlY29kZV9mcmFtZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9kZWNvZGVfZnJhbWVfd2l0aF9icm9rZW5faGVhZGVyKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2RlY29kZV9mcmFtZV93aXRoX2luY29tcGxldGVfZnJhbWUpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAod2F2cGFja2RlYyk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZW5jLmMgYi90ZXN0cy9jaGVjay9lbGVtZW50cy93YXZwYWNrZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyZWVhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2tlbmMuYwpAQCAtMCwwICsxLDE4MiBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciB3YXZwYWNrZW5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFNlYmFzdGlhbiBEcsO2Z2UgPHNsb21vQGNpcmN1bGFyLWNoYW9zLm9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKworLyogRm9yIGVhc2Ugb2YgcHJvZ3JhbW1pbmcgd2UgdXNlIGdsb2JhbHMgdG8ga2VlcCByZWZzIGZvciBvdXIgZmxvYXRpbmcKKyAqIHNyYyBhbmQgc2luayBwYWRzIHdlIGNyZWF0ZTsgb3RoZXJ3aXNlIHdlIGFsd2F5cyBoYXZlIHRvIGRvIGdldF9wYWQsCisgKiBnZXRfcGVlciwgYW5kIHRoZW4gcmVtb3ZlIHJlZmVyZW5jZXMgaW4gZXZlcnkgdGVzdCBmdW5jdGlvbiAqLworc3RhdGljIEdzdFBhZCAqbXlzcmNwYWQsICpteXNpbmtwYWQ7CitzdGF0aWMgR3N0QnVzICpidXM7CisKKyNpZiBHX0JZVEVfT1JERVIgPT0gR19CSUdfRU5ESUFOCisjZGVmaW5lIEFVRElPX0ZPUk1BVCAiUzMyQkUiCisjZWxzZQorI2RlZmluZSBBVURJT19GT1JNQVQgIlMzMkxFIgorI2VuZGlmCisKKyNkZWZpbmUgUkFXX0NBUFNfU1RSSU5HICJhdWRpby94LXJhdywgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0ID0gKHN0cmluZykgIiBBVURJT19GT1JNQVQgIiwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAibGF5b3V0ID0gKHN0cmluZykgaW50ZXJsZWF2ZWQsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWxzID0gKGludCkgMSwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAicmF0ZSA9IChpbnQpIDQ0MTAwIgorCisjZGVmaW5lIFdBVlBBQ0tfQ0FQU19TVFJJTkcgImF1ZGlvL3gtd2F2cGFjaywgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlcHRoID0gKGludCkgMzIsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYXRlID0gKGludCkgNDQxMDAsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmFtZWQgPSAoYm9vbGVhbikgdHJ1ZSIKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNpbmt0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic2luayIsCisgICAgR1NUX1BBRF9TSU5LLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoImF1ZGlvL3gtd2F2cGFjaywgIgorICAgICAgICAiZGVwdGggPSAoaW50KSAzMiwgIgorICAgICAgICAiY2hhbm5lbHMgPSAoaW50KSAxLCAiCisgICAgICAgICJyYXRlID0gKGludCkgNDQxMDAsICIgImZyYW1lZCA9IChib29sZWFuKSB0cnVlIikpOworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc3JjdGVtcGxhdGUgPSBHU1RfU1RBVElDX1BBRF9URU1QTEFURSAoInNyYyIsCisgICAgR1NUX1BBRF9TUkMsCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC1yYXcsICIKKyAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpICIgQVVESU9fRk9STUFUICIsICIKKyAgICAgICAgImxheW91dCA9IChzdHJpbmcpIGludGVybGVhdmVkLCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIgInJhdGUgPSAoaW50KSA0NDEwMCIpKTsKKworc3RhdGljIEdzdEVsZW1lbnQgKgorc2V0dXBfd2F2cGFja2VuYyAodm9pZCkKK3sKKyAgR3N0RWxlbWVudCAqd2F2cGFja2VuYzsKKworICBHU1RfREVCVUcgKCJzZXR1cF93YXZwYWNrZW5jIik7CisgIHdhdnBhY2tlbmMgPSBnc3RfY2hlY2tfc2V0dXBfZWxlbWVudCAoIndhdnBhY2tlbmMiKTsKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAod2F2cGFja2VuYywgJnNyY3RlbXBsYXRlKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkICh3YXZwYWNrZW5jLCAmc2lua3RlbXBsYXRlKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgVFJVRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBUUlVFKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlICh3YXZwYWNrZW5jLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisgIGJ1cyA9IGdzdF9idXNfbmV3ICgpOworCisgIGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc3RyZWFtX3N0YXJ0ICgidGVzdC1zaWxlbmNlIikpOworCisgIHJldHVybiB3YXZwYWNrZW5jOworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF93YXZwYWNrZW5jIChHc3RFbGVtZW50ICogd2F2cGFja2VuYykKK3sKKyAgR1NUX0RFQlVHICgiY2xlYW51cF93YXZwYWNrZW5jIik7CisKKyAgZ3N0X2J1c19zZXRfZmx1c2hpbmcgKGJ1cywgVFJVRSk7CisgIGdzdF9lbGVtZW50X3NldF9idXMgKHdhdnBhY2tlbmMsIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChHU1RfT0JKRUNUIChidXMpKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHdhdnBhY2tlbmMsIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBGQUxTRSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzaW5rcGFkLCBGQUxTRSk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zcmNfcGFkICh3YXZwYWNrZW5jKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkICh3YXZwYWNrZW5jKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKHdhdnBhY2tlbmMpOworfQorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9lbmNvZGVfc2lsZW5jZSkKK3sKKyAgR3N0U2VnbWVudCBzZWdtZW50OworICBHc3RFbGVtZW50ICp3YXZwYWNrZW5jOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBHc3RFdmVudCAqZW9zID0gZ3N0X2V2ZW50X25ld19lb3MgKCk7CisgIGludCBpLCBudW1fYnVmZmVyczsKKworICB3YXZwYWNrZW5jID0gc2V0dXBfd2F2cGFja2VuYyAoKTsKKworICBnc3Rfc2VnbWVudF9pbml0ICgmc2VnbWVudCwgR1NUX0ZPUk1BVF9USU1FKTsKKworICBpbmJ1ZmZlciA9IGdzdF9idWZmZXJfbmV3X2FuZF9hbGxvYyAoMTAwMCk7CisgIGdzdF9idWZmZXJfbWVtc2V0IChpbmJ1ZmZlciwgMCwgMCwgMTAwMCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nIChSQVdfQ0FQU19TVFJJTkcpOworICBmYWlsX3VubGVzcyAoZ3N0X3BhZF9zZXRfY2FwcyAobXlzcmNwYWQsIGNhcHMpKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfc2VnbWVudCAoJnNlZ21lbnQpKTsKKworICBHU1RfQlVGRkVSX1RJTUVTVEFNUCAoaW5idWZmZXIpID0gMDsKKyAgQVNTRVJUX0JVRkZFUl9SRUZDT1VOVCAoaW5idWZmZXIsICJpbmJ1ZmZlciIsIDEpOworCisgIGdzdF9lbGVtZW50X3NldF9idXMgKHdhdnBhY2tlbmMsIGJ1cyk7CisKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZ3N0X3BhZF9wdXNoIChteXNyY3BhZCwgaW5idWZmZXIpLCBHU1RfRkxPV19PSyk7CisKKyAgZmFpbF9pZiAoZ3N0X3BhZF9wdXNoX2V2ZW50IChteXNyY3BhZCwgZW9zKSAhPSBUUlVFKTsKKworICAvKiBjaGVjayBmaXJzdCBidWZmZXIgKi8KKyAgb3V0YnVmZmVyID0gR1NUX0JVRkZFUiAoYnVmZmVycy0+ZGF0YSk7CisKKyAgZmFpbF9pZiAob3V0YnVmZmVyID09IE5VTEwpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWZmZXIpLCAwKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0JVRkZFUl9EVVJBVElPTiAob3V0YnVmZmVyKSwgNTY2ODkzNCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9idWZmZXJfbWVtY21wIChvdXRidWZmZXIsIDAsICJ3dnBrIiwgNCkgPT0gMCwKKyAgICAgICJGYWlsZWQgdG8gZW5jb2RlIHRvIHZhbGlkIFdhdnBhY2sgZnJhbWVzIik7CisKKyAgLyogZnJlZSBhbGwgYnVmZmVycyAqLworICBudW1fYnVmZmVycyA9IGdfbGlzdF9sZW5ndGggKGJ1ZmZlcnMpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fYnVmZmVyczsgKytpKSB7CisgICAgb3V0YnVmZmVyID0gR1NUX0JVRkZFUiAoYnVmZmVycy0+ZGF0YSk7CisgICAgZmFpbF9pZiAob3V0YnVmZmVyID09IE5VTEwpOworCisgICAgYnVmZmVycyA9IGdfbGlzdF9yZW1vdmUgKGJ1ZmZlcnMsIG91dGJ1ZmZlcik7CisKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworICAgIG91dGJ1ZmZlciA9IE5VTEw7CisgIH0KKworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGNsZWFudXBfd2F2cGFja2VuYyAod2F2cGFja2VuYyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK3dhdnBhY2tlbmNfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgid2F2cGFja2VuYyIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9lbmNvZGVfc2lsZW5jZSk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOICh3YXZwYWNrZW5jKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2twYXJzZS5jIGIvdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFja3BhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2NGRlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhY2twYXJzZS5jCkBAIC0wLDAgKzEsMjM0IEBACisvKiBHU3RyZWFtZXIKKyAqCisgKiB1bml0IHRlc3QgZm9yIHdhdnBhY2twYXJzZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBTZWJhc3RpYW4gRHLDtmdlIDxzbG9tb0BjaXJjdWxhci1jaGFvcy5vcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKKy8qIEZvciBlYXNlIG9mIHByb2dyYW1taW5nIHdlIHVzZSBnbG9iYWxzIHRvIGtlZXAgcmVmcyBmb3Igb3VyIGZsb2F0aW5nCisgKiBzcmMgYW5kIHNpbmsgcGFkcyB3ZSBjcmVhdGU7IG90aGVyd2lzZSB3ZSBhbHdheXMgaGF2ZSB0byBkbyBnZXRfcGFkLAorICogZ2V0X3BlZXIsIGFuZCB0aGVuIHJlbW92ZSByZWZlcmVuY2VzIGluIGV2ZXJ5IHRlc3QgZnVuY3Rpb24gKi8KK3N0YXRpYyBHc3RQYWQgKm15c3JjcGFkLCAqbXlzaW5rcGFkOworCisvKiBXYXZwYWNrIGZpbGUgd2l0aCAyIGZyYW1lcyBvZiBzaWxlbmNlICovCitndWludDggdGVzdF9maWxlW10gPSB7CisgIDB4NzcsIDB4NzYsIDB4NzAsIDB4NkIsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgIC8qIGZpcnN0IGZyYW1lICovCisgIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzgsIDB4MDAsIDB4MDAsICAgICAgIC8qIGluY2x1ZGUgUklGRiBoZWFkZXIgKi8KKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgwMCwKKyAgMHgwNSwgMHgxOCwgMHg4MCwgMHgwNCwgMHhGRiwgMHhBRiwgMHg4MCwgMHg2MCwKKyAgMHgyMSwgMHgxNiwgMHg1MiwgMHg0OSwgMHg0NiwgMHg0NiwgMHgyNCwgMHg5MCwKKyAgMHgwMSwgMHgwMCwgMHg1NywgMHg0MSwgMHg1NiwgMHg0NSwgMHg2NiwgMHg2RCwKKyAgMHg3NCwgMHgyMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKKyAgMHgwMSwgMHgwMCwgMHg0NCwgMHhBQywgMHgwMCwgMHgwMCwgMHg4OCwgMHg1OCwKKyAgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgxMCwgMHgwMCwgMHg2NCwgMHg2MSwKKyAgMHg3NCwgMHg2MSwgMHgwMCwgMHg5MCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwKKyAgMHgwMywgMHgwMCwgMHgwNCwgMHgwMCwgMHgwNSwgMHgwMywgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NSwgMHgwMiwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHg4QSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGRiwgMHg3RiwKKyAgMHgwMCwgMHhFNCwKKyAgMHg3NywgMHg3NiwgMHg3MCwgMHg2QiwgMHgyRSwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgLyogc2Vjb25kIGZyYW1lICovCisgIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgIDB4MDAsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MDAsCisgIDB4MDUsIDB4MTgsIDB4ODAsIDB4MDQsIDB4RkYsIDB4QUYsIDB4ODAsIDB4NjAsCisgIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDUsIDB4MDMsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4MDIsCisgIDB4MDAsIDB4MDAsIDB4RkYsIDB4N0YsIDB4MDAsIDB4RTQsCit9OworCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTICgiYXVkaW8veC13YXZwYWNrLCAiCisgICAgICAgICJkZXB0aCA9IChpbnQpIDE2LCAiCisgICAgICAgICJjaGFubmVscyA9IChpbnQpIDEsICIKKyAgICAgICAgInJhdGUgPSAoaW50KSA0NDEwMCwgIiAiZnJhbWVkID0gKGJvb2xlYW4pIFRSVUUiKSk7CisKK3N0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBzcmN0ZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFICgic3JjIiwKKyAgICBHU1RfUEFEX1NSQywKKyAgICBHU1RfUEFEX0FMV0FZUywKKyAgICBHU1RfU1RBVElDX0NBUFMgKCJhdWRpby94LXdhdnBhY2siKSk7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX3dhdnBhY2twYXJzZSAodm9pZCkKK3sKKyAgR3N0RWxlbWVudCAqd2F2cGFja3BhcnNlOworCisgIEdTVF9ERUJVRyAoInNldHVwX3dhdnBhY2twYXJzZSIpOworCisgIHdhdnBhY2twYXJzZSA9IGdzdF9jaGVja19zZXR1cF9lbGVtZW50ICgid2F2cGFja3BhcnNlIik7CisgIG15c3JjcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NyY19wYWQgKHdhdnBhY2twYXJzZSwgJnNyY3RlbXBsYXRlKTsKKyAgbXlzaW5rcGFkID0gZ3N0X2NoZWNrX3NldHVwX3NpbmtfcGFkICh3YXZwYWNrcGFyc2UsICZzaW5rdGVtcGxhdGUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c3JjcGFkLCBUUlVFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIFRSVUUpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgd2F2cGFja3BhcnNlLCBOVUxMLCBHU1RfRk9STUFUX0JZVEVTKTsKKworICByZXR1cm4gd2F2cGFja3BhcnNlOworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF93YXZwYWNrcGFyc2UgKEdzdEVsZW1lbnQgKiB3YXZwYWNrcGFyc2UpCit7CisgIEdTVF9ERUJVRyAoImNsZWFudXBfd2F2cGFja3BhcnNlIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAod2F2cGFja3BhcnNlLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNyY3BhZCwgRkFMU0UpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgRkFMU0UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fc3JjX3BhZCAod2F2cGFja3BhcnNlKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NpbmtfcGFkICh3YXZwYWNrcGFyc2UpOworICBnc3RfY2hlY2tfdGVhcmRvd25fZWxlbWVudCAod2F2cGFja3BhcnNlKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcGFyc2luZ192YWxpZF9mcmFtZXMpCit7CisgIEdzdEVsZW1lbnQgKndhdnBhY2twYXJzZTsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgaW50IGksIG51bV9idWZmZXJzOworICBHc3RGb3JtYXQgZm9ybWF0ID0gR1NUX0ZPUk1BVF9USU1FOworICBnaW50NjQgcG9zOworCisgIHdhdnBhY2twYXJzZSA9IHNldHVwX3dhdnBhY2twYXJzZSAoKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAod2F2cGFja3BhcnNlLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHNpemVvZiAodGVzdF9maWxlKSk7CisgIGdzdF9idWZmZXJfZmlsbCAoaW5idWZmZXIsIDAsIHRlc3RfZmlsZSwgc2l6ZW9mICh0ZXN0X2ZpbGUpKTsKKworICAvKiBzaG91bGQgZGVjb2RlIHRoZSBidWZmZXIgd2l0aG91dCBwcm9ibGVtcyAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlciksIEdTVF9GTE9XX09LKTsKKworICAvKiBpbmZvcm0gb2Ygbm8gZnVydGhlciBkYXRhICovCisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2hfZXZlbnQgKG15c3JjcGFkLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSkpOworCisgIG51bV9idWZmZXJzID0gZ19saXN0X2xlbmd0aCAoYnVmZmVycyk7CisgIC8qIHNob3VsZCBnZXQgMiBidWZmZXJzLCBlYWNoIG9uZSBjb21wbGV0ZSB3YXZwYWNrIGZyYW1lICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKG51bV9idWZmZXJzLCAyKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2J1ZmZlcnM7ICsraSkgeworICAgIG91dGJ1ZmZlciA9IEdTVF9CVUZGRVIgKGJ1ZmZlcnMtPmRhdGEpOworICAgIGZhaWxfaWYgKG91dGJ1ZmZlciA9PSBOVUxMKTsKKworICAgIGZhaWxfdW5sZXNzIChnc3RfYnVmZmVyX21lbWNtcCAob3V0YnVmZmVyLCAwLCAid3ZwayIsIDQpID09IDAsCisgICAgICAgICJCdWZmZXIgY29udGFpbnMgbm8gV2F2cGFjayBmcmFtZSIpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9CVUZGRVJfRFVSQVRJT04gKG91dGJ1ZmZlciksIDU4MDQ5ODg2Nik7CisKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgIGNhc2UgMDp7CisgICAgICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9CVUZGRVJfVElNRVNUQU1QIChvdXRidWZmZXIpLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDE6eworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmZmVyKSwgNTgwNDk4ODY2KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgYnVmZmVycyA9IGdfbGlzdF9yZW1vdmUgKGJ1ZmZlcnMsIG91dGJ1ZmZlcik7CisKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworICAgIG91dGJ1ZmZlciA9IE5VTEw7CisgIH0KKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfcXVlcnlfcG9zaXRpb24gKHdhdnBhY2twYXJzZSwgZm9ybWF0LCAmcG9zKSwKKyAgICAgICJQb3NpdGlvbiBxdWVyeSBmYWlsZWQiKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludDY0IChwb3MsIDU4MDQ5ODg2NiAqIDIpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfcXVlcnlfZHVyYXRpb24gKHdhdnBhY2twYXJzZSwgZm9ybWF0LCBOVUxMKSwKKyAgICAgICJEdXJhdGlvbiBxdWVyeSBmYWlsZWQiKTsKKworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGNsZWFudXBfd2F2cGFja3BhcnNlICh3YXZwYWNrcGFyc2UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3BhcnNpbmdfaW52YWxpZF9maXJzdF9oZWFkZXIpCit7CisgIEdzdEVsZW1lbnQgKndhdnBhY2twYXJzZTsKKyAgR3N0QnVmZmVyICppbmJ1ZmZlciwgKm91dGJ1ZmZlcjsKKyAgaW50IGksIG51bV9idWZmZXJzOworCisgIHdhdnBhY2twYXJzZSA9IHNldHVwX3dhdnBhY2twYXJzZSAoKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAod2F2cGFja3BhcnNlLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgaW5idWZmZXIgPSBnc3RfYnVmZmVyX25ld19hbmRfYWxsb2MgKHNpemVvZiAodGVzdF9maWxlKSk7CisgIGdzdF9idWZmZXJfZmlsbCAoaW5idWZmZXIsIDAsIHRlc3RfZmlsZSwgc2l6ZW9mICh0ZXN0X2ZpbGUpKTsKKyAgZ3N0X2J1ZmZlcl9tZW1zZXQgKGluYnVmZmVyLCAwLCAnaycsIDEpOworCisgIC8qIHNob3VsZCBkZWNvZGUgdGhlIGJ1ZmZlciB3aXRob3V0IHByb2JsZW1zICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9wYWRfcHVzaCAobXlzcmNwYWQsIGluYnVmZmVyKSwgR1NUX0ZMT1dfT0spOworCisgIC8qIGluZm9ybSBvZiBubyBmdXJ0aGVyIGRhdGEgKi8KKyAgZmFpbF91bmxlc3MgKGdzdF9wYWRfcHVzaF9ldmVudCAobXlzcmNwYWQsIGdzdF9ldmVudF9uZXdfZW9zICgpKSk7CisKKyAgbnVtX2J1ZmZlcnMgPSBnX2xpc3RfbGVuZ3RoIChidWZmZXJzKTsKKworICAvKiBzaG91bGQgZ2V0IDEgYnVmZmVycywgdGhlIHNlY29uZCBub24tYnJva2VuIG9uZSAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChudW1fYnVmZmVycywgMSk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9idWZmZXJzOyArK2kpIHsKKyAgICBvdXRidWZmZXIgPSBHU1RfQlVGRkVSIChidWZmZXJzLT5kYXRhKTsKKyAgICBmYWlsX2lmIChvdXRidWZmZXIgPT0gTlVMTCk7CisKKyAgICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKG91dGJ1ZmZlciwgMCwgInd2cGsiLCA0KSA9PSAwLAorICAgICAgICAiQnVmZmVyIGNvbnRhaW5zIG5vIFdhdnBhY2sgZnJhbWUiKTsKKyAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfQlVGRkVSX0RVUkFUSU9OIChvdXRidWZmZXIpLCA1ODA0OTg4NjYpOworCisgICAgc3dpdGNoIChpKSB7CisgICAgICBjYXNlIDA6eworICAgICAgICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfQlVGRkVSX1RJTUVTVEFNUCAob3V0YnVmZmVyKSwgNTgwNDk4ODY2KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgYnVmZmVycyA9IGdfbGlzdF9yZW1vdmUgKGJ1ZmZlcnMsIG91dGJ1ZmZlcik7CisKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworICAgIG91dGJ1ZmZlciA9IE5VTEw7CisgIH0KKworICBnX2xpc3RfZnJlZSAoYnVmZmVycyk7CisgIGJ1ZmZlcnMgPSBOVUxMOworCisgIGNsZWFudXBfd2F2cGFja3BhcnNlICh3YXZwYWNrcGFyc2UpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKworc3RhdGljIFN1aXRlICoKK3dhdnBhY2twYXJzZV9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJ3YXZwYWNrcGFyc2UiKTsKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2luZ192YWxpZF9mcmFtZXMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcGFyc2luZ19pbnZhbGlkX2ZpcnN0X2hlYWRlcik7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOICh3YXZwYWNrcGFyc2UpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZWxlbWVudHMvd2F2cGFyc2UuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5MTEwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3dhdnBhcnNlLmMKQEAgLTAsMCArMSwxNTAgQEAKKy8qIEdTdHJlYW1lciBXYXZQYXJzZSB1bml0IHRlc3RzCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisjZGVmaW5lIFNJTVBMRV9XQVZfUEFUSCBHU1RfVEVTVF9GSUxFU19QQVRIIEdfRElSX1NFUEFSQVRPUl9TICJhdWRpb3Rlc3RzcmMud2F2IgorCitzdGF0aWMgdm9pZAorZG9fdGVzdF9zaW1wbGVfZmlsZSAoR3N0UGFkTW9kZSBtb2RlKQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RFbGVtZW50ICpzcmMsICpxID0gTlVMTDsKKyAgR3N0RWxlbWVudCAqd2F2cGFyc2U7CisgIEdzdEVsZW1lbnQgKmZha2VzaW5rOworICBHc3RNZXNzYWdlICptc2c7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3ICgidGVzdHBpcGUiKTsKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmlsZXNyYyIsIE5VTEwpOworICBmYWlsX2lmIChzcmMgPT0gTlVMTCk7CisgIGlmIChtb2RlID09IEdTVF9QQURfTU9ERV9QVVNIKQorICAgIHEgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJxdWV1ZSIsIE5VTEwpOworICB3YXZwYXJzZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoIndhdnBhcnNlIiwgTlVMTCk7CisgIGZhaWxfaWYgKHdhdnBhcnNlID09IE5VTEwpOworICBmYWtlc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgTlVMTCk7CisgIGZhaWxfaWYgKGZha2VzaW5rID09IE5VTEwpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjLCB3YXZwYXJzZSwgZmFrZXNpbmssIHEsIE5VTEwpOworCisgIGdfb2JqZWN0X3NldCAoc3JjLCAibG9jYXRpb24iLCBTSU1QTEVfV0FWX1BBVEgsIE5VTEwpOworCisgIGlmIChtb2RlID09IEdTVF9QQURfTU9ERV9QVVNIKQorICAgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rX21hbnkgKHNyYywgcSwgd2F2cGFyc2UsIGZha2VzaW5rLCBOVUxMKSk7CisgIGVsc2UKKyAgICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGlua19tYW55IChzcmMsIHdhdnBhcnNlLCBmYWtlc2luaywgTlVMTCkpOworCisgIHJldCA9IGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAocmV0LCBHU1RfU1RBVEVfQ0hBTkdFX0FTWU5DKTsKKworICByZXQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKHBpcGVsaW5lLCBOVUxMLCBOVUxMLCBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAocmV0LCBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MpOworCisgIG1zZyA9IGdzdF9idXNfdGltZWRfcG9wX2ZpbHRlcmVkIChHU1RfRUxFTUVOVF9CVVMgKHBpcGVsaW5lKSwKKyAgICAgIEdTVF9DTE9DS19USU1FX05PTkUsIEdTVF9NRVNTQUdFX0VPUyB8IEdTVF9NRVNTQUdFX0VSUk9SKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfc3RyaW5nIChHU1RfTUVTU0FHRV9UWVBFX05BTUUgKG1zZyksICJlb3MiKTsKKworICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3NpbXBsZV9maWxlX3B1bGwpCit7CisgIGRvX3Rlc3Rfc2ltcGxlX2ZpbGUgKFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3NpbXBsZV9maWxlX3B1c2gpCit7CisgIGRvX3Rlc3Rfc2ltcGxlX2ZpbGUgKEZBTFNFKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgdm9pZAorZG9fdGVzdF9lbXB0eV9maWxlIChnYm9vbGVhbiBjYW5fYWN0aXZhdGVfcHVsbCkKK3sKKyAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmV0MSwgcmV0MjsKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEVsZW1lbnQgKnNyYzsKKyAgR3N0RWxlbWVudCAqd2F2cGFyc2U7CisgIEdzdEVsZW1lbnQgKmZha2VzaW5rOworCisgIC8qIFB1bGwgbW9kZSAqLworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJ0ZXN0cGlwZSIpOworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc3JjIiwgTlVMTCk7CisgIGZhaWxfaWYgKHNyYyA9PSBOVUxMKTsKKyAgd2F2cGFyc2UgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ3YXZwYXJzZSIsIE5VTEwpOworICBmYWlsX2lmICh3YXZwYXJzZSA9PSBOVUxMKTsKKyAgZmFrZXNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsIE5VTEwpOworICBmYWlsX2lmIChmYWtlc2luayA9PSBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHNyYywgd2F2cGFyc2UsIGZha2VzaW5rLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzcmMsICJudW0tYnVmZmVycyIsIDAsICJjYW4tYWN0aXZhdGUtcHVsbCIsIGNhbl9hY3RpdmF0ZV9wdWxsLAorICAgICAgTlVMTCk7CisKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmtfbWFueSAoc3JjLCB3YXZwYXJzZSwgZmFrZXNpbmssIE5VTEwpKTsKKworICByZXQxID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBpZiAocmV0MSA9PSBHU1RfU1RBVEVfQ0hBTkdFX0FTWU5DKQorICAgIHJldDIgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKHBpcGVsaW5lLCBOVUxMLCBOVUxMLCBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKyAgZWxzZQorICAgIHJldDIgPSByZXQxOworCisgIC8qIHNob3VsZCBoYXZlIGdvdHRlbiBhbiBlcnJvciBvbiB0aGUgYnVzLCBubyBvdXRwdXQgdG8gZmFrZXNpbmsgKi8KKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAocmV0MiwgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZW1wdHlfZmlsZV9wdWxsKQoreworICBkb190ZXN0X2VtcHR5X2ZpbGUgKFRSVUUpOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2VtcHR5X2ZpbGVfcHVzaCkKK3sKKyAgZG9fdGVzdF9lbXB0eV9maWxlIChGQUxTRSk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworc3RhdGljIFN1aXRlICoKK3dhdnBhcnNlX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoIndhdnBhcnNlIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoIndhdnBhcnNlIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9lbXB0eV9maWxlX3B1bGwpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfZW1wdHlfZmlsZV9wdXNoKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3NpbXBsZV9maWxlX3B1bGwpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfc2ltcGxlX2ZpbGVfcHVzaCk7CisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAod2F2cGFyc2UpCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9lbGVtZW50cy95NG1lbmMuYyBiL3Rlc3RzL2NoZWNrL2VsZW1lbnRzL3k0bWVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYmRiMjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9lbGVtZW50cy95NG1lbmMuYwpAQCAtMCwwICsxLDE2OCBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciB5NG1lbmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDwyMDA2PiBNYXJrIE5hdXdlbGFlcnRzIDxtYW5hdXdAc2t5bmV0LmJlPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisvKiBGb3IgZWFzZSBvZiBwcm9ncmFtbWluZyB3ZSB1c2UgZ2xvYmFscyB0byBrZWVwIHJlZnMgZm9yIG91ciBmbG9hdGluZworICogc3JjIGFuZCBzaW5rIHBhZHMgd2UgY3JlYXRlOyBvdGhlcndpc2Ugd2UgYWx3YXlzIGhhdmUgdG8gZG8gZ2V0X3BhZCwKKyAqIGdldF9wZWVyLCBhbmQgdGhlbiByZW1vdmUgcmVmZXJlbmNlcyBpbiBldmVyeSB0ZXN0IGZ1bmN0aW9uICovCitzdGF0aWMgR3N0UGFkICpteXNyY3BhZCwgKm15c2lua3BhZDsKKworI2RlZmluZSBWSURFT19DQVBTX1NUUklORyAidmlkZW8veC1yYXcsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCA9IChzdHJpbmcpIEk0MjAsICJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAid2lkdGggPSAoaW50KSAzODQsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlaWdodCA9IChpbnQpIDI4OCwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWVyYXRlID0gKGZyYWN0aW9uKSAyNS8xLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJwaXhlbC1hc3BlY3QtcmF0aW8gPSAoZnJhY3Rpb24pIDEvMSIKKworI2RlZmluZSBZNE1fQ0FQU19TVFJJTkcgImFwcGxpY2F0aW9uL3gteXV2NG1wZWcsICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgInk0bXZlcnNpb24gPSAoaW50KSAyIgorCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgc2lua3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzaW5rIiwKKyAgICBHU1RfUEFEX1NJTkssCisgICAgR1NUX1BBRF9BTFdBWVMsCisgICAgR1NUX1NUQVRJQ19DQVBTIChZNE1fQ0FQU19TVFJJTkcpKTsKKworc3RhdGljIEdzdFN0YXRpY1BhZFRlbXBsYXRlIHNyY3RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUgKCJzcmMiLAorICAgIEdTVF9QQURfU1JDLAorICAgIEdTVF9QQURfQUxXQVlTLAorICAgIEdTVF9TVEFUSUNfQ0FQUyAoVklERU9fQ0FQU19TVFJJTkcpKTsKKworCitzdGF0aWMgR3N0RWxlbWVudCAqCitzZXR1cF95NG1lbmMgKHZvaWQpCit7CisgIEdzdEVsZW1lbnQgKnk0bWVuYzsKKworICBHU1RfREVCVUcgKCJzZXR1cF95NG1lbmMiKTsKKyAgeTRtZW5jID0gZ3N0X2NoZWNrX3NldHVwX2VsZW1lbnQgKCJ5NG1lbmMiKTsKKyAgbXlzcmNwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc3JjX3BhZCAoeTRtZW5jLCAmc3JjdGVtcGxhdGUpOworICBteXNpbmtwYWQgPSBnc3RfY2hlY2tfc2V0dXBfc2lua19wYWQgKHk0bWVuYywgJnNpbmt0ZW1wbGF0ZSk7CisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIFRSVUUpOworICBnc3RfcGFkX3NldF9hY3RpdmUgKG15c2lua3BhZCwgVFJVRSk7CisKKyAgcmV0dXJuIHk0bWVuYzsKK30KKworc3RhdGljIHZvaWQKK2NsZWFudXBfeTRtZW5jIChHc3RFbGVtZW50ICogeTRtZW5jKQoreworICBHU1RfREVCVUcgKCJjbGVhbnVwX3k0bWVuYyIpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHk0bWVuYywgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9wYWRfc2V0X2FjdGl2ZSAobXlzcmNwYWQsIEZBTFNFKTsKKyAgZ3N0X3BhZF9zZXRfYWN0aXZlIChteXNpbmtwYWQsIEZBTFNFKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX3NyY19wYWQgKHk0bWVuYyk7CisgIGdzdF9jaGVja190ZWFyZG93bl9zaW5rX3BhZCAoeTRtZW5jKTsKKyAgZ3N0X2NoZWNrX3RlYXJkb3duX2VsZW1lbnQgKHk0bWVuYyk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3k0bSkKK3sKKyAgR3N0RWxlbWVudCAqeTRtZW5jOworICBHc3RCdWZmZXIgKmluYnVmZmVyLCAqb3V0YnVmZmVyOworICBHc3RDYXBzICpjYXBzOworICBpbnQgaSwgbnVtX2J1ZmZlcnMsIHNpemU7CisgIGNvbnN0IGdjaGFyICpkYXRhMCA9ICJZVVY0TVBFRzIgVzM4NCBIMjg4IElwIEYyNToxIEExOjFcbiI7CisgIGNvbnN0IGdjaGFyICpkYXRhMSA9ICJZVVY0TVBFRzIgQzQyMCBXMzg0IEgyODggSXAgRjI1OjEgQTE6MVxuIjsKKyAgY29uc3QgZ2NoYXIgKmRhdGEyID0gIkZSQU1FXG4iOworCisgIHk0bWVuYyA9IHNldHVwX3k0bWVuYyAoKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoeTRtZW5jLAorICAgICAgICAgIEdTVF9TVEFURV9QTEFZSU5HKSA9PSBHU1RfU1RBVEVfQ0hBTkdFX1NVQ0NFU1MsCisgICAgICAiY291bGQgbm90IHNldCB0byBwbGF5aW5nIik7CisKKyAgLyogY29ycmVzcG9uZHMgdG8gSTQyMCBidWZmZXIgZm9yIHRoZSBzaXplIG1lbnRpb25lZCBpbiB0aGUgY2FwcyAqLworICBzaXplID0gMzg0ICogMjg4ICogMyAvIDI7CisgIGluYnVmZmVyID0gZ3N0X2J1ZmZlcl9uZXdfYW5kX2FsbG9jIChzaXplKTsKKyAgLyogbWFrZXMgdmFsZ3JpbmQncyBtZW1jaGVjayBoYXBwaWVyICovCisgIGdzdF9idWZmZXJfbWVtc2V0IChpbmJ1ZmZlciwgMCwgMCwgc2l6ZSk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoVklERU9fQ0FQU19TVFJJTkcpOworICBnc3RfY2hlY2tfc2V0dXBfZXZlbnRzIChteXNyY3BhZCwgeTRtZW5jLCBjYXBzLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisgIEdTVF9CVUZGRVJfVElNRVNUQU1QIChpbmJ1ZmZlcikgPSAwOworICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChpbmJ1ZmZlciwgImluYnVmZmVyIiwgMSk7CisgIGZhaWxfdW5sZXNzIChnc3RfcGFkX3B1c2ggKG15c3JjcGFkLCBpbmJ1ZmZlcikgPT0gR1NUX0ZMT1dfT0spOworCisgIG51bV9idWZmZXJzID0gZ19saXN0X2xlbmd0aCAoYnVmZmVycyk7CisgIGZhaWxfdW5sZXNzIChudW1fYnVmZmVycyA9PSAxKTsKKworICAvKiBjbGVhbiB1cCBidWZmZXJzICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1fYnVmZmVyczsgKytpKSB7CisgICAgR3N0TWFwSW5mbyBtYXA7CisgICAgZ2NoYXIgKmRhdGE7CisgICAgZ3NpemUgb3V0c2l6ZTsKKworICAgIG91dGJ1ZmZlciA9IEdTVF9CVUZGRVIgKGJ1ZmZlcnMtPmRhdGEpOworICAgIGZhaWxfaWYgKG91dGJ1ZmZlciA9PSBOVUxMKTsKKworICAgIHN3aXRjaCAoaSkgeworICAgICAgY2FzZSAwOgorICAgICAgICBnc3RfYnVmZmVyX21hcCAob3V0YnVmZmVyLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgICAgICBvdXRzaXplID0gbWFwLnNpemU7CisgICAgICAgIGRhdGEgPSAoZ2NoYXIgKikgbWFwLmRhdGE7CisKKyAgICAgICAgZmFpbF91bmxlc3MgKG91dHNpemUgPiBzaXplKTsKKyAgICAgICAgZmFpbF91bmxlc3MgKG1lbWNtcCAoZGF0YSwgZGF0YTAsIHN0cmxlbiAoZGF0YTApKSA9PSAwIHx8CisgICAgICAgICAgICBtZW1jbXAgKGRhdGEsIGRhdGExLCBzdHJsZW4gKGRhdGExKSkgPT0gMCk7CisgICAgICAgIC8qIHNvIHdlIGtub3cgdGhlcmUgaXMgYSBuZXdsaW5lICovCisgICAgICAgIGRhdGEgPSBzdHJjaHIgKGRhdGEsICdcbicpOworICAgICAgICBmYWlsX3VubGVzcyAoZGF0YSAhPSBOVUxMKTsKKyAgICAgICAgZGF0YSsrOworICAgICAgICBmYWlsX3VubGVzcyAobWVtY21wIChkYXRhMiwgZGF0YSwgc3RybGVuIChkYXRhMikpID09IDApOworICAgICAgICBkYXRhICs9IHN0cmxlbiAoZGF0YTIpOworICAgICAgICAvKiByZW1haW5kZXIgbXVzdCBiZSBmcmFtZSBkYXRhICovCisgICAgICAgIGZhaWxfdW5sZXNzIChkYXRhIC0gKGdjaGFyICopIG1hcC5kYXRhICsgc2l6ZSA9PSBvdXRzaXplKTsKKyAgICAgICAgZ3N0X2J1ZmZlcl91bm1hcCAob3V0YnVmZmVyLCAmbWFwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgYnVmZmVycyA9IGdfbGlzdF9yZW1vdmUgKGJ1ZmZlcnMsIG91dGJ1ZmZlcik7CisKKyAgICBBU1NFUlRfQlVGRkVSX1JFRkNPVU5UIChvdXRidWZmZXIsICJvdXRidWZmZXIiLCAxKTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChvdXRidWZmZXIpOworICAgIG91dGJ1ZmZlciA9IE5VTEw7CisgIH0KKworICBjbGVhbnVwX3k0bWVuYyAoeTRtZW5jKTsKKyAgZ19saXN0X2ZyZWUgKGJ1ZmZlcnMpOworICBidWZmZXJzID0gTlVMTDsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgoreTRtZW5jX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoInk0bWVuYyIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF95NG0pOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoeTRtZW5jKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL2dlbmVyaWMvLmdpdGlnbm9yZSBiL3Rlc3RzL2NoZWNrL2dlbmVyaWMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDliZDFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZ2VuZXJpYy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMyBAQAorLmRpcnN0YW1wCitpbmRleAorc3RhdGVzCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9nZW5lcmljL3N0YXRlcy5jIGIvdGVzdHMvY2hlY2svZ2VuZXJpYy9zdGF0ZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzcyZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svZ2VuZXJpYy9zdGF0ZXMuYwpAQCAtMCwwICsxLDIyNSBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBzdGF0ZSBjaGFuZ2VzIG9uIGFsbCBlbGVtZW50cworICoKKyAqIENvcHlyaWdodCAoQykgPDIwMDU+IFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisKK3N0YXRpYyBHTGlzdCAqZWxlbWVudHMgPSBOVUxMOworCitzdGF0aWMgdm9pZAorc2V0dXAgKHZvaWQpCit7CisgIEdMaXN0ICpmZWF0dXJlcywgKmY7CisgIEdMaXN0ICpwbHVnaW5zLCAqcDsKKyAgZ2NoYXIgKippZ25vcmVsaXN0ID0gTlVMTDsKKyAgY29uc3QgZ2NoYXIgKlNUQVRFX0lHTk9SRV9FTEVNRU5UUyA9IE5VTEw7CisgIEdzdFJlZ2lzdHJ5ICpkZWY7CisKKyAgR1NUX0RFQlVHICgiZ2V0dGluZyBlbGVtZW50cyBmb3IgcGFja2FnZSAlcyIsIFBBQ0tBR0UpOworICBTVEFURV9JR05PUkVfRUxFTUVOVFMgPSBnX2dldGVudiAoIkdTVF9TVEFURV9JR05PUkVfRUxFTUVOVFMiKTsKKyAgaWYgKCFnX2dldGVudiAoIkdTVF9OT19TVEFURV9JR05PUkVfRUxFTUVOVFMiKSAmJiBTVEFURV9JR05PUkVfRUxFTUVOVFMpIHsKKyAgICBHU1RfREVCVUcgKCJXaWxsIGlnbm9yZSBlbGVtZW50IGZhY3RvcmllczogJyVzJyIsIFNUQVRFX0lHTk9SRV9FTEVNRU5UUyk7CisgICAgaWdub3JlbGlzdCA9IGdfc3Ryc3BsaXQgKFNUQVRFX0lHTk9SRV9FTEVNRU5UUywgIiAiLCAwKTsKKyAgfQorCisgIGRlZiA9IGdzdF9yZWdpc3RyeV9nZXQgKCk7CisKKyAgcGx1Z2lucyA9IGdzdF9yZWdpc3RyeV9nZXRfcGx1Z2luX2xpc3QgKGRlZik7CisKKyAgZm9yIChwID0gcGx1Z2luczsgcDsgcCA9IHAtPm5leHQpIHsKKyAgICBHc3RQbHVnaW4gKnBsdWdpbiA9IHAtPmRhdGE7CisKKyAgICBpZiAoc3RyY21wIChnc3RfcGx1Z2luX2dldF9zb3VyY2UgKHBsdWdpbiksIFBBQ0tBR0UpICE9IDApCisgICAgICBjb250aW51ZTsKKworICAgIGZlYXR1cmVzID0KKyAgICAgICAgZ3N0X3JlZ2lzdHJ5X2dldF9mZWF0dXJlX2xpc3RfYnlfcGx1Z2luIChkZWYsCisgICAgICAgIGdzdF9wbHVnaW5fZ2V0X25hbWUgKHBsdWdpbikpOworCisgICAgZm9yIChmID0gZmVhdHVyZXM7IGY7IGYgPSBmLT5uZXh0KSB7CisgICAgICBHc3RQbHVnaW5GZWF0dXJlICpmZWF0dXJlID0gZi0+ZGF0YTsKKyAgICAgIGNvbnN0IGdjaGFyICpuYW1lID0gZ3N0X3BsdWdpbl9mZWF0dXJlX2dldF9uYW1lIChmZWF0dXJlKTsKKyAgICAgIGdib29sZWFuIGlnbm9yZSA9IEZBTFNFOworCisgICAgICBpZiAoIUdTVF9JU19FTEVNRU5UX0ZBQ1RPUlkgKGZlYXR1cmUpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKGlnbm9yZWxpc3QpIHsKKyAgICAgICAgZ2NoYXIgKipzOworCisgICAgICAgIGZvciAocyA9IGlnbm9yZWxpc3Q7IHMgJiYgKnM7ICsrcykgeworICAgICAgICAgIGlmIChnX3N0cl9oYXNfcHJlZml4IChuYW1lLCAqcykpIHsKKyAgICAgICAgICAgIEdTVF9ERUJVRyAoImlnbm9yaW5nIGVsZW1lbnQgJXMiLCBuYW1lKTsKKyAgICAgICAgICAgIGlnbm9yZSA9IFRSVUU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpZ25vcmUpCisgICAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIEdTVF9ERUJVRyAoImFkZGluZyBlbGVtZW50ICVzIiwgbmFtZSk7CisgICAgICBlbGVtZW50cyA9IGdfbGlzdF9wcmVwZW5kIChlbGVtZW50cywgKGdwb2ludGVyKSBnX3N0cmR1cCAobmFtZSkpOworICAgIH0KKyAgICBnc3RfcGx1Z2luX2ZlYXR1cmVfbGlzdF9mcmVlIChmZWF0dXJlcyk7CisgIH0KKyAgZ3N0X3BsdWdpbl9saXN0X2ZyZWUgKHBsdWdpbnMpOworICBnX3N0cmZyZWV2IChpZ25vcmVsaXN0KTsKK30KKworc3RhdGljIHZvaWQKK3RlYXJkb3duICh2b2lkKQoreworICBHTGlzdCAqZTsKKworICBmb3IgKGUgPSBlbGVtZW50czsgZTsgZSA9IGUtPm5leHQpIHsKKyAgICBnX2ZyZWUgKGUtPmRhdGEpOworICB9CisgIGdfbGlzdF9mcmVlIChlbGVtZW50cyk7CisgIGVsZW1lbnRzID0gTlVMTDsKK30KKworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zdGF0ZV9jaGFuZ2VzX3VwX2FuZF9kb3duX3NlcSkKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudDsKKyAgR0xpc3QgKmU7CisKKyAgZm9yIChlID0gZWxlbWVudHM7IGU7IGUgPSBlLT5uZXh0KSB7CisgICAgY29uc3QgZ2NoYXIgKm5hbWUgPSBlLT5kYXRhOworCisgICAgR1NUX0lORk8gKCJ0ZXN0aW5nIGVsZW1lbnQgJXMiLCBuYW1lKTsKKyAgICBlbGVtZW50ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlIChuYW1lLCBuYW1lKTsKKyAgICBmYWlsX2lmIChlbGVtZW50ID09IE5VTEwsICJDb3VsZCBub3QgbWFrZSBlbGVtZW50IGZyb20gZmFjdG9yeSAlcyIsIG5hbWUpOworCisgICAgaWYgKEdTVF9JU19QSVBFTElORSAoZWxlbWVudCkpIHsKKyAgICAgIEdTVF9ERUJVRyAoImVsZW1lbnQgJXMgaXMgYSBwaXBlbGluZSIsIG5hbWUpOworICAgIH0KKworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1JFQURZKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9QQVVTRUQpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1BMQVlJTkcpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1BBVVNFRCk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUkVBRFkpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX05VTEwpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1BBVVNFRCk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUkVBRFkpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1BMQVlJTkcpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1BBVVNFRCk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfTlVMTCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAoR1NUX09CSkVDVCAoZWxlbWVudCkpOworICB9Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3Rfc3RhdGVfY2hhbmdlc191cF9zZXEpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisgIEdMaXN0ICplOworCisgIGZvciAoZSA9IGVsZW1lbnRzOyBlOyBlID0gZS0+bmV4dCkgeworICAgIGNvbnN0IGdjaGFyICpuYW1lID0gZS0+ZGF0YTsKKworICAgIEdTVF9JTkZPICgidGVzdGluZyBlbGVtZW50ICVzIiwgbmFtZSk7CisgICAgZWxlbWVudCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAobmFtZSwgbmFtZSk7CisgICAgZmFpbF9pZiAoZWxlbWVudCA9PSBOVUxMLCAiQ291bGQgbm90IG1ha2UgZWxlbWVudCBmcm9tIGZhY3RvcnkgJXMiLCBuYW1lKTsKKworICAgIGlmIChHU1RfSVNfUElQRUxJTkUgKGVsZW1lbnQpKSB7CisgICAgICBHU1RfREVCVUcgKCJlbGVtZW50ICVzIGlzIGEgcGlwZWxpbmUiLCBuYW1lKTsKKyAgICB9CisKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9SRUFEWSk7CisKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9QQVVTRUQpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1JFQURZKTsKKworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1BBVVNFRCk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUExBWUlORyk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9SRUFEWSk7CisKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9OVUxMKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChHU1RfT0JKRUNUIChlbGVtZW50KSk7CisgIH0KK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9zdGF0ZV9jaGFuZ2VzX2Rvd25fc2VxKQoreworICBHc3RFbGVtZW50ICplbGVtZW50OworICBHTGlzdCAqZTsKKworICBmb3IgKGUgPSBlbGVtZW50czsgZTsgZSA9IGUtPm5leHQpIHsKKyAgICBjb25zdCBnY2hhciAqbmFtZSA9IGUtPmRhdGE7CisKKyAgICBHU1RfSU5GTyAoInRlc3RpbmcgZWxlbWVudCAlcyIsIG5hbWUpOworICAgIGVsZW1lbnQgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKG5hbWUsIG5hbWUpOworICAgIGZhaWxfaWYgKGVsZW1lbnQgPT0gTlVMTCwgIkNvdWxkIG5vdCBtYWtlIGVsZW1lbnQgZnJvbSBmYWN0b3J5ICVzIiwgbmFtZSk7CisKKyAgICBpZiAoR1NUX0lTX1BJUEVMSU5FIChlbGVtZW50KSkgeworICAgICAgR1NUX0RFQlVHICgiZWxlbWVudCAlcyBpcyBhIHBpcGVsaW5lIiwgbmFtZSk7CisgICAgfQorCisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUkVBRFkpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1BBVVNFRCk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9QQVVTRUQpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9SRUFEWSk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGVsZW1lbnQsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX1BBVVNFRCk7CisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUkVBRFkpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZWxlbWVudCwgR1NUX1NUQVRFX05VTEwpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKEdTVF9PQkpFQ1QgKGVsZW1lbnQpKTsKKyAgfQorfQorCitHU1RfRU5EX1RFU1Q7CisKKworc3RhdGljIFN1aXRlICoKK3N0YXRlc19zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJzdGF0ZXNfZ29vZCIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF9jaGVja2VkX2ZpeHR1cmUgKHRjX2NoYWluLCBzZXR1cCwgdGVhcmRvd24pOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfc3RhdGVfY2hhbmdlc191cF9hbmRfZG93bl9zZXEpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfc3RhdGVfY2hhbmdlc191cF9zZXEpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfc3RhdGVfY2hhbmdlc19kb3duX3NlcSk7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChzdGF0ZXMpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svZ3N0LXBsdWdpbnMtZ29vZC5zdXBwIGIvdGVzdHMvY2hlY2svZ3N0LXBsdWdpbnMtZ29vZC5zdXBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NTk4OGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9nc3QtcGx1Z2lucy1nb29kLnN1cHAKQEAgLTAsMCArMSwxNjUgQEAKK3sKKyAgIDxzZXZlcmFsIHZhbGdyaW5kIHdhcm5pbmdzIGFzIGZvdW5kIHdpdGggbGlianBlZyA2YiBvbiBEZWJpYW4+CisgICBNZW1jaGVjazpDb25kCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBmdW46anBlZ19maW5pc2hfZGVjb21wcmVzcworfQorCit7CisgICA8c2V2ZXJhbCB2YWxncmluZCB3YXJuaW5ncyBhcyBmb3VuZCB3aXRoIGxpYmpwZWcgNmIgb24gRGViaWFuPgorICAgTWVtY2hlY2s6Q29uZAorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgZnVuOmpwZWdfY29uc3VtZV9pbnB1dAorICAgZnVuOmpwZWdfcmVhZF9oZWFkZXIKK30KKworeworICAgPHNldmVyYWwgdmFsZ3JpbmQgd2FybmluZ3MgYXMgZm91bmQgd2l0aCBsaWJqcGVnIDZiIG9uIERlYmlhbj4KKyAgIE1lbWNoZWNrOkNvbmQKKyAgIGZ1bjpqcGVnX2ZpbGxfYml0X2J1ZmZlcgorICAgZnVuOmpwZWdfaHVmZl9kZWNvZGUKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIGZ1bjpqcGVnX3JlYWRfcmF3X2RhdGEKK30KKworeworICAgPHNldmVyYWwgdmFsZ3JpbmQgd2FybmluZ3MgYXMgZm91bmQgd2l0aCBsaWJqcGVnIDZiIG9uIERlYmlhbj4KKyAgIE1lbWNoZWNrOkNvbmQKKyAgIGZ1bjpqcGVnX2ZpbGxfYml0X2J1ZmZlcgorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgZnVuOmpwZWdfcmVhZF9yYXdfZGF0YQorfQorCit7CisgICA8c2V2ZXJhbCB2YWxncmluZCB3YXJuaW5ncyBhcyBmb3VuZCB3aXRoIGxpYmpwZWcgNmIgb24gRGViaWFuPgorICAgTWVtY2hlY2s6Q29uZAorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgZnVuOmpwZWdfY29uc3VtZV9pbnB1dAorICAgZnVuOmpwZWdfcmVhZF9oZWFkZXIKK30KKworeworICAgPHNldmVyYWwgdmFsZ3JpbmQgd2FybmluZ3MgYXMgZm91bmQgd2l0aCBsaWJqcGVnIDZiIG9uIERlYmlhbj4KKyAgIE1lbWNoZWNrOkNvbmQKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIGZ1bjpqcGVnX2ZpbmlzaF9jb21wcmVzcworfQorCit7CisgICA8c2V2ZXJhbCB2YWxncmluZCB3YXJuaW5ncyBhcyBmb3VuZCB3aXRoIGxpYmpwZWcgNmIgb24gRGViaWFuPgorICAgTWVtY2hlY2s6Q29uZAorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgZnVuOmpwZWdfZmluaXNoX2NvbXByZXNzCit9CisKK3sKKyAgIDxzZXZlcmFsIHZhbGdyaW5kIHdhcm5pbmdzIGFzIGZvdW5kIHdpdGggbGlianBlZyA2YiBvbiBEZWJpYW4+CisgICBNZW1jaGVjazpDb25kCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBmdW46anBlZ19maW5pc2hfY29tcHJlc3MKK30KKworeworICAgPHNldmVyYWwgdmFsZ3JpbmQgd2FybmluZ3MgYXMgZm91bmQgd2l0aCBsaWJqcGVnIDZiIG9uIERlYmlhbj4KKyAgIE1lbWNoZWNrOkNvbmQKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIGZ1bjpqcGVnX3dyaXRlX3Jhd19kYXRhCit9CisKK3sKKyAgIDxzZXZlcmFsIHZhbGdyaW5kIHdhcm5pbmdzIGFzIGZvdW5kIHdpdGggbGlianBlZyA2YiBvbiBEZWJpYW4+CisgICBNZW1jaGVjazpDb25kCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBmdW46anBlZ193cml0ZV9yYXdfZGF0YQorfQorCit7CisgICA8c2V2ZXJhbCB2YWxncmluZCB3YXJuaW5ncyBhcyBmb3VuZCB3aXRoIGxpYmpwZWcgNmIgb24gRGViaWFuPgorICAgTWVtY2hlY2s6Q29uZAorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgZnVuOmpwZWdfd3JpdGVfcmF3X2RhdGEKK30KKworeworICAgPHNldmVyYWwgdmFsZ3JpbmQgd2FybmluZ3MgYXMgZm91bmQgd2l0aCBsaWJqcGVnIDZiIG9uIERlYmlhbj4KKyAgIE1lbWNoZWNrOkNvbmQKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIG9iajovdXNyL2xpYi9saWJqcGVnLnNvLioKKyAgIGZ1bjpqcGVnX3dyaXRlX3Jhd19kYXRhCit9CisKK3sKKyAgIDxzZXZlcmFsIHZhbGdyaW5kIHdhcm5pbmdzIGFzIGZvdW5kIHdpdGggbGlianBlZyA2YiBvbiBEZWJpYW4+CisgICBNZW1jaGVjazpDb25kCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBvYmo6L3Vzci9saWIvbGlianBlZy5zby4qCisgICBmdW46amluaXRfY29tcHJlc3NfbWFzdGVyCisgICBmdW46anBlZ19zdGFydF9jb21wcmVzcworfQorCit7CisgICA8c2V2ZXJhbCB2YWxncmluZCB3YXJuaW5ncyBhcyBmb3VuZCB3aXRoIGxpYmpwZWcgNmIgb24gRGViaWFuPgorICAgTWVtY2hlY2s6Q29uZAorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgb2JqOi91c3IvbGliL2xpYmpwZWcuc28uKgorICAgZnVuOmppbml0X2NvbXByZXNzX21hc3RlcgorICAgZnVuOmpwZWdfc3RhcnRfY29tcHJlc3MKK30KKworeworICAgPHdlbGwga25vd24gemxpYiBidWc+CisgICBNZW1jaGVjazpDb25kCisgICBmdW46aW5mbGF0ZVJlc2V0MgorICAgZnVuOmluZmxhdGVJbml0Ml8KKyAgIGZ1bjpwbmdfY3JlYXRlX3JlYWRfc3RydWN0XzIKKyAgIGZ1bjpwbmdfY3JlYXRlX3JlYWRfc3RydWN0Cit9CisKK3sKKyAgIDxhcHBhcmVudCBzdHJ0b2QgYnVnIHdoZW4gdHJ5aW5nIHRvIHBhcnNlICJpbmZpbml0eSIgZnJvbSAiaW50ZXJsZWF2ZWQiPgorICAgTWVtY2hlY2s6QWRkcjgKKyAgIGZ1bjpfX0dJX19fc3RybmNhc2VjbXBfbAorICAgZnVuOl9fX19zdHJ0b2RfbF9pbnRlcm5hbAorICAgZnVuOmdzdF92YWx1ZV9kZXNlcmlhbGl6ZV9kb3VibGUKK30KKworIyMgbGFtZQorCit7CisgICA8bGFtZSBDb25kaXRpb25hbCBqdW1wIG9yIG1vdmUgZGVwZW5kcyBvbiB1bmluaXRpYWxpc2VkIHZhbHVlcz4KKyAgIE1lbWNoZWNrOkNvbmQKKyAgIGZ1bjpMM3BzeWNob19hbmFsX3ZicgorICAgZnVuOmxhbWVfZW5jb2RlX21wM19mcmFtZQorICAgLi4uCisgICBmdW46bGFtZV9lbmNvZGVfZmx1c2gKKyAgIGZ1bjpnc3RfbGFtZW1wM2VuY19zaW5rX2V2ZW50Cit9CisKK3sKKyAgIDx0d29sYW1lIENvbmRpdGlvbmFsIGp1bXAgb3IgbW92ZSBkZXBlbmRzIG9uIHVuaW5pdGlhbGlzZWQgdmFsdWVzPgorICAgTWVtY2hlY2s6Q29uZAorICAgLi4uCisgICBmdW46cHN5Y2hvXzMKKyAgIGZ1bjplbmNvZGVfZnJhbWUKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svbWVzb24uYnVpbGQgYi90ZXN0cy9jaGVjay9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDA1MzI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svbWVzb24uYnVpbGQKQEAgLTAsMCArMSwyMTUgQEAKKyMgRklYTUU6IHVzZSBkZXBlbmRlbmN5KCd2YWxncmluZCcpIG9uY2Ugd2UgaGF2ZSBhIG1ldGhvZCB0byBnZXQgdGhlIGluY2x1ZGVzCitpZiBjYy5oYXNfaGVhZGVyKCd2YWxncmluZC92YWxncmluZC5oJykKKyAgY2RhdGEuc2V0KCdIQVZFX1ZBTEdSSU5EJywgMSkKK2VuZGlmCisKKyMgaW50ZXJuYWwgaGVscGVyIGxpYiBmb3IgdW5pdCB0ZXN0aW5nIGF1ZGlvIHBhcnNlcnMKK2xpYnBhcnNlciA9IHN0YXRpY19saWJyYXJ5KCdsaWJwYXJzZXInLCAnZWxlbWVudHMvcGFyc2VyLmMnLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MgKyBbJy1ER1NUX1VTRV9VTlNUQUJMRV9BUEknXSwKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBkZXBlbmRlbmNpZXMgOiBbZ3N0Y2hlY2tfZGVwXSwKKyAgaW5zdGFsbCA6IGZhbHNlKQorCitsaWJwYXJzZXJfZGVwID0gZGVjbGFyZV9kZXBlbmRlbmN5KGxpbmtfd2l0aCA6IGxpYnBhcnNlciwKKyAgZGVwZW5kZW5jaWVzIDogZ3N0Y2hlY2tfZGVwKQorCisjIG5hbWUsIGNvbmRpdGlvbiB3aGVuIHRvIHNraXAgdGhlIHRlc3QgYW5kIGV4dHJhIGRlcGVuZGVuY2llcworZ29vZF90ZXN0cyA9IFsKKyAgWyAnZWxlbWVudHMvYXVkaW9hbXBsaWZ5JyBdLAorICBbICdlbGVtZW50cy9hdWRpb2NoZWJiYW5kJyBdLAorICBbICdlbGVtZW50cy9hdWRpb2NoZWJsaW1pdCcgXSwKKyAgWyAnZWxlbWVudHMvYXVkaW9keW5hbWljJyBdLAorICBbICdlbGVtZW50cy9hdWRpb2VjaG8nIF0sCisgIFsgJ2VsZW1lbnRzL2F1ZGlvZmlyZmlsdGVyJyBdLAorICBbICdlbGVtZW50cy9hdWRpb2lpcmZpbHRlcicgXSwKKyAgWyAnZWxlbWVudHMvYXVkaW9pbnZlcnQnIF0sCisgIFsgJ2VsZW1lbnRzL2F1ZGlvcGFub3JhbWEnIF0sCisgIFsgJ2VsZW1lbnRzL2F1ZGlvd3NpbmNiYW5kJyBdLAorICBbICdlbGVtZW50cy9hdWRpb3dzaW5jbGltaXQnIF0sCisgIFsgJ2VsZW1lbnRzL2FscGhhY29sb3InIF0sCisgIFsgJ2VsZW1lbnRzL2FscGhhJyBdLAorICBbICdlbGVtZW50cy9hYWNwYXJzZScsIGZhbHNlLCBbbGlicGFyc2VyX2RlcF0gXSwKKyAgWyAnZWxlbWVudHMvYWMzcGFyc2UnLCBmYWxzZSwgW2xpYnBhcnNlcl9kZXBdIF0sCisgIFsgJ2VsZW1lbnRzL2FtcnBhcnNlJywgZmFsc2UsIFtsaWJwYXJzZXJfZGVwXSBdLAorICBbICdlbGVtZW50cy9mbGFjcGFyc2UnLCBmYWxzZSwgW2xpYnBhcnNlcl9kZXBdIF0sCisgIFsgJ2VsZW1lbnRzL21wZWdhdWRpb3BhcnNlJywgZmFsc2UsIFtsaWJwYXJzZXJfZGVwXSBdLAorICBbICdlbGVtZW50cy93YXZwYWNrcGFyc2UnIF0sCisgIFsgJ2VsZW1lbnRzL2F1dG9kZXRlY3QnIF0sCisgIFsgJ2VsZW1lbnRzL2F2aW11eCcgXSwKKyAgWyAnZWxlbWVudHMvYXZpc3VidGl0bGUnIF0sCisgIFsgJ2VsZW1lbnRzL2NhcHNzZXR0ZXInIF0sCisgIFsgJ2VsZW1lbnRzL2RlaW50ZXJsYWNlJyBdLAorICBbICdlbGVtZW50cy9kdG1mJyBdLAorICBbICdwaXBlbGluZXMvZmxhY2RlYycsIG5vdCBmbGFjX2RlcC5mb3VuZCgpIF0sCisgIFsgJ2VsZW1lbnRzL2ZsdmRlbXV4JyBdLAorICBbICdlbGVtZW50cy9mbHZtdXgnIF0sCisgIFsgJ2VsZW1lbnRzL3F0bXV4JyBdLAorICBbICdlbGVtZW50cy9xdGRlbXV4JyBdLAorICBbICdlbGVtZW50cy9tdWxhd2RlYycgXSwKKyAgWyAnZWxlbWVudHMvbXVsYXdlbmMnIF0sCisgIFsgJ2VsZW1lbnRzL2dka3BpeGJ1ZnNpbmsnLCBub3QgZ2RrcGl4YnVmX2RlcC5mb3VuZCgpLCBbZ2RrcGl4YnVmX2RlcF0gXSwKKyAgWyAnZWxlbWVudHMvZ2RrcGl4YnVmb3ZlcmxheScsIG5vdCBnZGtwaXhidWZfZGVwLmZvdW5kKCkgXSwKKyAgWyAnZWxlbWVudHMvaWN5ZGVtdXgnIF0sCisgIFsgJ2VsZW1lbnRzL2lkM2RlbXV4JyBdLAorICBbICdlbGVtZW50cy9pbWFnZWZyZWV6ZScgXSwKKyAgWyAnZWxlbWVudHMvZGVpbnRlcmxlYXZlJyBdLAorICBbICdlbGVtZW50cy9pbnRlcmxlYXZlJyBdLAorICBbICdlbGVtZW50cy9qcGVnZGVjJywgbm90IGpwZWdsaWIuZm91bmQoKSBdLAorICBbICdlbGVtZW50cy9qcGVnZW5jJywgbm90IGpwZWdsaWIuZm91bmQoKSBdLAorICBbICdlbGVtZW50cy9sZXZlbCcgXSwKKyAgWyAnZWxlbWVudHMvbWF0cm9za2FkZW11eCcgXSwKKyAgWyAnZWxlbWVudHMvbWF0cm9za2FtdXgnIF0sCisgIFsgJ2VsZW1lbnRzL21hdHJvc2thcGFyc2UnIF0sCisgIFsgJ2VsZW1lbnRzL21wZzEyM2F1ZGlvZGVjJywgbm90IG1wZzEyM19kZXAuZm91bmQoKSwgIFtnc3RmZnRfZGVwXV0sCisgIFsgJ2VsZW1lbnRzL211bHRpZmlsZScgXSwKKyAgWyAnZWxlbWVudHMvc3BsaXRtdXgnIF0sCisgIFsgJ2VsZW1lbnRzL3JnYW5hbHlzaXMnIF0sCisgIFsgJ2VsZW1lbnRzL3JnbGltaXRlcicgXSwKKyAgWyAnZWxlbWVudHMvcmd2b2x1bWUnIF0sCisgIFsgJ2VsZW1lbnRzL3J0cC1wYXlsb2FkaW5nJyBdLAorICBbICdlbGVtZW50cy9ydHBoMjYxJyBdLAorICBbICdlbGVtZW50cy9ydHBoMjYzJyBdLAorICBbICdlbGVtZW50cy9ydHB2cDknIF0sCisgIFsgJ2VsZW1lbnRzL3J0cGF1eCcgXSwKKyAgWyAnZWxlbWVudHMvcnRwYmluJyBdLAorICBbICdlbGVtZW50cy9ydHBiaW5fYnVmZmVyX2xpc3QnIF0sCisgIFsgJ2VsZW1lbnRzL3J0cGJ1bmRsZScgXSwKKyAgWyAnZWxlbWVudHMvcnRwY29sbGlzaW9uJyBdLAorICBbICdlbGVtZW50cy9ydHBqaXR0ZXJidWZmZXInIF0sCisgIFsgJ2VsZW1lbnRzL3J0cG11eCcgXSwKKyAgWyAnZWxlbWVudHMvcnRwcnR4JyBdLAorICBbICdlbGVtZW50cy9ydHBzZXNzaW9uJyBdLAorICBbICdlbGVtZW50cy9zb3VwaHR0cHNyYycsIG5vdCBsaWJzb3VwX2RlcC5mb3VuZCgpLCBbbGlic291cF9kZXBdIF0sCisgIFsgJ2VsZW1lbnRzL3NwZWN0cnVtJyBdLAorICBbICdlbGVtZW50cy9zaGFwZXdpcGUnIF0sCisgIFsgJ2VsZW1lbnRzL2lkM3YybXV4Jywgbm90IHRhZ2xpYl9kZXAuZm91bmQoKSBdLAorICBbICdlbGVtZW50cy9hcGV2Mm11eCcsIG5vdCB0YWdsaWJfZGVwLmZvdW5kKCkgXSwKKyAgWyAnZWxlbWVudHMvdWRwc2luaycgXSwKKyAgWyAnZWxlbWVudHMvdWRwc3JjJyBdLAorICBbICdlbGVtZW50cy92aWRlb2JveCcgXSwKKyAgWyAnZWxlbWVudHMvYXNwZWN0cmF0aW9jcm9wJyBdLAorICBbICdlbGVtZW50cy92aWRlb2Nyb3AnIF0sCisgIFsgJ2VsZW1lbnRzL3ZpZGVvZmlsdGVyJyBdLAorICBbICdlbGVtZW50cy92aWRlb21peGVyJyBdLAorICBbICdlbGVtZW50cy92cDhlbmMnLCBub3QgdnB4X2RlcC5mb3VuZCgpIG9yIG5vdCBoYXZlX3ZwOF9lbmNvZGVyIF0sCisgIFsgJ2VsZW1lbnRzL3ZwOGRlYycsIG5vdCB2cHhfZGVwLmZvdW5kKCkgb3Igbm90IGhhdmVfdnA4X2RlY29kZXIgXSwKKyAgWyAnZWxlbWVudHMvdnA5ZW5jJywgbm90IHZweF9kZXAuZm91bmQoKSBvciBub3QgaGF2ZV92cDlfZW5jb2RlciBdLAorICBbICdwaXBlbGluZXMvbGFtZScsIG5vdCBsYW1lX2RlcC5mb3VuZCgpIF0sCisgIFsgJ3BpcGVsaW5lcy93YXZlbmMnIF0sCisgIFsgJ2VsZW1lbnRzL3dhdnBhY2tkZWMnLCBub3Qgd2F2cGFja19kZXAuZm91bmQoKSBdLAorICBbICdlbGVtZW50cy93YXZwYWNrZW5jJywgbm90IHdhdnBhY2tfZGVwLmZvdW5kKCkgXSwKKyAgWyAncGlwZWxpbmVzL3dhdnBhY2snLCBub3Qgd2F2cGFja19kZXAuZm91bmQoKSBdLAorICBbICdlbGVtZW50cy93YXZwYXJzZScgXSwKKyAgWyAnZWxlbWVudHMveTRtZW5jJyBdLAorICBbICdwaXBlbGluZXMvZWZmZWN0dicgXSwKKyAgWyAnZWxlbWVudHMvZXF1YWxpemVyJyBdLAorICBbICdnZW5lcmljL3N0YXRlcycgXSwKKyAgWyAncGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMnIF0sCisgIFsgJ3BpcGVsaW5lcy90YWdzY2hlY2tpbmcnIF0sCitdCisKKyMgRklYTUU6IHZhbGdyaW5kIGVsZW1lbnRzL3J0cC1wYXlsb2FkaW5nIC0gbmVlZHMgZml4aW5nCisjIGVsZW1lbnRzL3ZpZGVvY3JvcCBzaG91bGQgYmUgZGlzYWJsZWQgc2luY2UgaXQgdGFrZXMgd2F5IHRvbyBsb25nIGluIHZhbGdyaW5kCisKK2Zvbz0nJycKK2lmIEhBVkVfT1JDCitjaGVja19vcmMgPSBvcmMvZGVpbnRlcmxhY2Ugb3JjL3ZpZGVvbWl4ZXIgb3JjL3ZpZGVvYm94CitlbHNlCitjaGVja19vcmMgPQorZW5kaWYKKycnJworCit0ZXN0X2RlZmluZXMgPSBbCisgICctVUdfRElTQUJMRV9BU1NFUlQnLAorICAnLVVHX0RJU0FCTEVfQ0FTVF9DSEVDS1MnLAorICAnLURHU1RfQ0hFQ0tfVEVTVF9FTlZJUk9OTUVOVF9CRUFDT049IkdTVF9QTFVHSU5fTE9BRElOR19XSElURUxJU1QiJywKKyAgJy1ER1NUX1RFU1RfRklMRVNfUEFUSD0iJyArIG1lc29uLmN1cnJlbnRfc291cmNlX2RpcigpICsgJy8uLi9maWxlcyInLAorICAnLURHU1RfVVNFX1VOU1RBQkxFX0FQSScsCitdCisKK3BsdWdpbnNkaXJzID0gW10KK2lmIGdzdF9kZXAudHlwZV9uYW1lKCkgPT0gJ3BrZ2NvbmZpZycKKyAgcGJhc2UgPSBkZXBlbmRlbmN5KCdnc3RyZWFtZXItcGx1Z2lucy1iYXNlLScgKyBhcGlfdmVyc2lvbiwgcmVxdWlyZWQgOiBmYWxzZSkKKyAgcGx1Z2luc2RpcnMgPSBbZ3N0X2RlcC5nZXRfcGtnY29uZmlnX3ZhcmlhYmxlKCdwbHVnaW5zZGlyJyksCisgICAgICAgICAgICAgICAgIHBiYXNlLmdldF9wa2djb25maWdfdmFyaWFibGUoJ3BsdWdpbnNkaXInKV0KK2VuZGlmCisKKyMgZmFrZSBkZXZpY2UgZHJpdmVyczogd2UgY291bGQgcnVuIGhhcmR3YXJlIGVsZW1lbnQgdGVzdHMgYWdhaW5zdCBkdW1teSBkcml2ZXJzCisjIHY0bDI6IHZpdm8gKHBhcnQgb2Ygbm9ybWFsIGtlcm5lbCkKKyMgICBtb2Rwcm9iZSB2aXZvOworIyAgIGdzdC1sYXVuY2ggdjRsMnNyYyBkZXZpY2U9Ii9kZXYvdmlkZW8xIiAhIHh2aW1hZ2VzaW5rOworIyAgIHJtbW9kIHZpdm8KKyMKKyMgYWxzYTogc25kLWR1bW15IChwYXJ0IG9mIG5vcm1hbCBhbHNhLCBub3QgcmVtb3ZhYmxlKQorIyAgIG1vZHByb2JlIHNuZC1kdW1teTsKKyMgICBnc3QtbGF1bmNoIGFsc2FzcmMgZGV2aWNlPSJodzoyIiAhIGZha2VzaW5rCisjICAgZ3N0LWxhdW5jaCBmYWtlc3JjICEgYWxzYXNpbmsgZGV2aWNlPSJodzoyIgorIworIyBuZWVkIGEgd2F5IHRvIGZpZ3VyZSBvdXQgdmFsdWUgZm9yIHRoZSBkZXZpY2UgcHJvcGVydHkKK3N0YXRlX2lnbm9yZV9lbGVtZW50cyA9ICcnJ2Fhc2luayBhdXRvYXVkaW9zcmMgYXV0b2F1ZGlvc2luayBhdXRvdmlkZW9zcmMKKyBhdXRvdmlkZW9zaW5rIGNhY2FzaW5rIGNhaXJvdGV4dG92ZXJsYXkgamFja2F1ZGlvc3JjIGphY2thdWRpb3NpbmsKKyBvc3NzcmMgb3Nzc2luayBvc3hhdWRpb3Npbmsgb3N4YXVkaW9zcmMgb3N4dmlkZW9zcmMgb3N4dmlkZW9zaW5rCisgcHVsc2VzaW5rIHB1bHNlc3JjIHB1bHNlbWl4ZXIgdjRsMnNyYycnJworCisjIEZJWE1FOiBjaGVjaywgYWxzbyArIFBUSFJFQURfQ0ZMQUdTCit0ZXN0X2RlcHMgPSBbZ3N0X2RlcCwgZ3N0YmFzZV9kZXAsIGdzdG5ldF9kZXAsIGdzdGNoZWNrX2RlcCwgZ3N0YXVkaW9fZGVwLAorICBnc3R2aWRlb19kZXAsIGdzdHBidXRpbHNfZGVwLCBnc3RydHBfZGVwLCBnc3RydHNwX2RlcCwgZ3N0dGFnX2RlcCwKKyAgZ3N0YXBwX2RlcCwgZ2lvX2RlcF0gKyBnbGliX2RlcHMKKworIyBGSVhNRTogYWRkIHZhbGdyaW5kIHN1cHByZXNzaW9uIGNvbW1vbi9nc3Quc3VwcCBnc3QtcGx1Z2lucy1nb29kLnN1cHAKK2ZvcmVhY2ggdCA6IGdvb2RfdGVzdHMKKyAgZm5hbWUgPSAnQDBALmMnLmZvcm1hdCh0LmdldCgwKSkKKyAgdGVzdF9uYW1lID0gdC5nZXQoMCkudW5kZXJzY29yaWZ5KCkKKyAgZXh0cmFfZGVwcyA9IFsgXQorICBpZiB0Lmxlbmd0aCgpID09IDMKKyAgICBleHRyYV9kZXBzID0gdC5nZXQoMikKKyAgICBza2lwX3Rlc3QgPSB0LmdldCgxKQorICBlbGlmIHQubGVuZ3RoKCkgPT0gMgorICAgIHNraXBfdGVzdCA9IHQuZ2V0KDEpCisgIGVsc2UKKyAgICBza2lwX3Rlc3QgPSBmYWxzZQorICBlbmRpZgorICBpZiBub3Qgc2tpcF90ZXN0CisgICAgZW52ID0gZW52aXJvbm1lbnQoKQorICAgIGVudi5zZXQoJ0dTVF9QTFVHSU5fU1lTVEVNX1BBVEhfMV8wJywgJycpCisgICAgZW52LnNldCgnR1NUX1NUQVRFX0lHTk9SRV9FTEVNRU5UUycsIHN0YXRlX2lnbm9yZV9lbGVtZW50cykKKyAgICBlbnYuc2V0KCdDS19ERUZBVUxUX1RJTUVPVVQnLCAnMjAnKQorICAgIGVudi5zZXQoJ0dTVF9QTFVHSU5fTE9BRElOR19XSElURUxJU1QnLCAnZ3N0cmVhbWVyJywgJ2dzdC1wbHVnaW5zLWJhc2UnLAorICAgICAgJ2dzdC1wbHVnaW5zLWdvb2RAJyArIG1lc29uLmJ1aWxkX3Jvb3QoKSwgc2VwYXJhdG9yOiAnOicpCisgICAgZW52LnNldCgnR1NUX1BMVUdJTl9QQVRIXzFfMCcsIFttZXNvbi5idWlsZF9yb290KCldICsgcGx1Z2luc2RpcnMpCisgICAgZW52LnNldCgnR1NFVFRJTkdTX0JBQ0tFTkQnLCAnbWVtb3J5JykKKworICAgIGVudi5zZXQoJ0dTVF9SRUdJU1RSWScsICdAMEAvQDFALnJlZ2lzdHJ5Jy5mb3JtYXQobWVzb24uY3VycmVudF9idWlsZF9kaXIoKSwgdGVzdF9uYW1lKSkKKyAgICBleGUgPSBleGVjdXRhYmxlKHRlc3RfbmFtZSwgZm5hbWUsCisgICAgICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgICAgICBjX2FyZ3MgOiBbJy1ESEFWRV9DT05GSUdfSD0xJyBdICsgdGVzdF9kZWZpbmVzLAorICAgICAgZGVwZW5kZW5jaWVzIDogW2xpYm1dICsgdGVzdF9kZXBzICsgZXh0cmFfZGVwcywKKyAgICApCisgICAgdGVzdCh0ZXN0X25hbWUsIGV4ZSwgZW52OiBlbnYsIHRpbWVvdXQ6IDMgKiA2MCkKKyAgZW5kaWYKK2VuZGZvcmVhY2gKKworIyBGSVhNRTogb3JjIHRlc3RzCitmaXhtZV9vcmNfdGVzdHM9JycnCitvcmNfZGVpbnRlcmxhY2VfQ0ZMQUdTID0gJChPUkNfQ0ZMQUdTKQorb3JjX2RlaW50ZXJsYWNlX0xEQUREID0gJChPUkNfTElCUykgLWxvcmMtdGVzdC0wLjQKK25vZGlzdF9vcmNfZGVpbnRlcmxhY2VfU09VUkNFUyA9IG9yYy9kZWludGVybGFjZS5jCitvcmNfdmlkZW9taXhlcl9DRkxBR1MgPSAkKE9SQ19DRkxBR1MpCitvcmNfdmlkZW9taXhlcl9MREFERCA9ICQoT1JDX0xJQlMpIC1sb3JjLXRlc3QtMC40Citub2Rpc3Rfb3JjX3ZpZGVvbWl4ZXJfU09VUkNFUyA9IG9yYy92aWRlb21peGVyLmMKK29yY192aWRlb2JveF9DRkxBR1MgPSAkKE9SQ19DRkxBR1MpCitvcmNfdmlkZW9ib3hfTERBREQgPSAkKE9SQ19MSUJTKSAtbG9yYy10ZXN0LTAuNAorbm9kaXN0X29yY192aWRlb2JveF9TT1VSQ0VTID0gb3JjL3ZpZGVvYm94LmMKKworb3JjL2RlaW50ZXJsYWNlLmM6ICQodG9wX3NyY2RpcikvZ3N0L2RlaW50ZXJsYWNlL3R2dGltZS5vcmMKKwkkKE1LRElSX1ApIG9yYy8KKwkkKE9SQ0MpIC0tdGVzdCAtbyAkQCAkPAorCitvcmMvdmlkZW9taXhlci5jOiAkKHRvcF9zcmNkaXIpL2dzdC92aWRlb21peGVyL3ZpZGVvbWl4ZXJvcmMub3JjCisJJChNS0RJUl9QKSBvcmMvCisJJChPUkNDKSAtLXRlc3QgLW8gJEAgJDwKKworb3JjL3ZpZGVvYm94LmM6ICQodG9wX3NyY2RpcikvZ3N0L3ZpZGVvYm94L2dzdHZpZGVvYm94b3JjLm9yYworCSQoTUtESVJfUCkgb3JjLworCSQoT1JDQykgLS10ZXN0IC1vICRAICQ8CisnJycKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL3BpcGVsaW5lcy8uZ2l0aWdub3JlIGIvdGVzdHMvY2hlY2svcGlwZWxpbmVzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3MGVkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL3BpcGVsaW5lcy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMTAgQEAKKy5kaXJzdGFtcAorZWZmZWN0dgorZmxhY2RlYworbGFtZQordHdvbGFtZQorc2ltcGxlLWxhdW5jaC1saW5lcwordGFnc2NoZWNraW5nCit3YXZlbmMKK3dhdnBhY2sKKyouY2hlY2sueG1sCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9waXBlbGluZXMvZWZmZWN0di5jIGIvdGVzdHMvY2hlY2svcGlwZWxpbmVzL2VmZmVjdHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTQ4MDZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svcGlwZWxpbmVzL2VmZmVjdHYuYwpAQCAtMCwwICsxLDE0NyBAQAorLyogR1N0cmVhbWVyCisgKgorICogQ29weXJpZ2h0IChDKSA8MjAwOT4gU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit0eXBlZGVmIHN0cnVjdAoreworICBHTWFpbkxvb3AgKmxvb3A7CisgIGdib29sZWFuIGVvczsKK30gT25NZXNzYWdlVXNlckRhdGE7CisKK3N0YXRpYyB2b2lkCitvbl9tZXNzYWdlX2NiIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIE9uTWVzc2FnZVVzZXJEYXRhICpkID0gdXNlcl9kYXRhOworCisgIHN3aXRjaCAoR1NUX01FU1NBR0VfVFlQRSAobWVzc2FnZSkpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VSUk9SOgorICAgIGNhc2UgR1NUX01FU1NBR0VfV0FSTklORzoKKyAgICAgIGdfYXNzZXJ0X25vdF9yZWFjaGVkICgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FT1M6CisgICAgICBnX21haW5fbG9vcF9xdWl0IChkLT5sb29wKTsKKyAgICAgIGQtPmVvcyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3J1bl90ZXN0IChjb25zdCBnY2hhciAqIHBpcGVsaW5lX3N0cmluZykKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEJ1cyAqYnVzOworICBHTWFpbkxvb3AgKmxvb3A7CisgIE9uTWVzc2FnZVVzZXJEYXRhIG9tdWQgPSB7IE5VTEwsIH07CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBHU1RfREVCVUcgKCJUZXN0aW5nIHBpcGVsaW5lICclcyciLCBwaXBlbGluZV9zdHJpbmcpOworCisgIHBpcGVsaW5lID0gZ3N0X3BhcnNlX2xhdW5jaCAocGlwZWxpbmVfc3RyaW5nLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHBpcGVsaW5lICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChwaXBlbGluZSksICJhc3luYy1oYW5kbGluZyIsIFRSVUUsIE5VTEwpOworCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChwaXBlbGluZSk7CisgIGZhaWxfdW5sZXNzIChidXMgIT0gTlVMTCk7CisgIGdzdF9idXNfYWRkX3NpZ25hbF93YXRjaCAoYnVzKTsKKworICBvbXVkLmxvb3AgPSBsb29wOworICBvbXVkLmVvcyA9IEZBTFNFOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2UiLCAoR0NhbGxiYWNrKSBvbl9tZXNzYWdlX2NiLCAmb211ZCk7CisKKworICByZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGZhaWxfdW5sZXNzIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTCisgICAgICB8fCByZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9BU1lOQyk7CisKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwKKyAgICAgICAgICBHU1RfU1RBVEVfTlVMTCkgPT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKTsKKworICBmYWlsX3VubGVzcyAob211ZC5lb3MgPT0gVFJVRSk7CisKKyAgZ3N0X2J1c19yZW1vdmVfc2lnbmFsX3dhdGNoIChidXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisgIGdfbWFpbl9sb29wX3VucmVmIChsb29wKTsKK30KKworI2RlZmluZSBDUkVBVEVfVEVTVChlbGVtZW50KSBcCitHU1RfU1RBUlRfVEVTVCAodGVzdF8jI2VsZW1lbnQpIFwKK3sgXAorICBnY2hhciAqcGlwZWxpbmU7IFwKKyAgXAorICBwaXBlbGluZSA9IGdfc3RyZHVwX3ByaW50ZiAoInZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz0xMDAgISAiIFwKKyAgICAgICJ2aWRlb2NvbnZlcnQgISAiIFwKKyAgICAgICIgJXMgISAiIFwKKyAgICAgICIgZmFrZXNpbmsiLCAjZWxlbWVudCk7IFwKKyAgXAorICBydW5fdGVzdCAocGlwZWxpbmUpOyBcCisgIGdfZnJlZSAocGlwZWxpbmUpOyBcCit9IFwKK1wKK0dTVF9FTkRfVEVTVDsKKworQ1JFQVRFX1RFU1QgKGFnaW5ndHYpOworQ1JFQVRFX1RFU1QgKGRpY2V0dik7CitDUkVBVEVfVEVTVCAoZWRnZXR2KTsKK0NSRUFURV9URVNUIChvcHR2KTsKK0NSRUFURV9URVNUIChxdWFya3R2KTsKK0NSRUFURV9URVNUIChyYWRpb2FjdHYpOworQ1JFQVRFX1RFU1QgKHJldnR2KTsKK0NSRUFURV9URVNUIChyaXBwbGV0dik7CitDUkVBVEVfVEVTVCAoc2hhZ2FkZWxpY3R2KTsKK0NSRUFURV9URVNUIChzdHJlYWt0dik7CitDUkVBVEVfVEVTVCAodmVydGlnb3R2KTsKK0NSRUFURV9URVNUICh3YXJwdHYpOworCitzdGF0aWMgU3VpdGUgKgorZWZmZWN0dl9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJlZmZlY3R2Iik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2Vfc2V0X3RpbWVvdXQgKHRjX2NoYWluLCAxODApOworCisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9hZ2luZ3R2KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2RpY2V0dik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9lZGdldHYpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfb3B0dik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9xdWFya3R2KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3JhZGlvYWN0dik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9yZXZ0dik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9yaXBwbGV0dik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9zaGFnYWRlbGljdHYpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3Rfc3RyZWFrdHYpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdmVydGlnb3R2KTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X3dhcnB0dik7CisKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChlZmZlY3R2KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL3BpcGVsaW5lcy9mbGFjZGVjLmMgYi90ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MWQ3N2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9waXBlbGluZXMvZmxhY2RlYy5jCkBAIC0wLDAgKzEsMjU2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaG9tYXMgVmFuZGVyIFN0aWNoZWxlIDx0aG9tYXMgYXQgYXBlc3RhYXJ0IGRvdCBvcmc+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdzdC9hdWRpby9hdWRpby5oPgorI2luY2x1ZGUgPGdsaWIvZ3N0ZGlvLmg+CisKK3N0YXRpYyBndWludDE2CitfZ2V0X2ZpcnN0X3NhbXBsZSAoR3N0U2FtcGxlICogc2FtcGxlKQoreworICBHc3RBdWRpb0luZm8gaW5mbzsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0QnVmZmVyICpidWY7CisgIEdzdE1hcEluZm8gbWFwOworICBndWludDE2IHJlczsKKworICBmYWlsX3VubGVzcyAoc2FtcGxlICE9IE5VTEwsICJOVUxMIHNhbXBsZSIpOworCisgIGNhcHMgPSBnc3Rfc2FtcGxlX2dldF9jYXBzIChzYW1wbGUpOworICBmYWlsX3VubGVzcyAoY2FwcyAhPSBOVUxMLCAic2FtcGxlIHdpdGhvdXQgY2FwcyIpOworCisgIGJ1ZiA9IGdzdF9zYW1wbGVfZ2V0X2J1ZmZlciAoc2FtcGxlKTsKKyAgR1NUX0RFQlVHICgiYnVmZmVyIHdpdGggc2l6ZT0lIiBHX0dTSVpFX0ZPUk1BVCAiLCBjYXBzPSUiIEdTVF9QVFJfRk9STUFULAorICAgICAgZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoYnVmKSwgY2Fwcyk7CisKKyAgZ3N0X2J1ZmZlcl9tYXAgKGJ1ZiwgJm1hcCwgR1NUX01BUF9SRUFEKTsKKyAgLyogbG9nIGJ1ZmZlciBkZXRhaWxzICovCisgIEdTVF9NRU1EVU1QICgiYnVmZmVyIGRhdGEgZnJvbSBkZWNvZGVyIiwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKworICAvKiBtYWtlIHN1cmUgaXQncyB0aGUgZm9ybWF0IHdlIGV4cGVjdCAqLworICBmYWlsX3VubGVzcyAoZ3N0X2F1ZGlvX2luZm9fZnJvbV9jYXBzICgmaW5mbywgY2FwcykpOworCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKEdTVF9BVURJT19JTkZPX1dJRFRIICgmaW5mbyksIDE2KTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0FVRElPX0lORk9fREVQVEggKCZpbmZvKSwgMTYpOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChHU1RfQVVESU9fSU5GT19SQVRFICgmaW5mbyksIDQ0MTAwKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoR1NUX0FVRElPX0lORk9fQ0hBTk5FTFMgKCZpbmZvKSwgMSk7CisKKyAgaWYgKEdTVF9BVURJT19JTkZPX0lTX0xJVFRMRV9FTkRJQU4gKCZpbmZvKSkKKyAgICByZXMgPSBHU1RfUkVBRF9VSU5UMTZfTEUgKG1hcC5kYXRhKTsKKyAgZWxzZQorICAgIHJlcyA9IEdTVF9SRUFEX1VJTlQxNl9CRSAobWFwLmRhdGEpOworCisgIGdzdF9idWZmZXJfdW5tYXAgKGJ1ZiwgJm1hcCk7CisKKyAgcmV0dXJuIHJlczsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZGVjb2RlKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0RWxlbWVudCAqYXBwc2luazsKKyAgR3N0U2FtcGxlICpzYW1wbGUgPSBOVUxMOworICBndWludDE2IGZpcnN0X3NhbXBsZSA9IDA7CisgIGd1aW50IHNpemUgPSAwOworICBnY2hhciAqcGF0aCA9CisgICAgICBnX2J1aWxkX2ZpbGVuYW1lIChHU1RfVEVTVF9GSUxFU19QQVRILCAiYXVkaW90ZXN0c3JjLmZsYWMiLCBOVUxMKTsKKyAgZ2NoYXIgKnBpcGVfZGVzYyA9CisgICAgICBnX3N0cmR1cF9wcmludGYKKyAgICAgICgiZmlsZXNyYyBsb2NhdGlvbj1cIiVzXCIgISBmbGFjcGFyc2UgISBmbGFjZGVjICEgYXBwc2luayBuYW1lPXNpbmsiLAorICAgICAgcGF0aCk7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGFyc2VfbGF1bmNoIChwaXBlX2Rlc2MsIE5VTEwpOworICBmYWlsX3VubGVzcyAocGlwZWxpbmUgIT0gTlVMTCk7CisKKyAgZ19mcmVlIChwYXRoKTsKKyAgZ19mcmVlIChwaXBlX2Rlc2MpOworCisgIGFwcHNpbmsgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChhcHBzaW5rICE9IE5VTEwpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICBkbyB7CisgICAgZ19zaWduYWxfZW1pdF9ieV9uYW1lIChhcHBzaW5rLCAicHVsbC1zYW1wbGUiLCAmc2FtcGxlKTsKKyAgICBpZiAoc2FtcGxlID09IE5VTEwpCisgICAgICBicmVhazsKKyAgICBpZiAoZmlyc3Rfc2FtcGxlID09IDApCisgICAgICBmaXJzdF9zYW1wbGUgPSBfZ2V0X2ZpcnN0X3NhbXBsZSAoc2FtcGxlKTsKKworICAgIHNpemUgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZ3N0X3NhbXBsZV9nZXRfYnVmZmVyIChzYW1wbGUpKTsKKworICAgIGdzdF9zYW1wbGVfdW5yZWYgKHNhbXBsZSk7CisgICAgc2FtcGxlID0gTlVMTDsKKyAgfQorICB3aGlsZSAoVFJVRSk7CisKKyAgLyogYXVkaW90ZXN0c3JjIHdpdGggc2FtcGxlc3BlcmJ1ZmZlciAxMDI0IGFuZCAxMCBudW0tYnVmZmVycyAqLworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChzaXplLCAyMDQ4MCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGZpcnN0X3NhbXBsZSwgMHgwNjZhKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisgIGdfb2JqZWN0X3VucmVmIChhcHBzaW5rKTsKK30KKworR1NUX0VORF9URVNUOworCitHU1RfU1RBUlRfVEVTVCAodGVzdF9kZWNvZGVfc2Vla19mdWxsKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0RWxlbWVudCAqYXBwc2luazsKKyAgR3N0RXZlbnQgKmV2ZW50OworICBHc3RTYW1wbGUgKnNhbXBsZSA9IE5VTEw7CisgIGd1aW50MTYgZmlyc3Rfc2FtcGxlID0gMDsKKyAgZ3VpbnQgc2l6ZSA9IDA7CisgIGdjaGFyICpwYXRoID0KKyAgICAgIGdfYnVpbGRfZmlsZW5hbWUgKEdTVF9URVNUX0ZJTEVTX1BBVEgsICJhdWRpb3Rlc3RzcmMuZmxhYyIsIE5VTEwpOworICBnY2hhciAqcGlwZV9kZXNjID0KKyAgICAgIGdfc3RyZHVwX3ByaW50ZgorICAgICAgKCJmaWxlc3JjIGxvY2F0aW9uPVwiJXNcIiAhIGZsYWNwYXJzZSAhIGZsYWNkZWMgISBhcHBzaW5rIG5hbWU9c2luayIsCisgICAgICBwYXRoKTsKKworICBwaXBlbGluZSA9IGdzdF9wYXJzZV9sYXVuY2ggKHBpcGVfZGVzYywgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChwaXBlbGluZSAhPSBOVUxMKTsKKworICBnX2ZyZWUgKHBpcGVfZGVzYyk7CisgIGdfZnJlZSAocGF0aCk7CisKKyAgYXBwc2luayA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgInNpbmsiKTsKKyAgZmFpbF91bmxlc3MgKGFwcHNpbmsgIT0gTlVMTCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BBVVNFRCk7CisgIGdzdF9lbGVtZW50X2dldF9zdGF0ZSAocGlwZWxpbmUsIE5VTEwsIE5VTEwsIEdTVF9DTE9DS19USU1FX05PTkUpOworCisgIC8qIGRvIGEgc2VlayB0aGF0IHNob3VsZCBnaXZlIHVzIHRoZSBjb21wbGV0ZSBvdXRwdXQgKi8KKyAgZXZlbnQgPSBnc3RfZXZlbnRfbmV3X3NlZWsgKDEuMCwgR1NUX0ZPUk1BVF9ERUZBVUxULCBHU1RfU0VFS19GTEFHX0ZMVVNILAorICAgICAgR1NUX1NFRUtfVFlQRV9TRVQsIDAsIEdTVF9TRUVLX1RZUEVfU0VULCAyMDQ4MCk7CisgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9zZW5kX2V2ZW50IChhcHBzaW5rLCBldmVudCkpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICBkbyB7CisgICAgZ19zaWduYWxfZW1pdF9ieV9uYW1lIChhcHBzaW5rLCAicHVsbC1zYW1wbGUiLCAmc2FtcGxlKTsKKyAgICBpZiAoc2FtcGxlID09IE5VTEwpCisgICAgICBicmVhazsKKyAgICBpZiAoZmlyc3Rfc2FtcGxlID09IDApCisgICAgICBmaXJzdF9zYW1wbGUgPSBfZ2V0X2ZpcnN0X3NhbXBsZSAoc2FtcGxlKTsKKyAgICBzaXplICs9IGdzdF9idWZmZXJfZ2V0X3NpemUgKGdzdF9zYW1wbGVfZ2V0X2J1ZmZlciAoc2FtcGxlKSk7CisKKyAgICBnc3Rfc2FtcGxlX3VucmVmIChzYW1wbGUpOworICAgIHNhbXBsZSA9IE5VTEw7CisgIH0KKyAgd2hpbGUgKFRSVUUpOworCisgIC8qIGZpbGUgd2FzIGdlbmVyYXRlZCB3aXRoIGF1ZGlvdGVzdHNyYworICAgKiB3aXRoIDEwMjQgc2FtcGxlc3BlcmJ1ZmZlciBhbmQgMTAgbnVtLWJ1ZmZlcnMgaW4gMTYgYml0IGF1ZGlvICovCisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKHNpemUsIDIwNDgwKTsKKyAgZmFpbF91bmxlc3NfZXF1YWxzX2ludCAoZmlyc3Rfc2FtcGxlLCAweDA2NmEpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKworICBnX29iamVjdF91bnJlZiAocGlwZWxpbmUpOworICBnX29iamVjdF91bnJlZiAoYXBwc2luayk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZGVjb2RlX3NlZWtfcGFydGlhbCkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEVsZW1lbnQgKmFwcHNpbms7CisgIEdzdEV2ZW50ICpldmVudDsKKyAgR3N0U2FtcGxlICpzYW1wbGUgPSBOVUxMOworICBndWludCBzaXplID0gMDsKKyAgZ3VpbnQxNiBmaXJzdF9zYW1wbGUgPSAwOworICBnY2hhciAqcGF0aCA9CisgICAgICBnX2J1aWxkX2ZpbGVuYW1lIChHU1RfVEVTVF9GSUxFU19QQVRILCAiYXVkaW90ZXN0c3JjLmZsYWMiLCBOVUxMKTsKKyAgZ2NoYXIgKnBpcGVfZGVzYyA9CisgICAgICBnX3N0cmR1cF9wcmludGYKKyAgICAgICgiZmlsZXNyYyBsb2NhdGlvbj1cIiVzXCIgISBmbGFjcGFyc2UgISBmbGFjZGVjICEgYXBwc2luayBuYW1lPXNpbmsiLAorICAgICAgcGF0aCk7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGFyc2VfbGF1bmNoIChwaXBlX2Rlc2MsIE5VTEwpOworICBmYWlsX3VubGVzcyAocGlwZWxpbmUgIT0gTlVMTCk7CisKKyAgZ19mcmVlIChwYXRoKTsKKyAgZ19mcmVlIChwaXBlX2Rlc2MpOworCisgIGFwcHNpbmsgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJzaW5rIik7CisgIGZhaWxfdW5sZXNzIChhcHBzaW5rICE9IE5VTEwpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QQVVTRUQpOworICBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKHBpcGVsaW5lLCBOVUxMLCBOVUxMLCBHU1RfQ0xPQ0tfVElNRV9OT05FKTsKKworICAvKiBkbyBhIHBhcnRpYWwgc2VlayB0byBnZXQgdGhlIGZpcnN0IDEwMjQgc2FtcGxlcyBvciAyMDQ4IGJ5dGVzICovCisgIGV2ZW50ID0gZ3N0X2V2ZW50X25ld19zZWVrICgxLjAsIEdTVF9GT1JNQVRfREVGQVVMVCwgR1NUX1NFRUtfRkxBR19GTFVTSCwKKyAgICAgIEdTVF9TRUVLX1RZUEVfU0VULCAwLCBHU1RfU0VFS19UWVBFX1NFVCwgMTAyNCk7CisgIEdTVF9ERUJVRyAoInNlZWtpbmciKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X3NlbmRfZXZlbnQgKGFwcHNpbmssIGV2ZW50KSk7CisgIEdTVF9ERUJVRyAoInNlZWtlZCIpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICBkbyB7CisgICAgR1NUX0RFQlVHICgicHVsbGluZyBzYW1wbGUiKTsKKyAgICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKGFwcHNpbmssICJwdWxsLXNhbXBsZSIsICZzYW1wbGUpOworICAgIEdTVF9ERUJVRyAoInB1bGxlZCBzYW1wbGUgJXAiLCBzYW1wbGUpOworICAgIGlmIChzYW1wbGUgPT0gTlVMTCkKKyAgICAgIGJyZWFrOworICAgIGlmIChmaXJzdF9zYW1wbGUgPT0gMCkgeworICAgICAgZmlyc3Rfc2FtcGxlID0gX2dldF9maXJzdF9zYW1wbGUgKHNhbXBsZSk7CisgICAgfQorICAgIHNpemUgKz0gZ3N0X2J1ZmZlcl9nZXRfc2l6ZSAoZ3N0X3NhbXBsZV9nZXRfYnVmZmVyIChzYW1wbGUpKTsKKworICAgIGdzdF9zYW1wbGVfdW5yZWYgKHNhbXBsZSk7CisgICAgc2FtcGxlID0gTlVMTDsKKyAgfQorICB3aGlsZSAoVFJVRSk7CisKKyAgLyogYWxsb3cgZm9yIHNhbXBsZSByb3VuZC11cCBjbGlwcGluZyBlZmZlY3QgKi8KKyAgZmFpbF91bmxlc3MgKHNpemUgPT0gMjA0OCB8fCBzaXplID09IDIwNTApOworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChmaXJzdF9zYW1wbGUsIDB4MDY2YSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisgIGdfb2JqZWN0X3VucmVmIChhcHBzaW5rKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorZmxhY2RlY19zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJmbGFjZGVjIik7CisKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgibGluZWFyIik7CisKKyAgLyogdGltZSBvdXQgYWZ0ZXIgNjBzLCBub3QgdGhlIGRlZmF1bHQgMyAqLworICB0Y2FzZV9zZXRfdGltZW91dCAodGNfY2hhaW4sIDYwKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2RlY29kZSk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9kZWNvZGVfc2Vla19mdWxsKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2RlY29kZV9zZWVrX3BhcnRpYWwpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAoZmxhY2RlYyk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9waXBlbGluZXMvbGFtZS5jIGIvdGVzdHMvY2hlY2svcGlwZWxpbmVzL2xhbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmJhNjZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svcGlwZWxpbmVzL2xhbWUuYwpAQCAtMCwwICsxLDEzMSBAQAorLyogR1N0cmVhbWVyCisgKgorICogdW5pdCB0ZXN0IGZvciBsYW1lCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGNoZWNrLmg+CisjaW5jbHVkZSA8Z3N0L2NoZWNrL2dzdGJ1ZmZlcnN0cmF3Lmg+CisKKyNpZm5kZWYgRU5DT0RFUgorI2RlZmluZSBFTkNPREVSICJsYW1lbXAzZW5jIgorI2VuZGlmCisKKyNpZm5kZWYgR1NUX0RJU0FCTEVfUEFSU0UKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZm9ybWF0KQoreworICBHc3RFbGVtZW50ICpiaW47CisgIEdzdFBhZCAqcGFkOworICBnY2hhciAqcGlwZV9zdHI7CisgIEdzdEJ1ZmZlciAqYnVmZmVyOworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKworICBwaXBlX3N0ciA9IGdfc3RyZHVwX3ByaW50ZiAoImF1ZGlvdGVzdHNyYyBudW0tYnVmZmVycz0xICIKKyAgICAgICIhIGF1ZGlvL3gtcmF3LCByYXRlPTIyMDUwLCBjaGFubmVscz0xICIKKyAgICAgICIhICIgRU5DT0RFUiAiIGJpdHJhdGU9MjQgISBhdWRpby9tcGVnLHJhdGU9MjIwNTAgISBmYWtlc2luayIpOworCisgIGJpbiA9IGdzdF9wYXJzZV9sYXVuY2ggKHBpcGVfc3RyLCAmZXJyb3IpOworICBmYWlsX3VubGVzcyAoYmluICE9IE5VTEwsICJFcnJvciBwYXJzaW5nIHBpcGVsaW5lOiAlcyIsCisgICAgICBlcnJvciA/IGVycm9yLT5tZXNzYWdlIDogIihpbnZhbGlkIGVycm9yKSIpOworICBnX2ZyZWUgKHBpcGVfc3RyKTsKKworICAvKiBnZXQgdGhlIHBhZCAqLworICB7CisgICAgR3N0RWxlbWVudCAqc2luayA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKGJpbiksICJmYWtlc2luazAiKTsKKworICAgIGZhaWxfdW5sZXNzIChzaW5rICE9IE5VTEwsICJDb3VsZCBub3QgZ2V0IGZha2VzaW5rIG91dCBvZiBiaW4iKTsKKyAgICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2luaywgInNpbmsiKTsKKyAgICBmYWlsX3VubGVzcyAocGFkICE9IE5VTEwsICJDb3VsZCBub3QgZ2V0IHBhZCBvdXQgb2YgZmFrZXNpbmsiKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rKTsKKyAgfQorCisgIGdzdF9idWZmZXJfc3RyYXdfc3RhcnRfcGlwZWxpbmUgKGJpbiwgcGFkKTsKKworICBidWZmZXIgPSBnc3RfYnVmZmVyX3N0cmF3X2dldF9idWZmZXIgKGJpbiwgcGFkKTsKKworICBnc3RfYnVmZmVyX3N0cmF3X3N0b3BfcGlwZWxpbmUgKGJpbiwgcGFkKTsKKworICBnc3RfYnVmZmVyX3VucmVmIChidWZmZXIpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChiaW4pOworfQorCitHU1RfRU5EX1RFU1Q7CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2NhcHNfcHJveHkpCit7CisgIEdzdEVsZW1lbnQgKmJpbjsKKyAgR3N0UGFkICpwYWQ7CisgIGdjaGFyICpwaXBlX3N0cjsKKyAgR3N0QnVmZmVyICpidWZmZXI7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisgIHBpcGVfc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiYXVkaW90ZXN0c3JjIG51bS1idWZmZXJzPTEgIgorICAgICAgIiEgYXVkaW8veC1yYXcscmF0ZT00ODAwMCxjaGFubmVscz0xICIKKyAgICAgICIhIGF1ZGlvcmVzYW1wbGUgIgorICAgICAgIiEgIiBFTkNPREVSICIgISBhdWRpby9tcGVnLHJhdGU9KGludCl7MjIwNTAsNDQxMDB9ICEgZmFrZXNpbmsiKTsKKworICBiaW4gPSBnc3RfcGFyc2VfbGF1bmNoIChwaXBlX3N0ciwgJmVycm9yKTsKKyAgZmFpbF91bmxlc3MgKGJpbiAhPSBOVUxMLCAiRXJyb3IgcGFyc2luZyBwaXBlbGluZTogJXMiLAorICAgICAgZXJyb3IgPyBlcnJvci0+bWVzc2FnZSA6ICIoaW52YWxpZCBlcnJvcikiKTsKKyAgZ19mcmVlIChwaXBlX3N0cik7CisKKyAgLyogZ2V0IHRoZSBwYWQgKi8KKyAgeworICAgIEdzdEVsZW1lbnQgKnNpbmsgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChiaW4pLCAiZmFrZXNpbmswIik7CisKKyAgICBmYWlsX3VubGVzcyAoc2luayAhPSBOVUxMLCAiQ291bGQgbm90IGdldCBmYWtlc2luayBvdXQgb2YgYmluIik7CisgICAgcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNpbmssICJzaW5rIik7CisgICAgZmFpbF91bmxlc3MgKHBhZCAhPSBOVUxMLCAiQ291bGQgbm90IGdldCBwYWQgb3V0IG9mIGZha2VzaW5rIik7CisgICAgZ3N0X29iamVjdF91bnJlZiAoc2luayk7CisgIH0KKworICBnc3RfYnVmZmVyX3N0cmF3X3N0YXJ0X3BpcGVsaW5lIChiaW4sIHBhZCk7CisKKyAgYnVmZmVyID0gZ3N0X2J1ZmZlcl9zdHJhd19nZXRfYnVmZmVyIChiaW4sIHBhZCk7CisKKyAgZ3N0X2J1ZmZlcl9zdHJhd19zdG9wX3BpcGVsaW5lIChiaW4sIHBhZCk7CisKKyAgZ3N0X2J1ZmZlcl91bnJlZiAoYnVmZmVyKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGFkKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYmluKTsKK30KKworR1NUX0VORF9URVNUOworCisjZW5kaWYgLyogI2lmbmRlZiBHU1RfRElTQUJMRV9QQVJTRSAqLworCitzdGF0aWMgU3VpdGUgKgorbGFtZV9zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKEVOQ09ERVIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJnZW5lcmFsIik7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisKKyNpZm5kZWYgR1NUX0RJU0FCTEVfUEFSU0UKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2Zvcm1hdCk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9jYXBzX3Byb3h5KTsKKyNlbmRpZgorCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAobGFtZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9waXBlbGluZXMvc2ltcGxlLWxhdW5jaC1saW5lcy5jIGIvdGVzdHMvY2hlY2svcGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDgzNTExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svcGlwZWxpbmVzL3NpbXBsZS1sYXVuY2gtbGluZXMuYwpAQCAtMCwwICsxLDMzMiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQW5keSBXaW5nbyA8d2luZ29AcG9ib3guY29tPgorICoKKyAqIHNpbXBsZV9sYXVuY2hfbGluZXMuYzogVW5pdCB0ZXN0IGZvciBzaW1wbGUgcGlwZWxpbmVzCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorCisjaWZuZGVmIEdTVF9ESVNBQkxFX1BBUlNFCisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX3BpcGVsaW5lIChjb25zdCBnY2hhciAqIHBpcGVfZGVzY3IpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworCisgIHBpcGVsaW5lID0gZ3N0X3BhcnNlX2xhdW5jaCAocGlwZV9kZXNjciwgTlVMTCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChHU1RfSVNfUElQRUxJTkUgKHBpcGVsaW5lKSwgTlVMTCk7CisgIHJldHVybiBwaXBlbGluZTsKK30KKworLyogCisgKiBydW5fcGlwZWxpbmU6CisgKiBAcGlwZTogdGhlIHBpcGVsaW5lIHRvIHJ1bgorICogQGRlc2M6IHRoZSBkZXNjcmlwdGlvbiBmb3IgdXNlIGluIG1lc3NhZ2VzCisgKiBAZXZlbnRzOiBpcyBhIG1hc2sgb2YgZXhwZWN0ZWQgZXZlbnRzCisgKiBAdGV2ZW50OiBpcyB0aGUgZXhwZWN0ZWQgdGVybWluYWwgZXZlbnQuCisgKgorICogdGhlIHBvbGwgY2FsbCB3aWxsIHRpbWUgb3V0IGFmdGVyIGhhbGYgYSBzZWNvbmQuCisgKi8KK3N0YXRpYyB2b2lkCitydW5fcGlwZWxpbmUgKEdzdEVsZW1lbnQgKiBwaXBlLCBjb25zdCBnY2hhciAqIGRlc2NyLAorICAgIEdzdE1lc3NhZ2VUeXBlIGV2ZW50cywgR3N0TWVzc2FnZVR5cGUgdGV2ZW50LCBHc3RTdGF0ZSB0YXJnZXRfc3RhdGUpCit7CisgIEdzdEJ1cyAqYnVzOworICBHc3RNZXNzYWdlICptZXNzYWdlOworICBHc3RNZXNzYWdlVHlwZSByZXZlbnQ7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBnX2Fzc2VydCAocGlwZSk7CisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKHBpcGUpOworICBnX2Fzc2VydCAoYnVzKTsKKworICBmYWlsX2lmIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGUsIHRhcmdldF9zdGF0ZSkgPT0KKyAgICAgIEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSwgIkNvdWxkIG5vdCBzZXQgcGlwZWxpbmUgJXMgdG8gcGxheWluZyIsIGRlc2NyKTsKKyAgcmV0ID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRlIChwaXBlLCBOVUxMLCBOVUxMLCAxMCAqIEdTVF9TRUNPTkQpOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfQVNZTkMpIHsKKyAgICBnX2NyaXRpY2FsICgiUGlwZWxpbmUgJyVzJyBmYWlsZWQgdG8gZ28gdG8gUEFVU0VEIGZhc3QgZW5vdWdoIiwgZGVzY3IpOworICAgIGdvdG8gZG9uZTsKKyAgfSBlbHNlIGlmICgocmV0ICE9IEdTVF9TVEFURV9DSEFOR0VfU1VDQ0VTUykKKyAgICAgICYmIChyZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9OT19QUkVST0xMKSkgeworICAgIGdfY3JpdGljYWwgKCJQaXBlbGluZSAnJXMnIGZhaWxlZCB0byBnbyBpbnRvIFBBVVNFRCBzdGF0ZSAoJXMpIiwgZGVzY3IsCisgICAgICAgIGdzdF9lbGVtZW50X3N0YXRlX2NoYW5nZV9yZXR1cm5fZ2V0X25hbWUgKHJldCkpOworICAgIGdvdG8gZG9uZTsKKyAgfQorCisgIHdoaWxlICgxKSB7CisgICAgbWVzc2FnZSA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9BTlksIEdTVF9TRUNPTkQgLyAyKTsKKworICAgIC8qIGFsd2F5cyBoYXZlIHRvIHBvcCB0aGUgbWVzc2FnZSBiZWZvcmUgZ2V0dGluZyBiYWNrIGludG8gcG9sbCAqLworICAgIGlmIChtZXNzYWdlKSB7CisgICAgICByZXZlbnQgPSBHU1RfTUVTU0FHRV9UWVBFIChtZXNzYWdlKTsKKyAgICAgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV2ZW50ID0gR1NUX01FU1NBR0VfVU5LTk9XTjsKKyAgICB9CisKKyAgICBpZiAocmV2ZW50ID09IHRldmVudCkgeworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmIChyZXZlbnQgPT0gR1NUX01FU1NBR0VfVU5LTk9XTikgeworICAgICAgZ19jcml0aWNhbCAoIlVuZXhwZWN0ZWQgdGltZW91dCBpbiBnc3RfYnVzX3BvbGwsIGxvb2tpbmcgZm9yICVkOiAlcyIsCisgICAgICAgICAgdGV2ZW50LCBkZXNjcik7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKHJldmVudCAmIGV2ZW50cykgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGdfY3JpdGljYWwKKyAgICAgICAgKCJVbmV4cGVjdGVkIG1lc3NhZ2UgcmVjZWl2ZWQgb2YgdHlwZSAlZCwgJyVzJywgbG9va2luZyBmb3IgJWQ6ICVzIiwKKyAgICAgICAgcmV2ZW50LCBnc3RfbWVzc2FnZV90eXBlX2dldF9uYW1lIChyZXZlbnQpLCB0ZXZlbnQsIGRlc2NyKTsKKyAgfQorCitkb25lOgorICBmYWlsX2lmIChnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGUsIEdTVF9TVEFURV9OVUxMKSA9PQorICAgICAgR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFLCAiQ291bGQgbm90IHNldCBwaXBlbGluZSAlcyB0byBOVUxMIiwgZGVzY3IpOworICBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKHBpcGUsIE5VTEwsIE5VTEwsIEdTVF9DTE9DS19USU1FX05PTkUpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlKTsKKworICBnc3RfYnVzX3NldF9mbHVzaGluZyAoYnVzLCBUUlVFKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfcnRwX3BheWxvYWRlcnMpCit7CisgIGNvbnN0IGdjaGFyICpzOworCisgIC8qIEZJWE1FOiBnb2luZyB0byBwbGF5aW5nIHdvdWxkIGJlIG5pY2UsIGJ1dCB0aGV0IGxlYWRzIHRvIGxvdCBvZiBmYWlsdXJlICovCisgIEdzdFN0YXRlIHRhcmdldF9zdGF0ZSA9IEdTVF9TVEFURV9QQVVTRUQ7CisKKyAgLyogd2UgdXNlIGlzLWxpdmUgaGVyZSB0byBhdm9pZCBwcmVyb2xsICovCisjZGVmaW5lIFBJUEVMSU5FX1NUUklORyhidWZjb3VudCwgYnVmc2l6ZSwgcGwsIGRwbCkgImZha2VzcmMgaXMtbGl2ZT10cnVlIG51bS1idWZmZXJzPSIgYnVmY291bnQgIiBmaWxsdHlwZT0yIHNpemV0eXBlPTIgc2l6ZW1heD0iIGJ1ZnNpemUgIiAhICIgcGwgIiAhICIgZHBsICIgISBmYWtlc2luayIKKyNkZWZpbmUgREVGQVVMVF9CVUZDT1VOVCAiNSIKKyNkZWZpbmUgREVGQVVMVF9CVUZTSVpFICIxNiIKKworICBzID0gUElQRUxJTkVfU1RSSU5HIChERUZBVUxUX0JVRkNPVU5ULCBERUZBVUxUX0JVRlNJWkUsICJydHBpbGJjcGF5IiwKKyAgICAgICJydHBpbGJjZGVwYXkiKTsKKyAgcnVuX3BpcGVsaW5lIChzZXR1cF9waXBlbGluZSAocyksIHMsCisgICAgICBHU1RfTUVTU0FHRV9BTlkgJiB+KEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfV0FSTklORyksCisgICAgICBHU1RfTUVTU0FHRV9VTktOT1dOLCB0YXJnZXRfc3RhdGUpOworCisgIHMgPSBQSVBFTElORV9TVFJJTkcgKERFRkFVTFRfQlVGQ09VTlQsIERFRkFVTFRfQlVGU0laRSwgInJ0cGdzbXBheSIsCisgICAgICAicnRwZ3NtZGVwYXkiKTsKKyAgcnVuX3BpcGVsaW5lIChzZXR1cF9waXBlbGluZSAocyksIHMsCisgICAgICBHU1RfTUVTU0FHRV9BTlkgJiB+KEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfV0FSTklORyksCisgICAgICBHU1RfTUVTU0FHRV9VTktOT1dOLCB0YXJnZXRfc3RhdGUpOworCisgIC8qIFRoaXMgb25lIG5lZWRzIGEgYml0IGRpZmZlcmVudCBidWZmZXIgc2l6ZSB0aGFuIG90aGVycyBvciBpdCBkb2Vzbid0IHdvcmsuICovCisgIHMgPSBQSVBFTElORV9TVFJJTkcgKERFRkFVTFRfQlVGQ09VTlQsICI1MiIsICJydHBhbXJwYXkiLCAicnRwYW1yZGVwYXkiKTsKKyAgcnVuX3BpcGVsaW5lIChzZXR1cF9waXBlbGluZSAocyksIHMsCisgICAgICBHU1RfTUVTU0FHRV9BTlkgJiB+KEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfV0FSTklORyksCisgICAgICBHU1RfTUVTU0FHRV9VTktOT1dOLCB0YXJnZXRfc3RhdGUpOworCisgIHMgPSBQSVBFTElORV9TVFJJTkcgKERFRkFVTFRfQlVGQ09VTlQsIERFRkFVTFRfQlVGU0laRSwgInJ0cHBjbWFwYXkiLAorICAgICAgInJ0cHBjbWFkZXBheSIpOworICBydW5fcGlwZWxpbmUgKHNldHVwX3BpcGVsaW5lIChzKSwgcywKKyAgICAgIEdTVF9NRVNTQUdFX0FOWSAmIH4oR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9XQVJOSU5HKSwKKyAgICAgIEdTVF9NRVNTQUdFX1VOS05PV04sIHRhcmdldF9zdGF0ZSk7CisKKyAgcyA9IFBJUEVMSU5FX1NUUklORyAoREVGQVVMVF9CVUZDT1VOVCwgREVGQVVMVF9CVUZTSVpFLCAicnRwcGNtdXBheSIsCisgICAgICAicnRwcGNtdWRlcGF5Iik7CisgIHJ1bl9waXBlbGluZSAoc2V0dXBfcGlwZWxpbmUgKHMpLCBzLAorICAgICAgR1NUX01FU1NBR0VfQU5ZICYgfihHU1RfTUVTU0FHRV9FUlJPUiB8IEdTVF9NRVNTQUdFX1dBUk5JTkcpLAorICAgICAgR1NUX01FU1NBR0VfVU5LTk9XTiwgdGFyZ2V0X3N0YXRlKTsKKworICBzID0gUElQRUxJTkVfU1RSSU5HIChERUZBVUxUX0JVRkNPVU5ULCBERUZBVUxUX0JVRlNJWkUsICJydHBtcGFwYXkiLAorICAgICAgInJ0cG1wYWRlcGF5Iik7CisgIHJ1bl9waXBlbGluZSAoc2V0dXBfcGlwZWxpbmUgKHMpLCBzLAorICAgICAgR1NUX01FU1NBR0VfQU5ZICYgfihHU1RfTUVTU0FHRV9FUlJPUiB8IEdTVF9NRVNTQUdFX1dBUk5JTkcpLAorICAgICAgR1NUX01FU1NBR0VfVU5LTk9XTiwgdGFyZ2V0X3N0YXRlKTsKKworICBzID0gUElQRUxJTkVfU1RSSU5HIChERUZBVUxUX0JVRkNPVU5ULCBERUZBVUxUX0JVRlNJWkUsICJydHBoMjYzcHBheSIsCisgICAgICAicnRwaDI2M3BkZXBheSIpOworICBydW5fcGlwZWxpbmUgKHNldHVwX3BpcGVsaW5lIChzKSwgcywKKyAgICAgIEdTVF9NRVNTQUdFX0FOWSAmIH4oR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9XQVJOSU5HKSwKKyAgICAgIEdTVF9NRVNTQUdFX1VOS05PV04sIHRhcmdldF9zdGF0ZSk7CisKKyAgcyA9IFBJUEVMSU5FX1NUUklORyAoREVGQVVMVF9CVUZDT1VOVCwgREVGQVVMVF9CVUZTSVpFLCAicnRwaDI2M3BheSIsCisgICAgICAicnRwaDI2M2RlcGF5Iik7CisgIHJ1bl9waXBlbGluZSAoc2V0dXBfcGlwZWxpbmUgKHMpLCBzLAorICAgICAgR1NUX01FU1NBR0VfQU5ZICYgfihHU1RfTUVTU0FHRV9FUlJPUiB8IEdTVF9NRVNTQUdFX1dBUk5JTkcpLAorICAgICAgR1NUX01FU1NBR0VfVU5LTk9XTiwgdGFyZ2V0X3N0YXRlKTsKKworICBzID0gUElQRUxJTkVfU1RSSU5HIChERUZBVUxUX0JVRkNPVU5ULCBERUZBVUxUX0JVRlNJWkUsICJydHBoMjY0cGF5IiwKKyAgICAgICJydHBoMjY0ZGVwYXkiKTsKKyAgcnVuX3BpcGVsaW5lIChzZXR1cF9waXBlbGluZSAocyksIHMsCisgICAgICBHU1RfTUVTU0FHRV9BTlkgJiB+KEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfV0FSTklORyksCisgICAgICBHU1RfTUVTU0FHRV9VTktOT1dOLCB0YXJnZXRfc3RhdGUpOworCisgIHMgPSBQSVBFTElORV9TVFJJTkcgKERFRkFVTFRfQlVGQ09VTlQsIERFRkFVTFRfQlVGU0laRSwgInJ0cEwxNnBheSIsCisgICAgICAicnRwTDE2ZGVwYXkiKTsKKyAgcnVuX3BpcGVsaW5lIChzZXR1cF9waXBlbGluZSAocyksIHMsCisgICAgICBHU1RfTUVTU0FHRV9BTlkgJiB+KEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfV0FSTklORyksCisgICAgICBHU1RfTUVTU0FHRV9VTktOT1dOLCB0YXJnZXRfc3RhdGUpOworCisgIHMgPSBQSVBFTElORV9TVFJJTkcgKERFRkFVTFRfQlVGQ09VTlQsIERFRkFVTFRfQlVGU0laRSwgInJ0cG1wMnRwYXkiLAorICAgICAgInJ0cG1wMnRkZXBheSIpOworICBydW5fcGlwZWxpbmUgKHNldHVwX3BpcGVsaW5lIChzKSwgcywKKyAgICAgIEdTVF9NRVNTQUdFX0FOWSAmIH4oR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9XQVJOSU5HKSwKKyAgICAgIEdTVF9NRVNTQUdFX1VOS05PV04sIHRhcmdldF9zdGF0ZSk7CisKKyAgcyA9IFBJUEVMSU5FX1NUUklORyAoREVGQVVMVF9CVUZDT1VOVCwgREVGQVVMVF9CVUZTSVpFLCAicnRwbXA0dnBheSIsCisgICAgICAicnRwbXA0dmRlcGF5Iik7CisgIHJ1bl9waXBlbGluZSAoc2V0dXBfcGlwZWxpbmUgKHMpLCBzLAorICAgICAgR1NUX01FU1NBR0VfQU5ZICYgfihHU1RfTUVTU0FHRV9FUlJPUiB8IEdTVF9NRVNTQUdFX1dBUk5JTkcpLAorICAgICAgR1NUX01FU1NBR0VfVU5LTk9XTiwgdGFyZ2V0X3N0YXRlKTsKKworICBzID0gUElQRUxJTkVfU1RSSU5HIChERUZBVUxUX0JVRkNPVU5ULCBERUZBVUxUX0JVRlNJWkUsICJydHBtcDRncGF5IiwKKyAgICAgICJydHBtcDRnZGVwYXkiKTsKKyAgcnVuX3BpcGVsaW5lIChzZXR1cF9waXBlbGluZSAocyksIHMsCisgICAgICBHU1RfTUVTU0FHRV9BTlkgJiB+KEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfV0FSTklORyksCisgICAgICBHU1RfTUVTU0FHRV9VTktOT1dOLCB0YXJnZXRfc3RhdGUpOworCisgIC8qIENhbm5vdCBiZSB0ZXN0ZWQgd2l0aCBmYWtlc3JjIGJlY291c2Ugc3BlZXggcGF5bG9hZGVyIHJlcXVpcmVzIGEgdmFsaWQgaGVhZGVyPyEgKi8KKyAgLyoKKyAgICAgcyA9IFBJUEVMSU5FX1NUUklORyhERUZBVUxUX0JVRkNPVU5ULCBERUZBVUxUX0JVRlNJWkUsICJydHBzcGVleHBheSIsICJydHBzcGVleGRlcGF5Iik7CisgICAgIHJ1bl9waXBlbGluZSAoc2V0dXBfcGlwZWxpbmUgKHMpLCBzLAorICAgICBHU1RfTUVTU0FHRV9BTlkgJiB+KEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfV0FSTklORyksCisgICAgIEdTVF9NRVNTQUdFX1VOS05PV04sIHRhcmdldF9zdGF0ZSk7CisgICAqLworCisgIHMgPSBQSVBFTElORV9TVFJJTkcgKERFRkFVTFRfQlVGQ09VTlQsIERFRkFVTFRfQlVGU0laRSwgInJ0cHRoZW9yYXBheSIsCisgICAgICAicnRwdGhlb3JhZGVwYXkiKTsKKyAgcnVuX3BpcGVsaW5lIChzZXR1cF9waXBlbGluZSAocyksIHMsCisgICAgICBHU1RfTUVTU0FHRV9BTlkgJiB+KEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfV0FSTklORyksCisgICAgICBHU1RfTUVTU0FHRV9VTktOT1dOLCB0YXJnZXRfc3RhdGUpOworCisgIHMgPSBQSVBFTElORV9TVFJJTkcgKERFRkFVTFRfQlVGQ09VTlQsIERFRkFVTFRfQlVGU0laRSwgInJ0cHZvcmJpc3BheSIsCisgICAgICAicnRwdm9yYmlzZGVwYXkiKTsKKyAgcnVuX3BpcGVsaW5lIChzZXR1cF9waXBlbGluZSAocyksIHMsCisgICAgICBHU1RfTUVTU0FHRV9BTlkgJiB+KEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfV0FSTklORyksCisgICAgICBHU1RfTUVTU0FHRV9VTktOT1dOLCB0YXJnZXRfc3RhdGUpOworCisjZGVmaW5lIEoyS19URVNUX0ZJTEVfUEFUSCBHU1RfVEVTVF9GSUxFU19QQVRIIEdfRElSX1NFUEFSQVRPUl9TICJncmFkaWVudC5qMmsiCisjZGVmaW5lIEoyS0NBUFMgImltYWdlL3gtanBjLHNhbXBsaW5nPVlDYkNyLTQ6MjowLHdpZHRoPTcyMCxoZWlnaHQ9NTc2LHBpeGVsLWFzcGVjdC1yYXRpbz0xLzEsZnJhbWVyYXRlPTMwLzEiCisgIHsKKyAgICBHc3RFbGVtZW50ICpwaXBlbGluZSwgKnNyYzsKKyAgICBHc3RGbG93UmV0dXJuIGZsb3cgPSBHU1RfRkxPV19PSzsKKyAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICBnY2hhciAqZGF0YTsKKyAgICBnc2l6ZSBsZW47CisKKyAgICBzID0gImFwcHNyYyBjYXBzPSIgSjJLQ0FQUyAiIG5hbWU9c3JjICEgcnRwajJrcGF5ICEgcnRwajJrZGVwYXkgISBmYWtlc2luayI7CisKKyAgICBmYWlsX3VubGVzcyAoZ19maWxlX2dldF9jb250ZW50cyAoSjJLX1RFU1RfRklMRV9QQVRILCAmZGF0YSwgJmxlbiwgTlVMTCkpOworICAgIGJ1ZiA9IGdzdF9idWZmZXJfbmV3X3dyYXBwZWQgKGRhdGEsIGxlbik7CisgICAgcGlwZWxpbmUgPSBzZXR1cF9waXBlbGluZSAocyk7CisgICAgc3JjID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAocGlwZWxpbmUpLCAic3JjIik7CisgICAgZ19vYmplY3Rfc2V0IChzcmMsICJmb3JtYXQiLCBHU1RfRk9STUFUX1RJTUUsIE5VTEwpOworICAgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAoc3JjLCAicHVzaC1idWZmZXIiLCBidWYsICZmbG93KTsKKyAgICBnc3RfYnVmZmVyX3VucmVmIChidWYpOworICAgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGZsb3csIEdTVF9GTE9XX09LKTsKKyAgICBnX3NpZ25hbF9lbWl0X2J5X25hbWUgKHNyYywgImVuZC1vZi1zdHJlYW0iLCAmZmxvdyk7CisgICAgZ3N0X29iamVjdF91bnJlZiAoc3JjKTsKKyAgICBydW5fcGlwZWxpbmUgKHBpcGVsaW5lLCBzLAorICAgICAgICBHU1RfTUVTU0FHRV9BTlkgJiB+KEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfV0FSTklORyksCisgICAgICAgIEdTVF9NRVNTQUdFX1VOS05PV04sIHRhcmdldF9zdGF0ZSk7CisgIH0KKworICAvKnMgPSBGQUtFU1JDICIgISAhIHJ0cGFjM2RlcGF5ICEgIiBGQUtFU0lOSyAqLworICAvKnMgPSBGQUtFU1JDICIgISAhIGFzdGVyaXNraDI2MyAhICIgRkFLRVNJTks7ICovCisgIC8qcyA9IEZBS0VTUkMgIiAhICEgcnRwbXB2ZGVwYXkgISAiIEZBS0VTSU5LOyAqLworICAvKnMgPSBGQUtFU1JDICIgISAhIHJ0cG1wNGFkZXBheSAhICIgRkFLRVNJTks7ICovCisgIC8qcyA9IEZBS0VTUkMgIiAhICEgcnRwc3YzdmRlcGF5ICEgIiBGQUtFU0lOSzsgKi8KK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgZ2Jvb2xlYW4KK2hhdmVfZWxlbWVudHMgKGNvbnN0IGdjaGFyICogZWxlbWVudDEsIGNvbnN0IGdjaGFyICogZWxlbWVudDIpCit7CisgIHJldHVybiBnc3RfcmVnaXN0cnlfY2hlY2tfZmVhdHVyZV92ZXJzaW9uIChnc3RfcmVnaXN0cnlfZ2V0ICgpLCBlbGVtZW50MSwKKyAgICAgIEdTVF9WRVJTSU9OX01BSk9SLCBHU1RfVkVSU0lPTl9NSU5PUiwgMCkgJiYKKyAgICAgIGdzdF9yZWdpc3RyeV9jaGVja19mZWF0dXJlX3ZlcnNpb24gKGdzdF9yZWdpc3RyeV9nZXQgKCksIGVsZW1lbnQyLAorICAgICAgR1NUX1ZFUlNJT05fTUFKT1IsIEdTVF9WRVJTSU9OX01JTk9SLCAwKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdmlkZW9fZW5jb2RlcnNfZGVjb2RlcnMpCit7CisgIGNvbnN0IGdjaGFyICpzOworICBHc3RTdGF0ZSB0YXJnZXRfc3RhdGUgPSBHU1RfU1RBVEVfUExBWUlORzsKKworICAvKiBubyBpcy1saXZlIG9uIHRoZSBzb3VyY2UgYmVjYXVzZSB3ZSBhY3R1YWxseSB3YW50IHRvIHByZXJvbGwgc2luY2UKKyAgICogcnVuX3BpcGVsaW5lIG9ubHkgZ29lcyBpbnRvIFBBVVNFRCAqLworI2RlZmluZSBFTkNfREVDX1BJUEVMSU5FX1NUUklORyhidWZjb3VudCwgZW5jLCBkZWMpICJ2aWRlb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9IiBidWZjb3VudCAiICEgIiBlbmMgIiAhICIgZGVjICIgISBmYWtlc2luayIKKyNkZWZpbmUgREVGQVVMVF9CVUZDT1VOVCAiNSIKKworICBpZiAoaGF2ZV9lbGVtZW50cyAoImpwZWdlbmMiLCAianBlZ2RlYyIpKSB7CisgICAgcyA9IEVOQ19ERUNfUElQRUxJTkVfU1RSSU5HIChERUZBVUxUX0JVRkNPVU5ULCAianBlZ2VuYyIsICJqcGVnZGVjIik7CisgICAgcnVuX3BpcGVsaW5lIChzZXR1cF9waXBlbGluZSAocyksIHMsCisgICAgICAgIEdTVF9NRVNTQUdFX0FOWSAmIH4oR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9XQVJOSU5HKSwKKyAgICAgICAgR1NUX01FU1NBR0VfVU5LTk9XTiwgdGFyZ2V0X3N0YXRlKTsKKyAgfQorCisgIGlmIChoYXZlX2VsZW1lbnRzICgicG5nZW5jIiwgInBuZ2RlYyIpKSB7CisgICAgcyA9IEVOQ19ERUNfUElQRUxJTkVfU1RSSU5HIChERUZBVUxUX0JVRkNPVU5ULCAicG5nZW5jIiwgInBuZ2RlYyIpOworICAgIHJ1bl9waXBlbGluZSAoc2V0dXBfcGlwZWxpbmUgKHMpLCBzLAorICAgICAgICBHU1RfTUVTU0FHRV9BTlkgJiB+KEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfV0FSTklORyksCisgICAgICAgIEdTVF9NRVNTQUdFX1VOS05PV04sIHRhcmdldF9zdGF0ZSk7CisgIH0KKworICBpZiAoaGF2ZV9lbGVtZW50cyAoInNtb2tlZW5jIiwgInNtb2tlZGVjIikpIHsKKyAgICBzID0gRU5DX0RFQ19QSVBFTElORV9TVFJJTkcgKERFRkFVTFRfQlVGQ09VTlQsICJzbW9rZWVuYyIsICJzbW9rZWRlYyIpOworICAgIHJ1bl9waXBlbGluZSAoc2V0dXBfcGlwZWxpbmUgKHMpLCBzLAorICAgICAgICBHU1RfTUVTU0FHRV9BTlkgJiB+KEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfV0FSTklORyksCisgICAgICAgIEdTVF9NRVNTQUdFX1VOS05PV04sIHRhcmdldF9zdGF0ZSk7CisgIH0KK30KKworR1NUX0VORF9URVNUOworCisjZGVmaW5lIFZJREVPTUlYRVJfUElQRUxJTkUgXAorICAgICJ2aWRlb21peGVyIG5hbWU9bWl4ICBiYWNrZ3JvdW5kPXRyYW5zcGFyZW50ICEgZmFrZXNpbmsgIiBcCisgICAgInZpZGVvdGVzdHNyYyBudW0tYnVmZmVycz01MCAhICIgXAorICAgICIgIHZpZGVvL3gtcmF3LGZvcm1hdD1SR0JBLCB3aWR0aD0yMDAsaGVpZ2h0PTIwMCxmcmFtZXJhdGU9MTAvMSAgISAiIFwKKyAgICAiICB2aWRlb2NvbnZlcnQgISBtaXguc2lua18xICIgXAorICAgICJ2aWRlb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9NTAgcGF0dGVybj1zbXB0ZSAhICIgXAorICAgICIgIHZpZGVvL3gtcmF3LGZvcm1hdD1SR0JBLCB3aWR0aD03MjAsaGVpZ2h0PTQ4MCxmcmFtZXJhdGU9MTAvMSAgISAiIFwKKyAgICAiICB2aWRlb2NvbnZlcnQgISBtaXguc2lua18wICIKKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfdmlkZW9taXhlcikKK3sKKyAgcnVuX3BpcGVsaW5lIChzZXR1cF9waXBlbGluZSAoVklERU9NSVhFUl9QSVBFTElORSksIFZJREVPTUlYRVJfUElQRUxJTkUsCisgICAgICBHU1RfTUVTU0FHRV9BTlkgJiB+KEdTVF9NRVNTQUdFX0VSUk9SIHwgR1NUX01FU1NBR0VfV0FSTklORyksCisgICAgICBHU1RfTUVTU0FHRV9VTktOT1dOLCBHU1RfU1RBVEVfUExBWUlORyk7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworI2VuZGlmIC8qICNpZm5kZWYgR1NUX0RJU0FCTEVfUEFSU0UgKi8KK3N0YXRpYyBTdWl0ZSAqCitzaW1wbGVfbGF1bmNoX2xpbmVzX3N1aXRlICh2b2lkKQoreworICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSAoIlBpcGVsaW5lcyIpOworICBUQ2FzZSAqdGNfY2hhaW4gPSB0Y2FzZV9jcmVhdGUgKCJsaW5lYXIiKTsKKworICAvKiB0aW1lIG91dCBhZnRlciA2MHMsIG5vdCB0aGUgZGVmYXVsdCAzICovCisgIHRjYXNlX3NldF90aW1lb3V0ICh0Y19jaGFpbiwgNjApOworCisgIHN1aXRlX2FkZF90Y2FzZSAocywgdGNfY2hhaW4pOworI2lmbmRlZiBHU1RfRElTQUJMRV9QQVJTRQorICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfcnRwX3BheWxvYWRlcnMpOworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdmlkZW9fZW5jb2RlcnNfZGVjb2RlcnMpOworICAvKiBGSVhNRTogdmVyeSByYXJlbHkgZmFpbHMsIG1heWJlIGJlY2F1c2Ugb2YgbmVnb3RpYXRpb24gaXNzdWVzPyAqLworICB0Y2FzZV9hZGRfdGVzdCAodGNfY2hhaW4sIHRlc3RfdmlkZW9taXhlcik7CisjZW5kaWYKKyAgcmV0dXJuIHM7Cit9CisKK0dTVF9DSEVDS19NQUlOIChzaW1wbGVfbGF1bmNoX2xpbmVzKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrL3BpcGVsaW5lcy90YWdzY2hlY2tpbmcuYyBiL3Rlc3RzL2NoZWNrL3BpcGVsaW5lcy90YWdzY2hlY2tpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjcwYmY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svcGlwZWxpbmVzL3RhZ3NjaGVja2luZy5jCkBAIC0wLDAgKzEsMzYxIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4gKGNvbnRhY3QgPHN0ZWZhbi5rb3N0QG5va2lhLmNvbT4pCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhpYWdvIFNhbnRvcyA8dGhpYWdvLnNvdXNhLnNhbnRvc0Bjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9jaGVjay9nc3RjaGVjay5oPgorI2luY2x1ZGUgPGdsaWIvZ3N0ZGlvLmg+CisKK3N0YXRpYyBHc3RUYWdMaXN0ICpyZWNlaXZlZF90YWdzID0gTlVMTDsKKworc3RhdGljIGdib29sZWFuCitidXNfaGFuZGxlciAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR01haW5Mb29wICpsb29wID0gKEdNYWluTG9vcCAqKSBkYXRhOworCisgIHN3aXRjaCAobWVzc2FnZS0+dHlwZSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRU9TOgorICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX1dBUk5JTkc6CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FUlJPUjp7CisgICAgICBHRXJyb3IgKmdlcnJvcjsKKworICAgICAgZ2NoYXIgKmRlYnVnOworCisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobWVzc2FnZSwgJmdlcnJvciwgJmRlYnVnKTsKKyAgICAgIGdzdF9vYmplY3RfZGVmYXVsdF9lcnJvciAoR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSwgZ2Vycm9yLCBkZWJ1Zyk7CisgICAgICBnX2Vycm9yX2ZyZWUgKGdlcnJvcik7CisgICAgICBnX2ZyZWUgKGRlYnVnKTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX01FU1NBR0VfVEFHOnsKKyAgICAgIGlmIChyZWNlaXZlZF90YWdzID09IE5VTEwpIHsKKyAgICAgICAgZ3N0X21lc3NhZ2VfcGFyc2VfdGFnIChtZXNzYWdlLCAmcmVjZWl2ZWRfdGFncyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHc3RUYWdMaXN0ICp0bCA9IE5VTEwsICpudGwgPSBOVUxMOworCisgICAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX3RhZyAobWVzc2FnZSwgJnRsKTsKKyAgICAgICAgaWYgKHRsKSB7CisgICAgICAgICAgbnRsID0gZ3N0X3RhZ19saXN0X21lcmdlIChyZWNlaXZlZF90YWdzLCB0bCwgR1NUX1RBR19NRVJHRV9QUkVQRU5EKTsKKyAgICAgICAgICBpZiAobnRsKSB7CisgICAgICAgICAgICBHU1RfTE9HICgidGFnbGlzdHMgbWVyZ2VkOiAlIiBHU1RfUFRSX0ZPUk1BVCwgbnRsKTsKKyAgICAgICAgICAgIGdzdF90YWdfbGlzdF91bnJlZiAocmVjZWl2ZWRfdGFncyk7CisgICAgICAgICAgICByZWNlaXZlZF90YWdzID0gbnRsOworICAgICAgICAgIH0KKyAgICAgICAgICBnc3RfdGFnX2xpc3RfdW5yZWYgKHRsKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKgorICogQ3JlYXRlcyBhIHBpcGVsaW5lIGluIHRoZSBmb3JtOgorICogZmFrZXNyYyBudW0tYnVmZmVycz0xICEgY2FwcyAhIG11eGVyICEgZmlsZXNpbmsgbG9jYXRpb249ZmlsZQorICoKKyAqIEFuZCBzZXRzIHRoZSB0YWdzIGluIHRhZ19zdHIgaW50byB0aGUgbXV4ZXIgdmlhIHRhZ3NldHRlci4KKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfbXV4X3RhZ3MgKGNvbnN0IGdjaGFyICogdGFnX3N0ciwgY29uc3QgZ2NoYXIgKiBjYXBzLAorICAgIGNvbnN0IGdjaGFyICogbXV4ZXIsIGNvbnN0IGdjaGFyICogZmlsZSkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEJ1cyAqYnVzOworICBHTWFpbkxvb3AgKmxvb3A7CisgIEdzdFRhZ0xpc3QgKnNlbnRfdGFnczsKKyAgR3N0RWxlbWVudCAqbXV4OworICBHc3RUYWdTZXR0ZXIgKnNldHRlcjsKKyAgZ2NoYXIgKmxhdW5jaF9zdHI7CisgIGd1aW50IGJ1c193YXRjaCA9IDA7CisKKyAgR1NUX0RFQlVHICgidGVzdGluZyB4bXAgbXV4aW5nIG9uIDogJXMiLCBtdXhlcik7CisKKyAgbGF1bmNoX3N0ciA9CisgICAgICBnX3N0cmR1cF9wcmludGYgKCJmYWtlc3JjIG51bS1idWZmZXJzPTEgZm9ybWF0PXRpbWUgZGF0YXJhdGU9MTAwICEgIgorICAgICAgIiVzICEgJXMgbmFtZT1tdXggISBmaWxlc2luayBsb2NhdGlvbj0lcyBuYW1lPXNpbmsiLCBjYXBzLCBtdXhlciwgZmlsZSk7CisgIHBpcGVsaW5lID0gZ3N0X3BhcnNlX2xhdW5jaCAobGF1bmNoX3N0ciwgTlVMTCk7CisgIGdfZnJlZSAobGF1bmNoX3N0cik7CisgIGZhaWxfdW5sZXNzIChwaXBlbGluZSAhPSBOVUxMKTsKKworICBtdXggPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksICJtdXgiKTsKKyAgZmFpbF91bmxlc3MgKG11eCAhPSBOVUxMKTsKKworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBUUlVFKTsKKyAgZmFpbF91bmxlc3MgKGxvb3AgIT0gTlVMTCk7CisKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAocGlwZWxpbmUpOworICBmYWlsX3VubGVzcyAoYnVzICE9IE5VTEwpOworICBidXNfd2F0Y2ggPSBnc3RfYnVzX2FkZF93YXRjaCAoYnVzLCBidXNfaGFuZGxlciwgbG9vcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1JFQURZKTsKKworICBzZXR0ZXIgPSBHU1RfVEFHX1NFVFRFUiAobXV4KTsKKyAgZmFpbF91bmxlc3MgKHNldHRlciAhPSBOVUxMKTsKKyAgc2VudF90YWdzID0gZ3N0X3RhZ19saXN0X25ld19mcm9tX3N0cmluZyAodGFnX3N0cik7CisgIGZhaWxfdW5sZXNzIChzZW50X3RhZ3MgIT0gTlVMTCk7CisgIGdzdF90YWdfc2V0dGVyX21lcmdlX3RhZ3MgKHNldHRlciwgc2VudF90YWdzLCBHU1RfVEFHX01FUkdFX1JFUExBQ0UpOworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHNlbnRfdGFncyk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBnX21haW5fbG9vcF9ydW4gKGxvb3ApOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisgIGdfb2JqZWN0X3VucmVmIChtdXgpOworICBnX29iamVjdF91bnJlZiAocGlwZWxpbmUpOworICBnX3NvdXJjZV9yZW1vdmUgKGJ1c193YXRjaCk7Cit9CisKKy8qCisgKiBNYWtlcyBhIHBpcGVsaW5lIGluIHRoZSBmb3JtOgorICogZmlsZXNyYyBsb2NhdGlvbj1maWxlICEgZGVtdXhlciAhIGZha2VzaW5rCisgKgorICogQW5kIGdldHMgdGhlIHRhZ3MgdGhhdCBhcmUgcG9zdGVkIG9uIHRoZSBidXMgdG8gY29tcGFyZQorICogd2l0aCB0aGUgdGFncyBpbiAndGFnX3N0cicKKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfZGVtdXhfdGFncyAoY29uc3QgZ2NoYXIgKiB0YWdfc3RyLCBjb25zdCBnY2hhciAqIGRlbXV4ZXIsCisgICAgY29uc3QgZ2NoYXIgKiBmaWxlKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0QnVzICpidXM7CisgIEdNYWluTG9vcCAqbG9vcDsKKyAgR3N0VGFnTGlzdCAqc2VudF90YWdzOworICBnaW50IGksIGosIGssIG5fcmVjdiwgbl9zZW50OworICBjb25zdCBnY2hhciAqbmFtZV9zZW50LCAqbmFtZV9yZWN2OworICBjb25zdCBHVmFsdWUgKnZhbHVlX3NlbnQsICp2YWx1ZV9yZWN2OworICBnYm9vbGVhbiBmb3VuZDsKKyAgZ2ludCBjb21wYXJpc29uOworICBHc3RFbGVtZW50ICpkZW11eDsKKyAgZ2NoYXIgKmxhdW5jaF9zdHI7CisgIGd1aW50IGJ1c193YXRjaCA9IDA7CisKKyAgR1NUX0RFQlVHICgidGVzdGluZyB0YWdzIDogJXMiLCB0YWdfc3RyKTsKKworICBpZiAocmVjZWl2ZWRfdGFncykgeworICAgIGdzdF90YWdfbGlzdF91bnJlZiAocmVjZWl2ZWRfdGFncyk7CisgICAgcmVjZWl2ZWRfdGFncyA9IE5VTEw7CisgIH0KKworICBsYXVuY2hfc3RyID0gZ19zdHJkdXBfcHJpbnRmICgiZmlsZXNyYyBsb2NhdGlvbj0lcyAhICVzIG5hbWU9ZGVtdXggISAiCisgICAgICAiZmFrZXNpbmsiLCBmaWxlLCBkZW11eGVyKTsKKyAgcGlwZWxpbmUgPSBnc3RfcGFyc2VfbGF1bmNoIChsYXVuY2hfc3RyLCBOVUxMKTsKKyAgZ19mcmVlIChsYXVuY2hfc3RyKTsKKyAgZmFpbF91bmxlc3MgKHBpcGVsaW5lICE9IE5VTEwpOworCisgIGRlbXV4ID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAocGlwZWxpbmUpLCAiZGVtdXgiKTsKKyAgZmFpbF91bmxlc3MgKGRlbXV4ICE9IE5VTEwpOworCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIFRSVUUpOworICBmYWlsX3VubGVzcyAobG9vcCAhPSBOVUxMKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChwaXBlbGluZSk7CisgIGZhaWxfdW5sZXNzIChidXMgIT0gTlVMTCk7CisgIGJ1c193YXRjaCA9IGdzdF9idXNfYWRkX3dhdGNoIChidXMsIGJ1c19oYW5kbGVyLCBsb29wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKworICBzZW50X3RhZ3MgPSBnc3RfdGFnX2xpc3RfbmV3X2Zyb21fc3RyaW5nICh0YWdfc3RyKTsKKyAgZmFpbF91bmxlc3MgKHNlbnRfdGFncyAhPSBOVUxMKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgR1NUX0RFQlVHICgibWFpbmxvb3AgZG9uZSA6ICVwIiwgcmVjZWl2ZWRfdGFncyk7CisKKyAgLyogdmVyaWZ5IHRhZ3MgKi8KKyAgZmFpbF91bmxlc3MgKHJlY2VpdmVkX3RhZ3MgIT0gTlVMTCk7CisgIG5fcmVjdiA9IGdzdF90YWdfbGlzdF9uX3RhZ3MgKHJlY2VpdmVkX3RhZ3MpOworICBuX3NlbnQgPSBnc3RfdGFnX2xpc3Rfbl90YWdzIChzZW50X3RhZ3MpOworICBmYWlsX3VubGVzcyAobl9yZWN2ID49IG5fc2VudCk7CisgIC8qIEZJWE1FOiBjb21wYXJlIHRhZ2xpdHMgdmFsdWVzICovCisgIGZvciAoaSA9IDA7IGkgPCBuX3NlbnQ7IGkrKykgeworICAgIG5hbWVfc2VudCA9IGdzdF90YWdfbGlzdF9udGhfdGFnX25hbWUgKHNlbnRfdGFncywgaSk7CisKKyAgICBmb3VuZCA9IEZBTFNFOworICAgIGZvciAoaiA9IDA7IGogPCBuX3JlY3Y7IGorKykgeworICAgICAgbmFtZV9yZWN2ID0gZ3N0X3RhZ19saXN0X250aF90YWdfbmFtZSAocmVjZWl2ZWRfdGFncywgaik7CisKKyAgICAgIGlmICghc3RyY21wIChuYW1lX3NlbnQsIG5hbWVfcmVjdikpIHsKKyAgICAgICAgZ3VpbnQgc2VudF9sZW4sIHJlY3ZfbGVuOworCisgICAgICAgIHNlbnRfbGVuID0gZ3N0X3RhZ19saXN0X2dldF90YWdfc2l6ZSAoc2VudF90YWdzLCBuYW1lX3NlbnQpOworICAgICAgICByZWN2X2xlbiA9IGdzdF90YWdfbGlzdF9nZXRfdGFnX3NpemUgKHJlY2VpdmVkX3RhZ3MsIG5hbWVfcmVjdik7CisKKyAgICAgICAgZmFpbF91bmxlc3MgKHNlbnRfbGVuID09IHJlY3ZfbGVuLAorICAgICAgICAgICAgInRhZyBpdGVtICVzIGhhcyBiZWVuIHJlY2VpdmVkIHdpdGggZGlmZmVyZW50IHNpemUiLCBuYW1lX3NlbnQpOworCisgICAgICAgIGZvciAoayA9IDA7IGsgPCBzZW50X2xlbjsgaysrKSB7CisgICAgICAgICAgdmFsdWVfc2VudCA9IGdzdF90YWdfbGlzdF9nZXRfdmFsdWVfaW5kZXggKHNlbnRfdGFncywgbmFtZV9zZW50LCBrKTsKKyAgICAgICAgICB2YWx1ZV9yZWN2ID0KKyAgICAgICAgICAgICAgZ3N0X3RhZ19saXN0X2dldF92YWx1ZV9pbmRleCAocmVjZWl2ZWRfdGFncywgbmFtZV9yZWN2LCBrKTsKKworICAgICAgICAgIGNvbXBhcmlzb24gPSBnc3RfdmFsdWVfY29tcGFyZSAodmFsdWVfc2VudCwgdmFsdWVfcmVjdik7CisgICAgICAgICAgaWYgKGNvbXBhcmlzb24gIT0gR1NUX1ZBTFVFX0VRVUFMKSB7CisgICAgICAgICAgICBnY2hhciAqdnMgPSBnX3N0cmR1cF92YWx1ZV9jb250ZW50cyAodmFsdWVfc2VudCk7CisgICAgICAgICAgICBnY2hhciAqdnIgPSBnX3N0cmR1cF92YWx1ZV9jb250ZW50cyAodmFsdWVfcmVjdik7CisgICAgICAgICAgICBHU1RfREVCVUcgKCJzZW50ID0gJXM6JyVzJywgcmVjdiA9ICVzOiclcyciLAorICAgICAgICAgICAgICAgIEdfVkFMVUVfVFlQRV9OQU1FICh2YWx1ZV9zZW50KSwgdnMsCisgICAgICAgICAgICAgICAgR19WQUxVRV9UWVBFX05BTUUgKHZhbHVlX3JlY3YpLCB2cik7CisgICAgICAgICAgICBnX2ZyZWUgKHZzKTsKKyAgICAgICAgICAgIGdfZnJlZSAodnIpOworICAgICAgICAgIH0KKyAgICAgICAgICBmYWlsX3VubGVzcyAoY29tcGFyaXNvbiA9PSBHU1RfVkFMVUVfRVFVQUwsCisgICAgICAgICAgICAgICJ0YWcgaXRlbSAlcyBoYXMgYmVlbiByZWNlaXZlZCB3aXRoIGRpZmZlcmVudCB0eXBlIG9yIHZhbHVlIiwKKyAgICAgICAgICAgICAgbmFtZV9zZW50KTsKKyAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZmFpbF91bmxlc3MgKGZvdW5kLCAidGFnIGl0ZW0gJXMgaXMgbG9zdCIsIG5hbWVfc2VudCk7CisgIH0KKworICBnc3RfdGFnX2xpc3RfdW5yZWYgKHJlY2VpdmVkX3RhZ3MpOworICByZWNlaXZlZF90YWdzID0gTlVMTDsKKyAgZ3N0X3RhZ19saXN0X3VucmVmIChzZW50X3RhZ3MpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisgIGdfb2JqZWN0X3VucmVmIChkZW11eCk7CisgIGdfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisgIGdfc291cmNlX3JlbW92ZSAoYnVzX3dhdGNoKTsKK30KKworLyoKKyAqIFRlc3RzIGlmIHRoZSBtdXhlci9kZW11eGVyIHBhaXIgY2FuIHNlcmlhbGl6ZSB0aGUgdGFncyBpbiAndGFnX3N0cicKKyAqIHRvIGEgZmlsZSBhbmQgcmVjb3ZlciB0aGVtIGNvcnJlY3RseS4KKyAqCisgKiAnY2FwcycgYXJlIHVzZWQgdG8gYXNzdXJlIHRoZSBtdXhlciBhY2NlcHRzIHRoZSBmYWtlIGJ1ZmZlciBmYWtlc3JjCisgKiB3aWxsIHNlbmQgdG8gaXQuCisgKi8KK3N0YXRpYyB2b2lkCit0ZXN0X3RhZ3MgKGNvbnN0IGdjaGFyICogdGFnX3N0ciwgY29uc3QgZ2NoYXIgKiBjYXBzLCBjb25zdCBnY2hhciAqIG11eGVyLAorICAgIGNvbnN0IGdjaGFyICogZGVtdXhlcikKK3sKKyAgZ2NoYXIgKnRtcGZpbGU7CisgIGdjaGFyICp0bXBkaXI7CisKKyAgdG1wZGlyID0gZ19kaXJfbWFrZV90bXAgKCJnc3QtY2hlY2stZ29vZC1YWFhYWFgiLCBOVUxMKTsKKyAgZmFpbF91bmxlc3MgKHRtcGRpciAhPSBOVUxMKTsKKyAgdG1wZmlsZSA9IGdfYnVpbGRfZmlsZW5hbWUgKHRtcGRpciwgInRhZ3NjaGVja2luZy14bXAiLCBOVUxMKTsKKworICBHU1RfREVCVUcgKCJ0ZXN0aW5nIHRhZ3MgOiAlcyIsIHRhZ19zdHIpOworICB0ZXN0X211eF90YWdzICh0YWdfc3RyLCBjYXBzLCBtdXhlciwgdG1wZmlsZSk7CisgIHRlc3RfZGVtdXhfdGFncyAodGFnX3N0ciwgZGVtdXhlciwgdG1wZmlsZSk7CisgIGdfdW5saW5rICh0bXBmaWxlKTsKKyAgZ19ybWRpciAodG1wZGlyKTsKKyAgZ19mcmVlICh0bXBmaWxlKTsKKyAgZ19mcmVlICh0bXBkaXIpOworfQorCisjZGVmaW5lIEgyNjRfQ0FQUyAidmlkZW8veC1oMjY0LCB3aWR0aD0oaW50KTMyMCwgaGVpZ2h0PShpbnQpMjQwLCIgXAorICAgICAgICAgICAgICAgICAgIiBmcmFtZXJhdGU9KGZyYWN0aW9uKTMwLzEsIGNvZGVjX2RhdGE9KGJ1ZmZlcikiIFwKKyAgICAgICAgICAgICAgICAgICIwMTQwMTU5MmZmZTEwMDE3Njc0ZDQwMTU5MjU0MGEwZmQ4MDg4MDAwMDAwMzAwIiBcCisgICAgICAgICAgICAgICAgICAiODAwMDAwMWU0NzhiMTc1MDAxMDAwNDY4ZWUzYzgwLCAiXAorICAgICAgICAgICAgICAgICAgInN0cmVhbS1mb3JtYXQ9KHN0cmluZylhdmMsIGFsaWdubWVudD0oc3RyaW5nKWF1IgorCisjZGVmaW5lIENPTU1PTl9UQUdTIFwKKyAgICAidGFnbGlzdCx0aXRsZT10ZXN0X3RpdGxlLCIgICAgXAorICAgICJhcnRpc3Q9dGVzdF9hcnRpc3QsIiAgICAgICAgICBcCisgICAgImtleXdvcmRzPVwia2V5MSxrZXkyXCIsIiAgICAgIFwKKyAgICAiZGVzY3JpcHRpb249dGVzdF9kZXNjIgorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9jb21tb25fdGFncykKK3sKKyAgaWYgKCFnc3RfcmVnaXN0cnlfY2hlY2tfZmVhdHVyZV92ZXJzaW9uIChnc3RfcmVnaXN0cnlfZ2V0ICgpLCAicXRkZW11eCIsIDAsCisgICAgICAgICAgMTAsIDIzKSkgeworICAgIEdTVF9JTkZPICgiU2tpcHBpbmcgdGVzdCwgcXRkZW11eCBlaXRoZXIgbm90IGF2YWlsYWJsZSBvciB0b28gb2xkIik7CisgICAgcmV0dXJuOworICB9CisgIHRlc3RfdGFncyAoQ09NTU9OX1RBR1MsIEgyNjRfQ0FQUywgInF0bXV4IiwgInF0ZGVtdXgiKTsKKyAgdGVzdF90YWdzIChDT01NT05fVEFHUywgSDI2NF9DQVBTLCAibXA0bXV4IiwgInF0ZGVtdXgiKTsKKyAgdGVzdF90YWdzIChDT01NT05fVEFHUywgSDI2NF9DQVBTLCAiM2dwcG11eCIsICJxdGRlbXV4Iik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworI2RlZmluZSBHRU9fTE9DQVRJT05fVEFHUyBcCisgICAgInRhZ2xpc3QsZ2VvLWxvY2F0aW9uLWNvdW50cnk9QnJhemlsLCIgICAgXAorICAgICAgImdlby1sb2NhdGlvbi1jaXR5PVwiQ2FtcGluYSBHcmFuZGVcIiwiIFwKKyAgICAgICJnZW8tbG9jYXRpb24tc3VibG9jYXRpb249Qm9kb2NvbmdvLCIgICBcCisgICAgICAiZ2VvLWxvY2F0aW9uLWxhdGl0dWRlPS0xMi4xMjUsIiAgICAgICAgXAorICAgICAgImdlby1sb2NhdGlvbi1sb25naXR1ZGU9NTYuNzUsIiAgICAgICAgIFwKKyAgICAgICJnZW8tbG9jYXRpb24tZWxldmF0aW9uPTMyNy41IgorCitHU1RfU1RBUlRfVEVTVCAodGVzdF9nZW9fbG9jYXRpb25fdGFncykKK3sKKyAgaWYgKCFnc3RfcmVnaXN0cnlfY2hlY2tfZmVhdHVyZV92ZXJzaW9uIChnc3RfcmVnaXN0cnlfZ2V0ICgpLCAicXRkZW11eCIsIDAsCisgICAgICAgICAgMTAsIDIzKSkgeworICAgIEdTVF9JTkZPICgiU2tpcHBpbmcgdGVzdCwgcXRkZW11eCBlaXRoZXIgbm90IGF2YWlsYWJsZSBvciB0b28gb2xkIik7CisgICAgcmV0dXJuOworICB9CisgIHRlc3RfdGFncyAoR0VPX0xPQ0FUSU9OX1RBR1MsIEgyNjRfQ0FQUywgInF0bXV4IiwgInF0ZGVtdXgiKTsKKyAgdGVzdF90YWdzIChHRU9fTE9DQVRJT05fVEFHUywgSDI2NF9DQVBTLCAibXA0bXV4IiwgInF0ZGVtdXgiKTsKKyAgdGVzdF90YWdzIChHRU9fTE9DQVRJT05fVEFHUywgSDI2NF9DQVBTLCAiM2dwcG11eCIsICJxdGRlbXV4Iik7Cit9CisKK0dTVF9FTkRfVEVTVDsKKworCisjZGVmaW5lIFVTRVJfVEFHUyBcCisgICAgInRhZ2xpc3QsdXNlci1yYXRpbmc9KHVpbnQpODUiCisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X3VzZXJfdGFncykKK3sKKyAgaWYgKCFnc3RfcmVnaXN0cnlfY2hlY2tfZmVhdHVyZV92ZXJzaW9uIChnc3RfcmVnaXN0cnlfZ2V0ICgpLCAicXRkZW11eCIsIDAsCisgICAgICAgICAgMTAsIDIzKSkgeworICAgIEdTVF9JTkZPICgiU2tpcHBpbmcgdGVzdCwgcXRkZW11eCBlaXRoZXIgbm90IGF2YWlsYWJsZSBvciB0b28gb2xkIik7CisgICAgcmV0dXJuOworICB9CisKKyAgdGVzdF90YWdzIChVU0VSX1RBR1MsIEgyNjRfQ0FQUywgInF0bXV4IiwgInF0ZGVtdXgiKTsKKyAgdGVzdF90YWdzIChVU0VSX1RBR1MsIEgyNjRfQ0FQUywgIm1wNG11eCIsICJxdGRlbXV4Iik7CisgIHRlc3RfdGFncyAoVVNFUl9UQUdTLCBIMjY0X0NBUFMsICIzZ3BwbXV4IiwgInF0ZGVtdXgiKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgorbWV0YWRhdGFfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgidGFnc2NoZWNraW5nIik7CisKKyAgVENhc2UgKnRjX2NoYWluID0gdGNhc2VfY3JlYXRlICgiZ2VuZXJhbCIpOworCisgIC8qIHRpbWUgb3V0IGFmdGVyIDYwcywgbm90IHRoZSBkZWZhdWx0IDMgKi8KKyAgdGNhc2Vfc2V0X3RpbWVvdXQgKHRjX2NoYWluLCA2MCk7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9jb21tb25fdGFncyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9nZW9fbG9jYXRpb25fdGFncyk7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF91c2VyX3RhZ3MpOworCisgIHJldHVybiBzOworfQorCitHU1RfQ0hFQ0tfTUFJTiAobWV0YWRhdGEpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svcGlwZWxpbmVzL3R3b2xhbWUuYyBiL3Rlc3RzL2NoZWNrL3BpcGVsaW5lcy90d29sYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUyZGNmYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrL3BpcGVsaW5lcy90d29sYW1lLmMKQEAgLTAsMCArMSwyMiBAQAorLyogR1N0cmVhbWVyIHVuaXQgdGVzdCBmb3IgdHdvbGFtZQorICogQ29weXJpZ2h0IChDKSAyMDA3IFRob21hcyBWYW5kZXIgU3RpY2hlbGUgPHRob21hcyBhdCBhcGVzdGFhcnQgZG90IG9yZz4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKiBwcmV0dHkgbGFtZSwgSSBrbm93ICovCisjZGVmaW5lIEVOQ09ERVIgInR3b2xhbWVtcDJlbmMiCisjaW5jbHVkZSAibGFtZS5jIgpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2svcGlwZWxpbmVzL3dhdmVuYy5jIGIvdGVzdHMvY2hlY2svcGlwZWxpbmVzL3dhdmVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MDJlYTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVjay9waXBlbGluZXMvd2F2ZW5jLmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIHVuaXQgdGVzdCBmb3Igd2F2ZW5jCisgKgorICogQ29weXJpZ2h0IChDKSA8MjAxMD4gU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIEZJWE1FIDAuMTE6IHN1cHByZXNzIHdhcm5pbmdzIGZvciBkZXByZWNhdGVkIEFQSSBzdWNoIGFzIEdWYWx1ZUFycmF5CisgKiB3aXRoIG5ld2VyIEdMaWIgdmVyc2lvbnMgKD49IDIuMzEuMCkgKi8KKyNkZWZpbmUgR0xJQl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8uaD4KKyNpbmNsdWRlIDxnc3QvYXVkaW8vYXVkaW8tZW51bXR5cGVzLmg+CisKK3N0YXRpYyBnYm9vbGVhbgorYnVzX2hhbmRsZXIgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIGdwb2ludGVyIGRhdGEpCit7CisgIEdNYWluTG9vcCAqbG9vcCA9IChHTWFpbkxvb3AgKikgZGF0YTsKKworICBzd2l0Y2ggKG1lc3NhZ2UtPnR5cGUpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VPUzoKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9XQVJOSU5HOgorICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6eworICAgICAgR0Vycm9yICpnZXJyb3I7CisgICAgICBnY2hhciAqZGVidWc7CisKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtZXNzYWdlLCAmZ2Vycm9yLCAmZGVidWcpOworICAgICAgZ3N0X29iamVjdF9kZWZhdWx0X2Vycm9yIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpLCBnZXJyb3IsIGRlYnVnKTsKKyAgICAgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIGdfZXJyb3JfZnJlZSAoZ2Vycm9yKTsKKyAgICAgIGdfZnJlZSAoZGVidWcpOworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBnc3QtbGF1bmNoLTEuMCBcCisgKiBhdWRpb3Rlc3RzcmMgZnJlcT00NDAgbnVtLWJ1ZmZlcnM9MTAwICEgaW50ZXJsZWF2ZSBuYW1lPWkgISBhdWRpb2NvbnZlcnQgISB3YXZlbmMgISBmaWxlc2luayBsb2NhdGlvbj0vdG1wL21jLndhdiBcCisgKiBhdWRpb3Rlc3RzcmMgZnJlcT04ODAgbnVtLWJ1ZmZlcnM9MTAwICEgaS4KKyAqIC4uLgorICoKKyAqIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93aGRjL2RldmljZS9hdWRpby9tdWx0aWNoYXVkLm1zcHgKKyAqLworCitzdGF0aWMgdm9pZAorbWFrZV9uX2NoYW5uZWxfd2F2IChjb25zdCBnaW50IGNoYW5uZWxzLCBjb25zdCBHVmFsdWVBcnJheSAqIGFycikKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdEVsZW1lbnQgKiphdWRpb3Rlc3RzcmMsICppbnRlcmxlYXZlLCAqd2F2ZW5jLCAqY29udiwgKmZha2VzaW5rOworICBHc3RCdXMgKmJ1czsKKyAgR01haW5Mb29wICpsb29wOworICBndWludCBpOworICBndWludCBidXNfd2F0Y2ggPSAwOworCisgIGF1ZGlvdGVzdHNyYyA9IGdfbmV3MCAoR3N0RWxlbWVudCAqLCBjaGFubmVscyk7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3ICgicGlwZWxpbmUiKTsKKyAgZmFpbF91bmxlc3MgKHBpcGVsaW5lICE9IE5VTEwpOworCisgIGludGVybGVhdmUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJpbnRlcmxlYXZlIiwgTlVMTCk7CisgIGZhaWxfdW5sZXNzIChpbnRlcmxlYXZlICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKGludGVybGVhdmUsICJjaGFubmVsLXBvc2l0aW9ucyIsIGFyciwgTlVMTCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIGludGVybGVhdmUpOworCisgIGlmIChHX0JZVEVfT1JERVIgPT0gR19CSUdfRU5ESUFOKSB7CisgICAgLyogd2UncmUgbm90IGhlcmUgdG8gdGVzdCBvcmM7IGF1ZGlvY29udmVydCBtaXNiZWhhdmVzIG9uIHBwYzMyICovCisgICAgZ19zZXRlbnYgKCJPUkNfQ09ERSIsICJiYWNrdXAiLCAxKTsKKyAgICBjb252ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW9jb252ZXJ0IiwgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgY29udiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImlkZW50aXR5IiwgTlVMTCk7CisgIH0KKyAgZmFpbF91bmxlc3MgKGNvbnYgIT0gTlVMTCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIGNvbnYpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGluayAoaW50ZXJsZWF2ZSwgY29udikpOworCisgIHdhdmVuYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoIndhdmVuYyIsIE5VTEwpOworICBmYWlsX3VubGVzcyAod2F2ZW5jICE9IE5VTEwpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCB3YXZlbmMpOworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGluayAoY29udiwgd2F2ZW5jKSk7CisKKyAgZmFrZXNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsIE5VTEwpOworICBmYWlsX3VubGVzcyAoZmFrZXNpbmsgIT0gTlVMTCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIGZha2VzaW5rKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9lbGVtZW50X2xpbmsgKHdhdmVuYywgZmFrZXNpbmspKTsKKworICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgeworICAgIGF1ZGlvdGVzdHNyY1tpXSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvdGVzdHNyYyIsIE5VTEwpOworICAgIGZhaWxfdW5sZXNzIChhdWRpb3Rlc3RzcmNbaV0gIT0gTlVMTCk7CisgICAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoYXVkaW90ZXN0c3JjW2ldKSwgIndhdmUiLCAwLCAiZnJlcSIsCisgICAgICAgIDQ0MC4wICogKGkgKyAxKSwgIm51bS1idWZmZXJzIiwgMTAwLCBOVUxMKTsKKyAgICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBhdWRpb3Rlc3RzcmNbaV0pOworICAgIGZhaWxfdW5sZXNzIChnc3RfZWxlbWVudF9saW5rIChhdWRpb3Rlc3RzcmNbaV0sIGludGVybGVhdmUpKTsKKyAgfQorCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIFRSVUUpOworICBmYWlsX3VubGVzcyAobG9vcCAhPSBOVUxMKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChwaXBlbGluZSk7CisgIGZhaWxfdW5sZXNzIChidXMgIT0gTlVMTCk7CisgIGJ1c193YXRjaCA9IGdzdF9idXNfYWRkX3dhdGNoIChidXMsIGJ1c19oYW5kbGVyLCBsb29wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisgIGdfZnJlZSAoYXVkaW90ZXN0c3JjKTsKKworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisgIGdfc291cmNlX3JlbW92ZSAoYnVzX3dhdGNoKTsKK30KKworR1NUX1NUQVJUX1RFU1QgKHRlc3RfZW5jb2RlX3N0ZXJlbykKK3sKKyAgR1ZhbHVlQXJyYXkgKmFycjsKKyAgR1ZhbHVlIHZhbCA9IHsgMCwgfTsKKworICBhcnIgPSBnX3ZhbHVlX2FycmF5X25ldyAoMik7CisgIGdfdmFsdWVfaW5pdCAoJnZhbCwgR1NUX1RZUEVfQVVESU9fQ0hBTk5FTF9QT1NJVElPTik7CisgIGdfdmFsdWVfc2V0X2VudW0gKCZ2YWwsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlQpOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAoYXJyLCAmdmFsKTsKKyAgZ192YWx1ZV9yZXNldCAoJnZhbCk7CisgIGdfdmFsdWVfc2V0X2VudW0gKCZ2YWwsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX1JJR0hUKTsKKyAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKGFyciwgJnZhbCk7CisgIGdfdmFsdWVfdW5zZXQgKCZ2YWwpOworCisgIG1ha2Vfbl9jaGFubmVsX3dhdiAoMiwgYXJyKTsKKyAgZ192YWx1ZV9hcnJheV9mcmVlIChhcnIpOworfQorCitHU1RfRU5EX1RFU1Q7CisKKyNpZiAwCitHU1RfU1RBUlRfVEVTVCAodGVzdF9lbmNvZGVfbXVsdGljaGFubmVsKQoreworICBHVmFsdWVBcnJheSAqYXJyOworICBHVmFsdWUgdmFsID0geyAwLCB9OworCisgIGFyciA9IGdfdmFsdWVfYXJyYXlfbmV3ICg2KTsKKyAgZ192YWx1ZV9pbml0ICgmdmFsLCBHU1RfVFlQRV9BVURJT19DSEFOTkVMX1BPU0lUSU9OKTsKKyAgZ192YWx1ZV9zZXRfZW51bSAoJnZhbCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfTEVGVCk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kIChhcnIsICZ2YWwpOworICBnX3ZhbHVlX3Jlc2V0ICgmdmFsKTsKKyAgZ192YWx1ZV9zZXRfZW51bSAoJnZhbCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQpOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAoYXJyLCAmdmFsKTsKKyAgZ192YWx1ZV9yZXNldCAoJnZhbCk7CisgIGdfdmFsdWVfc2V0X2VudW0gKCZ2YWwsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0NFTlRFUik7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kIChhcnIsICZ2YWwpOworICBnX3ZhbHVlX3Jlc2V0ICgmdmFsKTsKKyAgZ192YWx1ZV9zZXRfZW51bSAoJnZhbCwgR1NUX0FVRElPX0NIQU5ORUxfUE9TSVRJT05fTEZFKTsKKyAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKGFyciwgJnZhbCk7CisgIGdfdmFsdWVfcmVzZXQgKCZ2YWwpOworICBnX3ZhbHVlX3NldF9lbnVtICgmdmFsLCBHU1RfQVVESU9fQ0hBTk5FTF9QT1NJVElPTl9SRUFSX0xFRlQpOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAoYXJyLCAmdmFsKTsKKyAgZ192YWx1ZV9yZXNldCAoJnZhbCk7CisgIGdfdmFsdWVfc2V0X2VudW0gKCZ2YWwsIEdTVF9BVURJT19DSEFOTkVMX1BPU0lUSU9OX1JFQVJfUklHSFQpOworICBnX3ZhbHVlX2FycmF5X2FwcGVuZCAoYXJyLCAmdmFsKTsKKyAgZ192YWx1ZV91bnNldCAoJnZhbCk7CisKKyAgbWFrZV9uX2NoYW5uZWxfd2F2ICg2KTsKK30KKworR1NUX0VORF9URVNUOworI2VuZGlmCisKK3N0YXRpYyBTdWl0ZSAqCit3YXZlbmNfc3VpdGUgKHZvaWQpCit7CisgIFN1aXRlICpzID0gc3VpdGVfY3JlYXRlICgid2F2ZW5jIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImdlbmVyYWwiKTsKKworICBzdWl0ZV9hZGRfdGNhc2UgKHMsIHRjX2NoYWluKTsKKyAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2VuY29kZV9zdGVyZW8pOworICAvKiBGSVhNRTogaW1wcm92ZSB3YXZlbmMKKyAgICAgdGNhc2VfYWRkX3Rlc3QgKHRjX2NoYWluLCB0ZXN0X2VuY29kZV9tdWx0aWNoYW5uZWwpOworICAgKi8KKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHdhdmVuYyk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVjay9waXBlbGluZXMvd2F2cGFjay5jIGIvdGVzdHMvY2hlY2svcGlwZWxpbmVzL3dhdnBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTA4N2I5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2svcGlwZWxpbmVzL3dhdnBhY2suYwpAQCAtMCwwICsxLDIwNSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnc3QvY2hlY2svZ3N0Y2hlY2suaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9nc3RhZGFwdGVyLmg+CisKK3N0YXRpYyBnYm9vbGVhbgorYnVzX2hhbmRsZXIgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIGdwb2ludGVyIGRhdGEpCit7CisgIEdNYWluTG9vcCAqbG9vcCA9IChHTWFpbkxvb3AgKikgZGF0YTsKKworICBzd2l0Y2ggKG1lc3NhZ2UtPnR5cGUpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VPUzoKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9XQVJOSU5HOgorICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6eworICAgICAgR0Vycm9yICpnZXJyb3I7CisgICAgICBnY2hhciAqZGVidWc7CisKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtZXNzYWdlLCAmZ2Vycm9yLCAmZGVidWcpOworICAgICAgZ3N0X29iamVjdF9kZWZhdWx0X2Vycm9yIChHU1RfTUVTU0FHRV9TUkMgKG1lc3NhZ2UpLCBnZXJyb3IsIGRlYnVnKTsKKyAgICAgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgIGdfZXJyb3JfZnJlZSAoZ2Vycm9yKTsKKyAgICAgIGdfZnJlZSAoZGVidWcpOworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FTEVNRU5UOgorICAgIHsKKyAgICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1lc3NhZ2UpOworCisgICAgICBjb25zdCBnY2hhciAqbmFtZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHMpOworCisgICAgICBmYWlsX3VubGVzcyAoc3RyY21wIChuYW1lLCAiaW1wZXJmZWN0LXRpbWVzdGFtcCIpICE9IDApOworICAgICAgZmFpbF91bmxlc3MgKHN0cmNtcCAobmFtZSwgImltcGVyZmVjdC1vZmZzZXQiKSAhPSAwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuIGhhZF9maXJzdF9idWZmZXIgPSBGQUxTRTsKKworc3RhdGljIHZvaWQKK2lkZW50aXR5X2hhbmRvZmYgKEdzdEVsZW1lbnQgKiBvYmplY3QsIEdzdEJ1ZmZlciAqIGJ1ZmZlciwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RBZGFwdGVyICphZGFwdGVyID0gR1NUX0FEQVBURVIgKHVzZXJfZGF0YSk7CisKKyAgZ3N0X2FkYXB0ZXJfcHVzaCAoYWRhcHRlciwgZ3N0X2J1ZmZlcl9yZWYgKGJ1ZmZlcikpOworfQorCitzdGF0aWMgdm9pZAorZmFrZXNpbmtfaGFuZG9mZiAoR3N0RWxlbWVudCAqIG9iamVjdCwgR3N0QnVmZmVyICogYnVmZmVyLCBHc3RQYWQgKiBwYWQsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RBZGFwdGVyICphZGFwdGVyID0gR1NUX0FEQVBURVIgKHVzZXJfZGF0YSk7CisKKyAgLyogRG9uJ3QgYWxsb3cgdGhlIHNlY29uZCBidWZmZXIgd2l0aCBvZmZzZXQ9MCBhcyBpdCdzIHRoZSBkZWNvZGVkCisgICAqIHJld3JpdGUgb2YgdGhlIGZpcnN0CisgICAqLworICBpZiAoaGFkX2ZpcnN0X2J1ZmZlciA9PSBGQUxTRSAmJiBHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSA9PSAwKQorICAgIGhhZF9maXJzdF9idWZmZXIgPSBUUlVFOworICBlbHNlIGlmIChHU1RfQlVGRkVSX09GRlNFVCAoYnVmZmVyKSA9PSAwKQorICAgIHJldHVybjsKKworICBnc3RfYWRhcHRlcl9wdXNoIChhZGFwdGVyLCBnc3RfYnVmZmVyX3JlZiAoYnVmZmVyKSk7Cit9CisKK0dTVF9TVEFSVF9URVNUICh0ZXN0X2VuY29kZV9kZWNvZGUpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RFbGVtZW50ICphdWRpb3Rlc3RzcmMsICppZGVudGl0eTEsICp3YXZwYWNrZW5jLCAqaWRlbnRpdHkyLCAqd2F2cGFja2RlYywKKyAgICAgICppZGVudGl0eTMsICpmYWtlc2luazsKKyAgR3N0QWRhcHRlciAqc3JjYWRhcHRlciwgKnNpbmthZGFwdGVyOworICBHc3RCdXMgKmJ1czsKKyAgR01haW5Mb29wICpsb29wOworICBHc3RCdWZmZXIgKmluLCAqb3V0OworICBndWludCBidXNfd2F0Y2ggPSAwOworICBHc3RNYXBJbmZvIG1hcDsKKworICBzcmNhZGFwdGVyID0gZ3N0X2FkYXB0ZXJfbmV3ICgpOworICBmYWlsX3VubGVzcyAoc3JjYWRhcHRlciAhPSBOVUxMKTsKKyAgc2lua2FkYXB0ZXIgPSBnc3RfYWRhcHRlcl9uZXcgKCk7CisgIGZhaWxfdW5sZXNzIChzaW5rYWRhcHRlciAhPSBOVUxMKTsKKworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworICBmYWlsX3VubGVzcyAocGlwZWxpbmUgIT0gTlVMTCk7CisKKyAgYXVkaW90ZXN0c3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW90ZXN0c3JjIiwgInNyYyIpOworICBmYWlsX3VubGVzcyAoYXVkaW90ZXN0c3JjICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChhdWRpb3Rlc3RzcmMpLCAid2F2ZSIsIDAsICJmcmVxIiwgNDQwLjAsCisgICAgICAibnVtLWJ1ZmZlcnMiLCAyMDAsIE5VTEwpOworCisgIGlkZW50aXR5MSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImlkZW50aXR5IiwgImlkZW50aXR5MSIpOworICBmYWlsX3VubGVzcyAoaWRlbnRpdHkxICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChpZGVudGl0eTEpLCAic2lnbmFsLWhhbmRvZmZzIiwgVFJVRSwgTlVMTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChpZGVudGl0eTEpLCAiaGFuZG9mZiIsCisgICAgICBHX0NBTExCQUNLIChpZGVudGl0eV9oYW5kb2ZmKSwgc3JjYWRhcHRlcik7CisKKyAgd2F2cGFja2VuYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoIndhdnBhY2tlbmMiLCAiZW5jIik7CisgIGZhaWxfdW5sZXNzICh3YXZwYWNrZW5jICE9IE5VTEwpOworCisgIGlkZW50aXR5MiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImlkZW50aXR5IiwgImlkZW50aXR5MiIpOworICBmYWlsX3VubGVzcyAoaWRlbnRpdHkyICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChpZGVudGl0eTIpLCAiY2hlY2staW1wZXJmZWN0LXRpbWVzdGFtcCIsIFRSVUUsCisgICAgICAiY2hlY2staW1wZXJmZWN0LW9mZnNldCIsIFRSVUUsIE5VTEwpOworCisgIHdhdnBhY2tkZWMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ3YXZwYWNrZGVjIiwgImRlYyIpOworICBmYWlsX3VubGVzcyAod2F2cGFja2RlYyAhPSBOVUxMKTsKKworICBpZGVudGl0eTMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJpZGVudGl0eSIsICJpZGVudGl0eTMiKTsKKyAgZmFpbF91bmxlc3MgKGlkZW50aXR5MyAhPSBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoaWRlbnRpdHkzKSwgImNoZWNrLWltcGVyZmVjdC10aW1lc3RhbXAiLCBUUlVFLAorICAgICAgImNoZWNrLWltcGVyZmVjdC1vZmZzZXQiLCBUUlVFLCBOVUxMKTsKKworICBmYWtlc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgInNpbmsiKTsKKyAgZmFpbF91bmxlc3MgKGZha2VzaW5rICE9IE5VTEwpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChmYWtlc2luayksICJzaWduYWwtaGFuZG9mZnMiLCBUUlVFLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoR19PQkpFQ1QgKGZha2VzaW5rKSwgImhhbmRvZmYiLAorICAgICAgR19DQUxMQkFDSyAoZmFrZXNpbmtfaGFuZG9mZiksIHNpbmthZGFwdGVyKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIGF1ZGlvdGVzdHNyYywgaWRlbnRpdHkxLCB3YXZwYWNrZW5jLAorICAgICAgaWRlbnRpdHkyLCB3YXZwYWNrZGVjLCBpZGVudGl0eTMsIGZha2VzaW5rLCBOVUxMKTsKKworICBmYWlsX3VubGVzcyAoZ3N0X2VsZW1lbnRfbGlua19tYW55IChhdWRpb3Rlc3RzcmMsIGlkZW50aXR5MSwgd2F2cGFja2VuYywKKyAgICAgICAgICBpZGVudGl0eTIsIHdhdnBhY2tkZWMsIGlkZW50aXR5MywgZmFrZXNpbmssIE5VTEwpKTsKKworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBUUlVFKTsKKyAgZmFpbF91bmxlc3MgKGxvb3AgIT0gTlVMTCk7CisKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAocGlwZWxpbmUpOworICBmYWlsX3VubGVzcyAoYnVzICE9IE5VTEwpOworICBidXNfd2F0Y2ggPSBnc3RfYnVzX2FkZF93YXRjaCAoYnVzLCBidXNfaGFuZGxlciwgbG9vcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgaGFkX2ZpcnN0X2J1ZmZlciA9IEZBTFNFOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKworICBmYWlsX3VubGVzcyAoaGFkX2ZpcnN0X2J1ZmZlciA9PSBUUlVFKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoc3JjYWRhcHRlcikgPiAwKTsKKyAgZmFpbF91bmxlc3MgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoc2lua2FkYXB0ZXIpID4gMCk7CisgIGZhaWxfdW5sZXNzX2VxdWFsc19pbnQgKGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoc3JjYWRhcHRlciksCisgICAgICBnc3RfYWRhcHRlcl9hdmFpbGFibGUgKHNpbmthZGFwdGVyKSk7CisKKyAgaW4gPSBnc3RfYWRhcHRlcl90YWtlX2J1ZmZlciAoc3JjYWRhcHRlciwgZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChzcmNhZGFwdGVyKSk7CisgIGZhaWxfdW5sZXNzIChpbiAhPSBOVUxMKTsKKyAgb3V0ID0KKyAgICAgIGdzdF9hZGFwdGVyX3Rha2VfYnVmZmVyIChzaW5rYWRhcHRlciwKKyAgICAgIGdzdF9hZGFwdGVyX2F2YWlsYWJsZSAoc2lua2FkYXB0ZXIpKTsKKyAgZmFpbF91bmxlc3MgKG91dCAhPSBOVUxMKTsKKworICBmYWlsX3VubGVzc19lcXVhbHNfaW50IChnc3RfYnVmZmVyX2dldF9zaXplIChpbiksIGdzdF9idWZmZXJfZ2V0X3NpemUgKG91dCkpOworICBnc3RfYnVmZmVyX21hcCAob3V0LCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICBmYWlsX3VubGVzcyAoZ3N0X2J1ZmZlcl9tZW1jbXAgKGluLCAwLCBtYXAuZGF0YSwgbWFwLnNpemUpID09IDApOworICBnc3RfYnVmZmVyX3VubWFwIChvdXQsICZtYXApOworCisgIGdzdF9idWZmZXJfdW5yZWYgKGluKTsKKyAgZ3N0X2J1ZmZlcl91bnJlZiAob3V0KTsKKyAgZ19vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKyAgZ19tYWluX2xvb3BfdW5yZWYgKGxvb3ApOworICBnX29iamVjdF91bnJlZiAoc3JjYWRhcHRlcik7CisgIGdfb2JqZWN0X3VucmVmIChzaW5rYWRhcHRlcik7CisgIGdfc291cmNlX3JlbW92ZSAoYnVzX3dhdGNoKTsKK30KKworR1NUX0VORF9URVNUOworCitzdGF0aWMgU3VpdGUgKgord2F2cGFja19zdWl0ZSAodm9pZCkKK3sKKyAgU3VpdGUgKnMgPSBzdWl0ZV9jcmVhdGUgKCJXYXZwYWNrIik7CisgIFRDYXNlICp0Y19jaGFpbiA9IHRjYXNlX2NyZWF0ZSAoImxpbmVhciIpOworCisgIC8qIHRpbWUgb3V0IGFmdGVyIDYwcywgbm90IHRoZSBkZWZhdWx0IDMgKi8KKyAgdGNhc2Vfc2V0X3RpbWVvdXQgKHRjX2NoYWluLCA2MCk7CisKKyAgc3VpdGVfYWRkX3RjYXNlIChzLCB0Y19jaGFpbik7CisgIHRjYXNlX2FkZF90ZXN0ICh0Y19jaGFpbiwgdGVzdF9lbmNvZGVfZGVjb2RlKTsKKworICByZXR1cm4gczsKK30KKworR1NUX0NIRUNLX01BSU4gKHdhdnBhY2spOwpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvTWFrZWZpbGUuYW0gYi90ZXN0cy9leGFtcGxlcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzEwZDAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxOSBAQAoraWYgVVNFX0pBQ0sKK0pBQ0tfRElSPWphY2sKK2Vsc2UKK0pBQ0tfRElSPQorZW5kaWYKKworaWYgVVNFX0NBSVJPCitDQUlST19ESVI9Y2Fpcm8KK2Vsc2UKK0NBSVJPX0RJUj0KK2VuZGlmCisKK1NVQkRJUlMgPSBhdWRpb2Z4IGVxdWFsaXplciAkKEpBQ0tfRElSKSBsZXZlbCBcCisJcnRwIHNoYXBld2lwZSBzcGVjdHJ1bSB2NGwyICQoQ0FJUk9fRElSKQorCitESVNUX1NVQkRJUlMgPSBhdWRpb2Z4IGVxdWFsaXplciBqYWNrIGxldmVsIFwKKwlydHAgc2hhcGV3aXBlIHNwZWN0cnVtIHY0bDIgY2Fpcm8KKworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL2NvbW1vbi9wYXJhbGxlbC1zdWJkaXJzLm1hawpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvYXVkaW9meC8uZ2l0aWdub3JlIGIvdGVzdHMvZXhhbXBsZXMvYXVkaW9meC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZDU2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9hdWRpb2Z4Ly5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACitmaXJmaWx0ZXItZXhhbXBsZQoraWlyZmlsdGVyLWV4YW1wbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL2F1ZGlvZngvTWFrZWZpbGUuYW0gYi90ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYzQyYzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTAgQEAKK25vaW5zdF9QUk9HUkFNUyA9IGZpcmZpbHRlci1leGFtcGxlIGlpcmZpbHRlci1leGFtcGxlCisKKyMgRklYTUUgMC4xMTogaWdub3JlIEdWYWx1ZUFycmF5IHdhcm5pbmdzIGZvciBub3cgdW50aWwgdGhpcyBpcyBzb3J0ZWQKK0VSUk9SX0NGTEFHUz0KKworZmlyZmlsdGVyX2V4YW1wbGVfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKQorZmlyZmlsdGVyX2V4YW1wbGVfTERBREQgPSAkKEdTVF9MSUJTKSAkKEdTVF9QTFVHSU5TX0JBU0VfTElCUykgLWxnc3RmZnQtQEdTVF9BUElfVkVSU0lPTkAgJChMSUJNKQorCitpaXJmaWx0ZXJfZXhhbXBsZV9DRkxBR1MgPSAkKEdTVF9DRkxBR1MpCitpaXJmaWx0ZXJfZXhhbXBsZV9MREFERCA9ICQoR1NUX0xJQlMpICQoTElCTSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL2F1ZGlvZngvZmlyZmlsdGVyLWV4YW1wbGUuYyBiL3Rlc3RzL2V4YW1wbGVzL2F1ZGlvZngvZmlyZmlsdGVyLWV4YW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2E2Y2ZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvYXVkaW9meC9maXJmaWx0ZXItZXhhbXBsZS5jCkBAIC0wLDAgKzEsMTY1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOSBTZWJhc3RpYW4gRHJvZWdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKiBUaGlzIHNtYWxsIHNhbXBsZSBhcHBsaWNhdGlvbiBjcmVhdGVzIGEgYmFuZHBhc3MgRklSIGZpbHRlcgorICogYnkgdHJhbnNmb3JtaW5nIHRoZSBmcmVxdWVuY3kgcmVzcG9uc2UgdG8gdGhlIGZpbHRlciBrZXJuZWwuCisgKi8KKworLyogRklYTUUgMC4xMTogc3VwcHJlc3Mgd2FybmluZ3MgZm9yIGRlcHJlY2F0ZWQgQVBJIHN1Y2ggYXMgR1ZhbHVlQXJyYXkKKyAqIHdpdGggbmV3ZXIgR0xpYiB2ZXJzaW9ucyAoPj0gMi4zMS4wKSAqLworI2RlZmluZSBHTElCX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvZmZ0L2dzdGZmdGY2NC5oPgorCitzdGF0aWMgZ2Jvb2xlYW4KK29uX21lc3NhZ2UgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR01haW5Mb29wICpsb29wID0gKEdNYWluTG9vcCAqKSB1c2VyX2RhdGE7CisKKyAgc3dpdGNoIChHU1RfTUVTU0FHRV9UWVBFIChtZXNzYWdlKSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6CisgICAgICBnX2Vycm9yICgiR290IEVSUk9SIik7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01FU1NBR0VfV0FSTklORzoKKyAgICAgIGdfd2FybmluZyAoIkdvdCBXQVJOSU5HIik7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR1NUX01FU1NBR0VfRU9TOgorICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK29uX3JhdGVfY2hhbmdlZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIGdpbnQgcmF0ZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHVmFsdWVBcnJheSAqdmE7CisgIEdWYWx1ZSB2ID0geyAwLCB9OworICBHc3RGRlRGNjQgKmZmdDsKKyAgR3N0RkZURjY0Q29tcGxleCBmcmVxdWVuY3lfcmVzcG9uc2VbMTddOworICBnZG91YmxlIHRtcFszMl07CisgIGdkb3VibGUgZmlsdGVyX2tlcm5lbFszMl07CisgIGd1aW50IGk7CisKKyAgLyogQ3JlYXRlIHRoZSBmcmVxdWVuY3kgcmVzcG9uc2U6IHplcm8gb3V0c2lkZQorICAgKiBhIHNtYWxsIGZyZXF1ZW5jeSBiYW5kICovCisgIGZvciAoaSA9IDA7IGkgPCAxNzsgaSsrKSB7CisgICAgaWYgKGkgPCA1IHx8IGkgPiAxMSkKKyAgICAgIGZyZXF1ZW5jeV9yZXNwb25zZVtpXS5yID0gMC4wOworICAgIGVsc2UKKyAgICAgIGZyZXF1ZW5jeV9yZXNwb25zZVtpXS5yID0gMS4wOworCisgICAgZnJlcXVlbmN5X3Jlc3BvbnNlW2ldLmkgPSAwLjA7CisgIH0KKworICAvKiBDYWxjdWxhdGUgdGhlIGludmVyc2UgRlQgb2YgdGhlIGZyZXF1ZW5jeSByZXNwb25zZSAqLworICBmZnQgPSBnc3RfZmZ0X2Y2NF9uZXcgKDMyLCBUUlVFKTsKKyAgZ3N0X2ZmdF9mNjRfaW52ZXJzZV9mZnQgKGZmdCwgZnJlcXVlbmN5X3Jlc3BvbnNlLCB0bXApOworICBnc3RfZmZ0X2Y2NF9mcmVlIChmZnQpOworCisgIC8qIFNoaWZ0IHRoZSBpbnZlcnNlIEZUIG9mIHRoZSBmcmVxdWVuY3kgcmVzcG9uc2UgYnkgMTYsCisgICAqIGkuZS4gdGhlIGhhbGYgb2YgdGhlIGtlcm5lbCBsZW5ndGggdG8gZ2V0IHRoZQorICAgKiBpbXB1bHNlIHJlc3BvbnNlLiBTZWUgaHR0cDovL3d3dy5kc3BndWlkZS5jb20vY2gxNy8xLmh0bQorICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorICAgIGZpbHRlcl9rZXJuZWxbaV0gPSB0bXBbKGkgKyAxNikgJSAzMl07CisKKyAgLyogQXBwbHkgdGhlIGhhbW1pbmcgd2luZG93IHRvIHRoZSBpbXB1bHNlIHJlc3BvbnNlIHRvIGdldAorICAgKiBhIGJldHRlciByZXN1bHQgdGhhbiBnaXZlbiBmcm9tIHRoZSByZWN0YW5ndWxhciB3aW5kb3cKKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorICAgIGZpbHRlcl9rZXJuZWxbaV0gKj0gKDAuNTQgLSAwLjQ2ICogY29zICgyICogR19QSSAqIGkgLyAzMikpOworCisgIHZhID0gZ192YWx1ZV9hcnJheV9uZXcgKDEpOworCisgIGdfdmFsdWVfaW5pdCAoJnYsIEdfVFlQRV9ET1VCTEUpOworICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgIGdfdmFsdWVfc2V0X2RvdWJsZSAoJnYsIGZpbHRlcl9rZXJuZWxbaV0pOworICAgIGdfdmFsdWVfYXJyYXlfYXBwZW5kICh2YSwgJnYpOworICAgIGdfdmFsdWVfcmVzZXQgKCZ2KTsKKyAgfQorICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChlbGVtZW50KSwgImtlcm5lbCIsIHZhLCBOVUxMKTsKKyAgLyogTGF0ZW5jeSBpcyAxLzIgb2YgdGhlIGtlcm5lbCBsZW5ndGggZm9yIHRoaXMgbWV0aG9kIG9mCisgICAqIGNhbGN1bGF0aW5nIGEgZmlsdGVyIGtlcm5lbCBmcm9tIHRoZSBmcmVxdWVuY3kgcmVzcG9uc2UKKyAgICovCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGVsZW1lbnQpLCAibGF0ZW5jeSIsIChnaW50NjQpICgzMiAvIDIpLCBOVUxMKTsKKyAgZ192YWx1ZV9hcnJheV9mcmVlICh2YSk7Cit9CisKK2dpbnQKK21haW4gKGdpbnQgYXJnYywgZ2NoYXIgKiBhcmd2W10pCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lLCAqc3JjLCAqZmlsdGVyLCAqY29udiwgKnNpbms7CisgIEdzdEJ1cyAqYnVzOworICBHTWFpbkxvb3AgKmxvb3A7CisKKyAgZ3N0X2luaXQgKE5VTEwsIE5VTEwpOworCisgIHBpcGVsaW5lID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicGlwZWxpbmUiLCBOVUxMKTsKKworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb3Rlc3RzcmMiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc3JjKSwgIndhdmUiLCA1LCBOVUxMKTsKKworICBmaWx0ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb2ZpcmZpbHRlciIsIE5VTEwpOworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoZmlsdGVyKSwgInJhdGUtY2hhbmdlZCIsCisgICAgICBHX0NBTExCQUNLIChvbl9yYXRlX2NoYW5nZWQpLCBOVUxMKTsKKworICBjb252ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW9jb252ZXJ0IiwgTlVMTCk7CisKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1dG9hdWRpb3NpbmsiLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNpbmsgIT0gTlVMTCwgLTEpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjLCBmaWx0ZXIsIGNvbnYsIHNpbmssIE5VTEwpOworICBpZiAoIWdzdF9lbGVtZW50X2xpbmtfbWFueSAoc3JjLCBmaWx0ZXIsIGNvbnYsIHNpbmssIE5VTEwpKSB7CisgICAgZ19lcnJvciAoIkZhaWxlZCB0byBsaW5rIGVsZW1lbnRzIik7CisgICAgcmV0dXJuIC0yOworICB9CisKKyAgbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgRkFMU0UpOworCisgIGJ1cyA9IGdzdF9waXBlbGluZV9nZXRfYnVzIChHU1RfUElQRUxJTkUgKHBpcGVsaW5lKSk7CisgIGdzdF9idXNfYWRkX3NpZ25hbF93YXRjaCAoYnVzKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoR19PQkpFQ1QgKGJ1cyksICJtZXNzYWdlIiwgR19DQUxMQkFDSyAob25fbWVzc2FnZSksIGxvb3ApOworICBnc3Rfb2JqZWN0X3VucmVmIChHU1RfT0JKRUNUIChidXMpKTsKKworICBpZiAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKSB7CisgICAgZ19lcnJvciAoIkZhaWxlZCB0byBnbyBpbnRvIFBMQVlJTkcgc3RhdGUiKTsKKyAgICByZXR1cm4gLTM7CisgIH0KKworICBnX21haW5fbG9vcF9ydW4gKGxvb3ApOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL2F1ZGlvZngvaWlyZmlsdGVyLWV4YW1wbGUuYyBiL3Rlc3RzL2V4YW1wbGVzL2F1ZGlvZngvaWlyZmlsdGVyLWV4YW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzU1M2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvYXVkaW9meC9paXJmaWx0ZXItZXhhbXBsZS5jCkBAIC0wLDAgKzEsMTQxIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOSBTZWJhc3RpYW4gRHJvZWdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKiBUaGlzIHNtYWxsIHNhbXBsZSBhcHBsaWNhdGlvbiBjcmVhdGVzIGEgbG93cGFzcyBJSVIgZmlsdGVyCisgKiBhbmQgYXBwbGllcyBpdCB0byB3aGl0ZSBub2lzZS4KKyAqIFNlZSBodHRwOi8vd3d3LmRzcGd1aWRlLmNvbS9jaDE5LzIuaHRtIGZvciBhIGRlc2NyaXB0aW9uCisgKiBvZiB0aGUgSUlSIGZpbHRlciB0aGF0IGlzIHVzZWQuCisgKi8KKworLyogRklYTUUgMC4xMTogc3VwcHJlc3Mgd2FybmluZ3MgZm9yIGRlcHJlY2F0ZWQgQVBJIHN1Y2ggYXMgR1ZhbHVlQXJyYXkKKyAqIHdpdGggbmV3ZXIgR0xpYiB2ZXJzaW9ucyAoPj0gMi4zMS4wKSAqLworI2RlZmluZSBHTElCX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworLyogQ3V0b2ZmIG9mIDQwMDAgSHogKi8KKyNkZWZpbmUgQ1VUT0ZGICg0MDAwLjApCisKK3N0YXRpYyBnYm9vbGVhbgorb25fbWVzc2FnZSAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHTWFpbkxvb3AgKmxvb3AgPSAoR01haW5Mb29wICopIHVzZXJfZGF0YTsKKworICBzd2l0Y2ggKEdTVF9NRVNTQUdFX1RZUEUgKG1lc3NhZ2UpKSB7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FUlJPUjoKKyAgICAgIGdfZXJyb3IgKCJHb3QgRVJST1IiKTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9XQVJOSU5HOgorICAgICAgZ193YXJuaW5nICgiR290IFdBUk5JTkciKTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FT1M6CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorb25fcmF0ZV9jaGFuZ2VkIChHc3RFbGVtZW50ICogZWxlbWVudCwgZ2ludCByYXRlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdWYWx1ZUFycmF5ICp2YTsKKyAgR1ZhbHVlIHYgPSB7IDAsIH07CisgIGdkb3VibGUgeDsKKworICBpZiAocmF0ZSAvIDIuMCA+IENVVE9GRikKKyAgICB4ID0gZXhwICgtMi4wICogR19QSSAqIChDVVRPRkYgLyByYXRlKSk7CisgIGVsc2UKKyAgICB4ID0gMC4wOworCisgIHZhID0gZ192YWx1ZV9hcnJheV9uZXcgKDEpOworCisgIGdfdmFsdWVfaW5pdCAoJnYsIEdfVFlQRV9ET1VCTEUpOworICBnX3ZhbHVlX3NldF9kb3VibGUgKCZ2LCAxLjAgLSB4KTsKKyAgZ192YWx1ZV9hcnJheV9hcHBlbmQgKHZhLCAmdik7CisgIGdfdmFsdWVfcmVzZXQgKCZ2KTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZWxlbWVudCksICJhIiwgdmEsIE5VTEwpOworICBnX3ZhbHVlX2FycmF5X2ZyZWUgKHZhKTsKKworICB2YSA9IGdfdmFsdWVfYXJyYXlfbmV3ICgxKTsKKyAgZ192YWx1ZV9zZXRfZG91YmxlICgmdiwgeCk7CisgIGdfdmFsdWVfYXJyYXlfYXBwZW5kICh2YSwgJnYpOworICBnX3ZhbHVlX3Jlc2V0ICgmdik7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKGVsZW1lbnQpLCAiYiIsIHZhLCBOVUxMKTsKKyAgZ192YWx1ZV9hcnJheV9mcmVlICh2YSk7Cit9CisKK2dpbnQKK21haW4gKGdpbnQgYXJnYywgZ2NoYXIgKiBhcmd2W10pCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lLCAqc3JjLCAqZmlsdGVyLCAqY29udiwgKnNpbms7CisgIEdzdEJ1cyAqYnVzOworICBHTWFpbkxvb3AgKmxvb3A7CisKKyAgZ3N0X2luaXQgKE5VTEwsIE5VTEwpOworCisgIHBpcGVsaW5lID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicGlwZWxpbmUiLCBOVUxMKTsKKworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb3Rlc3RzcmMiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc3JjKSwgIndhdmUiLCA1LCBOVUxMKTsKKworICBmaWx0ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb2lpcmZpbHRlciIsIE5VTEwpOworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoZmlsdGVyKSwgInJhdGUtY2hhbmdlZCIsCisgICAgICBHX0NBTExCQUNLIChvbl9yYXRlX2NoYW5nZWQpLCBOVUxMKTsKKworICBjb252ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW9jb252ZXJ0IiwgTlVMTCk7CisKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1dG9hdWRpb3NpbmsiLCBOVUxMKTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNpbmsgIT0gTlVMTCwgLTEpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjLCBmaWx0ZXIsIGNvbnYsIHNpbmssIE5VTEwpOworICBpZiAoIWdzdF9lbGVtZW50X2xpbmtfbWFueSAoc3JjLCBmaWx0ZXIsIGNvbnYsIHNpbmssIE5VTEwpKSB7CisgICAgZ19lcnJvciAoIkZhaWxlZCB0byBsaW5rIGVsZW1lbnRzIik7CisgICAgcmV0dXJuIC0yOworICB9CisKKyAgbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgRkFMU0UpOworCisgIGJ1cyA9IGdzdF9waXBlbGluZV9nZXRfYnVzIChHU1RfUElQRUxJTkUgKHBpcGVsaW5lKSk7CisgIGdzdF9idXNfYWRkX3NpZ25hbF93YXRjaCAoYnVzKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoR19PQkpFQ1QgKGJ1cyksICJtZXNzYWdlIiwgR19DQUxMQkFDSyAob25fbWVzc2FnZSksIGxvb3ApOworICBnc3Rfb2JqZWN0X3VucmVmIChHU1RfT0JKRUNUIChidXMpKTsKKworICBpZiAoZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwKKyAgICAgICAgICBHU1RfU1RBVEVfUExBWUlORykgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKSB7CisgICAgZ19lcnJvciAoIkZhaWxlZCB0byBnbyBpbnRvIFBMQVlJTkcgc3RhdGUiKTsKKyAgICByZXR1cm4gLTM7CisgIH0KKworICBnX21haW5fbG9vcF9ydW4gKGxvb3ApOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL2F1ZGlvZngvbWVzb24uYnVpbGQgYi90ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTI2ZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9hdWRpb2Z4L21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTIgQEAKK2V4ZWN1dGFibGUoJ2ZpcmZpbHRlci1leGFtcGxlJywgJ2ZpcmZpbHRlci1leGFtcGxlLmMnLAorICBkZXBlbmRlbmNpZXM6IFtnc3RmZnRfZGVwLCBnc3RfZGVwLCBsaWJtXSwKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGluc3RhbGw6IGZhbHNlKQorCitleGVjdXRhYmxlKCdpaXJmaWx0ZXItZXhhbXBsZScsICdpaXJmaWx0ZXItZXhhbXBsZS5jJywKKyAgZGVwZW5kZW5jaWVzOiBbZ3N0X2RlcCwgbGlibV0sCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBpbnN0YWxsOiBmYWxzZSkKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvY2Fpcm8vLmdpdGlnbm9yZSBiL3Rlc3RzL2V4YW1wbGVzL2NhaXJvLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkwNTg1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL2NhaXJvLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorY2Fpcm9fb3ZlcmxheQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvY2Fpcm8vTWFrZWZpbGUuYW0gYi90ZXN0cy9leGFtcGxlcy9jYWlyby9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTgzM2NjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvY2Fpcm8vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1IEBACitub2luc3RfUFJPR1JBTVMgPSBjYWlyb19vdmVybGF5CisKK2NhaXJvX292ZXJsYXlfU09VUkNFUyA9IGNhaXJvX292ZXJsYXkuYworY2Fpcm9fb3ZlcmxheV9DRkxBR1MgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoQ0FJUk9fQ0ZMQUdTKQorY2Fpcm9fb3ZlcmxheV9MREFERCA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKSAkKEdTVF9MSUJTKSAkKENBSVJPX0xJQlMpCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9jYWlyby9jYWlyb19vdmVybGF5LmMgYi90ZXN0cy9leGFtcGxlcy9jYWlyby9jYWlyb19vdmVybGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5ZjcxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL2NhaXJvL2NhaXJvX292ZXJsYXkuYwpAQCAtMCwwICsxLDE4MiBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSm9uIE5vcmRieSA8am9ub25vckBnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIEV4YW1wbGUgc2hvd2luZyB1c2FnZSBvZiB0aGUgY2Fpcm9vdmVybGF5IGVsZW1lbnQKKyAqLworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlby5oPgorCisjaW5jbHVkZSA8Y2Fpcm8uaD4KKyNpbmNsdWRlIDxjYWlyby1nb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisKKworc3RhdGljIGdib29sZWFuCitvbl9tZXNzYWdlIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdNYWluTG9vcCAqbG9vcCA9IChHTWFpbkxvb3AgKikgdXNlcl9kYXRhOworCisgIHN3aXRjaCAoR1NUX01FU1NBR0VfVFlQRSAobWVzc2FnZSkpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VSUk9SOnsKKyAgICAgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgICAgIGdjaGFyICpkZWJ1ZzsKKworICAgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1lc3NhZ2UsICZlcnIsICZkZWJ1Zyk7CisgICAgICBnX2NyaXRpY2FsICgiR290IEVSUk9SOiAlcyAoJXMpIiwgZXJyLT5tZXNzYWdlLCBHU1RfU1RSX05VTEwgKGRlYnVnKSk7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdTVF9NRVNTQUdFX1dBUk5JTkc6eworICAgICAgR0Vycm9yICplcnIgPSBOVUxMOworICAgICAgZ2NoYXIgKmRlYnVnOworCisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV93YXJuaW5nIChtZXNzYWdlLCAmZXJyLCAmZGVidWcpOworICAgICAgZ193YXJuaW5nICgiR290IFdBUk5JTkc6ICVzICglcykiLCBlcnItPm1lc3NhZ2UsIEdTVF9TVFJfTlVMTCAoZGVidWcpKTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX01FU1NBR0VfRU9TOgorICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyogRGF0YXN0cnVjdHVyZSB0byBzaGFyZSB0aGUgc3RhdGUgd2UgYXJlIGludGVyZXN0ZWQgaW4gYmV0d2VlbgorICogcHJlcGFyZSBhbmQgcmVuZGVyIGZ1bmN0aW9uLiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZ2Jvb2xlYW4gdmFsaWQ7CisgIEdzdFZpZGVvSW5mbyB2aW5mbzsKK30gQ2Fpcm9PdmVybGF5U3RhdGU7CisKKy8qIFN0b3JlIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjYXBzIHRoYXQgd2UgYXJlIGludGVyZXN0ZWQgaW4uICovCitzdGF0aWMgdm9pZAorcHJlcGFyZV9vdmVybGF5IChHc3RFbGVtZW50ICogb3ZlcmxheSwgR3N0Q2FwcyAqIGNhcHMsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgQ2Fpcm9PdmVybGF5U3RhdGUgKnN0YXRlID0gKENhaXJvT3ZlcmxheVN0YXRlICopIHVzZXJfZGF0YTsKKworICBzdGF0ZS0+dmFsaWQgPSBnc3RfdmlkZW9faW5mb19mcm9tX2NhcHMgKCZzdGF0ZS0+dmluZm8sIGNhcHMpOworfQorCisvKiBEcmF3IHRoZSBvdmVybGF5LiAKKyAqIFRoaXMgZnVuY3Rpb24gZHJhd3MgYSBjdXRlICJiZWF0aW5nIiBoZWFydC4gKi8KK3N0YXRpYyB2b2lkCitkcmF3X292ZXJsYXkgKEdzdEVsZW1lbnQgKiBvdmVybGF5LCBjYWlyb190ICogY3IsIGd1aW50NjQgdGltZXN0YW1wLAorICAgIGd1aW50NjQgZHVyYXRpb24sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgQ2Fpcm9PdmVybGF5U3RhdGUgKnMgPSAoQ2Fpcm9PdmVybGF5U3RhdGUgKikgdXNlcl9kYXRhOworICBkb3VibGUgc2NhbGU7CisgIGludCB3aWR0aCwgaGVpZ2h0OworCisgIGlmICghcy0+dmFsaWQpCisgICAgcmV0dXJuOworCisgIHdpZHRoID0gR1NUX1ZJREVPX0lORk9fV0lEVEggKCZzLT52aW5mbyk7CisgIGhlaWdodCA9IEdTVF9WSURFT19JTkZPX0hFSUdIVCAoJnMtPnZpbmZvKTsKKworICBzY2FsZSA9IDIgKiAoKCh0aW1lc3RhbXAgLyAoaW50KSAxZTcpICUgNzApICsgMzApIC8gMTAwLjA7CisgIGNhaXJvX3RyYW5zbGF0ZSAoY3IsIHdpZHRoIC8gMiwgKGhlaWdodCAvIDIpIC0gMzApOworCisgIC8qIEZJWE1FOiB0aGlzIGFzc3VtZXMgYSBwaXhlbC1hc3BlY3QtcmF0aW8gb2YgMS8xICovCisgIGNhaXJvX3NjYWxlIChjciwgc2NhbGUsIHNjYWxlKTsKKworICBjYWlyb19tb3ZlX3RvIChjciwgMCwgMCk7CisgIGNhaXJvX2N1cnZlX3RvIChjciwgMCwgLTMwLCAtNTAsIC0zMCwgLTUwLCAwKTsKKyAgY2Fpcm9fY3VydmVfdG8gKGNyLCAtNTAsIDMwLCAwLCAzNSwgMCwgNjApOworICBjYWlyb19jdXJ2ZV90byAoY3IsIDAsIDM1LCA1MCwgMzAsIDUwLCAwKTsKKyAgY2Fpcm9fY3VydmVfdG8gKGNyLCA1MCwgLTMwLCAwLCAtMzAsIDAsIDApOworICBjYWlyb19zZXRfc291cmNlX3JnYmEgKGNyLCAwLjksIDAuMCwgMC4xLCAwLjcpOworICBjYWlyb19maWxsIChjcik7Cit9CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK3NldHVwX2dzdF9waXBlbGluZSAoQ2Fpcm9PdmVybGF5U3RhdGUgKiBvdmVybGF5X3N0YXRlKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0RWxlbWVudCAqY2Fpcm9fb3ZlcmxheTsKKyAgR3N0RWxlbWVudCAqc291cmNlLCAqYWRhcHRvcjEsICphZGFwdG9yMiwgKnNpbms7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3ICgiY2Fpcm8tb3ZlcmxheS1leGFtcGxlIik7CisKKyAgLyogQWRhcHRvcnMgbmVlZGVkIGJlY2F1c2UgY2Fpcm9vdmVybGF5IG9ubHkgc3VwcG9ydHMgQVJHQiBkYXRhICovCisgIHNvdXJjZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsICJzb3VyY2UiKTsKKyAgYWRhcHRvcjEgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb2NvbnZlcnQiLCAiYWRhcHRvcjEiKTsKKyAgY2Fpcm9fb3ZlcmxheSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImNhaXJvb3ZlcmxheSIsICJvdmVybGF5Iik7CisgIGFkYXB0b3IyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW9jb252ZXJ0IiwgImFkYXB0b3IyIik7CisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ4aW1hZ2VzaW5rIiwgInNpbmsiKTsKKyAgaWYgKHNpbmsgPT0gTlVMTCkKKyAgICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXV0b3ZpZGVvc2luayIsICJzaW5rIik7CisKKyAgLyogSWYgZmFpbGluZywgdGhlIGVsZW1lbnQgY291bGQgbm90IGJlIGNyZWF0ZWQgKi8KKyAgZ19hc3NlcnQgKGNhaXJvX292ZXJsYXkpOworCisgIC8qIEhvb2sgdXAgdGhlIG5lY2Nlc2FyeSBzaWduYWxzIGZvciBjYWlyb292ZXJsYXkgKi8KKyAgZ19zaWduYWxfY29ubmVjdCAoY2Fpcm9fb3ZlcmxheSwgImRyYXciLAorICAgICAgR19DQUxMQkFDSyAoZHJhd19vdmVybGF5KSwgb3ZlcmxheV9zdGF0ZSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGNhaXJvX292ZXJsYXksICJjYXBzLWNoYW5nZWQiLAorICAgICAgR19DQUxMQkFDSyAocHJlcGFyZV9vdmVybGF5KSwgb3ZlcmxheV9zdGF0ZSk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBzb3VyY2UsIGFkYXB0b3IxLAorICAgICAgY2Fpcm9fb3ZlcmxheSwgYWRhcHRvcjIsIHNpbmssIE5VTEwpOworCisgIGlmICghZ3N0X2VsZW1lbnRfbGlua19tYW55IChzb3VyY2UsIGFkYXB0b3IxLAorICAgICAgICAgIGNhaXJvX292ZXJsYXksIGFkYXB0b3IyLCBzaW5rLCBOVUxMKSkgeworICAgIGdfd2FybmluZyAoIkZhaWxlZCB0byBsaW5rIGVsZW1lbnRzISIpOworICB9CisKKyAgcmV0dXJuIHBpcGVsaW5lOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgR01haW5Mb29wICpsb29wOworICBHc3RFbGVtZW50ICpwaXBlbGluZTsKKyAgR3N0QnVzICpidXM7CisgIENhaXJvT3ZlcmxheVN0YXRlICpvdmVybGF5X3N0YXRlOworCisgIGdzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisKKyAgLyogYWxsb2NhdGUgb24gaGVhcCBmb3IgcGVkYWdvZ2ljYWwgcmVhc29ucywgbWFrZXMgY29kZSBlYXNpZXIgdG8gdHJhbnNmZXIgKi8KKyAgb3ZlcmxheV9zdGF0ZSA9IGdfbmV3MCAoQ2Fpcm9PdmVybGF5U3RhdGUsIDEpOworCisgIHBpcGVsaW5lID0gc2V0dXBfZ3N0X3BpcGVsaW5lIChvdmVybGF5X3N0YXRlKTsKKworICBidXMgPSBnc3RfcGlwZWxpbmVfZ2V0X2J1cyAoR1NUX1BJUEVMSU5FIChwaXBlbGluZSkpOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2ggKGJ1cyk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChidXMpLCAibWVzc2FnZSIsIEdfQ0FMTEJBQ0sgKG9uX21lc3NhZ2UpLCBsb29wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoR1NUX09CSkVDVCAoYnVzKSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBnX21haW5fbG9vcF9ydW4gKGxvb3ApOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIGdfZnJlZSAob3ZlcmxheV9zdGF0ZSk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvY2Fpcm8vbWVzb24uYnVpbGQgYi90ZXN0cy9leGFtcGxlcy9jYWlyby9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjhkMmMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvY2Fpcm8vbWVzb24uYnVpbGQKQEAgLTAsMCArMSw3IEBACitpZiBjYWlyb19kZXAuZm91bmQoKQorICBleGVjdXRhYmxlKCdjYWlyb19vdmVybGF5JywgJ2NhaXJvX292ZXJsYXkuYycsCisgICAgZGVwZW5kZW5jaWVzOiBbZ3N0dmlkZW9fZGVwLCBnc3RfZGVwLCBjYWlyb19kZXAsIGxpYm1dLAorICAgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgICAgaW5zdGFsbDogZmFsc2UpCitlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvZXF1YWxpemVyLy5naXRpZ25vcmUgYi90ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTQ5YjY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvZXF1YWxpemVyLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorZGVtbwpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvZXF1YWxpemVyL01ha2VmaWxlLmFtIGIvdGVzdHMvZXhhbXBsZXMvZXF1YWxpemVyL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZjJiMjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4IEBACitpZiBIQVZFX0dUSworbm9pbnN0X1BST0dSQU1TID0gZGVtbworZW5kaWYKKworZGVtb19TT1VSQ0VTID0gZGVtby5jCitkZW1vX0NGTEFHUyAgPSAkKEdTVF9CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKSAkKEdUS19DRkxBR1MpCitkZW1vX0xEQUREID0gJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKEdUS19MSUJTKQorCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvZGVtby5jIGIvdGVzdHMvZXhhbXBsZXMvZXF1YWxpemVyL2RlbW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDAwMGU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvZXF1YWxpemVyL2RlbW8uYwpAQCAtMCwwICsxLDMyNyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2ViYXN0aWFuIERyw7ZnZSA8c2xvbW9AY2lyY3VsYXItY2hhb3Mub3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIFRPRE86IFdlIHVzZSBnZGtfY2Fpcm9fY3JlYXRlKCkgYW5kIG90aGVycywgd2hpY2ggYXJlIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgR0RLX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorCisjZGVmaW5lIE5CQU5EUyAxMAorCitzdGF0aWMgR3RrV2lkZ2V0ICpkcmF3aW5nYXJlYSA9IE5VTEw7CitzdGF0aWMgZ3VpbnQgc3BlY3RfaGVpZ2h0ID0gMTI4Oworc3RhdGljIGd1aW50IHNwZWN0X2JhbmRzID0gMjU2Oworc3RhdGljIGdmbG9hdCBoZWlnaHRfc2NhbGUgPSAyLjA7CisKK3N0YXRpYyB2b2lkCitvbl93aW5kb3dfZGVzdHJveSAoR09iamVjdCAqIG9iamVjdCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBkcmF3aW5nYXJlYSA9IE5VTEw7CisgIGd0a19tYWluX3F1aXQgKCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorb25fY29uZmlndXJlX2V2ZW50IChHdGtXaWRnZXQgKiB3aWRnZXQsIEdka0V2ZW50Q29uZmlndXJlICogZXZlbnQsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RFbGVtZW50ICpzcGVjdHJ1bSA9IEdTVF9FTEVNRU5UICh1c2VyX2RhdGEpOworCisgIC8qR1NUX0lORk8gKCIlZCB4ICVkIiwgZXZlbnQtPndpZHRoLCBldmVudC0+aGVpZ2h0KTsgKi8KKyAgc3BlY3RfaGVpZ2h0ID0gZXZlbnQtPmhlaWdodDsKKyAgaGVpZ2h0X3NjYWxlID0gZXZlbnQtPmhlaWdodCAvIDY0LjA7CisgIHNwZWN0X2JhbmRzID0gZXZlbnQtPndpZHRoOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNwZWN0cnVtKSwgImJhbmRzIiwgc3BlY3RfYmFuZHMsIE5VTEwpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qIGNvbnRyb2wgZ2FpbnMgKi8KK3N0YXRpYyB2b2lkCitvbl9nYWluX2NoYW5nZWQgKEd0a1JhbmdlICogcmFuZ2UsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0T2JqZWN0ICpiYW5kID0gR1NUX09CSkVDVCAodXNlcl9kYXRhKTsKKyAgZ2RvdWJsZSB2YWx1ZSA9IGd0a19yYW5nZV9nZXRfdmFsdWUgKHJhbmdlKTsKKworICBnX29iamVjdF9zZXQgKGJhbmQsICJnYWluIiwgdmFsdWUsIE5VTEwpOworfQorCisvKiBjb250cm9sIGJhbmR3aWR0aHMgKi8KK3N0YXRpYyB2b2lkCitvbl9iYW5kd2lkdGhfY2hhbmdlZCAoR3RrUmFuZ2UgKiByYW5nZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RPYmplY3QgKmJhbmQgPSBHU1RfT0JKRUNUICh1c2VyX2RhdGEpOworICBnZG91YmxlIHZhbHVlID0gZ3RrX3JhbmdlX2dldF92YWx1ZSAocmFuZ2UpOworCisgIGdfb2JqZWN0X3NldCAoYmFuZCwgImJhbmR3aWR0aCIsIHZhbHVlLCBOVUxMKTsKK30KKworLyogY29udHJvbCBmcmVxdWVuY3kgKi8KK3N0YXRpYyB2b2lkCitvbl9mcmVxX2NoYW5nZWQgKEd0a1JhbmdlICogcmFuZ2UsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0T2JqZWN0ICpiYW5kID0gR1NUX09CSkVDVCAodXNlcl9kYXRhKTsKKyAgZ2RvdWJsZSB2YWx1ZSA9IGd0a19yYW5nZV9nZXRfdmFsdWUgKHJhbmdlKTsKKworICAvKiBoYm94ICovCisgIEd0a1dpZGdldCAqcGFyZW50ID0gZ3RrX3dpZGdldF9nZXRfcGFyZW50IChHVEtfV0lER0VUIChyYW5nZSkpOworCisgIC8qIGZyYW1lICovCisgIEd0a1dpZGdldCAqcGFyZW50X3BhcmVudCA9IGd0a193aWRnZXRfZ2V0X3BhcmVudCAocGFyZW50KTsKKyAgZ2NoYXIgKmxhYmVsID0gZ19zdHJkdXBfcHJpbnRmICgiJWQgSHoiLCAoaW50KSAodmFsdWUgKyAwLjUpKTsKKworICBndGtfZnJhbWVfc2V0X2xhYmVsIChHVEtfRlJBTUUgKHBhcmVudF9wYXJlbnQpLCBsYWJlbCk7CisgIGdfZnJlZSAobGFiZWwpOworCisgIGdfb2JqZWN0X3NldCAoYmFuZCwgImZyZXEiLCB2YWx1ZSwgTlVMTCk7Cit9CisKKy8qIGRyYXcgZnJlcXVlbmN5IHNwZWN0cnVtIGFzIGEgYnVuY2ggb2YgYmFycyAqLworc3RhdGljIHZvaWQKK2RyYXdfc3BlY3RydW0gKGdmbG9hdCAqIGRhdGEpCit7CisgIGdpbnQgaTsKKyAgR2RrUmVjdGFuZ2xlIHJlY3QgPSB7IDAsIDAsIHNwZWN0X2JhbmRzLCBzcGVjdF9oZWlnaHQgfTsKKyAgY2Fpcm9fdCAqY3I7CisKKyAgaWYgKCFkcmF3aW5nYXJlYSkKKyAgICByZXR1cm47CisKKyAgZ2RrX3dpbmRvd19iZWdpbl9wYWludF9yZWN0IChndGtfd2lkZ2V0X2dldF93aW5kb3cgKGRyYXdpbmdhcmVhKSwgJnJlY3QpOworICBjciA9IGdka19jYWlyb19jcmVhdGUgKGd0a193aWRnZXRfZ2V0X3dpbmRvdyAoZHJhd2luZ2FyZWEpKTsKKworICBjYWlyb19zZXRfc291cmNlX3JnYiAoY3IsIDAsIDAsIDApOworICBjYWlyb19yZWN0YW5nbGUgKGNyLCAwLCAwLCBzcGVjdF9iYW5kcywgc3BlY3RfaGVpZ2h0KTsKKyAgY2Fpcm9fZmlsbCAoY3IpOworICBmb3IgKGkgPSAwOyBpIDwgc3BlY3RfYmFuZHM7IGkrKykgeworICAgIGNhaXJvX3NldF9zb3VyY2VfcmdiIChjciwgMSwgMSwgMSk7CisgICAgY2Fpcm9fcmVjdGFuZ2xlIChjciwgaSwgLWRhdGFbaV0sIDEsIHNwZWN0X2hlaWdodCArIGRhdGFbaV0pOworICAgIGNhaXJvX2ZpbGwgKGNyKTsKKyAgfQorICBjYWlyb19kZXN0cm95IChjcik7CisKKyAgZ2RrX3dpbmRvd19lbmRfcGFpbnQgKGd0a193aWRnZXRfZ2V0X3dpbmRvdyAoZHJhd2luZ2FyZWEpKTsKK30KKworc3RhdGljIHZvaWQKK2R5bmFtaWNfbGluayAoR3N0UGFkVGVtcGxhdGUgKiB0ZW1wbCwgR3N0UGFkICogbmV3cGFkLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdFBhZCAqdGFyZ2V0ID0gR1NUX1BBRCAodXNlcl9kYXRhKTsKKworICBnc3RfcGFkX2xpbmsgKG5ld3BhZCwgdGFyZ2V0KTsKKyAgZ3N0X29iamVjdF91bnJlZiAodGFyZ2V0KTsKK30KKworLyogcmVjZWl2ZSBzcGVjdHJhbCBkYXRhIGZyb20gZWxlbWVudCBtZXNzYWdlICovCitzdGF0aWMgZ2Jvb2xlYW4KK21lc3NhZ2VfaGFuZGxlciAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgaWYgKG1lc3NhZ2UtPnR5cGUgPT0gR1NUX01FU1NBR0VfRUxFTUVOVCkgeworICAgIGNvbnN0IEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9tZXNzYWdlX2dldF9zdHJ1Y3R1cmUgKG1lc3NhZ2UpOworICAgIGNvbnN0IGdjaGFyICpuYW1lID0gZ3N0X3N0cnVjdHVyZV9nZXRfbmFtZSAocyk7CisKKyAgICBpZiAoc3RyY21wIChuYW1lLCAic3BlY3RydW0iKSA9PSAwKSB7CisgICAgICBnZmxvYXQgKnNwZWN0ID0gZ19uZXcgKGdmbG9hdCwgc3BlY3RfYmFuZHMpOworICAgICAgY29uc3QgR1ZhbHVlICpsaXN0OworICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZTsKKyAgICAgIGd1aW50IGk7CisKKyAgICAgIGxpc3QgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgIm1hZ25pdHVkZSIpOworICAgICAgZm9yIChpID0gMDsgaSA8IHNwZWN0X2JhbmRzOyArK2kpIHsKKyAgICAgICAgdmFsdWUgPSBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKGxpc3QsIGkpOworICAgICAgICBzcGVjdFtpXSA9IGhlaWdodF9zY2FsZSAqIGdfdmFsdWVfZ2V0X2Zsb2F0ICh2YWx1ZSk7CisgICAgICB9CisgICAgICBkcmF3X3NwZWN0cnVtIChzcGVjdCk7CisgICAgICBnX2ZyZWUgKHNwZWN0KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgR3N0RWxlbWVudCAqYmluOworICBHc3RFbGVtZW50ICpkZWNvZGViaW4sICpkZWNjb252ZXJ0OworICBHc3RFbGVtZW50ICpjYXBzZmlsdGVyLCAqZXF1YWxpemVyLCAqc3BlY3RydW0sICpzaW5rY29udmVydCwgKnNpbms7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdEJ1cyAqYnVzOworICBHdGtXaWRnZXQgKmFwcHdpbmRvdywgKnZib3gsICpoYm94LCAqc2NhbGU7CisgIGludCBpLCBudW1fYmFuZHMgPSBOQkFORFM7CisKKyAgR09wdGlvbkVudHJ5IG9wdGlvbnNbXSA9IHsKKyAgICB7ImJhbmRzIiwgJ2InLCAwLCBHX09QVElPTl9BUkdfSU5ULCAmbnVtX2JhbmRzLAorICAgICAgICAiTnVtYmVyIG9mIGJhbmRzIiwgTlVMTH0sCisgICAge05VTEx9CisgIH07CisgIEdPcHRpb25Db250ZXh0ICpjdHg7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICBjdHggPSBnX29wdGlvbl9jb250ZXh0X25ldyAoIi0gZGVtbyBvZiBhdWRpbyBlcXVhbGl6ZXIiKTsKKyAgZ19vcHRpb25fY29udGV4dF9hZGRfbWFpbl9lbnRyaWVzIChjdHgsIG9wdGlvbnMsIE5VTEwpOworICBnX29wdGlvbl9jb250ZXh0X2FkZF9ncm91cCAoY3R4LCBnc3RfaW5pdF9nZXRfb3B0aW9uX2dyb3VwICgpKTsKKyAgZ19vcHRpb25fY29udGV4dF9hZGRfZ3JvdXAgKGN0eCwgZ3RrX2dldF9vcHRpb25fZ3JvdXAgKFRSVUUpKTsKKworICBpZiAoIWdfb3B0aW9uX2NvbnRleHRfcGFyc2UgKGN0eCwgJmFyZ2MsICZhcmd2LCAmZXJyKSkgeworICAgIGdfcHJpbnQgKCJFcnJvciBpbml0aWFsaXppbmc6ICVzXG4iLCBlcnItPm1lc3NhZ2UpOworICAgIGdfb3B0aW9uX2NvbnRleHRfZnJlZSAoY3R4KTsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICBleGl0ICgxKTsKKyAgfQorICBnX29wdGlvbl9jb250ZXh0X2ZyZWUgKGN0eCk7CisKKyAgaWYgKGFyZ2MgPCAyKSB7CisgICAgZ19wcmludCAoIlVzYWdlOiAlcyA8dXJpIHRvIHBsYXk+XG4iLCBhcmd2WzBdKTsKKyAgICBnX3ByaW50ICgiICAgIEZvciBvcHRpb25hbCBhcmd1bWVudHM6IC0taGVscFxuIik7CisgICAgZXhpdCAoLTEpOworICB9CisKKyAgZ3N0X2luaXQgKCZhcmdjLCAmYXJndik7CisgIGd0a19pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGJpbiA9IGdzdF9waXBlbGluZV9uZXcgKCJiaW4iKTsKKworICAvKiBVcmkgZGVjb2RpbmcgKi8KKyAgZGVjb2RlYmluID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidXJpZGVjb2RlYmluIiwgImRlY29kZXIiKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoZGVjb2RlYmluKSwgInVyaSIsIGFyZ3ZbMV0sIE5VTEwpOworCisgIC8qIEZvcmNlIGZsb2F0MzIgc2FtcGxlcyAqLworICBkZWNjb252ZXJ0ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW9jb252ZXJ0IiwgImRlY2NvbnZlcnQiKTsKKyAgY2Fwc2ZpbHRlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImNhcHNmaWx0ZXIiLCAiY2Fwc2ZpbHRlciIpOworICBjYXBzID0KKyAgICAgIGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsICJmb3JtYXQiLCBHX1RZUEVfU1RSSU5HLCAiRjMyTEUiLAorICAgICAgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoY2Fwc2ZpbHRlciwgImNhcHMiLCBjYXBzLCBOVUxMKTsKKworICBlcXVhbGl6ZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJlcXVhbGl6ZXItbmJhbmRzIiwgImVxdWFsaXplciIpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChlcXVhbGl6ZXIpLCAibnVtLWJhbmRzIiwgbnVtX2JhbmRzLCBOVUxMKTsKKworICBzcGVjdHJ1bSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInNwZWN0cnVtIiwgInNwZWN0cnVtIik7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNwZWN0cnVtKSwgImJhbmRzIiwgc3BlY3RfYmFuZHMsICJ0aHJlc2hvbGQiLCAtODAsCisgICAgICAicG9zdC1tZXNzYWdlcyIsIFRSVUUsICJpbnRlcnZhbCIsIDUwMCAqIEdTVF9NU0VDT05ELCBOVUxMKTsKKworICBzaW5rY29udmVydCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvY29udmVydCIsICJzaW5rY29udmVydCIpOworCisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdXRvYXVkaW9zaW5rIiwgInNpbmsiKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChiaW4pLCBkZWNvZGViaW4sIGRlY2NvbnZlcnQsIGNhcHNmaWx0ZXIsIGVxdWFsaXplciwKKyAgICAgIHNwZWN0cnVtLCBzaW5rY29udmVydCwgc2luaywgTlVMTCk7CisgIGlmICghZ3N0X2VsZW1lbnRfbGlua19tYW55IChkZWNjb252ZXJ0LCBjYXBzZmlsdGVyLCBlcXVhbGl6ZXIsIHNwZWN0cnVtLAorICAgICAgICAgIHNpbmtjb252ZXJ0LCBzaW5rLCBOVUxMKSkgeworICAgIGZwcmludGYgKHN0ZGVyciwgImNhbid0IGxpbmsgZWxlbWVudHNcbiIpOworICAgIGV4aXQgKDEpOworICB9CisKKyAgLyogSGFuZGxlIGR5bmFtaWMgcGFkcyAqLworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoZGVjb2RlYmluKSwgInBhZC1hZGRlZCIsCisgICAgICBHX0NBTExCQUNLIChkeW5hbWljX2xpbmspLCBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZGVjY29udmVydCwKKyAgICAgICAgICAic2luayIpKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChiaW4pOworICBnc3RfYnVzX2FkZF93YXRjaCAoYnVzLCBtZXNzYWdlX2hhbmRsZXIsIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIGFwcHdpbmRvdyA9IGd0a193aW5kb3dfbmV3IChHVEtfV0lORE9XX1RPUExFVkVMKTsKKyAgZ3RrX3dpbmRvd19zZXRfdGl0bGUgKEdUS19XSU5ET1cgKGFwcHdpbmRvdyksICJFcXVhbGl6ZXIgRGVtbyIpOworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoYXBwd2luZG93KSwgImRlc3Ryb3kiLAorICAgICAgR19DQUxMQkFDSyAob25fd2luZG93X2Rlc3Ryb3kpLCBOVUxMKTsKKyAgdmJveCA9IGd0a19ib3hfbmV3IChHVEtfT1JJRU5UQVRJT05fVkVSVElDQUwsIDYpOworCisgIGRyYXdpbmdhcmVhID0gZ3RrX2RyYXdpbmdfYXJlYV9uZXcgKCk7CisgIGd0a193aWRnZXRfc2V0X3NpemVfcmVxdWVzdCAoZHJhd2luZ2FyZWEsIHNwZWN0X2JhbmRzLCBzcGVjdF9oZWlnaHQpOworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoZHJhd2luZ2FyZWEpLCAiY29uZmlndXJlLWV2ZW50IiwKKyAgICAgIEdfQ0FMTEJBQ0sgKG9uX2NvbmZpZ3VyZV9ldmVudCksIChncG9pbnRlcikgc3BlY3RydW0pOworICBndGtfYm94X3BhY2tfc3RhcnQgKEdUS19CT1ggKHZib3gpLCBkcmF3aW5nYXJlYSwgVFJVRSwgVFJVRSwgMCk7CisKKyAgaGJveCA9IGd0a19ib3hfbmV3IChHVEtfT1JJRU5UQVRJT05fSE9SSVpPTlRBTCwgMjApOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fYmFuZHM7IGkrKykgeworICAgIEdPYmplY3QgKmJhbmQ7CisgICAgZ2RvdWJsZSBmcmVxOworICAgIGdkb3VibGUgYnc7CisgICAgZ2RvdWJsZSBnYWluOworICAgIGdjaGFyICpsYWJlbDsKKyAgICBHdGtXaWRnZXQgKmZyYW1lLCAqc2NhbGVzX2hib3g7CisKKyAgICBiYW5kID0gZ3N0X2NoaWxkX3Byb3h5X2dldF9jaGlsZF9ieV9pbmRleCAoR1NUX0NISUxEX1BST1hZIChlcXVhbGl6ZXIpLCBpKTsKKyAgICBnX2Fzc2VydCAoYmFuZCAhPSBOVUxMKTsKKyAgICBnX29iamVjdF9nZXQgKGJhbmQsICJmcmVxIiwgJmZyZXEsIE5VTEwpOworICAgIGdfb2JqZWN0X2dldCAoYmFuZCwgImJhbmR3aWR0aCIsICZidywgTlVMTCk7CisgICAgZ19vYmplY3RfZ2V0IChiYW5kLCAiZ2FpbiIsICZnYWluLCBOVUxMKTsKKworICAgIGxhYmVsID0gZ19zdHJkdXBfcHJpbnRmICgiJWQgSHoiLCAoaW50KSAoZnJlcSArIDAuNSkpOworICAgIGZyYW1lID0gZ3RrX2ZyYW1lX25ldyAobGFiZWwpOworICAgIGdfZnJlZSAobGFiZWwpOworCisgICAgc2NhbGVzX2hib3ggPSBndGtfYm94X25ldyAoR1RLX09SSUVOVEFUSU9OX0hPUklaT05UQUwsIDYpOworCisgICAgLyogQ3JlYXRlIGdhaW4gc2NhbGUgKi8KKyAgICBzY2FsZSA9IGd0a19zY2FsZV9uZXdfd2l0aF9yYW5nZSAoR1RLX09SSUVOVEFUSU9OX1ZFUlRJQ0FMLAorICAgICAgICAtMjQuMCwgMTIuMCwgMC41KTsKKyAgICBndGtfc2NhbGVfc2V0X2RyYXdfdmFsdWUgKEdUS19TQ0FMRSAoc2NhbGUpLCBUUlVFKTsKKyAgICBndGtfc2NhbGVfc2V0X3ZhbHVlX3BvcyAoR1RLX1NDQUxFIChzY2FsZSksIEdUS19QT1NfVE9QKTsKKyAgICBndGtfcmFuZ2Vfc2V0X3ZhbHVlIChHVEtfUkFOR0UgKHNjYWxlKSwgZ2Fpbik7CisgICAgZ3RrX3dpZGdldF9zZXRfc2l6ZV9yZXF1ZXN0IChzY2FsZSwgMzUsIDE1MCk7CisgICAgZ19zaWduYWxfY29ubmVjdCAoR19PQkpFQ1QgKHNjYWxlKSwgInZhbHVlLWNoYW5nZWQiLAorICAgICAgICBHX0NBTExCQUNLIChvbl9nYWluX2NoYW5nZWQpLCAoZ3BvaW50ZXIpIGJhbmQpOworICAgIGd0a19ib3hfcGFja19zdGFydCAoR1RLX0JPWCAoc2NhbGVzX2hib3gpLCBzY2FsZSwgRkFMU0UsIEZBTFNFLCAwKTsKKworICAgIC8qIENyZWF0ZSBiYW5kd2lkdGggc2NhbGUgKi8KKyAgICBzY2FsZSA9IGd0a19zY2FsZV9uZXdfd2l0aF9yYW5nZSAoR1RLX09SSUVOVEFUSU9OX1ZFUlRJQ0FMLAorICAgICAgICAwLjAsIDIwMDAwLjAsIDUuMCk7CisgICAgZ3RrX3NjYWxlX3NldF9kcmF3X3ZhbHVlIChHVEtfU0NBTEUgKHNjYWxlKSwgVFJVRSk7CisgICAgZ3RrX3NjYWxlX3NldF92YWx1ZV9wb3MgKEdUS19TQ0FMRSAoc2NhbGUpLCBHVEtfUE9TX1RPUCk7CisgICAgZ3RrX3JhbmdlX3NldF92YWx1ZSAoR1RLX1JBTkdFIChzY2FsZSksIGJ3KTsKKyAgICBndGtfd2lkZ2V0X3NldF9zaXplX3JlcXVlc3QgKHNjYWxlLCA0NSwgMTUwKTsKKyAgICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoc2NhbGUpLCAidmFsdWUtY2hhbmdlZCIsCisgICAgICAgIEdfQ0FMTEJBQ0sgKG9uX2JhbmR3aWR0aF9jaGFuZ2VkKSwgKGdwb2ludGVyKSBiYW5kKTsKKyAgICBndGtfYm94X3BhY2tfc3RhcnQgKEdUS19CT1ggKHNjYWxlc19oYm94KSwgc2NhbGUsIFRSVUUsIFRSVUUsIDApOworCisgICAgLyogQ3JlYXRlIGZyZXF1ZW5jeSBzY2FsZSAqLworICAgIHNjYWxlID0gZ3RrX3NjYWxlX25ld193aXRoX3JhbmdlIChHVEtfT1JJRU5UQVRJT05fVkVSVElDQUwsCisgICAgICAgIDIwLjAsIDIwMDAwLjAsIDUuMCk7CisgICAgZ3RrX3NjYWxlX3NldF9kcmF3X3ZhbHVlIChHVEtfU0NBTEUgKHNjYWxlKSwgVFJVRSk7CisgICAgZ3RrX3NjYWxlX3NldF92YWx1ZV9wb3MgKEdUS19TQ0FMRSAoc2NhbGUpLCBHVEtfUE9TX1RPUCk7CisgICAgZ3RrX3JhbmdlX3NldF92YWx1ZSAoR1RLX1JBTkdFIChzY2FsZSksIGZyZXEpOworICAgIGd0a193aWRnZXRfc2V0X3NpemVfcmVxdWVzdCAoc2NhbGUsIDQ1LCAxNTApOworICAgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChzY2FsZSksICJ2YWx1ZS1jaGFuZ2VkIiwKKyAgICAgICAgR19DQUxMQkFDSyAob25fZnJlcV9jaGFuZ2VkKSwgKGdwb2ludGVyKSBiYW5kKTsKKyAgICBndGtfYm94X3BhY2tfc3RhcnQgKEdUS19CT1ggKHNjYWxlc19oYm94KSwgc2NhbGUsIFRSVUUsIFRSVUUsIDApOworCisgICAgZ3RrX2NvbnRhaW5lcl9hZGQgKEdUS19DT05UQUlORVIgKGZyYW1lKSwgc2NhbGVzX2hib3gpOworCisgICAgZ3RrX2JveF9wYWNrX3N0YXJ0IChHVEtfQk9YIChoYm94KSwgZnJhbWUsIFRSVUUsIFRSVUUsIDApOworICB9CisKKyAgZ3RrX2JveF9wYWNrX3N0YXJ0IChHVEtfQk9YICh2Ym94KSwgaGJveCwgVFJVRSwgVFJVRSwgMCk7CisKKyAgZ3RrX2NvbnRhaW5lcl9hZGQgKEdUS19DT05UQUlORVIgKGFwcHdpbmRvdyksIHZib3gpOworICBndGtfd2lkZ2V0X3Nob3dfYWxsIChhcHB3aW5kb3cpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGd0a19tYWluICgpOworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGJpbik7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvbWVzb24uYnVpbGQgYi90ZXN0cy9leGFtcGxlcy9lcXVhbGl6ZXIvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU2ODIzMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL2VxdWFsaXplci9tZXNvbi5idWlsZApAQCAtMCwwICsxLDYgQEAKK2V4ZWN1dGFibGUoJ2VxdWFsaXplci1kZW1vJywgJ2RlbW8uYycsCisgIGRlcGVuZGVuY2llczogW2dzdF9kZXAsIGd0a19kZXBdLAorICBjX2FyZ3M6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllczogW2NvbmZpZ2luY10sCisgIGluc3RhbGw6IGZhbHNlKQorCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9qYWNrL01ha2VmaWxlLmFtIGIvdGVzdHMvZXhhbXBsZXMvamFjay9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDYxY2JkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvamFjay9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEyIEBACitpZiBIQVZFX0dUSworR1RLX0VYQU1QTEVTPWphY2tfY2xpZW50CitlbHNlCitHVEtfRVhBTVBMRVM9CitlbmRpZgorCitub2luc3RfUFJPR1JBTVMgPSAkKEdUS19FWEFNUExFUykKKworamFja19jbGllbnRfU09VUkNFUyA9IGphY2tfY2xpZW50LmMKK2phY2tfY2xpZW50X0NGTEFHUyA9ICQoR1NUX0NGTEFHUykgJChHVEtfQ0ZMQUdTKSAkKEpBQ0tfQ0ZMQUdTKQoramFja19jbGllbnRfTERGTEFHUyA9ICQoR1NUX0xJQlMpICQoR1RLX0xJQlMpICQoSkFDS19MSUJTKQorCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9qYWNrL2phY2tfY2xpZW50LmMgYi90ZXN0cy9leGFtcGxlcy9qYWNrL2phY2tfY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY5Y2VkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL2phY2svamFja19jbGllbnQuYwpAQCAtMCwwICsxLDc5IEBACisvKiBUaGlzIGFwcCBkZW1vbnN0cmF0ZXMgdGhlIGNyZWF0aW9uIGFuZCB1c2Ugb2YgYSBqYWNrIGNsaWVudCBpbiBjb25qdW5jdGlvbgorICogd2l0aCB0aGUgamFjayBwbHVnaW5zLiBUaGlzIHdheSwgYW4gYXBwbGljYXRpb24gY2FuIGNvbnRyb2wgdGhlIGphY2sgY2xpZW50CisgKiBkaXJlY3RseS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDxqYWNrL2phY2suaD4KKworc3RhdGljIGdib29sZWFuCitxdWl0X2NiIChncG9pbnRlciBkYXRhKQoreworICBndGtfbWFpbl9xdWl0ICgpOworICByZXR1cm4gRkFMU0U7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBqYWNrX2NsaWVudF90ICpzcmNfY2xpZW50LCAqc2lua19jbGllbnQ7CisgIGphY2tfc3RhdHVzX3Qgc3RhdHVzOworICBHc3RFbGVtZW50ICpwaXBlbGluZSwgKnNyYywgKnNpbms7CisgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKworICBnc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICAvKiBjcmVhdGUgamFjayBjbGllbnRzICovCisgIHNyY19jbGllbnQgPSBqYWNrX2NsaWVudF9vcGVuICgic3JjX2NsaWVudCIsIEphY2tOb1N0YXJ0U2VydmVyLCAmc3RhdHVzKTsKKyAgaWYgKHNyY19jbGllbnQgPT0gTlVMTCkgeworICAgIGlmIChzdGF0dXMgJiBKYWNrU2VydmVyRmFpbGVkKQorICAgICAgZ19wcmludCAoIkpBQ0sgc2VydmVyIG5vdCBydW5uaW5nXG4iKTsKKyAgICBlbHNlCisgICAgICBnX3ByaW50ICgiamFja19jbGllbnRfb3BlbigpIGZhaWxlZCwgc3RhdHVzID0gMHglMi4weFxuIiwgc3RhdHVzKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHNpbmtfY2xpZW50ID0gamFja19jbGllbnRfb3BlbiAoInNpbmtfY2xpZW50IiwgSmFja05vU3RhcnRTZXJ2ZXIsICZzdGF0dXMpOworICBpZiAoc2lua19jbGllbnQgPT0gTlVMTCkgeworICAgIGlmIChzdGF0dXMgJiBKYWNrU2VydmVyRmFpbGVkKQorICAgICAgZ19wcmludCAoIkpBQ0sgc2VydmVyIG5vdCBydW5uaW5nXG4iKTsKKyAgICBlbHNlCisgICAgICBnX3ByaW50ICgiamFja19jbGllbnRfb3BlbigpIGZhaWxlZCwgc3RhdHVzID0gMHglMi4weFxuIiwgc3RhdHVzKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8qIGNyZWF0ZSBnc3QgZWxlbWVudHMgKi8KKyAgcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3ICgibXlfcGlwZWxpbmUiKTsKKworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJqYWNrYXVkaW9zcmMiLCBOVUxMKTsKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImphY2thdWRpb3NpbmsiLCBOVUxMKTsKKworICBnX29iamVjdF9zZXQgKHNyYywgImNsaWVudCIsIHNyY19jbGllbnQsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNpbmssICJjbGllbnQiLCBzaW5rX2NsaWVudCwgTlVMTCk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBzcmMsIHNpbmssIE5VTEwpOworCisgIC8qIGxpbmsgZXZlcnl0aGluZyB0b2dldGhlciAqLworICBpZiAoIWdzdF9lbGVtZW50X2xpbmsgKHNyYywgc2luaykpIHsKKyAgICBnX3ByaW50ICgiRmFpbGVkIHRvIGxpbmsgZWxlbWVudHMhXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8qIHJ1biAqLworICByZXQgPSBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKSB7CisgICAgZ19wcmludCAoIkZhaWxlZCB0byBzdGFydCB1cCBwaXBlbGluZSFcbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgLyogcXVpdCBhZnRlciA1IHNlY29uZHMgKi8KKyAgZ190aW1lb3V0X2FkZF9zZWNvbmRzICg1LCAoR1NvdXJjZUZ1bmMpIHF1aXRfY2IsIE5VTEwpOworICBndGtfbWFpbiAoKTsKKworICAvKiBjbGVhbiB1cCAqLworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL2phY2svbWVzb24uYnVpbGQgYi90ZXN0cy9leGFtcGxlcy9qYWNrL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YWM4YTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9qYWNrL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsNyBAQAoraWYgbGliamFja19kZXAuZm91bmQoKQorICBleGVjdXRhYmxlKCdqYWNrX2NsaWVudCcsICdqYWNrX2NsaWVudC5jJywKKyAgICBkZXBlbmRlbmNpZXM6IFtnc3RfZGVwLCBndGtfZGVwLCBsaWJqYWNrX2RlcF0sCisgICAgY19hcmdzOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgICAgaW5jbHVkZV9kaXJlY3RvcmllczogW2NvbmZpZ2luY10sCisgICAgaW5zdGFsbDogZmFsc2UpCitlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvbGV2ZWwvLmdpdGlnbm9yZSBiL3Rlc3RzL2V4YW1wbGVzL2xldmVsLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlZmZmNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL2xldmVsLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorbGV2ZWwtZXhhbXBsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvbGV2ZWwvTWFrZWZpbGUuYW0gYi90ZXN0cy9leGFtcGxlcy9sZXZlbC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2NhNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvbGV2ZWwvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0IEBACitub2luc3RfUFJPR1JBTVMgPSBsZXZlbC1leGFtcGxlCitsZXZlbF9leGFtcGxlX0NGTEFHUyA9ICQoR1NUX0NGTEFHUykKK2xldmVsX2V4YW1wbGVfTERBREQgPSAkKEdTVF9MSUJTKSAkKExJQk0pCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL2xldmVsL2xldmVsLWV4YW1wbGUuYyBiL3Rlc3RzL2V4YW1wbGVzL2xldmVsL2xldmVsLWV4YW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTUzMTc2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvbGV2ZWwvbGV2ZWwtZXhhbXBsZS5jCkBAIC0wLDAgKzEsMTQwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMCwyMDAxLDIwMDIsMjAwMywyMDA1CisgKiAgICAgICAgICAgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzIGF0IGFwZXN0YWFydCBkb3Qgb3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNkZWZpbmUgR0xJQl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK3N0YXRpYyBnYm9vbGVhbgorbWVzc2FnZV9oYW5kbGVyIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBncG9pbnRlciBkYXRhKQoreworCisgIGlmIChtZXNzYWdlLT50eXBlID09IEdTVF9NRVNTQUdFX0VMRU1FTlQpIHsKKyAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfbWVzc2FnZV9nZXRfc3RydWN0dXJlIChtZXNzYWdlKTsKKyAgICBjb25zdCBnY2hhciAqbmFtZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHMpOworCisgICAgaWYgKHN0cmNtcCAobmFtZSwgImxldmVsIikgPT0gMCkgeworICAgICAgZ2ludCBjaGFubmVsczsKKyAgICAgIEdzdENsb2NrVGltZSBlbmR0aW1lOworICAgICAgZ2RvdWJsZSBybXNfZEIsIHBlYWtfZEIsIGRlY2F5X2RCOworICAgICAgZ2RvdWJsZSBybXM7CisgICAgICBjb25zdCBHVmFsdWUgKmFycmF5X3ZhbDsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWU7CisgICAgICBHVmFsdWVBcnJheSAqcm1zX2FyciwgKnBlYWtfYXJyLCAqZGVjYXlfYXJyOworICAgICAgZ2ludCBpOworCisgICAgICBpZiAoIWdzdF9zdHJ1Y3R1cmVfZ2V0X2Nsb2NrX3RpbWUgKHMsICJlbmR0aW1lIiwgJmVuZHRpbWUpKQorICAgICAgICBnX3dhcm5pbmcgKCJDb3VsZCBub3QgcGFyc2UgZW5kdGltZSIpOworCisgICAgICAvKiB0aGUgdmFsdWVzIGFyZSBwYWNrZWQgaW50byBHVmFsdWVBcnJheXMgd2l0aCB0aGUgdmFsdWUgcGVyIGNoYW5uZWwgKi8KKyAgICAgIGFycmF5X3ZhbCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAicm1zIik7CisgICAgICBybXNfYXJyID0gKEdWYWx1ZUFycmF5ICopIGdfdmFsdWVfZ2V0X2JveGVkIChhcnJheV92YWwpOworCisgICAgICBhcnJheV92YWwgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgInBlYWsiKTsKKyAgICAgIHBlYWtfYXJyID0gKEdWYWx1ZUFycmF5ICopIGdfdmFsdWVfZ2V0X2JveGVkIChhcnJheV92YWwpOworCisgICAgICBhcnJheV92YWwgPSBnc3Rfc3RydWN0dXJlX2dldF92YWx1ZSAocywgImRlY2F5Iik7CisgICAgICBkZWNheV9hcnIgPSAoR1ZhbHVlQXJyYXkgKikgZ192YWx1ZV9nZXRfYm94ZWQgKGFycmF5X3ZhbCk7CisKKyAgICAgIC8qIHdlIGNhbiBnZXQgdGhlIG51bWJlciBvZiBjaGFubmVscyBhcyB0aGUgbGVuZ3RoIG9mIGFueSBvZiB0aGUgdmFsdWUKKyAgICAgICAqIGFycmF5cyAqLworICAgICAgY2hhbm5lbHMgPSBybXNfYXJyLT5uX3ZhbHVlczsKKyAgICAgIGdfcHJpbnQgKCJlbmR0aW1lOiAlIiBHU1RfVElNRV9GT1JNQVQgIiwgY2hhbm5lbHM6ICVkXG4iLAorICAgICAgICAgIEdTVF9USU1FX0FSR1MgKGVuZHRpbWUpLCBjaGFubmVscyk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7ICsraSkgeworCisgICAgICAgIGdfcHJpbnQgKCJjaGFubmVsICVkXG4iLCBpKTsKKyAgICAgICAgdmFsdWUgPSBnX3ZhbHVlX2FycmF5X2dldF9udGggKHJtc19hcnIsIGkpOworICAgICAgICBybXNfZEIgPSBnX3ZhbHVlX2dldF9kb3VibGUgKHZhbHVlKTsKKworICAgICAgICB2YWx1ZSA9IGdfdmFsdWVfYXJyYXlfZ2V0X250aCAocGVha19hcnIsIGkpOworICAgICAgICBwZWFrX2RCID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisKKyAgICAgICAgdmFsdWUgPSBnX3ZhbHVlX2FycmF5X2dldF9udGggKGRlY2F5X2FyciwgaSk7CisgICAgICAgIGRlY2F5X2RCID0gZ192YWx1ZV9nZXRfZG91YmxlICh2YWx1ZSk7CisgICAgICAgIGdfcHJpbnQgKCIgICAgUk1TOiAlZiBkQiwgcGVhazogJWYgZEIsIGRlY2F5OiAlZiBkQlxuIiwKKyAgICAgICAgICAgIHJtc19kQiwgcGVha19kQiwgZGVjYXlfZEIpOworCisgICAgICAgIC8qIGNvbnZlcnRpbmcgZnJvbSBkQiB0byBub3JtYWwgZ2l2ZXMgdXMgYSB2YWx1ZSBiZXR3ZWVuIDAuMCBhbmQgMS4wICovCisgICAgICAgIHJtcyA9IHBvdyAoMTAsIHJtc19kQiAvIDIwKTsKKyAgICAgICAgZ19wcmludCAoIiAgICBub3JtYWxpemVkIHJtcyB2YWx1ZTogJWZcbiIsIHJtcyk7CisgICAgICB9CisgICAgfQorICB9CisgIC8qIHdlIGhhbmRsZWQgdGhlIG1lc3NhZ2Ugd2Ugd2FudCwgYW5kIGlnbm9yZWQgdGhlIG9uZXMgd2UgZGlkbid0IHdhbnQuCisgICAqIHNvIHRoZSBjb3JlIGNhbiB1bnJlZiB0aGUgbWVzc2FnZSBmb3IgdXMgKi8KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgR3N0RWxlbWVudCAqYXVkaW90ZXN0c3JjLCAqYXVkaW9jb252ZXJ0LCAqbGV2ZWwsICpmYWtlc2luazsKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdEJ1cyAqYnVzOworICBndWludCB3YXRjaF9pZDsKKyAgR01haW5Mb29wICpsb29wOworCisgIGdzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoImF1ZGlvL3gtcmF3LGNoYW5uZWxzPTIiKTsKKworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKE5VTEwpOworICBnX2Fzc2VydCAocGlwZWxpbmUpOworICBhdWRpb3Rlc3RzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb3Rlc3RzcmMiLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGF1ZGlvdGVzdHNyYyk7CisgIGF1ZGlvY29udmVydCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvY29udmVydCIsIE5VTEwpOworICBnX2Fzc2VydCAoYXVkaW9jb252ZXJ0KTsKKyAgbGV2ZWwgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJsZXZlbCIsIE5VTEwpOworICBnX2Fzc2VydCAobGV2ZWwpOworICBmYWtlc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImZha2VzaW5rIiwgTlVMTCk7CisgIGdfYXNzZXJ0IChmYWtlc2luayk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBhdWRpb3Rlc3RzcmMsIGF1ZGlvY29udmVydCwgbGV2ZWwsCisgICAgICBmYWtlc2luaywgTlVMTCk7CisgIGlmICghZ3N0X2VsZW1lbnRfbGluayAoYXVkaW90ZXN0c3JjLCBhdWRpb2NvbnZlcnQpKQorICAgIGdfZXJyb3IgKCJGYWlsZWQgdG8gbGluayBhdWRpb3Rlc3RzcmMgYW5kIGF1ZGlvY29udmVydCIpOworICBpZiAoIWdzdF9lbGVtZW50X2xpbmtfZmlsdGVyZWQgKGF1ZGlvY29udmVydCwgbGV2ZWwsIGNhcHMpKQorICAgIGdfZXJyb3IgKCJGYWlsZWQgdG8gbGluayBhdWRpb2NvbnZlcnQgYW5kIGxldmVsIik7CisgIGlmICghZ3N0X2VsZW1lbnRfbGluayAobGV2ZWwsIGZha2VzaW5rKSkKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGxpbmsgbGV2ZWwgYW5kIGZha2VzaW5rIik7CisKKyAgLyogbWFrZSBzdXJlIHdlJ2xsIGdldCBtZXNzYWdlcyAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChsZXZlbCksICJwb3N0LW1lc3NhZ2VzIiwgVFJVRSwgTlVMTCk7CisgIC8qIHJ1biBzeW5jZWQgYW5kIG5vdCBhcyBmYXN0IGFzIHdlIGNhbiAqLworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChmYWtlc2luayksICJzeW5jIiwgVFJVRSwgTlVMTCk7CisKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAocGlwZWxpbmUpOworICB3YXRjaF9pZCA9IGdzdF9idXNfYWRkX3dhdGNoIChidXMsIG1lc3NhZ2VfaGFuZGxlciwgTlVMTCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIC8qIHdlIG5lZWQgdG8gcnVuIGEgR0xpYiBtYWluIGxvb3AgdG8gZ2V0IHRoZSBtZXNzYWdlcyAqLworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZ19zb3VyY2VfcmVtb3ZlICh3YXRjaF9pZCk7CisgIGdfbWFpbl9sb29wX3VucmVmIChsb29wKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9sZXZlbC9tZXNvbi5idWlsZCBiL3Rlc3RzL2V4YW1wbGVzL2xldmVsL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZTMyNDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9sZXZlbC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDUgQEAKK2V4ZWN1dGFibGUoJ2xldmVsLWV4YW1wbGUnLCAnbGV2ZWwtZXhhbXBsZS5jJywKKyAgZGVwZW5kZW5jaWVzOiBbZ3N0X2RlcCwgbGlibV0sCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBpbnN0YWxsOiBmYWxzZSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL21lc29uLmJ1aWxkIGIvdGVzdHMvZXhhbXBsZXMvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY3MDEzNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTMgQEAKK3N1YmRpcignYXVkaW9meCcpCitzdWJkaXIoJ2NhaXJvJykKK3N1YmRpcignbGV2ZWwnKQorc3ViZGlyKCdydHAnKQorc3ViZGlyKCdzaGFwZXdpcGUnKQorc3ViZGlyKCd2NGwyJykKKworaWYgZ3RrX2RlcC5mb3VuZCgpCisgIHN1YmRpcignZXF1YWxpemVyJykKKyAgc3ViZGlyKCdqYWNrJykKKyAgc3ViZGlyKCdzcGVjdHJ1bScpCitlbmRpZgorCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvLmdpdGlnbm9yZSBiL3Rlc3RzL2V4YW1wbGVzL3J0cC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjM2M2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDYgQEAKK2NsaWVudC1QQ01BCitzZXJ2ZXItYWxzYXNyYy1QQ01BCitjbGllbnQtcnRwYXV4CitzZXJ2ZXItcnRwYXV4CitjbGllbnQtcnRwYnVuZGxlCitzZXJ2ZXItcnRwYnVuZGxlCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvTWFrZWZpbGUuYW0gYi90ZXN0cy9leGFtcGxlcy9ydHAvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3ZjdjMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ0IEBACitub2luc3RfUFJPR1JBTVMgPSBzZXJ2ZXItYWxzYXNyYy1QQ01BIGNsaWVudC1QQ01BIFwKKwljbGllbnQtcnRwYXV4IHNlcnZlci1ydHBhdXggY2xpZW50LXJ0cGJ1bmRsZSBzZXJ2ZXItcnRwYnVuZGxlCisKKyMgRklYTUUgMC4xMTogaWdub3JlIEdWYWx1ZUFycmF5IHdhcm5pbmdzIGZvciBub3cgdW50aWwgdGhpcyBpcyBzb3J0ZWQKK0VSUk9SX0NGTEFHUz0KKworc2VydmVyX3J0cGF1eF9TT1VSQ0VTID0gc2VydmVyLXJ0cGF1eC5jCitzZXJ2ZXJfcnRwYXV4X0NGTEFHUyA9ICQoR1NUX0NGTEFHUykgJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykKK3NlcnZlcl9ydHBhdXhfTERBREQgPSAkKEdTVF9MSUJTKQorCitjbGllbnRfcnRwYXV4X1NPVVJDRVMgPSBjbGllbnQtcnRwYXV4LmMKK2NsaWVudF9ydHBhdXhfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKQorY2xpZW50X3J0cGF1eF9MREFERCA9ICQoR1NUX0xJQlMpCisKK3NlcnZlcl9ydHBidW5kbGVfU09VUkNFUyA9IHNlcnZlci1ydHBidW5kbGUuYworc2VydmVyX3J0cGJ1bmRsZV9DRkxBR1MgPSAkKEdTVF9DRkxBR1MpICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpCitzZXJ2ZXJfcnRwYnVuZGxlX0xEQUREID0gJChHU1RfTElCUykKKworY2xpZW50X3J0cGJ1bmRsZV9TT1VSQ0VTID0gY2xpZW50LXJ0cGJ1bmRsZS5jCitjbGllbnRfcnRwYnVuZGxlX0NGTEFHUyA9ICQoR1NUX0NGTEFHUykgJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykKK2NsaWVudF9ydHBidW5kbGVfTERBREQgPSAkKEdTVF9MSUJTKQorCitzZXJ2ZXJfYWxzYXNyY19QQ01BX1NPVVJDRVMgPSBzZXJ2ZXItYWxzYXNyYy1QQ01BLmMKK3NlcnZlcl9hbHNhc3JjX1BDTUFfQ0ZMQUdTID0gJChHU1RfQ0ZMQUdTKQorc2VydmVyX2Fsc2FzcmNfUENNQV9MREFERCA9ICQoR1NUX0xJQlMpICQoTElCTSkKKworY2xpZW50X1BDTUFfU09VUkNFUyA9IGNsaWVudC1QQ01BLmMKK2NsaWVudF9QQ01BX0NGTEFHUyA9ICQoR1NUX0NGTEFHUykKK2NsaWVudF9QQ01BX0xEQUREID0gJChHU1RfTElCUykgJChMSUJNKQorCitub2luc3RfU0NSSVBUUz1jbGllbnQtSDI2M3AtQU1SLnNoIFwKKyAgICAgICAgICAgICAgIGNsaWVudC1IMjYzcC1QQ01BLnNoIFwKKyAgICAgICAgICAgICAgIGNsaWVudC1IMjY0LVBDTUEuc2ggXAorICAgICAgICAgICAgICAgY2xpZW50LVZQOC1PUFVTLnNoIFwKKyAgICAgICAgICAgICAgIGNsaWVudC1QQ01BLnNoIFwKKyAgICAgICAgICAgICAgIHNlcnZlci1hbHNhc3JjLVBDTUEuc2ggXAorICAgICAgICAgICAgICAgc2VydmVyLXY0bDItSDI2M3AtYWxzYXNyYy1BTVIuc2ggXAorICAgICAgICAgICAgICAgc2VydmVyLXY0bDItSDI2NC1hbHNhc3JjLVBDTUEuc2ggXAorICAgICAgICAgICAgICAgc2VydmVyLVZUUy1IMjYzcC1BVFMtUENNQS5zaCBcCisgICAgICAgICAgICAgICBzZXJ2ZXItVlRTLVZQOC1BVFMtT1BVUy5zaAorCitFWFRSQV9ESVNUPSAkKG5vaW5zdF9TQ1JJUFRTKSBcCisJICAgIGNsaWVudC1IMjYzcC1QQ01BLnNkcCBcCisgICAgICAgICAgICBjbGllbnQtSDI2NC1QQ01BLnNkcApkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC1BTVIuc2ggYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLUFNUi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYmE1MTU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC1BTVIuc2gKQEAgLTAsMCArMSwyMyBAQAorIyEvYmluL3NoCisjCisjIEEgc2ltcGxlIFJUUCByZWNlaXZlciAKKyMKKworVklERU9fQ0FQUz0iYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZyl2aWRlbyxjbG9jay1yYXRlPShpbnQpOTAwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjMtMTk5OCIKK0FVRElPX0NBUFM9ImFwcGxpY2F0aW9uL3gtcnRwLG1lZGlhPShzdHJpbmcpYXVkaW8sY2xvY2stcmF0ZT0oaW50KTgwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKUFNUixlbmNvZGluZy1wYXJhbXM9KHN0cmluZykxLG9jdGV0LWFsaWduPShzdHJpbmcpMSIKKworVklERU9fREVDPSJydHBoMjYzcGRlcGF5ICEgYXZkZWNfaDI2MyIKK0FVRElPX0RFQz0icnRwYW1yZGVwYXkgISBhbXJuYmRlYyIKKworVklERU9fU0lOSz0idmlkZW9jb252ZXJ0ICEgYXV0b3ZpZGVvc2luayIKK0FVRElPX1NJTks9ImF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rIgorCitnc3QtbGF1bmNoLTEuMCAtdiBydHBiaW4gbmFtZT1ydHBiaW4gbGF0ZW5jeT0xMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHVkcHNyYyBjYXBzPSRWSURFT19DQVBTIHBvcnQ9NTAwMCAhIHJ0cGJpbi5yZWN2X3J0cF9zaW5rXzAgICAgICAgICAgICAgIFwKKwkgICAgICAgICBydHBiaW4uICEgJFZJREVPX0RFQyAhICRWSURFT19TSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHVkcHNyYyBwb3J0PTUwMDEgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMCAhIHVkcHNpbmsgcG9ydD01MDA1IHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UgICAgICAgXAorCSAgIHVkcHNyYyBjYXBzPSRBVURJT19DQVBTIHBvcnQ9NTAwMiAhIHJ0cGJpbi5yZWN2X3J0cF9zaW5rXzEgICAgICAgICAgICAgIFwKKwkgICAgICAgICBydHBiaW4uICEgJEFVRElPX0RFQyAhICRBVURJT19TSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHVkcHNyYyBwb3J0PTUwMDMgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMSAhIHVkcHNpbmsgcG9ydD01MDA3IHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3AtUENNQS5zZHAgYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLVBDTUEuc2RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMjI2NGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLVBDTUEuc2RwCkBAIC0wLDAgKzEsMTIgQEAKK3Y9MAorbz0tIDExODgzNDA2NTYxODA4ODMgMSBJTiBJUDQgMTI3LjAuMC4xCitzPVNlc3Npb24gc3RyZWFtZWQgYnkgR1N0cmVhbWVyCitpPXNlcnZlci5zaAordD0wIDAKK2E9dG9vbDpHU3RyZWFtZXIKK2E9dHlwZTpicm9hZGNhc3QKK209dmlkZW8gNTAwMCBSVFAvQVZQIDk2CitjPUlOIElQNCAxMjcuMC4wLjEKK2E9cnRwbWFwOjk2IEgyNjMtMTk5OC85MDAwMAorbT1hdWRpbyA1MDAyIFJUUC9BVlAgOAorYz1JTiBJUDQgMTI3LjAuMC4xCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLVBDTUEuc2ggYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjNwLVBDTUEuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTc5NDE4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3AtUENNQS5zaApAQCAtMCwwICsxLDI4IEBACisjIS9iaW4vc2gKKyMKKyMgQSBzaW1wbGUgUlRQIHJlY2VpdmVyIAorIworCitWSURFT19DQVBTPSJhcHBsaWNhdGlvbi94LXJ0cCxtZWRpYT0oc3RyaW5nKXZpZGVvLGNsb2NrLXJhdGU9KGludCk5MDAwMCxlbmNvZGluZy1uYW1lPShzdHJpbmcpSDI2My0xOTk4IgorQVVESU9fQ0FQUz0iYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZylhdWRpbyxjbG9jay1yYXRlPShpbnQpODAwMCxlbmNvZGluZy1uYW1lPShzdHJpbmcpUENNQSIKKworI0RFU1Q9MTkyLjE2OC4xLjEyNgorREVTVD1sb2NhbGhvc3QKKworVklERU9fREVDPSJydHBoMjYzcGRlcGF5ICEgYXZkZWNfaDI2MyIKK0FVRElPX0RFQz0icnRwcGNtYWRlcGF5ICEgYWxhd2RlYyIKKworVklERU9fU0lOSz0idmlkZW9jb252ZXJ0ICEgYXV0b3ZpZGVvc2luayIKK0FVRElPX1NJTks9ImF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISBhdXRvYXVkaW9zaW5rIgorCitMQVRFTkNZPTEwMAorCitnc3QtbGF1bmNoLTEuMCAtdiBydHBiaW4gbmFtZT1ydHBiaW4gbGF0ZW5jeT0kTEFURU5DWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgdWRwc3JjIGNhcHM9JFZJREVPX0NBUFMgcG9ydD01MDAwICEgcnRwYmluLnJlY3ZfcnRwX3NpbmtfMCAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICAgcnRwYmluLiAhICRWSURFT19ERUMgISAkVklERU9fU0lOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHVkcHNyYyBwb3J0PTUwMDEgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18wICEgdWRwc2luayBob3N0PSRERVNUIHBvcnQ9NTAwNSBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlIFwKKwkgICB1ZHBzcmMgY2Fwcz0kQVVESU9fQ0FQUyBwb3J0PTUwMDIgISBydHBiaW4ucmVjdl9ydHBfc2lua18xICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgICBydHBiaW4uICEgJEFVRElPX0RFQyAhICRBVURJT19TSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgdWRwc3JjIHBvcnQ9NTAwMyAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHJ0cGJpbi5zZW5kX3J0Y3Bfc3JjXzEgISB1ZHBzaW5rIGhvc3Q9JERFU1QgcG9ydD01MDA3IHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3Auc2RwIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC5zZHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkNDc5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3Auc2RwCkBAIC0wLDAgKzEsMTAgQEAKK3Y9MAorbz0tIDExODgzNDA2NTYxODA4ODMgMSBJTiBJUDQgMTI3LjAuMC4xCitzPVNlc3Npb24gc3RyZWFtZWQgYnkgR1N0cmVhbWVyCitpPXNlcnZlci5zaAordD0wIDAKK2E9dG9vbDpHU3RyZWFtZXIKK2E9dHlwZTpicm9hZGNhc3QKK209dmlkZW8gNTAwMCBSVFAvQVZQIDk2CitjPUlOIElQNCAxMjcuMC4wLjEKK2E9cnRwbWFwOjk2IEgyNjMtMTk5OC85MDAwMApkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjYzcC5zaCBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3Auc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjAwMjg0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2M3Auc2gKQEAgLTAsMCArMSwyMSBAQAorIyEvYmluL3NoCisjCisjIEEgc2ltcGxlIFJUUCByZWNlaXZlciAKKyMKKworVklERU9fQ0FQUz0iYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZyl2aWRlbyxjbG9jay1yYXRlPShpbnQpOTAwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjMtMTk5OCIKKworI0RFU1Q9MTkyLjE2OC4xLjEyNgorREVTVD1sb2NhbGhvc3QKKworVklERU9fREVDPSJydHBoMjYzcGRlcGF5ICEgYXZkZWNfaDI2MyIKKworVklERU9fU0lOSz0idmlkZW9jb252ZXJ0ICEgYXV0b3ZpZGVvc2luayIKKworTEFURU5DWT0xMDAKKworZ3N0LWxhdW5jaC0xLjAgLXYgcnRwYmluIG5hbWU9cnRwYmluIGxhdGVuY3k9JExBVEVOQ1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHVkcHNyYyBjYXBzPSRWSURFT19DQVBTIHBvcnQ9NTAwMCAhIHJ0cGJpbi5yZWN2X3J0cF9zaW5rXzAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAgIHJ0cGJpbi4gISAkVklERU9fREVDICEgJFZJREVPX1NJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB1ZHBzcmMgcG9ydD01MDAxICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMCAhIHVkcHNpbmsgaG9zdD0kREVTVCBwb3J0PTUwMDUgc3luYz1mYWxzZSBhc3luYz1mYWxzZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LVBDTUEuc2RwIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LVBDTUEuc2RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YWE3NWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQtUENNQS5zZHAKQEAgLTAsMCArMSwxMiBAQAordj0wCitvPS0gMTE4ODM0MDY1NjE4MDg4MyAxIElOIElQNCAxMjcuMC4wLjEKK3M9U2Vzc2lvbiBzdHJlYW1lZCBieSBHU3RyZWFtZXIKK2k9c2VydmVyLnNoCit0PTAgMAorYT10b29sOkdTdHJlYW1lcgorYT10eXBlOmJyb2FkY2FzdAorbT12aWRlbyA1MDAwIFJUUC9BVlAgOTYKK2M9SU4gSVA0IDEyNy4wLjAuMQorYT1ydHBtYXA6OTYgSDI2NC85MDAwMAorbT1hdWRpbyA1MDAyIFJUUC9BVlAgOAorYz1JTiBJUDQgMTI3LjAuMC4xCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQtUENNQS5zaCBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC1QQ01BLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgyMGQ0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQtUENNQS5zaApAQCAtMCwwICsxLDY0IEBACisjIS9iaW4vc2gKKyMKKyMgQSBzaW1wbGUgUlRQIHJlY2VpdmVyCisjCisjICByZWNlaXZlcyBIMjY0IGVuY29kZWQgUlRQIHZpZGVvIG9uIHBvcnQgNTAwMCwgUlRDUCBpcyByZWNlaXZlZCBvbiAgcG9ydCA1MDAxLgorIyAgdGhlIHJlY2VpdmVyIFJUQ1AgcmVwb3J0cyBhcmUgc2VudCB0byBwb3J0IDUwMDUKKyMgIHJlY2VpdmVzIGFsYXcgZW5jb2RlZCBSVFAgYXVkaW8gb24gcG9ydCA1MDAyLCBSVENQIGlzIHJlY2VpdmVkIG9uICBwb3J0IDUwMDMuCisjICB0aGUgcmVjZWl2ZXIgUlRDUCByZXBvcnRzIGFyZSBzZW50IHRvIHBvcnQgNTAwNworIworIyAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICAuLS0tLS0tLS0tLS4gICAgIC4tLS0tLS0tLS0uICAgLi0tLS0tLS0uICAgLi0tLS0tLS0tLS0tLgorIyAgUlRQICAgICAgICB8dWRwc3JjIHwgICAgICB8IHJ0cGJpbiAgIHwgICAgIHxoMjY0ZGVwYXl8ICAgfGgyNjRkZWN8ICAgfHh2aW1hZ2VzaW5rfAorIyAgcG9ydD01MDAwICB8ICAgICAgc3JjLT5yZWN2X3J0cCByZWN2X3J0cC0+c2luayAgICAgc3JjLT5zaW5rICAgc3JjLT5zaW5rICAgICAgICAgfAorIyAgICAgICAgICAgICAnLS0tLS0tLScgICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tLS0nICAgJy0tLS0tLS0nICAgJy0tLS0tLS0tLS0tJworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAuLS0tLS0tLS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICB8dWRwc2lua3wgIFJUQ1AKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBzZW5kX3J0Y3AtPnNpbmsgICAgIHwgcG9ydD01MDA1CisjICAgICAgICAgICAgIC4tLS0tLS0tLiAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0nIHN5bmM9ZmFsc2UKKyMgIFJUQ1AgICAgICAgfHVkcHNyYyB8ICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgYXN5bmM9ZmFsc2UKKyMgIHBvcnQ9NTAwMSAgfCAgICAgc3JjLT5yZWN2X3J0Y3AgICAgICB8CisjICAgICAgICAgICAgICctLS0tLS0tJyAgICAgIHwgICAgICAgICAgfAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKKyMgICAgICAgICAgICAgLi0tLS0tLS0uICAgICAgfCAgICAgICAgICB8ICAgICAuLS0tLS0tLS0tLiAgIC4tLS0tLS0tLiAgIC4tLS0tLS0tLS0tLS0tLgorIyAgUlRQICAgICAgICB8dWRwc3JjIHwgICAgICB8IHJ0cGJpbiAgIHwgICAgIHxwY21hZGVwYXl8ICAgfGFsYXdkZWN8ICAgfGF1dG9hdWRpb3Npbmt8CisjICBwb3J0PTUwMDIgIHwgICAgICBzcmMtPnJlY3ZfcnRwIHJlY3ZfcnRwLT5zaW5rICAgICBzcmMtPnNpbmsgICBzcmMtPnNpbmsgICAgICAgICAgIHwKKyMgICAgICAgICAgICAgJy0tLS0tLS0nICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLS0tJyAgICctLS0tLS0tJyAgICctLS0tLS0tLS0tLS0tJworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAuLS0tLS0tLS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICB8dWRwc2lua3wgIFJUQ1AKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBzZW5kX3J0Y3AtPnNpbmsgICAgIHwgcG9ydD01MDA3CisjICAgICAgICAgICAgIC4tLS0tLS0tLiAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0nIHN5bmM9ZmFsc2UKKyMgIFJUQ1AgICAgICAgfHVkcHNyYyB8ICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgYXN5bmM9ZmFsc2UKKyMgIHBvcnQ9NTAwMyAgfCAgICAgc3JjLT5yZWN2X3J0Y3AgICAgICB8CisjICAgICAgICAgICAgICctLS0tLS0tJyAgICAgICctLS0tLS0tLS0tJworCisjIHRoZSBkZXN0aW5hdGlvbiBtYWNoaW5lIHRvIHNlbmQgUlRDUCB0by4gVGhpcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgc2VuZGVyIGFuZAorIyBpcyB1c2VkIHRvIHNlbmQgYmFjayB0aGUgUlRDUCByZXBvcnRzIG9mIHRoaXMgcmVjZWl2ZXIuIElmIHRoZSBkYXRhIGlzIHNlbnQKKyMgZnJvbSBhbm90aGVyIG1hY2hpbmUsIGNoYW5nZSB0aGlzIGFkZHJlc3MuCitERVNUPTEyNy4wLjAuMQorCisjIHRoaXMgYWRqdXN0cyB0aGUgbGF0ZW5jeSBpbiB0aGUgcmVjZWl2ZXIKK0xBVEVOQ1k9MjAwCisKKyMgdGhlIGNhcHMgb2YgdGhlIHNlbmRlciBSVFAgc3RyZWFtLiBUaGlzIGlzIHVzdWFsbHkgbmVnb3RpYXRlZCBvdXQgb2YgYmFuZCB3aXRoCisjIFNEUCBvciBSVFNQLiBub3JtYWxseSB0aGVzZSBjYXBzIHdpbGwgYWxzbyBpbmNsdWRlIFNQUyBhbmQgUFBTIGJ1dCB3ZSBkb24ndAorIyBoYXZlIGEgbWVjaGFuaXNtIHRvIGdldCB0aGlzIGZyb20gdGhlIHNlbmRlciB3aXRoIGEgLWxhdW5jaCBsaW5lLgorVklERU9fQ0FQUz0iYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZyl2aWRlbyxjbG9jay1yYXRlPShpbnQpOTAwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjQiCitBVURJT19DQVBTPSJhcHBsaWNhdGlvbi94LXJ0cCxtZWRpYT0oc3RyaW5nKWF1ZGlvLGNsb2NrLXJhdGU9KGludCk4MDAwLGVuY29kaW5nLW5hbWU9KHN0cmluZylQQ01BIgorCitWSURFT19ERUM9InJ0cGgyNjRkZXBheSAhIGF2ZGVjX2gyNjQiCitBVURJT19ERUM9InJ0cHBjbWFkZXBheSAhIGFsYXdkZWMiCisKK1ZJREVPX1NJTks9InZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsiCitBVURJT19TSU5LPSJhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgYXV0b2F1ZGlvc2luayIKKworZ3N0LWxhdW5jaC0xLjAgLXYgcnRwYmluIG5hbWU9cnRwYmluIGxhdGVuY3k9JExBVEVOQ1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB1ZHBzcmMgY2Fwcz0kVklERU9fQ0FQUyBwb3J0PTUwMDAgISBydHBiaW4ucmVjdl9ydHBfc2lua18wICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcnRwYmluLiAhICRWSURFT19ERUMgISAkVklERU9fU0lOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgdWRwc3JjIHBvcnQ9NTAwMSAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMCAhIHVkcHNpbmsgcG9ydD01MDA1IGhvc3Q9JERFU1Qgc3luYz1mYWxzZSBhc3luYz1mYWxzZSBcCisgICAgIHVkcHNyYyBjYXBzPSRBVURJT19DQVBTIHBvcnQ9NTAwMiAhIHJ0cGJpbi5yZWN2X3J0cF9zaW5rXzEgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBydHBiaW4uICEgJEFVRElPX0RFQyAhICRBVURJT19TSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB1ZHBzcmMgcG9ydD01MDAzICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18xICEgdWRwc2luayBwb3J0PTUwMDcgaG9zdD0kREVTVCBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQtcnR4LnNoIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LXJ0eC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZTUzZjYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LXJ0eC5zaApAQCAtMCwwICsxLDQyIEBACisjIS9iaW4vc2gKKyMKKyMgQSBzaW1wbGUgUlRQIHJlY2VpdmVyIHdpdGggcmV0cmFuc21pc3Npb24KKyMKKyMgIHJlY2VpdmVzIEgyNjQgZW5jb2RlZCBSVFAgdmlkZW8gb24gcG9ydCA1MDAwLCBSVENQIGlzIHJlY2VpdmVkIG9uICBwb3J0IDUwMDEuCisjICB0aGUgcmVjZWl2ZXIgUlRDUCByZXBvcnRzIGFyZSBzZW50IHRvIHBvcnQgNTAwNQorIworIyAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICAuLS0tLS0tLS0tLS4gICAgIC4tLS0tLS0tLS0uICAgLi0tLS0tLS0uICAgLi0tLS0tLS0tLS0tLgorIyAgUlRQICAgICAgICB8dWRwc3JjIHwgICAgICB8IHJ0cGJpbiAgIHwgICAgIHxoMjY0ZGVwYXl8ICAgfGgyNjRkZWN8ICAgfHh2aW1hZ2VzaW5rfAorIyAgcG9ydD01MDAwICB8ICAgICAgc3JjLT5yZWN2X3J0cCByZWN2X3J0cC0+c2luayAgICAgc3JjLT5zaW5rICAgc3JjLT5zaW5rICAgICAgICAgfAorIyAgICAgICAgICAgICAnLS0tLS0tLScgICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tLS0nICAgJy0tLS0tLS0nICAgJy0tLS0tLS0tLS0tJworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAuLS0tLS0tLS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICB8dWRwc2lua3wgIFJUQ1AKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBzZW5kX3J0Y3AtPnNpbmsgICAgIHwgcG9ydD01MDA1CisjICAgICAgICAgICAgIC4tLS0tLS0tLiAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0nIHN5bmM9ZmFsc2UKKyMgIFJUQ1AgICAgICAgfHVkcHNyYyB8ICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgYXN5bmM9ZmFsc2UKKyMgIHBvcnQ9NTAwMSAgfCAgICAgc3JjLT5yZWN2X3J0Y3AgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAKKyMgICAgICAgICAgICAgJy0tLS0tLS0nICAgICAgJy0tLS0tLS0tLS0nICAgICAgICAgICAgICAKKworCisjIHRoZSBjYXBzIG9mIHRoZSBzZW5kZXIgUlRQIHN0cmVhbS4gVGhpcyBpcyB1c3VhbGx5IG5lZ290aWF0ZWQgb3V0IG9mIGJhbmQgd2l0aAorIyBTRFAgb3IgUlRTUC4gbm9ybWFsbHkgdGhlc2UgY2FwcyB3aWxsIGFsc28gaW5jbHVkZSBTUFMgYW5kIFBQUyBidXQgd2UgZG9uJ3QKKyMgaGF2ZSBhIG1lY2hhbmlzbSB0byBnZXQgdGhpcyBmcm9tIHRoZSBzZW5kZXIgd2l0aCBhIC1sYXVuY2ggbGluZS4KK1ZJREVPX0NBUFM9ImFwcGxpY2F0aW9uL3gtcnRwLG1lZGlhPShzdHJpbmcpdmlkZW8sY2xvY2stcmF0ZT0oaW50KTkwMDAwLGVuY29kaW5nLW5hbWU9KHN0cmluZylIMjY0IgorCitWSURFT19ERUM9InJ0cGgyNjRkZXBheSAhIGF2ZGVjX2gyNjQiCisKK1ZJREVPX1NJTks9InZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsiCisKKyMgdGhlIGRlc3RpbmF0aW9uIG1hY2hpbmUgdG8gc2VuZCBSVENQIHRvLiBUaGlzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzZW5kZXIgYW5kCisjIGlzIHVzZWQgdG8gc2VuZCBiYWNrIHRoZSBSVENQIHJlcG9ydHMgb2YgdGhpcyByZWNlaXZlci4gSWYgdGhlIGRhdGEgaXMgc2VudAorIyBmcm9tIGFub3RoZXIgbWFjaGluZSwgY2hhbmdlIHRoaXMgYWRkcmVzcy4KK0RFU1Q9MTI3LjAuMC4xCisKK0xBVEVOQ1k9MjAwCisKK2dzdC1sYXVuY2gtMS4wIC12IHJ0cGJpbiBuYW1lPXJ0cGJpbiBydHAtcHJvZmlsZT1hdnBmIGxhdGVuY3k9JExBVEVOQ1kgZG8tcmV0cmFuc21pc3Npb249MSBcCisgICAgdWRwc3JjIGNhcHM9JFZJREVPX0NBUFMgcG9ydD01MDAwICEgcnRwYmluLnJlY3ZfcnRwX3NpbmtfMCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBydHBiaW4uICEgJFZJREVPX0RFQyAhICRWSURFT19TSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWRwc3JjIHBvcnQ9NTAwMSAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18wICEgdWRwc2luayBwb3J0PTUwMDUgaG9zdD0kREVTVCBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQuc2RwIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LnNkcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTU5M2I5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1IMjY0LnNkcApAQCAtMCwwICsxLDEwIEBACit2PTAKK289LSAxMTg4MzQwNjU2MTgwODgzIDEgSU4gSVA0IDEyNy4wLjAuMQorcz1TZXNzaW9uIHN0cmVhbWVkIGJ5IEdTdHJlYW1lcgoraT1zZXJ2ZXIuc2gKK3Q9MCAwCithPXRvb2w6R1N0cmVhbWVyCithPXR5cGU6YnJvYWRjYXN0CittPXZpZGVvIDUwMDAgUlRQL0FWUCA5NgorYz1JTiBJUDQgMTI3LjAuMC4xCithPXJ0cG1hcDo5NiBIMjY0LzkwMDAwCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQuc2ggYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LUgyNjQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDkwMWI0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtSDI2NC5zaApAQCAtMCwwICsxLDQyIEBACisjIS9iaW4vc2gKKyMKKyMgQSBzaW1wbGUgUlRQIHJlY2VpdmVyIAorIworIyAgcmVjZWl2ZXMgSDI2NCBlbmNvZGVkIFJUUCB2aWRlbyBvbiBwb3J0IDUwMDAsIFJUQ1AgaXMgcmVjZWl2ZWQgb24gIHBvcnQgNTAwMS4KKyMgIHRoZSByZWNlaXZlciBSVENQIHJlcG9ydHMgYXJlIHNlbnQgdG8gcG9ydCA1MDA1CisjCisjICAgICAgICAgICAgIC4tLS0tLS0tLiAgICAgIC4tLS0tLS0tLS0tLiAgICAgLi0tLS0tLS0tLS4gICAuLS0tLS0tLS4gICAuLS0tLS0tLS0tLS0uCisjICBSVFAgICAgICAgIHx1ZHBzcmMgfCAgICAgIHwgcnRwYmluICAgfCAgICAgfGgyNjRkZXBheXwgICB8aDI2NGRlY3wgICB8eHZpbWFnZXNpbmt8CisjICBwb3J0PTUwMDAgIHwgICAgICBzcmMtPnJlY3ZfcnRwIHJlY3ZfcnRwLT5zaW5rICAgICBzcmMtPnNpbmsgICBzcmMtPnNpbmsgICAgICAgICB8CisjICAgICAgICAgICAgICctLS0tLS0tJyAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0tLScgICAnLS0tLS0tLScgICAnLS0tLS0tLS0tLS0nCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgIAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIC4tLS0tLS0tLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIHx1ZHBzaW5rfCAgUlRDUAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHNlbmRfcnRjcC0+c2luayAgICAgfCBwb3J0PTUwMDUKKyMgICAgICAgICAgICAgLi0tLS0tLS0uICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLScgc3luYz1mYWxzZQorIyAgUlRDUCAgICAgICB8dWRwc3JjIHwgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICBhc3luYz1mYWxzZQorIyAgcG9ydD01MDAxICB8ICAgICBzcmMtPnJlY3ZfcnRjcCAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIAorIyAgICAgICAgICAgICAnLS0tLS0tLScgICAgICAnLS0tLS0tLS0tLScgICAgICAgICAgICAgIAorCisKKyMgdGhlIGNhcHMgb2YgdGhlIHNlbmRlciBSVFAgc3RyZWFtLiBUaGlzIGlzIHVzdWFsbHkgbmVnb3RpYXRlZCBvdXQgb2YgYmFuZCB3aXRoCisjIFNEUCBvciBSVFNQLiBub3JtYWxseSB0aGVzZSBjYXBzIHdpbGwgYWxzbyBpbmNsdWRlIFNQUyBhbmQgUFBTIGJ1dCB3ZSBkb24ndAorIyBoYXZlIGEgbWVjaGFuaXNtIHRvIGdldCB0aGlzIGZyb20gdGhlIHNlbmRlciB3aXRoIGEgLWxhdW5jaCBsaW5lLgorVklERU9fQ0FQUz0iYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZyl2aWRlbyxjbG9jay1yYXRlPShpbnQpOTAwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKUgyNjQiCisKK1ZJREVPX0RFQz0icnRwaDI2NGRlcGF5ICEgYXZkZWNfaDI2NCIKKworVklERU9fU0lOSz0idmlkZW9jb252ZXJ0ICEgYXV0b3ZpZGVvc2luayIKKworIyB0aGUgZGVzdGluYXRpb24gbWFjaGluZSB0byBzZW5kIFJUQ1AgdG8uIFRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlbmRlciBhbmQKKyMgaXMgdXNlZCB0byBzZW5kIGJhY2sgdGhlIFJUQ1AgcmVwb3J0cyBvZiB0aGlzIHJlY2VpdmVyLiBJZiB0aGUgZGF0YSBpcyBzZW50CisjIGZyb20gYW5vdGhlciBtYWNoaW5lLCBjaGFuZ2UgdGhpcyBhZGRyZXNzLgorREVTVD0xMjcuMC4wLjEKKworTEFURU5DWT0yMDAKKworZ3N0LWxhdW5jaC0xLjAgLXYgcnRwYmluIG5hbWU9cnRwYmluIGxhdGVuY3k9JExBVEVOQ1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1ZHBzcmMgY2Fwcz0kVklERU9fQ0FQUyBwb3J0PTUwMDAgISBydHBiaW4ucmVjdl9ydHBfc2lua18wICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJ0cGJpbi4gISAkVklERU9fREVDICEgJFZJREVPX1NJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1ZHBzcmMgcG9ydD01MDAxICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJ0cGJpbi5zZW5kX3J0Y3Bfc3JjXzAgISB1ZHBzaW5rIHBvcnQ9NTAwNSBob3N0PSRERVNUIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtUENNQS5jIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhYTdmMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtUENNQS5jCkBAIC0wLDAgKzEsMjQzIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOSBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKy8qCisgKiBBIHNpbXBsZSBSVFAgcmVjZWl2ZXIgCisgKgorICogIHJlY2VpdmVzIGFsYXcgZW5jb2RlZCBSVFAgYXVkaW8gb24gcG9ydCA1MDAyLCBSVENQIGlzIHJlY2VpdmVkIG9uICBwb3J0IDUwMDMuCisgKiAgdGhlIHJlY2VpdmVyIFJUQ1AgcmVwb3J0cyBhcmUgc2VudCB0byBwb3J0IDUwMDcKKyAqCisgKiAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICAuLS0tLS0tLS0tLS4gICAgIC4tLS0tLS0tLS0uICAgLi0tLS0tLS0uICAgLi0tLS0tLS0tLgorICogIFJUUCAgICAgICAgfHVkcHNyYyB8ICAgICAgfCBydHBiaW4gICB8ICAgICB8cGNtYWRlcGF5fCAgIHxhbGF3ZGVjfCAgIHxhbHNhc2lua3wKKyAqICBwb3J0PTUwMDIgIHwgICAgICBzcmMtPnJlY3ZfcnRwIHJlY3ZfcnRwLT5zaW5rICAgICBzcmMtPnNpbmsgICBzcmMtPnNpbmsgICAgICB8CisgKiAgICAgICAgICAgICAnLS0tLS0tLScgICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tLS0nICAgJy0tLS0tLS0nICAgJy0tLS0tLS0tJworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIC4tLS0tLS0tLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICB8dWRwc2lua3wgIFJUQ1AKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgc2VuZF9ydGNwLT5zaW5rICAgICB8IHBvcnQ9NTAwNworICogICAgICAgICAgICAgLi0tLS0tLS0uICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLScgc3luYz1mYWxzZQorICogIFJUQ1AgICAgICAgfHVkcHNyYyB8ICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgYXN5bmM9ZmFsc2UKKyAqICBwb3J0PTUwMDMgIHwgICAgIHNyYy0+cmVjdl9ydGNwICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAnLS0tLS0tLScgICAgICAnLS0tLS0tLS0tLScgICAgICAgICAgICAgIAorICovCisKKy8qIHRoZSBjYXBzIG9mIHRoZSBzZW5kZXIgUlRQIHN0cmVhbS4gVGhpcyBpcyB1c3VhbGx5IG5lZ290aWF0ZWQgb3V0IG9mIGJhbmQgd2l0aAorICogU0RQIG9yIFJUU1AuICovCisjZGVmaW5lIEFVRElPX0NBUFMgImFwcGxpY2F0aW9uL3gtcnRwLG1lZGlhPShzdHJpbmcpYXVkaW8sY2xvY2stcmF0ZT0oaW50KTgwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKVBDTUEiCisKKyNkZWZpbmUgQVVESU9fREVQQVkgInJ0cHBjbWFkZXBheSIKKyNkZWZpbmUgQVVESU9fREVDICAgImFsYXdkZWMiCisjZGVmaW5lIEFVRElPX1NJTksgICJhdXRvYXVkaW9zaW5rIgorCisvKiB0aGUgZGVzdGluYXRpb24gbWFjaGluZSB0byBzZW5kIFJUQ1AgdG8uIFRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlbmRlciBhbmQKKyAqIGlzIHVzZWQgdG8gc2VuZCBiYWNrIHRoZSBSVENQIHJlcG9ydHMgb2YgdGhpcyByZWNlaXZlci4gSWYgdGhlIGRhdGEgaXMgc2VudAorICogZnJvbSBhbm90aGVyIG1hY2hpbmUsIGNoYW5nZSB0aGlzIGFkZHJlc3MuICovCisjZGVmaW5lIERFU1RfSE9TVCAiMTI3LjAuMC4xIgorCisvKiBwcmludCB0aGUgc3RhdHMgb2YgYSBzb3VyY2UgKi8KK3N0YXRpYyB2b2lkCitwcmludF9zb3VyY2Vfc3RhdHMgKEdPYmplY3QgKiBzb3VyY2UpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RhdHM7CisgIGdjaGFyICpzdHI7CisKKyAgZ19yZXR1cm5faWZfZmFpbCAoc291cmNlICE9IE5VTEwpOworCisgIC8qIGdldCB0aGUgc291cmNlIHN0YXRzICovCisgIGdfb2JqZWN0X2dldCAoc291cmNlLCAic3RhdHMiLCAmc3RhdHMsIE5VTEwpOworCisgIC8qIHNpbXBseSBkdW1wIHRoZSBzdGF0cyBzdHJ1Y3R1cmUgKi8KKyAgc3RyID0gZ3N0X3N0cnVjdHVyZV90b19zdHJpbmcgKHN0YXRzKTsKKyAgZ19wcmludCAoInNvdXJjZSBzdGF0czogJXNcbiIsIHN0cik7CisKKyAgZ3N0X3N0cnVjdHVyZV9mcmVlIChzdGF0cyk7CisgIGdfZnJlZSAoc3RyKTsKK30KKworLyogd2lsbCBiZSBjYWxsZWQgd2hlbiBydHBiaW4gc2lnbmFscyBvbi1zc3JjLWFjdGl2ZS4gSXQgbWVhbnMgdGhhdCBhbiBSVENQCisgKiBwYWNrZXQgd2FzIHJlY2VpdmVkIGZyb20gYW5vdGhlciBzb3VyY2UuICovCitzdGF0aWMgdm9pZAorb25fc3NyY19hY3RpdmVfY2IgKEdzdEVsZW1lbnQgKiBydHBiaW4sIGd1aW50IHNlc3NpZCwgZ3VpbnQgc3NyYywKKyAgICBHc3RFbGVtZW50ICogZGVwYXkpCit7CisgIEdPYmplY3QgKnNlc3Npb24sICpvc3JjOworCisgIGdfcHJpbnQgKCJnb3QgUlRDUCBmcm9tIHNlc3Npb24gJXUsIFNTUkMgJXVcbiIsIHNlc3NpZCwgc3NyYyk7CisKKyAgLyogZ2V0IHRoZSByaWdodCBzZXNzaW9uICovCisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAocnRwYmluLCAiZ2V0LWludGVybmFsLXNlc3Npb24iLCBzZXNzaWQsICZzZXNzaW9uKTsKKworI2lmIDAKKyAgLyogRklYTUU6IFRoaXMgaXMgYnJva2VuIGluIHJ0cGJpbiAqLworICAvKiBnZXQgdGhlIGludGVybmFsIHNvdXJjZSAodGhlIFNTUkMgYWxsb2NhdGVkIHRvIHVzLCB0aGUgcmVjZWl2ZXIgKi8KKyAgZ19vYmplY3RfZ2V0IChzZXNzaW9uLCAiaW50ZXJuYWwtc291cmNlIiwgJmlzcmMsIE5VTEwpOworICBwcmludF9zb3VyY2Vfc3RhdHMgKGlzcmMpOworICBnX29iamVjdF91bnJlZiAoaXNyYyk7CisjZW5kaWYKKworICAvKiBnZXQgdGhlIHJlbW90ZSBzb3VyY2UgdGhhdCBzZW50IHVzIFJUQ1AgKi8KKyAgZ19zaWduYWxfZW1pdF9ieV9uYW1lIChzZXNzaW9uLCAiZ2V0LXNvdXJjZS1ieS1zc3JjIiwgc3NyYywgJm9zcmMpOworICBwcmludF9zb3VyY2Vfc3RhdHMgKG9zcmMpOworICBnX29iamVjdF91bnJlZiAob3NyYyk7CisgIGdfb2JqZWN0X3VucmVmIChzZXNzaW9uKTsKK30KKworLyogd2lsbCBiZSBjYWxsZWQgd2hlbiBydHBiaW4gaGFzIHZhbGlkYXRlZCBhIHBheWxvYWQgdGhhdCB3ZSBjYW4gZGVwYXlsb2FkICovCitzdGF0aWMgdm9pZAorcGFkX2FkZGVkX2NiIChHc3RFbGVtZW50ICogcnRwYmluLCBHc3RQYWQgKiBuZXdfcGFkLCBHc3RFbGVtZW50ICogZGVwYXkpCit7CisgIEdzdFBhZCAqc2lua3BhZDsKKyAgR3N0UGFkTGlua1JldHVybiBscmVzOworCisgIGdfcHJpbnQgKCJuZXcgcGF5bG9hZCBvbiBwYWQ6ICVzXG4iLCBHU1RfUEFEX05BTUUgKG5ld19wYWQpKTsKKworICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGRlcGF5LCAic2luayIpOworICBnX2Fzc2VydCAoc2lua3BhZCk7CisKKyAgbHJlcyA9IGdzdF9wYWRfbGluayAobmV3X3BhZCwgc2lua3BhZCk7CisgIGdfYXNzZXJ0IChscmVzID09IEdTVF9QQURfTElOS19PSyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworfQorCisvKiBidWlsZCBhIHBpcGVsaW5lIGVxdWl2YWxlbnQgdG86CisgKgorICogZ3N0LWxhdW5jaC0xLjAgLXYgcnRwYmluIG5hbWU9cnRwYmluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICogICAgICB1ZHBzcmMgY2Fwcz0kQVVESU9fQ0FQUyBwb3J0PTUwMDIgISBydHBiaW4ucmVjdl9ydHBfc2lua18wICAgICAgICAgICAgICBcCisgKiAgICAgICAgcnRwYmluLiAhIHJ0cHBjbWFkZXBheSAhIGFsYXdkZWMgISBhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgYXV0b2F1ZGlvc2luayBcCisgKiAgICAgIHVkcHNyYyBwb3J0PTUwMDMgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18wICEgdWRwc2luayBwb3J0PTUwMDcgaG9zdD0kREVTVCBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlCisgKi8KK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgR3N0RWxlbWVudCAqcnRwYmluLCAqcnRwc3JjLCAqcnRjcHNyYywgKnJ0Y3BzaW5rOworICBHc3RFbGVtZW50ICphdWRpb2RlcGF5LCAqYXVkaW9kZWMsICphdWRpb3JlcywgKmF1ZGlvY29udiwgKmF1ZGlvc2luazsKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdNYWluTG9vcCAqbG9vcDsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgZ2Jvb2xlYW4gcmVzOworICBHc3RQYWRMaW5rUmV0dXJuIGxyZXM7CisgIEdzdFBhZCAqc3JjcGFkLCAqc2lua3BhZDsKKworICAvKiBhbHdheXMgaW5pdCBmaXJzdCAqLworICBnc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICAvKiB0aGUgcGlwZWxpbmUgdG8gaG9sZCBldmVyeXRoaW5nICovCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoTlVMTCk7CisgIGdfYXNzZXJ0IChwaXBlbGluZSk7CisKKyAgLyogdGhlIHVkcCBzcmMgYW5kIHNvdXJjZSB3ZSB3aWxsIHVzZSBmb3IgUlRQIGFuZCBSVENQICovCisgIHJ0cHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNyYyIsICJydHBzcmMiKTsKKyAgZ19hc3NlcnQgKHJ0cHNyYyk7CisgIGdfb2JqZWN0X3NldCAocnRwc3JjLCAicG9ydCIsIDUwMDIsIE5VTEwpOworICAvKiB3ZSBuZWVkIHRvIHNldCBjYXBzIG9uIHRoZSB1ZHBzcmMgZm9yIHRoZSBSVFAgZGF0YSAqLworICBjYXBzID0gZ3N0X2NhcHNfZnJvbV9zdHJpbmcgKEFVRElPX0NBUFMpOworICBnX29iamVjdF9zZXQgKHJ0cHNyYywgImNhcHMiLCBjYXBzLCBOVUxMKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIHJ0Y3BzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzcmMiLCAicnRjcHNyYyIpOworICBnX2Fzc2VydCAocnRjcHNyYyk7CisgIGdfb2JqZWN0X3NldCAocnRjcHNyYywgInBvcnQiLCA1MDAzLCBOVUxMKTsKKworICBydGNwc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNpbmsiLCAicnRjcHNpbmsiKTsKKyAgZ19hc3NlcnQgKHJ0Y3BzaW5rKTsKKyAgZ19vYmplY3Rfc2V0IChydGNwc2luaywgInBvcnQiLCA1MDA3LCAiaG9zdCIsIERFU1RfSE9TVCwgTlVMTCk7CisgIC8qIG5vIG5lZWQgZm9yIHN5bmNocm9uaXNhdGlvbiBvciBwcmVyb2xsIG9uIHRoZSBSVENQIHNpbmsgKi8KKyAgZ19vYmplY3Rfc2V0IChydGNwc2luaywgImFzeW5jIiwgRkFMU0UsICJzeW5jIiwgRkFMU0UsIE5VTEwpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgcnRwc3JjLCBydGNwc3JjLCBydGNwc2luaywgTlVMTCk7CisKKyAgLyogdGhlIGRlcGF5bG9hZGluZyBhbmQgZGVjb2RpbmcgKi8KKyAgYXVkaW9kZXBheSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoQVVESU9fREVQQVksICJhdWRpb2RlcGF5Iik7CisgIGdfYXNzZXJ0IChhdWRpb2RlcGF5KTsKKyAgYXVkaW9kZWMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKEFVRElPX0RFQywgImF1ZGlvZGVjIik7CisgIGdfYXNzZXJ0IChhdWRpb2RlYyk7CisgIC8qIHRoZSBhdWRpbyBwbGF5YmFjayBhbmQgZm9ybWF0IGNvbnZlcnNpb24gKi8KKyAgYXVkaW9jb252ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW9jb252ZXJ0IiwgImF1ZGlvY29udiIpOworICBnX2Fzc2VydCAoYXVkaW9jb252KTsKKyAgYXVkaW9yZXMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb3Jlc2FtcGxlIiwgImF1ZGlvcmVzIik7CisgIGdfYXNzZXJ0IChhdWRpb3Jlcyk7CisgIGF1ZGlvc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoQVVESU9fU0lOSywgImF1ZGlvc2luayIpOworICBnX2Fzc2VydCAoYXVkaW9zaW5rKTsKKworICAvKiBhZGQgZGVwYXlsb2FkaW5nIGFuZCBwbGF5YmFjayB0byB0aGUgcGlwZWxpbmUgYW5kIGxpbmsgKi8KKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBhdWRpb2RlcGF5LCBhdWRpb2RlYywgYXVkaW9jb252LAorICAgICAgYXVkaW9yZXMsIGF1ZGlvc2luaywgTlVMTCk7CisKKyAgcmVzID0gZ3N0X2VsZW1lbnRfbGlua19tYW55IChhdWRpb2RlcGF5LCBhdWRpb2RlYywgYXVkaW9jb252LCBhdWRpb3JlcywKKyAgICAgIGF1ZGlvc2luaywgTlVMTCk7CisgIGdfYXNzZXJ0IChyZXMgPT0gVFJVRSk7CisKKyAgLyogdGhlIHJ0cGJpbiBlbGVtZW50ICovCisgIHJ0cGJpbiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cGJpbiIsICJydHBiaW4iKTsKKyAgZ19hc3NlcnQgKHJ0cGJpbik7CisKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgcnRwYmluKTsKKworICAvKiBub3cgbGluayBhbGwgdG8gdGhlIHJ0cGJpbiwgc3RhcnQgYnkgZ2V0dGluZyBhbiBSVFAgc2lua3BhZCBmb3Igc2Vzc2lvbiAwICovCisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydHBzcmMsICJzcmMiKTsKKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwYmluLCAicmVjdl9ydHBfc2lua18wIik7CisgIGxyZXMgPSBnc3RfcGFkX2xpbmsgKHNyY3BhZCwgc2lua3BhZCk7CisgIGdfYXNzZXJ0IChscmVzID09IEdTVF9QQURfTElOS19PSyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisKKyAgLyogZ2V0IGFuIFJUQ1Agc2lua3BhZCBpbiBzZXNzaW9uIDAgKi8KKyAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHJ0Y3BzcmMsICJzcmMiKTsKKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9yZXF1ZXN0X3BhZCAocnRwYmluLCAicmVjdl9ydGNwX3NpbmtfMCIpOworICBscmVzID0gZ3N0X3BhZF9saW5rIChzcmNwYWQsIHNpbmtwYWQpOworICBnX2Fzc2VydCAobHJlcyA9PSBHU1RfUEFEX0xJTktfT0spOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKworICAvKiBnZXQgYW4gUlRDUCBzcmNwYWQgZm9yIHNlbmRpbmcgUlRDUCBiYWNrIHRvIHRoZSBzZW5kZXIgKi8KKyAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBiaW4sICJzZW5kX3J0Y3Bfc3JjXzAiKTsKKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydGNwc2luaywgInNpbmsiKTsKKyAgbHJlcyA9IGdzdF9wYWRfbGluayAoc3JjcGFkLCBzaW5rcGFkKTsKKyAgZ19hc3NlcnQgKGxyZXMgPT0gR1NUX1BBRF9MSU5LX09LKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisKKyAgLyogdGhlIFJUUCBwYWQgdGhhdCB3ZSBoYXZlIHRvIGNvbm5lY3QgdG8gdGhlIGRlcGF5bG9hZGVyIHdpbGwgYmUgY3JlYXRlZAorICAgKiBkeW5hbWljYWxseSBzbyB3ZSBjb25uZWN0IHRvIHRoZSBwYWQtYWRkZWQgc2lnbmFsLCBwYXNzIHRoZSBkZXBheWxvYWRlciBhcworICAgKiB1c2VyX2RhdGEgc28gdGhhdCB3ZSBjYW4gbGluayB0byBpdC4gKi8KKyAgZ19zaWduYWxfY29ubmVjdCAocnRwYmluLCAicGFkLWFkZGVkIiwgR19DQUxMQkFDSyAocGFkX2FkZGVkX2NiKSwgYXVkaW9kZXBheSk7CisKKyAgLyogZ2l2ZSBzb21lIHN0YXRzIHdoZW4gd2UgcmVjZWl2ZSBSVENQICovCisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cGJpbiwgIm9uLXNzcmMtYWN0aXZlIiwgR19DQUxMQkFDSyAob25fc3NyY19hY3RpdmVfY2IpLAorICAgICAgYXVkaW9kZXBheSk7CisKKyAgLyogc2V0IHRoZSBwaXBlbGluZSB0byBwbGF5aW5nICovCisgIGdfcHJpbnQgKCJzdGFydGluZyByZWNlaXZlciBwaXBlbGluZVxuIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICAvKiB3ZSBuZWVkIHRvIHJ1biBhIEdMaWIgbWFpbiBsb29wIHRvIGdldCB0aGUgbWVzc2FnZXMgKi8KKyAgbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgRkFMU0UpOworICBnX21haW5fbG9vcF9ydW4gKGxvb3ApOworCisgIGdfcHJpbnQgKCJzdG9wcGluZyByZWNlaXZlciBwaXBlbGluZVxuIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEucHkgYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWQyZmQ0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtUENNQS5weQpAQCAtMCwwICsxLDEyMCBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgZ2kKK2ltcG9ydCBzeXMKK2dpLnJlcXVpcmVfdmVyc2lvbignR3N0JywgJzEuMCcpCitmcm9tIGdpLnJlcG9zaXRvcnkgaW1wb3J0IEdPYmplY3QsIEdzdAorCisjCisjIEEgc2ltcGxlIFJUUCByZWNlaXZlcgorIworIyAgcmVjZWl2ZXMgYWxhdyBlbmNvZGVkIFJUUCBhdWRpbyBvbiBwb3J0IDUwMDIsIFJUQ1AgaXMgcmVjZWl2ZWQgb24gIHBvcnQgNTAwMy4KKyMgIHRoZSByZWNlaXZlciBSVENQIHJlcG9ydHMgYXJlIHNlbnQgdG8gcG9ydCA1MDA3CisjCisjICAgICAgICAgICAgIC4tLS0tLS0tLiAgICAgIC4tLS0tLS0tLS0tLiAgICAgLi0tLS0tLS0tLS4gICAuLS0tLS0tLS4gICAuLS0tLS0tLS0uCisjICBSVFAgICAgICAgIHx1ZHBzcmMgfCAgICAgIHwgcnRwYmluICAgfCAgICAgfHBjbWFkZXBheXwgICB8YWxhd2RlY3wgICB8YWxzYXNpbmt8CisjICBwb3J0PTUwMDIgIHwgICAgICBzcmMtPnJlY3ZfcnRwIHJlY3ZfcnRwLT5zaW5rICAgICBzcmMtPnNpbmsgICBzcmMtPnNpbmsgICAgICB8CisjICAgICAgICAgICAgICctLS0tLS0tJyAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0tLScgICAnLS0tLS0tLScgICAnLS0tLS0tLS0nCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIC4tLS0tLS0tLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIHx1ZHBzaW5rfCAgUlRDUAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHNlbmRfcnRjcC0+c2luayAgICAgfCBwb3J0PTUwMDcKKyMgICAgICAgICAgICAgLi0tLS0tLS0uICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLScgc3luYz1mYWxzZQorIyAgUlRDUCAgICAgICB8dWRwc3JjIHwgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICBhc3luYz1mYWxzZQorIyAgcG9ydD01MDAzICB8ICAgICBzcmMtPnJlY3ZfcnRjcCAgICAgIHwKKyMgICAgICAgICAgICAgJy0tLS0tLS0nICAgICAgJy0tLS0tLS0tLS0nCisKK0FVRElPX0NBUFMgPSAnYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZylhdWRpbyxjbG9jay1yYXRlPShpbnQpODAwMCxlbmNvZGluZy1uYW1lPShzdHJpbmcpUENNQScKK0FVRElPX0RFUEFZID0gJ3J0cHBjbWFkZXBheScKK0FVRElPX0RFQyA9ICdhbGF3ZGVjJworQVVESU9fU0lOSyA9ICdhdXRvYXVkaW9zaW5rJworCitERVNUID0gJzEyNy4wLjAuMScKKworUlRQX1JFQ1ZfUE9SVCA9IDUwMDIKK1JUQ1BfUkVDVl9QT1JUID0gNTAwMworUlRDUF9TRU5EX1BPUlQgPSA1MDA3CisKK0dPYmplY3QudGhyZWFkc19pbml0KCkKK0dzdC5pbml0KHN5cy5hcmd2KQorCisjZ3N0LWxhdW5jaCAtdiBydHBiaW4gbmFtZT1ydHBiaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjICAgICAgIHVkcHNyYyBjYXBzPSRBVURJT19DQVBTIHBvcnQ9JFJUUF9SRUNWX1BPUlQgISBydHBiaW4ucmVjdl9ydHBfc2lua18wICAgICAgICAgICAgICBcCisjICAgICAgICAgICAgIHJ0cGJpbi4gISBydHBwY21hZGVwYXkgISBhbGF3ZGVjICEgYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIGF1dG9hdWRpb3NpbmsgXAorIyAgICAgICAgICAgdWRwc3JjIHBvcnQ9JFJUQ1BfUkVDVl9QT1JUICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMCAhIHVkcHNpbmsgcG9ydD0kUlRDUF9TRU5EX1BPUlQgaG9zdD0kREVTVCBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlCisKK2RlZiBwYWRfYWRkZWRfY2IocnRwYmluLCBuZXdfcGFkLCBkZXBheSk6CisgICAgc2lua3BhZCA9IEdzdC5FbGVtZW50LmdldF9zdGF0aWNfcGFkKGRlcGF5LCAnc2luaycpCisgICAgbHJlcyA9IEdzdC5QYWQubGluayhuZXdfcGFkLCBzaW5rcGFkKQorCisjIHRoZSBwaXBlbGluZSB0byBob2xkIGV2ZXl0aGluZworcGlwZWxpbmUgPSBHc3QuUGlwZWxpbmUoJ3J0cF9jbGllbnQnKQorCisjIHRoZSB1ZHAgc3JjIGFuZCBzb3VyY2Ugd2Ugd2lsbCB1c2UgZm9yIFJUUCBhbmQgUlRDUAorcnRwc3JjID0gR3N0LkVsZW1lbnRGYWN0b3J5Lm1ha2UoJ3VkcHNyYycsICdydHBzcmMnKQorcnRwc3JjLnNldF9wcm9wZXJ0eSgncG9ydCcsIFJUUF9SRUNWX1BPUlQpCisKKyMgd2UgbmVlZCB0byBzZXQgY2FwcyBvbiB0aGUgdWRwc3JjIGZvciB0aGUgUlRQIGRhdGEKK2NhcHMgPSBHc3QuY2Fwc19mcm9tX3N0cmluZyhBVURJT19DQVBTKQorcnRwc3JjLnNldF9wcm9wZXJ0eSgnY2FwcycsIGNhcHMpCisKK3J0Y3BzcmMgPSBHc3QuRWxlbWVudEZhY3RvcnkubWFrZSgndWRwc3JjJywgJ3J0Y3BzcmMnKQorcnRjcHNyYy5zZXRfcHJvcGVydHkoJ3BvcnQnLCBSVENQX1JFQ1ZfUE9SVCkKKworcnRjcHNpbmsgPSBHc3QuRWxlbWVudEZhY3RvcnkubWFrZSgndWRwc2luaycsICdydGNwc2luaycpCitydGNwc2luay5zZXRfcHJvcGVydHkoJ3BvcnQnLCBSVENQX1NFTkRfUE9SVCkKK3J0Y3BzaW5rLnNldF9wcm9wZXJ0eSgnaG9zdCcsIERFU1QpCisKKyMgbm8gbmVlZCBmb3Igc3luY2hyb25pc2F0aW9uIG9yIHByZXJvbGwgb24gdGhlIFJUQ1Agc2luaworcnRjcHNpbmsuc2V0X3Byb3BlcnR5KCdhc3luYycsIEZhbHNlKQorcnRjcHNpbmsuc2V0X3Byb3BlcnR5KCdzeW5jJywgRmFsc2UpCisKK3BpcGVsaW5lLmFkZChydHBzcmMsIHJ0Y3BzcmMsIHJ0Y3BzaW5rKQorCisjIHRoZSBkZXBheWxvYWRpbmcgYW5kIGRlY29kaW5nCithdWRpb2RlcGF5ID0gR3N0LkVsZW1lbnRGYWN0b3J5Lm1ha2UoQVVESU9fREVQQVksICdhdWRpb2RlcGF5JykKK2F1ZGlvZGVjID0gR3N0LkVsZW1lbnRGYWN0b3J5Lm1ha2UoQVVESU9fREVDLCAnYXVkaW9kZWMnKQorCisjIHRoZSBhdWRpbyBwbGF5YmFjayBhbmQgZm9ybWF0IGNvbnZlcnNpb24KK2F1ZGlvY29udiA9IEdzdC5FbGVtZW50RmFjdG9yeS5tYWtlKCdhdWRpb2NvbnZlcnQnLCAnYXVkaW9jb252JykKK2F1ZGlvcmVzID0gR3N0LkVsZW1lbnRGYWN0b3J5Lm1ha2UoJ2F1ZGlvcmVzYW1wbGUnLCAnYXVkaW9yZXMnKQorYXVkaW9zaW5rID0gR3N0LkVsZW1lbnRGYWN0b3J5Lm1ha2UoQVVESU9fU0lOSywgJ2F1ZGlvc2luaycpCisKKyMgYWRkIGRlcGF5bG9hZGluZyBhbmQgcGxheWJhY2sgdG8gdGhlIHBpcGVsaW5lIGFuZCBsaW5rCitwaXBlbGluZS5hZGQoYXVkaW9kZXBheSwgYXVkaW9kZWMsIGF1ZGlvY29udiwgYXVkaW9yZXMsIGF1ZGlvc2luaykKKworYXVkaW9kZXBheS5saW5rKGF1ZGlvZGVjKQorYXVkaW9kZWMubGluayhhdWRpb2NvbnYpCithdWRpb2NvbnYubGluayhhdWRpb3JlcykKK2F1ZGlvcmVzLmxpbmsoYXVkaW9zaW5rKQorCisjIHRoZSBydHBiaW4gZWxlbWVudAorcnRwYmluID0gR3N0LkVsZW1lbnRGYWN0b3J5Lm1ha2UoJ3J0cGJpbicsICdydHBiaW4nKQorCitwaXBlbGluZS5hZGQocnRwYmluKQorCisjIG5vdyBsaW5rIGFsbCB0byB0aGUgcnRwYmluLCBzdGFydCBieSBnZXR0aW5nIGFuIFJUUCBzaW5rcGFkIGZvciBzZXNzaW9uIDAKK3NyY3BhZCA9IEdzdC5FbGVtZW50LmdldF9zdGF0aWNfcGFkKHJ0cHNyYywgJ3NyYycpCitzaW5rcGFkID0gR3N0LkVsZW1lbnQuZ2V0X3JlcXVlc3RfcGFkKHJ0cGJpbiwgJ3JlY3ZfcnRwX3NpbmtfMCcpCitscmVzID0gR3N0LlBhZC5saW5rKHNyY3BhZCwgc2lua3BhZCkKKworIyBnZXQgYW4gUlRDUCBzaW5rcGFkIGluIHNlc3Npb24gMAorc3JjcGFkID0gR3N0LkVsZW1lbnQuZ2V0X3N0YXRpY19wYWQocnRjcHNyYywgJ3NyYycpCitzaW5rcGFkID0gR3N0LkVsZW1lbnQuZ2V0X3JlcXVlc3RfcGFkKHJ0cGJpbiwgJ3JlY3ZfcnRjcF9zaW5rXzAnKQorbHJlcyA9IEdzdC5QYWQubGluayhzcmNwYWQsIHNpbmtwYWQpCisKKyMgZ2V0IGFuIFJUQ1Agc3JjcGFkIGZvciBzZW5kaW5nIFJUQ1AgYmFjayB0byB0aGUgc2VuZGVyCitzcmNwYWQgPSBHc3QuRWxlbWVudC5nZXRfcmVxdWVzdF9wYWQocnRwYmluLCAnc2VuZF9ydGNwX3NyY18wJykKK3NpbmtwYWQgPSBHc3QuRWxlbWVudC5nZXRfc3RhdGljX3BhZChydGNwc2luaywgJ3NpbmsnKQorbHJlcyA9IEdzdC5QYWQubGluayhzcmNwYWQsIHNpbmtwYWQpCisKK3J0cGJpbi5jb25uZWN0KCdwYWQtYWRkZWQnLCBwYWRfYWRkZWRfY2IsIGF1ZGlvZGVwYXkpCisKK0dzdC5FbGVtZW50LnNldF9zdGF0ZShwaXBlbGluZSwgR3N0LlN0YXRlLlBMQVlJTkcpCisKK21haW5sb29wID0gR09iamVjdC5NYWluTG9vcCgpCittYWlubG9vcC5ydW4oKQorCitHc3QuRWxlbWVudC5zZXRfc3RhdGUocGlwZWxpbmUsIEdzdC5TdGF0ZS5OVUxMKQorCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuc2RwIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLnNkcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWY5ZDIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLnNkcApAQCAtMCwwICsxLDkgQEAKK3Y9MAorbz0tIDExODgzNDA2NTYxODA4ODMgMSBJTiBJUDQgMTI3LjAuMC4xCitzPVNlc3Npb24gc3RyZWFtZWQgYnkgR1N0cmVhbWVyCitpPXNlcnZlci5zaAordD0wIDAKK2E9dG9vbDpHU3RyZWFtZXIKK2E9dHlwZTpicm9hZGNhc3QKK209YXVkaW8gNTAwMiBSVFAvQVZQIDgKK2M9SU4gSVA0IDEyNy4wLjAuMQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLnNoIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1QQ01BLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBlOTY5YjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVBDTUEuc2gKQEAgLTAsMCArMSwzOSBAQAorIyEvYmluL3NoCisjCisjIEEgc2ltcGxlIFJUUCByZWNlaXZlcgorIworIyAgcmVjZWl2ZXMgYWxhdyBlbmNvZGVkIFJUUCBhdWRpbyBvbiBwb3J0IDUwMDIsIFJUQ1AgaXMgcmVjZWl2ZWQgb24gIHBvcnQgNTAwMy4KKyMgIHRoZSByZWNlaXZlciBSVENQIHJlcG9ydHMgYXJlIHNlbnQgdG8gcG9ydCA1MDA3CisjCisjICAgICAgICAgICAgIC4tLS0tLS0tLiAgICAgIC4tLS0tLS0tLS0tLiAgICAgLi0tLS0tLS0tLS4gICAuLS0tLS0tLS4gICAuLS0tLS0tLS0tLS0tLS4KKyMgIFJUUCAgICAgICAgfHVkcHNyYyB8ICAgICAgfCBydHBiaW4gICB8ICAgICB8cGNtYWRlcGF5fCAgIHxhbGF3ZGVjfCAgIHxhdXRvYXVkaW9zaW5rfAorIyAgcG9ydD01MDAyICB8ICAgICAgc3JjLT5yZWN2X3J0cCByZWN2X3J0cC0+c2luayAgICAgc3JjLT5zaW5rICAgc3JjLT5zaW5rICAgICAgICAgICB8CisjICAgICAgICAgICAgICctLS0tLS0tJyAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0tLScgICAnLS0tLS0tLScgICAnLS0tLS0tLS0tLS0tLScKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgLi0tLS0tLS0uCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgfHVkcHNpbmt8ICBSVENQCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgc2VuZF9ydGNwLT5zaW5rICAgICB8IHBvcnQ9NTAwNworIyAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tJyBzeW5jPWZhbHNlCisjICBSVENQICAgICAgIHx1ZHBzcmMgfCAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgIGFzeW5jPWZhbHNlCisjICBwb3J0PTUwMDMgIHwgICAgIHNyYy0+cmVjdl9ydGNwICAgICAgfAorIyAgICAgICAgICAgICAnLS0tLS0tLScgICAgICAnLS0tLS0tLS0tLScKKworCisjIHRoZSBjYXBzIG9mIHRoZSBzZW5kZXIgUlRQIHN0cmVhbS4gVGhpcyBpcyB1c3VhbGx5IG5lZ290aWF0ZWQgb3V0IG9mIGJhbmQgd2l0aAorIyBTRFAgb3IgUlRTUC4KK0FVRElPX0NBUFM9ImFwcGxpY2F0aW9uL3gtcnRwLG1lZGlhPShzdHJpbmcpYXVkaW8sY2xvY2stcmF0ZT0oaW50KTgwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKVBDTUEiCisKK0FVRElPX0RFQz0icnRwcGNtYWRlcGF5ICEgYWxhd2RlYyIKKworQVVESU9fU0lOSz0iYXVkaW9jb252ZXJ0ICEgYXVkaW9yZXNhbXBsZSAhIGF1dG9hdWRpb3NpbmsiCisKKyMgdGhlIGRlc3RpbmF0aW9uIG1hY2hpbmUgdG8gc2VuZCBSVENQIHRvLiBUaGlzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzZW5kZXIgYW5kCisjIGlzIHVzZWQgdG8gc2VuZCBiYWNrIHRoZSBSVENQIHJlcG9ydHMgb2YgdGhpcyByZWNlaXZlci4gSWYgdGhlIGRhdGEgaXMgc2VudAorIyBmcm9tIGFub3RoZXIgbWFjaGluZSwgY2hhbmdlIHRoaXMgYWRkcmVzcy4KK0RFU1Q9MTI3LjAuMC4xCisKK2dzdC1sYXVuY2gtMS4wIC12IHJ0cGJpbiBuYW1lPXJ0cGJpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICB1ZHBzcmMgY2Fwcz0kQVVESU9fQ0FQUyBwb3J0PTUwMDIgISBydHBiaW4ucmVjdl9ydHBfc2lua18wICAgICAgICAgICAgICBcCisJICAgICAgICAgcnRwYmluLiAhICRBVURJT19ERUMgISAkQVVESU9fU0lOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB1ZHBzcmMgcG9ydD01MDAzICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18wICEgdWRwc2luayBwb3J0PTUwMDcgaG9zdD0kREVTVCBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LVZQOC1PUFVTLnNoIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1WUDgtT1BVUy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMjBiZTcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1WUDgtT1BVUy5zaApAQCAtMCwwICsxLDI4IEBACisjIS9iaW4vc2gKKyMKKyMgQSBzaW1wbGUgUlRQIHJlY2VpdmVyIAorIworCitWSURFT19DQVBTPSJhcHBsaWNhdGlvbi94LXJ0cCxtZWRpYT0oc3RyaW5nKXZpZGVvLGNsb2NrLXJhdGU9KGludCk5MDAwMCxlbmNvZGluZy1uYW1lPShzdHJpbmcpVlA4IgorQVVESU9fQ0FQUz0iYXBwbGljYXRpb24veC1ydHAsbWVkaWE9KHN0cmluZylhdWRpbyxjbG9jay1yYXRlPShpbnQpNDgwMDAsZW5jb2RpbmctbmFtZT0oc3RyaW5nKU9QVVMiCisKK1NSQz1sb2NhbGhvc3QKK0RFU1Q9bG9jYWxob3N0CisKK1ZJREVPX0RFQz0icnRwdnA4ZGVwYXkgISB2cDhkZWMiCitBVURJT19ERUM9InJ0cG9wdXNkZXBheSAhIG9wdXNkZWMiCisKK1ZJREVPX1NJTks9InZpZGVvY29udmVydCAhIGF1dG92aWRlb3NpbmsiCitBVURJT19TSU5LPSJhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlICEgYXV0b2F1ZGlvc2luayIKKworTEFURU5DWT0xMDAKKworZ3N0LWxhdW5jaC0xLjAgLXYgcnRwYmluIG5hbWU9cnRwYmluIGxhdGVuY3k9JExBVEVOQ1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHVkcHNyYyBjYXBzPSRWSURFT19DQVBTIGFkZHJlc3M9JFNSQyBwb3J0PTUwMDAgISBydHBiaW4ucmVjdl9ydHBfc2lua18wICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgICBydHBiaW4uICEgJFZJREVPX0RFQyAhICRWSURFT19TSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgdWRwc3JjIGFkZHJlc3M9JFNSQyBwb3J0PTUwMDEgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18wICEgdWRwc2luayBob3N0PSRERVNUIHBvcnQ9NTAwNSBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlIFwKKwkgICB1ZHBzcmMgY2Fwcz0kQVVESU9fQ0FQUyBhZGRyZXNzPSRTUkMgcG9ydD01MDAyICEgcnRwYmluLnJlY3ZfcnRwX3NpbmtfMSAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICAgcnRwYmluLiAhICRBVURJT19ERUMgISAkQVVESU9fU0lOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHVkcHNyYyBhZGRyZXNzPSRTUkMgcG9ydD01MDAzICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMSAhIHVkcHNpbmsgaG9zdD0kREVTVCBwb3J0PTUwMDcgc3luYz1mYWxzZSBhc3luYz1mYWxzZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL2NsaWVudC1ydHBhdXguYyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtcnRwYXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkwZGMxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtcnRwYXV4LmMKQEAgLTAsMCArMSwzODAgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDEzIENvbGxhYm9yYSBMdGQuCisgKiAgIEBhdXRob3IgVG9ycmllIEZpc2NoZXIgPHRvcnJpZS5maXNjaGVyQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvcnRwL3J0cC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKgorICogUlRQIHJlY2VpdmVyIHdpdGggUkZDNDU4OCByZXRyYW5zbWlzc2lvbiBoYW5kbGluZyBlbmFibGVkCisgKgorICogIEluIHRoaXMgZXhhbXBsZSB3ZSBoYXZlIHR3byBSVFAgc2Vzc2lvbnMsIG9uZSBmb3IgdmlkZW8gYW5kIG9uZSBmb3IgYXVkaW8uCisgKiAgVmlkZW8gaXMgcmVjZWl2ZWQgb24gcG9ydCA1MDAwLCB3aXRoIGl0cyBSVENQIHN0cmVhbSByZWNlaXZlZCBvbiBwb3J0IDUwMDEKKyAqICBhbmQgc2VudCBvbiBwb3J0IDUwMDUuIEF1ZGlvIGlzIHJlY2VpdmVkIG9uIHBvcnQgNTAwNSwgd2l0aCBpdHMgUlRDUCBzdHJlYW0KKyAqICByZWNlaXZlZCBvbiBwb3J0IDUwMDYgYW5kIHNlbnQgb24gcG9ydCA1MDExLgorICoKKyAqICBJbiBib3RoIHNlc3Npb25zLCB3ZSBzZXQgInJ0cHJ0eHJlY2VpdmUiIGFzIHRoZSBzZXNzaW9uJ3MgImF1eCIgZWxlbWVudAorICogIGluIHJ0cGJpbiwgd2hpY2ggZW5hYmxlcyBSRkM0NTg4IHJldHJhbnNtaXNzaW9uIGhhbmRsaW5nIGZvciB0aGF0IHNlc3Npb24uCisgKgorICogICAgICAgICAgICAgLi0tLS0tLS0uICAgICAgLi0tLS0tLS0tLS0uICAgICAgICAuLS0tLS0tLS0tLS0uICAgLi0tLS0tLS0tLS4gICAuLS0tLS0tLS0tLS0tLS4KKyAqICBSVFAgICAgICAgIHx1ZHBzcmMgfCAgICAgIHwgcnRwYmluICAgfCAgICAgICAgfHRoZW9yYWRlcGF5fCAgIHx0aGVvcmFkZWN8ICAgfGF1dG92aWRlb3Npbmt8CisgKiAgcG9ydD01MDAwICB8ICAgICAgc3JjLT5yZWN2X3J0cF8wIHJlY3ZfcnRwXzAtPnNpbmsgICAgICAgc3JjLT5zaW5rICAgICBzcmMtPnNpbmsgICAgICAgICAgfAorICogICAgICAgICAgICAgJy0tLS0tLS0nICAgICAgfCAgICAgICAgICB8ICAgICAgICAnLS0tLS0tLS0tLS0nICAgJy0tLS0tLS0tLScgICAnLS0tLS0tLS0tLS0tLScKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAuLS0tLS0tLS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgfHVkcHNpbmt8ICBSVENQCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBzZW5kX3J0Y3BfMC0+c2luayAgICAgfCBwb3J0PTUwMDUKKyAqICAgICAgICAgICAgIC4tLS0tLS0tLiAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0nIHN5bmM9ZmFsc2UKKyAqICBSVENQICAgICAgIHx1ZHBzcmMgfCAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgIGFzeW5jPWZhbHNlCisgKiAgcG9ydD01MDAxICB8ICAgICBzcmMtPnJlY3ZfcnRjcF8wICAgIHwKKyAqICAgICAgICAgICAgICctLS0tLS0tJyAgICAgIHwgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CisgKiAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICB8ICAgICAgICAgIHwgICAgICAgIC4tLS0tLS0tLS0uICAgLi0tLS0tLS0uICAgLi0tLS0tLS0tLS0tLS0uCisgKiAgUlRQICAgICAgICB8dWRwc3JjIHwgICAgICB8ICAgICAgICAgIHwgICAgICAgIHxwY21hZGVwYXl8ICAgfGFsYXdkZWN8ICAgfGF1dG9hdWRpb3Npbmt8CisgKiAgcG9ydD01MDA2ICB8ICAgICAgc3JjLT5yZWN2X3J0cF8xIHJlY3ZfcnRwXzEtPnNpbmsgICAgIHNyYy0+c2luayAgIHNyYy0+c2luayAgICAgICAgICB8CisgKiAgICAgICAgICAgICAnLS0tLS0tLScgICAgICB8ICAgICAgICAgIHwgICAgICAgICctLS0tLS0tLS0nICAgJy0tLS0tLS0nICAgJy0tLS0tLS0tLS0tLS0nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgLi0tLS0tLS0uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIHx1ZHBzaW5rfCAgUlRDUAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgc2VuZF9ydGNwXzEtPnNpbmsgICAgIHwgcG9ydD01MDExCisgKiAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tJyBzeW5jPWZhbHNlCisgKiAgUlRDUCAgICAgICB8dWRwc3JjIHwgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICBhc3luYz1mYWxzZQorICogIHBvcnQ9NTAwNyAgfCAgICAgc3JjLT5yZWN2X3J0Y3BfMSAgICB8CisgKiAgICAgICAgICAgICAnLS0tLS0tLScgICAgICAnLS0tLS0tLS0tLScKKyAqCisgKi8KKworR01haW5Mb29wICpsb29wID0gTlVMTDsKKwordHlwZWRlZiBzdHJ1Y3QgX1Nlc3Npb25EYXRhCit7CisgIGludCByZWY7CisgIEdzdEVsZW1lbnQgKnJ0cGJpbjsKKyAgZ3VpbnQgc2Vzc2lvbk51bTsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0RWxlbWVudCAqb3V0cHV0OworfSBTZXNzaW9uRGF0YTsKKworc3RhdGljIFNlc3Npb25EYXRhICoKK3Nlc3Npb25fcmVmIChTZXNzaW9uRGF0YSAqIGRhdGEpCit7CisgIGdfYXRvbWljX2ludF9pbmMgKCZkYXRhLT5yZWYpOworICByZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQKK3Nlc3Npb25fdW5yZWYgKGdwb2ludGVyIGRhdGEpCit7CisgIFNlc3Npb25EYXRhICpzZXNzaW9uID0gKFNlc3Npb25EYXRhICopIGRhdGE7CisgIGlmIChnX2F0b21pY19pbnRfZGVjX2FuZF90ZXN0ICgmc2Vzc2lvbi0+cmVmKSkgeworICAgIGdfb2JqZWN0X3VucmVmIChzZXNzaW9uLT5ydHBiaW4pOworICAgIGdzdF9jYXBzX3VucmVmIChzZXNzaW9uLT5jYXBzKTsKKyAgICBnX2ZyZWUgKHNlc3Npb24pOworICB9Cit9CisKK3N0YXRpYyBTZXNzaW9uRGF0YSAqCitzZXNzaW9uX25ldyAoZ3VpbnQgc2Vzc2lvbk51bSkKK3sKKyAgU2Vzc2lvbkRhdGEgKnJldCA9IGdfbmV3MCAoU2Vzc2lvbkRhdGEsIDEpOworICByZXQtPnNlc3Npb25OdW0gPSBzZXNzaW9uTnVtOworICByZXR1cm4gc2Vzc2lvbl9yZWYgKHJldCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cF9naG9zdF9zaW5rIChHc3RFbGVtZW50ICogc2luaywgR3N0QmluICogYmluKQoreworICBHc3RQYWQgKnNpbmtQYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2luaywgInNpbmsiKTsKKyAgR3N0UGFkICpiaW5QYWQgPSBnc3RfZ2hvc3RfcGFkX25ldyAoInNpbmsiLCBzaW5rUGFkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKGJpbiksIGJpblBhZCk7Cit9CisKK3N0YXRpYyBTZXNzaW9uRGF0YSAqCittYWtlX2F1ZGlvX3Nlc3Npb24gKGd1aW50IHNlc3Npb25OdW0pCit7CisgIFNlc3Npb25EYXRhICpyZXQgPSBzZXNzaW9uX25ldyAoc2Vzc2lvbk51bSk7CisgIEdzdEJpbiAqYmluID0gR1NUX0JJTiAoZ3N0X2Jpbl9uZXcgKCJhdWRpbyIpKTsKKyAgR3N0RWxlbWVudCAqcXVldWUgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJxdWV1ZSIsIE5VTEwpOworICBHc3RFbGVtZW50ICpzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXV0b2F1ZGlvc2luayIsIE5VTEwpOworICBHc3RFbGVtZW50ICphdWRpb2NvbnZlcnQgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb2NvbnZlcnQiLCBOVUxMKTsKKyAgR3N0RWxlbWVudCAqYXVkaW9yZXNhbXBsZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvcmVzYW1wbGUiLCBOVUxMKTsKKyAgR3N0RWxlbWVudCAqZGVwYXlsb2FkZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBwY21hZGVwYXkiLCBOVUxMKTsKKyAgR3N0RWxlbWVudCAqZGVjb2RlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImFsYXdkZWMiLCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChiaW4sIHF1ZXVlLCBkZXBheWxvYWRlciwgZGVjb2RlciwgYXVkaW9jb252ZXJ0LAorICAgICAgYXVkaW9yZXNhbXBsZSwgc2luaywgTlVMTCk7CisgIGdzdF9lbGVtZW50X2xpbmtfbWFueSAocXVldWUsIGRlcGF5bG9hZGVyLCBkZWNvZGVyLCBhdWRpb2NvbnZlcnQsCisgICAgICBhdWRpb3Jlc2FtcGxlLCBzaW5rLCBOVUxMKTsKKworICBzZXR1cF9naG9zdF9zaW5rIChxdWV1ZSwgYmluKTsKKworICByZXQtPm91dHB1dCA9IEdTVF9FTEVNRU5UIChiaW4pOworICByZXQtPmNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXBwbGljYXRpb24veC1ydHAiLAorICAgICAgIm1lZGlhIiwgR19UWVBFX1NUUklORywgImF1ZGlvIiwKKyAgICAgICJjbG9jay1yYXRlIiwgR19UWVBFX0lOVCwgODAwMCwKKyAgICAgICJlbmNvZGluZy1uYW1lIiwgR19UWVBFX1NUUklORywgIlBDTUEiLCBOVUxMKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgU2Vzc2lvbkRhdGEgKgorbWFrZV92aWRlb19zZXNzaW9uIChndWludCBzZXNzaW9uTnVtKQoreworICBTZXNzaW9uRGF0YSAqcmV0ID0gc2Vzc2lvbl9uZXcgKHNlc3Npb25OdW0pOworICBHc3RCaW4gKmJpbiA9IEdTVF9CSU4gKGdzdF9iaW5fbmV3ICgidmlkZW8iKSk7CisgIEdzdEVsZW1lbnQgKnF1ZXVlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicXVldWUiLCBOVUxMKTsKKyAgR3N0RWxlbWVudCAqZGVwYXlsb2FkZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHB0aGVvcmFkZXBheSIsIE5VTEwpOworICBHc3RFbGVtZW50ICpkZWNvZGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidGhlb3JhZGVjIiwgTlVMTCk7CisgIEdzdEVsZW1lbnQgKmNvbnZlcnRlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvY29udmVydCIsIE5VTEwpOworICBHc3RFbGVtZW50ICpzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXV0b3ZpZGVvc2luayIsIE5VTEwpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKGJpbiwgZGVwYXlsb2FkZXIsIGRlY29kZXIsIGNvbnZlcnRlciwgcXVldWUsIHNpbmssIE5VTEwpOworICBnc3RfZWxlbWVudF9saW5rX21hbnkgKHF1ZXVlLCBkZXBheWxvYWRlciwgZGVjb2RlciwgY29udmVydGVyLCBzaW5rLCBOVUxMKTsKKworICBzZXR1cF9naG9zdF9zaW5rIChxdWV1ZSwgYmluKTsKKworICByZXQtPm91dHB1dCA9IEdTVF9FTEVNRU5UIChiaW4pOworICByZXQtPmNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXBwbGljYXRpb24veC1ydHAiLAorICAgICAgIm1lZGlhIiwgR19UWVBFX1NUUklORywgInZpZGVvIiwKKyAgICAgICJjbG9jay1yYXRlIiwgR19UWVBFX0lOVCwgOTAwMDAsCisgICAgICAiZW5jb2RpbmctbmFtZSIsIEdfVFlQRV9TVFJJTkcsICJUSEVPUkEiLCBOVUxMKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgR3N0Q2FwcyAqCityZXF1ZXN0X3B0X21hcCAoR3N0RWxlbWVudCAqIHJ0cGJpbiwgZ3VpbnQgc2Vzc2lvbiwgZ3VpbnQgcHQsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBTZXNzaW9uRGF0YSAqZGF0YSA9IChTZXNzaW9uRGF0YSAqKSB1c2VyX2RhdGE7CisgIGdjaGFyICpjYXBzX3N0cjsKKyAgZ19wcmludCAoIkxvb2tpbmcgZm9yIGNhcHMgZm9yIHB0ICV1IGluIHNlc3Npb24gJXUsIGhhdmUgJXVcbiIsIHB0LCBzZXNzaW9uLAorICAgICAgZGF0YS0+c2Vzc2lvbk51bSk7CisgIGlmIChzZXNzaW9uID09IGRhdGEtPnNlc3Npb25OdW0pIHsKKyAgICBjYXBzX3N0ciA9IGdzdF9jYXBzX3RvX3N0cmluZyAoZGF0YS0+Y2Fwcyk7CisgICAgZ19wcmludCAoIlJldHVybmluZyAlc1xuIiwgY2Fwc19zdHIpOworICAgIGdfZnJlZSAoY2Fwc19zdHIpOworICAgIHJldHVybiBnc3RfY2Fwc19yZWYgKGRhdGEtPmNhcHMpOworICB9CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorY2JfZW9zIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBncG9pbnRlciBkYXRhKQoreworICBnX3ByaW50ICgiR290IEVPU1xuIik7CisgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworfQorCitzdGF0aWMgdm9pZAorY2Jfc3RhdGUgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIGdwb2ludGVyIGRhdGEpCit7CisgIEdzdE9iamVjdCAqcGlwZSA9IEdTVF9PQkpFQ1QgKGRhdGEpOworICBHc3RTdGF0ZSBvbGQsIG5ldywgcGVuZGluZzsKKyAgZ3N0X21lc3NhZ2VfcGFyc2Vfc3RhdGVfY2hhbmdlZCAobWVzc2FnZSwgJm9sZCwgJm5ldywgJnBlbmRpbmcpOworICBpZiAobWVzc2FnZS0+c3JjID09IHBpcGUpIHsKKyAgICBnX3ByaW50ICgiUGlwZWxpbmUgJXMgY2hhbmdlZCBzdGF0ZSBmcm9tICVzIHRvICVzXG4iLAorICAgICAgICBHU1RfT0JKRUNUX05BTUUgKG1lc3NhZ2UtPnNyYyksCisgICAgICAgIGdzdF9lbGVtZW50X3N0YXRlX2dldF9uYW1lIChvbGQpLCBnc3RfZWxlbWVudF9zdGF0ZV9nZXRfbmFtZSAobmV3KSk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2NiX3dhcm5pbmcgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIGdwb2ludGVyIGRhdGEpCit7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBnc3RfbWVzc2FnZV9wYXJzZV93YXJuaW5nIChtZXNzYWdlLCAmZXJyb3IsIE5VTEwpOworICBnX3ByaW50ZXJyICgiR290IHdhcm5pbmcgZnJvbSAlczogJXNcbiIsIEdTVF9PQkpFQ1RfTkFNRSAobWVzc2FnZS0+c3JjKSwKKyAgICAgIGVycm9yLT5tZXNzYWdlKTsKKyAgZ19lcnJvcl9mcmVlIChlcnJvcik7Cit9CisKK3N0YXRpYyB2b2lkCitjYl9lcnJvciAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtZXNzYWdlLCAmZXJyb3IsIE5VTEwpOworICBnX3ByaW50ZXJyICgiR290IGVycm9yIGZyb20gJXM6ICVzXG4iLCBHU1RfT0JKRUNUX05BTUUgKG1lc3NhZ2UtPnNyYyksCisgICAgICBlcnJvci0+bWVzc2FnZSk7CisgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9uZXdfc3RyZWFtIChHc3RFbGVtZW50ICogZWxlbWVudCwgR3N0UGFkICogbmV3UGFkLCBncG9pbnRlciBkYXRhKQoreworICBTZXNzaW9uRGF0YSAqc2Vzc2lvbiA9IChTZXNzaW9uRGF0YSAqKSBkYXRhOworICBnY2hhciAqcGFkTmFtZTsKKyAgZ2NoYXIgKm15UHJlZml4OworCisgIHBhZE5hbWUgPSBnc3RfcGFkX2dldF9uYW1lIChuZXdQYWQpOworICBteVByZWZpeCA9IGdfc3RyZHVwX3ByaW50ZiAoInJlY3ZfcnRwX3NyY18ldSIsIHNlc3Npb24tPnNlc3Npb25OdW0pOworCisgIGdfcHJpbnQgKCJOZXcgcGFkOiAlcywgbG9va2luZyBmb3IgJXNfKlxuIiwgcGFkTmFtZSwgbXlQcmVmaXgpOworCisgIGlmIChnX3N0cl9oYXNfcHJlZml4IChwYWROYW1lLCBteVByZWZpeCkpIHsKKyAgICBHc3RQYWQgKm91dHB1dFNpbmtQYWQ7CisgICAgR3N0RWxlbWVudCAqcGFyZW50OworCisgICAgcGFyZW50ID0gR1NUX0VMRU1FTlQgKGdzdF9lbGVtZW50X2dldF9wYXJlbnQgKHNlc3Npb24tPnJ0cGJpbikpOworICAgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwYXJlbnQpLCBzZXNzaW9uLT5vdXRwdXQpOworICAgIGdzdF9lbGVtZW50X3N5bmNfc3RhdGVfd2l0aF9wYXJlbnQgKHNlc3Npb24tPm91dHB1dCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocGFyZW50KTsKKworICAgIG91dHB1dFNpbmtQYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoc2Vzc2lvbi0+b3V0cHV0LCAic2luayIpOworICAgIGdfYXNzZXJ0X2NtcGludCAoZ3N0X3BhZF9saW5rIChuZXdQYWQsIG91dHB1dFNpbmtQYWQpLCA9PSwgR1NUX1BBRF9MSU5LX09LKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChvdXRwdXRTaW5rUGFkKTsKKworICAgIGdfcHJpbnQgKCJMaW5rZWQhXG4iKTsKKyAgfQorICBnX2ZyZWUgKG15UHJlZml4KTsKKyAgZ19mcmVlIChwYWROYW1lKTsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorcmVxdWVzdF9hdXhfcmVjZWl2ZXIgKEdzdEVsZW1lbnQgKiBydHBiaW4sIGd1aW50IHNlc3NpZCwgU2Vzc2lvbkRhdGEgKiBzZXNzaW9uKQoreworICBHc3RFbGVtZW50ICpydHgsICpiaW47CisgIEdzdFBhZCAqcGFkOworICBnY2hhciAqbmFtZTsKKyAgR3N0U3RydWN0dXJlICpwdF9tYXA7CisKKyAgR1NUX0lORk8gKCJjcmVhdGluZyBBVVggcmVjZWl2ZXIiKTsKKyAgYmluID0gZ3N0X2Jpbl9uZXcgKE5VTEwpOworICBydHggPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBydHhyZWNlaXZlIiwgTlVMTCk7CisgIHB0X21hcCA9IGdzdF9zdHJ1Y3R1cmVfbmV3ICgiYXBwbGljYXRpb24veC1ydHAtcHQtbWFwIiwKKyAgICAgICI4IiwgR19UWVBFX1VJTlQsIDk4LCAiOTYiLCBHX1RZUEVfVUlOVCwgOTksIE5VTEwpOworICBnX29iamVjdF9zZXQgKHJ0eCwgInBheWxvYWQtdHlwZS1tYXAiLCBwdF9tYXAsIE5VTEwpOworICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHB0X21hcCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChiaW4pLCBydHgpOworCisgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydHgsICJzcmMiKTsKKyAgbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNyY18ldSIsIHNlc3NpZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgZ3N0X2dob3N0X3BhZF9uZXcgKG5hbWUsIHBhZCkpOworICBnX2ZyZWUgKG5hbWUpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworCisgIHBhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydHgsICJzaW5rIik7CisgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzaW5rXyV1Iiwgc2Vzc2lkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoYmluLCBnc3RfZ2hvc3RfcGFkX25ldyAobmFtZSwgcGFkKSk7CisgIGdfZnJlZSAobmFtZSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBhZCk7CisKKyAgcmV0dXJuIGJpbjsKK30KKworc3RhdGljIHZvaWQKK2pvaW5fc2Vzc2lvbiAoR3N0RWxlbWVudCAqIHBpcGVsaW5lLCBHc3RFbGVtZW50ICogcnRwQmluLCBTZXNzaW9uRGF0YSAqIHNlc3Npb24pCit7CisgIEdzdEVsZW1lbnQgKnJ0cFNyYzsKKyAgR3N0RWxlbWVudCAqcnRjcFNyYzsKKyAgR3N0RWxlbWVudCAqcnRjcFNpbms7CisgIGdjaGFyICpwYWROYW1lOworICBndWludCBiYXNlUG9ydDsKKworICBnX3ByaW50ICgiSm9pbmluZyBzZXNzaW9uICVwXG4iLCBzZXNzaW9uKTsKKworICBzZXNzaW9uLT5ydHBiaW4gPSBnX29iamVjdF9yZWYgKHJ0cEJpbik7CisKKyAgYmFzZVBvcnQgPSA1MDAwICsgKHNlc3Npb24tPnNlc3Npb25OdW0gKiA2KTsKKworICBydHBTcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzcmMiLCBOVUxMKTsKKyAgcnRjcFNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNyYyIsIE5VTEwpOworICBydGNwU2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNpbmsiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChydHBTcmMsICJwb3J0IiwgYmFzZVBvcnQsICJjYXBzIiwgc2Vzc2lvbi0+Y2FwcywgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAocnRjcFNpbmssICJwb3J0IiwgYmFzZVBvcnQgKyA1LCAiaG9zdCIsICIxMjcuMC4wLjEiLCAic3luYyIsCisgICAgICBGQUxTRSwgImFzeW5jIiwgRkFMU0UsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHJ0Y3BTcmMsICJwb3J0IiwgYmFzZVBvcnQgKyAxLCBOVUxMKTsKKworICBnX3ByaW50ICgiQ29ubmVjdGluZyB0byAlaS8laS8laVxuIiwgYmFzZVBvcnQsIGJhc2VQb3J0ICsgMSwgYmFzZVBvcnQgKyA1KTsKKworICAvKiBlbmFibGUgUkZDNDU4OCByZXRyYW5zbWlzc2lvbiBoYW5kbGluZyBieSBzZXR0aW5nIHJ0cHJ0eHJlY2VpdmUKKyAgICogYXMgdGhlICJhdXgiIGVsZW1lbnQgb2YgcnRwYmluICovCisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cEJpbiwgInJlcXVlc3QtYXV4LXJlY2VpdmVyIiwKKyAgICAgIChHQ2FsbGJhY2spIHJlcXVlc3RfYXV4X3JlY2VpdmVyLCBzZXNzaW9uKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHJ0cFNyYywgcnRjcFNyYywgcnRjcFNpbmssIE5VTEwpOworCisgIGdfc2lnbmFsX2Nvbm5lY3RfZGF0YSAocnRwQmluLCAicGFkLWFkZGVkIiwgR19DQUxMQkFDSyAoaGFuZGxlX25ld19zdHJlYW0pLAorICAgICAgc2Vzc2lvbl9yZWYgKHNlc3Npb24pLCAoR0Nsb3N1cmVOb3RpZnkpIHNlc3Npb25fdW5yZWYsIDApOworCisgIGdfc2lnbmFsX2Nvbm5lY3RfZGF0YSAocnRwQmluLCAicmVxdWVzdC1wdC1tYXAiLCBHX0NBTExCQUNLIChyZXF1ZXN0X3B0X21hcCksCisgICAgICBzZXNzaW9uX3JlZiAoc2Vzc2lvbiksIChHQ2xvc3VyZU5vdGlmeSkgc2Vzc2lvbl91bnJlZiwgMCk7CisKKyAgcGFkTmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInJlY3ZfcnRwX3NpbmtfJXUiLCBzZXNzaW9uLT5zZXNzaW9uTnVtKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzIChydHBTcmMsICJzcmMiLCBydHBCaW4sIHBhZE5hbWUpOworICBnX2ZyZWUgKHBhZE5hbWUpOworCisgIHBhZE5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJyZWN2X3J0Y3Bfc2lua18ldSIsIHNlc3Npb24tPnNlc3Npb25OdW0pOworICBnc3RfZWxlbWVudF9saW5rX3BhZHMgKHJ0Y3BTcmMsICJzcmMiLCBydHBCaW4sIHBhZE5hbWUpOworICBnX2ZyZWUgKHBhZE5hbWUpOworCisgIHBhZE5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzZW5kX3J0Y3Bfc3JjXyV1Iiwgc2Vzc2lvbi0+c2Vzc2lvbk51bSk7CisgIGdzdF9lbGVtZW50X2xpbmtfcGFkcyAocnRwQmluLCBwYWROYW1lLCBydGNwU2luaywgInNpbmsiKTsKKyAgZ19mcmVlIChwYWROYW1lKTsKKworICBzZXNzaW9uX3VucmVmIChzZXNzaW9uKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIEdzdFBpcGVsaW5lICpwaXBlOworICBTZXNzaW9uRGF0YSAqdmlkZW9TZXNzaW9uOworICBTZXNzaW9uRGF0YSAqYXVkaW9TZXNzaW9uOworICBHc3RFbGVtZW50ICpydHBCaW47CisgIEdzdEJ1cyAqYnVzOworCisgIGdzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKyAgcGlwZSA9IEdTVF9QSVBFTElORSAoZ3N0X3BpcGVsaW5lX25ldyAoTlVMTCkpOworCisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKEdTVF9FTEVNRU5UIChwaXBlKSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OmVycm9yIiwgR19DQUxMQkFDSyAoY2JfZXJyb3IpLCBwaXBlKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6d2FybmluZyIsIEdfQ0FMTEJBQ0sgKGNiX3dhcm5pbmcpLCBwaXBlKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6c3RhdGUtY2hhbmdlZCIsIEdfQ0FMTEJBQ0sgKGNiX3N0YXRlKSwgcGlwZSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OmVvcyIsIEdfQ0FMTEJBQ0sgKGNiX2VvcyksIE5VTEwpOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2ggKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgcnRwQmluID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwYmluIiwgTlVMTCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlKSwgcnRwQmluKTsKKyAgZ19vYmplY3Rfc2V0IChydHBCaW4sICJsYXRlbmN5IiwgMjAwLCAiZG8tcmV0cmFuc21pc3Npb24iLCBUUlVFLAorICAgICAgInJ0cC1wcm9maWxlIiwgR1NUX1JUUF9QUk9GSUxFX0FWUEYsIE5VTEwpOworCisgIHZpZGVvU2Vzc2lvbiA9IG1ha2VfdmlkZW9fc2Vzc2lvbiAoMCk7CisgIGF1ZGlvU2Vzc2lvbiA9IG1ha2VfYXVkaW9fc2Vzc2lvbiAoMSk7CisKKyAgam9pbl9zZXNzaW9uIChHU1RfRUxFTUVOVCAocGlwZSksIHJ0cEJpbiwgdmlkZW9TZXNzaW9uKTsKKyAgam9pbl9zZXNzaW9uIChHU1RfRUxFTUVOVCAocGlwZSksIHJ0cEJpbiwgYXVkaW9TZXNzaW9uKTsKKworICBnX3ByaW50ICgic3RhcnRpbmcgY2xpZW50IHBpcGVsaW5lXG4iKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChHU1RfRUxFTUVOVCAocGlwZSksIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICBnX21haW5fbG9vcF9ydW4gKGxvb3ApOworCisgIGdfcHJpbnQgKCJzdG9waW5nIGNsaWVudCBwaXBlbGluZVxuIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoR1NUX0VMRU1FTlQgKHBpcGUpLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZSk7CisgIGdfbWFpbl9sb29wX3VucmVmIChsb29wKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9jbGllbnQtcnRwYnVuZGxlLmMgYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LXJ0cGJ1bmRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkM2E3MzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvY2xpZW50LXJ0cGJ1bmRsZS5jCkBAIC0wLDAgKzEsMjY2IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAxNiBJZ2FsaWEgUy5MCisgKiAgIEBhdXRob3IgUGhpbGlwcGUgTm9ybWFuZCA8cGhpbG5AaWdhbGlhLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisvKgorICogUlRQIGJ1bmRsZSByZWNlaXZlcgorICoKKyAqIEluIHRoaXMgZXhhbXBsZSB3ZSBpbml0aWFsbHkgY3JlYXRlIG9uZSBSVFAgc2Vzc2lvbiBidXQgdGhlIGluY29taW5nIFJUUAorICogYW5kIFJUQ1Agc3RyZWFtcyBhY3R1YWxseSBidW5kbGUgMiBkaWZmZXJlbnQgbWVkaWEgdHlwZSwgb25lIGF1ZGlvIHN0cmVhbQorICogYW5kIG9uZSB2aWRlbyBzdHJlYW0uIFdlIGFyZSBub3RpZmllZCBvZiB0aGUgZGlzY292ZXJ5IG9mIHRoZSBzdHJlYW1zIGJ5CisgKiB0aGUgb24tYnVuZGxlZC1zc3JjIHJ0cGJpbiBzaWduYWwuIEluIHRoZSBoYW5kbGVyIHdlIGRlY2lkZSB0byBhc3NpZ24gdGhlCisgKiBmaXJzdCBTU1JDIHRvIHRoZSAoZXhpc3RpbmcpIGF1ZGlvIHNlc3Npb24gYW5kIHRoZSBzZWNvbmQgU1NSQyB0byBhIG5ldworICogc2Vzc2lvbiAoaWQ6IDEpLgorICoKKyAqICAgICAgICAgICAgIC4tLS0tLS0tLiAgICAgIC4tLS0tLS0tLS0tLiAgICAgICAgLi0tLS0tLS0tLS0tLiAgICAuLS0tLS0tLS4gICAgLi0tLS0tLS0tLS0tLS0uCisgKiAgUlRQICAgICAgICB8dWRwc3JjIHwgICAgICB8IHJ0cGJpbiAgIHwgICAgICAgIHwgcGNtYWRlcGF5IHwgICAgfGFsYXdkZWN8ICAgIHxhdXRvYXVkaW9zaW5rfAorICogIHBvcnQ9NTAwMSAgfCAgICAgIHNyYy0+cmVjdl9ydHBfMCByZWN2X3J0cF8wLT5zaW5rICAgICAgIHNyYy0+c2luayAgICBzcmMtPnNpbmsgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICctLS0tLS0tJyAgICAgIHwgICAgICAgICAgfCAgICAgICAgJy0tLS0tLS0tLS0tJyAgICAnLS0tLS0tLScgICAgJy0tLS0tLS0tLS0tLS0nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgLi0tLS0tLS0uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIHx1ZHBzaW5rfCAgUlRDUAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgc2VuZF9ydGNwXzAtPnNpbmsgICAgIHwgcG9ydD01MDAzCisgKiAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tJyBzeW5jPWZhbHNlCisgKiAgUlRDUCAgICAgICB8dWRwc3JjIHwgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICBhc3luYz1mYWxzZQorICogIHBvcnQ9NTAwMiAgfCAgICAgc3JjLT5yZWN2X3J0Y3BfMCAgICB8CisgKiAgICAgICAgICAgICAnLS0tLS0tLScgICAgICB8ICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAuLS0tLS0tLS0tLiAgICAuLS0tLS0tLS0tLS0tLS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgfHZyYXdkZXBheXwgICAgfGF1dG92aWRlb3Npbmt8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHJlY3ZfcnRwXzEtPnNpbmsgICAgIHNyYy0+c2luayAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAnLS0tLS0tLS0tJyAgICAnLS0tLS0tLS0tLS0tLScKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAuLS0tLS0tLS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgfHVkcHNpbmt8ICBSVENQCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBzZW5kX3J0Y3BfMS0+c2luayAgICAgfCBwb3J0PTUwMDQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0nIHN5bmM9ZmFsc2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgIGFzeW5jPWZhbHNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLS0tLS0tLS0tJworICoKKyAqLworCitzdGF0aWMgZ2Jvb2xlYW4KK3BsdWdfdmlkZW9fcnRjcF9zZW5kZXIgKGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZ2ludCBzZW5kX3ZpZGVvX3J0Y3BfcG9ydCA9IDUwMDQ7CisgIEdzdEVsZW1lbnQgKnJ0cGJpbiA9IEdTVF9FTEVNRU5UX0NBU1QgKHVzZXJfZGF0YSk7CisgIEdzdEVsZW1lbnQgKnNlbmRfdmlkZW9fcnRjcF91ZHBzaW5rOworICBHc3RFbGVtZW50ICpwaXBlbGluZSA9CisgICAgICBHU1RfRUxFTUVOVF9DQVNUIChnc3Rfb2JqZWN0X2dldF9wYXJlbnQgKEdTVF9PQkpFQ1QgKHJ0cGJpbikpKTsKKworICBzZW5kX3ZpZGVvX3J0Y3BfdWRwc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNpbmsiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzZW5kX3ZpZGVvX3J0Y3BfdWRwc2luaywgImhvc3QiLCAiMTI3LjAuMC4xIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc2VuZF92aWRlb19ydGNwX3VkcHNpbmssICJwb3J0Iiwgc2VuZF92aWRlb19ydGNwX3BvcnQsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNlbmRfdmlkZW9fcnRjcF91ZHBzaW5rLCAic3luYyIsIEZBTFNFLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzZW5kX3ZpZGVvX3J0Y3BfdWRwc2luaywgImFzeW5jIiwgRkFMU0UsIE5VTEwpOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZWxpbmUpLCBzZW5kX3ZpZGVvX3J0Y3BfdWRwc2luayk7CisgIGdzdF9lbGVtZW50X2xpbmtfcGFkcyAocnRwYmluLCAic2VuZF9ydGNwX3NyY18xIiwgc2VuZF92aWRlb19ydGNwX3VkcHNpbmssCisgICAgICAic2luayIpOworICBnc3RfZWxlbWVudF9zeW5jX3N0YXRlX3dpdGhfcGFyZW50IChzZW5kX3ZpZGVvX3J0Y3BfdWRwc2luayk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworICBnc3Rfb2JqZWN0X3VucmVmIChydHBiaW4pOworICByZXR1cm4gR19TT1VSQ0VfUkVNT1ZFOworfQorCitzdGF0aWMgdm9pZAorb25fcnRwYmlucmVjZWl2ZV9wYWRfYWRkZWQgKEdzdEVsZW1lbnQgKiBydHBiaW4sIEdzdFBhZCAqIG5ld19wYWQsCisgICAgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmUgPSBHU1RfRUxFTUVOVCAoZGF0YSk7CisgIGdjaGFyICpwYWRfbmFtZSA9IGdzdF9wYWRfZ2V0X25hbWUgKG5ld19wYWQpOworCisgIGlmIChnX3N0cl9oYXNfcHJlZml4IChwYWRfbmFtZSwgInJlY3ZfcnRwX3NyY18iKSkgeworICAgIEdzdENhcHMgKmNhcHMgPSBnc3RfcGFkX2dldF9jdXJyZW50X2NhcHMgKG5ld19wYWQpOworICAgIEdzdFN0cnVjdHVyZSAqcyA9IGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIDApOworICAgIGNvbnN0IGdjaGFyICptZWRpYV90eXBlID0gZ3N0X3N0cnVjdHVyZV9nZXRfc3RyaW5nIChzLCAibWVkaWEiKTsKKyAgICBnY2hhciAqZGVwYXlsb2FkZXJfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoIiVzX3J0cGRlcGF5bG9hZGVyIiwgbWVkaWFfdHlwZSk7CisgICAgR3N0RWxlbWVudCAqcnRwZGVwYXlsb2FkZXIgPQorICAgICAgICBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlbGluZSksIGRlcGF5bG9hZGVyX25hbWUpOworICAgIEdzdFBhZCAqc2lua3BhZDsKKworICAgIGdfZnJlZSAoZGVwYXlsb2FkZXJfbmFtZSk7CisKKyAgICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHJ0cGRlcGF5bG9hZGVyLCAic2luayIpOworICAgIGdzdF9wYWRfbGluayAobmV3X3BhZCwgc2lua3BhZCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAoc2lua3BhZCk7CisgICAgZ3N0X29iamVjdF91bnJlZiAocnRwZGVwYXlsb2FkZXIpOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgICAgaWYgKGdfc3RyX2hhc19wcmVmaXggKHBhZF9uYW1lLCAicmVjdl9ydHBfc3JjXzEiKSkgeworICAgICAgZ190aW1lb3V0X2FkZCAoMCwgcGx1Z192aWRlb19ydGNwX3NlbmRlciwgZ3N0X29iamVjdF9yZWYgKHJ0cGJpbikpOworICAgIH0KKyAgfQorICBnX2ZyZWUgKHBhZF9uYW1lKTsKK30KKworc3RhdGljIGd1aW50Citvbl9idW5kbGVkX3NzcmMgKEdzdEVsZW1lbnQgKiBydHBiaW4sIGd1aW50IHNzcmMsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgc3RhdGljIGdib29sZWFuIGNyZWF0ZV9zZXNzaW9uID0gRkFMU0U7CisgIGd1aW50IHNlc3Npb25faWQgPSAwOworCisgIGlmIChjcmVhdGVfc2Vzc2lvbikgeworICAgIHNlc3Npb25faWQgPSAxOworICB9IGVsc2UgeworICAgIGNyZWF0ZV9zZXNzaW9uID0gVFJVRTsKKyAgICAvKiB1c2UgZXhpc3Rpbmcgc2Vzc2lvbiAwLCBhIG5ldyBzZXNzaW9uIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhlIG5leHQgZGlzY292ZXJlZCBidW5kbGVkIFNTUkMgKi8KKyAgfQorICByZXR1cm4gc2Vzc2lvbl9pZDsKK30KKworc3RhdGljIEdzdENhcHMgKgorb25fcmVxdWVzdF9wdF9tYXAgKEdzdEVsZW1lbnQgKiBydHBiaW4sIGd1aW50IHNlc3Npb25faWQsIGd1aW50IHB0LAorICAgIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR3N0Q2FwcyAqY2FwcyA9IE5VTEw7CisgIGlmIChwdCA9PSA5NikgeworICAgIGNhcHMgPQorICAgICAgICBnc3RfY2Fwc19mcm9tX3N0cmluZworICAgICAgICAoImFwcGxpY2F0aW9uL3gtcnRwLG1lZGlhPShzdHJpbmcpYXVkaW8sZW5jb2RpbmctbmFtZT0oc3RyaW5nKVBDTUEsY2xvY2stcmF0ZT0oaW50KTgwMDAiKTsKKyAgfSBlbHNlIGlmIChwdCA9PSAxMDApIHsKKyAgICBjYXBzID0KKyAgICAgICAgZ3N0X2NhcHNfZnJvbV9zdHJpbmcKKyAgICAgICAgKCJhcHBsaWNhdGlvbi94LXJ0cCxtZWRpYT0oc3RyaW5nKXZpZGVvLGVuY29kaW5nLW5hbWU9KHN0cmluZylSQVcsY2xvY2stcmF0ZT0oaW50KTkwMDAwLHNhbXBsaW5nPShzdHJpbmcpXCJZQ2JDci00OjI6MFwiLGRlcHRoPShzdHJpbmcpOCx3aWR0aD0oc3RyaW5nKTMyMCxoZWlnaHQ9KHN0cmluZykyNDAiKTsKKyAgfQorICByZXR1cm4gY2FwczsKK30KKworc3RhdGljIEdzdEVsZW1lbnQgKgorY3JlYXRlX3BpcGVsaW5lICh2b2lkKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZSwgKnJ0cGJpbiwgKnJlY3ZfcnRwX3VkcHNyYywgKnJlY3ZfcnRjcF91ZHBzcmMsCisgICAgICAqYXVkaW9fcnRwZGVwYXlsb2FkZXIsICphdWRpb19kZWNvZGVyLCAqYXVkaW9fc2luaywgKnZpZGVvX3J0cGRlcGF5bG9hZGVyLAorICAgICAgKnZpZGVvX3NpbmssICpzZW5kX2F1ZGlvX3J0Y3BfdWRwc2luazsKKyAgR3N0Q2FwcyAqcnRwY2FwczsKKyAgZ2ludCBydHBfdWRwX3BvcnQgPSA1MDAxOworICBnaW50IHJ0Y3BfdWRwX3BvcnQgPSA1MDAyOworICBnaW50IHNlbmRfYXVkaW9fcnRjcF9wb3J0ID0gNTAwMzsKKworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKE5VTEwpOworCisgIHJ0cGJpbiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cGJpbiIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHJ0cGJpbiwgImxhdGVuY3kiLCAyMDAsIE5VTEwpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cGJpbiwgIm9uLWJ1bmRsZWQtc3NyYyIsCisgICAgICBHX0NBTExCQUNLIChvbl9idW5kbGVkX3NzcmMpLCBOVUxMKTsKKyAgZ19zaWduYWxfY29ubmVjdCAocnRwYmluLCAicmVxdWVzdC1wdC1tYXAiLAorICAgICAgR19DQUxMQkFDSyAob25fcmVxdWVzdF9wdF9tYXApLCBOVUxMKTsKKworICBnX3NpZ25hbF9jb25uZWN0IChydHBiaW4sICJwYWQtYWRkZWQiLAorICAgICAgR19DQUxMQkFDSyAob25fcnRwYmlucmVjZWl2ZV9wYWRfYWRkZWQpLCBwaXBlbGluZSk7CisKKyAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgcnRwYmluKTsKKworICByZWN2X3J0cF91ZHBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzcmMiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChyZWN2X3J0cF91ZHBzcmMsICJwb3J0IiwgcnRwX3VkcF9wb3J0LCBOVUxMKTsKKyAgcnRwY2FwcyA9IGdzdF9jYXBzX2Zyb21fc3RyaW5nICgiYXBwbGljYXRpb24veC1ydHAiKTsKKyAgZ19vYmplY3Rfc2V0IChyZWN2X3J0cF91ZHBzcmMsICJjYXBzIiwgcnRwY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChydHBjYXBzKTsKKworICByZWN2X3J0Y3BfdWRwc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc3JjIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAocmVjdl9ydGNwX3VkcHNyYywgInBvcnQiLCBydGNwX3VkcF9wb3J0LCBOVUxMKTsKKworICBhdWRpb19ydHBkZXBheWxvYWRlciA9CisgICAgICBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBwY21hZGVwYXkiLCAiYXVkaW9fcnRwZGVwYXlsb2FkZXIiKTsKKyAgYXVkaW9fZGVjb2RlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImFsYXdkZWMiLCBOVUxMKTsKKyAgYXVkaW9fc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1dG9hdWRpb3NpbmsiLCBOVUxMKTsKKworICB2aWRlb19ydHBkZXBheWxvYWRlciA9CisgICAgICBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHB2cmF3ZGVwYXkiLCAidmlkZW9fcnRwZGVwYXlsb2FkZXIiKTsKKyAgdmlkZW9fc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1dG92aWRlb3NpbmsiLCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHJlY3ZfcnRwX3VkcHNyYywgcmVjdl9ydGNwX3VkcHNyYywKKyAgICAgIGF1ZGlvX3J0cGRlcGF5bG9hZGVyLCBhdWRpb19kZWNvZGVyLCBhdWRpb19zaW5rLCB2aWRlb19ydHBkZXBheWxvYWRlciwKKyAgICAgIHZpZGVvX3NpbmssIE5VTEwpOworCisgIGdzdF9lbGVtZW50X2xpbmtfcGFkcyAoYXVkaW9fcnRwZGVwYXlsb2FkZXIsICJzcmMiLCBhdWRpb19kZWNvZGVyLCAic2luayIpOworICBnc3RfZWxlbWVudF9saW5rIChhdWRpb19kZWNvZGVyLCBhdWRpb19zaW5rKTsKKworICBnc3RfZWxlbWVudF9saW5rX3BhZHMgKHZpZGVvX3J0cGRlcGF5bG9hZGVyLCAic3JjIiwgdmlkZW9fc2luaywgInNpbmsiKTsKKworICAvKiByZXF1ZXN0IGEgc2luZ2xlIHJlY2VpdmluZyBSVFAgc2Vzc2lvbi4gKi8KKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzIChyZWN2X3J0Y3BfdWRwc3JjLCAic3JjIiwgcnRwYmluLCAicmVjdl9ydGNwX3NpbmtfMCIpOworICBnc3RfZWxlbWVudF9saW5rX3BhZHMgKHJlY3ZfcnRwX3VkcHNyYywgInNyYyIsIHJ0cGJpbiwgInJlY3ZfcnRwX3NpbmtfMCIpOworCisgIHNlbmRfYXVkaW9fcnRjcF91ZHBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc2luayIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNlbmRfYXVkaW9fcnRjcF91ZHBzaW5rLCAiaG9zdCIsICIxMjcuMC4wLjEiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzZW5kX2F1ZGlvX3J0Y3BfdWRwc2luaywgInBvcnQiLCBzZW5kX2F1ZGlvX3J0Y3BfcG9ydCwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc2VuZF9hdWRpb19ydGNwX3VkcHNpbmssICJzeW5jIiwgRkFMU0UsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNlbmRfYXVkaW9fcnRjcF91ZHBzaW5rLCAiYXN5bmMiLCBGQUxTRSwgTlVMTCk7CisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIHNlbmRfYXVkaW9fcnRjcF91ZHBzaW5rKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzIChydHBiaW4sICJzZW5kX3J0Y3Bfc3JjXzAiLCBzZW5kX2F1ZGlvX3J0Y3BfdWRwc2luaywKKyAgICAgICJzaW5rIik7CisKKyAgcmV0dXJuIHBpcGVsaW5lOworfQorCisvKgorICogVXNlZCB0byBnZW5lcmF0ZSBpbmZvcm1hdGl2ZSBtZXNzYWdlcyBkdXJpbmcgcGlwZWxpbmUgc3RhcnR1cAorICovCitzdGF0aWMgdm9pZAorY2Jfc3RhdGUgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIGdwb2ludGVyIGRhdGEpCit7CisgIEdzdE9iamVjdCAqcGlwZSA9IEdTVF9PQkpFQ1QgKGRhdGEpOworICBHc3RTdGF0ZSBvbGQsIG5ldywgcGVuZGluZzsKKyAgZ3N0X21lc3NhZ2VfcGFyc2Vfc3RhdGVfY2hhbmdlZCAobWVzc2FnZSwgJm9sZCwgJm5ldywgJnBlbmRpbmcpOworICBpZiAobWVzc2FnZS0+c3JjID09IHBpcGUpIHsKKyAgICBnX3ByaW50ICgiUGlwZWxpbmUgJXMgY2hhbmdlZCBzdGF0ZSBmcm9tICVzIHRvICVzXG4iLAorICAgICAgICBHU1RfT0JKRUNUX05BTUUgKG1lc3NhZ2UtPnNyYyksCisgICAgICAgIGdzdF9lbGVtZW50X3N0YXRlX2dldF9uYW1lIChvbGQpLCBnc3RfZWxlbWVudF9zdGF0ZV9nZXRfbmFtZSAobmV3KSk7CisgICAgaWYgKG9sZCA9PSBHU1RfU1RBVEVfUEFVU0VEICYmIG5ldyA9PSBHU1RfU1RBVEVfUExBWUlORykKKyAgICAgIEdTVF9ERUJVR19CSU5fVE9fRE9UX0ZJTEUgKEdTVF9CSU4gKHBpcGUpLCBHU1RfREVCVUdfR1JBUEhfU0hPV19BTEwsCisgICAgICAgICAgR1NUX09CSkVDVF9OQU1FIChtZXNzYWdlLT5zcmMpKTsKKyAgfQorfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgR3N0RWxlbWVudCAqcGlwZTsKKyAgR3N0QnVzICpidXM7CisgIEdNYWluTG9vcCAqbG9vcDsKKworICBnc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisKKyAgcGlwZSA9IGNyZWF0ZV9waXBlbGluZSAoKTsKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAocGlwZSk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGJ1cywgIm1lc3NhZ2U6OnN0YXRlLWNoYW5nZWQiLCBHX0NBTExCQUNLIChjYl9zdGF0ZSksIHBpcGUpOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2ggKGJ1cyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgZ19wcmludCAoInN0YXJ0aW5nIHNlcnZlciBwaXBlbGluZVxuIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgZ19wcmludCAoInN0b3BwaW5nIHNlcnZlciBwaXBlbGluZVxuIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZSwgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGUpOworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvbWVzb24uYnVpbGQgYi90ZXN0cy9leGFtcGxlcy9ydHAvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcyOGExMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9tZXNvbi5idWlsZApAQCAtMCwwICsxLDE2IEBACitydHBfcHJvZ3MgPSBbCisgICdzZXJ2ZXItYWxzYXNyYy1QQ01BJywKKyAgJ2NsaWVudC1QQ01BJywKKyAgJ2NsaWVudC1ydHBhdXgnLAorICAnc2VydmVyLXJ0cGF1eCcsCisgICdjbGllbnQtcnRwYnVuZGxlJywKKyAgJ3NlcnZlci1ydHBidW5kbGUnLAorXQorCitmb3JlYWNoIHByb2cgOiBydHBfcHJvZ3MKKyAgZXhlY3V0YWJsZShwcm9nLCBwcm9nICsgJy5jJywKKyAgICBkZXBlbmRlbmNpZXM6IFtnc3RydHBfZGVwLCBnc3RfZGVwLCBsaWJtXSwKKyAgICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICAgIGluc3RhbGw6IGZhbHNlKQorZW5kZm9yZWFjaApkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtSDI2M3AtQVRTLVBDTUEuc2ggYi90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLVZUUy1IMjYzcC1BVFMtUENNQS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YzczNmZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtSDI2M3AtQVRTLVBDTUEuc2gKQEAgLTAsMCArMSwxNiBAQAorIyEvYmluL3NoCisjCisjIEEgc2ltcGxlIFJUUCBzZXJ2ZXIgCisjCisKK1ZDQVBTPSJ2aWRlby94LXJhdyx3aWR0aD0zNTIsaGVpZ2h0PTI4OCxmcmFtZXJhdGU9MTUvMSIKKworZ3N0LWxhdW5jaC0xLjAgLXYgcnRwYmluIG5hbWU9cnRwYmluIFwKKyAgICAgICAgICAgdmlkZW90ZXN0c3JjICEgJFZDQVBTICEgYXZlbmNfaDI2M3AgISBydHBoMjYzcHBheSAhIHJ0cGJpbi5zZW5kX3J0cF9zaW5rXzAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgcnRwYmluLnNlbmRfcnRwX3NyY18wICEgdWRwc2luayBwb3J0PTUwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18wICEgdWRwc2luayBwb3J0PTUwMDEgc3luYz1mYWxzZSBhc3luYz1mYWxzZSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHVkcHNyYyBwb3J0PTUwMDUgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBhdWRpb3Rlc3RzcmMgc2FtcGxlc3BlcmJ1ZmZlcj0xMDAwICEgYWxhd2VuYyAhIHJ0cHBjbWFwYXkgISBydHBiaW4uc2VuZF9ydHBfc2lua18xICBcCisJICAgICAgICAgICAgIHJ0cGJpbi5zZW5kX3J0cF9zcmNfMSAhIHVkcHNpbmsgcG9ydD01MDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18xICEgdWRwc2luayBwb3J0PTUwMDMgc3luYz1mYWxzZSBhc3luYz1mYWxzZSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHVkcHNyYyBwb3J0PTUwMDcgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtSDI2M3Auc2ggYi90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLVZUUy1IMjYzcC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMmY5ODgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtSDI2M3Auc2gKQEAgLTAsMCArMSw0OSBAQAorIyEvYmluL3NoCisjCisjIEEgc2ltcGxlIFJUUCBzZXJ2ZXIgCisjICBzZW5kcyB0aGUgb3V0cHV0IG9mIHZpZGVvdGVzdHNyYyBhcyBoMjYzKyBlbmNvZGVkIFJUUCBvbiBwb3J0IDUwMDAsIFJUQ1AgaXMgc2VudCBvbgorIyAgcG9ydCA1MDAxLiBUaGUgZGVzdGluYXRpb24gaXMgMTI3LjAuMC4xLgorIyAgdGhlIHZpZGVvIHJlY2VpdmVyIFJUQ1AgcmVwb3J0cyBhcmUgcmVjZWl2ZWQgb24gcG9ydCA1MDA1CisjCisjIC4tLS0tLS0tLiAgICAuLS0tLS0tLS4gICAgLi0tLS0tLS0uICAgICAgLi0tLS0tLS0tLS0uICAgICAuLS0tLS0tLS4KKyMgfHZ0cyAgICB8ICAgIHxoMjYzZW5jfCAgICB8aDI2M3BheXwgICAgICB8IHJ0cGJpbiAgIHwgICAgIHx1ZHBzaW5rfCAgUlRQCisjIHwgICAgICBzcmMtPnNpbmsgICAgc3JjLT5zaW5rICAgIHNyYy0+c2VuZF9ydHAgc2VuZF9ydHAtPnNpbmsgICAgIHwgcG9ydD01MDAwCisjICctLS0tLS0tJyAgICAnLS0tLS0tLScgICAgJy0tLS0tLS0nICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLScKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIC4tLS0tLS0tLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgfHVkcHNpbmt8ICBSVENQCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBzZW5kX3J0Y3AtPnNpbmsgICAgIHwgcG9ydD01MDAxCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgLi0tLS0tLS0uICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLScgc3luYz1mYWxzZQorIyAgICAgICAgICAgICAgICBSVENQICAgICAgIHx1ZHBzcmMgfCAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgIGFzeW5jPWZhbHNlCisjICAgICAgICAgICAgICBwb3J0PTUwMDUgICAgfCAgICAgc3JjLT5yZWN2X3J0Y3AgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS0tLS0tLScgICAgICAnLS0tLS0tLS0tLScgICAgICAgICAgICAgIAorIworCisjIGNoYW5nZSB0aGlzIHRvIHNlbmQgdGhlIFJUUCBkYXRhIGFuZCBSVENQIHRvIGFub3RoZXIgaG9zdAorREVTVD0xMjcuMC4wLjEKKworIyB0dW5pbmcgcGFyYW1ldGVycyB0byBtYWtlIHRoZSBzZW5kZXIgc2VuZCB0aGUgc3RyZWFtcyBvdXQgb2Ygc3luYy4gQ2FuIGJlIHVzZWQKKyMgb3QgdGVzdCB0aGUgY2xpZW50IFJUQ1Agc3luY2hyb25pc2F0aW9uLiAKKyNWT0ZGU0VUPTkwMDAwMDAwMAorVk9GRlNFVD0wCitBT0ZGU0VUPTAKKworIyBIMjYzKyBlbmNvZGUgZnJvbSB0aGUgc291cmNlCitWRUxFTT0idmlkZW90ZXN0c3JjIGlzLWxpdmU9MSIKK1ZDQVBTPSJ2aWRlby94LXJhdyx3aWR0aD0zNTIsaGVpZ2h0PTI4OCxmcmFtZXJhdGU9MTUvMSIKK1ZTT1VSQ0U9IiRWRUxFTSAhICRWQ0FQUyIKK1ZFTkM9ImF2ZW5jX2gyNjNwICEgcnRwaDI2M3BwYXkiCisKK1ZSVFBTSU5LPSJ1ZHBzaW5rIHBvcnQ9NTAwMCBob3N0PSRERVNUIHRzLW9mZnNldD0kVk9GRlNFVCBuYW1lPXZydHBzaW5rIgorVlJUQ1BTSU5LPSJ1ZHBzaW5rIHBvcnQ9NTAwMSBob3N0PSRERVNUIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UgbmFtZT12cnRjcHNpbmsiCitWUlRDUFNSQz0idWRwc3JjIHBvcnQ9NTAwNSBuYW1lPXZydHBzcmMiCisKK1BJUEVMSU5FPSJydHBiaW4gbmFtZT1ydHBiaW4KKyAgICAgICAgICAgICRWU09VUkNFICEgJFZFTkMgISBydHBiaW4uc2VuZF9ydHBfc2lua18yCisJICAgICAgcnRwYmluLnNlbmRfcnRwX3NyY18yICEgJFZSVFBTSU5LIAorICAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18yICEgJFZSVENQU0lOSworICAgICAgICAgICAgJFZSVENQU1JDICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzIiCisKK2VjaG8gJFBJUEVMSU5FCisKK2dzdC1sYXVuY2gtMS4wIC12ICRQSVBFTElORQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtSDI2NC1ydHguc2ggYi90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLVZUUy1IMjY0LXJ0eC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZGIzZDIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtSDI2NC1ydHguc2gKQEAgLTAsMCArMSw0NyBAQAorIyEvYmluL3NoCisjCisjIEEgc2ltcGxlIFJUUCBzZXJ2ZXIgd2l0aCByZXRyYW5zbWlzc2lvbgorIyAgc2VuZHMgdGhlIG91dHB1dCBvZiB2aWRlb3Rlc3RzcmMgYXMgaDI2NCBlbmNvZGVkIFJUUCBvbiBwb3J0IDUwMDAsIFJUQ1AgaXMgc2VudCBvbgorIyAgcG9ydCA1MDAxLiBUaGUgZGVzdGluYXRpb24gaXMgMTI3LjAuMC4xLgorIyAgdGhlIHZpZGVvIHJlY2VpdmVyIFJUQ1AgcmVwb3J0cyBhcmUgcmVjZWl2ZWQgb24gcG9ydCA1MDA1CisjCisjICAuLS0tLS0tLS4gICAgLi0tLS0tLS0uICAgIC4tLS0tLS0tLiAgICAgIC4tLS0tLS0tLS0tLiAgICAgLi0tLS0tLS0uCisjICB8dmlkZW90c3wgICAgfGgyNjRlbmN8ICAgIHxoMjY0cGF5fCAgICAgIHwgcnRwYmluICAgfCAgICAgfHVkcHNpbmt8ICBSVFAKKyMgIHwgICAgICBzcmMtPnNpbmsgICAgc3JjLT5zaW5rICAgIHNyYy0+c2VuZF9ydHAgc2VuZF9ydHAtPnNpbmsgICAgIHwgcG9ydD01MDAwCisjICAnLS0tLS0tLScgICAgJy0tLS0tLS0nICAgICctLS0tLS0tJyAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0nCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIC4tLS0tLS0tLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgIHx1ZHBzaW5rfCAgUlRDUAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHNlbmRfcnRjcC0+c2luayAgICAgfCBwb3J0PTUwMDEKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi0tLS0tLS0uICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLScgc3luYz1mYWxzZQorIyAgICAgICAgICAgICAgICAgUlRDUCAgICAgICB8dWRwc3JjIHwgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICBhc3luYz1mYWxzZQorIyAgICAgICAgICAgICAgIHBvcnQ9NTAwNSAgICB8ICAgICBzcmMtPnJlY3ZfcnRjcCAgICAgIHwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tLS0tLS0nICAgICAgJy0tLS0tLS0tLS0nCisjCisjIGlkZWFsbHkgd2Ugc2hvdWxkIHRyYW5zcG9ydCB0aGUgcHJvcGVydGllcyBvbiB0aGUgUlRQIHVkcHNpbmsgcGFkcyB0byB0aGUKKyMgcmVjZWl2ZXIgaW4gb3JkZXIgdG8gdHJhbnNtaXQgdGhlIFNQUyBhbmQgUFBTIGVhcmxpZXIuCisKKyMgY2hhbmdlIHRoaXMgdG8gc2VuZCB0aGUgUlRQIGRhdGEgYW5kIFJUQ1AgdG8gYW5vdGhlciBob3N0CitERVNUPTEyNy4wLjAuMQorCisjIHR1bmluZyBwYXJhbWV0ZXJzIHRvIG1ha2UgdGhlIHNlbmRlciBzZW5kIHRoZSBzdHJlYW1zIG91dCBvZiBzeW5jLiBDYW4gYmUgdXNlZAorIyBvdCB0ZXN0IHRoZSBjbGllbnQgUlRDUCBzeW5jaHJvbmlzYXRpb24uCisjVk9GRlNFVD05MDAwMDAwMDAKK1ZPRkZTRVQ9MAorQU9GRlNFVD0wCisKKyMgSDI2NCBlbmNvZGUgZnJvbSB0aGUgc291cmNlCitWRUxFTT0idmlkZW90ZXN0c3JjIGlzLWxpdmU9MSBob3Jpem9udGFsLXNwZWVkPTEiCitWQ0FQUz0idmlkZW8veC1yYXcsd2lkdGg9MzUyLGhlaWdodD0yODgsZnJhbWVyYXRlPTE1LzEiCitWU09VUkNFPSIkVkVMRU0gISAkVkNBUFMiCitWRU5DPSJ4MjY0ZW5jIHR1bmU9emVyb2xhdGVuY3kgYml0cmF0ZT0zMDAgISBydHBoMjY0cGF5IGNvbmZpZy1pbnRlcnZhbD0yIgorCitWUlRQU0lOSz0idWRwc2luayBwb3J0PTUwMDAgaG9zdD0kREVTVCB0cy1vZmZzZXQ9JFZPRkZTRVQgbmFtZT12cnRwc2luayIKK1ZSVENQU0lOSz0idWRwc2luayBwb3J0PTUwMDEgaG9zdD0kREVTVCBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlIG5hbWU9dnJ0Y3BzaW5rIgorVlJUQ1BTUkM9InVkcHNyYyBwb3J0PTUwMDUgbmFtZT12cnRwc3JjIgorCitnc3QtbGF1bmNoLTEuMCAtdiBydHBiaW4gbmFtZT1ydHBiaW4gcnRwLXByb2ZpbGU9YXZwZiBcCisgICAgJFZTT1VSQ0UgISAkVkVOQyAhIHJ0cHJ0eHF1ZXVlICEgcnRwYmluLnNlbmRfcnRwX3NpbmtfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJ0cGJpbi5zZW5kX3J0cF9zcmNfMCAhIGlkZW50aXR5IGRyb3AtcHJvYmFiaWxpdHk9MC4xICEgJFZSVFBTSU5LICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJ0cGJpbi5zZW5kX3J0Y3Bfc3JjXzAgISAkVlJUQ1BTSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAkVlJUQ1BTUkMgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMApkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtVlA4LUFUUy1PUFVTLnNoIGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1WVFMtVlA4LUFUUy1PUFVTLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVmODcwMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLVZUUy1WUDgtQVRTLU9QVVMuc2gKQEAgLTAsMCArMSwxOCBAQAorIyEvYmluL3NoCisjCisjIEEgc2ltcGxlIFJUUCBzZXJ2ZXIgCisjCisKK1NSQz1sb2NhbGhvc3QKK0RFU1Q9bG9jYWxob3N0CitWQ0FQUz0idmlkZW8veC1yYXcsd2lkdGg9MzUyLGhlaWdodD0yODgsZnJhbWVyYXRlPTE1LzEiCisKK2dzdC1sYXVuY2gtMS4wIC12IHJ0cGJpbiBuYW1lPXJ0cGJpbiBcCisgICAgICAgICAgIHZpZGVvdGVzdHNyYyAhICRWQ0FQUyAhIHZwOGVuYyAhIHJ0cHZwOHBheSAhIHJ0cGJpbi5zZW5kX3J0cF9zaW5rXzAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgcnRwYmluLnNlbmRfcnRwX3NyY18wICEgdWRwc2luayBob3N0PSRERVNUIHBvcnQ9NTAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHJ0cGJpbi5zZW5kX3J0Y3Bfc3JjXzAgISB1ZHBzaW5rIGhvc3Q9JERFU1QgcG9ydD01MDAxIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICB1ZHBzcmMgYWRkcmVzcz0kU1JDICBwb3J0PTUwMDUgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBhdWRpb3Rlc3RzcmMgISBvcHVzZW5jICEgcnRwb3B1c3BheSAhIHJ0cGJpbi5zZW5kX3J0cF9zaW5rXzEgIFwKKwkgICAgICAgICAgICAgcnRwYmluLnNlbmRfcnRwX3NyY18xICEgdWRwc2luayBob3N0PSRERVNUIHBvcnQ9NTAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMSAhIHVkcHNpbmsgaG9zdD0kREVTVCBwb3J0PTUwMDMgc3luYz1mYWxzZSBhc3luYz1mYWxzZSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHVkcHNyYyBhZGRyZXNzPSRTUkMgcG9ydD01MDA3ICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzEKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLmMgYi90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWFsc2FzcmMtUENNQS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOGY3ZGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWFsc2FzcmMtUENNQS5jCkBAIC0wLDAgKzEsMjI1IEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOSBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIEZJWE1FIDAuMTE6IHN1cHByZXNzIHdhcm5pbmdzIGZvciBkZXByZWNhdGVkIEFQSSBzdWNoIGFzIEdWYWx1ZUFycmF5CisgKiB3aXRoIG5ld2VyIEdMaWIgdmVyc2lvbnMgKD49IDIuMzEuMCkgKi8KKyNkZWZpbmUgR0xJQl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKKy8qCisgKiBBIHNpbXBsZSBSVFAgc2VydmVyIAorICogIHNlbmRzIHRoZSBvdXRwdXQgb2YgYWxzYXNyYyBhcyBhbGF3IGVuY29kZWQgUlRQIG9uIHBvcnQgNTAwMiwgUlRDUCBpcyBzZW50IG9uCisgKiAgcG9ydCA1MDAzLiBUaGUgZGVzdGluYXRpb24gaXMgMTI3LjAuMC4xLgorICogIHRoZSByZWNlaXZlciBSVENQIHJlcG9ydHMgYXJlIHJlY2VpdmVkIG9uIHBvcnQgNTAwNworICoKKyAqIC4tLS0tLS0tLiAgICAuLS0tLS0tLS4gICAgLi0tLS0tLS0uICAgICAgLi0tLS0tLS0tLS0uICAgICAuLS0tLS0tLS4KKyAqIHxhbHNhc3JjfCAgICB8YWxhd2VuY3wgICAgfHBjbWFwYXl8ICAgICAgfCBydHBiaW4gICB8ICAgICB8dWRwc2lua3wgIFJUUAorICogfCAgICAgIHNyYy0+c2luayAgICBzcmMtPnNpbmsgICAgc3JjLT5zZW5kX3J0cCBzZW5kX3J0cC0+c2luayAgICAgfCBwb3J0PTUwMDIKKyAqICctLS0tLS0tJyAgICAnLS0tLS0tLScgICAgJy0tLS0tLS0nICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLScKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgLi0tLS0tLS0uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgfHVkcHNpbmt8ICBSVENQCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgc2VuZF9ydGNwLT5zaW5rICAgICB8IHBvcnQ9NTAwMworICogICAgICAgICAgICAgICAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tJyBzeW5jPWZhbHNlCisgKiAgICAgICAgICAgICAgICBSVENQICAgICAgIHx1ZHBzcmMgfCAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgIGFzeW5jPWZhbHNlCisgKiAgICAgICAgICAgICAgcG9ydD01MDA3ICAgIHwgICAgIHNyYy0+cmVjdl9ydGNwICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICctLS0tLS0tJyAgICAgICctLS0tLS0tLS0tJyAgICAgICAgICAgICAgCisgKi8KKworLyogY2hhbmdlIHRoaXMgdG8gc2VuZCB0aGUgUlRQIGRhdGEgYW5kIFJUQ1AgdG8gYW5vdGhlciBob3N0ICovCisjZGVmaW5lIERFU1RfSE9TVCAiMTI3LjAuMC4xIgorCisvKiAjZGVmaW5lIEFVRElPX1NSQyAgImFsc2FzcmMiICovCisjZGVmaW5lIEFVRElPX1NSQyAgImF1ZGlvdGVzdHNyYyIKKworLyogdGhlIGVuY29kZXIgYW5kIHBheWxvYWRlciBlbGVtZW50cyAqLworI2RlZmluZSBBVURJT19FTkMgICJhbGF3ZW5jIgorI2RlZmluZSBBVURJT19QQVkgICJydHBwY21hcGF5IgorCisvKiBwcmludCB0aGUgc3RhdHMgb2YgYSBzb3VyY2UgKi8KK3N0YXRpYyB2b2lkCitwcmludF9zb3VyY2Vfc3RhdHMgKEdPYmplY3QgKiBzb3VyY2UpCit7CisgIEdzdFN0cnVjdHVyZSAqc3RhdHM7CisgIGdjaGFyICpzdHI7CisKKyAgLyogZ2V0IHRoZSBzb3VyY2Ugc3RhdHMgKi8KKyAgZ19vYmplY3RfZ2V0IChzb3VyY2UsICJzdGF0cyIsICZzdGF0cywgTlVMTCk7CisKKyAgLyogc2ltcGx5IGR1bXAgdGhlIHN0YXRzIHN0cnVjdHVyZSAqLworICBzdHIgPSBnc3Rfc3RydWN0dXJlX3RvX3N0cmluZyAoc3RhdHMpOworICBnX3ByaW50ICgic291cmNlIHN0YXRzOiAlc1xuIiwgc3RyKTsKKworICBnc3Rfc3RydWN0dXJlX2ZyZWUgKHN0YXRzKTsKKyAgZ19mcmVlIChzdHIpOworfQorCisvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBldmVyeSBzZWNvbmQgYW5kIGR1bXBzIHRoZSBSVFAgbWFuYWdlciBzdGF0cyAqLworc3RhdGljIGdib29sZWFuCitwcmludF9zdGF0cyAoR3N0RWxlbWVudCAqIHJ0cGJpbikKK3sKKyAgR09iamVjdCAqc2Vzc2lvbjsKKyAgR1ZhbHVlQXJyYXkgKmFycjsKKyAgR1ZhbHVlICp2YWw7CisgIGd1aW50IGk7CisKKyAgZ19wcmludCAoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKworICAvKiBnZXQgc2Vzc2lvbiAwICovCisgIGdfc2lnbmFsX2VtaXRfYnlfbmFtZSAocnRwYmluLCAiZ2V0LWludGVybmFsLXNlc3Npb24iLCAwLCAmc2Vzc2lvbik7CisKKyAgLyogcHJpbnQgYWxsIHRoZSBzb3VyY2VzIGluIHRoZSBzZXNzaW9uLCB0aGlzIGluY2x1ZGVzIHRoZSBpbnRlcm5hbCBzb3VyY2UgKi8KKyAgZ19vYmplY3RfZ2V0IChzZXNzaW9uLCAic291cmNlcyIsICZhcnIsIE5VTEwpOworCisgIGZvciAoaSA9IDA7IGkgPCBhcnItPm5fdmFsdWVzOyBpKyspIHsKKyAgICBHT2JqZWN0ICpzb3VyY2U7CisKKyAgICB2YWwgPSBnX3ZhbHVlX2FycmF5X2dldF9udGggKGFyciwgaSk7CisgICAgc291cmNlID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWwpOworCisgICAgcHJpbnRfc291cmNlX3N0YXRzIChzb3VyY2UpOworICB9CisgIGdfdmFsdWVfYXJyYXlfZnJlZSAoYXJyKTsKKworICBnX29iamVjdF91bnJlZiAoc2Vzc2lvbik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGJ1aWxkIGEgcGlwZWxpbmUgZXF1aXZhbGVudCB0bzoKKyAqCisgKiBnc3QtbGF1bmNoLTEuMCAtdiBydHBiaW4gbmFtZT1ydHBiaW4gXAorICogICAgJEFVRElPX1NSQyAhIGF1ZGlvY29udmVydCAhIGF1ZGlvcmVzYW1wbGUgISAkQVVESU9fRU5DICEgJEFVRElPX1BBWSAhIHJ0cGJpbi5zZW5kX3J0cF9zaW5rXzAgIFwKKyAqICAgICAgICAgICBydHBiaW4uc2VuZF9ydHBfc3JjXzAgISB1ZHBzaW5rIHBvcnQ9NTAwMiBob3N0PSRERVNUICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18wICEgdWRwc2luayBwb3J0PTUwMDMgaG9zdD0kREVTVCBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlIFwKKyAqICAgICAgICB1ZHBzcmMgcG9ydD01MDA3ICEgcnRwYmluLnJlY3ZfcnRjcF9zaW5rXzAKKyAqLworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBHc3RFbGVtZW50ICphdWRpb3NyYywgKmF1ZGlvY29udiwgKmF1ZGlvcmVzLCAqYXVkaW9lbmMsICphdWRpb3BheTsKKyAgR3N0RWxlbWVudCAqcnRwYmluLCAqcnRwc2luaywgKnJ0Y3BzaW5rLCAqcnRjcHNyYzsKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmU7CisgIEdNYWluTG9vcCAqbG9vcDsKKyAgR3N0UGFkICpzcmNwYWQsICpzaW5rcGFkOworCisgIC8qIGFsd2F5cyBpbml0IGZpcnN0ICovCisgIGdzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIC8qIHRoZSBwaXBlbGluZSB0byBob2xkIGV2ZXJ5dGhpbmcgKi8KKyAgcGlwZWxpbmUgPSBnc3RfcGlwZWxpbmVfbmV3IChOVUxMKTsKKyAgZ19hc3NlcnQgKHBpcGVsaW5lKTsKKworICAvKiB0aGUgYXVkaW8gY2FwdHVyZSBhbmQgZm9ybWF0IGNvbnZlcnNpb24gKi8KKyAgYXVkaW9zcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKEFVRElPX1NSQywgImF1ZGlvc3JjIik7CisgIGdfYXNzZXJ0IChhdWRpb3NyYyk7CisgIGF1ZGlvY29udiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvY29udmVydCIsICJhdWRpb2NvbnYiKTsKKyAgZ19hc3NlcnQgKGF1ZGlvY29udik7CisgIGF1ZGlvcmVzID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW9yZXNhbXBsZSIsICJhdWRpb3JlcyIpOworICBnX2Fzc2VydCAoYXVkaW9yZXMpOworICAvKiB0aGUgZW5jb2RpbmcgYW5kIHBheWxvYWRpbmcgKi8KKyAgYXVkaW9lbmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKEFVRElPX0VOQywgImF1ZGlvZW5jIik7CisgIGdfYXNzZXJ0IChhdWRpb2VuYyk7CisgIGF1ZGlvcGF5ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlIChBVURJT19QQVksICJhdWRpb3BheSIpOworICBnX2Fzc2VydCAoYXVkaW9wYXkpOworCisgIC8qIGFkZCBjYXB0dXJlIGFuZCBwYXlsb2FkaW5nIHRvIHRoZSBwaXBlbGluZSBhbmQgbGluayAqLworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIGF1ZGlvc3JjLCBhdWRpb2NvbnYsIGF1ZGlvcmVzLAorICAgICAgYXVkaW9lbmMsIGF1ZGlvcGF5LCBOVUxMKTsKKworICBpZiAoIWdzdF9lbGVtZW50X2xpbmtfbWFueSAoYXVkaW9zcmMsIGF1ZGlvY29udiwgYXVkaW9yZXMsIGF1ZGlvZW5jLAorICAgICAgICAgIGF1ZGlvcGF5LCBOVUxMKSkgeworICAgIGdfZXJyb3IgKCJGYWlsZWQgdG8gbGluayBhdWRpb3NyYywgYXVkaW9jb252LCBhdWRpb3Jlc2FtcGxlLCAiCisgICAgICAgICJhdWRpbyBlbmNvZGVyIGFuZCBhdWRpbyBwYXlsb2FkZXIiKTsKKyAgfQorCisgIC8qIHRoZSBydHBiaW4gZWxlbWVudCAqLworICBydHBiaW4gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBiaW4iLCAicnRwYmluIik7CisgIGdfYXNzZXJ0IChydHBiaW4pOworCisgIGdzdF9iaW5fYWRkIChHU1RfQklOIChwaXBlbGluZSksIHJ0cGJpbik7CisKKyAgLyogdGhlIHVkcCBzaW5rcyBhbmQgc291cmNlIHdlIHdpbGwgdXNlIGZvciBSVFAgYW5kIFJUQ1AgKi8KKyAgcnRwc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNpbmsiLCAicnRwc2luayIpOworICBnX2Fzc2VydCAocnRwc2luayk7CisgIGdfb2JqZWN0X3NldCAocnRwc2luaywgInBvcnQiLCA1MDAyLCAiaG9zdCIsIERFU1RfSE9TVCwgTlVMTCk7CisKKyAgcnRjcHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzaW5rIiwgInJ0Y3BzaW5rIik7CisgIGdfYXNzZXJ0IChydGNwc2luayk7CisgIGdfb2JqZWN0X3NldCAocnRjcHNpbmssICJwb3J0IiwgNTAwMywgImhvc3QiLCBERVNUX0hPU1QsIE5VTEwpOworICAvKiBubyBuZWVkIGZvciBzeW5jaHJvbmlzYXRpb24gb3IgcHJlcm9sbCBvbiB0aGUgUlRDUCBzaW5rICovCisgIGdfb2JqZWN0X3NldCAocnRjcHNpbmssICJhc3luYyIsIEZBTFNFLCAic3luYyIsIEZBTFNFLCBOVUxMKTsKKworICBydGNwc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc3JjIiwgInJ0Y3BzcmMiKTsKKyAgZ19hc3NlcnQgKHJ0Y3BzcmMpOworICBnX29iamVjdF9zZXQgKHJ0Y3BzcmMsICJwb3J0IiwgNTAwNywgTlVMTCk7CisKKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBydHBzaW5rLCBydGNwc2luaywgcnRjcHNyYywgTlVMTCk7CisKKyAgLyogbm93IGxpbmsgYWxsIHRvIHRoZSBydHBiaW4sIHN0YXJ0IGJ5IGdldHRpbmcgYW4gUlRQIHNpbmtwYWQgZm9yIHNlc3Npb24gMCAqLworICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBiaW4sICJzZW5kX3J0cF9zaW5rXzAiKTsKKyAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKGF1ZGlvcGF5LCAic3JjIik7CisgIGlmIChnc3RfcGFkX2xpbmsgKHNyY3BhZCwgc2lua3BhZCkgIT0gR1NUX1BBRF9MSU5LX09LKQorICAgIGdfZXJyb3IgKCJGYWlsZWQgdG8gbGluayBhdWRpbyBwYXlsb2FkZXIgdG8gcnRwYmluIik7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyY3BhZCk7CisKKyAgLyogZ2V0IHRoZSBSVFAgc3JjcGFkIHRoYXQgd2FzIGNyZWF0ZWQgd2hlbiB3ZSByZXF1ZXN0ZWQgdGhlIHNpbmtwYWQgYWJvdmUgYW5kCisgICAqIGxpbmsgaXQgdG8gdGhlIHJ0cHNpbmsgc2lua3BhZCovCisgIHNyY3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydHBiaW4sICJzZW5kX3J0cF9zcmNfMCIpOworICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHJ0cHNpbmssICJzaW5rIik7CisgIGlmIChnc3RfcGFkX2xpbmsgKHNyY3BhZCwgc2lua3BhZCkgIT0gR1NUX1BBRF9MSU5LX09LKQorICAgIGdfZXJyb3IgKCJGYWlsZWQgdG8gbGluayBydHBiaW4gdG8gcnRwc2luayIpOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKworICAvKiBnZXQgYW4gUlRDUCBzcmNwYWQgZm9yIHNlbmRpbmcgUlRDUCB0byB0aGUgcmVjZWl2ZXIgKi8KKyAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBiaW4sICJzZW5kX3J0Y3Bfc3JjXzAiKTsKKyAgc2lua3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChydGNwc2luaywgInNpbmsiKTsKKyAgaWYgKGdzdF9wYWRfbGluayAoc3JjcGFkLCBzaW5rcGFkKSAhPSBHU1RfUEFEX0xJTktfT0spCisgICAgZ19lcnJvciAoIkZhaWxlZCB0byBsaW5rIHJ0cGJpbiB0byBydGNwc2luayIpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rcGFkKTsKKworICAvKiB3ZSBhbHNvIHdhbnQgdG8gcmVjZWl2ZSBSVENQLCByZXF1ZXN0IGFuIFJUQ1Agc2lua3BhZCBmb3Igc2Vzc2lvbiAwIGFuZAorICAgKiBsaW5rIGl0IHRvIHRoZSBzcmNwYWQgb2YgdGhlIHVkcHNyYyBmb3IgUlRDUCAqLworICBzcmNwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocnRjcHNyYywgInNyYyIpOworICBzaW5rcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3JlcXVlc3RfcGFkIChydHBiaW4sICJyZWN2X3J0Y3Bfc2lua18wIik7CisgIGlmIChnc3RfcGFkX2xpbmsgKHNyY3BhZCwgc2lua3BhZCkgIT0gR1NUX1BBRF9MSU5LX09LKQorICAgIGdfZXJyb3IgKCJGYWlsZWQgdG8gbGluayBydGNwc3JjIHRvIHJ0cGJpbiIpOworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworCisgIC8qIHNldCB0aGUgcGlwZWxpbmUgdG8gcGxheWluZyAqLworICBnX3ByaW50ICgic3RhcnRpbmcgc2VuZGVyIHBpcGVsaW5lXG4iKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIC8qIHByaW50IHN0YXRzIGV2ZXJ5IHNlY29uZCAqLworICBnX3RpbWVvdXRfYWRkX3NlY29uZHMgKDEsIChHU291cmNlRnVuYykgcHJpbnRfc3RhdHMsIHJ0cGJpbik7CisKKyAgLyogd2UgbmVlZCB0byBydW4gYSBHTGliIG1haW4gbG9vcCB0byBnZXQgdGhlIG1lc3NhZ2VzICovCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKworICBnX3ByaW50ICgic3RvcHBpbmcgc2VuZGVyIHBpcGVsaW5lXG4iKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1hbHNhc3JjLVBDTUEucHkgYi90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWFsc2FzcmMtUENNQS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNzI3NmE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1hbHNhc3JjLVBDTUEucHkKQEAgLTAsMCArMSw5OCBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgZ2kKK2ltcG9ydCBzeXMKK2dpLnJlcXVpcmVfdmVyc2lvbignR3N0JywgJzEuMCcpCitmcm9tIGdpLnJlcG9zaXRvcnkgaW1wb3J0IEdPYmplY3QsIEdzdAorCisKKyNnc3QtbGF1bmNoIC12IHJ0cGJpbiBuYW1lPXJ0cGJpbiBhdWRpb3Rlc3RzcmMgISBhdWRpb2NvbnZlcnQgISBhbGF3ZW5jICEgcnRwcGNtYXBheSAhIHJ0cGJpbi5zZW5kX3J0cF9zaW5rXzAgXAorIyAgICAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydHBfc3JjXzAgISB1ZHBzaW5rIHBvcnQ9MTAwMDAgaG9zdD14eHgueHh4Lnh4eC54eHggXAorIyAgICAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18wICEgdWRwc2luayBwb3J0PTEwMDAxIGhvc3Q9eHh4Lnh4eC54eHgueHh4IHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UgXAorIyAgICAgICAgICAgICAgICB1ZHBzcmMgcG9ydD0xMDAwMiAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18wCisKK0RFU1RfSE9TVCA9ICcxMjcuMC4wLjEnCisKK0FVRElPX1NSQyA9ICdhdWRpb3Rlc3RzcmMnCitBVURJT19FTkMgPSAnYWxhd2VuYycKK0FVRElPX1BBWSA9ICdydHBwY21hcGF5JworCitSVFBfU0VORF9QT1JUID0gNTAwMgorUlRDUF9TRU5EX1BPUlQgPSA1MDAzCitSVENQX1JFQ1ZfUE9SVCA9IDUwMDcKKworR09iamVjdC50aHJlYWRzX2luaXQoKQorR3N0LmluaXQoc3lzLmFyZ3YpCisKKyMgdGhlIHBpcGVsaW5lIHRvIGhvbGQgZXZlcnl0aGluZworcGlwZWxpbmUgPSBHc3QuUGlwZWxpbmUoJ3J0cF9zZXJ2ZXInKQorCisjIHRoZSBwaXBlbGluZSB0byBob2xkIGV2ZXJ5dGhpbmcKK2F1ZGlvc3JjID0gR3N0LkVsZW1lbnRGYWN0b3J5Lm1ha2UoQVVESU9fU1JDLCAnYXVkaW9zcmMnKQorYXVkaW9jb252ID0gR3N0LkVsZW1lbnRGYWN0b3J5Lm1ha2UoJ2F1ZGlvY29udmVydCcsICdhdWRpb2NvbnYnKQorYXVkaW9yZXMgPSBHc3QuRWxlbWVudEZhY3RvcnkubWFrZSgnYXVkaW9yZXNhbXBsZScsICdhdWRpb3JlcycpCisKKyMgdGhlIHBpcGVsaW5lIHRvIGhvbGQgZXZlcnl0aGluZworYXVkaW9lbmMgPSBHc3QuRWxlbWVudEZhY3RvcnkubWFrZShBVURJT19FTkMsICdhdWRpb2VuYycpCithdWRpb3BheSA9IEdzdC5FbGVtZW50RmFjdG9yeS5tYWtlKEFVRElPX1BBWSwgJ2F1ZGlvcGF5JykKKworIyBhZGQgY2FwdHVyZSBhbmQgcGF5bG9hZGluZyB0byB0aGUgcGlwZWxpbmUgYW5kIGxpbmsKK3BpcGVsaW5lLmFkZChhdWRpb3NyYywgYXVkaW9jb252LCBhdWRpb3JlcywgYXVkaW9lbmMsIGF1ZGlvcGF5KQorCithdWRpb3NyYy5saW5rKGF1ZGlvY29udikKK2F1ZGlvY29udi5saW5rKGF1ZGlvcmVzKQorYXVkaW9yZXMubGluayhhdWRpb2VuYykKK2F1ZGlvZW5jLmxpbmsoYXVkaW9wYXkpCisKKyMgdGhlIHJ0cGJpbiBlbGVtZW50CitydHBiaW4gPSBHc3QuRWxlbWVudEZhY3RvcnkubWFrZSgncnRwYmluJywgJ3J0cGJpbicpCisKK3BpcGVsaW5lLmFkZChydHBiaW4pCisKKyMgdGhlIHVkcCBzaW5rcyBhbmQgc291cmNlIHdlIHdpbGwgdXNlIGZvciBSVFAgYW5kIFJUQ1AKK3J0cHNpbmsgPSBHc3QuRWxlbWVudEZhY3RvcnkubWFrZSgndWRwc2luaycsICdydHBzaW5rJykKK3J0cHNpbmsuc2V0X3Byb3BlcnR5KCdwb3J0JywgUlRQX1NFTkRfUE9SVCkKK3J0cHNpbmsuc2V0X3Byb3BlcnR5KCdob3N0JywgREVTVF9IT1NUKQorCitydGNwc2luayA9IEdzdC5FbGVtZW50RmFjdG9yeS5tYWtlKCd1ZHBzaW5rJywgJ3J0Y3BzaW5rJykKK3J0Y3BzaW5rLnNldF9wcm9wZXJ0eSgncG9ydCcsIFJUQ1BfU0VORF9QT1JUKQorcnRjcHNpbmsuc2V0X3Byb3BlcnR5KCdob3N0JywgREVTVF9IT1NUKQorIyBubyBuZWVkIGZvciBzeW5jaHJvbmlzYXRpb24gb3IgcHJlcm9sbCBvbiB0aGUgUlRDUCBzaW5rCitydGNwc2luay5zZXRfcHJvcGVydHkoJ2FzeW5jJywgRmFsc2UpCitydGNwc2luay5zZXRfcHJvcGVydHkoJ3N5bmMnLCBGYWxzZSkKKworcnRjcHNyYyA9IEdzdC5FbGVtZW50RmFjdG9yeS5tYWtlKCd1ZHBzcmMnLCAncnRjcHNyYycpCitydGNwc3JjLnNldF9wcm9wZXJ0eSgncG9ydCcsIFJUQ1BfUkVDVl9QT1JUKQorCitwaXBlbGluZS5hZGQocnRwc2luaywgcnRjcHNpbmssIHJ0Y3BzcmMpCisKKyMgbm93IGxpbmsgYWxsIHRvIHRoZSBydHBiaW4sIHN0YXJ0IGJ5IGdldHRpbmcgYW4gUlRQIHNpbmtwYWQgZm9yIHNlc3Npb24gMAorc2lua3BhZCA9IEdzdC5FbGVtZW50LmdldF9yZXF1ZXN0X3BhZChydHBiaW4sICdzZW5kX3J0cF9zaW5rXzAnKQorc3JjcGFkID0gR3N0LkVsZW1lbnQuZ2V0X3N0YXRpY19wYWQoYXVkaW9wYXksICdzcmMnKQorbHJlcyA9IEdzdC5QYWQubGluayhzcmNwYWQsIHNpbmtwYWQpCisKKyMgZ2V0IHRoZSBSVFAgc3JjcGFkIHRoYXQgd2FzIGNyZWF0ZWQgd2hlbiB3ZSByZXF1ZXN0ZWQgdGhlIHNpbmtwYWQgYWJvdmUgYW5kCisjIGxpbmsgaXQgdG8gdGhlIHJ0cHNpbmsgc2lua3BhZAorc3JjcGFkID0gR3N0LkVsZW1lbnQuZ2V0X3N0YXRpY19wYWQocnRwYmluLCAnc2VuZF9ydHBfc3JjXzAnKQorc2lua3BhZCA9IEdzdC5FbGVtZW50LmdldF9zdGF0aWNfcGFkKHJ0cHNpbmssICdzaW5rJykKK2xyZXMgPSBHc3QuUGFkLmxpbmsoc3JjcGFkLCBzaW5rcGFkKQorCisjIGdldCBhbiBSVENQIHNyY3BhZCBmb3Igc2VuZGluZyBSVENQIHRvIHRoZSByZWNlaXZlcgorc3JjcGFkID0gR3N0LkVsZW1lbnQuZ2V0X3JlcXVlc3RfcGFkKHJ0cGJpbiwgJ3NlbmRfcnRjcF9zcmNfMCcpCitzaW5rcGFkID0gR3N0LkVsZW1lbnQuZ2V0X3N0YXRpY19wYWQocnRjcHNpbmssICdzaW5rJykKK2xyZXMgPSBHc3QuUGFkLmxpbmsoc3JjcGFkLCBzaW5rcGFkKQorCisjIHdlIGFsc28gd2FudCB0byByZWNlaXZlIFJUQ1AsIHJlcXVlc3QgYW4gUlRDUCBzaW5rcGFkIGZvciBzZXNzaW9uIDAgYW5kCisjIGxpbmsgaXQgdG8gdGhlIHNyY3BhZCBvZiB0aGUgdWRwc3JjIGZvciBSVENQCitzcmNwYWQgPSBHc3QuRWxlbWVudC5nZXRfc3RhdGljX3BhZChydGNwc3JjLCAnc3JjJykKK3NpbmtwYWQgPSBHc3QuRWxlbWVudC5nZXRfcmVxdWVzdF9wYWQocnRwYmluLCAncmVjdl9ydGNwX3NpbmtfMCcpCitscmVzID0gR3N0LlBhZC5saW5rKHNyY3BhZCwgc2lua3BhZCkKKworIyBzZXQgdGhlIHBpcGVsaW5lIHRvIHBsYXlpbmcKK0dzdC5FbGVtZW50LnNldF9zdGF0ZShwaXBlbGluZSwgR3N0LlN0YXRlLlBMQVlJTkcpCisKKyMgd2UgbmVlZCB0byBydW4gYSBHTGliIG1haW4gbG9vcCB0byBnZXQgdGhlIG1lc3NhZ2VzCittYWlubG9vcCA9IEdPYmplY3QuTWFpbkxvb3AoKQorbWFpbmxvb3AucnVuKCkKKworR3N0LkVsZW1lbnQuc2V0X3N0YXRlKHBpcGVsaW5lLCBHc3QuU3RhdGUuTlVMTCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLnNoIGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1hbHNhc3JjLVBDTUEuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWFmZTA5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItYWxzYXNyYy1QQ01BLnNoCkBAIC0wLDAgKzEsMzUgQEAKKyMhL2Jpbi9zaAorIworIyBBIHNpbXBsZSBSVFAgc2VydmVyCisjICBzZW5kcyB0aGUgb3V0cHV0IG9mIGF1dG9hdWRpb3NyYyBhcyBhbGF3IGVuY29kZWQgUlRQIG9uIHBvcnQgNTAwMiwgUlRDUCBpcyBzZW50IG9uCisjICBwb3J0IDUwMDMuIFRoZSBkZXN0aW5hdGlvbiBpcyAxMjcuMC4wLjEuCisjICB0aGUgcmVjZWl2ZXIgUlRDUCByZXBvcnRzIGFyZSByZWNlaXZlZCBvbiBwb3J0IDUwMDcKKyMKKyMgLi0tLS0tLS0tLiAgICAuLS0tLS0tLS4gICAgLi0tLS0tLS0uICAgICAgLi0tLS0tLS0tLS0uICAgICAuLS0tLS0tLS4KKyMgfGF1ZGlvc3JjfCAgICB8YWxhd2VuY3wgICAgfHBjbWFwYXl8ICAgICAgfCBydHBiaW4gICB8ICAgICB8dWRwc2lua3wgIFJUUAorIyB8ICAgICAgIHNyYy0+c2luayAgICBzcmMtPnNpbmsgICAgc3JjLT5zZW5kX3J0cCBzZW5kX3J0cC0+c2luayAgICAgfCBwb3J0PTUwMDIKKyMgJy0tLS0tLS0tJyAgICAnLS0tLS0tLScgICAgJy0tLS0tLS0nICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLScKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgLi0tLS0tLS0uCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgfHVkcHNpbmt8ICBSVENQCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgc2VuZF9ydGNwLT5zaW5rICAgICB8IHBvcnQ9NTAwMworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tJyBzeW5jPWZhbHNlCisjICAgICAgICAgICAgICAgICBSVENQICAgICAgIHx1ZHBzcmMgfCAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgIGFzeW5jPWZhbHNlCisjICAgICAgICAgICAgICAgcG9ydD01MDA3ICAgIHwgICAgIHNyYy0+cmVjdl9ydGNwICAgICAgfAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS0tLS0tLScgICAgICAnLS0tLS0tLS0tLScKKworIyBjaGFuZ2UgdGhpcyB0byBzZW5kIHRoZSBSVFAgZGF0YSBhbmQgUlRDUCB0byBhbm90aGVyIGhvc3QKK0RFU1Q9MTI3LjAuMC4xCisKKyNBRUxFTT1hdXRvYXVkaW9zcmMKK0FFTEVNPWF1ZGlvdGVzdHNyYworCisjIFBDTUEgZW5jb2RlIGZyb20gYW4gdGhlIHNvdXJjZQorQVNPVVJDRT0iJEFFTEVNICEgYXVkaW9jb252ZXJ0IgorQUVOQz0iYWxhd2VuYyAhIHJ0cHBjbWFwYXkiCisKK2dzdC1sYXVuY2gtMS4wIC12IHJ0cGJpbiBuYW1lPXJ0cGJpbiBcCisgICAgICRBU09VUkNFICEgJEFFTkMgISBydHBiaW4uc2VuZF9ydHBfc2lua18wICBcCisgICAgICAgICAgICBydHBiaW4uc2VuZF9ydHBfc3JjXzAgISB1ZHBzaW5rIHBvcnQ9NTAwMiBob3N0PSRERVNUICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJ0cGJpbi5zZW5kX3J0Y3Bfc3JjXzAgISB1ZHBzaW5rIHBvcnQ9NTAwMyBob3N0PSRERVNUIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UgXAorICAgICAgICAgdWRwc3JjIHBvcnQ9NTAwNyAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18wCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWRlY29kZWJpbi1IMjYzcC1BTVIuc2ggYi90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLWRlY29kZWJpbi1IMjYzcC1BTVIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjdlOTgyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItZGVjb2RlYmluLUgyNjNwLUFNUi5zaApAQCAtMCwwICsxLDQ3IEBACisjIS9iaW4vc2gKKyMKKyMgQSBzaW1wbGUgUlRQIHNlcnZlciAKKyMKKyMgVHJhbnNjb2RlcyBhbmQgc3RyZWFtcyBhdWRpbyBhbmQgdmlkZW8gdG8gSDI2M3AgYW5kIEFNUiByZXNwZWN0aXZlbHkgZnJvbSBhbnkKKyMgZmlsZSB0aGF0IGlzIGRlY29kYWJsZSBieSBkZWNvZGViaW4uCisjCisjIHVzZSAuL2NsaWVudC1IMjYzcC1BTVIuc2ggdG8gcmVjZWl2ZSB0aGUgUlRQIHN0cmVhbS4KKyMKKworIyBjaGFuZ2UgdGhlc2UgdG8gY2hhbmdlIHRoZSBzZXJ2ZXIgc3luYy4gVGhpcyBjYXVzZXMgdGhlIHNlcnZlciB0byBzZW5kIHRoZQorIyBwYWNrZXRzIGxhcmdseSBvdXQtb2Ytc3luYywgdGhlIGNsaWVudCBzaG91bGQgdXNlIHRoZSBSVENQIFNSIHBhY2tldHMgdG8KKyMgcmVzdG9yZSBwcm9wZXIgbGlwLXN5bmMgYmV0d2VlbiB0aGUgc3RyZWFtcy4KK0FPRkZTRVQ9MAorVk9GRlNFVD0wCisKKyMgZW5jb2RlciBzZWVtcyB0byBiZSBwaWNreSBhYm91dCBQQVIsIHNvIGZvcmNlIG9uZSB0aGF0IHNob3VsZCB3b3JrCitWQ0FQUz0idmlkZW8veC1yYXcsd2lkdGg9MzUyLGhlaWdodD0yODgsZnJhbWVyYXRlPTE1LzEscGl4ZWwtYXNwZWN0LXJhdGlvPTEvMSIKKworIyB2aWRlbyBhbmQgYXVkaW8gZW5jb2RpbmcgYW5kIHBheWxvYWRpbmcKK1ZFTkNQQVk9ImF2ZW5jX2gyNjNwICEgcnRwaDI2M3BwYXkiCitBRU5DUEFZPSJhbXJuYmVuYyAhIHJ0cGFtcnBheSIKKworIyB2aWRlbyBjb252ZXJzaW9uIAorVkNPTlY9InZpZGVvY29udmVydCAhIHZpZGVvc2NhbGUgISB2aWRlb3JhdGUgISAkVkNBUFMgISB2aWRlb2NvbnZlcnQiCisKK0FDT05WPSJhdWRpb2NvbnZlcnQgISBhdWRpb3Jlc2FtcGxlIgorCisjSE9TVD0xOTIuMTY4LjEuMTI2CitIT1NUPTEyNy4wLjAuMQorCitpZiB0ZXN0IC16ICIkMSI7IHRoZW4KKyAgZWNobyAiTm8gVVJJIGFyZ3VtZW50LiI7CisgIGVjaG8gIlVzYWdlOiAkMCBmaWxlOi8vL3BhdGgvdG8vdmlkZW8uZmlsZSI7CisgIGV4aXQgMTsKK2ZpCisKK2dzdC1sYXVuY2gtMS4wIC12IHJ0cGJpbiBuYW1lPXJ0cGJpbiBcCisgICAgICAgICAgIHVyaWRlY29kZWJpbiB1cmk9IiQxIiBuYW1lPWRlY29kZSBcCisgICAgICAgICAgIGRlY29kZS4gISAkVkNPTlYgISAkVkVOQ1BBWSAhIHJ0cGJpbi5zZW5kX3J0cF9zaW5rXzAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydHBfc3JjXzAgISBxdWV1ZSAhIHVkcHNpbmsgaG9zdD0kSE9TVCBwb3J0PTUwMDAgdHMtb2Zmc2V0PSRBT0ZGU0VUICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMCAhIHVkcHNpbmsgaG9zdD0kSE9TVCBwb3J0PTUwMDEgc3luYz1mYWxzZSBhc3luYz1mYWxzZSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHVkcHNyYyBwb3J0PTUwMDUgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGRlY29kZS4gISAkQUNPTlYgISAkQUVOQ1BBWSAhIHJ0cGJpbi5zZW5kX3J0cF9zaW5rXzEgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydHBfc3JjXzEgISBxdWV1ZSAhIHVkcHNpbmsgaG9zdD0kSE9TVCBwb3J0PTUwMDIgdHMtb2Zmc2V0PSRWT0ZGU0VUICAgICAgXAorCSAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18xICEgdWRwc2luayBob3N0PSRIT1NUIHBvcnQ9NTAwMyBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgdWRwc3JjIHBvcnQ9NTAwNyAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18xCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXJ0cGF1eC5jIGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1ydHBhdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDI3ZjJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1ydHBhdXguYwpAQCAtMCwwICsxLDI5NyBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ29sbGFib3JhIEx0ZC4KKyAqICAgQGF1dGhvciBUb3JyaWUgRmlzY2hlciA8dG9ycmllLmZpc2NoZXJAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGdzdC9ydHAvcnRwLmg+CisKKy8qCisgKiBBbiBSVFAgc2VydmVyCisgKiAgY3JlYXRlcyB0d28gc2Vzc2lvbnMgYW5kIHN0cmVhbXMgYXVkaW8gb24gb25lLCB2aWRlbyBvbiB0aGUgb3RoZXIsIHdpdGggUlRDUAorICogIG9uIGJvdGggc2Vzc2lvbnMuIFRoZSBkZXN0aW5hdGlvbiBpcyAxMjcuMC4wLjEuCisgKgorICogIEluIGJvdGggc2Vzc2lvbnMsIHdlIHNldCAicnRwcnR4c2VuZCIgYXMgdGhlIHNlc3Npb24ncyAiYXV4IiBlbGVtZW50CisgKiAgaW4gcnRwYmluLCB3aGljaCBlbmFibGVzIFJGQzQ1ODggcmV0cmFuc21pc3Npb24gZm9yIHRoYXQgc2Vzc2lvbi4KKyAqCisgKiAgLi0tLS0tLS0uICAgIC4tLS0tLS0tLiAgICAuLS0tLS0tLS4gICAgICAuLS0tLS0tLS0tLS0tLiAgICAgICAuLS0tLS0tLS4KKyAqICB8YXVkaW90c3wgICAgfGFsYXdlbmN8ICAgIHxwY21hcGF5fCAgICAgIHwgcnRwYmluICAgICB8ICAgICAgIHx1ZHBzaW5rfAorICogIHwgICAgICBzcmMtPnNpbmsgICAgc3JjLT5zaW5rICAgIHNyYy0+c2VuZF9ydHBfMCBzZW5kX3J0cF8wLT5zaW5rICAgICB8CisgKiAgJy0tLS0tLS0nICAgICctLS0tLS0tJyAgICAnLS0tLS0tLScgICAgICB8ICAgICAgICAgICAgfCAgICAgICAnLS0tLS0tLScKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAKKyAqICAuLS0tLS0tLS4gICAgLi0tLS0tLS0tLS4gICAgLi0tLS0tLS0tLS4gIHwgICAgICAgICAgICB8ICAgICAgIC4tLS0tLS0tLgorICogIHxhdWRpb3RzfCAgICB8dGhlb3JhZW5jfCAgICB8dGhlb3JhcGF5fCAgfCAgICAgICAgICAgIHwgICAgICAgfHVkcHNpbmt8CisgKiAgfCAgICAgIHNyYy0+c2luayAgICAgIHNyYy0+c2luayAgc3JjLT5zZW5kX3J0cF8xIHNlbmRfcnRwXzEtPnNpbmsgICAgIHwKKyAqICAnLS0tLS0tLScgICAgJy0tLS0tLS0tLScgICAgJy0tLS0tLS0tLScgIHwgICAgICAgICAgICB8ICAgICAgICctLS0tLS0tJworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4tLS0tLS0uICAgIHwgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dWRwc3JjfCAgICB8ICAgICAgICAgICAgfCAgICAgICAuLS0tLS0tLS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHNyYy0+cmVjdl9ydGNwXzAgICB8ICAgICAgIHx1ZHBzaW5rfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tLS0tLScgICAgfCAgICAgICBzZW5kX3J0Y3BfMC0+c2luayAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAnLS0tLS0tLScKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4tLS0tLS0uICAgIHwgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dWRwc3JjfCAgICB8ICAgICAgICAgICAgfCAgICAgICAuLS0tLS0tLS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHNyYy0+cmVjdl9ydGNwXzEgICB8ICAgICAgIHx1ZHBzaW5rfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tLS0tLScgICAgfCAgICAgICBzZW5kX3J0Y3BfMS0+c2luayAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tJyAgICAgICAnLS0tLS0tLScKKyAqCisgKiBUbyBrZWVwIHRoZSBzZXQgb2YgcG9ydHMgY29uc2lzdGVudCBhY3Jvc3MgYm90aCB0aGlzIHNlcnZlciBhbmQgdGhlCisgKiBjb3JyZXNwb25kaW5nIGNsaWVudCwgYSBTZXNzaW9uRGF0YSBzdHJ1Y3QgbWFwcyBhIHJ0cGJpbiBzZXNzaW9uIG51bWJlciB0bworICogYSBHc3RCaW4gYW5kIGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIHVkcCBzaW5rcyB3aXRoIGNvcnJlY3QKKyAqIHBvcnRzLgorICovCisKK3R5cGVkZWYgc3RydWN0IF9TZXNzaW9uRGF0YQoreworICBpbnQgcmVmOworICBndWludCBzZXNzaW9uTnVtOworICBHc3RFbGVtZW50ICppbnB1dDsKK30gU2Vzc2lvbkRhdGE7CisKK3N0YXRpYyBTZXNzaW9uRGF0YSAqCitzZXNzaW9uX3JlZiAoU2Vzc2lvbkRhdGEgKiBkYXRhKQoreworICBnX2F0b21pY19pbnRfaW5jICgmZGF0YS0+cmVmKTsKKyAgcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkCitzZXNzaW9uX3VucmVmIChncG9pbnRlciBkYXRhKQoreworICBTZXNzaW9uRGF0YSAqc2Vzc2lvbiA9IChTZXNzaW9uRGF0YSAqKSBkYXRhOworICBpZiAoZ19hdG9taWNfaW50X2RlY19hbmRfdGVzdCAoJnNlc3Npb24tPnJlZikpIHsKKyAgICBnX2ZyZWUgKHNlc3Npb24pOworICB9Cit9CisKK3N0YXRpYyBTZXNzaW9uRGF0YSAqCitzZXNzaW9uX25ldyAoZ3VpbnQgc2Vzc2lvbk51bSkKK3sKKyAgU2Vzc2lvbkRhdGEgKnJldCA9IGdfbmV3MCAoU2Vzc2lvbkRhdGEsIDEpOworICByZXQtPnNlc3Npb25OdW0gPSBzZXNzaW9uTnVtOworICByZXR1cm4gc2Vzc2lvbl9yZWYgKHJldCk7Cit9CisKKy8qCisgKiBVc2VkIHRvIGdlbmVyYXRlIGluZm9ybWF0aXZlIG1lc3NhZ2VzIGR1cmluZyBwaXBlbGluZSBzdGFydHVwCisgKi8KK3N0YXRpYyB2b2lkCitjYl9zdGF0ZSAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbWVzc2FnZSwgZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR3N0T2JqZWN0ICpwaXBlID0gR1NUX09CSkVDVCAoZGF0YSk7CisgIEdzdFN0YXRlIG9sZCwgbmV3LCBwZW5kaW5nOworICBnc3RfbWVzc2FnZV9wYXJzZV9zdGF0ZV9jaGFuZ2VkIChtZXNzYWdlLCAmb2xkLCAmbmV3LCAmcGVuZGluZyk7CisgIGlmIChtZXNzYWdlLT5zcmMgPT0gcGlwZSkgeworICAgIGdfcHJpbnQgKCJQaXBlbGluZSAlcyBjaGFuZ2VkIHN0YXRlIGZyb20gJXMgdG8gJXNcbiIsCisgICAgICAgIEdTVF9PQkpFQ1RfTkFNRSAobWVzc2FnZS0+c3JjKSwKKyAgICAgICAgZ3N0X2VsZW1lbnRfc3RhdGVfZ2V0X25hbWUgKG9sZCksIGdzdF9lbGVtZW50X3N0YXRlX2dldF9uYW1lIChuZXcpKTsKKyAgfQorfQorCisvKgorICogQ3JlYXRlcyBhIEdzdEdob3N0UGFkIG5hbWVkICJzcmMiIG9uIHRoZSBnaXZlbiBiaW4sIHBvaW50ZWQgYXQgdGhlICJzcmMiIHBhZAorICogb2YgdGhlIGdpdmVuIGVsZW1lbnQKKyAqLworc3RhdGljIHZvaWQKK3NldHVwX2dob3N0IChHc3RFbGVtZW50ICogc3JjLCBHc3RCaW4gKiBiaW4pCit7CisgIEdzdFBhZCAqc3JjUGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNyYywgInNyYyIpOworICBHc3RQYWQgKmJpblBhZCA9IGdzdF9naG9zdF9wYWRfbmV3ICgic3JjIiwgc3JjUGFkKTsKKyAgZ3N0X2VsZW1lbnRfYWRkX3BhZCAoR1NUX0VMRU1FTlQgKGJpbiksIGJpblBhZCk7Cit9CisKK3N0YXRpYyBTZXNzaW9uRGF0YSAqCittYWtlX2F1ZGlvX3Nlc3Npb24gKGd1aW50IHNlc3Npb25OdW0pCit7CisgIFNlc3Npb25EYXRhICpzZXNzaW9uOworICBHc3RCaW4gKmF1ZGlvQmluID0gR1NUX0JJTiAoZ3N0X2Jpbl9uZXcgKE5VTEwpKTsKKyAgR3N0RWxlbWVudCAqYXVkaW9TcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb3Rlc3RzcmMiLCBOVUxMKTsKKyAgR3N0RWxlbWVudCAqZW5jb2RlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImFsYXdlbmMiLCBOVUxMKTsKKyAgR3N0RWxlbWVudCAqcGF5bG9hZGVyID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwcGNtYXBheSIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKGF1ZGlvU3JjLCAiaXMtbGl2ZSIsIFRSVUUsIE5VTEwpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKGF1ZGlvQmluLCBhdWRpb1NyYywgZW5jb2RlciwgcGF5bG9hZGVyLCBOVUxMKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19tYW55IChhdWRpb1NyYywgZW5jb2RlciwgcGF5bG9hZGVyLCBOVUxMKTsKKworICBzZXR1cF9naG9zdCAocGF5bG9hZGVyLCBhdWRpb0Jpbik7CisKKyAgc2Vzc2lvbiA9IHNlc3Npb25fbmV3IChzZXNzaW9uTnVtKTsKKyAgc2Vzc2lvbi0+aW5wdXQgPSBHU1RfRUxFTUVOVCAoYXVkaW9CaW4pOworCisgIHJldHVybiBzZXNzaW9uOworfQorCitzdGF0aWMgU2Vzc2lvbkRhdGEgKgorbWFrZV92aWRlb19zZXNzaW9uIChndWludCBzZXNzaW9uTnVtKQoreworICBHc3RCaW4gKnZpZGVvQmluID0gR1NUX0JJTiAoZ3N0X2Jpbl9uZXcgKE5VTEwpKTsKKyAgR3N0RWxlbWVudCAqdmlkZW9TcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb3Rlc3RzcmMiLCBOVUxMKTsKKyAgR3N0RWxlbWVudCAqZW5jb2RlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInRoZW9yYWVuYyIsIE5VTEwpOworICBHc3RFbGVtZW50ICpwYXlsb2FkZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHB0aGVvcmFwYXkiLCBOVUxMKTsKKyAgR3N0Q2FwcyAqdmlkZW9DYXBzOworICBTZXNzaW9uRGF0YSAqc2Vzc2lvbjsKKyAgZ19vYmplY3Rfc2V0ICh2aWRlb1NyYywgImlzLWxpdmUiLCBUUlVFLCAiaG9yaXpvbnRhbC1zcGVlZCIsIDEsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHBheWxvYWRlciwgImNvbmZpZy1pbnRlcnZhbCIsIDIsIE5VTEwpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKHZpZGVvQmluLCB2aWRlb1NyYywgZW5jb2RlciwgcGF5bG9hZGVyLCBOVUxMKTsKKyAgdmlkZW9DYXBzID0gZ3N0X2NhcHNfbmV3X3NpbXBsZSAoInZpZGVvL3gtcmF3IiwKKyAgICAgICJ3aWR0aCIsIEdfVFlQRV9JTlQsIDM1MiwKKyAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCAyODgsICJmcmFtZXJhdGUiLCBHU1RfVFlQRV9GUkFDVElPTiwgMTUsIDEsIE5VTEwpOworICBnc3RfZWxlbWVudF9saW5rX2ZpbHRlcmVkICh2aWRlb1NyYywgZW5jb2RlciwgdmlkZW9DYXBzKTsKKyAgZ3N0X2VsZW1lbnRfbGluayAoZW5jb2RlciwgcGF5bG9hZGVyKTsKKworICBzZXR1cF9naG9zdCAocGF5bG9hZGVyLCB2aWRlb0Jpbik7CisKKyAgc2Vzc2lvbiA9IHNlc3Npb25fbmV3IChzZXNzaW9uTnVtKTsKKyAgc2Vzc2lvbi0+aW5wdXQgPSBHU1RfRUxFTUVOVCAodmlkZW9CaW4pOworCisgIHJldHVybiBzZXNzaW9uOworfQorCitzdGF0aWMgR3N0RWxlbWVudCAqCityZXF1ZXN0X2F1eF9zZW5kZXIgKEdzdEVsZW1lbnQgKiBydHBiaW4sIGd1aW50IHNlc3NpZCwgU2Vzc2lvbkRhdGEgKiBzZXNzaW9uKQoreworICBHc3RFbGVtZW50ICpydHgsICpiaW47CisgIEdzdFBhZCAqcGFkOworICBnY2hhciAqbmFtZTsKKyAgR3N0U3RydWN0dXJlICpwdF9tYXA7CisKKyAgR1NUX0lORk8gKCJjcmVhdGluZyBBVVggc2VuZGVyIik7CisgIGJpbiA9IGdzdF9iaW5fbmV3IChOVUxMKTsKKyAgcnR4ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicnRwcnR4c2VuZCIsIE5VTEwpOworICBwdF9tYXAgPSBnc3Rfc3RydWN0dXJlX25ldyAoImFwcGxpY2F0aW9uL3gtcnRwLXB0LW1hcCIsCisgICAgICAiOCIsIEdfVFlQRV9VSU5ULCA5OCwgIjk2IiwgR19UWVBFX1VJTlQsIDk5LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChydHgsICJwYXlsb2FkLXR5cGUtbWFwIiwgcHRfbWFwLCBOVUxMKTsKKyAgZ3N0X3N0cnVjdHVyZV9mcmVlIChwdF9tYXApOworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAoYmluKSwgcnR4KTsKKworICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocnR4LCAic3JjIik7CisgIG5hbWUgPSBnX3N0cmR1cF9wcmludGYgKCJzcmNfJXUiLCBzZXNzaWQpOworICBnc3RfZWxlbWVudF9hZGRfcGFkIChiaW4sIGdzdF9naG9zdF9wYWRfbmV3IChuYW1lLCBwYWQpKTsKKyAgZ19mcmVlIChuYW1lKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGFkKTsKKworICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAocnR4LCAic2luayIpOworICBuYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic2lua18ldSIsIHNlc3NpZCk7CisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgZ3N0X2dob3N0X3BhZF9uZXcgKG5hbWUsIHBhZCkpOworICBnX2ZyZWUgKG5hbWUpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworCisgIHJldHVybiBiaW47Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgdGhlIFVEUCBzaW5rcyBhbmQgc291cmNlcyBmb3IgUlRQL1JUQ1AsIGFkZHMgdGhlCisgKiBnaXZlbiBzZXNzaW9uJ3MgYmluIGludG8gdGhlIHBpcGVsaW5lLCBhbmQgbGlua3MgaXQgdG8gdGhlIHByb3Blcmx5IG51bWJlcmVkCisgKiBwYWRzIG9uIHRoZSBydHBiaW4KKyAqLworc3RhdGljIHZvaWQKK2FkZF9zdHJlYW0gKEdzdFBpcGVsaW5lICogcGlwZSwgR3N0RWxlbWVudCAqIHJ0cEJpbiwgU2Vzc2lvbkRhdGEgKiBzZXNzaW9uKQoreworICBHc3RFbGVtZW50ICpydHBTaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc2luayIsIE5VTEwpOworICBHc3RFbGVtZW50ICpydGNwU2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNpbmsiLCBOVUxMKTsKKyAgR3N0RWxlbWVudCAqcnRjcFNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInVkcHNyYyIsIE5VTEwpOworICBHc3RFbGVtZW50ICppZGVudGl0eSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImlkZW50aXR5IiwgTlVMTCk7CisgIGludCBiYXNlUG9ydDsKKyAgZ2NoYXIgKnBhZE5hbWU7CisKKyAgYmFzZVBvcnQgPSA1MDAwICsgKHNlc3Npb24tPnNlc3Npb25OdW0gKiA2KTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlKSwgcnRwU2luaywgcnRjcFNpbmssIHJ0Y3BTcmMsIGlkZW50aXR5LAorICAgICAgc2Vzc2lvbi0+aW5wdXQsIE5VTEwpOworCisgIC8qIGVuYWJsZSByZXRyYW5zbWlzc2lvbiBieSBzZXR0aW5nIHJ0cHJ0eHNlbmQgYXMgdGhlICJhdXgiIGVsZW1lbnQgb2YgcnRwYmluICovCisgIGdfc2lnbmFsX2Nvbm5lY3QgKHJ0cEJpbiwgInJlcXVlc3QtYXV4LXNlbmRlciIsCisgICAgICAoR0NhbGxiYWNrKSByZXF1ZXN0X2F1eF9zZW5kZXIsIHNlc3Npb24pOworCisgIGdfb2JqZWN0X3NldCAocnRwU2luaywgInBvcnQiLCBiYXNlUG9ydCwgImhvc3QiLCAiMTI3LjAuMC4xIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAocnRjcFNpbmssICJwb3J0IiwgYmFzZVBvcnQgKyAxLCAiaG9zdCIsICIxMjcuMC4wLjEiLCAic3luYyIsCisgICAgICBGQUxTRSwgImFzeW5jIiwgRkFMU0UsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHJ0Y3BTcmMsICJwb3J0IiwgYmFzZVBvcnQgKyA1LCBOVUxMKTsKKworICAvKiB0aGlzIGlzIGp1c3QgdG8gZHJvcCBzb21lIHJ0cCBwYWNrZXRzIGF0IHJhbmRvbSwgdG8gZGVtb25zdHJhdGUKKyAgICogdGhhdCBydHBydHhzZW5kIGFjdHVhbGx5IHdvcmtzICovCisgIGdfb2JqZWN0X3NldCAoaWRlbnRpdHksICJkcm9wLXByb2JhYmlsaXR5IiwgMC4wMSwgTlVMTCk7CisKKyAgcGFkTmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNlbmRfcnRwX3NpbmtfJXUiLCBzZXNzaW9uLT5zZXNzaW9uTnVtKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzIChzZXNzaW9uLT5pbnB1dCwgInNyYyIsIHJ0cEJpbiwgcGFkTmFtZSk7CisgIGdfZnJlZSAocGFkTmFtZSk7CisKKyAgLyogbGluayBydHBiaW4gdG8gdWRwc2luayBkaXJlY3RseSBoZXJlIGlmIHlvdSBkb24ndCB3YW50CisgICAqIGFydGlmaWNpYWwgcGFja2V0IGxvc3MgKi8KKyAgcGFkTmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInNlbmRfcnRwX3NyY18ldSIsIHNlc3Npb24tPnNlc3Npb25OdW0pOworICBnc3RfZWxlbWVudF9saW5rX3BhZHMgKHJ0cEJpbiwgcGFkTmFtZSwgaWRlbnRpdHksICJzaW5rIik7CisgIGdzdF9lbGVtZW50X2xpbmsgKGlkZW50aXR5LCBydHBTaW5rKTsKKyAgZ19mcmVlIChwYWROYW1lKTsKKworICBwYWROYW1lID0gZ19zdHJkdXBfcHJpbnRmICgic2VuZF9ydGNwX3NyY18ldSIsIHNlc3Npb24tPnNlc3Npb25OdW0pOworICBnc3RfZWxlbWVudF9saW5rX3BhZHMgKHJ0cEJpbiwgcGFkTmFtZSwgcnRjcFNpbmssICJzaW5rIik7CisgIGdfZnJlZSAocGFkTmFtZSk7CisKKyAgcGFkTmFtZSA9IGdfc3RyZHVwX3ByaW50ZiAoInJlY3ZfcnRjcF9zaW5rXyV1Iiwgc2Vzc2lvbi0+c2Vzc2lvbk51bSk7CisgIGdzdF9lbGVtZW50X2xpbmtfcGFkcyAocnRjcFNyYywgInNyYyIsIHJ0cEJpbiwgcGFkTmFtZSk7CisgIGdfZnJlZSAocGFkTmFtZSk7CisKKyAgZ19wcmludCAoIk5ldyBSVFAgc3RyZWFtIG9uICVpLyVpLyVpXG4iLCBiYXNlUG9ydCwgYmFzZVBvcnQgKyAxLAorICAgICAgYmFzZVBvcnQgKyA1KTsKKworICBzZXNzaW9uX3VucmVmIChzZXNzaW9uKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIEdzdFBpcGVsaW5lICpwaXBlOworICBHc3RCdXMgKmJ1czsKKyAgU2Vzc2lvbkRhdGEgKnZpZGVvU2Vzc2lvbjsKKyAgU2Vzc2lvbkRhdGEgKmF1ZGlvU2Vzc2lvbjsKKyAgR3N0RWxlbWVudCAqcnRwQmluOworICBHTWFpbkxvb3AgKmxvb3A7CisKKyAgZ3N0X2luaXQgKCZhcmdjLCAmYXJndik7CisKKyAgbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgRkFMU0UpOworCisgIHBpcGUgPSBHU1RfUElQRUxJTkUgKGdzdF9waXBlbGluZV9uZXcgKE5VTEwpKTsKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAoR1NUX0VMRU1FTlQgKHBpcGUpKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6c3RhdGUtY2hhbmdlZCIsIEdfQ0FMTEJBQ0sgKGNiX3N0YXRlKSwgcGlwZSk7CisgIGdzdF9idXNfYWRkX3NpZ25hbF93YXRjaCAoYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKworICBydHBCaW4gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHBiaW4iLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChydHBCaW4sICJydHAtcHJvZmlsZSIsIEdTVF9SVFBfUFJPRklMRV9BVlBGLCBOVUxMKTsKKworICBnc3RfYmluX2FkZCAoR1NUX0JJTiAocGlwZSksIHJ0cEJpbik7CisKKyAgdmlkZW9TZXNzaW9uID0gbWFrZV92aWRlb19zZXNzaW9uICgwKTsKKyAgYXVkaW9TZXNzaW9uID0gbWFrZV9hdWRpb19zZXNzaW9uICgxKTsKKyAgYWRkX3N0cmVhbSAocGlwZSwgcnRwQmluLCB2aWRlb1Nlc3Npb24pOworICBhZGRfc3RyZWFtIChwaXBlLCBydHBCaW4sIGF1ZGlvU2Vzc2lvbik7CisKKyAgZ19wcmludCAoInN0YXJ0aW5nIHNlcnZlciBwaXBlbGluZVxuIik7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoR1NUX0VMRU1FTlQgKHBpcGUpLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKworICBnX3ByaW50ICgic3RvcHBpbmcgc2VydmVyIHBpcGVsaW5lXG4iKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChHU1RfRUxFTUVOVCAocGlwZSksIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlKTsKKyAgZ19tYWluX2xvb3BfdW5yZWYgKGxvb3ApOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci1ydHBidW5kbGUuYyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItcnRwYnVuZGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY2ZDAxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItcnRwYnVuZGxlLmMKQEAgLTAsMCArMSwxNzkgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDE2IElnYWxpYSBTLkwKKyAqICAgQGF1dGhvciBQaGlsaXBwZSBOb3JtYW5kIDxwaGlsbkBpZ2FsaWEuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisvKgorICogQW4gYnVuZGxpbmcgUlRQIHNlcnZlcgorICogIGNyZWF0ZXMgdHdvIHNlc3Npb25zIGFuZCBzdHJlYW1zIGF1ZGlvIG9uIG9uZSwgdmlkZW8gb24gdGhlIG90aGVyLCB3aXRoIFJUQ1AKKyAqICBvbiBib3RoIHNlc3Npb25zLiBUaGUgZGVzdGluYXRpb24gaXMgMTI3LjAuMC4xLgorICoKKyAqICBUaGUgUlRQIHN0cmVhbXMgYXJlIGJ1bmRsZWQgdG8gYSBzaW5nbGUgb3V0Z29pbmcgY29ubmVjdGlvbi4gU2FtZSBmb3IgdGhlIFJUQ1Agc3RyZWFtcy4KKyAqCisgKiAgLi0tLS0tLS0uICAgIC4tLS0tLS0tLiAgICAuLS0tLS0tLS4gICAgICAuLS0tLS0tLS0tLS0tLiAgICAgICAgIC4tLS0tLS0uCisgKiAgfGF1ZGlvdHN8ICAgIHxhbGF3ZW5jfCAgICB8cGNtYXBheXwgICAgICB8IHJ0cGJpbiAgICAgfCAgICAgICAgIHxmdW5uZWx8CisgKiAgfCAgICAgIHNyYy0+c2luayAgICBzcmMtPnNpbmsgICAgc3JjLT5zZW5kX3J0cF8wIHNlbmRfcnRwXzAtLS0+c2lua18wICB8ICAgIC4tLS0tLS0tLgorICogICctLS0tLS0tJyAgICAnLS0tLS0tLScgICAgJy0tLS0tLS0nICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgfCAgICB8dWRwc2lua3wKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgc3JjLT5zaW5rICAgICB8CisgKiAgLi0tLS0tLS0uICAgICAgICAgICAgICAgLi0tLS0tLS0tLS4gICAgICB8ICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICB8ICAgICctLS0tLS0tJworICogIHx2aWRlb3RzfCAgICAgICAgICAgICAgIHwgdnJhd3BheSB8ICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgfAorICogIHwgICAgICBzcmMtLS0tLS0tLS0tLS0+c2luayAgICAgIHNyYy0+c2VuZF9ydHBfMSBzZW5kX3J0cF8xLS0tPnNpbmtfMSAgfAorICogICctLS0tLS0tJyAgICAgICAgICAgICAgICctLS0tLS0tLS0nICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAnLS0tLS0tJworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4tLS0tLS0uICAgIHwgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dWRwc3JjfCAgICB8ICAgICAgICAgICAgfCAgICAgICAgIC4tLS0tLS0uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICBzcmMtPnJlY3ZfcnRjcF8wICAgfCAgICAgICAgIHxmdW5uZWx8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS0tLS0tJyAgICB8ICAgICAgIHNlbmRfcnRjcF8wLS0+c2lua18wICB8ICAgLi0tLS0tLS0uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICB8ICAgfHVkcHNpbmt8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLS0tLS0tLiAgICB8ICAgICAgICAgICAgfCAgICAgICAgIHwgICAgc3JjLT5zaW5rICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dWRwc3JjfCAgICB8ICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICB8ICAgJy0tLS0tLS0nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICBzcmMtPnJlY3ZfcnRjcF8xICAgfCAgICAgICAgIHwgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS0tLS0tJyAgICB8ICAgICAgIHNlbmRfcnRjcF8xLS0+c2lua18xICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tJyAgICAgICAgICctLS0tLS0nCisgKgorICovCisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK2NyZWF0ZV9waXBlbGluZSAodm9pZCkKK3sKKyAgR3N0RWxlbWVudCAqcGlwZWxpbmUsICpydHBiaW4sICphdWRpb3NyYywgKmF1ZGlvX2VuY29kZXIsCisgICAgICAqYXVkaW9fcnRwcGF5bG9hZGVyLCAqc2VuZHJ0cF91ZHBzaW5rLAorICAgICAgKnNlbmRfcnRjcF91ZHBzaW5rLCAqc2VuZHJ0Y3BfZnVubmVsLCAqc2VuZHJ0cF9mdW5uZWw7CisgIEdzdEVsZW1lbnQgKnZpZGVvc3JjLCAqdmlkZW9fcnRwcGF5bG9hZGVyLCAqdGltZV9vdmVybGF5OworICBnaW50IHJ0cF91ZHBfcG9ydCA9IDUwMDE7CisgIGdpbnQgcnRjcF91ZHBfcG9ydCA9IDUwMDI7CisgIGdpbnQgcmVjdl9hdWRpb19ydGNwX3BvcnQgPSA1MDAzOworICBnaW50IHJlY3ZfdmlkZW9fcnRjcF9wb3J0ID0gNTAwNDsKKyAgR3N0RWxlbWVudCAqYXVkaW9fcnRjcF91ZHBzcmMsICp2aWRlb19ydGNwX3VkcHNyYzsKKworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKE5VTEwpOworCisgIHJ0cGJpbiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cGJpbiIsIE5VTEwpOworCisgIGF1ZGlvc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW90ZXN0c3JjIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoYXVkaW9zcmMsICJpcy1saXZlIiwgVFJVRSwgTlVMTCk7CisgIGF1ZGlvX2VuY29kZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhbGF3ZW5jIiwgTlVMTCk7CisgIGF1ZGlvX3J0cHBheWxvYWRlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInJ0cHBjbWFwYXkiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChhdWRpb19ydHBwYXlsb2FkZXIsICJwdCIsIDk2LCBOVUxMKTsKKworICB2aWRlb3NyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHZpZGVvc3JjLCAiaXMtbGl2ZSIsIFRSVUUsIE5VTEwpOworICB0aW1lX292ZXJsYXkgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ0aW1lb3ZlcmxheSIsIE5VTEwpOworICB2aWRlb19ydHBwYXlsb2FkZXIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJydHB2cmF3cGF5IiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAodmlkZW9fcnRwcGF5bG9hZGVyLCAicHQiLCAxMDAsIE5VTEwpOworCisgIC8qIG11eGVkIHJ0Y3AgKi8KKyAgc2VuZHJ0Y3BfZnVubmVsID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZnVubmVsIiwgInNlbmRfcnRjcF9mdW5uZWwiKTsKKyAgc2VuZF9ydGNwX3VkcHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzaW5rIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc2VuZF9ydGNwX3VkcHNpbmssICJob3N0IiwgIjEyNy4wLjAuMSIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNlbmRfcnRjcF91ZHBzaW5rLCAicG9ydCIsIHJ0Y3BfdWRwX3BvcnQsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNlbmRfcnRjcF91ZHBzaW5rLCAic3luYyIsIEZBTFNFLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzZW5kX3J0Y3BfdWRwc2luaywgImFzeW5jIiwgRkFMU0UsIE5VTEwpOworCisgIC8qIG91dGdvaW5nIGJ1bmRsZWQgc3RyZWFtICovCisgIHNlbmRydHBfZnVubmVsID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZnVubmVsIiwgInNlbmRfcnRwX2Z1bm5lbCIpOworICBzZW5kcnRwX3VkcHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzaW5rIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc2VuZHJ0cF91ZHBzaW5rLCAiaG9zdCIsICIxMjcuMC4wLjEiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzZW5kcnRwX3VkcHNpbmssICJwb3J0IiwgcnRwX3VkcF9wb3J0LCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChzZW5kcnRwX3VkcHNpbmssICJzeW5jIiwgRkFMU0UsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNlbmRydHBfdWRwc2luaywgImFzeW5jIiwgRkFMU0UsIE5VTEwpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgcnRwYmluLCBhdWRpb3NyYywgYXVkaW9fZW5jb2RlciwKKyAgICAgIGF1ZGlvX3J0cHBheWxvYWRlciwgc2VuZHJ0cF91ZHBzaW5rLCBzZW5kX3J0Y3BfdWRwc2luaywKKyAgICAgIHNlbmRydHBfZnVubmVsLCBzZW5kcnRjcF9mdW5uZWwsIHZpZGVvc3JjLCB2aWRlb19ydHBwYXlsb2FkZXIsIE5VTEwpOworCisgIGlmICh0aW1lX292ZXJsYXkpCisgICAgZ3N0X2Jpbl9hZGQgKEdTVF9CSU4gKHBpcGVsaW5lKSwgdGltZV9vdmVybGF5KTsKKworICBnc3RfZWxlbWVudF9saW5rX21hbnkgKGF1ZGlvc3JjLCBhdWRpb19lbmNvZGVyLCBhdWRpb19ydHBwYXlsb2FkZXIsIE5VTEwpOworICBnc3RfZWxlbWVudF9saW5rX3BhZHMgKGF1ZGlvX3J0cHBheWxvYWRlciwgInNyYyIsIHJ0cGJpbiwgInNlbmRfcnRwX3NpbmtfMCIpOworCisgIGlmICh0aW1lX292ZXJsYXkpIHsKKyAgICBnc3RfZWxlbWVudF9saW5rX21hbnkgKHZpZGVvc3JjLCB0aW1lX292ZXJsYXksIHZpZGVvX3J0cHBheWxvYWRlciwgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgZ3N0X2VsZW1lbnRfbGluayAodmlkZW9zcmMsIHZpZGVvX3J0cHBheWxvYWRlcik7CisgIH0KKworICBnc3RfZWxlbWVudF9saW5rX3BhZHMgKHZpZGVvX3J0cHBheWxvYWRlciwgInNyYyIsIHJ0cGJpbiwgInNlbmRfcnRwX3NpbmtfMSIpOworCisgIGdzdF9lbGVtZW50X2xpbmtfcGFkcyAoc2VuZHJ0cF9mdW5uZWwsICJzcmMiLCBzZW5kcnRwX3VkcHNpbmssICJzaW5rIik7CisgIGdzdF9lbGVtZW50X2xpbmtfcGFkcyAocnRwYmluLCAic2VuZF9ydHBfc3JjXzAiLCBzZW5kcnRwX2Z1bm5lbCwgInNpbmtfJXUiKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzIChydHBiaW4sICJzZW5kX3J0cF9zcmNfMSIsIHNlbmRydHBfZnVubmVsLCAic2lua18ldSIpOworICBnc3RfZWxlbWVudF9saW5rX3BhZHMgKHNlbmRydGNwX2Z1bm5lbCwgInNyYyIsIHNlbmRfcnRjcF91ZHBzaW5rLCAic2luayIpOworICBnc3RfZWxlbWVudF9saW5rX3BhZHMgKHJ0cGJpbiwgInNlbmRfcnRjcF9zcmNfMCIsIHNlbmRydGNwX2Z1bm5lbCwgInNpbmtfJXUiKTsKKyAgZ3N0X2VsZW1lbnRfbGlua19wYWRzIChydHBiaW4sICJzZW5kX3J0Y3Bfc3JjXzEiLCBzZW5kcnRjcF9mdW5uZWwsICJzaW5rXyV1Iik7CisKKyAgYXVkaW9fcnRjcF91ZHBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ1ZHBzcmMiLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChhdWRpb19ydGNwX3VkcHNyYywgInBvcnQiLCByZWN2X2F1ZGlvX3J0Y3BfcG9ydCwgTlVMTCk7CisgIHZpZGVvX3J0Y3BfdWRwc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidWRwc3JjIiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAodmlkZW9fcnRjcF91ZHBzcmMsICJwb3J0IiwgcmVjdl92aWRlb19ydGNwX3BvcnQsIE5VTEwpOworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIGF1ZGlvX3J0Y3BfdWRwc3JjLCB2aWRlb19ydGNwX3VkcHNyYywKKyAgICAgIE5VTEwpOworICBnc3RfZWxlbWVudF9saW5rX3BhZHMgKGF1ZGlvX3J0Y3BfdWRwc3JjLCAic3JjIiwgcnRwYmluLCAicmVjdl9ydGNwX3NpbmtfMCIpOworICBnc3RfZWxlbWVudF9saW5rX3BhZHMgKHZpZGVvX3J0Y3BfdWRwc3JjLCAic3JjIiwgcnRwYmluLCAicmVjdl9ydGNwX3NpbmtfMSIpOworCisgIHJldHVybiBwaXBlbGluZTsKK30KKworLyoKKyAqIFVzZWQgdG8gZ2VuZXJhdGUgaW5mb3JtYXRpdmUgbWVzc2FnZXMgZHVyaW5nIHBpcGVsaW5lIHN0YXJ0dXAKKyAqLworc3RhdGljIHZvaWQKK2NiX3N0YXRlIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBncG9pbnRlciBkYXRhKQoreworICBHc3RPYmplY3QgKnBpcGUgPSBHU1RfT0JKRUNUIChkYXRhKTsKKyAgR3N0U3RhdGUgb2xkLCBuZXcsIHBlbmRpbmc7CisgIGdzdF9tZXNzYWdlX3BhcnNlX3N0YXRlX2NoYW5nZWQgKG1lc3NhZ2UsICZvbGQsICZuZXcsICZwZW5kaW5nKTsKKyAgaWYgKG1lc3NhZ2UtPnNyYyA9PSBwaXBlKSB7CisgICAgZ19wcmludCAoIlBpcGVsaW5lICVzIGNoYW5nZWQgc3RhdGUgZnJvbSAlcyB0byAlc1xuIiwKKyAgICAgICAgR1NUX09CSkVDVF9OQU1FIChtZXNzYWdlLT5zcmMpLAorICAgICAgICBnc3RfZWxlbWVudF9zdGF0ZV9nZXRfbmFtZSAob2xkKSwgZ3N0X2VsZW1lbnRfc3RhdGVfZ2V0X25hbWUgKG5ldykpOworICB9Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBHc3RFbGVtZW50ICpwaXBlOworICBHc3RCdXMgKmJ1czsKKyAgR01haW5Mb29wICpsb29wOworCisgIGdzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKworICBwaXBlID0gY3JlYXRlX3BpcGVsaW5lICgpOworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChwaXBlKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZTo6c3RhdGUtY2hhbmdlZCIsIEdfQ0FMTEJBQ0sgKGNiX3N0YXRlKSwgcGlwZSk7CisgIGdzdF9idXNfYWRkX3NpZ25hbF93YXRjaCAoYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKworICBnX3ByaW50ICgic3RhcnRpbmcgc2VydmVyIHBpcGVsaW5lXG4iKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKworICBnX3ByaW50ICgic3RvcHBpbmcgc2VydmVyIHBpcGVsaW5lXG4iKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZSk7CisgIGdfbWFpbl9sb29wX3VucmVmIChsb29wKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjYzcC1hbHNhc3JjLUFNUi5zaCBiL3Rlc3RzL2V4YW1wbGVzL3J0cC9zZXJ2ZXItdjRsMi1IMjYzcC1hbHNhc3JjLUFNUi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41M2VmNWFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci12NGwyLUgyNjNwLWFsc2FzcmMtQU1SLnNoCkBAIC0wLDAgKzEsMjUgQEAKKyMhL2Jpbi9zaAorIworIyBBIHNpbXBsZSBSVFAgc2VydmVyCisjCisKKyMgY2hhbmdlIHRoZXNlIHRvIGNoYW5nZSB0aGUgc2VydmVyIHN5bmMuIFRoaXMgY2F1c2VzIHRoZSBzZXJ2ZXIgdG8gc2VuZCB0aGUKKyMgcGFja2V0cyBsYXJnbHkgb3V0LW9mLXN5bmMsIHRoZSBjbGllbnQgc2hvdWxkIHVzZSB0aGUgUlRDUCBTUiBwYWNrZXRzIHRvCisjIHJlc3RvcmUgcHJvcGVyIGxpcC1zeW5jIGJldHdlZW4gdGhlIHN0cmVhbXMuCitBT0ZGU0VUPTAKK1ZPRkZTRVQ9MAorCitWQ0FQUz0idmlkZW8veC1yYXcsd2lkdGg9MzUyLGhlaWdodD0yODgsZnJhbWVyYXRlPTE1LzEiCisKKyNERVNUPTE5Mi4xNjguMS4xMjYKK0RFU1Q9bG9jYWxob3N0CisKK2dzdC1sYXVuY2gtMS4wIC12IHJ0cGJpbiBuYW1lPXJ0cGJpbiBcCisgICAgICAgICAgIHY0bDJzcmMgISB2aWRlb3JhdGUgISB2aWRlb2NvbnZlcnQgISAkVkNBUFMgISBhdmVuY19oMjYzcCAhIHJ0cGgyNjNwcGF5ICEgcnRwYmluLnNlbmRfcnRwX3NpbmtfMCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHJ0cGJpbi5zZW5kX3J0cF9zcmNfMCAhIHF1ZXVlICEgdWRwc2luayBob3N0PSRERVNUIHBvcnQ9NTAwMCB0cy1vZmZzZXQ9JEFPRkZTRVQgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBydHBiaW4uc2VuZF9ydGNwX3NyY18wICEgdWRwc2luayBob3N0PSRERVNUIHBvcnQ9NTAwMSBzeW5jPWZhbHNlIGFzeW5jPWZhbHNlICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgdWRwc3JjIHBvcnQ9NTAwNSAhIHJ0cGJpbi5yZWN2X3J0Y3Bfc2lua18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgYXV0b2F1ZGlvc3JjICEgYXVkaW9jb252ZXJ0ICEgYW1ybmJlbmMgISBydHBhbXJwYXkgISBydHBiaW4uc2VuZF9ydHBfc2lua18xICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgICAgICAgcnRwYmluLnNlbmRfcnRwX3NyY18xICEgcXVldWUgISB1ZHBzaW5rIGhvc3Q9JERFU1QgcG9ydD01MDAyIHRzLW9mZnNldD0kVk9GRlNFVCAgICAgIFwKKwkgICAgICAgICAgICAgcnRwYmluLnNlbmRfcnRjcF9zcmNfMSAhIHVkcHNpbmsgaG9zdD0kREVTVCBwb3J0PTUwMDMgc3luYz1mYWxzZSBhc3luYz1mYWxzZSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHVkcHNyYyBwb3J0PTUwMDcgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci12NGwyLUgyNjQtYWxzYXNyYy1QQ01BLnNoIGIvdGVzdHMvZXhhbXBsZXMvcnRwL3NlcnZlci12NGwyLUgyNjQtYWxzYXNyYy1QQ01BLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFjNzI3YTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9ydHAvc2VydmVyLXY0bDItSDI2NC1hbHNhc3JjLVBDTUEuc2gKQEAgLTAsMCArMSw3OCBAQAorIyEvYmluL3NoCisjCisjIEEgc2ltcGxlIFJUUCBzZXJ2ZXIKKyMgIHNlbmRzIHRoZSBvdXRwdXQgb2YgdjRsMnNyYyBhcyBoMjY0IGVuY29kZWQgUlRQIG9uIHBvcnQgNTAwMCwgUlRDUCBpcyBzZW50IG9uCisjICBwb3J0IDUwMDEuIFRoZSBkZXN0aW5hdGlvbiBpcyAxMjcuMC4wLjEuCisjICB0aGUgdmlkZW8gcmVjZWl2ZXIgUlRDUCByZXBvcnRzIGFyZSByZWNlaXZlZCBvbiBwb3J0IDUwMDUKKyMgIHNlbmRzIHRoZSBvdXRwdXQgb2YgYXV0b2F1ZGlvc3JjIGFzIGFsYXcgZW5jb2RlZCBSVFAgb24gcG9ydCA1MDAyLCBSVENQIGlzIHNlbnQgb24KKyMgIHBvcnQgNTAwMy4gVGhlIGRlc3RpbmF0aW9uIGlzIDEyNy4wLjAuMS4KKyMgIHRoZSByZWNlaXZlciBSVENQIHJlcG9ydHMgYXJlIHJlY2VpdmVkIG9uIHBvcnQgNTAwNworIworIyAgLi0tLS0tLS0uICAgIC4tLS0tLS0tLiAgICAuLS0tLS0tLS4gICAgICAuLS0tLS0tLS0tLS4gICAgIC4tLS0tLS0tLgorIyAgfHY0bHNzcmN8ICAgIHxoMjY0ZW5jfCAgICB8aDI2NHBheXwgICAgICB8IHJ0cGJpbiAgIHwgICAgIHx1ZHBzaW5rfCAgUlRQCisjICB8ICAgICAgc3JjLT5zaW5rICAgIHNyYy0+c2luayAgICBzcmMtPnNlbmRfcnRwIHNlbmRfcnRwLT5zaW5rICAgICB8IHBvcnQ9NTAwMAorIyAgJy0tLS0tLS0nICAgICctLS0tLS0tJyAgICAnLS0tLS0tLScgICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tJworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAuLS0tLS0tLS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICB8dWRwc2lua3wgIFJUQ1AKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBzZW5kX3J0Y3AtPnNpbmsgICAgIHwgcG9ydD01MDAxCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4tLS0tLS0tLiAgICAgIHwgICAgICAgICAgfCAgICAgJy0tLS0tLS0nIHN5bmM9ZmFsc2UKKyMgICAgICAgICAgICAgICAgIFJUQ1AgICAgICAgfHVkcHNyYyB8ICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgYXN5bmM9ZmFsc2UKKyMgICAgICAgICAgICAgICBwb3J0PTUwMDUgICAgfCAgICAgc3JjLT5yZWN2X3J0Y3AgICAgICB8CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLS0tLS0tJyAgICAgIHwgICAgICAgICAgfAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKKyMgLi0tLS0tLS0tLiAgICAuLS0tLS0tLS4gICAgLi0tLS0tLS0uICAgICAgfCAgICAgICAgICB8ICAgICAuLS0tLS0tLS4KKyMgfGF1ZGlvc3JjfCAgICB8YWxhd2VuY3wgICAgfHBjbWFwYXl8ICAgICAgfCBydHBiaW4gICB8ICAgICB8dWRwc2lua3wgIFJUUAorIyB8ICAgICAgIHNyYy0+c2luayAgICBzcmMtPnNpbmsgICAgc3JjLT5zZW5kX3J0cCBzZW5kX3J0cC0+c2luayAgICAgfCBwb3J0PTUwMDIKKyMgJy0tLS0tLS0tJyAgICAnLS0tLS0tLScgICAgJy0tLS0tLS0nICAgICAgfCAgICAgICAgICB8ICAgICAnLS0tLS0tLScKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgLi0tLS0tLS0uCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgfHVkcHNpbmt8ICBSVENQCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgc2VuZF9ydGNwLT5zaW5rICAgICB8IHBvcnQ9NTAwMworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLS0tLS0tLS4gICAgICB8ICAgICAgICAgIHwgICAgICctLS0tLS0tJyBzeW5jPWZhbHNlCisjICAgICAgICAgICAgICAgICBSVENQICAgICAgIHx1ZHBzcmMgfCAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgIGFzeW5jPWZhbHNlCisjICAgICAgICAgICAgICAgcG9ydD01MDA3ICAgIHwgICAgIHNyYy0+cmVjdl9ydGNwICAgICAgfAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS0tLS0tLScgICAgICAnLS0tLS0tLS0tLScKKyMKKyMgaWRlYWxseSB3ZSBzaG91bGQgdHJhbnNwb3J0IHRoZSBwcm9wZXJ0aWVzIG9uIHRoZSBSVFAgdWRwc2luayBwYWRzIHRvIHRoZQorIyByZWNlaXZlciBpbiBvcmRlciB0byB0cmFuc21pdCB0aGUgU1BTIGFuZCBQUFMgZWFybGllci4KKworIyBjaGFuZ2UgdGhpcyB0byBzZW5kIHRoZSBSVFAgZGF0YSBhbmQgUlRDUCB0byBhbm90aGVyIGhvc3QKK0RFU1Q9MTI3LjAuMC4xCisKKyMgdHVuaW5nIHBhcmFtZXRlcnMgdG8gbWFrZSB0aGUgc2VuZGVyIHNlbmQgdGhlIHN0cmVhbXMgb3V0IG9mIHN5bmMuIENhbiBiZSB1c2VkCisjIG90IHRlc3QgdGhlIGNsaWVudCBSVENQIHN5bmNocm9uaXNhdGlvbi4KKyNWT0ZGU0VUPTkwMDAwMDAwMAorVk9GRlNFVD0wCitBT0ZGU0VUPTAKKworIyBIMjY0IGVuY29kZSBmcm9tIHRoZSBzb3VyY2UKK1ZFTEVNPSJ2NGwyc3JjIgorI1ZFTEVNPSJ2aWRlb3Rlc3RzcmMgaXMtbGl2ZT0xIgorVkNBUFM9InZpZGVvL3gtcmF3LHdpZHRoPTM1MixoZWlnaHQ9Mjg4LGZyYW1lcmF0ZT0xNS8xIgorVlNPVVJDRT0iJFZFTEVNICEgcXVldWUgISB2aWRlb3JhdGUgISB2aWRlb2NvbnZlcnQgISAkVkNBUFMiCitWRU5DPSJ4MjY0ZW5jIHR1bmU9emVyb2xhdGVuY3kgYnl0ZS1zdHJlYW09dHJ1ZSBiaXRyYXRlPTMwMCAhIHJ0cGgyNjRwYXkiCisKK1ZSVFBTSU5LPSJ1ZHBzaW5rIHBvcnQ9NTAwMCBob3N0PSRERVNUIHRzLW9mZnNldD0kVk9GRlNFVCBuYW1lPXZydHBzaW5rIgorVlJUQ1BTSU5LPSJ1ZHBzaW5rIHBvcnQ9NTAwMSBob3N0PSRERVNUIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UgbmFtZT12cnRjcHNpbmsiCitWUlRDUFNSQz0idWRwc3JjIHBvcnQ9NTAwNSBuYW1lPXZydHBzcmMiCisKKyMgUENNQSBlbmNvZGUgZnJvbSB0aGUgc291cmNlCitBRUxFTT0iYXV0b2F1ZGlvc3JjIgorI0FFTEVNPSJhdWRpb3Rlc3RzcmMgaXMtbGl2ZT0xIgorQVNPVVJDRT0iJEFFTEVNICEgcXVldWUgISBhdWRpb3Jlc2FtcGxlICEgYXVkaW9jb252ZXJ0IgorQUVOQz0iYWxhd2VuYyAhIHJ0cHBjbWFwYXkiCisKK0FSVFBTSU5LPSJ1ZHBzaW5rIHBvcnQ9NTAwMiBob3N0PSRERVNUIHRzLW9mZnNldD0kQU9GRlNFVCBuYW1lPWFydHBzaW5rIgorQVJUQ1BTSU5LPSJ1ZHBzaW5rIHBvcnQ9NTAwMyBob3N0PSRERVNUIHN5bmM9ZmFsc2UgYXN5bmM9ZmFsc2UgbmFtZT1hcnRjcHNpbmsiCitBUlRDUFNSQz0idWRwc3JjIHBvcnQ9NTAwNyBuYW1lPWFydHBzcmMiCisKK2dzdC1sYXVuY2gtMS4wIC12IHJ0cGJpbiBuYW1lPXJ0cGJpbiBcCisgICAgJFZTT1VSQ0UgISAkVkVOQyAhIHJ0cGJpbi5zZW5kX3J0cF9zaW5rXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJ0cGJpbi5zZW5kX3J0cF9zcmNfMCAhICRWUlRQU0lOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJ0cGJpbi5zZW5kX3J0Y3Bfc3JjXzAgISAkVlJUQ1BTSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAkVlJUQ1BTUkMgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgJEFTT1VSQ0UgISAkQUVOQyAhIHJ0cGJpbi5zZW5kX3J0cF9zaW5rXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJ0cGJpbi5zZW5kX3J0cF9zcmNfMSAhICRBUlRQU0lOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJ0cGJpbi5zZW5kX3J0Y3Bfc3JjXzEgISAkQVJUQ1BTSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAkQVJUQ1BTUkMgISBydHBiaW4ucmVjdl9ydGNwX3NpbmtfMQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlLy5naXRpZ25vcmUgYi90ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDZiYzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorc2hhcGV3aXBlLWV4YW1wbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3NoYXBld2lwZS9NYWtlZmlsZS5hbSBiL3Rlc3RzL2V4YW1wbGVzL3NoYXBld2lwZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGU5MjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOCBAQAorbm9pbnN0X1BST0dSQU1TID0gc2hhcGV3aXBlLWV4YW1wbGUKKworc2hhcGV3aXBlX2V4YW1wbGVfU09VUkNFUyA9IHNoYXBld2lwZS1leGFtcGxlLmMKK3NoYXBld2lwZV9leGFtcGxlX0NGTEFHUyA9ICQoR1NUX0NPTlRST0xMRVJfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpCitzaGFwZXdpcGVfZXhhbXBsZV9MREFERCA9ICQoR1NUX0NPTlRST0xMRVJfTElCUykgJChHU1RfTElCUykKKworbm9pbnN0X0hFQURFUlMgPSAKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL21lc29uLmJ1aWxkIGIvdGVzdHMvZXhhbXBsZXMvc2hhcGV3aXBlL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZDc3NWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvbWVzb24uYnVpbGQKQEAgLTAsMCArMSw1IEBACitleGVjdXRhYmxlKCdzaGFwZXdpcGUtZXhhbXBsZScsICdzaGFwZXdpcGUtZXhhbXBsZS5jJywKKyAgZGVwZW5kZW5jaWVzOiBbZ3N0Y29udHJvbGxlcl9kZXAsIGdzdF9kZXBdLAorICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMgOiBbY29uZmlnaW5jXSwKKyAgaW5zdGFsbDogZmFsc2UpCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYyBiL3Rlc3RzL2V4YW1wbGVzL3NoYXBld2lwZS9zaGFwZXdpcGUtZXhhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZDczNGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9zaGFwZXdpcGUvc2hhcGV3aXBlLWV4YW1wbGUuYwpAQCAtMCwwICsxLDEzNCBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2ViYXN0aWFuIERyw7ZnZSA8c2ViYXN0aWFuLmRyb2VnZUBjb2xsYWJvcmEuY28udWs+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvY29udHJvbGxlci9nc3RsZm9jb250cm9sc291cmNlLmg+CisjaW5jbHVkZSA8Z3N0L2NvbnRyb2xsZXIvZ3N0ZGlyZWN0Y29udHJvbGJpbmRpbmcuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitzdGF0aWMgZ2Jvb2xlYW4KK29uX21lc3NhZ2UgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR01haW5Mb29wICpsb29wID0gKEdNYWluTG9vcCAqKSB1c2VyX2RhdGE7CisKKyAgc3dpdGNoIChHU1RfTUVTU0FHRV9UWVBFIChtZXNzYWdlKSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6eworICAgICAgR0Vycm9yICplcnIgPSBOVUxMOworICAgICAgZ2NoYXIgKmRlYnVnID0gTlVMTDsKKworICAgICAgZ193YXJuaW5nICgiR290IEVSUk9SIik7CisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobWVzc2FnZSwgJmVyciwgJmRlYnVnKTsKKyAgICAgIGdfd2FybmluZyAoIiVzOiAlcyIsIGVyci0+bWVzc2FnZSwgZGVidWcpOworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfTUVTU0FHRV9XQVJOSU5HOnsKKyAgICAgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgICAgIGdjaGFyICpkZWJ1ZyA9IE5VTEw7CisKKyAgICAgIGdfd2FybmluZyAoIkdvdCBXQVJOSU5HIik7CisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobWVzc2FnZSwgJmVyciwgJmRlYnVnKTsKKyAgICAgIGdfd2FybmluZyAoIiVzOiAlcyIsIGVyci0+bWVzc2FnZSwgZGVidWcpOworICAgICAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FT1M6CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitnaW50CittYWluIChnaW50IGFyZ2MsIGdjaGFyICoqIGFyZ3YpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RFbGVtZW50ICpzaGFwZXdpcGU7CisgIEdzdENvbnRyb2xTb3VyY2UgKmNzOworICBHTWFpbkxvb3AgKmxvb3A7CisgIEdzdEJ1cyAqYnVzOworICBnY2hhciAqcGlwZWxpbmVfc3RyaW5nOworICBnZmxvYXQgYm9yZGVyID0gMC4wNTsKKworICBpZiAoYXJnYyA8IDIpIHsKKyAgICBnX3ByaW50ICgiVXNhZ2U6IHNoYXBld2lwZSBtYXNrLnBuZyA8Ym9yZGVyPlxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgZ3N0X2luaXQgKCZhcmdjLCAmYXJndik7CisKKyAgaWYgKGFyZ2MgPiAyKSB7CisgICAgYm9yZGVyID0gYXRvZiAoYXJndlsyXSk7CisgIH0KKworICBwaXBlbGluZV9zdHJpbmcgPQorICAgICAgZ19zdHJkdXBfcHJpbnRmCisgICAgICAoInZpZGVvdGVzdHNyYyAhIHZpZGVvL3gtcmF3LGZvcm1hdD0oc3RyaW5nKUFZVVYsd2lkdGg9NjQwLGhlaWdodD00ODAgISBzaGFwZXdpcGUgbmFtZT1zaGFwZSBib3JkZXI9JWYgISB2aWRlb21peGVyIG5hbWU9bWl4ZXIgISB2aWRlb2NvbnZlcnQgISBhdXRvdmlkZW9zaW5rICAgICBmaWxlc3JjIGxvY2F0aW9uPSVzICEgdHlwZWZpbmQgISBkZWNvZGViaW4gISB2aWRlb2NvbnZlcnQgISB2aWRlb3NjYWxlICEgcXVldWUgISBzaGFwZS5tYXNrX3NpbmsgICAgdmlkZW90ZXN0c3JjIHBhdHRlcm49c25vdyAhIHZpZGVvL3gtcmF3LGZvcm1hdD0oc3RyaW5nKUFZVVYsd2lkdGg9NjQwLGhlaWdodD00ODAgISBxdWV1ZSAhIG1peGVyLiIsCisgICAgICBib3JkZXIsIGFyZ3ZbMV0pOworCisgIHBpcGVsaW5lID0gZ3N0X3BhcnNlX2xhdW5jaCAocGlwZWxpbmVfc3RyaW5nLCBOVUxMKTsKKyAgZ19mcmVlIChwaXBlbGluZV9zdHJpbmcpOworCisgIGlmIChwaXBlbGluZSA9PSBOVUxMKSB7CisgICAgZ19wcmludCAoIkZhaWxlZCB0byBjcmVhdGUgcGlwZWxpbmVcbiIpOworICAgIHJldHVybiAtMjsKKyAgfQorCisgIHNoYXBld2lwZSA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgInNoYXBlIik7CisKKyAgY3MgPSBnc3RfbGZvX2NvbnRyb2xfc291cmNlX25ldyAoKTsKKworICBnc3Rfb2JqZWN0X2FkZF9jb250cm9sX2JpbmRpbmcgKEdTVF9PQkpFQ1RfQ0FTVCAoc2hhcGV3aXBlKSwKKyAgICAgIGdzdF9kaXJlY3RfY29udHJvbF9iaW5kaW5nX25ldyAoR1NUX09CSkVDVF9DQVNUIChzaGFwZXdpcGUpLCAicG9zaXRpb24iLAorICAgICAgICAgIGNzKSk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNoYXBld2lwZSk7CisKKyAgZ19vYmplY3Rfc2V0IChjcywKKyAgICAgICJhbXBsaXR1ZGUiLCAwLjUsCisgICAgICAib2Zmc2V0IiwgMC41LCAiZnJlcXVlbmN5IiwgMC4yNSwgInRpbWVzaGlmdCIsIDUwMCAqIEdTVF9NU0VDT05ELCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAoY3MpOworCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKworICBidXMgPSBnc3RfcGlwZWxpbmVfZ2V0X2J1cyAoR1NUX1BJUEVMSU5FIChwaXBlbGluZSkpOworICBnc3RfYnVzX2FkZF9zaWduYWxfd2F0Y2ggKGJ1cyk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChidXMpLCAibWVzc2FnZSIsIEdfQ0FMTEJBQ0sgKG9uX21lc3NhZ2UpLCBsb29wKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoR1NUX09CSkVDVCAoYnVzKSk7CisKKyAgaWYgKGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsCisgICAgICAgICAgR1NUX1NUQVRFX1BMQVlJTkcpID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkgeworICAgIGdfZXJyb3IgKCJGYWlsZWQgdG8gZ28gaW50byBQTEFZSU5HIHN0YXRlIik7CisgICAgcmV0dXJuIC00OworICB9CisKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ19tYWluX2xvb3BfdW5yZWYgKGxvb3ApOworCisgIGdzdF9vYmplY3RfdW5yZWYgKEdfT0JKRUNUIChwaXBlbGluZSkpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vLmdpdGlnbm9yZSBiL3Rlc3RzL2V4YW1wbGVzL3NwZWN0cnVtLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU1YTNjZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3NwZWN0cnVtLy5naXRpZ25vcmUKQEAgLTAsMCArMSwzIEBACitkZW1vLWF1ZGlvdGVzdAorZGVtby1vc3NzcmMKK3NwZWN0cnVtLWV4YW1wbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL01ha2VmaWxlLmFtIGIvdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNlZDVlYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTggQEAKK2lmIEhBVkVfR1RLCitub2luc3RfUFJPR1JBTVMgPSBkZW1vLW9zc3NyYyBkZW1vLWF1ZGlvdGVzdCBzcGVjdHJ1bS1leGFtcGxlCitlbmRpZgorCitkZW1vX29zc3NyY19TT1VSQ0VTID0gZGVtby1vc3NzcmMuYworZGVtb19vc3NzcmNfQ0ZMQUdTICA9ICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoR1RLX0NGTEFHUykKK2RlbW9fb3Nzc3JjX0xEQUREID0gJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKSAkKEdUS19MSUJTKQorCitkZW1vX2F1ZGlvdGVzdF9TT1VSQ0VTID0gZGVtby1hdWRpb3Rlc3QuYworZGVtb19hdWRpb3Rlc3RfQ0ZMQUdTICA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpIFwKKyAgICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpICQoR1RLX0NGTEFHUykKK2RlbW9fYXVkaW90ZXN0X0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIC1sZ3N0ZmZ0LSQoR1NUX0FQSV9WRVJTSU9OKSBcCisgICAkKEdTVF9CQVNFX0xJQlMpICQoR1NUX0xJQlMpICQoR1RLX0xJQlMpCisKK3NwZWN0cnVtX2V4YW1wbGVfU09VUkNFUyA9IHNwZWN0cnVtLWV4YW1wbGUuYworc3BlY3RydW1fZXhhbXBsZV9DRkxBR1MgID0gJChHU1RfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgJChHVEtfQ0ZMQUdTKQorc3BlY3RydW1fZXhhbXBsZV9MREFERCA9ICQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykgJChHVEtfTElCUykKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1hdWRpb3Rlc3QuYyBiL3Rlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tYXVkaW90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhOTBjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL2RlbW8tYXVkaW90ZXN0LmMKQEAgLTAsMCArMSwyODMgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA2IFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyogVE9ETzogYWRkIHdhdmUgc2VsZWN0aW9uICovCisvKiBmYXN0IHZzLiBzbG93IG1vZGUgLSBzZWUgdXBkYXRlX3NwZWN0cnVtX2JhbmRzKCkKKyAqIHdlIGFyZSBzdGlsbCBjaGVhdGluZyBiZWxvdywgd2Ugb25seSBkcmF3IHRoZSBmaXJzdCBzcGVjdF9iYW5kcyBhbmQgaWdub3JlIGEgZmV3IDovCisgKgorICogeHRpbWUgZ3N0LWxhdW5jaC0wLjEwIC1xIGF1ZGlvdGVzdHNyYyBudW0tYnVmZmVycz0xMDAwMCAhIHNwZWN0cnVtIGJhbmRzPTE0NDEgISBmYWtlc2luaworICogMi4yOXUgMC4wMnMgMi4xNHIgMjU1MDRrQiBnc3QtbGF1bmNoLTAuMTAgLXEgYXVkaW90ZXN0c3JjIG51bS1idWZmZXJzPTEwMDAwICEgc3BlY3RydW0gYmFuZHM9MTQ0MSAhIGZha2VzaW5rCisgKiAyLjIwdSAwLjA1cyAyLjEwciAyNTY2NGtCIGdzdC1sYXVuY2gtMC4xMCAtcSBhdWRpb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MTAwMDAgISBzcGVjdHJ1bSBiYW5kcz0xNDQxICEgZmFrZXNpbmsKKyAqIDIuMjN1IDAuMDRzIDIuMTByIDI1NjY0a0IgZ3N0LWxhdW5jaC0wLjEwIC1xIGF1ZGlvdGVzdHNyYyBudW0tYnVmZmVycz0xMDAwMCAhIHNwZWN0cnVtIGJhbmRzPTE0NDEgISBmYWtlc2luaworICogCisgKiB4dGltZSBnc3QtbGF1bmNoLTAuMTAgLXEgYXVkaW90ZXN0c3JjIG51bS1idWZmZXJzPTEwMDAwICEgc3BlY3RydW0gYmFuZHM9MTQ0MCAhIGZha2VzaW5rCisgKiAyNS4wMXUgMC4wOHMgMjUuMDByIDI1NTUya0IgZ3N0LWxhdW5jaC0wLjEwIC1xIGF1ZGlvdGVzdHNyYyBudW0tYnVmZmVycz0xMDAwMCAhIHNwZWN0cnVtIGJhbmRzPTE0NDAgISBmYWtlc2luaworICogMjQuOTZ1IDAuMDNzIDI0Ljg4ciAyNTU2OGtCIGdzdC1sYXVuY2gtMC4xMCAtcSBhdWRpb3Rlc3RzcmMgbnVtLWJ1ZmZlcnM9MTAwMDAgISBzcGVjdHJ1bSBiYW5kcz0xNDQwICEgZmFrZXNpbmsKKyAqIDI1LjExdSAwLjAzcyAyNS4wM3IgMjU1MzZrQiBnc3QtbGF1bmNoLTAuMTAgLXEgYXVkaW90ZXN0c3JjIG51bS1idWZmZXJzPTEwMDAwICEgc3BlY3RydW0gYmFuZHM9MTQ0MCAhIGZha2VzaW5rCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisvKiBUT0RPOiBXZSB1c2UgZ2RrX2NhaXJvX2NyZWF0ZSgpIGFuZCBvdGhlcnMsIHdoaWNoIGFyZSBkZXByZWNhdGVkICovCisjZGVmaW5lIEdES19ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2ZmdC9nc3RmZnQuaD4KKyNpbmNsdWRlIDxndGsvZ3RrLmg+CisKKyNpZm5kZWYgREVGQVVMVF9BVURJT1NJTksKKyNkZWZpbmUgREVGQVVMVF9BVURJT1NJTksgImF1dG9hdWRpb3NpbmsiCisjZW5kaWYKKworc3RhdGljIGd1aW50IHNwZWN0X2hlaWdodCA9IDY0Oworc3RhdGljIGd1aW50IHNwZWN0X2JhbmRzID0gMjU2Oworc3RhdGljIGdmbG9hdCBoZWlnaHRfc2NhbGUgPSAxLjA7CitzdGF0aWMgZ2Jvb2xlYW4gZmFzdCA9IEZBTFNFOworCitzdGF0aWMgR3RrV2lkZ2V0ICpkcmF3aW5nYXJlYSA9IE5VTEw7CitzdGF0aWMgR3RrV2lkZ2V0ICpiYW5kc191c2VkID0gTlVMTDsKK3N0YXRpYyBHc3RDbG9jayAqc3luY19jbG9jayA9IE5VTEw7CisKK3N0YXRpYyB2b2lkCitvbl93aW5kb3dfZGVzdHJveSAoR09iamVjdCAqIG9iamVjdCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBkcmF3aW5nYXJlYSA9IE5VTEw7CisgIGd0a19tYWluX3F1aXQgKCk7Cit9CisKKy8qIGNvbnRyb2wgYXVkaW90ZXN0c3JjIGZyZXF1ZW5jeSAqLworc3RhdGljIHZvaWQKK29uX2ZyZXF1ZW5jeV9jaGFuZ2VkIChHdGtSYW5nZSAqIHJhbmdlLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdEVsZW1lbnQgKm1hY2hpbmUgPSBHU1RfRUxFTUVOVCAodXNlcl9kYXRhKTsKKyAgZ2RvdWJsZSB2YWx1ZSA9IGd0a19yYW5nZV9nZXRfdmFsdWUgKHJhbmdlKTsKKworICBnX29iamVjdF9zZXQgKG1hY2hpbmUsICJmcmVxIiwgdmFsdWUsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZAordXBkYXRlX3NwZWN0cnVtX2JhbmRzIChHc3RFbGVtZW50ICogc3BlY3RydW0pCit7CisgIGd1aW50IGJhbmRzID0gc3BlY3RfYmFuZHM7CisgIGdjaGFyIHN0cls1MF07CisKKyAgaWYgKGZhc3QpCisgICAgYmFuZHMgPSAoKGdzdF9mZnRfbmV4dF9mYXN0X2xlbmd0aCAoMiAqIGJhbmRzIC0gMikgKyAyKSAvIDIpOworCisgIHNwcmludGYgKHN0ciwgInVzaW5nICV1IGJhbmRzIiwgYmFuZHMpOworCisgIGdfb2JqZWN0X3NldCAoYmFuZHNfdXNlZCwgImxhYmVsIiwgc3RyLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc3BlY3RydW0pLCAiYmFuZHMiLCBiYW5kcywgTlVMTCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorb25fY29uZmlndXJlX2V2ZW50IChHdGtXaWRnZXQgKiB3aWRnZXQsIEdka0V2ZW50Q29uZmlndXJlICogZXZlbnQsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICAvKkdTVF9JTkZPICgiJWQgeCAlZCIsIGV2ZW50LT53aWR0aCwgZXZlbnQtPmhlaWdodCk7ICovCisgIHNwZWN0X2hlaWdodCA9IGV2ZW50LT5oZWlnaHQ7CisgIGhlaWdodF9zY2FsZSA9IGV2ZW50LT5oZWlnaHQgLyA2NC4wOworICBzcGVjdF9iYW5kcyA9IGV2ZW50LT53aWR0aDsKKworICB1cGRhdGVfc3BlY3RydW1fYmFuZHMgKEdTVF9FTEVNRU5UICh1c2VyX2RhdGEpKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorb25fZmFzdF9zbG93X21vZGVfY2hhbmdlZCAoR3RrVG9nZ2xlQnV0dG9uICogdG9nZ2xlYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIGZhc3QgPSBndGtfdG9nZ2xlX2J1dHRvbl9nZXRfYWN0aXZlICh0b2dnbGVidXR0b24pOworICB1cGRhdGVfc3BlY3RydW1fYmFuZHMgKEdTVF9FTEVNRU5UICh1c2VyX2RhdGEpKTsKK30KKworLyogZHJhdyBmcmVxdWVuY3kgc3BlY3RydW0gYXMgYSBidW5jaCBvZiBiYXJzICovCitzdGF0aWMgdm9pZAorZHJhd19zcGVjdHJ1bSAoZ2Zsb2F0ICogZGF0YSkKK3sKKyAgZ2ludCBpOworICBHZGtSZWN0YW5nbGUgcmVjdCA9IHsgMCwgMCwgc3BlY3RfYmFuZHMsIHNwZWN0X2hlaWdodCB9OworICBjYWlyb190ICpjcjsKKworICBpZiAoIWRyYXdpbmdhcmVhKQorICAgIHJldHVybjsKKworICBnZGtfd2luZG93X2JlZ2luX3BhaW50X3JlY3QgKGd0a193aWRnZXRfZ2V0X3dpbmRvdyAoZHJhd2luZ2FyZWEpLCAmcmVjdCk7CisgIGNyID0gZ2RrX2NhaXJvX2NyZWF0ZSAoZ3RrX3dpZGdldF9nZXRfd2luZG93IChkcmF3aW5nYXJlYSkpOworCisgIGNhaXJvX3NldF9zb3VyY2VfcmdiIChjciwgMCwgMCwgMCk7CisgIGNhaXJvX3JlY3RhbmdsZSAoY3IsIDAsIDAsIHNwZWN0X2JhbmRzLCBzcGVjdF9oZWlnaHQpOworICBjYWlyb19maWxsIChjcik7CisgIGNhaXJvX3NldF9zb3VyY2VfcmdiIChjciwgMSwgMSwgMSk7CisgIGZvciAoaSA9IDA7IGkgPCBzcGVjdF9iYW5kczsgaSsrKSB7CisgICAgY2Fpcm9fcmVjdGFuZ2xlIChjciwgaSwgLWRhdGFbaV0sIDEsIHNwZWN0X2hlaWdodCArIGRhdGFbaV0pOworICAgIGNhaXJvX2ZpbGwgKGNyKTsKKyAgfQorICBjYWlyb19kZXN0cm95IChjcik7CisKKyAgZ2RrX3dpbmRvd19lbmRfcGFpbnQgKGd0a193aWRnZXRfZ2V0X3dpbmRvdyAoZHJhd2luZ2FyZWEpKTsKK30KKworLyogcHJvY2VzcyBkZWxheWVkIG1lc3NhZ2UgKi8KK3N0YXRpYyBnYm9vbGVhbgorZGVsYXllZF9pZGxlX3NwZWN0cnVtX3VwZGF0ZSAoZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBkcmF3X3NwZWN0cnVtICgoZ2Zsb2F0ICopIHVzZXJfZGF0YSk7CisgIGdfZnJlZSAodXNlcl9kYXRhKTsKKyAgcmV0dXJuIChGQUxTRSk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorZGVsYXllZF9zcGVjdHJ1bV91cGRhdGUgKEdzdENsb2NrICogc3luY19jbG9jaywgR3N0Q2xvY2tUaW1lIHRpbWUsCisgICAgR3N0Q2xvY2tJRCBpZCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHRpbWUpKQorICAgIGdfaWRsZV9hZGQgKGRlbGF5ZWRfaWRsZV9zcGVjdHJ1bV91cGRhdGUsIHVzZXJfZGF0YSk7CisgIGVsc2UKKyAgICBnX2ZyZWUgKHVzZXJfZGF0YSk7CisgIHJldHVybiAoVFJVRSk7Cit9CisKKy8qIHJlY2VpdmUgc3BlY3RyYWwgZGF0YSBmcm9tIGVsZW1lbnQgbWVzc2FnZSAqLworc3RhdGljIGdib29sZWFuCittZXNzYWdlX2hhbmRsZXIgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIGdwb2ludGVyIGRhdGEpCit7CisgIGlmIChtZXNzYWdlLT50eXBlID09IEdTVF9NRVNTQUdFX0VMRU1FTlQpIHsKKyAgICBjb25zdCBHc3RTdHJ1Y3R1cmUgKnMgPSBnc3RfbWVzc2FnZV9nZXRfc3RydWN0dXJlIChtZXNzYWdlKTsKKyAgICBjb25zdCBnY2hhciAqbmFtZSA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X25hbWUgKHMpOworCisgICAgaWYgKHN0cmNtcCAobmFtZSwgInNwZWN0cnVtIikgPT0gMCkgeworICAgICAgR3N0RWxlbWVudCAqc3BlY3RydW0gPSBHU1RfRUxFTUVOVCAoR1NUX01FU1NBR0VfU1JDIChtZXNzYWdlKSk7CisgICAgICBHc3RDbG9ja1RpbWUgdGltZXN0YW1wLCBkdXJhdGlvbjsKKyAgICAgIEdzdENsb2NrVGltZSB3YWl0dGltZSA9IEdTVF9DTE9DS19USU1FX05PTkU7CisKKyAgICAgIGlmIChnc3Rfc3RydWN0dXJlX2dldF9jbG9ja190aW1lIChzLCAicnVubmluZy10aW1lIiwgJnRpbWVzdGFtcCkgJiYKKyAgICAgICAgICBnc3Rfc3RydWN0dXJlX2dldF9jbG9ja190aW1lIChzLCAiZHVyYXRpb24iLCAmZHVyYXRpb24pKSB7CisgICAgICAgIC8qIHdhaXQgZm9yIG1pZGRsZSBvZiBidWZmZXIgKi8KKyAgICAgICAgd2FpdHRpbWUgPSB0aW1lc3RhbXAgKyBkdXJhdGlvbiAvIDI7CisgICAgICB9IGVsc2UgaWYgKGdzdF9zdHJ1Y3R1cmVfZ2V0X2Nsb2NrX3RpbWUgKHMsICJlbmR0aW1lIiwgJnRpbWVzdGFtcCkpIHsKKyAgICAgICAgd2FpdHRpbWUgPSB0aW1lc3RhbXA7CisgICAgICB9CisgICAgICBpZiAoR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQgKHdhaXR0aW1lKSkgeworICAgICAgICBHc3RDbG9ja0lEIGNsb2NrX2lkOworICAgICAgICBHc3RDbG9ja1RpbWUgYmFzZXRpbWUgPSBnc3RfZWxlbWVudF9nZXRfYmFzZV90aW1lIChzcGVjdHJ1bSk7CisgICAgICAgIGdmbG9hdCAqc3BlY3QgPSBnX25ldyAoZ2Zsb2F0LCBzcGVjdF9iYW5kcyk7CisgICAgICAgIGNvbnN0IEdWYWx1ZSAqbGlzdDsKKyAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZTsKKyAgICAgICAgZ3VpbnQgaTsKKworICAgICAgICBsaXN0ID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJtYWduaXR1ZGUiKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNwZWN0X2JhbmRzOyArK2kpIHsKKyAgICAgICAgICB2YWx1ZSA9IGdzdF92YWx1ZV9saXN0X2dldF92YWx1ZSAobGlzdCwgaSk7CisgICAgICAgICAgc3BlY3RbaV0gPSBoZWlnaHRfc2NhbGUgKiBnX3ZhbHVlX2dldF9mbG9hdCAodmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgY2xvY2tfaWQgPQorICAgICAgICAgICAgZ3N0X2Nsb2NrX25ld19zaW5nbGVfc2hvdF9pZCAoc3luY19jbG9jaywgd2FpdHRpbWUgKyBiYXNldGltZSk7CisgICAgICAgIGdzdF9jbG9ja19pZF93YWl0X2FzeW5jIChjbG9ja19pZCwgZGVsYXllZF9zcGVjdHJ1bV91cGRhdGUsCisgICAgICAgICAgICAoZ3BvaW50ZXIpIHNwZWN0LCBOVUxMKTsKKyAgICAgICAgZ3N0X2Nsb2NrX2lkX3VucmVmIChjbG9ja19pZCk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIEdzdEVsZW1lbnQgKmJpbjsKKyAgR3N0RWxlbWVudCAqc3JjLCAqc3BlY3RydW0sICphdWRpb2NvbnZlcnQsICpzaW5rOworICBHc3RCdXMgKmJ1czsKKyAgR3RrV2lkZ2V0ICphcHB3aW5kb3csICp2Ym94LCAqaGJveCwgKndpZGdldDsKKworICBnc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKyAgZ3RrX2luaXQgKCZhcmdjLCAmYXJndik7CisKKyAgYmluID0gZ3N0X3BpcGVsaW5lX25ldyAoImJpbiIpOworCisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvdGVzdHNyYyIsICJzcmMiKTsKKyAgZ19vYmplY3Rfc2V0IChHX09CSkVDVCAoc3JjKSwgIndhdmUiLCAwLCBOVUxMKTsKKworICBzcGVjdHJ1bSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInNwZWN0cnVtIiwgInNwZWN0cnVtIik7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNwZWN0cnVtKSwgImJhbmRzIiwgc3BlY3RfYmFuZHMsICJ0aHJlc2hvbGQiLCAtODAsCisgICAgICAicG9zdC1tZXNzYWdlcyIsIFRSVUUsIE5VTEwpOworCisgIGF1ZGlvY29udmVydCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImF1ZGlvY29udmVydCIsICJhdWRpb2NvbnZlcnQiKTsKKworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlIChERUZBVUxUX0FVRElPU0lOSywgInNpbmsiKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChiaW4pLCBzcmMsIHNwZWN0cnVtLCBhdWRpb2NvbnZlcnQsIHNpbmssIE5VTEwpOworICBpZiAoIWdzdF9lbGVtZW50X2xpbmtfbWFueSAoc3JjLCBzcGVjdHJ1bSwgYXVkaW9jb252ZXJ0LCBzaW5rLCBOVUxMKSkgeworICAgIGZwcmludGYgKHN0ZGVyciwgImNhbid0IGxpbmsgZWxlbWVudHNcbiIpOworICAgIGV4aXQgKDEpOworICB9CisKKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAoYmluKTsKKyAgZ3N0X2J1c19hZGRfd2F0Y2ggKGJ1cywgbWVzc2FnZV9oYW5kbGVyLCBOVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKworICBzeW5jX2Nsb2NrID0gZ3N0X3BpcGVsaW5lX2dldF9jbG9jayAoR1NUX1BJUEVMSU5FIChiaW4pKTsKKworICBhcHB3aW5kb3cgPSBndGtfd2luZG93X25ldyAoR1RLX1dJTkRPV19UT1BMRVZFTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChhcHB3aW5kb3cpLCAiZGVzdHJveSIsCisgICAgICBHX0NBTExCQUNLIChvbl93aW5kb3dfZGVzdHJveSksIE5VTEwpOworICB2Ym94ID0gZ3RrX2JveF9uZXcgKEdUS19PUklFTlRBVElPTl9WRVJUSUNBTCwgNik7CisKKyAgaGJveCA9IGd0a19ib3hfbmV3IChHVEtfT1JJRU5UQVRJT05fSE9SSVpPTlRBTCwgNik7CisgIHdpZGdldCA9IGd0a19jaGVja19idXR0b25fbmV3X3dpdGhfbGFiZWwgKCJGYXN0Iik7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUICh3aWRnZXQpLCAidG9nZ2xlZCIsCisgICAgICBHX0NBTExCQUNLIChvbl9mYXN0X3Nsb3dfbW9kZV9jaGFuZ2VkKSwgKGdwb2ludGVyKSBzcGVjdHJ1bSk7CisgIGd0a19ib3hfcGFja19zdGFydCAoR1RLX0JPWCAoaGJveCksIHdpZGdldCwgRkFMU0UsIEZBTFNFLCAwKTsKKyAgYmFuZHNfdXNlZCA9IGd0a19sYWJlbF9uZXcgKCIiKTsKKyAgZ3RrX2JveF9wYWNrX3N0YXJ0IChHVEtfQk9YIChoYm94KSwgYmFuZHNfdXNlZCwgRkFMU0UsIEZBTFNFLCAwKTsKKworICBndGtfYm94X3BhY2tfc3RhcnQgKEdUS19CT1ggKHZib3gpLCBoYm94LCBGQUxTRSwgRkFMU0UsIDApOworCisgIHdpZGdldCA9IGd0a19zY2FsZV9uZXdfd2l0aF9yYW5nZSAoR1RLX09SSUVOVEFUSU9OX0hPUklaT05UQUwsCisgICAgICA1MC4wLCAyMDAwMC4wLCAxMCk7CisgIGd0a19zY2FsZV9zZXRfZHJhd192YWx1ZSAoR1RLX1NDQUxFICh3aWRnZXQpLCBUUlVFKTsKKyAgZ3RrX3NjYWxlX3NldF92YWx1ZV9wb3MgKEdUS19TQ0FMRSAod2lkZ2V0KSwgR1RLX1BPU19UT1ApOworICBndGtfcmFuZ2Vfc2V0X3ZhbHVlIChHVEtfUkFOR0UgKHdpZGdldCksIDQ0MC4wKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoR19PQkpFQ1QgKHdpZGdldCksICJ2YWx1ZS1jaGFuZ2VkIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKG9uX2ZyZXF1ZW5jeV9jaGFuZ2VkKSwgKGdwb2ludGVyKSBzcmMpOworICBndGtfYm94X3BhY2tfc3RhcnQgKEdUS19CT1ggKHZib3gpLCB3aWRnZXQsIEZBTFNFLCBGQUxTRSwgMCk7CisKKyAgZHJhd2luZ2FyZWEgPSBndGtfZHJhd2luZ19hcmVhX25ldyAoKTsKKyAgZ3RrX3dpZGdldF9zZXRfc2l6ZV9yZXF1ZXN0IChkcmF3aW5nYXJlYSwgc3BlY3RfYmFuZHMsIHNwZWN0X2hlaWdodCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChkcmF3aW5nYXJlYSksICJjb25maWd1cmUtZXZlbnQiLAorICAgICAgR19DQUxMQkFDSyAob25fY29uZmlndXJlX2V2ZW50KSwgKGdwb2ludGVyKSBzcGVjdHJ1bSk7CisgIGd0a19ib3hfcGFja19zdGFydCAoR1RLX0JPWCAodmJveCksIGRyYXdpbmdhcmVhLCBUUlVFLCBUUlVFLCAwKTsKKworICBndGtfY29udGFpbmVyX2FkZCAoR1RLX0NPTlRBSU5FUiAoYXBwd2luZG93KSwgdmJveCk7CisgIGd0a193aWRnZXRfc2hvd19hbGwgKGFwcHdpbmRvdyk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9QTEFZSU5HKTsKKyAgZ3RrX21haW4gKCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoc3luY19jbG9jayk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJpbik7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9kZW1vLW9zc3NyYy5jIGIvdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1vc3NzcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTViMTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vZGVtby1vc3NzcmMuYwpAQCAtMCwwICsxLDIxMSBAQAorLyogR1N0cmVhbWVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU3RlZmFuIEtvc3QgPGVuc29uaWNAdXNlcnMuc2YubmV0PgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworLyogVE9ETzogV2UgdXNlIGdka19jYWlyb19jcmVhdGUoKSBhbmQgb3RoZXJzLCB3aGljaCBhcmUgZGVwcmVjYXRlZCAqLworI2RlZmluZSBHREtfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorI2luY2x1ZGUgPGd0ay9ndGsuaD4KKworI2lmbmRlZiBERUZBVUxUX0FVRElPU1JDCisjZGVmaW5lIERFRkFVTFRfQVVESU9TUkMgImFsc2FzcmMiCisjZW5kaWYKKworc3RhdGljIGd1aW50IHNwZWN0X2hlaWdodCA9IDY0Oworc3RhdGljIGd1aW50IHNwZWN0X2JhbmRzID0gMjU2Oworc3RhdGljIGdmbG9hdCBoZWlnaHRfc2NhbGUgPSAxLjA7CisKK3N0YXRpYyBHdGtXaWRnZXQgKmRyYXdpbmdhcmVhID0gTlVMTDsKK3N0YXRpYyBHc3RDbG9jayAqc3luY19jbG9jayA9IE5VTEw7CisKK3N0YXRpYyB2b2lkCitvbl93aW5kb3dfZGVzdHJveSAoR09iamVjdCAqIG9iamVjdCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBkcmF3aW5nYXJlYSA9IE5VTEw7CisgIGd0a19tYWluX3F1aXQgKCk7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgorb25fY29uZmlndXJlX2V2ZW50IChHdGtXaWRnZXQgKiB3aWRnZXQsIEdka0V2ZW50Q29uZmlndXJlICogZXZlbnQsCisgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHc3RFbGVtZW50ICpzcGVjdHJ1bSA9IEdTVF9FTEVNRU5UICh1c2VyX2RhdGEpOworCisgIC8qR1NUX0lORk8gKCIlZCB4ICVkIiwgZXZlbnQtPndpZHRoLCBldmVudC0+aGVpZ2h0KTsgKi8KKyAgc3BlY3RfaGVpZ2h0ID0gZXZlbnQtPmhlaWdodDsKKyAgaGVpZ2h0X3NjYWxlID0gZXZlbnQtPmhlaWdodCAvIDY0LjA7CisgIHNwZWN0X2JhbmRzID0gZXZlbnQtPndpZHRoOworCisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNwZWN0cnVtKSwgImJhbmRzIiwgc3BlY3RfYmFuZHMsIE5VTEwpOworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qIGRyYXcgZnJlcXVlbmN5IHNwZWN0cnVtIGFzIGEgYnVuY2ggb2YgYmFycyAqLworc3RhdGljIHZvaWQKK2RyYXdfc3BlY3RydW0gKGdmbG9hdCAqIGRhdGEpCit7CisgIGdpbnQgaTsKKyAgR2RrUmVjdGFuZ2xlIHJlY3QgPSB7IDAsIDAsIHNwZWN0X2JhbmRzLCBzcGVjdF9oZWlnaHQgfTsKKyAgY2Fpcm9fdCAqY3I7CisKKyAgaWYgKCFkcmF3aW5nYXJlYSkKKyAgICByZXR1cm47CisKKyAgZ2RrX3dpbmRvd19iZWdpbl9wYWludF9yZWN0IChndGtfd2lkZ2V0X2dldF93aW5kb3cgKGRyYXdpbmdhcmVhKSwgJnJlY3QpOworICBjciA9IGdka19jYWlyb19jcmVhdGUgKGd0a193aWRnZXRfZ2V0X3dpbmRvdyAoZHJhd2luZ2FyZWEpKTsKKworICBjYWlyb19zZXRfc291cmNlX3JnYiAoY3IsIDAsIDAsIDApOworICBjYWlyb19yZWN0YW5nbGUgKGNyLCAwLCAwLCBzcGVjdF9iYW5kcywgc3BlY3RfaGVpZ2h0KTsKKyAgY2Fpcm9fZmlsbCAoY3IpOworICBjYWlyb19zZXRfc291cmNlX3JnYiAoY3IsIDEsIDEsIDEpOworICBmb3IgKGkgPSAwOyBpIDwgc3BlY3RfYmFuZHM7IGkrKykgeworICAgIGNhaXJvX3JlY3RhbmdsZSAoY3IsIGksIC1kYXRhW2ldLCAxLCBzcGVjdF9oZWlnaHQgKyBkYXRhW2ldKTsKKyAgICBjYWlyb19maWxsIChjcik7CisgIH0KKyAgY2Fpcm9fZGVzdHJveSAoY3IpOworCisgIGdka193aW5kb3dfZW5kX3BhaW50IChndGtfd2lkZ2V0X2dldF93aW5kb3cgKGRyYXdpbmdhcmVhKSk7Cit9CisKKy8qIHByb2Nlc3MgZGVsYXllZCBtZXNzYWdlICovCitzdGF0aWMgZ2Jvb2xlYW4KK2RlbGF5ZWRfaWRsZV9zcGVjdHJ1bV91cGRhdGUgKGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgZHJhd19zcGVjdHJ1bSAoKGdmbG9hdCAqKSB1c2VyX2RhdGEpOworICBnX2ZyZWUgKHVzZXJfZGF0YSk7CisgIHJldHVybiAoRkFMU0UpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2RlbGF5ZWRfc3BlY3RydW1fdXBkYXRlIChHc3RDbG9jayAqIHN5bmNfY2xvY2ssIEdzdENsb2NrVGltZSB0aW1lLAorICAgIEdzdENsb2NrSUQgaWQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEICh0aW1lKSkKKyAgICBnX2lkbGVfYWRkIChkZWxheWVkX2lkbGVfc3BlY3RydW1fdXBkYXRlLCB1c2VyX2RhdGEpOworICBlbHNlCisgICAgZ19mcmVlICh1c2VyX2RhdGEpOworICByZXR1cm4gKFRSVUUpOworfQorCisvKiByZWNlaXZlIHNwZWN0cmFsIGRhdGEgZnJvbSBlbGVtZW50IG1lc3NhZ2UgKi8KK3N0YXRpYyBnYm9vbGVhbgorbWVzc2FnZV9oYW5kbGVyIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBncG9pbnRlciBkYXRhKQoreworICBpZiAobWVzc2FnZS0+dHlwZSA9PSBHU1RfTUVTU0FHRV9FTEVNRU5UKSB7CisgICAgY29uc3QgR3N0U3RydWN0dXJlICpzID0gZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobWVzc2FnZSk7CisgICAgY29uc3QgZ2NoYXIgKm5hbWUgPSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKTsKKworICAgIGlmIChzdHJjbXAgKG5hbWUsICJzcGVjdHJ1bSIpID09IDApIHsKKyAgICAgIEdzdEVsZW1lbnQgKnNwZWN0cnVtID0gR1NUX0VMRU1FTlQgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSkpOworICAgICAgR3N0Q2xvY2tUaW1lIHRpbWVzdGFtcCwgZHVyYXRpb247CisgICAgICBHc3RDbG9ja1RpbWUgd2FpdHRpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgICAgICBpZiAoZ3N0X3N0cnVjdHVyZV9nZXRfY2xvY2tfdGltZSAocywgInJ1bm5pbmctdGltZSIsICZ0aW1lc3RhbXApICYmCisgICAgICAgICAgZ3N0X3N0cnVjdHVyZV9nZXRfY2xvY2tfdGltZSAocywgImR1cmF0aW9uIiwgJmR1cmF0aW9uKSkgeworICAgICAgICAvKiB3YWl0IGZvciBtaWRkbGUgb2YgYnVmZmVyICovCisgICAgICAgIHdhaXR0aW1lID0gdGltZXN0YW1wICsgZHVyYXRpb24gLyAyOworICAgICAgfSBlbHNlIGlmIChnc3Rfc3RydWN0dXJlX2dldF9jbG9ja190aW1lIChzLCAiZW5kdGltZSIsICZ0aW1lc3RhbXApKSB7CisgICAgICAgIHdhaXR0aW1lID0gdGltZXN0YW1wOworICAgICAgfQorICAgICAgaWYgKEdTVF9DTE9DS19USU1FX0lTX1ZBTElEICh3YWl0dGltZSkpIHsKKyAgICAgICAgR3N0Q2xvY2tJRCBjbG9ja19pZDsKKyAgICAgICAgR3N0Q2xvY2tUaW1lIGJhc2V0aW1lID0gZ3N0X2VsZW1lbnRfZ2V0X2Jhc2VfdGltZSAoc3BlY3RydW0pOworICAgICAgICBnZmxvYXQgKnNwZWN0ID0gZ19uZXcgKGdmbG9hdCwgc3BlY3RfYmFuZHMpOworICAgICAgICBjb25zdCBHVmFsdWUgKmxpc3Q7CisgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWU7CisgICAgICAgIGd1aW50IGk7CisKKyAgICAgICAgbGlzdCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAibWFnbml0dWRlIik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcGVjdF9iYW5kczsgKytpKSB7CisgICAgICAgICAgdmFsdWUgPSBnc3RfdmFsdWVfbGlzdF9nZXRfdmFsdWUgKGxpc3QsIGkpOworICAgICAgICAgIHNwZWN0W2ldID0gaGVpZ2h0X3NjYWxlICogZ192YWx1ZV9nZXRfZmxvYXQgKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGNsb2NrX2lkID0KKyAgICAgICAgICAgIGdzdF9jbG9ja19uZXdfc2luZ2xlX3Nob3RfaWQgKHN5bmNfY2xvY2ssIHdhaXR0aW1lICsgYmFzZXRpbWUpOworICAgICAgICBnc3RfY2xvY2tfaWRfd2FpdF9hc3luYyAoY2xvY2tfaWQsIGRlbGF5ZWRfc3BlY3RydW1fdXBkYXRlLAorICAgICAgICAgICAgKGdwb2ludGVyKSBzcGVjdCwgTlVMTCk7CisgICAgICAgIGdzdF9jbG9ja19pZF91bnJlZiAoY2xvY2tfaWQpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBHc3RFbGVtZW50ICpiaW47CisgIEdzdEVsZW1lbnQgKnNyYywgKnNwZWN0cnVtLCAqc2luazsKKyAgR3N0QnVzICpidXM7CisgIEd0a1dpZGdldCAqYXBwd2luZG93OworCisgIGdzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworICBndGtfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICBiaW4gPSBnc3RfcGlwZWxpbmVfbmV3ICgiYmluIik7CisKKyAgc3JjID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlIChERUZBVUxUX0FVRElPU1JDLCAic3JjIik7CisKKyAgc3BlY3RydW0gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJzcGVjdHJ1bSIsICJzcGVjdHJ1bSIpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzcGVjdHJ1bSksICJiYW5kcyIsIHNwZWN0X2JhbmRzLCAidGhyZXNob2xkIiwgLTgwLAorICAgICAgInBvc3QtbWVzc2FnZXMiLCBUUlVFLCBOVUxMKTsKKworICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiZmFrZXNpbmsiLCAic2luayIpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKGJpbiksIHNyYywgc3BlY3RydW0sIHNpbmssIE5VTEwpOworICBpZiAoIWdzdF9lbGVtZW50X2xpbmtfbWFueSAoc3JjLCBzcGVjdHJ1bSwgc2luaywgTlVMTCkpIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJjYW4ndCBsaW5rIGVsZW1lbnRzXG4iKTsKKyAgICBleGl0ICgxKTsKKyAgfQorCisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKGJpbik7CisgIGdzdF9idXNfYWRkX3dhdGNoIChidXMsIG1lc3NhZ2VfaGFuZGxlciwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgc3luY19jbG9jayA9IGdzdF9waXBlbGluZV9nZXRfY2xvY2sgKEdTVF9QSVBFTElORSAoYmluKSk7CisKKyAgYXBwd2luZG93ID0gZ3RrX3dpbmRvd19uZXcgKEdUS19XSU5ET1dfVE9QTEVWRUwpOworICBnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoYXBwd2luZG93KSwgImRlc3Ryb3kiLAorICAgICAgR19DQUxMQkFDSyAob25fd2luZG93X2Rlc3Ryb3kpLCBOVUxMKTsKKworICBkcmF3aW5nYXJlYSA9IGd0a19kcmF3aW5nX2FyZWFfbmV3ICgpOworICBndGtfd2lkZ2V0X3NldF9zaXplX3JlcXVlc3QgKGRyYXdpbmdhcmVhLCBzcGVjdF9iYW5kcywgc3BlY3RfaGVpZ2h0KTsKKyAgZ19zaWduYWxfY29ubmVjdCAoR19PQkpFQ1QgKGRyYXdpbmdhcmVhKSwgImNvbmZpZ3VyZS1ldmVudCIsCisgICAgICBHX0NBTExCQUNLIChvbl9jb25maWd1cmVfZXZlbnQpLCAoZ3BvaW50ZXIpIHNwZWN0cnVtKTsKKyAgZ3RrX2NvbnRhaW5lcl9hZGQgKEdUS19DT05UQUlORVIgKGFwcHdpbmRvdyksIGRyYXdpbmdhcmVhKTsKKyAgZ3RrX3dpZGdldF9zaG93X2FsbCAoYXBwd2luZG93KTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBndGtfbWFpbiAoKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9OVUxMKTsKKworICBnc3Rfb2JqZWN0X3VucmVmIChzeW5jX2Nsb2NrKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoYmluKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL21lc29uLmJ1aWxkIGIvdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllZWNkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3NwZWN0cnVtL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMTcgQEAKK2V4ZWN1dGFibGUoJ2RlbW8tYXVkaW90ZXN0JywgJ2RlbW8tYXVkaW90ZXN0LmMnLAorICBkZXBlbmRlbmNpZXM6IFtnc3RmZnRfZGVwLCBnc3RfZGVwLCBndGtfZGVwXSwKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGluc3RhbGw6IGZhbHNlKQorCitleGVjdXRhYmxlKCdkZW1vLW9zc3NyYycsICdkZW1vLW9zc3NyYy5jJywKKyAgZGVwZW5kZW5jaWVzOiBbZ3N0X2RlcCwgZ3RrX2RlcF0sCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBpbnN0YWxsOiBmYWxzZSkKKworZXhlY3V0YWJsZSgnc3BlY3RydW0tZXhhbXBsZScsICdzcGVjdHJ1bS1leGFtcGxlLmMnLAorICBkZXBlbmRlbmNpZXM6IFtnc3RfZGVwLCBndGtfZGVwXSwKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGluc3RhbGw6IGZhbHNlKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vc3BlY3RydW0tZXhhbXBsZS5jIGIvdGVzdHMvZXhhbXBsZXMvc3BlY3RydW0vc3BlY3RydW0tZXhhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNTJiNGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leGFtcGxlcy9zcGVjdHJ1bS9zcGVjdHJ1bS1leGFtcGxlLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDA2IFN0ZWZhbiBLb3N0IDxlbnNvbmljQHVzZXJzLnNmLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBKYW4gU2NobWlkdCA8amFuLnNjaG1pZHRAc3VuLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK3N0YXRpYyBndWludCBzcGVjdF9iYW5kcyA9IDIwOworCisjZGVmaW5lIEFVRElPRlJFUSAzMjAwMAorCisvKiByZWNlaXZlIHNwZWN0cmFsIGRhdGEgZnJvbSBlbGVtZW50IG1lc3NhZ2UgKi8KK3N0YXRpYyBnYm9vbGVhbgorbWVzc2FnZV9oYW5kbGVyIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBncG9pbnRlciBkYXRhKQoreworICBpZiAobWVzc2FnZS0+dHlwZSA9PSBHU1RfTUVTU0FHRV9FTEVNRU5UKSB7CisgICAgY29uc3QgR3N0U3RydWN0dXJlICpzID0gZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobWVzc2FnZSk7CisgICAgY29uc3QgZ2NoYXIgKm5hbWUgPSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKTsKKyAgICBHc3RDbG9ja1RpbWUgZW5kdGltZTsKKworICAgIGlmIChzdHJjbXAgKG5hbWUsICJzcGVjdHJ1bSIpID09IDApIHsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqbWFnbml0dWRlczsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqcGhhc2VzOworICAgICAgY29uc3QgR1ZhbHVlICptYWcsICpwaGFzZTsKKyAgICAgIGdkb3VibGUgZnJlcTsKKyAgICAgIGd1aW50IGk7CisKKyAgICAgIGlmICghZ3N0X3N0cnVjdHVyZV9nZXRfY2xvY2tfdGltZSAocywgImVuZHRpbWUiLCAmZW5kdGltZSkpCisgICAgICAgIGVuZHRpbWUgPSBHU1RfQ0xPQ0tfVElNRV9OT05FOworCisgICAgICBnX3ByaW50ICgiTmV3IHNwZWN0cnVtIG1lc3NhZ2UsIGVuZHRpbWUgJSIgR1NUX1RJTUVfRk9STUFUICJcbiIsCisgICAgICAgICAgR1NUX1RJTUVfQVJHUyAoZW5kdGltZSkpOworCisgICAgICBtYWduaXR1ZGVzID0gZ3N0X3N0cnVjdHVyZV9nZXRfdmFsdWUgKHMsICJtYWduaXR1ZGUiKTsKKyAgICAgIHBoYXNlcyA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzLCAicGhhc2UiKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IHNwZWN0X2JhbmRzOyArK2kpIHsKKyAgICAgICAgZnJlcSA9IChnZG91YmxlKSAoKEFVRElPRlJFUSAvIDIpICogaSArIEFVRElPRlJFUSAvIDQpIC8gc3BlY3RfYmFuZHM7CisgICAgICAgIG1hZyA9IGdzdF92YWx1ZV9saXN0X2dldF92YWx1ZSAobWFnbml0dWRlcywgaSk7CisgICAgICAgIHBoYXNlID0gZ3N0X3ZhbHVlX2xpc3RfZ2V0X3ZhbHVlIChwaGFzZXMsIGkpOworCisgICAgICAgIGlmIChtYWcgIT0gTlVMTCAmJiBwaGFzZSAhPSBOVUxMKSB7CisgICAgICAgICAgZ19wcmludCAoImJhbmQgJWQgKGZyZXEgJWcpOiBtYWduaXR1ZGUgJWYgZEIgcGhhc2UgJWZcbiIsIGksIGZyZXEsCisgICAgICAgICAgICAgIGdfdmFsdWVfZ2V0X2Zsb2F0IChtYWcpLCBnX3ZhbHVlX2dldF9mbG9hdCAocGhhc2UpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ19wcmludCAoIlxuIik7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIEdzdEVsZW1lbnQgKmJpbjsKKyAgR3N0RWxlbWVudCAqc3JjLCAqYXVkaW9jb252ZXJ0LCAqc3BlY3RydW0sICpzaW5rOworICBHc3RCdXMgKmJ1czsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR01haW5Mb29wICpsb29wOworCisgIGdzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGJpbiA9IGdzdF9waXBlbGluZV9uZXcgKCJiaW4iKTsKKworICBzcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb3Rlc3RzcmMiLCAic3JjIik7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNyYyksICJ3YXZlIiwgMCwgImZyZXEiLCA2MDAwLjAsIE5VTEwpOworICBhdWRpb2NvbnZlcnQgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb2NvbnZlcnQiLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGF1ZGlvY29udmVydCk7CisKKyAgc3BlY3RydW0gPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJzcGVjdHJ1bSIsICJzcGVjdHJ1bSIpOworICBnX29iamVjdF9zZXQgKEdfT0JKRUNUIChzcGVjdHJ1bSksICJiYW5kcyIsIHNwZWN0X2JhbmRzLCAidGhyZXNob2xkIiwgLTgwLAorICAgICAgInBvc3QtbWVzc2FnZXMiLCBUUlVFLCAibWVzc2FnZS1waGFzZSIsIFRSVUUsIE5VTEwpOworCisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmYWtlc2luayIsICJzaW5rIik7CisgIGdfb2JqZWN0X3NldCAoR19PQkpFQ1QgKHNpbmspLCAic3luYyIsIFRSVUUsIE5VTEwpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKGJpbiksIHNyYywgYXVkaW9jb252ZXJ0LCBzcGVjdHJ1bSwgc2luaywgTlVMTCk7CisKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAicmF0ZSIsIEdfVFlQRV9JTlQsIEFVRElPRlJFUSwgTlVMTCk7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rIChzcmMsIGF1ZGlvY29udmVydCkgfHwKKyAgICAgICFnc3RfZWxlbWVudF9saW5rX2ZpbHRlcmVkIChhdWRpb2NvbnZlcnQsIHNwZWN0cnVtLCBjYXBzKSB8fAorICAgICAgIWdzdF9lbGVtZW50X2xpbmsgKHNwZWN0cnVtLCBzaW5rKSkgeworICAgIGZwcmludGYgKHN0ZGVyciwgImNhbid0IGxpbmsgZWxlbWVudHNcbiIpOworICAgIGV4aXQgKDEpOworICB9CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICBidXMgPSBnc3RfZWxlbWVudF9nZXRfYnVzIChiaW4pOworICBnc3RfYnVzX2FkZF93YXRjaCAoYnVzLCBtZXNzYWdlX2hhbmRsZXIsIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgLyogd2UgbmVlZCB0byBydW4gYSBHTGliIG1haW4gbG9vcCB0byBnZXQgdGhlIG1lc3NhZ2VzICovCisgIGxvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKGJpbiwgR1NUX1NUQVRFX05VTEwpOworCisgIGdzdF9vYmplY3RfdW5yZWYgKGJpbik7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy92NGwyLy5naXRpZ25vcmUgYi90ZXN0cy9leGFtcGxlcy92NGwyLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk0ZGJmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3Y0bDIvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMgQEAKK2NhbWN0cmwKK3Byb2JlCit2NGwyc3JjLXJlbmVnb3RpYXRlCmRpZmYgLS1naXQgYS90ZXN0cy9leGFtcGxlcy92NGwyL01ha2VmaWxlLmFtIGIvdGVzdHMvZXhhbXBsZXMvdjRsMi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmI0MTY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvdjRsMi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDkgQEAKK25vaW5zdF9QUk9HUkFNUyA9IGNhbWN0cmwgdjRsMnNyYy1yZW5lZ290aWF0ZQorCitjYW1jdHJsX1NPVVJDRVMgPSBjYW1jdHJsLmMKK2NhbWN0cmxfQ0ZMQUdTICA9ICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DT05UUk9MTEVSX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQorY2FtY3RybF9MREFERCA9ICQoR1NUX0JBU0VfTElCUykgJChHU1RfQ09OVFJPTExFUl9MSUJTKSAkKEdTVF9MSUJTKQorCit2NGwyc3JjX3JlbmVnb3RpYXRlX1NPVVJDRVMgPSB2NGwyc3JjLXJlbmVnb3RpYXRlLmMKK3Y0bDJzcmNfcmVuZWdvdGlhdGVfQ0ZMQUdTICA9ICQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpCit2NGwyc3JjX3JlbmVnb3RpYXRlX0xEQUREID0gJChHU1RfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvdjRsMi9jYW1jdHJsLmMgYi90ZXN0cy9leGFtcGxlcy92NGwyL2NhbWN0cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjYxNzIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvdjRsMi9jYW1jdHJsLmMKQEAgLTAsMCArMSwyMDEgQEAKKy8qIEdTdHJlYW1lcgorICogQ29weXJpZ2h0IChDKSAyMDEwIFN0ZWZhbiBLb3N0IDxzdGVmYW4ua29zdEBub2tpYS5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKy8qIGRlbW8gZm9yIHVzaW5nIGdzdGNvbnRyb2xlciB3aXRoIGNhbWVyYSBjYXB0dXJlIGZvciBlLmcuIGJyYWNrZXRpbmcKKyAqCisgKiBnY2MgYHBrZy1jb25maWcgLS1jZmxhZ3MgLS1saWJzIGdzdHJlYW1lci0wLjEwIGdzdHJlYW1lci1jb250cm9sbGVyLTAuMTBgIGNhbWN0cmwuYyAtbyBjYW1jdHJsCisgKgorICogVE9ETzoKKyAqIC0gaGFuZGxlIHN0cmVhbSBzdGF0dXMgYW5kIHN3aXRjaCBjYXB0dXJlIHRocmVhZCB0byBTQ0hFRF9SUi9GSUZPCisgKiAtIHdlIHdhbnQgc29tZSBmZWVkYmFjayBhYm91dCBob3cgcHJlY2lzZWx5IGEgcHJvZ3JhbSBjYW4gYmUgcmVhbGl6ZWQKKyAqICAgLSB3ZSBtaWdodCB3YW50IHRvIGFkanVzdCB0aGUgZnJhbWVyYXRlIHRvIGhhbmRsZSBoYXJkd2FyZSBsaW1taXRzCisgKiAtIHdlIGUuZy4gY2FuJ3QgY2hhbmdlIHJlc29sdXRpb24gcGVyIGZyYW1lIHJpZ2h0IG5vdworICovCisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L2NvbnRyb2xsZXIvZ3N0aW50ZXJwb2xhdGlvbmNvbnRyb2xzb3VyY2UuaD4KKyNpbmNsdWRlIDxnc3QvY29udHJvbGxlci9nc3RkaXJlY3Rjb250cm9sYmluZGluZy5oPgorCitzdGF0aWMgdm9pZAorZXZlbnRfbG9vcCAoR3N0RWxlbWVudCAqIGJpbikKK3sKKyAgR3N0QnVzICpidXM7CisgIEdzdE1lc3NhZ2UgKm1lc3NhZ2UgPSBOVUxMOworCisgIGJ1cyA9IGdzdF9lbGVtZW50X2dldF9idXMgKEdTVF9FTEVNRU5UIChiaW4pKTsKKworICB3aGlsZSAoVFJVRSkgeworICAgIG1lc3NhZ2UgPSBnc3RfYnVzX3BvbGwgKGJ1cywgR1NUX01FU1NBR0VfQU5ZLCAtMSk7CisKKyAgICBzd2l0Y2ggKG1lc3NhZ2UtPnR5cGUpIHsKKyAgICAgIGNhc2UgR1NUX01FU1NBR0VfRU9TOgorICAgICAgICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIGNhc2UgR1NUX01FU1NBR0VfV0FSTklORzoKKyAgICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6eworICAgICAgICBHRXJyb3IgKmdlcnJvcjsKKyAgICAgICAgZ2NoYXIgKmRlYnVnOworCisgICAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtZXNzYWdlLCAmZ2Vycm9yLCAmZGVidWcpOworICAgICAgICBnc3Rfb2JqZWN0X2RlZmF1bHRfZXJyb3IgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSksIGdlcnJvciwgZGVidWcpOworICAgICAgICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZ2Vycm9yKTsKKyAgICAgICAgZ19mcmVlIChkZWJ1Zyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdzdF9tZXNzYWdlX3VucmVmIChtZXNzYWdlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfcHJvZ3JhbSAoR3N0T2JqZWN0ICogZWxlbSwgR3N0U3RydWN0dXJlICogcHJvZykKK3sKKyAgY29uc3QgR3N0U3RydWN0dXJlICpzOworICBHc3RDb250cm9sU291cmNlICpjczsKKyAgR3N0Q2xvY2tUaW1lIHRzLCBkdXI7CisgIGdkb3VibGUgdjsKKyAgY29uc3QgR1ZhbHVlICpmcmFtZTsKKyAgR0hhc2hUYWJsZSAqY3NzOworICBnaW50IGksIGo7CisgIGNvbnN0IGdjaGFyICpuYW1lOworCisgIGNzcyA9IGdfaGFzaF90YWJsZV9uZXcgKGdfc3RyX2hhc2gsIGdfc3RyX2VxdWFsKTsKKworICB0cyA9IDA7CisgIGR1ciA9IGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9pbnQgKEdTVF9TRUNPTkQsIDEsIDE1KTsKKworICAvKiBsb29wIG92ZXIgZWFjaCBpbWFnZSBpbiBwcm9nICovCisgIGZvciAoaSA9IDA7IGkgPCBnc3Rfc3RydWN0dXJlX25fZmllbGRzIChwcm9nKTsgaSsrKSB7CisgICAgR1NUX0RFQlVHICgiY3RybCBvbiAlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKHRzKSk7CisKKyAgICBmcmFtZSA9CisgICAgICAgIGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChwcm9nLCBnc3Rfc3RydWN0dXJlX250aF9maWVsZF9uYW1lIChwcm9nLCBpKSk7CisgICAgcyA9IGdzdF92YWx1ZV9nZXRfc3RydWN0dXJlIChmcmFtZSk7CisgICAgZm9yIChqID0gMDsgaiA8IGdzdF9zdHJ1Y3R1cmVfbl9maWVsZHMgKHMpOyBqKyspIHsKKyAgICAgIG5hbWUgPSBnc3Rfc3RydWN0dXJlX250aF9maWVsZF9uYW1lIChzLCBqKTsKKyAgICAgIGNzID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAoY3NzLCBuYW1lKTsKKyAgICAgIGlmICghY3MpIHsKKyAgICAgICAgY3MgPSBnc3RfaW50ZXJwb2xhdGlvbl9jb250cm9sX3NvdXJjZV9uZXcgKCk7CisgICAgICAgIGdzdF9vYmplY3RfYWRkX2NvbnRyb2xfYmluZGluZyAoZWxlbSwKKyAgICAgICAgICAgIGdzdF9kaXJlY3RfY29udHJvbF9iaW5kaW5nX25ldyAoZWxlbSwgbmFtZSwgY3MpKTsKKyAgICAgICAgZ19vYmplY3Rfc2V0IChjcywgIm1vZGUiLCBHU1RfSU5URVJQT0xBVElPTl9NT0RFX05PTkUsIE5VTEwpOworICAgICAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChjc3MsIChncG9pbnRlcikgbmFtZSwgY3MpOworICAgICAgICBnc3Rfb2JqZWN0X3VucmVmIChjcyk7CisgICAgICB9CisgICAgICBnc3Rfc3RydWN0dXJlX2dldF9kb3VibGUgKHMsIG5hbWUsICZ2KTsKKyAgICAgIGdzdF90aW1lZF92YWx1ZV9jb250cm9sX3NvdXJjZV9zZXQgKChHc3RUaW1lZFZhbHVlQ29udHJvbFNvdXJjZSAqKSBjcywgdHMsCisgICAgICAgICAgdik7CisgICAgICBHU1RfREVCVUcgKCIgICVzID0gJWxmIiwgbmFtZSwgdik7CisgICAgfQorICAgIHRzICs9IGR1cjsKKyAgfQorCisgIGdfaGFzaF90YWJsZV91bnJlZiAoY3NzKTsKK30KKworZ2ludAorbWFpbiAoZ2ludCBhcmdjLCBnY2hhciAqKiBhcmd2KQoreworICBHc3RFbGVtZW50ICpiaW47CisgIEdzdEVsZW1lbnQgKnNyYywgKmN2dCwgKmZtdCwgKmVuYywgKnNpbms7CisgIEdzdENhcHMgKmNhcHM7CisgIEdzdFN0cnVjdHVyZSAqcHJvZzsKKworICAvKiBpbml0IGdzdHJlYW1lciAqLworICBnc3RfaW5pdCAoJmFyZ2MsICZhcmd2KTsKKworICAvKiBjcmVhdGUgYSBuZXcgYmluIHRvIGhvbGQgdGhlIGVsZW1lbnRzICovCisgIGJpbiA9IGdzdF9waXBlbGluZV9uZXcgKCJjYW1lcmEiKTsKKworICAvKiBjcmVhdGUgZWxlbWVudHMgKi8KKyAgaWYgKCEoc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoIm11bHRpZmlsZXNpbmsiLCBOVUxMKSkpIHsKKyAgICBHU1RfV0FSTklORyAoIkNhbid0IGNyZWF0ZSBlbGVtZW50IFwibXVsdGlmaWxlc2lua1wiIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGdfb2JqZWN0X3NldCAoc2luaywgImxvY2F0aW9uIiwgImltYWdlJTAyZC5qcGciLCBOVUxMKTsKKworICBpZiAoIShlbmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJqcGVnZW5jIiwgTlVMTCkpKSB7CisgICAgR1NUX1dBUk5JTkcgKCJDYW4ndCBjcmVhdGUgZWxlbWVudCBcImpwZWdlbmNcIiIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmICghKGZtdCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImNhcHNmaWx0ZXIiLCBOVUxMKSkpIHsKKyAgICBHU1RfV0FSTklORyAoIkNhbid0IGNyZWF0ZSBlbGVtZW50IFwiY2Fwc2ZpbHRlclwiIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGNhcHMgPQorICAgICAgZ3N0X2NhcHNfZnJvbV9zdHJpbmcKKyAgICAgICgidmlkZW8veC1yYXcsIHdpZHRoPTY0MCwgaGVpZ2h0PTQ4MCwgZnJhbWVyYXRlPShmcmFjdGlvbikxNS8xIik7CisgIGdfb2JqZWN0X3NldCAoZm10LCAiY2FwcyIsIGNhcHMsIE5VTEwpOworCisgIGlmICghKGN2dCA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvY29udmVydCIsIE5VTEwpKSkgeworICAgIEdTVF9XQVJOSU5HICgiQ2FuJ3QgY3JlYXRlIGVsZW1lbnQgXCJ2aWRlb2NvbnZlcnRcIiIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmICghKHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInY0bDJzcmMiLCBOVUxMKSkpIHsKKyAgICBHU1RfV0FSTklORyAoIkNhbid0IGNyZWF0ZSBlbGVtZW50IFwidjRsMnNyY1wiIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogYWRkIG9iamVjdHMgdG8gdGhlIG1haW4gYmluICovCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKGJpbiksIHNyYywgY3Z0LCBmbXQsIGVuYywgc2luaywgTlVMTCk7CisKKyAgLyogbGluayBlbGVtZW50cyAqLworICBpZiAoIWdzdF9lbGVtZW50X2xpbmtfbWFueSAoc3JjLCBjdnQsIGZtdCwgZW5jLCBzaW5rLCBOVUxMKSkgeworICAgIEdTVF9XQVJOSU5HICgiQ2FuJ3QgbGluayBlbGVtZW50cyIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIHByb2dyYW1tIGEgcGF0dGVybiBvZiBldmVudHMgKi8KKyNpZiAwCisgIHByb2cgPSBnc3Rfc3RydWN0dXJlX2Zyb21fc3RyaW5nICgicHJvZ3JhbSIKKyAgICAgICIsIGltYWdlMDA9KHN0cnVjdHVyZSlcImltYWdlXFwsY29udHJhc3RcXD0wLjBcXDtcIiIKKyAgICAgICIsIGltYWdlMDE9KHN0cnVjdHVyZSlcImltYWdlXFwsY29udHJhc3RcXD0wLjNcXDtcIiIKKyAgICAgICIsIGltYWdlMDI9KHN0cnVjdHVyZSlcImltYWdlXFwsY29udHJhc3RcXD0xLjBcXDtcIiIKKyAgICAgICIsIGltYWdlMDM9KHN0cnVjdHVyZSlcImltYWdlXFwsY29udHJhc3RcXD0wLjA1XFw7XCI7IiwgTlVMTCk7CisjZW5kaWYKKyNpZiAxCisgIHByb2cgPSBnc3Rfc3RydWN0dXJlX2Zyb21fc3RyaW5nICgicHJvZ3JhbSIKKyAgICAgICIsIGltYWdlMDA9KHN0cnVjdHVyZSlcImltYWdlXFwsYnJpZ2h0bmVzc1xcPTEuMFxcLGNvbnRyYXN0XFw9MC4wXFw7XCIiCisgICAgICAiLCBpbWFnZTAxPShzdHJ1Y3R1cmUpXCJpbWFnZVxcLGJyaWdodG5lc3NcXD0wLjVcXCxjb250cmFzdFxcPTAuM1xcO1wiIgorICAgICAgIiwgaW1hZ2UwMj0oc3RydWN0dXJlKVwiaW1hZ2VcXCxicmlnaHRuZXNzXFw9MC4yNVxcLGNvbnRyYXN0XFw9MS4wXFw7XCIiCisgICAgICAiLCBpbWFnZTAzPShzdHJ1Y3R1cmUpXCJpbWFnZVxcLGJyaWdodG5lc3NcXD0wLjBcXCxjb250cmFzdFxcPTAuMDVcXDtcIjsiLAorICAgICAgTlVMTCk7CisjZW5kaWYKKyAgc2V0X3Byb2dyYW0gKEdTVF9PQkpFQ1QgKHNyYyksIHByb2cpOworICBnX29iamVjdF9zZXQgKHNyYywgIm51bS1idWZmZXJzIiwgZ3N0X3N0cnVjdHVyZV9uX2ZpZWxkcyAocHJvZyksCisgICAgICAiZGV2aWNlIiwgYXJndlsxXSA/IGFyZ3ZbMV0gOiAiL2Rldi92aWRlbzAiLCBOVUxMKTsKKworICAvKiBwcmVwYXJlIHBsYXliYWNrICovCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfUEFVU0VEKTsKKworICAvKiBwbGF5IGFuZCB3YWl0ICovCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoYmluLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgLyogbWFpbmxvb3AgYW5kIHdhaXQgZm9yIGVvcyAqLworICBldmVudF9sb29wIChiaW4pOworCisgIC8qIHN0b3AgYW5kIGNsZWFudXAgKi8KKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChiaW4sIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoR1NUX09CSkVDVCAoYmluKSk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvdjRsMi9tZXNvbi5idWlsZCBiL3Rlc3RzL2V4YW1wbGVzL3Y0bDIvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU5ZDAwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4YW1wbGVzL3Y0bDIvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwxMSBAQAorZXhlY3V0YWJsZSgnY2FtY3RybCcsICdjYW1jdHJsLmMnLAorICBkZXBlbmRlbmNpZXM6IFtnc3Rjb250cm9sbGVyX2RlcCwgZ3N0X2RlcF0sCisgIGNfYXJncyA6IGdzdF9wbHVnaW5zX2dvb2RfYXJncywKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICBpbnN0YWxsOiBmYWxzZSkKKworZXhlY3V0YWJsZSgndjRsMnNyYy1yZW5lZ290aWF0ZScsICd2NGwyc3JjLXJlbmVnb3RpYXRlLmMnLAorICBkZXBlbmRlbmNpZXM6IFtnc3RfZGVwXSwKKyAgY19hcmdzIDogZ3N0X3BsdWdpbnNfZ29vZF9hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogW2NvbmZpZ2luY10sCisgIGluc3RhbGw6IGZhbHNlKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXhhbXBsZXMvdjRsMi92NGwyc3JjLXJlbmVnb3RpYXRlLmMgYi90ZXN0cy9leGFtcGxlcy92NGwyL3Y0bDJzcmMtcmVuZWdvdGlhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWUyOGQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXhhbXBsZXMvdjRsMi92NGwyc3JjLXJlbmVnb3RpYXRlLmMKQEAgLTAsMCArMSwxNzMgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBTYW1zdW5nIEVsZWN0cm9uaWNzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBBdXRob3I6IFRoaWFnbyBTYW50b3MgPHRoaWFnb3NzQG9zZy5zYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworLyogZGVtbyBmb3Igc2hvd2luZyB2NGwyc3JjIHJlbmVnb3RpYXRpbmcgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisvKiBPcHRpb25zICovCitzdGF0aWMgY29uc3QgZ2NoYXIgKmRldmljZSA9ICIvZGV2L3ZpZGVvMCI7CitzdGF0aWMgY29uc3QgZ2NoYXIgKnZpZGVvc2luayA9ICJhdXRvdmlkZW9zaW5rIjsKK3N0YXRpYyBjb25zdCBnY2hhciAqaW9fbW9kZSA9ICJtbWFwIjsKK3N0YXRpYyBjb25zdCBnY2hhciAqZGVmX3Jlc29sdXRpb25zW10gPSB7CisgICIzMjB4MjQwIiwKKyAgIjEyODB4NzIwIiwKKyAgIjY0MHg0ODAiLAorICBOVUxMCit9OworCitzdGF0aWMgY29uc3QgZ2NoYXIgKipyZXNvbHV0aW9ucyA9IGRlZl9yZXNvbHV0aW9uczsKKworc3RhdGljIEdPcHRpb25FbnRyeSBlbnRyaWVzW10gPSB7CisgIHsiZGV2aWNlIiwgJ2QnLCAwLCBHX09QVElPTl9BUkdfU1RSSU5HLCAmZGV2aWNlLCAiVjRMMiBDYW1lcmEgRGV2aWNlIiwKKyAgICAgIE5VTEx9LAorICB7InZpZGVvc2luayIsICdzJywgMCwgR19PUFRJT05fQVJHX1NUUklORywgJnZpZGVvc2luaywgIlZpZGVvIFNpbmsgdG8gdXNlIiwKKyAgICAgIE5VTEx9LAorICB7ImlvLW1vZGUiLCAneicsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkcsICZpb19tb2RlLAorICAgICAgIkNvbmZpZ3VyZSB0aGUgXCJpby1tb2RlXCIgcHJvcGVydHkgb24gdjRsMnNjciIsIE5VTEx9LAorICB7InJlc29sdXRpb24iLCAncicsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkdfQVJSQVksICZyZXNvbHV0aW9ucywKKyAgICAgICJBZGQgYSByZXNvbHV0aW9uIHRvIHRoZSBsaXN0IiwgTlVMTH0sCisgIHtOVUxMfQorfTsKKworc3RhdGljIEdNYWluTG9vcCAqbG9vcDsKK3N0YXRpYyBHc3RFbGVtZW50ICpwaXBlbGluZTsKK3N0YXRpYyBHc3RFbGVtZW50ICpzcmMsICpjYXBzZmlsdGVyOworc3RhdGljIGdpbnQgcmVzb2x1dGlvbl9pbmRleCA9IDA7CisKK3N0YXRpYyBnYm9vbGVhbgorYnVzX2NhbGxiYWNrIChHc3RCdXMgKiBidXMsIEdzdE1lc3NhZ2UgKiBtZXNzYWdlLCBncG9pbnRlciBkYXRhKQoreworICBzd2l0Y2ggKG1lc3NhZ2UtPnR5cGUpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VPUzoKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FUlJPUjp7CisgICAgICBHRXJyb3IgKmdlcnJvcjsKKyAgICAgIGdjaGFyICpkZWJ1ZzsKKworICAgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1lc3NhZ2UsICZnZXJyb3IsICZkZWJ1Zyk7CisgICAgICBnc3Rfb2JqZWN0X2RlZmF1bHRfZXJyb3IgKEdTVF9NRVNTQUdFX1NSQyAobWVzc2FnZSksIGdlcnJvciwgZGVidWcpOworICAgICAgZ19lcnJvcl9mcmVlIChnZXJyb3IpOworICAgICAgZ19mcmVlIChkZWJ1Zyk7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCitjaGFuZ2VfY2FwcyAoZ3BvaW50ZXIgZGF0YSkKK3sKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR1N0cnYgcmVzOworICBnY2hhciAqY2Fwc19zdHI7CisKKyAgaWYgKCFyZXNvbHV0aW9uc1tyZXNvbHV0aW9uX2luZGV4XSkgeworICAgIGdzdF9lbGVtZW50X3NlbmRfZXZlbnQgKHBpcGVsaW5lLCBnc3RfZXZlbnRfbmV3X2VvcyAoKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgZ19wcmludCAoIlNldHRpbmcgcmVzb2x1dGlvbiB0byAnJXMnXG4iLCByZXNvbHV0aW9uc1tyZXNvbHV0aW9uX2luZGV4XSk7CisKKyAgcmVzID0gZ19zdHJzcGxpdCAocmVzb2x1dGlvbnNbcmVzb2x1dGlvbl9pbmRleCsrXSwgIngiLCAyKTsKKyAgaWYgKCFyZXNbMF0gfHwgIXJlc1sxXSkgeworICAgIGdfd2FybmluZyAoIkNhbid0IHBhcnNlIHJlc29sdXRpb246ICVzIiwgcmVzb2x1dGlvbnNbcmVzb2x1dGlvbl9pbmRleCAtIDFdKTsKKyAgICBnX3N0cmZyZWV2IChyZXMpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgY2Fwc19zdHIgPSBnX3N0cmR1cF9wcmludGYgKCJ2aWRlby94LXJhdyx3aWR0aD0lcyxoZWlnaHQ9JXMiLCByZXNbMF0sIHJlc1sxXSk7CisgIGNhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoY2Fwc19zdHIpOworICBnX29iamVjdF9zZXQgKGNhcHNmaWx0ZXIsICJjYXBzIiwgY2FwcywgTlVMTCk7CisKKyAgZ19zdHJmcmVldiAocmVzKTsKKyAgZ19mcmVlIChjYXBzX3N0cik7CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2ludAorbWFpbiAoZ2ludCBhcmdjLCBnY2hhciAqKiBhcmd2KQoreworICBHc3RCdXMgKmJ1czsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgIEdPcHRpb25Db250ZXh0ICpjb250ZXh0OworICBnY2hhciAqZGVzYzsKKyAgZ2Jvb2xlYW4gcmV0OworCisgIGNvbnRleHQgPSBnX29wdGlvbl9jb250ZXh0X25ldyAoIi0gdGVzdCB2NGwyc3JjIGxpdmUgcmVuZWdvdGl0aW9uIik7CisgIGdfb3B0aW9uX2NvbnRleHRfYWRkX21haW5fZW50cmllcyAoY29udGV4dCwgZW50cmllcywgR0VUVEVYVF9QQUNLQUdFKTsKKyAgZ19vcHRpb25fY29udGV4dF9hZGRfZ3JvdXAgKGNvbnRleHQsIGdzdF9pbml0X2dldF9vcHRpb25fZ3JvdXAgKCkpOworICByZXQgPSBnX29wdGlvbl9jb250ZXh0X3BhcnNlIChjb250ZXh0LCAmYXJnYywgJmFyZ3YsICZlcnJvcik7CisgIGdfb3B0aW9uX2NvbnRleHRfZnJlZSAoY29udGV4dCk7CisKKyAgaWYgKCFyZXQpIHsKKyAgICBnX3ByaW50ICgib3B0aW9uIHBhcnNpbmcgZmFpbGVkOiAlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgIHJldHVybiAxOworICB9CisKKyAgbG9vcCA9IGdfbWFpbl9sb29wX25ldyAoTlVMTCwgRkFMU0UpOworCisgIGRlc2MgPSBnX3N0cmR1cF9wcmludGYgKCJ2NGwyc3JjIG5hbWU9c3JjIGRldmljZT1cIiVzXCIgaW8tbW9kZT1cIiVzXCIgIgorICAgICAgIiEgY2Fwc2ZpbHRlciBuYW1lPWNmICEgJXMiLCBkZXZpY2UsIGlvX21vZGUsIHZpZGVvc2luayk7CisgIHBpcGVsaW5lID0gZ3N0X3BhcnNlX2xhdW5jaCAoZGVzYywgJmVycm9yKTsKKyAgZ19mcmVlIChkZXNjKTsKKyAgaWYgKCFwaXBlbGluZSkgeworICAgIGdfcHJpbnQgKCJmYWlsZWQgdG8gY3JlYXRlIHBpcGVsaW5lOiAlcyIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHNyYyA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgInNyYyIpOworICBjYXBzZmlsdGVyID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAocGlwZWxpbmUpLCAiY2YiKTsKKworICBidXMgPSBnc3RfcGlwZWxpbmVfZ2V0X2J1cyAoR1NUX1BJUEVMSU5FIChwaXBlbGluZSkpOworICBnc3RfYnVzX2FkZF93YXRjaCAoYnVzLCBidXNfY2FsbGJhY2ssIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworCisgIGNoYW5nZV9jYXBzIChOVUxMKTsKKworICAvKiBwbGF5IGFuZCB3YWl0ICovCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICBnX3RpbWVvdXRfYWRkX3NlY29uZHMgKDMsIGNoYW5nZV9jYXBzLCBOVUxMKTsKKworICAvKiBtYWlubG9vcCBhbmQgd2FpdCBmb3IgZW9zICovCisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisKKyAgLyogc3RvcCBhbmQgY2xlYW51cCAqLworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyYyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGNhcHNmaWx0ZXIpOworICBnc3Rfb2JqZWN0X3VucmVmIChHU1RfT0JKRUNUIChwaXBlbGluZSkpOworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvTWFrZWZpbGUuYW0gYi90ZXN0cy9maWxlcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjNiNGRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmlsZXMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyMSBAQAorCitFWFRSQV9ESVNUID0gXAorCWF1ZGlvdGVzdHNyYy5mbGFjIFwKKwlhdWRpb3Rlc3RzcmMud2F2IFwKKwlncmFkaWVudC5qMmsgXAorCWgyNjQucnRwIFwKKwlpZDMtNDA3MzQ5LTEudGFnIFwKKwlpZDMtNDA3MzQ5LTIudGFnIFwKKwlpZDMtNDQ3MDAwLXdjb3AudGFnIFwKKwlpZDMtNTc3NDY4LXVuc3luY2VkLXRhZy50YWcgXAorCWlkMy01ODgxNDgtdW5zeW5jZWQtdjI0LnRhZyBcCisJaW1hZ2UuanBnIFwKKwlwY20xNnNpbmUuZmx2IFwKKwlwaW5rbm9pc2Utdm9yYmlzLm1rdiBcCisJc3RyZWFtLm1wMiBcCisJY2JyX3N0cmVhbS5tcDMgXAorCXZicl9zdHJlYW0ubXAzIFwKKwl0ZXN0LWNlcnQucGVtIFwKKwl0ZXN0LWtleS5wZW0gXAorCXNwbGl0dmlkZW8wMC5vZ2cgc3BsaXR2aWRlbzAxLm9nZyBcCisJc3BsaXR2aWRlbzAyLm9nZwpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvYXVkaW90ZXN0c3JjLmZsYWMgYi90ZXN0cy9maWxlcy9hdWRpb3Rlc3RzcmMuZmxhYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjEyYzNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmlsZXMvYXVkaW90ZXN0c3JjLmZsYWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvYXVkaW90ZXN0c3JjLndhdiBiL3Rlc3RzL2ZpbGVzL2F1ZGlvdGVzdHNyYy53YXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE3ZjAyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbGVzL2F1ZGlvdGVzdHNyYy53YXYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvY2JyX3N0cmVhbS5tcDMgYi90ZXN0cy9maWxlcy9jYnJfc3RyZWFtLm1wMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWE1YzQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmlsZXMvY2JyX3N0cmVhbS5tcDMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvZ3JhZGllbnQuajJrIGIvdGVzdHMvZmlsZXMvZ3JhZGllbnQuajJrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMmM5NGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWxlcy9ncmFkaWVudC5qMmsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvaDI2NC5ydHAgYi90ZXN0cy9maWxlcy9oMjY0LnJ0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2FkOTdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmlsZXMvaDI2NC5ydHAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvaWQzLTQwNzM0OS0xLnRhZyBiL3Rlc3RzL2ZpbGVzL2lkMy00MDczNDktMS50YWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjZDRmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbGVzL2lkMy00MDczNDktMS50YWcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvaWQzLTQwNzM0OS0yLnRhZyBiL3Rlc3RzL2ZpbGVzL2lkMy00MDczNDktMi50YWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE2YTQyYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbGVzL2lkMy00MDczNDktMi50YWcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvaWQzLTQ0NzAwMC13Y29wLnRhZyBiL3Rlc3RzL2ZpbGVzL2lkMy00NDcwMDAtd2NvcC50YWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxMDljZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbGVzL2lkMy00NDcwMDAtd2NvcC50YWcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvaWQzLTU3NzQ2OC11bnN5bmNlZC10YWcudGFnIGIvdGVzdHMvZmlsZXMvaWQzLTU3NzQ2OC11bnN5bmNlZC10YWcudGFnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODgwZTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWxlcy9pZDMtNTc3NDY4LXVuc3luY2VkLXRhZy50YWcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvaWQzLTU4ODE0OC11bnN5bmNlZC12MjQudGFnIGIvdGVzdHMvZmlsZXMvaWQzLTU4ODE0OC11bnN5bmNlZC12MjQudGFnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OWQ5MzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWxlcy9pZDMtNTg4MTQ4LXVuc3luY2VkLXYyNC50YWcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvaW1hZ2UuanBnIGIvdGVzdHMvZmlsZXMvaW1hZ2UuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MmZkNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWxlcy9pbWFnZS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvcGNtMTZzaW5lLmZsdiBiL3Rlc3RzL2ZpbGVzL3BjbTE2c2luZS5mbHYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyNWEyYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbGVzL3BjbTE2c2luZS5mbHYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvcGlua25vaXNlLXZvcmJpcy5ta3YgYi90ZXN0cy9maWxlcy9waW5rbm9pc2Utdm9yYmlzLm1rdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODMwMDZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmlsZXMvcGlua25vaXNlLXZvcmJpcy5ta3YKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvc3BsaXR2aWRlbzAwLm9nZyBiL3Rlc3RzL2ZpbGVzL3NwbGl0dmlkZW8wMC5vZ2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlZmI3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbGVzL3NwbGl0dmlkZW8wMC5vZ2cKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvc3BsaXR2aWRlbzAxLm9nZyBiL3Rlc3RzL2ZpbGVzL3NwbGl0dmlkZW8wMS5vZ2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxZjUzNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbGVzL3NwbGl0dmlkZW8wMS5vZ2cKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvc3BsaXR2aWRlbzAyLm9nZyBiL3Rlc3RzL2ZpbGVzL3NwbGl0dmlkZW8wMi5vZ2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyMzVkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbGVzL3NwbGl0dmlkZW8wMi5vZ2cKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvc3RyZWFtLm1wMiBiL3Rlc3RzL2ZpbGVzL3N0cmVhbS5tcDIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2ZTkwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbGVzL3N0cmVhbS5tcDIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvdGVzdC1jZXJ0LnBlbSBiL3Rlc3RzL2ZpbGVzL3Rlc3QtY2VydC5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY4NjNiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbGVzL3Rlc3QtY2VydC5wZW0KQEAgLTAsMCArMSwxOCBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDMnpDQ0FjT2dBd0lCQWdJSkFMUmJnMldudUFBcU1BMEdDU3FHU0liM0RRRUJDd1VBTUJReEVqQVFCZ05WCitCQU1NQ1RFeU55NHdMakF1TVRBZUZ3MHhOekEyTWpBeE5ESTNNekJhRncweU56QTJNVGd4TkRJM016QmFNQlF4CitFakFRQmdOVkJBTU1DVEV5Tnk0d0xqQXVNVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DCitnZ0VCQUtzNGZ1UnVXNzduT1JoT1Q5a2JiVTZCc2pLVzNHRXNNYytaU21YaklOUVdwZmtFUzJoVitEUXl6aG01CitxaDRPTGkxdll0WG9TYmRRTkRDYkE4eWJaSnFSOG05RjNlZDh2b2JkU1NRR3hXcFBkWFRnejI3eCtUcGlBYzlQCit3ODNVdVB2bHUvMEF4SEpCRlhWQWcraWQweUZ1M3dtR1dZSkhvQXR2RmkyeGVSdEFYdXJOdVB0alp5TytnZk05CitCS1RSQ2tHc1JTbVBwSnlHYlUyUTk2Zmp4blZmVjlvWXZRWGV1Z1VjU3gvcFRVQ00va0RnRDlRWkN4RzJyZmxYCitOV2NxREZZM3VPNlpSNjhRd2kvS291T2E4cnpyZ0Fjd2hGVUk2V3owWndpMXJ6UnRXSzVXcUMyNGFCVVl6L3RLCitobDhpODhVRFhTTWg3c3BDaGRZREJHTGhaeVVDQXdFQUFhTXdNQzR3TEFZRFZSMFJCQ1V3STRJSmJHOWpZV3hvCitiM04waHdSL0FBQUJoeEFBQUFBQUFBQUFBQUFBQUFBQUFBQUJNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUJqCisrVTh0ZWJ3ZzUvcG9mNVJodDZUTUhxZWc2RmNyNE9Ka0wycGgyZytUL0FNVFM3a0VHZUZJS0pONUFaK1MvcUlZCitjZG9ES0h3YzgrYkNLL21HNkRQbUo0ei8yRWFtYjg1WWhwbE9MVnJMUndmeFJlYlRLOUN0bmpjam5mbEFpVTlICis3dlBWd1hJdmt3ZWJoQlNRTktUZGtCbFBYS2FUTldYdXlnZUZHMk9WUWtQZi9LQXhTZHRnMlIrb3d2L3M4MDJaCitISVNrMjZ3WTlvRklRejZBaVhXZHJZMVFxTk9sdFo3cmxVNWlvZkFIN1grOXJ5Wmx4UFdqL2dIZzJZUVJ2dkxsCitkcTZuQ0YrRUQwa2U3aDBsZzVuVTBiZUtFeWd3bGk4RGxMVmJ1MEpLMFBrQVJGcDV0N3dVdHpDOURDanp2Zk9jCitneFI0NFB5Wlg3LzJvYVREbTRQUworLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsZXMvdGVzdC1rZXkucGVtIGIvdGVzdHMvZmlsZXMvdGVzdC1rZXkucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YmJjYzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWxlcy90ZXN0LWtleS5wZW0KQEAgLTAsMCArMSwyNyBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJRW93SUJBQUtDQVFFQXF6aCs1RzVidnVjNUdFNVAyUnR0VG9HeU1wYmNZU3d4ejVsS1plTWcxQmFsK1FSTAorYUZYNE5ETE9HYm1xSGc0dUxXOWkxZWhKdDFBME1Kc0R6SnRrbXBIeWIwWGQ1M3kraHQxSkpBYkZhazkxZE9EUAorYnZINU9tSUJ6MC9EemRTNCsrVzcvUURFY2tFVmRVQ0Q2SjNUSVc3ZkNZWlpna2VnQzI4V0xiRjVHMEJlNnMyNAorKzJObkk3NkI4ejBFcE5FS1FheEZLWStrbkladFRaRDNwK1BHZFY5WDJoaTlCZDY2QlJ4TEgrbE5RSXorUU9BUAorMUJrTEViYXQrVmMxWnlvTVZqZTQ3cGxIcnhEQ0w4cWk0NXJ5dk91QUJ6Q0VWUWpwYlBSbkNMV3ZORzFZcmxhbworTGJob0ZSalArMHFHWHlMenhRTmRJeUh1eWtLRjFnTUVZdUZuSlFJREFRQUJBb0lCQUJoK01YQzk5TFBmWWNSLworVjE3SVZKK1pZQU5xbjBYclM0alY5ZFdUWXh2VHpaUk1yL2pSNjNxVUZmV0tJTExCOW9zYlZ2a2dqSU1EbnlPZworMlM5SXYyQjVKa1FTcTRhMHlwQ0NVVGN0SE1wemFXcjV5ZEttSEsva1d6dnJ2aWZRbVZHM2NHZmwxelE4NlRQbgorc2JieDlNVGdsbGxIZGNCMFBJbkdMMWNEL3o0TmdFYlJyMUI2YUJjcTBBSHFKSklJSHZRTlBtSDZIR0FTZzQ4agoraFZBWjJzWWpwOURTSzk3SEtTQUJwQkNzUk44WHJNZ1lPQXN1NWExcnRYaGp0TVVabzZMcEV3RXdIOTRyRE9ndgorWnZKTEdycFN2S0tXUEdjeUFOeUsxYTVuek84SU5jWFkrWDU0YThWQjFZQWp5bXpEeS9XTTFPWC9qQmZaZW01MworSHdDN201VUNnWUVBM2NyY0JJOWYzYURnQ1lFVURXWjhoVFFVVmh2TjNwaThRV3I3UXViTUptSXl4QmozOTR3bQoraFRvOHdvWXhOcXk5VmtPMFgranhIQTByek4xS3ZTOWoyQ0F6Sit0WU5oRXNSYzZvbmpFWEtHTGhPLzFnSGJrVAorclJ4MkoxdUEySFFUYlpOR2h3czlRZGwzQTdzeXc2ZkZ3OVQvNXJvb1diaXY1U0RxU0NSRnpsY0NnWUVBeGFEagorSll5TExsK0pic2x0a3Y3MXRoNVR2TGkxNHE2S2xaSkdFVWVTc3ltVXg5ZXZCUzdzL2g2MkJvZTkvN1k2M1prbAorZFIzSXZ4WDdITnFXL2ZHanVRcjlqUXZNTWR1aWw4TDIxOGxDaHVSLzRIRXNYclN2eXc4TUlNbER0alRXYWpCNgorYzhlaVUrei81enJsaHpvb0trMkxhUUhUVXJyYnhrOXJOMHJhRU9NQ2dZRUEyS2x6MXd5TVZMLzBPN1NaZHlHMworNEpQb2pkbXBlWnJ3eEdNU3d0OGRiUjJlaEF2MEtDSUQrei9SM1NFajhFbzh4NGxxS2dzdmhmeWozZ1FMSDlhcworalpPZkJZOFU0L1JRc0h6YUlYYkpMWTJ5ZzF6WVNSRGtWTWFwOFhhazNrNCtNRnVmbVFwMHMrQVJNRmJ0bDA1TQorbGlwOE5kT0MyV3JlZ1ZGdkxEd3E2UThDZ1lCeTNneW9xb1BMTkdSaExGcXY4ZGxIUFdGV2M5WGtKNmNOUUxQUgorSDFTNUpoWUFBZkVNaGpYaGptQW1jNGVQdFkrSmRaWTcrRS9TSVNpUG9NM2FWRFRoUE80YXFSektiZXFYWXc2dQorWmFCeFh5YWtnYU5VZUprazRWNGZRRnhHNzNjZ3lZU2kvd251MWZYM3BGZjh2V1RURWJkU0ZXbUswR2tsWHN2bQorbTI4Y0dRS0JnR3ZHLy9XOE5HZlhXTC9rb215S1h3OEdKNDFJcDBzYTIwS05rTlp3QWFBMUJWVGFISVlUK3J4bworU2dWUVBIbXpQOEo5cDRVMGQ5bFE1QlcwTFdFUlZrRkhPZzhrMGV2RHNTbTNGVmJlUkNCamxLcVZVT0xvbzRIaworQStmU1lXV1dsMWo5RTl1cnBpVC9kNEFRWTFiRlV4Y1VlYkRTSzlYVDZaUE91c3lYMGZTZQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbGVzL3Zicl9zdHJlYW0ubXAzIGIvdGVzdHMvZmlsZXMvdmJyX3N0cmVhbS5tcDMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmYzM4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbGVzL3Zicl9zdHJlYW0ubXAzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ljbGVzLy5naXRpZ25vcmUgYi90ZXN0cy9pY2xlcy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOTc1YTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pY2xlcy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMTIgQEAKK2VxdWFsaXplci10ZXN0CitnZGtwaXhidWZzaW5rLXRlc3QKK3Rlc3QtYWNjdXJhdGUtc2VlaworZ2RrcGl4YnVmb3ZlcmxheS10ZXN0Cit0ZXN0LXNlZ21lbnQtc2Vla3MKK3Rlc3Qtb3NzNAoreGltYWdlc3JjLXRlc3QKK3Y0bDJzcmMtdGVzdAordmlkZW9ib3gtdGVzdAordmlkZW9jcm9wLXRlc3QKK3ZpZGVvY3JvcDItdGVzdAorCmRpZmYgLS1naXQgYS90ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbSBiL3Rlc3RzL2ljbGVzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZmU4NDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pY2xlcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDc3IEBACitpZiBIQVZFX0dUSworR1RLX1RFU1RTID0gZ2RrcGl4YnVmc2luay10ZXN0IGdka3BpeGJ1Zm92ZXJsYXktdGVzdAorCitnZGtwaXhidWZzaW5rX3Rlc3RfU09VUkNFUyA9IGdka3BpeGJ1ZnNpbmstdGVzdC5jCitnZGtwaXhidWZzaW5rX3Rlc3RfQ0ZMQUdTICA9ICQoR1NUX0NGTEFHUykgJChHVEtfQ0ZMQUdTKQorZ2RrcGl4YnVmc2lua190ZXN0X0xEQUREICAgPSAkKEdTVF9MSUJTKSAkKEdUS19MSUJTKQorCitnZGtwaXhidWZvdmVybGF5X3Rlc3RfU09VUkNFUyA9IGdka3BpeGJ1Zm92ZXJsYXktdGVzdC5jCitnZGtwaXhidWZvdmVybGF5X3Rlc3RfQ0ZMQUdTICA9ICQoR1NUX1BMVUdJTlNfQkFTRV9DRkxBR1MpICQoR1NUX0NGTEFHUykgXAorCSQoR0RLX1BJWEJVRl9DRkxBR1MpICQoR0lPX0NGTEFHUykKK2dka3BpeGJ1Zm92ZXJsYXlfdGVzdF9MREFERCAgID0gJChHU1RfTElCUykgJChHREtfUElYQlVGX0xJQlMpICQoR0lPX0xJQlMpIFwKKwkkKExJQk0pCitlbHNlCitHVEtfVEVTVFMgPQorZW5kaWYKKworVjRMMl9URVNUUyA9IHY0bDJzcmMtdGVzdAorCit2NGwyc3JjX3Rlc3RfU09VUkNFUyA9IHY0bDJzcmMtdGVzdC5jCit2NGwyc3JjX3Rlc3RfQ0ZMQUdTID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgJChHU1RfQ0ZMQUdTKQordjRsMnNyY190ZXN0X0xEQUREID0gJChHU1RfUExVR0lOU19CQVNFX0xJQlMpIFwKKwkJICAgICAtbGdzdHZpZGVvLSQoR1NUX0FQSV9WRVJTSU9OKQorCitpZiBVU0VfT1NTNAorT1NTNF9URVNUUz10ZXN0LW9zczQKKwordGVzdF9vc3M0X1NPVVJDRVMgPSB0ZXN0LW9zczQuYwordGVzdF9vc3M0X0NGTEFHUyAgPSAkKEdTVF9QTFVHSU5TX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpCit0ZXN0X29zczRfTERBREQgICA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAkKEdTVF9MSUJTKQordGVzdF9vc3M0X0xERkxBR1MgPSAkKEdTVF9QTFVHSU5fTERGTEFHUykKK2Vsc2UKK09TUzRfVEVTVFM9CitlbmRpZgorCitpZiBVU0VfWAorWF9URVNUUyA9IHhpbWFnZXNyYy10ZXN0CisKK3hpbWFnZXNyY190ZXN0X1NPVVJDRVMgPSB4aW1hZ2VzcmMtdGVzdC5jCit4aW1hZ2VzcmNfdGVzdF9DRkxBR1MgPSAkKEdTVF9DRkxBR1MpCit4aW1hZ2VzcmNfdGVzdF9MREFERCA9ICQoR1NUX0xJQlMpCitlbHNlCitYX1RFU1RTID0KK2VuZGlmCisKK2VxdWFsaXplcl90ZXN0X1NPVVJDRVMgPSBlcXVhbGl6ZXItdGVzdC5jCitlcXVhbGl6ZXJfdGVzdF9DRkxBR1MgID0gJChHU1RfQ0ZMQUdTKQorZXF1YWxpemVyX3Rlc3RfTERBREQgICA9ICQoR1NUX0xJQlMpCisKK3Rlc3RfYWNjdXJhdGVfc2Vla19TT1VSQ0VTID0gdGVzdC1hY2N1cmF0ZS1zZWVrLmMKK3Rlc3RfYWNjdXJhdGVfc2Vla19DRkxBR1MgID0gJChHU1RfUExVR0lOU19CQVNFX0NGTEFHUykgXAorCSQoR1NUX0JBU0VfQ0ZMQUdTKSAkKEdTVF9DRkxBR1MpCit0ZXN0X2FjY3VyYXRlX3NlZWtfTERBREQgICA9ICQoR1NUX1BMVUdJTlNfQkFTRV9MSUJTKSAtbGdzdGFwcC0kKEdTVF9BUElfVkVSU0lPTikgXAorCSQoR1NUX0JBU0VfTElCUykgJChHU1RfTElCUykKKwordGVzdF9zZWdtZW50X3NlZWtzX1NPVVJDRVMgPSB0ZXN0LXNlZ21lbnQtc2Vla3MuYwordGVzdF9zZWdtZW50X3NlZWtzX0NGTEFHUyAgPSAkKEdTVF9DRkxBR1MpCit0ZXN0X3NlZ21lbnRfc2Vla3NfTERBREQgICA9ICQoR1NUX0xJQlMpCisKK3ZpZGVvY3JvcF90ZXN0X1NPVVJDRVMgPSB2aWRlb2Nyb3AtdGVzdC5jCit2aWRlb2Nyb3BfdGVzdF9DRkxBR1MgID0gJChHU1RfQ0ZMQUdTKQordmlkZW9jcm9wX3Rlc3RfTERBREQgICA9ICQoR1NUX0xJQlMpCisKK3ZpZGVvYm94X3Rlc3RfU09VUkNFUyA9IHZpZGVvYm94LXRlc3QuYwordmlkZW9ib3hfdGVzdF9DRkxBR1MgID0gJChHU1RfQ0ZMQUdTKQordmlkZW9ib3hfdGVzdF9MREFERCAgID0gJChHU1RfTElCUykKKwordmlkZW9jcm9wMl90ZXN0X1NPVVJDRVMgPSB2aWRlb2Nyb3AyLXRlc3QuYwordmlkZW9jcm9wMl90ZXN0X0NGTEFHUyAgPSAkKEdTVF9DRkxBR1MpCit2aWRlb2Nyb3AyX3Rlc3RfTERBREQgICA9ICQoR1NUX0xJQlMpCisKK25vaW5zdF9QUk9HUkFNUyA9ICQoR1RLX1RFU1RTKSAkKE9TUzRfVEVTVFMpICQoVjRMMl9URVNUUykgJChYX1RFU1RTKSBcCisJZXF1YWxpemVyLXRlc3QgXAorCXRlc3QtYWNjdXJhdGUtc2VlayBcCisJdGVzdC1zZWdtZW50LXNlZWtzIFwKKwl2aWRlb2Nyb3AtdGVzdCBcCisJdmlkZW9ib3gtdGVzdCBcCisJdmlkZW9jcm9wMi10ZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9pY2xlcy9lcXVhbGl6ZXItdGVzdC5jIGIvdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODNiYTMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaWNsZXMvZXF1YWxpemVyLXRlc3QuYwpAQCAtMCwwICsxLDI4OSBAQAorLyogR1N0cmVhbWVyIHRlc3QgZm9yIHRoZSBlcXVhbGl6ZXIgZWxlbWVudAorICogQ29weXJpZ2h0IChDKSAyMDA3IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIFdpbGwgdGVzdHMgdGhlIGVxdWFsaXplciBieSBmYWRpbmcgYWxsIGJhbmRzIGluIGFuZCBvdXQgb25lIGJ5IG9uZSBhbmQKKyAqIGZpbmFseSBhbGwgdG9nZXRoZXIuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworR1NUX0RFQlVHX0NBVEVHT1JZX1NUQVRJQyAoZXF1YWxpemVyX3Rlc3RfZGVidWcpOworI2RlZmluZSBHU1RfQ0FUX0RFRkFVTFQgZXF1YWxpemVyX3Rlc3RfZGVidWcKKworc3RhdGljIEdzdEJ1cyAqcGlwZWxpbmVfYnVzOworCitzdGF0aWMgZ2Jvb2xlYW4KK2NoZWNrX2J1cyAoR3N0Q2xvY2tUaW1lIG1heF93YWl0X3RpbWUpCit7CisgIEdzdE1lc3NhZ2UgKm1zZzsKKworICBtc2cgPSBnc3RfYnVzX3BvbGwgKHBpcGVsaW5lX2J1cywgR1NUX01FU1NBR0VfRVJST1IgfCBHU1RfTUVTU0FHRV9FT1MsCisgICAgICBtYXhfd2FpdF90aW1lKTsKKworICBpZiAobXNnID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX0VSUk9SKSB7CisgICAgR0Vycm9yICplcnIgPSBOVUxMOworICAgIGdjaGFyICpkZWJ1ZyA9IE5VTEw7CisKKyAgICBnX2Fzc2VydCAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSA9PSBHU1RfTUVTU0FHRV9FUlJPUik7CisgICAgZ3N0X21lc3NhZ2VfcGFyc2VfZXJyb3IgKG1zZywgJmVyciwgJmRlYnVnKTsKKyAgICBHU1RfRVJST1IgKCJFUlJPUjogJXMgWyVzXSIsIGVyci0+bWVzc2FnZSwgZGVidWcpOworICAgIGdfcHJpbnQgKCJcbj09PT09PT09PT09PiBFUlJPUjogJXNcbiVzXG5cbiIsIGVyci0+bWVzc2FnZSwgZGVidWcpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgIGdfZnJlZSAoZGVidWcpOworICB9CisKKyAgaWYgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRU9TKSB7CisgICAgZ19wcmludCAoIlxuID09PSBFT1MgPT09XG5cbiIpOworICB9CisKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisgIHJldHVybiBUUlVFOworfQorCisvLyBmaXggYmVsb3cKKworc3RhdGljIHZvaWQKK2VxdWFsaXplcl9zZXRfYmFuZF92YWx1ZSAoR3N0RWxlbWVudCAqIGVxLCBndWludCBiYW5kLCBnZG91YmxlIHZhbCkKK3sKKyAgR09iamVjdCAqY2hpbGQ7CisKKyAgY2hpbGQgPSBnc3RfY2hpbGRfcHJveHlfZ2V0X2NoaWxkX2J5X2luZGV4IChHU1RfQ0hJTERfUFJPWFkgKGVxKSwgYmFuZCk7CisgIGdfb2JqZWN0X3NldCAoY2hpbGQsICJnYWluIiwgdmFsLCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKGNoaWxkKTsKKyAgZ19wcmludCAoIkJhbmQgJTJkOiAlLjJmXG4iLCBiYW5kLCB2YWwpOworfQorCitzdGF0aWMgdm9pZAorZXF1YWxpemVyX3NldF9hbGxfYmFuZF92YWx1ZXMgKEdzdEVsZW1lbnQgKiBlcSwgZ3VpbnQgbnVtLCBnZG91YmxlIHZhbCkKK3sKKyAgZ2ludCBpOworICBHT2JqZWN0ICpjaGlsZDsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICBjaGlsZCA9IGdzdF9jaGlsZF9wcm94eV9nZXRfY2hpbGRfYnlfaW5kZXggKEdTVF9DSElMRF9QUk9YWSAoZXEpLCBpKTsKKyAgICBnX29iamVjdF9zZXQgKGNoaWxkLCAiZ2FpbiIsIHZhbCwgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKGNoaWxkKTsKKyAgfQorICBnX3ByaW50ICgiQWxsIGJhbmRzOiAlLjJmXG4iLCB2YWwpOworfQorCisvLyBmaXggYWJvdmUKKworc3RhdGljIGdib29sZWFuCitlcXVhbGl6ZXJfc2V0X2JhbmRfdmFsdWVfYW5kX3dhaXQgKEdzdEVsZW1lbnQgKiBlcSwgZ3VpbnQgYmFuZCwgZ2RvdWJsZSB2YWwpCit7CisgIGVxdWFsaXplcl9zZXRfYmFuZF92YWx1ZSAoZXEsIGJhbmQsIHZhbCk7CisgIHJldHVybiBjaGVja19idXMgKDEwMCAqIEdTVF9NU0VDT05EKTsKK30KKworc3RhdGljIGdib29sZWFuCitlcXVhbGl6ZXJfc2V0X2FsbF9iYW5kX3ZhbHVlc19hbmRfd2FpdCAoR3N0RWxlbWVudCAqIGVxLCBndWludCBudW0sIGdkb3VibGUgdmFsKQoreworICBlcXVhbGl6ZXJfc2V0X2FsbF9iYW5kX3ZhbHVlcyAoZXEsIG51bSwgdmFsKTsKKyAgcmV0dXJuIGNoZWNrX2J1cyAoMTAwICogR1NUX01TRUNPTkQpOworfQorCitzdGF0aWMgdm9pZAorZG9fc2xpZGVyX2ZpZGRsaW5nIChHc3RFbGVtZW50ICogcGxheWJpbiwgR3N0RWxlbWVudCAqIGVxKQoreworICBnYm9vbGVhbiBzdG9wOworICBndWludCBudW1fYmFuZHMsIGk7CisgIGdkb3VibGUgZCwgc3RlcCA9IDAuNTsKKworICBzdG9wID0gRkFMU0U7CisKKyAgZ19vYmplY3RfZ2V0IChlcSwgIm51bS1iYW5kcyIsICZudW1fYmFuZHMsIE5VTEwpOworCisgIGdfcHJpbnQgKCIldSBiYW5kcy5cbiIsIG51bV9iYW5kcyk7CisKKyAgd2hpbGUgKCFzdG9wKSB7CisgICAgZm9yIChpID0gMDsgIXN0b3AgJiYgaSA8IG51bV9iYW5kczsgKytpKSB7CisgICAgICBkID0gLTI0LjA7CisgICAgICB3aGlsZSAoIXN0b3AgJiYgZCA8PSAxMi4wKSB7CisgICAgICAgIHN0b3AgPSBlcXVhbGl6ZXJfc2V0X2JhbmRfdmFsdWVfYW5kX3dhaXQgKGVxLCBpLCBkKTsKKyAgICAgICAgZCArPSBzdGVwOworICAgICAgfQorICAgICAgZCA9IDEyLjA7CisgICAgICB3aGlsZSAoIXN0b3AgJiYgZCA+PSAtMjQuMCkgeworICAgICAgICBzdG9wID0gZXF1YWxpemVyX3NldF9iYW5kX3ZhbHVlX2FuZF93YWl0IChlcSwgaSwgZCk7CisgICAgICAgIGQgLT0gc3RlcDsKKyAgICAgIH0KKyAgICAgIGQgPSAtMjQuMDsKKyAgICAgIHdoaWxlICghc3RvcCAmJiBkIDw9IDEyLjApIHsKKyAgICAgICAgc3RvcCA9IGVxdWFsaXplcl9zZXRfYmFuZF92YWx1ZV9hbmRfd2FpdCAoZXEsIGksIGQpOworICAgICAgICBkICs9IHN0ZXA7CisgICAgICB9CisgICAgfQorCisgICAgZCA9IDAuMDsKKyAgICB3aGlsZSAoIXN0b3AgJiYgZCA8PSAxMi4wKSB7CisgICAgICBzdG9wID0gZXF1YWxpemVyX3NldF9hbGxfYmFuZF92YWx1ZXNfYW5kX3dhaXQgKGVxLCBudW1fYmFuZHMsIGQpOworICAgICAgZCArPSBzdGVwOworICAgIH0KKyAgICBkID0gMTIuMDsKKyAgICB3aGlsZSAoIXN0b3AgJiYgZCA+PSAtMjQuMCkgeworICAgICAgc3RvcCA9IGVxdWFsaXplcl9zZXRfYWxsX2JhbmRfdmFsdWVzX2FuZF93YWl0IChlcSwgbnVtX2JhbmRzLCBkKTsKKyAgICAgIGQgLT0gc3RlcDsKKyAgICB9CisgICAgZCA9IC0yNC4wOworICAgIHdoaWxlICghc3RvcCAmJiBkIDw9IDAuMCkgeworICAgICAgc3RvcCA9IGVxdWFsaXplcl9zZXRfYWxsX2JhbmRfdmFsdWVzX2FuZF93YWl0IChlcSwgbnVtX2JhbmRzLCBkKTsKKyAgICAgIGQgKz0gc3RlcDsKKyAgICB9CisgIH0KK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGdjaGFyICpvcHRfYXVkaW9zaW5rX3N0ciA9IE5VTEw7CisgIGdjaGFyICoqZmlsZW5hbWVzID0gTlVMTDsKKyAgY29uc3QgR09wdGlvbkVudHJ5IHRlc3RfZ29wdGlvbnNbXSA9IHsKKyAgICB7ImF1ZGlvc2luayIsICdcMCcsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkcsICZvcHRfYXVkaW9zaW5rX3N0ciwKKyAgICAgICAgImF1ZGlvc2luayB0byB1c2UgKGRlZmF1bHQ6IGF1dG9hdWRpb3NpbmspIiwgTlVMTH0sCisgICAge0dfT1BUSU9OX1JFTUFJTklORywgMCwgMCwgR19PUFRJT05fQVJHX0ZJTEVOQU1FX0FSUkFZLCAmZmlsZW5hbWVzLCBOVUxMfSwKKyAgICB7TlVMTCwgJ1wwJywgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTH0KKyAgfTsKKyAgR09wdGlvbkNvbnRleHQgKmN0eDsKKyAgR0Vycm9yICpvcHRfZXJyID0gTlVMTDsKKworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisgIEdzdEVsZW1lbnQgKnBsYXliaW4sICpzaW5rLCAqYmluLCAqZXEsICphdWNvbnY7CisgIEdzdFBhZCAqZXFfc2lua3BhZDsKKyAgZ2NoYXIgKnVyaTsKKworICAvKiBjb21tYW5kIGxpbmUgb3B0aW9uIHBhcnNpbmcgKi8KKyAgY3R4ID0gZ19vcHRpb25fY29udGV4dF9uZXcgKCJGSUxFTkFNRSIpOworICBnX29wdGlvbl9jb250ZXh0X2FkZF9ncm91cCAoY3R4LCBnc3RfaW5pdF9nZXRfb3B0aW9uX2dyb3VwICgpKTsKKyAgZ19vcHRpb25fY29udGV4dF9hZGRfbWFpbl9lbnRyaWVzIChjdHgsIHRlc3RfZ29wdGlvbnMsIE5VTEwpOworCisgIGlmICghZ19vcHRpb25fY29udGV4dF9wYXJzZSAoY3R4LCAmYXJnYywgJmFyZ3YsICZvcHRfZXJyKSkgeworICAgIGdfZXJyb3IgKCJFcnJvciBwYXJzaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zOiAlcyIsIG9wdF9lcnItPm1lc3NhZ2UpOworICAgIGdfb3B0aW9uX2NvbnRleHRfZnJlZSAoY3R4KTsKKyAgICBnX2NsZWFyX2Vycm9yICgmb3B0X2Vycik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGdfb3B0aW9uX2NvbnRleHRfZnJlZSAoY3R4KTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAoZXF1YWxpemVyX3Rlc3RfZGVidWcsICJlcXVhbGl6ZXJ0ZXN0IiwgMCwgImVxdGVzdCIpOworCisgIGlmIChmaWxlbmFtZXMgPT0gTlVMTCB8fCAqZmlsZW5hbWVzID09IE5VTEwpIHsKKyAgICBnX3ByaW50ZXJyICgiUGxlYXNlIHNwZWNpZnkgYSBmaWxlIHRvIHBsYXkgYmFja1xuIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcGxheWJpbiA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInBsYXliaW4iLCAicGxheWJpbiIpOworICBpZiAocGxheWJpbiA9PSBOVUxMKSB7CisgICAgZ19lcnJvciAoIkNvdWxkbid0IGNyZWF0ZSAncGxheWJpbicgZWxlbWVudCIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChvcHRfYXVkaW9zaW5rX3N0cikgeworICAgIGdfcHJpbnQgKCJUcnlpbmcgYXVkaW9zaW5rICclcycgLi4uIiwgb3B0X2F1ZGlvc2lua19zdHIpOworICAgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKG9wdF9hdWRpb3Npbmtfc3RyLCAic2luayIpOworICAgIGdfcHJpbnQgKCIlc1xuIiwgKHNpbmspID8gIm9rIiA6ICJlbGVtZW50IGNvdWxkbid0IGJlIGNyZWF0ZWQiKTsKKyAgfSBlbHNlIHsKKyAgICBzaW5rID0gTlVMTDsKKyAgfQorICBpZiAoc2luayA9PSBOVUxMKSB7CisgICAgZ19wcmludCAoIlRyeWluZyBhdWRpb3NpbmsgJyVzJyAuLi4iLCAiYXV0b2F1ZGlvc2luayIpOworICAgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdXRvYXVkaW9zaW5rIiwgInNpbmsiKTsKKyAgICBnX3ByaW50ICgiJXNcbiIsIChzaW5rKSA/ICJvayIgOiAiZWxlbWVudCBjb3VsZG4ndCBiZSBjcmVhdGVkIik7CisgIH0KKyAgaWYgKHNpbmsgPT0gTlVMTCkgeworICAgIGdfcHJpbnQgKCJUcnlpbmcgYXVkaW9zaW5rICclcycgLi4uIiwgImFsc2FzaW5rIik7CisgICAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImFsc2FzaW5rIiwgInNpbmsiKTsKKyAgICBnX3ByaW50ICgiJXNcbiIsIChzaW5rKSA/ICJvayIgOiAiZWxlbWVudCBjb3VsZG4ndCBiZSBjcmVhdGVkIik7CisgIH0KKyAgaWYgKHNpbmsgPT0gTlVMTCkgeworICAgIGdfcHJpbnQgKCJUcnlpbmcgYXVkaW9zaW5rICclcycgLi4uIiwgIm9zc3NpbmsiKTsKKyAgICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgib3Nzc2luayIsICJzaW5rIik7CisgICAgZ19wcmludCAoIiVzXG4iLCAoc2luaykgPyAib2siIDogImVsZW1lbnQgY291bGRuJ3QgYmUgY3JlYXRlZCIpOworICB9CisKKyAgZ19hc3NlcnQgKHNpbmsgIT0gTlVMTCk7CisKKyAgYmluID0gZ3N0X2Jpbl9uZXcgKCJhdXNpbmtiaW4iKTsKKyAgZ19hc3NlcnQgKGJpbiAhPSBOVUxMKTsKKworICBlcSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImVxdWFsaXplci1uYmFuZHMiLCAiZXF1YWxpemVyIik7CisgIGdfYXNzZXJ0IChlcSAhPSBOVUxMKTsKKworICBhdWNvbnYgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJhdWRpb2NvbnZlcnQiLCAiZXFhdWNvbnYiKTsKKyAgZ19hc3NlcnQgKGF1Y29udiAhPSBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChiaW4pLCBlcSwgYXVjb252LCBzaW5rLCBOVUxMKTsKKworICBpZiAoIWdzdF9lbGVtZW50X2xpbmsgKGVxLCBhdWNvbnYpKQorICAgIGdfZXJyb3IgKCJGYWlsZWQgdG8gbGluayBlcXVhbGl6ZXIgdG8gYXVkaW9jb252ZXJ0Iik7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rIChhdWNvbnYsIHNpbmspKQorICAgIGdfZXJyb3IgKCJGYWlsZWQgdG8gbGluayBhdWRpb2NvbnZlcnQgdG8gYXVkaW8gc2luayIpOworCisgIGVxX3NpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZXEsICJzaW5rIik7CisgIGdfYXNzZXJ0IChlcV9zaW5rcGFkICE9IE5VTEwpOworCisgIGdzdF9lbGVtZW50X2FkZF9wYWQgKGJpbiwgZ3N0X2dob3N0X3BhZF9uZXcgKE5VTEwsIGVxX3NpbmtwYWQpKTsKKyAgZ3N0X29iamVjdF91bnJlZiAoZXFfc2lua3BhZCk7CisKKyAgZ19vYmplY3Rfc2V0IChwbGF5YmluLCAiYXVkaW8tc2luayIsIGJpbiwgTlVMTCk7CisKKyAgLyogd29uJ3Qgd29yazogdXJpID0gZ3N0X3VyaV9jb25zdHJ1Y3QgKCJmaWxlIiwgZmlsZW5hbWVzWzBdKTsgKi8KKyAgdXJpID0gZ19zdHJkdXBfcHJpbnRmICgiZmlsZTovLyVzIiwgZmlsZW5hbWVzWzBdKTsKKyAgZ19vYmplY3Rfc2V0IChwbGF5YmluLCAidXJpIiwgdXJpLCBOVUxMKTsKKyAgZ19mcmVlICh1cmkpOworCisgIHBpcGVsaW5lX2J1cyA9IEdTVF9FTEVNRU5UX0JVUyAocGxheWJpbik7CisKKyAgcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwbGF5YmluLCBHU1RfU1RBVEVfUExBWUlORyk7CisgIGlmIChyZXQgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKSB7CisgICAgZ19wcmludGVyciAoIkZhaWxlZCB0byBzZXQgcGxheWJpbiB0byBQTEFZSU5HXG4iKTsKKyAgICBjaGVja19idXMgKDEgKiBHU1RfU0VDT05EKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKHBsYXliaW4sIE5VTEwsIE5VTEwsIDUgKiBHU1RfU0VDT05EKTsKKyAgaWYgKHJldCA9PSBHU1RfU1RBVEVfQ0hBTkdFX0FTWU5DKSB7CisgICAgZ19wcmludGVyciAoIkZhaWxlZCB0byBnbyB0byBQTEFZSU5HIGluIDUgc2Vjb25kcywgYmFpbGluZyBvdXRcbiIpOworICAgIHJldHVybiAtMTsKKyAgfSBlbHNlIGlmIChyZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9TVUNDRVNTKSB7CisgICAgZ19wcmludGVyciAoIlN0YXRlIGNoYW5nZSB0byBQTEFZSU5HIGZhaWxlZFxuIik7CisgICAgY2hlY2tfYnVzICgxICogR1NUX1NFQ09ORCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgZ19wcmludCAoIlBsYXlpbmcgLi4uXG4iKTsKKyAgZG9fc2xpZGVyX2ZpZGRsaW5nIChwbGF5YmluLCBlcSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwbGF5YmluLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBsYXliaW4pOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaWNsZXMvZ2RrcGl4YnVmb3ZlcmxheS10ZXN0LmMgYi90ZXN0cy9pY2xlcy9nZGtwaXhidWZvdmVybGF5LXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTI3NmVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaWNsZXMvZ2RrcGl4YnVmb3ZlcmxheS10ZXN0LmMKQEAgLTAsMCArMSwyNzggQEAKKy8qIEdTdHJlYW1lciBnZGtwaXhidWZvdmVybGF5IHRlc3QgYXBwCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIGNvbT4KKworICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z2lvL2dpby5oPgorI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvdmlkZW8vdmlkZW8uaD4KKyNpbmNsdWRlIDxnZGstcGl4YnVmL2dkay1waXhidWYuaD4KKworI2luY2x1ZGUgPG1hdGguaD4KKworI2RlZmluZSBWSURFT19XSURUSCA3MjAKKyNkZWZpbmUgVklERU9fSEVJR0hUIDQ4MAorI2RlZmluZSBWSURFT19GUFMgNTAKKworLyogR2RrUGl4YnVmIFJHQkEgQy1Tb3VyY2UgaW1hZ2UgZHVtcCBmcm9tIGdkay1waXhidWYtY3NvdXJjZSAtLXJhdywKKyAqIGd6aXBwZWQgYW5kIHRoZW4gYmFzZTY0IGVuY29kZWQgKi8KK2NvbnN0IGdjaGFyIGd6aXBwZWRfcGl4ZGF0YV9iYXNlNjRbXSA9CisgICAgIkg0c0lDUFgvWjFRQUEyeHZaMjh1Y0dsNEFPMmRzWkhyTmhDRytld0sySUk2NENseXJobW5UdFNCaDRrTFVPTFFBVXV3RWhTZ0Z0aUEiCisgICAgIkE3YWd3QTJ3QlQ1QVhKNXc0UDVMZ0tMRU85N2V6RGYyU0NBSUFmdGpGd3VRNy9jLy8vb2p5Lzc3KzhlUDdKY3MrL1dmTE12K3QvelciCisgICAgImRWMzJwU21LM0hLNnNYWmJGT1hWOVBaZldpcExiV2tzSGRIUVp4VnBaUCtFZTd1NjIvZDdydDBmaXZJcWltSm5PWCt3L3poYXVxNjgiCisgICAgImFXamV2ZmRVUjFoM3ZYcS9LTXF6dWZ1ZUZOMUoxRkUrc3RmOEtmQ3pvYlozcS9lUG9qeVQzdjhnRFN5QjA5R0ZORDdnL04wMTRycGwiCisgICAgIjQxeEYrV3owL2k4MTdud0ZqZXBQK1JiMFBuRHdPVU9laGVQeVFxMWV1cmxyU2tYWk9rVng3T2JsYkdLNDN1cGYremNxeWxkaE9UMjIiCisgICAgIjVHdlY5eW5LWElyaVFEcEt5ZTI0MkxkY3ZlMktza1g2ZGVhUldWZWVibnBkdTMyS29yeWM0dC9pYUtrc21tOVZ2ZzNXM25lV2srVnMiCisgICAgInFTMnRwU091OU5tWnRMRzRmN1IxNXBhUzdqWGN0MXE3WHhUbDJaRGQxNTdkcDFBLzZxOUkrMVdnK1FIMWc4cG1jYjdNMHN6VUhzZVYiCisgICAgIi9LVFR0SmczOVh5dWRIL05BU21iaGZ6T1V0cVROSG1oZXcxY2dsaFQ5YWQ4TzE2a3Y3bTRlRlQzL3BWTlE3N0lYOHNoTGdXL1Juc1ciCisgICAgIkxpN1Y1eTRVSmFEbzl3bk9UOVNqcTFmem40b1NRWEhmdDR0WjAwVnByNWpJM3lpS3dtTzFzeS82M0daS3pOcFMrZFZ5THNhWW5lVmsiCisgICAgIlVkK3JiSXFpMzJNL2tDN0R0YVh6bjZ2dDlWbTk1WmJTMGxnNjRyeDJueW5LZHlIUTNvQytBMDZaeGR0Ymt6dFd1bmRwcVMxZktvNWoiCisgICAgIjlPZlE4K2pLSk5iVzk4N2V5ZTQ3UUdPNVdFNnUvQlBha0pQMnJ0NDkyN1g3Smhhbk5hQkJ6UVVwRU1ibVUyaEprNjZPMmZ0dDdsclMiCisgICAgImY4dmM0eWwrMFA3bGxzcHlXYXBPbDN0aDlIZGRlNHlWejRtMTdlTUQycFA4WkJYakkwbDNKN29HMVJmMURsSDdkeUJPcEt1QjIrZEIiCisgICAgIjJaektYUzN1Z3c5K2xuS1pCNDlvSDJiTDFvd0dIOUs0dlg1UDdZZyswK08xL1VqL1hTUm04ZXA5V3M2TGNsclJmZStOMSt4WUl4anoiCisgICAgIjQ5SnJoNkQrbTY4aW5TeXBQZVFqYTdwWFJacDMvejFQNk03WE0reFgrN2V6bkVsSGMzRTYzSHYyeFdtb284OUg0eUxFbnBEZytvcnEiCisgICAgIkRzbkpGcTdvV3FZdExoZDdzYlRnM2kzZEwyVk8yWGx0NU9vN0R6WTFVYzhWdE9uZzllTVp0UDBjdHBubUphNzg3VGNtL2piVXRtSGMiCisgICAgInhmbUcrcDBid3owUjl0MWhZcjMzV1Rnai9aRWZlMVI3SGZuSjNOTkNqSWJLb1A4ZjFTQm4ydzJOcTNodFlJOW83dUJvcG5SSTlubU8iCisgICAgInJNL1p2ZWlqaFd1bGVlK0RGcngyeFpTSGUwR21uOTlpeDVzZDk2QSsxRTk3dzg4cEI4YlgxQUJ1YmZZSzREeEcrbXNZUGJXV2tzcVUiCisgICAgImd1NWEwdS9PNjhQUTN0OTloV0Y4a1c5dkMyZ1FhV1R5V3REMnNCNVVWek9oR2VSTEpSMnkvcEIwazlSSGdDcXhYYVAya1A1UW45VFUiCisgICAgIm4rSGU3cnVtd08vajVvU3IwRmFuUVpmL2pJcDMzKzY1MHFYWGpTajJGUDIreTU4QWJZVnJQczVQanV5T3hzVHZxNUgreVliOE1vZmciCisgICAgInU4cmdtS2IydnEvQytsUHRNTGoyS09qQmJ5UFNxVFMzTjlUMlkvRDVTYkF0ZHQxcjR1YXBvWjlpZmUrVnJvSHpsUW4yWkNmMGR3N0siCisgICAgIjdyazJDbjJWTW82ejE1cFAxS1B6dDVONzJMVCs0L1EzNmh2N2QrUjhJTk4vb1IyemR1blpFY3l2QU51RVBqM1NObGtObXZIY0lZNngiCisgICAgIjRlZUhXYmtpU2Z1Z3ZCVDNqZUxZaWZLZENkYUhnZ2JDK1E3VmkrWU9yaXpuVzVQRzhCRU5BajNHNUZZUVRzc2xXdmN4dXFxQUJrZTYiCisgICAgIm9Yem9xR3lFZmNDMWt1bm5YUlJ2Y2ZPbTJOOW1PbzRzelgxZGYvRG5CNFA5QmJzT01tQU5OWGY4RjlUZ2FCMXA1TGxwcEJlaGZyKy8iCisgICAgIjBQaXd1aEorWStoYnBYcGJHc05iTHRUY2M2NkxQelAzMXUrckR6blBlc0pQRG5uUzVOeTJvTUdSblNkb0VPVkVSanBFMnFUdlRtQWMiCisgICAgInBHdVE3WWc1RXlQN1FEWTNnalFvelJFek5JaGlOWFR2MU5pMUJlT0N5dnZ4T0pxelVKdHpVRDZNV2FYMXdLZDRQOUhiZ21mZGhGd0wiCisgICAgInAwRk9yOXg2RU9uZ210S0hwdDhUR05VeGNRMnlUWEdlTkxML2xIejRReG8wOS8wdE5OOGdINHphaW5JY3lLN1p1RjdRNEQ2aURhbDEiCisgICAgIjFrRTVaRCtiZkQrRHNCNDhCdVh5N0w3Ly9tRXZndWxyS1dkM2l5VWk3WlB6UytKNkMxd3orWHlGa2ZNV0IwRDAydEhybDJGZk1EWVgiCisgICAgInlmVXZpdFhnMlF2QnJsSE15TTRKRVczb3FDKzUvb3J5bXdiRVVXdHI1Y2s2NVBLaWRWQ0d5NGxlaDcxQVpnd2x2OUpONlZEUXNaU1AiCisgICAgIlFkZE0raVV3N25NNUJIV243aldLYlJmNlZzckpjakVGdEd1ZzJkcjdIdm50T1lRYTVPYW5UVDhqWS8vMnRNY1hhdXhDdVZCT28rOW4iCisgICAgIllZUnhuTklodk43ZzJBbkdJK2lhbUQ0dzZibndxTjgxMFFjdGFVTTZWOExsREpGUGs5YTdxZmxsem1kVkVXMllnMTh2bWtjL3hUcnciCisgICAgInlUcVU5dUREL2ZnSytiOUVIY0sxblRER2NGMEhyb2s2R3l1MDBjMzNLQlpsaWZ6dFlZNmZQYmNHMnBvVXF3bDJMZVdYdVh2NE9WRXAiCisgICAgIjk1WFVYLzZZb2o1Yld4OHYwRjhPZk4zZzcyclMzVEZXZXdrNlJIdUhYT3dram9YaGZWbnNPY2RGYzV4VUovSnRvN2dLbEVYNXhVbE4iCisgICAgIngvVC9STnZGdmhBMEdEWG5DZmVkUFk5K1pVaGp2dTRXZnk1UDBDSEtvWEdhRU1jaTFUWWo3c2ZxSmJJK3VCZndTTnVGZWxQUFhrcCsiCisgICAgIms4MjNCR1hRV3VHaDNBbVlSemY5enBLTU9mdnlZQjh1RWl1QzhaWE8wMHp1WjAyMEc4M3JzOFkveFU4Z213Y2FSUFZLYSt1ay9MTGgiCisgICAgIjh5MU5VRWJLZmMrYXd3M2VQL3hTNzN4SUJlejVYYktQend1VzNINGg2RWMzajZFOWJhNlBrUjlNR2d2Qk5tUGJMZVhhNThUZktScU0iCisgICAgImJydEpQSnVUb20vdkdtNGR3SjJsUVhtc1dlL2NNNGw3bUZ0Qk9DY2pQUitCOWlNR1c0TG5HV0xIYTRiZHpOcWJqNndqMlFZRVhZWCsiCisgICAgIkpQV01LbGNPdnBkRWFJY1V1MGJsVUExZVg3Qm5ieDdvczAyL040aUxSU01ZN1F1YWNXd1NjMjRZamhYUWd4US9zVDRzMFFiUXMya08iCisgICAgImRsMW8raGlZczA5cC84eC83a1BhcXcvM0daR2ZrUGJta2E5QzV3aVEzMFJ6SmRwM1IyY1RoM01Lb3prNnRhMWJnZllHVXpVNDJzTVgiCisgICAgInhzUDFxNHR0dUx4ZmNpN1BzMTgvUndmUEk2ZjJ4NFFPRzA4Ny9tOGFyUmxOMnZOOXlQK0c1eWlUY3BFVGJVQnhDcG83a0daem9mM0QiCisgICAgIk93R0c1NmNhNy9Od0RrZHJ3YzFxVU5pWFQ0SHJ4OWhuMVdMT2owbjd3REY3VmNrYTlHdzM5bHlMOUd6NTFQNzhlYkF2MUc5QmZXaXYiCisgICAgIkEya1ErbUtoemJQMmFFejhzOERzbVdHRGZieGpjLytPRU5EZmliNGIzdU5VZWptWnFHZDhnLzVFWTNrMUNXdDJjejluT05SMzgwWE0iCisgICAgIitIUHZIbG5pdlUvY2UxOWFBOTZGQS9Uc1AyOTg0cTZqY3BlZy9mNzVrVHlveHdmRmlTVzZaa0pMSERIdnQ4bnA5M0h2M3hsaUNMVDIiCisgICAgIk9JRXgzT1RlSUxNZjJFenRDWUtZTmNZRzJmTVFpdktkWWJRVXBZMXMvTTZaVGNicGl2Sk1NdjVacGRobjdtZHBWMUdVTzFsL05qVFUiCisgICAgIlVzeDdaOEl6M1p1TTB4WGxGV1Q4czRDc0RrbXpKWlBEMFRoVVVXYVN5ZThUSFo2UnFPai91ZjJMMWY3OVQwWFpDcG44dkpKMFBrYjkiCisgICAgIm42SXNDT1ZvQnAvSHZTK21vZTgzK1Q0ZFJWRVVaUm15bjJGOXN3bDl5QUFBIjsKKworc3RhdGljIEdka1BpeGJ1ZiAqbG9nb19waXhidWY7CisKK3N0YXRpYyBHTWFpbkxvb3AgKm1haW5fbG9vcDsKK3N0YXRpYyBnaW50IGNvdW50OworCitzdGF0aWMgR2RrUGl4YnVmICoKK2NyZWF0ZV9vdmVybGF5X3BpeGJ1ZiAodm9pZCkKK3sKKyAgR1psaWJEZWNvbXByZXNzb3IgKmRlY29tcHJlc3M7CisgIEdDb252ZXJ0ZXJSZXN1bHQgZGVjb21wX3JlczsKKyAgZ3VjaGFyICpnemlwcGVkX3BpeGRhdGEsICpwaXhkYXRhLCAqcGl4ZWxzX2NvcHk7CisgIGdzaXplIGd6aXBwZWRfc2l6ZSwgYnl0ZXNfcmVhZCwgcGl4ZGF0YV9zaXplOworICBndWludCBzdHJpZGUsIHdpZHRoLCBoZWlnaHQ7CisgIEdka1BpeGJ1ZiAqcGl4YnVmOworCisgIGd6aXBwZWRfcGl4ZGF0YSA9IGdfYmFzZTY0X2RlY29kZSAoZ3ppcHBlZF9waXhkYXRhX2Jhc2U2NCwgJmd6aXBwZWRfc2l6ZSk7CisgIGdfYXNzZXJ0IChnemlwcGVkX3BpeGRhdGEgIT0gTlVMTCk7CisKKyAgcGl4ZGF0YSA9IGdfbWFsbG9jICg2NCAqIDEwMjQpOworCisgIGRlY29tcHJlc3MgPSBnX3psaWJfZGVjb21wcmVzc29yX25ldyAoR19aTElCX0NPTVBSRVNTT1JfRk9STUFUX0daSVApOworICBkZWNvbXBfcmVzID0gZ19jb252ZXJ0ZXJfY29udmVydCAoR19DT05WRVJURVIgKGRlY29tcHJlc3MpLAorICAgICAgZ3ppcHBlZF9waXhkYXRhLCBnemlwcGVkX3NpemUsIHBpeGRhdGEsIDY0ICogMTAyNCwKKyAgICAgIEdfQ09OVkVSVEVSX0lOUFVUX0FUX0VORCwgJmJ5dGVzX3JlYWQsICZwaXhkYXRhX3NpemUsIE5VTEwpOworICBnX2Fzc2VydCAoZGVjb21wX3JlcyA9PSBHX0NPTlZFUlRFUl9GSU5JU0hFRCk7CisgIGdfYXNzZXJ0IChieXRlc19yZWFkID09IGd6aXBwZWRfc2l6ZSk7CisgIGdfZnJlZSAoZ3ppcHBlZF9waXhkYXRhKTsKKyAgZ19vYmplY3RfdW5yZWYgKGRlY29tcHJlc3MpOworCisgIC8qIDA6IFBpeGJ1ZiBtYWdpYyAoMHg0NzY0NmI1MCkgKi8KKyAgZ19hc3NlcnQgKEdTVF9SRUFEX1VJTlQzMl9CRSAocGl4ZGF0YSkgPT0gMHg0NzY0NmI1MCk7CisKKyAgLyogcGl4ZGF0YSBsZW5ndGggKi8KKyAgcGl4ZGF0YV9zaXplID0gR1NUX1JFQURfVUlOVDMyX0JFIChwaXhkYXRhICsgNCk7CisgIGdfYXNzZXJ0IChwaXhkYXRhX3NpemUgPiA0ICsgNCArIDQgKyA0ICsgNCArIDQpOworCisgIC8qIHJhdywgOC1iaXQgZGVwdGgsIFJHQkEgKi8KKyAgZ19hc3NlcnQgKEdTVF9SRUFEX1VJTlQzMl9CRSAocGl4ZGF0YSArIDgpID09IDB4MDEwMTAwMDIpOworCisgIHN0cmlkZSA9IEdTVF9SRUFEX1VJTlQzMl9CRSAocGl4ZGF0YSArIDEyKTsKKyAgd2lkdGggPSBHU1RfUkVBRF9VSU5UMzJfQkUgKHBpeGRhdGEgKyAxNik7CisgIGhlaWdodCA9IEdTVF9SRUFEX1VJTlQzMl9CRSAocGl4ZGF0YSArIDIwKTsKKworICBnX2Fzc2VydCAocGl4ZGF0YV9zaXplID09IDI0ICsgaGVpZ2h0ICogc3RyaWRlKTsKKworICBwaXhlbHNfY29weSA9IGdfbWVtZHVwIChwaXhkYXRhICsgMjQsIGhlaWdodCAqIHN0cmlkZSk7CisKKyAgcGl4YnVmID0KKyAgICAgIGdka19waXhidWZfbmV3X2Zyb21fZGF0YSAocGl4ZWxzX2NvcHksIEdES19DT0xPUlNQQUNFX1JHQiwgVFJVRSwgOCwKKyAgICAgIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgKEdka1BpeGJ1ZkRlc3Ryb3lOb3RpZnkpIGdfZnJlZSwgcGl4ZWxzX2NvcHkpOworCisgIGdfYXNzZXJ0IChwaXhidWYgIT0gTlVMTCk7CisKKyAgZ19mcmVlIChwaXhkYXRhKTsKKworICByZXR1cm4gcGl4YnVmOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK2J1c19jYiAoR3N0QnVzICogYnVzLCBHc3RNZXNzYWdlICogbXNnLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdNYWluTG9vcCAqbG9vcCA9IHVzZXJfZGF0YTsKKworICBzd2l0Y2ggKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykpIHsKKyAgICBjYXNlIEdTVF9NRVNTQUdFX0VSUk9SOnsKKyAgICAgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgICAgIGdjaGFyICpkYmc7CisKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtc2csICZlcnIsICZkYmcpOworICAgICAgZ3N0X29iamVjdF9kZWZhdWx0X2Vycm9yIChtc2ctPnNyYywgZXJyLCBkYmcpOworICAgICAgZ19jbGVhcl9lcnJvciAoJmVycik7CisgICAgICBnX2ZyZWUgKGRiZyk7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNkZWZpbmUgU1BFRURfU0NBTEVfRkFDVE9SIChWSURFT19GUFMgKiA0KQorCisvKiBuaWNrZWQgZnJvbSB2aWRlb3Rlc3RzcmMncyBiYWxsIHBhdHRlcm4gcmVuZGVyZXIgKi8KK3N0YXRpYyB2b2lkCitjYWxjdWxhdGVfcG9zaXRpb24gKGdpbnQgKiB4LCBnaW50ICogeSwgZ3VpbnQgbG9nb193LCBndWludCBsb2dvX2gsIGd1aW50IG4pCit7CisgIGd1aW50IHJfeCA9IGxvZ29fdyAvIDI7CisgIGd1aW50IHJfeSA9IGxvZ29faCAvIDI7CisgIGd1aW50IHcgPSBWSURFT19XSURUSCArIGxvZ29fdzsKKyAgZ3VpbnQgaCA9IFZJREVPX0hFSUdIVCArIGxvZ29faDsKKworICAqeCA9IHJfeCArICgwLjUgKyAwLjUgKiBzaW4gKDIgKiBHX1BJICogbiAvIFNQRUVEX1NDQUxFX0ZBQ1RPUikpCisgICAgICAqICh3IC0gMiAqIHJfeCk7CisgICp5ID0gcl95ICsgKDAuNSArIDAuNSAqIHNpbiAoMiAqIEdfUEkgKiBzcXJ0ICgyKSAqIG4gLyBTUEVFRF9TQ0FMRV9GQUNUT1IpKQorICAgICAgKiAoaCAtIDIgKiByX3kpOworCisgICp4IC09IGxvZ29fdzsKKyAgKnkgLT0gbG9nb19oOworfQorCitzdGF0aWMgR3N0UGFkUHJvYmVSZXR1cm4KK2J1ZmZlcl9jYiAoR3N0UGFkICogcGFkLCBHc3RQYWRQcm9iZUluZm8gKiBpbmZvLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisgIEdzdEVsZW1lbnQgKm92ZXJsYXkgPSBHU1RfUEFEX1BBUkVOVCAocGFkKTsKKyAgZ2ludCB4LCB5LCB3LCBoOworCisgIHcgPSBnZGtfcGl4YnVmX2dldF93aWR0aCAobG9nb19waXhidWYpOworICBoID0gZ2RrX3BpeGJ1Zl9nZXRfaGVpZ2h0IChsb2dvX3BpeGJ1Zik7CisKKyAgY2FsY3VsYXRlX3Bvc2l0aW9uICgmeCwgJnksIHcsIGgsICsrY291bnQpOworCisgIEdTVF9MT0cgKCIlM2QsICUzZCIsIHgsIHkpOworCisgIGdfb2JqZWN0X3NldCAob3ZlcmxheSwgIm9mZnNldC14IiwgeCwgIm9mZnNldC15IiwgeSwgTlVMTCk7CisKKyAgcmV0dXJuIEdTVF9QQURfUFJPQkVfT0s7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBHT3B0aW9uRW50cnkgb3B0aW9uc1tdID0geworICAgIHtOVUxMfQorICB9OworICBHT3B0aW9uQ29udGV4dCAqY3R4OworICBHRXJyb3IgKmVyciA9IE5VTEw7CisgIEdzdEVsZW1lbnQgKnNyYywgKnEsICpjYXBzZmlsdGVyLCAqb3ZlcmxheSwgKnNpbms7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RQYWQgKnNpbmtfcGFkOworICBHc3RDYXBzICpmaWx0ZXJfY2FwczsKKworICBjdHggPSBnX29wdGlvbl9jb250ZXh0X25ldyAoIiIpOworICBnX29wdGlvbl9jb250ZXh0X2FkZF9tYWluX2VudHJpZXMgKGN0eCwgb3B0aW9ucywgR0VUVEVYVF9QQUNLQUdFKTsKKyAgZ19vcHRpb25fY29udGV4dF9hZGRfZ3JvdXAgKGN0eCwgZ3N0X2luaXRfZ2V0X29wdGlvbl9ncm91cCAoKSk7CisgIGlmICghZ19vcHRpb25fY29udGV4dF9wYXJzZSAoY3R4LCAmYXJnYywgJmFyZ3YsICZlcnIpKSB7CisgICAgZ19wcmludCAoIkVycm9yIGluaXRpYWxpemluZzogJXNcbiIsIGVyci0+bWVzc2FnZSk7CisgICAgZ19vcHRpb25fY29udGV4dF9mcmVlIChjdHgpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnIpOworICAgIHJldHVybiAxOworICB9CisgIGdfb3B0aW9uX2NvbnRleHRfZnJlZSAoY3R4KTsKKworICBsb2dvX3BpeGJ1ZiA9IGNyZWF0ZV9vdmVybGF5X3BpeGJ1ZiAoKTsKKworICBtYWluX2xvb3AgPSBnX21haW5fbG9vcF9uZXcgKE5VTEwsIEZBTFNFKTsKKworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKCJwaXBlbGluZSIpOworCisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsIE5VTEwpOworICBnc3RfdXRpbF9zZXRfb2JqZWN0X2FyZyAoR19PQkpFQ1QgKHNyYyksICJwYXR0ZXJuIiwgIndoaXRlIik7CisKKyAgb3ZlcmxheSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImdka3BpeGJ1Zm92ZXJsYXkiLCBOVUxMKTsKKworICAvKiBzZXQgcG9zaXRpb25pbmctbW9kZSB0byBhYnNvbHV0ZSBzbyB3ZSBjYW4gc2V0IG5lZ2F0aXZlIHBvc2l0aW9ucyAqLworICBnX29iamVjdF9zZXQgKG92ZXJsYXksICJwaXhidWYiLCBsb2dvX3BpeGJ1ZiwgInBvc2l0aW9uaW5nLW1vZGUiLCAxLCBOVUxMKTsKKworICBzaW5rX3BhZCA9IGdzdF9lbGVtZW50X2dldF9zdGF0aWNfcGFkIChvdmVybGF5LCAic2luayIpOworICBnc3RfcGFkX2FkZF9wcm9iZSAoc2lua19wYWQsIEdTVF9QQURfUFJPQkVfVFlQRV9CVUZGRVIsIGJ1ZmZlcl9jYiwgTlVMTCwKKyAgICAgIE5VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rX3BhZCk7CisKKyAgcSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInF1ZXVlIiwgTlVMTCk7CisKKyAgY2Fwc2ZpbHRlciA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImNhcHNmaWx0ZXIiLCBOVUxMKTsKKyAgZmlsdGVyX2NhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAoInZpZGVvL3gtcmF3LCBmb3JtYXQgPSAiCisgICAgICBHU1RfVklERU9fT1ZFUkxBWV9DT01QT1NJVElPTl9CTEVORF9GT1JNQVRTKTsKKyAgZ3N0X2NhcHNfc2V0X3NpbXBsZSAoZmlsdGVyX2NhcHMsCisgICAgICAid2lkdGgiLCBHX1RZUEVfSU5ULCBWSURFT19XSURUSCwKKyAgICAgICJoZWlnaHQiLCBHX1RZUEVfSU5ULCBWSURFT19IRUlHSFQsCisgICAgICAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sIFZJREVPX0ZQUywgMSwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoY2Fwc2ZpbHRlciwgImNhcHMiLCBmaWx0ZXJfY2FwcywgTlVMTCk7CisgIGdzdF9jYXBzX3VucmVmIChmaWx0ZXJfY2Fwcyk7CisKKyAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInhpbWFnZXNpbmsiLCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHNyYywgcSwgb3ZlcmxheSwgY2Fwc2ZpbHRlciwgc2luaywKKyAgICAgIE5VTEwpOworCisgIGdzdF9lbGVtZW50X2xpbmtfbWFueSAoc3JjLCBxLCBvdmVybGF5LCBjYXBzZmlsdGVyLCBzaW5rLCBOVUxMKTsKKworICBjb3VudCA9IDA7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIGdzdF9idXNfYWRkX3dhdGNoIChHU1RfRUxFTUVOVF9CVVMgKHBpcGVsaW5lKSwgYnVzX2NiLCBtYWluX2xvb3ApOworCisgIGdfbWFpbl9sb29wX3J1biAobWFpbl9sb29wKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGVsaW5lKTsKKyAgZ19vYmplY3RfdW5yZWYgKGxvZ29fcGl4YnVmKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ljbGVzL2dka3BpeGJ1ZnNpbmstdGVzdC5jIGIvdGVzdHMvaWNsZXMvZ2RrcGl4YnVmc2luay10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyODI1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ljbGVzL2dka3BpeGJ1ZnNpbmstdGVzdC5jCkBAIC0wLDAgKzEsMzY0IEBACisvKiBHU3RyZWFtZXIgaW50ZXJhY3RpdmUgdGVzdCBmb3IgdGhlIGdka3BpeGJ1ZnNpbmsgZWxlbWVudAorICogQ29weXJpZ2h0IChDKSAyMDA4IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxndGsvZ3RrLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEdzdEVsZW1lbnQgKnBpcGU7CisgIEdzdEVsZW1lbnQgKnNpbms7CisgIGdib29sZWFuIGdvdF92aWRlbzsKKworICBHdGtXaWRnZXQgKndpbjsKKyAgR3RrV2lkZ2V0ICppbWc7CisgIEd0a1dpZGdldCAqc2xpZGVyOworICBHdGtXaWRnZXQgKmFjY3VyYXRlX2NiOworCisgIGdib29sZWFuIGFjY3VyYXRlOyAgICAgICAgICAgIC8qIHdoZXRoZXIgdG8gdHJ5IGFjY3VyYXRlIHNlZWtzICovCisKKyAgZ2ludDY0IGN1cl9wb3M7CisgIGdib29sZWFuIHByZXJvbGxlZDsKK30gQXBwSW5mbzsKKworc3RhdGljIHZvaWQgc2Vla190byAoQXBwSW5mbyAqIGluZm8sIGdkb3VibGUgcGVyY2VudCk7CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK2NyZWF0ZV9lbGVtZW50IChjb25zdCBnY2hhciAqIGZhY3RvcnlfbmFtZSkKK3sKKyAgR3N0RWxlbWVudCAqZWxlbWVudDsKKworICBlbGVtZW50ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlIChmYWN0b3J5X25hbWUsIE5VTEwpOworCisgIGlmIChlbGVtZW50ID09IE5VTEwpCisgICAgZ19lcnJvciAoIkZhaWxlZCB0byBjcmVhdGUgJyVzJyBlbGVtZW50IiwgZmFjdG9yeV9uYW1lKTsKKworICByZXR1cm4gZWxlbWVudDsKK30KKworc3RhdGljIHZvaWQKK25ld19kZWNvZGVkX3BhZCAoR3N0RWxlbWVudCAqIGRlYywgR3N0UGFkICogbmV3X3BhZCwgQXBwSW5mbyAqIGluZm8pCit7CisgIGNvbnN0IGdjaGFyICpzbmFtZTsKKyAgR3N0RWxlbWVudCAqY3NwLCAqc2NhbGUsICpmaWx0ZXI7CisgIEdzdFN0cnVjdHVyZSAqczsKKyAgR3N0Q2FwcyAqY2FwczsKKyAgR3N0UGFkICpzaW5rcGFkOworCisgIC8qIGFscmVhZHkgZm91bmQgYSB2aWRlbyBzdHJlYW0/ICovCisgIGlmIChpbmZvLT5nb3RfdmlkZW8pCisgICAgcmV0dXJuOworCisgIC8qIEZJWE1FOiBpcyB0aGlzIHJhY3kgb3IgZG9lcyBkZWNvZGViaW4gbWFrZSBzdXJlIGNhcHMgYXJlIGFsd2F5cworICAgKiBuZWdvdGlhdGVkIGF0IHRoaXMgcG9pbnQ/ICovCisgIGNhcHMgPSBnc3RfcGFkX3F1ZXJ5X2NhcHMgKG5ld19wYWQsIE5VTEwpOworICBnX3JldHVybl9pZl9mYWlsIChjYXBzICE9IE5VTEwpOworCisgIHMgPSBnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChjYXBzLCAwKTsKKyAgc25hbWUgPSBnc3Rfc3RydWN0dXJlX2dldF9uYW1lIChzKTsKKyAgaWYgKCFnX3N0cl9oYXNfcHJlZml4IChzbmFtZSwgInZpZGVvL3gtcmF3IikpCisgICAgZ290byBub3RfdmlkZW87CisKKyAgY3NwID0gY3JlYXRlX2VsZW1lbnQgKCJ2aWRlb2NvbnZlcnQiKTsKKyAgc2NhbGUgPSBjcmVhdGVfZWxlbWVudCAoInZpZGVvc2NhbGUiKTsKKyAgZmlsdGVyID0gY3JlYXRlX2VsZW1lbnQgKCJjYXBzZmlsdGVyIik7CisgIGluZm8tPnNpbmsgPSBjcmVhdGVfZWxlbWVudCAoImdka3BpeGJ1ZnNpbmsiKTsKKyAgZ19vYmplY3Rfc2V0IChpbmZvLT5zaW5rLCAicW9zIiwgRkFMU0UsICJtYXgtbGF0ZW5lc3MiLCAoZ2ludDY0KSAtIDEsIE5VTEwpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKGluZm8tPnBpcGUpLCBjc3AsIHNjYWxlLCBmaWx0ZXIsIGluZm8tPnNpbmssIE5VTEwpOworCisgIHNpbmtwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoY3NwLCAic2luayIpOworICBpZiAoR1NUX1BBRF9MSU5LX0ZBSUxFRCAoZ3N0X3BhZF9saW5rIChuZXdfcGFkLCBzaW5rcGFkKSkpCisgICAgZ19lcnJvciAoIkNhbid0IGxpbmsgbmV3IGRlY29kZWQgcGFkIHRvIHZpZGVvY29udmVydCdzIHNpbmsgcGFkIik7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNpbmtwYWQpOworCisgIGlmICghZ3N0X2VsZW1lbnRfbGluayAoY3NwLCBzY2FsZSkpCisgICAgZ19lcnJvciAoIkNhbid0IGxpbmsgdmlkZW9jb252ZXJ0IHRvIHZpZGVvc2NhbGUiKTsKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rIChzY2FsZSwgZmlsdGVyKSkKKyAgICBnX2Vycm9yICgiQ2FuJ3QgbGluayB2aWRlb3NjYWxlIHRvIGNhcHNmaWx0ZXIiKTsKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rIChmaWx0ZXIsIGluZm8tPnNpbmspKQorICAgIGdfZXJyb3IgKCJDYW4ndCBsaW5rIGNhcHNmaWx0ZXIgdG8gZ2RrcGl4YnVmc2luayIpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoaW5mby0+c2luaywgR1NUX1NUQVRFX1BBVVNFRCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoZmlsdGVyLCBHU1RfU1RBVEVfUEFVU0VEKTsKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChzY2FsZSwgR1NUX1NUQVRFX1BBVVNFRCk7CisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoY3NwLCBHU1RfU1RBVEVfUEFVU0VEKTsKKworICBpbmZvLT5nb3RfdmlkZW8gPSBUUlVFOworICByZXR1cm47CisKK25vdF92aWRlbzoKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorbm9fbW9yZV9wYWRzIChHc3RFbGVtZW50ICogZGVjb2RlYmluLCBBcHBJbmZvICogaW5mbykKK3sKKyAgaWYgKCFpbmZvLT5nb3RfdmlkZW8pIHsKKyAgICBnX2Vycm9yICgiVGhpcyBmaWxlIGRvZXMgbm90IGNvbnRhaW4gYSB2aWRlbyB0cmFjaywgb3IgeW91IGRvIG5vdCBoYXZlICIKKyAgICAgICAgInRoZSBuZWNlc3NhcnkgZGVjb2RlcihzKSBpbnN0YWxsZWQiKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorYnVzX21lc3NhZ2VfY2IgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1zZywgQXBwSW5mbyAqIGluZm8pCit7CisgIHN3aXRjaCAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfQVNZTkNfRE9ORTp7CisgICAgICAvKiBvbmx5IGludGVyZXN0ZWQgaW4gYXN5bmMtZG9uZSBtZXNzYWdlcyBmcm9tIHRoZSB0b3AtbGV2ZWwgcGlwZWxpbmUgKi8KKyAgICAgIGlmIChtc2ctPnNyYyAhPSBHU1RfT0JKRUNUX0NBU1QgKGluZm8tPnBpcGUpKQorICAgICAgICBicmVhazsKKworICAgICAgaWYgKCFpbmZvLT5wcmVyb2xsZWQpIHsKKyAgICAgICAgLyogbWFrZSBzbGlkZXIgdmlzaWJsZSBpZiBpdCdzIG5vdCB2aXNpYmxlIGFscmVhZHkgKi8KKyAgICAgICAgZ3RrX3dpZGdldF9zaG93IChpbmZvLT5zbGlkZXIpOworCisgICAgICAgIC8qIGluaXRpYWwgZnJhbWUgaXMgb2Z0ZW4gYmxhY2ssIHNvIHNlZWsgdG8gYmVnaW5uaW5nIHBsdXMgYSBiaXQgKi8KKyAgICAgICAgc2Vla190byAoaW5mbywgMC4wMDEpOworICAgICAgICBpbmZvLT5wcmVyb2xsZWQgPSBUUlVFOworICAgICAgfQorCisgICAgICAvKiB1cGRhdGUgcG9zaXRpb24gKi8KKyAgICAgIGlmICghZ3N0X2VsZW1lbnRfcXVlcnlfcG9zaXRpb24gKGluZm8tPnBpcGUsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgICAgICAgJmluZm8tPmN1cl9wb3MpKQorICAgICAgICBpbmZvLT5jdXJfcG9zID0gLTE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FTEVNRU5UOnsKKyAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsOworICAgICAgR2RrUGl4YnVmICpwaXhidWYgPSBOVUxMOworICAgICAgY29uc3QgR3N0U3RydWN0dXJlICpzdHJ1Y3R1cmU7CisKKyAgICAgIC8qIG9ubHkgaW50ZXJlc3RlZCBpbiBlbGVtZW50IG1lc3NhZ2VzIGZyb20gb3VyIGdka3BpeGJ1ZnNpbmsgKi8KKyAgICAgIGlmIChtc2ctPnNyYyAhPSBHU1RfT0JKRUNUX0NBU1QgKGluZm8tPnNpbmspKQorICAgICAgICBicmVhazsKKworICAgICAgLyogb25seSBpbnRlcmVzdGVkIGluIHRoZXNlIHR3byBtZXNzYWdlcyAqLworICAgICAgaWYgKCFnc3RfbWVzc2FnZV9oYXNfbmFtZSAobXNnLCAicHJlcm9sbC1waXhidWYiKSAmJgorICAgICAgICAgICFnc3RfbWVzc2FnZV9oYXNfbmFtZSAobXNnLCAicGl4YnVmIikpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGdfcHJpbnQgKCJwaXhidWZcbiIpOworICAgICAgc3RydWN0dXJlID0gZ3N0X21lc3NhZ2VfZ2V0X3N0cnVjdHVyZSAobXNnKTsKKyAgICAgIHZhbCA9IGdzdF9zdHJ1Y3R1cmVfZ2V0X3ZhbHVlIChzdHJ1Y3R1cmUsICJwaXhidWYiKTsKKyAgICAgIGdfcmV0dXJuX2lmX2ZhaWwgKHZhbCAhPSBOVUxMKTsKKworICAgICAgcGl4YnVmID0gR0RLX1BJWEJVRiAoZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWwpKTsKKyAgICAgIGd0a19pbWFnZV9zZXRfZnJvbV9waXhidWYgKEdUS19JTUFHRSAoaW5mby0+aW1nKSwgcGl4YnVmKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChwaXhidWYpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6eworICAgICAgR0Vycm9yICplcnIgPSBOVUxMOworICAgICAgZ2NoYXIgKmRiZyA9IE5VTEw7CisKKyAgICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtc2csICZlcnIsICZkYmcpOworICAgICAgZ19lcnJvciAoIkVycm9yOiAlc1xuJXNcbiIsIGVyci0+bWVzc2FnZSwgKGRiZykgPyBkYmcgOiAiIik7CisgICAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICAgIGdfZnJlZSAoZGJnKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIGdib29sZWFuCitjcmVhdGVfcGlwZWxpbmUgKEFwcEluZm8gKiBpbmZvLCBjb25zdCBnY2hhciAqIGZpbGVuYW1lKQoreworICBHc3RFbGVtZW50ICpzcmMsICpkZWM7CisgIEdzdEJ1cyAqYnVzOworCisgIGluZm8tPnBpcGUgPSBnc3RfcGlwZWxpbmVfbmV3ICgicGlwZWxpbmUiKTsKKyAgc3JjID0gY3JlYXRlX2VsZW1lbnQgKCJmaWxlc3JjIik7CisgIGdfb2JqZWN0X3NldCAoc3JjLCAibG9jYXRpb24iLCBmaWxlbmFtZSwgTlVMTCk7CisKKyAgZGVjID0gY3JlYXRlX2VsZW1lbnQgKCJkZWNvZGViaW4iKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChpbmZvLT5waXBlKSwgc3JjLCBkZWMsIE5VTEwpOworICBpZiAoIWdzdF9lbGVtZW50X2xpbmsgKHNyYywgZGVjKSkKKyAgICBnX2Vycm9yICgiQ2FuJ3QgbGluayBmaWxlc3JjIHRvIGRlY29kZWJpbiIpOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGRlYywgInBhZC1hZGRlZCIsIEdfQ0FMTEJBQ0sgKG5ld19kZWNvZGVkX3BhZCksIGluZm8pOworCisgIGdfc2lnbmFsX2Nvbm5lY3QgKGRlYywgIm5vLW1vcmUtcGFkcyIsIEdfQ0FMTEJBQ0sgKG5vX21vcmVfcGFkcyksIGluZm8pOworCisgIC8qIHNldCB1cCBidXMgKi8KKyAgYnVzID0gZ3N0X2VsZW1lbnRfZ2V0X2J1cyAoaW5mby0+cGlwZSk7CisgIGdzdF9idXNfYWRkX3NpZ25hbF93YXRjaCAoYnVzKTsKKyAgZ19zaWduYWxfY29ubmVjdCAoYnVzLCAibWVzc2FnZSIsIEdfQ0FMTEJBQ0sgKGJ1c19tZXNzYWdlX2NiKSwgaW5mbyk7CisgIGdzdF9vYmplY3RfdW5yZWYgKGJ1cyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitzZWVrX3RvIChBcHBJbmZvICogaW5mbywgZ2RvdWJsZSBwZXJjZW50KQoreworICBHc3RTZWVrRmxhZ3Mgc2Vla19mbGFnczsKKyAgZ2ludDY0IHNlZWtfcG9zLCBkdXIgPSAtMTsKKworICBpZiAoIWdzdF9lbGVtZW50X3F1ZXJ5X2R1cmF0aW9uIChpbmZvLT5waXBlLCBHU1RfRk9STUFUX1RJTUUsICZkdXIpCisgICAgICB8fCBkdXIgPD0gMCkgeworICAgIGdfcHJpbnRlcnIgKCJDb3VsZCBub3QgcXVlcnkgZHVyYXRpb25cbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIHNlZWtfcG9zID0gZ3N0X2dkb3VibGVfdG9fZ3VpbnQ2NCAoZ3N0X2d1aW50NjRfdG9fZ2RvdWJsZSAoZHVyKSAqIHBlcmNlbnQpOworICBnX3ByaW50ICgiU2Vla2luZyB0byAlIiBHU1RfVElNRV9GT1JNQVQgIiwgYWNjdXJhdGU6ICVkXG4iLAorICAgICAgR1NUX1RJTUVfQVJHUyAoc2Vla19wb3MpLCBpbmZvLT5hY2N1cmF0ZSk7CisKKyAgc2Vla19mbGFncyA9IEdTVF9TRUVLX0ZMQUdfRkxVU0g7CisKKyAgaWYgKGluZm8tPmFjY3VyYXRlKQorICAgIHNlZWtfZmxhZ3MgfD0gR1NUX1NFRUtfRkxBR19BQ0NVUkFURTsKKyAgZWxzZQorICAgIHNlZWtfZmxhZ3MgfD0gR1NUX1NFRUtfRkxBR19LRVlfVU5JVDsKKworICBpZiAoIWdzdF9lbGVtZW50X3NlZWtfc2ltcGxlIChpbmZvLT5waXBlLCBHU1RfRk9STUFUX1RJTUUsIHNlZWtfZmxhZ3MsCisgICAgICAgICAgc2Vla19wb3MpKSB7CisgICAgZ19wcmludGVyciAoIlNlZWsgZmFpbGVkLlxuIik7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitzbGlkZXJfY2IgKEd0a1JhbmdlICogcmFuZ2UsIEFwcEluZm8gKiBpbmZvKQoreworICBnZG91YmxlIHZhbDsKKworICB2YWwgPSBndGtfcmFuZ2VfZ2V0X3ZhbHVlIChyYW5nZSk7CisgIHNlZWtfdG8gKGluZm8sIHZhbCk7Cit9CisKK3N0YXRpYyBnY2hhciAqCitzbGlkZXJfZm9ybWF0X3ZhbHVlX2NiIChHdGtTY2FsZSAqIHNjYWxlLCBnZG91YmxlIHZhbHVlLCBBcHBJbmZvICogaW5mbykKK3sKKyAgZ2NoYXIgc1s2NF07CisKKyAgaWYgKGluZm8tPmN1cl9wb3MgPCAwKQorICAgIHJldHVybiBnX3N0cmR1cF9wcmludGYgKCIlMC4xZyUlIiwgdmFsdWUgKiAxMDAuMCk7CisKKyAgZ19zbnByaW50ZiAocywgNjQsICIlIiBHU1RfVElNRV9GT1JNQVQsIEdTVF9USU1FX0FSR1MgKGluZm8tPmN1cl9wb3MpKTsKKyAgc1sxMF0gPSAnXDAnOworICByZXR1cm4gZ19zdHJkdXAgKHMpOworfQorCitzdGF0aWMgdm9pZAorYWNjdXJhdGVfdG9nZ2xlZF9jYiAoR3RrVG9nZ2xlQnV0dG9uICogdG9nZ2xlLCBBcHBJbmZvICogaW5mbykKK3sKKyAgaW5mby0+YWNjdXJhdGUgPSBndGtfdG9nZ2xlX2J1dHRvbl9nZXRfYWN0aXZlICh0b2dnbGUpOworfQorCitzdGF0aWMgdm9pZAorcnVuX2d1aSAoY29uc3QgZ2NoYXIgKiBmaWxlbmFtZSkKK3sKKyAgR3RrV2lkZ2V0ICp2Ym94LCAqaGJveDsKKyAgQXBwSW5mbyAqaW5mbzsKKworICBpbmZvID0gZ19uZXcwIChBcHBJbmZvLCAxKTsKKworICAvKiBjcmVhdGUgcGlwZWxpbmUgKi8KKyAgaWYgKCFjcmVhdGVfcGlwZWxpbmUgKGluZm8sIGZpbGVuYW1lKSkKKyAgICBnb3RvIGRvbmU7CisKKyAgLyogY3JlYXRlIHdpbmRvdyAqLworICBpbmZvLT53aW4gPSBndGtfd2luZG93X25ldyAoR1RLX1dJTkRPV19UT1BMRVZFTCk7CisgIGdfc2lnbmFsX2Nvbm5lY3QgKGluZm8tPndpbiwgImRlbGV0ZS1ldmVudCIsIEdfQ0FMTEJBQ0sgKGd0a19tYWluX3F1aXQpLAorICAgICAgTlVMTCk7CisKKyAgdmJveCA9IGd0a19ib3hfbmV3IChHVEtfT1JJRU5UQVRJT05fVkVSVElDQUwsIDYpOworICBndGtfY29udGFpbmVyX3NldF9ib3JkZXJfd2lkdGggKEdUS19DT05UQUlORVIgKHZib3gpLCAxMik7CisgIGd0a19jb250YWluZXJfYWRkIChHVEtfQ09OVEFJTkVSIChpbmZvLT53aW4pLCB2Ym94KTsKKworICBpbmZvLT5pbWcgPSBndGtfaW1hZ2VfbmV3ICgpOworICBndGtfYm94X3BhY2tfc3RhcnQgKEdUS19CT1ggKHZib3gpLCBpbmZvLT5pbWcsIEZBTFNFLCBGQUxTRSwgNik7CisKKyAgaGJveCA9IGd0a19ib3hfbmV3IChHVEtfT1JJRU5UQVRJT05fSE9SSVpPTlRBTCwgNik7CisgIGd0a19ib3hfcGFja19zdGFydCAoR1RLX0JPWCAodmJveCksIGhib3gsIEZBTFNFLCBGQUxTRSwgNik7CisKKyAgaW5mby0+YWNjdXJhdGVfY2IgPSBndGtfY2hlY2tfYnV0dG9uX25ld193aXRoX2xhYmVsICgiYWNjdXJhdGUgc2VlayAiCisgICAgICAiKG1pZ2h0IG5vdCB3b3JrIHJlbGlhYmx5IHdpdGggYWxsIGRlbXV4ZXJzKSIpOworICBndGtfYm94X3BhY2tfc3RhcnQgKEdUS19CT1ggKGhib3gpLCBpbmZvLT5hY2N1cmF0ZV9jYiwgRkFMU0UsIEZBTFNFLCA2KTsKKyAgZ19zaWduYWxfY29ubmVjdCAoaW5mby0+YWNjdXJhdGVfY2IsICJ0b2dnbGVkIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKGFjY3VyYXRlX3RvZ2dsZWRfY2IpLCBpbmZvKTsKKworICBpbmZvLT5zbGlkZXIgPSBndGtfc2NhbGVfbmV3X3dpdGhfcmFuZ2UgKEdUS19PUklFTlRBVElPTl9IT1JJWk9OVEFMLAorICAgICAgMC4wLCAxLjAsIDAuMDAxKTsKKyAgZ3RrX2JveF9wYWNrX3N0YXJ0IChHVEtfQk9YICh2Ym94KSwgaW5mby0+c2xpZGVyLCBGQUxTRSwgRkFMU0UsIDYpOworICBnX3NpZ25hbF9jb25uZWN0IChpbmZvLT5zbGlkZXIsICJ2YWx1ZS1jaGFuZ2VkIiwKKyAgICAgIEdfQ0FMTEJBQ0sgKHNsaWRlcl9jYiksIGluZm8pOworICBnX3NpZ25hbF9jb25uZWN0IChpbmZvLT5zbGlkZXIsICJmb3JtYXQtdmFsdWUiLAorICAgICAgR19DQUxMQkFDSyAoc2xpZGVyX2Zvcm1hdF92YWx1ZV9jYiksIGluZm8pOworCisgIC8qIGFuZCBnbyEgKi8KKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChpbmZvLT5waXBlLCBHU1RfU1RBVEVfUEFVU0VEKTsKKworICBndGtfd2lkZ2V0X3Nob3dfYWxsIChpbmZvLT53aW4pOworICBndGtfd2lkZ2V0X2hpZGUgKGluZm8tPnNsaWRlcik7ICAgICAgIC8qIGhpZGUgdW50aWwgd2UncmUgcHJlcm9sbGVkICovCisgIGd0a19tYWluICgpOworCitkb25lOgorCisgIGdfZnJlZSAoaW5mbyk7Cit9CisKK3N0YXRpYyBnY2hhciAqKmZpbGVuYW1lcyA9IE5VTEw7CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBzdGF0aWMgY29uc3QgR09wdGlvbkVudHJ5IHRlc3RfZ29wdGlvbnNbXSA9IHsKKyAgICB7R19PUFRJT05fUkVNQUlOSU5HLCAwLCAwLCBHX09QVElPTl9BUkdfRklMRU5BTUVfQVJSQVksICZmaWxlbmFtZXMsIE5VTEx9LAorICAgIHtOVUxMLCAnXDAnLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMfQorICB9OworICBHT3B0aW9uQ29udGV4dCAqY3R4OworICBHRXJyb3IgKm9wdF9lcnIgPSBOVUxMOworCisgIGd0a19pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIC8qIGNvbW1hbmQgbGluZSBvcHRpb24gcGFyc2luZyAqLworICBjdHggPSBnX29wdGlvbl9jb250ZXh0X25ldyAoIiBWSURFT0ZJTEUiKTsKKyAgZ19vcHRpb25fY29udGV4dF9hZGRfZ3JvdXAgKGN0eCwgZ3N0X2luaXRfZ2V0X29wdGlvbl9ncm91cCAoKSk7CisgIGdfb3B0aW9uX2NvbnRleHRfYWRkX21haW5fZW50cmllcyAoY3R4LCB0ZXN0X2dvcHRpb25zLCBOVUxMKTsKKworICBpZiAoIWdfb3B0aW9uX2NvbnRleHRfcGFyc2UgKGN0eCwgJmFyZ2MsICZhcmd2LCAmb3B0X2VycikpIHsKKyAgICBnX2Vycm9yICgiRXJyb3IgcGFyc2luZyBjb21tYW5kIGxpbmUgb3B0aW9uczogJXMiLCBvcHRfZXJyLT5tZXNzYWdlKTsKKyAgICBnX29wdGlvbl9jb250ZXh0X2ZyZWUgKGN0eCk7CisgICAgZ19jbGVhcl9lcnJvciAoJm9wdF9lcnIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChmaWxlbmFtZXMgPT0gTlVMTCB8fCBmaWxlbmFtZXNbMF0gPT0gTlVMTCB8fCBmaWxlbmFtZXNbMF1bMF0gPT0gJ1wwJykgeworICAgIGdfcHJpbnRlcnIgKCJQbGVhc2Ugc3BlY2lmeSBhIHBhdGggdG8gYSB2aWRlbyBmaWxlXG5cbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJ1bl9ndWkgKGZpbGVuYW1lc1swXSk7CisKKyAgZ19mcmVlIChmaWxlbmFtZXMpOworICBnX29wdGlvbl9jb250ZXh0X2ZyZWUgKGN0eCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pY2xlcy9tZXNvbi5idWlsZCBiL3Rlc3RzL2ljbGVzL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Njk3MDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pY2xlcy9tZXNvbi5idWlsZApAQCAtMCwwICsxLDM4IEBACit0ZXN0cyA9IFsKKyAgWydlcXVhbGl6ZXItdGVzdCddLAorICBbJ3Rlc3QtYWNjdXJhdGUtc2VlaycsIGdzdGFwcF9kZXBdLAorICBbJ3Rlc3Qtc2VnbWVudC1zZWVrcyddLAorICBbJ3ZpZGVvY3JvcC10ZXN0J10sCisgIFsndmlkZW9ib3gtdGVzdCddLAorICBbJ3ZpZGVvY3JvcDItdGVzdCddLAorXQorCitndGtfZGVwID0gZGVwZW5kZW5jeSgnZ3RrKy0zLjAnLCB2ZXJzaW9uIDogJz49IDMuMC4wJywgcmVxdWlyZWQgOiBmYWxzZSkKK2lmIGd0a19kZXAuZm91bmQoKQorICB0ZXN0cyArPSBbCisgICAgWydnZGtwaXhidWZzaW5rLXRlc3QnLCBndGtfZGVwXSwKKyAgICBbJ2dka3BpeGJ1Zm92ZXJsYXktdGVzdCcsIFtnc3R2aWRlb19kZXAsIGd0a19kZXBdXSwKKyAgXQorZW5kaWYKKworaWYgY2RhdGEuaGFzKCdIQVZFX0dTVF9WNEwyJykKKyAgdGVzdHMgKz0gW1sndjRsMnNyYy10ZXN0JywgZ3N0dmlkZW9fZGVwXV0KK2VuZGlmCisKK2lmIGdldF92YXJpYWJsZSgnaGF2ZV9vc3M0JywgZmFsc2UpCisgIHRlc3RzICs9IFtbJ3Rlc3Qtb3NzNCddXQorZW5kaWYKKworaWYgZ2V0X3ZhcmlhYmxlKCd4MTFfZGVwJywgZGVwZW5kZW5jeSgnJywgcmVxdWlyZWQ6IGZhbHNlKSkuZm91bmQoKQorICB0ZXN0cyArPSBbWyd4aW1hZ2VzcmMtdGVzdCddXQorZW5kaWYKKworZm9yZWFjaCB0IDogdGVzdHMKKyAgdGVzdF9uYW1lID0gdC5nZXQoMCkKKyAgZXh0cmFfZGVwcyA9IHQuZ2V0KDEsIFtdKQorICBleGVjdXRhYmxlKHRlc3RfbmFtZSwgdGVzdF9uYW1lICsgJy5jJywKKyAgICBkZXBlbmRlbmNpZXM6IFtnc3RfZGVwLCBsaWJtLCBleHRyYV9kZXBzXSwKKyAgICBjX2FyZ3MgOiBnc3RfcGx1Z2luc19nb29kX2FyZ3MsCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyA6IFtjb25maWdpbmNdLAorICAgIGluc3RhbGw6IGZhbHNlKQorZW5kZm9yZWFjaApkaWZmIC0tZ2l0IGEvdGVzdHMvaWNsZXMvdGVzdC1hY2N1cmF0ZS1zZWVrLmMgYi90ZXN0cy9pY2xlcy90ZXN0LWFjY3VyYXRlLXNlZWsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDg5ZDVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaWNsZXMvdGVzdC1hY2N1cmF0ZS1zZWVrLmMKQEAgLTAsMCArMSwyOTkgQEAKKy8qIEdTdHJlYW1lciBpbnRlcmFjdGl2ZSB0ZXN0IGZvciBhY2N1cmF0ZSBzZWVraW5nCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIGNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBCYXNlZCBvbiBweXRob24gc2NyaXB0IGJ5IEtpYmVvbSBLaW0gPGtrYjExMEBnbWFpbC5jb20+CisgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKyNpbmNsdWRlIDxnc3QvYmFzZS9iYXNlLmg+CisjaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+CisjaW5jbHVkZSA8Z3N0L2FwcC9hcHAuaD4KKworI2RlZmluZSBTQU1QTEVfRlJFUSA0NDEwMAorCitzdGF0aWMgY29uc3QgZ3VpbnQ4ICoKK19tZW1tZW0gKGNvbnN0IGd1aW50OCAqIGhheXN0YWNrLCBnc2l6ZSBobGVuLCBjb25zdCBndWludDggKiBuZWVkbGUsIGdzaXplIG5sZW4pCit7CisgIGNvbnN0IGd1aW50OCAqcCA9IGhheXN0YWNrOworICBpbnQgbmVlZGxlX2ZpcnN0OworICBnc2l6ZSBwbGVuID0gaGxlbjsKKworICBpZiAoIW5sZW4pCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbmVlZGxlX2ZpcnN0ID0gKih1bnNpZ25lZCBjaGFyICopIG5lZWRsZTsKKworICB3aGlsZSAocGxlbiA+PSBubGVuICYmIChwID0gbWVtY2hyIChwLCBuZWVkbGVfZmlyc3QsIHBsZW4gLSBubGVuICsgMSkpKSB7CisgICAgaWYgKCFtZW1jbXAgKHAsIG5lZWRsZSwgbmxlbikpCisgICAgICByZXR1cm4gKGd1aW50OCAqKSBwOworCisgICAgcCsrOworICAgIHBsZW4gPSBobGVuIC0gKHAgLSBoYXlzdGFjayk7CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEdzdENsb2NrVGltZQorc2FtcGxlX3RvX25hbm90aW1lIChndWludCBzYW1wbGUpCit7CisgIHJldHVybiAoZ3VpbnQ2NCkgKCgxLjAgKiBzYW1wbGUgKiBHU1RfU0VDT05EIC8gU0FNUExFX0ZSRVEpICsgMC41KTsKK30KKworc3RhdGljIGd1aW50CituYW5vdGltZV90b19zYW1wbGUgKEdzdENsb2NrVGltZSBuYW5vdGltZSkKK3sKKyAgcmV0dXJuIGdzdF91dGlsX3VpbnQ2NF9zY2FsZV9yb3VuZCAobmFub3RpbWUsIFNBTVBMRV9GUkVRLCBHU1RfU0VDT05EKTsKK30KKworc3RhdGljIEdzdEJ1ZmZlciAqCitnZW5lcmF0ZV90ZXN0X2RhdGEgKGd1aW50IE4pCit7CisgIGdpbnQxNiAqbGVmdCwgKnJpZ2h0LCAqc3RlcmVvOworICBndWludCBsYXJnZU4sIGksIGo7CisKKyAgLyogMzI3NjcgPSAoMiAqKiAxNSkgLSAxICovCisgIC8qIDMyNzY4ID0gKDIgKiogMTUpICovCisgIGxhcmdlTiA9ICgoTiArIDMyNzY3KSAvIDMyNzY4KSAqIDMyNzY4OworICBsZWZ0ID0gZ19uZXcwIChnaW50MTYsIGxhcmdlTik7CisgIHJpZ2h0ID0gZ19uZXcwIChnaW50MTYsIGxhcmdlTik7CisgIHN0ZXJlbyA9IGdfbmV3MCAoZ2ludDE2LCAyICogbGFyZ2VOKTsKKworICBmb3IgKGkgPSAwOyBpIDwgKGxhcmdlTiAvIDMyNzY4KTsgKytpKSB7CisgICAgZ2ludCBjID0gMDsKKworICAgIGZvciAoaiA9IGkgKiAzMjc2ODsgaiA8ICgoaSArIDEpICogMzI3NjgpOyArK2opIHsKKyAgICAgIGxlZnRbal0gPSBpOworCisgICAgICBpZiAoaSAlIDIgPT0gMCkgeworICAgICAgICByaWdodFtqXSA9IGM7CisgICAgICB9IGVsc2UgeworICAgICAgICByaWdodFtqXSA9IDMyNzY3IC0gYzsKKyAgICAgIH0KKyAgICAgICsrYzsKKyAgICB9CisgIH0KKworICAvKiBjb3VsZCBqdXN0IGZpbGwgc3RlcmVvIGRpcmVjdGx5IGZyb20gdGhlIHN0YXJ0LCBidXQga2VlcGluZyBvcmlnaW5hbCBjb2RlIGZvciBub3cgKi8KKyAgZm9yIChpID0gMDsgaSA8IGxhcmdlTjsgKytpKSB7CisgICAgc3RlcmVvWygyICogaSkgKyAwXSA9IGxlZnRbaV07CisgICAgc3RlcmVvWygyICogaSkgKyAxXSA9IHJpZ2h0W2ldOworICB9CisgIGdfZnJlZSAobGVmdCk7CisgIGdfZnJlZSAocmlnaHQpOworCisgIHJldHVybiBnc3RfYnVmZmVyX25ld193cmFwcGVkIChzdGVyZW8sIDIgKiBsYXJnZU4gKiBzaXplb2YgKGdpbnQxNikpOworfQorCitzdGF0aWMgdm9pZAorZ2VuZXJhdGVfdGVzdF9zb3VuZCAoY29uc3QgZ2NoYXIgKiBmbiwgY29uc3QgZ2NoYXIgKiBsYXVuY2hfc3RyaW5nLAorICAgIGd1aW50IG51bV9zYW1wbGVzKQoreworICBHc3RFbGVtZW50ICpwaXBlbGluZSwgKnNyYywgKnBhcnNlLCAqZW5jX2JpbiwgKnNpbms7CisgIEdzdEZsb3dSZXR1cm4gZmxvdzsKKyAgR3N0TWVzc2FnZSAqbXNnOworICBHc3RCdWZmZXIgKmJ1ZjsKKyAgR3N0Q2FwcyAqY2FwczsKKworICBwaXBlbGluZSA9IGdzdF9waXBlbGluZV9uZXcgKE5VTEwpOworCisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImFwcHNyYyIsIE5VTEwpOworCisgIGNhcHMgPSBnc3RfY2Fwc19uZXdfc2ltcGxlICgiYXVkaW8veC1yYXciLAorICAgICAgImZvcm1hdCIsIEdfVFlQRV9TVFJJTkcsIEdTVF9BVURJT19ORSAoUzE2KSwKKyAgICAgICJyYXRlIiwgR19UWVBFX0lOVCwgU0FNUExFX0ZSRVEsICJjaGFubmVscyIsIEdfVFlQRV9JTlQsIDIsCisgICAgICAibGF5b3V0IiwgR19UWVBFX1NUUklORywgImludGVybGVhdmVkIiwKKyAgICAgICJjaGFubmVsLW1hc2siLCBHU1RfVFlQRV9CSVRNQVNLLCAoZ3VpbnQ2NCkgMywgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc3JjLCAiY2FwcyIsIGNhcHMsICJmb3JtYXQiLCBHU1RfRk9STUFUX1RJTUUsIE5VTEwpOworICBnc3RfYmFzZV9zcmNfc2V0X2Zvcm1hdCAoR1NUX0JBU0VfU1JDIChzcmMpLCBHU1RfRk9STUFUX1RJTUUpOworICBnc3RfY2Fwc191bnJlZiAoY2Fwcyk7CisKKyAgLyogYXVkaW9wYXJzZSB0byBwdXQgcHJvcGVyIHRpbWVzdGFtcHMgb24gYnVmZmVycyBmb3IgdXMsIHdpdGhvdXQgd2hpY2gKKyAgICogdm9yYmlzZW5jIGluIHBhcnRpY3VsYXIgaXMgdW5oYXBweSAob3Igb2dnbXV4LCByYXRoZXIpICovCisgIHBhcnNlID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgiYXVkaW9wYXJzZSIsIE5VTEwpOworICBpZiAocGFyc2UgIT0gTlVMTCkgeworICAgIGdfb2JqZWN0X3NldCAocGFyc2UsICJ1c2Utc2luay1jYXBzIiwgVFJVRSwgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgcGFyc2UgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJpZGVudGl0eSIsIE5VTEwpOworICAgIGdfd2FybmluZyAoImF1ZGlvcGFyc2UgZWxlbWVudCBub3QgYXZhaWxhYmxlLCB2b3JiaXMvb2dnIG1pZ2h0IG5vdCB3b3JrXG4iKTsKKyAgfQorCisgIGVuY19iaW4gPSBnc3RfcGFyc2VfYmluX2Zyb21fZGVzY3JpcHRpb24gKGxhdW5jaF9zdHJpbmcsIFRSVUUsIE5VTEwpOworCisgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJmaWxlc2luayIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHNpbmssICJsb2NhdGlvbiIsIGZuLCBOVUxMKTsKKworICBnc3RfYmluX2FkZF9tYW55IChHU1RfQklOIChwaXBlbGluZSksIHNyYywgcGFyc2UsIGVuY19iaW4sIHNpbmssIE5VTEwpOworCisgIGdzdF9lbGVtZW50X2xpbmtfbWFueSAoc3JjLCBwYXJzZSwgZW5jX2Jpbiwgc2luaywgTlVMTCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIGJ1ZiA9IGdlbmVyYXRlX3Rlc3RfZGF0YSAobnVtX3NhbXBsZXMpOworICBmbG93ID0gZ3N0X2FwcF9zcmNfcHVzaF9idWZmZXIgKEdTVF9BUFBfU1JDIChzcmMpLCBidWYpOworICBnX2Fzc2VydCAoZmxvdyA9PSBHU1RfRkxPV19PSyk7CisKKyAgZ3N0X2FwcF9zcmNfZW5kX29mX3N0cmVhbSAoR1NUX0FQUF9TUkMgKHNyYykpOworCisgIC8qZ19wcmludCAoImdlbmVyYXRpbmcgdGVzdCBzb3VuZCAlcywgd2FpdGluZyBmb3IgRU9TLi5cbiIsIGZuKTsgKi8KKworICBtc2cgPSBnc3RfYnVzX3RpbWVkX3BvcF9maWx0ZXJlZCAoR1NUX0VMRU1FTlRfQlVTIChwaXBlbGluZSksCisgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FLCBHU1RfTUVTU0FHRV9FT1MgfCBHU1RfTUVTU0FHRV9FUlJPUik7CisKKyAgZ19hc3NlcnQgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRU9TKTsKKyAgZ3N0X21lc3NhZ2VfdW5yZWYgKG1zZyk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisKKyAgLyogZ19wcmludCAoIkRvbmUgJXNcbiIsIGZuKTsgKi8KK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc2Vla19GT1JNQVRfVElNRV9ieV9zYW1wbGUgKGNvbnN0IGdjaGFyICogZm4sIEdMaXN0ICogc2Vla19wb3NpdGlvbnMpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lLCAqc3JjLCAqc2luazsKKyAgR3N0QWRhcHRlciAqYWRhcHRlcjsKKyAgR3N0U2FtcGxlICpzYW1wbGU7CisgIEdzdENhcHMgKmNhcHM7CisgIGdjb25zdHBvaW50ZXIgYW5zd2VyOworICBndWludCBhbnN3ZXJfc2l6ZTsKKworICBwaXBlbGluZSA9IGdzdF9wYXJzZV9sYXVuY2ggKCJmaWxlc3JjIG5hbWU9c3JjICEgZGVjb2RlYmluICEgIgorICAgICAgImF1ZGlvY29udmVydCBkaXRoZXJpbmc9MCAhIGFwcHNpbmsgbmFtZT1zaW5rIiwgTlVMTCk7CisKKyAgc3JjID0gZ3N0X2Jpbl9nZXRfYnlfbmFtZSAoR1NUX0JJTiAocGlwZWxpbmUpLCAic3JjIik7CisgIGdfb2JqZWN0X3NldCAoc3JjLCAibG9jYXRpb24iLCBmbiwgTlVMTCk7CisgIGdzdF9vYmplY3RfdW5yZWYgKHNyYyk7CisKKyAgc2luayA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBpcGVsaW5lKSwgInNpbmsiKTsKKyAgY2FwcyA9IGdzdF9jYXBzX25ld19zaW1wbGUgKCJhdWRpby94LXJhdyIsCisgICAgICAiZm9ybWF0IiwgR19UWVBFX1NUUklORywgR1NUX0FVRElPX05FIChTMTYpLAorICAgICAgInJhdGUiLCBHX1RZUEVfSU5ULCBTQU1QTEVfRlJFUSwgImNoYW5uZWxzIiwgR19UWVBFX0lOVCwgMiwgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoc2luaywgImNhcHMiLCBjYXBzLCAic3luYyIsIEZBTFNFLCBOVUxMKTsKKyAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZWxpbmUsIEdTVF9TVEFURV9QTEFZSU5HKTsKKworICAvKiB3YWl0IGZvciBwcmVyb2xsLCBzbyB3ZSBjYW4gc2VlayAqLworICBnc3RfYnVzX3RpbWVkX3BvcF9maWx0ZXJlZCAoR1NUX0VMRU1FTlRfQlVTIChwaXBlbGluZSksIEdTVF9DTE9DS19USU1FX05PTkUsCisgICAgICBHU1RfTUVTU0FHRV9BU1lOQ19ET05FKTsKKworICAvKiBmaXJzdCwgcmVhZCBlbnRpcmUgZmlsZSB0byBlbmQgKi8KKyAgYWRhcHRlciA9IGdzdF9hZGFwdGVyX25ldyAoKTsKKyAgd2hpbGUgKChzYW1wbGUgPSBnc3RfYXBwX3NpbmtfcHVsbF9zYW1wbGUgKEdTVF9BUFBfU0lOSyAoc2luaykpKSkgeworICAgIGdzdF9hZGFwdGVyX3B1c2ggKGFkYXB0ZXIsIGdzdF9idWZmZXJfcmVmIChnc3Rfc2FtcGxlX2dldF9idWZmZXIgKHNhbXBsZSkpKTsKKyAgICBnc3Rfc2FtcGxlX3VucmVmIChzYW1wbGUpOworICB9CisgIGFuc3dlcl9zaXplID0gZ3N0X2FkYXB0ZXJfYXZhaWxhYmxlIChhZGFwdGVyKTsKKyAgYW5zd2VyID0gZ3N0X2FkYXB0ZXJfbWFwIChhZGFwdGVyLCBhbnN3ZXJfc2l6ZSk7CisgIC8qIGdfcHJpbnQgKCIlczogcmVhZCAldSBieXRlc1xuIiwgZm4sIGFuc3dlcl9zaXplKTsgKi8KKworICBnX3ByaW50ICgiJTEwc1x0JTEwc1x0JTEwc1xuIiwgInJlcXVlc3RlZCIsICJzYW1wbGUgcGVyIHRzIiwgImFjdHVhbChkYXRhKSIpOworCisgIHdoaWxlIChzZWVrX3Bvc2l0aW9ucyAhPSBOVUxMKSB7CisgICAgZ2NvbnN0cG9pbnRlciBmb3VuZDsKKyAgICBHc3RNYXBJbmZvIG1hcDsKKyAgICBHc3RCdWZmZXIgKmJ1ZjsKKyAgICBnYm9vbGVhbiByZXQ7CisgICAgZ3VpbnQgYWN0dWFsX3Bvc2l0aW9uLCBidWZmZXJfdGltZXN0YW1wX3Bvc2l0aW9uOworICAgIGd1aW50IHNlZWtfc2FtcGxlOworCisgICAgc2Vla19zYW1wbGUgPSBHUE9JTlRFUl9UT19VSU5UIChzZWVrX3Bvc2l0aW9ucy0+ZGF0YSk7CisKKyAgICByZXQgPSBnc3RfZWxlbWVudF9zZWVrX3NpbXBsZSAocGlwZWxpbmUsIEdTVF9GT1JNQVRfVElNRSwKKyAgICAgICAgR1NUX1NFRUtfRkxBR19GTFVTSCB8IEdTVF9TRUVLX0ZMQUdfQUNDVVJBVEUsCisgICAgICAgIHNhbXBsZV90b19uYW5vdGltZSAoc2Vla19zYW1wbGUpKTsKKworICAgIGdfYXNzZXJ0IChyZXQpOworCisgICAgc2FtcGxlID0gZ3N0X2FwcF9zaW5rX3B1bGxfc2FtcGxlIChHU1RfQVBQX1NJTksgKHNpbmspKTsKKworICAgIGJ1ZiA9IGdzdF9zYW1wbGVfZ2V0X2J1ZmZlciAoc2FtcGxlKTsKKyAgICBnc3RfYnVmZmVyX21hcCAoYnVmLCAmbWFwLCBHU1RfTUFQX1JFQUQpOworICAgIEdTVF9NRU1EVU1QICgiYW5zd2VyIiwgYW5zd2VyLCBhbnN3ZXJfc2l6ZSk7CisgICAgR1NUX01FTURVTVAgKCJidWZmZXIiLCBtYXAuZGF0YSwgbWFwLnNpemUpOworICAgIGZvdW5kID0gX21lbW1lbSAoYW5zd2VyLCBhbnN3ZXJfc2l6ZSwgbWFwLmRhdGEsIG1hcC5zaXplKTsKKyAgICBnc3RfYnVmZmVyX3VubWFwIChidWYsICZtYXApOworCisgICAgZ19hc3NlcnQgKGZvdW5kICE9IE5VTEwpOworICAgIGFjdHVhbF9wb3NpdGlvbiA9ICgoZ29mZnNldCkgKChndWludDggKikgZm91bmQgLSAoZ3VpbnQ4ICopIGFuc3dlcikpIC8gNDsKKyAgICBidWZmZXJfdGltZXN0YW1wX3Bvc2l0aW9uID0gbmFub3RpbWVfdG9fc2FtcGxlIChHU1RfQlVGRkVSX1BUUyAoYnVmKSk7CisgICAgZ19wcmludCAoIiUxMHVcdCUxMHVcdCUxMHVcbiIsIHNlZWtfc2FtcGxlLCBidWZmZXJfdGltZXN0YW1wX3Bvc2l0aW9uLAorICAgICAgICBhY3R1YWxfcG9zaXRpb24pOworICAgIGdzdF9zYW1wbGVfdW5yZWYgKHNhbXBsZSk7CisKKyAgICBzZWVrX3Bvc2l0aW9ucyA9IHNlZWtfcG9zaXRpb25zLT5uZXh0OworICB9CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChzaW5rKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworICBnX29iamVjdF91bnJlZiAoYWRhcHRlcik7Cit9CisKK3N0YXRpYyBHTGlzdCAqCitjcmVhdGVfdGVzdF9zYW1wbGVzIChndWludCBmcm9tLCBndWludCB0bywgZ3VpbnQgc3RlcCkKK3sKKyAgR1F1ZXVlIHEgPSBHX1FVRVVFX0lOSVQ7CisgIGd1aW50IGk7CisKKyAgZm9yIChpID0gZnJvbTsgaSA8IHRvOyBpICs9IHN0ZXApCisgICAgZ19xdWV1ZV9wdXNoX3RhaWwgKCZxLCBHVUlOVF9UT19QT0lOVEVSIChpKSk7CisKKyAgcmV0dXJuIHEuaGVhZDsKK30KKworI2RlZmluZSBTRUNTIDEwCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBHTGlzdCAqdGVzdF9zYW1wbGVzOworCisgIGdzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIHRlc3Rfc2FtcGxlcyA9IGNyZWF0ZV90ZXN0X3NhbXBsZXMgKFNBTVBMRV9GUkVRLCBTQU1QTEVfRlJFUSAqIDIsIDUwMDApOworCisgIGdfcHJpbnQgKCJcbndhdjpcbiIpOworICBnZW5lcmF0ZV90ZXN0X3NvdW5kICgidGVzdC53YXYiLCAid2F2ZW5jIiwgU0FNUExFX0ZSRVEgKiBTRUNTKTsKKyAgdGVzdF9zZWVrX0ZPUk1BVF9USU1FX2J5X3NhbXBsZSAoInRlc3Qud2F2IiwgdGVzdF9zYW1wbGVzKTsKKworICBnX3ByaW50ICgiXG5mbGFjOlxuIik7CisgIGdlbmVyYXRlX3Rlc3Rfc291bmQgKCJ0ZXN0LmZsYWMiLCAiZmxhY2VuYyIsIFNBTVBMRV9GUkVRICogU0VDUyk7CisgIHRlc3Rfc2Vla19GT1JNQVRfVElNRV9ieV9zYW1wbGUgKCJ0ZXN0LmZsYWMiLCB0ZXN0X3NhbXBsZXMpOworCisgIGdfcHJpbnQgKCJcbm9nZzpcbiIpOworICBnZW5lcmF0ZV90ZXN0X3NvdW5kICgidGVzdC5vZ2ciLAorICAgICAgImF1ZGlvY29udmVydCBkaXRoZXJpbmc9MCAhIHZvcmJpc2VuYyBxdWFsaXR5PTEgISBvZ2dtdXgiLAorICAgICAgU0FNUExFX0ZSRVEgKiBTRUNTKTsKKyAgdGVzdF9zZWVrX0ZPUk1BVF9USU1FX2J5X3NhbXBsZSAoInRlc3Qub2dnIiwgdGVzdF9zYW1wbGVzKTsKKworICBnX3ByaW50ICgiXG5tcDM6XG4iKTsKKyAgZ2VuZXJhdGVfdGVzdF9zb3VuZCAoInRlc3QubXAzIiwgImxhbWVtcDNlbmMgYml0cmF0ZT0zMjAiLAorICAgICAgU0FNUExFX0ZSRVEgKiBTRUNTKTsKKyAgdGVzdF9zZWVrX0ZPUk1BVF9USU1FX2J5X3NhbXBsZSAoInRlc3QubXAzIiwgdGVzdF9zYW1wbGVzKTsKKworICBnX2xpc3RfZnJlZSAodGVzdF9zYW1wbGVzKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pY2xlcy90ZXN0LW9zczQuYyBiL3Rlc3RzL2ljbGVzL3Rlc3Qtb3NzNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYmU0NDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pY2xlcy90ZXN0LW9zczQuYwpAQCAtMCwwICsxLDEyOCBAQAorLyogR1N0cmVhbWVyIE9TUzQgYXVkaW8gdGVzdHMKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBuZXQ+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyogRklYTUUgMC4xMTogc3VwcHJlc3Mgd2FybmluZ3MgZm9yIGRlcHJlY2F0ZWQgQVBJIHN1Y2ggYXMgR1ZhbHVlQXJyYXkKKyAqIHdpdGggbmV3ZXIgR0xpYiB2ZXJzaW9ucyAoPj0gMi4zMS4wKSAqLworI2RlZmluZSBHTElCX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK3N0YXRpYyBnYm9vbGVhbiBvcHRfc2hvd19taXhlcl9tZXNzYWdlcyA9IEZBTFNFOworCisjZGVmaW5lIFdBSVRfVElNRSAgNjAuMCAgICAgICAgIC8qIGluIHNlY29uZHMgKi8KKworc3RhdGljIHZvaWQKK3Byb2JlX3BhZCAoR3N0RWxlbWVudCAqIGVsZW1lbnQsIGNvbnN0IGdjaGFyICogcGFkX25hbWUpCit7CisgIEdzdENhcHMgKmNhcHMgPSBOVUxMOworICBHc3RQYWQgKnBhZDsKKyAgZ3VpbnQgaTsKKworICBwYWQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGljX3BhZCAoZWxlbWVudCwgcGFkX25hbWUpOworICBpZiAocGFkID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGNhcHMgPSBnc3RfcGFkX3F1ZXJ5X2NhcHMgKHBhZCwgTlVMTCk7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKGNhcHMgIT0gTlVMTCk7CisKKyAgZm9yIChpID0gMDsgaSA8IGdzdF9jYXBzX2dldF9zaXplIChjYXBzKTsgKytpKSB7CisgICAgZ2NoYXIgKnM7CisKKyAgICBzID0gZ3N0X3N0cnVjdHVyZV90b19zdHJpbmcgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGNhcHMsIGkpKTsKKyAgICBnX3ByaW50ICgiICAlNHNbJWRdOiAlc1xuIiwgR1NUX1BBRF9OQU1FIChwYWQpLCBpLCBzKTsKKyAgICBnX2ZyZWUgKHMpOworICB9CisgIGdzdF9jYXBzX3VucmVmIChjYXBzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGFkKTsKK30KKworc3RhdGljIHZvaWQKK3Byb2JlX2RldGFpbHMgKEdzdEVsZW1lbnQgKiBlbGVtZW50KQoreworICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXQ7CisKKyAgcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfUkVBRFkpOworICBpZiAocmV0ID09IEdTVF9TVEFURV9DSEFOR0VfRkFJTFVSRSkgeworICAgIGdfcHJpbnQgKCJDb3VsZCBub3Qgc2V0IGVsZW1lbnQgJXMgdG8gUkVBRFkuIiwgR1NUX0VMRU1FTlRfTkFNRSAoZWxlbWVudCkpOworICAgIHJldHVybjsKKyAgfQorCisgIHByb2JlX3BhZCAoZWxlbWVudCwgInNpbmsiKTsKKyAgcHJvYmVfcGFkIChlbGVtZW50LCAic3JjIik7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChlbGVtZW50LCBHU1RfU1RBVEVfTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9iZV9lbGVtZW50IChjb25zdCBnY2hhciAqIG5hbWUpCit7CisgIEdzdEVsZW1lbnQgKmVsZW1lbnQ7CisgIGdjaGFyICpkZXZuYW1lID0gTlVMTDsKKworICBlbGVtZW50ID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlIChuYW1lLCBuYW1lKTsKKworICAvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgZGVhZGxvY2sgb24gR1NUX0VMRU1FTlRfRVJST1Igb3IgZG8gb3RoZXIgc2lsbHkgdGhpbmdzCisgICAqIGlmIHdlIHRyeSB0byBxdWVyeSB0aGUgImRldmljZS1uYW1lIiBwcm9wZXJ0eSB3aGVuIHRoZSBkZXZpY2UgaXNuJ3Qgb3BlbiAqLworICBnX29iamVjdF9zZXQgKGVsZW1lbnQsICJkZXZpY2UiLCAiL2Rldi9kb2VzL25vdC9leGlzdCIsIE5VTEwpOworICBnX29iamVjdF9nZXQgKGVsZW1lbnQsICJkZXZpY2UtbmFtZSIsICZkZXZuYW1lLCBOVUxMKTsKKyAgR1NUX0xPRyAoImRldm5hbWU6ICclcyciLCBHU1RfU1RSX05VTEwgKGRldm5hbWUpKTsKKyAgZ19hc3NlcnQgKGRldm5hbWUgPT0gTlVMTCB8fCAqZGV2bmFtZSA9PSAnXDAnKTsKKworICAvKiBhbmQgbm93IGZvciByZWFsICovCisKKyAgcHJvYmVfZGV0YWlscyAoZWxlbWVudCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoZWxlbWVudCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBHT3B0aW9uRW50cnkgb3B0aW9uc1tdID0geworICAgIHsic2hvdy1taXhlci1tZXNzYWdlcyIsICdtJywgMCwgR19PUFRJT05fQVJHX05PTkUsICZvcHRfc2hvd19taXhlcl9tZXNzYWdlcywKKyAgICAgICAgIkZvciBtaXhlciBlbGVtZW50cywgd2FpdCA2MCBzZWNvbmRzIGFuZCBzaG93IGFueSBtaXhlciBtZXNzYWdlcyAiCisgICAgICAgICAgIihmb3IgZGVidWdnaW5nIGF1dG8tbm90aWZpY2F0aW9ucykiLCBOVUxMfSwKKyAgICB7TlVMTCx9CisgIH07CisgIEdPcHRpb25Db250ZXh0ICpjdHg7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICBjdHggPSBnX29wdGlvbl9jb250ZXh0X25ldyAoIiIpOworICBnX29wdGlvbl9jb250ZXh0X2FkZF9tYWluX2VudHJpZXMgKGN0eCwgb3B0aW9ucywgTlVMTCk7CisgIGdfb3B0aW9uX2NvbnRleHRfYWRkX2dyb3VwIChjdHgsIGdzdF9pbml0X2dldF9vcHRpb25fZ3JvdXAgKCkpOworICBpZiAoIWdfb3B0aW9uX2NvbnRleHRfcGFyc2UgKGN0eCwgJmFyZ2MsICZhcmd2LCAmZXJyKSkgeworICAgIGdfcHJpbnQgKCJFcnJvciBpbml0aWFsaXppbmc6ICVzXG4iLCBlcnItPm1lc3NhZ2UpOworICAgIGdfb3B0aW9uX2NvbnRleHRfZnJlZSAoY3R4KTsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICBleGl0ICgxKTsKKyAgfQorICBnX29wdGlvbl9jb250ZXh0X2ZyZWUgKGN0eCk7CisKKyAgcHJvYmVfZWxlbWVudCAoIm9zczRzaW5rIik7CisgIHByb2JlX2VsZW1lbnQgKCJvc3M0c3JjIik7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pY2xlcy90ZXN0LXNlZ21lbnQtc2Vla3MuYyBiL3Rlc3RzL2ljbGVzL3Rlc3Qtc2VnbWVudC1zZWVrcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOWI2NzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pY2xlcy90ZXN0LXNlZ21lbnQtc2Vla3MuYwpAQCAtMCwwICsxLDE0NiBAQAorLyogR1N0cmVhbWVyIGludGVyYWN0aXZlIHRlc3QgZm9yIGFjY3VyYXRlIHNlZ21lbnQgc2Vla2luZworICogQ29weXJpZ2h0IChDKSAyMDE0IFRpbS1QaGlsaXBwIE3DvGxsZXIgPHRpbSBjZW50cmljdWxhciBjb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKy8qIFBsYXlzIHRoZSBwcm92aWRlZCBmaWxlIG9uZSBzZWNvbmQgYXQgYSB0aW1lIHVzaW5nIHNlZ21lbnQgc2Vla3MuCisgKiBUaGVvcmV0aWNhbGx5IHRoaXMgc2hvdWxkIGJlIGp1c3QgYXMgc21vb3RoIGFzIGlmIHdlIHBsYXllZCB0aGUKKyAqIGZpbGUgZnJvbSBzdGFydCB0byBzdG9wIGluIG9uZSBnbywgY2VydGFpbmx5IHdpdGhvdXQgaGlja3Vwcy4KKyAqLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworI2RlZmluZSBTRUdNRU5UX0RVUkFUSU9OICgxICogR1NUX1NFQ09ORCkKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIEdzdEVsZW1lbnQgKnBsYXliaW47CisgIEdzdE1lc3NhZ2UgKm1zZzsKKyAgZ2NoYXIgKnVyaTsKKyAgZ2ludDY0IGR1ciwgc3RhcnQsIHN0b3A7CisgIGdib29sZWFuIHByZXJvbGxlZCA9IEZBTFNFOworCisgIGlmIChhcmdjIDwgMikgeworICAgIGdfcHJpbnRlcnIgKCJVc2FnZTogJXMgRklMRU5BTUVcbiIsIGFyZ3ZbMF0pOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGdzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIGlmIChnc3RfdXJpX2lzX3ZhbGlkIChhcmd2WzFdKSkKKyAgICB1cmkgPSBnX3N0cmR1cCAoYXJndlsxXSk7CisgIGVsc2UKKyAgICB1cmkgPSBnc3RfZmlsZW5hbWVfdG9fdXJpIChhcmd2WzFdLCBOVUxMKTsKKworICBnX3ByaW50ICgidXJpOiAlc1xuIiwgdXJpKTsKKworICBwbGF5YmluID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgicGxheWJpbiIsIE5VTEwpOworICBnX29iamVjdF9zZXQgKHBsYXliaW4sICJ1cmkiLCB1cmksIE5VTEwpOworCisjaWYgMAorICB7CisgICAgR3N0RWxlbWVudCAqc3JjOworCisgICAgcGxheWJpbiA9IGdzdF9wYXJzZV9sYXVuY2ggKCJ1cmlkZWNvZGViaW4gbmFtZT1kICEgcXVldWUgISAiCisgICAgICAgICJmaWxlc2luayBsb2NhdGlvbj0vdG1wL3JhdzEuZGF0YSIsIE5VTEwpOworICAgIHNyYyA9IGdzdF9iaW5fZ2V0X2J5X25hbWUgKEdTVF9CSU4gKHBsYXliaW4pLCAiZCIpOworICAgIGdfb2JqZWN0X3NldCAoc3JjLCAidXJpIiwgdXJpLCBOVUxMKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChzcmMpOworICB9CisjZW5kaWYKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBsYXliaW4sIEdTVF9TVEFURV9QQVVTRUQpOworCisgIC8qIHdhaXQgZm9yIHByZXJvbGwgKi8KKyAgbXNnID0gZ3N0X2J1c190aW1lZF9wb3BfZmlsdGVyZWQgKEdTVF9FTEVNRU5UX0JVUyAocGxheWJpbiksCisgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FLCBHU1RfTUVTU0FHRV9BU1lOQ19ET05FIHwgR1NUX01FU1NBR0VfRVJST1IpOworCisgIGdfYXNzZXJ0IChHU1RfTUVTU0FHRV9UWVBFIChtc2cpICE9IEdTVF9NRVNTQUdFX0VSUk9SKTsKKyAgcHJlcm9sbGVkID0gVFJVRTsKKworICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKworICBpZiAoIWdzdF9lbGVtZW50X3F1ZXJ5X2R1cmF0aW9uIChwbGF5YmluLCBHU1RfRk9STUFUX1RJTUUsICZkdXIpKQorICAgIGdfZXJyb3IgKCJGYWlsZWQgdG8gcXVlcnkgZHVyYXRpb24hXG4iKTsKKworICBnX3ByaW50ICgiRHVyYXRpb246ICUiIEdTVF9USU1FX0ZPUk1BVCAiXG4iLCBHU1RfVElNRV9BUkdTIChkdXIpKTsKKworICBzdGFydCA9IDA7CisgIGRvIHsKKyAgICBHc3RTZWVrRmxhZ3Mgc2Vla19mbGFnczsKKyAgICBnYm9vbGVhbiByZXQ7CisgICAgZ2Jvb2xlYW4gc2VnbWVudF9kb25lID0gRkFMU0U7CisKKyAgICBzZWVrX2ZsYWdzID0gR1NUX1NFRUtfRkxBR19BQ0NVUkFURSB8IEdTVF9TRUVLX0ZMQUdfU0VHTUVOVDsKKworICAgIGlmIChzdGFydCA9PSAwKSB7CisgICAgICBwcmVyb2xsZWQgPSBGQUxTRTsKKyAgICAgIHNlZWtfZmxhZ3MgfD0gR1NUX1NFRUtfRkxBR19GTFVTSDsKKyAgICB9CisKKyAgICBzdG9wID0gc3RhcnQgKyBTRUdNRU5UX0RVUkFUSU9OOworCisgICAgZ19wcmludCAoIlNlZ21lbnQ6ICUiIEdTVF9USU1FX0ZPUk1BVCAiLSUiIEdTVF9USU1FX0ZPUk1BVCAiXG4iLAorICAgICAgICBHU1RfVElNRV9BUkdTIChzdGFydCksIEdTVF9USU1FX0FSR1MgKHN0b3ApKTsKKworICAgIHJldCA9IGdzdF9lbGVtZW50X3NlZWsgKHBsYXliaW4sIDEuMCwgR1NUX0ZPUk1BVF9USU1FLCBzZWVrX2ZsYWdzLAorICAgICAgICBHU1RfU0VFS19UWVBFX1NFVCwgc3RhcnQsIEdTVF9TRUVLX1RZUEVfU0VULCBzdG9wKTsKKworICAgIGdfYXNzZXJ0IChyZXQpOworCisgICAgaWYgKCFwcmVyb2xsZWQpIHsKKyAgICAgIHdoaWxlICghcHJlcm9sbGVkKSB7CisgICAgICAgIC8qIHdhaXQgZm9yIHByZXJvbGwgYWdhaW4gKi8KKyAgICAgICAgbXNnID0gZ3N0X2J1c190aW1lZF9wb3BfZmlsdGVyZWQgKEdTVF9FTEVNRU5UX0JVUyAocGxheWJpbiksCisgICAgICAgICAgICBHU1RfQ0xPQ0tfVElNRV9OT05FLCBHU1RfTUVTU0FHRV9TRUdNRU5UX0RPTkUgfAorICAgICAgICAgICAgR1NUX01FU1NBR0VfQVNZTkNfRE9ORSB8IEdTVF9NRVNTQUdFX0VSUk9SKTsKKworICAgICAgICBnX2Fzc2VydCAoR1NUX01FU1NBR0VfVFlQRSAobXNnKSAhPSBHU1RfTUVTU0FHRV9FUlJPUik7CisgICAgICAgIGlmIChHU1RfTUVTU0FHRV9UWVBFIChtc2cpID09IEdTVF9NRVNTQUdFX1NFR01FTlRfRE9ORSkgeworICAgICAgICAgIHNlZ21lbnRfZG9uZSA9IFRSVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJlcm9sbGVkID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKyAgICAgIH0KKworICAgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwbGF5YmluLCBHU1RfU1RBVEVfUExBWUlORyk7CisgICAgfQorCisgICAgLyogd2FpdCBmb3IgZW5kIG9mIHNlZ21lbnQgaWYgd2UgZGlkbid0IGdldCBpdCBhYm92ZSBhbHJlYWR5ICovCisgICAgaWYgKCFzZWdtZW50X2RvbmUpIHsKKyAgICAgIG1zZyA9IGdzdF9idXNfdGltZWRfcG9wX2ZpbHRlcmVkIChHU1RfRUxFTUVOVF9CVVMgKHBsYXliaW4pLAorICAgICAgICAgIEdTVF9DTE9DS19USU1FX05PTkUsIEdTVF9NRVNTQUdFX1NFR01FTlRfRE9ORSB8IEdTVF9NRVNTQUdFX0VSUk9SKTsKKworICAgICAgZ19hc3NlcnQgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgIT0gR1NUX01FU1NBR0VfRVJST1IpOworCisgICAgICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKyAgICB9CisKKyAgICBzdGFydCA9IHN0b3A7CisgIH0KKyAgd2hpbGUgKHN0YXJ0IDwgZHVyKTsKKworICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBsYXliaW4sIEdTVF9TVEFURV9OVUxMKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGxheWJpbik7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaWNsZXMvdjRsMnNyYy10ZXN0LmMgYi90ZXN0cy9pY2xlcy92NGwyc3JjLXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTYyZTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaWNsZXMvdjRsMnNyYy10ZXN0LmMKQEAgLTAsMCArMSw1MTQgQEAKKy8qIEdTdHJlYW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBFZGdhcmQgTGltYSA8ZWRnYXJkIGRvdCBsaW1hIGF0IGluZHQgZG90IG9yZyBkb3QgYnI+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL2NvbG9yYmFsYW5jZS5oPgorI2luY2x1ZGUgPGdzdC92aWRlby92aWRlb29yaWVudGF0aW9uLmg+CisKK0dzdEVsZW1lbnQgKnBpcGVsaW5lLCAqc291cmNlLCAqc2luazsKK0dNYWluTG9vcCAqbG9vcDsKK3ZvbGF0aWxlIGludCBleGl0X3JlYWQgPSAwOworCitzdGF0aWMgdm9pZAorcHJpbnRfb3B0aW9ucyAodm9pZCkKK3sKKyAgcHJpbnRmICgiXG5mIC0gdG8gY2hhbmdlIHRoZSBmZXF1ZW5jeVxuIik7CisgIHByaW50ZiAoImkgLSB0byBjaGFuZ2UgdGhlIGlucHV0XG4iKTsKKyAgcHJpbnRmICgibiAtIHRvIGNoYW5nZSB0aGUgbm9ybVxuIik7CisgIHByaW50ZiAoImMgLSBsaXN0IGNvbG9yIGJhbGFuY2VcbiIpOworICBwcmludGYgKCJ2IC0gY2hhbmdlIHZpZGVvIG9yaWVudGFyaW9uXG4iKTsKKyAgcHJpbnRmICgiZSAtIHRvIGV4aXRcbiIpOworfQorCitzdGF0aWMgdm9pZAorcnVuX29wdGlvbnMgKGNoYXIgb3B0KQoreworICBpbnQgcmVzOworCisgIHN3aXRjaCAob3B0KSB7CisjaWYgMAorICAgIGNhc2UgJ2YnOgorICAgIHsKKyAgICAgIEdzdFR1bmVyICp0dW5lciA9IEdTVF9UVU5FUiAoc291cmNlKTsKKyAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbDsKKyAgICAgIGd1aW50IGZyZXE7CisKKyAgICAgIGNoYW5uZWwgPSBnc3RfdHVuZXJfZ2V0X2NoYW5uZWwgKHR1bmVyKTsKKworICAgICAgZnJlcSA9IGdzdF90dW5lcl9nZXRfZnJlcXVlbmN5ICh0dW5lciwgY2hhbm5lbCk7CisKKyAgICAgIHByaW50ZiAoIlxudHlwZSB0aGUgbmV3IGZyZXF1ZW5jeSAoY3VycmVudCA9ICV1KSAoLTEgdG8gY2FuY2VsKTogIiwgZnJlcSk7CisgICAgICByZXMgPSBzY2FuZiAoIiV1IiwgJmZyZXEpOworICAgICAgaWYgKHJlcyAhPSAxIHx8IGZyZXEgIT0gLTEpCisgICAgICAgIGdzdF90dW5lcl9zZXRfZnJlcXVlbmN5ICh0dW5lciwgY2hhbm5lbCwgZnJlcSk7CisgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnbic6CisgICAgeworICAgICAgR3N0VHVuZXIgKnR1bmVyID0gR1NUX1RVTkVSIChzb3VyY2UpOworICAgICAgY29uc3QgR0xpc3QgKml0ZW0sICpsaXN0OworICAgICAgY29uc3QgR3N0VHVuZXJOb3JtICpjdXJyZW50X25vcm07CisgICAgICBHc3RUdW5lck5vcm0gKm5vcm0gPSBOVUxMOworICAgICAgZ2ludCBpbmRleCwgbmV4dF9ub3JtOworCisKKyAgICAgIGxpc3QgPSBnc3RfdHVuZXJfbGlzdF9ub3JtcyAodHVuZXIpOworCisgICAgICBjdXJyZW50X25vcm0gPSBnc3RfdHVuZXJfZ2V0X25vcm0gKHR1bmVyKTsKKworICAgICAgcHJpbnRmICgiXG5saXN0IG9mIG5vcm1zOlxuIik7CisgICAgICBmb3IgKGl0ZW0gPSBsaXN0LCBpbmRleCA9IDA7IGl0ZW0gIT0gTlVMTDsgaXRlbSA9IGl0ZW0tPm5leHQsICsraW5kZXgpIHsKKyAgICAgICAgbm9ybSA9IGl0ZW0tPmRhdGE7CisgICAgICAgIGlmIChjdXJyZW50X25vcm0gPT0gbm9ybSkgeworICAgICAgICAgIHByaW50ZiAoIiAqICV1IC0gJXNcbiIsIGluZGV4LCBub3JtLT5sYWJlbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRmICgiICAgJXUgLSAlc1xuIiwgaW5kZXgsIG5vcm0tPmxhYmVsKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcHJpbnRmICgiXG50eXBlIHRoZSBudW1iZXIgb2Ygbm9ybSB5b3Ugd2FudCAoLTEgdG8gY2FuY2VsKTogIik7CisgICAgICByZXMgPSBzY2FuZiAoIiVkIiwgJm5leHRfbm9ybSk7CisgICAgICBpZiAocmVzICE9IDEgfHwgbmV4dF9ub3JtIDwgMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChpbmRleCA8PSBuZXh0X25vcm0pIHsKKyAgICAgICAgcHJpbnRmICgiTm9ybSAlZCBub3QgYXZhaWxhYmxlXG4iLCBuZXh0X25vcm0pOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGZvciAoaXRlbSA9IGxpc3QsIGluZGV4ID0gMDsgaXRlbSAhPSBOVUxMICYmIGluZGV4IDw9IG5leHRfbm9ybTsKKyAgICAgICAgICBpdGVtID0gaXRlbS0+bmV4dCwgKytpbmRleCkgeworICAgICAgICBub3JtID0gaXRlbS0+ZGF0YTsKKyAgICAgIH0KKyAgICAgIGlmIChub3JtKQorICAgICAgICBnc3RfdHVuZXJfc2V0X25vcm0gKHR1bmVyLCBub3JtKTsKKyAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdpJzoKKyAgICB7CisgICAgICBHc3RUdW5lciAqdHVuZXIgPSBHU1RfVFVORVIgKHNvdXJjZSk7CisgICAgICBjb25zdCBHTGlzdCAqaXRlbSwgKmxpc3Q7CisgICAgICBjb25zdCBHc3RUdW5lckNoYW5uZWwgKmN1cnJlbnRfY2hhbm5lbDsKKyAgICAgIEdzdFR1bmVyQ2hhbm5lbCAqY2hhbm5lbCA9IE5VTEw7CisgICAgICBnaW50IGluZGV4LCBuZXh0X2NoYW5uZWw7CisKKworICAgICAgbGlzdCA9IGdzdF90dW5lcl9saXN0X2NoYW5uZWxzICh0dW5lcik7CisKKyAgICAgIGN1cnJlbnRfY2hhbm5lbCA9IGdzdF90dW5lcl9nZXRfY2hhbm5lbCAodHVuZXIpOworCisgICAgICBwcmludGYgKCJcbmxpc3Qgb2YgaW5wdXRzOlxuIik7CisgICAgICBmb3IgKGl0ZW0gPSBsaXN0LCBpbmRleCA9IDA7IGl0ZW0gIT0gTlVMTDsgaXRlbSA9IGl0ZW0tPm5leHQsICsraW5kZXgpIHsKKyAgICAgICAgY2hhbm5lbCA9IGl0ZW0tPmRhdGE7CisgICAgICAgIGlmIChjdXJyZW50X2NoYW5uZWwgPT0gY2hhbm5lbCkgeworICAgICAgICAgIHByaW50ZiAoIiAqICV1IC0gJXNcbiIsIGluZGV4LCBjaGFubmVsLT5sYWJlbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRmICgiICAgJXUgLSAlc1xuIiwgaW5kZXgsIGNoYW5uZWwtPmxhYmVsKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcHJpbnRmICgiXG50eXBlIHRoZSBudW1iZXIgb2YgaW5wdXQgeW91IHdhbnQgKC0xIHRvIGNhbmNlbCk6ICIpOworICAgICAgcmVzID0gc2NhbmYgKCIlZCIsICZuZXh0X2NoYW5uZWwpOworICAgICAgaWYgKHJlcyAhPSAxIHx8IG5leHRfY2hhbm5lbCA8IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoaW5kZXggPD0gbmV4dF9jaGFubmVsKSB7CisgICAgICAgIHByaW50ZiAoIklucHV0ICVkIG5vdCBhdmFpbGFibGVcbiIsIG5leHRfY2hhbm5lbCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZm9yIChpdGVtID0gbGlzdCwgaW5kZXggPSAwOyBpdGVtICE9IE5VTEwgJiYgaW5kZXggPD0gbmV4dF9jaGFubmVsOworICAgICAgICAgIGl0ZW0gPSBpdGVtLT5uZXh0LCArK2luZGV4KSB7CisgICAgICAgIGNoYW5uZWwgPSBpdGVtLT5kYXRhOworICAgICAgfQorICAgICAgaWYgKGNoYW5uZWwpCisgICAgICAgIGdzdF90dW5lcl9zZXRfY2hhbm5lbCAodHVuZXIsIGNoYW5uZWwpOworICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSAnZSc6CisgICAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGVsaW5lLCBHU1RfU1RBVEVfTlVMTCk7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIHByaW50ZiAoIkJ5ZVxuIik7CisgICAgICBnX3RocmVhZF9leGl0ICgwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2MnOgorICAgIHsKKyAgICAgIEdzdENvbG9yQmFsYW5jZSAqYmFsYW5jZSA9IEdTVF9DT0xPUl9CQUxBTkNFIChzb3VyY2UpOworICAgICAgY29uc3QgR0xpc3QgKmNvbnRyb2xzOworICAgICAgR3N0Q29sb3JCYWxhbmNlQ2hhbm5lbCAqY2hhbm5lbDsKKyAgICAgIGNvbnN0IEdMaXN0ICppdGVtOworICAgICAgZ2ludCBpbmRleCwgbmV3X3ZhbHVlOworCisgICAgICBjb250cm9scyA9IGdzdF9jb2xvcl9iYWxhbmNlX2xpc3RfY2hhbm5lbHMgKGJhbGFuY2UpOworCisgICAgICBwcmludGYgKCJcbiIpOworCisgICAgICBpZiAoY29udHJvbHMgPT0gTlVMTCkgeworICAgICAgICBwcmludGYgKCJUaGVyZSBpcyBubyBsaXN0IG9mIGNvbG9yYmFsYW5jZSBjb250cm9sc1xuIik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbnRyb2xzKSB7CisgICAgICAgIHByaW50ZiAoImxpc3Qgb2YgY29udHJvbHM6XG4iKTsKKyAgICAgICAgZm9yIChpdGVtID0gY29udHJvbHMsIGluZGV4ID0gMDsgaXRlbSAhPSBOVUxMOworICAgICAgICAgICAgaXRlbSA9IGl0ZW0tPm5leHQsICsraW5kZXgpIHsKKyAgICAgICAgICBjaGFubmVsID0gaXRlbS0+ZGF0YTsKKyAgICAgICAgICBwcmludGYgKCIgICAldSAtICVzICglZCAtICVkKSA9ICVkXG4iLCBpbmRleCwgY2hhbm5lbC0+bGFiZWwsCisgICAgICAgICAgICAgIGNoYW5uZWwtPm1pbl92YWx1ZSwgY2hhbm5lbC0+bWF4X3ZhbHVlLAorICAgICAgICAgICAgICBnc3RfY29sb3JfYmFsYW5jZV9nZXRfdmFsdWUgKGJhbGFuY2UsIGNoYW5uZWwpKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYgKCJcbnR5cGUgdGhlIG51bWJlciBvZiBjb2xvciBjb250cm9sIHlvdSB3YW50ICgtMSB0byBjYW5jZWwpOiAiKTsKKyAgICAgICAgcmVzID0gc2NhbmYgKCIlZCIsICZuZXdfdmFsdWUpOworICAgICAgICBpZiAocmVzICE9IDEgfHwgbmV3X3ZhbHVlID09IC0xKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBmb3IgKGl0ZW0gPSBjb250cm9scywgaW5kZXggPSAwOyBpdGVtICE9IE5VTEwgJiYgaW5kZXggPD0gbmV3X3ZhbHVlOworICAgICAgICAgICAgaXRlbSA9IGl0ZW0tPm5leHQsICsraW5kZXgpIHsKKyAgICAgICAgICBjaGFubmVsID0gaXRlbS0+ZGF0YTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYgKCIgICAldSAtICVzICglZCAtICVkKSA9ICVkLCB0eXBlIHRoZSBuZXcgdmFsdWU6ICIsIGluZGV4IC0gMSwKKyAgICAgICAgICAgIGNoYW5uZWwtPmxhYmVsLCBjaGFubmVsLT5taW5fdmFsdWUsIGNoYW5uZWwtPm1heF92YWx1ZSwKKyAgICAgICAgICAgIGdzdF9jb2xvcl9iYWxhbmNlX2dldF92YWx1ZSAoYmFsYW5jZSwgY2hhbm5lbCkpOworICAgICAgICByZXMgPSBzY2FuZiAoIiVkIiwgJm5ld192YWx1ZSk7CisgICAgICAgIGlmIChyZXMgIT0gMSB8fCBuZXdfdmFsdWUgPT0gLTEpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGdzdF9jb2xvcl9iYWxhbmNlX3NldF92YWx1ZSAoYmFsYW5jZSwgY2hhbm5lbCwgbmV3X3ZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgICAgY2FzZSAndic6CisgICAgeworICAgICAgR3N0VmlkZW9PcmllbnRhdGlvbiAqdmlkb3JpZW50ID0gR1NUX1ZJREVPX09SSUVOVEFUSU9OIChzb3VyY2UpOworICAgICAgZ2Jvb2xlYW4gZmxpcCA9IEZBTFNFOworICAgICAgZ2ludCBjZW50ZXIgPSAwOworCisgICAgICBwcmludGYgKCJcbiIpOworCisgICAgICBpZiAoZ3N0X3ZpZGVvX29yaWVudGF0aW9uX2dldF9oZmxpcCAodmlkb3JpZW50LCAmZmxpcCkpIHsKKyAgICAgICAgZ2ludCBuZXdfdmFsdWU7CisKKyAgICAgICAgcHJpbnRmICgiSG9yaXpvbnRhbCBmbGlwIGlzICVzXG4iLCBmbGlwID8gIm9uIiA6ICJvZmYiKTsKKyAgICAgICAgcHJpbnRmICgiXG50eXBlIDEgdG8gdG9nZ2xlICgtMSB0byBjYW5jZWwpOiAiKTsKKyAgICAgICAgcmVzID0gc2NhbmYgKCIlZCIsICZuZXdfdmFsdWUpOworICAgICAgICBpZiAocmVzICE9IDEgfHwgbmV3X3ZhbHVlID09IDEpIHsKKyAgICAgICAgICBmbGlwID0gIWZsaXA7CisgICAgICAgICAgaWYgKGdzdF92aWRlb19vcmllbnRhdGlvbl9zZXRfaGZsaXAgKHZpZG9yaWVudCwgZmxpcCkpIHsKKyAgICAgICAgICAgIGdzdF92aWRlb19vcmllbnRhdGlvbl9nZXRfaGZsaXAgKHZpZG9yaWVudCwgJmZsaXApOworICAgICAgICAgICAgcHJpbnRmICgiTm93IGhvcml6b250YWwgZmxpcCBpcyAlc1xuIiwgZmxpcCA/ICJvbiIgOiAib2ZmIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZiAoIkVycm9yIHRvZ2dsaW5nIGhvcml6b250YWwgZmxpcFxuIik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGYgKCJIb3Jpem9udGFsIGZsaXAgY29udHJvbCBub3QgYXZhaWxhYmxlXG4iKTsKKyAgICAgIH0KKworICAgICAgaWYgKGdzdF92aWRlb19vcmllbnRhdGlvbl9nZXRfdmZsaXAgKHZpZG9yaWVudCwgJmZsaXApKSB7CisgICAgICAgIGdpbnQgbmV3X3ZhbHVlOworCisgICAgICAgIHByaW50ZiAoIlxuVmVydGljYWwgZmxpcCBpcyAlc1xuIiwgZmxpcCA/ICJvbiIgOiAib2ZmIik7CisgICAgICAgIHByaW50ZiAoIlxudHlwZSAxIHRvIHRvZ2dsZSAoLTEgdG8gY2FuY2VsKTogIik7CisgICAgICAgIHJlcyA9IHNjYW5mICgiJWQiLCAmbmV3X3ZhbHVlKTsKKyAgICAgICAgaWYgKHJlcyAhPSAxIHx8IG5ld192YWx1ZSA9PSAxKSB7CisgICAgICAgICAgZmxpcCA9ICFmbGlwOworICAgICAgICAgIGlmIChnc3RfdmlkZW9fb3JpZW50YXRpb25fc2V0X3ZmbGlwICh2aWRvcmllbnQsIGZsaXApKSB7CisgICAgICAgICAgICBnc3RfdmlkZW9fb3JpZW50YXRpb25fZ2V0X3ZmbGlwICh2aWRvcmllbnQsICZmbGlwKTsKKyAgICAgICAgICAgIHByaW50ZiAoIk5vdyB2ZXJ0aWNhbCBmbGlwIGlzICVzXG4iLCBmbGlwID8gIm9uIiA6ICJvZmYiKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmICgiRXJyb3IgdG9nZ2xpbmcgdmVydGljYWwgZmxpcFxuIik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGYgKCJWZXJ0aWNhbCBmbGlwIGNvbnRyb2wgbm90IGF2YWlsYWJsZVxuIik7CisgICAgICB9CisKKyAgICAgIGlmIChnc3RfdmlkZW9fb3JpZW50YXRpb25fZ2V0X2hjZW50ZXIgKHZpZG9yaWVudCwgJmNlbnRlcikpIHsKKyAgICAgICAgcHJpbnRmICgiSG9yaXpvbnRhbCBjZW50ZXIgaXMgJWRcbiIsIGNlbnRlcik7CisgICAgICAgIHByaW50ZiAoIlxudHlwZSB0aGUgbmV3IGhvcml6b250YWwgY2VudGVyIHZhbHVlICgtMSB0byBjYW5jZWwpOiAiKTsKKyAgICAgICAgcmVzID0gc2NhbmYgKCIlZCIsICZjZW50ZXIpOworICAgICAgICBpZiAocmVzICE9IDEgfHwgY2VudGVyICE9IC0xKSB7CisgICAgICAgICAgaWYgKGdzdF92aWRlb19vcmllbnRhdGlvbl9zZXRfaGNlbnRlciAodmlkb3JpZW50LCBjZW50ZXIpKSB7CisgICAgICAgICAgICBnc3RfdmlkZW9fb3JpZW50YXRpb25fZ2V0X2hjZW50ZXIgKHZpZG9yaWVudCwgJmNlbnRlcik7CisgICAgICAgICAgICBwcmludGYgKCJOb3cgaG9yaXpvbnRhbCBjZW50ZXIgaXMgJWRcbiIsIGNlbnRlcik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZiAoIkVycm9yIHNldHRpbmcgaG9yaXpvbnRhbCBjZW50ZXJcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiSG9yaXpvbnRhbCBjZW50ZXIgY29udHJvbCBub3QgYXZhaWxhYmxlXG4iKTsKKyAgICAgIH0KKworICAgICAgaWYgKGdzdF92aWRlb19vcmllbnRhdGlvbl9nZXRfdmNlbnRlciAodmlkb3JpZW50LCAmY2VudGVyKSkgeworICAgICAgICBwcmludGYgKCJWZXJ0aWNhbCBjZW50ZXIgaXMgJWRcbiIsIGNlbnRlcik7CisgICAgICAgIHByaW50ZiAoIlxudHlwZSB0aGUgbmV3IHZlcnRpY2FsIGNlbnRlciB2YWx1ZSAoLTEgdG8gY2FuY2VsKTogIik7CisgICAgICAgIHJlcyA9IHNjYW5mICgiJWQiLCAmY2VudGVyKTsKKyAgICAgICAgaWYgKHJlcyAhPSAxIHx8IGNlbnRlciAhPSAtMSkgeworICAgICAgICAgIGlmIChnc3RfdmlkZW9fb3JpZW50YXRpb25fc2V0X3ZjZW50ZXIgKHZpZG9yaWVudCwgY2VudGVyKSkgeworICAgICAgICAgICAgZ3N0X3ZpZGVvX29yaWVudGF0aW9uX2dldF92Y2VudGVyICh2aWRvcmllbnQsICZjZW50ZXIpOworICAgICAgICAgICAgcHJpbnRmICgiTm93IHZlcnRpY2FsIGNlbnRlciBpcyAlZFxuIiwgY2VudGVyKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmICgiRXJyb3Igc2V0dGluZyB2ZXJ0aWNhbCBjZW50ZXJcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiVmVydGljYWwgY2VudGVyIGNvbnRyb2wgbm90IGF2YWlsYWJsZVxuIik7CisgICAgICB9CisKKyAgICB9CisgICAgICBicmVhazsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAob3B0ICE9IDEwKQorICAgICAgICBwcmludGYgKCJlcnJvcjogaW52YWxpZCBvcHRpb24gJWMiLCBvcHQpOworICAgICAgYnJlYWs7CisgIH0KKworZG9uZToKKworICByZXR1cm47CisKK30KKworc3RhdGljIGdwb2ludGVyCityZWFkX3VzZXIgKGdwb2ludGVyIGRhdGEpCit7CisKKyAgY2hhciBvcHQ7CisKKyAgd2hpbGUgKCFleGl0X3JlYWQpIHsKKworICAgIHByaW50X29wdGlvbnMgKCk7CisKKyAgICBkbyB7CisgICAgICBvcHQgPSBnZXRjaGFyICgpOworICAgICAgaWYgKGV4aXRfcmVhZCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IHdoaWxlIChvcHQgPT0gJ1xuJyk7CisKKyAgICBydW5fb3B0aW9ucyAob3B0KTsKKworICB9CisKKyAgcmV0dXJuIE5VTEw7CisKK30KKworc3RhdGljIGdib29sZWFuCitteV9idXNfY2FsbGJhY2sgKEdzdEJ1cyAqIGJ1cywgR3N0TWVzc2FnZSAqIG1lc3NhZ2UsIGdwb2ludGVyIGRhdGEpCit7CisKKyAgc3dpdGNoIChHU1RfTUVTU0FHRV9UWVBFIChtZXNzYWdlKSkgeworICAgIGNhc2UgR1NUX01FU1NBR0VfRVJST1I6eworICAgICAgR0Vycm9yICplcnI7CisgICAgICBnY2hhciAqZGVidWc7CisgICAgICBnY2hhciAqc3RyOworCisgICAgICBnc3RfbWVzc2FnZV9wYXJzZV9lcnJvciAobWVzc2FnZSwgJmVyciwgJmRlYnVnKTsKKyAgICAgIHN0ciA9IGdzdF9lbGVtZW50X2dldF9uYW1lIChtZXNzYWdlLT5zcmMpOworICAgICAgZ19wcmludCAoIiVzIGVycm9yOiAlc1xuIiwgc3RyLCBlcnItPm1lc3NhZ2UpOworICAgICAgZ19mcmVlIChzdHIpOworICAgICAgZ19wcmludCAoIkRlYnVnOiAlc1xuIiwgZGVidWcpOworCisgICAgICBnX2Vycm9yX2ZyZWUgKGVycik7CisgICAgICBnX2ZyZWUgKGRlYnVnKTsKKworICAgICAgcHJpbnRmICgicHJlc3NlIDxFTlRFUj4ga2V5IHRvIGV4aXRcbiIpOworICAgICAgZXhpdF9yZWFkID0gMTsKKyAgICAgIGdfbWFpbl9sb29wX3F1aXQgKGxvb3ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHU1RfTUVTU0FHRV9FT1M6CisgICAgICAvKiBlbmQtb2Ytc3RyZWFtICovCisgICAgICBwcmludGYgKCJwcmVzc2UgYW55IGtleSB0byBleGl0XG4iKTsKKyAgICAgIGV4aXRfcmVhZCA9IDE7CisgICAgICBnX21haW5fbG9vcF9xdWl0IChsb29wKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKworICBHVGhyZWFkICppbnB1dF90aHJlYWQ7CisgIGdpbnQgbnVtYnVmZmVycyA9IC0xOworICBnY2hhciBkZXZpY2VbMTI4XSA9IHsgJ1wwJyB9OworICBnY2hhciBpbnB1dFsxMjhdID0geyAnXDAnIH07CisgIGd1bG9uZyBmcmVxdWVuY3kgPSAwOworICBHc3RCdXMgKmJ1czsKKworICAvKiBzZWUgZm9yIGlucHV0IG9wdGlvbiAqLworCisgIGludCBjOworCisgIHdoaWxlICgxKSB7CisgICAgc3RhdGljIGNoYXIgbG9uZ19vcHRpb25zX2Rlc2NbXVs2NF0gPSB7CisgICAgICB7Ik51bWJlciBvZiBidWZmZXJzIHRvIG91dHB1dCBiZWZvcmUgc2VuZGluZyBFT1MifSwKKyAgICAgIHsiRGV2aWNlIGxvY2F0aW9uLiBDb21tb24gaW4gL2Rldi92aWRlbzAifSwKKyAgICAgIHsiaW5wdXQvb3V0cHV0IChjaGFubmVsKSB0byBzd2l0Y2ggdG8ifSwKKyAgICAgIHsiZnJlcXVlbmN5IHRvIHR1bmUgdG8gKGluIEh6KSJ9LAorICAgICAgezAsIDAsIDAsIDB9CisgICAgfTsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKyAgICAgIHsibnVtYnVmZmVycyIsIDEsIDAsICduJ30sCisgICAgICB7ImRldmljZSIsIDEsIDAsICdkJ30sCisgICAgICB7ImlucHV0IiwgMSwgMCwgJ2knfSwKKyAgICAgIHsiZnJlcXVlbmN5IiwgMSwgMCwgJ2YnfSwKKyAgICAgIHswLCAwLCAwLCAwfQorICAgIH07CisgICAgLyogZ2V0b3B0X2xvbmcgc3RvcmVzIHRoZSBvcHRpb24gaW5kZXggaGVyZS4gKi8KKyAgICBpbnQgb3B0aW9uX2luZGV4ID0gMDsKKworICAgIGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgIm46ZDppOmY6aCIsIGxvbmdfb3B0aW9ucywgJm9wdGlvbl9pbmRleCk7CisKKyAgICAvKiBEZXRlY3QgdGhlIGVuZCBvZiB0aGUgb3B0aW9ucy4gKi8KKyAgICBpZiAoYyA9PSAtMSkgeworICAgICAgcHJpbnRmICgidGlwOiB1c2UgLWggdG8gc2VlIGhlbHAgbWVzc2FnZS5cbiIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIC8qIElmIHRoaXMgb3B0aW9uIHNldCBhIGZsYWcsIGRvIG5vdGhpbmcgZWxzZSBub3cuICovCisgICAgICAgIGlmIChsb25nX29wdGlvbnNbb3B0aW9uX2luZGV4XS5mbGFnICE9IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIHByaW50ZiAoIm9wdGlvbiAlcyIsIGxvbmdfb3B0aW9uc1tvcHRpb25faW5kZXhdLm5hbWUpOworICAgICAgICBpZiAob3B0YXJnKQorICAgICAgICAgIHByaW50ZiAoIiB3aXRoIGFyZyAlcyIsIG9wdGFyZyk7CisgICAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICduJzoKKyAgICAgICAgbnVtYnVmZmVycyA9IGF0b2kgKG9wdGFyZyk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdkJzoKKyAgICAgICAgc3RybmNweSAoZGV2aWNlLCBvcHRhcmcsIHNpemVvZiAoZGV2aWNlKSAvIHNpemVvZiAoZGV2aWNlWzBdKSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdpJzoKKyAgICAgICAgc3RybmNweSAoaW5wdXQsIG9wdGFyZywgc2l6ZW9mIChpbnB1dCkgLyBzaXplb2YgKGlucHV0WzBdKSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdmJzoKKyAgICAgICAgZnJlcXVlbmN5ID0gYXRvbCAob3B0YXJnKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgJ2gnOgorICAgICAgICBwcmludGYgKCJVc2FnZTogdjRsMnNyYy10ZXN0IFtPUFRJT05dLi4uXG4iKTsKKyAgICAgICAgZm9yIChjID0gMDsgbG9uZ19vcHRpb25zW2NdLm5hbWU7ICsrYykgeworICAgICAgICAgIHByaW50ZiAoIi0lYywgLS0lc1xyXHRcdFx0XHQlc1xuIiwgbG9uZ19vcHRpb25zW2NdLnZhbCwKKyAgICAgICAgICAgICAgbG9uZ19vcHRpb25zW2NdLm5hbWUsIGxvbmdfb3B0aW9uc19kZXNjW2NdKTsKKyAgICAgICAgfQorICAgICAgICBleGl0ICgwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgJz8nOgorICAgICAgICAvKiBnZXRvcHRfbG9uZyBhbHJlYWR5IHByaW50ZWQgYW4gZXJyb3IgbWVzc2FnZS4gKi8KKyAgICAgICAgcHJpbnRmICgiVXNlIC1oIHRvIHNlZSBoZWxwIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGFib3J0ICgpOworICAgIH0KKyAgfQorCisgIC8qIFByaW50IGFueSByZW1haW5pbmcgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyAobm90IG9wdGlvbnMpLiAqLworICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgIHByaW50ZiAoIlVzZSAtaCB0byBzZWUgaGVscCBtZXNzYWdlLlxuIiAibm9uLW9wdGlvbiBBUkdWLWVsZW1lbnRzOiAiKTsKKyAgICB3aGlsZSAob3B0aW5kIDwgYXJnYykKKyAgICAgIHByaW50ZiAoIiVzICIsIGFyZ3Zbb3B0aW5kKytdKTsKKyAgICBwdXRjaGFyICgnXG4nKTsKKyAgfQorCisgIC8qIGluaXQgKi8KKyAgZ3N0X2luaXQgKCZhcmdjLCAmYXJndik7CisKKyAgLyogY3JlYXRlIGVsZW1lbnRzICovCisgIGlmICghKHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoIm15X3BpcGVsaW5lIikpKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiZXJyb3I6IGdzdF9waXBlbGluZV9uZXcgcmV0dXJuIE5VTEwiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoIShzb3VyY2UgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2NGwyc3JjIiwgTlVMTCkpKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAiZXJyb3I6IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoXCJ2NGwyc3JjXCIsIE5VTEwpIHJldHVybiBOVUxMIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKCEoc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInh2aW1hZ2VzaW5rIiwgTlVMTCkpKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAiZXJyb3I6IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoXCJ4dmltYWdlc2lua1wiLCBOVUxMKSByZXR1cm4gTlVMTCIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChudW1idWZmZXJzID4gLTEpIHsKKyAgICBnX29iamVjdF9zZXQgKHNvdXJjZSwgIm51bS1idWZmZXJzIiwgbnVtYnVmZmVycywgTlVMTCk7CisgIH0KKyAgaWYgKGRldmljZVswXSkgeworICAgIGdfb2JqZWN0X3NldCAoc291cmNlLCAiZGV2aWNlIiwgZGV2aWNlLCBOVUxMKTsKKyAgfQorICBpZiAoaW5wdXRbMF0pIHsKKyAgICBnX29iamVjdF9zZXQgKHNvdXJjZSwgImlucHV0IiwgaW5wdXQsIE5VTEwpOworICB9CisgIGlmIChmcmVxdWVuY3kpIHsKKyAgICBnX29iamVjdF9zZXQgKHNvdXJjZSwgImZyZXF1ZW5jeSIsIGZyZXF1ZW5jeSwgTlVMTCk7CisgIH0KKworICAvKiB5b3Ugd291bGQgbm9ybWFsbHkgY2hlY2sgdGhhdCB0aGUgZWxlbWVudHMgd2VyZSBjcmVhdGVkIHByb3Blcmx5ICovCisgIGJ1cyA9IGdzdF9waXBlbGluZV9nZXRfYnVzIChHU1RfUElQRUxJTkUgKHBpcGVsaW5lKSk7CisgIGdzdF9idXNfYWRkX3dhdGNoIChidXMsIG15X2J1c19jYWxsYmFjaywgTlVMTCk7CisKKyAgLyogcHV0IHRvZ2V0aGVyIGEgcGlwZWxpbmUgKi8KKyAgZ3N0X2Jpbl9hZGRfbWFueSAoR1NUX0JJTiAocGlwZWxpbmUpLCBzb3VyY2UsIHNpbmssIE5VTEwpOworICBnc3RfZWxlbWVudF9saW5rX3BhZHMgKHNvdXJjZSwgInNyYyIsIHNpbmssICJzaW5rIik7CisKKyAgLyogc3RhcnQgdGhlIHBpcGVsaW5lICovCisgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAoR1NUX0VMRU1FTlQgKHBpcGVsaW5lKSwgR1NUX1NUQVRFX1BMQVlJTkcpOworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisKKyAgaW5wdXRfdGhyZWFkID0gZ190aHJlYWRfdHJ5X25ldyAoInY0bDJzcmMtdGVzdCIsIHJlYWRfdXNlciwgc291cmNlLCBOVUxMKTsKKworICBpZiAoaW5wdXRfdGhyZWFkID09IE5VTEwpIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJlcnJvcjogZ190aHJlYWRfdHJ5X25ldygpIGZhaWxlZCIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGdfbWFpbl9sb29wX3J1biAobG9vcCk7CisgIGdfdGhyZWFkX2pvaW4gKGlucHV0X3RocmVhZCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChHU1RfRUxFTUVOVCAocGlwZWxpbmUpLCBHU1RfU1RBVEVfTlVMTCk7CisKKyAgZ3N0X29iamVjdF91bnJlZiAoYnVzKTsKKyAgZ3N0X29iamVjdF91bnJlZiAocGlwZWxpbmUpOworCisgIGdzdF9kZWluaXQgKCk7CisKKyAgcmV0dXJuIDA7CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ljbGVzL3ZpZGVvYm94LXRlc3QuYyBiL3Rlc3RzL2ljbGVzL3ZpZGVvYm94LXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzg1YTM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaWNsZXMvdmlkZW9ib3gtdGVzdC5jCkBAIC0wLDAgKzEsMTQxIEBACisvKiBHU3RyZWFtZXIgaW50ZXJhY3RpdmUgdmlkZW9ib3ggdGVzdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBXaW0gVGF5bWFucyA8d2ltLnRheW1hbnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCitzdGF0aWMgR3N0RWxlbWVudCAqCittYWtlX3BpcGVsaW5lIChnaW50IHR5cGUpCit7CisgIEdzdEVsZW1lbnQgKnJlc3VsdDsKKyAgZ2NoYXIgKnBzdHI7CisKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSAwOgorICAgICAgcHN0ciA9IGdfc3RyZHVwX3ByaW50ZiAoInZpZGVvdGVzdHNyYyAhIHZpZGVvYm94IG5hbWU9Ym94ICEgIgorICAgICAgICAgICJ4dmltYWdlc2luayIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmVzdWx0ID0gZ3N0X3BhcnNlX2xhdW5jaF9mdWxsIChwc3RyLCBOVUxMLCBHU1RfUEFSU0VfRkxBR19OT05FLCBOVUxMKTsKKyAgZ19wcmludCAoImNyZWF0ZWQgdGVzdCAlZDogXCIlc1wiXG4iLCB0eXBlLCBwc3RyKTsKKyAgZ19mcmVlIChwc3RyKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisjZGVmaW5lIE1BWF9ST1VORCA1MDAKKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIEdzdEVsZW1lbnQgKnBpcGUsICpib3g7CisgIGdpbnQgbGVmdCwgcmlnaHQ7CisgIGdpbnQgdG9wLCBib3R0b207CisgIGdpbnQgbGRpciwgcmRpcjsKKyAgZ2ludCB0ZGlyLCBiZGlyOworICBnaW50IHJvdW5kLCB0eXBlLCBzdG9wOworCisgIGdzdF9pbml0ICgmYXJnYywgJmFyZ3YpOworCisgIHR5cGUgPSAwOworICBzdG9wID0gLTE7CisKKyAgaWYgKGFyZ2MgPiAxKSB7CisgICAgdHlwZSA9IGF0b2kgKGFyZ3ZbMV0pOworICAgIHN0b3AgPSB0eXBlICsgMTsKKyAgfQorCisgIHdoaWxlIChUUlVFKSB7CisgICAgR3N0TWVzc2FnZSAqbWVzc2FnZTsKKworICAgIHBpcGUgPSBtYWtlX3BpcGVsaW5lICh0eXBlKTsKKyAgICBpZiAocGlwZSA9PSBOVUxMKQorICAgICAgYnJlYWs7CisKKyAgICBib3ggPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlKSwgImJveCIpOworICAgIGdfYXNzZXJ0IChib3gpOworCisgICAgdG9wID0gYm90dG9tID0gbGVmdCA9IHJpZ2h0ID0gMDsKKyAgICB0ZGlyID0gYmRpciA9IC0xMDsKKyAgICBsZGlyID0gcmRpciA9IDEwOworCisgICAgZm9yIChyb3VuZCA9IDA7IHJvdW5kIDwgTUFYX1JPVU5EOyByb3VuZCsrKSB7CisgICAgICBnX3ByaW50ICgiYm94IHRvICU0ZCAlNGQgJTRkICU0ZCAoJWQvJWQpICAgXHIiLCB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQsCisgICAgICAgICAgcm91bmQsIE1BWF9ST1VORCk7CisKKyAgICAgIGdfb2JqZWN0X3NldCAoYm94LCAidG9wIiwgdG9wLCAiYm90dG9tIiwgYm90dG9tLCAibGVmdCIsIGxlZnQsICJyaWdodCIsCisgICAgICAgICAgcmlnaHQsIE5VTEwpOworCisgICAgICBpZiAocm91bmQgPT0gMCkKKyAgICAgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgICAgIHRvcCArPSB0ZGlyOworICAgICAgaWYgKHRvcCA+PSA1MCkKKyAgICAgICAgdGRpciA9IC0xMDsKKyAgICAgIGVsc2UgaWYgKHRvcCA8IC01MCkKKyAgICAgICAgdGRpciA9IDEwOworCisgICAgICBib3R0b20gKz0gYmRpcjsKKyAgICAgIGlmIChib3R0b20gPj0gNDApCisgICAgICAgIGJkaXIgPSAtMTA7CisgICAgICBlbHNlIGlmIChib3R0b20gPCAtNjApCisgICAgICAgIGJkaXIgPSAxMDsKKworICAgICAgbGVmdCArPSBsZGlyOworICAgICAgaWYgKGxlZnQgPj0gNjApCisgICAgICAgIGxkaXIgPSAtMTA7CisgICAgICBlbHNlIGlmIChsZWZ0IDwgLTgwKQorICAgICAgICBsZGlyID0gMTA7CisKKyAgICAgIHJpZ2h0ICs9IHJkaXI7CisgICAgICBpZiAocmlnaHQgPj0gODApCisgICAgICAgIHJkaXIgPSAtMTA7CisgICAgICBlbHNlIGlmIChyaWdodCA8IC05MCkKKyAgICAgICAgcmRpciA9IDEwOworCisgICAgICBtZXNzYWdlID0KKyAgICAgICAgICBnc3RfYnVzX3BvbGwgKEdTVF9FTEVNRU5UX0JVUyAocGlwZSksIEdTVF9NRVNTQUdFX0VSUk9SLAorICAgICAgICAgIDUwICogR1NUX01TRUNPTkQpOworICAgICAgaWYgKG1lc3NhZ2UpIHsKKyAgICAgICAgZ19wcmludCAoImdvdCBlcnJvciAgICAgICAgICAgXG4iKTsKKworICAgICAgICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICB9CisgICAgfQorICAgIGdfcHJpbnQgKCJ0ZXN0ICVkIGRvbmUgICAgICAgICAgICAgICAgICAgIFxuIiwgdHlwZSk7CisKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChib3gpOworICAgIGdzdF9lbGVtZW50X3NldF9zdGF0ZSAocGlwZSwgR1NUX1NUQVRFX05VTEwpOworICAgIGdzdF9vYmplY3RfdW5yZWYgKHBpcGUpOworCisgICAgdHlwZSsrOworICAgIGlmICh0eXBlID09IHN0b3ApCisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ljbGVzL3ZpZGVvY3JvcC10ZXN0LmMgYi90ZXN0cy9pY2xlcy92aWRlb2Nyb3AtdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhY2ZhMzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pY2xlcy92aWRlb2Nyb3AtdGVzdC5jCkBAIC0wLDAgKzEsMzU2IEBACisvKiBHU3RyZWFtZXIgaW50ZXJhY3RpdmUgdGVzdCBmb3IgdGhlIHZpZGVvY3JvcCBlbGVtZW50CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGltLVBoaWxpcHAgTcO8bGxlciA8dGltIGNlbnRyaWN1bGFyIG5ldD4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z3N0L2dzdC5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCitHU1RfREVCVUdfQ0FURUdPUllfU1RBVElDICh2aWRlb2Nyb3BfdGVzdF9kZWJ1Zyk7CisjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCB2aWRlb2Nyb3BfdGVzdF9kZWJ1ZworCisjZGVmaW5lIE9VVF9XSURUSCAgICAgIDY0MAorI2RlZmluZSBPVVRfSEVJR0hUICAgICA0ODAKKyNkZWZpbmUgVElNRV9QRVJfVEVTVCAgIDEwICAgICAgLyogc2Vjb25kcyBlYWNoIGZvcm1hdCBpcyB0ZXN0ZWQgKi8KKyNkZWZpbmUgRlJBTUVSQVRFICAgICAgIDE1ICAgICAgLyogZnJhbWVzIHBlciBzZWNvbmQgICAgICAgICAgICAgKi8KKworI2lmbmRlZiBERUZBVUxUX1ZJREVPU0lOSworI2RlZmluZSBERUZBVUxUX1ZJREVPU0lOSyAieHZpbWFnZXNpbmsiCisjZW5kaWYKKworc3RhdGljIGdib29sZWFuCitjaGVja19idXNfZm9yX2Vycm9ycyAoR3N0QnVzICogYnVzLCBHc3RDbG9ja1RpbWUgbWF4X3dhaXRfdGltZSkKK3sKKyAgR3N0TWVzc2FnZSAqbXNnOworCisgIG1zZyA9IGdzdF9idXNfcG9sbCAoYnVzLCBHU1RfTUVTU0FHRV9FUlJPUiwgbWF4X3dhaXRfdGltZSk7CisKKyAgaWYgKG1zZykgeworICAgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgICBnY2hhciAqZGVidWcgPSBOVUxMOworCisgICAgZ19hc3NlcnQgKEdTVF9NRVNTQUdFX1RZUEUgKG1zZykgPT0gR1NUX01FU1NBR0VfRVJST1IpOworICAgIGdzdF9tZXNzYWdlX3BhcnNlX2Vycm9yIChtc2csICZlcnIsICZkZWJ1Zyk7CisgICAgR1NUX0VSUk9SICgiRVJST1I6ICVzIFslc10iLCBlcnItPm1lc3NhZ2UsIGRlYnVnKTsKKyAgICBnX3ByaW50ICgiXG49PT09PT09PT09PT4gRVJST1I6ICVzXG4lc1xuXG4iLCBlcnItPm1lc3NhZ2UsIGRlYnVnKTsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyKTsKKyAgICBnX2ZyZWUgKGRlYnVnKTsKKyAgICBnc3RfbWVzc2FnZV91bnJlZiAobXNnKTsKKyAgfQorCisgIHJldHVybiAobXNnICE9IE5VTEwpOworfQorCitzdGF0aWMgdm9pZAordGVzdF93aXRoX2NhcHMgKEdzdEVsZW1lbnQgKiBzcmMsIEdzdEVsZW1lbnQgKiB2aWRlb2Nyb3AsIEdzdENhcHMgKiBjYXBzKQoreworICBHc3RDbG9ja1RpbWUgdGltZV9ydW47CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHVGltZXIgKnRpbWVyOworICBHc3RCdXMgKmJ1czsKKyAgR3N0UGFkICpwYWQ7CisgIGd1aW50IGhjcm9wOworICBndWludCB2Y3JvcDsKKworICAvKiBjYXBzIG11c3QgYmUgd3JpdGFibGUsIHdlIGNhbid0IGNoZWNrIHRoYXQgaGVyZSB0aG91Z2ggKi8KKyAgZ19hc3NlcnQgKEdTVF9DQVBTX1JFRkNPVU5UX1ZBTFVFIChjYXBzKSA9PSAxKTsKKworICB0aW1lciA9IGdfdGltZXJfbmV3ICgpOworICB2Y3JvcCA9IDA7CisgIGhjcm9wID0gMDsKKworICBwaXBlbGluZSA9IEdTVF9FTEVNRU5UIChnc3RfZWxlbWVudF9nZXRfcGFyZW50ICh2aWRlb2Nyb3ApKTsKKyAgZ19hc3NlcnQgKEdTVF9JU19QSVBFTElORSAocGlwZWxpbmUpKTsKKworICAvKiBhdCB0aGlzIHBvaW50IHRoZSBwaXBlbGluZSBpcyBpbiBQTEFZSU5HIHN0YXRlOyB3ZSBvbmx5IHdhbnQgdG8gY2FwdHVyZQorICAgKiBlcnJvcnMgcmVzdWx0aW5nIGZyb20gb3VyIG9uLXRoZS1mbHkgY2hhbmdpbmcgb2YgdGhlIGZpbHRlcmNhcHMgKi8KKyAgYnVzID0gZ3N0X3BpcGVsaW5lX2dldF9idXMgKEdTVF9QSVBFTElORSAocGlwZWxpbmUpKTsKKworICAvKiBwYWQgdG8gYmxvY2sgKi8KKyAgcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHNyYywgInNyYyIpOworCisgIHRpbWVfcnVuID0gMDsKKyAgZG8geworICAgIEdzdENsb2NrVGltZSB3YWl0X3RpbWUsIHdhaXRlZF9mb3JfYmxvY2s7CisKKyAgICBpZiAoY2hlY2tfYnVzX2Zvcl9lcnJvcnMgKGJ1cywgMCkpCisgICAgICBicmVhazsKKworICAgIHdhaXRfdGltZSA9IEdTVF9TRUNPTkQgLyBGUkFNRVJBVEU7CisKKyAgICBHU1RfTE9HICgiaGNyb3AgPSAlM2QsIHZjcm9wID0gJTNkIiwgdmNyb3AsIGhjcm9wKTsKKworICAgIGdfdGltZXJfcmVzZXQgKHRpbWVyKTsKKworICAgIC8qIG5lZWQgdG8gYmxvY2sgdGhlIHN0cmVhbWluZyB0aHJlYWQgd2hpbGUgY2hhbmdpbmcgdGhlc2UgcHJvcGVydGllcywKKyAgICAgKiBvdGhlcndpc2Ugd2UgbWlnaHQgZ2V0IHJhbmRvbSBub3QtbmVnb3RpYXRlZCBlcnJvcnMgKHdoZW4gY2FwcyBhcmUKKyAgICAgKiBjaGFuZ2VkIGluIGJldHdlZW4gdXBzdHJlYW0gY2FsbGluZyBwYWRfYWxsb2NfYnVmZmVyKCkgYW5kIHB1c2hpbmcKKyAgICAgKiB0aGUgcHJvY2Vzc2VkIGJ1ZmZlcj8pICBGSVhNRSBzaG91bGQgbm90IGJlIG5lZWRlZCAqLworICAgIC8qIGdzdF9wYWRfc2V0X2Jsb2NrZWQgKHBhZCwgVFJVRSk7ICovCisgICAgZ19vYmplY3Rfc2V0ICh2aWRlb2Nyb3AsICJsZWZ0IiwgaGNyb3AsICJ0b3AiLCB2Y3JvcCwgTlVMTCk7CisgICAgLyogZ3N0X3BhZF9zZXRfYmxvY2tlZCAocGFkLCBGQUxTRSk7ICovCisKKyAgICB3YWl0ZWRfZm9yX2Jsb2NrID0gZ190aW1lcl9lbGFwc2VkICh0aW1lciwgTlVMTCkgKiAoZG91YmxlKSBHU1RfU0VDT05EOworICAgIC8qIEdTVF9MT0cgKCJ3YWl0ZWQ6ICUiIEdTVF9USU1FX0ZPUk1BVCAiLCBmcmFtZSBsZW46ICUiIEdTVF9USU1FX0ZPUk1BVCwKKyAgICAgICBHU1RfVElNRV9BUkdTICh3YWl0ZWRfZm9yX2Jsb2NrKSwgR1NUX1RJTUVfQVJHUyAod2FpdF90aW1lKSk7ICovCisgICAgKyt2Y3JvcDsKKyAgICArK2hjcm9wOworCisgICAgaWYgKHdhaXRfdGltZSA+IHdhaXRlZF9mb3JfYmxvY2spIHsKKyAgICAgIGdfdXNsZWVwICgod2FpdF90aW1lIC0gd2FpdGVkX2Zvcl9ibG9jaykgLyBHU1RfTVNFQ09ORCk7CisgICAgfQorCisgICAgdGltZV9ydW4gKz0gd2FpdF90aW1lOworICB9CisgIHdoaWxlICh0aW1lX3J1biA8IChUSU1FX1BFUl9URVNUICogR1NUX1NFQ09ORCkpOworCisgIGdfdGltZXJfZGVzdHJveSAodGltZXIpOworICBnc3Rfb2JqZWN0X3VucmVmIChidXMpOworICBnc3Rfb2JqZWN0X3VucmVmIChwYWQpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7Cit9CisKKy8qIHJldHVybiBhIGxpc3Qgb2YgY2FwcyB3aGVyZSB3ZSBvbmx5IG5lZWQgdG8gc2V0CisgKiB3aWR0aCBhbmQgaGVpZ2h0IHRvIGdldCBmaXhlZCBjYXBzICovCitzdGF0aWMgR0xpc3QgKgordmlkZW9fY3JvcF9nZXRfdGVzdF9jYXBzIChHc3RFbGVtZW50ICogdmlkZW9jcm9wKQoreworICBjb25zdCBHc3RDYXBzICphbGxvd2VkX2NhcHM7CisgIEdzdFBhZCAqc3JjcGFkOworICBHTGlzdCAqbGlzdCA9IE5VTEw7CisgIGd1aW50IGk7CisKKyAgc3JjcGFkID0gZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQgKHZpZGVvY3JvcCwgInNyYyIpOworICBnX2Fzc2VydCAoc3JjcGFkICE9IE5VTEwpOworICBhbGxvd2VkX2NhcHMgPSBnc3RfcGFkX2dldF9wYWRfdGVtcGxhdGVfY2FwcyAoc3JjcGFkKTsKKyAgZ19hc3NlcnQgKGFsbG93ZWRfY2FwcyAhPSBOVUxMKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZ3N0X2NhcHNfZ2V0X3NpemUgKGFsbG93ZWRfY2Fwcyk7ICsraSkgeworICAgIEdzdFN0cnVjdHVyZSAqbmV3X3N0cnVjdHVyZTsKKyAgICBHc3RDYXBzICpzaW5nbGVfY2FwczsKKworICAgIHNpbmdsZV9jYXBzID0gZ3N0X2NhcHNfbmV3X2VtcHR5ICgpOworICAgIG5ld19zdHJ1Y3R1cmUgPQorICAgICAgICBnc3Rfc3RydWN0dXJlX2NvcHkgKGdzdF9jYXBzX2dldF9zdHJ1Y3R1cmUgKGFsbG93ZWRfY2FwcywgaSkpOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChuZXdfc3RydWN0dXJlLCAiZnJhbWVyYXRlIiwgR1NUX1RZUEVfRlJBQ1RJT04sCisgICAgICAgIEZSQU1FUkFURSwgMSwgTlVMTCk7CisgICAgZ3N0X3N0cnVjdHVyZV9yZW1vdmVfZmllbGQgKG5ld19zdHJ1Y3R1cmUsICJ3aWR0aCIpOworICAgIGdzdF9zdHJ1Y3R1cmVfcmVtb3ZlX2ZpZWxkIChuZXdfc3RydWN0dXJlLCAiaGVpZ2h0Iik7CisgICAgZ3N0X2NhcHNfYXBwZW5kX3N0cnVjdHVyZSAoc2luZ2xlX2NhcHMsIG5ld19zdHJ1Y3R1cmUpOworCisgICAgLyogc2hvdWxkIGJlIGZpeGVkIHdpdGhvdXQgd2lkdGgvaGVpZ2h0ICovCisgICAgZ19hc3NlcnQgKGdzdF9jYXBzX2lzX2ZpeGVkIChzaW5nbGVfY2FwcykpOworCisgICAgbGlzdCA9IGdfbGlzdF9wcmVwZW5kIChsaXN0LCBzaW5nbGVfY2Fwcyk7CisgIH0KKworICBnc3Rfb2JqZWN0X3VucmVmIChzcmNwYWQpOworCisgIHJldHVybiBsaXN0OworfQorCitzdGF0aWMgZ2NoYXIgKm9wdF92aWRlb3Npbmtfc3RyOyAgICAgICAgLyogTlVMTCAqLworc3RhdGljIGdjaGFyICpvcHRfZmlsdGVyY2Fwc19zdHI7ICAgICAgIC8qIE5VTEwgKi8KK3N0YXRpYyBnYm9vbGVhbiBvcHRfd2l0aF92aWRlb2NvbnZlcnQ7ICAvKiBGQUxTRSAqLworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgc3RhdGljIGNvbnN0IEdPcHRpb25FbnRyeSB0ZXN0X2dvcHRpb25zW10gPSB7CisgICAgeyJ2aWRlb3NpbmsiLCAnXDAnLCAwLCBHX09QVElPTl9BUkdfU1RSSU5HLCAmb3B0X3ZpZGVvc2lua19zdHIsCisgICAgICAgICJ2aWRlb3NpbmsgdG8gdXNlIChkZWZhdWx0OiAiIERFRkFVTFRfVklERU9TSU5LICIpIiwgTlVMTH0sCisgICAgeyJjYXBzIiwgJ1wwJywgMCwgR19PUFRJT05fQVJHX1NUUklORywgJm9wdF9maWx0ZXJjYXBzX3N0ciwKKyAgICAgICAgImZpbHRlciBjYXBzIHRvIG5hcnJvdyBkb3duIGZvcm1hdHMgdG8gdGVzdCIsIE5VTEx9LAorICAgIHsid2l0aC12aWRlb2NvbnZlcnQiLCAnXDAnLCAwLCBHX09QVElPTl9BUkdfTk9ORSwKKyAgICAgICAgICAmb3B0X3dpdGhfdmlkZW9jb252ZXJ0LAorICAgICAgICAgICJ3aGV0aGVyIHRvIGFkZCBhbiB2aWRlb2NvbnZlcnQgZWxlbWVudCBpbiBmcm9udCBvZiB0aGUgc2luayIsCisgICAgICAgIE5VTEx9LAorICAgIHtOVUxMLCAnXDAnLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMfQorICB9OworICBHT3B0aW9uQ29udGV4dCAqY3R4OworICBHRXJyb3IgKm9wdF9lcnIgPSBOVUxMOworCisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lLCAqc3JjLCAqZmlsdGVyMSwgKmNyb3AsICpzY2FsZSwgKmZpbHRlcjIsICpjc3AsICpzaW5rOworICBHc3RDYXBzICpmaWx0ZXJfY2FwcyA9IE5VTEw7CisgIEdMaXN0ICpjYXBzX2xpc3QsICpsOworCisgIC8qIGNvbW1hbmQgbGluZSBvcHRpb24gcGFyc2luZyAqLworICBjdHggPSBnX29wdGlvbl9jb250ZXh0X25ldyAoIiIpOworICBnX29wdGlvbl9jb250ZXh0X2FkZF9ncm91cCAoY3R4LCBnc3RfaW5pdF9nZXRfb3B0aW9uX2dyb3VwICgpKTsKKyAgZ19vcHRpb25fY29udGV4dF9hZGRfbWFpbl9lbnRyaWVzIChjdHgsIHRlc3RfZ29wdGlvbnMsIE5VTEwpOworCisgIGlmICghZ19vcHRpb25fY29udGV4dF9wYXJzZSAoY3R4LCAmYXJnYywgJmFyZ3YsICZvcHRfZXJyKSkgeworICAgIGdfZXJyb3IgKCJFcnJvciBwYXJzaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zOiAlcyIsIG9wdF9lcnItPm1lc3NhZ2UpOworICAgIGdfb3B0aW9uX2NvbnRleHRfZnJlZSAoY3R4KTsKKyAgICBnX2NsZWFyX2Vycm9yICgmb3B0X2Vycik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGdfb3B0aW9uX2NvbnRleHRfZnJlZSAoY3R4KTsKKworICBHU1RfREVCVUdfQ0FURUdPUllfSU5JVCAodmlkZW9jcm9wX3Rlc3RfZGVidWcsICJ2aWRlb2Nyb3B0ZXN0IiwgMCwgInZjdGVzdCIpOworCisgIHBpcGVsaW5lID0gZ3N0X3BpcGVsaW5lX25ldyAoInBpcGVsaW5lIik7CisgIHNyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvdGVzdHNyYyIsICJ2aWRlb3Rlc3RzcmMiKTsKKyAgZ19hc3NlcnQgKHNyYyAhPSBOVUxMKTsKKyAgZmlsdGVyMSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoImNhcHNmaWx0ZXIiLCAiY2Fwc2ZpbHRlcjEiKTsKKyAgZ19hc3NlcnQgKGZpbHRlcjEgIT0gTlVMTCk7CisgIGNyb3AgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ2aWRlb2Nyb3AiLCAidmlkZW9jcm9wIik7CisgIGdfYXNzZXJ0IChjcm9wICE9IE5VTEwpOworICBzY2FsZSA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInZpZGVvc2NhbGUiLCAidmlkZW9zY2FsZSIpOworICBnX2Fzc2VydCAoc2NhbGUgIT0gTlVMTCk7CisgIGZpbHRlcjIgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJjYXBzZmlsdGVyIiwgImNhcHNmaWx0ZXIyIik7CisgIGdfYXNzZXJ0IChmaWx0ZXIyICE9IE5VTEwpOworCisgIGlmIChvcHRfd2l0aF92aWRlb2NvbnZlcnQpIHsKKyAgICBnX3ByaW50ICgiQWRkaW5nIHZpZGVvY29udmVydFxuIik7CisgICAgY3NwID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlICgidmlkZW9jb252ZXJ0IiwgImNvbG9yc3BhY2UiKTsKKyAgfSBlbHNlIHsKKyAgICBjc3AgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJpZGVudGl0eSIsICJjb2xvcnNwYWNlIik7CisgIH0KKyAgZ19hc3NlcnQgKGNzcCAhPSBOVUxMKTsKKworICBpZiAob3B0X2ZpbHRlcmNhcHNfc3RyKSB7CisgICAgZmlsdGVyX2NhcHMgPSBnc3RfY2Fwc19mcm9tX3N0cmluZyAob3B0X2ZpbHRlcmNhcHNfc3RyKTsKKyAgICBpZiAoZmlsdGVyX2NhcHMgPT0gTlVMTCkgeworICAgICAgZ19lcnJvciAoIkludmFsaWQgZmlsdGVyIGNhcHMgc3RyaW5nICclcyciLCBvcHRfZmlsdGVyY2Fwc19zdHIpOworICAgIH0gZWxzZSB7CisgICAgICBnX3ByaW50ICgiVXNpbmcgZmlsdGVyIGNhcHMgJyVzJ1xuIiwgb3B0X2ZpbHRlcmNhcHNfc3RyKTsKKyAgICB9CisgIH0KKworICBpZiAob3B0X3ZpZGVvc2lua19zdHIpIHsKKyAgICBnX3ByaW50ICgiVHJ5aW5nIHZpZGVvc2luayAnJXMnIC4uLiIsIG9wdF92aWRlb3Npbmtfc3RyKTsKKyAgICBzaW5rID0gZ3N0X2VsZW1lbnRfZmFjdG9yeV9tYWtlIChvcHRfdmlkZW9zaW5rX3N0ciwgInNpbmsiKTsKKyAgICBnX3ByaW50ICgiJXNcbiIsIChzaW5rKSA/ICJvayIgOiAiZWxlbWVudCBjb3VsZG4ndCBiZSBjcmVhdGVkIik7CisgIH0gZWxzZSB7CisgICAgc2luayA9IE5VTEw7CisgIH0KKworICBpZiAoc2luayA9PSBOVUxMKSB7CisgICAgZ19wcmludCAoIlRyeWluZyB2aWRlb3NpbmsgJyVzJyAuLi4iLCBERUZBVUxUX1ZJREVPU0lOSyk7CisgICAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoREVGQVVMVF9WSURFT1NJTkssICJzaW5rIik7CisgICAgZ19wcmludCAoIiVzXG4iLCAoc2luaykgPyAib2siIDogImVsZW1lbnQgY291bGRuJ3QgYmUgY3JlYXRlZCIpOworICB9CisgIGlmIChzaW5rID09IE5VTEwpIHsKKyAgICBnX3ByaW50ICgiVHJ5aW5nIHZpZGVvc2luayAnJXMnIC4uLiIsICJ4dmltYWdlc2luayIpOworICAgIHNpbmsgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UgKCJ4dmltYWdlc2luayIsICJzaW5rIik7CisgICAgZ19wcmludCAoIiVzXG4iLCAoc2luaykgPyAib2siIDogImVsZW1lbnQgY291bGRuJ3QgYmUgY3JlYXRlZCIpOworICB9CisgIGlmIChzaW5rID09IE5VTEwpIHsKKyAgICBnX3ByaW50ICgiVHJ5aW5nIHZpZGVvc2luayAnJXMnIC4uLiIsICJ4aW1hZ2VzaW5rIik7CisgICAgc2luayA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSAoInhpbWFnZXNpbmsiLCAic2luayIpOworICAgIGdfcHJpbnQgKCIlc1xuIiwgKHNpbmspID8gIm9rIiA6ICJlbGVtZW50IGNvdWxkbid0IGJlIGNyZWF0ZWQiKTsKKyAgfQorCisgIGdfYXNzZXJ0IChzaW5rICE9IE5VTEwpOworCisgIGdzdF9iaW5fYWRkX21hbnkgKEdTVF9CSU4gKHBpcGVsaW5lKSwgc3JjLCBmaWx0ZXIxLCBjcm9wLCBzY2FsZSwgZmlsdGVyMiwKKyAgICAgIGNzcCwgc2luaywgTlVMTCk7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rIChzcmMsIGZpbHRlcjEpKQorICAgIGdfZXJyb3IgKCJGYWlsZWQgdG8gbGluayB2aWRlb3Rlc3RzcmMgdG8gY2Fwc2ZpbHRlcjEiKTsKKworICBpZiAoIWdzdF9lbGVtZW50X2xpbmsgKGZpbHRlcjEsIGNyb3ApKQorICAgIGdfZXJyb3IgKCJGYWlsZWQgdG8gbGluayBjYXBzZmlsdGVyMSB0byB2aWRlb2Nyb3AiKTsKKworICBpZiAoIWdzdF9lbGVtZW50X2xpbmsgKGNyb3AsIHNjYWxlKSkKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGxpbmsgdmlkZW9jcm9wIHRvIHZpZGVvc2NhbGUiKTsKKworICBpZiAoIWdzdF9lbGVtZW50X2xpbmsgKHNjYWxlLCBmaWx0ZXIyKSkKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGxpbmsgdmlkZW9zY2FsZSB0byBjYXBzZmlsdGVyMiIpOworCisgIGlmICghZ3N0X2VsZW1lbnRfbGluayAoZmlsdGVyMiwgY3NwKSkKKyAgICBnX2Vycm9yICgiRmFpbGVkIHRvIGxpbmsgY2Fwc2ZpbHRlcjIgdG8gdmlkZW9jb252ZXJ0Iik7CisKKyAgaWYgKCFnc3RfZWxlbWVudF9saW5rIChjc3AsIHNpbmspKQorICAgIGdfZXJyb3IgKCJGYWlsZWQgdG8gbGluayB2aWRlb2NvbnZlcnQgdG8gdmlkZW8gc2luayIpOworCisgIGNhcHNfbGlzdCA9IHZpZGVvX2Nyb3BfZ2V0X3Rlc3RfY2FwcyAoY3JvcCk7CisgIGZvciAobCA9IGNhcHNfbGlzdDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworICAgIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHJldDsKKyAgICBHc3RDYXBzICpjYXBzLCAqb3V0X2NhcHM7CisgICAgZ2Jvb2xlYW4gc2tpcCA9IEZBTFNFOworICAgIGdjaGFyICpzOworCisgICAgaWYgKGZpbHRlcl9jYXBzKSB7CisgICAgICBHc3RDYXBzICppY2FwczsKKworICAgICAgaWNhcHMgPSBnc3RfY2Fwc19pbnRlcnNlY3QgKGZpbHRlcl9jYXBzLCBHU1RfQ0FQUyAobC0+ZGF0YSkpOworICAgICAgc2tpcCA9IGdzdF9jYXBzX2lzX2VtcHR5IChpY2Fwcyk7CisgICAgICBnc3RfY2Fwc191bnJlZiAoaWNhcHMpOworICAgIH0KKworICAgIC8qIHRoaXMgaXMgdGhlIHNpemUgb2Ygb3VyIHdpbmRvdyAoc3RheXMgZml4ZWQpICovCisgICAgb3V0X2NhcHMgPSBnc3RfY2Fwc19jb3B5IChHU1RfQ0FQUyAobC0+ZGF0YSkpOworICAgIGdzdF9zdHJ1Y3R1cmVfc2V0IChnc3RfY2Fwc19nZXRfc3RydWN0dXJlIChvdXRfY2FwcywgMCksICJ3aWR0aCIsCisgICAgICAgIEdfVFlQRV9JTlQsIE9VVF9XSURUSCwgImhlaWdodCIsIEdfVFlQRV9JTlQsIE9VVF9IRUlHSFQsIE5VTEwpOworCisgICAgZ19vYmplY3Rfc2V0IChmaWx0ZXIyLCAiY2FwcyIsIG91dF9jYXBzLCBOVUxMKTsKKworICAgIC8qIGZpbHRlcjEgZ2V0cyB0aGVzZSB0b28gdG8gcHJldmVudCB2aWRlb3Rlc3RzcmMgZnJvbSByZW5lZ290aWF0aW5nICovCisgICAgZ19vYmplY3Rfc2V0IChmaWx0ZXIxLCAiY2FwcyIsIG91dF9jYXBzLCBOVUxMKTsKKyAgICBnc3RfY2Fwc191bnJlZiAob3V0X2NhcHMpOworCisgICAgY2FwcyA9IGdzdF9jYXBzX2NvcHkgKEdTVF9DQVBTIChsLT5kYXRhKSk7CisgICAgR1NUX0lORk8gKCJ0ZXN0aW5nIGZvcm1hdDogJSIgR1NUX1BUUl9GT1JNQVQsIGNhcHMpOworCisgICAgcyA9IGdzdF9jYXBzX3RvX3N0cmluZyAoY2Fwcyk7CisKKyAgICBpZiAoc2tpcCkgeworICAgICAgZ19wcmludCAoIlNraXBwaW5nIGZvcm1hdDogJXNcbiIsIHMpOworICAgICAgZ19mcmVlIChzKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGdfcHJpbnQgKCJGb3JtYXQ6ICVzXG4iLCBzKTsKKworICAgIGNhcHMgPSBnc3RfY2Fwc19tYWtlX3dyaXRhYmxlIChjYXBzKTsKKworICAgIC8qIEZJWE1FOiBjaGVjayByZXR1cm4gdmFsdWVzICovCisgICAgcmV0ID0gZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworICAgIGlmIChyZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKSB7CisgICAgICByZXQgPSBnc3RfZWxlbWVudF9nZXRfc3RhdGUgKHBpcGVsaW5lLCBOVUxMLCBOVUxMLCAtMSk7CisKKyAgICAgIGlmIChyZXQgIT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFKSB7CisgICAgICAgIHRlc3Rfd2l0aF9jYXBzIChzcmMsIGNyb3AsIGNhcHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ19wcmludCAoIkZvcm1hdDogJXMgbm90IHN1cHBvcnRlZCAoZmFpbGVkIHRvIGdvIHRvIFBMQVlJTkcpXG4iLCBzKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZ19wcmludCAoIkZvcm1hdDogJXMgbm90IHN1cHBvcnRlZFxuIiwgcyk7CisgICAgfQorCisgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworCisgICAgZ3N0X2NhcHNfdW5yZWYgKGNhcHMpOworICAgIGdfZnJlZSAocyk7CisgIH0KKworICBnX2xpc3RfZm9yZWFjaCAoY2Fwc19saXN0LCAoR0Z1bmMpIGdzdF9jYXBzX3VucmVmLCBOVUxMKTsKKyAgZ19saXN0X2ZyZWUgKGNhcHNfbGlzdCk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX05VTEwpOworICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlbGluZSk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pY2xlcy92aWRlb2Nyb3AyLXRlc3QuYyBiL3Rlc3RzL2ljbGVzL3ZpZGVvY3JvcDItdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNjgwMWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pY2xlcy92aWRlb2Nyb3AyLXRlc3QuYwpAQCAtMCwwICsxLDE0MSBAQAorLyogR1N0cmVhbWVyIGludGVyYWN0aXZlIHZpZGVvY3JvcCB0ZXN0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFdpbSBUYXltYW5zIDx3aW0udGF5bWFuc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisKK3N0YXRpYyBHc3RFbGVtZW50ICoKK21ha2VfcGlwZWxpbmUgKGdpbnQgdHlwZSkKK3sKKyAgR3N0RWxlbWVudCAqcmVzdWx0OworICBnY2hhciAqcHN0cjsKKworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIDA6CisgICAgICBwc3RyID0gZ19zdHJkdXBfcHJpbnRmICgidmlkZW90ZXN0c3JjICEgdmlkZW9jcm9wIG5hbWU9Y3JvcCAhICIKKyAgICAgICAgICAieHZpbWFnZXNpbmsiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJlc3VsdCA9IGdzdF9wYXJzZV9sYXVuY2hfZnVsbCAocHN0ciwgTlVMTCwgR1NUX1BBUlNFX0ZMQUdfTk9ORSwgTlVMTCk7CisgIGdfcHJpbnQgKCJjcmVhdGVkIHRlc3QgJWQ6IFwiJXNcIlxuIiwgdHlwZSwgcHN0cik7CisgIGdfZnJlZSAocHN0cik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworI2RlZmluZSBNQVhfUk9VTkQgNTAwCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBHc3RFbGVtZW50ICpwaXBlLCAqY3JvcDsKKyAgZ2ludCBsZWZ0LCByaWdodDsKKyAgZ2ludCB0b3AsIGJvdHRvbTsKKyAgZ2ludCBsZGlyLCByZGlyOworICBnaW50IHRkaXIsIGJkaXI7CisgIGdpbnQgcm91bmQsIHR5cGUsIHN0b3A7CisKKyAgZ3N0X2luaXQgKCZhcmdjLCAmYXJndik7CisKKyAgdHlwZSA9IDA7CisgIHN0b3AgPSAtMTsKKworICBpZiAoYXJnYyA+IDEpIHsKKyAgICB0eXBlID0gYXRvaSAoYXJndlsxXSk7CisgICAgc3RvcCA9IHR5cGUgKyAxOworICB9CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBHc3RNZXNzYWdlICptZXNzYWdlOworCisgICAgcGlwZSA9IG1ha2VfcGlwZWxpbmUgKHR5cGUpOworICAgIGlmIChwaXBlID09IE5VTEwpCisgICAgICBicmVhazsKKworICAgIGNyb3AgPSBnc3RfYmluX2dldF9ieV9uYW1lIChHU1RfQklOIChwaXBlKSwgImNyb3AiKTsKKyAgICBnX2Fzc2VydCAoY3JvcCk7CisKKyAgICB0b3AgPSBib3R0b20gPSBsZWZ0ID0gcmlnaHQgPSAwOworICAgIHRkaXIgPSBiZGlyID0gMTA7CisgICAgbGRpciA9IHJkaXIgPSAxMDsKKworICAgIGZvciAocm91bmQgPSAwOyByb3VuZCA8IE1BWF9ST1VORDsgcm91bmQrKykgeworICAgICAgZ19wcmludCAoImNyb3AgdG8gJTRkICU0ZCAlNGQgJTRkICglZC8lZCkgICBcciIsIHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCwKKyAgICAgICAgICByb3VuZCwgTUFYX1JPVU5EKTsKKworICAgICAgZ19vYmplY3Rfc2V0IChjcm9wLCAidG9wIiwgdG9wLCAiYm90dG9tIiwgYm90dG9tLCAibGVmdCIsIGxlZnQsICJyaWdodCIsCisgICAgICAgICAgcmlnaHQsIE5VTEwpOworCisgICAgICBpZiAocm91bmQgPT0gMCkKKyAgICAgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlLCBHU1RfU1RBVEVfUExBWUlORyk7CisKKyAgICAgIHRvcCArPSB0ZGlyOworICAgICAgaWYgKHRvcCA+PSA4MCkKKyAgICAgICAgdGRpciA9IC0xMDsKKyAgICAgIGVsc2UgaWYgKHRvcCA8IDEwKQorICAgICAgICB0ZGlyID0gMTA7CisKKyAgICAgIGJvdHRvbSArPSBiZGlyOworICAgICAgaWYgKGJvdHRvbSA+PSA2MCkKKyAgICAgICAgYmRpciA9IC0xMDsKKyAgICAgIGVsc2UgaWYgKGJvdHRvbSA8IDEwKQorICAgICAgICBiZGlyID0gMTA7CisKKyAgICAgIGxlZnQgKz0gbGRpcjsKKyAgICAgIGlmIChsZWZ0ID49IDEwMCkKKyAgICAgICAgbGRpciA9IC0xMDsKKyAgICAgIGVsc2UgaWYgKGxlZnQgPCAxMCkKKyAgICAgICAgbGRpciA9IDEwOworCisgICAgICByaWdodCArPSByZGlyOworICAgICAgaWYgKHJpZ2h0ID49IDgwKQorICAgICAgICByZGlyID0gLTEwOworICAgICAgZWxzZSBpZiAocmlnaHQgPCAxMCkKKyAgICAgICAgcmRpciA9IDEwOworCisgICAgICBtZXNzYWdlID0KKyAgICAgICAgICBnc3RfYnVzX3BvbGwgKEdTVF9FTEVNRU5UX0JVUyAocGlwZSksIEdTVF9NRVNTQUdFX0VSUk9SLAorICAgICAgICAgIDUwICogR1NUX01TRUNPTkQpOworICAgICAgaWYgKG1lc3NhZ2UpIHsKKyAgICAgICAgZ19wcmludCAoImdvdCBlcnJvciAgICAgICAgICAgXG4iKTsKKworICAgICAgICBnc3RfbWVzc2FnZV91bnJlZiAobWVzc2FnZSk7CisgICAgICB9CisgICAgfQorICAgIGdfcHJpbnQgKCJ0ZXN0ICVkIGRvbmUgICAgICAgICAgICAgICAgICAgIFxuIiwgdHlwZSk7CisKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChjcm9wKTsKKyAgICBnc3RfZWxlbWVudF9zZXRfc3RhdGUgKHBpcGUsIEdTVF9TVEFURV9OVUxMKTsKKyAgICBnc3Rfb2JqZWN0X3VucmVmIChwaXBlKTsKKworICAgIHR5cGUrKzsKKyAgICBpZiAodHlwZSA9PSBzdG9wKQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pY2xlcy94aW1hZ2VzcmMtdGVzdC5jIGIvdGVzdHMvaWNsZXMveGltYWdlc3JjLXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGNjNTgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaWNsZXMveGltYWdlc3JjLXRlc3QuYwpAQCAtMCwwICsxLDcwIEBACisvKiBHU3RyZWFtZXIKKyAqIENvcHlyaWdodCAoQykgPDIwMDY+IFphaGVlciBBYmJhcyBNZXJhbGkgPHphaGVlcmFiYmFzIGF0IG1lcmFsaSBkb3Qgb3JnPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGdzdC9nc3QuaD4KKworc3RhdGljIEdNYWluTG9vcCAqbG9vcDsKKworc3RhdGljIGdib29sZWFuCit0ZXJtaW5hdGVfcGxheWJhY2sgKEdzdEVsZW1lbnQgKiBwaXBlbGluZSkKK3sKKyAgZ19wcmludCAoIlRlcm1pbmF0aW5nIHBsYXliYWNrXG4iKTsKKyAgZ19tYWluX2xvb3BfcXVpdCAobG9vcCk7CisgIHJldHVybiBGQUxTRTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIEdzdEVsZW1lbnQgKnBpcGVsaW5lOworICBHc3RTdGF0ZSBzdGF0ZTsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgZ3N0X2luaXQgKCZhcmdjLCAmYXJndik7CisKKyAgcGlwZWxpbmUgPSBnc3RfcGFyc2VfbGF1bmNoICgieGltYWdlc3JjICEgZmFrZXNpbmsiLCAmZXJyb3IpOworICBpZiAoZXJyb3IpIHsKKyAgICBnX3ByaW50ICgiRXJyb3Igd2hpbGUgcGFyc2luZyBwaXBlbGluZSBkZXNjcmlwdGlvbjogJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBsb29wID0gZ19tYWluX2xvb3BfbmV3IChOVUxMLCBGQUxTRSk7CisKKyAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlIChwaXBlbGluZSwgR1NUX1NUQVRFX1BMQVlJTkcpOworCisgIC8qIGxldHMgY2hlY2sgaXQgZ2V0cyB0byBQTEFZSU5HICovCisgIGlmIChnc3RfZWxlbWVudF9nZXRfc3RhdGUgKHBpcGVsaW5lLCAmc3RhdGUsIE5VTEwsCisgICAgICAgICAgR1NUX0NMT0NLX1RJTUVfTk9ORSkgPT0gR1NUX1NUQVRFX0NIQU5HRV9GQUlMVVJFIHx8CisgICAgICBzdGF0ZSAhPSBHU1RfU1RBVEVfUExBWUlORykgeworICAgIGdfd2FybmluZyAoIlN0YXRlIGNoYW5nZSB0byBwbGF5aW5nIGZhaWxlZCIpOworICB9CisKKyAgLyogV2Ugd2FudCB0byBnZXQgb3V0IGFmdGVyIDUgc2Vjb25kcyAqLworICBnX3RpbWVvdXRfYWRkX3NlY29uZHMgKDUsIChHU291cmNlRnVuYykgdGVybWluYXRlX3BsYXliYWNrLCBwaXBlbGluZSk7CisKKyAgZ19tYWluX2xvb3BfcnVuIChsb29wKTsKKworICBnX21haW5fbG9vcF91bnJlZiAobG9vcCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tZXNvbi5idWlsZCBiL3Rlc3RzL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZjBlNWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNvbi5idWlsZApAQCAtMCwwICsxLDcgQEAKKyMgRklYTUU6IG1ha2UgY2hlY2sgd29yayBvbiB3aW5kb3dzCitpZiBob3N0X21hY2hpbmUuc3lzdGVtKCkgIT0gJ3dpbmRvd3MnCitzdWJkaXIoJ2NoZWNrJykKK2VuZGlmCisKK3N1YmRpcignaWNsZXMnKQorc3ViZGlyKCdleGFtcGxlcycpCg==